ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWI3NzMKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsNCBAQAorQmFzZWRPblN0eWxlOiBHb29nbGUKK1NvcnRJbmNsdWRlczogZmFsc2UKKyMgRG8gbm90IHJlZm9ybWF0IHRoZSBEb3h5Z2VuLXN0eWxlIGNvbW1lbnRzIGluIHRoZSBjb2RlCitDb21tZW50UHJhZ21hcyA6ICJeICogXFxcXCIKZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IDc5NjZkYzYuLmM4OWE5NWMgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMTEsMTQgKzExLDIyIEBACiAgICAgICAgICJsaWJNcGVnVFBFbmMvc3JjLyouY3BwIiwKICAgICAgICAgImxpYlNCUmRlYy9zcmMvKi5jcHAiLAogICAgICAgICAibGliU0JSZW5jL3NyYy8qLmNwcCIsCisgICAgICAgICJsaWJBcml0aENvZGluZy9zcmMvKi5jcHAiLAorICAgICAgICAibGliRFJDZGVjL3NyYy8qLmNwcCIsCisgICAgICAgICJsaWJTQUNkZWMvc3JjLyouY3BwIiwKKyAgICAgICAgImxpYlNBQ2VuYy9zcmMvKi5jcHAiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbCi0gICAgICAgICItV25vLXNlcXVlbmNlLXBvaW50IiwKLSAgICAgICAgIi1Xbm8tZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAogICAgICAgICAiLVduby0jd2FybmluZ3MiLAotICAgICAgICAiLVduby1jb25zdGFudC1sb2dpY2FsLW9wZXJhbmQiLAorICAgICAgICAiLVd1bmluaXRpYWxpemVkIiwKICAgICAgICAgIi1Xbm8tc2VsZi1hc3NpZ24iLAogICAgIF0sCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6WyJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93Il0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCkBAIC0zMiw1ICs0MCw5IEBACiAgICAgICAgICJsaWJNcGVnVFBFbmMvaW5jbHVkZSIsCiAgICAgICAgICJsaWJTQlJkZWMvaW5jbHVkZSIsCiAgICAgICAgICJsaWJTQlJlbmMvaW5jbHVkZSIsCisgICAgICAgICJsaWJBcml0aENvZGluZy9pbmNsdWRlIiwKKyAgICAgICAgImxpYkRSQ2RlYy9pbmNsdWRlIiwKKyAgICAgICAgImxpYlNBQ2RlYy9pbmNsdWRlIiwKKyAgICAgICAgImxpYlNBQ2VuYy9pbmNsdWRlIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCmluZGV4IGIzNDg4Y2MuLjA1YjMyYmQgMTAwNjQ0Ci0tLSBhL05PVElDRQorKysgYi9OT1RJQ0UKQEAgLTEsNzIgKzEsODQgQEAKIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi3CqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKLTEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9hYWNEZWNvZGVyLnBkZiBiL2RvY3VtZW50YXRpb24vYWFjRGVjb2Rlci5wZGYKaW5kZXggNDU4ZmRhMS4uMWRlYzMzNCAxMDA2NDQKLS0tIGEvZG9jdW1lbnRhdGlvbi9hYWNEZWNvZGVyLnBkZgorKysgYi9kb2N1bWVudGF0aW9uL2FhY0RlY29kZXIucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vYWFjRW5jb2Rlci5wZGYgYi9kb2N1bWVudGF0aW9uL2FhY0VuY29kZXIucGRmCmluZGV4IGVmYjE4NTguLmU0MzhlMjcgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vYWFjRW5jb2Rlci5wZGYKKysrIGIvZG9jdW1lbnRhdGlvbi9hYWNFbmNvZGVyLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvaW5jbHVkZS9hYWNkZWNvZGVyX2xpYi5oIGIvbGliQUFDZGVjL2luY2x1ZGUvYWFjZGVjb2Rlcl9saWIuaAppbmRleCA3YWI2MGYxLi4zYTliOTEwIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvaW5jbHVkZS9hYWNkZWNvZGVyX2xpYi5oCisrKyBiL2xpYkFBQ2RlYy9pbmNsdWRlL2FhY2RlY29kZXJfbGliLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTMgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBQUNERUNPREVSX0xJQl9ICisjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0gKIAogLyoqCiAgKiBcZmlsZSAgIGFhY2RlY29kZXJfbGliLmgKQEAgLTk0LDE2NiArMTEwLDI2MSBAQAogCiBccGFnZSBJTlRSTyBJbnRyb2R1Y3Rpb24KIAorCiBcc2VjdGlvbiBTQ09QRSBTY29wZQogCi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgaGlnaC1sZXZlbCBpbnRlcmZhY2UgYW5kIHVzYWdlIG9mIHRoZSBJU08vTVBFRy0yLzQgQUFDIERlY29kZXIKLWxpYnJhcnkgZGV2ZWxvcGVkIGJ5IHRoZSBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyAoSUlTKS4KLURlcGVuZGluZyBvbiB0aGUgbGlicmFyeSBjb25maWd1cmF0aW9uLCBpdCBpbXBsZW1lbnRzIGRlY29kaW5nIG9mIEFBQy1MQyAoTG93LUNvbXBsZXhpdHkpLAotSEUtQUFDIChIaWdoLUVmZmljaWVuY3kgQUFDLCB2MSBhbmQgdjIpLCBBQUMtTEQgKExvdy1EZWxheSkgYW5kIEFBQy1FTEQgKEVuaGFuY2VkIExvdy1EZWxheSkuCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgaGlnaC1sZXZlbCBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgYW5kIHVzYWdlIG9mIHRoZQorSVNPL01QRUctMi80IEFBQyBEZWNvZGVyIGxpYnJhcnkgZGV2ZWxvcGVkIGJ5IHRoZSBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IKK0ludGVncmF0ZWQgQ2lyY3VpdHMgKElJUykuIERlcGVuZGluZyBvbiB0aGUgbGlicmFyeSBjb25maWd1cmF0aW9uLCBkZWNvZGluZyBvZgorQUFDLUxDIChMb3ctQ29tcGxleGl0eSksIEhFLUFBQyAoSGlnaC1FZmZpY2llbmN5IEFBQyB2MSBhbmQgdjIpLCBBQUMtTEQKKyhMb3ctRGVsYXkpIGFuZCBBQUMtRUxEIChFbmhhbmNlZCBMb3ctRGVsYXkpIGlzIGltcGxlbWVudGVkLgogCi1BbGwgcmVmZXJlbmNlcyB0byBTQlIgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEUtQUFDIGFuZCBBQUMtRUxECi12ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4gQWxsIHJlZmVyZW5jZXMgdG8gUFMgKFBhcmFtZXRyaWMgU3RlcmVvKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvCi1IRS1BQUMgdjIgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkuCitBbGwgcmVmZXJlbmNlcyB0byBTQlIgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEUtQUFDCithbmQgQUFDLUVMRCBjb25maWd1cmF0aW9ucyBvZiB0aGUgRkRLIGxpYnJhcnkuIEFsbCByZWZlcmVuY2VzIHRvIFBTIChQYXJhbWV0cmljCitTdGVyZW8pIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEUtQUFDIHYyIGRlY29kZXIgY29uZmlndXJhdGlvbiBvZiB0aGUgbGlicmFyeS4KIAogXHNlY3Rpb24gRGVjb2RlckJhc2ljcyBEZWNvZGVyIEJhc2ljcwogCi1UaGlzIGRvY3VtZW50IGNhbiBvbmx5IGdpdmUgYSByb3VnaCBvdmVydmlldyBhYm91dCB0aGUgSVNPL01QRUctMiBhbmQgSVNPL01QRUctNCBBQUMgYXVkaW8KLWNvZGluZyBzdGFuZGFyZC4gVG8gdW5kZXJzdGFuZCBhbGwgdGhlIHRlcm1zIGluIHRoaXMgZG9jdW1lbnQsIHlvdSBhcmUgZW5jb3VyYWdlZCB0byByZWFkCi10aGUgZm9sbG93aW5nIGRvY3VtZW50cy4KK1RoaXMgZG9jdW1lbnQgY2FuIG9ubHkgZ2l2ZSBhIHJvdWdoIG92ZXJ2aWV3IGFib3V0IHRoZSBJU08vTVBFRy0yLCBJU08vTVBFRy00CitBQUMgYXVkaW8gYW5kIE1QRUctRCBVU0FDIGNvZGluZyBzdGFuZGFyZHMuIFRvIHVuZGVyc3RhbmQgYWxsIGRldGFpbHMgcmVmZXJlbmNlZAoraW4gdGhpcyBkb2N1bWVudCwgeW91IGFyZSBlbmNvdXJhZ2VkIHRvIHJlYWQgdGhlIGZvbGxvd2luZyBkb2N1bWVudHMuCiAKLS0gSVNPL0lFQyAxMzgxOC03IChNUEVHLTIgQUFDKSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mIE1QRUctMiBBQUMgYXVkaW8gYml0c3RyZWFtcy4KLS0gSVNPL0lFQyAxNDQ5Ni0zIChNUEVHLTQgQUFDLCBzdWJwYXJ0IDEgYW5kIDQpLCB3aGljaCBkZWZpbmVzIHRoZSBzeW50YXggb2YgTVBFRy00IEFBQyBhdWRpbyBiaXRzdHJlYW1zLgotLSBMdXR6a3ksIFNjaHVsbGVyLCBHYXllciwgS3ImYXVtbDttZXIsIFdhYm5paywgIkEgZ3VpZGVsaW5lIHRvIGF1ZGlvIGNvZGVjIGRlbGF5IiwgMTE2dGggQUVTIENvbnZlbnRpb24sIE1heSA4LCAyMDA0CistIElTTy9JRUMgMTM4MTgtNyAoTVBFRy0yIEFBQykgU3RhbmRhcmQsIGRlZmluZXMgdGhlIHN5bnRheCBvZiBNUEVHLTIgQUFDIGF1ZGlvCitiaXRzdHJlYW1zLgorLSBJU08vSUVDIDE0NDk2LTMgKE1QRUctNCBBQUMsIHN1YnBhcnQgMSBhbmQgNCkgU3RhbmRhcmQsIGRlZmluZXMgdGhlIHN5bnRheCBvZgorTVBFRy00IEFBQyBhdWRpbyBiaXRzdHJlYW1zLgorLSBJU08vSUVDIDIzMDAzLTMgKE1QRUctRCBVU0FDKSwgZGVmaW5lcyBNUEVHLUQgVVNBQyB1bmlmaWVkIHNwZWVjaCBhbmQgYXVkaW8KK2NvZGVjLgorLSBMdXR6a3ksIFNjaHVsbGVyLCBHYXllciwgS3ImYXVtbDttZXIsIFdhYm5paywgIkEgZ3VpZGVsaW5lIHRvIGF1ZGlvIGNvZGVjCitkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAogCi1NUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyBpcyBiYXNlZCBvbiBhIHRpbWUtdG8tZnJlcXVlbmN5IG1hcHBpbmcgb2YgdGhlIHNpZ25hbC4gVGhlIHNpZ25hbAotaXMgcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50byBmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwKLWNvbXBvbmVudHMgYXJlIHRoZW4gcXVhbnRpemVkIGFuZCBjb2RlZC5cbgotQW4gTVBFRzIgb3IgTVBFRzQgQUFDIGF1ZGlvIGJpdHN0cmVhbSBpcyBjb21wb3NlZCBvZiBmcmFtZXMuIENvbnRyYXJ5IHRvIE1QRUctMS8yIExheWVyLTMgKG1wMyksCi10aGUgbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24KLWFueSBsZW5ndGggYmV0d2VlbiAxIGFuZCA3NjggYnl0ZXMuCitJbiBzaG9ydCwgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgaXMgYmFzZWQgb24gYSB0aW1lLXRvLWZyZXF1ZW5jeSBtYXBwaW5nIG9mCit0aGUgc2lnbmFsLiBUaGUgc2lnbmFsIGlzIHBhcnRpdGlvbmVkIGludG8gb3ZlcmxhcHBpbmcgdGltZSBwb3J0aW9ucyBhbmQKK3RyYW5zZm9ybWVkIGludG8gZnJlcXVlbmN5IGRvbWFpbi4gVGhlIHNwZWN0cmFsIGNvbXBvbmVudHMgYXJlIHRoZW4gcXVhbnRpemVkCithbmQgY29kZWQgdXNpbmcgYSBoaWdobHkgZWZmaWNpZW50IGNvZGluZyBzY2hlbWUuXG4gRW5jb2RlZCBNUEVHLTIgYW5kIE1QRUctNAorQUFDIGF1ZGlvIGJpdHN0cmVhbXMgYXJlIGNvbXBvc2VkIG9mIGZyYW1lcy4gQ29udHJhcnkgdG8gTVBFRy0xLzIgTGF5ZXItMyAobXAzKSwKK3RoZSBsZW5ndGggb2YgaW5kaXZpZHVhbCBmcmFtZXMgaXMgbm90IHJlc3RyaWN0ZWQgdG8gYSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMsCitidXQgY2FuIHRha2UgYW55IGxlbmd0aCBiZXR3ZWVuIDEgYW5kIDc2OCBieXRlcy4KKworSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIG1lbnRpb25lZCBmcmVxdWVuY3kgZG9tYWluIGNvZGluZyBtb2RlLCBNUEVHLUQgVVNBQworYWxzbyBlbXBsb3lzIGEgdGltZSBkb21haW4gQWxnZWJyYWljIENvZGUtRXhjaXRlZCBMaW5lYXIgUHJlZGljdGlvbiAoQUNFTFApCitzcGVlY2ggY29kZXIgY29yZS4gVGhpcyBvcGVyYXRpbmcgbW9kZSBpcyBzZWxlY3RlZCBieSB0aGUgZW5jb2RlciBpbiBvcmRlciB0bworYWNoaWV2ZSB0aGUgb3B0aW11bSBhdWRpbyBxdWFsaXR5IGZvciBkaWZmZXJlbnQgY29udGVudCB0eXBlLiBTZXZlcmFsCitlbmhhbmNlbWVudHMgYWxsb3cgYWNoaWV2aW5nIGhpZ2hlciBxdWFsaXR5IGF0IGxvd2VyIGJpdCByYXRlcyBjb21wYXJlZCB0bworTVBFRy00IEhFLUFBQy4KIAogCiBccGFnZSBMSUJVU0UgTGlicmFyeSBVc2FnZQogCisKIFxzZWN0aW9uIEludGVyZmFjZURlc2NyaXRwaW9uIEFQSSBEZXNjcmlwdGlvbgogCi1BbGwgQVBJIGhlYWRlciBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgZm9sZGVyIC9pbmNsdWRlIG9mIHRoZSByZWxlYXNlIHBhY2thZ2UuIFRoZXkgYXJlIGRlc2NyaWJlZCBpbgotZGV0YWlsIGluIHRoaXMgZG9jdW1lbnQuIEFsbCBoZWFkZXIgZmlsZXMgYXJlIHByb3ZpZGVkIGZvciB1c2FnZSBpbiBDL0MrKyBwcm9ncmFtcy4gVGhlIEFBQyBkZWNvZGVyIGxpYnJhcnkKLUFQSSBmdW5jdGlvbnMgYXJlIGxvY2F0ZWQgYXQgYWFjZGVjb2Rlcl9saWIuaC4KK0FsbCBBUEkgaGVhZGVyIGZpbGVzIGFyZSBsb2NhdGVkIGluIHRoZSBmb2xkZXIgL2luY2x1ZGUgb2YgdGhlIHJlbGVhc2UgcGFja2FnZS4KK1RoZSBjb250ZW50cyBvZiBlYWNoIGZpbGUgaXMgZGVzY3JpYmVkIGluIGRldGFpbCBpbiB0aGlzIGRvY3VtZW50LiBBbGwgaGVhZGVyCitmaWxlcyBhcmUgcHJvdmlkZWQgZm9yIHVzYWdlIGluIHNwZWNpZmljIEMvQysrIHByb2dyYW1zLiBUaGUgbWFpbiBBQUMgZGVjb2RlcgorbGlicmFyeSBBUEkgZnVuY3Rpb25zIGFyZSBsb2NhdGVkIGluIGFhY2RlY29kZXJfbGliLmggaGVhZGVyIGZpbGUuCiAKLUluIGJpbmFyeSByZWxlYXNlcyB0aGUgZGVjb2RlciBjb3JlIHJlc2lkZXMgaW4gc3RhdGljYWxseSBsaW5rYWJsZSBsaWJyYXJpZXMgY2FsbGVkIGZvciBleGFtcGxlIGxpYkFBQ2RlYy5hLAotKExpbnV4KSBvciBGREtfYWFjRGVjX2xpYiAoTWljcm9zb2Z0IFZpc3VhbCBDKyspLgorSW4gYmluYXJ5IHJlbGVhc2VzIHRoZSBkZWNvZGVyIGNvcmUgcmVzaWRlcyBpbiBzdGF0aWNhbGx5IGxpbmthYmxlIGxpYnJhcmllcywKK2ZvciBleGFtcGxlIGxpYkFBQ2RlYy5hLgorCiAKIFxzZWN0aW9uIENhbGxpbmdfU2VxdWVuY2UgQ2FsbGluZyBTZXF1ZW5jZQogCi1Gb3IgZGVjb2Rpbmcgb2YgSVNPL01QRUctMi80IEFBQyBvciBIRS1BQUMgdjIgYml0c3RyZWFtcyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIG1hbmRhdG9yeS4gSW5wdXQgcmVhZAotYW5kIG91dHB1dCB3cml0ZSBmdW5jdGlvbnMgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBvcGVuIGFuZCBjbG9zZSBmdW5jdGlvbnMgYXJlIGxlZnQgb3V0LCBzaW5jZSB0aGV5Ci1tYXkgYmUgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3Mgc3BlY2lmaWMgcmVxdWlyZW1lbnRzLiBUaGUgZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBpbgotbWFpbi5jcHAgdXNlcyBmaWxlLWJhc2VkIGlucHV0L291dHB1dCwgYW5kIGluIHN1Y2ggY2FzZSBjYWxsIG1wZWdGaWxlUmVhZF9PcGVuKCkgdG8gb3BlbiBhbiBpbnB1dCBmaWxlIGFuZAotdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVxdWlyZWQgc3RydWN0dXJlcywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1wZWdGaWxlUmVhZF9DbG9zZSgpIHRvIGNsb3NlIG9wZW5lZAotZmlsZXMgYW5kIHRvIGRlLWFsbG9jYXRlIGFzc29jaWF0ZWQgc3RydWN0dXJlcy4gbXBlZ0ZpbGVSZWFkX09wZW4oKSB0cmllcyB0byBkZXRlY3QgdGhlIGJpdHN0cmVhbSBmb3JtYXQgYW5kCi1pbiBjYXNlIG9mIE1QRUctNCBmaWxlIGZvcm1hdCBvciBSYXcgUGFja2V0cyBmaWxlIGZvcm1hdCAoYSBGcmF1bmhvZmVyIElJUyBwcm9wcmlldGFyeSBmb3JtYXQpIHJlYWRzIHRoZSBBdWRpbwotU3BlY2lmaWMgQ29uZmlnIGRhdGEgKEFTQykuIEFuIHVuc3VjY2Vzc2Z1bCBhdHRlbXB0IHRvIHJlY29nbml6ZSB0aGUgYml0c3RyZWFtIGZvcm1hdCByZXF1aXJlcyB0aGUgdXNlciB0bwotcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uIG1hbnVhbGx5LiBGb3IgYW55IG90aGVyIGJpdHN0cmVhbSBmb3JtYXRzIHRoYXQgYXJlIHVzdWFsbHkgYXBwbGljYWJsZSBpbiBzdHJlYW1pbmcKLWFwcGxpY2F0aW9ucywgdGhlIGRlY29kZXIgaXRzZWxmIHdpbGwgdHJ5IHRvIHN5bmNocm9uaXplIGFuZCBwYXJzZSB0aGUgZ2l2ZW4gYml0c3RyZWFtIGZyYWdtZW50IHVzaW5nIHRoZQotRkRLIHRyYW5zcG9ydCBsaWJyYXJ5LiBIZW5jZSwgZm9yIHN0cmVhbWluZyBhcHBsaWNhdGlvbnMgKHdpdGhvdXQgZmlsZSBhY2Nlc3MpIHRoaXMgc3RlcCBpcyBub3QgbmVjZXNzYXJ5LgorVGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBpcyBuZWNlc3NhcnkgZm9yIHByb3BlciBkZWNvZGluZyBvZiBJU08vTVBFRy0yLzQgQUFDLAorSEUtQUFDIHYyLCBvciBNUEVHLUQgVVNBQyBiaXRzdHJlYW1zLiBJbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uLCBpbnB1dCBzdHJlYW0KK3JlYWQgYW5kIG91dHB1dCB3cml0ZSBmdW5jdGlvbiBkZXRhaWxzIGFyZSBsZWZ0IG91dCwgc2luY2UgdGhleSBtYXkgYmUKK2ltcGxlbWVudGVkIGluIGEgdmFyaWV0eSBvZiBjb25maWd1cmF0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHVzZXIncyBzcGVjaWZpYworcmVxdWlyZW1lbnRzLiBUaGUgZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGZpbGUtYmFzZWQgaW5wdXQvb3V0cHV0LCBhbmQgaW4KK3N1Y2ggY2FzZSBvbmUgbWF5IGNhbGwgbXBlZ0ZpbGVSZWFkX09wZW4oKSB0byBvcGVuIGFuIGlucHV0IGZpbGUgYW5kIHRvIGFsbG9jYXRlCittZW1vcnkgZm9yIHRoZSByZXF1aXJlZCBzdHJ1Y3R1cmVzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbXBlZ0ZpbGVSZWFkX0Nsb3NlKCkKK3RvIGNsb3NlIG9wZW5lZCBmaWxlcyBhbmQgdG8gZGUtYWxsb2NhdGUgYXNzb2NpYXRlZCBzdHJ1Y3R1cmVzLgorbXBlZ0ZpbGVSZWFkX09wZW4oKSB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IHRoZSBiaXRzdHJlYW0gZm9ybWF0IGFuZCBpbiBjYXNlIG9mCitNUEVHLTQgZmlsZSBmb3JtYXQgb3IgUmF3IFBhY2tldHMgZmlsZSBmb3JtYXQgKGEgcHJvcHJpZXRhcnkgRnJhdW5ob2ZlciBJSVMgZmlsZQorZm9ybWF0IHN1aXRhYmxlIG9ubHkgZm9yIHRlc3RpbmcpIGl0IHdpbGwgcmVhZCB0aGUgQXVkaW8gU3BlY2lmaWMgQ29uZmlnIGRhdGEKKyhBU0MpLiBBbiB1bnN1Y2Nlc3NmdWwgYXR0ZW1wdCB0byByZWNvZ25pemUgdGhlIGJpdHN0cmVhbSBmb3JtYXQgcmVxdWlyZXMgdGhlCit1c2VyIHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiBtYW51YWxseS4gRm9yIGFueSBvdGhlciBiaXRzdHJlYW0gZm9ybWF0cyB0aGF0CithcmUgdXN1YWxseSBhcHBsaWNhYmxlIGluIHN0cmVhbWluZyBhcHBsaWNhdGlvbnMsIHRoZSBkZWNvZGVyIGl0c2VsZiB3aWxsIHRyeSB0bworc3luY2hyb25pemUgYW5kIHBhcnNlIHRoZSBnaXZlbiBiaXRzdHJlYW0gZnJhZ21lbnQgdXNpbmcgdGhlIEZESyB0cmFuc3BvcnQKK2xpYnJhcnkuIEhlbmNlLCBmb3Igc3RyZWFtaW5nIGFwcGxpY2F0aW9ucyAod2l0aG91dCBmaWxlIGFjY2VzcykgdGhpcyBzdGVwIGlzCitub3QgbmVjZXNzYXJ5LgogCi0tIyBDYWxsIGFhY0RlY29kZXJfT3BlbigpIHRvIG9wZW4gYW5kIHJldHJpZXZlIGEgaGFuZGxlIHRvIGEgbmV3IEFBQyBkZWNvZGVyIGluc3RhbmNlLgotXGRvbnRpbmNsdWRlIG1haW4uY3BwCi1cc2tpcGxpbmUgYWFjRGVjb2Rlcl9PcGVuCi0tIyBJZiBvdXQtb2YtYmFuZCBjb25maWcgZGF0YSAoQXVkaW8gU3BlY2lmaWMgQ29uZmlnIChBU0MpIG9yIFN0cmVhbSBNdXggQ29uZmlnIChTTUMpKSBpcyBhdmFpbGFibGUsIGNhbGwKLWFhY0RlY29kZXJfQ29uZmlnUmF3KCkgdG8gcGFzcyBpdCB0byB0aGUgZGVjb2RlciBhbmQgYmVmb3JlIHRoZSBkZWNvZGluZyBwcm9jZXNzIHN0YXJ0cy4gSWYgdGhpcyBkYXRhIGlzCi1ub3QgYXZhaWxhYmxlIGluIGFkdmFuY2UsIHRoZSBkZWNvZGVyIHdpbGwgZ2V0IGl0IGZyb20gdGhlIGJpdHN0cmVhbSAgYW5kIGNvbmZpZ3VyZSBpdHNlbGYgd2hpbGUgZGVjb2RpbmcKLXdpdGggYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpLgorCistIyBDYWxsIGFhY0RlY29kZXJfT3BlbigpIHRvIG9wZW4gYW5kIHJldHJpZXZlIGEgaGFuZGxlIHRvIGEgbmV3IEFBQyBkZWNvZGVyCitpbnN0YW5jZS4gXGNvZGUgYWFjRGVjb2RlckluZm8gPSBhYWNEZWNvZGVyX09wZW4odHJhbnNwb3J0VHlwZSwgbnJPZkxheWVycyk7CitcZW5kY29kZQorLSMgSWYgb3V0LW9mLWJhbmQgY29uZmlnIGRhdGEgKEF1ZGlvIFNwZWNpZmljIENvbmZpZyAoQVNDKSBvciBTdHJlYW0gTXV4IENvbmZpZworKFNNQykpIGlzIGF2YWlsYWJsZSwgY2FsbCBhYWNEZWNvZGVyX0NvbmZpZ1JhdygpIHRvIHBhc3MgdGhpcyBkYXRhIHRvIHRoZQorZGVjb2RlciBiZWZvcmUgYmVnaW5uaW5nIHRoZSBkZWNvZGluZyBwcm9jZXNzLiBJZiB0aGlzIGRhdGEgaXMgbm90IGF2YWlsYWJsZSBpbgorYWR2YW5jZSwgdGhlIGRlY29kZXIgd2lsbCBjb25maWd1cmUgaXRzZWxmIHdoaWxlIGRlY29kaW5nLCBkdXJpbmcgdGhlCithYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgZnVuY3Rpb24gY2FsbC4KIC0jIEJlZ2luIGRlY29kaW5nIGxvb3AuCi1cc2tpcGxpbmUgZG8gewotLSMgUmVhZCBkYXRhIGZyb20gYml0c3RyZWFtIGZpbGUgb3Igc3RyZWFtIGludG8gYSBjbGllbnQtc3VwcGxpZWQgaW5wdXQgYnVmZmVyICgiaW5CdWZmZXIiIGluIG1haW4uY3BwKS4KLUlmIGl0IGlzIHZlcnkgc21hbGwgbGlrZSBqdXN0IDQsIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKSB3aWxsCi1yZXBlYXRlZGx5IHJldHVybiA6OkFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTIHVudGlsIGVub3VnaCBiaXRzIHdlcmUgZmVkIGJ5IGFhY0RlY29kZXJfRmlsbCgpLiBPbmx5IHJlYWQgZGF0YQotd2hlbiB0aGlzIGJ1ZmZlciBoYXMgY29tcGxldGVseSBiZWVuIHByb2Nlc3NlZCBhbmQgaXMgdGhlbiBlbXB0eS4gRm9yIGZpbGUtYmFzZWQgaW5wdXQgZXhlY3V0ZQotbXBlZ0ZpbGVSZWFkX1JlYWQoKSBvciBhbnkgb3RoZXIgaW1wbGVtZW50YXRpb24gd2l0aCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkuCi0tIyBDYWxsIGFhY0RlY29kZXJfRmlsbCgpIHRvIGZpbGwgdGhlIGRlY29kZXIncyBpbnRlcm5hbCBiaXRzdHJlYW0gaW5wdXQgYnVmZmVyIHdpdGggdGhlIGNsaWVudC1zdXBwbGllZAotZXh0ZXJuYWwgYml0c3RyZWFtIGlucHV0IGJ1ZmZlci4KLVxza2lwbGluZSBhYWNEZWNvZGVyX0ZpbGwKLS0jIENhbGwgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpIHdoaWNoIHdyaXRlcyBkZWNvZGVkIFBDTSBhdWRpbyBkYXRhIHRvIGEgY2xpZW50LXN1cHBsaWVkIGJ1ZmZlci4gSXQgaXMgdGhlCi1jbGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhbGxvY2F0ZSBhIGJ1ZmZlciB3aGljaCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGlzIG91dHB1dCBkYXRhLgotXHNraXBsaW5lIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUKLUlmIHRoZSBiaXRzdHJlYW0ncyBjb25maWd1cmF0aW9uIChudW1iZXIgb2YgY2hhbm5lbHMsIHNhbXBsZSByYXRlLCBmcmFtZSBzaXplKSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSwgeW91IG1heQotY2FsbCBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oKSB0byByZXRyaWV2ZSBhIHN0cnVjdHVyZSBjb250YWluaW5nIHRoaXMgaW5mb3JtYXRpb24gYW5kIHRoZW4gaW5pdGlhbGl6ZSBhbiBhdWRpbwotb3V0cHV0IGRldmljZS4gSW4gdGhlIGV4YW1wbGUgbWFpbi5jcHAsIGlmIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb3IgdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkIHNpbmNlIHByb2dyYW0KLXN0YXJ0IG9yIHNpbmNlIHRoZSBwcmV2aW91c2x5IGRlY29kZWQgZnJhbWUsIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlIHdpbGwgYmUgcmUtaW5pdGlhbGl6ZWQuIElmIFdBVkUgZmlsZSBvdXRwdXQKLWlzIGNob3NlbiwgYSBuZXcgV0FWRSBmaWxlIGZvciBlYWNoIG5ldyBjb25maWd1cmF0aW9uIHdpbGwgYmUgY3JlYXRlZC4KLVxza2lwbGluZSBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8KLS0jIFJlcGVhdCBzdGVwcyA1IHRvIDcgdW50aWwgbm8gZGF0YSB0byBkZWNvZGUgaXMgYXZhaWxhYmxlIGFueW1vcmUsIG9yIGlmIGFuIGVycm9yIG9jY3VyZWQuCi1cc2tpcGxpbmUgfSB3aGlsZQotLSMgQ2FsbCBhYWNEZWNvZGVyX0Nsb3NlKCkgdG8gZGUtYWxsb2NhdGUgYWxsIEFBQyBkZWNvZGVyIGFuZCB0cmFuc3BvcnQgbGF5ZXIgc3RydWN0dXJlcy4KLVxza2lwbGluZSBhYWNEZWNvZGVyX0Nsb3NlCitcY29kZQorZG8geworXGVuZGNvZGUKKy0jIFJlYWQgZGF0YSBmcm9tIGJpdHN0cmVhbSBmaWxlIG9yIHN0cmVhbSBidWZmZXIgaW4gdG8gdGhlIGRyaXZlciBwcm9ncmFtCit3b3JraW5nIG1lbW9yeSAoYSBjbGllbnQtc3VwcGxpZWQgaW5wdXQgYnVmZmVyICJpbkJ1ZmZlciIgaW4gZnJhbWV3b3JrKS4gVGhpcworYnVmZmVyIHdpbGwgYmUgdXNlZCB0byBsb2FkIEFBQyBiaXRzdHJlYW0gZGF0YSB0byB0aGUgZGVjb2Rlci4gIE9ubHkgd2hlbiBhbGwKK2RhdGEgaW4gdGhpcyBidWZmZXIgaGFzIGJlZW4gcHJvY2Vzc2VkIHdpbGwgdGhlIGRlY29kZXIgc2lnbmFsIGFuIGVtcHR5IGJ1ZmZlci4KK0ZvciBmaWxlLWJhc2VkIGlucHV0LCB5b3UgbWF5IGludm9rZSBtcGVnRmlsZVJlYWRfUmVhZCgpIHRvIGFjcXVpcmUgbmV3CitiaXRzdHJlYW0gZGF0YS4KKy0jIENhbGwgYWFjRGVjb2Rlcl9GaWxsKCkgdG8gZmlsbCB0aGUgZGVjb2RlcidzIGludGVybmFsIGJpdHN0cmVhbSBpbnB1dCBidWZmZXIKK3dpdGggdGhlIGNsaWVudC1zdXBwbGllZCBiaXRzdHJlYW0gaW5wdXQgYnVmZmVyLiBOb3RlLCBpZiB0aGUgZGF0YSBsb2FkZWQgaW4gdG8KK3RoZSBpbnRlcm5hbCBidWZmZXIgaXMgbm90IHN1ZmZpY2llbnQgdG8gZGVjb2RlIGEgZnJhbWUsCithYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgd2lsbCByZXR1cm4gOjpBQUNfREVDX05PVF9FTk9VR0hfQklUUyB1bnRpbCBhCitzdWZmaWNpZW50IGFtb3VudCBvZiBkYXRhIGlzIGxvYWRlZCBpbiB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLiBGb3Igc3RyZWFtaW5nCitmb3JtYXRzIChBRFRTLCBMT0FTKSwgaXQgaXMgYWNjZXB0YWJsZSB0byBsb2FkIG1vcmUgdGhhbiBvbmUgZnJhbWUgdG8gdGhlCitkZWNvZGVyLiBIb3dldmVyLCBmb3IgUkFXIGZpbGUgZm9ybWF0IChGcmF1bmhvZmVyIElJUyBwcm9wcmlldGFyeSBmb3JtYXQpLCBvbmx5CitvbmUgZnJhbWUgbWF5IGJlIGxvYWRlZCB0byB0aGUgZGVjb2RlciBwZXIgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpIGNhbGwuIEZvcgorbGVhc3QgYW1vdW50IG9mIGNvbW11bmljYXRpb24gZGVsYXksIGZpbGwgYW5kIGRlY29kZSBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIGEKK2ZyYW1lIGJ5IGZyYW1lIGJhc2lzLiBcY29kZSBFcnJvclN0YXR1cyA9IGFhY0RlY29kZXJfRmlsbChhYWNEZWNvZGVySW5mbywKK2luQnVmZmVyLCBieXRlc1JlYWQsIGJ5dGVzVmFsaWQpOyBcZW5kY29kZQorLSMgQ2FsbCBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkuIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyBvbmUgZnJhbWUgYW5kIHdyaXRlcworZGVjb2RlZCBQQ00gYXVkaW8gZGF0YSB0byBhIGNsaWVudC1zdXBwbGllZCBidWZmZXIuIEl0IGlzIHRoZSBjbGllbnQncworcmVzcG9uc2liaWxpdHkgdG8gYWxsb2NhdGUgYSBidWZmZXIgd2hpY2ggaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGRlY29kZWQKK291dHB1dCBkYXRhLiBcY29kZSBFcnJvclN0YXR1cyA9IGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoYWFjRGVjb2RlckluZm8sCitUaW1lRGF0YSwgT1VUX0JVRl9TSVpFLCBmbGFncyk7IFxlbmRjb2RlIElmIHRoZSBiaXRzdHJlYW0gY29uZmlndXJhdGlvbiAobnVtYmVyCitvZiBjaGFubmVscywgc2FtcGxlIHJhdGUsIGZyYW1lIHNpemUpIGlzIG5vdCBrbm93biBhIHByaW9yaSwgeW91IG1heSBjYWxsCithYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oKSB0byByZXRyaWV2ZSBhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMKK2luZm9ybWF0aW9uLiBZb3UgbWF5IHVzZSB0aGlzIGRhdGEgdG8gaW5pdGlhbGl6ZSBhbiBhdWRpbyBvdXRwdXQgZGV2aWNlLiBJbiB0aGUKK2V4YW1wbGUgcHJvZ3JhbSwgaWYgdGhlIG51bWJlciBvZiBjaGFubmVscyBvciB0aGUgc2FtcGxlIHJhdGUgaGFzIGNoYW5nZWQgc2luY2UKK3Byb2dyYW0gc3RhcnQgb3IgdGhlIHByZXZpb3VzbHkgZGVjb2RlZCBmcmFtZSwgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2UgaXMgdGhlbgorcmUtaW5pdGlhbGl6ZWQuIElmIFdBVkUgZmlsZSBvdXRwdXQgaXMgY2hvc2VuLCBhIG5ldyBXQVZFIGZpbGUgZm9yIGVhY2ggbmV3CitzdHJlYW0gY29uZmlndXJhdGlvbiBpcyBiZSBjcmVhdGVkLiBcY29kZSBwX3NpID0KK2FhY0RlY29kZXJfR2V0U3RyZWFtSW5mbyhhYWNEZWNvZGVySW5mbyk7IFxlbmRjb2RlCistIyBSZXBlYXQgc3RlcHMgNSB0byA3IHVudGlsIG5vIGRhdGEgaXMgYXZhaWxhYmxlIHRvIGRlY29kZSBhbnkgbW9yZSwgb3IgaW4gY2FzZQorb2YgZXJyb3IuIFxjb2RlIH0gd2hpbGUgKGJ5dGVzUmVhZFswXSA+IDAgfHwgZG9GbHVzaCB8fCBkb0JzRmx1c2ggfHwKK2ZvcmNlQ29udGludWUpOyBcZW5kY29kZQorLSMgQ2FsbCBhYWNEZWNvZGVyX0Nsb3NlKCkgdG8gZGUtYWxsb2NhdGUgYWxsIEFBQyBkZWNvZGVyIGFuZCB0cmFuc3BvcnQgbGF5ZXIKK3N0cnVjdHVyZXMuIFxjb2RlIGFhY0RlY29kZXJfQ2xvc2UoYWFjRGVjb2RlckluZm8pOyBcZW5kY29kZQorCitcaW1hZ2UgbGF0ZXggZGVjb2RlLnBuZyAiRGVjb2RlIGNhbGxpbmcgc2VxdWVuY2UiIHdpZHRoPTExY20KKworXGltYWdlIGxhdGV4IGNoYW5nZV9zb3VyY2UucG5nICJDaGFuZ2UgZGF0YSBzb3VyY2Ugc2VxdWVuY2UiIHdpZHRoIDVjbQorCitcaW1hZ2UgbGF0ZXggY29uY2VhbC5wbmcgIkVycm9yIGNvbmNlYWxtZW50IHNlcXVlbmNlIiB3aWR0aD0xNGNtCisKK1xzdWJzZWN0aW9uIEVycm9yX0NvbmNlYWxtZW50X1NlcXVlbmNlIEVycm9yIENvbmNlYWxtZW50IFNlcXVlbmNlCisKK1RoZXJlIGFyZSBkaWZmZXJlbnQgc3RyYXRlZ2llcyB0byBoYW5kbGUgYml0IHN0cmVhbSBlcnJvcnMuIERlcGVuZGluZyBvbiB0aGUKK3N5c3RlbSBwcm9wZXJ0aWVzIHRoZSBwcm9kdWN0IGRlc2lnbmVyIG1pZ2h0IGNob29zZSB0byB0YWtlIGRpZmZlcmVudCBhY3Rpb25zIGluCitjYXNlIGEgYml0IGVycm9yIG9jY3Vycy4gSW4gbWFueSBjYXNlcyB0aGUgZGVjb2RlciBtaWdodCBiZSBhYmxlIHRvIGRvCityZWFzb25hYmxlIGVycm9yIGNvbmNlYWxtZW50IHdpdGhvdXQgdGhlIG5lZWQgb2YgYW55IGFkZGl0aW9uYWwgYWN0aW9ucyBmcm9tIHRoZQorc3lzdGVtLiBCdXQgaW4gc29tZSBjYXNlcyBpdHMgbm90IGV2ZW4gcG9zc2libGUgdG8ga25vdyBob3cgbWFueSBkZWNvZGVkIFBDTQorb3V0cHV0IHNhbXBsZXMgYXJlIHJlcXVpcmVkIHRvIGZpbGwgdGhlIGdhcCBkdWUgdG8gdGhlIGRhdGEgZXJyb3IsIHRoZW4gdGhlCitzb2Z0d2FyZSBzdXJyb3VuZGluZyB0aGUgZGVjb2RlciBtdXN0IGRlYWwgd2l0aCB0aGUgc2l0dWF0aW9uLiBUaGUgbW9zdCBzaW1wbGUKK3dheSB3b3VsZCBiZSB0byBqdXN0IHN0b3AgYXVkaW8gcGxheWJhY2sgYW5kIHJlc3VtZSBvbmNlIGVub3VnaCBiaXQgc3RyZWFtIGRhdGEKK2FuZC9vciBidWZmZXJlZCBvdXRwdXQgc2FtcGxlcyBhcmUgYXZhaWxhYmxlLiBNb3JlIHNvcGhpc3RpY2F0ZWQgZGVzaWducyBtaWdodAorYWxzbyBiZSBhYmxlIHRvIGRlYWwgd2l0aCBzZW5kZXIvcmVjZWl2ZXIgY2xvY2sgZHJpZnRzIG9yIGRhdGEgZHJvcCBvdXRzIGJ5Cit1c2luZyBhIGNsb3NlZCBsb29wIGNvbnRyb2wgb2YgRklGTyBmdWxuZXNzIGxldmVscy4gVGhlIGNob3NlbiBzdHJhdGVneSBkZXBlbmRzCitvbiB0aGUgZmluYWwgcHJvZHVjdCByZXF1aXJlbWVudHMuCisKK1RoZSBlcnJvciBjb25jZWFsbWVudCBzZXF1ZW5jZSBkaWFncmFtIGlsbHVzdHJhdGVzIHRoZSBnZW5lcmFsIGV4ZWN1dGlvbiBwYXRocworZm9yIGVycm9yIGhhbmRsaW5nLgorCitUaGUgbWFjcm8gSVNfT1VUUFVUX1ZBTElEKGVycikgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgaWYgdGhlIGF1ZGlvIG91dHB1dAorYnVmZmVyIGNvbnRhaW5zIHZhbGlkIGF1ZGlvIGVpdGhlciBmcm9tIGVycm9yIGZyZWUgYml0IHN0cmVhbSBkYXRhIG9yIHN1Y2Nlc3NmdWwKK2Vycm9yIGNvbmNlYWxtZW50LiBJbiBjYXNlIHRoZSByZXN1bHQgaXMgZmFsc2UsIHRoZSBkZWNvZGVyIG91dHB1dCBidWZmZXIgZG9lcworbm90IGNvbnRhaW4gbWVhbmluZ2Z1bCBhdWRpbyBzYW1wbGVzIGFuZCBzaG91bGQgbm90IGJlIHBhc3NlZCB0byBhbnkgb3V0cHV0IGFzCitpdCBpcy4gTW9zdCBsaWtlbHkgaW4gY2FzZSB0aGF0IGEgY29udGludW91cyBhdWRpbyBvdXRwdXQgUENNIHN0cmVhbSBpcworcmVxdWlyZWQsIHRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgZmlsbGVkIHdpdGggYXVkaW8gZGF0YSBmcm9tIHRoZSBjYWxsaW5nCitmcmFtZXdvcmsuIFRoaXMgbWlnaHQgYmUgZS5nLiBhbiBhcHByb3ByaWF0ZSBudW1iZXIgb2Ygc2FtcGxlcyBhbGwgemVyby4KKworSWYgZXJyb3IgY29kZSA6OkFBQ19ERUNfVFJBTlNQT1JUX1NZTkNfRVJST1IgaXMgcmV0dXJuZWQgYnkgdGhlIGRlY29kZXIsIHVuZGVyCitzb21lIHBhcnRpY3VsYXIgY29uZGl0aW9ucyBpdCBpcyBwb3NzaWJsZSB0byBlc3RpbWF0ZSBsb3N0IGZyYW1lcyBkdWUgdG8gdGhlIGJpdAorc3RyZWFtIGVycm9yLiBJbiB0aGF0IGNhc2UgdGhlIGJpdCBzdHJlYW0gaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIGNvbnN0YW50CitiaXRyYXRlLCBhbmQgY29tcGF0aWJsZSB0cmFuc3BvcnQgdHlwZS4gQXVkaW8gc2FtcGxlcyBmb3IgdGhlIGxvc3QgZnJhbWVzIGNhbiBiZQorb2J0YWluZWQgYnkgY2FsbGluZyBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgd2l0aCBmbGFnIDo6QUFDREVDX0NPTkNFQUwgc2V0CituLXRpbWVzIHdoZXJlIG4gaXMgdGhlIGNvdW50IG9mIGxvc3QgZnJhbWVzLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBkZWNvZGVyIGhhcyB0bworaGF2ZSBlbmNvdW50ZXJlZCB2YWxpZCBjb25maWd1cmF0aW9uIGRhdGEgYXQgbGVhc3Qgb25jZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlCitjb25jZWFsZWQgZGF0YSwgYmVjYXVzZSBhdCB0aGUgbWluaW11bSB0aGUgc2FtcGxpbmcgcmF0ZSwgZnJhbWUgc2l6ZSBhbmQgYW1vdW50CitvZiBhdWRpbyBjaGFubmVscyBuZWVkcyB0byBiZSBrbm93bi4KKworSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdldCBhbiBlc3RpbWF0aW9uIG9mIGxvc3QgZnJhbWVzIHRoZW4gYSBjb25zdGFudAorZnVsbG5lc3Mgb2YgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIgY2FuIGJlIGFjaGlldmVkIGJ5IGltcGxlbWVudGluZyBkaWZmZXJlbnQKK0ZJRk8gY29udHJvbCB0ZWNobmlxdWVzIGUuZy4ganVzdCBzdG9wIHRha2luZyBvZiBzYW1wbGVzIGZyb20gdGhlIGJ1ZmZlciB0bworYXZvaWQgdW5kZXJmbG93IG9yIHN0b3AgZmlsbGluZyBuZXcgZGF0YSB0byB0aGUgYnVmZmVyIHRvIGF2b2lkIG92ZXJmbG93LiBCdXQKK3RoaXMgdGVjaG5pcXVlcyBhcmUgb3V0IG9mIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQuCisKK0ZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgZXJyb3IgY29kZSBwbGVhc2UgcmVmZXIgYWxzbyB0bworOjpBQUNfREVDT0RFUl9FUlJPUi4KIAogXHNlY3Rpb24gQnVmZmVyU3lzdGVtIEJ1ZmZlciBTeXN0ZW0KIAotVGhlcmUgYXJlIHRocmVlIG1haW4gYnVmZmVycyBpbiBhbiBBQUMgZGVjb2RlciBhcHBsaWNhdGlvbi4gT25lIGV4dGVybmFsIGlucHV0IGJ1ZmZlciB0byBob2xkIGJpdHN0cmVhbQotZGF0YSBmcm9tIGZpbGUgSS9PIG9yIGVsc2V3aGVyZSwgb25lIGRlY29kZXItaW50ZXJuYWwgaW5wdXQgYnVmZmVyLCBhbmQgb25lIHRvIGhvbGQgdGhlIGRlY29kZWQgb3V0cHV0Ci1QQ00gc2FtcGxlIGRhdGEsIHdoZXJlYXMgdGhpcyBvdXRwdXQgYnVmZmVyIG1heSBvdmVybGFwIHdpdGggdGhlIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4KK1RoZXJlIGFyZSB0aHJlZSBtYWluIGJ1ZmZlcnMgaW4gYW4gQUFDIGRlY29kZXIgYXBwbGljYXRpb24uIE9uZSBleHRlcm5hbCBpbnB1dAorYnVmZmVyIHRvIGhvbGQgYml0c3RyZWFtIGRhdGEgZnJvbSBmaWxlIEkvTyBvciBlbHNld2hlcmUsIG9uZSBkZWNvZGVyLWludGVybmFsCitpbnB1dCBidWZmZXIsIGFuZCBvbmUgdG8gaG9sZCB0aGUgZGVjb2RlZCBvdXRwdXQgUENNIHNhbXBsZSBkYXRhLiBJbiByZXNvdXJjZQorbGltaXRlZCBhcHBsaWNhdGlvbnMsIHRoZSBvdXRwdXQgYnVmZmVyIG1heSBiZSByZXVzZWQgYXMgYW4gZXh0ZXJuYWwgaW5wdXQKK2J1ZmZlciBwcmlvciB0byB0aGUgc3Vic2VxdWVuY2UgYWFjRGVjb2Rlcl9GaWxsKCkgZnVuY3Rpb24gY2FsbC4KIAotVGhlIGV4dGVybmFsIGlucHV0IGJ1ZmZlciBpcyBzZXQgaW4gdGhlIGV4YW1wbGUgZnJhbWV3b3JrIG1haW4uY3BwIGFuZCBpdHMgc2l6ZSBpcyBkZWZpbmVkIGJ5IDo6SU5fQlVGX1NJWkUuCi1Zb3UgbWF5IGZyZWVseSBjaG9vc2UgZGlmZmVyZW50IHNpemVzIGhlcmUuIFRvIGZlZWQgdGhlIGRhdGEgdG8gdGhlIGRlY29kZXItaW50ZXJuYWwgaW5wdXQgYnVmZmVyLCB1c2UgdGhlCi1mdW5jdGlvbiBhYWNEZWNvZGVyX0ZpbGwoKS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCBob3cgbWFueSBieXRlcyBpbiB0aGUKLWV4dGVybmFsIGlucHV0IGJ1ZmZlciBoYXZlIG5vdCB5ZXQgYmVlbiBjb3BpZWQgaW50byB0aGUgaW50ZXJuYWwgaW5wdXQgYnVmZmVyICh2YXJpYWJsZSBieXRlc1ZhbGlkKS4KLU9uY2UgdGhlIGV4dGVybmFsIGJ1ZmZlciBoYXMgYmVlbiBmdWxseSBjb3BpZWQsIGl0IGNhbiBiZSByZS1maWxsZWQgYWdhaW4uCi1JbiBjYXNlIHlvdSB3YW50IHRvIHJlLWZpbGwgaXQgd2hlbiB0aGVyZSBhcmUgc3RpbGwgdW5wcm9jZXNzZWQgYnl0ZXMgKGJ5dGVzVmFsaWQgaXMgdW5lcXVhbCAwKSwgeW91Ci13b3VsZCBoYXZlIHRvIGFkZGl0aW9uYWxseSBwZXJmb3JtIGEgbWVtY3B5KCksIHNvIHRoYXQganVzdCBtZWFucyB1bm5lY2Vzc2FyeSBjb21wdXRhdGlvbmFsIG92ZXJoZWFkCi1hbmQgdGhlcmVmb3JlIHdlIHJlY29tbWVuZCB0byByZS1maWxsIHRoZSBidWZmZXIgb25seSB3aGVuIGJ5dGVzVmFsaWQgaXMgMC4KK1RoZSBleHRlcm5hbCBpbnB1dCBidWZmZXIgaXMgc2V0IGluIHRoZSBleGFtcGxlIHByb2dyYW0gYW5kIGl0cyBzaXplIGlzIGRlZmluZWQKK2J5IDo6SU5fQlVGX1NJWkUuIFlvdSBtYXkgZnJlZWx5IGNob29zZSBkaWZmZXJlbnQgYnVmZmVyIHNpemVzLiBUbyBmZWVkIHRoZSBkYXRhCit0byB0aGUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIsIHVzZSB0aGUgZnVuY3Rpb24gYWFjRGVjb2Rlcl9GaWxsKCkuIFRoaXMKK2Z1bmN0aW9uIHJldHVybnMgaW1wb3J0YW50IGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29waWVkIGludG8gdGhlIGludGVybmFsIGlucHV0CitidWZmZXIgKHZhcmlhYmxlIGJ5dGVzVmFsaWQpLiBPbmNlIHRoZSBleHRlcm5hbCBidWZmZXIgaGFzIGJlZW4gZnVsbHkgY29waWVkLCBpdAorY2FuIGJlIGNvbXBsZXRlbHkgcmUtZmlsbGVkIGFnYWluLiBJbiBjYXNlIHlvdSB3aXNoIHRvIHJlZmlsbCB0aGUgYnVmZmVyIHdoaWxlCit0aGVyZSBhcmUgdW5wcm9jZXNzZWQgYnl0ZXMgKGJ5dGVzVmFsaWQgaXMgdW5lcXVhbCAwKSwgeW91IHNob3VsZCBwcmVzZXJ2ZSB0aGUKK3VuY29uc3VtZWQgZGF0YS4gSG93ZXZlciwgd2UgcmVjb21tZW5kIHRvIHJlZmlsbCB0aGUgYnVmZmVyIG9ubHkgd2hlbiBieXRlc1ZhbGlkCityZXR1cm5zIDAuCiAKLVxpbWFnZSBsYXRleCBkZWNfYnVmZmVyLnBuZyAiTGlmZWN5Y2xlIG9mIHRoZSBleHRlcm5hbCBpbnB1dCBidWZmZXIiIHdpZHRoPTljbQorVGhlIGJ5dGVzVmFsaWQgcGFyYW1ldGVyIGlzIGFuIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyIHRvIHRoZSBGREsgZGVjb2Rlci4gQXMKK2FuIGlucHV0LCBpdCBzaWduYWxzIGhvdyBtYW55IHZhbGlkIGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGV4dGVybmFsIGJ1ZmZlci4KK0FmdGVyIGNvbnN1bXB0aW9uIG9mIHRoZSBleHRlcm5hbCBidWZmZXIgdXNpbmcgYWFjRGVjb2Rlcl9GaWxsKCkgZnVuY3Rpb24sIHRoZQorYnl0ZXNWYWxpZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIGFueSBvZiB0aGUgYnl0ZXMgaW4gdGhlIGV4dGVybmFsIGJ1ZmZlciB3ZXJlCitub3QgY29uc3VtZWQuCiAKLVRoZSBzaXplIG9mIHRoZSBkZWNvZGVyLWludGVybmFsIGlucHV0IGJ1ZmZlciBpcyBzZXQgaW4gdHBkZWNfbGliLmggKHNlZSBkZWZpbmUgOjpUUkFOU1BPUlRERUNfSU5CVUZfU0laRSkuCi1Zb3UgbWF5IGNob29zZSBhIHNtYWxsZXIgc2l6ZSB1bmRlciB0aGUgZm9sbG93aW5nIGNvbnNpZGVyYXRpb25zOgotCi0tIGVhY2ggaW5wdXQgY2hhbm5lbCByZXF1aXJlcyA3NjggYnl0ZXMKLS0gdGhlIHdob2xlIGJ1ZmZlciBtdXN0IGJlIG9mIHNpemUgMl5uCi0KLVNvIGZvciBleGFtcGxlIGEgc3RlcmVvIGRlY29kZXI6Ci0KLVxmWwotVFJBTlNQT1JUREVDXF9JTkJVRlxfU0laRSA9IDIgKiA3NjggPSAxNTM2ID0+IDIwNDgKLVxmXQotCi10cGRlY19saWIuaCBhbmQgVFJBTlNQT1JUREVDX0lOQlVGX1NJWkUgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkZWNvZGVyJ3MgbGlicmFyeSBpbnRlcmZhY2UuIFRoZXJlZm9yZQotb25seSBzb3VyY2UtY29kZSBjbGllbnRzIG1heSBjaGFuZ2UgdGhpcyBzZXR0aW5nLiBJZiB5b3UgcmVjZWl2ZWQgYSBsaWJyYXJ5IHJlbGVhc2UsIHBsZWFzZSBhc2sgdXMgYW5kCi13ZSBjYW4gY2hhbmdlIHRoaXMgaW4gb3JkZXIgdG8gbWVldCB5b3VyIG1lbW9yeSByZXF1aXJlbWVudHMuCitcaW1hZ2UgbGF0ZXggZGVjX2J1ZmZlci5wbmcgIkxpZmUgY3ljbGUgb2YgdGhlIGV4dGVybmFsIGlucHV0IGJ1ZmZlciIgd2lkdGg9OWNtCiAKIFxwYWdlIE91dHB1dEZvcm1hdCBEZWNvZGVyIGF1ZGlvIG91dHB1dAogCiBcc2VjdGlvbiBPdXRwdXRGb3JtYXRPYnRhaW5pbmcgT2J0YWluaW5nIGNoYW5uZWwgbWFwcGluZyBpbmZvcm1hdGlvbgogCi1UaGUgZGVjb2RlZCBhdWRpbyBvdXRwdXQgZm9ybWF0IGlzIGluZGljYXRlZCBieSBhIHNldCBvZiB2YXJpYWJsZXMgb2YgdGhlIENTdHJlYW1JbmZvIHN0cnVjdHVyZS4KLVdoaWxlIHRoZSBtZW1iZXJzIHNhbXBsZVJhdGUsIGZyYW1lU2l6ZSBhbmQgbnVtQ2hhbm5lbHMgbWlnaHQgYmUgcXVpdGUgc2VsZiBleHBsYWluaW5nLAotcENoYW5uZWxUeXBlIGFuZCBwQ2hhbm5lbEluZGljZXMgbWlnaHQgcmVxdWlyZSBzb21lIG1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24uCitUaGUgZGVjb2RlZCBhdWRpbyBvdXRwdXQgZm9ybWF0IGlzIGluZGljYXRlZCBieSBhIHNldCBvZiB2YXJpYWJsZXMgb2YgdGhlCitDU3RyZWFtSW5mbyBzdHJ1Y3R1cmUuIFdoaWxlIHRoZSBzdHJ1Y3QgbWVtYmVycyBzYW1wbGVSYXRlLCBmcmFtZVNpemUgYW5kCitudW1DaGFubmVscyBtaWdodCBiZSBzZWxmIGV4cGxhbmF0b3J5LCBwQ2hhbm5lbFR5cGUgYW5kIHBDaGFubmVsSW5kaWNlcyByZXF1aXJlCitzb21lIGZ1cnRoZXIgZXhwbGFuYXRpb24uCiAKLVRoZXNlIHR3byBhcnJheXMgaW5kaWNhdGUgd2hhdCBpcyBlYWNoIG91dHB1dCBjaGFubmVsIHN1cHBvc2VkIHRvIGJlLiBCb3RoIGFycmF5IGhhdmUKLUNTdHJlYW1JbmZvOjpudW1DaGFubmVscyBjZWxscy4gRWFjaCBjZWxsIG9mIHBDaGFubmVsVHlwZSBpbmRpY2F0ZXMgdGhlIGNoYW5uZWwgdHlwZSwgZGVzY3JpYmVkIGluCi10aGUgZW51bSA6OkFVRElPX0NIQU5ORUxfVFlQRSBkZWZpbmVkIGluIEZES19hdWRpby5oLiBUaGUgY2VsbHMgb2YgcENoYW5uZWxJbmRpY2VzIGluZGljYXRlIHRoZSBzdWIgaW5kZXgKLWFtb25nIHRoZSBjaGFubmVscyBzdGFydGluZyB3aXRoIDAgYW1vbmcgYWxsIGNoYW5uZWxzIG9mIHRoZSBzYW1lIGF1ZGlvIGNoYW5uZWwgdHlwZS4KK1RoZXNlIHR3byBhcnJheXMgaW5kaWNhdGUgdGhlIGNvbmZpZ3VyYXRpb24gb2YgY2hhbm5lbCBkYXRhIHdpdGhpbiB0aGUgb3V0cHV0CitidWZmZXIuIEJvdGggYXJyYXlzIGhhdmUgQ1N0cmVhbUluZm86Om51bUNoYW5uZWxzIG51bWJlciBvZiBjZWxscy4gRWFjaCBjZWxsIG9mCitwQ2hhbm5lbFR5cGUgaW5kaWNhdGVzIHRoZSBjaGFubmVsIHR5cGUsIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiB0aGUgZW51bQorOjpBVURJT19DSEFOTkVMX1RZUEUgKGRlZmluZWQgaW4gRkRLX2F1ZGlvLmgpLiBUaGUgY2VsbHMgb2YgcENoYW5uZWxJbmRpY2VzCitpbmRpY2F0ZSB0aGUgc3ViIGluZGV4IGFtb25nIHRoZSBjaGFubmVscyBzdGFydGluZyB3aXRoIDAgYW1vbmcgY2hhbm5lbHMgb2YgdGhlCitzYW1lIGF1ZGlvIGNoYW5uZWwgdHlwZS4KIAotVGhlIGluZGV4aW5nIHNjaGVtZSBpcyB0aGUgc2FtZSBhcyBmb3IgTVBFRy0yLzQuIFRodXMgaW5kaWNlcyBhcmUgY291bnRlZCB1cHdhcmRzIHN0YXJ0aW5nIGZyb20gdGhlIGZyb250Ci1kaXJlY3Rpb24gKHRodXMgYSBjZW50ZXIgY2hhbm5lbCBpZiBhbnksIHdpbGwgYWx3YXlzIGJlIGluZGV4IDApLiBUaGVuIHRoZSBpbmRpY2VzIGNvdW50IHVwLCBzdGFydGluZyBhbHdheXMKLXdpdGggdGhlIGxlZnQgc2lkZSwgcGFpcndpc2UgZnJvbSBmcm9udCB0b3dhcmQgYmFjay4gRm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uLCBwbGVhc2UgcmVmZXIgdG8KLUlTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCBjaGFwdGVyIDguNS4zLjIuCitUaGUgaW5kZXhpbmcgc2NoZW1lIGlzIHN0cnVjdHVyZWQgYXMgZGVmaW5lZCBpbiBNUEVHLTIvNCBTdGFuZGFyZHMuIEluZGljZXMKK3N0YXJ0IGZyb20gdGhlIGZyb250IGRpcmVjdGlvbiAoYSBjZW50ZXIgY2hhbm5lbCBpZiBhdmFpbGFibGUsIHdpbGwgYWx3YXlzIGJlCitpbmRleCAwKSBhbmQgaW5jcmVtZW50LCBzdGFydGluZyB3aXRoIHRoZSBsZWZ0IHNpZGUsIHBhaXJ3aXNlIChlLmcuIEwsIFIpIGFuZAorZnJvbSBmcm9udCB0byBiYWNrIChGcm9udCBMLCBGcm9udCBSLCBTdXJyb3VuZCBMLCBTdXJyb3VuZCBSKS4gRm9yIGRldGFpbGVkCitleHBsYW5hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCBjaGFwdGVyIDguNS4zLjIuCiAKLUluIGNhc2UgYSBQcm9ncmFtIENvbmZpZyBpcyBpbmNsdWRlZCBpbiB0aGUgYXVkaW8gY29uZmlndXJhdGlvbiwgdGhlIGNoYW5uZWwgbWFwcGluZyBkZXNjcmliZWQgd2l0aGluCi1pdCB3aWxsIGJlIGFkb3B0ZWQuCitJbiBjYXNlIGEgUHJvZ3JhbSBDb25maWcgaXMgaW5jbHVkZWQgaW4gdGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb24sIHRoZSBjaGFubmVsCittYXBwaW5nIGRlc2NyaWJlZCB3aXRoaW4gaXQgd2lsbCBiZSBhZG9wdGVkLgogCi1JbiBjYXNlIG9mIE1QRUctRCBTdXJyb3VuZCB0aGUgY2hhbm5lbCBtYXBwaW5nIHdpbGwgZm9sbG93IHRoZSBzYW1lIGNyaXRlcmlhIGRlc2NyaWJlZCBpbiBJU08vSUVDIDEzODE4LTc6MjAwNShFKSwKLWJ1dCBhZGRpbmcgY29ycmVzcG9uZGluZyB0b3AgY2hhbm5lbHMgdG8gdGhlIGNoYW5uZWwgdHlwZXMgZnJvbnQsIHNpZGUgYW5kIGJhY2ssIGluIG9yZGVyIHRvIGF2b2lkIGFueQotbG9zcyBvZiBpbmZvcm1hdGlvbi4KK0luIGNhc2Ugb2YgTVBFRy1EIFN1cnJvdW5kIHRoZSBjaGFubmVsIG1hcHBpbmcgd2lsbCBmb2xsb3cgdGhlIHNhbWUgY3JpdGVyaWEKK2Rlc2NyaWJlZCBpbiBJU08vSUVDIDEzODE4LTc6MjAwNShFKSwgYnV0IGFkZGluZyBjb3JyZXNwb25kaW5nIHRvcCBjaGFubmVscyAoaWYKK2F2YWlsYWJsZSkgdG8gdGhlIGNoYW5uZWwgdHlwZXMgaW4gb3JkZXIgdG8gYXZvaWQgYW1iaWd1aXR5LiBUaGUgZXhhbXBsZXMgYmVsb3cKK2V4cGxhaW4gdGhlc2UgYXNwZWN0cyBpbiBkZXRhaWwuCiAKIFxzZWN0aW9uIE91dHB1dEZvcm1hdENoYW5nZSBDaGFuZ2luZyB0aGUgYXVkaW8gb3V0cHV0IGZvcm1hdAogCi1UaGUgY2hhbm5lbCBpbnRlcmxlYXZpbmcgc2NoZW1lIGFuZCB0aGUgYWN0dWFsIGNoYW5uZWwgb3JkZXIgY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSB0aHJvdWdoIHRoZQotcGFyYW1ldGVycyA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIGFuZCA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORy4gU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aG9zZQotcGFyYW1ldGVycyBhbmQgdGhlIGRlY29kZXIgbGlicmFyeSBmdW5jdGlvbiBhYWNEZWNvZGVyX1NldFBhcmFtKCkgZm9yIG1vcmUgZGV0YWlsLgorRm9yIE1QRUctNCBhdWRpbyB0aGUgY2hhbm5lbCBvcmRlciBjYW4gYmUgY2hhbmdlZCBhdCBydW50aW1lIHRocm91Z2ggdGhlCitwYXJhbWV0ZXIKKzo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HLiBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRob3NlCitwYXJhbWV0ZXJzIGFuZCB0aGUgZGVjb2RlciBsaWJyYXJ5IGZ1bmN0aW9uIGFhY0RlY29kZXJfU2V0UGFyYW0oKSBmb3IgbW9yZQorZGV0YWlsLgogCiBcc2VjdGlvbiBPdXRwdXRGb3JtYXRFeGFtcGxlIENoYW5uZWwgbWFwcGluZyBleGFtcGxlcwogCi1UaGUgZm9sbG93aW5nIGV4YW1wbGVzIGlsbHVzdHJhdGUgdGhlIGxvY2F0aW9uIG9mIGluZGl2aWR1YWwgYXVkaW8gc2FtcGxlcyBpbiB0aGUgYXVkaW8gYnVmZmVyIHRoYXQKLWlzIHBhc3NlZCB0byBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgYW5kIHRoZSBleHBlY3RlZCBkYXRhIGluIHRoZSBDU3RyZWFtSW5mbyBzdHJ1Y3R1cmUgd2hpY2ggY2FuIGJlIG9idGFpbmVkCi1ieSBjYWxsaW5nIGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbygpLgorVGhlIGZvbGxvd2luZyBleGFtcGxlcyBpbGx1c3RyYXRlIHRoZSBsb2NhdGlvbiBvZiBpbmRpdmlkdWFsIGF1ZGlvIHNhbXBsZXMgaW4KK3RoZSBhdWRpbyBidWZmZXIgdGhhdCBpcyBwYXNzZWQgdG8gYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpIGFuZCB0aGUgZXhwZWN0ZWQKK2RhdGEgaW4gdGhlIENTdHJlYW1JbmZvIHN0cnVjdHVyZSB3aGljaCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZworYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKCkuCiAKIFxzdWJzZWN0aW9uIEV4YW1wbGVzU3RlcmVvIFN0ZXJlbwogCi1JbiBjYXNlIG9mIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgc2V0IHRvIDAgYW5kIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIHNldCB0byAxLAotYSBBQUMtTEMgYml0IHN0cmVhbSB3aGljaCBoYXMgY2hhbm5lbENvbmZpZ3VyYXRpb24gPSAyIGluIGl0cyBhdWRpbyBzcGVjaWZpYyBjb25maWcgd291bGQgbGVhZAotdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gQ1N0cmVhbUluZm86CitJbiBjYXNlIG9mIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIHNldCB0byAxLAorYSBBQUMtTEMgYml0IHN0cmVhbSB3aGljaCBoYXMgY2hhbm5lbENvbmZpZ3VyYXRpb24gPSAyIGluIGl0cyBhdWRpbyBzcGVjaWZpYworY29uZmlnIHdvdWxkIGxlYWQgdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gQ1N0cmVhbUluZm86CiAKIENTdHJlYW1JbmZvOjpudW1DaGFubmVscyA9IDIKIApAQCAtMjYxLDggKzM3Miw3IEBACiAKIENTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMgPSB7IDAsIDEgfQogCi1TaW5jZSA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIGlzIHNldCB0byAwLCB0aGUgYXVkaW8gY2hhbm5lbHMgd2lsbCBiZSBsb2NhdGVkIGFzIGNvbnRpZ3VvdXMgYmxvY2tzCi1pbiB0aGUgb3V0cHV0IGJ1ZmZlciBhcyBmb2xsb3dzOgorVGhlIG91dHB1dCBidWZmZXIgd2lsbCBiZSBmb3JtYXR0ZWQgYXMgZm9sbG93czoKIAogXHZlcmJhdGltCiAgIDxsZWZ0IHNhbXBsZSAwPiAgPGxlZnQgc2FtcGxlIDE+ICA8bGVmdCBzYW1wbGUgMj4gIC4uLiA8bGVmdCBzYW1wbGUgTj4KQEAgLTI3MywyNSArMzgzLDI3IEBACiAKIFxzdWJzZWN0aW9uIEV4YW1wbGVzU3Vycm91bmQgU3Vycm91bmQgNS4xCiAKLUluIGNhc2Ugb2YgOjpBQUNfUENNX09VVFBVVF9JTlRFUkxFQVZFRCBzZXQgdG8gMSBhbmQgOjpBQUNfUENNX09VVFBVVF9DSEFOTkVMX01BUFBJTkcgc2V0IHRvIDEsCi1hIEFBQy1MQyBiaXQgc3RyZWFtIHdoaWNoIGhhcyBjaGFubmVsQ29uZmlndXJhdGlvbiA9IDYgaW4gaXRzIGF1ZGlvIHNwZWNpZmljIGNvbmZpZywgd291bGQgbGVhZAotdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gQ1N0cmVhbUluZm86CitJbiBjYXNlIG9mIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIHNldCB0byAxLAorYSBBQUMtTEMgYml0IHN0cmVhbSB3aGljaCBoYXMgY2hhbm5lbENvbmZpZ3VyYXRpb24gPSA2IGluIGl0cyBhdWRpbyBzcGVjaWZpYworY29uZmlnLCB3b3VsZCBsZWFkIHRvIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIENTdHJlYW1JbmZvOgogCiBDU3RyZWFtSW5mbzo6bnVtQ2hhbm5lbHMgPSA2CiAKLUNTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgPSB7IDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCwgOjpBQ1RfRlJPTlQsIDo6QUNUX0xGRSwgOjpBQ1RfQkFDSywgOjpBQ1RfQkFDSyB9CitDU3RyZWFtSW5mbzo6cENoYW5uZWxUeXBlID0geyA6OkFDVF9GUk9OVCwgOjpBQ1RfRlJPTlQsIDo6QUNUX0ZST05ULCA6OkFDVF9MRkUsCis6OkFDVF9CQUNLLCA6OkFDVF9CQUNLIH0KIAogQ1N0cmVhbUluZm86OnBDaGFubmVsSW5kaWNlcyA9IHsgMSwgMiwgMCwgMCwgMCwgMSB9CiAKLVNpbmNlIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIGlzIDEsIFdBViBmaWxlIGNoYW5uZWwgb3JkZXJpbmcgd2lsbCBiZSB1c2VkLiBGb3IgYSA1LjEgY2hhbm5lbAotc2NoZW1lLCB0aHVzIHRoZSBjaGFubmVscyB3b3VsZCBiZTogZnJvbnQgbGVmdCwgZnJvbnQgcmlnaHQsIGNlbnRlciwgTEZFLCBzdXJyb3VuZCBsZWZ0LCBzdXJyb3VuZCByaWdodC4KLVRodXMgdGhlIHRoaXJkIGNoYW5uZWwgaXMgdGhlIGNlbnRlciBjaGFubmVsLCByZWNlaXZpbmcgdGhlIGluZGV4IDAuIFRoZSBvdGhlciBmcm9udCBjaGFubmVscyBhcmUKLWZyb250IGxlZnQsIGZyb250IHJpZ2h0IGJlaW5nIHBsYWNlZCBhcyBmaXJzdCBhbmQgc2Vjb25kIGNoYW5uZWxzIHdpdGggaW5kaWNlcyAxIGFuZCAyIGNvcnJlc3BvbmRpbmdseS4KLVRoZXJlIGlzIG9ubHkgb25lIExGRSwgcGxhY2VkIGFzIHRoZSBmb3VydGggY2hhbm5lbCBhbmQgaW5kZXggMC4gRmluYWxseSBib3RoIHN1cnJvdW5kCi1jaGFubmVscyBnZXQgdGhlIHR5cGUgZGVmaW5pdGlvbiBBQ1RfQkFDSywgYW5kIHRoZSBpbmRpY2VzIDAgYW5kIDEuCitTaW5jZSA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyBpcyAxLCBXQVYgZmlsZSBjaGFubmVsIG9yZGVyaW5nIHdpbGwgYmUKK3VzZWQuIEZvciBhIDUuMSBjaGFubmVsIHNjaGVtZSwgdGh1cyB0aGUgY2hhbm5lbHMgd291bGQgYmU6IGZyb250IGxlZnQsIGZyb250CityaWdodCwgY2VudGVyLCBMRkUsIHN1cnJvdW5kIGxlZnQsIHN1cnJvdW5kIHJpZ2h0LiBUaHVzIHRoZSB0aGlyZCBjaGFubmVsIGlzIHRoZQorY2VudGVyIGNoYW5uZWwsIHJlY2VpdmluZyB0aGUgaW5kZXggMC4gVGhlIG90aGVyIGZyb250IGNoYW5uZWxzIGFyZSBmcm9udCBsZWZ0LAorZnJvbnQgcmlnaHQgYmVpbmcgcGxhY2VkIGFzIGZpcnN0IGFuZCBzZWNvbmQgY2hhbm5lbHMgd2l0aCBpbmRpY2VzIDEgYW5kIDIKK2NvcnJlc3BvbmRpbmdseS4gVGhlcmUgaXMgb25seSBvbmUgTEZFLCBwbGFjZWQgYXMgdGhlIGZvdXJ0aCBjaGFubmVsIGFuZCBpbmRleAorMC4gRmluYWxseSBib3RoIHN1cnJvdW5kIGNoYW5uZWxzIGdldCB0aGUgdHlwZSBkZWZpbml0aW9uIEFDVF9CQUNLLCBhbmQgdGhlCitpbmRpY2VzIDAgYW5kIDEuCiAKLVNpbmNlIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgaXMgc2V0IHRvIDEsIHRoZSBhdWRpbyBjaGFubmVscyB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgotYXMgZm9sbG93czoKK1RoZSBvdXRwdXQgYnVmZmVyIHdpbGwgYmUgZm9ybWF0dGVkIGFzIGZvbGxvd3M6CiAKIFx2ZXJiYXRpbQogPGZyb250IGxlZnQgc2FtcGxlIDA+IDxmcm9udCByaWdodCBzYW1wbGUgMD4KQEAgLTMxMywxMyArNDI1LDE0IEBACiAKIFxzdWJzZWN0aW9uIEV4YW1wbGVzQXJpYiBBUklCIGNvZGluZyBtb2RlIDIvMQogCi1JbiBjYXNlIG9mIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgc2V0IHRvIDEgYW5kIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIHNldCB0byAxLAotaW4gY2FzZSBvZiBhIEFSSUIgYml0IHN0cmVhbSB1c2luZyBjb2RpbmcgbW9kZSAyLzEgYXMgZGVzY3JpYmVkIGluIEFSSUIgU1RELUIzMiBQYXJ0IDIgVmVyc2lvbiAyLjEtRTEsIHBhZ2UgNjEsCi13b3VsZCBsZWFkIHRvIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIENTdHJlYW1JbmZvOgorSW4gY2FzZSBvZiA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyBzZXQgdG8gMSwKK2luIGNhc2Ugb2YgYSBBUklCIGJpdCBzdHJlYW0gdXNpbmcgY29kaW5nIG1vZGUgMi8xIGFzIGRlc2NyaWJlZCBpbiBBUklCIFNURC1CMzIKK1BhcnQgMiBWZXJzaW9uIDIuMS1FMSwgcGFnZSA2MSwgd291bGQgbGVhZCB0byB0aGUgZm9sbG93aW5nIHZhbHVlcyBpbgorQ1N0cmVhbUluZm86CiAKIENTdHJlYW1JbmZvOjpudW1DaGFubmVscyA9IDMKIAotQ1N0cmVhbUluZm86OnBDaGFubmVsVHlwZSA9IHsgOjpBQ1RfRlJPTlQsIDo6QUNUX0ZST05ULDo6IEFDVF9CQUNLIH0KK0NTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgPSB7IDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCwgOjpBQ1RfQkFDSyB9CiAKIENTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMgPSB7IDAsIDEsIDAgfQogCkBAIC0zNDAsMjYwICs0NTMsNDUxIEBACiAKICovCiAKLSNpZm5kZWYgQUFDREVDT0RFUl9MSUJfSAotI2RlZmluZSBBQUNERUNPREVSX0xJQl9ICi0KICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKICNpbmNsdWRlICJGREtfYXVkaW8uaCIKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCi0KIC8qKgogICogXGJyaWVmICBBQUMgZGVjb2RlciBlcnJvciBjb2Rlcy4KICAqLwogdHlwZWRlZiBlbnVtIHsKLSAgQUFDX0RFQ19PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAsICAvKiE8IE5vIGVycm9yIG9jY3VyZWQuIE91dHB1dCBidWZmZXIgaXMgdmFsaWQgYW5kIGVycm9yIGZyZWUuICovCi0gIEFBQ19ERUNfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgLyohPCBIZWFwIHJldHVybmVkIE5VTEwgcG9pbnRlci4gT3V0cHV0IGJ1ZmZlciBpcyBpbnZhbGlkLiAqLwotICBBQUNfREVDX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNSwgIC8qITwgRXJyb3IgY29uZGl0aW9uIGlzIG9mIHVua25vd24gcmVhc29uLCBvciBmcm9tIGEgYW5vdGhlciBtb2R1bGUuIE91dHB1dCBidWZmZXIgaXMgaW52YWxpZC4gKi8KKyAgQUFDX0RFQ19PSyA9CisgICAgICAweDAwMDAsIC8qITwgTm8gZXJyb3Igb2NjdXJyZWQuIE91dHB1dCBidWZmZXIgaXMgdmFsaWQgYW5kIGVycm9yIGZyZWUuICovCisgIEFBQ19ERUNfT1VUX09GX01FTU9SWSA9CisgICAgICAweDAwMDIsIC8qITwgSGVhcCByZXR1cm5lZCBOVUxMIHBvaW50ZXIuIE91dHB1dCBidWZmZXIgaXMgaW52YWxpZC4gKi8KKyAgQUFDX0RFQ19VTktOT1dOID0KKyAgICAgIDB4MDAwNSwgLyohPCBFcnJvciBjb25kaXRpb24gaXMgb2YgdW5rbm93biByZWFzb24sIG9yIGZyb20gYSBhbm90aGVyCisgICAgICAgICAgICAgICAgIG1vZHVsZS4gT3V0cHV0IGJ1ZmZlciBpcyBpbnZhbGlkLiAqLwogCiAgIC8qIFN5bmNocm9uaXphdGlvbiBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgaW52YWxpZC4gKi8KLSAgYWFjX2RlY19zeW5jX2Vycm9yX3N0YXJ0ICAgICAgICAgICAgICAgPSAweDEwMDAsCi0gIEFBQ19ERUNfVFJBTlNQT1JUX1NZTkNfRVJST1IgICAgICAgICAgID0gMHgxMDAxLCAgLyohPCBUaGUgdHJhbnNwb3J0IGRlY29kZXIgaGFkIHN5bmNyb25pc2F0aW9uIHByb2JsZW1zLiBEbyBub3QgZXhpdCBkZWNvZGluZy4gSnVzdCBmZWVkIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtIGRhdGEuICovCi0gIEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTICAgICAgICAgICAgICAgID0gMHgxMDAyLCAgLyohPCBUaGUgaW5wdXQgYnVmZmVyIHJhbiBvdXQgb2YgYml0cy4gKi8KLSAgYWFjX2RlY19zeW5jX2Vycm9yX2VuZCAgICAgICAgICAgICAgICAgPSAweDFGRkYsCisgIGFhY19kZWNfc3luY19lcnJvcl9zdGFydCA9IDB4MTAwMCwKKyAgQUFDX0RFQ19UUkFOU1BPUlRfU1lOQ19FUlJPUiA9IDB4MTAwMSwgLyohPCBUaGUgdHJhbnNwb3J0IGRlY29kZXIgaGFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiBwcm9ibGVtcy4gRG8gbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgZGVjb2RpbmcuIEp1c3QgZmVlZCBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gZGF0YS4gKi8KKyAgQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFMgPSAweDEwMDIsIC8qITwgVGhlIGlucHV0IGJ1ZmZlciByYW4gb3V0IG9mIGJpdHMuICovCisgIGFhY19kZWNfc3luY19lcnJvcl9lbmQgPSAweDFGRkYsCiAKICAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIGludmFsaWQuICovCi0gIGFhY19kZWNfaW5pdF9lcnJvcl9zdGFydCAgICAgICAgICAgICAgID0gMHgyMDAwLAotICBBQUNfREVDX0lOVkFMSURfSEFORExFICAgICAgICAgICAgICAgICA9IDB4MjAwMSwgIC8qITwgVGhlIGhhbmRsZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQgKE5VTEwpLiAqLwotICBBQUNfREVDX1VOU1VQUE9SVEVEX0FPVCAgICAgICAgICAgICAgICA9IDB4MjAwMiwgIC8qITwgVGhlIEFPVCBmb3VuZCBpbiB0aGUgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAqLwotICBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVCAgICAgICAgICAgICA9IDB4MjAwMywgIC8qITwgVGhlIGJpdHN0cmVhbSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gICovCi0gIEFBQ19ERUNfVU5TVVBQT1JURURfRVJfRk9STUFUICAgICAgICAgID0gMHgyMDA0LCAgLyohPCBUaGUgZXJyb3IgcmVzaWxpZW5jZSB0b29sIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLwotICBBQUNfREVDX1VOU1VQUE9SVEVEX0VQQ09ORklHICAgICAgICAgICA9IDB4MjAwNSwgIC8qITwgVGhlIGVycm9yIHByb3RlY3Rpb24gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCi0gIEFBQ19ERUNfVU5TVVBQT1JURURfTVVMVElMQVlFUiAgICAgICAgID0gMHgyMDA2LCAgLyohPCBNb3JlIHRoYW4gb25lIGxheWVyIGZvciBBQUMgc2NhbGFibGUgaXMgbm90IHN1cHBvcnRlZC4gKi8KLSAgQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHICAgICAgPSAweDIwMDcsICAvKiE8IFRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKGVpdGhlciBudW1iZXIgb3IgYXJyYW5nZW1lbnQpIGlzIG5vdCBzdXBwb3J0ZWQuICovCi0gIEFBQ19ERUNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFICAgICAgID0gMHgyMDA4LCAgLyohPCBUaGUgc2FtcGxlIHJhdGUgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCi0gIEFBQ19ERUNfSU5WQUxJRF9TQlJfQ09ORklHICAgICAgICAgICAgID0gMHgyMDA5LCAgLyohPCBUaGUgU0JSIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4gKi8KLSAgQUFDX0RFQ19TRVRfUEFSQU1fRkFJTCAgICAgICAgICAgICAgICAgPSAweDIwMEEsICAvKiE8IFRoZSBwYXJhbWV0ZXIgY291bGQgbm90IGJlIHNldC4gRWl0aGVyIHRoZSB2YWx1ZSB3YXMgb3V0IG9mIHJhbmdlIG9yIHRoZSBwYXJhbWV0ZXIgZG9lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGV4aXN0LiAqLwotICBBQUNfREVDX05FRURfVE9fUkVTVEFSVCAgICAgICAgICAgICAgICA9IDB4MjAwQiwgIC8qITwgVGhlIGRlY29kZXIgbmVlZHMgdG8gYmUgcmVzdGFydGVkLCBzaW5jZSB0aGUgcmVxdWllcmVkIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNhbm5vdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiAqLwotICBBQUNfREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMICAgICAgICA9IDB4MjAwQywgIC8qITwgVGhlIHByb3ZpZGVkIG91dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsLiAqLwotICBhYWNfZGVjX2luaXRfZXJyb3JfZW5kICAgICAgICAgICAgICAgICA9IDB4MkZGRiwKKyAgYWFjX2RlY19pbml0X2Vycm9yX3N0YXJ0ID0gMHgyMDAwLAorICBBQUNfREVDX0lOVkFMSURfSEFORExFID0KKyAgICAgIDB4MjAwMSwgLyohPCBUaGUgaGFuZGxlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gY2FsbCB3YXMgaW52YWxpZCAoTlVMTCkuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfQU9UID0KKyAgICAgIDB4MjAwMiwgLyohPCBUaGUgQU9UIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUID0KKyAgICAgIDB4MjAwMywgLyohPCBUaGUgYml0c3RyZWFtIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAgKi8KKyAgQUFDX0RFQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQgPQorICAgICAgMHgyMDA0LCAvKiE8IFRoZSBlcnJvciByZXNpbGllbmNlIHRvb2wgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfRVBDT05GSUcgPQorICAgICAgMHgyMDA1LCAvKiE8IFRoZSBlcnJvciBwcm90ZWN0aW9uIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX01VTFRJTEFZRVIgPQorICAgICAgMHgyMDA2LCAvKiE8IE1vcmUgdGhhbiBvbmUgbGF5ZXIgZm9yIEFBQyBzY2FsYWJsZSBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUcgPQorICAgICAgMHgyMDA3LCAvKiE8IFRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKGVpdGhlciBudW1iZXIgb3IgYXJyYW5nZW1lbnQpIGlzCisgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFID0gMHgyMDA4LCAvKiE8IFRoZSBzYW1wbGUgcmF0ZSBzcGVjaWZpZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLiAqLworICBBQUNfREVDX0lOVkFMSURfU0JSX0NPTkZJRyA9CisgICAgICAweDIwMDksIC8qITwgVGhlIFNCUiBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUwgPSAweDIwMEEsICAvKiE8IFRoZSBwYXJhbWV0ZXIgY291bGQgbm90IGJlIHNldC4gRWl0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgd2FzIG91dCBvZiByYW5nZSBvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBkb2VzICBub3QgZXhpc3QuICovCisgIEFBQ19ERUNfTkVFRF9UT19SRVNUQVJUID0gMHgyMDBCLCAvKiE8IFRoZSBkZWNvZGVyIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmNlIHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fubm90IGJlIHBlcmZvcm1lZC4gKi8KKyAgQUFDX0RFQ19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCA9CisgICAgICAweDIwMEMsIC8qITwgVGhlIHByb3ZpZGVkIG91dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsLiAqLworICBhYWNfZGVjX2luaXRfZXJyb3JfZW5kID0gMHgyRkZGLAogCiAgIC8qIERlY29kZSBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgdmFsaWQgYnV0IGNvbmNlYWxlZC4gKi8KLSAgYWFjX2RlY19kZWNvZGVfZXJyb3Jfc3RhcnQgICAgICAgICAgICAgPSAweDQwMDAsCi0gIEFBQ19ERUNfVFJBTlNQT1JUX0VSUk9SICAgICAgICAgICAgICAgID0gMHg0MDAxLCAgLyohPCBUaGUgdHJhbnNwb3J0IGRlY29kZXIgZW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBlcnJvci4gKi8KLSAgQUFDX0RFQ19QQVJTRV9FUlJPUiAgICAgICAgICAgICAgICAgICAgPSAweDQwMDIsICAvKiE8IEVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIGJpdHN0cmVhbS4gTW9zdCBwcm9iYWJseSBpdCBpcyBjb3JydXB0ZWQsIG9yIHRoZSBzeXN0ZW0gY3Jhc2hlZC4gKi8KLSAgQUFDX0RFQ19VTlNVUFBPUlRFRF9FWFRFTlNJT05fUEFZTE9BRCAgPSAweDQwMDMsICAvKiE8IEVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIGV4dGVuc2lvbiBwYXlsb2FkIG9mIHRoZSBiaXRzdHJlYW0uIFRoZSBleHRlbnNpb24gcGF5bG9hZCB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCBpcyBub3Qgc3VwcG9ydGVkLiAqLwotICBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUiAgICAgICAgICAgICA9IDB4NDAwNCwgIC8qITwgVGhlIHBhcnNlZCBiaXRzdHJlYW0gdmFsdWUgaXMgb3V0IG9mIHJhbmdlLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzeXN0ZW0gY3Jhc2hlZC4gKi8KLSAgQUFDX0RFQ19DUkNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDUsICAvKiE8IFRoZSBlbWJlZGRlZCBDUkMgZGlkIG5vdCBtYXRjaC4gKi8KLSAgQUFDX0RFQ19JTlZBTElEX0NPREVfQk9PSyAgICAgICAgICAgICAgPSAweDQwMDYsICAvKiE8IEFuIGludmFsaWQgY29kZWJvb2sgd2FzIHNpZ25hbGxlZC4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXNoZWQuICovCi0gIEFBQ19ERUNfVU5TVVBQT1JURURfUFJFRElDVElPTiAgICAgICAgID0gMHg0MDA3LCAgLyohPCBQcmVkaWN0b3IgZm91bmQsIGJ1dCBub3Qgc3VwcG9ydGVkIGluIHRoZSBBQUMgTG93IENvbXBsZXhpdHkgcHJvZmlsZS4gTW9zdCBwcm9iYWJseSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvciBoYXMgYSB3cm9uZyBmb3JtYXQuICovCi0gIEFBQ19ERUNfVU5TVVBQT1JURURfQ0NFICAgICAgICAgICAgICAgID0gMHg0MDA4LCAgLyohPCBBIENDRSBlbGVtZW50IHdhcyBmb3VuZCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhIHdyb25nIGZvcm1hdC4gKi8KLSAgQUFDX0RFQ19VTlNVUFBPUlRFRF9MRkUgICAgICAgICAgICAgICAgPSAweDQwMDksICAvKiE8IEEgTEZFIGVsZW1lbnQgd2FzIGZvdW5kIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGEgd3JvbmcgZm9ybWF0LiAqLwotICBBQUNfREVDX1VOU1VQUE9SVEVEX0dBSU5fQ09OVFJPTF9EQVRBICA9IDB4NDAwQSwgIC8qITwgR2FpbiBjb250cm9sIGRhdGEgZm91bmQgYnV0IG5vdCBzdXBwb3J0ZWQuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvciBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgd3JvbmcgZm9ybWF0LiAqLwotICBBQUNfREVDX1VOU1VQUE9SVEVEX1NCQSAgICAgICAgICAgICAgICA9IDB4NDAwQiwgIC8qITwgU0JBIGZvdW5kLCBidXQgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEJTQUMgcHJvZmlsZS4gKi8KLSAgQUFDX0RFQ19UTlNfUkVBRF9FUlJPUiAgICAgICAgICAgICAgICAgPSAweDQwMEMsICAvKiE8IEVycm9yIHdoaWxlIHJlYWRpbmcgVE5TIGRhdGEuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0IG9yIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXNoZWQuICovCi0gIEFBQ19ERUNfUlZMQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgID0gMHg0MDBELCAgLyohPCBFcnJvciB3aGlsZSBkZWNvZGluZyBlcnJvciByZXNpbGxpZW50IGRhdGEuICovCi0gIGFhY19kZWNfZGVjb2RlX2Vycm9yX2VuZCAgICAgICAgICAgICAgID0gMHg0RkZGLAotCisgIGFhY19kZWNfZGVjb2RlX2Vycm9yX3N0YXJ0ID0gMHg0MDAwLAorICBBQUNfREVDX1RSQU5TUE9SVF9FUlJPUiA9CisgICAgICAweDQwMDEsIC8qITwgVGhlIHRyYW5zcG9ydCBkZWNvZGVyIGVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgZXJyb3IuICovCisgIEFBQ19ERUNfUEFSU0VfRVJST1IgPSAweDQwMDIsIC8qITwgRXJyb3Igd2hpbGUgcGFyc2luZyB0aGUgYml0c3RyZWFtLiBNb3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JhYmx5IGl0IGlzIGNvcnJ1cHRlZCwgb3IgdGhlIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmFzaGVkLiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX0VYVEVOU0lPTl9QQVlMT0FEID0KKyAgICAgIDB4NDAwMywgLyohPCBFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBleHRlbnNpb24gcGF5bG9hZCBvZiB0aGUgYml0c3RyZWFtLgorICAgICAgICAgICAgICAgICBUaGUgZXh0ZW5zaW9uIHBheWxvYWQgdHlwZSBmb3VuZCBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUiA9IDB4NDAwNCwgLyohPCBUaGUgcGFyc2VkIGJpdHN0cmVhbSB2YWx1ZSBpcyBvdXQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJ1cHQsIG9yIHRoZSBzeXN0ZW0gY3Jhc2hlZC4gKi8KKyAgQUFDX0RFQ19DUkNfRVJST1IgPSAweDQwMDUsICAgICAgICAgIC8qITwgVGhlIGVtYmVkZGVkIENSQyBkaWQgbm90IG1hdGNoLiAqLworICBBQUNfREVDX0lOVkFMSURfQ09ERV9CT09LID0gMHg0MDA2LCAgLyohPCBBbiBpbnZhbGlkIGNvZGVib29rIHdhcyBzaWduYWxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIHN5c3RlbSAgY3Jhc2hlZC4gKi8KKyAgQUFDX0RFQ19VTlNVUFBPUlRFRF9QUkVESUNUSU9OID0KKyAgICAgIDB4NDAwNywgLyohPCBQcmVkaWN0b3IgZm91bmQsIGJ1dCBub3Qgc3VwcG9ydGVkIGluIHRoZSBBQUMgTG93IENvbXBsZXhpdHkKKyAgICAgICAgICAgICAgICAgcHJvZmlsZS4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yIGhhcyBhIHdyb25nCisgICAgICAgICAgICAgICAgIGZvcm1hdC4gKi8KKyAgQUFDX0RFQ19VTlNVUFBPUlRFRF9DQ0UgPSAweDQwMDgsIC8qITwgQSBDQ0UgZWxlbWVudCB3YXMgZm91bmQgd2hpY2ggaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycnVwdCwgb3IgaGFzIGEgd3JvbmcgZm9ybWF0LiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX0xGRSA9IDB4NDAwOSwgLyohPCBBIExGRSBlbGVtZW50IHdhcyBmb3VuZCB3aGljaCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZC4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JydXB0LCBvciBoYXMgYSB3cm9uZyBmb3JtYXQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfR0FJTl9DT05UUk9MX0RBVEEgPQorICAgICAgMHg0MDBBLCAvKiE8IEdhaW4gY29udHJvbCBkYXRhIGZvdW5kIGJ1dCBub3Qgc3VwcG9ydGVkLiBNb3N0IHByb2JhYmx5IHRoZQorICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IgaGFzIGEgd3JvbmcgZm9ybWF0LiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX1NCQSA9CisgICAgICAweDQwMEIsIC8qITwgU0JBIGZvdW5kLCBidXQgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEJTQUMgcHJvZmlsZS4KKyAgICAgICAgICAgICAgICovCisgIEFBQ19ERUNfVE5TX1JFQURfRVJST1IgPSAweDQwMEMsIC8qITwgRXJyb3Igd2hpbGUgcmVhZGluZyBUTlMgZGF0YS4gTW9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQgb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBjcmFzaGVkLiAqLworICBBQUNfREVDX1JWTENfRVJST1IgPQorICAgICAgMHg0MDBELCAvKiE8IEVycm9yIHdoaWxlIGRlY29kaW5nIGVycm9yIHJlc2lsaWVudCBkYXRhLiAqLworICBhYWNfZGVjX2RlY29kZV9lcnJvcl9lbmQgPSAweDRGRkYsCiAgIC8qIEFuY2lsbGFyeSBkYXRhIGVycm9ycy4gT3V0cHV0IGJ1ZmZlciBpcyB2YWxpZC4gKi8KLSAgYWFjX2RlY19hbmNfZGF0YV9lcnJvcl9zdGFydCAgICAgICAgICAgPSAweDgwMDAsCi0gIEFBQ19ERUNfQU5DX0RBVEFfRVJST1IgICAgICAgICAgICAgICAgID0gMHg4MDAxLCAgLyohPCBOb24gc2V2ZXJlIGVycm9yIGNvbmNlcm5pbmcgdGhlIGFuY2lsbGFyeSBkYXRhIGhhbmRsaW5nLiAqLwotICBBQUNfREVDX1RPT19TTUFMTF9BTkNfQlVGRkVSICAgICAgICAgICA9IDB4ODAwMiwgIC8qITwgVGhlIHJlZ2lzdGVyZWQgYW5jaWxsYXJ5IGRhdGEgYnVmZmVyIGlzIHRvbyBzbWFsbCB0byByZWNlaXZlIHRoZSBwYXJzZWQgZGF0YS4gKi8KLSAgQUFDX0RFQ19UT09fTUFOWV9BTkNfRUxFTUVOVFMgICAgICAgICAgPSAweDgwMDMsICAvKiE8IE1vcmUgdGhhbiB0aGUgYWxsb3dlZCBudW1iZXIgb2YgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudHMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYnVmZmVyLiAqLwotICBhYWNfZGVjX2FuY19kYXRhX2Vycm9yX2VuZCAgICAgICAgICAgICA9IDB4OEZGRgotCisgIGFhY19kZWNfYW5jX2RhdGFfZXJyb3Jfc3RhcnQgPSAweDgwMDAsCisgIEFBQ19ERUNfQU5DX0RBVEFfRVJST1IgPQorICAgICAgMHg4MDAxLCAvKiE8IE5vbiBzZXZlcmUgZXJyb3IgY29uY2VybmluZyB0aGUgYW5jaWxsYXJ5IGRhdGEgaGFuZGxpbmcuICovCisgIEFBQ19ERUNfVE9PX1NNQUxMX0FOQ19CVUZGRVIgPSAweDgwMDIsICAvKiE8IFRoZSByZWdpc3RlcmVkIGFuY2lsbGFyeSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaXMgdG9vIHNtYWxsIHRvIHJlY2VpdmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgZGF0YS4gKi8KKyAgQUFDX0RFQ19UT09fTUFOWV9BTkNfRUxFTUVOVFMgPSAweDgwMDMsIC8qITwgTW9yZSB0aGFuIHRoZSBhbGxvd2VkIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudHMgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuIHRvIGJ1ZmZlci4gKi8KKyAgYWFjX2RlY19hbmNfZGF0YV9lcnJvcl9lbmQgPSAweDhGRkYKIAogfSBBQUNfREVDT0RFUl9FUlJPUjsKIAorLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGluaXRpYWxpemF0aW9uIGVycm9ycy4gT3V0cHV0IGJ1ZmZlciBpcyBpbnZhbGlkLiAqLworI2RlZmluZSBJU19JTklUX0VSUk9SKGVycikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoZXJyKSA+PSBhYWNfZGVjX2luaXRfZXJyb3Jfc3RhcnQpICYmICgoZXJyKSA8PSBhYWNfZGVjX2luaXRfZXJyb3JfZW5kKSkgXAorICAgICAgID8gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogMCkKKy8qKiBNYWNybyB0byBpZGVudGlmeSBkZWNvZGUgZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIHZhbGlkIGJ1dCBjb25jZWFsZWQuICovCisjZGVmaW5lIElTX0RFQ09ERV9FUlJPUihlcnIpICAgICAgICAgICAgICAgICBcCisgICgoKChlcnIpID49IGFhY19kZWNfZGVjb2RlX2Vycm9yX3N0YXJ0KSAmJiBcCisgICAgKChlcnIpIDw9IGFhY19kZWNfZGVjb2RlX2Vycm9yX2VuZCkpICAgICBcCisgICAgICAgPyAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAwKQorLyoqCisgKiBNYWNybyB0byBpZGVudGlmeSBpZiB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlciBjb250YWlucyB2YWxpZCBzYW1wbGVzIGFmdGVyCisgKiBjYWxsaW5nIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKS4gT3V0cHV0IGJ1ZmZlciBpcyB2YWxpZCBidXQgY2FuIGJlCisgKiBjb25jZWFsZWQuCisgKi8KKyNkZWZpbmUgSVNfT1VUUFVUX1ZBTElEKGVycikgKCgoZXJyKSA9PSBBQUNfREVDX09LKSB8fCBJU19ERUNPREVfRVJST1IoZXJyKSkKIAotLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGluaXRpYWxpemF0aW9uIGVycm9ycy4gKi8KLSNkZWZpbmUgSVNfSU5JVF9FUlJPUihlcnIpICAgKCAoKChlcnIpPj1hYWNfZGVjX2luaXRfZXJyb3Jfc3RhcnQpICAgJiYgKChlcnIpPD1hYWNfZGVjX2luaXRfZXJyb3JfZW5kKSkgICA/IDEgOiAwKQotLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGRlY29kZSBlcnJvcnMuICovCi0jZGVmaW5lIElTX0RFQ09ERV9FUlJPUihlcnIpICggKCgoZXJyKT49YWFjX2RlY19kZWNvZGVfZXJyb3Jfc3RhcnQpICYmICgoZXJyKTw9YWFjX2RlY19kZWNvZGVfZXJyb3JfZW5kKSkgPyAxIDogMCkKLS8qKiBNYWNybyB0byBpZGVudGlmeSBpZiB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlciBjb250YWlucyB2YWxpZCBzYW1wbGVzIGFmdGVyIGNhbGxpbmcgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpLiAqLwotI2RlZmluZSBJU19PVVRQVVRfVkFMSUQoZXJyKSAoICgoZXJyKSA9PSBBQUNfREVDX09LKSB8fCBJU19ERUNPREVfRVJST1IoZXJyKSApCisvKiEgXGVudW0gIEFBQ19NRF9QUk9GSUxFCisgKiAgXGJyaWVmIFRoZSBhdmFpbGFibGUgbWV0YWRhdGEgcHJvZmlsZXMgd2hpY2ggYXJlIG1vc3RseSByZWxhdGVkIHRvIGRvd25taXhpbmcuIFRoZSB2YWx1ZXMgZGVmaW5lIHRoZSBhcmd1bWVudHMKKyAqICAgICAgICAgZm9yIHRoZSB1c2Ugd2l0aCBwYXJhbWV0ZXIgOjpBQUNfTUVUQURBVEFfUFJPRklMRS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgQUFDX01EX1BST0ZJTEVfTVBFR19TVEFOREFSRCA9CisgICAgICAwLCAvKiE8IFRoZSBzdGFuZGFyZCBwcm9maWxlIGNyZWF0ZXMgYSBtaXhkb3duIHNpZ25hbCBiYXNlZCBvbiB0aGUKKyAgICAgICAgICAgIGFkdmFuY2VkIGRvd25taXggbWV0YWRhdGEgKGZyb20gYSBEU0UpLiBUaGUgZXF1YXRpb25zIGFuZCBkZWZhdWx0CisgICAgICAgICAgICB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gSVNPL0lFQyAxNDQ5NjozIEFtbWVuZG1lbnQgNC4gQW55IG90aGVyCisgICAgICAgICAgICAobGVnYWN5KSBkb3dubWl4IG1ldGFkYXRhIHdpbGwgYmUgaWdub3JlZC4gTm8gb3RoZXIgcGFyYW1ldGVyIHdpbGwKKyAgICAgICAgICAgIGJlIG1vZGlmaWVkLiAgICAgICAgICovCisgIEFBQ19NRF9QUk9GSUxFX01QRUdfTEVHQUNZID0KKyAgICAgIDEsIC8qITwgVGhpcyBwcm9maWxlIGJlaGF2ZXMgaWRlbnRpY2FsIHRvIHRoZSBzdGFuZGFyZCBwcm9maWxlIGlmIGFkdmFuY2VkCisgICAgICAgICAgICAgIGRvd25taXggbWV0YWRhdGEgKGZyb20gYSBEU0UpIGlzIGF2YWlsYWJsZS4gSWYgbm90LCB0aGUKKyAgICAgICAgICAgIG1hdHJpeF9taXhkb3duIGluZm9ybWF0aW9uIGVtYmVkZGVkIGluIHRoZSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIGVsZW1lbnQgKFBDRSkgd2lsbCBiZSBhcHBsaWVkLiBJZiBuZWl0aGVyIGlzIHRoZSBjYXNlLCB0aGUgbW9kdWxlCisgICAgICAgICAgICBjcmVhdGVzIGEgbWl4ZG93biB1c2luZyB0aGUgZGVmYXVsdCBjb2VmZmljaWVudHMgYXMgZGVmaW5lZCBpbgorICAgICAgICAgICAgSVNPL0lFQyAxNDQ5NjozIEFNRCA0LiBUaGUgcHJvZmlsZSBjYW4gYmUgdXNlZCB0byBzdXBwb3J0IGxlZ2FjeQorICAgICAgICAgICAgZGlnaXRhbCBUViAoZS5nLiBEVkIpIHN0cmVhbXMuICAgICAgICAgICAqLworICBBQUNfTURfUFJPRklMRV9NUEVHX0xFR0FDWV9QUklPID0KKyAgICAgIDIsIC8qITwgU2ltaWxhciB0byB0aGUgOjpBQUNfTURfUFJPRklMRV9NUEVHX0xFR0FDWSBwcm9maWxlIGJ1dCBpZiBib3RoCisgICAgICAgICAgICB0aGUgYWR2YW5jZWQgKElTTy9JRUMgMTQ0OTY6MyBBTUQgNCkgYW5kIHRoZSBsZWdhY3kgKFBDRSkgTVBFRworICAgICAgICAgICAgZG93bm1peCBtZXRhZGF0YSBhcmUgYXZhaWxhYmxlIHRoZSBsYXR0ZXIgd2lsbCBiZSBhcHBsaWVkLgorICAgICAgICAgICovCisgIEFBQ19NRF9QUk9GSUxFX0FSSUJfSkFQQU4gPQorICAgICAgMyAvKiE8IERvd25taXggY3JlYXRpb24gYXMgZGVzY3JpYmVkIGluIEFCTlQgTkJSIDE1NjAyLTIuIEJ1dCBpZiBhZHZhbmNlZAorICAgICAgICAgICAgIGRvd25taXggbWV0YWRhdGEgKElTTy9JRUMgMTQ0OTY6MyBBTUQgNCkgaXMgYXZhaWxhYmxlIGl0IHdpbGwgYmUKKyAgICAgICAgICAgICBwcmVmZXJyZWQgYmVjYXVzZSBvZiB0aGUgaGlnaGVyIHJlc29sdXRpb25zLiBJbiBhZGRpdGlvbiB0aGUKKyAgICAgICAgICAgbWV0YWRhdGEgZXhwaXJ5IHRpbWUgd2lsbCBiZSBzZXQgdG8gdGhlIHZhbHVlIGRlZmluZWQgaW4gdGhlIEFSSUIKKyAgICAgICAgICAgc3RhbmRhcmQgKHNlZSA6OkFBQ19NRVRBREFUQV9FWFBJUllfVElNRSkuCisgICAgICAgICAqLworfSBBQUNfTURfUFJPRklMRTsKKworLyohIFxlbnVtICBBQUNfRFJDX0RFRkFVTFRfUFJFU0VOVEFUSU9OX01PREVfT1BUSU9OUworICogIFxicmllZiBPcHRpb25zIGZvciBoYW5kbGluZyBvZiBEUkMgcGFyYW1ldGVycywgaWYgcHJlc2VudGF0aW9uIG1vZGUgaXMgbm90IGluZGljYXRlZCBpbiBiaXRzdHJlYW0KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgQUFDX0RSQ19QQVJBTUVURVJfSEFORExJTkdfRElTQUJMRUQgPSAtMSwgLyohPCBEUkMgcGFyYW1ldGVyIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkLCBhbGwgcGFyYW1ldGVycyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZCBhcyByZXF1ZXN0ZWQuICovCisgIEFBQ19EUkNfUEFSQU1FVEVSX0hBTkRMSU5HX0VOQUJMRUQgPQorICAgICAgMCwgLyohPCBBcHBseSBjaGFuZ2VzIHRvIHJlcXVlc3RlZCBEUkMgcGFyYW1ldGVycyB0byBwcmV2ZW50IGNsaXBwaW5nLiAqLworICBBQUNfRFJDX1BSRVNFTlRBVElPTl9NT0RFXzFfREVGQVVMVCA9CisgICAgICAxLCAvKiE8IFVzZSBEUkMgcHJlc2VudGF0aW9uIG1vZGUgMSBhcyBkZWZhdWx0IChlLmcuIGZvciBOb3JkaWcpICovCisgIEFBQ19EUkNfUFJFU0VOVEFUSU9OX01PREVfMl9ERUZBVUxUID0KKyAgICAgIDIgLyohPCBVc2UgRFJDIHByZXNlbnRhdGlvbiBtb2RlIDIgYXMgZGVmYXVsdCAoZS5nLiBmb3IgRFRHIERCb29rKSAqLworfSBBQUNfRFJDX0RFRkFVTFRfUFJFU0VOVEFUSU9OX01PREVfT1BUSU9OUzsKIAogLyoqCiAgKiBcYnJpZWYgQUFDIGRlY29kZXIgc2V0dGluZyBwYXJhbWV0ZXJzCiAgKi8KLXR5cGVkZWYgZW51bQotewotICBBQUNfUENNX09VVFBVVF9JTlRFUkxFQVZFRCAgICAgICAgICAgICAgPSAweDAwMDAsICAvKiE8IFBDTSBvdXRwdXQgbW9kZSAoMTogaW50ZXJsZWF2ZWQgKGRlZmF1bHQpOyAwOiBub3QgaW50ZXJsZWF2ZWQpLiAqLwotICBBQUNfUENNX0RVQUxfQ0hBTk5FTF9PVVRQVVRfTU9ERSAgICAgICAgPSAweDAwMDIsICAvKiE8IERlZmluZXMgaG93IHRoZSBkZWNvZGVyIHByb2Nlc3NlcyB0d28gY2hhbm5lbCBzaWduYWxzOiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IExlYXZlIGJvdGggc2lnbmFscyBhcyB0aGV5IGFyZSAoZGVmYXVsdCkuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgZnJvbSBjaGFubmVsIDEuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgZnJvbSBjaGFubmVsIDIuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgYnkgbWl4aW5nIGJvdGggY2hhbm5lbHMgKEwnID0gUicgPSAwLjUqQ2gxICsgMC41KkNoMikuICovCi0gIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyAgICAgICAgICA9IDB4MDAwMywgIC8qITwgT3V0cHV0IGJ1ZmZlciBjaGFubmVsIG9yZGVyaW5nLiAwOiBNUEVHIFBDRSBzdHlsZSBvcmRlciwgMTogV0FWIGZpbGUgY2hhbm5lbCBvcmRlciAoZGVmYXVsdCkuICovCi0gIEFBQ19QQ01fTElNSVRFUl9FTkFCTEUgICAgICAgICAgICAgICAgICA9IDB4MDAwNCwgIC8qITwgRW5hYmxlIHNpZ25hbCBsZXZlbCBsaW1pdGluZy4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTogQXV0by1jb25maWcuIEVuYWJsZSBsaW1pdGVyIGZvciBhbGwgbm9uLWxvd2RlbGF5IGNvbmZpZ3VyYXRpb25zIGJ5IGRlZmF1bHQuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IERpc2FibGUgbGltaXRlciBpbiBnZW5lcmFsLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBFbmFibGUgbGltaXRlciBhbHdheXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gY2FsbCB0aGUgZGVjb2RlciB3aXRoIGEgQUFDREVDX0NMUkhJU1QgZmxhZyB0byByZXNldCBhbGwgc3RhdGVzIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGltaXRlciBzd2l0Y2ggaXMgY2hhbmdlZCBleHBsaWNpdGx5LiAqLwotICBBQUNfUENNX0xJTUlURVJfQVRUQUNLX1RJTUUgICAgICAgICAgICAgPSAweDAwMDUsICAvKiE8IFNpZ25hbCBsZXZlbCBsaW1pdGluZyBhdHRhY2sgdGltZSBpbiBtcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGNvbmZndXJhdGlvbiBpcyAxNSBtcy4gQWRqdXN0YWJsZSByYW5nZSBmcm9tIDEgbXMgdG8gMTUgbXMuICovCi0gIEFBQ19QQ01fTElNSVRFUl9SRUxFQVNfVElNRSAgICAgICAgICAgICA9IDB4MDAwNiwgIC8qITwgU2lnbmFsIGxldmVsIGxpbWl0aW5nIHJlbGVhc2UgdGltZSBpbiBtcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgNTAgbXMuIEFkanVzdGFibGUgdGltZSBtdXN0IGJlIGxhcmdlciB0aGFuIDAgbXMuICovCi0gIEFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUyAgICAgICAgICAgICA9IDB4MDAxMSwgIC8qITwgTWluaW11bSBudW1iZXIgb2YgUENNIG91dHB1dCBjaGFubmVscy4gSWYgaGlnaGVyIHRoYW4gdGhlIG51bWJlciBvZiBlbmNvZGVkIGF1ZGlvIGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc2ltcGxlIGNoYW5uZWwgZXh0ZW5zaW9uIGlzIGFwcGxpZWQuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDA6IERpc2FibGUgY2hhbm5lbCBleHRlbnN0aW9uIGZlYXR1cmUuIFRoZSBkZWNvZGVyIG91dHB1dCBjb250YWlucyB0aGUgc2FtZSBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgYXMgdGhlIGVuY29kZWQgYml0c3RyZWFtLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiAgICBUaGlzIHZhbHVlIGlzIGN1cnJlbnRseSBuZWVkZWQgb25seSB0b2dldGhlciB3aXRoIHRoZSBtaXgtZG93biBmZWF0dXJlLiBTZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMgYW5kIG5vdGUgMiBiZWxvdy4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogICAgRW5jb2RlZCBtb25vIHNpZ25hbHMgd2lsbCBiZSBkdXBsaWNhdGVkIHRvIGFjaGlldmUgYSAyLzAvMC4wIGNoYW5uZWwgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY6ICAgIFRoZSBkZWNvZGVyIHRyeXMgdG8gcmVvcmRlciBlbmNvZGVkIHNpZ25hbHMgd2l0aCBsZXNzIHRoYW4gc2l4IGNoYW5uZWxzIHRvIGFjaGlldmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAzLzAvMi4xIGNoYW5uZWwgb3V0cHV0IHNpZ25hbC4gTWlzc2luZyBjaGFubmVscyB3aWxsIGJlIGZpbGxlZCB3aXRoIGEgemVybyBzaWduYWwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHJlb3JkZXJpbmcgaXMgbm90IHBvc3NpYmxlIHRoZSBlbXB0eSBjaGFubmVscyB3aWxsIHNpbXBseSBiZSBhcHBlbmRlZC4gT25seQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgaWYgaW5zdGFuY2UgaXMgY29uZmlndXJlZCB0byBzdXBwb3J0IG11bHRpY2hhbm5lbCBvdXRwdXQuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg6ICAgIFRoZSBkZWNvZGVyIHRyeXMgdG8gcmVvcmRlciBlbmNvZGVkIHNpZ25hbHMgd2l0aCBsZXNzIHRoYW4gZWlnaHQgY2hhbm5lbHMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNoaWV2ZSBhIDMvMC80LjEgY2hhbm5lbCBvdXRwdXQgc2lnbmFsLiBNaXNzaW5nIGNoYW5uZWxzIHdpbGwgYmUgZmlsbGVkIHdpdGggYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvIHNpZ25hbC4gSWYgcmVvcmRlcmluZyBpcyBub3QgcG9zc2libGUgdGhlIGVtcHR5IGNoYW5uZWxzIHdpbGwgc2ltcGx5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGVkLiBPbmx5IGF2YWlsYWJsZSBpZiBpbnN0YW5jZSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgbXVsdGljaGFubmVsIG91dHB1dC5cbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiBUaGUgY2hhbm5lbCBzaWduYWxsaW5nIChDU3RyZWFtSW5mbzo6cENoYW5uZWxUeXBlIGFuZCBDU3RyZWFtSW5mbzo6cENoYW5uZWxJbmRpY2VzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgbW9kaWZpZWQuIEFkZGVkIGVtcHR5IGNoYW5uZWxzIHdpbGwgYmUgc2lnbmFsbGVkIHdpdGggY2hhbm5lbCB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEU6OkFDVF9OT05FLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gSWYgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhhdCBvZiA6OkFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUyBib3RoIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZS4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuIFRoaXMgcGFyYW1ldGVyIGRvZXMgbm90IGFmZmVjdCBNUEVHIFN1cnJvdW5kIHByb2Nlc3NpbmcuICovCi0gIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUyAgICAgICAgICAgICA9IDB4MDAxMiwgIC8qITwgTWF4aW11bSBudW1iZXIgb2YgUENNIG91dHB1dCBjaGFubmVscy4gSWYgbG93ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peGluZyBpcyBhcHBsaWVkIGFjY29yZGluZ2x5LiBJZiBkZWRpY2F0ZWQgbWV0YWRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSBzdHJlYW0gaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgdG8gYWNoaWV2ZSBiZXR0ZXIgbWl4aW5nIHJlc3VsdHMuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDA6IERpc2FibGUgZG93bm1peGluZyBmZWF0dXJlLiBUaGUgZGVjb2RlciBvdXRwdXQgY29udGFpbnMgdGhlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSBlbmNvZGVkIGJpdHN0cmVhbS4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogICAgQWxsIGVuY29kZWQgYXVkaW8gY29uZmlndXJhdGlvbnMgd2l0aCBtb3JlIHRoYW4gb25lIGNoYW5uZWwgd2lsbCBiZSBtaXhlZCBkb3duIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBtb25vIG91dHB1dCBzaWduYWwuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6ICAgIFRoZSBkZWNvZGVyIHBlcmZvcm1zIGEgc3RlcmVvIG1peC1kb3duIGlmIHRoZSBudW1iZXIgZW5jb2RlZCBhdWRpbyBjaGFubmVscyBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gdHdvLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OiAgICBJZiB0aGUgbnVtYmVyIG9mIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMgaXMgZ3JlYXRlciB0aGFuIHNpeCB0aGUgZGVjb2RlciBwZXJmb3JtcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC1kb3duIHRvIG1lZXQgdGhlIHRhcmdldCBvdXRwdXQgY29uZmlndXJhdGlvbiBvZiAzLzAvMi4xIGNoYW5uZWxzLiBPbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBpZiBpbnN0YW5jZSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgbXVsdGljaGFubmVsIG91dHB1dC4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODogICAgVGhpcyB2YWx1ZSBpcyBjdXJyZW50bHkgbmVlZGVkIG9ubHkgdG9nZXRoZXIgd2l0aCB0aGUgY2hhbm5lbCBleHRlbnNpb24gZmVhdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIDo6QUFDX1BDTV9NSU5fT1VUUFVUX0NIQU5ORUxTIGFuZCBub3RlIDIgYmVsb3cuIE9ubHkgYXZhaWxhYmxlIGlmIGluc3RhbmNlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtdWx0aWNoYW5uZWwgb3V0cHV0LiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiBEb3duLW1peGluZyBvZiBhbnkgc2V2ZW4gb3IgZWlnaHQgY2hhbm5lbCBjb25maWd1cmF0aW9uIG5vdCBkZWZpbmVkIGluIElTTy9JRUMgMTQ0OTYtMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERBTSA0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBzb2Z0d2FyZSB2ZXJzaW9uLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gSWYgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gemVybyBidXQgc21hbGxlciB0aGFuIDo6QUFDX1BDTV9NSU5fT1VUUFVUX0NIQU5ORUxTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoIHdpbGwgYmUgc2V0IHRvIHNhbWUgdmFsdWUuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLiBUaGUgb3BlcmF0aW5nIG1vZGUgb2YgdGhlIE1QRUcgU3Vycm91bmQgbW9kdWxlIHdpbGwgYmUgc2V0IGFjY29yZGluZ2x5LiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4gU2V0dGluZyB0aGlzIHBhcmFtIHdpdGggYW55IHZhbHVlIHdpbGwgZGlzYWJsZSB0aGUgYmluYXVyYWwgcHJvY2Vzc2luZyBvZiB0aGUgTVBFRwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vycm91bmQgbW9kdWxlICg6OkFBQ19NUEVHU19CSU5BVVJBTF9FTkFCTEU9MCkuICovCit0eXBlZGVmIGVudW0geworICBBQUNfUENNX0RVQUxfQ0hBTk5FTF9PVVRQVVRfTU9ERSA9CisgICAgICAweDAwMDIsIC8qITwgRGVmaW5lcyBob3cgdGhlIGRlY29kZXIgcHJvY2Vzc2VzIHR3byBjaGFubmVsIHNpZ25hbHM6IFxuCisgICAgICAgICAgICAgICAgICAgMDogTGVhdmUgYm90aCBzaWduYWxzIGFzIHRoZXkgYXJlIChkZWZhdWx0KS4gXG4KKyAgICAgICAgICAgICAgICAgICAxOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMS4gXG4KKyAgICAgICAgICAgICAgICAgICAyOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMi4gXG4KKyAgICAgICAgICAgICAgICAgICAzOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBieSBtaXhpbmcgYm90aCBjaGFubmVscworICAgICAgICAgICAgICAgICAoTCcgPSBSJyA9IDAuNSpDaDEgKyAwLjUqQ2gyKS4gKi8KKyAgQUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HID0KKyAgICAgIDB4MDAwMywgLyohPCBPdXRwdXQgYnVmZmVyIGNoYW5uZWwgb3JkZXJpbmcuIDA6IE1QRUcgUENFIHN0eWxlIG9yZGVyLCAxOgorICAgICAgICAgICAgICAgICBXQVYgZmlsZSBjaGFubmVsIG9yZGVyIChkZWZhdWx0KS4gKi8KKyAgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRSA9CisgICAgICAweDAwMDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgc2lnbmFsIGxldmVsIGxpbWl0aW5nLiBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE6IEF1dG8tY29uZmlnLiBFbmFibGUgbGltaXRlciBmb3IgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLWxvd2RlbGF5IGNvbmZpZ3VyYXRpb25zIGJ5IGRlZmF1bHQuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogRGlzYWJsZSBsaW1pdGVyIGluIGdlbmVyYWwuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogRW5hYmxlIGxpbWl0ZXIgYWx3YXlzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gY2FsbCB0aGUgZGVjb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBBQUNERUNfQ0xSSElTVCBmbGFnIHRvIHJlc2V0IGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcyB3aGVuICAgICAgdGhlIGxpbWl0ZXIgc3dpdGNoIGlzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdGx5LiAqLworICBBQUNfUENNX0xJTUlURVJfQVRUQUNLX1RJTUUgPSAweDAwMDUsIC8qITwgU2lnbmFsIGxldmVsIGxpbWl0aW5nIGF0dGFjayB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gbXMuIERlZmF1bHQgY29uZmlndXJhdGlvbiBpcyAxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLiBBZGp1c3RhYmxlIHJhbmdlIGZyb20gMSBtcyB0byAxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLiAqLworICBBQUNfUENNX0xJTUlURVJfUkVMRUFTX1RJTUUgPSAweDAwMDYsIC8qITwgU2lnbmFsIGxldmVsIGxpbWl0aW5nIHJlbGVhc2UgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1zLiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy4gQWRqdXN0YWJsZSB0aW1lIG11c3QgYmUgbGFyZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiAwIG1zLiAqLworICBBQUNfUENNX01JTl9PVVRQVVRfQ0hBTk5FTFMgPQorICAgICAgMHgwMDExLCAvKiE8IE1pbmltdW0gbnVtYmVyIG9mIFBDTSBvdXRwdXQgY2hhbm5lbHMuIElmIGhpZ2hlciB0aGFuIHRoZQorICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZW5jb2RlZCBhdWRpbyBjaGFubmVscywgYSBzaW1wbGUgY2hhbm5lbCBleHRlbnNpb24gaXMKKyAgICAgICAgICAgICAgICAgYXBwbGllZCAoc2VlIG5vdGUgNCBmb3IgZXhjZXB0aW9ucykuIFxuIC0xLCAwOiBEaXNhYmxlIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIGZlYXR1cmUuIFRoZSBkZWNvZGVyIG91dHB1dCBjb250YWlucyB0aGUgc2FtZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgb2YgY2hhbm5lbHMgYXMgdGhlIGVuY29kZWQgYml0c3RyZWFtLiBcbiAxOiAgICBUaGlzIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBuZWVkZWQgb25seSB0b2dldGhlciB3aXRoIHRoZSBtaXgtZG93biBmZWF0dXJlLiBTZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOjpBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMgYW5kIG5vdGUgMiBiZWxvdy4gXG4KKyAgICAgICAgICAgICAgICAgICAgMjogICAgRW5jb2RlZCBtb25vIHNpZ25hbHMgd2lsbCBiZSBkdXBsaWNhdGVkIHRvIGFjaGlldmUgYQorICAgICAgICAgICAgICAgICAyLzAvMC4wIGNoYW5uZWwgb3V0cHV0IGNvbmZpZ3VyYXRpb24uIFxuIDY6ICAgIFRoZSBkZWNvZGVyCisgICAgICAgICAgICAgICAgIHRyaWVzIHRvIHJlb3JkZXIgZW5jb2RlZCBzaWduYWxzIHdpdGggbGVzcyB0aGFuIHNpeCBjaGFubmVscyB0bworICAgICAgICAgICAgICAgICBhY2hpZXZlIGEgMy8wLzIuMSBjaGFubmVsIG91dHB1dCBzaWduYWwuIE1pc3NpbmcgY2hhbm5lbHMgd2lsbAorICAgICAgICAgICAgICAgICBiZSBmaWxsZWQgd2l0aCBhIHplcm8gc2lnbmFsLiBJZiByZW9yZGVyaW5nIGlzIG5vdCBwb3NzaWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgZW1wdHkgY2hhbm5lbHMgd2lsbCBzaW1wbHkgYmUgYXBwZW5kZWQuIE9ubHkgYXZhaWxhYmxlIGlmCisgICAgICAgICAgICAgICAgIGluc3RhbmNlIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtdWx0aWNoYW5uZWwgb3V0cHV0LiBcbiA4OgorICAgICAgICAgICAgICAgICBUaGUgZGVjb2RlciB0cmllcyB0byByZW9yZGVyIGVuY29kZWQgc2lnbmFscyB3aXRoIGxlc3MgdGhhbgorICAgICAgICAgICAgICAgICBlaWdodCBjaGFubmVscyB0byBhY2hpZXZlIGEgMy8wLzQuMSBjaGFubmVsIG91dHB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgIE1pc3NpbmcgY2hhbm5lbHMgd2lsbCBiZSBmaWxsZWQgd2l0aCBhIHplcm8gc2lnbmFsLiBJZgorICAgICAgICAgICAgICAgICByZW9yZGVyaW5nIGlzIG5vdCBwb3NzaWJsZSB0aGUgZW1wdHkgY2hhbm5lbHMgd2lsbCBzaW1wbHkgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kZWQuIE9ubHkgYXZhaWxhYmxlIGlmIGluc3RhbmNlIGlzIGNvbmZpZ3VyZWQgdG8KKyAgICAgICAgICAgICAgICAgc3VwcG9ydCBtdWx0aWNoYW5uZWwgb3V0cHV0LlxuIE5PVEU6IFxuCisgICAgICAgICAgICAgICAgICAgICAxLiBUaGUgY2hhbm5lbCBzaWduYWxpbmcgKENTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgYW5kCisgICAgICAgICAgICAgICAgIENTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMpIHdpbGwgbm90IGJlIG1vZGlmaWVkLiBBZGRlZCBlbXB0eQorICAgICAgICAgICAgICAgICBjaGFubmVscyB3aWxsIGJlIHNpZ25hbGVkIHdpdGggY2hhbm5lbCB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEU6OkFDVF9OT05FLiBcbgorICAgICAgICAgICAgICAgICAgICAgMi4gSWYgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhhdCBvZgorICAgICAgICAgICAgICAgICA6OkFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUyBib3RoIHdpbGwgYmUgc2V0IHRvIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgIHZhbHVlLiBcbgorICAgICAgICAgICAgICAgICAgICAgMy4gVGhpcyBwYXJhbWV0ZXIgZG9lcyBub3QgYWZmZWN0IE1QRUcgU3Vycm91bmQgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICAgICAgIDQuIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZCBpZiB0aGUgbnVtYmVyIG9mIGVuY29kZWQKKyAgICAgICAgICAgICAgICAgYXVkaW8gY2hhbm5lbHMgaXMgZ3JlYXRlciB0aGFuIDguICovCisgIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUyA9CisgICAgICAweDAwMTIsIC8qITwgTWF4aW11bSBudW1iZXIgb2YgUENNIG91dHB1dCBjaGFubmVscy4gSWYgbG93ZXIgdGhhbiB0aGUKKyAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMsIGRvd25taXhpbmcgaXMgYXBwbGllZAorICAgICAgICAgICAgICAgICBhY2NvcmRpbmdseSAoc2VlIG5vdGUgNSBmb3IgZXhjZXB0aW9ucykuIElmIGRlZGljYXRlZCBtZXRhZGF0YQorICAgICAgICAgICAgICAgICBpcyBhdmFpbGFibGUgaW4gdGhlIHN0cmVhbSBpdCB3aWxsIGJlIHVzZWQgdG8gYWNoaWV2ZSBiZXR0ZXIKKyAgICAgICAgICAgICAgICAgbWl4aW5nIHJlc3VsdHMuIFxuIC0xLCAwOiBEaXNhYmxlIGRvd25taXhpbmcgZmVhdHVyZS4gVGhlCisgICAgICAgICAgICAgICAgIGRlY29kZXIgb3V0cHV0IGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZiBjaGFubmVscyBhcyB0aGUKKyAgICAgICAgICAgICAgICAgZW5jb2RlZCBiaXRzdHJlYW0uIFxuIDE6ICAgIEFsbCBlbmNvZGVkIGF1ZGlvIGNvbmZpZ3VyYXRpb25zCisgICAgICAgICAgICAgICAgIHdpdGggbW9yZSB0aGFuIG9uZSBjaGFubmVsIHdpbGwgYmUgbWl4ZWQgZG93biB0byBvbmUgbW9ubworICAgICAgICAgICAgICAgICBvdXRwdXQgc2lnbmFsLiBcbiAyOiAgICBUaGUgZGVjb2RlciBwZXJmb3JtcyBhIHN0ZXJlbyBtaXgtZG93bgorICAgICAgICAgICAgICAgICBpZiB0aGUgbnVtYmVyIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMgaXMgZ3JlYXRlciB0aGFuIHR3by4gXG4gNjoKKyAgICAgICAgICAgICAgICAgSWYgdGhlIG51bWJlciBvZiBlbmNvZGVkIGF1ZGlvIGNoYW5uZWxzIGlzIGdyZWF0ZXIgdGhhbiBzaXggdGhlCisgICAgICAgICAgICAgICAgIGRlY29kZXIgcGVyZm9ybXMgYSBtaXgtZG93biB0byBtZWV0IHRoZSB0YXJnZXQgb3V0cHV0CisgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgMy8wLzIuMSBjaGFubmVscy4gT25seSBhdmFpbGFibGUgaWYgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgaXMgY29uZmlndXJlZCB0byBzdXBwb3J0IG11bHRpY2hhbm5lbCBvdXRwdXQuIFxuIDg6ICAgIFRoaXMKKyAgICAgICAgICAgICAgICAgdmFsdWUgaXMgY3VycmVudGx5IG5lZWRlZCBvbmx5IHRvZ2V0aGVyIHdpdGggdGhlIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIGZlYXR1cmUuIFNlZSA6OkFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUyBhbmQgbm90ZSAyCisgICAgICAgICAgICAgICAgIGJlbG93LiBPbmx5IGF2YWlsYWJsZSBpZiBpbnN0YW5jZSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgbXVsdGljaGFubmVsIG91dHB1dC4gXG4gTk9URTogXG4KKyAgICAgICAgICAgICAgICAgICAgIDEuIERvd24tbWl4aW5nIG9mIGFueSBzZXZlbiBvciBlaWdodCBjaGFubmVsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgbm90IGRlZmluZWQgaW4gSVNPL0lFQyAxNDQ5Ni0zIFBEQU0gNCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICAgc29mdHdhcmUgdmVyc2lvbi4gXG4KKyAgICAgICAgICAgICAgICAgICAgIDIuIElmIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHplcm8gYnV0IHNtYWxsZXIKKyAgICAgICAgICAgICAgICAgdGhhbiA6OkFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUyBib3RoIHdpbGwgYmUgc2V0IHRvIHNhbWUKKyAgICAgICAgICAgICAgICAgdmFsdWUuIFxuCisgICAgICAgICAgICAgICAgICAgICAzLiBUaGUgb3BlcmF0aW5nIG1vZGUgb2YgdGhlIE1QRUcgU3Vycm91bmQgbW9kdWxlIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgc2V0IGFjY29yZGluZ2x5LiBcbgorICAgICAgICAgICAgICAgICAgICAgNC4gU2V0dGluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueSB2YWx1ZSB3aWxsIGRpc2FibGUgdGhlCisgICAgICAgICAgICAgICAgIGJpbmF1cmFsIHByb2Nlc3Npbmcgb2YgdGhlIE1QRUcgU3Vycm91bmQgbW9kdWxlCisgICAgICAgICAgICAgICAgICAgICA1LiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIGlnbm9yZWQgaWYgdGhlIG51bWJlciBvZiBlbmNvZGVkCisgICAgICAgICAgICAgICAgIGF1ZGlvIGNoYW5uZWxzIGlzIGdyZWF0ZXIgdGhhbiA4LiAqLworICBBQUNfTUVUQURBVEFfUFJPRklMRSA9CisgICAgICAweDAwMjAsIC8qITwgU2VlIDo6QUFDX01EX1BST0ZJTEUgZm9yIGFsbCBhdmFpbGFibGUgdmFsdWVzLiAqLworICBBQUNfTUVUQURBVEFfRVhQSVJZX1RJTUUgPSAweDAwMjEsIC8qITwgRGVmaW5lcyB0aGUgdGltZSBpbiBtcyBhZnRlciB3aGljaCBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGFzc29jaWF0ZWQgbWV0YS1kYXRhIChEUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peCBjb2VmZmljaWVudHMsIC4uLikgd2lsbCBiZSByZXNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRlZmF1bHQgaWYgbm8gdXBkYXRlIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQuIE5lZ2F0aXZlIHZhbHVlcyBkaXNhYmxlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuICovCiAKLSAgQUFDX0NPTkNFQUxfTUVUSE9EICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTAwLCAgLyohPCBFcnJvciBjb25jZWFsbWVudDogUHJvY2Vzc2luZyBtZXRob2QuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogU3BlY3RyYWwgbXV0aW5nLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IE5vaXNlIHN1YnN0aXR1dGlvbiAoc2VlIDo6Q09OQ0VBTF9OT0lTRSkuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogRW5lcmd5IGludGVycG9sYXRpb24gKGFkZHMgYWRkaXRpb25hbCBzaWduYWwgZGVsYXkgb2Ygb25lIGZyYW1lLCBzZWUgOjpDT05DRUFMX0lOVEVSKS4gXG4gKi8KLQotICBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICAgPSAweDAyMDAsICAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogU2NhbGluZyBmYWN0b3IgZm9yIGJvb3N0aW5nIGdhaW4gdmFsdWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgaG93IHRoZSBib29zdGluZyBEUkMgZmFjdG9ycyAoY29udmV5ZWQgaW4gdGhlIGJpdHN0cmVhbSkgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgc2lnbmFsLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoZG9uJ3QgYXBwbHkgYm9vc3QgZmFjdG9ycykgdG8gMTI3IChmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5IGFsbCBib29zdGluZyBmYWN0b3JzKS4gKi8KLSAgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IgICAgICAgICAgICAgID0gMHgwMjAxLCAgLyohPCBEeW5hbWljIFJhbmdlIENvbnRyb2w6IFNjYWxpbmcgZmFjdG9yIGZvciBhdHRlbnVhdGluZyBnYWluIHZhbHVlcy4gU2FtZSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ19EUkNfQk9PU1RfRkFDVE9SIGJ1dCBmb3IgYXR0ZW51YXRpbmcgRFJDIGZhY3RvcnMuICovCi0gIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMICAgICAgICAgICAgICAgICA9IDB4MDIwMiwgIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBUYXJnZXQgcmVmZXJlbmNlIGxldmVsLiBEZWZpbmVzIHRoZSBsZXZlbCBiZWxvdyBmdWxsLXNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHF1YW50aXplZCBpbiBzdGVwcyBvZiAwLjI1ZEIpIHRvIHdoaWNoIHRoZSBvdXRwdXQgYXVkaW8gc2lnbmFsIHdpbGwgYmUgbm9ybWFsaXplZCB0byBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBEUkMgbW9kdWxlLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoZnVsbC1zY2FsZSkgdG8gMTI3ICgzMS43NSBkQiBiZWxvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwtc2NhbGUpLiBUaGUgdmFsdWUgc21hbGxlciB0aGFuIDAgc3dpdGNoZXMgb2ZmIG5vcm1hbGl6YXRpb24uICovCi0gIEFBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04gICAgICAgICAgICAgICA9IDB4MDIwMywgIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBFbi0vRGlzYWJsZSBEVkIgc3BlY2lmaWMgaGVhdnkgY29tcHJlc3Npb24gKGFrYSBSRiBtb2RlKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gMSwgdGhlIGRlY29kZXIgd2lsbCBhcHBseSB0aGUgY29tcHJlc3Npb24gdmFsdWVzIGZyb20gdGhlIERWQiBzcGVjaWZpYyBhbmNpbGxhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGZpZWxkLiBBdCB0aGUgc2FtZSB0aW1lIHRoZSBNUEVHLTQgRHluYW1pYyBSYW5nZSBDb250cm9sIHRvb2wgd2lsbCBiZSBkaXNhYmxlZC4gQnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGhlYXZ5IGNvbXByZXNzaW9uIGlzIGRpc2FibGVkLiAqLwotCi0gIEFBQ19RTUZfTE9XUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwMCwgIC8qITwgUXVhZHJhdHVyZSBNaXJyb3IgRmlsdGVyIChRTUYpIEJhbmsgcHJvY2Vzc2luZyBtb2RlLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiBVc2UgaW50ZXJuYWwgZGVmYXVsdC4gSW1wbGllcyBNUEVHIFN1cnJvdW5kIHBhcnRpYWxseSBjb21wbGV4IGFjY29yZGluZ2x5LiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBVc2UgY29tcGxleCBRTUYgZGF0YSBtb2RlLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBVc2UgcmVhbCAobG93IHBvd2VyKSBRTUYgZGF0YSBtb2RlLiBcbiAqLwotCi0gIEFBQ19NUEVHU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMCwgIC8qITwgTVBFRyBTdXJyb3VuZDogQWxsb3cvRGlzYWJsZSBkZWNvZGluZyBvZiBNUFMgY29udGVudC4gQXZhaWxhYmxlIG9ubHkgZm9yIGRlY29kZXJzIHdpdGggTVBFRwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cnJvdW5kIHN1cHBvcnQuICovCi0KLSAgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiAgICAgICAgICAgICAgICAgID0gMHgwNjAzICAgLyohPCBDbGVhciBpbnRlcm5hbCBiaXQgc3RyZWFtIGJ1ZmZlciBvZiB0cmFuc3BvcnQgbGF5ZXJzLiBUaGUgZGVjb2RlciB3aWxsIHN0YXJ0IGRlY29kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgbmV3IGRhdGEgcGFzc2VkIGFmdGVyIHRoaXMgZXZlbnQgYW5kIGFueSBwcmV2aW91cyBkYXRhIGlzIGRpc2NhcmRlZC4gKi8KKyAgQUFDX0NPTkNFQUxfTUVUSE9EID0gMHgwMTAwLCAvKiE8IEVycm9yIGNvbmNlYWxtZW50OiBQcm9jZXNzaW5nIG1ldGhvZC4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IFNwZWN0cmFsIG11dGluZy4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IE5vaXNlIHN1YnN0aXR1dGlvbiAoc2VlIDo6Q09OQ0VBTF9OT0lTRSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gMjogRW5lcmd5IGludGVycG9sYXRpb24gKGFkZHMgYWRkaXRpb25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCBkZWxheSBvZiBvbmUgZnJhbWUsIHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Q09OQ0VBTF9JTlRFUi4gb25seSBzb21lIEFPVHMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkKS4gXG4gKi8KKyAgQUFDX0RSQ19CT09TVF9GQUNUT1IgPQorICAgICAgMHgwMjAwLCAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogU2NhbGluZyBmYWN0b3IgZm9yIGJvb3N0aW5nIGdhaW4KKyAgICAgICAgICAgICAgICAgdmFsdWVzLiBEZWZpbmVzIGhvdyB0aGUgYm9vc3RpbmcgRFJDIGZhY3RvcnMgKGNvbnZleWVkIGluIHRoZQorICAgICAgICAgICAgICAgICBiaXRzdHJlYW0pIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZGVjb2RlZCBzaWduYWwuIFRoZSB2YWxpZAorICAgICAgICAgICAgICAgICB2YWx1ZXMgcmFuZ2UgZnJvbSAwIChkb24ndCBhcHBseSBib29zdCBmYWN0b3JzKSB0byAxMjcgKGZ1bGx5CisgICAgICAgICAgICAgICAgICAgYXBwbHkgYm9vc3QgZmFjdG9ycykuIERlZmF1bHQgdmFsdWUgaXMgMC4gKi8KKyAgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IgPQorICAgICAgMHgwMjAxLCAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogU2NhbGluZyBmYWN0b3IgZm9yIGF0dGVudWF0aW5nIGdhaW4KKyAgICAgICAgICAgICAgICAgdmFsdWVzLiBTYW1lIGFzCisgICAgICAgICAgICAgICAgICAgOjpBQUNfRFJDX0JPT1NUX0ZBQ1RPUiBidXQgZm9yIGF0dGVudWF0aW5nIERSQyBmYWN0b3JzLiAqLworICBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCA9CisgICAgICAweDAyMDIsIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sIChEUkMpOiBUYXJnZXQgcmVmZXJlbmNlIGxldmVsLiBEZWZpbmVzCisgICAgICAgICAgICAgICAgIHRoZSBsZXZlbCBiZWxvdyBmdWxsLXNjYWxlIChxdWFudGl6ZWQgaW4gc3RlcHMgb2YgMC4yNWRCKSB0bworICAgICAgICAgICAgICAgICB3aGljaCB0aGUgb3V0cHV0IGF1ZGlvIHNpZ25hbCB3aWxsIGJlIG5vcm1hbGl6ZWQgdG8gYnkgdGhlIERSQworICAgICAgICAgICAgICAgICBtb2R1bGUuIFRoZSBwYXJhbWV0ZXIgY29udHJvbHMgbG91ZG5lc3Mgbm9ybWFsaXphdGlvbiBmb3IgYm90aAorICAgICAgICAgICAgICAgICBNUEVHLTQgRFJDIGFuZCBNUEVHLUQgRFJDLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gNDAgKC0xMAorICAgICAgICAgICAgICAgICBkQkZTKSB0byAxMjcgKC0zMS43NSBkQkZTKS4gQW55IHZhbHVlIHNtYWxsZXIgdGhhbiAwIHN3aXRjaGVzCisgICAgICAgICAgICAgICAgIG9mZiBsb3VkbmVzcyBub3JtYWxpemF0aW9uIGFuZCBNUEVHLTQgRFJDLiBCeSBkZWZhdWx0LCBsb3VkbmVzcworICAgICAgICAgICAgICAgICBub3JtYWxpemF0aW9uIGFuZCBNUEVHLTQgRFJDIGlzIHN3aXRjaGVkIG9mZi4gKi8KKyAgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiA9CisgICAgICAweDAyMDMsIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBFbi0vRGlzYWJsZSBEVkIgc3BlY2lmaWMgaGVhdnkKKyAgICAgICAgICAgICAgICAgY29tcHJlc3Npb24gKGFrYSBSRiBtb2RlKS4gSWYgc2V0IHRvIDEsIHRoZSBkZWNvZGVyIHdpbGwgYXBwbHkKKyAgICAgICAgICAgICAgICAgdGhlIGNvbXByZXNzaW9uIHZhbHVlcyBmcm9tIHRoZSBEVkIgc3BlY2lmaWMgYW5jaWxsYXJ5IGRhdGEKKyAgICAgICAgICAgICAgICAgZmllbGQuIEF0IHRoZSBzYW1lIHRpbWUgdGhlIE1QRUctNCBEeW5hbWljIFJhbmdlIENvbnRyb2wgdG9vbAorICAgICAgICAgICAgICAgICB3aWxsIGJlIGRpc2FibGVkLiBCeSBkZWZhdWx0LCBoZWF2eSBjb21wcmVzc2lvbiBpcyBkaXNhYmxlZC4gKi8KKyAgQUFDX0RSQ19ERUZBVUxUX1BSRVNFTlRBVElPTl9NT0RFID0KKyAgICAgIDB4MDIwNCwgLyohPCBEeW5hbWljIFJhbmdlIENvbnRyb2w6IERlZmF1bHQgcHJlc2VudGF0aW9uIG1vZGUgKERSQworICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaGFuZGxpbmcpLiBcbiBEZWZpbmVzIHRoZSBoYW5kbGluZyBvZiB0aGUgRFJDCisgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgYm9vc3QgZmFjdG9yLCBhdHRlbnVhdGlvbiBmYWN0b3IgYW5kIGhlYXZ5CisgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uLCBpZiBubyBwcmVzZW50YXRpb24gbW9kZSBpcyBpbmRpY2F0ZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgIGJpdHN0cmVhbS5cbiBGb3Igb3B0aW9ucywgc2VlCisgICAgICAgICAgICAgICAgIDo6QUFDX0RSQ19ERUZBVUxUX1BSRVNFTlRBVElPTl9NT0RFX09QVElPTlMuXG4gRGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgOjpBQUNfRFJDX1BBUkFNRVRFUl9IQU5ETElOR19ESVNBQkxFRCAqLworICBBQUNfRFJDX0VOQ19UQVJHRVRfTEVWRUwgPQorICAgICAgMHgwMjA1LCAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogRW5jb2RlciB0YXJnZXQgbGV2ZWwgZm9yIGxpZ2h0IChpLmUuCisgICAgICAgICAgICAgICAgIG5vdCBoZWF2eSkgY29tcHJlc3Npb24uXG4gSWYga25vd24sIHRoaXMgZGVjbGFyZXMgdGhlIHRhcmdldAorICAgICAgICAgICAgICAgICByZWZlcmVuY2UgbGV2ZWwgdGhhdCB3YXMgYXNzdW1lZCBhdCB0aGUgZW5jb2RlciBmb3IgY2FsY3VsYXRpb24KKyAgICAgICAgICAgICAgICAgICBvZiBsaW1pdGluZyBnYWlucy4gVGhlIHZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDAgKGZ1bGwtc2NhbGUpCisgICAgICAgICAgICAgICAgIHRvIDEyNyAoMzEuNzUgZEIgYmVsb3cgZnVsbC1zY2FsZSkuIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgb25seQorICAgICAgICAgICAgICAgICB3aXRoIDo6QUFDX0RSQ19QQVJBTUVURVJfSEFORExJTkdfRU5BQkxFRCBhbmQgaWdub3JlZAorICAgICAgICAgICAgICAgICBvdGhlcndpc2UuXG4gRGVmYXVsdDogMTI3ICh3b3JzdC1jYXNlIGFzc3VtcHRpb24pLlxuICovCisgIEFBQ19RTUZfTE9XUE9XRVIgPSAweDAzMDAsIC8qITwgUXVhZHJhdHVyZSBNaXJyb3IgRmlsdGVyIChRTUYpIEJhbmsgcHJvY2Vzc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLiBcbiAtMTogVXNlIGludGVybmFsIGRlZmF1bHQuIEltcGxpZXMgTVBFRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJyb3VuZCBwYXJ0aWFsbHkgY29tcGxleCBhY2NvcmRpbmdseS4gXG4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIGNvbXBsZXggUU1GIGRhdGEgbW9kZS4gXG4gMTogVXNlIHJlYWwgKGxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlcikgUU1GIGRhdGEgbW9kZS4gXG4gKi8KKyAgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiA9CisgICAgICAweDA2MDMsIC8qITwgQ2xlYXIgaW50ZXJuYWwgYml0IHN0cmVhbSBidWZmZXIgb2YgdHJhbnNwb3J0IGxheWVycy4gVGhlCisgICAgICAgICAgICAgICAgIGRlY29kZXIgd2lsbCBzdGFydCBkZWNvZGluZyBhdCBuZXcgZGF0YSBwYXNzZWQgYWZ0ZXIgdGhpcyBldmVudAorICAgICAgICAgICAgICAgICBhbmQgYW55IHByZXZpb3VzIGRhdGEgaXMgZGlzY2FyZGVkLiAqLworICBBQUNfVU5JRFJDX1NFVF9FRkZFQ1QgPSAweDA5MDMgLyohPCAgTVBFRy1EIERSQzogUmVxdWVzdCBhIERSQyBlZmZlY3QgdHlwZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiBvZiBhIERSQyBzZXQuXG4gU3VwcG9ydGVkIGluZGljZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZTpcbiAtMTogRFJDIG9mZi4gQ29tcGxldGVseSBkaXNhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFRy1EIERSQy5cbiAwOiBOb25lIChkZWZhdWx0KS4gRGlzYWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUctRCBEUkMsIGJ1dCBhdXRvbWF0aWNhbGx5IGVuYWJsZXMgRFJDIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcnkgdG8gcHJldmVudCBjbGlwcGluZy5cbiAxOiBMYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWdodFxuIDI6IE5vaXN5IGVudmlyb25tZW50XG4gMzogTGltaXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2sgcmFuZ2VcbiA0OiBMb3cgcGxheWJhY2sgbGV2ZWxcbiA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nIGVuaGFuY2VtZW50XG4gNjogR2VuZXJhbCBjb21wcmVzc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgZm9yIGdlbmVyYWxseSBlbmFibGluZyBNUEVHLUQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHBhcnRpY3VsYXIgcmVxdWVzdC5cbiAqLwogCiB9IEFBQ0RFQ19QQVJBTTsKIAogLyoqCi0gKiBcYnJpZWYgVGhpcyBzdHJ1Y3R1cmUgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBkZWNvZGVkIGF1ZGlvIGRhdGEuCi0gKiAgICAgICAgQWxsIGZpZWxkcyBhcmUgcmVhZC1vbmx5LgorICogXGJyaWVmIFRoaXMgc3RydWN0dXJlIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgZGVjb2RlZCBhdWRpbworICogZGF0YS4gQWxsIGZpZWxkcyBhcmUgcmVhZC1vbmx5LgogICovCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGVzZSBmaXZlIG1lbWJlcnMgYXJlIHRoZSBvbmx5IHJlYWxseSByZWxldmFudCBvbmVzIGZvciB0aGUgdXNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBJTlQgICAgICAgICAgICAgICBzYW1wbGVSYXRlOyAgICAgICAgICAvKiE8IFRoZSBzYW1wbGVyYXRlIGluIEh6IG9mIHRoZSBmdWxseSBkZWNvZGVkIFBDTSBhdWRpbyBzaWduYWwgKGFmdGVyIFNCUiBwcm9jZXNzaW5nKS4gICAqLwotICBJTlQgICAgICAgICAgICAgICBmcmFtZVNpemU7ICAgICAgICAgICAvKiE8IFRoZSBmcmFtZSBzaXplIG9mIHRoZSBkZWNvZGVkIFBDTSBhdWRpbyBzaWduYWwuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCBvciA5NjAgZm9yIEFBQy1MQyBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggb3IgMTkyMCBmb3IgSEUtQUFDICh2MikgXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIgb3IgNDgwIGZvciBBQUMtTEQgYW5kIEFBQy1FTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgSU5UICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHM7ICAgICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIG91dHB1dCBhdWRpbyBjaGFubmVscyBpbiB0aGUgZGVjb2RlZCBhbmQgaW50ZXJsZWF2ZWQgUENNIGF1ZGlvIHNpZ25hbC4gKi8KLSAgQVVESU9fQ0hBTk5FTF9UWVBFICpwQ2hhbm5lbFR5cGU7ICAgICAgLyohPCBBdWRpbyBjaGFubmVsIHR5cGUgb2YgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVUNIQVIgICAgICAgICAgICAgKnBDaGFubmVsSW5kaWNlczsgICAgLyohPCBBdWRpbyBjaGFubmVsIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksIDguNS4zLjIgRXhwbGljaXQgY2hhbm5lbCBtYXBwaW5nIHVzaW5nIGEgcHJvZ3JhbV9jb25maWdfZWxlbWVudCgpICovCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIFRoZXNlIGZpdmUgbWVtYmVycyBhcmUgdGhlIG9ubHkgcmVhbGx5IHJlbGV2YW50IG9uZXMgZm9yIHRoZSB1c2VyLiAqLworICBJTlQgc2FtcGxlUmF0ZTsgLyohPCBUaGUgc2FtcGxlIHJhdGUgaW4gSHogb2YgdGhlIGRlY29kZWQgUENNIGF1ZGlvIHNpZ25hbC4gKi8KKyAgSU5UIGZyYW1lU2l6ZTsgIC8qITwgVGhlIGZyYW1lIHNpemUgb2YgdGhlIGRlY29kZWQgUENNIGF1ZGlvIHNpZ25hbC4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgVHlwaWNhbGx5IHRoaXMgaXM6IFxuCisgICAgICAgICAgICAgICAgICAgICAgIDEwMjQgb3IgOTYwIGZvciBBQUMtTEMgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgMjA0OCBvciAxOTIwIGZvciBIRS1BQUMgKHYyKSBcbgorICAgICAgICAgICAgICAgICAgICAgICA1MTIgb3IgNDgwIGZvciBBQUMtTEQgYW5kIEFBQy1FTEQgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgNzY4LCAxMDI0LCAyMDQ4IG9yIDQwOTYgZm9yIFVTQUMgICovCisgIElOVCBudW1DaGFubmVsczsgLyohPCBUaGUgbnVtYmVyIG9mIG91dHB1dCBhdWRpbyBjaGFubmVscyBiZWZvcmUgdGhlIHJlbmRlcmluZworICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSwgaS5lLiB0aGUgb3JpZ2luYWwgY2hhbm5lbCBjb25maWd1cmF0aW9uLiAqLworICBBVURJT19DSEFOTkVMX1RZUEUKKyAgKnBDaGFubmVsVHlwZTsgLyohPCBBdWRpbyBjaGFubmVsIHR5cGUgb2YgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbC4gKi8KKyAgVUNIQVIgKnBDaGFubmVsSW5kaWNlczsgLyohPCBBdWRpbyBjaGFubmVsIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLiBTZWUgSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksIDguNS4zLjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbGljaXQgY2hhbm5lbCBtYXBwaW5nIHVzaW5nIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV9jb25maWdfZWxlbWVudCgpICovCiAgIC8qIERlY29kZXIgaW50ZXJuYWwgbWVtYmVycy4gKi8KLSAgSU5UICAgICAgICAgICAgICAgYWFjU2FtcGxlUmF0ZTsgICAgICAgLyohPCBTYW1wbGluZyByYXRlIGluIEh6IHdpdGhvdXQgU0JSIChmcm9tIGNvbmZpZ3VyYXRpb24gaW5mbykuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgSU5UICAgICAgICAgICAgICAgcHJvZmlsZTsgICAgICAgICAgICAgLyohPCBNUEVHLTIgcHJvZmlsZSAoZnJvbSBmaWxlIGhlYWRlcikgKC0xOiBub3QgYXBwbGljYWJsZSAoZS4gZy4gTVBFRy00KSkuICAgICAgICAgICAgICAgKi8KLSAgQVVESU9fT0JKRUNUX1RZUEUgYW90OyAgICAgICAgICAgICAgICAgLyohPCBBdWRpbyBPYmplY3QgVHlwZSAoZnJvbSBBU0MpOiBpcyBzZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGZvciBNUEVHLTIgYml0c3RyZWFtcyAoZS4gZy4gMiBmb3IgQUFDLUxDKS4gKi8KLSAgSU5UICAgICAgICAgICAgICAgY2hhbm5lbENvbmZpZzsgICAgICAgLyohPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKDA6IFBDRSBkZWZpbmVkLCAxOiBtb25vLCAyOiBzdGVyZW8sIC4uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgSU5UICAgICAgICAgICAgICAgYml0UmF0ZTsgICAgICAgICAgICAgLyohPCBJbnN0YW50YW5lb3VzIGJpdCByYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICBJTlQgICAgICAgICAgICAgICBhYWNTYW1wbGVzUGVyRnJhbWU7ICAvKiE8IFNhbXBsZXMgcGVyIGZyYW1lIGZvciB0aGUgQUFDIGNvcmUgKGZyb20gQVNDKS4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0IG9yIDk2MCBmb3IgQUFDLUxDIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyIG9yIDQ4MCBmb3IgQUFDLUxEIGFuZCBBQUMtRUxEICAgICAgICAgKi8KLSAgSU5UICAgICAgICAgICAgICAgYWFjTnVtQ2hhbm5lbHM7ICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIGFmdGVyIEFBQyBjb3JlIHByb2Nlc3NpbmcgKGJlZm9yZSBQUyBvciBNUFMgcHJvY2Vzc2luZykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FVVElPTjogVGhpcyBhcmUgbm90IHRoZSBmaW5hbCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzISAqLwotICBBVURJT19PQkpFQ1RfVFlQRSBleHRBb3Q7ICAgICAgICAgICAgICAvKiE8IEV4dGVuc2lvbiBBdWRpbyBPYmplY3QgVHlwZSAoZnJvbSBBU0MpICAgKi8KLSAgSU5UICAgICAgICAgICAgICAgZXh0U2FtcGxpbmdSYXRlOyAgICAgLyohPCBFeHRlbnNpb24gc2FtcGxpbmcgcmF0ZSBpbiBIeiAoZnJvbSBBU0MpICovCisgIElOVCBhYWNTYW1wbGVSYXRlOyAvKiE8IFNhbXBsaW5nIHJhdGUgaW4gSHogd2l0aG91dCBTQlIgKGZyb20gY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgaW5mbykgZGl2aWRlZCBieSBhIChFTEQpIGRvd25zY2FsZSBmYWN0b3IgaWYgcHJlc2VudC4gKi8KKyAgSU5UIHByb2ZpbGU7IC8qITwgTVBFRy0yIHByb2ZpbGUgKGZyb20gZmlsZSBoZWFkZXIpICgtMTogbm90IGFwcGxpY2FibGUgKGUuIGcuCisgICAgICAgICAgICAgICAgICBNUEVHLTQpKS4gICAgICAgICAgICAgICAqLworICBBVURJT19PQkpFQ1RfVFlQRQorICBhb3Q7IC8qITwgQXVkaW8gT2JqZWN0IFR5cGUgKGZyb20gQVNDKTogaXMgc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZQorICAgICAgICAgIGZvciBNUEVHLTIgYml0c3RyZWFtcyAoZS4gZy4gMiBmb3IgQUFDLUxDKS4gKi8KKyAgSU5UIGNoYW5uZWxDb25maWc7IC8qITwgQ2hhbm5lbCBjb25maWd1cmF0aW9uICgwOiBQQ0UgZGVmaW5lZCwgMTogbW9ubywgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlbywgLi4uICAgICAgICAgICAgICAgICAgICAgICAqLworICBJTlQgYml0UmF0ZTsgICAgICAgLyohPCBJbnN0YW50YW5lb3VzIGJpdCByYXRlLiAgICAgICAgICAgICAgICAgICAqLworICBJTlQgYWFjU2FtcGxlc1BlckZyYW1lOyAgIC8qITwgU2FtcGxlcyBwZXIgZnJhbWUgZm9yIHRoZSBBQUMgY29yZSAoZnJvbSBBU0MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aWRlZCBieSBhIChFTEQpIGRvd25zY2FsZSBmYWN0b3IgaWYgcHJlc2VudC4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGljYWxseSB0aGlzIGlzICh3aXRoIGEgZG93bnNjYWxlIGZhY3RvciBvZiAxKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgIDEwMjQgb3IgOTYwIGZvciBBQUMtTEMgXG4gICA1MTIgb3IgNDgwIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQy1MRCAgIGFuZCBBQUMtRUxEICAgICAgICAgKi8KKyAgSU5UIGFhY051bUNoYW5uZWxzOyAgICAgICAvKiE8IFRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgYWZ0ZXIgQUFDIGNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIChiZWZvcmUgUFMgb3IgTVBTIHByb2Nlc3NpbmcpLiAgICAgICBDQVVUSU9OOiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG5vdCB0aGUgZmluYWwgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyEgKi8KKyAgQVVESU9fT0JKRUNUX1RZUEUgZXh0QW90OyAvKiE8IEV4dGVuc2lvbiBBdWRpbyBPYmplY3QgVHlwZSAoZnJvbSBBU0MpICAgKi8KKyAgSU5UIGV4dFNhbXBsaW5nUmF0ZTsgLyohPCBFeHRlbnNpb24gc2FtcGxpbmcgcmF0ZSBpbiBIeiAoZnJvbSBBU0MpIGRpdmlkZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYSAoRUxEKSBkb3duc2NhbGUgZmFjdG9yIGlmIHByZXNlbnQuICovCiAKLSAgVUlOVCAgICAgICAgICAgICAgb3V0cHV0RGVsYXk7ICAgICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdGhlIG91dHB1dCBpcyBhZGRpdGlvbmFsbHkgZGVsYXllZCBieSB0aGUgZGVjb2Rlci4gKi8KKyAgVUlOVCBvdXRwdXREZWxheTsgLyohPCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdGhlIG91dHB1dCBpcyBhZGRpdGlvbmFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgZGVsYXllZCBieS50aGUgZGVjb2Rlci4gKi8KKyAgVUlOVCBmbGFnczsgLyohPCBDb3B5IG9mIGludGVybmFsIGZsYWdzLiBPbmx5IHRvIGJlIHdyaXR0ZW4gYnkgdGhlIGRlY29kZXIsCisgICAgICAgICAgICAgICAgIGFuZCBvbmx5IHRvIGJlIHJlYWQgZXh0ZXJuYWxseS4gKi8KIAotICBVSU5UICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgICAgICAvKiE8IENvcHkgb2YgaW50ZXJuYWwgZmxhZ3MuIE9ubHkgdG8gYmUgd3JpdHRlbiBieSB0aGUgZGVjb2RlciwgYW5kIG9ubHkgdG8gYmUgcmVhZCBleHRlcm5hbGx5LiAqLwotCi0gIFNDSEFSICAgICAgICAgICAgIGVwQ29uZmlnOyAgICAgICAgICAgIC8qITwgZXBDb25maWcgbGV2ZWwgKGZyb20gQVNDKTogb25seSBsZXZlbCAwIHN1cHBvcnRlZCwgLTEgbWVhbnMgbm8gRVIgKGUuIGcuIEFPVD0yLCBNUEVHLTIgQUFDLCBldGMuKSAgKi8KLQorICBTQ0hBUiBlcENvbmZpZzsgLyohPCBlcENvbmZpZyBsZXZlbCAoZnJvbSBBU0MpOiBvbmx5IGxldmVsIDAgc3VwcG9ydGVkLCAtMQorICAgICAgICAgICAgICAgICAgICAgbWVhbnMgbm8gRVIgKGUuIGcuIEFPVD0yLCBNUEVHLTIgQUFDLCBldGMuKSAgKi8KICAgLyogU3RhdGlzdGljcyAqLwotICBJTlQgICAgICAgICAgICAgICBudW1Mb3N0QWNjZXNzVW5pdHM7ICAvKiE8IFRoaXMgaW50ZWdlciB3aWxsIHJlZmxlY3QgdGhlIGVzdGltYXRlZCBhbW91bnQgb2YgbG9zdCBhY2Nlc3MgdW5pdHMgaW4gY2FzZSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIEFBQ19ERUNfVFJBTlNQT1JUX1NZTkNfRVJST1IuIEl0IHdpbGwgYmUgPCAwIGlmIHRoZSBlc3RpbWF0aW9uIGZhaWxlZC4gKi8KKyAgSU5UIG51bUxvc3RBY2Nlc3NVbml0czsgLyohPCBUaGlzIGludGVnZXIgd2lsbCByZWZsZWN0IHRoZSBlc3RpbWF0ZWQgYW1vdW50IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc3QgYWNjZXNzIHVuaXRzIGluIGNhc2UgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBBQUNfREVDX1RSQU5TUE9SVF9TWU5DX0VSUk9SLiBJdCB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgMCBpZiB0aGUgZXN0aW1hdGlvbiBmYWlsZWQuICovCiAKLSAgVUlOVCAgICAgICAgICAgICAgbnVtVG90YWxCeXRlczsgICAgICAgLyohPCBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdG90YWwgYnl0ZXMgdGhhdCBoYXZlIHBhc3NlZCB0aHJvdWdoIHRoZSBkZWNvZGVyLiAqLwotICBVSU5UICAgICAgICAgICAgICBudW1CYWRCeXRlczsgICAgICAgICAvKiE8IFRoaXMgaXMgdGhlIG51bWJlciBvZiB0b3RhbCBieXRlcyB0aGF0IHdlcmUgY29uc2lkZXJlZCB3aXRoIGVycm9ycyBmcm9tIG51bVRvdGFsQnl0ZXMuICovCi0gIFVJTlQgICAgICAgICAgICAgIG51bVRvdGFsQWNjZXNzVW5pdHM7IC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGFjY2VzcyB1bml0cyB0aGF0IGhhdmUgcGFzc2VkIHRocm91Z2ggdGhlIGRlY29kZXIuICovCi0gIFVJTlQgICAgICAgICAgICAgIG51bUJhZEFjY2Vzc1VuaXRzOyAgIC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGFjY2VzcyB1bml0cyB0aGF0IHdlcmUgY29uc2lkZXJlZCB3aXRoIGVycm9ycyBmcm9tIG51bVRvdGFsQnl0ZXMuICovCisgIElOVDY0IG51bVRvdGFsQnl0ZXM7IC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIHRoYXQgaGF2ZSBwYXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCB0aGUgZGVjb2Rlci4gKi8KKyAgSU5UNjQKKyAgbnVtQmFkQnl0ZXM7IC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIHRoYXQgd2VyZSBjb25zaWRlcmVkCisgICAgICAgICAgICAgICAgICB3aXRoIGVycm9ycyBmcm9tIG51bVRvdGFsQnl0ZXMuICovCisgIElOVDY0CisgIG51bVRvdGFsQWNjZXNzVW5pdHM7ICAgICAvKiE8IFRoaXMgaXMgdGhlIG51bWJlciBvZiB0b3RhbCBhY2Nlc3MgdW5pdHMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBwYXNzZWQgdGhyb3VnaCB0aGUgZGVjb2Rlci4gKi8KKyAgSU5UNjQgbnVtQmFkQWNjZXNzVW5pdHM7IC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGFjY2VzcyB1bml0cyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZXJlIGNvbnNpZGVyZWQgd2l0aCBlcnJvcnMgZnJvbSBudW1Ub3RhbEJ5dGVzLiAqLwogCiAgIC8qIE1ldGFkYXRhICovCi0gIFNDSEFSICAgICAgICAgICAgIGRyY1Byb2dSZWZMZXY7ICAgICAgIC8qITwgRFJDIHByb2dyYW0gcmVmZXJlbmNlIGxldmVsLiBEZWZpbmVzIHRoZSByZWZlcmVuY2UgbGV2ZWwgYmVsb3cgZnVsbC1zY2FsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBxdWFudGl6ZWQgaW4gc3RlcHMgb2YgMC4yNWRCLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoMCBkQkZTKSB0byAxMjcgKC0zMS43NSBkQkZTKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIHRvIHJlZmxlY3QgdGhlIGF2ZXJhZ2UgbG91ZG5lc3Mgb2YgdGhlIGF1ZGlvIGluIExLRlMgYWNjb3JpbmcgdG8gSVRVLVIgQlMgMTc3MC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBubyBsZXZlbCBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIHRoZSB2YWx1ZSBpcyAtMS4gKi8KLSAgU0NIQVIgICAgICAgICAgICAgZHJjUHJlc01vZGU7ICAgICAgICAgLyohPCBEUkMgcHJlc2VudGF0aW9uIG1vZGUuIEFjY29yZGluZyB0byBFVFNJIFRTIDEwMSAxNTQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWdodCAoTVBFRy00IER5bmFtaWMgUmFuZ2UgQ29udHJvbCB0b29sKSBvciBoZWF2eSBjb21wcmVzc2lvbiAoRFZCIGhlYXZ5IGNvbXByZXNzaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgcmFuZ2UgY29udHJvbCBzaGFsbCB0YWtlIHByaW9yaXR5IG9uIHRoZSBvdXRwdXRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgRVRTSSBUUyAxMDEgMTU0LCB0YWJsZSBDLjMzLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiBObyBjb3JyZXNwb25kaW5nIG1ldGFkYXRhIGZvdW5kIGluIHRoZSBiaXRzdHJlYW0gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogRFJDIHByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbmRpY2F0ZWQgXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogRFJDIHByZXNlbnRhdGlvbiBtb2RlIDEgXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogRFJDIHByZXNlbnRhdGlvbiBtb2RlIDIgXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogUmVzZXJ2ZWQgKi8KKyAgU0NIQVIgZHJjUHJvZ1JlZkxldjsgLyohPCBEUkMgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwuIERlZmluZXMgdGhlIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCBiZWxvdyBmdWxsLXNjYWxlLiBJdCBpcyBxdWFudGl6ZWQgaW4gc3RlcHMgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNWRCLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoMCBkQkZTKSB0byAxMjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zMS43NSBkQkZTKS4gSXQgaXMgdXNlZCB0byByZWZsZWN0IHRoZSBhdmVyYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdWRuZXNzIG9mIHRoZSBhdWRpbyBpbiBMS0ZTIGFjY29yZGluZyB0byBJVFUtUiBCUworICAgICAgICAgICAgICAgICAgICAgICAgICAxNzcwLiBJZiBubyBsZXZlbCBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyAtMS4gKi8KKyAgU0NIQVIKKyAgZHJjUHJlc01vZGU7IC8qITwgRFJDIHByZXNlbnRhdGlvbiBtb2RlLiBBY2NvcmRpbmcgdG8gRVRTSSBUUyAxMDEgMTU0LAorICAgICAgICAgICAgICAgICAgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgd2hldGhlciAgIGxpZ2h0IChNUEVHLTQgRHluYW1pYyBSYW5nZQorICAgICAgICAgICAgICAgICAgQ29udHJvbCB0b29sKSBvciBoZWF2eSBjb21wcmVzc2lvbiAoRFZCIGhlYXZ5CisgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbikgICBkeW5hbWljIHJhbmdlIGNvbnRyb2wgc2hhbGwgdGFrZSBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgb24gdGhlIG91dHB1dHMuICAgRm9yIGRldGFpbHMsIHNlZSBFVFNJIFRTIDEwMSAxNTQsIHRhYmxlCisgICAgICAgICAgICAgICAgICBDLjMzLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBcbiAgIC0xOiBObyBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICAgICBtZXRhZGF0YSBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIFxuICAgMDogRFJDIHByZXNlbnRhdGlvbgorICAgICAgICAgICAgICAgICAgbW9kZSBub3QgaW5kaWNhdGVkIFxuICAgMTogRFJDIHByZXNlbnRhdGlvbiBtb2RlIDEgXG4gICAyOgorICAgICAgICAgICAgICAgICAgRFJDIHByZXNlbnRhdGlvbiBtb2RlIDIgXG4gICAzOiBSZXNlcnZlZCAqLwogCiB9IENTdHJlYW1JbmZvOwogCi0KLXR5cGVkZWYgc3RydWN0IEFBQ19ERUNPREVSX0lOU1RBTkNFICpIQU5ETEVfQUFDREVDT0RFUjsgIC8qITwgUG9pbnRlciB0byBhIEFBQyBkZWNvZGVyIGluc3RhbmNlLiAqLwordHlwZWRlZiBzdHJ1Y3QgQUFDX0RFQ09ERVJfSU5TVEFOQ0UKKyAgICAqSEFORExFX0FBQ0RFQ09ERVI7IC8qITwgUG9pbnRlciB0byBhIEFBQyBkZWNvZGVyIGluc3RhbmNlLiAqLwogCiAjaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKK2V4dGVybiAiQyIgewogI2VuZGlmCiAKIC8qKgpAQCAtNjA0LDI1ICs5MDgsMjMgQEAKICAqIFxwYXJhbSBzaXplICAgIFNpemUgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGJ1ZmZlci4KICAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLUxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKLWFhY0RlY29kZXJfQW5jRGF0YUluaXQgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzaXplICk7CitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfQW5jRGF0YUluaXQoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqYnVmZmVyLCBpbnQgc2l6ZSk7CiAKIC8qKgogICogXGJyaWVmIEdldCBvbmUgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudC4KICAqCiAgKiBccGFyYW0gc2VsZiAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KICAqIFxwYXJhbSBpbmRleCAgSW5kZXggb2YgdGhlIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnQgdG8gZ2V0LgotICogXHBhcmFtIHB0ciAgICBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyBhIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBhbmNpbGxhcnkgZGF0YSBlbGVtZW50LgotICogXHBhcmFtIHNpemUgICBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0ZWQgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudC4KKyAqIFxwYXJhbSBwdHIgICAgUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgYSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQKKyAqIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnQuCisgKiBccGFyYW0gc2l6ZSAgIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3RlZAorICogYW5jaWxsYXJ5IGRhdGEgZWxlbWVudC4KICAqIFxyZXR1cm4gICAgICAgRXJyb3IgY29kZS4KICAqLwotTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUgotYWFjRGVjb2Rlcl9BbmNEYXRhR2V0ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICoqcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqc2l6ZSApOworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0FuY0RhdGFHZXQoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgVUNIQVIgKipwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNpemUpOwogCiAvKioKICAqIFxicmllZiBTZXQgb25lIHNpbmdsZSBkZWNvZGVyIHBhcmFtZXRlci4KQEAgLTYzMiwxMDYgKzkzNCwxMzMgQEAKICAqIFxwYXJhbSB2YWx1ZSAgUGFyYW1ldGVyIHZhbHVlLgogICogXHJldHVybiAgICAgICBFcnJvciBjb2RlLgogICovCi1MSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCi1hYWNEZWNvZGVyX1NldFBhcmFtICggY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDREVDX1BBUkFNICAgICAgIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICB2YWx1ZSApOwotCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfU2V0UGFyYW0oY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQUNERUNfUEFSQU0gcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHZhbHVlKTsKIAogLyoqCi0gKiBcYnJpZWYgICAgICAgICAgICAgIEdldCBmcmVlIGJ5dGVzIGluc2lkZSBkZWNvZGVyIGludGVybmFsIGJ1ZmZlcgotICogXHBhcmFtIHNlbGYgICAgSGFuZGxlIG9mIEFBQyBkZWNvZGVyIGluc3RhbmNlCi0gKiBccGFyYW0gcEZyZWVCeXRlcyBQb2ludGVyIHRvIHZhcmlhYmxlIHJlY2V2aW5nIGFtb3VudCBvZiBmcmVlIGJ5dGVzIGluc2lkZSBkZWNvZGVyIGludGVybmFsIGJ1ZmZlcgotICogXHJldHVybiAgICAgICAgICAgICBFcnJvciBjb2RlCisgKiBcYnJpZWYgICAgICAgICAgICAgIEdldCBmcmVlIGJ5dGVzIGluc2lkZSBkZWNvZGVyIGludGVybmFsIGJ1ZmZlci4KKyAqIFxwYXJhbSBzZWxmICAgICAgICAgSGFuZGxlIG9mIEFBQyBkZWNvZGVyIGluc3RhbmNlLgorICogXHBhcmFtIHBGcmVlQnl0ZXMgICBQb2ludGVyIHRvIHZhcmlhYmxlIHJlY2VpdmluZyBhbW91bnQgb2YgZnJlZSBieXRlcyBpbnNpZGUKKyAqIGRlY29kZXIgaW50ZXJuYWwgYnVmZmVyLgorICogXHJldHVybiAgICAgICAgICAgICBFcnJvciBjb2RlLgogICovCiBMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCi1hYWNEZWNvZGVyX0dldEZyZWVCeXRlcyAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwRnJlZUJ5dGVzKTsKK2FhY0RlY29kZXJfR2V0RnJlZUJ5dGVzKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIHNlbGYsIFVJTlQgKnBGcmVlQnl0ZXMpOwogCiAvKioKLSAqIFxicmllZiAgICAgICAgICAgICAgIE9wZW4gYW4gQUFDIGRlY29kZXIgaW5zdGFuY2UKLSAqIFxwYXJhbSB0cmFuc3BvcnRGbXQgIFRoZSB0cmFuc3BvcnQgdHlwZSB0byBiZSB1c2VkCi0gKiBccmV0dXJuICAgICAgICAgICAgICBBQUMgZGVjb2RlciBoYW5kbGUKKyAqIFxicmllZiAgICAgICAgICAgICAgIE9wZW4gYW4gQUFDIGRlY29kZXIgaW5zdGFuY2UuCisgKiBccGFyYW0gdHJhbnNwb3J0Rm10ICBUaGUgdHJhbnNwb3J0IHR5cGUgdG8gYmUgdXNlZC4KKyAqIFxwYXJhbSBuck9mTGF5ZXJzICAgIE51bWJlciBvZiB0cmFuc3BvcnQgbGF5ZXJzLgorICogXHJldHVybiAgICAgICAgICAgICAgQUFDIGRlY29kZXIgaGFuZGxlLgogICovCi1MSU5LU1BFQ19IIEhBTkRMRV9BQUNERUNPREVSCi1hYWNEZWNvZGVyX09wZW4gKCBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQsIFVJTlQgbnJPZkxheWVycyApOworTElOS1NQRUNfSCBIQU5ETEVfQUFDREVDT0RFUiBhYWNEZWNvZGVyX09wZW4oVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBuck9mTGF5ZXJzKTsKIAogLyoqCi0gKiBcYnJpZWYgRXhwbGljaXRseSBjb25maWd1cmUgdGhlIGRlY29kZXIgYnkgcGFzc2luZyBhIHJhdyBBdWRpb1NwZWNpZmljQ29uZmlnIChBU0MpIG9yIGEgU3RyZWFtTXV4Q29uZmlnIChTTUMpLAotICogIGNvbnRhaW5lZCBpbiBhIGJpbmFyeSBidWZmZXIuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIE1QRUctNCBhbmQgUmF3IFBhY2tldHMgZmlsZSBmb3JtYXQgYml0c3RyZWFtcwotICogIGFzIHdlbGwgYXMgZm9yIExBVE0gYml0c3RyZWFtcyB3aXRoIG5vIGluLWJhbmQgU01DLiBJZiB0aGUgdHJhbnNwb3J0IGZvcm1hdCBpcyBMQVRNIHdpdGggb3Igd2l0aG91dAotICogIExPQVMsIGNvbmZpZ3VyYXRpb24gaXMgYXNzdW1lZCB0byBiZSBhbiBTTUMsIGZvciBhbGwgb3RoZXIgZmlsZSBmb3JtYXRzIGFuIEFTQy4KKyAqIFxicmllZiBFeHBsaWNpdGx5IGNvbmZpZ3VyZSB0aGUgZGVjb2RlciBieSBwYXNzaW5nIGEgcmF3IEF1ZGlvU3BlY2lmaWNDb25maWcKKyAqIChBU0MpIG9yIGEgU3RyZWFtTXV4Q29uZmlnIChTTUMpLCBjb250YWluZWQgaW4gYSBiaW5hcnkgYnVmZmVyLiBUaGlzIGlzCisgKiByZXF1aXJlZCBmb3IgTVBFRy00IGFuZCBSYXcgUGFja2V0cyBmaWxlIGZvcm1hdCBiaXRzdHJlYW1zIGFzIHdlbGwgYXMgZm9yCisgKiBMQVRNIGJpdHN0cmVhbXMgd2l0aCBubyBpbi1iYW5kIFNNQy4gSWYgdGhlIHRyYW5zcG9ydCBmb3JtYXQgaXMgTEFUTSB3aXRoIG9yCisgKiB3aXRob3V0IExPQVMsIGNvbmZpZ3VyYXRpb24gaXMgYXNzdW1lZCB0byBiZSBhbiBTTUMsIGZvciBhbGwgb3RoZXIgZmlsZQorICogZm9ybWF0cyBhbiBBU0MuCiAgKgogICogXHBhcmFtIHNlbGYgICAgQUFDIGRlY29kZXIgaGFuZGxlLgotICogXHBhcmFtIGNvbmYgICAgUG9pbnRlciB0byBhbiB1bnNpZ25lZCBjaGFyIGJ1ZmZlciBjb250YWluaW5nIHRoZSBiaW5hcnkgY29uZmlndXJhdGlvbiBidWZmZXIgKGVpdGhlciBBU0Mgb3IgU01DKS4KKyAqIFxwYXJhbSBjb25mICAgIFBvaW50ZXIgdG8gYW4gdW5zaWduZWQgY2hhciBidWZmZXIgY29udGFpbmluZyB0aGUgYmluYXJ5CisgKiBjb25maWd1cmF0aW9uIGJ1ZmZlciAoZWl0aGVyIEFTQyBvciBTTUMpLgogICogXHBhcmFtIGxlbmd0aCAgTGVuZ3RoIG9mIHRoZSBjb25maWd1cmF0aW9uIGJ1ZmZlciBpbiBieXRlcy4KICAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLUxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKLWFhY0RlY29kZXJfQ29uZmlnUmF3ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAqY29uZltdLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICBsZW5ndGhbXSApOwotCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfQ29uZmlnUmF3KEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpjb25mW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoW10pOwogCiAvKioKLSAqIFxicmllZiBGaWxsIEFBQyBkZWNvZGVyJ3MgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIHdpdGggYml0c3RyZWFtIGRhdGEgZnJvbSB0aGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgotICogIFRoZSBmdW5jdGlvbiBvbmx5IGNvcGllcyBzdWNoIGRhdGEgYXMgbG9uZyBhcyB0aGUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIgaXMgbm90IGZ1bGwuCi0gKiAgU28gaXQgZ3JhYnMgd2hhdGV2ZXIgaXQgY2FuIGZyb20gcEJ1ZmZlciBhbmQgcmV0dXJucyBpbmZvcm1hdGlvbiAoYnl0ZXNWYWxpZCkgc28gdGhhdCBhdCBhCi0gKiAgc3Vic2VxdWVudCBjYWxsIG9mICVhYWNEZWNvZGVyX0ZpbGwoKSwgdGhlIHJpZ2h0IHBvc2l0aW9uIGluIHBCdWZmZXIgY2FuIGJlIGRldGVybWluZWQgdG8KLSAqICBncmFiIHRoZSBuZXh0IGRhdGEuCisgKiBcYnJpZWYgU3VibWl0IHJhdyBJU08gYmFzZSBtZWRpYSBmaWxlIGZvcm1hdCBib3hlcyB0byBkZWNvZGVyIGZvciBwYXJzaW5nCisgKiAob25seSBzb21lIGJveCB0eXBlcyBhcmUgcmVjb2duaXplZCkuCisgKgorICogXHBhcmFtIHNlbGYgICAgQUFDIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGJ1ZmZlciAgUG9pbnRlciB0byBhbiB1bnNpZ25lZCBjaGFyIGJ1ZmZlciBjb250YWluaW5nIHRoZSBiaW5hcnkgYm94CisgKiBkYXRhIChpbmNsdWRpbmcgc2l6ZSBhbmQgdHlwZSwgY2FuIGJlIGEgc2VxdWVuY2Ugb2YgbXVsdGlwbGUgYm94ZXMpLgorICogXHBhcmFtIGxlbmd0aCAgTGVuZ3RoIG9mIHRoZSBkYXRhIGluIGJ5dGVzLgorICogXHJldHVybiAgICAgICAgRXJyb3IgY29kZS4KKyAqLworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX1Jhd0lTT0JNRkZEYXRhKEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGxlbmd0aCk7CisKKy8qKgorICogXGJyaWVmIEZpbGwgQUFDIGRlY29kZXIncyBpbnRlcm5hbCBpbnB1dCBidWZmZXIgd2l0aCBiaXRzdHJlYW0gZGF0YSBmcm9tIHRoZQorICogZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLiBUaGUgZnVuY3Rpb24gb25seSBjb3BpZXMgc3VjaCBkYXRhIGFzIGxvbmcgYXMgdGhlCisgKiBkZWNvZGVyLWludGVybmFsIGlucHV0IGJ1ZmZlciBpcyBub3QgZnVsbC4gU28gaXQgZ3JhYnMgd2hhdGV2ZXIgaXQgY2FuIGZyb20KKyAqIHBCdWZmZXIgYW5kIHJldHVybnMgaW5mb3JtYXRpb24gKGJ5dGVzVmFsaWQpIHNvIHRoYXQgYXQgYSBzdWJzZXF1ZW50IGNhbGwgb2YKKyAqICVhYWNEZWNvZGVyX0ZpbGwoKSwgdGhlIHJpZ2h0IHBvc2l0aW9uIGluIHBCdWZmZXIgY2FuIGJlIGRldGVybWluZWQgdG8gZ3JhYgorICogdGhlIG5leHQgZGF0YS4KICAqCiAgKiBccGFyYW0gc2VsZiAgICAgICAgQUFDIGRlY29kZXIgaGFuZGxlLgogICogXHBhcmFtIHBCdWZmZXIgICAgIFBvaW50ZXIgdG8gZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgotICogXHBhcmFtIGJ1ZmZlclNpemUgIFNpemUgb2YgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGJlY2F1c2UgZGVjb2Rlci1pbnRlcm5hbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgd2UgbmVlZCB0aGUgaW5mb3JtYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgdG8gcEJ1ZmZlciwgd2hlcmUgdGhlIG5leHQKLSAqICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZGF0YSBpcywgd2hpY2ggaXMgdGhlbiBmZWQgaW50byB0aGUgZGVjb2Rlci1pbnRlcm5hbCBidWZmZXIgKGFzIG11Y2gKLSAqICAgICAgICAgICAgICAgICAgICBhcyBwb3NzaWJsZSkuIE91ciBleGFtcGxlIGZyYW1ld29yayBpbXBsZW1lbnRhdGlvbiBmaWxscyB0aGUgYnVmZmVyIGF0IHBCdWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICBhZ2Fpbiwgb25jZSBpdCBjb250YWlucyBubyBhdmFpbGFibGUgdmFsaWQgYnl0ZXMgYW55bW9yZSAobWVhbmluZyBieXRlc1ZhbGlkIGVxdWFsIDApLgotICogXHBhcmFtIGJ5dGVzVmFsaWQgIE51bWJlciBvZiBiaXRzdHJlYW0gYnl0ZXMgaW4gdGhlIGV4dGVybmFsIGJpdHN0cmVhbSBidWZmZXIgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgotICogICAgICAgICAgICAgICAgICAgIGNvcGllZCBpbnRvIHRoZSBkZWNvZGVyJ3MgaW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIGlzIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnQgb2YgbmV3bHkgY29waWVkIGJ5dGVzLgorICogXHBhcmFtIGJ1ZmZlclNpemUgIFNpemUgb2YgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkCisgKiBiZWNhdXNlIGRlY29kZXItaW50ZXJuYWxseSB3ZSBuZWVkIHRoZSBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCB0bworICogcEJ1ZmZlciwgd2hlcmUgdGhlIG5leHQgYXZhaWxhYmxlIGRhdGEgaXMsIHdoaWNoIGlzIHRoZW4KKyAqIGZlZCBpbnRvIHRoZSBkZWNvZGVyLWludGVybmFsIGJ1ZmZlciAoYXMgbXVjaCBhcworICogcG9zc2libGUpLiBPdXIgZXhhbXBsZSBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb24gZmlsbHMgdGhlCisgKiBidWZmZXIgYXQgcEJ1ZmZlciBhZ2Fpbiwgb25jZSBpdCBjb250YWlucyBubyBhdmFpbGFibGUgdmFsaWQgYnl0ZXMgYW55bW9yZQorICogKG1lYW5pbmcgYnl0ZXNWYWxpZCBlcXVhbCAwKS4KKyAqIFxwYXJhbSBieXRlc1ZhbGlkICBOdW1iZXIgb2YgYml0c3RyZWFtIGJ5dGVzIGluIHRoZSBleHRlcm5hbCBiaXRzdHJlYW0gYnVmZmVyCisgKiB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvcGllZCBpbnRvIHRoZSBkZWNvZGVyJ3MgaW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciBieQorICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBUaGUgdmFsdWUgaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8KKyAqIHRoZSBhbW91bnQgb2YgbmV3bHkgY29waWVkIGJ5dGVzLgogICogXHJldHVybiAgICAgICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLUxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKLWFhY0RlY29kZXJfRmlsbCAoIEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAotICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgKnBCdWZmZXJbXSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBidWZmZXJTaXplW10sCi0gICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAqYnl0ZXNWYWxpZCApOworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0ZpbGwoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwQnVmZmVyW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGJ1ZmZlclNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKmJ5dGVzVmFsaWQpOwogCi0jZGVmaW5lIEFBQ0RFQ19DT05DRUFMICAxIC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBUcmlnZ2VyIHRoZSBidWlsdC1pbiBlcnJvciBjb25jZWFsbWVudCBtb2R1bGUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZ2VuZXJhdGUgYSBzdWJzdGl0dXRlIHNpZ25hbCBmb3Igb25lIGxvc3QgZnJhbWUuIE5ldyBpbnB1dCBkYXRhIHdpbGwgbm90IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zaWRlcmVkLiAqLwotI2RlZmluZSBBQUNERUNfRkxVU0ggICAgMiAvKiE8IEZsYWcgZm9yIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKTogRmx1c2ggYWxsIGZpbHRlcmJhbmtzIHRvIGdldCBhbGwgZGVsYXllZCBhdWRpbyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGhhdmluZyBuZXcgaW5wdXQgZGF0YS4gVGh1cyBuZXcgaW5wdXQgZGF0YSB3aWxsIG5vdCBiZSBjb25zaWRlcmVkLiovCi0jZGVmaW5lIEFBQ0RFQ19JTlRSICAgICA0IC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBTaWduYWwgYW4gaW5wdXQgYml0IHN0cmVhbSBkYXRhIGRpc2NvbnRpbnVpdHkuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3luYyBhbnkgaW50ZXJuYWxzIGFzIG5lY2Vzc2FyeS4gKi8KLSNkZWZpbmUgQUFDREVDX0NMUkhJU1QgIDggLyohPCBGbGFnIGZvciBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCk6IENsZWFyIGFsbCBzaWduYWwgZGVsYXkgbGluZXMgYW5kIGhpc3RvcnkgYnVmZmVycy5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVVUSU9OOiBUaGlzIGNhbiBjYXVzZSBkaXNjb250aW51aXRpZXMgaW4gdGhlIG91dHB1dCBzaWduYWwuICovCisjZGVmaW5lIEFBQ0RFQ19DT05DRUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDEgLyohPCBGbGFnIGZvciBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCk6IFRyaWdnZXIgdGhlIGJ1aWx0LWluIGVycm9yICAgICAgICBcCisgICAgICAgY29uY2VhbG1lbnQgbW9kdWxlIHRvIGdlbmVyYXRlIGEgc3Vic3RpdHV0ZSBzaWduYWwgZm9yIG9uZSBsb3N0IGZyYW1lLiBcCisgICAgICAgTmV3IGlucHV0IGRhdGEgd2lsbCBub3QgYmUgY29uc2lkZXJlZC4gKi8KKyNkZWZpbmUgQUFDREVDX0ZMVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAyIC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBGbHVzaCBhbGwgZmlsdGVyYmFua3MgdG8gZ2V0IGFsbCBcCisgICAgICAgZGVsYXllZCBhdWRpbyB3aXRob3V0IGhhdmluZyBuZXcgaW5wdXQgZGF0YS4gVGh1cyBuZXcgaW5wdXQgZGF0YSB3aWxsIFwKKyAgICAgICBub3QgYmUgY29uc2lkZXJlZC4qLworI2RlZmluZSBBQUNERUNfSU5UUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgNCAvKiE8IEZsYWcgZm9yIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKTogU2lnbmFsIGFuIGlucHV0IGJpdCBzdHJlYW0gZGF0YSBcCisgICAgICAgZGlzY29udGludWl0eS4gUmVzeW5jIGFueSBpbnRlcm5hbHMgYXMgbmVjZXNzYXJ5LiAqLworI2RlZmluZSBBQUNERUNfQ0xSSElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA4IC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBDbGVhciBhbGwgc2lnbmFsIGRlbGF5IGxpbmVzIGFuZCAgXAorICAgICAgIGhpc3RvcnkgYnVmZmVycy4gQ0FVVElPTjogVGhpcyBjYW4gY2F1c2UgZGlzY29udGludWl0aWVzIGluIHRoZSBvdXRwdXQgXAorICAgICAgIHNpZ25hbC4gKi8KIAogLyoqCi0gKiBcYnJpZWYgICAgICAgICAgICBEZWNvZGUgb25lIGF1ZGlvIGZyYW1lCisgKiBcYnJpZWYgICAgICAgICAgICAgICBEZWNvZGUgb25lIGF1ZGlvIGZyYW1lCiAgKgotICogXHBhcmFtIHNlbGYgICAgICAgQUFDIGRlY29kZXIgaGFuZGxlLgotICogXHBhcmFtIHBUaW1lRGF0YSAgUG9pbnRlciB0byBleHRlcm5hbCBvdXRwdXQgYnVmZmVyIHdoZXJlIHRoZSBkZWNvZGVkIFBDTSBzYW1wbGVzIHdpbGwgYmUgc3RvcmVkIGludG8uCi0gKiBccGFyYW0gZmxhZ3MgICAgICBCaXQgZmllbGQgd2l0aCBmbGFncyBmb3IgdGhlIGRlY29kZXI6IFxuCi0gKiAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBQUNERUNfQ09OQ0VBTCkgPT0gMTogRG8gY29uY2VhbG1lbnQuIFxuCi0gKiAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBQUNERUNfRkxVU0gpID09IDI6IERpc2NhcmQgaW5wdXQgZGF0YS4gRmx1c2ggZmlsdGVyIGJhbmtzIChvdXRwdXQgZGVsYXllZCBhdWRpbykuIFxuCi0gKiAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBQUNERUNfSU5UUikgPT0gNDogSW5wdXQgZGF0YSBpcyBkaXNjb250aW51b3VzLiBSZXN5bmNocm9uaXplIGFueSBpbnRlcm5hbHMgYXMgbmVjZXNzYXJ5LgotICogXHJldHVybiAgICAgICAgICAgRXJyb3IgY29kZS4KKyAqIFxwYXJhbSBzZWxmICAgICAgICAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBwVGltZURhdGEgICAgIFBvaW50ZXIgdG8gZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlciB3aGVyZSB0aGUgZGVjb2RlZCBQQ00KKyAqIHNhbXBsZXMgd2lsbCBiZSBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSB0aW1lRGF0YVNpemUgIFNpemUgb2YgZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlci4KKyAqIFxwYXJhbSBmbGFncyAgICAgICAgIEJpdCBmaWVsZCB3aXRoIGZsYWdzIGZvciB0aGUgZGVjb2RlcjogXG4KKyAqICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSA9PSAxOiBEbyBjb25jZWFsbWVudC4gXG4KKyAqICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19GTFVTSCkgPT0gMjogRGlzY2FyZCBpbnB1dCBkYXRhLiBGbHVzaAorICogZmlsdGVyIGJhbmtzIChvdXRwdXQgZGVsYXllZCBhdWRpbykuIFxuIChmbGFncyAmIEFBQ0RFQ19JTlRSKSA9PSA0OiBJbnB1dAorICogZGF0YSBpcyBkaXNjb250aW51b3VzLiBSZXN5bmNocm9uaXplIGFueSBpbnRlcm5hbHMgYXMKKyAqIG5lY2Vzc2FyeS4gXG4gKGZsYWdzICYgQUFDREVDX0NMUkhJU1QpID09IDg6IENsZWFyIGFsbCBzaWduYWwgZGVsYXkgbGluZXMgYW5kCisgKiBoaXN0b3J5IGJ1ZmZlcnMuCisgKiBccmV0dXJuICAgICAgICAgICAgICBFcnJvciBjb2RlLgogICovCi1MSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCi1hYWNEZWNvZGVyX0RlY29kZUZyYW1lICggSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICAgKnBUaW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgdGltZURhdGFTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBmbGFncyApOworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqcFRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB0aW1lRGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7CiAKIC8qKgogICogXGJyaWVmICAgICAgIERlLWFsbG9jYXRlIGFsbCByZXNvdXJjZXMgb2YgYW4gQUFDIGRlY29kZXIgaW5zdGFuY2UuCiAgKgogICogXHBhcmFtIHNlbGYgIEFBQyBkZWNvZGVyIGhhbmRsZS4KLSAqIFxyZXR1cm4gICAgICB2b2lkCisgKiBccmV0dXJuICAgICAgdm9pZC4KICAqLwotTElOS1NQRUNfSCB2b2lkIGFhY0RlY29kZXJfQ2xvc2UgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICk7CitMSU5LU1BFQ19IIHZvaWQgYWFjRGVjb2Rlcl9DbG9zZShIQU5ETEVfQUFDREVDT0RFUiBzZWxmKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgR2V0IENTdHJlYW1JbmZvIGhhbmRsZSBmcm9tIGRlY29kZXIuCkBAIC03MzksMTYgKzEwNjgsMTUgQEAKICAqIFxwYXJhbSBzZWxmICBBQUMgZGVjb2RlciBoYW5kbGUuCiAgKiBccmV0dXJuICAgICAgUmVmZXJlbmNlIHRvIHJlcXVlc3RlZCBDU3RyZWFtSW5mby4KICAqLwotTElOS1NQRUNfSCBDU3RyZWFtSW5mbyogYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICk7CitMSU5LU1BFQ19IIENTdHJlYW1JbmZvICphYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oSEFORExFX0FBQ0RFQ09ERVIgc2VsZik7CiAKIC8qKgogICogXGJyaWVmICAgICAgIEdldCBkZWNvZGVyIGxpYnJhcnkgaW5mby4KICAqCiAgKiBccGFyYW0gaW5mbyAgUG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgTElCX0lORk8gc3RydWN0dXJlLgotICogXHJldHVybiAgICAgIDAgb24gc3VjY2VzcworICogXHJldHVybiAgICAgIDAgb24gc3VjY2Vzcy4KICAqLwotTElOS1NQRUNfSCBJTlQgYWFjRGVjb2Rlcl9HZXRMaWJJbmZvKCBMSUJfSU5GTyAqaW5mbyApOwotCitMSU5LU1BFQ19IIElOVCBhYWNEZWNvZGVyX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvRkRLX2RlbGF5LmNwcCBiL2xpYkFBQ2RlYy9zcmMvRkRLX2RlbGF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWIxYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy9GREtfZGVsYXkuY3BwCkBAIC0wLDAgKzEsMTczIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBIaWxkZW5icmFuZAorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkZES19kZWxheS5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworI2RlZmluZSBNQVhfRlJBTUVfTEVOR1RIICgxMDI0KQorCitJTlQgRkRLX0RlbGF5X0NyZWF0ZShGREtfU2lnbmFsRGVsYXkqIGRhdGEsIGNvbnN0IFVTSE9SVCBkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIG51bV9jaGFubmVscykgeworICBGREtfQVNTRVJUKGRhdGEgIT0gTlVMTCk7CisgIEZES19BU1NFUlQobnVtX2NoYW5uZWxzID4gMCk7CisKKyAgaWYgKGRlbGF5ID4gMCkgeworICAgIGRhdGEtPmRlbGF5X2xpbmUgPQorICAgICAgICAoSU5UX1BDTSopRkRLY2FsbG9jKG51bV9jaGFubmVscyAqIGRlbGF5LCBzaXplb2YoSU5UX1BDTSkpOworICAgIGlmIChkYXRhLT5kZWxheV9saW5lID09IE5VTEwpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZGF0YS0+ZGVsYXlfbGluZSA9IE5VTEw7CisgIH0KKyAgZGF0YS0+bnVtX2NoYW5uZWxzID0gbnVtX2NoYW5uZWxzOworICBkYXRhLT5kZWxheSA9IGRlbGF5OworCisgIHJldHVybiAwOworfQorCit2b2lkIEZES19EZWxheV9BcHBseShGREtfU2lnbmFsRGVsYXkqIGRhdGEsIEZJWFBfUENNKiB0aW1lX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZnJhbWVfbGVuZ3RoLCBjb25zdCBVQ0hBUiBjaGFubmVsKSB7CisgIEZES19BU1NFUlQoZGF0YSAhPSBOVUxMKTsKKworICBpZiAoZGF0YS0+ZGVsYXkgPiAwKSB7CisgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcCwgRklYUF9QQ00sIE1BWF9GUkFNRV9MRU5HVEgpCisgICAgRkRLX0FTU0VSVChmcmFtZV9sZW5ndGggPD0gTUFYX0ZSQU1FX0xFTkdUSCk7CisgICAgRkRLX0FTU0VSVChjaGFubmVsIDwgZGF0YS0+bnVtX2NoYW5uZWxzKTsKKyAgICBGREtfQVNTRVJUKHRpbWVfYnVmZmVyICE9IE5VTEwpOworICAgIGlmIChmcmFtZV9sZW5ndGggPj0gZGF0YS0+ZGVsYXkpIHsKKyAgICAgIEZES21lbWNweSh0bXAsICZ0aW1lX2J1ZmZlcltmcmFtZV9sZW5ndGggLSBkYXRhLT5kZWxheV0sCisgICAgICAgICAgICAgICAgZGF0YS0+ZGVsYXkgKiBzaXplb2YoRklYUF9QQ00pKTsKKyAgICAgIEZES21lbW1vdmUoJnRpbWVfYnVmZmVyW2RhdGEtPmRlbGF5XSwgJnRpbWVfYnVmZmVyWzBdLAorICAgICAgICAgICAgICAgICAoZnJhbWVfbGVuZ3RoIC0gZGF0YS0+ZGVsYXkpICogc2l6ZW9mKEZJWFBfUENNKSk7CisgICAgICBGREttZW1jcHkoJnRpbWVfYnVmZmVyWzBdLCAmZGF0YS0+ZGVsYXlfbGluZVtjaGFubmVsICogZGF0YS0+ZGVsYXldLAorICAgICAgICAgICAgICAgIGRhdGEtPmRlbGF5ICogc2l6ZW9mKEZJWFBfUENNKSk7CisgICAgICBGREttZW1jcHkoJmRhdGEtPmRlbGF5X2xpbmVbY2hhbm5lbCAqIGRhdGEtPmRlbGF5XSwgdG1wLAorICAgICAgICAgICAgICAgIGRhdGEtPmRlbGF5ICogc2l6ZW9mKEZJWFBfUENNKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZES21lbWNweSh0bXAsICZ0aW1lX2J1ZmZlclswXSwgZnJhbWVfbGVuZ3RoICogc2l6ZW9mKEZJWFBfUENNKSk7CisgICAgICBGREttZW1jcHkoJnRpbWVfYnVmZmVyWzBdLCAmZGF0YS0+ZGVsYXlfbGluZVtjaGFubmVsICogZGF0YS0+ZGVsYXldLAorICAgICAgICAgICAgICAgIGZyYW1lX2xlbmd0aCAqIHNpemVvZihGSVhQX1BDTSkpOworICAgICAgRkRLbWVtY3B5KCZkYXRhLT5kZWxheV9saW5lW2NoYW5uZWwgKiBkYXRhLT5kZWxheV0sCisgICAgICAgICAgICAgICAgJmRhdGEtPmRlbGF5X2xpbmVbY2hhbm5lbCAqIGRhdGEtPmRlbGF5ICsgZnJhbWVfbGVuZ3RoXSwKKyAgICAgICAgICAgICAgICAoZGF0YS0+ZGVsYXkgLSBmcmFtZV9sZW5ndGgpICogc2l6ZW9mKEZJWFBfUENNKSk7CisgICAgICBGREttZW1jcHkoJmRhdGEtPmRlbGF5X2xpbmVbY2hhbm5lbCAqIGRhdGEtPmRlbGF5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YS0+ZGVsYXkgLSBmcmFtZV9sZW5ndGgpXSwKKyAgICAgICAgICAgICAgICB0bXAsIGZyYW1lX2xlbmd0aCAqIHNpemVvZihGSVhQX1BDTSkpOworICAgIH0KKyAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcCwgRklYUF9QQ00sIE1BWF9GUkFNRV9MRU5HVEgpCisgIH0KKworICByZXR1cm47Cit9CisKK3ZvaWQgRkRLX0RlbGF5X0Rlc3Ryb3koRkRLX1NpZ25hbERlbGF5KiBkYXRhKSB7CisgIGlmIChkYXRhLT5kZWxheV9saW5lICE9IE5VTEwpIHsKKyAgICBGREtmcmVlKGRhdGEtPmRlbGF5X2xpbmUpOworICB9CisgIGRhdGEtPmRlbGF5X2xpbmUgPSBOVUxMOworICBkYXRhLT5kZWxheSA9IDA7CisgIGRhdGEtPm51bV9jaGFubmVscyA9IDA7CisKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9GREtfZGVsYXkuaCBiL2xpYkFBQ2RlYy9zcmMvRkRLX2RlbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5YzNhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvRkRLX2RlbGF5LmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZES19ERUxBWV9ICisjZGVmaW5lIEZES19ERUxBWV9ICisKKyNpbmNsdWRlICJhYWNfcm9tLmgiCisKKy8qKgorICogU3RydWN0dXJlIHJlcHJlc2VudGluZyBvbmUgZGVsYXkgZWxlbWVudCBmb3IgbXVsdGlwbGUgY2hhbm5lbHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UX1BDTSogZGVsYXlfbGluZTsgLyohPCBQb2ludGVyIHdoaWNoIHN0b3JlcyBhbGxvY2F0ZWQgZGVsYXkgbGluZS4gKi8KKyAgVVNIT1JUIGRlbGF5OyAgICAgICAgLyohPCBEZWxheSByZXF1aXJlZCBpbiBzYW1wbGVzIChwZXIgY2hhbm5lbCkuICovCisgIFVDSEFSIG51bV9jaGFubmVsczsgIC8qITwgTnVtYmVyIG9mIGNoYW5uZWxzIHRvIGRlbGF5LiAqLworfSBGREtfU2lnbmFsRGVsYXk7CisKKy8qKgorICogXGJyaWVmIENyZWF0ZSBkZWxheSBlbGVtZW50IGZvciBtdWx0aXBsZSBjaGFubmVscyB3aXRoIGZpeGVkIGRlbGF5IHZhbHVlLgorICoKKyAqIFxwYXJhbSBkYXRhIFBvaW50ZXIgZGVsYXkgZWxlbWVudCBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gZGVsYXkgUmVxdWlyZWQgZGVsYXkgdmFsdWUgaW4gc2FtcGxlcyBwZXIgY2hhbm5lbC4KKyAqIFxwYXJhbSBudW1fY2hhbm5lbHMgUmVxdWlyZWQgbnVtYmVyIG9mIGNoYW5uZWxzLgorICoKKyAqIFxyZXR1cm4gLTEgb24gb3V0IG9mIG1lbW9yeSwgZWxzZSAwCisgKi8KK0lOVCBGREtfRGVsYXlfQ3JlYXRlKEZES19TaWduYWxEZWxheSogZGF0YSwgY29uc3QgVVNIT1JUIGRlbGF5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgbnVtX2NoYW5uZWxzKTsKKworLyoqCisgKiBcYnJpZWYgQXBwbHkgZGVsYXkgdG8gb25lIGNoYW5uZWwgKG5vbi1pbnRlcmxlYXZlZCBzdG9yYWdlIGFzc3VtZWQpLgorICoKKyAqIFxwYXJhbSBkYXRhIFBvaW50ZXIgZGVsYXkgZWxlbWVudCBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gdGltZV9idWZmZXIgUG9pbnRlciB0byBzaWduYWwgdG8gZGVsYXkuCisgKiBccGFyYW0gZnJhbWVfbGVuZ3RoIEZyYW1lIGxlbmd0aCBvZiBpbnB1dC9vdXRwdXQgc2lnbmFsIChuZWVkcyB0byBiZSA+PQorICogZGVsYXkpLgorICogXHBhcmFtIGNoYW5uZWwgSW5kZXggb2YgY3VycmVudCBjaGFubmVsICgwIDw9IGNoYW5uZWwgPCBudW1fY2hhbm5lbHMpLgorICoKKyAqIFxyZXR1cm4gdm9pZAorICovCit2b2lkIEZES19EZWxheV9BcHBseShGREtfU2lnbmFsRGVsYXkqIGRhdGEsIEZJWFBfUENNKiB0aW1lX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZnJhbWVfbGVuZ3RoLCBjb25zdCBVQ0hBUiBjaGFubmVsKTsKKworLyoqCisgKiBcYnJpZWYgRGVzdHJveSBkZWxheSBlbGVtZW50LgorICoKKyAqIFxwYXJhbSBkYXRhIFBvaW50ZXIgZGVsYXkgZWxlbWVudCBzdHJ1Y3R1cmUuCisgKgorICogXHJldHVybiB2b2lkCisgKi8KK3ZvaWQgRkRLX0RlbGF5X0Rlc3Ryb3koRkRLX1NpZ25hbERlbGF5KiBkYXRhKTsKKworI2VuZGlmIC8qICNpZm5kZWYgRkRLX0RFTEFZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjX3JhbS5jcHAgYi9saWJBQUNkZWMvc3JjL2FhY19yYW0uY3BwCmluZGV4IDFmZjI4OWIuLmUxMzE2N2QgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjX3JhbS5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNfcmFtLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMyArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogSm9zZWYgSG9lcGZsCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYWFjX3JhbS5oIgogI2luY2x1ZGUgImFhY19yb20uaCIKQEAgLTkzLDEwICsxMDYsMTcgQEAKICNkZWZpbmUgV09SS0JVRkZFUjFfVEFHIDAKICNkZWZpbmUgV09SS0JVRkZFUjJfVEFHIDEKIAotLyohIFRoZSBzdHJ1Y3R1cmUgQUFDX0RFQ09ERVJfSU5TVEFOQ0UgaXMgdGhlIHRvcCBsZXZlbCBzdHJ1Y3R1cmUgaG9sZGluZyBhbGwgZGVjb2RlciBjb25maWd1cmF0aW9ucywKLSAgICBoYW5kbGVzIGFuZCBzdHJ1Y3RzLgorI2RlZmluZSBXT1JLQlVGRkVSM19UQUcgNAorI2RlZmluZSBXT1JLQlVGRkVSNF9UQUcgNQorCisjZGVmaW5lIFdPUktCVUZGRVI1X1RBRyA2CisKKyNkZWZpbmUgV09SS0JVRkZFUjZfVEFHIDcKKworLyohIFRoZSBzdHJ1Y3R1cmUgQUFDX0RFQ09ERVJfSU5TVEFOQ0UgaXMgdGhlIHRvcCBsZXZlbCBzdHJ1Y3R1cmUgaG9sZGluZyBhbGwKKyAgIGRlY29kZXIgY29uZmlndXJhdGlvbnMsIGhhbmRsZXMgYW5kIHN0cnVjdHMuCiAgKi8KLUNfQUxMT0NfTUVNKEFhY0RlY29kZXIsIEFBQ19ERUNPREVSX0lOU1RBTkNFLCAxKQorQ19BTExPQ19NRU0oQWFjRGVjb2Rlciwgc3RydWN0IEFBQ19ERUNPREVSX0lOU1RBTkNFLCAxKQogCiAvKiEKICAgXG5hbWUgU3RhdGljQWFjRGF0YQpAQCAtMTA1LDIxICsxMjUsMzYgQEAKICovCiAvKiBAeyAqLwogCi0vKiEgVGhlIHN0cnVjdHVyZSBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvIGNvbnRhaW5zIHRoZSBzdGF0aWMgc2lkZWluZm8gd2hpY2ggaXMgbmVlZGVkCi0gICAgZm9yIHRoZSBkZWNvZGluZyBvZiBvbmUgYWFjIGNoYW5uZWwuIDxicj4KLSAgICBEaW1lbnNpb246ICNBYWNEZWNvZGVyQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyohIFRoZSBzdHJ1Y3R1cmUgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyBjb250YWlucyB0aGUgc3RhdGljIHNpZGVpbmZvCisgICB3aGljaCBpcyBuZWVkZWQgZm9yIHRoZSBkZWNvZGluZyBvZiBvbmUgYWFjIGNoYW5uZWwuIDxicj4gRGltZW5zaW9uOgorICAgI0FhY0RlY29kZXJDaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiBDX0FMTE9DX01FTTIoQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCAxLCAoOCkpCiAKLS8qISBUaGUgc3RydWN0dXJlIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gY29udGFpbnMgdGhlIGR5bmFtaWMgc2lkZWluZm8gd2hpY2ggaXMgbmVlZGVkCi0gICAgZm9yIHRoZSBkZWNvZGluZyBvZiBvbmUgYWFjIGNoYW5uZWwuIDxicj4KLSAgICBEaW1lbnNpb246ICNBYWNEZWNvZGVyQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyohIFRoZSBzdHJ1Y3R1cmUgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyBjb250YWlucyB0aGUgZHluYW1pYyBzaWRlaW5mbyB3aGljaCBpcworICAgbmVlZGVkIGZvciB0aGUgZGVjb2Rpbmcgb2Ygb25lIGFhYyBjaGFubmVsLiA8YnI+IERpbWVuc2lvbjoKKyAgICNBYWNEZWNvZGVyQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogQ19BQUxMT0NfTUVNMihBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIDEsICg4KSkKIAogLyohIE92ZXJsYXAgYnVmZmVyICovCi1DX0FMTE9DX01FTTIoT3ZlcmxhcEJ1ZmZlciwgRklYUF9EQkwsIE92ZXJsYXBCdWZmZXJTaXplLCAoOCkpCitDX0FBTExPQ19NRU0yKE92ZXJsYXBCdWZmZXIsIEZJWFBfREJMLCBPdmVybGFwQnVmZmVyU2l6ZSwgKDgpKQogCiBDX0FMTE9DX01FTShEcmNJbmZvLCBDRHJjSW5mbywgMSkKIAorLyohIFRoZSBzdHJ1Y3R1cmUgQ3BlUGVyc2lzdGVudERhdGEgaG9sZHMgdGhlIHBlcnNpc3RlbnQgZGF0YSBzaGFyZWQgYnkgYm90aAorICAgY2hhbm5lbHMgb2YgYSBDUEUuIDxicj4gSXQgbmVlZHMgdG8gYmUgYWxsb2NhdGVkIGZvciBlYWNoIENQRS4gPGJyPgorICAgIERpbWVuc2lvbjogMSAqLworQ19BTExPQ19NRU0oQ3BlUGVyc2lzdGVudERhdGEsIENwZVBlcnNpc3RlbnREYXRhLCAxKQorCisvKiEgVGhlIHN0cnVjdHVyZSBDQ3BseFByZWRpY3Rpb25EYXRhIGhvbGRzIGRhdGEgZm9yIGNvbXBsZXggc3RlcmVvIHByZWRpY3Rpb24uCisgICA8YnI+IERpbWVuc2lvbjogMQorICovCitDX0FMTE9DX01FTShDcGx4UHJlZGljdGlvbkRhdGEsIENDcGx4UHJlZGljdGlvbkRhdGEsIDEpCisKKy8qISBUaGUgYnVmZmVyIGhvbGRzIHRpbWUgc2FtcGxlcyBmb3IgdGhlIGNyb3NzZmFkZSBpbiBjYXNlIG9mIGFuIFVTQUMgREFTSCBJUEYKKyAgIGNvbmZpZyBjaGFuZ2UgRGltZW5zaW9uOiAoOCkKKyAqLworQ19BTExPQ19NRU0yKFRpbWVEYXRhRmx1c2gsIElOVF9QQ00sIFRJTUVfREFUQV9GTFVTSF9TSVpFLCAoOCkpCisKIC8qIEB9ICovCiAKIC8qIQpAQCAtMTI4LDE1ICsxNjMsMjMgQEAKICAgRHluYW1pYyBtZW1vcnkgYXJlYXMsIG1pZ2h0IGJlIHJldXNlZCBpbiBvdGhlciBhbGdvcml0aG0gc2VjdGlvbnMsCiAgIGUuZy4gdGhlIHNiciBkZWNvZGVyCiAqLwotQ19BTExPQ19NRU1fT1ZFUkxBWShXb3JrQnVmZmVyQ29yZTIsIEZJWFBfREJMLCAoKDgpKjEwMjQpLCBTRUNUX0RBVEFfTDIsIFdPUktCVUZGRVIyX1RBRykKIAorLyogVGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gdG8gbWFrZSB1c2Ugb2YgdGhlIFdvcmtCdWZmZXJDb3JlWzMvNF0gZm9yIGRlY29kZXIKKyAqIGNvbmZpZ3VyYXRpb25zIHdpdGggbW9yZSB0aGFuIDIgY2hhbm5lbHMgKi8KK0NfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmUyLCBGSVhQX0RCTCwgKCg4KSAqIDEwMjQpLCBTRUNUX0RBVEFfTDIsCisgICAgICAgICAgICAgICAgICAgIFdPUktCVUZGRVIyX1RBRykKIAotQ19BTExPQ19NRU1fT1ZFUkxBWShXb3JrQnVmZmVyQ29yZTEsIENXb3JrQnVmZmVyQ29yZTEsIDEsIFNFQ1RfREFUQV9MMSwgV09SS0JVRkZFUjFfVEFHKQorQ19BTExPQ19NRU1fT1ZFUkxBWShXb3JrQnVmZmVyQ29yZTMsIEZJWFBfREJMLCBXQl9TRUNUSU9OX1NJWkUsIFNFQ1RfREFUQV9MMiwKKyAgICAgICAgICAgICAgICAgICAgV09SS0JVRkZFUjNfVEFHKQorQ19BQUxMT0NfTUVNKFdvcmtCdWZmZXJDb3JlNCwgRklYUF9EQkwsIFdCX1NFQ1RJT05fU0laRSkKK0NfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmU2LCBTQ0hBUiwKKyAgICAgICAgICAgICAgICAgICAgZk1heCgoSU5UKShzaXplb2YoRklYUF9EQkwpICogV0JfU0VDVElPTl9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKXNpemVvZihDQWFjRGVjb2RlckNvbW1vbkRhdGEpKSwKKyAgICAgICAgICAgICAgICAgICAgU0VDVF9EQVRBX0wyLCBXT1JLQlVGRkVSNl9UQUcpCiAKLS8qIEB7ICovCitDX0FMTE9DX01FTV9PVkVSTEFZKFdvcmtCdWZmZXJDb3JlMSwgQ1dvcmtCdWZmZXJDb3JlMSwgMSwgU0VDVF9EQVRBX0wxLAorICAgICAgICAgICAgICAgICAgICBXT1JLQlVGRkVSMV9UQUcpCiAKLQotLyogQH0gKi8KLQotCi0KKy8qIGRvdWJsZSBidWZmZXIgc2l6ZSBuZWVkZWQgZm9yIGRlLS9pbnRlcmxlYXZpbmcgKi8KK0NfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmU1LCBQQ01fREVDLCAoOCkgKiAoMTAyNCAqIDQpICogMiwKKyAgICAgICAgICAgICAgICAgICAgU0VDVF9EQVRBX0VYVEVSTiwgV09SS0JVRkZFUjVfVEFHKQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNfcmFtLmggYi9saWJBQUNkZWMvc3JjL2FhY19yYW0uaAppbmRleCA0NTI3ZTI3Li5hODYxZTI1IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY19yYW0uaAorKysgYi9saWJBQUNkZWMvc3JjL2FhY19yYW0uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgQUFDX1JBTV9ICiAjZGVmaW5lIEFBQ19SQU1fSApAQCAtOTcsMTMgKzEwOSwxNSBAQAogCiAjaW5jbHVkZSAiY2hhbm5lbC5oIgogCisjaW5jbHVkZSAiYWNfYXJpdGhfY29kZXIuaCIKKwogI2luY2x1ZGUgImFhY2RlY19oY3JfdHlwZXMuaCIKICNpbmNsdWRlICJhYWNkZWNfaGNyLmgiCiAKIC8qIEVuZCBvZiBmb3JtYWwgZml4LmggKi8KIAotI2RlZmluZSBNQVhfU1lOQ0hTICAgICAgICAxMAotI2RlZmluZSBTQU1QTF9GUkVRUyAgICAgICAxMgorI2RlZmluZSBNQVhfU1lOQ0hTIDEwCisjZGVmaW5lIFNBTVBMX0ZSRVFTIDEyCiAKIEhfQUxMT0NfTUVNKEFhY0RlY29kZXIsIEFBQ19ERUNPREVSX0lOU1RBTkNFKQogCkBAIC0xMTMsOCArMTI3LDIxIEBACiBIX0FMTE9DX01FTShBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8pCiBIX0FMTE9DX01FTShPdmVybGFwQnVmZmVyLCBGSVhQX0RCTCkKIAorSF9BTExPQ19NRU0oQ3BlUGVyc2lzdGVudERhdGEsIENwZVBlcnNpc3RlbnREYXRhKQorSF9BTExPQ19NRU0oQ3BseFByZWRpY3Rpb25EYXRhLCBDQ3BseFByZWRpY3Rpb25EYXRhKQorSF9BTExPQ19NRU0oU3BlY3RyYWxDb2VmZnMsIEZJWFBfREJMKQorSF9BTExPQ19NRU0oU3BlY1NjYWxlLCBTSE9SVCkKKworSF9BTExPQ19NRU0oVGltZURhdGFGbHVzaCwgSU5UX1BDTSkKKwogSF9BTExPQ19NRU1fT1ZFUkxBWShXb3JrQnVmZmVyQ29yZTEsIENXb3JrQnVmZmVyQ29yZTEpCiBIX0FMTE9DX01FTV9PVkVSTEFZKFdvcmtCdWZmZXJDb3JlMiwgRklYUF9EQkwpCiAKK0hfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmUzLCBGSVhQX0RCTCkKK0hfQUxMT0NfTUVNKFdvcmtCdWZmZXJDb3JlNCwgRklYUF9EQkwpCisKK0hfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmU1LCBQQ01fREVDKQorCitIX0FMTE9DX01FTV9PVkVSTEFZKFdvcmtCdWZmZXJDb3JlNiwgU0NIQVIpCiAKICNlbmRpZiAvKiAjaWZuZGVmIEFBQ19SQU1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNfcm9tLmNwcCBiL2xpYkFBQ2RlYy9zcmMvYWFjX3JvbS5jcHAKaW5kZXggZjNjOWI1YS4uY2JkZmZjNCAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNfcm9tLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY19yb20uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQwNCArOTAsNDMzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsLCBUb2JpYXMgQ2hhbHVwa2EKKwogICAgRGVzY3JpcHRpb246IERlZmluaXRpb24gb2YgY29uc3RhbnQgdGFibGVzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJhYWNfcm9tLmgiCiAKLQogLyogUHJlc2NhbGUgSW52ZXJzZVF1YW50VGFibGUgYnkgNCB0byBzYXZlCiAgICByZWR1bmRhbnQgc2hpZnRzIGluIGludmVycyBxdWFudGl6YXRpb24KICAqLwotI2RlZmluZSBTQ0xfVEFCKGEpIChhPj40KQotY29uc3QgRklYUF9EQkwgSW52ZXJzZVF1YW50VGFibGUgW0lOVl9RVUFOVF9UQUJMRVNJWkUgKyAxXSA9Ci17Ci0gIFNDTF9UQUIoMHgzMkNCRkQ0MCksIFNDTF9UQUIoMHgzMzBGQzM0MCksIFNDTF9UQUIoMHgzMzUzOUZDMCksIFNDTF9UQUIoMHgzMzk3OTI4MCksIFNDTF9UQUIoMHgzM0RCOUJDMCksIFNDTF9UQUIoMHgzNDFGQkI4MCksIFNDTF9UQUIoMHgzNDYzRjE4MCksIFNDTF9UQUIoMHgzNEE4M0RDMCksCi0gIFNDTF9UQUIoMHgzNEVDQTAwMCksIFNDTF9UQUIoMHgzNTMxMTg4MCksIFNDTF9UQUIoMHgzNTc1QTcwMCksIFNDTF9UQUIoMHgzNUJBNEI4MCksIFNDTF9UQUIoMHgzNUZGMDYwMCksIFNDTF9UQUIoMHgzNjQzRDY4MCksIFNDTF9UQUIoMHgzNjg4QkNDMCksIFNDTF9UQUIoMHgzNkNEQjg4MCksCi0gIFNDTF9UQUIoMHgzNzEyQ0E0MCksIFNDTF9UQUIoMHgzNzU3RjFDMCksIFNDTF9UQUIoMHgzNzlEMkYwMCksIFNDTF9UQUIoMHgzN0UyODE4MCksIFNDTF9UQUIoMHgzODI3RTlDMCksIFNDTF9UQUIoMHgzODZENjc0MCksIFNDTF9UQUIoMHgzOEIyRkE0MCksIFNDTF9UQUIoMHgzOEY4QTJDMCksCi0gIFNDTF9UQUIoMHgzOTNFNjA4MCksIFNDTF9UQUIoMHgzOTg0MzM4MCksIFNDTF9UQUIoMHgzOUNBMUJDMCksIFNDTF9UQUIoMHgzQTEwMTk0MCksIFNDTF9UQUIoMHgzQTU2MkJDMCksIFNDTF9UQUIoMHgzQTlDNTM0MCksIFNDTF9UQUIoMHgzQUUyOEZDMCksIFNDTF9UQUIoMHgzQjI4RTE4MCksCi0gIFNDTF9UQUIoMHgzQjZGNDgwMCksIFNDTF9UQUIoMHgzQkI1QzM0MCksIFNDTF9UQUIoMHgzQkZDNTM4MCksIFNDTF9UQUIoMHgzQzQyRjg4MCksIFNDTF9UQUIoMHgzQzg5QjIwMCksIFNDTF9UQUIoMHgzQ0QwODA4MCksIFNDTF9UQUIoMHgzRDE3NjM0MCksIFNDTF9UQUIoMHgzRDVFNUIwMCksCi0gIFNDTF9UQUIoMHgzREE1NjcwMCksIFNDTF9UQUIoMHgzREVDODdDMCksIFNDTF9UQUIoMHgzRTMzQkNDMCksIFNDTF9UQUIoMHgzRTdCMDY0MCksIFNDTF9UQUIoMHgzRUMyNjQwMCksIFNDTF9UQUIoMHgzRjA5RDY0MCksIFNDTF9UQUIoMHgzRjUxNUM4MCksIFNDTF9UQUIoMHgzRjk4Rjc0MCksCi0gIFNDTF9UQUIoMHgzRkUwQTYwMCksIFNDTF9UQUIoMHg0MDI4NjkwMCksIFNDTF9UQUIoMHg0MDcwNDAwMCksIFNDTF9UQUIoMHg0MEI4MkIwMCksIFNDTF9UQUIoMHg0MTAwMkEwMCksIFNDTF9UQUIoMHg0MTQ4M0QwMCksIFNDTF9UQUIoMHg0MTkwNjQwMCksIFNDTF9UQUIoMHg0MUQ4OUYwMCksCi0gIFNDTF9UQUIoMHg0MjIwRUQ4MCksIFNDTF9UQUIoMHg0MjY5NTAwMCksIFNDTF9UQUIoMHg0MkIxQzYwMCksIFNDTF9UQUIoMHg0MkZBNTAwMCksIFNDTF9UQUIoMHg0MzQyRUQ4MCksIFNDTF9UQUIoMHg0MzhCOUU4MCksIFNDTF9UQUIoMHg0M0Q0NjM4MCksIFNDTF9UQUIoMHg0NDFEM0I4MCksCi0gIFNDTF9UQUIoMHg0NDY2Mjc4MCksIFNDTF9UQUIoMHg0NEFGMjY4MCksIFNDTF9UQUIoMHg0NEY4MzkwMCksIFNDTF9UQUIoMHg0NTQxNUYwMCksIFNDTF9UQUIoMHg0NThBOTg4MCksIFNDTF9UQUIoMHg0NUQzRTUwMCksIFNDTF9UQUIoMHg0NjFENDUwMCksIFNDTF9UQUIoMHg0NjY2QjgwMCksCi0gIFNDTF9UQUIoMHg0NkIwM0U4MCksIFNDTF9UQUIoMHg0NkY5RDgwMCksIFNDTF9UQUIoMHg0NzQzODQ4MCksIFNDTF9UQUIoMHg0NzhENDQwMCksIFNDTF9UQUIoMHg0N0Q3MTY4MCksIFNDTF9UQUIoMHg0ODIwRkMwMCksIFNDTF9UQUIoMHg0ODZBRjUwMCksIFNDTF9UQUIoMHg0OEI1MDAwMCksCi0gIFNDTF9UQUIoMHg0OEZGMUU4MCksIFNDTF9UQUIoMHg0OTQ5NEY4MCksIFNDTF9UQUIoMHg0OTkzOTM4MCksIFNDTF9UQUIoMHg0OURERUE4MCksIFNDTF9UQUIoMHg0QTI4NTQwMCksIFNDTF9UQUIoMHg0QTcyRDAwMCksIFNDTF9UQUIoMHg0QUJENUU4MCksIFNDTF9UQUIoMHg0QjA4MDAwMCksCi0gIFNDTF9UQUIoMHg0QjUyQjQwMCksIFNDTF9UQUIoMHg0QjlEN0E4MCksIFNDTF9UQUIoMHg0QkU4NTM4MCksIFNDTF9UQUIoMHg0QzMzM0YwMCksIFNDTF9UQUIoMHg0QzdFM0QwMCksIFNDTF9UQUIoMHg0Q0M5NEQwMCksIFNDTF9UQUIoMHg0RDE0NkY4MCksIFNDTF9UQUIoMHg0RDVGQTUwMCksCi0gIFNDTF9UQUIoMHg0REFBRUMwMCksIFNDTF9UQUIoMHg0REY2NDU4MCksIFNDTF9UQUIoMHg0RTQxQjE4MCksIFNDTF9UQUIoMHg0RThEMkYwMCksIFNDTF9UQUIoMHg0RUQ4QkY4MCksIFNDTF9UQUIoMHg0RjI0NjE4MCksIFNDTF9UQUIoMHg0RjcwMTYwMCksIFNDTF9UQUIoMHg0RkJCREMwMCksCi0gIFNDTF9UQUIoMHg1MDA3QjQ4MCksIFNDTF9UQUIoMHg1MDUzOUYwMCksIFNDTF9UQUIoMHg1MDlGOUI4MCksIFNDTF9UQUIoMHg1MEVCQTk4MCksIFNDTF9UQUIoMHg1MTM3Qzk4MCksIFNDTF9UQUIoMHg1MTgzRkI4MCksIFNDTF9UQUIoMHg1MUQwM0Y4MCksIFNDTF9UQUIoMHg1MjFDOTUwMCksCi0gIFNDTF9UQUIoMHg1MjY4RkM4MCksIFNDTF9UQUIoMHg1MkI1NzU4MCksIFNDTF9UQUIoMHg1MzAyMDAwMCksIFNDTF9UQUIoMHg1MzRFOUM4MCksIFNDTF9UQUIoMHg1MzlCNEE4MCksIFNDTF9UQUIoMHg1M0U4MEE4MCksIFNDTF9UQUIoMHg1NDM0REI4MCksIFNDTF9UQUIoMHg1NDgxQkU4MCksCi0gIFNDTF9UQUIoMHg1NENFQjI4MCksIFNDTF9UQUIoMHg1NTFCQjg4MCksIFNDTF9UQUIoMHg1NTY4Q0Y4MCksIFNDTF9UQUIoMHg1NUI1RjgwMCksIFNDTF9UQUIoMHg1NjAzMzIwMCksIFNDTF9UQUIoMHg1NjUwN0Q4MCksIFNDTF9UQUIoMHg1NjlEREEwMCksIFNDTF9UQUIoMHg1NkVCNDgwMCksCi0gIFNDTF9UQUIoMHg1NzM4QzcwMCksIFNDTF9UQUIoMHg1Nzg2NTc4MCksIFNDTF9UQUIoMHg1N0QzRjkwMCksIFNDTF9UQUIoMHg1ODIxQUMwMCksIFNDTF9UQUIoMHg1ODZGNzAwMCksIFNDTF9UQUIoMHg1OEJENDUwMCksIFNDTF9UQUIoMHg1OTBCMkIwMCksIFNDTF9UQUIoMHg1OTU5MjIwMCksCi0gIFNDTF9UQUIoMHg1OUE3MkE4MCksIFNDTF9UQUIoMHg1OUY1NDM4MCksIFNDTF9UQUIoMHg1QTQzNkQ4MCksIFNDTF9UQUIoMHg1QTkxQTkwMCksIFNDTF9UQUIoMHg1QURGRjUwMCksIFNDTF9UQUIoMHg1QjJFNTE4MCksIFNDTF9UQUIoMHg1QjdDQkY4MCksIFNDTF9UQUIoMHg1QkNCM0UwMCksCi0gIFNDTF9UQUIoMHg1QzE5Q0QwMCksIFNDTF9UQUIoMHg1QzY4NkQ4MCksIFNDTF9UQUIoMHg1Q0I3MUUwMCksIFNDTF9UQUIoMHg1RDA1REY4MCksIFNDTF9UQUIoMHg1RDU0QjIwMCksIFNDTF9UQUIoMHg1REEzOTUwMCksIFNDTF9UQUIoMHg1REYyODg4MCksIFNDTF9UQUIoMHg1RTQxOEM4MCksCi0gIFNDTF9UQUIoMHg1RTkwQTEwMCksIFNDTF9UQUIoMHg1RURGQzY4MCksIFNDTF9UQUIoMHg1RjJFRkMwMCksIFNDTF9UQUIoMHg1RjdFNDI4MCksIFNDTF9UQUIoMHg1RkNEOTkwMCksIFNDTF9UQUIoMHg2MDFEMDA4MCksIFNDTF9UQUIoMHg2MDZDNzgwMCksIFNDTF9UQUIoMHg2MEJDMDAwMCksCi0gIFNDTF9UQUIoMHg2MTBCOTgwMCksIFNDTF9UQUIoMHg2MTVCNDEwMCksIFNDTF9UQUIoMHg2MUFBRjk4MCksIFNDTF9UQUIoMHg2MUZBQzMwMCksIFNDTF9UQUIoMHg2MjRBOUM4MCksIFNDTF9UQUIoMHg2MjlBODYwMCksIFNDTF9UQUIoMHg2MkVBODAwMCksIFNDTF9UQUIoMHg2MzNBOEEwMCksCi0gIFNDTF9UQUIoMHg2MzhBQTQ4MCksIFNDTF9UQUIoMHg2M0RBQ0YwMCksIFNDTF9UQUIoMHg2NDJCMDk4MCksIFNDTF9UQUIoMHg2NDdCNTQwMCksIFNDTF9UQUIoMHg2NENCQUU4MCksIFNDTF9UQUIoMHg2NTFDMTkwMCksIFNDTF9UQUIoMHg2NTZDOTQwMCksIFNDTF9UQUIoMHg2NUJEMUU4MCksCi0gIFNDTF9UQUIoMHg2NjBEQjkwMCksIFNDTF9UQUIoMHg2NjVFNjM4MCksIFNDTF9UQUIoMHg2NkFGMUUwMCksIFNDTF9UQUIoMHg2NkZGRTg4MCksIFNDTF9UQUIoMHg2NzUwQzI4MCksIFNDTF9UQUIoMHg2N0ExQUM4MCksIFNDTF9UQUIoMHg2N0YyQTYwMCksIFNDTF9UQUIoMHg2ODQzQjAwMCksCi0gIFNDTF9UQUIoMHg2ODk0QzkwMCksIFNDTF9UQUIoMHg2OEU1RjIwMCksIFNDTF9UQUIoMHg2OTM3MkIwMCksIFNDTF9UQUIoMHg2OTg4NzM4MCksIFNDTF9UQUIoMHg2OUQ5Q0I4MCksIFNDTF9UQUIoMHg2QTJCMzMwMCksIFNDTF9UQUIoMHg2QTdDQUE4MCksIFNDTF9UQUIoMHg2QUNFMzE4MCksCi0gIFNDTF9UQUIoMHg2QjFGQzgwMCksIFNDTF9UQUIoMHg2QjcxNkUwMCksIFNDTF9UQUIoMHg2QkMzMjQwMCksIFNDTF9UQUIoMHg2QzE0RTkwMCksIFNDTF9UQUIoMHg2QzY2QkQ4MCksIFNDTF9UQUIoMHg2Q0I4QTE4MCksIFNDTF9UQUIoMHg2RDBBOTUwMCksIFNDTF9UQUIoMHg2RDVDOTgwMCksCi0gIFNDTF9UQUIoMHg2REFFQUEwMCksIFNDTF9UQUIoMHg2RTAwQ0I4MCksIFNDTF9UQUIoMHg2RTUyRkM4MCksIFNDTF9UQUIoMHg2RUE1M0QwMCksIFNDTF9UQUIoMHg2RUY3OEM4MCksIFNDTF9UQUIoMHg2RjQ5RUI4MCksIFNDTF9UQUIoMHg2RjlDNTk4MCksIFNDTF9UQUIoMHg2RkVFRDcwMCksCi0gIFNDTF9UQUIoMHg3MDQxNjM4MCksIFNDTF9UQUIoMHg3MDkzRkYwMCksIFNDTF9UQUIoMHg3MEU2QUEwMCksIFNDTF9UQUIoMHg3MTM5NjQwMCksIFNDTF9UQUIoMHg3MThDMkQwMCksIFNDTF9UQUIoMHg3MURGMDU4MCksIFNDTF9UQUIoMHg3MjMxRUQwMCksIFNDTF9UQUIoMHg3Mjg0RTMwMCksCi0gIFNDTF9UQUIoMHg3MkQ3RTg4MCksIFNDTF9UQUIoMHg3MzJBRkQwMCksIFNDTF9UQUIoMHg3MzdFMjA4MCksIFNDTF9UQUIoMHg3M0QxNTMwMCksIFNDTF9UQUIoMHg3NDI0OTQ4MCksIFNDTF9UQUIoMHg3NDc3RTQ4MCksIFNDTF9UQUIoMHg3NENCNDQwMCksIFNDTF9UQUIoMHg3NTFFQjIwMCksCi0gIFNDTF9UQUIoMHg3NTcyMkYwMCksIFNDTF9UQUIoMHg3NUM1QkIwMCksIFNDTF9UQUIoMHg3NjE5NTU4MCksIFNDTF9UQUIoMHg3NjZDRkYwMCksIFNDTF9UQUIoMHg3NkMwQjcwMCksIFNDTF9UQUIoMHg3NzE0N0UwMCksIFNDTF9UQUIoMHg3NzY4NTQwMCksIFNDTF9UQUIoMHg3N0JDMzg4MCksCi0gIFNDTF9UQUIoMHg3ODEwMkI4MCksIFNDTF9UQUIoMHg3ODY0MkQ4MCksIFNDTF9UQUIoMHg3OEI4M0UwMCksIFNDTF9UQUIoMHg3OTBDNUQwMCksIFNDTF9UQUIoMHg3OTYwOEIwMCksIFNDTF9UQUIoMHg3OUI0Qzc4MCksIFNDTF9UQUIoMHg3QTA5MTI4MCksIFNDTF9UQUIoMHg3QTVENkMwMCksCi0gIFNDTF9UQUIoMHg3QUIxRDQwMCksIFNDTF9UQUIoMHg3QjA2NEE4MCksIFNDTF9UQUIoMHg3QjVBQ0Y4MCksIFNDTF9UQUIoMHg3QkFGNjM4MCksIFNDTF9UQUIoMHg3QzA0MDU4MCksIFNDTF9UQUIoMHg3QzU4QjYwMCksIFNDTF9UQUIoMHg3Q0FENzUwMCksIFNDTF9UQUIoMHg3RDAyNDIwMCksCi0gIFNDTF9UQUIoMHg3RDU3MUUwMCksIFNDTF9UQUIoMHg3REFDMDgwMCksIFNDTF9UQUIoMHg3RTAxMDA4MCksIFNDTF9UQUIoMHg3RTU2MDc4MCksIFNDTF9UQUIoMHg3RUFCMUM4MCksIFNDTF9UQUIoMHg3RjAwNDAwMCksIFNDTF9UQUIoMHg3RjU1NzIwMCksIFNDTF9UQUIoMHg3RkFBQjIwMCksCi0gIFNDTF9UQUIoMHg3RkZGRkZGRikKLX0gOworI2RlZmluZSBTQ0xfVEFCKGEpIChhID4+IDQpCitjb25zdCBGSVhQX0RCTCBJbnZlcnNlUXVhbnRUYWJsZVtJTlZfUVVBTlRfVEFCTEVTSVpFICsgMV0gPSB7CisgICAgU0NMX1RBQigweDMyQ0JGRDQwKSwgU0NMX1RBQigweDMzMEZDMzQwKSwgU0NMX1RBQigweDMzNTM5RkMwKSwKKyAgICBTQ0xfVEFCKDB4MzM5NzkyODApLCBTQ0xfVEFCKDB4MzNEQjlCQzApLCBTQ0xfVEFCKDB4MzQxRkJCODApLAorICAgIFNDTF9UQUIoMHgzNDYzRjE4MCksIFNDTF9UQUIoMHgzNEE4M0RDMCksIFNDTF9UQUIoMHgzNEVDQTAwMCksCisgICAgU0NMX1RBQigweDM1MzExODgwKSwgU0NMX1RBQigweDM1NzVBNzAwKSwgU0NMX1RBQigweDM1QkE0QjgwKSwKKyAgICBTQ0xfVEFCKDB4MzVGRjA2MDApLCBTQ0xfVEFCKDB4MzY0M0Q2ODApLCBTQ0xfVEFCKDB4MzY4OEJDQzApLAorICAgIFNDTF9UQUIoMHgzNkNEQjg4MCksIFNDTF9UQUIoMHgzNzEyQ0E0MCksIFNDTF9UQUIoMHgzNzU3RjFDMCksCisgICAgU0NMX1RBQigweDM3OUQyRjAwKSwgU0NMX1RBQigweDM3RTI4MTgwKSwgU0NMX1RBQigweDM4MjdFOUMwKSwKKyAgICBTQ0xfVEFCKDB4Mzg2RDY3NDApLCBTQ0xfVEFCKDB4MzhCMkZBNDApLCBTQ0xfVEFCKDB4MzhGOEEyQzApLAorICAgIFNDTF9UQUIoMHgzOTNFNjA4MCksIFNDTF9UQUIoMHgzOTg0MzM4MCksIFNDTF9UQUIoMHgzOUNBMUJDMCksCisgICAgU0NMX1RBQigweDNBMTAxOTQwKSwgU0NMX1RBQigweDNBNTYyQkMwKSwgU0NMX1RBQigweDNBOUM1MzQwKSwKKyAgICBTQ0xfVEFCKDB4M0FFMjhGQzApLCBTQ0xfVEFCKDB4M0IyOEUxODApLCBTQ0xfVEFCKDB4M0I2RjQ4MDApLAorICAgIFNDTF9UQUIoMHgzQkI1QzM0MCksIFNDTF9UQUIoMHgzQkZDNTM4MCksIFNDTF9UQUIoMHgzQzQyRjg4MCksCisgICAgU0NMX1RBQigweDNDODlCMjAwKSwgU0NMX1RBQigweDNDRDA4MDgwKSwgU0NMX1RBQigweDNEMTc2MzQwKSwKKyAgICBTQ0xfVEFCKDB4M0Q1RTVCMDApLCBTQ0xfVEFCKDB4M0RBNTY3MDApLCBTQ0xfVEFCKDB4M0RFQzg3QzApLAorICAgIFNDTF9UQUIoMHgzRTMzQkNDMCksIFNDTF9UQUIoMHgzRTdCMDY0MCksIFNDTF9UQUIoMHgzRUMyNjQwMCksCisgICAgU0NMX1RBQigweDNGMDlENjQwKSwgU0NMX1RBQigweDNGNTE1QzgwKSwgU0NMX1RBQigweDNGOThGNzQwKSwKKyAgICBTQ0xfVEFCKDB4M0ZFMEE2MDApLCBTQ0xfVEFCKDB4NDAyODY5MDApLCBTQ0xfVEFCKDB4NDA3MDQwMDApLAorICAgIFNDTF9UQUIoMHg0MEI4MkIwMCksIFNDTF9UQUIoMHg0MTAwMkEwMCksIFNDTF9UQUIoMHg0MTQ4M0QwMCksCisgICAgU0NMX1RBQigweDQxOTA2NDAwKSwgU0NMX1RBQigweDQxRDg5RjAwKSwgU0NMX1RBQigweDQyMjBFRDgwKSwKKyAgICBTQ0xfVEFCKDB4NDI2OTUwMDApLCBTQ0xfVEFCKDB4NDJCMUM2MDApLCBTQ0xfVEFCKDB4NDJGQTUwMDApLAorICAgIFNDTF9UQUIoMHg0MzQyRUQ4MCksIFNDTF9UQUIoMHg0MzhCOUU4MCksIFNDTF9UQUIoMHg0M0Q0NjM4MCksCisgICAgU0NMX1RBQigweDQ0MUQzQjgwKSwgU0NMX1RBQigweDQ0NjYyNzgwKSwgU0NMX1RBQigweDQ0QUYyNjgwKSwKKyAgICBTQ0xfVEFCKDB4NDRGODM5MDApLCBTQ0xfVEFCKDB4NDU0MTVGMDApLCBTQ0xfVEFCKDB4NDU4QTk4ODApLAorICAgIFNDTF9UQUIoMHg0NUQzRTUwMCksIFNDTF9UQUIoMHg0NjFENDUwMCksIFNDTF9UQUIoMHg0NjY2QjgwMCksCisgICAgU0NMX1RBQigweDQ2QjAzRTgwKSwgU0NMX1RBQigweDQ2RjlEODAwKSwgU0NMX1RBQigweDQ3NDM4NDgwKSwKKyAgICBTQ0xfVEFCKDB4NDc4RDQ0MDApLCBTQ0xfVEFCKDB4NDdENzE2ODApLCBTQ0xfVEFCKDB4NDgyMEZDMDApLAorICAgIFNDTF9UQUIoMHg0ODZBRjUwMCksIFNDTF9UQUIoMHg0OEI1MDAwMCksIFNDTF9UQUIoMHg0OEZGMUU4MCksCisgICAgU0NMX1RBQigweDQ5NDk0RjgwKSwgU0NMX1RBQigweDQ5OTM5MzgwKSwgU0NMX1RBQigweDQ5RERFQTgwKSwKKyAgICBTQ0xfVEFCKDB4NEEyODU0MDApLCBTQ0xfVEFCKDB4NEE3MkQwMDApLCBTQ0xfVEFCKDB4NEFCRDVFODApLAorICAgIFNDTF9UQUIoMHg0QjA4MDAwMCksIFNDTF9UQUIoMHg0QjUyQjQwMCksIFNDTF9UQUIoMHg0QjlEN0E4MCksCisgICAgU0NMX1RBQigweDRCRTg1MzgwKSwgU0NMX1RBQigweDRDMzMzRjAwKSwgU0NMX1RBQigweDRDN0UzRDAwKSwKKyAgICBTQ0xfVEFCKDB4NENDOTREMDApLCBTQ0xfVEFCKDB4NEQxNDZGODApLCBTQ0xfVEFCKDB4NEQ1RkE1MDApLAorICAgIFNDTF9UQUIoMHg0REFBRUMwMCksIFNDTF9UQUIoMHg0REY2NDU4MCksIFNDTF9UQUIoMHg0RTQxQjE4MCksCisgICAgU0NMX1RBQigweDRFOEQyRjAwKSwgU0NMX1RBQigweDRFRDhCRjgwKSwgU0NMX1RBQigweDRGMjQ2MTgwKSwKKyAgICBTQ0xfVEFCKDB4NEY3MDE2MDApLCBTQ0xfVEFCKDB4NEZCQkRDMDApLCBTQ0xfVEFCKDB4NTAwN0I0ODApLAorICAgIFNDTF9UQUIoMHg1MDUzOUYwMCksIFNDTF9UQUIoMHg1MDlGOUI4MCksIFNDTF9UQUIoMHg1MEVCQTk4MCksCisgICAgU0NMX1RBQigweDUxMzdDOTgwKSwgU0NMX1RBQigweDUxODNGQjgwKSwgU0NMX1RBQigweDUxRDAzRjgwKSwKKyAgICBTQ0xfVEFCKDB4NTIxQzk1MDApLCBTQ0xfVEFCKDB4NTI2OEZDODApLCBTQ0xfVEFCKDB4NTJCNTc1ODApLAorICAgIFNDTF9UQUIoMHg1MzAyMDAwMCksIFNDTF9UQUIoMHg1MzRFOUM4MCksIFNDTF9UQUIoMHg1MzlCNEE4MCksCisgICAgU0NMX1RBQigweDUzRTgwQTgwKSwgU0NMX1RBQigweDU0MzREQjgwKSwgU0NMX1RBQigweDU0ODFCRTgwKSwKKyAgICBTQ0xfVEFCKDB4NTRDRUIyODApLCBTQ0xfVEFCKDB4NTUxQkI4ODApLCBTQ0xfVEFCKDB4NTU2OENGODApLAorICAgIFNDTF9UQUIoMHg1NUI1RjgwMCksIFNDTF9UQUIoMHg1NjAzMzIwMCksIFNDTF9UQUIoMHg1NjUwN0Q4MCksCisgICAgU0NMX1RBQigweDU2OUREQTAwKSwgU0NMX1RBQigweDU2RUI0ODAwKSwgU0NMX1RBQigweDU3MzhDNzAwKSwKKyAgICBTQ0xfVEFCKDB4NTc4NjU3ODApLCBTQ0xfVEFCKDB4NTdEM0Y5MDApLCBTQ0xfVEFCKDB4NTgyMUFDMDApLAorICAgIFNDTF9UQUIoMHg1ODZGNzAwMCksIFNDTF9UQUIoMHg1OEJENDUwMCksIFNDTF9UQUIoMHg1OTBCMkIwMCksCisgICAgU0NMX1RBQigweDU5NTkyMjAwKSwgU0NMX1RBQigweDU5QTcyQTgwKSwgU0NMX1RBQigweDU5RjU0MzgwKSwKKyAgICBTQ0xfVEFCKDB4NUE0MzZEODApLCBTQ0xfVEFCKDB4NUE5MUE5MDApLCBTQ0xfVEFCKDB4NUFERkY1MDApLAorICAgIFNDTF9UQUIoMHg1QjJFNTE4MCksIFNDTF9UQUIoMHg1QjdDQkY4MCksIFNDTF9UQUIoMHg1QkNCM0UwMCksCisgICAgU0NMX1RBQigweDVDMTlDRDAwKSwgU0NMX1RBQigweDVDNjg2RDgwKSwgU0NMX1RBQigweDVDQjcxRTAwKSwKKyAgICBTQ0xfVEFCKDB4NUQwNURGODApLCBTQ0xfVEFCKDB4NUQ1NEIyMDApLCBTQ0xfVEFCKDB4NURBMzk1MDApLAorICAgIFNDTF9UQUIoMHg1REYyODg4MCksIFNDTF9UQUIoMHg1RTQxOEM4MCksIFNDTF9UQUIoMHg1RTkwQTEwMCksCisgICAgU0NMX1RBQigweDVFREZDNjgwKSwgU0NMX1RBQigweDVGMkVGQzAwKSwgU0NMX1RBQigweDVGN0U0MjgwKSwKKyAgICBTQ0xfVEFCKDB4NUZDRDk5MDApLCBTQ0xfVEFCKDB4NjAxRDAwODApLCBTQ0xfVEFCKDB4NjA2Qzc4MDApLAorICAgIFNDTF9UQUIoMHg2MEJDMDAwMCksIFNDTF9UQUIoMHg2MTBCOTgwMCksIFNDTF9UQUIoMHg2MTVCNDEwMCksCisgICAgU0NMX1RBQigweDYxQUFGOTgwKSwgU0NMX1RBQigweDYxRkFDMzAwKSwgU0NMX1RBQigweDYyNEE5QzgwKSwKKyAgICBTQ0xfVEFCKDB4NjI5QTg2MDApLCBTQ0xfVEFCKDB4NjJFQTgwMDApLCBTQ0xfVEFCKDB4NjMzQThBMDApLAorICAgIFNDTF9UQUIoMHg2MzhBQTQ4MCksIFNDTF9UQUIoMHg2M0RBQ0YwMCksIFNDTF9UQUIoMHg2NDJCMDk4MCksCisgICAgU0NMX1RBQigweDY0N0I1NDAwKSwgU0NMX1RBQigweDY0Q0JBRTgwKSwgU0NMX1RBQigweDY1MUMxOTAwKSwKKyAgICBTQ0xfVEFCKDB4NjU2Qzk0MDApLCBTQ0xfVEFCKDB4NjVCRDFFODApLCBTQ0xfVEFCKDB4NjYwREI5MDApLAorICAgIFNDTF9UQUIoMHg2NjVFNjM4MCksIFNDTF9UQUIoMHg2NkFGMUUwMCksIFNDTF9UQUIoMHg2NkZGRTg4MCksCisgICAgU0NMX1RBQigweDY3NTBDMjgwKSwgU0NMX1RBQigweDY3QTFBQzgwKSwgU0NMX1RBQigweDY3RjJBNjAwKSwKKyAgICBTQ0xfVEFCKDB4Njg0M0IwMDApLCBTQ0xfVEFCKDB4Njg5NEM5MDApLCBTQ0xfVEFCKDB4NjhFNUYyMDApLAorICAgIFNDTF9UQUIoMHg2OTM3MkIwMCksIFNDTF9UQUIoMHg2OTg4NzM4MCksIFNDTF9UQUIoMHg2OUQ5Q0I4MCksCisgICAgU0NMX1RBQigweDZBMkIzMzAwKSwgU0NMX1RBQigweDZBN0NBQTgwKSwgU0NMX1RBQigweDZBQ0UzMTgwKSwKKyAgICBTQ0xfVEFCKDB4NkIxRkM4MDApLCBTQ0xfVEFCKDB4NkI3MTZFMDApLCBTQ0xfVEFCKDB4NkJDMzI0MDApLAorICAgIFNDTF9UQUIoMHg2QzE0RTkwMCksIFNDTF9UQUIoMHg2QzY2QkQ4MCksIFNDTF9UQUIoMHg2Q0I4QTE4MCksCisgICAgU0NMX1RBQigweDZEMEE5NTAwKSwgU0NMX1RBQigweDZENUM5ODAwKSwgU0NMX1RBQigweDZEQUVBQTAwKSwKKyAgICBTQ0xfVEFCKDB4NkUwMENCODApLCBTQ0xfVEFCKDB4NkU1MkZDODApLCBTQ0xfVEFCKDB4NkVBNTNEMDApLAorICAgIFNDTF9UQUIoMHg2RUY3OEM4MCksIFNDTF9UQUIoMHg2RjQ5RUI4MCksIFNDTF9UQUIoMHg2RjlDNTk4MCksCisgICAgU0NMX1RBQigweDZGRUVENzAwKSwgU0NMX1RBQigweDcwNDE2MzgwKSwgU0NMX1RBQigweDcwOTNGRjAwKSwKKyAgICBTQ0xfVEFCKDB4NzBFNkFBMDApLCBTQ0xfVEFCKDB4NzEzOTY0MDApLCBTQ0xfVEFCKDB4NzE4QzJEMDApLAorICAgIFNDTF9UQUIoMHg3MURGMDU4MCksIFNDTF9UQUIoMHg3MjMxRUQwMCksIFNDTF9UQUIoMHg3Mjg0RTMwMCksCisgICAgU0NMX1RBQigweDcyRDdFODgwKSwgU0NMX1RBQigweDczMkFGRDAwKSwgU0NMX1RBQigweDczN0UyMDgwKSwKKyAgICBTQ0xfVEFCKDB4NzNEMTUzMDApLCBTQ0xfVEFCKDB4NzQyNDk0ODApLCBTQ0xfVEFCKDB4NzQ3N0U0ODApLAorICAgIFNDTF9UQUIoMHg3NENCNDQwMCksIFNDTF9UQUIoMHg3NTFFQjIwMCksIFNDTF9UQUIoMHg3NTcyMkYwMCksCisgICAgU0NMX1RBQigweDc1QzVCQjAwKSwgU0NMX1RBQigweDc2MTk1NTgwKSwgU0NMX1RBQigweDc2NkNGRjAwKSwKKyAgICBTQ0xfVEFCKDB4NzZDMEI3MDApLCBTQ0xfVEFCKDB4NzcxNDdFMDApLCBTQ0xfVEFCKDB4Nzc2ODU0MDApLAorICAgIFNDTF9UQUIoMHg3N0JDMzg4MCksIFNDTF9UQUIoMHg3ODEwMkI4MCksIFNDTF9UQUIoMHg3ODY0MkQ4MCksCisgICAgU0NMX1RBQigweDc4QjgzRTAwKSwgU0NMX1RBQigweDc5MEM1RDAwKSwgU0NMX1RBQigweDc5NjA4QjAwKSwKKyAgICBTQ0xfVEFCKDB4NzlCNEM3ODApLCBTQ0xfVEFCKDB4N0EwOTEyODApLCBTQ0xfVEFCKDB4N0E1RDZDMDApLAorICAgIFNDTF9UQUIoMHg3QUIxRDQwMCksIFNDTF9UQUIoMHg3QjA2NEE4MCksIFNDTF9UQUIoMHg3QjVBQ0Y4MCksCisgICAgU0NMX1RBQigweDdCQUY2MzgwKSwgU0NMX1RBQigweDdDMDQwNTgwKSwgU0NMX1RBQigweDdDNThCNjAwKSwKKyAgICBTQ0xfVEFCKDB4N0NBRDc1MDApLCBTQ0xfVEFCKDB4N0QwMjQyMDApLCBTQ0xfVEFCKDB4N0Q1NzFFMDApLAorICAgIFNDTF9UQUIoMHg3REFDMDgwMCksIFNDTF9UQUIoMHg3RTAxMDA4MCksIFNDTF9UQUIoMHg3RTU2MDc4MCksCisgICAgU0NMX1RBQigweDdFQUIxQzgwKSwgU0NMX1RBQigweDdGMDA0MDAwKSwgU0NMX1RBQigweDdGNTU3MjAwKSwKKyAgICBTQ0xfVEFCKDB4N0ZBQUIyMDApLCBTQ0xfVEFCKDB4N0ZGRkZGRkYpfTsKIAogLyoqCi0gKiBcYnJpZWYgVGFibGUgcmVwcmVzZW50aW5nIHNjYWxlIGZhY3RvciBnYWlucy4gR2l2ZW4gYSBzY2FsZSBmYWN0b3Igc2YsIGFuZCBhIHZhbHVlIHBTcGVjW2ldIHRoZQotICogZ2FpbiBpcyBnaXZlbiBieTogTWFudGlzc2FUYWJsZVtzZiAlIDRdW21zYl0gPSAyXihzZiAlIDQpIC8gKDE8PEV4cG9uZW50VGFibGVbc2YgJSA0XVttc2JdCi0gKiBUaGUgc2Vjb25kIGRpbWVuc2lvbiAibXNiIiByZXByZXNlbnRzIHRoZSB1cHBlciBzY2FsZSBmYWN0b3IgYml0IGNvdW50IGZsb29yKGxvZzIoc2NhbGVmYWN0b3IgPj4gMikpCi0gKiBUaGUgY29ycmVzcG9uZGluZyBleHBvbmVudHMgZm9yIHRoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZXMgYXJlIHN0b3JlZCBpbiBFeHBvbmVudFRhYmxlW3NmICUgNF1bbXNiXSBiZWxvdy4KKyAqIFxicmllZiBUYWJsZSByZXByZXNlbnRpbmcgc2NhbGUgZmFjdG9yIGdhaW5zLiBHaXZlbiBhIHNjYWxlIGZhY3RvciBzZiwgYW5kIGEKKyAqIHZhbHVlIHBTcGVjW2ldIHRoZSBnYWluIGlzIGdpdmVuIGJ5OiBNYW50aXNzYVRhYmxlW3NmICUgNF1bbXNiXSA9IDJeKHNmICUgNCkKKyAqIC8gKDE8PEV4cG9uZW50VGFibGVbc2YgJSA0XVttc2JdIFRoZSBzZWNvbmQgZGltZW5zaW9uICJtc2IiIHJlcHJlc2VudHMgdGhlCisgKiB1cHBlciBzY2FsZSBmYWN0b3IgYml0IGNvdW50IGZsb29yKGxvZzIoc2NhbGVmYWN0b3IgPj4gMikpIFRoZSBjb3JyZXNwb25kaW5nCisgKiBleHBvbmVudHMgZm9yIHRoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZXMgYXJlIHN0b3JlZCBpbiBFeHBvbmVudFRhYmxlW3NmICUKKyAqIDRdW21zYl0gYmVsb3cuCiAgKi8KLWNvbnN0IEZJWFBfREJMIE1hbnRpc3NhVGFibGUgWzRdWzE0XSA9Ci17Ci0gIHsKLSAgICAweDQwMDAwMDAwLCAweDUwQTI4QzAwLCAweDY1OTdGQTgwLCAweDQwMDAwMDAwLCAweDUwQTI4QzAwLCAweDY1OTdGQTgwLCAweDQwMDAwMDAwLCAweDUwQTI4QzAwLAotICAgIDB4NjU5N0ZBODAsIDB4NDAwMDAwMDAsIDB4NTBBMjhDMDAsIDB4NjU5N0ZBODAsIDB4NDAwMDAwMDAsIDB4NTBBMjhDMDAKLSAgfSwKLSAgewotICAgIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsCi0gICAgMHg3OEQwREY4MCwgMHg0QzFCRjgwMCwgMHg1RkU0NDM4MCwgMHg3OEQwREY4MCwgMHg0QzFCRjgwMCwgMHg1RkU0NDM4MAotICB9LAotICB7Ci0gICAgMHg1QTgyNzk4MCwgMHg3MjA4RjgwMCwgMHg0N0Q2NkIwMCwgMHg1QTgyNzk4MCwgMHg3MjA4RjgwMCwgMHg0N0Q2NkIwMCwgMHg1QTgyNzk4MCwgMHg3MjA4RjgwMCwKLSAgICAweDQ3RDY2QjAwLCAweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLCAweDVBODI3OTgwLCAweDcyMDhGODAwCi0gIH0sCi0gIHsKLSAgICAweDZCQTI3RTgwLCAweDQzQ0UzRTgwLCAweDU1NkUwNDAwLCAweDZCQTI3RTgwLCAweDQzQ0UzRTgwLCAweDU1NkUwNDAwLCAweDZCQTI3RTgwLCAweDQzQ0UzRTgwLAotICAgIDB4NTU2RTA0MDAsIDB4NkJBMjdFODAsIDB4NDNDRTNFODAsIDB4NTU2RTA0MDAsIDB4NkJBMjdFODAsIDB4NDNDRTNFODAKLSAgfQotfSA7Citjb25zdCBGSVhQX0RCTCBNYW50aXNzYVRhYmxlWzRdWzE0XSA9IHsKKyAgICB7MHg0MDAwMDAwMCwgMHg1MEEyOEMwMCwgMHg2NTk3RkE4MCwgMHg0MDAwMDAwMCwgMHg1MEEyOEMwMCwgMHg2NTk3RkE4MCwKKyAgICAgMHg0MDAwMDAwMCwgMHg1MEEyOEMwMCwgMHg2NTk3RkE4MCwgMHg0MDAwMDAwMCwgMHg1MEEyOEMwMCwgMHg2NTk3RkE4MCwKKyAgICAgMHg0MDAwMDAwMCwgMHg1MEEyOEMwMH0sCisgICAgezB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsCisgICAgIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsCisgICAgIDB4NEMxQkY4MDAsIDB4NUZFNDQzODB9LAorICAgIHsweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLCAweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLAorICAgICAweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLCAweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLAorICAgICAweDVBODI3OTgwLCAweDcyMDhGODAwfSwKKyAgICB7MHg2QkEyN0U4MCwgMHg0M0NFM0U4MCwgMHg1NTZFMDQwMCwgMHg2QkEyN0U4MCwgMHg0M0NFM0U4MCwgMHg1NTZFMDQwMCwKKyAgICAgMHg2QkEyN0U4MCwgMHg0M0NFM0U4MCwgMHg1NTZFMDQwMCwgMHg2QkEyN0U4MCwgMHg0M0NFM0U4MCwgMHg1NTZFMDQwMCwKKyAgICAgMHg2QkEyN0U4MCwgMHg0M0NFM0U4MH19OwogCi1jb25zdCBTQ0hBUiBFeHBvbmVudFRhYmxlIFs0XVsxNF0gPQotewotICB7IDEsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTcsIDE4IH0sCi0gIHsgMSwgMiwgMywgNSwgNiwgNywgOSwgMTAsIDExLCAxMywgMTQsIDE1LCAxNywgMTggfSwKLSAgeyAxLCAyLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDEzLCAxNCwgMTYsIDE3LCAxOCB9LAotICB7IDEsIDMsIDQsIDUsIDcsIDgsIDksIDExLCAxMiwgMTMsIDE1LCAxNiwgMTcsIDE5IH0KLX0gOwotCitjb25zdCBTQ0hBUiBFeHBvbmVudFRhYmxlWzRdWzE0XSA9IHsKKyAgICB7MSwgMiwgMywgNSwgNiwgNywgOSwgMTAsIDExLCAxMywgMTQsIDE1LCAxNywgMTh9LAorICAgIHsxLCAyLCAzLCA1LCA2LCA3LCA5LCAxMCwgMTEsIDEzLCAxNCwgMTUsIDE3LCAxOH0sCisgICAgezEsIDIsIDQsIDUsIDYsIDgsIDksIDEwLCAxMiwgMTMsIDE0LCAxNiwgMTcsIDE4fSwKKyAgICB7MSwgMywgNCwgNSwgNywgOCwgOSwgMTEsIDEyLCAxMywgMTUsIDE2LCAxNywgMTl9fTsKIAogLyogNDEgc2NmYmFuZHMgKi8KLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfMTAyNFs0Ml0gPQotewotICAgICAwLCAgICA0LCAgICA4LCAgIDEyLCAgIDE2LCAgIDIwLCAgIDI0LCAgIDI4LCAgIDMyLCAgIDM2LCAgIDQwLCAgIDQ0LAotICAgIDQ4LCAgIDUyLCAgIDU2LCAgIDY0LCAgIDcyLCAgIDgwLCAgIDg4LCAgIDk2LCAgMTA4LCAgMTIwLCAgMTMyLCAgMTQ0LAotICAgMTU2LCAgMTcyLCAgMTg4LCAgMjEyLCAgMjQwLCAgMjc2LCAgMzIwLCAgMzg0LCAgNDQ4LCAgNTEyLCAgNTc2LCAgNjQwLAotICAgNzA0LCAgNzY4LCAgODMyLCAgODk2LCAgOTYwLCAxMDI0Ci19Oworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl85Nl8xMDI0WzQyXSA9IHsKKyAgICAwLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsICA0OCwgIDUyLAorICAgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTU2LCAxNzIsIDE4OCwgMjEyLAorICAgIDI0MCwgMjc2LCAzMjAsIDM4NCwgNDQ4LCA1MTIsIDU3NiwgNjQwLCA3MDQsIDc2OCwgODMyLCA4OTYsIDk2MCwgMTAyNH07CiAvKiAxMiBzY2ZiYW5kcyAqLwotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl85Nl8xMjhbMTNdID0KLXsKLSAgICAgMCwgICAgNCwgICAgOCwgICAxMiwgICAxNiwgICAyMCwgICAyNCwgICAzMiwgICA0MCwgICA0OCwgICAgNjQsICA5MiwKLSAgIDEyOAotfTsKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfMTI4WzEzXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgNDAsIDQ4LCA2NCwgOTIsIDEyOH07CiAKIC8qIDQ3IHNjZmJhbmRzKi8KLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTAyNFs0OF0gPQotewotICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsICA0OCwgIDUyLAotICAgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsIDEwMCwgMTEyLCAgMTI0LCAxNDAsIDE1NiwgMTcyLCAxOTIsIDIxNiwgMjQwLAotICAgMjY4LCAzMDQsIDM0NCwgMzg0LCA0MjQsIDQ2NCwgNTA0LCAgNTQ0LCA1ODQsIDYyNCwgNjY0LCA3MDQsIDc0NCwgNzg0LAotICAgODI0LCA4NjQsIDkwNCwgOTQ0LCA5ODQsMTAyNAotfTsKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTAyNFs0OF0gPSB7CisgICAgMCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LAorICAgIDQ4LCAgNTIsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgMTAwLCAxMTIsIDEyNCwgMTQwLCAxNTYsCisgICAgMTcyLCAxOTIsIDIxNiwgMjQwLCAyNjgsIDMwNCwgMzQ0LCAzODQsIDQyNCwgNDY0LCA1MDQsIDU0NCwKKyAgICA1ODQsIDYyNCwgNjY0LCA3MDQsIDc0NCwgNzg0LCA4MjQsIDg2NCwgOTA0LCA5NDQsIDk4NCwgMTAyNH07CiAKIC8qIDEyIHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0XzEyOFsxM10gPQotewotICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LAotICAgIDMyLCAgNDAsICA0OCwgIDY0LCAgOTIsIDEyOAotfTsKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTI4WzEzXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgNDAsIDQ4LCA2NCwgOTIsIDEyOH07CiAKIC8qIDQ5IHNjZmJhbmRzICovCiBzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4XzEwMjRbNTBdID0gewotICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDgsICA1NiwgIDY0LAotICAgIDcyLCAgODAsICA4OCwgIDk2LCAxMDgsIDEyMCwgMTMyLCAgMTQ0LCAxNjAsIDE3NiwgMTk2LCAyMTYsIDI0MCwgMjY0LAotICAgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCAgNTEyLCA1NDQsIDU3NiwgNjA4LCA2NDAsIDY3MiwgNzA0LAotICAgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwgOTI4LCAxMDI0Ci19OworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0OCwgIDU2LAorICAgIDY0LCAgNzIsICA4MCwgIDg4LCAgOTYsICAxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LCAxOTYsIDIxNiwKKyAgICAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCA1MTIsIDU0NCwgNTc2LCA2MDgsCisgICAgNjQwLCA2NzIsIDcwNCwgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwgOTI4LCAxMDI0fTsKIC8qIDE0IHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4XzEyOFsxNV0gPQotewotICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI4LCAgIDM2LCAgNDQsICA1NiwgIDY4LCAgODAsICA5NiwgMTEyLAotICAgMTI4Ci19Oworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF8xMjhbMTVdID0gezAsICA0LCAgOCwgIDEyLCAxNiwgMjAsICAyOCwgMzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsIDU2LCA2OCwgODAsIDk2LCAxMTIsIDEyOH07CiAKIC8qIDUxIHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzMyXzEwMjRbNTJdID0KLXsKLSAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ4LCAgNTYsICA2NCwKLSAgICA3MiwgIDgwLCAgODgsICA5NiwgMTA4LCAxMjAsIDEzMiwgIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LCAyNDAsIDI2NCwKLSAgIDI5MiwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgsIDQ4MCwgIDUxMiwgNTQ0LCA1NzYsIDYwOCwgNjQwLCA2NzIsIDcwNCwKLSAgIDczNiwgNzY4LCA4MDAsIDgzMiwgODY0LCA4OTYsIDkyOCwgIDk2MCwgOTkyLDEwMjQKLX07CitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzMyXzEwMjRbNTJdID0geworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0OCwgIDU2LAorICAgIDY0LCAgNzIsICA4MCwgIDg4LCAgOTYsICAxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LCAxOTYsIDIxNiwKKyAgICAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCA1MTIsIDU0NCwgNTc2LCA2MDgsCisgICAgNjQwLCA2NzIsIDcwNCwgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwgOTI4LCA5NjAsIDk5MiwgMTAyNH07CiAKIC8qIDQ3IHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzI0XzEwMjRbNDhdID0KLXsKLSAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LCAgNTIsICA2MCwKLSAgICA2OCwgIDc2LCAgODQsICA5MiwgMTAwLCAxMDgsIDExNiwgIDEyNCwgMTM2LCAxNDgsIDE2MCwgMTcyLCAxODgsIDIwNCwKLSAgIDIyMCwgMjQwLCAyNjAsIDI4NCwgMzA4LCAzMzYsIDM2NCwgICAzOTYsIDQzMiwgNDY4LCA1MDgsIDU1MiwgNjAwLCA2NTIsCi0gICA3MDQsIDc2OCwgODMyLCA4OTYsIDk2MCwxMDI0Ci19Oworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8yNF8xMDI0WzQ4XSA9IHsKKyAgICAwLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsCisgICAgNTIsICA2MCwgIDY4LCAgNzYsICA4NCwgIDkyLCAgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzYsIDE0OCwKKyAgICAxNjAsIDE3MiwgMTg4LCAyMDQsIDIyMCwgMjQwLCAyNjAsIDI4NCwgMzA4LCAzMzYsIDM2NCwgMzk2LAorICAgIDQzMiwgNDY4LCA1MDgsIDU1MiwgNjAwLCA2NTIsIDcwNCwgNzY4LCA4MzIsIDg5NiwgOTYwLCAxMDI0fTsKIAogLyogMTUgc2NmYmFuZHMgKi8KLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMjRfMTI4WzE2XSA9Ci17Ci0gICAgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAgMjgsICAzNiwgIDQ0LCAgNTIsICA2NCwgIDc2LCAgOTIsCi0gICAxMDgsIDEyOAotfTsKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMjRfMTI4WzE2XSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwgIDI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2LCA0NCwgNTIsIDY0LCA3NiwgOTIsIDEwOCwgMTI4fTsKIAogLyogNDMgc2NmYmFuZHMgKi8KLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMTZfMTAyNFs0NF0gPQotewotICAgICAwLCAgIDgsICAxNiwgIDI0LCAgMzIsICA0MCwgIDQ4LCAgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsIDEwMCwgMTEyLAotICAgMTI0LCAxMzYsIDE0OCwgMTYwLCAxNzIsIDE4NCwgMTk2LCAgMjEyLCAyMjgsIDI0NCwgMjYwLCAyODAsIDMwMCwgMzIwLAotICAgMzQ0LCAzNjgsIDM5NiwgNDI0LCA0NTYsIDQ5MiwgNTMyLCAgNTcyLCA2MTYsIDY2NCwgNzE2LCA3NzIsIDgzMiwgODk2LAotICAgOTYwLDEwMjQKLX07CitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzE2XzEwMjRbNDRdID0geworICAgIDAsICAgOCwgICAxNiwgIDI0LCAgMzIsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgIDEwMCwgMTEyLCAxMjQsCisgICAgMTM2LCAxNDgsIDE2MCwgMTcyLCAxODQsIDE5NiwgMjEyLCAyMjgsIDI0NCwgMjYwLCAyODAsIDMwMCwgMzIwLCAzNDQsIDM2OCwKKyAgICAzOTYsIDQyNCwgNDU2LCA0OTIsIDUzMiwgNTcyLCA2MTYsIDY2NCwgNzE2LCA3NzIsIDgzMiwgODk2LCA5NjAsIDEwMjR9OwogCiAvKiAxNSBzY2ZiYW5kcyAqLwotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8xNl8xMjhbMTZdID0KLXsKLSAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgICAyOCwgIDMyLCAgNDAsICA0OCwgIDYwLCAgNzIsICA4OCwKLSAgIDEwOCwgMTI4Ci19Oworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8xNl8xMjhbMTZdID0gezAsICA0LCAgOCwgIDEyLCAxNiwgMjAsIDI0LCAgMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsIDQwLCA0OCwgNjAsIDcyLCA4OCwgMTA4LCAxMjh9OwogCiAvKiA0MCBzY2ZiYW5kcyAqLwotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl84XzEwMjRbNDFdID0KLXsKLSAgICAgMCwgIDEyLCAgMjQsICAzNiwgIDQ4LCAgNjAsICA3MiwgICA4NCwgIDk2LCAxMDgsIDEyMCwgMTMyLCAxNDQsIDE1NiwKLSAgIDE3MiwgMTg4LCAyMDQsIDIyMCwgMjM2LCAyNTIsIDI2OCwgIDI4OCwgMzA4LCAzMjgsIDM0OCwgMzcyLCAzOTYsIDQyMCwKLSAgIDQ0OCwgNDc2LCA1MDgsIDU0NCwgNTgwLCA2MjAsIDY2NCwgIDcxMiwgNzY0LCA4MjAsIDg4MCwgOTQ0LDEwMjQKLX07CitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzhfMTAyNFs0MV0gPSB7CisgICAgMCwgICAxMiwgIDI0LCAgMzYsICA0OCwgIDYwLCAgNzIsICA4NCwgIDk2LCAgMTA4LCAxMjAsIDEzMiwgMTQ0LCAxNTYsCisgICAgMTcyLCAxODgsIDIwNCwgMjIwLCAyMzYsIDI1MiwgMjY4LCAyODgsIDMwOCwgMzI4LCAzNDgsIDM3MiwgMzk2LCA0MjAsCisgICAgNDQ4LCA0NzYsIDUwOCwgNTQ0LCA1ODAsIDYyMCwgNjY0LCA3MTIsIDc2NCwgODIwLCA4ODAsIDk0NCwgMTAyNH07CiAKIC8qIDE1IHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzhfMTI4WzE2XSA9Ci17Ci0gICAgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAgMjgsICAzNiwgIDQ0LCAgNTIsICA2MCwgIDcyLCAgODgsCi0gICAxMDgsIDEyOAotfTsKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOF8xMjhbMTZdID0gezAsICA0LCAgOCwgIDEyLCAxNiwgMjAsIDI0LCAgMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNiwgNDQsIDUyLCA2MCwgNzIsIDg4LCAxMDgsIDEyOH07CiAKK3N0YXRpYyBjb25zdCBTSE9SVAorICAgIHNmYl85Nl85NjBbNDJdID0gezAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsCisgICAgICAgICAgICAgICAgICAgICAgNDQsICA0OCwgIDUyLCAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgIDk2LCAgMTA4LCAxMjAsCisgICAgICAgICAgICAgICAgICAgICAgMTMyLCAxNDQsIDE1NiwgMTcyLCAxODgsIDIxMiwgMjQwLCAyNzYsIDMyMCwgMzg0LCA0NDgsCisgICAgICAgICAgICAgICAgICAgICAgNTEyLCA1NzYsIDY0MCwgNzA0LCA3NjgsIDgzMiwgODk2LCA5NjB9OyAvKiA0MCBzY2ZiYW5kcyAqLwogCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzk2Xzk2MFs0Ml0gPQotewotICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKLSAgNDAsICAgICA0NCwgICAgIDQ4LCAgICAgNTIsICAgICA1NiwgICAgIDY0LCAgICAgNzIsICAgICA4MCwgICAgIDg4LCAgICAgOTYsCi0gIDEwOCwgICAgMTIwLCAgICAxMzIsICAgIDE0NCwgICAgMTU2LCAgICAxNzIsICAgIDE4OCwgICAgMjEyLCAgICAyNDAsICAgIDI3NiwKLSAgMzIwLCAgICAzODQsICAgIDQ0OCwgICAgNTEyLCAgICA1NzYsICAgIDY0MCwgICAgNzA0LCAgICA3NjgsICAgIDgzMiwgICAgODk2LAotICA5NjAKLX07ICAgLyogNDAgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfMTIwWzEzXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgNDAsIDQ4LCA2NCwgOTIsIDEyMH07IC8qIDEyIHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfMTIwWzEzXSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMzIsICAgICA0MCwgICAgIDQ4LAotICA2NCwgICAgIDkyLCAgICAgMTIwCi19OyAgIC8qIDEyIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0Xzk2MFs0N10gPSB7CisgICAgMCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LAorICAgIDQ4LCAgNTIsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgMTAwLCAxMTIsIDEyNCwgMTQwLCAxNTYsCisgICAgMTcyLCAxOTIsIDIxNiwgMjQwLCAyNjgsIDMwNCwgMzQ0LCAzODQsIDQyNCwgNDY0LCA1MDQsIDU0NCwKKyAgICA1ODQsIDYyNCwgNjY0LCA3MDQsIDc0NCwgNzg0LCA4MjQsIDg2NCwgOTA0LCA5NDQsIDk2MH07IC8qIDQ2IHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfOTYwWzQ3XSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAotICA0MCwgICAgIDQ0LCAgICAgNDgsICAgICA1MiwgICAgIDU2LCAgICAgNjQsICAgICA3MiwgICAgIDgwLCAgICAgODgsICAgICAxMDAsCi0gIDExMiwgICAgMTI0LCAgICAxNDAsICAgIDE1NiwgICAgMTcyLCAgICAxOTIsICAgIDIxNiwgICAgMjQwLCAgICAyNjgsICAgIDMwNCwKLSAgMzQ0LCAgICAzODQsICAgIDQyNCwgICAgNDY0LCAgICA1MDQsICAgIDU0NCwgICAgNTg0LCAgICA2MjQsICAgIDY2NCwgICAgNzA0LAotICA3NDQsICAgIDc4NCwgICAgODI0LCAgICA4NjQsICAgIDkwNCwgICAgOTQ0LCAgICA5NjAKLX07ICAgLyogNDYgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTIwWzEzXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgNDAsIDQ4LCA2NCwgOTIsIDEyMH07IC8qIDEyIHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTIwWzEzXSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMzIsICAgICA0MCwgICAgIDQ4LAotICA2NCwgICAgIDkyLCAgICAgMTIwCi19OyAgIC8qIDEyIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4Xzk2MFs1MF0gPSB7CisgICAgMCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ4LCAgNTYsCisgICAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LAorICAgIDI0MCwgMjY0LCAyOTIsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4LCA0ODAsIDUxMiwgNTQ0LCA1NzYsIDYwOCwKKyAgICA2NDAsIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LCA5MjgsIDk2MH07IC8qIDQ5IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4XzEyMFsxNV0gPSB7CisgICAgMCwgIDQsICA4LCAgMTIsIDE2LCAyMCwgIDI4LCAzNiwKKyAgICA0NCwgNTYsIDY4LCA4MCwgOTYsIDExMiwgMTIwfTsgLyogMTQgc2NmYmFuZHMgKi8KIAotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF85NjBbNTBdID0KLXsKLSAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjQsICAgICAyOCwgICAgIDMyLCAgICAgMzYsCi0gIDQwLCAgICAgNDgsICAgICA1NiwgICAgIDY0LCAgICAgNzIsICAgICA4MCwgICAgIDg4LCAgICAgOTYsICAgICAxMDgsICAgIDEyMCwKLSAgMTMyLCAgICAxNDQsICAgIDE2MCwgICAgMTc2LCAgICAxOTYsICAgIDIxNiwgICAgMjQwLCAgICAyNjQsICAgIDI5MiwgICAgMzIwLAotICAzNTIsICAgIDM4NCwgICAgNDE2LCAgICA0NDgsICAgIDQ4MCwgICAgNTEyLCAgICA1NDQsICAgIDU3NiwgICAgNjA4LCAgICA2NDAsCi0gIDY3MiwgICAgNzA0LCAgICA3MzYsICAgIDc2OCwgICAgODAwLCAgICA4MzIsICAgIDg2NCwgICAgODk2LCAgICA5MjgsICAgIDk2MAotfTsgICAvKiA0OSBzY2ZiYW5kcyAqLwotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF8xMjBbMTVdID0KLXsKLSAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjgsICAgICAzNiwgICAgIDQ0LCAgICAgNTYsCi0gIDY4LCAgICAgODAsICAgICA5NiwgICAgIDExMiwgICAgMTIwCi19OyAgIC8qIDE0IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzMyXzk2MFs1MF0gPSB7CisgICAgMCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ4LCAgNTYsCisgICAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LAorICAgIDI0MCwgMjY0LCAyOTIsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4LCA0ODAsIDUxMiwgNTQ0LCA1NzYsIDYwOCwKKyAgICA2NDAsIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LCA5MjgsIDk2MH07IC8qIDQ5IHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMzJfOTYwWzUwXSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAotICA0MCwgICAgIDQ4LCAgICAgNTYsICAgICA2NCwgICAgIDcyLCAgICAgODAsICAgICA4OCwgICAgIDk2LCAgICAgMTA4LCAgICAxMjAsCi0gIDEzMiwgICAgMTQ0LCAgICAxNjAsICAgIDE3NiwgICAgMTk2LCAgICAyMTYsICAgIDI0MCwgICAgMjY0LCAgICAyOTIsICAgIDMyMCwKLSAgMzUyLCAgICAzODQsICAgIDQxNiwgICAgNDQ4LCAgICA0ODAsICAgIDUxMiwgICAgNTQ0LCAgICA1NzYsICAgIDYwOCwgICAgNjQwLAotICA2NzIsICAgIDcwNCwgICAgNzM2LCAgICA3NjgsICAgIDgwMCwgICAgODMyLCAgICA4NjQsICAgIDg5NiwgICAgOTI4LCAgICA5NjAKLX07ICAgLyogNDkgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMjRfOTYwWzQ3XSA9IHsKKyAgICAwLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsCisgICAgNTIsICA2MCwgIDY4LCAgNzYsICA4NCwgIDkyLCAgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzYsIDE0OCwKKyAgICAxNjAsIDE3MiwgMTg4LCAyMDQsIDIyMCwgMjQwLCAyNjAsIDI4NCwgMzA4LCAzMzYsIDM2NCwgMzk2LAorICAgIDQzMiwgNDY4LCA1MDgsIDU1MiwgNjAwLCA2NTIsIDcwNCwgNzY4LCA4MzIsIDg5NiwgOTYwfTsgLyogNDYgc2NmYmFuZHMgKi8KIAotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8yNF85NjBbNDddID0KLXsKLSAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjQsICAgICAyOCwgICAgIDMyLCAgICAgMzYsCi0gIDQwLCAgICAgNDQsICAgICA1MiwgICAgIDYwLCAgICAgNjgsICAgICA3NiwgICAgIDg0LCAgICAgOTIsICAgICAxMDAsICAgIDEwOCwKLSAgMTE2LCAgICAxMjQsICAgIDEzNiwgICAgMTQ4LCAgICAxNjAsICAgIDE3MiwgICAgMTg4LCAgICAyMDQsICAgIDIyMCwgICAgMjQwLAotICAyNjAsICAgIDI4NCwgICAgMzA4LCAgICAzMzYsICAgIDM2NCwgICAgMzk2LCAgICA0MzIsICAgIDQ2OCwgICAgNTA4LCAgICA1NTIsCi0gIDYwMCwgICAgNjUyLCAgICA3MDQsICAgIDc2OCwgICAgODMyLCAgICA4OTYsICAgIDk2MAotfTsgICAvKiA0NiBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8yNF8xMjBbMTZdID0geworICAgIDAsICA0LCAgOCwgIDEyLCAxNiwgMjAsIDI0LCAgMjgsCisgICAgMzYsIDQ0LCA1MiwgNjQsIDc2LCA5MiwgMTA4LCAxMjB9OyAvKiAxNSBzY2ZiYW5kcyAqLwogCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzI0XzEyMFsxNl0gPQotewotICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzYsICAgICA0NCwKLSAgNTIsICAgICA2NCwgICAgIDc2LCAgICAgOTIsICAgICAxMDgsICAgIDEyMAotfTsgICAvKiAxNSBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8xNl85NjBbNDNdID0gezAsICAgOCwgICAxNiwgIDI0LCAgMzIsICA0MCwgIDQ4LCAgNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsICA3MiwgIDgwLCAgODgsICAxMDAsIDExMiwgMTI0LCAxMzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ4LCAxNjAsIDE3MiwgMTg0LCAxOTYsIDIxMiwgMjI4LCAyNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYwLCAyODAsIDMwMCwgMzIwLCAzNDQsIDM2OCwgMzk2LCA0MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDU2LCA0OTIsIDUzMiwgNTcyLCA2MTYsIDY2NCwgNzE2LCA3NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODMyLCA4OTYsIDk2MH07IC8qIDQyIHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMTZfOTYwWzQzXSA9Ci17Ci0gIDAsICAgICAgOCwgICAgICAxNiwgICAgIDI0LCAgICAgMzIsICAgICA0MCwgICAgIDQ4LCAgICAgNTYsICAgICA2NCwgICAgIDcyLAotICA4MCwgICAgIDg4LCAgICAgMTAwLCAgICAxMTIsICAgIDEyNCwgICAgMTM2LCAgICAxNDgsICAgIDE2MCwgICAgMTcyLCAgICAxODQsCi0gIDE5NiwgICAgMjEyLCAgICAyMjgsICAgIDI0NCwgICAgMjYwLCAgICAyODAsICAgIDMwMCwgICAgMzIwLCAgICAzNDQsICAgIDM2OCwKLSAgMzk2LCAgICA0MjQsICAgIDQ1NiwgICAgNDkyLCAgICA1MzIsICAgIDU3MiwgICAgNjE2LCAgICA2NjQsICAgIDcxNiwgICAgNzcyLAotICA4MzIsICAgIDg5NiwgICAgOTYwCi19OyAgIC8qIDQyIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzE2XzEyMFsxNl0gPSB7CisgICAgMCwgIDQsICA4LCAgMTIsIDE2LCAyMCwgMjQsICAyOCwKKyAgICAzMiwgNDAsIDQ4LCA2MCwgNzIsIDg4LCAxMDgsIDEyMH07IC8qIDE1IHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMTZfMTIwWzE2XSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDQwLAotICA0OCwgICAgIDYwLCAgICAgNzIsICAgICA4OCwgICAgIDEwOCwgICAgMTIwCi19OyAgIC8qIDE1IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzhfOTYwWzQxXSA9IHswLCAgIDEyLCAgMjQsICAzNiwgIDQ4LCAgNjAsICA3MiwgIDg0LCAgOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDgsIDEyMCwgMTMyLCAxNDQsIDE1NiwgMTcyLCAxODgsIDIwNCwgMjIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM2LCAyNTIsIDI2OCwgMjg4LCAzMDgsIDMyOCwgMzQ4LCAzNzIsIDM5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyMCwgNDQ4LCA0NzYsIDUwOCwgNTQ0LCA1ODAsIDYyMCwgNjY0LCA3MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NjQsIDgyMCwgODgwLCA5NDQsIDk2MH07IC8qIDQwIHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfOF85NjBbNDFdID0KLXsKLSAgMCwgICAgICAxMiwgICAgIDI0LCAgICAgMzYsICAgICA0OCwgICAgIDYwLCAgICAgNzIsICAgICA4NCwgICAgIDk2LCAgICAgMTA4LAotICAxMjAsICAgIDEzMiwgICAgMTQ0LCAgICAxNTYsICAgIDE3MiwgICAgMTg4LCAgICAyMDQsICAgIDIyMCwgICAgMjM2LCAgICAyNTIsCi0gIDI2OCwgICAgMjg4LCAgICAzMDgsICAgIDMyOCwgICAgMzQ4LCAgICAzNzIsICAgIDM5NiwgICAgNDIwLCAgICA0NDgsICAgIDQ3NiwKLSAgNTA4LCAgICA1NDQsICAgIDU4MCwgICAgNjIwLCAgICA2NjQsICAgIDcxMiwgICAgNzY0LCAgICA4MjAsICAgIDg4MCwgICAgOTQ0LAotICA5NjAKLX07ICAgLyogNDAgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOF8xMjBbMTZdID0geworICAgIDAsICA0LCAgOCwgIDEyLCAxNiwgMjAsIDI0LCAgMjgsCisgICAgMzYsIDQ0LCA1MiwgNjAsIDcyLCA4OCwgMTA4LCAxMjB9OyAvKiAxNSBzY2ZiYW5kcyAqLwogCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzhfMTIwWzE2XSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzNiwgICAgIDQ0LAotICA1MiwgICAgIDYwLCAgICAgNzIsICAgICA4OCwgICAgIDEwOCwgICAgMTIwCi19OyAgIC8qIDE1IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQKKyAgICBzZmJfOTZfNzY4W10gPSB7MCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsCisgICAgICAgICAgICAgICAgICAgIDQwLCAgNDQsICA0OCwgIDUyLCAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgIDk2LAorICAgICAgICAgICAgICAgICAgICAxMDgsIDEyMCwgMTMyLCAxNDQsIDE1NiwgMTcyLCAxODgsIDIxMiwgMjQwLCAyNzYsCisgICAgICAgICAgICAgICAgICAgIDMyMCwgMzg0LCA0NDgsIDUxMiwgNTc2LCA2NDAsIDcwNCwgNzY4fTsgLyogMzcgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfOTZbXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgNDAsIDQ4LCA2NCwgOTIsIDk2fTsgLyogMTIgc2NmYmFuZHMgKi8KIAorc3RhdGljIGNvbnN0IFNIT1JUIHNmYl82NF83NjhbXSA9CisgICAgeworICAgICAgICAwLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLAorICAgICAgICA0NCwgIDQ4LCAgNTIsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgMTAwLCAxMTIsIDEyNCwKKyAgICAgICAgMTQwLCAxNTYsIDE3MiwgMTkyLCAyMTYsIDI0MCwgMjY4LCAzMDQsIDM0NCwgMzg0LCA0MjQsCisgICAgICAgIDQ2NCwgNTA0LCA1NDQsIDU4NCwgNjI0LCA2NjQsIDcwNCwgNzQ0LCA3Njh9OyAvKiA0MSBzY2ZiYW5kcyAqLwogCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0Xzk2W10gPSB7MCwgIDQsICA4LCAgMTIsIDE2LCAyMCwgMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsIDQwLCA0OCwgNjQsIDkyLCA5Nn07IC8qIDEyIHNjZmJhbmRzICovCiAKK3N0YXRpYyBjb25zdCBTSE9SVAorICAgIHNmYl80OF83NjhbXSA9IHswLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDgsCisgICAgICAgICAgICAgICAgICAgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTYwLCAxNzYsCisgICAgICAgICAgICAgICAgICAgIDE5NiwgMjE2LCAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCA1MTIsCisgICAgICAgICAgICAgICAgICAgIDU0NCwgNTc2LCA2MDgsIDY0MCwgNjcyLCA3MDQsIDczNiwgNzY4fTsgLyogNDMgc2NmYmFuZHMgKi8KIAotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF81MTJbMzddID0KLXsKLSAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjQsICAgICAyOCwgICAgIDMyLCAgICAgMzYsCi0gIDQwLCAgICAgNDQsICAgICA0OCwgICAgIDUyLCAgICAgNTYsICAgICA2MCwgICAgIDY4LCAgICAgNzYsICAgICA4NCwgICAgIDkyLAotICAxMDAsICAgIDExMiwgICAgMTI0LCAgICAxMzYsICAgIDE0OCwgICAgMTY0LCAgICAxODQsICAgIDIwOCwgICAgMjM2LCAgICAyNjgsCi0gIDMwMCwgICAgMzMyLCAgICAzNjQsICAgIDM5NiwgICAgNDI4LCAgICA0NjAsICAgIDUxMgotfTsgICAvKiAzNiBzY2ZiYW5kcyAqLwotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8zMl81MTJbMzhdID0KLXsKLSAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjQsICAgICAyOCwgICAgIDMyLCAgICAgMzYsCi0gIDQwLCAgICAgNDQsICAgICA0OCwgICAgIDUyLCAgICAgNTYsICAgICA2NCwgICAgIDcyLCAgICAgODAsICAgICA4OCwgICAgIDk2LAotICAxMDgsICAgIDEyMCwgICAgMTMyLCAgICAxNDQsICAgIDE2MCwgICAgMTc2LCAgICAxOTIsICAgIDIxMiwgICAgMjM2LCAgICAyNjAsCi0gIDI4OCwgICAgMzIwLCAgICAzNTIsICAgIDM4NCwgICAgNDE2LCAgICA0NDgsICAgIDQ4MCwgICAgNTEyCi19OyAgIC8qIDM3IHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzI0XzUxMlszMl0gPQotewotICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKLSAgNDAsICAgICA0NCwgICAgIDUyLCAgICAgNjAsICAgICA2OCwgICAgIDgwLCAgICAgOTIsICAgICAxMDQsICAgIDEyMCwgICAgMTQwLAotICAxNjQsICAgIDE5MiwgICAgMjI0LCAgICAyNTYsICAgIDI4OCwgICAgMzIwLCAgICAzNTIsICAgIDM4NCwgICAgNDE2LCAgICA0NDgsCi0gIDQ4MCwgICAgNTEyCi19OyAgIC8qIDMxIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4Xzk2W10gPSB7MCwgIDQsICA4LCAgMTIsIDE2LCAyMCwgMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzYsIDQ0LCA1NiwgNjgsIDgwLCA5Nn07IC8qIDEyIHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNDhfNDgwWzM2XSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAotICA0MCwgICAgIDQ0LCAgICAgNDgsICAgICA1MiwgICAgIDU2LCAgICAgNjQsICAgICA3MiwgICAgIDgwLCAgICAgODgsICAgICA5NiwKLSAgMTA4LCAgICAxMjAsICAgIDEzMiwgICAgMTQ0LCAgICAxNTYsICAgIDE3MiwgICAgMTg4LCAgICAyMTIsICAgIDI0MCwgICAgMjcyLAotICAzMDQsICAgIDMzNiwgICAgMzY4LCAgICA0MDAsICAgIDQzMiwgICAgNDgwCi19OyAgIC8qIDM1IHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzMyXzQ4MFszOF0gPQotewotICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKLSAgNDAsICAgICA0NCwgICAgIDQ4LCAgICAgNTIsICAgICA1NiwgICAgIDYwLCAgICAgNjQsICAgICA3MiwgICAgIDgwLCAgICAgODgsCi0gIDk2LCAgICAgMTA0LCAgICAxMTIsICAgIDEyNCwgICAgMTM2LCAgICAxNDgsICAgIDE2NCwgICAgMTgwLCAgICAyMDAsICAgIDIyNCwKLSAgMjU2LCAgICAyODgsICAgIDMyMCwgICAgMzUyLCAgICAzODQsICAgIDQxNiwgICAgNDQ4LCAgICA0ODAKLX07ICAgLyogMzcgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVAorICAgIHNmYl8zMl83NjhbXSA9IHswLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDgsCisgICAgICAgICAgICAgICAgICAgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTYwLCAxNzYsCisgICAgICAgICAgICAgICAgICAgIDE5NiwgMjE2LCAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCA1MTIsCisgICAgICAgICAgICAgICAgICAgIDU0NCwgNTc2LCA2MDgsIDY0MCwgNjcyLCA3MDQsIDczNiwgNzY4fTsgLyogNDMgc2NmYmFuZHMgKi8KKworc3RhdGljIGNvbnN0IFNIT1JUCisgICAgc2ZiXzI0Xzc2OFtdID0gezAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwKKyAgICAgICAgICAgICAgICAgICAgNTIsICA2MCwgIDY4LCAgNzYsICA4NCwgIDkyLCAgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzYsIDE0OCwKKyAgICAgICAgICAgICAgICAgICAgMTYwLCAxNzIsIDE4OCwgMjA0LCAyMjAsIDI0MCwgMjYwLCAyODQsIDMwOCwgMzM2LCAzNjQsIDM5NiwKKyAgICAgICAgICAgICAgICAgICAgNDMyLCA0NjgsIDUwOCwgNTUyLCA2MDAsIDY1MiwgNzA0LCA3Njh9OyAvKiA0MyBzY2ZiYW5kcyAqLworCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzI0Xzk2W10gPSB7MCwgIDQsICA4LCAgMTIsIDE2LCAyMCwgMjQsIDI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2LCA0NCwgNTIsIDY0LCA3NiwgOTIsIDk2fTsgLyogMTQgc2NmYmFuZHMgKi8KKworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8xNl83NjhbXSA9IHswLCAgIDgsICAgMTYsICAyNCwgIDMyLCAgNDAsICA0OCwgIDU2LCAgNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLCAgODAsICA4OCwgIDEwMCwgMTEyLCAxMjQsIDEzNiwgMTQ4LCAxNjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3MiwgMTg0LCAxOTYsIDIxMiwgMjI4LCAyNDQsIDI2MCwgMjgwLCAzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCwgMzQ0LCAzNjgsIDM5NiwgNDI0LCA0NTYsIDQ5MiwgNTMyLCA1NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYxNiwgNjY0LCA3MTYsIDc2OH07IC8qIDM5IHNjZmJhbmRzICovCisKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMTZfOTZbXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwgMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsIDQwLCA0OCwgNjAsIDcyLCA4OCwgOTZ9OyAvKiAxNCBzY2ZiYW5kcyAqLworCitzdGF0aWMgY29uc3QgU0hPUlQKKyAgICBzZmJfOF83NjhbXSA9IHswLCAgIDEyLCAgMjQsICAzNiwgIDQ4LCAgNjAsICA3MiwgIDg0LCAgOTYsICAxMDgsCisgICAgICAgICAgICAgICAgICAgMTIwLCAxMzIsIDE0NCwgMTU2LCAxNzIsIDE4OCwgMjA0LCAyMjAsIDIzNiwgMjUyLAorICAgICAgICAgICAgICAgICAgIDI2OCwgMjg4LCAzMDgsIDMyOCwgMzQ4LCAzNzIsIDM5NiwgNDIwLCA0NDgsIDQ3NiwKKyAgICAgICAgICAgICAgICAgICA1MDgsIDU0NCwgNTgwLCA2MjAsIDY2NCwgNzEyLCA3NjQsIDc2OH07IC8qIDM3IHNjZmJhbmRzICovCisKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOF85NltdID0gezAsICA0LCAgOCwgIDEyLCAxNiwgMjAsIDI0LCAyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2LCA0NCwgNTIsIDYwLCA3MiwgODgsIDk2fTsgLyogMTQgc2NmYmFuZHMgKi8KKworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF81MTJbMzddID0geworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDQ4LAorICAgIDUyLCAgNTYsICA2MCwgIDY4LCAgNzYsICA4NCwgIDkyLCAgMTAwLCAxMTIsIDEyNCwgMTM2LCAxNDgsIDE2NCwKKyAgICAxODQsIDIwOCwgMjM2LCAyNjgsIDMwMCwgMzMyLCAzNjQsIDM5NiwgNDI4LCA0NjAsIDUxMn07IC8qIDM2IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQKKyAgICBzZmJfMzJfNTEyWzM4XSA9IHswLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwKKyAgICAgICAgICAgICAgICAgICAgICA0MCwgIDQ0LCAgNDgsICA1MiwgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwKKyAgICAgICAgICAgICAgICAgICAgICAxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIxMiwgMjM2LCAyNjAsCisgICAgICAgICAgICAgICAgICAgICAgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCA1MTJ9OyAvKiAzNyBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8yNF81MTJbMzJdID0geworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsCisgICAgNDQsICA1MiwgIDYwLCAgNjgsICA4MCwgIDkyLCAgMTA0LCAxMjAsIDE0MCwgMTY0LCAxOTIsCisgICAgMjI0LCAyNTYsIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgsIDQ4MCwgNTEyfTsgLyogMzEgc2NmYmFuZHMgKi8KKworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF80ODBbMzZdID0geworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDQ4LAorICAgIDUyLCAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgIDk2LCAgMTA4LCAxMjAsIDEzMiwgMTQ0LCAxNTYsIDE3MiwKKyAgICAxODgsIDIxMiwgMjQwLCAyNzIsIDMwNCwgMzM2LCAzNjgsIDQwMCwgNDMyLCA0ODB9OyAvKiAzNSBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUCisgICAgc2ZiXzMyXzQ4MFszOF0gPSB7MCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsCisgICAgICAgICAgICAgICAgICAgICAgNDAsICA0NCwgIDQ4LCAgNTIsICA1NiwgIDYwLCAgNjQsICA3MiwgIDgwLCAgODgsCisgICAgICAgICAgICAgICAgICAgICAgOTYsICAxMDQsIDExMiwgMTI0LCAxMzYsIDE0OCwgMTY0LCAxODAsIDIwMCwgMjI0LAorICAgICAgICAgICAgICAgICAgICAgIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwfTsgLyogMzcgc2NmYmFuZHMgKi8KIHN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMjRfNDgwWzMxXSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAotICA0MCwgICAgIDQ0LCAgICAgNTIsICAgICA2MCwgICAgIDY4LCAgICAgODAsICAgICA5MiwgICAgIDEwNCwgICAgMTIwLCAgICAxNDAsCi0gIDE2NCwgICAgMTkyLCAgICAyMjQsICAgIDI1NiwgICAgMjg4LCAgICAzMjAsICAgIDM1MiwgICAgMzg0LCAgICA0MTYsICAgIDQ0OCwKLSAgNDgwCi19OyAgIC8qIDMwIHNjZmJhbmRzICovCisgICAgezAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsCisgICAgIDQ0LCAgNTIsICA2MCwgIDY4LCAgODAsICA5MiwgIDEwNCwgMTIwLCAxNDAsIDE2NCwgMTkyLAorICAgICAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwfTsgLyogMzAgc2NmYmFuZHMgKi8KIAotY29uc3QgU0ZCX0lORk8gc2ZiT2Zmc2V0VGFibGVzWzVdWzE2XSA9Ci17Ci0gIHsKLSAgICB7IHNmYl85Nl8xMDI0LCBzZmJfOTZfMTI4LCA0MSwgMTIgfSwKLSAgICB7IHNmYl85Nl8xMDI0LCBzZmJfOTZfMTI4LCA0MSwgMTIgfSwKLSAgICB7IHNmYl82NF8xMDI0LCBzZmJfNjRfMTI4LCA0NywgMTIgfSwKLSAgICB7IHNmYl80OF8xMDI0LCBzZmJfNDhfMTI4LCA0OSwgMTQgfSwKLSAgICB7IHNmYl80OF8xMDI0LCBzZmJfNDhfMTI4LCA0OSwgMTQgfSwKLSAgICB7IHNmYl8zMl8xMDI0LCBzZmJfNDhfMTI4LCA1MSwgMTQgfSwKLSAgICB7IHNmYl8yNF8xMDI0LCBzZmJfMjRfMTI4LCA0NywgMTUgfSwKLSAgICB7IHNmYl8yNF8xMDI0LCBzZmJfMjRfMTI4LCA0NywgMTUgfSwKLSAgICB7IHNmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTUgfSwKLSAgICB7IHNmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTUgfSwKLSAgICB7IHNmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTUgfSwKLSAgICB7IHNmYl84XzEwMjQsIHNmYl84XzEyOCwgNDAsIDE1IH0sCi0gICAgeyBzZmJfOF8xMDI0LCBzZmJfOF8xMjgsIDQwLCAxNSB9LAotICB9LCB7Ci0gICAgeyBzZmJfOTZfOTYwLCBzZmJfOTZfMTIwLCA0MCwgMTIgfSwKLSAgICB7IHNmYl85Nl85NjAsIHNmYl85Nl8xMjAsIDQwLCAxMiB9LAotICAgIHsgc2ZiXzY0Xzk2MCwgc2ZiXzY0XzEyMCwgNDYsIDEyIH0sCi0gICAgeyBzZmJfNDhfOTYwLCBzZmJfNDhfMTIwLCA0OSwgMTQgfSwKLSAgICB7IHNmYl80OF85NjAsIHNmYl80OF8xMjAsIDQ5LCAxNCB9LAotICAgIHsgc2ZiXzMyXzk2MCwgc2ZiXzQ4XzEyMCwgNDksIDE0IH0sCi0gICAgeyBzZmJfMjRfOTYwLCBzZmJfMjRfMTIwLCA0NiwgMTUgfSwKLSAgICB7IHNmYl8yNF85NjAsIHNmYl8yNF8xMjAsIDQ2LCAxNSB9LAotICAgIHsgc2ZiXzE2Xzk2MCwgc2ZiXzE2XzEyMCwgNDIsIDE1IH0sCi0gICAgeyBzZmJfMTZfOTYwLCBzZmJfMTZfMTIwLCA0MiwgMTUgfSwKLSAgICB7IHNmYl8xNl85NjAsIHNmYl8xNl8xMjAsIDQyLCAxNSB9LAotICAgIHsgc2ZiXzhfOTYwLCBzZmJfOF8xMjAsIDQwLCAxNSB9LAotICAgIHsgc2ZiXzhfOTYwLCBzZmJfOF8xMjAsIDQwLCAxNSB9LAotICB9LCB7Ci0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gIH0sIHsKLSAgICB7IHNmYl80OF81MTIsICBOVUxMLCAzNiwgMCB9LAotICAgIHsgc2ZiXzQ4XzUxMiwgIE5VTEwsIDM2LCAwIH0sCi0gICAgeyBzZmJfNDhfNTEyLCAgTlVMTCwgMzYsIDAgfSwKLSAgICB7IHNmYl80OF81MTIsICBOVUxMLCAzNiwgMCB9LAotICAgIHsgc2ZiXzQ4XzUxMiwgTlVMTCwgMzYsIDB9LAotICAgIHsgc2ZiXzMyXzUxMiwgTlVMTCwgMzcsIDAgfSwKLSAgICB7IHNmYl8yNF81MTIsIE5VTEwsIDMxLCAwIH0sCi0gICAgeyBzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMCB9LAotICAgIHsgc2ZiXzI0XzUxMiwgTlVMTCwgMzEsIDAgfSwKLSAgICB7IHNmYl8yNF81MTIsIE5VTEwsIDMxLCAwIH0sCi0gICAgeyBzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMCB9LAotICAgIHsgc2ZiXzI0XzUxMiwgTlVMTCwgMzEsIDAgfSwKLSAgICB7IHNmYl8yNF81MTIsIE5VTEwsIDMxLCAwIH0sCi0gIH0sIHsKLSAgICB7IHNmYl80OF80ODAsIE5VTEwsIDM1LCAwIH0sCi0gICAgeyBzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMCB9LAotICAgIHsgc2ZiXzQ4XzQ4MCwgTlVMTCwgMzUsIDAgfSwKLSAgICB7IHNmYl80OF80ODAsIE5VTEwsIDM1LCAwIH0sCi0gICAgeyBzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMCB9LAotICAgIHsgc2ZiXzMyXzQ4MCwgTlVMTCwgMzcsIDAgfSwKLSAgICB7IHNmYl8yNF80ODAsIE5VTEwsIDMwLCAwIH0sCi0gICAgeyBzZmJfMjRfNDgwLCBOVUxMLCAzMCwgMCB9LAotICAgIHsgc2ZiXzI0XzQ4MCwgTlVMTCwgMzAsIDAgfSwKLSAgICB7IHNmYl8yNF80ODAsIE5VTEwsIDMwLCAwIH0sCi0gICAgeyBzZmJfMjRfNDgwLCBOVUxMLCAzMCwgMCB9LAotICAgIHsgc2ZiXzI0XzQ4MCwgTlVMTCwgMzAsIDAgfSwKLSAgICB7IHNmYl8yNF80ODAsIE5VTEwsIDMwLCAwIH0sCi0gIH0KLX07Ci0KK2NvbnN0IFNGQl9JTkZPIHNmYk9mZnNldFRhYmxlc1s1XVsxNl0gPSB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl85Nl8xMDI0LCBzZmJfOTZfMTI4LCA0MSwgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl85Nl8xMDI0LCBzZmJfOTZfMTI4LCA0MSwgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl82NF8xMDI0LCBzZmJfNjRfMTI4LCA0NywgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF8xMDI0LCBzZmJfNDhfMTI4LCA0OSwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF8xMDI0LCBzZmJfNDhfMTI4LCA0OSwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8zMl8xMDI0LCBzZmJfNDhfMTI4LCA1MSwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF8xMDI0LCBzZmJfMjRfMTI4LCA0NywgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF8xMDI0LCBzZmJfMjRfMTI4LCA0NywgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl84XzEwMjQsIHNmYl84XzEyOCwgNDAsIDE1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfOF8xMDI0LCBzZmJfOF8xMjgsIDQwLCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfOTZfOTYwLCBzZmJfOTZfMTIwLCA0MCwgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl85Nl85NjAsIHNmYl85Nl8xMjAsIDQwLCAxMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzY0Xzk2MCwgc2ZiXzY0XzEyMCwgNDYsIDEyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfOTYwLCBzZmJfNDhfMTIwLCA0OSwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF85NjAsIHNmYl80OF8xMjAsIDQ5LCAxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzMyXzk2MCwgc2ZiXzQ4XzEyMCwgNDksIDE0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfOTYwLCBzZmJfMjRfMTIwLCA0NiwgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF85NjAsIHNmYl8yNF8xMjAsIDQ2LCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzE2Xzk2MCwgc2ZiXzE2XzEyMCwgNDIsIDE1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMTZfOTYwLCBzZmJfMTZfMTIwLCA0MiwgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8xNl85NjAsIHNmYl8xNl8xMjAsIDQyLCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzhfOTYwLCBzZmJfOF8xMjAsIDQwLCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzhfOTYwLCBzZmJfOF8xMjAsIDQwLCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfOTZfNzY4LCBzZmJfOTZfOTYsIDM3LCAxMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzk2Xzc2OCwgc2ZiXzk2Xzk2LCAzNywgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl82NF83NjgsIHNmYl82NF85NiwgNDEsIDEyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfNzY4LCBzZmJfNDhfOTYsIDQzLCAxMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzQ4Xzc2OCwgc2ZiXzQ4Xzk2LCA0MywgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8zMl83NjgsIHNmYl80OF85NiwgNDMsIDEyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfNzY4LCBzZmJfMjRfOTYsIDQzLCAxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzI0Xzc2OCwgc2ZiXzI0Xzk2LCA0MywgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8xNl83NjgsIHNmYl8xNl85NiwgMzksIDE0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMTZfNzY4LCBzZmJfMTZfOTYsIDM5LCAxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzE2Xzc2OCwgc2ZiXzE2Xzk2LCAzOSwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl84Xzc2OCwgc2ZiXzhfOTYsIDM3LCAxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzhfNzY4LCBzZmJfOF85NiwgMzcsIDE0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF81MTIsIE5VTEwsIDM2LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfNTEyLCBOVUxMLCAzNiwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzQ4XzUxMiwgTlVMTCwgMzYsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF81MTIsIE5VTEwsIDM2LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfNTEyLCBOVUxMLCAzNiwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzMyXzUxMiwgTlVMTCwgMzcsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF81MTIsIE5VTEwsIDMxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzI0XzUxMiwgTlVMTCwgMzEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF81MTIsIE5VTEwsIDMxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzI0XzUxMiwgTlVMTCwgMzEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF81MTIsIE5VTEwsIDMxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF80ODAsIE5VTEwsIDM1LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzQ4XzQ4MCwgTlVMTCwgMzUsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF80ODAsIE5VTEwsIDM1LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzMyXzQ4MCwgTlVMTCwgMzcsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF80ODAsIE5VTEwsIDMwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfNDgwLCBOVUxMLCAzMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzI0XzQ4MCwgTlVMTCwgMzAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF80ODAsIE5VTEwsIDMwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfNDgwLCBOVUxMLCAzMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzI0XzQ4MCwgTlVMTCwgMzAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF80ODAsIE5VTEwsIDMwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX07CiAKIC8qIyBkb24ndCB1c2UgMSBiaXQgaHVmbWFuIHRhYmxlcyAqLwogLyoKQEAgLTQ4NywxNDUxICs1MjcsMjkwMiBAQAogICBCaXQgMi4uOTogID0gVkFMVUUvUkVGIFRhYmxlcyAxLi4xMCxTQ0wKICAgQml0IDIuLjExOiA9IFZBTFVFL1JFRiBUYWJsZSAxMQogKi8KLSAgY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va18xWzUxXVs0XSA9Ci17Ci0gIHsweDAxNTcsMHgwMTU3LDB4MDAwNCwweDAwMTh9LCB7MHgwMDA4LDB4MDAwYywweDAwMTAsMHgwMDE0fSwgezB4MDE1YiwweDAxNWIsMHgwMTUzLDB4MDE1M30sIHsweDAwNTcsMHgwMDU3LDB4MDE2NywweDAxNjd9LAotICB7MHgwMjU3LDB4MDI1NywweDAxMTcsMHgwMTE3fSwgezB4MDE5NywweDAxOTcsMHgwMTQ3LDB4MDE0N30sIHsweDAwMWMsMHgwMDMwLDB4MDA0NCwweDAwNTh9LCB7MHgwMDIwLDB4MDAyNCwweDAwMjgsMHgwMDJjfSwKLSAgezB4MDE0YiwweDAxNGIsMHgwMTYzLDB4MDE2M30sIHsweDAyMTcsMHgwMjE3LDB4MDEyNywweDAxMjd9LCB7MHgwMTg3LDB4MDE4NywweDAwOTcsMHgwMDk3fSwgezB4MDE2YiwweDAxNmIsMHgwMDE3LDB4MDAxN30sCi0gIHsweDAwMzQsMHgwMDM4LDB4MDAzYywweDAwNDB9LCB7MHgwMTQzLDB4MDE0MywweDAxMDcsMHgwMTA3fSwgezB4MDExYiwweDAxMWIsMHgwMDY3LDB4MDA2N30sIHsweDAxOTMsMHgwMTkzLDB4MDI5NywweDAyOTd9LAotICB7MHgwMTliLDB4MDE5YiwweDAyNDcsMHgwMjQ3fSwgezB4MDA0OCwweDAwNGMsMHgwMDUwLDB4MDA1NH0sIHsweDAxYTcsMHgwMWE3LDB4MDI2NywweDAyNjd9LCB7MHgwMTEzLDB4MDExMywweDAyNWIsMHgwMjVifSwKLSAgezB4MDA1MywweDAwNTMsMHgwMDViLDB4MDA1Yn0sIHsweDAyNTMsMHgwMjUzLDB4MDA0NywweDAwNDd9LCB7MHgwMDVjLDB4MDA3MCwweDAwODQsMHgwMDk4fSwgezB4MDA2MCwweDAwNjQsMHgwMDY4LDB4MDA2Y30sCi0gIHsweDAxMmIsMHgwMTJiLDB4MDEyMywweDAxMjN9LCB7MHgwMThiLDB4MDE4YiwweDAwYTcsMHgwMGE3fSwgezB4MDIyNywweDAyMjcsMHgwMjg3LDB4MDI4N30sIHsweDAwODcsMHgwMDg3LDB4MDEwYiwweDAxMGJ9LAotICB7MHgwMDc0LDB4MDA3OCwweDAwN2MsMHgwMDgwfSwgezB4MDIxYiwweDAyMWIsMHgwMDI3LDB4MDAyN30sIHsweDAxYTMsMHgwMWEzLDB4MDA5MywweDAwOTN9LCB7MHgwMTgzLDB4MDE4MywweDAyMDcsMHgwMjA3fSwKLSAgezB4MDI0YiwweDAyNGIsMHgwMDRiLDB4MDA0Yn0sIHsweDAwODgsMHgwMDhjLDB4MDA5MCwweDAwOTR9LCB7MHgwMDYzLDB4MDA2MywweDAxMDMsMHgwMTAzfSwgezB4MDAwNywweDAwMDcsMHgwMmE3LDB4MDJhN30sCi0gIHsweDAwOWIsMHgwMDliLDB4MDI2YiwweDAyNmJ9LCB7MHgwMjYzLDB4MDI2MywweDAxYWIsMHgwMWFifSwgezB4MDA5YywweDAwYTAsMHgwMGE0LDB4MDBiOH0sIHsweDAyNDEsMHgwMDExLDB4MDA2OSwweDAwMTl9LAotICB7MHgwMjExLDB4MDA0MSwweDAyOTEsMHgwMjk5fSwgezB4MDBhOCwweDAwYWMsMHgwMGIwLDB4MDBiNH0sIHsweDAwOGIsMHgwMDhiLDB4MDIyMywweDAyMjN9LCB7MHgwMGEzLDB4MDBhMywweDAyMGIsMHgwMjBifSwKLSAgezB4MDJhYiwweDAyYWIsMHgwMjgzLDB4MDI4M30sIHsweDAwMmIsMHgwMDJiLDB4MDA4MywweDAwODN9LCB7MHgwMGJjLDB4MDBjMCwweDAwYzQsMHgwMGM4fSwgezB4MDAwMywweDAwMDMsMHgwMjJiLDB4MDIyYn0sCi0gIHsweDAyOGIsMHgwMjhiLDB4MDJhMywweDAyYTN9LCB7MHgwMDIzLDB4MDAyMywweDAyMDMsMHgwMjAzfSwgezB4MDAwYiwweDAwMGIsMHgwMGFiLDB4MDBhYn0KLX07Citjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzFbNTFdWzRdID0geworICAgIHsweDAxNTcsIDB4MDE1NywgMHgwMDA0LCAweDAwMTh9LCB7MHgwMDA4LCAweDAwMGMsIDB4MDAxMCwgMHgwMDE0fSwKKyAgICB7MHgwMTViLCAweDAxNWIsIDB4MDE1MywgMHgwMTUzfSwgezB4MDA1NywgMHgwMDU3LCAweDAxNjcsIDB4MDE2N30sCisgICAgezB4MDI1NywgMHgwMjU3LCAweDAxMTcsIDB4MDExN30sIHsweDAxOTcsIDB4MDE5NywgMHgwMTQ3LCAweDAxNDd9LAorICAgIHsweDAwMWMsIDB4MDAzMCwgMHgwMDQ0LCAweDAwNTh9LCB7MHgwMDIwLCAweDAwMjQsIDB4MDAyOCwgMHgwMDJjfSwKKyAgICB7MHgwMTRiLCAweDAxNGIsIDB4MDE2MywgMHgwMTYzfSwgezB4MDIxNywgMHgwMjE3LCAweDAxMjcsIDB4MDEyN30sCisgICAgezB4MDE4NywgMHgwMTg3LCAweDAwOTcsIDB4MDA5N30sIHsweDAxNmIsIDB4MDE2YiwgMHgwMDE3LCAweDAwMTd9LAorICAgIHsweDAwMzQsIDB4MDAzOCwgMHgwMDNjLCAweDAwNDB9LCB7MHgwMTQzLCAweDAxNDMsIDB4MDEwNywgMHgwMTA3fSwKKyAgICB7MHgwMTFiLCAweDAxMWIsIDB4MDA2NywgMHgwMDY3fSwgezB4MDE5MywgMHgwMTkzLCAweDAyOTcsIDB4MDI5N30sCisgICAgezB4MDE5YiwgMHgwMTliLCAweDAyNDcsIDB4MDI0N30sIHsweDAwNDgsIDB4MDA0YywgMHgwMDUwLCAweDAwNTR9LAorICAgIHsweDAxYTcsIDB4MDFhNywgMHgwMjY3LCAweDAyNjd9LCB7MHgwMTEzLCAweDAxMTMsIDB4MDI1YiwgMHgwMjVifSwKKyAgICB7MHgwMDUzLCAweDAwNTMsIDB4MDA1YiwgMHgwMDVifSwgezB4MDI1MywgMHgwMjUzLCAweDAwNDcsIDB4MDA0N30sCisgICAgezB4MDA1YywgMHgwMDcwLCAweDAwODQsIDB4MDA5OH0sIHsweDAwNjAsIDB4MDA2NCwgMHgwMDY4LCAweDAwNmN9LAorICAgIHsweDAxMmIsIDB4MDEyYiwgMHgwMTIzLCAweDAxMjN9LCB7MHgwMThiLCAweDAxOGIsIDB4MDBhNywgMHgwMGE3fSwKKyAgICB7MHgwMjI3LCAweDAyMjcsIDB4MDI4NywgMHgwMjg3fSwgezB4MDA4NywgMHgwMDg3LCAweDAxMGIsIDB4MDEwYn0sCisgICAgezB4MDA3NCwgMHgwMDc4LCAweDAwN2MsIDB4MDA4MH0sIHsweDAyMWIsIDB4MDIxYiwgMHgwMDI3LCAweDAwMjd9LAorICAgIHsweDAxYTMsIDB4MDFhMywgMHgwMDkzLCAweDAwOTN9LCB7MHgwMTgzLCAweDAxODMsIDB4MDIwNywgMHgwMjA3fSwKKyAgICB7MHgwMjRiLCAweDAyNGIsIDB4MDA0YiwgMHgwMDRifSwgezB4MDA4OCwgMHgwMDhjLCAweDAwOTAsIDB4MDA5NH0sCisgICAgezB4MDA2MywgMHgwMDYzLCAweDAxMDMsIDB4MDEwM30sIHsweDAwMDcsIDB4MDAwNywgMHgwMmE3LCAweDAyYTd9LAorICAgIHsweDAwOWIsIDB4MDA5YiwgMHgwMjZiLCAweDAyNmJ9LCB7MHgwMjYzLCAweDAyNjMsIDB4MDFhYiwgMHgwMWFifSwKKyAgICB7MHgwMDljLCAweDAwYTAsIDB4MDBhNCwgMHgwMGI4fSwgezB4MDI0MSwgMHgwMDExLCAweDAwNjksIDB4MDAxOX0sCisgICAgezB4MDIxMSwgMHgwMDQxLCAweDAyOTEsIDB4MDI5OX0sIHsweDAwYTgsIDB4MDBhYywgMHgwMGIwLCAweDAwYjR9LAorICAgIHsweDAwOGIsIDB4MDA4YiwgMHgwMjIzLCAweDAyMjN9LCB7MHgwMGEzLCAweDAwYTMsIDB4MDIwYiwgMHgwMjBifSwKKyAgICB7MHgwMmFiLCAweDAyYWIsIDB4MDI4MywgMHgwMjgzfSwgezB4MDAyYiwgMHgwMDJiLCAweDAwODMsIDB4MDA4M30sCisgICAgezB4MDBiYywgMHgwMGMwLCAweDAwYzQsIDB4MDBjOH0sIHsweDAwMDMsIDB4MDAwMywgMHgwMjJiLCAweDAyMmJ9LAorICAgIHsweDAyOGIsIDB4MDI4YiwgMHgwMmEzLCAweDAyYTN9LCB7MHgwMDIzLCAweDAwMjMsIDB4MDIwMywgMHgwMjAzfSwKKyAgICB7MHgwMDBiLCAweDAwMGIsIDB4MDBhYiwgMHgwMGFifX07CiAKLWNvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfMlszOV1bNF0gPQotewotICB7MHgwMDA0LDB4MDAwYywweDAwMjAsMHgwMDM0fSwgezB4MDE1NywweDAxNTcsMHgwMTU5LDB4MDAwOH0sIHsweDAxNTMsMHgwMTUzLDB4MDI1NywweDAyNTd9LCB7MHgwMDEwLDB4MDAxNCwweDAwMTgsMHgwMDFjfSwKLSAgezB4MDExNywweDAxMTcsMHgwMDU3LDB4MDA1N30sIHsweDAxNDcsMHgwMTQ3LDB4MDE5NywweDAxOTd9LCB7MHgwMTY3LDB4MDE2NywweDAxODUsMHgwMTYxfSwgezB4MDEyNSwweDAwOTUsMHgwMDY1LDB4MDIxNX0sCi0gIHsweDAwMjQsMHgwMDI4LDB4MDAyYywweDAwMzB9LCB7MHgwMDUxLDB4MDE0OSwweDAxMTksMHgwMTQxfSwgezB4MDAxNSwweDAxOTksMHgwMjU5LDB4MDI0NX0sIHsweDAxOTEsMHgwMjY1LDB4MDEwNSwweDAyNTF9LAotICB7MHgwMDQ1LDB4MDExMSwweDAxNjksMHgwMWE1fSwgezB4MDAzOCwweDAwNDQsMHgwMDU4LDB4MDA2Y30sIHsweDAyOTUsMHgwMDU5LDB4MDAzYywweDAwNDB9LCB7MHgwMjI3LDB4MDIyNywweDAyMWIsMHgwMjFifSwKLSAgezB4MDEyMywweDAxMjMsMHgwMDg3LDB4MDA4N30sIHsweDAwNDgsMHgwMDRjLDB4MDA1MCwweDAwNTR9LCB7MHgwMThiLDB4MDE4YiwweDAwNmIsMHgwMDZifSwgezB4MDI5YiwweDAyOWIsMHgwMWEzLDB4MDFhM30sCi0gIHsweDAyMDcsMHgwMjA3LDB4MDFhYiwweDAxYWJ9LCB7MHgwMDkzLDB4MDA5MywweDAxMDMsMHgwMTAzfSwgezB4MDA1YywweDAwNjAsMHgwMDY0LDB4MDA2OH0sIHsweDAyMTMsMHgwMjEzLDB4MDEwYiwweDAxMGJ9LAotICB7MHgwMTJiLDB4MDEyYiwweDAyNDksMHgwMDYxfSwgezB4MDE4MSwweDAyOTEsMHgwMjQxLDB4MDA0MX0sIHsweDAwMDUsMHgwMDk5LDB4MDAxOSwweDAwMjV9LCB7MHgwMDcwLDB4MDA3NCwweDAwNzgsMHgwMDg4fSwKLSAgezB4MDJhNSwweDAyNjEsMHgwMDExLDB4MDBhNX0sIHsweDAwNDksMHgwMjg1LDB4MDI2OSwweDAwODl9LCB7MHgwMjIxLDB4MDA3YywweDAwODAsMHgwMDg0fSwgezB4MDIwYiwweDAyMGIsMHgwMDAzLDB4MDAwM30sCi0gIHsweDAwYTMsMHgwMGEzLDB4MDJhMywweDAyYTN9LCB7MHgwMmFiLDB4MDJhYiwweDAwODMsMHgwMDgzfSwgezB4MDA4YywweDAwOTAsMHgwMDk0LDB4MDA5OH0sIHsweDAyOGIsMHgwMjhiLDB4MDAyMywweDAwMjN9LAotICB7MHgwMjgzLDB4MDI4MywweDAwMmIsMHgwMDJifSwgezB4MDAwYiwweDAwMGIsMHgwMjAzLDB4MDIwM30sIHsweDAyMmIsMHgwMjJiLDB4MDBhYiwweDAwYWJ9Ci19OworY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va18yWzM5XVs0XSA9IHsKKyAgICB7MHgwMDA0LCAweDAwMGMsIDB4MDAyMCwgMHgwMDM0fSwgezB4MDE1NywgMHgwMTU3LCAweDAxNTksIDB4MDAwOH0sCisgICAgezB4MDE1MywgMHgwMTUzLCAweDAyNTcsIDB4MDI1N30sIHsweDAwMTAsIDB4MDAxNCwgMHgwMDE4LCAweDAwMWN9LAorICAgIHsweDAxMTcsIDB4MDExNywgMHgwMDU3LCAweDAwNTd9LCB7MHgwMTQ3LCAweDAxNDcsIDB4MDE5NywgMHgwMTk3fSwKKyAgICB7MHgwMTY3LCAweDAxNjcsIDB4MDE4NSwgMHgwMTYxfSwgezB4MDEyNSwgMHgwMDk1LCAweDAwNjUsIDB4MDIxNX0sCisgICAgezB4MDAyNCwgMHgwMDI4LCAweDAwMmMsIDB4MDAzMH0sIHsweDAwNTEsIDB4MDE0OSwgMHgwMTE5LCAweDAxNDF9LAorICAgIHsweDAwMTUsIDB4MDE5OSwgMHgwMjU5LCAweDAyNDV9LCB7MHgwMTkxLCAweDAyNjUsIDB4MDEwNSwgMHgwMjUxfSwKKyAgICB7MHgwMDQ1LCAweDAxMTEsIDB4MDE2OSwgMHgwMWE1fSwgezB4MDAzOCwgMHgwMDQ0LCAweDAwNTgsIDB4MDA2Y30sCisgICAgezB4MDI5NSwgMHgwMDU5LCAweDAwM2MsIDB4MDA0MH0sIHsweDAyMjcsIDB4MDIyNywgMHgwMjFiLCAweDAyMWJ9LAorICAgIHsweDAxMjMsIDB4MDEyMywgMHgwMDg3LCAweDAwODd9LCB7MHgwMDQ4LCAweDAwNGMsIDB4MDA1MCwgMHgwMDU0fSwKKyAgICB7MHgwMThiLCAweDAxOGIsIDB4MDA2YiwgMHgwMDZifSwgezB4MDI5YiwgMHgwMjliLCAweDAxYTMsIDB4MDFhM30sCisgICAgezB4MDIwNywgMHgwMjA3LCAweDAxYWIsIDB4MDFhYn0sIHsweDAwOTMsIDB4MDA5MywgMHgwMTAzLCAweDAxMDN9LAorICAgIHsweDAwNWMsIDB4MDA2MCwgMHgwMDY0LCAweDAwNjh9LCB7MHgwMjEzLCAweDAyMTMsIDB4MDEwYiwgMHgwMTBifSwKKyAgICB7MHgwMTJiLCAweDAxMmIsIDB4MDI0OSwgMHgwMDYxfSwgezB4MDE4MSwgMHgwMjkxLCAweDAyNDEsIDB4MDA0MX0sCisgICAgezB4MDAwNSwgMHgwMDk5LCAweDAwMTksIDB4MDAyNX0sIHsweDAwNzAsIDB4MDA3NCwgMHgwMDc4LCAweDAwODh9LAorICAgIHsweDAyYTUsIDB4MDI2MSwgMHgwMDExLCAweDAwYTV9LCB7MHgwMDQ5LCAweDAyODUsIDB4MDI2OSwgMHgwMDg5fSwKKyAgICB7MHgwMjIxLCAweDAwN2MsIDB4MDA4MCwgMHgwMDg0fSwgezB4MDIwYiwgMHgwMjBiLCAweDAwMDMsIDB4MDAwM30sCisgICAgezB4MDBhMywgMHgwMGEzLCAweDAyYTMsIDB4MDJhM30sIHsweDAyYWIsIDB4MDJhYiwgMHgwMDgzLCAweDAwODN9LAorICAgIHsweDAwOGMsIDB4MDA5MCwgMHgwMDk0LCAweDAwOTh9LCB7MHgwMjhiLCAweDAyOGIsIDB4MDAyMywgMHgwMDIzfSwKKyAgICB7MHgwMjgzLCAweDAyODMsIDB4MDAyYiwgMHgwMDJifSwgezB4MDAwYiwgMHgwMDBiLCAweDAyMDMsIDB4MDIwM30sCisgICAgezB4MDIyYiwgMHgwMjJiLCAweDAwYWIsIDB4MDBhYn19OwogCi1jb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzNbMzldWzRdID0KLXsKLSAgezB4MDAwMywweDAwMDMsMHgwMDA0LDB4MDAwOH0sIHsweDAwMDUsMHgwMTAxLDB4MDAxMSwweDAwNDF9LCB7MHgwMDBjLDB4MDAxMCwweDAwMTQsMHgwMDIwfSwgezB4MDAxNywweDAwMTcsMHgwMTQzLDB4MDE0M30sCi0gIHsweDAwNTEsMHgwMTExLDB4MDA0NSwweDAxNTF9LCB7MHgwMTA1LDB4MDA1NSwweDAwMTgsMHgwMDFjfSwgezB4MDE1NywweDAxNTcsMHgwMTQ3LDB4MDE0N30sIHsweDAxMTcsMHgwMTE3LDB4MDAwOSwweDAyMDF9LAotICB7MHgwMDI0LDB4MDAyYywweDAwNDAsMHgwMDU0fSwgezB4MDI0MSwweDAwMTksMHgwMDY1LDB4MDAyOH0sIHsweDAxODMsMHgwMTgzLDB4MDE5MywweDAxOTN9LCB7MHgwMDMwLDB4MDAzNCwweDAwMzgsMHgwMDNjfSwKLSAgezB4MDAyNywweDAwMjcsMHgwMjUzLDB4MDI1M30sIHsweDAwNWIsMHgwMDViLDB4MDA4MywweDAwODN9LCB7MHgwMDYzLDB4MDA2MywweDAwOTMsMHgwMDkzfSwgezB4MDAyMywweDAwMjMsMHgwMjEzLDB4MDIxM30sCi0gIHsweDAwNDQsMHgwMDQ4LDB4MDA0YywweDAwNTB9LCB7MHgwMDRiLDB4MDA0YiwweDAxNjcsMHgwMTY3fSwgezB4MDE2MywweDAxNjMsMHgwMDk3LDB4MDA5N30sIHsweDAxOTcsMHgwMTk3LDB4MDEyNSwweDAwODV9LAotICB7MHgwMTg1LDB4MDEyMSwweDAxNTksMHgwMjU1fSwgezB4MDA1OCwweDAwNWMsMHgwMDYwLDB4MDA3MH0sIHsweDAxMTksMHgwMjQ1LDB4MDI4MSwweDAyOTF9LCB7MHgwMDY5LDB4MDBhNSwweDAyMDUsMHgwMTA5fSwKLSAgezB4MDFhMSwweDAwNjQsMHgwMDY4LDB4MDA2Y30sIHsweDAwMmIsMHgwMDJiLDB4MDFhNywweDAxYTd9LCB7MHgwMjE3LDB4MDIxNywweDAxNGIsMHgwMTRifSwgezB4MDI5NywweDAyOTcsMHgwMTZiLDB4MDE2Yn0sCi0gIHsweDAwNzQsMHgwMDc4LDB4MDA3YywweDAwODB9LCB7MHgwMGEzLDB4MDBhMywweDAyNjMsMHgwMjYzfSwgezB4MDI4NSwweDAxMjksMHgwMDk5LDB4MDBhOX0sIHsweDAyYTEsMHgwMWE5LDB4MDE5OSwweDAyNjV9LAotICB7MHgwMmE1LDB4MDA4NCwweDAwODgsMHgwMDhjfSwgezB4MDIyMywweDAyMjMsMHgwMDhiLDB4MDA4Yn0sIHsweDAyMjcsMHgwMjI3LDB4MDE4OSwweDAyNTl9LCB7MHgwMjE5LDB4MDA5MCwweDAwOTQsMHgwMDk4fSwKLSAgezB4MDJhYiwweDAyYWIsMHgwMjZiLDB4MDI2Yn0sIHsweDAyOWIsMHgwMjliLDB4MDI0YiwweDAyNGJ9LCB7MHgwMjBiLDB4MDIwYiwweDAyMjksMHgwMjg5fQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfM1szOV1bNF0gPSB7CisgICAgezB4MDAwMywgMHgwMDAzLCAweDAwMDQsIDB4MDAwOH0sIHsweDAwMDUsIDB4MDEwMSwgMHgwMDExLCAweDAwNDF9LAorICAgIHsweDAwMGMsIDB4MDAxMCwgMHgwMDE0LCAweDAwMjB9LCB7MHgwMDE3LCAweDAwMTcsIDB4MDE0MywgMHgwMTQzfSwKKyAgICB7MHgwMDUxLCAweDAxMTEsIDB4MDA0NSwgMHgwMTUxfSwgezB4MDEwNSwgMHgwMDU1LCAweDAwMTgsIDB4MDAxY30sCisgICAgezB4MDE1NywgMHgwMTU3LCAweDAxNDcsIDB4MDE0N30sIHsweDAxMTcsIDB4MDExNywgMHgwMDA5LCAweDAyMDF9LAorICAgIHsweDAwMjQsIDB4MDAyYywgMHgwMDQwLCAweDAwNTR9LCB7MHgwMjQxLCAweDAwMTksIDB4MDA2NSwgMHgwMDI4fSwKKyAgICB7MHgwMTgzLCAweDAxODMsIDB4MDE5MywgMHgwMTkzfSwgezB4MDAzMCwgMHgwMDM0LCAweDAwMzgsIDB4MDAzY30sCisgICAgezB4MDAyNywgMHgwMDI3LCAweDAyNTMsIDB4MDI1M30sIHsweDAwNWIsIDB4MDA1YiwgMHgwMDgzLCAweDAwODN9LAorICAgIHsweDAwNjMsIDB4MDA2MywgMHgwMDkzLCAweDAwOTN9LCB7MHgwMDIzLCAweDAwMjMsIDB4MDIxMywgMHgwMjEzfSwKKyAgICB7MHgwMDQ0LCAweDAwNDgsIDB4MDA0YywgMHgwMDUwfSwgezB4MDA0YiwgMHgwMDRiLCAweDAxNjcsIDB4MDE2N30sCisgICAgezB4MDE2MywgMHgwMTYzLCAweDAwOTcsIDB4MDA5N30sIHsweDAxOTcsIDB4MDE5NywgMHgwMTI1LCAweDAwODV9LAorICAgIHsweDAxODUsIDB4MDEyMSwgMHgwMTU5LCAweDAyNTV9LCB7MHgwMDU4LCAweDAwNWMsIDB4MDA2MCwgMHgwMDcwfSwKKyAgICB7MHgwMTE5LCAweDAyNDUsIDB4MDI4MSwgMHgwMjkxfSwgezB4MDA2OSwgMHgwMGE1LCAweDAyMDUsIDB4MDEwOX0sCisgICAgezB4MDFhMSwgMHgwMDY0LCAweDAwNjgsIDB4MDA2Y30sIHsweDAwMmIsIDB4MDAyYiwgMHgwMWE3LCAweDAxYTd9LAorICAgIHsweDAyMTcsIDB4MDIxNywgMHgwMTRiLCAweDAxNGJ9LCB7MHgwMjk3LCAweDAyOTcsIDB4MDE2YiwgMHgwMTZifSwKKyAgICB7MHgwMDc0LCAweDAwNzgsIDB4MDA3YywgMHgwMDgwfSwgezB4MDBhMywgMHgwMGEzLCAweDAyNjMsIDB4MDI2M30sCisgICAgezB4MDI4NSwgMHgwMTI5LCAweDAwOTksIDB4MDBhOX0sIHsweDAyYTEsIDB4MDFhOSwgMHgwMTk5LCAweDAyNjV9LAorICAgIHsweDAyYTUsIDB4MDA4NCwgMHgwMDg4LCAweDAwOGN9LCB7MHgwMjIzLCAweDAyMjMsIDB4MDA4YiwgMHgwMDhifSwKKyAgICB7MHgwMjI3LCAweDAyMjcsIDB4MDE4OSwgMHgwMjU5fSwgezB4MDIxOSwgMHgwMDkwLCAweDAwOTQsIDB4MDA5OH0sCisgICAgezB4MDJhYiwgMHgwMmFiLCAweDAyNmIsIDB4MDI2Yn0sIHsweDAyOWIsIDB4MDI5YiwgMHgwMjRiLCAweDAyNGJ9LAorICAgIHsweDAyMGIsIDB4MDIwYiwgMHgwMjI5LCAweDAyODl9fTsKIAotY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va180WzM4XVs0XSA9Ci17Ci0gIHsweDAwMDQsMHgwMDA4LDB4MDAwYywweDAwMTh9LCB7MHgwMTU1LDB4MDE1MSwweDAxMTUsMHgwMDU1fSwgezB4MDE0NSwweDAwMDUsMHgwMDE1LDB4MDAwMX0sIHsweDAxNDEsMHgwMDQ1LDB4MDAxMCwweDAwMTR9LAotICB7MHgwMTA3LDB4MDEwNywweDAwNTMsMHgwMDUzfSwgezB4MDEwMywweDAxMDMsMHgwMTEzLDB4MDExM30sIHsweDAwMWMsMHgwMDIwLDB4MDAzNCwweDAwNDh9LCB7MHgwMDQzLDB4MDA0MywweDAwMTMsMHgwMDEzfSwKLSAgezB4MDAyNCwweDAwMjgsMHgwMDJjLDB4MDAzMH0sIHsweDAxNWIsMHgwMTViLDB4MDE5NywweDAxOTd9LCB7MHgwMTY3LDB4MDE2NywweDAyNTcsMHgwMjU3fSwgezB4MDA1YiwweDAwNWIsMHgwMTFiLDB4MDExYn0sCi0gIHsweDAwNjcsMHgwMDY3LDB4MDE0YiwweDAxNGJ9LCB7MHgwMDM4LDB4MDAzYywweDAwNDAsMHgwMDQ0fSwgezB4MDE5MywweDAxOTMsMHgwMjUxLDB4MDA5NX0sIHsweDAxNjEsMHgwMjQ1LDB4MDEyNSwweDAyMTV9LAotICB7MHgwMTg1LDB4MDAxOSwweDAwNDksMHgwMDI1fSwgezB4MDEwOSwweDAyMTEsMHgwMDYxLDB4MDI0MX0sIHsweDAwNGMsMHgwMDUwLDB4MDA1OCwweDAwNmN9LCB7MHgwMDkxLDB4MDEyMSwweDAyMDUsMHgwMTgxfSwKLSAgezB4MDA4NSwweDAwMDksMHgwMjAxLDB4MDA1NH0sIHsweDAwMjMsMHgwMDIzLDB4MDA4MywweDAwODN9LCB7MHgwMDVjLDB4MDA2MCwweDAwNjQsMHgwMDY4fSwgezB4MDFhNywweDAxYTcsMHgwMTZiLDB4MDE2Yn0sCi0gIHsweDAxOWIsMHgwMTliLDB4MDI5NywweDAyOTd9LCB7MHgwMjY3LDB4MDI2NywweDAyNWIsMHgwMjVifSwgezB4MDBhNSwweDAwNjksMHgwMDk5LDB4MDFhMX0sIHsweDAwNzAsMHgwMDc0LDB4MDA3OCwweDAwODR9LAotICB7MHgwMjkxLDB4MDEyOSwweDAyNjEsMHgwMTg5fSwgezB4MDI4NSwweDAxYTksMHgwMjI1LDB4MDI0OX0sIHsweDAyMTksMHgwMmE1LDB4MDA3YywweDAwODB9LCB7MHgwMjliLDB4MDI5YiwweDAyNmIsMHgwMjZifSwKLSAgezB4MDBhMywweDAwYTMsMHgwMDJiLDB4MDAyYn0sIHsweDAwODgsMHgwMDhjLDB4MDA5MCwweDAwOTR9LCB7MHgwMjgzLDB4MDI4MywweDAwOGIsMHgwMDhifSwgezB4MDIyMywweDAyMjMsMHgwMjBiLDB4MDIwYn0sCi0gIHsweDAyYWIsMHgwMmFiLDB4MDJhMywweDAyYTN9LCB7MHgwMGFiLDB4MDBhYiwweDAyMjksMHgwMjg5fQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfNFszOF1bNF0gPSB7CisgICAgezB4MDAwNCwgMHgwMDA4LCAweDAwMGMsIDB4MDAxOH0sIHsweDAxNTUsIDB4MDE1MSwgMHgwMTE1LCAweDAwNTV9LAorICAgIHsweDAxNDUsIDB4MDAwNSwgMHgwMDE1LCAweDAwMDF9LCB7MHgwMTQxLCAweDAwNDUsIDB4MDAxMCwgMHgwMDE0fSwKKyAgICB7MHgwMTA3LCAweDAxMDcsIDB4MDA1MywgMHgwMDUzfSwgezB4MDEwMywgMHgwMTAzLCAweDAxMTMsIDB4MDExM30sCisgICAgezB4MDAxYywgMHgwMDIwLCAweDAwMzQsIDB4MDA0OH0sIHsweDAwNDMsIDB4MDA0MywgMHgwMDEzLCAweDAwMTN9LAorICAgIHsweDAwMjQsIDB4MDAyOCwgMHgwMDJjLCAweDAwMzB9LCB7MHgwMTViLCAweDAxNWIsIDB4MDE5NywgMHgwMTk3fSwKKyAgICB7MHgwMTY3LCAweDAxNjcsIDB4MDI1NywgMHgwMjU3fSwgezB4MDA1YiwgMHgwMDViLCAweDAxMWIsIDB4MDExYn0sCisgICAgezB4MDA2NywgMHgwMDY3LCAweDAxNGIsIDB4MDE0Yn0sIHsweDAwMzgsIDB4MDAzYywgMHgwMDQwLCAweDAwNDR9LAorICAgIHsweDAxOTMsIDB4MDE5MywgMHgwMjUxLCAweDAwOTV9LCB7MHgwMTYxLCAweDAyNDUsIDB4MDEyNSwgMHgwMjE1fSwKKyAgICB7MHgwMTg1LCAweDAwMTksIDB4MDA0OSwgMHgwMDI1fSwgezB4MDEwOSwgMHgwMjExLCAweDAwNjEsIDB4MDI0MX0sCisgICAgezB4MDA0YywgMHgwMDUwLCAweDAwNTgsIDB4MDA2Y30sIHsweDAwOTEsIDB4MDEyMSwgMHgwMjA1LCAweDAxODF9LAorICAgIHsweDAwODUsIDB4MDAwOSwgMHgwMjAxLCAweDAwNTR9LCB7MHgwMDIzLCAweDAwMjMsIDB4MDA4MywgMHgwMDgzfSwKKyAgICB7MHgwMDVjLCAweDAwNjAsIDB4MDA2NCwgMHgwMDY4fSwgezB4MDFhNywgMHgwMWE3LCAweDAxNmIsIDB4MDE2Yn0sCisgICAgezB4MDE5YiwgMHgwMTliLCAweDAyOTcsIDB4MDI5N30sIHsweDAyNjcsIDB4MDI2NywgMHgwMjViLCAweDAyNWJ9LAorICAgIHsweDAwYTUsIDB4MDA2OSwgMHgwMDk5LCAweDAxYTF9LCB7MHgwMDcwLCAweDAwNzQsIDB4MDA3OCwgMHgwMDg0fSwKKyAgICB7MHgwMjkxLCAweDAxMjksIDB4MDI2MSwgMHgwMTg5fSwgezB4MDI4NSwgMHgwMWE5LCAweDAyMjUsIDB4MDI0OX0sCisgICAgezB4MDIxOSwgMHgwMmE1LCAweDAwN2MsIDB4MDA4MH0sIHsweDAyOWIsIDB4MDI5YiwgMHgwMjZiLCAweDAyNmJ9LAorICAgIHsweDAwYTMsIDB4MDBhMywgMHgwMDJiLCAweDAwMmJ9LCB7MHgwMDg4LCAweDAwOGMsIDB4MDA5MCwgMHgwMDk0fSwKKyAgICB7MHgwMjgzLCAweDAyODMsIDB4MDA4YiwgMHgwMDhifSwgezB4MDIyMywgMHgwMjIzLCAweDAyMGIsIDB4MDIwYn0sCisgICAgezB4MDJhYiwgMHgwMmFiLCAweDAyYTMsIDB4MDJhM30sIHsweDAwYWIsIDB4MDBhYiwgMHgwMjI5LCAweDAyODl9fTsKIAotY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va181WzQxXVs0XSA9Ci17Ci0gIHsweDAxMTMsMHgwMTEzLDB4MDAwNCwweDAwMDh9LCB7MHgwMTBkLDB4MDExNSwweDAxNTEsMHgwMGQxfSwgezB4MDAwYywweDAwMTAsMHgwMDE0LDB4MDAyOH0sIHsweDAwZDcsMHgwMGQ3LDB4MDE0ZiwweDAxNGZ9LAotICB7MHgwMGNmLDB4MDBjZiwweDAxNTcsMHgwMTU3fSwgezB4MDAxOCwweDAwMWMsMHgwMDIwLDB4MDAyNH0sIHsweDAxMGIsMHgwMTBiLDB4MDE5MywweDAxOTN9LCB7MHgwMTFiLDB4MDExYiwweDAwOTMsMHgwMDkzfSwKLSAgezB4MDBjOSwweDAxNTksMHgwMDhkLDB4MDE5NX0sIHsweDAxNDksMHgwMGQ5LDB4MDE4ZCwweDAwOTV9LCB7MHgwMDJjLDB4MDAzMCwweDAwNDQsMHgwMDU4fSwgezB4MDEwNSwweDAxMWQsMHgwMDUxLDB4MDFkMX0sCi0gIHsweDAwMzQsMHgwMDM4LDB4MDAzYywweDAwNDB9LCB7MHgwMGM3LDB4MDBjNywweDAxZDcsMHgwMWQ3fSwgezB4MDE1ZiwweDAxNWYsMHgwMDRmLDB4MDA0Zn0sIHsweDAxNDcsMHgwMTQ3LDB4MDBkZiwweDAwZGZ9LAotICB7MHgwMDU3LDB4MDA1NywweDAxY2YsMHgwMWNmfSwgezB4MDA0OCwweDAwNGMsMHgwMDUwLDB4MDA1NH0sIHsweDAxOGIsMHgwMThiLDB4MDE5YiwweDAxOWJ9LCB7MHgwMDhiLDB4MDA4YiwweDAwOWIsMHgwMDlifSwKLSAgezB4MDA4NSwweDAwOWQsMHgwMWM5LDB4MDA1OX0sIHsweDAxOWQsMHgwMWQ5LDB4MDE4NSwweDAwNDl9LCB7MHgwMDVjLDB4MDA2MCwweDAwNzQsMHgwMDg4fSwgezB4MDAxMSwweDAxMDEsMHgwMTYxLDB4MDEyMX0sCi0gIHsweDAwNjQsMHgwMDY4LDB4MDA2YywweDAwNzB9LCB7MHgwMGMzLDB4MDBjMywweDAyMTMsMHgwMjEzfSwgezB4MDBlMywweDAwZTMsMHgwMDBmLDB4MDAwZn0sIHsweDAyMTcsMHgwMjE3LDB4MDIwZiwweDAyMGZ9LAotICB7MHgwMTQzLDB4MDE0MywweDAwMTcsMHgwMDE3fSwgezB4MDA3OCwweDAwN2MsMHgwMDgwLDB4MDA4NH0sIHsweDAwNWYsMHgwMDVmLDB4MDA0NywweDAwNDd9LCB7MHgwMWM3LDB4MDFjNywweDAyMGIsMHgwMjBifSwKLSAgezB4MDA4MywweDAwODMsMHgwMWEzLDB4MDFhM30sIHsweDAwMWIsMHgwMDFiLDB4MDIxYiwweDAyMWJ9LCB7MHgwMDhjLDB4MDA5MCwweDAwOTQsMHgwMDk4fSwgezB4MDFkZiwweDAxZGYsMHgwMTgzLDB4MDE4M30sCi0gIHsweDAwMDksMHgwMGExLDB4MDAxZCwweDAwNDF9LCB7MHgwMWMxLDB4MDIxZCwweDAyMDUsMHgwMWUxfSwgezB4MDA2MSwweDAwMDUsMHgwMDljLDB4MDBhMH0sIHsweDAwMjMsMHgwMDIzLDB4MDIwMywweDAyMDN9LAotICB7MHgwMjIzLDB4MDIyMywweDAwMDMsMHgwMDAzfQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfNVs0MV1bNF0gPSB7CisgICAgezB4MDExMywgMHgwMTEzLCAweDAwMDQsIDB4MDAwOH0sIHsweDAxMGQsIDB4MDExNSwgMHgwMTUxLCAweDAwZDF9LAorICAgIHsweDAwMGMsIDB4MDAxMCwgMHgwMDE0LCAweDAwMjh9LCB7MHgwMGQ3LCAweDAwZDcsIDB4MDE0ZiwgMHgwMTRmfSwKKyAgICB7MHgwMGNmLCAweDAwY2YsIDB4MDE1NywgMHgwMTU3fSwgezB4MDAxOCwgMHgwMDFjLCAweDAwMjAsIDB4MDAyNH0sCisgICAgezB4MDEwYiwgMHgwMTBiLCAweDAxOTMsIDB4MDE5M30sIHsweDAxMWIsIDB4MDExYiwgMHgwMDkzLCAweDAwOTN9LAorICAgIHsweDAwYzksIDB4MDE1OSwgMHgwMDhkLCAweDAxOTV9LCB7MHgwMTQ5LCAweDAwZDksIDB4MDE4ZCwgMHgwMDk1fSwKKyAgICB7MHgwMDJjLCAweDAwMzAsIDB4MDA0NCwgMHgwMDU4fSwgezB4MDEwNSwgMHgwMTFkLCAweDAwNTEsIDB4MDFkMX0sCisgICAgezB4MDAzNCwgMHgwMDM4LCAweDAwM2MsIDB4MDA0MH0sIHsweDAwYzcsIDB4MDBjNywgMHgwMWQ3LCAweDAxZDd9LAorICAgIHsweDAxNWYsIDB4MDE1ZiwgMHgwMDRmLCAweDAwNGZ9LCB7MHgwMTQ3LCAweDAxNDcsIDB4MDBkZiwgMHgwMGRmfSwKKyAgICB7MHgwMDU3LCAweDAwNTcsIDB4MDFjZiwgMHgwMWNmfSwgezB4MDA0OCwgMHgwMDRjLCAweDAwNTAsIDB4MDA1NH0sCisgICAgezB4MDE4YiwgMHgwMThiLCAweDAxOWIsIDB4MDE5Yn0sIHsweDAwOGIsIDB4MDA4YiwgMHgwMDliLCAweDAwOWJ9LAorICAgIHsweDAwODUsIDB4MDA5ZCwgMHgwMWM5LCAweDAwNTl9LCB7MHgwMTlkLCAweDAxZDksIDB4MDE4NSwgMHgwMDQ5fSwKKyAgICB7MHgwMDVjLCAweDAwNjAsIDB4MDA3NCwgMHgwMDg4fSwgezB4MDAxMSwgMHgwMTAxLCAweDAxNjEsIDB4MDEyMX0sCisgICAgezB4MDA2NCwgMHgwMDY4LCAweDAwNmMsIDB4MDA3MH0sIHsweDAwYzMsIDB4MDBjMywgMHgwMjEzLCAweDAyMTN9LAorICAgIHsweDAwZTMsIDB4MDBlMywgMHgwMDBmLCAweDAwMGZ9LCB7MHgwMjE3LCAweDAyMTcsIDB4MDIwZiwgMHgwMjBmfSwKKyAgICB7MHgwMTQzLCAweDAxNDMsIDB4MDAxNywgMHgwMDE3fSwgezB4MDA3OCwgMHgwMDdjLCAweDAwODAsIDB4MDA4NH0sCisgICAgezB4MDA1ZiwgMHgwMDVmLCAweDAwNDcsIDB4MDA0N30sIHsweDAxYzcsIDB4MDFjNywgMHgwMjBiLCAweDAyMGJ9LAorICAgIHsweDAwODMsIDB4MDA4MywgMHgwMWEzLCAweDAxYTN9LCB7MHgwMDFiLCAweDAwMWIsIDB4MDIxYiwgMHgwMjFifSwKKyAgICB7MHgwMDhjLCAweDAwOTAsIDB4MDA5NCwgMHgwMDk4fSwgezB4MDFkZiwgMHgwMWRmLCAweDAxODMsIDB4MDE4M30sCisgICAgezB4MDAwOSwgMHgwMGExLCAweDAwMWQsIDB4MDA0MX0sIHsweDAxYzEsIDB4MDIxZCwgMHgwMjA1LCAweDAxZTF9LAorICAgIHsweDAwNjEsIDB4MDAwNSwgMHgwMDljLCAweDAwYTB9LCB7MHgwMDIzLCAweDAwMjMsIDB4MDIwMywgMHgwMjAzfSwKKyAgICB7MHgwMjIzLCAweDAyMjMsIDB4MDAwMywgMHgwMDAzfX07CiAKLWNvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfNls0MF1bNF0gPQotewotICB7MHgwMDA0LDB4MDAwOCwweDAwMGMsMHgwMDFjfSwgezB4MDExMSwweDAxMTUsMHgwMGQxLDB4MDE1MX0sIHsweDAxMGQsMHgwMTU1LDB4MDE0ZCwweDAwZDV9LCB7MHgwMGNkLDB4MDAxMCwweDAwMTQsMHgwMDE4fSwKLSAgezB4MDBkOSwweDAxNTksMHgwMTQ5LDB4MDBjOX0sIHsweDAxMDksMHgwMThkLDB4MDExOSwweDAwOTV9LCB7MHgwMTk1LDB4MDA5MSwweDAwOGQsMHgwMTkxfSwgezB4MDAyMCwweDAwMjQsMHgwMDM4LDB4MDA0Y30sCi0gIHsweDAwOTksMHgwMTg5LDB4MDA4OSwweDAxOTl9LCB7MHgwMDI4LDB4MDAyYywweDAwMzAsMHgwMDM0fSwgezB4MDE0NywweDAxNDcsMHgwMTVmLDB4MDE1Zn0sIHsweDAwZGYsMHgwMGRmLDB4MDFjZiwweDAxY2Z9LAotICB7MHgwMGM3LDB4MDBjNywweDAxZDcsMHgwMWQ3fSwgezB4MDA1NywweDAwNTcsMHgwMDRmLDB4MDA0Zn0sIHsweDAwM2MsMHgwMDQwLDB4MDA0NCwweDAwNDh9LCB7MHgwMTFmLDB4MDExZiwweDAxMDcsMHgwMTA3fSwKLSAgezB4MDA1MywweDAwNTMsMHgwMWQzLDB4MDFkM30sIHsweDAxOWYsMHgwMTlmLDB4MDA4NSwweDAxYzl9LCB7MHgwMWQ5LDB4MDA5ZCwweDAwNTksMHgwMDQ5fSwgezB4MDA1MCwweDAwNWMsMHgwMDcwLDB4MDA4NH0sCi0gIHsweDAxODUsMHgwMWRkLDB4MDA1NCwweDAwNTh9LCB7MHgwMDVmLDB4MDA1ZiwweDAwNDcsMHgwMDQ3fSwgezB4MDFjNywweDAxYzcsMHgwMDE3LDB4MDAxN30sIHsweDAwNjAsMHgwMDY0LDB4MDA2OCwweDAwNmN9LAotICB7MHgwMDBmLDB4MDAwZiwweDAxNjMsMHgwMTYzfSwgezB4MDE0MywweDAxNDMsMHgwMGMzLDB4MDBjM30sIHsweDAyMTcsMHgwMjE3LDB4MDBlMywweDAwZTN9LCB7MHgwMjBmLDB4MDIwZiwweDAwMTMsMHgwMDEzfSwKLSAgezB4MDA3NCwweDAwNzgsMHgwMDdjLDB4MDA4MH0sIHsweDAxODMsMHgwMTgzLDB4MDA4MywweDAwODN9LCB7MHgwMjFiLDB4MDIxYiwweDAwMGIsMHgwMDBifSwgezB4MDEwMywweDAxMDMsMHgwMWEzLDB4MDFhM30sCi0gIHsweDAwYTMsMHgwMGEzLDB4MDIwYiwweDAyMGJ9LCB7MHgwMDg4LDB4MDA4YywweDAwOTAsMHgwMDk0fSwgezB4MDEyMywweDAxMjMsMHgwMDFiLDB4MDAxYn0sIHsweDAyMTMsMHgwMjEzLDB4MDAwNSwweDAyMDV9LAotICB7MHgwMDFkLDB4MDA2MSwweDAyMWQsMHgwMWUxfSwgezB4MDFjMSwweDAwNDEsMHgwMDk4LDB4MDA5Y30sIHsweDAyMjMsMHgwMjIzLDB4MDIwMywweDAyMDN9LCB7MHgwMDAzLDB4MDAwMywweDAwMjMsMHgwMDIzfQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfNls0MF1bNF0gPSB7CisgICAgezB4MDAwNCwgMHgwMDA4LCAweDAwMGMsIDB4MDAxY30sIHsweDAxMTEsIDB4MDExNSwgMHgwMGQxLCAweDAxNTF9LAorICAgIHsweDAxMGQsIDB4MDE1NSwgMHgwMTRkLCAweDAwZDV9LCB7MHgwMGNkLCAweDAwMTAsIDB4MDAxNCwgMHgwMDE4fSwKKyAgICB7MHgwMGQ5LCAweDAxNTksIDB4MDE0OSwgMHgwMGM5fSwgezB4MDEwOSwgMHgwMThkLCAweDAxMTksIDB4MDA5NX0sCisgICAgezB4MDE5NSwgMHgwMDkxLCAweDAwOGQsIDB4MDE5MX0sIHsweDAwMjAsIDB4MDAyNCwgMHgwMDM4LCAweDAwNGN9LAorICAgIHsweDAwOTksIDB4MDE4OSwgMHgwMDg5LCAweDAxOTl9LCB7MHgwMDI4LCAweDAwMmMsIDB4MDAzMCwgMHgwMDM0fSwKKyAgICB7MHgwMTQ3LCAweDAxNDcsIDB4MDE1ZiwgMHgwMTVmfSwgezB4MDBkZiwgMHgwMGRmLCAweDAxY2YsIDB4MDFjZn0sCisgICAgezB4MDBjNywgMHgwMGM3LCAweDAxZDcsIDB4MDFkN30sIHsweDAwNTcsIDB4MDA1NywgMHgwMDRmLCAweDAwNGZ9LAorICAgIHsweDAwM2MsIDB4MDA0MCwgMHgwMDQ0LCAweDAwNDh9LCB7MHgwMTFmLCAweDAxMWYsIDB4MDEwNywgMHgwMTA3fSwKKyAgICB7MHgwMDUzLCAweDAwNTMsIDB4MDFkMywgMHgwMWQzfSwgezB4MDE5ZiwgMHgwMTlmLCAweDAwODUsIDB4MDFjOX0sCisgICAgezB4MDFkOSwgMHgwMDlkLCAweDAwNTksIDB4MDA0OX0sIHsweDAwNTAsIDB4MDA1YywgMHgwMDcwLCAweDAwODR9LAorICAgIHsweDAxODUsIDB4MDFkZCwgMHgwMDU0LCAweDAwNTh9LCB7MHgwMDVmLCAweDAwNWYsIDB4MDA0NywgMHgwMDQ3fSwKKyAgICB7MHgwMWM3LCAweDAxYzcsIDB4MDAxNywgMHgwMDE3fSwgezB4MDA2MCwgMHgwMDY0LCAweDAwNjgsIDB4MDA2Y30sCisgICAgezB4MDAwZiwgMHgwMDBmLCAweDAxNjMsIDB4MDE2M30sIHsweDAxNDMsIDB4MDE0MywgMHgwMGMzLCAweDAwYzN9LAorICAgIHsweDAyMTcsIDB4MDIxNywgMHgwMGUzLCAweDAwZTN9LCB7MHgwMjBmLCAweDAyMGYsIDB4MDAxMywgMHgwMDEzfSwKKyAgICB7MHgwMDc0LCAweDAwNzgsIDB4MDA3YywgMHgwMDgwfSwgezB4MDE4MywgMHgwMTgzLCAweDAwODMsIDB4MDA4M30sCisgICAgezB4MDIxYiwgMHgwMjFiLCAweDAwMGIsIDB4MDAwYn0sIHsweDAxMDMsIDB4MDEwMywgMHgwMWEzLCAweDAxYTN9LAorICAgIHsweDAwYTMsIDB4MDBhMywgMHgwMjBiLCAweDAyMGJ9LCB7MHgwMDg4LCAweDAwOGMsIDB4MDA5MCwgMHgwMDk0fSwKKyAgICB7MHgwMTIzLCAweDAxMjMsIDB4MDAxYiwgMHgwMDFifSwgezB4MDIxMywgMHgwMjEzLCAweDAwMDUsIDB4MDIwNX0sCisgICAgezB4MDAxZCwgMHgwMDYxLCAweDAyMWQsIDB4MDFlMX0sIHsweDAxYzEsIDB4MDA0MSwgMHgwMDk4LCAweDAwOWN9LAorICAgIHsweDAyMjMsIDB4MDIyMywgMHgwMjAzLCAweDAyMDN9LCB7MHgwMDAzLCAweDAwMDMsIDB4MDAyMywgMHgwMDIzfX07CiAKLWNvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfN1szMV1bNF0gPQotewotICB7MHgwMDAzLDB4MDAwMywweDAwMDQsMHgwMDA4fSwgezB4MDAwNywweDAwMDcsMHgwMDQzLDB4MDA0M30sIHsweDAwNDUsMHgwMDBjLDB4MDAxMCwweDAwMjR9LCB7MHgwMDQ5LDB4MDA4NSwweDAwMDksMHgwMDgxfSwKLSAgezB4MDAxNCwweDAwMTgsMHgwMDFjLDB4MDAyMH0sIHsweDAwNGYsMHgwMDRmLDB4MDBjNywweDAwYzd9LCB7MHgwMDhiLDB4MDA4YiwweDAwMGYsMHgwMDBmfSwgezB4MDBjMywweDAwYzMsMHgwMGM5LDB4MDA4ZH0sCi0gIHsweDAxMDUsMHgwMDUxLDB4MDE0NSwweDAwNTV9LCB7MHgwMDI4LDB4MDAyYywweDAwNDAsMHgwMDU0fSwgezB4MDBjZCwweDAxMDksMHgwMTAxLDB4MDAxMX0sIHsweDAwMzAsMHgwMDM0LDB4MDAzOCwweDAwM2N9LAotICB7MHgwMDkzLDB4MDA5MywweDAxNGIsMHgwMTRifSwgezB4MDA5NywweDAwOTcsMHgwMTQzLDB4MDE0M30sIHsweDAwNWIsMHgwMDViLDB4MDAxNywweDAwMTd9LCB7MHgwMTg3LDB4MDE4NywweDAwZDMsMHgwMGQzfSwKLSAgezB4MDA0NCwweDAwNDgsMHgwMDRjLDB4MDA1MH0sIHsweDAxNGYsMHgwMTRmLDB4MDEwZiwweDAxMGZ9LCB7MHgwMGQ3LDB4MDBkNywweDAxOGIsMHgwMThifSwgezB4MDA5YiwweDAwOWIsMHgwMWM3LDB4MDFjN30sCi0gIHsweDAxOGQsMHgwMTgxLDB4MDAxOSwweDAxMTF9LCB7MHgwMDU4LDB4MDA1YywweDAwNjAsMHgwMDY4fSwgezB4MDA1ZCwweDAxNTEsMHgwMDlkLDB4MDExNX0sIHsweDAwZDksMHgwMWM5LDB4MDBkZCwweDAxMTl9LAotICB7MHgwMTU1LDB4MDE5MSwweDAxY2QsMHgwMDY0fSwgezB4MDAxZiwweDAwMWYsMHgwMWMzLDB4MDFjM30sIHsweDAwNmMsMHgwMDcwLDB4MDA3NCwweDAwNzh9LCB7MHgwMTViLDB4MDE1YiwweDAxOTcsMHgwMTk3fSwKLSAgezB4MDExZiwweDAxMWYsMHgwMWQzLDB4MDFkM30sIHsweDAxZDcsMHgwMWQ3LDB4MDE1ZiwweDAxNWZ9LCB7MHgwMTlkLDB4MDE5OSwweDAxZDksMHgwMWRkfQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfN1szMV1bNF0gPSB7CisgICAgezB4MDAwMywgMHgwMDAzLCAweDAwMDQsIDB4MDAwOH0sIHsweDAwMDcsIDB4MDAwNywgMHgwMDQzLCAweDAwNDN9LAorICAgIHsweDAwNDUsIDB4MDAwYywgMHgwMDEwLCAweDAwMjR9LCB7MHgwMDQ5LCAweDAwODUsIDB4MDAwOSwgMHgwMDgxfSwKKyAgICB7MHgwMDE0LCAweDAwMTgsIDB4MDAxYywgMHgwMDIwfSwgezB4MDA0ZiwgMHgwMDRmLCAweDAwYzcsIDB4MDBjN30sCisgICAgezB4MDA4YiwgMHgwMDhiLCAweDAwMGYsIDB4MDAwZn0sIHsweDAwYzMsIDB4MDBjMywgMHgwMGM5LCAweDAwOGR9LAorICAgIHsweDAxMDUsIDB4MDA1MSwgMHgwMTQ1LCAweDAwNTV9LCB7MHgwMDI4LCAweDAwMmMsIDB4MDA0MCwgMHgwMDU0fSwKKyAgICB7MHgwMGNkLCAweDAxMDksIDB4MDEwMSwgMHgwMDExfSwgezB4MDAzMCwgMHgwMDM0LCAweDAwMzgsIDB4MDAzY30sCisgICAgezB4MDA5MywgMHgwMDkzLCAweDAxNGIsIDB4MDE0Yn0sIHsweDAwOTcsIDB4MDA5NywgMHgwMTQzLCAweDAxNDN9LAorICAgIHsweDAwNWIsIDB4MDA1YiwgMHgwMDE3LCAweDAwMTd9LCB7MHgwMTg3LCAweDAxODcsIDB4MDBkMywgMHgwMGQzfSwKKyAgICB7MHgwMDQ0LCAweDAwNDgsIDB4MDA0YywgMHgwMDUwfSwgezB4MDE0ZiwgMHgwMTRmLCAweDAxMGYsIDB4MDEwZn0sCisgICAgezB4MDBkNywgMHgwMGQ3LCAweDAxOGIsIDB4MDE4Yn0sIHsweDAwOWIsIDB4MDA5YiwgMHgwMWM3LCAweDAxYzd9LAorICAgIHsweDAxOGQsIDB4MDE4MSwgMHgwMDE5LCAweDAxMTF9LCB7MHgwMDU4LCAweDAwNWMsIDB4MDA2MCwgMHgwMDY4fSwKKyAgICB7MHgwMDVkLCAweDAxNTEsIDB4MDA5ZCwgMHgwMTE1fSwgezB4MDBkOSwgMHgwMWM5LCAweDAwZGQsIDB4MDExOX0sCisgICAgezB4MDE1NSwgMHgwMTkxLCAweDAxY2QsIDB4MDA2NH0sIHsweDAwMWYsIDB4MDAxZiwgMHgwMWMzLCAweDAxYzN9LAorICAgIHsweDAwNmMsIDB4MDA3MCwgMHgwMDc0LCAweDAwNzh9LCB7MHgwMTViLCAweDAxNWIsIDB4MDE5NywgMHgwMTk3fSwKKyAgICB7MHgwMTFmLCAweDAxMWYsIDB4MDFkMywgMHgwMWQzfSwgezB4MDFkNywgMHgwMWQ3LCAweDAxNWYsIDB4MDE1Zn0sCisgICAgezB4MDE5ZCwgMHgwMTk5LCAweDAxZDksIDB4MDFkZH19OwogCi1jb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzhbMzFdWzRdID0KLXsKLSAgezB4MDAwNCwweDAwMDgsMHgwMDEwLDB4MDAyNH0sIHsweDAwNDcsMHgwMDQ3LDB4MDA0OSwweDAwMDV9LCB7MHgwMDg1LDB4MDA0MSwweDAwODksMHgwMDBjfSwgezB4MDAwMywweDAwMDMsMHgwMDBiLDB4MDAwYn0sCi0gIHsweDAwMTQsMHgwMDE4LDB4MDAxYywweDAwMjB9LCB7MHgwMDgzLDB4MDA4MywweDAwNGYsMHgwMDRmfSwgezB4MDBjNywweDAwYzcsMHgwMDhmLDB4MDA4Zn0sIHsweDAwY2IsMHgwMGNiLDB4MDBjZCwweDAwNTF9LAotICB7MHgwMTA1LDB4MDA5MSwweDAxMDksMHgwMDBkfSwgezB4MDAyOCwweDAwMmMsMHgwMDQwLDB4MDA1NH0sIHsweDAwYzEsMHgwMGQxLDB4MDEwZCwweDAwOTV9LCB7MHgwMDMwLDB4MDAzNCwweDAwMzgsMHgwMDNjfSwKLSAgezB4MDA1NywweDAwNTcsMHgwMTRiLDB4MDE0Yn0sIHsweDAxNDcsMHgwMTQ3LDB4MDBkNywweDAwZDd9LCB7MHgwMTRmLDB4MDE0ZiwweDAxMTMsMHgwMTEzfSwgezB4MDExNywweDAxMTcsMHgwMTAzLDB4MDEwM30sCi0gIHsweDAwNDQsMHgwMDQ4LDB4MDA0YywweDAwNTB9LCB7MHgwMTUzLDB4MDE1MywweDAwMTMsMHgwMDEzfSwgezB4MDE4YiwweDAxOGIsMHgwMDliLDB4MDA5Yn0sIHsweDAwNWIsMHgwMDViLDB4MDE4NywweDAxODd9LAotICB7MHgwMThkLDB4MDBkOSwweDAxNTUsMHgwMDE1fSwgezB4MDA1OCwweDAwNWMsMHgwMDYwLDB4MDA2OH0sIHsweDAxMTksMHgwMTQxLDB4MDE5MSwweDAwNWR9LCB7MHgwMDlkLDB4MDFjOSwweDAxNTksMHgwMGRkfSwKLSAgezB4MDFjNSwweDAxOTUsMHgwMWNkLDB4MDA2NH0sIHsweDAxOWIsMHgwMTliLDB4MDExZiwweDAxMWZ9LCB7MHgwMDZjLDB4MDA3MCwweDAwNzQsMHgwMDc4fSwgezB4MDAxYiwweDAwMWIsMHgwMWQzLDB4MDFkM30sCi0gIHsweDAxODMsMHgwMTgzLDB4MDE1ZiwweDAxNWZ9LCB7MHgwMTlmLDB4MDE5ZiwweDAxZGIsMHgwMWRifSwgezB4MDFkNSwweDAwMWQsMHgwMWMxLDB4MDFkZH0KLX07Citjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzhbMzFdWzRdID0geworICAgIHsweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjR9LCB7MHgwMDQ3LCAweDAwNDcsIDB4MDA0OSwgMHgwMDA1fSwKKyAgICB7MHgwMDg1LCAweDAwNDEsIDB4MDA4OSwgMHgwMDBjfSwgezB4MDAwMywgMHgwMDAzLCAweDAwMGIsIDB4MDAwYn0sCisgICAgezB4MDAxNCwgMHgwMDE4LCAweDAwMWMsIDB4MDAyMH0sIHsweDAwODMsIDB4MDA4MywgMHgwMDRmLCAweDAwNGZ9LAorICAgIHsweDAwYzcsIDB4MDBjNywgMHgwMDhmLCAweDAwOGZ9LCB7MHgwMGNiLCAweDAwY2IsIDB4MDBjZCwgMHgwMDUxfSwKKyAgICB7MHgwMTA1LCAweDAwOTEsIDB4MDEwOSwgMHgwMDBkfSwgezB4MDAyOCwgMHgwMDJjLCAweDAwNDAsIDB4MDA1NH0sCisgICAgezB4MDBjMSwgMHgwMGQxLCAweDAxMGQsIDB4MDA5NX0sIHsweDAwMzAsIDB4MDAzNCwgMHgwMDM4LCAweDAwM2N9LAorICAgIHsweDAwNTcsIDB4MDA1NywgMHgwMTRiLCAweDAxNGJ9LCB7MHgwMTQ3LCAweDAxNDcsIDB4MDBkNywgMHgwMGQ3fSwKKyAgICB7MHgwMTRmLCAweDAxNGYsIDB4MDExMywgMHgwMTEzfSwgezB4MDExNywgMHgwMTE3LCAweDAxMDMsIDB4MDEwM30sCisgICAgezB4MDA0NCwgMHgwMDQ4LCAweDAwNGMsIDB4MDA1MH0sIHsweDAxNTMsIDB4MDE1MywgMHgwMDEzLCAweDAwMTN9LAorICAgIHsweDAxOGIsIDB4MDE4YiwgMHgwMDliLCAweDAwOWJ9LCB7MHgwMDViLCAweDAwNWIsIDB4MDE4NywgMHgwMTg3fSwKKyAgICB7MHgwMThkLCAweDAwZDksIDB4MDE1NSwgMHgwMDE1fSwgezB4MDA1OCwgMHgwMDVjLCAweDAwNjAsIDB4MDA2OH0sCisgICAgezB4MDExOSwgMHgwMTQxLCAweDAxOTEsIDB4MDA1ZH0sIHsweDAwOWQsIDB4MDFjOSwgMHgwMTU5LCAweDAwZGR9LAorICAgIHsweDAxYzUsIDB4MDE5NSwgMHgwMWNkLCAweDAwNjR9LCB7MHgwMTliLCAweDAxOWIsIDB4MDExZiwgMHgwMTFmfSwKKyAgICB7MHgwMDZjLCAweDAwNzAsIDB4MDA3NCwgMHgwMDc4fSwgezB4MDAxYiwgMHgwMDFiLCAweDAxZDMsIDB4MDFkM30sCisgICAgezB4MDE4MywgMHgwMTgzLCAweDAxNWYsIDB4MDE1Zn0sIHsweDAxOWYsIDB4MDE5ZiwgMHgwMWRiLCAweDAxZGJ9LAorICAgIHsweDAxZDUsIDB4MDAxZCwgMHgwMWMxLCAweDAxZGR9fTsKIAotY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va185Wzg0XVs0XSA9Ci17Ci0gIHsweDAwMDMsMHgwMDAzLDB4MDAwNCwweDAwMDh9LCB7MHgwMDA3LDB4MDAwNywweDAwNDMsMHgwMDQzfSwgezB4MDA0NSwweDAwMGMsMHgwMDEwLDB4MDAyY30sIHsweDAwNDksMHgwMDg1LDB4MDAwOSwweDAwODF9LAotICB7MHgwMDE0LDB4MDAxOCwweDAwMWMsMHgwMDIwfSwgezB4MDA0ZiwweDAwNGYsMHgwMDhiLDB4MDA4Yn0sIHsweDAwYzcsMHgwMGM3LDB4MDAwZCwweDAwYzF9LCB7MHgwMGM5LDB4MDA4ZCwweDAxMDUsMHgwMDUxfSwKLSAgezB4MDEwOSwweDAxNDUsMHgwMDI0LDB4MDAyOH0sIHsweDAwOTMsMHgwMDkzLDB4MDBjZiwweDAwY2Z9LCB7MHgwMTAzLDB4MDEwMywweDAwMTMsMHgwMDEzfSwgezB4MDAzMCwweDAwNDQsMHgwMDU4LDB4MDBhNH0sCi0gIHsweDAwMzQsMHgwMDM4LDB4MDAzYywweDAwNDB9LCB7MHgwMDU3LDB4MDA1NywweDAxNGIsMHgwMTRifSwgezB4MDE4NywweDAxODcsMHgwMTBmLDB4MDEwZn0sIHsweDAwOTcsMHgwMDk3LDB4MDA1YiwweDAwNWJ9LAotICB7MHgwMGQzLDB4MDBkMywweDAxNDEsMHgwMTg5fSwgezB4MDA0OCwweDAwNGMsMHgwMDUwLDB4MDA1NH0sIHsweDAwMTUsMHgwMWM1LDB4MDE0ZCwweDAyMDV9LCB7MHgwMDYxLDB4MDExMSwweDAwZDUsMHgwMDk5fSwKLSAgezB4MDA1ZCwweDAxODEsMHgwMGExLDB4MDIwOX0sIHsweDAxOGQsMHgwMWM5LDB4MDE1MSwweDAwNjV9LCB7MHgwMDVjLDB4MDA2OCwweDAwN2MsMHgwMDkwfSwgezB4MDI0NSwweDAwOWQsMHgwMDYwLDB4MDA2NH0sCi0gIHsweDAwMWIsMHgwMDFiLDB4MDExNywweDAxMTd9LCB7MHgwMGRiLDB4MDBkYiwweDAwZTMsMHgwMGUzfSwgezB4MDA2YywweDAwNzAsMHgwMDc0LDB4MDA3OH0sIHsweDAxYzMsMHgwMWMzLDB4MDBhNywweDAwYTd9LAotICB7MHgwMjBmLDB4MDIwZiwweDAxOTMsMHgwMTkzfSwgezB4MDFjZiwweDAxY2YsMHgwMjAzLDB4MDIwM30sIHsweDAwNmIsMHgwMDZiLDB4MDExYiwweDAxMWJ9LCB7MHgwMDgwLDB4MDA4NCwweDAwODgsMHgwMDhjfSwKLSAgezB4MDI0YiwweDAyNGIsMHgwMTU3LDB4MDE1N30sIHsweDAwMjMsMHgwMDIzLDB4MDAxZiwweDAwMWZ9LCB7MHgwMGRmLDB4MDBkZiwweDAwYWIsMHgwMGFifSwgezB4MDBlNywweDAwZTcsMHgwMTIzLDB4MDEyM30sCi0gIHsweDAwOTQsMHgwMDk4LDB4MDA5YywweDAwYTB9LCB7MHgwMjg3LDB4MDI4NywweDAxMWYsMHgwMTFmfSwgezB4MDE1YiwweDAxNWIsMHgwMTk3LDB4MDE5N30sIHsweDAyMTMsMHgwMjEzLDB4MDFkMywweDAxZDN9LAotICB7MHgwMjRmLDB4MDI0ZiwweDAwNmYsMHgwMDZmfSwgezB4MDBhOCwweDAwYmMsMHgwMGQwLDB4MDBmNH0sIHsweDAwYWMsMHgwMGIwLDB4MDBiNCwweDAwYjh9LCB7MHgwMjE3LDB4MDIxNywweDAwMjcsMHgwMDI3fSwKLSAgezB4MDE2MywweDAxNjMsMHgwMGU5LDB4MDI4OX0sIHsweDAyNDEsMHgwMGFkLDB4MDEyNSwweDAxOTl9LCB7MHgwMDcxLDB4MDI1MSwweDAxYTEsMHgwMmM1fSwgezB4MDBjMCwweDAwYzQsMHgwMGM4LDB4MDBjY30sCi0gIHsweDAxNjUsMHgwMTI5LDB4MDFkNSwweDAxNWR9LCB7MHgwMmM5LDB4MDMwNSwweDAwYjEsMHgwMGVkfSwgezB4MDI4ZCwweDAyNTUsMHgwMWQ5LDB4MDFlMX0sIHsweDAxMmQsMHgwMjgxLDB4MDE5ZCwweDAwZjF9LAotICB7MHgwMGQ0LDB4MDBkOCwweDAwZGMsMHgwMGUwfSwgezB4MDAyOSwweDAxNjksMHgwMjkxLDB4MDIxOX0sIHsweDAzMDksMHgwMWE1LDB4MDFlNSwweDAyZDF9LCB7MHgwMDJkLDB4MDI1OSwweDAyY2QsMHgwMjk1fSwKLSAgezB4MDBlNCwweDAwZTgsMHgwMGVjLDB4MDBmMH0sIHsweDAyMjMsMHgwMjIzLDB4MDIxZiwweDAyMWZ9LCB7MHgwMTczLDB4MDE3MywweDAzMGYsMHgwMzBmfSwgezB4MDE2ZiwweDAxNmYsMHgwMWRmLDB4MDFkZn0sCi0gIHsweDAxMzMsMHgwMTMzLDB4MDFhZiwweDAxYWZ9LCB7MHgwMGY4LDB4MDEwYywweDAxMjAsMHgwMTM0fSwgezB4MDBmYywweDAxMDAsMHgwMTA0LDB4MDEwOH0sIHsweDAxYWIsMHgwMWFiLDB4MDMxMywweDAzMTN9LAotICB7MHgwMjVmLDB4MDI1ZiwweDAyZDcsMHgwMmQ3fSwgezB4MDJjMywweDAyYzMsMHgwMWIzLDB4MDFiM30sIHsweDAyOWIsMHgwMjliLDB4MDAzMywweDAwMzN9LCB7MHgwMTEwLDB4MDExNCwweDAxMTgsMHgwMTFjfSwKLSAgezB4MDFlYiwweDAxZWIsMHgwMzE3LDB4MDMxN30sIHsweDAyOWYsMHgwMjlmLDB4MDIyNywweDAyMjd9LCB7MHgwMzAzLDB4MDMwMywweDAxZWYsMHgwMWVmfSwgezB4MDI2MywweDAyNjMsMHgwMjY3LDB4MDI2N30sCi0gIHsweDAxMjQsMHgwMTI4LDB4MDEyYywweDAxMzB9LCB7MHgwMjJiLDB4MDIyYiwweDAyZGYsMHgwMmRmfSwgezB4MDFmMywweDAxZjMsMHgwMmRiLDB4MDJkYn0sIHsweDAyZTMsMHgwMmUzLDB4MDIyZiwweDAyMmZ9LAotICB7MHgwMzFmLDB4MDMxZiwweDAzMWIsMHgwMzFifSwgezB4MDEzOCwweDAxM2MsMHgwMTQwLDB4MDE0NH0sIHsweDAyYTEsMHgwMjY5LDB4MDMyMSwweDAyYTV9LCB7MHgwMmU1LDB4MDMyNSwweDAyZTksMHgwMjcxfSwKLSAgezB4MDJhOSwweDAyNmQsMHgwMjMxLDB4MDJhZH0sIHsweDAyYjEsMHgwMmYxLDB4MDE0OCwweDAxNGN9LCB7MHgwMzJiLDB4MDMyYiwweDAyZWYsMHgwMmVmfSwgezB4MDMyZiwweDAzMmYsMHgwMzMzLDB4MDMzM30KLX07Citjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzlbODRdWzRdID0geworICAgIHsweDAwMDMsIDB4MDAwMywgMHgwMDA0LCAweDAwMDh9LCB7MHgwMDA3LCAweDAwMDcsIDB4MDA0MywgMHgwMDQzfSwKKyAgICB7MHgwMDQ1LCAweDAwMGMsIDB4MDAxMCwgMHgwMDJjfSwgezB4MDA0OSwgMHgwMDg1LCAweDAwMDksIDB4MDA4MX0sCisgICAgezB4MDAxNCwgMHgwMDE4LCAweDAwMWMsIDB4MDAyMH0sIHsweDAwNGYsIDB4MDA0ZiwgMHgwMDhiLCAweDAwOGJ9LAorICAgIHsweDAwYzcsIDB4MDBjNywgMHgwMDBkLCAweDAwYzF9LCB7MHgwMGM5LCAweDAwOGQsIDB4MDEwNSwgMHgwMDUxfSwKKyAgICB7MHgwMTA5LCAweDAxNDUsIDB4MDAyNCwgMHgwMDI4fSwgezB4MDA5MywgMHgwMDkzLCAweDAwY2YsIDB4MDBjZn0sCisgICAgezB4MDEwMywgMHgwMTAzLCAweDAwMTMsIDB4MDAxM30sIHsweDAwMzAsIDB4MDA0NCwgMHgwMDU4LCAweDAwYTR9LAorICAgIHsweDAwMzQsIDB4MDAzOCwgMHgwMDNjLCAweDAwNDB9LCB7MHgwMDU3LCAweDAwNTcsIDB4MDE0YiwgMHgwMTRifSwKKyAgICB7MHgwMTg3LCAweDAxODcsIDB4MDEwZiwgMHgwMTBmfSwgezB4MDA5NywgMHgwMDk3LCAweDAwNWIsIDB4MDA1Yn0sCisgICAgezB4MDBkMywgMHgwMGQzLCAweDAxNDEsIDB4MDE4OX0sIHsweDAwNDgsIDB4MDA0YywgMHgwMDUwLCAweDAwNTR9LAorICAgIHsweDAwMTUsIDB4MDFjNSwgMHgwMTRkLCAweDAyMDV9LCB7MHgwMDYxLCAweDAxMTEsIDB4MDBkNSwgMHgwMDk5fSwKKyAgICB7MHgwMDVkLCAweDAxODEsIDB4MDBhMSwgMHgwMjA5fSwgezB4MDE4ZCwgMHgwMWM5LCAweDAxNTEsIDB4MDA2NX0sCisgICAgezB4MDA1YywgMHgwMDY4LCAweDAwN2MsIDB4MDA5MH0sIHsweDAyNDUsIDB4MDA5ZCwgMHgwMDYwLCAweDAwNjR9LAorICAgIHsweDAwMWIsIDB4MDAxYiwgMHgwMTE3LCAweDAxMTd9LCB7MHgwMGRiLCAweDAwZGIsIDB4MDBlMywgMHgwMGUzfSwKKyAgICB7MHgwMDZjLCAweDAwNzAsIDB4MDA3NCwgMHgwMDc4fSwgezB4MDFjMywgMHgwMWMzLCAweDAwYTcsIDB4MDBhN30sCisgICAgezB4MDIwZiwgMHgwMjBmLCAweDAxOTMsIDB4MDE5M30sIHsweDAxY2YsIDB4MDFjZiwgMHgwMjAzLCAweDAyMDN9LAorICAgIHsweDAwNmIsIDB4MDA2YiwgMHgwMTFiLCAweDAxMWJ9LCB7MHgwMDgwLCAweDAwODQsIDB4MDA4OCwgMHgwMDhjfSwKKyAgICB7MHgwMjRiLCAweDAyNGIsIDB4MDE1NywgMHgwMTU3fSwgezB4MDAyMywgMHgwMDIzLCAweDAwMWYsIDB4MDAxZn0sCisgICAgezB4MDBkZiwgMHgwMGRmLCAweDAwYWIsIDB4MDBhYn0sIHsweDAwZTcsIDB4MDBlNywgMHgwMTIzLCAweDAxMjN9LAorICAgIHsweDAwOTQsIDB4MDA5OCwgMHgwMDljLCAweDAwYTB9LCB7MHgwMjg3LCAweDAyODcsIDB4MDExZiwgMHgwMTFmfSwKKyAgICB7MHgwMTViLCAweDAxNWIsIDB4MDE5NywgMHgwMTk3fSwgezB4MDIxMywgMHgwMjEzLCAweDAxZDMsIDB4MDFkM30sCisgICAgezB4MDI0ZiwgMHgwMjRmLCAweDAwNmYsIDB4MDA2Zn0sIHsweDAwYTgsIDB4MDBiYywgMHgwMGQwLCAweDAwZjR9LAorICAgIHsweDAwYWMsIDB4MDBiMCwgMHgwMGI0LCAweDAwYjh9LCB7MHgwMjE3LCAweDAyMTcsIDB4MDAyNywgMHgwMDI3fSwKKyAgICB7MHgwMTYzLCAweDAxNjMsIDB4MDBlOSwgMHgwMjg5fSwgezB4MDI0MSwgMHgwMGFkLCAweDAxMjUsIDB4MDE5OX0sCisgICAgezB4MDA3MSwgMHgwMjUxLCAweDAxYTEsIDB4MDJjNX0sIHsweDAwYzAsIDB4MDBjNCwgMHgwMGM4LCAweDAwY2N9LAorICAgIHsweDAxNjUsIDB4MDEyOSwgMHgwMWQ1LCAweDAxNWR9LCB7MHgwMmM5LCAweDAzMDUsIDB4MDBiMSwgMHgwMGVkfSwKKyAgICB7MHgwMjhkLCAweDAyNTUsIDB4MDFkOSwgMHgwMWUxfSwgezB4MDEyZCwgMHgwMjgxLCAweDAxOWQsIDB4MDBmMX0sCisgICAgezB4MDBkNCwgMHgwMGQ4LCAweDAwZGMsIDB4MDBlMH0sIHsweDAwMjksIDB4MDE2OSwgMHgwMjkxLCAweDAyMTl9LAorICAgIHsweDAzMDksIDB4MDFhNSwgMHgwMWU1LCAweDAyZDF9LCB7MHgwMDJkLCAweDAyNTksIDB4MDJjZCwgMHgwMjk1fSwKKyAgICB7MHgwMGU0LCAweDAwZTgsIDB4MDBlYywgMHgwMGYwfSwgezB4MDIyMywgMHgwMjIzLCAweDAyMWYsIDB4MDIxZn0sCisgICAgezB4MDE3MywgMHgwMTczLCAweDAzMGYsIDB4MDMwZn0sIHsweDAxNmYsIDB4MDE2ZiwgMHgwMWRmLCAweDAxZGZ9LAorICAgIHsweDAxMzMsIDB4MDEzMywgMHgwMWFmLCAweDAxYWZ9LCB7MHgwMGY4LCAweDAxMGMsIDB4MDEyMCwgMHgwMTM0fSwKKyAgICB7MHgwMGZjLCAweDAxMDAsIDB4MDEwNCwgMHgwMTA4fSwgezB4MDFhYiwgMHgwMWFiLCAweDAzMTMsIDB4MDMxM30sCisgICAgezB4MDI1ZiwgMHgwMjVmLCAweDAyZDcsIDB4MDJkN30sIHsweDAyYzMsIDB4MDJjMywgMHgwMWIzLCAweDAxYjN9LAorICAgIHsweDAyOWIsIDB4MDI5YiwgMHgwMDMzLCAweDAwMzN9LCB7MHgwMTEwLCAweDAxMTQsIDB4MDExOCwgMHgwMTFjfSwKKyAgICB7MHgwMWViLCAweDAxZWIsIDB4MDMxNywgMHgwMzE3fSwgezB4MDI5ZiwgMHgwMjlmLCAweDAyMjcsIDB4MDIyN30sCisgICAgezB4MDMwMywgMHgwMzAzLCAweDAxZWYsIDB4MDFlZn0sIHsweDAyNjMsIDB4MDI2MywgMHgwMjY3LCAweDAyNjd9LAorICAgIHsweDAxMjQsIDB4MDEyOCwgMHgwMTJjLCAweDAxMzB9LCB7MHgwMjJiLCAweDAyMmIsIDB4MDJkZiwgMHgwMmRmfSwKKyAgICB7MHgwMWYzLCAweDAxZjMsIDB4MDJkYiwgMHgwMmRifSwgezB4MDJlMywgMHgwMmUzLCAweDAyMmYsIDB4MDIyZn0sCisgICAgezB4MDMxZiwgMHgwMzFmLCAweDAzMWIsIDB4MDMxYn0sIHsweDAxMzgsIDB4MDEzYywgMHgwMTQwLCAweDAxNDR9LAorICAgIHsweDAyYTEsIDB4MDI2OSwgMHgwMzIxLCAweDAyYTV9LCB7MHgwMmU1LCAweDAzMjUsIDB4MDJlOSwgMHgwMjcxfSwKKyAgICB7MHgwMmE5LCAweDAyNmQsIDB4MDIzMSwgMHgwMmFkfSwgezB4MDJiMSwgMHgwMmYxLCAweDAxNDgsIDB4MDE0Y30sCisgICAgezB4MDMyYiwgMHgwMzJiLCAweDAyZWYsIDB4MDJlZn0sIHsweDAzMmYsIDB4MDMyZiwgMHgwMzMzLCAweDAzMzN9fTsKIAotY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va18xMFs4Ml1bNF0gPQotewotICB7MHgwMDA0LDB4MDAwYywweDAwMjAsMHgwMDRjfSwgezB4MDA0NSwweDAwODUsMHgwMDQ5LDB4MDAwOH0sIHsweDAwOGIsMHgwMDhiLDB4MDAwNywweDAwMDd9LCB7MHgwMDEwLDB4MDAxNCwweDAwMTgsMHgwMDFjfSwKLSAgezB4MDA0MywweDAwNDMsMHgwMGM3LDB4MDBjN30sIHsweDAwOGYsMHgwMDhmLDB4MDA0ZiwweDAwNGZ9LCB7MHgwMGNiLDB4MDBjYiwweDAwY2YsMHgwMGNmfSwgezB4MDAwOSwweDAwODEsMHgwMTA5LDB4MDA5MX0sCi0gIHsweDAwMjQsMHgwMDI4LDB4MDAyYywweDAwMzh9LCB7MHgwMTA1LDB4MDA1MSwweDAwMDEsMHgwMGQxfSwgezB4MDEwZCwweDAwMGQsMHgwMGMxLDB4MDExMX0sIHsweDAxNDksMHgwMDk1LDB4MDAzMCwweDAwMzR9LAotICB7MHgwMTQ3LDB4MDE0NywweDAwNTcsMHgwMDU3fSwgezB4MDBkNywweDAwZDcsMHgwMTRmLDB4MDE0Zn0sIHsweDAwM2MsMHgwMDQwLDB4MDA0NCwweDAwNDh9LCB7MHgwMTE3LDB4MDExNywweDAxNTMsMHgwMTUzfSwKLSAgezB4MDA5YiwweDAwOWIsMHgwMThiLDB4MDE4Yn0sIHsweDAwZGIsMHgwMGRiLDB4MDAxMywweDAwMTN9LCB7MHgwMDViLDB4MDA1YiwweDAxMDMsMHgwMTAzfSwgezB4MDA1MCwweDAwNjQsMHgwMDc4LDB4MDBjMH0sCi0gIHsweDAwNTQsMHgwMDU4LDB4MDA1YywweDAwNjB9LCB7MHgwMTg3LDB4MDE4NywweDAxOGYsMHgwMThmfSwgezB4MDE1NywweDAxNTcsMHgwMTFiLDB4MDExYn0sIHsweDAxOTMsMHgwMTkzLDB4MDE1OSwweDAwOWR9LAotICB7MHgwMWNkLDB4MDFjOSwweDAxOTUsMHgwMGExfSwgezB4MDA2OCwweDAwNmMsMHgwMDcwLDB4MDA3NH0sIHsweDAwZGQsMHgwMDE1LDB4MDA1ZCwweDAxNDF9LCB7MHgwMDYxLDB4MDFjNSwweDAwZTEsMHgwMTFkfSwKLSAgezB4MDFkMSwweDAyMDksMHgwMTk5LDB4MDE1ZH0sIHsweDAyMDUsMHgwMjBkLDB4MDEyMSwweDAyMTF9LCB7MHgwMDdjLDB4MDA4NCwweDAwOTgsMHgwMGFjfSwgezB4MDFkNSwweDAxNjEsMHgwMjE1LDB4MDA4MH0sCi0gIHsweDAxOWYsMHgwMTlmLDB4MDFkYiwweDAxZGJ9LCB7MHgwMDg4LDB4MDA4YywweDAwOTAsMHgwMDk0fSwgezB4MDBhNywweDAwYTcsMHgwMDFiLDB4MDAxYn0sIHsweDAyMWIsMHgwMjFiLDB4MDBlNywweDAwZTd9LAotICB7MHgwMjRmLDB4MDI0ZiwweDAwNjcsMHgwMDY3fSwgezB4MDI0YiwweDAyNGIsMHgwMTgzLDB4MDE4M30sIHsweDAwOWMsMHgwMGEwLDB4MDBhNCwweDAwYTh9LCB7MHgwMWEzLDB4MDFhMywweDAxMjcsMHgwMTI3fSwKLSAgezB4MDI1MywweDAyNTMsMHgwMGFiLDB4MDBhYn0sIHsweDAyNDcsMHgwMjQ3LDB4MDFkZiwweDAxZGZ9LCB7MHgwMWUzLDB4MDFlMywweDAxNjcsMHgwMTY3fSwgezB4MDBiMCwweDAwYjQsMHgwMGI4LDB4MDBiY30sCi0gIHsweDAyMWYsMHgwMjFmLDB4MDBlYiwweDAwZWJ9LCB7MHgwMjU3LDB4MDI1NywweDAxMmIsMHgwMTJifSwgezB4MDI4YiwweDAyOGIsMHgwMDZiLDB4MDA2Yn0sIHsweDAyOGYsMHgwMjhmLDB4MDFhNywweDAxYTd9LAotICB7MHgwMGM0LDB4MDBkOCwweDAwZWMsMHgwMTAwfSwgezB4MDBjOCwweDAwY2MsMHgwMGQwLDB4MDBkNH0sIHsweDAyNWIsMHgwMjViLDB4MDAyMywweDAwMjN9LCB7MHgwMjkzLDB4MDI5MywweDAwMWYsMHgwMDFmfSwKLSAgezB4MDBhZiwweDAwYWYsMHgwMjVkLDB4MDBlZH0sIHsweDAxYTksMHgwMjg1LDB4MDA2ZCwweDAxZTV9LCB7MHgwMGRjLDB4MDBlMCwweDAwZTQsMHgwMGU4fSwgezB4MDFjMSwweDAyMjEsMHgwMTY5LDB4MDJjZH0sCi0gIHsweDAyOTUsMHgwMjYxLDB4MDE2ZCwweDAyMDF9LCB7MHgwMTJkLDB4MDJjOSwweDAyOWQsMHgwMjk5fSwgezB4MDFlOSwweDAyZDEsMHgwMmM1LDB4MDBiMX0sIHsweDAwZjAsMHgwMGY0LDB4MDBmOCwweDAwZmN9LAotICB7MHgwMjI1LDB4MDBmMSwweDAxYWQsMHgwMmQ1fSwgezB4MDEzMSwweDAxZWQsMHgwMTcxLDB4MDMwZH0sIHsweDAyZDksMHgwMDI1LDB4MDIyOSwweDAwMjl9LCB7MHgwMDcxLDB4MDI0MSwweDAzMTEsMHgwMjY1fSwKLSAgezB4MDEwNCwweDAxMGMsMHgwMTIwLDB4MDEzNH0sIHsweDAxYjEsMHgwMzA5LDB4MDJhMSwweDAxMDh9LCB7MHgwMmE3LDB4MDJhNywweDAzMDcsMHgwMzA3fSwgezB4MDExMCwweDAxMTQsMHgwMTE4LDB4MDExY30sCi0gIHsweDAyMmYsMHgwMjJmLDB4MDFmMywweDAxZjN9LCB7MHgwMmRmLDB4MDJkZiwweDAzMTcsMHgwMzE3fSwgezB4MDMxYiwweDAzMWIsMHgwMjZiLDB4MDI2Yn0sIHsweDAyZTMsMHgwMmUzLDB4MDIzMywweDAyMzN9LAotICB7MHgwMTI0LDB4MDEyOCwweDAxMmMsMHgwMTMwfSwgezB4MDI4MywweDAyODMsMHgwMzFmLDB4MDMxZn0sIHsweDAwMmYsMHgwMDJmLDB4MDJhYiwweDAyYWJ9LCB7MHgwMjZmLDB4MDI2ZiwweDAyYWYsMHgwMmFmfSwKLSAgezB4MDJjMywweDAyYzMsMHgwMmVmLDB4MDJlZn0sIHsweDAxMzgsMHgwMTNjLDB4MDE0MCwweDAxNDR9LCB7MHgwMmU3LDB4MDJlNywweDAyZWIsMHgwMmVifSwgezB4MDAzMywweDAwMzMsMHgwMzIzLDB4MDMyM30sCi0gIHsweDAyNzEsMHgwMzI5LDB4MDMyNSwweDAzMmR9LCB7MHgwMmYxLDB4MDMwMSwweDAyYjEsMHgwMzMxfQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfMTBbODJdWzRdID0geworICAgIHsweDAwMDQsIDB4MDAwYywgMHgwMDIwLCAweDAwNGN9LCB7MHgwMDQ1LCAweDAwODUsIDB4MDA0OSwgMHgwMDA4fSwKKyAgICB7MHgwMDhiLCAweDAwOGIsIDB4MDAwNywgMHgwMDA3fSwgezB4MDAxMCwgMHgwMDE0LCAweDAwMTgsIDB4MDAxY30sCisgICAgezB4MDA0MywgMHgwMDQzLCAweDAwYzcsIDB4MDBjN30sIHsweDAwOGYsIDB4MDA4ZiwgMHgwMDRmLCAweDAwNGZ9LAorICAgIHsweDAwY2IsIDB4MDBjYiwgMHgwMGNmLCAweDAwY2Z9LCB7MHgwMDA5LCAweDAwODEsIDB4MDEwOSwgMHgwMDkxfSwKKyAgICB7MHgwMDI0LCAweDAwMjgsIDB4MDAyYywgMHgwMDM4fSwgezB4MDEwNSwgMHgwMDUxLCAweDAwMDEsIDB4MDBkMX0sCisgICAgezB4MDEwZCwgMHgwMDBkLCAweDAwYzEsIDB4MDExMX0sIHsweDAxNDksIDB4MDA5NSwgMHgwMDMwLCAweDAwMzR9LAorICAgIHsweDAxNDcsIDB4MDE0NywgMHgwMDU3LCAweDAwNTd9LCB7MHgwMGQ3LCAweDAwZDcsIDB4MDE0ZiwgMHgwMTRmfSwKKyAgICB7MHgwMDNjLCAweDAwNDAsIDB4MDA0NCwgMHgwMDQ4fSwgezB4MDExNywgMHgwMTE3LCAweDAxNTMsIDB4MDE1M30sCisgICAgezB4MDA5YiwgMHgwMDliLCAweDAxOGIsIDB4MDE4Yn0sIHsweDAwZGIsIDB4MDBkYiwgMHgwMDEzLCAweDAwMTN9LAorICAgIHsweDAwNWIsIDB4MDA1YiwgMHgwMTAzLCAweDAxMDN9LCB7MHgwMDUwLCAweDAwNjQsIDB4MDA3OCwgMHgwMGMwfSwKKyAgICB7MHgwMDU0LCAweDAwNTgsIDB4MDA1YywgMHgwMDYwfSwgezB4MDE4NywgMHgwMTg3LCAweDAxOGYsIDB4MDE4Zn0sCisgICAgezB4MDE1NywgMHgwMTU3LCAweDAxMWIsIDB4MDExYn0sIHsweDAxOTMsIDB4MDE5MywgMHgwMTU5LCAweDAwOWR9LAorICAgIHsweDAxY2QsIDB4MDFjOSwgMHgwMTk1LCAweDAwYTF9LCB7MHgwMDY4LCAweDAwNmMsIDB4MDA3MCwgMHgwMDc0fSwKKyAgICB7MHgwMGRkLCAweDAwMTUsIDB4MDA1ZCwgMHgwMTQxfSwgezB4MDA2MSwgMHgwMWM1LCAweDAwZTEsIDB4MDExZH0sCisgICAgezB4MDFkMSwgMHgwMjA5LCAweDAxOTksIDB4MDE1ZH0sIHsweDAyMDUsIDB4MDIwZCwgMHgwMTIxLCAweDAyMTF9LAorICAgIHsweDAwN2MsIDB4MDA4NCwgMHgwMDk4LCAweDAwYWN9LCB7MHgwMWQ1LCAweDAxNjEsIDB4MDIxNSwgMHgwMDgwfSwKKyAgICB7MHgwMTlmLCAweDAxOWYsIDB4MDFkYiwgMHgwMWRifSwgezB4MDA4OCwgMHgwMDhjLCAweDAwOTAsIDB4MDA5NH0sCisgICAgezB4MDBhNywgMHgwMGE3LCAweDAwMWIsIDB4MDAxYn0sIHsweDAyMWIsIDB4MDIxYiwgMHgwMGU3LCAweDAwZTd9LAorICAgIHsweDAyNGYsIDB4MDI0ZiwgMHgwMDY3LCAweDAwNjd9LCB7MHgwMjRiLCAweDAyNGIsIDB4MDE4MywgMHgwMTgzfSwKKyAgICB7MHgwMDljLCAweDAwYTAsIDB4MDBhNCwgMHgwMGE4fSwgezB4MDFhMywgMHgwMWEzLCAweDAxMjcsIDB4MDEyN30sCisgICAgezB4MDI1MywgMHgwMjUzLCAweDAwYWIsIDB4MDBhYn0sIHsweDAyNDcsIDB4MDI0NywgMHgwMWRmLCAweDAxZGZ9LAorICAgIHsweDAxZTMsIDB4MDFlMywgMHgwMTY3LCAweDAxNjd9LCB7MHgwMGIwLCAweDAwYjQsIDB4MDBiOCwgMHgwMGJjfSwKKyAgICB7MHgwMjFmLCAweDAyMWYsIDB4MDBlYiwgMHgwMGVifSwgezB4MDI1NywgMHgwMjU3LCAweDAxMmIsIDB4MDEyYn0sCisgICAgezB4MDI4YiwgMHgwMjhiLCAweDAwNmIsIDB4MDA2Yn0sIHsweDAyOGYsIDB4MDI4ZiwgMHgwMWE3LCAweDAxYTd9LAorICAgIHsweDAwYzQsIDB4MDBkOCwgMHgwMGVjLCAweDAxMDB9LCB7MHgwMGM4LCAweDAwY2MsIDB4MDBkMCwgMHgwMGQ0fSwKKyAgICB7MHgwMjViLCAweDAyNWIsIDB4MDAyMywgMHgwMDIzfSwgezB4MDI5MywgMHgwMjkzLCAweDAwMWYsIDB4MDAxZn0sCisgICAgezB4MDBhZiwgMHgwMGFmLCAweDAyNWQsIDB4MDBlZH0sIHsweDAxYTksIDB4MDI4NSwgMHgwMDZkLCAweDAxZTV9LAorICAgIHsweDAwZGMsIDB4MDBlMCwgMHgwMGU0LCAweDAwZTh9LCB7MHgwMWMxLCAweDAyMjEsIDB4MDE2OSwgMHgwMmNkfSwKKyAgICB7MHgwMjk1LCAweDAyNjEsIDB4MDE2ZCwgMHgwMjAxfSwgezB4MDEyZCwgMHgwMmM5LCAweDAyOWQsIDB4MDI5OX0sCisgICAgezB4MDFlOSwgMHgwMmQxLCAweDAyYzUsIDB4MDBiMX0sIHsweDAwZjAsIDB4MDBmNCwgMHgwMGY4LCAweDAwZmN9LAorICAgIHsweDAyMjUsIDB4MDBmMSwgMHgwMWFkLCAweDAyZDV9LCB7MHgwMTMxLCAweDAxZWQsIDB4MDE3MSwgMHgwMzBkfSwKKyAgICB7MHgwMmQ5LCAweDAwMjUsIDB4MDIyOSwgMHgwMDI5fSwgezB4MDA3MSwgMHgwMjQxLCAweDAzMTEsIDB4MDI2NX0sCisgICAgezB4MDEwNCwgMHgwMTBjLCAweDAxMjAsIDB4MDEzNH0sIHsweDAxYjEsIDB4MDMwOSwgMHgwMmExLCAweDAxMDh9LAorICAgIHsweDAyYTcsIDB4MDJhNywgMHgwMzA3LCAweDAzMDd9LCB7MHgwMTEwLCAweDAxMTQsIDB4MDExOCwgMHgwMTFjfSwKKyAgICB7MHgwMjJmLCAweDAyMmYsIDB4MDFmMywgMHgwMWYzfSwgezB4MDJkZiwgMHgwMmRmLCAweDAzMTcsIDB4MDMxN30sCisgICAgezB4MDMxYiwgMHgwMzFiLCAweDAyNmIsIDB4MDI2Yn0sIHsweDAyZTMsIDB4MDJlMywgMHgwMjMzLCAweDAyMzN9LAorICAgIHsweDAxMjQsIDB4MDEyOCwgMHgwMTJjLCAweDAxMzB9LCB7MHgwMjgzLCAweDAyODMsIDB4MDMxZiwgMHgwMzFmfSwKKyAgICB7MHgwMDJmLCAweDAwMmYsIDB4MDJhYiwgMHgwMmFifSwgezB4MDI2ZiwgMHgwMjZmLCAweDAyYWYsIDB4MDJhZn0sCisgICAgezB4MDJjMywgMHgwMmMzLCAweDAyZWYsIDB4MDJlZn0sIHsweDAxMzgsIDB4MDEzYywgMHgwMTQwLCAweDAxNDR9LAorICAgIHsweDAyZTcsIDB4MDJlNywgMHgwMmViLCAweDAyZWJ9LCB7MHgwMDMzLCAweDAwMzMsIDB4MDMyMywgMHgwMzIzfSwKKyAgICB7MHgwMjcxLCAweDAzMjksIDB4MDMyNSwgMHgwMzJkfSwgezB4MDJmMSwgMHgwMzAxLCAweDAyYjEsIDB4MDMzMX19OwogCi1jb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzExWzE1Ml1bNF0gPQotewotICB7MHgwMDA0LDB4MDAxMCwweDAwMzgsMHgwMDhjfSwgezB4MDAwMSwweDAwODUsMHgwMDA4LDB4MDAwY30sIHsweDA4NDMsMHgwODQzLDB4MDAwNywweDAwMDd9LCB7MHgwMDgzLDB4MDA4MywweDAwOGIsMHgwMDhifSwKLSAgezB4MDAxNCwweDAwMTgsMHgwMDFjLDB4MDAyNH0sIHsweDAxMDcsMHgwMTA3LDB4MDEwYiwweDAxMGJ9LCB7MHgwMTg1LDB4MDA4ZCwweDAxMGQsMHgwMDA5fSwgezB4MDE4OSwweDAxMDEsMHgwMThkLDB4MDAyMH0sCi0gIHsweDAwOTMsMHgwMDkzLDB4MDIwNywweDAyMDd9LCB7MHgwMDI4LDB4MDAyYywweDAwMzAsMHgwMDM0fSwgezB4MDExMywweDAxMTMsMHgwMjBiLDB4MDIwYn0sIHsweDAxOTMsMHgwMTkzLDB4MDIwZiwweDAyMGZ9LAotICB7MHgwMDBmLDB4MDAwZiwweDAxODMsMHgwMTgzfSwgezB4MDA5NywweDAwOTcsMHgwMTE3LDB4MDExN30sIHsweDAwM2MsMHgwMDUwLDB4MDA2NCwweDAwNzh9LCB7MHgwMDQwLDB4MDA0NCwweDAwNDgsMHgwMDRjfSwKLSAgezB4MDI4YiwweDAyOGIsMHgwMjEzLDB4MDIxM30sIHsweDAyODcsMHgwMjg3LDB4MDE5NywweDAxOTd9LCB7MHgwMjhmLDB4MDI4ZiwweDAyMTcsMHgwMjE3fSwgezB4MDI5MSwweDAxMTksMHgwMzA5LDB4MDA5OX0sCi0gIHsweDAwNTQsMHgwMDU4LDB4MDA1YywweDAwNjB9LCB7MHgwMTk5LDB4MDMwZCwweDAzMDUsMHgwODExfSwgezB4MDgwZCwweDAyYzEsMHgwMWMxLDB4MDI0MX0sIHsweDAyMTksMHgwMzQxLDB4MDAxMSwweDAzMTF9LAotICB7MHgwMjAxLDB4MDgwOSwweDAyOTUsMHgwODE1fSwgezB4MDA2OCwweDAwNmMsMHgwMDcwLDB4MDA3NH0sIHsweDAzYzEsMHgwMTQxLDB4MDQ0MSwweDAzODl9LCB7MHgwMTFkLDB4MDM4ZCwweDAyOTksMHgwMzE1fSwKLSAgezB4MDgxOSwweDA1NDEsMHgwMTlkLDB4MDA5ZH0sIHsweDA0YzEsMHgwODFkLDB4MDgwNSwweDAzODV9LCB7MHgwMDdjLDB4MDA4MCwweDAwODQsMHgwMDg4fSwgezB4MDM5MSwweDA1YzEsMHgwMjFkLDB4MDY0MX0sCi0gIHsweDA4MjEsMHgwMGMxLDB4MDMxOSwweDA4MjV9LCB7MHgwNDA5LDB4MDM5NSwweDA4MjksMHgwNmMxfSwgezB4MDFhMSwweDAxMjEsMHgwNDBkLDB4MDAxNX0sIHsweDAwOTAsMHgwMGM4LDB4MDExYywweDAxNzB9LAotICB7MHgwMDk0LDB4MDA5OCwweDAwYTAsMHgwMGI0fSwgezB4MDc0MSwweDA4MmQsMHgwMjlkLDB4MDQxMX0sIHsweDAzOTksMHgwMzFkLDB4MDI4MSwweDAwOWN9LCB7MHgwMjIzLDB4MDIyMywweDA3YzMsMHgwN2MzfSwKLSAgezB4MDBhNCwweDAwYTgsMHgwMGFjLDB4MDBiMH0sIHsweDA4MzMsMHgwODMzLDB4MDQwNywweDA0MDd9LCB7MHgwMGEzLDB4MDBhMywweDA4M2IsMHgwODNifSwgezB4MDQxNywweDA0MTcsMHgwODM3LDB4MDgzN30sCi0gIHsweDA0OGYsMHgwNDhmLDB4MDJhMywweDAyYTN9LCB7MHgwMGI4LDB4MDBiYywweDAwYzAsMHgwMGM0fSwgezB4MDM5ZiwweDAzOWYsMHgwNDhiLDB4MDQ4Yn0sIHsweDAzMjMsMHgwMzIzLDB4MDEyNywweDAxMjd9LAotICB7MHgwMWE3LDB4MDFhNywweDA4M2YsMHgwODNmfSwgezB4MDQ5MywweDA0OTMsMHgwNDFiLDB4MDQxYn0sIHsweDAwY2MsMHgwMGUwLDB4MDBmNCwweDAxMDh9LCB7MHgwMGQwLDB4MDBkNCwweDAwZDgsMHgwMGRjfSwKLSAgezB4MDAxYiwweDAwMWIsMHgwMjI3LDB4MDIyN30sIHsweDA0OTcsMHgwNDk3LDB4MDNhMywweDAzYTN9LCB7MHgwNDFmLDB4MDQxZiwweDA0ODcsMHgwNDg3fSwgezB4MDFhYiwweDAxYWIsMHgwMzAzLDB4MDMwM30sCi0gIHsweDAwZTQsMHgwMGU4LDB4MDBlYywweDAwZjB9LCB7MHgwMTJiLDB4MDEyYiwweDAwYTcsMHgwMGE3fSwgezB4MDJhNywweDAyYTcsMHgwNTEzLDB4MDUxM30sIHsweDA1MGIsMHgwNTBiLDB4MDMyNywweDAzMjd9LAotICB7MHgwNTBmLDB4MDUwZiwweDA0OWIsMHgwNDlifSwgezB4MDBmOCwweDAwZmMsMHgwMTAwLDB4MDEwNH0sIHsweDAyMmIsMHgwMjJiLDB4MDQyMywweDA0MjN9LCB7MHgwMmFiLDB4MDJhYiwweDAzYTcsMHgwM2E3fSwKLSAgezB4MDFhZiwweDAxYWYsMHgwNTA3LDB4MDUwN30sIHsweDAwMWYsMHgwMDFmLDB4MDMyYiwweDAzMmJ9LCB7MHgwMTBjLDB4MDExMCwweDAxMTQsMHgwMTE4fSwgezB4MDQ5ZiwweDA0OWYsMHgwNThmLDB4MDU4Zn0sCi0gIHsweDA1MTcsMHgwNTE3LDB4MDBhYiwweDAwYWJ9LCB7MHgwNTkzLDB4MDU5MywweDAxMmYsMHgwMTJmfSwgezB4MDEzNywweDAxMzcsMHgwNTFiLDB4MDUxYn0sIHsweDAxMjAsMHgwMTM0LDB4MDE0OCwweDAxNWN9LAotICB7MHgwMTI0LDB4MDEyOCwweDAxMmMsMHgwMTMwfSwgezB4MDFiNywweDAxYjcsMHgwNThiLDB4MDU4Yn0sIHsweDAwNDMsMHgwMDQzLDB4MDU5NywweDA1OTd9LCB7MHgwMmFmLDB4MDJhZiwweDAyMmQsMHgwNDI1fSwKLSAgezB4MDUxZCwweDA0YTEsMHgwODAxLDB4MDY5MX0sIHsweDAxMzgsMHgwMTNjLDB4MDE0MCwweDAxNDR9LCB7MHgwMzgxLDB4MDY4ZCwweDAzMmQsMHgwMGI1fSwgezB4MDIzNSwweDAxYjEsMHgwNjg5LDB4MDJiNX0sCi0gIHsweDA1MjEsMHgwNTk5LDB4MDQyOSwweDAzYTl9LCB7MHgwMTM5LDB4MDIzMSwweDA1ODUsMHgwNjExfSwgezB4MDE0YywweDAxNTAsMHgwMTU0LDB4MDE1OH0sIHsweDAwYWQsMHgwNjBkLDB4MDY4NSwweDAxMzF9LAotICB7MHgwNTlkLDB4MDcwZCwweDA2MTUsMHgwNjk1fSwgezB4MDIzOSwweDA3MTEsMHgwM2FkLDB4MDFiOX0sIHsweDAyYjEsMHgwMzM1LDB4MDMzMSwweDAwMjF9LCB7MHgwMTYwLDB4MDE2NCwweDAxNjgsMHgwMTZjfSwKLSAgezB4MDQyZCwweDA2MDksMHgwNGE1LDB4MDJiOX0sIHsweDA2OTksMHgwNTI5LDB4MDEzZCwweDA1YTF9LCB7MHgwNTI1LDB4MDMzOSwweDA0YTksMHgwNzE1fSwgezB4MDRhZCwweDAwYjksMHgwNzA5LDB4MDYxOX0sCi0gIHsweDAxNzQsMHgwMTg4LDB4MDE5YywweDAxY2N9LCB7MHgwMTc4LDB4MDE3YywweDAxODAsMHgwMTg0fSwgezB4MDYwNSwweDA0MzUsMHgwNDAxLDB4MDNiNX0sIHsweDA2MWQsMHgwM2IxLDB4MDY5ZCwweDAxYmR9LAotICB7MHgwMGIxLDB4MDcxOSwweDA3ODksMHgwMmJkfSwgezB4MDIzZCwweDA3MDUsMHgwNWE1LDB4MDc5MX0sIHsweDAxOGMsMHgwMTkwLDB4MDE5NCwweDAxOTh9LCB7MHgwM2I5LDB4MDZhMSwweDA0YjUsMHgwNjIxfSwKLSAgezB4MDc5NSwweDA3OGQsMHgwNWE5LDB4MDUyZH0sIHsweDA0MzEsMHgwMzNkLDB4MDNiZCwweDA3MjF9LCB7MHgwMGJkLDB4MDcxZCwweDAwMjUsMHgwNDgxfSwgezB4MDFhMCwweDAxYTQsMHgwMWE4LDB4MDFiOH0sCi0gIHsweDA2YTUsMHgwNjI1LDB4MDRiMSwweDA0Mzl9LCB7MHgwNmE5LDB4MDRiOSwweDA1MzEsMHgwNzk5fSwgezB4MDc5ZCwweDAxYWMsMHgwMWIwLDB4MDFiNH0sIHsweDA3MjcsMHgwNzI3LDB4MDQzZiwweDA0M2Z9LAotICB7MHgwNWFmLDB4MDVhZiwweDA3MmYsMHgwNzJmfSwgezB4MDc4NywweDA3ODcsMHgwNjJiLDB4MDYyYn0sIHsweDAxYmMsMHgwMWMwLDB4MDFjNCwweDAxYzh9LCB7MHgwNzJiLDB4MDcyYiwweDA1YjcsMHgwNWI3fSwKLSAgezB4MDUzNywweDA1MzcsMHgwNmFmLDB4MDZhZn0sIHsweDA2MmYsMHgwNjJmLDB4MDdhMywweDA3YTN9LCB7MHgwNWJiLDB4MDViYiwweDA2MzcsMHgwNjM3fSwgezB4MDFkMCwweDAxZTQsMHgwMWY4LDB4MDIwY30sCi0gIHsweDAxZDQsMHgwMWQ4LDB4MDFkYywweDAxZTB9LCB7MHgwNmIzLDB4MDZiMywweDA0YmYsMHgwNGJmfSwgezB4MDUzYiwweDA1M2IsMHgwMDJiLDB4MDAyYn0sIHsweDA1YjMsMHgwNWIzLDB4MDdhNywweDA3YTd9LAotICB7MHgwNTAzLDB4MDUwMywweDA2MzMsMHgwNjMzfSwgezB4MDFlOCwweDAxZWMsMHgwMWYwLDB4MDFmNH0sIHsweDAwMmYsMHgwMDJmLDB4MDczMywweDA3MzN9LCB7MHgwN2FiLDB4MDdhYiwweDA2YjcsMHgwNmI3fSwKLSAgezB4MDY4MywweDA2ODMsMHgwNjNiLDB4MDYzYn0sIHsweDA1M2YsMHgwNTNmLDB4MDViZiwweDA1YmZ9LCB7MHgwMWZjLDB4MDIwMCwweDAyMDQsMHgwMjA4fSwgezB4MDdhZiwweDA3YWYsMHgwNmJiLDB4MDZiYn0sCi0gIHsweDAwMzcsMHgwMDM3LDB4MDU4MywweDA1ODN9LCB7MHgwNzM3LDB4MDczNywweDA2M2YsMHgwNjNmfSwgezB4MDZiZiwweDA2YmYsMHgwN2IzLDB4MDdiM30sIHsweDAyMTAsMHgwMjE0LDB4MDIxOCwweDAyMWN9LAotICB7MHgwMDNiLDB4MDAzYiwweDA3M2IsMHgwNzNifSwgezB4MDdiNywweDA3YjcsMHgwMDMzLDB4MDAzM30sIHsweDA3YmIsMHgwN2JiLDB4MDcwMSwweDA2MDF9LCB7MHgwNzNkLDB4MDAzZCwweDA3ODEsMHgwN2JkfSwKLSAgezB4MDExOCwweDAxMTcsMHgwMTAwLDB4MDEwOX0sIHsweDA1YTUsMHgwNWExLDB4MDViNywweDA1MTN9LCB7MHgwOGY5LDB4MDhmZiwweDA4MjEsMHgwOGZmfSwgezB4MDg0ZiwweDA4ZmYsMHgwOGJjLDB4MDhmZn0sCi0gIHsweDA4MTUsMHgwOGZmLDB4MDgzNywweDA4ZmZ9LCB7MHgwODBkLDB4MDhmZiwweDA4NWYsMHgwOGZmfSwgezB4MDg0YSwweDA4ZmYsMHgwODdkLDB4MDhmZn0sIHsweDA4ZmYsMHgwOGZmLDB4MDhhOCwweDA4ZmZ9LAotICB7MHgwODE1LDB4MDhmZiwweDA4M2YsMHgwOGZmfSwgezB4MDgzMCwweDA4ZmYsMHgwODk0LDB4MDhmZn0sIHsweDA4ZDQsMHgwOGZmLDB4MDgyNSwweDA4ZmZ9LCB7MHgwOGVmLDB4MDhmZiwweDA4M2YsMHgwOGZmfSwKLSAgezB4MDgwOSwweDA4ZmYsMHgwOGZjLDB4MDhmZn0sIHsweDA4NDIsMHgwOGZmLDB4MDhiMywweDA4ZmZ9LCB7MHgwNzBkLDB4MDdhOSwweDA2MGUsMHgwNmUyfSwgezB4MDZjNywweDA2ZDAsMHgwNGIyLDB4MDQwN30KLX07Citjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzExWzE1Ml1bNF0gPSB7CisgICAgezB4MDAwNCwgMHgwMDEwLCAweDAwMzgsIDB4MDA4Y30sIHsweDAwMDEsIDB4MDA4NSwgMHgwMDA4LCAweDAwMGN9LAorICAgIHsweDA4NDMsIDB4MDg0MywgMHgwMDA3LCAweDAwMDd9LCB7MHgwMDgzLCAweDAwODMsIDB4MDA4YiwgMHgwMDhifSwKKyAgICB7MHgwMDE0LCAweDAwMTgsIDB4MDAxYywgMHgwMDI0fSwgezB4MDEwNywgMHgwMTA3LCAweDAxMGIsIDB4MDEwYn0sCisgICAgezB4MDE4NSwgMHgwMDhkLCAweDAxMGQsIDB4MDAwOX0sIHsweDAxODksIDB4MDEwMSwgMHgwMThkLCAweDAwMjB9LAorICAgIHsweDAwOTMsIDB4MDA5MywgMHgwMjA3LCAweDAyMDd9LCB7MHgwMDI4LCAweDAwMmMsIDB4MDAzMCwgMHgwMDM0fSwKKyAgICB7MHgwMTEzLCAweDAxMTMsIDB4MDIwYiwgMHgwMjBifSwgezB4MDE5MywgMHgwMTkzLCAweDAyMGYsIDB4MDIwZn0sCisgICAgezB4MDAwZiwgMHgwMDBmLCAweDAxODMsIDB4MDE4M30sIHsweDAwOTcsIDB4MDA5NywgMHgwMTE3LCAweDAxMTd9LAorICAgIHsweDAwM2MsIDB4MDA1MCwgMHgwMDY0LCAweDAwNzh9LCB7MHgwMDQwLCAweDAwNDQsIDB4MDA0OCwgMHgwMDRjfSwKKyAgICB7MHgwMjhiLCAweDAyOGIsIDB4MDIxMywgMHgwMjEzfSwgezB4MDI4NywgMHgwMjg3LCAweDAxOTcsIDB4MDE5N30sCisgICAgezB4MDI4ZiwgMHgwMjhmLCAweDAyMTcsIDB4MDIxN30sIHsweDAyOTEsIDB4MDExOSwgMHgwMzA5LCAweDAwOTl9LAorICAgIHsweDAwNTQsIDB4MDA1OCwgMHgwMDVjLCAweDAwNjB9LCB7MHgwMTk5LCAweDAzMGQsIDB4MDMwNSwgMHgwODExfSwKKyAgICB7MHgwODBkLCAweDAyYzEsIDB4MDFjMSwgMHgwMjQxfSwgezB4MDIxOSwgMHgwMzQxLCAweDAwMTEsIDB4MDMxMX0sCisgICAgezB4MDIwMSwgMHgwODA5LCAweDAyOTUsIDB4MDgxNX0sIHsweDAwNjgsIDB4MDA2YywgMHgwMDcwLCAweDAwNzR9LAorICAgIHsweDAzYzEsIDB4MDE0MSwgMHgwNDQxLCAweDAzODl9LCB7MHgwMTFkLCAweDAzOGQsIDB4MDI5OSwgMHgwMzE1fSwKKyAgICB7MHgwODE5LCAweDA1NDEsIDB4MDE5ZCwgMHgwMDlkfSwgezB4MDRjMSwgMHgwODFkLCAweDA4MDUsIDB4MDM4NX0sCisgICAgezB4MDA3YywgMHgwMDgwLCAweDAwODQsIDB4MDA4OH0sIHsweDAzOTEsIDB4MDVjMSwgMHgwMjFkLCAweDA2NDF9LAorICAgIHsweDA4MjEsIDB4MDBjMSwgMHgwMzE5LCAweDA4MjV9LCB7MHgwNDA5LCAweDAzOTUsIDB4MDgyOSwgMHgwNmMxfSwKKyAgICB7MHgwMWExLCAweDAxMjEsIDB4MDQwZCwgMHgwMDE1fSwgezB4MDA5MCwgMHgwMGM4LCAweDAxMWMsIDB4MDE3MH0sCisgICAgezB4MDA5NCwgMHgwMDk4LCAweDAwYTAsIDB4MDBiNH0sIHsweDA3NDEsIDB4MDgyZCwgMHgwMjlkLCAweDA0MTF9LAorICAgIHsweDAzOTksIDB4MDMxZCwgMHgwMjgxLCAweDAwOWN9LCB7MHgwMjIzLCAweDAyMjMsIDB4MDdjMywgMHgwN2MzfSwKKyAgICB7MHgwMGE0LCAweDAwYTgsIDB4MDBhYywgMHgwMGIwfSwgezB4MDgzMywgMHgwODMzLCAweDA0MDcsIDB4MDQwN30sCisgICAgezB4MDBhMywgMHgwMGEzLCAweDA4M2IsIDB4MDgzYn0sIHsweDA0MTcsIDB4MDQxNywgMHgwODM3LCAweDA4Mzd9LAorICAgIHsweDA0OGYsIDB4MDQ4ZiwgMHgwMmEzLCAweDAyYTN9LCB7MHgwMGI4LCAweDAwYmMsIDB4MDBjMCwgMHgwMGM0fSwKKyAgICB7MHgwMzlmLCAweDAzOWYsIDB4MDQ4YiwgMHgwNDhifSwgezB4MDMyMywgMHgwMzIzLCAweDAxMjcsIDB4MDEyN30sCisgICAgezB4MDFhNywgMHgwMWE3LCAweDA4M2YsIDB4MDgzZn0sIHsweDA0OTMsIDB4MDQ5MywgMHgwNDFiLCAweDA0MWJ9LAorICAgIHsweDAwY2MsIDB4MDBlMCwgMHgwMGY0LCAweDAxMDh9LCB7MHgwMGQwLCAweDAwZDQsIDB4MDBkOCwgMHgwMGRjfSwKKyAgICB7MHgwMDFiLCAweDAwMWIsIDB4MDIyNywgMHgwMjI3fSwgezB4MDQ5NywgMHgwNDk3LCAweDAzYTMsIDB4MDNhM30sCisgICAgezB4MDQxZiwgMHgwNDFmLCAweDA0ODcsIDB4MDQ4N30sIHsweDAxYWIsIDB4MDFhYiwgMHgwMzAzLCAweDAzMDN9LAorICAgIHsweDAwZTQsIDB4MDBlOCwgMHgwMGVjLCAweDAwZjB9LCB7MHgwMTJiLCAweDAxMmIsIDB4MDBhNywgMHgwMGE3fSwKKyAgICB7MHgwMmE3LCAweDAyYTcsIDB4MDUxMywgMHgwNTEzfSwgezB4MDUwYiwgMHgwNTBiLCAweDAzMjcsIDB4MDMyN30sCisgICAgezB4MDUwZiwgMHgwNTBmLCAweDA0OWIsIDB4MDQ5Yn0sIHsweDAwZjgsIDB4MDBmYywgMHgwMTAwLCAweDAxMDR9LAorICAgIHsweDAyMmIsIDB4MDIyYiwgMHgwNDIzLCAweDA0MjN9LCB7MHgwMmFiLCAweDAyYWIsIDB4MDNhNywgMHgwM2E3fSwKKyAgICB7MHgwMWFmLCAweDAxYWYsIDB4MDUwNywgMHgwNTA3fSwgezB4MDAxZiwgMHgwMDFmLCAweDAzMmIsIDB4MDMyYn0sCisgICAgezB4MDEwYywgMHgwMTEwLCAweDAxMTQsIDB4MDExOH0sIHsweDA0OWYsIDB4MDQ5ZiwgMHgwNThmLCAweDA1OGZ9LAorICAgIHsweDA1MTcsIDB4MDUxNywgMHgwMGFiLCAweDAwYWJ9LCB7MHgwNTkzLCAweDA1OTMsIDB4MDEyZiwgMHgwMTJmfSwKKyAgICB7MHgwMTM3LCAweDAxMzcsIDB4MDUxYiwgMHgwNTFifSwgezB4MDEyMCwgMHgwMTM0LCAweDAxNDgsIDB4MDE1Y30sCisgICAgezB4MDEyNCwgMHgwMTI4LCAweDAxMmMsIDB4MDEzMH0sIHsweDAxYjcsIDB4MDFiNywgMHgwNThiLCAweDA1OGJ9LAorICAgIHsweDAwNDMsIDB4MDA0MywgMHgwNTk3LCAweDA1OTd9LCB7MHgwMmFmLCAweDAyYWYsIDB4MDIyZCwgMHgwNDI1fSwKKyAgICB7MHgwNTFkLCAweDA0YTEsIDB4MDgwMSwgMHgwNjkxfSwgezB4MDEzOCwgMHgwMTNjLCAweDAxNDAsIDB4MDE0NH0sCisgICAgezB4MDM4MSwgMHgwNjhkLCAweDAzMmQsIDB4MDBiNX0sIHsweDAyMzUsIDB4MDFiMSwgMHgwNjg5LCAweDAyYjV9LAorICAgIHsweDA1MjEsIDB4MDU5OSwgMHgwNDI5LCAweDAzYTl9LCB7MHgwMTM5LCAweDAyMzEsIDB4MDU4NSwgMHgwNjExfSwKKyAgICB7MHgwMTRjLCAweDAxNTAsIDB4MDE1NCwgMHgwMTU4fSwgezB4MDBhZCwgMHgwNjBkLCAweDA2ODUsIDB4MDEzMX0sCisgICAgezB4MDU5ZCwgMHgwNzBkLCAweDA2MTUsIDB4MDY5NX0sIHsweDAyMzksIDB4MDcxMSwgMHgwM2FkLCAweDAxYjl9LAorICAgIHsweDAyYjEsIDB4MDMzNSwgMHgwMzMxLCAweDAwMjF9LCB7MHgwMTYwLCAweDAxNjQsIDB4MDE2OCwgMHgwMTZjfSwKKyAgICB7MHgwNDJkLCAweDA2MDksIDB4MDRhNSwgMHgwMmI5fSwgezB4MDY5OSwgMHgwNTI5LCAweDAxM2QsIDB4MDVhMX0sCisgICAgezB4MDUyNSwgMHgwMzM5LCAweDA0YTksIDB4MDcxNX0sIHsweDA0YWQsIDB4MDBiOSwgMHgwNzA5LCAweDA2MTl9LAorICAgIHsweDAxNzQsIDB4MDE4OCwgMHgwMTljLCAweDAxY2N9LCB7MHgwMTc4LCAweDAxN2MsIDB4MDE4MCwgMHgwMTg0fSwKKyAgICB7MHgwNjA1LCAweDA0MzUsIDB4MDQwMSwgMHgwM2I1fSwgezB4MDYxZCwgMHgwM2IxLCAweDA2OWQsIDB4MDFiZH0sCisgICAgezB4MDBiMSwgMHgwNzE5LCAweDA3ODksIDB4MDJiZH0sIHsweDAyM2QsIDB4MDcwNSwgMHgwNWE1LCAweDA3OTF9LAorICAgIHsweDAxOGMsIDB4MDE5MCwgMHgwMTk0LCAweDAxOTh9LCB7MHgwM2I5LCAweDA2YTEsIDB4MDRiNSwgMHgwNjIxfSwKKyAgICB7MHgwNzk1LCAweDA3OGQsIDB4MDVhOSwgMHgwNTJkfSwgezB4MDQzMSwgMHgwMzNkLCAweDAzYmQsIDB4MDcyMX0sCisgICAgezB4MDBiZCwgMHgwNzFkLCAweDAwMjUsIDB4MDQ4MX0sIHsweDAxYTAsIDB4MDFhNCwgMHgwMWE4LCAweDAxYjh9LAorICAgIHsweDA2YTUsIDB4MDYyNSwgMHgwNGIxLCAweDA0Mzl9LCB7MHgwNmE5LCAweDA0YjksIDB4MDUzMSwgMHgwNzk5fSwKKyAgICB7MHgwNzlkLCAweDAxYWMsIDB4MDFiMCwgMHgwMWI0fSwgezB4MDcyNywgMHgwNzI3LCAweDA0M2YsIDB4MDQzZn0sCisgICAgezB4MDVhZiwgMHgwNWFmLCAweDA3MmYsIDB4MDcyZn0sIHsweDA3ODcsIDB4MDc4NywgMHgwNjJiLCAweDA2MmJ9LAorICAgIHsweDAxYmMsIDB4MDFjMCwgMHgwMWM0LCAweDAxYzh9LCB7MHgwNzJiLCAweDA3MmIsIDB4MDViNywgMHgwNWI3fSwKKyAgICB7MHgwNTM3LCAweDA1MzcsIDB4MDZhZiwgMHgwNmFmfSwgezB4MDYyZiwgMHgwNjJmLCAweDA3YTMsIDB4MDdhM30sCisgICAgezB4MDViYiwgMHgwNWJiLCAweDA2MzcsIDB4MDYzN30sIHsweDAxZDAsIDB4MDFlNCwgMHgwMWY4LCAweDAyMGN9LAorICAgIHsweDAxZDQsIDB4MDFkOCwgMHgwMWRjLCAweDAxZTB9LCB7MHgwNmIzLCAweDA2YjMsIDB4MDRiZiwgMHgwNGJmfSwKKyAgICB7MHgwNTNiLCAweDA1M2IsIDB4MDAyYiwgMHgwMDJifSwgezB4MDViMywgMHgwNWIzLCAweDA3YTcsIDB4MDdhN30sCisgICAgezB4MDUwMywgMHgwNTAzLCAweDA2MzMsIDB4MDYzM30sIHsweDAxZTgsIDB4MDFlYywgMHgwMWYwLCAweDAxZjR9LAorICAgIHsweDAwMmYsIDB4MDAyZiwgMHgwNzMzLCAweDA3MzN9LCB7MHgwN2FiLCAweDA3YWIsIDB4MDZiNywgMHgwNmI3fSwKKyAgICB7MHgwNjgzLCAweDA2ODMsIDB4MDYzYiwgMHgwNjNifSwgezB4MDUzZiwgMHgwNTNmLCAweDA1YmYsIDB4MDViZn0sCisgICAgezB4MDFmYywgMHgwMjAwLCAweDAyMDQsIDB4MDIwOH0sIHsweDA3YWYsIDB4MDdhZiwgMHgwNmJiLCAweDA2YmJ9LAorICAgIHsweDAwMzcsIDB4MDAzNywgMHgwNTgzLCAweDA1ODN9LCB7MHgwNzM3LCAweDA3MzcsIDB4MDYzZiwgMHgwNjNmfSwKKyAgICB7MHgwNmJmLCAweDA2YmYsIDB4MDdiMywgMHgwN2IzfSwgezB4MDIxMCwgMHgwMjE0LCAweDAyMTgsIDB4MDIxY30sCisgICAgezB4MDAzYiwgMHgwMDNiLCAweDA3M2IsIDB4MDczYn0sIHsweDA3YjcsIDB4MDdiNywgMHgwMDMzLCAweDAwMzN9LAorICAgIHsweDA3YmIsIDB4MDdiYiwgMHgwNzAxLCAweDA2MDF9LCB7MHgwNzNkLCAweDAwM2QsIDB4MDc4MSwgMHgwN2JkfSwKKyAgICB7MHgwMTE4LCAweDAxMTcsIDB4MDEwMCwgMHgwMTA5fSwgezB4MDVhNSwgMHgwNWExLCAweDA1YjcsIDB4MDUxM30sCisgICAgezB4MDhmOSwgMHgwOGZmLCAweDA4MjEsIDB4MDhmZn0sIHsweDA4NGYsIDB4MDhmZiwgMHgwOGJjLCAweDA4ZmZ9LAorICAgIHsweDA4MTUsIDB4MDhmZiwgMHgwODM3LCAweDA4ZmZ9LCB7MHgwODBkLCAweDA4ZmYsIDB4MDg1ZiwgMHgwOGZmfSwKKyAgICB7MHgwODRhLCAweDA4ZmYsIDB4MDg3ZCwgMHgwOGZmfSwgezB4MDhmZiwgMHgwOGZmLCAweDA4YTgsIDB4MDhmZn0sCisgICAgezB4MDgxNSwgMHgwOGZmLCAweDA4M2YsIDB4MDhmZn0sIHsweDA4MzAsIDB4MDhmZiwgMHgwODk0LCAweDA4ZmZ9LAorICAgIHsweDA4ZDQsIDB4MDhmZiwgMHgwODI1LCAweDA4ZmZ9LCB7MHgwOGVmLCAweDA4ZmYsIDB4MDgzZiwgMHgwOGZmfSwKKyAgICB7MHgwODA5LCAweDA4ZmYsIDB4MDhmYywgMHgwOGZmfSwgezB4MDg0MiwgMHgwOGZmLCAweDA4YjMsIDB4MDhmZn0sCisgICAgezB4MDcwZCwgMHgwN2E5LCAweDA2MGUsIDB4MDZlMn0sIHsweDA2YzcsIDB4MDZkMCwgMHgwNGIyLCAweDA0MDd9fTsKIAotCi1jb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rX1NDTFs2NV1bNF0gPQotewotICB7MHgwMGYzLDB4MDBmMywweDAwMDQsMHgwMDA4fSwgezB4MDBlZiwweDAwZWYsMHgwMGY1LDB4MDBlOX0sIHsweDAwZjksMHgwMDBjLDB4MDAxMCwweDAwMTR9LCB7MHgwMGU3LDB4MDBlNywweDAwZmYsMHgwMGZmfSwKLSAgezB4MDBlMSwweDAxMDEsMHgwMGRkLDB4MDEwNX0sIHsweDAwMTgsMHgwMDFjLDB4MDAyMCwweDAwMjh9LCB7MHgwMTBiLDB4MDEwYiwweDAwZGIsMHgwMGRifSwgezB4MDEwZiwweDAxMGYsMHgwMGQ1LDB4MDExMX0sCi0gIHsweDAwZDEsMHgwMTE1LDB4MDBjZCwweDAwMjR9LCB7MHgwMTFiLDB4MDExYiwweDAwY2IsMHgwMGNifSwgezB4MDAyYywweDAwMzAsMHgwMDM0LDB4MDA0MH0sIHsweDAwYzcsMHgwMGM3LDB4MDExZiwweDAxMWZ9LAotICB7MHgwMTIxLDB4MDBjMSwweDAxMjUsMHgwMGJkfSwgezB4MDEyOSwweDAwYjksMHgwMDM4LDB4MDAzY30sIHsweDAxMzMsMHgwMTMzLDB4MDEyZiwweDAxMmZ9LCB7MHgwMTM3LDB4MDEzNywweDAxM2IsMHgwMTNifSwKLSAgezB4MDA0NCwweDAwNDgsMHgwMDRjLDB4MDA1OH0sIHsweDAwYjcsMHgwMGI3LDB4MDBhZiwweDAwYWZ9LCB7MHgwMGIxLDB4MDEzZCwweDAwYTksMHgwMGE1fSwgezB4MDE0MSwweDAwYTEsMHgwMDUwLDB4MDA1NH0sCi0gIHsweDAxNDcsMHgwMTQ3LDB4MDA5ZiwweDAwOWZ9LCB7MHgwMTRiLDB4MDE0YiwweDAwOWIsMHgwMDlifSwgezB4MDA1YywweDAwNjAsMHgwMDY0LDB4MDA3MH0sIHsweDAxNGYsMHgwMTRmLDB4MDA5NSwweDAwOGR9LAotICB7MHgwMTU1LDB4MDA4NSwweDAwOTEsMHgwMDg5fSwgezB4MDE1MSwweDAwODEsMHgwMDY4LDB4MDA2Y30sIHsweDAxNWYsMHgwMTVmLDB4MDE2NywweDAxNjd9LCB7MHgwMDdiLDB4MDA3YiwweDAwN2YsMHgwMDdmfSwKLSAgezB4MDA3NCwweDAwNzgsMHgwMDgwLDB4MDBiMH0sIHsweDAxNTksMHgwMDc1LDB4MDA2OSwweDAwNmR9LCB7MHgwMDcxLDB4MDA2MSwweDAxNjEsMHgwMDdjfSwgezB4MDA2NywweDAwNjcsMHgwMDViLDB4MDA1Yn0sCi0gIHsweDAwODQsMHgwMDg4LDB4MDA4YywweDAwOWN9LCB7MHgwMDVmLDB4MDA1ZiwweDAxNjksMHgwMDU1fSwgezB4MDA0ZCwweDAwMGQsMHgwMDA1LDB4MDAwOX0sIHsweDAwMDEsMHgwMDkwLDB4MDA5NCwweDAwOTh9LAotICB7MHgwMThiLDB4MDE4YiwweDAxOGYsMHgwMThmfSwgezB4MDE5MywweDAxOTMsMHgwMTk3LDB4MDE5N30sIHsweDAxOWIsMHgwMTliLDB4MDFkNywweDAxZDd9LCB7MHgwMGEwLDB4MDBhNCwweDAwYTgsMHgwMGFjfSwKLSAgezB4MDE4NywweDAxODcsMHgwMTZmLDB4MDE2Zn0sIHsweDAxNzMsMHgwMTczLDB4MDE3NywweDAxNzd9LCB7MHgwMTdiLDB4MDE3YiwweDAxN2YsMHgwMTdmfSwgezB4MDE4MywweDAxODMsMHgwMWEzLDB4MDFhM30sCi0gIHsweDAwYjQsMHgwMGM4LDB4MDBkYywweDAwZjB9LCB7MHgwMGI4LDB4MDBiYywweDAwYzAsMHgwMGM0fSwgezB4MDFiZiwweDAxYmYsMHgwMWMzLDB4MDFjM30sIHsweDAxYzcsMHgwMWM3LDB4MDFjYiwweDAxY2J9LAotICB7MHgwMWNmLDB4MDFjZiwweDAxZDMsMHgwMWQzfSwgezB4MDFiYiwweDAxYmIsMHgwMWE3LDB4MDFhN30sIHsweDAwY2MsMHgwMGQwLDB4MDBkNCwweDAwZDh9LCB7MHgwMWFiLDB4MDFhYiwweDAxYWYsMHgwMWFmfSwKLSAgezB4MDFiMywweDAxYjMsMHgwMWI3LDB4MDFiN30sIHsweDAxZGIsMHgwMWRiLDB4MDAxYiwweDAwMWJ9LCB7MHgwMDIzLDB4MDAyMywweDAwMjcsMHgwMDI3fSwgezB4MDBlMCwweDAwZTQsMHgwMGU4LDB4MDBlY30sCi0gIHsweDAwMmIsMHgwMDJiLDB4MDAxNywweDAwMTd9LCB7MHgwMTlmLDB4MDE5ZiwweDAxZTMsMHgwMWUzfSwgezB4MDFkZiwweDAxZGYsMHgwMDEzLDB4MDAxM30sIHsweDAwMWYsMHgwMDFmLDB4MDAzZiwweDAwM2Z9LAotICB7MHgwMGY0LDB4MDBmOCwweDAwZmMsMHgwMTAwfSwgezB4MDA0MywweDAwNDMsMHgwMDRiLDB4MDA0Yn0sIHsweDAwNTMsMHgwMDUzLDB4MDA0NywweDAwNDd9LCB7MHgwMDJmLDB4MDAyZiwweDAwMzMsMHgwMDMzfSwKLSAgezB4MDAzYiwweDAwM2IsMHgwMDM3LDB4MDAzN30KLX07Ci0KLQorY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va19TQ0xbNjVdWzRdID0geworICAgIHsweDAwZjMsIDB4MDBmMywgMHgwMDA0LCAweDAwMDh9LCB7MHgwMGVmLCAweDAwZWYsIDB4MDBmNSwgMHgwMGU5fSwKKyAgICB7MHgwMGY5LCAweDAwMGMsIDB4MDAxMCwgMHgwMDE0fSwgezB4MDBlNywgMHgwMGU3LCAweDAwZmYsIDB4MDBmZn0sCisgICAgezB4MDBlMSwgMHgwMTAxLCAweDAwZGQsIDB4MDEwNX0sIHsweDAwMTgsIDB4MDAxYywgMHgwMDIwLCAweDAwMjh9LAorICAgIHsweDAxMGIsIDB4MDEwYiwgMHgwMGRiLCAweDAwZGJ9LCB7MHgwMTBmLCAweDAxMGYsIDB4MDBkNSwgMHgwMTExfSwKKyAgICB7MHgwMGQxLCAweDAxMTUsIDB4MDBjZCwgMHgwMDI0fSwgezB4MDExYiwgMHgwMTFiLCAweDAwY2IsIDB4MDBjYn0sCisgICAgezB4MDAyYywgMHgwMDMwLCAweDAwMzQsIDB4MDA0MH0sIHsweDAwYzcsIDB4MDBjNywgMHgwMTFmLCAweDAxMWZ9LAorICAgIHsweDAxMjEsIDB4MDBjMSwgMHgwMTI1LCAweDAwYmR9LCB7MHgwMTI5LCAweDAwYjksIDB4MDAzOCwgMHgwMDNjfSwKKyAgICB7MHgwMTMzLCAweDAxMzMsIDB4MDEyZiwgMHgwMTJmfSwgezB4MDEzNywgMHgwMTM3LCAweDAxM2IsIDB4MDEzYn0sCisgICAgezB4MDA0NCwgMHgwMDQ4LCAweDAwNGMsIDB4MDA1OH0sIHsweDAwYjcsIDB4MDBiNywgMHgwMGFmLCAweDAwYWZ9LAorICAgIHsweDAwYjEsIDB4MDEzZCwgMHgwMGE5LCAweDAwYTV9LCB7MHgwMTQxLCAweDAwYTEsIDB4MDA1MCwgMHgwMDU0fSwKKyAgICB7MHgwMTQ3LCAweDAxNDcsIDB4MDA5ZiwgMHgwMDlmfSwgezB4MDE0YiwgMHgwMTRiLCAweDAwOWIsIDB4MDA5Yn0sCisgICAgezB4MDA1YywgMHgwMDYwLCAweDAwNjQsIDB4MDA3MH0sIHsweDAxNGYsIDB4MDE0ZiwgMHgwMDk1LCAweDAwOGR9LAorICAgIHsweDAxNTUsIDB4MDA4NSwgMHgwMDkxLCAweDAwODl9LCB7MHgwMTUxLCAweDAwODEsIDB4MDA2OCwgMHgwMDZjfSwKKyAgICB7MHgwMTVmLCAweDAxNWYsIDB4MDE2NywgMHgwMTY3fSwgezB4MDA3YiwgMHgwMDdiLCAweDAwN2YsIDB4MDA3Zn0sCisgICAgezB4MDA3NCwgMHgwMDc4LCAweDAwODAsIDB4MDBiMH0sIHsweDAxNTksIDB4MDA3NSwgMHgwMDY5LCAweDAwNmR9LAorICAgIHsweDAwNzEsIDB4MDA2MSwgMHgwMTYxLCAweDAwN2N9LCB7MHgwMDY3LCAweDAwNjcsIDB4MDA1YiwgMHgwMDVifSwKKyAgICB7MHgwMDg0LCAweDAwODgsIDB4MDA4YywgMHgwMDljfSwgezB4MDA1ZiwgMHgwMDVmLCAweDAxNjksIDB4MDA1NX0sCisgICAgezB4MDA0ZCwgMHgwMDBkLCAweDAwMDUsIDB4MDAwOX0sIHsweDAwMDEsIDB4MDA5MCwgMHgwMDk0LCAweDAwOTh9LAorICAgIHsweDAxOGIsIDB4MDE4YiwgMHgwMThmLCAweDAxOGZ9LCB7MHgwMTkzLCAweDAxOTMsIDB4MDE5NywgMHgwMTk3fSwKKyAgICB7MHgwMTliLCAweDAxOWIsIDB4MDFkNywgMHgwMWQ3fSwgezB4MDBhMCwgMHgwMGE0LCAweDAwYTgsIDB4MDBhY30sCisgICAgezB4MDE4NywgMHgwMTg3LCAweDAxNmYsIDB4MDE2Zn0sIHsweDAxNzMsIDB4MDE3MywgMHgwMTc3LCAweDAxNzd9LAorICAgIHsweDAxN2IsIDB4MDE3YiwgMHgwMTdmLCAweDAxN2Z9LCB7MHgwMTgzLCAweDAxODMsIDB4MDFhMywgMHgwMWEzfSwKKyAgICB7MHgwMGI0LCAweDAwYzgsIDB4MDBkYywgMHgwMGYwfSwgezB4MDBiOCwgMHgwMGJjLCAweDAwYzAsIDB4MDBjNH0sCisgICAgezB4MDFiZiwgMHgwMWJmLCAweDAxYzMsIDB4MDFjM30sIHsweDAxYzcsIDB4MDFjNywgMHgwMWNiLCAweDAxY2J9LAorICAgIHsweDAxY2YsIDB4MDFjZiwgMHgwMWQzLCAweDAxZDN9LCB7MHgwMWJiLCAweDAxYmIsIDB4MDFhNywgMHgwMWE3fSwKKyAgICB7MHgwMGNjLCAweDAwZDAsIDB4MDBkNCwgMHgwMGQ4fSwgezB4MDFhYiwgMHgwMWFiLCAweDAxYWYsIDB4MDFhZn0sCisgICAgezB4MDFiMywgMHgwMWIzLCAweDAxYjcsIDB4MDFiN30sIHsweDAxZGIsIDB4MDFkYiwgMHgwMDFiLCAweDAwMWJ9LAorICAgIHsweDAwMjMsIDB4MDAyMywgMHgwMDI3LCAweDAwMjd9LCB7MHgwMGUwLCAweDAwZTQsIDB4MDBlOCwgMHgwMGVjfSwKKyAgICB7MHgwMDJiLCAweDAwMmIsIDB4MDAxNywgMHgwMDE3fSwgezB4MDE5ZiwgMHgwMTlmLCAweDAxZTMsIDB4MDFlM30sCisgICAgezB4MDFkZiwgMHgwMWRmLCAweDAwMTMsIDB4MDAxM30sIHsweDAwMWYsIDB4MDAxZiwgMHgwMDNmLCAweDAwM2Z9LAorICAgIHsweDAwZjQsIDB4MDBmOCwgMHgwMGZjLCAweDAxMDB9LCB7MHgwMDQzLCAweDAwNDMsIDB4MDA0YiwgMHgwMDRifSwKKyAgICB7MHgwMDUzLCAweDAwNTMsIDB4MDA0NywgMHgwMDQ3fSwgezB4MDAyZiwgMHgwMDJmLCAweDAwMzMsIDB4MDAzM30sCisgICAgezB4MDAzYiwgMHgwMDNiLCAweDAwMzcsIDB4MDAzN319OwogCiAvKiAuQ29kZUJvb2sgPSBIdWZmbWFuQ29kZUJvb2tfeCwgLkRpbWVuc2lvbiA9IDQsIC5udW1CaXRzID0gMiwgLk9mZnNldCA9ICAwICAqLwogY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiBBQUNjb2RlQm9va0Rlc2NyaXB0aW9uVGFibGVbMTNdID0gewotICB7IE5VTEwsIDAsIDAsICAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzEsICA0LCAyLCAxIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzIsICA0LCAyLCAxIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzMsICA0LCAyLCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzQsICA0LCAyLCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzUsICAyLCA0LCA0IH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzYsICAyLCA0LCA0IH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzcsICAyLCA0LCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzgsICAyLCA0LCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzksICAyLCA0LCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzEwLCAyLCA0LCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzExLCAyLCA1LCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rX1NDTCwgMSwgOCwgNjAgfQotfTsKKyAgICB7TlVMTCwgMCwgMCwgMH0sCisgICAge0h1ZmZtYW5Db2RlQm9va18xLCA0LCAyLCAxfSwKKyAgICB7SHVmZm1hbkNvZGVCb29rXzIsIDQsIDIsIDF9LAorICAgIHtIdWZmbWFuQ29kZUJvb2tfMywgNCwgMiwgMH0sCisgICAge0h1ZmZtYW5Db2RlQm9va180LCA0LCAyLCAwfSwKKyAgICB7SHVmZm1hbkNvZGVCb29rXzUsIDIsIDQsIDR9LAorICAgIHtIdWZmbWFuQ29kZUJvb2tfNiwgMiwgNCwgNH0sCisgICAge0h1ZmZtYW5Db2RlQm9va183LCAyLCA0LCAwfSwKKyAgICB7SHVmZm1hbkNvZGVCb29rXzgsIDIsIDQsIDB9LAorICAgIHtIdWZmbWFuQ29kZUJvb2tfOSwgMiwgNCwgMH0sCisgICAge0h1ZmZtYW5Db2RlQm9va18xMCwgMiwgNCwgMH0sCisgICAge0h1ZmZtYW5Db2RlQm9va18xMSwgMiwgNSwgMH0sCisgICAge0h1ZmZtYW5Db2RlQm9va19TQ0wsIDEsIDgsIDYwfX07CiAKLWNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gQUFDY29kZUJvb2tEZXNjcmlwdGlvblNDTCA9IHsgSHVmZm1hbkNvZGVCb29rX1NDTCwgMSwgOCwgNjAgfTsKK2NvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gQUFDY29kZUJvb2tEZXNjcmlwdGlvblNDTCA9IHtIdWZmbWFuQ29kZUJvb2tfU0NMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDYwfTsKIAotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBIdWZmVHJlZTQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgMSkuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogNCkgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiAgVGFibGU6IEh1ZmZUcmVlNDEgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEKKyAqIChDb2RlYm9vayAxKS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKgorICogNCkgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAvKiBIdWZmVHJlZSAqLwotY29uc3QgVUlOVCBhSHVmZlRyZWU0MVs4MF0gPSB7MHg0YTAwMDEsMHgwMjYwMDIsMHgwMTMwMDMsMHgwMjEwMDQsMHgwMWMwMDUsMHgwMGIwMDYsMHgwMTAwMDcsMHgwMTkwMDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOTAwZSwweDAwYTAzYSwweDQwMDUyOCwweDAwYzAzNywweDAwZDAzYiwweDQ1NDQwNCwweDAwZjA0YywweDQ0ODQwOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE3MDExLDB4MDEyMDJlLDB4NDJjNDBjLDB4MDM0MDE0LDB4MDE1MDJjLDB4MDE2MDQ5LDB4NDEwNDcwLDB4MDE4MDRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTQ0MjQsMHgwMzIwMWEsMHgwMjAwMWIsMHg1MjA0MTgsMHgwMmYwMWQsMHgwMmEwMWUsMHgwMWYwNGQsMHg0MWM0NzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU0MDQyMCwweDAyMjAyNCwweDA0YTAyMywweDQyODUxMCwweDAyNTAyOSwweDQzMDUwOCwweDAyNzAzYywweDAyODA0NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTBjNDM0LDB4NDM4NDc4LDB4MDQ4MDJiLDB4NDY0NDNjLDB4MDJkMDNlLDB4NDQwNGIwLDB4NDQ0NTFjLDB4MDMwMDNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzEwNGIsMHg1MjQ0NGMsMHgwMzMwMzksMHg0ZjA0NTAsMHgwMzUwNDEsMHgwMzYwNDYsMHg0ZTg0NTgsMHgwNGYwMzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1YzUzYywweDQ2MDRlMCwweDRmODQ2OCwweDQ2YzRkNCwweDA0NTAzZCwweDRhYzQ3YywweDUxODQ4MCwweDA0MzA0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDg0NGRjLDB4MDQyMDQ0LDB4NDg4NGE4LDB4NGJjNDhjLDB4NTMwNDkwLDB4NGE0NDk0LDB4NDk4NGI4LDB4NDljNGM0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDQ0YjQsMHg1MDA0YzAsMHg0ZDA0YzgsMHg0ZjQ0Y2MsMHg0ZDg1MzgsMHg0ZWM0ZTQsMHg1MmM0ZmMsMHg1MTQ1MzR9OworY29uc3QgVUlOVCBhSHVmZlRyZWU0MVs4MF0gPSB7CisgICAgMHg0YTAwMDEsIDB4MDI2MDAyLCAweDAxMzAwMywgMHgwMjEwMDQsIDB4MDFjMDA1LCAweDAwYjAwNiwgMHgwMTAwMDcsCisgICAgMHgwMTkwMDgsIDB4MDA5MDBlLCAweDAwYTAzYSwgMHg0MDA1MjgsIDB4MDBjMDM3LCAweDAwZDAzYiwgMHg0NTQ0MDQsCisgICAgMHgwMGYwNGMsIDB4NDQ4NDA4LCAweDAxNzAxMSwgMHgwMTIwMmUsIDB4NDJjNDBjLCAweDAzNDAxNCwgMHgwMTUwMmMsCisgICAgMHgwMTYwNDksIDB4NDEwNDcwLCAweDAxODA0ZSwgMHg0MTQ0MjQsIDB4MDMyMDFhLCAweDAyMDAxYiwgMHg1MjA0MTgsCisgICAgMHgwMmYwMWQsIDB4MDJhMDFlLCAweDAxZjA0ZCwgMHg0MWM0NzQsIDB4NTQwNDIwLCAweDAyMjAyNCwgMHgwNGEwMjMsCisgICAgMHg0Mjg1MTAsIDB4MDI1MDI5LCAweDQzMDUwOCwgMHgwMjcwM2MsIDB4MDI4MDQ3LCAweDUwYzQzNCwgMHg0Mzg0NzgsCisgICAgMHgwNDgwMmIsIDB4NDY0NDNjLCAweDAyZDAzZSwgMHg0NDA0YjAsIDB4NDQ0NTFjLCAweDAzMDAzZiwgMHgwMzEwNGIsCisgICAgMHg1MjQ0NGMsIDB4MDMzMDM5LCAweDRmMDQ1MCwgMHgwMzUwNDEsIDB4MDM2MDQ2LCAweDRlODQ1OCwgMHgwNGYwMzgsCisgICAgMHg0NWM1M2MsIDB4NDYwNGUwLCAweDRmODQ2OCwgMHg0NmM0ZDQsIDB4MDQ1MDNkLCAweDRhYzQ3YywgMHg1MTg0ODAsCisgICAgMHgwNDMwNDAsIDB4NDg0NGRjLCAweDA0MjA0NCwgMHg0ODg0YTgsIDB4NGJjNDhjLCAweDUzMDQ5MCwgMHg0YTQ0OTQsCisgICAgMHg0OTg0YjgsIDB4NDljNGM0LCAweDUwNDRiNCwgMHg1MDA0YzAsIDB4NGQwNGM4LCAweDRmNDRjYywgMHg0ZDg1MzgsCisgICAgMHg0ZWM0ZTQsIDB4NTJjNGZjLCAweDUxNDUzNH07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBIdWZmVHJlZTQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgMikuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogNCkgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFVJTlQgYUh1ZmZUcmVlNDJbODBdID0gezB4MDI2MDAxLDB4MDE0MDAyLDB4MDA5MDAzLDB4MDEwMDA0LDB4MDFkMDA1LDB4MDA2MDBkLDB4MDA3MDE4LDB4NDUwMDA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZTA0MDAsMHgwMmUwMGEsMHgwMzkwMGIsMHgwM2QwMGMsMHg0M2M0MDQsMHgwMWIwMGUsMHgwMGYwNGYsMHg0ZDg0MDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMzAxMSwweDAxMjAzYiwweDAxYTAxMywweDQxNDQwYywweDAxNTAyMCwweDAxNjA0MCwweDAyNTAxNywweDUwMDQxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDM4MDE5LDB4NTQwNDE4LDB4NDFjNDQ0LDB4MDJkMDFjLDB4NDIwNTIwLDB4MDFlMDQyLDB4MDM3MDFmLDB4NDI0NGNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMmEwMjEsMHgwMjIwNGMsMHg0Nzg0MjgsMHgwMjQwMzEsMHg0MmM0ZGMsMHg0MzA0ZTgsMHgwMjcwMzMsMHg0YTAwMjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwYzAyOSwweDQzNDRhNCwweDAyYzAyYiwweDQ3MDQzOCwweDQ0MDRjOCwweDRmODQ0OCwweDA0OTAyZiwweDA0YjAzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDRjNDg0LDB4NTI0MDMyLDB4NGVjNDU0LDB4MDNlMDM0LDB4MDM1MDQ2LDB4NGM0MDM2LDB4NDg4NDU4LDB4NGQ0NDVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NjA0NjgsMHgwNGUwM2EsMHg1MWM0NjQsMHgwM2MwNGEsMHg0NmM1MTQsMHg0NzQ1M2MsMHgwNDUwM2YsMHg0N2M0YWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NDA0MSwweDUxMDQ4MCwweDA0MzA0ZCwweDRlNDQ4YywweDQ5MDUxOCwweDQ5NDQ5YywweDA0ODA0NywweDRjMDQ5OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGI4NGE4LDB4NGIwNTA4LDB4NGZjNGI0LDB4NGJjNTA0LDB4NTMwNGQwLDB4NTM0NGYwLDB4NGY0NTJjLDB4NTI4NTM4fTsKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiAgVGFibGU6IEh1ZmZUcmVlNDIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEKKyAqIChDb2RlYm9vayAyKS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKgorICogNCkgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTQyWzgwXSA9IHsKKyAgICAweDAyNjAwMSwgMHgwMTQwMDIsIDB4MDA5MDAzLCAweDAxMDAwNCwgMHgwMWQwMDUsIDB4MDA2MDBkLCAweDAwNzAxOCwKKyAgICAweDQ1MDAwOCwgMHg0ZTA0MDAsIDB4MDJlMDBhLCAweDAzOTAwYiwgMHgwM2QwMGMsIDB4NDNjNDA0LCAweDAxYjAwZSwKKyAgICAweDAwZjA0ZiwgMHg0ZDg0MDgsIDB4MDIzMDExLCAweDAxMjAzYiwgMHgwMWEwMTMsIDB4NDE0NDBjLCAweDAxNTAyMCwKKyAgICAweDAxNjA0MCwgMHgwMjUwMTcsIDB4NTAwNDEwLCAweDAzODAxOSwgMHg1NDA0MTgsIDB4NDFjNDQ0LCAweDAyZDAxYywKKyAgICAweDQyMDUyMCwgMHgwMWUwNDIsIDB4MDM3MDFmLCAweDQyNDRjYywgMHgwMmEwMjEsIDB4MDIyMDRjLCAweDQ3ODQyOCwKKyAgICAweDAyNDAzMSwgMHg0MmM0ZGMsIDB4NDMwNGU4LCAweDAyNzAzMywgMHg0YTAwMjgsIDB4NTBjMDI5LCAweDQzNDRhNCwKKyAgICAweDAyYzAyYiwgMHg0NzA0MzgsIDB4NDQwNGM4LCAweDRmODQ0OCwgMHgwNDkwMmYsIDB4MDRiMDMwLCAweDQ0YzQ4NCwKKyAgICAweDUyNDAzMiwgMHg0ZWM0NTQsIDB4MDNlMDM0LCAweDAzNTA0NiwgMHg0YzQwMzYsIDB4NDg4NDU4LCAweDRkNDQ1YywKKyAgICAweDQ2MDQ2OCwgMHgwNGUwM2EsIDB4NTFjNDY0LCAweDAzYzA0YSwgMHg0NmM1MTQsIDB4NDc0NTNjLCAweDA0NTAzZiwKKyAgICAweDQ3YzRhYywgMHgwNDQwNDEsIDB4NTEwNDgwLCAweDA0MzA0ZCwgMHg0ZTQ0OGMsIDB4NDkwNTE4LCAweDQ5NDQ5YywKKyAgICAweDA0ODA0NywgMHg0YzA0OTgsIDB4NGI4NGE4LCAweDRiMDUwOCwgMHg0ZmM0YjQsIDB4NGJjNTA0LCAweDUzMDRkMCwKKyAgICAweDUzNDRmMCwgMHg0ZjQ1MmMsIDB4NTI4NTM4fTsKIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgVGFibGU6IEh1ZmZUcmVlNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhIChDb2RlYm9vayAzKS4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKiA0KSAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotY29uc3QgVUlOVCBhSHVmZlRyZWU0M1s4MF0gPSB7MHg0MDAwMDEsMHgwMDIwMDQsMHgwMDMwMGEsMHg0NmM0MDQsMHgwMGIwMDUsMHgwMDYwMGQsMHgwMzQwMDcsMHgwMzcwMDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ5NDAwOSwweDRkODQwOCwweDQyNDQwYywweDAwYzAxYiwweDQ5MDQxMCwweDAwZTAxNiwweDAwZjAxMSwweDAxMDAxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDE0NGZjLDB4MDEyMDFkLDB4MDIwMDEzLDB4NTA4NDE4LDB4NGMwMDE1LDB4NDFjNDQwLDB4MDIyMDE3LDB4MDE4MDI2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTkwMzUsMHgwMzgwMWEsMHg0MjA0NDQsMHgwMWMwMWYsMHg0MzA0MjgsMHgwMjEwMWUsMHg0NDg0MmMsMHg0Nzg0MzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiNDQzOCwweDQ1NDQzYywweDAyYzAyMywweDAzOTAyNCwweDAyNTAzZiwweDQ4ODQ0YywweDAzMDAyNywweDAyZTAyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMyMDI5LDB4MDJhMDQxLDB4NGQ0MDJiLDB4NDUwNGYwLDB4MDQzMDJkLDB4NDU4NGE4LDB4MDJmMDNiLDB4NDYwNDVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzEwM2QsMHg0NjQwNDYsMHgwMzMwNDQsMHg0Njg1M2MsMHg0NzA0OWMsMHgwNDUwMzYsMHg0NzQ0ZGMsMHg0YTA0N2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDQ4MCwweDRhYzAzYSwweDRiODQ4NCwweDAzYzA0ZSwweDQ4YzUyNCwweDAzZTA0MCwweDQ5ODRlOCwweDUwYzRhNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGIwNTMwLDB4MDQyMDQ3LDB4NGJjMDRiLDB4NGU0NGM0LDB4NTE4NGM4LDB4NTJjNGNjLDB4NTIwNGQwLDB4MDRkMDQ4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGEwNDksMHg0ZTAwNGMsMHg1MWM0ZWMsMHg0ZjQ1MTAsMHg1Mjg0ZjgsMHg1MDQwNGYsMHg1MTQ1MzgsMHg1NDA1MzR9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogSHVmZlRyZWU0MyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YQorICogKENvZGVib29rIDMpLiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqCisgKiA0KSAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogNCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2NvbnN0IFVJTlQgYUh1ZmZUcmVlNDNbODBdID0geworICAgIDB4NDAwMDAxLCAweDAwMjAwNCwgMHgwMDMwMGEsIDB4NDZjNDA0LCAweDAwYjAwNSwgMHgwMDYwMGQsIDB4MDM0MDA3LAorICAgIDB4MDM3MDA4LCAweDQ5NDAwOSwgMHg0ZDg0MDgsIDB4NDI0NDBjLCAweDAwYzAxYiwgMHg0OTA0MTAsIDB4MDBlMDE2LAorICAgIDB4MDBmMDExLCAweDAxMDAxNCwgMHg0MTQ0ZmMsIDB4MDEyMDFkLCAweDAyMDAxMywgMHg1MDg0MTgsIDB4NGMwMDE1LAorICAgIDB4NDFjNDQwLCAweDAyMjAxNywgMHgwMTgwMjYsIDB4MDE5MDM1LCAweDAzODAxYSwgMHg0MjA0NDQsIDB4MDFjMDFmLAorICAgIDB4NDMwNDI4LCAweDAyMTAxZSwgMHg0NDg0MmMsIDB4NDc4NDM0LCAweDRiNDQzOCwgMHg0NTQ0M2MsIDB4MDJjMDIzLAorICAgIDB4MDM5MDI0LCAweDAyNTAzZiwgMHg0ODg0NGMsIDB4MDMwMDI3LCAweDAyZTAyOCwgMHgwMzIwMjksIDB4MDJhMDQxLAorICAgIDB4NGQ0MDJiLCAweDQ1MDRmMCwgMHgwNDMwMmQsIDB4NDU4NGE4LCAweDAyZjAzYiwgMHg0NjA0NWMsIDB4MDMxMDNkLAorICAgIDB4NDY0MDQ2LCAweDAzMzA0NCwgMHg0Njg1M2MsIDB4NDcwNDljLCAweDA0NTAzNiwgMHg0NzQ0ZGMsIDB4NGEwNDdjLAorICAgIDB4NTAwNDgwLCAweDRhYzAzYSwgMHg0Yjg0ODQsIDB4MDNjMDRlLCAweDQ4YzUyNCwgMHgwM2UwNDAsIDB4NDk4NGU4LAorICAgIDB4NTBjNGE0LCAweDRiMDUzMCwgMHgwNDIwNDcsIDB4NGJjMDRiLCAweDRlNDRjNCwgMHg1MTg0YzgsIDB4NTJjNGNjLAorICAgIDB4NTIwNGQwLCAweDA0ZDA0OCwgMHgwNGEwNDksIDB4NGUwMDRjLCAweDUxYzRlYywgMHg0ZjQ1MTAsIDB4NTI4NGY4LAorICAgIDB4NTA0MDRmLCAweDUxNDUzOCwgMHg1NDA1MzR9OwogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICBUYWJsZTogSHVmZlRyZWU0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDQpLiAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDQpICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBVSU5UIGFIdWZmVHJlZTQ0WzgwXSA9IHsweDAwMTAwNCwweDAyMDAwMiwweDAzNjAwMywweDQ5MDQwMCwweDAwNTAwOCwweDAxMDAwNiwweDAxZjAwNywweDQwNDQyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlMDA5LDB4MDExMDBhLDB4MDBiMDE4LDB4MDE2MDBjLDB4MDM3MDBkLDB4NDA4MDE1LDB4MDBmMDNlLDB4NDBjNDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTA0NzgsMHgwMjIwMTIsMHgwMzgwMTMsMHgwMWUwMTQsMHg0NTQ0MTQsMHg0NDg0MTgsMHgwMjUwMTcsMHg0NzQ0MWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMDAxOSwweDAyNjAxYSwweDAyZDAxYiwweDAxYzAzNCwweDAxZDAyOSwweDQyMDRmMCwweDRkYzQyYywweDQ3MDQzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMDNjLDB4NGEwNDM0LDB4MDIzMDJhLDB4NDQwMDI0LDB4NDM4NGE4LDB4NDNjNDRjLDB4MDI3MDNhLDB4MDI4MDJjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDQ1MjQsMHg0NTA0ZTAsMHgwMmIwM2QsMHg0NTg0ODAsMHg0NWM0ZjQsMHgwNGIwMmUsMHgwNGYwMmYsMHg0NjA1MjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MjAzMSwweDA0ODAzMiwweDA0OTAzMywweDUxNDQ2NCwweDAzNTA0YywweDU0MDQ2OCwweDQ3YzQ2YywweDQ4NDRkOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDM5MDQ0LDB4NDg4NGZjLDB4MDNiMDQ1LDB4NDhjNTNjLDB4NDk0NDljLDB4NGI4NDk4LDB4MDNmMDQ2LDB4MDQxMDQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YzQ0YTQsMHg1MGM0YWMsMHgwNGEwNDMsMHg1MTg0YjAsMHg0ZTQ0YjQsMHg0YmM0ZWMsMHgwNGUwNDcsMHg0YzA0ZTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRjODUxMCwweDRjYzUyYywweDRkMDUzMCwweDUwNDRkNCwweDUzODA0ZCwweDUyODRmOCwweDUwODUwMCwweDUxYzUzNH07CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogIFRhYmxlOiBIdWZmVHJlZTQ0ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhCisgKiAoQ29kZWJvb2sgNCkuICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICoKKyAqIDQpICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiA0ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworY29uc3QgVUlOVCBhSHVmZlRyZWU0NFs4MF0gPSB7CisgICAgMHgwMDEwMDQsIDB4MDIwMDAyLCAweDAzNjAwMywgMHg0OTA0MDAsIDB4MDA1MDA4LCAweDAxMDAwNiwgMHgwMWYwMDcsCisgICAgMHg0MDQ0MjgsIDB4MDBlMDA5LCAweDAxMTAwYSwgMHgwMGIwMTgsIDB4MDE2MDBjLCAweDAzNzAwZCwgMHg0MDgwMTUsCisgICAgMHgwMGYwM2UsIDB4NDBjNDI0LCAweDQxMDQ3OCwgMHgwMjIwMTIsIDB4MDM4MDEzLCAweDAxZTAxNCwgMHg0NTQ0MTQsCisgICAgMHg0NDg0MTgsIDB4MDI1MDE3LCAweDQ3NDQxYywgMHgwMzAwMTksIDB4MDI2MDFhLCAweDAyZDAxYiwgMHgwMWMwMzQsCisgICAgMHgwMWQwMjksIDB4NDIwNGYwLCAweDRkYzQyYywgMHg0NzA0MzAsIDB4MDIxMDNjLCAweDRhMDQzNCwgMHgwMjMwMmEsCisgICAgMHg0NDAwMjQsIDB4NDM4NGE4LCAweDQzYzQ0YywgMHgwMjcwM2EsIDB4MDI4MDJjLCAweDQ0NDUyNCwgMHg0NTA0ZTAsCisgICAgMHgwMmIwM2QsIDB4NDU4NDgwLCAweDQ1YzRmNCwgMHgwNGIwMmUsIDB4MDRmMDJmLCAweDQ2MDUyMCwgMHgwNDIwMzEsCisgICAgMHgwNDgwMzIsIDB4MDQ5MDMzLCAweDUxNDQ2NCwgMHgwMzUwNGMsIDB4NTQwNDY4LCAweDQ3YzQ2YywgMHg0ODQ0ZDgsCisgICAgMHgwMzkwNDQsIDB4NDg4NGZjLCAweDAzYjA0NSwgMHg0OGM1M2MsIDB4NDk0NDljLCAweDRiODQ5OCwgMHgwM2YwNDYsCisgICAgMHgwNDEwNDAsIDB4NGM0NGE0LCAweDUwYzRhYywgMHgwNGEwNDMsIDB4NTE4NGIwLCAweDRlNDRiNCwgMHg0YmM0ZWMsCisgICAgMHgwNGUwNDcsIDB4NGMwNGU4LCAweDRjODUxMCwgMHg0Y2M1MmMsIDB4NGQwNTMwLCAweDUwNDRkNCwgMHg1MzgwNGQsCisgICAgMHg1Mjg0ZjgsIDB4NTA4NTAwLCAweDUxYzUzNH07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBIdWZmVHJlZTIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgNSkuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogMikgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFVJTlQgYUh1ZmZUcmVlMjFbODBdID0gezB4NDUwMDAxLDB4MDQ0MDAyLDB4MDQyMDAzLDB4MDM1MDA0LDB4MDI2MDA1LDB4MDIyMDA2LDB4MDEzMDA3LDB4MDEwMDA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQwMDksMHgwMWMwMGEsMHgwMWYwMGIsMHgwMWUwMGMsMHg0YTA0MDAsMHgwMWIwMGUsMHgwMzIwMGYsMHg0N2U0MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAxMSwweDAxMjA0ZCwweDQwNDQ5YywweDAxNzAxNCwweDAxNTAxOSwweDAxNjAzZiwweDQwNjQ1OCwweDAxODA0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQ4NDA4LDB4MDQ5MDFhLDB4NDBhNDVhLDB4NDhjNDBjLDB4MDFkMDMxLDB4NDBlNDhlLDB4NDkwNDEwLDB4NDkyNDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEwMzAsMHg0ODA0MTQsMHgwMzMwMjMsMHgwMjQwMmUsMHgwMjUwM2UsMHg0MTY0ODIsMHgwMmEwMjcsMHgwMjgwMmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOTA0MCwweDQxODQ2OCwweDAyYjA0YSwweDQxYTQ4NiwweDAyZDA0OCwweDQxYzQ4NCwweDA0ZTAyZiwweDQxZTQyNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwNDM0LDB4NDIyNDllLDB4NDI0NDk0LDB4MDNkMDM0LDB4NDI4NDcwLDB4MDM5MDM2LDB4MDM3MDNiLDB4MDM4MDQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MmE0NzYsMHgwM2EwNGIsMHg0MmM0NTQsMHgwM2MwNDcsMHg0MmU0NzIsMHg0MzA0NzgsMHg0MzI0NmUsMHg0OTY0MzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4ODQzOCwweDQzYTQ2NiwweDA0NjA0MywweDQzYzQ2NCwweDA0NTA0YywweDQzZTQ2MiwweDQ2MDQ0MCwweDQ0MjQ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDVjNDQ0LDB4NDZhNDQ2LDB4NDRhNDU2LDB4NDc0NDRjLDB4NDUyNDRlLDB4NDZjNDdjLDB4NDhhNDdhLDB4NDlhNDk4fTsKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiAgVGFibGU6IEh1ZmZUcmVlMjEgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEKKyAqIChDb2RlYm9vayA1KS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKgorICogMikgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTIxWzgwXSA9IHsKKyAgICAweDQ1MDAwMSwgMHgwNDQwMDIsIDB4MDQyMDAzLCAweDAzNTAwNCwgMHgwMjYwMDUsIDB4MDIyMDA2LCAweDAxMzAwNywKKyAgICAweDAxMDAwOCwgMHgwMGQwMDksIDB4MDFjMDBhLCAweDAxZjAwYiwgMHgwMWUwMGMsIDB4NGEwNDAwLCAweDAxYjAwZSwKKyAgICAweDAzMjAwZiwgMHg0N2U0MDIsIDB4MDIwMDExLCAweDAxMjA0ZCwgMHg0MDQ0OWMsIDB4MDE3MDE0LCAweDAxNTAxOSwKKyAgICAweDAxNjAzZiwgMHg0MDY0NTgsIDB4MDE4MDRmLCAweDQ0ODQwOCwgMHgwNDkwMWEsIDB4NDBhNDVhLCAweDQ4YzQwYywKKyAgICAweDAxZDAzMSwgMHg0MGU0OGUsIDB4NDkwNDEwLCAweDQ5MjQxMiwgMHgwMjEwMzAsIDB4NDgwNDE0LCAweDAzMzAyMywKKyAgICAweDAyNDAyZSwgMHgwMjUwM2UsIDB4NDE2NDgyLCAweDAyYTAyNywgMHgwMjgwMmMsIDB4MDI5MDQwLCAweDQxODQ2OCwKKyAgICAweDAyYjA0YSwgMHg0MWE0ODYsIDB4MDJkMDQ4LCAweDQxYzQ4NCwgMHgwNGUwMmYsIDB4NDFlNDI2LCAweDQyMDQzNCwKKyAgICAweDQyMjQ5ZSwgMHg0MjQ0OTQsIDB4MDNkMDM0LCAweDQyODQ3MCwgMHgwMzkwMzYsIDB4MDM3MDNiLCAweDAzODA0MSwKKyAgICAweDQyYTQ3NiwgMHgwM2EwNGIsIDB4NDJjNDU0LCAweDAzYzA0NywgMHg0MmU0NzIsIDB4NDMwNDc4LCAweDQzMjQ2ZSwKKyAgICAweDQ5NjQzNiwgMHg0ODg0MzgsIDB4NDNhNDY2LCAweDA0NjA0MywgMHg0M2M0NjQsIDB4MDQ1MDRjLCAweDQzZTQ2MiwKKyAgICAweDQ2MDQ0MCwgMHg0NDI0NWUsIDB4NDVjNDQ0LCAweDQ2YTQ0NiwgMHg0NGE0NTYsIDB4NDc0NDRjLCAweDQ1MjQ0ZSwKKyAgICAweDQ2YzQ3YywgMHg0OGE0N2EsIDB4NDlhNDk4fTsKIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgVGFibGU6IEh1ZmZUcmVlMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhIChDb2RlYm9vayA2KS4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKiAyKSAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotY29uc3QgVUlOVCBhSHVmZlRyZWUyMls4MF0gPSB7MHgwM2MwMDEsMHgwMmYwMDIsMHgwMjAwMDMsMHgwMWMwMDQsMHgwMGYwMDUsMHgwMGMwMDYsMHgwMTYwMDcsMHgwNGQwMDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYjAwOSwweDAxNTAwYSwweDQwMDQ5MCwweDQwZTQwMiwweDAwZDAxMywweDAwZTAyYSwweDQwYzQwNCwweDAxOTAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExMDQxLDB4MDM4MDEyLDB4NDBhNDA2LDB4MDE0MDM3LDB4NDA4NDljLDB4NGEwNDEwLDB4MDRhMDE3LDB4NDU4MDE4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTI0MjIsMHgwMjgwMWEsMHgwMWIwMjksMHg0ODA0MTQsMHgwMjQwMWQsMHgwMWUwMmIsMHg0OGEwMWYsMHg0MTY0MzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyZDAyMSwweDAyNjAyMiwweDAyMzAzOSwweDQxODQ2OCwweDAyNTA0MywweDQ4NjQxYSwweDAyNzA0MCwweDQxYzQ4OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFlNDhjLDB4NDIwNDVhLDB4NDdjNDI0LDB4MDRjMDJjLDB4NDZlNDI2LDB4MDM2MDJlLDB4NDI4NDc4LDB4MDMwMDMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0M2MwMzEsMHgwNGIwMzIsMHg0MmU0MmEsMHgwMzQwM2EsMHgwMzUwNDgsMHg0MmM0NDIsMHg0NzA0MzAsMHg0OTQ0MzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQzNjQ5YSwweDQ1YzQzOCwweDA0NDAzYiwweDQzYTQ1NCwweDA0NTAzZCwweDAzZTAzZiwweDQzZTQ2NCwweDQ0MDQ2MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDg0NDQ0LDB4MDQ5MDQyLDB4NDQ2NDQ4LDB4NDRhNDU2LDB4NDY2NDRjLDB4MDQ3MDQ2LDB4NDRlNDUyLDB4NDUwNDYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NzQ0NWUsMHg0NmE0OTYsMHg0OTg0NmMsMHg0NzI0NzYsMHg0N2E0ODIsMHgwNGUwNGYsMHg0N2U0OTIsMHg0OGU0OWV9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogSHVmZlRyZWUyMiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YQorICogKENvZGVib29rIDYpLiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqCisgKiAyKSAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2NvbnN0IFVJTlQgYUh1ZmZUcmVlMjJbODBdID0geworICAgIDB4MDNjMDAxLCAweDAyZjAwMiwgMHgwMjAwMDMsIDB4MDFjMDA0LCAweDAwZjAwNSwgMHgwMGMwMDYsIDB4MDE2MDA3LAorICAgIDB4MDRkMDA4LCAweDAwYjAwOSwgMHgwMTUwMGEsIDB4NDAwNDkwLCAweDQwZTQwMiwgMHgwMGQwMTMsIDB4MDBlMDJhLAorICAgIDB4NDBjNDA0LCAweDAxOTAxMCwgMHgwMTEwNDEsIDB4MDM4MDEyLCAweDQwYTQwNiwgMHgwMTQwMzcsIDB4NDA4NDljLAorICAgIDB4NGEwNDEwLCAweDA0YTAxNywgMHg0NTgwMTgsIDB4NDEyNDIyLCAweDAyODAxYSwgMHgwMWIwMjksIDB4NDgwNDE0LAorICAgIDB4MDI0MDFkLCAweDAxZTAyYiwgMHg0OGEwMWYsIDB4NDE2NDMyLCAweDAyZDAyMSwgMHgwMjYwMjIsIDB4MDIzMDM5LAorICAgIDB4NDE4NDY4LCAweDAyNTA0MywgMHg0ODY0MWEsIDB4MDI3MDQwLCAweDQxYzQ4OCwgMHg0MWU0OGMsIDB4NDIwNDVhLAorICAgIDB4NDdjNDI0LCAweDA0YzAyYywgMHg0NmU0MjYsIDB4MDM2MDJlLCAweDQyODQ3OCwgMHgwMzAwMzMsIDB4NDNjMDMxLAorICAgIDB4MDRiMDMyLCAweDQyZTQyYSwgMHgwMzQwM2EsIDB4MDM1MDQ4LCAweDQyYzQ0MiwgMHg0NzA0MzAsIDB4NDk0NDM0LAorICAgIDB4NDM2NDlhLCAweDQ1YzQzOCwgMHgwNDQwM2IsIDB4NDNhNDU0LCAweDA0NTAzZCwgMHgwM2UwM2YsIDB4NDNlNDY0LAorICAgIDB4NDQwNDYwLCAweDQ4NDQ0NCwgMHgwNDkwNDIsIDB4NDQ2NDQ4LCAweDQ0YTQ1NiwgMHg0NjY0NGMsIDB4MDQ3MDQ2LAorICAgIDB4NDRlNDUyLCAweDQ1MDQ2MiwgMHg0NzQ0NWUsIDB4NDZhNDk2LCAweDQ5ODQ2YywgMHg0NzI0NzYsIDB4NDdhNDgyLAorICAgIDB4MDRlMDRmLCAweDQ3ZTQ5MiwgMHg0OGU0OWV9OwogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICBUYWJsZTogSHVmZlRyZWUyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDcpLiAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDIpICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBVSU5UIGFIdWZmVHJlZTIzWzYzXSA9IHsweDQwMDAwMSwweDAwMjAwMywweDQxMDQwMiwweDAwNDAwNywweDQxMjAwNSwweDAxYzAwNiwweDQyMDQwNCwweDAwODAwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFkMDA5LDB4MDBhMDFmLDB4NDA2MDI2LDB4MDBjMDEyLDB4MDBkMDBmLDB4MDI3MDBlLDB4NDA4NDQwLDB4MDEwMDIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjgwMTEsMHg0NTQ0MGEsMHgwMTMwMTcsMHgwMjkwMTQsMHgwMjQwMTUsMHgwMTYwMmYsMHg0M2M0MGMsMHgwMmIwMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTAzMywweDAzMjAxYSwweDQzZTAxYiwweDQ3MDQwZSwweDQyMjQxNCwweDAxZTAyNSwweDQzMjQxNiwweDAyMDAyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDE4NDQyLDB4NDFhNDUyLDB4MDM2MDIzLDB4NDFjNDQ2LDB4NDY0NDFlLDB4NDI0NDMwLDB4NDI2NDM0LDB4NDM2NDI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDQ0MmEsMHgwMmUwMmEsMHg0NTY0MmMsMHgwMzAwMmMsMHgwMmQwM2IsMHg0NjY0MmUsMHg0M2E0MzgsMHg0NjA0NDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMTAzNywweDQ3MjQ0YSwweDQ1YTQ0YywweDAzNDAzOSwweDAzODAzNSwweDQ3ODQ0ZSwweDQ2MjQ1MCwweDQ3NDQ1OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDZhNDVjLDB4MDNhMDNjLDB4NDVlNDdhLDB4NDc2NDY4LDB4MDNkMDNlLDB4NDdjNDZjLDB4NDZlNDdlfTsKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiAgVGFibGU6IEh1ZmZUcmVlMjMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEKKyAqIChDb2RlYm9vayA3KS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKgorICogMikgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTIzWzYzXSA9IHsKKyAgICAweDQwMDAwMSwgMHgwMDIwMDMsIDB4NDEwNDAyLCAweDAwNDAwNywgMHg0MTIwMDUsIDB4MDFjMDA2LCAweDQyMDQwNCwKKyAgICAweDAwODAwYiwgMHgwMWQwMDksIDB4MDBhMDFmLCAweDQwNjAyNiwgMHgwMGMwMTIsIDB4MDBkMDBmLCAweDAyNzAwZSwKKyAgICAweDQwODQ0MCwgMHgwMTAwMjIsIDB4MDI4MDExLCAweDQ1NDQwYSwgMHgwMTMwMTcsIDB4MDI5MDE0LCAweDAyNDAxNSwKKyAgICAweDAxNjAyZiwgMHg0M2M0MGMsIDB4MDJiMDE4LCAweDAxOTAzMywgMHgwMzIwMWEsIDB4NDNlMDFiLCAweDQ3MDQwZSwKKyAgICAweDQyMjQxNCwgMHgwMWUwMjUsIDB4NDMyNDE2LCAweDAyMDAyMSwgMHg0MTg0NDIsIDB4NDFhNDUyLCAweDAzNjAyMywKKyAgICAweDQxYzQ0NiwgMHg0NjQ0MWUsIDB4NDI0NDMwLCAweDQyNjQzNCwgMHg0MzY0MjgsIDB4NDQ0NDJhLCAweDAyZTAyYSwKKyAgICAweDQ1NjQyYywgMHgwMzAwMmMsIDB4MDJkMDNiLCAweDQ2NjQyZSwgMHg0M2E0MzgsIDB4NDYwNDQ4LCAweDAzMTAzNywKKyAgICAweDQ3MjQ0YSwgMHg0NWE0NGMsIDB4MDM0MDM5LCAweDAzODAzNSwgMHg0Nzg0NGUsIDB4NDYyNDUwLCAweDQ3NDQ1OCwKKyAgICAweDQ2YTQ1YywgMHgwM2EwM2MsIDB4NDVlNDdhLCAweDQ3NjQ2OCwgMHgwM2QwM2UsIDB4NDdjNDZjLCAweDQ2ZTQ3ZX07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBIdWZmVHJlZTI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgOCkuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogMikgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFVJTlQgYUh1ZmZUcmVlMjRbNjNdID0gezB4MDAxMDA2LDB4MDFkMDAyLDB4MDA1MDAzLDB4NDI0MDA0LDB4NDAwNDIwLDB4NDE0NDAyLDB4MDA3MDBhLDB4MDA4MDIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkwMWYsMHg0MDQ0MzIsMHgwMGIwMTEsMHgwMGMwMGUsMHgwMGQwMzIsMHg0MDY0NDYsMHgwMjMwMGYsMHgwMzMwMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1ODQwOCwweDAyNTAxMiwweDAxMzAxNiwweDAxNDAyZiwweDAxNTAzOCwweDQ2ODQwYSwweDAyODAxNywweDAxODAxYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDM5MDE5LDB4NDBjNDdhLDB4MDNlMDFiLDB4MDNiMDFjLDB4NDBlNDdlLDB4NDEyMDFlLDB4NDIyNDEwLDB4NDE2NDM0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMmEwMjEsMHgwMjIwMmIsMHg0MTg0NDQsMHgwMmMwMjQsMHg0MWE0NTYsMHgwMmQwMjYsMHgwMjcwMzQsMHg0NjI0MWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOTAzNiwweDQxZTQ1YywweDQyNjAzMSwweDQyODQzMCwweDQ1MjQyYSwweDAzNzAyZSwweDQyYzQ2NCwweDAzMDAzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDc0NDJlLDB4NDM2NDQyLDB4NDM4NDU0LDB4NDNhNDQ4LDB4MDM1MDNhLDB4NDNjNDY2LDB4NDNlMDNkLDB4NDRhNDQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NGM0NzIsMHg0NjA0NGUsMHg0NWE0NTAsMHg0NWU0NzAsMHg0NmE0NzYsMHg0NmM0NzgsMHg0N2M0NmV9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogSHVmZlRyZWUyNCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YQorICogKENvZGVib29rIDgpLiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqCisgKiAyKSAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2NvbnN0IFVJTlQgYUh1ZmZUcmVlMjRbNjNdID0geworICAgIDB4MDAxMDA2LCAweDAxZDAwMiwgMHgwMDUwMDMsIDB4NDI0MDA0LCAweDQwMDQyMCwgMHg0MTQ0MDIsIDB4MDA3MDBhLAorICAgIDB4MDA4MDIwLCAweDAwOTAxZiwgMHg0MDQ0MzIsIDB4MDBiMDExLCAweDAwYzAwZSwgMHgwMGQwMzIsIDB4NDA2NDQ2LAorICAgIDB4MDIzMDBmLCAweDAzMzAxMCwgMHg0NTg0MDgsIDB4MDI1MDEyLCAweDAxMzAxNiwgMHgwMTQwMmYsIDB4MDE1MDM4LAorICAgIDB4NDY4NDBhLCAweDAyODAxNywgMHgwMTgwMWEsIDB4MDM5MDE5LCAweDQwYzQ3YSwgMHgwM2UwMWIsIDB4MDNiMDFjLAorICAgIDB4NDBlNDdlLCAweDQxMjAxZSwgMHg0MjI0MTAsIDB4NDE2NDM0LCAweDAyYTAyMSwgMHgwMjIwMmIsIDB4NDE4NDQ0LAorICAgIDB4MDJjMDI0LCAweDQxYTQ1NiwgMHgwMmQwMjYsIDB4MDI3MDM0LCAweDQ2MjQxYywgMHgwMjkwMzYsIDB4NDFlNDVjLAorICAgIDB4NDI2MDMxLCAweDQyODQzMCwgMHg0NTI0MmEsIDB4MDM3MDJlLCAweDQyYzQ2NCwgMHgwMzAwM2MsIDB4NDc0NDJlLAorICAgIDB4NDM2NDQyLCAweDQzODQ1NCwgMHg0M2E0NDgsIDB4MDM1MDNhLCAweDQzYzQ2NiwgMHg0M2UwM2QsIDB4NDRhNDQwLAorICAgIDB4NDRjNDcyLCAweDQ2MDQ0ZSwgMHg0NWE0NTAsIDB4NDVlNDcwLCAweDQ2YTQ3NiwgMHg0NmM0NzgsIDB4NDdjNDZlfTsKIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgVGFibGU6IEh1ZmZUcmVlMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhIChDb2RlYm9vayA5KS4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKiAyKSAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotY29uc3QgVUlOVCBhSHVmZlRyZWUyNVsxNjhdID0gezB4NDAwMDAxLDB4MDAyMDAzLDB4NDFhNDAyLDB4MDA0MDA3LDB4NDFjMDA1LDB4MDM1MDA2LDB4NDM0NDA0LDB4MDA4MDEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5MDBjLDB4MDRhMDBhLDB4NDIwMDBiLDB4NDRlNDA2LDB4MDM2MDBkLDB4MDM4MDBlLDB4MDVhMDBmLDB4NDA4NDY4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExMDFhLDB4MDEyMDE2LDB4MDM5MDEzLDB4MDcwMDE0LDB4NDZlMDE1LDB4NDBhNDQwLDB4MDNiMDE3LDB4MDE4MDRkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5MDRmLDB4NGI4NDBjLDB4MDFiMDIyLDB4MDFjMDQxLDB4MDNmMDFkLDB4MDFlMDIwLDB4MDFmMDViLDB4NDBlNGVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMDdjLDB4NDVjNDEwLDB4MDIzMDJjLDB4MDI0MDI4LDB4MDUzMDI1LDB4MDI2MDQ1LDB4MDI3MDdkLDB4NDEyNTIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ3MDI5LDB4MDVlMDJhLDB4MDJiMDhhLDB4NTI2NDE0LDB4MDU2MDJkLDB4MDJlMDgxLDB4MDJmMDMyLDB4MDZlMDMwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMxMDgwLDB4NDE2NTQ0LDB4MDc5MDMzLDB4MDM0MDkxLDB4NDE4NTJjLDB4NDM2NDFlLDB4MDRiMDM3LDB4NDIyNDZhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDNjNDI0LDB4MDRjMDNhLDB4NDI2NDU2LDB4MDNjMDY2LDB4MDNkMDNlLDB4NDgyNDI4LDB4NDU4NDJhLDB4MDQwMDcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDJjNGJhLDB4MDUwMDQyLDB4MDQzMDVjLDB4MDQ0MDc0LDB4NDJlNGJlLDB4MDZhMDQ2LDB4NGRjNDMwLDB4MDc1MDQ4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ5MGEzLDB4NDRhNDMyLDB4NDUwNDM4LDB4NDNhNDUyLDB4NDg0NDNlLDB4MDRlMDY4LDB4NDVhNDQyLDB4NGQ0NDQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUxMDg4LDB4MDUyMDg3LDB4NDQ2NDhjLDB4MDc3MDU0LDB4NGRhMDU1LDB4NTBhNDQ4LDB4MDU3MDYwLDB4MDZiMDU4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU5MDZkLDB4NDRjNGY2LDB4NDZjNDU0LDB4NDVlNDc0LDB4MDY5MDVkLDB4NDYwNTIwLDB4MDVmMDdlLDB4NDYyNDk0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxMDYzLDB4MDdmMDYyLDB4NDY0NDk2LDB4MDY0MDhiLDB4MDhkMDY1LDB4NTQyNDY2LDB4MDY3MDcxLDB4NGQyNDcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDcyNGVjLDB4NDc4NDc2LDB4NTNhNDdhLDB4MDliMDZjLDB4NDdjNGFjLDB4NGY4NDdlLDB4MDZmMDc4LDB4NTEwNDgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDg2NDllLDB4NDg4NGEwLDB4MDczMDdiLDB4NDljNDhhLDB4NGE2NDhlLDB4MDk4MDc2LDB4NDkwNGMwLDB4NDkyNGVhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGM4NDk4LDB4MDdhMDhlLDB4NTEyNDlhLDB4NGEyNGQ2LDB4NTA2NGE0LDB4NGYyNGE4LDB4NGFhNGRlLDB4NTFlNGFlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGIwNTM4LDB4MDgyMDkyLDB4MDgzMDg1LDB4MDhmMDg0LDB4NTQ2NGIyLDB4MDk2MDg2LDB4NGNlNGI0LDB4NGQwNGI2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDg5MDkwLDB4NGJjNTA4LDB4NGMyNTNlLDB4MDhjMGE0LDB4NTI4NGM0LDB4NGUwNGM2LDB4NGNhNGZhLDB4NTE0NGNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGYwNGQ4LDB4NGUyNGZjLDB4MDkzMDljLDB4MDk0MDk5LDB4MDk1MDk3LDB4NGU0NTE2LDB4NGU2NTJlLDB4NGU4NGZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGY0NTBjLDB4MDlhMDlmLDB4NTAwNTAyLDB4NTA0NTBlLDB4MDlkMGEwLDB4MDllMGE1LDB4NTE4NTMwLDB4NTFhNTRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE3MGExLDB4MGEyMGE2LDB4NTFjNTM0LDB4NTNjNTI0LDB4NTQwNTJhLDB4NTQ4NTMyLDB4NTM2NTUwLDB4NTRjNTRlfTsKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiAgVGFibGU6IEh1ZmZUcmVlMjUgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEKKyAqIChDb2RlYm9vayA5KS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKgorICogMikgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTI1WzE2OF0gPSB7CisgICAgMHg0MDAwMDEsIDB4MDAyMDAzLCAweDQxYTQwMiwgMHgwMDQwMDcsIDB4NDFjMDA1LCAweDAzNTAwNiwgMHg0MzQ0MDQsCisgICAgMHgwMDgwMTAsIDB4MDA5MDBjLCAweDA0YTAwYSwgMHg0MjAwMGIsIDB4NDRlNDA2LCAweDAzNjAwZCwgMHgwMzgwMGUsCisgICAgMHgwNWEwMGYsIDB4NDA4NDY4LCAweDAxMTAxYSwgMHgwMTIwMTYsIDB4MDM5MDEzLCAweDA3MDAxNCwgMHg0NmUwMTUsCisgICAgMHg0MGE0NDAsIDB4MDNiMDE3LCAweDAxODA0ZCwgMHgwMTkwNGYsIDB4NGI4NDBjLCAweDAxYjAyMiwgMHgwMWMwNDEsCisgICAgMHgwM2YwMWQsIDB4MDFlMDIwLCAweDAxZjA1YiwgMHg0MGU0ZWUsIDB4MDIxMDdjLCAweDQ1YzQxMCwgMHgwMjMwMmMsCisgICAgMHgwMjQwMjgsIDB4MDUzMDI1LCAweDAyNjA0NSwgMHgwMjcwN2QsIDB4NDEyNTIyLCAweDA0NzAyOSwgMHgwNWUwMmEsCisgICAgMHgwMmIwOGEsIDB4NTI2NDE0LCAweDA1NjAyZCwgMHgwMmUwODEsIDB4MDJmMDMyLCAweDA2ZTAzMCwgMHgwMzEwODAsCisgICAgMHg0MTY1NDQsIDB4MDc5MDMzLCAweDAzNDA5MSwgMHg0MTg1MmMsIDB4NDM2NDFlLCAweDA0YjAzNywgMHg0MjI0NmEsCisgICAgMHg0M2M0MjQsIDB4MDRjMDNhLCAweDQyNjQ1NiwgMHgwM2MwNjYsIDB4MDNkMDNlLCAweDQ4MjQyOCwgMHg0NTg0MmEsCisgICAgMHgwNDAwNzIsIDB4NDJjNGJhLCAweDA1MDA0MiwgMHgwNDMwNWMsIDB4MDQ0MDc0LCAweDQyZTRiZSwgMHgwNmEwNDYsCisgICAgMHg0ZGM0MzAsIDB4MDc1MDQ4LCAweDA0OTBhMywgMHg0NGE0MzIsIDB4NDUwNDM4LCAweDQzYTQ1MiwgMHg0ODQ0M2UsCisgICAgMHgwNGUwNjgsIDB4NDVhNDQyLCAweDRkNDQ0NCwgMHgwNTEwODgsIDB4MDUyMDg3LCAweDQ0NjQ4YywgMHgwNzcwNTQsCisgICAgMHg0ZGEwNTUsIDB4NTBhNDQ4LCAweDA1NzA2MCwgMHgwNmIwNTgsIDB4MDU5MDZkLCAweDQ0YzRmNiwgMHg0NmM0NTQsCisgICAgMHg0NWU0NzQsIDB4MDY5MDVkLCAweDQ2MDUyMCwgMHgwNWYwN2UsIDB4NDYyNDk0LCAweDA2MTA2MywgMHgwN2YwNjIsCisgICAgMHg0NjQ0OTYsIDB4MDY0MDhiLCAweDA4ZDA2NSwgMHg1NDI0NjYsIDB4MDY3MDcxLCAweDRkMjQ3MCwgMHg0NzI0ZWMsCisgICAgMHg0Nzg0NzYsIDB4NTNhNDdhLCAweDA5YjA2YywgMHg0N2M0YWMsIDB4NGY4NDdlLCAweDA2ZjA3OCwgMHg1MTA0ODAsCisgICAgMHg0ODY0OWUsIDB4NDg4NGEwLCAweDA3MzA3YiwgMHg0OWM0OGEsIDB4NGE2NDhlLCAweDA5ODA3NiwgMHg0OTA0YzAsCisgICAgMHg0OTI0ZWEsIDB4NGM4NDk4LCAweDA3YTA4ZSwgMHg1MTI0OWEsIDB4NGEyNGQ2LCAweDUwNjRhNCwgMHg0ZjI0YTgsCisgICAgMHg0YWE0ZGUsIDB4NTFlNGFlLCAweDRiMDUzOCwgMHgwODIwOTIsIDB4MDgzMDg1LCAweDA4ZjA4NCwgMHg1NDY0YjIsCisgICAgMHgwOTYwODYsIDB4NGNlNGI0LCAweDRkMDRiNiwgMHgwODkwOTAsIDB4NGJjNTA4LCAweDRjMjUzZSwgMHgwOGMwYTQsCisgICAgMHg1Mjg0YzQsIDB4NGUwNGM2LCAweDRjYTRmYSwgMHg1MTQ0Y2MsIDB4NGYwNGQ4LCAweDRlMjRmYywgMHgwOTMwOWMsCisgICAgMHgwOTQwOTksIDB4MDk1MDk3LCAweDRlNDUxNiwgMHg0ZTY1MmUsIDB4NGU4NGZlLCAweDRmNDUwYywgMHgwOWEwOWYsCisgICAgMHg1MDA1MDIsIDB4NTA0NTBlLCAweDA5ZDBhMCwgMHgwOWUwYTUsIDB4NTE4NTMwLCAweDUxYTU0YSwgMHgwYTcwYTEsCisgICAgMHgwYTIwYTYsIDB4NTFjNTM0LCAweDUzYzUyNCwgMHg1NDA1MmEsIDB4NTQ4NTMyLCAweDUzNjU1MCwgMHg1NGM1NGV9OwogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICBUYWJsZTogSHVmZlRyZWUyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDEwKS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDIpICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBVSU5UIGFIdWZmVHJlZTI2WzE2OF0gPSB7MHgwMDYwMDEsMHgwMDIwMTMsMHgwMDMwMGYsMHgwMDQwMGQsMHgwM2IwMDUsMHg0MDA0NmUsMHgwMzcwMDcsMHgwMDgwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkwNjcsMHg0MDI0MjAsMHgwNTYwMGIsMHgwMGMwNTcsMHg0MzQ0MDQsMHgwNjYwMGUsMHg0MDY0NzAsMHgwM2MwMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTkwMTEsMHgwNmYwMTIsMHg0OWU0MDgsMHgwMTQwMTksMHgwM2YwMTUsMHgwMTYwNDQsMHgwMTcwNDIsMHgwNzkwMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Yjg0MGEsMHgwMWEwMWYsMHgwMWIwNDcsMHgwN2MwMWMsMHgwODcwMWQsMHgwNjkwMWUsMHg0NDY0MGMsMHgwMjAwMjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGIwMjEsMHgwMjIwNGYsMHgwMjMwMjUsMHgwMjQwNmIsMHg0MGU0ZTAsMHgwODEwMjYsMHg1Mjg0MTAsMHgwMjgwMmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmMwMjksMHgwOGYwMmEsMHgwMmIwNzgsMHg1M2E0MTIsMHgwNTIwMmQsMHgwMmUwMzMsMHgwMmYwMzEsMHgwMzAwYTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTQ0Y2UsMHgwYTYwMzIsMHg0MTY1MzQsMHgwOWEwMzQsMHgwOWYwMzUsMHgwMzYwYTcsMHg1NGU0MTgsMHgwM2EwMzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MzYwMzksMHg0Mzg0MWEsMHg0MWM0MWUsMHg0MjI0NmEsMHgwNTgwM2QsMHgwM2UwNjgsMHg0MjQ0ODQsMHgwNDAwNWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDEwN2EsMHg0MjY0NWEsMHgwNDMwOTMsMHg0ZDI0MjgsMHgwNWUwNDUsMHgwNDYwNzIsMHg0MmE0NWUsMHgwNDgwNjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzMwNDksMHgwNGEwOTgsMHg0MmM0YzQsMHgwNzUwNGMsMHgwOTUwNGQsMHgwNGUwOWMsMHg1MTA0MmUsMHgwNjMwNTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzcwNTEsMHg0MzA1M2MsMHgwNTMwODQsMHgwNjUwNTQsMHg0ZTQwNTUsMHg0ZmU0MzIsMHg0M2E0NTQsMHg0M2M0NmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0M2U0ODYsMHgwNzAwNWEsMHg0YTA0NDAsMHgwNzEwNWMsMHgwNWQwN2IsMHg0NWM0NDIsMHgwNWYwOGEsMHg0NzY0NDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwN2YwNjEsMHgwNjIwNmEsMHg0NDg1MDYsMHgwNjQwOGUsMHg1MjY0NGEsMHg1NDQ0NGMsMHg0NTY0NGUsMHg0NTI0NTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODg0NTgsMHg0NjA0ZWMsMHg0NjI0ZjYsMHg1MGU0NjQsMHgwODIwNmQsMHgwYTQwNmUsMHg1NDI0NjYsMHg0YTI0NjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0OGE0NzIsMHg0NzQwODksMHg0ZDg0NzgsMHgwOTcwNzQsMHg0N2E1MDgsMHgwOGQwNzYsMHg0N2M0YjYsMHg1MTI0N2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODA0ZmMsMHg0YmM0ODIsMHg0OGM0YTQsMHg0OGU0ZDQsMHgwN2QwN2UsMHg0OTA0ZGEsMHg0OTIwOGIsMHgwOTQwODAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0OTQ1MGMsMHg0OTY0ZTIsMHgwOWQwODMsMHg1MmE0OTgsMHgwODUwOTEsMHgwYTUwODYsMHg0Y2M0OWEsMHgwODgwOGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZWU0OWMsMHg0YTY0YmEsMHg0YTg0YzAsMHg0YzI0YWEsMHg0YWM0ZjAsMHg0YWU0ZDAsMHg0Y2E0YjAsMHgwOTAwYTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YjI0ZWEsMHgwOTIwOTksMHg0YjQ1MTYsMHg0ZDY0YmUsMHg0YzY1MGEsMHg1MjIwOTYsMHg0Yzg1MjQsMHg0ZGM0ZjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZGU0ZjQsMHg0ZTY1NDgsMHgwOWUwOWIsMHg1Mzg0ZTgsMHg1MjA0ZjgsMHg0ZmE1M2UsMHg1MDA1MWEsMHgwYTMwYTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDI1MzYsMHg1MTQ1MDQsMHg1MWU1MTgsMHg1NGE1MWMsMHg1NDA1MmMsMHg1MmU1NDYsMHg1MzA1MzIsMHg1NGM1NTB9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogSHVmZlRyZWUyNiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YQorICogKENvZGVib29rIDEwKS4gICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqCisgKiAyKSAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2NvbnN0IFVJTlQgYUh1ZmZUcmVlMjZbMTY4XSA9IHsKKyAgICAweDAwNjAwMSwgMHgwMDIwMTMsIDB4MDAzMDBmLCAweDAwNDAwZCwgMHgwM2IwMDUsIDB4NDAwNDZlLCAweDAzNzAwNywKKyAgICAweDAwODAwYSwgMHgwMDkwNjcsIDB4NDAyNDIwLCAweDA1NjAwYiwgMHgwMGMwNTcsIDB4NDM0NDA0LCAweDA2NjAwZSwKKyAgICAweDQwNjQ3MCwgMHgwM2MwMTAsIDB4MDU5MDExLCAweDA2ZjAxMiwgMHg0OWU0MDgsIDB4MDE0MDE5LCAweDAzZjAxNSwKKyAgICAweDAxNjA0NCwgMHgwMTcwNDIsIDB4MDc5MDE4LCAweDRiODQwYSwgMHgwMWEwMWYsIDB4MDFiMDQ3LCAweDA3YzAxYywKKyAgICAweDA4NzAxZCwgMHgwNjkwMWUsIDB4NDQ2NDBjLCAweDAyMDAyNywgMHgwNGIwMjEsIDB4MDIyMDRmLCAweDAyMzAyNSwKKyAgICAweDAyNDA2YiwgMHg0MGU0ZTAsIDB4MDgxMDI2LCAweDUyODQxMCwgMHgwMjgwMmMsIDB4MDZjMDI5LCAweDA4ZjAyYSwKKyAgICAweDAyYjA3OCwgMHg1M2E0MTIsIDB4MDUyMDJkLCAweDAyZTAzMywgMHgwMmYwMzEsIDB4MDMwMGEyLCAweDQxNDRjZSwKKyAgICAweDBhNjAzMiwgMHg0MTY1MzQsIDB4MDlhMDM0LCAweDA5ZjAzNSwgMHgwMzYwYTcsIDB4NTRlNDE4LCAweDAzYTAzOCwKKyAgICAweDQzNjAzOSwgMHg0Mzg0MWEsIDB4NDFjNDFlLCAweDQyMjQ2YSwgMHgwNTgwM2QsIDB4MDNlMDY4LCAweDQyNDQ4NCwKKyAgICAweDA0MDA1YiwgMHgwNDEwN2EsIDB4NDI2NDVhLCAweDA0MzA5MywgMHg0ZDI0MjgsIDB4MDVlMDQ1LCAweDA0NjA3MiwKKyAgICAweDQyYTQ1ZSwgMHgwNDgwNjAsIDB4MDczMDQ5LCAweDA0YTA5OCwgMHg0MmM0YzQsIDB4MDc1MDRjLCAweDA5NTA0ZCwKKyAgICAweDA0ZTA5YywgMHg1MTA0MmUsIDB4MDYzMDUwLCAweDA3NzA1MSwgMHg0MzA1M2MsIDB4MDUzMDg0LCAweDA2NTA1NCwKKyAgICAweDRlNDA1NSwgMHg0ZmU0MzIsIDB4NDNhNDU0LCAweDQzYzQ2YywgMHg0M2U0ODYsIDB4MDcwMDVhLCAweDRhMDQ0MCwKKyAgICAweDA3MTA1YywgMHgwNWQwN2IsIDB4NDVjNDQyLCAweDA1ZjA4YSwgMHg0NzY0NDQsIDB4MDdmMDYxLCAweDA2MjA2YSwKKyAgICAweDQ0ODUwNiwgMHgwNjQwOGUsIDB4NTI2NDRhLCAweDU0NDQ0YywgMHg0NTY0NGUsIDB4NDUyNDUwLCAweDQ4ODQ1OCwKKyAgICAweDQ2MDRlYywgMHg0NjI0ZjYsIDB4NTBlNDY0LCAweDA4MjA2ZCwgMHgwYTQwNmUsIDB4NTQyNDY2LCAweDRhMjQ2OCwKKyAgICAweDQ4YTQ3MiwgMHg0NzQwODksIDB4NGQ4NDc4LCAweDA5NzA3NCwgMHg0N2E1MDgsIDB4MDhkMDc2LCAweDQ3YzRiNiwKKyAgICAweDUxMjQ3ZSwgMHg0ODA0ZmMsIDB4NGJjNDgyLCAweDQ4YzRhNCwgMHg0OGU0ZDQsIDB4MDdkMDdlLCAweDQ5MDRkYSwKKyAgICAweDQ5MjA4YiwgMHgwOTQwODAsIDB4NDk0NTBjLCAweDQ5NjRlMiwgMHgwOWQwODMsIDB4NTJhNDk4LCAweDA4NTA5MSwKKyAgICAweDBhNTA4NiwgMHg0Y2M0OWEsIDB4MDg4MDhjLCAweDRlZTQ5YywgMHg0YTY0YmEsIDB4NGE4NGMwLCAweDRjMjRhYSwKKyAgICAweDRhYzRmMCwgMHg0YWU0ZDAsIDB4NGNhNGIwLCAweDA5MDBhMSwgMHg0YjI0ZWEsIDB4MDkyMDk5LCAweDRiNDUxNiwKKyAgICAweDRkNjRiZSwgMHg0YzY1MGEsIDB4NTIyMDk2LCAweDRjODUyNCwgMHg0ZGM0ZjIsIDB4NGRlNGY0LCAweDRlNjU0OCwKKyAgICAweDA5ZTA5YiwgMHg1Mzg0ZTgsIDB4NTIwNGY4LCAweDRmYTUzZSwgMHg1MDA1MWEsIDB4MGEzMGEwLCAweDUwMjUzNiwKKyAgICAweDUxNDUwNCwgMHg1MWU1MTgsIDB4NTRhNTFjLCAweDU0MDUyYywgMHg1MmU1NDYsIDB4NTMwNTMyLCAweDU0YzU1MH07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBIdWZmVHJlZTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgMTEpLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogMikgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFVJTlQgYUh1ZmZUcmVlMjdbMjg4XSA9IHsweDAwMTAwZCwweDAwMjAwNiwweDAwMzAwNCwweDQwMDQyNCwweDA0NzAwNSwweDQwMjQ0NiwweDA0ODAwNywweDAwODAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOTA0YywweDQ0YTQwNCwweDA3NDAwYiwweDAwYzBiYiwweDQ2NjQwNiwweDAwZTAxNCwweDAwZjA1NCwweDA0ZTAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1MTAxMSwweDBhOTAxMiwweDAxMzBiYywweDQwODQ2NCwweDAxNTAxZiwweDAxNjAxYSwweDAxNzA1OSwweDBhZjAxOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjYTAxOSwweDQwYTBlNCwweDAxYjA1ZSwweDAxYzA4NCwweDBiZjAxZCwweDA1ZDAxZSwweDU1YTQwYywweDAyMDAyNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTA2NiwweDA0MzAyMiwweDAyMzA2MiwweDAyNDA4ZCwweDAyNTEwOCwweDQwZTQ4MCwweDAyNzAzMCwweDAyODAyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOTA2YiwweDAyYTBkYSwweDA2NTAyYiwweDQxMDVjOCwweDBhNDAyZCwweDBlYzAyZSwweDBkZDAyZiwweDUzMjQxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTAzMSwweDAzMjAzNiwweDAzMzAzZSwweDBmZDAzNCwweDBmYzAzNSwweDQxNDViMCwweDAzNzAzYSwweDAzODExNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwZDAzOSwweDViYTQxNiwweDEwZjAzYiwweDAzYzA0MSwweDVmYTAzZCwweDQxYzQxOCwweDEwNDAzZiwweDA0MDExZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxYTVmNCwweDExYzA0MiwweDQxZTYxYywweDA4NzA0NCwweDBmNTA0NSwweDBkOTA0NiwweDQyMDRhMiwweDY0MDQyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0OTA0YSwweDQyNjQ0OCwweDA0YjA3MywweDQyODQ2OCwweDQ2YzA0ZCwweDQ4YTQyYSwweDA0ZjA3NywweDA3NjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyYzRiMCwweDA1MjBhNywweDA5NjA1MywweDQyZTRhOCwweDA1NTA3ZCwweDA3YTA1NiwweDBkNDA1NywweDBkZjA1OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ0MjQzMCwweDA1YTA4MSwweDA1YjA5YiwweDA1YzBlMiwweDViODQzMiwweDRmZTQzNCwweDA1ZjA5ZSwweDBlNjA2MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTBkNiwweDU3YzQzNiwweDBjYzA2MywweDExMjA2NCwweDQzODRhMCwweDQzYTVjYSwweDA2NzA4OSwweDA2ODBiNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OTBhMiwweDBhMTA2YSwweDQzYzU5YywweDA5MjA2YywweDA2ZDBiYSwweDYwNjQzZSwweDBkMTA2ZiwweDA3MDBlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkZTA3MSwweDEwYjA3MiwweDQ0MDU2YywweDQ2YTQ0NCwweDA3NTA5NCwweDQ4YzQ0YywweDQ0ZTQ5MCwweDA5NTA3OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBhYjA3OSwweDQ1MDRjZSwweDA3YjA5NywweDExZTA3YywweDYzMDQ1MiwweDBhYzA3ZSwweDA3ZjA5OSwweDA4MDEwNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1NDRiOCwweDA4MjBiMSwweDA4MzBlNSwweDRmYzQ1NiwweDBiMzA4NSwweDA4NjA5ZCwweDQ1ODUzZSwweDA4ODBjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVjMDQ1YSwweDA4YTA4ZiwweDA4YjBjZSwweDA4YzBmNywweDU4NjQ1YywweDExMTA4ZSwweDQ1ZTVjNCwweDBjNDA5MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwYTA5MSwweDQ2MDRlNCwweDBkMDA5MywweDQ2MjYwOCwweDQ4ZTQ2ZSwweDQ3MDRiMiwweDRkMjQ3MiwweDA5ODBiZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRmMjQ3NCwweDBlMzA5YSwweDQ3NjRhYSwweDBiZTA5YywweDQ3ODUxYSwweDQ3YTRkZSwweDA5ZjBiNSwweDBhMDBjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDQ3YywweDU3ODQ3ZSwweDBhMzBjMywweDUwNDQ4MiwweDBlOTBhNSwweDBhNjEwMCwweDRjODQ4NCwweDBhODExZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4NjYyYSwweDBjNzBhYSwweDQ4ODQ5NCwweDQ5MjRkMCwweDBhZDBjOCwweDBhZTBkOCwweDQ5NjYzNiwweDEwZTBiMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRmODQ5OCwweDBmMzBiMiwweDQ5YTRkYywweDBmMjBiNCwweDUzYzQ5YywweDBiNjBjYiwweDQ5ZTU3YSwweDBiODBlMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBiOTEwOSwweDVlNDRhNCwweDU0ODRhNiwweDRhYzRhZSwweDRiNDRjYSwweDRkNjRiNiwweDRiYTVkYSwweDBjNjBjMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiYzUxZSwweDRiZTU1NiwweDYyMDRjMCwweDRjMjRjNCwweDBmODBjNSwweDU2NjRjNiwweDRjYzUzYSwweDRkNDYyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBmMTBjOSwweDRkODU1MiwweDRkYTRmYSwweDViZTRlMCwweDBjZDBmZiwweDUyNDRlMiwweDBjZjBlOCwweDRlNjU2OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU5YTRlOCwweDBmOTBkMiwweDEwMTBkMywweDVhYzRlYSwweDBkNTBkNywweDRlYzYzNCwweDRlZTU2MCwweDRmNDRmMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRmNjYzOCwweDUwMjUyMiwweDBkYjBkYywweDUwNjVhNiwweDUwODYwNCwweDYwMDUwYSwweDUwYzBmYiwweDYzMjUwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExMzBlMSwweDVhNDUxMCwweDUxMjVmYywweDUxNjUxNCwweDUxODYzZSwweDUxYzUzNiwweDBlNzBmNCwweDU1YzUyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwMjUyNiwweDBlYjBlYSwweDVjYzUyOCwweDVlYTUyYSwweDExNDBlZCwweDYwYzUyYywweDEwMjBlZiwweDBmMDExOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU4ZTUyZSwweDUzMDYyMiwweDU1ODUzNCwweDUzODYxZSwweDU1ZTU0MCwweDU4MDBmNiwweDU3ZTU0MiwweDU0NDVlNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU0NjVlOCwweDBmYTExNSwweDU0YzU0YSwweDU0ZTYwZSwweDVhZTU1MCwweDExNjBmZSwweDVmMDU1NCwweDU2NDU2MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU2YTU4YSwweDU2ZTVlZSwweDEwMzEwYywweDU3MDVkMCwweDEwNzEwNSwweDU3MjVkNCwweDU3NDYzYSwweDU3NjViNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU4MjViYywweDU4NDVlMiwweDU4ODVkZSwweDU4YzU5MiwweDVjZTU5MCwweDU5NDVmNiwweDYzYzU5NiwweDExYjExMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVkODU5OCwweDVjMjU5ZSwweDVlMDVhMCwweDVhMjVjNiwweDVhODYwYSwweDVhYTVlYywweDViMjYxMCwweDExYTExOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYxODViNiwweDVmMjVkMiwweDVkNjYxNiwweDVkYzVmOCwweDYxYTVmZSwweDYxMjYxNCwweDYyZTYyNCwweDYyNjYyOH07CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogIFRhYmxlOiBIdWZmVHJlZTI3ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhCisgKiAoQ29kZWJvb2sgMTEpLiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICoKKyAqIDIpICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiAyICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworY29uc3QgVUlOVCBhSHVmZlRyZWUyN1syODhdID0geworICAgIDB4MDAxMDBkLCAweDAwMjAwNiwgMHgwMDMwMDQsIDB4NDAwNDI0LCAweDA0NzAwNSwgMHg0MDI0NDYsIDB4MDQ4MDA3LAorICAgIDB4MDA4MDBhLCAweDAwOTA0YywgMHg0NGE0MDQsIDB4MDc0MDBiLCAweDAwYzBiYiwgMHg0NjY0MDYsIDB4MDBlMDE0LAorICAgIDB4MDBmMDU0LCAweDA0ZTAxMCwgMHgwNTEwMTEsIDB4MGE5MDEyLCAweDAxMzBiYywgMHg0MDg0NjQsIDB4MDE1MDFmLAorICAgIDB4MDE2MDFhLCAweDAxNzA1OSwgMHgwYWYwMTgsIDB4MGNhMDE5LCAweDQwYTBlNCwgMHgwMWIwNWUsIDB4MDFjMDg0LAorICAgIDB4MGJmMDFkLCAweDA1ZDAxZSwgMHg1NWE0MGMsIDB4MDIwMDI2LCAweDAyMTA2NiwgMHgwNDMwMjIsIDB4MDIzMDYyLAorICAgIDB4MDI0MDhkLCAweDAyNTEwOCwgMHg0MGU0ODAsIDB4MDI3MDMwLCAweDAyODAyYywgMHgwMjkwNmIsIDB4MDJhMGRhLAorICAgIDB4MDY1MDJiLCAweDQxMDVjOCwgMHgwYTQwMmQsIDB4MGVjMDJlLCAweDBkZDAyZiwgMHg1MzI0MTIsIDB4MDZlMDMxLAorICAgIDB4MDMyMDM2LCAweDAzMzAzZSwgMHgwZmQwMzQsIDB4MGZjMDM1LCAweDQxNDViMCwgMHgwMzcwM2EsIDB4MDM4MTE3LAorICAgIDB4MTBkMDM5LCAweDViYTQxNiwgMHgxMGYwM2IsIDB4MDNjMDQxLCAweDVmYTAzZCwgMHg0MWM0MTgsIDB4MTA0MDNmLAorICAgIDB4MDQwMTFkLCAweDQxYTVmNCwgMHgxMWMwNDIsIDB4NDFlNjFjLCAweDA4NzA0NCwgMHgwZjUwNDUsIDB4MGQ5MDQ2LAorICAgIDB4NDIwNGEyLCAweDY0MDQyMiwgMHgwNDkwNGEsIDB4NDI2NDQ4LCAweDA0YjA3MywgMHg0Mjg0NjgsIDB4NDZjMDRkLAorICAgIDB4NDhhNDJhLCAweDA0ZjA3NywgMHgwNzYwNTAsIDB4NDJjNGIwLCAweDA1MjBhNywgMHgwOTYwNTMsIDB4NDJlNGE4LAorICAgIDB4MDU1MDdkLCAweDA3YTA1NiwgMHgwZDQwNTcsIDB4MGRmMDU4LCAweDQ0MjQzMCwgMHgwNWEwODEsIDB4MDViMDliLAorICAgIDB4MDVjMGUyLCAweDViODQzMiwgMHg0ZmU0MzQsIDB4MDVmMDllLCAweDBlNjA2MCwgMHgwNjEwZDYsIDB4NTdjNDM2LAorICAgIDB4MGNjMDYzLCAweDExMjA2NCwgMHg0Mzg0YTAsIDB4NDNhNWNhLCAweDA2NzA4OSwgMHgwNjgwYjcsIDB4MDY5MGEyLAorICAgIDB4MGExMDZhLCAweDQzYzU5YywgMHgwOTIwNmMsIDB4MDZkMGJhLCAweDYwNjQzZSwgMHgwZDEwNmYsIDB4MDcwMGVlLAorICAgIDB4MGRlMDcxLCAweDEwYjA3MiwgMHg0NDA1NmMsIDB4NDZhNDQ0LCAweDA3NTA5NCwgMHg0OGM0NGMsIDB4NDRlNDkwLAorICAgIDB4MDk1MDc4LCAweDBhYjA3OSwgMHg0NTA0Y2UsIDB4MDdiMDk3LCAweDExZTA3YywgMHg2MzA0NTIsIDB4MGFjMDdlLAorICAgIDB4MDdmMDk5LCAweDA4MDEwNiwgMHg0NTQ0YjgsIDB4MDgyMGIxLCAweDA4MzBlNSwgMHg0ZmM0NTYsIDB4MGIzMDg1LAorICAgIDB4MDg2MDlkLCAweDQ1ODUzZSwgMHgwODgwYzIsIDB4NWMwNDVhLCAweDA4YTA4ZiwgMHgwOGIwY2UsIDB4MDhjMGY3LAorICAgIDB4NTg2NDVjLCAweDExMTA4ZSwgMHg0NWU1YzQsIDB4MGM0MDkwLCAweDEwYTA5MSwgMHg0NjA0ZTQsIDB4MGQwMDkzLAorICAgIDB4NDYyNjA4LCAweDQ4ZTQ2ZSwgMHg0NzA0YjIsIDB4NGQyNDcyLCAweDA5ODBiZCwgMHg0ZjI0NzQsIDB4MGUzMDlhLAorICAgIDB4NDc2NGFhLCAweDBiZTA5YywgMHg0Nzg1MWEsIDB4NDdhNGRlLCAweDA5ZjBiNSwgMHgwYTAwYzEsIDB4NTAwNDdjLAorICAgIDB4NTc4NDdlLCAweDBhMzBjMywgMHg1MDQ0ODIsIDB4MGU5MGE1LCAweDBhNjEwMCwgMHg0Yzg0ODQsIDB4MGE4MTFmLAorICAgIDB4NDg2NjJhLCAweDBjNzBhYSwgMHg0ODg0OTQsIDB4NDkyNGQwLCAweDBhZDBjOCwgMHgwYWUwZDgsIDB4NDk2NjM2LAorICAgIDB4MTBlMGIwLCAweDRmODQ5OCwgMHgwZjMwYjIsIDB4NDlhNGRjLCAweDBmMjBiNCwgMHg1M2M0OWMsIDB4MGI2MGNiLAorICAgIDB4NDllNTdhLCAweDBiODBlMCwgMHgwYjkxMDksIDB4NWU0NGE0LCAweDU0ODRhNiwgMHg0YWM0YWUsIDB4NGI0NGNhLAorICAgIDB4NGQ2NGI2LCAweDRiYTVkYSwgMHgwYzYwYzAsIDB4NGJjNTFlLCAweDRiZTU1NiwgMHg2MjA0YzAsIDB4NGMyNGM0LAorICAgIDB4MGY4MGM1LCAweDU2NjRjNiwgMHg0Y2M1M2EsIDB4NGQ0NjJjLCAweDBmMTBjOSwgMHg0ZDg1NTIsIDB4NGRhNGZhLAorICAgIDB4NWJlNGUwLCAweDBjZDBmZiwgMHg1MjQ0ZTIsIDB4MGNmMGU4LCAweDRlNjU2OCwgMHg1OWE0ZTgsIDB4MGY5MGQyLAorICAgIDB4MTAxMGQzLCAweDVhYzRlYSwgMHgwZDUwZDcsIDB4NGVjNjM0LCAweDRlZTU2MCwgMHg0ZjQ0ZjAsIDB4NGY2NjM4LAorICAgIDB4NTAyNTIyLCAweDBkYjBkYywgMHg1MDY1YTYsIDB4NTA4NjA0LCAweDYwMDUwYSwgMHg1MGMwZmIsIDB4NjMyNTBlLAorICAgIDB4MTEzMGUxLCAweDVhNDUxMCwgMHg1MTI1ZmMsIDB4NTE2NTE0LCAweDUxODYzZSwgMHg1MWM1MzYsIDB4MGU3MGY0LAorICAgIDB4NTVjNTIwLCAweDYwMjUyNiwgMHgwZWIwZWEsIDB4NWNjNTI4LCAweDVlYTUyYSwgMHgxMTQwZWQsIDB4NjBjNTJjLAorICAgIDB4MTAyMGVmLCAweDBmMDExOSwgMHg1OGU1MmUsIDB4NTMwNjIyLCAweDU1ODUzNCwgMHg1Mzg2MWUsIDB4NTVlNTQwLAorICAgIDB4NTgwMGY2LCAweDU3ZTU0MiwgMHg1NDQ1ZTYsIDB4NTQ2NWU4LCAweDBmYTExNSwgMHg1NGM1NGEsIDB4NTRlNjBlLAorICAgIDB4NWFlNTUwLCAweDExNjBmZSwgMHg1ZjA1NTQsIDB4NTY0NTYyLCAweDU2YTU4YSwgMHg1NmU1ZWUsIDB4MTAzMTBjLAorICAgIDB4NTcwNWQwLCAweDEwNzEwNSwgMHg1NzI1ZDQsIDB4NTc0NjNhLCAweDU3NjViNCwgMHg1ODI1YmMsIDB4NTg0NWUyLAorICAgIDB4NTg4NWRlLCAweDU4YzU5MiwgMHg1Y2U1OTAsIDB4NTk0NWY2LCAweDYzYzU5NiwgMHgxMWIxMTAsIDB4NWQ4NTk4LAorICAgIDB4NWMyNTllLCAweDVlMDVhMCwgMHg1YTI1YzYsIDB4NWE4NjBhLCAweDVhYTVlYywgMHg1YjI2MTAsIDB4MTFhMTE4LAorICAgIDB4NjE4NWI2LCAweDVmMjVkMiwgMHg1ZDY2MTYsIDB4NWRjNWY4LCAweDYxYTVmZSwgMHg2MTI2MTQsIDB4NjJlNjI0LAorICAgIDB4NjI2NjI4fTsKIAotLyogZ2V0IHN0YXJ0aW5nIGFkZHJlc3NlcyBvZiBodWZmbWFuIHRhYmxlcyBpbnRvIGFuIGFycmF5IFtjb252ZXJ0IGNvZGVib29rIGludG8gc3RhcnRpbmcgYWRkcmVzc10gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYiAgICB0cmVlICovCi1jb25zdCBVSU5UICAgKmFIdWZmVGFibGVbTUFYX0NCXSA9IHthSHVmZlRyZWU0MSwgIC8qIDAgICAgICAtICAgKi8gIC8qIHVzZSB0cmVlIDEgYXMgZHVtbXkgaGVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlNDEsICAvKiAxICAgICAgMSAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWU0MiwgIC8qIDIgICAgICAyICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTQzLCAgLyogMyAgICAgIDMgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlNDQsICAvKiA0ICAgICAgNCAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyMSwgIC8qIDUgICAgICA1ICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTIyLCAgLyogNiAgICAgIDYgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjMsICAvKiA3ICAgICAgNyAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNCwgIC8qIDggICAgICA4ICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI1LCAgLyogOSAgICAgIDkgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjYsICAvKiAxMCAgICAgMTAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDExICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTQxLCAgLyogMTIgICAgIC0gICAqLyAgLyogdXNlIHRyZWUgMSBhcyBkdW1teSBoZXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWU0MSwgIC8qIDEzICAgICAtICAgKi8gIC8qIHVzZSB0cmVlIDEgYXMgZHVtbXkgaGVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlNDEsICAvKiAxNCAgICAgLSAgICovICAvKiB1c2UgdHJlZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTQxLCAgLyogMTUgICAgIC0gICAqLyAgLyogdXNlIHRyZWUgMSBhcyBkdW1teSBoZXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDE2ICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMTcgICAgIDExICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAxOCAgICAgMTEgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDE5ICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMjAgICAgIDExICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAyMSAgICAgMTEgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDIyICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMjMgICAgIDExICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAyNCAgICAgMTEgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDI1ICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMjYgICAgIDExICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAyNyAgICAgMTEgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDI4ICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMjkgICAgIDExICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAzMCAgICAgMTEgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyN307IC8qIDMxICAgICAxMSAgKi8KKy8qIGdldCBzdGFydGluZyBhZGRyZXNzZXMgb2YgaHVmZm1hbiB0YWJsZXMgaW50byBhbiBhcnJheSBbY29udmVydCBjb2RlYm9vayBpbnRvCisgKiBzdGFydGluZyBhZGRyZXNzXSAqLworLyogY2IgICAgdHJlZSAqLworY29uc3QgVUlOVCAqYUh1ZmZUYWJsZVtNQVhfQ0JdID0geworICAgIGFIdWZmVHJlZTQxLAorICAgIC8qIDAgICAgICAtICAgKi8gLyogdXNlIHRyZWUgMSBhcyBkdW1teSBoZXJlICovCisgICAgYUh1ZmZUcmVlNDEsICAgICAvKiAxICAgICAgMSAgICovCisgICAgYUh1ZmZUcmVlNDIsICAgICAvKiAyICAgICAgMiAgICovCisgICAgYUh1ZmZUcmVlNDMsICAgICAvKiAzICAgICAgMyAgICovCisgICAgYUh1ZmZUcmVlNDQsICAgICAvKiA0ICAgICAgNCAgICovCisgICAgYUh1ZmZUcmVlMjEsICAgICAvKiA1ICAgICAgNSAgICovCisgICAgYUh1ZmZUcmVlMjIsICAgICAvKiA2ICAgICAgNiAgICovCisgICAgYUh1ZmZUcmVlMjMsICAgICAvKiA3ICAgICAgNyAgICovCisgICAgYUh1ZmZUcmVlMjQsICAgICAvKiA4ICAgICAgOCAgICovCisgICAgYUh1ZmZUcmVlMjUsICAgICAvKiA5ICAgICAgOSAgICovCisgICAgYUh1ZmZUcmVlMjYsICAgICAvKiAxMCAgICAgMTAgICovCisgICAgYUh1ZmZUcmVlMjcsICAgICAvKiAxMSAgICAgMTEgICovCisgICAgYUh1ZmZUcmVlNDEsCisgICAgLyogMTIgICAgIC0gICAqLyAvKiB1c2UgdHJlZSAxIGFzIGR1bW15IGhlcmUgKi8KKyAgICBhSHVmZlRyZWU0MSwKKyAgICAvKiAxMyAgICAgLSAgICovIC8qIHVzZSB0cmVlIDEgYXMgZHVtbXkgaGVyZSAqLworICAgIGFIdWZmVHJlZTQxLAorICAgIC8qIDE0ICAgICAtICAgKi8gLyogdXNlIHRyZWUgMSBhcyBkdW1teSBoZXJlICovCisgICAgYUh1ZmZUcmVlNDEsCisgICAgLyogMTUgICAgIC0gICAqLyAvKiB1c2UgdHJlZSAxIGFzIGR1bW15IGhlcmUgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDE2ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDE3ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDE4ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDE5ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDIwICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDIxICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDIyICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDIzICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI0ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI1ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI2ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI3ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI4ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI5ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDMwICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyN307ICAgIC8qIDMxICAgICAxMSAgKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGRhdGEtZGVzY3JpcHRpb246Ci0gIFRoZSBmb2xsb3dpbmcgdGFibGVzIGNvbnRhaW4gdGhlIHF1YW50aXplZCB2YWx1ZXMuIFR3byBvciBmb3VyIG9mIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGFyZQotICBpbmRleGVkIGJ5IHRoZSByZXN1bHQgb2YgdGhlIGRlY29kaW5nIGluIHRoZSBkZWNvZGluZyB0cmVlIChzZWUgdGFibGVzIGFib3ZlKS4KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBUaGUgZm9sbG93aW5nIHRhYmxlcyBjb250YWluIHRoZSBxdWFudGl6ZWQgdmFsdWVzLiBUd28gb3IgZm91ciBvZiB0aGUKKyBxdWFudGl6ZWQgdmFsdWVzIGFyZSBpbmRleGVkIGJ5IHRoZSByZXN1bHQgb2YgdGhlIGRlY29kaW5nIGluIHRoZSBkZWNvZGluZyB0cmVlCisgKHNlZSB0YWJsZXMgYWJvdmUpLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgVGFibGU6IFZhbFRhYjQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIHF1YW50aXplZCB2YWx1ZXMgZm9yIGNvZGVib29rcyAxLTIuICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFNDSEFSICBhVmFsVGFiNDFbMzI0XT17LTEsLTEsLTEsLTEsLTEsLTEsLTEsMCwtMSwtMSwtMSwxLC0xLC0xLDAsLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLDAsMCwtMSwtMSwwLDEsLTEsLTEsMSwtMSwtMSwtMSwxLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLDEsMSwtMSwwLC0xLC0xLC0xLDAsLTEsMCwtMSwwLC0xLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLDAsMCwtMSwtMSwwLDAsMCwtMSwwLDAsMSwtMSwwLDEsLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLDAsMSwwLC0xLDAsMSwxLC0xLDEsLTEsLTEsLTEsMSwtMSwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwxLC0xLDEsLTEsMSwwLC0xLC0xLDEsMCwwLC0xLDEsMCwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwxLDEsLTEsLTEsMSwxLDAsLTEsMSwxLDEsMCwtMSwtMSwtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwtMSwtMSwwLDAsLTEsLTEsMSwwLC0xLDAsLTEsMCwtMSwwLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsLTEsMCwxLDAsLTEsMSwtMSwwLC0xLDEsMCwwLC0xLDEsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLC0xLC0xLDAsMCwtMSwwLDAsMCwtMSwxLDAsMCwwLC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsMCwwLDAsMCwwLDEsMCwwLDEsLTEsMCwwLDEsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDEsMSwwLDEsLTEsLTEsMCwxLC0xLDAsMCwxLC0xLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMSwwLC0xLDAsMSwwLDAsMCwxLDAsMSwwLDEsMSwtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwxLDEsMCwwLDEsMSwxLDEsLTEsLTEsLTEsMSwtMSwtMSwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLC0xLC0xLDEsMSwtMSwwLC0xLDEsLTEsMCwwLDEsLTEsMCwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLC0xLDEsLTEsMSwtMSwxLDAsMSwtMSwxLDEsMSwwLC0xLC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDAsLTEsMCwxLDAsLTEsMSwxLDAsMCwtMSwxLDAsMCwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDAsMCwxLDEsMCwxLC0xLDEsMCwxLDAsMSwwLDEsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwxLC0xLC0xLDEsMSwtMSwwLDEsMSwtMSwxLDEsMSwwLC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDEsMCwwLDEsMSwwLDEsMSwxLDEsLTEsMSwxLDEsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwxLDEsMX07CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogIFRhYmxlOiBWYWxUYWI0MSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MKKyAqIDEtMi4gICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBTQ0hBUiBhVmFsVGFiNDFbMzI0XSA9IHsKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMCwgIC0xLCAtMSwgLTEsIDEsICAtMSwgLTEsIDAsICAtMSwgLTEsIC0xLAorICAgIDAsICAwLCAgLTEsIC0xLCAwLCAgMSwgIC0xLCAtMSwgMSwgIC0xLCAtMSwgLTEsIDEsICAwLCAgLTEsIC0xLCAxLCAgMSwKKyAgICAtMSwgMCwgIC0xLCAtMSwgLTEsIDAsICAtMSwgMCwgIC0xLCAwLCAgLTEsIDEsICAtMSwgMCwgIDAsICAtMSwgLTEsIDAsCisgICAgMCwgIDAsICAtMSwgMCwgIDAsICAxLCAgLTEsIDAsICAxLCAgLTEsIC0xLCAwLCAgMSwgIDAsICAtMSwgMCwgIDEsICAxLAorICAgIC0xLCAxLCAgLTEsIC0xLCAtMSwgMSwgIC0xLCAwLCAgLTEsIDEsICAtMSwgMSwgIC0xLCAxLCAgMCwgIC0xLCAtMSwgMSwKKyAgICAwLCAgMCwgIC0xLCAxLCAgMCwgIDEsICAtMSwgMSwgIDEsICAtMSwgLTEsIDEsICAxLCAgMCwgIC0xLCAxLCAgMSwgIDEsCisgICAgMCwgIC0xLCAtMSwgLTEsIDAsICAtMSwgLTEsIDAsICAwLCAgLTEsIC0xLCAxLCAgMCwgIC0xLCAwLCAgLTEsIDAsICAtMSwKKyAgICAwLCAgMCwgIDAsICAtMSwgMCwgIDEsICAwLCAgLTEsIDEsICAtMSwgMCwgIC0xLCAxLCAgMCwgIDAsICAtMSwgMSwgIDEsCisgICAgMCwgIDAsICAtMSwgLTEsIDAsICAwLCAgLTEsIDAsICAwLCAgMCwgIC0xLCAxLCAgMCwgIDAsICAwLCAgLTEsIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIC0xLCAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAxLCAgMSwKKyAgICAwLCAgMSwgIC0xLCAtMSwgMCwgIDEsICAtMSwgMCwgIDAsICAxLCAgLTEsIDEsICAwLCAgMSwgIDAsICAtMSwgMCwgIDEsCisgICAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgLTEsIDAsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLAorICAgIDEsICAtMSwgLTEsIC0xLCAxLCAgLTEsIC0xLCAwLCAgMSwgIC0xLCAtMSwgMSwgIDEsICAtMSwgMCwgIC0xLCAxLCAgLTEsCisgICAgMCwgIDAsICAxLCAgLTEsIDAsICAxLCAgMSwgIC0xLCAxLCAgLTEsIDEsICAtMSwgMSwgIDAsICAxLCAgLTEsIDEsICAxLAorICAgIDEsICAwLCAgLTEsIC0xLCAxLCAgMCwgIC0xLCAwLCAgMSwgIDAsICAtMSwgMSwgIDEsICAwLCAgMCwgIC0xLCAxLCAgMCwKKyAgICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAtMSwgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsCisgICAgMSwgIDEsICAtMSwgLTEsIDEsICAxLCAgLTEsIDAsICAxLCAgMSwgIC0xLCAxLCAgMSwgIDEsICAwLCAgLTEsIDEsICAxLAorICAgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIC0xLCAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMX07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBWYWxUYWI0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MgMy00LiAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBTQ0hBUiAgYVZhbFRhYjQyWzMyNF09ezAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwxLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwxLDEsMCwwLDEsMiwwLDAsMiwwLDAsMCwyLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwyLDIsMCwxLDAsMCwwLDEsMCwxLDAsMSwwLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMSwxLDAsMCwxLDEsMSwwLDEsMSwyLDAsMSwyLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMSwyLDEsMCwxLDIsMiwwLDIsMCwwLDAsMiwwLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMiwwLDIsMCwyLDEsMCwwLDIsMSwxLDAsMiwxLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMiwyLDAsMCwyLDIsMSwwLDIsMiwyLDEsMCwwLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMCwwLDEsMSwwLDAsMiwxLDAsMSwwLDEsMCwxLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMCwxLDIsMSwwLDIsMCwxLDAsMiwxLDEsMCwyLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMSwwLDAsMSwxLDAsMSwxLDEsMCwyLDEsMSwxLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMSwxLDEsMSwxLDEsMiwxLDEsMiwwLDEsMSwyLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMSwyLDIsMSwyLDAsMCwxLDIsMCwxLDEsMiwwLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMiwxLDAsMSwyLDEsMSwxLDIsMSwyLDEsMiwyLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMiwyLDEsMSwyLDIsMiwyLDAsMCwwLDIsMCwwLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMCwwLDIsMiwwLDEsMCwyLDAsMSwxLDIsMCwxLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMCwyLDAsMiwwLDIsMSwyLDAsMiwyLDIsMSwwLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMSwwLDEsMiwxLDAsMiwyLDEsMSwwLDIsMSwxLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMSwxLDIsMiwxLDIsMCwyLDEsMiwxLDIsMSwyLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMiwwLDAsMiwyLDAsMSwyLDIsMCwyLDIsMiwxLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMiwxLDEsMiwyLDEsMiwyLDIsMiwwLDIsMiwyLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMiwyLDJ9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogVmFsVGFiNDIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgcXVhbnRpemVkIHZhbHVlcyBmb3IgY29kZWJvb2tzCisgKiAzLTQuICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworY29uc3QgU0NIQVIgYVZhbFRhYjQyWzMyNF0gPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMiwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMiwgMCwKKyAgICAwLCAyLCAwLCAwLCAwLCAyLCAxLCAwLCAwLCAyLCAyLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAyLCAwLCAxLAorICAgIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDIsIDAsIDEsIDIsIDAsIDAsIDEsIDIsIDEsIDAsIDEsIDIsIDIsIDAsIDIsIDAsCisgICAgMCwgMCwgMiwgMCwgMSwgMCwgMiwgMCwgMiwgMCwgMiwgMSwgMCwgMCwgMiwgMSwgMSwgMCwgMiwgMSwgMiwgMCwgMiwgMiwgMCwKKyAgICAwLCAyLCAyLCAxLCAwLCAyLCAyLCAyLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAxLCAxLCAwLCAwLCAyLCAxLCAwLCAxLCAwLCAxLAorICAgIDAsIDEsIDEsIDEsIDAsIDEsIDIsIDEsIDAsIDIsIDAsIDEsIDAsIDIsIDEsIDEsIDAsIDIsIDIsIDEsIDEsIDAsIDAsIDEsIDEsCisgICAgMCwgMSwgMSwgMSwgMCwgMiwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMSwgMSwgMiwgMCwgMSwgMSwgMiwKKyAgICAxLCAxLCAxLCAyLCAyLCAxLCAyLCAwLCAwLCAxLCAyLCAwLCAxLCAxLCAyLCAwLCAyLCAxLCAyLCAxLCAwLCAxLCAyLCAxLCAxLAorICAgIDEsIDIsIDEsIDIsIDEsIDIsIDIsIDAsIDEsIDIsIDIsIDEsIDEsIDIsIDIsIDIsIDIsIDAsIDAsIDAsIDIsIDAsIDAsIDEsIDIsCisgICAgMCwgMCwgMiwgMiwgMCwgMSwgMCwgMiwgMCwgMSwgMSwgMiwgMCwgMSwgMiwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMSwgMiwgMCwKKyAgICAyLCAyLCAyLCAxLCAwLCAwLCAyLCAxLCAwLCAxLCAyLCAxLCAwLCAyLCAyLCAxLCAxLCAwLCAyLCAxLCAxLCAxLCAyLCAxLCAxLAorICAgIDIsIDIsIDEsIDIsIDAsIDIsIDEsIDIsIDEsIDIsIDEsIDIsIDIsIDIsIDIsIDAsIDAsIDIsIDIsIDAsIDEsIDIsIDIsIDAsIDIsCisgICAgMiwgMiwgMSwgMCwgMiwgMiwgMSwgMSwgMiwgMiwgMSwgMiwgMiwgMiwgMiwgMCwgMiwgMiwgMiwgMSwgMiwgMiwgMiwgMn07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBWYWxUYWIyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MgNS02LiAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBTQ0hBUiAgYVZhbFRhYjIxWzE2Ml09ey00LC00LC00LC0zLC00LC0yLC00LC0xLC00LDAsLTQsMSwtNCwyLC00LDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00LDQsLTMsLTQsLTMsLTMsLTMsLTIsLTMsLTEsLTMsMCwtMywxLC0zLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zLDMsLTMsNCwtMiwtNCwtMiwtMywtMiwtMiwtMiwtMSwtMiwwLC0yLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLDIsLTIsMywtMiw0LC0xLC00LC0xLC0zLC0xLC0yLC0xLC0xLC0xLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLDEsLTEsMiwtMSwzLC0xLDQsMCwtNCwwLC0zLDAsLTIsMCwtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsMSwwLDIsMCwzLDAsNCwxLC00LDEsLTMsMSwtMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwtMSwxLDAsMSwxLDEsMiwxLDMsMSw0LDIsLTQsMiwtMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwtMiwyLC0xLDIsMCwyLDEsMiwyLDIsMywyLDQsMywtNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywtMywzLC0yLDMsLTEsMywwLDMsMSwzLDIsMywzLDMsNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwtNCw0LC0zLDQsLTIsNCwtMSw0LDAsNCwxLDQsMiw0LDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsNH07CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogIFRhYmxlOiBWYWxUYWIyMSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MKKyAqIDUtNi4gICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBTQ0hBUiBhVmFsVGFiMjFbMTYyXSA9IHsKKyAgICAtNCwgLTQsIC00LCAtMywgLTQsIC0yLCAtNCwgLTEsIC00LCAwLCAtNCwgMSwgLTQsIDIsIC00LCAzLCAtNCwgNCwKKyAgICAtMywgLTQsIC0zLCAtMywgLTMsIC0yLCAtMywgLTEsIC0zLCAwLCAtMywgMSwgLTMsIDIsIC0zLCAzLCAtMywgNCwKKyAgICAtMiwgLTQsIC0yLCAtMywgLTIsIC0yLCAtMiwgLTEsIC0yLCAwLCAtMiwgMSwgLTIsIDIsIC0yLCAzLCAtMiwgNCwKKyAgICAtMSwgLTQsIC0xLCAtMywgLTEsIC0yLCAtMSwgLTEsIC0xLCAwLCAtMSwgMSwgLTEsIDIsIC0xLCAzLCAtMSwgNCwKKyAgICAwLCAgLTQsIDAsICAtMywgMCwgIC0yLCAwLCAgLTEsIDAsICAwLCAwLCAgMSwgMCwgIDIsIDAsICAzLCAwLCAgNCwKKyAgICAxLCAgLTQsIDEsICAtMywgMSwgIC0yLCAxLCAgLTEsIDEsICAwLCAxLCAgMSwgMSwgIDIsIDEsICAzLCAxLCAgNCwKKyAgICAyLCAgLTQsIDIsICAtMywgMiwgIC0yLCAyLCAgLTEsIDIsICAwLCAyLCAgMSwgMiwgIDIsIDIsICAzLCAyLCAgNCwKKyAgICAzLCAgLTQsIDMsICAtMywgMywgIC0yLCAzLCAgLTEsIDMsICAwLCAzLCAgMSwgMywgIDIsIDMsICAzLCAzLCAgNCwKKyAgICA0LCAgLTQsIDQsICAtMywgNCwgIC0yLCA0LCAgLTEsIDQsICAwLCA0LCAgMSwgNCwgIDIsIDQsICAzLCA0LCAgNH07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBWYWxUYWIyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MgNy04LiAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBTQ0hBUiAgYVZhbFRhYjIyWzEyOF09ezAsMCwwLDEsMCwyLDAsMywwLDQsMCw1LDAsNiwwLDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMCwxLDEsMSwyLDEsMywxLDQsMSw1LDEsNiwxLDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMCwyLDEsMiwyLDIsMywyLDQsMiw1LDIsNiwyLDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsMCwzLDEsMywyLDMsMywzLDQsMyw1LDMsNiwzLDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsMCw0LDEsNCwyLDQsMyw0LDQsNCw1LDQsNiw0LDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsMCw1LDEsNSwyLDUsMyw1LDQsNSw1LDUsNiw1LDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsMCw2LDEsNiwyLDYsMyw2LDQsNiw1LDYsNiw2LDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsMCw3LDEsNywyLDcsMyw3LDQsNyw1LDcsNiw3LDd9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogVmFsVGFiMjIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgcXVhbnRpemVkIHZhbHVlcyBmb3IgY29kZWJvb2tzCisgKiA3LTguICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworY29uc3QgU0NIQVIgYVZhbFRhYjIyWzEyOF0gPSB7CisgICAgMCwgMCwgMCwgMSwgMCwgMiwgMCwgMywgMCwgNCwgMCwgNSwgMCwgNiwgMCwgNywgMSwgMCwgMSwgMSwgMSwgMiwKKyAgICAxLCAzLCAxLCA0LCAxLCA1LCAxLCA2LCAxLCA3LCAyLCAwLCAyLCAxLCAyLCAyLCAyLCAzLCAyLCA0LCAyLCA1LAorICAgIDIsIDYsIDIsIDcsIDMsIDAsIDMsIDEsIDMsIDIsIDMsIDMsIDMsIDQsIDMsIDUsIDMsIDYsIDMsIDcsIDQsIDAsCisgICAgNCwgMSwgNCwgMiwgNCwgMywgNCwgNCwgNCwgNSwgNCwgNiwgNCwgNywgNSwgMCwgNSwgMSwgNSwgMiwgNSwgMywKKyAgICA1LCA0LCA1LCA1LCA1LCA2LCA1LCA3LCA2LCAwLCA2LCAxLCA2LCAyLCA2LCAzLCA2LCA0LCA2LCA1LCA2LCA2LAorICAgIDYsIDcsIDcsIDAsIDcsIDEsIDcsIDIsIDcsIDMsIDcsIDQsIDcsIDUsIDcsIDYsIDcsIDd9OwogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICBUYWJsZTogVmFsVGFiMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgcXVhbnRpemVkIHZhbHVlcyBmb3IgY29kZWJvb2tzIDktMTAuICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotY29uc3QgU0NIQVIgIGFWYWxUYWIyM1szMzhdPXswLDAsMCwxLDAsMiwwLDMsMCw0LDAsNSwwLDYsMCw3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDgsMCw5LDAsMTAsMCwxMSwwLDEyLDEsMCwxLDEsMSwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDMsMSw0LDEsNSwxLDYsMSw3LDEsOCwxLDksMSwxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwxMSwxLDEyLDIsMCwyLDEsMiwyLDIsMywyLDQsMiw1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLDYsMiw3LDIsOCwyLDksMiwxMCwyLDExLDIsMTIsMywwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLDEsMywyLDMsMywzLDQsMyw1LDMsNiwzLDcsMyw4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLDksMywxMCwzLDExLDMsMTIsNCwwLDQsMSw0LDIsNCwzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LDQsNCw1LDQsNiw0LDcsNCw4LDQsOSw0LDEwLDQsMTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsMTIsNSwwLDUsMSw1LDIsNSwzLDUsNCw1LDUsNSw2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LDcsNSw4LDUsOSw1LDEwLDUsMTEsNSwxMiw2LDAsNiwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LDIsNiwzLDYsNCw2LDUsNiw2LDYsNyw2LDgsNiw5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LDEwLDYsMTEsNiwxMiw3LDAsNywxLDcsMiw3LDMsNyw0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LDUsNyw2LDcsNyw3LDgsNyw5LDcsMTAsNywxMSw3LDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LDAsOCwxLDgsMiw4LDMsOCw0LDgsNSw4LDYsOCw3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LDgsOCw5LDgsMTAsOCwxMSw4LDEyLDksMCw5LDEsOSwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LDMsOSw0LDksNSw5LDYsOSw3LDksOCw5LDksOSwxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwxMSw5LDEyLDEwLDAsMTAsMSwxMCwyLDEwLDMsMTAsNCwxMCw1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCw2LDEwLDcsMTAsOCwxMCw5LDEwLDEwLDEwLDExLDEwLDEyLDExLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExLDEsMTEsMiwxMSwzLDExLDQsMTEsNSwxMSw2LDExLDcsMTEsOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEsOSwxMSwxMCwxMSwxMSwxMSwxMiwxMiwwLDEyLDEsMTIsMiwxMiwzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiw0LDEyLDUsMTIsNiwxMiw3LDEyLDgsMTIsOSwxMiwxMCwxMiwxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsMTJ9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogVmFsVGFiMjMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgcXVhbnRpemVkIHZhbHVlcyBmb3IgY29kZWJvb2tzCisgKiA5LTEwLiAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworY29uc3QgU0NIQVIgYVZhbFRhYjIzWzMzOF0gPSB7CisgICAgMCwgIDAsICAwLCAgMSwgIDAsICAyLCAgMCwgIDMsICAwLCAgNCwgIDAsICA1LCAgMCwgIDYsICAwLCAgNywgIDAsICA4LCAgMCwKKyAgICA5LCAgMCwgIDEwLCAwLCAgMTEsIDAsICAxMiwgMSwgIDAsICAxLCAgMSwgIDEsICAyLCAgMSwgIDMsICAxLCAgNCwgIDEsICA1LAorICAgIDEsICA2LCAgMSwgIDcsICAxLCAgOCwgIDEsICA5LCAgMSwgIDEwLCAxLCAgMTEsIDEsICAxMiwgMiwgIDAsICAyLCAgMSwgIDIsCisgICAgMiwgIDIsICAzLCAgMiwgIDQsICAyLCAgNSwgIDIsICA2LCAgMiwgIDcsICAyLCAgOCwgIDIsICA5LCAgMiwgIDEwLCAyLCAgMTEsCisgICAgMiwgIDEyLCAzLCAgMCwgIDMsICAxLCAgMywgIDIsICAzLCAgMywgIDMsICA0LCAgMywgIDUsICAzLCAgNiwgIDMsICA3LCAgMywKKyAgICA4LCAgMywgIDksICAzLCAgMTAsIDMsICAxMSwgMywgIDEyLCA0LCAgMCwgIDQsICAxLCAgNCwgIDIsICA0LCAgMywgIDQsICA0LAorICAgIDQsICA1LCAgNCwgIDYsICA0LCAgNywgIDQsICA4LCAgNCwgIDksICA0LCAgMTAsIDQsICAxMSwgNCwgIDEyLCA1LCAgMCwgIDUsCisgICAgMSwgIDUsICAyLCAgNSwgIDMsICA1LCAgNCwgIDUsICA1LCAgNSwgIDYsICA1LCAgNywgIDUsICA4LCAgNSwgIDksICA1LCAgMTAsCisgICAgNSwgIDExLCA1LCAgMTIsIDYsICAwLCAgNiwgIDEsICA2LCAgMiwgIDYsICAzLCAgNiwgIDQsICA2LCAgNSwgIDYsICA2LCAgNiwKKyAgICA3LCAgNiwgIDgsICA2LCAgOSwgIDYsICAxMCwgNiwgIDExLCA2LCAgMTIsIDcsICAwLCAgNywgIDEsICA3LCAgMiwgIDcsICAzLAorICAgIDcsICA0LCAgNywgIDUsICA3LCAgNiwgIDcsICA3LCAgNywgIDgsICA3LCAgOSwgIDcsICAxMCwgNywgIDExLCA3LCAgMTIsIDgsCisgICAgMCwgIDgsICAxLCAgOCwgIDIsICA4LCAgMywgIDgsICA0LCAgOCwgIDUsICA4LCAgNiwgIDgsICA3LCAgOCwgIDgsICA4LCAgOSwKKyAgICA4LCAgMTAsIDgsICAxMSwgOCwgIDEyLCA5LCAgMCwgIDksICAxLCAgOSwgIDIsICA5LCAgMywgIDksICA0LCAgOSwgIDUsICA5LAorICAgIDYsICA5LCAgNywgIDksICA4LCAgOSwgIDksICA5LCAgMTAsIDksICAxMSwgOSwgIDEyLCAxMCwgMCwgIDEwLCAxLCAgMTAsIDIsCisgICAgMTAsIDMsICAxMCwgNCwgIDEwLCA1LCAgMTAsIDYsICAxMCwgNywgIDEwLCA4LCAgMTAsIDksICAxMCwgMTAsIDEwLCAxMSwgMTAsCisgICAgMTIsIDExLCAwLCAgMTEsIDEsICAxMSwgMiwgIDExLCAzLCAgMTEsIDQsICAxMSwgNSwgIDExLCA2LCAgMTEsIDcsICAxMSwgOCwKKyAgICAxMSwgOSwgIDExLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAwLCAgMTIsIDEsICAxMiwgMiwgIDEyLCAzLCAgMTIsIDQsICAxMiwKKyAgICA1LCAgMTIsIDYsICAxMiwgNywgIDEyLCA4LCAgMTIsIDksICAxMiwgMTAsIDEyLCAxMSwgMTIsIDEyfTsKIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgVGFibGU6IFZhbFRhYjI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIHF1YW50aXplZCB2YWx1ZXMgZm9yIGNvZGVib29rcyAxMS4gICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFNDSEFSICBhVmFsVGFiMjRbNTc4XT17MCwwLDAsMSwwLDIsMCwzLDAsNCwwLDUsMCw2LDAsNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCw4LDAsOSwwLDEwLDAsMTEsMCwxMiwwLDEzLDAsMTQsMCwxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwxNiwxLDAsMSwxLDEsMiwxLDMsMSw0LDEsNSwxLDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsNywxLDgsMSw5LDEsMTAsMSwxMSwxLDEyLDEsMTMsMSwxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwxNSwxLDE2LDIsMCwyLDEsMiwyLDIsMywyLDQsMiw1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLDYsMiw3LDIsOCwyLDksMiwxMCwyLDExLDIsMTIsMiwxMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwxNCwyLDE1LDIsMTYsMywwLDMsMSwzLDIsMywzLDMsNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyw1LDMsNiwzLDcsMyw4LDMsOSwzLDEwLDMsMTEsMywxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywxMywzLDE0LDMsMTUsMywxNiw0LDAsNCwxLDQsMiw0LDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsNCw0LDUsNCw2LDQsNyw0LDgsNCw5LDQsMTAsNCwxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwxMiw0LDEzLDQsMTQsNCwxNSw0LDE2LDUsMCw1LDEsNSwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LDMsNSw0LDUsNSw1LDYsNSw3LDUsOCw1LDksNSwxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwxMSw1LDEyLDUsMTMsNSwxNCw1LDE1LDUsMTYsNiwwLDYsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwyLDYsMyw2LDQsNiw1LDYsNiw2LDcsNiw4LDYsOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwxMCw2LDExLDYsMTIsNiwxMyw2LDE0LDYsMTUsNiwxNiw3LDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsMSw3LDIsNywzLDcsNCw3LDUsNyw2LDcsNyw3LDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsOSw3LDEwLDcsMTEsNywxMiw3LDEzLDcsMTQsNywxNSw3LDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LDAsOCwxLDgsMiw4LDMsOCw0LDgsNSw4LDYsOCw3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LDgsOCw5LDgsMTAsOCwxMSw4LDEyLDgsMTMsOCwxNCw4LDE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LDE2LDksMCw5LDEsOSwyLDksMyw5LDQsOSw1LDksNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSw3LDksOCw5LDksOSwxMCw5LDExLDksMTIsOSwxMyw5LDE0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LDE1LDksMTYsMTAsMCwxMCwxLDEwLDIsMTAsMywxMCw0LDEwLDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLDYsMTAsNywxMCw4LDEwLDksMTAsMTAsMTAsMTEsMTAsMTIsMTAsMTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLDE0LDEwLDE1LDEwLDE2LDExLDAsMTEsMSwxMSwyLDExLDMsMTEsNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEsNSwxMSw2LDExLDcsMTEsOCwxMSw5LDExLDEwLDExLDExLDExLDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSwxMywxMSwxNCwxMSwxNSwxMSwxNiwxMiwwLDEyLDEsMTIsMiwxMiwzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiw0LDEyLDUsMTIsNiwxMiw3LDEyLDgsMTIsOSwxMiwxMCwxMiwxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsMTIsMTIsMTMsMTIsMTQsMTIsMTUsMTIsMTYsMTMsMCwxMywxLDEzLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLDMsMTMsNCwxMyw1LDEzLDYsMTMsNywxMyw4LDEzLDksMTMsMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLDExLDEzLDEyLDEzLDEzLDEzLDE0LDEzLDE1LDEzLDE2LDE0LDAsMTQsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQsMiwxNCwzLDE0LDQsMTQsNSwxNCw2LDE0LDcsMTQsOCwxNCw5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCwxMCwxNCwxMSwxNCwxMiwxNCwxMywxNCwxNCwxNCwxNSwxNCwxNiwxNSwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwxLDE1LDIsMTUsMywxNSw0LDE1LDUsMTUsNiwxNSw3LDE1LDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LDksMTUsMTAsMTUsMTEsMTUsMTIsMTUsMTMsMTUsMTQsMTUsMTUsMTUsMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LDAsMTYsMSwxNiwyLDE2LDMsMTYsNCwxNiw1LDE2LDYsMTYsNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsOCwxNiw5LDE2LDEwLDE2LDExLDE2LDEyLDE2LDEzLDE2LDE0LDE2LDE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwxNn07CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogIFRhYmxlOiBWYWxUYWIyNCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MgMTEuCisgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBTQ0hBUiBhVmFsVGFiMjRbNTc4XSA9IHsKKyAgICAwLCAgMCwgIDAsICAxLCAgMCwgIDIsICAwLCAgMywgIDAsICA0LCAgMCwgIDUsICAwLCAgNiwgIDAsICA3LCAgMCwgIDgsICAwLAorICAgIDksICAwLCAgMTAsIDAsICAxMSwgMCwgIDEyLCAwLCAgMTMsIDAsICAxNCwgMCwgIDE1LCAwLCAgMTYsIDEsICAwLCAgMSwgIDEsCisgICAgMSwgIDIsICAxLCAgMywgIDEsICA0LCAgMSwgIDUsICAxLCAgNiwgIDEsICA3LCAgMSwgIDgsICAxLCAgOSwgIDEsICAxMCwgMSwKKyAgICAxMSwgMSwgIDEyLCAxLCAgMTMsIDEsICAxNCwgMSwgIDE1LCAxLCAgMTYsIDIsICAwLCAgMiwgIDEsICAyLCAgMiwgIDIsICAzLAorICAgIDIsICA0LCAgMiwgIDUsICAyLCAgNiwgIDIsICA3LCAgMiwgIDgsICAyLCAgOSwgIDIsICAxMCwgMiwgIDExLCAyLCAgMTIsIDIsCisgICAgMTMsIDIsICAxNCwgMiwgIDE1LCAyLCAgMTYsIDMsICAwLCAgMywgIDEsICAzLCAgMiwgIDMsICAzLCAgMywgIDQsICAzLCAgNSwKKyAgICAzLCAgNiwgIDMsICA3LCAgMywgIDgsICAzLCAgOSwgIDMsICAxMCwgMywgIDExLCAzLCAgMTIsIDMsICAxMywgMywgIDE0LCAzLAorICAgIDE1LCAzLCAgMTYsIDQsICAwLCAgNCwgIDEsICA0LCAgMiwgIDQsICAzLCAgNCwgIDQsICA0LCAgNSwgIDQsICA2LCAgNCwgIDcsCisgICAgNCwgIDgsICA0LCAgOSwgIDQsICAxMCwgNCwgIDExLCA0LCAgMTIsIDQsICAxMywgNCwgIDE0LCA0LCAgMTUsIDQsICAxNiwgNSwKKyAgICAwLCAgNSwgIDEsICA1LCAgMiwgIDUsICAzLCAgNSwgIDQsICA1LCAgNSwgIDUsICA2LCAgNSwgIDcsICA1LCAgOCwgIDUsICA5LAorICAgIDUsICAxMCwgNSwgIDExLCA1LCAgMTIsIDUsICAxMywgNSwgIDE0LCA1LCAgMTUsIDUsICAxNiwgNiwgIDAsICA2LCAgMSwgIDYsCisgICAgMiwgIDYsICAzLCAgNiwgIDQsICA2LCAgNSwgIDYsICA2LCAgNiwgIDcsICA2LCAgOCwgIDYsICA5LCAgNiwgIDEwLCA2LCAgMTEsCisgICAgNiwgIDEyLCA2LCAgMTMsIDYsICAxNCwgNiwgIDE1LCA2LCAgMTYsIDcsICAwLCAgNywgIDEsICA3LCAgMiwgIDcsICAzLCAgNywKKyAgICA0LCAgNywgIDUsICA3LCAgNiwgIDcsICA3LCAgNywgIDgsICA3LCAgOSwgIDcsICAxMCwgNywgIDExLCA3LCAgMTIsIDcsICAxMywKKyAgICA3LCAgMTQsIDcsICAxNSwgNywgIDE2LCA4LCAgMCwgIDgsICAxLCAgOCwgIDIsICA4LCAgMywgIDgsICA0LCAgOCwgIDUsICA4LAorICAgIDYsICA4LCAgNywgIDgsICA4LCAgOCwgIDksICA4LCAgMTAsIDgsICAxMSwgOCwgIDEyLCA4LCAgMTMsIDgsICAxNCwgOCwgIDE1LAorICAgIDgsICAxNiwgOSwgIDAsICA5LCAgMSwgIDksICAyLCAgOSwgIDMsICA5LCAgNCwgIDksICA1LCAgOSwgIDYsICA5LCAgNywgIDksCisgICAgOCwgIDksICA5LCAgOSwgIDEwLCA5LCAgMTEsIDksICAxMiwgOSwgIDEzLCA5LCAgMTQsIDksICAxNSwgOSwgIDE2LCAxMCwgMCwKKyAgICAxMCwgMSwgIDEwLCAyLCAgMTAsIDMsICAxMCwgNCwgIDEwLCA1LCAgMTAsIDYsICAxMCwgNywgIDEwLCA4LCAgMTAsIDksICAxMCwKKyAgICAxMCwgMTAsIDExLCAxMCwgMTIsIDEwLCAxMywgMTAsIDE0LCAxMCwgMTUsIDEwLCAxNiwgMTEsIDAsICAxMSwgMSwgIDExLCAyLAorICAgIDExLCAzLCAgMTEsIDQsICAxMSwgNSwgIDExLCA2LCAgMTEsIDcsICAxMSwgOCwgIDExLCA5LCAgMTEsIDEwLCAxMSwgMTEsIDExLAorICAgIDEyLCAxMSwgMTMsIDExLCAxNCwgMTEsIDE1LCAxMSwgMTYsIDEyLCAwLCAgMTIsIDEsICAxMiwgMiwgIDEyLCAzLCAgMTIsIDQsCisgICAgMTIsIDUsICAxMiwgNiwgIDEyLCA3LCAgMTIsIDgsICAxMiwgOSwgIDEyLCAxMCwgMTIsIDExLCAxMiwgMTIsIDEyLCAxMywgMTIsCisgICAgMTQsIDEyLCAxNSwgMTIsIDE2LCAxMywgMCwgIDEzLCAxLCAgMTMsIDIsICAxMywgMywgIDEzLCA0LCAgMTMsIDUsICAxMywgNiwKKyAgICAxMywgNywgIDEzLCA4LCAgMTMsIDksICAxMywgMTAsIDEzLCAxMSwgMTMsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTMsIDE1LCAxMywKKyAgICAxNiwgMTQsIDAsICAxNCwgMSwgIDE0LCAyLCAgMTQsIDMsICAxNCwgNCwgIDE0LCA1LCAgMTQsIDYsICAxNCwgNywgIDE0LCA4LAorICAgIDE0LCA5LCAgMTQsIDEwLCAxNCwgMTEsIDE0LCAxMiwgMTQsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTQsIDE2LCAxNSwgMCwgIDE1LAorICAgIDEsICAxNSwgMiwgIDE1LCAzLCAgMTUsIDQsICAxNSwgNSwgIDE1LCA2LCAgMTUsIDcsICAxNSwgOCwgIDE1LCA5LCAgMTUsIDEwLAorICAgIDE1LCAxMSwgMTUsIDEyLCAxNSwgMTMsIDE1LCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LCAwLCAgMTYsIDEsICAxNiwgMiwgIDE2LAorICAgIDMsICAxNiwgNCwgIDE2LCA1LCAgMTYsIDYsICAxNiwgNywgIDE2LCA4LCAgMTYsIDksICAxNiwgMTAsIDE2LCAxMSwgMTYsIDEyLAorICAgIDE2LCAxMywgMTYsIDE0LCAxNiwgMTUsIDE2LCAxNn07CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNiICAgIHF1YW50LiB2YWwgdGFibGUgKi8KLWNvbnN0IFNDSEFSICAqYVF1YW50VGFibGVbXSA9IHthVmFsVGFiNDEsICAgIC8qIDAgICAgICAgICAgICAgLSAgICAgICAgKi8gIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDEgICAgICAgICAgICAgMSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDIgICAgICAgICAgICAgMSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDIsICAgIC8qIDMgICAgICAgICAgICAgMiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDIsICAgIC8qIDQgICAgICAgICAgICAgMiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjEsICAgIC8qIDUgICAgICAgICAgICAgMyAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjEsICAgIC8qIDYgICAgICAgICAgICAgMyAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjIsICAgIC8qIDcgICAgICAgICAgICAgNCAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjIsICAgIC8qIDggICAgICAgICAgICAgNCAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjMsICAgIC8qIDkgICAgICAgICAgICAgNSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjMsICAgIC8qIDEwICAgICAgICAgICAgNSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDExICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDEyICAgICAgICAgICAgLSAgICAgICAgKi8gIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDEzICAgICAgICAgICAgLSAgICAgICAgKi8gIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDE0ICAgICAgICAgICAgLSAgICAgICAgKi8gIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDE1ICAgICAgICAgICAgLSAgICAgICAgKi8gIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDE2ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDE3ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDE4ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDE5ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDIwICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDIxICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDIyICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDIzICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI0ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI1ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI2ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI3ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI4ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI5ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDMwICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjR9OyAgIC8qIDMxICAgICAgICAgICAgNiAgICAgICAgKi8KKy8qIGNiICAgIHF1YW50LiB2YWwgdGFibGUgKi8KK2NvbnN0IFNDSEFSICphUXVhbnRUYWJsZVtdID0geworICAgIGFWYWxUYWI0MSwKKyAgICAvKiAwICAgICAgICAgICAgIC0gICAgICAgICovIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KKyAgICBhVmFsVGFiNDEsICAgICAgICAgICAgICAgICAgIC8qIDEgICAgICAgICAgICAgMSAgICAgICAgKi8KKyAgICBhVmFsVGFiNDEsICAgICAgICAgICAgICAgICAgIC8qIDIgICAgICAgICAgICAgMSAgICAgICAgKi8KKyAgICBhVmFsVGFiNDIsICAgICAgICAgICAgICAgICAgIC8qIDMgICAgICAgICAgICAgMiAgICAgICAgKi8KKyAgICBhVmFsVGFiNDIsICAgICAgICAgICAgICAgICAgIC8qIDQgICAgICAgICAgICAgMiAgICAgICAgKi8KKyAgICBhVmFsVGFiMjEsICAgICAgICAgICAgICAgICAgIC8qIDUgICAgICAgICAgICAgMyAgICAgICAgKi8KKyAgICBhVmFsVGFiMjEsICAgICAgICAgICAgICAgICAgIC8qIDYgICAgICAgICAgICAgMyAgICAgICAgKi8KKyAgICBhVmFsVGFiMjIsICAgICAgICAgICAgICAgICAgIC8qIDcgICAgICAgICAgICAgNCAgICAgICAgKi8KKyAgICBhVmFsVGFiMjIsICAgICAgICAgICAgICAgICAgIC8qIDggICAgICAgICAgICAgNCAgICAgICAgKi8KKyAgICBhVmFsVGFiMjMsICAgICAgICAgICAgICAgICAgIC8qIDkgICAgICAgICAgICAgNSAgICAgICAgKi8KKyAgICBhVmFsVGFiMjMsICAgICAgICAgICAgICAgICAgIC8qIDEwICAgICAgICAgICAgNSAgICAgICAgKi8KKyAgICBhVmFsVGFiMjQsICAgICAgICAgICAgICAgICAgIC8qIDExICAgICAgICAgICAgNiAgICAgICAgKi8KKyAgICBhVmFsVGFiNDEsCisgICAgLyogMTIgICAgICAgICAgICAtICAgICAgICAqLyAvKiB1c2UgcXVhbnQuIHZhbCB0YWxibGUgMSBhcyBkdW1teSBoZXJlICovCisgICAgYVZhbFRhYjQxLAorICAgIC8qIDEzICAgICAgICAgICAgLSAgICAgICAgKi8gLyogdXNlIHF1YW50LiB2YWwgdGFsYmxlIDEgYXMgZHVtbXkgaGVyZSAqLworICAgIGFWYWxUYWI0MSwKKyAgICAvKiAxNCAgICAgICAgICAgIC0gICAgICAgICovIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KKyAgICBhVmFsVGFiNDEsCisgICAgLyogMTUgICAgICAgICAgICAtICAgICAgICAqLyAvKiB1c2UgcXVhbnQuIHZhbCB0YWxibGUgMSBhcyBkdW1teSBoZXJlICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAxNiAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAxNyAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAxOCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAxOSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyMCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyMSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyMiAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyMyAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyNCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyNSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyNiAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyNyAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyOCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyOSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAzMCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0fTsgICAgICAgICAgICAgICAgICAvKiAzMSAgICAgICAgICAgIDYgICAgICAgICovCiAKIC8qIGFycmF5cyBmb3IgSENSX1RBQkxFX0lORk8gc3RydWN0dXJlcyAqLwogLyogbWF4aW11bSBsZW5ndGggb2YgY29kZXdvcmQgaW4gZWFjaCBjb2RlYm9vayAqLwotLyogY29kZWJvb2s6ICAgICAgICAgICAgICAgICAgICAgMCwxLCAyLDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxICovCi1jb25zdCBVQ0hBUiAgIGFNYXhDd0xlbltNQVhfQ0JdPXswLDExLDksMjAsMTYsMTMsMTEsMTQsMTIsMTcsMTQsNDksMCwgMCwgMCwgMCwgMTQsMTcsMjEsMjEsMjUsMjUsMjksMjksMjksMjksMzMsMzMsMzMsMzcsMzcsNDF9OworLyogY29kZWJvb2s6ICAgICAgICAgICAgICAgICAgICAgMCwxLCAyLDMsIDQsIDUsIDYsIDcsIDgsIDksCisgKiAxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSAqLworY29uc3QgVUNIQVIgYU1heEN3TGVuW01BWF9DQl0gPSB7MCwgIDExLCA5LCAgMjAsIDE2LCAxMywgMTEsIDE0LCAxMiwgMTcsIDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDksIDAsICAwLCAgMCwgIDAsICAxNCwgMTcsIDIxLCAyMSwgMjUsIDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksIDI5LCAyOSwgMjksIDMzLCAzMywgMzMsIDM3LCAzNywgNDF9OwogCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgIDEzICAxNSAgMTcgIDE5ICAyMSAgMjMgIDI1ICAyNyAgMzkgIDMxICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQjogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgIDEyICAxNCAgMTYgIDE4ICAyMCAgMjIgIDI0ICAyNiAgMjggIDMwICAgICAgICovCi1jb25zdCBVQ0hBUiAgIGFEaW1DYltNQVhfQ0JdICA9ICAgezIsNCw0LDQsNCwyLDIsMiwyLDIsMiwyLDEsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMn07ICAgLyogY29kZWJvb2sgZGltZW5zaW9uIC0gemVybyBjYiBnb3QgYSBkaW1lbnNpb24gb2YgMiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAxMyAgMTUgIDE3ICAxOQorICogMjEgIDIzICAyNSAgMjcgIDM5ICAzMSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwICAxMiAgMTQgIDE2ICAxOCAgMjAKKyAqIDIyICAyNCAgMjYgIDI4ICAzMCAgICAgICAqLworY29uc3QgVUNIQVIgYURpbUNiW01BWF9DQl0gPSB7CisgICAgMiwgNCwgNCwgNCwgNCwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyfTsgLyogY29kZWJvb2sgZGltZW5zaW9uIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvIGNiIGdvdCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uIG9mIDIgKi8KIAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAxMyAgMTUgIDE3ICAxOSAgMjEgIDIzICAyNSAgMjcgIDM5ICAzMSAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwICAxMiAgMTQgIDE2ICAxOCAgMjAgIDIyICAyNCAgMjYgIDI4ICAzMCAgICAgICAqLwotY29uc3QgVUNIQVIgICBhRGltQ2JTaGlmdFtNQVhfQ0JdPXsxLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9OyAgIC8qIGNvZGVib29rIGRpbWVuc2lvbiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAxMyAgMTUgIDE3ICAxOQorICogMjEgIDIzICAyNSAgMjcgIDM5ICAzMSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwICAxMiAgMTQgIDE2ICAxOCAgMjAKKyAqIDIyICAyNCAgMjYgIDI4ICAzMCAgICAgICAqLworY29uc3QgVUNIQVIgYURpbUNiU2hpZnRbTUFYX0NCXSA9IHsKKyAgICAxLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OyAvKiBjb2RlYm9vayBkaW1lbnNpb24gKi8KIAotLyogICAgICAgICAgICAgICAxIC0+IGRlY29kZSBzaWduIGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgIDAgLT4gZGVjb2RlIG5vIHNpZ24gYml0cyAgICAgICAgICAgICAgICAxMSAgMTMgIDE1ICAxNyAgMTkgIDIxICAyMyAgMjUgIDI3ICAzOSAgMzEgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwICAxMiAgMTQgIDE2ICAxOCAgMjAgIDIyICAyNCAgMjYgIDI4ICAzMCAgICAgICAqLwotY29uc3QgVUNIQVIgICBhU2lnbkNiW01BWF9DQl09ezAsMCwwLDEsMSwwLDAsMSwxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMX07CisvKiAgICAgICAgICAgICAgIDEgLT4gZGVjb2RlIHNpZ24gYml0cyAqLworLyogICAgICAgICAgICAgICAwIC0+IGRlY29kZSBubyBzaWduIGJpdHMgICAgICAgICAgICAgICAgMTEgIDEzICAxNSAgMTcgIDE5ICAyMQorICogMjMgIDI1ICAyNyAgMzkgIDMxICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIENCOiAgMCAxIDIgMyA0IDUgNiA3IDggOSAxMCAgMTIgIDE0ICAxNiAgMTggIDIwICAyMgorICogMjQgIDI2ICAyOCAgMzAgICAgICAgKi8KK2NvbnN0IFVDSEFSIGFTaWduQ2JbTUFYX0NCXSA9IHswLCAwLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OwogCiAvKiBhcnJheXMgZm9yIEhDUl9DQl9QQUlSUyBzdHJ1Y3R1cmVzICovCi1jb25zdCBVQ0hBUiAgIGFNaW5PZkNiUGFpcltNQVhfQ0JfUEFJUlNdPXswLDEsMyw1LDcsIDksMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMTF9OwotY29uc3QgVUNIQVIgICBhTWF4T2ZDYlBhaXJbTUFYX0NCX1BBSVJTXT17MCwyLDQsNiw4LDEwLDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDExfTsKK2NvbnN0IFVDSEFSIGFNaW5PZkNiUGFpcltNQVhfQ0JfUEFJUlNdID0gezAsICAxLCAgMywgIDUsICA3LCAgOSwgIDE2LCAxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDExfTsKK2NvbnN0IFVDSEFSIGFNYXhPZkNiUGFpcltNQVhfQ0JfUEFJUlNdID0gezAsICAyLCAgNCwgIDYsICA4LCAgMTAsIDE2LCAxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDExfTsKIAogLyogcHJpb3JpdGllcyBvZiBjb2RlYm9va3MgKi8KLWNvbnN0IFVDSEFSICAgYUNiUHJpb3JpdHlbTUFYX0NCXT17MCwxLDEsMiwyLDMsMyw0LDQsNSw1LDIyLDAsMCwwLDAsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMX07Citjb25zdCBVQ0hBUiBhQ2JQcmlvcml0eVtNQVhfQ0JdID0gezAsICAxLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMiwgMCwgIDAsICAwLCAgMCwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxfTsKIAotY29uc3QgU0NIQVIgICBhQ29kZWJvb2syU3RhcnRJbnRbXSA9IHtTVE9QX1RISVNfU1RBVEUgICAgLCAgICAvKiBjYiAgMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX09OTFkgICAgICAgICAgLCAgICAvKiBjYiAgMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX09OTFkgICAgICAgICAgLCAgICAvKiBjYiAgMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAgMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAgNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX09OTFkgICAgICAgICAgLCAgICAvKiBjYiAgNSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX09OTFkgICAgICAgICAgLCAgICAvKiBjYiAgNiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAgNyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAgOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAgOSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAxMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAxMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9QX1RISVNfU1RBVEUgICAgLCAgICAvKiBjYiAxMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9QX1RISVNfU1RBVEUgICAgLCAgICAvKiBjYiAxMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9QX1RISVNfU1RBVEUgICAgLCAgICAvKiBjYiAxNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9QX1RISVNfU1RBVEUgICAgLCAgICAvKiBjYiAxNSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAxNiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAxNyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAxOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAxOSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyNSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyNiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyNyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyOSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAzMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZfTsgICAvKiBjYiAzMSAqLworY29uc3QgU0NIQVIgYUNvZGVib29rMlN0YXJ0SW50W10gPSB7U1RPUF9USElTX1NUQVRFLCAgICAgIC8qIGNiICAwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX09OTFksICAgICAgICAgICAgLyogY2IgIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfT05MWSwgICAgICAgICAgICAvKiBjYiAgMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19CT0RZLCAgICAgIC8qIGNiICAzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFksICAgICAgLyogY2IgIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfT05MWSwgICAgICAgICAgICAvKiBjYiAgNSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9PTkxZLCAgICAgICAgICAgIC8qIGNiICA2ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFksICAgICAgLyogY2IgIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9fQk9EWSwgICAgICAvKiBjYiAgOCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19CT0RZLCAgICAgIC8qIGNiICA5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFksICAgICAgLyogY2IgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAxMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUF9USElTX1NUQVRFLCAgICAgIC8qIGNiIDEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9QX1RISVNfU1RBVEUsICAgICAgLyogY2IgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUT1BfVEhJU19TVEFURSwgICAgICAvKiBjYiAxNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUF9USElTX1NUQVRFLCAgICAgIC8qIGNiIDE1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgLyogY2IgMTYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAxNyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgIC8qIGNiIDE4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgLyogY2IgMTkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAyMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgIC8qIGNiIDIxICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgLyogY2IgMjIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAyMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgIC8qIGNiIDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgLyogY2IgMjUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAyNiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgIC8qIGNiIDI3ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgLyogY2IgMjggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAyOSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgIC8qIGNiIDMwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZfTsgLyogY2IgMzEgKi8KIAotY29uc3QgU1RBVEVGVU5DIGFTdGF0ZUNvbnN0YW50MlN0YXRlW10gPSB7TlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICAgIC8qICAwID0gU1RPUF9USElTX1NUQVRFICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfT05MWSAgICAgICAgICAgICAgICAsICAgIC8qICAxID0gQk9EWV9PTkxZICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9fQk9EWSAgICAgICAgICAsICAgIC8qICAyID0gQk9EWV9TSUdOX19CT0RZICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9fU0lHTiAgICAgICAgICAsICAgIC8qICAzID0gQk9EWV9TSUdOX19TSUdOICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0JPRFkgICAgICAsICAgIC8qICA0ID0gQk9EWV9TSUdOX0VTQ19fQk9EWSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX1NJR04gICAgICAsICAgIC8qICA1ID0gQk9EWV9TSUdOX0VTQ19fU0lHTiAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVgsICAgIC8qICA2ID0gQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEICB9OyAgIC8qICA3ID0gQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQgICAqLworY29uc3QgU1RBVEVGVU5DIGFTdGF0ZUNvbnN0YW50MlN0YXRlW10gPSB7CisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAwID0gU1RPUF9USElTX1NUQVRFICAgICAgICAgICAqLworICAgIEhjcl9TdGF0ZV9CT0RZX09OTFksICAgICAgICAgICAgICAgICAvKiAgMSA9IEJPRFlfT05MWSAgICAgICAgICAgICAgICAgKi8KKyAgICBIY3JfU3RhdGVfQk9EWV9TSUdOX19CT0RZLCAgICAgICAgICAgLyogIDIgPSBCT0RZX1NJR05fX0JPRFkgICAgICAgICAgICovCisgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9fU0lHTiwgICAgICAgICAgIC8qICAzID0gQk9EWV9TSUdOX19TSUdOICAgICAgICAgICAqLworICAgIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19CT0RZLCAgICAgICAvKiAgNCA9IEJPRFlfU0lHTl9FU0NfX0JPRFkgICAgICAgKi8KKyAgICBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fU0lHTiwgICAgICAgLyogIDUgPSBCT0RZX1NJR05fRVNDX19TSUdOICAgICAgICovCisgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVgsIC8qICA2ID0gQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWCAqLworICAgIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19FU0NfV09SRH07ICAvKiAgNyA9IEJPRFlfU0lHTl9FU0NfX0VTQ19XT1JEICAgKi8KIAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAwIDEgMiAzIDQgNSA2IDcgOCAgOSAxMCAgICAgIDEyICAgIDE0ICAgIDE2ICAgIDE4ICAgIDIwICAgICAgMjIgICAgICAyNCAgICAgIDI2ICAgICAgMjggICAgICAgMzAgICAgICAgICAqLwotY29uc3QgVVNIT1JUIGFMYXJnZXN0QWJzb2x1dGVWYWx1ZVtNQVhfQ0JdPXswLDEsMSwyLDIsNCw0LDcsNywxMiwxMiw4MTkxLCAwLCAwLCAwLCAwLDE1LDMxLDQ3LDYzLDk1LDEyNywxNTksMTkxLDIyMywyNTUsMzE5LDM4Myw1MTEsNzY3LDEwMjMsMjA0N307IC8qIGxhdiAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgIDEzICAgIDE1ICAgIDE3ICAgIDE5ICAgICAyMSAgICAgIDIzICAgICAgMjUgICAgICAyNyAgICAgIDM5ICAgICAgIDMxICAgICAqLwotCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQjogIDAgMSAyIDMgNCA1IDYgNyA4ICA5IDEwICAgICAgMTIKKyAqIDE0ICAgIDE2ICAgIDE4ICAgIDIwICAgICAgMjIgICAgICAyNCAgICAgIDI2ICAgICAgMjggICAgICAgMzAgICAgICAgICAqLworY29uc3QgVVNIT1JUIGFMYXJnZXN0QWJzb2x1dGVWYWx1ZVtNQVhfQ0JdID0geworICAgIDAsICAgIDEsICAgMSwgICAyLCAgIDIsICAgNCwgICA0LCAgIDcsICAgNywgICAgMTIsICAxMiwKKyAgICA4MTkxLCAwLCAgIDAsICAgMCwgICAwLCAgIDE1LCAgMzEsICA0NywgIDYzLCAgIDk1LCAgMTI3LAorICAgIDE1OSwgIDE5MSwgMjIzLCAyNTUsIDMxOSwgMzgzLCA1MTEsIDc2NywgMTAyMywgMjA0N307IC8qIGxhdiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgIDEzCisgKiAxNSAgICAxNyAgICAxOSAgICAgMjEgICAgICAyMyAgICAgIDI1ICAgICAgMjcgICAgICAzOSAgICAgICAzMSAgICAgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBkZXNjcmlwdGlvbjogICAgVGhlIHRhYmxlICdIdWZmVHJlZVJ2bGNFc2NhcGUnIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3IgdGhlIHJ2bGMKLSAgICAgICAgICAgICAgICAgICBlc2NhcGUgc2VxdWVuY2VzLgotICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQKLSAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgIC0tPiAgaWYgc2V0IGNvZGV3b3JkIGlzIGRlY29kZWQKLSAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlKQotICAgICAgICAgICAgICAgICAgIFRoZSBlc2NhcGUgc2VxdWVuY2UgaXMgdGhlIGluZGV4IHZhbHVlLgorICAgZGVzY3JpcHRpb246ICAgIFRoZSB0YWJsZSAnSHVmZlRyZWVSdmxjRXNjYXBlJyBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yCit0aGUgcnZsYyBlc2NhcGUgc2VxdWVuY2VzLiBiaXQgMjMgYW5kIDExIG5vdCB1c2VkIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZAordmFsdWUgIC0tPiAgaWYgc2V0IGNvZGV3b3JkIGlzIGRlY29kZWQgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpCitvciAoaW5kZXggdmFsdWUpIFRoZSBlc2NhcGUgc2VxdWVuY2UgaXMgdGhlIGluZGV4IHZhbHVlLgogCiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQKICAgIG91dHB1dDogICAgICAgICBpbmRleAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBVSU5UIGFIdWZmVHJlZVJ2bGNFc2NhcGVbNTNdID0geyAweDAwMjAwMSwweDQwMDAwMywweDQwMTAwNCwweDQwMjAwNSwweDQwMzAwNywweDQwNDAwNiwweDAwYTQwNSwweDAwOTAwOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBiNDA2LDB4MDBjNDA3LDB4MDBkNDA4LDB4MDBlNDA5LDB4NDBiNDBhLDB4NDBjMDBmLDB4NDBkMDEwLDB4NDBlMDExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MGYwMTIsMHg0MTAwMTMsMHg0MTEwMTQsMHg0MTIwMTUsMHgwMTY0MTMsMHg0MTQ0MTUsMHgwMTc0MTYsMHg0MTcwMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxOTAxOSwweDAxYTQxOCwweDAxYjQxYSwweDAxYzAyMywweDAzMjAxZCwweDAxZTAyMCwweDQzNTAxZiwweDQxYjQxYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMDIyLDB4NDFkNDFlLDB4NDFmNDIwLDB4MDI0MDJiLDB4MDI1MDI4LDB4MDI2MDI3LDB4NDIxNDIyLDB4NDIzNDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjkwMmEsMHg0MjU0MjYsMHg0Mjc0MjgsMHgwMmMwMmYsMHgwMmQwMmUsMHg0Mjk0MmEsMHg0MmI0MmMsMHgwMzAwMzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyZDQyZSwweDQyZjQzMCwweDAzMzAzNCwweDQzMTQzMiwweDQzMzQzNCB9OworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworY29uc3QgVUlOVCBhSHVmZlRyZWVSdmxjRXNjYXBlWzUzXSA9IHsKKyAgICAweDAwMjAwMSwgMHg0MDAwMDMsIDB4NDAxMDA0LCAweDQwMjAwNSwgMHg0MDMwMDcsIDB4NDA0MDA2LCAweDAwYTQwNSwKKyAgICAweDAwOTAwOCwgMHgwMGI0MDYsIDB4MDBjNDA3LCAweDAwZDQwOCwgMHgwMGU0MDksIDB4NDBiNDBhLCAweDQwYzAwZiwKKyAgICAweDQwZDAxMCwgMHg0MGUwMTEsIDB4NDBmMDEyLCAweDQxMDAxMywgMHg0MTEwMTQsIDB4NDEyMDE1LCAweDAxNjQxMywKKyAgICAweDQxNDQxNSwgMHgwMTc0MTYsIDB4NDE3MDE4LCAweDQxOTAxOSwgMHgwMWE0MTgsIDB4MDFiNDFhLCAweDAxYzAyMywKKyAgICAweDAzMjAxZCwgMHgwMWUwMjAsIDB4NDM1MDFmLCAweDQxYjQxYywgMHgwMjEwMjIsIDB4NDFkNDFlLCAweDQxZjQyMCwKKyAgICAweDAyNDAyYiwgMHgwMjUwMjgsIDB4MDI2MDI3LCAweDQyMTQyMiwgMHg0MjM0MjQsIDB4MDI5MDJhLCAweDQyNTQyNiwKKyAgICAweDQyNzQyOCwgMHgwMmMwMmYsIDB4MDJkMDJlLCAweDQyOTQyYSwgMHg0MmI0MmMsIDB4MDMwMDMxLCAweDQyZDQyZSwKKyAgICAweDQyZjQzMCwgMHgwMzMwMzQsIDB4NDMxNDMyLCAweDQzMzQzNH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgZGVzY3JpcHRpb246ICAgIFRoZSB0YWJsZSAnSHVmZlRyZWVSdmxjJyBjb250YWlucyB0aGUgaHVmZm1hbiBkZWNvZGluZyB0cmVlIGZvciB0aGUgUlZMQwotICAgICAgICAgICAgICAgICAgIHNjYWxlIGZhY3RvcnMuIFRoZSB0YWJsZSBjb250YWlucyAxNSBhbGxvd2VkLCBzeW1tZXRyaWMgY29kZXdvcmRzIGFuZCA4Ci0gICAgICAgICAgICAgICAgICAgZm9yYmlkZGVuIGNvZGV3b3Jkcywgd2hpY2ggYXJlIHVzZWQgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgIGRlc2NyaXB0aW9uOiAgICBUaGUgdGFibGUgJ0h1ZmZUcmVlUnZsYycgY29udGFpbnMgdGhlIGh1ZmZtYW4gZGVjb2RpbmcgdHJlZQorZm9yIHRoZSBSVkxDIHNjYWxlIGZhY3RvcnMuIFRoZSB0YWJsZSBjb250YWlucyAxNSBhbGxvd2VkLCBzeW1tZXRyaWMgY29kZXdvcmRzCithbmQgOCBmb3JiaWRkZW4gY29kZXdvcmRzLCB3aGljaCBhcmUgdXNlZCBmb3IgZXJyb3IgZGV0ZWN0aW9uLgogCiAgICB1c2FnZSBvZiBiaXRzOiAgYml0IDIzIGFuZCAxMSBub3QgdXNlZAotICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgLS0+ICBpZiBzZXQgY29kZXdvcmQgaXMgZGVjb2RlZAotICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlIHdpdGhpbiB0aGUgdGFibGUpIG9yIChpbmRleCs3KS4KLSAgICAgICAgICAgICAgICAgICBUaGUgZGVjb2RlZCAoaW5kZXgrNykgaXMgaW4gdGhlIHJhbmdlIGZyb20gMCwxLC4uLDIyLiBJZiB0aGUgKGluZGV4KzcpCi0gICAgICAgICAgICAgICAgICAgaXMgaW4gdGhlIHJhbmdlIDE1LDE2LC4uLDIyLCB0aGVuIGEgZm9yYmlkZGVuIGNvZGV3b3JkIGlzIGRlY29kZWQuCisgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAtLT4gIGlmIHNldCBjb2Rld29yZCBpcworZGVjb2RlZCBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSB3aXRoaW4gdGhlIHRhYmxlKSBvciAoaW5kZXgrNykuCisgICAgICAgICAgICAgICAgICAgVGhlIGRlY29kZWQgKGluZGV4KzcpIGlzIGluIHRoZSByYW5nZSBmcm9tIDAsMSwuLiwyMi4gSWYgdGhlCisoaW5kZXgrNykgaXMgaW4gdGhlIHJhbmdlIDE1LDE2LC4uLDIyLCB0aGVuIGEgZm9yYmlkZGVuIGNvZGV3b3JkIGlzIGRlY29kZWQuCiAKICAgIGlucHV0OiAgICAgICAgICBBIHNpbmdsZSBiaXQgZnJvbSBhIFJWTEMgc2NhbGVmYWN0b3IgY29kZXdvcmQKLSAgIG91dHB1dDogICAgICAgICBbaWYgY29kZXdvcmQgaXMgbm90IGNvbXBsZXRlbHkgZGVjb2RlZDpdIG9mZnNldCB0byBuZXh0IG5vZGUgd2l0aGluIHRhYmxlIG9yCi0gICAgICAgICAgICAgICAgICAgW2lmIGNvZGV3b3JkIGlzIGRlY29kZWQ6XSBBIGRwY20gdmFsdWUgaS5lLiAoaW5kZXgrNykgaW4gcmFuZ2UgZnJvbSAwLDEsLi4sMjIuCi0gICAgICAgICAgICAgICAgICAgVGhlIGRpZmZlcmVudGlhbCBzY2FsZWZhY3RvciAoRFBDTSB2YWx1ZSkgbmFtZWQgJ2luZGV4JyBpcyBjYWxjdWxhdGVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgc3VidHJhY3RpbmcgNyBmcm9tIHRoZSBkZWNvZGVkIHZhbHVlIChpbmRleCs3KS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotY29uc3QgVUlOVCBhSHVmZlRyZWVSdmxDb2Rld2RzWzIyXSA9IHsgMHg0MDcwMDEsMHgwMDIwMDksMHgwMDM0MDYsMHgwMDQ0MDUsMHgwMDU0MDQsMHgwMDY0MDMsMHgwMDc0MDAsMHgwMDg0MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxMTQwMSwweDAwYTQwOCwweDAwYzAwYiwweDAwZTQwOSwweDAxMDAwZCwweDQwZjQwYSwweDQxNDAwZiwweDAxMzQwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExMDE1LDB4NDEwMDEyLDB4NDEyNDBjLDB4NDE2MDE0LDB4NDE1NDBkLDB4NDEzNDBlIH07CisgICBvdXRwdXQ6ICAgICAgICAgW2lmIGNvZGV3b3JkIGlzIG5vdCBjb21wbGV0ZWx5IGRlY29kZWQ6XSBvZmZzZXQgdG8gbmV4dCBub2RlCit3aXRoaW4gdGFibGUgb3IgW2lmIGNvZGV3b3JkIGlzIGRlY29kZWQ6XSBBIGRwY20gdmFsdWUgaS5lLiAoaW5kZXgrNykgaW4gcmFuZ2UKK2Zyb20gMCwxLC4uLDIyLiBUaGUgZGlmZmVyZW50aWFsIHNjYWxlZmFjdG9yIChEUENNIHZhbHVlKSBuYW1lZCAnaW5kZXgnIGlzCitjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIDcgZnJvbSB0aGUgZGVjb2RlZCB2YWx1ZSAoaW5kZXgrNykuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitjb25zdCBVSU5UIGFIdWZmVHJlZVJ2bENvZGV3ZHNbMjJdID0geworICAgIDB4NDA3MDAxLCAweDAwMjAwOSwgMHgwMDM0MDYsIDB4MDA0NDA1LCAweDAwNTQwNCwgMHgwMDY0MDMsCisgICAgMHgwMDc0MDAsIDB4MDA4NDAyLCAweDQxMTQwMSwgMHgwMGE0MDgsIDB4MDBjMDBiLCAweDAwZTQwOSwKKyAgICAweDAxMDAwZCwgMHg0MGY0MGEsIDB4NDE0MDBmLCAweDAxMzQwYiwgMHgwMTEwMTUsIDB4NDEwMDEyLAorICAgIDB4NDEyNDBjLCAweDQxNjAxNCwgMHg0MTU0MGQsIDB4NDEzNDBlfTsKIAorY29uc3QgRklYUF9XVEIgTG93RGVsYXlTeW50aGVzaXMyNTZbNzY4XSA9IHsKKyAgICBXVEMoMHhkYWVjYjg4YSksIFdUQygweGRiN2E1MjMwKSwgV1RDKDB4ZGMwOTM5NjEpLCBXVEMoMHhkYzk5NzdiNSksCisgICAgV1RDKDB4ZGQyYjExYjQpLCBXVEMoMHhkZGJlMDZjMSksIFdUQygweGRlNTI1Mjc3KSwgV1RDKDB4ZGVlN2YxNjcpLAorICAgIFdUQygweGRmN2VlMmY5KSwgV1RDKDB4ZTAxNzMyMDcpLCBXVEMoMHhlMGIwZTcwZSksIFdUQygweGUxNGJlYjRkKSwKKyAgICBXVEMoMHhlMWU4MjAwMiksIFdUQygweGUyODU2OTNkKSwgV1RDKDB4ZTMyM2JhM2MpLCBXVEMoMHhlM2MzM2NkYiksCisgICAgV1RDKDB4ZTQ2NDBjOTMpLCBXVEMoMHhlNTA2MGIzZiksIFdUQygweGU1YTkxNWNlKSwgV1RDKDB4ZTY0Y2ZmYzIpLAorICAgIFdUQygweGU2ZjE5ODY4KSwgV1RDKDB4ZTc5NmI0ZDcpLCBXVEMoMHhlODNjMmViZiksIFdUQygweGU4ZTFlZWExKSwKKyAgICBXVEMoMHhlOTg3Zjc4NCksIFdUQygweGVhMmU4MDE0KSwgV1RDKDB4ZWFkNWEyYjYpLCBXVEMoMHhlYjdkMzQ3NiksCisgICAgV1RDKDB4ZWMyNGViZmIpLCBXVEMoMHhlY2NjNGU5YSksIFdUQygweGVkNzJmNzIzKSwgV1RDKDB4ZWUxOGI1ODUpLAorICAgIFdUQygweGVlYmQ2OTAyKSwgV1RDKDB4ZWY2MTA2NjEpLCBXVEMoMHhmMDAzN2Y0MSksIFdUQygweGYwYTRjMTM5KSwKKyAgICBXVEMoMHhmMTQ0YzViYyksIFdUQygweGYxZTM5NWM0KSwgV1RDKDB4ZjI4MTJjNWQpLCBXVEMoMHhmMzFkNmRiNCksCisgICAgV1RDKDB4ZjNiODNlZDApLCBXVEMoMHhmNDUxNzk2MyksIFdUQygweGY0ZThkNjcyKSwgV1RDKDB4ZjU3ZGU0OTUpLAorICAgIFdUQygweGY2MTAzOTVlKSwgV1RDKDB4ZjY5ZjdlODQpLCBXVEMoMHhmNzJiOTE1MiksIFdUQygweGY3YjQ5NWI1KSwKKyAgICBXVEMoMHhmODNhZjQ1MyksIFdUQygweGY4YmY3MTE4KSwgV1RDKDB4Zjk0MjlhMzMpLCBXVEMoMHhmOWM0YzE4MyksCisgICAgV1RDKDB4ZmE0NjY1OTIpLCBXVEMoMHhmYWM4MDg2NyksIFdUQygweGZiNDlkMmJkKSwgV1RDKDB4ZmJjYjcyOTQpLAorICAgIFdUQygweGZjNGQwZTM1KSwgV1RDKDB4ZmNjZjdlN2IpLCBXVEMoMHhmZDUzYWY5NyksIFdUQygweGZkZGFiNWNhKSwKKyAgICBXVEMoMHhmZTYyOWE1NiksIFdUQygweGZlZTVjN2M5KSwgV1RDKDB4ZmY1YjYzMTEpLCBXVEMoMHhmZmI2YmQ0NSksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweGJmZjZjODQ1KSwgV1RDKDB4YmZlNDYxZWUpLCBXVEMoMHhiZmQxZjU4NiksIFdUQygweGJmYmY4NWIyKSwKKyAgICBXVEMoMHhiZmFkMTUxOCksIFdUQygweGJmOWFhNjQwKSwgV1RDKDB4YmY4ODM5MTEpLCBXVEMoMHhiZjc1Y2FmMCksCisgICAgV1RDKDB4YmY2MzVjNGIpLCBXVEMoMHhiZjUwZjA5YiksIFdUQygweGJmM2U4ODZkKSwgV1RDKDB4YmYyYzIxNjcpLAorICAgIFdUQygweGJmMTliYzJjKSwgV1RDKDB4YmYwNzVjNjQpLCBXVEMoMHhiZWY1MDJkYiksIFdUQygweGJlZTJhZDgzKSwKKyAgICBXVEMoMHhiZWQwNWQ2NyksIFdUQygweGJlYmUxNmE3KSwgV1RDKDB4YmVhYmRhNDYpLCBXVEMoMHhiZTk5YTYyZSksCisgICAgV1RDKDB4YmU4NzdiOTApLCBXVEMoMHhiZTc1NWVlOCksIFdUQygweGJlNjM1MTdkKSwgV1RDKDB4YmU1MTUxNWIpLAorICAgIFdUQygweGJlM2Y1ZmM5KSwgV1RDKDB4YmUyZDgxNDEpLCBXVEMoMHhiZTFiYjcyMSksIFdUQygweGJlMDlmZmEzKSwKKyAgICBXVEMoMHhiZGY4NWMxNyksIFdUQygweGJkZTZkMGUzKSwgV1RDKDB4YmRkNTVmNDcpLCBXVEMoMHhiZGM0MDU1ZCksCisgICAgV1RDKDB4YmRiMmM0MzgpLCBXVEMoMHhiZGExOWZlMCksIFdUQygweGJkOTA5OTQyKSwgV1RDKDB4YmQ3ZmFlMmYpLAorICAgIFdUQygweGJkNmVkZjhkKSwgV1RDKDB4YmQ1ZTMxNTMpLCBXVEMoMHhiZDRkYTQ1YiksIFdUQygweGJkM2QzNjVhKSwKKyAgICBXVEMoMHhiZDJjZTdlYiksIFdUQygweGJkMWNiYzg3KSwgV1RDKDB4YmQwY2I0NjYpLCBXVEMoMHhiY2ZjY2M4MCksCisgICAgV1RDKDB4YmNlZDA0YzUpLCBXVEMoMHhiY2RkNjAyMiksIFdUQygweGJjY2RkZTQ5KSwgV1RDKDB4YmNiZTdiYjQpLAorICAgIFdUQygweGJjYWYzN2VjKSwgV1RDKDB4YmNhMDE1OTQpLCBXVEMoMHhiYzkxMTQ5YiksIFdUQygweGJjODIzMjM0KSwKKyAgICBXVEMoMHhiYzczNmQ4MSksIFdUQygweGJjNjRjN2E0KSwgV1RDKDB4YmM1NjQwODUpLCBXVEMoMHhiYzQ3ZDZhOSksCisgICAgV1RDKDB4YmMzOTg2MTcpLCBXVEMoMHhiYzJiNDkxNSksIFdUQygweGJjMWQyYTkyKSwgV1RDKDB4YmMwZjQzNzApLAorICAgIFdUQygweGJjMDE2Nzg1KSwgV1RDKDB4YmJmMzJmNmMpLCBXVEMoMHhiYmU1MzY0OCksIFdUQygweGJiZDkxZWI1KSwKKyAgICBXVEMoMHhiYmQwMmY3YyksIFdUQygweGJiY2I1OGRiKSwgV1RDKDB4YmJjYTVhYzIpLCBXVEMoMHhiYmNiZGVhMiksCisgICAgV1RDKDB4YmJjZWUxOTIpLCBXVEMoMHhiYmQyYzdjMiksIFdUQygweGJiZDdhNjQ4KSwgV1RDKDB4YmJkZTNjNWEpLAorICAgIFdUQygweGJiZTcwNzlmKSwgV1RDKDB4YmJmMjM4YmYpLCBXVEMoMHhiYmZmOGVlYyksIFdUQygweGJjMGU1ZDIyKSwKKyAgICBXVEMoMHhiYzFlMmM4YiksIFdUQygweGJjMmVjM2E0KSwgV1RDKDB4YmM0MDJmMTkpLCBXVEMoMHhiYzUyYzFhYyksCisgICAgV1RDKDB4YmM2NzA5YWEpLCBXVEMoMHhiYzdkY2JjZSksIFdUQygweGJjOTc5MzgzKSwgV1RDKDB4YmNiNGFlMzApLAorICAgIFdUQygweGJjZDUyYWViKSwgV1RDKDB4YmNmOGRiNjMpLCBXVEMoMHhiZDFmNjk5MyksIFdUQygweGJkNDg1YjQ2KSwKKyAgICBXVEMoMHhiZDczNTAwNyksIFdUQygweGJkYTAwM2ZjKSwgV1RDKDB4YmRjZTU1NmMpLCBXVEMoMHhiZGZlNDUzYiksCisgICAgV1RDKDB4YmUyZmZkNGUpLCBXVEMoMHhiZTYzY2ViNyksIFdUQygweGJlOWEwMDZmKSwgV1RDKDB4YmVkMmNlMmIpLAorICAgIFdUQygweGJmMGU3ZDhlKSwgV1RDKDB4YmY0ZDVjZmMpLCBXVEMoMHhiZjhmOTJiZCksIFdUQygweGJmZDUxNjBjKSwKKyAgICBXVEMoMHhjMDFkM2IyNyksIFdUQygweGMwNjZiOGY1KSwgV1RDKDB4YzBiMGEzYjgpLCBXVEMoMHhjMGZhN2NkZCksCisgICAgV1RDKDB4YzE0NGIwZTgpLCBXVEMoMHhjMTkwOGQ3MSksIFdUQygweGMxZGVkNDAzKSwgV1RDKDB4YzIyZmFlNDkpLAorICAgIFdUQygweGMyODMwMDkyKSwgV1RDKDB4YzJkODZjYTgpLCBXVEMoMHhjMzJmNDM0MSksIFdUQygweGMzODY4N2U1KSwKKyAgICBXVEMoMHhjM2RkNWM1NSksIFdUQygweGM0MzMxMGU0KSwgV1RDKDB4YzQ4ODNlY2EpLCBXVEMoMHhjNGRlYmEzZCksCisgICAgV1RDKDB4YzUzNzJjODIpLCBXVEMoMHhjNTkxMDJmYiksIFdUQygweGM1ZWI0MTZhKSwgV1RDKDB4YzY0NDk4NmYpLAorICAgIFdUQygweGM2OWNhYmIyKSwgV1RDKDB4YzZmNDEyOTApLCBXVEMoMHhjNzRiMjJiZiksIFdUQygweGM3YTFlNGI5KSwKKyAgICBXVEMoMHhjN2Y4MzUwMCksIFdUQygweGM4NGRjNzM3KSwgV1RDKDB4YzhhMjRlMDcpLCBXVEMoMHhjOGY1Nzc2ZiksCisgICAgV1RDKDB4YjRkYjRhOGIpLCBXVEMoMHhiM2M1OGEzMiksIFdUQygweGIyYjJhY2I0KSwgV1RDKDB4YjFhMmFmYzApLAorICAgIFdUQygweGIwOTU5MTA3KSwgV1RDKDB4YWY4YjRlMGEpLCBXVEMoMHhhZTgzZGZlZiksIFdUQygweGFkN2YzYmE2KSwKKyAgICBXVEMoMHhhYzdkNWE1NyksIFdUQygweGFiN2UzOTdkKSwgV1RDKDB4YWE4MWQ1YTcpLCBXVEMoMHhhOTg4MmE2NCksCisgICAgV1RDKDB4YTg5MTM1YmMpLCBXVEMoMHhhNzljZjg0ZSksIFdUQygweGE2YWI3NGZjKSwgV1RDKDB4YTViY2IwZDApLAorICAgIFdUQygweGE0ZDBiMWI4KSwgV1RDKDB4YTNlNzdlNmQpLCBXVEMoMHhhMzAxMWUxNiksIFdUQygweGEyMWQ5ODZjKSwKKyAgICBXVEMoMHhhMTNjZjkyMSksIFdUQygweGEwNWY0ZmI5KSwgV1RDKDB4OWY4NGE4NTApLCBXVEMoMHg5ZWFkMGJhZiksCisgICAgV1RDKDB4OWRkODg4OGMpLCBXVEMoMHg5ZDA3MzM4NSksIFdUQygweDljMzkxZGI1KSwgV1RDKDB4OWI2ZTU0ODQpLAorICAgIFdUQygweDlhYTZlNjU2KSwgV1RDKDB4OTllMmUyYzUpLCBXVEMoMHg5OTIyNWFjNCksIFdUQygweDk4NjU2MDhhKSwKKyAgICBXVEMoMHg5N2FjMDU2NCksIFdUQygweDk2ZjY1OTg0KSwgV1RDKDB4OTY0NDZhMjUpLCBXVEMoMHg5NTk2NDE5NiksCisgICAgV1RDKDB4OTRlYmU5ZWMpLCBXVEMoMHg5NDQ1NmQxOSksIFdUQygweDkzYTJkNDZhKSwgV1RDKDB4OTMwNDI4NjQpLAorICAgIFdUQygweDkyNjk2ZGVhKSwgV1RDKDB4OTFkMmE2MzcpLCBXVEMoMHg5MTNmZDEyMCksIFdUQygweDkwYjBlY2ZlKSwKKyAgICBXVEMoMHg5MDI1ZjIzOSksIFdUQygweDhmOWVkMzNlKSwgV1RDKDB4OGYxYjgwNGIpLCBXVEMoMHg4ZTliZTcyYiksCisgICAgV1RDKDB4OGUxZmU5ODQpLCBXVEMoMHg4ZGE3NWNlNCksIFdUQygweDhkMzIxNTExKSwgV1RDKDB4OGNiZmUzODEpLAorICAgIFdUQygweDhjNTA4MDkwKSwgV1RDKDB4OGJlMzhiN2IpLCBXVEMoMHg4Yjc4YTEwYSksIFdUQygweDhiMGY1YmI0KSwKKyAgICBXVEMoMHg4YWE3NDBmMyksIFdUQygweDhhM2ZjNDM5KSwgV1RDKDB4ODlkOGEwOTMpLCBXVEMoMHg4OTcxZTdiZiksCisgICAgV1RDKDB4ODkwZDBmYTgpLCBXVEMoMHg4OGFjZmMzMiksIFdUQygweDg4NTVlMDdhKSwgV1RDKDB4ODgwZDUwMTApLAorICAgIFdUQygweDg3Y2M0NDRjKSwgV1RDKDB4ODdiNmU4NGUpLCBXVEMoMHg4NzllMzcxMyksIFdUQygweDg3ODUwYTg3KSwKKyAgICBXVEMoMHg4NzZjNzZlZSksIFdUQygweDg3NTNjNTVhKSwgV1RDKDB4ODczYWE3MGQpLCBXVEMoMHg4NzIxNDdlNyksCisgICAgV1RDKDB4ODcwN2JiMjMpLCBXVEMoMHg4NmVkZjY0ZiksIFdUQygweDg2ZDNmMjBkKSwgV1RDKDB4ODZiOWFiNjgpLAorICAgIFdUQygweDg2OWYyMWU3KSwgV1RDKDB4ODY4NDU3NDQpLCBXVEMoMHg4NjY5NDk5ZSksIFdUQygweDg2NGRmMzk1KSwKKyAgICBXVEMoMHg4NjMyNTRiMiksIFdUQygweDg2MTY3MTVlKSwgV1RDKDB4ODVmYTQ4NzApLCBXVEMoMHg4NWRkZDMyNCksCisgICAgV1RDKDB4ODVjMTEwOGIpLCBXVEMoMHg4NWE0MDU5NyksIFdUQygweDg1ODZiMWQxKSwgV1RDKDB4ODU2OTBmNDgpLAorICAgIFdUQygweDg1NGIxZGZiKSwgV1RDKDB4ODUyY2UzZTcpLCBXVEMoMHg4NTBlNjFjOCksIFdUQygweDg0ZWY5MzAzKSwKKyAgICBXVEMoMHg4NGQwNzhjMiksIFdUQygweDg0YjExOWZhKSwgV1RDKDB4ODQ5MTc3ZmEpLCBXVEMoMHg4NDcxOGU1NiksCisgICAgV1RDKDB4ODQ1MTVlNjUpLCBXVEMoMHg4NDMwZWY1MyksIFdUQygweDg0MTA0MmNiKSwgV1RDKDB4ODNlZjU0ZTgpLAorICAgIFdUQygweDgzY2UyN2FiKSwgV1RDKDB4ODNhY2MzMGEpLCBXVEMoMHg4MzhiMjkzNCksIFdUQygweDgzNjk1Njg2KSwKKyAgICBXVEMoMHg4MzQ3NGQ0NyksIFdUQygweDgzMjUxNWI2KSwgV1RDKDB4ODMwMmIyMDIpLCBXVEMoMHg4MmUwMWUzYiksCisgICAgV1RDKDB4ODJiZDVjOGUpLCBXVEMoMHg4MjlhNzU1YSksIFdUQygweDgyNzc2YWJmKSwgV1RDKDB4ODI1NDM4OGEpLAorICAgIFdUQygweDgyMzBlMDdlKSwgV1RDKDB4ODIwZDZhNjkpLCBXVEMoMHg4MWU5ZDgyZCksIFdUQygweDgxYzYyNWFlKSwKKyAgICBXVEMoMHg4MWEyNTQ1NSksIFdUQygweDgxN2U2YjFmKSwgV1RDKDB4ODE1YTZiMzkpLCBXVEMoMHg4MTM2NGZlYyksCisgICAgV1RDKDB4ODExMjFhMzQpLCBXVEMoMHg4MGVkZDBjOSksIFdUQygweDgwYzk3NDc5KSwgV1RDKDB4ODBhNTAwMGEpLAorICAgIFdUQygweDgwODA3MzMyKSwgV1RDKDB4ODA1YmQyZTYpLCBXVEMoMHg4MDM3MjQ2MCksIFdUQygweDgwMTI2Y2M0KSwKKyAgICBXVEMoMHgwYThhODQzMSksIFdUQygweDBhZTNjMzI5KSwgV1RDKDB4MGIzZmRhYjIpLCBXVEMoMHgwYjllNmU0NCksCisgICAgV1RDKDB4MGJmZjIxNjEpLCBXVEMoMHgwYzYxOWE3MiksIFdUQygweDBjYzVjNjZkKSwgV1RDKDB4MGQyYmQ2ZGYpLAorICAgIFdUQygweDBkOTNjZjY0KSwgV1RDKDB4MGRmZDg1NDUpLCBXVEMoMHgwZTY5MDkzYSksIFdUQygweDBlZDZhNjM2KSwKKyAgICBXVEMoMHgwZjQ2NWFlYSksIFdUQygweDBmYjdkODEwKSwgV1RDKDB4MTAyYWRlOTkpLCBXVEMoMHgxMDlmNDI0NSksCisgICAgV1RDKDB4MTExNGM5ZTgpLCBXVEMoMHgxMThiMzFiYyksIFdUQygweDEyMDI4MmI4KSwgV1RDKDB4MTI3YjBiZTEpLAorICAgIFdUQygweDEyZjQ2YjlhKSwgV1RDKDB4MTM2ZDhkZGUpLCBXVEMoMHgxM2U1NzkxMiksIFdUQygweDE0NWI1NWNiKSwKKyAgICBXVEMoMHgxNGNlNWIxOCksIFdUQygweDE1M2RjY2QwKSwgV1RDKDB4MTVhOGU3MjQpLCBXVEMoMHgxNjBlZGVmZSksCisgICAgV1RDKDB4MTY2ZjAwNGYpLCBXVEMoMHgxNmM4YWZmNCksIFdUQygweDE3MWI3YWZjKSwgV1RDKDB4MTc2NzNkYjMpLAorICAgIFdUQygweDE3YWZiNzk4KSwgV1RDKDB4MTdmYzYyYTIpLCBXVEMoMHgxODUxMTRjMSksIFdUQygweDE4YWRkNzIyKSwKKyAgICBXVEMoMHgxOTEyNzk4ZCksIFdUQygweDE5N2ViOWEyKSwgV1RDKDB4MTlmMjU2NTcpLCBXVEMoMHgxYTZkMTEzZSksCisgICAgV1RDKDB4MWFlZWI4MjQpLCBXVEMoMHgxYjc3MjNhYiksIFdUQygweDFjMDYwYjc3KSwgV1RDKDB4MWM5YjA5YTEpLAorICAgIFdUQygweDFkMzYxODIyKSwgV1RDKDB4MWRkNzkzM2YpLCBXVEMoMHgxZTdmZjU5MiksIFdUQygweDFmMmZkMGI1KSwKKyAgICBXVEMoMHgxZmU3NjJhOSksIFdUQygweDIwYTY4NzAwKSwgV1RDKDB4MjE2YmJmNWUpLCBXVEMoMHgyMjM0NDc5OCksCisgICAgV1RDKDB4MjJmZWViZGIpLCBXVEMoMHgyM2NjMjJhNiksIFdUQygweDI0OWRhMTBiKSwgV1RDKDB4MjU3NjJlNDEpLAorICAgIFdUQygweDI2NTVlYmM4KSwgV1RDKDB4MjczYTRlNjYpLCBXVEMoMHgyODIxMmVhYSksIFdUQygweDI5MDhmZjMwKSwKKyAgICBXVEMoMHgyOWYyY2EwMCksIFdUQygweDJhZTIyMWM0KSwgV1RDKDB4MmJkOWM2ZmMpLCBXVEMoMHgyY2RiOTY3ZSksCisgICAgV1RDKDB4MmRlNjRjODYpLCBXVEMoMHgyZWY2MTM0MCksIFdUQygweDMwMDY4NTJiKSwgV1RDKDB4MzExMzFhMWIpLAorICAgIFdUQygweDMyMWFlYzc5KSwgV1RDKDB4MzMyMGQ0ZWQpLCBXVEMoMHgzNDJhMmNiMyksIFdUQygweDM1M2U3N2Y3KSwKKyAgICBXVEMoMHgzNjYwYWFiYSksIFdUQygweDM3OGVmMDU3KSwgV1RDKDB4MzhjNDI0OTUpLCBXVEMoMHgzOWY4MWNlYyksCisgICAgV1RDKDB4M2IyNTAxNDgpLCBXVEMoMHgzYzQ3OTYwZSksIFdUQygweDNkNjBjNjI1KSwgV1RDKDB4M2U3NTg2NGEpLAorICAgIFdUQygweDNmOGE5ZWY3KSwgV1RDKDB4NDBhNDZkMzYpLCBXVEMoMHg0MWM1MzdkNyksIFdUQygweDQyZWQyODg5KSwKKyAgICBXVEMoMHg0NDFiNTJkMSksIFdUQygweDQ1NGRjMzdmKSwgV1RDKDB4NDY4MWU5ZmEpLCBXVEMoMHg0N2I0YTlmZSksCisgICAgV1RDKDB4NDhlMzk5NjApLCBXVEMoMHg0YTBkMTBmZCksIFdUQygweDRiMzA4MjRiKSwgV1RDKDB4NGM0ZTc1OWUpLAorICAgIFdUQygweDRkNjgwYjFjKSwgV1RDKDB4NGU3ZWVjYWEpLCBXVEMoMHg0Zjk0N2QxZSksIFdUQygweDUwYTlkMWY0KSwKKyAgICBXVEMoMHg1MWJmZWUxOSksIFdUQygweDUyZDdiZTRkKSwgV1RDKDB4NTNmMTg3ZWIpLCBXVEMoMHg1NTBjZDNjOCksCisgICAgV1RDKDB4NTYyNzA3MDYpLCBXVEMoMHg1NzNiN2M3NSksIFdUQygweDU4NDc0ODE5KSwgV1RDKDB4NTk0OTZhZTIpLAorICAgIFdUQygweDVhNDNkZmEwKSwgV1RDKDB4NWIzYjcyMWYpLCBXVEMoMHg1YzMyZTI2NiksIFdUQygweDVkMmFiZWExKSwKKyAgICBXVEMoMHg1ZTIyYjQ3OSksIFdUQygweDVmMTk5ZjhiKSwgV1RDKDB4NjAwZDkxOTQpLCBXVEMoMHg2MGZiZTE4OCksCisgICAgV1RDKDB4NjFlMjg5ZGUpLCBXVEMoMHg2MmMwNTIwYyksIFdUQygweDYzOTc0ZDFlKSwgV1RDKDB4NjQ2Y2IwMjIpLAorICAgIFdUQygweDY1NDI3NDVhKSwgV1RDKDB4NjYxNzJlMmYpLCBXVEMoMHg2NmU4OTdkMCksIFdUQygweDY3YjNjYzUyKSwKKyAgICBXVEMoMHg2ODc4M2ViZCksIFdUQygweDY5MzdiOWVkKSwgV1RDKDB4NjlmMzY1ZGQpLCBXVEMoMHg2YWFiYWIxYSksCisgICAgV1RDKDB4NmI2MDg0OWMpLCBXVEMoMHg2YzExODc2ZSksIFdUQygweDZjYmU0NmYwKSwgV1RDKDB4NmQ2NjQ1YmMpLAorICAgIFdUQygweGFlMjM4MzY2KSwgV1RDKDB4YjA0N2Q5OWEpLCBXVEMoMHhiMjYyMDdiYSksIFdUQygweGI0NzMzYWI1KSwKKyAgICBXVEMoMHhiNjdjOWY1ZiksIFdUQygweGI4N2Y1YmNlKSwgV1RDKDB4YmE3YmYxOGQpLCBXVEMoMHhiYzcyM2RkNiksCisgICAgV1RDKDB4YmU2MjFiZTgpLCBXVEMoMHhjMDRiNmIzZCksIFdUQygweGMyMmUwMGZmKSwgV1RDKDB4YzQwOWE4YWQpLAorICAgIFdUQygweGM1ZGU0MjViKSwgV1RDKDB4YzdhYmMyYTcpLCBXVEMoMHhjOTcyMTQyMSksIFdUQygweGNiMzExNzNjKSwKKyAgICBXVEMoMHhjY2U4YzA4ZCksIFdUQygweGNlOTkxODk0KSwgV1RDKDB4ZDA0MjE4Y2QpLCBXVEMoMHhkMWUzYWJhOSksCisgICAgV1RDKDB4ZDM3ZGNmMGMpLCBXVEMoMHhkNTEwOTQyZiksIFdUQygweGQ2OWJmYTg2KSwgV1RDKDB4ZDgxZmVmY2MpLAorICAgIFdUQygweGQ5OWM3NjZkKSwgV1RDKDB4ZGIxMWE1NzApLCBXVEMoMHhkYzdmODA2ZSksIFdUQygweGRkZTVmNzlkKSwKKyAgICBXVEMoMHhkZjQ1MTA5MiksIFdUQygweGUwOWNlNjQ1KSwgV1RDKDB4ZTFlZDdmZmYpLCBXVEMoMHhlMzM2ZDE2YSksCisgICAgV1RDKDB4ZTQ3OGU0ZjQpLCBXVEMoMHhlNWIzZGJiYiksIFdUQygweGU2ZTdjMWFjKSwgV1RDKDB4ZTgxNDhkNTMpLAorICAgIFdUQygweGU5M2E0ODM1KSwgV1RDKDB4ZWE1OTBlYjApLCBXVEMoMHhlYjcwZTRmOCksIFdUQygweGVjODFiNzVkKSwKKyAgICBXVEMoMHhlZDhiOGI2YyksIFdUQygweGVlOGU4MDY4KSwgV1RDKDB4ZWY4YWE5NzApLCBXVEMoMHhmMDgwMGRmZCksCisgICAgV1RDKDB4ZjE2ZWRjNGQpLCBXVEMoMHhmMjU3Njg1MyksIFdUQygweGYzMzllMDU4KSwgV1RDKDB4ZjQxNjRhNTEpLAorICAgIFdUQygweGY0ZWM4ZmI4KSwgV1RDKDB4ZjViYzdjZWYpLCBXVEMoMHhmNjg1YTY5NyksIFdUQygweGY3NDc3MWM5KSwKKyAgICBXVEMoMHhmODAxZjMxYiksIFdUQygweGY4YjVlZWIxKSwgV1RDKDB4Zjk2M2ZhZGIpLCBXVEMoMHhmYTBjNzQyNyksCisgICAgV1RDKDB4ZmFhZjNlMGYpLCBXVEMoMHhmYjRiY2I2ZCksIFdUQygweGZiZTIyNzZmKSwgV1RDKDB4ZmM3MmY1NzgpLAorICAgIFdUQygweGZjZmU2NWQ5KSwgV1RDKDB4ZmQ4NDJlNWIpLCBXVEMoMHhmZTAzZTE0ZSksIFdUQygweGZlN2NlMDdkKSwKKyAgICBXVEMoMHhmZWVmOTMyYiksIFdUQygweGZmNWQwMjM2KSwgV1RDKDB4ZmZjNjhmZWUpLCBXVEMoMHgwMDJkYmNjYyksCisgICAgV1RDKDB4MDA5MjdjNzgpLCBXVEMoMHgwMGYzMmNiZCksIFdUQygweDAxNGQ3MjA5KSwgV1RDKDB4MDE5ZTVmNTEpLAorICAgIFdUQygweDAxZTU1MGFhKSwgV1RDKDB4MDIyM2ZjMDcpLCBXVEMoMHgwMjVkMjYxOCksIFdUQygweDAyOTQ3YjEyKSwKKyAgICBXVEMoMHgwMmNjMzNkYiksIFdUQygweDAzMDRmYTkyKSwgV1RDKDB4MDMzZGI3MTMpLCBXVEMoMHgwMzczYTQzMSksCisgICAgV1RDKDB4MDNhNDdkOTYpLCBXVEMoMHgwM2NlOWIwZiksIFdUQygweDAzZjE0ZGM5KSwgV1RDKDB4MDQwY2UwYmMpLAorICAgIFdUQygweDA0MjI0NWE5KSwgV1RDKDB4MDQzMzA5YTUpLCBXVEMoMHgwNDQwOTgxYSksIFdUQygweDA0NGMzMGYxKSwKKyAgICBXVEMoMHgwNDU2YmI3NCksIFdUQygweDA0NjBjMWI0KSwgV1RDKDB4MDQ2YTJmZGQpLCBXVEMoMHgwNDcyNTczZiksCisgICAgV1RDKDB4MDQ3ODc3YjYpLCBXVEMoMHgwNDdiYzY3MyksIFdUQygweDA0N2I4NjE1KSwgV1RDKDB4MDQ3NzBiZTIpLAorICAgIFdUQygweDA0NmUyM2ZjKSwgV1RDKDB4MDQ2MTE0NjApLCBXVEMoMHgwNDUwN2ZiZCksIFdUQygweDA0M2Q2MTcwKSwKKyAgICBXVEMoMHgwNDI4Y2EzMSksIFdUQygweDA0MTNkMzlhKSwgV1RDKDB4MDNmZWI5YzMpLCBXVEMoMHgwM2U4ZDk0NiksCisgICAgV1RDKDB4MDNkMTY2NjcpLCBXVEMoMHgwM2I3N2FiYSksIFdUQygweDAzOWFhMzg0KSwgV1RDKDB4MDM3YWU3NWMpLAorICAgIFdUQygweDAzNThiZTgwKSwgV1RDKDB4MDMzNTBhZjYpLCBXVEMoMHgwMzEwNjRmYSksIFdUQygweDAyZWIxM2Y2KSwKKyAgICBXVEMoMHgwMmM1MWE3YiksIFdUQygweDAyOWUzOGIwKSwgV1RDKDB4MDI3NjE5ZWYpLCBXVEMoMHgwMjRjNWMwOSksCisgICAgV1RDKDB4MDIyMTBlYTMpLCBXVEMoMHgwMWY0YjE5ZSksIFdUQygweDAxYzc4Zjc5KSwgV1RDKDB4MDE5OWI4YWQpLAorICAgIFdUQygweDAxNmIzYWVmKSwgV1RDKDB4MDEzYzIzNjYpLCBXVEMoMHgwMTBjN2JlOCksIFdUQygweDAwZGM0YmI1KSwKKyAgICBXVEMoMHgwMGFiYWIyOSksIFdUQygweDAwN2FjM2UxKSwgV1RDKDB4MDA0OWMwMmYpLCBXVEMoMHgwMDE4Y2E3MSksCisgICAgV1RDKDB4ZDYyMDgyMjEpLCBXVEMoMHhkNTRlOWY1YiksIFdUQygweGQ0N2ZhMzVmKSwgV1RDKDB4ZDNiMzViZGIpLAorICAgIFdUQygweGQyZTk5NjkzKSwgV1RDKDB4ZDIyMjI2ODUpLCBXVEMoMHhkMTVkNWU0YyksIFdUQygweGQwOWMwNmZmKSwKKyAgICBXVEMoMHhjZmRlMGMyNCksIFdUQygweGNmMjI4MWQyKSwgV1RDKDB4Y2U2OThiMmEpLCBXVEMoMHhjZGI0NTVlMCksCisgICAgV1RDKDB4Y2QwMmM5YjcpLCBXVEMoMHhjYzUzODFlNSksIFdUQygweGNiYTU4MGMzKSwgV1RDKDB4Y2FmODM5ZWEpLAorICAgIFdUQygweGNhNGFkMGI3KSwgV1RDKDB4Yzk5YzIxNTMpLCBXVEMoMHhjOGVjNWE2MSksIFdUQygweGM4M2NlMjU4KSwKKyAgICBXVEMoMHhjNzhjNDJjZCksIFdUQygweGM2ZDYyMTNiKSwgV1RDKDB4YzYxNmE2ZTApLCBXVEMoMHhjNTRhOWYyNyksCisgICAgV1RDKDB4YzQ2ZWU0NGQpLCBXVEMoMHhjMzgwNThhMiksIFdUQygweGMyN2JkODhkKSwgV1RDKDB4YzE1ZTNkMDcpLAorICAgIFdUQygweGMwMjRhNGQ5KSwgV1RDKDB4YmVjYzdjYTIpLCBXVEMoMHhiZDUzZjJiOSksIFdUQygweGJiYmE5OGI0KSwKKyAgICBXVEMoMHhiYTBmZmJjMyksIFdUQygweGI4NzJmYjI0KSwgV1RDKDB4YjZmMzY1NDcpLCBXVEMoMHhiNTkxNTM0NSksCisgICAgV1RDKDB4YjQ0YzM5NzUpLCBXVEMoMHhiMzIzODk0MiksIFdUQygweGIyMTZiM2ZiKSwgV1RDKDB4YjEyNTJiMGIpLAorICAgIFdUQygweGIwNGU1ZmM4KSwgV1RDKDB4YWY5MWMzNzApLCBXVEMoMHhhZWVlYzc2MCksIFdUQygweGFlNjRkZDBiKSwKKyAgICBXVEMoMHhhZGYzNzVjZSksIFdUQygweGFkOWEwMmYwKSwgV1RDKDB4YWQ1N2Y1YmMpLCBXVEMoMHhhZDJjYmY4NyksCisgICAgV1RDKDB4YWQxN2QxOWQpLCBXVEMoMHhhZDE4OWQ0MiksIFdUQygweGFkMmU5M2Q2KSwgV1RDKDB4YWQ1OTI2ZDMpLAorICAgIFdUQygweGFkOTdjNzhhKSwgV1RDKDB4YWRlOWU3MjYpLCBXVEMoMHhhZTRlZjZmYyksIFdUQygweGFlYzY2ODhjKSwKKyAgICBXVEMoMHhhZjRmYWQyYyksIFdUQygweGFmZWEzNjA1KSwgV1RDKDB4YjA5NTc0NjkpLCBXVEMoMHhiMTUwZDlkMiksCisgICAgV1RDKDB4YjIxYmQ3OTMpLCBXVEMoMHhiMmY1ZGU1ZCksIFdUQygweGIzZGU1NzNkKSwgV1RDKDB4YjRkNGRlNDcpLAorICAgIFdUQygweGI1ZDg5YzgwKSwgV1RDKDB4YjZlOTM3YzIpLCBXVEMoMHhiODA2MTM1NCksIFdUQygweGI5MmVhMDdjKSwKKyAgICBXVEMoMHhiYTYyNTA4ZSksIFdUQygweGJiYTA5NGU0KSwgV1RDKDB4YmNlOGRlZTApLCBXVEMoMHhiZTNhOWZlMyksCisgICAgV1RDKDB4YmY5NTQ5MzkpLCBXVEMoMHhjMGY4NGMxMSksIFdUQygweGMyNjMxOWMyKSwgV1RDKDB4YzNkNTIzYzUpLAorICAgIFdUQygweGM1NGRkYjc3KSwgV1RDKDB4YzZjY2IyMTcpLCBXVEMoMHhjODUxMThmOCksIFdUQygweGM5ZGE4MTgyKSwKKyAgICBXVEMoMHhjYjY4NWQwNyksIFdUQygweGNjZmExY2M3KSwgV1RDKDB4Y2U4ZjMyMTEpLCBXVEMoMHhkMDI3MGU0OCksCisgICAgV1RDKDB4ZDFjMTIyYzcpLCBXVEMoMHhkMzVjZTBkZSksIFdUQygweGQ0ZjliOWUxKSwgV1RDKDB4ZDY5NzFmMjMpLAorICAgIFdUQygweGQ4MzQ4MWY4KSwgV1RDKDB4ZDlkMTUzYmIpLCBXVEMoMHhkYjZkMDVjMCksIFdUQygweGRkMDcwOTU2KSwKKyAgICBXVEMoMHhkZTllY2ZkMiksIFdUQygweGUwMzNjYTkxKSwgV1RDKDB4ZTFjNTZhZTcpLCBXVEMoMHhlMzUzMjIyMyksCisgICAgV1RDKDB4ZTRkYzYxOTkpLCBXVEMoMHhlNjYwOWFhNSksIFdUQygweGU3ZGYzZTlhKSwgV1RDKDB4ZTk1N2JlYzkpLAorICAgIFdUQygweGVhYzk4Yzg0KSwgV1RDKDB4ZWMzNDE5MjcpLCBXVEMoMHhlZDk2ZDYwNyksIFdUQygweGVlZjEzNDc0KSwKKyAgICBXVEMoMHhmMDQyYTVjNSksIFdUQygweGYxOGE5YjRlKSwgV1RDKDB4ZjJjODg2NjcpLCBXVEMoMHhmM2ZiZDg2MyksCisgICAgV1RDKDB4ZjUyNDAyOTYpLCBXVEMoMHhmNjQwNzY1OCksIFdUQygweGY3NTBhNGZlKSwgV1RDKDB4Zjg1M2ZmZGEpLAorICAgIFdUQygweGY5NDlmODQwKSwgV1RDKDB4ZmEzMWZmODMpLCBXVEMoMHhmYjBiODZmYiksIFdUQygweGZiZDVmZmZlKSwKKyAgICBXVEMoMHhmYzkwZGJlMSksIFdUQygweGZkM2I4YmY4KSwgV1RDKDB4ZmRkNTgxOTcpLCBXVEMoMHhmZTVlMmUxNCksCisgICAgV1RDKDB4ZmVkNTAyYzQpLCBXVEMoMHhmZjM5NzBmYyksIFdUQygweGZmOGFlYTBmKSwgV1RDKDB4ZmZjOGRmNTUpLAorICAgIFdUQygweGZmZjJjMjMzKSwgV1RDKDB4MDAwODA0ZTYpLCBXVEMoMHgwMDA4MjU2YSksIFdUQygweGZmZjI1MzU4KSwKK307CiAKK2NvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzMjQwWzcyMF0gPSB7CisgICAgV1RDKDB4ZGFmMTZiYTEpLCBXVEMoMHhkYjg4OGQ0ZCksIFdUQygweGRjMjEyYmMxKSwgV1RDKDB4ZGNiYjUxZDApLAorICAgIFdUQygweGRkNTcwM2JlKSwgV1RDKDB4ZGRmNDNmM2IpLCBXVEMoMHhkZTkyZmVlNSksIFdUQygweGRmMzMzZjkyKSwKKyAgICBXVEMoMHhkZmQ1MDVkMSksIFdUQygweGUwNzg2MjRhKSwgV1RDKDB4ZTExZDQ4ZmYpLCBXVEMoMHhlMWMzOTM1OCksCisgICAgV1RDKDB4ZTI2YjIwNjYpLCBXVEMoMHhlMzEzZDhhOSksIFdUQygweGUzYmRlNjNjKSwgV1RDKDB4ZTQ2OTZlNDUpLAorICAgIFdUQygweGU1MTY0ZDk1KSwgV1RDKDB4ZTVjNDU5N2QpLCBXVEMoMHhlNjczNTk2ZiksIFdUQygweGU3MjMxNTNjKSwKKyAgICBXVEMoMHhlN2QzNTgxMyksIFdUQygweGU4ODNmYTQ5KSwgV1RDKDB4ZTkzNGU3YTMpLCBXVEMoMHhlOWU2NDIwNSksCisgICAgV1RDKDB4ZWE5ODRhYTgpLCBXVEMoMHhlYjRhZTZlZiksIFdUQygweGViZmRjYmY2KSwgV1RDKDB4ZWNiMDc0NGIpLAorICAgIFdUQygweGVkNjI1NjcxKSwgV1RDKDB4ZWUxMzMzNjEpLCBXVEMoMHhlZWMyZTFiNCksIFdUQygweGVmNzE1MzM0KSwKKyAgICBXVEMoMHhmMDFlNzU4OCksIFdUQygweGYwY2EzM2VjKSwgV1RDKDB4ZjE3NDhhNGUpLCBXVEMoMHhmMjFkODNlZCksCisgICAgV1RDKDB4ZjJjNTBkYmUpLCBXVEMoMHhmMzZiMDYzOSksIFdUQygweGY0MGY0ODkyKSwgV1RDKDB4ZjRiMTk0NGQpLAorICAgIFdUQygweGY1NTE3Mjg5KSwgV1RDKDB4ZjVlZTU3M2QpLCBXVEMoMHhmNjg3ZDcwZCksIFdUQygweGY3MWRiMzY4KSwKKyAgICBXVEMoMHhmN2IwMTA1NyksIFdUQygweGY4M2Y2NTcwKSwgV1RDKDB4ZjhjYzlkMGEpLCBXVEMoMHhmOTU4NWE3MyksCisgICAgV1RDKDB4ZjllMzA3ZjgpLCBXVEMoMHhmYTZkNDRkMiksIFdUQygweGZhZjc5ZDc1KSwgV1RDKDB4ZmI4MjA4ZTgpLAorICAgIFdUQygweGZjMGMzM2M4KSwgV1RDKDB4ZmM5NmQwMGMpLCBXVEMoMHhmZDIyZjI1NyksIFdUQygweGZkYjFlNjIzKSwKKyAgICBXVEMoMHhmZTQzMThhMyksIFdUQygweGZlZDA4YzFkKSwgV1RDKDB4ZmY1MDkxZjEpLCBXVEMoMHhmZmI0MzkwYSksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4YmZmNjJiNjIpLCBXVEMoMHhiZmUyOGE4NCksIFdUQygweGJmY2VlMzBkKSwgV1RDKDB4YmZiYjM4MzIpLAorICAgIFdUQygweGJmYTc4ZDI5KSwgV1RDKDB4YmY5M2U0OTApLCBXVEMoMHhiZjgwM2NjNiksIFdUQygweGJmNmM5Mzc2KSwKKyAgICBXVEMoMHhiZjU4ZWI4OSksIFdUQygweGJmNDU0N2Y4KSwgV1RDKDB4YmYzMWE2YWEpLCBXVEMoMHhiZjFlMDZhMyksCisgICAgV1RDKDB4YmYwYTZiZGYpLCBXVEMoMHhiZWY2ZDg2MyksIFdUQygweGJlZTM0OWU1KSwgV1RDKDB4YmVjZmMxNDUpLAorICAgIFdUQygweGJlYmM0MzYyKSwgV1RDKDB4YmVhOGQxMTEpLCBXVEMoMHhiZTk1NjgwNiksIFdUQygweGJlODIwYWViKSwKKyAgICBXVEMoMHhiZTZlYmViOSksIFdUQygweGJlNWI4MzEzKSwgV1RDKDB4YmU0ODU2NzgpLCBXVEMoMHhiZTM1M2NmYiksCisgICAgV1RDKDB4YmUyMjNhYjgpLCBXVEMoMHhiZTBmNGU1ZiksIFdUQygweGJkZmM3N2I0KSwgV1RDKDB4YmRlOWJiOTkpLAorICAgIFdUQygweGJkZDcxY2JlKSwgV1RDKDB4YmRjNDk5MGQpLCBXVEMoMHhiZGIyMzE3NSksIFdUQygweGJkOWZlYWI2KSwKKyAgICBXVEMoMHhiZDhkYzU4ZCksIFdUQygweGJkN2JiZjhjKSwgV1RDKDB4YmQ2OWRhZWMpLCBXVEMoMHhiZDU4MWMwNyksCisgICAgV1RDKDB4YmQ0NjgyMGMpLCBXVEMoMHhiZDM1MGFmOCksIFdUQygweGJkMjNiOWNjKSwgV1RDKDB4YmQxMjkxNTgpLAorICAgIFdUQygweGJkMDE4ZWNlKSwgV1RDKDB4YmNmMGIwNTcpLCBXVEMoMHhiY2RmZjkxMiksIFdUQygweGJjY2Y2OWNmKSwKKyAgICBXVEMoMHhiY2JlZmU4MSksIFdUQygweGJjYWViNjNhKSwgV1RDKDB4YmM5ZTk0MDYpLCBXVEMoMHhiYzhlOTc3YyksCisgICAgV1RDKDB4YmM3ZWJkNTgpLCBXVEMoMHhiYzZmMDU0NCksIFdUQygweGJjNWY3MDc3KSwgV1RDKDB4YmM0ZmZlMWQpLAorICAgIFdUQygweGJjNDBhYjk5KSwgV1RDKDB4YmMzMTcyMzkpLCBXVEMoMHhiYzIyNTJhZCksIFdUQygweGJjMTM2OTYzKSwKKyAgICBXVEMoMHhiYzA0YTgyMiksIFdUQygweGJiZjU5NDFlKSwgV1RDKDB4YmJlNjhkYWIpLCBXVEMoMHhiYmQ5N2EzNiksCisgICAgV1RDKDB4YmJjZmY0NGYpLCBXVEMoMHhiYmNiMTg5MSksIFdUQygweGJiY2E3ODE4KSwgV1RDKDB4YmJjYzc2NWYpLAorICAgIFdUQygweGJiY2ZmYWE1KSwgV1RDKDB4YmJkNDZhMGYpLCBXVEMoMHhiYmRhNDA2MCksIFdUQygweGJiZTI1N2YxKSwKKyAgICBXVEMoMHhiYmVkMTMxYyksIFdUQygweGJiZmE3NjI4KSwgV1RDKDB4YmMwOWNkZDYpLCBXVEMoMHhiYzFhNjg1YiksCisgICAgV1RDKDB4YmMyYmYyZmQpLCBXVEMoMHhiYzNlNjU1NyksIFdUQygweGJjNTIxZDM3KSwgV1RDKDB4YmM2N2MwOTMpLAorICAgIFdUQygweGJjODAzYjk4KSwgV1RDKDB4YmM5YzMwNjApLCBXVEMoMHhiY2JiZjZkYSksIFdUQygweGJjZGY4YzUxKSwKKyAgICBXVEMoMHhiZDA2YWZiNSksIFdUQygweGJkMzBlMzZkKSwgV1RDKDB4YmQ1ZDk5YTApLCBXVEMoMHhiZDhjNzFhNiksCisgICAgV1RDKDB4YmRiZDI5YzMpLCBXVEMoMHhiZGVmYjcyYSksIFdUQygweGJlMjQzNjYwKSwgV1RDKDB4YmU1YjAzMzUpLAorICAgIFdUQygweGJlOTQ3N2ZkKSwgV1RDKDB4YmVkMGRlMDApLCBXVEMoMHhiZjEwODg4MSksIFdUQygweGJmNTNkNTg1KSwKKyAgICBXVEMoMHhiZjlhZWViYSksIFdUQygweGJmZTViYjM4KSwgV1RDKDB4YzAzMzMxOGMpLCBXVEMoMHhjMDgxY2RmMiksCisgICAgV1RDKDB4YzBkMGE5ZWUpLCBXVEMoMHhjMTFmNzZkNSksIFdUQygweGMxNmY2NmMzKSwgV1RDKDB4YzFjMWQ1YzEpLAorICAgIFdUQygweGMyMTcyNmQ0KSwgV1RDKDB4YzI2ZjViYmEpLCBXVEMoMHhjMmNhMTAzNiksIFdUQygweGMzMjY4YjBmKSwKKyAgICBXVEMoMHhjMzgzOWZmMyksIFdUQygweGMzZTAzZDIyKSwgV1RDKDB4YzQzYjkzZWYpLCBXVEMoMHhjNDk2ODU5NCksCisgICAgV1RDKDB4YzRmMzM1M2MpLCBXVEMoMHhjNTUyMDJhYiksIFdUQygweGM1YjIxZmNmKSwgV1RDKDB4YzYxMjI0ZTYpLAorICAgIFdUQygweGM2NzBjMTY4KSwgV1RDKDB4YzZjZTNmMWUpLCBXVEMoMHhjNzJiM2ZiYiksIFdUQygweGM3ODdlNjg4KSwKKyAgICBXVEMoMHhjN2U0MWY1NiksIFdUQygweGM4M2Y5NGE5KSwgV1RDKDB4Yzg5OWU4MzMpLCBXVEMoMHhjOGYyYjgzMiksCisgICAgV1RDKDB4YjRkMWZjNzgpLCBXVEMoMHhiM2E5ZWM3MCksIFdUQygweGIyODUyNGNhKSwgV1RDKDB4YjE2M2EyYmEpLAorICAgIFdUQygweGIwNDU2MzczKSwgV1RDKDB4YWYyYTYzMjcpLCBXVEMoMHhhZTEyOTcwOCksIFdUQygweGFjZmRmMmNhKSwKKyAgICBXVEMoMHhhYmVjNzE2OCksIFdUQygweGFhZGUwZjhjKSwgV1RDKDB4YTlkMmM4MGEpLCBXVEMoMHhhOGNhOTcxMSksCisgICAgV1RDKDB4YTdjNTdjZGMpLCBXVEMoMHhhNmMzN2MyOSksIFdUQygweGE1YzQ5YWU2KSwgV1RDKDB4YTRjOGUwMmMpLAorICAgIFdUQygweGEzZDA1NDIyKSwgV1RDKDB4YTJkYWZmODMpLCBXVEMoMHhhMWU4ZWMwNCksIFdUQygweGEwZmEyOTNmKSwKKyAgICBXVEMoMHhhMDBlYzk4YSksIFdUQygweDlmMjZkOTkwKSwgV1RDKDB4OWU0MjY1YTUpLCBXVEMoMHg5ZDYxODQzNyksCisgICAgV1RDKDB4OWM4NDRjZTApLCBXVEMoMHg5YmFhZDBmYSksIFdUQygweDlhZDUyMTU0KSwgV1RDKDB4OWEwMzUwOWIpLAorICAgIFdUQygweDk5MzU3MmVkKSwgV1RDKDB4OTg2YjllNGQpLCBXVEMoMHg5N2E1ZTdkOCksIFdUQygweDk2ZTQ2MzI5KSwKKyAgICBXVEMoMHg5NjI3MWZmOCksIFdUQygweDk1NmUyYWI4KSwgV1RDKDB4OTRiOThmOWMpLCBXVEMoMHg5NDA5NWE5NyksCisgICAgV1RDKDB4OTM1ZDk2OWIpLCBXVEMoMHg5MmI2NGNkZiksIFdUQygweDkyMTM4MDliKSwgV1RDKDB4OTE3NTMyOGEpLAorICAgIFdUQygweDkwZGI2MTUzKSwgV1RDKDB4OTA0NjA3MTIpLCBXVEMoMHg4ZmI1MTQ2ZiksIFdUQygweDhmMjg3NmY0KSwKKyAgICBXVEMoMHg4ZWEwMThlNSksIFdUQygweDhlMWJkNmRmKSwgV1RDKDB4OGQ5YjdkOWIpLCBXVEMoMHg4ZDFlZDc0NSksCisgICAgV1RDKDB4OGNhNWE5NDIpLCBXVEMoMHg4YzJmOTNjZSksIFdUQygweDhiYmMyMDRjKSwgV1RDKDB4OGI0YWQ1OGQpLAorICAgIFdUQygweDhhZGIzMWU0KSwgV1RDKDB4OGE2YzkwOWIpLCBXVEMoMHg4OWZlNjczZCksIFdUQygweDg5OTBhNDc4KSwKKyAgICBXVEMoMHg4OTI0NDY3MCksIFdUQygweDg4YmM4NGNiKSwgV1RDKDB4ODg1ZTA5NjMpLCBXVEMoMHg4ODBmNzNmNSksCisgICAgV1RDKDB4ODdjYmEyYzApLCBXVEMoMHg4N2I0OGE2ZiksIFdUQygweDg3OTlmYjI1KSwgV1RDKDB4ODc3ZjQ2ZjIpLAorICAgIFdUQygweDg3NjUxOWNkKSwgV1RDKDB4ODc0YTlhMTEpLCBXVEMoMHg4NzJmYWUwMSksIFdUQygweDg3MTQ4N2QyKSwKKyAgICBXVEMoMHg4NmY5Mjg3YiksIFdUQygweDg2ZGQ4M2I1KSwgV1RDKDB4ODZjMTk0N2MpLCBXVEMoMHg4NmE1NThmMSksCisgICAgV1RDKDB4ODY4OGQyZTMpLCBXVEMoMHg4NjZjMDE1YiksIFdUQygweDg2NGVkZTBjKSwgV1RDKDB4ODYzMTY3Y2MpLAorICAgIFdUQygweDg2MTNhM2I4KSwgV1RDKDB4ODVmNThmYjIpLCBXVEMoMHg4NWQ3MjNmMCksIFdUQygweDg1Yjg2MTc2KSwKKyAgICBXVEMoMHg4NTk5NGQ4MiksIFdUQygweDg1NzllNDQzKSwgV1RDKDB4ODU1YTIwMWIpLCBXVEMoMHg4NTNhMDViNyksCisgICAgV1RDKDB4ODUxOTlhMjYpLCBXVEMoMHg4NGY4ZDkzZiksIFdUQygweDg0ZDdjMTAwKSwgV1RDKDB4ODRiNjU5MDEpLAorICAgIFdUQygweDg0OTRhNGVlKSwgV1RDKDB4ODQ3MjlmZDQpLCBXVEMoMHg4NDUwNGE5YiksIFdUQygweDg0MmRhZGIzKSwKKyAgICBXVEMoMHg4NDBhY2E3MSksIFdUQygweDgzZTc5Yzg3KSwgV1RDKDB4ODNjNDI4OTIpLCBXVEMoMHg4M2EwNzc2NyksCisgICAgV1RDKDB4ODM3Yzg4M2EpLCBXVEMoMHg4MzU4NTgzNSksIFdUQygweDgzMzNlZWNhKSwgV1RDKDB4ODMwZjUzNjgpLAorICAgIFdUQygweDgyZWE4MmVjKSwgV1RDKDB4ODJjNTdjNTcpLCBXVEMoMHg4MmEwNDhlYSksIFdUQygweDgyN2FlZDg2KSwKKyAgICBXVEMoMHg4MjU1NjU4OCksIFdUQygweDgyMmZiMjU1KSwgV1RDKDB4ODIwOWRkMWUpLCBXVEMoMHg4MWUzZTc2ZiksCisgICAgV1RDKDB4ODFiZGNjYWMpLCBXVEMoMHg4MTk3OTA5OCksIFdUQygweDgxNzEzYWQ3KSwgV1RDKDB4ODE0YWM5NWQpLAorICAgIFdUQygweDgxMjQzN2YyKSwgV1RDKDB4ODBmZDhjNGIpLCBXVEMoMHg4MGQ2Y2MwYSksIFdUQygweDgwYWZmMjgzKSwKKyAgICBXVEMoMHg4MDg4ZmM2NCksIFdUQygweDgwNjFlZWJlKSwgV1RDKDB4ODAzYWNmZTkpLCBXVEMoMHg4MDEzYTYyZCksCisgICAgV1RDKDB4MGE4ZDcxMGEpLCBXVEMoMHgwYWVjZDk3NCksIFdUQygweDBiNGY3NDQ5KSwgV1RDKDB4MGJiNGQxM2IpLAorICAgIFdUQygweDBjMWM3ZmVlKSwgV1RDKDB4MGM4NjIwMmEpLCBXVEMoMHgwY2YxYzJlNyksIFdUQygweDBkNWY5OGQxKSwKKyAgICBXVEMoMHgwZGNmODE2YSksIFdUQygweDBlNDE2MmFlKSwgV1RDKDB4MGViNTg4YWQpLCBXVEMoMHgwZjJjMWU4OCksCisgICAgV1RDKDB4MGZhNGQxNGYpLCBXVEMoMHgxMDFmNGQ4MCksIFdUQygweDEwOWI1YmZkKSwgV1RDKDB4MTExOGI5MDgpLAorICAgIFdUQygweDExOTcxNDY2KSwgV1RDKDB4MTIxNjgyNDkpLCBXVEMoMHgxMjk3NTRhYiksIFdUQygweDEzMThkNWMwKSwKKyAgICBXVEMoMHgxMzk5YjVkNyksIFdUQygweDE0MThkOGVjKSwgV1RDKDB4MTQ5NTNmMjQpLCBXVEMoMHgxNTBkZmU4YSksCisgICAgV1RDKDB4MTU4MjJmYWEpLCBXVEMoMHgxNWYwZGQ3MCksIFdUQygweDE2NTkyMDE0KSwgV1RDKDB4MTZiYTM1YjIpLAorICAgIFdUQygweDE3MTM4NGU3KSwgV1RDKDB4MTc2NGNmMWYpLCBXVEMoMHgxN2IyMmEyOCksIFdUQygweDE4MDQ3ZDQwKSwKKyAgICBXVEMoMHgxODVmZmMwNSksIFdUQygweDE4YzRhMDc1KSwgV1RDKDB4MTkzMjI5ODApLCBXVEMoMHgxOWE4NDY0MyksCisgICAgV1RDKDB4MWEyNmE4ZjQpLCBXVEMoMHgxYWFkMDk5ZCksIFdUQygweDFiM2IzNDkzKSwgV1RDKDB4MWJkMGViMzIpLAorICAgIFdUQygweDFjNmRiNzU0KSwgV1RDKDB4MWQxMTVhOGMpLCBXVEMoMHgxZGJjMzI5YiksIFdUQygweDFlNmVjYjMzKSwKKyAgICBXVEMoMHgxZjI5ZDQyYSksIFdUQygweDFmZWRhMmU0KSwgV1RDKDB4MjBiYTA1NmUpLCBXVEMoMHgyMThkMDJhMiksCisgICAgV1RDKDB4MjI2MzVjNzUpLCBXVEMoMHgyMzNjMmU3ZiksIFdUQygweDI0MTg0ZGExKSwgV1RDKDB4MjRmYTc5OWQpLAorICAgIFdUQygweDI1ZTU0ZTk1KSwgV1RDKDB4MjZkNmVkZDgpLCBXVEMoMHgyN2NjNTdhNSksIFdUQygweDI4YzM2MzQ5KSwKKyAgICBXVEMoMHgyOWJiZGZkZiksIFdUQygweDJhYjliN2MyKSwgV1RDKDB4MmJjMDk3OTApLCBXVEMoMHgyY2QyZDQ2NSksCisgICAgV1RDKDB4MmRlZjRjYjkpLCBXVEMoMHgyZjExNWRjYyksIFdUQygweDMwMzNhOTljKSwgV1RDKDB4MzE1MGZkOGQpLAorICAgIFdUQygweDMyNjk4YTk0KSwgV1RDKDB4MzM4MTUyZTYpLCBXVEMoMHgzNGEwMmRjZCksIFdUQygweDM1Y2RlZGQxKSwKKyAgICBXVEMoMHgzNzBhYTlmYSksIFdUQygweDM4NTI3YTc5KSwgV1RDKDB4Mzk5YzRhNGYpLCBXVEMoMHgzYWRmOWMyNyksCisgICAgV1RDKDB4M2MxN2VkYzcpLCBXVEMoMHgzZDQ0ZjA1ZCksIFdUQygweDNlNmM1MTllKSwgV1RDKDB4M2Y5M2VhNWIpLAorICAgIFdUQygweDQwYzBmYzZkKSwgV1RDKDB4NDFmNjBiZGQpLCBXVEMoMHg0MzMzMmQxNSksIFdUQygweDQ0NzZlNmVhKSwKKyAgICBXVEMoMHg0NWJlYjdlMSksIFdUQygweDQ3MDcyZjJiKSwgV1RDKDB4NDg0Y2I3MWEpLCBXVEMoMHg0OThjZWFmZCksCisgICAgV1RDKDB4NGFjNjUwYzMpLCBXVEMoMHg0YmY5MzQ1OCksIFdUQygweDRkMjZhNGM3KSwgV1RDKDB4NGU1MDkwZWIpLAorICAgIFdUQygweDRmNzhjMmFjKSwgV1RDKDB4NTBhMDkxOGEpLCBXVEMoMHg1MWM5Mzk5NSksIFdUQygweDUyZjNkNmM3KSwKKyAgICBXVEMoMHg1NDIwYTlhMiksIFdUQygweDU1NGVmMTIyKSwgV1RDKDB4NTY3YWM0YTkpLCBXVEMoMHg1NzllYmViOSksCisgICAgV1RDKDB4NThiODU2OWMpLCBXVEMoMHg1OWM3NGVhNCksIFdUQygweDVhZDAzZjMxKSwgV1RDKDB4NWJkODIxYzgpLAorICAgIFdUQygweDVjZTA1NTAyKSwgV1RDKDB4NWRlOGU1ODIpLCBXVEMoMHg1ZWYwOWI0OSksIFdUQygweDVmZjU2MjQ3KSwKKyAgICBXVEMoMHg2MGY0MGQ4MSksIFdUQygweDYxZWExNDUwKSwgV1RDKDB4NjJkNjBhMmQpLCBXVEMoMHg2M2JhZDdmMSksCisgICAgV1RDKDB4NjQ5ZTk0MmUpLCBXVEMoMHg2NTgyNzU1NiksIFdUQygweDY2NjQ4MTc4KSwgV1RDKDB4Njc0MThjMzEpLAorICAgIFdUQygweDY4MTZjMWVlKSwgV1RDKDB4NjhlNTQxMWQpLCBXVEMoMHg2OWFlZmZkYiksIFdUQygweDZhNzRiYjBlKSwKKyAgICBXVEMoMHg2YjM2YTVhZSksIFdUQygweDZiZjQ0ZmQxKSwgV1RDKDB4NmNhZDM0MWYpLCBXVEMoMHg2ZDYwYzBjYSksCisgICAgV1RDKDB4YWUzNWY3OWIpLCBXVEMoMHhiMDdlMWIwZCksIFdUQygweGIyYmFkMjZkKSwgV1RDKDB4YjRlZDhhZjcpLAorICAgIFdUQygweGI3MTdiMjA3KSwgV1RDKDB4YjkzYThmNWIpLCBXVEMoMHhiYjU2NjMxZSksIFdUQygweGJkNmFmY2FiKSwKKyAgICBXVEMoMHhiZjc4MzJkYiksIFdUQygweGMxN2RkOTk2KSwgV1RDKDB4YzM3YmIzNTUpLCBXVEMoMHhjNTcxOGQ3MiksCisgICAgV1RDKDB4Yzc1ZjU2Y2MpLCBXVEMoMHhjOTQ0ZjkzZCksIFdUQygweGNiMjI0ZjE3KSwgV1RDKDB4Y2NmNzQ4MDUpLAorICAgIFdUQygweGNlYzNlZDhjKSwgV1RDKDB4ZDA4ODM1ZDkpLCBXVEMoMHhkMjQ0MDgzNyksIFdUQygweGQzZjc2OTJkKSwKKyAgICBXVEMoMHhkNWEyNmIxNyksIFdUQygweGQ3NDUwMmI2KSwgV1RDKDB4ZDhkZjFmODIpLCBXVEMoMHhkYTcwZDQ5NSksCisgICAgV1RDKDB4ZGJmYTM1YTEpLCBXVEMoMHhkZDdiMzQ5OCksIFdUQygweGRlZjNjYmEzKSwgV1RDKDB4ZTA2NDE4NGUpLAorICAgIFdUQygweGUxY2MyYWI5KSwgV1RDKDB4ZTMyYmY1NDgpLCBXVEMoMHhlNDgzODFjZCksIFdUQygweGU1ZDJmNzc5KSwKKyAgICBXVEMoMHhlNzFhNjIxOCksIFdUQygweGU4NTliNzg5KSwgV1RDKDB4ZTk5MTBhNjApLCBXVEMoMHhlYWMwNzk1NiksCisgICAgV1RDKDB4ZWJlN2ZiNTUpLCBXVEMoMHhlZDA3N2Y0MSksIFdUQygweGVlMWYxZjlkKSwgV1RDKDB4ZWYyZWZkOTkpLAorICAgIFdUQygweGYwMzcyNDcyKSwgV1RDKDB4ZjEzN2I2MDUpLCBXVEMoMHhmMjMxMTJiMyksIFdUQygweGYzMjM4MDhhKSwKKyAgICBXVEMoMHhmNDBmMGE4NiksIFdUQygweGY0ZjM5ODgzKSwgV1RDKDB4ZjVkMGViM2MpLCBXVEMoMHhmNmE2NzljNiksCisgICAgV1RDKDB4Zjc3Mzk2NDApLCBXVEMoMHhmODM4OTg0OSksIFdUQygweGY4ZjY2YjJhKSwgV1RDKDB4ZjlhZGE3ZDYpLAorICAgIFdUQygweGZhNWU5N2VkKSwgV1RDKDB4ZmIwOGJlY2QpLCBXVEMoMHhmYmFiYjM4MCksIFdUQygweGZjNDgxMjVmKSwKKyAgICBXVEMoMHhmY2RlNWI0MCksIFdUQygweGZkNmU0YWFjKSwgV1RDKDB4ZmRmNzY1NjApLCBXVEMoMHhmZTc4ZjNhYiksCisgICAgV1RDKDB4ZmVmMzRjZjApLCBXVEMoMHhmZjY3YjY4OSksIFdUQygweGZmZDdlMzQyKSwgV1RDKDB4MDA0NTg0ZWYpLAorICAgIFdUQygweDAwYjAwMDc0KSwgV1RDKDB4MDExNTJkNDcpLCBXVEMoMHgwMTcxY2NlYSksIFdUQygweDAxYzJmZGJlKSwKKyAgICBXVEMoMHgwMjA5YjU2MyksIFdUQygweDAyNDg5ODMyKSwgV1RDKDB4MDI4M2UyY2QpLCBXVEMoMHgwMmJmMjA1MCksCisgICAgV1RDKDB4MDJmYjcyZmIpLCBXVEMoMHgwMzM4MWYyOSksIFdUQygweDAzNzFlYTdjKSwgV1RDKDB4MDNhNjAyZjMpLAorICAgIFdUQygweDAzZDI2N2UwKSwgV1RDKDB4MDNmNjYyMWIpLCBXVEMoMHgwNDEyNWRjOCksIFdUQygweDA0MjdiN2E1KSwKKyAgICBXVEMoMHgwNDM4NTA2MiksIFdUQygweDA0NDVjYWNhKSwgV1RDKDB4MDQ1MThlZTMpLCBXVEMoMHgwNDVjNzQ1ZSksCisgICAgV1RDKDB4MDQ2NmQ3MTQpLCBXVEMoMHgwNDcwMTI1YyksIFdUQygweDA0Nzc0MmQ3KSwgV1RDKDB4MDQ3YjczY2YpLAorICAgIFdUQygweDA0N2JiYTgyKSwgV1RDKDB4MDQ3NzQ0YWEpLCBXVEMoMHgwNDZkYzUzNiksIFdUQygweDA0NWY5MDY4KSwKKyAgICBXVEMoMHgwNDRkNzYzMiksIFdUQygweDA0MzhhYTkyKSwgV1RDKDB4MDQyMjdmMzkpLCBXVEMoMHgwNDBjMjMzMSksCisgICAgV1RDKDB4MDNmNTYxZDgpLCBXVEMoMHgwM2RkNjBiNCksIFdUQygweDAzYzMxMDY0KSwgV1RDKDB4MDNhNThkN2QpLAorICAgIFdUQygweDAzODRiNzRmKSwgV1RDKDB4MDM2MGUyOWEpLCBXVEMoMHgwMzNiMTE1MSksIFdUQygweDAzMTQxN2YwKSwKKyAgICBXVEMoMHgwMmVjNTRjYSksIFdUQygweDAyYzNkMmNlKSwgV1RDKDB4MDI5YTQ1OGQpLCBXVEMoMHgwMjZmNDQxMSksCisgICAgV1RDKDB4MDI0MjYwOTMpLCBXVEMoMHgwMjEzZDY3ZiksIFdUQygweDAxZTQzYjAxKSwgV1RDKDB4MDFiM2M3YzEpLAorICAgIFdUQygweDAxODI4ZGQ4KSwgV1RDKDB4MDE1MDlkOTIpLCBXVEMoMHgwMTFlMDU1NiksIFdUQygweDAwZWFjZTFkKSwKKyAgICBXVEMoMHgwMGI3MGJiMyksIFdUQygweDAwODJlZDhiKSwgV1RDKDB4MDA0ZWE3MDcpLCBXVEMoMHgwMDFhNmI4ZiksCisgICAgV1RDKDB4ZDYxOTc2OWIpLCBXVEMoMHhkNTM5Y2JmNiksIFdUQygweGQ0NWQ2OGI5KSwgV1RDKDB4ZDM4NDBmY2UpLAorICAgIFdUQygweGQyYWQ4NDBiKSwgV1RDKDB4ZDFkOWE1ODApLCBXVEMoMHhkMTA5MjE2MCksIFdUQygweGQwM2NhY2RjKSwKKyAgICBXVEMoMHhjZjczODNiYSksIFdUQygweGNlYWNmZDQ2KSwgV1RDKDB4Y2RlYTQyOWEpLCBXVEMoMHhjZDJiZjVlYyksCisgICAgV1RDKDB4Y2M3MDlkYzEpLCBXVEMoMHhjYmI2ZGM5MSksIFdUQygweGNhZmRmZjcxKSwgV1RDKDB4Y2E0NTA0Y2QpLAorICAgIFdUQygweGM5OGE5M2Y0KSwgV1RDKDB4YzhjZjBlYjApLCBXVEMoMHhjODEzZWU3ZiksIFdUQygweGM3NTY2NWYzKSwKKyAgICBXVEMoMHhjNjkxMmQ2MyksIFdUQygweGM1YmZmNzRhKSwgV1RDKDB4YzRkZWU5ZmEpLCBXVEMoMHhjM2VhMzllZiksCisgICAgV1RDKDB4YzJkZTFjOTQpLCBXVEMoMHhjMWI2YmQwOCksIFdUQygweGMwNzA3NGRhKSwgV1RDKDB4YmYwODEwMzgpLAorICAgIFdUQygweGJkN2IxNjZiKSwgV1RDKDB4YmJjOGFmZDcpLCBXVEMoMHhiYTAxZDQ3YyksIFdUQygweGI4NGI0ODFmKSwKKyAgICBXVEMoMHhiNmI2NTk1MyksIFdUQygweGI1NDJlNWQyKSwgV1RDKDB4YjNmMDQyOTEpLCBXVEMoMHhiMmJkYzI1YSksCisgICAgV1RDKDB4YjFhYWI4MTApLCBXVEMoMHhiMGI2NzZhMCksIFdUQygweGFmZTA1MGQ1KSwgV1RDKDB4YWYyNzk5N2QpLAorICAgIFdUQygweGFlOGJhMzkwKSwgV1RDKDB4YWUwYmMyMDIpLCBXVEMoMHhhZGE3NDc5ZCksIFdUQygweGFkNWQ4NzJmKSwKKyAgICBXVEMoMHhhZDJkZDM5MiksIFdUQygweGFkMTc3Zjk3KSwgV1RDKDB4YWQxOWRlMDQpLCBXVEMoMHhhZDM0NDFjNSksCisgICAgV1RDKDB4YWQ2NWZkZGMpLCBXVEMoMHhhZGFlNjUxNCksIFdUQygweGFlMGNjYTE4KSwgV1RDKDB4YWU4MDdmZGUpLAorICAgIFdUQygweGFmMDhkOTY3KSwgV1RDKDB4YWZhNTI5NmYpLCBXVEMoMHhiMDU0YzJhYyksIFdUQygweGIxMTZmODFiKSwKKyAgICBXVEMoMHhiMWViMWNiMSksIFdUQygweGIyZDA4MmZlKSwgV1RDKDB4YjNjNjc3ZTUpLCBXVEMoMHhiNGNjNmU5YyksCisgICAgV1RDKDB4YjVlMTdlYjQpLCBXVEMoMHhiNzA1Mjk1NiksIFdUQygweGI4MzZiNDI3KSwgV1RDKDB4Yjk3NTcxZjMpLAorICAgIFdUQygweGJhYzBiNTk0KSwgV1RDKDB4YmMxN2QxZWUpLCBXVEMoMHhiZDdhMTllYiksIFdUQygweGJlZTZlMDcxKSwKKyAgICBXVEMoMHhjMDVkNzgzNyksIFdUQygweGMxZGQzM2ZlKSwgV1RDKDB4YzM2NTY2YzIpLCBXVEMoMHhjNGY1NjM3NyksCisgICAgV1RDKDB4YzY4YzdjZTUpLCBXVEMoMHhjODJhMDVkYiksIFdUQygweGM5Y2Q1MTQ4KSwgV1RDKDB4Y2I3NWIyMDcpLAorICAgIFdUQygweGNkMjI3YWQ5KSwgV1RDKDB4Y2VkMmZlOTUpLCBXVEMoMHhkMDg2OTAyNiksIFdUQygweGQyM2M4MjY4KSwKKyAgICBXVEMoMHhkM2Y0MjgzNCksIFdUQygweGQ1YWNkNDYwKSwgV1RDKDB4ZDc2NWQ5YzUpLCBXVEMoMHhkOTFlOGI0MiksCisgICAgV1RDKDB4ZGFkNjNiYjUpLCBXVEMoMHhkYzhjM2RmMiksIFdUQygweGRlM2ZlNGQxKSwgV1RDKDB4ZGZmMDgzMzMpLAorICAgIFdUQygweGUxOWQ2YmY2KSwgV1RDKDB4ZTM0NWYxZWUpLCBXVEMoMHhlNGU5NjdmMyksIFdUQygweGU2ODcyMGU3KSwKKyAgICBXVEMoMHhlODFlNmZhMyksIFdUQygweGU5YWVhNmZiKSwgV1RDKDB4ZWIzNzE5Y2IpLCBXVEMoMHhlY2I3MWFmMyksCisgICAgV1RDKDB4ZWUyZGZkNGIpLCBXVEMoMHhlZjliMTNhYiksIFdUQygweGYwZmRiMGVlKSwgV1RDKDB4ZjI1NTI3ZjEpLAorICAgIFdUQygweGYzYTBjYjhlKSwgV1RDKDB4ZjRkZmVlOWYpLCBXVEMoMHhmNjExZTNmZiksIFdUQygweGY3MzVmZThiKSwKKyAgICBXVEMoMHhmODRiOTExYSksIFdUQygweGY5NTFlZTg1KSwgV1RDKDB4ZmE0ODY5YTUpLCBXVEMoMHhmYjJlNTU1NyksCisgICAgV1RDKDB4ZmMwMzA0NzcpLCBXVEMoMHhmY2M1YzllMCksIFdUQygweGZkNzVmODZiKSwgV1RDKDB4ZmUxMmUyZjIpLAorICAgIFdUQygweGZlOWJkYzUxKSwgV1RDKDB4ZmYxMDM3NjEpLCBXVEMoMHhmZjZmNDZmYyksIFdUQygweGZmYjg1ZGZlKSwKKyAgICBXVEMoMHhmZmVhY2Y0MiksIFdUQygweDAwMDVlZTAzKSwgV1RDKDB4MDAwOTE2MmIpLCBXVEMoMHhmZmYzNjhkMSksCit9OworCitjb25zdCBGSVhQX1dUQiBMb3dEZWxheVN5bnRoZXNpczE2MFs0ODBdID0geworICAgIFdUQygweGRiMTcxMTMwKSwgV1RDKDB4ZGJmYWRmYmQpLCBXVEMoMHhkY2UyMTkyYSksIFdUQygweGRkY2NjYmM4KSwKKyAgICBXVEMoMHhkZWJhZWIwYyksIFdUQygweGRmYWM2ZWJkKSwgV1RDKDB4ZTBhMTc4NzUpLCBXVEMoMHhlMTk5ZTEwYyksCisgICAgV1RDKDB4ZTI5NTMxZmQpLCBXVEMoMHhlMzkzM2VmNiksIFdUQygweGU0OTQ4N2JlKSwgV1RDKDB4ZTU5OGJjZjUpLAorICAgIFdUQygweGU2OWYzOGIwKSwgV1RDKDB4ZTdhNzNkNDUpLCBXVEMoMHhlOGIwMmU5NCksIFdUQygweGU5YjlkYzk3KSwKKyAgICBXVEMoMHhlYWM0ZTYyYyksIFdUQygweGViZDExMWZjKSwgV1RDKDB4ZWNkZDAyNDIpLCBXVEMoMHhlZGU3MTc4ZCksCisgICAgV1RDKDB4ZWVlZTljMjQpLCBXVEMoMHhlZmYzNGRiYSksIFdUQygweGYwZjRlYWY1KSwgV1RDKDB4ZjFmMzY2OTUpLAorICAgIFdUQygweGYyZWViMmIyKSwgV1RDKDB4ZjNlNjYzY2IpLCBXVEMoMHhmNGQ5Y2JmZSksIFdUQygweGY1Yzc2YjNjKSwKKyAgICBXVEMoMHhmNmFkYTRjYiksIFdUQygweGY3OGJjOTJkKSwgV1RDKDB4Zjg2MmRjNTcpLCBXVEMoMHhmOTM1ODljYSksCisgICAgV1RDKDB4ZmEwNTliNDQpLCBXVEMoMHhmYWQ1MDFmYyksIFdUQygweGZiYTQ5ODE5KSwgV1RDKDB4ZmM3NDBmNTgpLAorICAgIFdUQygweGZkNDY1YjZkKSwgV1RDKDB4ZmUxZWUwNmYpLCBXVEMoMHhmZWYyNTgxYiksIFdUQygweGZmOWVjN2Q5KSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4YmZmMTQzZjYpLCBXVEMoMHhiZmQzY2Q1YyksIFdUQygweGJmYjY0ZDU0KSwgV1RDKDB4YmY5OGNlODApLAorICAgIFdUQygweGJmN2I1MjkxKSwgV1RDKDB4YmY1ZGQ1MjMpLCBXVEMoMHhiZjQwNWY4ZSksIFdUQygweGJmMjJlZTU1KSwKKyAgICBXVEMoMHhiZjA1ODY2NCksIFdUQygweGJlZTgyZDIyKSwgV1RDKDB4YmVjYWUwYTEpLCBXVEMoMHhiZWFkYWNiNSksCisgICAgV1RDKDB4YmU5MDhmNjgpLCBXVEMoMHhiZTczOTAxZCksIFdUQygweGJlNTZiNjczKSwgV1RDKDB4YmUzYTAxM2UpLAorICAgIFdUQygweGJlMWQ3ZGFkKSwgV1RDKDB4YmUwMTJiMTkpLCBXVEMoMHhiZGU1MTEzNCksIFdUQygweGJkYzkzNzgxKSwKKyAgICBXVEMoMHhiZGFkOWM4OCksIFdUQygweGJkOTI0YmQ4KSwgV1RDKDB4YmQ3NzQzMTEpLCBXVEMoMHhiZDVjODgyYiksCisgICAgV1RDKDB4YmQ0MjIwZmEpLCBXVEMoMHhiZDI4MGE0OSksIFdUQygweGJkMGU0ZDUwKSwgV1RDKDB4YmNmNGU0NmUpLAorICAgIFdUQygweGJjZGJkMWE0KSwgV1RDKDB4YmNjMzE2MjQpLCBXVEMoMHhiY2FhYWEwMiksIFdUQygweGJjOTI5MzQ4KSwKKyAgICBXVEMoMHhiYzdhY2MxMiksIFdUQygweGJjNjM1MjVlKSwgV1RDKDB4YmM0YzI2YjEpLCBXVEMoMHhiYzM1M2VhOSksCisgICAgV1RDKDB4YmMxZTkxZTIpLCBXVEMoMHhiYzA4NWFlYSksIFdUQygweGJiZjFjMDRhKSwgV1RDKDB4YmJkYzc1MjEpLAorICAgIFdUQygweGJiY2U0NzQwKSwgV1RDKDB4YmJjYTUxODcpLCBXVEMoMHhiYmNkM2E3YyksIFdUQygweGJiZDMzNjM0KSwKKyAgICBXVEMoMHhiYmRjMGEzNCksIFdUQygweGJiZWEyMThhKSwgV1RDKDB4YmJmZTI1YjcpLCBXVEMoMHhiYzE2Mjg4NyksCisgICAgV1RDKDB4YmMzMDc2YzUpLCBXVEMoMHhiYzRkMDlmNiksIFdUQygweGJjNmQ5MjVjKSwgV1RDKDB4YmM5NGRhNmUpLAorICAgIFdUQygweGJjYzQ4MzAwKSwgV1RDKDB4YmNmYzk3NjMpLCBXVEMoMHhiZDNiZDk0ZiksIFdUQygweGJkODA4ZDA1KSwKKyAgICBXVEMoMHhiZGM5YTExYiksIFdUQygweGJlMTZlMzM5KSwgV1RDKDB4YmU2OTFkYjkpLCBXVEMoMHhiZWMxNzljMSksCisgICAgV1RDKDB4YmYyMTAxNDApLCBXVEMoMHhiZjg4Y2Q2MiksIFdUQygweGJmZjhlOGQzKSwgV1RDKDB4YzA2ZTFhYWEpLAorICAgIFdUQygweGMwZTQ1OTUxKSwgV1RDKDB4YzE1YjM4MjApLCBXVEMoMHhjMWQ2ZTJmZiksIFdUQygweGMyNTkwZTBhKSwKKyAgICBXVEMoMHhjMmUxMGY4MyksIFdUQygweGMzNmM1YzlhKSwgV1RDKDB4YzNmNzM1ZjMpLCBXVEMoMHhjNDdmYjJkMSksCisgICAgV1RDKDB4YzUwYWJjZTUpLCBXVEMoMHhjNTlhMGEyNSksIFdUQygweGM2MjlmMjFjKSwgV1RDKDB4YzZiNmVmODkpLAorICAgIFdUQygweGM3NDI3MTgwKSwgV1RDKDB4YzdjZDFmYzQpLCBXVEMoMHhjODU2NDg1ZiksIFdUQygweGM4ZGNhZTkzKSwKKyAgICBXVEMoMHhiNDg3YTk4NiksIFdUQygweGIyY2UwODEyKSwgV1RDKDB4YjExYmM0YzIpLCBXVEMoMHhhZjcwZDVjYiksCisgICAgV1RDKDB4YWRjZDIyOGUpLCBXVEMoMHhhYzMwODZhMiksIFdUQygweGFhOWFmMzZiKSwgV1RDKDB4YTkwYzU5MzUpLAorICAgIFdUQygweGE3ODRiMjE0KSwgV1RDKDB4YTYwNDA3ZTkpLCBXVEMoMHhhNDhhNzA3NiksIFdUQygweGEzMTgwNmY5KSwKKyAgICBXVEMoMHhhMWFjZWIwMyksIFdUQygweGEwNDk0ZjYzKSwgV1RDKDB4OWVlZDY4NDApLCBXVEMoMHg5ZDk5NjU3MCksCisgICAgV1RDKDB4OWM0ZDkzYjQpLCBXVEMoMHg5YjBhMzExNCksIFdUQygweDk5Y2Y3OThkKSwgV1RDKDB4OTg5ZGIxNmEpLAorICAgIFdUQygweDk3NzUyMTQ2KSwgV1RDKDB4OTY1NjA5ZjEpLCBXVEMoMHg5NTQwOWIwNSksIFdUQygweDk0MzRmZGE5KSwKKyAgICBXVEMoMHg5MzMzNTg3YiksIFdUQygweDkyM2JjN2Q2KSwgV1RDKDB4OTE0ZTUyOTkpLCBXVEMoMHg5MDZhZjM0NSksCisgICAgV1RDKDB4OGY5MTg1ZTYpLCBXVEMoMHg4ZWMxY2JlOSksIFdUQygweDhkZmI2NGM5KSwgV1RDKDB4OGQzZGFiMTgpLAorICAgIFdUQygweDhjODdkZTM0KSwgV1RDKDB4OGJkOGM0OTQpLCBXVEMoMHg4YjJlY2FjYyksIFdUQygweDhhODgyYTVmKSwKKyAgICBXVEMoMHg4OWUyZWNkMSksIFdUQygweDg5M2YxMmIyKSwgV1RDKDB4ODhhM2M4NzgpLCBXVEMoMHg4ODIxNDFjNyksCisgICAgV1RDKDB4ODdjNjVkY2QpLCBXVEMoMHg4N2EwYzA3YiksIFdUQygweDg3NzhiODU5KSwgV1RDKDB4ODc1MTQ2OTgpLAorICAgIFdUQygweDg3MjhlOTAwKSwgV1RDKDB4ODcwMDA2NzkpLCBXVEMoMHg4NmQ2OGYwNSksIFdUQygweDg2YWM2ZWU3KSwKKyAgICBXVEMoMHg4NjgxYTVjZSksIFdUQygweDg2NTYyZWQwKSwgV1RDKDB4ODYyOWZkZWIpLCBXVEMoMHg4NWZkMWNhOCksCisgICAgV1RDKDB4ODVjZjdiMzIpLCBXVEMoMHg4NWExMWEyZiksIFdUQygweDg1NzFmYmJlKSwgV1RDKDB4ODU0MjEzZjUpLAorICAgIFdUQygweDg1MTE3MjJiKSwgV1RDKDB4ODRlMDBlZTMpLCBXVEMoMHg4NGFkZjM0NiksIFdUQygweDg0N2IyOGU1KSwKKyAgICBXVEMoMHg4NDQ3YTlkMCksIFdUQygweDg0MTM4YTIwKSwgV1RDKDB4ODNkZWM1YjYpLCBXVEMoMHg4M2E5Njk0ZiksCisgICAgV1RDKDB4ODM3MzgyMzEpLCBXVEMoMHg4MzNkMGRlZiksIFdUQygweDgzMDYyNDdiKSwgV1RDKDB4ODJjZWMyOWIpLAorICAgIFdUQygweDgyOTZmNWYzKSwgV1RDKDB4ODI1ZWNiZTQpLCBXVEMoMHg4MjI2M2ZlOCksIFdUQygweDgxZWQ2ODJmKSwKKyAgICBXVEMoMHg4MWI0NDA2ZCksIFdUQygweDgxN2FkMmExKSwgV1RDKDB4ODE0MTI3ZjQpLCBXVEMoMHg4MTA3MzkyZCksCisgICAgV1RDKDB4ODBjZDE4NGQpLCBXVEMoMHg4MDkyYmM1ZiksIFdUQygweDgwNTgyODY2KSwgV1RDKDB4ODAxZDcxNGYpLAorICAgIFdUQygweDBhYTRmODQ2KSwgV1RDKDB4MGIzNjg2ZmUpLCBXVEMoMHgwYmNlODk5ZSksIFdUQygweDBjNmI4YTdlKSwKKyAgICBXVEMoMHgwZDBkMDM2ZiksIFdUQygweDBkYjM1OGI4KSwgV1RDKDB4MGU1ZTMxZGQpLCBXVEMoMHgwZjBlNDI3MCksCisgICAgV1RDKDB4MGZjMzQ3YzEpLCBXVEMoMHgxMDdjMzVjYyksIFdUQygweDExMzgzYTYzKSwgV1RDKDB4MTFmNjg3NTkpLAorICAgIFdUQygweDEyYjdiMWUzKSwgV1RDKDB4MTM3OTlkNjEpLCBXVEMoMHgxNDM4M2RiNCksIFdUQygweDE0ZjAzMmMwKSwKKyAgICBXVEMoMHgxNTllNjkyMCksIFdUQygweDE2M2ZiNDQ5KSwgV1RDKDB4MTZkMTQ4MjApLCBXVEMoMHgxNzUxMmMzZiksCisgICAgV1RDKDB4MTdjNWY2MjIpLCBXVEMoMHgxODQ4M2YyYSksIFdUQygweDE4ZGYzMDc0KSwgV1RDKDB4MTk4OWY1ODkpLAorICAgIFdUQygweDFhNDc4M2FmKSwgV1RDKDB4MWIxNmYxNTIpLCBXVEMoMHgxYmY3Nzk1YSksIFdUQygweDFjZTdjOTUwKSwKKyAgICBXVEMoMHgxZGU4MTdlYyksIFdUQygweDFlZmEzZjRhKSwgV1RDKDB4MjAxZmYzN2EpLCBXVEMoMHgyMTU3ZDRlMSksCisgICAgV1RDKDB4MjI5OTUwMzYpLCBXVEMoMHgyM2UwZDg4MiksIFdUQygweDI1MzQ1ZGIyKSwgV1RDKDB4MjY5YTEwYzMpLAorICAgIFdUQygweDI4MGEwNzk4KSwgV1RDKDB4Mjk3ZDZjZjkpLCBXVEMoMHgyYWZhN2UxYiksIFdUQygweDJjOGQyMTBhKSwKKyAgICBXVEMoMHgyZTM3N2RiMiksIFdUQygweDJmZWI2MGNjKSwgV1RDKDB4MzE5NzcxMTEpLCBXVEMoMHgzMzNiMTYzNyksCisgICAgV1RDKDB4MzRlYTE0ZGYpLCBXVEMoMHgzNmJhMzJkNCksIFdUQygweDM4YTUyNGM4KSwgV1RDKDB4M2E4ZmE4OTEpLAorICAgIFdUQygweDNjNjQwY2IzKSwgV1RDKDB4M2UyMmFiMTEpLCBXVEMoMHgzZmRlN2NjOSksIFdUQygweDQxYTgwNDg2KSwKKyAgICBXVEMoMHg0MzgzOTRlNCksIFdUQygweDQ1NmM4ZDhmKSwgV1RDKDB4NDc1OGY0ZGEpLCBXVEMoMHg0OTNkN2E3YiksCisgICAgV1RDKDB4NGIxMzlmMzIpLCBXVEMoMHg0Y2RiYjE5OSksIFdUQygweDRlOWFiOGQxKSwgV1RDKDB4NTA1Njk1MzApLAorICAgIFdUQygweDUyMTNhODllKSwgV1RDKDB4NTNkNTQ2MmMpLCBXVEMoMHg1NTlhNWFhNyksIFdUQygweDU3NTZhY2Y1KSwKKyAgICBXVEMoMHg1OGZjZmIzOCksIFdUQygweDVhOGUzZTA3KSwgV1RDKDB4NWMxYTIwZTgpLCBXVEMoMHg1ZGE2YzdkYSksCisgICAgV1RDKDB4NWYzMjMxZjMpLCBXVEMoMHg2MGI1MWZiNiksIFdUQygweDYyMjYwODQ4KSwgV1RDKDB4NjM4MWY1YTkpLAorICAgIFdUQygweDY0ZDc5YWM3KSwgV1RDKDB4NjYyYzUxYzApLCBXVEMoMHg2Nzc3OWMwNyksIFdUQygweDY4YjIyMTg0KSwKKyAgICBXVEMoMHg2OWUwY2EyOCksIFdUQygweDZiMDY4YmNmKSwgV1RDKDB4NmMyMzAwOGUpLCBXVEMoMHg2ZDM0Njg1NiksCisgICAgV1RDKDB4YWVjOTI2OTMpLCBXVEMoMHhiMjJjYTJiZCksIFdUQygweGI1NzhkNDIxKSwgV1RDKDB4YjhiMjdlZGIpLAorICAgIFdUQygweGJiZGMzOGI1KSwgV1RDKDB4YmVmNTk4YmIpLCBXVEMoMHhjMWZlMGRjZCksIFdUQygweGM0ZjRkN2ZmKSwKKyAgICBXVEMoMHhjN2Q5ODQ3OSksIFdUQygweGNhYWJjMjg5KSwgV1RDKDB4Y2Q2YjM4ZjYpLCBXVEMoMHhkMDE3ZWRmZiksCisgICAgV1RDKDB4ZDJiMWFhMzcpLCBXVEMoMHhkNTM4NzM5ZiksIFdUQygweGQ3YWM1NTRkKSwgV1RDKDB4ZGEwZDJmNWUpLAorICAgIFdUQygweGRjNWIzZjY5KSwgV1RDKDB4ZGU5NjZlMzApLCBXVEMoMHhlMGJlZTJjOCksIFdUQygweGUyZDRjOWNkKSwKKyAgICBXVEMoMHhlNGQ4MjAwMCksIFdUQygweGU2Yzk0OTI2KSwgV1RDKDB4ZThhODRiMTQpLCBXVEMoMHhlYTc1NWFjMyksCisgICAgV1RDKDB4ZWMzMDliZGMpLCBXVEMoMHhlZGQ5ZjJhOCksIFdUQygweGVmNzFjMDQwKSwgV1RDKDB4ZjBmODQyYWQpLAorICAgIFdUQygweGYyNmU1M2NiKSwgV1RDKDB4ZjNkNGNkOWYpLCBXVEMoMHhmNTJiOWRkZiksIFdUQygweGY2NzFkYjRkKSwKKyAgICBXVEMoMHhmN2E1OGZhYSksIFdUQygweGY4Yzc5OTA3KSwgV1RDKDB4ZjlkYTdjNzMpLCBXVEMoMHhmYWRlZTI0MCksCisgICAgV1RDKDB4ZmJkMzYwZTYpLCBXVEMoMHhmY2I5NWRiNCksIFdUQygweGZkOTEzYmIxKSwgV1RDKDB4ZmU1OTRlMmUpLAorICAgIFdUQygweGZmMTBlNjdjKSwgV1RDKDB4ZmZiYzIzMjYpLCBXVEMoMHgwMDYwODM1MCksIFdUQygweDAwZmM4YTJkKSwKKyAgICBXVEMoMHgwMTg3MzMxMyksIFdUQygweDAxZjhlNGZlKSwgV1RDKDB4MDI1NzkzMTgpLCBXVEMoMHgwMmIwM2VjMyksCisgICAgV1RDKDB4MDMwYWIyZGEpLCBXVEMoMHgwMzYzZWEyYSksIFdUQygweDAzYjFlNjBkKSwgV1RDKDB4MDNlZTI5MjApLAorICAgIFdUQygweDA0MTg0MDVjKSwgV1RDKDB4MDQzNDg0NDkpLCBXVEMoMHgwNDQ4ZDlmNyksIFdUQygweDA0NTljNjVmKSwKKyAgICBXVEMoMHgwNDY5NGEyOSksIFdUQygweDA0NzViNTA2KSwgV1RDKDB4MDQ3YmViZWIpLCBXVEMoMHgwNDc4ZGNkMiksCisgICAgV1RDKDB4MDQ2YWE0NzUpLCBXVEMoMHgwNDUyNDlhOSksIFdUQygweDA0MzMzMmYwKSwgV1RDKDB4MDQxMWJiNzcpLAorICAgIFdUQygweDAzZWY4OTNiKSwgV1RDKDB4MDNjOWViYjgpLCBXVEMoMHgwMzlkYTc3OCksIFdUQygweDAzNmExMjczKSwKKyAgICBXVEMoMHgwMzMxNmE2MCksIFdUQygweDAyZjY1NTNhKSwgV1RDKDB4MDJiOThiZTkpLCBXVEMoMHgwMjdhMmUyYyksCisgICAgV1RDKDB4MDIzNmRmNjQpLCBXVEMoMHgwMWYwMzZiZiksIFdUQygweDAxYTc4YjQxKSwgV1RDKDB4MDE1ZDI5ZGEpLAorICAgIFdUQygweDAxMTE0NjI0KSwgV1RDKDB4MDBjNDA2ZTkpLCBXVEMoMHgwMDc1ZGRiMSksIFdUQygweDAwMjc3NjkyKSwKKyAgICBXVEMoMHhkNWUxMzllOSksIFdUQygweGQ0OTQzNjJlKSwgV1RDKDB4ZDM0ZTJiZmYpLCBXVEMoMHhkMjBlNTZmOCksCisgICAgV1RDKDB4ZDBkNWEzZGMpLCBXVEMoMHhjZmE1OTA0ZiksIFdUQygweGNlN2JlM2NiKSwgV1RDKDB4Y2Q1YjMwODYpLAorICAgIFdUQygweGNjNDIwZjBmKSwgV1RDKDB4Y2IyYzJiZjYpLCBXVEMoMHhjYTE2OTVjMyksIFdUQygweGM4ZmRmMDIwKSwKKyAgICBXVEMoMHhjN2U0ZmMwNyksIFdUQygweGM2YzM3NGM2KSwgV1RDKDB4YzU4OTU2NTMpLCBXVEMoMHhjNDI5NzIxOCksCisgICAgV1RDKDB4YzI5NmY5NTgpLCBXVEMoMHhjMGM1MWEzYyksIFdUQygweGJlYTg0ZWU1KSwgV1RDKDB4YmMzODg0MmYpLAorICAgIFdUQygweGI5OTE1OTY2KSwgV1RDKDB4YjcxODZhZTUpLCBXVEMoMHhiNGViMzA0MCksIFdUQygweGIzMDc2ODk3KSwKKyAgICBXVEMoMHhiMTZhY2JhMyksIFdUQygweGIwMTMxMTJhKSwgV1RDKDB4YWVmZGYwYTIpLCBXVEMoMHhhZTI5MjFmNSksCisgICAgV1RDKDB4YWQ5MjVjZDYpLCBXVEMoMHhhZDM3NThiZSksIFdUQygweGFkMTVjZDNkKSwgV1RDKDB4YWQyYjcxY2EpLAorICAgIFdUQygweGFkNzVmZTY1KSwgV1RDKDB4YWRmMzJhODQpLCBXVEMoMHhhZWEwYWRhOSksIFdUQygweGFmN2MzZmNkKSwKKyAgICBXVEMoMHhiMDgzOTgyNSksIFdUQygweGIxYjQ2ZTljKSwgV1RDKDB4YjMwYzdhMjApLCBXVEMoMHhiNDg5NzBiZSksCisgICAgV1RDKDB4YjYyOTEyZTApLCBXVEMoMHhiN2U5MGRlNyksIFdUQygweGI5YzcxZDEyKSwgV1RDKDB4YmJjMGY3ZmQpLAorICAgIFdUQygweGJkZDQ1Njc0KSwgV1RDKDB4YmZmZWYwMjIpLCBXVEMoMHhjMjNlN2M0OSksIFdUQygweGM0OTBiMmQ0KSwKKyAgICBXVEMoMHhjNmYzNGI3MCksIFdUQygweGM5NjNmZGE5KSwgV1RDKDB4Y2JlMDgxM2UpLCBXVEMoMHhjZTY2OGQ5OCksCisgICAgV1RDKDB4ZDBmM2RhNjkpLCBXVEMoMHhkMzg2MWY2NCksIFdUQygweGQ2MWIxNDFmKSwgV1RDKDB4ZDhiMDcwMzgpLAorICAgIFdUQygweGRiNDNlYjVkKSwgV1RDKDB4ZGRkMzNkMjIpLCBXVEMoMHhlMDVjMWQyZSksIFdUQygweGUyZGM0MzJjKSwKKyAgICBXVEMoMHhlNTUxNjZhZCksIFdUQygweGU3YjkzZjYyKSwgV1RDKDB4ZWExMTg0ZGYpLCBXVEMoMHhlYzU3ZWVjOSksCisgICAgV1RDKDB4ZWU4YTM0YzYpLCBXVEMoMHhmMGE2MGU3MCksIFdUQygweGYyYTkzMzZlKSwgV1RDKDB4ZjQ5MTViNjApLAorICAgIFdUQygweGY2NWMzZGVhKSwgV1RDKDB4ZjgwNzkyYWUpLCBXVEMoMHhmOTkxMTE0NyksIFdUQygweGZhZjY3MTU0KSwKKyAgICBXVEMoMHhmYzM1NmE3ZSksIFdUQygweGZkNGJiNDY1KSwgV1RDKDB4ZmUzNzA2YTkpLCBXVEMoMHhmZWY1MThlYyksCisgICAgV1RDKDB4ZmY4M2EyY2YpLCBXVEMoMHhmZmUwNWJlZCksIFdUQygweDAwMDhmZDI2KSwgV1RDKDB4ZmZmYjQwMzcpLAorfTsKKworY29uc3QgRklYUF9XVEIgTG93RGVsYXlTeW50aGVzaXMxMjhbMzg0XSA9IHsKKyAgICBXVEMoMHhkYjMzNWM3OCksIFdUQygweGRjNTEyZDQwKSwgV1RDKDB4ZGQ3NDYxMTYpLCBXVEMoMHhkZTljZjdhZSksCisgICAgV1RDKDB4ZGZjYWRkYTgpLCBXVEMoMHhlMGZlNDE5NiksIFdUQygweGUyMzZhNDA5KSwgV1RDKDB4ZTM3MzUxOGYpLAorICAgIFdUQygweGU0YjRlODcwKSwgV1RDKDB4ZTVmYWYyNWUpLCBXVEMoMHhlNzQ0MTkwYSksIFdUQygweGU4OGYwNmY0KSwKKyAgICBXVEMoMHhlOWRiMjc5NiksIFdUQygweGViMjk2MTNmKSwgV1RDKDB4ZWM3OGIwOGUpLCBXVEMoMHhlZGM1ZjY1ZCksCisgICAgV1RDKDB4ZWYwZjVhZjQpLCBXVEMoMHhmMDU0NDdkZCksIFdUQygweGYxOTQ1MzkyKSwgV1RDKDB4ZjJjZjc5NWEpLAorICAgIFdUQygweGY0MDUxMjNkKSwgV1RDKDB4ZjUzM2FmM2QpLCBXVEMoMHhmNjU4NDJkZCksIFdUQygweGY3NzA3MWFlKSwKKyAgICBXVEMoMHhmODdkNjIzZiksIFdUQygweGY5ODNjNzExKSwgV1RDKDB4ZmE4NzMwY2UpLCBXVEMoMHhmYjhhYWQ0YiksCisgICAgV1RDKDB4ZmM4ZTFkYzYpLCBXVEMoMHhmZDk2ZDE5YSksIFdUQygweGZlYTUzMjVhKSwgV1RDKDB4ZmY4ZDIxZGEpLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4YmZlZDk2MDYpLCBXVEMoMHhiZmM4YmRkZiksIFdUQygweGJmYTNkZDU3KSwgV1RDKDB4YmY3ZjAyM2MpLAorICAgIFdUQygweGJmNWEyNWU4KSwgV1RDKDB4YmYzNTU0ZGYpLCBXVEMoMHhiZjEwOGI2YiksIFdUQygweGJlZWJkN2JkKSwKKyAgICBXVEMoMHhiZWM3MzhhNiksIFdUQygweGJlYTJiZjQ1KSwgV1RDKDB4YmU3ZTZiNDIpLCBXVEMoMHhiZTVhNGZkNSksCisgICAgV1RDKDB4YmUzNjZkZTgpLCBXVEMoMHhiZTEyZDkxZSksIFdUQygweGJkZWY5MzM4KSwgV1RDKDB4YmRjY2FmNmUpLAorICAgIFdUQygweGJkYWEyZTNmKSwgV1RDKDB4YmQ4ODIwNWUpLCBXVEMoMHhiZDY2ODQzMCksIFdUQygweGJkNDU2OTk0KSwKKyAgICBXVEMoMHhiZDI0Y2RhZCksIFdUQygweGJkMDRiYzkxKSwgV1RDKDB4YmNlNTJkZWYpLCBXVEMoMHhiY2M2Mjk0MiksCisgICAgV1RDKDB4YmNhN2EyNzMpLCBXVEMoMHhiYzg5OWZiYSksIFdUQygweGJjNmMxNmFiKSwgV1RDKDB4YmM0ZjA4MTIpLAorICAgIFdUQygweGJjMzI2NTM3KSwgV1RDKDB4YmMxNjJmYjMpLCBXVEMoMHhiYmZhNTkxNSksIFdUQygweGJiZGVkNDYyKSwKKyAgICBXVEMoMHhiYmNkMzk1NiksIFdUQygweGJiY2FlMGY1KSwgV1RDKDB4YmJkMGJlYjcpLCBXVEMoMHhiYmRhYWY0MiksCisgICAgV1RDKDB4YmJlYzUyODkpLCBXVEMoMHhiYzA2ZDExNSksIFdUQygweGJjMjY2MTYyKSwgV1RDKDB4YmM0OTRkMjcpLAorICAgIFdUQygweGJjNzIxMDEzKSwgV1RDKDB4YmNhNWIyZDkpLCBXVEMoMHhiY2U2YTA2MyksIFdUQygweGJkMzM5ZDNkKSwKKyAgICBXVEMoMHhiZDg5NzViMiksIFdUQygweGJkZTYxOGIxKSwgV1RDKDB4YmU0OTlkZTEpLCBXVEMoMHhiZWI2MGZlYiksCisgICAgV1RDKDB4YmYyZDgzMGUpLCBXVEMoMHhiZmIxZWUyZSksIFdUQygweGMwNDFlMjJmKSwgV1RDKDB4YzBkNTk2MTgpLAorICAgIFdUQygweGMxNmE1NzRkKSwgV1RDKDB4YzIwNmVkOTQpLCBXVEMoMHhjMmFkN2FkMSksIFdUQygweGMzNWFlNzMzKSwKKyAgICBXVEMoMHhjNDA4NWZiZiksIFdUQygweGM0YjMzYTM1KSwgV1RDKDB4YzU2M2Y2Y2UpLCBXVEMoMHhjNjE4MWFiNyksCisgICAgV1RDKDB4YzZjODZiZWIpLCBXVEMoMHhjNzc2OGRlNCksIFdUQygweGM4MjMxYWIzKSwgV1RDKDB4YzhjYzE0NWEpLAorICAgIFdUQygweGI0NTAwZGRlKSwgV1RDKDB4YjIyYTUyNGUpLCBXVEMoMHhiMDEwMTQ0YyksIFdUQygweGFlMDEzNTMwKSwKKyAgICBXVEMoMHhhYmZkNzIwNiksIFdUQygweGFhMDRhOTJmKSwgV1RDKDB4YTgxNmMwMDgpLCBXVEMoMHhhNjMzYmFhYiksCisgICAgV1RDKDB4YTQ1YmJlMmIpLCBXVEMoMHhhMjhlZmY1ZSksIFdUQygweGEwY2RjNGM2KSwgV1RDKDB4OWYxODc4MDEpLAorICAgIFdUQygweDlkNmY3NzA4KSwgV1RDKDB4OWJkMzRlYjApLCBXVEMoMHg5YTQ0NzYzYSksIFdUQygweDk4YzM2YWNlKSwKKyAgICBXVEMoMHg5NzUwYjg5NiksIFdUQygweDk1ZWNkYzYxKSwgV1RDKDB4OTQ5ODJmOGMpLCBXVEMoMHg5MzUzMDA1YSksCisgICAgV1RDKDB4OTIxZDhiYWMpLCBXVEMoMHg5MGY3ZTEyNiksIFdUQygweDhmZTFlODI4KSwgV1RDKDB4OGVkYjNkZGMpLAorICAgIFdUQygweDhkZTMzN2M4KSwgV1RDKDB4OGNmODljZGIpLCBXVEMoMHg4YzE5YmU2ZCksIFdUQygweDhiNDNkMDcyKSwKKyAgICBXVEMoMHg4YTczNzY2MyksIFdUQygweDg5YTUyZjRkKSwgV1RDKDB4ODhkYzM4ZTgpLCBXVEMoMHg4ODJmNmYzZiksCisgICAgV1RDKDB4ODdjMjJjNTUpLCBXVEMoMHg4NzkxOGEyMSksIFdUQygweDg3NjAyYzYxKSwgV1RDKDB4ODcyZGZkMGEpLAorICAgIFdUQygweDg2ZmFlMDYzKSwgV1RDKDB4ODZjNmQ3MjkpLCBXVEMoMHg4NjkxYzRhZCksIFdUQygweDg2NWJhN2U4KSwKKyAgICBXVEMoMHg4NjI0NmI2NiksIFdUQygweDg1ZWMxN2FiKSwgV1RDKDB4ODViMjkzZTIpLCBXVEMoMHg4NTc3ZWFhYyksCisgICAgV1RDKDB4ODUzYzA5YmUpLCBXVEMoMHg4NGZmMDQyZCksIFdUQygweDg0YzBkMTk1KSwgV1RDKDB4ODQ4MThjNGMpLAorICAgIFdUQygweDg0NDEyZTYzKSwgV1RDKDB4ODNmZmQ0MmMpLCBXVEMoMHg4M2JkN2JkZiksIFdUQygweDgzN2E0NzFiKSwKKyAgICBXVEMoMHg4MzM2MzZkYyksIFdUQygweDgyZjE2ZTQ4KSwgV1RDKDB4ODJhYmVkMzcpLCBXVEMoMHg4MjY1ZDZjNCksCisgICAgV1RDKDB4ODIxZjI4Y2YpLCBXVEMoMHg4MWQ4MDMyMiksIFdUQygweDgxOTA2MjVjKSwgV1RDKDB4ODE0ODYxMzQpLAorICAgIFdUQygweDgwZmZmN2EwKSwgV1RDKDB4ODBiNzNkODYpLCBXVEMoMHg4MDZlMjUyNyksIFdUQygweDgwMjRjOTY5KSwKKyAgICBXVEMoMHgwYWI2YzJkMiksIFdUQygweDBiNmVkYWMyKSwgV1RDKDB4MGMzMDI5ODgpLCBXVEMoMHgwY2Y4OGZhYiksCisgICAgV1RDKDB4MGRjODc0NjEpLCBXVEMoMHgwZTlmOTEyMiksIFdUQygweDBmN2VlNTNmKSwgV1RDKDB4MTA2NGU3YmYpLAorICAgIFdUQygweDExNGZlNGI3KSwgV1RDKDB4MTIzZTllNGMpLCBXVEMoMHgxMzMxMTU4OSksIFdUQygweDE0MjBiNjY0KSwKKyAgICBXVEMoMHgxNTA2OTI0NSksIFdUQygweDE1ZGM5M2FkKSwgV1RDKDB4MTY5Y2FmNDEpLCBXVEMoMHgxNzQyMmUxNiksCisgICAgV1RDKDB4MTdkNTFkZTQpLCBXVEMoMHgxODdlNzYyMiksIFdUQygweDE5NDdhYTBiKSwgV1RDKDB4MWEyZWQzYjQpLAorICAgIFdUQygweDFiMzIxODU4KSwgV1RDKDB4MWM0ZmNjN2YpLCBXVEMoMHgxZDg2MDFhMyksIFdUQygweDFlZDZlYzVlKSwKKyAgICBXVEMoMHgyMDQ2MGIwNyksIFdUQygweDIxY2ZiZjU5KSwgV1RDKDB4MjM2NTI3MzIpLCBXVEMoMHgyNTA4ZTRiMSksCisgICAgV1RDKDB4MjZjN2IwYTYpLCBXVEMoMHgyODk1MDVkYSksIFdUQygweDJhNjk4ZGQ4KSwgV1RDKDB4MmM1OTU0ZDIpLAorICAgIFdUQygweDJlNmRkMTM1KSwgV1RDKDB4MzA4ZDgzOGYpLCBXVEMoMHgzMjlkZTM3NyksIFdUQygweDM0YjI4ZjEzKSwKKyAgICBXVEMoMHgzNmY2Nzk4OCksIFdUQygweDM5NWVjMWU1KSwgV1RDKDB4M2JiN2I1ODcpLCBXVEMoMHgzZGViNjNjYyksCisgICAgV1RDKDB4NDAxNmIzMjApLCBXVEMoMHg0MjU4NGViMiksIFdUQygweDQ0YjQyNGNhKSwgV1RDKDB4NDcxYmE1YjIpLAorICAgIFdUQygweDQ5NzkxOTU0KSwgV1RDKDB4NGJjMDIwMDQpLCBXVEMoMHg0ZGYzYjhjMCksIFdUQygweDUwMWYxZTFlKSwKKyAgICBXVEMoMHg1MjRiOTNlMiksIFdUQygweDU0N2YwZWVmKSwgV1RDKDB4NTZiMjNkMDMpLCBXVEMoMHg1OGM5OTA1MiksCisgICAgV1RDKDB4NWFiZmMwNDIpLCBXVEMoMHg1Y2FlYmYxYSksIFdUQygweDVlOWU2MThiKSwgV1RDKDB4NjA4NTk1ZDcpLAorICAgIFdUQygweDYyNTI4ZTY3KSwgV1RDKDB4NjQwMWViNTMpLCBXVEMoMHg2NWFkMGViMSksIFdUQygweDY3NGYxY2QyKSwKKyAgICBXVEMoMHg2OGQ4ODA0ZSksIFdUQygweDZhNGZmMTBlKSwgV1RDKDB4NmJiOTg3YTUpLCBXVEMoMHg2ZDEyZTkzNyksCisgICAgV1RDKDB4YWYzNzA2NTIpLCBXVEMoMHhiMzZiYWRjZiksIFdUQygweGI3N2VjMzIxKSwgV1RDKDB4YmI3N2UzNjQpLAorICAgIFdUQygweGJmNTc5NzllKSwgV1RDKDB4YzMxY2I1ODkpLCBXVEMoMHhjNmM1ZTY4NiksIFdUQygweGNhNTI4MTFkKSwKKyAgICBXVEMoMHhjZGMxZDY2YiksIFdUQygweGQxMTNkMGYwKSwgV1RDKDB4ZDQ0ODFjOTgpLCBXVEMoMHhkNzVlZTQxYiksCisgICAgV1RDKDB4ZGE1N2Y3YmYpLCBXVEMoMHhkZDMzYTkyNiksIFdUQygweGRmZjFlMjcyKSwgV1RDKDB4ZTI5MzEyMjcpLAorICAgIFdUQygweGU1MTc0MjMyKSwgV1RDKDB4ZTc3ZjBiMTUpLCBXVEMoMHhlOWNhODg5ZCksIFdUQygweGViZmEyZjdjKSwKKyAgICBXVEMoMHhlZTBkZTAwMiksIFdUQygweGYwMDYzMzI2KSwgV1RDKDB4ZjFlM2U1ZjEpLCBXVEMoMHhmM2E4ZDc0OSksCisgICAgV1RDKDB4ZjU1NTU1OTkpLCBXVEMoMHhmNmU3N2ViMiksIFdUQygweGY4NWNiNWQ2KSwgV1RDKDB4ZjliOGU2NGQpLAorICAgIFdUQygweGZhZmU1MmFkKSwgV1RDKDB4ZmMyYjM3YjgpLCBXVEMoMHhmZDQyMDQ2NyksIFdUQygweGZlNDE0MTJjKSwKKyAgICBXVEMoMHhmZjI2ZGVkNSksIFdUQygweGZmZmE2MTUwKSwgV1RDKDB4MDBjMzc0YTQpLCBXVEMoMHgwMTc3Mzg4NCksCisgICAgV1RDKDB4MDIwNThkZTMpLCBXVEMoMHgwMjc4ZDY4OSksIFdUQygweDAyZTg3MzcyKSwgV1RDKDB4MDM1OTMyNjgpLAorICAgIFdUQygweDAzYmE3OWFiKSwgV1RDKDB4MDNmZmYzMmIpLCBXVEMoMHgwNDJiMjM0MSksIFdUQygweDA0NDY5MGRlKSwKKyAgICBXVEMoMHgwNDViYzk2YSksIFdUQygweDA0NmU3N2U5KSwgV1RDKDB4MDQ3YTg1YzEpLCBXVEMoMHgwNDc5ZDhjNCksCisgICAgV1RDKDB4MDQ2ODFhZWMpLCBXVEMoMHgwNDQ3MzE4ZiksIFdUQygweDA0MWU0ZDEzKSwgV1RDKDB4MDNmM2VkYWQpLAorICAgIFdUQygweDAzYzRjYzE3KSwgV1RDKDB4MDM4YjFmNmYpLCBXVEMoMHgwMzQ3MDkwOSksIFdUQygweDAyZmRjZWJkKSwKKyAgICBXVEMoMHgwMmIxY2IxOCksIFdUQygweDAyNjE3MzBkKSwgV1RDKDB4MDIwYWZhZDApLCBXVEMoMHgwMWIwYjljOCksCisgICAgV1RDKDB4MDE1M2MxYTApLCBXVEMoMHgwMGY0NzQyNiksIFdUQygweDAwOTMzZGI3KSwgV1RDKDB4MDAzMTQwZTkpLAorICAgIFdUQygweGQ1YjczMGJmKSwgV1RDKDB4ZDQxOTJjMzIpLCBXVEMoMHhkMjg1OTQ3OSksIFdUQygweGQwZmMzYjlkKSwKKyAgICBXVEMoMHhjZjgwMDM1MiksIFdUQygweGNlMGU2YWIzKSwgV1RDKDB4Y2NhYWYyNWYpLCBXVEMoMHhjYjRlZDAwMyksCisgICAgV1RDKDB4YzlmM2FlNDQpLCBXVEMoMHhjODk0OGE1NiksIFdUQygweGM3MzIyNmZkKSwgV1RDKDB4YzViMjY3NmEpLAorICAgIFdUQygweGMzZmEyYTgyKSwgV1RDKDB4YzFmMDVmNzApLCBXVEMoMHhiZjdjODg0YiksIFdUQygweGJjOGIxZTg2KSwKKyAgICBXVEMoMHhiOTNlMTYzMyksIFdUQygweGI2M2ViNDgzKSwgV1RDKDB4YjNiNDVkMTQpLCBXVEMoMHhiMTlhOGVlMiksCisgICAgV1RDKDB4YWZlY2Q0YWEpLCBXVEMoMHhhZWE2YjhlNyksIFdUQygweGFkYzNjNmJmKSwgV1RDKDB4YWQzZjg4YWMpLAorICAgIFdUQygweGFkMTU4OTI5KSwgV1RDKDB4YWQ0MTUyYjEpLCBXVEMoMHhhZGJlNzA2OCksIFdUQygweGFlODg2Yzc2KSwKKyAgICBXVEMoMHhhZjlhZDFmZSksIFdUQygweGIwZjEyYjI2KSwgV1RDKDB4YjI4NzAzNDcpLCBXVEMoMHhiNDU3ZDYzMyksCisgICAgV1RDKDB4YjY1ZjU5MmMpLCBXVEMoMHhiODk4ZWNhMCksIFdUQygweGJiMDAyOTFiKSwgV1RDKDB4YmQ5MDk5NmIpLAorICAgIFdUQygweGMwNDVjODYxKSwgV1RDKDB4YzMxYjQwMjIpLCBXVEMoMHhjNjBjOGJkNSksIFdUQygweGM5MTUzNWYyKSwKKyAgICBXVEMoMHhjYzMwYzk0YyksIFdUQygweGNmNWFkMDM5KSwgV1RDKDB4ZDI4ZWQ1OGEpLCBXVEMoMHhkNWM4NjNlNSksCisgICAgV1RDKDB4ZDkwMzA1ZTYpLCBXVEMoMHhkYzNhNDY0NCksIFdUQygweGRmNjlhZjkzKSwgV1RDKDB4ZTI4Y2NjOTMpLAorICAgIFdUQygweGU1OWYyN2Q3KSwgV1RDKDB4ZTg5YzRjMTUpLCBXVEMoMHhlYjdmYzNlMyksIFdUQygweGVlNDUxOWY3KSwKKyAgICBXVEMoMHhmMGU3ZDhlZCksIFdUQygweGYzNjM4YjczKSwgV1RDKDB4ZjViM2JjMzApLCBXVEMoMHhmN2QzZjVkMCksCisgICAgV1RDKDB4ZjliZmMyZjApLCBXVEMoMHhmYjcyYWUzNSksIFdUQygweGZjZTg0MjUxKSwgV1RDKDB4ZmUxYzA5ZTUpLAorICAgIFdUQygweGZmMDk4ZjlhKSwgV1RDKDB4ZmZhYzVlMTUpLCBXVEMoMHhmZmZmZmZiMiksIFdUQygweDAwMDAxNTliKSwKK307CisKK2NvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzMTIwWzM2MF0gPSB7CisgICAgV1RDKDB4ZGIzY2NkY2QpLCBXVEMoMHhkYzZlMGQ2OSksIFdUQygweGRkYTU3MGE3KSwgV1RDKDB4ZGVlMmVmMzMpLAorICAgIFdUQygweGUwMjY4MGY0KSwgV1RDKDB4ZTE3MDQzOTcpLCBXVEMoMHhlMmJmNTYyNiksIFdUQygweGU0MTM3YzgwKSwKKyAgICBXVEMoMHhlNTZkMzBjZCksIFdUQygweGU2Y2IyMmZlKSwgV1RDKDB4ZTgyYjlmMTQpLCBXVEMoMHhlOThkODIyMCksCisgICAgV1RDKDB4ZWFmMThhMTcpLCBXVEMoMHhlYzU3MzI4ZiksIFdUQygweGVkYmFlOTAxKSwgV1RDKDB4ZWYxYTQyYjkpLAorICAgIFdUQygweGYwNzQ4MWY3KSwgV1RDKDB4ZjFjOTMyZDQpLCBXVEMoMHhmMzE4M2UxOSksIFdUQygweGY0NjBiMzVmKSwKKyAgICBXVEMoMHhmNWEwNGFjNyksIFdUQygweGY2ZDMzODQ1KSwgV1RDKDB4ZjdmODBlYzApLCBXVEMoMHhmOTEyYTVjZCksCisgICAgV1RDKDB4ZmEyODJhMmUpLCBXVEMoMHhmYjNjZDgxYyksIFdUQygweGZjNTE2MjliKSwgV1RDKDB4ZmQ2OWY4MWYpLAorICAgIFdUQygweGZlOGFiZGViKSwgV1RDKDB4ZmY4NmYxNzMpLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4YmZlYzViZmEpLCBXVEMoMHhiZmM1MGRkOCksIFdUQygweGJmOWRiODhiKSwgV1RDKDB4YmY3NjY4M2MpLAorICAgIFdUQygweGJmNGYxOTQ0KSwgV1RDKDB4YmYyN2Q2NDkpLCBXVEMoMHhiZjAwYTE1OCksIFdUQygweGJlZDk4NDhjKSwKKyAgICBXVEMoMHhiZWIyODhmMSksIFdUQygweGJlOGJiNzlmKSwgV1RDKDB4YmU2NTFmMDApLCBXVEMoMHhiZTNlYzZmOCksCisgICAgV1RDKDB4YmUxOGMxZjYpLCBXVEMoMHhiZGYzMTVmZSksIFdUQygweGJkY2RkNzlkKSwgV1RDKDB4YmRhOTA5YzEpLAorICAgIFdUQygweGJkODRiZWFlKSwgV1RDKDB4YmQ2MGY2YWIpLCBXVEMoMHhiZDNkYzIxMCksIFdUQygweGJkMWIyMDkzKSwKKyAgICBXVEMoMHhiY2Y5MWFlOSksIFdUQygweGJjZDdhY2FiKSwgV1RDKDB4YmNiNmQ1Y2MpLCBXVEMoMHhiYzk2OTE0MyksCisgICAgV1RDKDB4YmM3NmRjZjQpLCBXVEMoMHhiYzU3YjMxNyksIFdUQygweGJjMzkwYzRkKSwgV1RDKDB4YmMxYWQ1MTQpLAorICAgIFdUQygweGJiZmQyZmRiKSwgV1RDKDB4YmJkZmE1NDgpLCBXVEMoMHhiYmNjZTk0NiksIFdUQygweGJiY2IzOWQ5KSwKKyAgICBXVEMoMHhiYmQyMTRjZiksIFdUQygweGJiZGRmYjYwKSwgV1RDKDB4YmJmMzc4M2UpLCBXVEMoMHhiYzExZjhkMiksCisgICAgV1RDKDB4YmMzNTA5ZjgpLCBXVEMoMHhiYzVjYTJiMCksIFdUQygweGJjOGRjMGIwKSwgV1RDKDB4YmNjZDRiMmYpLAorICAgIFdUQygweGJkMWI3MTA3KSwgV1RDKDB4YmQ3NGM2YTQpLCBXVEMoMHhiZGQ2MzVjMCksIFdUQygweGJlM2Y0Y2Q3KSwKKyAgICBXVEMoMHhiZWIyNDgzNiksIFdUQygweGJmMzFiNWRmKSwgV1RDKDB4YmZiZmU2ZTIpLCBXVEMoMHhjMDVhNmRiZiksCisgICAgV1RDKDB4YzBmODA3MDApLCBXVEMoMHhjMTk4NDQ5YyksIFdUQygweGMyNDJlYTE1KSwgV1RDKDB4YzJmODI3MGQpLAorICAgIFdUQygweGMzYjIwYmQyKSwgV1RDKDB4YzQ2OGY1NTQpLCBXVEMoMHhjNTIyNjM3ZSksIFdUQygweGM1ZTI0MDNiKSwKKyAgICBXVEMoMHhjNjlmOTc3MSksIFdUQygweGM3NTk5ZGQ1KSwgV1RDKDB4YzgxMWY4NWEpLCBXVEMoMHhjOGM2ODdkYiksCisgICAgV1RDKDB4YjQzZDhiM2IpLCBXVEMoMHhiMWYzZmIzYyksIFdUQygweGFmYjc3YmU5KSwgV1RDKDB4YWQ4N2UwNjMpLAorICAgIFdUQygweGFiNjRkY2Q1KSwgV1RDKDB4YTk0ZTRjYzIpLCBXVEMoMHhhNzQ0MThmOCksIFdUQygweGE1NDY1ODM3KSwKKyAgICBXVEMoMHhhMzU1NDI1MiksIFdUQygweGExNzExZjU5KSwgV1RDKDB4OWY5YTYyZjUpLCBXVEMoMHg5ZGQxODEwNCksCisgICAgV1RDKDB4OWMxNzE2N2UpLCBXVEMoMHg5YTZiYmJlOSksIFdUQygweDk4ZDAwNjFjKSwgV1RDKDB4OTc0NDllMjMpLAorICAgIFdUQygweDk1Y2ExYWQ2KSwgV1RDKDB4OTQ2MGU3YTEpLCBXVEMoMHg5MzA5NjIyMiksIFdUQygweDkxYzNjOWRhKSwKKyAgICBXVEMoMHg5MDkwMjYzMyksIFdUQygweDhmNmUzYzVmKSwgV1RDKDB4OGU1ZDc3ODgpLCBXVEMoMHg4ZDVjYjc4OSksCisgICAgV1RDKDB4OGM2YTQyZDUpLCBXVEMoMHg4YjgzM2Q2ZiksIFdUQygweDhhYTNjYzEwKSwgV1RDKDB4ODljNzc4OWEpLAorICAgIFdUQygweDg4ZWY5ODAyKSwgV1RDKDB4ODgzNDUyYzMpLCBXVEMoMHg4N2MwYmI5YSksIFdUQygweDg3OGM4MzI2KSwKKyAgICBXVEMoMHg4NzU3ZWI0YyksIFdUQygweDg3MjIyMTE5KSwgV1RDKDB4ODZlYjVmMzEpLCBXVEMoMHg4NmIzODAyYyksCisgICAgV1RDKDB4ODY3YTczZWUpLCBXVEMoMHg4NjQwMmNmOCksIFdUQygweDg2MDRhNDM5KSwgV1RDKDB4ODVjN2NkMjIpLAorICAgIFdUQygweDg1ODlhNDBiKSwgV1RDKDB4ODU0YTFkMmYpLCBXVEMoMHg4NTA5NDRjMSksIFdUQygweDg0YzcxNjcwKSwKKyAgICBXVEMoMHg4NDgzYWNjOCksIFdUQygweDg0M2YwNGI2KSwgV1RDKDB4ODNmOTNjZDkpLCBXVEMoMHg4M2IyNTc2YyksCisgICAgV1RDKDB4ODM2YTc4MTIpLCBXVEMoMHg4MzIxYTc2NCksIFdUQygweDgyZDgwNWU4KSwgV1RDKDB4ODI4ZGEwNzYpLAorICAgIFdUQygweDgyNDI5MGMzKSwgV1RDKDB4ODFmNmU2YTgpLCBXVEMoMHg4MWFhYjIzYyksIFdUQygweDgxNWUwNWY4KSwKKyAgICBXVEMoMHg4MTEwZTRkNiksIFdUQygweDgwYzM2MmRmKSwgV1RDKDB4ODA3NTc4MWQpLCBXVEMoMHg4MDI3M2MwYyksCisgICAgV1RDKDB4MGFiY2I3ZWQpLCBXVEMoMHgwYjgxZDE4MyksIFdUQygweDBjNTExM2UzKSwgV1RDKDB4MGQyODY3ZDUpLAorICAgIFdUQygweDBlMDgyZmE1KSwgV1RDKDB4MGVmMDg5YWQpLCBXVEMoMHgwZmUxZDljZCksIFdUQygweDEwZDllNWY0KSwKKyAgICBXVEMoMHgxMWQ2YTJhMCksIFdUQygweDEyZDgxNGIxKSwgV1RDKDB4MTNkOThmNTIpLCBXVEMoMHgxNGQyMjFlMSksCisgICAgV1RDKDB4MTViYTQ2N2EpLCBXVEMoMHgxNjhhOWMxOCksIFdUQygweDE3M2QxZmVmKSwgV1RDKDB4MTdkYTNiZmYpLAorICAgIFdUQygweDE4OTEyY2FjKSwgV1RDKDB4MTk2YzJhNWUpLCBXVEMoMHgxYTY4ZGQyZSksIFdUQygweDFiODUyNTBjKSwKKyAgICBXVEMoMHgxY2JlYTlhMSksIFdUQygweDFlMTQ3YmU3KSwgV1RDKDB4MWY4YWE0NDYpLCBXVEMoMHgyMTIyZTczYSksCisgICAgV1RDKDB4MjJjZjZkZTMpLCBXVEMoMHgyNDg4NjdmMyksIFdUQygweDI2NWQ3OTM3KSwgV1RDKDB4Mjg0N2M5MWIpLAorICAgIFdUQygweDJhMzlkOThlKSwgV1RDKDB4MmM0ODJhYmYpLCBXVEMoMHgyZTdmZjQzOSksIFdUQygweDMwYzMxZjQ2KSwKKyAgICBXVEMoMHgzMmY1MjQ1ZCksIFdUQygweDM1MzUwNzBlKSwgV1RDKDB4MzdhZGFlMzgpLCBXVEMoMHgzYTNmMTUxYSksCisgICAgV1RDKDB4M2NhZjg2MWIpLCBXVEMoMHgzZWZmYzA4YiksIFdUQygweDQxNWE4MDNiKSwgV1RDKDB4NDNkNDVjYTkpLAorICAgIFdUQygweDQ2NjMxYzY5KSwgV1RDKDB4NDhlZDljN2UpLCBXVEMoMHg0YjYwODgwNyksIFdUQygweDRkYmJlYWQzKSwKKyAgICBXVEMoMHg1MDBjYTFkZiksIFdUQygweDUyNWUzYzVkKSwgV1RDKDB4NTRiN2MxOTkpLCBXVEMoMHg1NzBkZjlhMiksCisgICAgV1RDKDB4NTk0MGY2NjEpLCBXVEMoMHg1YjU0MmYxMyksIFdUQygweDVkNjRhMjAyKSwgV1RDKDB4NWY3MzhlMzkpLAorICAgIFdUQygweDYxNzA0MDI3KSwgV1RDKDB4NjM0OGVmNWUpLCBXVEMoMHg2NTEwOWM1ZiksIFdUQygweDY2ZDNlMjlkKSwKKyAgICBXVEMoMHg2ODdlYjI5YSksIFdUQygweDZhMTI1NjQzKSwgV1RDKDB4NmI5NjBiM2EpLCBXVEMoMHg2ZDA3YjI4MyksCisgICAgV1RDKDB4YWY1YjhkYWEpLCBXVEMoMHhiM2Q1NTdiYSksIFdUQygweGI4MjlmZWIyKSwgV1RDKDB4YmM2MTk5ZTcpLAorICAgIFdUQygweGMwN2JmYmMxKSwgV1RDKDB4YzQ3N2ExYjYpLCBXVEMoMHhjODUzMmYzMCksIFdUQygweGNjMGRkNjk4KSwKKyAgICBXVEMoMHhjZmE3MWYwNiksIFdUQygweGQzMWVjNTc4KSwgV1RDKDB4ZDY3NGM1YjkpLCBXVEMoMHhkOWE5MDUxNiksCisgICAgV1RDKDB4ZGNiYmMyYjYpLCBXVEMoMHhkZmFjZjkzNCksIFdUQygweGUyN2QxOWFiKSwgV1RDKDB4ZTUyYzNkODkpLAorICAgIFdUQygweGU3YmIwZjUyKSwgV1RDKDB4ZWEyOWJkZDApLCBXVEMoMHhlYzc4YmM0YSksIFdUQygweGVlYTgwNWU2KSwKKyAgICBXVEMoMHhmMGI4NWE2OCksIFdUQygweGYyYWIyNjZlKSwgV1RDKDB4ZjQ4MjM0YTcpLCBXVEMoMHhmNjNjYjczMyksCisgICAgV1RDKDB4ZjdkNzBiM2YpLCBXVEMoMHhmOTUyZDRkMyksIFdUQygweGZhYjQ5MDZkKSwgV1RDKDB4ZmJmYWE4NTgpLAorICAgIFdUQygweGZkMjcyNDM3KSwgV1RDKDB4ZmUzOTJiZWEpLCBXVEMoMHhmZjJlMjZmMSksIFdUQygweDAwMGVmYWMwKSwKKyAgICBXVEMoMHgwMGUzNmQyNiksIFdUQygweDAxOWJkODAzKSwgV1RDKDB4MDIyOWUzNTcpLCBXVEMoMHgwMmExNmIyNSksCisgICAgV1RDKDB4MDMxOWVlNWUpLCBXVEMoMHgwMzhjY2VhMCksIFdUQygweDAzZTU2ZDNkKSwgV1RDKDB4MDQxZGMwNzIpLAorICAgIFdUQygweDA0M2Y1OGNjKSwgV1RDKDB4MDQ1NzEyNzMpLCBXVEMoMHgwNDZiYTc2MSksIFdUQygweDA0NzljYWE1KSwKKyAgICBXVEMoMHgwNDdhMjI3OSksIFdUQygweDA0NjczOTUwKSwgV1RDKDB4MDQ0MzUyNjMpLCBXVEMoMHgwNDE3NTBkYSksCisgICAgV1RDKDB4MDNlOTk5MjYpLCBXVEMoMHgwM2I0YmExZiksIFdUQygweDAzNzMxZTJiKSwgV1RDKDB4MDMyN2IzMDMpLAorICAgIFdUQygweDAyZDgzMDFiKSwgV1RDKDB4MDI4NGZiMTEpLCBXVEMoMHgwMjJiNDY0YSksIFdUQygweDAxY2MxYjQwKSwKKyAgICBXVEMoMHgwMTY5YWI3ZCksIFdUQygweDAxMDQ3ZDFlKSwgV1RDKDB4MDA5ZDA0ZTApLCBXVEMoMHgwMDM0ODRiMCksCisgICAgV1RDKDB4ZDVhOTM0OGEpLCBXVEMoMHhkM2YwNWVjYSksIFdUQygweGQyNDMzOWU3KSwgV1RDKDB4ZDBhMjY5YjcpLAorICAgIFdUQygweGNmMGZlMDI2KSwgV1RDKDB4Y2Q4YWExNGIpLCBXVEMoMHhjYzEzOTYzZSksIFdUQygweGNhYTE5YzVhKSwKKyAgICBXVEMoMHhjOTJjZDcwMSksIFdUQygweGM3YjVjZDdiKSwgV1RDKDB4YzYyYTRmZTMpLCBXVEMoMHhjNDY3NDJiZSksCisgICAgV1RDKDB4YzI0ZTEyOGMpLCBXVEMoMHhiZmMwYjc1OCksIFdUQygweGJjYTY2MWUzKSwgV1RDKDB4YjkyMjkyNGIpLAorICAgIFdUQygweGI1Zjg3YWMyKSwgV1RDKDB4YjM1MzA4ZTcpLCBXVEMoMHhiMTJjYzkwZiksIFdUQygweGFmODA1MjJjKSwKKyAgICBXVEMoMHhhZTQ4M2IxMCksIFdUQygweGFkN2YxYWY5KSwgV1RDKDB4YWQxZjg4NzQpLCBXVEMoMHhhZDI0MWEwOSksCisgICAgV1RDKDB4YWQ4NzY2ZWEpLCBXVEMoMHhhZTQ0MDViMSksIFdUQygweGFmNTQ4ZDcyKSwgV1RDKDB4YjBiMzk0YWQpLAorICAgIFdUQygweGIyNWJiMjk3KSwgV1RDKDB4YjQ0NzZmYTEpLCBXVEMoMHhiNjcxOGQyYyksIFdUQygweGI4ZDQ3NzgxKSwKKyAgICBXVEMoMHhiYjZhZDM3YiksIFdUQygweGJlMmYzODMxKSwgV1RDKDB4YzExYzNjNmMpLCBXVEMoMHhjNDJjNzZiMSksCisgICAgV1RDKDB4Yzc1YTdlNDApLCBXVEMoMHhjYWEwZTlkMSksIFdUQygweGNkZmE1MDJiKSwgV1RDKDB4ZDE2MTQ4MDMpLAorICAgIFdUQygweGQ0ZDA2ODUwKSwgV1RDKDB4ZDg0MjQ3ZDMpLCBXVEMoMHhkYmIxN2Q2ZCksIFdUQygweGRmMTg5ZmUzKSwKKyAgICBXVEMoMHhlMjcyNDYxZSksIFdUQygweGU1YjkwNmUxKSwgV1RDKDB4ZThlNzc5MGUpLCBXVEMoMHhlYmY4MzM2NiksCisgICAgV1RDKDB4ZWVlNWNjY2MpLCBXVEMoMHhmMWFhZGMwYSksIFdUQygweGY0NDFmN2ZhKSwgV1RDKDB4ZjZhNWI3NzIpLAorICAgIFdUQygweGY4ZDBiMTQ2KSwgV1RDKDB4ZmFiZDdjM2UpLCBXVEMoMHhmYzY2YWYzNSksIFdUQygweGZkYzZlMTAxKSwKKyAgICBXVEMoMHhmZWQ4YTg3NSksIFdUQygweGZmOTY5YzYzKSwgV1RDKDB4ZmZmYjUzOTApLCBXVEMoMHgwMDAxN2FkOCksCit9OwogCiBjb25zdCBGSVhQX1dUQiBMb3dEZWxheVN5bnRoZXNpczUxMlsxNTM2XSA9IHsKLS8qIHBhcnQgMCAqLwotV1RDKDB4ZGFjOTg0YzApLCBXVEMoMHhkYjEwMDA4MCksIFdUQygweGRiNTZjZDAwKSwgV1RDKDB4ZGI5ZGVjNDApLCBXVEMoMHhkYmU1NWZjMCksIFdUQygweGRjMmQyODgwKSwgV1RDKDB4ZGM3NTQ3ODApLCBXVEMoMHhkY2JkYmQ4MCksCi1XVEMoMHhkZDA2OGE4MCksIFdUQygweGRkNGZhZTgwKSwgV1RDKDB4ZGQ5OTI5NDApLCBXVEMoMHhkZGUyZjljMCksIFdUQygweGRlMmQxZmMwKSwgV1RDKDB4ZGU3NzlhODApLCBXVEMoMHhkZWMyNmEwMCksIFdUQygweGRmMGQ4ZTAwKSwKLVdUQygweGRmNTkwNjgwKSwgV1RDKDB4ZGZhNGQ1NDApLCBXVEMoMHhkZmYwZmM4MCksIFdUQygweGUwM2Q3ZTIwKSwgV1RDKDB4ZTA4YTU5MDApLCBXVEMoMHhlMGQ3OGEyMCksIFdUQygweGUxMjUwY2MwKSwgV1RDKDB4ZTE3MmRjYzApLAotV1RDKDB4ZTFjMGY3YTApLCBXVEMoMHhlMjBmNTlhMCksIFdUQygweGUyNWRmZWEwKSwgV1RDKDB4ZTJhY2U0MDApLCBXVEMoMHhlMmZjMGJlMCksIFdUQygweGUzNGI3YmMwKSwgV1RDKDB4ZTM5YjNjODApLCBXVEMoMHhlM2ViNTI2MCksCi1XVEMoMHhlNDNiYmFjMCksIFdUQygweGU0OGM3MTYwKSwgV1RDKDB4ZTRkZDcxNDApLCBXVEMoMHhlNTJlYjYwMCksIFdUQygweGU1ODAzYzAwKSwgV1RDKDB4ZTVkMWZkYTApLCBXVEMoMHhlNjIzZjM2MCksIFdUQygweGU2NzYxNzAwKSwKLVdUQygweGU2Yzg2NDAwKSwgV1RDKDB4ZTcxYWQ1MDApLCBXVEMoMHhlNzZkNjNlMCksIFdUQygweGU3YzAwYmEwKSwgV1RDKDB4ZTgxMmM4ZTApLCBXVEMoMHhlODY1OThlMCksIFdUQygweGU4Yjg3OGUwKSwgV1RDKDB4ZTkwYjY4YTApLAotV1RDKDB4ZTk1ZTZjNDApLCBXVEMoMHhlOWIxOGFlMCksIFdUQygweGVhMDRjZTgwKSwgV1RDKDB4ZWE1ODNiYTApLCBXVEMoMHhlYWFiY2RhMCksIFdUQygweGVhZmY3ZWUwKSwgV1RDKDB4ZWI1MzQ4ZTApLCBXVEMoMHhlYmE3MjJjMCksCi1XVEMoMHhlYmZiMDA2MCksIFdUQygweGVjNGVkMjQwKSwgV1RDKDB4ZWNhMjg1NDApLCBXVEMoMHhlY2Y2MGMyMCksIFdUQygweGVkNDk2MTIwKSwgV1RDKDB4ZWQ5YzdlODApLCBXVEMoMHhlZGVmNWU0MCksIFdUQygweGVlNDFmYzAwKSwKLVdUQygweGVlOTQ1NjAwKSwgV1RDKDB4ZWVlNjZhYzApLCBXVEMoMHhlZjM4MzlhMCksIFdUQygweGVmODljMGUwKSwgV1RDKDB4ZWZkYWZkYTApLCBXVEMoMHhmMDJiZWQ2MCksIFdUQygweGYwN2M4ZTgwKSwgV1RDKDB4ZjBjY2UwMDApLAotV1RDKDB4ZjExY2UyMjApLCBXVEMoMHhmMTZjOTYyMCksIFdUQygweGYxYmJmZTMwKSwgV1RDKDB4ZjIwYjE5ZTApLCBXVEMoMHhmMjU5ZTVhMCksIFdUQygweGYyYTg1ZGMwKSwgV1RDKDB4ZjJmNjdlZDApLCBXVEMoMHhmMzQ0NDViMCksCi1XVEMoMHhmMzkxYWVkMCksIFdUQygweGYzZGViNTkwKSwgV1RDKDB4ZjQyYjUzZTApLCBXVEMoMHhmNDc3ODE0MCksIFdUQygweGY0YzMzMTkwKSwgV1RDKDB4ZjUwZTU2NjApLCBXVEMoMHhmNTU4ZGYzMCksIFdUQygweGY1YTJiZTUwKSwKLVdUQygweGY1ZWJlYTEwKSwgV1RDKDB4ZjYzNDU3ODApLCBXVEMoMHhmNjdiZmFiMCksIFdUQygweGY2YzJjZWUwKSwgV1RDKDB4ZjcwOGQ3YjApLCBXVEMoMHhmNzRlMTljMCksIFdUQygweGY3OTI5YTcwKSwgV1RDKDB4ZjdkNjY2MzApLAotV1RDKDB4ZjgxOTkyNjgpLCBXVEMoMHhmODVjMzg2MCksIFdUQygweGY4OWU3NDgwKSwgV1RDKDB4ZjhlMDU4YzApLCBXVEMoMHhmOTIxZWMwOCksIFdUQygweGY5NjMzODAwKSwgV1RDKDB4ZjlhNDQ5ODApLCBXVEMoMHhmOWU1MzE1OCksCi1XVEMoMHhmYTI2MDE1OCksIFdUQygweGZhNjZjYTE4KSwgV1RDKDB4ZmFhNzlhYzApLCBXVEMoMHhmYWU4NzkyMCksIFdUQygweGZiMjk1ZmEwKSwgV1RDKDB4ZmI2YTQyYjgpLCBXVEMoMHhmYmFiMTI0MCksIFdUQygweGZiZWJkMWMwKSwKLVdUQygweGZjMmM5YzI0KSwgV1RDKDB4ZmM2ZDhkOTApLCBXVEMoMHhmY2FlYzI0MCksIFdUQygweGZjZjA1Njg0KSwgV1RDKDB4ZmQzMjZhOTgpLCBXVEMoMHhmZDc1MjU0YyksIFdUQygweGZkYjhhZmQ0KSwgV1RDKDB4ZmRmY2NkZmMpLAotV1RDKDB4ZmU0MGQ2OTQpLCBXVEMoMHhmZTg0MTYxYyksIFdUQygweGZlYzVjZjVhKSwgV1RDKDB4ZmYwNGU3ZmMpLCBXVEMoMHhmZjNmZGZlMyksIFdUQygweGZmNzUxZGRmKSwgV1RDKDB4ZmZhMmZiMGYpLCBXVEMoMHhmZmM4N2M0MiksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweGJmZmI2MDgxKSwgV1RDKDB4YmZmMjJmODEpLCBXVEMoMHhiZmU4ZmMwMSksIFdUQygweGJmZGZjNzgxKSwgV1RDKDB4YmZkNjkxMDEpLCBXVEMoMHhiZmNkNWEwMSksIFdUQygweGJmYzQyMjAxKSwgV1RDKDB4YmZiYWU5ODEpLAotV1RDKDB4YmZiMWIxMDEpLCBXVEMoMHhiZmE4NzkwMSksIFdUQygweGJmOWY0MTgxKSwgV1RDKDB4YmY5NjBiMDEpLCBXVEMoMHhiZjhjZDQ4MSksIFdUQygweGJmODM5ZDgxKSwgV1RDKDB4YmY3YTY2ODEpLCBXVEMoMHhiZjcxMmYwMSksCi1XVEMoMHhiZjY3ZjgwMSksIFdUQygweGJmNWVjMTAxKSwgV1RDKDB4YmY1NThiMDEpLCBXVEMoMHhiZjRjNTY4MSksIFdUQygweGJmNDMyMjgxKSwgV1RDKDB4YmYzOWVlODEpLCBXVEMoMHhiZjMwYmIwMSksIFdUQygweGJmMjc4ODAxKSwKLVdUQygweGJmMWU1NTAxKSwgV1RDKDB4YmYxNTIzODEpLCBXVEMoMHhiZjBiZjM4MSksIFdUQygweGJmMDJjNTgxKSwgV1RDKDB4YmVmOTk5MDEpLCBXVEMoMHhiZWYwNmQwMSksIFdUQygweGJlZTc0MjgxKSwgV1RDKDB4YmVkZTE5MDEpLAotV1RDKDB4YmVkNGYwODEpLCBXVEMoMHhiZWNiY2E4MSksIFdUQygweGJlYzJhNzgxKSwgV1RDKDB4YmViOTg2ODEpLCBXVEMoMHhiZWIwNjg4MSksIFdUQygweGJlYTc0YzgxKSwgV1RDKDB4YmU5ZTMyODEpLCBXVEMoMHhiZTk1MWE4MSksCi1XVEMoMHhiZThjMDUwMSksIFdUQygweGJlODJmMzAxKSwgV1RDKDB4YmU3OWU0ODEpLCBXVEMoMHhiZTcwZGEwMSksIFdUQygweGJlNjdkMzgxKSwgV1RDKDB4YmU1ZWQwODEpLCBXVEMoMHhiZTU1ZDAwMSksIFdUQygweGJlNGNkMzgxKSwKLVdUQygweGJlNDNkYTgxKSwgV1RDKDB4YmUzYWU2MDEpLCBXVEMoMHhiZTMxZjcwMSksIFdUQygweGJlMjkwZDAxKSwgV1RDKDB4YmUyMDI4MDEpLCBXVEMoMHhiZTE3NDc4MSksIFdUQygweGJlMGU2YzAxKSwgV1RDKDB4YmUwNTk0ODEpLAotV1RDKDB4YmRmY2MzMDEpLCBXVEMoMHhiZGYzZjcwMSksIFdUQygweGJkZWIzMTAxKSwgV1RDKDB4YmRlMjcyMDEpLCBXVEMoMHhiZGQ5Yjk4MSksIFdUQygweGJkZDEwNjgxKSwgV1RDKDB4YmRjODU5ODEpLCBXVEMoMHhiZGJmYjI4MSksCi1XVEMoMHhiZGI3MTIwMSksIFdUQygweGJkYWU3ODgxKSwgV1RDKDB4YmRhNWU2MDEpLCBXVEMoMHhiZDlkNWI4MSksIFdUQygweGJkOTRkODAxKSwgV1RDKDB4YmQ4YzVjMDEpLCBXVEMoMHhiZDgzZTY4MSksIFdUQygweGJkN2I3NzgxKSwKLVdUQygweGJkNzMxMDgxKSwgV1RDKDB4YmQ2YWIxMDEpLCBXVEMoMHhiZDYyNTk4MSksIFdUQygweGJkNWEwYjAxKSwgV1RDKDB4YmQ1MWM0ODEpLCBXVEMoMHhiZDQ5ODYwMSksIFdUQygweGJkNDE0ZjAxKSwgV1RDKDB4YmQzOTFmODEpLAotV1RDKDB4YmQzMGY4ODEpLCBXVEMoMHhiZDI4ZDk4MSksIFdUQygweGJkMjBjNDAxKSwgV1RDKDB4YmQxOGI3ODEpLCBXVEMoMHhiZDEwYjM4MSksIFdUQygweGJkMDhiNzgxKSwgV1RDKDB4YmQwMGMzODEpLCBXVEMoMHhiY2Y4ZDc4MSksCi1XVEMoMHhiY2YwZjM4MSksIFdUQygweGJjZTkxODAxKSwgV1RDKDB4YmNlMTQ2MDEpLCBXVEMoMHhiY2Q5N2M4MSksIFdUQygweGJjZDFiYjgxKSwgV1RDKDB4YmNjYTAzMDEpLCBXVEMoMHhiY2MyNTE4MSksIFdUQygweGJjYmFhODAxKSwKLVdUQygweGJjYjMwNjAxKSwgV1RDKDB4YmNhYjZjMDEpLCBXVEMoMHhiY2EzZGIwMSksIFdUQygweGJjOWM1MjgxKSwgV1RDKDB4YmM5NGQyMDEpLCBXVEMoMHhiYzhkNTkwMSksIFdUQygweGJjODVlODAxKSwgV1RDKDB4YmM3ZTdlMDEpLAotV1RDKDB4YmM3NzFjMDEpLCBXVEMoMHhiYzZmYzEwMSksIFdUQygweGJjNjg2ZTAxKSwgV1RDKDB4YmM2MTIzMDEpLCBXVEMoMHhiYzU5ZGY4MSksIFdUQygweGJjNTJhMzgxKSwgV1RDKDB4YmM0YjZlODEpLCBXVEMoMHhiYzQ0NDA4MSksCi1XVEMoMHhiYzNkMTgwMSksIFdUQygweGJjMzVmNTAxKSwgV1RDKDB4YmMyZWQ2ODEpLCBXVEMoMHhiYzI3YmQ4MSksIFdUQygweGJjMjBhZTAxKSwgV1RDKDB4YmMxOWFiMDEpLCBXVEMoMHhiYzEyYjgwMSksIFdUQygweGJjMGJjZjgxKSwKLVdUQygweGJjMDRlMzgxKSwgV1RDKDB4YmJmZGU0ODEpLCBXVEMoMHhiYmY2YzYwMSksIFdUQygweGJiZWY5YjgxKSwgV1RDKDB4YmJlODk5MDEpLCBXVEMoMHhiYmUxZjQwMSksIFdUQygweGJiZGJlMjAxKSwgV1RDKDB4YmJkNjhjODEpLAotV1RDKDB4YmJkMjEyODEpLCBXVEMoMHhiYmNlOTE4MSksIFdUQygweGJiY2MyNjgxKSwgV1RDKDB4YmJjYWNhMDEpLCBXVEMoMHhiYmNhNTA4MSksIFdUQygweGJiY2E4ZDAxKSwgV1RDKDB4YmJjYjUzMDEpLCBXVEMoMHhiYmNjODIwMSksCi1XVEMoMHhiYmNlMDYwMSksIFdUQygweGJiY2ZjYTgxKSwgV1RDKDB4YmJkMWJkODEpLCBXVEMoMHhiYmQzZTEwMSksIFdUQygweGJiZDY0ZDAxKSwgV1RDKDB4YmJkOTFiODEpLCBXVEMoMHhiYmRjNjQ4MSksIFdUQygweGJiZTAzODAxKSwKLVdUQygweGJiZTQ5ZDAxKSwgV1RDKDB4YmJlOTk5ODEpLCBXVEMoMHhiYmVmMzMwMSksIFdUQygweGJiZjU2MTgxKSwgV1RDKDB4YmJmYzBmODEpLCBXVEMoMHhiYzAzMjYwMSksIFdUQygweGJjMGE4ZjAxKSwgV1RDKDB4YmMxMjNiODEpLAotV1RDKDB4YmMxYTI0MDEpLCBXVEMoMHhiYzIyNDE4MSksIFdUQygweGJjMmE4YzgxKSwgV1RDKDB4YmMzMzA3ODEpLCBXVEMoMHhiYzNiYmMwMSksIFdUQygweGJjNDRiNDgxKSwgV1RDKDB4YmM0ZGZiODEpLCBXVEMoMHhiYzU3YTMwMSksCi1XVEMoMHhiYzYxYzQwMSksIFdUQygweGJjNmM3NzgxKSwgV1RDKDB4YmM3N2Q2MDEpLCBXVEMoMHhiYzgzZjIwMSksIFdUQygweGJjOTBkNDgxKSwgV1RDKDB4YmM5ZTg4MDEpLCBXVEMoMHhiY2FkMTUwMSksIFdUQygweGJjYmM3ZTAxKSwKLVdUQygweGJjY2NiZDAxKSwgV1RDKDB4YmNkZGNjODEpLCBXVEMoMHhiY2VmYTYwMSksIFdUQygweGJkMDIzZjAxKSwgV1RDKDB4YmQxNTg4MDEpLCBXVEMoMHhiZDI5NzE4MSksIFdUQygweGJkM2RlYjgxKSwgV1RDKDB4YmQ1MmViMDEpLAotV1RDKDB4YmQ2ODY2ODEpLCBXVEMoMHhiZDdlNTU4MSksIFdUQygweGJkOTRiMDAxKSwgV1RDKDB4YmRhYjcxODEpLCBXVEMoMHhiZGMyOWE4MSksIFdUQygweGJkZGEyYTAxKSwgV1RDKDB4YmRmMjIxODEpLCBXVEMoMHhiZTBhODU4MSksCi1XVEMoMHhiZTIzNjAwMSksIFdUQygweGJlM2NiYzAxKSwgV1RDKDB4YmU1NmEzODEpLCBXVEMoMHhiZTcxMjAwMSksIFdUQygweGJlOGMzNzgxKSwgV1RDKDB4YmVhN2YzMDEpLCBXVEMoMHhiZWM0NTg4MSksIFdUQygweGJlZTE3MjAxKSwKLVdUQygweGJlZmY0ODAxKSwgV1RDKDB4YmYxZGU2MDEpLCBXVEMoMHhiZjNkNTUwMSksIFdUQygweGJmNWQ5YTgxKSwgV1RDKDB4YmY3ZWI1ODEpLCBXVEMoMHhiZmEwYTU4MSksIFdUQygweGJmYzM2YTAxKSwgV1RDKDB4YmZlNmVkMDEpLAotV1RDKDB4YzAwYjA0YzApLCBXVEMoMHhjMDJmODZjMCksIFdUQygweGMwNTQ0OTQwKSwgV1RDKDB4YzA3OTJlYzApLCBXVEMoMHhjMDllMjY0MCksIFdUQygweGMwYzMxZjAwKSwgV1RDKDB4YzBlODBhMDApLCBXVEMoMHhjMTBjZjQ4MCksCi1XVEMoMHhjMTMyMDk0MCksIFdUQygweGMxNTc3M2MwKSwgV1RDKDB4YzE3ZDVmMDApLCBXVEMoMHhjMWEzZTM0MCksIFdUQygweGMxY2IwNWMwKSwgV1RDKDB4YzFmMmNiYzApLCBXVEMoMHhjMjFiMzk0MCksIFdUQygweGMyNDQ0YjAwKSwKLVdUQygweGMyNmRmNWMwKSwgV1RDKDB4YzI5ODJkODApLCBXVEMoMHhjMmMyZTY0MCksIFdUQygweGMyZWUwYTAwKSwgV1RDKDB4YzMxOTc5NDApLCBXVEMoMHhjMzQ1MTNjMCksIFdUQygweGMzNzBiOWMwKSwgV1RDKDB4YzM5YzRmMDApLAotV1RDKDB4YzNjN2JjMDApLCBXVEMoMHhjM2YyZTk0MCksIFdUQygweGM0MWRjMTQwKSwgV1RDKDB4YzQ0ODU2YzApLCBXVEMoMHhjNDcyZTY0MCksIFdUQygweGM0OWRhZDgwKSwgV1RDKDB4YzRjOGU4ODApLCBXVEMoMHhjNGY0YWNjMCksCi1XVEMoMHhjNTIwZTg0MCksIFdUQygweGM1NGQ4NzgwKSwgV1RDKDB4YzU3YTc2YzApLCBXVEMoMHhjNWE3OTY0MCksIFdUQygweGM1ZDRiYWMwKSwgV1RDKDB4YzYwMWI4ODApLCBXVEMoMHhjNjJlNjU4MCksIFdUQygweGM2NWFiNjAwKSwKLVdUQygweGM2ODZiZDQwKSwgV1RDKDB4YzZiMjhmYzApLCBXVEMoMHhjNmRlNDFjMCksIFdUQygweGM3MDlkZTQwKSwgV1RDKDB4YzczNTY2NDApLCBXVEMoMHhjNzYwZGE4MCksIFdUQygweGM3OGMzYzQwKSwgV1RDKDB4YzdiNzg2NDApLAotV1RDKDB4YzdlMmFmYzApLCBXVEMoMHhjODBkYWU4MCksIFdUQygweGM4Mzg3OGMwKSwgV1RDKDB4Yzg2MzA0YzApLCBXVEMoMHhjODhkNDkwMCksIFdUQygweGM4YjczYjgwKSwgV1RDKDB4YzhlMGQyODApLCBXVEMoMHhjOTBhMDQ0MCksCi0vKiBwYXJ0IDEgKi8KLVdUQygweGI1MjEyZTgxKSwgV1RDKDB4YjQ5NTk1MDEpLCBXVEMoMHhiNDBhYjUwMSksIFdUQygweGIzODA4ZDgxKSwgV1RDKDB4YjJmNzFmMDEpLCBXVEMoMHhiMjZlNjg4MSksIFdUQygweGIxZTY2YTAxKSwgV1RDKDB4YjE1ZjIzODEpLAotV1RDKDB4YjBkODk0MDEpLCBXVEMoMHhiMDUyYmMwMSksIFdUQygweGFmY2Q5YTgxKSwgV1RDKDB4YWY0OTJmMDEpLCBXVEMoMHhhZWM1NzgwMSksIFdUQygweGFlNDI3NDgxKSwgV1RDKDB4YWRjMDIyODEpLCBXVEMoMHhhZDNlODEwMSksCi1XVEMoMHhhY2JkOTA4MSksIFdUQygweGFjM2Q1MDAxKSwgV1RDKDB4YWJiZGMwMDEpLCBXVEMoMHhhYjNlZGYwMSksIFdUQygweGFhYzBhZDAxKSwgV1RDKDB4YWE0MzI5ODEpLCBXVEMoMHhhOWM2NTQwMSksIFdUQygweGE5NGEyYzAxKSwKLVdUQygweGE4Y2ViMjAxKSwgV1RDKDB4YTg1M2U1MDEpLCBXVEMoMHhhN2Q5YzY4MSksIFdUQygweGE3NjA1NjAxKSwgV1RDKDB4YTZlNzk0MDEpLCBXVEMoMHhhNjZmODIwMSksIFdUQygweGE1ZjgxZjgxKSwgV1RDKDB4YTU4MTZlODEpLAotV1RDKDB4YTUwYjZlODEpLCBXVEMoMHhhNDk2MjE4MSksIFdUQygweGE0MjE4ODAxKSwgV1RDKDB4YTNhZGEyODEpLCBXVEMoMHhhMzNhNzIwMSksIFdUQygweGEyYzdmODAxKSwgV1RDKDB4YTI1NjM1MDEpLCBXVEMoMHhhMWU1MmE4MSksCi1XVEMoMHhhMTc0ZGE4MSksIFdUQygweGExMDU0NzAxKSwgV1RDKDB4YTA5NjcyMDEpLCBXVEMoMHhhMDI4NWQ4MSksIFdUQygweDlmYmIwOTgxKSwgV1RDKDB4OWY0ZTc4MDEpLCBXVEMoMHg5ZWUyYTkwMSksIFdUQygweDllNzc5ZjgxKSwKLVdUQygweDllMGQ1ZTAxKSwgV1RDKDB4OWRhM2U2MDEpLCBXVEMoMHg5ZDNiM2I4MSksIFdUQygweDljZDM1ZjgxKSwgV1RDKDB4OWM2YzU0ODEpLCBXVEMoMHg5YzA2MWI4MSksIFdUQygweDliYTBiNzAxKSwgV1RDKDB4OWIzYzI4MDEpLAotV1RDKDB4OWFkODcwODEpLCBXVEMoMHg5YTc1OTMwMSksIFdUQygweDlhMTM5MTAxKSwgV1RDKDB4OTliMjZjODEpLCBXVEMoMHg5OTUyMjgwMSksIFdUQygweDk4ZjJjNjAxKSwgV1RDKDB4OTg5NDQ5MDEpLCBXVEMoMHg5ODM2YjIwMSksCi1XVEMoMHg5N2RhMDQ4MSksIFdUQygweDk3N2U0MTgxKSwgV1RDKDB4OTcyMzZiMDEpLCBXVEMoMHg5NmM5ODM4MSksIFdUQygweDk2NzA4YjgxKSwgV1RDKDB4OTYxODg1MDEpLCBXVEMoMHg5NWMxNzA4MSksIFdUQygweDk1NmI0ZjgxKSwKLVdUQygweDk1MTYyMzgxKSwgV1RDKDB4OTRjMWVlMDEpLCBXVEMoMHg5NDZlYWY4MSksIFdUQygweDk0MWM2OTAxKSwgV1RDKDB4OTNjYjFjODEpLCBXVEMoMHg5MzdhY2IwMSksIFdUQygweDkzMmI3NTAxKSwgV1RDKDB4OTJkZDFiMDEpLAotV1RDKDB4OTI4ZmJlMDEpLCBXVEMoMHg5MjQzNWQwMSksIFdUQygweDkxZjdmOTgxKSwgV1RDKDB4OTFhZDkyODEpLCBXVEMoMHg5MTY0Mjc4MSksIFdUQygweDkxMWJiOTgxKSwgV1RDKDB4OTBkNDQ3ODEpLCBXVEMoMHg5MDhkZDEwMSksCi1XVEMoMHg5MDQ4NTQwMSksIFdUQygweDkwMDNjZTgxKSwgV1RDKDB4OGZjMDNmMDEpLCBXVEMoMHg4ZjdkYTQwMSksIFdUQygweDhmM2JmYjAxKSwgV1RDKDB4OGVmYjQxODEpLCBXVEMoMHg4ZWJiNzU4MSksIFdUQygweDhlN2M5MzAxKSwKLVdUQygweDhlM2U5NDgxKSwgV1RDKDB4OGUwMTc1ODEpLCBXVEMoMHg4ZGM1MzAwMSksIFdUQygweDhkODliZTgxKSwgV1RDKDB4OGQ0ZjFiMDEpLCBXVEMoMHg4ZDE1NDA4MSksIFdUQygweDhjZGMyOTAxKSwgV1RDKDB4OGNhM2NiMDEpLAotV1RDKDB4OGM2YzFiMDEpLCBXVEMoMHg4YzM1MGQwMSksIFdUQygweDhiZmU5NDAxKSwgV1RDKDB4OGJjOGE0MDEpLCBXVEMoMHg4YjkzMzAwMSksIFdUQygweDhiNWUyYzgxKSwgV1RDKDB4OGIyOThiODEpLCBXVEMoMHg4YWY1M2U4MSksCi1XVEMoMHg4YWMxMzM4MSksIFdUQygweDhhOGQ1ODAxKSwgV1RDKDB4OGE1OTlhODEpLCBXVEMoMHg4YTI1ZjMwMSksIFdUQygweDg5ZjI2MTAxKSwgV1RDKDB4ODliZWU1ODEpLCBXVEMoMHg4OThiODMwMSksIFdUQygweDg5NTg2OTAxKSwKLVdUQygweDg5MjVmMTAxKSwgV1RDKDB4ODhmNDc5MDEpLCBXVEMoMHg4OGM0NWU4MSksIFdUQygweDg4OTYyOTgxKSwgV1RDKDB4ODg2YThhODEpLCBXVEMoMHg4ODQyMzMwMSksIFdUQygweDg4MWRkMzAxKSwgV1RDKDB4ODdmZGQ3ODEpLAotV1RDKDB4ODdkMGNhODEpLCBXVEMoMHg4N2M3NjIwMSksIFdUQygweDg3YmNhYjgxKSwgV1RDKDB4ODdiMGVmMDEpLCBXVEMoMHg4N2E0OGIwMSksIFdUQygweDg3OTdkZDgxKSwgV1RDKDB4ODc4YjQzMDEpLCBXVEMoMHg4NzdlZGUwMSksCi1XVEMoMHg4NzcyOTcwMSksIFdUQygweDg3NjY1NDgxKSwgV1RDKDB4ODc1OWZkMDEpLCBXVEMoMHg4NzRkODY4MSksIFdUQygweDg3NDBmNjgxKSwgV1RDKDB4ODczNDUzODEpLCBXVEMoMHg4NzI3YTM4MSksIFdUQygweDg3MWFlOTgxKSwKLVdUQygweDg3MGUyMzAxKSwgV1RDKDB4ODcwMTRmODEpLCBXVEMoMHg4NmY0NmQ4MSksIFdUQygweDg2ZTc3YjgxKSwgV1RDKDB4ODZkYTc5MDEpLCBXVEMoMHg4NmNkNjY4MSksIFdUQygweDg2YzA0MzgxKSwgV1RDKDB4ODZiMzBmMDEpLAotV1RDKDB4ODZhNWNhODEpLCBXVEMoMHg4Njk4NzU4MSksIFdUQygweDg2OGIxMDAxKSwgV1RDKDB4ODY3ZDlhODEpLCBXVEMoMHg4NjcwMTM4MSksIFdUQygweDg2NjI3YjAxKSwgV1RDKDB4ODY1NGQwMDEpLCBXVEMoMHg4NjQ3MTI4MSksCi1XVEMoMHg4NjM5NDMwMSksIFdUQygweDg2MmI2MjAxKSwgV1RDKDB4ODYxZDcwODEpLCBXVEMoMHg4NjBmNmUwMSksIFdUQygweDg2MDE1OTgxKSwgV1RDKDB4ODVmMzMyODEpLCBXVEMoMHg4NWU0ZjgwMSksIFdUQygweDg1ZDZhOTgxKSwKLVdUQygweDg1Yzg0ODAxKSwgV1RDKDB4ODViOWQ0ODEpLCBXVEMoMHg4NWFiNGYwMSksIFdUQygweDg1OWNiNzgxKSwgV1RDKDB4ODU4ZTBlMDEpLCBXVEMoMHg4NTdmNTEwMSksIFdUQygweDg1NzA3ZjgxKSwgV1RDKDB4ODU2MTlhMDEpLAotV1RDKDB4ODU1MmExODEpLCBXVEMoMHg4NTQzOTYwMSksIFdUQygweDg1MzQ3OTAxKSwgV1RDKDB4ODUyNTRhODEpLCBXVEMoMHg4NTE2MDk4MSksIFdUQygweDg1MDZiNTgxKSwgV1RDKDB4ODRmNzRlMDEpLCBXVEMoMHg4NGU3ZDM4MSksCi1XVEMoMHg4NGQ4NDYwMSksIFdUQygweDg0YzhhNzAxKSwgV1RDKDB4ODRiOGY4MDEpLCBXVEMoMHg4NGE5MzgwMSksIFdUQygweDg0OTk2NzAxKSwgV1RDKDB4ODQ4OTg0ODEpLCBXVEMoMHg4NDc5OGY4MSksIFdUQygweDg0Njk4ODgxKSwKLVdUQygweDg0NTk3MDgxKSwgV1RDKDB4ODQ0OTQ4ODEpLCBXVEMoMHg4NDM5MTA4MSksIFdUQygweDg0MjhjYTAxKSwgV1RDKDB4ODQxODc0MDEpLCBXVEMoMHg4NDA4MGQ4MSksIFdUQygweDgzZjc5NjgxKSwgV1RDKDB4ODNlNzBmMDEpLAotV1RDKDB4ODNkNjc4ODEpLCBXVEMoMHg4M2M1ZDM4MSksIFdUQygweDgzYjUyMTAxKSwgV1RDKDB4ODNhNDYxODEpLCBXVEMoMHg4MzkzOTUwMSksIFdUQygweDgzODJiYTAxKSwgV1RDKDB4ODM3MWQwODEpLCBXVEMoMHg4MzYwZDkwMSksCi1XVEMoMHg4MzRmZDQ4MSksIFdUQygweDgzM2VjMzgxKSwgV1RDKDB4ODMyZGE3ODEpLCBXVEMoMHg4MzFjODEwMSksIFdUQygweDgzMGI0ZjgxKSwgV1RDKDB4ODJmYTExODEpLCBXVEMoMHg4MmU4YzgwMSksIFdUQygweDgyZDc3MjAxKSwKLVdUQygweDgyYzYxMTAxKSwgV1RDKDB4ODJiNGE2MDEpLCBXVEMoMHg4MmEzMzI4MSksIFdUQygweDgyOTFiNjAxKSwgV1RDKDB4ODI4MDMxMDEpLCBXVEMoMHg4MjZlYTIwMSksIFdUQygweDgyNWQwOTAxKSwgV1RDKDB4ODI0YjY2MDEpLAotV1RDKDB4ODIzOWI5ODEpLCBXVEMoMHg4MjI4MDU4MSksIFdUQygweDgyMTY0YTgxKSwgV1RDKDB4ODIwNDg4ODEpLCBXVEMoMHg4MWYyYmY4MSksIFdUQygweDgxZTBlZTgxKSwgV1RDKDB4ODFjZjE1ODEpLCBXVEMoMHg4MWJkMzQwMSksCi1XVEMoMHg4MWFiNGIwMSksIFdUQygweDgxOTk1YzAxKSwgV1RDKDB4ODE4NzY3ODEpLCBXVEMoMHg4MTc1NmQ4MSksIFdUQygweDgxNjM2ZDgxKSwgV1RDKDB4ODE1MTY3MDEpLCBXVEMoMHg4MTNmNTk4MSksIFdUQygweDgxMmQ0NDgxKSwKLVdUQygweDgxMWIyOTgxKSwgV1RDKDB4ODEwOTA5ODEpLCBXVEMoMHg4MGY2ZTQ4MSksIFdUQygweDgwZTRiYjgxKSwgV1RDKDB4ODBkMjhkODEpLCBXVEMoMHg4MGMwNWEwMSksIFdUQygweDgwYWUxZjgxKSwgV1RDKDB4ODA5YmRmMDEpLAotV1RDKDB4ODA4OTk4ODEpLCBXVEMoMHg4MDc3NGM4MSksIFdUQygweDgwNjRmYzgxKSwgV1RDKDB4ODA1MmE4ODEpLCBXVEMoMHg4MDQwNTEwMSksIFdUQygweDgwMmRmNzAxKSwgV1RDKDB4ODAxYjliMDEpLCBXVEMoMHg4MDA5M2UwMSksCi1XVEMoMHgwYTc0YjEyMCksIFdUQygweDBhYTA4YTkwKSwgV1RDKDB4MGFjZDJiODApLCBXVEMoMHgwYWZhODg2MCksIFdUQygweDBiMjg5NTkwKSwgV1RDKDB4MGI1NzQ3OTApLCBXVEMoMHgwYjg2OTJkMCksIFdUQygweDBiYjY2YmIwKSwKLVdUQygweDBiZTZjNmIwKSwgV1RDKDB4MGMxNzk4MzApLCBXVEMoMHgwYzQ4ZDUwMCksIFdUQygweDBjN2E3YWQwKSwgV1RDKDB4MGNhYzkwMDApLCBXVEMoMHgwY2RmMWI2MCksIFdUQygweDBkMTIyMzkwKSwgV1RDKDB4MGQ0NWE4ZjApLAotV1RDKDB4MGQ3OWE1ZTApLCBXVEMoMHgwZGFlMTQ4MCksIFdUQygweDBkZTJlZjMwKSwgV1RDKDB4MGUxODM4MDApLCBXVEMoMHgwZTRkZjhjMCksIFdUQygweDBlODQzYjkwKSwgV1RDKDB4MGViYjBhMjApLCBXVEMoMHgwZWYyNjQzMCksCi1XVEMoMHgwZjJhM2ZjMCksIFdUQygweDBmNjI5MjgwKSwgV1RDKDB4MGY5YjUyMTApLCBXVEMoMHgwZmQ0NzY5MCksIFdUQygweDEwMGRmYTgwKSwgV1RDKDB4MTA0N2Q4YTApLCBXVEMoMHgxMDgyMGI0MCksIFdUQygweDEwYmM4YjgwKSwKLVdUQygweDEwZjc1MDgwKSwgV1RDKDB4MTEzMjUxMDApLCBXVEMoMHgxMTZkODRlMCksIFdUQygweDExYThlY2UwKSwgV1RDKDB4MTFlNDk0MjApLCBXVEMoMHgxMjIwODVhMCksIFdUQygweDEyNWNjYmMwKSwgV1RDKDB4MTI5OTVhNDApLAotV1RDKDB4MTJkNjBlODApLCBXVEMoMHgxMzEyYzRjMCksIFdUQygweDEzNGY1OWUwKSwgV1RDKDB4MTM4YmFlNjApLCBXVEMoMHgxM2M3YTc0MCksIFdUQygweDE0MDMyOWUwKSwgV1RDKDB4MTQzZTFiNjApLCBXVEMoMHgxNDc4NjJhMCksCi1XVEMoMHgxNGIxZTg0MCksIFdUQygweDE0ZWE5NGMwKSwgV1RDKDB4MTUyMjUwYTApLCBXVEMoMHgxNTU5MDM4MCksIFdUQygweDE1OGU5M2UwKSwgV1RDKDB4MTVjMmU4MjApLCBXVEMoMHgxNWY1ZTZlMCksIFdUQygweDE2Mjc3OWEwKSwKLVdUQygweDE2NTc4Y2EwKSwgV1RDKDB4MTY4NjBjYTApLCBXVEMoMHgxNmIyZTY0MCksIFdUQygweDE2ZGUwYjAwKSwgV1RDKDB4MTcwNzcxNDApLCBXVEMoMHgxNzJmMGZhMCksIFdUQygweDE3NTRlMjAwKSwgV1RDKDB4MTc3OTYwODApLAotV1RDKDB4MTc5ZDdmMjApLCBXVEMoMHgxN2MyMzc2MCksIFdUQygweDE3ZTg3ZGEwKSwgV1RDKDB4MTgxMGNjODApLCBXVEMoMHgxODNiMjVhMCksIFdUQygweDE4Njc4NTIwKSwgV1RDKDB4MTg5NWU3MDApLCBXVEMoMHgxOGM2NDU0MCksCi1XVEMoMHgxOGY4OTc4MCksIFdUQygweDE5MmNkNTYwKSwgV1RDKDB4MTk2MmY2ODApLCBXVEMoMHgxOTlhZjJhMCksIFdUQygweDE5ZDRjMWUwKSwgV1RDKDB4MWExMDVjYTApLCBXVEMoMHgxYTRkYmFlMCksIFdUQygweDFhOGNkNjYwKSwKLVdUQygweDFhY2RhYTYwKSwgV1RDKDB4MWIxMDMyNjApLCBXVEMoMHgxYjU0Njk0MCksIFdUQygweDFiOWE0NjAwKSwgV1RDKDB4MWJlMWJiODApLCBXVEMoMHgxYzJhYmM2MCksIFdUQygweDFjNzUzYjgwKSwgV1RDKDB4MWNjMTM4NjApLAotV1RDKDB4MWQwZWJlMjApLCBXVEMoMHgxZDVkZDhjMCksIFdUQygweDFkYWU5NDgwKSwgV1RDKDB4MWUwMTAwNjApLCBXVEMoMHgxZTU1MmY0MCksIFdUQygweDFlYWIzM2UwKSwgV1RDKDB4MWYwMzIwNjApLCBXVEMoMHgxZjVjZmNlMCksCi1XVEMoMHgxZmI4YzY2MCksIFdUQygweDIwMTY3OWMwKSwgV1RDKDB4MjA3NjExYzApLCBXVEMoMHgyMGQ3NWYwMCksIFdUQygweDIxM2EwNjQwKSwgV1RDKDB4MjE5ZGFiODApLCBXVEMoMHgyMjAxZjQ4MCksIFdUQygweDIyNjZiYTgwKSwKLVdUQygweDIyY2MwYWMwKSwgV1RDKDB4MjMzMWY0YzApLCBXVEMoMHgyMzk4ODk0MCksIFdUQygweDIzZmZmZjQwKSwgV1RDKDB4MjQ2OGIzNDApLCBXVEMoMHgyNGQzMDMwMCksIFdUQygweDI1M2Y0OTAwKSwgV1RDKDB4MjVhZDg5ODApLAotV1RDKDB4MjYxZDcyYzApLCBXVEMoMHgyNjhlYWVjMCksIFdUQygweDI3MDBlODgwKSwgV1RDKDB4Mjc3M2RiNDApLCBXVEMoMHgyN2U3NTFjMCksIFdUQygweDI4NWIxNzgwKSwgV1RDKDB4MjhjZWZiYzApLCBXVEMoMHgyOTQzMWY4MCksCi1XVEMoMHgyOWI3ZjY4MCksIFdUQygweDJhMmRmNzgwKSwgV1RDKDB4MmFhNTk4ODApLCBXVEMoMHgyYjFmMzI4MCksIFdUQygweDJiOWIwMTQwKSwgV1RDKDB4MmMxOTQwMDApLCBXVEMoMHgyYzlhMjU0MCksIFdUQygweDJkMWQ4ZGMwKSwKLVdUQygweDJkYTJmYzQwKSwgV1RDKDB4MmUyOWVlODApLCBXVEMoMHgyZWIxZTM0MCksIFdUQygweDJmM2E0ZTQwKSwgV1RDKDB4MmZjMjk5ODApLCBXVEMoMHgzMDRhMmVjMCksIFdUQygweDMwZDA3Y2MwKSwgV1RDKDB4MzE1NTY2YzApLAotV1RDKDB4MzFkOTQ0ODApLCBXVEMoMHgzMjVjNzJjMCksIFdUQygweDMyZGY1MWMwKSwgV1RDKDB4MzM2MjhjODApLCBXVEMoMHgzM2U3MWEwMCksIFdUQygweDM0NmRmNDAwKSwgV1RDKDB4MzRmODBkYzApLCBXVEMoMHgzNTg1YzY0MCksCi1XVEMoMHgzNjE2ZTcwMCksIFdUQygweDM2YWIzMzgwKSwgV1RDKDB4Mzc0MjZhYzApLCBXVEMoMHgzN2RiZTg0MCksIFdUQygweDM4NzZhMzQwKSwgV1RDKDB4MzkxMThmNDApLCBXVEMoMHgzOWFiYTJjMCksIFdUQygweDNhNDQyMmMwKSwKLVdUQygweDNhZGFhMjAwKSwgV1RDKDB4M2I2ZWI2YzApLCBXVEMoMHgzYmZmZmQ4MCksIFdUQygweDNjOGU5MzgwKSwgV1RDKDB4M2QxYjE3ODApLCBXVEMoMHgzZGE2MmUwMCksIFdUQygweDNlMzA3YjAwKSwgV1RDKDB4M2ViYTk3YzApLAotV1RDKDB4M2Y0NTEyODApLCBXVEMoMHgzZmQwNzk0MCksIFdUQygweDQwNWQ1NzdmKSwgV1RDKDB4NDBlYmY1N2YpLCBXVEMoMHg0MTdjNTlmZiksIFdUQygweDQyMGU4OTdmKSwgV1RDKDB4NDJhMjg1N2YpLCBXVEMoMHg0MzM4MzA3ZiksCi1XVEMoMHg0M2NmNGQ3ZiksIFdUQygweDQ0Njc5Y2ZmKSwgV1RDKDB4NDUwMGRmZmYpLCBXVEMoMHg0NTlhYzJmZiksIFdUQygweDQ2MzRlMmZmKSwgV1RDKDB4NDZjZWQ5ZmYpLCBXVEMoMHg0NzY4NDM3ZiksIFdUQygweDQ4MDBkMjdmKSwKLVdUQygweDQ4OTg1MGZmKSwgV1RDKDB4NDkyZTg4ZmYpLCBXVEMoMHg0OWMzNDZmZiksIFdUQygweDRhNTY3OGZmKSwgV1RDKDB4NGFlODJmN2YpLCBXVEMoMHg0Yjc4N2M3ZiksIFdUQygweDRjMDc3MTdmKSwgV1RDKDB4NGM5NTMzN2YpLAotV1RDKDB4NGQyMWY3N2YpLCBXVEMoMHg0ZGFkZjNmZiksIFdUQygweDRlMzk1ZWZmKSwgV1RDKDB4NGVjNDY1N2YpLCBXVEMoMHg0ZjRmMjk3ZiksIFdUQygweDRmZDljZDdmKSwgV1RDKDB4NTA2NDczN2YpLCBXVEMoMHg1MGVmM2NmZiksCi1XVEMoMHg1MTdhNDZmZiksIFdUQygweDUyMDViMGZmKSwgV1RDKDB4NTI5MTk3ZmYpLCBXVEMoMHg1MzFlMDRmZiksIFdUQygweDUzYWFlYjdmKSwgV1RDKDB4NTQzODNlZmYpLCBXVEMoMHg1NGM1ZWY3ZiksIFdUQygweDU1NTNhOGZmKSwKLVdUQygweDU1ZTBkNTdmKSwgV1RDKDB4NTY2Y2RhN2YpLCBXVEMoMHg1NmY3MjBmZiksIFdUQygweDU3N2Y0YWZmKSwgV1RDKDB4NTgwNTM0ZmYpLCBXVEMoMHg1ODg4YmQ3ZiksIFdUQygweDU5MDljNmZmKSwgV1RDKDB4NTk4ODkwZmYpLAotV1RDKDB4NWEwNWI3ZmYpLCBXVEMoMHg1YTgxZGI3ZiksIFdUQygweDVhZmQ5OWZmKSwgV1RDKDB4NWI3OTRhN2YpLCBXVEMoMHg1YmY1MDA3ZiksIFdUQygweDVjNzBjYmZmKSwgV1RDKDB4NWNlY2JiN2YpLCBXVEMoMHg1ZDY4YzQ3ZiksCi1XVEMoMHg1ZGU0YzNmZiksIFdUQygweDVlNjA5NGZmKSwgV1RDKDB4NWVkYzEyN2YpLCBXVEMoMHg1ZjU2ZmRmZiksIFdUQygweDVmZDEwMTdmKSwgV1RDKDB4NjA0OWM2N2YpLCBXVEMoMHg2MGMwZjY3ZiksIFdUQygweDYxMzY1MGZmKSwKLVdUQygweDYxYTlhOWZmKSwgV1RDKDB4NjIxYWQ3N2YpLCBXVEMoMHg2Mjg5YjM3ZiksIFdUQygweDYyZjY3ZmZmKSwgV1RDKDB4NjM2MWU4N2YpLCBXVEMoMHg2M2NjOWJmZiksIFdUQygweDY0Mzc0NTdmKSwgV1RDKDB4NjRhMjI0N2YpLAotV1RDKDB4NjUwZDBjN2YpLCBXVEMoMHg2NTc3Y2M3ZiksIFdUQygweDY1ZTIzMjdmKSwgV1RDKDB4NjY0YmY1N2YpLCBXVEMoMHg2NmI0YjVmZiksIFdUQygweDY3MWMxMzdmKSwgV1RDKDB4Njc4MWFmZmYpLCBXVEMoMHg2N2U1NzlmZiksCi1XVEMoMHg2ODQ3YWJmZiksIFdUQygweDY4YTg4MmZmKSwgV1RDKDB4NjkwODNiZmYpLCBXVEMoMHg2OTY2ZmJmZiksIFdUQygweDY5YzRjZmZmKSwgV1RDKDB4NmEyMWM1N2YpLCBXVEMoMHg2YTdkZTg3ZiksIFdUQygweDZhZDkzNzdmKSwKLVdUQygweDZiMzNhNWZmKSwgV1RDKDB4NmI4ZDI1N2YpLCBXVEMoMHg2YmU1YThmZiksIFdUQygweDZjM2QyMGZmKSwgV1RDKDB4NmM5MzgwZmYpLCBXVEMoMHg2Y2U4YmE3ZiksIFdUQygweDZkM2NiZmZmKSwgV1RDKDB4NmQ4ZjgyN2YpLAotLyogcGFydCAyICovCi1XVEMoMHhhZDk4YjQ4MSksIFdUQygweGFlYWQ5ZDAxKSwgV1RDKDB4YWZiZmMzODEpLCBXVEMoMHhiMGNmNGQwMSksIFdUQygweGIxZGM1ZjgxKSwgV1RDKDB4YjJlNzIwODEpLCBXVEMoMHhiM2VmYjUwMSksIFdUQygweGI0ZjY0MzgxKSwKLVdUQygweGI1ZmFmMTAxKSwgV1RDKDB4YjZmZGU0MDEpLCBXVEMoMHhiN2ZmNDAwMSksIFdUQygweGI4ZmYxNjAxKSwgV1RDKDB4YjlmZDYxODEpLCBXVEMoMHhiYWZhMWQwMSksIFdUQygweGJiZjU0NDAxKSwgV1RDKDB4YmNlZWQxMDEpLAotV1RDKDB4YmRlNmMwODEpLCBXVEMoMHhiZWRkMGU4MSksIFdUQygweGJmZDFiNzAxKSwgV1RDKDB4YzBjNGI0NDApLCBXVEMoMHhjMWI1ZmZjMCksIFdUQygweGMyYTU5MzQwKSwgV1RDKDB4YzM5MzY3ODApLCBXVEMoMHhjNDdmNzhjMCksCi1XVEMoMHhjNTY5YzYwMCksIFdUQygweGM2NTI0ZDQwKSwgV1RDKDB4YzczOTBkYzApLCBXVEMoMHhjODFlMDRjMCksIFdUQygweGM5MDEyZTAwKSwgV1RDKDB4YzllMjg1NDApLCBXVEMoMHhjYWMyMDcwMCksIFdUQygweGNiOWZiMWMwKSwKLVdUQygweGNjN2I4NjQwKSwgV1RDKDB4Y2Q1NTg2MDApLCBXVEMoMHhjZTJkYjIwMCksIFdUQygweGNmMDQwOWMwKSwgV1RDKDB4Y2ZkODhhNDApLCBXVEMoMHhkMGFiMzA4MCksIFdUQygweGQxN2JmYTAwKSwgV1RDKDB4ZDI0YWU2NDApLAotV1RDKDB4ZDMxN2Y3YzApLCBXVEMoMHhkM2UzMzA4MCksIFdUQygweGQ0YWM5MzQwKSwgV1RDKDB4ZDU3NDFmNDApLCBXVEMoMHhkNjM5ZDJjMCksIFdUQygweGQ2ZmRhYjAwKSwgV1RDKDB4ZDdiZmE1YzApLCBXVEMoMHhkODdmYzMwMCksCi1XVEMoMHhkOTNlMDYwMCksIFdUQygweGQ5ZmE3MTgwKSwgV1RDKDB4ZGFiNTA5MDApLCBXVEMoMHhkYjZkY2NjMCksIFdUQygweGRjMjRiYTgwKSwgV1RDKDB4ZGNkOWQwMDApLCBXVEMoMHhkZDhkMGI4MCksIFdUQygweGRlM2U2ZGMwKSwKLVdUQygweGRlZWRmOWMwKSwgV1RDKDB4ZGY5YmIzNDApLCBXVEMoMHhlMDQ3OWUyMCksIFdUQygweGUwZjFiYWMwKSwgV1RDKDB4ZTE5YTA3ZTApLCBXVEMoMHhlMjQwODM4MCksIFdUQygweGUyZTUyYzAwKSwgV1RDKDB4ZTM4ODAyZTApLAotV1RDKDB4ZTQyOTBjMDApLCBXVEMoMHhlNGM4NGMyMCksIFdUQygweGU1NjVjNzYwKSwgV1RDKDB4ZTYwMTdmMjApLCBXVEMoMHhlNjliNzI0MCksIFdUQygweGU3MzM5ZjYwKSwgV1RDKDB4ZTdjYTA1MDApLCBXVEMoMHhlODVlYTQ4MCksCi1XVEMoMHhlOGYxODE4MCksIFdUQygweGU5ODI5ZmMwKSwgV1RDKDB4ZWExMjAyZTApLCBXVEMoMHhlYTlmYWI4MCksIFdUQygweGViMmI5NzAwKSwgV1RDKDB4ZWJiNWMyYTApLCBXVEMoMHhlYzNlMmJjMCksIFdUQygweGVjYzRkMzAwKSwKLVdUQygweGVkNDliYzgwKSwgV1RDKDB4ZWRjY2VjNjApLCBXVEMoMHhlZTRlNjZhMCksIFdUQygweGVlY2UyZDgwKSwgV1RDKDB4ZWY0YzQxZTApLCBXVEMoMHhlZmM4YTQ4MCksIFdUQygweGYwNDM1NjEwKSwgV1RDKDB4ZjBiYzVjNjApLAotV1RDKDB4ZjEzM2MyMzApLCBXVEMoMHhmMWE5OTI3MCksIFdUQygweGYyMWRkN2IwKSwgV1RDKDB4ZjI5MDk3ZTApLCBXVEMoMHhmMzAxZDNkMCksIFdUQygweGYzNzE4YzIwKSwgV1RDKDB4ZjNkZmMxODApLCBXVEMoMHhmNDRjNzEwMCksCi1XVEMoMHhmNGI3OTQ4MCksIFdUQygweGY1MjEyNWIwKSwgV1RDKDB4ZjU4OTFkZjApLCBXVEMoMHhmNWVmNmZlMCksIFdUQygweGY2NTQwNzMwKSwgV1RDKDB4ZjZiNmNmNTApLCBXVEMoMHhmNzE3YjQ5MCksIFdUQygweGY3NzZiOWEwKSwKLVdUQygweGY3ZDNmNzIwKSwgV1RDKDB4ZjgyZjg2ZTgpLCBXVEMoMHhmODg5ODI2MCksIFdUQygweGY4ZTFmYzUwKSwgV1RDKDB4ZjkzOTAwZjApLCBXVEMoMHhmOThlOWMyOCksIFdUQygweGY5ZTJkOTQwKSwgV1RDKDB4ZmEzNWI0YTApLAotV1RDKDB4ZmE4NzFiZDgpLCBXVEMoMHhmYWQ2ZmJkMCksIFdUQygweGZiMjU0MjUwKSwgV1RDKDB4ZmI3MWYwYzApLCBXVEMoMHhmYmJkMWMyOCksIFdUQygweGZjMDZkYTYwKSwgV1RDKDB4ZmM0ZjQwYTQpLCBXVEMoMHhmYzk2NTUwMCksCi1XVEMoMHhmY2RjMGU1YyksIFdUQygweGZkMjA2MmY0KSwgV1RDKDB4ZmQ2MzQ4ZDApLCBXVEMoMHhmZGE0YjFiOCksIFdUQygweGZkZTQ4YjJjKSwgV1RDKDB4ZmUyMmMyODApLCBXVEMoMHhmZTVmNDYyYSksIFdUQygweGZlOWExZjJlKSwKLVdUQygweGZlZDM3MTFjKSwgV1RDKDB4ZmYwYjYwYWMpLCBXVEMoMHhmZjQyMTJkZCksIFdUQygweGZmNzdiMzQ0KSwgV1RDKDB4ZmZhYzc0MDcpLCBXVEMoMHhmZmUwODc5NiksIFdUQygweDAwMTQxZTM3KSwgV1RDKDB4MDA0NzM2NjUpLAotV1RDKDB4MDA3OTljZDApLCBXVEMoMHgwMGFiMWJmZiksIFdUQygweDAwZGI3ZDhiKSwgV1RDKDB4MDEwYTc1ZWEpLCBXVEMoMHgwMTM3YTQ2ZSksIFdUQygweDAxNjJhNzdhKSwgV1RDKDB4MDE4YjIwYWMpLCBXVEMoMHgwMWIwZmI3YSksCi1XVEMoMHgwMWQ0NmQzYyksIFdUQygweDAxZjVhZTdjKSwgV1RDKDB4MDIxNGY5MWMpLCBXVEMoMHgwMjMyYTVjYyksIFdUQygweDAyNGYyYzA0KSwgV1RDKDB4MDI2YjA0OGMpLCBXVEMoMHgwMjg2YTYyOCksIFdUQygweDAyYTI1ODA4KSwKLVdUQygweDAyYmUzMWMwKSwgV1RDKDB4MDJkYTQ4ZTApLCBXVEMoMHgwMmY2YjA5YyksIFdUQygweDAzMTM0NWRjKSwgV1RDKDB4MDMyZmFmNTApLCBXVEMoMHgwMzRiOTE0OCksIFdUQygweDAzNjY5MGU4KSwgV1RDKDB4MDM4MDY1OGMpLAotV1RDKDB4MDM5OGQ4ZTQpLCBXVEMoMHgwM2FmYjU2OCksIFdUQygweDAzYzRjNmUwKSwgV1RDKDB4MDNkN2Y3NzApLCBXVEMoMHgwM2U5NGY5YyksIFdUQygweDAzZjhkOTM4KSwgV1RDKDB4MDQwNjllZTgpLCBXVEMoMHgwNDEyYmVmOCksCi1XVEMoMHgwNDFkNmIzMCksIFdUQygweDA0MjZkNjM4KSwgV1RDKDB4MDQyZjMyODgpLCBXVEMoMHgwNDM2YWQ5OCksIFdUQygweDA0M2Q2ZmQwKSwgV1RDKDB4MDQ0M2ExNzApLCBXVEMoMHgwNDQ5NmE0MCksIFdUQygweDA0NGVlNzI4KSwKLVdUQygweDA0NTQyYTQwKSwgV1RDKDB4MDQ1OTQ1MjApLCBXVEMoMHgwNDVlNDg5MCksIFdUQygweDA0NjMzMjEwKSwgV1RDKDB4MDQ2N2ViZTgpLCBXVEMoMHgwNDZjNWY4MCksIFdUQygweDA0NzA3NjMwKSwgV1RDKDB4MDQ3NDE3ZjApLAotV1RDKDB4MDQ3NzJiNTgpLCBXVEMoMHgwNDc5OTZlOCksIFdUQygweDA0N2I0MTQwKSwgV1RDKDB4MDQ3YzEyYTApLCBXVEMoMHgwNDdiZjUyMCksIFdUQygweDA0N2FkMmUwKSwgV1RDKDB4MDQ3ODk2OTApLCBXVEMoMHgwNDc1MzljOCksCi1XVEMoMHgwNDcwYzRiOCksIFdUQygweDA0NmI0MDU4KSwgV1RDKDB4MDQ2NGI2MDApLCBXVEMoMHgwNDVkM2EwOCksIFdUQygweDA0NTRlYmM4KSwgV1RDKDB4MDQ0YmViMDApLCBXVEMoMHgwNDQyNTc5OCksIFdUQygweDA0Mzg1M2IwKSwKLVdUQygweDA0MmUwMzk4KSwgV1RDKDB4MDQyMzhiZDgpLCBXVEMoMHgwNDE5MGY5OCksIFdUQygweDA0MGU5NjcwKSwgV1RDKDB4MDQwNDBjMTgpLCBXVEMoMHgwM2Y5NWIzMCksIFdUQygweDAzZWU2ZTIwKSwgV1RDKDB4MDNlMzJiNjQpLAotV1RDKDB4MDNkNzc1OTgpLCBXVEMoMHgwM2NiMmYyNCksIFdUQygweDAzYmUzYjE4KSwgV1RDKDB4MDNiMDhiMTgpLCBXVEMoMHgwM2EyMWY2NCksIFdUQygweDAzOTJmOGQ0KSwgV1RDKDB4MDM4MzE4ZTApLCBXVEMoMHgwMzcyOGU5NCksCi1XVEMoMHgwMzYxNzY5NCksIFdUQygweDAzNGZlZTE4KSwgV1RDKDB4MDMzZTExZjQpLCBXVEMoMHgwMzJiZjUzMCksIFdUQygweDAzMTlhMTE0KSwgV1RDKDB4MDMwNzFlODApLCBXVEMoMHgwMmY0NzVmNCksIFdUQygweDAyZTFhN2MwKSwKLVdUQygweDAyY2VhYzA0KSwgV1RDKDB4MDJiYjdhODQpLCBXVEMoMHgwMmE4MGFmMCksIFdUQygweDAyOTQ1MmIwKSwgV1RDKDB4MDI4MDQ0ZTApLCBXVEMoMHgwMjZiZDQ4OCksIFdUQygweDAyNTZmNTU4KSwgV1RDKDB4MDI0MWE5NDApLAotV1RDKDB4MDIyYzAwODQpLCBXVEMoMHgwMjE2MGMwOCksIFdUQygweDAxZmZkYzVhKSwgV1RDKDB4MDFlOTdhZDIpLCBXVEMoMHgwMWQyZTk4MiksIFdUQygweDAxYmMyYTJhKSwgV1RDKDB4MDFhNTNlOGMpLCBXVEMoMHgwMThlMjg2MCksCi1XVEMoMHgwMTc2ZTk0YyksIFdUQygweDAxNWY4MmZhKSwgV1RDKDB4MDE0N2Y3MGUpLCBXVEMoMHgwMTMwNDZjMiksIFdUQygweDAxMTg3MmU4KSwgV1RDKDB4MDEwMDdjNGEpLCBXVEMoMHgwMGU4NjNjZiksIFdUQygweDAwZDAyYzgxKSwKLVdUQygweDAwYjdkYjk0KSwgV1RDKDB4MDA5Zjc2NTEpLCBXVEMoMHgwMDg3MDIwNCksIFdUQygweDAwNmU4M2Y4KSwgV1RDKDB4MDA1NjAxNzYpLCBXVEMoMHgwMDNkN2ZjYiksIFdUQygweDAwMjUwNDNmKSwgV1RDKDB4MDAwYzk0MWYpLAotV1RDKDB4ZDY1NTc0YzApLCBXVEMoMHhkNWViYzEwMCksIFdUQygweGQ1ODJkMDgwKSwgV1RDKDB4ZDUxYTljYzApLCBXVEMoMHhkNGIzMWY4MCksIFdUQygweGQ0NGM1MjgwKSwgV1RDKDB4ZDNlNjJmODApLCBXVEMoMHhkMzgwYjA0MCksCi1XVEMoMHhkMzFiY2U0MCksIFdUQygweGQyYjc4MzgwKSwgV1RDKDB4ZDI1M2NhNDApLCBXVEMoMHhkMWYwYWNjMCksIFdUQygweGQxOGU0NTgwKSwgV1RDKDB4ZDEyY2FmNDApLCBXVEMoMHhkMGNjMDQwMCksIFdUQygweGQwNmM0MGMwKSwKLVdUQygweGQwMGQ0NzQwKSwgV1RDKDB4Y2ZhZWY2YzApLCBXVEMoMHhjZjUxMzE0MCksIFdUQygweGNlZjNmYTgwKSwgV1RDKDB4Y2U5NzdhNDApLCBXVEMoMHhjZTNiZDk4MCksIFdUQygweGNkZTEzZjQwKSwgV1RDKDB4Y2Q4N2E4ODApLAotV1RDKDB4Y2QyZWU4MDApLCBXVEMoMHhjY2Q2Y2YwMCksIFdUQygweGNjN2YyZjQwKSwgV1RDKDB4Y2MyN2U4ODApLCBXVEMoMHhjYmQwZWEwMCksIFdUQygweGNiN2EyMzgwKSwgV1RDKDB4Y2IyMzgzODApLCBXVEMoMHhjYWNjZWU4MCksCi1XVEMoMHhjYTc2M2VjMCksIFdUQygweGNhMWY0ZDAwKSwgV1RDKDB4YzljN2Y0ODApLCBXVEMoMHhjOTcwM2I0MCksIFdUQygweGM5MTg1MjAwKSwgV1RDKDB4YzhjMDZiMDApLCBXVEMoMHhjODY4YjRjMCksIFdUQygweGM4MTEwMGMwKSwKLVdUQygweGM3YjhjMjgwKSwgV1RDKDB4Yzc1ZjZhNDApLCBXVEMoMHhjNzA0NjkwMCksIFdUQygweGM2YTc0MzQwKSwgV1RDKDB4YzY0NzkzMDApLCBXVEMoMHhjNWU0ZjIwMCksIFdUQygweGM1N2VmYWMwKSwgV1RDKDB4YzUxNTQ4ODApLAotV1RDKDB4YzRhNzc3ODApLCBXVEMoMHhjNDM1MjQ0MCksIFdUQygweGMzYmRlYWMwKSwgV1RDKDB4YzM0MTY3NDApLCBXVEMoMHhjMmJmMzNjMCksIFdUQygweGMyMzZlYjQwKSwgV1RDKDB4YzFhODI5MDApLCBXVEMoMHhjMTEyOTBjMCksCi1XVEMoMHhjMDc1Y2YwMCksIFdUQygweGJmZDE5MDgxKSwgV1RDKDB4YmYyNTg0MDEpLCBXVEMoMHhiZTcxNmQ4MSksIFdUQygweGJkYjUyYjgxKSwgV1RDKDB4YmNmMDlhODEpLCBXVEMoMHhiYzIzYWY4MSksIFdUQygweGJiNTA1YzAxKSwKLVdUQygweGJhN2E5MDgxKSwgV1RDKDB4YjlhNjUyODEpLCBXVEMoMHhiOGQ3OTMwMSksIFdUQygweGI4MTA0YzAxKSwgV1RDKDB4Yjc1MDgxODEpLCBXVEMoMHhiNjk4MjIwMSksIFdUQygweGI1ZTcxYjAxKSwgV1RDKDB4YjUzZDViMDEpLAotV1RDKDB4YjQ5YWQwODEpLCBXVEMoMHhiM2ZmNjkwMSksIFdUQygweGIzNmIxMzAxKSwgV1RDKDB4YjJkZGJkMDEpLCBXVEMoMHhiMjU3NTQ4MSksIFdUQygweGIxZDdjODAxKSwgV1RDKDB4YjE1ZjA2MDEpLCBXVEMoMHhiMGVjZmMwMSksCi1XVEMoMHhiMDgxOTg4MSksIFdUQygweGIwMWNjYTAxKSwgV1RDKDB4YWZiZTdlMDEpLCBXVEMoMHhhZjY2YTMwMSksIFdUQygweGFmMTUyNzAxKSwgV1RDKDB4YWVjOWY4ODEpLCBXVEMoMHhhZTg1MDYwMSksIFdUQygweGFlNDYzYzgxKSwKLVdUQygweGFlMGQ4YjAxKSwgV1RDKDB4YWRkYWUwMDEpLCBXVEMoMHhhZGFlMjg4MSksIFdUQygweGFkODc1MzgxKSwgV1RDKDB4YWQ2NjRmODEpLCBXVEMoMHhhZDRiMDk4MSksIFdUQygweGFkMzU3MDgxKSwgV1RDKDB4YWQyNTczMDEpLAotV1RDKDB4YWQxYWZlMDEpLCBXVEMoMHhhZDE2MDA4MSksIFdUQygweGFkMTY2OTAxKSwgV1RDKDB4YWQxYzI0ODEpLCBXVEMoMHhhZDI3MjIwMSksIFdUQygweGFkMzc0ZjgxKSwgV1RDKDB4YWQ0YzliMDEpLCBXVEMoMHhhZDY2ZjM4MSksCi1XVEMoMHhhZDg2NDYwMSksIFdUQygweGFkYWE4MTAxKSwgV1RDKDB4YWRkMzkzMDEpLCBXVEMoMHhhZTAxNmEwMSksIFdUQygweGFlMzNmNDgxKSwgV1RDKDB4YWU2YjIwMDEpLCBXVEMoMHhhZWE2ZGIwMSksIFdUQygweGFlZTcxMzgxKSwKLVdUQygweGFmMmJiODAxKSwgV1RDKDB4YWY3NGI2ODEpLCBXVEMoMHhhZmMxZmQwMSksIFdUQygweGIwMTM3YTAxKSwgV1RDKDB4YjA2OTFiODEpLCBXVEMoMHhiMGMyY2Y4MSksIFdUQygweGIxMjA4NDgxKSwgV1RDKDB4YjE4MjI4ODEpLAotV1RDKDB4YjFlN2E5ODEpLCBXVEMoMHhiMjUwZjYwMSksIFdUQygweGIyYmRmYzAxKSwgV1RDKDB4YjMyZWFhMDEpLCBXVEMoMHhiM2EyZWQwMSksIFdUQygweGI0MWFiNDgxKSwgV1RDKDB4YjQ5NWVlMDEpLCBXVEMoMHhiNTE0ODgwMSksCi1XVEMoMHhiNTk2NzA4MSksIFdUQygweGI2MWI5NTgxKSwgV1RDKDB4YjZhM2U1ODEpLCBXVEMoMHhiNzJmNGUwMSksIFdUQygweGI3YmRiZTAxKSwgV1RDKDB4Yjg0ZjIzODEpLCBXVEMoMHhiOGUzNmM4MSksIFdUQygweGI5N2E4NzAxKSwKLVdUQygweGJhMTQ2MTAxKSwgV1RDKDB4YmFiMGU5ODEpLCBXVEMoMHhiYjUwMGQ4MSksIFdUQygweGJiZjFiYzgxKSwgV1RDKDB4YmM5NWUzODEpLCBXVEMoMHhiZDNjNzE4MSksIFdUQygweGJkZTU1NDgxKSwgV1RDKDB4YmU5MDdhMDEpLAotV1RDKDB4YmYzZGQxMDEpLCBXVEMoMHhiZmVkNDcwMSksIFdUQygweGMwOWVjYWMwKSwgV1RDKDB4YzE1MjRhMDApLCBXVEMoMHhjMjA3YjMwMCksIFdUQygweGMyYmVmNDQwKSwgV1RDKDB4YzM3N2ZiODApLCBXVEMoMHhjNDMyYjcwMCksCi1XVEMoMHhjNGVmMTUwMCksIFdUQygweGM1YWQwM2MwKSwgV1RDKDB4YzY2YzcxNDApLCBXVEMoMHhjNzJkNGJjMCksIFdUQygweGM3ZWY4MTgwKSwgV1RDKDB4YzhiMzAwODApLCBXVEMoMHhjOTc3YjcwMCksIFdUQygweGNhM2Q5MzQwKSwKLVdUQygweGNiMDQ4MzQwKSwgV1RDKDB4Y2JjYzc1NDApLCBXVEMoMHhjYzk1NTc0MCksIFdUQygweGNkNWYxN2MwKSwgV1RDKDB4Y2UyOWE0ODApLCBXVEMoMHhjZWY0ZWMwMCksIFdUQygweGNmYzBkYzgwKSwgV1RDKDB4ZDA4ZDYzYzApLAotV1RDKDB4ZDE1YTcwNDApLCBXVEMoMHhkMjI3ZjAwMCksIFdUQygweGQyZjVkMTQwKSwgV1RDKDB4ZDNjNDAyNDApLCBXVEMoMHhkNDkyNzEwMCksIFdUQygweGQ1NjEwYjgwKSwgV1RDKDB4ZDYyZmMwODApLCBXVEMoMHhkNmZlN2RjMCksCi1XVEMoMHhkN2NkMzE0MCksIFdUQygweGQ4OWJjOTgwKSwgV1RDKDB4ZDk2YTM0YzApLCBXVEMoMHhkYTM4NjBjMCksIFdUQygweGRiMDYzYzAwKSwgV1RDKDB4ZGJkM2I0ODApLCBXVEMoMHhkY2EwYjg4MCksIFdUQygweGRkNmQzNjQwKSwKLVdUQygweGRlMzkxYmMwKSwgV1RDKDB4ZGYwNDU3NDApLCBXVEMoMHhkZmNlZDZjMCksIFdUQygweGUwOTg4OGMwKSwgV1RDKDB4ZTE2MTViMjApLCBXVEMoMHhlMjI5M2MyMCksIFdUQygweGUyZjAxYTAwKSwgV1RDKDB4ZTNiNWUyYzApLAotV1RDKDB4ZTQ3YTg0YzApLCBXVEMoMHhlNTNkZWUwMCksIFdUQygweGU2MDAwY2MwKSwgV1RDKDB4ZTZjMGNmMjApLCBXVEMoMHhlNzgwMjM2MCksIFdUQygweGU4M2RmN2EwKSwgV1RDKDB4ZThmYTM5ZTApLCBXVEMoMHhlOWI0ZDg4MCksCi1XVEMoMHhlYTZkYzFhMCksIFdUQygweGViMjRlMzYwKSwgV1RDKDB4ZWJkYTJiZTApLCBXVEMoMHhlYzhkODk2MCksIFdUQygweGVkM2VlYTIwKSwgV1RDKDB4ZWRlZTNjMDApLCBXVEMoMHhlZTliNmQ4MCksIFdUQygweGVmNDY2Y2EwKSwKLVdUQygweGVmZWYyNzgwKSwgV1RDKDB4ZjA5NThjNTApLCBXVEMoMHhmMTM5ODk1MCksIFdUQygweGYxZGIwY2EwKSwgV1RDKDB4ZjI3YTA0NzApLCBXVEMoMHhmMzE2NWVkMCksIFdUQygweGYzYjAwYTEwKSwgV1RDKDB4ZjQ0NmY0NDApLAotV1RDKDB4ZjRkYjBiOTApLCBXVEMoMHhmNTZjM2UzMCksIFdUQygweGY1ZmE3YTUwKSwgV1RDKDB4ZjY4NWFlMTApLCBXVEMoMHhmNzBkYzdhMCksIFdUQygweGY3OTJiNTIwKSwgV1RDKDB4ZjgxNDY0YzgpLCBXVEMoMHhmODkyYzRjMCksCi1XVEMoMHhmOTBkYzMzMCksIFdUQygweGY5ODU0ZTQwKSwgV1RDKDB4ZjlmOTU0MTgpLCBXVEMoMHhmYTY5YzJmMCksIFdUQygweGZhZDY4OGU4KSwgV1RDKDB4ZmIzZjk0MjgpLCBXVEMoMHhmYmE0ZDJlOCksIFdUQygweGZjMDYzMzQ0KSwKLVdUQygweGZjNjNhMzcwKSwgV1RDKDB4ZmNiZDExOTQpLCBXVEMoMHhmZDEyNmJkYyksIFdUQygweGZkNjNhMDZjKSwgV1RDKDB4ZmRiMDlkNzgpLCBXVEMoMHhmZGY5NTEyNCksIFdUQygweGZlM2RhOTllKSwgV1RDKDB4ZmU3ZDk1MGUpLAotV1RDKDB4ZmViOTAxYTIpLCBXVEMoMHhmZWVmZGQ4MCksIFdUQygweGZmMjIxNmQ3KSwgV1RDKDB4ZmY0ZjliY2YpLCBXVEMoMHhmZjc4NWE5MyksIFdUQygweGZmOWM0MTRlKSwgV1RDKDB4ZmZiYjNlMmIpLCBXVEMoMHhmZmQ1M2Y1NCksCi1XVEMoMHhmZmVhMzJmNCksIFdUQygweGZmZmEwNzM1KSwgV1RDKDB4MDAwNGFhNDMpLCBXVEMoMHgwMDBhMGE0NyksIFdUQygweDAwMGExNTZjKSwgV1RDKDB4MDAwNGI5ZGUpLCBXVEMoMHhmZmY5ZTVjNSksIFdUQygweGZmZTk4NzRlKQotfTsKLQorICAgIC8qIHBhcnQgMCAqLworICAgIFdUQygweGRhYzk4NGMwKSwgV1RDKDB4ZGIxMDAwODApLCBXVEMoMHhkYjU2Y2QwMCksIFdUQygweGRiOWRlYzQwKSwKKyAgICBXVEMoMHhkYmU1NWZjMCksIFdUQygweGRjMmQyODgwKSwgV1RDKDB4ZGM3NTQ3ODApLCBXVEMoMHhkY2JkYmQ4MCksCisgICAgV1RDKDB4ZGQwNjhhODApLCBXVEMoMHhkZDRmYWU4MCksIFdUQygweGRkOTkyOTQwKSwgV1RDKDB4ZGRlMmY5YzApLAorICAgIFdUQygweGRlMmQxZmMwKSwgV1RDKDB4ZGU3NzlhODApLCBXVEMoMHhkZWMyNmEwMCksIFdUQygweGRmMGQ4ZTAwKSwKKyAgICBXVEMoMHhkZjU5MDY4MCksIFdUQygweGRmYTRkNTQwKSwgV1RDKDB4ZGZmMGZjODApLCBXVEMoMHhlMDNkN2UyMCksCisgICAgV1RDKDB4ZTA4YTU5MDApLCBXVEMoMHhlMGQ3OGEyMCksIFdUQygweGUxMjUwY2MwKSwgV1RDKDB4ZTE3MmRjYzApLAorICAgIFdUQygweGUxYzBmN2EwKSwgV1RDKDB4ZTIwZjU5YTApLCBXVEMoMHhlMjVkZmVhMCksIFdUQygweGUyYWNlNDAwKSwKKyAgICBXVEMoMHhlMmZjMGJlMCksIFdUQygweGUzNGI3YmMwKSwgV1RDKDB4ZTM5YjNjODApLCBXVEMoMHhlM2ViNTI2MCksCisgICAgV1RDKDB4ZTQzYmJhYzApLCBXVEMoMHhlNDhjNzE2MCksIFdUQygweGU0ZGQ3MTQwKSwgV1RDKDB4ZTUyZWI2MDApLAorICAgIFdUQygweGU1ODAzYzAwKSwgV1RDKDB4ZTVkMWZkYTApLCBXVEMoMHhlNjIzZjM2MCksIFdUQygweGU2NzYxNzAwKSwKKyAgICBXVEMoMHhlNmM4NjQwMCksIFdUQygweGU3MWFkNTAwKSwgV1RDKDB4ZTc2ZDYzZTApLCBXVEMoMHhlN2MwMGJhMCksCisgICAgV1RDKDB4ZTgxMmM4ZTApLCBXVEMoMHhlODY1OThlMCksIFdUQygweGU4Yjg3OGUwKSwgV1RDKDB4ZTkwYjY4YTApLAorICAgIFdUQygweGU5NWU2YzQwKSwgV1RDKDB4ZTliMThhZTApLCBXVEMoMHhlYTA0Y2U4MCksIFdUQygweGVhNTgzYmEwKSwKKyAgICBXVEMoMHhlYWFiY2RhMCksIFdUQygweGVhZmY3ZWUwKSwgV1RDKDB4ZWI1MzQ4ZTApLCBXVEMoMHhlYmE3MjJjMCksCisgICAgV1RDKDB4ZWJmYjAwNjApLCBXVEMoMHhlYzRlZDI0MCksIFdUQygweGVjYTI4NTQwKSwgV1RDKDB4ZWNmNjBjMjApLAorICAgIFdUQygweGVkNDk2MTIwKSwgV1RDKDB4ZWQ5YzdlODApLCBXVEMoMHhlZGVmNWU0MCksIFdUQygweGVlNDFmYzAwKSwKKyAgICBXVEMoMHhlZTk0NTYwMCksIFdUQygweGVlZTY2YWMwKSwgV1RDKDB4ZWYzODM5YTApLCBXVEMoMHhlZjg5YzBlMCksCisgICAgV1RDKDB4ZWZkYWZkYTApLCBXVEMoMHhmMDJiZWQ2MCksIFdUQygweGYwN2M4ZTgwKSwgV1RDKDB4ZjBjY2UwMDApLAorICAgIFdUQygweGYxMWNlMjIwKSwgV1RDKDB4ZjE2Yzk2MjApLCBXVEMoMHhmMWJiZmUzMCksIFdUQygweGYyMGIxOWUwKSwKKyAgICBXVEMoMHhmMjU5ZTVhMCksIFdUQygweGYyYTg1ZGMwKSwgV1RDKDB4ZjJmNjdlZDApLCBXVEMoMHhmMzQ0NDViMCksCisgICAgV1RDKDB4ZjM5MWFlZDApLCBXVEMoMHhmM2RlYjU5MCksIFdUQygweGY0MmI1M2UwKSwgV1RDKDB4ZjQ3NzgxNDApLAorICAgIFdUQygweGY0YzMzMTkwKSwgV1RDKDB4ZjUwZTU2NjApLCBXVEMoMHhmNTU4ZGYzMCksIFdUQygweGY1YTJiZTUwKSwKKyAgICBXVEMoMHhmNWViZWExMCksIFdUQygweGY2MzQ1NzgwKSwgV1RDKDB4ZjY3YmZhYjApLCBXVEMoMHhmNmMyY2VlMCksCisgICAgV1RDKDB4ZjcwOGQ3YjApLCBXVEMoMHhmNzRlMTljMCksIFdUQygweGY3OTI5YTcwKSwgV1RDKDB4ZjdkNjY2MzApLAorICAgIFdUQygweGY4MTk5MjY4KSwgV1RDKDB4Zjg1YzM4NjApLCBXVEMoMHhmODllNzQ4MCksIFdUQygweGY4ZTA1OGMwKSwKKyAgICBXVEMoMHhmOTIxZWMwOCksIFdUQygweGY5NjMzODAwKSwgV1RDKDB4ZjlhNDQ5ODApLCBXVEMoMHhmOWU1MzE1OCksCisgICAgV1RDKDB4ZmEyNjAxNTgpLCBXVEMoMHhmYTY2Y2ExOCksIFdUQygweGZhYTc5YWMwKSwgV1RDKDB4ZmFlODc5MjApLAorICAgIFdUQygweGZiMjk1ZmEwKSwgV1RDKDB4ZmI2YTQyYjgpLCBXVEMoMHhmYmFiMTI0MCksIFdUQygweGZiZWJkMWMwKSwKKyAgICBXVEMoMHhmYzJjOWMyNCksIFdUQygweGZjNmQ4ZDkwKSwgV1RDKDB4ZmNhZWMyNDApLCBXVEMoMHhmY2YwNTY4NCksCisgICAgV1RDKDB4ZmQzMjZhOTgpLCBXVEMoMHhmZDc1MjU0YyksIFdUQygweGZkYjhhZmQ0KSwgV1RDKDB4ZmRmY2NkZmMpLAorICAgIFdUQygweGZlNDBkNjk0KSwgV1RDKDB4ZmU4NDE2MWMpLCBXVEMoMHhmZWM1Y2Y1YSksIFdUQygweGZmMDRlN2ZjKSwKKyAgICBXVEMoMHhmZjNmZGZlMyksIFdUQygweGZmNzUxZGRmKSwgV1RDKDB4ZmZhMmZiMGYpLCBXVEMoMHhmZmM4N2M0MiksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHhiZmZiNjA4MSksIFdUQygweGJmZjIyZjgxKSwgV1RDKDB4YmZlOGZjMDEpLCBXVEMoMHhiZmRmYzc4MSksCisgICAgV1RDKDB4YmZkNjkxMDEpLCBXVEMoMHhiZmNkNWEwMSksIFdUQygweGJmYzQyMjAxKSwgV1RDKDB4YmZiYWU5ODEpLAorICAgIFdUQygweGJmYjFiMTAxKSwgV1RDKDB4YmZhODc5MDEpLCBXVEMoMHhiZjlmNDE4MSksIFdUQygweGJmOTYwYjAxKSwKKyAgICBXVEMoMHhiZjhjZDQ4MSksIFdUQygweGJmODM5ZDgxKSwgV1RDKDB4YmY3YTY2ODEpLCBXVEMoMHhiZjcxMmYwMSksCisgICAgV1RDKDB4YmY2N2Y4MDEpLCBXVEMoMHhiZjVlYzEwMSksIFdUQygweGJmNTU4YjAxKSwgV1RDKDB4YmY0YzU2ODEpLAorICAgIFdUQygweGJmNDMyMjgxKSwgV1RDKDB4YmYzOWVlODEpLCBXVEMoMHhiZjMwYmIwMSksIFdUQygweGJmMjc4ODAxKSwKKyAgICBXVEMoMHhiZjFlNTUwMSksIFdUQygweGJmMTUyMzgxKSwgV1RDKDB4YmYwYmYzODEpLCBXVEMoMHhiZjAyYzU4MSksCisgICAgV1RDKDB4YmVmOTk5MDEpLCBXVEMoMHhiZWYwNmQwMSksIFdUQygweGJlZTc0MjgxKSwgV1RDKDB4YmVkZTE5MDEpLAorICAgIFdUQygweGJlZDRmMDgxKSwgV1RDKDB4YmVjYmNhODEpLCBXVEMoMHhiZWMyYTc4MSksIFdUQygweGJlYjk4NjgxKSwKKyAgICBXVEMoMHhiZWIwNjg4MSksIFdUQygweGJlYTc0YzgxKSwgV1RDKDB4YmU5ZTMyODEpLCBXVEMoMHhiZTk1MWE4MSksCisgICAgV1RDKDB4YmU4YzA1MDEpLCBXVEMoMHhiZTgyZjMwMSksIFdUQygweGJlNzllNDgxKSwgV1RDKDB4YmU3MGRhMDEpLAorICAgIFdUQygweGJlNjdkMzgxKSwgV1RDKDB4YmU1ZWQwODEpLCBXVEMoMHhiZTU1ZDAwMSksIFdUQygweGJlNGNkMzgxKSwKKyAgICBXVEMoMHhiZTQzZGE4MSksIFdUQygweGJlM2FlNjAxKSwgV1RDKDB4YmUzMWY3MDEpLCBXVEMoMHhiZTI5MGQwMSksCisgICAgV1RDKDB4YmUyMDI4MDEpLCBXVEMoMHhiZTE3NDc4MSksIFdUQygweGJlMGU2YzAxKSwgV1RDKDB4YmUwNTk0ODEpLAorICAgIFdUQygweGJkZmNjMzAxKSwgV1RDKDB4YmRmM2Y3MDEpLCBXVEMoMHhiZGViMzEwMSksIFdUQygweGJkZTI3MjAxKSwKKyAgICBXVEMoMHhiZGQ5Yjk4MSksIFdUQygweGJkZDEwNjgxKSwgV1RDKDB4YmRjODU5ODEpLCBXVEMoMHhiZGJmYjI4MSksCisgICAgV1RDKDB4YmRiNzEyMDEpLCBXVEMoMHhiZGFlNzg4MSksIFdUQygweGJkYTVlNjAxKSwgV1RDKDB4YmQ5ZDViODEpLAorICAgIFdUQygweGJkOTRkODAxKSwgV1RDKDB4YmQ4YzVjMDEpLCBXVEMoMHhiZDgzZTY4MSksIFdUQygweGJkN2I3NzgxKSwKKyAgICBXVEMoMHhiZDczMTA4MSksIFdUQygweGJkNmFiMTAxKSwgV1RDKDB4YmQ2MjU5ODEpLCBXVEMoMHhiZDVhMGIwMSksCisgICAgV1RDKDB4YmQ1MWM0ODEpLCBXVEMoMHhiZDQ5ODYwMSksIFdUQygweGJkNDE0ZjAxKSwgV1RDKDB4YmQzOTFmODEpLAorICAgIFdUQygweGJkMzBmODgxKSwgV1RDKDB4YmQyOGQ5ODEpLCBXVEMoMHhiZDIwYzQwMSksIFdUQygweGJkMThiNzgxKSwKKyAgICBXVEMoMHhiZDEwYjM4MSksIFdUQygweGJkMDhiNzgxKSwgV1RDKDB4YmQwMGMzODEpLCBXVEMoMHhiY2Y4ZDc4MSksCisgICAgV1RDKDB4YmNmMGYzODEpLCBXVEMoMHhiY2U5MTgwMSksIFdUQygweGJjZTE0NjAxKSwgV1RDKDB4YmNkOTdjODEpLAorICAgIFdUQygweGJjZDFiYjgxKSwgV1RDKDB4YmNjYTAzMDEpLCBXVEMoMHhiY2MyNTE4MSksIFdUQygweGJjYmFhODAxKSwKKyAgICBXVEMoMHhiY2IzMDYwMSksIFdUQygweGJjYWI2YzAxKSwgV1RDKDB4YmNhM2RiMDEpLCBXVEMoMHhiYzljNTI4MSksCisgICAgV1RDKDB4YmM5NGQyMDEpLCBXVEMoMHhiYzhkNTkwMSksIFdUQygweGJjODVlODAxKSwgV1RDKDB4YmM3ZTdlMDEpLAorICAgIFdUQygweGJjNzcxYzAxKSwgV1RDKDB4YmM2ZmMxMDEpLCBXVEMoMHhiYzY4NmUwMSksIFdUQygweGJjNjEyMzAxKSwKKyAgICBXVEMoMHhiYzU5ZGY4MSksIFdUQygweGJjNTJhMzgxKSwgV1RDKDB4YmM0YjZlODEpLCBXVEMoMHhiYzQ0NDA4MSksCisgICAgV1RDKDB4YmMzZDE4MDEpLCBXVEMoMHhiYzM1ZjUwMSksIFdUQygweGJjMmVkNjgxKSwgV1RDKDB4YmMyN2JkODEpLAorICAgIFdUQygweGJjMjBhZTAxKSwgV1RDKDB4YmMxOWFiMDEpLCBXVEMoMHhiYzEyYjgwMSksIFdUQygweGJjMGJjZjgxKSwKKyAgICBXVEMoMHhiYzA0ZTM4MSksIFdUQygweGJiZmRlNDgxKSwgV1RDKDB4YmJmNmM2MDEpLCBXVEMoMHhiYmVmOWI4MSksCisgICAgV1RDKDB4YmJlODk5MDEpLCBXVEMoMHhiYmUxZjQwMSksIFdUQygweGJiZGJlMjAxKSwgV1RDKDB4YmJkNjhjODEpLAorICAgIFdUQygweGJiZDIxMjgxKSwgV1RDKDB4YmJjZTkxODEpLCBXVEMoMHhiYmNjMjY4MSksIFdUQygweGJiY2FjYTAxKSwKKyAgICBXVEMoMHhiYmNhNTA4MSksIFdUQygweGJiY2E4ZDAxKSwgV1RDKDB4YmJjYjUzMDEpLCBXVEMoMHhiYmNjODIwMSksCisgICAgV1RDKDB4YmJjZTA2MDEpLCBXVEMoMHhiYmNmY2E4MSksIFdUQygweGJiZDFiZDgxKSwgV1RDKDB4YmJkM2UxMDEpLAorICAgIFdUQygweGJiZDY0ZDAxKSwgV1RDKDB4YmJkOTFiODEpLCBXVEMoMHhiYmRjNjQ4MSksIFdUQygweGJiZTAzODAxKSwKKyAgICBXVEMoMHhiYmU0OWQwMSksIFdUQygweGJiZTk5OTgxKSwgV1RDKDB4YmJlZjMzMDEpLCBXVEMoMHhiYmY1NjE4MSksCisgICAgV1RDKDB4YmJmYzBmODEpLCBXVEMoMHhiYzAzMjYwMSksIFdUQygweGJjMGE4ZjAxKSwgV1RDKDB4YmMxMjNiODEpLAorICAgIFdUQygweGJjMWEyNDAxKSwgV1RDKDB4YmMyMjQxODEpLCBXVEMoMHhiYzJhOGM4MSksIFdUQygweGJjMzMwNzgxKSwKKyAgICBXVEMoMHhiYzNiYmMwMSksIFdUQygweGJjNDRiNDgxKSwgV1RDKDB4YmM0ZGZiODEpLCBXVEMoMHhiYzU3YTMwMSksCisgICAgV1RDKDB4YmM2MWM0MDEpLCBXVEMoMHhiYzZjNzc4MSksIFdUQygweGJjNzdkNjAxKSwgV1RDKDB4YmM4M2YyMDEpLAorICAgIFdUQygweGJjOTBkNDgxKSwgV1RDKDB4YmM5ZTg4MDEpLCBXVEMoMHhiY2FkMTUwMSksIFdUQygweGJjYmM3ZTAxKSwKKyAgICBXVEMoMHhiY2NjYmQwMSksIFdUQygweGJjZGRjYzgxKSwgV1RDKDB4YmNlZmE2MDEpLCBXVEMoMHhiZDAyM2YwMSksCisgICAgV1RDKDB4YmQxNTg4MDEpLCBXVEMoMHhiZDI5NzE4MSksIFdUQygweGJkM2RlYjgxKSwgV1RDKDB4YmQ1MmViMDEpLAorICAgIFdUQygweGJkNjg2NjgxKSwgV1RDKDB4YmQ3ZTU1ODEpLCBXVEMoMHhiZDk0YjAwMSksIFdUQygweGJkYWI3MTgxKSwKKyAgICBXVEMoMHhiZGMyOWE4MSksIFdUQygweGJkZGEyYTAxKSwgV1RDKDB4YmRmMjIxODEpLCBXVEMoMHhiZTBhODU4MSksCisgICAgV1RDKDB4YmUyMzYwMDEpLCBXVEMoMHhiZTNjYmMwMSksIFdUQygweGJlNTZhMzgxKSwgV1RDKDB4YmU3MTIwMDEpLAorICAgIFdUQygweGJlOGMzNzgxKSwgV1RDKDB4YmVhN2YzMDEpLCBXVEMoMHhiZWM0NTg4MSksIFdUQygweGJlZTE3MjAxKSwKKyAgICBXVEMoMHhiZWZmNDgwMSksIFdUQygweGJmMWRlNjAxKSwgV1RDKDB4YmYzZDU1MDEpLCBXVEMoMHhiZjVkOWE4MSksCisgICAgV1RDKDB4YmY3ZWI1ODEpLCBXVEMoMHhiZmEwYTU4MSksIFdUQygweGJmYzM2YTAxKSwgV1RDKDB4YmZlNmVkMDEpLAorICAgIFdUQygweGMwMGIwNGMwKSwgV1RDKDB4YzAyZjg2YzApLCBXVEMoMHhjMDU0NDk0MCksIFdUQygweGMwNzkyZWMwKSwKKyAgICBXVEMoMHhjMDllMjY0MCksIFdUQygweGMwYzMxZjAwKSwgV1RDKDB4YzBlODBhMDApLCBXVEMoMHhjMTBjZjQ4MCksCisgICAgV1RDKDB4YzEzMjA5NDApLCBXVEMoMHhjMTU3NzNjMCksIFdUQygweGMxN2Q1ZjAwKSwgV1RDKDB4YzFhM2UzNDApLAorICAgIFdUQygweGMxY2IwNWMwKSwgV1RDKDB4YzFmMmNiYzApLCBXVEMoMHhjMjFiMzk0MCksIFdUQygweGMyNDQ0YjAwKSwKKyAgICBXVEMoMHhjMjZkZjVjMCksIFdUQygweGMyOTgyZDgwKSwgV1RDKDB4YzJjMmU2NDApLCBXVEMoMHhjMmVlMGEwMCksCisgICAgV1RDKDB4YzMxOTc5NDApLCBXVEMoMHhjMzQ1MTNjMCksIFdUQygweGMzNzBiOWMwKSwgV1RDKDB4YzM5YzRmMDApLAorICAgIFdUQygweGMzYzdiYzAwKSwgV1RDKDB4YzNmMmU5NDApLCBXVEMoMHhjNDFkYzE0MCksIFdUQygweGM0NDg1NmMwKSwKKyAgICBXVEMoMHhjNDcyZTY0MCksIFdUQygweGM0OWRhZDgwKSwgV1RDKDB4YzRjOGU4ODApLCBXVEMoMHhjNGY0YWNjMCksCisgICAgV1RDKDB4YzUyMGU4NDApLCBXVEMoMHhjNTRkODc4MCksIFdUQygweGM1N2E3NmMwKSwgV1RDKDB4YzVhNzk2NDApLAorICAgIFdUQygweGM1ZDRiYWMwKSwgV1RDKDB4YzYwMWI4ODApLCBXVEMoMHhjNjJlNjU4MCksIFdUQygweGM2NWFiNjAwKSwKKyAgICBXVEMoMHhjNjg2YmQ0MCksIFdUQygweGM2YjI4ZmMwKSwgV1RDKDB4YzZkZTQxYzApLCBXVEMoMHhjNzA5ZGU0MCksCisgICAgV1RDKDB4YzczNTY2NDApLCBXVEMoMHhjNzYwZGE4MCksIFdUQygweGM3OGMzYzQwKSwgV1RDKDB4YzdiNzg2NDApLAorICAgIFdUQygweGM3ZTJhZmMwKSwgV1RDKDB4YzgwZGFlODApLCBXVEMoMHhjODM4NzhjMCksIFdUQygweGM4NjMwNGMwKSwKKyAgICBXVEMoMHhjODhkNDkwMCksIFdUQygweGM4YjczYjgwKSwgV1RDKDB4YzhlMGQyODApLCBXVEMoMHhjOTBhMDQ0MCksCisgICAgLyogcGFydCAxICovCisgICAgV1RDKDB4YjUyMTJlODEpLCBXVEMoMHhiNDk1OTUwMSksIFdUQygweGI0MGFiNTAxKSwgV1RDKDB4YjM4MDhkODEpLAorICAgIFdUQygweGIyZjcxZjAxKSwgV1RDKDB4YjI2ZTY4ODEpLCBXVEMoMHhiMWU2NmEwMSksIFdUQygweGIxNWYyMzgxKSwKKyAgICBXVEMoMHhiMGQ4OTQwMSksIFdUQygweGIwNTJiYzAxKSwgV1RDKDB4YWZjZDlhODEpLCBXVEMoMHhhZjQ5MmYwMSksCisgICAgV1RDKDB4YWVjNTc4MDEpLCBXVEMoMHhhZTQyNzQ4MSksIFdUQygweGFkYzAyMjgxKSwgV1RDKDB4YWQzZTgxMDEpLAorICAgIFdUQygweGFjYmQ5MDgxKSwgV1RDKDB4YWMzZDUwMDEpLCBXVEMoMHhhYmJkYzAwMSksIFdUQygweGFiM2VkZjAxKSwKKyAgICBXVEMoMHhhYWMwYWQwMSksIFdUQygweGFhNDMyOTgxKSwgV1RDKDB4YTljNjU0MDEpLCBXVEMoMHhhOTRhMmMwMSksCisgICAgV1RDKDB4YThjZWIyMDEpLCBXVEMoMHhhODUzZTUwMSksIFdUQygweGE3ZDljNjgxKSwgV1RDKDB4YTc2MDU2MDEpLAorICAgIFdUQygweGE2ZTc5NDAxKSwgV1RDKDB4YTY2ZjgyMDEpLCBXVEMoMHhhNWY4MWY4MSksIFdUQygweGE1ODE2ZTgxKSwKKyAgICBXVEMoMHhhNTBiNmU4MSksIFdUQygweGE0OTYyMTgxKSwgV1RDKDB4YTQyMTg4MDEpLCBXVEMoMHhhM2FkYTI4MSksCisgICAgV1RDKDB4YTMzYTcyMDEpLCBXVEMoMHhhMmM3ZjgwMSksIFdUQygweGEyNTYzNTAxKSwgV1RDKDB4YTFlNTJhODEpLAorICAgIFdUQygweGExNzRkYTgxKSwgV1RDKDB4YTEwNTQ3MDEpLCBXVEMoMHhhMDk2NzIwMSksIFdUQygweGEwMjg1ZDgxKSwKKyAgICBXVEMoMHg5ZmJiMDk4MSksIFdUQygweDlmNGU3ODAxKSwgV1RDKDB4OWVlMmE5MDEpLCBXVEMoMHg5ZTc3OWY4MSksCisgICAgV1RDKDB4OWUwZDVlMDEpLCBXVEMoMHg5ZGEzZTYwMSksIFdUQygweDlkM2IzYjgxKSwgV1RDKDB4OWNkMzVmODEpLAorICAgIFdUQygweDljNmM1NDgxKSwgV1RDKDB4OWMwNjFiODEpLCBXVEMoMHg5YmEwYjcwMSksIFdUQygweDliM2MyODAxKSwKKyAgICBXVEMoMHg5YWQ4NzA4MSksIFdUQygweDlhNzU5MzAxKSwgV1RDKDB4OWExMzkxMDEpLCBXVEMoMHg5OWIyNmM4MSksCisgICAgV1RDKDB4OTk1MjI4MDEpLCBXVEMoMHg5OGYyYzYwMSksIFdUQygweDk4OTQ0OTAxKSwgV1RDKDB4OTgzNmIyMDEpLAorICAgIFdUQygweDk3ZGEwNDgxKSwgV1RDKDB4OTc3ZTQxODEpLCBXVEMoMHg5NzIzNmIwMSksIFdUQygweDk2Yzk4MzgxKSwKKyAgICBXVEMoMHg5NjcwOGI4MSksIFdUQygweDk2MTg4NTAxKSwgV1RDKDB4OTVjMTcwODEpLCBXVEMoMHg5NTZiNGY4MSksCisgICAgV1RDKDB4OTUxNjIzODEpLCBXVEMoMHg5NGMxZWUwMSksIFdUQygweDk0NmVhZjgxKSwgV1RDKDB4OTQxYzY5MDEpLAorICAgIFdUQygweDkzY2IxYzgxKSwgV1RDKDB4OTM3YWNiMDEpLCBXVEMoMHg5MzJiNzUwMSksIFdUQygweDkyZGQxYjAxKSwKKyAgICBXVEMoMHg5MjhmYmUwMSksIFdUQygweDkyNDM1ZDAxKSwgV1RDKDB4OTFmN2Y5ODEpLCBXVEMoMHg5MWFkOTI4MSksCisgICAgV1RDKDB4OTE2NDI3ODEpLCBXVEMoMHg5MTFiYjk4MSksIFdUQygweDkwZDQ0NzgxKSwgV1RDKDB4OTA4ZGQxMDEpLAorICAgIFdUQygweDkwNDg1NDAxKSwgV1RDKDB4OTAwM2NlODEpLCBXVEMoMHg4ZmMwM2YwMSksIFdUQygweDhmN2RhNDAxKSwKKyAgICBXVEMoMHg4ZjNiZmIwMSksIFdUQygweDhlZmI0MTgxKSwgV1RDKDB4OGViYjc1ODEpLCBXVEMoMHg4ZTdjOTMwMSksCisgICAgV1RDKDB4OGUzZTk0ODEpLCBXVEMoMHg4ZTAxNzU4MSksIFdUQygweDhkYzUzMDAxKSwgV1RDKDB4OGQ4OWJlODEpLAorICAgIFdUQygweDhkNGYxYjAxKSwgV1RDKDB4OGQxNTQwODEpLCBXVEMoMHg4Y2RjMjkwMSksIFdUQygweDhjYTNjYjAxKSwKKyAgICBXVEMoMHg4YzZjMWIwMSksIFdUQygweDhjMzUwZDAxKSwgV1RDKDB4OGJmZTk0MDEpLCBXVEMoMHg4YmM4YTQwMSksCisgICAgV1RDKDB4OGI5MzMwMDEpLCBXVEMoMHg4YjVlMmM4MSksIFdUQygweDhiMjk4YjgxKSwgV1RDKDB4OGFmNTNlODEpLAorICAgIFdUQygweDhhYzEzMzgxKSwgV1RDKDB4OGE4ZDU4MDEpLCBXVEMoMHg4YTU5OWE4MSksIFdUQygweDhhMjVmMzAxKSwKKyAgICBXVEMoMHg4OWYyNjEwMSksIFdUQygweDg5YmVlNTgxKSwgV1RDKDB4ODk4YjgzMDEpLCBXVEMoMHg4OTU4NjkwMSksCisgICAgV1RDKDB4ODkyNWYxMDEpLCBXVEMoMHg4OGY0NzkwMSksIFdUQygweDg4YzQ1ZTgxKSwgV1RDKDB4ODg5NjI5ODEpLAorICAgIFdUQygweDg4NmE4YTgxKSwgV1RDKDB4ODg0MjMzMDEpLCBXVEMoMHg4ODFkZDMwMSksIFdUQygweDg3ZmRkNzgxKSwKKyAgICBXVEMoMHg4N2QwY2E4MSksIFdUQygweDg3Yzc2MjAxKSwgV1RDKDB4ODdiY2FiODEpLCBXVEMoMHg4N2IwZWYwMSksCisgICAgV1RDKDB4ODdhNDhiMDEpLCBXVEMoMHg4Nzk3ZGQ4MSksIFdUQygweDg3OGI0MzAxKSwgV1RDKDB4ODc3ZWRlMDEpLAorICAgIFdUQygweDg3NzI5NzAxKSwgV1RDKDB4ODc2NjU0ODEpLCBXVEMoMHg4NzU5ZmQwMSksIFdUQygweDg3NGQ4NjgxKSwKKyAgICBXVEMoMHg4NzQwZjY4MSksIFdUQygweDg3MzQ1MzgxKSwgV1RDKDB4ODcyN2EzODEpLCBXVEMoMHg4NzFhZTk4MSksCisgICAgV1RDKDB4ODcwZTIzMDEpLCBXVEMoMHg4NzAxNGY4MSksIFdUQygweDg2ZjQ2ZDgxKSwgV1RDKDB4ODZlNzdiODEpLAorICAgIFdUQygweDg2ZGE3OTAxKSwgV1RDKDB4ODZjZDY2ODEpLCBXVEMoMHg4NmMwNDM4MSksIFdUQygweDg2YjMwZjAxKSwKKyAgICBXVEMoMHg4NmE1Y2E4MSksIFdUQygweDg2OTg3NTgxKSwgV1RDKDB4ODY4YjEwMDEpLCBXVEMoMHg4NjdkOWE4MSksCisgICAgV1RDKDB4ODY3MDEzODEpLCBXVEMoMHg4NjYyN2IwMSksIFdUQygweDg2NTRkMDAxKSwgV1RDKDB4ODY0NzEyODEpLAorICAgIFdUQygweDg2Mzk0MzAxKSwgV1RDKDB4ODYyYjYyMDEpLCBXVEMoMHg4NjFkNzA4MSksIFdUQygweDg2MGY2ZTAxKSwKKyAgICBXVEMoMHg4NjAxNTk4MSksIFdUQygweDg1ZjMzMjgxKSwgV1RDKDB4ODVlNGY4MDEpLCBXVEMoMHg4NWQ2YTk4MSksCisgICAgV1RDKDB4ODVjODQ4MDEpLCBXVEMoMHg4NWI5ZDQ4MSksIFdUQygweDg1YWI0ZjAxKSwgV1RDKDB4ODU5Y2I3ODEpLAorICAgIFdUQygweDg1OGUwZTAxKSwgV1RDKDB4ODU3ZjUxMDEpLCBXVEMoMHg4NTcwN2Y4MSksIFdUQygweDg1NjE5YTAxKSwKKyAgICBXVEMoMHg4NTUyYTE4MSksIFdUQygweDg1NDM5NjAxKSwgV1RDKDB4ODUzNDc5MDEpLCBXVEMoMHg4NTI1NGE4MSksCisgICAgV1RDKDB4ODUxNjA5ODEpLCBXVEMoMHg4NTA2YjU4MSksIFdUQygweDg0Zjc0ZTAxKSwgV1RDKDB4ODRlN2QzODEpLAorICAgIFdUQygweDg0ZDg0NjAxKSwgV1RDKDB4ODRjOGE3MDEpLCBXVEMoMHg4NGI4ZjgwMSksIFdUQygweDg0YTkzODAxKSwKKyAgICBXVEMoMHg4NDk5NjcwMSksIFdUQygweDg0ODk4NDgxKSwgV1RDKDB4ODQ3OThmODEpLCBXVEMoMHg4NDY5ODg4MSksCisgICAgV1RDKDB4ODQ1OTcwODEpLCBXVEMoMHg4NDQ5NDg4MSksIFdUQygweDg0MzkxMDgxKSwgV1RDKDB4ODQyOGNhMDEpLAorICAgIFdUQygweDg0MTg3NDAxKSwgV1RDKDB4ODQwODBkODEpLCBXVEMoMHg4M2Y3OTY4MSksIFdUQygweDgzZTcwZjAxKSwKKyAgICBXVEMoMHg4M2Q2Nzg4MSksIFdUQygweDgzYzVkMzgxKSwgV1RDKDB4ODNiNTIxMDEpLCBXVEMoMHg4M2E0NjE4MSksCisgICAgV1RDKDB4ODM5Mzk1MDEpLCBXVEMoMHg4MzgyYmEwMSksIFdUQygweDgzNzFkMDgxKSwgV1RDKDB4ODM2MGQ5MDEpLAorICAgIFdUQygweDgzNGZkNDgxKSwgV1RDKDB4ODMzZWMzODEpLCBXVEMoMHg4MzJkYTc4MSksIFdUQygweDgzMWM4MTAxKSwKKyAgICBXVEMoMHg4MzBiNGY4MSksIFdUQygweDgyZmExMTgxKSwgV1RDKDB4ODJlOGM4MDEpLCBXVEMoMHg4MmQ3NzIwMSksCisgICAgV1RDKDB4ODJjNjExMDEpLCBXVEMoMHg4MmI0YTYwMSksIFdUQygweDgyYTMzMjgxKSwgV1RDKDB4ODI5MWI2MDEpLAorICAgIFdUQygweDgyODAzMTAxKSwgV1RDKDB4ODI2ZWEyMDEpLCBXVEMoMHg4MjVkMDkwMSksIFdUQygweDgyNGI2NjAxKSwKKyAgICBXVEMoMHg4MjM5Yjk4MSksIFdUQygweDgyMjgwNTgxKSwgV1RDKDB4ODIxNjRhODEpLCBXVEMoMHg4MjA0ODg4MSksCisgICAgV1RDKDB4ODFmMmJmODEpLCBXVEMoMHg4MWUwZWU4MSksIFdUQygweDgxY2YxNTgxKSwgV1RDKDB4ODFiZDM0MDEpLAorICAgIFdUQygweDgxYWI0YjAxKSwgV1RDKDB4ODE5OTVjMDEpLCBXVEMoMHg4MTg3Njc4MSksIFdUQygweDgxNzU2ZDgxKSwKKyAgICBXVEMoMHg4MTYzNmQ4MSksIFdUQygweDgxNTE2NzAxKSwgV1RDKDB4ODEzZjU5ODEpLCBXVEMoMHg4MTJkNDQ4MSksCisgICAgV1RDKDB4ODExYjI5ODEpLCBXVEMoMHg4MTA5MDk4MSksIFdUQygweDgwZjZlNDgxKSwgV1RDKDB4ODBlNGJiODEpLAorICAgIFdUQygweDgwZDI4ZDgxKSwgV1RDKDB4ODBjMDVhMDEpLCBXVEMoMHg4MGFlMWY4MSksIFdUQygweDgwOWJkZjAxKSwKKyAgICBXVEMoMHg4MDg5OTg4MSksIFdUQygweDgwNzc0YzgxKSwgV1RDKDB4ODA2NGZjODEpLCBXVEMoMHg4MDUyYTg4MSksCisgICAgV1RDKDB4ODA0MDUxMDEpLCBXVEMoMHg4MDJkZjcwMSksIFdUQygweDgwMWI5YjAxKSwgV1RDKDB4ODAwOTNlMDEpLAorICAgIFdUQygweDBhNzRiMTIwKSwgV1RDKDB4MGFhMDhhOTApLCBXVEMoMHgwYWNkMmI4MCksIFdUQygweDBhZmE4ODYwKSwKKyAgICBXVEMoMHgwYjI4OTU5MCksIFdUQygweDBiNTc0NzkwKSwgV1RDKDB4MGI4NjkyZDApLCBXVEMoMHgwYmI2NmJiMCksCisgICAgV1RDKDB4MGJlNmM2YjApLCBXVEMoMHgwYzE3OTgzMCksIFdUQygweDBjNDhkNTAwKSwgV1RDKDB4MGM3YTdhZDApLAorICAgIFdUQygweDBjYWM5MDAwKSwgV1RDKDB4MGNkZjFiNjApLCBXVEMoMHgwZDEyMjM5MCksIFdUQygweDBkNDVhOGYwKSwKKyAgICBXVEMoMHgwZDc5YTVlMCksIFdUQygweDBkYWUxNDgwKSwgV1RDKDB4MGRlMmVmMzApLCBXVEMoMHgwZTE4MzgwMCksCisgICAgV1RDKDB4MGU0ZGY4YzApLCBXVEMoMHgwZTg0M2I5MCksIFdUQygweDBlYmIwYTIwKSwgV1RDKDB4MGVmMjY0MzApLAorICAgIFdUQygweDBmMmEzZmMwKSwgV1RDKDB4MGY2MjkyODApLCBXVEMoMHgwZjliNTIxMCksIFdUQygweDBmZDQ3NjkwKSwKKyAgICBXVEMoMHgxMDBkZmE4MCksIFdUQygweDEwNDdkOGEwKSwgV1RDKDB4MTA4MjBiNDApLCBXVEMoMHgxMGJjOGI4MCksCisgICAgV1RDKDB4MTBmNzUwODApLCBXVEMoMHgxMTMyNTEwMCksIFdUQygweDExNmQ4NGUwKSwgV1RDKDB4MTFhOGVjZTApLAorICAgIFdUQygweDExZTQ5NDIwKSwgV1RDKDB4MTIyMDg1YTApLCBXVEMoMHgxMjVjY2JjMCksIFdUQygweDEyOTk1YTQwKSwKKyAgICBXVEMoMHgxMmQ2MGU4MCksIFdUQygweDEzMTJjNGMwKSwgV1RDKDB4MTM0ZjU5ZTApLCBXVEMoMHgxMzhiYWU2MCksCisgICAgV1RDKDB4MTNjN2E3NDApLCBXVEMoMHgxNDAzMjllMCksIFdUQygweDE0M2UxYjYwKSwgV1RDKDB4MTQ3ODYyYTApLAorICAgIFdUQygweDE0YjFlODQwKSwgV1RDKDB4MTRlYTk0YzApLCBXVEMoMHgxNTIyNTBhMCksIFdUQygweDE1NTkwMzgwKSwKKyAgICBXVEMoMHgxNThlOTNlMCksIFdUQygweDE1YzJlODIwKSwgV1RDKDB4MTVmNWU2ZTApLCBXVEMoMHgxNjI3NzlhMCksCisgICAgV1RDKDB4MTY1NzhjYTApLCBXVEMoMHgxNjg2MGNhMCksIFdUQygweDE2YjJlNjQwKSwgV1RDKDB4MTZkZTBiMDApLAorICAgIFdUQygweDE3MDc3MTQwKSwgV1RDKDB4MTcyZjBmYTApLCBXVEMoMHgxNzU0ZTIwMCksIFdUQygweDE3Nzk2MDgwKSwKKyAgICBXVEMoMHgxNzlkN2YyMCksIFdUQygweDE3YzIzNzYwKSwgV1RDKDB4MTdlODdkYTApLCBXVEMoMHgxODEwY2M4MCksCisgICAgV1RDKDB4MTgzYjI1YTApLCBXVEMoMHgxODY3ODUyMCksIFdUQygweDE4OTVlNzAwKSwgV1RDKDB4MThjNjQ1NDApLAorICAgIFdUQygweDE4Zjg5NzgwKSwgV1RDKDB4MTkyY2Q1NjApLCBXVEMoMHgxOTYyZjY4MCksIFdUQygweDE5OWFmMmEwKSwKKyAgICBXVEMoMHgxOWQ0YzFlMCksIFdUQygweDFhMTA1Y2EwKSwgV1RDKDB4MWE0ZGJhZTApLCBXVEMoMHgxYThjZDY2MCksCisgICAgV1RDKDB4MWFjZGFhNjApLCBXVEMoMHgxYjEwMzI2MCksIFdUQygweDFiNTQ2OTQwKSwgV1RDKDB4MWI5YTQ2MDApLAorICAgIFdUQygweDFiZTFiYjgwKSwgV1RDKDB4MWMyYWJjNjApLCBXVEMoMHgxYzc1M2I4MCksIFdUQygweDFjYzEzODYwKSwKKyAgICBXVEMoMHgxZDBlYmUyMCksIFdUQygweDFkNWRkOGMwKSwgV1RDKDB4MWRhZTk0ODApLCBXVEMoMHgxZTAxMDA2MCksCisgICAgV1RDKDB4MWU1NTJmNDApLCBXVEMoMHgxZWFiMzNlMCksIFdUQygweDFmMDMyMDYwKSwgV1RDKDB4MWY1Y2ZjZTApLAorICAgIFdUQygweDFmYjhjNjYwKSwgV1RDKDB4MjAxNjc5YzApLCBXVEMoMHgyMDc2MTFjMCksIFdUQygweDIwZDc1ZjAwKSwKKyAgICBXVEMoMHgyMTNhMDY0MCksIFdUQygweDIxOWRhYjgwKSwgV1RDKDB4MjIwMWY0ODApLCBXVEMoMHgyMjY2YmE4MCksCisgICAgV1RDKDB4MjJjYzBhYzApLCBXVEMoMHgyMzMxZjRjMCksIFdUQygweDIzOTg4OTQwKSwgV1RDKDB4MjNmZmZmNDApLAorICAgIFdUQygweDI0NjhiMzQwKSwgV1RDKDB4MjRkMzAzMDApLCBXVEMoMHgyNTNmNDkwMCksIFdUQygweDI1YWQ4OTgwKSwKKyAgICBXVEMoMHgyNjFkNzJjMCksIFdUQygweDI2OGVhZWMwKSwgV1RDKDB4MjcwMGU4ODApLCBXVEMoMHgyNzczZGI0MCksCisgICAgV1RDKDB4MjdlNzUxYzApLCBXVEMoMHgyODViMTc4MCksIFdUQygweDI4Y2VmYmMwKSwgV1RDKDB4Mjk0MzFmODApLAorICAgIFdUQygweDI5YjdmNjgwKSwgV1RDKDB4MmEyZGY3ODApLCBXVEMoMHgyYWE1OTg4MCksIFdUQygweDJiMWYzMjgwKSwKKyAgICBXVEMoMHgyYjliMDE0MCksIFdUQygweDJjMTk0MDAwKSwgV1RDKDB4MmM5YTI1NDApLCBXVEMoMHgyZDFkOGRjMCksCisgICAgV1RDKDB4MmRhMmZjNDApLCBXVEMoMHgyZTI5ZWU4MCksIFdUQygweDJlYjFlMzQwKSwgV1RDKDB4MmYzYTRlNDApLAorICAgIFdUQygweDJmYzI5OTgwKSwgV1RDKDB4MzA0YTJlYzApLCBXVEMoMHgzMGQwN2NjMCksIFdUQygweDMxNTU2NmMwKSwKKyAgICBXVEMoMHgzMWQ5NDQ4MCksIFdUQygweDMyNWM3MmMwKSwgV1RDKDB4MzJkZjUxYzApLCBXVEMoMHgzMzYyOGM4MCksCisgICAgV1RDKDB4MzNlNzFhMDApLCBXVEMoMHgzNDZkZjQwMCksIFdUQygweDM0ZjgwZGMwKSwgV1RDKDB4MzU4NWM2NDApLAorICAgIFdUQygweDM2MTZlNzAwKSwgV1RDKDB4MzZhYjMzODApLCBXVEMoMHgzNzQyNmFjMCksIFdUQygweDM3ZGJlODQwKSwKKyAgICBXVEMoMHgzODc2YTM0MCksIFdUQygweDM5MTE4ZjQwKSwgV1RDKDB4MzlhYmEyYzApLCBXVEMoMHgzYTQ0MjJjMCksCisgICAgV1RDKDB4M2FkYWEyMDApLCBXVEMoMHgzYjZlYjZjMCksIFdUQygweDNiZmZmZDgwKSwgV1RDKDB4M2M4ZTkzODApLAorICAgIFdUQygweDNkMWIxNzgwKSwgV1RDKDB4M2RhNjJlMDApLCBXVEMoMHgzZTMwN2IwMCksIFdUQygweDNlYmE5N2MwKSwKKyAgICBXVEMoMHgzZjQ1MTI4MCksIFdUQygweDNmZDA3OTQwKSwgV1RDKDB4NDA1ZDU3N2YpLCBXVEMoMHg0MGViZjU3ZiksCisgICAgV1RDKDB4NDE3YzU5ZmYpLCBXVEMoMHg0MjBlODk3ZiksIFdUQygweDQyYTI4NTdmKSwgV1RDKDB4NDMzODMwN2YpLAorICAgIFdUQygweDQzY2Y0ZDdmKSwgV1RDKDB4NDQ2NzljZmYpLCBXVEMoMHg0NTAwZGZmZiksIFdUQygweDQ1OWFjMmZmKSwKKyAgICBXVEMoMHg0NjM0ZTJmZiksIFdUQygweDQ2Y2VkOWZmKSwgV1RDKDB4NDc2ODQzN2YpLCBXVEMoMHg0ODAwZDI3ZiksCisgICAgV1RDKDB4NDg5ODUwZmYpLCBXVEMoMHg0OTJlODhmZiksIFdUQygweDQ5YzM0NmZmKSwgV1RDKDB4NGE1Njc4ZmYpLAorICAgIFdUQygweDRhZTgyZjdmKSwgV1RDKDB4NGI3ODdjN2YpLCBXVEMoMHg0YzA3NzE3ZiksIFdUQygweDRjOTUzMzdmKSwKKyAgICBXVEMoMHg0ZDIxZjc3ZiksIFdUQygweDRkYWRmM2ZmKSwgV1RDKDB4NGUzOTVlZmYpLCBXVEMoMHg0ZWM0NjU3ZiksCisgICAgV1RDKDB4NGY0ZjI5N2YpLCBXVEMoMHg0ZmQ5Y2Q3ZiksIFdUQygweDUwNjQ3MzdmKSwgV1RDKDB4NTBlZjNjZmYpLAorICAgIFdUQygweDUxN2E0NmZmKSwgV1RDKDB4NTIwNWIwZmYpLCBXVEMoMHg1MjkxOTdmZiksIFdUQygweDUzMWUwNGZmKSwKKyAgICBXVEMoMHg1M2FhZWI3ZiksIFdUQygweDU0MzgzZWZmKSwgV1RDKDB4NTRjNWVmN2YpLCBXVEMoMHg1NTUzYThmZiksCisgICAgV1RDKDB4NTVlMGQ1N2YpLCBXVEMoMHg1NjZjZGE3ZiksIFdUQygweDU2ZjcyMGZmKSwgV1RDKDB4NTc3ZjRhZmYpLAorICAgIFdUQygweDU4MDUzNGZmKSwgV1RDKDB4NTg4OGJkN2YpLCBXVEMoMHg1OTA5YzZmZiksIFdUQygweDU5ODg5MGZmKSwKKyAgICBXVEMoMHg1YTA1YjdmZiksIFdUQygweDVhODFkYjdmKSwgV1RDKDB4NWFmZDk5ZmYpLCBXVEMoMHg1Yjc5NGE3ZiksCisgICAgV1RDKDB4NWJmNTAwN2YpLCBXVEMoMHg1YzcwY2JmZiksIFdUQygweDVjZWNiYjdmKSwgV1RDKDB4NWQ2OGM0N2YpLAorICAgIFdUQygweDVkZTRjM2ZmKSwgV1RDKDB4NWU2MDk0ZmYpLCBXVEMoMHg1ZWRjMTI3ZiksIFdUQygweDVmNTZmZGZmKSwKKyAgICBXVEMoMHg1ZmQxMDE3ZiksIFdUQygweDYwNDljNjdmKSwgV1RDKDB4NjBjMGY2N2YpLCBXVEMoMHg2MTM2NTBmZiksCisgICAgV1RDKDB4NjFhOWE5ZmYpLCBXVEMoMHg2MjFhZDc3ZiksIFdUQygweDYyODliMzdmKSwgV1RDKDB4NjJmNjdmZmYpLAorICAgIFdUQygweDYzNjFlODdmKSwgV1RDKDB4NjNjYzliZmYpLCBXVEMoMHg2NDM3NDU3ZiksIFdUQygweDY0YTIyNDdmKSwKKyAgICBXVEMoMHg2NTBkMGM3ZiksIFdUQygweDY1NzdjYzdmKSwgV1RDKDB4NjVlMjMyN2YpLCBXVEMoMHg2NjRiZjU3ZiksCisgICAgV1RDKDB4NjZiNGI1ZmYpLCBXVEMoMHg2NzFjMTM3ZiksIFdUQygweDY3ODFhZmZmKSwgV1RDKDB4NjdlNTc5ZmYpLAorICAgIFdUQygweDY4NDdhYmZmKSwgV1RDKDB4NjhhODgyZmYpLCBXVEMoMHg2OTA4M2JmZiksIFdUQygweDY5NjZmYmZmKSwKKyAgICBXVEMoMHg2OWM0Y2ZmZiksIFdUQygweDZhMjFjNTdmKSwgV1RDKDB4NmE3ZGU4N2YpLCBXVEMoMHg2YWQ5Mzc3ZiksCisgICAgV1RDKDB4NmIzM2E1ZmYpLCBXVEMoMHg2YjhkMjU3ZiksIFdUQygweDZiZTVhOGZmKSwgV1RDKDB4NmMzZDIwZmYpLAorICAgIFdUQygweDZjOTM4MGZmKSwgV1RDKDB4NmNlOGJhN2YpLCBXVEMoMHg2ZDNjYmZmZiksIFdUQygweDZkOGY4MjdmKSwKKyAgICAvKiBwYXJ0IDIgKi8KKyAgICBXVEMoMHhhZDk4YjQ4MSksIFdUQygweGFlYWQ5ZDAxKSwgV1RDKDB4YWZiZmMzODEpLCBXVEMoMHhiMGNmNGQwMSksCisgICAgV1RDKDB4YjFkYzVmODEpLCBXVEMoMHhiMmU3MjA4MSksIFdUQygweGIzZWZiNTAxKSwgV1RDKDB4YjRmNjQzODEpLAorICAgIFdUQygweGI1ZmFmMTAxKSwgV1RDKDB4YjZmZGU0MDEpLCBXVEMoMHhiN2ZmNDAwMSksIFdUQygweGI4ZmYxNjAxKSwKKyAgICBXVEMoMHhiOWZkNjE4MSksIFdUQygweGJhZmExZDAxKSwgV1RDKDB4YmJmNTQ0MDEpLCBXVEMoMHhiY2VlZDEwMSksCisgICAgV1RDKDB4YmRlNmMwODEpLCBXVEMoMHhiZWRkMGU4MSksIFdUQygweGJmZDFiNzAxKSwgV1RDKDB4YzBjNGI0NDApLAorICAgIFdUQygweGMxYjVmZmMwKSwgV1RDKDB4YzJhNTkzNDApLCBXVEMoMHhjMzkzNjc4MCksIFdUQygweGM0N2Y3OGMwKSwKKyAgICBXVEMoMHhjNTY5YzYwMCksIFdUQygweGM2NTI0ZDQwKSwgV1RDKDB4YzczOTBkYzApLCBXVEMoMHhjODFlMDRjMCksCisgICAgV1RDKDB4YzkwMTJlMDApLCBXVEMoMHhjOWUyODU0MCksIFdUQygweGNhYzIwNzAwKSwgV1RDKDB4Y2I5ZmIxYzApLAorICAgIFdUQygweGNjN2I4NjQwKSwgV1RDKDB4Y2Q1NTg2MDApLCBXVEMoMHhjZTJkYjIwMCksIFdUQygweGNmMDQwOWMwKSwKKyAgICBXVEMoMHhjZmQ4OGE0MCksIFdUQygweGQwYWIzMDgwKSwgV1RDKDB4ZDE3YmZhMDApLCBXVEMoMHhkMjRhZTY0MCksCisgICAgV1RDKDB4ZDMxN2Y3YzApLCBXVEMoMHhkM2UzMzA4MCksIFdUQygweGQ0YWM5MzQwKSwgV1RDKDB4ZDU3NDFmNDApLAorICAgIFdUQygweGQ2MzlkMmMwKSwgV1RDKDB4ZDZmZGFiMDApLCBXVEMoMHhkN2JmYTVjMCksIFdUQygweGQ4N2ZjMzAwKSwKKyAgICBXVEMoMHhkOTNlMDYwMCksIFdUQygweGQ5ZmE3MTgwKSwgV1RDKDB4ZGFiNTA5MDApLCBXVEMoMHhkYjZkY2NjMCksCisgICAgV1RDKDB4ZGMyNGJhODApLCBXVEMoMHhkY2Q5ZDAwMCksIFdUQygweGRkOGQwYjgwKSwgV1RDKDB4ZGUzZTZkYzApLAorICAgIFdUQygweGRlZWRmOWMwKSwgV1RDKDB4ZGY5YmIzNDApLCBXVEMoMHhlMDQ3OWUyMCksIFdUQygweGUwZjFiYWMwKSwKKyAgICBXVEMoMHhlMTlhMDdlMCksIFdUQygweGUyNDA4MzgwKSwgV1RDKDB4ZTJlNTJjMDApLCBXVEMoMHhlMzg4MDJlMCksCisgICAgV1RDKDB4ZTQyOTBjMDApLCBXVEMoMHhlNGM4NGMyMCksIFdUQygweGU1NjVjNzYwKSwgV1RDKDB4ZTYwMTdmMjApLAorICAgIFdUQygweGU2OWI3MjQwKSwgV1RDKDB4ZTczMzlmNjApLCBXVEMoMHhlN2NhMDUwMCksIFdUQygweGU4NWVhNDgwKSwKKyAgICBXVEMoMHhlOGYxODE4MCksIFdUQygweGU5ODI5ZmMwKSwgV1RDKDB4ZWExMjAyZTApLCBXVEMoMHhlYTlmYWI4MCksCisgICAgV1RDKDB4ZWIyYjk3MDApLCBXVEMoMHhlYmI1YzJhMCksIFdUQygweGVjM2UyYmMwKSwgV1RDKDB4ZWNjNGQzMDApLAorICAgIFdUQygweGVkNDliYzgwKSwgV1RDKDB4ZWRjY2VjNjApLCBXVEMoMHhlZTRlNjZhMCksIFdUQygweGVlY2UyZDgwKSwKKyAgICBXVEMoMHhlZjRjNDFlMCksIFdUQygweGVmYzhhNDgwKSwgV1RDKDB4ZjA0MzU2MTApLCBXVEMoMHhmMGJjNWM2MCksCisgICAgV1RDKDB4ZjEzM2MyMzApLCBXVEMoMHhmMWE5OTI3MCksIFdUQygweGYyMWRkN2IwKSwgV1RDKDB4ZjI5MDk3ZTApLAorICAgIFdUQygweGYzMDFkM2QwKSwgV1RDKDB4ZjM3MThjMjApLCBXVEMoMHhmM2RmYzE4MCksIFdUQygweGY0NGM3MTAwKSwKKyAgICBXVEMoMHhmNGI3OTQ4MCksIFdUQygweGY1MjEyNWIwKSwgV1RDKDB4ZjU4OTFkZjApLCBXVEMoMHhmNWVmNmZlMCksCisgICAgV1RDKDB4ZjY1NDA3MzApLCBXVEMoMHhmNmI2Y2Y1MCksIFdUQygweGY3MTdiNDkwKSwgV1RDKDB4Zjc3NmI5YTApLAorICAgIFdUQygweGY3ZDNmNzIwKSwgV1RDKDB4ZjgyZjg2ZTgpLCBXVEMoMHhmODg5ODI2MCksIFdUQygweGY4ZTFmYzUwKSwKKyAgICBXVEMoMHhmOTM5MDBmMCksIFdUQygweGY5OGU5YzI4KSwgV1RDKDB4ZjllMmQ5NDApLCBXVEMoMHhmYTM1YjRhMCksCisgICAgV1RDKDB4ZmE4NzFiZDgpLCBXVEMoMHhmYWQ2ZmJkMCksIFdUQygweGZiMjU0MjUwKSwgV1RDKDB4ZmI3MWYwYzApLAorICAgIFdUQygweGZiYmQxYzI4KSwgV1RDKDB4ZmMwNmRhNjApLCBXVEMoMHhmYzRmNDBhNCksIFdUQygweGZjOTY1NTAwKSwKKyAgICBXVEMoMHhmY2RjMGU1YyksIFdUQygweGZkMjA2MmY0KSwgV1RDKDB4ZmQ2MzQ4ZDApLCBXVEMoMHhmZGE0YjFiOCksCisgICAgV1RDKDB4ZmRlNDhiMmMpLCBXVEMoMHhmZTIyYzI4MCksIFdUQygweGZlNWY0NjJhKSwgV1RDKDB4ZmU5YTFmMmUpLAorICAgIFdUQygweGZlZDM3MTFjKSwgV1RDKDB4ZmYwYjYwYWMpLCBXVEMoMHhmZjQyMTJkZCksIFdUQygweGZmNzdiMzQ0KSwKKyAgICBXVEMoMHhmZmFjNzQwNyksIFdUQygweGZmZTA4Nzk2KSwgV1RDKDB4MDAxNDFlMzcpLCBXVEMoMHgwMDQ3MzY2NSksCisgICAgV1RDKDB4MDA3OTljZDApLCBXVEMoMHgwMGFiMWJmZiksIFdUQygweDAwZGI3ZDhiKSwgV1RDKDB4MDEwYTc1ZWEpLAorICAgIFdUQygweDAxMzdhNDZlKSwgV1RDKDB4MDE2MmE3N2EpLCBXVEMoMHgwMThiMjBhYyksIFdUQygweDAxYjBmYjdhKSwKKyAgICBXVEMoMHgwMWQ0NmQzYyksIFdUQygweDAxZjVhZTdjKSwgV1RDKDB4MDIxNGY5MWMpLCBXVEMoMHgwMjMyYTVjYyksCisgICAgV1RDKDB4MDI0ZjJjMDQpLCBXVEMoMHgwMjZiMDQ4YyksIFdUQygweDAyODZhNjI4KSwgV1RDKDB4MDJhMjU4MDgpLAorICAgIFdUQygweDAyYmUzMWMwKSwgV1RDKDB4MDJkYTQ4ZTApLCBXVEMoMHgwMmY2YjA5YyksIFdUQygweDAzMTM0NWRjKSwKKyAgICBXVEMoMHgwMzJmYWY1MCksIFdUQygweDAzNGI5MTQ4KSwgV1RDKDB4MDM2NjkwZTgpLCBXVEMoMHgwMzgwNjU4YyksCisgICAgV1RDKDB4MDM5OGQ4ZTQpLCBXVEMoMHgwM2FmYjU2OCksIFdUQygweDAzYzRjNmUwKSwgV1RDKDB4MDNkN2Y3NzApLAorICAgIFdUQygweDAzZTk0ZjljKSwgV1RDKDB4MDNmOGQ5MzgpLCBXVEMoMHgwNDA2OWVlOCksIFdUQygweDA0MTJiZWY4KSwKKyAgICBXVEMoMHgwNDFkNmIzMCksIFdUQygweDA0MjZkNjM4KSwgV1RDKDB4MDQyZjMyODgpLCBXVEMoMHgwNDM2YWQ5OCksCisgICAgV1RDKDB4MDQzZDZmZDApLCBXVEMoMHgwNDQzYTE3MCksIFdUQygweDA0NDk2YTQwKSwgV1RDKDB4MDQ0ZWU3MjgpLAorICAgIFdUQygweDA0NTQyYTQwKSwgV1RDKDB4MDQ1OTQ1MjApLCBXVEMoMHgwNDVlNDg5MCksIFdUQygweDA0NjMzMjEwKSwKKyAgICBXVEMoMHgwNDY3ZWJlOCksIFdUQygweDA0NmM1ZjgwKSwgV1RDKDB4MDQ3MDc2MzApLCBXVEMoMHgwNDc0MTdmMCksCisgICAgV1RDKDB4MDQ3NzJiNTgpLCBXVEMoMHgwNDc5OTZlOCksIFdUQygweDA0N2I0MTQwKSwgV1RDKDB4MDQ3YzEyYTApLAorICAgIFdUQygweDA0N2JmNTIwKSwgV1RDKDB4MDQ3YWQyZTApLCBXVEMoMHgwNDc4OTY5MCksIFdUQygweDA0NzUzOWM4KSwKKyAgICBXVEMoMHgwNDcwYzRiOCksIFdUQygweDA0NmI0MDU4KSwgV1RDKDB4MDQ2NGI2MDApLCBXVEMoMHgwNDVkM2EwOCksCisgICAgV1RDKDB4MDQ1NGViYzgpLCBXVEMoMHgwNDRiZWIwMCksIFdUQygweDA0NDI1Nzk4KSwgV1RDKDB4MDQzODUzYjApLAorICAgIFdUQygweDA0MmUwMzk4KSwgV1RDKDB4MDQyMzhiZDgpLCBXVEMoMHgwNDE5MGY5OCksIFdUQygweDA0MGU5NjcwKSwKKyAgICBXVEMoMHgwNDA0MGMxOCksIFdUQygweDAzZjk1YjMwKSwgV1RDKDB4MDNlZTZlMjApLCBXVEMoMHgwM2UzMmI2NCksCisgICAgV1RDKDB4MDNkNzc1OTgpLCBXVEMoMHgwM2NiMmYyNCksIFdUQygweDAzYmUzYjE4KSwgV1RDKDB4MDNiMDhiMTgpLAorICAgIFdUQygweDAzYTIxZjY0KSwgV1RDKDB4MDM5MmY4ZDQpLCBXVEMoMHgwMzgzMThlMCksIFdUQygweDAzNzI4ZTk0KSwKKyAgICBXVEMoMHgwMzYxNzY5NCksIFdUQygweDAzNGZlZTE4KSwgV1RDKDB4MDMzZTExZjQpLCBXVEMoMHgwMzJiZjUzMCksCisgICAgV1RDKDB4MDMxOWExMTQpLCBXVEMoMHgwMzA3MWU4MCksIFdUQygweDAyZjQ3NWY0KSwgV1RDKDB4MDJlMWE3YzApLAorICAgIFdUQygweDAyY2VhYzA0KSwgV1RDKDB4MDJiYjdhODQpLCBXVEMoMHgwMmE4MGFmMCksIFdUQygweDAyOTQ1MmIwKSwKKyAgICBXVEMoMHgwMjgwNDRlMCksIFdUQygweDAyNmJkNDg4KSwgV1RDKDB4MDI1NmY1NTgpLCBXVEMoMHgwMjQxYTk0MCksCisgICAgV1RDKDB4MDIyYzAwODQpLCBXVEMoMHgwMjE2MGMwOCksIFdUQygweDAxZmZkYzVhKSwgV1RDKDB4MDFlOTdhZDIpLAorICAgIFdUQygweDAxZDJlOTgyKSwgV1RDKDB4MDFiYzJhMmEpLCBXVEMoMHgwMWE1M2U4YyksIFdUQygweDAxOGUyODYwKSwKKyAgICBXVEMoMHgwMTc2ZTk0YyksIFdUQygweDAxNWY4MmZhKSwgV1RDKDB4MDE0N2Y3MGUpLCBXVEMoMHgwMTMwNDZjMiksCisgICAgV1RDKDB4MDExODcyZTgpLCBXVEMoMHgwMTAwN2M0YSksIFdUQygweDAwZTg2M2NmKSwgV1RDKDB4MDBkMDJjODEpLAorICAgIFdUQygweDAwYjdkYjk0KSwgV1RDKDB4MDA5Zjc2NTEpLCBXVEMoMHgwMDg3MDIwNCksIFdUQygweDAwNmU4M2Y4KSwKKyAgICBXVEMoMHgwMDU2MDE3NiksIFdUQygweDAwM2Q3ZmNiKSwgV1RDKDB4MDAyNTA0M2YpLCBXVEMoMHgwMDBjOTQxZiksCisgICAgV1RDKDB4ZDY1NTc0YzApLCBXVEMoMHhkNWViYzEwMCksIFdUQygweGQ1ODJkMDgwKSwgV1RDKDB4ZDUxYTljYzApLAorICAgIFdUQygweGQ0YjMxZjgwKSwgV1RDKDB4ZDQ0YzUyODApLCBXVEMoMHhkM2U2MmY4MCksIFdUQygweGQzODBiMDQwKSwKKyAgICBXVEMoMHhkMzFiY2U0MCksIFdUQygweGQyYjc4MzgwKSwgV1RDKDB4ZDI1M2NhNDApLCBXVEMoMHhkMWYwYWNjMCksCisgICAgV1RDKDB4ZDE4ZTQ1ODApLCBXVEMoMHhkMTJjYWY0MCksIFdUQygweGQwY2MwNDAwKSwgV1RDKDB4ZDA2YzQwYzApLAorICAgIFdUQygweGQwMGQ0NzQwKSwgV1RDKDB4Y2ZhZWY2YzApLCBXVEMoMHhjZjUxMzE0MCksIFdUQygweGNlZjNmYTgwKSwKKyAgICBXVEMoMHhjZTk3N2E0MCksIFdUQygweGNlM2JkOTgwKSwgV1RDKDB4Y2RlMTNmNDApLCBXVEMoMHhjZDg3YTg4MCksCisgICAgV1RDKDB4Y2QyZWU4MDApLCBXVEMoMHhjY2Q2Y2YwMCksIFdUQygweGNjN2YyZjQwKSwgV1RDKDB4Y2MyN2U4ODApLAorICAgIFdUQygweGNiZDBlYTAwKSwgV1RDKDB4Y2I3YTIzODApLCBXVEMoMHhjYjIzODM4MCksIFdUQygweGNhY2NlZTgwKSwKKyAgICBXVEMoMHhjYTc2M2VjMCksIFdUQygweGNhMWY0ZDAwKSwgV1RDKDB4YzljN2Y0ODApLCBXVEMoMHhjOTcwM2I0MCksCisgICAgV1RDKDB4YzkxODUyMDApLCBXVEMoMHhjOGMwNmIwMCksIFdUQygweGM4NjhiNGMwKSwgV1RDKDB4YzgxMTAwYzApLAorICAgIFdUQygweGM3YjhjMjgwKSwgV1RDKDB4Yzc1ZjZhNDApLCBXVEMoMHhjNzA0NjkwMCksIFdUQygweGM2YTc0MzQwKSwKKyAgICBXVEMoMHhjNjQ3OTMwMCksIFdUQygweGM1ZTRmMjAwKSwgV1RDKDB4YzU3ZWZhYzApLCBXVEMoMHhjNTE1NDg4MCksCisgICAgV1RDKDB4YzRhNzc3ODApLCBXVEMoMHhjNDM1MjQ0MCksIFdUQygweGMzYmRlYWMwKSwgV1RDKDB4YzM0MTY3NDApLAorICAgIFdUQygweGMyYmYzM2MwKSwgV1RDKDB4YzIzNmViNDApLCBXVEMoMHhjMWE4MjkwMCksIFdUQygweGMxMTI5MGMwKSwKKyAgICBXVEMoMHhjMDc1Y2YwMCksIFdUQygweGJmZDE5MDgxKSwgV1RDKDB4YmYyNTg0MDEpLCBXVEMoMHhiZTcxNmQ4MSksCisgICAgV1RDKDB4YmRiNTJiODEpLCBXVEMoMHhiY2YwOWE4MSksIFdUQygweGJjMjNhZjgxKSwgV1RDKDB4YmI1MDVjMDEpLAorICAgIFdUQygweGJhN2E5MDgxKSwgV1RDKDB4YjlhNjUyODEpLCBXVEMoMHhiOGQ3OTMwMSksIFdUQygweGI4MTA0YzAxKSwKKyAgICBXVEMoMHhiNzUwODE4MSksIFdUQygweGI2OTgyMjAxKSwgV1RDKDB4YjVlNzFiMDEpLCBXVEMoMHhiNTNkNWIwMSksCisgICAgV1RDKDB4YjQ5YWQwODEpLCBXVEMoMHhiM2ZmNjkwMSksIFdUQygweGIzNmIxMzAxKSwgV1RDKDB4YjJkZGJkMDEpLAorICAgIFdUQygweGIyNTc1NDgxKSwgV1RDKDB4YjFkN2M4MDEpLCBXVEMoMHhiMTVmMDYwMSksIFdUQygweGIwZWNmYzAxKSwKKyAgICBXVEMoMHhiMDgxOTg4MSksIFdUQygweGIwMWNjYTAxKSwgV1RDKDB4YWZiZTdlMDEpLCBXVEMoMHhhZjY2YTMwMSksCisgICAgV1RDKDB4YWYxNTI3MDEpLCBXVEMoMHhhZWM5Zjg4MSksIFdUQygweGFlODUwNjAxKSwgV1RDKDB4YWU0NjNjODEpLAorICAgIFdUQygweGFlMGQ4YjAxKSwgV1RDKDB4YWRkYWUwMDEpLCBXVEMoMHhhZGFlMjg4MSksIFdUQygweGFkODc1MzgxKSwKKyAgICBXVEMoMHhhZDY2NGY4MSksIFdUQygweGFkNGIwOTgxKSwgV1RDKDB4YWQzNTcwODEpLCBXVEMoMHhhZDI1NzMwMSksCisgICAgV1RDKDB4YWQxYWZlMDEpLCBXVEMoMHhhZDE2MDA4MSksIFdUQygweGFkMTY2OTAxKSwgV1RDKDB4YWQxYzI0ODEpLAorICAgIFdUQygweGFkMjcyMjAxKSwgV1RDKDB4YWQzNzRmODEpLCBXVEMoMHhhZDRjOWIwMSksIFdUQygweGFkNjZmMzgxKSwKKyAgICBXVEMoMHhhZDg2NDYwMSksIFdUQygweGFkYWE4MTAxKSwgV1RDKDB4YWRkMzkzMDEpLCBXVEMoMHhhZTAxNmEwMSksCisgICAgV1RDKDB4YWUzM2Y0ODEpLCBXVEMoMHhhZTZiMjAwMSksIFdUQygweGFlYTZkYjAxKSwgV1RDKDB4YWVlNzEzODEpLAorICAgIFdUQygweGFmMmJiODAxKSwgV1RDKDB4YWY3NGI2ODEpLCBXVEMoMHhhZmMxZmQwMSksIFdUQygweGIwMTM3YTAxKSwKKyAgICBXVEMoMHhiMDY5MWI4MSksIFdUQygweGIwYzJjZjgxKSwgV1RDKDB4YjEyMDg0ODEpLCBXVEMoMHhiMTgyMjg4MSksCisgICAgV1RDKDB4YjFlN2E5ODEpLCBXVEMoMHhiMjUwZjYwMSksIFdUQygweGIyYmRmYzAxKSwgV1RDKDB4YjMyZWFhMDEpLAorICAgIFdUQygweGIzYTJlZDAxKSwgV1RDKDB4YjQxYWI0ODEpLCBXVEMoMHhiNDk1ZWUwMSksIFdUQygweGI1MTQ4ODAxKSwKKyAgICBXVEMoMHhiNTk2NzA4MSksIFdUQygweGI2MWI5NTgxKSwgV1RDKDB4YjZhM2U1ODEpLCBXVEMoMHhiNzJmNGUwMSksCisgICAgV1RDKDB4YjdiZGJlMDEpLCBXVEMoMHhiODRmMjM4MSksIFdUQygweGI4ZTM2YzgxKSwgV1RDKDB4Yjk3YTg3MDEpLAorICAgIFdUQygweGJhMTQ2MTAxKSwgV1RDKDB4YmFiMGU5ODEpLCBXVEMoMHhiYjUwMGQ4MSksIFdUQygweGJiZjFiYzgxKSwKKyAgICBXVEMoMHhiYzk1ZTM4MSksIFdUQygweGJkM2M3MTgxKSwgV1RDKDB4YmRlNTU0ODEpLCBXVEMoMHhiZTkwN2EwMSksCisgICAgV1RDKDB4YmYzZGQxMDEpLCBXVEMoMHhiZmVkNDcwMSksIFdUQygweGMwOWVjYWMwKSwgV1RDKDB4YzE1MjRhMDApLAorICAgIFdUQygweGMyMDdiMzAwKSwgV1RDKDB4YzJiZWY0NDApLCBXVEMoMHhjMzc3ZmI4MCksIFdUQygweGM0MzJiNzAwKSwKKyAgICBXVEMoMHhjNGVmMTUwMCksIFdUQygweGM1YWQwM2MwKSwgV1RDKDB4YzY2YzcxNDApLCBXVEMoMHhjNzJkNGJjMCksCisgICAgV1RDKDB4YzdlZjgxODApLCBXVEMoMHhjOGIzMDA4MCksIFdUQygweGM5NzdiNzAwKSwgV1RDKDB4Y2EzZDkzNDApLAorICAgIFdUQygweGNiMDQ4MzQwKSwgV1RDKDB4Y2JjYzc1NDApLCBXVEMoMHhjYzk1NTc0MCksIFdUQygweGNkNWYxN2MwKSwKKyAgICBXVEMoMHhjZTI5YTQ4MCksIFdUQygweGNlZjRlYzAwKSwgV1RDKDB4Y2ZjMGRjODApLCBXVEMoMHhkMDhkNjNjMCksCisgICAgV1RDKDB4ZDE1YTcwNDApLCBXVEMoMHhkMjI3ZjAwMCksIFdUQygweGQyZjVkMTQwKSwgV1RDKDB4ZDNjNDAyNDApLAorICAgIFdUQygweGQ0OTI3MTAwKSwgV1RDKDB4ZDU2MTBiODApLCBXVEMoMHhkNjJmYzA4MCksIFdUQygweGQ2ZmU3ZGMwKSwKKyAgICBXVEMoMHhkN2NkMzE0MCksIFdUQygweGQ4OWJjOTgwKSwgV1RDKDB4ZDk2YTM0YzApLCBXVEMoMHhkYTM4NjBjMCksCisgICAgV1RDKDB4ZGIwNjNjMDApLCBXVEMoMHhkYmQzYjQ4MCksIFdUQygweGRjYTBiODgwKSwgV1RDKDB4ZGQ2ZDM2NDApLAorICAgIFdUQygweGRlMzkxYmMwKSwgV1RDKDB4ZGYwNDU3NDApLCBXVEMoMHhkZmNlZDZjMCksIFdUQygweGUwOTg4OGMwKSwKKyAgICBXVEMoMHhlMTYxNWIyMCksIFdUQygweGUyMjkzYzIwKSwgV1RDKDB4ZTJmMDFhMDApLCBXVEMoMHhlM2I1ZTJjMCksCisgICAgV1RDKDB4ZTQ3YTg0YzApLCBXVEMoMHhlNTNkZWUwMCksIFdUQygweGU2MDAwY2MwKSwgV1RDKDB4ZTZjMGNmMjApLAorICAgIFdUQygweGU3ODAyMzYwKSwgV1RDKDB4ZTgzZGY3YTApLCBXVEMoMHhlOGZhMzllMCksIFdUQygweGU5YjRkODgwKSwKKyAgICBXVEMoMHhlYTZkYzFhMCksIFdUQygweGViMjRlMzYwKSwgV1RDKDB4ZWJkYTJiZTApLCBXVEMoMHhlYzhkODk2MCksCisgICAgV1RDKDB4ZWQzZWVhMjApLCBXVEMoMHhlZGVlM2MwMCksIFdUQygweGVlOWI2ZDgwKSwgV1RDKDB4ZWY0NjZjYTApLAorICAgIFdUQygweGVmZWYyNzgwKSwgV1RDKDB4ZjA5NThjNTApLCBXVEMoMHhmMTM5ODk1MCksIFdUQygweGYxZGIwY2EwKSwKKyAgICBXVEMoMHhmMjdhMDQ3MCksIFdUQygweGYzMTY1ZWQwKSwgV1RDKDB4ZjNiMDBhMTApLCBXVEMoMHhmNDQ2ZjQ0MCksCisgICAgV1RDKDB4ZjRkYjBiOTApLCBXVEMoMHhmNTZjM2UzMCksIFdUQygweGY1ZmE3YTUwKSwgV1RDKDB4ZjY4NWFlMTApLAorICAgIFdUQygweGY3MGRjN2EwKSwgV1RDKDB4Zjc5MmI1MjApLCBXVEMoMHhmODE0NjRjOCksIFdUQygweGY4OTJjNGMwKSwKKyAgICBXVEMoMHhmOTBkYzMzMCksIFdUQygweGY5ODU0ZTQwKSwgV1RDKDB4ZjlmOTU0MTgpLCBXVEMoMHhmYTY5YzJmMCksCisgICAgV1RDKDB4ZmFkNjg4ZTgpLCBXVEMoMHhmYjNmOTQyOCksIFdUQygweGZiYTRkMmU4KSwgV1RDKDB4ZmMwNjMzNDQpLAorICAgIFdUQygweGZjNjNhMzcwKSwgV1RDKDB4ZmNiZDExOTQpLCBXVEMoMHhmZDEyNmJkYyksIFdUQygweGZkNjNhMDZjKSwKKyAgICBXVEMoMHhmZGIwOWQ3OCksIFdUQygweGZkZjk1MTI0KSwgV1RDKDB4ZmUzZGE5OWUpLCBXVEMoMHhmZTdkOTUwZSksCisgICAgV1RDKDB4ZmViOTAxYTIpLCBXVEMoMHhmZWVmZGQ4MCksIFdUQygweGZmMjIxNmQ3KSwgV1RDKDB4ZmY0ZjliY2YpLAorICAgIFdUQygweGZmNzg1YTkzKSwgV1RDKDB4ZmY5YzQxNGUpLCBXVEMoMHhmZmJiM2UyYiksIFdUQygweGZmZDUzZjU0KSwKKyAgICBXVEMoMHhmZmVhMzJmNCksIFdUQygweGZmZmEwNzM1KSwgV1RDKDB4MDAwNGFhNDMpLCBXVEMoMHgwMDBhMGE0NyksCisgICAgV1RDKDB4MDAwYTE1NmMpLCBXVEMoMHgwMDA0YjlkZSksIFdUQygweGZmZjllNWM1KSwgV1RDKDB4ZmZlOTg3NGUpfTsKIAogY29uc3QgRklYUF9XVEIgTG93RGVsYXlTeW50aGVzaXM0ODBbMTQ0MF0gPSB7Ci0KLVdUQygweGRhZDJlNmMwKSwgV1RDKDB4ZGIxZGE5MDApLCBXVEMoMHhkYjY4Y2U0MCksIFdUQygweGRiYjQ1ODQwKSwgV1RDKDB4ZGMwMDQ5NDApLCBXVEMoMHhkYzRjYTI4MCksIFdUQygweGRjOTk2NTAwKSwgV1RDKDB4ZGNlNjkxNDApLAotV1RDKDB4ZGQzNDI3ODApLCBXVEMoMHhkZDgyMjcwMCksIFdUQygweGRkZDA4YTgwKSwgV1RDKDB4ZGUxZjRkMDApLCBXVEMoMHhkZTZlNmVjMCksIFdUQygweGRlYmRlYzQwKSwgV1RDKDB4ZGYwZGJhODApLCBXVEMoMHhkZjVkZDU0MCksCi1XVEMoMHhkZmFlM2NjMCksIFdUQygweGRmZmYwNTAwKSwgV1RDKDB4ZTA1MDUxNDApLCBXVEMoMHhlMGEyMjk4MCksIFdUQygweGUwZjQ4OGUwKSwgV1RDKDB4ZTE0NzYxODApLCBXVEMoMHhlMTlhYTQ4MCksIFdUQygweGUxZWU0ZDgwKSwKLVdUQygweGUyNDI1NDAwKSwgV1RDKDB4ZTI5Njg5YTApLCBXVEMoMHhlMmVhY2Q2MCksIFdUQygweGUzM2YyNDIwKSwgV1RDKDB4ZTM5M2EzMDApLCBXVEMoMHhlM2U4N2YyMCksIFdUQygweGU0M2RjZWUwKSwgV1RDKDB4ZTQ5MzhhODApLAotV1RDKDB4ZTRlOWIwYTApLCBXVEMoMHhlNTQwNDMwMCksIFdUQygweGU1OTczZTYwKSwgV1RDKDB4ZTVlZTliODApLCBXVEMoMHhlNjQ2NDllMCksIFdUQygweGU2OWUzN2UwKSwgV1RDKDB4ZTZmNjVlYzApLCBXVEMoMHhlNzRlYjZjMCksCi1XVEMoMHhlN2E3MzAwMCksIFdUQygweGU3ZmZiZTQwKSwgV1RDKDB4ZTg1ODVlZTApLCBXVEMoMHhlOGIxMDc0MCksIFdUQygweGU5MDk5YzQwKSwgV1RDKDB4ZTk2MjE0ZTApLCBXVEMoMHhlOWJhNzlhMCksIFdUQygweGVhMTJlN2MwKSwKLVdUQygweGVhNmI4OWMwKSwgV1RDKDB4ZWFjNDY1ODApLCBXVEMoMHhlYjFkNzI2MCksIFdUQygweGViNzZiNjIwKSwgV1RDKDB4ZWJkMDM2YzApLCBXVEMoMHhlYzI5ZTUyMCksIFdUQygweGVjODNhYTYwKSwgV1RDKDB4ZWNkZDVhMDApLAotV1RDKDB4ZWQzNmQ1MDApLCBXVEMoMHhlZDkwMTU0MCksIFdUQygweGVkZTkxMTYwKSwgV1RDKDB4ZWU0MWJjMjApLCBXVEMoMHhlZTlhMGVlMCksIFdUQygweGVlZjIwODYwKSwgV1RDKDB4ZWY0OWE3ZTApLCBXVEMoMHhlZmEwZWMwMCksCi1XVEMoMHhlZmY3ZDFjMCksIFdUQygweGYwNGU1NmIwKSwgV1RDKDB4ZjBhNDc2ZTApLCBXVEMoMHhmMGZhMmY2MCksIFdUQygweGYxNGY4MGUwKSwgV1RDKDB4ZjFhNDZlMTApLCBXVEMoMHhmMWY4ZmU4MCksIFdUQygweGYyNGQzNGEwKSwKLVdUQygweGYyYTEwYmIwKSwgV1RDKDB4ZjJmNDgyMTApLCBXVEMoMHhmMzQ3OWNjMCksIFdUQygweGYzOWE1YmUwKSwgV1RDKDB4ZjNlY2I4ZjApLCBXVEMoMHhmNDNlYWZhMCksIFdUQygweGY0OTAzYjUwKSwgV1RDKDB4ZjRlMTRlODApLAotV1RDKDB4ZjUzMWQ2YTApLCBXVEMoMHhmNTgxYmMxMCksIFdUQygweGY1ZDBlOWMwKSwgV1RDKDB4ZjYxZjUyNTApLCBXVEMoMHhmNjZjZTZlMCksIFdUQygweGY2Yjk5MzMwKSwgV1RDKDB4ZjcwNTRlYjApLCBXVEMoMHhmNzUwMWYyMCksCi1XVEMoMHhmNzlhMDc1MCksIFdUQygweGY3ZTMwNzAwKSwgV1RDKDB4ZjgyYjJmYzApLCBXVEMoMHhmODcyYTEzOCksIFdUQygweGY4Yjk3ZjE4KSwgV1RDKDB4ZjhmZmU2NjgpLCBXVEMoMHhmOTQ1ZTUzOCksIFdUQygweGY5OGI4ODYwKSwKLVdUQygweGY5ZDBmMzgwKSwgV1RDKDB4ZmExNjUxNDgpLCBXVEMoMHhmYTViYjhhOCksIFdUQygweGZhYTEzZGY4KSwgV1RDKDB4ZmFlNmZiMDApLCBXVEMoMHhmYjJjZjhjOCksIFdUQygweGZiNzMyYTgwKSwgV1RDKDB4ZmJiOTc5MTApLAotV1RDKDB4ZmJmZmNkMTApLCBXVEMoMHhmYzQ2MzQ3OCksIFdUQygweGZjOGNkM2ZjKSwgV1RDKDB4ZmNkM2JlNWMpLCBXVEMoMHhmZDFhZmE5MCksIFdUQygweGZkNjJhYTg0KSwgV1RDKDB4ZmRhYjAyODgpLCBXVEMoMHhmZGY0MDRiNCksCi1XVEMoMHhmZTNkMzAwNiksIFdUQygweGZlODViMjBlKSwgV1RDKDB4ZmVjY2E0Y2MpLCBXVEMoMHhmZjEwZDU1OSksIFdUQygweGZmNTA1NzliKSwgV1RDKDB4ZmY4YTQwZDIpLCBXVEMoMHhmZmI3ZDg2ZSksIFdUQygweGZmZWY2YmJiKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweGJmZjY3YTAxKSwgV1RDKDB4YmZlY2FhODEpLCBXVEMoMHhiZmUyZDkwMSksIFdUQygweGJmZDkwNjAxKSwgV1RDKDB4YmZjZjMxODEpLCBXVEMoMHhiZmM1NWM4MSksIFdUQygweGJmYmI4NzAxKSwgV1RDKDB4YmZiMWIxMDEpLAotV1RDKDB4YmZhN2RjMDEpLCBXVEMoMHhiZjllMDcwMSksIFdUQygweGJmOTQzMzAxKSwgV1RDKDB4YmY4YTVmODEpLCBXVEMoMHhiZjgwOGI4MSksIFdUQygweGJmNzZiNzAxKSwgV1RDKDB4YmY2Y2UyMDEpLCBXVEMoMHhiZjYzMGQ4MSksCi1XVEMoMHhiZjU5M2EwMSksIFdUQygweGJmNGY2ODAxKSwgV1RDKDB4YmY0NTk2ODEpLCBXVEMoMHhiZjNiYzYwMSksIFdUQygweGJmMzFmNTAxKSwgV1RDKDB4YmYyODI1MDEpLCBXVEMoMHhiZjFlNTUwMSksIFdUQygweGJmMTQ4NjgxKSwKLVdUQygweGJmMGFiYTAxKSwgV1RDKDB4YmYwMGVmODEpLCBXVEMoMHhiZWY3MjY4MSksIFdUQygweGJlZWQ1ZjAxKSwgV1RDKDB4YmVlMzk4MDEpLCBXVEMoMHhiZWQ5ZDI4MSksIFdUQygweGJlZDAwZjgxKSwgV1RDKDB4YmVjNjRlODEpLAotV1RDKDB4YmViYzkxODEpLCBXVEMoMHhiZWIyZDY4MSksIFdUQygweGJlYTkxZjAxKSwgV1RDKDB4YmU5ZjY5MDEpLCBXVEMoMHhiZTk1YjU4MSksIFdUQygweGJlOGMwNTAxKSwgV1RDKDB4YmU4MjU4MDEpLCBXVEMoMHhiZTc4YjAwMSksCi1XVEMoMHhiZTZmMGMwMSksIFdUQygweGJlNjU2YzAxKSwgV1RDKDB4YmU1YmQwMDEpLCBXVEMoMHhiZTUyMzc4MSksIFdUQygweGJlNDhhMzAxKSwgV1RDKDB4YmUzZjEzODEpLCBXVEMoMHhiZTM1ODkwMSksIFdUQygweGJlMmMwNTAxKSwKLVdUQygweGJlMjI4NjgxKSwgV1RDKDB4YmUxOTBkODEpLCBXVEMoMHhiZTBmOWEwMSksIFdUQygweGJlMDYyYjgxKSwgV1RDKDB4YmRmY2MzMDEpLCBXVEMoMHhiZGYzNjEwMSksIFdUQygweGJkZWEwNjgxKSwgV1RDKDB4YmRlMGIzMDEpLAotV1RDKDB4YmRkNzY3MDEpLCBXVEMoMHhiZGNlMjE4MSksIFdUQygweGJkYzRlMzAxKSwgV1RDKDB4YmRiYmFiMDEpLCBXVEMoMHhiZGIyN2IwMSksIFdUQygweGJkYTk1MzAxKSwgV1RDKDB4YmRhMDMzODEpLCBXVEMoMHhiZDk3MWM4MSksCi1XVEMoMHhiZDhlMGUwMSksIFdUQygweGJkODUwNzAxKSwgV1RDKDB4YmQ3YzA3ODEpLCBXVEMoMHhiZDczMTA4MSksIFdUQygweGJkNmEyMjAxKSwgV1RDKDB4YmQ2MTNkODEpLCBXVEMoMHhiZDU4NjI4MSksIFdUQygweGJkNGY5MTAxKSwKLVdUQygweGJkNDZjODAxKSwgV1RDKDB4YmQzZTA4MDEpLCBXVEMoMHhiZDM1NTA4MSksIFdUQygweGJkMmNhMjgxKSwgV1RDKDB4YmQyM2ZmMDEpLCBXVEMoMHhiZDFiNjUwMSksIFdUQygweGJkMTJkNTgxKSwgV1RDKDB4YmQwYTRmODEpLAotV1RDKDB4YmQwMWQyODEpLCBXVEMoMHhiY2Y5NWU4MSksIFdUQygweGJjZjBmMzgxKSwgV1RDKDB4YmNlODkyODEpLCBXVEMoMHhiY2UwM2I4MSksIFdUQygweGJjZDdlZjAxKSwgV1RDKDB4YmNjZmFjMDEpLCBXVEMoMHhiY2M3NzE4MSksCi1XVEMoMHhiY2JmNDAwMSksIFdUQygweGJjYjcxNzAxKSwgV1RDKDB4YmNhZWY3MDEpLCBXVEMoMHhiY2E2ZTEwMSksIFdUQygweGJjOWVkNDgxKSwgV1RDKDB4YmM5NmQxMDEpLCBXVEMoMHhiYzhlZDcwMSksIFdUQygweGJjODZlNTgxKSwKLVdUQygweGJjN2VmYzgxKSwgV1RDKDB4YmM3NzFjMDEpLCBXVEMoMHhiYzZmNDQwMSksIFdUQygweGJjNjc3NTAxKSwgV1RDKDB4YmM1ZmFlODEpLCBXVEMoMHhiYzU3ZjEwMSksIFdUQygweGJjNTAzYjgxKSwgV1RDKDB4YmM0ODhlODEpLAotV1RDKDB4YmM0MGU4ODEpLCBXVEMoMHhiYzM5NDkwMSksIFdUQygweGJjMzFhZjAxKSwgV1RDKDB4YmMyYTFhODEpLCBXVEMoMHhiYzIyOGYwMSksIFdUQygweGJjMWIxMDgxKSwgV1RDKDB4YmMxM2E0ODEpLCBXVEMoMHhiYzBjNDU4MSksCi1XVEMoMHhiYzA0ZTM4MSksIFdUQygweGJiZmQ2YzAxKSwgV1RDKDB4YmJmNWQxODEpLCBXVEMoMHhiYmVlMmY4MSksIFdUQygweGJiZTZjODAxKSwgV1RDKDB4YmJkZmRiODEpLCBXVEMoMHhiYmQ5YTc4MSksIFdUQygweGJiZDQ1ODgxKSwKLVdUQygweGJiZDAxMzAxKSwgV1RDKDB4YmJjY2ZjODEpLCBXVEMoMHhiYmNiMjI4MSksIFdUQygweGJiY2E1ZDAxKSwgV1RDKDB4YmJjYTc0ODEpLCBXVEMoMHhiYmNiMzIwMSksIFdUQygweGJiY2M2YjAxKSwgV1RDKDB4YmJjZTA2MDEpLAotV1RDKDB4YmJjZmVhODEpLCBXVEMoMHhiYmQyMDMwMSksIFdUQygweGJiZDQ1NjAxKSwgV1RDKDB4YmJkNzAyMDEpLCBXVEMoMHhiYmRhMjUwMSksIFdUQygweGJiZGRkYjAxKSwgV1RDKDB4YmJlMjMyODEpLCBXVEMoMHhiYmU3MzIwMSksCi1XVEMoMHhiYmVjZTI4MSksIFdUQygweGJiZjM0MjgxKSwgV1RDKDB4YmJmYTNjMDEpLCBXVEMoMHhiYzAxYjM4MSksIFdUQygweGJjMDk4ZDgxKSwgV1RDKDB4YmMxMWI2ODEpLCBXVEMoMHhiYzFhMjQwMSksIFdUQygweGJjMjJjZDgxKSwKLVdUQygweGJjMmJhYjAxKSwgV1RDKDB4YmMzNGMwODEpLCBXVEMoMHhiYzNlMTk4MSksIFdUQygweGJjNDdjMjgxKSwgV1RDKDB4YmM1MWNiMDEpLCBXVEMoMHhiYzVjNGM4MSksIFdUQygweGJjNjc2NTAxKSwgV1RDKDB4YmM3MzM0MDEpLAotV1RDKDB4YmM3ZmQzMDEpLCBXVEMoMHhiYzhkNTEwMSksIFdUQygweGJjOWJiOTAxKSwgV1RDKDB4YmNhYjE3ODEpLCBXVEMoMHhiY2JiNzAwMSksIFdUQygweGJjY2NiZDAxKSwgV1RDKDB4YmNkZWY3MDEpLCBXVEMoMHhiY2YyMTYwMSksCi1XVEMoMHhiZDA2MGM4MSksIFdUQygweGJkMWFjODAxKSwgV1RDKDB4YmQzMDM1ODEpLCBXVEMoMHhiZDQ2NDI4MSksIFdUQygweGJkNWNlMjgxKSwgV1RDKDB4YmQ3NDBiODEpLCBXVEMoMHhiZDhiYjI4MSksIFdUQygweGJkYTNkMDgxKSwKLVdUQygweGJkYmM2MzgxKSwgV1RDKDB4YmRkNTZiODEpLCBXVEMoMHhiZGVlZTk4MSksIFdUQygweGJlMDhlMTgxKSwgV1RDKDB4YmUyMzYwMDEpLCBXVEMoMHhiZTNlNzIwMSksIFdUQygweGJlNWEyMzAxKSwgV1RDKDB4YmU3NjdlODEpLAotV1RDKDB4YmU5MzhjODEpLCBXVEMoMHhiZWIxNTcwMSksIFdUQygweGJlY2ZlNjAxKSwgV1RDKDB4YmVlZjQ2MDEpLCBXVEMoMHhiZjBmODMwMSksIFdUQygweGJmMzBhOTAxKSwgV1RDKDB4YmY1MmMxMDEpLCBXVEMoMHhiZjc1Y2M4MSksCi1XVEMoMHhiZjk5Y2IwMSksIFdUQygweGJmYmViYjgxKSwgV1RDKDB4YmZlNDg5ODEpLCBXVEMoMHhjMDBiMDRjMCksIFdUQygweGMwMzFmODgwKSwgV1RDKDB4YzA1OTMzNDApLCBXVEMoMHhjMDgwOTI4MCksIFdUQygweGMwYTgwMmMwKSwKLVdUQygweGMwY2Y2ZWMwKSwgV1RDKDB4YzBmNmNjMDApLCBXVEMoMHhjMTFlM2E4MCksIFdUQygweGMxNDVmMDQwKSwgV1RDKDB4YzE2ZTIyYzApLCBXVEMoMHhjMTk2ZmIwMCksIFdUQygweGMxYzA4NjgwKSwgV1RDKDB4YzFlYWNhMDApLAotV1RDKDB4YzIxNWNiYzApLCBXVEMoMHhjMjQxODk0MCksIFdUQygweGMyNmRmNWMwKSwgV1RDKDB4YzI5YjAyYzApLCBXVEMoMHhjMmM4YTE0MCksIFdUQygweGMyZjZiNTAwKSwgV1RDKDB4YzMyNTE3NDApLCBXVEMoMHhjMzUzYTBjMCksCi1XVEMoMHhjMzgyMmMwMCksIFdUQygweGMzYjA5OTQwKSwgV1RDKDB4YzNkZWNjYzApLCBXVEMoMHhjNDBjYTgwMCksIFdUQygweGM0M2EyOGMwKSwgV1RDKDB4YzQ2NzhhMDApLCBXVEMoMHhjNDk1MTc4MCksIFdUQygweGM0YzMxZDAwKSwKLVdUQygweGM0ZjFiZGMwKSwgV1RDKDB4YzUyMGU4NDApLCBXVEMoMHhjNTUwODQ0MCksIFdUQygweGM1ODA3OTAwKSwgV1RDKDB4YzViMDllODApLCBXVEMoMHhjNWUwYmZjMCksIFdUQygweGM2MTBhNzQwKSwgV1RDKDB4YzY0MDI5YzApLAotV1RDKDB4YzY2ZjQ5YzApLCBXVEMoMHhjNjllMjE4MCksIFdUQygweGM2Y2NjYTQwKSwgV1RDKDB4YzZmYjU3MDApLCBXVEMoMHhjNzI5Y2M4MCksIFdUQygweGM3NTgyYjQwKSwgV1RDKDB4Yzc4Njc0ODApLCBXVEMoMHhjN2I0YTQ4MCksCi1XVEMoMHhjN2UyYWZjMCksIFdUQygweGM4MTA4YTgwKSwgV1RDKDB4YzgzZTI4YzApLCBXVEMoMHhjODZiN2YwMCksIFdUQygweGM4OTg4MTAwKSwgV1RDKDB4YzhjNTIzNDApLCBXVEMoMHhjOGYxNTk4MCksIFdUQygweGM5MWQxODQwKSwKLVdUQygweGI0ZDZhMzgxKSwgV1RDKDB4YjQ0MjJiODEpLCBXVEMoMHhiM2FlODYwMSksIFdUQygweGIzMWJiMzAxKSwgV1RDKDB4YjI4OWIxODEpLCBXVEMoMHhiMWY4ODE4MSksIFdUQygweGIxNjgyMjgxKSwgV1RDKDB4YjBkODk0MDEpLAotV1RDKDB4YjA0OWQ2MDEpLCBXVEMoMHhhZmJiZTgwMSksIFdUQygweGFmMmVjOTAxKSwgV1RDKDB4YWVhMjc2ODEpLCBXVEMoMHhhZTE2ZjAwMSksIFdUQygweGFkOGMzMzAxKSwgV1RDKDB4YWQwMjNmMDEpLCBXVEMoMHhhYzc5MTQwMSksCi1XVEMoMHhhYmYwYjE4MSksIFdUQygweGFiNjkxNjgxKSwgV1RDKDB4YWFlMjQzMDEpLCBXVEMoMHhhYTVjMzYwMSksIFdUQygweGE5ZDZlZjAxKSwgV1RDKDB4YTk1MjZkODEpLCBXVEMoMHhhOGNlYjIwMSksIFdUQygweGE4NGJiYjgxKSwKLVdUQygweGE3Yzk4YjAxKSwgV1RDKDB4YTc0ODIxMDEpLCBXVEMoMHhhNmM3N2UwMSksIFdUQygweGE2NDdhMzAxKSwgV1RDKDB4YTVjODkwMDEpLCBXVEMoMHhhNTRhNDcwMSksIFdUQygweGE0Y2NjOTAxKSwgV1RDKDB4YTQ1MDE2MDEpLAotV1RDKDB4YTNkNDMwMDEpLCBXVEMoMHhhMzU5MTgwMSksIFdUQygweGEyZGVjZTgxKSwgV1RDKDB4YTI2NTU1ODEpLCBXVEMoMHhhMWVjYWUwMSksIFdUQygweGExNzRkYTgxKSwgV1RDKDB4YTBmZGRkODEpLCBXVEMoMHhhMDg3Yjk4MSksCi1XVEMoMHhhMDEyNzA4MSksIFdUQygweDlmOWUwMzAxKSwgV1RDKDB4OWYyYTcyODEpLCBXVEMoMHg5ZWI3YzEwMSksIFdUQygweDllNDVmMDgxKSwgV1RDKDB4OWRkNTA0ODEpLCBXVEMoMHg5ZDY1MDA4MSksIFdUQygweDljZjVlNzAxKSwKLVdUQygweDljODdiYTgxKSwgV1RDKDB4OWMxYTdjODEpLCBXVEMoMHg5YmFlMmY4MSksIFdUQygweDliNDJkNTgxKSwgV1RDKDB4OWFkODcwODEpLCBXVEMoMHg5YTZmMDM4MSksIFdUQygweDlhMDY5MDAxKSwgV1RDKDB4OTk5ZjE5ODEpLAotV1RDKDB4OTkzOGEyODEpLCBXVEMoMHg5OGQzMmQ4MSksIFdUQygweDk4NmViZDgxKSwgV1RDKDB4OTgwYjU1MDEpLCBXVEMoMHg5N2E4ZjY4MSksIFdUQygweDk3NDdhNDgxKSwgV1RDKDB4OTZlNzYxMDEpLCBXVEMoMHg5Njg4MmUwMSksCi1XVEMoMHg5NjJhMGM4MSksIFdUQygweDk1Y2NmZjAxKSwgV1RDKDB4OTU3MTA2MDEpLCBXVEMoMHg5NTE2MjM4MSksIFdUQygweDk0YmM1OTgxKSwgV1RDKDB4OTQ2M2E4ODEpLCBXVEMoMHg5NDBjMTI4MSksIFdUQygweDkzYjU5OTAxKSwKLVdUQygweDkzNjAzZDAxKSwgV1RDKDB4OTMwYmZmODEpLCBXVEMoMHg5MmI4ZTEwMSksIFdUQygweDkyNjZlMjgxKSwgV1RDKDB4OTIxNjAzMDEpLCBXVEMoMHg5MWM2NDMwMSksIFdUQygweDkxNzdhMzAxKSwgV1RDKDB4OTEyYTIyMDEpLAotV1RDKDB4OTBkZGMwMDEpLCBXVEMoMHg5MDkyN2I4MSksIFdUQygweDkwNDg1NDAxKSwgV1RDKDB4OGZmZjQ2MDEpLCBXVEMoMHg4ZmI3NGY4MSksIFdUQygweDhmNzA2ZjAxKSwgV1RDKDB4OGYyYWExMDEpLCBXVEMoMHg4ZWU1ZTMwMSksCi1XVEMoMHg4ZWEyMzIwMSksIFdUQygweDhlNWY4ODgxKSwgV1RDKDB4OGUxZGUwMDEpLCBXVEMoMHg4ZGRkMzIwMSksIFdUQygweDhkOWQ3NzgxKSwgV1RDKDB4OGQ1ZWFhMDEpLCBXVEMoMHg4ZDIwYzMwMSksIFdUQygweDhjZTNiYTgxKSwKLVdUQygweDhjYTc4NzgxKSwgV1RDKDB4OGM2YzFiMDEpLCBXVEMoMHg4YzMxNjY4MSksIFdUQygweDhiZjc1YjAxKSwgV1RDKDB4OGJiZGU5ODEpLCBXVEMoMHg4Yjg1MDI4MSksIFdUQygweDhiNGM5NzAxKSwgV1RDKDB4OGIxNDk3MDEpLAotV1RDKDB4OGFkY2VlMDEpLCBXVEMoMHg4YWE1ODY4MSksIFdUQygweDhhNmU0YTAxKSwgV1RDKDB4OGEzNzI4ODEpLCBXVEMoMHg4YTAwMWYwMSksIFdUQygweDg5YzkyZjgxKSwgV1RDKDB4ODk5MjVhODEpLCBXVEMoMHg4OTViY2QwMSksCi1XVEMoMHg4OTI1ZjEwMSksIFdUQygweDg4ZjEzODAxKSwgV1RDKDB4ODhiZTE2ODEpLCBXVEMoMHg4ODhkMzE4MSksIFdUQygweDg4NWY4NDgxKSwgV1RDKDB4ODgzNTM1MDEpLCBXVEMoMHg4ODEyNDI4MSksIFdUQygweDg3ZTczZDgxKSwKLVdUQygweDg3ZDRhYzgxKSwgV1RDKDB4ODdjYjUxMDEpLCBXVEMoMHg4N2MwNWU4MSksIFdUQygweDg3YjQyNDgxKSwgV1RDKDB4ODdhNzBlODEpLCBXVEMoMHg4Nzk5OGYwMSksIFdUQygweDg3OGMxODgxKSwgV1RDKDB4ODc3ZWRlMDEpLAotV1RDKDB4ODc3MWM2MDEpLCBXVEMoMHg4NzY0YjEwMSksIFdUQygweDg3NTc4MTgxKSwgV1RDKDB4ODc0YTJmMDEpLCBXVEMoMHg4NzNjYzIwMSksIFdUQygweDg3MmY0MjAxKSwgV1RDKDB4ODcyMWI0ODEpLCBXVEMoMHg4NzE0MWIwMSksCi1XVEMoMHg4NzA2NzI4MSksIFdUQygweDg2ZjhiYTgxKSwgV1RDKDB4ODZlYWYwODEpLCBXVEMoMHg4NmRkMTQ4MSksIFdUQygweDg2Y2YyNjAxKSwgV1RDKDB4ODZjMTI0MDEpLCBXVEMoMHg4NmIzMGYwMSksIFdUQygweDg2YTRlNzgxKSwKLVdUQygweDg2OTZhZDAxKSwgV1RDKDB4ODY4ODYwMDEpLCBXVEMoMHg4NjdhMDA4MSksIFdUQygweDg2NmI4ZDgxKSwgV1RDKDB4ODY1ZDA1ODEpLCBXVEMoMHg4NjRlNjkwMSksIFdUQygweDg2M2ZiNzAxKSwgV1RDKDB4ODYzMGYxODEpLAotV1RDKDB4ODYyMjE4MDEpLCBXVEMoMHg4NjEzMmMwMSksIFdUQygweDg2MDQyYzAxKSwgV1RDKDB4ODVmNTE2ODEpLCBXVEMoMHg4NWU1ZWI4MSksIFdUQygweDg1ZDZhOTgxKSwgV1RDKDB4ODVjNzUyMDEpLCBXVEMoMHg4NWI3ZTYwMSksCi1XVEMoMHg4NWE4NjU4MSksIFdUQygweDg1OThkMDgxKSwgV1RDKDB4ODU4OTI2ODEpLCBXVEMoMHg4NTc5NjYwMSksIFdUQygweDg1Njk4ZTgxKSwgV1RDKDB4ODU1OWEwODEpLCBXVEMoMHg4NTQ5OWQwMSksIFdUQygweDg1Mzk4NDgxKSwKLVdUQygweDg1Mjk1ODgxKSwgV1RDKDB4ODUxOTE4MDEpLCBXVEMoMHg4NTA4YzE4MSksIFdUQygweDg0Zjg1NTgxKSwgV1RDKDB4ODRlN2QzODEpLCBXVEMoMHg4NGQ3M2MwMSksIFdUQygweDg0YzY5MTAxKSwgV1RDKDB4ODRiNWQzMDEpLAotV1RDKDB4ODRhNTAyMDEpLCBXVEMoMHg4NDk0MWQ4MSksIFdUQygweDg0ODMyNDgxKSwgV1RDKDB4ODQ3MjE3MDEpLCBXVEMoMHg4NDYwZjU4MSksIFdUQygweDg0NGZjMDgxKSwgV1RDKDB4ODQzZTdhODEpLCBXVEMoMHg4NDJkMjI4MSksCi1XVEMoMHg4NDFiYjk4MSksIFdUQygweDg0MGEzZTgxKSwgV1RDKDB4ODNmOGIwMDEpLCBXVEMoMHg4M2U3MGYwMSksIFdUQygweDgzZDU1ZDAxKSwgV1RDKDB4ODNjMzlhODEpLCBXVEMoMHg4M2IxYzg4MSksIFdUQygweDgzOWZlODAxKSwKLVdUQygweDgzOGRmODAxKSwgV1RDKDB4ODM3YmY4MDEpLCBXVEMoMHg4MzY5ZTc4MSksIFdUQygweDgzNTdjNzAxKSwgV1RDKDB4ODM0NTk4ODEpLCBXVEMoMHg4MzMzNWM4MSksIFdUQygweDgzMjExNTAxKSwgV1RDKDB4ODMwZWMwODEpLAotV1RDKDB4ODJmYzVmMDEpLCBXVEMoMHg4MmU5ZWYwMSksIFdUQygweDgyZDc3MjAxKSwgV1RDKDB4ODJjNGU4MDEpLCBXVEMoMHg4MmIyNTMwMSksIFdUQygweDgyOWZiNDAxKSwgV1RDKDB4ODI4ZDBiMDEpLCBXVEMoMHg4MjdhNTgwMSksCi1XVEMoMHg4MjY3OTkwMSksIFdUQygweDgyNTRjZjAxKSwgV1RDKDB4ODI0MWZhMDEpLCBXVEMoMHg4MjJmMWIwMSksIFdUQygweDgyMWMzNDAxKSwgV1RDKDB4ODIwOTQ1ODEpLCBXVEMoMHg4MWY2NGYwMSksIFdUQygweDgxZTM0ZjgxKSwKLVdUQygweDgxZDA0NjgxKSwgV1RDKDB4ODFiZDM0MDEpLCBXVEMoMHg4MWFhMTk4MSksIFdUQygweDgxOTZmNzgxKSwgV1RDKDB4ODE4M2NmODEpLCBXVEMoMHg4MTcwYTE4MSksIFdUQygweDgxNWQ2YzAxKSwgV1RDKDB4ODE0YTJmODEpLAotV1RDKDB4ODEzNmVhMDEpLCBXVEMoMHg4MTIzOWQ4MSksIFdUQygweDgxMTA0YTAxKSwgV1RDKDB4ODBmY2YxODEpLCBXVEMoMHg4MGU5OTQwMSksIFdUQygweDgwZDYzMTAxKSwgV1RDKDB4ODBjMmM3ODEpLCBXVEMoMHg4MGFmNTcwMSksCi1XVEMoMHg4MDliZGYwMSksIFdUQygweDgwODg2MDgxKSwgV1RDKDB4ODA3NGRjMDEpLCBXVEMoMHg4MDYxNTI4MSksIFdUQygweDgwNGRjNDgxKSwgV1RDKDB4ODAzYTMzODEpLCBXVEMoMHg4MDI2OWY4MSksIFdUQygweDgwMTMwOTgxKSwKLVdUQygweDBhNjA4MjIwKSwgV1RDKDB4MGE4ZWU3ZDApLCBXVEMoMHgwYWJlMzVjMCksIFdUQygweDBhZWU1ZGUwKSwgV1RDKDB4MGIxZjUyMzApLCBXVEMoMHgwYjUxMDRhMCksIFdUQygweDBiODM2NzIwKSwgV1RDKDB4MGJiNjZiYjApLAotV1RDKDB4MGJlYTA0NDApLCBXVEMoMHgwYzFlMjJjMCksIFdUQygweDBjNTJiYTcwKSwgV1RDKDB4MGM4N2NhOTApLCBXVEMoMHgwY2JkNWJhMCksIFdUQygweDBjZjM3NWUwKSwgV1RDKDB4MGQyYTFmNTApLCBXVEMoMHgwZDYxNTQ4MCksCi1XVEMoMHgwZDk5MGU0MCksIFdUQygweDBkZDE0NTAwKSwgV1RDKDB4MGUwOWY3MzApLCBXVEMoMHgwZTQzMmU5MCksIFdUQygweDBlN2NmNzkwKSwgV1RDKDB4MGViNzVlNTApLCBXVEMoMHgwZWYyNjQzMCksIFdUQygweDBmMmRmZDcwKSwKLVdUQygweDBmNmExZDcwKSwgV1RDKDB4MGZhNmI3ZTApLCBXVEMoMHgwZmUzYzNkMCksIFdUQygweDEwMjEzYWMwKSwgV1RDKDB4MTA1ZjE2NDApLCBXVEMoMHgxMDlkNGYyMCksIFdUQygweDEwZGJkYjgwKSwgV1RDKDB4MTExYWIwYzApLAotV1RDKDB4MTE1OWMzNjApLCBXVEMoMHgxMTk5MGZjMCksIFdUQygweDExZDhhMDYwKSwgV1RDKDB4MTIxODgyYzApLCBXVEMoMHgxMjU4YzQ4MCksIFdUQygweDEyOTk1YTQwKSwgV1RDKDB4MTJkYTFiMDApLCBXVEMoMHgxMzFhZGI2MCksCi1XVEMoMHgxMzViNzBjMCksIFdUQygweDEzOWJiNjgwKSwgV1RDKDB4MTNkYjhjMDApLCBXVEMoMHgxNDFhZDA4MCksIFdUQygweDE0NTk2NDYwKSwgV1RDKDB4MTQ5NzI5ZTApLCBXVEMoMHgxNGQ0MDRlMCksIFdUQygweDE1MGZkOGUwKSwKLVdUQygweDE1NGE4OGMwKSwgV1RDKDB4MTU4M2Y1ZTApLCBXVEMoMHgxNWJjMDEyMCksIFdUQygweDE1ZjI4YmEwKSwgV1RDKDB4MTYyNzc5YTApLCBXVEMoMHgxNjVhYjMwMCksIFdUQygweDE2OGMyMDQwKSwgV1RDKDB4MTZiYmFhODApLAotV1RDKDB4MTZlOTQxMjApLCBXVEMoMHgxNzE0ZDllMCksIFdUQygweDE3M2U2NDQwKSwgV1RDKDB4MTc2NjA2ODApLCBXVEMoMHgxNzhjYTAyMCksIFdUQygweDE3YjM2NDAwKSwgV1RDKDB4MTdkYjg0ZTApLCBXVEMoMHgxODA1ZDkyMCksCi1XVEMoMHgxODMyODQwMCksIFdUQygweDE4NjE3Y2MwKSwgV1RDKDB4MTg5MmJmYTApLCBXVEMoMHgxOGM2NDU0MCksIFdUQygweDE4ZmMwNDAwKSwgV1RDKDB4MTkzM2YxNDApLCBXVEMoMHgxOTZlMDMyMCksIFdUQygweDE5YWEyZmMwKSwKLVdUQygweDE5ZTg2ZDgwKSwgV1RDKDB4MWEyOGIyZTApLCBXVEMoMHgxYTZhZjcwMCksIFdUQygweDFhYWYzMzIwKSwgV1RDKDB4MWFmNTYxODApLCBXVEMoMHgxYjNkN2NlMCksIFdUQygweDFiODc3YzQwKSwgV1RDKDB4MWJkMzUwYzApLAotV1RDKDB4MWMyMGVhNDApLCBXVEMoMHgxYzcwMzg0MCksIFdUQygweDFjYzEzODYwKSwgV1RDKDB4MWQxM2Y3NjApLCBXVEMoMHgxZDY4ODQyMCksIFdUQygweDFkYmVlZDQwKSwgV1RDKDB4MWUxNzQ2NjApLCBXVEMoMHgxZTcxYTY0MCksCi1XVEMoMHgxZWNlMjQwMCksIFdUQygweDFmMmNkMjIwKSwgV1RDKDB4MWY4ZGIzYzApLCBXVEMoMHgxZmYwYzNlMCksIFdUQygweDIwNTYwMDgwKSwgV1RDKDB4MjBiZDQ2YzApLCBXVEMoMHgyMTI2MzQwMCksIFdUQygweDIxOTA1NzQwKSwKLVdUQygweDIxZmI0MTAwKSwgV1RDKDB4MjI2NmJhODApLCBXVEMoMHgyMmQyZDE0MCksIFdUQygweDIzM2Y5NzgwKSwgV1RDKDB4MjNhZDI1YzApLCBXVEMoMHgyNDFiYzgwMCksIFdUQygweDI0OGJmMDQwKSwgV1RDKDB4MjRmZTEzODApLAotV1RDKDB4MjU3MjgxODApLCBXVEMoMHgyNWU5MGEwMCksIFdUQygweDI2NjE0MDgwKSwgV1RDKDB4MjZkYWJkYzApLCBXVEMoMHgyNzU1MjU0MCksIFdUQygweDI3ZDAzMjAwKSwgV1RDKDB4Mjg0YmE1ODApLCBXVEMoMHgyOGM3NDBjMCksCi1XVEMoMHgyOTQzMWY4MCksIFdUQygweDI5YmZjOWMwKSwgV1RDKDB4MmEzZGQwODApLCBXVEMoMHgyYWJkYzAwMCksIFdUQygweDJiM2ZmZDAwKSwgV1RDKDB4MmJjNGNkODApLCBXVEMoMHgyYzRjN2Q0MCksIFdUQygweDJjZDcyZWMwKSwKLVdUQygweDJkNjQ3ZjgwKSwgV1RDKDB4MmRmM2NkODApLCBXVEMoMHgyZTg0N2Q4MCksIFdUQygweDJmMTVlYTQwKSwgV1RDKDB4MmZhNzYwYzApLCBXVEMoMHgzMDM4MmI4MCksIFdUQygweDMwYzc5NDQwKSwgV1RDKDB4MzE1NTY2YzApLAotV1RDKDB4MzFlMjA4MDApLCBXVEMoMHgzMjZkZTdjMCksIFdUQygweDMyZjk4MjAwKSwgV1RDKDB4MzM4NWJhMDApLCBXVEMoMHgzNDEzYmVjMCksIFdUQygweDM0YTRjNDgwKSwgV1RDKDB4MzUzOWJmMDApLCBXVEMoMHgzNWQyYzRjMCksCi1XVEMoMHgzNjZmODM0MCksIFdUQygweDM3MGZiODAwKSwgV1RDKDB4MzdiMmNmODApLCBXVEMoMHgzODU3YTQ4MCksIFdUQygweDM4ZmNlZTgwKSwgV1RDKDB4MzlhMTY4NDApLCBXVEMoMHgzYTQ0MjJjMCksIFdUQygweDNhZTQ5NWMwKSwKLVdUQygweDNiODI0MDAwKSwgV1RDKDB4M2MxY2I1MDApLCBXVEMoMHgzY2I0MzhjMCksIFdUQygweDNkNDk5NGMwKSwgV1RDKDB4M2RkZDhmNDApLCBXVEMoMHgzZTcwZWMwMCksIFdUQygweDNmMDQ1ZTQwKSwgV1RDKDB4M2Y5ODkwODApLAotV1RDKDB4NDAyZTMyZmYpLCBXVEMoMHg0MGM1YzA3ZiksIFdUQygweDQxNWY1NDdmKSwgV1RDKDB4NDFmYWYwN2YpLCBXVEMoMHg0Mjk4OTk3ZiksIFdUQygweDQzMzgzMDdmKSwgV1RDKDB4NDNkOTZiZmYpLCBXVEMoMHg0NDdiZmZmZiksCi1XVEMoMHg0NTFmOWNmZiksIFdUQygweDQ1YzNkYWZmKSwgV1RDKDB4NDY2ODNlZmYpLCBXVEMoMHg0NzBjNGNmZiksIFdUQygweDQ3YWY5M2ZmKSwgV1RDKDB4NDg1MWMzZmYpLCBXVEMoMHg0OGYyOWQ3ZiksIFdUQygweDQ5OTFkZTdmKSwKLVdUQygweDRhMmY1ZTdmKSwgV1RDKDB4NGFjYjI4N2YpLCBXVEMoMHg0YjY1NTM3ZiksIFdUQygweDRiZmRmMzdmKSwgV1RDKDB4NGM5NTMzN2YpLCBXVEMoMHg0ZDJiNTFmZiksIFdUQygweDRkYzA5MWZmKSwgV1RDKDB4NGU1NTMzZmYpLAotV1RDKDB4NGVlOTZiN2YpLCBXVEMoMHg0ZjdkNjFmZiksIFdUQygweDUwMTE0MGZmKSwgV1RDKDB4NTBhNTMxN2YpLCBXVEMoMHg1MTM5NWE3ZiksIFdUQygweDUxY2RkZjdmKSwgV1RDKDB4NTI2MmU2ZmYpLCBXVEMoMHg1MmY4ODVmZiksCi1XVEMoMHg1MzhlYjQ3ZiksIFdUQygweDU0MjU2MGZmKSwgV1RDKDB4NTRiYzdiN2YpLCBXVEMoMHg1NTUzYThmZiksIFdUQygweDU1ZWEzNWZmKSwgV1RDKDB4NTY3ZjY2ZmYpLCBXVEMoMHg1NzEyODk3ZiksIFdUQygweDU3YTMzYTdmKSwKLVdUQygweDU4MzE1MmZmKSwgV1RDKDB4NThiY2E1ZmYpLCBXVEMoMHg1OTQ1MzBmZiksIFdUQygweDU5Y2I3OWZmKSwgV1RDKDB4NWE1MDQ3ZmYpLCBXVEMoMHg1YWQ0NWVmZiksIFdUQygweDViNTg0ZTdmKSwgV1RDKDB4NWJkYzQxN2YpLAotV1RDKDB4NWM2MDQ4N2YpLCBXVEMoMHg1Y2U0NzZmZiksIFdUQygweDVkNjhjNDdmKSwgV1RDKDB4NWRlZDA2ZmYpLCBXVEMoMHg1ZTcxMTFmZiksIFdUQygweDVlZjRiNWZmKSwgV1RDKDB4NWY3N2ExN2YpLCBXVEMoMHg1ZmY5NmFmZiksCi1XVEMoMHg2MDc5YTdmZiksIFdUQygweDYwZjdmN2ZmKSwgV1RDKDB4NjE3NDE3ZmYpLCBXVEMoMHg2MWVkZDg3ZiksIFdUQygweDYyNjRmZmZmKSwgV1RDKDB4NjJkOWE2ZmYpLCBXVEMoMHg2MzRjODE3ZiksIFdUQygweDYzYmU2NTdmKSwKLVdUQygweDY0MzAyNzdmKSwgV1RDKDB4NjRhMjI0N2YpLCBXVEMoMHg2NTE0MmJmZiksIFdUQygweDY1ODYwMjdmKSwgV1RDKDB4NjVmNzY5N2YpLCBXVEMoMHg2NjY4MDFmZiksIFdUQygweDY2ZDc1NmZmKSwgV1RDKDB4Njc0NGYwZmYpLAotV1RDKDB4NjdiMDc4N2YpLCBXVEMoMHg2ODFhMDc3ZiksIFdUQygweDY4ODFlYmZmKSwgV1RDKDB4NjhlODcwN2YpLCBXVEMoMHg2OTRkY2VmZiksIFdUQygweDY5YjIxZTdmKSwgV1RDKDB4NmExNTZjZmYpLCBXVEMoMHg2YTc3Y2E3ZiksCi1XVEMoMHg2YWQ5Mzc3ZiksIFdUQygweDZiMzlhNGZmKSwgV1RDKDB4NmI5OTAxZmYpLCBXVEMoMHg2YmY3M2NmZiksIFdUQygweDZjNTQ0NTdmKSwgV1RDKDB4NmNiMDBhZmYpLCBXVEMoMHg2ZDBhN2JmZiksIFdUQygweDZkNjM4N2ZmKSwKLVdUQygweGFlMmNiZTAxKSwgV1RDKDB4YWY1MjZkMDEpLCBXVEMoMHhiMDc1MTIwMSksIFdUQygweGIxOTRkYTgxKSwgV1RDKDB4YjJiMWY0MDEpLCBXVEMoMHhiM2NjOGQwMSksIFdUQygweGI0ZTRkMjAxKSwgV1RDKDB4YjVmYWYxMDEpLAotV1RDKDB4YjcwZjE4ODEpLCBXVEMoMHhiODIxNzMwMSksIFdUQygweGI5MzIxMTgxKSwgV1RDKDB4YmE0MGVlMDEpLCBXVEMoMHhiYjRlMDIwMSksIFdUQygweGJjNTk0NzgxKSwgV1RDKDB4YmQ2MmI4ODEpLCBXVEMoMHhiZTZhNTE4MSksCi1XVEMoMHhiZjcwMGQwMSksIFdUQygweGMwNzNlNGMwKSwgV1RDKDB4YzE3NWQyNDApLCBXVEMoMHhjMjc1Y2M4MCksIFdUQygweGMzNzNjYjgwKSwgV1RDKDB4YzQ2ZmNhMDApLCBXVEMoMHhjNTY5YzYwMCksIFdUQygweGM2NjFiZGMwKSwKLVdUQygweGM3NTdhZjgwKSwgV1RDKDB4Yzg0Yjk4NDApLCBXVEMoMHhjOTNkNzMwMCksIFdUQygweGNhMmQzYTQwKSwgV1RDKDB4Y2IxYWVhNDApLCBXVEMoMHhjYzA2ODI4MCksIFdUQygweGNjZjAwNDgwKSwgV1RDKDB4Y2RkNzcyMDApLAotV1RDKDB4Y2ViY2NiNDApLCBXVEMoMHhjZmEwMGQ4MCksIFdUQygweGQwODEzNTQwKSwgV1RDKDB4ZDE2MDNmMDApLCBXVEMoMHhkMjNkMjk4MCksIFdUQygweGQzMTdmN2MwKSwgV1RDKDB4ZDNmMGFjNDApLCBXVEMoMHhkNGM3NDk4MCksCi1XVEMoMHhkNTliY2Y4MCksIFdUQygweGQ2NmUzYjAwKSwgV1RDKDB4ZDczZTg5MDApLCBXVEMoMHhkODBjYjc0MCksIFdUQygweGQ4ZDhjN2MwKSwgV1RDKDB4ZDlhMmJlMDApLCBXVEMoMHhkYTZhOWU0MCksIFdUQygweGRiMzA2YTQwKSwKLVdUQygweGRiZjQyMDgwKSwgV1RDKDB4ZGNiNWJlODApLCBXVEMoMHhkZDc1NDE0MCksIFdUQygweGRlMzJhOTAwKSwgV1RDKDB4ZGVlZGY5YzApLCBXVEMoMHhkZmE3MzdjMCksIFdUQygweGUwNWU2NzQwKSwgV1RDKDB4ZTExMzg5MDApLAotV1RDKDB4ZTFjNjlhYzApLCBXVEMoMHhlMjc3OWE0MCksIFdUQygweGUzMjY4NjgwKSwgV1RDKDB4ZTNkMzYyNjApLCBXVEMoMHhlNDdlMzNhMCksIFdUQygweGU1MjZmZjgwKSwgV1RDKDB4ZTVjZGM5NjApLCBXVEMoMHhlNjcyOTEwMCksCi1XVEMoMHhlNzE1NTQ2MCksIFdUQygweGU3YjYxMWMwKSwgV1RDKDB4ZTg1NGNhMjApLCBXVEMoMHhlOGYxODE4MCksIFdUQygweGU5OGMzY2EwKSwgV1RDKDB4ZWEyNGZmZTApLCBXVEMoMHhlYWJiY2IyMCksIFdUQygweGViNTA5YjYwKSwKLVdUQygweGViZTM2ZDAwKSwgV1RDKDB4ZWM3NDNlMDApLCBXVEMoMHhlZDAzMTBlMCksIFdUQygweGVkOGZlYWEwKSwgV1RDKDB4ZWUxYWQwNjApLCBXVEMoMHhlZWEzYzY0MCksIFdUQygweGVmMmFjZDYwKSwgV1RDKDB4ZWZhZmU2YTApLAotV1RDKDB4ZjAzMzEyZjApLCBXVEMoMHhmMGI0NTgwMCksIFdUQygweGYxMzNjMjMwKSwgV1RDKDB4ZjFiMTVlZjApLCBXVEMoMHhmMjJkM2FmMCksIFdUQygweGYyYTc1YzgwKSwgV1RDKDB4ZjMxZmM0NjApLCBXVEMoMHhmMzk2NzNiMCksCi1XVEMoMHhmNDBiNmEwMCksIFdUQygweGY0N2VhMjMwKSwgV1RDKDB4ZjRmMDE0NTApLCBXVEMoMHhmNTVmYjkzMCksIFdUQygweGY1Y2Q4NGMwKSwgV1RDKDB4ZjYzOTYwOTApLCBXVEMoMHhmNmEzMzNlMCksIFdUQygweGY3MGFlNTQwKSwKLVdUQygweGY3NzA3MjYwKSwgV1RDKDB4ZjdkM2Y3MjApLCBXVEMoMHhmODM1OTJmMCksIFdUQygweGY4OTU2NDUwKSwgV1RDKDB4ZjhmMzgxMjApLCBXVEMoMHhmOTRmZjdjOCksIFdUQygweGY5YWFkNzQwKSwgV1RDKDB4ZmEwNDI5MjApLAotV1RDKDB4ZmE1YmUxMTApLCBXVEMoMHhmYWIxZTc3OCksIFdUQygweGZiMDYyNDc4KSwgV1RDKDB4ZmI1ODhkNzgpLCBXVEMoMHhmYmE5MzUzMCksIFdUQygweGZiZjgzNmM4KSwgV1RDKDB4ZmM0NWFjZTApLCBXVEMoMHhmYzkxYTI5NCksCi1XVEMoMHhmY2RjMGU1YyksIFdUQygweGZkMjRlNDM4KSwgV1RDKDB4ZmQ2YzE3ZGMpLCBXVEMoMHhmZGIxOTc1OCksIFdUQygweGZkZjU0YzNjKSwgV1RDKDB4ZmUzNzFlZjgpLCBXVEMoMHhmZTc3MDFhYSksIFdUQygweGZlYjUwZDYyKSwKLVdUQygweGZlZjE3MDBhKSwgV1RDKDB4ZmYyYzU1NzQpLCBXVEMoMHhmZjY1ZWU3YiksIFdUQygweGZmOWU3NWRlKSwgV1RDKDB4ZmZkNjI4NjMpLCBXVEMoMHgwMDBkNDQwMSksIFdUQygweDAwNDNkMzQ1KSwgV1RDKDB4MDA3OTljZDApLAotV1RDKDB4MDBhZTVmNDkpLCBXVEMoMHgwMGUxZDdhNCksIFdUQygweDAxMTNhNmYyKSwgV1RDKDB4MDE0MzU3NWMpLCBXVEMoMHgwMTcwNzAyNCksIFdUQygweDAxOWE5MzQ2KSwgV1RDKDB4MDFjMWNmMDgpLCBXVEMoMHgwMWU2NmMxMiksCi1XVEMoMHgwMjA4YWM0OCksIFdUQygweDAyMjhlODY4KSwgV1RDKDB4MDI0N2E2YzgpLCBXVEMoMHgwMjY1N2FhMCksIFdUQygweDAyODJmNzEwKSwgV1RDKDB4MDJhMDdlNTApLCBXVEMoMHgwMmJlMzFjMCksIFdUQygweDAyZGMyYjMwKSwKLVdUQygweDAyZmE3ZjM0KSwgV1RDKDB4MDMxOGZiMTApLCBXVEMoMHgwMzM3MmZkYyksIFdUQygweDAzNTRhZTU0KSwgV1RDKDB4MDM3MTBkMTgpLCBXVEMoMHgwMzhiZmRiNCksIFdUQygweDAzYTU0MDg0KSwgV1RDKDB4MDNiYzkyYjgpLAotV1RDKDB4MDNkMWM3MTApLCBXVEMoMHgwM2U0ZGQyMCksIFdUQygweDAzZjVlMjVjKSwgV1RDKDB4MDQwNGUyMTgpLCBXVEMoMHgwNDExZmMzMCksIFdUQygweDA0MWQ2YjMwKSwgV1RDKDB4MDQyNzZjZDApLCBXVEMoMHgwNDMwM2UwMCksCi1XVEMoMHgwNDM4MTUyOCksIFdUQygweDA0M2YyMzEwKSwgV1RDKDB4MDQ0NTk5MDgpLCBXVEMoMHgwNDRiYTQzMCksIFdUQygweDA0NTE2MWY4KSwgV1RDKDB4MDQ1NmU2ZjgpLCBXVEMoMHgwNDVjNDlhOCksIFdUQygweDA0NjE5MmY4KSwKLVdUQygweDA0NjZhZjQwKSwgV1RDKDB4MDQ2YjgyNDApLCBXVEMoMHgwNDZmZjBkOCksIFdUQygweDA0NzNkZTE4KSwgV1RDKDB4MDQ3NzJiNTgpLCBXVEMoMHgwNDc5YjlhMCksIFdUQygweDA0N2I2YTMwKSwgV1RDKDB4MDQ3YzIwODgpLAotV1RDKDB4MDQ3YmMyMzApLCBXVEMoMHgwNDdhMzQxOCksIFdUQygweDA0Nzc2MDk4KSwgV1RDKDB4MDQ3MzQ3OTApLCBXVEMoMHgwNDZkZjRjMCksIFdUQygweDA0Njc3MjIwKSwgV1RDKDB4MDQ1ZmQxYjApLCBXVEMoMHgwNDU3MzU4OCksCi1XVEMoMHgwNDRkYzRiOCksIFdUQygweDA0NDNhNWI4KSwgV1RDKDB4MDQzOTAxNjApLCBXVEMoMHgwNDJlMDM5OCksIFdUQygweDA0MjJkOGMwKSwgV1RDKDB4MDQxN2FhMzApLCBXVEMoMHgwNDBjN2NlMCksIFdUQygweDA0MDEzNmUwKSwKLVdUQygweDAzZjViZWIwKSwgV1RDKDB4MDNlOWY4ZWMpLCBXVEMoMHgwM2RkYzQ4NCksIFdUQygweDAzZDBmZDljKSwgV1RDKDB4MDNjMzdmYTApLCBXVEMoMHgwM2I1MzAxNCksIFdUQygweDAzYTYwYTE4KSwgV1RDKDB4MDM5NjBmODgpLAotV1RDKDB4MDM4NTQxMTApLCBXVEMoMHgwMzczYWQ5YyksIFdUQygweDAzNjE3Njk0KSwgV1RDKDB4MDM0ZWJmOWMpLCBXVEMoMHgwMzNiYWIzMCksIFdUQygweDAzMjg0ZWYwKSwgV1RDKDB4MDMxNGI1OTgpLCBXVEMoMHgwMzAwZWE1NCksCi1XVEMoMHgwMmVjZjUyNCksIFdUQygweDAyZDhkMjEwKSwgV1RDKDB4MDJjNDc2YWMpLCBXVEMoMHgwMmFmZDk0MCksIFdUQygweDAyOWFlZTRjKSwgV1RDKDB4MDI4NWE2ZjQpLCBXVEMoMHgwMjZmZjM5OCksIFdUQygweDAyNTljNDQ4KSwKLVdUQygweDAyNDMxN2NjKSwgV1RDKDB4MDIyYzAwODQpLCBXVEMoMHgwMjE0OTMxMCksIFdUQygweDAxZmNlMzM0KSwgV1RDKDB4MDFlNGZiMjQpLCBXVEMoMHgwMWNjZGQwYSksIFdUQygweDAxYjQ4YjIwKSwgV1RDKDB4MDE5YzA3N2UpLAotV1RDKDB4MDE4MzU0MzIpLCBXVEMoMHgwMTZhNzMzYyksIFdUQygweDAxNTE2NmE2KSwgV1RDKDB4MDEzODMwMmUpLCBXVEMoMHgwMTFlZDBmNiksIFdUQygweDAxMDU0OWY4KSwgV1RDKDB4MDBlYjljMjUpLCBXVEMoMHgwMGQxY2FhNiksCi1XVEMoMHgwMGI3ZGI5NCksIFdUQygweDAwOWRkNTYwKSwgV1RDKDB4MDA4M2JlNzUpLCBXVEMoMHgwMDY5OWQ0MSksIFdUQygweDAwNGY3ODJmKSwgV1RDKDB4MDAzNTU1YWIpLCBXVEMoMHgwMDFiM2MyMSksIFdUQygweDAwMDEzMWZlKSwKLVdUQygweGQ2MWNmYzQwKSwgV1RDKDB4ZDVhY2IzNDApLCBXVEMoMHhkNTNkNDQwMCksIFdUQygweGQ0Y2VhNmMwKSwgV1RDKDB4ZDQ2MGQ0NDApLCBXVEMoMHhkM2YzYzQ0MCksIFdUQygweGQzODc2ZjgwKSwgV1RDKDB4ZDMxYmNlNDApLAotV1RDKDB4ZDJiMGQ5MDApLCBXVEMoMHhkMjQ2ODk4MCksIFdUQygweGQxZGNlZjAwKSwgV1RDKDB4ZDE3NDI5YzApLCBXVEMoMHhkMTBjNWI4MCksIFdUQygweGQwYTU5YjgwKSwgV1RDKDB4ZDAzZmQ3ODApLCBXVEMoMHhjZmRhZTc4MCksCi1XVEMoMHhjZjc2YTM4MCksIFdUQygweGNmMTJmYWMwKSwgV1RDKDB4Y2ViMDExMDApLCBXVEMoMHhjZTRlMThjMCksIFdUQygweGNkZWQ0NDQwKSwgV1RDKDB4Y2Q4ZDlhNDApLCBXVEMoMHhjZDJlZTgwMCksIFdUQygweGNjZDBmNDQwKSwKLVdUQygweGNjNzM4NzgwKSwgV1RDKDB4Y2MxNjdkNDApLCBXVEMoMHhjYmI5YzE4MCksIFdUQygweGNiNWQ0MDQwKSwgV1RDKDB4Y2IwMGUyNDApLCBXVEMoMHhjYWE0ODAwMCksIFdUQygweGNhNDdlYWMwKSwgV1RDKDB4YzllYWYxYzApLAotV1RDKDB4Yzk4ZDgxMDApLCBXVEMoMHhjOTJmYzU4MCksIFdUQygweGM4ZDFmYzgwKSwgV1RDKDB4Yzg3NDY0ODApLCBXVEMoMHhjODE2ZGM0MCksIFdUQygweGM3YjhjMjgwKSwgV1RDKDB4Yzc1OTY4MDApLCBXVEMoMHhjNmY4MWY4MCksCi1XVEMoMHhjNjk0NTc0MCksIFdUQygweGM2MmQ5M2MwKSwgV1RDKDB4YzVjMzU4YzApLCBXVEMoMHhjNTU1MmI4MCksIFdUQygweGM0ZTI5MjQwKSwgV1RDKDB4YzQ2YjE0NDApLCBXVEMoMHhjM2VlMzg0MCksIFdUQygweGMzNmI4NTAwKSwKLVdUQygweGMyZTI4MDQwKSwgV1RDKDB4YzI1MmFlODApLCBXVEMoMHhjMWJiOTU0MCksIFdUQygweGMxMWNjMjAwKSwgV1RDKDB4YzA3NWNmMDApLCBXVEMoMHhiZmM2NTc4MSksIFdUQygweGJmMGRmODgxKSwgV1RDKDB4YmU0YzZmMDEpLAotV1RDKDB4YmQ4MTk0MDEpLCBXVEMoMHhiY2FkMmQwMSksIFdUQygweGJiY2ZiOTgxKSwgV1RDKDB4YmFlY2E2ODEpLCBXVEMoMHhiYTA4ZTc4MSksIFdUQygweGI5Mjk3MDgxKSwgV1RDKDB4Yjg1MWUwODEpLCBXVEMoMHhiNzgyZWQwMSksCi1XVEMoMHhiNmJjNmE4MSksIFdUQygweGI1ZmU0OTgxKSwgV1RDKDB4YjU0ODcyODEpLCBXVEMoMHhiNDlhZDA4MSksIFdUQygweGIzZjU0ZDgxKSwgV1RDKDB4YjM1N2Q0MDEpLCBXVEMoMHhiMmMyNGUwMSksIFdUQygweGIyMzRhNjgxKSwKLVdUQygweGIxYWVjNzAxKSwgV1RDKDB4YjEzMDliMDEpLCBXVEMoMHhiMGJhMGMwMSksIFdUQygweGIwNGIwNDgxKSwgV1RDKDB4YWZlMzZmMDEpLCBXVEMoMHhhZjgzMzYwMSksIFdUQygweGFmMmE0MzgxKSwgV1RDKDB4YWVkODgyMDEpLAotV1RDKDB4YWU4ZGRiODEpLCBXVEMoMHhhZTRhM2I4MSksIFdUQygweGFlMGQ4YjAxKSwgV1RDKDB4YWRkN2I1ODEpLCBXVEMoMHhhZGE4YTQ4MSksIFdUQygweGFkODA0MjgxKSwgV1RDKDB4YWQ1ZTdhODEpLCBXVEMoMHhhZDQzMzYwMSksCi1XVEMoMHhhZDJlNjAwMSksIFdUQygweGFkMWZlMjgxKSwgV1RDKDB4YWQxN2E4MDEpLCBXVEMoMHhhZDE1OWE4MSksIFdUQygweGFkMTlhNTAxKSwgV1RDKDB4YWQyM2IxMDEpLCBXVEMoMHhhZDMzYWEwMSksIFdUQygweGFkNDk3OTgxKSwKLVdUQygweGFkNjUwYTAxKSwgV1RDKDB4YWQ4NjQ2MDEpLCBXVEMoMHhhZGFkMTc4MSksIFdUQygweGFkZDk2OTgxKSwgV1RDKDB4YWUwYjI2MDEpLCBXVEMoMHhhZTQyMzc4MSksIFdUQygweGFlN2U4ODAxKSwgV1RDKDB4YWVjMDAyMDEpLAotV1RDKDB4YWYwNjkwODEpLCBXVEMoMHhhZjUyMWM4MSksIFdUQygweGFmYTI5MjAxKSwgV1RDKDB4YWZmN2RhMDEpLCBXVEMoMHhiMDUxZGYwMSksIFdUQygweGIwYjA4YzgxKSwgV1RDKDB4YjExM2NiODEpLCBXVEMoMHhiMTdiODcwMSksCi1XVEMoMHhiMWU3YTk4MSksIFdUQygweGIyNTgxZDgxKSwgV1RDKDB4YjJjY2NjODEpLCBXVEMoMHhiMzQ1YTE4MSksIFdUQygweGIzYzI4NzAxKSwgV1RDKDB4YjQ0MzY2ODEpLCBXVEMoMHhiNGM4MmI4MSksIFdUQygweGI1NTBiZjgxKSwKLVdUQygweGI1ZGQwZDAxKSwgV1RDKDB4YjY2Y2ZmMDEpLCBXVEMoMHhiNzAwN2YwMSksIFdUQygweGI3OTc3NzgxKSwgV1RDKDB4YjgzMWQzODEpLCBXVEMoMHhiOGNmN2QwMSksIFdUQygweGI5NzA1ZTAxKSwgV1RDKDB4YmExNDYxMDEpLAotV1RDKDB4YmFiYjcwODEpLCBXVEMoMHhiYjY1Nzc4MSksIFdUQygweGJjMTI1ZjAxKSwgV1RDKDB4YmNjMjEyODEpLCBXVEMoMHhiZDc0N2I4MSksIFdUQygweGJlMjk4NTgxKSwgV1RDKDB4YmVlMTE5ODEpLCBXVEMoMHhiZjliMjMwMSksCi1XVEMoMHhjMDU3OGI4MCksIFdUQygweGMxMTYzZGMwKSwgV1RDKDB4YzFkNzI0MDApLCBXVEMoMHhjMjlhMjhjMCksIFdUQygweGMzNWYzNjQwKSwgV1RDKDB4YzQyNjM2YzApLCBXVEMoMHhjNGVmMTUwMCksIFdUQygweGM1YjliYjAwKSwKLVdUQygweGM2ODYxMzQwKSwgV1RDKDB4Yzc1NDA4NDApLCBXVEMoMHhjODIzODQwMCksIFdUQygweGM4ZjQ3MTAwKSwgV1RDKDB4YzljNmI5YzApLCBXVEMoMHhjYTlhNDg0MCksIFdUQygweGNiNmYwNzgwKSwgV1RDKDB4Y2M0NGUxNDApLAotV1RDKDB4Y2QxYmMwMDApLCBXVEMoMHhjZGYzOGUwMCksIFdUQygweGNlY2MzNjAwKSwgV1RDKDB4Y2ZhNWEyNDApLCBXVEMoMHhkMDdmYmNjMCksIFdUQygweGQxNWE3MDQwKSwgV1RDKDB4ZDIzNWE2YzApLCBXVEMoMHhkMzExNGIwMCksCi1XVEMoMHhkM2VkNDc0MCksIFdUQygweGQ0Yzk4NTgwKSwgV1RDKDB4ZDVhNWYwODApLCBXVEMoMHhkNjgyNzI4MCksIFdUQygweGQ3NWVmNjAwKSwgV1RDKDB4ZDgzYjY1MDApLCBXVEMoMHhkOTE3YWEwMCksIFdUQygweGQ5ZjNhZjgwKSwKLVdUQygweGRhY2Y1ZmMwKSwgV1RDKDB4ZGJhYWE1NDApLCBXVEMoMHhkYzg1NmEwMCksIFdUQygweGRkNWY5OGMwKSwgV1RDKDB4ZGUzOTFiYzApLCBXVEMoMHhkZjExZGQ0MCksIFdUQygweGRmZTljNzgwKSwgV1RDKDB4ZTBjMGM1NDApLAotV1RDKDB4ZTE5NmMwODApLCBXVEMoMHhlMjZiYTNjMCksIFdUQygweGUzM2Y1OTYwKSwgV1RDKDB4ZTQxMWNiYTApLCBXVEMoMHhlNGUyZTUwMCksIFdUQygweGU1YjI4ZmMwKSwgV1RDKDB4ZTY4MGI2NDApLCBXVEMoMHhlNzRkNDJlMCksCi1XVEMoMHhlODE4MWZlMCksIFdUQygweGU4ZTEzN2UwKSwgV1RDKDB4ZTlhODc1MDApLCBXVEMoMHhlYTZkYzFhMCksIFdUQygweGViMzEwODIwKSwgV1RDKDB4ZWJmMjMzMDApLCBXVEMoMHhlY2IxMmM2MCksIFdUQygweGVkNmRkZWUwKSwKLVdUQygweGVlMjgzNGEwKSwgV1RDKDB4ZWVlMDE4MDApLCBXVEMoMHhlZjk1NzM4MCksIFdUQygweGYwNDgzMTYwKSwgV1RDKDB4ZjBmODNjMDApLCBXVEMoMHhmMWE1N2RiMCksIFdUQygweGYyNGZlMGYwKSwgV1RDKDB4ZjJmNzRmZjApLAotV1RDKDB4ZjM5YmI1MzApLCBXVEMoMHhmNDNjZmFmMCksIFdUQygweGY0ZGIwYjkwKSwgV1RDKDB4ZjU3NWQxODApLCBXVEMoMHhmNjBkMzcwMCksIFdUQygweGY2YTEyNjgwKSwgV1RDKDB4ZjczMThhNTApLCBXVEMoMHhmN2JlNGNjMCksCi1XVEMoMHhmODQ3NTg1MCksIFdUQygweGY4Y2M5NzM4KSwgV1RDKDB4Zjk0ZGYzZTApLCBXVEMoMHhmOWNiNThhOCksIFdUQygweGZhNDRhZmUwKSwgV1RDKDB4ZmFiOWUzZTgpLCBXVEMoMHhmYjJhZGYyMCksIFdUQygweGZiOTc4YmU4KSwKLVdUQygweGZiZmZkNDg4KSwgV1RDKDB4ZmM2M2EzNzApLCBXVEMoMHhmY2MyZTJmMCksIFdUQygweGZkMWQ3ZDY0KSwgV1RDKDB4ZmQ3MzVkMmMpLCBXVEMoMHhmZGM0NmM5YyksIFdUQygweGZlMTA5NjE4KSwgV1RDKDB4ZmU1N2MzZjQpLAotV1RDKDB4ZmU5OWUwOTApLCBXVEMoMHhmZWQ2ZDY0NCksIFdUQygweGZmMGU4ZjZlKSwgV1RDKDB4ZmY0MGY2NjcpLCBXVEMoMHhmZjZkZjU4YyksIFdUQygweGZmOTU3NzM4KSwgV1RDKDB4ZmZiNzY1YzUpLCBXVEMoMHhmZmQzYWI5MCksCi1XVEMoMHhmZmVhMzJmNCksIFdUQygweGZmZmFlNjRjKSwgV1RDKDB4MDAwNWFmZjMpLCBXVEMoMHgwMDBhN2E0NCksIFdUQygweDAwMDkyZjljKSwgV1RDKDB4MDAwMWJhNTQpLCBXVEMoMHhmZmY0MDRjYSksIFdUQygweGZmZGZmOTU3KQotfTsKLQotCi0KKyAgICBXVEMoMHhkYWQyZTZjMCksIFdUQygweGRiMWRhOTAwKSwgV1RDKDB4ZGI2OGNlNDApLCBXVEMoMHhkYmI0NTg0MCksCisgICAgV1RDKDB4ZGMwMDQ5NDApLCBXVEMoMHhkYzRjYTI4MCksIFdUQygweGRjOTk2NTAwKSwgV1RDKDB4ZGNlNjkxNDApLAorICAgIFdUQygweGRkMzQyNzgwKSwgV1RDKDB4ZGQ4MjI3MDApLCBXVEMoMHhkZGQwOGE4MCksIFdUQygweGRlMWY0ZDAwKSwKKyAgICBXVEMoMHhkZTZlNmVjMCksIFdUQygweGRlYmRlYzQwKSwgV1RDKDB4ZGYwZGJhODApLCBXVEMoMHhkZjVkZDU0MCksCisgICAgV1RDKDB4ZGZhZTNjYzApLCBXVEMoMHhkZmZmMDUwMCksIFdUQygweGUwNTA1MTQwKSwgV1RDKDB4ZTBhMjI5ODApLAorICAgIFdUQygweGUwZjQ4OGUwKSwgV1RDKDB4ZTE0NzYxODApLCBXVEMoMHhlMTlhYTQ4MCksIFdUQygweGUxZWU0ZDgwKSwKKyAgICBXVEMoMHhlMjQyNTQwMCksIFdUQygweGUyOTY4OWEwKSwgV1RDKDB4ZTJlYWNkNjApLCBXVEMoMHhlMzNmMjQyMCksCisgICAgV1RDKDB4ZTM5M2EzMDApLCBXVEMoMHhlM2U4N2YyMCksIFdUQygweGU0M2RjZWUwKSwgV1RDKDB4ZTQ5MzhhODApLAorICAgIFdUQygweGU0ZTliMGEwKSwgV1RDKDB4ZTU0MDQzMDApLCBXVEMoMHhlNTk3M2U2MCksIFdUQygweGU1ZWU5YjgwKSwKKyAgICBXVEMoMHhlNjQ2NDllMCksIFdUQygweGU2OWUzN2UwKSwgV1RDKDB4ZTZmNjVlYzApLCBXVEMoMHhlNzRlYjZjMCksCisgICAgV1RDKDB4ZTdhNzMwMDApLCBXVEMoMHhlN2ZmYmU0MCksIFdUQygweGU4NTg1ZWUwKSwgV1RDKDB4ZThiMTA3NDApLAorICAgIFdUQygweGU5MDk5YzQwKSwgV1RDKDB4ZTk2MjE0ZTApLCBXVEMoMHhlOWJhNzlhMCksIFdUQygweGVhMTJlN2MwKSwKKyAgICBXVEMoMHhlYTZiODljMCksIFdUQygweGVhYzQ2NTgwKSwgV1RDKDB4ZWIxZDcyNjApLCBXVEMoMHhlYjc2YjYyMCksCisgICAgV1RDKDB4ZWJkMDM2YzApLCBXVEMoMHhlYzI5ZTUyMCksIFdUQygweGVjODNhYTYwKSwgV1RDKDB4ZWNkZDVhMDApLAorICAgIFdUQygweGVkMzZkNTAwKSwgV1RDKDB4ZWQ5MDE1NDApLCBXVEMoMHhlZGU5MTE2MCksIFdUQygweGVlNDFiYzIwKSwKKyAgICBXVEMoMHhlZTlhMGVlMCksIFdUQygweGVlZjIwODYwKSwgV1RDKDB4ZWY0OWE3ZTApLCBXVEMoMHhlZmEwZWMwMCksCisgICAgV1RDKDB4ZWZmN2QxYzApLCBXVEMoMHhmMDRlNTZiMCksIFdUQygweGYwYTQ3NmUwKSwgV1RDKDB4ZjBmYTJmNjApLAorICAgIFdUQygweGYxNGY4MGUwKSwgV1RDKDB4ZjFhNDZlMTApLCBXVEMoMHhmMWY4ZmU4MCksIFdUQygweGYyNGQzNGEwKSwKKyAgICBXVEMoMHhmMmExMGJiMCksIFdUQygweGYyZjQ4MjEwKSwgV1RDKDB4ZjM0NzljYzApLCBXVEMoMHhmMzlhNWJlMCksCisgICAgV1RDKDB4ZjNlY2I4ZjApLCBXVEMoMHhmNDNlYWZhMCksIFdUQygweGY0OTAzYjUwKSwgV1RDKDB4ZjRlMTRlODApLAorICAgIFdUQygweGY1MzFkNmEwKSwgV1RDKDB4ZjU4MWJjMTApLCBXVEMoMHhmNWQwZTljMCksIFdUQygweGY2MWY1MjUwKSwKKyAgICBXVEMoMHhmNjZjZTZlMCksIFdUQygweGY2Yjk5MzMwKSwgV1RDKDB4ZjcwNTRlYjApLCBXVEMoMHhmNzUwMWYyMCksCisgICAgV1RDKDB4Zjc5YTA3NTApLCBXVEMoMHhmN2UzMDcwMCksIFdUQygweGY4MmIyZmMwKSwgV1RDKDB4Zjg3MmExMzgpLAorICAgIFdUQygweGY4Yjk3ZjE4KSwgV1RDKDB4ZjhmZmU2NjgpLCBXVEMoMHhmOTQ1ZTUzOCksIFdUQygweGY5OGI4ODYwKSwKKyAgICBXVEMoMHhmOWQwZjM4MCksIFdUQygweGZhMTY1MTQ4KSwgV1RDKDB4ZmE1YmI4YTgpLCBXVEMoMHhmYWExM2RmOCksCisgICAgV1RDKDB4ZmFlNmZiMDApLCBXVEMoMHhmYjJjZjhjOCksIFdUQygweGZiNzMyYTgwKSwgV1RDKDB4ZmJiOTc5MTApLAorICAgIFdUQygweGZiZmZjZDEwKSwgV1RDKDB4ZmM0NjM0NzgpLCBXVEMoMHhmYzhjZDNmYyksIFdUQygweGZjZDNiZTVjKSwKKyAgICBXVEMoMHhmZDFhZmE5MCksIFdUQygweGZkNjJhYTg0KSwgV1RDKDB4ZmRhYjAyODgpLCBXVEMoMHhmZGY0MDRiNCksCisgICAgV1RDKDB4ZmUzZDMwMDYpLCBXVEMoMHhmZTg1YjIwZSksIFdUQygweGZlY2NhNGNjKSwgV1RDKDB4ZmYxMGQ1NTkpLAorICAgIFdUQygweGZmNTA1NzliKSwgV1RDKDB4ZmY4YTQwZDIpLCBXVEMoMHhmZmI3ZDg2ZSksIFdUQygweGZmZWY2YmJiKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHhiZmY2N2EwMSksIFdUQygweGJmZWNhYTgxKSwgV1RDKDB4YmZlMmQ5MDEpLCBXVEMoMHhiZmQ5MDYwMSksCisgICAgV1RDKDB4YmZjZjMxODEpLCBXVEMoMHhiZmM1NWM4MSksIFdUQygweGJmYmI4NzAxKSwgV1RDKDB4YmZiMWIxMDEpLAorICAgIFdUQygweGJmYTdkYzAxKSwgV1RDKDB4YmY5ZTA3MDEpLCBXVEMoMHhiZjk0MzMwMSksIFdUQygweGJmOGE1ZjgxKSwKKyAgICBXVEMoMHhiZjgwOGI4MSksIFdUQygweGJmNzZiNzAxKSwgV1RDKDB4YmY2Y2UyMDEpLCBXVEMoMHhiZjYzMGQ4MSksCisgICAgV1RDKDB4YmY1OTNhMDEpLCBXVEMoMHhiZjRmNjgwMSksIFdUQygweGJmNDU5NjgxKSwgV1RDKDB4YmYzYmM2MDEpLAorICAgIFdUQygweGJmMzFmNTAxKSwgV1RDKDB4YmYyODI1MDEpLCBXVEMoMHhiZjFlNTUwMSksIFdUQygweGJmMTQ4NjgxKSwKKyAgICBXVEMoMHhiZjBhYmEwMSksIFdUQygweGJmMDBlZjgxKSwgV1RDKDB4YmVmNzI2ODEpLCBXVEMoMHhiZWVkNWYwMSksCisgICAgV1RDKDB4YmVlMzk4MDEpLCBXVEMoMHhiZWQ5ZDI4MSksIFdUQygweGJlZDAwZjgxKSwgV1RDKDB4YmVjNjRlODEpLAorICAgIFdUQygweGJlYmM5MTgxKSwgV1RDKDB4YmViMmQ2ODEpLCBXVEMoMHhiZWE5MWYwMSksIFdUQygweGJlOWY2OTAxKSwKKyAgICBXVEMoMHhiZTk1YjU4MSksIFdUQygweGJlOGMwNTAxKSwgV1RDKDB4YmU4MjU4MDEpLCBXVEMoMHhiZTc4YjAwMSksCisgICAgV1RDKDB4YmU2ZjBjMDEpLCBXVEMoMHhiZTY1NmMwMSksIFdUQygweGJlNWJkMDAxKSwgV1RDKDB4YmU1MjM3ODEpLAorICAgIFdUQygweGJlNDhhMzAxKSwgV1RDKDB4YmUzZjEzODEpLCBXVEMoMHhiZTM1ODkwMSksIFdUQygweGJlMmMwNTAxKSwKKyAgICBXVEMoMHhiZTIyODY4MSksIFdUQygweGJlMTkwZDgxKSwgV1RDKDB4YmUwZjlhMDEpLCBXVEMoMHhiZTA2MmI4MSksCisgICAgV1RDKDB4YmRmY2MzMDEpLCBXVEMoMHhiZGYzNjEwMSksIFdUQygweGJkZWEwNjgxKSwgV1RDKDB4YmRlMGIzMDEpLAorICAgIFdUQygweGJkZDc2NzAxKSwgV1RDKDB4YmRjZTIxODEpLCBXVEMoMHhiZGM0ZTMwMSksIFdUQygweGJkYmJhYjAxKSwKKyAgICBXVEMoMHhiZGIyN2IwMSksIFdUQygweGJkYTk1MzAxKSwgV1RDKDB4YmRhMDMzODEpLCBXVEMoMHhiZDk3MWM4MSksCisgICAgV1RDKDB4YmQ4ZTBlMDEpLCBXVEMoMHhiZDg1MDcwMSksIFdUQygweGJkN2MwNzgxKSwgV1RDKDB4YmQ3MzEwODEpLAorICAgIFdUQygweGJkNmEyMjAxKSwgV1RDKDB4YmQ2MTNkODEpLCBXVEMoMHhiZDU4NjI4MSksIFdUQygweGJkNGY5MTAxKSwKKyAgICBXVEMoMHhiZDQ2YzgwMSksIFdUQygweGJkM2UwODAxKSwgV1RDKDB4YmQzNTUwODEpLCBXVEMoMHhiZDJjYTI4MSksCisgICAgV1RDKDB4YmQyM2ZmMDEpLCBXVEMoMHhiZDFiNjUwMSksIFdUQygweGJkMTJkNTgxKSwgV1RDKDB4YmQwYTRmODEpLAorICAgIFdUQygweGJkMDFkMjgxKSwgV1RDKDB4YmNmOTVlODEpLCBXVEMoMHhiY2YwZjM4MSksIFdUQygweGJjZTg5MjgxKSwKKyAgICBXVEMoMHhiY2UwM2I4MSksIFdUQygweGJjZDdlZjAxKSwgV1RDKDB4YmNjZmFjMDEpLCBXVEMoMHhiY2M3NzE4MSksCisgICAgV1RDKDB4YmNiZjQwMDEpLCBXVEMoMHhiY2I3MTcwMSksIFdUQygweGJjYWVmNzAxKSwgV1RDKDB4YmNhNmUxMDEpLAorICAgIFdUQygweGJjOWVkNDgxKSwgV1RDKDB4YmM5NmQxMDEpLCBXVEMoMHhiYzhlZDcwMSksIFdUQygweGJjODZlNTgxKSwKKyAgICBXVEMoMHhiYzdlZmM4MSksIFdUQygweGJjNzcxYzAxKSwgV1RDKDB4YmM2ZjQ0MDEpLCBXVEMoMHhiYzY3NzUwMSksCisgICAgV1RDKDB4YmM1ZmFlODEpLCBXVEMoMHhiYzU3ZjEwMSksIFdUQygweGJjNTAzYjgxKSwgV1RDKDB4YmM0ODhlODEpLAorICAgIFdUQygweGJjNDBlODgxKSwgV1RDKDB4YmMzOTQ5MDEpLCBXVEMoMHhiYzMxYWYwMSksIFdUQygweGJjMmExYTgxKSwKKyAgICBXVEMoMHhiYzIyOGYwMSksIFdUQygweGJjMWIxMDgxKSwgV1RDKDB4YmMxM2E0ODEpLCBXVEMoMHhiYzBjNDU4MSksCisgICAgV1RDKDB4YmMwNGUzODEpLCBXVEMoMHhiYmZkNmMwMSksIFdUQygweGJiZjVkMTgxKSwgV1RDKDB4YmJlZTJmODEpLAorICAgIFdUQygweGJiZTZjODAxKSwgV1RDKDB4YmJkZmRiODEpLCBXVEMoMHhiYmQ5YTc4MSksIFdUQygweGJiZDQ1ODgxKSwKKyAgICBXVEMoMHhiYmQwMTMwMSksIFdUQygweGJiY2NmYzgxKSwgV1RDKDB4YmJjYjIyODEpLCBXVEMoMHhiYmNhNWQwMSksCisgICAgV1RDKDB4YmJjYTc0ODEpLCBXVEMoMHhiYmNiMzIwMSksIFdUQygweGJiY2M2YjAxKSwgV1RDKDB4YmJjZTA2MDEpLAorICAgIFdUQygweGJiY2ZlYTgxKSwgV1RDKDB4YmJkMjAzMDEpLCBXVEMoMHhiYmQ0NTYwMSksIFdUQygweGJiZDcwMjAxKSwKKyAgICBXVEMoMHhiYmRhMjUwMSksIFdUQygweGJiZGRkYjAxKSwgV1RDKDB4YmJlMjMyODEpLCBXVEMoMHhiYmU3MzIwMSksCisgICAgV1RDKDB4YmJlY2UyODEpLCBXVEMoMHhiYmYzNDI4MSksIFdUQygweGJiZmEzYzAxKSwgV1RDKDB4YmMwMWIzODEpLAorICAgIFdUQygweGJjMDk4ZDgxKSwgV1RDKDB4YmMxMWI2ODEpLCBXVEMoMHhiYzFhMjQwMSksIFdUQygweGJjMjJjZDgxKSwKKyAgICBXVEMoMHhiYzJiYWIwMSksIFdUQygweGJjMzRjMDgxKSwgV1RDKDB4YmMzZTE5ODEpLCBXVEMoMHhiYzQ3YzI4MSksCisgICAgV1RDKDB4YmM1MWNiMDEpLCBXVEMoMHhiYzVjNGM4MSksIFdUQygweGJjNjc2NTAxKSwgV1RDKDB4YmM3MzM0MDEpLAorICAgIFdUQygweGJjN2ZkMzAxKSwgV1RDKDB4YmM4ZDUxMDEpLCBXVEMoMHhiYzliYjkwMSksIFdUQygweGJjYWIxNzgxKSwKKyAgICBXVEMoMHhiY2JiNzAwMSksIFdUQygweGJjY2NiZDAxKSwgV1RDKDB4YmNkZWY3MDEpLCBXVEMoMHhiY2YyMTYwMSksCisgICAgV1RDKDB4YmQwNjBjODEpLCBXVEMoMHhiZDFhYzgwMSksIFdUQygweGJkMzAzNTgxKSwgV1RDKDB4YmQ0NjQyODEpLAorICAgIFdUQygweGJkNWNlMjgxKSwgV1RDKDB4YmQ3NDBiODEpLCBXVEMoMHhiZDhiYjI4MSksIFdUQygweGJkYTNkMDgxKSwKKyAgICBXVEMoMHhiZGJjNjM4MSksIFdUQygweGJkZDU2YjgxKSwgV1RDKDB4YmRlZWU5ODEpLCBXVEMoMHhiZTA4ZTE4MSksCisgICAgV1RDKDB4YmUyMzYwMDEpLCBXVEMoMHhiZTNlNzIwMSksIFdUQygweGJlNWEyMzAxKSwgV1RDKDB4YmU3NjdlODEpLAorICAgIFdUQygweGJlOTM4YzgxKSwgV1RDKDB4YmViMTU3MDEpLCBXVEMoMHhiZWNmZTYwMSksIFdUQygweGJlZWY0NjAxKSwKKyAgICBXVEMoMHhiZjBmODMwMSksIFdUQygweGJmMzBhOTAxKSwgV1RDKDB4YmY1MmMxMDEpLCBXVEMoMHhiZjc1Y2M4MSksCisgICAgV1RDKDB4YmY5OWNiMDEpLCBXVEMoMHhiZmJlYmI4MSksIFdUQygweGJmZTQ4OTgxKSwgV1RDKDB4YzAwYjA0YzApLAorICAgIFdUQygweGMwMzFmODgwKSwgV1RDKDB4YzA1OTMzNDApLCBXVEMoMHhjMDgwOTI4MCksIFdUQygweGMwYTgwMmMwKSwKKyAgICBXVEMoMHhjMGNmNmVjMCksIFdUQygweGMwZjZjYzAwKSwgV1RDKDB4YzExZTNhODApLCBXVEMoMHhjMTQ1ZjA0MCksCisgICAgV1RDKDB4YzE2ZTIyYzApLCBXVEMoMHhjMTk2ZmIwMCksIFdUQygweGMxYzA4NjgwKSwgV1RDKDB4YzFlYWNhMDApLAorICAgIFdUQygweGMyMTVjYmMwKSwgV1RDKDB4YzI0MTg5NDApLCBXVEMoMHhjMjZkZjVjMCksIFdUQygweGMyOWIwMmMwKSwKKyAgICBXVEMoMHhjMmM4YTE0MCksIFdUQygweGMyZjZiNTAwKSwgV1RDKDB4YzMyNTE3NDApLCBXVEMoMHhjMzUzYTBjMCksCisgICAgV1RDKDB4YzM4MjJjMDApLCBXVEMoMHhjM2IwOTk0MCksIFdUQygweGMzZGVjY2MwKSwgV1RDKDB4YzQwY2E4MDApLAorICAgIFdUQygweGM0M2EyOGMwKSwgV1RDKDB4YzQ2NzhhMDApLCBXVEMoMHhjNDk1MTc4MCksIFdUQygweGM0YzMxZDAwKSwKKyAgICBXVEMoMHhjNGYxYmRjMCksIFdUQygweGM1MjBlODQwKSwgV1RDKDB4YzU1MDg0NDApLCBXVEMoMHhjNTgwNzkwMCksCisgICAgV1RDKDB4YzViMDllODApLCBXVEMoMHhjNWUwYmZjMCksIFdUQygweGM2MTBhNzQwKSwgV1RDKDB4YzY0MDI5YzApLAorICAgIFdUQygweGM2NmY0OWMwKSwgV1RDKDB4YzY5ZTIxODApLCBXVEMoMHhjNmNjY2E0MCksIFdUQygweGM2ZmI1NzAwKSwKKyAgICBXVEMoMHhjNzI5Y2M4MCksIFdUQygweGM3NTgyYjQwKSwgV1RDKDB4Yzc4Njc0ODApLCBXVEMoMHhjN2I0YTQ4MCksCisgICAgV1RDKDB4YzdlMmFmYzApLCBXVEMoMHhjODEwOGE4MCksIFdUQygweGM4M2UyOGMwKSwgV1RDKDB4Yzg2YjdmMDApLAorICAgIFdUQygweGM4OTg4MTAwKSwgV1RDKDB4YzhjNTIzNDApLCBXVEMoMHhjOGYxNTk4MCksIFdUQygweGM5MWQxODQwKSwKKyAgICBXVEMoMHhiNGQ2YTM4MSksIFdUQygweGI0NDIyYjgxKSwgV1RDKDB4YjNhZTg2MDEpLCBXVEMoMHhiMzFiYjMwMSksCisgICAgV1RDKDB4YjI4OWIxODEpLCBXVEMoMHhiMWY4ODE4MSksIFdUQygweGIxNjgyMjgxKSwgV1RDKDB4YjBkODk0MDEpLAorICAgIFdUQygweGIwNDlkNjAxKSwgV1RDKDB4YWZiYmU4MDEpLCBXVEMoMHhhZjJlYzkwMSksIFdUQygweGFlYTI3NjgxKSwKKyAgICBXVEMoMHhhZTE2ZjAwMSksIFdUQygweGFkOGMzMzAxKSwgV1RDKDB4YWQwMjNmMDEpLCBXVEMoMHhhYzc5MTQwMSksCisgICAgV1RDKDB4YWJmMGIxODEpLCBXVEMoMHhhYjY5MTY4MSksIFdUQygweGFhZTI0MzAxKSwgV1RDKDB4YWE1YzM2MDEpLAorICAgIFdUQygweGE5ZDZlZjAxKSwgV1RDKDB4YTk1MjZkODEpLCBXVEMoMHhhOGNlYjIwMSksIFdUQygweGE4NGJiYjgxKSwKKyAgICBXVEMoMHhhN2M5OGIwMSksIFdUQygweGE3NDgyMTAxKSwgV1RDKDB4YTZjNzdlMDEpLCBXVEMoMHhhNjQ3YTMwMSksCisgICAgV1RDKDB4YTVjODkwMDEpLCBXVEMoMHhhNTRhNDcwMSksIFdUQygweGE0Y2NjOTAxKSwgV1RDKDB4YTQ1MDE2MDEpLAorICAgIFdUQygweGEzZDQzMDAxKSwgV1RDKDB4YTM1OTE4MDEpLCBXVEMoMHhhMmRlY2U4MSksIFdUQygweGEyNjU1NTgxKSwKKyAgICBXVEMoMHhhMWVjYWUwMSksIFdUQygweGExNzRkYTgxKSwgV1RDKDB4YTBmZGRkODEpLCBXVEMoMHhhMDg3Yjk4MSksCisgICAgV1RDKDB4YTAxMjcwODEpLCBXVEMoMHg5ZjllMDMwMSksIFdUQygweDlmMmE3MjgxKSwgV1RDKDB4OWViN2MxMDEpLAorICAgIFdUQygweDllNDVmMDgxKSwgV1RDKDB4OWRkNTA0ODEpLCBXVEMoMHg5ZDY1MDA4MSksIFdUQygweDljZjVlNzAxKSwKKyAgICBXVEMoMHg5Yzg3YmE4MSksIFdUQygweDljMWE3YzgxKSwgV1RDKDB4OWJhZTJmODEpLCBXVEMoMHg5YjQyZDU4MSksCisgICAgV1RDKDB4OWFkODcwODEpLCBXVEMoMHg5YTZmMDM4MSksIFdUQygweDlhMDY5MDAxKSwgV1RDKDB4OTk5ZjE5ODEpLAorICAgIFdUQygweDk5MzhhMjgxKSwgV1RDKDB4OThkMzJkODEpLCBXVEMoMHg5ODZlYmQ4MSksIFdUQygweDk4MGI1NTAxKSwKKyAgICBXVEMoMHg5N2E4ZjY4MSksIFdUQygweDk3NDdhNDgxKSwgV1RDKDB4OTZlNzYxMDEpLCBXVEMoMHg5Njg4MmUwMSksCisgICAgV1RDKDB4OTYyYTBjODEpLCBXVEMoMHg5NWNjZmYwMSksIFdUQygweDk1NzEwNjAxKSwgV1RDKDB4OTUxNjIzODEpLAorICAgIFdUQygweDk0YmM1OTgxKSwgV1RDKDB4OTQ2M2E4ODEpLCBXVEMoMHg5NDBjMTI4MSksIFdUQygweDkzYjU5OTAxKSwKKyAgICBXVEMoMHg5MzYwM2QwMSksIFdUQygweDkzMGJmZjgxKSwgV1RDKDB4OTJiOGUxMDEpLCBXVEMoMHg5MjY2ZTI4MSksCisgICAgV1RDKDB4OTIxNjAzMDEpLCBXVEMoMHg5MWM2NDMwMSksIFdUQygweDkxNzdhMzAxKSwgV1RDKDB4OTEyYTIyMDEpLAorICAgIFdUQygweDkwZGRjMDAxKSwgV1RDKDB4OTA5MjdiODEpLCBXVEMoMHg5MDQ4NTQwMSksIFdUQygweDhmZmY0NjAxKSwKKyAgICBXVEMoMHg4ZmI3NGY4MSksIFdUQygweDhmNzA2ZjAxKSwgV1RDKDB4OGYyYWExMDEpLCBXVEMoMHg4ZWU1ZTMwMSksCisgICAgV1RDKDB4OGVhMjMyMDEpLCBXVEMoMHg4ZTVmODg4MSksIFdUQygweDhlMWRlMDAxKSwgV1RDKDB4OGRkZDMyMDEpLAorICAgIFdUQygweDhkOWQ3NzgxKSwgV1RDKDB4OGQ1ZWFhMDEpLCBXVEMoMHg4ZDIwYzMwMSksIFdUQygweDhjZTNiYTgxKSwKKyAgICBXVEMoMHg4Y2E3ODc4MSksIFdUQygweDhjNmMxYjAxKSwgV1RDKDB4OGMzMTY2ODEpLCBXVEMoMHg4YmY3NWIwMSksCisgICAgV1RDKDB4OGJiZGU5ODEpLCBXVEMoMHg4Yjg1MDI4MSksIFdUQygweDhiNGM5NzAxKSwgV1RDKDB4OGIxNDk3MDEpLAorICAgIFdUQygweDhhZGNlZTAxKSwgV1RDKDB4OGFhNTg2ODEpLCBXVEMoMHg4YTZlNGEwMSksIFdUQygweDhhMzcyODgxKSwKKyAgICBXVEMoMHg4YTAwMWYwMSksIFdUQygweDg5YzkyZjgxKSwgV1RDKDB4ODk5MjVhODEpLCBXVEMoMHg4OTViY2QwMSksCisgICAgV1RDKDB4ODkyNWYxMDEpLCBXVEMoMHg4OGYxMzgwMSksIFdUQygweDg4YmUxNjgxKSwgV1RDKDB4ODg4ZDMxODEpLAorICAgIFdUQygweDg4NWY4NDgxKSwgV1RDKDB4ODgzNTM1MDEpLCBXVEMoMHg4ODEyNDI4MSksIFdUQygweDg3ZTczZDgxKSwKKyAgICBXVEMoMHg4N2Q0YWM4MSksIFdUQygweDg3Y2I1MTAxKSwgV1RDKDB4ODdjMDVlODEpLCBXVEMoMHg4N2I0MjQ4MSksCisgICAgV1RDKDB4ODdhNzBlODEpLCBXVEMoMHg4Nzk5OGYwMSksIFdUQygweDg3OGMxODgxKSwgV1RDKDB4ODc3ZWRlMDEpLAorICAgIFdUQygweDg3NzFjNjAxKSwgV1RDKDB4ODc2NGIxMDEpLCBXVEMoMHg4NzU3ODE4MSksIFdUQygweDg3NGEyZjAxKSwKKyAgICBXVEMoMHg4NzNjYzIwMSksIFdUQygweDg3MmY0MjAxKSwgV1RDKDB4ODcyMWI0ODEpLCBXVEMoMHg4NzE0MWIwMSksCisgICAgV1RDKDB4ODcwNjcyODEpLCBXVEMoMHg4NmY4YmE4MSksIFdUQygweDg2ZWFmMDgxKSwgV1RDKDB4ODZkZDE0ODEpLAorICAgIFdUQygweDg2Y2YyNjAxKSwgV1RDKDB4ODZjMTI0MDEpLCBXVEMoMHg4NmIzMGYwMSksIFdUQygweDg2YTRlNzgxKSwKKyAgICBXVEMoMHg4Njk2YWQwMSksIFdUQygweDg2ODg2MDAxKSwgV1RDKDB4ODY3YTAwODEpLCBXVEMoMHg4NjZiOGQ4MSksCisgICAgV1RDKDB4ODY1ZDA1ODEpLCBXVEMoMHg4NjRlNjkwMSksIFdUQygweDg2M2ZiNzAxKSwgV1RDKDB4ODYzMGYxODEpLAorICAgIFdUQygweDg2MjIxODAxKSwgV1RDKDB4ODYxMzJjMDEpLCBXVEMoMHg4NjA0MmMwMSksIFdUQygweDg1ZjUxNjgxKSwKKyAgICBXVEMoMHg4NWU1ZWI4MSksIFdUQygweDg1ZDZhOTgxKSwgV1RDKDB4ODVjNzUyMDEpLCBXVEMoMHg4NWI3ZTYwMSksCisgICAgV1RDKDB4ODVhODY1ODEpLCBXVEMoMHg4NTk4ZDA4MSksIFdUQygweDg1ODkyNjgxKSwgV1RDKDB4ODU3OTY2MDEpLAorICAgIFdUQygweDg1Njk4ZTgxKSwgV1RDKDB4ODU1OWEwODEpLCBXVEMoMHg4NTQ5OWQwMSksIFdUQygweDg1Mzk4NDgxKSwKKyAgICBXVEMoMHg4NTI5NTg4MSksIFdUQygweDg1MTkxODAxKSwgV1RDKDB4ODUwOGMxODEpLCBXVEMoMHg4NGY4NTU4MSksCisgICAgV1RDKDB4ODRlN2QzODEpLCBXVEMoMHg4NGQ3M2MwMSksIFdUQygweDg0YzY5MTAxKSwgV1RDKDB4ODRiNWQzMDEpLAorICAgIFdUQygweDg0YTUwMjAxKSwgV1RDKDB4ODQ5NDFkODEpLCBXVEMoMHg4NDgzMjQ4MSksIFdUQygweDg0NzIxNzAxKSwKKyAgICBXVEMoMHg4NDYwZjU4MSksIFdUQygweDg0NGZjMDgxKSwgV1RDKDB4ODQzZTdhODEpLCBXVEMoMHg4NDJkMjI4MSksCisgICAgV1RDKDB4ODQxYmI5ODEpLCBXVEMoMHg4NDBhM2U4MSksIFdUQygweDgzZjhiMDAxKSwgV1RDKDB4ODNlNzBmMDEpLAorICAgIFdUQygweDgzZDU1ZDAxKSwgV1RDKDB4ODNjMzlhODEpLCBXVEMoMHg4M2IxYzg4MSksIFdUQygweDgzOWZlODAxKSwKKyAgICBXVEMoMHg4MzhkZjgwMSksIFdUQygweDgzN2JmODAxKSwgV1RDKDB4ODM2OWU3ODEpLCBXVEMoMHg4MzU3YzcwMSksCisgICAgV1RDKDB4ODM0NTk4ODEpLCBXVEMoMHg4MzMzNWM4MSksIFdUQygweDgzMjExNTAxKSwgV1RDKDB4ODMwZWMwODEpLAorICAgIFdUQygweDgyZmM1ZjAxKSwgV1RDKDB4ODJlOWVmMDEpLCBXVEMoMHg4MmQ3NzIwMSksIFdUQygweDgyYzRlODAxKSwKKyAgICBXVEMoMHg4MmIyNTMwMSksIFdUQygweDgyOWZiNDAxKSwgV1RDKDB4ODI4ZDBiMDEpLCBXVEMoMHg4MjdhNTgwMSksCisgICAgV1RDKDB4ODI2Nzk5MDEpLCBXVEMoMHg4MjU0Y2YwMSksIFdUQygweDgyNDFmYTAxKSwgV1RDKDB4ODIyZjFiMDEpLAorICAgIFdUQygweDgyMWMzNDAxKSwgV1RDKDB4ODIwOTQ1ODEpLCBXVEMoMHg4MWY2NGYwMSksIFdUQygweDgxZTM0ZjgxKSwKKyAgICBXVEMoMHg4MWQwNDY4MSksIFdUQygweDgxYmQzNDAxKSwgV1RDKDB4ODFhYTE5ODEpLCBXVEMoMHg4MTk2Zjc4MSksCisgICAgV1RDKDB4ODE4M2NmODEpLCBXVEMoMHg4MTcwYTE4MSksIFdUQygweDgxNWQ2YzAxKSwgV1RDKDB4ODE0YTJmODEpLAorICAgIFdUQygweDgxMzZlYTAxKSwgV1RDKDB4ODEyMzlkODEpLCBXVEMoMHg4MTEwNGEwMSksIFdUQygweDgwZmNmMTgxKSwKKyAgICBXVEMoMHg4MGU5OTQwMSksIFdUQygweDgwZDYzMTAxKSwgV1RDKDB4ODBjMmM3ODEpLCBXVEMoMHg4MGFmNTcwMSksCisgICAgV1RDKDB4ODA5YmRmMDEpLCBXVEMoMHg4MDg4NjA4MSksIFdUQygweDgwNzRkYzAxKSwgV1RDKDB4ODA2MTUyODEpLAorICAgIFdUQygweDgwNGRjNDgxKSwgV1RDKDB4ODAzYTMzODEpLCBXVEMoMHg4MDI2OWY4MSksIFdUQygweDgwMTMwOTgxKSwKKyAgICBXVEMoMHgwYTYwODIyMCksIFdUQygweDBhOGVlN2QwKSwgV1RDKDB4MGFiZTM1YzApLCBXVEMoMHgwYWVlNWRlMCksCisgICAgV1RDKDB4MGIxZjUyMzApLCBXVEMoMHgwYjUxMDRhMCksIFdUQygweDBiODM2NzIwKSwgV1RDKDB4MGJiNjZiYjApLAorICAgIFdUQygweDBiZWEwNDQwKSwgV1RDKDB4MGMxZTIyYzApLCBXVEMoMHgwYzUyYmE3MCksIFdUQygweDBjODdjYTkwKSwKKyAgICBXVEMoMHgwY2JkNWJhMCksIFdUQygweDBjZjM3NWUwKSwgV1RDKDB4MGQyYTFmNTApLCBXVEMoMHgwZDYxNTQ4MCksCisgICAgV1RDKDB4MGQ5OTBlNDApLCBXVEMoMHgwZGQxNDUwMCksIFdUQygweDBlMDlmNzMwKSwgV1RDKDB4MGU0MzJlOTApLAorICAgIFdUQygweDBlN2NmNzkwKSwgV1RDKDB4MGViNzVlNTApLCBXVEMoMHgwZWYyNjQzMCksIFdUQygweDBmMmRmZDcwKSwKKyAgICBXVEMoMHgwZjZhMWQ3MCksIFdUQygweDBmYTZiN2UwKSwgV1RDKDB4MGZlM2MzZDApLCBXVEMoMHgxMDIxM2FjMCksCisgICAgV1RDKDB4MTA1ZjE2NDApLCBXVEMoMHgxMDlkNGYyMCksIFdUQygweDEwZGJkYjgwKSwgV1RDKDB4MTExYWIwYzApLAorICAgIFdUQygweDExNTljMzYwKSwgV1RDKDB4MTE5OTBmYzApLCBXVEMoMHgxMWQ4YTA2MCksIFdUQygweDEyMTg4MmMwKSwKKyAgICBXVEMoMHgxMjU4YzQ4MCksIFdUQygweDEyOTk1YTQwKSwgV1RDKDB4MTJkYTFiMDApLCBXVEMoMHgxMzFhZGI2MCksCisgICAgV1RDKDB4MTM1YjcwYzApLCBXVEMoMHgxMzliYjY4MCksIFdUQygweDEzZGI4YzAwKSwgV1RDKDB4MTQxYWQwODApLAorICAgIFdUQygweDE0NTk2NDYwKSwgV1RDKDB4MTQ5NzI5ZTApLCBXVEMoMHgxNGQ0MDRlMCksIFdUQygweDE1MGZkOGUwKSwKKyAgICBXVEMoMHgxNTRhODhjMCksIFdUQygweDE1ODNmNWUwKSwgV1RDKDB4MTViYzAxMjApLCBXVEMoMHgxNWYyOGJhMCksCisgICAgV1RDKDB4MTYyNzc5YTApLCBXVEMoMHgxNjVhYjMwMCksIFdUQygweDE2OGMyMDQwKSwgV1RDKDB4MTZiYmFhODApLAorICAgIFdUQygweDE2ZTk0MTIwKSwgV1RDKDB4MTcxNGQ5ZTApLCBXVEMoMHgxNzNlNjQ0MCksIFdUQygweDE3NjYwNjgwKSwKKyAgICBXVEMoMHgxNzhjYTAyMCksIFdUQygweDE3YjM2NDAwKSwgV1RDKDB4MTdkYjg0ZTApLCBXVEMoMHgxODA1ZDkyMCksCisgICAgV1RDKDB4MTgzMjg0MDApLCBXVEMoMHgxODYxN2NjMCksIFdUQygweDE4OTJiZmEwKSwgV1RDKDB4MThjNjQ1NDApLAorICAgIFdUQygweDE4ZmMwNDAwKSwgV1RDKDB4MTkzM2YxNDApLCBXVEMoMHgxOTZlMDMyMCksIFdUQygweDE5YWEyZmMwKSwKKyAgICBXVEMoMHgxOWU4NmQ4MCksIFdUQygweDFhMjhiMmUwKSwgV1RDKDB4MWE2YWY3MDApLCBXVEMoMHgxYWFmMzMyMCksCisgICAgV1RDKDB4MWFmNTYxODApLCBXVEMoMHgxYjNkN2NlMCksIFdUQygweDFiODc3YzQwKSwgV1RDKDB4MWJkMzUwYzApLAorICAgIFdUQygweDFjMjBlYTQwKSwgV1RDKDB4MWM3MDM4NDApLCBXVEMoMHgxY2MxMzg2MCksIFdUQygweDFkMTNmNzYwKSwKKyAgICBXVEMoMHgxZDY4ODQyMCksIFdUQygweDFkYmVlZDQwKSwgV1RDKDB4MWUxNzQ2NjApLCBXVEMoMHgxZTcxYTY0MCksCisgICAgV1RDKDB4MWVjZTI0MDApLCBXVEMoMHgxZjJjZDIyMCksIFdUQygweDFmOGRiM2MwKSwgV1RDKDB4MWZmMGMzZTApLAorICAgIFdUQygweDIwNTYwMDgwKSwgV1RDKDB4MjBiZDQ2YzApLCBXVEMoMHgyMTI2MzQwMCksIFdUQygweDIxOTA1NzQwKSwKKyAgICBXVEMoMHgyMWZiNDEwMCksIFdUQygweDIyNjZiYTgwKSwgV1RDKDB4MjJkMmQxNDApLCBXVEMoMHgyMzNmOTc4MCksCisgICAgV1RDKDB4MjNhZDI1YzApLCBXVEMoMHgyNDFiYzgwMCksIFdUQygweDI0OGJmMDQwKSwgV1RDKDB4MjRmZTEzODApLAorICAgIFdUQygweDI1NzI4MTgwKSwgV1RDKDB4MjVlOTBhMDApLCBXVEMoMHgyNjYxNDA4MCksIFdUQygweDI2ZGFiZGMwKSwKKyAgICBXVEMoMHgyNzU1MjU0MCksIFdUQygweDI3ZDAzMjAwKSwgV1RDKDB4Mjg0YmE1ODApLCBXVEMoMHgyOGM3NDBjMCksCisgICAgV1RDKDB4Mjk0MzFmODApLCBXVEMoMHgyOWJmYzljMCksIFdUQygweDJhM2RkMDgwKSwgV1RDKDB4MmFiZGMwMDApLAorICAgIFdUQygweDJiM2ZmZDAwKSwgV1RDKDB4MmJjNGNkODApLCBXVEMoMHgyYzRjN2Q0MCksIFdUQygweDJjZDcyZWMwKSwKKyAgICBXVEMoMHgyZDY0N2Y4MCksIFdUQygweDJkZjNjZDgwKSwgV1RDKDB4MmU4NDdkODApLCBXVEMoMHgyZjE1ZWE0MCksCisgICAgV1RDKDB4MmZhNzYwYzApLCBXVEMoMHgzMDM4MmI4MCksIFdUQygweDMwYzc5NDQwKSwgV1RDKDB4MzE1NTY2YzApLAorICAgIFdUQygweDMxZTIwODAwKSwgV1RDKDB4MzI2ZGU3YzApLCBXVEMoMHgzMmY5ODIwMCksIFdUQygweDMzODViYTAwKSwKKyAgICBXVEMoMHgzNDEzYmVjMCksIFdUQygweDM0YTRjNDgwKSwgV1RDKDB4MzUzOWJmMDApLCBXVEMoMHgzNWQyYzRjMCksCisgICAgV1RDKDB4MzY2ZjgzNDApLCBXVEMoMHgzNzBmYjgwMCksIFdUQygweDM3YjJjZjgwKSwgV1RDKDB4Mzg1N2E0ODApLAorICAgIFdUQygweDM4ZmNlZTgwKSwgV1RDKDB4MzlhMTY4NDApLCBXVEMoMHgzYTQ0MjJjMCksIFdUQygweDNhZTQ5NWMwKSwKKyAgICBXVEMoMHgzYjgyNDAwMCksIFdUQygweDNjMWNiNTAwKSwgV1RDKDB4M2NiNDM4YzApLCBXVEMoMHgzZDQ5OTRjMCksCisgICAgV1RDKDB4M2RkZDhmNDApLCBXVEMoMHgzZTcwZWMwMCksIFdUQygweDNmMDQ1ZTQwKSwgV1RDKDB4M2Y5ODkwODApLAorICAgIFdUQygweDQwMmUzMmZmKSwgV1RDKDB4NDBjNWMwN2YpLCBXVEMoMHg0MTVmNTQ3ZiksIFdUQygweDQxZmFmMDdmKSwKKyAgICBXVEMoMHg0Mjk4OTk3ZiksIFdUQygweDQzMzgzMDdmKSwgV1RDKDB4NDNkOTZiZmYpLCBXVEMoMHg0NDdiZmZmZiksCisgICAgV1RDKDB4NDUxZjljZmYpLCBXVEMoMHg0NWMzZGFmZiksIFdUQygweDQ2NjgzZWZmKSwgV1RDKDB4NDcwYzRjZmYpLAorICAgIFdUQygweDQ3YWY5M2ZmKSwgV1RDKDB4NDg1MWMzZmYpLCBXVEMoMHg0OGYyOWQ3ZiksIFdUQygweDQ5OTFkZTdmKSwKKyAgICBXVEMoMHg0YTJmNWU3ZiksIFdUQygweDRhY2IyODdmKSwgV1RDKDB4NGI2NTUzN2YpLCBXVEMoMHg0YmZkZjM3ZiksCisgICAgV1RDKDB4NGM5NTMzN2YpLCBXVEMoMHg0ZDJiNTFmZiksIFdUQygweDRkYzA5MWZmKSwgV1RDKDB4NGU1NTMzZmYpLAorICAgIFdUQygweDRlZTk2YjdmKSwgV1RDKDB4NGY3ZDYxZmYpLCBXVEMoMHg1MDExNDBmZiksIFdUQygweDUwYTUzMTdmKSwKKyAgICBXVEMoMHg1MTM5NWE3ZiksIFdUQygweDUxY2RkZjdmKSwgV1RDKDB4NTI2MmU2ZmYpLCBXVEMoMHg1MmY4ODVmZiksCisgICAgV1RDKDB4NTM4ZWI0N2YpLCBXVEMoMHg1NDI1NjBmZiksIFdUQygweDU0YmM3YjdmKSwgV1RDKDB4NTU1M2E4ZmYpLAorICAgIFdUQygweDU1ZWEzNWZmKSwgV1RDKDB4NTY3ZjY2ZmYpLCBXVEMoMHg1NzEyODk3ZiksIFdUQygweDU3YTMzYTdmKSwKKyAgICBXVEMoMHg1ODMxNTJmZiksIFdUQygweDU4YmNhNWZmKSwgV1RDKDB4NTk0NTMwZmYpLCBXVEMoMHg1OWNiNzlmZiksCisgICAgV1RDKDB4NWE1MDQ3ZmYpLCBXVEMoMHg1YWQ0NWVmZiksIFdUQygweDViNTg0ZTdmKSwgV1RDKDB4NWJkYzQxN2YpLAorICAgIFdUQygweDVjNjA0ODdmKSwgV1RDKDB4NWNlNDc2ZmYpLCBXVEMoMHg1ZDY4YzQ3ZiksIFdUQygweDVkZWQwNmZmKSwKKyAgICBXVEMoMHg1ZTcxMTFmZiksIFdUQygweDVlZjRiNWZmKSwgV1RDKDB4NWY3N2ExN2YpLCBXVEMoMHg1ZmY5NmFmZiksCisgICAgV1RDKDB4NjA3OWE3ZmYpLCBXVEMoMHg2MGY3ZjdmZiksIFdUQygweDYxNzQxN2ZmKSwgV1RDKDB4NjFlZGQ4N2YpLAorICAgIFdUQygweDYyNjRmZmZmKSwgV1RDKDB4NjJkOWE2ZmYpLCBXVEMoMHg2MzRjODE3ZiksIFdUQygweDYzYmU2NTdmKSwKKyAgICBXVEMoMHg2NDMwMjc3ZiksIFdUQygweDY0YTIyNDdmKSwgV1RDKDB4NjUxNDJiZmYpLCBXVEMoMHg2NTg2MDI3ZiksCisgICAgV1RDKDB4NjVmNzY5N2YpLCBXVEMoMHg2NjY4MDFmZiksIFdUQygweDY2ZDc1NmZmKSwgV1RDKDB4Njc0NGYwZmYpLAorICAgIFdUQygweDY3YjA3ODdmKSwgV1RDKDB4NjgxYTA3N2YpLCBXVEMoMHg2ODgxZWJmZiksIFdUQygweDY4ZTg3MDdmKSwKKyAgICBXVEMoMHg2OTRkY2VmZiksIFdUQygweDY5YjIxZTdmKSwgV1RDKDB4NmExNTZjZmYpLCBXVEMoMHg2YTc3Y2E3ZiksCisgICAgV1RDKDB4NmFkOTM3N2YpLCBXVEMoMHg2YjM5YTRmZiksIFdUQygweDZiOTkwMWZmKSwgV1RDKDB4NmJmNzNjZmYpLAorICAgIFdUQygweDZjNTQ0NTdmKSwgV1RDKDB4NmNiMDBhZmYpLCBXVEMoMHg2ZDBhN2JmZiksIFdUQygweDZkNjM4N2ZmKSwKKyAgICBXVEMoMHhhZTJjYmUwMSksIFdUQygweGFmNTI2ZDAxKSwgV1RDKDB4YjA3NTEyMDEpLCBXVEMoMHhiMTk0ZGE4MSksCisgICAgV1RDKDB4YjJiMWY0MDEpLCBXVEMoMHhiM2NjOGQwMSksIFdUQygweGI0ZTRkMjAxKSwgV1RDKDB4YjVmYWYxMDEpLAorICAgIFdUQygweGI3MGYxODgxKSwgV1RDKDB4YjgyMTczMDEpLCBXVEMoMHhiOTMyMTE4MSksIFdUQygweGJhNDBlZTAxKSwKKyAgICBXVEMoMHhiYjRlMDIwMSksIFdUQygweGJjNTk0NzgxKSwgV1RDKDB4YmQ2MmI4ODEpLCBXVEMoMHhiZTZhNTE4MSksCisgICAgV1RDKDB4YmY3MDBkMDEpLCBXVEMoMHhjMDczZTRjMCksIFdUQygweGMxNzVkMjQwKSwgV1RDKDB4YzI3NWNjODApLAorICAgIFdUQygweGMzNzNjYjgwKSwgV1RDKDB4YzQ2ZmNhMDApLCBXVEMoMHhjNTY5YzYwMCksIFdUQygweGM2NjFiZGMwKSwKKyAgICBXVEMoMHhjNzU3YWY4MCksIFdUQygweGM4NGI5ODQwKSwgV1RDKDB4YzkzZDczMDApLCBXVEMoMHhjYTJkM2E0MCksCisgICAgV1RDKDB4Y2IxYWVhNDApLCBXVEMoMHhjYzA2ODI4MCksIFdUQygweGNjZjAwNDgwKSwgV1RDKDB4Y2RkNzcyMDApLAorICAgIFdUQygweGNlYmNjYjQwKSwgV1RDKDB4Y2ZhMDBkODApLCBXVEMoMHhkMDgxMzU0MCksIFdUQygweGQxNjAzZjAwKSwKKyAgICBXVEMoMHhkMjNkMjk4MCksIFdUQygweGQzMTdmN2MwKSwgV1RDKDB4ZDNmMGFjNDApLCBXVEMoMHhkNGM3NDk4MCksCisgICAgV1RDKDB4ZDU5YmNmODApLCBXVEMoMHhkNjZlM2IwMCksIFdUQygweGQ3M2U4OTAwKSwgV1RDKDB4ZDgwY2I3NDApLAorICAgIFdUQygweGQ4ZDhjN2MwKSwgV1RDKDB4ZDlhMmJlMDApLCBXVEMoMHhkYTZhOWU0MCksIFdUQygweGRiMzA2YTQwKSwKKyAgICBXVEMoMHhkYmY0MjA4MCksIFdUQygweGRjYjViZTgwKSwgV1RDKDB4ZGQ3NTQxNDApLCBXVEMoMHhkZTMyYTkwMCksCisgICAgV1RDKDB4ZGVlZGY5YzApLCBXVEMoMHhkZmE3MzdjMCksIFdUQygweGUwNWU2NzQwKSwgV1RDKDB4ZTExMzg5MDApLAorICAgIFdUQygweGUxYzY5YWMwKSwgV1RDKDB4ZTI3NzlhNDApLCBXVEMoMHhlMzI2ODY4MCksIFdUQygweGUzZDM2MjYwKSwKKyAgICBXVEMoMHhlNDdlMzNhMCksIFdUQygweGU1MjZmZjgwKSwgV1RDKDB4ZTVjZGM5NjApLCBXVEMoMHhlNjcyOTEwMCksCisgICAgV1RDKDB4ZTcxNTU0NjApLCBXVEMoMHhlN2I2MTFjMCksIFdUQygweGU4NTRjYTIwKSwgV1RDKDB4ZThmMTgxODApLAorICAgIFdUQygweGU5OGMzY2EwKSwgV1RDKDB4ZWEyNGZmZTApLCBXVEMoMHhlYWJiY2IyMCksIFdUQygweGViNTA5YjYwKSwKKyAgICBXVEMoMHhlYmUzNmQwMCksIFdUQygweGVjNzQzZTAwKSwgV1RDKDB4ZWQwMzEwZTApLCBXVEMoMHhlZDhmZWFhMCksCisgICAgV1RDKDB4ZWUxYWQwNjApLCBXVEMoMHhlZWEzYzY0MCksIFdUQygweGVmMmFjZDYwKSwgV1RDKDB4ZWZhZmU2YTApLAorICAgIFdUQygweGYwMzMxMmYwKSwgV1RDKDB4ZjBiNDU4MDApLCBXVEMoMHhmMTMzYzIzMCksIFdUQygweGYxYjE1ZWYwKSwKKyAgICBXVEMoMHhmMjJkM2FmMCksIFdUQygweGYyYTc1YzgwKSwgV1RDKDB4ZjMxZmM0NjApLCBXVEMoMHhmMzk2NzNiMCksCisgICAgV1RDKDB4ZjQwYjZhMDApLCBXVEMoMHhmNDdlYTIzMCksIFdUQygweGY0ZjAxNDUwKSwgV1RDKDB4ZjU1ZmI5MzApLAorICAgIFdUQygweGY1Y2Q4NGMwKSwgV1RDKDB4ZjYzOTYwOTApLCBXVEMoMHhmNmEzMzNlMCksIFdUQygweGY3MGFlNTQwKSwKKyAgICBXVEMoMHhmNzcwNzI2MCksIFdUQygweGY3ZDNmNzIwKSwgV1RDKDB4ZjgzNTkyZjApLCBXVEMoMHhmODk1NjQ1MCksCisgICAgV1RDKDB4ZjhmMzgxMjApLCBXVEMoMHhmOTRmZjdjOCksIFdUQygweGY5YWFkNzQwKSwgV1RDKDB4ZmEwNDI5MjApLAorICAgIFdUQygweGZhNWJlMTEwKSwgV1RDKDB4ZmFiMWU3NzgpLCBXVEMoMHhmYjA2MjQ3OCksIFdUQygweGZiNTg4ZDc4KSwKKyAgICBXVEMoMHhmYmE5MzUzMCksIFdUQygweGZiZjgzNmM4KSwgV1RDKDB4ZmM0NWFjZTApLCBXVEMoMHhmYzkxYTI5NCksCisgICAgV1RDKDB4ZmNkYzBlNWMpLCBXVEMoMHhmZDI0ZTQzOCksIFdUQygweGZkNmMxN2RjKSwgV1RDKDB4ZmRiMTk3NTgpLAorICAgIFdUQygweGZkZjU0YzNjKSwgV1RDKDB4ZmUzNzFlZjgpLCBXVEMoMHhmZTc3MDFhYSksIFdUQygweGZlYjUwZDYyKSwKKyAgICBXVEMoMHhmZWYxNzAwYSksIFdUQygweGZmMmM1NTc0KSwgV1RDKDB4ZmY2NWVlN2IpLCBXVEMoMHhmZjllNzVkZSksCisgICAgV1RDKDB4ZmZkNjI4NjMpLCBXVEMoMHgwMDBkNDQwMSksIFdUQygweDAwNDNkMzQ1KSwgV1RDKDB4MDA3OTljZDApLAorICAgIFdUQygweDAwYWU1ZjQ5KSwgV1RDKDB4MDBlMWQ3YTQpLCBXVEMoMHgwMTEzYTZmMiksIFdUQygweDAxNDM1NzVjKSwKKyAgICBXVEMoMHgwMTcwNzAyNCksIFdUQygweDAxOWE5MzQ2KSwgV1RDKDB4MDFjMWNmMDgpLCBXVEMoMHgwMWU2NmMxMiksCisgICAgV1RDKDB4MDIwOGFjNDgpLCBXVEMoMHgwMjI4ZTg2OCksIFdUQygweDAyNDdhNmM4KSwgV1RDKDB4MDI2NTdhYTApLAorICAgIFdUQygweDAyODJmNzEwKSwgV1RDKDB4MDJhMDdlNTApLCBXVEMoMHgwMmJlMzFjMCksIFdUQygweDAyZGMyYjMwKSwKKyAgICBXVEMoMHgwMmZhN2YzNCksIFdUQygweDAzMThmYjEwKSwgV1RDKDB4MDMzNzJmZGMpLCBXVEMoMHgwMzU0YWU1NCksCisgICAgV1RDKDB4MDM3MTBkMTgpLCBXVEMoMHgwMzhiZmRiNCksIFdUQygweDAzYTU0MDg0KSwgV1RDKDB4MDNiYzkyYjgpLAorICAgIFdUQygweDAzZDFjNzEwKSwgV1RDKDB4MDNlNGRkMjApLCBXVEMoMHgwM2Y1ZTI1YyksIFdUQygweDA0MDRlMjE4KSwKKyAgICBXVEMoMHgwNDExZmMzMCksIFdUQygweDA0MWQ2YjMwKSwgV1RDKDB4MDQyNzZjZDApLCBXVEMoMHgwNDMwM2UwMCksCisgICAgV1RDKDB4MDQzODE1MjgpLCBXVEMoMHgwNDNmMjMxMCksIFdUQygweDA0NDU5OTA4KSwgV1RDKDB4MDQ0YmE0MzApLAorICAgIFdUQygweDA0NTE2MWY4KSwgV1RDKDB4MDQ1NmU2ZjgpLCBXVEMoMHgwNDVjNDlhOCksIFdUQygweDA0NjE5MmY4KSwKKyAgICBXVEMoMHgwNDY2YWY0MCksIFdUQygweDA0NmI4MjQwKSwgV1RDKDB4MDQ2ZmYwZDgpLCBXVEMoMHgwNDczZGUxOCksCisgICAgV1RDKDB4MDQ3NzJiNTgpLCBXVEMoMHgwNDc5YjlhMCksIFdUQygweDA0N2I2YTMwKSwgV1RDKDB4MDQ3YzIwODgpLAorICAgIFdUQygweDA0N2JjMjMwKSwgV1RDKDB4MDQ3YTM0MTgpLCBXVEMoMHgwNDc3NjA5OCksIFdUQygweDA0NzM0NzkwKSwKKyAgICBXVEMoMHgwNDZkZjRjMCksIFdUQygweDA0Njc3MjIwKSwgV1RDKDB4MDQ1ZmQxYjApLCBXVEMoMHgwNDU3MzU4OCksCisgICAgV1RDKDB4MDQ0ZGM0YjgpLCBXVEMoMHgwNDQzYTViOCksIFdUQygweDA0MzkwMTYwKSwgV1RDKDB4MDQyZTAzOTgpLAorICAgIFdUQygweDA0MjJkOGMwKSwgV1RDKDB4MDQxN2FhMzApLCBXVEMoMHgwNDBjN2NlMCksIFdUQygweDA0MDEzNmUwKSwKKyAgICBXVEMoMHgwM2Y1YmViMCksIFdUQygweDAzZTlmOGVjKSwgV1RDKDB4MDNkZGM0ODQpLCBXVEMoMHgwM2QwZmQ5YyksCisgICAgV1RDKDB4MDNjMzdmYTApLCBXVEMoMHgwM2I1MzAxNCksIFdUQygweDAzYTYwYTE4KSwgV1RDKDB4MDM5NjBmODgpLAorICAgIFdUQygweDAzODU0MTEwKSwgV1RDKDB4MDM3M2FkOWMpLCBXVEMoMHgwMzYxNzY5NCksIFdUQygweDAzNGViZjljKSwKKyAgICBXVEMoMHgwMzNiYWIzMCksIFdUQygweDAzMjg0ZWYwKSwgV1RDKDB4MDMxNGI1OTgpLCBXVEMoMHgwMzAwZWE1NCksCisgICAgV1RDKDB4MDJlY2Y1MjQpLCBXVEMoMHgwMmQ4ZDIxMCksIFdUQygweDAyYzQ3NmFjKSwgV1RDKDB4MDJhZmQ5NDApLAorICAgIFdUQygweDAyOWFlZTRjKSwgV1RDKDB4MDI4NWE2ZjQpLCBXVEMoMHgwMjZmZjM5OCksIFdUQygweDAyNTljNDQ4KSwKKyAgICBXVEMoMHgwMjQzMTdjYyksIFdUQygweDAyMmMwMDg0KSwgV1RDKDB4MDIxNDkzMTApLCBXVEMoMHgwMWZjZTMzNCksCisgICAgV1RDKDB4MDFlNGZiMjQpLCBXVEMoMHgwMWNjZGQwYSksIFdUQygweDAxYjQ4YjIwKSwgV1RDKDB4MDE5YzA3N2UpLAorICAgIFdUQygweDAxODM1NDMyKSwgV1RDKDB4MDE2YTczM2MpLCBXVEMoMHgwMTUxNjZhNiksIFdUQygweDAxMzgzMDJlKSwKKyAgICBXVEMoMHgwMTFlZDBmNiksIFdUQygweDAxMDU0OWY4KSwgV1RDKDB4MDBlYjljMjUpLCBXVEMoMHgwMGQxY2FhNiksCisgICAgV1RDKDB4MDBiN2RiOTQpLCBXVEMoMHgwMDlkZDU2MCksIFdUQygweDAwODNiZTc1KSwgV1RDKDB4MDA2OTlkNDEpLAorICAgIFdUQygweDAwNGY3ODJmKSwgV1RDKDB4MDAzNTU1YWIpLCBXVEMoMHgwMDFiM2MyMSksIFdUQygweDAwMDEzMWZlKSwKKyAgICBXVEMoMHhkNjFjZmM0MCksIFdUQygweGQ1YWNiMzQwKSwgV1RDKDB4ZDUzZDQ0MDApLCBXVEMoMHhkNGNlYTZjMCksCisgICAgV1RDKDB4ZDQ2MGQ0NDApLCBXVEMoMHhkM2YzYzQ0MCksIFdUQygweGQzODc2ZjgwKSwgV1RDKDB4ZDMxYmNlNDApLAorICAgIFdUQygweGQyYjBkOTAwKSwgV1RDKDB4ZDI0Njg5ODApLCBXVEMoMHhkMWRjZWYwMCksIFdUQygweGQxNzQyOWMwKSwKKyAgICBXVEMoMHhkMTBjNWI4MCksIFdUQygweGQwYTU5YjgwKSwgV1RDKDB4ZDAzZmQ3ODApLCBXVEMoMHhjZmRhZTc4MCksCisgICAgV1RDKDB4Y2Y3NmEzODApLCBXVEMoMHhjZjEyZmFjMCksIFdUQygweGNlYjAxMTAwKSwgV1RDKDB4Y2U0ZTE4YzApLAorICAgIFdUQygweGNkZWQ0NDQwKSwgV1RDKDB4Y2Q4ZDlhNDApLCBXVEMoMHhjZDJlZTgwMCksIFdUQygweGNjZDBmNDQwKSwKKyAgICBXVEMoMHhjYzczODc4MCksIFdUQygweGNjMTY3ZDQwKSwgV1RDKDB4Y2JiOWMxODApLCBXVEMoMHhjYjVkNDA0MCksCisgICAgV1RDKDB4Y2IwMGUyNDApLCBXVEMoMHhjYWE0ODAwMCksIFdUQygweGNhNDdlYWMwKSwgV1RDKDB4YzllYWYxYzApLAorICAgIFdUQygweGM5OGQ4MTAwKSwgV1RDKDB4YzkyZmM1ODApLCBXVEMoMHhjOGQxZmM4MCksIFdUQygweGM4NzQ2NDgwKSwKKyAgICBXVEMoMHhjODE2ZGM0MCksIFdUQygweGM3YjhjMjgwKSwgV1RDKDB4Yzc1OTY4MDApLCBXVEMoMHhjNmY4MWY4MCksCisgICAgV1RDKDB4YzY5NDU3NDApLCBXVEMoMHhjNjJkOTNjMCksIFdUQygweGM1YzM1OGMwKSwgV1RDKDB4YzU1NTJiODApLAorICAgIFdUQygweGM0ZTI5MjQwKSwgV1RDKDB4YzQ2YjE0NDApLCBXVEMoMHhjM2VlMzg0MCksIFdUQygweGMzNmI4NTAwKSwKKyAgICBXVEMoMHhjMmUyODA0MCksIFdUQygweGMyNTJhZTgwKSwgV1RDKDB4YzFiYjk1NDApLCBXVEMoMHhjMTFjYzIwMCksCisgICAgV1RDKDB4YzA3NWNmMDApLCBXVEMoMHhiZmM2NTc4MSksIFdUQygweGJmMGRmODgxKSwgV1RDKDB4YmU0YzZmMDEpLAorICAgIFdUQygweGJkODE5NDAxKSwgV1RDKDB4YmNhZDJkMDEpLCBXVEMoMHhiYmNmYjk4MSksIFdUQygweGJhZWNhNjgxKSwKKyAgICBXVEMoMHhiYTA4ZTc4MSksIFdUQygweGI5Mjk3MDgxKSwgV1RDKDB4Yjg1MWUwODEpLCBXVEMoMHhiNzgyZWQwMSksCisgICAgV1RDKDB4YjZiYzZhODEpLCBXVEMoMHhiNWZlNDk4MSksIFdUQygweGI1NDg3MjgxKSwgV1RDKDB4YjQ5YWQwODEpLAorICAgIFdUQygweGIzZjU0ZDgxKSwgV1RDKDB4YjM1N2Q0MDEpLCBXVEMoMHhiMmMyNGUwMSksIFdUQygweGIyMzRhNjgxKSwKKyAgICBXVEMoMHhiMWFlYzcwMSksIFdUQygweGIxMzA5YjAxKSwgV1RDKDB4YjBiYTBjMDEpLCBXVEMoMHhiMDRiMDQ4MSksCisgICAgV1RDKDB4YWZlMzZmMDEpLCBXVEMoMHhhZjgzMzYwMSksIFdUQygweGFmMmE0MzgxKSwgV1RDKDB4YWVkODgyMDEpLAorICAgIFdUQygweGFlOGRkYjgxKSwgV1RDKDB4YWU0YTNiODEpLCBXVEMoMHhhZTBkOGIwMSksIFdUQygweGFkZDdiNTgxKSwKKyAgICBXVEMoMHhhZGE4YTQ4MSksIFdUQygweGFkODA0MjgxKSwgV1RDKDB4YWQ1ZTdhODEpLCBXVEMoMHhhZDQzMzYwMSksCisgICAgV1RDKDB4YWQyZTYwMDEpLCBXVEMoMHhhZDFmZTI4MSksIFdUQygweGFkMTdhODAxKSwgV1RDKDB4YWQxNTlhODEpLAorICAgIFdUQygweGFkMTlhNTAxKSwgV1RDKDB4YWQyM2IxMDEpLCBXVEMoMHhhZDMzYWEwMSksIFdUQygweGFkNDk3OTgxKSwKKyAgICBXVEMoMHhhZDY1MGEwMSksIFdUQygweGFkODY0NjAxKSwgV1RDKDB4YWRhZDE3ODEpLCBXVEMoMHhhZGQ5Njk4MSksCisgICAgV1RDKDB4YWUwYjI2MDEpLCBXVEMoMHhhZTQyMzc4MSksIFdUQygweGFlN2U4ODAxKSwgV1RDKDB4YWVjMDAyMDEpLAorICAgIFdUQygweGFmMDY5MDgxKSwgV1RDKDB4YWY1MjFjODEpLCBXVEMoMHhhZmEyOTIwMSksIFdUQygweGFmZjdkYTAxKSwKKyAgICBXVEMoMHhiMDUxZGYwMSksIFdUQygweGIwYjA4YzgxKSwgV1RDKDB4YjExM2NiODEpLCBXVEMoMHhiMTdiODcwMSksCisgICAgV1RDKDB4YjFlN2E5ODEpLCBXVEMoMHhiMjU4MWQ4MSksIFdUQygweGIyY2NjYzgxKSwgV1RDKDB4YjM0NWExODEpLAorICAgIFdUQygweGIzYzI4NzAxKSwgV1RDKDB4YjQ0MzY2ODEpLCBXVEMoMHhiNGM4MmI4MSksIFdUQygweGI1NTBiZjgxKSwKKyAgICBXVEMoMHhiNWRkMGQwMSksIFdUQygweGI2NmNmZjAxKSwgV1RDKDB4YjcwMDdmMDEpLCBXVEMoMHhiNzk3Nzc4MSksCisgICAgV1RDKDB4YjgzMWQzODEpLCBXVEMoMHhiOGNmN2QwMSksIFdUQygweGI5NzA1ZTAxKSwgV1RDKDB4YmExNDYxMDEpLAorICAgIFdUQygweGJhYmI3MDgxKSwgV1RDKDB4YmI2NTc3ODEpLCBXVEMoMHhiYzEyNWYwMSksIFdUQygweGJjYzIxMjgxKSwKKyAgICBXVEMoMHhiZDc0N2I4MSksIFdUQygweGJlMjk4NTgxKSwgV1RDKDB4YmVlMTE5ODEpLCBXVEMoMHhiZjliMjMwMSksCisgICAgV1RDKDB4YzA1NzhiODApLCBXVEMoMHhjMTE2M2RjMCksIFdUQygweGMxZDcyNDAwKSwgV1RDKDB4YzI5YTI4YzApLAorICAgIFdUQygweGMzNWYzNjQwKSwgV1RDKDB4YzQyNjM2YzApLCBXVEMoMHhjNGVmMTUwMCksIFdUQygweGM1YjliYjAwKSwKKyAgICBXVEMoMHhjNjg2MTM0MCksIFdUQygweGM3NTQwODQwKSwgV1RDKDB4YzgyMzg0MDApLCBXVEMoMHhjOGY0NzEwMCksCisgICAgV1RDKDB4YzljNmI5YzApLCBXVEMoMHhjYTlhNDg0MCksIFdUQygweGNiNmYwNzgwKSwgV1RDKDB4Y2M0NGUxNDApLAorICAgIFdUQygweGNkMWJjMDAwKSwgV1RDKDB4Y2RmMzhlMDApLCBXVEMoMHhjZWNjMzYwMCksIFdUQygweGNmYTVhMjQwKSwKKyAgICBXVEMoMHhkMDdmYmNjMCksIFdUQygweGQxNWE3MDQwKSwgV1RDKDB4ZDIzNWE2YzApLCBXVEMoMHhkMzExNGIwMCksCisgICAgV1RDKDB4ZDNlZDQ3NDApLCBXVEMoMHhkNGM5ODU4MCksIFdUQygweGQ1YTVmMDgwKSwgV1RDKDB4ZDY4MjcyODApLAorICAgIFdUQygweGQ3NWVmNjAwKSwgV1RDKDB4ZDgzYjY1MDApLCBXVEMoMHhkOTE3YWEwMCksIFdUQygweGQ5ZjNhZjgwKSwKKyAgICBXVEMoMHhkYWNmNWZjMCksIFdUQygweGRiYWFhNTQwKSwgV1RDKDB4ZGM4NTZhMDApLCBXVEMoMHhkZDVmOThjMCksCisgICAgV1RDKDB4ZGUzOTFiYzApLCBXVEMoMHhkZjExZGQ0MCksIFdUQygweGRmZTljNzgwKSwgV1RDKDB4ZTBjMGM1NDApLAorICAgIFdUQygweGUxOTZjMDgwKSwgV1RDKDB4ZTI2YmEzYzApLCBXVEMoMHhlMzNmNTk2MCksIFdUQygweGU0MTFjYmEwKSwKKyAgICBXVEMoMHhlNGUyZTUwMCksIFdUQygweGU1YjI4ZmMwKSwgV1RDKDB4ZTY4MGI2NDApLCBXVEMoMHhlNzRkNDJlMCksCisgICAgV1RDKDB4ZTgxODFmZTApLCBXVEMoMHhlOGUxMzdlMCksIFdUQygweGU5YTg3NTAwKSwgV1RDKDB4ZWE2ZGMxYTApLAorICAgIFdUQygweGViMzEwODIwKSwgV1RDKDB4ZWJmMjMzMDApLCBXVEMoMHhlY2IxMmM2MCksIFdUQygweGVkNmRkZWUwKSwKKyAgICBXVEMoMHhlZTI4MzRhMCksIFdUQygweGVlZTAxODAwKSwgV1RDKDB4ZWY5NTczODApLCBXVEMoMHhmMDQ4MzE2MCksCisgICAgV1RDKDB4ZjBmODNjMDApLCBXVEMoMHhmMWE1N2RiMCksIFdUQygweGYyNGZlMGYwKSwgV1RDKDB4ZjJmNzRmZjApLAorICAgIFdUQygweGYzOWJiNTMwKSwgV1RDKDB4ZjQzY2ZhZjApLCBXVEMoMHhmNGRiMGI5MCksIFdUQygweGY1NzVkMTgwKSwKKyAgICBXVEMoMHhmNjBkMzcwMCksIFdUQygweGY2YTEyNjgwKSwgV1RDKDB4ZjczMThhNTApLCBXVEMoMHhmN2JlNGNjMCksCisgICAgV1RDKDB4Zjg0NzU4NTApLCBXVEMoMHhmOGNjOTczOCksIFdUQygweGY5NGRmM2UwKSwgV1RDKDB4ZjljYjU4YTgpLAorICAgIFdUQygweGZhNDRhZmUwKSwgV1RDKDB4ZmFiOWUzZTgpLCBXVEMoMHhmYjJhZGYyMCksIFdUQygweGZiOTc4YmU4KSwKKyAgICBXVEMoMHhmYmZmZDQ4OCksIFdUQygweGZjNjNhMzcwKSwgV1RDKDB4ZmNjMmUyZjApLCBXVEMoMHhmZDFkN2Q2NCksCisgICAgV1RDKDB4ZmQ3MzVkMmMpLCBXVEMoMHhmZGM0NmM5YyksIFdUQygweGZlMTA5NjE4KSwgV1RDKDB4ZmU1N2MzZjQpLAorICAgIFdUQygweGZlOTllMDkwKSwgV1RDKDB4ZmVkNmQ2NDQpLCBXVEMoMHhmZjBlOGY2ZSksIFdUQygweGZmNDBmNjY3KSwKKyAgICBXVEMoMHhmZjZkZjU4YyksIFdUQygweGZmOTU3NzM4KSwgV1RDKDB4ZmZiNzY1YzUpLCBXVEMoMHhmZmQzYWI5MCksCisgICAgV1RDKDB4ZmZlYTMyZjQpLCBXVEMoMHhmZmZhZTY0YyksIFdUQygweDAwMDVhZmYzKSwgV1RDKDB4MDAwYTdhNDQpLAorICAgIFdUQygweDAwMDkyZjljKSwgV1RDKDB4MDAwMWJhNTQpLCBXVEMoMHhmZmY0MDRjYSksIFdUQygweGZmZGZmOTU3KX07CiAKIC8qCiAgKiBUTlNfTUFYX0JBTkRTCiAgKiBlbnRyeSBmb3IgZWFjaCBzYW1wbGluZyByYXRlCiAgKiAgMSAgbG9uZyB3aW5kb3cKICAqICAyICBTSE9SVCB3aW5kb3cKLSovCi1jb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibFsxM11bMl0gPQotewotICB7IDMxLCAgOSB9LCAvKiA5NjAwMCAqLwotICB7IDMxLCAgOSB9LCAvKiA4ODIwMCAqLwotICB7IDM0LCAxMCB9LCAvKiA2NDAwMCAqLwotICB7IDQwLCAxNCB9LCAvKiA0ODAwMCAqLwotICB7IDQyLCAxNCB9LCAvKiA0NDEwMCAqLwotICB7IDUxLCAxNCB9LCAvKiAzMjAwMCAqLwotICB7IDQ2LCAxNCB9LCAvKiAyNDAwMCAqLwotICB7IDQ2LCAxNCB9LCAvKiAyMjA1MCAqLwotICB7IDQyLCAxNCB9LCAvKiAxNjAwMCAqLwotICB7IDQyLCAxNCB9LCAvKiAxMjAwMCAqLwotICB7IDQyLCAxNCB9LCAvKiAxMTAyNSAqLwotICB7IDM5LCAxNCB9LCAvKiAgODAwMCAqLwotICB7IDM5LCAxNCB9LCAvKiAgNzM1MCAqLworICovCitjb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibFsxM11bMl0gPSB7CisgICAgezMxLCA5fSwgIC8qIDk2MDAwICovCisgICAgezMxLCA5fSwgIC8qIDg4MjAwICovCisgICAgezM0LCAxMH0sIC8qIDY0MDAwICovCisgICAgezQwLCAxNH0sIC8qIDQ4MDAwICovCisgICAgezQyLCAxNH0sIC8qIDQ0MTAwICovCisgICAgezUxLCAxNH0sIC8qIDMyMDAwICovCisgICAgezQ2LCAxNH0sIC8qIDI0MDAwICovCisgICAgezQ2LCAxNH0sIC8qIDIyMDUwICovCisgICAgezQyLCAxNH0sIC8qIDE2MDAwICovCisgICAgezQyLCAxNH0sIC8qIDEyMDAwICovCisgICAgezQyLCAxNH0sIC8qIDExMDI1ICovCisgICAgezM5LCAxNH0sIC8qICA4MDAwICovCisgICAgezM5LCAxNH0sIC8qICA3MzUwICovCiB9OwogCiAvKiBUTlNfTUFYX0JBTkRTIGZvciBsb3cgZGVsYXkuIFRoZSBhcnJheSBpbmRleCBpcyB0aGUgc2FtcGxlUmF0ZUluZGV4ICovCiBjb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibF80ODBbMTNdID0gewotICAzMSwgLyogOTYwMDAgKi8KLSAgMzEsIC8qIDg4MjAwICovCi0gIDMxLCAvKiA2NDAwMCAqLwotICAzMSwgLyogNDgwMDAgKi8KLSAgMzIsIC8qIDQ0MTAwICovCi0gIDM3LCAvKiAzMjAwMCAqLwotICAzMCwgLyogMjQwMDAgKi8KLSAgMzAsIC8qIDIyMDUwICovCi0gIDMwLCAvKiAxNjAwMCAqLwotICAzMCwgLyogMTIwMDAgKi8KLSAgMzAsIC8qIDExMDI1ICovCi0gIDMwLCAvKiAgODAwMCAqLwotICAzMCAgLyogIDczNTAgKi8KKyAgICAzMSwgLyogOTYwMDAgKi8KKyAgICAzMSwgLyogODgyMDAgKi8KKyAgICAzMSwgLyogNjQwMDAgKi8KKyAgICAzMSwgLyogNDgwMDAgKi8KKyAgICAzMiwgLyogNDQxMDAgKi8KKyAgICAzNywgLyogMzIwMDAgKi8KKyAgICAzMCwgLyogMjQwMDAgKi8KKyAgICAzMCwgLyogMjIwNTAgKi8KKyAgICAzMCwgLyogMTYwMDAgKi8KKyAgICAzMCwgLyogMTIwMDAgKi8KKyAgICAzMCwgLyogMTEwMjUgKi8KKyAgICAzMCwgLyogIDgwMDAgKi8KKyAgICAzMCAgLyogIDczNTAgKi8KIH07CiBjb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibF81MTJbMTNdID0gewotICAzMSwgLyogOTYwMDAgKi8KLSAgMzEsIC8qIDg4MjAwICovCi0gIDMxLCAvKiA2NDAwMCAqLwotICAzMSwgLyogNDgwMDAgKi8KLSAgMzIsIC8qIDQ0MTAwICovCi0gIDM3LCAvKiAzMjAwMCAqLwotICAzMSwgLyogMjQwMDAgKi8KLSAgMzEsIC8qIDIyMDUwICovCi0gIDMxLCAvKiAxNjAwMCAqLwotICAzMSwgLyogMTIwMDAgKi8KLSAgMzEsIC8qIDExMDI1ICovCi0gIDMxLCAvKiAgODAwMCAqLwotICAzMSAgLyogIDczNTAgKi8KKyAgICAzMSwgLyogOTYwMDAgKi8KKyAgICAzMSwgLyogODgyMDAgKi8KKyAgICAzMSwgLyogNjQwMDAgKi8KKyAgICAzMSwgLyogNDgwMDAgKi8KKyAgICAzMiwgLyogNDQxMDAgKi8KKyAgICAzNywgLyogMzIwMDAgKi8KKyAgICAzMSwgLyogMjQwMDAgKi8KKyAgICAzMSwgLyogMjIwNTAgKi8KKyAgICAzMSwgLyogMTYwMDAgKi8KKyAgICAzMSwgLyogMTIwMDAgKi8KKyAgICAzMSwgLyogMTEwMjUgKi8KKyAgICAzMSwgLyogIDgwMDAgKi8KKyAgICAzMSAgLyogIDczNTAgKi8KIH07CiAKICNkZWZpbmUgVENDKHgpIChGSVhQX0RCTCh4KSkKIAotY29uc3QgRklYUF9UQ0MgRkRLYWFjRGVjX3Ruc0NvZWZmMyBbOF0gPQotewotICBUQ0MoMHg4MWYxZDFkNCksIFRDQygweDkxMjYxNDZjKSwgVENDKDB4YWRiOTIyYzQpLCBUQ0MoMHhkNDM4YWYxZiksCi0gIFRDQygweDAwMDAwMDAwKSwgVENDKDB4Mzc4OTgwOWIpLCBUQ0MoMHg2NDEzMGRkNCksIFRDQygweDdjY2E3MDE2KQotfTsKLWNvbnN0IEZJWFBfVENDIEZES2FhY0RlY190bnNDb2VmZjQgWzE2XSA9Ci17Ci0gIFRDQygweDgwOGJjODQyKSwgVENDKDB4ODRlMmU1OGMpLCBUQ0MoMHg4ZDZiNDlkMSksIFRDQygweDk5ZGE5MjBhKSwKLSAgVENDKDB4YTljNDU3MTMpLCBUQ0MoMHhiYzlkZGViOSksIFRDQygweGQxYzJkNTFiKSwgVENDKDB4ZTg3YWU1M2QpLAotICBUQ0MoMHgwMDAwMDAwMCksIFRDQygweDFhOWNkOWI2KSwgVENDKDB4MzQwZmYyNTQpLCBUQ0MoMHg0YjNjOGMyOSksCi0gIFRDQygweDVmMWY1ZWJiKSwgVENDKDB4NmVkOWViYmEpLCBUQ0MoMHg3OWJjMzg1ZiksIFRDQygweDdmNGM3ZTViKQotfTsKK2NvbnN0IEZJWFBfVENDIEZES2FhY0RlY190bnNDb2VmZjNbOF0gPSB7CisgICAgVENDKDB4ODFmMWQxZDQpLCBUQ0MoMHg5MTI2MTQ2YyksIFRDQygweGFkYjkyMmM0KSwgVENDKDB4ZDQzOGFmMWYpLAorICAgIFRDQygweDAwMDAwMDAwKSwgVENDKDB4Mzc4OTgwOWIpLCBUQ0MoMHg2NDEzMGRkNCksIFRDQygweDdjY2E3MDE2KX07Citjb25zdCBGSVhQX1RDQyBGREthYWNEZWNfdG5zQ29lZmY0WzE2XSA9IHsKKyAgICBUQ0MoMHg4MDhiYzg0MiksIFRDQygweDg0ZTJlNThjKSwgVENDKDB4OGQ2YjQ5ZDEpLCBUQ0MoMHg5OWRhOTIwYSksCisgICAgVENDKDB4YTljNDU3MTMpLCBUQ0MoMHhiYzlkZGViOSksIFRDQygweGQxYzJkNTFiKSwgVENDKDB4ZTg3YWU1M2QpLAorICAgIFRDQygweDAwMDAwMDAwKSwgVENDKDB4MWE5Y2Q5YjYpLCBUQ0MoMHgzNDBmZjI1NCksIFRDQygweDRiM2M4YzI5KSwKKyAgICBUQ0MoMHg1ZjFmNWViYiksIFRDQygweDZlZDllYmJhKSwgVENDKDB4NzliYzM4NWYpLCBUQ0MoMHg3ZjRjN2U1Yil9OwogCi0vKiBNUEVHIGxpa2UgbWFwcGluZyAobm8gY2hhbmdlKS4gKi8KLWNvbnN0IFVDSEFSIGNoYW5uZWxNYXBwaW5nVGFibGVQYXNzdGhyb3VnaFsxNV1bOF0gPQotewotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICBmYWxsYmFjayAgKi8KLSAgICAgeyAwLCAgMSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NX0sICAvKiAgbW9ubyAvIFBTICovCi0gICAgIHsgMCwgIDEsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTV9LCAgLyogIHN0ZXJlbyAgICAqLwotICAgICB7IDAsICAxLCAgMiwyNTUsMjU1LDI1NSwyNTUsMjU1fSwgIC8qICAzY2ggICAgICAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLDI1NSwyNTUsMjU1LDI1NX0sICAvKiAgNGNoICAgICAgICovCi0gICAgIHsgMCwgIDEsICAyLCAgMywgIDQsMjU1LDI1NSwyNTV9LCAgLyogIDVjaCAgICAgICAqLwotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwyNTUsMjU1fSwgIC8qICA1LjFjaCAgICAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgNy4xIGZyb250ICovCi0gICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9LCAgLyogIHJlc2VydmVkICAqLwotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICByZXNlcnZlZCAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgcmVzZXJ2ZWQgICovCi0gICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwyNTV9LCAgLyogIDYuMWNoICAgICAqLwotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICA3LjEgcmVhciAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgcmVzZXJ2ZWQgICovCi0gICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9ICAgLyogIDcuMSB0b3AgICAqLworY29uc3QgVUNIQVIgRkRLYWFjRGVjX3Ruc0NvZWZmM19nYWluX2xkW10gPSB7CisgICAgMywgMSwgMSwgMSwgMCwgMSwgMSwgMywKIH07Ci0KLS8qIFdBViBmaWxlIGxpa2UgbWFwcGluZyAoZnJvbSBNUEVHIG1hcHBpbmcpLiAqLwotY29uc3QgVUNIQVIgY2hhbm5lbE1hcHBpbmdUYWJsZVdBVlsxNV1bOF0gPQotewotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICBmYWxsYmFjayAgKi8KLSAgICAgeyAwLCAgMSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NX0sICAvKiAgbW9ubyAvIFBTICovCi0gICAgIHsgMCwgIDEsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTV9LCAgLyogIHN0ZXJlbyAgICAqLwotICAgICB7IDIsICAwLCAgMSwyNTUsMjU1LDI1NSwyNTUsMjU1fSwgIC8qICAzY2ggICAgICAgKi8KLSAgICAgeyAyLCAgMCwgIDEsICAzLDI1NSwyNTUsMjU1LDI1NX0sICAvKiAgNGNoICAgICAgICovCi0gICAgIHsgMiwgIDAsICAxLCAgMywgIDQsMjU1LDI1NSwyNTV9LCAgLyogIDVjaCAgICAgICAqLwotICAgICB7IDIsICAwLCAgMSwgIDQsICA1LCAgMywyNTUsMjU1fSwgIC8qICA1LjFjaCAgICAgKi8KLSAgICAgeyAyLCAgNiwgIDcsICAwLCAgMSwgIDQsICA1LCAgM30sICAvKiAgNy4xIGZyb250ICovCi0gICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9LCAgLyogIHJlc2VydmVkICAqLwotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICByZXNlcnZlZCAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgcmVzZXJ2ZWQgICovCi0gICAgIHsgMiwgIDAsICAxLCAgNCwgIDUsICA2LCAgMywyNTV9LCAgLyogIDYuMWNoICAgICAqLwotICAgICB7IDIsICAwLCAgMSwgIDYsICA3LCAgNCwgIDUsICAzfSwgIC8qICA3LjEgcmVhciAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgcmVzZXJ2ZWQgICovCi0gICAgIHsgMiwgIDAsICAxLCAgNCwgIDUsICAzLCAgNiwgIDd9ICAgLyogIDcuMSB0b3AgICAqLworY29uc3QgVUNIQVIgRkRLYWFjRGVjX3Ruc0NvZWZmNF9nYWluX2xkW10gPSB7CisgICAgNCwgMiwgMiwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgNCwKIH07CiAKIC8qIExvb2t1cCB0YWJsZXMgZm9yIGVsZW1lbnRzIGluIEVSIGJpdHN0cmVhbSAqLwotY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxlbWVudHNUYWJbMTVdWzddID0KLXsKLSAvKiAgMSAqLyAgeyBJRF9TQ0UsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDEgY2hhbm5lbCAgKi8KLSAvKiAgMiAqLyAgeyBJRF9DUEUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gIC8qIDIgY2hhbm5lbHMgKi8KLSAvKiAgMyAqLyAseyBJRF9TQ0UsICBJRF9DUEUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDMgY2hhbm5lbHMgKi8KLSAvKiAgNCAqLyAgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9TQ0UsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDQgY2hhbm5lbHMgKi8KLSAvKiAgNSAqLyAgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDUgY2hhbm5lbHMgKi8KLSAvKiAgNiAqLyAgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9MRkUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FIH0gIC8qIDYgY2hhbm5lbHMgKi8KLSAvKiAgNyAqLyAseyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9DUEUsICBJRF9MRkUsICBJRF9FWFQsICBJRF9FTkQgIH0sICAvKiA4IGNoYW5uZWxzICovCi0gLyogIDggKi8gIHsgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9LCAgLyogcmVzZXJ2ZWQgICAqLwotIC8qICA5ICovICB7IElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSwgIC8qIHJlc2VydmVkICAgKi8KLSAvKiAxMCAqLyAgeyBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sICAvKiByZXNlcnZlZCAgICovCi0gLyogMTEgKi8gIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfU0NFLCAgSURfTEZFLCAgSURfRVhULCAgSURfRU5EICB9LCAgLyogNyBjaGFubmVscyAqLwotIC8qIDEyICovICB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0xGRSwgIElEX0VYVCwgIElEX0VORCAgfSwgIC8qIDggY2hhbm5lbHMgKi8KLSAvKiAxMyAqLyAgeyBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sICAvKiByZXNlcnZlZCAgICovCi0gLyogMTQgKi8gIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfTEZFLCAgSURfQ1BFLCAgSURfRVhULCAgSURfRU5EICB9ICAgLyogOCBjaGFubmVscyAqLworY29uc3QgTVA0X0VMRU1FTlRfSUQKKyAgICBlbGVtZW50c1RhYltBQUNERUNfTUFYX0NIX0NPTkZdW0FBQ0RFQ19DSF9FTEVNRU5UU19UQUJfU0laRV0gPSB7CisgICAgICAgIC8qICAxICovIHtJRF9TQ0UsIElEX0VYVCwgSURfRU5ELCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLAorICAgICAgICAgICAgICAgICAgSURfTk9ORX0sIC8qIDEgY2hhbm5lbCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMiAqLworICAgICAgICB7SURfQ1BFLCBJRF9FWFQsIElEX0VORCwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwKKyAgICAgICAgIElEX05PTkV9IC8qIDIgY2hhbm5lbHMgKi8KKyNpZiAoQUFDREVDX01BWF9DSF9DT05GID4gMikKKyAgICAgICAgLyogIDMgKi8sCisgICAgICAgIHtJRF9TQ0UsIElEX0NQRSwgSURfRVhULCBJRF9FTkQsIElEX05PTkUsIElEX05PTkUsCisgICAgICAgICBJRF9OT05FfSwgLyogMyBjaGFubmVscyAqLworICAgICAgICAgICAgICAgICAgIC8qICA0ICovCisgICAgICAgIHtJRF9TQ0UsIElEX0NQRSwgSURfU0NFLCBJRF9FWFQsIElEX0VORCwgSURfTk9ORSwKKyAgICAgICAgIElEX05PTkV9LCAvKiA0IGNoYW5uZWxzICovCisgICAgICAgICAgICAgICAgICAgLyogIDUgKi8KKyAgICAgICAge0lEX1NDRSwgSURfQ1BFLCBJRF9DUEUsIElEX0VYVCwgSURfRU5ELCBJRF9OT05FLAorICAgICAgICAgSURfTk9ORX0sIC8qIDUgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgICAgICAvKiAgNiAqLworICAgICAgICB7SURfU0NFLCBJRF9DUEUsIElEX0NQRSwgSURfTEZFLCBJRF9FWFQsIElEX0VORCwKKyAgICAgICAgIElEX05PTkV9IC8qIDYgY2hhbm5lbHMgKi8KKyNlbmRpZgorI2lmIChBQUNERUNfTUFYX0NIX0NPTkYgPiA2KQorICAgICAgICAvKiAgNyAqLywKKyAgICAgICAge0lEX1NDRSwgSURfQ1BFLCBJRF9DUEUsIElEX0NQRSwgSURfTEZFLCBJRF9FWFQsCisgICAgICAgICBJRF9FTkR9LCAvKiA4IGNoYW5uZWxzICovCisgICAgICAgICAgICAgICAgICAvKiAgOCAqLworICAgICAgICB7SURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwKKyAgICAgICAgIElEX05PTkV9LCAvKiByZXNlcnZlZCAgICovCisgICAgICAgICAgICAgICAgICAgLyogIDkgKi8KKyAgICAgICAge0lEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsCisgICAgICAgICBJRF9OT05FfSwgLyogcmVzZXJ2ZWQgICAqLworICAgICAgICAgICAgICAgICAgIC8qIDEwICovCisgICAgICAgIHtJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLAorICAgICAgICAgSURfTk9ORX0sIC8qIHJlc2VydmVkICAgKi8KKyAgICAgICAgICAgICAgICAgICAvKiAxMSAqLworICAgICAgICB7SURfU0NFLCBJRF9DUEUsIElEX0NQRSwgSURfU0NFLCBJRF9MRkUsIElEX0VYVCwKKyAgICAgICAgIElEX0VORH0sIC8qIDcgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgICAgIC8qIDEyICovCisgICAgICAgIHtJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLCBJRF9DUEUsIElEX0xGRSwgSURfRVhULAorICAgICAgICAgSURfRU5EfSwgLyogOCBjaGFubmVscyAqLworICAgICAgICAgICAgICAgICAgLyogMTMgKi8KKyAgICAgICAge0lEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsCisgICAgICAgICBJRF9OT05FfSwgLyogc2VlIGVsZW1lbnRzQ2hDZmcxMyAqLworICAgICAgICAgICAgICAgICAgIC8qIDE0ICovCisgICAgICAgIHtJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLCBJRF9MRkUsIElEX0NQRSwgSURfRVhULAorICAgICAgICAgSURfRU5EfSAvKiA4IGNoYW5uZWxzICovCisjZW5kaWYKIH07CiAKIC8qISBSYW5kb20gc2lnbiBiaXQgdXNlZCBmb3IgY29uY2VhbG1lbnQKLSovCi1jb25zdCBVU0hPUlQgcmFuZG9tU2lnbltBQUNfTkZfTk9fUkFORE9NX1ZBTC8xNl0gPSB7Ci0vKgotICAgc2lnbiBiaXRzIG9mIEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtdIGVudHJpZXM6Ci0gICBMU0IgLi4uLi4uLi4uLi4gTVNCICAtPiAgICBNU0IgLi4uIExTQgotKi8KLS8qIDEwMDEgMDExMSAwMDExIDExMDAgIC0+ICovIDB4M2NlOSwKLS8qIDAxMDAgMDExMSAwMTExIDEwMTEgIC0+ICovIDB4ZGVlMiwKLS8qIDAwMDEgMTEwMCAxMTEwIDEwMTEgIC0+ICovIDB4ZDczOCwKLS8qIDAwMDEgMDAxMSAwMTEwIDEwMDEgIC0+ICovIDB4OTZjOCwKLS8qIDAxMDEgMDAxMSAxMTAxIDAwMDAgIC0+ICovIDB4MGJjYSwKLS8qIDAwMDEgMDAwMSAxMTExIDAxMDAgIC0+ICovIDB4MmY4OCwKLS8qIDExMTAgMTEwMCAxMTEwIDExMDEgIC0+ICovIDB4YjczNywKLS8qIDAwMTAgMTAxMCAxMDExIDEwMDEgIC0+ICovIDB4OWQ1NCwKLS8qIDAxMTEgMTEwMCAwMTEwIDEwMTAgIC0+ICovIDB4NTYzZSwKLS8qIDExMDEgMDExMSAwMDEwIDAxMDEgIC0+ICovIDB4YTRlYiwKLS8qIDAwMDEgMDEwMSAxMDExIDExMDAgIC0+ICovIDB4M2RhOCwKLS8qIDAxMDEgMDExMSAxMDAxIDEwMTEgIC0+ICovIDB4ZDllYSwKLS8qIDExMDEgMDEwMCAwMTAxIDAxMDEgIC0+ICovIDB4YWEyYiwKLS8qIDEwMDAgMTAwMSAwMTAwIDAwMTEgIC0+ICovIDB4YzI5MSwKLS8qIDExMDAgMTExMSAxMDEwIDExMDAgIC0+ICovIDB4MzVmMywKLS8qIDExMDAgMTAxMCAxMTEwIDAwMTAgIC0+ICovIDB4NDc1MywKLS8qIDAxMTAgMDAwMSAxMDEwIDEwMDAgIC0+ICovIDB4MTU4NiwKLS8qIDAwMTEgMDEwMSAxMTExIDExMDAgIC0+ICovIDB4M2ZhYywKLS8qIDAwMDEgMDExMCAxMDEwIDAwMDEgIC0+ICovIDB4ODU2OCwKLS8qIDAwMTAgMTEwMSAwMTExIDAwMTAgIC0+ICovIDB4NGViNCwKLS8qIDExMDEgMTAxMCAwMTAwIDEwMDEgIC0+ICovIDB4OTI1YiwKLS8qIDExMDAgMTAwMSAwMDAwIDExMTAgIC0+ICovIDB4NzA5MywKLS8qIDEwMDAgMTEwMCAwMTEwIDEwMTAgIC0+ICovIDB4NTYzMSwKLS8qIDAwMDAgMTAwMCAwMTEwIDExMDEgIC0+ICovIDB4YjYxMCwKLS8qIDEwMDAgMDAwMSAxMTExIDEwMTEgIC0+ICovIDB4ZGY4MSwKLS8qIDExMTEgMDAxMSAwMTAwIDAxMTEgIC0+ICovIDB4ZTJjZiwKLS8qIDEwMDAgMDAwMSAwMDEwIDEwMTAgIC0+ICovIDB4NTQ4MSwKLS8qIDExMDEgMDEwMSAxMTAwIDExMTEgIC0+ICovIDB4ZjNhYiwKLS8qIDAxMTAgMDAwMSAwMTEwIDEwMDAgIC0+ICovIDB4MTY4NiwKLS8qIDAwMTEgMDAxMSAxMTAwIDAxMTAgIC0+ICovIDB4NjNjYywKLS8qIDAwMTEgMDExMSAwMTAxIDAxMTAgIC0+ICovIDB4NmFlYywKLS8qIDEwMTEgMDAwMSAxMDEwIDAwMTAgIC0+ICovIDB4NDU4ZAorICovCitjb25zdCBVU0hPUlQgQWFjRGVjX3JhbmRvbVNpZ25bQUFDX05GX05PX1JBTkRPTV9WQUwgLyAxNl0gPSB7CisgICAgLyoKKyAgICAgICBzaWduIGJpdHMgb2YgRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW10gZW50cmllczoKKyAgICAgICBMU0IgLi4uLi4uLi4uLi4gTVNCICAtPiAgICBNU0IgLi4uIExTQgorICAgICovCisgICAgLyogMTAwMSAwMTExIDAwMTEgMTEwMCAgLT4gKi8gMHgzY2U5LAorICAgIC8qIDAxMDAgMDExMSAwMTExIDEwMTEgIC0+ICovIDB4ZGVlMiwKKyAgICAvKiAwMDAxIDExMDAgMTExMCAxMDExICAtPiAqLyAweGQ3MzgsCisgICAgLyogMDAwMSAwMDExIDAxMTAgMTAwMSAgLT4gKi8gMHg5NmM4LAorICAgIC8qIDAxMDEgMDAxMSAxMTAxIDAwMDAgIC0+ICovIDB4MGJjYSwKKyAgICAvKiAwMDAxIDAwMDEgMTExMSAwMTAwICAtPiAqLyAweDJmODgsCisgICAgLyogMTExMCAxMTAwIDExMTAgMTEwMSAgLT4gKi8gMHhiNzM3LAorICAgIC8qIDAwMTAgMTAxMCAxMDExIDEwMDEgIC0+ICovIDB4OWQ1NCwKKyAgICAvKiAwMTExIDExMDAgMDExMCAxMDEwICAtPiAqLyAweDU2M2UsCisgICAgLyogMTEwMSAwMTExIDAwMTAgMDEwMSAgLT4gKi8gMHhhNGViLAorICAgIC8qIDAwMDEgMDEwMSAxMDExIDExMDAgIC0+ICovIDB4M2RhOCwKKyAgICAvKiAwMTAxIDAxMTEgMTAwMSAxMDExICAtPiAqLyAweGQ5ZWEsCisgICAgLyogMTEwMSAwMTAwIDAxMDEgMDEwMSAgLT4gKi8gMHhhYTJiLAorICAgIC8qIDEwMDAgMTAwMSAwMTAwIDAwMTEgIC0+ICovIDB4YzI5MSwKKyAgICAvKiAxMTAwIDExMTEgMTAxMCAxMTAwICAtPiAqLyAweDM1ZjMsCisgICAgLyogMTEwMCAxMDEwIDExMTAgMDAxMCAgLT4gKi8gMHg0NzUzLAorICAgIC8qIDAxMTAgMDAwMSAxMDEwIDEwMDAgIC0+ICovIDB4MTU4NiwKKyAgICAvKiAwMDExIDAxMDEgMTExMSAxMTAwICAtPiAqLyAweDNmYWMsCisgICAgLyogMDAwMSAwMTEwIDEwMTAgMDAwMSAgLT4gKi8gMHg4NTY4LAorICAgIC8qIDAwMTAgMTEwMSAwMTExIDAwMTAgIC0+ICovIDB4NGViNCwKKyAgICAvKiAxMTAxIDEwMTAgMDEwMCAxMDAxICAtPiAqLyAweDkyNWIsCisgICAgLyogMTEwMCAxMDAxIDAwMDAgMTExMCAgLT4gKi8gMHg3MDkzLAorICAgIC8qIDEwMDAgMTEwMCAwMTEwIDEwMTAgIC0+ICovIDB4NTYzMSwKKyAgICAvKiAwMDAwIDEwMDAgMDExMCAxMTAxICAtPiAqLyAweGI2MTAsCisgICAgLyogMTAwMCAwMDAxIDExMTEgMTAxMSAgLT4gKi8gMHhkZjgxLAorICAgIC8qIDExMTEgMDAxMSAwMTAwIDAxMTEgIC0+ICovIDB4ZTJjZiwKKyAgICAvKiAxMDAwIDAwMDEgMDAxMCAxMDEwICAtPiAqLyAweDU0ODEsCisgICAgLyogMTEwMSAwMTAxIDExMDAgMTExMSAgLT4gKi8gMHhmM2FiLAorICAgIC8qIDAxMTAgMDAwMSAwMTEwIDEwMDAgIC0+ICovIDB4MTY4NiwKKyAgICAvKiAwMDExIDAwMTEgMTEwMCAwMTEwICAtPiAqLyAweDYzY2MsCisgICAgLyogMDAxMSAwMTExIDAxMDEgMDExMCAgLT4gKi8gMHg2YWVjLAorICAgIC8qIDEwMTEgMDAwMSAxMDEwIDAwMTAgIC0+ICovIDB4NDU4ZH07CisKKy8qIE1EU1QgZmlsdGVyIGNvZWZmaWNpZW50cyBmb3IgY3VycmVudCB3aW5kb3cKKyAqIG1heDogMC42MzU3MjIgPT4gMjAgYml0cyAodW5zaWduZWQpIG5lY2Vzc2FyeSBmb3IgcmVwcmVzZW50YXRpb24KKyAqIG1pbjogPSAtbWF4ICovCitjb25zdCBGSVhQX0ZJTFQgbWRzdF9maWx0X2NvZWZfY3VyclsyMF1bM10gPSB7CisgICAge0ZJTFQoMC4wMDAwMDBmKSwgRklMVCgwLjAwMDAwMGYpLCBGSUxUKDAuNTAwMDAwZil9LAorICAgIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjUwMDAwMGYpLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKCAwLjAwMDAwMGYpIH0sICovIC8qIG9ubHkgbG9uZyAvIGVpZ2h0IHNob3J0ICBsOnNpbmUgcjpzaW5lICovCisgICAge0ZJTFQoMC4wOTE0OTdmKSwgRklMVCgwLjAwMDAwMGYpLCBGSUxUKDAuNTgxNDI3Zil9LAorICAgIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjU4MTQyN2YpLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjA5MTQ5N2YpIH0sICovIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBsOmtiZCAgcjprYmQgICovCisgICAge0ZJTFQoMC4wNDU3NDhmKSwgRklMVCgwLjA1NzIzOGYpLCBGSUxUKDAuNTQwNzE0Zil9LAorICAgIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjU0MDcxNGYpLCBGSUxUKC0wLjA1NzIzOGYpLCBGSUxUKC0wLjA0NTc0OGYpIH0sICovIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBsOnNpbmUgcjprYmQgICovCisgICAge0ZJTFQoMC4wNDU3NDhmKSwgRklMVCgtMC4wNTcyMzhmKSwgRklMVCgwLjU0MDcxNGYpfSwKKyAgICAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC41NDA3MTRmKSwgRklMVCggMC4wNTcyMzhmKSwgRklMVCgtMC4wNDU3NDhmKSB9LCAqLyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgbDprYmQgIHI6c2luZSAqLworCisgICAge0ZJTFQoMC4xMDI2NThmKSwgRklMVCgwLjEwMzc5MWYpLCBGSUxUKDAuNTY3MTQ5Zil9LAorICAgIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjU2NzE0OWYpLCBGSUxUKC0wLjEwMzc5MWYpLCBGSUxUKC0wLjEwMjY1OGYpIH0sICovIC8qIGxvbmcgc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAge0ZJTFQoMC4xNTA1MTJmKSwgRklMVCgwLjA0Nzk2OWYpLAorICAgICBGSUxUKDAuNjA4NTc0Zil9LCAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC42MDg1NzRmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklMVCgtMC4wNDc5NjlmKSwgRklMVCgtMC4xNTA1MTJmKSB9LCAqLworICAgIHtGSUxUKDAuMTA0NzYzZiksIEZJTFQoMC4xMDUyMDdmKSwKKyAgICAgRklMVCgwLjU2Nzg2MWYpfSwgLyosIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuNTY3ODYxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTFQoLTAuMTA1MjA3ZiksIEZJTFQoLTAuMTA0NzYzZikgfSwgKi8KKyAgICB7RklMVCgwLjE0ODQwNmYpLCBGSUxUKDAuMDQ2NTUzZiksCisgICAgIEZJTFQoMC42MDc4NjNmKX0sIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjYwNzg2M2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxUKC0wLjA0NjU1M2YpLCBGSUxUKC0wLjE0ODQwNmYpIH0sICovCisKKyAgICB7RklMVCgwLjEwMjY1OGYpLCBGSUxUKC0wLjEwMzc5MWYpLCBGSUxUKDAuNTY3MTQ5Zil9LAorICAgIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjU2NzE0OWYpLCBGSUxUKCAwLjEwMzc5MWYpLCBGSUxUKC0wLjEwMjY1OGYpIH0sICovIC8qIGxvbmcgc3RvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAge0ZJTFQoMC4xNTA1MTJmKSwgRklMVCgtMC4wNDc5NjlmKSwKKyAgICAgRklMVCgwLjYwODU3NGYpfSwgLyosIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuNjA4NTc0ZiksIEZJTFQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQ3OTY5ZiksIEZJTFQoLTAuMTUwNTEyZikgfSwgKi8KKyAgICB7RklMVCgwLjE0ODQwNmYpLCBGSUxUKC0wLjA0NjU1M2YpLAorICAgICBGSUxUKDAuNjA3ODYzZil9LCAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC42MDc4NjNmKSwgRklMVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDY1NTNmKSwgRklMVCgtMC4xNDg0MDZmKSB9LCAqLworICAgIHtGSUxUKDAuMTA0NzYzZiksIEZJTFQoLTAuMTA1MjA3ZiksCisgICAgIEZJTFQoMC41Njc4NjFmKX0sIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjU2Nzg2MWYpLCBGSUxUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEwNTIwN2YpLCBGSUxUKC0wLjEwNDc2M2YpIH0sICovCisKKyAgICB7RklMVCgwLjIwNTMxNmYpLCBGSUxUKDAuMDAwMDAwZiksIEZJTFQoMC42MzQyOThmKX0sCisgICAgLyosIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuNjM0Mjk4ZiksIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuMjA1MzE2ZikgfSwgKi8gLyogc3RvcCBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB7RklMVCgwLjIwOTUyNmYpLCBGSUxUKDAuMDAwMDAwZiksCisgICAgIEZJTFQoMC42MzU3MjJmKX0sIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjYzNTcyMmYpLCBGSUxUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYpLCBGSUxUKC0wLjIwOTUyNmYpIH0sICovCisgICAge0ZJTFQoMC4yMDc0MjFmKSwgRklMVCgwLjAwMTQxNmYpLAorICAgICBGSUxUKDAuNjM1MDEwZil9LCAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC42MzUwMTBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklMVCgtMC4wMDE0MTZmKSwgRklMVCgtMC4yMDc0MjFmKSB9LCAqLworICAgIHtGSUxUKDAuMjA3NDIxZiksIEZJTFQoLTAuMDAxNDE2ZiksCisgICAgIEZJTFQoMC42MzUwMTBmKX0sIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjYzNTAxMGYpLCBGSUxUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTQxNmYpLCBGSUxUKC0wLjIwNzQyMWYpIH0gICovCisKKyAgICB7RklMVCgwLjE4NTYxOGYpLCBGSUxUKDAuMDAwMDAwZiksIEZJTFQoMC42MjczNzFmKX0sCisgICAgLyosIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuNjM0Mjk4ZiksIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuMjA1MzE2ZikgfSwgKi8gLyogc3RvcCBzdGFydCAgIFRyYW5zZm9ybSBTcGxpdHRpbmcgICAgICAgICovCisgICAge0ZJTFQoMC4yMDQ5MzJmKSwgRklMVCgwLjAwMDAwMGYpLAorICAgICBGSUxUKDAuNjM0MTU5Zil9LCAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC42MzU3MjJmKSwgRklMVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmKSwgRklMVCgtMC4yMDk1MjZmKSB9LCAqLworICAgIHtGSUxUKDAuMTk0NjA5ZiksIEZJTFQoMC4wMDYyMDJmKSwKKyAgICAgRklMVCgwLjYzMDUzNmYpfSwgLyosIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuNjM1MDEwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTFQoLTAuMDAxNDE2ZiksIEZJTFQoLTAuMjA3NDIxZikgfSwgKi8KKyAgICB7RklMVCgwLjE5NDYwOWYpLCBGSUxUKC0wLjAwNjIwMmYpLAorICAgICBGSUxUKDAuNjMwNTM2Zil9LCAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC42MzUwMTBmKSwgRklMVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE0MTZmKSwgRklMVCgtMC4yMDc0MjFmKSB9ICAqLwogfTsKIAorLyogTURTVCBmaWx0ZXIgY29lZmZpY2llbnRzIGZvciBwcmV2aW91cyB3aW5kb3cKKyAqIG1heDogMC4zMTgzMSA9PiAxNSBiaXRzICh1bnNpZ25lZCkgbmVjZXNzYXJ5IGZvciByZXByZXNlbnRhdGlvbgorICogbWluOiAwLjAgKi8KK2NvbnN0IEZJWFBfRklMVCBtZHN0X2ZpbHRfY29lZl9wcmV2WzZdWzRdID0geworICAgIHtGSUxUKDAuMDAwMDAwZiksIEZJTFQoMC4xMDYxMDNmKSwgRklMVCgwLjI1MDAwMGYpLCBGSUxUKDAuMzE4MzEwZil9LAorICAgIC8qLCBGSUxUKCAwLjI1MDAwMGYpLCBGSUxUKCAwLjEwNjEwM2YpLCBGSUxUKCAwLjAwMDAwMGYpIH0sICovIC8qIG9ubHkgbG9uZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbG9uZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDpzaW5lICovCisgICAge0ZJTFQoMC4wNTk1MDlmKSwgRklMVCgwLjEyMzcxNGYpLCBGSUxUKDAuMTg2NTc5ZiksIEZJTFQoMC4yMTMwNzdmKX0sCisgICAgLyosIEZJTFQoIDAuMTg2NTc5ZiksIEZJTFQoIDAuMTIzNzE0ZiksIEZJTFQoIDAuMDU5NTA5ZikgfSwgKi8gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsOmtiZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAge0ZJTFQoMC4wMzg0OThmKSwgRklMVCgwLjAzOTIxMmYpLCBGSUxUKDAuMDM5NjQ1ZiksIEZJTFQoMC4wMzk3OTBmKX0sCisgICAgLyosIEZJTFQoIDAuMDM5NjQ1ZiksIEZJTFQoIDAuMDM5MjEyZiksIEZJTFQoIDAuMDM4NDk4ZikgfSwgKi8gLyogbG9uZyBzdG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBzdG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsOnNpbmUgKi8KKyAgICB7RklMVCgwLjAyNjE0MmYpLCBGSUxUKDAuMDI2NDEzZiksIEZJTFQoMC4wMjY1NzdmKSwgRklMVCgwLjAyNjYzMWYpfSwKKyAgICAvKiwgRklMVCggMC4wMjY1NzdmKSwgRklMVCggMC4wMjY0MTNmKSwgRklMVCggMC4wMjYxNDJmKSB9ICAqLyAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsOmtiZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAge0ZJTFQoMC4wNjk2MDhmKSwgRklMVCgwLjA3NTAyOGYpLCBGSUxUKDAuMDc4NDIzZiksIEZJTFQoMC4wNzk1ODBmKX0sCisgICAgLyosIEZJTFQoIDAuMDM5NjQ1ZiksIEZJTFQoIDAuMDM5MjEyZiksIEZJTFQoIDAuMDM4NDk4ZikgfSwgKi8gLyogVHJhbnNmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXR0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDpzaW5lICovCisgICAge0ZJTFQoMC4wNDIxNzJmKSwgRklMVCgwLjA0MzQ1OGYpLCBGSUxUKDAuMDQ0MjQ4ZiksIEZJTFQoMC4wNDQ1MTRmKX0sCisgICAgLyosIEZJTFQoIDAuMDI2NTc3ZiksIEZJTFQoIDAuMDI2NDEzZiksIEZJTFQoIDAuMDI2MTQyZikgfSAgKi8gLyogICAgICAgICAgICAgICAgICAgICAgICAgbDprYmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY19yb20uaCBiL2xpYkFBQ2RlYy9zcmMvYWFjX3JvbS5oCmluZGV4IGYzMTRhMmQuLmZmYWY5NTEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjX3JvbS5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjX3JvbS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogRGVmaW5pdGlvbiBvZiBjb25zdGFudCB0YWJsZXMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBBQUNfUk9NX0gKICNkZWZpbmUgQUFDX1JPTV9ICkBAIC05NiwxMyArMTA4LDI2IEBACiAjaW5jbHVkZSAiYWFjZGVjX2hjcl90eXBlcy5oIgogI2luY2x1ZGUgImFhY2RlY19oY3JzLmgiCiAKLSNkZWZpbmUgQUFDX05GX05PX1JBTkRPTV9WQUwgIDUxMiAgIC8qITwgU2l6ZSBvZiByYW5kb20gbnVtYmVyIGFycmF5IGZvciBub2lzZSBmbG9vciAqLworI2RlZmluZSBQQ01fREVDIEZJWFBfREJMCisjZGVmaW5lIE1BWFZBTF9QQ01fREVDIE1BWFZBTF9EQkwKKyNkZWZpbmUgTUlOVkFMX1BDTV9ERUMgTUlOVkFMX0RCTAorI2RlZmluZSBGSVhQX0RCTDJQQ01fREVDKHgpICh4KQorI2RlZmluZSBQQ01fREVDMkZJWFBfREJMKHgpICh4KQorI2RlZmluZSBQQ01fREVDX0JJVFMgREZSQUNUX0JJVFMKKyNkZWZpbmUgUENNX0RFQzJGWF9QQ00oeCkgRlhfREJMMkZYX1BDTSh4KQorI2RlZmluZSBGWF9QQ00yUENNX0RFQyh4KSBGWF9QQ00yRlhfREJMKHgpCisKKyNkZWZpbmUgQUFDREVDX01BWF9DSF9DT05GIDE0CisjZGVmaW5lIEFBQ0RFQ19DSF9FTEVNRU5UU19UQUJfU0laRSA3IC8qITwgU2l6ZSBvZiBlbGVtZW50IHRhYmxlcyAqLworCisjZGVmaW5lIEFBQ19ORl9OT19SQU5ET01fVkFMIFwKKyAgNTEyIC8qITwgU2l6ZSBvZiByYW5kb20gbnVtYmVyIGFycmF5IGZvciBub2lzZSBmbG9vciAqLwogCiAjZGVmaW5lIElOVl9RVUFOVF9UQUJMRVNJWkUgMjU2CiAKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBJbnZlcnNlUXVhbnRUYWJsZSBbSU5WX1FVQU5UX1RBQkxFU0laRSArIDFdIDsKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBNYW50aXNzYVRhYmxlIFs0XVsxNF0gOwotZXh0ZXJuIGNvbnN0IFNDSEFSIEV4cG9uZW50VGFibGUgWzRdWzE0XSA7CitleHRlcm4gY29uc3QgRklYUF9EQkwgSW52ZXJzZVF1YW50VGFibGVbSU5WX1FVQU5UX1RBQkxFU0laRSArIDFdOworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIE1hbnRpc3NhVGFibGVbNF1bMTRdOworZXh0ZXJuIGNvbnN0IFNDSEFSIEV4cG9uZW50VGFibGVbNF1bMTRdOwogCiAjZGVmaW5lIE5VTV9MRF9DT0VGXzUxMiAxNTM2CiAjZGVmaW5lIE5VTV9MRF9DT0VGXzQ4MCAxNDQwCkBAIC0xMTIsNiArMTM3LDExIEBACiAjZGVmaW5lIFdUUzIgKC0yKQogZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzNTEyWzE1MzZdOwogZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzNDgwWzE0NDBdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzMjU2Wzc2OF07CitleHRlcm4gY29uc3QgRklYUF9XVEIgTG93RGVsYXlTeW50aGVzaXMyNDBbNzIwXTsKK2V4dGVybiBjb25zdCBGSVhQX1dUQiBMb3dEZWxheVN5bnRoZXNpczE2MFs0ODBdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzMTI4WzM4NF07CitleHRlcm4gY29uc3QgRklYUF9XVEIgTG93RGVsYXlTeW50aGVzaXMxMjBbMzYwXTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICBjb25zdCBTSE9SVCAqc2ZiT2Zmc2V0TG9uZzsKQEAgLTEyMywxMyArMTUzLDkgQEAKIGV4dGVybiBjb25zdCBTRkJfSU5GTyBzZmJPZmZzZXRUYWJsZXNbNV1bMTZdOwogCiAvKiBIdWZmbWFuIHRhYmxlcyAqLwotZW51bSB7Ci0gIEh1ZmZtYW5CaXRzID0gMiwKLSAgSHVmZm1hbkVudHJpZXMgPSAoMSA8PCBIdWZmbWFuQml0cykKLX07CitlbnVtIHsgSHVmZm1hbkJpdHMgPSAyLCBIdWZmbWFuRW50cmllcyA9ICgxIDw8IEh1ZmZtYW5CaXRzKSB9OwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBjb25zdCBVU0hPUlQgKCpDb2RlQm9vaylbSHVmZm1hbkVudHJpZXNdOwogICBVQ0hBUiBEaW1lbnNpb247CiAgIFVDSEFSIG51bUJpdHM7CkBAIC0xMzksMjggKzE2NSwyNiBAQAogZXh0ZXJuIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gQUFDY29kZUJvb2tEZXNjcmlwdGlvblRhYmxlWzEzXTsKIGV4dGVybiBjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uIEFBQ2NvZGVCb29rRGVzY3JpcHRpb25TQ0w7CiAKK2V4dGVybiBjb25zdCBTVEFURUZVTkMgYVN0YXRlQ29uc3RhbnQyU3RhdGVbXTsKIAotZXh0ZXJuIGNvbnN0IFNUQVRFRlVOQyAgYVN0YXRlQ29uc3RhbnQyU3RhdGVbXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBhQ29kZWJvb2syU3RhcnRJbnRbXTsKIAotZXh0ZXJuIGNvbnN0IFNDSEFSICAgICAgYUNvZGVib29rMlN0YXJ0SW50W107CitleHRlcm4gY29uc3QgVUNIQVIgYU1pbk9mQ2JQYWlyW107CitleHRlcm4gY29uc3QgVUNIQVIgYU1heE9mQ2JQYWlyW107CiAKLWV4dGVybiBjb25zdCBVQ0hBUiAgICAgIGFNaW5PZkNiUGFpcltdOwotZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgYU1heE9mQ2JQYWlyW107CitleHRlcm4gY29uc3QgVUNIQVIgYU1heEN3TGVuW107CitleHRlcm4gY29uc3QgVUNIQVIgYURpbUNiW107CitleHRlcm4gY29uc3QgVUNIQVIgYURpbUNiU2hpZnRbXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBhU2lnbkNiW107CitleHRlcm4gY29uc3QgVUNIQVIgYUNiUHJpb3JpdHlbXTsKIAotZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgYU1heEN3TGVuW107Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICBhRGltQ2JbXTsKLWV4dGVybiBjb25zdCBVQ0hBUiAgICAgIGFEaW1DYlNoaWZ0W107Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICBhU2lnbkNiW107Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICBhQ2JQcmlvcml0eVtdOworZXh0ZXJuIGNvbnN0IFVJTlQgKmFIdWZmVGFibGVbXTsKK2V4dGVybiBjb25zdCBTQ0hBUiAqYVF1YW50VGFibGVbXTsKIAotZXh0ZXJuIGNvbnN0IFVJTlQgICAgICAqYUh1ZmZUYWJsZVtdOwotZXh0ZXJuIGNvbnN0IFNDSEFSICAgICAqYVF1YW50VGFibGVbXTsKK2V4dGVybiBjb25zdCBVU0hPUlQgYUxhcmdlc3RBYnNvbHV0ZVZhbHVlW107CiAKLWV4dGVybiBjb25zdCBVU0hPUlQgICAgIGFMYXJnZXN0QWJzb2x1dGVWYWx1ZVtdOwotCi1leHRlcm4gY29uc3QgVUlOVCAgIGFIdWZmVHJlZVJ2bGNFc2NhcGVbXTsKLWV4dGVybiBjb25zdCBVSU5UICAgYUh1ZmZUcmVlUnZsQ29kZXdkc1tdOwotCitleHRlcm4gY29uc3QgVUlOVCBhSHVmZlRyZWVSdmxjRXNjYXBlW107CitleHRlcm4gY29uc3QgVUlOVCBhSHVmZlRyZWVSdmxDb2Rld2RzW107CiAKIGV4dGVybiBjb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibFsxM11bMl07CiAKQEAgLTE3Miw3ICsxOTYsMTAgQEAKIGV4dGVybiBjb25zdCBGSVhQX1RDQyBGREthYWNEZWNfdG5zQ29lZmYzWzhdOwogZXh0ZXJuIGNvbnN0IEZJWFBfVENDIEZES2FhY0RlY190bnNDb2VmZjRbMTZdOwogCi1leHRlcm4gY29uc3QgVVNIT1JUIHJhbmRvbVNpZ25bQUFDX05GX05PX1JBTkRPTV9WQUwvMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES2FhY0RlY190bnNDb2VmZjNfZ2Fpbl9sZFtdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES2FhY0RlY190bnNDb2VmZjRfZ2Fpbl9sZFtdOworCitleHRlcm4gY29uc3QgVVNIT1JUIEFhY0RlY19yYW5kb21TaWduW0FBQ19ORl9OT19SQU5ET01fVkFMIC8gMTZdOwogCiBleHRlcm4gY29uc3QgRklYUF9EQkwgcG93Ml9kaXYyNG1pbnVzMVs0N107CiBleHRlcm4gY29uc3QgaW50IG9mZnNldFRhYlsyXVsxNl07CkBAIC0xODMsNiArMjEwLDI4IEBACiBleHRlcm4gY29uc3QgVUNIQVIgY2hhbm5lbE1hcHBpbmdUYWJsZVdBVlsxNV1bOF07CiAKIC8qIExvb2t1cCB0YWJsZXMgZm9yIGVsZW1lbnRzIGluIEVSIGJpdHN0cmVhbSAqLwotZXh0ZXJuIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsZW1lbnRzVGFiWzE1XVs3XTsKK2V4dGVybiBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50c1RhYltBQUNERUNfTUFYX0NIX0NPTkZdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUFDREVDX0NIX0VMRU1FTlRTX1RBQl9TSVpFXTsKKworI2RlZmluZSBTRl9GTkFfQ09FRkZTIFwKKyAgMSAvKiBDb21waWxlLXRpbWUgcHJlc2NhbGVyIGZvciBNRFNULWZpbHRlciBjb2VmZmljaWVudHMuICovCisvKiBTRl9GTkFfQ09FRkZTID4gMCBzaG91bGQgb25seSBiZSBjb25zaWRlcmVkIGZvciBGSVhQX0RCTC1jb2VmZmljaWVudHMgICovCisvKiAoaS5lLiBpZiBDUExYX1BSRURfRklMVEVSXzE2QklUIGlzIG5vdCBkZWZpbmVkKS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiBXaXRoIEZJWFBfREJMIGxvc3Mgb2YgcHJlY2lzaW9uIGlzIHBvc3NpYmxlIGZvciBTRl9GTkFfQ09FRkZTID4gMTEuICAgICovCisKKyNpZmRlZiBDUExYX1BSRURfRklMVEVSXzE2QklUCisjZGVmaW5lIEZJWFBfRklMVCBGSVhQX1NHTAorI2RlZmluZSBGSUxUKGEpICgoRkwyRlhDT05TVF9TR0woYSkpID4+IFNGX0ZOQV9DT0VGRlMpCisjZWxzZQorI2RlZmluZSBGSVhQX0ZJTFQgRklYUF9EQkwKKyNkZWZpbmUgRklMVChhKSAoKEZMMkZYQ09OU1RfREJMKGEpKSA+PiBTRl9GTkFfQ09FRkZTKQorI2VuZGlmCisKK2V4dGVybiBjb25zdCBGSVhQX0ZJTFQgbWRzdF9maWx0X2NvZWZfY3VyclsyMF1bM107IC8qIE1EU1QtZmlsdGVyIGNvZWZmaWNpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXMgdXNlZCBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93ICAqLworZXh0ZXJuIGNvbnN0IEZJWFBfRklMVCBtZHN0X2ZpbHRfY29lZl9wcmV2WzZdWzRdOyAgLyogTURTVC1maWx0ZXIgY29lZmZpY2llbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcyB1c2VkIGZvciBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93ICovCiAKICNlbmRpZiAvKiAjaWZuZGVmIEFBQ19ST01fSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjLmNwcCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2RyYy5jcHAKaW5kZXggZWI4ZTQxMC4uOTIyYTA5ZSAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLcKpIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzcgKzkwLDY0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKKwogICAgRGVzY3JpcHRpb246IER5bmFtaWMgcmFuZ2UgY29udHJvbCAoRFJDKSBkZWNvZGVyIHRvb2wgZm9yIEFBQwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYWFjZGVjX2RyYy5oIgogCi0KICNpbmNsdWRlICJjaGFubmVsaW5mby5oIgogI2luY2x1ZGUgImFhY19yb20uaCIKIAotICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogCiAvKgogICogRHluYW1pYyBSYW5nZSBDb250cm9sCiAgKi8KIAogLyogRm9yIHBhcmFtZXRlciBjb252ZXJzaW9uICovCi0jZGVmaW5lIERSQ19QQVJBTUVURVJfQklUUyAgICAgICAgKCA3ICkKLSNkZWZpbmUgRFJDX01BWF9RVUFOVF9TVEVQUyAgICAgICAoIDE8PERSQ19QQVJBTUVURVJfQklUUyApCi0jZGVmaW5lIERSQ19NQVhfUVVBTlRfRkFDVE9SICAgICAgKCBEUkNfTUFYX1FVQU5UX1NURVBTLTEgKQotI2RlZmluZSBEUkNfUEFSQU1fUVVBTlRfU1RFUCAgICAgICggRkwyRlhDT05TVF9EQkwoMS4wZi8oZmxvYXQpRFJDX01BWF9RVUFOVF9GQUNUT1IpICkKLSNkZWZpbmUgRFJDX1BBUkFNX1NDQUxFICAgICAgICAgICAoIDEgKQorI2RlZmluZSBEUkNfUEFSQU1FVEVSX0JJVFMgKDcpCisjZGVmaW5lIERSQ19NQVhfUVVBTlRfU1RFUFMgKDEgPDwgRFJDX1BBUkFNRVRFUl9CSVRTKQorI2RlZmluZSBEUkNfTUFYX1FVQU5UX0ZBQ1RPUiAoRFJDX01BWF9RVUFOVF9TVEVQUyAtIDEpCisjZGVmaW5lIERSQ19QQVJBTV9RVUFOVF9TVEVQIFwKKyAgKEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpRFJDX01BWF9RVUFOVF9GQUNUT1IpKQorI2RlZmluZSBEUkNfUEFSQU1fU0NBTEUgKDEpCisjZGVmaW5lIERSQ19TQ0FMSU5HX01BWCBcCisgICgoRklYUF9EQkwpKChJTlQpKERSQ19QQVJBTV9RVUFOVF9TVEVQID4+IERSQ19QQVJBTV9TQ0FMRSkgKiAoSU5UKTEyNykpCiAKLSNkZWZpbmUgTUFYX1JFRkVSRU5DRV9MRVZFTCAgICAgICAoIDEyNyApCisjZGVmaW5lIERSQ19CTE9DS19MRU4gKDEwMjQpCisjZGVmaW5lIERSQ19CQU5EX01VTFQgKDQpCisjZGVmaW5lIERSQ19CTE9DS19MRU5fRElWX0JBTkRfTVVMVCAoRFJDX0JMT0NLX0xFTiAvIERSQ19CQU5EX01VTFQpCiAKLSAjZGVmaW5lIERWQl9BTkNfREFUQV9TWU5DX0JZVEUgICAoIDB4QkMgKSAgICAvKiBEVkIgYW5jaWxsYXJ5IGRhdGEgc3luYyBieXRlLiAqLworI2RlZmluZSBNQVhfUkVGRVJFTkNFX0xFVkVMICgxMjcpCisKKyNkZWZpbmUgRFJDX0hFQVZZX1RIUkVTSE9MRF9EQiAoMTApCisKKyNkZWZpbmUgRFZCX0FOQ19EQVRBX1NZTkNfQllURSAoMHhCQykgLyogRFZCIGFuY2lsbGFyeSBkYXRhIHN5bmMgYnl0ZS4gKi8KKworI2RlZmluZSBPRkYgMAorI2RlZmluZSBPTiAxCisKK3N0YXRpYyBJTlQgY29udmVydF9kcmNQYXJhbShGSVhQX0RCTCBwYXJhbV9kYmwpIHsKKyAgLyogY29udmVydHMgYW4gaW50ZXJuYWwgRFJDIGJvb3N0L2N1dCBzY2FsaW5nIGZhY3RvciBpbiBGSVhQX0RCTAorICAgICAod2hpY2ggaXMgZG93bnNjYWxlZCBieSBEUkNfUEFSQU1fU0NBTEUpCisgICAgIGJhY2sgdG8gYW4gaW50ZWdlciB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEyNy4gKi8KKyAgTE9ORyBwYXJhbV9sb25nOworCisgIHBhcmFtX2xvbmcgPSAoTE9ORylwYXJhbV9kYmwgPj4gNzsKKyAgcGFyYW1fbG9uZyA9IHBhcmFtX2xvbmcgKiAoSU5UKURSQ19NQVhfUVVBTlRfRkFDVE9SOworICBwYXJhbV9sb25nID4+PSAzMSAtIDcgLSBEUkNfUEFSQU1fU0NBTEUgLSAxOworICBwYXJhbV9sb25nICs9IDE7IC8qIGZvciByb3VuZGluZyAqLworICBwYXJhbV9sb25nID4+PSAxOworCisgIHJldHVybiAoSU5UKXBhcmFtX2xvbmc7Cit9CiAKIC8qIQogICBcYnJpZWYgSW5pdGlhbGl6ZSBEUkMgaW5mb3JtYXRpb24KQEAgLTExOCw5ICsxNTYsNyBAQAogCiAgIFxyZXR1cm4gbm9uZQogKi8KLXZvaWQgYWFjRGVjb2Rlcl9kcmNJbml0ICgKLSAgICBIQU5ETEVfQUFDX0RSQyBzZWxmICkKLXsKK3ZvaWQgYWFjRGVjb2Rlcl9kcmNJbml0KEhBTkRMRV9BQUNfRFJDIHNlbGYpIHsKICAgQ0RyY1BhcmFtcyAqcFBhcmFtczsKIAogICBpZiAoc2VsZiA9PSBOVUxMKSB7CkBAIC0xMjgsMjggKzE2NCwzNiBAQAogICB9CiAKICAgLyogaW5pdCBjb250cm9sIGZpZWxkcyAqLwotICBzZWxmLT5lbmFibGUgPSAwOworICBzZWxmLT5lbmFibGUgPSBPRkY7CiAgIHNlbGYtPm51bVRocmVhZHMgPSAwOwogCiAgIC8qIGluaXQgcGFyYW1zICovCiAgIHBQYXJhbXMgPSAmc2VsZi0+cGFyYW1zOwogICBwUGFyYW1zLT5ic0RlbGF5RW5hYmxlID0gMDsKLSAgcFBhcmFtcy0+Y3V0ICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgcFBhcmFtcy0+dXNyQ3V0ICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgcFBhcmFtcy0+Ym9vc3QgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgcFBhcmFtcy0+Y3V0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIHBQYXJhbXMtPnVzckN1dCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBwUGFyYW1zLT5ib29zdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBwUGFyYW1zLT51c3JCb29zdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBwUGFyYW1zLT50YXJnZXRSZWZMZXZlbCA9IC0xOwogICBwUGFyYW1zLT5leHBpcnlGcmFtZSA9IEFBQ0RFQ19EUkNfREZMVF9FWFBJUllfRlJBTUVTOwotICBwUGFyYW1zLT5hcHBseURpZ2l0YWxOb3JtID0gMDsKLSAgcFBhcmFtcy0+YXBwbHlIZWF2eUNvbXByZXNzaW9uID0gMDsKKyAgcFBhcmFtcy0+YXBwbHlEaWdpdGFsTm9ybSA9IE9GRjsKKyAgcFBhcmFtcy0+YXBwbHlIZWF2eUNvbXByZXNzaW9uID0gT0ZGOworICBwUGFyYW1zLT51c3JBcHBseUhlYXZ5Q29tcHJlc3Npb24gPSBPRkY7CisKKyAgcFBhcmFtcy0+ZGVmYXVsdFByZXNlbnRhdGlvbk1vZGUgPSBESVNBQkxFRF9QQVJBTUVURVJfSEFORExJTkc7CisgIHBQYXJhbXMtPmVuY29kZXJUYXJnZXRMZXZlbCA9IE1BWF9SRUZFUkVOQ0VfTEVWRUw7IC8qIHdvcnN0IGNhc2UgYXNzdW1wdGlvbiAqLworCisgIHNlbGYtPnVwZGF0ZSA9IDE7CisgIHNlbGYtPm51bU91dENoYW5uZWxzID0gMDsKKyAgc2VsZi0+cHJldkFhY051bUNoYW5uZWxzID0gMDsKIAogICAvKiBpbml0aWFsIHByb2dyYW0gcmVmIGxldmVsID0gdGFyZ2V0IHJlZiBsZXZlbCAqLwogICBzZWxmLT5wcm9nUmVmTGV2ZWwgPSBwUGFyYW1zLT50YXJnZXRSZWZMZXZlbDsKICAgc2VsZi0+cHJvZ1JlZkxldmVsUHJlc2VudCA9IDA7CiAgIHNlbGYtPnByZXNNb2RlID0gLTE7CisgIHNlbGYtPnVuaURyY1ByZWNlZGVuY2UgPSAwOwogfQogCi0KIC8qIQogICBcYnJpZWYgSW5pdGlhbGl6ZSBEUkMgY29udHJvbCBkYXRhIGZvciBvbmUgY2hhbm5lbAogCkBAIC0xNTcsMjAgKzIwMSwxNyBAQAogCiAgIFxyZXR1cm4gbm9uZQogKi8KLXZvaWQgYWFjRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbERhdGEgKAotICAgIENEcmNDaGFubmVsRGF0YSAqcERyY0NoRGF0YSApCi17Cit2b2lkIGFhY0RlY29kZXJfZHJjSW5pdENoYW5uZWxEYXRhKENEcmNDaGFubmVsRGF0YSAqcERyY0NoRGF0YSkgewogICBpZiAocERyY0NoRGF0YSAhPSBOVUxMKSB7CiAgICAgcERyY0NoRGF0YS0+ZXhwaXJ5Q291bnQgPSAwOwotICAgIHBEcmNDaERhdGEtPm51bUJhbmRzICAgID0gMTsKLSAgICBwRHJjQ2hEYXRhLT5iYW5kVG9wWzBdICA9ICgxMDI0ID4+IDIpIC0gMTsKKyAgICBwRHJjQ2hEYXRhLT5udW1CYW5kcyA9IDE7CisgICAgcERyY0NoRGF0YS0+YmFuZFRvcFswXSA9IERSQ19CTE9DS19MRU5fRElWX0JBTkRfTVVMVCAtIDE7CiAgICAgcERyY0NoRGF0YS0+ZHJjVmFsdWVbMF0gPSAwOwogICAgIHBEcmNDaERhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWUgPSAwOwogICAgIHBEcmNDaERhdGEtPmRyY0RhdGFUeXBlID0gVU5LTk9XTl9QQVlMT0FEOwogICB9CiB9CiAKLQogLyohCiAgIFxicmllZiAgU2V0IG9uZSBzaW5nbGUgRFJDIHBhcmFtZXRlcgogCkBAIC0xODAsMTQxICsyMjEsMTUyIEBACiAKICAgXHJldHVybiBhbiBlcnJvciBjb2RlLgogKi8KLUFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAotICAgIEhBTkRMRV9BQUNfRFJDICAgIHNlbGYsCi0gICAgQUFDREVDX0RSQ19QQVJBTSAgcGFyYW0sCi0gICAgSU5UICAgICAgICAgICAgICAgdmFsdWUgKQoteworQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbShIQU5ETEVfQUFDX0RSQyBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfRFJDX1BBUkFNIHBhcmFtLCBJTlQgdmFsdWUpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOwogCi0gIHN3aXRjaCAocGFyYW0pCi0gIHsKLSAgY2FzZSBEUkNfQ1VUX1NDQUxFOgotICAgIC8qIHNldCBhdHRlbnVhdGlvbiBzY2FsZSBmYWN0b3IgKi8KLSAgICBpZiAoICh2YWx1ZSA8IDApCi0gICAgICB8fCAodmFsdWUgPiBEUkNfTUFYX1FVQU5UX0ZBQ1RPUikgKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICB9Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotICAgIHNlbGYtPnBhcmFtcy51c3JDdXQgPSAoRklYUF9EQkwpKChJTlQpKERSQ19QQVJBTV9RVUFOVF9TVEVQPj5EUkNfUEFSQU1fU0NBTEUpICogKElOVCl2YWx1ZSk7Ci0gICAgaWYgKHNlbGYtPnBhcmFtcy5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPT0gMCkKLSAgICAgIHNlbGYtPnBhcmFtcy5jdXQgPSBzZWxmLT5wYXJhbXMudXNyQ3V0OwotICAgIGJyZWFrOwotICBjYXNlIERSQ19CT09TVF9TQ0FMRToKLSAgICAvKiBzZXQgYm9vc3QgZmFjdG9yICovCi0gICAgaWYgKCAodmFsdWUgPCAwKQotICAgICAgfHwgKHZhbHVlID4gRFJDX01BWF9RVUFOVF9GQUNUT1IpICkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgfQotICAgIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICBzZWxmLT5wYXJhbXMudXNyQm9vc3QgPSAoRklYUF9EQkwpKChJTlQpKERSQ19QQVJBTV9RVUFOVF9TVEVQPj5EUkNfUEFSQU1fU0NBTEUpICogKElOVCl2YWx1ZSk7Ci0gICAgaWYgKHNlbGYtPnBhcmFtcy5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPT0gMCkKLSAgICAgIHNlbGYtPnBhcmFtcy5ib29zdCA9IHNlbGYtPnBhcmFtcy51c3JCb29zdDsKLSAgICBicmVhazsKLSAgY2FzZSBUQVJHRVRfUkVGX0xFVkVMOgotICAgIGlmICggdmFsdWUgPiAgTUFYX1JFRkVSRU5DRV9MRVZFTAotICAgICAgfHwgdmFsdWUgPCAtTUFYX1JFRkVSRU5DRV9MRVZFTCApIHsKLSAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgIH0KLSAgICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIDwgMCkgewotICAgICAgc2VsZi0+cGFyYW1zLmFwcGx5RGlnaXRhbE5vcm0gPSAwOwotICAgICAgc2VsZi0+cGFyYW1zLnRhcmdldFJlZkxldmVsID0gLTE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLyogcmVmX2xldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCBNQVhfUkVGRVJFTkNFX0xFVkVMLCBpbmNsdXNpdmUgKi8KLSAgICAgIHNlbGYtPnBhcmFtcy5hcHBseURpZ2l0YWxOb3JtID0gMTsKLSAgICAgIGlmIChzZWxmLT5wYXJhbXMudGFyZ2V0UmVmTGV2ZWwgIT0gKFNDSEFSKXZhbHVlKSB7Ci0gICAgICAgIHNlbGYtPnBhcmFtcy50YXJnZXRSZWZMZXZlbCA9IChTQ0hBUil2YWx1ZTsKLSAgICAgICAgc2VsZi0+cHJvZ1JlZkxldmVsID0gKFNDSEFSKXZhbHVlOyAgLyogQWx3YXlzIHNldCB0aGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgZXF1YWwgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCBsZXZlbCBhY2NvcmRpbmcgdG8gNC41LjIuNy4zIG9mIElTTy9JRUMgMTQ0OTYtMy4gKi8KKyAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRFJDX0NVVF9TQ0FMRToKKyAgICAgIC8qIHNldCBhdHRlbnVhdGlvbiBzY2FsZSBmYWN0b3IgKi8KKyAgICAgIGlmICgodmFsdWUgPCAwKSB8fCAodmFsdWUgPiBEUkNfTUFYX1FVQU5UX0ZBQ1RPUikpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIEFQUExZX05PUk1BTElaQVRJT046Ci0gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgIH0KLSAgICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgLyogU3RvcmUgbmV3IHBhcmFtZXRlciB2YWx1ZSAqLwotICAgIHNlbGYtPnBhcmFtcy5hcHBseURpZ2l0YWxOb3JtID0gKFVDSEFSKXZhbHVlOwotICAgIGJyZWFrOwotICBjYXNlIEFQUExZX0hFQVZZX0NPTVBSRVNTSU9OOgotICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICB9Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotICAgIGlmIChzZWxmLT5wYXJhbXMuYXBwbHlIZWF2eUNvbXByZXNzaW9uICE9IChVQ0hBUil2YWx1ZSkgewotICAgICAgaWYgKHZhbHVlID09IDEpIHsKLSAgICAgICAgLyogRGlzYWJsZSBzY2FsaW5nIG9mIERSQyB2YWx1ZXMgYnkgc2V0dGluZyB0aGUgbWF4IHZhbHVlcyAqLwotICAgICAgICBzZWxmLT5wYXJhbXMuYm9vc3QgPSBGTDJGWENPTlNUX0RCTCgxLjBmLyhmbG9hdCkoMTw8RFJDX1BBUkFNX1NDQUxFKSk7Ci0gICAgICAgIHNlbGYtPnBhcmFtcy5jdXQgICA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKGZsb2F0KSgxPDxEUkNfUEFSQU1fU0NBTEUpKTsKKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICB9CisgICAgICBzZWxmLT5wYXJhbXMudXNyQ3V0ID0gKEZJWFBfREJMKSgKKyAgICAgICAgICAoSU5UKShEUkNfUEFSQU1fUVVBTlRfU1RFUCA+PiBEUkNfUEFSQU1fU0NBTEUpICogKElOVCl2YWx1ZSk7CisgICAgICBzZWxmLT51cGRhdGUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfQk9PU1RfU0NBTEU6CisgICAgICAvKiBzZXQgYm9vc3QgZmFjdG9yICovCisgICAgICBpZiAoKHZhbHVlIDwgMCkgfHwgKHZhbHVlID4gRFJDX01BWF9RVUFOVF9GQUNUT1IpKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnBhcmFtcy51c3JCb29zdCA9IChGSVhQX0RCTCkoCisgICAgICAgICAgKElOVCkoRFJDX1BBUkFNX1FVQU5UX1NURVAgPj4gRFJDX1BBUkFNX1NDQUxFKSAqIChJTlQpdmFsdWUpOworICAgICAgc2VsZi0+dXBkYXRlID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFSR0VUX1JFRl9MRVZFTDoKKyAgICAgIGlmICh2YWx1ZSA+IE1BWF9SRUZFUkVOQ0VfTEVWRUwgfHwgdmFsdWUgPCAtTUFYX1JFRkVSRU5DRV9MRVZFTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICB9CisgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIHNlbGYtPnBhcmFtcy5hcHBseURpZ2l0YWxOb3JtID0gT0ZGOworICAgICAgICBzZWxmLT5wYXJhbXMudGFyZ2V0UmVmTGV2ZWwgPSAtMTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFJlc3RvcmUgdGhlIHVzZXIgcGFyYW1zICovCi0gICAgICAgIHNlbGYtPnBhcmFtcy5ib29zdCA9IHNlbGYtPnBhcmFtcy51c3JCb29zdDsKLSAgICAgICAgc2VsZi0+cGFyYW1zLmN1dCAgID0gc2VsZi0+cGFyYW1zLnVzckN1dDsKKyAgICAgICAgLyogcmVmX2xldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCBNQVhfUkVGRVJFTkNFX0xFVkVMLCBpbmNsdXNpdmUgKi8KKyAgICAgICAgc2VsZi0+cGFyYW1zLmFwcGx5RGlnaXRhbE5vcm0gPSBPTjsKKyAgICAgICAgaWYgKHNlbGYtPnBhcmFtcy50YXJnZXRSZWZMZXZlbCAhPSAoU0NIQVIpdmFsdWUpIHsKKyAgICAgICAgICBzZWxmLT5wYXJhbXMudGFyZ2V0UmVmTGV2ZWwgPSAoU0NIQVIpdmFsdWU7CisgICAgICAgICAgc2VsZi0+cHJvZ1JlZkxldmVsID0gKFNDSEFSKXZhbHVlOyAvKiBBbHdheXMgc2V0IHRoZSBwcm9ncmFtIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgZXF1YWwgdG8gdGhlIHRhcmdldCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIDQuNS4yLjcuMyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNPL0lFQyAxNDQ5Ni0zLiAqLworICAgICAgICB9CisgICAgICAgIHNlbGYtPnVwZGF0ZSA9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFQUExZX05PUk1BTElaQVRJT046CisgICAgICBpZiAoKHZhbHVlICE9IE9GRikgJiYgKHZhbHVlICE9IE9OKSkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICAgICB9CiAgICAgICAvKiBTdG9yZSBuZXcgcGFyYW1ldGVyIHZhbHVlICovCi0gICAgICBzZWxmLT5wYXJhbXMuYXBwbHlIZWF2eUNvbXByZXNzaW9uID0gKFVDSEFSKXZhbHVlOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBEUkNfQlNfREVMQVk6Ci0gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHsKKyAgICAgIHNlbGYtPnBhcmFtcy5hcHBseURpZ2l0YWxOb3JtID0gKFVDSEFSKXZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUFBMWV9IRUFWWV9DT01QUkVTU0lPTjoKKyAgICAgIGlmICgodmFsdWUgIT0gT0ZGKSAmJiAodmFsdWUgIT0gT04pKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIC8qIFN0b3JlIG5ldyBwYXJhbWV0ZXIgdmFsdWUgKi8KKyAgICAgIHNlbGYtPnBhcmFtcy51c3JBcHBseUhlYXZ5Q29tcHJlc3Npb24gPSAoVUNIQVIpdmFsdWU7CisgICAgICBzZWxmLT51cGRhdGUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBERUZBVUxUX1BSRVNFTlRBVElPTl9NT0RFOgorICAgICAgaWYgKHZhbHVlIDwgQUFDX0RSQ19QQVJBTUVURVJfSEFORExJTkdfRElTQUJMRUQgfHwKKyAgICAgICAgICB2YWx1ZSA+IEFBQ19EUkNfUFJFU0VOVEFUSU9OX01PREVfMl9ERUZBVUxUKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnBhcmFtcy5kZWZhdWx0UHJlc2VudGF0aW9uTW9kZSA9CisgICAgICAgICAgKEFBQ0RFQ19EUkNfUEFSQU1FVEVSX0hBTkRMSU5HKXZhbHVlOworICAgICAgc2VsZi0+dXBkYXRlID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRU5DT0RFUl9UQVJHRVRfTEVWRUw6CisgICAgICBpZiAodmFsdWUgPiBNQVhfUkVGRVJFTkNFX0xFVkVMIHx8IHZhbHVlIDwgMCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICB9CisgICAgICBzZWxmLT5wYXJhbXMuZW5jb2RlclRhcmdldExldmVsID0gKFVDSEFSKXZhbHVlOworICAgICAgc2VsZi0+dXBkYXRlID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX0JTX0RFTEFZOgorICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICB9CisgICAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgICAgfQorICAgICAgc2VsZi0+cGFyYW1zLmJzRGVsYXlFbmFibGUgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX0RBVEFfRVhQSVJZX0ZSQU1FOgorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnBhcmFtcy5leHBpcnlGcmFtZSA9ICh2YWx1ZSA+IDApID8gKFVJTlQpdmFsdWUgOiAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVhfT1VUUFVUX0NIQU5ORUxTOgorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIHNlbGYtPm51bU91dENoYW5uZWxzID0gKElOVCl2YWx1ZTsKKyAgICAgIHNlbGYtPnVwZGF0ZSA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVOSURSQ19QUkVDRURFTkNFOgorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnVuaURyY1ByZWNlZGVuY2UgPSAoVUNIQVIpdmFsdWU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgfQotICAgIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICBzZWxmLT5wYXJhbXMuYnNEZWxheUVuYWJsZSA9IHZhbHVlOwotICAgIGJyZWFrOwotICBjYXNlIERSQ19EQVRBX0VYUElSWV9GUkFNRToKLSAgICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgc2VsZi0+cGFyYW1zLmV4cGlyeUZyYW1lID0gKFVJTlQpdmFsdWU7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gIH0gIC8qIHN3aXRjaChwYXJhbSkgKi8KLQotICAvKiBzd2l0Y2ggb24vb2ZmIHByb2Nlc3NpbmcgKi8KLSAgc2VsZi0+ZW5hYmxlID0gKCAoc2VsZi0+cGFyYW1zLmJvb3N0ID4gKEZJWFBfREJMKTApCi0gICAgICAgICAgICAgICAgfHwgKHNlbGYtPnBhcmFtcy5jdXQgICA+IChGSVhQX0RCTCkwKQotICAgICAgICAgICAgICAgIHx8IChzZWxmLT5wYXJhbXMuYXBwbHlIZWF2eUNvbXByZXNzaW9uICE9IDApCi0gICAgICAgICAgICAgICAgfHwgKHNlbGYtPnBhcmFtcy50YXJnZXRSZWZMZXZlbCA+PSAwKSApOwotCisgIH0gLyogc3dpdGNoKHBhcmFtKSAqLwogCiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAotCi1zdGF0aWMgaW50IHBhcnNlRXhjbHVkZWRDaGFubmVscyggVUlOVCAqZXhjbHVkZWRDaG5zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicyApCi17CitzdGF0aWMgaW50IHBhcnNlRXhjbHVkZWRDaGFubmVscyhVSU5UICpleGNsdWRlZENobnNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpIHsKICAgVUlOVCBleGNsdWRlTWFzayA9IDA7CiAgIFVJTlQgaSwgajsKLSAgaW50ICBiaXRDbnQgPSA5OworICBpbnQgYml0Q250ID0gOTsKIAotICBmb3IgKGkgPSAwLCBqID0gMTsgaSA8IDc7IGkrKywgajw8PTEpIHsKLSAgICBpZiAoRkRLcmVhZEJpdHMoYnMsMSkpIHsKKyAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCA3OyBpKyssIGogPDw9IDEpIHsKKyAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSB7CiAgICAgICBleGNsdWRlTWFzayB8PSBqOwogICAgIH0KICAgfQogCiAgIC8qIGFkZGl0aW9uYWxfZXhjbHVkZWRfY2hucyAqLwotICB3aGlsZSAoRkRLcmVhZEJpdHMoYnMsMSkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrLCBqPDw9MSkgewotICAgICAgaWYgKEZES3JlYWRCaXRzKGJzLDEpKSB7CisgIHdoaWxlIChGREtyZWFkQml0cyhicywgMSkpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrLCBqIDw8PSAxKSB7CisgICAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSB7CiAgICAgICAgIGV4Y2x1ZGVNYXNrIHw9IGo7CiAgICAgICB9CiAgICAgfQpAQCAtMzI3LDcgKzM3OSw2IEBACiAgIHJldHVybiAoYml0Q250KTsKIH0KIAotCiAvKiEKICAgXGJyaWVmIFNhdmUgRFJDIHBheWxvYWQgYml0c3RyZWFtIHBvc2l0aW9uCiAKQEAgLTMzNiwxMyArMzg3LDEwIEBACiAKICAgXHJldHVybiBUaGUgbnVtYmVyIG9mIERSQyBwYXlsb2FkIGJpdHMKICovCi1pbnQgYWFjRGVjb2Rlcl9kcmNNYXJrUGF5bG9hZCAoCi0gICAgSEFORExFX0FBQ19EUkMgc2VsZiwKLSAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICBBQUNERUNfRFJDX1BBWUxPQURfVFlQRSB0eXBlICkKLXsKK2ludCBhYWNEZWNvZGVyX2RyY01hcmtQYXlsb2FkKEhBTkRMRV9BQUNfRFJDIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX0RSQ19QQVlMT0FEX1RZUEUgdHlwZSkgewogICBVSU5UIGJzU3RhcnRQb3M7Ci0gIGludCAgaSwgbnVtQmFuZHMgPSAxLCBiaXRDbnQgPSAwOworICBpbnQgaSwgbnVtQmFuZHMgPSAxLCBiaXRDbnQgPSAwOwogCiAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICByZXR1cm4gMDsKQEAgLTM1MSw5NyArMzk5LDk3IEBACiAgIGJzU3RhcnRQb3MgPSBGREtnZXRWYWxpZEJpdHMoYnMpOwogCiAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgTVBFR19EUkNfRVhUX0RBVEE6Ci0gICAgeworICAgIGNhc2UgTVBFR19EUkNfRVhUX0RBVEE6IHsKICAgICAgIGJpdENudCA9IDQ7CiAKLSAgICAgIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgICAvKiBwY2VfdGFnX3ByZXNlbnQgKi8KLSAgICAgICAgRkRLcmVhZEJpdHMoYnMsOCk7ICAgICAgICAgICAgICAvKiBwY2VfaW5zdGFuY2VfdGFnICsgZHJjX3RhZ19yZXNlcnZlZF9iaXRzICovCi0gICAgICAgIGJpdENudCs9ODsKKyAgICAgIGlmIChGREtyZWFkQml0cyhicywgMSkpIHsgLyogcGNlX3RhZ19wcmVzZW50ICovCisgICAgICAgIEZES3JlYWRCaXRzKGJzLCA4KTsgICAgIC8qIHBjZV9pbnN0YW5jZV90YWcgKyBkcmNfdGFnX3Jlc2VydmVkX2JpdHMgKi8KKyAgICAgICAgYml0Q250ICs9IDg7CiAgICAgICB9CiAKLSAgICAgIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgICAvKiBleGNsdWRlZF9jaG5zX3ByZXNlbnQgKi8KLSAgICAgICAgRkRLcmVhZEJpdHMoYnMsNyk7ICAgICAgICAgICAgICAvKiBleGNsdWRlIG1hc2sgWzAuLjddICovCi0gICAgICAgIGJpdENudCs9ODsKLSAgICAgICAgd2hpbGUgKEZES3JlYWRCaXRzKGJzLDEpKSB7ICAgICAvKiBhZGRpdGlvbmFsX2V4Y2x1ZGVkX2NobnMgKi8KLSAgICAgICAgICBGREtyZWFkQml0cyhicyw3KTsgICAgICAgICAgICAvKiBleGNsdWRlIG1hc2sgW3guLnldICovCi0gICAgICAgICAgYml0Q250Kz04OworICAgICAgaWYgKEZES3JlYWRCaXRzKGJzLCAxKSkgeyAvKiBleGNsdWRlZF9jaG5zX3ByZXNlbnQgKi8KKyAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDcpOyAgICAgLyogZXhjbHVkZSBtYXNrIFswLi43XSAqLworICAgICAgICBiaXRDbnQgKz0gODsKKyAgICAgICAgd2hpbGUgKEZES3JlYWRCaXRzKGJzLCAxKSkgeyAvKiBhZGRpdGlvbmFsX2V4Y2x1ZGVkX2NobnMgKi8KKyAgICAgICAgICBGREtyZWFkQml0cyhicywgNyk7ICAgICAgICAvKiBleGNsdWRlIG1hc2sgW3guLnldICovCisgICAgICAgICAgYml0Q250ICs9IDg7CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgaWYgKEZES3JlYWRCaXRzKGJzLDEpKSB7ICAgICAgICAgIC8qIGRyY19iYW5kc19wcmVzZW50ICovCisgICAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSB7ICAgICAgICAgLyogZHJjX2JhbmRzX3ByZXNlbnQgKi8KICAgICAgICAgbnVtQmFuZHMgKz0gRkRLcmVhZEJpdHMoYnMsIDQpOyAvKiBkcmNfYmFuZF9pbmNyICovCi0gICAgICAgIEZES3JlYWRCaXRzKGJzLDQpOyAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KLSAgICAgICAgYml0Q250Kz04OworICAgICAgICBGREtyZWFkQml0cyhicywgNCk7ICAgICAgICAgICAgIC8qIHJlc2VydmVkICovCisgICAgICAgIGJpdENudCArPSA4OwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgIEZES3JlYWRCaXRzKGJzLDgpOyAgICAgICAgICAgIC8qIGRyY19iYW5kX3RvcFtpXSAqLwotICAgICAgICAgIGJpdENudCs9ODsKKyAgICAgICAgICBGREtyZWFkQml0cyhicywgOCk7IC8qIGRyY19iYW5kX3RvcFtpXSAqLworICAgICAgICAgIGJpdENudCArPSA4OwogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgICAvKiBwcm9nX3JlZl9sZXZlbF9wcmVzZW50ICovCi0gICAgICAgIEZES3JlYWRCaXRzKGJzLDgpOyAgICAgICAgICAgICAgLyogcHJvZ19yZWZfbGV2ZWwgKyBwcm9nX3JlZl9sZXZlbF9yZXNlcnZlZF9iaXRzICovCi0gICAgICAgIGJpdENudCs9ODsKKyAgICAgIGlmIChGREtyZWFkQml0cyhicywgMSkpIHsgLyogcHJvZ19yZWZfbGV2ZWxfcHJlc2VudCAqLworICAgICAgICBGREtyZWFkQml0cyhicywgOCk7IC8qIHByb2dfcmVmX2xldmVsICsgcHJvZ19yZWZfbGV2ZWxfcmVzZXJ2ZWRfYml0cyAqLworICAgICAgICBiaXRDbnQgKz0gODsKICAgICAgIH0KIAogICAgICAgZm9yIChpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgRkRLcmVhZEJpdHMoYnMsOCk7ICAgICAgICAgICAgICAvKiBkeW5fcm5nX3NnbltpXSArIGR5bl9ybmdfY3RsW2ldICovCi0gICAgICAgIGJpdENudCs9ODsKKyAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDgpOyAvKiBkeW5fcm5nX3NnbltpXSArIGR5bl9ybmdfY3RsW2ldICovCisgICAgICAgIGJpdENudCArPSA4OwogICAgICAgfQogCi0gICAgICBpZiAoIChzZWxmLT5udW1QYXlsb2FkcyA8IE1BWF9EUkNfVEhSRUFEUykKLSAgICAgICAgJiYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSA+PSAwKSApCi0gICAgICB7CisgICAgICBpZiAoKHNlbGYtPm51bVBheWxvYWRzIDwgTUFYX0RSQ19USFJFQURTKSAmJgorICAgICAgICAgICgoSU5UKUZES2dldFZhbGlkQml0cyhicykgPj0gMCkpIHsKICAgICAgICAgc2VsZi0+ZHJjUGF5bG9hZFBvc2l0aW9uW3NlbGYtPm51bVBheWxvYWRzKytdID0gYnNTdGFydFBvczsKICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7CisgICAgfSBicmVhazsKIAogICAgIGNhc2UgRFZCX0RSQ19BTkNfREFUQToKICAgICAgIGJpdENudCArPSA4OwogICAgICAgLyogY2hlY2sgc3luYyB3b3JkICovCi0gICAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDgpID09IERWQl9BTkNfREFUQV9TWU5DX0JZVEUpCi0gICAgICB7CisgICAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDgpID09IERWQl9BTkNfREFUQV9TWU5DX0JZVEUpIHsKICAgICAgICAgaW50IGRteExldmVsc1ByZXNlbnQsIGNvbXByZXNzaW9uUHJlc2VudDsKICAgICAgICAgaW50IGNvYXJzZUdyYWluVGNQcmVzZW50LCBmaW5lR3JhaW5UY1ByZXNlbnQ7CiAKLSAgICAgICAgLyogYnNfaW5mbyBmaWVsZCAqLyAKLSAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXBlZ19hdWRpb190eXBlLCBkb2xieV9zdXJyb3VuZF9tb2RlLCBwcmVzZW50YXRpb25fbW9kZSAqLwotICAgICAgICBiaXRDbnQrPTg7CisgICAgICAgIC8qIGJzX2luZm8gZmllbGQgKi8KKyAgICAgICAgRkRLcmVhZEJpdHMoCisgICAgICAgICAgICBicywKKyAgICAgICAgICAgIDgpOyAvKiBtcGVnX2F1ZGlvX3R5cGUsIGRvbGJ5X3N1cnJvdW5kX21vZGUsIHByZXNlbnRhdGlvbl9tb2RlICovCisgICAgICAgIGJpdENudCArPSA4OwogCiAgICAgICAgIC8qIEV2YWx1YXRlIGFuY2lsbGFyeV9kYXRhX3N0YXR1cyAqLwotICAgICAgICBGREtyZWFkQml0cyhicywgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCwgc2V0IHRvIDAgKi8KLSAgICAgICAgZG14TGV2ZWxzUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzRfc3RhdHVzICovCi0gICAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkLCBzZXQgdG8gMCAqLwotICAgICAgICBjb21wcmVzc2lvblByZXNlbnQgICA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAvKiBhdWRpb19jb2RpbmdfbW9kZV9hbmRfY29tcHJlc3Npb24gc3RhdHVzICovCi0gICAgICAgIGNvYXJzZUdyYWluVGNQcmVzZW50ID0gRkRLcmVhZEJpdHMoYnMsIDEpOyAgIC8qIGNvYXJzZV9ncmFpbl90aW1lY29kZV9zdGF0dXMgKi8KLSAgICAgICAgZmluZUdyYWluVGNQcmVzZW50ICAgPSBGREtyZWFkQml0cyhicywgMSk7ICAgLyogZmluZV9ncmFpbl90aW1lY29kZV9zdGF0dXMgKi8KLSAgICAgICAgYml0Q250Kz04OworICAgICAgICBGREtyZWFkQml0cyhicywgMyk7IC8qIHJlc2VydmVkLCBzZXQgdG8gMCAqLworICAgICAgICBkbXhMZXZlbHNQcmVzZW50ID0KKyAgICAgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzRfc3RhdHVzICovCisgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgICAgIC8qIHJlc2VydmVkLCBzZXQgdG8gMCAqLworICAgICAgICBjb21wcmVzc2lvblByZXNlbnQgPQorICAgICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDEpOyAvKiBhdWRpb19jb2RpbmdfbW9kZV9hbmRfY29tcHJlc3Npb24gc3RhdHVzICovCisgICAgICAgIGNvYXJzZUdyYWluVGNQcmVzZW50ID0KKyAgICAgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgLyogY29hcnNlX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLworICAgICAgICBmaW5lR3JhaW5UY1ByZXNlbnQgPQorICAgICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDEpOyAvKiBmaW5lX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLworICAgICAgICBiaXRDbnQgKz0gODsKIAogICAgICAgICAvKiBNUEVHNCBkb3dubWl4aW5nIGxldmVscyAqLwogICAgICAgICBpZiAoZG14TGV2ZWxzUHJlc2VudCkgewotICAgICAgICAgIEZES3JlYWRCaXRzKGJzLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb3dubWl4aW5nX2xldmVsc19NUEVHNCAqLwotICAgICAgICAgIGJpdENudCs9ODsKKyAgICAgICAgICBGREtyZWFkQml0cyhicywgOCk7IC8qIGRvd25taXhpbmdfbGV2ZWxzX01QRUc0ICovCisgICAgICAgICAgYml0Q250ICs9IDg7CiAgICAgICAgIH0KICAgICAgICAgLyogYXVkaW8gY29kaW5nIG1vZGUgYW5kIGNvbXByZXNzaW9uIHN0YXR1cyAqLwogICAgICAgICBpZiAoY29tcHJlc3Npb25QcmVzZW50KSB7Ci0gICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdWRpb19jb2RpbmdfbW9kZSwgQ29tcHJlc3Npb25fdmFsdWUgKi8KLSAgICAgICAgICBiaXRDbnQrPTE2OworICAgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxNik7IC8qIGF1ZGlvX2NvZGluZ19tb2RlLCBDb21wcmVzc2lvbl92YWx1ZSAqLworICAgICAgICAgIGJpdENudCArPSAxNjsKICAgICAgICAgfQogICAgICAgICAvKiBjb2Fyc2UgZ3JhaW4gdGltZWNvZGUgKi8KICAgICAgICAgaWYgKGNvYXJzZUdyYWluVGNQcmVzZW50KSB7Ci0gICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvYXJzZV9ncmFpbl90aW1lY29kZSAqLwotICAgICAgICAgIGJpdENudCs9MTY7CisgICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDE2KTsgLyogY29hcnNlX2dyYWluX3RpbWVjb2RlICovCisgICAgICAgICAgYml0Q250ICs9IDE2OwogICAgICAgICB9CiAgICAgICAgIC8qIGZpbmUgZ3JhaW4gdGltZWNvZGUgKi8KICAgICAgICAgaWYgKGZpbmVHcmFpblRjUHJlc2VudCkgewotICAgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBmaW5lX2dyYWluX3RpbWVjb2RlICovCi0gICAgICAgICAgYml0Q250Kz0xNjsKKyAgICAgICAgICBGREtyZWFkQml0cyhicywgMTYpOyAvKiBmaW5lX2dyYWluX3RpbWVjb2RlICovCisgICAgICAgICAgYml0Q250ICs9IDE2OwogICAgICAgICB9Ci0gICAgICAgIGlmICggIXNlbGYtPmR2YkFuY0RhdGFBdmFpbGFibGUKLSAgICAgICAgICAmJiAoKElOVClGREtnZXRWYWxpZEJpdHMoYnMpID49IDApICkKLSAgICAgICAgewotICAgICAgICAgIHNlbGYtPmR2YkFuY0RhdGFQb3NpdGlvbiAgPSBic1N0YXJ0UG9zOworICAgICAgICBpZiAoIXNlbGYtPmR2YkFuY0RhdGFBdmFpbGFibGUgJiYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSA+PSAwKSkgeworICAgICAgICAgIHNlbGYtPmR2YkFuY0RhdGFQb3NpdGlvbiA9IGJzU3RhcnRQb3M7CiAgICAgICAgICAgc2VsZi0+ZHZiQW5jRGF0YUF2YWlsYWJsZSA9IDE7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTQ1NCwxMTIgKzUwMiwxMDEgQEAKICAgcmV0dXJuIChiaXRDbnQpOwogfQogCi0KIC8qIQogICBcYnJpZWYgUGFyc2UgRFJDIHBhcmFtZXRlcnMgZnJvbSBiaXRzdHJlYW0KIAogICBcYnMgSGFuZGxlIG9mIEZESyBiaXRzdHJlYW0gKGluKQogICBccERyY0JzIFBvaW50ZXIgdG8gRFJDIHBheWxvYWQgZGF0YSBjb250YWluZXIgKG91dCkKLSAgXHBheWxvYWRQb3NpdGlvbiBCaXRzdHJlYW0gcG9zaXRpb24gb2YgTVBFRyBEUkMgZGF0YSBqdW5rIChpbikKKyAgXHBheWxvYWRQb3NpdGlvbiBCaXRzdHJlYW0gcG9zaXRpb24gb2YgTVBFRyBEUkMgZGF0YSBjaHVuayAoaW4pCiAKLSAgXHJldHVybiBOdW1iZXIgb2YgYml0cyByZWFkICgwIGluIGNhc2Ugb2YgYSBwYXJzZSBlcnJvcikKKyAgXHJldHVybiBGbGFnIHRlbGxpbmcgd2hldGhlciBuZXcgRFJDIGRhdGEgaGFzIGJlZW4gZm91bmQgb3Igbm90LgogKi8KLXN0YXRpYyBpbnQgYWFjRGVjb2Rlcl9kcmNQYXJzZSAoCi0gICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgIENEcmNQYXlsb2FkICAgICAgICAgICpwRHJjQnMsCi0gICAgVUlOVCAgICAgICAgICAgICAgICAgIHBheWxvYWRQb3NpdGlvbiApCi17Ci0gIGludCBpLCBudW1CYW5kcywgYml0Q250ID0gNDsKK3N0YXRpYyBpbnQgYWFjRGVjb2Rlcl9kcmNQYXJzZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0RyY1BheWxvYWQgKnBEcmNCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHBheWxvYWRQb3NpdGlvbikgeworICBpbnQgaSwgbnVtQmFuZHM7CiAKICAgLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBEUkMgcGF5bG9hZCBmaWVsZCAqLwotICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgRkRLZ2V0VmFsaWRCaXRzKGJzKS1wYXlsb2FkUG9zaXRpb24pOworICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgKElOVClGREtnZXRWYWxpZEJpdHMoYnMpIC0gKElOVClwYXlsb2FkUG9zaXRpb24pOwogCiAgIC8qIHBjZV90YWdfcHJlc2VudCAqLwotICBpZiAoRkRLcmVhZEJpdHMoYnMsMSkpCi0gIHsKLSAgICBwRHJjQnMtPnBjZUluc3RhbmNlVGFnID0gRkRLcmVhZEJpdHMoYnMsIDQpOyAgLyogcGNlX2luc3RhbmNlX3RhZyAqLworICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSB7CisgICAgcERyY0JzLT5wY2VJbnN0YW5jZVRhZyA9IEZES3JlYWRCaXRzKGJzLCA0KTsgLyogcGNlX2luc3RhbmNlX3RhZyAqLwogICAgIC8qIG9ubHkgb25lIHByb2dyYW0gc3VwcG9ydGVkICovCi0gICAgRkRLcmVhZEJpdHMoYnMsIDQpOyAgLyogZHJjX3RhZ19yZXNlcnZlZF9iaXRzICovCi0gICAgYml0Q250ICs9IDg7CisgICAgRkRLcmVhZEJpdHMoYnMsIDQpOyAvKiBkcmNfdGFnX3Jlc2VydmVkX2JpdHMgKi8KICAgfSBlbHNlIHsKLSAgICBwRHJjQnMtPnBjZUluc3RhbmNlVGFnID0gLTE7ICAvKiBub3QgcHJlc2VudCAqLworICAgIHBEcmNCcy0+cGNlSW5zdGFuY2VUYWcgPSAtMTsgLyogbm90IHByZXNlbnQgKi8KICAgfQogCi0gIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgLyogZXhjbHVkZWRfY2huc19wcmVzZW50ICovCisgIGlmIChGREtyZWFkQml0cyhicywgMSkpIHsgLyogZXhjbHVkZWRfY2huc19wcmVzZW50ICovCiAgICAgLyogZ2V0IGV4Y2x1ZGVkX2Nobl9tYXNrICovCi0gICAgYml0Q250ICs9IHBhcnNlRXhjbHVkZWRDaGFubmVscygmcERyY0JzLT5leGNsdWRlZENobnNNYXNrLCBicyk7CisgICAgcGFyc2VFeGNsdWRlZENoYW5uZWxzKCZwRHJjQnMtPmV4Y2x1ZGVkQ2huc01hc2ssIGJzKTsKICAgfSBlbHNlIHsKICAgICBwRHJjQnMtPmV4Y2x1ZGVkQ2huc01hc2sgPSAwOwogICB9CiAKICAgbnVtQmFuZHMgPSAxOwotICBpZiAoRkRLcmVhZEJpdHMoYnMsMSkpICAvKiBkcmNfYmFuZHNfcHJlc2VudCAqLworICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSAvKiBkcmNfYmFuZHNfcHJlc2VudCAqLwogICB7CiAgICAgLyogZ2V0IGJhbmRfaW5jciAqLwotICAgIG51bUJhbmRzICs9IEZES3JlYWRCaXRzKGJzLCA0KTsgIC8qIGRyY19iYW5kX2luY3IgKi8KLSAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY0ludGVycG9sYXRpb25TY2hlbWUgPSBGREtyZWFkQml0cyhicywgNCk7ICAvKiBkcmNfaW50ZXJwb2xhdGlvbl9zY2hlbWUgKi8KLSAgICBiaXRDbnQgKz0gODsKKyAgICBudW1CYW5kcyArPSBGREtyZWFkQml0cyhicywgNCk7IC8qIGRyY19iYW5kX2luY3IgKi8KKyAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY0ludGVycG9sYXRpb25TY2hlbWUgPQorICAgICAgICBGREtyZWFkQml0cyhicywgNCk7IC8qIGRyY19pbnRlcnBvbGF0aW9uX3NjaGVtZSAqLwogICAgIC8qIGJhbmRfdG9wICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspCi0gICAgewotICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5iYW5kVG9wW2ldID0gRkRLcmVhZEJpdHMoYnMsIDgpOyAgLyogZHJjX2JhbmRfdG9wW2ldICovCi0gICAgICBiaXRDbnQgKz0gODsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5iYW5kVG9wW2ldID0gRkRLcmVhZEJpdHMoYnMsIDgpOyAvKiBkcmNfYmFuZF90b3BbaV0gKi8KICAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcERyY0JzLT5jaGFubmVsRGF0YS5iYW5kVG9wWzBdID0gKDEwMjQgPj4gMikgLSAxOyAgLyogLi4uIGNvbXByaXNpbmcgdGhlIHdob2xlIHNwZWN0cnVtLiAqLzsKKyAgfSBlbHNlIHsKKyAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gPSBEUkNfQkxPQ0tfTEVOX0RJVl9CQU5EX01VTFQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7IC8qIC4uLiBjb21wcmlzaW5nIHRoZSB3aG9sZSBzcGVjdHJ1bS4gKi8KKyAgICA7CiAgIH0KIAogICBwRHJjQnMtPmNoYW5uZWxEYXRhLm51bUJhbmRzID0gbnVtQmFuZHM7CiAKLSAgaWYgKEZES3JlYWRCaXRzKGJzLDEpKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2dfcmVmX2xldmVsX3ByZXNlbnQgKi8KKyAgaWYgKEZES3JlYWRCaXRzKGJzLCAxKSkgLyogcHJvZ19yZWZfbGV2ZWxfcHJlc2VudCAqLwogICB7Ci0gICAgcERyY0JzLT5wcm9nUmVmTGV2ZWwgPSBGREtyZWFkQml0cyhicywgNyk7ICAvKiBwcm9nX3JlZl9sZXZlbCAqLwotICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvZ19yZWZfbGV2ZWxfcmVzZXJ2ZWRfYml0cyAqLwotICAgIGJpdENudCArPSA4OworICAgIHBEcmNCcy0+cHJvZ1JlZkxldmVsID0gRkRLcmVhZEJpdHMoYnMsIDcpOyAvKiBwcm9nX3JlZl9sZXZlbCAqLworICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgLyogcHJvZ19yZWZfbGV2ZWxfcmVzZXJ2ZWRfYml0cyAqLwogICB9IGVsc2UgewogICAgIHBEcmNCcy0+cHJvZ1JlZkxldmVsID0gLTE7CiAgIH0KIAotICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykKLSAgewotICAgIHBEcmNCcy0+Y2hhbm5lbERhdGEuZHJjVmFsdWVbaV0gID0gRkRLcmVhZEJpdHMoYnMsIDEpIDw8IDc7ICAgLyogZHluX3JuZ19zZ25baV0gKi8KLSAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY1ZhbHVlW2ldIHw9IEZES3JlYWRCaXRzKGJzLCA3KSAmIDB4N0Y7IC8qIGR5bl9ybmdfY3RsW2ldICovCi0gICAgYml0Q250ICs9IDg7CisgIGZvciAoaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNWYWx1ZVtpXSA9IEZES3JlYWRCaXRzKGJzLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA3OyAvKiBkeW5fcm5nX3NnbltpXSAqLworICAgIHBEcmNCcy0+Y2hhbm5lbERhdGEuZHJjVmFsdWVbaV0gfD0KKyAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDcpICYgMHg3RjsgLyogZHluX3JuZ19jdGxbaV0gKi8KICAgfQogCiAgIC8qIFNldCBEUkMgcGF5bG9hZCB0eXBlICovCiAgIHBEcmNCcy0+Y2hhbm5lbERhdGEuZHJjRGF0YVR5cGUgPSBNUEVHX0RSQ19FWFRfREFUQTsKIAotICByZXR1cm4gKGJpdENudCk7CisgIHJldHVybiAoMSk7CiB9CiAKLQogLyohCi0gIFxicmllZiBQYXJzZSBoZWF2eSBjb21wcmVzc2lvbiB2YWx1ZSB0cmFuc3BvcnRlZCBpbiBEU0VzIG9mIERWQiBzdHJlYW1zIHdpdGggTVBFRy00IGNvbnRlbnQuCisgIFxicmllZiBQYXJzZSBoZWF2eSBjb21wcmVzc2lvbiB2YWx1ZSB0cmFuc3BvcnRlZCBpbiBEU0VzIG9mIERWQiBzdHJlYW1zIHdpdGgKKyAgTVBFRy00IGNvbnRlbnQuCiAKICAgXGJzIEhhbmRsZSBvZiBGREsgYml0c3RyZWFtIChpbikKICAgXHBEcmNCcyBQb2ludGVyIHRvIERSQyBwYXlsb2FkIGRhdGEgY29udGFpbmVyIChvdXQpCi0gIFxwYXlsb2FkUG9zaXRpb24gQml0c3RyZWFtIHBvc2l0aW9uIG9mIERWQiBhbmNpbGxhcnkgZGF0YSBqdW5rCisgIFxwYXlsb2FkUG9zaXRpb24gQml0c3RyZWFtIHBvc2l0aW9uIG9mIERWQiBhbmNpbGxhcnkgZGF0YSBjaHVuawogCi0gIFxyZXR1cm4gTnVtYmVyIG9mIGJpdHMgcmVhZCAoMCBpbiBjYXNlIG9mIGEgcGFyc2UgZXJyb3IpCisgIFxyZXR1cm4gRmxhZyB0ZWxsaW5nIHdoZXRoZXIgbmV3IERSQyBkYXRhIGhhcyBiZWVuIGZvdW5kIG9yIG5vdC4KICovCi0jZGVmaW5lIERWQl9DT01QUkVTU0lPTl9TQ0FMRSAgICggOCApICAgICAgIC8qIDQ4LDE2NCBkQiAqLworI2RlZmluZSBEVkJfQ09NUFJFU1NJT05fU0NBTEUgKDgpIC8qIDQ4LDE2NCBkQiAqLwogCi1zdGF0aWMgaW50IGFhY0RlY29kZXJfZHJjUmVhZENvbXByZXNzaW9uICgKLSAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCi0gICAgQ0RyY1BheWxvYWQgICAgICAgICAgKnBEcmNCcywKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgcGF5bG9hZFBvc2l0aW9uICkKLXsKLSAgaW50ICBiaXRDbnQgPSAwOwotICBpbnQgIGRteExldmVsc1ByZXNlbnQsIGV4dGVuc2lvblByZXNlbnQsIGNvbXByZXNzaW9uUHJlc2VudDsKLSAgaW50ICBjb2Fyc2VHcmFpblRjUHJlc2VudCwgZmluZUdyYWluVGNQcmVzZW50Oworc3RhdGljIGludCBhYWNEZWNvZGVyX2RyY1JlYWRDb21wcmVzc2lvbihIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RyY1BheWxvYWQgKnBEcmNCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBwYXlsb2FkUG9zaXRpb24pIHsKKyAgaW50IGZvdW5kRHJjRGF0YSA9IDA7CisgIGludCBkbXhMZXZlbHNQcmVzZW50LCBjb21wcmVzc2lvblByZXNlbnQ7CiAKICAgLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBEUkMgcGF5bG9hZCBmaWVsZCAqLwotICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgRkRLZ2V0VmFsaWRCaXRzKGJzKS1wYXlsb2FkUG9zaXRpb24pOworICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgKElOVClGREtnZXRWYWxpZEJpdHMoYnMpIC0gKElOVClwYXlsb2FkUG9zaXRpb24pOwogCiAgIC8qIFNhbml0eSBjaGVja3MgKi8KLSAgaWYgKCBGREtnZXRWYWxpZEJpdHMoYnMpIDwgMjQgKSB7CisgIGlmIChGREtnZXRWYWxpZEJpdHMoYnMpIDwgMjQpIHsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC01NjgsMTE1ICs2MDUsODcgQEAKICAgICByZXR1cm4gMDsKICAgfQogCi0gIC8qIEV2YWx1YXRlIGJzX2luZm8gZmllbGQgKi8gCi0gIGlmIChGREtyZWFkQml0cyhicywgMikgIT0gMykgeyAgICAgICAgICAgICAgIC8qIG1wZWdfYXVkaW9fdHlwZSAqLworICAvKiBFdmFsdWF0ZSBic19pbmZvIGZpZWxkICovCisgIGlmIChGREtyZWFkQml0cyhicywgMikgIT0gMykgeyAvKiBtcGVnX2F1ZGlvX3R5cGUgKi8KICAgICAvKiBObyBNUEVHLTQgYXVkaW8gZGF0YSAqLwogICAgIHJldHVybiAwOwogICB9Ci0gIEZES3JlYWRCaXRzKGJzLCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbGJ5X3N1cnJvdW5kX21vZGUgKi8KLSAgcERyY0JzLT5wcmVzTW9kZSA9IEZES3JlYWRCaXRzKGJzLCAyKTsgICAgICAgLyogcHJlc2VudGF0aW9uX21vZGUgKi8KLSAgRkRLcmVhZEJpdHMoYnMsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RlcmVvX2Rvd25taXhfbW9kZSAqLwotICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpICE9IDApIHsgICAgICAgICAgICAgICAvKiByZXNlcnZlZCwgc2V0IHRvIDAgKi8KKyAgRkRLcmVhZEJpdHMoYnMsIDIpOyAgICAgICAgICAgICAgICAgICAgLyogZG9sYnlfc3Vycm91bmRfbW9kZSAqLworICBwRHJjQnMtPnByZXNNb2RlID0gRkRLcmVhZEJpdHMoYnMsIDIpOyAvKiBwcmVzZW50YXRpb25fbW9kZSAqLworICBGREtyZWFkQml0cyhicywgMSk7ICAgICAgICAgICAgICAgICAgICAvKiBzdGVyZW9fZG93bm1peF9tb2RlICovCisgIGlmIChGREtyZWFkQml0cyhicywgMSkgIT0gMCkgeyAgICAgICAgIC8qIHJlc2VydmVkLCBzZXQgdG8gMCAqLwogICAgIHJldHVybiAwOwogICB9CiAKICAgLyogRXZhbHVhdGUgYW5jaWxsYXJ5X2RhdGFfc3RhdHVzICovCi0gIGlmIChGREtyZWFkQml0cyhicywgMykgIT0gMCkgeyAgICAgICAgICAgICAgIC8qIHJlc2VydmVkLCBzZXQgdG8gMCAqLworICBpZiAoRkRLcmVhZEJpdHMoYnMsIDMpICE9IDApIHsgLyogcmVzZXJ2ZWQsIHNldCB0byAwICovCiAgICAgcmV0dXJuIDA7CiAgIH0KLSAgZG14TGV2ZWxzUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzRfc3RhdHVzICovCi0gIGV4dGVuc2lvblByZXNlbnQgPSBGREtyZWFkQml0cyhicywgMSk7ICAgICAgIC8qIGFuY2lsbGFyeV9kYXRhX2V4dGVuc2lvbl9zdGF0dXM7ICovCi0gIGNvbXByZXNzaW9uUHJlc2VudCAgID0gRkRLcmVhZEJpdHMoYnMsIDEpOyAgIC8qIGF1ZGlvX2NvZGluZ19tb2RlX2FuZF9jb21wcmVzc2lvbiBzdGF0dXMgKi8KLSAgY29hcnNlR3JhaW5UY1ByZXNlbnQgPSBGREtyZWFkQml0cyhicywgMSk7ICAgLyogY29hcnNlX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLwotICBmaW5lR3JhaW5UY1ByZXNlbnQgICA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAvKiBmaW5lX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLwotICBiaXRDbnQgKz0gMjQ7CisgIGRteExldmVsc1ByZXNlbnQgPSBGREtyZWFkQml0cyhicywgMSk7IC8qIGRvd25taXhpbmdfbGV2ZWxzX01QRUc0X3N0YXR1cyAqLworICAvKmV4dGVuc2lvblByZXNlbnQgPSovRkRLcmVhZEJpdHMoYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsgLyogYW5jaWxsYXJ5X2RhdGFfZXh0ZW5zaW9uX3N0YXR1czsgKi8KKyAgY29tcHJlc3Npb25QcmVzZW50ID0KKyAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgLyogYXVkaW9fY29kaW5nX21vZGVfYW5kX2NvbXByZXNzaW9uIHN0YXR1cyAqLworICAvKmNvYXJzZUdyYWluVGNQcmVzZW50ID0qL0ZES3JlYWRCaXRzKGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKiBjb2Fyc2VfZ3JhaW5fdGltZWNvZGVfc3RhdHVzICovCisgIC8qZmluZUdyYWluVGNQcmVzZW50ICAgPSovRkRLcmVhZEJpdHMoYnMsIDEpOyAvKiBmaW5lX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLwogCiAgIGlmIChkbXhMZXZlbHNQcmVzZW50KSB7Ci0gICAgRkRLcmVhZEJpdHMoYnMsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvd25taXhpbmdfbGV2ZWxzX01QRUc0ICovCi0gICAgYml0Q250ICs9IDg7CisgICAgRkRLcmVhZEJpdHMoYnMsIDgpOyAvKiBkb3dubWl4aW5nX2xldmVsc19NUEVHNCAqLwogICB9CiAKICAgLyogYXVkaW9fY29kaW5nX21vZGVfYW5kX2NvbXByZXNzaW9uX3N0YXR1cyAqLwotICBpZiAoY29tcHJlc3Npb25QcmVzZW50KQotICB7CisgIGlmIChjb21wcmVzc2lvblByZXNlbnQpIHsKICAgICBVQ0hBUiBjb21wcmVzc2lvbk9uLCBjb21wcmVzc2lvblZhbHVlOwogCiAgICAgLyogYXVkaW9fY29kaW5nX21vZGUgKi8KLSAgICBpZiAoIEZES3JlYWRCaXRzKGJzLCA3KSAhPSAwICkgeyAgLyogVGhlIHJlc2VydmVkIGJpdHMgc2hhbGwgYmUgc2V0IHRvICIwIi4gKi8KKyAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDcpICE9IDApIHsgLyogVGhlIHJlc2VydmVkIGJpdHMgc2hhbGwgYmUgc2V0IHRvICIwIi4gKi8KICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBjb21wcmVzc2lvbk9uICAgID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKTsgIC8qIGNvbXByZXNzaW9uX29uICovCi0gICAgY29tcHJlc3Npb25WYWx1ZSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgOCk7ICAvKiBDb21wcmVzc2lvbl92YWx1ZSAqLwotICAgIGJpdENudCArPSAxNjsKKyAgICBjb21wcmVzc2lvbk9uID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKTsgICAgLyogY29tcHJlc3Npb25fb24gKi8KKyAgICBjb21wcmVzc2lvblZhbHVlID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA4KTsgLyogQ29tcHJlc3Npb25fdmFsdWUgKi8KIAotICAgIGlmICggY29tcHJlc3Npb25PbiApIHsKLSAgICAgIC8qIEEgY29tcHJlc3Npb24gdmFsdWUgaXMgYXZhaWxhYmxlIHNvIHN0b3JlIHRoZSBkYXRhIGp1c3QgbGlrZSBNUEVHIERSQyBkYXRhICovCi0gICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLm51bUJhbmRzICAgID0gIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9uZSBiYW5kIC4uLiAqLwotICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNWYWx1ZVswXSA9ICBjb21wcmVzc2lvblZhbHVlOyAgICAgICAgICAgICAvKiAuLi4gd2l0aCBvbmUgdmFsdWUgLi4uICovCi0gICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gID0gKDEwMjQgPj4gMikgLSAxOyAgLyogLi4uIGNvbXByaXNpbmcgdGhlIHdob2xlIHNwZWN0cnVtLiAqLwotICAgICAgcERyY0JzLT5wY2VJbnN0YW5jZVRhZyAgICAgICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgcHJlc2VudCAqLwotICAgICAgcERyY0JzLT5wcm9nUmVmTGV2ZWwgICAgICAgICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgcHJlc2VudCAqLwotICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNEYXRhVHlwZSA9ICBEVkJfRFJDX0FOQ19EQVRBOyAgICAgICAgICAgICAvKiBTZXQgRFJDIHBheWxvYWQgdHlwZSB0byBEVkIuICovCi0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE5vIGNvbXByZXNzaW9uIHZhbHVlIGF2YWlsYWJsZSAqLwotICAgICAgLyogQ0FVVElPTjogSXQgaXMgbm90IGNsZWFybHkgZGVmaW5lZCBieSBzdGFuZGFyZCBob3cgdG8gcmVhY3QgaW4gdGhpcyBzaXR1YXRpb24uICovCi0gICAgICAvKiBUdXJuIGRvd24gdGhlIGNvbXByZXNzaW9uIHZhbHVlIHRvIGFwcm94LiAwZEIgKi8KLSAgICAgIHBEcmNCcy0+Y2hhbm5lbERhdGEubnVtQmFuZHMgICAgPSAgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT25lIGJhbmQgLi4uICovCi0gICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY1ZhbHVlWzBdID0gIDB4ODA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC4uLiB3aXRoIGFwcm94LiAwZEIgLi4uICovCi0gICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gID0gKDEwMjQgPj4gMikgLSAxOyAgLyogLi4uIGNvbXByaXNpbmcgdGhlIHdob2xlIHNwZWN0cnVtLiAqLwotICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNEYXRhVHlwZSA9ICBEVkJfRFJDX0FOQ19EQVRBOyAgICAgICAgICAgICAvKiBTZXQgRFJDIHBheWxvYWQgdHlwZSB0byBEVkIuICovCi0KLSAgICAgIC8qIElmIGNvbXByZXNzaW9uX29uIGZpZWxkIGlzIHNldCB0byAiMCIgdGhlIGNvbXByZXNzaW9uX3ZhbHVlIGZpZWxkIHNoYWxsIGJlICIwMDAwIDAwMDAiLiAqLwotICAgICAgaWYgKGNvbXByZXNzaW9uVmFsdWUgIT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KKyAgICBpZiAoY29tcHJlc3Npb25PbikgeworICAgICAgLyogQSBjb21wcmVzc2lvbiB2YWx1ZSBpcyBhdmFpbGFibGUgc28gc3RvcmUgdGhlIGRhdGEganVzdCBsaWtlIE1QRUcgRFJDCisgICAgICAgKiBkYXRhICovCisgICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLm51bUJhbmRzID0gMTsgLyogT25lIGJhbmQgLi4uICovCisgICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY1ZhbHVlWzBdID0KKyAgICAgICAgICBjb21wcmVzc2lvblZhbHVlOyAvKiAuLi4gd2l0aCBvbmUgdmFsdWUgLi4uICovCisgICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gPQorICAgICAgICAgIERSQ19CTE9DS19MRU5fRElWX0JBTkRfTVVMVCAtCisgICAgICAgICAgMTsgLyogLi4uIGNvbXByaXNpbmcgdGhlIHdob2xlIHNwZWN0cnVtLiAqLworICAgICAgOworICAgICAgcERyY0JzLT5wY2VJbnN0YW5jZVRhZyA9IC0xOyAvKiBOb3QgcHJlc2VudCAqLworICAgICAgcERyY0JzLT5wcm9nUmVmTGV2ZWwgPSAtMTsgICAvKiBOb3QgcHJlc2VudCAqLworICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNEYXRhVHlwZSA9CisgICAgICAgICAgRFZCX0RSQ19BTkNfREFUQTsgLyogU2V0IERSQyBwYXlsb2FkIHR5cGUgdG8gRFZCLiAqLworICAgICAgZm91bmREcmNEYXRhID0gMTsKICAgICB9CiAgIH0KIAotICAvKiBSZWFkIHRpbWVjb2RlcyBpZiBhdmFpbGFibGUganVzdCB0byBnZXQgdGhlIHJpZ2h0IGFtb3VudCBvZiBiaXRzLiAqLwotICBpZiAoY29hcnNlR3JhaW5UY1ByZXNlbnQpIHsKLSAgICBGREtyZWFkQml0cyhicywgMTYpOyAgICAgIC8qIGNvYXJzZV9ncmFpbl90aW1lY29kZSAqLwotICAgIGJpdENudCArPSAxNjsKLSAgfQotICBpZiAoZmluZUdyYWluVGNQcmVzZW50KSB7Ci0gICAgRkRLcmVhZEJpdHMoYnMsIDE2KTsgICAgICAvKiBmaW5lX2dyYWluX3RpbWVjb2RlICovCi0gICAgYml0Q250ICs9IDE2OwotICB9Ci0KLSAgLyogUmVhZCBleHRlbnNpb24ganVzdCB0byBnZXQgdGhlIHJpZ2h0IGFtb3VudCBvZiBiaXRzLiAqLwotICBpZiAoZXh0ZW5zaW9uUHJlc2VudCkgewotICAgIGludCAgZXh0Qml0cyA9IDg7Ci0KLSAgICBGREtyZWFkQml0cyhicywgMSk7ICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQsIHNldCB0byAwICovCi0gICAgaWYgKEZES3JlYWRCaXRzKGJzLCAxKSkgZXh0Qml0cyArPSA4OyAgIC8qIGV4dF9kb3dubWl4aW5nX2xldmVsc19zdGF0dXMgKi8KLSAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSBleHRCaXRzICs9IDE2OyAgLyogZXh0X2Rvd25taXhpbmdfZ2xvYmFsX2dhaW5zX3N0YXR1cyAqLwotICAgIGlmIChGREtyZWFkQml0cyhicywgMSkpIGV4dEJpdHMgKz0gODsgICAvKiBleHRfZG93bm1peGluZ19sZmVfbGV2ZWxfc3RhdHVzICovCi0KLSAgICBGREtwdXNoRm9yKGJzLCBleHRCaXRzIC0gNCk7ICAgICAgICAgICAgLyogc2tpcCB0aGUgZXh0ZW5zaW9uIHBheWxvYWQgcmVtYWluZGVyLiAqLwotICAgIGJpdENudCArPSBleHRCaXRzOwotICB9Ci0KLSAgcmV0dXJuIChiaXRDbnQpOworICByZXR1cm4gKGZvdW5kRHJjRGF0YSk7CiB9CiAKLQotLyogCi0gKiBQcmVwYXJlIERSQyBwcm9jZXNzaW5nCisvKgorICogRXh0cmFjdCBEUkMgcGF5bG9hZCBmcm9tIGJpdHN0cmVhbSBhbmQgbWFwIGl0IHRvIGNoYW5uZWxzLgorICogICBWYWxpZCByZXR1cm4gdmFsdWVzIGFyZToKKyAqICAgICAtMSA6IEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZC4KKyAqICAgICAgMCA6IE5vIGVycm9yIGFuZCBubyB2YWxpZCBEUkMgZGF0YSBhdmFpbGFibGUuCisgKiAgICAgIDEgOiBObyBlcnJvciBhbmQgdmFsaWQgRFJDIGRhdGEgaGFzIGJlZW4gbWFwcGVkLgogICovCi1zdGF0aWMgaW50IGFhY0RlY29kZXJfZHJjRXh0cmFjdEFuZE1hcCAoCi0gICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgVUNIQVIgIHBjZUluc3RhbmNlVGFnLAotICAgICAgICBVQ0hBUiAgY2hhbm5lbE1hcHBpbmdbXSwgLyogQ2hhbm5lbCBtYXBwaW5nIHRyYW5zbGF0aW5nIGRyY0NoYW5uZWwgaW5kZXggdG8gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggKi8KLSAgICAgICAgaW50ICAgIHZhbGlkQ2hhbm5lbHMgKQotewotICBDRHJjUGF5bG9hZCAgdGhyZWFkQnNbTUFYX0RSQ19USFJFQURTXTsKK3N0YXRpYyBpbnQgYWFjRGVjb2Rlcl9kcmNFeHRyYWN0QW5kTWFwKAorICAgIEhBTkRMRV9BQUNfRFJDIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgVUNIQVIgcGNlSW5zdGFuY2VUYWcsCisgICAgVUNIQVIgY2hhbm5lbE1hcHBpbmdbXSwgLyogQ2hhbm5lbCBtYXBwaW5nIHRyYW5zbGF0aW5nIGRyY0NoYW5uZWwgaW5kZXggdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCAqLworICAgIGludCB2YWxpZENoYW5uZWxzKSB7CisgIENEcmNQYXlsb2FkIHRocmVhZEJzW01BWF9EUkNfVEhSRUFEU107CiAgIENEcmNQYXlsb2FkICp2YWxpZFRocmVhZEJzW01BWF9EUkNfVEhSRUFEU107Ci0gIENEcmNQYXJhbXMgICpwUGFyYW1zOworICBDRHJjUGFyYW1zICpwUGFyYW1zOwogICBVSU5UIGJhY2t1cEJzUG9zaXRpb247Ci0gIGludCAgaSwgdGhyZWFkLCB2YWxpZFRocmVhZHMgPSAwOwotICBpbnQgIG51bUV4Y2x1ZGVkQ2huc1tNQVhfRFJDX1RIUkVBRFNdOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGksIHRocmVhZCwgdmFsaWRUaHJlYWRzID0gMDsKIAogICBGREtfQVNTRVJUKHNlbGYgIT0gTlVMTCk7CiAgIEZES19BU1NFUlQoaEJzICE9IE5VTEwpOwpAQCAtNjg3LDQ1ICs2OTYsNDAgQEAKICAgc2VsZi0+bnVtVGhyZWFkcyA9IDA7CiAgIGJhY2t1cEJzUG9zaXRpb24gPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKIAotICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bnVtUGF5bG9hZHMgJiYgc2VsZi0+bnVtVGhyZWFkcyA8IE1BWF9EUkNfVEhSRUFEUzsgaSsrKSB7Ci0gICAgaW50IGJpdHNQYXJzZWQ7Ci0KLSAgICAvKiBJbml0IHBheWxvYWQgZGF0YSBjaHVuay4gVGhlIG1lbWNsZWFyIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2UgaXQgaW5pdGlhbGl6ZXMKLSAgICAgICB0aGUgbW9zdCB2YWx1ZXMuIFdpdGhvdXQgaXQgdGhlIG1vZHVsZSB3b3VsZG4ndCB3b3JrIHByb3Blcmx5IG9yIGNyYXNoLiAqLworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bnVtUGF5bG9hZHMgJiYgc2VsZi0+bnVtVGhyZWFkcyA8IE1BWF9EUkNfVEhSRUFEUzsKKyAgICAgICBpKyspIHsKKyAgICAvKiBJbml0IHBheWxvYWQgZGF0YSBjaHVuay4gVGhlIG1lbWNsZWFyIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2UgaXQKKyAgICAgICBpbml0aWFsaXplcyB0aGUgbW9zdCB2YWx1ZXMuIFdpdGhvdXQgaXQgdGhlIG1vZHVsZSB3b3VsZG4ndCB3b3JrIHByb3Blcmx5CisgICAgICAgb3IgY3Jhc2guICovCiAgICAgRkRLbWVtY2xlYXIoJnRocmVhZEJzW3NlbGYtPm51bVRocmVhZHNdLCBzaXplb2YoQ0RyY1BheWxvYWQpKTsKLSAgICB0aHJlYWRCc1tzZWxmLT5udW1UaHJlYWRzXS5jaGFubmVsRGF0YS5iYW5kVG9wWzBdICA9ICgxMDI0ID4+IDIpIC0gMTsKKyAgICB0aHJlYWRCc1tzZWxmLT5udW1UaHJlYWRzXS5jaGFubmVsRGF0YS5iYW5kVG9wWzBdID0KKyAgICAgICAgRFJDX0JMT0NLX0xFTl9ESVZfQkFORF9NVUxUIC0gMTsKIAogICAgIC8qIEV4dHJhY3QgcGF5bG9hZCAqLwotICAgIGJpdHNQYXJzZWQgPSBhYWNEZWNvZGVyX2RyY1BhcnNlKCBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRocmVhZEJzW3NlbGYtPm51bVRocmVhZHNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5kcmNQYXlsb2FkUG9zaXRpb25baV0gKTsKLSAgICBpZiAoYml0c1BhcnNlZCA+IDApIHsKLSAgICAgIHNlbGYtPm51bVRocmVhZHMrKzsKLSAgICB9CisgICAgc2VsZi0+bnVtVGhyZWFkcyArPSBhYWNEZWNvZGVyX2RyY1BhcnNlKGhCcywgJnRocmVhZEJzW3NlbGYtPm51bVRocmVhZHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5kcmNQYXlsb2FkUG9zaXRpb25baV0pOwogICB9CiAgIHNlbGYtPm51bVBheWxvYWRzID0gMDsKIAotICBpZiAoc2VsZi0+ZHZiQW5jRGF0YUF2YWlsYWJsZSAmJiBzZWxmLT5udW1UaHJlYWRzIDwgTUFYX0RSQ19USFJFQURTKQotICB7IC8qIEFwcGVuZCBhIERWQiBoZWF2eSBjb21wcmVzc2lvbiBwYXlsb2FkIHRocmVhZCBpZiBhdmFpbGFibGUuICovCi0gICAgaW50IGJpdHNQYXJzZWQ7CisgIGlmIChzZWxmLT5kdmJBbmNEYXRhQXZhaWxhYmxlICYmCisgICAgICBzZWxmLT5udW1UaHJlYWRzIDwgTUFYX0RSQ19USFJFQURTKSB7IC8qIEFwcGVuZCBhIERWQiBoZWF2eSBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkIHRocmVhZCBpZiBhdmFpbGFibGUuICovCiAKLSAgICAvKiBJbml0IHBheWxvYWQgZGF0YSBjaHVuay4gVGhlIG1lbWNsZWFyIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2UgaXQgaW5pdGlhbGl6ZXMKLSAgICAgICB0aGUgbW9zdCB2YWx1ZXMuIFdpdGhvdXQgaXQgdGhlIG1vZHVsZSB3b3VsZG4ndCB3b3JrIHByb3Blcmx5IG9yIGNyYXNoLiAqLworICAgIC8qIEluaXQgcGF5bG9hZCBkYXRhIGNodW5rLiBUaGUgbWVtY2xlYXIgaXMgdmVyeSBpbXBvcnRhbnQgYmVjYXVzZSBpdAorICAgICAgIGluaXRpYWxpemVzIHRoZSBtb3N0IHZhbHVlcy4gV2l0aG91dCBpdCB0aGUgbW9kdWxlIHdvdWxkbid0IHdvcmsgcHJvcGVybHkKKyAgICAgICBvciBjcmFzaC4gKi8KICAgICBGREttZW1jbGVhcigmdGhyZWFkQnNbc2VsZi0+bnVtVGhyZWFkc10sIHNpemVvZihDRHJjUGF5bG9hZCkpOwotICAgIHRocmVhZEJzW3NlbGYtPm51bVRocmVhZHNdLmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gID0gKDEwMjQgPj4gMikgLSAxOworICAgIHRocmVhZEJzW3NlbGYtPm51bVRocmVhZHNdLmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gPQorICAgICAgICBEUkNfQkxPQ0tfTEVOX0RJVl9CQU5EX01VTFQgLSAxOwogCiAgICAgLyogRXh0cmFjdCBwYXlsb2FkICovCi0gICAgYml0c1BhcnNlZCA9IGFhY0RlY29kZXJfZHJjUmVhZENvbXByZXNzaW9uKCBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRCc1tzZWxmLT5udW1UaHJlYWRzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmR2YkFuY0RhdGFQb3NpdGlvbiApOwotICAgIGlmIChiaXRzUGFyc2VkID4gMCkgewotICAgICAgc2VsZi0+bnVtVGhyZWFkcysrOwotICAgIH0KKyAgICBzZWxmLT5udW1UaHJlYWRzICs9IGFhY0RlY29kZXJfZHJjUmVhZENvbXByZXNzaW9uKAorICAgICAgICBoQnMsICZ0aHJlYWRCc1tzZWxmLT5udW1UaHJlYWRzXSwgc2VsZi0+ZHZiQW5jRGF0YVBvc2l0aW9uKTsKICAgfQogICBzZWxmLT5kdmJBbmNEYXRhQXZhaWxhYmxlID0gMDsKIAogICAvKiBSZXNldCB0aGUgYml0YnVmZmZlciAqLwotICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsIEZES2dldFZhbGlkQml0cyhoQnMpIC0gYmFja3VwQnNQb3NpdGlvbik7CisgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSAtIChJTlQpYmFja3VwQnNQb3NpdGlvbik7CiAKICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIGV4Y2xfY2huX21hc2sgKi8KIApAQCAtNzQ0LDkgKzc0OCw5IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChwVGhyZWFkQnMtPnBjZUluc3RhbmNlVGFnID49IDApIHsgIC8qIGlmIFBDRSB0YWcgcHJlc2VudCAqLworICAgIGlmIChwVGhyZWFkQnMtPnBjZUluc3RhbmNlVGFnID49IDApIHsgLyogaWYgUENFIHRhZyBwcmVzZW50ICovCiAgICAgICBpZiAocFRocmVhZEJzLT5wY2VJbnN0YW5jZVRhZyAhPSBwY2VJbnN0YW5jZVRhZykgewotICAgICAgICBjb250aW51ZTsgIC8qIGRvbid0IGFjY2VwdCAqLworICAgICAgICBjb250aW51ZTsgLyogZG9uJ3QgYWNjZXB0ICovCiAgICAgICB9CiAgICAgfQogCkBAIC03NjAsNDQgKzc2NCwxNyBAQAogICAgICAgfQogICAgIH0KICAgICBpZiAobnVtRXhjbENobnMgPCB2YWxpZENoYW5uZWxzKSB7Ci0gICAgICB2YWxpZFRocmVhZEJzW3ZhbGlkVGhyZWFkc10gICA9IHBUaHJlYWRCczsKLSAgICAgIG51bUV4Y2x1ZGVkQ2huc1t2YWxpZFRocmVhZHNdID0gbnVtRXhjbENobnM7CisgICAgICB2YWxpZFRocmVhZEJzW3ZhbGlkVGhyZWFkc10gPSBwVGhyZWFkQnM7CiAgICAgICB2YWxpZFRocmVhZHMrKzsKICAgICB9CiAgIH0KIAotICBpZiAodmFsaWRUaHJlYWRzID4gMSkgewotICAgIGludCBjaDsKLQotICAgIC8qIGNoZWNrIGNvbnNpc3RlbmN5IG9mIGV4Y2xfY2huX21hc2sgYW1vbmdzdCB2YWxpZCBEUkMgdGhyZWFkcyAqLwotICAgIGZvciAoY2ggPSAwOyBjaCA8IHZhbGlkQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgIGludCBwcmVzZW50ID0gMDsKLQotICAgICAgZm9yICh0aHJlYWQgPSAwOyB0aHJlYWQgPCB2YWxpZFRocmVhZHM7IHRocmVhZCsrKSB7Ci0gICAgICAgIENEcmNQYXlsb2FkICpwVGhyZWFkQnMgPSB2YWxpZFRocmVhZEJzW3RocmVhZF07Ci0KLQotICAgICAgICAvKiB0aHJlYWQgYXBwbGllcyB0byB0aGlzIGNoYW5uZWwgKi8KLSAgICAgICAgaWYgKCAocFRocmVhZEJzLT5jaGFubmVsRGF0YS5kcmNEYXRhVHlwZSA9PSBNUEVHX0RSQ19FWFRfREFUQSkKLSAgICAgICAgICAmJiAoIChudW1FeGNsdWRlZENobnNbdGhyZWFkXSA9PSAwKQotICAgICAgICAgICAgfHwgKCEocFRocmVhZEJzLT5leGNsdWRlZENobnNNYXNrICYgKDE8PGNoKSkpICkgKSB7Ci0gICAgICAgICAgcHJlc2VudCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgaWYgKHByZXNlbnQgPiAxKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQogICAvKiBtYXAgRFJDIGJpdHN0cmVhbSBpbmZvcm1hdGlvbiBvbnRvIERSQyBjaGFubmVsIGluZm9ybWF0aW9uICovCi0gIGZvciAodGhyZWFkID0gMDsgdGhyZWFkIDwgdmFsaWRUaHJlYWRzOyB0aHJlYWQrKykKLSAgeworICBmb3IgKHRocmVhZCA9IDA7IHRocmVhZCA8IHZhbGlkVGhyZWFkczsgdGhyZWFkKyspIHsKICAgICBDRHJjUGF5bG9hZCAqcFRocmVhZEJzID0gdmFsaWRUaHJlYWRCc1t0aHJlYWRdOwogICAgIElOVCBleGNsTWFzayA9IHBUaHJlYWRCcy0+ZXhjbHVkZWRDaG5zTWFzazsKLSAgICBBQUNERUNfRFJDX1BBWUxPQURfVFlQRSBkcmNQYXlsb2FkVHlwZSA9IChBQUNERUNfRFJDX1BBWUxPQURfVFlQRSlwVGhyZWFkQnMtPmNoYW5uZWxEYXRhLmRyY0RhdGFUeXBlOworICAgIEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFIGRyY1BheWxvYWRUeXBlID0KKyAgICAgICAgKEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFKXBUaHJlYWRCcy0+Y2hhbm5lbERhdGEuZHJjRGF0YVR5cGU7CiAgICAgaW50IGNoOwogCiAgICAgLyogbGFzdCBwcm9nUmVmTGV2ZWwgdHJhbnNtaXR0ZWQgaXMgdGhlIG9uZSB0aGF0IGlzIHVzZWQKQEAgLTgwNiw3ICs3ODMsNyBAQAogICAgIGlmIChwVGhyZWFkQnMtPnByb2dSZWZMZXZlbCA+PSAwKSB7CiAgICAgICBzZWxmLT5wcm9nUmVmTGV2ZWwgPSBwVGhyZWFkQnMtPnByb2dSZWZMZXZlbDsKICAgICAgIHNlbGYtPnByb2dSZWZMZXZlbFByZXNlbnQgPSAxOwotICAgICAgc2VsZi0+cHJsRXhwaXJ5Q291bnQgPSAwOyAgLyogR290IGEgbmV3IHZhbHVlIC0+IFJlc2V0IGNvdW50ZXIgKi8KKyAgICAgIHNlbGYtPnBybEV4cGlyeUNvdW50ID0gMDsgLyogR290IGEgbmV3IHZhbHVlIC0+IFJlc2V0IGNvdW50ZXIgKi8KICAgICB9CiAKICAgICBpZiAoZHJjUGF5bG9hZFR5cGUgPT0gRFZCX0RSQ19BTkNfREFUQSkgewpAQCAtODE2LDQzICs3OTMsNTEgQEAKIAogICAgIC8qIFNDRSwgQ1BFIGFuZCBMRkUgKi8KICAgICBmb3IgKGNoID0gMDsgY2ggPCB2YWxpZENoYW5uZWxzOyBjaCsrKSB7CisgICAgICBBQUNERUNfRFJDX1BBWUxPQURfVFlQRSBwcnZQYXlsb2FkVHlwZSA9IFVOS05PV05fUEFZTE9BRDsKICAgICAgIGludCBtYXBlZENoYW5uZWwgPSBjaGFubmVsTWFwcGluZ1tjaF07CiAKLSAgICAgIGlmICggKChleGNsTWFzayAmICgxPDxtYXBlZENoYW5uZWwpKSA9PSAwKQotICAgICAgICAmJiAoIChkcmNQYXlsb2FkVHlwZSA9PSBNUEVHX0RSQ19FWFRfREFUQSkKLSAgICAgICAgICB8fCAoKGRyY1BheWxvYWRUeXBlID09IERWQl9EUkNfQU5DX0RBVEEpICYmIHNlbGYtPnBhcmFtcy5hcHBseUhlYXZ5Q29tcHJlc3Npb24pCi0gICAgICAgICApICkgewotICAgICAgICAvKiBjb3B5IHRocmVhZCB0byBjaGFubmVsICovCisgICAgICBpZiAoKG1hcGVkQ2hhbm5lbCA+PSB2YWxpZENoYW5uZWxzKSB8fAorICAgICAgICAgICgoZXhjbE1hc2sgJiAoMSA8PCBtYXBlZENoYW5uZWwpKSAhPSAwKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmICgocFBhcmFtcy0+ZXhwaXJ5RnJhbWUgPD0gMCkgfHwKKyAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmRyY0RhdGEuZXhwaXJ5Q291bnQgPAorICAgICAgICAgICBwUGFyYW1zLT5leHBpcnlGcmFtZSkpIHsKKyAgICAgICAgcHJ2UGF5bG9hZFR5cGUgPQorICAgICAgICAgICAgKEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFKXBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgLT5kcmNEYXRhLmRyY0RhdGFUeXBlOworICAgICAgfQorICAgICAgaWYgKCgoZHJjUGF5bG9hZFR5cGUgPT0gTVBFR19EUkNfRVhUX0RBVEEpICYmCisgICAgICAgICAgIChwcnZQYXlsb2FkVHlwZSAhPSBEVkJfRFJDX0FOQ19EQVRBKSkgfHwKKyAgICAgICAgICAoKGRyY1BheWxvYWRUeXBlID09IERWQl9EUkNfQU5DX0RBVEEpICYmCisgICAgICAgICAgIChwUGFyYW1zLT5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPT0KKyAgICAgICAgICAgIE9OKSkpIHsgLyogY29weSB0aHJlYWQgdG8gY2hhbm5lbCAqLwogICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+ZHJjRGF0YSA9IHBUaHJlYWRCcy0+Y2hhbm5lbERhdGE7CisgICAgICAgIHJlc3VsdCA9IDE7CiAgICAgICB9CiAgICAgfQogICAgIC8qIENDRXMgbm90IHN1cHBvcnRlZCBieSBub3cgKi8KICAgfQogCiAgIC8qIEluY3JlbWVudCBhbmQgY2hlY2sgZXhwaXJ5IGNvdW50ZXIgZm9yIHRoZSBwcm9ncmFtIHJlZmVyZW5jZSBsZXZlbDogKi8KLSAgaWYgKCAocFBhcmFtcy0+ZXhwaXJ5RnJhbWUgPiAwKQotICAgICYmIChzZWxmLT5wcmxFeHBpcnlDb3VudCsrID4gcFBhcmFtcy0+ZXhwaXJ5RnJhbWUpICkKLSAgeyAvKiBUaGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgaXMgdG9vIG9sZCwgc28gc2V0IGl0IGJhY2sgdG8gdGhlIHRhcmdldCBsZXZlbC4gKi8KKyAgaWYgKChwUGFyYW1zLT5leHBpcnlGcmFtZSA+IDApICYmCisgICAgICAoc2VsZi0+cHJsRXhwaXJ5Q291bnQrKyA+CisgICAgICAgcFBhcmFtcy0+ZXhwaXJ5RnJhbWUpKSB7IC8qIFRoZSBwcm9ncmFtIHJlZmVyZW5jZSBsZXZlbCBpcyB0b28gb2xkLCBzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgaXQgYmFjayB0byB0aGUgdGFyZ2V0IGxldmVsLiAqLwogICAgIHNlbGYtPnByb2dSZWZMZXZlbFByZXNlbnQgPSAwOwogICAgIHNlbGYtPnByb2dSZWZMZXZlbCA9IHBQYXJhbXMtPnRhcmdldFJlZkxldmVsOwogICAgIHNlbGYtPnBybEV4cGlyeUNvdW50ID0gMDsKICAgfQogCi0gIHJldHVybiAwOworICByZXR1cm4gcmVzdWx0OwogfQogCi0KLXZvaWQgYWFjRGVjb2Rlcl9kcmNBcHBseSAoCi0gICAgICAgIEhBTkRMRV9BQUNfRFJDICAgICAgICAgIHNlbGYsCi0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgKnBTYnJEZWMsCi0gICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgIENEcmNDaGFubmVsRGF0YSAgICAgICAgKnBEcmNDaERhdGEsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgKmV4dEdhaW4sCi0gICAgICAgIGludCAgY2gsICAgLyogbmVlZGVkIG9ubHkgZm9yIFNCUiAqLwotICAgICAgICBpbnQgIGFhY0ZyYW1lU2l6ZSwKLSAgICAgICAgaW50ICBiU2JyUHJlc2VudCApCi17Ci0gIGludCBiYW5kLCB0b3AsIGJpbiwgbnVtQmFuZHM7Cit2b2lkIGFhY0RlY29kZXJfZHJjQXBwbHkoSEFORExFX0FBQ19EUkMgc2VsZiwgdm9pZCAqcFNickRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIENEcmNDaGFubmVsRGF0YSAqcERyY0NoRGF0YSwgRklYUF9EQkwgKmV4dEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoLCAvKiBuZWVkZWQgb25seSBmb3IgU0JSICovCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFhY0ZyYW1lU2l6ZSwgaW50IGJTYnJQcmVzZW50KSB7CisgIGludCBiYW5kLCBiaW4sIG51bUJhbmRzOwogICBpbnQgYm90dG9tID0gMDsKICAgaW50IG1vZGlmeUJpbnMgPSAwOwogCkBAIC04NjAsMzMgKzg0NSwzNSBAQAogICBJTlQgbWF4X2V4cG9uZW50OwogCiAgIEZJWFBfREJMIG5vcm1fbWFudGlzc2EgPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKLSAgSU5UICBub3JtX2V4cG9uZW50ID0gMTsKKyAgSU5UIG5vcm1fZXhwb25lbnQgPSAxOwogCiAgIEZJWFBfREJMIGZhY3RfbWFudGlzc2FbTUFYX0RSQ19CQU5EU107Ci0gIElOVCAgZmFjdF9leHBvbmVudFtNQVhfRFJDX0JBTkRTXTsKKyAgSU5UIGZhY3RfZXhwb25lbnRbTUFYX0RSQ19CQU5EU107CiAKLSAgQ0RyY1BhcmFtcyAgKnBQYXJhbXMgPSAmc2VsZi0+cGFyYW1zOworICBDRHJjUGFyYW1zICpwUGFyYW1zID0gJnNlbGYtPnBhcmFtczsKIAotICBGSVhQX0RCTCAgICAqcFNwZWN0cmFsQ29lZmZpY2llbnQgID0gIFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCk7Ci0gIENJY3NJbmZvICAgICpwSWNzSW5mbyAgICAgICAgICAgICAgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbzsKLSAgU0hPUlQgICAgICAgKnBTcGVjU2NhbGUgICAgICAgICAgICA9ICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGU7CisgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpOworICBDSWNzSW5mbyAqcEljc0luZm8gPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbzsKKyAgU0hPUlQgKnBTcGVjU2NhbGUgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGU7CiAKICAgaW50IHdpblNlcSA9IHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZTsKIAogICAvKiBJbmNyZW1lbnQgYW5kIGNoZWNrIGV4cGlyeSBjb3VudGVyICovCi0gIGlmICggKHBQYXJhbXMtPmV4cGlyeUZyYW1lID4gMCkKLSAgICAmJiAoKytwRHJjQ2hEYXRhLT5leHBpcnlDb3VudCA+IHBQYXJhbXMtPmV4cGlyeUZyYW1lKSApCi0gIHsgLyogVGhlIERSQyBkYXRhIGlzIHRvbyBvbGQsIHNvIGRlbGV0ZSBpdC4gKi8KLSAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSggcERyY0NoRGF0YSApOworICBpZiAoKHBQYXJhbXMtPmV4cGlyeUZyYW1lID4gMCkgJiYKKyAgICAgICgrK3BEcmNDaERhdGEtPmV4cGlyeUNvdW50ID4KKyAgICAgICBwUGFyYW1zLT5leHBpcnlGcmFtZSkpIHsgLyogVGhlIERSQyBkYXRhIGlzIHRvbyBvbGQsIHNvIGRlbGV0ZSBpdC4gKi8KKyAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YShwRHJjQ2hEYXRhKTsKICAgfQogCi0gIGlmICghc2VsZi0+ZW5hYmxlKSB7Ci0gICAgc2JyRGVjb2Rlcl9kcmNEaXNhYmxlKCAoSEFORExFX1NCUkRFQ09ERVIpcFNickRlYywgY2ggKTsKKyAgaWYgKHNlbGYtPmVuYWJsZSAhPSBPTikgeworICAgIHNickRlY29kZXJfZHJjRGlzYWJsZSgoSEFORExFX1NCUkRFQ09ERVIpcFNickRlYywgY2gpOwogICAgIGlmIChleHRHYWluICE9IE5VTEwpIHsKICAgICAgIElOVCBnYWluU2NhbGUgPSAoSU5UKSpleHRHYWluOwotICAgICAgLyogVGhlIGdhaW4gc2NhbGluZyBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gaW4gdGhlIGJ1ZmZlciBwb2ludGVkIG9uIGJ5IGV4dEdhaW4uICovCisgICAgICAvKiBUaGUgZ2FpbiBzY2FsaW5nIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBpbiB0aGUgYnVmZmVyIHBvaW50ZWQKKyAgICAgICAqIG9uIGJ5IGV4dEdhaW4uICovCiAgICAgICBpZiAoZ2FpblNjYWxlID49IDAgJiYgZ2FpblNjYWxlIDw9IERGUkFDVF9CSVRTKSB7Ci0gICAgICAgICpleHRHYWluID0gc2NhbGVWYWx1ZShub3JtX21hbnRpc3NhLCBub3JtX2V4cG9uZW50LWdhaW5TY2FsZSk7CisgICAgICAgICpleHRHYWluID0gc2NhbGVWYWx1ZShub3JtX21hbnRpc3NhLCBub3JtX2V4cG9uZW50IC0gZ2FpblNjYWxlKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIEZES19BU1NFUlQoMCk7CiAgICAgICB9CkBAIC04OTUsOSArODgyLDYgQEAKICAgfQogCiAgIG51bUJhbmRzID0gcERyY0NoRGF0YS0+bnVtQmFuZHM7Ci0gIHRvcCA9IEZES21heCgwLCBudW1CYW5kcy0xKTsKLQotICBwRHJjQ2hEYXRhLT5iYW5kVG9wWzBdID0gZml4TWluKHBEcmNDaERhdGEtPmJhbmRUb3BbMF0sIChhYWNGcmFtZVNpemUgPj4gMikgLSAxKTsKIAogICAvKiBJZiBwcm9ncmFtIHJlZmVyZW5jZSBub3JtYWxpemF0aW9uIGlzIGRvbmUgaW4gdGhlIGRpZ2l0YWwgZG9tYWluLAogICBtb2RpZnkgZmFjdG9yIHRvIHBlcmZvcm0gbm9ybWFsaXphdGlvbi4gIHByb2dfcmVmX2xldmVsIGNhbgpAQCAtOTA2LDQ1ICs4OTAsNDIgQEAKICAgcmVkdWNlZCBEQUMgU05SIChpZiBzaWduYWwgaXMgYXR0ZW51YXRlZCkgb3IgY2xpcHBpbmcgKGlmIHNpZ25hbCBpcwogICBib29zdGVkKSAqLwogCi0gIGlmIChwUGFyYW1zLT50YXJnZXRSZWZMZXZlbCA+PSAwKQotICB7CisgIGlmIChwUGFyYW1zLT50YXJnZXRSZWZMZXZlbCA+PSAwKSB7CiAgICAgLyogMC41XigodGFyZ2V0UmVmTGV2ZWwgLSBwcm9nUmVmTGV2ZWwpLzI0KSAqLwotICAgIG5vcm1fbWFudGlzc2EgPSBmTGRQb3coCi0gICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMS4wKSwgLyogbG9nMigwLjUpICovCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgKEZJWFBfREJMKSgoSU5UKShGTDJGWENPTlNUX0RCTCgxLjBmLzI0LjApPj4zKSAqIChJTlQpKHBQYXJhbXMtPnRhcmdldFJlZkxldmVsLXNlbGYtPnByb2dSZWZMZXZlbCkpLAotICAgICAgICAgICAgMywKLSAgICAgICAgICAgJm5vcm1fZXhwb25lbnQgKTsKKyAgICBub3JtX21hbnRpc3NhID0KKyAgICAgICAgZkxkUG93KEZMMkZYQ09OU1RfREJMKC0xLjApLCAvKiBsb2cyKDAuNSkgKi8KKyAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAoRklYUF9EQkwpKChJTlQpKEZMMkZYQ09OU1RfREJMKDEuMGYgLyAyNC4wKSA+PiAzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpKHBQYXJhbXMtPnRhcmdldFJlZkxldmVsIC0gc2VsZi0+cHJvZ1JlZkxldmVsKSksCisgICAgICAgICAgICAgICAzLCAmbm9ybV9leHBvbmVudCk7CiAgIH0KICAgLyogQWx3YXlzIGV4cG9ydCB0aGUgbm9ybWFsaXphdGlvbiBnYWluIChpZiBwb3NzaWJsZSkuICovCiAgIGlmIChleHRHYWluICE9IE5VTEwpIHsKICAgICBJTlQgZ2FpblNjYWxlID0gKElOVCkqZXh0R2FpbjsKLSAgICAvKiBUaGUgZ2FpbiBzY2FsaW5nIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgb24gYnkgZXh0R2Fpbi4gKi8KKyAgICAvKiBUaGUgZ2FpbiBzY2FsaW5nIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgb24KKyAgICAgKiBieSBleHRHYWluLiAqLwogICAgIGlmIChnYWluU2NhbGUgPj0gMCAmJiBnYWluU2NhbGUgPD0gREZSQUNUX0JJVFMpIHsKLSAgICAgICpleHRHYWluID0gc2NhbGVWYWx1ZShub3JtX21hbnRpc3NhLCBub3JtX2V4cG9uZW50LWdhaW5TY2FsZSk7CisgICAgICAqZXh0R2FpbiA9IHNjYWxlVmFsdWUobm9ybV9tYW50aXNzYSwgbm9ybV9leHBvbmVudCAtIGdhaW5TY2FsZSk7CiAgICAgfSBlbHNlIHsKICAgICAgIEZES19BU1NFUlQoMCk7CiAgICAgfQogICB9Ci0gIGlmIChzZWxmLT5wYXJhbXMuYXBwbHlEaWdpdGFsTm9ybSA9PSAwKSB7CisgIGlmIChzZWxmLT5wYXJhbXMuYXBwbHlEaWdpdGFsTm9ybSA9PSBPRkYpIHsKICAgICAvKiBSZXNldCBub3JtYWxpemF0aW9uIGdhaW4gc2luY2UgdGhpcyBtb2R1bGUgbXVzdCBub3QgYXBwbHkgaXQgKi8KICAgICBub3JtX21hbnRpc3NhID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CiAgICAgbm9ybV9leHBvbmVudCA9IDE7CiAgIH0KIAotCiAgIC8qIGNhbGMgc2NhbGUgZmFjdG9ycyAqLwotICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtQmFuZHM7IGJhbmQrKykKLSAgeworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtQmFuZHM7IGJhbmQrKykgewogICAgIFVDSEFSIGRyY1ZhbCA9IHBEcmNDaERhdGEtPmRyY1ZhbHVlW2JhbmRdOwotICAgIHRvcCA9IGZpeE1pbigoaW50KSggKHBEcmNDaERhdGEtPmJhbmRUb3BbYmFuZF0rMSk8PDIgKSwgYWFjRnJhbWVTaXplKTsKIAogICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKICAgICBmYWN0X2V4cG9uZW50W2JhbmRdID0gMTsKIAotICAgIGlmICggIHBQYXJhbXMtPmFwcGx5SGVhdnlDb21wcmVzc2lvbgotICAgICAgJiYgKChBQUNERUNfRFJDX1BBWUxPQURfVFlQRSlwRHJjQ2hEYXRhLT5kcmNEYXRhVHlwZSA9PSBEVkJfRFJDX0FOQ19EQVRBKSApCi0gICAgeworICAgIGlmICgocFBhcmFtcy0+YXBwbHlIZWF2eUNvbXByZXNzaW9uID09IE9OKSAmJgorICAgICAgICAoKEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFKXBEcmNDaERhdGEtPmRyY0RhdGFUeXBlID09CisgICAgICAgICBEVkJfRFJDX0FOQ19EQVRBKSkgewogICAgICAgSU5UIGNvbXByZXNzaW9uRmFjdG9yVmFsX2U7CiAgICAgICBpbnQgdmFsWCwgdmFsWTsKIApAQCAtOTU0LDQ4ICs5MzUsNDQgQEAKICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgdW5zY2FsZWQgaGVhdnkgY29tcHJlc3Npb24gZmFjdG9yLgogICAgICAgICAgY29tcHJlc3Npb25GYWN0b3IgPSA0OC4xNjQgLSA2LjAyMDYqdmFsWCAtIDAuNDAxNCp2YWxZIGRCCiAgICAgICAgICByYW5nZTogLTQ4LjE2NiBkQiB0byA0OC4xNjQgZEIgKi8KLSAgICAgIGlmICggZHJjVmFsICE9IDB4N0YgKSB7Ci0gICAgICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPQotICAgICAgICAgIGZQb3dJbnQoIEZMMkZYQ09OU1RfREJMKDAuOTU0ODM4NjcxODEpLCAvKiAtMC40MDE0ZEIgPSAwLjk1NDgzODY3MTgxICovCi0gICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICB2YWxZLAotICAgICAgICAgICAgICAgICAgJmNvbXByZXNzaW9uRmFjdG9yVmFsX2UgKTsKKyAgICAgIGlmIChkcmNWYWwgIT0gMHg3RikgeworICAgICAgICBmYWN0X21hbnRpc3NhW2JhbmRdID0gZlBvd0ludCgKKyAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTU0ODM4NjcxODEpLCAvKiAtMC40MDE0ZEIgPSAwLjk1NDgzODY3MTgxICovCisgICAgICAgICAgICAwLCB2YWxZLCAmY29tcHJlc3Npb25GYWN0b3JWYWxfZSk7CiAKICAgICAgICAgLyogLTAuMDAwOGRCICg0OC4xNjQgLSA2LjAyMDYqOCA9IC0wLjAwMDgpICovCi0gICAgICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjk5OTkwNzkwMDg0KSwgZmFjdF9tYW50aXNzYVtiYW5kXSk7CisgICAgICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPQorICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMC45OTk5MDc5MDA4NCksIGZhY3RfbWFudGlzc2FbYmFuZF0pOwogCi0gICAgICAgIGZhY3RfZXhwb25lbnRbYmFuZF0gPSBEVkJfQ09NUFJFU1NJT05fU0NBTEUgLSB2YWxYICsgY29tcHJlc3Npb25GYWN0b3JWYWxfZTsKKyAgICAgICAgZmFjdF9leHBvbmVudFtiYW5kXSA9CisgICAgICAgICAgICBEVkJfQ09NUFJFU1NJT05fU0NBTEUgLSB2YWxYICsgY29tcHJlc3Npb25GYWN0b3JWYWxfZTsKICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICBpZiAoKEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFKXBEcmNDaERhdGEtPmRyY0RhdGFUeXBlID09IE1QRUdfRFJDX0VYVF9EQVRBKQotICAgIHsKLSAgICAvKiBhcHBseSB0aGUgc2NhbGVkIGR5bmFtaWMgcmFuZ2UgY29udHJvbCB3b3JkcyB0byBmYWN0b3IuCi0gICAgICogaWYgc2NhbGluZyBkcmNfY3V0IChvciBkcmNfYm9vc3QpLCBvciBjb250cm9sIHdvcmQgZHJjX21hbnRpc3NhIGlzIDAKLSAgICAgKiB0aGVuIHRoZXJlIGlzIG5vIGR5bmFtaWMgcmFuZ2UgY29tcHJlc3Npb24KLSAgICAgKgotICAgICAqIGlmIHBEcmNDaERhdGEtPmRyY1NnbltiYW5kXSBpcyAKLSAgICAgKiAgMSB0aGVuIGdhaW4gaXMgPCAxIDogIGZhY3RvciA9IDJeKC1zZWxmLT5jdXQgICAqIHBEcmNDaERhdGEtPmRyY01hZ1tiYW5kXSAvIDI0KQotICAgICAqICAwIHRoZW4gZ2FpbiBpcyA+IDEgOiAgZmFjdG9yID0gMl4oIHNlbGYtPmJvb3N0ICogcERyY0NoRGF0YS0+ZHJjTWFnW2JhbmRdIC8gMjQpCi0gICAgICovCisgICAgfSBlbHNlIGlmICgoQUFDREVDX0RSQ19QQVlMT0FEX1RZUEUpcERyY0NoRGF0YS0+ZHJjRGF0YVR5cGUgPT0KKyAgICAgICAgICAgICAgIE1QRUdfRFJDX0VYVF9EQVRBKSB7CisgICAgICAvKiBhcHBseSB0aGUgc2NhbGVkIGR5bmFtaWMgcmFuZ2UgY29udHJvbCB3b3JkcyB0byBmYWN0b3IuCisgICAgICAgKiBpZiBzY2FsaW5nIGRyY19jdXQgKG9yIGRyY19ib29zdCksIG9yIGNvbnRyb2wgd29yZCBkcmNfbWFudGlzc2EgaXMgMAorICAgICAgICogdGhlbiB0aGVyZSBpcyBubyBkeW5hbWljIHJhbmdlIGNvbXByZXNzaW9uCisgICAgICAgKgorICAgICAgICogaWYgcERyY0NoRGF0YS0+ZHJjU2duW2JhbmRdIGlzCisgICAgICAgKiAgMSB0aGVuIGdhaW4gaXMgPCAxIDogIGZhY3RvciA9IDJeKC1zZWxmLT5jdXQgICAqCisgICAgICAgKiBwRHJjQ2hEYXRhLT5kcmNNYWdbYmFuZF0gLyAyNCkgMCB0aGVuIGdhaW4gaXMgPiAxIDogIGZhY3RvciA9IDJeKAorICAgICAgICogc2VsZi0+Ym9vc3QgKiBwRHJjQ2hEYXRhLT5kcmNNYWdbYmFuZF0gLyAyNCkKKyAgICAgICAqLwogCi0gICAgaWYgKChkcmNWYWwmMHg3RikgPiAwKSB7Ci0gICAgICBGSVhQX0RCTCB0UGFyYW1WYWwgPSAoZHJjVmFsICYgMHg4MCkgPyAtcFBhcmFtcy0+Y3V0IDogcFBhcmFtcy0+Ym9vc3Q7CisgICAgICBpZiAoKGRyY1ZhbCAmIDB4N0YpID4gMCkgeworICAgICAgICBGSVhQX0RCTCB0UGFyYW1WYWwgPSAoZHJjVmFsICYgMHg4MCkgPyAtcFBhcmFtcy0+Y3V0IDogcFBhcmFtcy0+Ym9vc3Q7CiAKLSAgICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPQotICAgICAgICBmMlBvdyggKEZJWFBfREJMKSgoSU5UKWZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYvMTkyLjBmKSwgdFBhcmFtVmFsKSAqIChkcmNWYWwmMHg3RikpLAotICAgICAgICAgICAgICAgICAzK0RSQ19QQVJBTV9TQ0FMRSwKLSAgICAgICAgICAgICAgICAmZmFjdF9leHBvbmVudFtiYW5kXSApOwotICAgIH0KKyAgICAgICAgZmFjdF9tYW50aXNzYVtiYW5kXSA9IGYyUG93KAorICAgICAgICAgICAgKEZJWFBfREJMKSgoSU5UKWZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYgLyAxOTIuMGYpLCB0UGFyYW1WYWwpICoKKyAgICAgICAgICAgICAgICAgICAgICAgKGRyY1ZhbCAmIDB4N0YpKSwKKyAgICAgICAgICAgIDMgKyBEUkNfUEFSQU1fU0NBTEUsICZmYWN0X2V4cG9uZW50W2JhbmRdKTsKKyAgICAgIH0KICAgICB9CiAKLSAgICBmYWN0X21hbnRpc3NhW2JhbmRdICA9IGZNdWx0KGZhY3RfbWFudGlzc2FbYmFuZF0sIG5vcm1fbWFudGlzc2EpOworICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPSBmTXVsdChmYWN0X21hbnRpc3NhW2JhbmRdLCBub3JtX21hbnRpc3NhKTsKICAgICBmYWN0X2V4cG9uZW50W2JhbmRdICs9IG5vcm1fZXhwb25lbnQ7CiAKLQotICAgIGJvdHRvbSA9IHRvcDsKLQotICB9ICAvKiBlbmQgbG9vcCBvdmVyIGJhbmRzICovCi0KKyAgfSAvKiBlbmQgbG9vcCBvdmVyIGJhbmRzICovCiAKICAgLyogbm9ybWFsaXphdGlvbnMgKi8KICAgewpAQCAtMTAxMiw3ICs5ODksOCBAQAogICAgIHJlcyA9IENudExlYWRpbmdaZXJvcyhtYXhfbWFudGlzc2EpIC0gMTsKIAogICAgIC8qIGFib3ZlIHRvcG1vc3QgRFJDIGJhbmQgZ2FpbiBmYWN0b3IgaXMgMSAqLwotICAgIGlmICgoKHBEcmNDaERhdGEtPmJhbmRUb3BbbnVtQmFuZHMtMV0rMSk8PDIpIDwgYWFjRnJhbWVTaXplKSByZXMgPSAwOworICAgIGlmICgoKHBEcmNDaERhdGEtPmJhbmRUb3BbZk1heCgwLCBudW1CYW5kcyAtIDEpXSArIDEpIDw8IDIpIDwgYWFjRnJhbWVTaXplKQorICAgICAgcmVzID0gMDsKIAogICAgIGlmIChyZXMgPiAwKSB7CiAgICAgICByZXMgPSBmaXhNaW4ocmVzLCBtYXhfZXhwb25lbnQpOwpAQCAtMTAyMCw3ICs5OTgsNyBAQAogCiAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtQmFuZHM7IGJhbmQrKykgewogICAgICAgICBmYWN0X21hbnRpc3NhW2JhbmRdIDw8PSByZXM7Ci0gICAgICAgIGZhY3RfZXhwb25lbnRbYmFuZF0gIC09IHJlczsKKyAgICAgICAgZmFjdF9leHBvbmVudFtiYW5kXSAtPSByZXM7CiAgICAgICB9CiAgICAgfQogCkBAIC0xMDM5LDI1ICsxMDE3LDI1IEBACiAgIH0KIAogICAvKiAgYXBwbHkgZmFjdG9yIHRvIHNwZWN0cmFsIGxpbmVzCi0gICAqICBzaG9ydCBibG9ja3MgbXVzdCB0YWtlIGNhcmUgdGhhdCBiYW5kcyBmYWxsIG9uIAorICAgKiAgc2hvcnQgYmxvY2tzIG11c3QgdGFrZSBjYXJlIHRoYXQgYmFuZHMgZmFsbCBvbgogICAgKiAgYmxvY2sgYm91bmRhcmllcyEKICAgICovCi0gIGlmICghYlNiclByZXNlbnQpCi0gIHsKKyAgaWYgKCFiU2JyUHJlc2VudCkgewogICAgIGJvdHRvbSA9IDA7CiAKICAgICBpZiAoIW1vZGlmeUJpbnMpIHsKLSAgICAgIC8qIFdlIGRvbid0IGhhdmUgdG8gbW9kaWZ5IHRoZSBzcGVjdHJhbCBiaW5zIGJlY2F1c2UgdGhlIGZyYWN0aW9uYWwgcGFydCBvZiBhbGwgZmFjdG9ycyBpcyAwLjUuCi0gICAgICAgICBJbiBvcmRlciB0byBrZWVwIGFjY3VyYW5jeSB3ZSBkb24ndCBhcHBseSB0aGUgZmFjdG9yIGJ1dCBkZWNyZWFzZSB0aGUgZXhwb25lbnQgaW5zdGVhZC4gKi8KKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgdG8gbW9kaWZ5IHRoZSBzcGVjdHJhbCBiaW5zIGJlY2F1c2UgdGhlIGZyYWN0aW9uYWwgcGFydAorICAgICAgICAgb2YgYWxsIGZhY3RvcnMgaXMgMC41LiBJbiBvcmRlciB0byBrZWVwIGFjY3VyYW5jeSB3ZSBkb24ndCBhcHBseSB0aGUKKyAgICAgICAgIGZhY3RvciBidXQgZGVjcmVhc2UgdGhlIGV4cG9uZW50IGluc3RlYWQuICovCiAgICAgICBtYXhfZXhwb25lbnQgLT0gMTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtQmFuZHM7IGJhbmQrKykKLSAgICAgIHsKLSAgICAgICAgdG9wID0gZml4TWluKChpbnQpKCAocERyY0NoRGF0YS0+YmFuZFRvcFtiYW5kXSsxKTw8MiApLCBhYWNGcmFtZVNpemUpOyAgIC8qIC4uLiAqIERSQ19CQU5EX01VTFQ7ICovCisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBudW1CYW5kczsgYmFuZCsrKSB7CisgICAgICAgIGludCB0b3AgPSBmaXhNaW4oKGludCkoKHBEcmNDaERhdGEtPmJhbmRUb3BbYmFuZF0gKyAxKSA8PCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhYWNGcmFtZVNpemUpOyAvKiAuLi4gKiBEUkNfQkFORF9NVUxUOyAqLwogCiAgICAgICAgIGZvciAoYmluID0gYm90dG9tOyBiaW4gPCB0b3A7IGJpbisrKSB7Ci0gICAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnRbYmluXSA9IGZNdWx0KHBTcGVjdHJhbENvZWZmaWNpZW50W2Jpbl0sIGZhY3RfbWFudGlzc2FbYmFuZF0pOworICAgICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50W2Jpbl0gPQorICAgICAgICAgICAgICBmTXVsdChwU3BlY3RyYWxDb2VmZmljaWVudFtiaW5dLCBmYWN0X21hbnRpc3NhW2JhbmRdKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvdHRvbSA9IHRvcDsKQEAgLTEwNjYsNyArMTA0NCw3IEBACiAKICAgICAvKiBhYm92ZSB0b3Btb3N0IERSQyBiYW5kIGdhaW4gZmFjdG9yIGlzIDEgKi8KICAgICBpZiAobWF4X2V4cG9uZW50ID4gMCkgewotICAgICAgZm9yIChiaW4gPSBib3R0b207IGJpbiA8IGFhY0ZyYW1lU2l6ZTsgYmluKz0xKSB7CisgICAgICBmb3IgKGJpbiA9IGJvdHRvbTsgYmluIDwgYWFjRnJhbWVTaXplOyBiaW4gKz0gMSkgewogICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudFtiaW5dID4+PSBtYXhfZXhwb25lbnQ7CiAgICAgICB9CiAgICAgfQpAQCAtMTA3NCwxMDUgKzEwNTIsMjk0IEBACiAgICAgLyogYWRqdXN0IHNjYWxpbmcgKi8KICAgICBwU3BlY1NjYWxlWzBdICs9IG1heF9leHBvbmVudDsKIAotICAgIGlmICh3aW5TZXEgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKSB7CisgICAgaWYgKHdpblNlcSA9PSBCTE9DS19TSE9SVCkgewogICAgICAgaW50IHdpbjsKICAgICAgIGZvciAod2luID0gMTsgd2luIDwgODsgd2luKyspIHsKICAgICAgICAgcFNwZWNTY2FsZVt3aW5dICs9IG1heF9leHBvbmVudDsKICAgICAgIH0KICAgICB9Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgSEFORExFX1NCUkRFQ09ERVIgaFNickRlY29kZXIgPSAoSEFORExFX1NCUkRFQ09ERVIpcFNickRlYzsKLSAgICBVSU5UIG51bUJhbmRzID0gcERyY0NoRGF0YS0+bnVtQmFuZHM7CisgICAgbnVtQmFuZHMgPSBwRHJjQ2hEYXRhLT5udW1CYW5kczsKIAogICAgIC8qIGZlZWQgZmFjdG9ycyBpbnRvIFNCUiBkZWNvZGVyIGZvciBhcHBsaWNhdGlvbiBpbiBRTUYgZG9tYWluLiAqLwotICAgIHNickRlY29kZXJfZHJjRmVlZENoYW5uZWwgKAotICAgICAgICAgICAgaFNickRlY29kZXIsCi0gICAgICAgICAgICBjaCwKLSAgICAgICAgICAgIG51bUJhbmRzLAotICAgICAgICAgICAgZmFjdF9tYW50aXNzYSwKLSAgICAgICAgICAgIG1heF9leHBvbmVudCwKLSAgICAgICAgICAgIHBEcmNDaERhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWUsCi0gICAgICAgICAgICB3aW5TZXEsCi0gICAgICAgICAgICBwRHJjQ2hEYXRhLT5iYW5kVG9wCi0gICAgICAgICAgKTsKKyAgICBzYnJEZWNvZGVyX2RyY0ZlZWRDaGFubmVsKGhTYnJEZWNvZGVyLCBjaCwgbnVtQmFuZHMsIGZhY3RfbWFudGlzc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZXhwb25lbnQsIHBEcmNDaERhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5TZXEsIHBEcmNDaERhdGEtPmJhbmRUb3ApOwogICB9CiAKICAgcmV0dXJuOwogfQogCi0KLS8qIAotICogUHJlcGFyZSBEUkMgcHJvY2Vzc2luZworLyoKKyAqIERSQyBwYXJhbWV0ZXIgYW5kIHByZXNlbnRhdGlvbiBtb2RlIGhhbmRsaW5nCiAgKi8KLWludCBhYWNEZWNvZGVyX2RyY1Byb2xvZyAoCi0gICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgVUNIQVIgIHBjZUluc3RhbmNlVGFnLAotICAgICAgICBVQ0hBUiAgY2hhbm5lbE1hcHBpbmdbXSwgLyogQ2hhbm5lbCBtYXBwaW5nIHRyYW5zbGF0aW5nIGRyY0NoYW5uZWwgaW5kZXggdG8gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggKi8KLSAgICAgICAgaW50ICAgIHZhbGlkQ2hhbm5lbHMgKQotewotICBpbnQgZXJyID0gMDsKK3N0YXRpYyB2b2lkIGFhY0RlY29kZXJfZHJjUGFyYW1ldGVySGFuZGxpbmcoSEFORExFX0FBQ19EUkMgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFhY051bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBwcmV2RHJjUHJvZ1JlZkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBwcmV2RHJjUHJlc01vZGUpIHsKKyAgaW50IGlzRG93bm1peCwgaXNNb25vRG93bm1peCwgaXNTdGVyZW9Eb3dubWl4OworICBpbnQgZERteCwgZEhyOworICBBQUNERUNfRFJDX1BBUkFNRVRFUl9IQU5ETElORyBkcmNQYXJhbWV0ZXJIYW5kbGluZzsKKyAgQ0RyY1BhcmFtcyAqcDsKIAotICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIC0xOworICBGREtfQVNTRVJUKHNlbGYgIT0gTlVMTCk7CisKKyAgcCA9ICZzZWxmLT5wYXJhbXM7CisKKyAgaWYgKHNlbGYtPnByb2dSZWZMZXZlbCAhPSBwcmV2RHJjUHJvZ1JlZkxldmVsKSBzZWxmLT51cGRhdGUgPSAxOworCisgIGlmIChzZWxmLT5wcmVzTW9kZSAhPSBwcmV2RHJjUHJlc01vZGUpIHNlbGYtPnVwZGF0ZSA9IDE7CisKKyAgaWYgKHNlbGYtPnByZXZBYWNOdW1DaGFubmVscyAhPSBhYWNOdW1DaGFubmVscykgc2VsZi0+dXBkYXRlID0gMTsKKworICAvKiByZXR1cm4gaWYgbm8gcmVsZXZhbnQgcGFyYW1ldGVyIGhhcyBjaGFuZ2VkICovCisgIGlmICghc2VsZi0+dXBkYXRlKSB7CisgICAgcmV0dXJuOwogICB9CiAKLSAgaWYgKCFzZWxmLT5wYXJhbXMuYnNEZWxheUVuYWJsZSkKLSAgewotICAgIGVyciA9IGFhY0RlY29kZXJfZHJjRXh0cmFjdEFuZE1hcCAoCi0gICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICAgICAgICAgIHBjZUluc3RhbmNlVGFnLAotICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcsCi0gICAgICAgICAgICB2YWxpZENoYW5uZWxzICk7CisgIC8qIGRlcml2ZSBkb3dubWl4IHByb3BlcnR5LiBhYWNOdW1DaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzIGluIGFhYyBzdHJlYW0sCisgICAqIG51bU91dENoYW5uZWxzOiBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCisgIGlzRG93bm1peCA9IChhYWNOdW1DaGFubmVscyA+IHNlbGYtPm51bU91dENoYW5uZWxzKTsKKyAgaXNEb3dubWl4ID0gKGlzRG93bm1peCAmJiAoc2VsZi0+bnVtT3V0Q2hhbm5lbHMgPiAwKSk7CisgIGlzTW9ub0Rvd25taXggPSAoaXNEb3dubWl4ICYmIChzZWxmLT5udW1PdXRDaGFubmVscyA9PSAxKSk7CisgIGlzU3RlcmVvRG93bm1peCA9IChpc0Rvd25taXggJiYgKHNlbGYtPm51bU91dENoYW5uZWxzID09IDIpKTsKKworICBpZiAoKHNlbGYtPnByZXNNb2RlID09IDEpIHx8IChzZWxmLT5wcmVzTW9kZSA9PSAyKSkgeworICAgIGRyY1BhcmFtZXRlckhhbmRsaW5nID0gKEFBQ0RFQ19EUkNfUEFSQU1FVEVSX0hBTkRMSU5HKXNlbGYtPnByZXNNb2RlOworICB9IGVsc2UgeyAvKiBubyBwcmVzZW50YXRpb24gbW9kZSAtPiB1c2UgcGFyYW1ldGVyIGhhbmRsaW5nIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICBBQUNfRFJDX0RFRkFVTFRfUFJFU0VOVEFUSU9OX01PREUgKi8KKyAgICBkcmNQYXJhbWV0ZXJIYW5kbGluZyA9IHAtPmRlZmF1bHRQcmVzZW50YXRpb25Nb2RlOwogICB9CiAKLSAgcmV0dXJuIGVycjsKKyAgLyogYnkgZGVmYXVsdCwgZG8gYXMgZGVzaXJlZCAqLworICBwLT5jdXQgPSBwLT51c3JDdXQ7CisgIHAtPmJvb3N0ID0gcC0+dXNyQm9vc3Q7CisgIHAtPmFwcGx5SGVhdnlDb21wcmVzc2lvbiA9IHAtPnVzckFwcGx5SGVhdnlDb21wcmVzc2lvbjsKKworICBzd2l0Y2ggKGRyY1BhcmFtZXRlckhhbmRsaW5nKSB7CisgICAgY2FzZSBESVNBQkxFRF9QQVJBTUVURVJfSEFORExJTkc6CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIHVzZSBkcmMgcGFyYW1ldGVycyBhcyByZXF1ZXN0ZWQgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkFCTEVEX1BBUkFNRVRFUl9IQU5ETElORzoKKyAgICAgIC8qIGREbXg6IGVzdGltYXRlZCBoZWFkcm9vbSByZWR1Y3Rpb24gZHVlIHRvIGRvd25taXgsIGZvcm1hdDogLTEvNCpkQgorICAgICAgICAgZERteCA9IGZsb29yKC00KjIwKmxvZzEwKGFhY051bUNoYW5uZWxzL251bU91dENoYW5uZWxzKSkgKi8KKyAgICAgIGlmIChpc0Rvd25taXgpIHsKKyAgICAgICAgRklYUF9EQkwgZG14VG1wOworICAgICAgICBpbnQgZV9sb2csIGVfbXVsdDsKKyAgICAgICAgZG14VG1wID0gZkRpdk5vcm0oc2VsZi0+bnVtT3V0Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFhY051bUNoYW5uZWxzKTsgLyogaW52ZXJzZSBkaXZpc2lvbiAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlIHNpZ24gYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dhcml0aG0gKi8KKyAgICAgICAgZG14VG1wID0gZkxvZzIoZG14VG1wLCAwLCAmZV9sb2cpOworICAgICAgICBkbXhUbXAgPSBmTXVsdE5vcm0oCisgICAgICAgICAgICBkbXhUbXAsIEZMMkZYQ09OU1RfREJMKDQuMGYgKiAyMC4wZiAqIDAuMzAxMDNmIC8gKGZsb2F0KSgxIDw8IDUpKSwKKyAgICAgICAgICAgICZlX211bHQpOyAvKiBlID0gZV9sb2cgKyBlX211bHQgKyA1ICovCisgICAgICAgIGREbXggPSAoaW50KXNjYWxlVmFsdWUoZG14VG1wLCBlX2xvZyArIGVfbXVsdCArIDUgLSAoREZSQUNUX0JJVFMgLSAxKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkRG14ID0gMDsKKyAgICAgIH0KKworICAgICAgLyogZEhyOiBGdWxsIGVzdGltYXRlZCAoZGVjb2RlcikgaGVhZHJvb20gcmVkdWN0aW9uIGR1ZSB0byBsb3VkbmVzcworICAgICAgICogbm9ybWFsaXNhdGlvbiAoRFRMIC0gUFJMKSBhbmQgZG93bm1peC4gRm9ybWF0OiAtMS80KmRCICovCisgICAgICBpZiAocC0+dGFyZ2V0UmVmTGV2ZWwgPj0gMCkgeyAvKiBpZiB0YXJnZXQgbGV2ZWwgaXMgcHJvdmlkZWQgKi8KKyAgICAgICAgZEhyID0gcC0+dGFyZ2V0UmVmTGV2ZWwgKyBkRG14IC0gc2VsZi0+cHJvZ1JlZkxldmVsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZEhyID0gZERteDsKKyAgICAgIH0KKworICAgICAgaWYgKGRIciA8IDApIHsgLyogaWYgaGVhZHJvb20gaXMgcmVkdWNlZCAqLworICAgICAgICAvKiBVc2UgY29tcHJlc3Npb24sIGJ1dCBhcyBsaXR0bGUgYXMgcG9zc2libGUuICovCisgICAgICAgIC8qIGVIcjogSGVhZHJvb20gcHJvdmlkZWQgYnkgZW5jb2RlciwgZm9ybWF0OiAtMS80IGRCICovCisgICAgICAgIGludCBlSHIgPSBmaXhNaW4ocC0+ZW5jb2RlclRhcmdldExldmVsIC0gc2VsZi0+cHJvZ1JlZkxldmVsLCAwKTsKKyAgICAgICAgaWYgKGVIciA8CisgICAgICAgICAgICBkSHIpIHsgLyogaWYgZW5jb2RlciBwcm92aWRlcyBtb3JlIGhlYWRyb29tIHRoYW4gZGVjb2RlciBuZWVkcyAqLworICAgICAgICAgIC8qIGRlcml2ZSBzY2FsaW5nIG9mIGxpZ2h0IERSQyAqLworICAgICAgICAgIEZJWFBfREJMIGNhbGNGYWN0b3Jfbm9ybTsKKyAgICAgICAgICBJTlQgY2FsY0ZhY3RvcjsgLyogZnJhY3Rpb24gb2YgRFJDIGdhaW5zIHRoYXQgaXMgbWluaW1hbGx5IG5lZWRlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBpbmcgcHJldmVudGlvbiAqLworICAgICAgICAgIGNhbGNGYWN0b3Jfbm9ybSA9CisgICAgICAgICAgICAgIGZEaXZOb3JtKC1kSHIsIC1lSHIpOyAvKiAwLjAgPCBjYWxjRmFjdG9yX25vcm0gPCAxLjAgKi8KKyAgICAgICAgICBjYWxjRmFjdG9yX25vcm0gPSBjYWxjRmFjdG9yX25vcm0gPj4gRFJDX1BBUkFNX1NDQUxFOworICAgICAgICAgIC8qIHF1YW50aXplIHRvIDEyOCBzdGVwcyAqLworICAgICAgICAgIGNhbGNGYWN0b3IgPSBjb252ZXJ0X2RyY1BhcmFtKAorICAgICAgICAgICAgICBjYWxjRmFjdG9yX25vcm0pOyAvKiBjb252ZXJ0IHRvIGludGVnZXIgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMjcgKi8KKyAgICAgICAgICBjYWxjRmFjdG9yX25vcm0gPSAoRklYUF9EQkwpKAorICAgICAgICAgICAgICAoSU5UKShEUkNfUEFSQU1fUVVBTlRfU1RFUCA+PiBEUkNfUEFSQU1fU0NBTEUpICogY2FsY0ZhY3Rvcik7CisgICAgICAgICAgcC0+Y3V0ID0gKGNhbGNGYWN0b3Jfbm9ybSA+IHAtPmN1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgPyBjYWxjRmFjdG9yX25vcm0KKyAgICAgICAgICAgICAgICAgICAgICAgOiBwLT5jdXQ7IC8qIHVzZSBjYWxjRmFjdG9yX25vcm0gYXMgbG93ZXIgbGltaXQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBlbmNvZGVyIHByb3ZpZGVzIGVxdWFsIG9yIGxlc3MgaGVhZHJvb20gdGhhbiBkZWNvZGVyIG5lZWRzICovCisgICAgICAgICAgLyogdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4gSXQgaXMKKyAgICAgICAgICAgKiBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdCAqLworICAgICAgICAgIHAtPmN1dCA9IERSQ19TQ0FMSU5HX01BWDsKKyAgICAgICAgICBpZiAoKGRIciAtIGVIcikgPD0KKyAgICAgICAgICAgICAgLTQgKiBEUkNfSEVBVllfVEhSRVNIT0xEX0RCKSB7IC8qIHVzZSBoZWF2eSBjb21wcmVzc2lvbiBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZHJvb20gZGVmaWNpdCBpcyBlcXVhbCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ19IRUFWWV9USFJFU0hPTERfREIgKi8KKyAgICAgICAgICAgIHAtPmFwcGx5SGVhdnlDb21wcmVzc2lvbiA9IE9OOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsgLyogZEhyID49IDAgKi8KKyAgICAgICAgLyogbm8gcmVzdHJpY3Rpb25zIHJlcXVpcmVkLCBhcyBoZWFkcm9vbSBpcyBub3QgcmVkdWNlZC4gKi8KKyAgICAgICAgLyogcC0+Y3V0ID0gcC0+dXNyQ3V0OyAqLworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIHByZXNlbnRhdGlvbiBtb2RlIDEgYW5kIDIgYWNjb3JkaW5nIHRvIEVUU0kgVFMgMTAxIDE1NDoKKyAgICAgICAgIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIChEVkIpOyBTcGVjaWZpY2F0aW9uIGZvciB0aGUgdXNlIG9mIFZpZGVvCisgICAgICAgICBhbmQgQXVkaW8gQ29kaW5nIGluIEJyb2FkY2FzdGluZyBBcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlIE1QRUctMgorICAgICAgICAgVHJhbnNwb3J0IFN0cmVhbSwgc2VjdGlvbiBDLjUuNC4sICJEZWNvZGluZyIsIGFuZCBUYWJsZSBDLjMzLiBBbHNvCisgICAgICAgICBhY2NvcmRpbmcgdG8gYW1lbmRtZW50IDQgdG8gSVNPL0lFQyAxNDQ5Ni0zLCBzZWN0aW9uIDQuNS4yLjE0LjIuNCwgYW5kCisgICAgICAgICBUYWJsZSBBTUQ0LjExLiBJU08gRFJDICAgICAgICAgICAgLT4gYXBwbHlIZWF2eUNvbXByZXNzaW9uID0gT0ZGIChVc2UKKyAgICAgICAgIGxpZ2h0IGNvbXByZXNzaW9uLCBNUEVHLXN0eWxlKSBDb21wcmVzc2lvbl92YWx1ZSAgLT4KKyAgICAgICAgIGFwcGx5SGVhdnlDb21wcmVzc2lvbiA9IE9OICAoVXNlIGhlYXZ5IGNvbXByZXNzaW9uLCBEVkItc3R5bGUpIHNjYWxpbmcKKyAgICAgICAgIHJlc3RyaWN0ZWQgLT4gcC0+Y3V0ID0gRFJDX1NDQUxJTkdfTUFYICovCisKKyAgICBjYXNlIERSQ19QUkVTRU5UQVRJT05fTU9ERV8xOiAvKiBwcmVzZW50YXRpb24gbW9kZSAxLCBMaWdodDotMzEvSGVhdnk6LTIzICovCisgICAgICBpZiAoKHAtPnRhcmdldFJlZkxldmVsID49IDApICYmCisgICAgICAgICAgKHAtPnRhcmdldFJlZkxldmVsIDwKKyAgICAgICAgICAgMTI0KSkgeyAvKiBpZiB0YXJnZXQgbGV2ZWwgaXMgcHJvdmlkZWQgYW5kID4gLTMxIGRCICovCisgICAgICAgIC8qIHBsYXliYWNrIHVwIHRvIC0yMyBkQiAqLworICAgICAgICBwLT5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPSBPTjsKKyAgICAgIH0gZWxzZSB7IC8qIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIgb3Igbm90IHByb3ZpZGVkICovCisgICAgICAgIC8qIHBsYXliYWNrIC0zMSBkQiAqLworICAgICAgICBpZiAoaXNNb25vRG93bm1peCB8fCBpc1N0ZXJlb0Rvd25taXgpIHsgLyogc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZyAqLworICAgICAgICAgIHAtPmN1dCA9IERSQ19TQ0FMSU5HX01BWDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERSQ19QUkVTRU5UQVRJT05fTU9ERV8yOiAvKiBwcmVzZW50YXRpb24gbW9kZSAyLCBMaWdodDotMjMvSGVhdnk6LTIzICovCisgICAgICBpZiAoKHAtPnRhcmdldFJlZkxldmVsID49IDApICYmCisgICAgICAgICAgKHAtPnRhcmdldFJlZkxldmVsIDwKKyAgICAgICAgICAgMTI0KSkgeyAvKiBpZiB0YXJnZXQgbGV2ZWwgaXMgcHJvdmlkZWQgYW5kID4gLTMxIGRCICovCisgICAgICAgIC8qIHBsYXliYWNrIHVwIHRvIC0yMyBkQiAqLworICAgICAgICBpZiAoaXNNb25vRG93bm1peCkgeyAvKiBpZiBtb25vIGRvd25taXggKi8KKyAgICAgICAgICBwLT5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPSBPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwLT5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPSBPRkY7CisgICAgICAgICAgcC0+Y3V0ID0gRFJDX1NDQUxJTkdfTUFYOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvKiB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCIG9yIG5vdCBwcm92aWRlZCAqLworICAgICAgICAvKiBwbGF5YmFjayAtMzEgZEIgKi8KKyAgICAgICAgcC0+YXBwbHlIZWF2eUNvbXByZXNzaW9uID0gT0ZGOworICAgICAgICBpZiAoaXNNb25vRG93bm1peCB8fCBpc1N0ZXJlb0Rvd25taXgpIHsgLyogc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZyAqLworICAgICAgICAgIHAtPmN1dCA9IERSQ19TQ0FMSU5HX01BWDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgIH0gLyogIHN3aXRjaCAoZHJjUGFyYW1ldGVySGFuZGxpbmcpICovCisKKyAgLyogV2l0aCBoZWF2eSBjb21wcmVzc2lvbiwgdGhlcmUgaXMgbm8gc2NhbGluZy4KKyAgICAgU2NhbGluZyBmYWN0b3JzIGFyZSBzZXQgZm9yIG5vdGlmaWNhdGlvbiBvbmx5LiAqLworICBpZiAocC0+YXBwbHlIZWF2eUNvbXByZXNzaW9uID09IE9OKSB7CisgICAgcC0+Ym9vc3QgPSBEUkNfU0NBTElOR19NQVg7CisgICAgcC0+Y3V0ID0gRFJDX1NDQUxJTkdfTUFYOworICB9CisKKyAgLyogc3dpdGNoIG9uL29mZiBwcm9jZXNzaW5nICovCisgIHNlbGYtPmVuYWJsZSA9ICgocC0+Ym9vc3QgPiAoRklYUF9EQkwpMCkgfHwgKHAtPmN1dCA+IChGSVhQX0RCTCkwKSB8fAorICAgICAgICAgICAgICAgICAgKHAtPmFwcGx5SGVhdnlDb21wcmVzc2lvbiA9PSBPTikgfHwgKHAtPnRhcmdldFJlZkxldmVsID49IDApKTsKKyAgc2VsZi0+ZW5hYmxlID0gKHNlbGYtPmVuYWJsZSAmJiAhc2VsZi0+dW5pRHJjUHJlY2VkZW5jZSk7CisKKyAgc2VsZi0+cHJldkFhY051bUNoYW5uZWxzID0gYWFjTnVtQ2hhbm5lbHM7CisgIHNlbGYtPnVwZGF0ZSA9IDA7CiB9CiAKLQotLyogCi0gKiBGaW5hbGl6ZSBEUkMgcHJvY2Vzc2luZworLyoKKyAqIFByZXBhcmUgRFJDIHByb2Nlc3NpbmcKKyAqICAgVmFsaWQgcmV0dXJuIHZhbHVlcyBhcmU6CisgKiAgICAgLTEgOiBBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQuCisgKiAgICAgIDAgOiBObyBlcnJvciBhbmQgbm8gdmFsaWQgRFJDIGRhdGEgYXZhaWxhYmxlLgorICogICAgICAxIDogTm8gZXJyb3IgYW5kIHZhbGlkIERSQyBkYXRhIGhhcyBiZWVuIG1hcHBlZC4KICAqLwotaW50IGFhY0RlY29kZXJfZHJjRXBpbG9nICgKLSAgICAgICAgSEFORExFX0FBQ19EUkMgIHNlbGYsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tdLAotICAgICAgICBVQ0hBUiAgcGNlSW5zdGFuY2VUYWcsCi0gICAgICAgIFVDSEFSICBjaGFubmVsTWFwcGluZ1tdLCAvKiBDaGFubmVsIG1hcHBpbmcgdHJhbnNsYXRpbmcgZHJjQ2hhbm5lbCBpbmRleCB0byBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCAqLwotICAgICAgICBpbnQgICAgdmFsaWRDaGFubmVscyApCi17Ci0gIGludCBlcnIgPSAwOworaW50IGFhY0RlY29kZXJfZHJjUHJvbG9nKAorICAgIEhBTkRMRV9BQUNfRFJDIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgVUNIQVIgcGNlSW5zdGFuY2VUYWcsCisgICAgVUNIQVIgY2hhbm5lbE1hcHBpbmdbXSwgLyogQ2hhbm5lbCBtYXBwaW5nIHRyYW5zbGF0aW5nIGRyY0NoYW5uZWwgaW5kZXggdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCAqLworICAgIGludCB2YWxpZENoYW5uZWxzKSB7CisgIGludCByZXN1bHQgPSAwOwogCiAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KIAotICBpZiAoc2VsZi0+cGFyYW1zLmJzRGVsYXlFbmFibGUpCi0gIHsKLSAgICBlcnIgPSBhYWNEZWNvZGVyX2RyY0V4dHJhY3RBbmRNYXAgKAotICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICBwY2VJbnN0YW5jZVRhZywKLSAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLAotICAgICAgICAgICAgdmFsaWRDaGFubmVscyApOworICBpZiAoIXNlbGYtPnBhcmFtcy5ic0RlbGF5RW5hYmxlKSB7CisgICAgLyoga2VlcCBwcmV2aW91cyBwcm9nUmVmTGV2ZWwgYW5kIHByZXNNb2RlIGZvciB1cGRhdGUgZmxhZyBpbgorICAgICAqIGRyY1BhcmFtZXRlckhhbmRsaW5nICovCisgICAgSU5UIHByZXZQUkwsIHByZXZQTSA9IDA7CisgICAgcHJldlBSTCA9IHNlbGYtPnByb2dSZWZMZXZlbDsKKyAgICBwcmV2UE0gPSBzZWxmLT5wcmVzTW9kZTsKKworICAgIHJlc3VsdCA9IGFhY0RlY29kZXJfZHJjRXh0cmFjdEFuZE1hcCgKKyAgICAgICAgc2VsZiwgaEJzLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCBwY2VJbnN0YW5jZVRhZywgY2hhbm5lbE1hcHBpbmcsCisgICAgICAgIHZhbGlkQ2hhbm5lbHMpOworCisgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyogRHJjIHBhcmFtZXRlciBoYW5kbGluZyAqLworICAgIGFhY0RlY29kZXJfZHJjUGFyYW1ldGVySGFuZGxpbmcoc2VsZiwgdmFsaWRDaGFubmVscywgcHJldlBSTCwgcHJldlBNKTsKICAgfQogCi0gIHJldHVybiBlcnI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBGaW5hbGl6ZSBEUkMgcHJvY2Vzc2luZworICogICBWYWxpZCByZXR1cm4gdmFsdWVzIGFyZToKKyAqICAgICAtMSA6IEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZC4KKyAqICAgICAgMCA6IE5vIGVycm9yIGFuZCBubyB2YWxpZCBEUkMgZGF0YSBhdmFpbGFibGUuCisgKiAgICAgIDEgOiBObyBlcnJvciBhbmQgdmFsaWQgRFJDIGRhdGEgaGFzIGJlZW4gbWFwcGVkLgorICovCitpbnQgYWFjRGVjb2Rlcl9kcmNFcGlsb2coCisgICAgSEFORExFX0FBQ19EUkMgc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKKyAgICBVQ0hBUiBwY2VJbnN0YW5jZVRhZywKKyAgICBVQ0hBUiBjaGFubmVsTWFwcGluZ1tdLCAvKiBDaGFubmVsIG1hcHBpbmcgdHJhbnNsYXRpbmcgZHJjQ2hhbm5lbCBpbmRleCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4ICovCisgICAgaW50IHZhbGlkQ2hhbm5lbHMpIHsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChzZWxmLT5wYXJhbXMuYnNEZWxheUVuYWJsZSkgeworICAgIC8qIGtlZXAgcHJldmlvdXMgcHJvZ1JlZkxldmVsIGFuZCBwcmVzTW9kZSBmb3IgdXBkYXRlIGZsYWcgaW4KKyAgICAgKiBkcmNQYXJhbWV0ZXJIYW5kbGluZyAqLworICAgIElOVCBwcmV2UFJMLCBwcmV2UE0gPSAwOworICAgIHByZXZQUkwgPSBzZWxmLT5wcm9nUmVmTGV2ZWw7CisgICAgcHJldlBNID0gc2VsZi0+cHJlc01vZGU7CisKKyAgICByZXN1bHQgPSBhYWNEZWNvZGVyX2RyY0V4dHJhY3RBbmRNYXAoCisgICAgICAgIHNlbGYsIGhCcywgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgcGNlSW5zdGFuY2VUYWcsIGNoYW5uZWxNYXBwaW5nLAorICAgICAgICB2YWxpZENoYW5uZWxzKTsKKworICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIERyYyBwYXJhbWV0ZXIgaGFuZGxpbmcgKi8KKyAgICBhYWNEZWNvZGVyX2RyY1BhcmFtZXRlckhhbmRsaW5nKHNlbGYsIHZhbGlkQ2hhbm5lbHMsIHByZXZQUkwsIHByZXZQTSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OwogfQogCiAvKgogICogRXhwb3J0IHJlbGV2YW50IG1ldGFkYXRhIGluZm8gZnJvbSBiaXRzdHJlYW0gcGF5bG9hZC4KICAqLwotdm9pZCBhYWNEZWNvZGVyX2RyY0dldEluZm8gKAotICAgICAgICBIQU5ETEVfQUFDX0RSQyAgc2VsZiwKLSAgICAgICAgU0NIQVIgICAgICAgICAgKnBQcmVzTW9kZSwKLSAgICAgICAgU0NIQVIgICAgICAgICAgKnBQcm9nUmVmTGV2ZWwgKQotewordm9pZCBhYWNEZWNvZGVyX2RyY0dldEluZm8oSEFORExFX0FBQ19EUkMgc2VsZiwgU0NIQVIgKnBQcmVzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpwUHJvZ1JlZkxldmVsKSB7CiAgIGlmIChzZWxmICE9IE5VTEwpIHsKICAgICBpZiAocFByZXNNb2RlICE9IE5VTEwpIHsKICAgICAgICpwUHJlc01vZGUgPSBzZWxmLT5wcmVzTW9kZTsKZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2RyYy5oIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjLmgKaW5kZXggYzg1MGFhNS4uOTI0ZWM2ZiAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjLmgKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTExICs5MCwxMDMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAorCiAgICBEZXNjcmlwdGlvbjogRHluYW1pYyByYW5nZSBjb250cm9sIChEUkMpIGRlY29kZXIgdG9vbCBmb3IgQUFDCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgQUFDREVDX0RSQ19ICiAjZGVmaW5lIEFBQ0RFQ19EUkNfSAogCi0jaW5jbHVkZSAidHBfZGF0YS5oIiAgICAgICAgICAgIC8qIGZvciBwcm9ncmFtIGNvbmZpZyBlbGVtZW50IHN1cHBvcnQgKi8KLQorI2luY2x1ZGUgInRwX2RhdGEuaCIgLyogZm9yIHByb2dyYW0gY29uZmlnIGVsZW1lbnQgc3VwcG9ydCAqLwogCiAjaW5jbHVkZSAiYWFjZGVjX2RyY190eXBlcy5oIgogI2luY2x1ZGUgImNoYW5uZWwuaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKLSNkZWZpbmUgQUFDREVDX0RSQ19ERkxUX0VYUElSWV9GUkFNRVMgKCAgNTAgKSAgIC8qIERlZmF1bHQgRFJDIGRhdGEgZXhwaXJ5IHRpbWUgaW4gQUFDIGZyYW1lcyAgICovCisjZGVmaW5lIEFBQ0RFQ19EUkNfREZMVF9FWFBJUllfRlJBTUVTIFwKKyAgKDApIC8qIERlZmF1bHQgRFJDIGRhdGEgZXhwaXJ5IHRpbWUgaW4gQUFDIGZyYW1lcyAgICovCisKKy8qICNkZWZpbmUgQUFDREVDX0RSQ19JR05PUkVfRlJBTUVTX1dJVEhfTVVMVElQTEVfQ0hfVEhSRUFEUyAqLyAvKiBUaGUgbmFtZSBzYXlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgYWxsLiAqLworLyogI2RlZmluZSBBQUNERUNfRFJDX0RFQlVHICovCiAKIC8qKgogICogXGJyaWVmIERSQyBtb2R1bGUgc2V0dGluZyBwYXJhbWV0ZXJzCiAgKi8KLXR5cGVkZWYgZW51bQotewordHlwZWRlZiBlbnVtIHsKICAgRFJDX0NVVF9TQ0FMRSA9IDAsCiAgIERSQ19CT09TVF9TQ0FMRSwKICAgVEFSR0VUX1JFRl9MRVZFTCwKICAgRFJDX0JTX0RFTEFZLAogICBEUkNfREFUQV9FWFBJUllfRlJBTUUsCiAgIEFQUExZX05PUk1BTElaQVRJT04sCi0gIEFQUExZX0hFQVZZX0NPTVBSRVNTSU9OCi0KKyAgQVBQTFlfSEVBVllfQ09NUFJFU1NJT04sCisgIERFRkFVTFRfUFJFU0VOVEFUSU9OX01PREUsCisgIEVOQ09ERVJfVEFSR0VUX0xFVkVMLAorICBNQVhfT1VUUFVUX0NIQU5ORUxTLAorICBVTklEUkNfUFJFQ0VERU5DRQogfSBBQUNERUNfRFJDX1BBUkFNOwogCi0KIC8qKgogICogXGJyaWVmIERSQyBtb2R1bGUgaW50ZXJmYWNlIGZ1bmN0aW9ucwogICovCi12b2lkIGFhY0RlY29kZXJfZHJjSW5pdCAoCi0gICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmICk7Cit2b2lkIGFhY0RlY29kZXJfZHJjSW5pdChIQU5ETEVfQUFDX0RSQyBzZWxmKTsKIAotdm9pZCBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSAoCi0gICAgICAgIENEcmNDaGFubmVsRGF0YSAqcERyY0NoYW5uZWwgKTsKK3ZvaWQgYWFjRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbERhdGEoQ0RyY0NoYW5uZWxEYXRhICpwRHJjQ2hhbm5lbCk7CiAKLUFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAotICAgICAgICBIQU5ETEVfQUFDX0RSQyAgICBzZWxmLAotICAgICAgICBBQUNERUNfRFJDX1BBUkFNICBwYXJhbSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgdmFsdWUgKTsKK0FBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0oSEFORExFX0FBQ19EUkMgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX0RSQ19QQVJBTSBwYXJhbSwgSU5UIHZhbHVlKTsKIAotaW50IGFhY0RlY29kZXJfZHJjTWFya1BheWxvYWQgKAotICAgICAgICBIQU5ETEVfQUFDX0RSQyAgc2VsZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKLSAgICAgICAgQUFDREVDX0RSQ19QQVlMT0FEX1RZUEUgIHR5cGUgKTsKK2ludCBhYWNEZWNvZGVyX2RyY01hcmtQYXlsb2FkKEhBTkRMRV9BQUNfRFJDIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFIHR5cGUpOwogCi1pbnQgYWFjRGVjb2Rlcl9kcmNQcm9sb2cgKAotICAgICAgICBIQU5ETEVfQUFDX0RSQyAgc2VsZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCi0gICAgICAgIFVDSEFSICBwY2VJbnN0YW5jZVRhZywKLSAgICAgICAgVUNIQVIgIGNoYW5uZWxNYXBwaW5nW10sCi0gICAgICAgIGludCAgICBudW1DaGFubmVscyApOworaW50IGFhY0RlY29kZXJfZHJjUHJvbG9nKAorICAgIEhBTkRMRV9BQUNfRFJDIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgVUNIQVIgcGNlSW5zdGFuY2VUYWcsIFVDSEFSIGNoYW5uZWxNYXBwaW5nW10sIGludCB2YWxpZENoYW5uZWxzKTsKIAogLyoqCi0gKiBcYnJpZWYgQXBwbHkgRFJDLiBJZiBTQlIgaXMgcHJlc2VudCwgRFJDIGRhdGEgaXMgaGFuZGVkIG92ZXIgdG8gdGhlIFNCUiBkZWNvZGVyLgorICogXGJyaWVmIEFwcGx5IERSQy4gSWYgU0JSIGlzIHByZXNlbnQsIERSQyBkYXRhIGlzIGhhbmRlZCBvdmVyIHRvIHRoZSBTQlIKKyAqIGRlY29kZXIuCiAgKiBccGFyYW0gc2VsZiBBQUMgZGVjb2RlciBpbnN0YW5jZQogICogXHBhcmFtIHBTYnJEZWMgcG9pbnRlciB0byBTQlIgZGVjb2RlciBpbnN0YW5jZQogICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gQUFDIGRlY29kZXIgY2hhbm5lbCBpbnN0YW5jZSB0byBiZSBwcm9jZXNzZWQKICAqIFxwYXJhbSBwRHJjRGF0IERSQyBjaGFubmVsIGRhdGEKLSAqIFxwYXJhbSBleHRHYWluIFBvaW50ZXIgdG8gYSBGSVhQX0RCTCB3aGVyZSBhIGV4dGVybmFsbHkgYXBwbHlhYmxlIGdhaW4gd2lsbCBiZSBzdG9yZWQgaW50byAoaW5kZXBlbmRlbnRseSBvbiB3aGV0aGVyIGl0IHdpbGwgYmUgYXBwbHkgaW50ZXJuYWxseSBvciBub3QpLgotICogICAgICAgICAgICAgICAgQXQgZnVuY3Rpb24gY2FsbCB0aGUgYnVmZmVyIG11c3QgaG9sZCB0aGUgc2NhbGUgKDAgPj0gc2NhbGUgPCBERlJBQ1RfQklUUykgdG8gYmUgYXBwbGllZCBvbiB0aGUgZ2FpbiB2YWx1ZS4KKyAqIFxwYXJhbSBleHRHYWluIFBvaW50ZXIgdG8gYSBGSVhQX0RCTCB3aGVyZSBhIGV4dGVybmFsbHkgYXBwbHlhYmxlIGdhaW4gd2lsbAorICogYmUgc3RvcmVkIGludG8gKGluZGVwZW5kZW50bHkgb24gd2hldGhlciBpdCB3aWxsIGJlIGFwcGx5IGludGVybmFsbHkgb3Igbm90KS4KKyAqICAgICAgICAgICAgICAgIEF0IGZ1bmN0aW9uIGNhbGwgdGhlIGJ1ZmZlciBtdXN0IGhvbGQgdGhlIHNjYWxlICgwID49IHNjYWxlIDwKKyAqIERGUkFDVF9CSVRTKSB0byBiZSBhcHBsaWVkIG9uIHRoZSBnYWluIHZhbHVlLgogICogXHBhcmFtIGNoIGNoYW5uZWwgaW5kZXgKICAqIFxwYXJhbSBhYWNGcmFtZVNpemUgQUFDIGZyYW1lIHNpemUKLSAqIFxwYXJhbSBiU2JyUHJlc2VudCBmbGFnIGluZGljYXRpbmcgdGhhdCBTQlIgaXMgcHJlc2VudCwgaW4gd2hpY2ggY2FzZSBEUkMgaXMgaGFuZGVkIG92ZXIgdG8gdGhlIFNCUiBpbnN0YW5jZSBwU2JyRGVjCisgKiBccGFyYW0gYlNiclByZXNlbnQgZmxhZyBpbmRpY2F0aW5nIHRoYXQgU0JSIGlzIHByZXNlbnQsIGluIHdoaWNoIGNhc2UgRFJDIGlzCisgKiBoYW5kZWQgb3ZlciB0byB0aGUgU0JSIGluc3RhbmNlIHBTYnJEZWMKICAqLwotdm9pZCBhYWNEZWNvZGVyX2RyY0FwcGx5ICgKLSAgICAgICAgSEFORExFX0FBQ19EUkMgICAgICAgICAgc2VsZiwKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqcFNickRlYywKLSAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgQ0RyY0NoYW5uZWxEYXRhICAgICAgICAqcERyY0RhdCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAqZXh0R2FpbiwKLSAgICAgICAgaW50ICBjaCwKLSAgICAgICAgaW50ICBhYWNGcmFtZVNpemUsCi0gICAgICAgIGludCAgYlNiclByZXNlbnQgKTsKK3ZvaWQgYWFjRGVjb2Rlcl9kcmNBcHBseShIQU5ETEVfQUFDX0RSQyBzZWxmLCB2b2lkICpwU2JyRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0RyY0NoYW5uZWxEYXRhICpwRHJjRGF0LCBGSVhQX0RCTCAqZXh0R2FpbiwgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhYWNGcmFtZVNpemUsIGludCBiU2JyUHJlc2VudCk7CiAKLWludCBhYWNEZWNvZGVyX2RyY0VwaWxvZyAoCi0gICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgVUNIQVIgIHBjZUluc3RhbmNlVGFnLAotICAgICAgICBVQ0hBUiAgY2hhbm5lbE1hcHBpbmdbXSwKLSAgICAgICAgaW50ICAgIHZhbGlkQ2hhbm5lbHMgKTsKK2ludCBhYWNEZWNvZGVyX2RyY0VwaWxvZygKKyAgICBIQU5ETEVfQUFDX0RSQyBzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tdLAorICAgIFVDSEFSIHBjZUluc3RhbmNlVGFnLCBVQ0hBUiBjaGFubmVsTWFwcGluZ1tdLCBpbnQgdmFsaWRDaGFubmVscyk7CiAKIC8qKgogICogXGJyaWVmIEdldCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBmb3VuZCBpbiBiaXRzdHJlYW0uCiAgKiBccGFyYW0gc2VsZiBEUkMgbW9kdWxlIGluc3RhbmNlIGhhbmRsZS4KLSAqIFxwYXJhbSBwUHJlc01vZGUgUG9pbnRlciB0byBmaWVsZCB3aGVyZSB0aGUgcHJlc2VudGF0aW9uIG1vZGUgd2lsbCBiZSB3cml0dGVuIHRvLgotICogXHBhcmFtIHBQcm9nUmVmTGV2ZWwgUG9pbnRlciB0byBmaWVsZCB3aGVyZSB0aGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgd2lsbCBiZSB3cml0dGVuIHRvLgorICogXHBhcmFtIHBQcmVzTW9kZSBQb2ludGVyIHRvIGZpZWxkIHdoZXJlIHRoZSBwcmVzZW50YXRpb24gbW9kZSB3aWxsIGJlIHdyaXR0ZW4KKyAqIHRvLgorICogXHBhcmFtIHBQcm9nUmVmTGV2ZWwgUG9pbnRlciB0byBmaWVsZCB3aGVyZSB0aGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgd2lsbAorICogYmUgd3JpdHRlbiB0by4KICAqIFxyZXR1cm4gTm90aGluZy4KICAqLwotdm9pZCBhYWNEZWNvZGVyX2RyY0dldEluZm8gKAotICAgICAgICBIQU5ETEVfQUFDX0RSQyAgc2VsZiwKLSAgICAgICAgU0NIQVIgICpwUHJlc01vZGUsCi0gICAgICAgIFNDSEFSICAqcFByb2dSZWZMZXZlbCApOwordm9pZCBhYWNEZWNvZGVyX2RyY0dldEluZm8oSEFORExFX0FBQ19EUkMgc2VsZiwgU0NIQVIgKnBQcmVzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpwUHJvZ1JlZkxldmVsKTsKIAotCi0jZW5kaWYgIC8qIEFBQ0RFQ19EUkNfSCAqLworI2VuZGlmIC8qIEFBQ0RFQ19EUkNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjX3R5cGVzLmggYi9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmNfdHlwZXMuaAppbmRleCA0YzZkMTYzLi43NmMzNWQwIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmNfdHlwZXMuaAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmNfdHlwZXMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw5NiArOTAsMTMxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKKwogICAgRGVzY3JpcHRpb246IER5bmFtaWMgcmFuZ2UgY29udHJvbCAoRFJDKSBnbG9iYWwgZGF0YSB0eXBlcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIEFBQ0RFQ19EUkNfVFlQRVNfSAogI2RlZmluZSBBQUNERUNfRFJDX1RZUEVTX0gKIAotCi0KICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKLSAjZGVmaW5lIE1BWF9EUkNfVEhSRUFEUyAgICAgICggICAzICkgICAgICAgIC8qIEhlYXZ5IGNvbXByZXNzaW9uIHZhbHVlIGlzIGhhbmRsZWQganVzdCBsaWtlIE1QRUcgRFJDIGRhdGEgKi8KLSNkZWZpbmUgTUFYX0RSQ19CQU5EUyAgICAgICAgICggIDE2ICkgICAgICAgIC8qIDJeTEVOX0RSQ19CQU5EX0lOQ1IgKExFTl9EUkNfQkFORF9JTkNSID0gNCkgKi8KKyNkZWZpbmUgTUFYX0RSQ19USFJFQURTIFwKKyAgKCg4KSArIDEpIC8qIEhlYXZ5IGNvbXByZXNzaW9uIHZhbHVlIGlzIGhhbmRsZWQganVzdCBsaWtlIE1QRUcgRFJDIGRhdGEgKi8KKyNkZWZpbmUgTUFYX0RSQ19CQU5EUyAoMTYpIC8qIDJeTEVOX0RSQ19CQU5EX0lOQ1IgKExFTl9EUkNfQkFORF9JTkNSID0gNCkgKi8KIAogLyoqCiAgKiBcYnJpZWYgRFJDIG1vZHVsZSBnbG9iYWwgZGF0YSB0eXBlcwogICovCi10eXBlZGVmIGVudW0KLXsKLSAgVU5LTk9XTl9QQVlMT0FEICAgPSAgMCwKLSAgTVBFR19EUkNfRVhUX0RBVEEgPSAgMSwKLSAgRFZCX0RSQ19BTkNfREFUQSAgPSAgMgordHlwZWRlZiBlbnVtIHsKKyAgVU5LTk9XTl9QQVlMT0FEID0gMCwKKyAgTVBFR19EUkNfRVhUX0RBVEEgPSAxLAorICBEVkJfRFJDX0FOQ19EQVRBID0gMgogCiB9IEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFOwogCi10eXBlZGVmIHN0cnVjdAotewotICBVSU5UICAgIGV4cGlyeUNvdW50OwotICBVSU5UICAgIG51bUJhbmRzOwotICBVU0hPUlQgIGJhbmRUb3BbTUFYX0RSQ19CQU5EU107Ci0gIFNIT1JUICAgZHJjSW50ZXJwb2xhdGlvblNjaGVtZTsKLSAgVUNIQVIgICBkcmNWYWx1ZVtNQVhfRFJDX0JBTkRTXTsKLSAgU0NIQVIgICBkcmNEYXRhVHlwZTsKKy8qKgorICogXGJyaWVmIE9wdGlvbnMgZm9yIHBhcmFtZXRlciBoYW5kbGluZyAvIHByZXNlbnRhdGlvbiBtb2RlCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIERJU0FCTEVEX1BBUkFNRVRFUl9IQU5ETElORyA9IC0xLCAvKiE8IERSQyBwYXJhbWV0ZXIgaGFuZGxpbmcgZGlzYWJsZWQsIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgYXBwbGllZCBhcyByZXF1ZXN0ZWQuICovCisgIEVOQUJMRURfUEFSQU1FVEVSX0hBTkRMSU5HID0KKyAgICAgIDAsIC8qITwgQXBwbHkgY2hhbmdlcyB0byByZXF1ZXN0ZWQgRFJDIHBhcmFtZXRlcnMgdG8gcHJldmVudCBjbGlwcGluZyAqLworICBEUkNfUFJFU0VOVEFUSU9OX01PREVfMSA9IDEsIC8qITwgRFJDIFByZXNlbnRhdGlvbiBtb2RlIDEqLworICBEUkNfUFJFU0VOVEFUSU9OX01PREVfMiA9IDIgIC8qITwgRFJDIFByZXNlbnRhdGlvbiBtb2RlIDIqLworCit9IEFBQ0RFQ19EUkNfUEFSQU1FVEVSX0hBTkRMSU5HOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgZXhwaXJ5Q291bnQ7CisgIFVJTlQgbnVtQmFuZHM7CisgIFVTSE9SVCBiYW5kVG9wW01BWF9EUkNfQkFORFNdOworICBTSE9SVCBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lOworICBVQ0hBUiBkcmNWYWx1ZVtNQVhfRFJDX0JBTkRTXTsKKyAgU0NIQVIgZHJjRGF0YVR5cGU7CiAKIH0gQ0RyY0NoYW5uZWxEYXRhOwogCi10eXBlZGVmIHN0cnVjdAotewotICBVSU5UICAgZXhjbHVkZWRDaG5zTWFzazsKLSAgU0NIQVIgIHByb2dSZWZMZXZlbDsKLSAgU0NIQVIgIHByZXNNb2RlOyAgICAgLyogUHJlc2VudGF0aW9uIG1vZGU6IDAgKG5vdCBpbmRpY2F0ZWQpLCAxLCAyLCBhbmQgMyAocmVzZXJ2ZWQpLiAqLwotICBTQ0hBUiAgcGNlSW5zdGFuY2VUYWc7Cit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgZXhjbHVkZWRDaG5zTWFzazsKKyAgU0NIQVIgcHJvZ1JlZkxldmVsOworICBTQ0hBUiBwcmVzTW9kZTsgLyogUHJlc2VudGF0aW9uIG1vZGU6IDAgKG5vdCBpbmRpY2F0ZWQpLCAxLCAyLCBhbmQgMworICAgICAgICAgICAgICAgICAgICAgKHJlc2VydmVkKS4gKi8KKyAgU0NIQVIgcGNlSW5zdGFuY2VUYWc7CiAKICAgQ0RyY0NoYW5uZWxEYXRhIGNoYW5uZWxEYXRhOwogCiB9IENEcmNQYXlsb2FkOwogCi10eXBlZGVmIHN0cnVjdAotewotICBGSVhQX0RCTCAgY3V0OyAgICAgICAvKiBUaGUgYXR0ZW51YXRpb24gc2NhbGUgZmFjdG9yIGN1cnJlbnRseSB1c2VkLiAgICAgKi8KLSAgRklYUF9EQkwgIHVzckN1dDsgICAgLyogVGhlIGxhdGVzdCBhdHRlbnVhdGlvbiBzY2FsZSBmYWN0b3Igc2V0IGJ5IHVzZXIuICovCi0gIEZJWFBfREJMICBib29zdDsgICAgIC8qIFRoZSBib29zdCBzY2FsZSBmYWN0b3IgY3VycmVudGx5IHVzZWQuICAgICAgICAgICAqLwotICBGSVhQX0RCTCAgdXNyQm9vc3Q7ICAvKiBUaGUgbGF0ZXN0IGJvb3N0IHNjYWxlIGZhY3RvciBzZXQgYnkgdXNlci4gICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogRFJDIHBhcmFtZXRlcnM6IExhdGVzdCB1c2VyIHJlcXVlc3RzICovCisgIEZJWFBfREJMIHVzckN1dDsKKyAgRklYUF9EQkwgdXNyQm9vc3Q7CisgIFVDSEFSIHVzckFwcGx5SGVhdnlDb21wcmVzc2lvbjsKIAotICBVSU5UICAgZXhwaXJ5RnJhbWU7Ci0gIFNDSEFSICB0YXJnZXRSZWZMZXZlbDsKLSAgVUNIQVIgIGJzRGVsYXlFbmFibGU7Ci0gIFVDSEFSICBhcHBseURpZ2l0YWxOb3JtOwotICBVQ0hBUiAgYXBwbHlIZWF2eUNvbXByZXNzaW9uOworICAvKiBEUkMgcGFyYW1ldGVyczogQ3VycmVudGx5IHVzZWQsIHBvc3NpYmx5IGNoYW5nZWQgYnkKKyAgICogYWFjRGVjb2Rlcl9kcmNQYXJhbWV0ZXJIYW5kbGluZyAqLworICBGSVhQX0RCTCBjdXQ7ICAgICAgICAgLyogYXR0ZW51YXRpb24gc2NhbGUgZmFjdG9yICovCisgIEZJWFBfREJMIGJvb3N0OyAgICAgICAvKiBib29zdCBzY2FsZSBmYWN0b3IgICovCisgIFNDSEFSIHRhcmdldFJlZkxldmVsOyAvKiB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGZvciBsb3VkbmVzcyBub3JtYWxpemF0aW9uICovCisgIFVDSEFSIGFwcGx5SGVhdnlDb21wcmVzc2lvbjsgLyogaGVhdnkgY29tcHJlc3Npb24gKERWQikgZmxhZyAqLworCisgIFVJTlQgZXhwaXJ5RnJhbWU7CisgIFVDSEFSIGJzRGVsYXlFbmFibGU7CisgIFVDSEFSIGFwcGx5RGlnaXRhbE5vcm07CisKKyAgQUFDREVDX0RSQ19QQVJBTUVURVJfSEFORExJTkcgZGVmYXVsdFByZXNlbnRhdGlvbk1vZGU7CisgIFVDSEFSIGVuY29kZXJUYXJnZXRMZXZlbDsKIAogfSBDRHJjUGFyYW1zOwogCit0eXBlZGVmIHN0cnVjdCB7CisgIENEcmNQYXJhbXMKKyAgICAgIHBhcmFtczsgLyogTW9kdWxlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IGJ5IHVzZXIgKHZpYSBTZXRQYXJhbSBBUEkKKyAgICAgICAgICAgICAgICAgZnVuY3Rpb24pICovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIENEcmNQYXJhbXMgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb2R1bGUgcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgYnkgdXNlciAodmlhIFNldFBhcmFtIEFQSSBmdW5jdGlvbikgKi8KKyAgVUNIQVIgZW5hYmxlOyAgICAgIC8qIFN3aXRjaCB0aGF0IGNvbnRyb2xzIGR5bmFtaWMgcmFuZ2UgcHJvY2Vzc2luZyAqLworICBVQ0hBUiBkaWdpdGFsTm9ybTsgLyogU3dpdGNoIHRvIGVuLS9kaXNhYmxlIHJlZmVyZW5jZSBsZXZlbCBub3JtYWxpemF0aW9uIGluCisgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdGFsIGRvbWFpbiAqLwogCi0gIFVDSEFSICBlbmFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTd2l0Y2ggdGhhdCBjb250cm9scyBkeW5hbWljIHJhbmdlIHByb2Nlc3NpbmcgKi8KLSAgVUNIQVIgIGRpZ2l0YWxOb3JtOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN3aXRjaCB0byBlbi0vZGlzYWJsZSByZWZlcmVuY2UgbGV2ZWwgbm9ybWFsaXphdGlvbiBpbiBkaWdpdGFsIGRvbWFpbiAqLworICBVQ0hBUiB1cGRhdGU7IC8qIEZsYWcgaW5kaWNhdGluZyB0aGUgY2hhbmdlIG9mIGEgdXNlciBvciBiaXRzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgd2hpY2ggYWZmZWN0cyBhYWNEZWNvZGVyX2RyY1BhcmFtZXRlckhhbmRsaW5nICovCisgIElOVCBudW1PdXRDaGFubmVsczsgICAgIC8qIE51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KKyAgSU5UIHByZXZBYWNOdW1DaGFubmVsczsgLyogUHJldmlvdXMgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIGFhYyBiaXRzdHJlYW0sIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHVwZGF0ZSBmbGFnICovCiAKLSAgVVNIT1JUIG51bVBheWxvYWRzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgRFJDIGRhdGEgcGF5bG9hZCBlbGVtZW50cyBmb3VuZCB3aXRoaW4gZnJhbWUgKi8KLSAgVVNIT1JUIG51bVRocmVhZHM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgRFJDIGRhdGEgdGhyZWFkcyBleHRyYWN0ZWQgZnJvbSB0aGUgZm91bmQgcGF5bG9hZCBlbGVtZW50cyAqLwotICBTQ0hBUiAgcHJvZ1JlZkxldmVsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgZm9yIGFsbCBjaGFubmVscyAqLwotICBVQ0hBUiAgcHJvZ1JlZkxldmVsUHJlc2VudDsgICAgICAgICAgICAgICAgLyogUHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgZm91bmQgaW4gYml0c3RyZWFtICovCisgIFVTSE9SVCBudW1QYXlsb2FkczsgLyogVGhlIG51bWJlciBvZiBEUkMgZGF0YSBwYXlsb2FkIGVsZW1lbnRzIGZvdW5kIHdpdGhpbgorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lICovCisgIFVTSE9SVAorICBudW1UaHJlYWRzOyAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgRFJDIGRhdGEgdGhyZWFkcyBleHRyYWN0ZWQgZnJvbSB0aGUgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkIGVsZW1lbnRzICovCisgIFNDSEFSIHByb2dSZWZMZXZlbDsgLyogUHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgZm9yIGFsbCBjaGFubmVscyAqLworICBVQ0hBUiBwcm9nUmVmTGV2ZWxQcmVzZW50OyAvKiBQcm9ncmFtIHJlZmVyZW5jZSBsZXZlbCBmb3VuZCBpbiBiaXRzdHJlYW0gKi8KIAotICBVSU5UICAgcHJsRXhwaXJ5Q291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyogQ291bnRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIGxpZmUgdGltZSBvZiB0aGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwuICovCisgIFVJTlQgcHJsRXhwaXJ5Q291bnQ7IC8qIENvdW50ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBtb25pdG9yIHRoZSBsaWZlIHRpbWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gcmVmZXJlbmNlIGxldmVsLiAqLwogCi0gIFNDSEFSICBwcmVzTW9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJlc2VudGF0aW9uIG1vZGUgYXMgZGVmaW5lZCBpbiBFVFNJIFRTIDEwMSAxNTQgKi8KLSAgVUNIQVIgIGR2YkFuY0RhdGFBdmFpbGFibGU7ICAgICAgICAgICAgICAgICAgLyogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIERWQiBhbmNpbGxhcnkgZGF0YSBpcyBwcmVzZW50IG9yIG5vdCAqLwotICBVSU5UICAgZHZiQW5jRGF0YVBvc2l0aW9uOyAgICAgICAgICAgICAgICAgICAvKiBVc2VkIHRvIHN0b3JlIHRoZSBEVkIgYW5jaWxsYXJ5IGRhdGEgcGF5bG9hZCBwb3NpdGlvbiBpbiB0aGUgYml0c3RyZWFtIChvbmx5IG9uZSBwZXIgZnJhbWUpICovCi0gIFVJTlQgICBkcmNQYXlsb2FkUG9zaXRpb25bTUFYX0RSQ19USFJFQURTXTsgIC8qIFVzZWQgdG8gc3RvcmUgdGhlIERSQyBwYXlsb2FkIHBvc2l0aW9ucyBpbiB0aGUgYml0c3RyZWFtICovCisgIFNDSEFSIHByZXNNb2RlOyAvKiBQcmVzZW50YXRpb24gbW9kZSBhcyBkZWZpbmVkIGluIEVUU0kgVFMgMTAxIDE1NCAqLworICBVQ0hBUiBkdmJBbmNEYXRhQXZhaWxhYmxlOyAvKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgRFZCIGFuY2lsbGFyeSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHByZXNlbnQgb3Igbm90ICovCisgIFVJTlQgZHZiQW5jRGF0YVBvc2l0aW9uOyAgIC8qIFVzZWQgdG8gc3RvcmUgdGhlIERWQiBhbmNpbGxhcnkgZGF0YSBwYXlsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBiaXRzdHJlYW0gKG9ubHkgb25lIHBlciBmcmFtZSkgKi8KKyAgVUlOVCBkcmNQYXlsb2FkUG9zaXRpb25bTUFYX0RSQ19USFJFQURTXTsgLyogVXNlZCB0byBzdG9yZSB0aGUgRFJDIHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zIGluIHRoZSBiaXRzdHJlYW0gKi8KKworICBVQ0hBUgorICB1bmlEcmNQcmVjZWRlbmNlOyAvKiBGbGFnIGZvciBzaWduYWxsaW5nIHRoYXQgdW5pRHJjIGlzIGFjdGl2ZSBhbmQgdGFrZXMKKyAgICAgICAgICAgICAgICAgICAgICAgcHJlY2VkZW5jZSBvdmVyIGxlZ2FjeSBEUkMgKi8KIAogfSBDRHJjSW5mbzsKIAogdHlwZWRlZiBDRHJjSW5mbyAqSEFORExFX0FBQ19EUkM7CiAKICNlbmRpZiAvKiBBQUNERUNfRFJDX1RZUEVTX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyLmNwcCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjci5jcHAKaW5kZXggZTMxNGUyNy4uNjExNDc1NiAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3IuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDExICs5MCwxMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBSb2JlcnQgV2VpZG5lciAoRFNQIFNvbHV0aW9ucykKKwogICAgRGVzY3JpcHRpb246IEhDUiBEZWNvZGVyOiBIQ1IgaW5pdGlhbGl6YXRpb24sIHByZXByb2Nlc3MgSENSIHNpZGVpbmZvLAogICAgICAgICAgICAgICAgIGRlY29kZSBwcmlvcml0eSBjb2Rld29yZHMgKFBDV3MpCiAKQEAgLTkxLDggKzEwMyw2IEBACiAKICNpbmNsdWRlICJhYWNkZWNfaGNyLmgiCiAKLQotCiAjaW5jbHVkZSAiYWFjZGVjX2hjcl90eXBlcy5oIgogI2luY2x1ZGUgImFhY2RlY19oY3JfYml0LmgiCiAjaW5jbHVkZSAiYWFjZGVjX2hjcnMuaCIKQEAgLTEwMSwyNjMgKzExMSwyNDggQEAKICNpbmNsdWRlICJjaGFubmVsLmgiCiAjaW5jbHVkZSAiYmxvY2suaCIKIAotI2luY2x1ZGUgImFhY2RlY29kZXIuaCIgICAgIC8qIGZvciBJRF9DUEUsIElEX1NDRSAuLi4gKi8KKyNpbmNsdWRlICJhYWNkZWNvZGVyLmgiIC8qIGZvciBJRF9DUEUsIElEX1NDRSAuLi4gKi8KICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKIGV4dGVybiBpbnQgbWxGaWxlQ2hDdXJyOwogCi1zdGF0aWMgdm9pZCBlcnJEZXRlY3RvckluSGNyU2lkZWluZm9TaHJ0KFNDSEFSIGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBudW1MaW5lLAorc3RhdGljIHZvaWQgZXJyRGV0ZWN0b3JJbkhjclNpZGVpbmZvU2hydChTQ0hBUiBjYiwgU0hPUlQgbnVtTGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqZXJyb3JXb3JkKTsKIAotc3RhdGljIHZvaWQgZXJyRGV0ZWN0b3JJbkhjckxlbmd0aHMoU0NIQVIgIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgKmVycm9yV29yZCk7CitzdGF0aWMgdm9pZCBlcnJEZXRlY3RvckluSGNyTGVuZ3RocyhTQ0hBUiBsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqZXJyb3JXb3JkKTsKIAotc3RhdGljIHZvaWQgSGNyQ2FsY051bUNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAoSF9IQ1JfSU5GTyBwSGNyKTsKK3N0YXRpYyB2b2lkIEhjckNhbGNOdW1Db2Rld29yZChIX0hDUl9JTkZPIHBIY3IpOwogc3RhdGljIHZvaWQgSGNyU29ydENvZGVib29rQW5kTnVtQ29kZXdvcmRJblNlY3Rpb24oSF9IQ1JfSU5GTyBwSGNyKTsKLXN0YXRpYyB2b2lkIEhjclByZXBhcmVTZWdtZW50YXRpb25HcmlkICAgICAgICAgICAgKEhfSENSX0lORk8gcEhjcik7Ci1zdGF0aWMgdm9pZCBIY3JFeHRlbmRlZFNlY3Rpb25JbmZvICAgICAgICAgICAgICAgIChIX0hDUl9JTkZPIHBIY3IpOworc3RhdGljIHZvaWQgSGNyUHJlcGFyZVNlZ21lbnRhdGlvbkdyaWQoSF9IQ1JfSU5GTyBwSGNyKTsKK3N0YXRpYyB2b2lkIEhjckV4dGVuZGVkU2VjdGlvbkluZm8oSF9IQ1JfSU5GTyBwSGNyKTsKIAotc3RhdGljIHZvaWQgRGVyaXZlTnVtYmVyT2ZFeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzKFVJTlQgICBudW1TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAqcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCk7CitzdGF0aWMgdm9pZCBEZXJpdmVOdW1iZXJPZkV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMoCisgICAgVUlOVCBudW1TZWdtZW50LCBVU0hPUlQgKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uLAorICAgIGludCBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4LAorICAgIFVTSE9SVCAqcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMsCisgICAgaW50IG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHgpOwogCi1zdGF0aWMgSU5UICBEZWNvZGVFc2NhcGVTZXF1ZW5jZShIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjQ29lZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnBOdW1EZWNvZGVkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworc3RhdGljIElOVCBEZWNvZGVFc2NhcGVTZXF1ZW5jZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgY29uc3QgSU5UIGJzQW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcXVhbnRTcGVjQ29lZiwgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcE51bURlY29kZWRCaXRzKTsKIAotc3RhdGljIGludCBEZWNvZGVQQ1dfU2lnbihIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICBjb2RlYm9va0RpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgICAgICAgICAgKnBRdWFudFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgKnBRdWFudFNwZWNDb2VmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcXVhbnRTcGVjQ29lZklkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnBOdW1EZWNvZGVkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICk7CitzdGF0aWMgaW50IERlY29kZVBDV19TaWduKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBjb25zdCBJTlQgYnNBbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgY29kZWJvb2tEaW0sIGNvbnN0IFNDSEFSICpwUXVhbnRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwUXVhbnRTcGVjQ29lZiwgaW50ICpxdWFudFNwZWNDb2VmSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudCwgaW50ICpwTnVtRGVjb2RlZEJpdHMpOwogCi1zdGF0aWMgY29uc3QgU0NIQVIgKkRlY29kZVBDV19Cb2R5KEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgKnBDdXJyZW50VHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgICAgICAgICAgKnBRdWFudFZhbEJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICpwTnVtRGVjb2RlZEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworc3RhdGljIGNvbnN0IFNDSEFSICpEZWNvZGVQQ1dfQm9keShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgY29uc3QgSU5UIGJzQW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICpwQ3VycmVudFRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSICpwUXVhbnRWYWxCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwTnVtRGVjb2RlZEJpdHMpOwogCiBzdGF0aWMgdm9pZCBEZWNvZGVQQ1dzKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBIX0hDUl9JTkZPIHBIY3IpOwogCiBzdGF0aWMgdm9pZCBIY3JSZW9yZGVyUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMoCi0gICAgICAgIEhfSENSX0lORk8gcEhjciwKLSAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8KLSAgICAgICAgKTsKKyAgICBIX0hDUl9JTkZPIHBIY3IsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8pOwogCitzdGF0aWMgVUNIQVIgZXJyRGV0ZWN0UGN3U2VnbWVudGF0aW9uKFNDSEFSIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhfSENSX0lORk8gcEhjciwgUENXX1RZUEUga2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnFzY19iYXNlX29mX2N3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBkaW1lbnNpb24pOwogCi0jaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0lNTUVESUFURUxZCi1zdGF0aWMgVUNIQVIgZXJyRGV0ZWN0UGN3U2VnbWVudGF0aW9uKFNDSEFSICAgICAgIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhfSENSX0lORk8gIHBIY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDV19UWVBFICAgIGtpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKnFzY19iYXNlX29mX2N3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICBkaW1lbnNpb24pOwotI2VuZGlmCi0KLSNpZiBDSEVDS19TRUdNRU5UQVRJT05fRklOQUwKIHN0YXRpYyB2b2lkIGVyckRldGVjdFdpdGhpblNlZ21lbnRhdGlvbkZpbmFsKEhfSENSX0lORk8gcEhjcik7Ci0jZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgQ2hlY2sgaWYgY29kZWJvb2sgYW5kIG51bVNlY3QgYXJlIHdpdGhpbiBhbGxvd2VkIHJhbmdlIChzaG9ydCBvbmx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGVyckRldGVjdG9ySW5IY3JTaWRlaW5mb1NocnQoU0NIQVIgY2IsIFNIT1JUIG51bUxpbmUsVUlOVCogZXJyb3JXb3JkKQotewotCi0KLQotICBpZiAoIGNiIDwgWkVST19IQ0IgfHwgY2IgPj0gTUFYX0NCX0NIRUNLIHx8IGNiID09IEJPT0tTQ0wgKSB7CisgICAgIGRlc2NyaXB0aW9uOiAgIENoZWNrIGlmIGNvZGVib29rIGFuZCBudW1TZWN0IGFyZSB3aXRoaW4gYWxsb3dlZCByYW5nZQorKHNob3J0IG9ubHkpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyB2b2lkIGVyckRldGVjdG9ySW5IY3JTaWRlaW5mb1NocnQoU0NIQVIgY2IsIFNIT1JUIG51bUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKmVycm9yV29yZCkgeworICBpZiAoY2IgPCBaRVJPX0hDQiB8fCBjYiA+PSBNQVhfQ0JfQ0hFQ0sgfHwgY2IgPT0gQk9PS1NDTCkgewogICAgICplcnJvcldvcmQgfD0gQ0JfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLOwogICB9Ci0gIGlmICggbnVtTGluZSA8IDAgfHwgbnVtTGluZSA+IDEwMjQgKSB7CisgIGlmIChudW1MaW5lIDwgMCB8fCBudW1MaW5lID4gMTAyNCkgewogICAgICplcnJvcldvcmQgfD0gTElORV9JTl9TRUNUX09VVF9PRl9SQU5HRV9TSE9SVF9CTE9DSzsKICAgfQogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBkZXNjcmlwdGlvbjogICBDaGVjayBib3RoIEhDUiBsZW5ndGhzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgZXJyRGV0ZWN0b3JJbkhjckxlbmd0aHMoU0NIQVIgIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgKmVycm9yV29yZCkKLXsKLSAgaWYgKCBsZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA8IGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkICkgeworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgdm9pZCBlcnJEZXRlY3RvckluSGNyTGVuZ3RocyhTQ0hBUiBsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqZXJyb3JXb3JkKSB7CisgIGlmIChsZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA8IGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkKSB7CiAgICAgKmVycm9yV29yZCB8PSBIQ1JfU0lfTEVOR1RIU19GQUlMVVJFOwogICB9CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgIERlY29kZSAoYW5kIGFkYXB0IGlmIG5lY2Vzc2FyeSkgdGhlIHR3byBIQ1Igc2lkZWluZm8gY29tcG9uZW50czoKLSAgICAgICAgICAgICAgICAgICAgJ3Jlb3JkZXJlZF9zcGVjdHJhbF9kYXRhX2xlbmd0aCcgYW5kICdsb25nZXN0X2NvZGV3b3JkX2xlbmd0aCcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgIGRlc2NyaXB0aW9uOiAgIERlY29kZSAoYW5kIGFkYXB0IGlmIG5lY2Vzc2FyeSkgdGhlIHR3byBIQ1Igc2lkZWluZm8KK2NvbXBvbmVudHM6ICdyZW9yZGVyZWRfc3BlY3RyYWxfZGF0YV9sZW5ndGgnIGFuZCAnbG9uZ2VzdF9jb2Rld29yZF9sZW5ndGgnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotdm9pZCBDSGNyX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMsCi0gICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKQotewotICBJTlQgICAgZ2xvYmFsSGNyVHlwZSA9IGdldEhjclR5cGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lckhjckluZm8pOwotICBTSE9SVCAgbGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOwotICBTQ0hBUiAgbGVuZ09mTG9uZ2VzdENvZGV3b3JkOwordm9pZCBDSGNyX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgZ2xvYmFsSGNyVHlwZSkgeworICBTSE9SVCBsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7CisgIFNDSEFSIGxlbmdPZkxvbmdlc3RDb2Rld29yZDsKIAotICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPSAwOwotICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZMb25nZXN0Q29kZXdvcmQgICAgICAgPSAwOworICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPQorICAgICAgMDsKKyAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkID0gMDsKIAotCi0KLSAgICAvKiAtLS0tLS0tIFNJLVZhbHVlIE5vIDEgLS0tLS0tLSAqLwotICAgIGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9IEZES3JlYWRCaXRzKGJzLDE0KSArIEVSUk9SX0xPUlNEOwotICAgIGlmICggZ2xvYmFsSGNyVHlwZSA9PSBJRF9DUEUgKSB7Ci0gICAgICBpZiAoKGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA+PSAwKSAmJiAobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhIDw9IENQRV9UT1BfTEVOR1RIKSkgewotICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPSBsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7IC8qIHRoZSBkZWNvZGVkIHZhbHVlIGlzIHdpdGhpbiByYW5nZSAqLwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGlmIChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPiBDUEVfVE9QX0xFTkdUSCkgewotICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9IENQRV9UT1BfTEVOR1RIOyAgICAgICAgICAgIC8qIHVzZSB2YWxpZCBtYXhpbXVtICovCi0gICAgICAgIH0KKyAgLyogLS0tLS0tLSBTSS1WYWx1ZSBObyAxIC0tLS0tLS0gKi8KKyAgbGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0gRkRLcmVhZEJpdHMoYnMsIDE0KSArIEVSUk9SX0xPUlNEOworICBpZiAoZ2xvYmFsSGNyVHlwZSA9PSBJRF9DUEUpIHsKKyAgICBpZiAoKGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA+PSAwKSAmJgorICAgICAgICAobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhIDw9IENQRV9UT1BfTEVOR1RIKSkgeworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjCisgICAgICAgICAgLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0KKyAgICAgICAgICBsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7IC8qIHRoZSBkZWNvZGVkIHZhbHVlIGlzIHdpdGhpbiByYW5nZSAqLworICAgIH0gZWxzZSB7CisgICAgICBpZiAobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID4gQ1BFX1RPUF9MRU5HVEgpIHsKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjCisgICAgICAgICAgICAubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPQorICAgICAgICAgICAgQ1BFX1RPUF9MRU5HVEg7IC8qIHVzZSB2YWxpZCBtYXhpbXVtICovCiAgICAgICB9CiAgICAgfQotICAgIGVsc2UgaWYgKGdsb2JhbEhjclR5cGUgPT0gSURfU0NFIHx8IGdsb2JhbEhjclR5cGUgPT0gSURfTEZFIHx8IGdsb2JhbEhjclR5cGUgPT0gSURfQ0NFICkgewotICAgICAgaWYgKChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPj0gMCkgJiYgKGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA8PSBTQ0VfVE9QX0xFTkdUSCkpIHsKLSAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0gbGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOyAvKiB0aGUgZGVjb2RlZCB2YWx1ZSBpcyB3aXRoaW4gcmFuZ2UgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID4gU0NFX1RPUF9MRU5HVEgpIHsKLSAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPSBTQ0VfVE9QX0xFTkdUSDsgICAgICAgICAgICAvKiB1c2UgdmFsaWQgbWF4aW11bSAqLwotICAgICAgICB9CisgIH0gZWxzZSBpZiAoZ2xvYmFsSGNyVHlwZSA9PSBJRF9TQ0UgfHwgZ2xvYmFsSGNyVHlwZSA9PSBJRF9MRkUgfHwKKyAgICAgICAgICAgICBnbG9iYWxIY3JUeXBlID09IElEX0NDRSkgeworICAgIGlmICgobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID49IDApICYmCisgICAgICAgIChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPD0gU0NFX1RPUF9MRU5HVEgpKSB7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMKKyAgICAgICAgICAubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPQorICAgICAgICAgIGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsgLyogdGhlIGRlY29kZWQgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPiBTQ0VfVE9QX0xFTkdUSCkgeworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMKKyAgICAgICAgICAgIC5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9CisgICAgICAgICAgICBTQ0VfVE9QX0xFTkdUSDsgLyogdXNlIHZhbGlkIG1heGltdW0gKi8KICAgICAgIH0KICAgICB9CisgIH0KIAotICAgIC8qIC0tLS0tLS0gU0ktVmFsdWUgTm8gMiAtLS0tLS0tICovCi0gICAgbGVuZ09mTG9uZ2VzdENvZGV3b3JkID0gRkRLcmVhZEJpdHMoYnMsNikgKyBFUlJPUl9MT0xDOwotICAgIGlmICgobGVuZ09mTG9uZ2VzdENvZGV3b3JkID49IDApICYmIChsZW5nT2ZMb25nZXN0Q29kZXdvcmQgPD0gTEVOX09GX0xPTkdFU1RfQ1dfVE9QX0xFTkdUSCkpIHsKLSAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZkxvbmdlc3RDb2Rld29yZCA9IGxlbmdPZkxvbmdlc3RDb2Rld29yZDsgICAgICAgICAgICAgICAgLyogdGhlIGRlY29kZWQgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCisgIC8qIC0tLS0tLS0gU0ktVmFsdWUgTm8gMiAtLS0tLS0tICovCisgIGxlbmdPZkxvbmdlc3RDb2Rld29yZCA9IEZES3JlYWRCaXRzKGJzLCA2KSArIEVSUk9SX0xPTEM7CisgIGlmICgobGVuZ09mTG9uZ2VzdENvZGV3b3JkID49IDApICYmCisgICAgICAobGVuZ09mTG9uZ2VzdENvZGV3b3JkIDw9IExFTl9PRl9MT05HRVNUX0NXX1RPUF9MRU5HVEgpKSB7CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkID0KKyAgICAgICAgbGVuZ09mTG9uZ2VzdENvZGV3b3JkOyAvKiB0aGUgZGVjb2RlZCB2YWx1ZSBpcyB3aXRoaW4gcmFuZ2UgKi8KKyAgfSBlbHNlIHsKKyAgICBpZiAobGVuZ09mTG9uZ2VzdENvZGV3b3JkID4gTEVOX09GX0xPTkdFU1RfQ1dfVE9QX0xFTkdUSCkgeworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkID0KKyAgICAgICAgICBMRU5fT0ZfTE9OR0VTVF9DV19UT1BfTEVOR1RIOyAvKiB1c2UgdmFsaWQgbWF4aW11bSAqLwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmIChsZW5nT2ZMb25nZXN0Q29kZXdvcmQgPiBMRU5fT0ZfTE9OR0VTVF9DV19UT1BfTEVOR1RIKSB7Ci0gICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZkxvbmdlc3RDb2Rld29yZCA9IExFTl9PRl9MT05HRVNUX0NXX1RPUF9MRU5HVEg7ICAgICAgIC8qIHVzZSB2YWxpZCBtYXhpbXVtICovCi0gICAgICB9Ci0gICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgIFNldHMgdXAgSENSIFJPTS1UYWJsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXZvaWQgSGNySW5pdFJvbShIX0hDUl9JTkZPIHBIY3IpCi17Ci0gIHBIY3ItPmNiUGFpcnMucE1pbk9mQ2JQYWlyICAgICA9IGFNaW5PZkNiUGFpcjsKLSAgcEhjci0+Y2JQYWlycy5wTWF4T2ZDYlBhaXIgICAgID0gYU1heE9mQ2JQYWlyOwotCi0gIHBIY3ItPnRhYmxlSW5mby5wTWF4Q3dMZW5ndGggICA9IGFNYXhDd0xlbjsKLSAgcEhjci0+dGFibGVJbmZvLnBDYkRpbWVuc2lvbiAgID0gYURpbUNiOwotICBwSGNyLT50YWJsZUluZm8ucENiRGltU2hpZnQgICAgPSBhRGltQ2JTaGlmdDsKLSAgcEhjci0+dGFibGVJbmZvLnBDYlNpZ24gICAgICAgID0gYVNpZ25DYjsKLSAgcEhjci0+dGFibGVJbmZvLnBDYlByaW9yaXR5ICAgID0gYUNiUHJpb3JpdHk7Ci0gIHBIY3ItPnRhYmxlSW5mby5wTGFyZ2VzdEFic1ZhbCA9IGFMYXJnZXN0QWJzb2x1dGVWYWx1ZTsKKyAgfQogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBTZXQgdXAgSENSIC0gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGV2ZXJ5IGNhbGwgdG8gSGNyRGVjb2RlcigpLgotICAgICAgICAgICAgICAgICAgICBGb3Igc2hvcnQgYmxvY2sgYSBzb3J0aW5nIGFsZ29yaXRobSBpcyBhcHBsaWVkIHRvIGdldCB0aGUgU0kgaW4gdGhlIG9yZGVyCi0gICAgICAgICAgICAgICAgICAgIHRoYXQgSENSIGNvdWxkIGFzc2VtYmxlIHRoZSBxc2MncyBhcyBpZiBpdCBpcyBhIGxvbmcgYmxvY2suCisgICAgIGRlc2NyaXB0aW9uOiAgIFNldCB1cCBIQ1IgLSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZXZlcnkgY2FsbCB0bworSGNyRGVjb2RlcigpLiBGb3Igc2hvcnQgYmxvY2sgYSBzb3J0aW5nIGFsZ29yaXRobSBpcyBhcHBsaWVkIHRvIGdldCB0aGUgU0kgaW4KK3RoZSBvcmRlciB0aGF0IEhDUiBjb3VsZCBhc3NlbWJsZSB0aGUgcXNjJ3MgYXMgaWYgaXQgaXMgYSBsb25nIGJsb2NrLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgICAgZXJyb3IgbG9nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLVVJTlQgSGNySW5pdChIX0hDUl9JTkZPICAgICAgICAgICAgICBwSGNyLAotICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCitVSU5UIEhjckluaXQoSF9IQ1JfSU5GTyBwSGNyLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAogICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGJzKQoteworICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CiAgIENJY3NJbmZvICpwSWNzSW5mbyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvOwogICBTSE9SVCAqcE51bUxpbmVzSW5TZWM7CiAgIFVDSEFSICpwQ29kZUJrOwotICBTSE9SVCAgbnVtU2VjdGlvbjsKLSAgU0NIQVIgIGNiOwotICBpbnQgIG51bUxpbmU7Ci0gIGludCAgaTsKKyAgU0hPUlQgbnVtU2VjdGlvbjsKKyAgU0NIQVIgY2I7CisgIGludCBudW1MaW5lOworICBpbnQgaTsKIAotICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOwotICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZkxvbmdlc3RDb2Rld29yZCAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkOwotICBwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQ7Ci0gIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ICAgPSAwOwotICBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2sgICAgICAgICAgICAgICAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmFDb2RlQm9va3M0SGNyOwotICBwSGNyLT5kZWNJbk91dC5wTnVtTGluZUluU2VjdCAgICAgICAgICAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmFOdW1MaW5lSW5TZWM0SGNyOwotICBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLm51bWJlclNlY3Rpb247CisgIHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYworICAgICAgICAgIC5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsKKyAgcEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQgPQorICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkOworICBwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50OworICBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCA9IDA7CisgIHBIY3ItPmRlY0luT3V0LnBDb2RlYm9vayA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMuYUNvZGVCb29rczRIY3I7CisgIHBIY3ItPmRlY0luT3V0LnBOdW1MaW5lSW5TZWN0ID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5hTnVtTGluZUluU2VjNEhjcjsKKyAgcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbiA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubnVtYmVyU2VjdGlvbjsKICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgPSAwOwotICBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZSAgICAgICAgICAgICAgICAgID0gU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KTsKKyAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2UgPQorICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KTsKIAogICBGREtzeW5jQ2FjaGUoYnMpOwotICBwSGNyLT5kZWNJbk91dC5iaXRzdHJlYW1JbmRleCAgICAgICAgICAgICAgICAgICAgID0gRkRLZ2V0Qml0Q250KGJzKTsKKyAgcEhjci0+ZGVjSW5PdXQuYml0c3RyZWFtQW5jaG9yID0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpOwogCi0gIGlmICghSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSAgIC8qIHNob3J0IGJsb2NrICovCisgIGlmICghSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSAvKiBzaG9ydCBibG9jayAqLwogICB7Ci0gICAgU0hPUlQgIGJhbmQ7Ci0gICAgU0hPUlQgIG1heEJhbmQ7Ci0gICAgU0NIQVIgIGdyb3VwOwotICAgIFNDSEFSICB3aW5Hcm91cExlbjsKLSAgICBTQ0hBUiAgd2luZG93OwotICAgIFNDSEFSICBudW1Vbml0SW5CYW5kOwotICAgIFNDSEFSICBjbnRVbml0SW5CYW5kOwotICAgIFNDSEFSICBncm91cFdpbjsKLSAgICBTQ0hBUiAgY2JfcHJldjsKKyAgICBTSE9SVCBiYW5kOworICAgIFNIT1JUIG1heEJhbmQ7CisgICAgU0NIQVIgZ3JvdXA7CisgICAgU0NIQVIgd2luR3JvdXBMZW47CisgICAgU0NIQVIgd2luZG93OworICAgIFNDSEFSIG51bVVuaXRJbkJhbmQ7CisgICAgU0NIQVIgY250VW5pdEluQmFuZDsKKyAgICBTQ0hBUiBncm91cFdpbjsKKyAgICBTQ0hBUiBjYl9wcmV2OwogCiAgICAgVUNIQVIgKnBDb2RlQm9vazsKICAgICBjb25zdCBTSE9SVCAqQmFuZE9mZnNldHM7Ci0gICAgU0NIQVIgIG51bU9mR3JvdXBzOworICAgIFNDSEFSIG51bU9mR3JvdXBzOwogCi0KLSAgICBwQ29kZUJvb2sgICAgICA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2s7ICAgICAgICAgICAgIC8qIGluICovCi0gICAgcE51bUxpbmVzSW5TZWMgPSBwSGNyLT5kZWNJbk91dC5wTnVtTGluZUluU2VjdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCi0gICAgcENvZGVCayAgICAgICAgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCi0gICAgQmFuZE9mZnNldHMgICAgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKHBJY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7IC8qIGF1eCAqLwotICAgIG51bU9mR3JvdXBzICAgID0gR2V0V2luZG93R3JvdXBzKHBJY3NJbmZvKTsKKyAgICBwQ29kZUJvb2sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rOyAvKiBpbiAqLworICAgIHBOdW1MaW5lc0luU2VjID0gcEhjci0+ZGVjSW5PdXQucE51bUxpbmVJblNlY3Q7ICAgICAgICAgIC8qIG91dCAqLworICAgIHBDb2RlQmsgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7ICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLworICAgIEJhbmRPZmZzZXRzID0KKyAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cyhwSWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOyAvKiBhdXggKi8KKyAgICBudW1PZkdyb3VwcyA9IEdldFdpbmRvd0dyb3VwcyhwSWNzSW5mbyk7CiAKICAgICBudW1MaW5lID0gMDsKICAgICBudW1TZWN0aW9uID0gMDsKLSAgICBjYiAgICAgID0gcENvZGVCb29rWzBdOworICAgIGNiID0gcENvZGVCb29rWzBdOwogICAgIGNiX3ByZXYgPSBwQ29kZUJvb2tbMF07CiAKLSAgICAvKiBjb252ZXJ0IEhDUi1zaWRlaW5mbyBpbnRvIGEgdW5pdHdpc2UgbWFubmVyOiBXaGVuIHRoZSBjYiBjaGFuZ2VzLCBhIG5ldyBzZWN0aW9uIHN0YXJ0cyAqLworICAgIC8qIGNvbnZlcnQgSENSLXNpZGVpbmZvIGludG8gYSB1bml0d2lzZSBtYW5uZXI6IFdoZW4gdGhlIGNiIGNoYW5nZXMsIGEgbmV3CisgICAgICogc2VjdGlvbiBzdGFydHMgKi8KIAogICAgICpwQ29kZUJrKysgPSBjYl9wcmV2OwogCiAgICAgbWF4QmFuZCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7Ci0gICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG1heEJhbmQ7IGJhbmQrKykgeyAgLyogZnJvbSBsb3cgdG8gaGlnaCBzZmJzIGkuZS4gZnJvbSBsb3cgdG8gaGlnaCBmcmVxdWVuY2llcyAgKi8KLSAgICAgIG51bVVuaXRJbkJhbmQgPSAoKEJhbmRPZmZzZXRzW2JhbmQrMV0gLSBCYW5kT2Zmc2V0c1tiYW5kXSkgPj4gRk9VUl9MT0dfRElWX1RXT19MT0cpOyAvKiBnZXQgdGhlIG51bWJlciBvZiB1bml0cyBpbiBjdXJyZW50IHNmYiAqLwotICAgICAgZm9yIChjbnRVbml0SW5CYW5kID0gbnVtVW5pdEluQmFuZDsgIGNudFVuaXRJbkJhbmQgIT0gMDsgY250VW5pdEluQmFuZC0tICkgeyAvKiBmb3IgZXZlcnkgdW5pdCBpbiB0aGUgYmFuZCAqLworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBtYXhCYW5kOworICAgICAgICAgYmFuZCsrKSB7IC8qIGZyb20gbG93IHRvIGhpZ2ggc2ZicyBpLmUuIGZyb20gbG93IHRvIGhpZ2ggZnJlcXVlbmNpZXMgKi8KKyAgICAgIG51bVVuaXRJbkJhbmQgPQorICAgICAgICAgICgoQmFuZE9mZnNldHNbYmFuZCArIDFdIC0gQmFuZE9mZnNldHNbYmFuZF0pID4+CisgICAgICAgICAgIEZPVVJfTE9HX0RJVl9UV09fTE9HKTsgLyogZ2V0IHRoZSBudW1iZXIgb2YgdW5pdHMgaW4gY3VycmVudCBzZmIgKi8KKyAgICAgIGZvciAoY250VW5pdEluQmFuZCA9IG51bVVuaXRJbkJhbmQ7IGNudFVuaXRJbkJhbmQgIT0gMDsKKyAgICAgICAgICAgY250VW5pdEluQmFuZC0tKSB7IC8qIGZvciBldmVyeSB1bml0IGluIHRoZSBiYW5kICovCiAgICAgICAgIGZvciAod2luZG93ID0gMCwgZ3JvdXAgPSAwOyBncm91cCA8IG51bU9mR3JvdXBzOyBncm91cCsrKSB7Ci0gICAgICAgICAgd2luR3JvdXBMZW4gPSBHZXRXaW5kb3dHcm91cExlbmd0aCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyxncm91cCk7CisgICAgICAgICAgd2luR3JvdXBMZW4gPSAoU0NIQVIpR2V0V2luZG93R3JvdXBMZW5ndGgoCisgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBncm91cCk7CiAgICAgICAgICAgZm9yIChncm91cFdpbiA9IHdpbkdyb3VwTGVuOyBncm91cFdpbiAhPSAwOyBncm91cFdpbi0tLCB3aW5kb3crKykgewogICAgICAgICAgICAgY2IgPSBwQ29kZUJvb2tbZ3JvdXAgKiAxNiArIGJhbmRdOwogICAgICAgICAgICAgaWYgKGNiICE9IGNiX3ByZXYpIHsKLSNpZiBDSEVDS19WQUxJRF9IQ1JfSU5QVVQgLyogc2hvcnQtYmxvY2sgIDEgb2YgMiAqLwotICAgICAgICAgICAgICBlcnJEZXRlY3RvckluSGNyU2lkZWluZm9TaHJ0KGNiLG51bUxpbmUsJnBIY3ItPmRlY0luT3V0LmVycm9yTG9nICk7Ci0gICAgICAgICAgICAgIGlmIChwSGNyLT5kZWNJbk91dC5lcnJvckxvZyAhPSAwICkgewotICAgICAgICAgICAgICAgIHJldHVybiAoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICk7CisgICAgICAgICAgICAgIGVyckRldGVjdG9ySW5IY3JTaWRlaW5mb1NocnQoY2IsIG51bUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsKKyAgICAgICAgICAgICAgaWYgKHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsKICAgICAgICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgICAgICAgICpwQ29kZUJrKysgPSBjYjsKICAgICAgICAgICAgICAgKnBOdW1MaW5lc0luU2VjKysgPSBudW1MaW5lOwogICAgICAgICAgICAgICBudW1TZWN0aW9uKys7CiAKICAgICAgICAgICAgICAgY2JfcHJldiA9IGNiOwogICAgICAgICAgICAgICBudW1MaW5lID0gTElORVNfUEVSX1VOSVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIG51bUxpbmUgKz0gTElORVNfUEVSX1VOSVQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQpAQCAtMzY3LDE4ICszNjIsMTYgQEAKIAogICAgIG51bVNlY3Rpb24rKzsKIAotI2lmIENIRUNLX1ZBTElEX0hDUl9JTlBVVCAvKiBzaG9ydC1ibG9jayAgMiBvZiAyICovCi0gICAgZXJyRGV0ZWN0b3JJbkhjclNpZGVpbmZvU2hydChjYixudW1MaW5lLCZwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOwotICAgIGlmICggbnVtU2VjdGlvbiA8PSAwIHx8IG51bVNlY3Rpb24gPiAxMDI0LzIgKSB7CisgICAgZXJyRGV0ZWN0b3JJbkhjclNpZGVpbmZvU2hydChjYiwgbnVtTGluZSwgJnBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsKKyAgICBpZiAobnVtU2VjdGlvbiA8PSAwIHx8IG51bVNlY3Rpb24gPiAxMDI0IC8gMikgewogICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gTlVNX1NFQ1RfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLOwogICAgIH0KICAgICBlcnJEZXRlY3RvckluSGNyTGVuZ3RocyhwSGNyLT5kZWNJbk91dC5sZW5ndGhPZkxvbmdlc3RDb2Rld29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSGNyLT5kZWNJbk91dC5lcnJvckxvZyk7Ci0gICAgaWYgKHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICE9IDAgKSB7Ci0gICAgICByZXR1cm4gKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSGNyLT5kZWNJbk91dC5lcnJvckxvZyk7CisgICAgaWYgKHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICE9IDApIHsKKyAgICAgIHJldHVybiAocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cpOwogICAgIH0KLSNlbmRpZgogCiAgICAgKnBDb2RlQmsgPSBjYjsKICAgICAqcE51bUxpbmVzSW5TZWMgPSBudW1MaW5lOwpAQCAtMzg2LDQ2ICszNzksNDAgQEAKIAogICB9IGVsc2UgLyogZW5kIHNob3J0IGJsb2NrIHByZXBhcmUgU0kgKi8KICAgeyAgICAgIC8qIGxvbmcgYmxvY2sgKi8KLSNpZiBDSEVDS19WQUxJRF9IQ1JfSU5QVVQgLyogbG9uZy1ibG9jayAgMSBvZiAxICovCiAgICAgZXJyRGV0ZWN0b3JJbkhjckxlbmd0aHMocEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cpOwotICAgIG51bVNlY3Rpb24gICAgID0gcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cpOworICAgIG51bVNlY3Rpb24gPSBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uOwogICAgIHBOdW1MaW5lc0luU2VjID0gcEhjci0+ZGVjSW5PdXQucE51bUxpbmVJblNlY3Q7Ci0gICAgcENvZGVCayAgICAgICAgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7Ci0gICAgaWYgKCBudW1TZWN0aW9uIDw9IDAgfHwgbnVtU2VjdGlvbiA+IDY0ICkgeworICAgIHBDb2RlQmsgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7CisgICAgaWYgKG51bVNlY3Rpb24gPD0gMCB8fCBudW1TZWN0aW9uID4gNjQpIHsKICAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IE5VTV9TRUNUX09VVF9PRl9SQU5HRV9MT05HX0JMT0NLOwogICAgICAgbnVtU2VjdGlvbiA9IDA7CiAgICAgfQogCi0gICAgZm9yICggaSA9IG51bVNlY3Rpb247IGkgIT0gMDsgaS0tICkKLSAgICB7CisgICAgZm9yIChpID0gbnVtU2VjdGlvbjsgaSAhPSAwOyBpLS0pIHsKICAgICAgIGNiID0gKnBDb2RlQmsrKzsKIAotICAgICAgaWYgKCBjYiA8IFpFUk9fSENCIHx8IGNiID49IE1BWF9DQl9DSEVDSyB8fCBjYiA9PSBCT09LU0NMICkgeworICAgICAgaWYgKGNiIDwgWkVST19IQ0IgfHwgY2IgPj0gTUFYX0NCX0NIRUNLIHx8IGNiID09IEJPT0tTQ0wpIHsKICAgICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gQ0JfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0s7CiAgICAgICB9CiAKICAgICAgIG51bUxpbmUgPSAqcE51bUxpbmVzSW5TZWMrKzsKICAgICAgIC8qIEZES19BU1NFUlQobnVtTGluZSA+IDApOyAqLwogCi0gICAgICBpZiAoIChudW1MaW5lIDw9IDApIHx8IChudW1MaW5lID4gMTAyNCkgKSB7CisgICAgICBpZiAoKG51bUxpbmUgPD0gMCkgfHwgKG51bUxpbmUgPiAxMDI0KSkgewogICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBMSU5FX0lOX1NFQ1RfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0s7CiAgICAgICB9CiAgICAgfQotICAgIGlmIChwSGNyLT5kZWNJbk91dC5lcnJvckxvZyAhPSAwICkgewotICAgICAgcmV0dXJuICggcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgKTsKKyAgICBpZiAocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgIT0gMCkgeworICAgICAgcmV0dXJuIChwSGNyLT5kZWNJbk91dC5lcnJvckxvZyk7CiAgICAgfQotI2VuZGlmICAvKiBDSEVDS19WQUxJRF9IQ1JfSU5QVVQgKi8KICAgfQogCiAgIHBDb2RlQmsgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7Ci0gIGZvciAoIGkgPSAwOyBpIDwgbnVtU2VjdGlvbjsgaSsrICkgewotICAgIGlmICgKLSAgICAgICAgICgqcENvZGVCayA9PSBOT0lTRV9IQ0IpICAgICAgfHwKLSAgICAgICAgICgqcENvZGVCayA9PSBJTlRFTlNJVFlfSENCMikgfHwKLSAgICAgICAgICgqcENvZGVCayA9PSBJTlRFTlNJVFlfSENCKSkKLSAgICB7CisgIGZvciAoaSA9IDA7IGkgPCBudW1TZWN0aW9uOyBpKyspIHsKKyAgICBpZiAoKCpwQ29kZUJrID09IE5PSVNFX0hDQikgfHwgKCpwQ29kZUJrID09IElOVEVOU0lUWV9IQ0IyKSB8fAorICAgICAgICAoKnBDb2RlQmsgPT0gSU5URU5TSVRZX0hDQikpIHsKICAgICAgICpwQ29kZUJrID0gMDsKICAgICB9CiAgICAgcENvZGVCaysrOwpAQCAtNDMzLDU0ICs0MjAsMjQgQEAKIAogICAvKiBIQ1Itc2lkZWluZm8taW5wdXQgaXMgY29tcGxldGUgYW5kIHNlZW1zIHRvIGJlIHZhbGlkICovCiAKLQotCi0gIHJldHVybiAoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICk7CisgIHJldHVybiAocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cpOwogfQogCi0KLQotCi0jaWYgVVNFX0hDUl9EVU1NWQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgdGhlIGNvZGV3b3JkcyBvZiB0aGUgc3BlY3RyYWwKK2NvZWZmaWNpZW50cyBmcm9tIHRoZSBiaXRzdHJlYW0gYWNjb3JkaW5nIHRvIHRoZSBIQ1IgYWxnb3JpdGhtIGFuZCBzdG9yZXMgdGhlCitxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzIGluIGNvcnJlY3Qgb3JkZXIgaW4gdGhlIG91dHB1dCBidWZmZXIuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotICAgICBkZXNjcmlwdGlvbjogICBUaGlzIEhDUiAtIGR1bW15ICAtIGZ1bmN0aW9uIHdyaXRlcyBvbmx5IGEgZGlyYWMtc2VxdWVuY2UgaW4gb3V0cHV0IGJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUlOVCBIY3JEZWNvZGVyKEhfSENSX0lORk8gICAgICAgICAgICAgIHBIY3IsCi0gICAgICAgICAgICAgICAgY29uc3QgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBicykKLXsKLSAgZm9yIChTSE9SVCBpPTA7IGkgPCAxMDI0OyBpKysgKSB7Ci0gICAgcEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzLT5Mb25nW2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgaWYgKCBpICUgMzAgPT0gMCkgewotICAgICAgcEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzLT5Mb25nW2ldID0gKEZJWFBfREJMKUhDUl9ESVJBQzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbHNlIC8qIFVTRV9IQ1JfRFVNTVkgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoZSBjb2Rld29yZHMgb2YgdGhlIHNwZWN0cmFsIGNvZWZmaWNpZW50cyBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gYWNjb3JkaW5nIHRvIHRoZSBIQ1IgYWxnb3JpdGhtIGFuZCBzdG9yZXMgdGhlIHF1YW50aXplZCBzcGVjdHJhbAotICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudHMgaW4gY29ycmVjdCBvcmRlciBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLVVJTlQgSGNyRGVjb2RlcihIX0hDUl9JTkZPICAgICAgICAgICAgICBwSGNyLAotICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAgICAgICAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCi17CitVSU5UIEhjckRlY29kZXIoSF9IQ1JfSU5GTyBwSGNyLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CiAgIGludCBwVG1wMSwgcFRtcDIsIHBUbXAzLCBwVG1wNDsKLSNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKLSAgaW50ICAgICAgICBwVG1wNTsKLSNlbmRpZgorICBpbnQgcFRtcDU7CiAKLSAgSU5UICAgICAgICBiaXRDbnRPZmZzdDsKLSAgVUlOVCAgICAgICBzYXZlQml0Q250ID0gRkRLZ2V0Qml0Q250KGJzKTsgICAvKiBzYXZlIGJpdHN0cmVhbSBwb3NpdGlvbiAqLworICBJTlQgYml0Q250T2Zmc3Q7CisgIElOVCBzYXZlQml0Q250ID0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpOyAvKiBzYXZlIGJpdHN0cmVhbSBwb3NpdGlvbiAqLwogCiAgIEhjckNhbGNOdW1Db2Rld29yZChwSGNyKTsKIApAQCAtNDkwLDI0NCArNDQ3LDI0MCBAQAogCiAgIEhjckV4dGVuZGVkU2VjdGlvbkluZm8ocEhjcik7CiAKLSAgaWYgKCggcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgJiBIQ1JfRkFUQUxfUENXX0VSUk9SX01BU0sgKSAhPSAwICkgewotICAgIHJldHVybiAoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICk7ICAvKiBzaWRlaW5mbyBpcyBtYXNzaXZlbHkgY29ycnVwdCwgcmV0dXJuIGZyb20gSENSIHdpdGhvdXQgaGF2aW5nIGRlY29kZWQgYW55dGhpbmcgKi8KKyAgaWYgKChwSGNyLT5kZWNJbk91dC5lcnJvckxvZyAmIEhDUl9GQVRBTF9QQ1dfRVJST1JfTUFTSykgIT0gMCkgeworICAgIHJldHVybiAocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cpOyAvKiBzaWRlaW5mbyBpcyBtYXNzaXZlbHkgY29ycnVwdCwgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gSENSIHdpdGhvdXQgaGF2aW5nIGRlY29kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55dGhpbmcgKi8KICAgfQogCi0gIERlcml2ZU51bWJlck9mRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cyhwSGNyLT5zZWdtZW50SW5mby5udW1TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhjci0+c2VjdGlvbkluZm8ucE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhjci0+c2VjdGlvbkluZm8ucE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4KTsKKyAgRGVyaXZlTnVtYmVyT2ZFeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzKAorICAgICAgcEhjci0+c2VnbWVudEluZm8ubnVtU2VnbWVudCwKKyAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uLAorICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCwKKyAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzLAorICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCk7CiAKICAgLyogc3RvcmUgKi8KICAgcFRtcDEgPSBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4OwogICBwVG1wMiA9IHBIY3ItPnNlY3Rpb25JbmZvLmV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7CiAgIHBUbXAzID0gcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKICAgcFRtcDQgPSBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKLSNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKICAgcFRtcDUgPSBwSGNyLT5zZWN0aW9uSW5mby5tYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHg7Ci0jZW5kaWYKIAogICAvKiAtLS0tLS0tIGRlY29kZSBtZWFuaW5nZnVsIFBDV3MgLS0tLS0tICovCiAgIERlY29kZVBDV3MoYnMsIHBIY3IpOwogCi0gIGlmICgoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICYgSENSX0ZBVEFMX1BDV19FUlJPUl9NQVNLICkgPT0gMCApIHsKKyAgaWYgKChwSGNyLT5kZWNJbk91dC5lcnJvckxvZyAmIEhDUl9GQVRBTF9QQ1dfRVJST1JfTUFTSykgPT0gMCkgewogICAgIC8qIC0tLS0tLSBkZWNvZGUgdGhlIG5vbi1QQ1dzIC0tLS0tLS0tICovCiAgICAgRGVjb2RlTm9uUENXcyhicywgcEhjcik7CiAgIH0KIAotCi0jaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0ZJTkFMCiAgIGVyckRldGVjdFdpdGhpblNlZ21lbnRhdGlvbkZpbmFsKHBIY3IpOwotI2VuZGlmCiAKICAgLyogcmVzdG9yZSAqLwogICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID0gcFRtcDE7Ci0gIHBIY3ItPnNlY3Rpb25JbmZvLmV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggICAgICAgICAgICAgPSBwVG1wMjsKLSAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCAgICA9IHBUbXAzOwotICBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCAgICAgICAgID0gcFRtcDQ7Ci0jaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCi0gIHBIY3ItPnNlY3Rpb25JbmZvLm1heExlbk9mQ2JJbkV4dFNydFNlY0lkeCAgICAgICAgICAgICAgPSBwVG1wNTsKLSNlbmRpZgorICBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4ID0gcFRtcDI7CisgIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggPSBwVG1wMzsKKyAgcEhjci0+ZGVjSW5PdXQucXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggPSBwVG1wNDsKKyAgcEhjci0+c2VjdGlvbkluZm8ubWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4ID0gcFRtcDU7CiAKLSAgSGNyUmVvcmRlclF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzKHBIY3IsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgSGNyUmVvcmRlclF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzKHBIY3IsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbyk7CiAKICAgLyogcmVzdG9yZSBiaXRzdHJlYW0gcG9zaXRpb24gKi8KLSAgYml0Q250T2Zmc3QgPSBzYXZlQml0Q250IC0gRkRLZ2V0Qml0Q250KGJzKTsKLSAgaWYoIGJpdENudE9mZnN0ICkgeworICBiaXRDbnRPZmZzdCA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSAtIHNhdmVCaXRDbnQ7CisgIGlmIChiaXRDbnRPZmZzdCkgewogICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCBiaXRDbnRPZmZzdCk7CiAgIH0KIAotICByZXR1cm4gKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOworICByZXR1cm4gKHBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsKIH0KIAotCi0jZW5kaWYgIC8qIFVTRV9IQ1JfRFVNTVkgKi8KLQotCi0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiByZW9yZGVycyB0aGUgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyBzZWN0aW9ud2lzZSBmb3IKLSAgICAgICAgICAgICAgICAgICAgbG9uZy0gYW5kIHNob3J0LWJsb2NrcyBhbmQgY29tcGFyZXMgdG8gdGhlIExBViAoTGFyZ2VzdCBBYnNvbHV0ZSBWYWx1ZSBvZgotICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBjb2RlYm9vaykgLS0gYSBjb3VudGVyIGlzIGluY3JlbWVudGVkIGlmIHRoZXJlIGlzIGFuIGVycm9yCisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gcmVvcmRlcnMgdGhlIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMKK3NlY3Rpb253aXNlIGZvciBsb25nLSBhbmQgc2hvcnQtYmxvY2tzIGFuZCBjb21wYXJlcyB0byB0aGUgTEFWIChMYXJnZXN0IEFic29sdXRlCitWYWx1ZSBvZiB0aGUgY3VycmVudCBjb2RlYm9vaykgLS0gYSBjb3VudGVyIGlzIGluY3JlbWVudGVkIGlmIHRoZXJlIGlzIGFuIGVycm9yCiAgICAgICAgICAgICAgICAgICAgIGRldGVjdGVkLgotICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIGZvciBzaG9ydC1ibG9ja3MgYSB1bml0LWJhc2VkLWRlaW50ZXJsZWF2aW5nIGlzIGFwcGxpZWQuCi0gICAgICAgICAgICAgICAgICAgIE1vcmVvdmVyIChmb3Igc2hvcnQgYmxvY2tzKSB0aGUgc2NhbGluZyBpcyBkZXJpdmVkIChjb21wYXJlIHBsYWluIGh1ZmZtYW4KLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlcikuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIGZvciBzaG9ydC1ibG9ja3MgYSB1bml0LWJhc2VkLWRlaW50ZXJsZWF2aW5nIGlzCithcHBsaWVkLiBNb3Jlb3ZlciAoZm9yIHNob3J0IGJsb2NrcykgdGhlIHNjYWxpbmcgaXMgZGVyaXZlZCAoY29tcGFyZSBwbGFpbgoraHVmZm1hbiBkZWNvZGVyKS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCiBzdGF0aWMgdm9pZCBIY3JSZW9yZGVyUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMoCi0gICAgICAgIEhfSENSX0lORk8gcEhjciwgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8KLSAgICAgICAgKQotewotICBJTlQgICAgICAgcXNjOwotICBVSU5UICAgICAgYWJzX3FzYzsKLSAgVUlOVCAgICAgIGksajsKLSAgVVNIT1JUICAgIG51bVNwZWN0cmFsVmFsdWVzSW5TZWN0aW9uOworICAgIEhfSENSX0lORk8gcEhjciwgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbykgeworICBJTlQgcXNjOworICBVSU5UIGFic19xc2M7CisgIFVJTlQgaSwgajsKKyAgVVNIT1JUIG51bVNwZWN0cmFsVmFsdWVzSW5TZWN0aW9uOwogICBGSVhQX0RCTCAqcFRlVmE7Ci0gIFVTSE9SVCAgICBsYXZFcnJvckNudCA9IDA7CisgIFVTSE9SVCBsYXZFcnJvckNudCA9IDA7CiAKLSAgVUlOVCAgICAgIG51bVNlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uOwotICBTUEVDVFJBTF9QVFIgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UgPSBwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlOwotICBGSVhQX0RCTCAqcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzICAgICA9IFNQRUNfTE9ORyhwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlKTsKLSAgY29uc3QgVUNIQVIgICAgKnBDYkRpbVNoaWZ0ICAgICAgICAgICAgICAgICAgPSBwSGNyLT50YWJsZUluZm8ucENiRGltU2hpZnQ7Ci0gIGNvbnN0IFVTSE9SVCAgICpwTGFyZ2VzdEFic1ZhbCAgICAgICAgICAgICAgID0gcEhjci0+dGFibGVJbmZvLnBMYXJnZXN0QWJzVmFsOwotICBVQ0hBUiAgICAqcFNvcnRlZENvZGVib29rICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBTb3J0ZWRDb2RlYm9vazsKLSAgVVNIT1JUICAgKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbiAgICAgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5wTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb247Ci0gIFVTSE9SVCAgICpwUmVvcmRlck9mZnNldCAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucFJlb3JkZXJPZmZzZXQ7Ci0gIEZJWFBfREJMICpwVGVtcFZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFRlbXBWYWx1ZXM7Ci0gIEZJWFBfREJMICpwQmFrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFRlbXBWYWx1ZXM7CisgIFVJTlQgbnVtU2VjdGlvbiA9IHBIY3ItPmRlY0luT3V0Lm51bVNlY3Rpb247CisgIFNQRUNUUkFMX1BUUiBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlID0KKyAgICAgIHBIY3ItPmRlY0luT3V0LnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2U7CisgIEZJWFBfREJMICpwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMgPQorICAgICAgU1BFQ19MT05HKHBIY3ItPmRlY0luT3V0LnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UpOworICBjb25zdCBVQ0hBUiAqcENiRGltU2hpZnQgPSBhRGltQ2JTaGlmdDsKKyAgY29uc3QgVVNIT1JUICpwTGFyZ2VzdEFic1ZhbCA9IGFMYXJnZXN0QWJzb2x1dGVWYWx1ZTsKKyAgVUNIQVIgKnBTb3J0ZWRDb2RlYm9vayA9IHBIY3ItPnNlY3Rpb25JbmZvLnBTb3J0ZWRDb2RlYm9vazsKKyAgVVNIT1JUICpwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb24gPQorICAgICAgcEhjci0+c2VjdGlvbkluZm8ucE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOworICBVU0hPUlQgKnBSZW9yZGVyT2Zmc2V0ID0gcEhjci0+c2VjdGlvbkluZm8ucFJlb3JkZXJPZmZzZXQ7CisgIEZJWFBfREJMIHBUZW1wVmFsdWVzWzEwMjRdOworICBGSVhQX0RCTCAqcEJhayA9IHBUZW1wVmFsdWVzOwogCi0gIEZES21lbWNsZWFyKHBUZW1wVmFsdWVzLDEwMjQqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKHBUZW1wVmFsdWVzLCAxMDI0ICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgLyogbG9uZyBhbmQgc2hvcnQ6IGNoZWNrIGlmIGRlY29kZWQgaHVmZm1hbi12YWx1ZXMgKHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMpIGFyZSB3aXRoaW4gcmFuZ2UgKi8KLSAgZm9yICggaT1udW1TZWN0aW9uOyBpICE9IDA7IGktLSApIHsKLSAgICBudW1TcGVjdHJhbFZhbHVlc0luU2VjdGlvbiA9ICpwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb24rKyA8PCBwQ2JEaW1TaGlmdFsqcFNvcnRlZENvZGVib29rXTsKKyAgLyogbG9uZyBhbmQgc2hvcnQ6IGNoZWNrIGlmIGRlY29kZWQgaHVmZm1hbi12YWx1ZXMgKHF1YW50aXplZCBzcGVjdHJhbAorICAgKiBjb2VmZmljaWVudHMpIGFyZSB3aXRoaW4gcmFuZ2UgKi8KKyAgZm9yIChpID0gbnVtU2VjdGlvbjsgaSAhPSAwOyBpLS0pIHsKKyAgICBudW1TcGVjdHJhbFZhbHVlc0luU2VjdGlvbiA9ICpwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb24rKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcENiRGltU2hpZnRbKnBTb3J0ZWRDb2RlYm9va107CiAgICAgcFRlVmEgPSAmcFRlbXBWYWx1ZXNbKnBSZW9yZGVyT2Zmc2V0KytdOwotICAgIGZvciggaiA9IG51bVNwZWN0cmFsVmFsdWVzSW5TZWN0aW9uOyBqICE9IDA7IGotLSApIHsKKyAgICBmb3IgKGogPSBudW1TcGVjdHJhbFZhbHVlc0luU2VjdGlvbjsgaiAhPSAwOyBqLS0pIHsKICAgICAgIHFzYyA9ICpwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMrKzsKLSAgICAgIGFic19xc2MgPSBGREthYnMocXNjKTsKLSNpZiBWQUxJRF9MQVZfRVJST1JfVFJJR0dFUgotICAgICAgaWYgKCBhYnNfcXNjIDw9IHBMYXJnZXN0QWJzVmFsWypwU29ydGVkQ29kZWJvb2tdICkgewotICAgICAgICAqcFRlVmErKyA9IChGSVhQX0RCTClxc2M7ICAvKiB0aGUgcXNjIHZhbHVlIGlzIHdpdGhpbiByYW5nZSAqLwotICAgICAgfQotICAgICAgZWxzZSB7IC8qIGxpbmUgaXMgdG9vIGhpZ2ggLi4gKi8KLSAgICAgICAgaWYgKCBhYnNfcXNjID09IFFfVkFMVUVfSU5WQUxJRCApIHsgLyogLi4gYmVjYXVzZSBvZiBwcmV2aW91cyBtYXJraW5nIC0tPiBkb250IHNldCBMQVYgZmxhZyAod291bGQgYmUgY29uZnVzaW5nKSwganVzdCBjb3B5IG91dCB0aGUgYWxyZWFkeSBtYXJrZWQgdmFsdWUgKi8KLSAgICAgICAgICAqcFRlVmErKyA9IChGSVhQX0RCTCkgcXNjOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC4uIGJlY2F1c2UgYSB0b28gaGlnaCB2YWx1ZSB3YXMgZGVjb2RlZCBmb3IgdGhpcyBjYiAtLT4gc2V0IExBViBmbGFnICovCi0gICAgICAgICAgKnBUZVZhKysgPSAoRklYUF9EQkwpIFFfVkFMVUVfSU5WQUxJRDsKKyAgICAgIGFic19xc2MgPSBmQWJzKHFzYyk7CisgICAgICBpZiAoYWJzX3FzYyA8PSBwTGFyZ2VzdEFic1ZhbFsqcFNvcnRlZENvZGVib29rXSkgeworICAgICAgICAqcFRlVmErKyA9IChGSVhQX0RCTClxc2M7IC8qIHRoZSBxc2MgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogbGluZSBpcyB0b28gaGlnaCAuLiAqLworICAgICAgICBpZiAoYWJzX3FzYyA9PQorICAgICAgICAgICAgUV9WQUxVRV9JTlZBTElEKSB7IC8qIC4uIGJlY2F1c2Ugb2YgcHJldmlvdXMgbWFya2luZyAtLT4gZG9udCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVYgZmxhZyAod291bGQgYmUgY29uZnVzaW5nKSwganVzdCBjb3B5IG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhbHJlYWR5IG1hcmtlZCB2YWx1ZSAqLworICAgICAgICAgICpwVGVWYSsrID0gKEZJWFBfREJMKXFzYzsKKyAgICAgICAgfSBlbHNlIHsgLyogLi4gYmVjYXVzZSBhIHRvbyBoaWdoIHZhbHVlIHdhcyBkZWNvZGVkIGZvciB0aGlzIGNiIC0tPiBzZXQKKyAgICAgICAgICAgICAgICAgICAgTEFWIGZsYWcgKi8KKyAgICAgICAgICAqcFRlVmErKyA9IChGSVhQX0RCTClRX1ZBTFVFX0lOVkFMSUQ7CiAgICAgICAgICAgbGF2RXJyb3JDbnQgKz0gMTsKICAgICAgICAgfQogICAgICAgfQotI2Vsc2UKLSAgICAgIGlmICggYWJzX3FzYyA8PSBwTGFyZ2VzdEFic1ZhbFsqcFNvcnRlZENvZGVib29rXSApIHsKLSAgICAgICAgKnBUZVZhKysgPSBxc2M7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgKnBUZVZhKysgPSBRX1ZBTFVFX0lOVkFMSUQ7Ci0gICAgICAgIGxhdkVycm9yQ250ICs9IDE7Ci0gICAgICB9Ci0jZW5kaWYKICAgICB9CiAgICAgcFNvcnRlZENvZGVib29rKys7CiAgIH0KIAotICBpZiAoIUlzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSkKLSAgeworICBpZiAoIUlzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSkgewogICAgIEZJWFBfREJMICpwT3V0OwotICAgIEZJWFBfREJMICBsb2NNYXg7Ci0gICAgRklYUF9EQkwgIHRtcDsKLSAgICBTQ0hBUiAgICAgZ3JvdXBvZmZzZXQ7Ci0gICAgU0NIQVIgICAgIGdyb3VwOwotICAgIFNDSEFSICAgICBiYW5kOwotICAgIFNDSEFSICAgICBncm91cHdpbjsKLSAgICBTQ0hBUiAgICAgd2luZG93OwotICAgIFNDSEFSICAgICBudW1XaW5Hcm91cDsKLSAgICBTSE9SVCAgICAgaW50ZXJtOwotICAgIFNDSEFSICAgICBudW1TZmJUcmFuc207Ci0gICAgU0NIQVIgICAgIHdpbkdyb3VwTGVuOwotICAgIFNIT1JUICAgICBpbmRleDsKLSAgICBJTlQgICAgICAgbXNiOwotICAgIElOVCAgICAgICBsc2I7CisgICAgRklYUF9EQkwgbG9jTWF4OworICAgIEZJWFBfREJMIHRtcDsKKyAgICBTQ0hBUiBncm91cG9mZnNldDsKKyAgICBTQ0hBUiBncm91cDsKKyAgICBTQ0hBUiBiYW5kOworICAgIFNDSEFSIGdyb3Vwd2luOworICAgIFNDSEFSIHdpbmRvdzsKKyAgICBTQ0hBUiBudW1XaW5Hcm91cDsKKyAgICBTSE9SVCBpbnRlcm07CisgICAgU0NIQVIgbnVtU2ZiVHJhbnNtOworICAgIFNDSEFSIHdpbkdyb3VwTGVuOworICAgIFNIT1JUIGluZGV4OworICAgIElOVCBtc2I7CisgICAgSU5UIGxzYjsKIAotICAgIFNIT1JUICAgKnBTY2FsZUZhY0hjciA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3I7Ci0gICAgU0hPUlQgICAqcFNmYlNjbEhjciAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTZmJTY2FsZTsKLSAgICBjb25zdCBTSE9SVCAqQmFuZE9mZnNldHMgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7CisgICAgU0hPUlQgKnBTY2FsZUZhY0hjciA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3I7CisgICAgU0hPUlQgKnBTZmJTY2xIY3IgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNmYlNjYWxlOworICAgIGNvbnN0IFNIT1JUICpCYW5kT2Zmc2V0cyA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoCisgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7CiAKLSAgICBwQmFrID0gcEhjci0+c2VnbWVudEluZm8ucFRlbXBWYWx1ZXM7CisgICAgcEJhayA9IHBUZW1wVmFsdWVzOwogICAgIC8qIGRlaW50ZXJsZWF2ZSB1bml0d2lzZSBmb3Igc2hvcnQgYmxvY2tzICovCi0gICAgZm9yICggd2luZG93ID0gMDsgd2luZG93IDwgKDgpOyB3aW5kb3crKyApIHsKLSAgICAgIHBPdXQgPSBTUEVDKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCk7Ci0gICAgICBmb3IgKCBpPTA7IGkgPCAoTElORVNfUEVSX1VOSVRfR1JPVVApOyBpKysgKSB7Ci0gICAgICAgIHBUZVZhID0gcEJhayArICh3aW5kb3cgPDwgRk9VUl9MT0dfRElWX1RXT19MT0cpICsgaSAqIDMyOwkvKiBkaXN0YW5jZSBvZiBsaW5lcyBiZXR3ZWVuIHVuaXQgZ3JvdXBzIGhhcyB0byBiZSBjb25zdGFudCBmb3IgZXZlcnkgZnJhbWVsZW5ndGggKDMyKSEgICovCi0gICAgICAgIGZvciAoIGo9KExJTkVTX1BFUl9VTklUKTsgaiAhPSAwOyBqLS0gKSB7CisgICAgZm9yICh3aW5kb3cgPSAwOyB3aW5kb3cgPCAoOCk7IHdpbmRvdysrKSB7CisgICAgICBwT3V0ID0gU1BFQyhwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlLCB3aW5kb3csCisgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoTElORVNfUEVSX1VOSVRfR1JPVVApOyBpKyspIHsKKyAgICAgICAgcFRlVmEgPSBwQmFrICsgKHdpbmRvdyA8PCBGT1VSX0xPR19ESVZfVFdPX0xPRykgKworICAgICAgICAgICAgICAgIGkgKiAzMjsgLyogZGlzdGFuY2Ugb2YgbGluZXMgYmV0d2VlbiB1bml0IGdyb3VwcyBoYXMgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50IGZvciBldmVyeSBmcmFtZWxlbmd0aCAoMzIpISAgKi8KKyAgICAgICAgZm9yIChqID0gKExJTkVTX1BFUl9VTklUKTsgaiAhPSAwOyBqLS0pIHsKICAgICAgICAgICAqcE91dCsrID0gKnBUZVZhKys7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKICAgICAvKiBzaG9ydCBibG9ja3Mgb25seSAqLwotICAgIC8qIGRlcml2ZSBnbG9iYWwgc2NhbGluZy12YWx1ZSBmb3IgZXZlcnkgc2ZiIGFuZCBldmVyeSB3aW5kb3cgKGFzIGl0IGlzIGRvbmUgaW4gcGxhaW4taHVmZm1hbi1kZWNvZGVyIGF0IHNob3J0IGJsb2NrcykgKi8KKyAgICAvKiBkZXJpdmUgZ2xvYmFsIHNjYWxpbmctdmFsdWUgZm9yIGV2ZXJ5IHNmYiBhbmQgZXZlcnkgd2luZG93IChhcyBpdCBpcyBkb25lCisgICAgICogaW4gcGxhaW4taHVmZm1hbi1kZWNvZGVyIGF0IHNob3J0IGJsb2NrcykgKi8KICAgICBncm91cG9mZnNldCA9IDA7CiAKICAgICBudW1XaW5Hcm91cCA9IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7Ci0gICAgbnVtU2ZiVHJhbnNtID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKyAgICBudW1TZmJUcmFuc20gPQorICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOwogCiAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgbnVtV2luR3JvdXA7IGdyb3VwKyspIHsKLSAgICAgIHdpbkdyb3VwTGVuID0gR2V0V2luZG93R3JvdXBMZW5ndGgoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sZ3JvdXApOworICAgICAgd2luR3JvdXBMZW4gPQorICAgICAgICAgIEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBncm91cCk7CiAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtU2ZiVHJhbnNtOyBiYW5kKyspIHsKICAgICAgICAgaW50ZXJtID0gZ3JvdXAgKiAxNiArIGJhbmQ7CiAgICAgICAgIG1zYiA9IHBTY2FsZUZhY0hjcltpbnRlcm1dID4+IDI7CiAgICAgICAgIGxzYiA9IHBTY2FsZUZhY0hjcltpbnRlcm1dICYgMzsKICAgICAgICAgZm9yIChncm91cHdpbiA9IDA7IGdyb3Vwd2luIDwgd2luR3JvdXBMZW47IGdyb3Vwd2luKyspIHsKICAgICAgICAgICB3aW5kb3cgPSBncm91cG9mZnNldCArIGdyb3Vwd2luOwotICAgICAgICAgIHBCYWsgPSBTUEVDKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCk7CisgICAgICAgICAgcEJhayA9IFNQRUMocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSwgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgpOwogICAgICAgICAgIGxvY01heCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgICAgIGZvciAoaW5kZXggPSBCYW5kT2Zmc2V0c1tiYW5kXTsgaW5kZXggPCBCYW5kT2Zmc2V0c1tiYW5kKzFdOyBpbmRleCArPSBMSU5FU19QRVJfVU5JVCkgeworICAgICAgICAgIGZvciAoaW5kZXggPSBCYW5kT2Zmc2V0c1tiYW5kXTsgaW5kZXggPCBCYW5kT2Zmc2V0c1tiYW5kICsgMV07CisgICAgICAgICAgICAgICBpbmRleCArPSBMSU5FU19QRVJfVU5JVCkgewogICAgICAgICAgICAgcFRlVmEgPSAmcEJha1tpbmRleF07Ci0gICAgICAgICAgICBmb3IgKCBpID0gTElORVNfUEVSX1VOSVQ7IGkgIT0gMDsgaSAtLSkgewotICAgICAgICAgICAgICB0bXAgPSAoKnBUZVZhIDwgRkwyRlhDT05TVF9EQkwoMC4wZikpPyAtKnBUZVZhKysgOiAqcFRlVmErKzsKLSAgICAgICAgICAgICAgbG9jTWF4ID0gZml4TWF4KHRtcCxsb2NNYXgpOworICAgICAgICAgICAgZm9yIChpID0gTElORVNfUEVSX1VOSVQ7IGkgIT0gMDsgaS0tKSB7CisgICAgICAgICAgICAgIHRtcCA9ICgqcFRlVmEgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgPyAtKnBUZVZhKysgOiAqcFRlVmErKzsKKyAgICAgICAgICAgICAgbG9jTWF4ID0gZml4TWF4KHRtcCwgbG9jTWF4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCBmaXhwX2Ficyhsb2NNYXgpID4gKEZJWFBfREJMKU1BWF9RVUFOVElaRURfVkFMVUUgKSB7CisgICAgICAgICAgaWYgKGZpeHBfYWJzKGxvY01heCkgPiAoRklYUF9EQkwpTUFYX1FVQU5USVpFRF9WQUxVRSkgewogICAgICAgICAgICAgbG9jTWF4ID0gKEZJWFBfREJMKU1BWF9RVUFOVElaRURfVkFMVUU7CiAgICAgICAgICAgfQotICAgICAgICAgIHBTZmJTY2xIY3Jbd2luZG93KjE2K2JhbmRdID0gbXNiIC0gR2V0U2NhbGVGcm9tVmFsdWUobG9jTWF4LCBsc2IpOyAgLyogc2F2ZSBnbG9iYWwgc2NhbGUgbWF4aW1hIGluIHRoaXMgc2ZiICovCisgICAgICAgICAgcFNmYlNjbEhjclt3aW5kb3cgKiAxNiArIGJhbmRdID0KKyAgICAgICAgICAgICAgbXNiIC0gR2V0U2NhbGVGcm9tVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NNYXgsIGxzYik7IC8qIHNhdmUgZ2xvYmFsIHNjYWxlIG1heGltYSBpbiB0aGlzIHNmYiAqLwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBncm91cG9mZnNldCArPSBHZXRXaW5kb3dHcm91cExlbmd0aCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyxncm91cCk7CisgICAgICBncm91cG9mZnNldCArPQorICAgICAgICAgIEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBncm91cCk7CiAgICAgfQotICB9IGVsc2UKLSAgeworICB9IGVsc2UgewogICAgIC8qIGNvcHkgc3RyYWlnaHQgZm9yIGxvbmctYmxvY2tzICovCi0gICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzID0gU1BFQ19MT05HKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UpOwotICAgIGZvciAoIGkgPSAxMDI0OyBpICE9IDA7IGktLSApIHsKKyAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMgPQorICAgICAgICBTUEVDX0xPTkcocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSk7CisgICAgZm9yIChpID0gMTAyNDsgaSAhPSAwOyBpLS0pIHsKICAgICAgICpwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMrKyA9ICpwQmFrKys7CiAgICAgfQogICB9CiAKLSAgaWYgKCBsYXZFcnJvckNudCAhPSAwICkgeworICBpZiAobGF2RXJyb3JDbnQgIT0gMCkgewogICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IExBVl9WSU9MQVRJT047CiAgIH0KIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBjb2Rld29yZHMKLSAgICAgICAgICAgICAgICAgICAgZm9yIGVhY2ggc2VjdGlvbiAobnVtQ29kZXdvcmRJblNlY3Rpb24pIGFuZCB0aGUgbnVtYmVyIG9mIGNvZGV3b3JkcwotICAgICAgICAgICAgICAgICAgICBmb3IgYWxsIHNlY3Rpb25zIChudW1Db2Rld29yZCkuCi0gICAgICAgICAgICAgICAgICAgIEZvciB6ZXJvIGFuZCBpbnRlbnNpdHkgY29kZWJvb2tzIGEgZW50cnkgaXMgYWxzbyBkb25lIGluIHRoZSB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICBudW1Db2Rld29yZEluU2VjdGlvbi4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBjb2RlYm9vayBpcyBhIHR3byB0dXBsZXMKLSAgICAgICAgICAgICAgICAgICAgY29kZWJvb2suIFRoaXMgaXMgbmVlZGVkIGxhdGVyIGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGJhc2UgYWRkcmVzc2VzCi0gICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmVvcmRlcmluZyBvZiB0aGUgcXVhbnRpemUgc3BlY3RyYWwgY29lZmZpY2llbnRzIGF0IHRoZSBlbmQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgIGhjciB0b29sLgotICAgICAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgbnVtQ29kZXdvcmQgY29udGFpbiB0aGUgbnVtYmVyIG9mIGNvZGV3b3JkcyB3aGljaCBhcmUgcmVhbGx5Ci0gICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXRzdHJlYW0uIFplcm8gb3IgaW50ZW5zaXR5IGNvZGVib29rcyBkb2VzIG5vdCBpbmNyZWFzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgbnVtQ29kZXdvcmRzLgorICAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBzZWN0aW9uIChudW1Db2Rld29yZEluU2VjdGlvbikgYW5kIHRoZSBudW1iZXIgb2YKK2NvZGV3b3JkcyBmb3IgYWxsIHNlY3Rpb25zIChudW1Db2Rld29yZCkuIEZvciB6ZXJvIGFuZCBpbnRlbnNpdHkgY29kZWJvb2tzIGEKK2VudHJ5IGlzIGFsc28gZG9uZSBpbiB0aGUgdmFyaWFibGUgbnVtQ29kZXdvcmRJblNlY3Rpb24uIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUKK2NvZGVib29rIGlzIGEgdHdvIHR1cGxlcyBjb2RlYm9vay4gVGhpcyBpcyBuZWVkZWQgbGF0ZXIgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZgordGhlIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgcmVvcmRlcmluZyBvZiB0aGUgcXVhbnRpemUgc3BlY3RyYWwgY29lZmZpY2llbnRzIGF0Cit0aGUgZW5kIG9mIHRoZSBoY3IgdG9vbC4gVGhlIHZhcmlhYmxlIG51bUNvZGV3b3JkIGNvbnRhaW4gdGhlIG51bWJlciBvZgorY29kZXdvcmRzIHdoaWNoIGFyZSByZWFsbHkgaW4gdGhlIGJpdHN0cmVhbS4gWmVybyBvciBpbnRlbnNpdHkgY29kZWJvb2tzIGRvZXMKK25vdCBpbmNyZWFzZSB0aGUgdmFyaWFibGUgbnVtQ29kZXdvcmRzLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotc3RhdGljIHZvaWQgSGNyQ2FsY051bUNvZGV3b3JkKEhfSENSX0lORk8gcEhjcikKLXsKLSAgaW50ICAgICBoY3JTZWN0aW9uOwotICBVSU5UICAgIG51bUNvZGV3b3JkOworc3RhdGljIHZvaWQgSGNyQ2FsY051bUNvZGV3b3JkKEhfSENSX0lORk8gcEhjcikgeworICBpbnQgaGNyU2VjdGlvbjsKKyAgVUlOVCBudW1Db2Rld29yZDsKIAotICBVSU5UICAgIG51bVNlY3Rpb24gICAgICAgICAgICA9ICAgcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbjsKLSAgVUNIQVIgICpwQ29kZWJvb2sgICAgICAgICAgICAgPSAgIHBIY3ItPmRlY0luT3V0LnBDb2RlYm9vazsKLSAgU0hPUlQgICpwTnVtTGluZUluU2VjdGlvbiAgICAgPSAgIHBIY3ItPmRlY0luT3V0LnBOdW1MaW5lSW5TZWN0OwotICBjb25zdCBVQ0hBUiAgKnBDYkRpbVNoaWZ0ICAgICA9ICAgcEhjci0+dGFibGVJbmZvLnBDYkRpbVNoaWZ0OwotICBVU0hPUlQgKnBOdW1Db2Rld29yZEluU2VjdGlvbiA9ICAgcEhjci0+c2VjdGlvbkluZm8ucE51bUNvZGV3b3JkSW5TZWN0aW9uOworICBVSU5UIG51bVNlY3Rpb24gPSBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uOworICBVQ0hBUiAqcENvZGVib29rID0gcEhjci0+ZGVjSW5PdXQucENvZGVib29rOworICBTSE9SVCAqcE51bUxpbmVJblNlY3Rpb24gPSBwSGNyLT5kZWNJbk91dC5wTnVtTGluZUluU2VjdDsKKyAgY29uc3QgVUNIQVIgKnBDYkRpbVNoaWZ0ID0gYURpbUNiU2hpZnQ7CisKKyAgVVNIT1JUICpwTnVtQ29kZXdvcmRJblNlY3Rpb24gPSBwSGNyLT5zZWN0aW9uSW5mby5wTnVtQ29kZXdvcmRJblNlY3Rpb247CiAKICAgbnVtQ29kZXdvcmQgPSAwOwotICBmb3IgKCBoY3JTZWN0aW9uID0gbnVtU2VjdGlvbjsgaGNyU2VjdGlvbiAhPSAwOyBoY3JTZWN0aW9uLS0gKSB7CisgIGZvciAoaGNyU2VjdGlvbiA9IG51bVNlY3Rpb247IGhjclNlY3Rpb24gIT0gMDsgaGNyU2VjdGlvbi0tKSB7CiAgICAgKnBOdW1Db2Rld29yZEluU2VjdGlvbiA9ICpwTnVtTGluZUluU2VjdGlvbisrID4+IHBDYkRpbVNoaWZ0WypwQ29kZWJvb2tdOwotICAgIGlmICggKnBDb2RlYm9vayAhPSAwICkgeworICAgIGlmICgqcENvZGVib29rICE9IDApIHsKICAgICAgIG51bUNvZGV3b3JkICs9ICpwTnVtQ29kZXdvcmRJblNlY3Rpb247CiAgICAgfQogICAgIHBOdW1Db2Rld29yZEluU2VjdGlvbisrOwpAQCAtNzM2LDYxICs2ODksNjMgQEAKICAgcEhjci0+c2VjdGlvbkluZm8ubnVtQ29kZXdvcmQgPSBudW1Db2Rld29yZDsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG51bWJlcgotICAgICAgICAgICAgICAgICAgICBvZiBzb3J0ZWQgY29kZWJvb2tzIGFuZCBzb3J0cyB0aGUgY29kZWJvb2tzIGFuZCB0aGUgbnVtQ29kZXdvcmRJblNlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBwcmlvcml0eS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICAgICAgICAgIG9mIHNvcnRlZCBjb2RlYm9va3MgYW5kIHNvcnRzIHRoZSBjb2RlYm9va3MgYW5kIHRoZQorbnVtQ29kZXdvcmRJblNlY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSBwcmlvcml0eS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi1zdGF0aWMgdm9pZCBIY3JTb3J0Q29kZWJvb2tBbmROdW1Db2Rld29yZEluU2VjdGlvbihIX0hDUl9JTkZPIHBIY3IpCi17CitzdGF0aWMgdm9pZCBIY3JTb3J0Q29kZWJvb2tBbmROdW1Db2Rld29yZEluU2VjdGlvbihIX0hDUl9JTkZPIHBIY3IpIHsKKyAgVUlOVCBpLCBqLCBrOworICBVQ0hBUiB0ZW1wOworICBVSU5UIGNvdW50ZXI7CisgIFVJTlQgc3RhcnRPZmZzZXQ7CisgIFVJTlQgbnVtWmVyb1NlY3Rpb247CisgIFVDSEFSICpwRGVzdDsKKyAgVUlOVCBudW1TZWN0aW9uRGVjOwogCi0gIFVJTlQgICAgaSxqLGs7Ci0gIFVDSEFSICAgdGVtcDsKLSAgVUlOVCAgICBjb3VudGVyOwotICBVSU5UICAgIHN0YXJ0T2Zmc2V0OwotICBVSU5UICAgIG51bVplcm9TZWN0aW9uOwotICBVQ0hBUiAgKnBEZXN0OwotICBVSU5UICAgIG51bVNlY3Rpb25EZWM7Ci0KLSAgVUlOVCAgICBudW1TZWN0aW9uICAgICAgICAgICAgICAgICAgPSAgIHBIY3ItPmRlY0luT3V0Lm51bVNlY3Rpb247Ci0gIFVDSEFSICAqcENvZGVib29rICAgICAgICAgICAgICAgICAgID0gICBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7Ci0gIFVDSEFSICAqcFNvcnRlZENvZGVib29rICAgICAgICAgICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5wU29ydGVkQ29kZWJvb2s7Ci0gIFVTSE9SVCAqcE51bUNvZGV3b3JkSW5TZWN0aW9uICAgICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtQ29kZXdvcmRJblNlY3Rpb247Ci0gIFVTSE9SVCAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uID0gICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb247Ci0gIFVDSEFSICAqcENvZGVib29rU3dpdGNoICAgICAgICAgICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5wQ29kZWJvb2tTd2l0Y2g7Ci0gIFVTSE9SVCAqcFJlb3JkZXJPZmZzZXQgICAgICAgICAgICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5wUmVvcmRlck9mZnNldDsKLSAgY29uc3QgVUNIQVIgICAqcENiUHJpb3JpdHkgICAgICAgICAgPSAgIHBIY3ItPnRhYmxlSW5mby5wQ2JQcmlvcml0eTsKLSAgY29uc3QgVUNIQVIgICAqcE1pbk9mQ2JQYWlyICAgICAgICAgPSAgIHBIY3ItPmNiUGFpcnMucE1pbk9mQ2JQYWlyOwotICBjb25zdCBVQ0hBUiAgICpwTWF4T2ZDYlBhaXIgICAgICAgICA9ICAgcEhjci0+Y2JQYWlycy5wTWF4T2ZDYlBhaXI7Ci0gIGNvbnN0IFVDSEFSICAgKnBDYkRpbVNoaWZ0ICAgICAgICAgID0gICBwSGNyLT50YWJsZUluZm8ucENiRGltU2hpZnQ7CisgIFVJTlQgbnVtU2VjdGlvbiA9IHBIY3ItPmRlY0luT3V0Lm51bVNlY3Rpb247CisgIFVDSEFSICpwQ29kZWJvb2sgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7CisgIFVDSEFSICpwU29ydGVkQ29kZWJvb2sgPSBwSGNyLT5zZWN0aW9uSW5mby5wU29ydGVkQ29kZWJvb2s7CisgIFVTSE9SVCAqcE51bUNvZGV3b3JkSW5TZWN0aW9uID0gcEhjci0+c2VjdGlvbkluZm8ucE51bUNvZGV3b3JkSW5TZWN0aW9uOworICBVU0hPUlQgKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb247CisgIFVDSEFSICpwQ29kZWJvb2tTd2l0Y2ggPSBwSGNyLT5zZWN0aW9uSW5mby5wQ29kZWJvb2tTd2l0Y2g7CisgIFVTSE9SVCAqcFJlb3JkZXJPZmZzZXQgPSBwSGNyLT5zZWN0aW9uSW5mby5wUmVvcmRlck9mZnNldDsKKyAgY29uc3QgVUNIQVIgKnBDYlByaW9yaXR5ID0gYUNiUHJpb3JpdHk7CisgIGNvbnN0IFVDSEFSICpwTWluT2ZDYlBhaXIgPSBhTWluT2ZDYlBhaXI7CisgIGNvbnN0IFVDSEFSICpwTWF4T2ZDYlBhaXIgPSBhTWF4T2ZDYlBhaXI7CisgIGNvbnN0IFVDSEFSICpwQ2JEaW1TaGlmdCA9IGFEaW1DYlNoaWZ0OwogCiAgIFVJTlQgc2VhcmNoU3RhcnQgPSAwOwogCi0gIC8qIGNhbGN1bGF0ZSAqcE51bVNvcnRlZFNlY3Rpb24gYW5kIHN0b3JlIHRoZSBwcmlvcml0aWVzIGluIGFycmF5IHBTb3J0ZWRDZGVib29rICovCisgIC8qIGNhbGN1bGF0ZSAqcE51bVNvcnRlZFNlY3Rpb24gYW5kIHN0b3JlIHRoZSBwcmlvcml0aWVzIGluIGFycmF5CisgICAqIHBTb3J0ZWRDZGVib29rICovCiAgIHBEZXN0ID0gcFNvcnRlZENvZGVib29rOwogICBudW1aZXJvU2VjdGlvbiA9IDA7Ci0gIGZvciAoIGk9bnVtU2VjdGlvbjsgaSAhPSAwOyBpLS0gKSB7Ci0gICAgaWYgKCBwQ2JQcmlvcml0eVsqcENvZGVib29rXSA9PSAwICkgeworICBmb3IgKGkgPSBudW1TZWN0aW9uOyBpICE9IDA7IGktLSkgeworICAgIGlmIChwQ2JQcmlvcml0eVsqcENvZGVib29rXSA9PSAwKSB7CiAgICAgICBudW1aZXJvU2VjdGlvbiArPSAxOwogICAgIH0KICAgICAqcERlc3QrKyA9IHBDYlByaW9yaXR5WypwQ29kZWJvb2srK107CiAgIH0KLSAgcEhjci0+c2VjdGlvbkluZm8ubnVtU29ydGVkU2VjdGlvbiA9IG51bVNlY3Rpb24gLSBudW1aZXJvU2VjdGlvbjsgICAgLyogbnVtU29ydGVkU2VjdGlvbiBjb250YWlucyBubyB6ZXJvIG9yIGludGVuc2l0eSBzZWN0aW9uICovCisgIHBIY3ItPnNlY3Rpb25JbmZvLm51bVNvcnRlZFNlY3Rpb24gPQorICAgICAgbnVtU2VjdGlvbiAtIG51bVplcm9TZWN0aW9uOyAvKiBudW1Tb3J0ZWRTZWN0aW9uIGNvbnRhaW5zIG5vIHplcm8gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW5zaXR5IHNlY3Rpb24gKi8KICAgcENvZGVib29rID0gcEhjci0+ZGVjSW5PdXQucENvZGVib29rOwogCiAgIC8qIHNvcnQgcHJpb3JpdGllcyBvZiB0aGUgY29kZWJvb2tzIGluIGFycmF5IHBTb3J0ZWRDZGVib29rW10gKi8KICAgbnVtU2VjdGlvbkRlYyA9IG51bVNlY3Rpb24gLSAxOwotICBpZiAoIG51bVNlY3Rpb25EZWMgPiAwICkgeworICBpZiAobnVtU2VjdGlvbkRlYyA+IDApIHsKICAgICBjb3VudGVyID0gbnVtU2VjdGlvbkRlYzsKLSAgICBmb3IgKCBqPW51bVNlY3Rpb25EZWM7IGogIT0gMDsgai0tICkgewotICAgICAgZm9yICggaT0wOyBpIDwgY291bnRlcjsgaSsrICkgeworICAgIGZvciAoaiA9IG51bVNlY3Rpb25EZWM7IGogIT0gMDsgai0tKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnRlcjsgaSsrKSB7CiAgICAgICAgIC8qIHN3YXAgcHJpb3JpdGllcyAqLwotICAgICAgICBpZiAoIHBTb3J0ZWRDb2RlYm9va1tpKzFdID4gcFNvcnRlZENvZGVib29rW2ldICkgewotICAgICAgICAgIHRlbXAgICAgICAgICAgICAgICAgID0gcFNvcnRlZENvZGVib29rW2ldOwotICAgICAgICAgIHBTb3J0ZWRDb2RlYm9va1tpXSAgID0gcFNvcnRlZENvZGVib29rW2krMV07Ci0gICAgICAgICAgcFNvcnRlZENvZGVib29rW2krMV0gPSB0ZW1wOworICAgICAgICBpZiAocFNvcnRlZENvZGVib29rW2kgKyAxXSA+IHBTb3J0ZWRDb2RlYm9va1tpXSkgeworICAgICAgICAgIHRlbXAgPSBwU29ydGVkQ29kZWJvb2tbaV07CisgICAgICAgICAgcFNvcnRlZENvZGVib29rW2ldID0gcFNvcnRlZENvZGVib29rW2kgKyAxXTsKKyAgICAgICAgICBwU29ydGVkQ29kZWJvb2tbaSArIDFdID0gdGVtcDsKICAgICAgICAgfQogICAgICAgfQogICAgICAgY291bnRlciAtPSAxOwpAQCAtNzk4LDI4ICs3NTMsMzMgQEAKICAgfQogCiAgIC8qIGNsZWFyIGNvZGVib29rU3dpdGNoIGFycmF5ICovCi0gIGZvciAoIGkgPSBudW1TZWN0aW9uOyBpICE9IDA7IGktLSkgeworICBmb3IgKGkgPSBudW1TZWN0aW9uOyBpICE9IDA7IGktLSkgewogICAgICpwQ29kZWJvb2tTd2l0Y2grKyA9IDA7CiAgIH0KICAgcENvZGVib29rU3dpdGNoID0gcEhjci0+c2VjdGlvbkluZm8ucENvZGVib29rU3dpdGNoOwogCi0gIC8qIHNvcnQgc2VjdGlvbkNvZGVib29rcyBhbmQgbnVtQ29kd29yZHNJblNlY3Rpb24gYW5kIGNhbGN1bGF0ZSBwUmVvcmRlck9mZnN0W2pdICovCi0gIGZvciAoIGogPSAwOyBqIDwgbnVtU2VjdGlvbjsgaisrICkgewotICAgIGZvciAoIGkgPSBzZWFyY2hTdGFydDsgaSA8IG51bVNlY3Rpb247IGkrKyApIHsKLSAgICAgIGlmICggcENvZGVib29rU3dpdGNoW2ldID09IDAgJiYgKCBwTWluT2ZDYlBhaXJbcFNvcnRlZENvZGVib29rW2pdXSA9PSBwQ29kZWJvb2tbaV0gIHx8ICBwTWF4T2ZDYlBhaXJbcFNvcnRlZENvZGVib29rW2pdXSA9PSBwQ29kZWJvb2tbaV0gKSkgeworICAvKiBzb3J0IHNlY3Rpb25Db2RlYm9va3MgYW5kIG51bUNvZHdvcmRzSW5TZWN0aW9uIGFuZCBjYWxjdWxhdGUKKyAgICogcFJlb3JkZXJPZmZzdFtqXSAqLworICBmb3IgKGogPSAwOyBqIDwgbnVtU2VjdGlvbjsgaisrKSB7CisgICAgZm9yIChpID0gc2VhcmNoU3RhcnQ7IGkgPCBudW1TZWN0aW9uOyBpKyspIHsKKyAgICAgIGlmIChwQ29kZWJvb2tTd2l0Y2hbaV0gPT0gMCAmJgorICAgICAgICAgIChwTWluT2ZDYlBhaXJbcFNvcnRlZENvZGVib29rW2pdXSA9PSBwQ29kZWJvb2tbaV0gfHwKKyAgICAgICAgICAgcE1heE9mQ2JQYWlyW3BTb3J0ZWRDb2RlYm9va1tqXV0gPT0gcENvZGVib29rW2ldKSkgewogICAgICAgICBwQ29kZWJvb2tTd2l0Y2hbaV0gPSAxOwotICAgICAgICBwU29ydGVkQ29kZWJvb2tbal0gPSBwQ29kZWJvb2tbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29ydCBjb2RlYm9vayAqLwotICAgICAgICBwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bal0gPSBwTnVtQ29kZXdvcmRJblNlY3Rpb25baV07ICAgICAgLyogc29ydCBOdW1Db2Rld29yZEluU2VjdGlvbiAqLworICAgICAgICBwU29ydGVkQ29kZWJvb2tbal0gPSBwQ29kZWJvb2tbaV07IC8qIHNvcnQgY29kZWJvb2sgKi8KKyAgICAgICAgcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW2pdID0KKyAgICAgICAgICAgIHBOdW1Db2Rld29yZEluU2VjdGlvbltpXTsgLyogc29ydCBOdW1Db2Rld29yZEluU2VjdGlvbiAqLwogCiAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gMDsKLSAgICAgICAgZm9yICggayA9IDA7IGsgPCBpOyBrKysgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1ha2UgZW50cnkgaW4gcFJlb3JkZXJPZmZzdCAqLworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaTsgaysrKSB7IC8qIG1ha2UgZW50cnkgaW4gcFJlb3JkZXJPZmZzdCAqLwogICAgICAgICAgIHN0YXJ0T2Zmc2V0ICs9IHBOdW1Db2Rld29yZEluU2VjdGlvbltrXSA8PCBwQ2JEaW1TaGlmdFtwQ29kZWJvb2tba11dOwogICAgICAgICB9Ci0gICAgICAgIHBSZW9yZGVyT2Zmc2V0W2pdID0gc3RhcnRPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgZm9yIHJlb3JkZXJpbmcgdGhlIGNvZGV3b3JkcyAqLworICAgICAgICBwUmVvcmRlck9mZnNldFtqXSA9CisgICAgICAgICAgICBzdGFydE9mZnNldDsgLyogb2Zmc2V0IGZvciByZW9yZGVyaW5nIHRoZSBjb2Rld29yZHMgKi8KIAotICAgICAgICBpZihpID09IHNlYXJjaFN0YXJ0KSB7Ci0gICAgICAgICAgVUlOVCBrID0gaTsKLSAgICAgICAgICB3aGlsZShwQ29kZWJvb2tTd2l0Y2hbaysrXSA9PSAxKSBzZWFyY2hTdGFydCsrOworICAgICAgICBpZiAoaSA9PSBzZWFyY2hTdGFydCkgeworICAgICAgICAgIGsgPSBpOworICAgICAgICAgIHdoaWxlIChwQ29kZWJvb2tTd2l0Y2hbaysrXSA9PSAxKSBzZWFyY2hTdGFydCsrOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgfQpAQCAtODI3LDQ1ICs3ODcsNDggQEAKICAgfQogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc2VnbWVudGF0aW9uLCB3aGljaCBpbmNsdWRlcyBudW1TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICBsZWZ0U3RhcnRPZlNlZ21lbnQsIHJpZ2h0U3RhcnRPZlNlZ21lbnQgYW5kIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBzZWdtZW50YXRpb24gY291bGQgYmUgdmlzdWFsaXplZCBhIGFzIGtpbmQgb2YgJ292ZXJsYXktZ3JpZCcgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0tYmxvY2sgaG9sZGluZyB0aGUgSENSLWVuY29kZWQgcXVhbnRpemVkLXNwZWN0cmFsLWNvZWZmaWNpZW50cy4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc2VnbWVudGF0aW9uLCB3aGljaCBpbmNsdWRlcworbnVtU2VnbWVudCwgbGVmdFN0YXJ0T2ZTZWdtZW50LCByaWdodFN0YXJ0T2ZTZWdtZW50IGFuZCByZW1haW5pbmdCaXRzSW5TZWdtZW50LgorICAgICAgICAgICAgICAgICAgICBUaGUgc2VnbWVudGF0aW9uIGNvdWxkIGJlIHZpc3VhbGl6ZWQgYSBhcyBraW5kIG9mCisnb3ZlcmxheS1ncmlkJyBmb3IgdGhlIGJpdHN0cmVhbS1ibG9jayBob2xkaW5nIHRoZSBIQ1ItZW5jb2RlZAorcXVhbnRpemVkLXNwZWN0cmFsLWNvZWZmaWNpZW50cy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi1zdGF0aWMgdm9pZCBIY3JQcmVwYXJlU2VnbWVudGF0aW9uR3JpZChIX0hDUl9JTkZPIHBIY3IpCi17Ci0gIFVTSE9SVCAgIGksajsKLSAgVVNIT1JUICAgbnVtU2VnbWVudCA9IDA7Ci0gIFVTSE9SVCAgIHNlZ21lbnRTdGFydCA9IDA7Ci0gIFVDSEFSICAgIHNlZ21lbnRXaWR0aDsKLSAgVUNIQVIgICAgbGFzdFNlZ21lbnRXaWR0aDsKLSAgVUNIQVIgICAgc29ydGVkQ29kZWJvb2s7Ci0gIFVDSEFSICAgIGVuZEZsYWcgPSAwOwotICBVU0hPUlQgICBpbnRlcm1lZGlhdGVSZXN1bHQ7CitzdGF0aWMgdm9pZCBIY3JQcmVwYXJlU2VnbWVudGF0aW9uR3JpZChIX0hDUl9JTkZPIHBIY3IpIHsKKyAgVVNIT1JUIGksIGo7CisgIFVTSE9SVCBudW1TZWdtZW50ID0gMDsKKyAgSU5UIHNlZ21lbnRTdGFydCA9IDA7CisgIFVDSEFSIHNlZ21lbnRXaWR0aDsKKyAgVUNIQVIgbGFzdFNlZ21lbnRXaWR0aDsKKyAgVUNIQVIgc29ydGVkQ29kZWJvb2s7CisgIFVDSEFSIGVuZEZsYWcgPSAwOworICBJTlQgaW50ZXJtZWRpYXRlUmVzdWx0OwogCi0gIFNDSEFSICAgIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkICAgICAgID0gICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZkxvbmdlc3RDb2Rld29yZDsKLSAgU0hPUlQgICAgbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPSAgIHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOwotICBVSU5UICAgICBudW1Tb3J0ZWRTZWN0aW9uICAgICAgICAgICAgICA9ICAgcEhjci0+c2VjdGlvbkluZm8ubnVtU29ydGVkU2VjdGlvbjsKLSAgVUNIQVIgICAqcFNvcnRlZENvZGVib29rICAgICAgICAgICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBTb3J0ZWRDb2RlYm9vazsKLSAgVVNIT1JUICAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKLSAgVVNIT1JUICAqcExlZnRTdGFydE9mU2VnbWVudCAgICAgICAgICAgPSAgIHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVTSE9SVCAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50ICAgICAgICAgID0gICBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKLSAgU0NIQVIgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgICAgICAgPSAgIHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVU0hPUlQgICBiaXRzdHJlYW1JbmRleCAgICAgICAgICAgICAgICA9ICAgcEhjci0+ZGVjSW5PdXQuYml0c3RyZWFtSW5kZXg7Ci0gIGNvbnN0IFVDSEFSICpwTWF4Q3dMZW5ndGggICAgICAgICAgICAgID0gICBwSGNyLT50YWJsZUluZm8ucE1heEN3TGVuZ3RoOworICBTQ0hBUiBsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCA9IHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkOworICBTSE9SVCBsZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9CisgICAgICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsKKyAgVUlOVCBudW1Tb3J0ZWRTZWN0aW9uID0gcEhjci0+c2VjdGlvbkluZm8ubnVtU29ydGVkU2VjdGlvbjsKKyAgVUNIQVIgKnBTb3J0ZWRDb2RlYm9vayA9IHBIY3ItPnNlY3Rpb25JbmZvLnBTb3J0ZWRDb2RlYm9vazsKKyAgVVNIT1JUICpwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb24gPQorICAgICAgcEhjci0+c2VjdGlvbkluZm8ucE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOworICBJTlQgKnBMZWZ0U3RhcnRPZlNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBJTlQgKnBSaWdodFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBjb25zdCBVQ0hBUiAqcE1heEN3TGVuZ3RoID0gYU1heEN3TGVuOwogCi0gIGZvciAoIGk9bnVtU29ydGVkU2VjdGlvbjsgaSAhPSAwOyBpLS0gKSB7CisgIGZvciAoaSA9IG51bVNvcnRlZFNlY3Rpb247IGkgIT0gMDsgaS0tKSB7CiAgICAgc29ydGVkQ29kZWJvb2sgPSAqcFNvcnRlZENvZGVib29rKys7Ci0gICAgc2VnbWVudFdpZHRoID0gRkRLbWluKHBNYXhDd0xlbmd0aFtzb3J0ZWRDb2RlYm9va10sbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQpOworICAgIHNlZ21lbnRXaWR0aCA9CisgICAgICAgIGZNaW4oKElOVClwTWF4Q3dMZW5ndGhbc29ydGVkQ29kZWJvb2tdLCAoSU5UKWxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkKTsKIAotICAgIGZvciAoIGogPSAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOyBqICE9IDAgOyBqLS0gKSB7CisgICAgZm9yIChqID0gKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsgaiAhPSAwOyBqLS0pIHsKICAgICAgIC8qIHdpZHRoIGFsbG93cyBhIG5ldyBzZWdtZW50ICovCi0gICAgICBpbnRlcm1lZGlhdGVSZXN1bHQgPSBiaXRzdHJlYW1JbmRleCArIHNlZ21lbnRTdGFydDsKLSAgICAgIGlmICggKHNlZ21lbnRTdGFydCArIHNlZ21lbnRXaWR0aCkgPD0gbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgKSB7Ci0gICAgICAgIC8qIHN0b3JlIHNlZ21lbnQgc3RhcnQsIHNlZ21lbnQgbGVuZ3RoIGFuZCBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiBzZWdtZW50cyAqLworICAgICAgaW50ZXJtZWRpYXRlUmVzdWx0ID0gc2VnbWVudFN0YXJ0OworICAgICAgaWYgKChzZWdtZW50U3RhcnQgKyBzZWdtZW50V2lkdGgpIDw9IGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhKSB7CisgICAgICAgIC8qIHN0b3JlIHNlZ21lbnQgc3RhcnQsIHNlZ21lbnQgbGVuZ3RoIGFuZCBpbmNyZW1lbnQgdGhlIG51bWJlciBvZgorICAgICAgICAgKiBzZWdtZW50cyAqLwogICAgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCsrID0gaW50ZXJtZWRpYXRlUmVzdWx0OwogICAgICAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQrKyA9IGludGVybWVkaWF0ZVJlc3VsdCArIHNlZ21lbnRXaWR0aCAtIDE7CiAgICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCsrID0gc2VnbWVudFdpZHRoOwpAQCAtODc4LDExICs4NDEsMTEgQEAKICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudC0tOwogICAgICAgICBwUmlnaHRTdGFydE9mU2VnbWVudC0tOwogICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudC0tOwotICAgICAgICBzZWdtZW50U3RhcnQgPSAqcExlZnRTdGFydE9mU2VnbWVudCAtIGJpdHN0cmVhbUluZGV4OworICAgICAgICBzZWdtZW50U3RhcnQgPSAqcExlZnRTdGFydE9mU2VnbWVudDsKIAogICAgICAgICBsYXN0U2VnbWVudFdpZHRoID0gbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgLSBzZWdtZW50U3RhcnQ7CiAgICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCA9IGxhc3RTZWdtZW50V2lkdGg7Ci0gICAgICAgICpwUmlnaHRTdGFydE9mU2VnbWVudCA9IGJpdHN0cmVhbUluZGV4ICsgc2VnbWVudFN0YXJ0ICsgbGFzdFNlZ21lbnRXaWR0aCAtIDE7CisgICAgICAgICpwUmlnaHRTdGFydE9mU2VnbWVudCA9IHNlZ21lbnRTdGFydCArIGxhc3RTZWdtZW50V2lkdGggLSAxOwogICAgICAgICBlbmRGbGFnID0gMTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC04OTMsNTIgKzg1Niw1MCBAQAogICAgIH0KICAgfQogICBwSGNyLT5zZWdtZW50SW5mby5udW1TZWdtZW50ID0gbnVtU2VnbWVudDsKLQogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gYWRhcHRzIHRoZSBzb3J0ZWQgc2VjdGlvbiBib3VuZGFyaWVzIHRvIHRoZSBib3VuZGFyaWVzIG9mCi0gICAgICAgICAgICAgICAgICAgIHNlZ21lbnRhdGlvbi4gSWYgdGhlIHNlY3Rpb24gbGVuZ3RocyBkb2VzIG5vdCBmaXQgY29tcGxldGVseSBpbnRvIHRoZQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNlZ21lbnQsIHRoZSBzZWN0aW9uIGlzIHNwaXR0ZWQgaW50byB0d28gc28gY2FsbGVkICdleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICBzZWN0aW9ucycuIFRoZSBleHRlbmRlZC1zZWN0aW9uLWluZm8gKHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW4KLSAgICAgICAgICAgICAgICAgICAgYW5kIHBFeHRlbmRlZFNvcnRlZENvZGVib29rKSBpcyB1cGRhdGVkIGluIHRoaXMgY2FzZS4KKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBhZGFwdHMgdGhlIHNvcnRlZCBzZWN0aW9uIGJvdW5kYXJpZXMgdG8gdGhlCitib3VuZGFyaWVzIG9mIHNlZ21lbnRhdGlvbi4gSWYgdGhlIHNlY3Rpb24gbGVuZ3RocyBkb2VzIG5vdCBmaXQgY29tcGxldGVseSBpbnRvCit0aGUgY3VycmVudCBzZWdtZW50LCB0aGUgc2VjdGlvbiBpcyBzcGl0dGVkIGludG8gdHdvIHNvIGNhbGxlZCAnZXh0ZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbnMnLiBUaGUgZXh0ZW5kZWQtc2VjdGlvbi1pbmZvCisocE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3RpbiBhbmQgcEV4dGVuZGVkU29ydGVkQ29kZWJvb2spIGlzIHVwZGF0ZWQgaW4KK3RoaXMgY2FzZS4KIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi1zdGF0aWMgdm9pZCBIY3JFeHRlbmRlZFNlY3Rpb25JbmZvKEhfSENSX0lORk8gcEhjcikKLXsKLSAgVUlOVCAgICBzcnRTZWNDbnQgPSAwOyAgICAgICAgIC8qIGNvdW50ZXIgZm9yIHNvcnRlZCBzZWN0aW9ucyAqLwotICBVSU5UICAgIHhTcnRTY0NudCA9IDA7ICAgICAgICAgLyogY291bnRlciBmb3IgZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb25zICovCi0gIFVJTlQgICAgcmVtYWluTnVtQ3dJblNvcnRTZWM7Ci0gIFVJTlQgICAgaW5TZWdtZW50UmVtYWluTnVtQ1c7CitzdGF0aWMgdm9pZCBIY3JFeHRlbmRlZFNlY3Rpb25JbmZvKEhfSENSX0lORk8gcEhjcikgeworICBVSU5UIHNydFNlY0NudCA9IDA7IC8qIGNvdW50ZXIgZm9yIHNvcnRlZCBzZWN0aW9ucyAqLworICBVSU5UIHhTcnRTY0NudCA9IDA7IC8qIGNvdW50ZXIgZm9yIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9ucyAqLworICBVSU5UIHJlbWFpbk51bUN3SW5Tb3J0U2VjOworICBVSU5UIGluU2VnbWVudFJlbWFpbk51bUNXOwogCi0gIFVJTlQgICAgbnVtU29ydGVkU2VjdGlvbiAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ubnVtU29ydGVkU2VjdGlvbjsKLSAgVUNIQVIgICpwU29ydGVkQ29kZWJvb2sgICAgICAgICAgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5wU29ydGVkQ29kZWJvb2s7Ci0gIFVTSE9SVCAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uID0gcEhjci0+c2VjdGlvbkluZm8ucE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOwotICBVQ0hBUiAgKnBFeHRlbmRlZFNvcnRlZENvQm8gICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBFeHRlbmRlZFNvcnRlZENvZGVib29rOwotICBVU0hPUlQgKnBOdW1FeHRTb3J0Q3dJblNlY3QgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOwotICBVSU5UICAgIG51bVNlZ21lbnQgICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLm51bVNlZ21lbnQ7Ci0jaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCi0gIFVDSEFSICAqcE1heExlbk9mQ2JJbkV4dFNydFNlYyAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucE1heExlbk9mQ2JJbkV4dFNydFNlYzsKLSAgU0NIQVIgICBsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCAgICAgPSBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZkxvbmdlc3RDb2Rld29yZDsKLSAgY29uc3QgVUNIQVIgICAqcE1heEN3TGVuZ3RoICAgICAgICAgPSBwSGNyLT50YWJsZUluZm8ucE1heEN3TGVuZ3RoOwotI2VuZGlmCisgIFVJTlQgbnVtU29ydGVkU2VjdGlvbiA9IHBIY3ItPnNlY3Rpb25JbmZvLm51bVNvcnRlZFNlY3Rpb247CisgIFVDSEFSICpwU29ydGVkQ29kZWJvb2sgPSBwSGNyLT5zZWN0aW9uSW5mby5wU29ydGVkQ29kZWJvb2s7CisgIFVTSE9SVCAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uID0KKyAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKKyAgVUNIQVIgKnBFeHRlbmRlZFNvcnRlZENvQm8gPSBwSGNyLT5zZWN0aW9uSW5mby5wRXh0ZW5kZWRTb3J0ZWRDb2RlYm9vazsKKyAgVVNIT1JUICpwTnVtRXh0U29ydEN3SW5TZWN0ID0KKyAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOworICBVSU5UIG51bVNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5udW1TZWdtZW50OworICBVQ0hBUiAqcE1heExlbk9mQ2JJbkV4dFNydFNlYyA9IHBIY3ItPnNlY3Rpb25JbmZvLnBNYXhMZW5PZkNiSW5FeHRTcnRTZWM7CisgIFNDSEFSIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkID0gcEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQ7CisgIGNvbnN0IFVDSEFSICpwTWF4Q3dMZW5ndGggPSBhTWF4Q3dMZW47CiAKICAgcmVtYWluTnVtQ3dJblNvcnRTZWMgPSBwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bc3J0U2VjQ250XTsKICAgaW5TZWdtZW50UmVtYWluTnVtQ1cgPSBudW1TZWdtZW50OwogCiAgIHdoaWxlIChzcnRTZWNDbnQgPCBudW1Tb3J0ZWRTZWN0aW9uKSB7CiAgICAgaWYgKGluU2VnbWVudFJlbWFpbk51bUNXIDwgcmVtYWluTnVtQ3dJblNvcnRTZWMpIHsKLQogICAgICAgcE51bUV4dFNvcnRDd0luU2VjdFt4U3J0U2NDbnRdID0gaW5TZWdtZW50UmVtYWluTnVtQ1c7CiAgICAgICBwRXh0ZW5kZWRTb3J0ZWRDb0JvW3hTcnRTY0NudF0gPSBwU29ydGVkQ29kZWJvb2tbc3J0U2VjQ250XTsKIAogICAgICAgcmVtYWluTnVtQ3dJblNvcnRTZWMgLT0gaW5TZWdtZW50UmVtYWluTnVtQ1c7CiAgICAgICBpblNlZ21lbnRSZW1haW5OdW1DVyA9IG51bVNlZ21lbnQ7Ci0gICAgICAvKiBkYXRhIG9mIGEgc29ydGVkIHNlY3Rpb24gd2FzIG5vdCBpbnRlZ3JhdGVkIGluIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9uICovCi0gICAgfQotICAgIGVsc2UgaWYgKGluU2VnbWVudFJlbWFpbk51bUNXID09IHJlbWFpbk51bUN3SW5Tb3J0U2VjKSB7CisgICAgICAvKiBkYXRhIG9mIGEgc29ydGVkIHNlY3Rpb24gd2FzIG5vdCBpbnRlZ3JhdGVkIGluIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9uCisgICAgICAgKi8KKyAgICB9IGVsc2UgaWYgKGluU2VnbWVudFJlbWFpbk51bUNXID09IHJlbWFpbk51bUN3SW5Tb3J0U2VjKSB7CiAgICAgICBwTnVtRXh0U29ydEN3SW5TZWN0W3hTcnRTY0NudF0gPSBpblNlZ21lbnRSZW1haW5OdW1DVzsKICAgICAgIHBFeHRlbmRlZFNvcnRlZENvQm9beFNydFNjQ250XSA9IHBTb3J0ZWRDb2RlYm9va1tzcnRTZWNDbnRdOwogCkBAIC05NDYsNzQgKzkwNyw2NiBAQAogICAgICAgcmVtYWluTnVtQ3dJblNvcnRTZWMgPSBwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bc3J0U2VjQ250XTsKICAgICAgIGluU2VnbWVudFJlbWFpbk51bUNXID0gbnVtU2VnbWVudDsKICAgICAgIC8qIGRhdGEgb2YgYSBzb3J0ZWQgc2VjdGlvbiB3YXMgaW50ZWdyYXRlZCBpbiBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbiAqLwotICAgIH0KLSAgICBlbHNlIHsgLyogaW5TZWdtZW50UmVtYWluTnVtQ1cgPiByZW1haW5OdW1Dd0luU29ydFNlYyAqLworICAgIH0gZWxzZSB7IC8qIGluU2VnbWVudFJlbWFpbk51bUNXID4gcmVtYWluTnVtQ3dJblNvcnRTZWMgKi8KICAgICAgIHBOdW1FeHRTb3J0Q3dJblNlY3RbeFNydFNjQ250XSA9IHJlbWFpbk51bUN3SW5Tb3J0U2VjOwogICAgICAgcEV4dGVuZGVkU29ydGVkQ29Cb1t4U3J0U2NDbnRdID0gcFNvcnRlZENvZGVib29rW3NydFNlY0NudF07CiAKLQogICAgICAgaW5TZWdtZW50UmVtYWluTnVtQ1cgLT0gcmVtYWluTnVtQ3dJblNvcnRTZWM7CiAgICAgICBzcnRTZWNDbnQrKzsKICAgICAgIHJlbWFpbk51bUN3SW5Tb3J0U2VjID0gcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW3NydFNlY0NudF07CiAgICAgICAvKiBkYXRhIG9mIGEgc29ydGVkIHNlY3Rpb24gd2FzIGludGVncmF0ZWQgaW4gZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb24gKi8KICAgICB9Ci0jaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCi0gICAgcE1heExlbk9mQ2JJbkV4dFNydFNlY1t4U3J0U2NDbnRdID0gRkRLbWluKHBNYXhDd0xlbmd0aFtwRXh0ZW5kZWRTb3J0ZWRDb0JvW3hTcnRTY0NudF1dLGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkKTsKLSNlbmRpZgotCi0KKyAgICBwTWF4TGVuT2ZDYkluRXh0U3J0U2VjW3hTcnRTY0NudF0gPQorICAgICAgICBmTWluKChJTlQpcE1heEN3TGVuZ3RoW3BFeHRlbmRlZFNvcnRlZENvQm9beFNydFNjQ250XV0sCisgICAgICAgICAgICAgKElOVClsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCk7CiAKICAgICB4U3J0U2NDbnQgKz0gMTsKIAotICAgIGlmICggeFNydFNjQ250ID49IChNQVhfU0ZCX0hDUiArIE1BWF9IQ1JfU0VUUykgKSB7CisgICAgaWYgKHhTcnRTY0NudCA+PSAoTUFYX1NGQl9IQ1IgKyBNQVhfSENSX1NFVFMpKSB7CiAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBFWFRFTkRFRF9TT1JURURfQ09VTlRFUl9PVkVSRkxPVzsKICAgICAgIHJldHVybjsKICAgICB9Ci0KICAgfQogICBwTnVtRXh0U29ydEN3SW5TZWN0W3hTcnRTY0NudF0gPSAwOwotCiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb25zIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgIGJlbG9uZyB0byB0aGUgc2V0cy4gRWFjaCBzZXQgZnJvbSBzZXQgMCAob25lIGFuZCBvbmx5IHNldCBmb3IgdGhlIFBDV3MpCi0gICAgICAgICAgICAgICAgICAgIHRpbGwgdG8gdGhlIGxhc3Qgc2V0IGdldHMgYSBlbnRyeSBpbiB0aGUgYXJyYXkgdG8gd2hpY2gKKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgZXh0ZW5kZWQgc29ydGVkCitzZWN0aW9ucyB3aGljaCBiZWxvbmcgdG8gdGhlIHNldHMuIEVhY2ggc2V0IGZyb20gc2V0IDAgKG9uZSBhbmQgb25seSBzZXQgZm9yIHRoZQorUENXcykgdGlsbCB0byB0aGUgbGFzdCBzZXQgZ2V0cyBhIGVudHJ5IGluIHRoZSBhcnJheSB0byB3aGljaAogICAgICAgICAgICAgICAgICAgICAncE51bUV4dGVuZGVkU29ydGVkU2VjdGluc0luU2V0cycgcG9pbnRzIHRvLgogCi0gICAgICAgICAgICAgICAgICAgIENhbGN1bGF0aW9uOiBUaGUgZW50cnlzIGluIHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW4gYXJlIGFkZGVkCi0gICAgICAgICAgICAgICAgICAgIHVudGlsbCB0aGUgdmFsdWUgbnVtU2VnbWVudCBpcyByZWFjaGVkLiBUaGVuIHRoZSBzdW1fdmFyaWFibGUgaXMgY2xlYXJlZAotICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIGNhbGN1bGF0aW9uIHN0YXJ0cyBmcm9tIHRoZSBiZWdpbm5pbmcuIEFzIG11Y2ggZXh0ZW5kZWQgc29ydGVkCi0gICAgICAgICAgICAgICAgICAgIFNlY3Rpb25zIGFyZSBzdW1tZWQgdXAgdG8gcmVhY2ggdGhlIHZhbHVlIG51bVNlZ21lbnQsIGFzIG11Y2ggaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZW50cnkgaW4gKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW4uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgRGVyaXZlTnVtYmVyT2ZFeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzKFVJTlQgICAgbnVtU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgKnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCkKLXsKLSAgVVNIT1JUICBjb3VudGVyID0gMDsKLSAgVUlOVCAgICBjd1N1bSAgID0gMDsKLSAgVVNIT1JUICpwTnVtRXhTb3J0Q3dJblNlYyAgID0gcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb247CisgICAgICAgICAgICAgICAgICAgIENhbGN1bGF0aW9uOiBUaGUgZW50cnlzIGluCitwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluIGFyZSBhZGRlZCB1bnRpbGwgdGhlIHZhbHVlIG51bVNlZ21lbnQgaXMKK3JlYWNoZWQuIFRoZW4gdGhlIHN1bV92YXJpYWJsZSBpcyBjbGVhcmVkIGFuZCB0aGUgY2FsY3VsYXRpb24gc3RhcnRzIGZyb20gdGhlCitiZWdpbm5pbmcuIEFzIG11Y2ggZXh0ZW5kZWQgc29ydGVkIFNlY3Rpb25zIGFyZSBzdW1tZWQgdXAgdG8gcmVhY2ggdGhlIHZhbHVlCitudW1TZWdtZW50LCBhcyBtdWNoIGlzIHRoZSBjdXJyZW50IGVudHJ5IGluICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgdm9pZCBEZXJpdmVOdW1iZXJPZkV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMoCisgICAgVUlOVCBudW1TZWdtZW50LCBVU0hPUlQgKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uLAorICAgIGludCBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4LAorICAgIFVTSE9SVCAqcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMsCisgICAgaW50IG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHgpIHsKKyAgVVNIT1JUIGNvdW50ZXIgPSAwOworICBVSU5UIGN3U3VtID0gMDsKKyAgVVNIT1JUICpwTnVtRXhTb3J0Q3dJblNlYyA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOwogICBVU0hPUlQgKnBOdW1FeFNvcnRTZWNJblNldHMgPSBwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0czsKIAotICB3aGlsZSAocE51bUV4U29ydEN3SW5TZWNbbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF0gIT0gMCkKLSAgeworICB3aGlsZSAocE51bUV4U29ydEN3SW5TZWNbbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF0gIT0gMCkgewogICAgIGN3U3VtICs9IHBOdW1FeFNvcnRDd0luU2VjW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdOwogICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHgrKzsKLSAgICBpZiAobnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA+PSAoTUFYX1NGQl9IQ1IrTUFYX0hDUl9TRVRTKSkgeworICAgIGlmIChudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID49IChNQVhfU0ZCX0hDUiArIE1BWF9IQ1JfU0VUUykpIHsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaWYgKGN3U3VtID4gbnVtU2VnbWVudCkgewogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBjb3VudGVyKys7Ci0gICAgaWYgKGNvdW50ZXIgPiAxMDI0LzQpIHsKKyAgICBpZiAoY291bnRlciA+IDEwMjQgLyA0KSB7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIGlmICggY3dTdW0gPT0gbnVtU2VnbWVudCApIHsKKyAgICBpZiAoY3dTdW0gPT0gbnVtU2VnbWVudCkgewogICAgICAgcE51bUV4U29ydFNlY0luU2V0c1tudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4XSA9IGNvdW50ZXI7CiAgICAgICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4Kys7CiAgICAgICBpZiAobnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCA+PSBNQVhfSENSX1NFVFMpIHsKQEAgLTEwMjMsOTkgKzk3NiwxMDkgQEAKICAgICAgIGN3U3VtID0gMDsKICAgICB9CiAgIH0KLSAgcE51bUV4U29ydFNlY0luU2V0c1tudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4XSA9IGNvdW50ZXI7ICAgLyogc2F2ZSBsYXN0IGVudHJ5IGZvciB0aGUgbGFzdCAtIHByb2JhYmx5IHNob3J0ZXIgLSBzZXQgKi8KKyAgcE51bUV4U29ydFNlY0luU2V0c1tudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4XSA9CisgICAgICBjb3VudGVyOyAvKiBzYXZlIGxhc3QgZW50cnkgZm9yIHRoZSBsYXN0IC0gcHJvYmFibHkgc2hvcnRlciAtIHNldCAqLwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyBhbGwgcHJpb3JpdHkgY29kZXdvcmRzIChQQ1dzKSBpbiBhIHNwZWN0cnVtICh3aXRoaW4KLSAgICAgICAgICAgICAgICAgICAgc2V0IDApLiBUaGUgY2FsY3VsYXRpb24gb2YgdGhlIFBDV3MgaXMgbWFuYWdlZCBpbiB0d28gbG9vcHMuIFRoZQotICAgICAgICAgICAgICAgICAgICBsb29wY291bnRlciBvZiB0aGUgb3V0ZXIgbG9vcCBpcyBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIHBvaW50ZXIKLSAgICAgICAgICAgICAgICAgICAgcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMgcG9pbnRzIHRvLiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlCi0gICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbnMgd2l0aGluIHNldCAwLgotICAgICAgICAgICAgICAgICAgICBUaGUgbG9vcGNvdW50ZXIgb2YgdGhlIGlubmVyIGxvb3AgaXMgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgIHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW4gcG9pbnRzIHRvLiBUaGUgdmFsdWUgcmVwcmVzZW50cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGV4dGVuZGVkIHNvcnRlZCBjb2Rld29yZHMgaW4gc2VjdGlvbnMgKHRoZSBvcmlnaW5hbCBzZWN0aW9ucyBoYXZlCi0gICAgICAgICAgICAgICAgICAgIGJlZW4gc3BsaXR0ZWQgdG8gZ28gYWxvbmcgd2l0aCB0aGUgYm9yZGVycyBvZiB0aGUgc2V0cykuCi0gICAgICAgICAgICAgICAgICAgIEVhY2ggdGltZSB0aGUgbnVtYmVyIG9mIHRoZSBleHRlbmRlZCBzb3J0ZWQgY29kZXdvcmRzIGluIHNlY3Rpb25zIGFyZSBkZS0KLSAgICAgICAgICAgICAgICAgICAgY29kZWQsIHRoZSBwb2ludGVyICdwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluJyBpcyBpbmNyZW1lbnRlZCBieQotICAgICAgICAgICAgICAgICAgICBvbmUuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgRGVjb2RlUENXcyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgSF9IQ1JfSU5GTyBwSGNyKQotewotICBVSU5UICAgICAgICAgaTsKLSAgVVNIT1JUICAgICAgIGV4dFNvcnRTZWM7Ci0gIFVTSE9SVCAgICAgICBjdXJFeHRTb3J0Q3dJblNlYzsKLSAgVUNIQVIgICAgICAgIGNvZGVib29rOwotICBVQ0hBUiAgICAgICAgZGltZW5zaW9uOwotICBjb25zdCBVSU5UICAqcEN1cnJlbnRUcmVlOworICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgYWxsIHByaW9yaXR5IGNvZGV3b3JkcyAoUENXcykgaW4gYQorc3BlY3RydW0gKHdpdGhpbiBzZXQgMCkuIFRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgUENXcyBpcyBtYW5hZ2VkIGluIHR3byBsb29wcy4KK1RoZSBsb29wY291bnRlciBvZiB0aGUgb3V0ZXIgbG9vcCBpcyBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMgcG9pbnRzIHRvLiBUaGlzIHZhbHVlCityZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb25zIHdpdGhpbiBzZXQgMC4gVGhlIGxvb3Bjb3VudGVyCitvZiB0aGUgaW5uZXIgbG9vcCBpcyBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3RpbiBwb2ludHMgdG8uIFRoZSB2YWx1ZQorcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGV4dGVuZGVkIHNvcnRlZCBjb2Rld29yZHMgaW4gc2VjdGlvbnMgKHRoZSBvcmlnaW5hbAorc2VjdGlvbnMgaGF2ZSBiZWVuIHNwbGl0dGVkIHRvIGdvIGFsb25nIHdpdGggdGhlIGJvcmRlcnMgb2YgdGhlIHNldHMpLiBFYWNoIHRpbWUKK3RoZSBudW1iZXIgb2YgdGhlIGV4dGVuZGVkIHNvcnRlZCBjb2Rld29yZHMgaW4gc2VjdGlvbnMgYXJlIGRlLSBjb2RlZCwgdGhlCitwb2ludGVyICdwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluJyBpcyBpbmNyZW1lbnRlZCBieSBvbmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyB2b2lkIERlY29kZVBDV3MoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIEhfSENSX0lORk8gcEhjcikgeworICBVSU5UIGk7CisgIFVTSE9SVCBleHRTb3J0U2VjOworICBVU0hPUlQgY3VyRXh0U29ydEN3SW5TZWM7CisgIFVDSEFSIGNvZGVib29rOworICBVQ0hBUiBkaW1lbnNpb247CisgIGNvbnN0IFVJTlQgKnBDdXJyZW50VHJlZTsKICAgY29uc3QgU0NIQVIgKnBRdWFudFZhbEJhc2U7CiAgIGNvbnN0IFNDSEFSICpwUXVhbnRWYWw7CiAKLSAgVVNIT1JUICAgICAgKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uID0gcEhjci0+c2VjdGlvbkluZm8ucE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb247Ci0gIGludCAgICAgICAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID0gcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKLSAgVUNIQVIgICAgICAgKnBFeHRlbmRlZFNvcnRlZENvZGVib29rICAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucEV4dGVuZGVkU29ydGVkQ29kZWJvb2s7Ci0gIGludCAgICAgICAgICBleHRlbmRlZFNvcnRlZENvZGVib29rSWR4ICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLmV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7Ci0gIFVTSE9SVCAgICAgICpwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cyAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzOwotICBpbnQgICAgICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCAgPSBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4OwotICBGSVhQX0RCTCAgICAqcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzICAgICAgPSBTUEVDX0xPTkcocEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSk7Ci0gIGludCAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCAgICA9IHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OwotICBVU0hPUlQgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OwotICBTQ0hBUiAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKLSNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKLSAgVUNIQVIgICAgICAgKnBNYXhMZW5PZkNiSW5FeHRTcnRTZWMgICAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucE1heExlbk9mQ2JJbkV4dFNydFNlYzsKLSAgaW50ICAgICAgICAgIG1heExlbk9mQ2JJbkV4dFNydFNlY0lkeCAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ubWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4OwotICBVQ0hBUiAgICAgICAgbWF4QWxsb3dlZEN3TGVuOwotICBpbnQgICAgICAgICAgbnVtRGVjb2RlZEJpdHM7Ci0jZW5kaWYKLSAgY29uc3QgVUNIQVIgKnBDYkRpbWVuc2lvbiA9ICBwSGNyLT50YWJsZUluZm8ucENiRGltZW5zaW9uOwotICBjb25zdCBVQ0hBUiAqcENiU2lnbiAgICAgID0gIHBIY3ItPnRhYmxlSW5mby5wQ2JTaWduOworICBVU0hPUlQgKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uID0KKyAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOworICBpbnQgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4OworICBVQ0hBUiAqcEV4dGVuZGVkU29ydGVkQ29kZWJvb2sgPSBwSGNyLT5zZWN0aW9uSW5mby5wRXh0ZW5kZWRTb3J0ZWRDb2RlYm9vazsKKyAgaW50IGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggPSBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4OworICBVU0hPUlQgKnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzID0KKyAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzOworICBpbnQgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4OworICBGSVhQX0RCTCAqcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzID0KKyAgICAgIFNQRUNfTE9ORyhwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlKTsKKyAgaW50IHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID0KKyAgICAgIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OworICBJTlQgKnBMZWZ0U3RhcnRPZlNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgVUNIQVIgKnBNYXhMZW5PZkNiSW5FeHRTcnRTZWMgPSBwSGNyLT5zZWN0aW9uSW5mby5wTWF4TGVuT2ZDYkluRXh0U3J0U2VjOworICBpbnQgbWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4ID0gcEhjci0+c2VjdGlvbkluZm8ubWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4OworICBVQ0hBUiBtYXhBbGxvd2VkQ3dMZW47CisgIGludCBudW1EZWNvZGVkQml0czsKKyAgY29uc3QgVUNIQVIgKnBDYkRpbWVuc2lvbiA9IGFEaW1DYjsKKyAgY29uc3QgVUNIQVIgKnBDYlNpZ24gPSBhU2lnbkNiOwogCiAgIC8qIGNsZWFyIHJlc3VsdCBhcnJheSAqLwotICAvL3BRU0MgPSAmcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XTsKLSAgLy9wUVNDID0gKnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50czsKLQotICBGREttZW1jbGVhcihwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMrcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgsMTAyNCpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzICsgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgsCisgICAgICAgICAgICAgIDEwMjQgKiBzaXplb2YoRklYUF9EQkwpKTsKIAogICAvKiBkZWNvZGUgYWxsIFBDV3MgaW4gdGhlIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9uKHMpIGJlbG9uZ2luZyB0byBzZXQgMCAqLwotICBmb3IgKCBleHRTb3J0U2VjID0gcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNbbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeF07IGV4dFNvcnRTZWMgIT0gMDsgZXh0U29ydFNlYy0tICkgewotCi0gICAgY29kZWJvb2sgICAgICAgID0gIHBFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdOyAgIC8qIGdldCBjb2RlYm9vayBmb3IgdGhpcyBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbiBhbmQgaW5jcmVtZW50IHB0ciB0byBjYiBvZiBuZXh0IGV4dC4gc29ydCBzZWMgKi8KKyAgZm9yIChleHRTb3J0U2VjID0KKyAgICAgICAgICAgcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNbbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeF07CisgICAgICAgZXh0U29ydFNlYyAhPSAwOyBleHRTb3J0U2VjLS0pIHsKKyAgICBjb2RlYm9vayA9CisgICAgICAgIHBFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdOyAvKiBnZXQgY29kZWJvb2sgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGV4dGVuZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWQgc2VjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGluY3JlbWVudCBwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNiIG9mIG5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dC4gc29ydCBzZWMgKi8KICAgICBleHRlbmRlZFNvcnRlZENvZGVib29rSWR4Kys7Ci0gICAgaWYgKGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggPj0gKE1BWF9TRkJfSENSK01BWF9IQ1JfU0VUUykpIHsKKyAgICBpZiAoZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCA+PSAoTUFYX1NGQl9IQ1IgKyBNQVhfSENSX1NFVFMpKSB7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRpbWVuc2lvbiAgICAgICA9ICBwQ2JEaW1lbnNpb25bY29kZWJvb2tdOyAgICAgICAgIC8qIGdldCBkaW1lbnNpb24gb2YgY29kZWJvb2sgb2YgdGhpcyBleHRlbmRlZCBzb3J0LiBzZWMuICovCi0gICAgcEN1cnJlbnRUcmVlICAgID0gIGFIdWZmVGFibGUgIFtjb2RlYm9va107ICAgICAgICAgLyogY29udmVydCBjb2RlYm9vayB0byBwb2ludGVyIHRvIFFTQ3MgKi8KLSAgICBwUXVhbnRWYWxCYXNlICAgPSAgYVF1YW50VGFibGUgW2NvZGVib29rXTsgICAgICAgICAvKiBjb252ZXJ0IGNvZGVib29rIHRvIGluZGV4IHRvIHRhYmxlIG9mIFFTQ3MgKi8KLSNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKKyAgICBkaW1lbnNpb24gPSBwQ2JEaW1lbnNpb25bY29kZWJvb2tdOyAvKiBnZXQgZGltZW5zaW9uIG9mIGNvZGVib29rIG9mIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCBzb3J0LiBzZWMuICovCisgICAgcEN1cnJlbnRUcmVlID0KKyAgICAgICAgYUh1ZmZUYWJsZVtjb2RlYm9va107IC8qIGNvbnZlcnQgY29kZWJvb2sgdG8gcG9pbnRlciB0byBRU0NzICovCisgICAgcFF1YW50VmFsQmFzZSA9CisgICAgICAgIGFRdWFudFRhYmxlW2NvZGVib29rXTsgLyogY29udmVydCBjb2RlYm9vayB0byBpbmRleCB0byB0YWJsZSBvZiBRU0NzICovCiAgICAgbWF4QWxsb3dlZEN3TGVuID0gcE1heExlbk9mQ2JJbkV4dFNydFNlY1ttYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHhdOwogICAgIG1heExlbk9mQ2JJbkV4dFNydFNlY0lkeCsrOwotICAgIGlmIChtYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHggPj0gKE1BWF9TRkJfSENSK01BWF9IQ1JfU0VUUykpIHsKKyAgICBpZiAobWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4ID49IChNQVhfU0ZCX0hDUiArIE1BWF9IQ1JfU0VUUykpIHsKICAgICAgIHJldHVybjsKICAgICB9Ci0jZW5kaWYKIAogICAgIC8qIHN3aXRjaCBmb3IgZGVjb2Rpbmcgd2l0aCBkaWZmZXJlbnQgY29kZWJvb2tzOiAqLwotICAgIGlmICggcENiU2lnbltjb2RlYm9va10gPT0gMCApIHsgICAgICAgICAgICAgICAgICAgIC8qIG5vIHNpZ24gYml0cyBmb2xsb3cgYWZ0ZXIgdGhlIGNvZGV3b3JkLWJvZHkgKi8KKyAgICBpZiAocENiU2lnbltjb2RlYm9va10gPT0KKyAgICAgICAgMCkgeyAvKiBubyBzaWduIGJpdHMgZm9sbG93IGFmdGVyIHRoZSBjb2Rld29yZC1ib2R5ICovCiAgICAgICAvKiBQQ1dfQm9keU9OTFkgKi8KICAgICAgIC8qPT09PT09PT09PT09PT0qLwogCi0gICAgICBmb3IgKCBjdXJFeHRTb3J0Q3dJblNlYyA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdIDsgY3VyRXh0U29ydEN3SW5TZWMgIT0gMDsgY3VyRXh0U29ydEN3SW5TZWMtLSkgeworICAgICAgZm9yIChjdXJFeHRTb3J0Q3dJblNlYyA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uCisgICAgICAgICAgICAgICBbbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF07CisgICAgICAgICAgIGN1ckV4dFNvcnRDd0luU2VjICE9IDA7IGN1ckV4dFNvcnRDd0luU2VjLS0pIHsKICAgICAgICAgbnVtRGVjb2RlZEJpdHMgPSAwOwogCiAgICAgICAgIC8qIGRlY29kZSBQQ1dfQk9EWSAqLwotICAgICAgICBwUXVhbnRWYWwgPSBEZWNvZGVQQ1dfQm9keShicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRUcmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRWYWxCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBwUXVhbnRWYWwgPSBEZWNvZGVQQ1dfQm9keSgKKyAgICAgICAgICAgIGJzLCBwSGNyLT5kZWNJbk91dC5iaXRzdHJlYW1BbmNob3IsIHBDdXJyZW50VHJlZSwgcFF1YW50VmFsQmFzZSwKKyAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LCAmbnVtRGVjb2RlZEJpdHMpOwogCiAgICAgICAgIC8qIHJlc3VsdCBpcyB3cml0dGVuIG91dCBoZXJlIGJlY2F1c2UgTk8gc2lnbiBiaXRzIGZvbGxvdyB0aGUgYm9keSAqLwotICAgICAgICBmb3IoIGk9ZGltZW5zaW9uOyBpICE9IDAgOyBpLS0gKSB7Ci0gICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSA9IChGSVhQX0RCTCkgKnBRdWFudFZhbCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBxdWFudC4gc3BlYy4gY29lZi4gaW50byBzcGVjdHJ1bTsgc2lnbiBpcyBhbHJlYWR5IHZhbGlkICovCisgICAgICAgIGZvciAoaSA9IGRpbWVuc2lvbjsgaSAhPSAwOyBpLS0pIHsKKyAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdID0KKyAgICAgICAgICAgICAgKEZJWFBfREJMKSpwUXVhbnRWYWwrKzsgLyogd3JpdGUgcXVhbnQuIHNwZWMuIGNvZWYuIGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY3RydW07IHNpZ24gaXMgYWxyZWFkeSB2YWxpZCAqLwogICAgICAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4Kys7CiAgICAgICAgICAgaWYgKHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID49IDEwMjQpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTExMjQsOTQgKzEwODcsODMgQEAKIAogICAgICAgICAvKiBvbmUgbW9yZSBQQ1cgc2hvdWxkIGJlIGRlY29kZWQgKi8KIAotI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUwotICAgICAgICBpZiAoIG1heEFsbG93ZWRDd0xlbiA8IChudW1EZWNvZGVkQml0cyArIEVSUk9SX1BDV19CT0RZX09OTFlfVE9PX0xPTkcpICkgeworICAgICAgICBpZiAobWF4QWxsb3dlZEN3TGVuIDwgKG51bURlY29kZWRCaXRzICsgRVJST1JfUENXX0JPRFlfT05MWV9UT09fTE9ORykpIHsKICAgICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBUT09fTUFOWV9QQ1dfQk9EWV9CSVRTX0RFQ09ERUQ7CiAgICAgICAgIH0KLSNlbmRpZgogCi0jaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0lNTUVESUFURUxZCi0gICAgICAgIGlmICgxID09IGVyckRldGVjdFBjd1NlZ21lbnRhdGlvbigqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQtRVJST1JfUENXX0JPRFkscEhjcixQQ1dfQk9EWSxwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMrcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgtZGltZW5zaW9uLGRpbWVuc2lvbikpIHsKKyAgICAgICAgaWYgKDEgPT0gZXJyRGV0ZWN0UGN3U2VnbWVudGF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50IC0gRVJST1JfUENXX0JPRFksIHBIY3IsIFBDV19CT0RZLAorICAgICAgICAgICAgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCAtIGRpbWVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbikpIHsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHBvaW50ZXIgZm9yIGRlY29kaW5nIHRoZSBuZXh0IFBDVyAqLwotICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHBvaW50ZXIgZm9yIGRlY29kaW5nIHRoZSBuZXh0IFBDVyAqLworICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50Kys7IC8qIHVwZGF0ZSBwb2ludGVyIGZvciBkZWNvZGluZyB0aGUgbmV4dCBQQ1cgKi8KKyAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQrKzsgLyogdXBkYXRlIHBvaW50ZXIgZm9yIGRlY29kaW5nIHRoZSBuZXh0IFBDVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoKCBwQ2JTaWduW2NvZGVib29rXSA9PSAxICkgJiYgKCBjb2RlYm9vayA8IDExICkpIHsgIC8qIHBvc3NpYmx5IHRoZXJlIGZvbGxvdyAxLDIsMyBvciA0IHNpZ24gYml0cyBhZnRlciB0aGUgY29kZXdvcmQtYm9keSAqLworICAgIH0gZWxzZSBpZiAoKGNvZGVib29rIDwgMTEpICYmIChwQ2JTaWduW2NvZGVib29rXSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSkgeyAvKiBwb3NzaWJseSB0aGVyZSBmb2xsb3cgMSwyLDMgb3IgNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduIGJpdHMgYWZ0ZXIgdGhlIGNvZGV3b3JkLWJvZHkgKi8KICAgICAgIC8qIFBDV19Cb2R5IGFuZCBQQ1dfU2lnbiAqLwogICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PSovCiAKLSAgICAgIGZvciAoIGN1ckV4dFNvcnRDd0luU2VjID0gcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF0gOyBjdXJFeHRTb3J0Q3dJblNlYyAhPSAwOyBjdXJFeHRTb3J0Q3dJblNlYy0tKQotICAgICAgeworICAgICAgZm9yIChjdXJFeHRTb3J0Q3dJblNlYyA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uCisgICAgICAgICAgICAgICBbbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF07CisgICAgICAgICAgIGN1ckV4dFNvcnRDd0luU2VjICE9IDA7IGN1ckV4dFNvcnRDd0luU2VjLS0pIHsKICAgICAgICAgaW50IGVycjsKLSAgICAgICAgbnVtRGVjb2RlZEJpdHMgID0gMDsKKyAgICAgICAgbnVtRGVjb2RlZEJpdHMgPSAwOwogCi0gICAgICAgIHBRdWFudFZhbCA9IERlY29kZVBDV19Cb2R5KGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudFZhbEJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1EZWNvZGVkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHBRdWFudFZhbCA9IERlY29kZVBDV19Cb2R5KAorICAgICAgICAgICAgYnMsIHBIY3ItPmRlY0luT3V0LmJpdHN0cmVhbUFuY2hvciwgcEN1cnJlbnRUcmVlLCBwUXVhbnRWYWxCYXNlLAorICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsICZudW1EZWNvZGVkQml0cyk7CiAKLSAgICAgICAgZXJyID0gRGVjb2RlUENXX1NpZ24oIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50VmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1EZWNvZGVkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBlcnIgPSBEZWNvZGVQQ1dfU2lnbigKKyAgICAgICAgICAgIGJzLCBwSGNyLT5kZWNJbk91dC5iaXRzdHJlYW1BbmNob3IsIGRpbWVuc2lvbiwgcFF1YW50VmFsLAorICAgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzLCAmcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgsCisgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCBwUmVtYWluaW5nQml0c0luU2VnbWVudCwgJm51bURlY29kZWRCaXRzKTsKICAgICAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIC8qIG9uZSBtb3JlIFBDVyBzaG91bGQgYmUgZGVjb2RlZCAqLwogCi0jaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCi0gICAgICAgIGlmICggbWF4QWxsb3dlZEN3TGVuIDwgKG51bURlY29kZWRCaXRzICsgRVJST1JfUENXX0JPRFlfU0lHTl9UT09fTE9ORykgKSB7CisgICAgICAgIGlmIChtYXhBbGxvd2VkQ3dMZW4gPCAobnVtRGVjb2RlZEJpdHMgKyBFUlJPUl9QQ1dfQk9EWV9TSUdOX1RPT19MT05HKSkgewogICAgICAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFRPT19NQU5ZX1BDV19CT0RZX1NJR05fQklUU19ERUNPREVEOwogICAgICAgICB9Ci0jZW5kaWYKIAotI2lmIENIRUNLX1NFR01FTlRBVElPTl9JTU1FRElBVEVMWQotICAgICAgICBpZiAoMSA9PSBlcnJEZXRlY3RQY3dTZWdtZW50YXRpb24oKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LUVSUk9SX1BDV19CT0RZX1NJR04scEhjcixQQ1dfQk9EWV9TSUdOLCBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMrcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgtZGltZW5zaW9uLGRpbWVuc2lvbikpIHsKKyAgICAgICAgaWYgKDEgPT0gZXJyRGV0ZWN0UGN3U2VnbWVudGF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50IC0gRVJST1JfUENXX0JPRFlfU0lHTiwgcEhjciwKKyAgICAgICAgICAgICAgICAgICAgIFBDV19CT0RZX1NJR04sCisgICAgICAgICAgICAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMgKworICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4IC0gZGltZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uKSkgewogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQrKzsKICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQrKzsKICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoKCBwQ2JTaWduW2NvZGVib29rXSA9PSAxICkgJiYgKCBjb2RlYm9vayA+PSAxMSApKSB7IC8qIHBvc3NpYmx5IHRoZXJlIGZvbGxvdyBzb21lIHNpZ24gYml0cyBhbmQgbWF5YmUgb25lIG9yIHR3byBlc2NhcGUgc2VxdWVuY2VzIGFmdGVyIHRoZSBjdy1ib2R5ICovCisgICAgfSBlbHNlIGlmICgocENiU2lnbltjb2RlYm9va10gPT0gMSkgJiYKKyAgICAgICAgICAgICAgIChjb2RlYm9vayA+PSAxMSkpIHsgLyogcG9zc2libHkgdGhlcmUgZm9sbG93IHNvbWUgc2lnbiBiaXRzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZSBvbmUgb3IgdHdvIGVzY2FwZSBzZXF1ZW5jZXMgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN3LWJvZHkgKi8KICAgICAgIC8qIFBDV19Cb2R5LCBQQ1dfU2lnbiBhbmQgbWF5YmUgUENXX0VzY2FwZSAqLwogICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLSAgICAgIGZvciAoIGN1ckV4dFNvcnRDd0luU2VjID0gcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF0gOyBjdXJFeHRTb3J0Q3dJblNlYyAhPSAwOyBjdXJFeHRTb3J0Q3dJblNlYy0tKQotICAgICAgeworICAgICAgZm9yIChjdXJFeHRTb3J0Q3dJblNlYyA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uCisgICAgICAgICAgICAgICBbbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF07CisgICAgICAgICAgIGN1ckV4dFNvcnRDd0luU2VjICE9IDA7IGN1ckV4dFNvcnRDd0luU2VjLS0pIHsKICAgICAgICAgaW50IGVycjsKLSAgICAgICAgbnVtRGVjb2RlZEJpdHMgID0gMDsKKyAgICAgICAgbnVtRGVjb2RlZEJpdHMgPSAwOwogCiAgICAgICAgIC8qIGRlY29kZSBQQ1dfQk9EWSAqLwotICAgICAgICBwUXVhbnRWYWwgPSBEZWNvZGVQQ1dfQm9keShicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRUcmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRWYWxCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBwUXVhbnRWYWwgPSBEZWNvZGVQQ1dfQm9keSgKKyAgICAgICAgICAgIGJzLCBwSGNyLT5kZWNJbk91dC5iaXRzdHJlYW1BbmNob3IsIHBDdXJyZW50VHJlZSwgcFF1YW50VmFsQmFzZSwKKyAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LCAmbnVtRGVjb2RlZEJpdHMpOwogCi0gICAgICAgIGVyciA9IERlY29kZVBDV19TaWduKCBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgZXJyID0gRGVjb2RlUENXX1NpZ24oCisgICAgICAgICAgICBicywgcEhjci0+ZGVjSW5PdXQuYml0c3RyZWFtQW5jaG9yLCBkaW1lbnNpb24sIHBRdWFudFZhbCwKKyAgICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cywgJnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4LAorICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsICZudW1EZWNvZGVkQml0cyk7CiAgICAgICAgIGlmIChlcnIgIT0gMCkgewogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTIxOSwyNiArMTE3MSwzMiBAQAogICAgICAgICAvKiBkZWNvZGUgUENXX0VTQ0FQRSBpZiBwcmVzZW50ICovCiAgICAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4IC09IERJTUVOU0lPTl9PRl9FU0NBUEVfQ09ERUJPT0s7CiAKLSAgICAgICAgaWYgKCBmaXhwX2FicyhwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdKSA9PSAoRklYUF9EQkwpRVNDQVBFX1ZBTFVFICkgewotICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0gPSAoRklYUF9EQkwpIERlY29kZUVzY2FwZVNlcXVlbmNlKCBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1EZWNvZGVkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGlmIChmaXhwX2FicyhwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICBbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdKSA9PQorICAgICAgICAgICAgKEZJWFBfREJMKUVTQ0FQRV9WQUxVRSkgeworICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0gPQorICAgICAgICAgICAgICAoRklYUF9EQkwpRGVjb2RlRXNjYXBlU2VxdWVuY2UoCisgICAgICAgICAgICAgICAgICBicywgcEhjci0+ZGVjSW5PdXQuYml0c3RyZWFtQW5jaG9yLAorICAgICAgICAgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICAgICAgW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSwKKyAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgJm51bURlY29kZWRCaXRzKTsKICAgICAgICAgfQogICAgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCsrOwogICAgICAgICBpZiAocXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggPj0gMTAyNCkgewogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmICggZml4cF9hYnMocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSkgPT0gKEZJWFBfREJMKUVTQ0FQRV9WQUxVRSApIHsKLSAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdID0gKEZJWFBfREJMKSBEZWNvZGVFc2NhcGVTZXF1ZW5jZSggYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBpZiAoZml4cF9hYnMocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSkgPT0KKyAgICAgICAgICAgIChGSVhQX0RCTClFU0NBUEVfVkFMVUUpIHsKKyAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdID0KKyAgICAgICAgICAgICAgKEZJWFBfREJMKURlY29kZUVzY2FwZVNlcXVlbmNlKAorICAgICAgICAgICAgICAgICAgYnMsIHBIY3ItPmRlY0luT3V0LmJpdHN0cmVhbUFuY2hvciwKKyAgICAgICAgICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAgICAgIFtxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0sCisgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICZudW1EZWNvZGVkQml0cyk7CiAgICAgICAgIH0KICAgICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgrKzsKICAgICAgICAgaWYgKHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID49IDEwMjQpIHsKQEAgLTEyNDcsMTcgKzEyMDUsMjAgQEAKIAogICAgICAgICAvKiBvbmUgbW9yZSBQQ1cgc2hvdWxkIGJlIGRlY29kZWQgKi8KIAotI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUwotICAgICAgICBpZiAoIG1heEFsbG93ZWRDd0xlbiA8IChudW1EZWNvZGVkQml0cyArIEVSUk9SX1BDV19CT0RZX1NJR05fRVNDX1RPT19MT05HKSApIHsKKyAgICAgICAgaWYgKG1heEFsbG93ZWRDd0xlbiA8CisgICAgICAgICAgICAobnVtRGVjb2RlZEJpdHMgKyBFUlJPUl9QQ1dfQk9EWV9TSUdOX0VTQ19UT09fTE9ORykpIHsKICAgICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBUT09fTUFOWV9QQ1dfQk9EWV9TSUdOX0VTQ19CSVRTX0RFQ09ERUQ7CiAgICAgICAgIH0KLSNlbmRpZgogCi0jaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0lNTUVESUFURUxZCi0gICAgICAgIGlmICgxID09IGVyckRldGVjdFBjd1NlZ21lbnRhdGlvbigqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQtRVJST1JfUENXX0JPRFlfU0lHTl9FU0MscEhjcixQQ1dfQk9EWV9TSUdOX0VTQyxwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMrcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgtRElNRU5TSU9OX09GX0VTQ0FQRV9DT0RFQk9PSyxESU1FTlNJT05fT0ZfRVNDQVBFX0NPREVCT09LKSkgeworICAgICAgICBpZiAoMSA9PSBlcnJEZXRlY3RQY3dTZWdtZW50YXRpb24oCisgICAgICAgICAgICAgICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgLSBFUlJPUl9QQ1dfQk9EWV9TSUdOX0VTQywgcEhjciwKKyAgICAgICAgICAgICAgICAgICAgIFBDV19CT0RZX1NJR05fRVNDLAorICAgICAgICAgICAgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgRElNRU5TSU9OX09GX0VTQ0FQRV9DT0RFQk9PSywKKyAgICAgICAgICAgICAgICAgICAgIERJTUVOU0lPTl9PRl9FU0NBUEVfQ09ERUJPT0spKSB7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCsrOwogICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCsrOwogICAgICAgfQpAQCAtMTI2NSw3ICsxMjI2LDcgQEAKIAogICAgIC8qIGFsbCBQQ1dzIGJlbG9uZ2luZyB0byB0aGlzIGV4dGVuZGVkIHNlY3Rpb24gc2hvdWxkIGJlIGRlY29kZWQgKi8KICAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4Kys7Ci0gICAgaWYgKG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPj0gTUFYX1NGQl9IQ1IrTUFYX0hDUl9TRVRTKSB7CisgICAgaWYgKG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPj0gTUFYX1NGQl9IQ1IgKyBNQVhfSENSX1NFVFMpIHsKICAgICAgIHJldHVybjsKICAgICB9CiAgIH0KQEAgLTEyNzcsNjYgKzEyMzgsNjUgQEAKICAgfQogCiAgIC8qIFdyaXRlIGJhY2sgaW5kZXhlcyBpbnRvIHN0cnVjdHVyZSAqLwotICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID0gbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKKyAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA9CisgICAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4OwogICBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4ID0gZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeDsKLSAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCA9IG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHg7Ci0gIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID0gcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7CisgIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggPQorICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKKyAgcEhjci0+ZGVjSW5PdXQucXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggPQorICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7CiAgIHBIY3ItPnNlY3Rpb25JbmZvLm1heExlbk9mQ2JJbkV4dFNydFNlY0lkeCA9IG1heExlbk9mQ2JJbkV4dFNydFNlY0lkeDsKIH0KIAotI2lmIENIRUNLX1NFR01FTlRBVElPTl9JTU1FRElBVEVMWQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlcnkgZGVjb2RlZCBQQ1csIHdoZXRoZXIgb3V0IG9mCi0gICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IHNlZ21lbnQgdG9vIG1hbnkgYml0cyBoYXZlIGJlZW4gcmVhZCBvciBub3QuIElmIGFuIGVycm9yIG9jY3VycnMsCi0gICAgICAgICAgICAgICAgICAgIHByb2JhYmx5IHRoZSBzaWRlaW5mbyBvciB0aGUgSENSLWJpdHN0cmVhbSBibG9jayBob2xkaW5nIHRoZSBodWZmbWFuCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZWQgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyBpcyBkaXN0b3J0ZWQuIEluIHRoaXMgY2FzZSB0aGUgdHdvCi0gICAgICAgICAgICAgICAgICAgIG9yIGZvdXIgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyBiZWxvbmdpbmcgdG8gdGhlIGN1cnJlbnQgY29kZXdvcmQKKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlcnkgZGVjb2RlZCBQQ1csCit3aGV0aGVyIG91dCBvZiB0aGUgY3VycmVudCBzZWdtZW50IHRvbyBtYW55IGJpdHMgaGF2ZSBiZWVuIHJlYWQgb3Igbm90LiBJZiBhbgorZXJyb3Igb2NjdXJycywgcHJvYmFibHkgdGhlIHNpZGVpbmZvIG9yIHRoZSBIQ1ItYml0c3RyZWFtIGJsb2NrIGhvbGRpbmcgdGhlCitodWZmbWFuIGVuY29kZWQgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyBpcyBkaXN0b3J0ZWQuIEluIHRoaXMgY2FzZSB0aGUKK3R3byBvciBmb3VyIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNvZGV3b3JkCiAgICAgICAgICAgICAgICAgICAgIGFyZSBtYXJrZWQgKGZvciBiZWluZyBkZXRlY3RlZCBieSBjb25jZWFsbWVudCBsYXRlcikuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIFVDSEFSIGVyckRldGVjdFBjd1NlZ21lbnRhdGlvbihTQ0hBUiAgICAgICByZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIX0hDUl9JTkZPICBwSGNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ1dfVFlQRSAgICBraW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpxc2NfYmFzZV9vZl9jdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgZGltZW5zaW9uKQoteworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgVUNIQVIgZXJyRGV0ZWN0UGN3U2VnbWVudGF0aW9uKFNDSEFSIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhfSENSX0lORk8gcEhjciwgUENXX1RZUEUga2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnFzY19iYXNlX29mX2N3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBkaW1lbnNpb24pIHsKICAgU0NIQVIgaTsKLSAgaWYgKCByZW1haW5pbmdCaXRzSW5TZWdtZW50IDwgMCApIHsKKyAgaWYgKHJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPCAwKSB7CiAgICAgLyogbG9nIHRoZSBlcnJvciAqLwogICAgIHN3aXRjaCAoa2luZCkgewotICAgIGNhc2UgUENXX0JPRFk6CisgICAgICBjYXNlIFBDV19CT0RZOgogICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWTsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQQ1dfQk9EWV9TSUdOOgorICAgICAgY2FzZSBQQ1dfQk9EWV9TSUdOOgogICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWV9TSUdOOwogICAgICAgICBicmVhazsKLSAgICBjYXNlIFBDV19CT0RZX1NJR05fRVNDOgorICAgICAgY2FzZSBQQ1dfQk9EWV9TSUdOX0VTQzoKICAgICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gU0VHTUVOVF9PVkVSUklERV9FUlJfUENXX0JPRFlfU0lHTl9FU0M7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICAvKiBtYXJrIHRoZSBlcnJlZCBsaW5lcyAqLwotICAgIGZvciAoIGkgPSBkaW1lbnNpb247IGkgIT0gMDsgaS0tICkgewotICAgICAgKnFzY19iYXNlX29mX2N3KysgPSAoRklYUF9EQkwpIFFfVkFMVUVfSU5WQUxJRDsKKyAgICBmb3IgKGkgPSBkaW1lbnNpb247IGkgIT0gMDsgaS0tKSB7CisgICAgICAqcXNjX2Jhc2Vfb2ZfY3crKyA9IChGSVhQX0RCTClRX1ZBTFVFX0lOVkFMSUQ7CiAgICAgfQogICAgIHJldHVybiAxOwogICB9CiAgIHJldHVybiAwOwogfQotI2VuZGlmCiAKLSNpZiBDSEVDS19TRUdNRU5UQVRJT05fRklOQUwKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGFsbCBzZWdtZW50cyBhcmUgZW1wdHkgYWZ0ZXIgZGVjb2RpbmcuIFRoZXJlCi0gICAgICAgICAgICAgICAgICAgIGFyZSBfbm8gbGluZXMgbWFya2RlZF8gYXMgaW52YWxpZCBiZWNhdXNlIGl0IGNvdWxkIG5vdCBiZSB0cmFjZWQgYmFjawotICAgICAgICAgICAgICAgICAgICB3aGVyZSBmcm9tIHRoZSByZW1haW5pbmcgYml0cyBhcmUuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgZXJyRGV0ZWN0V2l0aGluU2VnbWVudGF0aW9uRmluYWwoSF9IQ1JfSU5GTyBwSGNyKQotewotICBVQ0hBUiAgIHNlZ21lbnRhdGlvbkVycm9yRmxhZyAgID0gMDsKLSAgVVNIT1JUICBpOwotICBTQ0hBUiAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0gIFVJTlQgICAgbnVtU2VnbWVudCAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5udW1TZWdtZW50OworICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBhbGwgc2VnbWVudHMgYXJlIGVtcHR5IGFmdGVyCitkZWNvZGluZy4gVGhlcmUgYXJlIF9ubyBsaW5lcyBtYXJrZGVkXyBhcyBpbnZhbGlkIGJlY2F1c2UgaXQgY291bGQgbm90IGJlIHRyYWNlZAorYmFjayB3aGVyZSBmcm9tIHRoZSByZW1haW5pbmcgYml0cyBhcmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyB2b2lkIGVyckRldGVjdFdpdGhpblNlZ21lbnRhdGlvbkZpbmFsKEhfSENSX0lORk8gcEhjcikgeworICBVQ0hBUiBzZWdtZW50YXRpb25FcnJvckZsYWcgPSAwOworICBVU0hPUlQgaTsKKyAgU0NIQVIgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIFVJTlQgbnVtU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLm51bVNlZ21lbnQ7CiAKLSAgZm9yICggaT1udW1TZWdtZW50OyBpICE9IDAgOyBpLS0pIHsKKyAgZm9yIChpID0gbnVtU2VnbWVudDsgaSAhPSAwOyBpLS0pIHsKICAgICBpZiAoKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50KysgIT0gMCkgewogICAgICAgc2VnbWVudGF0aW9uRXJyb3JGbGFnID0gMTsKICAgICB9CkBAIC0xMzQ1LDEyNSArMTMwNSwxMTQgQEAKICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBCSVRfSU5fU0VHTUVOVEFUSU9OX0VSUk9SOwogICB9CiB9Ci0jZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiB3YWxrcyBvbmUgc3RlcCB3aXRoaW4gdGhlIGRlY29kaW5nIHRyZWUuIFdoaWNoIGJyYW5jaCBpcwotICAgICAgICAgICAgICAgICAgICB0YWtlbiBkZXBlbmRzIG9uIHRoZSBkZWNvZGVkIGNhcnJ5Qml0IGlucHV0IHBhcmFtZXRlci4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoVUNIQVIgIGNhcnJ5Qml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICB0cmVlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAqYnJhbmNoVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgKmJyYW5jaE5vZGUpCi17CisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gd2Fsa3Mgb25lIHN0ZXAgd2l0aGluIHRoZSBkZWNvZGluZyB0cmVlLiBXaGljaAorYnJhbmNoIGlzIHRha2VuIGRlcGVuZHMgb24gdGhlIGRlY29kZWQgY2FycnlCaXQgaW5wdXQgcGFyYW1ldGVyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCit2b2lkIENhcnJ5Qml0VG9CcmFuY2hWYWx1ZShVQ0hBUiBjYXJyeUJpdCwgVUlOVCB0cmVlTm9kZSwgVUlOVCAqYnJhbmNoVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpicmFuY2hOb2RlKSB7CiAgIGlmIChjYXJyeUJpdCA9PSAwKSB7Ci0gICAgKmJyYW5jaE5vZGUgPSAodHJlZU5vZGUgJiBNQVNLX0xFRlQpID4+IExFRlRfT0ZGU0VUOyAvKiBNQVNLX0xFRlQ6ICAwMEZGRjAwMCAqLwotICB9Ci0gIGVsc2UgewotICAgICpicmFuY2hOb2RlID0gdHJlZU5vZGUgJiBNQVNLX1JJR0hUOyAgICAgICAgICAgICAgICAgLyogTUFTS19SSUdIVDogMDAwMDBGRkYgKi8KKyAgICAqYnJhbmNoTm9kZSA9CisgICAgICAgICh0cmVlTm9kZSAmIE1BU0tfTEVGVCkgPj4gTEVGVF9PRkZTRVQ7IC8qIE1BU0tfTEVGVDogIDAwRkZGMDAwICovCisgIH0gZWxzZSB7CisgICAgKmJyYW5jaE5vZGUgPSB0cmVlTm9kZSAmIE1BU0tfUklHSFQ7IC8qIE1BU0tfUklHSFQ6IDAwMDAwRkZGICovCiAgIH0KIAotICAqYnJhbmNoVmFsdWUgPSAqYnJhbmNoTm9kZSAmIENMUl9CSVRfMTA7ICAgICAgICAgICAgICAgLyogY2xlYXIgYml0IDEwIChpZiBzZXQpICovCisgICpicmFuY2hWYWx1ZSA9ICpicmFuY2hOb2RlICYgQ0xSX0JJVF8xMDsgLyogY2xlYXIgYml0IDEwIChpZiBzZXQpICovCiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgZGVzY3JpcHRpb246ICAgRGVjb2RlcyB0aGUgYm9keSBvZiBhIHByaW9yaXR5IGNvZGV3b3JkIChQQ1cpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICByZXR1cm46ICAgLSByZXR1cm4gdmFsdWUgaXMgcG9pbnRlciB0byBmaXJzdCBvZiB0d28gb3IgZm91ciBxdWFudGl6ZWQgc3BlY3RyYWwKLSAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGNvbnN0IFNDSEFSICpEZWNvZGVQQ1dfQm9keShIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICpwQ3VycmVudFRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSICAgICAgICAgICpwUXVhbnRWYWxCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAqcE51bURlY29kZWRCaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworICAgICAgICByZXR1cm46ICAgLSByZXR1cm4gdmFsdWUgaXMgcG9pbnRlciB0byBmaXJzdCBvZiB0d28gb3IgZm91ciBxdWFudGl6ZWQKK3NwZWN0cmFsIGNvZWZmaWNpZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgY29uc3QgU0NIQVIgKkRlY29kZVBDV19Cb2R5KEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBjb25zdCBJTlQgYnNBbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKnBDdXJyZW50VHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgKnBRdWFudFZhbEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBOdW1EZWNvZGVkQml0cykgewogICBVQ0hBUiBjYXJyeUJpdDsKLSAgVUlOVCAgYnJhbmNoTm9kZTsKLSAgVUlOVCAgdHJlZU5vZGU7Ci0gIFVJTlQgIGJyYW5jaFZhbHVlOwotICBjb25zdCAgU0NIQVIgKnBRdWFudFZhbDsKKyAgVUlOVCBicmFuY2hOb2RlOworICBVSU5UIHRyZWVOb2RlOworICBVSU5UIGJyYW5jaFZhbHVlOworICBjb25zdCBTQ0hBUiAqcFF1YW50VmFsOwogCiAgIC8qIGRlY29kZSBQQ1dfQk9EWSAqLwotICB0cmVlTm9kZSA9ICpwQ3VycmVudFRyZWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBmaXJzdCBub2RlIG9mIGN1cnJlbnQgdHJlZSBiZWxvbmdpbmcgdG8gY3VycmVudCBjb2RlYm9vayAqLworICB0cmVlTm9kZSA9ICpwQ3VycmVudFRyZWU7IC8qIGdldCBmaXJzdCBub2RlIG9mIGN1cnJlbnQgdHJlZSBiZWxvbmdpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGNvZGVib29rICovCiAKICAgLyogZGVjb2RlIHdob2xlIFBDVy1jb2Rld29yZC1ib2R5ICovCiAgIHdoaWxlICgxKSB7Ci0KLSAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsICAgICAgICAgICAgICAgICAvKiBkdW1teSAqLworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsIGJzQW5jaG9yLCBwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwgLyogZHVtbXkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST01fTEVGVF9UT19SSUdIVCk7CiAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50IC09IDE7CiAgICAgKnBOdW1EZWNvZGVkQml0cyArPSAxOwogCi0gICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyYW5jaFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoTm9kZSk7CisgICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LCB0cmVlTm9kZSwgJmJyYW5jaFZhbHVlLCAmYnJhbmNoTm9kZSk7CiAKLSAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0gVEVTVF9CSVRfMTApIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0IGJpdCAxMCA7IGlmIHNldCAtLT4gY29kZXdvcmQtYm9keSBpcyBjb21wbGV0ZSAqLwotICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBicmFuY2ggaW4gdHJlZSByZWFjaGVkICBpLmUuIGEgd2hvbGUgUENXLUJvZHkgaXMgZGVjb2RlZCAqLworICAgIGlmICgoYnJhbmNoTm9kZSAmIFRFU1RfQklUXzEwKSA9PQorICAgICAgICBURVNUX0JJVF8xMCkgeyAvKiB0ZXN0IGJpdCAxMCA7IGlmIHNldCAtLT4gY29kZXdvcmQtYm9keSBpcyBjb21wbGV0ZSAqLworICAgICAgYnJlYWs7IC8qIGVuZCBvZiBicmFuY2ggaW4gdHJlZSByZWFjaGVkICBpLmUuIGEgd2hvbGUgUENXLUJvZHkgaXMgZGVjb2RlZAorICAgICAgICAgICAgICAqLworICAgIH0gZWxzZSB7CisgICAgICB0cmVlTm9kZSA9ICooCisgICAgICAgICAgcEN1cnJlbnRUcmVlICsKKyAgICAgICAgICBicmFuY2hWYWx1ZSk7IC8qIHVwZGF0ZSB0cmVlTm9kZSBmb3IgZnVydGhlciBzdGVwIGluIGRlY29kaW5nIHRyZWUgKi8KICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB0cmVlTm9kZSA9ICoocEN1cnJlbnRUcmVlICsgYnJhbmNoVmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRyZWVOb2RlIGZvciBmdXJ0aGVyIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSAqLwotICAgIH0KLQogICB9CiAKLSAgcFF1YW50VmFsID0gcFF1YW50VmFsQmFzZSArIGJyYW5jaFZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgcG9pbnRlciB0byB2YWxpZCBmaXJzdCBvZiAyIG9yIDQgcXVhbnRpemVkIHZhbHVlcyAqLworICBwUXVhbnRWYWwgPQorICAgICAgcFF1YW50VmFsQmFzZSArIGJyYW5jaFZhbHVlOyAvKiB1cGRhdGUgcG9pbnRlciB0byB2YWxpZCBmaXJzdCBvZiAyIG9yIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkIHZhbHVlcyAqLwogCiAgIHJldHVybiBwUXVhbnRWYWw7CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBkZWNvZGVzIG9uZSBlc2NhcGUgc2VxdWVuY2UuIEluIGNhc2Ugb2YgYSBlc2NhcGUgY29kZWJvb2sKLSAgICAgICAgICAgICAgICAgICAgYW5kIGluIGNhc2Ugb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWUgPT0gMTYsCi0gICAgICAgICAgICAgICAgICAgIGEgZXNjYXBlU2VxdWVuY2UgaXMgZGVjb2RlZCBpbiB0d28gc3RlcHM6CisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyBvbmUgZXNjYXBlIHNlcXVlbmNlLiBJbiBjYXNlIG9mIGEKK2VzY2FwZSBjb2RlYm9vayBhbmQgaW4gY2FzZSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHF1YW50aXplZCBzcGVjdHJhbAordmFsdWUgPT0gMTYsIGEgZXNjYXBlU2VxdWVuY2UgaXMgZGVjb2RlZCBpbiB0d28gc3RlcHM6CiAgICAgICAgICAgICAgICAgICAgICAgMS4gZXNjYXBlIHByZWZpeAogICAgICAgICAgICAgICAgICAgICAgIDIuIGVzY2FwZSB3b3JkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYyBJTlQgIERlY29kZUVzY2FwZVNlcXVlbmNlKEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNDb2VmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcE51bURlY29kZWRCaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgVUlOVCAgaTsKLSAgSU5UICAgc2lnbjsKLSAgVUlOVCAgZXNjYXBlT25lc0NvdW50ZXIgPSAwOwotICBVSU5UICBjYXJyeUJpdDsKLSAgSU5UICAgZXNjYXBlX3dvcmQgPSAwOworc3RhdGljIElOVCBEZWNvZGVFc2NhcGVTZXF1ZW5jZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgY29uc3QgSU5UIGJzQW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcXVhbnRTcGVjQ29lZiwgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcE51bURlY29kZWRCaXRzKSB7CisgIFVJTlQgaTsKKyAgSU5UIHNpZ247CisgIFVJTlQgZXNjYXBlT25lc0NvdW50ZXIgPSAwOworICBVSU5UIGNhcnJ5Qml0OworICBJTlQgZXNjYXBlX3dvcmQgPSAwOwogCiAgIC8qIGRlY29kZSBlc2NhcGUgcHJlZml4ICovCiAgIHdoaWxlICgxKSB7Ci0gICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCAgICAgICAgICAgICAgICAvKiBkdW1teSAqLworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsIGJzQW5jaG9yLCBwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwgLyogZHVtbXkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST01fTEVGVF9UT19SSUdIVCk7CiAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50IC09IDE7CiAgICAgKnBOdW1EZWNvZGVkQml0cyArPSAxOwogCiAgICAgaWYgKGNhcnJ5Qml0ICE9IDApIHsKICAgICAgIGVzY2FwZU9uZXNDb3VudGVyICs9IDE7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBlc2NhcGVPbmVzQ291bnRlciArPSA0OwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKICAgLyogZGVjb2RlIGVzY2FwZSB3b3JkICovCi0gIGZvciggaT1lc2NhcGVPbmVzQ291bnRlcjsgaSAhPSAwIDsgaS0tICkgewotICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwgICAgICAgICAgICAgICAgLyogZHVtbXkgKi8KKyAgZm9yIChpID0gZXNjYXBlT25lc0NvdW50ZXI7IGkgIT0gMDsgaS0tKSB7CisgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywgYnNBbmNob3IsIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCAvKiBkdW1teSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTV9MRUZUX1RPX1JJR0hUKTsKICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgLT0gMTsKICAgICAqcE51bURlY29kZWRCaXRzICs9IDE7CkBAIC0xNDc0LDYxICsxNDIzLDU1IEBACiAKICAgc2lnbiA9IChxdWFudFNwZWNDb2VmID49IDApID8gMSA6IC0xOwogCi0gIHF1YW50U3BlY0NvZWYgPSBzaWduICogKCgoSU5UICkgMSA8PCBlc2NhcGVPbmVzQ291bnRlcikgKyBlc2NhcGVfd29yZCk7CisgIHF1YW50U3BlY0NvZWYgPSBzaWduICogKCgoSU5UKTEgPDwgZXNjYXBlT25lc0NvdW50ZXIpICsgZXNjYXBlX3dvcmQpOwogCiAgIHJldHVybiBxdWFudFNwZWNDb2VmOwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgIERlY29kZXMgdGhlIFNpZ25iaXRzIG9mIGEgcHJpb3JpdHkgY29kZXdvcmQgKFBDVykgYW5kIHdyaXRlcyBvdXQgdGhlCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZyBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWVzIGludG8gdW5zb3J0ZWQgc2VjdGlvbnMKKyAgICAgZGVzY3JpcHRpb246ICAgRGVjb2RlcyB0aGUgU2lnbmJpdHMgb2YgYSBwcmlvcml0eSBjb2Rld29yZCAoUENXKSBhbmQgd3JpdGVzCitvdXQgdGhlIHJlc3VsdGluZyBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWVzIGludG8gdW5zb3J0ZWQgc2VjdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dHB1dDogICAtIHR3byBvciBmb3VyIGxpbmVzIGF0IHBvc2l0aW9uIGluIGNvcnJlc3BvbmRpbmcgc2VjdGlvbiAod2hpY2ggYXJlIG5vdAotICAgICAgICAgICAgICAgICAgICBsb2NhdGVkIGF0IHRoZSBkZXNpcmVkIHBvc2l0aW9uLCBpLmUuIHRoZXkgbXVzdCBiZSByZW9yZGVyZWQgaW4gdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAgICAgb2YgZWlnaHQgZnVuY3Rpb24gb2YgSENSKQorICAgICAgICBvdXRwdXQ6ICAgLSB0d28gb3IgZm91ciBsaW5lcyBhdCBwb3NpdGlvbiBpbiBjb3JyZXNwb25kaW5nIHNlY3Rpb24KKyh3aGljaCBhcmUgbm90IGxvY2F0ZWQgYXQgdGhlIGRlc2lyZWQgcG9zaXRpb24sIGkuZS4gdGhleSBtdXN0IGJlIHJlb3JkZXJlZCBpbgordGhlIGxhc3Qgb2YgZWlnaHQgZnVuY3Rpb24gb2YgSENSKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgcmV0dXJuOiAgIC0gdXBkYXRlZCBwUXVhbnRTcGVjQ29lZiBwb2ludGVyICh0byBuZXh0IGVtcHR5IHN0b3JhZ2UgZm9yIGEgbGluZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgaW50IERlY29kZVBDV19TaWduKEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgIGNvZGVib29rRGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiAgICAgICAgICAqcFF1YW50VmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAqcFF1YW50U3BlY0NvZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpxdWFudFNwZWNDb2VmSWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcE51bURlY29kZWRCaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICBVSU5UICAgICBpOwotICBVSU5UICAgICBjYXJyeUJpdDsKLSAgSU5UICAgICAgcXVhbnRTcGVjQ29lZjsKKyAgICAgICAgcmV0dXJuOiAgIC0gdXBkYXRlZCBwUXVhbnRTcGVjQ29lZiBwb2ludGVyICh0byBuZXh0IGVtcHR5IHN0b3JhZ2UgZm9yIGEKK2xpbmUpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBpbnQgRGVjb2RlUENXX1NpZ24oSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIGNvbnN0IElOVCBic0FuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBjb2RlYm9va0RpbSwgY29uc3QgU0NIQVIgKnBRdWFudFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBRdWFudFNwZWNDb2VmLCBpbnQgKnF1YW50U3BlY0NvZWZJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBOdW1EZWNvZGVkQml0cykgeworICBVSU5UIGk7CisgIFVJTlQgY2FycnlCaXQ7CisgIElOVCBxdWFudFNwZWNDb2VmOwogCi0gIGZvciggaT1jb2RlYm9va0RpbTsgaSAhPSAwIDsgaS0tICkgeworICBmb3IgKGkgPSBjb2RlYm9va0RpbTsgaSAhPSAwOyBpLS0pIHsKICAgICBxdWFudFNwZWNDb2VmID0gKnBRdWFudFZhbCsrOwogICAgIGlmIChxdWFudFNwZWNDb2VmICE9IDApIHsKLSAgICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsICAgIC8qIGR1bW15ICovCisgICAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKGJzLCBic0FuY2hvciwgcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwgLyogZHVtbXkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTV9MRUZUX1RPX1JJR0hUKTsKICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCAtPSAxOwogICAgICAgKnBOdW1EZWNvZGVkQml0cyArPSAxOwotICAgICAgaWYgKCpwUmVtYWluaW5nQml0c0luU2VnbWVudCA8IDAgfHwgKnBOdW1EZWNvZGVkQml0cyA+PSAoMTAyND4+MSkpIHsKKyAgICAgIGlmICgqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPCAwIHx8ICpwTnVtRGVjb2RlZEJpdHMgPj0gKDEwMjQgPj4gMSkpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgfQogCiAgICAgICAvKiBhZGFwdCBzaWduIG9mIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIGRlY29kZWQgc2lnbiBiaXQgKi8KICAgICAgIGlmIChjYXJyeUJpdCAhPSAwKSB7CiAgICAgICAgIHBRdWFudFNwZWNDb2VmWypxdWFudFNwZWNDb2VmSWR4XSA9IC0oRklYUF9EQkwpcXVhbnRTcGVjQ29lZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBRdWFudFNwZWNDb2VmWypxdWFudFNwZWNDb2VmSWR4XSA9IChGSVhQX0RCTClxdWFudFNwZWNDb2VmOwogICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHBRdWFudFNwZWNDb2VmWypxdWFudFNwZWNDb2VmSWR4XSA9ICAoRklYUF9EQkwpcXVhbnRTcGVjQ29lZjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIHBRdWFudFNwZWNDb2VmWypxdWFudFNwZWNDb2VmSWR4XSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgIH0KLSAgICAqcXVhbnRTcGVjQ29lZklkeCArPSAxIDsKKyAgICAqcXVhbnRTcGVjQ29lZklkeCArPSAxOwogICAgIGlmICgqcXVhbnRTcGVjQ29lZklkeCA+PSAxMDI0KSB7CiAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTUzNiw1NiArMTQ3OSwyMCBAQAogICByZXR1cm4gMDsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBNdXRlcyBzcGVjdHJhbCBsaW5lcyB3aGljaCBoYXZlIGJlZW4gbWFya2VkIGFzIGVycm9uZW91cyAoUV9WQUxVRV9JTlZBTElEKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgSGNyTXV0ZUVycm9uZW91c0xpbmVzKEhfSENSX0lORk8gaEhjcikKLXsKKyAgICAgZGVzY3JpcHRpb246ICAgTXV0ZXMgc3BlY3RyYWwgbGluZXMgd2hpY2ggaGF2ZSBiZWVuIG1hcmtlZCBhcyBlcnJvbmVvdXMKKyhRX1ZBTFVFX0lOVkFMSUQpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3ZvaWQgSGNyTXV0ZUVycm9uZW91c0xpbmVzKEhfSENSX0lORk8gaEhjcikgewogICBpbnQgYzsKLSAgRklYUF9EQkwgKlJFU1RSSUNUIHBMb25nID0gU1BFQ19MT05HKGhIY3ItPmRlY0luT3V0LnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UpOworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcExvbmcgPQorICAgICAgU1BFQ19MT05HKGhIY3ItPmRlY0luT3V0LnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UpOwogCiAgIC8qIGlmIHRoZXJlIGlzIGEgbGluZSB3aXRoIHZhbHVlIFFfVkFMVUVfSU5WQUxJRCBtdXRlIGl0ICovCiAgIGZvciAoYyA9IDA7IGMgPCAxMDI0OyBjKyspIHsKICAgICBpZiAocExvbmdbY10gPT0gKEZJWFBfREJMKVFfVkFMVUVfSU5WQUxJRCkgewotI2lmIEhDUl9MSVNURU5fVE9fTVVURURfTElORVMKLSAgICAgIHBMb25nW2NdID0gKEZJWFBfREJMKUhDUl9ESVJBQzsgICAvKiBtYXJraW5nICovCi0jZWxzZQotICAgICAgcExvbmdbY10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsgIC8qIG11dGluZyAqLwotI2VuZGlmCisgICAgICBwTG9uZ1tjXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOyAvKiBtdXRpbmcgKi8KICAgICB9CiAgIH0KIH0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBTZXRzIGdsb2JhbCBIQ1IgdHlwZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgc2V0SGNyVHlwZShIX0hDUl9JTkZPIGhIY3IsIE1QNF9FTEVNRU5UX0lEIHR5cGUpCi17Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgSURfU0NFOgotICAgICAgaEhjci0+Z2xvYmFsSGNyVHlwZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElEX0NQRToKLSAgICAgIGhIY3ItPmdsb2JhbEhjclR5cGUgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgR2V0cyBIQ1IgdHlwZSBmcm9tIHRoZSBIQ1IgZGF0YSBzdHJ1Y3R1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHJldHVybjogICAtIGdsb2JhbCBIQ1IgdHlwZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLUlOVCBnZXRIY3JUeXBlKEhfSENSX0lORk8gaEhjcikKLXsKLSAgcmV0dXJuIGhIY3ItPmdsb2JhbEhjclR5cGU7Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjci5oIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyLmgKaW5kZXggNmZjNTI3Yi4uYmUyMTE0NCAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyLmgKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDggKzkwLDM5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIFJvYmVydCBXZWlkbmVyIChEU1AgU29sdXRpb25zKQorCiAgICBEZXNjcmlwdGlvbjogSENSIERlY29kZXI6IEludGVyZmFjZSBmdW5jdGlvbiBkZWNsYXJhdGlvbjsgY29tbW9uIGRlZmluZXMKICAgICAgICAgICAgICAgICBhbmQgc3RydWN0dXJlczsgZGVmaW5lcyBmb3Igc3dpdGNoaW5nIGVycm9yLWdlbmVyYXRvciwKICAgICAgICAgICAgICAgICAtZGV0ZWN0b3IsIGFuZCAtY29uY2VhbG1lbnQKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfQUFDREVDX0hDUl9IXwotI2RlZmluZSBfQUFDREVDX0hDUl9IXwotCi0KKyNpZm5kZWYgQUFDREVDX0hDUl9ICisjZGVmaW5lIEFBQ0RFQ19IQ1JfSAogCiAjaW5jbHVkZSAiY2hhbm5lbGluZm8uaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKLXZvaWQgIEhjckluaXRSb20gKEhfSENSX0lORk8gaEhjcik7Ci1VSU5UIEhjckluaXQoSF9IQ1JfSU5GTyAgICAgICAgICAgICAgcEhjciwKLSAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorVUlOVCBIY3JJbml0KEhfSENSX0lORk8gcEhjciwgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBicyk7Ci1VSU5UICBIY3JEZWNvZGVyIChIX0hDUl9JTkZPIGhIY3IsCi0gICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicyk7Ci12b2lkICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoCi0gICAgICAgIFVDSEFSICBjYXJyeUJpdCwKLSAgICAgICAgVUlOVCAgIHRyZWVOb2RlLAotICAgICAgICBVSU5UICAqYnJhbmNoVmFsdWUsCi0gICAgICAgIFVJTlQgICpicmFuY2hOb2RlCi0gICAgICAgICk7CisgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpOworVUlOVCBIY3JEZWNvZGVyKEhfSENSX0lORk8gaEhjciwgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicyk7Cit2b2lkIENhcnJ5Qml0VG9CcmFuY2hWYWx1ZShVQ0hBUiBjYXJyeUJpdCwgVUlOVCB0cmVlTm9kZSwgVUlOVCAqYnJhbmNoVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpicmFuY2hOb2RlKTsKIAotdm9pZCAgQ0hjcl9SZWFkICAoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKLXZvaWQgIEhjck11dGVFcnJvbmVvdXNMaW5lcyhIX0hDUl9JTkZPIGhIY3IpOwordm9pZCBDSGNyX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgZ2xvYmFsSGNyVHlwZSk7Cit2b2lkIEhjck11dGVFcnJvbmVvdXNMaW5lcyhIX0hDUl9JTkZPIGhIY3IpOwogCi12b2lkICBzZXRIY3JUeXBlKEhfSENSX0lORk8gaEhjciwgTVA0X0VMRU1FTlRfSUQgdHlwZSk7Ci1JTlQgICBnZXRIY3JUeXBlKEhfSENSX0lORk8gaEhjcik7Cit2b2lkIHNldEhjclR5cGUoSF9IQ1JfSU5GTyBoSGNyLCBNUDRfRUxFTUVOVF9JRCB0eXBlKTsKK0lOVCBnZXRIY3JUeXBlKEhfSENSX0lORk8gaEhjcik7CiAKLQotCi0jZW5kaWYgLyogX0FBQ0RFQ19IQ1JfSF8gKi8KKyNlbmRpZiAvKiBBQUNERUNfSENSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl9iaXQuY3BwIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX2JpdC5jcHAKaW5kZXggZGYyNjg1Yi4uMDE5ODY1OSAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX2JpdC5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX2JpdC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzkgKzkwLDM4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIFJvYmVydCBXZWlkbmVyIChEU1AgU29sdXRpb25zKQorCiAgICBEZXNjcmlwdGlvbjogSENSIERlY29kZXI6IEJpdHN0cmVhbSByZWFkaW5nCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJhYWNkZWNfaGNyX2JpdC5oIgogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIGRlc2NyaXB0aW9uOiAgVGhpcyBmdW5jdGlvbiB0b2dnbGVzIHRoZSByZWFkIGRpcmVjdGlvbi4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIGlucHV0OiAgICAgICAgY3VycmVudCByZWFkIGRpcmVjdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgICAgICBuZXcgcmVhZCBkaXJlY3Rpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1VQ0hBUiBUb2dnbGVSZWFkRGlyZWN0aW9uKFVDSEFSIHJlYWREaXJlY3Rpb24pCi17Ci0gIGlmICggcmVhZERpcmVjdGlvbiA9PSBGUk9NX0xFRlRfVE9fUklHSFQgKSB7CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK1VDSEFSIFRvZ2dsZVJlYWREaXJlY3Rpb24oVUNIQVIgcmVhZERpcmVjdGlvbikgeworICBpZiAocmVhZERpcmVjdGlvbiA9PSBGUk9NX0xFRlRfVE9fUklHSFQpIHsKICAgICByZXR1cm4gRlJPTV9SSUdIVF9UT19MRUZUOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIHJldHVybiBGUk9NX0xFRlRfVE9fUklHSFQ7CiAgIH0KIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBiaXQgZnJvbSB0aGUgYml0c3RyZWFtIGFjY29yZGluZyB0byByZWFkIGRpcmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgSXQgaXMgY2FsbGVkIHZlcnkgb2Z0ZW4sIHRoZXJlZm9yZSBpdCBtYWtlcyBzZW5zZSB0byBpbmxpbmUgaXQgKHJ1bnRpbWUpLgorICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBiaXQgZnJvbSB0aGUgYml0c3RyZWFtIGFjY29yZGluZyB0bworcmVhZCBkaXJlY3Rpb24uIEl0IGlzIGNhbGxlZCB2ZXJ5IG9mdGVuLCB0aGVyZWZvcmUgaXQgbWFrZXMgc2Vuc2UgdG8gaW5saW5lIGl0CisocnVudGltZSkuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICBpbnB1dDogICAgLSBoYW5kbGUgdG8gRkRLIGJpdHN0cmVhbQogICAgICAgICAgICAgICAgICAgLSByZWZlcmVuY2UgdmFsdWUgbWFya2luZyBzdGFydCBvZiBiaXRmaWVsZApAQCAtMTIwLDI4ICsxMzAsMjYgQEAKICAgICAgICAgICAgICAgICAgIC0gcmVhZERpcmVjdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgIC0gYml0IGZyb20gYml0c3RyZWFtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUlOVCBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKQotewotICBVSU5UICAgYml0OwotICBJTlQgICAgcmVhZEJpdE9mZnNldDsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworVUlOVCBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgY29uc3QgSU5UIGJzQW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQsIFVDSEFSIHJlYWREaXJlY3Rpb24pIHsKKyAgVUlOVCBiaXQ7CisgIElOVCByZWFkQml0T2Zmc2V0OwogCiAgIGlmIChyZWFkRGlyZWN0aW9uID09IEZST01fTEVGVF9UT19SSUdIVCkgewotICAgIHJlYWRCaXRPZmZzZXQgPSAqcExlZnRTdGFydE9mU2VnbWVudC1GREtnZXRCaXRDbnQoYnMpOwotICAgIGlmKCByZWFkQml0T2Zmc2V0ICkgeworICAgIHJlYWRCaXRPZmZzZXQgPSAoSU5UKUZES2dldFZhbGlkQml0cyhicykgLSBic0FuY2hvciArICpwTGVmdFN0YXJ0T2ZTZWdtZW50OworICAgIGlmIChyZWFkQml0T2Zmc2V0KSB7CiAgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgcmVhZEJpdE9mZnNldCk7CiAgICAgfQogCiAgICAgYml0ID0gRkRLcmVhZEJpdHMoYnMsIDEpOwogCiAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQgKz0gMTsKLSAgfQotICBlbHNlIHsKLSAgICByZWFkQml0T2Zmc2V0ID0gKnBSaWdodFN0YXJ0T2ZTZWdtZW50LUZES2dldEJpdENudChicyk7Ci0gICAgaWYoIHJlYWRCaXRPZmZzZXQgKSB7CisgIH0gZWxzZSB7CisgICAgcmVhZEJpdE9mZnNldCA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSAtIGJzQW5jaG9yICsgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICAgIGlmIChyZWFkQml0T2Zmc2V0KSB7CiAgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgcmVhZEJpdE9mZnNldCk7CiAgICAgfQogCkBAIC0xNTIsMTQgKzE2MCw1IEBACiAgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50IC09IDE7CiAgIH0KIAotCi0jaWYgRVJST1JfR0VORVJBVE9SX0JJVF9TVFJFQU1fSENSCi0gIHN0YXRpYyBpbnQgYTsKLSAgaWYgKCgrK2EgJSBNT0RVTE9fRElWSVNPUl9IQ1IpID09IDApIHsKLSAgICBiaXQgPSAoYml0ID09IDApID8gMSA6IDA7Ci0gIH0KLSNlbmRpZgotCiAgIHJldHVybiAoYml0KTsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX2JpdC5oIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX2JpdC5oCmluZGV4IDg5OTRmZjEuLjc3MjQyYWMgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl9iaXQuaAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JfYml0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjggKzkwLDI1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIFJvYmVydCBXZWlkbmVyIChEU1AgU29sdXRpb25zKQorCiAgICBEZXNjcmlwdGlvbjogSENSIERlY29kZXI6IEJpdHN0cmVhbSByZWFkaW5nIHByb3RvdHlwZXMKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfQUFDREVDX0hDUl9CSVRfSF8KLSNkZWZpbmUgX0FBQ0RFQ19IQ1JfQklUX0hfCi0KLQorI2lmbmRlZiBBQUNERUNfSENSX0JJVF9ICisjZGVmaW5lIEFBQ0RFQ19IQ1JfQklUX0gKIAogI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKIAogVUNIQVIgVG9nZ2xlUmVhZERpcmVjdGlvbihVQ0hBUiByZWFkRGlyZWN0aW9uKTsKIAotVUlOVCAgSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CitVSU5UIEhjckdldEFCaXRGcm9tQml0c3RyZWFtKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBjb25zdCBJTlQgYnNBbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwUmlnaHRTdGFydE9mU2VnbWVudCwgVUNIQVIgcmVhZERpcmVjdGlvbik7CiAKLQotI2VuZGlmIC8qIF9BQUNERUNfSENSX0JJVF9IXyAqLworI2VuZGlmIC8qIEFBQ0RFQ19IQ1JfQklUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl90eXBlcy5oIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX3R5cGVzLmgKaW5kZXggMzIzZWM0ZS4uMWNjM2NiMCAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX3R5cGVzLmgKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX3R5cGVzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjAgKzkwLDE5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIFJvYmVydCBXZWlkbmVyIChEU1AgU29sdXRpb25zKQorCiAgICBEZXNjcmlwdGlvbjogSENSIERlY29kZXI6IENvbW1vbiBkZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzOyBkZWZpbmVzIGZvcgogICAgICAgICAgICAgICAgIHN3aXRjaGluZyBlcnJvci1nZW5lcmF0b3IsIC1kZXRlY3RvciwgYW5kIC1jb25jZWFsbWVudDsKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfQUFDREVDX0hDUl9UWVBFU19IXwotI2RlZmluZSBfQUFDREVDX0hDUl9UWVBFU19IXwotCi0KKyNpZm5kZWYgQUFDREVDX0hDUl9UWVBFU19ICisjZGVmaW5lIEFBQ0RFQ19IQ1JfVFlQRVNfSAogCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogI2luY2x1ZGUgIm92ZXJsYXBhZGQuaCIKQEAgLTEwMCwxODYgKzExMCwyNDkgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNkZWZpbmUgIExJTkVTX1BFUl9VTklUICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTElORVNfUEVSX1VOSVQgNAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogLS0tLS0tLS0tLS0gYmFzaWMgSENSIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tICovCiAKLQotICNkZWZpbmUgIE1BWF9TRkJfSENSICAgICAgICAgICAgICAgICAoKCgxMDI0LzgpIC8gTElORVNfUEVSX1VOSVQpICogOCkgIC8qICg4ICogMTYpIGlzIG5vdCBlbm91Z2ggYmVjYXVzZSBzZmJzIGFyZSBzcGxpdCBpbiB1bml0cyBmb3IgYmxvY2t0eXBlIHNob3J0ICovCi0gI2RlZmluZSAgTlVNQkVSX09GX1VOSVRfR1JPVVBTICAgICAgIChMSU5FU19QRVJfVU5JVCAqIDgpCi0gI2RlZmluZSAgTElORVNfUEVSX1VOSVRfR1JPVVAgICAgICAgICgxMDI0IC8gTlVNQkVSX09GX1VOSVRfR1JPVVBTKSAgICAgLyogMTUgMTYgMzAgMzIgKi8KLQorI2RlZmluZSBNQVhfU0ZCX0hDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKDEwMjQgLyA4KSAvIExJTkVTX1BFUl9VTklUKSAqIDgpIC8qICg4ICogMTYpIGlzIG5vdCBlbm91Z2ggYmVjYXVzZSBzZmJzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHNwbGl0IGluIHVuaXRzIGZvciBibG9ja3R5cGUgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqLworI2RlZmluZSBOVU1CRVJfT0ZfVU5JVF9HUk9VUFMgKExJTkVTX1BFUl9VTklUICogOCkKKyNkZWZpbmUgTElORVNfUEVSX1VOSVRfR1JPVVAgKDEwMjQgLyBOVU1CRVJfT0ZfVU5JVF9HUk9VUFMpIC8qIDE1IDE2IDMwIDMyICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2RlZmluZSAgRlJPTV9MRUZUX1RPX1JJR0hUICAgICAgICAgICAgMAotI2RlZmluZSAgRlJPTV9SSUdIVF9UT19MRUZUICAgICAgICAgICAgMQorI2RlZmluZSBGUk9NX0xFRlRfVE9fUklHSFQgMAorI2RlZmluZSBGUk9NX1JJR0hUX1RPX0xFRlQgMQogCi0jZGVmaW5lICBNQVhfQ0JfUEFJUlMgICAgICAgICAgICAgICAgICAyMwotI2RlZmluZSAgTUFYX0hDUl9TRVRTICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgTUFYX0NCX1BBSVJTIDIzCisjZGVmaW5lIE1BWF9IQ1JfU0VUUyAxNAogCi0jZGVmaW5lICBFU0NBUEVfVkFMVUUgICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSAgUE9TSVRJT05fT0ZfRkxBR19BICAgICAgICAgICAgMjEKLSNkZWZpbmUgIFBPU0lUSU9OX09GX0ZMQUdfQiAgICAgICAgICAgIDIwCisjZGVmaW5lIEVTQ0FQRV9WQUxVRSAxNgorI2RlZmluZSBQT1NJVElPTl9PRl9GTEFHX0EgMjEKKyNkZWZpbmUgUE9TSVRJT05fT0ZfRkxBR19CIDIwCiAKLSNkZWZpbmUgIE1BWF9DQiAgICAgICAgICAgICAgICAgICAgICAgIDMyICAgICAvKiBsYXN0IHVzZWQgQ0IgaXMgY2IgIzMxIHdoZW4gVkNCMTEgaXMgdXNlZCAqLworI2RlZmluZSBNQVhfQ0IgMzIgLyogbGFzdCB1c2VkIENCIGlzIGNiICMzMSB3aGVuIFZDQjExIGlzIHVzZWQgKi8KIAotI2RlZmluZSAgTUFYX0NCX0NIRUNLICAgICAgICAgICAgICAgICAgMzIgICAgIC8qIHN1cHBvcnQgZm9yIFZDQjExIGF2YWlsYWJsZSAtLSBpcyBtb3JlIGdlbmVyYWwsIGNvdWxkIHRoZXJlZm9yZSB1c2VkIGluIGJvdGggY2FzZXMgKi8KKyNkZWZpbmUgTUFYX0NCX0NIRUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAzMiAvKiBzdXBwb3J0IGZvciBWQ0IxMSBhdmFpbGFibGUgLS0gaXMgbW9yZSBnZW5lcmFsLCBjb3VsZCB0aGVyZWZvcmUgdXNlZCBcCisgICAgICAgIGluIGJvdGggY2FzZXMgKi8KIAotI2RlZmluZSAgTlVNQkVSX09GX0JJVF9JTl9XT1JEICAgICAgICAgMzIKKyNkZWZpbmUgTlVNQkVSX09GX0JJVF9JTl9XT1JEIDMyCiAKIC8qIGxvZyAqLwotI2RlZmluZSAgVEhJUlRZVFdPX0xPR19ESVZfVFdPX0xPRyAgICAgNQotI2RlZmluZSAgRUlHSFRfTE9HX0RJVl9UV09fTE9HICAgICAgICAgMwotI2RlZmluZSAgRk9VUl9MT0dfRElWX1RXT19MT0cgICAgICAgICAgMgorI2RlZmluZSBUSElSVFlUV09fTE9HX0RJVl9UV09fTE9HIDUKKyNkZWZpbmUgRUlHSFRfTE9HX0RJVl9UV09fTE9HIDMKKyNkZWZpbmUgRk9VUl9MT0dfRElWX1RXT19MT0cgMgogCiAvKiBib3JkZXJzICovCi0jZGVmaW5lICBDUEVfVE9QX0xFTkdUSCAgICAgICAgICAgICAgICAxMjI4OAotI2RlZmluZSAgU0NFX1RPUF9MRU5HVEggICAgICAgICAgICAgICAgNjE0NAotI2RlZmluZSAgTEVOX09GX0xPTkdFU1RfQ1dfVE9QX0xFTkdUSCAgNDkKKyNkZWZpbmUgQ1BFX1RPUF9MRU5HVEggMTIyODgKKyNkZWZpbmUgU0NFX1RPUF9MRU5HVEggNjE0NAorI2RlZmluZSBMRU5fT0ZfTE9OR0VTVF9DV19UT1BfTEVOR1RIIDQ5CiAKIC8qIHFzYydzIG9mIGhpZ2ggbGV2ZWwgKi8KLSNkZWZpbmUgIFFfVkFMVUVfSU5WQUxJRCAgICAgICAgICAgICAgIDgxOTIgICAvKiBtYXJrIGEgaW52YWxpZCBsaW5lIHdpdGggdGhpcyB2YWx1ZSAodG8gYmUgY29uY2VhbGVkIGxhdGVyIG9uKSAqLwotI2RlZmluZSAgSENSX0RJUkFDICAgICAgICAgICAgICAgICAgICAgNTAwICAgIC8qIGEgbGluZSBvZiBoaWdoIGxldmVsICovCisjZGVmaW5lIFFfVkFMVUVfSU5WQUxJRCBcCisgIDgxOTIgLyogbWFyayBhIGludmFsaWQgbGluZSB3aXRoIHRoaXMgdmFsdWUgKHRvIGJlIGNvbmNlYWxlZCBsYXRlciBvbikgKi8KKyNkZWZpbmUgSENSX0RJUkFDIDUwMCAvKiBhIGxpbmUgb2YgaGlnaCBsZXZlbCAqLwogCiAvKiBtYXNrcyAqLwotI2RlZmluZSAgTUFTS19MRUZUICAgICAgICAgICAgICAgICAgICAgMHhGRkYwMDAKLSNkZWZpbmUgIE1BU0tfUklHSFQgICAgICAgICAgICAgICAgICAgIDB4RkZGCi0jZGVmaW5lICBDTFJfQklUXzEwICAgICAgICAgICAgICAgICAgICAweDNGRgotI2RlZmluZSAgVEVTVF9CSVRfMTAgICAgICAgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgTUFTS19MRUZUIDB4RkZGMDAwCisjZGVmaW5lIE1BU0tfUklHSFQgMHhGRkYKKyNkZWZpbmUgQ0xSX0JJVF8xMCAweDNGRgorI2RlZmluZSBURVNUX0JJVF8xMCAweDQwMAogCi0jZGVmaW5lICBMRUZUX09GRlNFVCAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBMRUZUX09GRlNFVCAxMgogCi0vKiB3aGVuIHNldCBIQ1IgaXMgcmVwbGFjZWQgYnkgYSBkdW1teS1tb2R1bGUgd2hpY2gganVzdCBmaWxscyB0aGUgb3V0cHV0YnVmZmVyIHdpdGggYSBkaXJhYyBzZXF1ZW5jZSAqLwotLyogdXNlIHRoaXMgaWYgSENSIGlzIHN1c3BlY3RlZCB0byB3cml0ZSBpbiBvdGhlciBtb2R1bGVzIC0tIGlmIGVycm9yIGlzIHN0ZWxsIHRoZXJlLCBIQ1IgaXMgaW5ub2NlbnQgKi8KLSNkZWZpbmUgVVNFX0hDUl9EVU1NWSAgICAgICAgICAgICAgICAgICAgIDAKLQorLyogd2hlbiBzZXQgSENSIGlzIHJlcGxhY2VkIGJ5IGEgZHVtbXktbW9kdWxlIHdoaWNoIGp1c3QgZmlsbHMgdGhlIG91dHB1dGJ1ZmZlcgorICogd2l0aCBhIGRpcmFjIHNlcXVlbmNlICovCisvKiB1c2UgdGhpcyBpZiBIQ1IgaXMgc3VzcGVjdGVkIHRvIHdyaXRlIGluIG90aGVyIG1vZHVsZXMgLS0gaWYgZXJyb3IgaXMgc3RlbGwKKyAqIHRoZXJlLCBIQ1IgaXMgaW5ub2NlbnQgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiAtICAgIGluc2VydCBIQ1IgZXJyb3JzICAgICAgIC0gKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0gIC8qIG1vZGlmeSBpbnB1dCBsZW5ndGhzIC0tIGhpZ2ggcHJvdGVjdGVkICovCi0jZGVmaW5lIEVSUk9SX0xPUlNEICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBvZmZzZXQ6IGVycm9yIGlmIGRpZmZlcmVudCBmcm9tIHplcm8gKi8KLSNkZWZpbmUgRVJST1JfTE9MQyAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIG9mZnNldDogZXJyb3IgaWYgZGlmZmVyZW50IGZyb20gemVybyAqLworLyogbW9kaWZ5IGlucHV0IGxlbmd0aHMgLS0gaGlnaCBwcm90ZWN0ZWQgKi8KKyNkZWZpbmUgRVJST1JfTE9SU0QgMCAvKiBvZmZzZXQ6IGVycm9yIGlmIGRpZmZlcmVudCBmcm9tIHplcm8gKi8KKyNkZWZpbmUgRVJST1JfTE9MQyAwICAvKiBvZmZzZXQ6IGVycm9yIGlmIGRpZmZlcmVudCBmcm9tIHplcm8gKi8KIAotICAvKiBzZWdtZW50cyBhcmUgZWFybGllciBlbXB0eSBhcyBleHBlY3RlZCB3aGVuIGRlY29kaW5nIFBDV3MgKi8KLSNkZWZpbmUgRVJST1JfUENXX0JPRFkgICAgICAgICAgICAgICAgICAgIDAgIC8qIHNldCBhIHBvc2l0aXZlIHZhbHVlcyB0byB0cmlnZ2VyIHRoZSBlcnJvciAobWFrZSBzZWdtZW50cyBlYXJseWVyIGFwcGVhciB0byBiZSBlbXB0eSkgKi8KLSNkZWZpbmUgRVJST1JfUENXX0JPRFlfU0lHTiAgICAgICAgICAgICAgIDAgIC8qIHNldCBhIHBvc2l0aXZlIHZhbHVlcyB0byB0cmlnZ2VyIHRoZSBlcnJvciAobWFrZSBzZWdtZW50cyBlYXJseWVyIGFwcGVhciB0byBiZSBlbXB0eSkgKi8KLSNkZWZpbmUgRVJST1JfUENXX0JPRFlfU0lHTl9FU0MgICAgICAgICAgIDAgIC8qIHNldCBhIHBvc2l0aXZlIHZhbHVlcyB0byB0cmlnZ2VyIHRoZSBlcnJvciAobWFrZSBzZWdtZW50cyBlYXJseWVyIGFwcGVhciB0byBiZSBlbXB0eSkgKi8KKy8qIHNlZ21lbnRzIGFyZSBlYXJsaWVyIGVtcHR5IGFzIGV4cGVjdGVkIHdoZW4gZGVjb2RpbmcgUENXcyAqLworI2RlZmluZSBFUlJPUl9QQ1dfQk9EWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMCAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKG1ha2Ugc2VnbWVudHMgZWFybHllciBcCisgICAgICAgYXBwZWFyIHRvIGJlIGVtcHR5KSAqLworI2RlZmluZSBFUlJPUl9QQ1dfQk9EWV9TSUdOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMCAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKG1ha2Ugc2VnbWVudHMgZWFybHllciBcCisgICAgICAgYXBwZWFyIHRvIGJlIGVtcHR5KSAqLworI2RlZmluZSBFUlJPUl9QQ1dfQk9EWV9TSUdOX0VTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMCAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKG1ha2Ugc2VnbWVudHMgZWFybHllciBcCisgICAgICAgYXBwZWFyIHRvIGJlIGVtcHR5KSAqLwogCi0gIC8qIHByZXRlbmQgdGhlcmUgYXJlIHRvbyBtYW55IGJpdHMgZGVjb2RlZCAoZW5sYXJnZSBsZW5ndGggb2YgY29kZXdvcmQpIGF0IFBDV3MgLS0gdXNlIGEgcG9zaXRpdmUgdmFsdWUgKi8KLSNkZWZpbmUgRVJST1JfUENXX0JPRFlfT05MWV9UT09fTE9ORyAgICAgIDAgIC8qIHNldCBhIHBvc2l0aXZlIHZhbHVlcyB0byB0cmlnZ2VyIHRoZSBlcnJvciAqLwotI2RlZmluZSBFUlJPUl9QQ1dfQk9EWV9TSUdOX1RPT19MT05HICAgICAgMCAgLyogc2V0IGEgcG9zaXRpdmUgdmFsdWVzIHRvIHRyaWdnZXIgdGhlIGVycm9yICovCi0jZGVmaW5lIEVSUk9SX1BDV19CT0RZX1NJR05fRVNDX1RPT19MT05HICAwICAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKi8KKy8qIHByZXRlbmQgdGhlcmUgYXJlIHRvbyBtYW55IGJpdHMgZGVjb2RlZCAoZW5sYXJnZSBsZW5ndGggb2YgY29kZXdvcmQpIGF0IFBDV3MKKyAqIC0tIHVzZSBhIHBvc2l0aXZlIHZhbHVlICovCisjZGVmaW5lIEVSUk9SX1BDV19CT0RZX09OTFlfVE9PX0xPTkcgXAorICAwIC8qIHNldCBhIHBvc2l0aXZlIHZhbHVlcyB0byB0cmlnZ2VyIHRoZSBlcnJvciAqLworI2RlZmluZSBFUlJPUl9QQ1dfQk9EWV9TSUdOX1RPT19MT05HIFwKKyAgMCAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKi8KKyNkZWZpbmUgRVJST1JfUENXX0JPRFlfU0lHTl9FU0NfVE9PX0xPTkcgXAorICAwIC8qIHNldCBhIHBvc2l0aXZlIHZhbHVlcyB0byB0cmlnZ2VyIHRoZSBlcnJvciAqLwogCi0gIC8qIG1vZGlmeSBIQ1IgYml0c3RyZWFtIGJsb2NrICovCi0jZGVmaW5lIEVSUk9SX0dFTkVSQVRPUl9CSVRfU1RSRUFNX0hDUiAgICAwICAvKiBtb2RpZnkgZXZlcnkgPE1PRFVMT19ESVZJU09SX0hDUj4tYml0IHdoZW4gcmVhZGluZyBmcm9tIGJpdHN0cmVhbSAqLyAvKiAhISEgQkVXQVJFISEhIGlmIFJWTEMgaXMgYWN0aXZlLCBhbHNvIFJWTEMgZGF0YSBhdCBFU0MyIHdpbGwgYmUgbW9kaWZpZWQgISEhICovCi0jZGVmaW5lIE1PRFVMT19ESVZJU09SX0hDUiAgICAgICAgICAgICAgIDMwCisvKiBtb2RpZnkgSENSIGJpdHN0cmVhbSBibG9jayAqLwogCisjZGVmaW5lIE1PRFVMT19ESVZJU09SX0hDUiAzMAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIC0gICAgZGV0ZWN0IEhDUiBlcnJvcnMgICAgICAgLSAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gIC8qIGNoZWNrIGlucHV0IGRhdGEgKi8KLSNkZWZpbmUgQ0hFQ0tfVkFMSURfSENSX0lOUFVUICAgICAgICAgICAgIDEgIC8qIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBjaGVjayBpbnB1dCBkYXRhICovCisvKiBjaGVjayBpbnB1dCBkYXRhICovCiAKLSAgLyogZHVyaW5nIGRlY29kaW5nICovCi0jZGVmaW5lIENIRUNLX1NFR01FTlRBVElPTl9JTU1FRElBVEVMWSAgICAxICAvKiB0aGUgMiBvciA0IGxpbmVzIG9mIGEgZGV0ZWN0ZWQgUENXLWRlY29kaW5nLWVycm9yIGlzIG1hcmtlZCAqLworLyogZHVyaW5nIGRlY29kaW5nICovCiAKLSNkZWZpbmUgQ0hFQ0tfU0VHTUVOVEFUSU9OX0ZJTkFMICAgICAgICAgIDEgIC8qIGFsbCB0aGUgc2VnbWVudHMgYXJlIGNoZWNrZWQgLS0gdGhlcmVmb3JlIC0tIGlmIHRoaXMgY2hlY2sgcGFzc2VzLCBpdHMgYSBraW5kIG9mIGV2aWRlbmNlIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkIFBDV3MgYW5kIG5vbi1QQ1dzIGFyZSBmaW5lICovCisvKiBhbGwgdGhlIHNlZ21lbnRzIGFyZSBjaGVja2VkIC0tIHRoZXJlZm9yZSAtLSBpZiB0aGlzIGNoZWNrIHBhc3NlcywgaXRzIGEga2luZAorICAgb2YgZXZpZGVuY2UgdGhhdCB0aGUgZGVjb2RlZCBQQ1dzIGFuZCBub24tUENXcyBhcmUgZmluZSAqLwogCi0jZGVmaW5lIERFVEVDVF9UT09fTE9OR19DV19SRUFEUyAgICAgICAgICAxICAvKiBpZiBhIGNvZGV3b3JkIGlzIGRlY29kZWQgdGhlcmUgZXhpc3RzIGEgYm9yZGVyIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMsIHdoaWNoIGFyZSBhbGxvd2VkIHRvIHJlYWQgZm9yIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV3b3JkLiBUaGlzIGJvcmRlciBpcyB0aGUgbWluaW11bSBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGNvZGV3b3JkIChmb3IgdGhlIGN1cnJlbnRseSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYm9vaykgYW5kIHRoZSBzZXBhcmF0ZWx5IHRyYW5zbWl0dGVkICdsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCcgaW4gdGhpcyBmcmFtZSBhbmQgY2hhbm5lbC4gVGhlIG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgZGVjb2RlZCBiaXRzIGlzIGNvdW50ZWQgKGZvciBQQ1dzIG9ubHkgLS0gdGhlcmUgaXQgbWFrZXMgcmVhbGx5IHNlbnNlIGluIG15IG9waW5pb24pLiBJZiB0aGlzIG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWVkcyB0aGUgYm9yZGVyIChkZXJpdmVkIGFzIG1pbmltdW0gLS0gc2VlIGFib3ZlKSwgYSBlcnJvciBpcyBkZXRlY3RlZC4gKi8KKy8qIGlmIGEgY29kZXdvcmQgaXMgZGVjb2RlZCB0aGVyZSBleGlzdHMgYSBib3JkZXIgZm9yIHRoZSBudW1iZXIgb2YgYml0cywgd2hpY2gKKyAgIGFyZSBhbGxvd2VkIHRvIHJlYWQgZm9yIHRoaXMgY29kZXdvcmQuIFRoaXMgYm9yZGVyIGlzIHRoZSBtaW5pbXVtIG9mIHRoZQorICAgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGNvZGV3b3JkIChmb3IgdGhlIGN1cnJlbnRseSB1c2VkIGNvZGVib29rKSBhbmQgdGhlCisgICBzZXBhcmF0ZWx5IHRyYW5zbWl0dGVkICdsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCcgaW4gdGhpcyBmcmFtZSBhbmQgY2hhbm5lbC4KKyAgIFRoZSBudW1iZXIgb2YgZGVjb2RlZCBiaXRzIGlzIGNvdW50ZWQgKGZvciBQQ1dzIG9ubHkgLS0gdGhlcmUgaXQgbWFrZXMgcmVhbGx5CisgICBzZW5zZSBpbiBteSBvcGluaW9uKS4gSWYgdGhpcyBudW1iZXIgZXhjZWVkcyB0aGUgYm9yZGVyIChkZXJpdmVkIGFzIG1pbmltdW0KKyAgIC0tIHNlZSBhYm92ZSksIGEgZXJyb3IgaXMgZGV0ZWN0ZWQuICovCiAKLSNkZWZpbmUgU1RBVEVfTUFDSElORV9FUlJPUl9DSEVDSyAgICAgICAgIDEgIC8qIHRlc3QgaWYgdGhlIG51bWJlciBvZiByZW1haW5pbmcgYml0cyBpbiBhIHNlZ21lbnQgaXMgX2JlbG93XyB6ZXJvLiBJZiB0aGVyZSBhcmUgbm8gZXJyb3JzIHRoZSBsb3dlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgdmFsdWUgZm9yIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQgaXMgemVyby4gVGhpcyBjaGVjayBhbHNvIGNvdWxkIGJlIHNldCB0byB6ZXJvIChzYXZlIHJ1bnRpbWUpICovCi0gIC8qIG90aGVyICovCi0jZGVmaW5lIFZBTElEX0xBVl9FUlJPUl9UUklHR0VSICAgICAgICAgICAxICAvKiB3aGVuIHNldCB0byAnMScsIGF2b2lkIHNldHRpbmcgdGhlIExBVi1GbGFnIGluIGVycm9yTG9nIGR1ZSB0byBhIHByZXZpb3VzLWxpbmUtbWFya2luZyAoYXQgUENXIGRlY29kZXIpLiBBIGxpdHRsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBydW50aW1lIGlzIG5lZWRlZCB0aGVuIHdoZW4gd3JpdGluZyB2YWx1ZXMgb3V0IGludG8gb3V0cHV0LWJ1ZmZlci4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUaGlzIGVycm9yIGNoZWNrIGNvdWxkIGJlIHNldCB0byB6ZXJvIGJlY2F1c2UgZHVlIHRvIGEgdGVzdCB3aXRoaW4KKyAgIFJWTEMtRXNjYXBlLWh1ZmZtYW4tRGVjb2RlciBhIHRvbyBsb25nIGNvZGV3b3JkIGNvdWxkIG5vdCBiZSBkZXRlY3RlZCAtLSBpdAorICAgc2VlbXMgdGhhdCBmb3IgUlZMQy1Fc2NhcGUtQ29kZXdvcmQgdGhlIGNvZGVyb29tIGlzIHVzZWQgdG8gMTAwJS4gVGhlcmVmb3JlIEkKKyAgIGFzc3VtZSB0aGF0IHRoZSBjb2Rlcm9vbSBpcyB1c2VkIHRvIDEwMCUgYWxzbyBmb3IgdGhlIGNvZGVib29rcyAxLi4xMSB1c2VkIGF0CisgICBIQ1IgVGhlcmVmb3JlIHRoaXMgdGVzdCBpcyBkZWFjdGl2YXRlZCBwZW5kaW5nIGZ1cnRoZXIgbm90aWNlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKLSNkZWZpbmUgSENSX0xJU1RFTl9UT19NVVRFRF9MSU5FUyAgICAgICAgIDAgIC8qIGxpc3RlbiB0byB0aGUgImVycm9yLWNvbmNlYWxtZW50IiBmb3IgdGVzdGluZyAqLworLyogdGVzdCBpZiB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBiaXRzIGluIGEgc2VnbWVudCBpcyBfYmVsb3dfIHplcm8uIElmIHRoZXJlCisgICBhcmUgbm8gZXJyb3JzIHRoZSBsb3dlc3QgYWxsb3dlZCB2YWx1ZSBmb3IgcmVtYWluaW5nQml0c0luU2VnbWVudCBpcyB6ZXJvLgorICAgVGhpcyBjaGVjayBhbHNvIGNvdWxkIGJlIHNldCB0byB6ZXJvIChzYXZlIHJ1bnRpbWUpICovCisKKy8qIG90aGVyICovCisvKiB3aGVuIHNldCB0byAnMScsIGF2b2lkIHNldHRpbmcgdGhlIExBVi1GbGFnIGluIGVycm9yTG9nIGR1ZSB0byBhCisgICBwcmV2aW91cy1saW5lLW1hcmtpbmcgKGF0IFBDVyBkZWNvZGVyKS4gQSBsaXR0bGUgbW9yZSBydW50aW1lIGlzIG5lZWRlZCB0aGVuCisgICB3aGVuIHdyaXRpbmcgdmFsdWVzIG91dCBpbnRvIG91dHB1dC1idWZmZXIuICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogLSAgICBjb25jZWFsIEhDUiBlcnJvcnMgICAgICAtICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2RlZmluZSBIQ1JfRVJST1JfQ09OQ0VBTE1FTlQgICAgICAgICAgICAgMSAgLyogaWYgc2V0IHRvICcxJywgSENSIF9tdXRlc18gdGhlIGVycmVkIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMgKi8KLQorI2RlZmluZSBIQ1JfRVJST1JfQ09OQ0VBTE1FTlQgXAorICAxIC8qIGlmIHNldCB0byAnMScsIEhDUiBfbXV0ZXNfIHRoZSBlcnJlZCBxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzICovCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTG9nOiBBIHdvcmQgb2YgMzIgYml0cyB1c2VkIGZvciBsb2dnaW5nIHBvc3NpYmxlIGVycm9ycyB3aXRoaW4gSENSCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2YgZGlzdG9ydGVkIGJpdHN0cmVhbXMuIFRhYmxlIG9mIGFsbCBrbm93biBlcnJvcnM6CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JMb2c6IEEgd29yZCBvZiAzMiBiaXRzIHVzZWQgZm9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZyBwb3NzaWJsZSBlcnJvcnMgd2l0aGluIEhDUgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIGRpc3RvcnRlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW1zLiBUYWJsZSBvZiBhbGwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd24gZXJyb3JzOgogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCAgZmF0YWwgIGxvY2F0aW9uICAgIG1lYW5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2RlZmluZSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWSAgICAgICAgICAgMHg4MDAwMDAwMCAvLyAgMzEgICBubyAgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXIGRlY29kaW5nIGl0IGlzIGNoZWNrZWQgYWZ0ZXIgZXZlcnkgUENXIGlmIHRoZXJlIGFyZSB0b28gbWFueSBiaXRzIGRlY29kZWQgKGltbWVkaWF0ZSBjaGVjaykuCi0jZGVmaW5lIFNFR01FTlRfT1ZFUlJJREVfRVJSX1BDV19CT0RZX1NJR04gICAgICAweDQwMDAwMDAwIC8vICAzMCAgIG5vICAgIFBDVy1EZWMgICAgIER1cmluZyBQQ1cgZGVjb2RpbmcgaXQgaXMgY2hlY2tlZCBhZnRlciBldmVyeSBQQ1cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGJpdHMgZGVjb2RlZCAoaW1tZWRpYXRlIGNoZWNrKS4KLSNkZWZpbmUgU0VHTUVOVF9PVkVSUklERV9FUlJfUENXX0JPRFlfU0lHTl9FU0MgIDB4MjAwMDAwMDAgLy8gIDI5ICAgbm8gICAgUENXLURlYyAgICAgRHVyaW5nIFBDVyBkZWNvZGluZyBpdCBpcyBjaGVja2VkIGFmdGVyIGV2ZXJ5IFBDVyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYml0cyBkZWNvZGVkIChpbW1lZGlhdGUgY2hlY2spLgotI2RlZmluZSBFWFRFTkRFRF9TT1JURURfQ09VTlRFUl9PVkVSRkxPVyAgICAgICAgMHgxMDAwMDAwMCAvLyAgMjggICB5ZXMgICBJbml0LURlYyAgICBFcnJvciBkdXJpbmcgZXh0ZW5kaW5nIHNpZGVpbmZvIChuZWl0aGVyIGEgUENXIG5vciBhIG5vblBDVyB3YXMgZGVjb2RlZCBzbyBmYXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDA4MDAwMDAwIC8vICAyNyAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDA0MDAwMDAwIC8vICAyNiAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAyMDAwMDAwIC8vICAyNSAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAxMDAwMDAwIC8vICAyNCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwODAwMDAwIC8vICAyMyAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwNDAwMDAwIC8vICAyMiAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMjAwMDAwIC8vICAyMSAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMTAwMDAwIC8vICAyMCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisvLyBiaXQgIGZhdGFsICBsb2NhdGlvbiAgICBtZWFuaW5nCisvLyAtLS0tKy0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFNFR01FTlRfT1ZFUlJJREVfRVJSX1BDV19CT0RZIFwKKyAgMHg4MDAwMDAwMCAgLy8gIDMxICAgbm8gICAgUENXLURlYyAgICAgRHVyaW5nIFBDVyBkZWNvZGluZyBpdCBpcyBjaGVja2VkIGFmdGVyCisgICAgICAgICAgICAgIC8vICBldmVyeSBQQ1cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGJpdHMgZGVjb2RlZCAoaW1tZWRpYXRlCisgICAgICAgICAgICAgIC8vICBjaGVjaykuCisjZGVmaW5lIFNFR01FTlRfT1ZFUlJJREVfRVJSX1BDV19CT0RZX1NJR04gXAorICAweDQwMDAwMDAwICAvLyAgMzAgICBubyAgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXIGRlY29kaW5nIGl0IGlzIGNoZWNrZWQgYWZ0ZXIKKyAgICAgICAgICAgICAgLy8gIGV2ZXJ5IFBDVyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYml0cyBkZWNvZGVkIChpbW1lZGlhdGUKKyAgICAgICAgICAgICAgLy8gIGNoZWNrKS4KKyNkZWZpbmUgU0VHTUVOVF9PVkVSUklERV9FUlJfUENXX0JPRFlfU0lHTl9FU0MgXAorICAweDIwMDAwMDAwICAvLyAgMjkgICBubyAgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXIGRlY29kaW5nIGl0IGlzIGNoZWNrZWQgYWZ0ZXIKKyAgICAgICAgICAgICAgLy8gIGV2ZXJ5IFBDVyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYml0cyBkZWNvZGVkIChpbW1lZGlhdGUKKyAgICAgICAgICAgICAgLy8gIGNoZWNrKS4KKyNkZWZpbmUgRVhURU5ERURfU09SVEVEX0NPVU5URVJfT1ZFUkZMT1cgXAorICAweDEwMDAwMDAwICAvLyAgMjggICB5ZXMgICBJbml0LURlYyAgICBFcnJvciBkdXJpbmcgZXh0ZW5kaW5nIHNpZGVpbmZvCisgICAgICAgICAgICAgIC8vICAobmVpdGhlciBhIFBDVyBub3IgYSBub25QQ1cgd2FzIGRlY29kZWQgc28gZmFyKQorICAgICAgICAgICAgICAvLyAweDA4MDAwMDAwIC8vICAyNyAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgIC8vIDB4MDQwMDAwMDAgLy8gIDI2ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgLy8gMHgwMjAwMDAwMCAvLyAgMjUgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAorICAgICAgICAgICAgICAvLyAweDAxMDAwMDAwIC8vICAyNCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgIC8vIDB4MDA4MDAwMDAgLy8gIDIzICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgLy8gMHgwMDQwMDAwMCAvLyAgMjIgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAorICAgICAgICAgICAgICAvLyAweDAwMjAwMDAwIC8vICAyMSAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgIC8vIDB4MDAxMDAwMDAgLy8gIDIwICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWwgZXJyb3JzICovCi0jZGVmaW5lIFRPT19NQU5ZX1BDV19CT0RZX0JJVFNfREVDT0RFRCAgICAgICAgICAweDAwMDgwMDAwIC8vICAxOSAgIHllcyAgIFBDVy1EZWMgICAgIER1cmluZyBQQ1ctYm9keS1kZWNvZGluZyB0b28gbWFueSBiaXRzIGhhdmUgYmVlbiByZWFkIGZyb20gYml0c3RyZWFtIC0tIGFkdmljZTogc2tpcCBub24tUENXIGRlY29kaW5nCi0jZGVmaW5lIFRPT19NQU5ZX1BDV19CT0RZX1NJR05fQklUU19ERUNPREVEICAgICAweDAwMDQwMDAwIC8vICAxOCAgIHllcyAgIFBDVy1EZWMgICAgIER1cmluZyBQQ1ctYm9keS1zaWduLWRlY29kaW5nIHRvbyBtYW55IGJpdHMgaGF2ZSBiZWVuIHJlYWQgZnJvbSBiaXRzdHJlYW0gLS0gYWR2aWNlOiBza2lwIG5vbi1QQ1cgZGVjb2RpbmcKLSNkZWZpbmUgVE9PX01BTllfUENXX0JPRFlfU0lHTl9FU0NfQklUU19ERUNPREVEIDB4MDAwMjAwMDAgLy8gIDE3ICAgeWVzICAgUENXLURlYyAgICAgRHVyaW5nIFBDVy1ib2R5LXNpZ24tZXNjLWRlY29kaW5nIHRvbyBtYW55IGJpdHMgaGF2ZSBiZWVuIHJlYWQgZnJvbSBiaXRzdHJlYW0gLS0gYWR2aWNlOiBza2lwIG5vbi1QQ1cgZGVjb2RpbmcKKy8qIHNwZWNpYWwgZXJyb3JzICovCisjZGVmaW5lIFRPT19NQU5ZX1BDV19CT0RZX0JJVFNfREVDT0RFRCBcCisgIDB4MDAwODAwMDAgIC8vICAxOSAgIHllcyAgIFBDVy1EZWMgICAgIER1cmluZyBQQ1ctYm9keS1kZWNvZGluZyB0b28gbWFueSBiaXRzCisgICAgICAgICAgICAgIC8vICBoYXZlIGJlZW4gcmVhZCBmcm9tIGJpdHN0cmVhbSAtLSBhZHZpY2U6IHNraXAgbm9uLVBDVyBkZWNvZGluZworI2RlZmluZSBUT09fTUFOWV9QQ1dfQk9EWV9TSUdOX0JJVFNfREVDT0RFRCBcCisgIDB4MDAwNDAwMDAgIC8vICAxOCAgIHllcyAgIFBDVy1EZWMgICAgIER1cmluZyBQQ1ctYm9keS1zaWduLWRlY29kaW5nIHRvbyBtYW55CisgICAgICAgICAgICAgIC8vICBiaXRzIGhhdmUgYmVlbiByZWFkIGZyb20gYml0c3RyZWFtIC0tIGFkdmljZTogc2tpcCBub24tUENXCisgICAgICAgICAgICAgIC8vICBkZWNvZGluZworI2RlZmluZSBUT09fTUFOWV9QQ1dfQk9EWV9TSUdOX0VTQ19CSVRTX0RFQ09ERUQgXAorICAweDAwMDIwMDAwICAvLyAgMTcgICB5ZXMgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXLWJvZHktc2lnbi1lc2MtZGVjb2RpbmcgdG9vCisgICAgICAgICAgICAgIC8vICBtYW55IGJpdHMgaGF2ZSBiZWVuIHJlYWQgZnJvbSBiaXRzdHJlYW0gLS0gYWR2aWNlOiBza2lwCisgICAgICAgICAgICAgIC8vICBub24tUENXIGRlY29kaW5nCiAKKy8vIDB4MDAwMTAwMDAgLy8gIDE2ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQKKyNkZWZpbmUgU1RBVEVfRVJST1JfQk9EWV9PTkxZIFwKKyAgMHgwMDAwODAwMCAgLy8gIDE1ICAgbm8gICAgTm9uUENXLURlYyAgU3RhdGUgbWFjaGluZSByZXR1cm5lZCB3aXRoIGVycm9yCisjZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9fQk9EWSBcCisgIDB4MDAwMDQwMDAgIC8vICAxNCAgIG5vICAgIE5vblBDVy1EZWMgIFN0YXRlIG1hY2hpbmUgcmV0dXJuZWQgd2l0aCBlcnJvcgorI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX1NJR05fX1NJR04gXAorICAweDAwMDAyMDAwICAvLyAgMTMgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKKyNkZWZpbmUgU1RBVEVfRVJST1JfQk9EWV9TSUdOX0VTQ19fQk9EWSBcCisgIDB4MDAwMDEwMDAgIC8vICAxMiAgIG5vICAgIE5vblBDVy1EZWMgIFN0YXRlIG1hY2hpbmUgcmV0dXJuZWQgd2l0aCBlcnJvcgorI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX1NJR05fRVNDX19TSUdOIFwKKyAgMHgwMDAwMDgwMCAgLy8gIDExICAgbm8gICAgTm9uUENXLURlYyAgU3RhdGUgbWFjaGluZSByZXR1cm5lZCB3aXRoIGVycm9yCisjZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVggXAorICAweDAwMDAwNDAwICAvLyAgMTAgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKKyNkZWZpbmUgU1RBVEVfRVJST1JfQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQgXAorICAweDAwMDAwMjAwICAvLyAgIDkgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKKyNkZWZpbmUgSENSX1NJX0xFTkdUSFNfRkFJTFVSRSBcCisgIDB4MDAwMDAxMDAgIC8vICAgOCAgIHllcyAgIEluaXQtRGVjICAgIExlbmd0aE9mTG9uZ2VzdENvZGV3b3JkIG11c3Qgbm90IGJlCisgICAgICAgICAgICAgIC8vICAgbGVzcyB0aGFuIGxlbmdodE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhCisjZGVmaW5lIE5VTV9TRUNUX09VVF9PRl9SQU5HRV9TSE9SVF9CTE9DSyBcCisgIDB4MDAwMDAwODAgIC8vICAgNyAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgaXMgbm90IHdpdGhpbgorICAgICAgICAgICAgICAvLyAgIHRoZSBhbGxvd2VkIHJhbmdlIChzaG9ydCBibG9jaykKKyNkZWZpbmUgTlVNX1NFQ1RfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0sgXAorICAweDAwMDAwMDQwICAvLyAgIDYgICB5ZXMgICBJbml0LURlYyAgICBUaGUgbnVtYmVyIG9mIHNlY3Rpb25zIGlzIG5vdCB3aXRoaW4KKyAgICAgICAgICAgICAgLy8gICB0aGUgYWxsb3dlZCByYW5nZSAobG9uZyBibG9jaykKKyNkZWZpbmUgTElORV9JTl9TRUNUX09VVF9PRl9SQU5HRV9TSE9SVF9CTE9DSyBcCisgIDB4MDAwMDAwMjAgIC8vICAgNSAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBudW1iZXIgb2YgbGluZXMgcGVyIHNlY3Rpb24gaXMgbm90CisgICAgICAgICAgICAgIC8vICAgd2l0aGluIHRoZSBhbGxvd2VkIHJhbmdlIChzaG9ydCBibG9jaykKKyNkZWZpbmUgQ0JfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLIFwKKyAgMHgwMDAwMDAxMCAgLy8gICA0ICAgeWVzICAgSW5pdC1EZWMgICAgVGhlIGNvZGVib29rIGlzIG5vdCB3aXRoaW4gdGhlIGFsbG93ZWQKKyAgICAgICAgICAgICAgLy8gICByYW5nZSAoc2hvcnQgYmxvY2spCisjZGVmaW5lIExJTkVfSU5fU0VDVF9PVVRfT0ZfUkFOR0VfTE9OR19CTE9DSyBcCisgIDB4MDAwMDAwMDggIC8vICAgMyAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBudW1iZXIgb2YgbGluZXMgcGVyIHNlY3Rpb24gaXMgbm90CisgICAgICAgICAgICAgIC8vICAgd2l0aGluIHRoZSBhbGxvd2VkIHJhbmdlIChsb25nIGJsb2NrKQorI2RlZmluZSBDQl9PVVRfT0ZfUkFOR0VfTE9OR19CTE9DSyBcCisgIDB4MDAwMDAwMDQgIC8vICAgMiAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBjb2RlYm9vayBpcyBub3Qgd2l0aGluIHRoZSBhbGxvd2VkCisgICAgICAgICAgICAgIC8vICAgcmFuZ2UgKGxvbmcgYmxvY2spCisjZGVmaW5lIExBVl9WSU9MQVRJT04gXAorICAweDAwMDAwMDAyICAvLyAgIDEgICBubyAgICBGaW5hbCAgICAgICBUaGUgYWJzb2x1dGUgdmFsdWUgb2YgYXQgbGVhc3Qgb25lCisgICAgICAgICAgICAgIC8vICAgZGVjb2RlZCBsaW5lIHdhcyB0b28gaGlnaCBmb3IgdGhlIGFjY29yZGluZyBjb2RlYm9vay4KKyNkZWZpbmUgQklUX0lOX1NFR01FTlRBVElPTl9FUlJPUiBcCisgIDB4MDAwMDAwMDEgIC8vICAgMCAgIG5vICAgIEZpbmFsICAgICAgIEFmdGVyIFBDVyBhbmQgbm9uLVBXQy1kZWNvZGluZyBhdCBsZWFzdAorICAgICAgICAgICAgICAvLyAgIG9uZSBzZWdtZW50IGlzIG5vdCB6ZXJvIChnbG9iYWwgY2hlY2spLgogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMDEwMDAwIC8vICAxNiAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCi0jZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfT05MWSAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwIC8vICAxNSAgIG5vICAgIE5vblBDVy1EZWMgIFN0YXRlIG1hY2hpbmUgcmV0dXJuZWQgd2l0aCBlcnJvcgotI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX1NJR05fX0JPRFkgICAgICAgICAgICAgMHgwMDAwNDAwMCAvLyAgMTQgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKLSNkZWZpbmUgU1RBVEVfRVJST1JfQk9EWV9TSUdOX19TSUdOICAgICAgICAgICAgIDB4MDAwMDIwMDAgLy8gIDEzICAgbm8gICAgTm9uUENXLURlYyAgU3RhdGUgbWFjaGluZSByZXR1cm5lZCB3aXRoIGVycm9yCi0jZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0JPRFkgICAgICAgICAweDAwMDAxMDAwIC8vICAxMiAgIG5vICAgIE5vblBDVy1EZWMgIFN0YXRlIG1hY2hpbmUgcmV0dXJuZWQgd2l0aCBlcnJvcgotI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX1NJR05fRVNDX19TSUdOICAgICAgICAgMHgwMDAwMDgwMCAvLyAgMTEgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKLSNkZWZpbmUgU1RBVEVfRVJST1JfQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWCAgIDB4MDAwMDA0MDAgLy8gIDEwICAgbm8gICAgTm9uUENXLURlYyAgU3RhdGUgbWFjaGluZSByZXR1cm5lZCB3aXRoIGVycm9yCi0jZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEICAgICAweDAwMDAwMjAwIC8vICAgOSAgIG5vICAgIE5vblBDVy1EZWMgIFN0YXRlIG1hY2hpbmUgcmV0dXJuZWQgd2l0aCBlcnJvcgotI2RlZmluZSBIQ1JfU0lfTEVOR1RIU19GQUlMVVJFICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAvLyAgIDggICB5ZXMgICBJbml0LURlYyAgICBMZW5ndGhPZkxvbmdlc3RDb2Rld29yZCBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gbGVuZ2h0T2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEKLSNkZWZpbmUgTlVNX1NFQ1RfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLICAgICAgIDB4MDAwMDAwODAgLy8gICA3ICAgeWVzICAgSW5pdC1EZWMgICAgVGhlIG51bWJlciBvZiBzZWN0aW9ucyBpcyBub3Qgd2l0aGluIHRoZSBhbGxvd2VkIHJhbmdlIChzaG9ydCBibG9jaykKLSNkZWZpbmUgTlVNX1NFQ1RfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0sgICAgICAgIDB4MDAwMDAwNDAgLy8gICA2ICAgeWVzICAgSW5pdC1EZWMgICAgVGhlIG51bWJlciBvZiBzZWN0aW9ucyBpcyBub3Qgd2l0aGluIHRoZSBhbGxvd2VkIHJhbmdlIChsb25nIGJsb2NrKQotI2RlZmluZSBMSU5FX0lOX1NFQ1RfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLICAgMHgwMDAwMDAyMCAvLyAgIDUgICB5ZXMgICBJbml0LURlYyAgICBUaGUgbnVtYmVyIG9mIGxpbmVzIHBlciBzZWN0aW9uIGlzIG5vdCB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UgKHNob3J0IGJsb2NrKQotI2RlZmluZSBDQl9PVVRfT0ZfUkFOR0VfU0hPUlRfQkxPQ0sgICAgICAgICAgICAgMHgwMDAwMDAxMCAvLyAgIDQgICB5ZXMgICBJbml0LURlYyAgICBUaGUgY29kZWJvb2sgaXMgbm90IHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZSAoc2hvcnQgYmxvY2spCi0jZGVmaW5lIExJTkVfSU5fU0VDVF9PVVRfT0ZfUkFOR0VfTE9OR19CTE9DSyAgICAweDAwMDAwMDA4IC8vICAgMyAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBudW1iZXIgb2YgbGluZXMgcGVyIHNlY3Rpb24gaXMgbm90IHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZSAobG9uZyBibG9jaykKLSNkZWZpbmUgQ0JfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0sgICAgICAgICAgICAgIDB4MDAwMDAwMDQgLy8gICAyICAgeWVzICAgSW5pdC1EZWMgICAgVGhlIGNvZGVib29rIGlzIG5vdCB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UgKGxvbmcgYmxvY2spCi0jZGVmaW5lIExBVl9WSU9MQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyIC8vICAgMSAgIG5vICAgIEZpbmFsICAgICAgIFRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhdCBsZWFzdCBvbmUgZGVjb2RlZCBsaW5lIHdhcyB0b28gaGlnaCBmb3IgdGhlIGFjY29yZGluZyBjb2RlYm9vay4KLSNkZWZpbmUgQklUX0lOX1NFR01FTlRBVElPTl9FUlJPUiAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgLy8gICAwICAgbm8gICAgRmluYWwgICAgICAgQWZ0ZXIgUENXIGFuZCBub24tUFdDLWRlY29kaW5nIGF0IGxlYXN0IG9uZSBzZWdtZW50IGlzIG5vdCB6ZXJvIChnbG9iYWwgY2hlY2spLgorLyotLS0tLS0tLS0tKi8KKyNkZWZpbmUgSENSX0ZBVEFMX1BDV19FUlJPUl9NQVNLIDB4MTAwRTAxRkMKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLSovCi0jZGVmaW5lIEhDUl9GQVRBTF9QQ1dfRVJST1JfTUFTSyAgICAgICAgICAgICAgICAweDEwMEUwMUZDCi0KLQotdHlwZWRlZiBlbnVtIHsKLSAgUENXX0JPRFksCi0gIFBDV19CT0RZX1NJR04sCi0gIFBDV19CT0RZX1NJR05fRVNDCi19IFBDV19UWVBFOwotCit0eXBlZGVmIGVudW0geyBQQ1dfQk9EWSwgUENXX0JPRFlfU0lHTiwgUENXX0JPRFlfU0lHTl9FU0MgfSBQQ1dfVFlQRTsKIAogLyogaW50ZXJmYWNlIERlY29kZXIgPC0tLT4gSENSICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIFVJTlQgICAgICAgICAgZXJyb3JMb2c7Ci0gIFNQRUNUUkFMX1BUUiAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZTsKLSAgaW50ICAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKLSAgU0hPUlQgICAgICAgICBsZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsKLSAgU0hPUlQgICAgICAgICBudW1TZWN0aW9uOwotICBTSE9SVCAgICAgICAgKnBOdW1MaW5lSW5TZWN0OwotICBVU0hPUlQgICAgICAgIGJpdHN0cmVhbUluZGV4OwotICBTQ0hBUiAgICAgICAgIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkOwotICBVQ0hBUiAgICAgICAgKnBDb2RlYm9vazsKKyAgVUlOVCBlcnJvckxvZzsKKyAgU1BFQ1RSQUxfUFRSIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2U7CisgIGludCBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKKyAgU0hPUlQgbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7CisgIFNIT1JUIG51bVNlY3Rpb247CisgIFNIT1JUICpwTnVtTGluZUluU2VjdDsKKyAgSU5UIGJpdHN0cmVhbUFuY2hvcjsKKyAgU0NIQVIgbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQ7CisgIFVDSEFSICpwQ29kZWJvb2s7CiB9IEhDUl9JTlBVVF9PVVRQVVQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTI4Nyw4MCArMzYwLDczIEBACiAgIGNvbnN0IFVDSEFSICpwTWF4T2ZDYlBhaXI7CiB9IEhDUl9DQl9QQUlSUzsKIAotdHlwZWRlZiBzdHJ1Y3R7Cit0eXBlZGVmIHN0cnVjdCB7CiAgIGNvbnN0IFVTSE9SVCAqcExhcmdlc3RBYnNWYWw7Ci0gIGNvbnN0IFVDSEFSICAqcE1heEN3TGVuZ3RoOwotICBjb25zdCBVQ0hBUiAgKnBDYkRpbWVuc2lvbjsKLSAgY29uc3QgVUNIQVIgICpwQ2JEaW1TaGlmdDsKLSAgY29uc3QgVUNIQVIgICpwQ2JTaWduOwotICBjb25zdCBVQ0hBUiAgKnBDYlByaW9yaXR5OworICBjb25zdCBVQ0hBUiAqcE1heEN3TGVuZ3RoOworICBjb25zdCBVQ0hBUiAqcENiRGltZW5zaW9uOworICBjb25zdCBVQ0hBUiAqcENiRGltU2hpZnQ7CisgIGNvbnN0IFVDSEFSICpwQ2JTaWduOworICBjb25zdCBVQ0hBUiAqcENiUHJpb3JpdHk7CiB9IEhDUl9UQUJMRV9JTkZPOwogCi10eXBlZGVmIHN0cnVjdHsKLSAgVUlOVCAgICAgIG51bVNlZ21lbnQ7Ci0gIFVJTlQgICAgICBwU2VnbWVudEJpdGZpZWxkWygoMTAyND4+MSkvTlVNQkVSX09GX0JJVF9JTl9XT1JEKzEpXTsKLSAgVUlOVCAgICAgIHBDb2Rld29yZEJpdGZpZWxkWygoMTAyND4+MSkvTlVNQkVSX09GX0JJVF9JTl9XT1JEKzEpXTsKLSAgVUlOVCAgICAgIHNlZ21lbnRPZmZzZXQ7Ci0gIEZJWFBfREJMICBwVGVtcFZhbHVlc1sxMDI0XTsKLSAgVVNIT1JUICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnRbMTAyND4+MV07Ci0gIFVTSE9SVCAgICBwUmlnaHRTdGFydE9mU2VnbWVudFsxMDI0Pj4xXTsKLSAgU0NIQVIgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50WzEwMjQ+PjFdOwotICBVQ0hBUiAgICAgcmVhZERpcmVjdGlvbjsKLSAgVUNIQVIgICAgIG51bVdvcmRGb3JCaXRmaWVsZDsKLSAgVVNIT1JUICAgIHBOdW1CaXRWYWxpZEluTGFzdFdvcmQ7Cit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgbnVtU2VnbWVudDsKKyAgVUlOVCBwU2VnbWVudEJpdGZpZWxkWygoMTAyNCA+PiAxKSAvIE5VTUJFUl9PRl9CSVRfSU5fV09SRCArIDEpXTsKKyAgVUlOVCBwQ29kZXdvcmRCaXRmaWVsZFsoKDEwMjQgPj4gMSkgLyBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgKyAxKV07CisgIFVJTlQgc2VnbWVudE9mZnNldDsKKyAgSU5UIHBMZWZ0U3RhcnRPZlNlZ21lbnRbMTAyNCA+PiAxXTsKKyAgSU5UIHBSaWdodFN0YXJ0T2ZTZWdtZW50WzEwMjQgPj4gMV07CisgIFNDSEFSIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50WzEwMjQgPj4gMV07CisgIFVDSEFSIHJlYWREaXJlY3Rpb247CisgIFVDSEFSIG51bVdvcmRGb3JCaXRmaWVsZDsKKyAgVVNIT1JUIHBOdW1CaXRWYWxpZEluTGFzdFdvcmQ7CiB9IEhDUl9TRUdNRU5UX0lORk87CiAKLXR5cGVkZWYgc3RydWN0ewordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UIG51bUNvZGV3b3JkOworICBVSU5UIG51bVNvcnRlZFNlY3Rpb247CisgIFVTSE9SVCBwTnVtQ29kZXdvcmRJblNlY3Rpb25bTUFYX1NGQl9IQ1JdOworICBVU0hPUlQgcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW01BWF9TRkJfSENSXTsKKyAgVVNIT1JUIHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW01BWF9TRkJfSENSICsgTUFYX0hDUl9TRVRTXTsKKyAgaW50IG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7CisgIFVTSE9SVCBwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c1tNQVhfSENSX1NFVFNdOworICBpbnQgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKKyAgVVNIT1JUIHBSZW9yZGVyT2Zmc2V0W01BWF9TRkJfSENSXTsKKyAgVUNIQVIgcFNvcnRlZENvZGVib29rW01BWF9TRkJfSENSXTsKIAotICBVSU5UICAgIG51bUNvZGV3b3JkOwotICBVSU5UICAgIG51bVNvcnRlZFNlY3Rpb247Ci0gIFVTSE9SVCAgcE51bUNvZGV3b3JkSW5TZWN0aW9uW01BWF9TRkJfSENSXTsKLSAgVVNIT1JUICBwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bTUFYX1NGQl9IQ1JdOwotICBVU0hPUlQgIHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW01BWF9TRkJfSENSK01BWF9IQ1JfU0VUU107Ci0gIGludCAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKLSAgVVNIT1JUICBwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c1tNQVhfSENSX1NFVFNdOwotICBpbnQgICAgIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHg7Ci0gIFVTSE9SVCAgcFJlb3JkZXJPZmZzZXRbTUFYX1NGQl9IQ1JdOwotICBVQ0hBUiAgIHBTb3J0ZWRDb2RlYm9va1tNQVhfU0ZCX0hDUl07Ci0KLSAgVUNIQVIgICBwRXh0ZW5kZWRTb3J0ZWRDb2RlYm9va1tNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFNdOwotICBpbnQgICAgIGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7Ci0jaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCi0gIFVDSEFSICAgcE1heExlbk9mQ2JJbkV4dFNydFNlY1tNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFNdOwotICBpbnQgICAgIG1heExlbk9mQ2JJbkV4dFNydFNlY0lkeDsKLSNlbmRpZgotICBVQ0hBUiAgIHBDb2RlYm9va1N3aXRjaFtNQVhfU0ZCX0hDUl07CisgIFVDSEFSIHBFeHRlbmRlZFNvcnRlZENvZGVib29rW01BWF9TRkJfSENSICsgTUFYX0hDUl9TRVRTXTsKKyAgaW50IGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7CisgIFVDSEFSIHBNYXhMZW5PZkNiSW5FeHRTcnRTZWNbTUFYX1NGQl9IQ1IgKyBNQVhfSENSX1NFVFNdOworICBpbnQgbWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4OworICBVQ0hBUiBwQ29kZWJvb2tTd2l0Y2hbTUFYX1NGQl9IQ1JdOwogfSBIQ1JfU0VDVElPTl9JTkZPOwogCi10eXBlZGVmIFVJTlQgKCpTVEFURUZVTkMpKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7Cit0eXBlZGVmIFVJTlQgKCpTVEFURUZVTkMpKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkICopOwogCi10eXBlZGVmIHN0cnVjdHsKK3R5cGVkZWYgc3RydWN0IHsKICAgLyogd29yc3QtY2FzZSBhbmQgMTAyNC80IG5vbi1QQ1dzIGV4aXN0IGluIHdvcnN0LWNhc2UgKi8KLSAgRklYUF9EQkwgICpwUmVzdWx0QmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlIGFkZHJlc3MgZm9yIHNwZWN0cmFsIGRhdGEgb3V0cHV0IHRhcmdldCBidWZmZXIgKi8KLSAgVUlOVCAgICAgICBpTm9kZVsxMDI0Pj4yXTsgICAgICAgICAgIC8qIEhlbHBlciBpbmRpY2VzIGZvciBjb2RlIGJvb2tzICovCi0gIFVTSE9SVCAgICAgaVJlc3VsdFBvaW50ZXJbMTAyND4+Ml07ICAvKiBIZWxwZXIgaW5kaWNlcyBmb3IgYWNjZXNzaW5nIHBSZXN1bHRCYXNlICovCi0gIFVJTlQgICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1sxMDI0Pj4yXTsKLSAgVUlOVCAgICAgICBjb2Rld29yZE9mZnNldDsKLSAgU1RBVEVGVU5DICBwU3RhdGU7Ci0gIFVDSEFSICAgICAgcENvZGVib29rWzEwMjQ+PjJdOwotICBVQ0hBUiAgICAgIHBDbnRTaWduWzEwMjQ+PjJdOwotICAvKiB0aGlzIGFycmF5IGhvbGRzIHRoZSBzdGF0ZXMgY29kZWQgYXMgaW50ZWdlciB2YWx1ZXMgd2l0aGluIHRoZSByYW5nZSBbMCwxLC4uLDddICovCi0gIFNDSEFSICAgICAgcFN0YVsxMDI0Pj4yXTsKKyAgRklYUF9EQkwKKyAgKnBSZXN1bHRCYXNlOyAvKiBCYXNlIGFkZHJlc3MgZm9yIHNwZWN0cmFsIGRhdGEgb3V0cHV0IHRhcmdldCBidWZmZXIgKi8KKyAgVUlOVCBpTm9kZVsxMDI0ID4+IDJdOyAvKiBIZWxwZXIgaW5kaWNlcyBmb3IgY29kZSBib29rcyAqLworICBVU0hPUlQKKyAgaVJlc3VsdFBvaW50ZXJbMTAyNCA+PiAyXTsgLyogSGVscGVyIGluZGljZXMgZm9yIGFjY2Vzc2luZyBwUmVzdWx0QmFzZSAqLworICBVSU5UIHBFc2NhcGVTZXF1ZW5jZUluZm9bMTAyNCA+PiAyXTsKKyAgVUlOVCBjb2Rld29yZE9mZnNldDsKKyAgU1RBVEVGVU5DIHBTdGF0ZTsKKyAgVUNIQVIgcENvZGVib29rWzEwMjQgPj4gMl07CisgIFVDSEFSIHBDbnRTaWduWzEwMjQgPj4gMl07CisgIC8qIHRoaXMgYXJyYXkgaG9sZHMgdGhlIHN0YXRlcyBjb2RlZCBhcyBpbnRlZ2VyIHZhbHVlcyB3aXRoaW4gdGhlIHJhbmdlCisgICAqIFswLDEsLi4sN10gKi8KKyAgU0NIQVIgcFN0YVsxMDI0ID4+IDJdOwogfSBIQ1JfTk9OX1BDV19TSURFSU5GTzsKIAotdHlwZWRlZiBzdHJ1Y3R7Ci0gIEhDUl9JTlBVVF9PVVRQVVQgICAgICBkZWNJbk91dDsKLSAgSENSX0NCX1BBSVJTICAgICAgICAgIGNiUGFpcnM7Ci0gIEhDUl9UQUJMRV9JTkZPICAgICAgICB0YWJsZUluZm87Ci0gIEhDUl9TRUdNRU5UX0lORk8gICAgICBzZWdtZW50SW5mbzsKLSAgSENSX1NFQ1RJT05fSU5GTyAgICAgIHNlY3Rpb25JbmZvOwotICBIQ1JfTk9OX1BDV19TSURFSU5GTyAgbm9uUGN3U2lkZWluZm87Ci0KLSAgSU5UICAgICAgICAgICAgICAgICAgIGdsb2JhbEhjclR5cGU7Cit0eXBlZGVmIHN0cnVjdCB7CisgIEhDUl9JTlBVVF9PVVRQVVQgZGVjSW5PdXQ7CisgIEhDUl9TRUdNRU5UX0lORk8gc2VnbWVudEluZm87CisgIEhDUl9TRUNUSU9OX0lORk8gc2VjdGlvbkluZm87CisgIEhDUl9OT05fUENXX1NJREVJTkZPIG5vblBjd1NpZGVpbmZvOwogfSBDRXJIY3JJbmZvOwogCit0eXBlZGVmIENFckhjckluZm8gKkhfSENSX0lORk87CiAKLXR5cGVkZWYgIENFckhjckluZm8gICpIX0hDUl9JTkZPOwotCi0KLSNlbmRpZiAvKiBfQUFDREVDX0hDUl9UWVBFU19IXyAqLworI2VuZGlmIC8qIEFBQ0RFQ19IQ1JfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNycy5jcHAgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JzLmNwcAppbmRleCBjMGIyMTczLi4xZDVhYTI3IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JzLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JzLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMSArOTAsMTIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgUm9iZXJ0IFdlaWRuZXIgKERTUCBTb2x1dGlvbnMpCisKICAgIERlc2NyaXB0aW9uOiBIQ1IgRGVjb2RlcjogUHJlcGFyZSBkZWNvZGluZyBvZiBub24tUENXcywgc2VnbWVudGF0aW9uLSBhbmQKICAgICAgICAgICAgICAgICBiaXRmaWVsZC1oYW5kbGluZywgSENSLVN0YXRlbWFjaGluZQogCkBAIC05MSwxMTEgKzEwMywxMTMgQEAKIAogI2luY2x1ZGUgImFhY2RlY19oY3JzLmgiCiAKLQogI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKIAogI2luY2x1ZGUgImFhY2RlY19oY3JfYml0LmgiCiAjaW5jbHVkZSAiYWFjX3JvbS5oIgogI2luY2x1ZGUgImFhY19yYW0uaCIKIAotCi1zdGF0aWMgVUlOVCBJbml0U2VnbWVudEJpdGZpZWxkKFVJTlQgICAqcE51bVNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAqcFNlZ21lbnRCaXRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICpwTnVtV29yZEZvckJpdGZpZWxkLAorc3RhdGljIFVJTlQgSW5pdFNlZ21lbnRCaXRmaWVsZChVSU5UICpwTnVtU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwU2VnbWVudEJpdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcE51bVdvcmRGb3JCaXRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICpwTnVtQml0VmFsaWRJbkxhc3RXb3JkKTsKIAogc3RhdGljIHZvaWQgSW5pdE5vblBDV1NpZGVJbmZvcm1hdGlvbkZvckN1cnJlbnRTZXQoSF9IQ1JfSU5GTyBwSGNyKTsKIAogc3RhdGljIElOVCBNb2R1bG9WYWx1ZShJTlQgaW5wdXQsIElOVCBidWZmZXJsZW5ndGgpOwogCi1zdGF0aWMgdm9pZCBDbGVhckJpdEZyb21CaXRmaWVsZChTVEFURUZVTkMgKnB0clN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICpwQml0ZmllbGQpOwotCitzdGF0aWMgdm9pZCBDbGVhckJpdEZyb21CaXRmaWVsZChTVEFURUZVTkMgKnB0clN0YXRlLCBVSU5UIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBCaXRmaWVsZCk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgYWxsIG5vbi1wcmlvcml0eSBjb2Rld29yZHMgKG5vbi1QQ1dzKSBieSB1c2luZyBhCi0gICAgICAgICAgICAgICAgICBzdGF0ZS1tYWNoaW5lLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgIERlY29kZU5vblBDV3MoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIEhfSENSX0lORk8gcEhjcikKLXsKLSAgVUlOVCAgICBudW1WYWxpZFNlZ21lbnQ7Ci0gIElOVCAgICAgc2VnbWVudE9mZnNldDsKLSAgSU5UICAgICBjb2Rld29yZE9mZnNldEJhc2U7Ci0gIElOVCAgICAgY29kZXdvcmRPZmZzZXQ7Ci0gIFVJTlQgICAgdHJpYWw7CisgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgYWxsIG5vbi1wcmlvcml0eSBjb2Rld29yZHMgKG5vbi1QQ1dzKSBieQordXNpbmcgYSBzdGF0ZS1tYWNoaW5lLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCit2b2lkIERlY29kZU5vblBDV3MoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIEhfSENSX0lORk8gcEhjcikgeworICBVSU5UIG51bVZhbGlkU2VnbWVudDsKKyAgSU5UIHNlZ21lbnRPZmZzZXQ7CisgIElOVCBjb2Rld29yZE9mZnNldEJhc2U7CisgIElOVCBjb2Rld29yZE9mZnNldDsKKyAgVUlOVCB0cmlhbDsKIAotICBVSU5UICAgKnBOdW1TZWdtZW50OwotICBTQ0hBUiAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVSU5UICAgKnBTZWdtZW50Qml0ZmllbGQ7Ci0gIFVDSEFSICAqcE51bVdvcmRGb3JCaXRmaWVsZDsKKyAgVUlOVCAqcE51bVNlZ21lbnQ7CisgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgVUlOVCAqcFNlZ21lbnRCaXRmaWVsZDsKKyAgVUNIQVIgKnBOdW1Xb3JkRm9yQml0ZmllbGQ7CiAgIFVTSE9SVCAqcE51bUJpdFZhbGlkSW5MYXN0V29yZDsKLSAgVUlOVCAgICpwQ29kZXdvcmRCaXRmaWVsZDsKLSAgSU5UICAgICBiaXRmaWVsZFdvcmQ7Ci0gIElOVCAgICAgYml0SW5Xb3JkOwotICBVSU5UICAgIHRlbXBXb3JkOwotICBVSU5UICAgIGludGVyTWVkaWF0ZVdvcmQ7Ci0gIElOVCAgICAgdGVtcEJpdDsKLSAgSU5UICAgICBjYXJyeTsKKyAgVUlOVCAqcENvZGV3b3JkQml0ZmllbGQ7CisgIElOVCBiaXRmaWVsZFdvcmQ7CisgIElOVCBiaXRJbldvcmQ7CisgIFVJTlQgdGVtcFdvcmQ7CisgIFVJTlQgaW50ZXJNZWRpYXRlV29yZDsKKyAgSU5UIHRlbXBCaXQ7CisgIElOVCBjYXJyeTsKIAotICBVSU5UICAgIG51bUNvZGV3b3JkOwotICBVQ0hBUiAgIG51bVNldDsKLSAgVUNIQVIgICBjdXJyZW50U2V0OwotICBVSU5UICAgIGNvZGV3b3JkSW5TZXQ7Ci0gIFVJTlQgICAgcmVtYWluaW5nQ29kZXdvcmRzSW5TZXQ7Ci0gIFNDSEFSICAqcFN0YTsKLSAgVUlOVCAgICByZXQ7CisgIFVJTlQgbnVtQ29kZXdvcmQ7CisgIFVDSEFSIG51bVNldDsKKyAgVUNIQVIgY3VycmVudFNldDsKKyAgVUlOVCBjb2Rld29yZEluU2V0OworICBVSU5UIHJlbWFpbmluZ0NvZGV3b3Jkc0luU2V0OworICBTQ0hBUiAqcFN0YTsKKyAgVUlOVCByZXQ7CiAKLSAgcE51bVNlZ21lbnQgICAgICAgICAgICAgPSAmKHBIY3ItPnNlZ21lbnRJbmZvLm51bVNlZ21lbnQpOwotICBwUmVtYWluaW5nQml0c0luU2VnbWVudCA9ICAgcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0gIHBTZWdtZW50Qml0ZmllbGQgICAgICAgID0gICBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOwotICBwTnVtV29yZEZvckJpdGZpZWxkICAgICA9ICYocEhjci0+c2VnbWVudEluZm8ubnVtV29yZEZvckJpdGZpZWxkKTsKLSAgcE51bUJpdFZhbGlkSW5MYXN0V29yZCAgPSAmKHBIY3ItPnNlZ21lbnRJbmZvLnBOdW1CaXRWYWxpZEluTGFzdFdvcmQpOwotICBwU3RhICAgICAgICAgICAgICAgICAgICA9ICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKKyAgcE51bVNlZ21lbnQgPSAmKHBIY3ItPnNlZ21lbnRJbmZvLm51bVNlZ21lbnQpOworICBwUmVtYWluaW5nQml0c0luU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBwU2VnbWVudEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgcE51bVdvcmRGb3JCaXRmaWVsZCA9ICYocEhjci0+c2VnbWVudEluZm8ubnVtV29yZEZvckJpdGZpZWxkKTsKKyAgcE51bUJpdFZhbGlkSW5MYXN0V29yZCA9ICYocEhjci0+c2VnbWVudEluZm8ucE51bUJpdFZhbGlkSW5MYXN0V29yZCk7CisgIHBTdGEgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhOwogCi0gIG51bVZhbGlkU2VnbWVudCA9IEluaXRTZWdtZW50Qml0ZmllbGQocE51bVNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtV29yZEZvckJpdGZpZWxkLAorICBudW1WYWxpZFNlZ21lbnQgPSBJbml0U2VnbWVudEJpdGZpZWxkKHBOdW1TZWdtZW50LCBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkLCBwTnVtV29yZEZvckJpdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1CaXRWYWxpZEluTGFzdFdvcmQpOwogCi0gIGlmICggbnVtVmFsaWRTZWdtZW50ICE9IDAgKSB7CisgIGlmIChudW1WYWxpZFNlZ21lbnQgIT0gMCkgewogICAgIG51bUNvZGV3b3JkID0gcEhjci0+c2VjdGlvbkluZm8ubnVtQ29kZXdvcmQ7CiAgICAgbnVtU2V0ID0gKChudW1Db2Rld29yZCAtIDEpIC8gKnBOdW1TZWdtZW50KSArIDE7CiAKLQogICAgIHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb24gPSBGUk9NX1JJR0hUX1RPX0xFRlQ7CiAKICAgICAvKiBQcm9jZXNzIHNldHMgc3Vic2VxdWVudGx5ICovCi0gICAgZm9yICggY3VycmVudFNldCA9IDE7IGN1cnJlbnRTZXQgPCBudW1TZXQgOyBjdXJyZW50U2V0KysgKSB7Ci0KLQotCisgICAgZm9yIChjdXJyZW50U2V0ID0gMTsgY3VycmVudFNldCA8IG51bVNldDsgY3VycmVudFNldCsrKSB7CiAgICAgICAvKiBzdGVwIDEgKi8KLSAgICAgIG51bUNvZGV3b3JkIC09ICpwTnVtU2VnbWVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJlbWFpbmluZyBub24gUENXcyBbZm9yIGFsbCBzZXRzXSAqLwotICAgICAgaWYgKCBudW1Db2Rld29yZCA8ICpwTnVtU2VnbWVudCApIHsKLSAgICAgICAgY29kZXdvcmRJblNldCA9IG51bUNvZGV3b3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGxhc3Qgc2V0ICovCi0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgY29kZXdvcmRJblNldCA9ICpwTnVtU2VnbWVudDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGFsbCBzZXRzIGV4Y2VwdCBsYXN0IHNldCAqLworICAgICAgbnVtQ29kZXdvcmQgLT0KKyAgICAgICAgICAqcE51bVNlZ21lbnQ7IC8qIG51bWJlciBvZiByZW1haW5pbmcgbm9uIFBDV3MgW2ZvciBhbGwgc2V0c10gKi8KKyAgICAgIGlmIChudW1Db2Rld29yZCA8ICpwTnVtU2VnbWVudCkgeworICAgICAgICBjb2Rld29yZEluU2V0ID0gbnVtQ29kZXdvcmQ7IC8qIGZvciBsYXN0IHNldCAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZXdvcmRJblNldCA9ICpwTnVtU2VnbWVudDsgLyogZm9yIGFsbCBzZXRzIGV4Y2VwdCBsYXN0IHNldCAqLwogICAgICAgfQogCiAgICAgICAvKiBzdGVwIDIgKi8KLSAgICAgIC8qIHByZXBhcmUgYXJyYXkgJ0NvZGV3b3JkQml0ZmllbGQnOyBhcyBtdWNoIG9uZXMgYXJlIHdyaXR0ZW4gZnJvbSBsZWZ0IGluIGFsbCB3b3JkcywgYXMgbXVjaCBkZWNvZGVkQ29kZXdvcmRJblNldENvdW50ZXIgbm9uUENXcyBleGlzdCBpbiB0aGlzIHNldCAqLworICAgICAgLyogcHJlcGFyZSBhcnJheSAnQ29kZXdvcmRCaXRmaWVsZCc7IGFzIG11Y2ggb25lcyBhcmUgd3JpdHRlbiBmcm9tIGxlZnQgaW4KKyAgICAgICAqIGFsbCB3b3JkcywgYXMgbXVjaCBkZWNvZGVkQ29kZXdvcmRJblNldENvdW50ZXIgbm9uUENXcyBleGlzdCBpbiB0aGlzCisgICAgICAgKiBzZXQgKi8KICAgICAgIHRlbXBXb3JkID0gMHhGRkZGRkZGRjsKICAgICAgIHBDb2Rld29yZEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7CiAKLSAgICAgIGZvciAoIGJpdGZpZWxkV29yZCA9ICpwTnVtV29yZEZvckJpdGZpZWxkOyBiaXRmaWVsZFdvcmQgIT0wOyBiaXRmaWVsZFdvcmQtLSApIHsgLyogbG9vcCBvdmVyIGFsbCB1c2VkIHdvcmRzICovCi0gICAgICAgIGlmICggY29kZXdvcmRJblNldCA+IE5VTUJFUl9PRl9CSVRfSU5fV09SRCApIHsgICAgICAgIC8qIG1vcmUgY29kZXdvcmRzIHRoYW4gbnVtYmVyIG9mIGJpdHMgPT4gZmlsbCBvbmVzICovCisgICAgICBmb3IgKGJpdGZpZWxkV29yZCA9ICpwTnVtV29yZEZvckJpdGZpZWxkOyBiaXRmaWVsZFdvcmQgIT0gMDsKKyAgICAgICAgICAgYml0ZmllbGRXb3JkLS0pIHsgLyogbG9vcCBvdmVyIGFsbCB1c2VkIHdvcmRzICovCisgICAgICAgIGlmIChjb2Rld29yZEluU2V0ID4gTlVNQkVSX09GX0JJVF9JTl9XT1JEKSB7IC8qIG1vcmUgY29kZXdvcmRzIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGJpdHMgPT4gZmlsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVzICovCiAgICAgICAgICAgLyogZmlsbCBhIHdob2xlIHdvcmQgd2l0aCBvbmVzICovCiAgICAgICAgICAgKnBDb2Rld29yZEJpdGZpZWxkKysgPSB0ZW1wV29yZDsKLSAgICAgICAgICBjb2Rld29yZEluU2V0IC09IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgICAgICAgICAgICAgLyogc3VidHJhY3QgbnVtYmVyIG9mIGJpdHMgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgICBjb2Rld29yZEluU2V0IC09IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgLyogc3VidHJhY3QgbnVtYmVyIG9mIGJpdHMgKi8KKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvKiBwcmVwYXJlIGxhc3QgdGVtcFdvcmQgKi8KLSAgICAgICAgICBmb3IgKHJlbWFpbmluZ0NvZGV3b3Jkc0luU2V0ID0gY29kZXdvcmRJblNldDsgcmVtYWluaW5nQ29kZXdvcmRzSW5TZXQgPCBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgOyByZW1haW5pbmdDb2Rld29yZHNJblNldCsrICkgewotICAgICAgICAgICAgdGVtcFdvcmQgPSB0ZW1wV29yZCAmIH4oMSA8PCAoTlVNQkVSX09GX0JJVF9JTl9XT1JELTEtcmVtYWluaW5nQ29kZXdvcmRzSW5TZXQpKTsgLyogc2V0IGEgemVybyBhdCBiaXQgbnVtYmVyIChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMS1pKSBpbiB0ZW1wV29yZCAqLworICAgICAgICAgIGZvciAocmVtYWluaW5nQ29kZXdvcmRzSW5TZXQgPSBjb2Rld29yZEluU2V0OworICAgICAgICAgICAgICAgcmVtYWluaW5nQ29kZXdvcmRzSW5TZXQgPCBOVU1CRVJfT0ZfQklUX0lOX1dPUkQ7CisgICAgICAgICAgICAgICByZW1haW5pbmdDb2Rld29yZHNJblNldCsrKSB7CisgICAgICAgICAgICB0ZW1wV29yZCA9CisgICAgICAgICAgICAgICAgdGVtcFdvcmQgJgorICAgICAgICAgICAgICAgIH4oMQorICAgICAgICAgICAgICAgICAgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRCAtIDEgLQorICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0NvZGV3b3Jkc0luU2V0KSk7IC8qIHNldCBhIHplcm8gYXQgYml0IG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMS1pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlbXBXb3JkICovCiAgICAgICAgICAgfQogICAgICAgICAgICpwQ29kZXdvcmRCaXRmaWVsZCsrID0gdGVtcFdvcmQ7CiAgICAgICAgICAgdGVtcFdvcmQgPSAweDAwMDAwMDAwOwpAQCAtMjEyLDExNDcgKzIyNiwxMjcwIEBACiAKICAgICAgIC8qIGxvb3Agb3ZlciB0cmlhbHMgKi8KICAgICAgIGNvZGV3b3JkT2Zmc2V0QmFzZSA9IDA7Ci0gICAgICBmb3IgKCB0cmlhbCA9ICpwTnVtU2VnbWVudDsgdHJpYWwgPiAwOyB0cmlhbC0tICkgewotCisgICAgICBmb3IgKHRyaWFsID0gKnBOdW1TZWdtZW50OyB0cmlhbCA+IDA7IHRyaWFsLS0pIHsKICAgICAgICAgLyogbG9vcCBvdmVyIG51bWJlciBvZiB3b3JkcyBpbiBiaXRmaWVsZHMgKi8KLSAgICAgICAgc2VnbWVudE9mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgYXQgemVybyBpbiBldmVyeSBzZWdtZW50ICovCi0gICAgICAgIHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQgPSBzZWdtZW50T2Zmc2V0OyAgICAgICAgIC8qIHN0b3JlIGluIHN0cnVjdHVyZSBmb3Igc3RhdGVzICovCisgICAgICAgIHNlZ21lbnRPZmZzZXQgPSAwOyAvKiBzdGFydCBhdCB6ZXJvIGluIGV2ZXJ5IHNlZ21lbnQgKi8KKyAgICAgICAgcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldCA9CisgICAgICAgICAgICBzZWdtZW50T2Zmc2V0OyAvKiBzdG9yZSBpbiBzdHJ1Y3R1cmUgZm9yIHN0YXRlcyAqLwogICAgICAgICBjb2Rld29yZE9mZnNldCA9IGNvZGV3b3JkT2Zmc2V0QmFzZTsKLSAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQgPSBjb2Rld29yZE9mZnNldDsgICAgLyogc3RvcmUgaW4gc3RydWN0dXJlIGZvciBzdGF0ZXMgKi8KKyAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQgPQorICAgICAgICAgICAgY29kZXdvcmRPZmZzZXQ7IC8qIHN0b3JlIGluIHN0cnVjdHVyZSBmb3Igc3RhdGVzICovCiAKLSAgICAgICAgZm9yICggYml0ZmllbGRXb3JkPTA7IGJpdGZpZWxkV29yZCA8ICpwTnVtV29yZEZvckJpdGZpZWxkOyBiaXRmaWVsZFdvcmQrKyApIHsKLQorICAgICAgICBmb3IgKGJpdGZpZWxkV29yZCA9IDA7IGJpdGZpZWxkV29yZCA8ICpwTnVtV29yZEZvckJpdGZpZWxkOworICAgICAgICAgICAgIGJpdGZpZWxkV29yZCsrKSB7CiAgICAgICAgICAgLyogZGVyaXZlIHRlbXBXb3JkIHdpdGggYml0d2lzZSBhbmQgKi8KLSAgICAgICAgICB0ZW1wV29yZCA9IHBTZWdtZW50Qml0ZmllbGRbYml0ZmllbGRXb3JkXSAmIHBDb2Rld29yZEJpdGZpZWxkW2JpdGZpZWxkV29yZF07CisgICAgICAgICAgdGVtcFdvcmQgPQorICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkW2JpdGZpZWxkV29yZF0gJiBwQ29kZXdvcmRCaXRmaWVsZFtiaXRmaWVsZFdvcmRdOwogCiAgICAgICAgICAgLyogaWYgdGVtcFdvcmQgaXMgbm90IHplcm8sIGRlY29kZSBzb21ldGhpbmcgKi8KLSAgICAgICAgICBpZiAoIHRlbXBXb3JkICE9IDAgKSB7Ci0KLQotICAgICAgICAgICAgLyogbG9vcCBvdmVyIGFsbCBiaXRzIGluIHRlbXBXb3JkOyBzdGFydCBzdGF0ZSBtYWNoaW5lIGlmICYgaXMgdHJ1ZSAqLwotICAgICAgICAgICAgZm9yICggYml0SW5Xb3JkID0gTlVNQkVSX09GX0JJVF9JTl9XT1JEOyBiaXRJbldvcmQgPiAwOyBiaXRJbldvcmQtLSApIHsKLQotICAgICAgICAgICAgICBpbnRlck1lZGlhdGVXb3JkID0gKChVSU5UKTEgPDwgKGJpdEluV29yZC0xKSApOwotICAgICAgICAgICAgICBpZiAoICggdGVtcFdvcmQgJiBpbnRlck1lZGlhdGVXb3JkICkgPT0gaW50ZXJNZWRpYXRlV29yZCApIHsKLQorICAgICAgICAgIGlmICh0ZW1wV29yZCAhPSAwKSB7CisgICAgICAgICAgICAvKiBsb29wIG92ZXIgYWxsIGJpdHMgaW4gdGVtcFdvcmQ7IHN0YXJ0IHN0YXRlIG1hY2hpbmUgaWYgJiBpcyB0cnVlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoYml0SW5Xb3JkID0gTlVNQkVSX09GX0JJVF9JTl9XT1JEOyBiaXRJbldvcmQgPiAwOworICAgICAgICAgICAgICAgICBiaXRJbldvcmQtLSkgeworICAgICAgICAgICAgICBpbnRlck1lZGlhdGVXb3JkID0gKChVSU5UKTEgPDwgKGJpdEluV29yZCAtIDEpKTsKKyAgICAgICAgICAgICAgaWYgKCh0ZW1wV29yZCAmIGludGVyTWVkaWF0ZVdvcmQpID09IGludGVyTWVkaWF0ZVdvcmQpIHsKICAgICAgICAgICAgICAgICAvKiBnZXQgc3RhdGUgYW5kIHN0YXJ0IHN0YXRlIG1hY2hpbmUgKi8KLSAgICAgICAgICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUgPSBhU3RhdGVDb25zdGFudDJTdGF0ZVtwU3RhW2NvZGV3b3JkT2Zmc2V0XV07CisgICAgICAgICAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0KKyAgICAgICAgICAgICAgICAgICAgYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOwogCi0gICAgICAgICAgICAgICAgd2hpbGUocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICByZXQgPSAoKFNUQVRFRlVOQykgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKShicywgcEhjcik7Ci0jaWYgU1RBVEVfTUFDSElORV9FUlJPUl9DSEVDSwotICAgICAgICAgICAgICAgICAgaWYgKCByZXQgIT0gMCApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSB7CisgICAgICAgICAgICAgICAgICByZXQgPSAoKFNUQVRFRlVOQylwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpKGJzLCBwSGNyKTsKKyAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAvKiB1cGRhdGUgYm90aCBvZmZzZXRzICovCi0gICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgTlVNQkVSX09GX0JJVF9JTl9XT1JEIHRpbWVzIG9uZSAqLworICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0ICs9IDE7IC8qIGFkZCBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgdGltZXMgb25lICovCiAgICAgICAgICAgICAgIHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQgPSBzZWdtZW50T2Zmc2V0OwotICAgICAgICAgICAgICBjb2Rld29yZE9mZnNldCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkIE5VTUJFUl9PRl9CSVRfSU5fV09SRCB0aW1lcyBvbmUgKi8KLSAgICAgICAgICAgICAgY29kZXdvcmRPZmZzZXQgPSBNb2R1bG9WYWx1ZShjb2Rld29yZE9mZnNldCwqcE51bVNlZ21lbnQpOyAgICAgIC8qIGluZGV4IG9mIHRoZSBjdXJyZW50IGNvZGV3b3JkIGxpZXMgd2l0aGluIG1vZHVsbyByYW5nZSAqLworICAgICAgICAgICAgICBjb2Rld29yZE9mZnNldCArPSAxOyAvKiBhZGQgTlVNQkVSX09GX0JJVF9JTl9XT1JEIHRpbWVzIG9uZSAqLworICAgICAgICAgICAgICBjb2Rld29yZE9mZnNldCA9CisgICAgICAgICAgICAgICAgICBNb2R1bG9WYWx1ZShjb2Rld29yZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwTnVtU2VnbWVudCk7IC8qIGluZGV4IG9mIHRoZSBjdXJyZW50IGNvZGV3b3JkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWVzIHdpdGhpbiBtb2R1bG8gcmFuZ2UgKi8KICAgICAgICAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQgPSBjb2Rld29yZE9mZnNldDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzZWdtZW50T2Zmc2V0ICs9IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgTlVNQkVSX09GX0JJVF9JTl9XT1JEIGF0IG9uY2UgKi8KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VnbWVudE9mZnNldCArPQorICAgICAgICAgICAgICAgIE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgLyogYWRkIE5VTUJFUl9PRl9CSVRfSU5fV09SRCBhdCBvbmNlICovCiAgICAgICAgICAgICBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0ID0gc2VnbWVudE9mZnNldDsKLSAgICAgICAgICAgIGNvZGV3b3JkT2Zmc2V0ICs9IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgYXQgb25jZSAqLwotICAgICAgICAgICAgY29kZXdvcmRPZmZzZXQgPSBNb2R1bG9WYWx1ZShjb2Rld29yZE9mZnNldCwqcE51bVNlZ21lbnQpOyAgICAgICAgLyogaW5kZXggb2YgdGhlIGN1cnJlbnQgY29kZXdvcmQgbGllcyB3aXRoaW4gbW9kdWxvIHJhbmdlICovCisgICAgICAgICAgICBjb2Rld29yZE9mZnNldCArPQorICAgICAgICAgICAgICAgIE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgLyogYWRkIE5VTUJFUl9PRl9CSVRfSU5fV09SRCBhdCBvbmNlICovCisgICAgICAgICAgICBjb2Rld29yZE9mZnNldCA9IE1vZHVsb1ZhbHVlKAorICAgICAgICAgICAgICAgIGNvZGV3b3JkT2Zmc2V0LAorICAgICAgICAgICAgICAgICpwTnVtU2VnbWVudCk7IC8qIGluZGV4IG9mIHRoZSBjdXJyZW50IGNvZGV3b3JkIGxpZXMgd2l0aGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxvIHJhbmdlICovCiAgICAgICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldCA9IGNvZGV3b3JkT2Zmc2V0OwogICAgICAgICAgIH0KICAgICAgICAgfSAvKiBlbmQgb2YgYml0ZmllbGQgd29yZCBsb29wICovCiAKICAgICAgICAgLyogZGVjcmVtZW50IGNvZGV3b3JkIC0gcG9pbnRlciAqLwogICAgICAgICBjb2Rld29yZE9mZnNldEJhc2UgLT0gMTsKLSAgICAgICAgY29kZXdvcmRPZmZzZXRCYXNlID0gTW9kdWxvVmFsdWUoY29kZXdvcmRPZmZzZXRCYXNlLCpwTnVtU2VnbWVudCk7ICAgIC8qIGluZGV4IG9mIHRoZSBjdXJyZW50IGNvZGV3b3JkIGJhc2UgbGllcyB3aXRoaW4gbW9kdWxvIHJhbmdlICovCisgICAgICAgIGNvZGV3b3JkT2Zmc2V0QmFzZSA9CisgICAgICAgICAgICBNb2R1bG9WYWx1ZShjb2Rld29yZE9mZnNldEJhc2UsICpwTnVtU2VnbWVudCk7IC8qIGluZGV4IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGNvZGV3b3JkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgbGllcyB3aXRoaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxvIHJhbmdlICovCiAKICAgICAgICAgLyogcm90YXRlIG51bVNlZ21lbnQgYml0cyBpbiBjb2Rld29yZEJpdGZpZWxkICovCi0gICAgICAgIC8qIHJvdGF0aW9uIG9mICpudW1TZWdtZW50IGJpdHMgaW4gYml0ZmllbGQgb2YgY29kZXdvcmRzIChjaXJjbGUtcm90YXRpb24pICovCisgICAgICAgIC8qIHJvdGF0aW9uIG9mICpudW1TZWdtZW50IGJpdHMgaW4gYml0ZmllbGQgb2YgY29kZXdvcmRzCisgICAgICAgICAqIChjaXJjbGUtcm90YXRpb24pICovCiAgICAgICAgIC8qIGdldCBsYXN0IHZhbGlkIGJpdCAqLwotICAgICAgICB0ZW1wQml0ID0gcENvZGV3b3JkQml0ZmllbGRbKnBOdW1Xb3JkRm9yQml0ZmllbGQtMV0gJiAoMSA8PCAoTlVNQkVSX09GX0JJVF9JTl9XT1JEIC0gKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQpKTsKKyAgICAgICAgdGVtcEJpdCA9IHBDb2Rld29yZEJpdGZpZWxkWypwTnVtV29yZEZvckJpdGZpZWxkIC0gMV0gJgorICAgICAgICAgICAgICAgICAgKDEgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRCAtICpwTnVtQml0VmFsaWRJbkxhc3RXb3JkKSk7CiAgICAgICAgIHRlbXBCaXQgPSB0ZW1wQml0ID4+IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCk7CiAKICAgICAgICAgLyogd3JpdGUgemVybyBpbnRvIHBsYWNlIHdoZXJlIHRlbXBCaXQgd2FzIGZldGNoZWQgZnJvbSAqLwotICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZFsqcE51bVdvcmRGb3JCaXRmaWVsZC0xXSA9IHBDb2Rld29yZEJpdGZpZWxkWypwTnVtV29yZEZvckJpdGZpZWxkLTFdICYgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCkpOworICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZFsqcE51bVdvcmRGb3JCaXRmaWVsZCAtIDFdID0KKyAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkWypwTnVtV29yZEZvckJpdGZpZWxkIC0gMV0gJgorICAgICAgICAgICAgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCkpOwogCiAgICAgICAgIC8qIHJvdGF0ZSBsYXN0IHZhbGlkIHdvcmQgKi8KLSAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbKnBOdW1Xb3JkRm9yQml0ZmllbGQtMV0gPSBwQ29kZXdvcmRCaXRmaWVsZFsqcE51bVdvcmRGb3JCaXRmaWVsZC0xXSA+PiAxOworICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZFsqcE51bVdvcmRGb3JCaXRmaWVsZCAtIDFdID0KKyAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkWypwTnVtV29yZEZvckJpdGZpZWxkIC0gMV0gPj4gMTsKIAotICAgICAgICAvKiB0cmFuc2ZhcmUgY2FycnkgYml0IDAgZnJvbSBjdXJyZW50IHdvcmQgaW50byBiaXRwb3NpdGlvbiAzMSBmcm9tIG5leHQgd29yZCBhbmQgcm90YXRlIGN1cnJlbnQgd29yZCAqLwotICAgICAgICBmb3IgKCBiaXRmaWVsZFdvcmQgPSAqcE51bVdvcmRGb3JCaXRmaWVsZC0yOyBiaXRmaWVsZFdvcmQgPiAtMSA7IGJpdGZpZWxkV29yZC0tICkgeworICAgICAgICAvKiB0cmFuc2ZhcmUgY2FycnkgYml0IDAgZnJvbSBjdXJyZW50IHdvcmQgaW50byBiaXRwb3NpdGlvbiAzMSBmcm9tIG5leHQKKyAgICAgICAgICogd29yZCBhbmQgcm90YXRlIGN1cnJlbnQgd29yZCAqLworICAgICAgICBmb3IgKGJpdGZpZWxkV29yZCA9ICpwTnVtV29yZEZvckJpdGZpZWxkIC0gMjsgYml0ZmllbGRXb3JkID4gLTE7CisgICAgICAgICAgICAgYml0ZmllbGRXb3JkLS0pIHsKICAgICAgICAgICAvKiBnZXQgY2FycnkgKD1iaXQgYXQgcG9zaXRpb24gMCkgZnJvbSBjdXJyZW50IHdvcmQgKi8KICAgICAgICAgICBjYXJyeSA9IHBDb2Rld29yZEJpdGZpZWxkW2JpdGZpZWxkV29yZF0gJiAxOwogCi0gICAgICAgICAgLyogcHV0IHRoZSBjYXJyeSBiaXQgYXQgcG9zaXRpb24gMzEgaW50byB3b3JkIHJpZ2h0IGZyb20gY3VycmVudCB3b3JkICovCi0gICAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbYml0ZmllbGRXb3JkKzFdID0gcENvZGV3b3JkQml0ZmllbGRbYml0ZmllbGRXb3JkKzFdIHwgKGNhcnJ5IDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMSkpOworICAgICAgICAgIC8qIHB1dCB0aGUgY2FycnkgYml0IGF0IHBvc2l0aW9uIDMxIGludG8gd29yZCByaWdodCBmcm9tIGN1cnJlbnQgd29yZAorICAgICAgICAgICAqLworICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkW2JpdGZpZWxkV29yZCArIDFdID0KKyAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbYml0ZmllbGRXb3JkICsgMV0gfAorICAgICAgICAgICAgICAoY2FycnkgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRCAtIDEpKTsKIAogICAgICAgICAgIC8qIHNoaWZ0IGN1cnJlbnQgd29yZCAqLwotICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkW2JpdGZpZWxkV29yZF0gPSBwQ29kZXdvcmRCaXRmaWVsZFtiaXRmaWVsZFdvcmRdID4+IDE7CisgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbYml0ZmllbGRXb3JkXSA9CisgICAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkW2JpdGZpZWxkV29yZF0gPj4gMTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIHB1dCB0ZW1wQml0IGludG8gZnJlZSBiaXQtcG9zaXRpb24gMzEgZnJvbSBmaXJzdCB3b3JkICovCi0gICAgICAgIHBDb2Rld29yZEJpdGZpZWxkWzBdID0gcENvZGV3b3JkQml0ZmllbGRbMF0gfCAodGVtcEJpdCA8PCAoTlVNQkVSX09GX0JJVF9JTl9XT1JELTEpKTsKKyAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbMF0gPQorICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbMF0gfCAodGVtcEJpdCA8PCAoTlVNQkVSX09GX0JJVF9JTl9XT1JEIC0gMSkpOwogCiAgICAgICB9IC8qIGVuZCBvZiB0cmlhbCBsb29wICovCiAKICAgICAgIC8qIHRvZ2dsZSByZWFkIGRpcmVjdGlvbiAqLwotICAgICAgcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbiA9IFRvZ2dsZVJlYWREaXJlY3Rpb24ocEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbik7Ci0KKyAgICAgIHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb24gPQorICAgICAgICAgIFRvZ2dsZVJlYWREaXJlY3Rpb24ocEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbik7CiAgICAgfQogICAgIC8qIGVuZCBvZiBzZXQgbG9vcCAqLwogCiAgICAgLyogYWxsIG5vbi1QQ1dzIG9mIHRoaXMgc3BlY3RydW0gYXJlIGRlY29kZWQgKi8KICAgfQogCi0gIC8qIGFsbCBQQ1dzIGFuZCBhbGwgbm9uIFBDV3MgYXJlIGRlY29kZWQuIFRoZXkgYXJlIHVuYmFja3NvcnRlZCBpbiBvdXRwdXQgYnVmZmVyLiBIZXJlIGlzIHRoZSBJbnRlcmZhY2Ugd2l0aCBjb21wYXJpbmcgUVNDcyB0byBhc20gZGVjb2RpbmcgKi8KKyAgLyogYWxsIFBDV3MgYW5kIGFsbCBub24gUENXcyBhcmUgZGVjb2RlZC4gVGhleSBhcmUgdW5iYWNrc29ydGVkIGluIG91dHB1dAorICAgKiBidWZmZXIuIEhlcmUgaXMgdGhlIEludGVyZmFjZSB3aXRoIGNvbXBhcmluZyBRU0NzIHRvIGFzbSBkZWNvZGluZyAqLwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIGJpdGZpZWxkIHVzZWQgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICBzZWdtZW50cy4gVGhlIGxpc3QgaXMgc2V0IHVwIG9uY2UgdG8gYmUgdXNlZCBpbiBhbGwgZm9sbG93aW5nIHNldHMuIElmIGEKLSAgICAgICAgICAgICAgICAgICAgc2VnbWVudCBpcyBkZWNvZGVkIGVtcHR5LCB0aGUgYWNjb3JkaW5nIGJpdCBmcm9tIHRoZSBCaXRmaWVsZCBpcyByZW1vdmVkLgorICAgICAgICAgICAgICAgICAgICBzZWdtZW50cy4gVGhlIGxpc3QgaXMgc2V0IHVwIG9uY2UgdG8gYmUgdXNlZCBpbiBhbGwKK2ZvbGxvd2luZyBzZXRzLiBJZiBhIHNlZ21lbnQgaXMgZGVjb2RlZCBlbXB0eSwgdGhlIGFjY29yZGluZyBiaXQgZnJvbSB0aGUKK0JpdGZpZWxkIGlzIHJlbW92ZWQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgICBudW1WYWxpZFNlZ21lbnQgPSB0aGUgbnVtYmVyIG9mIHZhbGlkIHNlZ21lbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIFVJTlQgSW5pdFNlZ21lbnRCaXRmaWVsZChVSU5UICAgKnBOdW1TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgKnBTZWdtZW50Qml0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAqcE51bVdvcmRGb3JCaXRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICpwTnVtQml0VmFsaWRJbkxhc3RXb3JkKQotewotICBTSE9SVCAgIGk7Ci0gIFVTSE9SVCAgcjsKLSAgVUNIQVIgICBiaXRmaWVsZFdvcmQ7Ci0gIFVJTlQgICAgdGVtcFdvcmQ7Ci0gIFVTSE9SVCAgbnVtVmFsaWRTZWdtZW50OworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgVUlOVCBJbml0U2VnbWVudEJpdGZpZWxkKFVJTlQgKnBOdW1TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBTZWdtZW50Qml0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwTnVtV29yZEZvckJpdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQpIHsKKyAgU0hPUlQgaTsKKyAgVVNIT1JUIHI7CisgIFVDSEFSIGJpdGZpZWxkV29yZDsKKyAgVUlOVCB0ZW1wV29yZDsKKyAgVVNIT1JUIG51bVZhbGlkU2VnbWVudDsKIAotICAqcE51bVdvcmRGb3JCaXRmaWVsZCA9ICgoKnBOdW1TZWdtZW50LTEpID4+IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0cpICsgMTsKKyAgKnBOdW1Xb3JkRm9yQml0ZmllbGQgPSAoKCpwTnVtU2VnbWVudCAtIDEpID4+IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0cpICsgMTsKIAogICAvKiBsb29wIG92ZXIgYWxsIHdvcmRzLCB3aGljaCBhcmUgY29tcGxldGVseSB1c2VkIG9yIG9ubHkgcGFydGlhbCAqLwotICAvKiBiaXQgaW4gcFNlZ21lbnRCaXRmaWVsZCBpcyB6ZXJvIGlmIHNlZ21lbnQgaXMgZW1wdHk7IGJpdCBpbiBwU2VnbWVudEJpdGZpZWxkIGlzIG9uZSBpZiBzZWdtZW50IGlzIG5vdCBlbXB0eSAqLworICAvKiBiaXQgaW4gcFNlZ21lbnRCaXRmaWVsZCBpcyB6ZXJvIGlmIHNlZ21lbnQgaXMgZW1wdHk7IGJpdCBpbgorICAgKiBwU2VnbWVudEJpdGZpZWxkIGlzIG9uZSBpZiBzZWdtZW50IGlzIG5vdCBlbXB0eSAqLwogICBudW1WYWxpZFNlZ21lbnQgPSAwOwogICAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCA9ICpwTnVtU2VnbWVudDsKIAogICAvKiBsb29wIG92ZXIgd29yZHMgKi8KLSAgZm9yICggYml0ZmllbGRXb3JkPTA7IGJpdGZpZWxkV29yZCA8ICpwTnVtV29yZEZvckJpdGZpZWxkIC0gMTsgYml0ZmllbGRXb3JkKysgKSB7Ci0gICAgdGVtcFdvcmQgPSAweEZGRkZGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IG9uZXMgKi8KKyAgZm9yIChiaXRmaWVsZFdvcmQgPSAwOyBiaXRmaWVsZFdvcmQgPCAqcE51bVdvcmRGb3JCaXRmaWVsZCAtIDE7CisgICAgICAgYml0ZmllbGRXb3JkKyspIHsKKyAgICB0ZW1wV29yZCA9IDB4RkZGRkZGRkY7IC8qIHNldCBvbmVzICovCiAgICAgciA9IGJpdGZpZWxkV29yZCA8PCBUSElSVFlUV09fTE9HX0RJVl9UV09fTE9HOwotICAgIGZvciAoIGk9MDsgaSA8IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgaSsrKSB7Ci0gICAgICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3IgKyBpXSA9PSAwICkgewotICAgICAgICB0ZW1wV29yZCA9IHRlbXBXb3JkICYgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMS1pKSk7ICAgICAgICAgIC8qIHNldCBhIHplcm8gYXQgYml0IG51bWJlciAoTlVNQkVSX09GX0JJVF9JTl9XT1JELTEtaSkgaW4gdGVtcFdvcmQgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBudW1WYWxpZFNlZ21lbnQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvdW50IHNlZ21lbnRzIHdoaWNoIGFyZSBub3QgZW1wdHkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX0JJVF9JTl9XT1JEOyBpKyspIHsKKyAgICAgIGlmIChwUmVtYWluaW5nQml0c0luU2VnbWVudFtyICsgaV0gPT0gMCkgeworICAgICAgICB0ZW1wV29yZCA9IHRlbXBXb3JkICYgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAxIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSkpOyAvKiBzZXQgYSB6ZXJvIGF0IGJpdCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlVNQkVSX09GX0JJVF9JTl9XT1JELTEtaSkgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wV29yZCAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtVmFsaWRTZWdtZW50ICs9IDE7IC8qIGNvdW50IHNlZ21lbnRzIHdoaWNoIGFyZSBub3QgZW1wdHkgKi8KICAgICAgIH0KICAgICB9Ci0gICAgcFNlZ21lbnRCaXRmaWVsZFtiaXRmaWVsZFdvcmRdID0gdGVtcFdvcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgcmVzdWx0ICovCi0gICAgKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQgLT0gTlVNQkVSX09GX0JJVF9JTl9XT1JEOyAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiB6ZXJvcyBvbiBMU0Igc2lkZSBpbiB0aGUgbGFzdCB3b3JkICovCisgICAgcFNlZ21lbnRCaXRmaWVsZFtiaXRmaWVsZFdvcmRdID0gdGVtcFdvcmQ7ICAgICAgICAvKiBzdG9yZSByZXN1bHQgKi8KKyAgICAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCAtPSBOVU1CRVJfT0ZfQklUX0lOX1dPUkQ7IC8qIGNhbGN1bGF0ZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9zIG9uIExTQiBzaWRlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCB3b3JkICovCiAgIH0KIAotCiAgIC8qIGNhbGN1bGF0ZSBsYXN0IHdvcmQ6IHByZXBhcmUgc3BlY2lhbCB0ZW1wV29yZCAqLwogICB0ZW1wV29yZCA9IDB4RkZGRkZGRkY7Ci0gIGZvciAoIGk9MDsgaSA8ICggTlVNQkVSX09GX0JJVF9JTl9XT1JEIC0gKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQgKTsgaSsrICkgewotICAgIHRlbXBXb3JkID0gdGVtcFdvcmQgJiB+KDEgPDwgaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGJpdCBpIGluIHRlbXBXb3JkICovCisgIGZvciAoaSA9IDA7IGkgPCAoTlVNQkVSX09GX0JJVF9JTl9XT1JEIC0gKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQpOyBpKyspIHsKKyAgICB0ZW1wV29yZCA9IHRlbXBXb3JkICYgfigxIDw8IGkpOyAvKiBjbGVhciBiaXQgaSBpbiB0ZW1wV29yZCAqLwogICB9CiAKICAgLyogY2FsY3VsYXRlIGxhc3Qgd29yZCAqLwogICByID0gYml0ZmllbGRXb3JkIDw8IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0c7Ci0gIGZvciAoIGk9MDsgaTwqcE51bUJpdFZhbGlkSW5MYXN0V29yZDsgaSsrKSB7Ci0gICAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtyICsgaV0gPT0gMCApIHsKLSAgICAgIHRlbXBXb3JkID0gdGVtcFdvcmQgJiB+KDEgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRC0xLWkpKTsgICAgICAgICAgICAvKiBzZXQgYSB6ZXJvIGF0IGJpdCBudW1iZXIgKE5VTUJFUl9PRl9CSVRfSU5fV09SRC0xLWkpIGluIHRlbXBXb3JkICovCi0gICAgfQotICAgIGVsc2UgewotICAgICAgbnVtVmFsaWRTZWdtZW50ICs9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvdW50IHNlZ21lbnRzIHdoaWNoIGFyZSBub3QgZW1wdHkgKi8KKyAgZm9yIChpID0gMDsgaSA8ICpwTnVtQml0VmFsaWRJbkxhc3RXb3JkOyBpKyspIHsKKyAgICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbciArIGldID09IDApIHsKKyAgICAgIHRlbXBXb3JkID0gdGVtcFdvcmQgJiB+KDEgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRCAtIDEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSkpOyAvKiBzZXQgYSB6ZXJvIGF0IGJpdCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5VTUJFUl9PRl9CSVRfSU5fV09SRC0xLWkpIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBXb3JkICovCisgICAgfSBlbHNlIHsKKyAgICAgIG51bVZhbGlkU2VnbWVudCArPSAxOyAvKiBjb3VudCBzZWdtZW50cyB3aGljaCBhcmUgbm90IGVtcHR5ICovCiAgICAgfQogICB9Ci0gIHBTZWdtZW50Qml0ZmllbGRbYml0ZmllbGRXb3JkXSA9IHRlbXBXb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgcmVzdWx0ICovCi0KLQorICBwU2VnbWVudEJpdGZpZWxkW2JpdGZpZWxkV29yZF0gPSB0ZW1wV29yZDsgLyogc3RvcmUgcmVzdWx0ICovCiAKICAgcmV0dXJuIG51bVZhbGlkU2VnbWVudDsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBkZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCBzaWRlaW5mbyBmb3IgdGhlIG5vbi1QQ1cgZGVjb2RlciAoZm9yIHRoZSBjdXJyZW50IHNldCkuCisgIGRlc2NyaXB0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHNpZGVpbmZvIGZvciB0aGUgbm9uLVBDVyBkZWNvZGVyIChmb3IgdGhlCitjdXJyZW50IHNldCkuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgSW5pdE5vblBDV1NpZGVJbmZvcm1hdGlvbkZvckN1cnJlbnRTZXQoSF9IQ1JfSU5GTyBwSGNyKQotewotICBVU0hPUlQgICAgIGksazsKLSAgVUNIQVIgICAgICBjb2RlYm9va0RpbTsKLSAgVUlOVCAgICAgICBzdGFydE5vZGU7CitzdGF0aWMgdm9pZCBJbml0Tm9uUENXU2lkZUluZm9ybWF0aW9uRm9yQ3VycmVudFNldChIX0hDUl9JTkZPIHBIY3IpIHsKKyAgVVNIT1JUIGksIGs7CisgIFVDSEFSIGNvZGVib29rRGltOworICBVSU5UIHN0YXJ0Tm9kZTsKIAotICBVQ0hBUiAgICAgKnBDb2RlYm9vayAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ29kZWJvb2s7Ci0gIFVJTlQgICAgICAqaU5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLmlOb2RlOwotICBVQ0hBUiAgICAgKnBDbnRTaWduICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ250U2lnbjsKLSAgVVNIT1JUICAgICppUmVzdWx0UG9pbnRlciAgICAgICAgICAgICAgICAgICAgICA9ICAgcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7Ci0gIFVJTlQgICAgICAqcEVzY2FwZVNlcXVlbmNlSW5mbyAgICAgICAgICAgICAgICAgPSAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBFc2NhcGVTZXF1ZW5jZUluZm87Ci0gIFNDSEFSICAgICAqcFN0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGE7Ci0gIFVTSE9SVCAgICAqcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb24gPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOwotICBpbnQgICAgICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPSAgIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7Ci0gIFVDSEFSICAgICAqcEV4dGVuZGVkU29ydGVkQ29kZWJvb2sgICAgICAgICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBFeHRlbmRlZFNvcnRlZENvZGVib29rOwotICBpbnQgICAgICAgIGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggICAgICAgICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4OwotICBVU0hPUlQgICAgKnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0czsKLSAgaW50ICAgICAgICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4ICA9ICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKLSAgRklYUF9EQkwgICpwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMgICAgICA9ICAgU1BFQ19MT05HKHBIY3ItPmRlY0luT3V0LnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UpOwotICBpbnQgICAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ICAgID0gICBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKLSAgY29uc3QgVUNIQVIgICAgICpwQ2JEaW1lbnNpb24gICAgICAgICAgICAgICAgICA9ICAgcEhjci0+dGFibGVJbmZvLnBDYkRpbWVuc2lvbjsKKyAgVUNIQVIgKnBDb2RlYm9vayA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBDb2RlYm9vazsKKyAgVUlOVCAqaU5vZGUgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pTm9kZTsKKyAgVUNIQVIgKnBDbnRTaWduID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247CisgIFVTSE9SVCAqaVJlc3VsdFBvaW50ZXIgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKKyAgVUlOVCAqcEVzY2FwZVNlcXVlbmNlSW5mbyA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBFc2NhcGVTZXF1ZW5jZUluZm87CisgIFNDSEFSICpwU3RhID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKKyAgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKKyAgaW50IG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPQorICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKKyAgVUNIQVIgKnBFeHRlbmRlZFNvcnRlZENvZGVib29rID0gcEhjci0+c2VjdGlvbkluZm8ucEV4dGVuZGVkU29ydGVkQ29kZWJvb2s7CisgIGludCBleHRlbmRlZFNvcnRlZENvZGVib29rSWR4ID0gcEhjci0+c2VjdGlvbkluZm8uZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeDsKKyAgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cyA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0czsKKyAgaW50IG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggPQorICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKKyAgaW50IHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID0KKyAgICAgIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OworICBjb25zdCBVQ0hBUiAqcENiRGltZW5zaW9uID0gYURpbUNiOwogICBpbnQgaXRlcmF0aW9uQ291bnRlciA9IDA7CiAKLSAgLyogbG9vcCBvdmVyIG51bWJlciBvZiBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbnMgaW4gdGhlIGN1cnJlbnQgc2V0IHNvIGFsbCBjb2Rld29yZHMgc2lkZWluZm8gdmFyaWFibGVzIHdpdGhpbiB0aGlzIHNldCBjYW4gYmUgcHJlcGFyZWQgZm9yIGRlY29kaW5nICovCi0gIGZvciAoIGk9cE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNbbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeF07IGkgIT0gMDsgaS0tICkgeworICAvKiBsb29wIG92ZXIgbnVtYmVyIG9mIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9ucyBpbiB0aGUgY3VycmVudCBzZXQgc28gYWxsCisgICAqIGNvZGV3b3JkcyBzaWRlaW5mbyB2YXJpYWJsZXMgd2l0aGluIHRoaXMgc2V0IGNhbiBiZSBwcmVwYXJlZCBmb3IgZGVjb2RpbmcKKyAgICovCisgIGZvciAoaSA9IHBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzW251bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHhdOworICAgICAgIGkgIT0gMDsgaS0tKSB7CisgICAgY29kZWJvb2tEaW0gPQorICAgICAgICBwQ2JEaW1lbnNpb25bcEV4dGVuZGVkU29ydGVkQ29kZWJvb2tbZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeF1dOworICAgIHN0YXJ0Tm9kZSA9ICphSHVmZlRhYmxlW3BFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdXTsKIAotICAgIGNvZGVib29rRGltID0gcENiRGltZW5zaW9uW3BFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdXTsKLSAgICBzdGFydE5vZGUgICA9ICphSHVmZlRhYmxlW3BFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdXTsKLSAgICAKLSAgICBmb3IgKCBrID0gcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF07IGsgIT0gMDsgay0tICkgeworICAgIGZvciAoayA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uCisgICAgICAgICAgICAgW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdOworICAgICAgICAgayAhPSAwOyBrLS0pIHsKICAgICAgIGl0ZXJhdGlvbkNvdW50ZXIrKzsKLSAgICAgIGlmIChpdGVyYXRpb25Db3VudGVyID4gKDEwMjQ+PjIpKSB7CisgICAgICBpZiAoaXRlcmF0aW9uQ291bnRlciA+ICgxMDI0ID4+IDIpKSB7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KLSAgICAgICpwU3RhKysgICAgICAgICAgICAgICAgID0gYUNvZGVib29rMlN0YXJ0SW50W3BFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdXTsKLSAgICAgICpwQ29kZWJvb2srKyAgICAgICAgICAgID0gcEV4dGVuZGVkU29ydGVkQ29kZWJvb2tbZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeF07Ci0gICAgICAqaU5vZGUrKyAgICAgICAgICAgICAgICA9IHN0YXJ0Tm9kZTsKLSAgICAgICpwQ250U2lnbisrICAgICAgICAgICAgID0gMDsKLSAgICAgICppUmVzdWx0UG9pbnRlcisrICAgICAgID0gcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7Ci0gICAgICAqcEVzY2FwZVNlcXVlbmNlSW5mbysrICA9IDA7Ci0gICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCArPSBjb2RlYm9va0RpbTsgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgcG9pbnRlciBieSBjb2RlYm9va0RpbSAtLT4gcG9pbnQgdG8gbmV4dCBzdGFydGluZyB2YWx1ZSBmb3Igd3JpdGluZyBvdXQgKi8KKyAgICAgICpwU3RhKysgPSBhQ29kZWJvb2syU3RhcnRJbnQKKyAgICAgICAgICBbcEV4dGVuZGVkU29ydGVkQ29kZWJvb2tbZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeF1dOworICAgICAgKnBDb2RlYm9vaysrID0gcEV4dGVuZGVkU29ydGVkQ29kZWJvb2tbZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeF07CisgICAgICAqaU5vZGUrKyA9IHN0YXJ0Tm9kZTsKKyAgICAgICpwQ250U2lnbisrID0gMDsKKyAgICAgICppUmVzdWx0UG9pbnRlcisrID0gcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7CisgICAgICAqcEVzY2FwZVNlcXVlbmNlSW5mbysrID0gMDsKKyAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ICs9CisgICAgICAgICAgY29kZWJvb2tEaW07IC8qIHVwZGF0ZSBwb2ludGVyIGJ5IGNvZGVib29rRGltIC0tPiBwb2ludCB0byBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIHZhbHVlIGZvciB3cml0aW5nIG91dCAqLwogICAgICAgaWYgKHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID49IDEwMjQpIHsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgIH0KLSAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluYyBwdHIgZm9yIG5leHQgZXh0IHNvcnQgc2VjIGluIGN1cnJlbnQgc2V0ICovCi0gICAgZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmMgcHRyIGZvciBuZXh0IGV4dCBzb3J0IHNlYyBpbiBjdXJyZW50IHNldCAqLwotICAgIGlmIChudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID49IChNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFMpIHx8IGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggPj0gKE1BWF9TRkJfSENSK01BWF9IQ1JfU0VUUykpIHsKKyAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4Kys7IC8qIGluYyBwdHIgZm9yIG5leHQgZXh0IHNvcnQgc2VjIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNldCAqLworICAgIGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHgrKzsgLyogaW5jIHB0ciBmb3IgbmV4dCBleHQgc29ydCBzZWMgaW4gY3VycmVudCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID49IChNQVhfU0ZCX0hDUiArIE1BWF9IQ1JfU0VUUykgfHwKKyAgICAgICAgZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCA+PSAoTUFYX1NGQl9IQ1IgKyBNQVhfSENSX1NFVFMpKSB7CiAgICAgICByZXR1cm47CiAgICAgfQogICB9Ci0gIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmMgcHRyIGZvciBuZXh0IHNldCBvZiBub24tUENXcyAqLwotICBpZiAobnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA+PSAoTUFYX1NGQl9IQ1IrTUFYX0hDUl9TRVRTKSkgeworICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4Kys7IC8qIGluYyBwdHIgZm9yIG5leHQgc2V0IG9mIG5vbi1QQ1dzICovCisgIGlmIChudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID49IChNQVhfU0ZCX0hDUiArIE1BWF9IQ1JfU0VUUykpIHsKICAgICByZXR1cm47CiAgIH0KIAogICAvKiBXcml0ZSBiYWNrIGluZGV4ZXMgKi8KLSAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA9IG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7CisgIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPQorICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKICAgcEhjci0+c2VjdGlvbkluZm8uZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCA9IGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7Ci0gIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggPSBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4OwotICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID0gbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKLSAgcEhjci0+ZGVjSW5PdXQucXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggPSBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKKyAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCA9CisgICAgICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4OworICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID0KKyAgICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7CisgIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID0KKyAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGlucHV0IHZhbHVlIGlmIHRoZSB2YWx1ZSBpcyBpbiB0aGUKLSAgICAgICAgICAgICAgICAgIHJhbmdlIG9mIGJ1ZmZlcmxlbmd0aC4gSWYgPGlucHV0PiBpcyBzbWFsbGVyLCBvbmUgYnVmZmVybGVuZ3RoIGlzIGFkZGVkLAotICAgICAgICAgICAgICAgICAgaWYgPGlucHV0PiBpcyBiaWdnZXIgb25lIGJ1ZmZlcmxlbmd0aCBpcyBzdWJ0cmFjdGVkLgorICAgICAgICAgICAgICAgICAgcmFuZ2Ugb2YgYnVmZmVybGVuZ3RoLiBJZiA8aW5wdXQ+IGlzIHNtYWxsZXIsIG9uZSBidWZmZXJsZW5ndGgKK2lzIGFkZGVkLCBpZiA8aW5wdXQ+IGlzIGJpZ2dlciBvbmUgYnVmZmVybGVuZ3RoIGlzIHN1YnRyYWN0ZWQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgbW9kdWxvIHJlc3VsdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBJTlQgTW9kdWxvVmFsdWUoSU5UIGlucHV0LCBJTlQgYnVmZmVybGVuZ3RoKQotewotICBpZiAoIGlucHV0ID4gKGJ1ZmZlcmxlbmd0aCAtIDEpICkgeworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgSU5UIE1vZHVsb1ZhbHVlKElOVCBpbnB1dCwgSU5UIGJ1ZmZlcmxlbmd0aCkgeworICBpZiAoaW5wdXQgPiAoYnVmZmVybGVuZ3RoIC0gMSkpIHsKICAgICByZXR1cm4gKGlucHV0IC0gYnVmZmVybGVuZ3RoKTsKICAgfQotICBpZiAoIGlucHV0IDwgMCApIHsKKyAgaWYgKGlucHV0IDwgMCkgewogICAgIHJldHVybiAoaW5wdXQgKyBidWZmZXJsZW5ndGgpOwogICB9CiAgIHJldHVybiBpbnB1dDsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBkZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBjbGVhcnMgYSBiaXQgZnJvbSBjdXJyZW50IGJpdGZpZWxkIGFuZAogICAgICAgICAgICAgICAgICAgc3dpdGNoZXMgb2ZmIHRoZSBzdGF0ZW1hY2hpbmUuCiAKICAgICAgICAgICAgICAgICAgIEEgYml0IGlzIGNsZWFyZWQgaW4gdHdvIGNhc2VzOgotICAgICAgICAgICAgICAgICAgYSkgYSBjb2Rld29yZCBpcyBkZWNvZGVkLCB0aGVuIGEgYml0IGlzIGNsZWFyZWQgaW4gY29kZXdvcmQgYml0ZmllbGQKLSAgICAgICAgICAgICAgICAgIGIpIGEgc2VnbWVudCBpcyBkZWNvZGVkIGVtcHR5LCB0aGVuIGEgYml0IGlzIGNsZWFyZWQgaW4gc2VnbWVudCBiaXRmaWVsZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIENsZWFyQml0RnJvbUJpdGZpZWxkKFNUQVRFRlVOQyAqcHRyU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgKnBCaXRmaWVsZCkKLXsKLSAgVUlOVCAgbnVtQml0ZmllbGRXb3JkOwotICBVSU5UICBudW1CaXRmaWVsZEJpdDsKKyAgICAgICAgICAgICAgICAgIGEpIGEgY29kZXdvcmQgaXMgZGVjb2RlZCwgdGhlbiBhIGJpdCBpcyBjbGVhcmVkIGluIGNvZGV3b3JkCitiaXRmaWVsZCBiKSBhIHNlZ21lbnQgaXMgZGVjb2RlZCBlbXB0eSwgdGhlbiBhIGJpdCBpcyBjbGVhcmVkIGluIHNlZ21lbnQKK2JpdGZpZWxkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyB2b2lkIENsZWFyQml0RnJvbUJpdGZpZWxkKFNUQVRFRlVOQyAqcHRyU3RhdGUsIFVJTlQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqcEJpdGZpZWxkKSB7CisgIFVJTlQgbnVtQml0ZmllbGRXb3JkOworICBVSU5UIG51bUJpdGZpZWxkQml0OwogCiAgIC8qIGdldCBib3RoIHZhbHVlcyBuZWVkZWQgZm9yIGNsZWFyaW5nIHRoZSBiaXQgKi8KLSAgbnVtQml0ZmllbGRXb3JkID0gb2Zmc2V0ID4+IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0c7ICAgICAgICAgICAgICAgICAgICAgIC8qIGludCAgID0gd29yZE5yICovCi0gIG51bUJpdGZpZWxkQml0ICA9IG9mZnNldCAtIChudW1CaXRmaWVsZFdvcmQgPDwgVEhJUlRZVFdPX0xPR19ESVZfVFdPX0xPRyk7ICAvKiBmcmFjdCA9IGJpdE5yICAqLworICBudW1CaXRmaWVsZFdvcmQgPSBvZmZzZXQgPj4gVEhJUlRZVFdPX0xPR19ESVZfVFdPX0xPRzsgLyogaW50ICAgPSB3b3JkTnIgKi8KKyAgbnVtQml0ZmllbGRCaXQgPSBvZmZzZXQgLSAobnVtQml0ZmllbGRXb3JkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0cpOyAvKiBmcmFjdCA9IGJpdE5yICAqLwogCiAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkICovCi0gIHBCaXRmaWVsZFtudW1CaXRmaWVsZFdvcmRdID0gcEJpdGZpZWxkW251bUJpdGZpZWxkV29yZF0gJiB+KDEgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRC0xIC0gbnVtQml0ZmllbGRCaXQpKTsKKyAgcEJpdGZpZWxkW251bUJpdGZpZWxkV29yZF0gPQorICAgICAgcEJpdGZpZWxkW251bUJpdGZpZWxkV29yZF0gJgorICAgICAgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAxIC0gbnVtQml0ZmllbGRCaXQpKTsKIAotICAvKiBzd2l0Y2ggb2ZmIHN0YXRlIG1hY2hpbmUgYmVjYXVzZSBjb2Rld29yZCBpcyBkZWNvZGVkIGFuZC9vciBiZWNhdXNlIHNlZ21lbnQgaXMgZW1wdHkgKi8KKyAgLyogc3dpdGNoIG9mZiBzdGF0ZSBtYWNoaW5lIGJlY2F1c2UgY29kZXdvcmQgaXMgZGVjb2RlZCBhbmQvb3IgYmVjYXVzZSBzZWdtZW50CisgICAqIGlzIGVtcHR5ICovCiAgICpwdHJTdGF0ZSA9IE5VTEw7CiB9CiAKLQotCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXRlcyBvZiB0aGUgc3RhdGVtYWNoaW5lCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgRGVjb2RlcyB0aGUgYm9keSBvZiBhIGNvZGV3b3JkLiBUaGlzIFN0YXRlIGlzIHVzZWQgZm9yIGNvZGVib29rcyAxLDIsNSBhbmQgNi4KLSAgICAgICAgICAgICAgICAgICBObyBzaWduIGJpdHMgYXJlIGRlY29kZWQsIGJlY2F1c2UgdGhlIHRhYmxlIG9mIHRoZSBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgaGFzIGdvdCBhIHZhbGlkIHNpZ24gYXQgdGhlIHF1YW50aXplZCBzcGVjdHJhbCBsaW5lcy4KKyAgICAgZGVzY3JpcHRpb246ICBEZWNvZGVzIHRoZSBib2R5IG9mIGEgY29kZXdvcmQuIFRoaXMgU3RhdGUgaXMgdXNlZCBmb3IKK2NvZGVib29rcyAxLDIsNSBhbmQgNi4gTm8gc2lnbiBiaXRzIGFyZSBkZWNvZGVkLCBiZWNhdXNlIHRoZSB0YWJsZSBvZiB0aGUKK3F1YW50aXplZCBzcGVjdHJhbCB2YWx1ZXMgaGFzIGdvdCBhIHZhbGlkIHNpZ24gYXQgdGhlIHF1YW50aXplZCBzcGVjdHJhbCBsaW5lcy4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dHB1dDogICBUd28gb3IgZm91ciBxdWFudGl6ZXMgc3BlY3RyYWwgdmFsdWVzIHdyaXR0ZW4gYXQgcG9zaXRpb24gd2hlcmUgcFJlc3VsdFBvaW50cgotICAgICAgICAgICAgICAgICAgcG9pbnRzIHRvCisgICAgICAgIG91dHB1dDogICBUd28gb3IgZm91ciBxdWFudGl6ZXMgc3BlY3RyYWwgdmFsdWVzIHdyaXR0ZW4gYXQgcG9zaXRpb24KK3doZXJlIHBSZXN1bHRQb2ludHIgcG9pbnRzIHRvCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVJTlQgSGNyX1N0YXRlX0JPRFlfT05MWShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKQoteworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitVSU5UIEhjcl9TdGF0ZV9CT0RZX09OTFkoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIHZvaWQgKnB0cikgewogICBIX0hDUl9JTkZPIHBIY3IgPSAoSF9IQ1JfSU5GTylwdHI7Ci0gIFVJTlQgICAgICAgICpwU2VnbWVudEJpdGZpZWxkOwotICBVSU5UICAgICAgICAqcENvZGV3b3JkQml0ZmllbGQ7Ci0gIFVJTlQgICAgICAgICBzZWdtZW50T2Zmc2V0OwotICBGSVhQX0RCTCAgICAqcFJlc3VsdEJhc2U7Ci0gIFVJTlQgICAgICAgICppTm9kZTsKLSAgVVNIT1JUICAgICAgKmlSZXN1bHRQb2ludGVyOwotICBVSU5UICAgICAgICAgY29kZXdvcmRPZmZzZXQ7Ci0gIFVJTlQgICAgICAgICBicmFuY2hOb2RlOwotICBVSU5UICAgICAgICAgYnJhbmNoVmFsdWU7Ci0gIFVJTlQgICAgICAgICBpUVNDOwotICBVSU5UICAgICAgICAgdHJlZU5vZGU7Ci0gIFVDSEFSICAgICAgICBjYXJyeUJpdDsKLSAgVVNIT1JUICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVTSE9SVCAgICAgICpwUmlnaHRTdGFydE9mU2VnbWVudDsKLSAgU0NIQVIgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVQ0hBUiAgICAgICAgcmVhZERpcmVjdGlvbjsKLSAgVUNIQVIgICAgICAgKnBDb2RlYm9vazsKLSAgVUNIQVIgICAgICAgIGRpbUNudHI7Ci0gIGNvbnN0IFVJTlQgICpwQ3VycmVudFRyZWU7CisgIFVJTlQgKnBTZWdtZW50Qml0ZmllbGQ7CisgIFVJTlQgKnBDb2Rld29yZEJpdGZpZWxkOworICBVSU5UIHNlZ21lbnRPZmZzZXQ7CisgIEZJWFBfREJMICpwUmVzdWx0QmFzZTsKKyAgVUlOVCAqaU5vZGU7CisgIFVTSE9SVCAqaVJlc3VsdFBvaW50ZXI7CisgIFVJTlQgY29kZXdvcmRPZmZzZXQ7CisgIFVJTlQgYnJhbmNoTm9kZTsKKyAgVUlOVCBicmFuY2hWYWx1ZTsKKyAgVUlOVCBpUVNDOworICBVSU5UIHRyZWVOb2RlOworICBVQ0hBUiBjYXJyeUJpdDsKKyAgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50OworICBJTlQgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIFVDSEFSIHJlYWREaXJlY3Rpb247CisgIFVDSEFSICpwQ29kZWJvb2s7CisgIFVDSEFSIGRpbUNudHI7CisgIGNvbnN0IFVJTlQgKnBDdXJyZW50VHJlZTsKICAgY29uc3QgVUNIQVIgKnBDYkRpbWVuc2lvbjsKICAgY29uc3QgU0NIQVIgKnBRdWFudFZhbDsKICAgY29uc3QgU0NIQVIgKnBRdWFudFZhbEJhc2U7CiAKICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKLSAgcExlZnRTdGFydE9mU2VnbWVudCAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OwotICBwUmlnaHRTdGFydE9mU2VnbWVudCAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OwotICByZWFkRGlyZWN0aW9uICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247Ci0gIHBTZWdtZW50Qml0ZmllbGQgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKLSAgcENvZGV3b3JkQml0ZmllbGQgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKLSAgc2VnbWVudE9mZnNldCAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OworICBwTGVmdFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKKyAgcFJpZ2h0U3RhcnRPZlNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgcmVhZERpcmVjdGlvbiA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247CisgIHBTZWdtZW50Qml0ZmllbGQgPSBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOworICBwQ29kZXdvcmRCaXRmaWVsZCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBDb2Rld29yZEJpdGZpZWxkOworICBzZWdtZW50T2Zmc2V0ID0gcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldDsKIAotICBwQ29kZWJvb2sgICAgICAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBDb2RlYm9vazsKLSAgaU5vZGUgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pTm9kZTsKLSAgcFJlc3VsdEJhc2UgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZTsKLSAgaVJlc3VsdFBvaW50ZXIgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKLSAgY29kZXdvcmRPZmZzZXQgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKKyAgcENvZGVib29rID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENvZGVib29rOworICBpTm9kZSA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmlOb2RlOworICBwUmVzdWx0QmFzZSA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBSZXN1bHRCYXNlOworICBpUmVzdWx0UG9pbnRlciA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmlSZXN1bHRQb2ludGVyOworICBjb2Rld29yZE9mZnNldCA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0OwogCi0gIHBDYkRpbWVuc2lvbiAgICAgICAgICAgID0gcEhjci0+dGFibGVJbmZvLnBDYkRpbWVuc2lvbjsKKyAgcENiRGltZW5zaW9uID0gYURpbUNiOwogCi0gIHRyZWVOb2RlICAgICAgICAgICAgICAgID0gaU5vZGVbY29kZXdvcmRPZmZzZXRdOwotICBwQ3VycmVudFRyZWUgICAgICAgICAgICA9IGFIdWZmVGFibGVbcENvZGVib29rW2NvZGV3b3JkT2Zmc2V0XV07CisgIHRyZWVOb2RlID0gaU5vZGVbY29kZXdvcmRPZmZzZXRdOworICBwQ3VycmVudFRyZWUgPSBhSHVmZlRhYmxlW3BDb2RlYm9va1tjb2Rld29yZE9mZnNldF1dOwogCisgIGZvciAoOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDA7CisgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMSkgeworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oCisgICAgICAgIGJzLCBwSGNyLT5kZWNJbk91dC5iaXRzdHJlYW1BbmNob3IsICZwTGVmdFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLAorICAgICAgICAmcFJpZ2h0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sIHJlYWREaXJlY3Rpb24pOwogCi0gIGZvciAoIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMSApIHsKKyAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsIC8qIG1ha2UgYSBzdGVwIGluIGRlY29kaW5nIHRyZWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZU5vZGUsICZicmFuY2hWYWx1ZSwgJmJyYW5jaE5vZGUpOwogCi0gICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSggYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKKyAgICAvKiBpZiBlbmQgb2YgYnJhbmNoIHJlYWNoZWQgd3JpdGUgb3V0IGxpbmVzIGFuZCBjb3VudCBiaXRzIG5lZWRlZCBmb3Igc2lnbiwKKyAgICAgKiBvdGhlcndpc2Ugc3RvcmUgbm9kZSBpbiBjb2Rld29yZCBzaWRlaW5mbyAqLworICAgIGlmICgoYnJhbmNoTm9kZSAmIFRFU1RfQklUXzEwKSA9PQorICAgICAgICBURVNUX0JJVF8xMCkgeyAvKiB0ZXN0IGJpdCAxMCA7ID09PiBib2R5IGlzIGNvbXBsZXRlICovCisgICAgICBwUXVhbnRWYWxCYXNlID0gYVF1YW50VGFibGVbcENvZGVib29rW2NvZGV3b3JkT2Zmc2V0XV07IC8qIGdldCBiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvbmdpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYm9vayAqLworICAgICAgcFF1YW50VmFsID0gcFF1YW50VmFsQmFzZSArIGJyYW5jaFZhbHVlOyAvKiBzZXQgcG9pbnRlciB0byBmaXJzdCB2YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lIFtvZiAyIG9yIDQgcXVhbnRpemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc10gKi8KIAotICAgIENhcnJ5Qml0VG9CcmFuY2hWYWx1ZShjYXJyeUJpdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIGEgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hOb2RlKTsKKyAgICAgIGlRU0MgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07IC8qIGdldCBwb3NpdGlvbiBvZiBmaXJzdCBsaW5lIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZyBvdXQgcmVzdWx0ICovCiAKLSAgICAvKiBpZiBlbmQgb2YgYnJhbmNoIHJlYWNoZWQgd3JpdGUgb3V0IGxpbmVzIGFuZCBjb3VudCBiaXRzIG5lZWRlZCBmb3Igc2lnbiwgb3RoZXJ3aXNlIHN0b3JlIG5vZGUgaW4gY29kZXdvcmQgc2lkZWluZm8gKi8KLSAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0gVEVTVF9CSVRfMTApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBiaXQgMTAgOyA9PT4gYm9keSBpcyBjb21wbGV0ZSAqLwotICAgICAgcFF1YW50VmFsQmFzZSA9IGFRdWFudFRhYmxlW3BDb2RlYm9va1tjb2Rld29yZE9mZnNldF1dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYmFzZSBhZGRyZXNzIG9mIHF1YW50aXplZCB2YWx1ZXMgYmVsb25naW5nIHRvIGN1cnJlbnQgY29kZWJvb2sgKi8KLSAgICAgIHBRdWFudFZhbCA9IHBRdWFudFZhbEJhc2UgKyBicmFuY2hWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHBvaW50ZXIgdG8gZmlyc3QgdmFsaWQgbGluZSBbb2YgMiBvciA0IHF1YW50aXplZCB2YWx1ZXNdICovCi0KLSAgICAgIGlRU0MgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgcG9zaXRpb24gb2YgZmlyc3QgbGluZSBmb3Igd3JpdGluZyBvdXQgcmVzdWx0ICovCi0KLSAgICAgIGZvciAoIGRpbUNudHIgPSBwQ2JEaW1lbnNpb25bcENvZGVib29rW2NvZGV3b3JkT2Zmc2V0XV07IGRpbUNudHIgIT0gMDsgZGltQ250ci0tICkgewotICAgICAgICBwUmVzdWx0QmFzZVtpUVNDKytdID0gKEZJWFBfREJMKSpwUXVhbnRWYWwrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgb3V0IDIgb3IgNCBsaW5lcyBpbnRvIHNwZWN0cnVtOyBubyBTaWduIGJpdHMgYXZhaWxhYmxlIGluIHRoaXMgc3RhdGUgKi8KKyAgICAgIGZvciAoZGltQ250ciA9IHBDYkRpbWVuc2lvbltwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsgZGltQ250ciAhPSAwOworICAgICAgICAgICBkaW1DbnRyLS0pIHsKKyAgICAgICAgcFJlc3VsdEJhc2VbaVFTQysrXSA9CisgICAgICAgICAgICAoRklYUF9EQkwpKnBRdWFudFZhbCsrOyAvKiB3cml0ZSBvdXQgMiBvciA0IGxpbmVzIGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWN0cnVtOyBubyBTaWduIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBpbiB0aGlzIHN0YXRlICovCiAgICAgICB9CiAKLSAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLwotICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsYXN0IHJlaW5pdGlhbHphdGlvbiBvZiBmb3IgbG9vcCBjb3VudGVyIChzZWUgYWJvdmUpIGlzIGRvbmUgaGVyZSAqLwotICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgYnJhbmNoIGluIHRyZWUgcmVhY2hlZCAgaS5lLiBhIHdob2xlIG5vblBDVy1Cb2R5IGlzIGRlY29kZWQgKi8KLSAgICB9Ci0gICAgZWxzZSB7IC8qIGJvZHkgaXMgbm90IGRlY29kZWQgY29tcGxldGVseTogKi8KLSAgICAgIHRyZWVOb2RlID0gKihwQ3VycmVudFRyZWUgKyBicmFuY2hWYWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRyZWVOb2RlIGZvciBmdXJ0aGVyIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSAqLworICAgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLCBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKyAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7IC8qIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbG9vcCBjb3VudGVyIChzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KKyAgICAgIGJyZWFrOyAvKiBlbmQgb2YgYnJhbmNoIGluIHRyZWUgcmVhY2hlZCAgaS5lLiBhIHdob2xlIG5vblBDVy1Cb2R5IGlzCisgICAgICAgICAgICAgICAgZGVjb2RlZCAqLworICAgIH0gZWxzZSB7IC8qIGJvZHkgaXMgbm90IGRlY29kZWQgY29tcGxldGVseTogKi8KKyAgICAgIHRyZWVOb2RlID0gKigKKyAgICAgICAgICBwQ3VycmVudFRyZWUgKworICAgICAgICAgIGJyYW5jaFZhbHVlKTsgLyogdXBkYXRlIHRyZWVOb2RlIGZvciBmdXJ0aGVyIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSAqLwogICAgIH0KICAgfQotICBpTm9kZVtjb2Rld29yZE9mZnNldF0gPSB0cmVlTm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB1cGRhdGVkIHRyZWVOb2RlIGJlY2F1c2UgbWF5YmUgZGVjb2Rpbmcgb2YgY29kZXdvcmQgYm9keSBub3QgZmluaXNoZWQgeWV0ICovCisgIGlOb2RlW2NvZGV3b3JkT2Zmc2V0XSA9IHRyZWVOb2RlOyAvKiBzdG9yZSB1cGRhdGVkIHRyZWVOb2RlIGJlY2F1c2UgbWF5YmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nIG9mIGNvZGV3b3JkIGJvZHkgbm90IGZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXQgKi8KIAotICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDw9IDAgKSB7Ci0gICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCkgeworICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCiAKLSNpZiBTVEFURV9NQUNISU5FX0VSUk9SX0NIRUNLCi0gICAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8IDAgKSB7CisgICAgaWYgKHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCkgewogICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gU1RBVEVfRVJST1JfQk9EWV9PTkxZOwotICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9PTkxZOworICAgICAgcmV0dXJuIEJPRFlfT05MWTsKICAgICB9Ci0jZW5kaWYKICAgfQogCiAgIHJldHVybiBTVE9QX1RISVNfU1RBVEU7CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246IERlY29kZXMgdGhlIGNvZGV3b3JkIGJvZHksIHdyaXRlcyBvdXQgcmVzdWx0IGFuZCBjb3VudHMgdGhlIG51bWJlciBvZiBxdWFudGl6ZWQKLSAgICAgICAgICAgICAgICAgIHNwZWN0cmFsIHZhbHVlcywgd2hpY2ggYXJlIGRpZmZlcmVudCBmb3JtIHplcm8uIEZvciB0aG9zZSB2YWx1ZXMgc2lnbiBiaXRzIGFyZQotICAgICAgICAgICAgICAgICAgbmVlZGVkLgorICAgICBkZXNjcmlwdGlvbjogRGVjb2RlcyB0aGUgY29kZXdvcmQgYm9keSwgd3JpdGVzIG91dCByZXN1bHQgYW5kIGNvdW50cyB0aGUKK251bWJlciBvZiBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWVzLCB3aGljaCBhcmUgZGlmZmVyZW50IGZvcm0gemVyby4gRm9yIHRob3NlCit2YWx1ZXMgc2lnbiBiaXRzIGFyZSBuZWVkZWQuCiAKLSAgICAgICAgICAgICAgICAgIElmIHNpZ24gYml0IGNvdW50ZXIgY250U2lnbiBpcyBkaWZmZXJlbnQgZnJvbSB6ZXJvLCBzd2l0Y2ggdG8gbmV4dCBzdGF0ZSB0bwotICAgICAgICAgICAgICAgICAgZGVjb2RlIHNpZ24gQml0cyB0aGVyZS4KLSAgICAgICAgICAgICAgICAgIElmIHNpZ24gYml0IGNvdW50ZXIgY250U2lnbiBpcyB6ZXJvLCBubyBzaWduIGJpdHMgYXJlIG5lZWRlZCBhbmQgY29kZXdvcmQgaXMKLSAgICAgICAgICAgICAgICAgIGRlY29kZWQuCisgICAgICAgICAgICAgICAgICBJZiBzaWduIGJpdCBjb3VudGVyIGNudFNpZ24gaXMgZGlmZmVyZW50IGZyb20gemVybywgc3dpdGNoIHRvCituZXh0IHN0YXRlIHRvIGRlY29kZSBzaWduIEJpdHMgdGhlcmUuIElmIHNpZ24gYml0IGNvdW50ZXIgY250U2lnbiBpcyB6ZXJvLCBubworc2lnbiBiaXRzIGFyZSBuZWVkZWQgYW5kIGNvZGV3b3JkIGlzIGRlY29kZWQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXRwdXQ6ICAgVHdvIG9yIGZvdXIgd3JpdHRlbiBxdWFudGl6ZXMgc3BlY3RyYWwgdmFsdWVzIHdyaXR0ZW4gYXQgcG9zaXRpb24gd2hlcmUKLSAgICAgICAgICAgICAgICAgIHBSZXN1bHRQb2ludHIgcG9pbnRzIHRvLiBUaGUgc2lnbnMgb2YgdGhvc2UgbGluZXMgbWF5IGJlIHdyb25nLiBJZiB0aGUgc2lnbnMKLSAgICAgICAgICAgICAgICAgIFtvbiBqdXN0IG9uZSBzaWdubGUgc2lnbl0gaXMgd3JvbmcsIHRoZSBuZXh0IHN0YXRlIHdpbGwgY29ycmVjdCBpdC4KKyAgICAgICAgb3V0cHV0OiAgIFR3byBvciBmb3VyIHdyaXR0ZW4gcXVhbnRpemVzIHNwZWN0cmFsIHZhbHVlcyB3cml0dGVuIGF0Citwb3NpdGlvbiB3aGVyZSBwUmVzdWx0UG9pbnRyIHBvaW50cyB0by4gVGhlIHNpZ25zIG9mIHRob3NlIGxpbmVzIG1heSBiZSB3cm9uZy4KK0lmIHRoZSBzaWducyBbb24ganVzdCBvbmUgc2lnbmxlIHNpZ25dIGlzIHdyb25nLCB0aGUgbmV4dCBzdGF0ZSB3aWxsIGNvcnJlY3QgaXQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9fQk9EWShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKQoteworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fX0JPRFkoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIHZvaWQgKnB0cikgewogICBIX0hDUl9JTkZPIHBIY3IgPSAoSF9IQ1JfSU5GTylwdHI7Ci0gIFNDSEFSICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKLSAgVVNIT1JUICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVTSE9SVCAgICAgICpwUmlnaHRTdGFydE9mU2VnbWVudDsKLSAgVUNIQVIgICAgICAgIHJlYWREaXJlY3Rpb247Ci0gIFVJTlQgICAgICAgICpwU2VnbWVudEJpdGZpZWxkOwotICBVSU5UICAgICAgICAqcENvZGV3b3JkQml0ZmllbGQ7Ci0gIFVJTlQgICAgICAgICBzZWdtZW50T2Zmc2V0OworICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIElOVCAqcExlZnRTdGFydE9mU2VnbWVudDsKKyAgSU5UICpwUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgVUNIQVIgcmVhZERpcmVjdGlvbjsKKyAgVUlOVCAqcFNlZ21lbnRCaXRmaWVsZDsKKyAgVUlOVCAqcENvZGV3b3JkQml0ZmllbGQ7CisgIFVJTlQgc2VnbWVudE9mZnNldDsKIAotICBVQ0hBUiAgICAgICAqcENvZGVib29rOwotICBVSU5UICAgICAgICAqaU5vZGU7Ci0gIFVDSEFSICAgICAgICpwQ250U2lnbjsKLSAgRklYUF9EQkwgICAgKnBSZXN1bHRCYXNlOwotICBVU0hPUlQgICAgICAqaVJlc3VsdFBvaW50ZXI7Ci0gIFVJTlQgICAgICAgICBjb2Rld29yZE9mZnNldDsKKyAgVUNIQVIgKnBDb2RlYm9vazsKKyAgVUlOVCAqaU5vZGU7CisgIFVDSEFSICpwQ250U2lnbjsKKyAgRklYUF9EQkwgKnBSZXN1bHRCYXNlOworICBVU0hPUlQgKmlSZXN1bHRQb2ludGVyOworICBVSU5UIGNvZGV3b3JkT2Zmc2V0OwogCi0gIFVJTlQgICAgICAgICBpUVNDOwotICBVSU5UICAgICAgICAgY250U2lnbjsKLSAgVUNIQVIgICAgICAgIGRpbUNudHI7Ci0gIFVDSEFSICAgICAgICBjYXJyeUJpdDsKLSAgU0NIQVIgICAgICAgKnBTdGE7Ci0gIFVJTlQgICAgICAgICB0cmVlTm9kZTsKLSAgVUlOVCAgICAgICAgIGJyYW5jaFZhbHVlOwotICBVSU5UICAgICAgICAgYnJhbmNoTm9kZTsKKyAgVUlOVCBpUVNDOworICBVSU5UIGNudFNpZ247CisgIFVDSEFSIGRpbUNudHI7CisgIFVDSEFSIGNhcnJ5Qml0OworICBTQ0hBUiAqcFN0YTsKKyAgVUlOVCB0cmVlTm9kZTsKKyAgVUlOVCBicmFuY2hWYWx1ZTsKKyAgVUlOVCBicmFuY2hOb2RlOwogICBjb25zdCBVQ0hBUiAqcENiRGltZW5zaW9uOwotICBjb25zdCBVSU5UICAqcEN1cnJlbnRUcmVlOworICBjb25zdCBVSU5UICpwQ3VycmVudFRyZWU7CiAgIGNvbnN0IFNDSEFSICpwUXVhbnRWYWxCYXNlOwogICBjb25zdCBTQ0hBUiAqcFF1YW50VmFsOwogCi0gIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50ICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0gIHBMZWZ0U3RhcnRPZlNlZ21lbnQgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKLSAgcFJpZ2h0U3RhcnRPZlNlZ21lbnQgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKLSAgcmVhZERpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOwotICBwU2VnbWVudEJpdGZpZWxkICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7Ci0gIHBDb2Rld29yZEJpdGZpZWxkICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7Ci0gIHNlZ21lbnRPZmZzZXQgICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldDsKKyAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgcExlZnRTdGFydE9mU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIHBSaWdodFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIHJlYWREaXJlY3Rpb24gPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOworICBwU2VnbWVudEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgcENvZGV3b3JkQml0ZmllbGQgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKKyAgc2VnbWVudE9mZnNldCA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7CiAKLSAgcENvZGVib29rICAgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ29kZWJvb2s7Ci0gIGlOb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaU5vZGU7Ci0gIHBDbnRTaWduICAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247Ci0gIHBSZXN1bHRCYXNlICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7Ci0gIGlSZXN1bHRQb2ludGVyICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7Ci0gIGNvZGV3b3JkT2Zmc2V0ICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQ7Ci0gIHBTdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKKyAgcENvZGVib29rID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENvZGVib29rOworICBpTm9kZSA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmlOb2RlOworICBwQ250U2lnbiA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBDbnRTaWduOworICBwUmVzdWx0QmFzZSA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBSZXN1bHRCYXNlOworICBpUmVzdWx0UG9pbnRlciA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmlSZXN1bHRQb2ludGVyOworICBjb2Rld29yZE9mZnNldCA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0OworICBwU3RhID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKIAotICBwQ2JEaW1lbnNpb24gICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPnRhYmxlSW5mby5wQ2JEaW1lbnNpb247CisgIHBDYkRpbWVuc2lvbiA9IGFEaW1DYjsKIAotICB0cmVlTm9kZSAgICAgICAgICAgICAgICAgICAgICAgICA9IGlOb2RlW2NvZGV3b3JkT2Zmc2V0XTsKLSAgcEN1cnJlbnRUcmVlICAgICAgICAgICAgICAgICAgICAgPSBhSHVmZlRhYmxlW3BDb2RlYm9va1tjb2Rld29yZE9mZnNldF1dOworICB0cmVlTm9kZSA9IGlOb2RlW2NvZGV3b3JkT2Zmc2V0XTsKKyAgcEN1cnJlbnRUcmVlID0gYUh1ZmZUYWJsZVtwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsKIAorICBmb3IgKDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwOworICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDEpIHsKKyAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKAorICAgICAgICBicywgcEhjci0+ZGVjSW5PdXQuYml0c3RyZWFtQW5jaG9yLCAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKKyAgICAgICAgJnBSaWdodFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLCByZWFkRGlyZWN0aW9uKTsKIAotICBmb3IgKCA7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdID4gMCA7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDEgKSB7CisgICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LCAvKiBtYWtlIGEgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLCAmYnJhbmNoVmFsdWUsICZicmFuY2hOb2RlKTsKIAotICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJpZ2h0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CisgICAgLyogaWYgZW5kIG9mIGJyYW5jaCByZWFjaGVkIHdyaXRlIG91dCBsaW5lcyBhbmQgY291bnQgYml0cyBuZWVkZWQgZm9yIHNpZ24sCisgICAgICogb3RoZXJ3aXNlIHN0b3JlIG5vZGUgaW4gY29kZXdvcmQgc2lkZWluZm8gKi8KKyAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0KKyAgICAgICAgVEVTVF9CSVRfMTApIHsgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgYm9keSBjb21wbGV0ZSAqLworICAgICAgLyogYm9keSBjb21wbGV0ZWx5IGRlY29kZWQ7IGJyYW5jaFZhbHVlIGlzIHZhbGlkLCBzZXQgcFF1YW50VmFsIHRvIGZpcnN0CisgICAgICAgKiAob2YgdHdvIG9yIGZvdXIpIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMgKi8KKyAgICAgIHBRdWFudFZhbEJhc2UgPSBhUXVhbnRUYWJsZVtwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsgLyogZ2V0IGJhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbG9uZ2luZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVib29rICovCisgICAgICBwUXVhbnRWYWwgPSBwUXVhbnRWYWxCYXNlICsgYnJhbmNoVmFsdWU7IC8qIHNldCBwb2ludGVyIHRvIGZpcnN0IHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgW29mIDIgb3IgNCBxdWFudGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzXSAqLwogCi0gICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1ha2UgYSBzdGVwIGluIGRlY29kaW5nIHRyZWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyYW5jaE5vZGUpOworICAgICAgaVFTQyA9IGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XTsgLyogZ2V0IHBvc2l0aW9uIG9mIGZpcnN0IGxpbmUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nIHJlc3VsdCAqLwogCi0gICAgLyogaWYgZW5kIG9mIGJyYW5jaCByZWFjaGVkIHdyaXRlIG91dCBsaW5lcyBhbmQgY291bnQgYml0cyBuZWVkZWQgZm9yIHNpZ24sIG90aGVyd2lzZSBzdG9yZSBub2RlIGluIGNvZGV3b3JkIHNpZGVpbmZvICovCi0gICAgaWYgKChicmFuY2hOb2RlICYgVEVTVF9CSVRfMTApID09IFRFU1RfQklUXzEwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlc3QgYml0IDEwIDsgaWYgc2V0IGJvZHkgY29tcGxldGUgKi8KLSAgICAgIC8qIGJvZHkgY29tcGxldGVseSBkZWNvZGVkOyBicmFuY2hWYWx1ZSBpcyB2YWxpZCwgc2V0IHBRdWFudFZhbCB0byBmaXJzdCAob2YgdHdvIG9yIGZvdXIpIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMgKi8KLSAgICAgIHBRdWFudFZhbEJhc2UgPSBhUXVhbnRUYWJsZVtwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGJhc2UgYWRkcmVzcyBvZiBxdWFudGl6ZWQgdmFsdWVzIGJlbG9uZ2luZyB0byBjdXJyZW50IGNvZGVib29rICovCi0gICAgICBwUXVhbnRWYWwgPSBwUXVhbnRWYWxCYXNlICsgYnJhbmNoVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBwb2ludGVyIHRvIGZpcnN0IHZhbGlkIGxpbmUgW29mIDIgb3IgNCBxdWFudGl6ZWQgdmFsdWVzXSAqLwotCi0gICAgICBpUVNDID0gaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBwb3NpdGlvbiBvZiBmaXJzdCBsaW5lIGZvciB3cml0aW5nIHJlc3VsdCAqLwotCi0gICAgICAvKiBjb2Rld29yZCBkZWNvZGluZyByZXN1bHQgaXMgd3JpdHRlbiBvdXQgaGVyZTogV3JpdGUgb3V0IDIgb3IgNCBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWVzIHdpdGggcHJvYmFibHkgKi8KLSAgICAgIC8qIHdyb25nIHNpZ24gYW5kIGNvdW50IG51bWJlciBvZiB2YWx1ZXMgd2hpY2ggYXJlIGRpZmZlcmVudCBmcm9tIHplcm8gZm9yIHNpZ24gYml0IGRlY29kaW5nIFt3aGljaCBoYXBwZW5zIGluIG5leHQgc3RhdGVdICovCisgICAgICAvKiBjb2Rld29yZCBkZWNvZGluZyByZXN1bHQgaXMgd3JpdHRlbiBvdXQgaGVyZTogV3JpdGUgb3V0IDIgb3IgNAorICAgICAgICogcXVhbnRpemVkIHNwZWN0cmFsIHZhbHVlcyB3aXRoIHByb2JhYmx5ICovCisgICAgICAvKiB3cm9uZyBzaWduIGFuZCBjb3VudCBudW1iZXIgb2YgdmFsdWVzIHdoaWNoIGFyZSBkaWZmZXJlbnQgZnJvbSB6ZXJvIGZvcgorICAgICAgICogc2lnbiBiaXQgZGVjb2RpbmcgW3doaWNoIGhhcHBlbnMgaW4gbmV4dCBzdGF0ZV0gKi8KICAgICAgIGNudFNpZ24gPSAwOwotICAgICAgZm9yICggZGltQ250ciA9IHBDYkRpbWVuc2lvbltwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsgZGltQ250ciAhPSAwOyBkaW1DbnRyLS0gKSB7Ci0gICAgICAgIHBSZXN1bHRCYXNlW2lRU0MrK10gPSAoRklYUF9EQkwpKnBRdWFudFZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBxdWFudC4gc3BlYy4gY29lZi4gaW50byBzcGVjdHJ1bSAqLwotICAgICAgICBpZiAoICpwUXVhbnRWYWwrKyAhPSAwICkgeworICAgICAgZm9yIChkaW1DbnRyID0gcENiRGltZW5zaW9uW3BDb2RlYm9va1tjb2Rld29yZE9mZnNldF1dOyBkaW1DbnRyICE9IDA7CisgICAgICAgICAgIGRpbUNudHItLSkgeworICAgICAgICBwUmVzdWx0QmFzZVtpUVNDKytdID0KKyAgICAgICAgICAgIChGSVhQX0RCTCkqcFF1YW50VmFsOyAvKiB3cml0ZSBxdWFudC4gc3BlYy4gY29lZi4gaW50byBzcGVjdHJ1bSAqLworICAgICAgICBpZiAoKnBRdWFudFZhbCsrICE9IDApIHsKICAgICAgICAgICBjbnRTaWduICs9IDE7CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgaWYgKCBjbnRTaWduID09IDAgKSB7Ci0gICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCisgICAgICBpZiAoY250U2lnbiA9PSAwKSB7CisgICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKAorICAgICAgICAgICAgJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLCBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1hY2hpbmUgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBDbnRTaWduW2NvZGV3b3JkT2Zmc2V0XSA9IGNudFNpZ247ICAgICAvKiB3cml0ZSBzaWduIGNvdW50IHJlc3VsdCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rld29yZHNpZGVpbmZvIG9mIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV3b3JkICovCisgICAgICAgIHBTdGFbY29kZXdvcmRPZmZzZXRdID0gQk9EWV9TSUdOX19TSUdOOyAvKiBjaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0KKyAgICAgICAgICAgIGFTdGF0ZUNvbnN0YW50MlN0YXRlW3BTdGFbY29kZXdvcmRPZmZzZXRdXTsgLyogZ2V0IHN0YXRlIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGUgYXJyYXkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ctc2lkZWluZm8gKi8KICAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBwQ250U2lnbltjb2Rld29yZE9mZnNldF0gPSBjbnRTaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBzaWduIGNvdW50IHJlc3VsdCBpbnRvIGNvZGV3b3Jkc2lkZWluZm8gb2YgY3VycmVudCBjb2Rld29yZCAqLwotICAgICAgICBwU3RhW2NvZGV3b3JkT2Zmc2V0XSA9IEJPRFlfU0lHTl9fU0lHTjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0gYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOyAgICAgICAgICAgLyogZ2V0IHN0YXRlIGZyb20gc2VwYXJhdGUgYXJyYXkgb2YgY3ctc2lkZWluZm8gKi8KLSAgICAgIH0KLSAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YgZm9yIGxvb3AgY291bnRlciAoc2VlIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KLSAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGJyYW5jaCBpbiB0cmVlIHJlYWNoZWQgIGkuZS4gYSB3aG9sZSBub25QQ1ctQm9keSBpcyBkZWNvZGVkICovCi0gICAgfQotICAgIGVsc2Ugey8qIGJvZHkgaXMgbm90IGRlY29kZWQgY29tcGxldGVseTogKi8KLSAgICAgIHRyZWVOb2RlID0gKihwQ3VycmVudFRyZWUgKyBicmFuY2hWYWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRyZWVOb2RlIGZvciBmdXJ0aGVyIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSAqLworICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb29wIGNvdW50ZXIgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUpIGlzIGRvbmUgaGVyZSAqLworICAgICAgYnJlYWs7IC8qIGVuZCBvZiBicmFuY2ggaW4gdHJlZSByZWFjaGVkICBpLmUuIGEgd2hvbGUgbm9uUENXLUJvZHkgaXMKKyAgICAgICAgICAgICAgICBkZWNvZGVkICovCisgICAgfSBlbHNlIHsgLyogYm9keSBpcyBub3QgZGVjb2RlZCBjb21wbGV0ZWx5OiAqLworICAgICAgdHJlZU5vZGUgPSAqKAorICAgICAgICAgIHBDdXJyZW50VHJlZSArCisgICAgICAgICAgYnJhbmNoVmFsdWUpOyAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCiAgICAgfQogICB9Ci0gIGlOb2RlW2NvZGV3b3JkT2Zmc2V0XSA9IHRyZWVOb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHVwZGF0ZWQgdHJlZU5vZGUgYmVjYXVzZSBtYXliZSBkZWNvZGluZyBvZiBjb2Rld29yZCBib2R5IG5vdCBmaW5pc2hlZCB5ZXQgKi8KKyAgaU5vZGVbY29kZXdvcmRPZmZzZXRdID0gdHJlZU5vZGU7IC8qIHN0b3JlIHVwZGF0ZWQgdHJlZU5vZGUgYmVjYXVzZSBtYXliZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rpbmcgb2YgY29kZXdvcmQgYm9keSBub3QgZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlldCAqLwogCi0gIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCApIHsKLSAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCisgIGlmIChwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8PSAwKSB7CisgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLCBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50Qml0ZmllbGQpOyAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KIAotI2lmIFNUQVRFX01BQ0hJTkVfRVJST1JfQ0hFQ0sKLSAgICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCApIHsKKyAgICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPCAwKSB7CiAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTVEFURV9FUlJPUl9CT0RZX1NJR05fX0JPRFk7Ci0gICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFk7CisgICAgICByZXR1cm4gQk9EWV9TSUdOX19CT0RZOwogICAgIH0KLSNlbmRpZgogICB9CiAKICAgcmV0dXJuIFNUT1BfVEhJU19TVEFURTsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogVGhpcyBzdGF0ZSBkZWNvZGVzIHRoZSBzaWduIGJpdHMgYmVsb25naW5nIHRvIGEgY29kZXdvcmQuIFRoZSBzdGF0ZSBpcyBjYWxsZWQKLSAgICAgICAgICAgICAgICAgIGFzIG9mdGVuIGluIGRpZmZlcmVudCAidHJpYWxzIiB1bnRpbCBwQ250U2duW2NvZGV3b3JkT2Zmc2V0XSBpcyB6ZXJvLgorICAgICBkZXNjcmlwdGlvbjogVGhpcyBzdGF0ZSBkZWNvZGVzIHRoZSBzaWduIGJpdHMgYmVsb25naW5nIHRvIGEgY29kZXdvcmQuIFRoZQorc3RhdGUgaXMgY2FsbGVkIGFzIG9mdGVuIGluIGRpZmZlcmVudCAidHJpYWxzIiB1bnRpbCBwQ250U2duW2NvZGV3b3JkT2Zmc2V0XSBpcworemVyby4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dHB1dDogICBUaGUgdHdvIG9yIGZvdXIgcXVhbnRpemVzIHNwZWN0cmFsIHZhbHVlcyAod3JpdHRlbiBpbiBwcmV2aW91cyBzdGF0ZSkgaGF2ZQotICAgICAgICAgICAgICAgICAgbm93IHRoZSBjb3JyZWN0IHNpZ24uCisgICAgICAgIG91dHB1dDogICBUaGUgdHdvIG9yIGZvdXIgcXVhbnRpemVzIHNwZWN0cmFsIHZhbHVlcyAod3JpdHRlbiBpbiBwcmV2aW91cworc3RhdGUpIGhhdmUgbm93IHRoZSBjb3JyZWN0IHNpZ24uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9fU0lHTihIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKQoteworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fX1NJR04oSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIHZvaWQgKnB0cikgewogICBIX0hDUl9JTkZPIHBIY3IgPSAoSF9IQ1JfSU5GTylwdHI7Ci0gIFNDSEFSICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKLSAgVVNIT1JUICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVTSE9SVCAgICAgICpwUmlnaHRTdGFydE9mU2VnbWVudDsKLSAgVUNIQVIgICAgICAgIHJlYWREaXJlY3Rpb247Ci0gIFVJTlQgICAgICAgICpwU2VnbWVudEJpdGZpZWxkOwotICBVSU5UICAgICAgICAqcENvZGV3b3JkQml0ZmllbGQ7Ci0gIFVJTlQgICAgICAgICBzZWdtZW50T2Zmc2V0OworICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIElOVCAqcExlZnRTdGFydE9mU2VnbWVudDsKKyAgSU5UICpwUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgVUNIQVIgcmVhZERpcmVjdGlvbjsKKyAgVUlOVCAqcFNlZ21lbnRCaXRmaWVsZDsKKyAgVUlOVCAqcENvZGV3b3JkQml0ZmllbGQ7CisgIFVJTlQgc2VnbWVudE9mZnNldDsKIAotICBVQ0hBUiAgICAgICAqcENudFNpZ247Ci0gIEZJWFBfREJMICAgICpwUmVzdWx0QmFzZTsKLSAgVVNIT1JUICAgICAgKmlSZXN1bHRQb2ludGVyOwotICBVSU5UICAgICAgICAgY29kZXdvcmRPZmZzZXQ7Ci0gIFVDSEFSICAgICAgICBjYXJyeUJpdDsKLSAgVUlOVCAgICAgICAgIGlRU0M7Ci0gIFVDSEFSICAgICAgICBjbnRTaWduOworICBVQ0hBUiAqcENudFNpZ247CisgIEZJWFBfREJMICpwUmVzdWx0QmFzZTsKKyAgVVNIT1JUICppUmVzdWx0UG9pbnRlcjsKKyAgVUlOVCBjb2Rld29yZE9mZnNldDsKKworICBVQ0hBUiBjYXJyeUJpdDsKKyAgVUlOVCBpUVNDOworICBVQ0hBUiBjbnRTaWduOwogCiAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0gIHBMZWZ0U3RhcnRPZlNlZ21lbnQgICAgID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKLSAgcFJpZ2h0U3RhcnRPZlNlZ21lbnQgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKLSAgcmVhZERpcmVjdGlvbiAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOwotICBwU2VnbWVudEJpdGZpZWxkICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7Ci0gIHBDb2Rld29yZEJpdGZpZWxkICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7Ci0gIHNlZ21lbnRPZmZzZXQgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldDsKKyAgcExlZnRTdGFydE9mU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIHBSaWdodFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIHJlYWREaXJlY3Rpb24gPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOworICBwU2VnbWVudEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgcENvZGV3b3JkQml0ZmllbGQgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKKyAgc2VnbWVudE9mZnNldCA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7CiAKLSAgcENudFNpZ24gICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ250U2lnbjsKLSAgcFJlc3VsdEJhc2UgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZTsKLSAgaVJlc3VsdFBvaW50ZXIgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKLSAgY29kZXdvcmRPZmZzZXQgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKLSAgaVFTQyAgICAgICAgICAgICAgICAgICAgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07Ci0gIGNudFNpZ24gICAgICAgICAgICAgICAgID0gcENudFNpZ25bY29kZXdvcmRPZmZzZXRdOworICAvKnBDb2RlYm9vayAgICAgICAgICAgICAgID0gKi8KKyAgcENudFNpZ24gPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ250U2lnbjsKKyAgcFJlc3VsdEJhc2UgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZTsKKyAgaVJlc3VsdFBvaW50ZXIgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKKyAgY29kZXdvcmRPZmZzZXQgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKIAotCisgIGlRU0MgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07CisgIGNudFNpZ24gPSBwQ250U2lnbltjb2Rld29yZE9mZnNldF07CiAKICAgLyogbG9vcCBmb3Igc2lnbiBiaXQgZGVjb2RpbmcgKi8KLSAgZm9yICggOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDAgOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxICkgeworICBmb3IgKDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwOworICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDEpIHsKKyAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKAorICAgICAgICBicywgcEhjci0+ZGVjSW5PdXQuYml0c3RyZWFtQW5jaG9yLCAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKKyAgICAgICAgJnBSaWdodFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLCByZWFkRGlyZWN0aW9uKTsKKyAgICBjbnRTaWduIC09CisgICAgICAgIDE7IC8qIGRlY3JlbWVudCBzaWduIGNvdW50ZXIgYmVjYXVzZSBvbmUgc2lnbiBiaXQgaGFzIGJlZW4gcmVhZCAqLwogCi0gICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSggYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKLSAgICBjbnRTaWduIC09IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVjcmVtZW50IHNpZ24gY291bnRlciBiZWNhdXNlIG9uZSBzaWduIGJpdCBoYXMgYmVlbiByZWFkICovCi0KLSAgICAvKiBzZWFyY2ggZm9yIGEgbGluZSAod2hpY2ggd2FzIGRlY29kZWQgaW4gcHJldmlvdXMgc3RhdGUpIHdoaWNoIGlzIG5vdCB6ZXJvLiBbVGhpcyB2YWx1ZSB3aWxsIGdldCBhIHNpZ25dICovCi0gICAgd2hpbGUgKCBwUmVzdWx0QmFzZVtpUVNDXSA9PSAoRklYUF9EQkwpMCApIHsKLSAgICAgIGlRU0MrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRzIHRvIGN1cnJlbnQgdmFsdWUgZGlmZmVyZW50IGZyb20gemVybyAqLwotICAgICAgaWYgKGlRU0MgPj0gMTAyNCkgeworICAgIC8qIHNlYXJjaCBmb3IgYSBsaW5lICh3aGljaCB3YXMgZGVjb2RlZCBpbiBwcmV2aW91cyBzdGF0ZSkgd2hpY2ggaXMgbm90CisgICAgICogemVyby4gW1RoaXMgdmFsdWUgd2lsbCBnZXQgYSBzaWduXSAqLworICAgIHdoaWxlIChwUmVzdWx0QmFzZVtpUVNDXSA9PSAoRklYUF9EQkwpMCkgeworICAgICAgaWYgKCsraVFTQyA+PSAxMDI0KSB7IC8qIHBvaW50cyB0byBjdXJyZW50IHZhbHVlIGRpZmZlcmVudCBmcm9tIHplcm8gKi8KICAgICAgICAgcmV0dXJuIEJPRFlfU0lHTl9fU0lHTjsKICAgICAgIH0KICAgICB9CiAKLSAgICAvKiBwdXQgc2lnbiB0b2dldGhlciB3aXRoIGxpbmU7IGlmIGNhcnJ5Qml0IGlzIHplcm8sIHRoZSBzaWduIGlzIG9rIGFscmVhZHk7IG5vIHdyaXRlIG9wZXJhdGlvbiBuZWNlc3NhcnkgaW4gdGhpcyBjYXNlICovCi0gICAgaWYgKCBjYXJyeUJpdCAhPSAwICkgewotICAgICAgcFJlc3VsdEJhc2VbaVFTQ10gPSAtcFJlc3VsdEJhc2VbaVFTQ107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYXJyeUJpdCA9IDEgLS0+IG1pbnVzICovCisgICAgLyogcHV0IHNpZ24gdG9nZXRoZXIgd2l0aCBsaW5lOyBpZiBjYXJyeUJpdCBpcyB6ZXJvLCB0aGUgc2lnbiBpcyBvayBhbHJlYWR5OworICAgICAqIG5vIHdyaXRlIG9wZXJhdGlvbiBuZWNlc3NhcnkgaW4gdGhpcyBjYXNlICovCisgICAgaWYgKGNhcnJ5Qml0ICE9IDApIHsKKyAgICAgIHBSZXN1bHRCYXNlW2lRU0NdID0gLXBSZXN1bHRCYXNlW2lRU0NdOyAvKiBjYXJyeUJpdCA9IDEgLS0+IG1pbnVzICovCiAgICAgfQogCi0gICAgaVFTQysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBwb2ludGVyIHRvIG5leHQgKG1heWJlIHZhbGlkKSB2YWx1ZSAqLworICAgIGlRU0MrKzsgLyogdXBkYXRlIHBvaW50ZXIgdG8gbmV4dCAobWF5YmUgdmFsaWQpIHZhbHVlICovCiAKLSAgICBpZiAoIGNudFNpZ24gPT0gMCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKGNudFNpZ249PTApICA9PT4gIHNldCBzdGF0ZSBDT0RFV09SRF9ERUNPREVEICovCi0gICAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KLSAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YgZm9yIGxvb3AgY291bnRlciAoc2VlIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KLSAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hvbGUgbm9uUENXLUJvZHkgYW5kIGFjY29yZGluZyBzaWduIGJpdHMgYXJlIGRlY29kZWQgKi8KLSAgICAgfQorICAgIGlmIChjbnRTaWduID09IDApIHsgLyogaWYgKGNudFNpZ249PTApICA9PT4gIHNldCBzdGF0ZSBDT0RFV09SRF9ERUNPREVEICovCisgICAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7IC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb29wIGNvdW50ZXIgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUpIGlzIGRvbmUgaGVyZSAqLworICAgICAgYnJlYWs7IC8qIHdob2xlIG5vblBDVy1Cb2R5IGFuZCBhY2NvcmRpbmcgc2lnbiBiaXRzIGFyZSBkZWNvZGVkICovCisgICAgfQogICB9CiAgIHBDbnRTaWduW2NvZGV3b3JkT2Zmc2V0XSA9IGNudFNpZ247Ci0gIGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XSA9IGlRU0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHVwZGF0ZWQgcFJlc3VsdFBvaW50ZXIgKi8KKyAgaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdID0gaVFTQzsgLyogc3RvcmUgdXBkYXRlZCBwUmVzdWx0UG9pbnRlciAqLwogCi0gIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCApIHsKLSAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCisgIGlmIChwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8PSAwKSB7CisgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLCBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50Qml0ZmllbGQpOyAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KIAotI2lmIFNUQVRFX01BQ0hJTkVfRVJST1JfQ0hFQ0sKLSAgICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCApIHsKKyAgICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPCAwKSB7CiAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTVEFURV9FUlJPUl9CT0RZX1NJR05fX1NJR047Ci0gICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX1NJR047CisgICAgICByZXR1cm4gQk9EWV9TSUdOX19TSUdOOwogICAgIH0KLSNlbmRpZgogICB9CiAKICAgcmV0dXJuIFNUT1BfVEhJU19TVEFURTsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogRGVjb2RlcyB0aGUgY29kZXdvcmQgYm9keSBpbiBjYXNlIG9mIGNvZGVib29rIGlzIDExLiBXcml0ZXMgb3V0IHJlc3VsdGluZwotICAgICAgICAgICAgICAgICAgdHdvIG9yIGZvdXIgbGluZXMgW3dpdGggcHJvYmFibHkgd3Jvbmcgc2lnbl0gYW5kIGNvdW50cyB0aGUgbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICBsaW5lcywgd2hpY2ggYXJlIGRpZmZlcmVudCBmb3JtIHplcm8uIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkIGluIG5leHQKKyAgICAgZGVzY3JpcHRpb246IERlY29kZXMgdGhlIGNvZGV3b3JkIGJvZHkgaW4gY2FzZSBvZiBjb2RlYm9vayBpcyAxMS4gV3JpdGVzCitvdXQgcmVzdWx0aW5nIHR3byBvciBmb3VyIGxpbmVzIFt3aXRoIHByb2JhYmx5IHdyb25nIHNpZ25dIGFuZCBjb3VudHMgdGhlIG51bWJlcgorb2YgbGluZXMsIHdoaWNoIGFyZSBkaWZmZXJlbnQgZm9ybSB6ZXJvLiBUaGlzIGluZm9ybWF0aW9uIGlzIG5lZWRlZCBpbiBuZXh0CiAgICAgICAgICAgICAgICAgICBzdGF0ZSB3aGVyZSBzaWduIGJpdHMgd2lsbCBiZSBkZWNvZGVkLCBpZiBuZWNlc3NhcnkuCi0gICAgICAgICAgICAgICAgICBJZiBzaWduIGJpdCBjb3VudGVyIGNudFNpZ24gaXMgemVybywgbm8gc2lnbiBiaXRzIGFyZSBuZWVkZWQgYW5kIGNvZGV3b3JkIGlzCi0gICAgICAgICAgICAgICAgICBkZWNvZGVkIGNvbXBsZXRlbHkuCisgICAgICAgICAgICAgICAgICBJZiBzaWduIGJpdCBjb3VudGVyIGNudFNpZ24gaXMgemVybywgbm8gc2lnbiBiaXRzIGFyZSBuZWVkZWQKK2FuZCBjb2Rld29yZCBpcyBkZWNvZGVkIGNvbXBsZXRlbHkuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXRwdXQ6ICAgVHdvIGxpbmVzIChxdWFudGl6ZXMgc3BlY3RyYWwgY29lZmZpY2llbnRzKSB3aGljaCBhcmUgcHJvYmFibHkgd3JvbmcuIFRoZQotICAgICAgICAgICAgICAgICAgc2lnbiBtYXkgYmUgd3JvbmcgYW5kIGlmIG9uZSBvciB0d28gdmFsdWVzIGlzL2FyZSAxNiwgdGhlIGZvbGxvd2luZyBzdGF0ZXMKLSAgICAgICAgICAgICAgICAgIHdpbGwgZGVjb2RlIHRoZSBlc2NhcGUgc2VxdWVuY2UgdG8gY29ycmVjdCB0aGUgdmFsdWVzIHdoaWNoIGFyZSB3aXJ0dGVuIGhlcmUuCisgICAgICAgIG91dHB1dDogICBUd28gbGluZXMgKHF1YW50aXplcyBzcGVjdHJhbCBjb2VmZmljaWVudHMpIHdoaWNoIGFyZSBwcm9iYWJseQord3JvbmcuIFRoZSBzaWduIG1heSBiZSB3cm9uZyBhbmQgaWYgb25lIG9yIHR3byB2YWx1ZXMgaXMvYXJlIDE2LCB0aGUgZm9sbG93aW5nCitzdGF0ZXMgd2lsbCBkZWNvZGUgdGhlIGVzY2FwZSBzZXF1ZW5jZSB0byBjb3JyZWN0IHRoZSB2YWx1ZXMgd2hpY2ggYXJlIHdpcnR0ZW4KK2hlcmUuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0JPRFkoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIHZvaWQgKnB0cikKLXsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fQk9EWShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKSB7CiAgIEhfSENSX0lORk8gcEhjciA9IChIX0hDUl9JTkZPKXB0cjsKLSAgU0NIQVIgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVU0hPUlQgICAgICAqcExlZnRTdGFydE9mU2VnbWVudDsKLSAgVVNIT1JUICAgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OwotICBVQ0hBUiAgICAgICAgcmVhZERpcmVjdGlvbjsKLSAgVUlOVCAgICAgICAgKnBTZWdtZW50Qml0ZmllbGQ7Ci0gIFVJTlQgICAgICAgICpwQ29kZXdvcmRCaXRmaWVsZDsKLSAgVUlOVCAgICAgICAgIHNlZ21lbnRPZmZzZXQ7CisgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50OworICBJTlQgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICBVQ0hBUiByZWFkRGlyZWN0aW9uOworICBVSU5UICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UICpwQ29kZXdvcmRCaXRmaWVsZDsKKyAgVUlOVCBzZWdtZW50T2Zmc2V0OwogCi0gIFVJTlQgICAgICAgICppTm9kZTsKLSAgVUNIQVIgICAgICAgKnBDbnRTaWduOwotICBGSVhQX0RCTCAgICAqcFJlc3VsdEJhc2U7Ci0gIFVTSE9SVCAgICAgICppUmVzdWx0UG9pbnRlcjsKLSAgVUlOVCAgICAgICAgIGNvZGV3b3JkT2Zmc2V0OworICBVSU5UICppTm9kZTsKKyAgVUNIQVIgKnBDbnRTaWduOworICBGSVhQX0RCTCAqcFJlc3VsdEJhc2U7CisgIFVTSE9SVCAqaVJlc3VsdFBvaW50ZXI7CisgIFVJTlQgY29kZXdvcmRPZmZzZXQ7CiAKLSAgVUNIQVIgICAgICAgIGNhcnJ5Qml0OwotICBVSU5UICAgICAgICAgaVFTQzsKLSAgVUlOVCAgICAgICAgIGNudFNpZ247Ci0gIFVJTlQgICAgICAgICBkaW1DbnRyOwotICBVSU5UICAgICAgICAgdHJlZU5vZGU7Ci0gIFNDSEFSICAgICAgICpwU3RhOwotICBVSU5UICAgICAgICAgYnJhbmNoTm9kZTsKLSAgVUlOVCAgICAgICAgIGJyYW5jaFZhbHVlOwotICBjb25zdCBVSU5UICAqcEN1cnJlbnRUcmVlOworICBVQ0hBUiBjYXJyeUJpdDsKKyAgVUlOVCBpUVNDOworICBVSU5UIGNudFNpZ247CisgIFVJTlQgZGltQ250cjsKKyAgVUlOVCB0cmVlTm9kZTsKKyAgU0NIQVIgKnBTdGE7CisgIFVJTlQgYnJhbmNoTm9kZTsKKyAgVUlOVCBicmFuY2hWYWx1ZTsKKyAgY29uc3QgVUlOVCAqcEN1cnJlbnRUcmVlOwogICBjb25zdCBTQ0hBUiAqcFF1YW50VmFsQmFzZTsKICAgY29uc3QgU0NIQVIgKnBRdWFudFZhbDsKIAogICBwUmVtYWluaW5nQml0c0luU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBwTGVmdFN0YXJ0T2ZTZWdtZW50ICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIHBSaWdodFN0YXJ0T2ZTZWdtZW50ICAgID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7Ci0gIHJlYWREaXJlY3Rpb24gICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbjsKLSAgcFNlZ21lbnRCaXRmaWVsZCAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOwotICBwQ29kZXdvcmRCaXRmaWVsZCAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBDb2Rld29yZEJpdGZpZWxkOwotICBzZWdtZW50T2Zmc2V0ICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7CisgIHBMZWZ0U3RhcnRPZlNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBwUmlnaHRTdGFydE9mU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICByZWFkRGlyZWN0aW9uID0gcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbjsKKyAgcFNlZ21lbnRCaXRmaWVsZCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7CisgIHBDb2Rld29yZEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7CisgIHNlZ21lbnRPZmZzZXQgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OwogCi0gIGlOb2RlICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaU5vZGU7Ci0gIHBDbnRTaWduICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247Ci0gIHBSZXN1bHRCYXNlICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7Ci0gIGlSZXN1bHRQb2ludGVyICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7Ci0gIGNvZGV3b3JkT2Zmc2V0ICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQ7Ci0gIHBTdGEgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKKyAgaU5vZGUgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pTm9kZTsKKyAgcENudFNpZ24gPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ250U2lnbjsKKyAgcFJlc3VsdEJhc2UgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZTsKKyAgaVJlc3VsdFBvaW50ZXIgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKKyAgY29kZXdvcmRPZmZzZXQgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKKyAgcFN0YSA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGE7CiAKLSAgdHJlZU5vZGUgICAgICAgICAgICAgICAgPSBpTm9kZVtjb2Rld29yZE9mZnNldF07Ci0gIHBDdXJyZW50VHJlZSAgICAgICAgICAgID0gYUh1ZmZUYWJsZVtFU0NBUEVfQ09ERUJPT0tdOworICB0cmVlTm9kZSA9IGlOb2RlW2NvZGV3b3JkT2Zmc2V0XTsKKyAgcEN1cnJlbnRUcmVlID0gYUh1ZmZUYWJsZVtFU0NBUEVfQ09ERUJPT0tdOwogCi0KLSAgZm9yICggOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDAgOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxICkgewotCi0gICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSggYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKKyAgZm9yICg7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdID4gMDsKKyAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxKSB7CisgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSgKKyAgICAgICAgYnMsIHBIY3ItPmRlY0luT3V0LmJpdHN0cmVhbUFuY2hvciwgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwgcmVhZERpcmVjdGlvbik7CiAKICAgICAvKiBtYWtlIGEgc3RlcCBpbiB0cmVlICovCi0gICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyYW5jaFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoTm9kZSk7CisgICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LCB0cmVlTm9kZSwgJmJyYW5jaFZhbHVlLCAmYnJhbmNoTm9kZSk7CiAKLSAgICAvKiBpZiBlbmQgb2YgYnJhbmNoIHJlYWNoZWQgd3JpdGUgb3V0IGxpbmVzIGFuZCBjb3VudCBiaXRzIG5lZWRlZCBmb3Igc2lnbiwgb3RoZXJ3aXNlIHN0b3JlIG5vZGUgaW4gY29kZXdvcmQgc2lkZWluZm8gKi8KLSAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0gVEVTVF9CSVRfMTApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgYm9keSBjb21wbGV0ZSAqLworICAgIC8qIGlmIGVuZCBvZiBicmFuY2ggcmVhY2hlZCB3cml0ZSBvdXQgbGluZXMgYW5kIGNvdW50IGJpdHMgbmVlZGVkIGZvciBzaWduLAorICAgICAqIG90aGVyd2lzZSBzdG9yZSBub2RlIGluIGNvZGV3b3JkIHNpZGVpbmZvICovCisgICAgaWYgKChicmFuY2hOb2RlICYgVEVTVF9CSVRfMTApID09CisgICAgICAgIFRFU1RfQklUXzEwKSB7IC8qIHRlc3QgYml0IDEwIDsgaWYgc2V0IGJvZHkgY29tcGxldGUgKi8KIAogICAgICAgLyogYm9keSBjb21wbGV0ZWx5IGRlY29kZWQ7IGJyYW5jaFZhbHVlIGlzIHZhbGlkICovCi0gICAgICAvKiBzZXQgcFF1YW50Vm9sIHRvIGZpcnN0IChvZiB0d28gb3IgZm91cikgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyAqLwotICAgICAgcFF1YW50VmFsQmFzZSA9IGFRdWFudFRhYmxlW0VTQ0FQRV9DT0RFQk9PS107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBiYXNlIGFkZHJlc3Mgb2YgcXVhbnRpemVkIHZhbHVlcyBiZWxvbmdpbmcgdG8gY3VycmVudCBjb2RlYm9vayAqLwotICAgICAgcFF1YW50VmFsID0gcFF1YW50VmFsQmFzZSArIGJyYW5jaFZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBwb2ludGVyIHRvIGZpcnN0IHZhbGlkIGxpbmUgW29mIDIgb3IgNCBxdWFudGl6ZWQgdmFsdWVzXSAqLworICAgICAgLyogc2V0IHBRdWFudFZvbCB0byBmaXJzdCAob2YgdHdvIG9yIGZvdXIpIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMKKyAgICAgICAqLworICAgICAgcFF1YW50VmFsQmFzZSA9IGFRdWFudFRhYmxlW0VTQ0FQRV9DT0RFQk9PS107IC8qIGdldCBiYXNlIGFkZHJlc3Mgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWQgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVsb25naW5nIHRvIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYm9vayAqLworICAgICAgcFF1YW50VmFsID0gcFF1YW50VmFsQmFzZSArIGJyYW5jaFZhbHVlOyAvKiBzZXQgcG9pbnRlciB0byBmaXJzdCB2YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lIFtvZiAyIG9yIDQgcXVhbnRpemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc10gKi8KIAotICAgICAgLyogbWFrZSBiYWNrdXAgZnJvbSBvcmlnaW5hbCByZXN1bHRQb2ludGVyIGluIG5vZGUgc3RvcmFnZSBmb3Igc3RhdGUgQk9EWV9TSUdOX0VTQ19fU0lHTiAqLworICAgICAgLyogbWFrZSBiYWNrdXAgZnJvbSBvcmlnaW5hbCByZXN1bHRQb2ludGVyIGluIG5vZGUgc3RvcmFnZSBmb3Igc3RhdGUKKyAgICAgICAqIEJPRFlfU0lHTl9FU0NfX1NJR04gKi8KICAgICAgIGlOb2RlW2NvZGV3b3JkT2Zmc2V0XSA9IGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XTsKIAogICAgICAgLyogZ2V0IHBvc2l0aW9uIG9mIGZpcnN0IGxpbmUgZm9yIHdyaXRpbmcgcmVzdWx0ICovCiAgICAgICBpUVNDID0gaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdOwogCi0gICAgICAvKiBjb2Rld29yZCBkZWNvZGluZyByZXN1bHQgaXMgd3JpdHRlbiBvdXQgaGVyZTogV3JpdGUgb3V0IDIgb3IgNCBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWVzIHdpdGggcHJvYmFibHkgKi8KLSAgICAgIC8qIHdyb25nIHNpZ24gYW5kIGNvdW50IG51bWJlciBvZiB2YWx1ZXMgd2hpY2ggYXJlIGRpZmZlcmVudCBmcm9tIHplcm8gZm9yIHNpZ24gYml0IGRlY29kaW5nIFt3aGljaCBoYXBwZW5zIGluIG5leHQgc3RhdGVdICovCisgICAgICAvKiBjb2Rld29yZCBkZWNvZGluZyByZXN1bHQgaXMgd3JpdHRlbiBvdXQgaGVyZTogV3JpdGUgb3V0IDIgb3IgNAorICAgICAgICogcXVhbnRpemVkIHNwZWN0cmFsIHZhbHVlcyB3aXRoIHByb2JhYmx5ICovCisgICAgICAvKiB3cm9uZyBzaWduIGFuZCBjb3VudCBudW1iZXIgb2YgdmFsdWVzIHdoaWNoIGFyZSBkaWZmZXJlbnQgZnJvbSB6ZXJvIGZvcgorICAgICAgICogc2lnbiBiaXQgZGVjb2RpbmcgW3doaWNoIGhhcHBlbnMgaW4gbmV4dCBzdGF0ZV0gKi8KICAgICAgIGNudFNpZ24gPSAwOwogCi0gICAgICBmb3IgKCBkaW1DbnRyID0gRElNRU5TSU9OX09GX0VTQ0FQRV9DT0RFQk9PSzsgZGltQ250ciAhPSAwOyBkaW1DbnRyLS0gKSB7Ci0gICAgICAgIHBSZXN1bHRCYXNlW2lRU0MrK10gPSAoRklYUF9EQkwpKnBRdWFudFZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBxdWFudC4gc3BlYy4gY29lZi4gaW50byBzcGVjdHJ1bSAqLwotICAgICAgICBpZiAoICpwUXVhbnRWYWwrKyAhPSAwICkgeworICAgICAgZm9yIChkaW1DbnRyID0gRElNRU5TSU9OX09GX0VTQ0FQRV9DT0RFQk9PSzsgZGltQ250ciAhPSAwOyBkaW1DbnRyLS0pIHsKKyAgICAgICAgcFJlc3VsdEJhc2VbaVFTQysrXSA9CisgICAgICAgICAgICAoRklYUF9EQkwpKnBRdWFudFZhbDsgLyogd3JpdGUgcXVhbnQuIHNwZWMuIGNvZWYuIGludG8gc3BlY3RydW0gKi8KKyAgICAgICAgaWYgKCpwUXVhbnRWYWwrKyAhPSAwKSB7CiAgICAgICAgICAgY250U2lnbiArPSAxOwogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGlmICggY250U2lnbiA9PSAwICkgewotICAgICAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCisgICAgICBpZiAoY250U2lnbiA9PSAwKSB7CisgICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKAorICAgICAgICAgICAgJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLCBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1hY2hpbmUgKi8KICAgICAgICAgLyogY29kZXdvcmQgZGVjb2RlZCAqLwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICB9IGVsc2UgewogICAgICAgICAvKiB3cml0ZSBzaWduIGNvdW50IHJlc3VsdCBpbnRvIGNvZGV3b3Jkc2lkZWluZm8gb2YgY3VycmVudCBjb2Rld29yZCAqLwogICAgICAgICBwQ250U2lnbltjb2Rld29yZE9mZnNldF0gPSBjbnRTaWduOwotICAgICAgICBwU3RhW2NvZGV3b3JkT2Zmc2V0XSA9IEJPRFlfU0lHTl9FU0NfX1NJR047ICAgICAgICAgICAgICAgICAvKiBjaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0gYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOyAgICAgICAgICAgLyogZ2V0IHN0YXRlIGZyb20gc2VwYXJhdGUgYXJyYXkgb2YgY3ctc2lkZWluZm8gKi8KKyAgICAgICAgcFN0YVtjb2Rld29yZE9mZnNldF0gPSBCT0RZX1NJR05fRVNDX19TSUdOOyAvKiBjaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0KKyAgICAgICAgICAgIGFTdGF0ZUNvbnN0YW50MlN0YXRlW3BTdGFbY29kZXdvcmRPZmZzZXRdXTsgLyogZ2V0IHN0YXRlIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGUgYXJyYXkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ctc2lkZWluZm8gKi8KICAgICAgIH0KLSAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mIGZvciBsb29wIGNvdW50ZXIgKHNlZSBhYm92ZSkgaXMgZG9uZSBoZXJlICovCi0gICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBicmFuY2ggaW4gdHJlZSByZWFjaGVkICBpLmUuIGEgd2hvbGUgbm9uUENXLUJvZHkgaXMgZGVjb2RlZCAqLwotICAgIH0KLSAgICBlbHNlIHsgLyogYm9keSBpcyBub3QgZGVjb2RlZCBjb21wbGV0ZWx5OiAqLwotICAgICAgLyogdXBkYXRlIHRyZWVOb2RlIGZvciBmdXJ0aGVyIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSBhbmQgc3RvcmUgdXBkYXRlZCB0cmVlTm9kZSBiZWNhdXNlIG1heWJlIG5vIG1vcmUgYml0cyBsZWZ0IGluIHNlZ21lbnQgKi8KKyAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7IC8qIHRoZSBsYXN0IHJlaW5pdGlhbHphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgZm9yIGxvb3AgY291bnRlciAoc2VlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSkgaXMgZG9uZSBoZXJlICovCisgICAgICBicmVhazsgLyogZW5kIG9mIGJyYW5jaCBpbiB0cmVlIHJlYWNoZWQgIGkuZS4gYSB3aG9sZSBub25QQ1ctQm9keSBpcworICAgICAgICAgICAgICAgIGRlY29kZWQgKi8KKyAgICB9IGVsc2UgeyAvKiBib2R5IGlzIG5vdCBkZWNvZGVkIGNvbXBsZXRlbHk6ICovCisgICAgICAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlIGFuZCBzdG9yZSB1cGRhdGVkCisgICAgICAgKiB0cmVlTm9kZSBiZWNhdXNlIG1heWJlIG5vIG1vcmUgYml0cyBsZWZ0IGluIHNlZ21lbnQgKi8KICAgICAgIHRyZWVOb2RlID0gKihwQ3VycmVudFRyZWUgKyBicmFuY2hWYWx1ZSk7CiAgICAgICBpTm9kZVtjb2Rld29yZE9mZnNldF0gPSB0cmVlTm9kZTsKICAgICB9CiAgIH0KIAotICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDw9IDAgKSB7Ci0gICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKyAgaWYgKHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDw9IDApIHsKKyAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCk7IC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLwogCi0jaWYgU1RBVEVfTUFDSElORV9FUlJPUl9DSEVDSwotICAgIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPCAwICkgeworICAgIGlmIChwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8IDApIHsKICAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0JPRFk7Ci0gICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZOworICAgICAgcmV0dXJuIEJPRFlfU0lHTl9FU0NfX0JPRFk7CiAgICAgfQotI2VuZGlmCiAgIH0KIAogICByZXR1cm4gU1RPUF9USElTX1NUQVRFOwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiBUaGlzIHN0YXRlIGRlY29kZXMgdGhlIHNpZ24gYml0cywgaWYgYSBjb2Rld29yZCBvZiBjb2RlYm9vayAxMSBuZWVkcyBzb21lLgotICAgICAgICAgICAgICAgICAgQSBmbGFnIG5hbWVkICdmbGFnQicgaW4gY29kZXdvcmQgc2lkZWluZm8gaXMgc2V0LCBpZiB0aGUgc2Vjb25kIGxpbmUgb2YKLSAgICAgICAgICAgICAgICAgIHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZXMgaXMgMTYuIFRoZSAnZmxhZ0InIGlzIHVzZWQgaW4gY2FzZSBvZiBkZWNvZGluZwotICAgICAgICAgICAgICAgICAgb2YgYSBlc2NhcGUgc2VxdWVuY2UgaXMgbmVjZXNzYXJ5IGFzIGZhciBhcyB0aGUgc2Vjb25kIGxpbmUgaXMgY29uY2VybmVkLgorICAgICBkZXNjcmlwdGlvbjogVGhpcyBzdGF0ZSBkZWNvZGVzIHRoZSBzaWduIGJpdHMsIGlmIGEgY29kZXdvcmQgb2YgY29kZWJvb2sgMTEKK25lZWRzIHNvbWUuIEEgZmxhZyBuYW1lZCAnZmxhZ0InIGluIGNvZGV3b3JkIHNpZGVpbmZvIGlzIHNldCwgaWYgdGhlIHNlY29uZCBsaW5lCitvZiBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWVzIGlzIDE2LiBUaGUgJ2ZsYWdCJyBpcyB1c2VkIGluIGNhc2Ugb2YgZGVjb2Rpbmcgb2YgYQorZXNjYXBlIHNlcXVlbmNlIGlzIG5lY2Vzc2FyeSBhcyBmYXIgYXMgdGhlIHNlY29uZCBsaW5lIGlzIGNvbmNlcm5lZC4KIAotICAgICAgICAgICAgICAgICAgSWYgb25seSB0aGUgZmlyc3QgbGluZSBuZWVkcyBhbiBlc2NhcGUgc2VxdWVuY2UsIHRoZSBmbGFnQiBpcyBjbGVhcmVkLgotICAgICAgICAgICAgICAgICAgSWYgb25seSB0aGUgc2Vjb25kIGxpbmUgbmVlZHMgYW4gZXNjYXBlIHNlcXVlbmNlLCB0aGUgZmxhZ0IgaXMgbm90IHVzZWQuCisgICAgICAgICAgICAgICAgICBJZiBvbmx5IHRoZSBmaXJzdCBsaW5lIG5lZWRzIGFuIGVzY2FwZSBzZXF1ZW5jZSwgdGhlIGZsYWdCIGlzCitjbGVhcmVkLiBJZiBvbmx5IHRoZSBzZWNvbmQgbGluZSBuZWVkcyBhbiBlc2NhcGUgc2VxdWVuY2UsIHRoZSBmbGFnQiBpcyBub3QKK3VzZWQuCiAKLSAgICAgICAgICAgICAgICAgIEZvciBzdG9yaW5nIHNpZGVpbmZvIGluIGNhc2Ugb2YgZXNjYXBlIHNlcXVlbmNlIGRlY29kaW5nIG9uZSBzaW5nbGUgd29yZAotICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgZm9yIGJvdGggZXNjYXBlIHNlcXVlbmNlcyBiZWNhdXNlIHRoZXkgYXJlIGRlY29kZWQgbm90IGF0IHRoZQotICAgICAgICAgICAgICAgICAgc2FtZSB0aW1lOgorICAgICAgICAgICAgICAgICAgRm9yIHN0b3Jpbmcgc2lkZWluZm8gaW4gY2FzZSBvZiBlc2NhcGUgc2VxdWVuY2UgZGVjb2Rpbmcgb25lCitzaW5nbGUgd29yZCBjYW4gYmUgdXNlZCBmb3IgYm90aCBlc2NhcGUgc2VxdWVuY2VzIGJlY2F1c2UgdGhleSBhcmUgZGVjb2RlZCBub3QKK2F0IHRoZSBzYW1lIHRpbWU6CiAKIAotICAgICAgICAgICAgICAgICAgYml0IDIzIDIyIDIxIDIwIDE5IDE4IDE3IDE2IDE1IDE0IDEzIDEyIDExIDEwICA5ICA4ICA3ICA2ICA1ICA0ICAzICAyICAxICAwCi0gICAgICAgICAgICAgICAgICAgICAgPT09PT0gPT0gPT0gPT09PT09PT09PT0gPT09PT09PT09PT0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICBeICAgICAgXiAgXiAgICAgICAgIF4gICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICBeCi0gICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgIHwgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgICByZXMuIGZsYWdBICBmbGFnQiAgZXNjYXBlUHJlZml4VXAgIGVzY2FwZVByZWZpeERvd24gIGVzY2FwZVdvcmQKKyAgICAgICAgICAgICAgICAgIGJpdCAyMyAyMiAyMSAyMCAxOSAxOCAxNyAxNiAxNSAxNCAxMyAxMiAxMSAxMCAgOSAgOCAgNyAgNiAgNQorNCAgMyAgMiAgMSAgMAorICAgICAgICAgICAgICAgICAgICAgID09PT09ID09ID09ID09PT09PT09PT09ID09PT09PT09PT09Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBeICAgICAgXiAgXiAgICAgICAgIF4gICAgICAgICAgICBeCiteIHwgICAgICB8ICB8ICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgcmVzLiBmbGFnQSAgZmxhZ0IKK2VzY2FwZVByZWZpeFVwICBlc2NhcGVQcmVmaXhEb3duICBlc2NhcGVXb3JkCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dHB1dDogICBUd28gbGluZXMgd2l0aCBjb3JyZWN0IHNpZ24uIElmIG9uZSBvciB0d28gdmFsdWVzIGlzL2FyZSAxNiwgdGhlIGxpbmVzIGFyZQotICAgICAgICAgICAgICAgICAgbm90IHZhbGlkLCBvdGhlcndpc2UgdGhleSBhcmUuCisgICAgICAgIG91dHB1dDogICBUd28gbGluZXMgd2l0aCBjb3JyZWN0IHNpZ24uIElmIG9uZSBvciB0d28gdmFsdWVzIGlzL2FyZSAxNiwKK3RoZSBsaW5lcyBhcmUgbm90IHZhbGlkLCBvdGhlcndpc2UgdGhleSBhcmUuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX1NJR04oSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIHZvaWQgKnB0cikKLXsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fU0lHTihIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKSB7CiAgIEhfSENSX0lORk8gcEhjciA9IChIX0hDUl9JTkZPKXB0cjsKLSAgU0NIQVIgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKLSAgVVNIT1JUICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50OwotICBVU0hPUlQgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OwotICBVQ0hBUiAgICAgIHJlYWREaXJlY3Rpb247Ci0gIFVJTlQgICAgICAqcFNlZ21lbnRCaXRmaWVsZDsKLSAgVUlOVCAgICAgICpwQ29kZXdvcmRCaXRmaWVsZDsKLSAgVUlOVCAgICAgICBzZWdtZW50T2Zmc2V0OworICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIElOVCAqcExlZnRTdGFydE9mU2VnbWVudDsKKyAgSU5UICpwUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgVUNIQVIgcmVhZERpcmVjdGlvbjsKKyAgVUlOVCAqcFNlZ21lbnRCaXRmaWVsZDsKKyAgVUlOVCAqcENvZGV3b3JkQml0ZmllbGQ7CisgIFVJTlQgc2VnbWVudE9mZnNldDsKIAotICBVSU5UICAgICAgKmlOb2RlOwotICBVQ0hBUiAgICAgKnBDbnRTaWduOwotICBGSVhQX0RCTCAgKnBSZXN1bHRCYXNlOwotICBVU0hPUlQgICAgKmlSZXN1bHRQb2ludGVyOwotICBVSU5UICAgICAgKnBFc2NhcGVTZXF1ZW5jZUluZm87Ci0gIFVJTlQgICAgICAgY29kZXdvcmRPZmZzZXQ7CisgIFVJTlQgKmlOb2RlOworICBVQ0hBUiAqcENudFNpZ247CisgIEZJWFBfREJMICpwUmVzdWx0QmFzZTsKKyAgVVNIT1JUICppUmVzdWx0UG9pbnRlcjsKKyAgVUlOVCAqcEVzY2FwZVNlcXVlbmNlSW5mbzsKKyAgVUlOVCBjb2Rld29yZE9mZnNldDsKIAotICBVSU5UICAgICAgIGlRU0M7Ci0gIFVDSEFSICAgICAgY250U2lnbjsKLSAgVUlOVCAgICAgICBmbGFnQTsKLSAgVUlOVCAgICAgICBmbGFnQjsKLSAgVUlOVCAgICAgICBmbGFnczsKLSAgVUNIQVIgICAgICBjYXJyeUJpdDsKLSAgU0NIQVIgICAgICpwU3RhOworICBVSU5UIGlRU0M7CisgIFVDSEFSIGNudFNpZ247CisgIFVJTlQgZmxhZ0E7CisgIFVJTlQgZmxhZ0I7CisgIFVJTlQgZmxhZ3M7CisgIFVDSEFSIGNhcnJ5Qml0OworICBTQ0hBUiAqcFN0YTsKIAogICBwUmVtYWluaW5nQml0c0luU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBwTGVmdFN0YXJ0T2ZTZWdtZW50ICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIHBSaWdodFN0YXJ0T2ZTZWdtZW50ICAgID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7Ci0gIHJlYWREaXJlY3Rpb24gICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbjsKLSAgcFNlZ21lbnRCaXRmaWVsZCAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOwotICBwQ29kZXdvcmRCaXRmaWVsZCAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBDb2Rld29yZEJpdGZpZWxkOwotICBzZWdtZW50T2Zmc2V0ICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7CisgIHBMZWZ0U3RhcnRPZlNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBwUmlnaHRTdGFydE9mU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICByZWFkRGlyZWN0aW9uID0gcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbjsKKyAgcFNlZ21lbnRCaXRmaWVsZCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7CisgIHBDb2Rld29yZEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7CisgIHNlZ21lbnRPZmZzZXQgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OwogCi0gIGlOb2RlICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaU5vZGU7Ci0gIHBDbnRTaWduICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247Ci0gIHBSZXN1bHRCYXNlICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7Ci0gIGlSZXN1bHRQb2ludGVyICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7Ci0gIHBFc2NhcGVTZXF1ZW5jZUluZm8gICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucEVzY2FwZVNlcXVlbmNlSW5mbzsKLSAgY29kZXdvcmRPZmZzZXQgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKLSAgcFN0YSAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhOworICBpTm9kZSA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmlOb2RlOworICBwQ250U2lnbiA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBDbnRTaWduOworICBwUmVzdWx0QmFzZSA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBSZXN1bHRCYXNlOworICBpUmVzdWx0UG9pbnRlciA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmlSZXN1bHRQb2ludGVyOworICBwRXNjYXBlU2VxdWVuY2VJbmZvID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucEVzY2FwZVNlcXVlbmNlSW5mbzsKKyAgY29kZXdvcmRPZmZzZXQgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKKyAgcFN0YSA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGE7CiAKLSAgaVFTQyAgICAgICAgICAgICAgICAgICAgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07Ci0gIGNudFNpZ24gICAgICAgICAgICAgICAgID0gcENudFNpZ25bY29kZXdvcmRPZmZzZXRdOwotCisgIGlRU0MgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07CisgIGNudFNpZ24gPSBwQ250U2lnbltjb2Rld29yZE9mZnNldF07CiAKICAgLyogbG9vcCBmb3Igc2lnbiBiaXQgZGVjb2RpbmcgKi8KLSAgZm9yICggOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDAgOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxICkgewotCi0gICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSggYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKKyAgZm9yICg7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdID4gMDsKKyAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxKSB7CisgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSgKKyAgICAgICAgYnMsIHBIY3ItPmRlY0luT3V0LmJpdHN0cmVhbUFuY2hvciwgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwgcmVhZERpcmVjdGlvbik7CiAKICAgICAvKiBkZWNyZW1lbnQgc2lnbiBjb3VudGVyIGJlY2F1c2Ugb25lIHNpZ24gYml0IGhhcyBiZWVuIHJlYWQgKi8KICAgICBjbnRTaWduIC09IDE7CiAgICAgcENudFNpZ25bY29kZXdvcmRPZmZzZXRdID0gY250U2lnbjsKIAotICAgIC8qIGdldCBhIHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZSAod2hpY2ggd2FzIGRlY29kZWQgaW4gcHJldmlvdXMgc3RhdGUpIHdoaWNoIGlzIG5vdCB6ZXJvLiBbVGhpcyB2YWx1ZSB3aWxsIGdldCBhIHNpZ25dICovCi0gICAgd2hpbGUgKCBwUmVzdWx0QmFzZVtpUVNDXSA9PSAoRklYUF9EQkwpMCApIHsKLSAgICAgIGlRU0MrKzsKKyAgICAvKiBnZXQgYSBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWUgKHdoaWNoIHdhcyBkZWNvZGVkIGluIHByZXZpb3VzIHN0YXRlKQorICAgICAqIHdoaWNoIGlzIG5vdCB6ZXJvLiBbVGhpcyB2YWx1ZSB3aWxsIGdldCBhIHNpZ25dICovCisgICAgd2hpbGUgKHBSZXN1bHRCYXNlW2lRU0NdID09IChGSVhQX0RCTCkwKSB7CisgICAgICBpZiAoKytpUVNDID49IDEwMjQpIHsKKyAgICAgICAgcmV0dXJuIEJPRFlfU0lHTl9FU0NfX1NJR047CisgICAgICB9CiAgICAgfQogICAgIGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XSA9IGlRU0M7CiAKLSAgICAvKiBwdXQgbmVnYXRpdmUgc2lnbiB0b2dldGhlciB3aXRoIHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZTsgaWYgY2FycnlCaXQgaXMgemVybywgdGhlIHNpZ24gaXMgb2sgYWxyZWFkeTsgbm8gd3JpdGUgb3BlcmF0aW9uIG5lY2Vzc2FyeSBpbiB0aGlzIGNhc2UgKi8KLSAgICBpZiAoIGNhcnJ5Qml0ICE9IDAgKSB7Ci0gICAgICBwUmVzdWx0QmFzZVtpUVNDXSA9IC0gcFJlc3VsdEJhc2VbaVFTQ107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhcnJ5Qml0ID0gMSAtLT4gbWludXMgKi8KKyAgICAvKiBwdXQgbmVnYXRpdmUgc2lnbiB0b2dldGhlciB3aXRoIHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZTsgaWYgY2FycnlCaXQgaXMKKyAgICAgKiB6ZXJvLCB0aGUgc2lnbiBpcyBvayBhbHJlYWR5OyBubyB3cml0ZSBvcGVyYXRpb24gbmVjZXNzYXJ5IGluIHRoaXMgY2FzZQorICAgICAqLworICAgIGlmIChjYXJyeUJpdCAhPSAwKSB7CisgICAgICBwUmVzdWx0QmFzZVtpUVNDXSA9IC1wUmVzdWx0QmFzZVtpUVNDXTsgLyogY2FycnlCaXQgPSAxIC0tPiBtaW51cyAqLwogICAgIH0KLSAgICBpUVNDKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIGluZGV4IHRvIG5leHQgKG1heWJlIHZhbGlkKSB2YWx1ZSAqLworICAgIGlRU0MrKzsgLyogdXBkYXRlIGluZGV4IHRvIG5leHQgKG1heWJlIHZhbGlkKSB2YWx1ZSAqLwogICAgIGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XSA9IGlRU0M7CiAKLSAgICBpZiAoIGNudFNpZ24gPT0gMCApIHsKKyAgICBpZiAoY250U2lnbiA9PSAwKSB7CiAgICAgICAvKiBhbGwgc2lnbiBiaXRzIGFyZSBkZWNvZGVkIG5vdyAqLwotICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsYXN0IHJlaW5pdGlhbHphdGlvbiBvZiBmb3IgbG9vcCBjb3VudGVyIChzZWUgYWJvdmUpIGlzIGRvbmUgaGVyZSAqLworICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb29wIGNvdW50ZXIgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUpIGlzIGRvbmUgaGVyZSAqLwogCi0gICAgICAvKiBjaGVjayBkZWNvZGVkIHZhbHVlcyBpZiBjb2Rld29yZCBpcyBkZWNvZGVkOiBDaGVjayBpZiBvbmUgb3IgdHdvIGVzY2FwZSBzZXF1ZW5jZXMgMTYgZm9sbG93ICovCisgICAgICAvKiBjaGVjayBkZWNvZGVkIHZhbHVlcyBpZiBjb2Rld29yZCBpcyBkZWNvZGVkOiBDaGVjayBpZiBvbmUgb3IgdHdvIGVzY2FwZQorICAgICAgICogc2VxdWVuY2VzIDE2IGZvbGxvdyAqLwogCiAgICAgICAvKiBzdGVwIDAgKi8KLSAgICAgIC8qIHJlc3RvcmUgcG9pbnRlciB0byBmaXJzdCBkZWNvZGVkIHF1YW50aXplZCB2YWx1ZSBbID0gb3JpZ2luYWwgcFJlc3VsdFBvaW50cl0gZnJvbSBpbmRleCBpTm9kZSBwcmVwYXJlZCBpbiBTdGF0ZV9CT0RZX1NJR05fRVNDX19CT0RZICovCisgICAgICAvKiByZXN0b3JlIHBvaW50ZXIgdG8gZmlyc3QgZGVjb2RlZCBxdWFudGl6ZWQgdmFsdWUgWyA9IG9yaWdpbmFsCisgICAgICAgKiBwUmVzdWx0UG9pbnRyXSBmcm9tIGluZGV4IGlOb2RlIHByZXBhcmVkIGluIFN0YXRlX0JPRFlfU0lHTl9FU0NfX0JPRFkKKyAgICAgICAqLwogICAgICAgaVFTQyA9IGlOb2RlW2NvZGV3b3JkT2Zmc2V0XTsKIAogICAgICAgLyogc3RlcCAxICovCiAgICAgICAvKiB0ZXN0IGZpcnN0IHZhbHVlIGlmIGVzY2FwZSBzZXF1ZW5jZSBmb2xsb3dzICovCi0gICAgICBmbGFnQSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBmaXJzdCBwb3NzaWJsZSBlc2NhcGUgc2VxdWVuY2UgKi8KLSAgICAgIGlmICggZml4cF9hYnMocFJlc3VsdEJhc2VbaVFTQysrXSkgPT0gKEZJWFBfREJMKUVTQ0FQRV9WQUxVRSApIHsKKyAgICAgIGZsYWdBID0gMDsgLyogZm9yIGZpcnN0IHBvc3NpYmxlIGVzY2FwZSBzZXF1ZW5jZSAqLworICAgICAgaWYgKGZpeHBfYWJzKHBSZXN1bHRCYXNlW2lRU0MrK10pID09IChGSVhQX0RCTClFU0NBUEVfVkFMVUUpIHsKICAgICAgICAgZmxhZ0EgPSAxOwogICAgICAgfQogCiAgICAgICAvKiBzdGVwIDIgKi8KICAgICAgIC8qIHRlc3Qgc2Vjb25kIHZhbHVlIGlmIGVzY2FwZSBzZXF1ZW5jZSBmb2xsb3dzICovCi0gICAgICBmbGFnQiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBzZWNvbmQgcG9zc2libGUgZXNjYXBlIHNlcXVlbmNlICovCi0gICAgICBpZiAoIGZpeHBfYWJzKHBSZXN1bHRCYXNlW2lRU0NdKSA9PSAoRklYUF9EQkwpRVNDQVBFX1ZBTFVFICkgeworICAgICAgZmxhZ0IgPSAwOyAvKiBmb3Igc2Vjb25kIHBvc3NpYmxlIGVzY2FwZSBzZXF1ZW5jZSAqLworICAgICAgaWYgKGZpeHBfYWJzKHBSZXN1bHRCYXNlW2lRU0NdKSA9PSAoRklYUF9EQkwpRVNDQVBFX1ZBTFVFKSB7CiAgICAgICAgIGZsYWdCID0gMTsKICAgICAgIH0KIAotCiAgICAgICAvKiBzdGVwIDMgKi8KICAgICAgIC8qIGV2YWx1YXRlIGZsYWcgcmVzdWx0IGFuZCBnbyBvbiBpZiBuZWNlc3NhcnkgKi8KLSAgICAgIGlmICggIWZsYWdBICYmICFmbGFnQiApIHsKLSAgICAgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgaWYgKCFmbGFnQSAmJiAhZmxhZ0IpIHsKKyAgICAgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoCisgICAgICAgICAgICAmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7IC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWFjaGluZSAqLworICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogYXQgbGVhc3Qgb25lIG9mIHR3byBsaW5lcyBpcyAxNiAqLwotICAgICAgICAvKiBzdG9yZSBib3RoIGZsYWdzIGF0IGNvcnJlY3QgcG9zaXRpb25zIGluIG5vbiBQQ1cgY29kZXdvcmQgc2lkZWluZm8gcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gKi8KLSAgICAgICAgZmxhZ3MgPSAwOwotICAgICAgICBmbGFncyA9ICAgZmxhZ0EgPDwgUE9TSVRJT05fT0ZfRkxBR19BOworICAgICAgICAvKiBzdG9yZSBib3RoIGZsYWdzIGF0IGNvcnJlY3QgcG9zaXRpb25zIGluIG5vbiBQQ1cgY29kZXdvcmQgc2lkZWluZm8KKyAgICAgICAgICogcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gKi8KKyAgICAgICAgZmxhZ3MgPSBmbGFnQSA8PCBQT1NJVElPTl9PRl9GTEFHX0E7CiAgICAgICAgIGZsYWdzIHw9IChmbGFnQiA8PCBQT1NJVElPTl9PRl9GTEFHX0IpOwogICAgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSA9IGZsYWdzOwogCi0KICAgICAgICAgLyogc2V0IG5leHQgc3RhdGUgKi8KICAgICAgICAgcFN0YVtjb2Rld29yZE9mZnNldF0gPSBCT0RZX1NJR05fRVNDX19FU0NfUFJFRklYOwotICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUgPSBhU3RhdGVDb25zdGFudDJTdGF0ZVtwU3RhW2NvZGV3b3JkT2Zmc2V0XV07ICAgICAgICAgICAvKiBnZXQgc3RhdGUgZnJvbSBzZXBhcmF0ZSBhcnJheSBvZiBjdy1zaWRlaW5mbyAqLworICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUgPQorICAgICAgICAgICAgYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOyAvKiBnZXQgc3RhdGUgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZSBhcnJheSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdy1zaWRlaW5mbyAqLwogCiAgICAgICAgIC8qIHNldCByZXN1bHQgcG9pbnRlciB0byB0aGUgZmlyc3QgbGluZSBvZiB0aGUgdHdvIGRlY29kZWQgbGluZXMgKi8KICAgICAgICAgaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdID0gaU5vZGVbY29kZXdvcmRPZmZzZXRdOwogCi0gICAgICAgIGlmICggIWZsYWdBICYmIGZsYWdCICkgewotICAgICAgICAgIC8qIHVwZGF0ZSBwUmVzdWx0UG9pbnRyID09PiBzdGF0ZSBTdGF0X0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEIHdyaXRlcyB0byBjb3JyZWN0IHBvc2l0aW9uLiBTZWNvbmQgdmFsdWUgaXMgdGhlIG9uZSBhbmQgb25seSBlc2NhcGUgdmFsdWUgKi8KKyAgICAgICAgaWYgKCFmbGFnQSAmJiBmbGFnQikgeworICAgICAgICAgIC8qIHVwZGF0ZSBwUmVzdWx0UG9pbnRyID09PiBzdGF0ZSBTdGF0X0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEIHdyaXRlcworICAgICAgICAgICAqIHRvIGNvcnJlY3QgcG9zaXRpb24uIFNlY29uZCB2YWx1ZSBpcyB0aGUgb25lIGFuZCBvbmx5IGVzY2FwZSB2YWx1ZQorICAgICAgICAgICAqLwogICAgICAgICAgIGlRU0MgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07CiAgICAgICAgICAgaVFTQysrOwogICAgICAgICAgIGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XSA9IGlRU0M7CiAgICAgICAgIH0KIAotICAgICAgfSAgICAgLyogYXQgbGVhc3Qgb25lIG9mIHR3byBsaW5lcyBpcyAxNiAqLwotICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub25QQ1ctQm9keSBhdCBjYiAxMSBhbmQgYWNjb3JkaW5nIHNpZ24gYml0cyBhcmUgZGVjb2RlZCAqLworICAgICAgfSAgICAgIC8qIGF0IGxlYXN0IG9uZSBvZiB0d28gbGluZXMgaXMgMTYgKi8KKyAgICAgIGJyZWFrOyAvKiBub25QQ1ctQm9keSBhdCBjYiAxMSBhbmQgYWNjb3JkaW5nIHNpZ24gYml0cyBhcmUgZGVjb2RlZCAqLwogCiAgICAgfSAvKiBpZiAoIGNudFNpZ24gPT0gMCApICovCi0gIH0gLyogbG9vcCBvdmVyIHJlbWFpbmluZyBCaXRzIGluIHNlZ21lbnQgKi8KKyAgfSAgIC8qIGxvb3Agb3ZlciByZW1haW5pbmcgQml0cyBpbiBzZWdtZW50ICovCiAKLSAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8PSAwICkgewotICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50Qml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKyAgaWYgKHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDw9IDApIHsKKyAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCk7IC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLwogCi0jaWYgU1RBVEVfTUFDSElORV9FUlJPUl9DSEVDSwotICAgIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPCAwICkgeworICAgIGlmIChwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8IDApIHsKICAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX1NJR047Ci0gICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19TSUdOOworICAgICAgcmV0dXJuIEJPRFlfU0lHTl9FU0NfX1NJR047CiAgICAgfQotI2VuZGlmCi0KICAgfQogICByZXR1cm4gU1RPUF9USElTX1NUQVRFOwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiBEZWNvZGUgZXNjYXBlIHByZWZpeCBvZiBmaXJzdCBvciBzZWNvbmQgZXNjYXBlIHNlcXVlbmNlLiBUaGUgZXNjYXBlIHByZWZpeAotICAgICAgICAgICAgICAgICAgY29uc2lzdHMgb2Ygb25lcy4gVGhlIGZvbGxvd2luZyB6ZXJvIGlzIGFsc28gZGVjb2RlZCBoZXJlLgorICAgICBkZXNjcmlwdGlvbjogRGVjb2RlIGVzY2FwZSBwcmVmaXggb2YgZmlyc3Qgb3Igc2Vjb25kIGVzY2FwZSBzZXF1ZW5jZS4gVGhlCitlc2NhcGUgcHJlZml4IGNvbnNpc3RzIG9mIG9uZXMuIFRoZSBmb2xsb3dpbmcgemVybyBpcyBhbHNvIGRlY29kZWQgaGVyZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dHB1dDogICBJZiB0aGUgc2luZ2xlIHNlcGFyYXRvci16ZXJvIHdoaWNoIGZvbGxvd3MgdGhlIGVzY2FwZS1wcmVmaXgtb25lcyBpcyBub3QgeWV0IGRlY29kZWQ6Ci0gICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSAnZXNjYXBlUHJlZml4VXAnIGluIHdvcmQgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gaXMgdXBkYXRlZC4KKyAgICAgICAgb3V0cHV0OiAgIElmIHRoZSBzaW5nbGUgc2VwYXJhdG9yLXplcm8gd2hpY2ggZm9sbG93cyB0aGUKK2VzY2FwZS1wcmVmaXgtb25lcyBpcyBub3QgeWV0IGRlY29kZWQ6IFRoZSB2YWx1ZSAnZXNjYXBlUHJlZml4VXAnIGluIHdvcmQKK3BFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIGlzIHVwZGF0ZWQuCiAKLSAgICAgICAgICAgICAgICAgIElmIHRoZSBzaW5nbGUgc2VwYXJhdG9yLXplcm8gd2hpY2ggZm9sbG93cyB0aGUgZXNjYXBlLXByZWZpeC1vbmVzIGlzIGRlY29kZWQ6Ci0gICAgICAgICAgICAgICAgICAgIFR3byB1cGRhdGVkIHZhbHVlcyAnZXNjYXBlUHJlZml4VXAnIGFuZCAnZXNjYXBlUHJlZml4RG93bicgaW4gd29yZAotICAgICAgICAgICAgICAgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XS4gVGhpcyBTdGF0ZSBpcyBmaW5pc2hlZC4gU3dpdGNoIHRvIG5leHQgc3RhdGUuCisgICAgICAgICAgICAgICAgICBJZiB0aGUgc2luZ2xlIHNlcGFyYXRvci16ZXJvIHdoaWNoIGZvbGxvd3MgdGhlCitlc2NhcGUtcHJlZml4LW9uZXMgaXMgZGVjb2RlZDogVHdvIHVwZGF0ZWQgdmFsdWVzICdlc2NhcGVQcmVmaXhVcCcgYW5kCisnZXNjYXBlUHJlZml4RG93bicgaW4gd29yZCBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XS4gVGhpcyBTdGF0ZSBpcworZmluaXNoZWQuIFN3aXRjaCB0byBuZXh0IHN0YXRlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgIDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1VSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19FU0NfUFJFRklYKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCB2b2lkICpwdHIpCi17CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVgoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIHZvaWQgKnB0cikgewogICBIX0hDUl9JTkZPIHBIY3IgPSAoSF9IQ1JfSU5GTylwdHI7Ci0gIFNDSEFSICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0gIFVTSE9SVCAqcExlZnRTdGFydE9mU2VnbWVudDsKLSAgVVNIT1JUICpwUmlnaHRTdGFydE9mU2VnbWVudDsKLSAgVUNIQVIgICByZWFkRGlyZWN0aW9uOwotICBVSU5UICAgKnBTZWdtZW50Qml0ZmllbGQ7Ci0gIFVJTlQgICAgc2VnbWVudE9mZnNldDsKLSAgVUlOVCAgICpwRXNjYXBlU2VxdWVuY2VJbmZvOwotICBVSU5UICAgIGNvZGV3b3JkT2Zmc2V0OwotICBVQ0hBUiAgIGNhcnJ5Qml0OwotICBVSU5UICAgIGVzY2FwZVByZWZpeFVwOwotICBTQ0hBUiAgKnBTdGE7CisgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50OworICBJTlQgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICBVQ0hBUiByZWFkRGlyZWN0aW9uOworICBVSU5UICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UIHNlZ21lbnRPZmZzZXQ7CisgIFVJTlQgKnBFc2NhcGVTZXF1ZW5jZUluZm87CisgIFVJTlQgY29kZXdvcmRPZmZzZXQ7CisgIFVDSEFSIGNhcnJ5Qml0OworICBVSU5UIGVzY2FwZVByZWZpeFVwOworICBTQ0hBUiAqcFN0YTsKIAotICBwUmVtYWluaW5nQml0c0luU2VnbWVudCAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBwTGVmdFN0YXJ0T2ZTZWdtZW50ICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIHBSaWdodFN0YXJ0T2ZTZWdtZW50ICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7Ci0gIHJlYWREaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbjsKLSAgcFNlZ21lbnRCaXRmaWVsZCAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOwotICBzZWdtZW50T2Zmc2V0ICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7Ci0gIHBFc2NhcGVTZXF1ZW5jZUluZm8gICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucEVzY2FwZVNlcXVlbmNlSW5mbzsKLSAgY29kZXdvcmRPZmZzZXQgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKLSAgcFN0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhOworICBwUmVtYWluaW5nQml0c0luU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBwTGVmdFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKKyAgcFJpZ2h0U3RhcnRPZlNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgcmVhZERpcmVjdGlvbiA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247CisgIHBTZWdtZW50Qml0ZmllbGQgPSBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOworICBzZWdtZW50T2Zmc2V0ID0gcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldDsKKyAgcEVzY2FwZVNlcXVlbmNlSW5mbyA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBFc2NhcGVTZXF1ZW5jZUluZm87CisgIGNvZGV3b3JkT2Zmc2V0ID0gcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQ7CisgIHBTdGEgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhOwogCi0gIGVzY2FwZVByZWZpeFVwICA9IChwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmIE1BU0tfRVNDQVBFX1BSRUZJWF9VUCkgPj4gTFNCX0VTQ0FQRV9QUkVGSVhfVVA7Ci0KKyAgZXNjYXBlUHJlZml4VXAgPQorICAgICAgKHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19FU0NBUEVfUFJFRklYX1VQKSA+PgorICAgICAgTFNCX0VTQ0FQRV9QUkVGSVhfVVA7CiAKICAgLyogZGVjb2RlIGVzY2FwZSBwcmVmaXggKi8KLSAgZm9yICggOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDAgOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxICkgewotCi0gICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSggYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKKyAgZm9yICg7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdID4gMDsKKyAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxKSB7CisgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSgKKyAgICAgICAgYnMsIHBIY3ItPmRlY0luT3V0LmJpdHN0cmVhbUFuY2hvciwgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwgcmVhZERpcmVjdGlvbik7CiAKICAgICAvKiBjb3VudCBvbmVzIGFuZCBzdG9yZSBzdW0gaW4gZXNjYXBlUHJlZml4VXAgKi8KLSAgICBpZiAoIGNhcnJ5Qml0ID09IDEgKSB7Ci0gICAgICBlc2NhcGVQcmVmaXhVcCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIGNvbnRlciBmb3Igb25lcyAqLworICAgIGlmIChjYXJyeUJpdCA9PSAxKSB7CisgICAgICBlc2NhcGVQcmVmaXhVcCArPSAxOyAvKiB1cGRhdGUgY29udGVyIGZvciBvbmVzICovCiAKICAgICAgIC8qIHN0b3JlIHVwZGF0ZWQgY291bnRlciBpbiBzaWRlaW5mbyBvZiBjdXJyZW50IGNvZGV3b3JkICovCi0gICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmPSB+TUFTS19FU0NBUEVfUFJFRklYX1VQOyAgICAgICAgLyogZGVsZXRlIG9sZCBlc2NhcGVQcmVmaXhVcCAqLwotICAgICAgZXNjYXBlUHJlZml4VXAgPDw9IExTQl9FU0NBUEVfUFJFRklYX1VQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0IHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KLSAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9IGVzY2FwZVByZWZpeFVwOyAgICAgICAgICAgICAgICAvKiBpbnNlcnQgbmV3IGVzY2FwZVByZWZpeFVwICovCi0gICAgICBlc2NhcGVQcmVmaXhVcCA+Pj0gTFNCX0VTQ0FQRV9QUkVGSVhfVVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hpZnQgYmFjayBkb3duICovCi0gICAgfQotICAgIGVsc2UgeyAgLyogc2VwYXJhdG9yIFt6ZXJvXSByZWFjaGVkICovCi0gICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YgZm9yIGxvb3AgY291bnRlciAoc2VlIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KLSAgICAgIGVzY2FwZVByZWZpeFVwICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBlc2NhcGVfc2VwYXJhdG9yICcwJyBhcHBlYXJzLCBhZGQgNCBhbmQgPT0+IGJyZWFrICovCisgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmPQorICAgICAgICAgIH5NQVNLX0VTQ0FQRV9QUkVGSVhfVVA7ICAgICAgICAgICAgICAvKiBkZWxldGUgb2xkIGVzY2FwZVByZWZpeFVwICovCisgICAgICBlc2NhcGVQcmVmaXhVcCA8PD0gTFNCX0VTQ0FQRV9QUkVGSVhfVVA7IC8qIHNoaWZ0IHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KKyAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9CisgICAgICAgICAgZXNjYXBlUHJlZml4VXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluc2VydCBuZXcgZXNjYXBlUHJlZml4VXAgKi8KKyAgICAgIGVzY2FwZVByZWZpeFVwID4+PSBMU0JfRVNDQVBFX1BSRUZJWF9VUDsgLyogc2hpZnQgYmFjayBkb3duICovCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcGFyYXRvciBbemVyb10gcmVhY2hlZCAqLworICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb29wIGNvdW50ZXIgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUpIGlzIGRvbmUgaGVyZSAqLworICAgICAgZXNjYXBlUHJlZml4VXAgKz0KKyAgICAgICAgICA0OyAvKiBpZiBlc2NhcGVfc2VwYXJhdG9yICcwJyBhcHBlYXJzLCBhZGQgNCBhbmQgPT0+IGJyZWFrICovCiAKLSAgICAgIC8qIHN0b3JlIGVzY2FwZVByZWZpeFVwIGluIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIGF0IGJpdCBwb3NpdGlvbiBlc2NhcGVQcmVmaXhVcCAqLwotICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0gfk1BU0tfRVNDQVBFX1BSRUZJWF9VUDsgICAgICAgIC8qIGRlbGV0ZSBvbGQgZXNjYXBlUHJlZml4VXAgKi8KLSAgICAgIGVzY2FwZVByZWZpeFVwIDw8PSBMU0JfRVNDQVBFX1BSRUZJWF9VUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGlmdCB0byBjb3JyZWN0IHBvc2l0aW9uICovCi0gICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSB8PSBlc2NhcGVQcmVmaXhVcDsgICAgICAgICAgICAgICAgLyogaW5zZXJ0IG5ldyBlc2NhcGVQcmVmaXhVcCAqLwotICAgICAgZXNjYXBlUHJlZml4VXAgPj49IExTQl9FU0NBUEVfUFJFRklYX1VQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0IGJhY2sgZG93biAqLworICAgICAgLyogc3RvcmUgZXNjYXBlUHJlZml4VXAgaW4gcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gYXQgYml0CisgICAgICAgKiBwb3NpdGlvbiBlc2NhcGVQcmVmaXhVcCAqLworICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0KKyAgICAgICAgICB+TUFTS19FU0NBUEVfUFJFRklYX1VQOyAgICAgICAgICAgICAgLyogZGVsZXRlIG9sZCBlc2NhcGVQcmVmaXhVcCAqLworICAgICAgZXNjYXBlUHJlZml4VXAgPDw9IExTQl9FU0NBUEVfUFJFRklYX1VQOyAvKiBzaGlmdCB0byBjb3JyZWN0IHBvc2l0aW9uICovCisgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSB8PQorICAgICAgICAgIGVzY2FwZVByZWZpeFVwOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbnNlcnQgbmV3IGVzY2FwZVByZWZpeFVwICovCisgICAgICBlc2NhcGVQcmVmaXhVcCA+Pj0gTFNCX0VTQ0FQRV9QUkVGSVhfVVA7IC8qIHNoaWZ0IGJhY2sgZG93biAqLwogCi0gICAgICAvKiBzdG9yZSBlc2NhcGVQcmVmaXhVcCBpbiBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSBhdCBiaXQgcG9zaXRpb24gZXNjYXBlUHJlZml4RG93biAqLwotICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0gfk1BU0tfRVNDQVBFX1BSRUZJWF9ET1dOOyAgICAgIC8qIGRlbGV0ZSBvbGQgZXNjYXBlUHJlZml4RG93biAqLwotICAgICAgZXNjYXBlUHJlZml4VXAgPDw9IExTQl9FU0NBUEVfUFJFRklYX0RPV047ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0IHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KLSAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9IGVzY2FwZVByZWZpeFVwOyAgICAgICAgICAgICAgICAvKiBpbnNlcnQgbmV3IGVzY2FwZVByZWZpeERvd24gKi8KLSAgICAgIGVzY2FwZVByZWZpeFVwID4+PSBMU0JfRVNDQVBFX1BSRUZJWF9ET1dOOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGlmdCBiYWNrIGRvd24gKi8KKyAgICAgIC8qIHN0b3JlIGVzY2FwZVByZWZpeFVwIGluIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIGF0IGJpdAorICAgICAgICogcG9zaXRpb24gZXNjYXBlUHJlZml4RG93biAqLworICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0KKyAgICAgICAgICB+TUFTS19FU0NBUEVfUFJFRklYX0RPV047IC8qIGRlbGV0ZSBvbGQgZXNjYXBlUHJlZml4RG93biAqLworICAgICAgZXNjYXBlUHJlZml4VXAgPDw9IExTQl9FU0NBUEVfUFJFRklYX0RPV047IC8qIHNoaWZ0IHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KKyAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9CisgICAgICAgICAgZXNjYXBlUHJlZml4VXA7IC8qIGluc2VydCBuZXcgZXNjYXBlUHJlZml4RG93biAqLwogCi0gICAgICBwU3RhW2NvZGV3b3JkT2Zmc2V0XSA9IEJPRFlfU0lHTl9FU0NfX0VTQ19XT1JEOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IG5leHQgc3RhdGUgKi8KLSAgICAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSA9IGFTdGF0ZUNvbnN0YW50MlN0YXRlW3BTdGFbY29kZXdvcmRPZmZzZXRdXTsgICAgICAgICAgIC8qIGdldCBzdGF0ZSBmcm9tIHNlcGFyYXRlIGFycmF5IG9mIGN3LXNpZGVpbmZvICovCisgICAgICBwU3RhW2NvZGV3b3JkT2Zmc2V0XSA9IEJPRFlfU0lHTl9FU0NfX0VTQ19XT1JEOyAvKiBzZXQgbmV4dCBzdGF0ZSAqLworICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0KKyAgICAgICAgICBhU3RhdGVDb25zdGFudDJTdGF0ZVtwU3RhW2NvZGV3b3JkT2Zmc2V0XV07IC8qIGdldCBzdGF0ZSBmcm9tIHNlcGFyYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSBvZiBjdy1zaWRlaW5mbyAqLwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKLSAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8PSAwICkgewotICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50Qml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCkgeworICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCiAKLSNpZiBTVEFURV9NQUNISU5FX0VSUk9SX0NIRUNLCi0gICAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8IDAgKSB7CisgICAgaWYgKHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCkgewogICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gU1RBVEVfRVJST1JfQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWDsKLSAgICAgIHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVg7CisgICAgICByZXR1cm4gQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWDsKICAgICB9Ci0jZW5kaWYKICAgfQogCiAgIHJldHVybiBTVE9QX1RISVNfU1RBVEU7CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246IERlY29kZSBlc2NhcGVXb3JkIG9mIGVzY2FwZSBzZXF1ZW5jZS4gSWYgdGhlIGVzY2FwZSBzZXF1ZW5jZSBpcyBkZWNvZGVkCi0gICAgICAgICAgICAgICAgICBjb21wbGV0ZWx5LCBhc3NlbWJsZSBxdWFudGl6ZWQtc3BlY3RyYWwtZXNjYXBlLWNvZWZmaWNpZW50IGFuZCByZXBsYWNlIHRoZQotICAgICAgICAgICAgICAgICAgcHJldmlvdXMgZGVjb2RlZCAxNiBieSB0aGUgbmV3IHZhbHVlLgotICAgICAgICAgICAgICAgICAgVGVzdCBmbGFnQi4gSWYgZmxhZ0IgaXMgc2V0LCB0aGUgc2Vjb25kIGVzY2FwZSBzZXF1ZW5jZSBtdXN0IGJlIGRlY29kZWQuIElmCi0gICAgICAgICAgICAgICAgICBmbGFnQiBpcyBub3Qgc2V0LCB0aGUgY29kZXdvcmQgaXMgZGVjb2RlZCBhbmQgdGhlIHN0YXRlIG1hY2hpbmUgaXMgc3dpdGNoZWQKLSAgICAgICAgICAgICAgICAgIG9mZi4KKyAgICAgZGVzY3JpcHRpb246IERlY29kZSBlc2NhcGVXb3JkIG9mIGVzY2FwZSBzZXF1ZW5jZS4gSWYgdGhlIGVzY2FwZSBzZXF1ZW5jZQoraXMgZGVjb2RlZCBjb21wbGV0ZWx5LCBhc3NlbWJsZSBxdWFudGl6ZWQtc3BlY3RyYWwtZXNjYXBlLWNvZWZmaWNpZW50IGFuZAorcmVwbGFjZSB0aGUgcHJldmlvdXMgZGVjb2RlZCAxNiBieSB0aGUgbmV3IHZhbHVlLiBUZXN0IGZsYWdCLiBJZiBmbGFnQiBpcyBzZXQsCit0aGUgc2Vjb25kIGVzY2FwZSBzZXF1ZW5jZSBtdXN0IGJlIGRlY29kZWQuIElmIGZsYWdCIGlzIG5vdCBzZXQsIHRoZSBjb2Rld29yZCBpcworZGVjb2RlZCBhbmQgdGhlIHN0YXRlIG1hY2hpbmUgaXMgc3dpdGNoZWQgb2ZmLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0cHV0OiAgIFR3byBsaW5lcyB3aXRoIHZhbGlkIHNpZ24uIEF0IGxlYXN0IG9uZSBvZiBib3RoIGxpbmVzIGhhcyBnb3QgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgIHZhbHVlLgorICAgICAgICBvdXRwdXQ6ICAgVHdvIGxpbmVzIHdpdGggdmFsaWQgc2lnbi4gQXQgbGVhc3Qgb25lIG9mIGJvdGggbGluZXMgaGFzIGdvdAordGhlIGNvcnJlY3QgdmFsdWUuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCB2b2lkICpwdHIpCi17CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCB2b2lkICpwdHIpIHsKICAgSF9IQ1JfSU5GTyBwSGNyID0gKEhfSENSX0lORk8pcHRyOwotICBTQ0hBUiAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVU0hPUlQgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVTSE9SVCAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVDSEFSICAgICAgcmVhZERpcmVjdGlvbjsKLSAgVUlOVCAgICAgICpwU2VnbWVudEJpdGZpZWxkOwotICBVSU5UICAgICAgKnBDb2Rld29yZEJpdGZpZWxkOwotICBVSU5UICAgICAgIHNlZ21lbnRPZmZzZXQ7CisgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50OworICBJTlQgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICBVQ0hBUiByZWFkRGlyZWN0aW9uOworICBVSU5UICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UICpwQ29kZXdvcmRCaXRmaWVsZDsKKyAgVUlOVCBzZWdtZW50T2Zmc2V0OwogCi0gIEZJWFBfREJMICAqcFJlc3VsdEJhc2U7Ci0gIFVTSE9SVCAgICAqaVJlc3VsdFBvaW50ZXI7Ci0gIFVJTlQgICAgICAqcEVzY2FwZVNlcXVlbmNlSW5mbzsKLSAgVUlOVCAgICAgICBjb2Rld29yZE9mZnNldDsKKyAgRklYUF9EQkwgKnBSZXN1bHRCYXNlOworICBVU0hPUlQgKmlSZXN1bHRQb2ludGVyOworICBVSU5UICpwRXNjYXBlU2VxdWVuY2VJbmZvOworICBVSU5UIGNvZGV3b3JkT2Zmc2V0OwogCi0gIFVJTlQgICAgICAgZXNjYXBlV29yZDsKLSAgVUlOVCAgICAgICBlc2NhcGVQcmVmaXhEb3duOwotICBVSU5UICAgICAgIGVzY2FwZVByZWZpeFVwOwotICBVQ0hBUiAgICAgIGNhcnJ5Qml0OwotICBVSU5UICAgICAgIGlRU0M7Ci0gIElOVCAgICAgICAgc2lnbjsKLSAgVUlOVCAgICAgICBmbGFnQTsKLSAgVUlOVCAgICAgICBmbGFnQjsKLSAgU0NIQVIgICAgICpwU3RhOworICBVSU5UIGVzY2FwZVdvcmQ7CisgIFVJTlQgZXNjYXBlUHJlZml4RG93bjsKKyAgVUlOVCBlc2NhcGVQcmVmaXhVcDsKKyAgVUNIQVIgY2FycnlCaXQ7CisgIFVJTlQgaVFTQzsKKyAgSU5UIHNpZ247CisgIFVJTlQgZmxhZ0E7CisgIFVJTlQgZmxhZ0I7CisgIFNDSEFSICpwU3RhOwogCiAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0gIHBMZWZ0U3RhcnRPZlNlZ21lbnQgICAgID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKLSAgcFJpZ2h0U3RhcnRPZlNlZ21lbnQgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKLSAgcmVhZERpcmVjdGlvbiAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOwotICBwU2VnbWVudEJpdGZpZWxkICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7Ci0gIHBDb2Rld29yZEJpdGZpZWxkICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7Ci0gIHNlZ21lbnRPZmZzZXQgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldDsKKyAgcExlZnRTdGFydE9mU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIHBSaWdodFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIHJlYWREaXJlY3Rpb24gPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOworICBwU2VnbWVudEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgcENvZGV3b3JkQml0ZmllbGQgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKKyAgc2VnbWVudE9mZnNldCA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7CiAKLSAgcFJlc3VsdEJhc2UgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZTsKLSAgaVJlc3VsdFBvaW50ZXIgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKLSAgcEVzY2FwZVNlcXVlbmNlSW5mbyAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wRXNjYXBlU2VxdWVuY2VJbmZvOwotICBjb2Rld29yZE9mZnNldCAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0OwotICBwU3RhICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGE7CisgIHBSZXN1bHRCYXNlID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7CisgIGlSZXN1bHRQb2ludGVyID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7CisgIHBFc2NhcGVTZXF1ZW5jZUluZm8gPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wRXNjYXBlU2VxdWVuY2VJbmZvOworICBjb2Rld29yZE9mZnNldCA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0OworICBwU3RhID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKIAotICBlc2NhcGVXb3JkICAgICAgID0gIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19FU0NBUEVfV09SRDsKLSAgZXNjYXBlUHJlZml4RG93biA9IChwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmIE1BU0tfRVNDQVBFX1BSRUZJWF9ET1dOKSA+PiBMU0JfRVNDQVBFX1BSRUZJWF9ET1dOOwotCisgIGVzY2FwZVdvcmQgPSBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmIE1BU0tfRVNDQVBFX1dPUkQ7CisgIGVzY2FwZVByZWZpeERvd24gPQorICAgICAgKHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19FU0NBUEVfUFJFRklYX0RPV04pID4+CisgICAgICBMU0JfRVNDQVBFX1BSRUZJWF9ET1dOOwogCiAgIC8qIGRlY29kZSBlc2NhcGUgd29yZCAqLwotICBmb3IgKCA7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdID4gMCA7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDEgKSB7Ci0KLSAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKCBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwTGVmdFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSaWdodFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWREaXJlY3Rpb24pOworICBmb3IgKDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwOworICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDEpIHsKKyAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKAorICAgICAgICBicywgcEhjci0+ZGVjSW5PdXQuYml0c3RyZWFtQW5jaG9yLCAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKKyAgICAgICAgJnBSaWdodFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLCByZWFkRGlyZWN0aW9uKTsKIAogICAgIC8qIGJ1aWxkIGVzY2FwZSB3b3JkICovCi0gICAgZXNjYXBlV29yZCA8PD0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVmdCBzaGlmdCBwcmV2aW91cyBkZWNvZGVkIHBhcnQgb2YgZXNjYXBlV29yZCBieSBvbiBiaXQgKi8KLSAgICBlc2NhcGVXb3JkID0gZXNjYXBlV29yZCB8IGNhcnJ5Qml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3NlbWJsZSBlc2NhcGUgd29yZCBieSBiaXR3aXNlIG9yICovCisgICAgZXNjYXBlV29yZCA8PD0KKyAgICAgICAgMTsgLyogbGVmdCBzaGlmdCBwcmV2aW91cyBkZWNvZGVkIHBhcnQgb2YgZXNjYXBlV29yZCBieSBvbiBiaXQgKi8KKyAgICBlc2NhcGVXb3JkID0gZXNjYXBlV29yZCB8IGNhcnJ5Qml0OyAvKiBhc3NlbWJsZSBlc2NhcGUgd29yZCBieSBiaXR3aXNlIG9yICovCiAKLSAgICAvKiBkZWNyZW1lbnQgY291bnRlciBmb3IgbGVuZ3RoIG9mIGVzY2FwZSB3b3JkIGJlY2F1c2Ugb25lIG1vcmUgYml0IHdhcyBkZWNvZGVkICovCisgICAgLyogZGVjcmVtZW50IGNvdW50ZXIgZm9yIGxlbmd0aCBvZiBlc2NhcGUgd29yZCBiZWNhdXNlIG9uZSBtb3JlIGJpdCB3YXMKKyAgICAgKiBkZWNvZGVkICovCiAgICAgZXNjYXBlUHJlZml4RG93biAtPSAxOwogCiAgICAgLyogc3RvcmUgdXBkYXRlZCBlc2NhcGVQcmVmaXhEb3duICovCi0gICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0gfk1BU0tfRVNDQVBFX1BSRUZJWF9ET1dOOyAgICAgICAgLyogZGVsZXRlIG9sZCBlc2NhcGVQcmVmaXhEb3duICovCi0gICAgZXNjYXBlUHJlZml4RG93biA8PD0gTFNCX0VTQ0FQRV9QUkVGSVhfRE9XTjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hpZnQgdG8gY29ycmVjdCBwb3NpdGlvbiAqLwotICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9IGVzY2FwZVByZWZpeERvd247ICAgICAgICAgICAgICAgIC8qIGluc2VydCBuZXcgZXNjYXBlUHJlZml4RG93biAqLwotICAgIGVzY2FwZVByZWZpeERvd24gPj49IExTQl9FU0NBUEVfUFJFRklYX0RPV047ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0IGJhY2sgKi8KLQorICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICY9CisgICAgICAgIH5NQVNLX0VTQ0FQRV9QUkVGSVhfRE9XTjsgLyogZGVsZXRlIG9sZCBlc2NhcGVQcmVmaXhEb3duICovCisgICAgZXNjYXBlUHJlZml4RG93biA8PD0gTFNCX0VTQ0FQRV9QUkVGSVhfRE9XTjsgLyogc2hpZnQgdG8gY29ycmVjdCBwb3NpdGlvbiAqLworICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9CisgICAgICAgIGVzY2FwZVByZWZpeERvd247IC8qIGluc2VydCBuZXcgZXNjYXBlUHJlZml4RG93biAqLworICAgIGVzY2FwZVByZWZpeERvd24gPj49IExTQl9FU0NBUEVfUFJFRklYX0RPV047IC8qIHNoaWZ0IGJhY2sgKi8KIAogICAgIC8qIHN0b3JlIHVwZGF0ZWQgZXNjYXBlV29yZCAqLwotICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICY9IH5NQVNLX0VTQ0FQRV9XT1JEOyAgICAgICAgICAgICAgIC8qIGRlbGV0ZSBvbGQgZXNjYXBlV29yZCAqLwotICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9IGVzY2FwZVdvcmQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluc2VydCBuZXcgZXNjYXBlV29yZCAqLworICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICY9CisgICAgICAgIH5NQVNLX0VTQ0FQRV9XT1JEOyAvKiBkZWxldGUgb2xkIGVzY2FwZVdvcmQgKi8KKyAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSB8PQorICAgICAgICBlc2NhcGVXb3JkOyAvKiBpbnNlcnQgbmV3IGVzY2FwZVdvcmQgKi8KIAorICAgIGlmIChlc2NhcGVQcmVmaXhEb3duID09IDApIHsKKyAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7IC8qIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbG9vcCBjb3VudGVyIChzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KIAotICAgIGlmICggZXNjYXBlUHJlZml4RG93biA9PSAwICkgewotICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mIGZvciBsb29wIGNvdW50ZXIgKHNlZSBhYm92ZSkgaXMgZG9uZSBoZXJlICovCi0KLSAgICAgIC8qIGVzY2FwZSBzZXF1ZW5jZSBkZWNvZGVkLiBBc3NlbWJsZSBlc2NhcGUtbGluZSBhbmQgcmVwbGFjZSBvcmlnaW5hbCBsaW5lICovCisgICAgICAvKiBlc2NhcGUgc2VxdWVuY2UgZGVjb2RlZC4gQXNzZW1ibGUgZXNjYXBlLWxpbmUgYW5kIHJlcGxhY2Ugb3JpZ2luYWwgbGluZQorICAgICAgICovCiAKICAgICAgIC8qIHN0ZXAgMCAqLwogICAgICAgLyogZGVyaXZlIHNpZ24gKi8KICAgICAgIGlRU0MgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07Ci0gICAgICBzaWduID0gKHBSZXN1bHRCYXNlW2lRU0NdID49IChGSVhQX0RCTCkwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBzaWduIG9mIGVzY2FwZSB2YWx1ZSAxNiAqLworICAgICAgc2lnbiA9IChwUmVzdWx0QmFzZVtpUVNDXSA+PSAoRklYUF9EQkwpMCkKKyAgICAgICAgICAgICAgICAgPyAxCisgICAgICAgICAgICAgICAgIDogLTE7IC8qIGdldCBzaWduIG9mIGVzY2FwZSB2YWx1ZSAxNiAqLwogCiAgICAgICAvKiBzdGVwIDEgKi8KICAgICAgIC8qIGdldCBlc2NhcGVQcmVmaXhVcCAqLwotICAgICAgZXNjYXBlUHJlZml4VXAgPSAocEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJiBNQVNLX0VTQ0FQRV9QUkVGSVhfVVApID4+IExTQl9FU0NBUEVfUFJFRklYX1VQOworICAgICAgZXNjYXBlUHJlZml4VXAgPQorICAgICAgICAgIChwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmIE1BU0tfRVNDQVBFX1BSRUZJWF9VUCkgPj4KKyAgICAgICAgICBMU0JfRVNDQVBFX1BSRUZJWF9VUDsKIAogICAgICAgLyogc3RlcCAyICovCiAgICAgICAvKiBjYWxjdWxhdGUgZXNjYXBlIHZhbHVlICovCi0gICAgICBwUmVzdWx0QmFzZVtpUVNDXSA9IChGSVhQX0RCTCkoc2lnbiAqICgoKElOVCkgMSA8PCBlc2NhcGVQcmVmaXhVcCkgKyBlc2NhcGVXb3JkKSk7CisgICAgICBwUmVzdWx0QmFzZVtpUVNDXSA9CisgICAgICAgICAgKEZJWFBfREJMKShzaWduICogKCgoSU5UKTEgPDwgZXNjYXBlUHJlZml4VXApICsgKElOVCllc2NhcGVXb3JkKSk7CiAKLSAgICAgIC8qIGdldCBib3RoIGZsYWdzIGZyb20gc2lkZWluZm8gKGZsYWdzIGFyZSBub3Qgc2hpZnRlZCB0byB0aGUgbHNiLXBvc2l0aW9uKSAqLworICAgICAgLyogZ2V0IGJvdGggZmxhZ3MgZnJvbSBzaWRlaW5mbyAoZmxhZ3MgYXJlIG5vdCBzaGlmdGVkIHRvIHRoZQorICAgICAgICogbHNiLXBvc2l0aW9uKSAqLwogICAgICAgZmxhZ0EgPSBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmIE1BU0tfRkxBR19BOwogICAgICAgZmxhZ0IgPSBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmIE1BU0tfRkxBR19COwogCkBAIC0xMzYxLDQ5ICsxNDk4LDUxIEBACiAgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSA9IDA7CiAKICAgICAgIC8qIGNoYW5nZSBzdGF0ZSBpbiBkZXBlbmRlbmNlIG9mIGZsYWcgZmxhZ0IgKi8KLSAgICAgIGlmICggZmxhZ0EgIT0gMCApIHsKLSAgICAgICAgLyogZmlyc3QgZXNjYXBlIHNlcXVlbmNlIGRlY29kZWQ7IHByZXZpb3VzIGRlY29kZWQgMTYgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdmFsaWQgbGluZSAqLworICAgICAgaWYgKGZsYWdBICE9IDApIHsKKyAgICAgICAgLyogZmlyc3QgZXNjYXBlIHNlcXVlbmNlIGRlY29kZWQ7IHByZXZpb3VzIGRlY29kZWQgMTYgaGFzIGJlZW4gcmVwbGFjZWQKKyAgICAgICAgICogYnkgdmFsaWQgbGluZSAqLwogCi0gICAgICAgIC8qIGNsZWFyIGZsYWdBIGluIHNpZGVpbmZvIHdvcmQgYmVjYXVzZSB0aGlzIGVzY2FwZSBzZXF1ZW5jZSBoYXMgYWxyZWFkeSBiZWVkIGRlY29kZWQgKi8KKyAgICAgICAgLyogY2xlYXIgZmxhZ0EgaW4gc2lkZWluZm8gd29yZCBiZWNhdXNlIHRoaXMgZXNjYXBlIHNlcXVlbmNlIGhhcyBhbHJlYWR5CisgICAgICAgICAqIGJlZWQgZGVjb2RlZCAqLwogICAgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmPSB+TUFTS19GTEFHX0E7CiAKLSAgICAgICAgaWYgKCBmbGFnQiA9PSAwICkgewotICAgICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICBpZiAoZmxhZ0IgPT0gMCkgeworICAgICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7IC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc3dpdGNoIG9mZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtYWNoaW5lICovCisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgLyogdXBkYXRlZCBwb2ludGVyIHRvIG5leHQgYW5kIGxhc3QgMTYgKi8KICAgICAgICAgICBpUVNDKys7CiAgICAgICAgICAgaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdID0gaVFTQzsKIAogICAgICAgICAgIC8qIGNoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgIHBTdGFbY29kZXdvcmRPZmZzZXRdID0gQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWDsKLSAgICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUgPSBhU3RhdGVDb25zdGFudDJTdGF0ZVtwU3RhW2NvZGV3b3JkT2Zmc2V0XV07IC8qIGdldCBzdGF0ZSBmcm9tIHNlcGFyYXRlIGFycmF5IG9mIGN3LXNpZGVpbmZvICovCisgICAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0KKyAgICAgICAgICAgICAgYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOyAvKiBnZXQgc3RhdGUgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlIGFycmF5IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ctc2lkZWluZm8gKi8KICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKAorICAgICAgICAgICAgJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLCBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1hY2hpbmUgKi8KICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogCi0gIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCApIHsKLSAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKyAgaWYgKHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDw9IDApIHsKKyAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCk7IC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLwogCi0jaWYgU1RBVEVfTUFDSElORV9FUlJPUl9DSEVDSwotICAgIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPCAwICkgeworICAgIGlmIChwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8IDApIHsKICAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEOwotICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQ7CisgICAgICByZXR1cm4gQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQ7CiAgICAgfQotI2VuZGlmCiAgIH0KIAogICByZXR1cm4gU1RPUF9USElTX1NUQVRFOwogfQotCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JzLmggYi9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JzLmgKaW5kZXggNjc4YmEyNi4uYWNiMmY0MCAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNycy5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcnMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3NSArOTAsODcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgUm9iZXJ0IFdlaWRuZXIgKERTUCBTb2x1dGlvbnMpCisKICAgIERlc2NyaXB0aW9uOiBIQ1IgRGVjb2RlcjogRGVmaW5lcyBvZiBzdGF0ZS1jb25zdGFudHMsIG1hc2tzIGFuZAogICAgICAgICAgICAgICAgIHN0YXRlLXByb3RvdHlwZXMKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfQUFDREVDX0hDUlNfSF8KLSNkZWZpbmUgX0FBQ0RFQ19IQ1JTX0hfCi0KLQorI2lmbmRlZiBBQUNERUNfSENSU19ICisjZGVmaW5lIEFBQ0RFQ19IQ1JTX0gKIAogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKICNpbmNsdWRlICJhYWNkZWNfaGNyX3R5cGVzLmgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZvdXIgZGlmZmVyZW50IGtpbmRzIG9mIHR5cGVzIG9mIHN0YXRlcyBhcmU6ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGRpZmZlcmVudCBzdGF0ZXMgYXJlIGRlZmluZWQgYXMgY29uc3RhbnRzICovICAgICAvKiBzdGFydCAgIG1pZGRsZT1zZWxmICAgbmV4dCAgIHN0b3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSAgU1RPUF9USElTX1NUQVRFICAgICAgICAgICAgIDAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lICBCT0RZX09OTFkgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgLyogICBYICAgICAgICAgIFggICAgICAgICAgICAgICAgWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgIEJPRFlfU0lHTl9fQk9EWSAgICAgICAgICAgICAyICAgICAgICAgICAgICAvKiAgIFggICAgICAgICAgWCAgICAgICAgIFggICAgICBYIFtzdG9wIGlmIG5vIHNpZ25dICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSAgQk9EWV9TSUdOX19TSUdOICAgICAgICAgICAgIDMgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBYICAgICAgICAgICAgICAgIFggW3N0b3AgaWYgc2lnbiBiaXRzIGRlY29kZWRdICAgICAgICAgICovCi0jZGVmaW5lICBCT0RZX1NJR05fRVNDX19CT0RZICAgICAgICAgNCAgICAgICAgICAgICAgLyogICBYICAgICAgICAgIFggICAgICAgICBYICAgICAgWCBbc3RvcCBpZiBubyBzaWduXSAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgIEJPRFlfU0lHTl9FU0NfX1NJR04gICAgICAgICA1ICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgWCAgICAgICAgIFggICAgICBYIFtzdG9wIGlmIG5vIGVzY2FwZSBzZXF1ZW5jZV0gICAgICAgICAqLwotI2RlZmluZSAgQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWCAgIDYgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBYICAgICAgICAgWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lICBCT0RZX1NJR05fRVNDX19FU0NfV09SRCAgICAgNyAgICAgICAgICAgICAgLyogICAgICAgICAgICAgIFggICAgICAgICBYICAgICAgWCBbc3RvcCBpZiBhYnMoc2Vjb25kIHFzYykgIT0gMTZdICAgICAgKi8KKy8qIFRoZSBmb3VyIGRpZmZlcmVudCBraW5kcyBvZiB0eXBlcyBvZiBzdGF0ZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICovCisvKiBkaWZmZXJlbnQgc3RhdGVzIGFyZSBkZWZpbmVkIGFzIGNvbnN0YW50cyAqLyAvKiBzdGFydCAgIG1pZGRsZT1zZWxmICAgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCAqLworI2RlZmluZSBTVE9QX1RISVNfU1RBVEUgXAorICAwIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJPRFlfT05MWSBcCisgIDEgLyogICBYICAgICAgICAgIFggICAgICAgICAgICAgICAgWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk9EWV9TSUdOX19CT0RZIFwKKyAgMiAvKiAgIFggICAgICAgICAgWCAgICAgICAgIFggICAgICBYIFtzdG9wIGlmIG5vIHNpZ25dICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCT0RZX1NJR05fX1NJR04gXAorICAzIC8qICAgICAgICAgICAgICBYICAgICAgICAgICAgICAgIFggW3N0b3AgaWYgc2lnbiBiaXRzIGRlY29kZWRdICAgICAgICAgICovCisjZGVmaW5lIEJPRFlfU0lHTl9FU0NfX0JPRFkgXAorICA0IC8qICAgWCAgICAgICAgICBYICAgICAgICAgWCAgICAgIFggW3N0b3AgaWYgbm8gc2lnbl0gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJPRFlfU0lHTl9FU0NfX1NJR04gXAorICA1IC8qICAgICAgICAgICAgICBYICAgICAgICAgWCAgICAgIFggW3N0b3AgaWYgbm8gZXNjYXBlIHNlcXVlbmNlXSAgICAgICAgICovCisjZGVmaW5lIEJPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVggXAorICA2IC8qICAgICAgICAgICAgICBYICAgICAgICAgWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJPRFlfU0lHTl9FU0NfX0VTQ19XT1JEIFwKKyAgNyAvKiAgICAgICAgICAgICAgWCAgICAgICAgIFggICAgICBYIFtzdG9wIGlmIGFicyhzZWNvbmQgcXNjKSAhPSAxNl0gICAgICAqLwogCiAvKiBleGFtcGxlczogKi8KIAotLyogQk9EWV9PTkxZICAgICAgICAgICAgICAgICAgICBtZWFucyBvbmx5IHRoZSBjb2Rld29yZCBib2R5IHdpbGwgYmUgZGVjb2RlZDsgbm8gc2lnbiBiaXRzIHdpbGwgZm9sbG93IGFuZCBubyBlc2NhcGVzZXF1ZW5jZSB3aWxsIGZvbGxvdyAqLworLyogQk9EWV9PTkxZICAgICAgICAgICAgICAgICAgICBtZWFucyBvbmx5IHRoZSBjb2Rld29yZCBib2R5IHdpbGwgYmUgZGVjb2RlZDsgbm8KKyAqIHNpZ24gYml0cyB3aWxsIGZvbGxvdyBhbmQgbm8gZXNjYXBlc2VxdWVuY2Ugd2lsbCBmb2xsb3cgKi8KIAotLyogQk9EWV9TSUdOX19CT0RZICAgICAgICAgICAgICBtZWFucyB0aGF0IHRoZSBjb2Rld29yZCBjb25zaXN0cyBvZiB0d28gcGFydHM7IGJvZHkgYW5kIHNpZ24gcGFydC4gVGhlIHBhcnQgJ19fQk9EWScgYWZ0ZXIgdGhlIHR3byB1bmRlcnNjb3JlcyBzaG93cyAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBiaXRzIHdoaWNoIGFyZSBjdXJyZW50bHkgZGVjb2RlZCBiZWxvbmcgdG8gdGhlICdfX0JPRFknIG9mIHRoZSBjb2Rld29yZCBhbmQgbm90IHRvIHRoZSBzaWduIHBhcnQuICovCisvKiBCT0RZX1NJR05fX0JPRFkgICAgICAgICAgICAgIG1lYW5zIHRoYXQgdGhlIGNvZGV3b3JkIGNvbnNpc3RzIG9mIHR3byBwYXJ0czsKKyAqIGJvZHkgYW5kIHNpZ24gcGFydC4gVGhlIHBhcnQgJ19fQk9EWScgYWZ0ZXIgdGhlIHR3byB1bmRlcnNjb3JlcyBzaG93cyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBiaXRzIHdoaWNoIGFyZSBjdXJyZW50bHkgZGVjb2RlZCBiZWxvbmcKKyAqIHRvIHRoZSAnX19CT0RZJyBvZiB0aGUgY29kZXdvcmQgYW5kIG5vdCB0byB0aGUgc2lnbiBwYXJ0LiAqLwogCi0vKiBCT0RZX1NJR05fRVNDX19FU0NfUEIgICAgICAgIG1lYW5zIHRoYXQgdGhlIGNvZGV3b3JkIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzOyBib2R5LCBzaWduIGFuZCAoaGVyZTogdHdvKSBlc2NhcGUgc2VxdWVuY2VzOyAgKi8KKy8qIEJPRFlfU0lHTl9FU0NfX0VTQ19QQiAgICAgICAgbWVhbnMgdGhhdCB0aGUgY29kZXdvcmQgY29uc2lzdHMgb2YgdGhyZWUgcGFydHM7CisgKiBib2R5LCBzaWduIGFuZCAoaGVyZTogdHdvKSBlc2NhcGUgc2VxdWVuY2VzOyAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUCA9IFByZWZpeCA9IG9uZXMgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyA9IEVzY2FwZSBXb3JkICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgPSBmaXJzdCBwb3NzaWJsZSAob2YgdHdvKSBFc2NhcGUgc2VxdWVjZXMgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQiA9IHNlY29uZCBwb3NzaWJsZSAob2YgdHdvKSBFc2NhcGUgc2VxdWVjZXMgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHBhcnQgYWZ0ZXIgdGhlIHR3byB1bmRlcnNjb3JlcyBzaG93cyB0aGF0IHRoZSBjdXJyZW50IGJpdHMgd2hpY2ggYXJlIGRlY29kZWQgYmVsb25nIHRvIHRoZSAnX19FU0NfUEInIC0gcGFydCBvZiB0aGUgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXdvcmQuIFRoYXQgbWVhbnMgdGhlIGJvZHkgYW5kIHRoZSBzaWduIGJpdHMgYXJlIGRlY29kZWQgY29tcGxldGVseSBhbmQgdGhlIGJpdHMgd2hpY2ggYXJlIGRlY29kZWQgbm93IGJlbG9uZyB0byAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXNjYXBlIHNlcXVlbmNlIFtQID0gcHJlZml4OyBCPXNlY29uZCBwb3NzaWJsZSBlc2NhcGUgc2VxdWVuY2VdICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwYXJ0IGFmdGVyIHRoZSB0d28gdW5kZXJzY29yZXMgc2hvd3MgdGhhdAorICogdGhlIGN1cnJlbnQgYml0cyB3aGljaCBhcmUgZGVjb2RlZCBiZWxvbmcgdG8gdGhlICdfX0VTQ19QQicgLSBwYXJ0IG9mIHRoZSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rld29yZC4gVGhhdCBtZWFucyB0aGUgYm9keSBhbmQgdGhlIHNpZ24gYml0cworICogYXJlIGRlY29kZWQgY29tcGxldGVseSBhbmQgdGhlIGJpdHMgd2hpY2ggYXJlIGRlY29kZWQgbm93IGJlbG9uZyB0byAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXNjYXBlIHNlcXVlbmNlIFtQID0gcHJlZml4OyBCPXNlY29uZAorICogcG9zc2libGUgZXNjYXBlIHNlcXVlbmNlXSAqLwogCisjZGVmaW5lIE1TQl8zMV9NQVNLIDB4ODAwMDAwMDAgLyogbWFza3MgTVNCICg9IEJpdCAzMSkgaW4gYSAzMiBiaXQgd29yZCAqLworI2RlZmluZSBESU1FTlNJT05fT0ZfRVNDQVBFX0NPREVCT09LIDIgLyogZm9yIGNiID49IDExIGlzIGRpbWVuc2lvbiAyICovCisjZGVmaW5lIEVTQ0FQRV9DT0RFQk9PSyAxMQogCi0jZGVmaW5lICAgTVNCXzMxX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAgICAgICAgICAgICAgIC8qIG1hc2tzIE1TQiAoPSBCaXQgMzEpIGluIGEgMzIgYml0IHdvcmQgKi8KLSNkZWZpbmUgICBESU1FTlNJT05fT0ZfRVNDQVBFX0NPREVCT09LICAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGNiID49IDExIGlzIGRpbWVuc2lvbiAyICovCi0jZGVmaW5lICAgRVNDQVBFX0NPREVCT09LICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIE1BU0tfRVNDQVBFX1BSRUZJWF9VUCAweDAwMEYwMDAwCisjZGVmaW5lIExTQl9FU0NBUEVfUFJFRklYX1VQIDE2CiAKLSNkZWZpbmUgICBNQVNLX0VTQ0FQRV9QUkVGSVhfVVAgICAgICAgICAgICAgMHgwMDBGMDAwMAotI2RlZmluZSAgIExTQl9FU0NBUEVfUFJFRklYX1VQICAgICAgICAgICAgICAxNgorI2RlZmluZSBNQVNLX0VTQ0FQRV9QUkVGSVhfRE9XTiAweDAwMDBGMDAwCisjZGVmaW5lIExTQl9FU0NBUEVfUFJFRklYX0RPV04gMTIKIAotI2RlZmluZSAgIE1BU0tfRVNDQVBFX1BSRUZJWF9ET1dOICAgICAgICAgICAweDAwMDBGMDAwCi0jZGVmaW5lICAgTFNCX0VTQ0FQRV9QUkVGSVhfRE9XTiAgICAgICAgICAgIDEyCi0KLSNkZWZpbmUgICBNQVNLX0VTQ0FQRV9XT1JEICAgICAgICAgICAgICAgICAgMHgwMDAwMEZGRgotI2RlZmluZSAgIE1BU0tfRkxBR19BICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lICAgTUFTS19GTEFHX0IgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLQorI2RlZmluZSBNQVNLX0VTQ0FQRV9XT1JEIDB4MDAwMDBGRkYKKyNkZWZpbmUgTUFTS19GTEFHX0EgMHgwMDIwMDAwMAorI2RlZmluZSBNQVNLX0ZMQUdfQiAweDAwMTAwMDAwCiAKIGV4dGVybiB2b2lkIERlY29kZU5vblBDV3MoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIEhfSENSX0lORk8gaEhjcik7CiAKLVVJTlQgSGNyX1N0YXRlX0JPRFlfT05MWSAgICAgICAgICAgICAgICAgKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7Ci1VSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fX0JPRFkgICAgICAgICAgIChIQU5ETEVfRkRLX0JJVFNUUkVBTSwgdm9pZCopOwotVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX19TSUdOICAgICAgICAgICAoSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKLVVJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0JPRFkgICAgICAgKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7Ci1VSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19TSUdOICAgICAgIChIQU5ETEVfRkRLX0JJVFNUUkVBTSwgdm9pZCopOwotVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWCAoSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKLVVJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEICAgKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7CitVSU5UIEhjcl9TdGF0ZV9CT0RZX09OTFkoSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9fQk9EWShIQU5ETEVfRkRLX0JJVFNUUkVBTSwgdm9pZCopOworVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX19TSUdOKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7CitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19CT0RZKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7CitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19TSUdOKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7CitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19FU0NfUFJFRklYKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7CitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19FU0NfV09SRChIQU5ETEVfRkRLX0JJVFNUUkVBTSwgdm9pZCopOwogCi0jZW5kaWYgLyogX0FBQ0RFQ19IQ1JTX0hfICovCi0KKyNlbmRpZiAvKiBBQUNERUNfSENSU19IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuY3BwIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfcG5zLmNwcAppbmRleCA1NDFlZjA3Li40MzJjZDRlIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Bucy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTggKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBwZXJjZXB0dWFsIG5vaXNlIHN1YnN0aXR1dGlvbiB0b29sCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJhYWNkZWNfcG5zLmgiCiAKLQogI2luY2x1ZGUgImFhY19yYW0uaCIKICNpbmNsdWRlICJhYWNfcm9tLmgiCiAjaW5jbHVkZSAiY2hhbm5lbGluZm8uaCIKQEAgLTk5LDQ1ICsxMTAsMzggQEAKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKLQotI2RlZmluZSBOT0lTRV9PRkZTRVQgOTAgICAgICAgICAgIC8qIGNmLiBJU08gMTQ0OTYtMyBwLiAxNzUgKi8KKyNkZWZpbmUgTk9JU0VfT0ZGU0VUIDkwIC8qIGNmLiBJU08gMTQ0OTYtMyBwLiAxNzUgKi8KIAogLyohCiAgIFxicmllZiBSZXNldCBJbnRlckNoYW5uZWwgYW5kIFBOUyBkYXRhCiAKICAgVGhlIGZ1bmN0aW9uIHJlc2V0cyB0aGUgSW50ZXJDaGFubmVsIGFuZCBQTlMgZGF0YQogKi8KLXZvaWQgQ1Buc19SZXNldERhdGEoCi0gICAgQ1Buc0RhdGEgKnBQbnNEYXRhLAotICAgIENQbnNJbnRlckNoYW5uZWxEYXRhICpwUG5zSW50ZXJDaGFubmVsRGF0YQotICAgICkKLXsKK3ZvaWQgQ1Buc19SZXNldERhdGEoQ1Buc0RhdGEgKnBQbnNEYXRhLAorICAgICAgICAgICAgICAgICAgICBDUG5zSW50ZXJDaGFubmVsRGF0YSAqcFBuc0ludGVyQ2hhbm5lbERhdGEpIHsKKyAgRkRLX0FTU0VSVChwUG5zRGF0YSAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwUG5zSW50ZXJDaGFubmVsRGF0YSAhPSBOVUxMKTsKICAgLyogQXNzaWduIHBvaW50ZXIgYWx3YXlzLCBzaW5jZSBwUG5zRGF0YSBpcyBub3QgcGVyc2lzdGVudCBkYXRhICovCiAgIHBQbnNEYXRhLT5wUG5zSW50ZXJDaGFubmVsRGF0YSA9IHBQbnNJbnRlckNoYW5uZWxEYXRhOwogICBwUG5zRGF0YS0+UG5zQWN0aXZlID0gMDsKICAgcFBuc0RhdGEtPkN1cnJlbnRFbmVyZ3kgPSAwOwogCi0gIEZES21lbWNsZWFyKHBQbnNEYXRhLT5wbnNVc2VkLCg4KjE2KSpzaXplb2YoVUNIQVIpKTsKLSAgRkRLbWVtY2xlYXIocFBuc0ludGVyQ2hhbm5lbERhdGEtPmNvcnJlbGF0ZWQsKDgqMTYpKnNpemVvZihVQ0hBUikpOworICBGREttZW1jbGVhcihwUG5zRGF0YS0+cG5zVXNlZCwgKDggKiAxNikgKiBzaXplb2YoVUNIQVIpKTsKKyAgRkRLbWVtY2xlYXIocFBuc0ludGVyQ2hhbm5lbERhdGEtPmNvcnJlbGF0ZWQsICg4ICogMTYpICogc2l6ZW9mKFVDSEFSKSk7CiB9CiAKIC8qIQotICBcYnJpZWYgSW5pdGlhbGl6ZSBQTlMgZGF0YQorICBcYnJpZWYgVXBkYXRlIFBOUyBub2lzZSBnZW5lcmF0b3Igc3RhdGUuCiAKLSAgVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBQTlMgZGF0YQorICBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgc2VlZCBmb3IgUE5TIG5vaXNlIGdlbmVyYXRpb24uCisgIEl0IGNhbiBiZSB1c2VkIHRvIGxpbmsgdHdvIG9yIG1vcmUgY2hhbm5lbHMgaW4gdGVybXMgb2YgUE5TLgogKi8KLXZvaWQgQ1Buc19Jbml0UG5zKAotICAgIENQbnNEYXRhICpwUG5zRGF0YSwKLSAgICBDUG5zSW50ZXJDaGFubmVsRGF0YSAqcFBuc0ludGVyQ2hhbm5lbERhdGEsCi0gICAgSU5UKiBjdXJyZW50U2VlZCwgSU5UKiByYW5kb21TZWVkKQotewotICAvKiBzYXZlIHBvaW50ZXIgdG8gaW50ZXIgY2hhbm5lbCBkYXRhICovCi0gIHBQbnNEYXRhLT5wUG5zSW50ZXJDaGFubmVsRGF0YSA9IHBQbnNJbnRlckNoYW5uZWxEYXRhOwotCit2b2lkIENQbnNfVXBkYXRlTm9pc2VTdGF0ZShDUG5zRGF0YSAqcFBuc0RhdGEsIElOVCAqY3VycmVudFNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnJhbmRvbVNlZWQpIHsKICAgLyogdXNlIHBvaW50ZXIgYmVjYXVzZSBzZWVkIGhhcyB0byBiZQogICAgICBzYW1lLCBsZWZ0IGFuZCByaWdodCBjaGFubmVsICEgKi8KICAgcFBuc0RhdGEtPmN1cnJlbnRTZWVkID0gY3VycmVudFNlZWQ7Ci0gIHBQbnNEYXRhLT5yYW5kb21TZWVkICA9IHJhbmRvbVNlZWQ7CisgIHBQbnNEYXRhLT5yYW5kb21TZWVkID0gcmFuZG9tU2VlZDsKIH0KIAogLyohCkBAIC0xNDgsMTEgKzE1Miw4IEBACiAKICAgXHJldHVybiAgUE5TIHVzZWQKICovCi1pbnQgQ1Buc19Jc1Buc1VzZWQgKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFuZCkKLXsKLSAgdW5zaWduZWQgcG5zX2JhbmQgPSBncm91cCoxNitiYW5kOworaW50IENQbnNfSXNQbnNVc2VkKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwgY29uc3QgaW50IGdyb3VwLCBjb25zdCBpbnQgYmFuZCkgeworICB1bnNpZ25lZCBwbnNfYmFuZCA9IGdyb3VwICogMTYgKyBiYW5kOwogCiAgIHJldHVybiBwUG5zRGF0YS0+cG5zVXNlZFtwbnNfYmFuZF0gJiAoVUNIQVIpMTsKIH0KQEAgLTE2MiwxMyArMTYzLDEwIEBACiAKICAgVGhlIGZ1bmN0aW9uIGFjdGl2YXRlcyB0aGUgbm9pc2UgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgY2hhbm5lbCBwYWlyCiAqLwotdm9pZCBDUG5zX1NldENvcnJlbGF0aW9uKENQbnNEYXRhICpwUG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG91dG9mcGhhc2UpCi17Cit2b2lkIENQbnNfU2V0Q29ycmVsYXRpb24oQ1Buc0RhdGEgKnBQbnNEYXRhLCBjb25zdCBpbnQgZ3JvdXAsIGNvbnN0IGludCBiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdXRvZnBoYXNlKSB7CiAgIENQbnNJbnRlckNoYW5uZWxEYXRhICpwSW50ZXJDaGFubmVsRGF0YSA9IHBQbnNEYXRhLT5wUG5zSW50ZXJDaGFubmVsRGF0YTsKLSAgdW5zaWduZWQgcG5zX2JhbmQgPSBncm91cCoxNitiYW5kOworICB1bnNpZ25lZCBwbnNfYmFuZCA9IGdyb3VwICogMTYgKyBiYW5kOwogCiAgIHBJbnRlckNoYW5uZWxEYXRhLT5jb3JyZWxhdGVkW3Buc19iYW5kXSA9IChvdXRvZnBoYXNlKSA/IDMgOiAxOwogfQpAQCAtMTgxLDEzICsxNzksMTAgQEAKIAogICBccmV0dXJuICBQTlMgaXMgY29ycmVsYXRlZAogKi8KLXN0YXRpYwotaW50IENQbnNfSXNDb3JyZWxhdGVkKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJhbmQpCi17CitzdGF0aWMgaW50IENQbnNfSXNDb3JyZWxhdGVkKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwgY29uc3QgaW50IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFuZCkgewogICBDUG5zSW50ZXJDaGFubmVsRGF0YSAqcEludGVyQ2hhbm5lbERhdGEgPSBwUG5zRGF0YS0+cFBuc0ludGVyQ2hhbm5lbERhdGE7Ci0gIHVuc2lnbmVkIHBuc19iYW5kID0gZ3JvdXAqMTYrYmFuZDsKKyAgdW5zaWduZWQgcG5zX2JhbmQgPSBncm91cCAqIDE2ICsgYmFuZDsKIAogICByZXR1cm4gKHBJbnRlckNoYW5uZWxEYXRhLT5jb3JyZWxhdGVkW3Buc19iYW5kXSAmIDB4MDEpID8gMSA6IDA7CiB9CkBAIC0yMDAsMTMgKzE5NSwxMCBAQAogCiAgIFxyZXR1cm4gIFBOUyBpcyBvdXQtb2YtcGhhc2UKICovCi1zdGF0aWMKLWludCBDUG5zX0lzT3V0T2ZQaGFzZShjb25zdCBDUG5zRGF0YSAqcFBuc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYW5kKQoteworc3RhdGljIGludCBDUG5zX0lzT3V0T2ZQaGFzZShjb25zdCBDUG5zRGF0YSAqcFBuc0RhdGEsIGNvbnN0IGludCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJhbmQpIHsKICAgQ1Buc0ludGVyQ2hhbm5lbERhdGEgKnBJbnRlckNoYW5uZWxEYXRhID0gcFBuc0RhdGEtPnBQbnNJbnRlckNoYW5uZWxEYXRhOwotICB1bnNpZ25lZCBwbnNfYmFuZCA9IGdyb3VwKjE2K2JhbmQ7CisgIHVuc2lnbmVkIHBuc19iYW5kID0gZ3JvdXAgKiAxNiArIGJhbmQ7CiAKICAgcmV0dXJuIChwSW50ZXJDaGFubmVsRGF0YS0+Y29ycmVsYXRlZFtwbnNfYmFuZF0gJiAweDAyKSA/IDEgOiAwOwogfQpAQCAtMjE2LDM2ICsyMDgsMzAgQEAKIAogICBUaGUgZnVuY3Rpb24gcmVhZHMgdGhlIFBOUyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiaXRzdHJlYW0KICovCi12b2lkIENQbnNfUmVhZCAoQ1Buc0RhdGEgKnBQbnNEYXRhLAotICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICAgICAgICAgIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gKmhjYiwKLSAgICAgICAgICAgICAgICBTSE9SVCAqcFNjYWxlRmFjdG9yLAotICAgICAgICAgICAgICAgIFVDSEFSIGdsb2JhbF9nYWluLAotICAgICAgICAgICAgICAgIGludCBiYW5kLAotICAgICAgICAgICAgICAgIGludCBncm91cCAvKiA9IDAgKi8pCi17Ci0gIGludCBkZWx0YSA7Ci0gIFVJTlQgcG5zX2JhbmQgPSBncm91cCoxNitiYW5kOwordm9pZCBDUG5zX1JlYWQoQ1Buc0RhdGEgKnBQbnNEYXRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gKmhjYiwgU0hPUlQgKnBTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgIFVDSEFSIGdsb2JhbF9nYWluLCBpbnQgYmFuZCwgaW50IGdyb3VwIC8qID0gMCAqLykgeworICBpbnQgZGVsdGE7CisgIFVJTlQgcG5zX2JhbmQgPSBncm91cCAqIDE2ICsgYmFuZDsKIAogICBpZiAocFBuc0RhdGEtPlBuc0FjdGl2ZSkgewogICAgIC8qIE5leHQgUE5TIGJhbmQgY2FzZSAqLwotICAgIGRlbHRhID0gQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkIChicywgaGNiKSAtIDYwOworICAgIGRlbHRhID0gQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkKGJzLCBoY2IpIC0gNjA7CiAgIH0gZWxzZSB7CiAgICAgLyogRmlyc3QgUE5TIGJhbmQgY2FzZSAqLwotICAgIGludCBub2lzZVN0YXJ0VmFsdWUgPSBGREtyZWFkQml0cyhicyw5KTsKKyAgICBpbnQgbm9pc2VTdGFydFZhbHVlID0gRkRLcmVhZEJpdHMoYnMsIDkpOwogCi0gICAgZGVsdGEgPSBub2lzZVN0YXJ0VmFsdWUgLSAyNTYgOworICAgIGRlbHRhID0gbm9pc2VTdGFydFZhbHVlIC0gMjU2OwogICAgIHBQbnNEYXRhLT5QbnNBY3RpdmUgPSAxOwogICAgIHBQbnNEYXRhLT5DdXJyZW50RW5lcmd5ID0gZ2xvYmFsX2dhaW4gLSBOT0lTRV9PRkZTRVQ7CiAgIH0KIAotICBwUG5zRGF0YS0+Q3VycmVudEVuZXJneSArPSBkZWx0YSA7CisgIHBQbnNEYXRhLT5DdXJyZW50RW5lcmd5ICs9IGRlbHRhOwogICBwU2NhbGVGYWN0b3JbcG5zX2JhbmRdID0gcFBuc0RhdGEtPkN1cnJlbnRFbmVyZ3k7CiAKICAgcFBuc0RhdGEtPnBuc1VzZWRbcG5zX2JhbmRdID0gMTsKIH0KIAotCiAvKioKICAqIFxicmllZiBHZW5lcmF0ZSBhIHZlY3RvciBvZiBub2lzZSBvZiBnaXZlbiBsZW5ndGguIFRoZSBub2lzZSB2YWx1ZXMgYXJlCiAgKiAgICAgICAgc2NhbGVkIGluIG9yZGVyIHRvIHlpZWxkIGEgbm9pc2UgZW5lcmd5IG9mIDEuMApAQCAtMjU0LDMyICsyNDAsMjkgQEAKICAqIFxwYXJhbSBwUmFuZG9tU3RhdGUgcG9pbnRlciB0byB0aGUgc3RhdGUgb2YgdGhlIHJhbmRvbSBnZW5lcmF0b3IgYmVpbmcgdXNlZC4KICAqIFxyZXR1cm4gZXhwb25lbnQgb2YgZ2VuZXJhdGVkIG5vaXNlIHZlY3Rvci4KICAqLwotc3RhdGljIGludCBHZW5lcmF0ZVJhbmRvbVZlY3RvciAoRklYUF9EQkwgKlJFU1RSSUNUIHNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwUmFuZG9tU3RhdGUpCi17CitzdGF0aWMgaW50IEdlbmVyYXRlUmFuZG9tVmVjdG9yKEZJWFBfREJMICpSRVNUUklDVCBzcGVjLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwUmFuZG9tU3RhdGUpIHsKICAgaW50IGksIGludk5yZ19lID0gMCwgbnJnX2UgPSAwOwotICBGSVhQX0RCTCBpbnZOcmdfbSwgbnJnX20gPSBGTDJGWENPTlNUX0RCTCgwLjBmKSA7CisgIEZJWFBfREJMIGludk5yZ19tLCBucmdfbSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRyID0gc3BlYzsKICAgaW50IHJhbmRvbVN0YXRlID0gKnBSYW5kb21TdGF0ZTsKIAogI2RlZmluZSBHRU5fTk9JU0VfTlJHX1NDQUxFIDcKIAogICAvKiBHZW5lcmF0ZSBub2lzZSBhbmQgY2FsY3VsYXRlIGVuZXJneS4gKi8KLSAgZm9yIChpPTA7IGk8c2l6ZTsgaSsrKQotICB7Ci0gICAgcmFuZG9tU3RhdGUgPSAoMTY2NDUyNUwgKiByYW5kb21TdGF0ZSkgKyAxMDEzOTA0MjIzTDsgLy8gTnVtZXJpY2FsIFJlY2lwZXMKLSAgICBucmdfbSA9IGZQb3cyQWRkRGl2MihucmdfbSwgKEZJWFBfREJMKXJhbmRvbVN0YXRlPj5HRU5fTk9JU0VfTlJHX1NDQUxFKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIHJhbmRvbVN0YXRlID0KKyAgICAgICAgKCgoSU5UNjQpMTY2NDUyNSAqIHJhbmRvbVN0YXRlKSArIChJTlQ2NCkxMDEzOTA0MjIzKSAmIDB4RkZGRkZGRkY7CisgICAgbnJnX20gPSBmUG93MkFkZERpdjIobnJnX20sIChGSVhQX0RCTClyYW5kb21TdGF0ZSA+PiBHRU5fTk9JU0VfTlJHX1NDQUxFKTsKICAgICAqcHRyKysgPSAoRklYUF9EQkwpcmFuZG9tU3RhdGU7CiAgIH0KLSAgbnJnX2UgPSBHRU5fTk9JU0VfTlJHX1NDQUxFKjIgKyAxOworICBucmdfZSA9IEdFTl9OT0lTRV9OUkdfU0NBTEUgKiAyICsgMTsKIAogICAvKiB3ZWlnaHQgbm9pc2Ugd2l0aCA9IDEgLyBzcXJ0X25yZzsgKi8KLSAgaW52TnJnX20gPSBpbnZTcXJ0Tm9ybTIobnJnX208PDEsICZpbnZOcmdfZSk7Ci0gIGludk5yZ19lICs9IC0oKG5yZ19lLTEpPj4xKTsKKyAgaW52TnJnX20gPSBpbnZTcXJ0Tm9ybTIobnJnX20gPDwgMSwgJmludk5yZ19lKTsKKyAgaW52TnJnX2UgKz0gLSgobnJnX2UgLSAxKSA+PiAxKTsKIAotICBmb3IgKGk9c2l6ZTsgaS0tOyApCi0gIHsKKyAgZm9yIChpID0gc2l6ZTsgaS0tOykgewogICAgIHNwZWNbaV0gPSBmTXVsdChzcGVjW2ldLCBpbnZOcmdfbSk7CiAgIH0KIApAQCAtMjg5LDggKzI3Miw4IEBACiAgIHJldHVybiBpbnZOcmdfZTsKIH0KIAotc3RhdGljIHZvaWQgU2NhbGVCYW5kIChGSVhQX0RCTCAqUkVTVFJJQ1Qgc3BlYywgaW50IHNpemUsIGludCBzY2FsZUZhY3RvciwgaW50IHNwZWNTY2FsZSwgaW50IG5vaXNlX2UsIGludCBvdXRfb2ZfcGhhc2UpCi17CitzdGF0aWMgdm9pZCBTY2FsZUJhbmQoRklYUF9EQkwgKlJFU1RSSUNUIHNwZWMsIGludCBzaXplLCBpbnQgc2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHNwZWNTY2FsZSwgaW50IG5vaXNlX2UsIGludCBvdXRfb2ZfcGhhc2UpIHsKICAgaW50IGksIHNoaWZ0LCBzZkV4cG9uZW50OwogICBGSVhQX0RCTCBzZk1hdGlzc2E7CiAKQEAgLTMwOCwyMCArMjkxLDE5IEBACiAgIHNoaWZ0ID0gc2ZFeHBvbmVudCAtIHNwZWNTY2FsZSArIDEgKyBub2lzZV9lOwogCiAgIC8qIEFwcGx5IGdhaW4gdG8gbm9pc2UgdmFsdWVzICovCi0gIGlmIChzaGlmdD49MCkgewotICAgIHNoaWZ0ID0gZml4TWluKCBzaGlmdCwgREZSQUNUX0JJVFMtMSApOwotICAgIGZvciAoaSA9IHNpemUgOyBpLS0gIT0gMDsgKSB7Ci0gICAgICBzcGVjIFtpXSA9IGZNdWx0RGl2MiAoc3BlYyBbaV0sIHNmTWF0aXNzYSkgPDwgc2hpZnQ7CisgIGlmIChzaGlmdCA+PSAwKSB7CisgICAgc2hpZnQgPSBmaXhNaW4oc2hpZnQsIERGUkFDVF9CSVRTIC0gMSk7CisgICAgZm9yIChpID0gc2l6ZTsgaS0tICE9IDA7KSB7CisgICAgICBzcGVjW2ldID0gZk11bHREaXYyKHNwZWNbaV0sIHNmTWF0aXNzYSkgPDwgc2hpZnQ7CiAgICAgfQogICB9IGVsc2UgewotICAgIHNoaWZ0ID0gZml4TWluKCAtc2hpZnQsIERGUkFDVF9CSVRTLTEgKTsKLSAgICBmb3IgKGkgPSBzaXplIDsgaS0tICE9IDA7ICkgewotICAgICAgc3BlYyBbaV0gPSBmTXVsdERpdjIgKHNwZWMgW2ldLCBzZk1hdGlzc2EpID4+IHNoaWZ0OworICAgIHNoaWZ0ID0gZml4TWluKC1zaGlmdCwgREZSQUNUX0JJVFMgLSAxKTsKKyAgICBmb3IgKGkgPSBzaXplOyBpLS0gIT0gMDspIHsKKyAgICAgIHNwZWNbaV0gPSBmTXVsdERpdjIoc3BlY1tpXSwgc2ZNYXRpc3NhKSA+PiBzaGlmdDsKICAgICB9CiAgIH0KIH0KIAotCiAvKiEKICAgXGJyaWVmIEFwcGx5IFBOUwogCkBAIC0zMjksNTEgKzMxMSw0OCBAQAogICBmbGFnZ2VkIGFzIG5vaXN5IGJhbmRzCiAKICovCi12b2lkIENQbnNfQXBwbHkgKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLAotICAgICAgICAgICAgICAgICBTUEVDVFJBTF9QVFIgcFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAgICAqcFNwZWNTY2FsZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgICAgKnBTY2FsZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hhbm5lbCkKLXsKK3ZvaWQgQ1Buc19BcHBseShjb25zdCBDUG5zRGF0YSAqcFBuc0RhdGEsIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywKKyAgICAgICAgICAgICAgICBTUEVDVFJBTF9QVFIgcFNwZWN0cnVtLCBjb25zdCBTSE9SVCAqcFNwZWNTY2FsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAqcFNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoLCBjb25zdCBpbnQgY2hhbm5lbCkgewogICBpZiAocFBuc0RhdGEtPlBuc0FjdGl2ZSkgewotICAgIGNvbnN0IHNob3J0ICpCYW5kT2Zmc2V0cyA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMocEljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgICBjb25zdCBzaG9ydCAqQmFuZE9mZnNldHMgPQorICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKHBJY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7CiAKICAgICBpbnQgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKHBJY3NJbmZvKTsKIAotICAgIGZvciAoaW50IHdpbmRvdyA9IDAsIGdyb3VwID0gMDsgZ3JvdXAgPCBHZXRXaW5kb3dHcm91cHMocEljc0luZm8pOyBncm91cCsrKSB7Ci0gICAgICBmb3IgKGludCBncm91cHdpbiA9IDA7IGdyb3Vwd2luIDwgR2V0V2luZG93R3JvdXBMZW5ndGgocEljc0luZm8sIGdyb3VwKTsgZ3JvdXB3aW4rKywgd2luZG93KyspIHsKKyAgICBmb3IgKGludCB3aW5kb3cgPSAwLCBncm91cCA9IDA7IGdyb3VwIDwgR2V0V2luZG93R3JvdXBzKHBJY3NJbmZvKTsKKyAgICAgICAgIGdyb3VwKyspIHsKKyAgICAgIGZvciAoaW50IGdyb3Vwd2luID0gMDsgZ3JvdXB3aW4gPCBHZXRXaW5kb3dHcm91cExlbmd0aChwSWNzSW5mbywgZ3JvdXApOworICAgICAgICAgICBncm91cHdpbisrLCB3aW5kb3crKykgewogICAgICAgICBGSVhQX0RCTCAqc3BlY3RydW0gPSBTUEVDKHBTcGVjdHJ1bSwgd2luZG93LCBncmFudWxlTGVuZ3RoKTsKIAotICAgICAgICBmb3IgKGludCBiYW5kID0gMCA7IGJhbmQgPCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewotICAgICAgICAgIGlmIChDUG5zX0lzUG5zVXNlZCAocFBuc0RhdGEsIGdyb3VwLCBiYW5kKSkgewotICAgICAgICAgICAgVUlOVCBwbnNfYmFuZCA9IGdyb3VwKjE2K2JhbmQ7CisgICAgICAgIGZvciAoaW50IGJhbmQgPSAwOyBiYW5kIDwgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgICAgICBpZiAoQ1Buc19Jc1Buc1VzZWQocFBuc0RhdGEsIGdyb3VwLCBiYW5kKSkgeworICAgICAgICAgICAgVUlOVCBwbnNfYmFuZCA9IHdpbmRvdyAqIDE2ICsgYmFuZDsKIAotICAgICAgICAgICAgaW50IGJhbmRXaWR0aCA9IEJhbmRPZmZzZXRzIFtiYW5kICsgMV0gLSBCYW5kT2Zmc2V0cyBbYmFuZF0gOworICAgICAgICAgICAgaW50IGJhbmRXaWR0aCA9IEJhbmRPZmZzZXRzW2JhbmQgKyAxXSAtIEJhbmRPZmZzZXRzW2JhbmRdOwogICAgICAgICAgICAgaW50IG5vaXNlX2U7CiAKICAgICAgICAgICAgIEZES19BU1NFUlQoYmFuZFdpZHRoID49IDApOwogCi0gICAgICAgICAgICBpZiAoY2hhbm5lbCA+IDAgJiYgQ1Buc19Jc0NvcnJlbGF0ZWQocFBuc0RhdGEsIGdyb3VwLCBiYW5kKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbm9pc2VfZSA9IEdlbmVyYXRlUmFuZG9tVmVjdG9yIChzcGVjdHJ1bSArIEJhbmRPZmZzZXRzIFtiYW5kXSwgYmFuZFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQbnNEYXRhLT5yYW5kb21TZWVkIFtwbnNfYmFuZF0pIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcFBuc0RhdGEtPnJhbmRvbVNlZWQgW3Buc19iYW5kXSA9ICpwUG5zRGF0YS0+Y3VycmVudFNlZWQgOworICAgICAgICAgICAgaWYgKGNoYW5uZWwgPiAwICYmIENQbnNfSXNDb3JyZWxhdGVkKHBQbnNEYXRhLCBncm91cCwgYmFuZCkpIHsKKyAgICAgICAgICAgICAgbm9pc2VfZSA9CisgICAgICAgICAgICAgICAgICBHZW5lcmF0ZVJhbmRvbVZlY3RvcihzcGVjdHJ1bSArIEJhbmRPZmZzZXRzW2JhbmRdLCBiYW5kV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBuc0RhdGEtPnJhbmRvbVNlZWRbcG5zX2JhbmRdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHBQbnNEYXRhLT5yYW5kb21TZWVkW3Buc19iYW5kXSA9ICpwUG5zRGF0YS0+Y3VycmVudFNlZWQ7CiAKLSAgICAgICAgICAgICAgbm9pc2VfZSA9IEdlbmVyYXRlUmFuZG9tVmVjdG9yIChzcGVjdHJ1bSArIEJhbmRPZmZzZXRzIFtiYW5kXSwgYmFuZFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBuc0RhdGEtPmN1cnJlbnRTZWVkKSA7CisgICAgICAgICAgICAgIG5vaXNlX2UgPSBHZW5lcmF0ZVJhbmRvbVZlY3RvcihzcGVjdHJ1bSArIEJhbmRPZmZzZXRzW2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZFdpZHRoLCBwUG5zRGF0YS0+Y3VycmVudFNlZWQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgb3V0T2ZQaGFzZSAgPSBDUG5zX0lzT3V0T2ZQaGFzZSAocFBuc0RhdGEsIGdyb3VwLCBiYW5kKTsKKyAgICAgICAgICAgIGludCBvdXRPZlBoYXNlID0gQ1Buc19Jc091dE9mUGhhc2UocFBuc0RhdGEsIGdyb3VwLCBiYW5kKTsKIAotICAgICAgICAgICAgU2NhbGVCYW5kIChzcGVjdHJ1bSArIEJhbmRPZmZzZXRzIFtiYW5kXSwgYmFuZFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICBwU2NhbGVGYWN0b3JbcG5zX2JhbmRdLAotICAgICAgICAgICAgICAgICAgICAgICBwU3BlY1NjYWxlW3dpbmRvd10sIG5vaXNlX2UsIG91dE9mUGhhc2UpIDsKKyAgICAgICAgICAgIFNjYWxlQmFuZChzcGVjdHJ1bSArIEJhbmRPZmZzZXRzW2JhbmRdLCBiYW5kV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgcFNjYWxlRmFjdG9yW2dyb3VwICogMTYgKyBiYW5kXSwgcFNwZWNTY2FsZVt3aW5kb3ddLAorICAgICAgICAgICAgICAgICAgICAgIG5vaXNlX2UsIG91dE9mUGhhc2UpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfcG5zLmggYi9saWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuaAppbmRleCBmYzliZGNiLi40NWNkOTg5IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuaAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyMiArOTAsMjIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IHBlcmNlcHR1YWwgbm9pc2Ugc3Vic3RpdHV0aW9uIHRvb2wKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBQTlNfSAotI2RlZmluZSBQTlNfSAorI2lmbmRlZiBBQUNERUNfUE5TX0gKKyNkZWZpbmUgQUFDREVDX1BOU19ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKLQotI2RlZmluZSBOT19PRkJBTkRTICgoOCoxNikpCisjZGVmaW5lIE5PX09GQkFORFMgKCg4ICogMTYpKQogCiB0eXBlZGVmIHN0cnVjdCB7CiAgIFVDSEFSIGNvcnJlbGF0ZWRbTk9fT0ZCQU5EU107CkBAIC0xMDIsMTkgKzExMywxNyBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgIENQbnNJbnRlckNoYW5uZWxEYXRhICpwUG5zSW50ZXJDaGFubmVsRGF0YTsKLSAgVUNIQVIgIHBuc1VzZWRbTk9fT0ZCQU5EU107Ci0gIGludCAgICBDdXJyZW50RW5lcmd5OwotICBVQ0hBUiAgUG5zQWN0aXZlOwotICBJTlQgICAqY3VycmVudFNlZWQ7Ci0gIElOVCAgICpyYW5kb21TZWVkOworICBVQ0hBUiBwbnNVc2VkW05PX09GQkFORFNdOworICBpbnQgQ3VycmVudEVuZXJneTsKKyAgVUNIQVIgUG5zQWN0aXZlOworICBJTlQgKmN1cnJlbnRTZWVkOworICBJTlQgKnJhbmRvbVNlZWQ7CiB9IENQbnNEYXRhOwogCi12b2lkIENQbnNfSW5pdFBucyAoIENQbnNEYXRhICpwUG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgQ1Buc0ludGVyQ2hhbm5lbERhdGEgKnBQbnNJbnRlckNoYW5uZWxEYXRhLAotICAgICAgICAgICAgICAgICAgICBJTlQqIGN1cnJlbnRTZWVkLAotICAgICAgICAgICAgICAgICAgICBJTlQqIHJhbmRvbVNlZWQgKTsKK3ZvaWQgQ1Buc19VcGRhdGVOb2lzZVN0YXRlKENQbnNEYXRhICpwUG5zRGF0YSwgSU5UICpjdXJyZW50U2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcmFuZG9tU2VlZCk7CiAKLXZvaWQgQ1Buc19SZXNldERhdGEgKCBDUG5zRGF0YSAqcFBuc0RhdGEsIENQbnNJbnRlckNoYW5uZWxEYXRhICpwUG5zSW50ZXJDaGFubmVsRGF0YSApOwordm9pZCBDUG5zX1Jlc2V0RGF0YShDUG5zRGF0YSAqcFBuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgIENQbnNJbnRlckNoYW5uZWxEYXRhICpwUG5zSW50ZXJDaGFubmVsRGF0YSk7CiAKLQotI2VuZGlmIC8qICNpZm5kZWYgUE5TX0ggKi8KKyNlbmRpZiAvKiAjaWZuZGVmIEFBQ0RFQ19QTlNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfdG5zLmNwcCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Rucy5jcHAKaW5kZXggMzUyZjA0YS4uZmIzZmUzMyAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfdG5zLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY190bnMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIxICs5MCwyNCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogdGVtcG9yYWwgbm9pc2Ugc2hhcGluZyB0b29sCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJhYWNkZWNfdG5zLmgiCiAjaW5jbHVkZSAiYWFjX3JvbS5oIgogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKICNpbmNsdWRlICJjaGFubmVsaW5mby5oIgogCisjaW5jbHVkZSAiRkRLX2xwYy5oIgogCisjZGVmaW5lIFROU19NQVhJTVVNX09SREVSX0FBQyAxMgogCiAvKiEKICAgXGJyaWVmIFJlc2V0IHRucyBkYXRhCkBAIC0xMDIsMTkgKzExNiwyMCBAQAogCiAgIFxyZXR1cm4gIG5vbmUKICovCi12b2lkIENUbnNfUmVzZXQoQ1Ruc0RhdGEgKnBUbnNEYXRhKQotewordm9pZCBDVG5zX1Jlc2V0KENUbnNEYXRhICpwVG5zRGF0YSkgewogICAvKiBOb3RlOiB0aGUgZm9sbG93aW5nIEZES21lbWNsZWFyIHNob3VsZCBub3QgYmUgcmVxdWlyZWQuICovCi0gIEZES21lbWNsZWFyKHBUbnNEYXRhLT5GaWx0ZXIsIFROU19NQVhfV0lORE9XUypUTlNfTUFYSU1VTV9GSUxURVJTKnNpemVvZihDRmlsdGVyKSk7Ci0gIEZES21lbWNsZWFyKHBUbnNEYXRhLT5OdW1iZXJPZkZpbHRlcnMsIFROU19NQVhfV0lORE9XUypzaXplb2YoVUNIQVIpKTsKKyAgRkRLbWVtY2xlYXIocFRuc0RhdGEtPkZpbHRlciwKKyAgICAgICAgICAgICAgVE5TX01BWF9XSU5ET1dTICogVE5TX01BWElNVU1fRklMVEVSUyAqIHNpemVvZihDRmlsdGVyKSk7CisgIEZES21lbWNsZWFyKHBUbnNEYXRhLT5OdW1iZXJPZkZpbHRlcnMsIFROU19NQVhfV0lORE9XUyAqIHNpemVvZihVQ0hBUikpOwogICBwVG5zRGF0YS0+RGF0YVByZXNlbnQgPSAwOwogICBwVG5zRGF0YS0+QWN0aXZlID0gMDsKIH0KIAotdm9pZCBDVG5zX1JlYWREYXRhUHJlc2VudEZsYWcoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsICAgIC8qITwgcG9pbnRlciB0byBiaXRzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUbnNEYXRhICpwVG5zRGF0YSkgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYWFjIGRlY29kZXIgY2hhbm5lbCBpbmZvICovCit2b2lkIENUbnNfUmVhZERhdGFQcmVzZW50RmxhZygKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgLyohPCBwb2ludGVyIHRvIGJpdHN0cmVhbSAqLworICAgIENUbnNEYXRhICpwVG5zRGF0YSkgICAgICAvKiE8IHBvaW50ZXIgdG8gYWFjIGRlY29kZXIgY2hhbm5lbCBpbmZvICovCiB7Ci0gIHBUbnNEYXRhLT5EYXRhUHJlc2VudCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSk7CisgIHBUbnNEYXRhLT5EYXRhUHJlc2VudCA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMSk7CiB9CiAKIC8qIQpAQCAtMTI1LDgzICsxNDAsODkgQEAKIAogICBccmV0dXJuICBub25lCiAqLwotQUFDX0RFQ09ERVJfRVJST1IgQ1Ruc19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUbnNEYXRhICpwVG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncykKLXsKLSAgVUNIQVIgbl9maWx0LG9yZGVyOwotICBVQ0hBUiBsZW5ndGgsY29lZl9yZXMsY29lZl9jb21wcmVzczsKK0FBQ19ERUNPREVSX0VSUk9SIENUbnNfUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ1Ruc0RhdGEgKnBUbnNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywgY29uc3QgVUlOVCBmbGFncykgeworICBVQ0hBUiBuX2ZpbHQsIG9yZGVyOworICBVQ0hBUiBsZW5ndGgsIGNvZWZfcmVzLCBjb2VmX2NvbXByZXNzOwogICBVQ0hBUiB3aW5kb3c7Ci0gIFVDSEFSIHdpbnNfcGVyX2ZyYW1lID0gR2V0V2luZG93c1BlckZyYW1lKHBJY3NJbmZvKTsKLSAgVUNIQVIgaXNMb25nRmxhZyA9IElzTG9uZ0Jsb2NrKHBJY3NJbmZvKTsKKyAgVUNIQVIgd2luc19wZXJfZnJhbWU7CisgIFVDSEFSIGlzTG9uZ0ZsYWc7CisgIFVDSEFSIHN0YXJ0X3dpbmRvdzsKICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOwogCiAgIGlmICghcFRuc0RhdGEtPkRhdGFQcmVzZW50KSB7CiAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwogICB9CiAKLSAgZm9yICh3aW5kb3cgPSAwOyB3aW5kb3cgPCB3aW5zX3Blcl9mcmFtZTsgd2luZG93KyspCiAgIHsKLSAgICBwVG5zRGF0YS0+TnVtYmVyT2ZGaWx0ZXJzW3dpbmRvd10gPSBuX2ZpbHQgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLCBpc0xvbmdGbGFnID8gMiA6IDEpOworICAgIHN0YXJ0X3dpbmRvdyA9IDA7CisgICAgd2luc19wZXJfZnJhbWUgPSBHZXRXaW5kb3dzUGVyRnJhbWUocEljc0luZm8pOworICAgIGlzTG9uZ0ZsYWcgPSBJc0xvbmdCbG9jayhwSWNzSW5mbyk7CisgIH0KIAotICAgIGlmIChwVG5zRGF0YS0+TnVtYmVyT2ZGaWx0ZXJzW3dpbmRvd10gPiBUTlNfTUFYSU1VTV9GSUxURVJTKXsKLSAgICAgICAgcFRuc0RhdGEtPk51bWJlck9mRmlsdGVyc1t3aW5kb3ddID0gbl9maWx0ID0gVE5TX01BWElNVU1fRklMVEVSUzsKLSAgICB9CisgIHBUbnNEYXRhLT5HYWluTGQgPSAwOwogCi0gICAgaWYgKG5fZmlsdCkKLSAgICB7CisgIGZvciAod2luZG93ID0gc3RhcnRfd2luZG93OyB3aW5kb3cgPCB3aW5zX3Blcl9mcmFtZTsgd2luZG93KyspIHsKKyAgICBwVG5zRGF0YS0+TnVtYmVyT2ZGaWx0ZXJzW3dpbmRvd10gPSBuX2ZpbHQgPQorICAgICAgICAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIGlzTG9uZ0ZsYWcgPyAyIDogMSk7CisKKyAgICBpZiAobl9maWx0KSB7CiAgICAgICBpbnQgaW5kZXg7CiAgICAgICBVQ0hBUiBuZXh0c3RvcGJhbmQ7CiAKLSAgICAgIGNvZWZfcmVzID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywxKTsKKyAgICAgIGNvZWZfcmVzID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKTsKIAogICAgICAgbmV4dHN0b3BiYW5kID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RvdGFsKHBJY3NJbmZvKTsKIAotICAgICAgZm9yIChpbmRleD0wOyBpbmRleCA8IG5fZmlsdDsgaW5kZXgrKykKLSAgICAgIHsKKyAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5fZmlsdDsgaW5kZXgrKykgewogICAgICAgICBDRmlsdGVyICpmaWx0ZXIgPSAmcFRuc0RhdGEtPkZpbHRlclt3aW5kb3ddW2luZGV4XTsKIAogICAgICAgICBsZW5ndGggPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIGlzTG9uZ0ZsYWcgPyA2IDogNCk7CiAKLSAgICAgICAgaWYgKGxlbmd0aCA+IG5leHRzdG9wYmFuZCl7CisgICAgICAgIGlmIChsZW5ndGggPiBuZXh0c3RvcGJhbmQpIHsKICAgICAgICAgICBsZW5ndGggPSBuZXh0c3RvcGJhbmQ7CiAgICAgICAgIH0KIAogICAgICAgICBmaWx0ZXItPlN0YXJ0QmFuZCA9IG5leHRzdG9wYmFuZCAtIGxlbmd0aDsKLSAgICAgICAgZmlsdGVyLT5TdG9wQmFuZCAgPSBuZXh0c3RvcGJhbmQ7CisgICAgICAgIGZpbHRlci0+U3RvcEJhbmQgPSBuZXh0c3RvcGJhbmQ7CiAgICAgICAgIG5leHRzdG9wYmFuZCA9IGZpbHRlci0+U3RhcnRCYW5kOwogCi0gICAgICAgIHsKLSAgICAgICAgICBmaWx0ZXItPk9yZGVyID0gb3JkZXIgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLCBpc0xvbmdGbGFnID8gNSA6IDMpOworICAgICAgICBpZiAoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkgeworICAgICAgICAgIC8qIG1heChPcmRlcikgPSAxNSAobG9uZyksIDcgKHNob3J0KSAqLworICAgICAgICAgIGZpbHRlci0+T3JkZXIgPSBvcmRlciA9IChVQ0hBUilGREtyZWFkQml0cyhicywgaXNMb25nRmxhZyA/IDQgOiAzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmaWx0ZXItPk9yZGVyID0gb3JkZXIgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIGlzTG9uZ0ZsYWcgPyA1IDogMyk7CisKKyAgICAgICAgICBpZiAoZmlsdGVyLT5PcmRlciA+IFROU19NQVhJTVVNX09SREVSKSB7CisgICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfVE5TX1JFQURfRVJST1I7CisgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGZpbHRlci0+T3JkZXIgPiBUTlNfTUFYSU1VTV9PUkRFUil7Ci0gICAgICAgICAgZmlsdGVyLT5PcmRlciA9IG9yZGVyID0gVE5TX01BWElNVU1fT1JERVI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3JkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBVQ0hBUiBjb2VmLHNfbWFzazsKKyAgICAgICAgRkRLX0FTU0VSVChvcmRlciA8PQorICAgICAgICAgICAgICAgICAgIFROU19NQVhJTVVNX09SREVSKTsgLyogYXZvaWQgaWxsZWdhbCBtZW1vcnkgYWNjZXNzICovCisgICAgICAgIGlmIChvcmRlcikgeworICAgICAgICAgIFVDSEFSIGNvZWYsIHNfbWFzazsKICAgICAgICAgICBVQ0hBUiBpOwogICAgICAgICAgIFNDSEFSIG5fbWFzazsKLSAgICAgICAgICBzdGF0aWMgY29uc3QgVUNIQVIgc2duX21hc2tbXSA9IHsgIDB4MiwgIDB4NCwgIDB4OCB9OwotICAgICAgICAgIHN0YXRpYyBjb25zdCBTQ0hBUiBuZWdfbWFza1tdID0geyB+MHgzLCB+MHg3LCB+MHhGIH07CiAKLSAgICAgICAgICBmaWx0ZXItPkRpcmVjdGlvbiA9IEZES3JlYWRCaXRzKGJzLDEpID8gLTEgOiAxOworICAgICAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBzZ25fbWFza1tdID0gezB4MiwgMHg0LCAweDh9OworICAgICAgICAgIHN0YXRpYyBjb25zdCBTQ0hBUiBuZWdfbWFza1tdID0ge34weDMsIH4weDcsIH4weEZ9OwogCi0gICAgICAgICAgY29lZl9jb21wcmVzcyA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSk7CisgICAgICAgICAgZmlsdGVyLT5EaXJlY3Rpb24gPSBGREtyZWFkQml0cyhicywgMSkgPyAtMSA6IDE7CisKKyAgICAgICAgICBjb2VmX2NvbXByZXNzID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKTsKIAogICAgICAgICAgIGZpbHRlci0+UmVzb2x1dGlvbiA9IGNvZWZfcmVzICsgMzsKIAogICAgICAgICAgIHNfbWFzayA9IHNnbl9tYXNrW2NvZWZfcmVzICsgMSAtIGNvZWZfY29tcHJlc3NdOwogICAgICAgICAgIG5fbWFzayA9IG5lZ19tYXNrW2NvZWZfcmVzICsgMSAtIGNvZWZfY29tcHJlc3NdOwogCi0gICAgICAgICAgZm9yIChpPTA7IGkgPCBvcmRlcjsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvZWYgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLGZpbHRlci0+UmVzb2x1dGlvbiAtIGNvZWZfY29tcHJlc3MpOworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlcjsgaSsrKSB7CisgICAgICAgICAgICBjb2VmID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCBmaWx0ZXItPlJlc29sdXRpb24gLSBjb2VmX2NvbXByZXNzKTsKICAgICAgICAgICAgIGZpbHRlci0+Q29lZmZbaV0gPSAoY29lZiAmIHNfbWFzaykgPyAoY29lZiB8IG5fbWFzaykgOiBjb2VmOwogICAgICAgICAgIH0KKyAgICAgICAgICBwVG5zRGF0YS0+R2FpbkxkID0gNDsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTIxMiwxMTUgKzIzMywzNSBAQAogICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CiAKK3ZvaWQgQ1Ruc19SZWFkRGF0YVByZXNlbnRVc2FjKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQ1Ruc0RhdGEgKnBUbnNEYXRhMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUbnNEYXRhICpwVG5zRGF0YTEsIFVDSEFSICpwdG5zX29uX2xyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLCBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBlbEZsYWdzLCBjb25zdCBpbnQgZkNvbW1vbldpbmRvdykgeworICBpbnQgY29tbW9uX3RucyA9IDA7CiAKLXN0YXRpYyB2b2lkIENUbnNfRmlsdGVyIChGSVhQX0RCTCAqc3BlYywgaW50IHNpemUsIGludCBpbmMsIEZJWFBfVENDIGNvZWZmIFtdLCBpbnQgb3JkZXIpCi17Ci0gIC8vIC0gU2ltcGxlIGFsbC1wb2xlIGZpbHRlciBvZiBvcmRlciAib3JkZXIiIGRlZmluZWQgYnkKLSAgLy8gICB5KG4pID0gIHgobikgLSBhKDIpKnkobi0xKSAtIC4uLiAtIGEob3JkZXIrMSkqeShuLW9yZGVyKQotICAvLwotICAvLyAtIFRoZSBzdGF0ZSB2YXJpYWJsZXMgb2YgdGhlIGZpbHRlciBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybyBldmVyeSB0aW1lCi0gIC8vCi0gIC8vIC0gVGhlIG91dHB1dCBkYXRhIGlzIHdyaXR0ZW4gb3ZlciB0aGUgaW5wdXQgZGF0YSAoImluLXBsYWNlIG9wZXJhdGlvbiIpCi0gIC8vCi0gIC8vIC0gQW4gaW5wdXQgdmVjdG9yIG9mICJzaXplIiBzYW1wbGVzIGlzIHByb2Nlc3NlZCBhbmQgdGhlIGluZGV4IGluY3JlbWVudAotICAvLyAgIHRvIHRoZSBuZXh0IGRhdGEgc2FtcGxlIGlzIGdpdmVuIGJ5ICJpbmMiCi0KLSAgaW50IGksaixOOwotICBGSVhQX0RCTCAqcFNwZWM7Ci0gIEZJWFBfREJMIG1heFZhbD1GTDJGWENPTlNUX0RCTCgwLjApOwotICBJTlQgczsKLQotICBGREtfQVNTRVJUKG9yZGVyIDw9IFROU19NQVhJTVVNX09SREVSKTsKLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHN0YXRlLCBGSVhQX0RCTCwgVE5TX01BWElNVU1fT1JERVIpOwotICBGREttZW1jbGVhcihzdGF0ZSwgb3JkZXIqc2l6ZW9mKEZJWFBfREJMKSk7Ci0KLSAgZm9yIChpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0gICAgbWF4VmFsID0gZml4TWF4KG1heFZhbCxmaXhwX2FicyhzcGVjW2ldKSk7CisgIGlmIChmQ29tbW9uV2luZG93KSB7CisgICAgY29tbW9uX3RucyA9IEZES3JlYWRCaXQoaEJzKTsKICAgfQorICB7ICpwdG5zX29uX2xyID0gRkRLcmVhZEJpdChoQnMpOyB9CisgIGlmIChjb21tb25fdG5zKSB7CisgICAgcFRuc0RhdGEwLT5EYXRhUHJlc2VudCA9IDE7CisgICAgQ1Ruc19SZWFkKGhCcywgcFRuc0RhdGEwLCBwSWNzSW5mbywgZmxhZ3MpOwogCi0gIGlmICggbWF4VmFsID4gRkwyRlhDT05TVF9EQkwoMC4wMzEyNSowLjcwNzEwNjc4MTE4KSApCi0gICAgcyA9IGZpeE1heChDbnRMZWFkaW5nWmVyb3MobWF4VmFsKS02LDApOwotICBlbHNlCi0gICAgcyA9IGZpeE1heChDbnRMZWFkaW5nWmVyb3MobWF4VmFsKS01LDApOworICAgIHBUbnNEYXRhMC0+RGF0YVByZXNlbnQgPSAwOworICAgIHBUbnNEYXRhMC0+QWN0aXZlID0gMTsKKyAgICAqcFRuc0RhdGExID0gKnBUbnNEYXRhMDsKKyAgfSBlbHNlIHsKKyAgICBpbnQgdG5zX3ByZXNlbnRfYm90aDsKIAotICBzID0gZml4TWluKHMsMik7Ci0gIHMgPSBzLTE7Ci0KLSAgaWYgKGluYyA9PSAtMSkKLSAgICBwU3BlYyA9ICZzcGVjW3NpemUgLSAxXTsKLSAgZWxzZQotICAgIHBTcGVjID0gJnNwZWNbMF07Ci0KLSAgRklYUF9UQ0MgKnBDb2VmZjsKLQotI2RlZmluZSBGSVJTVF9QQVJUX0ZMVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZJWFBfREJMIHgsICpwU3RhdGUgPSBzdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBDb2VmZiA9IGNvZWZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChzIDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeCA9IChwU3BlYyBbMF0+PjEpICsgZk11bHREaXYyICgqcENvZWZmKyssIHBTdGF0ZSBbMF0pIDsgICAgICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeCA9IChwU3BlYyBbMF08PHMpICsgZk11bHREaXYyICgqcENvZWZmKyssIHBTdGF0ZSBbMF0pIDsKLQotI2RlZmluZSBJTk5FUl9GTFRSX0lOTElORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeCA9IGZNdWx0QWRkRGl2MiAoeCwgKnBDb2VmZiwgcFN0YXRlIFsxXSk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcFN0YXRlIFswXSA9IHBTdGF0ZSBbMV0gLSAoZk11bHREaXYyICgqcENvZWZmKyssIHgpIDw8MikgOyAgICAgXAotICAgICAgcFN0YXRlKys7Ci0KLSNkZWZpbmUgTEFTVF9QQVJUX0ZMVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChzIDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKnBTcGVjID0geCA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKnBTcGVjID0geCA+PiBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICpwU3RhdGUgPSgteCkgPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHBTcGVjICAgKz0gaW5jIDsKLQotCi0gICBpZiAob3JkZXI+OCkKLSAgIHsKLSAgICAgIE4gPSAob3JkZXItMSkmNzsKLQotICAgICAgZm9yIChpID0gc2l6ZSA7IGkgIT0gMCA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgRklSU1RfUEFSVF9GTFRSCi0KLSAgICAgICAgZm9yIChqID0gTjsgaiA+IDAgOyBqLS0pIHsgSU5ORVJfRkxUUl9JTkxJTkUgfQotCi0gICAgICAgIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FCi0gICAgICAgIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FCi0KLSAgICAgICAgTEFTVF9QQVJUX0ZMVFIKLSAgICAgIH0KLQotICAgfSBlbHNlIGlmIChvcmRlcj40KSB7Ci0KLSAgICAgIE4gPSAob3JkZXItMSkmMzsKLQotICAgICAgZm9yIChpID0gc2l6ZSA7IGkgIT0gMCA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgRklSU1RfUEFSVF9GTFRSCi0gICAgICAgIGZvciAoaiA9IE47IGogPiAwIDsgai0tKSB7IElOTkVSX0ZMVFJfSU5MSU5FIH0KLQotICAgICAgICBJTk5FUl9GTFRSX0lOTElORSBJTk5FUl9GTFRSX0lOTElORSBJTk5FUl9GTFRSX0lOTElORSBJTk5FUl9GTFRSX0lOTElORQotCi0gICAgICAgIExBU1RfUEFSVF9GTFRSCi0gICAgICB9Ci0KLSAgIH0gZWxzZSB7Ci0KLSAgICAgIE4gPSBvcmRlci0xOwotCi0gICAgICBmb3IgKGkgPSBzaXplIDsgaSAhPSAwIDsgaS0tKQotICAgICAgewotICAgICAgICBGSVJTVF9QQVJUX0ZMVFIKLQotICAgICAgICBmb3IgKGogPSBOOyBqID4gMCA7IGotLSkgeyBJTk5FUl9GTFRSX0lOTElORSB9Ci0KLSAgICAgICAgTEFTVF9QQVJUX0ZMVFIKLSAgICAgIH0KLSAgIH0KLQotICAgQ19BTExPQ19TQ1JBVENIX0VORChzdGF0ZSwgRklYUF9EQkwsIFROU19NQVhJTVVNX09SREVSKTsKKyAgICB0bnNfcHJlc2VudF9ib3RoID0gRkRLcmVhZEJpdChoQnMpOworICAgIGlmICh0bnNfcHJlc2VudF9ib3RoKSB7CisgICAgICBwVG5zRGF0YTAtPkRhdGFQcmVzZW50ID0gMTsKKyAgICAgIHBUbnNEYXRhMS0+RGF0YVByZXNlbnQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICBwVG5zRGF0YTEtPkRhdGFQcmVzZW50ID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgcFRuc0RhdGEwLT5EYXRhUHJlc2VudCA9ICFwVG5zRGF0YTEtPkRhdGFQcmVzZW50OworICAgIH0KKyAgfQogfQogCiAvKiEKQEAgLTMzMCw4MyArMjcxLDkxIEBACiAKICAgXHJldHVybiAgbm9uZQogKi8KLXZvaWQgQ1Ruc19BcHBseSAoCi0gICAgICAgIENUbnNEYXRhICpSRVNUUklDVCBwVG5zRGF0YSwgLyohPCBwb2ludGVyIHRvIGFhYyBkZWNvZGVyIGluZm8gKi8KLSAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLAotICAgICAgICBTUEVDVFJBTF9QVFIgcFNwZWN0cmFsQ29lZmZpY2llbnQsCi0gICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aAotICAgICAgICApCi17Ci0gIGludCB3aW5kb3csaW5kZXgsc3RhcnQsc3RvcCxzaXplOwordm9pZCBDVG5zX0FwcGx5KENUbnNEYXRhICpSRVNUUklDVCBwVG5zRGF0YSwgLyohPCBwb2ludGVyIHRvIGFhYyBkZWNvZGVyIGluZm8gKi8KKyAgICAgICAgICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIFNQRUNUUkFMX1BUUiBwU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwgY29uc3QgVUNIQVIgbmJhbmRzLAorICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGlnZl9hY3RpdmUsIGNvbnN0IFVJTlQgZmxhZ3MpIHsKKyAgaW50IHdpbmRvdywgaW5kZXgsIHN0YXJ0LCBzdG9wLCBzaXplLCBzdGFydF93aW5kb3csIHdpbnNfcGVyX2ZyYW1lOwogCisgIGlmIChwVG5zRGF0YS0+QWN0aXZlKSB7CisgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChjb2VmZiwgRklYUF9UQ0MsIFROU19NQVhJTVVNX09SREVSKQogCi0gIGlmIChwVG5zRGF0YS0+QWN0aXZlKQotICB7Ci0gICAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKGNvZWZmLCBGSVhQX1RDQywgVE5TX01BWElNVU1fT1JERVIpOworICAgIHsKKyAgICAgIHN0YXJ0X3dpbmRvdyA9IDA7CisgICAgICB3aW5zX3Blcl9mcmFtZSA9IEdldFdpbmRvd3NQZXJGcmFtZShwSWNzSW5mbyk7CisgICAgfQogCi0gICAgICBmb3IgKHdpbmRvdz0wOyB3aW5kb3cgPCBHZXRXaW5kb3dzUGVyRnJhbWUocEljc0luZm8pOyB3aW5kb3crKykKLSAgICAgIHsKLSAgICAgICAgRklYUF9EQkwgKnBTcGVjdHJ1bSA9IFNQRUMocFNwZWN0cmFsQ29lZmZpY2llbnQsIHdpbmRvdywgZ3JhbnVsZUxlbmd0aCk7CisgICAgZm9yICh3aW5kb3cgPSBzdGFydF93aW5kb3c7IHdpbmRvdyA8IHdpbnNfcGVyX2ZyYW1lOyB3aW5kb3crKykgeworICAgICAgRklYUF9EQkwgKnBTcGVjdHJ1bTsKIAotICAgICAgICBmb3IgKGluZGV4PTA7IGluZGV4IDwgcFRuc0RhdGEtPk51bWJlck9mRmlsdGVyc1t3aW5kb3ddOyBpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ0ZpbHRlciAqUkVTVFJJQ1QgZmlsdGVyID0gJnBUbnNEYXRhLT5GaWx0ZXJbd2luZG93XVtpbmRleF07CisgICAgICB7IHBTcGVjdHJ1bSA9IFNQRUMocFNwZWN0cmFsQ29lZmZpY2llbnQsIHdpbmRvdywgZ3JhbnVsZUxlbmd0aCk7IH0KIAotICAgICAgICAgIGlmIChmaWx0ZXItPk9yZGVyID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgRklYUF9UQ0MgKnBDb2VmZjsKLSAgICAgICAgICAgICBpbnQgdG5zX21heF9iYW5kczsKKyAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBUbnNEYXRhLT5OdW1iZXJPZkZpbHRlcnNbd2luZG93XTsgaW5kZXgrKykgeworICAgICAgICBDRmlsdGVyICpmaWx0ZXIgPSAmcFRuc0RhdGEtPkZpbHRlclt3aW5kb3ddW2luZGV4XTsKIAotICAgICAgICAgICAgIHBDb2VmZiA9ICZjb2VmZltmaWx0ZXItPk9yZGVyLTFdOwotICAgICAgICAgICAgIGlmIChmaWx0ZXItPlJlc29sdXRpb24gPT0gMykKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgZmlsdGVyLT5PcmRlcjsgaSsrKQotICAgICAgICAgICAgICAgICAqcENvZWZmLS0gPSBGREthYWNEZWNfdG5zQ29lZmYzW2ZpbHRlci0+Q29lZmZbaV0rNF07Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgZmlsdGVyLT5PcmRlcjsgaSsrKQotICAgICAgICAgICAgICAgICAqcENvZWZmLS0gPSBGREthYWNEZWNfdG5zQ29lZmY0W2ZpbHRlci0+Q29lZmZbaV0rOF07Ci0gICAgICAgICAgICAgfQorICAgICAgICBpZiAoZmlsdGVyLT5PcmRlciA+IDApIHsKKyAgICAgICAgICBGSVhQX1RDQyAqcENvZWZmOworICAgICAgICAgIFVDSEFSIHRuc19tYXhfYmFuZHM7CiAKLSAgICAgICAgICAgICBzd2l0Y2ggKGdyYW51bGVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgIGNhc2UgNDgwOgotICAgICAgICAgICAgICAgICB0bnNfbWF4X2JhbmRzID0gdG5zX21heF9iYW5kc190YmxfNDgwW3BTYW1wbGluZ1JhdGVJbmZvLT5zYW1wbGluZ1JhdGVJbmRleF07Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1MTI6Ci0gICAgICAgICAgICAgICAgIHRuc19tYXhfYmFuZHMgPSB0bnNfbWF4X2JhbmRzX3RibF81MTJbcFNhbXBsaW5nUmF0ZUluZm8tPnNhbXBsaW5nUmF0ZUluZGV4XTsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICB0bnNfbWF4X2JhbmRzID0gR2V0TWF4aW11bVRuc0JhbmRzKHBJY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mby0+c2FtcGxpbmdSYXRlSW5kZXgpOwotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9CisgICAgICAgICAgcENvZWZmID0gY29lZmY7CisgICAgICAgICAgaWYgKGZpbHRlci0+UmVzb2x1dGlvbiA9PSAzKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPk9yZGVyOyBpKyspCisgICAgICAgICAgICAgICpwQ29lZmYrKyA9IEZES2FhY0RlY190bnNDb2VmZjNbZmlsdGVyLT5Db2VmZltpXSArIDRdOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPk9yZGVyOyBpKyspCisgICAgICAgICAgICAgICpwQ29lZmYrKyA9IEZES2FhY0RlY190bnNDb2VmZjRbZmlsdGVyLT5Db2VmZltpXSArIDhdOworICAgICAgICAgIH0KIAotICAgICAgICAgICAgIHN0YXJ0ID0gZml4TWluKCBmaXhNaW4oZmlsdGVyLT5TdGFydEJhbmQsIHRuc19tYXhfYmFuZHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQocEljc0luZm8pICk7CisgICAgICAgICAgc3dpdGNoIChncmFudWxlTGVuZ3RoKSB7CisgICAgICAgICAgICBjYXNlIDQ4MDoKKyAgICAgICAgICAgICAgdG5zX21heF9iYW5kcyA9CisgICAgICAgICAgICAgICAgICB0bnNfbWF4X2JhbmRzX3RibF80ODBbcFNhbXBsaW5nUmF0ZUluZm8tPnNhbXBsaW5nUmF0ZUluZGV4XTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUxMjoKKyAgICAgICAgICAgICAgdG5zX21heF9iYW5kcyA9CisgICAgICAgICAgICAgICAgICB0bnNfbWF4X2JhbmRzX3RibF81MTJbcFNhbXBsaW5nUmF0ZUluZm8tPnNhbXBsaW5nUmF0ZUluZGV4XTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICB0bnNfbWF4X2JhbmRzID0gR2V0TWF4aW11bVRuc0JhbmRzKAorICAgICAgICAgICAgICAgICAgcEljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvLT5zYW1wbGluZ1JhdGVJbmRleCk7CisgICAgICAgICAgICAgIC8qIFNlZSByZWRlZmluaXRpb24gb2YgVE5TX01BWF9CQU5EUyB0YWJsZSAqLworICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkpICYmCisgICAgICAgICAgICAgICAgICAocFNhbXBsaW5nUmF0ZUluZm8tPnNhbXBsaW5nUmF0ZUluZGV4ID4gNSkpIHsKKyAgICAgICAgICAgICAgICB0bnNfbWF4X2JhbmRzICs9IDE7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQogCi0gICAgICAgICAgICAgc3RhcnQgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKHBJY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbylbc3RhcnRdOworICAgICAgICAgIHN0YXJ0ID0gZml4TWluKGZpeE1pbihmaWx0ZXItPlN0YXJ0QmFuZCwgdG5zX21heF9iYW5kcyksIG5iYW5kcyk7CiAKLSAgICAgICAgICAgICBzdG9wID0gZml4TWluKCBmaXhNaW4oZmlsdGVyLT5TdG9wQmFuZCwgdG5zX21heF9iYW5kcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKHBJY3NJbmZvKSApOworICAgICAgICAgIHN0YXJ0ID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cyhwSWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pW3N0YXJ0XTsKIAotICAgICAgICAgICAgIHN0b3AgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKHBJY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbylbc3RvcF07CisgICAgICAgICAgaWYgKGlnZl9hY3RpdmUpIHsKKyAgICAgICAgICAgIHN0b3AgPSBmaXhNaW4oZmlsdGVyLT5TdG9wQmFuZCwgbmJhbmRzKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RvcCA9IGZpeE1pbihmaXhNaW4oZmlsdGVyLT5TdG9wQmFuZCwgdG5zX21heF9iYW5kcyksIG5iYW5kcyk7CisgICAgICAgICAgfQogCi0gICAgICAgICAgICAgc2l6ZSA9IHN0b3AgLSBzdGFydDsKKyAgICAgICAgICBzdG9wID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cyhwSWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pW3N0b3BdOwogCi0gICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICBDVG5zX0ZpbHRlcigmcFNwZWN0cnVtW3N0YXJ0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci0+RGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci0+T3JkZXIgKTsKLSAgICAgICAgICAgICB9CisgICAgICAgICAgc2l6ZSA9IHN0b3AgLSBzdGFydDsKKworICAgICAgICAgIGlmIChzaXplKSB7CisgICAgICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoc3RhdGUsIEZJWFBfREJMLCBUTlNfTUFYSU1VTV9PUkRFUikKKworICAgICAgICAgICAgRkRLbWVtY2xlYXIoc3RhdGUsIFROU19NQVhJTVVNX09SREVSICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgICBDTHBjX1N5bnRoZXNpc0xhdHRpY2UocFNwZWN0cnVtICsgc3RhcnQsIHNpemUsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLT5EaXJlY3Rpb24sIGNvZWZmLCBmaWx0ZXItPk9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKworICAgICAgICAgICAgQ19BTExPQ19TQ1JBVENIX0VORChzdGF0ZSwgRklYUF9EQkwsIFROU19NQVhJTVVNX09SREVSKQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQoY29lZmYsIEZJWFBfVENDLCBUTlNfTUFYSU1VTV9PUkRFUik7CisgICAgfQorICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKGNvZWZmLCBGSVhQX1RDQywgVE5TX01BWElNVU1fT1JERVIpCiAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfdG5zLmggYi9saWJBQUNkZWMvc3JjL2FhY2RlY190bnMuaAppbmRleCBmMDI5ZDk2Li4xYTYzYmVkIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY190bnMuaAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY190bnMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyOSArOTAsMzcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IHRlbXBvcmFsIG5vaXNlIHNoYXBpbmcgdG9vbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIFROU19ICi0jZGVmaW5lIFROU19ICisjaWZuZGVmIEFBQ0RFQ19UTlNfSAorI2RlZmluZSBBQUNERUNfVE5TX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAotZW51bQotewotICBUTlNfTUFYX1dJTkRPV1MgPSA4LCAgICAvKiA4ICovCi0gIFROU19NQVhJTVVNX09SREVSICAgPSAyMCwgIC8qIDEyIGZvciBBQUMtTEMgYW5kIEFBQy1TU1IuIFNldCB0byAyMCBmb3IgQUFDLU1haW4gKEFPVCAxKS4gU29tZSBicm9rZW4gZW5jb2RlcnMgYWxzbyBkbyBvcmRlciAyMCBmb3IgQUFDLUxDIDooICovCitlbnVtIHsKKyAgVE5TX01BWF9XSU5ET1dTID0gOCwgLyogOCAqLwogICBUTlNfTUFYSU1VTV9GSUxURVJTID0gMwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKKy8qIFROU19NQVhJTVVNX09SREVSIChmb3IgbWVtb3J5IGFsbG9jYXRpb24pCisgICAxMiBmb3IgQUFDLUxDIGFuZCBBQUMtU1NSLiBTZXQgdG8gMjAgZm9yIEFBQy1NYWluIChBT1QgMSkuIFNvbWUgYnJva2VuCisgICBlbmNvZGVycyBhbHNvIGRvIG9yZGVyIDIwIGZvciBBQUMtTEMgOiggMTUgZm9yIFVTQUMgKEFPVCA0MikKKyovCisjZGVmaW5lIFROU19NQVhJTVVNX09SREVSICgyMCkKKworI2lmIChUTlNfTUFYSU1VTV9PUkRFUiA8IDE1KQorI2Vycm9yIFVTQUM6IFROUyBmaWx0ZXIgb3JkZXIgdXAgMTUgY2FuIGJlIHNpZ25hbGVkIQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKICAgU0NIQVIgQ29lZmZbVE5TX01BWElNVU1fT1JERVJdOwogCiAgIFVDSEFSIFN0YXJ0QmFuZDsKQEAgLTExMywxNCArMTMyLDE4IEBACiAgIFVDSEFSIE9yZGVyOwogfSBDRmlsdGVyOwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBDRmlsdGVyIEZpbHRlcltUTlNfTUFYX1dJTkRPV1NdW1ROU19NQVhJTVVNX0ZJTFRFUlNdOwogICBVQ0hBUiBOdW1iZXJPZkZpbHRlcnNbVE5TX01BWF9XSU5ET1dTXTsKICAgVUNIQVIgRGF0YVByZXNlbnQ7CiAgIFVDSEFSIEFjdGl2ZTsKKworICAvKiBsb2cyIG9mIHRoZSBtYXhpbXVtIHRvdGFsIGZpbHRlciBnYWlucy4gVGhlIHZhbHVlIGlzIHJlcXVpcmVkIHRvCisgICAgIGtlZXAgbmVjZXNzYXJ5IG1hbnRpc3NhIGhlYWRyb29tIHNvIHRoYXQgd2hpbGUgYXBwbHlpbmcgdGhlIFROUyBwcmVkaWN0b3IKKyAgICAgdGhlIG1hbnRpc3NhcyBkbyBub3Qgb3ZlcmZsb3cuICovCisgIFVDSEFSIEdhaW5MZDsKIH0gQ1Ruc0RhdGE7CiAKIHZvaWQgQ1Ruc19SZXNldChDVG5zRGF0YSAqcFRuc0RhdGEpOwogCi0jZW5kaWYgLyogI2lmbmRlZiBUTlNfSCAqLworI2VuZGlmIC8qICNpZm5kZWYgQUFDREVDX1ROU19IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuY3BwIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyLmNwcAppbmRleCA1NzllNDcwLi4yNDkwN2VlIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlci5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNjAgKzkwLDY4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBccGFnZSBkZWZhdWx0IEdlbmVyYWwgT3ZlcnZpZXcgb2YgdGhlIEFBQyBEZWNvZGVyIEltcGxlbWVudGF0aW9uCiAKLSAgVGhlIG1haW4gZW50cnkgcG9pbnQgdG8gZGVjb2RlIGEgQUFDIGZyYW1lIGlzIENBYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkuIEl0IGhhbmRsZXMgdGhlIGRpZmZlcmVudAotICB0cmFuc3BvcnQgbXVsdGlwbGV4ZXMgYW5kIGJpdHN0cmVhbSBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uLiBJdCBleHRyYWN0cyB0aGUKLSAgQUFDX3Jhd19kYXRhX2Jsb2NrcyBmcm9tIHRoZXNlIGJpdHN0cmVhbXMgdG8gZnVydGhlciBwcm9jZXNzIHRoZW4gaW4gdGhlIGFjdHVhbCBkZWNvZGluZyBzdGFnZXMuCisgIFRoZSBtYWluIGVudHJ5IHBvaW50IHRvIGRlY29kZSBhIEFBQyBmcmFtZSBpcyBDQWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpLiBJdAorICBoYW5kbGVzIHRoZSBkaWZmZXJlbnQgdHJhbnNwb3J0IG11bHRpcGxleGVzIGFuZCBiaXRzdHJlYW0gZm9ybWF0cyBzdXBwb3J0ZWQgYnkKKyAgdGhpcyBpbXBsZW1lbnRhdGlvbi4gSXQgZXh0cmFjdHMgdGhlIEFBQ19yYXdfZGF0YV9ibG9ja3MgZnJvbSB0aGVzZSBiaXRzdHJlYW1zCisgIHRvIGZ1cnRoZXIgcHJvY2VzcyB0aGVuIGluIHRoZSBhY3R1YWwgZGVjb2Rpbmcgc3RhZ2VzLgogCi0gIE5vdGU6IENsaWNrIG9uIGEgZnVuY3Rpb24gb2YgZmlsZSBpbiB0aGUgYWJvdmUgaW1hZ2UgdG8gc2VlIGRldGFpbHMgYWJvdXQgdGhlIGZ1bmN0aW9uLiBBbHNvIG5vdGUsIHRoYXQKLSAgdGhpcyBpcyBqdXN0IGFuIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGltcG9ydGFudCBmdW5jdGlvbnMgYW5kIG5vdCBhIGNvbXBsZXRlIGNhbGwgZ3JhcGguCisgIE5vdGU6IENsaWNrIG9uIGEgZnVuY3Rpb24gb2YgZmlsZSBpbiB0aGUgYWJvdmUgaW1hZ2UgdG8gc2VlIGRldGFpbHMgYWJvdXQgdGhlCisgIGZ1bmN0aW9uLiBBbHNvIG5vdGUsIHRoYXQgdGhpcyBpcyBqdXN0IGFuIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGltcG9ydGFudAorICBmdW5jdGlvbnMgYW5kIG5vdCBhIGNvbXBsZXRlIGNhbGwgZ3JhcGguCiAKICAgPGgyPjEgQml0c3RyZWFtIGRlZm9ybWF0dGVyPC9oMj4KLSAgVGhlIGJhc2ljIGJpdCBzdHJlYW0gcGFyc2VyIGZ1bmN0aW9uIENDaGFubmVsRWxlbWVudF9SZWFkKCkgaXMgY2FsbGVkLiBJdCB1c2VzIG90aGVyIHN1YmNhbGxzIGluIG9yZGVyCi0gIHRvIHBhcnNlIGFuZCB1bnBhY2sgdGhlIGJpdHN0cmVhbXMuIE5vdGUsIHRoYXQgdGhpcyBpbmNsdWRlcyBodWZmbWFubiBkZWNvZGluZyBvZiB0aGUgY29kZWQgc3BlY3RyYWwgZGF0YS4KLSAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIGNvbXB1dGF0aW9uYWwgc2lnbmlmaWNhbnQgc3BlY2lmaWNhbGx5IGF0IGhpZ2hlciBiaXRyYXRlcy4gT3B0aW1pemF0aW9uIGlzIGxpa2VseSBpbgotICBDQmxvY2tfUmVhZFNwZWN0cmFsRGF0YSgpLgorICBUaGUgYmFzaWMgYml0IHN0cmVhbSBwYXJzZXIgZnVuY3Rpb24gQ0NoYW5uZWxFbGVtZW50X1JlYWQoKSBpcyBjYWxsZWQuIEl0IHVzZXMKKyAgb3RoZXIgc3ViY2FsbHMgaW4gb3JkZXIgdG8gcGFyc2UgYW5kIHVucGFjayB0aGUgYml0c3RyZWFtcy4gTm90ZSwgdGhhdCB0aGlzCisgIGluY2x1ZGVzIGh1ZmZtYW5uIGRlY29kaW5nIG9mIHRoZSBjb2RlZCBzcGVjdHJhbCBkYXRhLiBUaGlzIG9wZXJhdGlvbiBjYW4gYmUKKyAgY29tcHV0YXRpb25hbCBzaWduaWZpY2FudCBzcGVjaWZpY2FsbHkgYXQgaGlnaGVyIGJpdHJhdGVzLiBPcHRpbWl6YXRpb24gaXMKKyAgbGlrZWx5IGluIENCbG9ja19SZWFkU3BlY3RyYWxEYXRhKCkuCiAKLSAgVGhlIGJpdHN0cmVhbSBkZWZvcm1hdHRlciBhbHNvIGluY2x1ZGVzIG1hbnkgYml0ZmllbGQgb3BlcmF0aW9ucy4gUHJvZmlsaW5nIG9uIHRoZSB0YXJnZXQgd2lsbCBkZXRlcm1pbmUKLSAgcmVxdWlyZWQgb3B0aW1pemF0aW9ucy4KKyAgVGhlIGJpdHN0cmVhbSBkZWZvcm1hdHRlciBhbHNvIGluY2x1ZGVzIG1hbnkgYml0ZmllbGQgb3BlcmF0aW9ucy4gUHJvZmlsaW5nIG9uCisgIHRoZSB0YXJnZXQgd2lsbCBkZXRlcm1pbmUgcmVxdWlyZWQgb3B0aW1pemF0aW9ucy4KIAogICA8aDI+MiBBY3R1YWwgZGVjb2RpbmcgdG8gcmV0YWluIHRoZSB0aW1lIGRvbWFpbiBvdXRwdXQ8L2gyPgotICBUaGUgYmFzaWMgYml0c3RyZWFtIGRlZm9ybWF0dGVyIGZ1bmN0aW9uIENDaGFubmVsRWxlbWVudF9EZWNvZGUoKSBmb3IgQ1BFIGVsZW1lbnRzIGFuZCBTQ0UgZWxlbWVudHMgYXJlIGNhbGxlZC4KLSAgRXhjZXB0IGZvciB0aGUgc3RlcmVvIHByb2Nlc3NpbmcgKDIuMSkgd2hpY2ggaXMgb25seSB1c2VkIGZvciBDUEUgZWxlbWVudHMsIHRoZSBmdW5jdGlvbiBjYWxscyBmb3IgQ1BFIG9yIFNDRQotICBhcmUgc2ltaWxhciwgZXhjZXB0IHRoYXQgQ1BFIGFsd2F5cyBwcm9jZXNzZXMgdG8gaW5kZXBlbmRlbnQgY2hhbm5lbHMgd2hpbGUgU0NFIG9ubHkgcHJvY2Vzc2VzIG9uZSBjaGFubmVsLgorICBUaGUgYmFzaWMgYml0c3RyZWFtIGRlZm9ybWF0dGVyIGZ1bmN0aW9uIENDaGFubmVsRWxlbWVudF9EZWNvZGUoKSBmb3IgQ1BFCisgIGVsZW1lbnRzIGFuZCBTQ0UgZWxlbWVudHMgYXJlIGNhbGxlZC4gRXhjZXB0IGZvciB0aGUgc3RlcmVvIHByb2Nlc3NpbmcgKDIuMSkKKyAgd2hpY2ggaXMgb25seSB1c2VkIGZvciBDUEUgZWxlbWVudHMsIHRoZSBmdW5jdGlvbiBjYWxscyBmb3IgQ1BFIG9yIFNDRSBhcmUKKyAgc2ltaWxhciwgZXhjZXB0IHRoYXQgQ1BFIGFsd2F5cyBwcm9jZXNzZXMgdG8gaW5kZXBlbmRlbnQgY2hhbm5lbHMgd2hpbGUgU0NFCisgIG9ubHkgcHJvY2Vzc2VzIG9uZSBjaGFubmVsLgogCi0gIE9mdGVuIHRoZXJlIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGxvbmcgYmxvY2tzIGFuZCBzaG9ydCBibG9ja3MuIEhvd2V2ZXIsIGNvbXB1dGF0aW9uYWwgZXhwZW5zaXZlIGZ1bmN0aW9ucwotICB0aGF0IHVzdXNhbGx5IHJlcXVpcmUgb3B0aW1pemF0aW9uIGFyZSBiZWluZyBzaGFyZWQgYnkgdGhlc2UgdHdvIGdyb3VwcywKKyAgT2Z0ZW4gdGhlcmUgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gbG9uZyBibG9ja3MgYW5kIHNob3J0IGJsb2Nrcy4gSG93ZXZlciwKKyAgY29tcHV0YXRpb25hbCBleHBlbnNpdmUgZnVuY3Rpb25zIHRoYXQgdXN1c2FsbHkgcmVxdWlyZSBvcHRpbWl6YXRpb24gYXJlIGJlaW5nCisgIHNoYXJlZCBieSB0aGVzZSB0d28gZ3JvdXBzLAogCiAgIDxoMz4yLjEgU3RlcmVvIHByb2Nlc3NpbmcgZm9yIENQRSBlbGVtZW50czwvaDM+Ci0gIENDaGFubmVsUGFpckVsZW1lbnRfRGVjb2RlKCkgZmlyc3QgY2FsbGVzIHRoZSBqb2ludCBzdGVyZW8gIHRvb2xzIGluIHN0ZXJlby5jcHAgd2hlbiByZXF1aXJlZC4KKyAgQ0NoYW5uZWxQYWlyRWxlbWVudF9EZWNvZGUoKSBmaXJzdCBjYWxsZXMgdGhlIGpvaW50IHN0ZXJlbyAgdG9vbHMgaW4KKyAgc3RlcmVvLmNwcCB3aGVuIHJlcXVpcmVkLgogCiAgIDxoMz4yLjIgU2NhbGluZyBvZiBzcGVjdHJhbCBkYXRhPC9oMz4KICAgQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhKCkuCiAKICAgPGgzPjIuMyBBcHBseSBhZGRpdGlvbmFsIGNvZGluZyB0b29sczwvaDM+Ci0gIEFwcGx5VG9vbHMoKSBjYWxsZXMgdGhlIFBOUyB0b29scyBpbiBjYXNlIG9mIE1QRUctNCBiaXRzdHJlYW1zLCBhbmQgVE5TIGZpbHRlcmluZyBDVG5zX0FwcGx5KCkgZm9yIE1QRUctMiBhbmQgTVBFRy00IGJpdHN0cmVhbXMuCi0gIFRoZSBmdW5jdGlvbiBUbnNGaWx0ZXJJSVIoKSB3aGljaCBpcyBjYWxsZWQgYnkgQ1Ruc19BcHBseSgpICgyLjMuMSkgbWlnaHQgcmVxdWlyZSBzb21lIG9wdGltaXphdGlvbi4KKyAgQXBwbHlUb29scygpIGNhbGxlcyB0aGUgUE5TIHRvb2xzIGluIGNhc2Ugb2YgTVBFRy00IGJpdHN0cmVhbXMsIGFuZCBUTlMKKyAgZmlsdGVyaW5nIENUbnNfQXBwbHkoKSBmb3IgTVBFRy0yIGFuZCBNUEVHLTQgYml0c3RyZWFtcy4gVGhlIGZ1bmN0aW9uCisgIFRuc0ZpbHRlcklJUigpIHdoaWNoIGlzIGNhbGxlZCBieSBDVG5zX0FwcGx5KCkgKDIuMy4xKSBtaWdodCByZXF1aXJlIHNvbWUKKyAgb3B0aW1pemF0aW9uLgogCiAgIDxoMj4zIEZyZXF1ZW5jeS1Uby1UaW1lIGNvbnZlcnNpb248L2gzPgotICBUaGUgZmlsdGVyYmFuayBpcyBjYWxsZWQgdXNpbmcgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZSgpIHVzaW5nIHRoZSBNRENUIG1vZHVsZSBmcm9tIHRoZSBGREsgVG9vbHMKKyAgVGhlIGZpbHRlcmJhbmsgaXMgY2FsbGVkIHVzaW5nIENCbG9ja19GcmVxdWVuY3lUb1RpbWUoKSB1c2luZyB0aGUgTURDVCBtb2R1bGUKKyAgZnJvbSB0aGUgRkRLIFRvb2xzCiAKICovCiAKLQotCiAjaW5jbHVkZSAiYWFjZGVjb2Rlci5oIgogCiAjaW5jbHVkZSAiYWFjX3JvbS5oIgpAQCAtMTQwLDU0ICsxNTksMTU1IEBACiAjaW5jbHVkZSAiY2hhbm5lbC5oIgogI2luY2x1ZGUgIkZES19hdWRpby5oIgogCi0jaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorI2luY2x1ZGUgImFhY2RlY19wbnMuaCIKIAotICAjaW5jbHVkZSAiYWFjZGVjX3Bucy5oIgorI2luY2x1ZGUgInNicmRlY29kZXIuaCIKIAotICAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorI2luY2x1ZGUgInNhY19kZWNfbGliLmgiCiAKKyNpbmNsdWRlICJhYWNkZWNfaGNyLmgiCisjaW5jbHVkZSAicnZsYy5oIgogCisjaW5jbHVkZSAidXNhY2RlY19scGQuaCIKIAotCi0gICNpbmNsdWRlICJhYWNkZWNfaGNyLmgiCi0gICNpbmNsdWRlICJydmxjLmgiCi0KKyNpbmNsdWRlICJhY19hcml0aF9jb2Rlci5oIgogCiAjaW5jbHVkZSAidHBkZWNfbGliLmgiCiAKICNpbmNsdWRlICJjb25jZWFsLmgiCiAKLSAgI2luY2x1ZGUgIkZES19jcmMuaCIKKyNpbmNsdWRlICJGREtfY3JjLmgiCisjZGVmaW5lIFBTX0lTX0VYUExJQ0lUTFlfRElTQUJMRUQoYW90LCBmbGFncykgXAorICAoKChhb3QpID09IEFPVF9EUk1fQUFDKSAmJiAhKGZsYWdzICYgQUNfUFNfUFJFU0VOVCkpCiAKKyNkZWZpbmUgSVNfU1RFUkVPX1NCUihlbF9pZCwgc3RlcmVvQ29uZmlnSW5kZXgpICAgICAgICAgICAgXAorICAoKChlbF9pZCkgPT0gSURfVVNBQ19DUEUgJiYgKHN0ZXJlb0NvbmZpZ0luZGV4KSA9PSAwKSB8fCBcCisgICAoKGVsX2lkKSA9PSBJRF9VU0FDX0NQRSAmJiAoc3RlcmVvQ29uZmlnSW5kZXgpID09IDMpKQogCi12b2lkIENBYWNEZWNvZGVyX1N5bmNRbWZNb2RlKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpCi17Cit2b2lkIENBYWNEZWNvZGVyX1N5bmNRbWZNb2RlKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpIHsKKyAgRkRLX0FTU0VSVCgKKyAgICAgICEoKHNlbGYtPmZsYWdzWzBdICYgQUNfTVBTX1BSRVNFTlQpICYmIChzZWxmLT5mbGFnc1swXSAmIEFDX1BTX1BSRVNFTlQpKSk7CiAKICAgLyogQXNzaWduIHVzZXIgcmVxdWVzdGVkIG1vZGUgKi8KICAgc2VsZi0+cW1mTW9kZUN1cnIgPSBzZWxmLT5xbWZNb2RlVXNlcjsKIAotICBpZiAoIHNlbGYtPnFtZk1vZGVDdXJyID09IE5PVF9ERUZJTkVEICkKLSAgewotICAgIGlmICggKElTX0xPV0RFTEFZKHNlbGYtPnN0cmVhbUluZm8uYW90KSAmJiAoc2VsZi0+ZmxhZ3MgJiBBQ19NUFNfUFJFU0VOVCkpCi0gICAgICB8fCAoIChzZWxmLT5zdHJlYW1JbmZvLmFhY051bUNoYW5uZWxzID09IDEpCi0gICAgICAgICYmICggKENBTl9ET19QUyhzZWxmLT5zdHJlYW1JbmZvLmFvdCkgJiYgIShzZWxmLT5mbGFncyAmIEFDX01QU19QUkVTRU5UKSkKLSAgICAgICAgICB8fCAoICBJU19VU0FDKHNlbGYtPnN0cmVhbUluZm8uYW90KSAmJiAgKHNlbGYtPmZsYWdzICYgQUNfTVBTX1BSRVNFTlQpKSApICkgKQotICAgIHsKKyAgaWYgKElTX1VTQUMoc2VsZi0+c3RyZWFtSW5mby5hb3QpKSB7CisgICAgc2VsZi0+cW1mTW9kZUN1cnIgPSBNT0RFX0hROworICB9CisKKyAgaWYgKHNlbGYtPnFtZk1vZGVDdXJyID09IE5PVF9ERUZJTkVEKSB7CisgICAgaWYgKChJU19MT1dERUxBWShzZWxmLT5zdHJlYW1JbmZvLmFvdCkgJiYKKyAgICAgICAgIChzZWxmLT5mbGFnc1swXSAmIEFDX01QU19QUkVTRU5UKSkgfHwKKyAgICAgICAgKChzZWxmLT5zdHJlYW1JbmZvLmFhY051bUNoYW5uZWxzID09IDEpICYmCisgICAgICAgICAoKENBTl9ET19QUyhzZWxmLT5zdHJlYW1JbmZvLmFvdCkgJiYKKyAgICAgICAgICAgIShzZWxmLT5mbGFnc1swXSAmIEFDX01QU19QUkVTRU5UKSkgfHwKKyAgICAgICAgICAoSVNfVVNBQyhzZWxmLT5zdHJlYW1JbmZvLmFvdCkpKSkpIHsKICAgICAgIHNlbGYtPnFtZk1vZGVDdXJyID0gTU9ERV9IUTsKICAgICB9IGVsc2UgewogICAgICAgc2VsZi0+cW1mTW9kZUN1cnIgPSBNT0RFX0xQOwogICAgIH0KICAgfQogCisgIGlmIChzZWxmLT5tcHNFbmFibGVDdXJyKSB7CisgICAgaWYgKElTX0xPV0RFTEFZKHNlbGYtPnN0cmVhbUluZm8uYW90KSAmJgorICAgICAgICAoc2VsZi0+cW1mTW9kZUN1cnIgPT0gTU9ERV9MUCkpIHsgLyogT3ZlcnJ1bGUgdXNlciByZXF1ZXN0ZWQgUU1GIG1vZGUgKi8KKyAgICAgIHNlbGYtPnFtZk1vZGVDdXJyID0gTU9ERV9IUTsKKyAgICB9CisgICAgLyogU2V0IGFuZCBjaGVjayBpZiBNUFMgZGVjb2RlciBhbGxvd3MgdGhlIGN1cnJlbnQgbW9kZSAqLworICAgIHN3aXRjaCAobXBlZ1N1cnJvdW5kRGVjb2Rlcl9TZXRQYXJhbSgKKyAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgIFNBQ0RFQ19QQVJUSUFMTFlfQ09NUExFWCwgc2VsZi0+cW1mTW9kZUN1cnIgPT0gTU9ERV9MUCkpIHsKKyAgICAgIGNhc2UgTVBTX09LOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVBTX0lOVkFMSURfUEFSQU1FVEVSOiB7IC8qIE9ubHkgb25lIG1vZGUgc3VwcG9ydGVkLiBGaW5kIG91dCB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lOiAqLworICAgICAgICBMSUJfSU5GTyBsaWJJbmZvW0ZES19NT0RVTEVfTEFTVF07CisgICAgICAgIFVJTlQgbXBzQ2FwczsKKworICAgICAgICBGREtpbml0TGliSW5mbyhsaWJJbmZvKTsKKyAgICAgICAgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9HZXRMaWJJbmZvKGxpYkluZm8pOworICAgICAgICBtcHNDYXBzID0gRkRLbGliSW5mb19nZXRDYXBhYmlsaXRpZXMobGliSW5mbywgRkRLX01QU0RFQyk7CisKKyAgICAgICAgaWYgKCgobXBzQ2FwcyAmIENBUEZfTVBTX0xQKSAmJiAoc2VsZi0+cW1mTW9kZUN1cnIgPT0gTU9ERV9MUCkpIHx8CisgICAgICAgICAgICAoKG1wc0NhcHMgJiBDQVBGX01QU19IUSkgJiYKKyAgICAgICAgICAgICAoc2VsZi0+cW1mTW9kZUN1cnIgPT0KKyAgICAgICAgICAgICAgTU9ERV9IUSkpKSB7IC8qIE1QUyBkZWNvZGVyIGRvZXMgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIG1vZGUuICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gLyogRmFsbC10aHJvdWdoOiAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHNlbGYtPnFtZk1vZGVVc2VyID09IE5PVF9ERUZJTkVEKSB7CisgICAgICAgICAgLyogUmV2ZXJ0IGluIGNhc2UgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9TZXRQYXJhbSgpIGZhaWxzLiAqLworICAgICAgICAgIHNlbGYtPnFtZk1vZGVDdXJyID0KKyAgICAgICAgICAgICAgKHNlbGYtPnFtZk1vZGVDdXJyID09IE1PREVfTFApID8gTU9ERV9IUSA6IE1PREVfTFA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogaW4gY2FzZSBzcGVjaWZpYyBtb2RlIHdhcyByZXF1ZXN0ZWQgd2UgZGlzYWJsZSBNUFMgYW5kIHBsYXlvdXQgdGhlCisgICAgICAgICAgICogZG93bm1peCAqLworICAgICAgICAgIHNlbGYtPm1wc0VuYWJsZUN1cnIgPSAwOworICAgICAgICB9CisgICAgfQorICB9CiAKICAgLyogU2V0IFNCUiB0byBjdXJyZW50IFFNRiBtb2RlLiBFcnJvciBkb2VzIG5vdCBtYXR0ZXIuICovCi0gIHNickRlY29kZXJfU2V0UGFyYW0oc2VsZi0+aFNickRlY29kZXIsIFNCUl9RTUZfTU9ERSwgKHNlbGYtPnFtZk1vZGVDdXJyID09IE1PREVfTFApKTsKLSAgc2VsZi0+cHNQb3NzaWJsZSA9ICgoQ0FOX0RPX1BTKHNlbGYtPnN0cmVhbUluZm8uYW90KSAmJiBzZWxmLT5zdHJlYW1JbmZvLmFhY051bUNoYW5uZWxzID09IDEgJiYgISAoc2VsZi0+ZmxhZ3MgJiBBQ19NUFNfUFJFU0VOVCkpKSAmJiBzZWxmLT5xbWZNb2RlQ3VyciA9PSBNT0RFX0hRIDsKLSAgRkRLX0FTU0VSVCggISAoIChzZWxmLT5mbGFncyAmIEFDX01QU19QUkVTRU5UKSAmJiBzZWxmLT5wc1Bvc3NpYmxlICkgKTsKKyAgc2JyRGVjb2Rlcl9TZXRQYXJhbShzZWxmLT5oU2JyRGVjb2RlciwgU0JSX1FNRl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgIChzZWxmLT5xbWZNb2RlQ3VyciA9PSBNT0RFX0xQKSk7CisgIHNlbGYtPnBzUG9zc2libGUgPQorICAgICAgKChDQU5fRE9fUFMoc2VsZi0+c3RyZWFtSW5mby5hb3QpICYmCisgICAgICAgICFQU19JU19FWFBMSUNJVExZX0RJU0FCTEVEKHNlbGYtPnN0cmVhbUluZm8uYW90LCBzZWxmLT5mbGFnc1swXSkgJiYKKyAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNOdW1DaGFubmVscyA9PSAxICYmCisgICAgICAgICEoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19NUFNfUFJFU0VOVCkpKSAmJgorICAgICAgc2VsZi0+cW1mTW9kZUN1cnIgPT0gTU9ERV9IUTsKKyAgRkRLX0FTU0VSVCghKChzZWxmLT5mbGFnc1swXSAmIEFDX01QU19QUkVTRU5UKSAmJiBzZWxmLT5wc1Bvc3NpYmxlKSk7CiB9CiAKLXZvaWQgQ0FhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpCi17Cit2b2lkIENBYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihIQU5ETEVfQUFDREVDT0RFUiBzZWxmKSB7CisgIGlmIChzZWxmLT5mbGFnc1swXSAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpKSB7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZk1pbihzZWxmLT5hYWNDaGFubmVscywgKDgpKTsgaSsrKSB7CisgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbworICAgICAgICAgICAgICBbaV0pIHsgLyogbnVtYmVyIG9mIGFjdGl2ZSBjaGFubmVscyBjYW4gYmUgc21hbGxlciAqLworICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2ldLT5oQXJDby0+bV9udW1iZXJMaW5lc1ByZXYgPSAwOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKiEKKyAgXGJyaWVmIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBlbGVtZW50IGNoYW5uZWxzCisKKyAgXHR5cGUgIGNoYW5uZWwgdHlwZQorICBcdXNhY1N0ZXJlb0NvbmZpZ0luZGV4ICB1c2FjIHN0ZXJlbyBjb25maWcgaW5kZXgKKworICBccmV0dXJuICBlbGVtZW50IGNoYW5uZWxzCisqLworc3RhdGljIGludCBDQWFjRGVjb2Rlcl9HZXRFTENoYW5uZWxzKE1QNF9FTEVNRU5UX0lEIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgdXNhY1N0ZXJlb0NvbmZpZ0luZGV4KSB7CisgIGludCBlbF9jaGFubmVscyA9IDA7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBJRF9VU0FDX0NQRToKKyAgICAgIGlmICh1c2FjU3RlcmVvQ29uZmlnSW5kZXggPT0gMSkgeworICAgICAgICBlbF9jaGFubmVscyA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbF9jaGFubmVscyA9IDI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElEX0NQRToKKyAgICAgIGVsX2NoYW5uZWxzID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSURfVVNBQ19TQ0U6CisgICAgY2FzZSBJRF9VU0FDX0xGRToKKyAgICBjYXNlIElEX1NDRToKKyAgICBjYXNlIElEX0xGRToKKyAgICAgIGVsX2NoYW5uZWxzID0gMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlbF9jaGFubmVscyA9IDA7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBlbF9jaGFubmVsczsKIH0KIAogLyohCkBAIC0xOTcsMTEgKzMxNyw5IEBACiAKICAgXHJldHVybiAgRXJyb3IgY29kZQogKi8KLXN0YXRpYyBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhUmVzZXQoQ0FuY0RhdGEgKmFuY0RhdGEpCi17CitzdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YVJlc2V0KENBbmNEYXRhICphbmNEYXRhKSB7CiAgIGludCBpOwotICBmb3IgKGk9MDsgaTw4OyBpKyspCi0gIHsKKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogICAgIGFuY0RhdGEtPm9mZnNldFtpXSA9IDA7CiAgIH0KICAgYW5jRGF0YS0+bnJFbGVtZW50cyA9IDA7CkBAIC0yMTgsOCArMzM2LDggQEAKIAogICBccmV0dXJuICBFcnJvciBjb2RlCiAqLwotQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YUluaXQoQ0FuY0RhdGEgKmFuY0RhdGEsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpCi17CitBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhSW5pdChDQW5jRGF0YSAqYW5jRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpIHsKICAgaWYgKHNpemUgPj0gMCkgewogICAgIGFuY0RhdGEtPmJ1ZmZlciA9IGJ1ZmZlcjsKICAgICBhbmNEYXRhLT5idWZmZXJTaXplID0gc2l6ZTsKQEAgLTIzOCwyNyArMzU2LDI2IEBACiAgIFxhbmNEYXRhIFBvaW50ZXIgdG8gYW5jaWxsYXJ5IGRhdGEgc3RydWN0dXJlCiAgIFxpbmRleCBJbmRleCBvZiB0aGUgYW5jIGRhdGEgZWxlbWVudCB0byBnZXQKICAgXHB0ciBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyBhIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBhbmMgZGF0YSBlbGVtZW50Ci0gIFxzaXplIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3RlZCBhbmMgZGF0YSBlbGVtZW50IGluIGJ5dGVzCisgIFxzaXplIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3RlZCBhbmMgZGF0YQorICBlbGVtZW50IGluIGJ5dGVzCiAKICAgXHJldHVybiAgRXJyb3IgY29kZQogKi8KLUFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0FuY0RhdGFHZXQoQ0FuY0RhdGEgKmFuY0RhdGEsIGludCBpbmRleCwgdW5zaWduZWQgY2hhciAqKnB0ciwgaW50ICpzaXplKQoteworQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YUdldChDQW5jRGF0YSAqYW5jRGF0YSwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgZXJyb3IgPSBBQUNfREVDX09LOwogCi0gICpwdHIgID0gTlVMTDsKKyAgKnB0ciA9IE5VTEw7CiAgICpzaXplID0gMDsKIAotICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IDggJiYgaW5kZXggPCBhbmNEYXRhLT5uckVsZW1lbnRzKQotICB7Ci0gICAgKnB0ciAgPSAmYW5jRGF0YS0+YnVmZmVyW2FuY0RhdGEtPm9mZnNldFtpbmRleF1dOwotICAgICpzaXplID0gYW5jRGF0YS0+b2Zmc2V0W2luZGV4KzFdIC0gYW5jRGF0YS0+b2Zmc2V0W2luZGV4XTsKKyAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCA4IC0gMSAmJiBpbmRleCA8IGFuY0RhdGEtPm5yRWxlbWVudHMpIHsKKyAgICAqcHRyID0gJmFuY0RhdGEtPmJ1ZmZlclthbmNEYXRhLT5vZmZzZXRbaW5kZXhdXTsKKyAgICAqc2l6ZSA9IGFuY0RhdGEtPm9mZnNldFtpbmRleCArIDFdIC0gYW5jRGF0YS0+b2Zmc2V0W2luZGV4XTsKICAgfQogCiAgIHJldHVybiBlcnJvcjsKIH0KIAotCiAvKiEKICAgXGJyaWVmIFBhcnNlIGFuY2lsbGFyeSBkYXRhCiAKQEAgLTI2OCw0MCArMzg1LDMyIEBACiAKICAgXHJldHVybiAgRXJyb3IgY29kZQogKi8KLXN0YXRpYwotQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YVBhcnNlICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBbmNEYXRhICphbmNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGFuY0J5dGVzICkKLXsKK3N0YXRpYyBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhUGFyc2UoQ0FuY0RhdGEgKmFuY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGFuY0J5dGVzKSB7CiAgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yID0gQUFDX0RFQ19PSzsKICAgaW50IHJlYWRCeXRlcyA9IDA7CiAKLSAgaWYgKGFuY0RhdGEtPmJ1ZmZlciAhPSBOVUxMKQotICB7CisgIGlmIChhbmNEYXRhLT5idWZmZXIgIT0gTlVMTCkgewogICAgIGlmIChhbmNCeXRlcyA+IDApIHsKICAgICAgIC8qIHdyaXRlIGFuY2lsbGFyeSBkYXRhIHRvIGV4dGVybmFsIGJ1ZmZlciAqLwogICAgICAgaW50IG9mZnNldCA9IGFuY0RhdGEtPm9mZnNldFthbmNEYXRhLT5uckVsZW1lbnRzXTsKIAotICAgICAgaWYgKChvZmZzZXQgKyBhbmNCeXRlcykgPiBhbmNEYXRhLT5idWZmZXJTaXplKQotICAgICAgeworICAgICAgaWYgKChvZmZzZXQgKyBhbmNCeXRlcykgPiBhbmNEYXRhLT5idWZmZXJTaXplKSB7CiAgICAgICAgIGVycm9yID0gQUFDX0RFQ19UT09fU01BTExfQU5DX0JVRkZFUjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFuY0RhdGEtPm5yRWxlbWVudHMgPj0gOC0xKQotICAgICAgeworICAgICAgfSBlbHNlIGlmIChhbmNEYXRhLT5uckVsZW1lbnRzID49IDggLSAxKSB7CiAgICAgICAgIGVycm9yID0gQUFDX0RFQ19UT09fTUFOWV9BTkNfRUxFTUVOVFM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7CisgICAgICB9IGVsc2UgewogICAgICAgICBpbnQgaTsKIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYW5jQnl0ZXM7IGkrKykgewotICAgICAgICAgIGFuY0RhdGEtPmJ1ZmZlcltpK29mZnNldF0gPSBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgICAgIGFuY0RhdGEtPmJ1ZmZlcltpICsgb2Zmc2V0XSA9IEZES3JlYWRCaXRzKGhCcywgOCk7CiAgICAgICAgICAgcmVhZEJ5dGVzKys7CiAgICAgICAgIH0KIAogICAgICAgICBhbmNEYXRhLT5uckVsZW1lbnRzKys7Ci0gICAgICAgIGFuY0RhdGEtPm9mZnNldFthbmNEYXRhLT5uckVsZW1lbnRzXSA9IGFuY0J5dGVzICsgYW5jRGF0YS0+b2Zmc2V0W2FuY0RhdGEtPm5yRWxlbWVudHMtMV07CisgICAgICAgIGFuY0RhdGEtPm9mZnNldFthbmNEYXRhLT5uckVsZW1lbnRzXSA9CisgICAgICAgICAgICBhbmNCeXRlcyArIGFuY0RhdGEtPm9mZnNldFthbmNEYXRhLT5uckVsZW1lbnRzIC0gMV07CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0zMTAsNyArNDE5LDcgQEAKIAogICBpZiAocmVhZEJ5dGVzID4gMCkgewogICAgIC8qIHNraXAgZGF0YSAqLwotICAgIEZES3B1c2hGb3IoaEJzLCByZWFkQnl0ZXM8PDMpOworICAgIEZES3B1c2hGb3IoaEJzLCByZWFkQnl0ZXMgPDwgMyk7CiAgIH0KIAogICByZXR1cm4gZXJyb3I7CkBAIC0zMjMsNzUgKzQzMiw2NyBAQAogCiAgIFxyZXR1cm4gIEVycm9yIGNvZGUKICovCi1zdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IgQ0RhdGFTdHJlYW1FbGVtZW50X1JlYWQgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQUFDREVDT0RFUiAgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgKmVsZW1lbnRJbnN0YW5jZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgIGFsaWdubWVudEFuY2hvciApCi17Ci0gIEhBTkRMRV9UUkFOU1BPUlRERUMgIHBUcDsKLSAgQ0FuY0RhdGEgKmFuY0RhdGE7CitzdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IgQ0RhdGFTdHJlYW1FbGVtZW50X1JlYWQoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZWxlbWVudEluc3RhbmNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYWxpZ25tZW50QW5jaG9yKSB7CiAgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yID0gQUFDX0RFQ19PSzsKLSAgVUlOVCBkYXRhU3RhcnQsIGRzZUJpdHM7CisgIFVJTlQgZHNlQml0czsKKyAgSU5UIGRhdGFTdGFydDsKICAgaW50IGRhdGFCeXRlQWxpZ25GbGFnLCBjb3VudDsKIAogICBGREtfQVNTRVJUKHNlbGYgIT0gTlVMTCk7CiAKLSAgYW5jRGF0YSA9ICZzZWxmLT5hbmNEYXRhOwotICBwVHAgPSBzZWxmLT5oSW5wdXQ7Ci0KLSAgaW50IGNyY1JlZyA9IHRyYW5zcG9ydERlY19DcmNTdGFydFJlZyhwVHAsIDApOworICBpbnQgY3JjUmVnID0gdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnKHNlbGYtPmhJbnB1dCwgMCk7CiAKICAgLyogRWxlbWVudCBJbnN0YW5jZSBUYWcgKi8KLSAgKmVsZW1lbnRJbnN0YW5jZVRhZyA9IEZES3JlYWRCaXRzKGJzLDQpOworICAqZWxlbWVudEluc3RhbmNlVGFnID0gRkRLcmVhZEJpdHMoYnMsIDQpOwogICAvKiBEYXRhIEJ5dGUgQWxpZ24gRmxhZyAqLwotICBkYXRhQnl0ZUFsaWduRmxhZyA9IEZES3JlYWRCaXRzKGJzLDEpOworICBkYXRhQnl0ZUFsaWduRmxhZyA9IEZES3JlYWRCaXRzKGJzLCAxKTsKIAotICBjb3VudCA9IEZES3JlYWRCaXRzKGJzLDgpOworICBjb3VudCA9IEZES3JlYWRCaXRzKGJzLCA4KTsKIAogICBpZiAoY291bnQgPT0gMjU1KSB7Ci0gICAgY291bnQgKz0gRkRLcmVhZEJpdHMoYnMsOCk7IC8qIEVzY0NvdW50ICovCisgICAgY291bnQgKz0gRkRLcmVhZEJpdHMoYnMsIDgpOyAvKiBFc2NDb3VudCAqLwogICB9Ci0gIGRzZUJpdHMgPSBjb3VudCo4OworICBkc2VCaXRzID0gY291bnQgKiA4OwogCiAgIGlmIChkYXRhQnl0ZUFsaWduRmxhZykgewogICAgIEZES2J5dGVBbGlnbihicywgYWxpZ25tZW50QW5jaG9yKTsKICAgfQogCi0gIGRhdGFTdGFydCA9IEZES2dldFZhbGlkQml0cyhicyk7CisgIGRhdGFTdGFydCA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKTsKIAotICBlcnJvciA9IENBYWNEZWNvZGVyX0FuY0RhdGFQYXJzZShhbmNEYXRhLCBicywgY291bnQpOwotICB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKHBUcCwgY3JjUmVnKTsKKyAgZXJyb3IgPSBDQWFjRGVjb2Rlcl9BbmNEYXRhUGFyc2UoJnNlbGYtPmFuY0RhdGEsIGJzLCBjb3VudCk7CisgIHRyYW5zcG9ydERlY19DcmNFbmRSZWcoc2VsZi0+aElucHV0LCBjcmNSZWcpOwogCiAgIHsKLSAgICAvKiBNb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEganVuayAqLwotICAgIEZES3B1c2hCYWNrKGJzLCBkYXRhU3RhcnQtRkRLZ2V0VmFsaWRCaXRzKGJzKSk7CisgICAgLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIGNodW5rICovCisgICAgRkRLcHVzaEJhY2soYnMsIGRhdGFTdGFydCAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSk7CiAKICAgICAvKiBSZWFkIEFuYyBkYXRhIGlmIGF2YWlsYWJsZSAqLwotICAgIGFhY0RlY29kZXJfZHJjTWFya1BheWxvYWQoIHNlbGYtPmhEcmNJbmZvLCBicywgRFZCX0RSQ19BTkNfREFUQSApOworICAgIGFhY0RlY29kZXJfZHJjTWFya1BheWxvYWQoc2VsZi0+aERyY0luZm8sIGJzLCBEVkJfRFJDX0FOQ19EQVRBKTsKICAgfQogCiAgIHsKICAgICBQQ01ETVhfRVJST1IgZG14RXJyID0gUENNRE1YX09LOwogCi0gICAgLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIGp1bmsgKi8KLSAgICBGREtwdXNoQmFjayhicywgZGF0YVN0YXJ0LUZES2dldFZhbGlkQml0cyhicykpOworICAgIC8qIE1vdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSBjaHVuayAqLworICAgIEZES3B1c2hCYWNrKGJzLCBkYXRhU3RhcnQgLSAoSU5UKUZES2dldFZhbGlkQml0cyhicykpOwogCiAgICAgLyogUmVhZCBETVggbWV0YS1kYXRhICovCi0gICAgZG14RXJyID0gcGNtRG14X1BhcnNlICgKLSAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmhQY21VdGlscywKLSAgICAgICAgICAgICAgICAgICAgIGJzLAotICAgICAgICAgICAgICAgICAgICAgZHNlQml0cywKLSAgICAgICAgICAgICAgICAgICAgIDAgLyogbm90IG1wZWcyICovICk7CisgICAgZG14RXJyID0gcGNtRG14X1BhcnNlKHNlbGYtPmhQY21VdGlscywgYnMsIGRzZUJpdHMsIDAgLyogbm90IG1wZWcyICovKTsKKyAgICBpZiAoZXJyb3IgPT0gQUFDX0RFQ19PSyAmJiBkbXhFcnIgIT0gUENNRE1YX09LKSB7CisgICAgICBlcnJvciA9IEFBQ19ERUNfVU5LTk9XTjsKICAgICB9CisgIH0KIAogICAvKiBNb3ZlIHRvIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZWxlbWVudC4gKi8KLSAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIEZES2dldFZhbGlkQml0cyhicyktZGF0YVN0YXJ0K2RzZUJpdHMpOworICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgKElOVClGREtnZXRWYWxpZEJpdHMoYnMpIC0gZGF0YVN0YXJ0ICsgKElOVClkc2VCaXRzKTsKIAogICByZXR1cm4gZXJyb3I7CiB9CiAKLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCiAvKiEKICAgXGJyaWVmIFJlYWQgUHJvZ3JhbSBDb25maWcgRWxlbWVudAogCkBAIC00MDEsMTUgKzUwMiwxNCBAQAogICBcY2hhbm5lbENvbmZpZyBDdXJyZW50IGNoYW5uZWwgY29uZmlndXJhdGlvbgogICBcYWxpZ25BbmNob3IgQW5jaG9yIGZvciBieXRlIGFsaWdubWVudAogCi0gIFxyZXR1cm4gIFBDRSBzdGF0dXMgKC0xOiBmYWlsLCAwOiBubyBuZXcgUENFLCAxOiBQQ0UgdXBkYXRlZCwgMjogUENFIHVwZGF0ZWQgbmVlZCByZS1jb25maWcpLgorICBccmV0dXJuICBQQ0Ugc3RhdHVzICgtMTogZmFpbCwgMDogbm8gbmV3IFBDRSwgMTogUENFIHVwZGF0ZWQsIDI6IFBDRSB1cGRhdGVkCisgIG5lZWQgcmUtY29uZmlnKS4KICovCi1zdGF0aWMgaW50IENQcm9ncmFtQ29uZmlnRWxlbWVudF9SZWFkICgKLSAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICBIQU5ETEVfVFJBTlNQT1JUREVDICBwVHAsCi0gICAgQ1Byb2dyYW1Db25maWcgICAgICAqcGNlLAotICAgIGNvbnN0IFVJTlQgICAgICAgICAgIGNoYW5uZWxDb25maWcsCi0gICAgY29uc3QgVUlOVCAgICAgICAgICAgYWxpZ25BbmNob3IgKQoteworc3RhdGljIGludCBDUHJvZ3JhbUNvbmZpZ0VsZW1lbnRfUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVERFQyBwVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQcm9ncmFtQ29uZmlnICpwY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBhbGlnbkFuY2hvcikgewogICBpbnQgcGNlU3RhdHVzID0gMDsKICAgaW50IGNyY1JlZzsKIApAQCAtNDE3LDcgKzUxNyw2IEBACiAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBQY2UsIENQcm9ncmFtQ29uZmlnLCAxKTsKIAogICBDUHJvZ3JhbUNvbmZpZ19Jbml0KHRtcFBjZSk7Ci0gIENQcm9ncmFtQ29uZmlnX1Jlc2V0KHRtcFBjZSk7CiAKICAgY3JjUmVnID0gdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnKHBUcCwgMCk7CiAKQEAgLTQyNSwzNSArNTI0LDM0IEBACiAKICAgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhwVHAsIGNyY1JlZyk7CiAKLSAgaWYgKCAgQ1Byb2dyYW1Db25maWdfSXNWYWxpZCh0bXBQY2UpCi0gICAgJiYgKHRtcFBjZS0+UHJvZmlsZSA9PSAxKSApCi0gIHsKLSAgICBpZiAoICFwY2UtPmlzVmFsaWQgJiYgKGNoYW5uZWxDb25maWcgPiAwKSApIHsKKyAgaWYgKENQcm9ncmFtQ29uZmlnX0lzVmFsaWQodG1wUGNlKSAmJiAodG1wUGNlLT5Qcm9maWxlID09IDEpKSB7CisgICAgaWYgKCFDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkKHBjZSkgJiYgKGNoYW5uZWxDb25maWcgPiAwKSkgewogICAgICAgLyogQ3JlYXRlIGEgc3RhbmRhcmQgY2hhbm5lbCBjb25maWcgUENFIHRvIGNvbXBhcmUgd2l0aCAqLwotICAgICAgQ1Byb2dyYW1Db25maWdfR2V0RGVmYXVsdCggcGNlLCBjaGFubmVsQ29uZmlnICk7CisgICAgICBDUHJvZ3JhbUNvbmZpZ19HZXREZWZhdWx0KHBjZSwgY2hhbm5lbENvbmZpZyk7CiAgICAgfQogCi0gICAgaWYgKHBjZS0+aXNWYWxpZCkgeworICAgIGlmIChDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkKHBjZSkpIHsKICAgICAgIC8qIENvbXBhcmUgdGhlIG5ldyBhbmQgdGhlIG9sZCBQQ0UgKHRhZ3MgaWdub3JlZCkgKi8KLSAgICAgIHN3aXRjaCAoIENQcm9ncmFtQ29uZmlnX0NvbXBhcmUoIHBjZSwgdG1wUGNlICkgKQotICAgICAgewotICAgICAgY2FzZSAxOiAgLyogQ2hhbm5lbCBjb25maWd1cmF0aW9uIG5vdCBjaGFuZ2VkLiBKdXN0IG5ldyBtZXRhZGF0YS4gKi8KLSAgICAgICAgRkRLbWVtY3B5KHBjZSwgdG1wUGNlLCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsgICAgLyogU3RvcmUgdGhlIGNvbXBsZXRlIFBDRSAqLwotICAgICAgICBwY2VTdGF0dXMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgUENFIGJ1dCBubyBjaGFuZ2Ugb2YgY29uZmlnICovCi0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOiAgLyogVGhlIG51bWJlciBvZiBjaGFubmVscyBhcmUgaWRlbnRpY2FsIGJ1dCBub3QgdGhlIGNvbmZpZyAqLwotICAgICAgICBpZiAoY2hhbm5lbENvbmZpZyA9PSAwKSB7Ci0gICAgICAgICAgRkRLbWVtY3B5KHBjZSwgdG1wUGNlLCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsgIC8qIFN0b3JlIHRoZSBjb21wbGV0ZSBQQ0UgKi8KLSAgICAgICAgICBwY2VTdGF0dXMgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVjb2RlciBuZWVkcyByZS1jb25maWd1cmF0aW9uICovCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIC0xOiAgLyogVGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudCAqLwotICAgICAgICBwY2VTdGF0dXMgPSAtMTsgIC8qIE5vdCBzdXBwb3J0ZWQhICovCi0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAwOiAgLyogTm90aGluZyB0byBkbyBiZWNhdXNlIFBDRSBtYXRjaGVzIHRoZSBvbGQgb25lIGV4YWN0bHkuICovCi0gICAgICBkZWZhdWx0OgotICAgICAgICAvKiBwY2VTdGF0dXMgPSAwOyAqLwotICAgICAgICBicmVhazsKKyAgICAgIHN3aXRjaCAoQ1Byb2dyYW1Db25maWdfQ29tcGFyZShwY2UsIHRtcFBjZSkpIHsKKyAgICAgICAgY2FzZSAxOiAvKiBDaGFubmVsIGNvbmZpZ3VyYXRpb24gbm90IGNoYW5nZWQuIEp1c3QgbmV3IG1ldGFkYXRhLiAqLworICAgICAgICAgIEZES21lbWNweShwY2UsIHRtcFBjZSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENQcm9ncmFtQ29uZmlnKSk7IC8qIFN0b3JlIHRoZSBjb21wbGV0ZSBQQ0UgKi8KKyAgICAgICAgICBwY2VTdGF0dXMgPSAxOyAvKiBOZXcgUENFIGJ1dCBubyBjaGFuZ2Ugb2YgY29uZmlnICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogVGhlIG51bWJlciBvZiBjaGFubmVscyBhcmUgaWRlbnRpY2FsIGJ1dCBub3QgdGhlIGNvbmZpZyAqLworICAgICAgICAgIGlmIChjaGFubmVsQ29uZmlnID09IDApIHsKKyAgICAgICAgICAgIEZES21lbWNweShwY2UsIHRtcFBjZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsgLyogU3RvcmUgdGhlIGNvbXBsZXRlIFBDRSAqLworICAgICAgICAgICAgcGNlU3RhdHVzID0gMjsgLyogRGVjb2RlciBuZWVkcyByZS1jb25maWd1cmF0aW9uICovCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC0xOiAvKiBUaGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50ICovCisgICAgICAgICAgcGNlU3RhdHVzID0gLTE7IC8qIE5vdCBzdXBwb3J0ZWQhICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDogLyogTm90aGluZyB0byBkbyBiZWNhdXNlIFBDRSBtYXRjaGVzIHRoZSBvbGQgb25lIGV4YWN0bHkuICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLyogcGNlU3RhdHVzID0gMDsgKi8KKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTQ2Miw3ICs1NjAsMjQzIEBACiAKICAgcmV0dXJuIHBjZVN0YXR1czsKIH0KLSNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCisKKy8qIQorICBcYnJpZWYgUHJlcGFyZXMgY3Jvc3NmYWRlIGZvciBVU0FDIERBU0ggSVBGIGNvbmZpZyBjaGFuZ2UKKworICBccFRpbWVEYXRhICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGltZSBkYXRhCisgIFxwVGltZURhdGFGbHVzaCAgICAgICAgUG9pbnRlciB0byBmbHVzaGVkIHRpbWUgZGF0YQorICBcbnVtQ2hhbm5lbHMgICAgICAgICAgIE51bWJlciBvZiBjaGFubmVscworICBcZnJhbWVTaXplICAgICAgICAgICAgIFNpemUgb2YgZnJhbWUKKyAgXGludGVybGVhdmVkICAgICAgICAgICBJbmRpY2F0ZXMgaWYgdGltZSBkYXRhIGlzIGludGVybGVhdmVkCisKKyAgXHJldHVybiAgRXJyb3IgY29kZQorKi8KK0xJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9QcmVwYXJlQ3Jvc3NGYWRlKAorICAgIGNvbnN0IElOVF9QQ00gKnBUaW1lRGF0YSwgSU5UX1BDTSAqKnBUaW1lRGF0YUZsdXNoLCBjb25zdCBJTlQgbnVtQ2hhbm5lbHMsCisgICAgY29uc3QgSU5UIGZyYW1lU2l6ZSwgY29uc3QgSU5UIGludGVybGVhdmVkKSB7CisgIGludCBpLCBjaCwgczEsIHMyOworICBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKKworICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfT0s7CisKKyAgaWYgKGludGVybGVhdmVkKSB7CisgICAgczEgPSAxOworICAgIHMyID0gbnVtQ2hhbm5lbHM7CisgIH0gZWxzZSB7CisgICAgczEgPSBmcmFtZVNpemU7CisgICAgczIgPSAxOworICB9CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgbnVtQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBjb25zdCBJTlRfUENNICpwSW4gPSAmcFRpbWVEYXRhW2NoICogczFdOworICAgIGZvciAoaSA9IDA7IGkgPCBUSU1FX0RBVEFfRkxVU0hfU0laRTsgaSsrKSB7CisgICAgICBwVGltZURhdGFGbHVzaFtjaF1baV0gPSAqcEluOworICAgICAgcEluICs9IHMyOworICAgIH0KKyAgfQorCisgIHJldHVybiBFcnJvclN0YXR1czsKK30KKworLyohCisgIFxicmllZiBBcHBsaWVzIGNyb3NzZmFkZSBmb3IgVVNBQyBEQVNIIElQRiBjb25maWcgY2hhbmdlCisKKyAgXHBUaW1lRGF0YSAgICAgICAgICAgICBQb2ludGVyIHRvIHRpbWUgZGF0YQorICBccFRpbWVEYXRhRmx1c2ggICAgICAgIFBvaW50ZXIgdG8gZmx1c2hlZCB0aW1lIGRhdGEKKyAgXG51bUNoYW5uZWxzICAgICAgICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAgXGZyYW1lU2l6ZSAgICAgICAgICAgICBTaXplIG9mIGZyYW1lCisgIFxpbnRlcmxlYXZlZCAgICAgICAgICAgSW5kaWNhdGVzIGlmIHRpbWUgZGF0YSBpcyBpbnRlcmxlYXZlZAorCisgIFxyZXR1cm4gIEVycm9yIGNvZGUKKyovCitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQXBwbHlDcm9zc0ZhZGUoCisgICAgSU5UX1BDTSAqcFRpbWVEYXRhLCBJTlRfUENNICoqcFRpbWVEYXRhRmx1c2gsIGNvbnN0IElOVCBudW1DaGFubmVscywKKyAgICBjb25zdCBJTlQgZnJhbWVTaXplLCBjb25zdCBJTlQgaW50ZXJsZWF2ZWQpIHsKKyAgaW50IGksIGNoLCBzMSwgczI7CisgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzOworCisgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKKworICBpZiAoaW50ZXJsZWF2ZWQpIHsKKyAgICBzMSA9IDE7CisgICAgczIgPSBudW1DaGFubmVsczsKKyAgfSBlbHNlIHsKKyAgICBzMSA9IGZyYW1lU2l6ZTsKKyAgICBzMiA9IDE7CisgIH0KKworICBmb3IgKGNoID0gMDsgY2ggPCBudW1DaGFubmVsczsgY2grKykgeworICAgIElOVF9QQ00gKnBJbiA9ICZwVGltZURhdGFbY2ggKiBzMV07CisgICAgZm9yIChpID0gMDsgaSA8IFRJTUVfREFUQV9GTFVTSF9TSVpFOyBpKyspIHsKKyAgICAgIEZJWFBfU0dMIGFscGhhID0gKEZJWFBfU0dMKWkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKEZSQUNUX0JJVFMgLSAxIC0gVElNRV9EQVRBX0ZMVVNIX1NJWkVfU0YpOworICAgICAgRklYUF9EQkwgdGltZSA9IEZYX1BDTTJGWF9EQkwoKnBJbik7CisgICAgICBGSVhQX0RCTCB0aW1lRmx1c2ggPSBGWF9QQ00yRlhfREJMKHBUaW1lRGF0YUZsdXNoW2NoXVtpXSk7CisKKyAgICAgICpwSW4gPSAoSU5UX1BDTSkoRklYUF9QQ00pRlhfREJMMkZYX1BDTSgKKyAgICAgICAgICB0aW1lRmx1c2ggLSBmTXVsdCh0aW1lRmx1c2gsIGFscGhhKSArIGZNdWx0KHRpbWUsIGFscGhhKSk7CisgICAgICBwSW4gKz0gczI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCisvKiEKKyAgXGJyaWVmIFBhcnNlIFByZVJvbGwgRXh0ZW5zaW9uIFBheWxvYWQKKworICBcc2VsZiAgICAgICAgICAgICBIYW5kbGUgb2YgQUFDIGRlY29kZXIKKyAgXG51bVByZXJvbGxBVSAgICAgTnVtYmVyIG9mIHByZVJvbGwgQVVzCisgIFxwcmVyb2xsQVVPZmZzZXQgIE9mZnNldCB0byBlYWNoIHByZVJvbGwgQVUKKyAgXHByZXJvbGxBVUxlbmd0aCAgTGVuZ3RoIG9mIGVhY2ggcHJlUm9sbCBBVQorCisgIFxyZXR1cm4gIEVycm9yIGNvZGUKKyovCitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfUHJlUm9sbEV4dGVuc2lvblBheWxvYWRQYXJzZSgKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBVSU5UICpudW1QcmVyb2xsQVUsIFVJTlQgKnByZXJvbGxBVU9mZnNldCwKKyAgICBVSU5UICpwcmVyb2xsQVVMZW5ndGgpIHsKKyAgRkRLX0JJVFNUUkVBTSBiczsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzOworICBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKKworICBJTlQgYXVTdGFydEFuY2hvcjsKKyAgVUlOVCBpbmRlcGVuZGVuY3lGbGFnOworICBVSU5UIGV4dFBheWxvYWRQcmVzZW50RmxhZzsKKyAgVUlOVCB1c2VEZWZhdWx0TGVuZ3RoRmxhZzsKKyAgVUlOVCBjb25maWdMZW5ndGggPSAwOworICBVSU5UIHByZVJvbGxQb3NzaWJsZSA9IDE7CisgIFVJTlQgaTsKKyAgVUNIQVIgY29uZmlnQ2hhbmdlZCA9IDA7CisgIFVDSEFSIGNvbmZpZ1tUUF9VU0FDX01BWF9DT05GSUdfTEVOXSA9IHswfTsKKyAgVUNIQVIKKyAgaW1wbGljaXRFeHBsaWNpdENmZ0RpZmYgPSAwOyAvKiBpbiBjYXNlIGltcGxpY2l0IGFuZCBleHBsaWNpdCBjb25maWcgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCBwcmVyb2xsIEFVJ3Mgc2hvdWxkIGJlIHByb2Nlc3NlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGRlY29kZXIgcmVzZXQgKi8KKworICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfT0s7CisKKyAgaEJzID0gdHJhbnNwb3J0RGVjX0dldEJpdHN0cmVhbShzZWxmLT5oSW5wdXQsIDApOworICBicyA9ICpoQnM7CisKKyAgYXVTdGFydEFuY2hvciA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgIGlmIChhdVN0YXJ0QW5jaG9yIDw9IDApIHsKKyAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIEluZGVwZW5kZW5jeSBmbGFnICovCisgIEZES3JlYWRCaXQoaEJzKTsKKworICAvKiBQYXlsb2FkIHByZXNlbnQgZmxhZyBvZiBleHRlbnNpb24gSURfRVhUX0VMRV9BVURJT1BSRVJPTEwgbXVzdCBiZSBvbmUgKi8KKyAgZXh0UGF5bG9hZFByZXNlbnRGbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKCFleHRQYXlsb2FkUHJlc2VudEZsYWcpIHsKKyAgICBwcmVSb2xsUG9zc2libGUgPSAwOworICB9CisKKyAgLyogRGVmYXVsdCBsZW5ndGggZmxhZyBvZiBleHRlbnNpb24gSURfRVhUX0VMRV9BVURJT1BSRVJPTEwgbXVzdCBiZSB6ZXJvICovCisgIHVzZURlZmF1bHRMZW5ndGhGbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKHVzZURlZmF1bHRMZW5ndGhGbGFnKSB7CisgICAgcHJlUm9sbFBvc3NpYmxlID0gMDsKKyAgfQorCisgIGlmIChwcmVSb2xsUG9zc2libGUpIHsgLyogZXh0UGF5bG9hZFByZXNlbnRGbGFnICYmICF1c2VEZWZhdWx0TGVuZ3RoRmxhZyAqLworICAgIC8qIFJlYWQgb3ZlcmFsbCBleHQgcGF5bG9hZCBsZW5ndGgsIHVzZURlZmF1bHRMZW5ndGhGbGFnIG11c3QgYmUgemVyby4gICovCisgICAgZXNjYXBlZFZhbHVlKGhCcywgOCwgMTYsIDApOworCisgICAgLyogUmVhZCBSU1ZENjAgQ29uZmlnIHNpemUgKi8KKyAgICBjb25maWdMZW5ndGggPSBlc2NhcGVkVmFsdWUoaEJzLCA0LCA0LCA4KTsKKworICAgIC8qIEF2b2lkIGRlY29kaW5nIHByZSByb2xsIGZyYW1lcyBpZiB0aGVyZSB3YXMgbm8gY29uZmlnIGNoYW5nZSBhbmQgbm8KKyAgICAgKiBjb25maWcgaXMgaW5jbHVkZWQgaW4gdGhlIHByZSByb2xsIGV4dCBwYXlsb2FkLiAqLworICB9CisKKyAgLyogSWYgcHJlIHJvbGwgbm90IHBvc3NpYmxlIHRoZW4gZXhpdC4gKi8KKyAgaWYgKHByZVJvbGxQb3NzaWJsZSA9PSAwKSB7CisgICAgLyogU2FuaXR5IGNoZWNrOiBpZiBmbHVzaGluZyBpcyBzd2l0Y2hlZCBvbiwgcHJlUm9sbFBvc3NpYmxlIG11c3QgYmUgMSAqLworICAgIGlmIChzZWxmLT5mbHVzaFN0YXR1cyAhPSBBQUNERUNfRkxVU0hfT0ZGKSB7CisgICAgICAvKiBNaXNtYXRjaCBvZiBjdXJyZW50IHBheWxvYWQgYW5kIGZsdXNoaW5nIHN0YXR1cyAqLworICAgICAgc2VsZi0+Zmx1c2hTdGF0dXMgPSBBQUNERUNfRkxVU0hfT0ZGOworICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDKSB7CisgICAgaWYgKGNvbmZpZ0xlbmd0aCA+IDApIHsKKyAgICAgIC8qIERBU0ggSVBGIFVTQUMgQ29uZmlnIENoYW5nZTogUmVhZCBuZXcgY29uZmlnIGFuZCBjb21wYXJlIHdpdGggY3VycmVudAorICAgICAgICogY29uZmlnLiBBcHBseSByZWNvbmZpZ3VyYXRpb24gaWYgY29uZmlnJ3MgYXJlIGRpZmZlcmVudC4gKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWdMZW5ndGg7IGkrKykgeworICAgICAgICBjb25maWdbaV0gPSBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgfQorICAgICAgVFJBTlNQT1JUREVDX0VSUk9SIHRlcnI7CisgICAgICB0ZXJyID0gdHJhbnNwb3J0RGVjX0luQmFuZENvbmZpZyhzZWxmLT5oSW5wdXQsIGNvbmZpZywgY29uZmlnTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+YnVpbGRVcFN0YXR1cywgJmNvbmZpZ0NoYW5nZWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1wbGljaXRFeHBsaWNpdENmZ0RpZmYpOworICAgICAgaWYgKHRlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEZvciB0aGUgZmlyc3QgZnJhbWUgYnVpbGRVcFN0YXR1cyBpcyBub3Qgc2V0IGFuZCBubyBmbHVzaGluZyBpcyBwZXJmb3JtZWQKKyAgICogYnV0IHByZXJvbGwgQVUncyBzaG91bGQgcHJvY2Vzc2VkLiAqLworICAvKiBGb3IgVVNBQyB0aGVyZSBpcyBubyBpZGxlIHN0YXRlLiAqLworICBpZiAoKHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMgPT0gMCkgJiYgIWltcGxpY2l0RXhwbGljaXRDZmdEaWZmICYmCisgICAgICAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDKSkgeworICAgIHNlbGYtPmJ1aWxkVXBTdGF0dXMgPSBBQUNERUNfVVNBQ19CVUlMRF9VUF9PTjsKKyAgICAvKiBzYW5pdHkgY2hlY2s6IGlmIGJ1aWxkVXAgc3RhdHVzIG9uIC0+IGZsdXNoaW5nIG11c3QgYmUgb2ZmICovCisgICAgaWYgKHNlbGYtPmZsdXNoU3RhdHVzICE9IEFBQ0RFQ19GTFVTSF9PRkYpIHsKKyAgICAgIHNlbGYtPmZsdXNoU3RhdHVzID0gQUFDREVDX0ZMVVNIX09GRjsKKyAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworICBpZiAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDKSB7CisgICAgLyogV2UgYXJlIGludGVyZXN0ZWQgaW4gcHJlcm9sbCBBVXMgaWYgYW4gZXhwbGljaXQgb3IgYW4gaW1wbGljaXQgY29uZmlnCisgICAgICogY2hhbmdlIGlzIHNpZ25hbGl6ZWQgaW4gb3RoZXIgd29yZHMgaWYgdGhlIGJ1aWxkIHVwIHN0YXR1cyBpcyBzZXQuICovCisgICAgaWYgKHNlbGYtPmJ1aWxkVXBTdGF0dXMgPT0gQUFDREVDX1VTQUNfQlVJTERfVVBfT04pIHsKKyAgICAgIHNlbGYtPmFwcGx5Q3Jvc3NmYWRlIHw9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgIEZES3JlYWRCaXQoaEJzKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAgIC8qIFJlYWQgbnVtIHByZXJvbGwgQVUncyAqLworICAgICAgKm51bVByZXJvbGxBVSA9IGVzY2FwZWRWYWx1ZShoQnMsIDIsIDQsIDApOworICAgICAgLyogY2hlY2sgbGltaXRzIGZvciBVU0FDICovCisgICAgICBpZiAoKm51bVByZXJvbGxBVSA+IEFBQ0RFQ19NQVhfTlVNX1BSRVJPTExfQVVfVVNBQykgeworICAgICAgICAqbnVtUHJlcm9sbEFVID0gMDsKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8ICpudW1QcmVyb2xsQVU7IGkrKykgeworICAgIC8qIEZvciBldmVyeSBBVSBnZXQgbGVuZ3RoIGFuZCBvZmZzZXQgaW4gdGhlIGJpdHN0cmVhbSAqLworICAgIHByZXJvbGxBVUxlbmd0aFtpXSA9IGVzY2FwZWRWYWx1ZShoQnMsIDE2LCAxNiwgMCk7CisgICAgaWYgKHByZXJvbGxBVUxlbmd0aFtpXSA+IDApIHsKKyAgICAgIHByZXJvbGxBVU9mZnNldFtpXSA9IGF1U3RhcnRBbmNob3IgLSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgICAgIGluZGVwZW5kZW5jeUZsYWcgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICBpZiAoaSA9PSAwICYmICFpbmRlcGVuZGVuY3lGbGFnKSB7CisgICAgICAgICpudW1QcmVyb2xsQVUgPSAwOworICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIEZES3B1c2hGb3IoaEJzLCBwcmVyb2xsQVVMZW5ndGhbaV0gKiA4IC0gMSk7CisgICAgICBzZWxmLT5wcmVyb2xsQVVMZW5ndGhbaV0gPSAocHJlcm9sbEFVTGVuZ3RoW2ldICogOCkgKyBwcmVyb2xsQVVPZmZzZXRbaV07CisgICAgfSBlbHNlIHsKKyAgICAgICpudW1QcmVyb2xsQVUgPSAwOworICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOyAvKiBTb21ldGhpbmcgaXMgd3JvbmcgKi8KKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworYmFpbDoKKworICAqaEJzID0gYnM7CisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQogCiAvKiEKICAgXGJyaWVmIFBhcnNlIEV4dGVuc2lvbiBQYXlsb2FkCkBAIC00NzMsMTQgKzgwNyw5IEBACiAKICAgXHJldHVybiAgRXJyb3IgY29kZQogKi8KLXN0YXRpYwotQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfRXh0UGF5bG9hZFBhcnNlIChIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNF9FTEVNRU5UX0lEIHByZXZpb3VzX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZklzRmlsbEVsZW1lbnQpCi17CitzdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfRXh0UGF5bG9hZFBhcnNlKAorICAgIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50ICpjb3VudCwKKyAgICBNUDRfRUxFTUVOVF9JRCBwcmV2aW91c19lbGVtZW50LCBpbnQgZWxJbmRleCwgaW50IGZJc0ZpbGxFbGVtZW50KSB7CiAgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yID0gQUFDX0RFQ19PSzsKICAgRVhUX1BBWUxPQURfVFlQRSBleHRlbnNpb25fdHlwZTsKICAgaW50IGJ5dGVzID0gKCpjb3VudCkgPj4gMzsKQEAgLTQ5MiwxODIgKzgyMSwyNzQgQEAKICAgICByZXR1cm4gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CiAgIH0KIAotICBleHRlbnNpb25fdHlwZSA9IChFWFRfUEFZTE9BRF9UWVBFKSBGREtyZWFkQml0cyhoQnMsIDQpOyAgICAvKiBic19leHRlbnNpb25fdHlwZSAqLworICBleHRlbnNpb25fdHlwZSA9CisgICAgICAoRVhUX1BBWUxPQURfVFlQRSlGREtyZWFkQml0cyhoQnMsIDQpOyAvKiBic19leHRlbnNpb25fdHlwZSAqLwogICAqY291bnQgLT0gNDsKIAotICBzd2l0Y2ggKGV4dGVuc2lvbl90eXBlKQotICB7Ci0gIGNhc2UgRVhUX0RZTkFNSUNfUkFOR0U6Ci0gICAgewotICAgICAgSU5UIHJlYWRCaXRzID0gYWFjRGVjb2Rlcl9kcmNNYXJrUGF5bG9hZCggc2VsZi0+aERyY0luZm8sIGhCcywgTVBFR19EUkNfRVhUX0RBVEEgKTsKKyAgLyogRm9yIEVMRCwgdGhlIFNCUiBzaWduYWxpbmcgaXMgZXhwbGljaXQgYW5kIHBhcnNlZCBpbgorICAgICBhYWNEZWNvZGVyX1BhcnNlRXhwbGljaXRNcHNBbmRTYnIoKSwgdGhlcmVmb3JlIHNraXAgU0JSIGlmIGltcGxpY2l0CisgICAgIHByZXNlbnQuICovCisgIGlmICgoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19FTEQpICYmICgoZXh0ZW5zaW9uX3R5cGUgPT0gRVhUX1NCUl9EQVRBX0NSQykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHRlbnNpb25fdHlwZSA9PSBFWFRfU0JSX0RBVEEpKSkgeworICAgIGV4dGVuc2lvbl90eXBlID0gRVhUX0ZJTDsgLyogc2tpcCBzYnIgZGF0YSAqLworICB9CiAKLSAgICAgIGlmIChyZWFkQml0cyA+ICpjb3VudCkKLSAgICAgIHsgLyogUmVhZCB0b28gbXVjaC4gU29tZXRoaW5nIHdlbnQgd3JvbmchICovCisgIHN3aXRjaCAoZXh0ZW5zaW9uX3R5cGUpIHsKKyAgICBjYXNlIEVYVF9EWU5BTUlDX1JBTkdFOiB7CisgICAgICBJTlQgcmVhZEJpdHMgPQorICAgICAgICAgIGFhY0RlY29kZXJfZHJjTWFya1BheWxvYWQoc2VsZi0+aERyY0luZm8sIGhCcywgTVBFR19EUkNfRVhUX0RBVEEpOworCisgICAgICBpZiAocmVhZEJpdHMgPiAqY291bnQpIHsgLyogUmVhZCB0b28gbXVjaC4gU29tZXRoaW5nIHdlbnQgd3JvbmchICovCiAgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKICAgICAgIH0KICAgICAgICpjb3VudCAtPSByZWFkQml0czsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEVYVF9VTklfRFJDOiB7CisgICAgICBEUkNfREVDX0VSUk9SIGRyY0VyciA9IERSQ19ERUNfT0s7CisgICAgICBEUkNfREVDX0NPREVDX01PREUgZHJjRGVjQ29kZWNNb2RlID0gRFJDX0RFQ19DT0RFQ19NT0RFX1VOREVGSU5FRDsKKyAgICAgIElOVCBuQml0c1JlbWFpbmluZyA9IEZES2dldFZhbGlkQml0cyhoQnMpOworICAgICAgSU5UIHJlYWRCaXRzOwogCi0KLSAgY2FzZSBFWFRfU0JSX0RBVEFfQ1JDOgotICAgIGNyY0ZsYWcgPSAxOwotICBjYXNlIEVYVF9TQlJfREFUQToKLSAgICBpZiAoSVNfQ0hBTk5FTF9FTEVNRU5UKHByZXZpb3VzX2VsZW1lbnQpKSB7Ci0gICAgICBTQlJfRVJST1Igc2JyRXJyb3I7Ci0KLSAgICAgIENBYWNEZWNvZGVyX1N5bmNRbWZNb2RlKHNlbGYpOwotCi0gICAgICBzYnJFcnJvciA9IHNickRlY29kZXJfSW5pdEVsZW1lbnQoCi0gICAgICAgICAgICAgIHNlbGYtPmhTYnJEZWNvZGVyLAotICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUsCi0gICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZXh0U2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hb3QsCi0gICAgICAgICAgICAgIHByZXZpb3VzX2VsZW1lbnQsCi0gICAgICAgICAgICAgIGVsSW5kZXgKLSAgICAgICAgICAgICAgKTsKLQotICAgICAgaWYgKHNickVycm9yID09IFNCUkRFQ19PSykgewotICAgICAgICBzYnJFcnJvciA9IHNickRlY29kZXJfUGFyc2UgKAotICAgICAgICAgICAgICAgIHNlbGYtPmhTYnJEZWNvZGVyLAotICAgICAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICpjb3VudCwKLSAgICAgICAgICAgICAgICBjcmNGbGFnLAotICAgICAgICAgICAgICAgIHByZXZpb3VzX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgZWxJbmRleCwKLSAgICAgICAgICAgICAgICBzZWxmLT5mbGFncyAmIEFDX0lOREVQICk7Ci0gICAgICAgIC8qIEVuYWJsZSBTQlIgZm9yIGltcGxpY2l0IFNCUiBzaWduYWxsaW5nIGJ1dCBvbmx5IGlmIG5vIHNldmVyZSBlcnJvciBoYXBwZW5kLiAqLwotICAgICAgICBpZiAoIChzYnJFcnJvciA9PSBTQlJERUNfT0spCi0gICAgICAgICAgfHwgKHNickVycm9yID09IFNCUkRFQ19QQVJTRV9FUlJPUikgKSB7Ci0gICAgICAgICAgc2VsZi0+c2JyRW5hYmxlZCA9IDE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIERvIG5vdCB0cnkgdG8gYXBwbHkgU0JSIGJlY2F1c2UgaW5pdGlhbGl6aW5nIHRoZSBlbGVtZW50IGZhaWxlZC4gKi8KLSAgICAgICAgc2VsZi0+c2JyRW5hYmxlZCA9IDA7CisgICAgICBzd2l0Y2ggKHNlbGYtPnN0cmVhbUluZm8uYW90KSB7CisgICAgICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICAgICAgY2FzZSBBT1RfU0JSOgorICAgICAgICBjYXNlIEFPVF9QUzoKKyAgICAgICAgICBkcmNEZWNDb2RlY01vZGUgPSBEUkNfREVDX01QRUdfNF9BQUM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgIH0KLSAgICAgIC8qIENpdGF0aW9uIGZyb20gSVNPL0lFQyAxNDQ5Ni0zIGNoYXB0ZXIgNC41LjIuMS41LjIKLSAgICAgIEZpbGwgZWxlbWVudHMgY29udGFpbmluZyBhbiBleHRlbnNpb25fcGF5bG9hZCgpIHdpdGggYW4gZXh0ZW5zaW9uX3R5cGUgb2YgRVhUX1NCUl9EQVRBCi0gICAgICBvciBFWFRfU0JSX0RBVEFfQ1JDIHNoYWxsIG5vdCBjb250YWluIGFueSBvdGhlciBleHRlbnNpb25fcGF5bG9hZCBvZiBhbnkgb3RoZXIgZXh0ZW5zaW9uX3R5cGUuCi0gICAgICAqLwotICAgICAgaWYgKGZJc0ZpbGxFbGVtZW50KSB7Ci0gICAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgKmNvdW50KTsKKworICAgICAgZHJjRXJyID0gRkRLX2RyY0RlY19TZXRDb2RlY01vZGUoc2VsZi0+aFVuaURyY0RlY29kZXIsIGRyY0RlY0NvZGVjTW9kZSk7CisgICAgICBpZiAoZHJjRXJyKSB7CisgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICBkcmNFcnIgPSBGREtfZHJjRGVjX1JlYWRVbmlEcmMoc2VsZi0+aFVuaURyY0RlY29kZXIsIGhCcyk7CisgICAgICBpZiAoZHJjRXJyKSB7CisgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgcmVhZEJpdHMgPSAoSU5UKW5CaXRzUmVtYWluaW5nIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgICAgIGlmIChyZWFkQml0cyA+ICpjb3VudCkgeyAvKiBSZWFkIHRvbyBtdWNoLiBTb21ldGhpbmcgd2VudCB3cm9uZyEgKi8KKyAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgfQorICAgICAgKmNvdW50IC09IHJlYWRCaXRzOworICAgICAgLyogU2tpcCBhbnkgdHJhaWxpbmcgYml0cyAqLworICAgICAgRkRLcHVzaEZvcihoQnMsICpjb3VudCk7CisgICAgICAqY291bnQgPSAwOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBFWFRfTERTQUNfREFUQToKKyAgICBjYXNlIEVYVF9TQUNfREFUQToKKyAgICAgIC8qIFJlYWQgTVBFRyBTdXJyb3VuZCBFeHRlbnNpb24gcGF5bG9hZCAqLworICAgICAgeworICAgICAgICBpbnQgZXJyLCBtcHNTYW1wbGVSYXRlLCBtcHNGcmFtZVNpemU7CisKKyAgICAgICAgaWYgKHNlbGYtPmZsYWdzWzBdICYgQUNfUFNfUFJFU0VOVCkgeworICAgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKworICAgICAgICAvKiBIYW5kbGUgU0JSIGR1YWwgcmF0ZSBjYXNlICovCisgICAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmV4dFNhbXBsaW5nUmF0ZSAhPSAwKSB7CisgICAgICAgICAgbXBzU2FtcGxlUmF0ZSA9IHNlbGYtPnN0cmVhbUluZm8uZXh0U2FtcGxpbmdSYXRlOworICAgICAgICAgIG1wc0ZyYW1lU2l6ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGUgLworICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1wc1NhbXBsZVJhdGUgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGU7CisgICAgICAgICAgbXBzRnJhbWVTaXplID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgLyogU2V0dGluZyBvZiBpbnRlcm5hbCBNUFMgc3RhdGU7IG1heSBiZSByZXNldCBpbgorICAgICAgICAgICBDQWFjRGVjb2Rlcl9TeW5jUW1mTW9kZSBpZiBkZWNvZGVyIGlzIHVuYWJsZSB0byBkZWNvZGUgd2l0aCB1c2VyCisgICAgICAgICAgIGRlZmluZWQgcW1mTW9kZSAqLworICAgICAgICBpZiAoIShzZWxmLT5mbGFnc1swXSAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfRUxEKSkpIHsKKyAgICAgICAgICBzZWxmLT5tcHNFbmFibGVDdXJyID0gc2VsZi0+bXBzRW5hYmxlVXNlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZi0+bXBzRW5hYmxlQ3VycikgeworICAgICAgICAgIGlmICghc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYucW1mRG9tYWluRXhwbGljaXRDb25maWcpIHsKKyAgICAgICAgICAgIC8qIGlmIG5vdCBkb25lIHlldCwgYWxsb2NhdGUgZnVsbCBNUEVHIFN1cnJvdW5kIGRlY29kZXIgaW5zdGFuY2UgKi8KKyAgICAgICAgICAgIGlmIChtcGVnU3Vycm91bmREZWNvZGVyX0lzRnVsbE1wZWdTdXJyb3VuZERlY29kZXJJbnN0YW5jZUF2YWlsYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIpID09CisgICAgICAgICAgICAgICAgU0FDX0lOU1RBTkNFX05PVF9GVUxMX0FWQUlMQUJMRSkgeworICAgICAgICAgICAgICBpZiAobXBlZ1N1cnJvdW5kRGVjb2Rlcl9PcGVuKAorICAgICAgICAgICAgICAgICAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKikmc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5xbWZEb21haW4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfT1VUX09GX01FTU9SWTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlcnIgPSBtcGVnU3Vycm91bmREZWNvZGVyX1BhcnNlKAorICAgICAgICAgICAgICAoQ01wZWdTdXJyb3VuZERlY29kZXIgKilzZWxmLT5wTXBlZ1N1cnJvdW5kRGVjb2RlciwgaEJzLCBjb3VudCwKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hb3QsIG1wc1NhbXBsZVJhdGUsIG1wc0ZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3NbMF0gJiBBQ19JTkRFUCk7CisgICAgICAgICAgaWYgKGVyciA9PSBNUFNfT0spIHsKKyAgICAgICAgICAgIHNlbGYtPmZsYWdzWzBdIHw9IEFDX01QU19QUkVTRU5UOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFNraXAgYW55IHRyYWlsaW5nIGJ5dGVzICovCisgICAgICAgIEZES3B1c2hGb3IoaEJzLCAqY291bnQpOwogICAgICAgICAqY291bnQgPSAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogSWYgdGhpcyBpcyBub3QgYSBmaWxsIGVsZW1lbnQgd2l0aCBhIGtub3duIGxlbmd0aCwgd2UgYXJlIHNjcmV3ZWQgYW5kIGZ1cnRoZXIgcGFyc2luZyBtYWtlcyBubyBzZW5zZS4gKi8KLSAgICAgICAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykgewotICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOwotICAgICAgICB9CiAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgICBicmVhazsKIAotICBjYXNlIEVYVF9GSUxMX0RBVEE6Ci0gICAgeworICAgIGNhc2UgRVhUX1NCUl9EQVRBX0NSQzoKKyAgICAgIGNyY0ZsYWcgPSAxOworICAgIGNhc2UgRVhUX1NCUl9EQVRBOgorICAgICAgaWYgKElTX0NIQU5ORUxfRUxFTUVOVChwcmV2aW91c19lbGVtZW50KSkgeworICAgICAgICBTQlJfRVJST1Igc2JyRXJyb3I7CisgICAgICAgIFVDSEFSIGNvbmZpZ01vZGUgPSAwOworICAgICAgICBVQ0hBUiBjb25maWdDaGFuZ2VkID0gMDsKKworICAgICAgICBDQWFjRGVjb2Rlcl9TeW5jUW1mTW9kZShzZWxmKTsKKworICAgICAgICBjb25maWdNb2RlIHw9IEFDX0NNX0FMTE9DX01FTTsKKworICAgICAgICBzYnJFcnJvciA9IHNickRlY29kZXJfSW5pdEVsZW1lbnQoCisgICAgICAgICAgICBzZWxmLT5oU2JyRGVjb2Rlciwgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlLAorICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwgc2VsZi0+c3RyZWFtSW5mby5hb3QsCisgICAgICAgICAgICBwcmV2aW91c19lbGVtZW50LCBlbEluZGV4LAorICAgICAgICAgICAgMiwgLyogU2lnbmFsaXplIHRoYXQgaGFybW9uaWNTQlIgc2hhbGwgYmUgaWdub3JlZCBpbiB0aGUgY29uZmlnCisgICAgICAgICAgICAgICAgICBjaGFuZ2UgZGV0ZWN0aW9uICovCisgICAgICAgICAgICAwLCBjb25maWdNb2RlLCAmY29uZmlnQ2hhbmdlZCwgc2VsZi0+ZG93bnNjYWxlRmFjdG9yKTsKKworICAgICAgICBpZiAoc2JyRXJyb3IgPT0gU0JSREVDX09LKSB7CisgICAgICAgICAgc2JyRXJyb3IgPSBzYnJEZWNvZGVyX1BhcnNlKHNlbGYtPmhTYnJEZWNvZGVyLCBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBEcm1Cc0J1ZmZlciwgc2VsZi0+ZHJtQnNCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgKmNvdW50LCBjcmNGbGFnLCBwcmV2aW91c19lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbEluZGV4LCBzZWxmLT5mbGFnc1swXSwgc2VsZi0+ZWxGbGFncyk7CisgICAgICAgICAgLyogRW5hYmxlIFNCUiBmb3IgaW1wbGljaXQgU0JSIHNpZ25hbGxpbmcgYnV0IG9ubHkgaWYgbm8gc2V2ZXJlIGVycm9yCisgICAgICAgICAgICogaGFwcGVuZC4gKi8KKyAgICAgICAgICBpZiAoKHNickVycm9yID09IFNCUkRFQ19PSykgfHwgKHNickVycm9yID09IFNCUkRFQ19QQVJTRV9FUlJPUikpIHsKKyAgICAgICAgICAgIHNlbGYtPnNickVuYWJsZWQgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBEbyBub3QgdHJ5IHRvIGFwcGx5IFNCUiBiZWNhdXNlIGluaXRpYWxpemluZyB0aGUgZWxlbWVudCBmYWlsZWQuICovCisgICAgICAgICAgc2VsZi0+c2JyRW5hYmxlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2l0YXRpb24gZnJvbSBJU08vSUVDIDE0NDk2LTMgY2hhcHRlciA0LjUuMi4xLjUuMgorICAgICAgICBGaWxsIGVsZW1lbnRzIGNvbnRhaW5pbmcgYW4gZXh0ZW5zaW9uX3BheWxvYWQoKSB3aXRoIGFuIGV4dGVuc2lvbl90eXBlCisgICAgICAgIG9mIEVYVF9TQlJfREFUQSBvciBFWFRfU0JSX0RBVEFfQ1JDIHNoYWxsIG5vdCBjb250YWluIGFueSBvdGhlcgorICAgICAgICBleHRlbnNpb25fcGF5bG9hZCBvZiBhbnkgb3RoZXIgZXh0ZW5zaW9uX3R5cGUuCisgICAgICAgICovCisgICAgICAgIGlmIChmSXNGaWxsRWxlbWVudCkgeworICAgICAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgKmNvdW50KTsKKyAgICAgICAgICAqY291bnQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIElmIHRoaXMgaXMgbm90IGEgZmlsbCBlbGVtZW50IHdpdGggYSBrbm93biBsZW5ndGgsIHdlIGFyZSBzY3Jld2VkCisgICAgICAgICAgICogYW5kIGZ1cnRoZXIgcGFyc2luZyBtYWtlcyBubyBzZW5zZS4gKi8KKyAgICAgICAgICBpZiAoc2JyRXJyb3IgIT0gU0JSREVDX09LKSB7CisgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFWFRfRklMTF9EQVRBOiB7CiAgICAgICBpbnQgdGVtcDsKIAotICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKGhCcyw0KTsKKyAgICAgIHRlbXAgPSBGREtyZWFkQml0cyhoQnMsIDQpOwogICAgICAgYnl0ZXMtLTsKICAgICAgIGlmICh0ZW1wICE9IDApIHsKICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIHdoaWxlIChieXRlcyA+IDApIHsKLSAgICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKGhCcyw4KTsKKyAgICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKGhCcywgOCk7CiAgICAgICAgIGJ5dGVzLS07CiAgICAgICAgIGlmICh0ZW1wICE9IDB4YTUpIHsKICAgICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgICpjb3VudCA9IGJ5dGVzPDwzOwotICAgIH0KLSAgICBicmVhazsKKyAgICAgICpjb3VudCA9IGJ5dGVzIDw8IDM7CisgICAgfSBicmVhazsKIAotICBjYXNlIEVYVF9EQVRBX0VMRU1FTlQ6Ci0gICAgeworICAgIGNhc2UgRVhUX0RBVEFfRUxFTUVOVDogewogICAgICAgaW50IGRhdGFFbGVtZW50VmVyc2lvbjsKIAotICAgICAgZGF0YUVsZW1lbnRWZXJzaW9uID0gRkRLcmVhZEJpdHMoaEJzLDQpOworICAgICAgZGF0YUVsZW1lbnRWZXJzaW9uID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKICAgICAgICpjb3VudCAtPSA0OwogICAgICAgaWYgKGRhdGFFbGVtZW50VmVyc2lvbiA9PSAwKSAvKiBBTkNfREFUQSAqLwogICAgICAgewogICAgICAgICBpbnQgdGVtcCwgZGF0YUVsZW1lbnRMZW5ndGggPSAwOwogICAgICAgICBkbyB7Ci0gICAgICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKGhCcyw4KTsKKyAgICAgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKICAgICAgICAgICAqY291bnQgLT0gODsKICAgICAgICAgICBkYXRhRWxlbWVudExlbmd0aCArPSB0ZW1wOwotICAgICAgICB9IHdoaWxlICh0ZW1wID09IDI1NSApOworICAgICAgICB9IHdoaWxlICh0ZW1wID09IDI1NSk7CiAKICAgICAgICAgQ0FhY0RlY29kZXJfQW5jRGF0YVBhcnNlKCZzZWxmLT5hbmNEYXRhLCBoQnMsIGRhdGFFbGVtZW50TGVuZ3RoKTsKLSAgICAgICAgKmNvdW50IC09IChkYXRhRWxlbWVudExlbmd0aDw8Myk7CisgICAgICAgICpjb3VudCAtPSAoZGF0YUVsZW1lbnRMZW5ndGggPDwgMyk7CiAgICAgICB9IGVsc2UgewogICAgICAgICAvKiBhbGlnbiA9IDAgKi8KICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOwogICAgICAgICBnb3RvIGJhaWw7CiAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOworICAgIH0gYnJlYWs7CiAKLSAgY2FzZSBFWFRfREFUQV9MRU5HVEg6Ci0gICAgaWYgKCAhZklzRmlsbEVsZW1lbnQgICAgICAgICAgLyogTWFrZXMgbm8gc2VucyB0byBoYXZlIGFuIGFkZGl0aW9uYWwgbGVuZ3RoIGluIGEgZmlsbCAuLi4gICAqLwotICAgICAgJiYgKHNlbGYtPmZsYWdzICYgQUNfRVIpICkgIC8qIC4uLiBlbGVtZW50IGJlY2F1c2UgdGhpcyBleHRlbnNpb24gcGF5bG9hZCB0eXBlIHdhcyAuLi4gICAgKi8KLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAuLi4gY3JlYXRlZCB0byBjaXJjdW12ZW50IHRoZSBtaXNzaW5nIGxlbmd0aCBpbiBFUi1TeW50YXguICovCi0gICAgICBpbnQgYml0Q250LCBsZW4gPSBGREtyZWFkQml0cyhoQnMsIDQpOwotICAgICAgKmNvdW50IC09IDQ7CisgICAgY2FzZSBFWFRfREFUQV9MRU5HVEg6CisgICAgICBpZiAoIWZJc0ZpbGxFbGVtZW50IC8qIE1ha2VzIG5vIHNlbnMgdG8gaGF2ZSBhbiBhZGRpdGlvbmFsIGxlbmd0aCBpbiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgLi4uICAgKi8KKyAgICAgICAgICAmJgorICAgICAgICAgIChzZWxmLT5mbGFnc1swXSAmCisgICAgICAgICAgIEFDX0VSKSkgLyogLi4uIGVsZW1lbnQgYmVjYXVzZSB0aGlzIGV4dGVuc2lvbiBwYXlsb2FkIHR5cGUgd2FzIC4uLiAqLworICAgICAgeyAvKiAuLi4gY3JlYXRlZCB0byBjaXJjdW12ZW50IHRoZSBtaXNzaW5nIGxlbmd0aCBpbiBFUi1TeW50YXguICovCisgICAgICAgIGludCBiaXRDbnQsIGxlbiA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICAgICpjb3VudCAtPSA0OwogCi0gICAgICBpZiAobGVuID09IDE1KSB7Ci0gICAgICAgIGludCBhZGRfbGVuID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKLSAgICAgICAgKmNvdW50IC09IDg7Ci0gICAgICAgIGxlbiArPSBhZGRfbGVuOworICAgICAgICBpZiAobGVuID09IDE1KSB7CisgICAgICAgICAgaW50IGFkZF9sZW4gPSBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgICAgICpjb3VudCAtPSA4OworICAgICAgICAgIGxlbiArPSBhZGRfbGVuOwogCi0gICAgICAgIGlmIChhZGRfbGVuID09IDI1NSkgewotICAgICAgICAgIGxlbiArPSBGREtyZWFkQml0cyhoQnMsIDE2KTsKLSAgICAgICAgICAqY291bnQgLT0gMTY7CisgICAgICAgICAgaWYgKGFkZF9sZW4gPT0gMjU1KSB7CisgICAgICAgICAgICBsZW4gKz0gRkRLcmVhZEJpdHMoaEJzLCAxNik7CisgICAgICAgICAgICAqY291bnQgLT0gMTY7CisgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGxlbiA8PD0gMzsKKyAgICAgICAgYml0Q250ID0gbGVuOworCisgICAgICAgIGlmICgoRVhUX1BBWUxPQURfVFlQRSlGREtyZWFkQml0cyhoQnMsIDQpID09IEVYVF9EQVRBX0xFTkdUSCkgeworICAgICAgICAgIC8qIENoZWNrIE5PVEUgMjogVGhlIGV4dGVuc2lvbl9wYXlsb2FkKCkgaW5jbHVkZWQgaGVyZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaGF2ZSBleHRlbnNpb25fdHlwZSA9PSBFWFRfREFUQV9MRU5HVEguICovCisgICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiByZXdpbmQgYW5kIGNhbGwgbXlzZWxmIGFnYWluLiAqLworICAgICAgICAgIEZES3B1c2hCYWNrKGhCcywgNCk7CisKKyAgICAgICAgICBlcnJvciA9IENBYWNEZWNvZGVyX0V4dFBheWxvYWRQYXJzZSgKKyAgICAgICAgICAgICAgc2VsZiwgaEJzLCAmYml0Q250LCBwcmV2aW91c19lbGVtZW50LCBlbEluZGV4LAorICAgICAgICAgICAgICAxKTsgLyogVHJlYXQgc2FtZSBhcyBmaWxsIGVsZW1lbnQgKi8KKworICAgICAgICAgICpjb3VudCAtPSBsZW4gLSBiaXRDbnQ7CisgICAgICAgIH0KKyAgICAgICAgLyogTm90ZTogdGhlIGZhbGwgdGhyb3VnaCBpbiBjYXNlIHRoZSBpZiBzdGF0ZW1lbnQgYWJvdmUgaXMgbm90IHRha2VuIGlzCisgICAgICAgICAqIGludGVudGlvbmFsLiAqLworICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIGxlbiA8PD0gMzsKLSAgICAgIGJpdENudCA9IGxlbjsKIAotICAgICAgaWYgKCAoRVhUX1BBWUxPQURfVFlQRSlGREtyZWFkQml0cyhoQnMsIDQpID09IEVYVF9EQVRBX0xFTkdUSCApIHsKLSAgICAgICAgLyogQ2hlY2sgTk9URSAyOiBUaGUgZXh0ZW5zaW9uX3BheWxvYWQoKSBpbmNsdWRlZCBoZXJlIG11c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaGF2ZSBleHRlbnNpb25fdHlwZSA9PSBFWFRfREFUQV9MRU5HVEguICovCi0gICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIHJld2luZCBhbmQgY2FsbCBteXNlbGYgYWdhaW4uICovCi0gICAgICAgIEZES3B1c2hCYWNrKGhCcywgNCk7CisgICAgY2FzZSBFWFRfRklMOgogCi0gICAgICAgIGVycm9yID0KLSAgICAgICAgICBDQWFjRGVjb2Rlcl9FeHRQYXlsb2FkUGFyc2UgKAotICAgICAgICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgICAgICAgJmJpdENudCwKLSAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICBlbEluZGV4LAotICAgICAgICAgICAgICAgICAgMCApOwotCi0gICAgICAgICpjb3VudCAtPSBsZW4gLSBiaXRDbnQ7Ci0gICAgICB9Ci0gICAgICAvKiBOb3RlOiB0aGUgZmFsbCB0aHJvdWdoIGluIGNhc2UgdGhlIGlmIHN0YXRlbWVudCBhYm92ZSBpcyBub3QgdGFrZW4gaXMgaW50ZW50aW9uYWwuICovCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGFsaWduID0gNCAqLworICAgICAgRkRLcHVzaEZvcihoQnMsICpjb3VudCk7CisgICAgICAqY291bnQgPSAwOwogICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGNhc2UgRVhUX0ZJTDoKLQotICBkZWZhdWx0OgotICAgIC8qIGFsaWduID0gNCAqLwotICAgIEZES3B1c2hGb3IoaEJzLCAqY291bnQpOwotICAgICpjb3VudCA9IDA7Ci0gICAgYnJlYWs7CiAgIH0KIAogYmFpbDoKLSAgaWYgKCAoZXJyb3IgIT0gQUFDX0RFQ19PSykKLSAgICAmJiBmSXNGaWxsRWxlbWVudCApCi0gIHsgLyogU2tpcCB0aGUgcmVtYWluaW5nIGV4dGVuc2lvbiBieXRlcyAqLworICBpZiAoKGVycm9yICE9IEFBQ19ERUNfT0spICYmCisgICAgICBmSXNGaWxsRWxlbWVudCkgeyAvKiBTa2lwIHRoZSByZW1haW5pbmcgZXh0ZW5zaW9uIGJ5dGVzICovCiAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoaEJzLCAqY291bnQpOwogICAgICpjb3VudCA9IDA7CiAgICAgLyogUGF0Y2ggZXJyb3IgY29kZSBiZWNhdXNlIGRlY29kaW5nIGNhbiBnbyBvbi4gKi8KQEAgLTY3NywxNSArMTA5OCwxMDcgQEAKICAgcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9QYXJzZUV4cGxpY2l0TXBzQW5kU2JyKAorICAgIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEIHByZXZpb3VzX2VsZW1lbnQsIGNvbnN0IGludCBwcmV2aW91c19lbGVtZW50X2luZGV4LAorICAgIGNvbnN0IGludCBlbGVtZW50X2luZGV4LCBjb25zdCBpbnQgZWxfY250W10pIHsKKyAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOworICBJTlQgYml0Q250ID0gMDsKKworICAvKiBnZXQgdGhlIHJlbWFpbmluZyBiaXRzIG9mIHRoaXMgZnJhbWUgKi8KKyAgYml0Q250ID0gdHJhbnNwb3J0RGVjX0dldEF1Qml0c1JlbWFpbmluZyhzZWxmLT5oSW5wdXQsIDApOworCisgIGlmICgoYml0Q250ID4gMCkgJiYgKHNlbGYtPmZsYWdzWzBdICYgQUNfU0JSX1BSRVNFTlQpICYmCisgICAgICAoc2VsZi0+ZmxhZ3NbMF0gJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX0VMRCB8IEFDX0RSTSkpKSB7CisgICAgU0JSX0VSUk9SIGVyciA9IFNCUkRFQ19PSzsKKyAgICBpbnQgY2hFbElkeCwgbnVtQ2hFbGVtZW50cyA9IGVsX2NudFtJRF9TQ0VdICsgZWxfY250W0lEX0NQRV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxfY250W0lEX0xGRV0gKyBlbF9jbnRbSURfVVNBQ19TQ0VdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsX2NudFtJRF9VU0FDX0NQRV0gKyBlbF9jbnRbSURfVVNBQ19MRkVdOworCisgICAgaWYgKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQykgeworICAgICAgY2hFbElkeCA9IG51bUNoRWxlbWVudHMgLSAxOworICAgIH0gZWxzZSB7CisgICAgICBjaEVsSWR4ID0gMDsgLyogRUxEIGNhc2UgKi8KKyAgICB9CisKKyAgICBmb3IgKDsgY2hFbElkeCA8IG51bUNoRWxlbWVudHM7IGNoRWxJZHggKz0gMSkgeworICAgICAgTVA0X0VMRU1FTlRfSUQgc2JyVHlwZTsKKyAgICAgIGlmIChzZWxmLT5mbGFnc1swXSAmIChBQ19VU0FDKSkgeworICAgICAgICBGREtfQVNTRVJUKChzZWxmLT5lbGVtZW50c1tlbGVtZW50X2luZGV4XSA9PSBJRF9VU0FDX1NDRSkgfHwKKyAgICAgICAgICAgICAgICAgICAoc2VsZi0+ZWxlbWVudHNbZWxlbWVudF9pbmRleF0gPT0gSURfVVNBQ19DUEUpKTsKKyAgICAgICAgc2JyVHlwZSA9IElTX1NURVJFT19TQlIoc2VsZi0+ZWxlbWVudHNbZWxlbWVudF9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnVzYWNTdGVyZW9Db25maWdJbmRleFtlbGVtZW50X2luZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgICA/IElEX0NQRQorICAgICAgICAgICAgICAgICAgICAgIDogSURfU0NFOworICAgICAgfSBlbHNlCisgICAgICAgIHNiclR5cGUgPSBzZWxmLT5lbGVtZW50c1tjaEVsSWR4XTsKKyAgICAgIGVyciA9IHNickRlY29kZXJfUGFyc2Uoc2VsZi0+aFNickRlY29kZXIsIGJzLCBzZWxmLT5wRHJtQnNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmRybUJzQnVmZmVyU2l6ZSwgJmJpdENudCwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzWzBdICYgQUNfU0JSQ1JDLCBzYnJUeXBlLCBjaEVsSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mbGFnc1swXSwgc2VsZi0+ZWxGbGFncyk7CisgICAgICBpZiAoZXJyICE9IFNCUkRFQ19PSykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoIChlcnIpIHsKKyAgICAgIGNhc2UgU0JSREVDX1BBUlNFX0VSUk9SOgorICAgICAgICAvKiBDYW4gbm90IGdvIG9uIHBhcnNpbmcgYmVjYXVzZSB3ZSBkbyBub3QKKyAgICAgICAgICAgIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgU0JSIGV4dGVuc2lvbiBkYXRhLiAqLworICAgICAgICBGREtwdXNoRm9yKGJzLCBiaXRDbnQpOworICAgICAgICBiaXRDbnQgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0JSREVDX09LOgorICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKChiaXRDbnQgPiAwKSAmJiAoc2VsZi0+ZmxhZ3NbMF0gJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCkpKSB7CisgICAgaWYgKChzZWxmLT5mbGFnc1swXSAmIEFDX01QU19QUkVTRU5UKSB8fAorICAgICAgICAoc2VsZi0+ZWxGbGFnc1tlbGVtZW50X2luZGV4XSAmIEFDX0VMX1VTQUNfTVBTMjEyKSkgeworICAgICAgaW50IGVycjsKKworICAgICAgZXJyID0gbXBlZ1N1cnJvdW5kRGVjb2Rlcl9QYXJzZU5vSGVhZGVyKAorICAgICAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKXNlbGYtPnBNcGVnU3Vycm91bmREZWNvZGVyLCBicywgJmJpdENudCwKKyAgICAgICAgICBzZWxmLT5mbGFnc1swXSAmIEFDX0lOREVQKTsKKyAgICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHNlbGYtPmZsYWdzWzBdICYgQUNfRFJNKSB7CisgICAgaWYgKChiaXRDbnQgPSAoSU5UKUZES2dldFZhbGlkQml0cyhicykpICE9IDApIHsKKyAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCBiaXRDbnQpOworICAgIH0KKyAgfQorCisgIGlmICghKHNlbGYtPmZsYWdzWzBdICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19EUk0pKSkgeworICAgIHdoaWxlIChiaXRDbnQgPiA3KSB7CisgICAgICBFcnJvclN0YXR1cyA9IENBYWNEZWNvZGVyX0V4dFBheWxvYWRQYXJzZSgKKyAgICAgICAgICBzZWxmLCBicywgJmJpdENudCwgcHJldmlvdXNfZWxlbWVudCwgcHJldmlvdXNfZWxlbWVudF9pbmRleCwgMCk7CisgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykgeworICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCiAvKiAgU3RyZWFtIENvbmZpZ3VyYXRpb24gYW5kIEluZm9ybWF0aW9uLgogCi0gICAgVGhpcyBjbGFzcyBob2xkcyBjb25maWd1cmF0aW9uIGFuZCBpbmZvcm1hdGlvbiBkYXRhIGZvciBhIHN0cmVhbSB0byBiZSBkZWNvZGVkLiBJdAotICAgIHByb3ZpZGVzIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIGFzIHdlbGwgYXMgdGhlIGRlY29kZXIgd2l0aCBzdWJzdGFudGlhbCBpbmZvcm1hdGlvbiwKLSAgICBlLmcuIHByb2ZpbGUsIHNhbXBsaW5nIHJhdGUsIG51bWJlciBvZiBjaGFubmVscyBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIGV0Yy4KKyAgICBUaGlzIGNsYXNzIGhvbGRzIGNvbmZpZ3VyYXRpb24gYW5kIGluZm9ybWF0aW9uIGRhdGEgZm9yIGEgc3RyZWFtIHRvIGJlCisgICBkZWNvZGVkLiBJdCBwcm92aWRlcyB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiBhcyB3ZWxsIGFzIHRoZSBkZWNvZGVyIHdpdGgKKyAgIHN1YnN0YW50aWFsIGluZm9ybWF0aW9uLCBlLmcuIHByb2ZpbGUsIHNhbXBsaW5nIHJhdGUsIG51bWJlciBvZiBjaGFubmVscworICAgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSBldGMuCiAqLwotc3RhdGljCi12b2lkIENTdHJlYW1JbmZvSW5pdChDU3RyZWFtSW5mbyAqcFN0cmVhbUluZm8pCi17CitzdGF0aWMgdm9pZCBDU3RyZWFtSW5mb0luaXQoQ1N0cmVhbUluZm8gKnBTdHJlYW1JbmZvKSB7CiAgIHBTdHJlYW1JbmZvLT5hYWNTYW1wbGVSYXRlID0gMDsKICAgcFN0cmVhbUluZm8tPnByb2ZpbGUgPSAtMTsKICAgcFN0cmVhbUluZm8tPmFvdCA9IEFPVF9OT05FOwpAQCAtNjk0LDEyICsxMjA3LDEyIEBACiAgIHBTdHJlYW1JbmZvLT5iaXRSYXRlID0gMDsKICAgcFN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSA9IDA7CiAKLSAgcFN0cmVhbUluZm8tPmV4dEFvdCAgPSBBT1RfTk9ORTsKKyAgcFN0cmVhbUluZm8tPmV4dEFvdCA9IEFPVF9OT05FOwogICBwU3RyZWFtSW5mby0+ZXh0U2FtcGxpbmdSYXRlID0gMDsKIAogICBwU3RyZWFtSW5mby0+ZmxhZ3MgPSAwOwogCi0gIHBTdHJlYW1JbmZvLT5lcENvbmZpZyA9IC0xOyAgIC8qIGRlZmF1bHQgaXMgbm8gRVIgKi8KKyAgcFN0cmVhbUluZm8tPmVwQ29uZmlnID0gLTE7IC8qIGRlZmF1bHQ6IG5vIEVSICovCiAKICAgcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzID0gMDsKICAgcFN0cmVhbUluZm8tPnNhbXBsZVJhdGUgPSAwOwpAQCAtNzA4LDIxICsxMjIxLDI0IEBACiAgIHBTdHJlYW1JbmZvLT5vdXRwdXREZWxheSA9IDA7CiAKICAgLyogRFJDICovCi0gIHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHByb2dyYW0gcmVmZXJlbmNlIGxldmVsIHRvIG5vdCBpbmRpY2F0ZWQgKi8KLSAgcFN0cmVhbUluZm8tPmRyY1ByZXNNb2RlID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0OiBwcmVzZW50YXRpb24gbW9kZSBub3QgaW5kaWNhdGVkICovCisgIHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2ID0KKyAgICAgIC0xOyAvKiBzZXQgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgdG8gbm90IGluZGljYXRlZCAqLworICBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGUgPSAtMTsgLyogZGVmYXVsdDogcHJlc2VudGF0aW9uIG1vZGUgbm90IGluZGljYXRlZCAqLwogfQogCiAvKiEKICAgXGJyaWVmIEluaXRpYWxpemF0aW9uIG9mIEFhY0RlY29kZXJDaGFubmVsSW5mbwogCi0gIFRoZSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgcG9pbnRlcnMgdG8gQWFjRGVjb2RlckNoYW5uZWxJbmZvIGZvciBlYWNoIGNoYW5uZWwsCi0gIHNldCB0aGUgc3RhcnQgdmFsdWVzIGZvciB3aW5kb3cgc2hhcGUgYW5kIHdpbmRvdyBzZXF1ZW5jZSBvZiBvdmVybGFwJmFkZCB0byB6ZXJvLAotICBzZXQgdGhlIG92ZXJsYXAgYnVmZmVyIHRvIHplcm8gYW5kIGluaXRpYWxpemVzIHRoZSBwb2ludGVycyB0byB0aGUgd2luZG93IGNvZWZmaWNpZW50cy4KLSAgXHBhcmFtIGJzRm9ybWF0IGlzIHRoZSBmb3JtYXQgb2YgdGhlIEFBQyBiaXRzdHJlYW0KKyAgVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBwb2ludGVycyB0byBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gZm9yIGVhY2gKKyAgY2hhbm5lbCwgc2V0IHRoZSBzdGFydCB2YWx1ZXMgZm9yIHdpbmRvdyBzaGFwZSBhbmQgd2luZG93IHNlcXVlbmNlIG9mCisgIG92ZXJsYXAmYWRkIHRvIHplcm8sIHNldCB0aGUgb3ZlcmxhcCBidWZmZXIgdG8gemVybyBhbmQgaW5pdGlhbGl6ZXMgdGhlCisgIHBvaW50ZXJzIHRvIHRoZSB3aW5kb3cgY29lZmZpY2llbnRzLiBccGFyYW0gYnNGb3JtYXQgaXMgdGhlIGZvcm1hdCBvZiB0aGUgQUFDCisgIGJpdHN0cmVhbQogCiAgIFxyZXR1cm4gIEFBQ0RFQ09ERVIgaW5zdGFuY2UKICovCi1MSU5LU1BFQ19DUFAgSEFORExFX0FBQ0RFQ09ERVIgQ0FhY0RlY29kZXJfT3BlbihUUkFOU1BPUlRfVFlQRSBic0Zvcm1hdCkgICAgLyohPCBiaXRzdHJlYW0gZm9ybWF0IChhZGlmLGFkdHMsbG9hcywuLi4pLiAqLworTElOS1NQRUNfQ1BQIEhBTkRMRV9BQUNERUNPREVSIENBYWNEZWNvZGVyX09wZW4oCisgICAgVFJBTlNQT1JUX1RZUEUgYnNGb3JtYXQpIC8qITwgYml0c3RyZWFtIGZvcm1hdCAoYWRpZixhZHRzLGxvYXMsLi4uKS4gKi8KIHsKICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZjsKIApAQCAtNzMxLDEyICsxMjQ3LDE0IEBACiAgICAgZ290byBiYWlsOwogICB9CiAKLSAgLyogQXNzaWduIGNoYW5uZWwgbWFwcGluZyBpbmZvIGFycmF5cyAoZG9pbmcgc28gcmVtb3ZlcyBkZXBlbmRlbmN5IG9mIHNldHRpbmdzIGhlYWRlciBpbiBBUEkgaGVhZGVyKS4gKi8KKyAgRkRLX1FtZkRvbWFpbl9DbGVhclJlcXVlc3RlZCgmc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYpOworCisgIC8qIEFzc2lnbiBjaGFubmVsIG1hcHBpbmcgaW5mbyBhcnJheXMgKGRvaW5nIHNvIHJlbW92ZXMgZGVwZW5kZW5jeSBvZiBzZXR0aW5ncworICAgKiBoZWFkZXIgaW4gQVBJIGhlYWRlcikuICovCiAgIHNlbGYtPnN0cmVhbUluZm8ucENoYW5uZWxJbmRpY2VzID0gc2VsZi0+Y2hhbm5lbEluZGljZXM7CiAgIHNlbGYtPnN0cmVhbUluZm8ucENoYW5uZWxUeXBlID0gc2VsZi0+Y2hhbm5lbFR5cGU7Ci0KLSAgLyogc2V0IGRlZmF1bHQgb3V0cHV0IG1vZGUgKi8KLSAgc2VsZi0+b3V0cHV0SW50ZXJsZWF2ZWQgPSAxOyAgLyogaW50ZXJsZWF2ZWQgKi8KKyAgc2VsZi0+ZG93bnNjYWxlRmFjdG9yID0gMTsKKyAgc2VsZi0+ZG93bnNjYWxlRmFjdG9ySW5CUyA9IDE7CiAKICAgLyogaW5pdGlhbGl6ZSBhbmMgZGF0YSAqLwogICBDQWFjRGVjb2Rlcl9BbmNEYXRhSW5pdCgmc2VsZi0+YW5jRGF0YSwgTlVMTCwgMCk7CkBAIC03NDQsNzYgKzEyNjIsMjA5IEBACiAgIC8qIGluaXRpYWxpemUgc3RyZWFtIGluZm8gKi8KICAgQ1N0cmVhbUluZm9Jbml0KCZzZWxmLT5zdHJlYW1JbmZvKTsKIAorICAvKiBpbml0aWFsaXplIHByb2dhbSBjb25maWcgKi8KKyAgQ1Byb2dyYW1Db25maWdfSW5pdCgmc2VsZi0+cGNlKTsKKwogICAvKiBpbml0aWFsaXplIGVycm9yIGNvbmNlYWxtZW50IGNvbW1vbiBkYXRhICovCiAgIENDb25jZWFsbWVudF9Jbml0Q29tbW9uRGF0YSgmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEpOworICBzZWxmLT5jb25jZWFsTWV0aG9kVXNlciA9IENvbmNlYWxNZXRob2ROb25lOyAvKiB1bmRlZmluZWQgLT4gYXV0byBtb2RlICovCiAKICAgc2VsZi0+aERyY0luZm8gPSBHZXREcmNJbmZvKCk7CiAgIGlmIChzZWxmLT5oRHJjSW5mbyA9PSBOVUxMKSB7CiAgICAgZ290byBiYWlsOwogICB9CiAgIC8qIEluaXQgY29tbW9uIERSQyBzdHJ1Y3R1cmUgKi8KLSAgYWFjRGVjb2Rlcl9kcmNJbml0KCBzZWxmLT5oRHJjSW5mbyApOworICBhYWNEZWNvZGVyX2RyY0luaXQoc2VsZi0+aERyY0luZm8pOwogICAvKiBTZXQgZGVmYXVsdCBmcmFtZSBkZWxheSAqLwotICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKLSAgICAgICAgICBzZWxmLT5oRHJjSW5mbywKLSAgICAgICAgICBEUkNfQlNfREVMQVksCi0gICAgICAgICAgQ0NvbmNlYWxtZW50X0dldERlbGF5KCZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSkKLSAgICAgICAgKTsKKyAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbShzZWxmLT5oRHJjSW5mbywgRFJDX0JTX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgIENDb25jZWFsbWVudF9HZXREZWxheSgmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEpKTsKIAorICBzZWxmLT53b3JrQnVmZmVyQ29yZTIgPSBHZXRXb3JrQnVmZmVyQ29yZTIoKTsKKyAgaWYgKHNlbGYtPndvcmtCdWZmZXJDb3JlMiA9PSBOVUxMKSBnb3RvIGJhaWw7CiAKLSAgc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTEgPSBHZXRXb3JrQnVmZmVyQ29yZTEoKTsKLSAgc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTIgPSBHZXRXb3JrQnVmZmVyQ29yZTIoKTsKLSAgaWYgKHNlbGYtPmFhY0NvbW1vbkRhdGEud29ya0J1ZmZlckNvcmUxID09IE5VTEwKLSAgICB8fHNlbGYtPmFhY0NvbW1vbkRhdGEud29ya0J1ZmZlckNvcmUyID09IE5VTEwgKQorICAvKiBXaGVuIFJTVkQ2MCBpcyBhY3RpdmUgdXNlIGRlZGljYXRlZCBtZW1vcnkgZm9yIGNvcmUgZGVjb2RpbmcgKi8KKyAgc2VsZi0+cFRpbWVEYXRhMiA9IEdldFdvcmtCdWZmZXJDb3JlNSgpOworICBzZWxmLT50aW1lRGF0YTJTaXplID0gR2V0UmVxdWlyZWRNZW1Xb3JrQnVmZmVyQ29yZTUoKTsKKyAgaWYgKHNlbGYtPnBUaW1lRGF0YTIgPT0gTlVMTCkgewogICAgIGdvdG8gYmFpbDsKKyAgfQogCiAgIHJldHVybiBzZWxmOwogCiBiYWlsOgotICBDQWFjRGVjb2Rlcl9DbG9zZSggc2VsZiApOworICBDQWFjRGVjb2Rlcl9DbG9zZShzZWxmKTsKIAogICByZXR1cm4gTlVMTDsKIH0KIAotLyogRGVzdHJveSBhYWMgZGVjb2RlciAqLwotTElOS1NQRUNfQ1BQIHZvaWQgQ0FhY0RlY29kZXJfQ2xvc2UoSEFORExFX0FBQ0RFQ09ERVIgc2VsZikKLXsKKy8qIFJldmVydCBDQWFjRGVjb2Rlcl9Jbml0KCkgKi8KK3N0YXRpYyB2b2lkIENBYWNEZWNvZGVyX0RlSW5pdChIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdWJTdHJlYW1JbmRleCkgewogICBpbnQgY2g7CisgIGludCBhYWNDaGFubmVsT2Zmc2V0ID0gMCwgYWFjQ2hhbm5lbHMgPSAoOCk7CisgIGludCBudW1FbGVtZW50cyA9ICgoKDgpKSArICg4KSksIGVsZW1lbnRPZmZzZXQgPSAwOwogCi0gIGlmIChzZWxmID09IE5VTEwpCi0gICAgcmV0dXJuOworICBpZiAoc2VsZiA9PSBOVUxMKSByZXR1cm47CiAKLSAgZm9yIChjaD0wOyBjaDwoOCk7IGNoKyspIHsKLSAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0gIT0gTlVMTCkgewotICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5wT3ZlcmxhcEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEZyZWVPdmVybGFwQnVmZmVyICgmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPnBPdmVybGFwQnVmZmVyKTsKKyAgeworICAgIHNlbGYtPmFzY0NoYW5uZWxzWzBdID0gMDsKKyAgICBzZWxmLT5lbGVtZW50c1swXSA9IElEX0VORDsKKyAgfQorCisgIGZvciAoY2ggPSBhYWNDaGFubmVsT2Zmc2V0OyBjaCA8IGFhY0NoYW5uZWxPZmZzZXQgKyBhYWNDaGFubmVsczsgY2grKykgeworICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSAhPSBOVUxMKSB7CisgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21TdGF0aWNEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgLT5wQ29tU3RhdGljRGF0YS0+cFdvcmtCdWZmZXJDb3JlMSAhPSBOVUxMKSB7CisgICAgICAgICAgaWYgKGNoID09IGFhY0NoYW5uZWxPZmZzZXQpIHsKKyAgICAgICAgICAgIEZyZWVXb3JrQnVmZmVyQ29yZTEoJnNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5wQ29tU3RhdGljRGF0YS0+cFdvcmtCdWZmZXJDb3JlMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXQorICAgICAgICAgICAgICAgIC0+cENvbVN0YXRpY0RhdGEtPmNwbHhQcmVkaWN0aW9uRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgRnJlZUNwbHhQcmVkaWN0aW9uRGF0YSgmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5wQ29tU3RhdGljRGF0YS0+Y3BseFByZWRpY3Rpb25EYXRhKTsKKyAgICAgICAgfQorICAgICAgICAvKiBBdm9pZCBkb3VibGUgZnJlZSBvZiBsaW5rZWQgcENvbVN0YXRpY0RhdGEgaW4gY2FzZSBvZiBDUEUgYnkgc2V0dGluZ3MKKyAgICAgICAgICogcG9pbnRlciB0byBOVUxMLiAqLworICAgICAgICBpZiAoY2ggPCAoOCkgLSAxKSB7CisgICAgICAgICAgaWYgKChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoICsgMV0gIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2ggKyAxXS0+cENvbVN0YXRpY0RhdGEgPT0KKyAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tU3RhdGljRGF0YSkpIHsKKyAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2ggKyAxXS0+cENvbVN0YXRpY0RhdGEgPSBOVUxMOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGREtmcmVlKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tU3RhdGljRGF0YSk7CisgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tU3RhdGljRGF0YSA9IE5VTEw7CiAgICAgICB9Ci0gICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0gIT0gTlVMTCkgewotICAgICAgICBGcmVlQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICgmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0pOworICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tRGF0YSAhPSBOVUxMKSB7CisgICAgICAgIC8qIEF2b2lkIGRvdWJsZSBmcmVlIG9mIGxpbmtlZCBwQ29tRGF0YSBpbiBjYXNlIG9mIENQRSBieSBzZXR0aW5ncworICAgICAgICAgKiBwb2ludGVyIHRvIE5VTEwuICovCisgICAgICAgIGlmIChjaCA8ICg4KSAtIDEpIHsKKyAgICAgICAgICBpZiAoKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2ggKyAxXSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCArIDFdLT5wQ29tRGF0YSA9PQorICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21EYXRhKSkgeworICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCArIDFdLT5wQ29tRGF0YSA9IE5VTEw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjaCA9PSBhYWNDaGFubmVsT2Zmc2V0KSB7CisgICAgICAgICAgRnJlZVdvcmtCdWZmZXJDb3JlNigKKyAgICAgICAgICAgICAgKFNDSEFSICoqKSZzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbURhdGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEZES2FmcmVlKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tRGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21EYXRhID0gTlVMTDsKICAgICAgIH0KICAgICB9CisgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdICE9IE5VTEwpIHsKKyAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBGcmVlT3ZlcmxhcEJ1ZmZlcigKKyAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIpOworICAgICAgfQorICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5oQXJDbyAhPSBOVUxMKSB7CisgICAgICAgIENBcmNvX0Rlc3Ryb3koc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmhBckNvKTsKKyAgICAgIH0KKyAgICAgIEZyZWVBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8oJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdKTsKKyAgICB9CiAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdICE9IE5VTEwpIHsKLSAgICAgIEZyZWVBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKCZzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSk7CisgICAgICBGcmVlQWFjRGVjb2RlckNoYW5uZWxJbmZvKCZzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSk7CiAgICAgfQogICB9CiAKKyAgeworICAgIGludCBlbDsKKyAgICBmb3IgKGVsID0gZWxlbWVudE9mZnNldDsgZWwgPCBlbGVtZW50T2Zmc2V0ICsgbnVtRWxlbWVudHM7IGVsKyspIHsKKyAgICAgIGlmIChzZWxmLT5jcGVTdGF0aWNEYXRhW2VsXSAhPSBOVUxMKSB7CisgICAgICAgIEZyZWVDcGVQZXJzaXN0ZW50RGF0YSgmc2VsZi0+Y3BlU3RhdGljRGF0YVtlbF0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEZES19EZWxheV9EZXN0cm95KCZzZWxmLT51c2FjUmVzaWR1YWxEZWxheSk7CisKICAgc2VsZi0+YWFjQ2hhbm5lbHMgPSAwOworICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUgPSAwOworICBzZWxmLT5zdHJlYW1JbmZvLnNhbXBsZVJhdGUgPSAwOworICAvKiBUaGlzIHNhbXBsZXJhdGUgdmFsdWUgaXMgY2hlY2tlZCBmb3IgY29uZmlndXJhdGlvbiBjaGFuZ2UsIG5vdCB0aGUgb3RoZXJzCisgICAqIGFib3ZlLiAqLworICBzZWxmLT5zYW1wbGluZ1JhdGVJbmZvW3N1YlN0cmVhbUluZGV4XS5zYW1wbGluZ1JhdGUgPSAwOworfQorCisvKiEKKyAqIFxicmllZiBDQWFjRGVjb2Rlcl9DdHJsQ0ZHQ2hhbmdlIFNldCBjb25maWcgY2hhbmdlIHBhcmFtZXRlcnMuCisgKgorICogXHBhcmFtIHNlbGYgICAgICAgICAgIFtpXSAgIGhhbmRsZSB0byBBQUNERUNPREVSIHN0cnVjdHVyZQorICogXHBhcmFtIGZsdXNoU3RhdHVzICAgIFtpXSAgIGZsdXNoIHN0YXR1czogb258b2ZmCisgKiBccGFyYW0gZmx1c2hDbnQgICAgICAgW2ldICAgZmx1c2ggZnJhbWUgY291bnRlcgorICogXHBhcmFtIGJ1aWxkVXBTdGF0dXMgIFtpXSAgIGJ1aWxkIHVwIHN0YXR1czogb258b2ZmCisgKiBccGFyYW0gYnVpbGRVcENudCAgICAgW2ldICAgYnVpbGQgdXAgZnJhbWUgY291bnRlcgorICoKKyAqIFxyZXR1cm4gZXJyb3IKKyAqLworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0N0cmxDRkdDaGFuZ2UoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGZsdXNoU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgZmx1c2hDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBidWlsZFVwU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgYnVpbGRVcENudCkgeworICBBQUNfREVDT0RFUl9FUlJPUiBlcnIgPSBBQUNfREVDX09LOworCisgIHNlbGYtPmZsdXNoU3RhdHVzID0gZmx1c2hTdGF0dXM7CisgIHNlbGYtPmZsdXNoQ250ID0gZmx1c2hDbnQ7CisgIHNlbGYtPmJ1aWxkVXBTdGF0dXMgPSBidWlsZFVwU3RhdHVzOworICBzZWxmLT5idWlsZFVwQ250ID0gYnVpbGRVcENudDsKKworICByZXR1cm4gKGVycik7Cit9CisKKy8qIQorICogXGJyaWVmIENBYWNEZWNvZGVyX0ZyZWVNZW0gRnJlZSBjb25maWcgZGVwZW5kZW50IEFBQyBtZW1vcnkuCisgKgorICogXHBhcmFtIHNlbGYgICAgICAgW2ldICAgaGFuZGxlIHRvIEFBQ0RFQ09ERVIgc3RydWN0dXJlCisgKgorICogXHJldHVybiBlcnJvcgorICovCitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfRnJlZU1lbShIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN1YlN0cmVhbUluZGV4KSB7CisgIEFBQ19ERUNPREVSX0VSUk9SIGVyciA9IEFBQ19ERUNfT0s7CisKKyAgQ0FhY0RlY29kZXJfRGVJbml0KHNlbGYsIHN1YlN0cmVhbUluZGV4KTsKKworICByZXR1cm4gKGVycik7Cit9CisKKy8qIERlc3Ryb3kgYWFjIGRlY29kZXIgKi8KK0xJTktTUEVDX0NQUCB2b2lkIENBYWNEZWNvZGVyX0Nsb3NlKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpIHsKKyAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuOworCisgIENBYWNEZWNvZGVyX0RlSW5pdChzZWxmLCAwKTsKKworICB7CisgICAgaW50IGNoOworICAgIGZvciAoY2ggPSAwOyBjaCA8ICg4KTsgY2grKykgeworICAgICAgaWYgKHNlbGYtPnBUaW1lRGF0YUZsdXNoW2NoXSAhPSBOVUxMKSB7CisgICAgICAgIEZyZWVUaW1lRGF0YUZsdXNoKCZzZWxmLT5wVGltZURhdGFGbHVzaFtjaF0pOworICAgICAgfQorICAgIH0KKyAgfQogCiAgIGlmIChzZWxmLT5oRHJjSW5mbykgewogICAgIEZyZWVEcmNJbmZvKCZzZWxmLT5oRHJjSW5mbyk7CiAgIH0KIAotICBpZiAoc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTEgIT0gTlVMTCkgewotICAgIEZyZWVXb3JrQnVmZmVyQ29yZTEgKCZzZWxmLT5hYWNDb21tb25EYXRhLndvcmtCdWZmZXJDb3JlMSk7CisgIC8qIEZyZWUgV29ya0J1ZmZlckNvcmUyICovCisgIGlmIChzZWxmLT53b3JrQnVmZmVyQ29yZTIgIT0gTlVMTCkgeworICAgIEZyZWVXb3JrQnVmZmVyQ29yZTIoJnNlbGYtPndvcmtCdWZmZXJDb3JlMik7CiAgIH0KLSAgaWYgKHNlbGYtPmFhY0NvbW1vbkRhdGEud29ya0J1ZmZlckNvcmUyICE9IE5VTEwpIHsKLSAgICBGcmVlV29ya0J1ZmZlckNvcmUyICgmc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTIpOworICBpZiAoc2VsZi0+cFRpbWVEYXRhMiAhPSBOVUxMKSB7CisgICAgRnJlZVdvcmtCdWZmZXJDb3JlNSgmc2VsZi0+cFRpbWVEYXRhMik7CiAgIH0KIAotICBGcmVlQWFjRGVjb2RlciAoICZzZWxmKTsKKyAgRkRLX1FtZkRvbWFpbl9DbG9zZSgmc2VsZi0+cW1mRG9tYWluKTsKKworICBGcmVlQWFjRGVjb2Rlcigmc2VsZik7CiB9CiAKLQogLyohCiAgIFxicmllZiBJbml0aWFsaXphdGlvbiBvZiBkZWNvZGVyIGluc3RhbmNlCiAKQEAgLTgyMSwzNTcgKzE0NzIsOTgzIEBACiAKICAgXHJldHVybiAgZXJyb3Igc3RhdHVzOiAwIGZvciBzdWNjZXNzLCA8PjAgZm9yIHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zCiAqLwotTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0luaXQoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MpCi17CitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IKK0NBYWNEZWNvZGVyX0luaXQoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MsCisgICAgICAgICAgICAgICAgIFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkKSB7CiAgIEFBQ19ERUNPREVSX0VSUk9SIGVyciA9IEFBQ19ERUNfT0s7Ci0gIElOVCBhc2NDaGFubmVscywgY2gsIGFzY0NoYW5nZWQgPSAwOworICBJTlQgYXNjQ2hhbm5lbHMsIGFzY0NoYW5nZWQgPSAwOworICBBQUNERUNfUkVOREVSX01PREUgaW5pdFJlbmRlck1vZGUgPSBBQUNERUNfUkVOREVSX0lOVkFMSUQ7CisgIFNDSEFSIHVzYWNTdGVyZW9Db25maWdJbmRleCA9IC0xOworICBpbnQgdXNhY1Jlc2lkdWFsRGVsYXlDb21wU2FtcGxlcyA9IDA7CisgIGludCBlbGVtZW50T2Zmc2V0LCBhYWNDaGFubmVsc09mZnNldCwgYWFjQ2hhbm5lbHNPZmZzZXRJZHg7CisgIGNvbnN0IGludCBzdHJlYW1JbmRleCA9IDA7CisgIElOVCBmbHVzaENoYW5uZWxzID0gMDsKIAotICBpZiAoIXNlbGYpCi0gICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgIGlmICghc2VsZikgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisKKyAgVUNIQVIgZG93bnNjYWxlRmFjdG9yID0gc2VsZi0+ZG93bnNjYWxlRmFjdG9yOworICBVQ0hBUiBkb3duc2NhbGVGYWN0b3JJbkJTID0gc2VsZi0+ZG93bnNjYWxlRmFjdG9ySW5CUzsKIAogICAvLyBzZXQgcHJvZmlsZSBhbmQgY2hlY2sgZm9yIHN1cHBvcnRlZCBhb3QKLSAgLy8gbGVhdmUgcHJvZmlsZSBvbiBkZWZhdWx0ICg9LTEpIGZvciBhbGwgb3RoZXIgc3VwcG9ydGVkIE1QRUctNCBhb3QncyBleGNlcHQgYW90PTIgKD1BQUMtTEMpCisgIC8vIGxlYXZlIHByb2ZpbGUgb24gZGVmYXVsdCAoPS0xKSBmb3IgYWxsIG90aGVyIHN1cHBvcnRlZCBNUEVHLTQgYW90J3MgZXhjZXB0CisgIC8vIGFvdD0yICg9QUFDLUxDKQogICBzd2l0Y2ggKGFzYy0+bV9hb3QpIHsKLSAgY2FzZSBBT1RfQUFDX0xDOgotICAgIHNlbGYtPnN0cmVhbUluZm8ucHJvZmlsZSA9IDE7Ci0KLSAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6Ci0gICAgaWYgKGFzYy0+bV9zYy5tX2dhU3BlY2lmaWNDb25maWcubV9sYXllciA+IDApIHsKLSAgICAgIC8qIGFhY19zY2FsYWJsZV9leHRlbnNpb25fZWxlbWVudCgpIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLiAqLwotICAgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOwotICAgIH0KLQotICBjYXNlIEFPVF9TQlI6Ci0gIGNhc2UgQU9UX1BTOgotICBjYXNlIEFPVF9FUl9BQUNfTEQ6Ci0gIGNhc2UgQU9UX0VSX0FBQ19FTEQ6Ci0gIGNhc2UgQU9UX0RSTV9BQUM6Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9BT1Q7CisgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgICAgc2VsZi0+c3RyZWFtSW5mby5wcm9maWxlID0gMTsKKyAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKKyAgICAgIGlmIChhc2MtPm1fc2MubV9nYVNwZWNpZmljQ29uZmlnLm1fbGF5ZXIgPiAwKSB7CisgICAgICAgIC8qIGFhY19zY2FsYWJsZV9leHRlbnNpb25fZWxlbWVudCgpIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLiAqLworICAgICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICB9CisgICAgY2FzZSBBT1RfU0JSOgorICAgIGNhc2UgQU9UX1BTOgorICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgY2FzZSBBT1RfRFJNX0FBQzoKKyAgICBjYXNlIEFPVF9EUk1fU1VSUk9VTkQ6CisgICAgICBpbml0UmVuZGVyTW9kZSA9IEFBQ0RFQ19SRU5ERVJfSU1EQ1Q7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgaW5pdFJlbmRlck1vZGUgPSBBQUNERUNfUkVOREVSX0VMREZCOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBT1RfVVNBQzoKKyAgICAgIGluaXRSZW5kZXJNb2RlID0gQUFDREVDX1JFTkRFUl9JTURDVDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9BT1Q7CiAgIH0KIAotICBDUHJvZ3JhbUNvbmZpZ19Jbml0KCZzZWxmLT5wY2UpOworICBpZiAoQ1Byb2dyYW1Db25maWdfSXNWYWxpZCgmc2VsZi0+cGNlKSAmJiAoYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID4gMCkpIHsKKyAgICAvKiBDb21wYXJlIHRoZSBzdG9yZWQgKG9sZCkgUENFIHdpdGggYSBkZWZhdWx0IFBDRSBjcmVhdGVkIGZyb20gdGhlIChuZXcpCisgICAgICAgY2hhbm5lbF9jb25maWcgKG9uIGEgdGVtcG9yYWwgYnVmZmVyKSB0byBmaW5kIG91dCB3aGV0ZXIgd2UgY2FuIGtlZXAgaXQKKyAgICAgICAoYW5kIGl0cyBtZXRhZGF0YSkgb3Igbm90LiAqLworICAgIGludCBwY2VDbXBSZXN1bHQ7CisgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcFBjZSwgQ1Byb2dyYW1Db25maWcsIDEpOworCisgICAgQ1Byb2dyYW1Db25maWdfR2V0RGVmYXVsdCh0bXBQY2UsIGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbik7CisgICAgcGNlQ21wUmVzdWx0ID0gQ1Byb2dyYW1Db25maWdfQ29tcGFyZSgmc2VsZi0+cGNlLCB0bXBQY2UpOworICAgIGlmICgocGNlQ21wUmVzdWx0IDwgMCkgLyogUmVzZXQgaWYgUENFcyBhcmUgY29tcGxldGVseSBkaWZmZXJlbnQgLi4uICovCisgICAgICAgIHx8CisgICAgICAgIChwY2VDbXBSZXN1bHQgPiAxKSkgeyAvKiAgICAgICAgICAgIC4uLiBvciBoYXZlIGEgZGlmZmVyZW50IGxheW91dC4gKi8KKyAgICAgIENQcm9ncmFtQ29uZmlnX0luaXQoJnNlbGYtPnBjZSk7CisgICAgfSAvKiBPdGhlcndpc2Uga2VlcCB0aGUgUENFIChhbmQgaXRzIG1ldGFkYXRhKS4gKi8KKyAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcFBjZSwgQ1Byb2dyYW1Db25maWcsIDEpOworICB9IGVsc2UgeworICAgIENQcm9ncmFtQ29uZmlnX0luaXQoJnNlbGYtPnBjZSk7CisgIH0KIAogICAvKiBzZXQgY2hhbm5lbHMgKi8KICAgc3dpdGNoIChhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24pIHsKLSAgY2FzZSAwOgotI2lmZGVmIFRQX1BDRV9FTkFCTEUKLSAgICAvKiBnZXQgY2hhbm5lbHMgZnJvbSBwcm9ncmFtIGNvbmZpZyAoQVNDKSAqLwotICAgIGlmIChDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkKCZhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50KSkgewotICAgICAgYXNjQ2hhbm5lbHMgPSBhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50Lk51bUNoYW5uZWxzOwotICAgICAgaWYgKGFzY0NoYW5uZWxzID4gMCkgewotICAgICAgICBpbnQgZWw7Ci0gICAgICAgIC8qIHZhbGlkIG51bWJlciBvZiBjaGFubmVscyAtPiBjb3B5IHByb2dyYW0gY29uZmlnIGVsZW1lbnQgKFBDRSkgZnJvbSBBU0MgKi8KLSAgICAgICAgRkRLbWVtY3B5KCZzZWxmLT5wY2UsICZhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50LCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsKLSAgICAgICAgLyogQnVpbHQgZWxlbWVudCB0YWJsZSAqLwotICAgICAgICBlbCA9IENQcm9ncmFtQ29uZmlnX0dldEVsZW1lbnRUYWJsZSgmYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudCwgc2VsZi0+ZWxlbWVudHMsICg4KSwgJnNlbGYtPmNoTWFwSW5kZXgpOwotICAgICAgICBmb3IgKDsgZWw8KDgpOyBlbCsrKSB7Ci0gICAgICAgICAgc2VsZi0+ZWxlbWVudHNbZWxdID0gSURfTk9ORTsKKyAgICBjYXNlIDA6CisgICAgICBzd2l0Y2ggKGFzYy0+bV9hb3QpIHsKKyAgICAgICAgY2FzZSBBT1RfVVNBQzoKKyAgICAgICAgICBzZWxmLT5jaE1hcEluZGV4ID0gMDsKKyAgICAgICAgICBhc2NDaGFubmVscyA9IGFzYy0+bV9zYy5tX3VzYWNDb25maWcubV9uVXNhY0NoYW5uZWxzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIC8qIGdldCBjaGFubmVscyBmcm9tIHByb2dyYW0gY29uZmlnIChBU0MpICovCisgICAgICAgICAgaWYgKENQcm9ncmFtQ29uZmlnX0lzVmFsaWQoJmFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQpKSB7CisgICAgICAgICAgICBhc2NDaGFubmVscyA9IGFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQuTnVtQ2hhbm5lbHM7CisgICAgICAgICAgICBpZiAoYXNjQ2hhbm5lbHMgPiAwKSB7CisgICAgICAgICAgICAgIGludCBlbF90bXA7CisgICAgICAgICAgICAgIC8qIHZhbGlkIG51bWJlciBvZiBjaGFubmVscyAtPiBjb3B5IHByb2dyYW0gY29uZmlnIGVsZW1lbnQgKFBDRSkKKyAgICAgICAgICAgICAgICogZnJvbSBBU0MgKi8KKyAgICAgICAgICAgICAgRkRLbWVtY3B5KCZzZWxmLT5wY2UsICZhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENQcm9ncmFtQ29uZmlnKSk7CisgICAgICAgICAgICAgIC8qIEJ1aWx0IGVsZW1lbnQgdGFibGUgKi8KKyAgICAgICAgICAgICAgZWxfdG1wID0gQ1Byb2dyYW1Db25maWdfR2V0RWxlbWVudFRhYmxlKAorICAgICAgICAgICAgICAgICAgJmFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQsIHNlbGYtPmVsZW1lbnRzLCAoKCg4KSkgKyAoOCkpLAorICAgICAgICAgICAgICAgICAgJnNlbGYtPmNoTWFwSW5kZXgpOworICAgICAgICAgICAgICBmb3IgKDsgZWxfdG1wIDwgKDMgKiAoKDgpICogMikgKyAoKCg4KSAqIDIpKSAvIDIgKyA0ICogKDEpICsgMSk7CisgICAgICAgICAgICAgICAgICAgZWxfdG1wKyspIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5lbGVtZW50c1tlbF90bXBdID0gSURfTk9ORTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi0+Y2hNYXBJbmRleCA9IDA7CisgICAgICAgICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICBjYXNlIDU6CisgICAgY2FzZSA2OgorICAgICAgYXNjQ2hhbm5lbHMgPSBhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb247CisgICAgICBicmVhazsKKyAgICBjYXNlIDExOgorICAgICAgYXNjQ2hhbm5lbHMgPSA3OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgIGNhc2UgMTI6CisgICAgY2FzZSAxNDoKKyAgICAgIGFzY0NoYW5uZWxzID0gODsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICB9CisKKyAgaWYgKGFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICBmbHVzaENoYW5uZWxzID0gZk1pbihhc2NDaGFubmVscywgKDgpKTsKKyAgICBJTlQgbnVtQ2hhbm5lbDsKKyAgICBwY21EbXhfR2V0UGFyYW0oc2VsZi0+aFBjbVV0aWxzLCBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUywKKyAgICAgICAgICAgICAgICAgICAgJm51bUNoYW5uZWwpOworICAgIGZsdXNoQ2hhbm5lbHMgPSBmTWluKGZNYXgobnVtQ2hhbm5lbCwgZmx1c2hDaGFubmVscyksICg4KSk7CisgIH0KKworICBpZiAoSVNfVVNBQyhhc2MtPm1fYW90KSkgeworICAgIGZvciAoaW50IGVsID0gMDsgZWwgPCAoSU5UKWFzYy0+bV9zYy5tX3VzYWNDb25maWcubV91c2FjTnVtRWxlbWVudHM7IGVsKyspIHsKKyAgICAgIC8qIGZpeCBudW1iZXIgb2YgY29yZSBjaGFubmVscyBha2EgYXNjQ2hhbm5lbHMgZm9yIHN0ZXJlb0NvbmZpZ0luZGV4ID0gMQorICAgICAgICogY2FzZXMgKi8KKyAgICAgIGlmIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbZWxdLm1fc3RlcmVvQ29uZmlnSW5kZXggPT0gMSkgeworICAgICAgICBhc2NDaGFubmVscy0tOyAvKiBzdGVyZW9Db25maWdJbmRleCA9PSAxIHN0ZXJlbyBjYXNlcyBkbyBhY3R1YWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluIG9ubHkgYSBtb25vIGNvcmUgY2hhbm5lbC4gKi8KKyAgICAgIH0gZWxzZSBpZiAoYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5lbGVtZW50W2VsXS5tX3N0ZXJlb0NvbmZpZ0luZGV4ID09IDIpIHsKKyAgICAgICAgLyogSW4gdGhpcyBjYXNlIGl0IGlzIG5lY2Vzc2FyeSB0byBmb2xsb3cgdXAgdGhlIERNWCBzaWduYWwgZGVsYXkgY2F1c2VkCisgICAgICAgICAgIGJ5IEhCRSBhbHNvIHdpdGggdGhlIHJlc2lkdWFsIHNpZ25hbCAoMm5kIGNvcmUgY2hhbm5lbCkuIFRoZSBTQlIKKyAgICAgICAgICAgb3ZlcmxhcCBkZWxheSBpcyBub3QgcmVnYXJkZWQgaGVyZSwgdGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSBNUFMyMTIKKyAgICAgICAgICAgaW1wbGVtZW50YXRpb24uCisgICAgICAgICovCisgICAgICAgIGlmIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbZWxdLm1faGFybW9uaWNTQlIpIHsKKyAgICAgICAgICB1c2FjUmVzaWR1YWxEZWxheUNvbXBTYW1wbGVzICs9IGFzYy0+bV9zYW1wbGVzUGVyRnJhbWU7CiAgICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgICAgICAgIGlmIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLm1fY29yZVNickZyYW1lTGVuZ3RoSW5kZXggPT0gNCkgeworICAgICAgICAgIHVzYWNSZXNpZHVhbERlbGF5Q29tcFNhbXBsZXMgKz0KKyAgICAgICAgICAgICAgNiAqIDE2OyAvKiBkaWZmZXJlbmNlIGJldHdlZW4gMTIgU0JSCisgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcCBzbG90cyBmcm9tIFNCUiBhbmQgNgorICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzIGRlbGF5ZWQgaW4gTVBTMjEyICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBhYWNDaGFubmVsc09mZnNldCA9IDA7CisgIGFhY0NoYW5uZWxzT2Zmc2V0SWR4ID0gMDsKKyAgZWxlbWVudE9mZnNldCA9IDA7CisgIGlmICgoYXNjQ2hhbm5lbHMgPD0gMCkgfHwgKGFzY0NoYW5uZWxzID4gKDgpKSB8fAorICAgICAgKGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA+IEFBQ0RFQ19NQVhfQ0hfQ09ORikpIHsKKyAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICB9CisKKyAgLyogU2V0IHN5bnRheCBmbGFncyAqLworICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gPSAwOworICB7IEZES21lbWNsZWFyKHNlbGYtPmVsRmxhZ3MsIHNpemVvZihzZWxmLT5lbEZsYWdzKSk7IH0KKworICBpZiAoKGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA+IDApIHx8IElTX1VTQUMoYXNjLT5tX2FvdCkpIHsKKyAgICBpZiAoSVNfVVNBQyhhc2MtPm1fYW90KSkgeworICAgICAgLyogY29weSBwb2ludGVyIHRvIHVzYWMgY29uZmlnCisgICAgICAgICh0aGlzIGlzIHByZWxpbWluYXJ5IHNpbmNlIHRoZXJlJ3MgYW4gb25nb2luZyBkaXNjdXNzaW9uIGFib3V0IHN0b3JpbmcKKyAgICAgICAgdGhlIGNvbmZpZy1wYXJ0IG9mIHRoZSBiaXRzdHJlYW0gcmF0aGVyIHRoYW4gdGhlIGNvbXBsZXRlIGRlY29kZWQKKyAgICAgICAgY29uZmlndXJhdGlvbikgKi8KKyAgICAgIHNlbGYtPnBVc2FjQ29uZmlnW3N0cmVhbUluZGV4XSA9ICZhc2MtPm1fc2MubV91c2FjQ29uZmlnOworCisgICAgICAvKiBjb3B5IGxpc3Qgb2YgZWxlbWVudHMgKi8KKyAgICAgIGlmIChzZWxmLT5wVXNhY0NvbmZpZ1tzdHJlYW1JbmRleF0tPm1fdXNhY051bUVsZW1lbnRzID4KKyAgICAgICAgICAoMyAqICgoOCkgKiAyKSArICgoKDgpICogMikpIC8gMiArIDQgKiAoMSkgKyAxKSkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisKKyAgICAgIGlmIChzZWxmLT5udW1Vc2FjRWxlbWVudHNbc3RyZWFtSW5kZXhdICE9CisgICAgICAgICAgYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5tX3VzYWNOdW1FbGVtZW50cykgeworICAgICAgICBhc2NDaGFuZ2VkID0gMTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9BTExPQ19NRU0pIHsKKyAgICAgICAgc2VsZi0+bnVtVXNhY0VsZW1lbnRzW3N0cmVhbUluZGV4XSA9CisgICAgICAgICAgICBhc2MtPm1fc2MubV91c2FjQ29uZmlnLm1fdXNhY051bUVsZW1lbnRzOworICAgICAgfQorCisgICAgICBzZWxmLT5tcHNFbmFibGVDdXJyID0gMDsKKyAgICAgIGZvciAoaW50IF9lbCA9IDA7CisgICAgICAgICAgIF9lbCA8IChpbnQpc2VsZi0+cFVzYWNDb25maWdbc3RyZWFtSW5kZXhdLT5tX3VzYWNOdW1FbGVtZW50czsKKyAgICAgICAgICAgX2VsKyspIHsKKyAgICAgICAgaW50IGVsID0gX2VsICsgZWxlbWVudE9mZnNldDsKKyAgICAgICAgaWYgKHNlbGYtPmVsZW1lbnRzW2VsXSAhPQorICAgICAgICAgICAgc2VsZi0+cFVzYWNDb25maWdbc3RyZWFtSW5kZXhdLT5lbGVtZW50W19lbF0udXNhY0VsZW1lbnRUeXBlKSB7CisgICAgICAgICAgYXNjQ2hhbmdlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlbGYtPnVzYWNTdGVyZW9Db25maWdJbmRleFtlbF0gIT0KKyAgICAgICAgICAgIGFzYy0+bV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFtfZWxdLm1fc3RlcmVvQ29uZmlnSW5kZXgpIHsKKyAgICAgICAgICBhc2NDaGFuZ2VkID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0FMTE9DX01FTSkgeworICAgICAgICAgIHNlbGYtPmVsZW1lbnRzW2VsXSA9CisgICAgICAgICAgICAgIHNlbGYtPnBVc2FjQ29uZmlnW3N0cmVhbUluZGV4XS0+ZWxlbWVudFtfZWxdLnVzYWNFbGVtZW50VHlwZTsKKyAgICAgICAgICAvKiBmb3IgVW5pZmllZCBTdGVyZW8gQ29kaW5nICovCisgICAgICAgICAgc2VsZi0+dXNhY1N0ZXJlb0NvbmZpZ0luZGV4W2VsXSA9CisgICAgICAgICAgICAgIGFzYy0+bV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFtfZWxdLm1fc3RlcmVvQ29uZmlnSW5kZXg7CisgICAgICAgICAgaWYgKHNlbGYtPmVsZW1lbnRzW2VsXSA9PSBJRF9VU0FDX0NQRSkgeworICAgICAgICAgICAgc2VsZi0+bXBzRW5hYmxlQ3VyciB8PSBzZWxmLT51c2FjU3RlcmVvQ29uZmlnSW5kZXhbZWxdID8gMSA6IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2VsZi0+ZWxGbGFnc1tlbF0gfD0KKyAgICAgICAgICAgIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbX2VsXS5tX25vaXNlRmlsbGluZykKKyAgICAgICAgICAgICAgICA/IEFDX0VMX1VTQUNfTk9JU0UKKyAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgIHNlbGYtPmVsRmxhZ3NbZWxdIHw9CisgICAgICAgICAgICAoYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5lbGVtZW50W19lbF0ubV9zdGVyZW9Db25maWdJbmRleCA+IDApCisgICAgICAgICAgICAgICAgPyBBQ19FTF9VU0FDX01QUzIxMgorICAgICAgICAgICAgICAgIDogMDsKKyAgICAgICAgc2VsZi0+ZWxGbGFnc1tlbF0gfD0gKGFzYy0+bV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFtfZWxdLm1faW50ZXJUZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFDX0VMX1VTQUNfSVRFUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgICBzZWxmLT5lbEZsYWdzW2VsXSB8PQorICAgICAgICAgICAgKGFzYy0+bV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFtfZWxdLm1fcHZjKSA/IEFDX0VMX1VTQUNfUFZDIDogMDsKKyAgICAgICAgc2VsZi0+ZWxGbGFnc1tlbF0gfD0KKyAgICAgICAgICAgIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbX2VsXS51c2FjRWxlbWVudFR5cGUgPT0gSURfVVNBQ19MRkUpCisgICAgICAgICAgICAgICAgPyBBQ19FTF9VU0FDX0xGRQorICAgICAgICAgICAgICAgIDogMDsKKyAgICAgICAgc2VsZi0+ZWxGbGFnc1tlbF0gfD0KKyAgICAgICAgICAgIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbX2VsXS51c2FjRWxlbWVudFR5cGUgPT0gSURfVVNBQ19MRkUpCisgICAgICAgICAgICAgICAgPyBBQ19FTF9MRkUKKyAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgIGlmICgoYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5lbGVtZW50W19lbF0udXNhY0VsZW1lbnRUeXBlID09CisgICAgICAgICAgICAgSURfVVNBQ19DUEUpICYmCisgICAgICAgICAgICAoKHNlbGYtPnVzYWNTdGVyZW9Db25maWdJbmRleFtlbF0gPT0gMCkpKSB7CisgICAgICAgICAgc2VsZi0+ZWxGbGFnc1tlbF0gfD0gQUNfRUxfVVNBQ19DUF9QT1NTSUJMRTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBzZWxmLT5oYXNBdWRpb1ByZVJvbGwgPSAwOworICAgICAgaWYgKHNlbGYtPnBVc2FjQ29uZmlnW3N0cmVhbUluZGV4XS0+bV91c2FjTnVtRWxlbWVudHMpIHsKKyAgICAgICAgc2VsZi0+aGFzQXVkaW9QcmVSb2xsID0gYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5lbGVtZW50WzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0RWxlbWVudC51c2FjRXh0RWxlbWVudEhhc0F1ZGlvUHJlUm9sbDsKKyAgICAgIH0KKyAgICAgIGlmIChjb25maWdNb2RlICYgQUNfQ01fQUxMT0NfTUVNKSB7CisgICAgICAgIHNlbGYtPmVsZW1lbnRzW2VsZW1lbnRPZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wVXNhY0NvbmZpZ1tzdHJlYW1JbmRleF0tPm1fdXNhY051bUVsZW1lbnRzXSA9CisgICAgICAgICAgICBJRF9FTkQ7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIHNlbGYtPmNoTWFwSW5kZXggPSAwOwotICAgICAgaWYgKHRyYW5zcG9ydERlY19HZXRGb3JtYXQoc2VsZi0+aElucHV0KSA9PSBUVF9NUDRfQURUUykgewotICAgICAgICAvKiBzZXQgZGVmYXVsdCBtYXhfY2hhbm5lbHMgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGJlY2F1c2UgaW4gaW1wbGljaXQgY2hhbm5lbCBtYXBwaW5nIG1vZGUKLSAgICAgICAgICAgd2UgZG9uJ3Qga25vdyB0aGUgYWN0dWFsIG51bWJlciBvZiBjaGFubmVscyB1bnRpbCB3ZSBwcm9jZXNzZWQgYXQgbGVhc3Qgb25lIHJhd19kYXRhX2Jsb2NrKCkuICovCi0gICAgICAgIGFzY0NoYW5uZWxzID0gKDgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgICAgIC8qIEluaXRpYWxpemUgY29uc3RhbnQgbWFwcGluZ3MgZm9yIGNoYW5uZWwgY29uZmlnIDEtNyAqLworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgQUFDREVDX0NIX0VMRU1FTlRTX1RBQl9TSVpFOyBpKyspIHsKKyAgICAgICAgc2VsZi0+ZWxlbWVudHNbaV0gPSBlbGVtZW50c1RhYlthc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gLSAxXVtpXTsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBpIDwgKDMgKiAoKDgpICogMikgKyAoKCg4KSAqIDIpKSAvIDIgKyA0ICogKDEpICsgMSk7IGkrKykgeworICAgICAgICBzZWxmLT5lbGVtZW50c1tpXSA9IElEX05PTkU7CiAgICAgICB9CiAgICAgfQotI2Vsc2UgLyogVFBfUENFX0VOQUJMRSAqLwotICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7Ci0jZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLwotICAgIGJyZWFrOwotICBjYXNlIDE6IGNhc2UgMjogY2FzZSAzOiBjYXNlIDQ6IGNhc2UgNTogY2FzZSA2OgotICAgIGFzY0NoYW5uZWxzID0gYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uOwotICAgIGJyZWFrOwotICBjYXNlIDExOgotICAgIGFzY0NoYW5uZWxzID0gNzsKLSAgICBicmVhazsKLSAgY2FzZSA3OiBjYXNlIDEyOiBjYXNlIDE0OgotICAgIGFzY0NoYW5uZWxzID0gODsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOwotICB9CiAKLSAgaWYgKGFzY0NoYW5uZWxzID4gKDgpKSB7Ci0gICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKLSAgfQorICAgIHsKKyAgICAgIGludCBjaDsKIAotICAvKiBJbml0aWFsaXplIGNvbnN0YW50IG1hcHBpbmdzIGZvciBjaGFubmVsIGNvbmZpZyAxLTcgKi8KLSAgaWYgKGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA+IDApIHsKLSAgICBpbnQgZWw7Ci0gICAgRkRLbWVtY3B5KHNlbGYtPmVsZW1lbnRzLCBlbGVtZW50c1RhYlthc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24tMV0sIHNpemVvZihNUDRfRUxFTUVOVF9JRCkqRkRLbWluKDcsKDgpKSk7Ci0gICAgZm9yIChlbD03OyBlbDwoOCk7IGVsKyspIHsKLSAgICAgIHNlbGYtPmVsZW1lbnRzW2VsXSA9IElEX05PTkU7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBhc2NDaGFubmVsczsgY2grKykgeworICAgICAgICBzZWxmLT5jaE1hcHBpbmdbY2hdID0gY2g7CisgICAgICB9CisgICAgICBmb3IgKDsgY2ggPCAoOCk7IGNoKyspIHsKKyAgICAgICAgc2VsZi0+Y2hNYXBwaW5nW2NoXSA9IDI1NTsKKyAgICAgIH0KICAgICB9Ci0gICAgZm9yIChjaD0wOyBjaDxhc2NDaGFubmVsczsgY2grKykgewotICAgICAgc2VsZi0+Y2hNYXBwaW5nW2NoXSA9IGNoOwotICAgIH0KLSAgICBmb3IgKDsgY2g8KDgpOyBjaCsrKSB7Ci0gICAgICBzZWxmLT5jaE1hcHBpbmdbY2hdID0gMjU1OwotICAgIH0KKwogICAgIHNlbGYtPmNoTWFwSW5kZXggPSBhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb247Ci0gIH0KLSAjaWZkZWYgVFBfUENFX0VOQUJMRQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBpZiAoQ1Byb2dyYW1Db25maWdfSXNWYWxpZCgmYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudCkpIHsKICAgICAgIC8qIFNldCBtYXRyaXggbWl4ZG93biBpbmZvcyBpZiBhdmFpbGFibGUgZnJvbSBQQ0UuICovCi0gICAgICBwY21EbXhfU2V0TWF0cml4TWl4ZG93bkZyb21QY2UgKCBzZWxmLT5oUGNtVXRpbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50Lk1hdHJpeE1peGRvd25JbmRleFByZXNlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50Lk1hdHJpeE1peGRvd25JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQuUHNldWRvU3Vycm91bmRFbmFibGUgKTsKKyAgICAgIHBjbURteF9TZXRNYXRyaXhNaXhkb3duRnJvbVBjZSgKKyAgICAgICAgICBzZWxmLT5oUGNtVXRpbHMsIGFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQuTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCwKKyAgICAgICAgICBhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50Lk1hdHJpeE1peGRvd25JbmRleCwKKyAgICAgICAgICBhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50LlBzZXVkb1N1cnJvdW5kRW5hYmxlKTsKICAgICB9CiAgIH0KLSAjZW5kaWYKIAogICBzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcgPSBhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb247CiAKICAgaWYgKHNlbGYtPnN0cmVhbUluZm8uYW90ICE9IGFzYy0+bV9hb3QpIHsKLSAgICBzZWxmLT5zdHJlYW1JbmZvLmFvdCA9IGFzYy0+bV9hb3Q7CisgICAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9BTExPQ19NRU0pIHsKKyAgICAgIHNlbGYtPnN0cmVhbUluZm8uYW90ID0gYXNjLT5tX2FvdDsKKyAgICB9CiAgICAgYXNjQ2hhbmdlZCA9IDE7CiAgIH0KIAotICBpZiAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgIT0gKElOVClhc2MtPm1fc2FtcGxlc1BlckZyYW1lKSB7Ci0gICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgPSBhc2MtPm1fc2FtcGxlc1BlckZyYW1lOworICBpZiAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0VMRCAmJgorICAgICAgYXNjLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV9kb3duc2NhbGVkU2FtcGxpbmdGcmVxdWVuY3kgIT0gMCkgeworICAgIGlmIChzZWxmLT5zYW1wbGluZ1JhdGVJbmZvWzBdLnNhbXBsaW5nUmF0ZSAhPQorICAgICAgICAgICAgYXNjLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV9kb3duc2NhbGVkU2FtcGxpbmdGcmVxdWVuY3kgfHwKKyAgICAgICAgc2VsZi0+c2FtcGxpbmdSYXRlSW5mb1swXS5zYW1wbGluZ1JhdGUgKiBzZWxmLT5kb3duc2NhbGVGYWN0b3IgIT0KKyAgICAgICAgICAgIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSkgeworICAgICAgLyogZ2V0IGRvd25zY2FsZWRTYW1wbGluZ0ZyZXF1ZW5jeSBmcm9tIEVTQyBhbmQgY29tcHV0ZSB0aGUgZG93bnNjYWxlCisgICAgICAgKiBmYWN0b3IgKi8KKyAgICAgIGRvd25zY2FsZUZhY3RvckluQlMgPQorICAgICAgICAgIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSAvCisgICAgICAgICAgYXNjLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV9kb3duc2NhbGVkU2FtcGxpbmdGcmVxdWVuY3k7CisgICAgICBpZiAoZG93bnNjYWxlRmFjdG9ySW5CUyA9PSAxIHx8IGRvd25zY2FsZUZhY3RvckluQlMgPT0gMiB8fAorICAgICAgICAgIGRvd25zY2FsZUZhY3RvckluQlMgPT0gMyB8fCBkb3duc2NhbGVGYWN0b3JJbkJTID09IDQpIHsKKyAgICAgICAgZG93bnNjYWxlRmFjdG9yID0gZG93bnNjYWxlRmFjdG9ySW5CUzsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZG93bnNjYWxlRmFjdG9ySW5CUyA9IDE7CisgICAgZG93bnNjYWxlRmFjdG9yID0gMTsKKyAgfQorCisgIGlmIChzZWxmLT5kb3duc2NhbGVGYWN0b3JJbkJTICE9IGRvd25zY2FsZUZhY3RvckluQlMpIHsKKyAgICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0FMTE9DX01FTSkgeworICAgICAgc2VsZi0+ZG93bnNjYWxlRmFjdG9ySW5CUyA9IGRvd25zY2FsZUZhY3RvckluQlM7CisgICAgICBzZWxmLT5kb3duc2NhbGVGYWN0b3IgPSBkb3duc2NhbGVGYWN0b3I7CisgICAgfQogICAgIGFzY0NoYW5nZWQgPSAxOwogICB9CiAKLSAgc2VsZi0+c3RyZWFtSW5mby5iaXRSYXRlICAgICAgICAgICAgPSAwOworICBpZiAoKElOVClhc2MtPm1fc2FtcGxlc1BlckZyYW1lICUgZG93bnNjYWxlRmFjdG9yICE9IDApIHsKKyAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9TQU1QTElOR1JBVEU7IC8qIGZyYW1lU2l6ZS9kc2YgbXVzdCBiZSBhbiBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgKi8KKyAgfQogCi0gIC8qIFNldCBzeW50YXggZmxhZ3MgKi8KLSAgc2VsZi0+ZmxhZ3MgPSAwOwotCi0gIHNlbGYtPnN0cmVhbUluZm8uZXh0QW90ICAgICAgICAgICAgICAgPSBhc2MtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlOwotICBzZWxmLT5zdHJlYW1JbmZvLmV4dFNhbXBsaW5nUmF0ZSAgICAgID0gYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5OwotICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX3NiclByZXNlbnRGbGFnKSA/IEFDX1NCUl9QUkVTRU5UIDogMDsKLSAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9wc1ByZXNlbnRGbGFnKSA/IEFDX1BTX1BSRVNFTlQgOiAwOwotICBzZWxmLT5zYnJFbmFibGVkID0gMDsKLQotICAvKiAtLS0tLS0tLS0gdmNiMTEgLS0tLS0tLS0tLS0tICovCi0gIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fdmNiMTFGbGFnKSA/IEFDX0VSX1ZDQjExIDogMDsKLQotICAvKiAtLS0tLS0tLS0tIHJ2bGMgLS0tLS0tLS0tLS0tICovCi0gIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fcnZsY0ZsYWcpID8gQUNfRVJfUlZMQyA6IDA7Ci0KLSAgLyogLS0tLS0tLS0tLS0gaGNyIC0tLS0tLS0tLS0tLSAqLwotICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX2hjckZsYWcpID8gQUNfRVJfSENSIDogMDsKKyAgc2VsZi0+c3RyZWFtSW5mby5iaXRSYXRlID0gMDsKIAogICBpZiAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0VMRCkgewotICAgIHNlbGYtPmZsYWdzIHw9ICBBQ19FTEQ7Ci0gICAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9zYnJQcmVzZW50RmxhZykgPyBBQ19TQlJfUFJFU0VOVCA6IDA7ICAvKiBOZWVkIHRvIHNldCB0aGUgU0JSIGZsYWcgZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbnMuIEV2ZW4gaWYgU0JSIGlzIG5vdCBzdXBwb3J0ZWQuICovCi0gICAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fc2JyQ3JjRmxhZykgPyBBQ19TQlJDUkMgOiAwOwotICAgIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fc2MubV9lbGRTcGVjaWZpY0NvbmZpZy5tX3VzZUxkUW1mVGltZUFsaWduKSA/IEFDX0xEX01QUyA6IDA7Ci0gIH0KLSAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19MRCkgPyBBQ19MRCA6IDA7Ci0gIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fZXBDb25maWcgPj0gMCkgPyBBQ19FUiA6IDA7Ci0gIGlmICggYXNjLT5tX2FvdCA9PSBBT1RfRFJNX0FBQyApIHsKLSAgICBzZWxmLT5mbGFncyB8PSBBQ19EUk18QUNfU0JSQ1JDfEFDX1NDQUxBQkxFOwotICB9Ci0gIGlmICggKGFzYy0+bV9hb3QgPT0gQU9UX0FBQ19TQ0FMKQotICAgIHx8IChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfU0NBTCkgKSB7Ci0gICAgc2VsZi0+ZmxhZ3MgfD0gQUNfU0NBTEFCTEU7CisgICAgaWYgKHNlbGYtPnVzZUxkUW1mVGltZUFsaWduICE9CisgICAgICAgIGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fdXNlTGRRbWZUaW1lQWxpZ24pIHsKKyAgICAgIGFzY0NoYW5nZWQgPSAxOworICAgIH0KKyAgICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0FMTE9DX01FTSkgeworICAgICAgc2VsZi0+dXNlTGRRbWZUaW1lQWxpZ24gPQorICAgICAgICAgIGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fdXNlTGRRbWZUaW1lQWxpZ247CisgICAgfQogICB9CiAKLQorICBzZWxmLT5zdHJlYW1JbmZvLmV4dEFvdCA9IGFzYy0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGU7CisgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmV4dFNhbXBsaW5nUmF0ZSAhPQorICAgICAgKElOVClhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3kpIHsKKyAgICBhc2NDaGFuZ2VkID0gMTsKKyAgfQorICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0FMTE9DX01FTSkgeworICAgIHNlbGYtPnN0cmVhbUluZm8uZXh0U2FtcGxpbmdSYXRlID0gYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5OworICB9CisgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSAoYXNjLT5tX3NiclByZXNlbnRGbGFnKSA/IEFDX1NCUl9QUkVTRU5UIDogMDsKKyAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9IChhc2MtPm1fcHNQcmVzZW50RmxhZykgPyBBQ19QU19QUkVTRU5UIDogMDsKICAgaWYgKGFzYy0+bV9zYnJQcmVzZW50RmxhZykgewogICAgIHNlbGYtPnNickVuYWJsZWQgPSAxOwogICAgIHNlbGYtPnNickVuYWJsZWRQcmV2ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBzZWxmLT5zYnJFbmFibGVkID0gMDsKKyAgICBzZWxmLT5zYnJFbmFibGVkUHJldiA9IDA7CiAgIH0KLSAgaWYgKGFzYy0+bV9wc1ByZXNlbnRGbGFnKSB7Ci0gICAgc2VsZi0+ZmxhZ3MgfD0gQUNfUFNfUFJFU0VOVDsKKyAgaWYgKHNlbGYtPnNickVuYWJsZWQgJiYgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5KSB7CisgICAgaWYgKGRvd25zY2FsZUZhY3RvciAhPSAxICYmIChkb3duc2NhbGVGYWN0b3IpJjEpIHsKKyAgICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX1NBTVBMSU5HUkFURTsgLyogU0JSIG5lZWRzIGFuIGV2ZW4gZG93bnNjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciAqLworICAgIH0KKyAgICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0FMTE9DX01FTSkgeworICAgICAgc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGUgPQorICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZXh0U2FtcGxpbmdSYXRlIC8gc2VsZi0+ZG93bnNjYWxlRmFjdG9yOworICAgIH0KICAgfQogCi0gIGlmICggKGFzYy0+bV9lcENvbmZpZyA+PSAwKQotICAgICYmIChhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPD0gMCkgKSB7Ci0gICAgLyogd2UgaGF2ZSB0byBrbm93IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb3RoZXJ3aXNlIG5vIGRlY29kaW5nIGlzIHBvc3NpYmxlICovCisgIC8qIC0tLS0tLS0tLSB2Y2IxMSAtLS0tLS0tLS0tLS0gKi8KKyAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9IChhc2MtPm1fdmNiMTFGbGFnKSA/IEFDX0VSX1ZDQjExIDogMDsKKworICAvKiAtLS0tLS0tLS0tIHJ2bGMgLS0tLS0tLS0tLS0tICovCisgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSAoYXNjLT5tX3J2bGNGbGFnKSA/IEFDX0VSX1JWTEMgOiAwOworCisgIC8qIC0tLS0tLS0tLS0tIGhjciAtLS0tLS0tLS0tLS0gKi8KKyAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9IChhc2MtPm1faGNyRmxhZykgPyBBQ19FUl9IQ1IgOiAwOworCisgIGlmIChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfRUxEKSB7CisgICAgc2VsZi0+bXBzRW5hYmxlQ3VyciA9IDA7CisgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9IEFDX0VMRDsKKyAgICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gfD0KKyAgICAgICAgKGFzYy0+bV9zYnJQcmVzZW50RmxhZykKKyAgICAgICAgICAgID8gQUNfU0JSX1BSRVNFTlQKKyAgICAgICAgICAgIDogMDsgLyogTmVlZCB0byBzZXQgdGhlIFNCUiBmbGFnIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5CisgICAgICAgcmVhc29ucy4gRXZlbiBpZiBTQlIgaXMgbm90IHN1cHBvcnRlZC4gKi8KKyAgICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gfD0KKyAgICAgICAgKGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fc2JyQ3JjRmxhZykgPyBBQ19TQlJDUkMgOiAwOworICAgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PQorICAgICAgICAoYXNjLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV91c2VMZFFtZlRpbWVBbGlnbikgPyBBQ19NUFNfUFJFU0VOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgIGlmIChzZWxmLT5tcHNBcHBsaWNhYmxlKSB7CisgICAgICBzZWxmLT5tcHNFbmFibGVDdXJyID0gYXNjLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV91c2VMZFFtZlRpbWVBbGlnbjsKKyAgICB9CisgIH0KKyAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9IChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfTEQpID8gQUNfTEQgOiAwOworICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gfD0gKGFzYy0+bV9lcENvbmZpZyA+PSAwKSA/IEFDX0VSIDogMDsKKworICBpZiAoYXNjLT5tX2FvdCA9PSBBT1RfVVNBQykgeworICAgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSBBQ19VU0FDOworICAgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PQorICAgICAgICAoYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5lbGVtZW50WzBdLm1fc3RlcmVvQ29uZmlnSW5kZXggPiAwKQorICAgICAgICAgICAgPyBBQ19NUFNfUFJFU0VOVAorICAgICAgICAgICAgOiAwOworICB9CisgIGlmIChhc2MtPm1fYW90ID09IEFPVF9EUk1fQUFDKSB7CisgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9IEFDX0RSTSB8IEFDX1NCUkNSQyB8IEFDX1NDQUxBQkxFOworICB9CisgIGlmIChhc2MtPm1fYW90ID09IEFPVF9EUk1fU1VSUk9VTkQpIHsKKyAgICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gfD0KKyAgICAgICAgQUNfRFJNIHwgQUNfU0JSQ1JDIHwgQUNfU0NBTEFCTEUgfCBBQ19NUFNfUFJFU0VOVDsKKyAgICBGREtfQVNTRVJUKCFhc2MtPm1fcHNQcmVzZW50RmxhZyk7CisgIH0KKyAgaWYgKChhc2MtPm1fYW90ID09IEFPVF9BQUNfU0NBTCkgfHwgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSkgeworICAgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSBBQ19TQ0FMQUJMRTsKKyAgfQorCisgIGlmICgoYXNjLT5tX2VwQ29uZmlnID49IDApICYmIChhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPD0gMCkpIHsKKyAgICAvKiB3ZSBoYXZlIHRvIGtub3cgdGhlIG51bWJlciBvZiBjaGFubmVscyBvdGhlcndpc2Ugbm8gZGVjb2RpbmcgaXMgcG9zc2libGUKKyAgICAgKi8KICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQ7CiAgIH0KIAogICBzZWxmLT5zdHJlYW1JbmZvLmVwQ29uZmlnID0gYXNjLT5tX2VwQ29uZmlnOwogICAvKiBzZWxmLT5oSW5wdXQtPmFzYy5tX2VwQ29uZmlnID0gYXNjLT5tX2VwQ29uZmlnOyAqLwogCi0gIGlmIChhc2MtPm1fZXBDb25maWcgPiAxKQotICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0VSX0ZPUk1BVDsKKyAgaWYgKGFzYy0+bV9lcENvbmZpZyA+IDEpIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0VSX0ZPUk1BVDsKIAogICAvKiBDaGVjayBpZiBzYW1wbGVyYXRlIGNoYW5nZWQuICovCi0gIGlmIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUgIT0gKElOVClhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kpIHsKKyAgaWYgKChzZWxmLT5zYW1wbGluZ1JhdGVJbmZvW3N0cmVhbUluZGV4XS5zYW1wbGluZ1JhdGUgIT0KKyAgICAgICBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kpIHx8CisgICAgICAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgIT0KKyAgICAgICAoSU5UKWFzYy0+bV9zYW1wbGVzUGVyRnJhbWUgLyBkb3duc2NhbGVGYWN0b3IpKSB7CiAgICAgQUFDX0RFQ09ERVJfRVJST1IgZXJyb3I7CiAKICAgICBhc2NDaGFuZ2VkID0gMTsKIAotICAgIC8qIFVwZGF0ZSBzYW1wbGVyYXRlIGluZm8uICovCi0gICAgZXJyb3IgPSBnZXRTYW1wbGluZ1JhdGVJbmZvKCZzZWxmLT5zYW1wbGluZ1JhdGVJbmZvLCBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3lJbmRleCwgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5KTsKLSAgICBpZiAoZXJyb3IgIT0gQUFDX0RFQ19PSykgewotICAgICAgcmV0dXJuIGVycm9yOworICAgIGlmIChjb25maWdNb2RlICYgQUNfQ01fQUxMT0NfTUVNKSB7CisgICAgICAvKiBVcGRhdGUgc2FtcGxlcmF0ZSBpbmZvLiAqLworICAgICAgZXJyb3IgPSBnZXRTYW1wbGluZ1JhdGVJbmZvKAorICAgICAgICAgICZzZWxmLT5zYW1wbGluZ1JhdGVJbmZvW3N0cmVhbUluZGV4XSwgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3lJbmRleCwgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5KTsKKyAgICAgIGlmIChlcnJvciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSA9CisgICAgICAgICAgc2VsZi0+c2FtcGxpbmdSYXRlSW5mb1swXS5zYW1wbGluZ1JhdGUgLyBzZWxmLT5kb3duc2NhbGVGYWN0b3I7CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSA9CisgICAgICAgICAgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSAvIHNlbGYtPmRvd25zY2FsZUZhY3RvcjsKICAgICB9Ci0gICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlID0gc2VsZi0+c2FtcGxpbmdSYXRlSW5mby5zYW1wbGluZ1JhdGU7CiAgIH0KIAogICAvKiBDaGVjayBpZiBhbW91bnQgb2YgY2hhbm5lbHMgaGFzIGNoYW5nZWQuICovCi0gIGlmIChzZWxmLT5hc2NDaGFubmVscyAhPSBhc2NDaGFubmVscykKLSAgewotICAgICBhc2NDaGFuZ2VkID0gMTsKKyAgaWYgKHNlbGYtPmFzY0NoYW5uZWxzW3N0cmVhbUluZGV4XSAhPSBhc2NDaGFubmVscykgeworICAgIGFzY0NoYW5nZWQgPSAxOworICB9CiAKLSAgICAgLyogQWxsb2NhdGUgYWxsIG1lbW9yeSBzdHJ1Y3R1cmVzIGZvciBlYWNoIGNoYW5uZWwgKi8KLSAgICAgewotICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGFzY0NoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICBDQWFjRGVjb2RlckR5bmFtaWNEYXRhICphYWNEZWNvZGVyRHluYW1pY0RhdGEgPSAmc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTEtPnBBYWNEZWNvZGVyRHluYW1pY0RhdGFbY2glMl07CisgIC8qIGRldGVjdCBjb25maWcgY2hhbmdlICovCisgIGlmIChjb25maWdNb2RlICYgQUNfQ01fREVUX0NGR19DSEFOR0UpIHsKKyAgICBpZiAoYXNjQ2hhbmdlZCAhPSAwKSB7CisgICAgICAqY29uZmlnQ2hhbmdlZCA9IDE7CisgICAgfQorICAgIHJldHVybiBlcnI7CisgIH0KIAotICAgICAgICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRvIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKi8KLSAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdID0gR2V0QWFjRGVjb2RlckNoYW5uZWxJbmZvKGNoKTsKLSAgICAgICAgICAgLyogVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgdGhlIER5bmFtaWNEYXRhIGlzIHNwbGl0IGludG8gdHdvIG9yIG1vcmUgcmVnaW9ucyEKLSAgICAgICAgICAgICAgVGhlIG1lbW9yeSBjb3VsZCBiZSByZXVzZWQgYWZ0ZXIgY29tcGxldGVkIGNvcmUgZGVjb2RpbmcuICovCi0gICAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIC8qIEhvb2sgc2hhcmVkIHdvcmsgbWVtb3J5IGludG8gY2hhbm5lbCBkYXRhIHN0cnVjdHVyZSAqLwotICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEgPSAgYWFjRGVjb2RlckR5bmFtaWNEYXRhOwotICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbURhdGEgPSAmc2VsZi0+YWFjQ29tbW9uRGF0YTsKLSAgICAgICAgIH0KKyAgLyogc2V0IEFDX1VTQUNfU0NGR0kzIGdsb2JhbGx5IGlmIGFueSB1c2FjIGVsZW1lbnQgdXNlcyAqLworICBzd2l0Y2ggKGFzYy0+bV9hb3QpIHsKKyAgICBjYXNlIEFPVF9VU0FDOgorICAgICAgaWYgKHNlbGYtPnNickVuYWJsZWQpIHsKKyAgICAgICAgZm9yIChpbnQgX2VsID0gMDsKKyAgICAgICAgICAgICBfZWwgPCAoaW50KXNlbGYtPnBVc2FjQ29uZmlnW3N0cmVhbUluZGV4XS0+bV91c2FjTnVtRWxlbWVudHM7CisgICAgICAgICAgICAgX2VsKyspIHsKKyAgICAgICAgICBpbnQgZWwgPSBlbGVtZW50T2Zmc2V0ICsgX2VsOworICAgICAgICAgIGlmIChJU19VU0FDX0NIQU5ORUxfRUxFTUVOVChzZWxmLT5lbGVtZW50c1tlbF0pKSB7CisgICAgICAgICAgICBpZiAodXNhY1N0ZXJlb0NvbmZpZ0luZGV4IDwgMCkgeworICAgICAgICAgICAgICB1c2FjU3RlcmVvQ29uZmlnSW5kZXggPSBzZWxmLT51c2FjU3RlcmVvQ29uZmlnSW5kZXhbZWxdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKCh1c2FjU3RlcmVvQ29uZmlnSW5kZXggIT0gc2VsZi0+dXNhY1N0ZXJlb0NvbmZpZ0luZGV4W2VsXSkgfHwKKyAgICAgICAgICAgICAgICAgIChzZWxmLT51c2FjU3RlcmVvQ29uZmlnSW5kZXhbZWxdID4gMCkpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgICAgICAgLyogQWxsb2NhdGUgcGVyc2lzdGVudCBjaGFubmVsIG1lbW9yeSAqLwotICAgICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdID09IE5VTEwpIHsKLSAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0gPSBHZXRBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8oY2gpOwotICAgICAgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0gPT0gTlVMTCkgewotICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgfQotICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIgPSBHZXRPdmVybGFwQnVmZmVyKGNoKTsgLyogVGhpcyBhcmVhIHNpemUgZGVwZW5kcyBvbiB0aGUgQU9UICovCi0gICAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgfQotICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQgPSAoU1BFQ1RSQUxfUFRSKSAmc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTJbY2gqMTAyNF07CisgICAgICAgIGlmICh1c2FjU3RlcmVvQ29uZmlnSW5kZXggPCAwKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CiAKLSAgICAgICAgIH0KLSAgICAgICAgIENQbnNfSW5pdFBucygmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmRhdGEuYWFjLlBuc0RhdGEsICZzZWxmLT5hYWNDb21tb25EYXRhLnBuc0ludGVyQ2hhbm5lbERhdGEsICZzZWxmLT5hYWNDb21tb25EYXRhLnBuc0N1cnJlbnRTZWVkLCBzZWxmLT5hYWNDb21tb25EYXRhLnBuc1JhbmRvbVNlZWQpOwotICAgICAgIH0KKyAgICAgICAgaWYgKHVzYWNTdGVyZW9Db25maWdJbmRleCA9PSAzKSB7CisgICAgICAgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9IEFDX1VTQUNfU0NGR0kzOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIAotICAgICAgIGlmIChhc2NDaGFubmVscyA+IHNlbGYtPmFhY0NoYW5uZWxzKQotICAgICAgIHsKLSAgICAgICAgIC8qIE1ha2UgYWxsb2NhdGVkIGNoYW5uZWwgY291bnQgcGVyc2lzdGVudCBpbiBkZWNvZGVyIGNvbnRleHQuICovCi0gICAgICAgICBzZWxmLT5hYWNDaGFubmVscyA9IGFzY0NoYW5uZWxzOwotICAgICAgIH0KKyAgaWYgKCpjb25maWdDaGFuZ2VkKSB7CisgICAgLyogU2V0IHVwIFFNRiBkb21haW4gZm9yIEFPVHMgd2l0aCBleHBsaWNpdCBzaWduYWxsaW5nIG9mIFNCUiBhbmQgb3IgTVBTLgorICAgICAgIFRoaXMgaXMgdG8gYmUgYWJsZSB0byBwbGF5IG91dCB0aGUgZmlyc3QgZnJhbWUgYWx3YXkgd2l0aCB0aGUgY29ycmVjdAorICAgICAgIGZyYW1lIHNpemUgYW5kIHNhbXBsaW5nIHJhdGUgZXZlbiBpbiBjYXNlIG9mIGNvbmNlYWxtZW50LgorICAgICovCisgICAgc3dpdGNoIChhc2MtPm1fYW90KSB7CisgICAgICBjYXNlIEFPVF9VU0FDOgorICAgICAgICBpZiAoc2VsZi0+c2JyRW5hYmxlZCkgeworICAgICAgICAgIGNvbnN0IFVDSEFSIG1hcF9zYnJSYXRpb18yX25BbmFCYW5kc1tdID0gezE2LCAyNCwgMzJ9OwogCi0gICAgICAgSGNySW5pdFJvbSgmc2VsZi0+YWFjQ29tbW9uRGF0YS5vdmVybGF5LmFhYy5lckhjckluZm8pOwotICAgICAgIHNldEhjclR5cGUoJnNlbGYtPmFhY0NvbW1vbkRhdGEub3ZlcmxheS5hYWMuZXJIY3JJbmZvLCBJRF9TQ0UpOworICAgICAgICAgIEZES19BU1NFUlQoYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5tX3NiclJhdGlvSW5kZXggPiAwKTsKKyAgICAgICAgICBGREtfQVNTRVJUKHN0cmVhbUluZGV4ID09IDApOworCisgICAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYubklucHV0Q2hhbm5lbHNfcmVxdWVzdGVkID0gYXNjQ2hhbm5lbHM7CisgICAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYubk91dHB1dENoYW5uZWxzX3JlcXVlc3RlZCA9CisgICAgICAgICAgICAgICh1c2FjU3RlcmVvQ29uZmlnSW5kZXggPT0gMSkgPyAyIDogYXNjQ2hhbm5lbHM7CisgICAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYuZmxhZ3NfcmVxdWVzdGVkID0gMDsKKyAgICAgICAgICBzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZi5uQmFuZHNBbmFseXNpc19yZXF1ZXN0ZWQgPQorICAgICAgICAgICAgICBtYXBfc2JyUmF0aW9fMl9uQW5hQmFuZHNbYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5tX3NiclJhdGlvSW5kZXggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV07CisgICAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYubkJhbmRzU3ludGhlc2lzX3JlcXVlc3RlZCA9IDY0OworICAgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLm5RbWZUaW1lU2xvdHNfcmVxdWVzdGVkID0KKyAgICAgICAgICAgICAgKGFzYy0+bV9zYy5tX3VzYWNDb25maWcubV9zYnJSYXRpb0luZGV4ID09IDEpID8gNjQgOiAzMjsKKyAgICAgICAgICBzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZi5uUW1mT3ZUaW1lU2xvdHNfcmVxdWVzdGVkID0KKyAgICAgICAgICAgICAgKGFzYy0+bV9zYy5tX3VzYWNDb25maWcubV9zYnJSYXRpb0luZGV4ID09IDEpID8gMTIgOiA2OworICAgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLm5RbWZQcm9jQmFuZHNfcmVxdWVzdGVkID0gNjQ7CisgICAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYublFtZlByb2NDaGFubmVsc19yZXF1ZXN0ZWQgPSAxOworICAgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLnBhcmtDaGFubmVsID0KKyAgICAgICAgICAgICAgKHVzYWNTdGVyZW9Db25maWdJbmRleCA9PSAzKSA/IDEgOiAwOworICAgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLnBhcmtDaGFubmVsX3JlcXVlc3RlZCA9CisgICAgICAgICAgICAgICh1c2FjU3RlcmVvQ29uZmlnSW5kZXggPT0gMykgPyAxIDogMDsKKyAgICAgICAgICBzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZi5xbWZEb21haW5FeHBsaWNpdENvbmZpZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgICBpZiAoc2VsZi0+bXBzRW5hYmxlQ3VyciAmJgorICAgICAgICAgICAgYXNjLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV91c2VMZFFtZlRpbWVBbGlnbikgeworICAgICAgICAgIFNBQ19JTlBVVF9DT05GSUcgc2FjX2ludGVyZmFjZSA9CisgICAgICAgICAgICAgIChzZWxmLT5zYnJFbmFibGVkICYmIHNlbGYtPmhTYnJEZWNvZGVyKSA/IFNBQ19JTlRFUkZBQ0VfUU1GCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNBQ19JTlRFUkZBQ0VfVElNRTsKKyAgICAgICAgICBtcGVnU3Vycm91bmREZWNvZGVyX0NvbmZpZ3VyZVFtZkRvbWFpbigKKyAgICAgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIsIHNhY19pbnRlcmZhY2UsCisgICAgICAgICAgICAgIChVSU5UKXNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSwgYXNjLT5tX2FvdCk7CisgICAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYucW1mRG9tYWluRXhwbGljaXRDb25maWcgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYucW1mRG9tYWluRXhwbGljaXRDb25maWcgPQorICAgICAgICAgICAgMDsgLyogcW1mRG9tYWluIGlzIGluaXRpYWxpemVkIGJ5IFNCUiBhbmQgTVBTIGluaXQgZnVuY3Rpb25zIGlmCisgICAgICAgICAgICAgICAgICByZXF1aXJlZCAqLworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBhbGwgbWVtb3J5IHN0cnVjdHVyZXMgZm9yIGVhY2ggY2hhbm5lbCAqLworICAgIHsKKyAgICAgIGludCBjaCA9IGFhY0NoYW5uZWxzT2Zmc2V0OworICAgICAgZm9yIChpbnQgX2NoID0gMDsgX2NoIDwgYXNjQ2hhbm5lbHM7IF9jaCsrKSB7CisgICAgICAgIGlmIChjaCA+PSAoOCkpIHsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0gPSBHZXRBYWNEZWNvZGVyQ2hhbm5lbEluZm8oY2gpOworICAgICAgICAvKiBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB0aGUgRHluYW1pY0RhdGEgaXMgc3BsaXQgaW50byB0d28gb3IgbW9yZQorICAgICAgICAgICByZWdpb25zISBUaGUgbWVtb3J5IGNvdWxkIGJlIHJldXNlZCBhZnRlciBjb21wbGV0ZWQgY29yZSBkZWNvZGluZy4gKi8KKyAgICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdID09IE5VTEwpIHsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgICAgY2grKzsKKyAgICAgIH0KKworICAgICAgaW50IGNoSWR4ID0gYWFjQ2hhbm5lbHNPZmZzZXRJZHg7CisgICAgICBjaCA9IGFhY0NoYW5uZWxzT2Zmc2V0OworICAgICAgaW50IF9udW1FbGVtZW50czsKKyAgICAgIF9udW1FbGVtZW50cyA9ICgoKDgpKSArICg4KSk7CisgICAgICBpZiAoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYgKEFDX1JTVjYwM0RBIHwgQUNfVVNBQykpIHsKKyAgICAgICAgX251bUVsZW1lbnRzID0gKGludClhc2MtPm1fc2MubV91c2FjQ29uZmlnLm1fdXNhY051bUVsZW1lbnRzOworICAgICAgfQorICAgICAgZm9yIChpbnQgX2VsID0gMDsgX2VsIDwgX251bUVsZW1lbnRzOyBfZWwrKykgeworICAgICAgICBpbnQgZWxfY2hhbm5lbHMgPSAwOworICAgICAgICBpbnQgZWwgPSBlbGVtZW50T2Zmc2V0ICsgX2VsOworCisgICAgICAgIGlmIChzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJgorICAgICAgICAgICAgKEFDX0VSIHwgQUNfTEQgfCBBQ19FTEQgfCBBQ19SU1Y2MDNEQSB8IEFDX1VTQUMgfCBBQ19SU1ZENTApKSB7CisgICAgICAgICAgaWYgKGNoID49IGFzY0NoYW5uZWxzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHNlbGYtPmVsZW1lbnRzW2VsXSkgeworICAgICAgICAgIGNhc2UgSURfU0NFOgorICAgICAgICAgIGNhc2UgSURfQ1BFOgorICAgICAgICAgIGNhc2UgSURfTEZFOgorICAgICAgICAgIGNhc2UgSURfVVNBQ19TQ0U6CisgICAgICAgICAgY2FzZSBJRF9VU0FDX0NQRToKKyAgICAgICAgICBjYXNlIElEX1VTQUNfTEZFOgorCisgICAgICAgICAgICBlbF9jaGFubmVscyA9IENBYWNEZWNvZGVyX0dldEVMQ2hhbm5lbHMoCisgICAgICAgICAgICAgICAgc2VsZi0+ZWxlbWVudHNbZWxdLCBzZWxmLT51c2FjU3RlcmVvQ29uZmlnSW5kZXhbZWxdKTsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbVN0YXRpY0RhdGEgPQorICAgICAgICAgICAgICAgICAgKENBYWNEZWNvZGVyQ29tbW9uU3RhdGljRGF0YSAqKUZES2NhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAxLCBzaXplb2YoQ0FhY0RlY29kZXJDb21tb25TdGF0aWNEYXRhKSk7CisgICAgICAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbVN0YXRpY0RhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoY2ggPT0gYWFjQ2hhbm5lbHNPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbURhdGEgPQorICAgICAgICAgICAgICAgICAgICAoQ0FhY0RlY29kZXJDb21tb25EYXRhICopR2V0V29ya0J1ZmZlckNvcmU2KCk7CisgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgICAgICAgLT5wQ29tU3RhdGljRGF0YS0+cFdvcmtCdWZmZXJDb3JlMSA9IEdldFdvcmtCdWZmZXJDb3JlMSgpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIChDQWFjRGVjb2RlckNvbW1vbkRhdGEgKilGREthYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ0FhY0RlY29kZXJDb21tb25EYXRhKSwgQUxJR05NRU5UX0RFRkFVTFQpOworICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAgIC0+cENvbVN0YXRpY0RhdGEtPnBXb3JrQnVmZmVyQ29yZTEgPQorICAgICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2FhY0NoYW5uZWxzT2Zmc2V0XQorICAgICAgICAgICAgICAgICAgICAgICAgLT5wQ29tU3RhdGljRGF0YS0+cFdvcmtCdWZmZXJDb3JlMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tRGF0YSA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAgICAgIC0+cENvbVN0YXRpY0RhdGEtPnBXb3JrQnVmZmVyQ29yZTEgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhID0KKyAgICAgICAgICAgICAgICAgICYoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0+cENvbURhdGEtPnBBYWNEZWNvZGVyRHluYW1pY0RhdGFbMF0pOworICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQgPQorICAgICAgICAgICAgICAgICAgKFNQRUNUUkFMX1BUUikmc2VsZi0+d29ya0J1ZmZlckNvcmUyW2NoICogMTAyNF07CisKKyAgICAgICAgICAgICAgaWYgKGVsX2NoYW5uZWxzID09IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPj0gKDgpIC0gMSkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCArIDFdLT5wQ29tRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tRGF0YTsKKyAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoICsgMV0tPnBDb21TdGF0aWNEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21TdGF0aWNEYXRhOworICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2ggKyAxXQorICAgICAgICAgICAgICAgICAgICAtPnBDb21TdGF0aWNEYXRhLT5wV29ya0J1ZmZlckNvcmUxID0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0+cENvbVN0YXRpY0RhdGEtPnBXb3JrQnVmZmVyQ29yZTE7CisgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCArIDFdLT5wRHluRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICYoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLT5wQ29tRGF0YS0+cEFhY0RlY29kZXJEeW5hbWljRGF0YVsxXSk7CisgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCArIDFdLT5wU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICAgICAgICAgICAgICAgIChTUEVDVFJBTF9QVFIpJnNlbGYtPndvcmtCdWZmZXJDb3JlMlsoY2ggKyAxKSAqIDEwMjRdOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY2ggKz0gZWxfY2hhbm5lbHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaElkeCArPSBlbF9jaGFubmVsczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYtPmVsZW1lbnRzW2VsXSA9PSBJRF9FTkQpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGVsKys7CisgICAgICB9CisKKyAgICAgIGNoSWR4ID0gYWFjQ2hhbm5lbHNPZmZzZXRJZHg7CisgICAgICBjaCA9IGFhY0NoYW5uZWxzT2Zmc2V0OworICAgICAgZm9yIChpbnQgX2NoID0gMDsgX2NoIDwgYXNjQ2hhbm5lbHM7IF9jaCsrKSB7CisgICAgICAgIC8qIEFsbG9jYXRlIHBlcnNpc3RlbnQgY2hhbm5lbCBtZW1vcnkgKi8KKyAgICAgICAgeworICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdID0KKyAgICAgICAgICAgICAgR2V0QWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKGNoKTsKKyAgICAgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0gPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIH0KKyAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIgPQorICAgICAgICAgICAgICBHZXRPdmVybGFwQnVmZmVyKGNoKTsgLyogVGhpcyBhcmVhIHNpemUgZGVwZW5kcyBvbiB0aGUgQU9UICovCisgICAgICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5wT3ZlcmxhcEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJgorICAgICAgICAgICAgICAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBIC8qfEFDX0JTQUMqLykpIHsKKyAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5oQXJDbyA9IENBcmNvX0NyZWF0ZSgpOworICAgICAgICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5oQXJDbyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIShzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiAoQUNfVVNBQyB8IEFDX1JTVjYwM0RBKSkpIHsKKyAgICAgICAgICAgIENQbnNfVXBkYXRlTm9pc2VTdGF0ZSgKKyAgICAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmRhdGEuYWFjLlBuc0RhdGEsCisgICAgICAgICAgICAgICAgJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5wbnNDdXJyZW50U2VlZCwKKyAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbURhdGEtPnBuc1JhbmRvbVNlZWQpOworICAgICAgICAgIH0KKyAgICAgICAgICBjaCsrOworICAgICAgICB9CisgICAgICAgIGNoSWR4Kys7CisgICAgICB9CisKKyAgICAgIGlmIChzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiBBQ19VU0FDKSB7CisgICAgICAgIGZvciAoaW50IF9jaCA9IDA7IF9jaCA8IGZsdXNoQ2hhbm5lbHM7IF9jaCsrKSB7CisgICAgICAgICAgY2ggPSBhYWNDaGFubmVsc09mZnNldCArIF9jaDsKKyAgICAgICAgICBpZiAoc2VsZi0+cFRpbWVEYXRhRmx1c2hbY2hdID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNlbGYtPnBUaW1lRGF0YUZsdXNoW2NoXSA9IEdldFRpbWVEYXRhRmx1c2goY2gpOworICAgICAgICAgICAgaWYgKHNlbGYtPnBUaW1lRGF0YUZsdXNoW2NoXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmIChBQ19VU0FDIHwgQUNfUlNWNjAzREEpKSB7CisgICAgICAgIGludCBjb21wbGV4U3RlcmVvUHJlZFBvc3NpYmxlID0gMDsKKyAgICAgICAgY2ggPSBhYWNDaGFubmVsc09mZnNldDsKKyAgICAgICAgY2hJZHggPSBhYWNDaGFubmVsc09mZnNldElkeDsKKyAgICAgICAgZm9yIChpbnQgX2VsMiA9IDA7IF9lbDIgPCAoaW50KWFzYy0+bV9zYy5tX3VzYWNDb25maWcubV91c2FjTnVtRWxlbWVudHM7CisgICAgICAgICAgICAgX2VsMisrKSB7CisgICAgICAgICAgaW50IGVsMiA9IGVsZW1lbnRPZmZzZXQgKyBfZWwyOworICAgICAgICAgIGludCBlbENoID0gMCwgY2gyOworCisgICAgICAgICAgaWYgKChzZWxmLT5lbGVtZW50c1tlbDJdID09IElEX1VTQUNfQ1BFKSAmJgorICAgICAgICAgICAgICAhKHNlbGYtPnVzYWNTdGVyZW9Db25maWdJbmRleFtlbDJdID09IDEpKSB7CisgICAgICAgICAgICBlbENoID0gMjsKKyAgICAgICAgICB9IGVsc2UgaWYgKElTX0NIQU5ORUxfRUxFTUVOVChzZWxmLT5lbGVtZW50c1tlbDJdKSkgeworICAgICAgICAgICAgZWxDaCA9IDE7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHNlbGYtPmVsRmxhZ3NbZWwyXSAmIEFDX0VMX1VTQUNfQ1BfUE9TU0lCTEUpIHsKKyAgICAgICAgICAgIGNvbXBsZXhTdGVyZW9QcmVkUG9zc2libGUgPSAxOworICAgICAgICAgICAgaWYgKHNlbGYtPmNwZVN0YXRpY0RhdGFbZWwyXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgIHNlbGYtPmNwZVN0YXRpY0RhdGFbZWwyXSA9IEdldENwZVBlcnNpc3RlbnREYXRhKCk7CisgICAgICAgICAgICAgIGlmIChzZWxmLT5jcGVTdGF0aWNEYXRhW2VsMl0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoY2gyID0gMDsgY2gyIDwgZWxDaDsgY2gyKyspIHsKKyAgICAgICAgICAgIC8qIEhvb2sgZWxlbWVudCBzcGVjaWZpYyBjcGVTdGF0aWNEYXRhIGludG8gY2hhbm5lbCBzcGVjaWZpYworICAgICAgICAgICAgICogYWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICovCisgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cENwZVN0YXRpY0RhdGEgPQorICAgICAgICAgICAgICAgIHNlbGYtPmNwZVN0YXRpY0RhdGFbZWwyXTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cENwZVN0YXRpY0RhdGEgIT0KKyAgICAgICAgICAgICAgICBOVUxMKSB7CisgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhLT5qb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhCisgICAgICAgICAgICAgICAgICAuc3BlY3RyYWxDb2VmZnNbY2gyXSA9CisgICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXQorICAgICAgICAgICAgICAgICAgICAgIC0+Y29uY2VhbG1lbnRJbmZvLnNwZWN0cmFsQ29lZmZpY2llbnQ7CisgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhLT5qb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLnNwZWNTY2FsZVtjaDJdID0KKyAgICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAgICAgLT5jb25jZWFsbWVudEluZm8uc3BlY1NjYWxlOworICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXQorICAgICAgICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS5zY3JhdGNoQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCAqKXNlbGYtPnBUaW1lRGF0YTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaElkeCsrOworICAgICAgICAgICAgY2grKzsKKyAgICAgICAgICB9IC8qIGZvciBlYWNoIGNoYW5uZWwgaW4gY3VycmVudCBlbGVtZW50ICovCisgICAgICAgICAgaWYgKGNvbXBsZXhTdGVyZW9QcmVkUG9zc2libGUgJiYgKGVsQ2ggPT0gMikpIHsKKyAgICAgICAgICAgIC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoIC0gMV0KKyAgICAgICAgICAgICAgICAgICAgLT5wQ29tU3RhdGljRGF0YS0+Y3BseFByZWRpY3Rpb25EYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCAtIDFdCisgICAgICAgICAgICAgICAgICAtPnBDb21TdGF0aWNEYXRhLT5jcGx4UHJlZGljdGlvbkRhdGEgPQorICAgICAgICAgICAgICAgICAgR2V0Q3BseFByZWRpY3Rpb25EYXRhKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCAtIDFdCisgICAgICAgICAgICAgICAgICAgIC0+cENvbVN0YXRpY0RhdGEtPmNwbHhQcmVkaWN0aW9uRGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGVsQ2ggPiAwKSB7CisgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoIC0gZWxDaF0tPm5mUmFuZG9tU2VlZCA9CisgICAgICAgICAgICAgICAgKFVMT05HKTB4MzAzOTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5lbGVtZW50c1tlbDJdID09IElEX1VTQUNfQ1BFKSB7CisgICAgICAgICAgICAgIGlmIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbZWwyXS5tX3N0ZXJlb0NvbmZpZ0luZGV4ICE9CisgICAgICAgICAgICAgICAgICAxKSB7CisgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaCAtIGVsQ2ggKyAxXQorICAgICAgICAgICAgICAgICAgICAtPm5mUmFuZG9tU2VlZCA9IChVTE9ORykweDEwOTMyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IC8qIGZvciBlYWNoIGVsZW1lbnQgKi8KKyAgICAgIH0KKworICAgICAgaWYgKGFzY0NoYW5uZWxzICE9IHNlbGYtPmFhY0NoYW5uZWxzKSB7CisgICAgICAgIC8qIE1ha2UgYWxsb2NhdGVkIGNoYW5uZWwgY291bnQgcGVyc2lzdGVudCBpbiBkZWNvZGVyIGNvbnRleHQuICovCisgICAgICAgIHNlbGYtPmFhY0NoYW5uZWxzID0gYWFjQ2hhbm5lbHNPZmZzZXQgKyBjaDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodXNhY1Jlc2lkdWFsRGVsYXlDb21wU2FtcGxlcykgeworICAgICAgSU5UIGRlbGF5RXJyID0gRkRLX0RlbGF5X0NyZWF0ZSgmc2VsZi0+dXNhY1Jlc2lkdWFsRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVU0hPUlQpdXNhY1Jlc2lkdWFsRGVsYXlDb21wU2FtcGxlcywgMSk7CisgICAgICBpZiAoZGVsYXlFcnIpIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQogICAgIH0KIAogICAgIC8qIE1ha2UgYW1vdW50IG9mIHNpZ25hbGxlZCBjaGFubmVscyBwZXJzaXN0ZW50IGluIGRlY29kZXIgY29udGV4dC4gKi8KLSAgICBzZWxmLT5hc2NDaGFubmVscyA9IGFzY0NoYW5uZWxzOworICAgIHNlbGYtPmFzY0NoYW5uZWxzW3N0cmVhbUluZGV4XSA9IGFzY0NoYW5uZWxzOworICAgIC8qIEluaXQgdGhlIHByZXZpb3VzIGNoYW5uZWwgY291bnQgdmFsdWVzLiBUaGlzIGlzIHJlcXVpcmVkIHRvIGF2b2lkIGEKKyAgICAgICBtaXNtYXRjaCBvZiBtZW1vcnkgYWNjZXNzZXMgaW4gdGhlIGVycm9yIGNvbmNlYWxtZW50IG1vZHVsZSBhbmQgdGhlCisgICAgICAgYWxsb2NhdGVkIGNoYW5uZWwgc3RydWN0dXJlcyBpbiB0aGlzIGZ1bmN0aW9uLiAqLworICAgIHNlbGYtPmFhY0NoYW5uZWxzUHJldiA9IDA7CisgIH0KKworICBpZiAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1swXSAhPSBOVUxMKSB7CisgICAgc2VsZi0+cERybUJzQnVmZmVyID0gc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1swXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnBDb21TdGF0aWNEYXRhLT5wV29ya0J1ZmZlckNvcmUxLT5Ecm1Cc0J1ZmZlcjsKKyAgICBzZWxmLT5kcm1Cc0J1ZmZlclNpemUgPSBEUk1fQlNfQlVGRkVSX1NJWkU7CiAgIH0KIAogICAvKiBVcGRhdGUgc3RydWN0dXJlcyAqLwotICBpZiAoYXNjQ2hhbmdlZCkgeworICBpZiAoKmNvbmZpZ0NoYW5nZWQpIHsKKyAgICAvKiBUaGluZ3MgdG8gYmUgZG9uZSBmb3IgZWFjaCBjaGFubmVsLCB3aGljaCBkbyBub3QgaW52b2x2ZSBhbGxvY2F0aW5nCisgICAgICAgbWVtb3J5LiBEb2luZyB0aGVzZSB0aGluZ3Mgb25seSBvbiB0aGUgY2hhbm5lbHMgbmVlZGVkIGZvciB0aGUgY3VycmVudAorICAgICAgIGNvbmZpZ3VyYXRpb24gKGFzY0NoYW5uZWxzKSBjb3VsZCBsZWFkIHRvIG1lbW9yeSBhY2Nlc3MgdmlvbGF0aW9uIGxhdGVyCisgICAgICAgKGVycm9yIGNvbmNlYWxtZW50KS4gKi8KKyAgICBpbnQgY2ggPSAwOworICAgIGludCBjaElkeCA9IDA7CisgICAgZm9yIChpbnQgX2NoID0gMDsgX2NoIDwgc2VsZi0+YXNjQ2hhbm5lbHNbc3RyZWFtSW5kZXhdOyBfY2grKykgeworICAgICAgc3dpdGNoIChzZWxmLT5zdHJlYW1JbmZvLmFvdCkgeworICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmdyYW51bGVMZW5ndGggPQorICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+Z3JhbnVsZUxlbmd0aCA9CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lIC8gODsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID0gaW5pdFJlbmRlck1vZGU7CiAKLSAgICAgLyogVGhpbmdzIHRvIGJlIGRvbmUgZm9yIGVhY2ggY2hhbm5lbCwgd2hpY2ggZG8gbm90IGludm9sdmUgYWxsb2NhdGluZyBtZW1vcnkuCi0gICAgICAgIERvaW5nIHRoZXNlIHRoaW5ncyBvbmx5IG9uIHRoZSBjaGFubmVscyBuZWVkZWQgZm9yIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KLSAgICAgICAgKGFzY0NoYW5uZWxzKSBjb3VsZCBsZWFkIHRvIG1lbW9yeSBhY2Nlc3MgdmlvbGF0aW9uIGxhdGVyIChlcnJvciBjb25jZWFsbWVudCkuICovCi0gICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPmFhY0NoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgc3dpdGNoIChzZWxmLT5zdHJlYW1JbmZvLmFvdCkgewotICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKLSAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKLSAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmdyYW51bGVMZW5ndGggPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+Z3JhbnVsZUxlbmd0aCA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lIC8gODsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgICAgIG1kY3RfaW5pdCggJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5JTWRjdCwKLSAgICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgT3ZlcmxhcEJ1ZmZlclNpemUgKTsKKyAgICAgIG1kY3RfaW5pdCgmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPklNZGN0LAorICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5wT3ZlcmxhcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBPdmVybGFwQnVmZmVyU2l6ZSk7CiAKKyAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5sYXN0X2NvcmVfbW9kZSA9IEZEX0xPTkc7CisgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+bGFzdF9scGRfbW9kZSA9IDI1NTsKIAotICAgICAgICAvKiBSZXNldCBEUkMgY29udHJvbCBkYXRhIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgICAgICAgYWFjRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbERhdGEgKCAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmRyY0RhdGEgKTsKKyAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5sYXN0X3RjeF9waXRjaCA9IExfRElWOwogCi0gICAgICAgLyogUmVzZXQgY29uY2VhbG1lbnQgb25seSBpZiBBU0MgY2hhbmdlZC4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgZG9uZSB3aXRoIGFueSBjb25maWcgY2FsbGJhY2suCi0gICAgICAgICAgRS5nLiBldmVyeSB0aW1lIHRoZSBMQVRNIFNNQyBpcyBwcmVzZW50LiAqLwotICAgICAgIENDb25jZWFsbWVudF9Jbml0Q2hhbm5lbERhdGEoJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5jb25jZWFsbWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgKTsKLSAgICAgfQorICAgICAgLyogUmVzZXQgRFJDIGNvbnRyb2wgZGF0YSBmb3IgdGhpcyBjaGFubmVsICovCisgICAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSgKKyAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmRyY0RhdGEpOworCisgICAgICAvKiBEZWxldGUgbWl4ZG93biBtZXRhZGF0YSBmcm9tIHRoZSBwYXN0ICovCisgICAgICBwY21EbXhfUmVzZXQoc2VsZi0+aFBjbVV0aWxzLCBQQ01ETVhfUkVTRVRfQlNfREFUQSk7CisKKyAgICAgIC8qIFJlc2V0IGNvbmNlYWxtZW50IG9ubHkgaWYgQVNDIGNoYW5nZWQuIE90aGVyd2lzZSBpdCB3aWxsIGJlIGRvbmUgd2l0aAorICAgICAgICAgYW55IGNvbmZpZyBjYWxsYmFjay4gRS5nLiBldmVyeSB0aW1lIHRoZSBMQVRNIFNNQyBpcyBwcmVzZW50LiAqLworICAgICAgQ0NvbmNlYWxtZW50X0luaXRDaGFubmVsRGF0YSgKKyAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmNvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEsIGluaXRSZW5kZXJNb2RlLAorICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgIGNoKys7CisgICAgICBjaElkeCsrOworICAgIH0KICAgfQogCiAgIC8qIFVwZGF0ZSBleHRlcm5hbGx5IHZpc2libGUgY29weSBvZiBmbGFncyAqLwotICBzZWxmLT5zdHJlYW1JbmZvLmZsYWdzID0gc2VsZi0+ZmxhZ3M7CisgIHNlbGYtPnN0cmVhbUluZm8uZmxhZ3MgPSBzZWxmLT5mbGFnc1swXTsKKworICBpZiAoKmNvbmZpZ0NoYW5nZWQpIHsKKyAgICBpbnQgZHJjRGVjU2FtcGxlUmF0ZSwgZHJjRGVjRnJhbWVTaXplOworCisgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8uZXh0U2FtcGxpbmdSYXRlICE9IDApIHsKKyAgICAgIGRyY0RlY1NhbXBsZVJhdGUgPSBzZWxmLT5zdHJlYW1JbmZvLmV4dFNhbXBsaW5nUmF0ZTsKKyAgICAgIGRyY0RlY0ZyYW1lU2l6ZSA9IChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZTsKKyAgICB9IGVsc2UgeworICAgICAgZHJjRGVjU2FtcGxlUmF0ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZTsKKyAgICAgIGRyY0RlY0ZyYW1lU2l6ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lOworICAgIH0KKworICAgIGlmIChGREtfZHJjRGVjX0luaXQoc2VsZi0+aFVuaURyY0RlY29kZXIsIGRyY0RlY0ZyYW1lU2l6ZSwgZHJjRGVjU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmFhY0NoYW5uZWxzKSAhPSAwKQorICAgICAgZ290byBiYWlsOworICB9CisKKyAgaWYgKGFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICBwY21MaW1pdGVyX1NldEF0dGFjayhzZWxmLT5oTGltaXRlciwgKDUpKTsKKyAgICBwY21MaW1pdGVyX1NldFRocmVzaG9sZChzZWxmLT5oTGltaXRlciwgRkwyRlhDT05TVF9EQkwoMC44OTEyNTA5NGYpKTsKKyAgfQogCiAgIHJldHVybiBlcnI7CiAKIGJhaWw6Ci0gIGFhY0RlY29kZXJfQ2xvc2UoIHNlbGYgKTsKKyAgQ0FhY0RlY29kZXJfRGVJbml0KHNlbGYsIDApOwogICByZXR1cm4gQUFDX0RFQ19PVVRfT0ZfTUVNT1JZOwogfQogCi0KIExJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgKLSAgICAgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKLSAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgSU5UX1BDTSAqcFRpbWVEYXRhLAotICAgICAgICBjb25zdCBJTlQgIHRpbWVEYXRhU2l6ZSwKLSAgICAgICAgY29uc3QgSU5UIGludGVybGVhdmVkCi0gICAgICAgICkKLXsKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBjb25zdCBVSU5UIGZsYWdzLCBGSVhQX1BDTSAqcFRpbWVEYXRhLAorICAgIGNvbnN0IElOVCB0aW1lRGF0YVNpemUsIGNvbnN0IGludCB0aW1lRGF0YUNoYW5uZWxPZmZzZXQpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOwogCiAgIENQcm9ncmFtQ29uZmlnICpwY2U7CiAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzID0gdHJhbnNwb3J0RGVjX0dldEJpdHN0cmVhbShzZWxmLT5oSW5wdXQsIDApOwogCi0gIE1QNF9FTEVNRU5UX0lEIHR5cGUgPSBJRF9OT05FOyAgICAgICAgICAgIC8qIEN1cnJlbnQgZWxlbWVudCB0eXBlICovCi0gIElOVCBhYWNDaGFubmVscz0wOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoYW5uZWwgY291bnRlciBmb3IgY2hhbm5lbHMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSAqLwotICBpbnQgY2hPdXRNYXBJZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgY2hhbm5lbCBtYXBwaW5nIGluZGV4IChzZWUgY29tbWVudCBiZWxvdykgKi8KKyAgTVA0X0VMRU1FTlRfSUQgdHlwZSA9IElEX05PTkU7IC8qIEN1cnJlbnQgZWxlbWVudCB0eXBlICovCisgIElOVCBhYWNDaGFubmVscyA9IDA7IC8qIENoYW5uZWwgY291bnRlciBmb3IgY2hhbm5lbHMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSAqLworICBjb25zdCBpbnQgc3RyZWFtSW5kZXggPSAwOyAvKiBpbmRleCBvZiB0aGUgY3VycmVudCBzdWJzdHJlYW0gKi8KIAotICBJTlQgYXVTdGFydEFuY2hvciA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKTsgIC8qIEFVIHN0YXJ0IGJpdCBidWZmZXIgcG9zaXRpb24gZm9yIEFVIGJ5dGUgYWxpZ25tZW50ICovCisgIElOVCBhdVN0YXJ0QW5jaG9yID0gKElOVClGREtnZXRWYWxpZEJpdHMoCisgICAgICBicyk7IC8qIEFVIHN0YXJ0IGJpdCBidWZmZXIgcG9zaXRpb24gZm9yIEFVIGJ5dGUgYWxpZ25tZW50ICovCiAKLSAgc2VsZi0+ZnJhbWVPSyA9IDE7CisgIElOVCBjaGVja1NhbXBsZVJhdGUgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGU7CisKKyAgSU5UIENDb25jZWFsX1RERmFkaW5nX0FwcGxpZWRbKDgpXSA9IHsKKyAgICAgIDB9OyAvKiBJbml0aWFsaXplIHN0YXR1cyBvZiBUaW1lIERvbWFpbiBmYWRpbmcgKi8KKworICBpZiAoc2VsZi0+YWFjQ2hhbm5lbHMgPD0gMCkgeworICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgIH0KIAogICAvKiBBbnkgc3VwcG9ydGVkIGJhc2UgbGF5ZXIgdmFsaWQgQVUgd2lsbCByZXF1aXJlIG1vcmUgdGhhbiAxNiBiaXRzLiAqLwotICBpZiAoICh0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKHNlbGYtPmhJbnB1dCwgMCkgPCAxNSkgJiYgKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMfEFBQ0RFQ19GTFVTSCkpID09IDApIHsKKyAgaWYgKCh0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKHNlbGYtPmhJbnB1dCwgMCkgPCAxNSkgJiYKKyAgICAgIChmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpID09IDApIHsKICAgICBzZWxmLT5mcmFtZU9LID0gMDsKICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOwogICB9CiAKLQogICAvKiBSZXNldCBQcm9ncmFtIENvbmZpZyBzdHJ1Y3R1cmUgKi8KICAgcGNlID0gJnNlbGYtPnBjZTsKICAgQ1Byb2dyYW1Db25maWdfUmVzZXQocGNlKTsKIAogICBDQWFjRGVjb2Rlcl9BbmNEYXRhUmVzZXQoJnNlbGYtPmFuY0RhdGEpOwotCi0gIHsKKyAgaWYgKCEoZmxhZ3MgJiAoQUFDREVDX0NPTkNFQUwgfCBBQUNERUNfRkxVU0gpKSAmJgorICAgICAgIShzZWxmLT5mbGFnc1swXSAmIChBQ19VU0FDIHwgQUNfUlNWNjAzREEpKSkgewogICAgIGludCBjaDsKLQogICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcgPT0gMCkgewogICAgICAgLyogSW5pdCBDaGFubmVsL0VsZW1lbnQgbWFwcGluZyB0YWJsZSAqLwotICAgICAgZm9yIChjaD0wOyBjaDwoOCk7IGNoKyspIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8ICg4KTsgY2grKykgewogICAgICAgICBzZWxmLT5jaE1hcHBpbmdbY2hdID0gMjU1OwogICAgICAgfQogICAgICAgaWYgKCFDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkKHBjZSkpIHsKICAgICAgICAgaW50IGVsOwotICAgICAgICBmb3IgKGVsPTA7IGVsPCg4KTsgZWwrKykgeworICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCAoMyAqICgoOCkgKiAyKSArICgoKDgpICogMikpIC8gMiArIDQgKiAoMSkgKyAxKTsKKyAgICAgICAgICAgICBlbCsrKSB7CiAgICAgICAgICAgc2VsZi0+ZWxlbWVudHNbZWxdID0gSURfTk9ORTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCisgIGlmIChzZWxmLT5kb3duc2NhbGVGYWN0b3IgPiAxICYmIChzZWxmLT5mbGFnc1swXSAmIEFDX0VMRCkpIHsKKyAgICBzZWxmLT5mbGFnc1swXSB8PSBBQ19FTERfRE9XTlNDQUxFOworICB9IGVsc2UgeworICAgIHNlbGYtPmZsYWdzWzBdICY9IH5BQ19FTERfRE9XTlNDQUxFOworICB9CisgIC8qIHVuc3VwcG9ydGVkIGRzZiAoYWFjU2FtcGxlUmF0ZSBoYXMgbm90IHlldCBiZWVuIGRpdmlkZWQgYnkgZHNmKSAtPiBkaXZpZGUKKyAgICovCisgIGlmIChzZWxmLT5kb3duc2NhbGVGYWN0b3JJbkJTID4gMSAmJgorICAgICAgKHNlbGYtPmZsYWdzWzBdICYgQUNfRUxEX0RPV05TQ0FMRSkgPT0gMCkgeworICAgIGNoZWNrU2FtcGxlUmF0ZSA9CisgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSAvIHNlbGYtPmRvd25zY2FsZUZhY3RvckluQlM7CisgIH0KKwogICAvKiBDaGVjayBzYW1wbGluZyBmcmVxdWVuY3kgICovCi0gIHN3aXRjaCAoIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSApIHsKKyAgaWYgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSA8PSAwKSB7CisgICAgLyogSW5zdGFuY2UgbWF5YmUgdW5pbml0aWFsaXplZCEgKi8KKyAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9TQU1QTElOR1JBVEU7CisgIH0KKyAgc3dpdGNoIChjaGVja1NhbXBsZVJhdGUpIHsKICAgICBjYXNlIDk2MDAwOgogICAgIGNhc2UgODgyMDA6CiAgICAgY2FzZSA2NDAwMDoKICAgICBjYXNlIDE2MDAwOgogICAgIGNhc2UgMTIwMDA6Ci0gICBjYXNlIDExMDI1OgotICAgY2FzZSAgODAwMDoKLSAgICBjYXNlICA3MzUwOgorICAgIGNhc2UgMTEwMjU6CisgICAgY2FzZSA4MDAwOgorICAgIGNhc2UgNzM1MDoKICAgICBjYXNlIDQ4MDAwOgogICAgIGNhc2UgNDQxMDA6CiAgICAgY2FzZSAzMjAwMDoKQEAgLTExNzksMjI1ICsyNDU2LDI3NCBAQAogICAgIGNhc2UgMjIwNTA6CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgaWYgKCAhIChzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MCkpICkgeworICAgICAgaWYgKCEoc2VsZi0+ZmxhZ3NbMF0gJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkpIHsKICAgICAgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFOwogICAgICAgfQogICAgICAgYnJlYWs7CiAgIH0KIAotCi0gIGlmICggZmxhZ3MgJiBBQUNERUNfQ0xSSElTVCApCi0gIHsKLSAgICBpbnQgY2g7Ci0gICAgLyogQ2xlYXIgaGlzdG9yeSAqLwotICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPmFhY0NoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAvKiBSZXNldCBjb25jZWFsbWVudCAqLwotICAgICAgQ0NvbmNlYWxtZW50X0luaXRDaGFubmVsRGF0YSgmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmNvbmNlYWxtZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPmNvbmNlYWxDb21tb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgKTsKLSAgICAgIC8qIENsZWFyIG92ZXJsYXAtYWRkIGJ1ZmZlcnMgdG8gYXZvaWQgY2xpY2tzLiAqLwotICAgICAgRkRLbWVtY2xlYXIoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPnBPdmVybGFwQnVmZmVyLCBPdmVybGFwQnVmZmVyU2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgfQorICBpZiAoZmxhZ3MgJiBBQUNERUNfQ0xSSElTVCkgeworICAgIGlmICghKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQykpIHsKKyAgICAgIGludCBjaDsKKyAgICAgIC8qIENsZWFyIGhpc3RvcnkgKi8KKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPmFhY0NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIC8qIFJlc2V0IGNvbmNlYWxtZW50ICovCisgICAgICAgIENDb25jZWFsbWVudF9Jbml0Q2hhbm5lbERhdGEoCisgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmNvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAgICZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSwKKyAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnJlbmRlck1vZGUsCisgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgIC8qIENsZWFyIG92ZXJsYXAtYWRkIGJ1ZmZlcnMgdG8gYXZvaWQgY2xpY2tzLiAqLworICAgICAgICBGREttZW1jbGVhcihzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIE92ZXJsYXBCdWZmZXJTaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICB9CisgICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5jaGFubmVsQ29uZmlnID4gMCkgeworICAgICAgICAvKiBEZWNsYXJlIHRoZSBwb3NzaWJseSBhZG9wdGVkIG9sZCBQQ0UgKHdpdGggb3V0ZGF0ZWQgbWV0YWRhdGEpCisgICAgICAgICAqIGludmFsaWQuICovCisgICAgICAgIENQcm9ncmFtQ29uZmlnX0luaXQocGNlKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KIAotCi0KLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCi0gIGludCBwY2VSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgaW5kaWNhdGluZyBhIFBDRSBpbiB0aGUgY3VycmVudCByYXdfZGF0YV9ibG9jaygpICovCi0jZW5kaWYKLQorICBpbnQgcGNlUmVhZCA9IDA7IC8qIEZsYWcgaW5kaWNhdGluZyBhIFBDRSBpbiB0aGUgY3VycmVudCByYXdfZGF0YV9ibG9jaygpICovCiAKICAgSU5UIGhkYWFjRGVjb2RlZCA9IDA7Ci0gIE1QNF9FTEVNRU5UX0lEIHByZXZpb3VzX2VsZW1lbnQgPSBJRF9FTkQ7IC8qIExhc3QgZWxlbWVudCBJRCAocmVxdWlyZWQgZm9yIGV4dGVuc2lvbiBwYXlsb2FkIG1hcHBpbmcgKi8KLSAgVUNIQVIgcHJldmlvdXNfZWxlbWVudF9pbmRleCA9IDA7ICAgICAgICAgLyogQ2Fub25pY2FsIGluZGV4IG9mIGxhc3QgZWxlbWVudCAqLwotICBpbnQgZWxlbWVudF9jb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGNvdW50ZXIgZm9yIGVsZW1lbnRzIGZvdW5kIGluIHRoZSBiaXRzdHJlYW0gKi8KLSAgaW50IGVsX2NudFtJRF9MQVNUXSA9IHsgMCB9OyAgICAgICAgICAgICAgLyogZWxlbWVudCBjb3VudGVyICggcm9idXN0bmVzcyApICovCisgIE1QNF9FTEVNRU5UX0lEIHByZXZpb3VzX2VsZW1lbnQgPQorICAgICAgSURfRU5EOyAvKiBMYXN0IGVsZW1lbnQgSUQgKHJlcXVpcmVkIGZvciBleHRlbnNpb24gcGF5bG9hZCBtYXBwaW5nICovCisgIFVDSEFSIHByZXZpb3VzX2VsZW1lbnRfaW5kZXggPSAwOyAvKiBDYW5vbmljYWwgaW5kZXggb2YgbGFzdCBlbGVtZW50ICovCisgIGludCBlbGVtZW50X2NvdW50ID0KKyAgICAgIDA7IC8qIEVsZW1lbnQgY291bnRlciBmb3IgZWxlbWVudHMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSAqLworICBpbnQgY2hhbm5lbF9lbGVtZW50X2NvdW50ID0gMDsgLyogQ2hhbm5lbCBlbGVtZW50IGNvdW50ZXIgKi8KKyAgTVA0X0VMRU1FTlRfSUQKKyAgY2hhbm5lbF9lbGVtZW50c1soMyAqICgoOCkgKiAyKSArICgoKDgpICogMikpIC8gMiArIDQgKiAoMSkgKworICAgICAgICAgICAgICAgICAgICAxKV07ICAgICAvKiBDaGFubmVsIGVsZW1lbnRzIGluIGJpdCBzdHJlYW0gb3JkZXIuICovCisgIGludCBlbF9jbnRbSURfTEFTVF0gPSB7MH07IC8qIGVsZW1lbnQgY291bnRlciAoIHJvYnVzdG5lc3MgKSAqLworICBpbnQgZWxlbWVudF9jb3VudF9wcmV2X3N0cmVhbXMgPQorICAgICAgMDsgLyogRWxlbWVudCBjb3VudCBvZiBhbGwgcHJldmlvdXMgc3ViIHN0cmVhbXMuICovCiAKLSAgd2hpbGUgKCAodHlwZSAhPSBJRF9FTkQpICYmICghIChmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpKSAmJiBzZWxmLT5mcmFtZU9LICkKLSAgeworICB3aGlsZSAoKHR5cGUgIT0gSURfRU5EKSAmJiAoIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpKSAmJgorICAgICAgICAgc2VsZi0+ZnJhbWVPSykgewogICAgIGludCBlbF9jaGFubmVsczsKIAotICAgIGlmICghIChzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MHxBQ19FTER8QUNfU0NBTEFCTEV8QUNfRVIpKSkKLSAgICAgIHR5cGUgPSAoTVA0X0VMRU1FTlRfSUQpIEZES3JlYWRCaXRzKGJzLDMpOwotICAgIGVsc2UgCisgICAgaWYgKCEoc2VsZi0+ZmxhZ3NbMF0gJgorICAgICAgICAgIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEgfCBBQ19FTEQgfCBBQ19TQ0FMQUJMRSB8IEFDX0VSKSkpCisgICAgICB0eXBlID0gKE1QNF9FTEVNRU5UX0lEKUZES3JlYWRCaXRzKGJzLCAzKTsKKyAgICBlbHNlIHsKKyAgICAgIGlmIChlbGVtZW50X2NvdW50ID49ICgzICogKCg4KSAqIDIpICsgKCgoOCkgKiAyKSkgLyAyICsgNCAqICgxKSArIDEpKSB7CisgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgICAgdHlwZSA9IHNlbGYtPmVsZW1lbnRzW2VsZW1lbnRfY291bnRdOworICAgIH0KIAotICAgIHNldEhjclR5cGUoJnNlbGYtPmFhY0NvbW1vbkRhdGEub3ZlcmxheS5hYWMuZXJIY3JJbmZvLCB0eXBlKTsKKyAgICBpZiAoKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmIChBQ19VU0FDIHwgQUNfUlNWRDUwKSAmJgorICAgICAgICAgZWxlbWVudF9jb3VudCA9PSAwKSB8fAorICAgICAgICAoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYgQUNfUlNWNjAzREEpKSB7CisgICAgICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJj0gfkFDX0lOREVQOwogCisgICAgICBpZiAoRkRLcmVhZEJpdChicykpIHsKKyAgICAgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9IEFDX0lOREVQOworICAgICAgfQogCi0gICAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSA8IDApCisgICAgICBpbnQgY2ggPSBhYWNDaGFubmVsczsKKyAgICAgIGZvciAoaW50IGNoSWR4ID0gYWFjQ2hhbm5lbHM7IGNoSWR4IDwgc2VsZi0+YXNjQ2hhbm5lbHNbc3RyZWFtSW5kZXhdOworICAgICAgICAgICBjaElkeCsrKSB7CisgICAgICAgIHsKKyAgICAgICAgICAvKiBSb2J1c3RuZXNzIGNoZWNrICovCisgICAgICAgICAgaWYgKGNoID49IHNlbGYtPmFhY0NoYW5uZWxzKSB7CisgICAgICAgICAgICByZXR1cm4gQUFDX0RFQ19VTktOT1dOOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIGlmIGxhc3QgZnJhbWUgd2FzIGJyb2tlbiBhbmQgdGhpcyBmcmFtZSBpcyBubyBpbmRlcGVuZGVudCBmcmFtZSwKKyAgICAgICAgICAgKiBjb3JyZWN0IGRlY29kaW5nIGlzIGltcG9zc2libGUgd2UgbmVlZCB0byB0cmlnZ2VyIGNvbmNlYWxtZW50ICovCisgICAgICAgICAgaWYgKChDQ29uY2VhbG1lbnRfR2V0TGFzdEZyYW1lT2soCisgICAgICAgICAgICAgICAgICAgJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5jb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgMSkgPT0gMCkgJiYKKyAgICAgICAgICAgICAgIShzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiBBQ19JTkRFUCkpIHsKKyAgICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBjaCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSA8IDApIHsKICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgIH0KIAotICAgIHN3aXRjaCAodHlwZSkKLSAgICB7CisgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICBjYXNlIElEX1NDRToKICAgICAgIGNhc2UgSURfQ1BFOgogICAgICAgY2FzZSBJRF9MRkU6Ci0gICAgICAgIC8qCi0gICAgICAgICAgQ29uc2lzdGVuY3kgY2hlY2sKLSAgICAgICAgKi8KLQotICAgICAgICBpZiAodHlwZSA9PSBJRF9DUEUpIHsKLSAgICAgICAgICBlbF9jaGFubmVscyA9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZWxfY2hhbm5lbHMgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoZWxfY250W3R5cGVdID49IChzZWxmLT5hc2NDaGFubmVscz4+KGVsX2NoYW5uZWxzLTEpKSkgfHwgKGFhY0NoYW5uZWxzID4gKHNlbGYtPmFzY0NoYW5uZWxzLWVsX2NoYW5uZWxzKSkgKSB7Ci0gICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKKyAgICAgIGNhc2UgSURfVVNBQ19TQ0U6CisgICAgICBjYXNlIElEX1VTQUNfQ1BFOgorICAgICAgY2FzZSBJRF9VU0FDX0xGRToKKyAgICAgICAgaWYgKGVsZW1lbnRfY291bnQgPj0gKDMgKiAoKDgpICogMikgKyAoKCg4KSAqIDIpKSAvIDIgKyA0ICogKDEpICsgMSkpIHsKICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoICEoc2VsZi0+ZmxhZ3MgJiAoQUNfVVNBQ3xBQ19SU1ZENTApKSApIHsKLSAgICAgICAgICBpbnQgY2g7Ci0gICAgICAgICAgZm9yIChjaD0wOyBjaCA8IGVsX2NoYW5uZWxzOyBjaCs9MSkgewotICAgICAgICAgICAgQ1Buc19SZXNldERhdGEoJnNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bYWFjQ2hhbm5lbHMrY2hdLT5kYXRhLmFhYy5QbnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bYWFjQ2hhbm5lbHMrY2hdLT5wQ29tRGF0YS0+cG5zSW50ZXJDaGFubmVsRGF0YSk7CisgICAgICAgIGVsX2NoYW5uZWxzID0gQ0FhY0RlY29kZXJfR2V0RUxDaGFubmVscygKKyAgICAgICAgICAgIHR5cGUsIHNlbGYtPnVzYWNTdGVyZW9Db25maWdJbmRleFtlbGVtZW50X2NvdW50XSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICBDb25zaXN0ZW5jeSBjaGVjaworICAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgIGludCB0b3RhbEFzY0NoYW5uZWxzID0gMDsKKworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKDEgKiAxKTsgaSsrKSB7CisgICAgICAgICAgICB0b3RhbEFzY0NoYW5uZWxzICs9IHNlbGYtPmFzY0NoYW5uZWxzW2ldOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKGVsX2NudFt0eXBlXSA+PSAodG90YWxBc2NDaGFubmVscyA+PiAoZWxfY2hhbm5lbHMgLSAxKSkpIHx8CisgICAgICAgICAgICAgIChhYWNDaGFubmVscyA+ICh0b3RhbEFzY0NoYW5uZWxzIC0gZWxfY2hhbm5lbHMpKSkgeworICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKKyAgICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYoc2VsZi0+ZnJhbWVPSykgewotICAgICAgICAgIEVycm9yU3RhdHVzID0gQ0NoYW5uZWxFbGVtZW50X1JlYWQoIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bYWFjQ2hhbm5lbHNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bYWFjQ2hhbm5lbHNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5lcENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5oSW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgIGlmIChFcnJvclN0YXR1cykgeworICAgICAgICBpZiAoIShzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkpIHsKKyAgICAgICAgICBpbnQgY2g7CisgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZWxfY2hhbm5lbHM7IGNoICs9IDEpIHsKKyAgICAgICAgICAgIENQbnNfUmVzZXREYXRhKCZzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2FhY0NoYW5uZWxzICsgY2hdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ZGF0YS5hYWMuUG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2FhY0NoYW5uZWxzICsgY2hdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cENvbURhdGEtPnBuc0ludGVyQ2hhbm5lbERhdGEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLT5mcmFtZU9LKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBDQ2hhbm5lbEVsZW1lbnRfUmVhZCgKKyAgICAgICAgICAgICAgYnMsICZzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2FhY0NoYW5uZWxzXSwKKyAgICAgICAgICAgICAgJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bYWFjQ2hhbm5lbHNdLAorICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFvdCwgJnNlbGYtPnNhbXBsaW5nUmF0ZUluZm9bc3RyZWFtSW5kZXhdLAorICAgICAgICAgICAgICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0sIHNlbGYtPmVsRmxhZ3NbZWxlbWVudF9jb3VudF0sCisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLCBlbF9jaGFubmVscywKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5lcENvbmZpZywgc2VsZi0+aElucHV0KTsKKyAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykgewogICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CiAgICAgICAgICAgfQogICAgICAgICB9CiAKLQotICAgICAgICBpZiAoIHNlbGYtPmZyYW1lT0spIHsKLSAgICAgICAgICAvKiBMb29rdXAgdGhlIGVsZW1lbnQgYW5kIGRlY29kZSBpdCBvbmx5IGlmIGl0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcHJvZ3JhbSAqLwotICAgICAgICAgIGlmICggQ1Byb2dyYW1Db25maWdfTG9va3VwRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgIHBjZSwKLSAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uY2hhbm5lbENvbmZpZywKKyAgICAgICAgaWYgKHNlbGYtPmZyYW1lT0spIHsKKyAgICAgICAgICAvKiBMb29rdXAgdGhlIGVsZW1lbnQgYW5kIGRlY29kZSBpdCBvbmx5IGlmIGl0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgKiBwcm9ncmFtICovCisgICAgICAgICAgaWYgKENQcm9ncmFtQ29uZmlnX0xvb2t1cEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICBwY2UsIHNlbGYtPnN0cmVhbUluZm8uY2hhbm5lbENvbmZpZywKICAgICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bYWFjQ2hhbm5lbHNdLT5FbGVtZW50SW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICBhYWNDaGFubmVscywKLSAgICAgICAgICAgICAgICAgIHNlbGYtPmNoTWFwcGluZywKLSAgICAgICAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxUeXBlLAotICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbEluZGljZXMsCi0gICAgICAgICAgICAgICAgICZwcmV2aW91c19lbGVtZW50X2luZGV4LAotICAgICAgICAgICAgICAgICAgc2VsZi0+ZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICB0eXBlKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCAhaGRhYWNEZWNvZGVkICkgewotICAgICAgICAgICAgICBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlKAotICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bYWFjQ2hhbm5lbHNdLAotICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bYWFjQ2hhbm5lbHNdLAotICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgZWxfY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWFjQ2hhbm5lbHMgKz0gMTsKLSAgICAgICAgICAgIGlmICh0eXBlID09IElEX0NQRSkgewotICAgICAgICAgICAgICBhYWNDaGFubmVscyArPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGFhY0NoYW5uZWxzLCBzZWxmLT5jaE1hcHBpbmcsIHNlbGYtPmNoYW5uZWxUeXBlLAorICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbEluZGljZXMsICg4KSwgJnByZXZpb3VzX2VsZW1lbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICBzZWxmLT5lbGVtZW50cywgdHlwZSkpIHsKKyAgICAgICAgICAgIGNoYW5uZWxfZWxlbWVudHNbY2hhbm5lbF9lbGVtZW50X2NvdW50KytdID0gdHlwZTsKKyAgICAgICAgICAgIGFhY0NoYW5uZWxzICs9IGVsX2NoYW5uZWxzOworICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKICAgICAgICAgICB9CiAgICAgICAgICAgLyogQ3JlYXRlIFNCUiBlbGVtZW50IGZvciBTQlIgZm9yIHVwc2FtcGxpbmcgZm9yIExGRSBlbGVtZW50cywKLSAgICAgICAgICAgICBhbmQgaWYgU0JSIHdhcyBleHBsaWNpdGx5IHNpZ25hbGVkLCBiZWNhdXNlIHRoZSBmaXJzdCBmcmFtZShzKQorICAgICAgICAgICAgIGFuZCBpZiBTQlIgd2FzIGltcGxpY2l0bHkgc2lnbmFsZWQsIGJlY2F1c2UgdGhlIGZpcnN0IGZyYW1lKHMpCiAgICAgICAgICAgICAgbWF5IG5vdCBjb250YWluIFNCUiBwYXlsb2FkIChicm9rZW4gZW5jb2RlciwgYml0IGVycm9ycykuICovCi0gICAgICAgICAgaWYgKCAoc2VsZi0+ZmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgfHwgKHNlbGYtPnNickVuYWJsZWQgPT0gMSkgKQotICAgICAgICAgIHsKKyAgICAgICAgICBpZiAoc2VsZi0+ZnJhbWVPSyAmJgorICAgICAgICAgICAgICAoKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmIEFDX1NCUl9QUkVTRU5UKSB8fAorICAgICAgICAgICAgICAgKHNlbGYtPnNickVuYWJsZWQgPT0gMSkpICYmCisgICAgICAgICAgICAgICEoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYKKyAgICAgICAgICAgICAgICBBQ19VU0FDKSAvKiBJcyBkb25lIGR1cmluZyBleHBsaWNpdCBjb25maWcgc2V0IHVwICovCisgICAgICAgICAgKSB7CiAgICAgICAgICAgICBTQlJfRVJST1Igc2JyRXJyb3I7CisgICAgICAgICAgICBVQ0hBUiBjb25maWdNb2RlID0gMDsKKyAgICAgICAgICAgIFVDSEFSIGNvbmZpZ0NoYW5nZWQgPSAwOworICAgICAgICAgICAgY29uZmlnTW9kZSB8PSBBQ19DTV9BTExPQ19NRU07CiAKICAgICAgICAgICAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9Jbml0RWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgc2VsZi0+aFNickRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFvdCwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfZWxlbWVudF9pbmRleAotICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHNlbGYtPmhTYnJEZWNvZGVyLCBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsIHNlbGYtPnN0cmVhbUluZm8uYW90LCB0eXBlLAorICAgICAgICAgICAgICAgIHByZXZpb3VzX2VsZW1lbnRfaW5kZXgsIDIsIC8qIFNpZ25hbGl6ZSB0aGF0IGhhcm1vbmljU0JSIHNoYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgaWdub3JlZCBpbiB0aGUgY29uZmlnIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGlvbiAqLworICAgICAgICAgICAgICAgIDAsIGNvbmZpZ01vZGUsICZjb25maWdDaGFuZ2VkLCBzZWxmLT5kb3duc2NhbGVGYWN0b3IpOwogICAgICAgICAgICAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykgewotICAgICAgICAgICAgICAvKiBEbyBub3QgdHJ5IHRvIGFwcGx5IFNCUiBiZWNhdXNlIGluaXRpYWxpemluZyB0aGUgZWxlbWVudCBmYWlsZWQuICovCisgICAgICAgICAgICAgIC8qIERvIG5vdCB0cnkgdG8gYXBwbHkgU0JSIGJlY2F1c2UgaW5pdGlhbGl6aW5nIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAqIGZhaWxlZC4gKi8KICAgICAgICAgICAgICAgc2VsZi0+c2JyRW5hYmxlZCA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZWxfY250W3R5cGVdKys7CisgICAgICAgIGlmIChzZWxmLT5mcmFtZU9LICYmIChzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiBBQ19VU0FDKSAmJgorICAgICAgICAgICAgKHR5cGUgPT0gSURfVVNBQ19DUEUgfHwgdHlwZSA9PSBJRF9VU0FDX1NDRSkpIHsKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IGFhY0RlY29kZXJfUGFyc2VFeHBsaWNpdE1wc0FuZFNicigKKyAgICAgICAgICAgICAgc2VsZiwgYnMsIHByZXZpb3VzX2VsZW1lbnQsIHByZXZpb3VzX2VsZW1lbnRfaW5kZXgsIGVsZW1lbnRfY291bnQsCisgICAgICAgICAgICAgIGVsX2NudCk7CisgICAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSBJRF9DQ0U6CiAgICAgICAgIC8qCiAgICAgICAgICAgQ29uc2lzdGVuY3kgY2hlY2sKICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBlbF9jbnRbdHlwZV0gPiBzZWxmLT5hc2NDaGFubmVscyApIHsKKyAgICAgICAgaWYgKGVsX2NudFt0eXBlXSA+IHNlbGYtPmFzY0NoYW5uZWxzW3N0cmVhbUluZGV4XSkgewogICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CiAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc2VsZi0+ZnJhbWVPSykKLSAgICAgICAgeworICAgICAgICBpZiAoc2VsZi0+ZnJhbWVPSykgeworICAgICAgICAgIENBYWNEZWNvZGVyQ29tbW9uRGF0YSBjb21tb25EYXRhOworICAgICAgICAgIENBYWNEZWNvZGVyQ29tbW9uU3RhdGljRGF0YSBjb21tb25TdGF0aWNEYXRhOworICAgICAgICAgIENXb3JrQnVmZmVyQ29yZTEgd29ya0J1ZmZlckNvcmUxOworICAgICAgICAgIGNvbW1vblN0YXRpY0RhdGEucFdvcmtCdWZmZXJDb3JlMSA9ICZ3b3JrQnVmZmVyQ29yZTE7CiAgICAgICAgICAgLyogbWVtb3J5IGZvciBzcGVjdHJhbCBsaW5lcyB0ZW1wb3JhbCBvbiBzY3JhdGNoICovCi0gICAgICAgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKG1kY3RTcGVjLCBGSVhQX0RCTCwgMTAyNCk7CisgICAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChtZGN0U3BlYywgRklYUF9EQkwsIDEwMjQpOwogCiAgICAgICAgICAgLyogY3JlYXRlIGR1bW15IGNoYW5uZWwgZm9yIENDRSBwYXJzaW5nIG9uIHN0YWNrICovCi0gICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAgdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLCAqcFRtcEFhY0RlY29kZXJDaGFubmVsSW5mbzsKKyAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvIHRtcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgKnBUbXBBYWNEZWNvZGVyQ2hhbm5lbEluZm87CiAKLSAgICAgICAgICBGREttZW1jbGVhcihtZGN0U3BlYywgMTAyNCpzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICBGREttZW1jbGVhcihtZGN0U3BlYywgMTAyNCAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gICAgICAgICAgdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLnBEeW5EYXRhID0gICBzZWxmLT5hYWNDb21tb25EYXRhLndvcmtCdWZmZXJDb3JlMS0+cEFhY0RlY29kZXJEeW5hbWljRGF0YTsKLSAgICAgICAgICB0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8ucENvbURhdGEgPSAgJnNlbGYtPmFhY0NvbW1vbkRhdGE7Ci0gICAgICAgICAgdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLnBTcGVjdHJhbENvZWZmaWNpZW50ICA9IChTUEVDVFJBTF9QVFIpbWRjdFNwZWM7CisgICAgICAgICAgdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLnBEeW5EYXRhID0gY29tbW9uRGF0YS5wQWFjRGVjb2RlckR5bmFtaWNEYXRhOworICAgICAgICAgIHRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5wQ29tRGF0YSA9ICZjb21tb25EYXRhOworICAgICAgICAgIHRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5wQ29tU3RhdGljRGF0YSA9ICZjb21tb25TdGF0aWNEYXRhOworICAgICAgICAgIHRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5wU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICAgICAgICAgIChTUEVDVFJBTF9QVFIpbWRjdFNwZWM7CiAgICAgICAgICAgLyogQXNzdW1lIEFBQy1MQyAqLwotICAgICAgICAgIHRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5ncmFudWxlTGVuZ3RoID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgLyA4OwotCisgICAgICAgICAgdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLmdyYW51bGVMZW5ndGggPQorICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSAvIDg7CiAgICAgICAgICAgLyogUmVzZXQgUE5TIGRhdGEuICovCi0gICAgICAgICAgQ1Buc19SZXNldERhdGEoJnRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5kYXRhLmFhYy5QbnNEYXRhLCAmdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLnBDb21EYXRhLT5wbnNJbnRlckNoYW5uZWxEYXRhKTsKLQorICAgICAgICAgIENQbnNfUmVzZXREYXRhKAorICAgICAgICAgICAgICAmdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLmRhdGEuYWFjLlBuc0RhdGEsCisgICAgICAgICAgICAgICZ0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8ucENvbURhdGEtPnBuc0ludGVyQ2hhbm5lbERhdGEpOwogICAgICAgICAgIHBUbXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gPSAmdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvOwogICAgICAgICAgIC8qIGRvIENDRSBwYXJzaW5nICovCi0gICAgICAgICAgRXJyb3JTdGF0dXMgPSBDQ2hhbm5lbEVsZW1lbnRfUmVhZCggYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFRtcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmVwQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmhJbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IENDaGFubmVsRWxlbWVudF9SZWFkKAorICAgICAgICAgICAgICBicywgJnBUbXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIE5VTEwsIHNlbGYtPnN0cmVhbUluZm8uYW90LAorICAgICAgICAgICAgICAmc2VsZi0+c2FtcGxpbmdSYXRlSW5mb1tzdHJlYW1JbmRleF0sIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSwKKyAgICAgICAgICAgICAgQUNfRUxfR0FfQ0NFLCBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwgMSwKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5lcENvbmZpZywgc2VsZi0+aElucHV0KTsKIAotICAgICAgICAgIENfQUxMT0NfU0NSQVRDSF9FTkQobWRjdFNwZWMsIEZJWFBfREJMLCAxMDI0KTsKKyAgICAgICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChtZGN0U3BlYywgRklYUF9EQkwsIDEwMjQpOwogCiAgICAgICAgICAgaWYgKEVycm9yU3RhdHVzKSB7CiAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKICAgICAgICAgICB9CiAKICAgICAgICAgICBpZiAoc2VsZi0+ZnJhbWVPSykgewotICAgICAgICAgICAgLyogTG9va3VwIHRoZSBlbGVtZW50IGFuZCBkZWNvZGUgaXQgb25seSBpZiBpdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2dyYW0gKi8KKyAgICAgICAgICAgIC8qIExvb2t1cCB0aGUgZWxlbWVudCBhbmQgZGVjb2RlIGl0IG9ubHkgaWYgaXQgYmVsb25ncyB0byB0aGUKKyAgICAgICAgICAgICAqIGN1cnJlbnQgcHJvZ3JhbSAqLwogICAgICAgICAgICAgaWYgKENQcm9ncmFtQ29uZmlnX0xvb2t1cEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIHBjZSwKLSAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5jaGFubmVsQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICBwVG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5FbGVtZW50SW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgIHNlbGYtPmNoTWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICZwcmV2aW91c19lbGVtZW50X2luZGV4LAotICAgICAgICAgICAgICAgICAgICBzZWxmLT5lbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgdHlwZSkgKQotICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwY2UsIHNlbGYtPnN0cmVhbUluZm8uY2hhbm5lbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgcFRtcEFhY0RlY29kZXJDaGFubmVsSW5mby0+RWxlbWVudEluc3RhbmNlVGFnLCAwLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5jaE1hcHBpbmcsIHNlbGYtPmNoYW5uZWxUeXBlLCBzZWxmLT5jaGFubmVsSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgKDgpLCAmcHJldmlvdXNfZWxlbWVudF9pbmRleCwgc2VsZi0+ZWxlbWVudHMsIHR5cGUpKSB7CiAgICAgICAgICAgICAgIC8qIGRlY29kaW5nIG9mIENDRSBub3Qgc3VwcG9ydGVkICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KQEAgLTE0MDUsMTU2ICsyNzMxLDE1NyBAQAogICAgICAgICBlbF9jbnRbdHlwZV0rKzsKICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgSURfRFNFOgotICAgICAgICB7Ci0gICAgICAgICAgVUNIQVIgZWxlbWVudF9pbnN0YW5jZV90YWc7CisgICAgICBjYXNlIElEX0RTRTogeworICAgICAgICBVQ0hBUiBlbGVtZW50X2luc3RhbmNlX3RhZzsKIAotICAgICAgICAgIENEYXRhU3RyZWFtRWxlbWVudF9SZWFkKCBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudF9pbnN0YW5jZV90YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1U3RhcnRBbmNob3IgKTsKKyAgICAgICAgQ0RhdGFTdHJlYW1FbGVtZW50X1JlYWQoc2VsZiwgYnMsICZlbGVtZW50X2luc3RhbmNlX3RhZywgYXVTdGFydEFuY2hvcik7CiAKLSAgICAgICAgICBpZiAoIUNQcm9ncmFtQ29uZmlnX0xvb2t1cEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgcGNlLAotICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uY2hhbm5lbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICBlbGVtZW50X2luc3RhbmNlX3RhZywKLSAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgIHNlbGYtPmNoTWFwcGluZywKLSAgICAgICAgICAgICAgICAgICBzZWxmLT5jaGFubmVsVHlwZSwKLSAgICAgICAgICAgICAgICAgICBzZWxmLT5jaGFubmVsSW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICZwcmV2aW91c19lbGVtZW50X2luZGV4LAotICAgICAgICAgICAgICAgICAgIHNlbGYtPmVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgIHR5cGUpICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBtb3N0IGxpa2VseSBhbiBlcnJvciBpbiBiaXRzdHJlYW0gb2NjdXJlZCAqLwotICAgICAgICAgICAgLy9zZWxmLT5mcmFtZU9LID0gMDsKLSAgICAgICAgICB9CisgICAgICAgIGlmICghQ1Byb2dyYW1Db25maWdfTG9va3VwRWxlbWVudCgKKyAgICAgICAgICAgICAgICBwY2UsIHNlbGYtPnN0cmVhbUluZm8uY2hhbm5lbENvbmZpZywgZWxlbWVudF9pbnN0YW5jZV90YWcsIDAsCisgICAgICAgICAgICAgICAgc2VsZi0+Y2hNYXBwaW5nLCBzZWxmLT5jaGFubmVsVHlwZSwgc2VsZi0+Y2hhbm5lbEluZGljZXMsICg4KSwKKyAgICAgICAgICAgICAgICAmcHJldmlvdXNfZWxlbWVudF9pbmRleCwgc2VsZi0+ZWxlbWVudHMsIHR5cGUpKSB7CisgICAgICAgICAgLyogbW9zdCBsaWtlbHkgYW4gZXJyb3IgaW4gYml0c3RyZWFtIG9jY3VyZWQgKi8KKyAgICAgICAgICAvLyBzZWxmLT5mcmFtZU9LID0gMDsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgIH0gYnJlYWs7CiAKLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCi0gICAgICBjYXNlIElEX1BDRToKLSAgICAgICAgewotICAgICAgICAgIGludCByZXN1bHQgPSBDUHJvZ3JhbUNvbmZpZ0VsZW1lbnRfUmVhZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5jaGFubmVsQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVTdGFydEFuY2hvciApOwotICAgICAgICAgIGlmICggcmVzdWx0IDwgMCApIHsKLSAgICAgICAgICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nICovCi0gICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICBjYXNlIElEX1BDRTogeworICAgICAgICBpbnQgcmVzdWx0ID0gQ1Byb2dyYW1Db25maWdFbGVtZW50X1JlYWQoYnMsIHNlbGYtPmhJbnB1dCwgcGNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5jaGFubmVsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVTdGFydEFuY2hvcik7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcgKi8KKyAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID4gMSkgeworICAgICAgICAgIC8qIEJ1aWx0IGVsZW1lbnQgdGFibGUgKi8KKyAgICAgICAgICBpbnQgZWxJZHggPSBDUHJvZ3JhbUNvbmZpZ19HZXRFbGVtZW50VGFibGUoCisgICAgICAgICAgICAgIHBjZSwgc2VsZi0+ZWxlbWVudHMsICgoKDgpKSArICg4KSksICZzZWxmLT5jaE1hcEluZGV4KTsKKyAgICAgICAgICAvKiBSZXNldCB0aGUgcmVtYWluaW5nIHRhYnMgKi8KKyAgICAgICAgICBmb3IgKDsgZWxJZHggPCAoMyAqICgoOCkgKiAyKSArICgoKDgpICogMikpIC8gMiArIDQgKiAoMSkgKyAxKTsKKyAgICAgICAgICAgICAgIGVsSWR4KyspIHsKKyAgICAgICAgICAgIHNlbGYtPmVsZW1lbnRzW2VsSWR4XSA9IElEX05PTkU7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIE1ha2UgbmV3IG51bWJlciBvZiBjaGFubmVsIHBlcnNpc3RlbnQgKi8KKyAgICAgICAgICBzZWxmLT5hc2NDaGFubmVsc1tzdHJlYW1JbmRleF0gPSBwY2UtPk51bUNoYW5uZWxzOworICAgICAgICAgIC8qIElmIFBDRSBpcyBub3QgZmlyc3QgZWxlbWVudCBjb25jZWFsIHRoaXMgZnJhbWUgdG8gYXZvaWQKKyAgICAgICAgICAgKiBpbmNvbnNpc3RlbmNpZXMgKi8KKyAgICAgICAgICBpZiAoZWxlbWVudF9jb3VudCAhPSAwKSB7CiAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIHJlc3VsdCA+IDEgKSB7Ci0gICAgICAgICAgICAvKiBCdWlsdCBlbGVtZW50IHRhYmxlICovCi0gICAgICAgICAgICBpbnQgZWxJZHggPSBDUHJvZ3JhbUNvbmZpZ19HZXRFbGVtZW50VGFibGUocGNlLCBzZWxmLT5lbGVtZW50cywgKDgpLCAmc2VsZi0+Y2hNYXBJbmRleCk7Ci0gICAgICAgICAgICAvKiBSZXNldCB0aGUgcmVtYWluaW5nIHRhYnMgKi8KLSAgICAgICAgICAgIGZvciAoIDsgZWxJZHg8KDgpOyBlbElkeCsrKSB7Ci0gICAgICAgICAgICAgIHNlbGYtPmVsZW1lbnRzW2VsSWR4XSA9IElEX05PTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBNYWtlIG5ldyBudW1iZXIgb2YgY2hhbm5lbCBwZXJzaXN0YW50ICovCi0gICAgICAgICAgICBzZWxmLT5hc2NDaGFubmVscyA9IHBjZS0+TnVtQ2hhbm5lbHM7Ci0gICAgICAgICAgICAvKiBJZiBQQ0UgaXMgbm90IGZpcnN0IGVsZW1lbnQgY29uY2VhbCB0aGlzIGZyYW1lIHRvIGF2b2lkIGluY29uc2lzdGVuY2llcyAqLwotICAgICAgICAgICAgaWYgKCBlbGVtZW50X2NvdW50ICE9IDAgKSB7Ci0gICAgICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBwY2VSZWFkID0gKHJlc3VsdD49MCkgPyAxIDogMDsKICAgICAgICAgfQotICAgICAgICBicmVhazsKLSNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCisgICAgICAgIHBjZVJlYWQgPSAocmVzdWx0ID49IDApID8gMSA6IDA7CisgICAgICB9IGJyZWFrOwogCi0gICAgICBjYXNlIElEX0ZJTDoKLSAgICAgICAgewotICAgICAgICAgIGludCBiaXRDbnQgPSBGREtyZWFkQml0cyhicyw0KTsgICAgICAgICAgIC8qIGJzX2NvdW50ICovCisgICAgICBjYXNlIElEX0ZJTDogeworICAgICAgICBpbnQgYml0Q250ID0gRkRLcmVhZEJpdHMoYnMsIDQpOyAvKiBic19jb3VudCAqLwogCi0gICAgICAgICAgaWYgKGJpdENudCA9PSAxNSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZXNjX2NvdW50ID0gRkRLcmVhZEJpdHMoYnMsOCk7ICAgICAvKiBic19lc2NfY291bnQgKi8KLSAgICAgICAgICAgIGJpdENudCA9ICBlc2NfY291bnQgKyAxNDsKLSAgICAgICAgICB9CisgICAgICAgIGlmIChiaXRDbnQgPT0gMTUpIHsKKyAgICAgICAgICBpbnQgZXNjX2NvdW50ID0gRkRLcmVhZEJpdHMoYnMsIDgpOyAvKiBic19lc2NfY291bnQgKi8KKyAgICAgICAgICBiaXRDbnQgPSBlc2NfY291bnQgKyAxNDsKKyAgICAgICAgfQogCi0gICAgICAgICAgLyogQ29udmVydCB0byBiaXRzICovCi0gICAgICAgICAgYml0Q250IDw8PSAzOworICAgICAgICAvKiBDb252ZXJ0IHRvIGJpdHMgKi8KKyAgICAgICAgYml0Q250IDw8PSAzOwogCi0gICAgICAgICAgd2hpbGUgKGJpdENudCA+IDApIHsKLSAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQ0FhY0RlY29kZXJfRXh0UGF5bG9hZFBhcnNlKHNlbGYsIGJzLCAmYml0Q250LCBwcmV2aW91c19lbGVtZW50LCBwcmV2aW91c19lbGVtZW50X2luZGV4LCAxKTsKLSAgICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKSB7Ci0gICAgICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGJpdENudCA+IDApIHsKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IENBYWNEZWNvZGVyX0V4dFBheWxvYWRQYXJzZSgKKyAgICAgICAgICAgICAgc2VsZiwgYnMsICZiaXRDbnQsIHByZXZpb3VzX2VsZW1lbnQsIHByZXZpb3VzX2VsZW1lbnRfaW5kZXgsIDEpOworICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgIH0gYnJlYWs7CiAKICAgICAgIGNhc2UgSURfRVhUOgotICAgICAgICB7Ci0gICAgICAgICAgSU5UIGJpdENudCA9IDA7Ci0KLSAgICAgICAgICAvKiBnZXQgdGhlIHJlbWFpbmluZyBiaXRzIG9mIHRoaXMgZnJhbWUgKi8KLSAgICAgICAgICBiaXRDbnQgPSB0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKHNlbGYtPmhJbnB1dCwgMCk7Ci0KLSAgICAgICAgICBpZiAoIChiaXRDbnQgPiAwKSAmJiAoc2VsZi0+ZmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgJiYgKHNlbGYtPmZsYWdzICYgKEFDX1VTQUN8QUNfUlNWRDUwfEFDX0VMRHxBQ19EUk0pKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgU0JSX0VSUk9SIGVyciA9IFNCUkRFQ19PSzsKLSAgICAgICAgICAgIGludCAgZWxJZHgsIG51bUNoRWxlbWVudHMgPSBlbF9jbnRbSURfU0NFXSArIGVsX2NudFtJRF9DUEVdOwotCi0gICAgICAgICAgICBmb3IgKGVsSWR4ID0gMDsgZWxJZHggPCBudW1DaEVsZW1lbnRzOyBlbElkeCArPSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlcnIgPSBzYnJEZWNvZGVyX1BhcnNlICgKLSAgICAgICAgICAgICAgICAgICAgc2VsZi0+aFNickRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgIGJzLAotICAgICAgICAgICAgICAgICAgICZiaXRDbnQsCi0gICAgICAgICAgICAgICAgICAgIC0xLAotICAgICAgICAgICAgICAgICAgICBzZWxmLT5mbGFncyAmIEFDX1NCUkNSQywKLSAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZWxlbWVudHNbZWxJZHhdLAotICAgICAgICAgICAgICAgICAgICBlbElkeCwKLSAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MgJiBBQ19JTkRFUCApOwotCi0gICAgICAgICAgICAgIGlmIChlcnIgIT0gU0JSREVDX09LKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoZXJyKSB7Ci0gICAgICAgICAgICBjYXNlIFNCUkRFQ19QQVJTRV9FUlJPUjoKLSAgICAgICAgICAgICAgLyogQ2FuIG5vdCBnbyBvbiBwYXJzaW5nIGJlY2F1c2Ugd2UgZG8gbm90Ci0gICAgICAgICAgICAgICAgIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgU0JSIGV4dGVuc2lvbiBkYXRhLiAqLwotICAgICAgICAgICAgICBGREtwdXNoRm9yKGJzLCBiaXRDbnQpOwotICAgICAgICAgICAgICBiaXRDbnQgPSAwOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0JSREVDX09LOgotICAgICAgICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gMTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICBpZiAoc2VsZi0+ZmxhZ3MgJiBBQ19EUk0pCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKChiaXRDbnQgPSAoSU5UKUZES2dldFZhbGlkQml0cyhicykpICE9IDApIHsKLSAgICAgICAgICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIGJpdENudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCAhIChzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MHxBQ19EUk0pKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKCBiaXRDbnQgPiA3ICkgewotICAgICAgICAgICAgICBFcnJvclN0YXR1cyA9IENBYWNEZWNvZGVyX0V4dFBheWxvYWRQYXJzZShzZWxmLCBicywgJmJpdENudCwgcHJldmlvdXNfZWxlbWVudCwgcHJldmlvdXNfZWxlbWVudF9pbmRleCwgMCk7Ci0gICAgICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKSB7Ci0gICAgICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7Ci0gICAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudF9jb3VudCA+PSAoMyAqICgoOCkgKiAyKSArICgoKDgpICogMikpIC8gMiArIDQgKiAoMSkgKyAxKSkgeworICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQorCisgICAgICAgIEVycm9yU3RhdHVzID0gYWFjRGVjb2Rlcl9QYXJzZUV4cGxpY2l0TXBzQW5kU2JyKAorICAgICAgICAgICAgc2VsZiwgYnMsIHByZXZpb3VzX2VsZW1lbnQsIHByZXZpb3VzX2VsZW1lbnRfaW5kZXgsIGVsZW1lbnRfY291bnQsCisgICAgICAgICAgICBlbF9jbnQpOwogICAgICAgICBicmVhazsKIAorICAgICAgY2FzZSBJRF9VU0FDX0VYVDogeworICAgICAgICBpZiAoKGVsZW1lbnRfY291bnQgLSBlbGVtZW50X2NvdW50X3ByZXZfc3RyZWFtcykgPj0KKyAgICAgICAgICAgIFRQX1VTQUNfTUFYX0VMRU1FTlRTKSB7CisgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIHBhcnNlIGV4dGVuc2lvbiBlbGVtZW50IHBheWxvYWQKKyAgICAgICAgICAgcS52LiByc3Y2MDNkYUV4dEVsZW1lbnQoKSBJU08vSUVDIERJUyAyMzAwOC0zICBUYWJsZSAzMAorICAgICAgICAgICBvciAgIFVzYWNFeEVsZW1lbnQoKSBJU08vSUVDIEZESVMgMjMwMDMtMzoyMDExKEUpICBUYWJsZSAyMQorICAgICAgICAgKi8KKyAgICAgICAgaW50IHVzYWNFeHRFbGVtZW50UGF5bG9hZExlbmd0aDsKKyAgICAgICAgLyogaW50IHVzYWNFeHRFbGVtZW50U3RhcnQsIHVzYWNFeHRFbGVtZW50U3RvcDsgKi8KKworICAgICAgICBpZiAoRkRLcmVhZEJpdChicykpIHsgICAvKiB1c2FjRXh0RWxlbWVudFByZXNlbnQgKi8KKyAgICAgICAgICBpZiAoRkRLcmVhZEJpdChicykpIHsgLyogdXNhY0V4dEVsZW1lbnRVc2VEZWZhdWx0TGVuZ3RoICovCisgICAgICAgICAgICB1c2FjRXh0RWxlbWVudFBheWxvYWRMZW5ndGggPQorICAgICAgICAgICAgICAgIHNlbGYtPnBVc2FjQ29uZmlnW3N0cmVhbUluZGV4XQorICAgICAgICAgICAgICAgICAgICAtPmVsZW1lbnRbZWxlbWVudF9jb3VudCAtIGVsZW1lbnRfY291bnRfcHJldl9zdHJlYW1zXQorICAgICAgICAgICAgICAgICAgICAuZXh0RWxlbWVudC51c2FjRXh0RWxlbWVudERlZmF1bHRMZW5ndGg7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzYWNFeHRFbGVtZW50UGF5bG9hZExlbmd0aCA9IEZES3JlYWRCaXRzKGJzLCA4KTsKKyAgICAgICAgICAgIGlmICh1c2FjRXh0RWxlbWVudFBheWxvYWRMZW5ndGggPT0gKFVJTlQpKDEgPDwgOCkgLSAxKSB7CisgICAgICAgICAgICAgIFVJTlQgdmFsdWVBZGQgPSBGREtyZWFkQml0cyhicywgMTYpOworICAgICAgICAgICAgICB1c2FjRXh0RWxlbWVudFBheWxvYWRMZW5ndGggKz0gKElOVCl2YWx1ZUFkZCAtIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh1c2FjRXh0RWxlbWVudFBheWxvYWRMZW5ndGggPiAwKSB7CisgICAgICAgICAgICBpbnQgdXNhY0V4dEJpdFBvczsKKworICAgICAgICAgICAgaWYgKHNlbGYtPnBVc2FjQ29uZmlnW3N0cmVhbUluZGV4XQorICAgICAgICAgICAgICAgICAgICAtPmVsZW1lbnRbZWxlbWVudF9jb3VudCAtIGVsZW1lbnRfY291bnRfcHJldl9zdHJlYW1zXQorICAgICAgICAgICAgICAgICAgICAuZXh0RWxlbWVudC51c2FjRXh0RWxlbWVudFBheWxvYWRGcmFnKSB7CisgICAgICAgICAgICAgIC8qIHVzYWNFeHRFbGVtZW50U3RhcnQgPSAqLyBGREtyZWFkQml0KGJzKTsKKyAgICAgICAgICAgICAgLyogdXNhY0V4dEVsZW1lbnRTdG9wID0gKi8gRkRLcmVhZEJpdChicyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiB1c2FjRXh0RWxlbWVudFN0YXJ0ID0gMTsgKi8KKyAgICAgICAgICAgICAgLyogdXNhY0V4dEVsZW1lbnRTdG9wID0gMTsgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNhY0V4dEJpdFBvcyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKTsKKworICAgICAgICAgICAgVVNBQ19FWFRfRUxFTUVOVF9UWVBFIHVzYWNFeHRFbGVtZW50VHlwZSA9CisgICAgICAgICAgICAgICAgc2VsZi0+cFVzYWNDb25maWdbc3RyZWFtSW5kZXhdCisgICAgICAgICAgICAgICAgICAgIC0+ZWxlbWVudFtlbGVtZW50X2NvdW50IC0gZWxlbWVudF9jb3VudF9wcmV2X3N0cmVhbXNdCisgICAgICAgICAgICAgICAgICAgIC5leHRFbGVtZW50LnVzYWNFeHRFbGVtZW50VHlwZTsKKworICAgICAgICAgICAgc3dpdGNoICh1c2FjRXh0RWxlbWVudFR5cGUpIHsKKyAgICAgICAgICAgICAgY2FzZSBJRF9FWFRfRUxFX1VOSV9EUkM6IC8qIHVuaURyY0dhaW4oKSAqLworICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBpbnQgZHJjRXJyOworCisgICAgICAgICAgICAgICAgICBkcmNFcnIgPSBGREtfZHJjRGVjX1JlYWRVbmlEcmNHYWluKHNlbGYtPmhVbmlEcmNEZWNvZGVyLCBicyk7CisgICAgICAgICAgICAgICAgICBpZiAoZHJjRXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTa2lwIGFueSByZW1haW5pbmcgYml0cyBvZiBleHRlbnNpb24gcGF5bG9hZCAqLworICAgICAgICAgICAgdXNhY0V4dEJpdFBvcyA9ICh1c2FjRXh0RWxlbWVudFBheWxvYWRMZW5ndGggKiA4KSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzYWNFeHRCaXRQb3MgLSAoSU5UKUZES2dldFZhbGlkQml0cyhicykpOworICAgICAgICAgICAgaWYgKHVzYWNFeHRCaXRQb3MgPCAwKSB7CisgICAgICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgdXNhY0V4dEJpdFBvcyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGJyZWFrOwogICAgICAgY2FzZSBJRF9FTkQ6CisgICAgICBjYXNlIElEX1VTQUNfRU5EOgogICAgICAgICBicmVhazsKIAogICAgICAgZGVmYXVsdDoKQEAgLTE1NjYsMzIgKzI4OTMsNTYgQEAKICAgICBwcmV2aW91c19lbGVtZW50ID0gdHlwZTsKICAgICBlbGVtZW50X2NvdW50Kys7CiAKLSAgfSAgIC8qIHdoaWxlICggKHR5cGUgIT0gSURfRU5EKSAuLi4gKSAqLworICB9IC8qIHdoaWxlICggKHR5cGUgIT0gSURfRU5EKSAuLi4gKSAqLwogCi0gIGlmICggIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTHxBQUNERUNfRkxVU0gpKSApCi0gIHsKKyAgaWYgKCEoZmxhZ3MgJiAoQUFDREVDX0NPTkNFQUwgfCBBQUNERUNfRkxVU0gpKSkgeworICAgIC8qIGZsb2F0IGRlY29kZXIgY2hlY2tzIGlmIGJpdHNMZWZ0IGlzIGluIHJhbmdlIDAtNzsgb25seSBwcmVyb2xsQVVzIGFyZQorICAgICAqIGJ5dGVBbGlnbmVkIHdpdGggcmVzcGVjdCB0byB0aGUgZmlyc3QgYml0ICovCiAgICAgLyogQnl0ZSBhbGlnbm1lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSBmaXJzdCBiaXQgb2YgdGhlIHJhd19kYXRhX2Jsb2NrKCkuICovCi0gICAgeworICAgIGlmICghKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmIChBQ19SU1ZENTAgfCBBQ19VU0FDKSkgfHwKKyAgICAgICAgKHNlbGYtPnByZXJvbGxBVUxlbmd0aFtzZWxmLT5hY2Nlc3NVbml0XSkgLyogaW5kaWNhdGVzIHByZXJvbGwgKi8KKyAgICApIHsKICAgICAgIEZES2J5dGVBbGlnbihicywgYXVTdGFydEFuY2hvcik7CiAgICAgfQogCiAgICAgLyogQ2hlY2sgaWYgYWxsIGJpdHMgb2YgdGhlIHJhd19kYXRhX2Jsb2NrKCkgaGF2ZSBiZWVuIHJlYWQuICovCi0gICAgaWYgKCB0cmFuc3BvcnREZWNfR2V0QXVCaXRzVG90YWwoc2VsZi0+aElucHV0LCAwKSA+IDAgKSB7CisgICAgaWYgKHRyYW5zcG9ydERlY19HZXRBdUJpdHNUb3RhbChzZWxmLT5oSW5wdXQsIDApID4gMCkgewogICAgICAgSU5UIHVucmVhZEJpdHMgPSB0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKHNlbGYtPmhJbnB1dCwgMCk7Ci0gICAgICBpZiAoIHVucmVhZEJpdHMgIT0gMCApIHsKKyAgICAgIC8qIGZvciBwcmUtcm9sbCBmcmFtZXMgcHJlLXJvbGwgbGVuZ3RoIGhhcyB0byBiZSB1c2VkIGluc3RlYWQgb2YgdG90YWwgQVUKKyAgICAgICAqIGxlbmdodCAqLworICAgICAgLyogdW5yZWFkQml0cyByZWdhcmRpbmcgcHJlcm9sbCBib3VuZHMgKi8KKyAgICAgIGlmIChzZWxmLT5wcmVyb2xsQVVMZW5ndGhbc2VsZi0+YWNjZXNzVW5pdF0pIHsKKyAgICAgICAgdW5yZWFkQml0cyA9IHVucmVhZEJpdHMgLSB0cmFuc3BvcnREZWNfR2V0QXVCaXRzVG90YWwoc2VsZi0+aElucHV0LCAwKSArCisgICAgICAgICAgICAgICAgICAgICAoSU5UKXNlbGYtPnByZXJvbGxBVUxlbmd0aFtzZWxmLT5hY2Nlc3NVbml0XTsKKyAgICAgIH0KKyAgICAgIGlmICgoKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmIChBQ19SU1ZENTAgfCBBQ19VU0FDKSkgJiYKKyAgICAgICAgICAgKCh1bnJlYWRCaXRzIDwgMCkgfHwgKHVucmVhZEJpdHMgPiA3KSkgJiYKKyAgICAgICAgICAgIShzZWxmLT5wcmVyb2xsQVVMZW5ndGhbc2VsZi0+YWNjZXNzVW5pdF0pKSB8fAorICAgICAgICAgICgoIShzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiAoQUNfUlNWRDUwIHwgQUNfVVNBQykpIHx8CisgICAgICAgICAgICAoc2VsZi0+cHJlcm9sbEFVTGVuZ3RoW3NlbGYtPmFjY2Vzc1VuaXRdKSkgJiYKKyAgICAgICAgICAgKHVucmVhZEJpdHMgIT0gMCkpKSB7CisgICAgICAgIGlmICgoKCh1bnJlYWRCaXRzIDwgMCkgfHwgKHVucmVhZEJpdHMgPiA3KSkgJiYgc2VsZi0+ZnJhbWVPSykgJiYKKyAgICAgICAgICAgICgodHJhbnNwb3J0RGVjX0dldEZvcm1hdChzZWxmLT5oSW5wdXQpID09IFRUX0RSTSkgJiYKKyAgICAgICAgICAgICAoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYgQUNfVVNBQykpKSB7CisgICAgICAgICAgLyogU2V0IGZyYW1lIE9LIGJlY2F1c2Ugb2YgZmlsbCBiaXRzLiAqLworICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICB9CiAKLSAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CiAgICAgICAgIC8qIERvIG5vdCBvdmVyd3JpdGUgY3VycmVudCBlcnJvciAqLwogICAgICAgICBpZiAoRXJyb3JTdGF0dXMgPT0gQUFDX0RFQ19PSyAmJiBzZWxmLT5mcmFtZU9LID09IDApIHsKICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgLyogQWx3YXlzIHB1dCB0aGUgYml0YnVmZmVyIGF0IHRoZSByaWdodCBwb3NpdGlvbiBhZnRlciB0aGUgY3VycmVudCBBY2Nlc3MgVW5pdC4gKi8KKyAgICAgICAgLyogQWx3YXlzIHB1dCB0aGUgYml0YnVmZmVyIGF0IHRoZSByaWdodCBwb3NpdGlvbiBhZnRlciB0aGUgY3VycmVudAorICAgICAgICAgKiBBY2Nlc3MgVW5pdC4gKi8KICAgICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIHVucmVhZEJpdHMpOwogICAgICAgfQogICAgIH0KIAotICAgIC8qIENoZWNrIHRoZSBsYXN0IGVsZW1lbnQuIFRoZSB0ZXJtaW5hdG9yIChJRF9FTkQpIGhhcyB0byBiZSB0aGUgbGFzdCBvbmUgKGV2ZW4gaWYgRVIgc3ludGF4IGlzIHVzZWQpLiAqLwotICAgIGlmICggc2VsZi0+ZnJhbWVPSyAmJiB0eXBlICE9IElEX0VORCApIHsKKyAgICAvKiBDaGVjayB0aGUgbGFzdCBlbGVtZW50LiBUaGUgdGVybWluYXRvciAoSURfRU5EKSBoYXMgdG8gYmUgdGhlIGxhc3Qgb25lCisgICAgICogKGV2ZW4gaWYgRVIgc3ludGF4IGlzIHVzZWQpLiAqLworICAgIGlmIChzZWxmLT5mcmFtZU9LICYmIHR5cGUgIT0gSURfRU5EKSB7CiAgICAgICAvKiBEbyBub3Qgb3ZlcndyaXRlIGN1cnJlbnQgZXJyb3IgKi8KICAgICAgIGlmIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSB7CiAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKQEAgLTE2MDAsMjE5ICsyOTUxLDQ3OSBAQAogICAgIH0KICAgfQogCi0gIC8qIE1vcmUgQUFDIGNoYW5uZWxzIHRoYW4gc3BlY2lmaWVkIGJ5IHRoZSBBU0Mgbm90IGFsbG93ZWQuICovCi0gIGlmICggKGFhY0NoYW5uZWxzID09IDAgfHwgYWFjQ2hhbm5lbHMgPiBzZWxmLT5hYWNDaGFubmVscykgJiYgIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTHxBQUNERUNfRkxVU0gpKSApIHsKLSAgICB7Ci0gICAgICAvKiBEbyBub3Qgb3ZlcndyaXRlIGN1cnJlbnQgZXJyb3IgKi8KLSAgICAgIGlmIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSB7Ci0gICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7Ci0gICAgICB9Ci0gICAgICBzZWxmLT5mcmFtZU9LID0gMDsKLSAgICB9Ci0gICAgYWFjQ2hhbm5lbHMgPSAwOworICBpZiAoIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpICYmIHNlbGYtPmZyYW1lT0spIHsKKyAgICBjaGFubmVsX2VsZW1lbnRzW2NoYW5uZWxfZWxlbWVudF9jb3VudCsrXSA9IElEX0VORDsKICAgfQotICBlbHNlIGlmICggYWFjQ2hhbm5lbHMgPiBzZWxmLT5hc2NDaGFubmVscyApIHsKKyAgZWxlbWVudF9jb3VudCA9IDA7CisgIGFhY0NoYW5uZWxzID0gMDsKKyAgdHlwZSA9IElEX05PTkU7CisgIHByZXZpb3VzX2VsZW1lbnRfaW5kZXggPSAwOworCisgIHdoaWxlICh0eXBlICE9IElEX0VORCAmJgorICAgICAgICAgZWxlbWVudF9jb3VudCA8ICgzICogKCg4KSAqIDIpICsgKCgoOCkgKiAyKSkgLyAyICsgNCAqICgxKSArIDEpKSB7CisgICAgaW50IGVsX2NoYW5uZWxzOworCisgICAgaWYgKChmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpIHx8ICFzZWxmLT5mcmFtZU9LKSB7CisgICAgICBjaGFubmVsX2VsZW1lbnRzW2VsZW1lbnRfY291bnRdID0gc2VsZi0+ZWxlbWVudHNbZWxlbWVudF9jb3VudF07CisgICAgICBpZiAoY2hhbm5lbF9lbGVtZW50c1tlbGVtZW50X2NvdW50XSA9PSBJRF9OT05FKSB7CisgICAgICAgIGNoYW5uZWxfZWxlbWVudHNbZWxlbWVudF9jb3VudF0gPSBJRF9FTkQ7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmIChBQ19VU0FDIHwgQUNfUlNWNjAzREEgfCBBQ19CU0FDKSkgeworICAgICAgdHlwZSA9IHNlbGYtPmVsZW1lbnRzW2VsZW1lbnRfY291bnRdOworICAgIH0gZWxzZSB7CisgICAgICB0eXBlID0gY2hhbm5lbF9lbGVtZW50c1tlbGVtZW50X2NvdW50XTsKKyAgICB9CisKKyAgICBpZiAoIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpICYmIHNlbGYtPmZyYW1lT0spIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIElEX1NDRToKKyAgICAgICAgY2FzZSBJRF9DUEU6CisgICAgICAgIGNhc2UgSURfTEZFOgorICAgICAgICBjYXNlIElEX1VTQUNfU0NFOgorICAgICAgICBjYXNlIElEX1VTQUNfQ1BFOgorICAgICAgICBjYXNlIElEX1VTQUNfTEZFOgorCisgICAgICAgICAgZWxfY2hhbm5lbHMgPSBDQWFjRGVjb2Rlcl9HZXRFTENoYW5uZWxzKAorICAgICAgICAgICAgICB0eXBlLCBzZWxmLT51c2FjU3RlcmVvQ29uZmlnSW5kZXhbZWxlbWVudF9jb3VudF0pOworCisgICAgICAgICAgaWYgKCFoZGFhY0RlY29kZWQpIHsKKyAgICAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2FhY0NoYW5uZWxzXQorICAgICAgICAgICAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1thYWNDaGFubmVsc10KKyAgICAgICAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEuc2NyYXRjaEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAoRklYUF9EQkwgKilwVGltZURhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlKAorICAgICAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2FhY0NoYW5uZWxzXSwKKyAgICAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1thYWNDaGFubmVsc10sCisgICAgICAgICAgICAgICAgJnNlbGYtPnNhbXBsaW5nUmF0ZUluZm9bc3RyZWFtSW5kZXhdLCBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0sCisgICAgICAgICAgICAgICAgc2VsZi0+ZWxGbGFnc1tlbGVtZW50X2NvdW50XSwgZWxfY2hhbm5lbHMpOworICAgICAgICAgIH0KKyAgICAgICAgICBhYWNDaGFubmVscyArPSBlbF9jaGFubmVsczsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJRF9OT05FOgorICAgICAgICAgIHR5cGUgPSBJRF9FTkQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGVsZW1lbnRfY291bnQrKzsKKyAgfQorCisgIC8qIE1vcmUgQUFDIGNoYW5uZWxzIHRoYW4gc3BlY2lmaWVkIGJ5IHRoZSBBU0Mgbm90IGFsbG93ZWQuICovCisgIGlmICgoYWFjQ2hhbm5lbHMgPT0gMCB8fCBhYWNDaGFubmVscyA+IHNlbGYtPmFhY0NoYW5uZWxzKSAmJgorICAgICAgIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpKSB7CiAgICAgLyogRG8gbm90IG92ZXJ3cml0ZSBjdXJyZW50IGVycm9yICovCiAgICAgaWYgKEVycm9yU3RhdHVzID09IEFBQ19ERUNfT0spIHsKLSAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOwogICAgIH0KICAgICBzZWxmLT5mcmFtZU9LID0gMDsKICAgICBhYWNDaGFubmVscyA9IDA7CiAgIH0KIAotICBpZiAoIFRSQU5TUE9SVERFQ19PSyAhPSB0cmFuc3BvcnREZWNfQ3JjQ2hlY2soc2VsZi0+aElucHV0KSApCi0gIHsKLSAgICBzZWxmLT5mcmFtZU9LPTA7CisgIGlmIChUUkFOU1BPUlRERUNfT0sgIT0gdHJhbnNwb3J0RGVjX0NyY0NoZWNrKHNlbGYtPmhJbnB1dCkpIHsKKyAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfQ1JDX0VSUk9SOworICAgIHNlbGYtPmZyYW1lT0sgPSAwOwogICB9CiAKLSAgLyogc3RvcmUgb3IgcmVzdG9yZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbmZvICovCi0gIGlmICggc2VsZi0+ZnJhbWVPSyAmJiAhKGZsYWdzICYoQUFDREVDX0NPTkNFQUx8QUFDREVDX0ZMVVNIKSkgKSB7Ci0gICAgc2VsZi0+YWFjQ2hhbm5lbHNQcmV2ID0gYWFjQ2hhbm5lbHM7ICAvKiBzdG9yZSAqLwotICAgIEZES21lbWNweShzZWxmLT5jaGFubmVsVHlwZVByZXYsIHNlbGYtPmNoYW5uZWxUeXBlLCAoOCkqc2l6ZW9mKEFVRElPX0NIQU5ORUxfVFlQRSkpOyAgLyogc3RvcmUgKi8KLSAgICBGREttZW1jcHkoc2VsZi0+Y2hhbm5lbEluZGljZXNQcmV2LCBzZWxmLT5jaGFubmVsSW5kaWNlcywgKDgpKnNpemVvZihVQ0hBUikpOyAgICAgICAgIC8qIHN0b3JlICovCi0gICAgc2VsZi0+c2JyRW5hYmxlZFByZXYgPSBzZWxmLT5zYnJFbmFibGVkOworICAvKiBFbnN1cmUgdGhhdCBpbiBjYXNlIG9mIGNvbmNlYWxtZW50IGEgcHJvcGVyIGVycm9yIHN0YXR1cyBpcyBzZXQuICovCisgIGlmICgoc2VsZi0+ZnJhbWVPSyA9PSAwKSAmJiAoRXJyb3JTdGF0dXMgPT0gQUFDX0RFQ19PSykpIHsKKyAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICB9CisKKyAgaWYgKHNlbGYtPmZyYW1lT0sgJiYgKGZsYWdzICYgQUFDREVDX0ZMVVNIKSkgeworICAgIGFhY0NoYW5uZWxzID0gc2VsZi0+YWFjQ2hhbm5lbHNQcmV2OworICAgIC8qIEJlY2F1c2UgdGhlIGRvd25taXggY291bGQgYmUgYWN0aXZlLCBpdHMgbmVjZXNzYXJ5IHRvIHJlc3RvcmUgdGhlIGNoYW5uZWwKKyAgICAgKiB0eXBlIGFuZCBpbmRpY2VzLiAqLworICAgIEZES21lbWNweShzZWxmLT5jaGFubmVsVHlwZSwgc2VsZi0+Y2hhbm5lbFR5cGVQcmV2LAorICAgICAgICAgICAgICAoOCkgKiBzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7IC8qIHJlc3RvcmUgKi8KKyAgICBGREttZW1jcHkoc2VsZi0+Y2hhbm5lbEluZGljZXMsIHNlbGYtPmNoYW5uZWxJbmRpY2VzUHJldiwKKyAgICAgICAgICAgICAgKDgpICogc2l6ZW9mKFVDSEFSKSk7IC8qIHJlc3RvcmUgKi8KKyAgICBzZWxmLT5zYnJFbmFibGVkID0gc2VsZi0+c2JyRW5hYmxlZFByZXY7CiAgIH0gZWxzZSB7Ci0gICAgaWYgKHNlbGYtPmFhY0NoYW5uZWxzID4gMCkgewotICAgICAgYWFjQ2hhbm5lbHMgPSBzZWxmLT5hYWNDaGFubmVsc1ByZXY7ICAvKiByZXN0b3JlICovCi0gICAgICBGREttZW1jcHkoc2VsZi0+Y2hhbm5lbFR5cGUsIHNlbGYtPmNoYW5uZWxUeXBlUHJldiwgKDgpKnNpemVvZihBVURJT19DSEFOTkVMX1RZUEUpKTsgIC8qIHJlc3RvcmUgKi8KLSAgICAgIEZES21lbWNweShzZWxmLT5jaGFubmVsSW5kaWNlcywgc2VsZi0+Y2hhbm5lbEluZGljZXNQcmV2LCAoOCkqc2l6ZW9mKFVDSEFSKSk7ICAgICAgICAgLyogcmVzdG9yZSAqLwotICAgICAgc2VsZi0+c2JyRW5hYmxlZCA9IHNlbGYtPnNickVuYWJsZWRQcmV2OwotICAgICB9CisgICAgLyogc3RvcmUgb3IgcmVzdG9yZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbmZvICovCisgICAgaWYgKHNlbGYtPmZyYW1lT0sgJiYgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSkgeworICAgICAgc2VsZi0+YWFjQ2hhbm5lbHNQcmV2ID0gYWFjQ2hhbm5lbHM7IC8qIHN0b3JlICovCisgICAgICBGREttZW1jcHkoc2VsZi0+Y2hhbm5lbFR5cGVQcmV2LCBzZWxmLT5jaGFubmVsVHlwZSwKKyAgICAgICAgICAgICAgICAoOCkgKiBzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7IC8qIHN0b3JlICovCisgICAgICBGREttZW1jcHkoc2VsZi0+Y2hhbm5lbEluZGljZXNQcmV2LCBzZWxmLT5jaGFubmVsSW5kaWNlcywKKyAgICAgICAgICAgICAgICAoOCkgKiBzaXplb2YoVUNIQVIpKTsgLyogc3RvcmUgKi8KKyAgICAgIHNlbGYtPnNickVuYWJsZWRQcmV2ID0gc2VsZi0+c2JyRW5hYmxlZDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHNlbGYtPmFhY0NoYW5uZWxzID4gMCkgeworICAgICAgICBpZiAoKHNlbGYtPmJ1aWxkVXBTdGF0dXMgPT0gQUFDREVDX1JTVjYwX0JVSUxEX1VQX09OKSB8fAorICAgICAgICAgICAgKHNlbGYtPmJ1aWxkVXBTdGF0dXMgPT0gQUFDREVDX1JTVjYwX0JVSUxEX1VQX09OX0lOX0JBTkQpIHx8CisgICAgICAgICAgICAoc2VsZi0+YnVpbGRVcFN0YXR1cyA9PSBBQUNERUNfVVNBQ19CVUlMRF9VUF9PTikpIHsKKyAgICAgICAgICBhYWNDaGFubmVscyA9IHNlbGYtPmFhY0NoYW5uZWxzOworICAgICAgICAgIHNlbGYtPmFhY0NoYW5uZWxzUHJldiA9IGFhY0NoYW5uZWxzOyAvKiBzdG9yZSAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFhY0NoYW5uZWxzID0gc2VsZi0+YWFjQ2hhbm5lbHNQcmV2OyAvKiByZXN0b3JlICovCisgICAgICAgIH0KKyAgICAgICAgRkRLbWVtY3B5KHNlbGYtPmNoYW5uZWxUeXBlLCBzZWxmLT5jaGFubmVsVHlwZVByZXYsCisgICAgICAgICAgICAgICAgICAoOCkgKiBzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7IC8qIHJlc3RvcmUgKi8KKyAgICAgICAgRkRLbWVtY3B5KHNlbGYtPmNoYW5uZWxJbmRpY2VzLCBzZWxmLT5jaGFubmVsSW5kaWNlc1ByZXYsCisgICAgICAgICAgICAgICAgICAoOCkgKiBzaXplb2YoVUNIQVIpKTsgLyogcmVzdG9yZSAqLworICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gc2VsZi0+c2JyRW5hYmxlZFByZXY7CisgICAgICB9CisgICAgfQogICB9CiAKICAgLyogVXBkYXRlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KICAgc2VsZi0+c3RyZWFtSW5mby5hYWNOdW1DaGFubmVscyA9IGFhY0NoYW5uZWxzOwogCi0gI2lmZGVmIFRQX1BDRV9FTkFCTEUKKyAgLyogRW5zdXJlIGNvbnNpc3RlbmN5IG9mIElTX09VVFBVVF9WQUxJRCgpIG1hY3JvLiAqLworICBpZiAoYWFjQ2hhbm5lbHMgPT0gMCkgeworICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTktOT1dOOworICB9CisKICAgaWYgKHBjZVJlYWQgPT0gMSAmJiBDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkKHBjZSkpIHsKICAgICAvKiBTZXQgbWF0cml4IG1peGRvd24gaW5mb3MgaWYgYXZhaWxhYmxlIGZyb20gUENFLiAqLwotICAgIHBjbURteF9TZXRNYXRyaXhNaXhkb3duRnJvbVBjZSAoIHNlbGYtPmhQY21VdGlscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2UtPk1hdHJpeE1peGRvd25JbmRleFByZXNlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNlLT5NYXRyaXhNaXhkb3duSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNlLT5Qc2V1ZG9TdXJyb3VuZEVuYWJsZSApOworICAgIHBjbURteF9TZXRNYXRyaXhNaXhkb3duRnJvbVBjZSgKKyAgICAgICAgc2VsZi0+aFBjbVV0aWxzLCBwY2UtPk1hdHJpeE1peGRvd25JbmRleFByZXNlbnQsCisgICAgICAgIHBjZS0+TWF0cml4TWl4ZG93bkluZGV4LCBwY2UtPlBzZXVkb1N1cnJvdW5kRW5hYmxlKTsKKyAgICA7CiAgIH0KLSAjZW5kaWYKIAogICAvKiBJZiB0aGVyZSBpcyBubyB2YWxpZCBkYXRhIHRvIHRyYW5zZnJvbSBpbnRvIHRpbWUgZG9tYWluLCByZXR1cm4uICovCi0gIGlmICggISBJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpICkgeworICBpZiAoIUlTX09VVFBVVF9WQUxJRChFcnJvclN0YXR1cykpIHsKICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CiAgIH0KIAotICAvKiBTZXR1cCB0aGUgb3V0cHV0IGNoYW5uZWwgbWFwcGluZy4gVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSBmb3VyIHBvc3NpYmlsaXRpZXM6Ci0gICAqICAgIyB8IGNoQ2ZnIHwgUENFIHwgY0NoQ2ZnIHwgY2hPdXRNYXBJZHgKKyAgLyogU2V0dXAgdGhlIG91dHB1dCBjaGFubmVsIG1hcHBpbmcuIFRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgdGhyZWUKKyAgICogcG9zc2liaWxpdGllczogIyB8IGNoQ2ZnIHwgUENFIHwgY2hNYXBJbmRleAorICAgKiAgLS0tKy0tLS0tLS0rLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqICAgMSB8ICA+IDAgIHwgIG5vIHwgY2hDZmcKKyAgICogICAyIHwgICAwICAgfCB5ZXMgfCBjQ2hDZmcKKyAgICogICAzIHwgICAwICAgfCAgbm8gfCBhYWNDaGFubmVscyB8fCAwCiAgICAqICAtLS0rLS0tLS0tLSstLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0KLSAgICogICAxIHwgID4gMCAgfCAgbm8gfCAgICAtICAgfCBjaENmZwotICAgKiAgIDIgfCAgIDAgICB8IHllcyB8ICA+IDAgICB8IGNDaENmZwotICAgKiAgIDMgfCAgIDAgICB8IHllcyB8ICAgIDAgICB8IGFhY0NoYW5uZWxzIHx8IDAKLSAgICogICA0IHwgICAwICAgfCAgbm8gfCAgICAtICAgfCBhYWNDaGFubmVscyB8fCAwCi0gICAqICAtLS0rLS0tLS0tLSstLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0KLSAgICogIFdoZXJlIGNoQ2ZnIGlzIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXggZnJvbSBBU0MgYW5kIGNDaENmZyBpcyBhIGNvcnJlc3BvbmRpbmcgY2hDZmcKLSAgICogIGRlcml2ZWQgZnJvbSBhIGdpdmVuIFBDRS4gVGhlIHZhcmlhYmxlIGFhY0NoYW5uZWxzIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBjaGFubmVsIGZvdW5kCi0gICAqICBkdXJpbmcgYml0c3RyZWFtIGRlY29kaW5nLiBEdWUgdG8gdGhlIHN0cnVjdHVyZSBvZiB0aGUgbWFwcGluZyB0YWJsZSBpdCBjYW4gb25seSBiZSB1c2VkIGZvcgotICAgKiAgbWFwcGluZyBpZiBpdHMgdmFsdWUgaXMgc21hbGxlciB0aGFuIDcuIE90aGVyd2lzZSB3ZSB1c2UgdGhlIGZhbGxiYWNrICgwKSB3aGljaCBpcyBhIHNpbXBsZQotICAgKiAgcGFzcy10aHJvdWdoLiBUaGUgcG9zc2liaWxpdHkgIzQgc2hvdWxkIGFwcGVhciBvbmx5IHdpdGggTVBFRy0yIChBRFRTKSBzdHJlYW1zLiBUaGlzIGlzCi0gICAqICBtb2RlIGlzIGNhbGxlZCAiaW1wbGljaXQgY2hhbm5lbCBtYXBwaW5nIi4KKyAgICogIFdoZXJlIGNoQ2ZnIGlzIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXggZnJvbSBBU0MgYW5kIGNDaENmZyBpcyBhCisgICAqIGNvcnJlc3BvbmRpbmcgY2hDZmcgZGVyaXZlZCBmcm9tIGEgZ2l2ZW4gUENFLiBUaGUgdmFyaWFibGUgYWFjQ2hhbm5lbHMKKyAgICogcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGNoYW5uZWwgZm91bmQgZHVyaW5nIGJpdHN0cmVhbSBkZWNvZGluZy4gRHVlIHRvCisgICAqIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1hcHBpbmcgdGFibGUgaXQgY2FuIG9ubHkgYmUgdXNlZCBmb3IgbWFwcGluZyBpZiBpdHMKKyAgICogdmFsdWUgaXMgc21hbGxlciB0aGFuIDcuIE90aGVyd2lzZSB3ZSB1c2UgdGhlIGZhbGxiYWNrICgwKSB3aGljaCBpcyBhCisgICAqIHNpbXBsZSBwYXNzLXRocm91Z2guIFRoZSBwb3NzaWJpbGl0eSAjMyBzaG91bGQgYXBwZWFyIG9ubHkgd2l0aCBNUEVHLTIKKyAgICogKEFEVFMpIHN0cmVhbXMuIFRoaXMgaXMgbW9kZSBpcyBjYWxsZWQgImltcGxpY2l0IGNoYW5uZWwgbWFwcGluZyIuCiAgICAqLwotICBjaE91dE1hcElkeCA9ICgoc2VsZi0+Y2hNYXBJbmRleD09MCkgJiYgKGFhY0NoYW5uZWxzPDcpKSA/IGFhY0NoYW5uZWxzIDogc2VsZi0+Y2hNYXBJbmRleDsKKyAgaWYgKChzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcgPT0gMCkgJiYgIXBjZS0+aXNWYWxpZCkgeworICAgIHNlbGYtPmNoTWFwSW5kZXggPSAoYWFjQ2hhbm5lbHMgPCA3KSA/IGFhY0NoYW5uZWxzIDogMDsKKyAgfQogCiAgIC8qCiAgICAgSW52ZXJzZSB0cmFuc2Zvcm0KICAgKi8KICAgewotICAgIGludCBzdHJpZGUsIG9mZnNldCwgYzsKKyAgICBpbnQgYywgY0lkeDsKKyAgICBpbnQgbWFwcGVkLCBmQ29weUNoTWFwID0gMTsKKyAgICBVQ0hBUiBkcmNDaE1hcFsoOCldOwogCi0gICAgLyogVHVybiBvbi9vZmYgRFJDIG1vZHVsZXMgbGV2ZWwgbm9ybWFsaXphdGlvbiBpbiBkaWdpdGFsIGRvbWFpbiBkZXBlbmRpbmcgb24gdGhlIGxpbWl0ZXIgc3RhdHVzLiAqLwotICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0oIHNlbGYtPmhEcmNJbmZvLCBBUFBMWV9OT1JNQUxJWkFUSU9OLCAoc2VsZi0+bGltaXRlckVuYWJsZUN1cnIpID8gMCA6IDEgKTsKLSAgICAvKiBFeHRyYWN0IERSQyBjb250cm9sIGRhdGEgYW5kIG1hcCBpdCB0byBjaGFubmVscyAod2l0aG91dCBiaXRzdHJlYW0gZGVsYXkpICovCi0gICAgYWFjRGVjb2Rlcl9kcmNQcm9sb2cgKAotICAgICAgICAgICAgc2VsZi0+aERyY0luZm8sCi0gICAgICAgICAgICBicywKLSAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICBzZWxmLT5wY2UuRWxlbWVudEluc3RhbmNlVGFnLAotICAgICAgICAgICAgc2VsZi0+Y2hNYXBwaW5nLAotICAgICAgICAgICAgYWFjQ2hhbm5lbHMKLSAgICAgICAgICApOworICAgIGlmICgoc2VsZi0+c3RyZWFtSW5mby5jaGFubmVsQ29uZmlnID09IDApICYmIENQcm9ncmFtQ29uZmlnX0lzVmFsaWQocGNlKSkgeworICAgICAgLyogSVNPL0lFQyAxNDQ5Ni0zIHNheXM6CisgICAgICAgICAgIElmIGEgUENFIGlzIHByZXNlbnQsIHRoZSBleGNsdWRlX21hc2sgYml0cyBjb3JyZXNwb25kIHRvIHRoZSBhdWRpbworICAgICAgICAgY2hhbm5lbHMgaW4gdGhlIFNDRSwgQ1BFLCBDQ0UgYW5kIExGRSBzeW50YXggZWxlbWVudHMgaW4gdGhlIG9yZGVyIG9mCisgICAgICAgICB0aGVpciBhcHBlYXJhbmNlIGluIHRoZSBQQ0UuIEluIHRoZSBjYXNlIG9mIGEgQ1BFLCB0aGUgZmlyc3QKKyAgICAgICAgIHRyYW5zbWl0dGVkIG1hc2sgYml0IGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCBjaGFubmVsIGluIHRoZSBDUEUsIHRoZQorICAgICAgICAgc2Vjb25kIHRyYW5zbWl0dGVkIG1hc2sgYml0IHRvIHRoZSBzZWNvbmQgY2hhbm5lbC4gSW4gdGhlIGNhc2Ugb2YgYQorICAgICAgICAgQ0NFLCBhIG1hc2sgYml0IGlzIHRyYW5zbWl0dGVkIG9ubHkgaWYgdGhlIGNvdXBsaW5nIGNoYW5uZWwgaXMKKyAgICAgICAgIHNwZWNpZmllZCB0byBiZSBhbiBpbmRlcGVuZGVudGx5IHN3aXRjaGVkIGNvdXBsaW5nIGNoYW5uZWwuIFRodXMgd2UKKyAgICAgICAgIGhhdmUgdG8gY29udmVydCB0aGUgaW50ZXJuYWwgY2hhbm5lbCBtYXBwaW5nIGZyb20gImNhbm9uaWNhbCIgTVBFRyB0bworICAgICAgICAgUENFIG9yZGVyOiAqLworICAgICAgVUNIQVIgdG1wQ2hNYXBbKDgpXTsKKyAgICAgIGlmIChDUHJvZ3JhbUNvbmZpZ19HZXRQY2VDaE1hcChwY2UsIHRtcENoTWFwLCAoOCkpID09IDApIHsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGFhY0NoYW5uZWxzOyBjICs9IDEpIHsKKyAgICAgICAgICBkcmNDaE1hcFtjXSA9CisgICAgICAgICAgICAgIChzZWxmLT5jaE1hcHBpbmdbY10gPT0gMjU1KSA/IDI1NSA6IHRtcENoTWFwW3NlbGYtPmNoTWFwcGluZ1tjXV07CisgICAgICAgIH0KKyAgICAgICAgZkNvcHlDaE1hcCA9IDA7CisgICAgICB9CisgICAgfQorICAgIGlmIChmQ29weUNoTWFwICE9IDApIHsKKyAgICAgIEZES21lbWNweShkcmNDaE1hcCwgc2VsZi0+Y2hNYXBwaW5nLCAoOCkgKiBzaXplb2YoVUNIQVIpKTsKKyAgICB9CiAKLSAgICAvKiAiYyIgaXRlcmF0ZXMgaW4gY2Fub25pY2FsIE1QRUcgY2hhbm5lbCBvcmRlciAqLwotICAgIGZvciAoYz0wOyBjIDwgYWFjQ2hhbm5lbHM7IGMrKykKLSAgICB7Ci0gICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvOworICAgIC8qIFR1cm4gb24vb2ZmIERSQyBtb2R1bGVzIGxldmVsIG5vcm1hbGl6YXRpb24gaW4gZGlnaXRhbCBkb21haW4gZGVwZW5kaW5nCisgICAgICogb24gdGhlIGxpbWl0ZXIgc3RhdHVzLiAqLworICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0oc2VsZi0+aERyY0luZm8sIEFQUExZX05PUk1BTElaQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi0+bGltaXRlckVuYWJsZUN1cnIpID8gMCA6IDEpOwogCi0gICAgICAvKiBTZWxlY3QgY29ycmVjdCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIGZvciBjdXJyZW50IGNoYW5uZWwgKi8KLSAgICAgIGlmIChzZWxmLT5jaE1hcHBpbmdbY10gPj0gYWFjQ2hhbm5lbHMpIHsKLSAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbyA9IHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY107CisgICAgLyogZGVhY3RpdmF0ZSBsZWdhY3kgRFJDIGluIGNhc2UgdW5pRHJjIGlzIGFjdGl2ZSwgaS5lLiB1bmlEcmMgcGF5bG9hZCBpcworICAgICAqIHByZXNlbnQgYW5kIG9uZSBvZiBEUkMgb3IgTG91ZG5lc3MgTm9ybWFsaXphdGlvbiBpcyBzd2l0Y2hlZCBvbiAqLworICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0oCisgICAgICAgIHNlbGYtPmhEcmNJbmZvLCBVTklEUkNfUFJFQ0VERU5DRSwKKyAgICAgICAgRkRLX2RyY0RlY19HZXRQYXJhbShzZWxmLT5oVW5pRHJjRGVjb2RlciwgRFJDX0RFQ19JU19BQ1RJVkUpKTsKKworICAgIC8qIEV4dHJhY3QgRFJDIGNvbnRyb2wgZGF0YSBhbmQgbWFwIGl0IHRvIGNoYW5uZWxzICh3aXRob3V0IGJpdHN0cmVhbSBkZWxheSkKKyAgICAgKi8KKyAgICBtYXBwZWQgPSBhYWNEZWNvZGVyX2RyY1Byb2xvZygKKyAgICAgICAgc2VsZi0+aERyY0luZm8sIGJzLCBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICBwY2UtPkVsZW1lbnRJbnN0YW5jZVRhZywgZHJjQ2hNYXAsIGFhY0NoYW5uZWxzKTsKKyAgICBpZiAobWFwcGVkID4gMCkgeworICAgICAgLyogSWYgYXQgbGVhc3Qgb25lIERSQyB0aHJlYWQgaGFzIGJlZW4gbWFwcGVkIHRvIGEgY2hhbm5lbCB0aHJlcmUgd2FzIERSQworICAgICAgICogZGF0YSBpbiB0aGUgYml0c3RyZWFtLiAqLworICAgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9IEFDX0RSQ19QUkVTRU5UOworICAgIH0KKworICAgIC8qIENyZWF0ZSBhIHJldmVyc2UgbWFwcGluZyB0YWJsZSAqLworICAgIFVDSEFSIFJldmVyc2VfY2hNYXBwaW5nWygoOCkgKiAyKV07CisgICAgZm9yIChjID0gMDsgYyA8IGFhY0NoYW5uZWxzOyBjKyspIHsKKyAgICAgIGludCBkOworICAgICAgZm9yIChkID0gMDsgZCA8IGFhY0NoYW5uZWxzIC0gMTsgZCsrKSB7CisgICAgICAgIGlmIChzZWxmLT5jaE1hcHBpbmdbZF0gPT0gYykgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBSZXZlcnNlX2NoTWFwcGluZ1tjXSA9IGQ7CisgICAgfQorCisgICAgaW50IGVsOworICAgIGludCBlbF9jaGFubmVsczsKKyAgICBjID0gMDsKKyAgICBjSWR4ID0gMDsKKyAgICBlbF9jaGFubmVscyA9IDA7CisgICAgZm9yIChlbCA9IDA7IGVsIDwgZWxlbWVudF9jb3VudDsgZWwrKykgeworICAgICAgaW50IGZyYW1lT2tfYnV0Q29uY2VhbCA9CisgICAgICAgICAgMDsgLyogRm9yY2UgZnJhbWUgY29uY2VhbG1lbnQgZHVyaW5nIG11dGUgcmVsZWFzZSBhY3RpdmUgc3RhdGUuICovCisgICAgICBpbnQgY29uY2VhbEFwcGx5UmV0dXJuQ29kZTsKKworICAgICAgaWYgKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmIChBQ19VU0FDIHwgQUNfUlNWNjAzREEgfCBBQ19CU0FDKSkgeworICAgICAgICB0eXBlID0gc2VsZi0+ZWxlbWVudHNbZWxdOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbyA9IHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bc2VsZi0+Y2hNYXBwaW5nW2NdXTsKKyAgICAgICAgdHlwZSA9IGNoYW5uZWxfZWxlbWVudHNbZWxdOwogICAgICAgfQogCi0gICAgICAvKiBTZXR1cCBvZmZzZXQgYW5kIHN0cmlkZSBmb3IgdGltZSBidWZmZXIgdHJhdmVyc2FsLiAqLwotICAgICAgaWYgKGludGVybGVhdmVkKSB7Ci0gICAgICAgIHN0cmlkZSA9IGFhY0NoYW5uZWxzOwotICAgICAgICBvZmZzZXQgPSBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZ1tjaE91dE1hcElkeF1bY107Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdHJpZGUgPSAxOwotICAgICAgICBvZmZzZXQgPSBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZ1tjaE91dE1hcElkeF1bY10gKiBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKLSAgICAgIH0KLQotCi0gICAgICBpZiAoIGZsYWdzJkFBQ0RFQ19GTFVTSCApIHsKLSAgICAgICAgLyogQ2xlYXIgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQgYmVjYXVzZSB3aXRoIEFBQ0RFQ19GTFVTSCBzZXQgaXQgY29udGFpbnMgdW5kZWZpbmVkIGRhdGEuICovCi0gICAgICAgIEZES21lbWNsZWFyKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LCBzaXplb2YoRklYUF9EQkwpKnNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lKTsKLSAgICAgIH0KLQotICAgICAgLyoKLSAgICAgICAgQ29uY2VhbCBkZWZlY3RpdmUgc3BlY3RyYWwgZGF0YQotICAgICAgKi8KLSAgICAgIENDb25jZWFsbWVudF9BcHBseSgmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjXS0+Y29uY2VhbG1lbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NdLAotICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYtPmZyYW1lT0sgJiYgIShmbGFncyZBQUNERUNfQ09OQ0VBTCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mbGFncwotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotCi0gICAgICBpZiAoZmxhZ3MgJiAoQUFDREVDX0lOVFJ8QUFDREVDX0NMUkhJU1QpKSB7Ci0gICAgICAgIC8qIFJlc2V0IERSQyBjb250cm9sIGRhdGEgZm9yIHRoaXMgY2hhbm5lbCAqLwotICAgICAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSAoICZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NdLT5kcmNEYXRhICk7Ci0gICAgICB9Ci0gICAgICAvKiBUaGUgRFJDIG1vZHVsZSBkZW1hbmRzIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBnYWluIGZpZWxkIGhvbGRpbmcgdGhlIGdhaW4gc2NhbGUuICovCi0gICAgICBzZWxmLT5leHRHYWluWzBdID0gKEZJWFBfREJMKVRETF9HQUlOX1NDQUxJTkc7Ci0gICAgICAvKiBEUkMgcHJvY2Vzc2luZyAqLwotICAgICAgYWFjRGVjb2Rlcl9kcmNBcHBseSAoCi0gICAgICAgICAgICAgIHNlbGYtPmhEcmNJbmZvLAotICAgICAgICAgICAgICBzZWxmLT5oU2JyRGVjb2RlciwKLSAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjXS0+ZHJjRGF0YSwKLSAgICAgICAgICAgICAgc2VsZi0+ZXh0R2FpbiwKLSAgICAgICAgICAgICAgYywKLSAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgIHNlbGYtPnNickVuYWJsZWQKLSAgICAgICAgICAgICk7Ci0KLSAgICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZSkKICAgICAgIHsKLSAgICAgICAgY2FzZSBBQUNERUNfUkVOREVSX0lNRENUOgotICAgICAgICAgIENCbG9ja19GcmVxdWVuY3lUb1RpbWUoCi0gICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NdLAotICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgIHBUaW1lRGF0YSArIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgKHNlbGYtPmZyYW1lT0sgJiYgIShmbGFncyZBQUNERUNfQ09OQ0VBTCkpLAotICAgICAgICAgICAgICAgICAgc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTEtPm1kY3RPdXRUZW1wCi0gICAgICAgICAgICAgICAgICApOwotICAgICAgICAgIHNlbGYtPmV4dEdhaW5EZWxheSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFBQ0RFQ19SRU5ERVJfRUxERkI6Ci0gICAgICAgICAgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZUxvd0RlbGF5KAotICAgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjXSwKLSAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICBwVGltZURhdGEgKyBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgIHN0cmlkZQotICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICBzZWxmLT5leHRHYWluRGVsYXkgPSAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUqMiAtICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZS8yIC0gMSkvMjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfVU5LTk9XTjsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgaW50IG5FbGVtZW50Q2hhbm5lbHM7CisKKyAgICAgICAgbkVsZW1lbnRDaGFubmVscyA9CisgICAgICAgICAgICBDQWFjRGVjb2Rlcl9HZXRFTENoYW5uZWxzKHR5cGUsIHNlbGYtPnVzYWNTdGVyZW9Db25maWdJbmRleFtlbF0pOworCisgICAgICAgIGVsX2NoYW5uZWxzICs9IG5FbGVtZW50Q2hhbm5lbHM7CisKKyAgICAgICAgaWYgKG5FbGVtZW50Q2hhbm5lbHMgPT0gMCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICB9Ci0gICAgICBpZiAoIGZsYWdzJkFBQ0RFQ19GTFVTSCApIHsKLSAgICAgICAgICBGREttZW1jbGVhcihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgc2l6ZW9mKEZJWFBfREJMKSpzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSk7Ci0gICAgICAgIEZES21lbWNsZWFyKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY10tPnBPdmVybGFwQnVmZmVyLCBPdmVybGFwQnVmZmVyU2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKKworICAgICAgaW50IG9mZnNldDsKKyAgICAgIGludCBlbENoID0gMDsKKyAgICAgIC8qICJjIiBpdGVyYXRlcyBpbiBjYW5vbmljYWwgTVBFRyBjaGFubmVsIG9yZGVyICovCisgICAgICBmb3IgKDsgY0lkeCA8IGVsX2NoYW5uZWxzOyBjKyssIGNJZHgrKywgZWxDaCsrKSB7CisgICAgICAgIC8qIFJvYnVzdG5lc3MgY2hlY2sgKi8KKyAgICAgICAgaWYgKGMgPj0gYWFjQ2hhbm5lbHMpIHsKKyAgICAgICAgICByZXR1cm4gQUFDX0RFQ19VTktOT1dOOworICAgICAgICB9CisKKyAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbyA9CisgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NdOworICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvID0KKyAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY107CisKKyAgICAgICAgLyogU2V0dXAgb2Zmc2V0IGZvciB0aW1lIGJ1ZmZlciB0cmF2ZXJzYWwuICovCisgICAgICAgIHsKKyAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvID0KKyAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tSZXZlcnNlX2NoTWFwcGluZ1tjXV07CisgICAgICAgICAgb2Zmc2V0ID0KKyAgICAgICAgICAgICAgRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUoCisgICAgICAgICAgICAgICAgICAmc2VsZi0+bWFwRGVzY3IsIFJldmVyc2VfY2hNYXBwaW5nW2NJZHhdLCBzZWxmLT5jaE1hcEluZGV4KSAqCisgICAgICAgICAgICAgIHRpbWVEYXRhQ2hhbm5lbE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFncyAmIEFBQ0RFQ19GTFVTSCkgeworICAgICAgICAgIC8qIENsZWFyIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50IGJlY2F1c2Ugd2l0aAorICAgICAgICAgICAqIEFBQ0RFQ19GTFVTSCBzZXQgaXQgY29udGFpbnMgdW5kZWZpbmVkIGRhdGEuICovCisgICAgICAgICAgRkRLbWVtY2xlYXIocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIFRoZSBpY3MgaW5mbyBpcyBub3QgdmFsaWQgYW5kIGl0IHdpbGwgYmUgc3RvcmVkIGFuZCB1c2VkIGluIHRoZQorICAgICAgICAgKiBmb2xsb3dpbmcgY29uY2VhbG1lbnQgbWV0aG9kLCBtYXJrIHRoZSBmcmFtZSBhcyBlcnJvbmVvdXMgKi8KKyAgICAgICAgeworICAgICAgICAgIENJY3NJbmZvICpwSWNzSW5mbyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvOworICAgICAgICAgIENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8gPQorICAgICAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvOworICAgICAgICAgIGNvbnN0IGludCBtdXRlX3JlbGVhc2VfYWN0aXZlID0KKyAgICAgICAgICAgICAgKHNlbGYtPmZyYW1lT0sgJiYgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSkgJiYKKyAgICAgICAgICAgICAgKChoQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPj0gQ29uY2VhbFN0YXRlX011dGUpICYmCisgICAgICAgICAgICAgICAoaENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgKyAxIDw9CisgICAgICAgICAgICAgICAgaENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXMtPm51bU11dGVSZWxlYXNlRnJhbWVzKSk7CisgICAgICAgICAgY29uc3QgaW50IGljc0lzSW52YWxpZCA9IChHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQocEljc0luZm8pID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUb3RhbChwSWNzSW5mbykpOworICAgICAgICAgIGNvbnN0IGludCBpY3NJbmZvVXNlZGluRmFkZU91dCA9CisgICAgICAgICAgICAgICEocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZSA9PSBBQUNERUNfUkVOREVSX0xQRCAmJgorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGUgPT0gMCk7CisgICAgICAgICAgaWYgKGljc0luZm9Vc2VkaW5GYWRlT3V0ICYmIGljc0lzSW52YWxpZCAmJiAhbXV0ZV9yZWxlYXNlX2FjdGl2ZSkgeworICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICBDb25jZWFsIGRlZmVjdGl2ZSBzcGVjdHJhbCBkYXRhCisgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICoqcHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gPQorICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mbzsKKyAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICoqcHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gPQorICAgICAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbzsKKyAgICAgICAgICB7CisgICAgICAgICAgICBjb25jZWFsQXBwbHlSZXR1cm5Db2RlID0gQ0NvbmNlYWxtZW50X0FwcGx5KAorICAgICAgICAgICAgICAgICYoKnBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKS0+Y29uY2VhbG1lbnRJbmZvLAorICAgICAgICAgICAgICAgICpwcEFhY0RlY29kZXJDaGFubmVsSW5mbywgKnBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICZzZWxmLT5zYW1wbGluZ1JhdGVJbmZvW3N0cmVhbUluZGV4XSwKKyAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlLAorICAgICAgICAgICAgICAgIChzZWxmLT5mcmFtZU9LICYmICEoZmxhZ3MgJiBBQUNERUNfQ09OQ0VBTCkpLAorICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb25jZWFsQXBwbHlSZXR1cm5Db2RlID09IC0xKSB7CisgICAgICAgICAgZnJhbWVPa19idXRDb25jZWFsID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFncyAmIChBQUNERUNfSU5UUikpIHsKKyAgICAgICAgICAvKiBSZXNldCBEUkMgY29udHJvbCBkYXRhIGZvciB0aGlzIGNoYW5uZWwgKi8KKyAgICAgICAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSgmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+ZHJjRGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICYgKEFBQ0RFQ19DTFJISVNUKSkgeworICAgICAgICAgIGlmICghKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQykpIHsKKyAgICAgICAgICAgIC8qIFJlc2V0IERSQyBjb250cm9sIGRhdGEgZm9yIHRoaXMgY2hhbm5lbCAqLworICAgICAgICAgICAgYWFjRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbERhdGEoCisgICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmRyY0RhdGEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBUaGUgRFJDIG1vZHVsZSBkZW1hbmRzIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBnYWluIGZpZWxkIGhvbGRpbmcgdGhlCisgICAgICAgICAqIGdhaW4gc2NhbGUuICovCisgICAgICAgIHNlbGYtPmV4dEdhaW5bMF0gPSAoRklYUF9EQkwpVERMX0dBSU5fU0NBTElORzsKKyAgICAgICAgLyogRFJDIHByb2Nlc3NpbmcgKi8KKyAgICAgICAgYWFjRGVjb2Rlcl9kcmNBcHBseSgKKyAgICAgICAgICAgIHNlbGYtPmhEcmNJbmZvLCBzZWxmLT5oU2JyRGVjb2RlciwgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5kcmNEYXRhLCBzZWxmLT5leHRHYWluLCBjLAorICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsIHNlbGYtPnNickVuYWJsZWQKKworICAgICAgICApOworCisgICAgICAgIGlmICh0aW1lRGF0YVNpemUgPCB0aW1lRGF0YUNoYW5uZWxPZmZzZXQgKiBzZWxmLT5hYWNDaGFubmVscykgeworICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZi0+Zmx1c2hTdGF0dXMgJiYgKHNlbGYtPmZsdXNoQ250ID4gMCkgJiYKKyAgICAgICAgICAgICEoZmxhZ3MgJiBBQUNERUNfQ09OQ0VBTCkpIHsKKyAgICAgICAgICBGREttZW1jbGVhcihwVGltZURhdGEgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfUENNKSAqIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5yZW5kZXJNb2RlKSB7CisgICAgICAgICAgICBjYXNlIEFBQ0RFQ19SRU5ERVJfSU1EQ1Q6CisKKyAgICAgICAgICAgICAgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZSgKKyAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICBwVGltZURhdGEgKyBvZmZzZXQsIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgKHNlbGYtPmZyYW1lT0sgJiYgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSAmJgorICAgICAgICAgICAgICAgICAgICFmcmFtZU9rX2J1dENvbmNlYWwpLAorICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbVN0YXRpY0RhdGEtPnBXb3JrQnVmZmVyQ29yZTEKKyAgICAgICAgICAgICAgICAgICAgICAtPm1kY3RPdXRUZW1wLAorICAgICAgICAgICAgICAgICAgc2VsZi0+ZWxGbGFnc1tlbF0sIGVsQ2gpOworCisgICAgICAgICAgICAgIHNlbGYtPmV4dEdhaW5EZWxheSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUFDREVDX1JFTkRFUl9FTERGQjogeworICAgICAgICAgICAgICBDQmxvY2tfRnJlcXVlbmN5VG9UaW1lTG93RGVsYXkoCisgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgcFRpbWVEYXRhICsgb2Zmc2V0LCBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgICAgICAgIHNlbGYtPmV4dEdhaW5EZWxheSA9CisgICAgICAgICAgICAgICAgICAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgKiAyIC0KKyAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSAvIDIgLSAxKSAvCisgICAgICAgICAgICAgICAgICAyOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUFDREVDX1JFTkRFUl9MUEQ6CisKKyAgICAgICAgICAgICAgQ0xwZF9SZW5kZXJUaW1lU2lnbmFsKAorICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgIHBUaW1lRGF0YSArIG9mZnNldCwgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAmc2VsZi0+c2FtcGxpbmdSYXRlSW5mb1tzdHJlYW1JbmRleF0sCisgICAgICAgICAgICAgICAgICAoc2VsZi0+ZnJhbWVPSyAmJiAhKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpICYmCisgICAgICAgICAgICAgICAgICAgIWZyYW1lT2tfYnV0Q29uY2VhbCksCisgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdKTsKKworICAgICAgICAgICAgICBzZWxmLT5leHRHYWluRGVsYXkgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfVU5LTk9XTjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAvKiBUaW1lRG9tYWluRmFkaW5nICovCisgICAgICAgIGlmICghQ0NvbmNlYWxfVERGYWRpbmdfQXBwbGllZFtjXSkgeworICAgICAgICAgIENDb25jZWFsX1RERmFkaW5nX0FwcGxpZWRbY10gPSBDQ29uY2VhbG1lbnRfVERGYWRpbmcoCisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjXSwgcFRpbWVEYXRhICsgb2Zmc2V0LCAwKTsKKyAgICAgICAgICBpZiAoYyArIDEgPCAoOCkgJiYgYyA8IGFhY0NoYW5uZWxzIC0gMSkgeworICAgICAgICAgICAgLyogdXBkYXRlIG5leHQgVEROb2lzZSBTZWVkIHRvIGF2b2lkIG11dGluZyBpbiBjYXNlIG9mIFBhcmFtZXRyaWMKKyAgICAgICAgICAgICAqIFN0ZXJlbyAqLworICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjICsgMV0KKyAgICAgICAgICAgICAgICAtPmNvbmNlYWxtZW50SW5mby5URE5vaXNlU2VlZCA9CisgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjXQorICAgICAgICAgICAgICAgICAgICAtPmNvbmNlYWxtZW50SW5mby5URE5vaXNlU2VlZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYgQUNfVVNBQykgeworICAgICAgaW50IGJzUHNldWRvTHIgPSAwOworICAgICAgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9Jc1BzZXVkb0xSKAorICAgICAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKXNlbGYtPnBNcGVnU3Vycm91bmREZWNvZGVyLCAmYnNQc2V1ZG9Mcik7CisgICAgICAvKiBJU08vSUVDIDIzMDAzLTMsIDcuMTEuMi42IE1vZGlmaWNhdGlvbiBvZiBjb3JlIGRlY29kZXIgb3V0cHV0IChwc2V1ZG8KKyAgICAgICAqIExSKSAqLworICAgICAgaWYgKChhYWNDaGFubmVscyA9PSAyKSAmJiBic1BzZXVkb0xyKSB7CisgICAgICAgIGludCBpLCBvZmZzZXQyOworICAgICAgICBjb25zdCBGSVhQX1NHTCBpbnZTcXJ0MiA9IEZMMkZYQ09OU1RfU0dMKDAuNzA3MTA2NzgxMTg2NTQ3Zik7CisgICAgICAgIEZJWFBfUENNICpwVEQgPSBwVGltZURhdGE7CisKKyAgICAgICAgb2Zmc2V0MiA9IHRpbWVEYXRhQ2hhbm5lbE9mZnNldDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWU7IGkrKykgeworICAgICAgICAgIEZJWFBfREJMIEwgPSBGWF9QQ00yRlhfREJMKHBURFswXSk7CisgICAgICAgICAgRklYUF9EQkwgUiA9IEZYX1BDTTJGWF9EQkwocFREW29mZnNldDJdKTsKKyAgICAgICAgICBMID0gZk11bHQoTCwgaW52U3FydDIpOworICAgICAgICAgIFIgPSBmTXVsdChSLCBpbnZTcXJ0Mik7CisjaWYgKFNBTVBMRV9CSVRTID09IDE2KQorICAgICAgICAgIHBURFswXSA9IEZYX0RCTDJGWF9QQ00oZkFkZFNhdHVyYXRlKEwgKyBSLCAoRklYUF9EQkwpMHg4MDAwKSk7CisgICAgICAgICAgcFREW29mZnNldDJdID0gRlhfREJMMkZYX1BDTShmQWRkU2F0dXJhdGUoTCAtIFIsIChGSVhQX0RCTCkweDgwMDApKTsKKyNlbHNlCisgICAgICAgICAgcFREWzBdID0gRlhfREJMMkZYX1BDTShMICsgUik7CisgICAgICAgICAgcFREW29mZnNldDJdID0gRlhfREJMMkZYX1BDTShMIC0gUik7CisjZW5kaWYKKyAgICAgICAgICBwVEQrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KIAogICAgIC8qIEV4dHJhY3QgRFJDIGNvbnRyb2wgZGF0YSBhbmQgbWFwIGl0IHRvIGNoYW5uZWxzICh3aXRoIGJpdHN0cmVhbSBkZWxheSkgKi8KLSAgICBhYWNEZWNvZGVyX2RyY0VwaWxvZyAoCi0gICAgICAgICAgICBzZWxmLT5oRHJjSW5mbywKLSAgICAgICAgICAgIGJzLAotICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICAgICAgICAgIHNlbGYtPnBjZS5FbGVtZW50SW5zdGFuY2VUYWcsCi0gICAgICAgICAgICBzZWxmLT5jaE1hcHBpbmcsCi0gICAgICAgICAgICBhYWNDaGFubmVscwotICAgICAgICAgICk7CisgICAgbWFwcGVkID0gYWFjRGVjb2Rlcl9kcmNFcGlsb2coCisgICAgICAgIHNlbGYtPmhEcmNJbmZvLCBicywgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgcGNlLT5FbGVtZW50SW5zdGFuY2VUYWcsIGRyY0NoTWFwLCBhYWNDaGFubmVscyk7CisgICAgaWYgKG1hcHBlZCA+IDApIHsKKyAgICAgIC8qIElmIGF0IGxlYXN0IG9uZSBEUkMgdGhyZWFkIGhhcyBiZWVuIG1hcHBlZCB0byBhIGNoYW5uZWwgdGhyZXJlIHdhcyBEUkMKKyAgICAgICAqIGRhdGEgaW4gdGhlIGJpdHN0cmVhbS4gKi8KKyAgICAgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSBBQ19EUkNfUFJFU0VOVDsKKyAgICB9CiAgIH0KIAogICAvKiBBZGQgYWRkaXRpb25hbCBjb25jZWFsbWVudCBkZWxheSAqLwotICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ICs9IENDb25jZWFsbWVudF9HZXREZWxheSgmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEpICogc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWU7CisgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgKz0KKyAgICAgIENDb25jZWFsbWVudF9HZXREZWxheSgmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEpICoKKyAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lOwogCiAgIC8qIE1hcCBEUkMgZGF0YSB0byBTdHJlYW1JbmZvIHN0cnVjdHVyZSAqLwotICBhYWNEZWNvZGVyX2RyY0dldEluZm8gKAotICAgICAgICAgICAgc2VsZi0+aERyY0luZm8sCi0gICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLmRyY1ByZXNNb2RlLAotICAgICAgICAgICAmc2VsZi0+c3RyZWFtSW5mby5kcmNQcm9nUmVmTGV2Ci0gICAgICAgICAgKTsKKyAgYWFjRGVjb2Rlcl9kcmNHZXRJbmZvKHNlbGYtPmhEcmNJbmZvLCAmc2VsZi0+c3RyZWFtSW5mby5kcmNQcmVzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLmRyY1Byb2dSZWZMZXYpOwogCiAgIC8qIFJlb3JkZXIgY2hhbm5lbCB0eXBlIGluZm9ybWF0aW9uIHRhYmxlcy4gICovCi0gIHsKKyAgaWYgKCEoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19SU1Y2MDNEQSkpIHsKICAgICBBVURJT19DSEFOTkVMX1RZUEUgdHlwZXNbKDgpXTsKICAgICBVQ0hBUiBpZHhbKDgpXTsKICAgICBpbnQgYzsKKyAgICBpbnQgbWFwVmFsdWU7CiAKICAgICBGREtfQVNTRVJUKHNpemVvZihzZWxmLT5jaGFubmVsVHlwZSkgPT0gc2l6ZW9mKHR5cGVzKSk7CiAgICAgRkRLX0FTU0VSVChzaXplb2Yoc2VsZi0+Y2hhbm5lbEluZGljZXMpID09IHNpemVvZihpZHgpKTsKQEAgLTE4MjAsOSArMzQzMSwxMSBAQAogICAgIEZES21lbWNweSh0eXBlcywgc2VsZi0+Y2hhbm5lbFR5cGUsIHNpemVvZih0eXBlcykpOwogICAgIEZES21lbWNweShpZHgsIHNlbGYtPmNoYW5uZWxJbmRpY2VzLCBzaXplb2YoaWR4KSk7CiAKLSAgICBmb3IgKGM9MDsgYzxhYWNDaGFubmVsczsgYysrKSB7Ci0gICAgICBzZWxmLT5jaGFubmVsVHlwZVtzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZ1tjaE91dE1hcElkeF1bY11dID0gdHlwZXNbY107Ci0gICAgICBzZWxmLT5jaGFubmVsSW5kaWNlc1tzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZ1tjaE91dE1hcElkeF1bY11dID0gaWR4W2NdOworICAgIGZvciAoYyA9IDA7IGMgPCBhYWNDaGFubmVsczsgYysrKSB7CisgICAgICBtYXBWYWx1ZSA9CisgICAgICAgICAgRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUoJnNlbGYtPm1hcERlc2NyLCBjLCBzZWxmLT5jaE1hcEluZGV4KTsKKyAgICAgIHNlbGYtPmNoYW5uZWxUeXBlW21hcFZhbHVlXSA9IHR5cGVzW2NdOworICAgICAgc2VsZi0+Y2hhbm5lbEluZGljZXNbbWFwVmFsdWVdID0gaWR4W2NdOwogICAgIH0KICAgfQogCkBAIC0xODM4LDE0ICszNDUxLDkgQEAKIAogICBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0cnVjdAogKi8KLUxJTktTUEVDX0NQUCBDU3RyZWFtSW5mbyogQ0FhY0RlY29kZXJfR2V0U3RyZWFtSW5mbyAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgKQoteworTElOS1NQRUNfQ1BQIENTdHJlYW1JbmZvICpDQWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpIHsKICAgaWYgKCFzZWxmKSB7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgcmV0dXJuICZzZWxmLT5zdHJlYW1JbmZvOwogfQotCi0KLQotCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuaCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlci5oCmluZGV4IDI1YmMzNWQuLjIwZjRjNDUgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlci5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlci5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjoKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBBQUNERUNPREVSX0gKICNkZWZpbmUgQUFDREVDT0RFUl9ICkBAIC0xMDQsMTM0ICsxMTYsMjM4IEBACiAKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCisjaW5jbHVkZSAiRkRLX3FtZl9kb21haW4uaCIKIAogI2luY2x1ZGUgInNicmRlY29kZXIuaCIKIAotCiAjaW5jbHVkZSAiYWFjZGVjX2RyYy5oIgogCi0gI2luY2x1ZGUgInBjbXV0aWxzX2xpYi5oIgotICNpbmNsdWRlICJsaW1pdGVyLmgiCisjaW5jbHVkZSAicGNtZG14X2xpYi5oIgogCisjaW5jbHVkZSAiRkRLX2RyY0RlY0xpYi5oIgogCi0vKiBDYXBhYmlsaXRpZXMgZmxhZ3MgKi8KLSNkZWZpbmUgQ0FQRl9BQUNfTEMgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQ0FQRl9BQUNfTEQgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQ0FQRl9BQUNfU0NBTCAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQ0FQRl9BQUNfRVIgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQ0FQRl9BQUNfNDgwICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgQ0FQRl9BQUNfNTEyICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgQ0FQRl9BQUNfOTYwICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgQ0FQRl9BQUNfMTAyNCAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgQ0FQRl9BQUNfSENSICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgQ0FQRl9BQUNfVkNCMTEgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgQ0FQRl9BQUNfUlZMQyAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgQ0FQRl9BQUNfTVBFRzQgICAgICAgIDB4MDAwMDA4MDAgLyogUE5TICovCi0jZGVmaW5lIENBUEZfQUFDX0RSQyAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIENBUEZfQUFDX0NPTkNFQUwgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIENBUEZfQUFDX0RSTV9CU0ZPUk1BVCAweDAwMDA0MDAwCi0jZGVmaW5lIENBUEZfQUFDX0JTQUMgICAgICAgICAweDAwMDA4MDAwCisjaW5jbHVkZSAibGltaXRlci5oIgorCisjaW5jbHVkZSAiRkRLX2RlbGF5LmgiCisKKyNkZWZpbmUgVElNRV9EQVRBX0ZMVVNIX1NJWkUgKDEyOCkKKyNkZWZpbmUgVElNRV9EQVRBX0ZMVVNIX1NJWkVfU0YgKDcpCisKKyNkZWZpbmUgQUFDREVDX01BWF9OVU1fUFJFUk9MTF9BVV9VU0FDICgzKQorI2lmIChBQUNERUNfTUFYX05VTV9QUkVST0xMX0FVIDwgMykKKyN1bmRlZiBBQUNERUNfTUFYX05VTV9QUkVST0xMX0FVCisjZGVmaW5lIEFBQ0RFQ19NQVhfTlVNX1BSRVJPTExfQVUgQUFDREVDX01BWF9OVU1fUFJFUk9MTF9BVV9VU0FDCisjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgQUFDX0RFQ09ERVJfSU5TVEFOQ0UgKkhBTkRMRV9BQUNERUNPREVSOwogCitlbnVtIHsgTCA9IDAsIFIgPSAxIH07CiAKLWVudW0KLXsKLSAgTCA9IDAsCi0gIFIgPSAxCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgaW50IGJ1ZmZlclNpemU7CisgIGludCBvZmZzZXRbOF07CisgIGludCBuckVsZW1lbnRzOworfSBDQW5jRGF0YTsKKwordHlwZWRlZiBlbnVtIHsgTk9UX0RFRklORUQgPSAtMSwgTU9ERV9IUSA9IDAsIE1PREVfTFAgPSAxIH0gUU1GX01PREU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGJzRGVsYXk7Cit9IFNCUl9QQVJBTVM7CisKK2VudW0geworICBBQUNERUNfRkxVU0hfT0ZGID0gMCwKKyAgQUFDREVDX1JTVjYwX0NGR19DSEFOR0VfQVRTQ19GTFVTSF9PTiA9IDEsCisgIEFBQ0RFQ19SU1Y2MF9EQVNIX0lQRl9BVFNDX0ZMVVNIX09OID0gMiwKKyAgQUFDREVDX1VTQUNfREFTSF9JUEZfRkxVU0hfT04gPSAzCit9OworCitlbnVtIHsKKyAgQUFDREVDX0JVSUxEX1VQX09GRiA9IDAsCisgIEFBQ0RFQ19SU1Y2MF9CVUlMRF9VUF9PTiA9IDEsCisgIEFBQ0RFQ19SU1Y2MF9CVUlMRF9VUF9PTl9JTl9CQU5EID0gMiwKKyAgQUFDREVDX1VTQUNfQlVJTERfVVBfT04gPSAzLAorICBBQUNERUNfUlNWNjBfQlVJTERfVVBfSURMRSA9IDQsCisgIEFBQ0RFQ19SU1Y2MF9CVUlMRF9VUF9JRExFX0lOX0JBTkQgPSA1CiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgIGludCBidWZmZXJTaXplOwotICAgIGludCBvZmZzZXRbOF07Ci0gICAgaW50IG5yRWxlbWVudHM7Ci19IENBbmNEYXRhOwotCi10eXBlZGVmIGVudW0gewotICBOT1RfREVGSU5FRCA9IC0xLAotICBNT0RFX0hRICAgICA9ICAwLAotICBNT0RFX0xQICAgICA9ICAxCi19IFFNRl9NT0RFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCAgICAgICAgYnNEZWxheTsKLX0gU0JSX1BBUkFNUzsKLQorICAvKiBVc2FjIEV4dGVuc2lvbiBFbGVtZW50cyAqLworICBVU0FDX0VYVF9FTEVNRU5UX1RZUEUgdXNhY0V4dEVsZW1lbnRUeXBlWygzKV07CisgIFVJTlQgdXNhY0V4dEVsZW1lbnREZWZhdWx0TGVuZ3RoWygzKV07CisgIFVDSEFSIHVzYWNFeHRFbGVtZW50UGF5bG9hZEZyYWdbKDMpXTsKK30gQ1VzYWNDb3JlRXh0ZW5zaW9uczsKIAogLyogQUFDIGRlY29kZXIgKG9wYXF1ZSB0b3dhcmQgdXNlcmxhbmQpIHN0cnVjdCBkZWNsYXJhdGlvbiAqLwogc3RydWN0IEFBQ19ERUNPREVSX0lOU1RBTkNFIHsKLSAgSU5UICAgICAgICAgICAgICAgICAgIGFhY0NoYW5uZWxzOyAgICAgICAgICAgICAgICAgLyohPCBBbW91bnQgb2YgQUFDIGRlY29kZXIgY2hhbm5lbHMgYWxsb2NhdGVkLiAgICAgICAgKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgIGFzY0NoYW5uZWxzOyAgICAgICAgICAgICAgICAgLyohPCBBbW91bnQgb2YgQUFDIGRlY29kZXIgY2hhbm5lbHMgc2lnbmFsbGVkIGluIEFTQy4gKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgIGJsb2NrTnVtYmVyOyAgICAgICAgICAgICAgICAgLyohPCBmcmFtZSBjb3VudGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSU5UIGFhY0NoYW5uZWxzOyAvKiE8IEFtb3VudCBvZiBBQUMgZGVjb2RlciBjaGFubmVscyBhbGxvY2F0ZWQuICAgICAgICAqLworICBJTlQgYXNjQ2hhbm5lbHNbKDEgKgorICAgICAgICAgICAgICAgICAgIDEpXTsgLyohPCBBbW91bnQgb2YgQUFDIGRlY29kZXIgY2hhbm5lbHMgc2lnbmFsbGVkIGluIEFTQy4gKi8KKyAgSU5UIGJsb2NrTnVtYmVyOyAgICAgIC8qITwgZnJhbWUgY291bnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgSU5UICAgICAgICAgICAgICAgICAgIG5yT2ZMYXllcnM7CisgIElOVCBuck9mTGF5ZXJzOwogCi0gIElOVCAgICAgICAgICAgICAgICAgICBvdXRwdXRJbnRlcmxlYXZlZDsgICAgICAgICAgIC8qITwgUENNIG91dHB1dCBmb3JtYXQgKGludGVybGVhdmVkL25vbmUgaW50ZXJsZWF2ZWQpLiAqLworICBJTlQgb3V0cHV0SW50ZXJsZWF2ZWQ7IC8qITwgUENNIG91dHB1dCBmb3JtYXQgKGludGVybGVhdmVkL25vbmUgaW50ZXJsZWF2ZWQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gIEhBTkRMRV9UUkFOU1BPUlRERUMgICBoSW5wdXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNwb3J0IGxheWVyIGhhbmRsZS4gKi8KKyAgSEFORExFX1RSQU5TUE9SVERFQyBoSW5wdXQ7IC8qITwgVHJhbnNwb3J0IGxheWVyIGhhbmRsZS4gKi8KIAotICBTYW1wbGluZ1JhdGVJbmZvICAgICAgc2FtcGxpbmdSYXRlSW5mbzsgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIFJhdGUgaW5mb3JtYXRpb24gdGFibGUgKi8KKyAgU2FtcGxpbmdSYXRlSW5mbworICAgICAgc2FtcGxpbmdSYXRlSW5mb1soMSAqIDEpXTsgLyohPCBTYW1wbGluZyBSYXRlIGluZm9ybWF0aW9uIHRhYmxlICovCiAKLSAgVUNIQVIgICAgICAgICAgICAgICAgIGZyYW1lT0s7ICAgICAgICAgICAgICAgICAgICAgLyohPCBXaWxsIGJlIHVuc2V0IGlmIGEgY29uc2lzdGVuY3kgY2hlY2ssIGUuZy4gQ1JDIGV0Yy4gZmFpbHMgKi8KKyAgVUNIQVIKKyAgZnJhbWVPSzsgLyohPCBXaWxsIGJlIHVuc2V0IGlmIGEgY29uc2lzdGVuY3kgY2hlY2ssIGUuZy4gQ1JDIGV0Yy4gZmFpbHMgKi8KIAotICBVSU5UICAgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZsYWdzIGZvciBpbnRlcm5hbCBkZWNvZGVyIHVzZS4gRE8gTk9UIFVTRSBzZWxmOjpzdHJlYW1pbmZvOjpmbGFncyAhICovCisgIFVJTlQgZmxhZ3NbKDEgKiAxKV07IC8qITwgRmxhZ3MgZm9yIGludGVybmFsIGRlY29kZXIgdXNlLiBETyBOT1QgVVNFCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OnN0cmVhbWluZm86OmZsYWdzICEgKi8KKyAgVUlOVCBlbEZsYWdzWygzICogKCg4KSAqIDIpICsgKCgoOCkgKiAyKSkgLyAyICsgNCAqICgxKSArCisgICAgICAgICAgICAgICAgMSldOyAvKiE8IEZsYWdzIGZvciBpbnRlcm5hbCBkZWNvZGVyIHVzZSAoZWxlbWVudCBzcGVjaWZpYykuIERPCisgICAgICAgICAgICAgICAgICAgICAgICBOT1QgVVNFIHNlbGY6OnN0cmVhbWluZm86OmZsYWdzICEgKi8KIAotICBNUDRfRUxFTUVOVF9JRCAgICAgICAgZWxlbWVudHNbKDgpXTsgLyohPCBUYWJsZSB3aGVyZSB0aGUgZWxlbWVudCBJZCdzIGFyZSBsaXN0ZWQgICAgICAgICAgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICAgIGVsVGFnc1soOCldOyAgIC8qITwgVGFibGUgd2hlcmUgdGhlIGVsZW1lbnRzIGlkIFRhZ3MgYXJlIGxpc3RlZCAgICAgICovCi0gIFVDSEFSICAgICAgICAgICAgICAgICBjaE1hcHBpbmdbKDgpXTsgICAvKiE8IFRhYmxlIG9mIE1QRUcgY2Fub25pY2FsIG9yZGVyIHRvIGJpdHN0cmVhbSBjaGFubmVsIG9yZGVyIG1hcHBpbmcuICovCisgIE1QNF9FTEVNRU5UX0lEIGVsZW1lbnRzWygzICogKCg4KSAqIDIpICsgKCgoOCkgKiAyKSkgLyAyICsgNCAqICgxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxKV07IC8qITwgVGFibGUgd2hlcmUgdGhlIGVsZW1lbnQgSWQncyBhcmUgbGlzdGVkICovCisgIFVDSEFSIGVsVGFnc1soMyAqICgoOCkgKiAyKSArICgoKDgpICogMikpIC8gMiArIDQgKiAoMSkgKworICAgICAgICAgICAgICAgIDEpXTsgLyohPCBUYWJsZSB3aGVyZSB0aGUgZWxlbWVudHMgaWQgVGFncyBhcmUgbGlzdGVkICAgICAgKi8KKyAgVUNIQVIgY2hNYXBwaW5nWygoOCkgKiAyKV07IC8qITwgVGFibGUgb2YgTVBFRyBjYW5vbmljYWwgb3JkZXIgdG8gYml0c3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIG9yZGVyIG1hcHBpbmcuICovCiAKLSAgQVVESU9fQ0hBTk5FTF9UWVBFICAgIGNoYW5uZWxUeXBlWyg4KV07ICAgIC8qITwgQXVkaW8gY2hhbm5lbCB0eXBlIG9mIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwgKGZyb20gMCB1cHRvIG51bUNoYW5uZWxzKS4gICAgICAgICAgICovCi0gIFVDSEFSICAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1soOCldOyAvKiE8IEF1ZGlvIGNoYW5uZWwgaW5kZXggZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwgKGZyb20gMCB1cHRvIG51bUNoYW5uZWxzKS4gICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZSBJU08vSUVDIDEzODE4LTc6MjAwNShFKSwgOC41LjMuMiBFeHBsaWNpdCBjaGFubmVsIG1hcHBpbmcgdXNpbmcgYSBwcm9ncmFtX2NvbmZpZ19lbGVtZW50KCkgKi8KKyAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlWyg4KV07IC8qITwgQXVkaW8gY2hhbm5lbCB0eXBlIG9mIGVhY2ggb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBjaGFubmVsIChmcm9tIDAgdXB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMpLiAgICAgICAgICAgKi8KKyAgVUNIQVIgY2hhbm5lbEluZGljZXNbKDgpXTsgLyohPCBBdWRpbyBjaGFubmVsIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChmcm9tIDAgdXB0byBudW1DaGFubmVscykuICAgICAgICAgKi8KKyAgLyogU2VlIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCA4LjUuMy4yIEV4cGxpY2l0IGNoYW5uZWwgbWFwcGluZyB1c2luZyBhCisgICAqIHByb2dyYW1fY29uZmlnX2VsZW1lbnQoKSAqLwogCisgIEZES19jaGFubmVsTWFwRGVzY3IgbWFwRGVzY3I7IC8qITwgRGVzY3JpYmVzIHRoZSBvdXRwdXQgY2hhbm5lbCBtYXBwaW5nLiAqLworICBVQ0hBUiBjaE1hcEluZGV4OyAvKiE8IEluZGV4IHRvIGFjY2VzcyBvbmUgbGluZSBvZiB0aGUgY2hhbm5lbE91dHB1dE1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBub3QgYWxsIDggY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9ucyBoYXZlIHRoZSBzYW1lIG91dHB1dCBtYXBwaW5nLiAqLworICBJTlQgc2JyRGF0YUxlbjsgICAvKiE8IEV4cGVjdGVkIGxlbmd0aCBvZiB0aGUgU0JSIHJlbWFpbmluZyBpbiBiaXRidWZmZXIgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQUFDIHBheWxvYWQgaGFzIGJlZW4gcGFyZWQuICAgKi8KIAotICBjb25zdCBVQ0hBUiAgICAgICAgICgqY2hhbm5lbE91dHB1dE1hcHBpbmcpWzhdOyAgICAvKiE8IFRhYmxlIGZvciBNUEVHIGNhbm9uaWNhbCBvcmRlciB0byBvdXRwdXQgY2hhbm5lbCBvcmRlciBtYXBwaW5nLiAqLwotICBVQ0hBUiAgICAgICAgICAgICAgICAgY2hNYXBJbmRleDsgICAgICAgICAgICAgICAgICAvKiE8IEluZGV4IHRvIGFjY2VzcyBvbmUgbGluZSBvZiB0aGUgY2hhbm5lbE91dHB1dE1hcHBpbmcgdGFibGUuIFRoaXMgaXMgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIG5vdCBhbGwgOCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIGhhdmUgdGhlIHNhbWUgb3V0cHV0IG1hcHBpbmcuICovCisgIENQcm9ncmFtQ29uZmlnIHBjZTsKKyAgQ1N0cmVhbUluZm8KKyAgICAgIHN0cmVhbUluZm87IC8qITwgUG9pbnRlciB0byBTdHJlYW1JbmZvIGRhdGEgKHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtKSAqLworICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvCisgICAgICAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1soOCldOyAvKiE8IFRlbXBvcmFsIGNoYW5uZWwgbWVtb3J5ICovCisgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8KKyAgICAgICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWyg4KV07IC8qITwgUGVyc2lzdGVudCBjaGFubmVsIG1lbW9yeSAqLwogCi0gIENQcm9ncmFtQ29uZmlnICAgICAgICAgICAgICAgIHBjZTsKLSAgQ1N0cmVhbUluZm8gICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mbzsgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gU3RyZWFtSW5mbyBkYXRhIChyZWFkIGZyb20gdGhlIGJpdHN0cmVhbSkgKi8KLSAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAgICAgICAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1soOCldOyAgICAgICAvKiE8IFRlbXBvcmFsIGNoYW5uZWwgbWVtb3J5ICovCi0gIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bKDgpXTsgLyohPCBQZXJzaXN0ZW50IGNoYW5uZWwgbWVtb3J5ICovCisgIEZJWFBfREJMICp3b3JrQnVmZmVyQ29yZTI7CisgIFBDTV9ERUMgKnBUaW1lRGF0YTI7CisgIElOVCB0aW1lRGF0YTJTaXplOwogCi0gIENBYWNEZWNvZGVyQ29tbW9uRGF0YSAgICAgICAgIGFhY0NvbW1vbkRhdGE7ICAgICAgICAgICAgIC8qITwgVGVtcG9yYWwgc2hhcmVkIGRhdGEgZm9yIGFsbCBjaGFubmVscyBob29rZWQgaW50byBwQWFjRGVjb2RlckNoYW5uZWxJbmZvICovCisgIENwZVBlcnNpc3RlbnREYXRhICpjcGVTdGF0aWNEYXRhWygKKyAgICAgIDMgKiAoKDgpICogMikgKyAoKCg4KSAqIDIpKSAvIDIgKyA0ICogKDEpICsKKyAgICAgIDEpXTsgLyohPCBQb2ludGVyIHRvIHBlcnNpc3RlbnQgZGF0YSBzaGFyZWQgYnkgYm90aCBjaGFubmVscyBvZiBhIENQRS4KK1RoaXMgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBvbmNlIGZvciBlYWNoIENQRS4gKi8KIAotICBDQ29uY2VhbFBhcmFtcyAgICAgICAgICAgICAgICBjb25jZWFsQ29tbW9uRGF0YTsKKyAgQ0NvbmNlYWxQYXJhbXMgY29uY2VhbENvbW1vbkRhdGE7CisgIENDb25jZWFsbWVudE1ldGhvZCBjb25jZWFsTWV0aG9kVXNlcjsKIAotICBJTlQgICAgICAgICAgICAgICAgICAgYWFjQ2hhbm5lbHNQcmV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgYW1vdW50IG9mIEFBQyBjb3JlIGNoYW5uZWxzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgZGVjb2RlIGNhbGwuICAgICAgICAgKi8KLSAgQVVESU9fQ0hBTk5FTF9UWVBFICAgIGNoYW5uZWxUeXBlUHJldlsoOCldOyAgICAgLyohPCBBcnJheSBob2xkaW5nIHRoZSBjaGFubmVsVHlwZSB2YWx1ZXMgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBkZWNvZGUgY2FsbC4gICAgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzUHJldlsoOCldOyAgLyohPCBBcnJheSBob2xkaW5nIHRoZSBjaGFubmVsSW5kaWNlcyB2YWx1ZXMgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBkZWNvZGUgY2FsbC4gKi8KKyAgQ1VzYWNDb3JlRXh0ZW5zaW9ucyB1c2FjQ29yZUV4dDsgLyohPCBEYXRhIGFuZCBoYW5kbGVzIHRvIGV4dGVuZCBVU0FDIEZEL0xQRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlIGRlY29kZXIgKFNCUiwgTVBTLCAuLi4pICovCisgIFVJTlQgbnVtVXNhY0VsZW1lbnRzWygxICogMSldOworICBVQ0hBUiB1c2FjU3RlcmVvQ29uZmlnSW5kZXhbKDMgKiAoKDgpICogMikgKyAoKCg4KSAqIDIpKSAvIDIgKyA0ICogKDEpICsgMSldOworICBjb25zdCBDU1VzYWNDb25maWcgKnBVc2FjQ29uZmlnWygxICogMSldOworICBJTlQgbmJEaXY7IC8qITwgbnVtYmVyIG9mIGZyYW1lIGRpdmlzaW9ucyBpbiBMUEQtZG9tYWluICovCiAKKyAgVUNIQVIgdXNlTGRRbWZUaW1lQWxpZ247CiAKLSAgSEFORExFX1NCUkRFQ09ERVIgICBoU2JyRGVjb2RlcjsgICAgICAgICAgICAgICAgICAgLyohPCBTQlIgZGVjb2RlciBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICBzYnJFbmFibGVkOyAgICAgICAgICAgICAgICAgICAgLyohPCBmbGFnIHRvIHN0b3JlIGlmIFNCUiBoYXMgYmVlbiBkZXRlY3RlZCAgICAgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICBzYnJFbmFibGVkUHJldjsgICAgICAgICAgICAgICAgLyohPCBmbGFnIHRvIHN0b3JlIGlmIFNCUiBoYXMgYmVlbiBkZXRlY3RlZCBmcm9tIHByZXZpb3VzIGZyYW1lICovCi0gIFVDSEFSICAgICAgICAgICAgICAgcHNQb3NzaWJsZTsgICAgICAgICAgICAgICAgICAgIC8qITwgZmxhZyB0byBzdG9yZSBpZiBQUyBpcyBwb3NzaWJsZSAgICAgICAgICAgICovCi0gIFNCUl9QQVJBTVMgICAgICAgICAgc2JyUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgIC8qITwgc3RydWN0IHRvIHN0b3JlIGFsbCBzYnIgcGFyYW1ldGVycyAgICAgICAgICovCisgIElOVCBhYWNDaGFubmVsc1ByZXY7IC8qITwgVGhlIGFtb3VudCBvZiBBQUMgY29yZSBjaGFubmVscyBvZiB0aGUgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsIGRlY29kZSBjYWxsLiAgICAgICAgICovCisgIEFVRElPX0NIQU5ORUxfVFlQRSBjaGFubmVsVHlwZVByZXZbKDgpXTsgLyohPCBBcnJheSBob2xkaW5nIHRoZSBjaGFubmVsVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlIGNhbGwuICAgICovCisgIFVDSEFSCisgIGNoYW5uZWxJbmRpY2VzUHJldlsoOCldOyAvKiE8IEFycmF5IGhvbGRpbmcgdGhlIGNoYW5uZWxJbmRpY2VzIHZhbHVlcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBkZWNvZGUgY2FsbC4gKi8KIAotICBRTUZfTU9ERSAgIHFtZk1vZGVDdXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBjdXJyZW50IFFNRiBtb2RlICAgICAgICAgICAgICAgICAgICAgICAqLwotICBRTUZfTU9ERSAgIHFtZk1vZGVVc2VyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBRTUYgbW9kZSByZXF1ZXN0ZWQgYnkgdGhlIGxpYnJhcnkgdXNlciAqLworICBVQ0hBUgorICBkb3duc2NhbGVGYWN0b3I7IC8qITwgVmFyaWFibGUgdG8gc3RvcmUgYSBzdXBwb3J0ZWQgRUxEIGRvd25zY2FsZSBmYWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICBvZiAxLCAyLCAzIG9yIDQgKi8KKyAgVUNIQVIgZG93bnNjYWxlRmFjdG9ySW5CUzsgLyohPCBWYXJpYWJsZSB0byBzdG9yZSB0aGUgKG5vdCBuZWNlc3NhcmlseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQpIEVMRCBkb3duc2NhbGUgZmFjdG9yIGRpc2NvdmVyZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSAqLwogCi0gIEhBTkRMRV9BQUNfRFJDICBoRHJjSW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERSQyBkYXRhIHN0cnVjdHVyZSAgICAgICAgICAgICAgICovCisgIEhBTkRMRV9TQlJERUNPREVSIGhTYnJEZWNvZGVyOyAvKiE8IFNCUiBkZWNvZGVyIGhhbmRsZS4gKi8KKyAgVUNIQVIgc2JyRW5hYmxlZDsgICAgIC8qITwgZmxhZyB0byBzdG9yZSBpZiBTQlIgaGFzIGJlZW4gZGV0ZWN0ZWQgICAgICovCisgIFVDSEFSIHNickVuYWJsZWRQcmV2OyAvKiE8IGZsYWcgdG8gc3RvcmUgaWYgU0JSIGhhcyBiZWVuIGRldGVjdGVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIGZyYW1lICovCisgIFVDSEFSIHBzUG9zc2libGU7ICAgICAvKiE8IGZsYWcgdG8gc3RvcmUgaWYgUFMgaXMgcG9zc2libGUgICAgICAgICAgICAqLworICBTQlJfUEFSQU1TIHNiclBhcmFtczsgLyohPCBzdHJ1Y3QgdG8gc3RvcmUgYWxsIHNiciBwYXJhbWV0ZXJzICAgICAgICAgKi8KIAorICBVQ0hBUiAqcERybUJzQnVmZmVyOyAvKiE8IFBvaW50ZXIgdG8gZHluYW1pYyBidWZmZXIgd2hpY2ggaXMgdXNlZCB0byByZXZlcnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzIG9mIHRoZSBEUk0gU0JSIHBheWxvYWQgKi8KKyAgVVNIT1JUIGRybUJzQnVmZmVyU2l6ZTsgLyohPCBTaXplIG9mIHRoZSBkeW5hbWljIGJ1ZmZlciB3aGljaCBpcyB1c2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2UgdGhlIGJpdHMgb2YgdGhlIERSTSBTQlIgcGF5bG9hZCAqLworICBGREtfUU1GX0RPTUFJTgorICBxbWZEb21haW47IC8qITwgSW5zdGFuY2Ugb2YgbW9kdWxlIGZvciBRTUYgZG9tYWluIGRhdGEgaGFuZGxpbmcgKi8KIAotICBDQW5jRGF0YSAgICAgIGFuY0RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHN0cnVjdHVyZSB0byBoYW5kbGUgYW5jaWxsYXJ5IGRhdGEgICAgICAgICAqLworICBRTUZfTU9ERSBxbWZNb2RlQ3VycjsgLyohPCBUaGUgY3VycmVudCBRTUYgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUU1GX01PREUgcW1mTW9kZVVzZXI7IC8qITwgVGhlIFFNRiBtb2RlIHJlcXVlc3RlZCBieSB0aGUgbGlicmFyeSB1c2VyICovCiAKLSAgSEFORExFX1BDTV9ET1dOTUlYICBoUGNtVXRpbHM7ICAgICAgICAgICAgICAgICAgICAgLyohPCBwcml2YXQgZGF0YSBmb3IgdGhlIFBDTSB1dGlscy4gICAgICAgICAgICAgKi8KLSAgVERMaW1pdGVyUHRyIGhMaW1pdGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIYW5kbGUgb2YgdGltZSBkb21haW4gbGltaXRlci4gICAgICAgICAgICAgKi8KLSAgVUNIQVIgICAgICAgIGxpbWl0ZXJFbmFibGVVc2VyOyAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgbGltaXRlciBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgbGlicmFyeSB1c2VyICovCi0gIFVDSEFSICAgICAgICBsaW1pdGVyRW5hYmxlQ3VycjsgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIGN1cnJlbnQgbGltaXRlciBjb25maWd1cmF0aW9uLiAgICAgICAgICovCisgIEhBTkRMRV9BQUNfRFJDIGhEcmNJbmZvOyAvKiE8IGhhbmRsZSB0byBEUkMgZGF0YSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAqLworICBJTlQgbWV0YWRhdGFFeHBpcnk7ICAgICAgLyohPCBNZXRhZGF0YSBleHBpcnkgdGltZSBpbiBtaWxsaS1zZWNvbmRzLiAgICAgKi8KIAotICBGSVhQX0RCTCAgICAgZXh0R2FpblsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdhaW4gdGhhdCBtdXN0IGJlIGFwcGxpZWQgdG8gdGhlIG91dHB1dCBzaWduYWwuICovCi0gIFVJTlQgICAgICAgICBleHRHYWluRGVsYXk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGVsYXkgdGhhdCBtdXN0IGJlIGFjY291bnRlZCBmb3IgZXh0R2Fpbi4gKi8KKyAgdm9pZCAqcE1wZWdTdXJyb3VuZERlY29kZXI7IC8qITwgcG9pbnRlciB0byBtcGVnIHN1cnJvdW5kIGRlY29kZXIgc3RydWN0dXJlICovCisgIFVDSEFSIG1wc0VuYWJsZVVzZXI7ICAgICAgICAvKiE8IE1QUyBlbmFibGUgdXNlciBmbGFnICAgICAgICAgICAgICAgICAgICAgICAqLworICBVQ0hBUiBtcHNFbmFibGVDdXJyOyAgICAgICAgLyohPCBNUFMgZW5hYmxlIGRlY29kZXIgc3RhdGUgICAgICAgICAgICAgICAgICAgKi8KKyAgVUNIQVIgbXBzQXBwbGljYWJsZTsgICAgICAgIC8qITwgTVBTIGFwcGxpY2FibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSIG1wc091dHB1dE1vZGU7IC8qITwgc2V0dGluZzogbm9ybWFsID0gMCwgYmluYXVyYWwgPSAxLCBzdGVyZW8gPSAyLCA1LjFjaAorICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgKi8KKyAgSU5UIG1wc091dENoYW5uZWxzTGFzdDsgLyohPCBUaGUgYW1vdW50IG9mIGNoYW5uZWxzIHJldHVybmVkIGJ5IHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgTVBTIGRlY29kZXIgY2FsbC4gKi8KKyAgSU5UIG1wc0ZyYW1lU2l6ZUxhc3Q7ICAgLyohPCBUaGUgZnJhbWUgbGVuZ3RoIHJldHVybmVkIGJ5IHRoZSBsYXN0IHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBTIGRlY29kZXIgY2FsbC4gKi8KIAotICBJTlRfUENNICAgICAgcGNtT3V0cHV0QnVmZmVyWyg4KSooMjA0OCldOworICBDQW5jRGF0YSBhbmNEYXRhOyAvKiE8IHN0cnVjdHVyZSB0byBoYW5kbGUgYW5jaWxsYXJ5IGRhdGEgICAgICAgICAqLwogCisgIEhBTkRMRV9QQ01fRE9XTk1JWCBoUGNtVXRpbHM7IC8qITwgcHJpdmF0IGRhdGEgZm9yIHRoZSBQQ00gdXRpbHMuICovCisKKyAgVERMaW1pdGVyUHRyIGhMaW1pdGVyOyAgIC8qITwgSGFuZGxlIG9mIHRpbWUgZG9tYWluIGxpbWl0ZXIuICAgICAgICAgICAgICovCisgIFVDSEFSIGxpbWl0ZXJFbmFibGVVc2VyOyAvKiE8IFRoZSBsaW1pdGVyIGNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSB1c2VyICovCisgIFVDSEFSIGxpbWl0ZXJFbmFibGVDdXJyOyAvKiE8IFRoZSBjdXJyZW50IGxpbWl0ZXIgY29uZmlndXJhdGlvbi4gICAgICAgICAqLworICBGSVhQX0RCTCBleHRHYWluWzFdOyAvKiE8IEdhaW4gdGhhdCBtdXN0IGJlIGFwcGxpZWQgdG8gdGhlIG91dHB1dCBzaWduYWwuICovCisgIFVJTlQgZXh0R2FpbkRlbGF5OyAgIC8qITwgRGVsYXkgdGhhdCBtdXN0IGJlIGFjY291bnRlZCBmb3IgZXh0R2Fpbi4gKi8KKworICBJTlRfUENNIHBjbU91dHB1dEJ1ZmZlclsoOCkgKiAoMTAyNCAqIDIpXTsKKworICBIQU5ETEVfRFJDX0RFQ09ERVIgaFVuaURyY0RlY29kZXI7CisgIFVDSEFSIG11bHRpYmFuZERyY1ByZXNlbnQ7CisgIFVDSEFSIG51bVRpbWVTbG90czsKKyAgVUlOVCBsb3VkbmVzc0luZm9TZXRQb3NpdGlvblszXTsKKyAgU0NIQVIgZGVmYXVsdFRhcmdldExvdWRuZXNzOworCisgIElOVF9QQ00KKyAgKnBUaW1lRGF0YUZsdXNoWygoOCkgKiAyKV07IC8qITwgUG9pbnRlciB0byB0aGUgZmx1c2hlZCB0aW1lIGRhdGEgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGNyb3NzZmFkZSBpbiBjYXNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBVU0FDIERBU0ggSVBGIGNvbmZpZyBjaGFuZ2UgKi8KKworICBVQ0hBUiBmbHVzaFN0YXR1czsgICAgIC8qITwgSW5kaWNhdGVzIGZsdXNoIHN0YXR1czogb258b2ZmICovCisgIFNDSEFSIGZsdXNoQ250OyAgICAgICAgLyohPCBGbHVzaCBmcmFtZSBjb3VudGVyICovCisgIFVDSEFSIGJ1aWxkVXBTdGF0dXM7ICAgLyohPCBJbmRpY2F0ZXMgYnVpbGQgdXAgc3RhdHVzOiBvbnxvZmYgKi8KKyAgU0NIQVIgYnVpbGRVcENudDsgICAgICAvKiE8IEJ1aWxkIHVwIGZyYW1lIGNvdW50ZXIgKi8KKyAgVUNIQVIgaGFzQXVkaW9QcmVSb2xsOyAvKiE8IEluZGljYXRlcyBwcmVSb2xsIHN0YXR1czogb258b2ZmICovCisgIFVJTlQgcHJlcm9sbEFVTGVuZ3RoW0FBQ0RFQ19NQVhfTlVNX1BSRVJPTExfQVUgKyAxXTsgLyohPCBSZWxhdGl2ZSBvZmZzZXQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJlcm9sbEFVIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIHRvIHRoZSBBVQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHBvc2l0aW9uIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbSAqLworICBJTlQgYWNjZXNzVW5pdDsgLyohPCBOdW1iZXIgb2YgdGhlIGFjdHVhbCBwcm9jZXNzZWQgcHJlcm9sbCBhY2Nlc3NVbml0ICovCisgIFVDSEFSIGFwcGx5Q3Jvc3NmYWRlOyAvKiE8IGlmIHNldCBjcm9zc2ZhZGUgZm9yIHNlYW1sZXNzIHN0cmVhbSBzd2l0Y2hpbmcgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgKi8KKworICBGREtfU2lnbmFsRGVsYXkgdXNhY1Jlc2lkdWFsRGVsYXk7IC8qITwgRGVsYXkgcmVzaWR1YWwgc2lnbmFsIHRvIGNvbXBlbnNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZVNCUiBkZWxheSBvZiBETVggc2lnbmFsIGluIGNhc2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9Db25maWdJbmRleD09Mi4gKi8KIH07CiAKLQotI2RlZmluZSBBQUNfREVCVUdfRVhUSExQICJcCisjZGVmaW5lIEFBQ19ERUJVR19FWFRITFAgXAorICAiXAogLS0tIEFBQy1Db3JlIC0tLVxuXAogICAgIDB4MDAwMTAwMDAgSGVhZGVyIGRhdGFcblwKICAgICAweDAwMDIwMDAwIENSQyBkYXRhXG5cCkBAIC0yNzIsNyArMzg4LDggQEAKIAogICBccmV0dXJuICBFcnJvciBjb2RlCiAqLwotQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YUluaXQoQ0FuY0RhdGEgKmFuY0RhdGEsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpOworQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YUluaXQoQ0FuY0RhdGEgKmFuY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBzaXplKTsKIAogLyohCiAgIFxicmllZiBHZXQgb25lIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnQKQEAgLTI4MCwyMCArMzk3LDIyIEBACiAgIFxhbmNEYXRhIFBvaW50ZXIgdG8gYW5jaWxsYXJ5IGRhdGEgc3RydWN0dXJlCiAgIFxpbmRleCBJbmRleCBvZiB0aGUgYW5jIGRhdGEgZWxlbWVudCB0byBnZXQKICAgXHB0ciBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyBhIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBhbmMgZGF0YSBlbGVtZW50Ci0gIFxzaXplIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3RlZCBhbmMgZGF0YSBlbGVtZW50CisgIFxzaXplIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3RlZCBhbmMgZGF0YQorICBlbGVtZW50CiAKICAgXHJldHVybiAgRXJyb3IgY29kZQogKi8KLUFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0FuY0RhdGFHZXQoQ0FuY0RhdGEgKmFuY0RhdGEsIGludCBpbmRleCwgdW5zaWduZWQgY2hhciAqKnB0ciwgaW50ICpzaXplKTsKLQorQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YUdldChDQW5jRGF0YSAqYW5jRGF0YSwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUpOwogCiAvKiBpbml0aWFsaXphdGlvbiBvZiBhYWMgZGVjb2RlciAqLwogTElOS1NQRUNfSCBIQU5ETEVfQUFDREVDT0RFUiBDQWFjRGVjb2Rlcl9PcGVuKFRSQU5TUE9SVF9UWVBFIGJzRm9ybWF0KTsKIAotLyogSW5pdGlhbGl6YXRpb24gb2Ygc3RyZWFtLWluZm8gZWxlbWVudHMgKi8KKy8qIEluaXRpYWxpemF0aW9uIG9mIGNoYW5uZWwgZWxlbWVudHMgKi8KIExJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfSW5pdChIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGNvbmZpZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmNvbmZpZ0NoYW5nZWQpOwogLyohCiAgIFxicmllZiBEZWNvZGVzIG9uZSBhYWMgZnJhbWUKIApAQCAtMzA4LDE4ICs0MjcsMzkgQEAKICAgXHJldHVybiAgZXJyb3Igc3RhdHVzCiAqLwogTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgKLSAgICAgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKLSAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgSU5UX1BDTSAqcFRpbWVEYXRhLAotICAgICAgICBjb25zdCBJTlQgIHRpbWVEYXRhU2l6ZSwKLSAgICAgICAgY29uc3QgSU5UIGludGVybGVhdmVkCi0gICAgICAgICk7CisgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwgY29uc3QgVUlOVCBmbGFncywgRklYUF9QQ00gKnBUaW1lRGF0YSwKKyAgICBjb25zdCBJTlQgdGltZURhdGFTaXplLCBjb25zdCBpbnQgdGltZURhdGFDaGFubmVsT2Zmc2V0KTsKKworLyogRnJlZSBjb25maWcgZGVwZW5kZW50IEFBQyBtZW1vcnkgKi8KK0xJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfRnJlZU1lbShIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdWJTdHJlYW1JbmRleCk7CisKKy8qIFByZXBhcmUgY3Jvc3NmYWRlIGZvciBVU0FDIERBU0ggSVBGIGNvbmZpZyBjaGFuZ2UgKi8KK0xJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfUHJlcGFyZUNyb3NzRmFkZSgKKyAgICBjb25zdCBJTlRfUENNICpwVGltZURhdGEsIElOVF9QQ00gKipwVGltZURhdGFGbHVzaCwgY29uc3QgSU5UIG51bUNoYW5uZWxzLAorICAgIGNvbnN0IElOVCBmcmFtZVNpemUsIGNvbnN0IElOVCBpbnRlcmxlYXZlZCk7CisKKy8qIEFwcGx5IGNyb3NzZmFkZSBmb3IgVVNBQyBEQVNIIElQRiBjb25maWcgY2hhbmdlICovCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0FwcGx5Q3Jvc3NGYWRlKAorICAgIElOVF9QQ00gKnBUaW1lRGF0YSwgSU5UX1BDTSAqKnBUaW1lRGF0YUZsdXNoLCBjb25zdCBJTlQgbnVtQ2hhbm5lbHMsCisgICAgY29uc3QgSU5UIGZyYW1lU2l6ZSwgY29uc3QgSU5UIGludGVybGVhdmVkKTsKKworLyogU2V0IGZsdXNoIGFuZCBidWlsZCB1cCBtb2RlICovCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0N0cmxDRkdDaGFuZ2UoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBmbHVzaFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBmbHVzaENudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBidWlsZFVwU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGJ1aWxkVXBDbnQpOworCisvKiBQYXJzZSBwcmVSb2xsIEV4dGVuc2lvbiBQYXlsb2FkICovCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX1ByZVJvbGxFeHRlbnNpb25QYXlsb2FkUGFyc2UoCisgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwgVUlOVCAqbnVtUHJlcm9sbEFVLCBVSU5UICpwcmVyb2xsQVVPZmZzZXQsCisgICAgVUlOVCAqcHJlcm9sbEFVTGVuZ3RoKTsKIAogLyogRGVzdHJveSBhYWMgZGVjb2RlciAqLwotTElOS1NQRUNfSCB2b2lkIENBYWNEZWNvZGVyX0Nsb3NlICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiApOworTElOS1NQRUNfSCB2b2lkIENBYWNEZWNvZGVyX0Nsb3NlKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpOwogCiAvKiBnZXQgc3RyZWFtaW5mbyBoYW5kbGUgZnJvbSBkZWNvZGVyICovCi1MSU5LU1BFQ19IIENTdHJlYW1JbmZvKiBDQWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiApOwotCitMSU5LU1BFQ19IIENTdHJlYW1JbmZvICpDQWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpOwogCiAjZW5kaWYgLyogI2lmbmRlZiBBQUNERUNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlcl9saWIuY3BwIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyX2xpYi5jcHAKaW5kZXggNTBlZmIwZi4uZDk4Y2Y1YSAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyX2xpYi5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyX2xpYi5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorCiAgICBEZXNjcmlwdGlvbjoKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCiAKQEAgLTk1LDIyICsxMDcsMjAgQEAKICNpbmNsdWRlICJ0cGRlY19saWIuaCIKICNpbmNsdWRlICJGREtfY29yZS5oIiAvKiBGREtfdG9vbHMgdmVyc2lvbiBpbmZvICovCiAKLQotICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCi0KLQotCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogCiAjaW5jbHVkZSAiY29uY2VhbC5oIgogCi0gI2luY2x1ZGUgImFhY2RlY19kcmMuaCIKKyNpbmNsdWRlICJhYWNkZWNfZHJjLmgiCiAKKyNpbmNsdWRlICJzYWNfZGVjX2xpYi5oIgogCisjaW5jbHVkZSAicGNtX3V0aWxzLmgiCiAKIC8qIERlY29kZXIgbGlicmFyeSBpbmZvICovCi0jZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1ZMMCAyCi0jZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1ZMMSA1Ci0jZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1ZMMiAxNworI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDAgMworI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDEgMAorI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDIgMAogI2RlZmluZSBBQUNERUNPREVSX0xJQl9USVRMRSAiQUFDIERlY29kZXIgTGliIgogI2lmZGVmIF9fQU5EUk9JRF9fCiAjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0JVSUxEX0RBVEUgIiIKQEAgLTEyMCwxOSArMTMwLDM4IEBACiAjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0JVSUxEX1RJTUUgX19USU1FX18KICNlbmRpZgogCi1zdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IKLXNldENvbmNlYWxNZXRob2QgKCBjb25zdCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgbWV0aG9kICk7CitzdGF0aWMgQUFDX0RFQ09ERVJfRVJST1Igc2V0Q29uY2VhbE1ldGhvZChjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1ldGhvZCk7CiAKK3N0YXRpYyB2b2lkIGFhY0RlY29kZXJfc2V0TWV0YWRhdGFFeHBpcnkoY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHZhbHVlKSB7CisgIC8qIGNoZWNrIGRlY29kZXIgaGFuZGxlICovCisgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICBJTlQgbWRFeHBGcmFtZSA9IDA7IC8qIGRlZmF1bHQ6IGRpc2FibGUgKi8KIAotTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfR2V0RnJlZUJ5dGVzICggY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsIFVJTlQgKnBGcmVlQnl0ZXMpeworICAgIGlmICgodmFsdWUgPiAwKSAmJgorICAgICAgICAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgPgorICAgICAgICAgMCkpIHsgLyogRGV0ZXJtaW5lIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBmcmFtZXM6ICovCisgICAgICBGSVhQX0RCTCBmcmFtZVRpbWUgPSBmRGl2Tm9ybShzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSAqIDEwMDApOworICAgICAgbWRFeHBGcmFtZSA9IGZNdWx0SWNlaWwoZnJhbWVUaW1lLCB2YWx1ZSk7CisgICAgfQogCisgICAgLyogQ29uZmlndXJlIERSQyBtb2R1bGUgKi8KKyAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtKHNlbGYtPmhEcmNJbmZvLCBEUkNfREFUQV9FWFBJUllfRlJBTUUsIG1kRXhwRnJhbWUpOworCisgICAgLyogQ29uZmlndXJlIFBDTSBkb3dubWl4IG1vZHVsZSAqLworICAgIHBjbURteF9TZXRQYXJhbShzZWxmLT5oUGNtVXRpbHMsIERNWF9CU19EQVRBX0VYUElSWV9GUkFNRSwgbWRFeHBGcmFtZSk7CisgIH0KK30KKworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SCithYWNEZWNvZGVyX0dldEZyZWVCeXRlcyhjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBVSU5UICpwRnJlZUJ5dGVzKSB7CiAgIC8qIHJlc2V0IGZyZWUgYnl0ZXMgKi8KICAgKnBGcmVlQnl0ZXMgPSAwOwogCiAgIC8qIGNoZWNrIGhhbmRsZSAqLwotICBpZighc2VsZikKLSAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgaWYgKCFzZWxmKSByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKIAogICAvKiByZXR1cm4gbnIgb2YgZnJlZSBieXRlcyAqLwogICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtKHNlbGYtPmhJbnB1dCwgMCk7CkBAIC0xNDUsNDMgKzE3NCw0NiBAQAogLyoqCiAgKiBDb25maWcgRGVjb2RlciB1c2luZyBhIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBzdHJ1Y3QuCiAgKi8KLXN0YXRpYwotTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfQ29uZmlnKEhBTkRMRV9BQUNERUNPREVSIHNlbGYsIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzY1N0cnVjdCkKLXsKK3N0YXRpYyBMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9Db25maWcoCisgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjU3RydWN0LAorICAgIFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkKSB7CiAgIEFBQ19ERUNPREVSX0VSUk9SIGVycjsKIAogICAvKiBJbml0aWFsaXplIEFBQyBjb3JlIGRlY29kZXIsIGFuZCB1cGRhdGUgc2VsZi0+c3RyZWFtaW5mbyAqLwotICBlcnIgPSBDQWFjRGVjb2Rlcl9Jbml0KHNlbGYsIHBBc2NTdHJ1Y3QpOworICBlcnIgPSBDQWFjRGVjb2Rlcl9Jbml0KHNlbGYsIHBBc2NTdHJ1Y3QsIGNvbmZpZ01vZGUsIGNvbmZpZ0NoYW5nZWQpOworCisgIGlmICghRkRLX2NoTWFwRGVzY3JfaXNWYWxpZCgmc2VsZi0+bWFwRGVzY3IpKSB7CisgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgfQogCiAgIHJldHVybiBlcnI7CiB9CiAKLUxJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0NvbmZpZ1JhdyAoCi0gICAgICAgIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCi0gICAgICAgIFVDSEFSICpjb25mW10sCi0gICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoW10gKQoteworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfQ29uZmlnUmF3KEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmNvbmZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aFtdKSB7CiAgIEFBQ19ERUNPREVSX0VSUk9SIGVyciA9IEFBQ19ERUNfT0s7Ci0gIFRSQU5TUE9SVERFQ19FUlJPUiAgIGVyclRwOworICBUUkFOU1BPUlRERUNfRVJST1IgZXJyVHA7CiAgIFVJTlQgbGF5ZXIsIG5yT2ZMYXllcnMgPSBzZWxmLT5uck9mTGF5ZXJzOwogCi0gIGZvcihsYXllciA9IDA7IGxheWVyIDwgbnJPZkxheWVyczsgbGF5ZXIrKyl7Ci0gICAgaWYobGVuZ3RoW2xheWVyXSA+IDApewotICAgICAgZXJyVHAgPSB0cmFuc3BvcnREZWNfT3V0T2ZCYW5kQ29uZmlnKHNlbGYtPmhJbnB1dCwgY29uZltsYXllcl0sIGxlbmd0aFtsYXllcl0sIGxheWVyKTsKKyAgZm9yIChsYXllciA9IDA7IGxheWVyIDwgbnJPZkxheWVyczsgbGF5ZXIrKykgeworICAgIGlmIChsZW5ndGhbbGF5ZXJdID4gMCkgeworICAgICAgZXJyVHAgPSB0cmFuc3BvcnREZWNfT3V0T2ZCYW5kQ29uZmlnKHNlbGYtPmhJbnB1dCwgY29uZltsYXllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoW2xheWVyXSwgbGF5ZXIpOwogICAgICAgaWYgKGVyclRwICE9IFRSQU5TUE9SVERFQ19PSykgewogICAgICAgICBzd2l0Y2ggKGVyclRwKSB7Ci0gICAgICAgIGNhc2UgVFJBTlNQT1JUREVDX05FRURfVE9fUkVTVEFSVDoKLSAgICAgICAgICBlcnIgPSBBQUNfREVDX05FRURfVE9fUkVTVEFSVDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOgotICAgICAgICAgIGVyciA9IEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGVyciA9IEFBQ19ERUNfVU5LTk9XTjsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19ORUVEX1RPX1JFU1RBUlQ6CisgICAgICAgICAgICBlcnIgPSBBQUNfREVDX05FRURfVE9fUkVTVEFSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDoKKyAgICAgICAgICAgIGVyciA9IEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVyciA9IEFBQ19ERUNfVU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIC8qIGlmIGJhc2VsYXllciBpcyBPSyB3ZSBjb250aW51ZSBkZWNvZGluZyAqLwotICAgICAgICBpZihsYXllciA+PSAxKXsKKyAgICAgICAgaWYgKGxheWVyID49IDEpIHsKICAgICAgICAgICBzZWxmLT5uck9mTGF5ZXJzID0gbGF5ZXI7CiAgICAgICAgICAgZXJyID0gQUFDX0RFQ19PSzsKICAgICAgICAgfQpAQCAtMTkzLDM5ICsyMjUsOTEgQEAKICAgcmV0dXJuIGVycjsKIH0KIAorTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfUmF3SVNPQk1GRkRhdGEoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGxlbmd0aCkgeworICBGREtfQklUU1RSRUFNIGJzOworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmYnM7CisgIEFBQ19ERUNPREVSX0VSUk9SIGVyciA9IEFBQ19ERUNfT0s7CiAKKyAgaWYgKGxlbmd0aCA8IDgpIHJldHVybiBBQUNfREVDX1VOS05PV047CiAKLXN0YXRpYyBJTlQgYWFjRGVjb2Rlcl9Db25maWdDYWxsYmFjayh2b2lkICpoYW5kbGUsIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzY1N0cnVjdCkKLXsKKyAgd2hpbGUgKGxlbmd0aCA+PSA4KSB7CisgICAgVUlOVCBzaXplID0KKyAgICAgICAgKGJ1ZmZlclswXSA8PCAyNCkgfCAoYnVmZmVyWzFdIDw8IDE2KSB8IChidWZmZXJbMl0gPDwgOCkgfCBidWZmZXJbM107CisgICAgRFJDX0RFQ19FUlJPUiB1bmlEcmNFcnIgPSBEUkNfREVDX09LOworCisgICAgaWYgKGxlbmd0aCA8IHNpemUpIHJldHVybiBBQUNfREVDX1VOS05PV047CisgICAgaWYgKHNpemUgPD0gOCkgcmV0dXJuIEFBQ19ERUNfVU5LTk9XTjsKKworICAgIEZES2luaXRCaXRTdHJlYW0oaEJzLCBidWZmZXIgKyA4LCAweDEwMDAwMDAwLCAoc2l6ZSAtIDgpICogOCk7CisKKyAgICBpZiAoKGJ1ZmZlcls0XSA9PSAnbCcpICYmIChidWZmZXJbNV0gPT0gJ3UnKSAmJiAoYnVmZmVyWzZdID09ICdkJykgJiYKKyAgICAgICAgKGJ1ZmZlcls3XSA9PSAndCcpKSB7CisgICAgICB1bmlEcmNFcnIgPSBGREtfZHJjRGVjX1JlYWRMb3VkbmVzc0JveChzZWxmLT5oVW5pRHJjRGVjb2RlciwgaEJzKTsKKyAgICB9IGVsc2UgaWYgKChidWZmZXJbNF0gPT0gJ2QnKSAmJiAoYnVmZmVyWzVdID09ICdtJykgJiYgKGJ1ZmZlcls2XSA9PSAnaScpICYmCisgICAgICAgICAgICAgICAoYnVmZmVyWzddID09ICd4JykpIHsKKyAgICAgIHVuaURyY0VyciA9CisgICAgICAgICAgRkRLX2RyY0RlY19SZWFkRG93bm1peEluc3RydWN0aW9uc19Cb3goc2VsZi0+aFVuaURyY0RlY29kZXIsIGhCcyk7CisgICAgfSBlbHNlIGlmICgoYnVmZmVyWzRdID09ICd1JykgJiYgKGJ1ZmZlcls1XSA9PSAnZCcpICYmIChidWZmZXJbNl0gPT0gJ2knKSAmJgorICAgICAgICAgICAgICAgKGJ1ZmZlcls3XSA9PSAnMicpKSB7CisgICAgICB1bmlEcmNFcnIgPQorICAgICAgICAgIEZES19kcmNEZWNfUmVhZFVuaURyY0luc3RydWN0aW9uc19Cb3goc2VsZi0+aFVuaURyY0RlY29kZXIsIGhCcyk7CisgICAgfSBlbHNlIGlmICgoYnVmZmVyWzRdID09ICd1JykgJiYgKGJ1ZmZlcls1XSA9PSAnZCcpICYmIChidWZmZXJbNl0gPT0gJ2MnKSAmJgorICAgICAgICAgICAgICAgKGJ1ZmZlcls3XSA9PSAnMicpKSB7CisgICAgICB1bmlEcmNFcnIgPQorICAgICAgICAgIEZES19kcmNEZWNfUmVhZFVuaURyY0NvZWZmaWNpZW50c19Cb3goc2VsZi0+aFVuaURyY0RlY29kZXIsIGhCcyk7CisgICAgfQorCisgICAgaWYgKHVuaURyY0VyciAhPSBEUkNfREVDX09LKSBlcnIgPSBBQUNfREVDX1VOS05PV047CisKKyAgICBidWZmZXIgKz0gc2l6ZTsKKyAgICBsZW5ndGggLT0gc2l6ZTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBJTlQgYWFjRGVjb2Rlcl9Db25maWdDYWxsYmFjayh2b2lkICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjU3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkKSB7CiAgIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgPSAoSEFORExFX0FBQ0RFQ09ERVIpaGFuZGxlOwogICBBQUNfREVDT0RFUl9FUlJPUiBlcnIgPSBBQUNfREVDX09LOwogICBUUkFOU1BPUlRERUNfRVJST1IgZXJyVHA7CiAKKyAgRkRLX0FTU0VSVChzZWxmICE9IE5VTEwpOwogICB7Ci0gICAgewotICAgICAgZXJyID0gYWFjRGVjb2Rlcl9Db25maWcoc2VsZiwgcEFzY1N0cnVjdCk7Ci0gICAgfQorICAgIHsgZXJyID0gYWFjRGVjb2Rlcl9Db25maWcoc2VsZiwgcEFzY1N0cnVjdCwgY29uZmlnTW9kZSwgY29uZmlnQ2hhbmdlZCk7IH0KICAgfQogICBpZiAoZXJyID09IEFBQ19ERUNfT0spIHsKLSAgICBpZiAoIHNlbGYtPmZsYWdzICYgKEFDX1VTQUN8QUNfUlNWRDUwfEFDX0xEfEFDX0VMRCkKLSAgICAgICYmIENDb25jZWFsbWVudF9HZXREZWxheSgmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEpID4gMCApCi0gICAgeworICAgIC8qCisgICAgcmV2ZXJ0IGNvbmNlYWxtZW50IG1ldGhvZCBpZiBlaXRoZXIKKyAgICAgICAtIEludGVycG9sYXRpb24gY29uY2VhbG1lbnQgbWlnaHQgbm90IGJlIG1lYW5pbmdmdWwKKyAgICAgICAtIEludGVycG9sYXRpb24gY29uY2VhbG1lbnQgaXMgbm90IGltcGxlbWVudGVkCisgICAgKi8KKyAgICBpZiAoKHNlbGYtPmZsYWdzWzBdICYgKEFDX0xEIHwgQUNfRUxEKSAmJgorICAgICAgICAgKHNlbGYtPmNvbmNlYWxNZXRob2RVc2VyID09IENvbmNlYWxNZXRob2ROb25lKSAmJgorICAgICAgICAgQ0NvbmNlYWxtZW50X0dldERlbGF5KCZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSkgPgorICAgICAgICAgICAgIDApIC8qIG1pZ2h0IG5vdCBiZSBtZWFuaW5nZnVsIGJ1dCBhbGxvdyBpZiB1c2VyIGhhcyBzZXQgaXQKKyAgICAgICAgICAgICAgICAgICBleHBpY2l0bHkgKi8KKyAgICAgICAgfHwgKHNlbGYtPmZsYWdzWzBdICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkgJiYKKyAgICAgICAgICAgIENDb25jZWFsbWVudF9HZXREZWxheSgmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEpID4KKyAgICAgICAgICAgICAgICAwKSAvKiBub3QgaW1wbGVtZW50ZWQgKi8KKyAgICApIHsKICAgICAgIC8qIFJldmVydCB0byBlcnJvciBjb25jZWFsbWVudCBtZXRob2QgTm9pc2UgU3Vic3RpdHV0aW9uLgotICAgICAgICAgQmVjYXVzZSBpbnRlcnBvbGF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgVVNBQy9SU1ZENTAgb3IKKyAgICAgICAgIEJlY2F1c2UgaW50ZXJwb2xhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIFVTQUMgb3IKICAgICAgICAgIHRoZSBhZGRpdGlvbmFsIGRlbGF5IGlzIHVud2FudGVkIGZvciBsb3cgZGVsYXkgY29kZWNzLiAqLwogICAgICAgc2V0Q29uY2VhbE1ldGhvZChzZWxmLCAxKTsKLSNpZmRlZiBERUJVRwotICAgICAgRkRLcHJpbnRmKCIgIENvbmNlYWxtZW50IG1ldGhvZCB3YXMgcmV2ZXJ0ZWQgdG8gMSAhXG4iKTsKLSNlbmRpZgogICAgIH0KKyAgICBhYWNEZWNvZGVyX3NldE1ldGFkYXRhRXhwaXJ5KHNlbGYsIHNlbGYtPm1ldGFkYXRhRXhwaXJ5KTsKICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19PSzsKICAgfSBlbHNlIHsKLSAgICBpZiAoSVNfSU5JVF9FUlJPUihlcnIpKSB7CisgICAgaWYgKGVyciA9PSBBQUNfREVDX05FRURfVE9fUkVTVEFSVCkgeworICAgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUOworICAgIH0gZWxzZSBpZiAoSVNfSU5JVF9FUlJPUihlcnIpKSB7CiAgICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CiAgICAgfSAvKiBGYXRhbCBlcnJvcnMgKi8KLSAgICBlbHNlIGlmIChlcnIgPT0gQUFDX0RFQ19ORUVEX1RPX1JFU1RBUlQpIHsKLSAgICAgIGVyclRwID0gVFJBTlNQT1JUREVDX05FRURfVE9fUkVTVEFSVDsKLSAgICB9IGVsc2UgeworICAgIGVsc2UgewogICAgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOwogICAgIH0KICAgfQpAQCAtMjMzLDM3ICszMTcsMjI5IEBACiAgIHJldHVybiBlcnJUcDsKIH0KIAorc3RhdGljIElOVCBhYWNEZWNvZGVyX0ZyZWVNZW1DYWxsYmFjayh2b2lkICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzY1N0cnVjdCkgeworICBUUkFOU1BPUlRERUNfRVJST1IgZXJyVHAgPSBUUkFOU1BPUlRERUNfT0s7CisgIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgPSAoSEFORExFX0FBQ0RFQ09ERVIpaGFuZGxlOwogCisgIGNvbnN0IGludCBzdWJTdHJlYW1JbmRleCA9IDA7CiAKLUxJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUgotYWFjRGVjb2Rlcl9BbmNEYXRhSW5pdCAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSApCi17CisgIEZES19BU1NFUlQoc2VsZiAhPSBOVUxMKTsKKworICBpZiAoQ0FhY0RlY29kZXJfRnJlZU1lbShzZWxmLCBzdWJTdHJlYW1JbmRleCkgIT0gQUFDX0RFQ19PSykgeworICAgIGVyclRwID0gVFJBTlNQT1JUREVDX1VOS09XTl9FUlJPUjsKKyAgfQorCisgIC8qIGZyZWUgUmFtX1NickRlY29kZXIgYW5kIFJhbV9TYnJEZWNDaGFubmVsICovCisgIGlmIChzZWxmLT5oU2JyRGVjb2RlciAhPSBOVUxMKSB7CisgICAgaWYgKHNickRlY29kZXJfRnJlZU1lbSgmc2VsZi0+aFNickRlY29kZXIpICE9IFNCUkRFQ19PSykgeworICAgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICAgIH0KKyAgfQorCisgIC8qIGZyZWUgcFNwYXRpYWxEZWMgYW5kIG1wc0RhdGEgKi8KKyAgaWYgKHNlbGYtPnBNcGVnU3Vycm91bmREZWNvZGVyICE9IE5VTEwpIHsKKyAgICBpZiAobXBlZ1N1cnJvdW5kRGVjb2Rlcl9GcmVlTWVtKAorICAgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIpICE9IE1QU19PSykgeworICAgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICAgIH0KKyAgfQorCisgIC8qIGZyZWUgcGVyc2lzdGVudCBxbWYgZG9tYWluIGJ1ZmZlciwgUW1mV29ya0J1ZmZlckNvcmUzLCBRbWZXb3JrQnVmZmVyQ29yZTQsCisgICAqIFFtZldvcmtCdWZmZXJDb3JlNSBhbmQgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgKi8KKyAgRkRLX1FtZkRvbWFpbl9GcmVlTWVtKCZzZWxmLT5xbWZEb21haW4pOworCisgIHJldHVybiBlcnJUcDsKK30KKworc3RhdGljIElOVCBhYWNEZWNvZGVyX0N0cmxDRkdDaGFuZ2VDYWxsYmFjaygKKyAgICB2b2lkICpoYW5kbGUsIGNvbnN0IENDdHJsQ0ZHQ2hhbmdlICpwQ3RybENGR0NoYW5nZVN0cnVjdCkgeworICBUUkFOU1BPUlRERUNfRVJST1IgZXJyVHAgPSBUUkFOU1BPUlRERUNfT0s7CisgIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgPSAoSEFORExFX0FBQ0RFQ09ERVIpaGFuZGxlOworCisgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICBDQWFjRGVjb2Rlcl9DdHJsQ0ZHQ2hhbmdlKAorICAgICAgICBzZWxmLCBwQ3RybENGR0NoYW5nZVN0cnVjdC0+Zmx1c2hTdGF0dXMsIHBDdHJsQ0ZHQ2hhbmdlU3RydWN0LT5mbHVzaENudCwKKyAgICAgICAgcEN0cmxDRkdDaGFuZ2VTdHJ1Y3QtPmJ1aWxkVXBTdGF0dXMsIHBDdHJsQ0ZHQ2hhbmdlU3RydWN0LT5idWlsZFVwQ250KTsKKyAgfSBlbHNlIHsKKyAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19VTktPV05fRVJST1I7CisgIH0KKworICByZXR1cm4gZXJyVHA7Cit9CisKK3N0YXRpYyBJTlQgYWFjRGVjb2Rlcl9Tc2NDYWxsYmFjayh2b2lkICpoYW5kbGUsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjb25maWdCeXRlcywgY29uc3QgVUNIQVIgY29uZmlnTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqY29uZmlnQ2hhbmdlZCkgeworICBTQUNERUNfRVJST1IgZXJyOworICBUUkFOU1BPUlRERUNfRVJST1IgZXJyVHA7CisgIEhBTkRMRV9BQUNERUNPREVSIGhBYWNEZWNvZGVyID0gKEhBTkRMRV9BQUNERUNPREVSKWhhbmRsZTsKKworICBlcnIgPSBtcGVnU3Vycm91bmREZWNvZGVyX0NvbmZpZygKKyAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKWhBYWNEZWNvZGVyLT5wTXBlZ1N1cnJvdW5kRGVjb2RlciwgaEJzLCBjb3JlQ29kZWMsCisgICAgICBzYW1wbGluZ1JhdGUsIHN0ZXJlb0NvbmZpZ0luZGV4LCBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCwgY29uZmlnQnl0ZXMsCisgICAgICBjb25maWdNb2RlLCBjb25maWdDaGFuZ2VkKTsKKworICBzd2l0Y2ggKGVycikgeworICAgIGNhc2UgTVBTX1VOU1VQUE9SVEVEX0NPTkZJRzoKKyAgICAgIC8qIE1QUyBmb3VuZCBidXQgaW52YWxpZCBvciBub3QgZGVjb2RhYmxlIGJ5IHRoaXMgaW5zdGFuY2UgICAgICAgICAgICAqLworICAgICAgLyogV2Ugc3dpdGNoIG9mZiBNUFMgYW5kIGtlZXAgZ29pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBoQWFjRGVjb2Rlci0+bXBzRW5hYmxlQ3VyciA9IDA7CisgICAgICBoQWFjRGVjb2Rlci0+bXBzQXBwbGljYWJsZSA9IDA7CisgICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19PSzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVBTX1BBUlNFX0VSUk9SOgorICAgICAgLyogTVBTIGZvdW5kIGJ1dCBpbnZhbGlkIG9yIG5vdCBkZWNvZGFibGUgYnkgdGhpcyBpbnN0YW5jZSAgICAgICAgICAgICovCisgICAgICBoQWFjRGVjb2Rlci0+bXBzRW5hYmxlQ3VyciA9IDA7CisgICAgICBoQWFjRGVjb2Rlci0+bXBzQXBwbGljYWJsZSA9IDA7CisgICAgICBpZiAoKGNvcmVDb2RlYyA9PSBBT1RfVVNBQykgfHwgKGNvcmVDb2RlYyA9PSBBT1RfRFJNX1VTQUMpIHx8CisgICAgICAgICAgSVNfTE9XREVMQVkoY29yZUNvZGVjKSkgeworICAgICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVyclRwID0gVFJBTlNQT1JUREVDX09LOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNUFNfT0s6CisgICAgICBoQWFjRGVjb2Rlci0+bXBzQXBwbGljYWJsZSA9IDE7CisgICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19PSzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBlc3BlY2lhbGx5IFBhcnNpbmcgZXJyb3IgaXMgY3JpdGljYWwgZm9yIHRyYW5zcG9ydCBsYXllciAgICAgICAgICAqLworICAgICAgaEFhY0RlY29kZXItPm1wc0FwcGxpY2FibGUgPSAwOworICAgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICB9CisKKyAgcmV0dXJuIChJTlQpZXJyVHA7Cit9CisKK3N0YXRpYyBJTlQgYWFjRGVjb2Rlcl9VbmlEcmNDYWxsYmFjayh2b2lkICpoYW5kbGUsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZnVsbFBheWxvYWRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHBheWxvYWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdWJTdHJlYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgcGF5bG9hZFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGFvdCkgeworICBEUkNfREVDX0VSUk9SIGVyciA9IERSQ19ERUNfT0s7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnJUcDsKKyAgSEFORExFX0FBQ0RFQ09ERVIgaEFhY0RlY29kZXIgPSAoSEFORExFX0FBQ0RFQ09ERVIpaGFuZGxlOworICBEUkNfREVDX0NPREVDX01PREUgZHJjRGVjQ29kZWNNb2RlID0gRFJDX0RFQ19DT0RFQ19NT0RFX1VOREVGSU5FRDsKKworICBpZiAoc3ViU3RyZWFtSW5kZXggIT0gMCkgeworICAgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7CisgIH0KKworICBlbHNlIGlmIChhb3QgPT0gQU9UX1VTQUMpIHsKKyAgICBkcmNEZWNDb2RlY01vZGUgPSBEUkNfREVDX01QRUdfRF9VU0FDOworICB9CisKKyAgZXJyID0gRkRLX2RyY0RlY19TZXRDb2RlY01vZGUoaEFhY0RlY29kZXItPmhVbmlEcmNEZWNvZGVyLCBkcmNEZWNDb2RlY01vZGUpOworICBpZiAoZXJyKSByZXR1cm4gKElOVClUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworCisgIGlmIChwYXlsb2FkVHlwZSA9PSAwKSAvKiB1bmlEcmNDb25maWcgKi8KKyAgeworICAgIGVyciA9IEZES19kcmNEZWNfUmVhZFVuaURyY0NvbmZpZyhoQWFjRGVjb2Rlci0+aFVuaURyY0RlY29kZXIsIGhCcyk7CisgIH0gZWxzZSAvKiBsb3VkbmVzc0luZm9TZXQgKi8KKyAgeworICAgIGVyciA9IEZES19kcmNEZWNfUmVhZExvdWRuZXNzSW5mb1NldChoQWFjRGVjb2Rlci0+aFVuaURyY0RlY29kZXIsIGhCcyk7CisgICAgaEFhY0RlY29kZXItPmxvdWRuZXNzSW5mb1NldFBvc2l0aW9uWzFdID0gcGF5bG9hZFN0YXJ0OworICAgIGhBYWNEZWNvZGVyLT5sb3VkbmVzc0luZm9TZXRQb3NpdGlvblsyXSA9IGZ1bGxQYXlsb2FkTGVuZ3RoOworICB9CisKKyAgaWYgKGVyciA9PSBEUkNfREVDX09LKQorICAgIGVyclRwID0gVFJBTlNQT1JUREVDX09LOworICBlbHNlCisgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworCisgIHJldHVybiAoSU5UKWVyclRwOworfQorCitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9BbmNEYXRhSW5pdChIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmJ1ZmZlciwgaW50IHNpemUpIHsKICAgQ0FuY0RhdGEgKmFuY0RhdGEgPSAmc2VsZi0+YW5jRGF0YTsKIAogICByZXR1cm4gQ0FhY0RlY29kZXJfQW5jRGF0YUluaXQoYW5jRGF0YSwgYnVmZmVyLCBzaXplKTsKIH0KIAotCi1MSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IKLWFhY0RlY29kZXJfQW5jRGF0YUdldCAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKipwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgKnNpemUgKQoteworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfQW5jRGF0YUdldChIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIFVDSEFSICoqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNpemUpIHsKICAgQ0FuY0RhdGEgKmFuY0RhdGEgPSAmc2VsZi0+YW5jRGF0YTsKIAogICByZXR1cm4gQ0FhY0RlY29kZXJfQW5jRGF0YUdldChhbmNEYXRhLCBpbmRleCwgcHRyLCBzaXplKTsKIH0KIAorLyogSWYgTVBTIGlzIHByZXNlbnQgaW4gc3RyZWFtLCBidXQgbm90IHN1cHBvcnRlZCBieSB0aGlzIGluc3RhbmNlLCB3ZSdsbAorICAgaGF2ZSB0byBzd2l0Y2ggb2ZmIE1QUyBhbmQgdXNlIFFNRiBzeW50aGVzaXMgaW4gdGhlIFNCUiBtb2R1bGUgaWYgcmVxdWlyZWQgKi8KK3N0YXRpYyBpbnQgaXNTdXBwb3J0ZWRNcHNDb25maWcoQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtSW5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZNcHNQcmVzZW50KSB7CisgIExJQl9JTkZPIGxpYkluZm9bRkRLX01PRFVMRV9MQVNUXTsKKyAgVUlOVCBtcHNDYXBzOworICBpbnQgaXNTdXBwb3J0ZWRDZmcgPSAxOwogCi1zdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IKLXNldENvbmNlYWxNZXRob2QgKCBjb25zdCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwgICAvKiE8IEhhbmRsZSBvZiB0aGUgZGVjb2RlciBpbnN0YW5jZSAqLwotICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICBtZXRob2QgKQoteworICBGREtpbml0TGliSW5mbyhsaWJJbmZvKTsKKworICBtcGVnU3Vycm91bmREZWNvZGVyX0dldExpYkluZm8obGliSW5mbyk7CisKKyAgbXBzQ2FwcyA9IEZES2xpYkluZm9fZ2V0Q2FwYWJpbGl0aWVzKGxpYkluZm8sIEZES19NUFNERUMpOworCisgIGlmICghKG1wc0NhcHMgJiBDQVBGX01QU19MRCkgJiYgSVNfTE9XREVMQVkoYW90KSkgeworICAgIC8qIFdlIGdvdCBhbiBMRCBBT1QgYnV0IE1QUyBkZWNvZGVyIGRvZXMgbm90IHN1cHBvcnQgTEQuICovCisgICAgaXNTdXBwb3J0ZWRDZmcgPSAwOworICB9CisgIGlmICgobXBzQ2FwcyAmIENBUEZfTVBTX0xEKSAmJiBJU19MT1dERUxBWShhb3QpICYmICFmTXBzUHJlc2VudCkgeworICAgIC8qIFdlIGdvdCBhbiBMRCBBT1QgYW5kIHRoZSBNUFMgZGVjb2RlciBzdXBwb3J0cyBpdC4KKyAgICAgKiBCdXQgTEQtTVBTIGlzIG5vdCBleHBsaWNpdGx5IHNpZ25hbGVkLiAqLworICAgIGlzU3VwcG9ydGVkQ2ZnID0gMDsKKyAgfQorICBpZiAoIShtcHNDYXBzICYgQ0FQRl9NUFNfVVNBQykgJiYgSVNfVVNBQyhhb3QpKSB7CisgICAgLyogV2UgZ290IGFuIFVTQUMgQU9UIGJ1dCBNUFMgZGVjb2RlciBkb2VzIG5vdCBzdXBwb3J0IFVTQUMuICovCisgICAgaXNTdXBwb3J0ZWRDZmcgPSAwOworICB9CisgIGlmICghKG1wc0NhcHMgJiBDQVBGX01QU19TVEQpICYmICFJU19MT1dERUxBWShhb3QpICYmICFJU19VU0FDKGFvdCkpIHsKKyAgICAvKiBXZSBnb3QgYW4gR0EgQU9UIGJ1dCBNUFMgZGVjb2RlciBkb2VzIG5vdCBzdXBwb3J0IGl0LiAqLworICAgIGlzU3VwcG9ydGVkQ2ZnID0gMDsKKyAgfQorICAvKiBDaGVjayB3aGV0aGVyIHRoZSBNUFMgbW9kdWwgc3VwcG9ydHMgdGhlIGdpdmVuIG51bWJlciBvZiBpbnB1dCBjaGFubmVsczogKi8KKyAgc3dpdGNoIChudW1JbkNoYW5uZWxzKSB7CisgICAgY2FzZSAxOgorICAgICAgaWYgKCEobXBzQ2FwcyAmIENBUEZfTVBTXzFDSF9JTikpIHsKKyAgICAgICAgLyogV2UgZ290IGEgb25lIGNoYW5uZWwgaW5wdXQgdG8gTVBTIGRlY29kZXIgYnV0IGl0IGRvZXMgbm90IHN1cHBvcnQgaXQuCisgICAgICAgICAqLworICAgICAgICBpc1N1cHBvcnRlZENmZyA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBpZiAoIShtcHNDYXBzICYgQ0FQRl9NUFNfMkNIX0lOKSkgeworICAgICAgICAvKiBXZSBnb3QgYSB0d28gY2hhbm5lbCBpbnB1dCB0byBNUFMgZGVjb2RlciBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydCBpdC4KKyAgICAgICAgICovCisgICAgICAgIGlzU3VwcG9ydGVkQ2ZnID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICBjYXNlIDY6CisgICAgICBpZiAoIShtcHNDYXBzICYgQ0FQRl9NUFNfNkNIX0lOKSkgeworICAgICAgICAvKiBXZSBnb3QgYSBzaXggY2hhbm5lbCBpbnB1dCB0byBNUFMgZGVjb2RlciBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydCBpdC4KKyAgICAgICAgICovCisgICAgICAgIGlzU3VwcG9ydGVkQ2ZnID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpc1N1cHBvcnRlZENmZyA9IDA7CisgIH0KKworICByZXR1cm4gKGlzU3VwcG9ydGVkQ2ZnKTsKK30KKworc3RhdGljIEFBQ19ERUNPREVSX0VSUk9SIHNldENvbmNlYWxNZXRob2QoCisgICAgY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwgLyohPCBIYW5kbGUgb2YgdGhlIGRlY29kZXIgaW5zdGFuY2UgKi8KKyAgICBjb25zdCBJTlQgbWV0aG9kKSB7CiAgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKLSAgQ0NvbmNlYWxQYXJhbXMgICpwQ29uY2VhbERhdGEgPSBOVUxMOworICBDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxEYXRhID0gTlVMTDsKKyAgaW50IG1ldGhvZF9yZXZlcnQgPSAwOwogICBIQU5ETEVfU0JSREVDT0RFUiBoU2JyRGVjID0gTlVMTDsKICAgSEFORExFX0FBQ19EUkMgaERyY0luZm8gPSBOVUxMOwogICBIQU5ETEVfUENNX0RPV05NSVggaFBjbURteCA9IE5VTEw7CkBAIC0yNzcsMjUgKzU1MywzMyBAQAogICAgIGhTYnJEZWMgPSBzZWxmLT5oU2JyRGVjb2RlcjsKICAgICBoRHJjSW5mbyA9IHNlbGYtPmhEcmNJbmZvOwogICAgIGhQY21EbXggPSBzZWxmLT5oUGNtVXRpbHM7CisgICAgaWYgKHNlbGYtPmZsYWdzWzBdICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkgJiYgbWV0aG9kID49IDIpIHsKKyAgICAgIC8qIEludGVycG9sYXRpb24gY29uY2VhbG1lbnQgaXMgbm90IGltcGxlbWVudGVkIGZvciBVU0FDL1JTVkQ1MCAqLworICAgICAgLyogZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgICAgZ290byBiYWlsOyAqLworICAgICAgbWV0aG9kX3JldmVydCA9IDE7CisgICAgfQorICAgIGlmIChzZWxmLT5mbGFnc1swXSAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpICYmIG1ldGhvZCA+PSAyKSB7CisgICAgICAvKiBJbnRlcnBvbGF0aW9uIGNvbmNlYWxtZW50IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgVVNBQy9SU1ZENTAgKi8KKyAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CiAgIH0KIAotCiAgIC8qIEdldCBjdXJyZW50IG1ldGhvZC9kZWxheSAqLwogICBiYWNrdXBNZXRob2QgPSBDQ29uY2VhbG1lbnRfR2V0TWV0aG9kKHBDb25jZWFsRGF0YSk7Ci0gIGJhY2t1cERlbGF5ICA9IENDb25jZWFsbWVudF9HZXREZWxheShwQ29uY2VhbERhdGEpOworICBiYWNrdXBEZWxheSA9IENDb25jZWFsbWVudF9HZXREZWxheShwQ29uY2VhbERhdGEpOwogCiAgIC8qIEJlIHN1cmUgdG8gc2V0IEFBQyBhbmQgU0JSIGNvbmNlYWxtZW50IG1ldGhvZCBzaW11bHRhbmVvdXNseSEgKi8KLSAgZXJyb3JTdGF0dXMgPQotICAgIENDb25jZWFsbWVudF9TZXRQYXJhbXMoCisgIGVycm9yU3RhdHVzID0gQ0NvbmNlYWxtZW50X1NldFBhcmFtcygKICAgICAgIHBDb25jZWFsRGF0YSwKLSAgICAgIChpbnQpbWV0aG9kLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jZWFsTWV0aG9kCi0gICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELCAgLy8gY29uY2VhbEZhZGVPdXRTbG9wZQotICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwgIC8vIGNvbmNlYWxGYWRlSW5TbG9wZQotICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwgIC8vIGNvbmNlYWxNdXRlUmVsZWFzZQotICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCAgIC8vIGNvbmNlYWxDb21mTm9pc2VMZXZlbAotICAgICk7Ci0gIGlmICggKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spCi0gICAgJiYgKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEUpICkgeworICAgICAgKG1ldGhvZF9yZXZlcnQgPT0gMCkgPyAoaW50KW1ldGhvZCA6IChpbnQpMSwgIC8vIGNvbmNlYWxNZXRob2QKKyAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsICAgICAgICAgICAvLyBjb25jZWFsRmFkZU91dFNsb3BlCisgICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELCAgICAgICAgICAgLy8gY29uY2VhbEZhZGVJblNsb3BlCisgICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELCAgICAgICAgICAgLy8gY29uY2VhbE11dGVSZWxlYXNlCisgICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVEICAgICAgICAgICAgLy8gY29uY2VhbENvbWZOb2lzZUxldmVsCisgICk7CisgIGlmICgoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykgJiYgKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEUpKSB7CiAgICAgZ290byBiYWlsOwogICB9CiAKQEAgLTMwNiwzNTAgKzU5MCwzNDIgQEAKICAgICBTQlJfRVJST1Igc2JyRXJyID0gU0JSREVDX09LOwogCiAgICAgLyogc2V0IFNCUiBiaXRzdHJlYW0gZGVsYXkgKi8KLSAgICBzYnJFcnIgPSBzYnJEZWNvZGVyX1NldFBhcmFtICgKLSAgICAgIGhTYnJEZWMsCi0gICAgICBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWSwKLSAgICAgIGJzRGVsYXkKLSAgICApOworICAgIHNickVyciA9IHNickRlY29kZXJfU2V0UGFyYW0oaFNickRlYywgU0JSX1NZU1RFTV9CSVRTVFJFQU1fREVMQVksIGJzRGVsYXkpOwogCiAgICAgc3dpdGNoIChzYnJFcnIpIHsKLSAgICBjYXNlIFNCUkRFQ19PSzoKLSAgICBjYXNlIFNCUkRFQ19OT1RfSU5JVElBTElaRUQ6Ci0gICAgICBpZiAoc2VsZiAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIHNhdmUgdGhlIHBhcmFtIHZhbHVlIGFuZCBzZXQgbGF0ZXIKLSAgICAgICAgICAgKHdoZW4gU0JSIGhhcyBiZWVuIGluaXRpYWxpemVkKSAqLwotICAgICAgICBzZWxmLT5zYnJQYXJhbXMuYnNEZWxheSA9IGJzRGVsYXk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgICAgZ290byBiYWlsOworICAgICAgY2FzZSBTQlJERUNfT0s6CisgICAgICBjYXNlIFNCUkRFQ19OT1RfSU5JVElBTElaRUQ6CisgICAgICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgICAvKiBzYXZlIHRoZSBwYXJhbSB2YWx1ZSBhbmQgc2V0IGxhdGVyCisgICAgICAgICAgICAgKHdoZW4gU0JSIGhhcyBiZWVuIGluaXRpYWxpemVkKSAqLworICAgICAgICAgIHNlbGYtPnNiclBhcmFtcy5ic0RlbGF5ID0gYnNEZWxheTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgICAgZ290byBiYWlsOwogICAgIH0KICAgfQogCi0gIGVycm9yU3RhdHVzID0KLSAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKLSAgICAgIGhEcmNJbmZvLAotICAgICAgRFJDX0JTX0RFTEFZLAotICAgICAgYnNEZWxheQotICAgICk7Ci0gIGlmICggKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spCi0gICAgJiYgKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEUpICkgeworICBlcnJvclN0YXR1cyA9IGFhY0RlY29kZXJfZHJjU2V0UGFyYW0oaERyY0luZm8sIERSQ19CU19ERUxBWSwgYnNEZWxheSk7CisgIGlmICgoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykgJiYgKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEUpKSB7CiAgICAgZ290byBiYWlsOwogICB9CiAKICAgaWYgKGVycm9yU3RhdHVzID09IEFBQ19ERUNfT0spIHsKLSAgICBQQ01ETVhfRVJST1IgZXJyID0KLSAgICAgIHBjbURteF9TZXRQYXJhbSAoCi0gICAgICAgIGhQY21EbXgsCi0gICAgICAgIERNWF9CU19EQVRBX0RFTEFZLAotICAgICAgICBic0RlbGF5Ci0gICAgICApOworICAgIFBDTURNWF9FUlJPUiBlcnIgPSBwY21EbXhfU2V0UGFyYW0oaFBjbURteCwgRE1YX0JTX0RBVEFfREVMQVksIGJzRGVsYXkpOwogICAgIHN3aXRjaCAoZXJyKSB7Ci0gICAgY2FzZSBQQ01ETVhfSU5WQUxJRF9IQU5ETEU6Ci0gICAgICBlcnJvclN0YXR1cyA9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgY2FzZSBQQ01ETVhfT0s6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgICAgZ290byBiYWlsOworICAgICAgY2FzZSBQQ01ETVhfSU5WQUxJRF9IQU5ETEU6CisgICAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIGNhc2UgUENNRE1YX09LOgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgICAgZ290byBiYWlsOwogICAgIH0KICAgfQogCi0KIGJhaWw6Ci0gIGlmICggKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spCi0gICAgJiYgKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEUpICkKLSAgeworICBpZiAoKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spICYmIChlcnJvclN0YXR1cyAhPSBBQUNfREVDX0lOVkFMSURfSEFORExFKSkgewogICAgIC8qIFJldmVydCB0byB0aGUgaW5pdGlhbCBzdGF0ZSAqLwotICAgIENDb25jZWFsbWVudF9TZXRQYXJhbXMgKAotICAgICAgICBwQ29uY2VhbERhdGEsCi0gICAgICAgIChpbnQpYmFja3VwTWV0aG9kLAotICAgICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELAotICAgICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELAotICAgICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELAotICAgICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVECi0gICAgICApOworICAgIENDb25jZWFsbWVudF9TZXRQYXJhbXMoCisgICAgICAgIHBDb25jZWFsRGF0YSwgKGludCliYWNrdXBNZXRob2QsIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsCisgICAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsCisgICAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQpOwogICAgIC8qIFJldmVydCBTQlIgYml0c3RyZWFtIGRlbGF5ICovCi0gICAgc2JyRGVjb2Rlcl9TZXRQYXJhbSAoCi0gICAgICAgIGhTYnJEZWMsCi0gICAgICAgIFNCUl9TWVNURU1fQklUU1RSRUFNX0RFTEFZLAotICAgICAgICBiYWNrdXBEZWxheQotICAgICAgKTsKKyAgICBzYnJEZWNvZGVyX1NldFBhcmFtKGhTYnJEZWMsIFNCUl9TWVNURU1fQklUU1RSRUFNX0RFTEFZLCBiYWNrdXBEZWxheSk7CiAgICAgLyogUmV2ZXJ0IERSQyBiaXRzdHJlYW0gZGVsYXkgKi8KLSAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKLSAgICAgICAgaERyY0luZm8sCi0gICAgICAgIERSQ19CU19ERUxBWSwKLSAgICAgICAgYmFja3VwRGVsYXkKLSAgICAgICk7CisgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbShoRHJjSW5mbywgRFJDX0JTX0RFTEFZLCBiYWNrdXBEZWxheSk7CiAgICAgLyogUmV2ZXJ0IFBDTSBtaXhkb3duIGJpdHN0cmVhbSBkZWxheSAqLwotICAgIHBjbURteF9TZXRQYXJhbSAoCi0gICAgICAgIGhQY21EbXgsCi0gICAgICAgIERNWF9CU19EQVRBX0RFTEFZLAotICAgICAgICBiYWNrdXBEZWxheQotICAgICAgKTsKKyAgICBwY21EbXhfU2V0UGFyYW0oaFBjbURteCwgRE1YX0JTX0RBVEFfREVMQVksIGJhY2t1cERlbGF5KTsKICAgfQogCiAgIHJldHVybiBlcnJvclN0YXR1czsKIH0KIAotCi1MSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IKLWFhY0RlY29kZXJfU2V0UGFyYW0gKCBjb25zdCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwgICAvKiE8IEhhbmRsZSBvZiB0aGUgZGVjb2RlciBpbnN0YW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBQ0RFQ19QQVJBTSAgICAgICBwYXJhbSwgIC8qITwgUGFyYW1ldGVyIHRvIHNldCAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIHZhbHVlKSAgLyohPCBQYXJhbWV0ZXIgdmFsdWVkICAgICAgICAgICAgICAgKi8KK0xJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX1NldFBhcmFtKAorICAgIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIHNlbGYsIC8qITwgSGFuZGxlIG9mIHRoZSBkZWNvZGVyIGluc3RhbmNlICovCisgICAgY29uc3QgQUFDREVDX1BBUkFNIHBhcmFtLCAgICAgLyohPCBQYXJhbWV0ZXIgdG8gc2V0ICAgICAgICAgICAgICAgKi8KKyAgICBjb25zdCBJTlQgdmFsdWUpICAgICAgICAgICAgICAvKiE8IFBhcmFtZXRlciB2YWx1ZWQgICAgICAgICAgICAgICAqLwogewogICBBQUNfREVDT0RFUl9FUlJPUiBlcnJvclN0YXR1cyA9IEFBQ19ERUNfT0s7Ci0gIENDb25jZWFsUGFyYW1zICAqcENvbmNlYWxEYXRhID0gTlVMTDsKKyAgSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMgPSBOVUxMOworICBUUkFOU1BPUlRERUNfRVJST1IgZXJyVHAgPSBUUkFOU1BPUlRERUNfT0s7CiAgIEhBTkRMRV9BQUNfRFJDIGhEcmNJbmZvID0gTlVMTDsKICAgSEFORExFX1BDTV9ET1dOTUlYIGhQY21EbXggPSBOVUxMOworICBQQ01ETVhfRVJST1IgZG14RXJyID0gUENNRE1YX09LOwogICBURExpbWl0ZXJQdHIgaFBjbVRkbCA9IE5VTEw7CisgIERSQ19ERUNfRVJST1IgdW5pRHJjRXJyID0gRFJDX0RFQ19PSzsKIAogICAvKiBjaGVjayBkZWNvZGVyIGhhbmRsZSAqLwogICBpZiAoc2VsZiAhPSBOVUxMKSB7Ci0gICAgcENvbmNlYWxEYXRhID0gJnNlbGYtPmNvbmNlYWxDb21tb25EYXRhOworICAgIGhUcERlYyA9IHNlbGYtPmhJbnB1dDsKICAgICBoRHJjSW5mbyA9IHNlbGYtPmhEcmNJbmZvOwogICAgIGhQY21EbXggPSBzZWxmLT5oUGNtVXRpbHM7CiAgICAgaFBjbVRkbCA9IHNlbGYtPmhMaW1pdGVyOwogICB9IGVsc2UgewogICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICBnb3RvIGJhaWw7CiAgIH0KIAogICAvKiBjb25maWd1cmUgdGhlIHN1YnN5c3RlbXMgKi8KLSAgc3dpdGNoIChwYXJhbSkKLSAgewotICBjYXNlIEFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEOgotICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICB9Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotICAgIHNlbGYtPm91dHB1dEludGVybGVhdmVkID0gdmFsdWU7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBBQUNfUENNX01JTl9PVVRQVVRfQ0hBTk5FTFM6Ci0gICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiAoOCkpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgIH0KLSAgICB7Ci0gICAgICBQQ01ETVhfRVJST1IgZXJyOwotCi0gICAgICBlcnIgPSBwY21EbXhfU2V0UGFyYW0gKAotICAgICAgICAgICAgICBoUGNtRG14LAotICAgICAgICAgICAgICBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUywKLSAgICAgICAgICAgICAgdmFsdWUgKTsKLQotICAgICAgc3dpdGNoIChlcnIpIHsKLSAgICAgIGNhc2UgUENNRE1YX09LOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUENNRE1YX0lOVkFMSURfSEFORExFOgotICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICAgIGRlZmF1bHQ6CisgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIEFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUzoKKyAgICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gKDgpKSB7CiAgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUzoKLSAgICBpZiAodmFsdWUgPCAtMSB8fCB2YWx1ZSA+ICg4KSkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgfQotICAgIHsKLSAgICAgIFBDTURNWF9FUlJPUiBlcnI7Ci0KLSAgICAgIGVyciA9IHBjbURteF9TZXRQYXJhbSAoCi0gICAgICAgICAgICAgIGhQY21EbXgsCi0gICAgICAgICAgICAgIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLAotICAgICAgICAgICAgICB2YWx1ZSApOwotCi0gICAgICBzd2l0Y2ggKGVycikgewotICAgICAgY2FzZSBQQ01ETVhfT0s6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQQ01ETVhfSU5WQUxJRF9IQU5ETEU6Ci0gICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQUFDX1BDTV9EVUFMX0NIQU5ORUxfT1VUUFVUX01PREU6Ci0gICAgewotICAgICAgUENNRE1YX0VSUk9SIGVycjsKLQotICAgICAgZXJyID0gcGNtRG14X1NldFBhcmFtICgKLSAgICAgICAgICAgICAgaFBjbURteCwKLSAgICAgICAgICAgICAgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFLAotICAgICAgICAgICAgICB2YWx1ZSApOwotCi0gICAgICBzd2l0Y2ggKGVycikgewotICAgICAgY2FzZSBQQ01ETVhfT0s6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQQ01ETVhfSU5WQUxJRF9IQU5ETEU6Ci0gICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotCi0KLSAgY2FzZSBBQUNfUENNX0xJTUlURVJfRU5BQkxFOgotICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gMSkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgfQotICAgIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICBzZWxmLT5saW1pdGVyRW5hYmxlVXNlciA9IHZhbHVlOwotICAgIGJyZWFrOwotCi0gIGNhc2UgQUFDX1BDTV9MSU1JVEVSX0FUVEFDS19USU1FOgotICAgIGlmICh2YWx1ZSA8PSAwKSB7ICAvKiBtb2R1bGUgZnVuY3Rpb24gY29udmVydHMgdmFsdWUgdG8gdW5zaWduZWQgKi8KLSAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgIH0KLSAgICBzd2l0Y2ggKHNldExpbWl0ZXJBdHRhY2soaFBjbVRkbCwgdmFsdWUpKSB7Ci0gICAgY2FzZSBURExJTUlUX09LOgorICAgICAgZG14RXJyID0gcGNtRG14X1NldFBhcmFtKGhQY21EbXgsIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLCB2YWx1ZSk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9IQU5ETEU6Ci0gICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI6CisKKyAgICBjYXNlIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUzoKKyAgICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gKDgpKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgZG14RXJyID0gcGNtRG14X1NldFBhcmFtKGhQY21EbXgsIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLCB2YWx1ZSk7CisKKyAgICAgIGlmIChkbXhFcnIgIT0gUENNRE1YX09LKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGVycm9yU3RhdHVzID0KKyAgICAgICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtKGhEcmNJbmZvLCBNQVhfT1VUUFVUX0NIQU5ORUxTLCB2YWx1ZSk7CisgICAgICBpZiAodmFsdWUgPiAwKSB7CisgICAgICAgIHVuaURyY0VyciA9IEZES19kcmNEZWNfU2V0UGFyYW0oc2VsZi0+aFVuaURyY0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJDX0RFQ19UQVJHRVRfQ0hBTk5FTF9DT1VOVF9SRVFVRVNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBQUNfUENNX0RVQUxfQ0hBTk5FTF9PVVRQVVRfTU9ERToKKyAgICAgIGRteEVyciA9IHBjbURteF9TZXRQYXJhbShoUGNtRG14LCBETVhfRFVBTF9DSEFOTkVMX01PREUsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBQUNfUENNX0xJTUlURVJfRU5BQkxFOgorICAgICAgaWYgKHZhbHVlIDwgLTIgfHwgdmFsdWUgPiAxKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgc2VsZi0+bGltaXRlckVuYWJsZVVzZXIgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBQUNfUENNX0xJTUlURVJfQVRUQUNLX1RJTUU6CisgICAgICBpZiAodmFsdWUgPD0gMCkgeyAvKiBtb2R1bGUgZnVuY3Rpb24gY29udmVydHMgdmFsdWUgdG8gdW5zaWduZWQgKi8KKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICB9CisgICAgICBzd2l0Y2ggKHBjbUxpbWl0ZXJfU2V0QXR0YWNrKGhQY21UZGwsIHZhbHVlKSkgeworICAgICAgICBjYXNlIFRETElNSVRfT0s6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVERMSU1JVF9JTlZBTElEX0hBTkRMRToKKyAgICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgY2FzZSBURExJTUlUX0lOVkFMSURfUEFSQU1FVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19QQ01fTElNSVRFUl9SRUxFQVNfVElNRToKKyAgICAgIGlmICh2YWx1ZSA8PSAwKSB7IC8qIG1vZHVsZSBmdW5jdGlvbiBjb252ZXJ0cyB2YWx1ZSB0byB1bnNpZ25lZCAqLworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAocGNtTGltaXRlcl9TZXRSZWxlYXNlKGhQY21UZGwsIHZhbHVlKSkgeworICAgICAgICBjYXNlIFRETElNSVRfT0s6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVERMSU1JVF9JTlZBTElEX0hBTkRMRToKKyAgICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgY2FzZSBURExJTUlUX0lOVkFMSURfUEFSQU1FVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19NRVRBREFUQV9QUk9GSUxFOiB7CisgICAgICBETVhfUFJPRklMRV9UWVBFIGRteFByb2ZpbGU7CisgICAgICBJTlQgbWRFeHBpcnkgPSAtMTsgLyogaW4gbXMgKC0xOiBkb24ndCBjaGFuZ2UpICovCisKKyAgICAgIHN3aXRjaCAoKEFBQ19NRF9QUk9GSUxFKXZhbHVlKSB7CisgICAgICAgIGNhc2UgQUFDX01EX1BST0ZJTEVfTVBFR19TVEFOREFSRDoKKyAgICAgICAgICBkbXhQcm9maWxlID0gRE1YX1BSRkxfU1RBTkRBUkQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFDX01EX1BST0ZJTEVfTVBFR19MRUdBQ1k6CisgICAgICAgICAgZG14UHJvZmlsZSA9IERNWF9QUkZMX01BVFJJWF9NSVg7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFDX01EX1BST0ZJTEVfTVBFR19MRUdBQ1lfUFJJTzoKKyAgICAgICAgICBkbXhQcm9maWxlID0gRE1YX1BSRkxfRk9SQ0VfTUFUUklYX01JWDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQUNfTURfUFJPRklMRV9BUklCX0pBUEFOOgorICAgICAgICAgIGRteFByb2ZpbGUgPSBETVhfUFJGTF9BUklCX0pBUEFOOworICAgICAgICAgIG1kRXhwaXJ5ID0gNTUwOyAvKiBtcyAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgZG14RXJyID0gcGNtRG14X1NldFBhcmFtKGhQY21EbXgsIERNWF9QUk9GSUxFX1NFVFRJTkcsIChJTlQpZG14UHJvZmlsZSk7CisgICAgICBpZiAoZG14RXJyICE9IFBDTURNWF9PSykgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBpZiAoKHNlbGYgIT0gTlVMTCkgJiYgKG1kRXhwaXJ5ID49IDApKSB7CisgICAgICAgIHNlbGYtPm1ldGFkYXRhRXhwaXJ5ID0gbWRFeHBpcnk7CisgICAgICAgIC8qIERldGVybWluZSB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgZnJhbWVzIGFuZCBjb25maWd1cmUgYWxsCisgICAgICAgICAqIHJlbGF0ZWQgbW9kdWxlcy4gKi8KKyAgICAgICAgYWFjRGVjb2Rlcl9zZXRNZXRhZGF0YUV4cGlyeShzZWxmLCBtZEV4cGlyeSk7CisgICAgICB9CisgICAgfSBicmVhazsKKworICAgIGNhc2UgQUFDX01FVEFEQVRBX0VYUElSWV9USU1FOgorICAgICAgaWYgKHZhbHVlIDwgMCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+bWV0YWRhdGFFeHBpcnkgPSB2YWx1ZTsKKyAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBmcmFtZXMgYW5kIGNvbmZpZ3VyZSBhbGwKKyAgICAgICAgICogcmVsYXRlZCBtb2R1bGVzLiAqLworICAgICAgICBhYWNEZWNvZGVyX3NldE1ldGFkYXRhRXhwaXJ5KHNlbGYsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBQUNfUENNX09VVFBVVF9DSEFOTkVMX01BUFBJTkc6CisgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMSkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICAgIC8qIENBVVRJT046IFRoZSBnaXZlbiB2YWx1ZSBtdXN0IGJlIGludmVydGVkIHRvIG1hdGNoIHRoZSBsb2dpYyEgKi8KKyAgICAgIEZES19jaE1hcERlc2NyX3NldFBhc3NUaHJvdWdoKCZzZWxmLT5tYXBEZXNjciwgIXZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBQUNfUU1GX0xPV1BPV0VSOgorICAgICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiAxKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIFNldCBRTUYgbW9kZSAobWlnaHQgYmUgb3ZlcnJpZGVuKQorICAgICAgICogIDA6SFEgKGNvbXBsZXgpCisgICAgICAgKiAgMTpMUCAocGFydGlhbGx5IGNvbXBsZXgpCisgICAgICAgKi8KKyAgICAgIHNlbGYtPnFtZk1vZGVVc2VyID0gKFFNRl9NT0RFKXZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SOgorICAgICAgLyogRFJDIGNvbXByZXNzaW9uIGZhY3RvciAod2hlcmUgMCBpcyBubyBhbmQgMTI3IGlzIG1heCBjb21wcmVzc2lvbikgKi8KKyAgICAgIGVycm9yU3RhdHVzID0gYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbShoRHJjSW5mbywgRFJDX0NVVF9TQ0FMRSwgdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19EUkNfQk9PU1RfRkFDVE9SOgorICAgICAgLyogRFJDIGJvb3N0IGZhY3RvciAod2hlcmUgMCBpcyBubyBhbmQgMTI3IGlzIG1heCBib29zdCkgKi8KKyAgICAgIGVycm9yU3RhdHVzID0gYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbShoRHJjSW5mbywgRFJDX0JPT1NUX1NDQUxFLCB2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUw6CisgICAgICBpZiAoKHZhbHVlID49IDApICYmCisgICAgICAgICAgKCh2YWx1ZSA8IDQwKSB8fCAodmFsdWUgPiAxMjcpKSkgLyogYWxsb3dlZCByYW5nZTogLTEwIHRvIC0zMS43NSBkQiAqLworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIC8qIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIHF1YW50aXplZCBpbiAwLjI1ZEIgc3RlcHMgdXNpbmcgdmFsdWVzCisgICAgICAgICBbNDAuLjEyN10uIE5lZ2F0aXZlIHZhbHVlcyBzd2l0Y2ggb2ZmIGxvdWRuZXNzIG5vcm1hbGlzYXRpb24uIE5lZ2F0aXZlCisgICAgICAgICB2YWx1ZXMgYWxzbyBzd2l0Y2ggb2ZmIE1QRUctNCBEUkMsIHdoaWxlIE1QRUctRCBEUkMgY2FuIGJlIHNlcGFyYXRlbHkKKyAgICAgICAgIHN3aXRjaGVkIG9uL29mZiB3aXRoIEFBQ19VTklEUkNfU0VUX0VGRkVDVCAqLworICAgICAgZXJyb3JTdGF0dXMgPSBhYWNEZWNvZGVyX2RyY1NldFBhcmFtKGhEcmNJbmZvLCBUQVJHRVRfUkVGX0xFVkVMLCB2YWx1ZSk7CisgICAgICB1bmlEcmNFcnIgPSBGREtfZHJjRGVjX1NldFBhcmFtKHNlbGYtPmhVbmlEcmNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUkNfREVDX0xPVURORVNTX05PUk1BTElaQVRJT05fT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkodmFsdWUgPj0gMCkpOworICAgICAgLyogc2V0IHRhcmdldCBsb3VkbmVzcyBhbHNvIGZvciBNUEVHLUQgRFJDICovCisgICAgICBzZWxmLT5kZWZhdWx0VGFyZ2V0TG91ZG5lc3MgPSAoU0NIQVIpdmFsdWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTjoKKyAgICAgIC8qIERvbid0IG5lZWQgdG8gb3ZlcndyaXRlIGN1dC9ib29zdCB2YWx1ZXMgKi8KKyAgICAgIGVycm9yU3RhdHVzID0KKyAgICAgICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtKGhEcmNJbmZvLCBBUFBMWV9IRUFWWV9DT01QUkVTU0lPTiwgdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19EUkNfREVGQVVMVF9QUkVTRU5UQVRJT05fTU9ERToKKyAgICAgIC8qIERSQyBkZWZhdWx0IHByZXNlbnRhdGlvbiBtb2RlICovCisgICAgICBlcnJvclN0YXR1cyA9CisgICAgICAgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbShoRHJjSW5mbywgREVGQVVMVF9QUkVTRU5UQVRJT05fTU9ERSwgdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19EUkNfRU5DX1RBUkdFVF9MRVZFTDoKKyAgICAgIC8qIEVuY29kZXIgdGFyZ2V0IGxldmVsIGZvciBsaWdodCAoaS5lLiBub3QgaGVhdnkpIGNvbXByZXNzaW9uOgorICAgICAgICAgVGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBhc3N1bWVkIGF0IGVuY29kZXIgZm9yIGRlcml2aW5nIGxpbWl0aW5nIGdhaW5zCisgICAgICAgKi8KKyAgICAgIGVycm9yU3RhdHVzID0KKyAgICAgICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtKGhEcmNJbmZvLCBFTkNPREVSX1RBUkdFVF9MRVZFTCwgdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19VTklEUkNfU0VUX0VGRkVDVDoKKyAgICAgIGlmICgodmFsdWUgPCAtMSkgfHwgKHZhbHVlID4gNikpIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgdW5pRHJjRXJyID0gRkRLX2RyY0RlY19TZXRQYXJhbShzZWxmLT5oVW5pRHJjRGVjb2RlciwgRFJDX0RFQ19FRkZFQ1RfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKXZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDX1RQREVDX0NMRUFSX0JVRkZFUjoKKyAgICAgIGVyclRwID0gdHJhbnNwb3J0RGVjX1NldFBhcmFtKGhUcERlYywgVFBERUNfUEFSQU1fUkVTRVQsIDEpOworICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPSAwOworICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1CYWRCeXRlcyA9IDA7CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bVRvdGFsQnl0ZXMgPSAwOworICAgICAgLyogYWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oc2VsZik7ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ19DT05DRUFMX01FVEhPRDoKKyAgICAgIC8qIENoYW5naW5nIHRoZSBjb25jZWFsbWVudCBtZXRob2QgY2FuIGludHJvZHVjZSBhZGRpdGlvbmFsIGJpdHN0cmVhbQorICAgICAgICAgZGVsYXkuIEFuZCB0aGF0IGluIHR1cm4gYWZmZWN0cyBzdWIgbGlicmFyaWVzIGFuZCBtb2R1bGVzIHdoaWNoIG1ha2VzCisgICAgICAgICB0aGUgd2hvbGUgdGhpbmcgcXVpdGUgY29tcGxleC4gIFNvIHRoZSBjb21wbGV0ZSBjaGFuZ2luZyByb3V0aW5lIGlzCisgICAgICAgICBwYWNrZWQgaW50byBhIGhlbHBlciBmdW5jdGlvbiB3aGljaCBrZWVwcyBhbGwgbW9kdWxlcyBhbmQgbGlicyBpbiBhCisgICAgICAgICBjb25zaXN0ZW50IHN0YXRlIGV2ZW4gaW4gdGhlIGNhc2UgYW4gZXJyb3Igb2NjdXJlcy4gKi8KKyAgICAgIGVycm9yU3RhdHVzID0gc2V0Q29uY2VhbE1ldGhvZChzZWxmLCB2YWx1ZSk7CisgICAgICBpZiAoZXJyb3JTdGF0dXMgPT0gQUFDX0RFQ19PSykgeworICAgICAgICBzZWxmLT5jb25jZWFsTWV0aG9kVXNlciA9IChDQ29uY2VhbG1lbnRNZXRob2QpdmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKKwogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICB9Ci0gICAgYnJlYWs7CisgIH0gLyogc3dpdGNoKHBhcmFtKSAqLwogCi0gIGNhc2UgQUFDX1BDTV9MSU1JVEVSX1JFTEVBU19USU1FOgotICAgIGlmICh2YWx1ZSA8PSAwKSB7ICAvKiBtb2R1bGUgZnVuY3Rpb24gY29udmVydHMgdmFsdWUgdG8gdW5zaWduZWQgKi8KLSAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgIH0KLSAgICBzd2l0Y2ggKHNldExpbWl0ZXJSZWxlYXNlKGhQY21UZGwsIHZhbHVlKSkgewotICAgIGNhc2UgVERMSU1JVF9PSzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVERMSU1JVF9JTlZBTElEX0hBTkRMRToKLSAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwotICAgIGNhc2UgVERMSU1JVF9JTlZBTElEX1BBUkFNRVRFUjoKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgfQotICAgIGJyZWFrOworYmFpbDoKIAotICBjYXNlIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORzoKLSAgICBzd2l0Y2ggKHZhbHVlKSB7CisgIGlmIChlcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSB7CisgICAgLyogQ2hlY2sgZXJyb3IgY29kZSByZXR1cm5lZCBieSBETVggbW9kdWxlIGxpYnJhcnk6ICovCisgICAgc3dpdGNoIChkbXhFcnIpIHsKKyAgICAgIGNhc2UgUENNRE1YX09LOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUENNRE1YX0lOVkFMSURfSEFORExFOgorICAgICAgICBlcnJvclN0YXR1cyA9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgIH0KKyAgfQorCisgIGlmIChlcnJUcCAhPSBUUkFOU1BPUlRERUNfT0sgJiYgZXJyb3JTdGF0dXMgPT0gQUFDX0RFQ19PSykgeworICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgfQorCisgIGlmIChlcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSB7CisgICAgLyogQ2hlY2sgZXJyb3IgY29kZSByZXR1cm5lZCBieSBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeTogKi8KKyAgICBzd2l0Y2ggKHVuaURyY0VycikgewogICAgICAgY2FzZSAwOgotICAgICAgICBpZiAoc2VsZiAhPSBOVUxMKSB7Ci0gICAgICAgICAgc2VsZi0+Y2hhbm5lbE91dHB1dE1hcHBpbmcgPSBjaGFubmVsTWFwcGluZ1RhYmxlUGFzc3Rocm91Z2g7Ci0gICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGlmIChzZWxmICE9IE5VTEwpIHsKLSAgICAgICAgICBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZyA9IGNoYW5uZWxNYXBwaW5nVGFibGVXQVY7Ci0gICAgICAgIH0KKyAgICAgIGNhc2UgLTk5OTg6CisgICAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKICAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgogICAgICAgICBlcnJvclN0YXR1cyA9IEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBicmVhazsKLQotCi0gIGNhc2UgQUFDX1FNRl9MT1dQT1dFUjoKLSAgICBpZiAodmFsdWUgPCAtMSB8fCB2YWx1ZSA+IDEpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgIH0KLSAgICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgUU1GIG1vZGUgKG1pZ2h0IGJlIG92ZXJyaWRlbikKLSAgICAgKiAgMDpIUSAoY29tcGxleCkKLSAgICAgKiAgMTpMUCAocGFydGlhbGx5IGNvbXBsZXgpCi0gICAgICovCi0gICAgc2VsZi0+cW1mTW9kZVVzZXIgPSAoUU1GX01PREUpdmFsdWU7Ci0gICAgYnJlYWs7Ci0KLQotICBjYXNlIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SOgotICAgIC8qIERSQyBjb21wcmVzc2lvbiBmYWN0b3IgKHdoZXJlIDAgaXMgbm8gYW5kIDEyNyBpcyBtYXggY29tcHJlc3Npb24pICovCi0gICAgZXJyb3JTdGF0dXMgPQotICAgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCi0gICAgICAgIGhEcmNJbmZvLAotICAgICAgICBEUkNfQ1VUX1NDQUxFLAotICAgICAgICB2YWx1ZQotICAgICAgKTsKLSAgICBicmVhazsKLQotICBjYXNlIEFBQ19EUkNfQk9PU1RfRkFDVE9SOgotICAgIC8qIERSQyBib29zdCBmYWN0b3IgKHdoZXJlIDAgaXMgbm8gYW5kIDEyNyBpcyBtYXggYm9vc3QpICovCi0gICAgZXJyb3JTdGF0dXMgPQotICAgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCi0gICAgICAgIGhEcmNJbmZvLAotICAgICAgICBEUkNfQk9PU1RfU0NBTEUsCi0gICAgICAgIHZhbHVlCi0gICAgICApOwotICAgIGJyZWFrOwotCi0gIGNhc2UgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUw6Ci0gICAgLyogRFJDIHJlZmVyZW5jZSBsZXZlbCBxdWFudGl6ZWQgaW4gMC4yNWRCIHN0ZXBzIHVzaW5nIHZhbHVlcyBbMC4uMTI3XSBpdCBpcyAnLScgZm9yIGFuYWxvZyBzY2FsaW5nICovCi0gICAgZXJyb3JTdGF0dXMgPQotICAgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCi0gICAgICAgIGhEcmNJbmZvLAotICAgICAgICBUQVJHRVRfUkVGX0xFVkVMLAotICAgICAgICB2YWx1ZQotICAgICAgKTsKLSAgICBicmVhazsKLQotICBjYXNlIEFBQ19EUkNfSEVBVllfQ09NUFJFU1NJT046Ci0gICAgLyogRG9uJ3QgbmVlZCB0byBvdmVyd3JpdGUgY3V0L2Jvb3N0IHZhbHVlcyAqLwotICAgIGVycm9yU3RhdHVzID0KLSAgICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAotICAgICAgICBoRHJjSW5mbywKLSAgICAgICAgQVBQTFlfSEVBVllfQ09NUFJFU1NJT04sCi0gICAgICAgIHZhbHVlCi0gICAgICApOwotICAgIGJyZWFrOwotCi0KLSAgY2FzZSBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSOgotICAgIHRyYW5zcG9ydERlY19TZXRQYXJhbShzZWxmLT5oSW5wdXQsIFRQREVDX1BBUkFNX1JFU0VULCAxKTsKLSAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9IDA7Ci0gICAgc2VsZi0+c3RyZWFtSW5mby5udW1CYWRCeXRlcyA9IDA7Ci0gICAgc2VsZi0+c3RyZWFtSW5mby5udW1Ub3RhbEJ5dGVzID0gMDsKLSAgICAvKiBhYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihzZWxmKTsgKi8KLSAgICBicmVhazsKLQotICBjYXNlIEFBQ19DT05DRUFMX01FVEhPRDoKLSAgICAvKiBDaGFuZ2luZyB0aGUgY29uY2VhbG1lbnQgbWV0aG9kIGNhbiBpbnRyb2R1Y2UgYWRkaXRpb25hbCBiaXRzdHJlYW0gZGVsYXkuIEFuZAotICAgICAgIHRoYXQgaW4gdHVybiBhZmZlY3RzIHN1YiBsaWJyYXJpZXMgYW5kIG1vZHVsZXMgd2hpY2ggbWFrZXMgdGhlIHdob2xlIHRoaW5nIHF1aXRlCi0gICAgICAgY29tcGxleC4gIFNvIHRoZSBjb21wbGV0ZSBjaGFuZ2luZyByb3V0aW5lIGlzIHBhY2tlZCBpbnRvIGEgaGVscGVyIGZ1bmN0aW9uIHdoaWNoCi0gICAgICAga2VlcHMgYWxsIG1vZHVsZXMgYW5kIGxpYnMgaW4gYSBjb25zaXN0ZW50IHN0YXRlIGV2ZW4gaW4gdGhlIGNhc2UgYW4gZXJyb3Igb2NjdXJlcy4gKi8KLSAgICBlcnJvclN0YXR1cyA9IHNldENvbmNlYWxNZXRob2QgKCBzZWxmLCB2YWx1ZSApOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gIH0gIC8qIHN3aXRjaChwYXJhbSkgKi8KKyAgfQogCiAgIHJldHVybiAoZXJyb3JTdGF0dXMpOwogfQotCi0KLUxJTktTUEVDX0NQUCBIQU5ETEVfQUFDREVDT0RFUiBhYWNEZWNvZGVyX09wZW4oVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10LCBVSU5UIG5yT2ZMYXllcnMpCi17CitMSU5LU1BFQ19DUFAgSEFORExFX0FBQ0RFQ09ERVIgYWFjRGVjb2Rlcl9PcGVuKFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBuck9mTGF5ZXJzKSB7CiAgIEFBQ19ERUNPREVSX0lOU1RBTkNFICphYWNEZWMgPSBOVUxMOwogICBIQU5ETEVfVFJBTlNQT1JUREVDIHBJbjsKICAgaW50IGVyciA9IDA7CisgIGludCBzdGVyZW9Db25maWdJbmRleCA9IC0xOworCisgIFVJTlQgbnJPZkxheWVyc19taW4gPSBmTWluKG5yT2ZMYXllcnMsIChVSU5UKTEpOwogCiAgIC8qIEFsbG9jYXRlIHRyYW5zcG9ydCBsYXllciBzdHJ1Y3QuICovCi0gIHBJbiA9IHRyYW5zcG9ydERlY19PcGVuKHRyYW5zcG9ydEZtdCwgVFBfRkxBR19NUEVHNCk7CisgIHBJbiA9IHRyYW5zcG9ydERlY19PcGVuKHRyYW5zcG9ydEZtdCwgVFBfRkxBR19NUEVHNCwgbnJPZkxheWVyc19taW4pOwogICBpZiAocEluID09IE5VTEwpIHsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCi0gIHRyYW5zcG9ydERlY19TZXRQYXJhbShwSW4sIFRQREVDX1BBUkFNX0lHTk9SRV9CVUZGRVJGVUxMTkVTUywgMSk7Ci0KICAgLyogQWxsb2NhdGUgQUFDIGRlY29kZXIgY29yZSBzdHJ1Y3QuICovCiAgIGFhY0RlYyA9IENBYWNEZWNvZGVyX09wZW4odHJhbnNwb3J0Rm10KTsKIApAQCAtNjU5LDI5ICs5MzUsNjcgQEAKICAgfQogICBhYWNEZWMtPmhJbnB1dCA9IHBJbjsKIAotICBhYWNEZWMtPm5yT2ZMYXllcnMgPSBuck9mTGF5ZXJzOworICBhYWNEZWMtPm5yT2ZMYXllcnMgPSBuck9mTGF5ZXJzX21pbjsKIAotICBhYWNEZWMtPmNoYW5uZWxPdXRwdXRNYXBwaW5nID0gY2hhbm5lbE1hcHBpbmdUYWJsZVdBVjsKKyAgLyogU2V0dXAgY2hhbm5lbCBtYXBwaW5nIGRlc2NyaXB0b3IuICovCisgIEZES19jaE1hcERlc2NyX2luaXQoJmFhY0RlYy0+bWFwRGVzY3IsIE5VTEwsIDAsIDApOwogCiAgIC8qIFJlZ2lzdGVyIENvbmZpZyBVcGRhdGUgY2FsbGJhY2suICovCi0gIHRyYW5zcG9ydERlY19SZWdpc3RlckFzY0NhbGxiYWNrKHBJbiwgYWFjRGVjb2Rlcl9Db25maWdDYWxsYmFjaywgKHZvaWQqKWFhY0RlYyk7CisgIHRyYW5zcG9ydERlY19SZWdpc3RlckFzY0NhbGxiYWNrKHBJbiwgYWFjRGVjb2Rlcl9Db25maWdDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhYWNEZWMpOwogCisgIC8qIFJlZ2lzdGVyIEZyZWUgTWVtb3J5IGNhbGxiYWNrLiAqLworICB0cmFuc3BvcnREZWNfUmVnaXN0ZXJGcmVlTWVtQ2FsbGJhY2socEluLCBhYWNEZWNvZGVyX0ZyZWVNZW1DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYWFjRGVjKTsKKworICAvKiBSZWdpc3RlciBjb25maWcgc3dpdGNoIGNvbnRyb2wgY2FsbGJhY2suICovCisgIHRyYW5zcG9ydERlY19SZWdpc3RlckN0cmxDRkdDaGFuZ2VDYWxsYmFjaygKKyAgICAgIHBJbiwgYWFjRGVjb2Rlcl9DdHJsQ0ZHQ2hhbmdlQ2FsbGJhY2ssICh2b2lkICopYWFjRGVjKTsKKworICBGREttZW1jbGVhcigmYWFjRGVjLT5xbWZEb21haW4sIHNpemVvZihGREtfUU1GX0RPTUFJTikpOwogICAvKiBvcGVuIFNCUiBkZWNvZGVyICovCi0gIGlmICggU0JSREVDX09LICE9IHNickRlY29kZXJfT3BlbiAoICZhYWNEZWMtPmhTYnJEZWNvZGVyICkpIHsKKyAgaWYgKFNCUkRFQ19PSyAhPSBzYnJEZWNvZGVyX09wZW4oJmFhY0RlYy0+aFNickRlY29kZXIsICZhYWNEZWMtPnFtZkRvbWFpbikpIHsKICAgICBlcnIgPSAtMTsKICAgICBnb3RvIGJhaWw7CiAgIH0KICAgYWFjRGVjLT5xbWZNb2RlVXNlciA9IE5PVF9ERUZJTkVEOwotICB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTYnJDYWxsYmFjayhhYWNEZWMtPmhJbnB1dCwgKGNiU2JyX3Qpc2JyRGVjb2Rlcl9IZWFkZXIsICh2b2lkKilhYWNEZWMtPmhTYnJEZWNvZGVyKTsKKyAgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyU2JyQ2FsbGJhY2soYWFjRGVjLT5oSW5wdXQsIChjYlNicl90KXNickRlY29kZXJfSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFhY0RlYy0+aFNickRlY29kZXIpOwogCisgIGlmIChtcGVnU3Vycm91bmREZWNvZGVyX09wZW4oCisgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICoqKSZhYWNEZWMtPnBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgIHN0ZXJlb0NvbmZpZ0luZGV4LCAmYWFjRGVjLT5xbWZEb21haW4pKSB7CisgICAgZXJyID0gLTE7CisgICAgZ290byBiYWlsOworICB9CisgIC8qIFNldCBNUEVHIFN1cnJvdW5kIGRlZmF1bHRzICovCisgIGFhY0RlYy0+bXBzRW5hYmxlVXNlciA9IDA7CisgIGFhY0RlYy0+bXBzRW5hYmxlQ3VyciA9IDA7CisgIGFhY0RlYy0+bXBzQXBwbGljYWJsZSA9IDA7CisgIGFhY0RlYy0+bXBzT3V0cHV0TW9kZSA9IChTQ0hBUilTQUNERUNfT1VUX01PREVfTk9STUFMOworICB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTc2NDYWxsYmFjayhwSW4sIGFhY0RlY29kZXJfU3NjQ2FsbGJhY2ssICh2b2lkICopYWFjRGVjKTsKIAotICBwY21EbXhfT3BlbiggJmFhY0RlYy0+aFBjbVV0aWxzICk7CisgIHsKKyAgICBpZiAoRkRLX2RyY0RlY19PcGVuKCYoYWFjRGVjLT5oVW5pRHJjRGVjb2RlciksIERSQ19ERUNfQUxMKSAhPSAwKSB7CisgICAgICBlcnIgPSAtMTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworICB0cmFuc3BvcnREZWNfUmVnaXN0ZXJVbmlEcmNDb25maWdDYWxsYmFjayhwSW4sIGFhY0RlY29kZXJfVW5pRHJjQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYWFjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYWNEZWMtPmxvdWRuZXNzSW5mb1NldFBvc2l0aW9uKTsKKyAgYWFjRGVjLT5kZWZhdWx0VGFyZ2V0TG91ZG5lc3MgPSAoU0NIQVIpOTY7CisKKyAgcGNtRG14X09wZW4oJmFhY0RlYy0+aFBjbVV0aWxzKTsKICAgaWYgKGFhY0RlYy0+aFBjbVV0aWxzID09IE5VTEwpIHsKICAgICBlcnIgPSAtMTsKICAgICBnb3RvIGJhaWw7CiAgIH0KIAotICBhYWNEZWMtPmhMaW1pdGVyID0gY3JlYXRlTGltaXRlcihURExfQVRUQUNLX0RFRkFVTFRfTVMsIFRETF9SRUxFQVNFX0RFRkFVTFRfTVMsIFNBTVBMRV9NQVgsICg4KSwgOTYwMDApOworICBhYWNEZWMtPmhMaW1pdGVyID0KKyAgICAgIHBjbUxpbWl0ZXJfQ3JlYXRlKFRETF9BVFRBQ0tfREVGQVVMVF9NUywgVERMX1JFTEVBU0VfREVGQVVMVF9NUywKKyAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTClNQVhWQUxfREJMLCAoOCksIDk2MDAwKTsKICAgaWYgKE5VTEwgPT0gYWFjRGVjLT5oTGltaXRlcikgewogICAgIGVyciA9IC0xOwogICAgIGdvdG8gYmFpbDsKQEAgLTY4OSwxMCArMTAwMyw5IEBACiAgIGFhY0RlYy0+bGltaXRlckVuYWJsZVVzZXIgPSAoVUNIQVIpLTE7CiAgIGFhY0RlYy0+bGltaXRlckVuYWJsZUN1cnIgPSAwOwogCi0KLQogICAvKiBBc3N1cmUgdGhhdCBhbGwgbW9kdWxlcyBoYXZlIHNhbWUgZGVsYXkgKi8KLSAgaWYgKCBzZXRDb25jZWFsTWV0aG9kKGFhY0RlYywgQ0NvbmNlYWxtZW50X0dldE1ldGhvZCgmYWFjRGVjLT5jb25jZWFsQ29tbW9uRGF0YSkpICkgeworICBpZiAoc2V0Q29uY2VhbE1ldGhvZChhYWNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgIENDb25jZWFsbWVudF9HZXRNZXRob2QoJmFhY0RlYy0+Y29uY2VhbENvbW1vbkRhdGEpKSkgewogICAgIGVyciA9IC0xOwogICAgIGdvdG8gYmFpbDsKICAgfQpAQCAtNzA1LDI1ICsxMDE4LDI0IEBACiAgIHJldHVybiBhYWNEZWM7CiB9CiAKLUxJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0ZpbGwoCi0gICAgICAgIEhBTkRMRV9BQUNERUNPREVSICAgc2VsZiwKLSAgICAgICAgVUNIQVIgICAgICAgICAgICAgICpwQnVmZmVyW10sCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgYnVmZmVyU2l6ZVtdLAotICAgICAgICBVSU5UICAgICAgICAgICAgICAgKnBCeXRlc1ZhbGlkCi0gICAgICAgICkKLXsKK0xJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0ZpbGwoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBCdWZmZXJbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBidWZmZXJTaXplW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBCeXRlc1ZhbGlkKSB7CiAgIFRSQU5TUE9SVERFQ19FUlJPUiB0cEVycjsKLSAgLyogbG9vcCBjb3VudGVyIGZvciBsYXllcnM7IGlmIG5vdCBUVF9NUDRfUkFXUEFDS0VUUyB1c2VkIGFzIGluZGV4IGZvciBvbmx5IAotICAgICBhdmFpbGFibGUgbGF5ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIElOVCBsYXllciAgICAgID0gMDsKKyAgLyogbG9vcCBjb3VudGVyIGZvciBsYXllcnM7IGlmIG5vdCBUVF9NUDRfUkFXUEFDS0VUUyB1c2VkIGFzIGluZGV4IGZvciBvbmx5CisgICAgIGF2YWlsYWJsZSBsYXllciAqLworICBJTlQgbGF5ZXIgPSAwOwogICBJTlQgbnJPZkxheWVycyA9IHNlbGYtPm5yT2ZMYXllcnM7CiAKICAgewotICAgIGZvciAobGF5ZXIgPSAwOyBsYXllciA8IG5yT2ZMYXllcnM7IGxheWVyKyspeworICAgIGZvciAobGF5ZXIgPSAwOyBsYXllciA8IG5yT2ZMYXllcnM7IGxheWVyKyspIHsKICAgICAgIHsKLSAgICAgICAgdHBFcnIgPSB0cmFuc3BvcnREZWNfRmlsbERhdGEoIHNlbGYtPmhJbnB1dCwgcEJ1ZmZlcltsYXllcl0sIGJ1ZmZlclNpemVbbGF5ZXJdLCAmcEJ5dGVzVmFsaWRbbGF5ZXJdLCBsYXllciApOworICAgICAgICB0cEVyciA9IHRyYW5zcG9ydERlY19GaWxsRGF0YShzZWxmLT5oSW5wdXQsIHBCdWZmZXJbbGF5ZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplW2xheWVyXSwgJnBCeXRlc1ZhbGlkW2xheWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIpOwogICAgICAgICBpZiAodHBFcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7Ci0gICAgICAgICAgcmV0dXJuIEFBQ19ERUNfVU5LTk9XTjsgIC8qIE11c3QgYmUgYW4gaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgICAgICByZXR1cm4gQUFDX0RFQ19VTktOT1dOOyAvKiBNdXN0IGJlIGFuIGludGVybmFsIGVycm9yICovCiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC03MzIsMzggKzEwNDQsNDcgQEAKICAgcmV0dXJuIEFBQ19ERUNfT0s7CiB9CiAKLQotc3RhdGljIHZvaWQgYWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oSEFORExFX0FBQ0RFQ09ERVIgc2VsZikKLXsKK3N0YXRpYyB2b2lkIGFhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpIHsKICAgQ0FhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKHNlbGYpOwogCi0gIGlmICggc2VsZi0+aFNickRlY29kZXIgIT0gTlVMTCApIHsKLSAgICBzYnJEZWNvZGVyX1NldFBhcmFtKHNlbGYtPmhTYnJEZWNvZGVyLCBTQlJfQlNfSU5URVJSVVBUSU9OLCAwKTsKKyAgaWYgKHNlbGYtPmhTYnJEZWNvZGVyICE9IE5VTEwpIHsKKyAgICBzYnJEZWNvZGVyX1NldFBhcmFtKHNlbGYtPmhTYnJEZWNvZGVyLCBTQlJfQlNfSU5URVJSVVBUSU9OLCAxKTsKKyAgfQorICBpZiAoc2VsZi0+bXBzRW5hYmxlVXNlcikgeworICAgIG1wZWdTdXJyb3VuZERlY29kZXJfU2V0UGFyYW0oCisgICAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKXNlbGYtPnBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICBTQUNERUNfQlNfSU5URVJSVVBUSU9OLCAxKTsKICAgfQogfQogCi1zdGF0aWMgdm9pZCBhYWNEZWNvZGVyX1VwZGF0ZUJpdFN0cmVhbUNvdW50ZXJzKENTdHJlYW1JbmZvICpwU2ksIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IG5CaXRzLCBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1cykKLXsKK3N0YXRpYyB2b2lkIGFhY0RlY29kZXJfVXBkYXRlQml0U3RyZWFtQ291bnRlcnMoQ1N0cmVhbUluZm8gKnBTaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzKSB7CiAgIC8qIGNhbGN1bGF0ZSBiaXQgZGlmZmVyZW5jZSAoYW1vdW50IG9mIGJpdHMgbW92ZWQgZm9yd2FyZCkgKi8KLSAgbkJpdHMgPSBuQml0cyAtIEZES2dldFZhbGlkQml0cyhoQnMpOworICBuQml0cyA9IG5CaXRzIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKIAogICAvKiBOb3RlOiBUaGUgYW1vdW50IG9mIGJpdHMgY29uc3VtZWQgbWlnaHQgYmVjb21lIG5lZ2F0aXZlIHdoZW4gcGFyc2luZyBhCiAgICAgIGJpdCBzdHJlYW0gd2l0aCBzZXZlcmFsIHN1YiBmcmFtZXMsIGFuZCB3ZSBmaW5kIG91dCBhdCB0aGUgbGFzdCBzdWIgZnJhbWUKLSAgICAgdGhhdCB0aGUgdG90YWwgZnJhbWUgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHRoZSBzdW0gb2Ygc3ViIGZyYW1lIGxlbmd0aC4gCisgICAgIHRoYXQgdGhlIHRvdGFsIGZyYW1lIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCB0aGUgc3VtIG9mIHN1YiBmcmFtZSBsZW5ndGguCiAgICAgIElmIHRoaXMgaGFwcGVucywgdGhlIHRyYW5zcG9ydCBkZWNvZGVyIG1pZ2h0IHdhbnQgdG8gcmV3aW5kIHRvIHRoZSBzdXBwb3NlZAogICAgICBlbmRpbmcgb2YgdGhlIHRyYW5zcG9ydCBmcmFtZSwgYW5kIHRoaXMgcG9zaXRpb24gbWlnaHQgYmUgYmVmb3JlIHRoZSBsYXN0CiAgICAgIGFjY2VzcyB1bml0IGJlZ2lubmluZy4gKi8KIAogICAvKiBDYWxjIGJpdHJhdGUuICovCiAgIGlmIChwU2ktPmZyYW1lU2l6ZSA+IDApIHsKLSAgICBwU2ktPmJpdFJhdGUgPSAobkJpdHMgKiBwU2ktPnNhbXBsZVJhdGUpL3BTaS0+ZnJhbWVTaXplOworICAgIC8qIGJpdFJhdGUgPSBuQml0cyAqIHNhbXBsZVJhdGUgLyBmcmFtZVNpemUgKi8KKyAgICBpbnQgcmF0aW9fZSA9IDA7CisgICAgRklYUF9EQkwgcmF0aW9fbSA9IGZEaXZOb3JtKHBTaS0+c2FtcGxlUmF0ZSwgcFNpLT5mcmFtZVNpemUsICZyYXRpb19lKTsKKyAgICBwU2ktPmJpdFJhdGUgPSAoSU5UKWZNdWx0Tm9ybShuQml0cywgREZSQUNUX0JJVFMgLSAxLCByYXRpb19tLCByYXRpb19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERGUkFDVF9CSVRTIC0gMSk7CiAgIH0KIAogICAvKiBiaXQvYnl0ZSBjb3VudGVycyAqLwogICB7Ci0gICAgaW50IG5CeXRlczsKKyAgICBJTlQgbkJ5dGVzOwogCi0gICAgbkJ5dGVzID0gbkJpdHM+PjM7CisgICAgbkJ5dGVzID0gbkJpdHMgPj4gMzsKICAgICBwU2ktPm51bVRvdGFsQnl0ZXMgKz0gbkJ5dGVzOwogICAgIGlmIChJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpKSB7CiAgICAgICBwU2ktPm51bVRvdGFsQWNjZXNzVW5pdHMrKzsKQEAgLTc3NSw1NCArMTA5Niw4MSBAQAogICB9CiB9CiAKLXN0YXRpYyBJTlQgYWFjRGVjb2Rlcl9Fc3RpbWF0ZU51bWJlck9mTG9zdEZyYW1lcyhIQU5ETEVfQUFDREVDT0RFUiBzZWxmKQoteworc3RhdGljIElOVCBhYWNEZWNvZGVyX0VzdGltYXRlTnVtYmVyT2ZMb3N0RnJhbWVzKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpIHsKICAgSU5UIG47CiAKLSAgdHJhbnNwb3J0RGVjX0dldE1pc3NpbmdBY2Nlc3NVbml0Q291bnQoICZuLCBzZWxmLT5oSW5wdXQpOworICB0cmFuc3BvcnREZWNfR2V0TWlzc2luZ0FjY2Vzc1VuaXRDb3VudCgmbiwgc2VsZi0+aElucHV0KTsKIAogICByZXR1cm4gbjsKIH0KIAotTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoCi0gICAgICAgIEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAotICAgICAgICBJTlRfUENNICAgICAgICAgICAqcFRpbWVEYXRhX2V4dGVybiwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgIHRpbWVEYXRhU2l6ZV9leHRlcm4sCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBmbGFncykKLXsKLSAgICBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKLSAgICBpbnQgZlRwSW50ZXJydXB0aW9uID0gMDsgIC8qIFRyYW5zcG9ydCBvcmlnaW5hdGVkIGludGVycnVwdGlvbiBkZXRlY3Rpb24uICovCi0gICAgaW50IGZUcENvbmNlYWwgPSAwOyAgICAgICAvKiBUcmFuc3BvcnQgb3JpZ2luYXRlZCBjb25jZWFsbWVudC4gKi8KK0xJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUgorYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBJTlRfUENNICpwVGltZURhdGFfZXh0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdGltZURhdGFTaXplX2V4dGVybiwgY29uc3QgVUlOVCBmbGFncykgeworICBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKKyAgSU5UIGxheWVyOworICBJTlQgbkJpdHM7CisgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCczsKKyAgaW50IGZUcEludGVycnVwdGlvbiA9IDA7IC8qIFRyYW5zcG9ydCBvcmlnaW5hdGVkIGludGVycnVwdGlvbiBkZXRlY3Rpb24uICovCisgIGludCBmVHBDb25jZWFsID0gMDsgICAgICAvKiBUcmFuc3BvcnQgb3JpZ2luYXRlZCBjb25jZWFsbWVudC4gKi8KKyAgSU5UX1BDTSAqcFRpbWVEYXRhID0gTlVMTDsKKyAgSU5UIHRpbWVEYXRhU2l6ZSA9IDA7CisgIFVJTlQgYWNjZXNzVW5pdCA9IDA7CisgIFVJTlQgbnVtQWNjZXNzVW5pdHMgPSAxOworICBVSU5UIG51bVByZXJvbGxBVSA9IDA7CisgIGludCBmRW5kQXVOb3RBZGp1c3RlZCA9IDA7ICAvKiBUaGUgZW5kIG9mIHRoZSBhY2Nlc3MgdW5pdCB3YXMgbm90IGFkanVzdGVkICovCisgIGludCBhcHBseUNyb3NzZmFkZSA9IDE7ICAgICAvKiBmbGFnIGluZGljYXRlcyBpZiBmbHVzaGluZyB3YXMgcG9zc2libGUgKi8KKyAgRklYUF9QQ00gKnBUaW1lRGF0YUZpeHBQY207IC8qIFNpZ25hbCBidWZmZXIgZm9yIGRlY29kaW5nIHByb2Nlc3MgYmVmb3JlIFBDTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyAqLworICBJTlQgdGltZURhdGFGaXhwUGNtU2l6ZTsKKyAgUENNX0RFQyAqcFRpbWVEYXRhUGNtUG9zdDsgLyogU2lnbmFsIGJ1ZmZlciBmb3IgUENNIHBvc3QtcHJvY2Vzc2luZyAqLworICBJTlQgdGltZURhdGFQY21Qb3N0U2l6ZTsKIAotICAgIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgIH0KKworICBwVGltZURhdGEgPSBzZWxmLT5wY21PdXRwdXRCdWZmZXI7CisgIHRpbWVEYXRhU2l6ZSA9IHNpemVvZihzZWxmLT5wY21PdXRwdXRCdWZmZXIpIC8gc2l6ZW9mKCpzZWxmLT5wY21PdXRwdXRCdWZmZXIpOworCisgIGlmIChmbGFncyAmIEFBQ0RFQ19JTlRSKSB7CisgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPSAwOworICB9CisgIGhCcyA9IHRyYW5zcG9ydERlY19HZXRCaXRzdHJlYW0oc2VsZi0+aElucHV0LCAwKTsKKworICAvKiBHZXQgY3VycmVudCBiaXRzIHBvc2l0aW9uIGZvciBiaXRyYXRlIGNhbGN1bGF0aW9uLiAqLworICBuQml0cyA9IEZES2dldFZhbGlkQml0cyhoQnMpOworCisgIGlmIChmbGFncyAmIEFBQ0RFQ19DTFJISVNUKSB7CisgICAgaWYgKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQykgeworICAgICAgLyogMSkgc3RvcmUgQXVkaW9TcGVjaWZpY0NvbmZpZyBhbHdheXMgaW4gQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgpICovCisgICAgICAvKiAyKSBmcmVlIG1lbW9yeSBvZiBkeW5hbWljIGFsbG9jYXRlZCBkYXRhICovCisgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgYXNjOworICAgICAgdHJhbnNwb3J0RGVjX0dldEFzYyhzZWxmLT5oSW5wdXQsIDAsICZhc2MpOworICAgICAgYWFjRGVjb2Rlcl9GcmVlTWVtQ2FsbGJhY2soc2VsZiwgJmFzYyk7CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzID0gMDsKKyAgICAgIC8qIDMpIHJlc3RvcmUgQXVkaW9TcGVjaWZpY0NvbmZpZyAqLworICAgICAgdHJhbnNwb3J0RGVjX091dE9mQmFuZENvbmZpZyhzZWxmLT5oSW5wdXQsIGFzYy5jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc2MuY29uZmlnQml0cyArIDcpID4+IDMsIDApOwogICAgIH0KLSAgICBJTlQgaW50ZXJsZWF2ZWQgPSBzZWxmLT5vdXRwdXRJbnRlcmxlYXZlZDsKLSAgICBJTlRfUENNICpwVGltZURhdGEgPSBzZWxmLT5wY21PdXRwdXRCdWZmZXI7Ci0gICAgSU5UIHRpbWVEYXRhU2l6ZSA9IHNpemVvZihzZWxmLT5wY21PdXRwdXRCdWZmZXIpL3NpemVvZigqc2VsZi0+cGNtT3V0cHV0QnVmZmVyKTsKKyAgfQogCi0gICAgaWYgKGZsYWdzICYgQUFDREVDX0lOVFIpIHsKLSAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzID0gMDsKLSAgICB9CisgIGlmICghKChmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpIHx8CisgICAgICAgIChzZWxmLT5mbHVzaFN0YXR1cyA9PSBBQUNERUNfUlNWNjBfREFTSF9JUEZfQVRTQ19GTFVTSF9PTikgfHwKKyAgICAgICAgKHNlbGYtPmZsdXNoU3RhdHVzID09IEFBQ0RFQ19VU0FDX0RBU0hfSVBGX0ZMVVNIX09OKSB8fAorICAgICAgICAoc2VsZi0+YnVpbGRVcFN0YXR1cyA9PSBBQUNERUNfUlNWNjBfQlVJTERfVVBfSURMRV9JTl9CQU5EKSkpIHsKKyAgICBUUkFOU1BPUlRERUNfRVJST1IgZXJyOwogCi0gICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gdHJhbnNwb3J0RGVjX0dldEJpdHN0cmVhbShzZWxmLT5oSW5wdXQsIDApOwotCi0gICAgLyogR2V0IGN1cnJlbnQgYml0cyBwb3NpdGlvbiBmb3IgYml0cmF0ZSBjYWxjdWxhdGlvbi4gKi8KLSAgICBJTlQgbkJpdHMgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKLSAgICBpZiAoISAoZmxhZ3MgJiAoQUFDREVDX0NPTkNFQUwgfCBBQUNERUNfRkxVU0gpICkgKQotICAgIHsKLSAgICAgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnI7Ci0KLSAgICAgIGZvcihJTlQgbGF5ZXIgPSAwOyBsYXllciA8IHNlbGYtPm5yT2ZMYXllcnM7IGxheWVyKyspCi0gICAgICB7Ci0gICAgICAgIGVyciA9IHRyYW5zcG9ydERlY19SZWFkQWNjZXNzVW5pdChzZWxmLT5oSW5wdXQsIGxheWVyKTsKLSAgICAgICAgaWYgKGVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKLSAgICAgICAgICBzd2l0Y2ggKGVycikgeworICAgIGZvciAobGF5ZXIgPSAwOyBsYXllciA8IHNlbGYtPm5yT2ZMYXllcnM7IGxheWVyKyspIHsKKyAgICAgIGVyciA9IHRyYW5zcG9ydERlY19SZWFkQWNjZXNzVW5pdChzZWxmLT5oSW5wdXQsIGxheWVyKTsKKyAgICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgIHN3aXRjaCAoZXJyKSB7CiAgICAgICAgICAgY2FzZSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTOgogICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX05PVF9FTk9VR0hfQklUUzsKICAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOgotICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPSBhYWNEZWNvZGVyX0VzdGltYXRlTnVtYmVyT2ZMb3N0RnJhbWVzKHNlbGYpOworICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPQorICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfRXN0aW1hdGVOdW1iZXJPZkxvc3RGcmFtZXMoc2VsZik7CiAgICAgICAgICAgICBmVHBJbnRlcnJ1cHRpb24gPSAxOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUOgpAQCAtODMxLDI1OCArMTE3OSw3NzQgQEAKICAgICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19DUkNfRVJST1I6CiAgICAgICAgICAgICBmVHBDb25jZWFsID0gMTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDoKKyAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTktOT1dOOwogICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPiAwKSB7Ci0gICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzLS07CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA+IDApIHsKKyAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzLS07CisgICAgfQorICB9CisKKyAgc2VsZi0+ZnJhbWVPSyA9IDE7CisKKyAgVUlOVCBwcmVyb2xsQVVPZmZzZXRbQUFDREVDX01BWF9OVU1fUFJFUk9MTF9BVV07CisgIFVJTlQgcHJlcm9sbEFVTGVuZ3RoW0FBQ0RFQ19NQVhfTlVNX1BSRVJPTExfQVVdOworICBmb3IgKGludCBpID0gMDsgaSA8IEFBQ0RFQ19NQVhfTlVNX1BSRVJPTExfQVUgKyAxOyBpKyspCisgICAgc2VsZi0+cHJlcm9sbEFVTGVuZ3RoW2ldID0gMDsKKworICBJTlQgYXVTdGFydEFuY2hvcjsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzQXU7CisKKyAgLyogUHJvY2VzcyBwcmVyb2xsIGZyYW1lcyBhbmQgY3VycmVudCBmcmFtZSAqLworICBkbyB7CisgICAgaWYgKCEoZmxhZ3MgJiAoQUFDREVDX0NPTkNFQUwgfCBBQUNERUNfRkxVU0gpKSAmJgorICAgICAgICAoc2VsZi0+Zmx1c2hTdGF0dXMgIT0gQUFDREVDX1JTVjYwX0NGR19DSEFOR0VfQVRTQ19GTFVTSF9PTikgJiYKKyAgICAgICAgKGFjY2Vzc1VuaXQgPT0gMCkgJiYKKyAgICAgICAgKHNlbGYtPmhhc0F1ZGlvUHJlUm9sbCB8fAorICAgICAgICAgKHNlbGYtPmJ1aWxkVXBTdGF0dXMgPT0gQUFDREVDX1JTVjYwX0JVSUxEX1VQX0lETEVfSU5fQkFORCkpICYmCisgICAgICAgICFmVHBJbnRlcnJ1cHRpb24gJiYKKyAgICAgICAgIWZUcENvbmNlYWwgLyogQml0IHN0cmVhbSBwb2ludGVyIG5lZWRzIHRvIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQorICAgICAgICAgICAgICAgICAgICAgICAodmFsaWQpIEFVLiAqLworICAgICkgeworICAgICAgRXJyb3JTdGF0dXMgPSBDQWFjRGVjb2Rlcl9QcmVSb2xsRXh0ZW5zaW9uUGF5bG9hZFBhcnNlKAorICAgICAgICAgIHNlbGYsICZudW1QcmVyb2xsQVUsIHByZXJvbGxBVU9mZnNldCwgcHJlcm9sbEFVTGVuZ3RoKTsKKworICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgc3dpdGNoIChFcnJvclN0YXR1cykgeworICAgICAgICAgIGNhc2UgQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFM6CisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgY2FzZSBBQUNfREVDX1BBUlNFX0VSUk9SOgorICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KKworICAgICAgbnVtQWNjZXNzVW5pdHMgKz0gbnVtUHJlcm9sbEFVOworICAgIH0KKworICAgIGhCc0F1ID0gdHJhbnNwb3J0RGVjX0dldEJpdHN0cmVhbShzZWxmLT5oSW5wdXQsIDApOworICAgIGF1U3RhcnRBbmNob3IgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnNBdSk7CisKKyAgICBzZWxmLT5hY2Nlc3NVbml0ID0gYWNjZXNzVW5pdDsKKyAgICBpZiAoYWNjZXNzVW5pdCA8IG51bVByZXJvbGxBVSkgeworICAgICAgRkRLcHVzaEZvcihoQnNBdSwgcHJlcm9sbEFVT2Zmc2V0W2FjY2Vzc1VuaXRdKTsKICAgICB9CiAKICAgICAvKiBTaWduYWwgYml0IHN0cmVhbSBpbnRlcnJ1cHRpb24gdG8gb3RoZXIgbW9kdWxlcyBpZiByZXF1aXJlZC4gKi8KLSAgICBpZiAoIGZUcEludGVycnVwdGlvbiB8fCAoZmxhZ3MgJiAoQUFDREVDX0lOVFJ8QUFDREVDX0NMUkhJU1QpKSApCi0gICAgewotICAgICAgc2JyRGVjb2Rlcl9TZXRQYXJhbShzZWxmLT5oU2JyRGVjb2RlciwgU0JSX0NMRUFSX0hJU1RPUlksIChmbGFncyZBQUNERUNfQ0xSSElTVCkpOworICAgIGlmIChmVHBJbnRlcnJ1cHRpb24gfHwgKGZsYWdzICYgQUFDREVDX0lOVFIpKSB7CiAgICAgICBhYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihzZWxmKTsKLSAgICAgIGlmICggISAoZmxhZ3MgJiBBQUNERUNfSU5UUikgKSB7CisgICAgICBpZiAoIShmbGFncyAmIEFBQ0RFQ19JTlRSKSkgewogICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfVFJBTlNQT1JUX1NZTkNfRVJST1I7CiAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgIH0KICAgICB9CiAKLSAgICAvKiBFbXB0eSBiaXQgYnVmZmVyIGluIGNhc2Ugb2YgZmx1c2ggcmVxdWVzdC4gKi8KLSAgICBpZiAoZmxhZ3MgJiBBQUNERUNfRkxVU0gpCi0gICAgewotICAgICAgdHJhbnNwb3J0RGVjX1NldFBhcmFtKHNlbGYtPmhJbnB1dCwgVFBERUNfUEFSQU1fUkVTRVQsIDEpOwotICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPSAwOwotICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1CYWRCeXRlcyA9IDA7Ci0gICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bVRvdGFsQnl0ZXMgPSAwOworICAgIC8qIENsZWFyaW5nIGNvcmUgZGF0YSB3aWxsIGJlIGRvbmUgaW4gQ0FhY0RlY29kZXJfRGVjb2RlRnJhbWUoKSBiZWxvdy4KKyAgICAgICBUZWxsIG90aGVyIG1vZHVsZXMgdG8gY2xlYXIgc3RhdGVzIGlmIHJlcXVpcmVkLiAqLworICAgIGlmIChmbGFncyAmIEFBQ0RFQ19DTFJISVNUKSB7CisgICAgICBpZiAoIShzZWxmLT5mbGFnc1swXSAmIEFDX1VTQUMpKSB7CisgICAgICAgIHNickRlY29kZXJfU2V0UGFyYW0oc2VsZi0+aFNickRlY29kZXIsIFNCUl9DTEVBUl9ISVNUT1JZLCAxKTsKKyAgICAgICAgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9TZXRQYXJhbSgKKyAgICAgICAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKXNlbGYtPnBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgICAgU0FDREVDX0NMRUFSX0hJU1RPUlksIDEpOworICAgICAgICBpZiAoRkRLX1FtZkRvbWFpbl9DbGVhclBlcnNpc3RlbnRNZW1vcnkoJnNlbGYtPnFtZkRvbWFpbikgIT0gMCkgeworICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTktOT1dOOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICAvKiBSZXNldCB0aGUgb3V0cHV0IGRlbGF5IGZpZWxkLiBUaGUgbW9kdWxlcyB3aWxsIGFkZCB0aGVpciBmaWd1cmVzIG9uZSBhZnRlciBhbm90aGVyLiAqLworCisgICAgLyogRW1wdHkgYml0IGJ1ZmZlciBpbiBjYXNlIG9mIGZsdXNoIHJlcXVlc3QuICovCisgICAgaWYgKGZsYWdzICYgQUFDREVDX0ZMVVNIICYmICEoZmxhZ3MgJiBBQUNERUNfQ09OQ0VBTCkpIHsKKyAgICAgIGlmICghc2VsZi0+Zmx1c2hTdGF0dXMpIHsKKyAgICAgICAgdHJhbnNwb3J0RGVjX1NldFBhcmFtKHNlbGYtPmhJbnB1dCwgVFBERUNfUEFSQU1fUkVTRVQsIDEpOworICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9IDA7CisgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQmFkQnl0ZXMgPSAwOworICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bVRvdGFsQnl0ZXMgPSAwOworICAgICAgfQorICAgIH0KKyAgICAvKiBSZXNldCB0aGUgb3V0cHV0IGRlbGF5IGZpZWxkLiBUaGUgbW9kdWxlcyB3aWxsIGFkZCB0aGVpciBmaWd1cmVzIG9uZQorICAgICAqIGFmdGVyIGFub3RoZXIuICovCiAgICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSA9IDA7CiAKLSAgICBpZiAoc2VsZi0+bGltaXRlckVuYWJsZVVzZXI9PShVQ0hBUiktMSkgewotICAgICAgLyogRW5iYWxlIGxpbWl0ZXIgZm9yIGFsbCBub24tbG93ZGVsYXkgQU9UJ3MuICovCi0gICAgICBzZWxmLT5saW1pdGVyRW5hYmxlQ3VyciA9ICggc2VsZi0+ZmxhZ3MgJiAoQUNfTER8QUNfRUxEKSApID8gMCA6IDE7Ci0gICAgfQotICAgIGVsc2UgeworICAgIGlmIChzZWxmLT5saW1pdGVyRW5hYmxlVXNlciA9PSAoVUNIQVIpLTIpIHsKKyAgICAgIC8qIEVuYWJsZSBsaW1pdGVyIG9ubHkgZm9yIFJTVkQ2MC4gKi8KKyAgICAgIHNlbGYtPmxpbWl0ZXJFbmFibGVDdXJyID0gKHNlbGYtPmZsYWdzWzBdICYgQUNfUlNWNjAzREEpID8gMSA6IDA7CisgICAgfSBlbHNlIGlmIChzZWxmLT5saW1pdGVyRW5hYmxlVXNlciA9PSAoVUNIQVIpLTEpIHsKKyAgICAgIC8qIEVuYWJsZSBsaW1pdGVyIGZvciBhbGwgbm9uLWxvd2RlbGF5IEFPVCdzLiAqLworICAgICAgc2VsZi0+bGltaXRlckVuYWJsZUN1cnIgPSAoc2VsZi0+ZmxhZ3NbMF0gJiAoQUNfTEQgfCBBQ19FTEQpKSA/IDAgOiAxOworICAgIH0gZWxzZSB7CiAgICAgICAvKiBVc2UgbGltaXRlciBjb25maWd1cmF0aW9uIGFzIHJlcXVlc3RlZC4gKi8KICAgICAgIHNlbGYtPmxpbWl0ZXJFbmFibGVDdXJyID0gc2VsZi0+bGltaXRlckVuYWJsZVVzZXI7CiAgICAgfQogICAgIC8qIHJlc2V0IGxpbWl0ZXIgZ2FpbiBvbiBhIHBlciBmcmFtZSBiYXNpcyAqLwotICAgIHNlbGYtPmV4dEdhaW5bMF0gPSBGTDJGWENPTlNUX0RCTCgxLjBmLyhmbG9hdCkoMTw8VERMX0dBSU5fU0NBTElORykpOworICAgIHNlbGYtPmV4dEdhaW5bMF0gPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IFRETF9HQUlOX1NDQUxJTkcpKTsKIAorICAgIHBUaW1lRGF0YUZpeHBQY20gPSBwVGltZURhdGE7CisgICAgdGltZURhdGFGaXhwUGNtU2l6ZSA9IHRpbWVEYXRhU2l6ZTsKIAotICAgIEVycm9yU3RhdHVzID0gQ0FhY0RlY29kZXJfRGVjb2RlRnJhbWUoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHwgKGZUcENvbmNlYWwgPyBBQUNERUNfQ09OQ0VBTCA6IDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZURhdGFTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQpOworICAgIEVycm9yU3RhdHVzID0gQ0FhY0RlY29kZXJfRGVjb2RlRnJhbWUoCisgICAgICAgIHNlbGYsCisgICAgICAgIGZsYWdzIHwgKGZUcENvbmNlYWwgPyBBQUNERUNfQ09OQ0VBTCA6IDApIHwKKyAgICAgICAgICAgICgoc2VsZi0+Zmx1c2hTdGF0dXMgJiYgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSkgPyBBQUNERUNfRkxVU0gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwKSwKKyAgICAgICAgcFRpbWVEYXRhRml4cFBjbSArIDAsIHRpbWVEYXRhRml4cFBjbVNpemUsCisgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lICsgMCk7CiAKLSAgICBpZiAoIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTHxBQUNERUNfRkxVU0gpKSkgewotICAgICAgVFJBTlNQT1JUREVDX0VSUk9SIHRwRXJyOwotICAgICAgdHBFcnIgPSB0cmFuc3BvcnREZWNfRW5kQWNjZXNzVW5pdChzZWxmLT5oSW5wdXQpOwotICAgICAgaWYgKHRwRXJyICE9IFRSQU5TUE9SVERFQ19PSykgewotICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBJZiB0aGUgY3VycmVudCBwVGltZURhdGEgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHNpZ25hbCwgdGhlcmUgbm90aGluZyBlbHNlIHdlIGNhbiBkbywgc28gYmFpbC4gKi8KLSAgICBpZiAoICEgSVNfT1VUUFVUX1ZBTElEKEVycm9yU3RhdHVzKSApIHsKLSAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KKyAgICAvKiBpZiBmbHVzaGluZyBmb3IgVVNBQyBEQVNIIElQRiB3YXMgbm90IHBvc3NpYmxlIGdvIG9uIHdpdGggZGVjb2RpbmcKKyAgICAgKiBwcmVyb2xsICovCisgICAgaWYgKChzZWxmLT5mbGFnc1swXSAmIEFDX1VTQUMpICYmCisgICAgICAgIChzZWxmLT5mbHVzaFN0YXR1cyA9PSBBQUNERUNfVVNBQ19EQVNIX0lQRl9GTFVTSF9PTikgJiYKKyAgICAgICAgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSAmJiAoRXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykpIHsKKyAgICAgIGFwcGx5Q3Jvc3NmYWRlID0gMDsKKyAgICB9IGVsc2UgLyogVVNBQyBEQVNIIElQRiBmbHVzaGluZyBwb3NzaWJsZSBiZWdpbiAqLwogICAgIHsKLSAgICAgIC8qIEV4cG9ydCBkYXRhIGludG8gc3RyZWFtaW5mbyBzdHJ1Y3R1cmUgKi8KLSAgICAgIHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZTsKLSAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplICA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lOwotICAgIH0KLSAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzID0gc2VsZi0+c3RyZWFtSW5mby5hYWNOdW1DaGFubmVsczsKLQotCi0KLSAgICBDQWFjRGVjb2Rlcl9TeW5jUW1mTW9kZShzZWxmKTsKLQotLyogc2JyIGRlY29kZXIgKi8KLQotICAgIGlmIChFcnJvclN0YXR1cyB8fCAoZmxhZ3MgJiBBQUNERUNfQ09OQ0VBTCkgfHwgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1swXS0+Y29uY2VhbG1lbnRJbmZvLmNvbmNlYWxTdGF0ZSA+IENvbmNlYWxTdGF0ZV9GYWRlSW4pCi0gICAgewotICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7ICAvKiBpZiBhbiBlcnJvciBoYXMgb2NjdXJlZCBkbyBjb25jZWFsbWVudCBpbiB0aGUgU0JSIGRlY29kZXIgdG9vICovCi0gICAgfQotCi0gICAgaWYgKHNlbGYtPnNickVuYWJsZWQpCi0gICAgewotICAgICAgU0JSX0VSUk9SIHNickVycm9yID0gU0JSREVDX09LOwotICAgICAgaW50IGNoSWR4LCBudW1Db3JlQ2hhbm5lbCA9IHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM7Ci0gICAgICBpbnQgY2hPdXRNYXBJZHggPSAoKHNlbGYtPmNoTWFwSW5kZXg9PTApICYmIChudW1Db3JlQ2hhbm5lbDw3KSkgPyBudW1Db3JlQ2hhbm5lbCA6IHNlbGYtPmNoTWFwSW5kZXg7Ci0KLSAgICAgIC8qIHNldCBwYXJhbXMgKi8KLSAgICAgIHNickRlY29kZXJfU2V0UGFyYW0gKCBzZWxmLT5oU2JyRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zYnJQYXJhbXMuYnNEZWxheSk7Ci0gICAgICBzYnJEZWNvZGVyX1NldFBhcmFtICggc2VsZi0+aFNickRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0ZMVVNIX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgQUFDREVDX0ZMVVNIKSApOwotCi0gICAgICBpZiAoIHNlbGYtPnN0cmVhbUluZm8uYW90ID09IEFPVF9FUl9BQUNfRUxEICkgewotICAgICAgICAvKiBDb25maWd1cmUgUU1GICovCi0gICAgICAgIHNickRlY29kZXJfU2V0UGFyYW0gKCBzZWxmLT5oU2JyRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9MRF9RTUZfVElNRV9BTElHTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLT5mbGFncyAmIEFDX0xEX01QUykgPyAxIDogMCApOwotICAgICAgfQotCi0gICAgICB7Ci0gICAgICAgIFBDTURNWF9FUlJPUiBkbXhFcnI7Ci0gICAgICAgIElOVCAgbWF4T3V0Q2ggPSAwOwotCi0gICAgICAgIGRteEVyciA9IHBjbURteF9HZXRQYXJhbShzZWxmLT5oUGNtVXRpbHMsIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLCAmbWF4T3V0Q2gpOwotICAgICAgICBpZiAoIChkbXhFcnIgPT0gUENNRE1YX09LKSAmJiAobWF4T3V0Q2ggPT0gMSkgKSB7Ci0gICAgICAgICAgLyogRGlzYWJsZSBQUyBwcm9jZXNzaW5nIGlmIHdlIGhhdmUgdG8gY3JlYXRlIGEgbW9ubyBvdXRwdXQgc2lnbmFsLiAqLwotICAgICAgICAgIHNlbGYtPnBzUG9zc2libGUgPSAwOworICAgICAgaWYgKCEoKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMIHwgQUFDREVDX0ZMVVNIKSkgfHwgZlRwQ29uY2VhbCB8fAorICAgICAgICAgICAgc2VsZi0+Zmx1c2hTdGF0dXMpICYmCisgICAgICAgICAgKCEoSVNfT1VUUFVUX1ZBTElEKEVycm9yU3RhdHVzKSkgfHwgIShhY2Nlc3NVbml0IDwgbnVtUHJlcm9sbEFVKSkpIHsKKyAgICAgICAgVFJBTlNQT1JUREVDX0VSUk9SIHRwRXJyOworICAgICAgICB0cEVyciA9IHRyYW5zcG9ydERlY19FbmRBY2Nlc3NVbml0KHNlbGYtPmhJbnB1dCk7CisgICAgICAgIGlmICh0cEVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsgLyogd2hpbGUgcHJlcm9sbCBwcm9jZXNzaW5nIGxhdGVyIHBvc3NpYmx5IGFuIGVycm9yIGluIHRoZQorICAgICAgICAgICAgICAgICAgcmVuZGVyZXIgcGFydCBvY2N1cnJzICovCisgICAgICAgIGlmIChJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpKSB7CisgICAgICAgICAgZkVuZEF1Tm90QWRqdXN0ZWQgPSAxOwogICAgICAgICB9CiAgICAgICB9CiAKKyAgICAgIC8qIElmIHRoZSBjdXJyZW50IHBUaW1lRGF0YUZpeHBQY20gZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHNpZ25hbCwgdGhlcmUKKyAgICAgICAqIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8sIHNvIGJhaWwuICovCisgICAgICBpZiAoIUlTX09VVFBVVF9WQUxJRChFcnJvclN0YXR1cykpIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQogCi0gICAgICAvKiBhcHBseSBTQlIgcHJvY2Vzc2luZyAqLwotICAgICAgc2JyRXJyb3IgPSBzYnJEZWNvZGVyX0FwcGx5ICggc2VsZi0+aFNickRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbE91dHB1dE1hcHBpbmdbY2hPdXRNYXBJZHhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+cHNQb3NzaWJsZSk7CisgICAgICB7CisgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZTsKKyAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKKyAgICAgIH0KIAorICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA9IHNlbGYtPnN0cmVhbUluZm8uYWFjTnVtQ2hhbm5lbHM7CiAKLSAgICAgaWYgKHNickVycm9yID09IFNCUkRFQ19PSykgewotICAgICAgICNkZWZpbmUgVVBTX1NDQUxFICAyICAvKiBNYXhpbXVtIHVwc2FtcGxpbmcgZmFjdG9yIGlzIDQgKENFTFArU0JSKSAqLwotICAgICAgIEZJWFBfREJMICB1cHNhbXBsZUZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PFVQU19TQ0FMRSkpOworICAgICAgeworICAgICAgICBGREtfRGVsYXlfQXBwbHkoJnNlbGYtPnVzYWNSZXNpZHVhbERlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEYXRhRml4cFBjbSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAqIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSArIDApICsgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplLCAwKTsKKyAgICAgIH0KIAotICAgICAgIC8qIFVwZGF0ZSBkYXRhIGluIHN0cmVhbWluZm8gc3RydWN0dXJlLiBBc3N1bWUgdGhhdCB0aGUgU0JSIHVwc2FtcGxpbmcgZmFjdG9yIGlzIGVpdGhlciAxIG9yIDIgKi8KLSAgICAgICBzZWxmLT5mbGFncyB8PSBBQ19TQlJfUFJFU0VOVDsKLSAgICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlICE9IHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSkgewotICAgICAgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID09IDc2OCkgewotICAgICAgICAgICB1cHNhbXBsZUZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDguMGYvKDM8PFVQU19TQ0FMRSkpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgdXBzYW1wbGVGYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgyLjBmLygxPDxVUFNfU0NBTEUpKTsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgLyogQXBwbHkgdXBzYW1wbGluZyBmYWN0b3IgdG8gYm90aCB0aGUgY29yZSBmcmFtZSBsZW5ndGggYW5kIHRoZSBjb3JlIGRlbGF5ICovCi0gICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgICAgPSAgICAgICAoSU5UKWZNdWx0KChGSVhQX0RCTClzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTw8VVBTX1NDQUxFLCB1cHNhbXBsZUZhY3Rvcik7Ci0gICAgICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSAgPSAoVUlOVCkoSU5UKWZNdWx0KChGSVhQX0RCTClzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5PDxVUFNfU0NBTEUsIHVwc2FtcGxlRmFjdG9yKTsKLSAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ICs9IHNickRlY29kZXJfR2V0RGVsYXkoIHNlbGYtPmhTYnJEZWNvZGVyICk7CisgICAgICAvKiBTZXR0aW5nIG9mIGludGVybmFsIE1QUyBzdGF0ZTsgbWF5IGJlIHJlc2V0IGluIENBYWNEZWNvZGVyX1N5bmNRbWZNb2RlCisgICAgICAgICBpZiBkZWNvZGVyIGlzIHVuYWJsZSB0byBkZWNvZGUgd2l0aCB1c2VyIGRlZmluZWQgcW1mTW9kZSAqLworICAgICAgaWYgKCEoc2VsZi0+ZmxhZ3NbMF0gJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBIHwgQUNfRUxEKSkpIHsKKyAgICAgICAgc2VsZi0+bXBzRW5hYmxlQ3VyciA9CisgICAgICAgICAgICAoc2VsZi0+bXBzRW5hYmxlVXNlciAmJgorICAgICAgICAgICAgIGlzU3VwcG9ydGVkTXBzQ29uZmlnKHNlbGYtPnN0cmVhbUluZm8uYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYtPmZsYWdzWzBdICYgQUNfTVBTX1BSRVNFTlQpID8gMSA6IDApKTsKKyAgICAgIH0KIAotICAgICAgIGlmIChzZWxmLT5wc1Bvc3NpYmxlKSB7Ci0gICAgICAgICBzZWxmLT5mbGFncyB8PSBBQ19QU19QUkVTRU5UOwotICAgICAgIH0KLSAgICAgICBmb3IgKGNoSWR4ID0gbnVtQ29yZUNoYW5uZWw7IGNoSWR4IDwgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVsczsgY2hJZHgrPTEpIHsKLSAgICAgICAgIHNlbGYtPmNoYW5uZWxUeXBlW2NoSWR4XSA9IEFDVF9GUk9OVDsKLSAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzW2NoSWR4XSA9IGNoSWR4OwotICAgICAgIH0KLSAgICAgfQotICAgfQorICAgICAgaWYgKCFzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZi5xbWZEb21haW5FeHBsaWNpdENvbmZpZyAmJgorICAgICAgICAgIHNlbGYtPm1wc0VuYWJsZUN1cnIpIHsKKyAgICAgICAgLyogaWYgbm90IGRvbmUgeWV0LCBhbGxvY2F0ZSBmdWxsIE1QRUcgU3Vycm91bmQgZGVjb2RlciBpbnN0YW5jZSAqLworICAgICAgICBpZiAobXBlZ1N1cnJvdW5kRGVjb2Rlcl9Jc0Z1bGxNcGVnU3Vycm91bmREZWNvZGVySW5zdGFuY2VBdmFpbGFibGUoCisgICAgICAgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIpID09CisgICAgICAgICAgICBTQUNfSU5TVEFOQ0VfTk9UX0ZVTExfQVZBSUxBQkxFKSB7CisgICAgICAgICAgaWYgKG1wZWdTdXJyb3VuZERlY29kZXJfT3BlbigKKyAgICAgICAgICAgICAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKikmc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIsIC0xLAorICAgICAgICAgICAgICAgICAgJnNlbGYtPnFtZkRvbWFpbikpIHsKKyAgICAgICAgICAgIHJldHVybiBBQUNfREVDX09VVF9PRl9NRU1PUlk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CiAKKyAgICAgIENBYWNEZWNvZGVyX1N5bmNRbWZNb2RlKHNlbGYpOwogCi0gICAgewotICAgIElOVCBwY21MaW1pdGVyU2NhbGUgPSAwOwotICAgIFBDTURNWF9FUlJPUiBkbXhFcnIgPSBQQ01ETVhfT0s7Ci0gICAgaWYgKCBmbGFncyAmIChBQUNERUNfSU5UUiB8IEFBQ0RFQ19DTFJISVNUKSApIHsKLSAgICAgIC8qIGRlbGV0ZSBkYXRhIGZyb20gdGhlIHBhc3QgKGUuZy4gbWl4ZG93biBjb2VmaWNpZW50cykgKi8KLSAgICAgIHBjbURteF9SZXNldCggc2VsZi0+aFBjbVV0aWxzLCBQQ01ETVhfUkVTRVRfQlNfREFUQSApOwotICAgIH0KLSAgICAvKiBkbyBQQ00gcG9zdCBwcm9jZXNzaW5nICovCi0gICAgZG14RXJyID0gcGNtRG14X0FwcGx5RnJhbWUgKAotICAgICAgICAgICAgc2VsZi0+aFBjbVV0aWxzLAotICAgICAgICAgICAgcFRpbWVEYXRhLAotICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUsCi0gICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAotICAgICAgICAgICAgaW50ZXJsZWF2ZWQsCi0gICAgICAgICAgICBzZWxmLT5jaGFubmVsVHlwZSwKLSAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzLAotICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbE91dHB1dE1hcHBpbmcsCi0gICAgICAgICAgICAoc2VsZi0+bGltaXRlckVuYWJsZUN1cnIpID8gJnBjbUxpbWl0ZXJTY2FsZSA6IE5VTEwKLSAgICAgICk7Ci0gICAgaWYgKCAoRXJyb3JTdGF0dXMgPT0gQUFDX0RFQ19PSykKLSAgICAgICYmIChkbXhFcnIgPT0gUENNRE1YX0lOVkFMSURfTU9ERSkgKSB7Ci0gICAgICAvKiBBbm5vdW5jZSB0aGUgZnJhbWV3b3JrIHRoYXQgdGhlIGN1cnJlbnQgY29tYmluYXRpb24gb2YgY2hhbm5lbCBjb25maWd1cmF0aW9uIGFuZCBkb3dubWl4Ci0gICAgICAgKiBzZXR0aW5ncyBhcmUgbm90IGtub3cgdG8gcHJvZHVjZSBhIHByZWRpY3RhYmxlIGJlaGF2aW9yIGFuZCB0aHVzIG1heWJlIHByb2R1Y2Ugc3RyYW5nZSBvdXRwdXQuICovCi0gICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICAgICAgaWYgKCFzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZi5xbWZEb21haW5FeHBsaWNpdENvbmZpZyAmJgorICAgICAgICAgIHNlbGYtPm1wc0VuYWJsZUN1cnIpIHsKKyAgICAgICAgU0FDX0lOUFVUX0NPTkZJRyBzYWNfaW50ZXJmYWNlID0gKHNlbGYtPnNickVuYWJsZWQgJiYgc2VsZi0+aFNickRlY29kZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNBQ19JTlRFUkZBQ0VfUU1GCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNBQ19JTlRFUkZBQ0VfVElNRTsKKyAgICAgICAgLyogbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgZmlyc3QgU0JSIGFwcGx5LiAqLworICAgICAgICBtcGVnU3Vycm91bmREZWNvZGVyX0NvbmZpZ3VyZVFtZkRvbWFpbigKKyAgICAgICAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKXNlbGYtPnBNcGVnU3Vycm91bmREZWNvZGVyLCBzYWNfaW50ZXJmYWNlLAorICAgICAgICAgICAgKFVJTlQpc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlLCBzZWxmLT5zdHJlYW1JbmZvLmFvdCk7CisgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLm5RbWZUaW1lU2xvdHNfcmVxdWVzdGVkID0KKyAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lIC8KKyAgICAgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLm5CYW5kc0FuYWx5c2lzX3JlcXVlc3RlZDsKKyAgICAgIH0KKworICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYuVERpbnB1dCA9IHBUaW1lRGF0YTsKKworICAgICAgc3dpdGNoIChGREtfUW1mRG9tYWluX0NvbmZpZ3VyZSgmc2VsZi0+cW1mRG9tYWluKSkgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIFFNRl9ET01BSU5fSU5JVF9FUlJPUjoKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfVU5LTk9XTjsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIGNhc2UgUU1GX0RPTUFJTl9PVVRfT0ZfTUVNT1JZOgorICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PVVRfT0ZfTUVNT1JZOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgY2FzZSBRTUZfRE9NQUlOX09LOgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBzYnIgZGVjb2RlciAqLworCisgICAgICBpZiAoKEVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spIHx8IChmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSB8fAorICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bMF0tPmNvbmNlYWxtZW50SW5mby5jb25jZWFsU3RhdGUgPgorICAgICAgICAgICAgICBDb25jZWFsU3RhdGVfRmFkZUluKSB7CisgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOyAvKiBpZiBhbiBlcnJvciBoYXMgb2NjdXJlZCBkbyBjb25jZWFsbWVudCBpbiB0aGUgU0JSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyIHRvbyAqLworICAgICAgfQorCisgICAgICBpZiAoc2VsZi0+c2JyRW5hYmxlZCAmJiAoIShzZWxmLT5mbGFnc1swXSAmIEFDX1VTQUNfU0NGR0kzKSkpIHsKKyAgICAgICAgU0JSX0VSUk9SIHNickVycm9yID0gU0JSREVDX09LOworICAgICAgICBpbnQgY2hJZHgsIG51bUNvcmVDaGFubmVsID0gc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVsczsKKworICAgICAgICAvKiBzZXQgcGFyYW1zICovCisgICAgICAgIHNickRlY29kZXJfU2V0UGFyYW0oc2VsZi0+aFNickRlY29kZXIsIFNCUl9TWVNURU1fQklUU1RSRUFNX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnNiclBhcmFtcy5ic0RlbGF5KTsKKyAgICAgICAgc2JyRGVjb2Rlcl9TZXRQYXJhbSgKKyAgICAgICAgICAgIHNlbGYtPmhTYnJEZWNvZGVyLCBTQlJfRkxVU0hfREFUQSwKKyAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19GTFVTSCkgfAorICAgICAgICAgICAgICAgICgoc2VsZi0+Zmx1c2hTdGF0dXMgJiYgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSkgPyBBQUNERUNfRkxVU0gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCkpOworCisgICAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmFvdCA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgICAgICAgIC8qIENvbmZpZ3VyZSBRTUYgKi8KKyAgICAgICAgICBzYnJEZWNvZGVyX1NldFBhcmFtKHNlbGYtPmhTYnJEZWNvZGVyLCBTQlJfTERfUU1GX1RJTUVfQUxJR04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19NUFNfUFJFU0VOVCkgPyAxIDogMCk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgUENNRE1YX0VSUk9SIGRteEVycjsKKyAgICAgICAgICBJTlQgbWF4T3V0Q2ggPSAwOworCisgICAgICAgICAgZG14RXJyID0gcGNtRG14X0dldFBhcmFtKHNlbGYtPmhQY21VdGlscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMsICZtYXhPdXRDaCk7CisgICAgICAgICAgaWYgKChkbXhFcnIgPT0gUENNRE1YX09LKSAmJiAobWF4T3V0Q2ggPT0gMSkpIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgUFMgcHJvY2Vzc2luZyBpZiB3ZSBoYXZlIHRvIGNyZWF0ZSBhIG1vbm8gb3V0cHV0IHNpZ25hbC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2VsZi0+cHNQb3NzaWJsZSA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2JyRGVjb2Rlcl9TZXRQYXJhbShzZWxmLT5oU2JyRGVjb2RlciwgU0JSX1NLSVBfUU1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLT5tcHNFbmFibGVDdXJyKSA/IDIgOiAwKTsKKworICAgICAgICBJTlRfUENNICppbnB1dDsKKyAgICAgICAgaW5wdXQgPSAoSU5UX1BDTSAqKXNlbGYtPndvcmtCdWZmZXJDb3JlMjsKKyAgICAgICAgRkRLbWVtY3B5KGlucHV0LCBwVGltZURhdGEsCisgICAgICAgICAgICAgICAgICBzaXplb2YoSU5UX1BDTSkgKiAoc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscykgKgorICAgICAgICAgICAgICAgICAgICAgIChzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSkpOworCisgICAgICAgIC8qIGFwcGx5IFNCUiBwcm9jZXNzaW5nICovCisgICAgICAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9BcHBseShzZWxmLT5oU2JyRGVjb2RlciwgaW5wdXQsIHBUaW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVEYXRhU2l6ZSwgJnNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPm1hcERlc2NyLCBzZWxmLT5jaE1hcEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSywgJnNlbGYtPnBzUG9zc2libGUpOworCisgICAgICAgIGlmIChzYnJFcnJvciA9PSBTQlJERUNfT0spIHsKKyAgICAgICAgICAvKiBVcGRhdGUgZGF0YSBpbiBzdHJlYW1pbmZvIHN0cnVjdHVyZS4gQXNzdW1lIHRoYXQgdGhlIFNCUiB1cHNhbXBsaW5nCisgICAgICAgICAgICAgZmFjdG9yIGlzIGVpdGhlciAxLCAyLCA4LzMgb3IgNC4gTWF4aW11bSB1cHNhbXBsaW5nIGZhY3RvciBpcyA0CisgICAgICAgICAgICAgKENFTFArU0JSIG9yIFVTQUMgNDoxIFNCUikgKi8KKyAgICAgICAgICBzZWxmLT5mbGFnc1swXSB8PSBBQ19TQlJfUFJFU0VOVDsKKyAgICAgICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlICE9IHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSA+PiAyID09CisgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID0KKyAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lID4+IDI7CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgPSBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ID4+IDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSA+PiAxID09CisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSA9CisgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSA+PiAxOworICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ID0gc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSA+PiAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUgPDwgMSA9PQorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLnNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE7CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgPSBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5IDw8IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSA8PCAyID09CisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMjsKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSA9IHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgPDwgMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPT0gNzY4KSB7CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID0KKyAgICAgICAgICAgICAgICAgIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSA8PCAzKSAvIDM7CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgPQorICAgICAgICAgICAgICAgICAgKHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgPDwgMykgLyAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWU7CisgICAgICAgICAgfQorICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgKz0KKyAgICAgICAgICAgICAgc2JyRGVjb2Rlcl9HZXREZWxheShzZWxmLT5oU2JyRGVjb2Rlcik7CisKKyAgICAgICAgICBpZiAoc2VsZi0+cHNQb3NzaWJsZSkgeworICAgICAgICAgICAgc2VsZi0+ZmxhZ3NbMF0gfD0gQUNfUFNfUFJFU0VOVDsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yIChjaElkeCA9IG51bUNvcmVDaGFubmVsOyBjaElkeCA8IHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM7CisgICAgICAgICAgICAgICBjaElkeCArPSAxKSB7CisgICAgICAgICAgICBzZWxmLT5jaGFubmVsVHlwZVtjaElkeF0gPSBBQ1RfRlJPTlQ7CisgICAgICAgICAgICBzZWxmLT5jaGFubmVsSW5kaWNlc1tjaElkeF0gPSBjaElkeDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNickVycm9yID09IFNCUkRFQ19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCkgeworICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHNlbGYtPm1wc0VuYWJsZUN1cnIpIHsKKyAgICAgICAgaW50IGVyciwgc2FjX2ludGVyZmFjZSwgbkNoYW5uZWxzLCBmcmFtZVNpemU7CisKKyAgICAgICAgbkNoYW5uZWxzID0gc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVsczsKKyAgICAgICAgZnJhbWVTaXplID0gc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemU7CisgICAgICAgIHNhY19pbnRlcmZhY2UgPSBTQUNfSU5URVJGQUNFX1RJTUU7CisKKyAgICAgICAgaWYgKHNlbGYtPnNickVuYWJsZWQgJiYgc2VsZi0+aFNickRlY29kZXIpCisgICAgICAgICAgc2FjX2ludGVyZmFjZSA9IFNBQ19JTlRFUkZBQ0VfUU1GOworICAgICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICAgICAgICBpZiAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDX1NDRkdJMykgeworICAgICAgICAgICAgc2FjX2ludGVyZmFjZSA9IFNBQ19JTlRFUkZBQ0VfVElNRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gbXBlZ1N1cnJvdW5kRGVjb2Rlcl9TZXRQYXJhbSgKKyAgICAgICAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKXNlbGYtPnBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgICAgU0FDREVDX0lOVEVSRkFDRSwgc2FjX2ludGVyZmFjZSk7CisKKyAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgZXJyID0gbXBlZ1N1cnJvdW5kRGVjb2Rlcl9BcHBseSgKKyAgICAgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICAgIChJTlRfUENNICopc2VsZi0+d29ya0J1ZmZlckNvcmUyLCBwVGltZURhdGEsIHRpbWVEYXRhU2l6ZSwKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsICZuQ2hhbm5lbHMsICZmcmFtZVNpemUsCisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSwgc2VsZi0+c3RyZWFtSW5mby5hb3QsCisgICAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxUeXBlLCBzZWxmLT5jaGFubmVsSW5kaWNlcywgJnNlbGYtPm1hcERlc2NyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgPT0gTVBTX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAvKiBVcGRhdGUgb3V0cHV0IHBhcmFtZXRlciAqLworICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMgPSBuQ2hhbm5lbHM7CisgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPSBmcmFtZVNpemU7CisgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSArPSBtcGVnU3Vycm91bmREZWNvZGVyX0dldERlbGF5KAorICAgICAgICAgICAgICAoQ01wZWdTdXJyb3VuZERlY29kZXIgKilzZWxmLT5wTXBlZ1N1cnJvdW5kRGVjb2Rlcik7CisgICAgICAgICAgLyogU2F2ZSBjdXJyZW50IHBhcmFtZXRlciBmb3IgcG9zc2libGUgY29uY2VhbG1lbnQgb2YgbmV4dCBmcmFtZSAqLworICAgICAgICAgIHNlbGYtPm1wc091dENoYW5uZWxzTGFzdCA9IG5DaGFubmVsczsKKyAgICAgICAgICBzZWxmLT5tcHNGcmFtZVNpemVMYXN0ID0gZnJhbWVTaXplOworICAgICAgICB9IGVsc2UgaWYgKChzZWxmLT5tcHNPdXRDaGFubmVsc0xhc3QgPiAwKSAmJgorICAgICAgICAgICAgICAgICAgIChzZWxmLT5tcHNGcmFtZVNpemVMYXN0ID4gMCkpIHsKKyAgICAgICAgICAvKiBSZXN0b3JlIHBhcmFtZXRlcnMgb2YgbGFzdCBmcmFtZSAuLi4gKi8KKyAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzID0gc2VsZi0+bXBzT3V0Q2hhbm5lbHNMYXN0OworICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID0gc2VsZi0+bXBzRnJhbWVTaXplTGFzdDsKKyAgICAgICAgICAvKiAuLi4gYW5kIGNsZWFyIG91dHB1dCBidWZmZXIgc28gdGhhdCBwb3RlbnRpYWxseSBjb3JydXB0ZWQgZGF0YSBkb2VzCisgICAgICAgICAgICogbm90IHJlYWNoIHRoZSBmcmFtZXdvcmsuICovCisgICAgICAgICAgRkRLbWVtY2xlYXIocFRpbWVEYXRhLCBzZWxmLT5tcHNPdXRDaGFubmVsc0xhc3QgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm1wc0ZyYW1lU2l6ZUxhc3QgKiBzaXplb2YoSU5UX1BDTSkpOworICAgICAgICAgIC8qIEFkZGl0aW9uYWxseSBwcm9jbGFpbSB0aGF0IHRoaXMgZnJhbWUgaGFkIGVycm9ycyBkdXJpbmcgZGVjb2RpbmcuCisgICAgICAgICAgICovCisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfVU5LTk9XTjsgLyogbm8gb3V0cHV0ICovCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogU0JSIGRlY29kZXIgZm9yIFVuaWZpZWQgU3RlcmVvIENvbmZpZyAoc3RlcmVvQ29uZmlnSW5kZXggPT0gMykgKi8KKworICAgICAgaWYgKHNlbGYtPnNickVuYWJsZWQgJiYgKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQ19TQ0ZHSTMpKSB7CisgICAgICAgIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKKworICAgICAgICAvKiBzZXQgcGFyYW1zICovCisgICAgICAgIHNickRlY29kZXJfU2V0UGFyYW0oc2VsZi0+aFNickRlY29kZXIsIFNCUl9TWVNURU1fQklUU1RSRUFNX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnNiclBhcmFtcy5ic0RlbGF5KTsKKworICAgICAgICBzYnJEZWNvZGVyX1NldFBhcmFtKHNlbGYtPmhTYnJEZWNvZGVyLCBTQlJfU0tJUF9RTUYsIDEpOworCisgICAgICAgIC8qIGFwcGx5IFNCUiBwcm9jZXNzaW5nICovCisgICAgICAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9BcHBseShzZWxmLT5oU2JyRGVjb2RlciwgcFRpbWVEYXRhLCBwVGltZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lRGF0YVNpemUsICZzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5tYXBEZXNjciwgc2VsZi0+Y2hNYXBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZyYW1lT0ssICZzZWxmLT5wc1Bvc3NpYmxlKTsKKworICAgICAgICBpZiAoc2JyRXJyb3IgPT0gU0JSREVDX09LKSB7CisgICAgICAgICAgLyogVXBkYXRlIGRhdGEgaW4gc3RyZWFtaW5mbyBzdHJ1Y3R1cmUuIEFzc3VtZSB0aGF0IHRoZSBTQlIgdXBzYW1wbGluZworICAgICAgICAgICAqIGZhY3RvciBpcyBlaXRoZXIgMSwyIG9yIDQgKi8KKyAgICAgICAgICBzZWxmLT5mbGFnc1swXSB8PSBBQ19TQlJfUFJFU0VOVDsKKyAgICAgICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlICE9IHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID09IDc2OCkgeworICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSA9CisgICAgICAgICAgICAgICAgICAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgKiA4KSAvIDM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSA8PCAyID09CisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHNlbGYtPmZsYWdzWzBdICY9IH5BQ19QU19QUkVTRU5UOworICAgICAgICB9CisgICAgICAgIGlmIChzYnJFcnJvciA9PSBTQlJERUNfT1VUUFVUX0JVRkZFUl9UT09fU01BTEwpIHsKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfT1VUUFVUX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFVzZSBkZWRpY2F0ZWQgbWVtb3J5IGZvciBQQ00gcG9zdHByb2Nlc3NpbmcgKi8KKyAgICAgIHBUaW1lRGF0YVBjbVBvc3QgPSBzZWxmLT5wVGltZURhdGEyOworICAgICAgdGltZURhdGFQY21Qb3N0U2l6ZSA9IHNlbGYtPnRpbWVEYXRhMlNpemU7CisKKyAgICAgIHsKKyAgICAgICAgY29uc3QgaW50IHNpemUgPQorICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgKiBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzOworICAgICAgICBGREtfQVNTRVJUKHRpbWVEYXRhUGNtUG9zdFNpemUgPj0gc2l6ZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgcFRpbWVEYXRhUGNtUG9zdFtpXSA9CisgICAgICAgICAgICAgIChQQ01fREVDKUZYX1BDTTJQQ01fREVDKHBUaW1lRGF0YVtpXSkgPj4gUENNX09VVF9IRUFEUk9PTTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB7CisgICAgICAgIGlmICgoRkRLX2RyY0RlY19HZXRQYXJhbShzZWxmLT5oVW5pRHJjRGVjb2RlciwgRFJDX0RFQ19JU19BQ1RJVkUpKSAmJgorICAgICAgICAgICAgIShzZWxmLT5mbGFnc1swXSAmIEFDX1JTVjYwM0RBKSkgeworICAgICAgICAgIC8qIEFwcGx5IERSQyBnYWlucyovCisgICAgICAgICAgaW50IGNoLCBkcmNEZWxheSA9IDA7CisgICAgICAgICAgaW50IG5lZWRzRGVpbnRlcmxlYXZpbmcgPSAwOworICAgICAgICAgIEZJWFBfREJMICpkcmNXb3JrQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICBGSVhQX0RCTCBjaGFubmVsR2FpblsoOCldOworICAgICAgICAgIGludCByZXZlcnNlSW5DaGFubmVsTWFwWyg4KV07CisgICAgICAgICAgaW50IHJldmVyc2VPdXRDaGFubmVsTWFwWyg4KV07CisgICAgICAgICAgaW50IG51bURyY091dENoYW5uZWxzID0gRkRLX2RyY0RlY19HZXRQYXJhbSgKKyAgICAgICAgICAgICAgc2VsZi0+aFVuaURyY0RlY29kZXIsIERSQ19ERUNfVEFSR0VUX0NIQU5ORUxfQ09VTlRfU0VMRUNURUQpOworICAgICAgICAgIEZES21lbWNsZWFyKGNoYW5uZWxHYWluLCBzaXplb2YoY2hhbm5lbEdhaW4pKTsKKyAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCAoOCk7IGNoKyspIHsKKyAgICAgICAgICAgIHJldmVyc2VJbkNoYW5uZWxNYXBbY2hdID0gY2g7CisgICAgICAgICAgICByZXZlcnNlT3V0Q2hhbm5lbE1hcFtjaF0gPSBjaDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBJZiBTQlIgYW5kL29yIE1QUyBpcyBhY3RpdmUsIHRoZSBEUkMgZ2FpbnMgYXJlIGFsaWduZWQgdG8gdGhlIFFNRgorICAgICAgICAgICAgIGRvbWFpbiBzaWduYWwgYmVmb3JlIHRoZSBRTUYgc3ludGhlc2lzLiBUaGVyZWZvcmUgdGhlIERSQyBnYWlucworICAgICAgICAgICAgIG5lZWQgdG8gYmUgZGVsYXllZCBieSB0aGUgUU1GIHN5bnRoZXNpcyBkZWxheS4gKi8KKyAgICAgICAgICBpZiAoc2VsZi0+c2JyRW5hYmxlZCkgZHJjRGVsYXkgPSAyNTc7CisgICAgICAgICAgaWYgKHNlbGYtPm1wc0VuYWJsZUN1cnIpIGRyY0RlbGF5ID0gMjU3OworICAgICAgICAgIC8qIFRha2UgaW50byBhY2NvdW50IGNvbmNlYWxtZW50IGRlbGF5ICovCisgICAgICAgICAgZHJjRGVsYXkgKz0gQ0NvbmNlYWxtZW50X0dldERlbGF5KCZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSkgKgorICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplOworCisgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgVUNIQVIgbWFwVmFsdWUgPSBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZSgKKyAgICAgICAgICAgICAgICAmc2VsZi0+bWFwRGVzY3IsIChVQ0hBUiljaCwgc2VsZi0+Y2hNYXBJbmRleCk7CisgICAgICAgICAgICBpZiAobWFwVmFsdWUgPCAoOCkpIHJldmVyc2VJbkNoYW5uZWxNYXBbbWFwVmFsdWVdID0gY2g7CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IChpbnQpbnVtRHJjT3V0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIFVDSEFSIG1hcFZhbHVlID0gRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUoCisgICAgICAgICAgICAgICAgJnNlbGYtPm1hcERlc2NyLCAoVUNIQVIpY2gsIG51bURyY091dENoYW5uZWxzKTsKKyAgICAgICAgICAgIGlmIChtYXBWYWx1ZSA8ICg4KSkgcmV2ZXJzZU91dENoYW5uZWxNYXBbbWFwVmFsdWVdID0gY2g7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogVGhlIG91dHB1dCBvZiBTQlIgYW5kIE1QUyBpcyBpbnRlcmxlYXZlZC4gRGVpbnRlcmxlYXZpbmcgbWF5IGJlCisgICAgICAgICAgICogbmVjZXNzYXJ5IGZvciBGREtfZHJjRGVjX1Byb2Nlc3NUaW1lLCB3aGljaCBhY2NlcHRzIGRlaW50ZXJsZWF2ZWQKKyAgICAgICAgICAgKiBhdWRpbyBvbmx5LiAqLworICAgICAgICAgIGlmICgoc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA+IDEpICYmCisgICAgICAgICAgICAgICgwIHx8IChzZWxmLT5zYnJFbmFibGVkKSB8fCAoc2VsZi0+bXBzRW5hYmxlQ3VycikpKSB7CisgICAgICAgICAgICAvKiBpbnRlcmxlYXZpbmcvZGVpbnRlcmxlYXZpbmcgaXMgcGVyZm9ybWVkIG9uIHVwcGVyIHBhcnQgb2YKKyAgICAgICAgICAgICAqIHBUaW1lRGF0YVBjbVBvc3QuIENoZWNrIGlmIHRoaXMgYnVmZmVyIGlzIGxhcmdlIGVub3VnaC4gKi8KKyAgICAgICAgICAgIGlmICh0aW1lRGF0YVBjbVBvc3RTaXplIDwKKyAgICAgICAgICAgICAgICAoSU5UKSgyICogc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgKiBzaXplb2YoUENNX0RFQykpKSB7CisgICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTktOT1dOOworICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZWVkc0RlaW50ZXJsZWF2aW5nID0gMTsKKyAgICAgICAgICAgIGRyY1dvcmtCdWZmZXIgPQorICAgICAgICAgICAgICAgIChGSVhQX0RCTCAqKXBUaW1lRGF0YVBjbVBvc3QgKworICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMgKiBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZTsKKyAgICAgICAgICAgIEZES19kZWludGVybGVhdmUoCisgICAgICAgICAgICAgICAgcFRpbWVEYXRhUGNtUG9zdCwgZHJjV29ya0J1ZmZlciwgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscywKKyAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSwgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcmNXb3JrQnVmZmVyID0gKEZJWFBfREJMICopcFRpbWVEYXRhUGNtUG9zdDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBwcmVwYXJlIExvdWRuZXNzIE5vcm1hbGlzYXRpb24gZ2FpbiAqLworICAgICAgICAgIEZES19kcmNEZWNfU2V0UGFyYW0oc2VsZi0+aFVuaURyY0RlY29kZXIsIERSQ19ERUNfVEFSR0VUX0xPVURORVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCktc2VsZi0+ZGVmYXVsdFRhcmdldExvdWRuZXNzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDkpKSk7CisgICAgICAgICAgRkRLX2RyY0RlY19TZXRDaGFubmVsR2FpbnMoc2VsZi0+aFVuaURyY0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSwgY2hhbm5lbEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJjV29ya0J1ZmZlciwgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUpOworICAgICAgICAgIEZES19kcmNEZWNfUHJlcHJvY2VzcyhzZWxmLT5oVW5pRHJjRGVjb2Rlcik7CisKKyAgICAgICAgICAvKiBhcHBseSBEUkMxIGdhaW4gc2VxdWVuY2UgKi8KKyAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBGREtfZHJjRGVjX1Byb2Nlc3NUaW1lKHNlbGYtPmhVbmlEcmNEZWNvZGVyLCBkcmNEZWxheSwgRFJDX0RFQ19EUkMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCwgcmV2ZXJzZUluQ2hhbm5lbE1hcFtjaF0gLSBjaCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJjV29ya0J1ZmZlciwgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUpOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBhcHBseSBkb3dubWl4ICovCisgICAgICAgICAgRkRLX2RyY0RlY19BcHBseURvd25taXgoCisgICAgICAgICAgICAgIHNlbGYtPmhVbmlEcmNEZWNvZGVyLCByZXZlcnNlSW5DaGFubmVsTWFwLCByZXZlcnNlT3V0Q2hhbm5lbE1hcCwKKyAgICAgICAgICAgICAgZHJjV29ya0J1ZmZlciwKKyAgICAgICAgICAgICAgJnNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMpOyAvKiBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGNoYW5nZSBoZXJlICovCisgICAgICAgICAgLyogYXBwbHkgRFJDMi8zIGdhaW4gc2VxdWVuY2UgKi8KKyAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBGREtfZHJjRGVjX1Byb2Nlc3NUaW1lKHNlbGYtPmhVbmlEcmNEZWNvZGVyLCBkcmNEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJDX0RFQ19EUkMyX0RSQzMsIGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlT3V0Q2hhbm5lbE1hcFtjaF0gLSBjaCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJjV29ya0J1ZmZlciwgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChuZWVkc0RlaW50ZXJsZWF2aW5nKSB7CisgICAgICAgICAgICBGREtfaW50ZXJsZWF2ZSgKKyAgICAgICAgICAgICAgICBkcmNXb3JrQnVmZmVyLCBwVGltZURhdGFQY21Qb3N0LCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplLCBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmV4dEFvdCAhPSBBT1RfQUFDX1NMUykgeworICAgICAgICBJTlQgcGNtTGltaXRlclNjYWxlID0gMDsKKyAgICAgICAgUENNRE1YX0VSUk9SIGRteEVyciA9IFBDTURNWF9PSzsKKyAgICAgICAgaWYgKGZsYWdzICYgKEFBQ0RFQ19JTlRSKSkgeworICAgICAgICAgIC8qIGRlbGV0ZSBkYXRhIGZyb20gdGhlIHBhc3QgKGUuZy4gbWl4ZG93biBjb2VmaWNpZW50cykgKi8KKyAgICAgICAgICBwY21EbXhfUmVzZXQoc2VsZi0+aFBjbVV0aWxzLCBQQ01ETVhfUkVTRVRfQlNfREFUQSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICYgKEFBQ0RFQ19DTFJISVNUKSkgeworICAgICAgICAgIGlmICghKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQykpIHsKKyAgICAgICAgICAgIC8qIGRlbGV0ZSBkYXRhIGZyb20gdGhlIHBhc3QgKGUuZy4gbWl4ZG93biBjb2VmaWNpZW50cykgKi8KKyAgICAgICAgICAgIHBjbURteF9SZXNldChzZWxmLT5oUGNtVXRpbHMsIFBDTURNWF9SRVNFVF9CU19EQVRBKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBJTlQgaW50ZXJsZWF2ZWQgPSAwOworICAgICAgICBpbnRlcmxlYXZlZCB8PSAoc2VsZi0+c2JyRW5hYmxlZCkgPyAxIDogMDsKKyAgICAgICAgaW50ZXJsZWF2ZWQgfD0gKHNlbGYtPm1wc0VuYWJsZUN1cnIpID8gMSA6IDA7CisKKyAgICAgICAgLyogZG8gUENNIHBvc3QgcHJvY2Vzc2luZyAqLworICAgICAgICBkbXhFcnIgPSBwY21EbXhfQXBwbHlGcmFtZSgKKyAgICAgICAgICAgIHNlbGYtPmhQY21VdGlscywgcFRpbWVEYXRhUGNtUG9zdCwgdGltZURhdGFGaXhwUGNtU2l6ZSwKKyAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplLCAmc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscywKKyAgICAgICAgICAgIGludGVybGVhdmVkLCBzZWxmLT5jaGFubmVsVHlwZSwgc2VsZi0+Y2hhbm5lbEluZGljZXMsCisgICAgICAgICAgICAmc2VsZi0+bWFwRGVzY3IsCisgICAgICAgICAgICAoc2VsZi0+bGltaXRlckVuYWJsZUN1cnIpID8gJnBjbUxpbWl0ZXJTY2FsZSA6IE5VTEwpOworICAgICAgICBpZiAoZG14RXJyID09IFBDTURNWF9PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCkgeworICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSAmJiAoZG14RXJyID09IFBDTURNWF9JTlZBTElEX01PREUpKSB7CisgICAgICAgICAgLyogQW5ub3VuY2UgdGhlIGZyYW1ld29yayB0aGF0IHRoZSBjdXJyZW50IGNvbWJpbmF0aW9uIG9mIGNoYW5uZWwKKyAgICAgICAgICAgKiBjb25maWd1cmF0aW9uIGFuZCBkb3dubWl4IHNldHRpbmdzIGFyZSBub3Qga25vdyB0byBwcm9kdWNlIGEKKyAgICAgICAgICAgKiBwcmVkaWN0YWJsZSBiZWhhdmlvciBhbmQgdGh1cyBtYXliZSBwcm9kdWNlIHN0cmFuZ2Ugb3V0cHV0LiAqLworICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ3MgJiBBQUNERUNfQ0xSSElTVCkgeworICAgICAgICAgIGlmICghKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQykpIHsKKyAgICAgICAgICAgIC8qIERlbGV0ZSB0aGUgZGVsYXllZCBzaWduYWwuICovCisgICAgICAgICAgICBwY21MaW1pdGVyX1Jlc2V0KHNlbGYtPmhMaW1pdGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi0+bGltaXRlckVuYWJsZUN1cnIpIHsKKyAgICAgICAgICAvKiB1c2Ugd29ya0J1ZmZlckNvcmUyIGJ1ZmZlciBmb3IgaW50ZXJsZWF2aW5nICovCisgICAgICAgICAgUENNX0xJTSAqcEludGVybGVhdmVCdWZmZXI7CisgICAgICAgICAgaW50IGJsb2NrTGVuZ3RoID0gc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemU7CisKKyAgICAgICAgICAvKiBTZXQgYWN0dWFsIHNpZ25hbCBwYXJhbWV0ZXJzICovCisgICAgICAgICAgcGNtTGltaXRlcl9TZXROQ2hhbm5lbHMoc2VsZi0+aExpbWl0ZXIsIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMpOworICAgICAgICAgIHBjbUxpbWl0ZXJfU2V0U2FtcGxlUmF0ZShzZWxmLT5oTGltaXRlciwgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKTsKKyAgICAgICAgICBwY21MaW1pdGVyU2NhbGUgKz0gUENNX09VVF9IRUFEUk9PTTsKKworICAgICAgICAgIGlmICgoc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA9PSAxKSB8fCAoc2VsZi0+c2JyRW5hYmxlZCkgfHwKKyAgICAgICAgICAgICAgKHNlbGYtPm1wc0VuYWJsZUN1cnIpKSB7CisgICAgICAgICAgICBwSW50ZXJsZWF2ZUJ1ZmZlciA9IChQQ01fTElNICopcFRpbWVEYXRhUGNtUG9zdDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcEludGVybGVhdmVCdWZmZXIgPSAoUENNX0xJTSAqKXBUaW1lRGF0YTsKKyAgICAgICAgICAgIC8qIGFwcGx5TGltaXRlciByZXF1ZXN0cyBmb3IgaW50ZXJsZWF2ZWQgZGF0YSAqLworICAgICAgICAgICAgLyogSW50ZXJsZWF2ZSBvdXB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgIEZES19pbnRlcmxlYXZlKHBUaW1lRGF0YVBjbVBvc3QsIHBJbnRlcmxlYXZlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscywgYmxvY2tMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcGNtTGltaXRlcl9BcHBseShzZWxmLT5oTGltaXRlciwgcEludGVybGVhdmVCdWZmZXIsIHBUaW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmV4dEdhaW4sICZwY21MaW1pdGVyU2NhbGUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5leHRHYWluRGVsYXksIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplKTsKKworICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFubm91bmNlIHRoZSBhZGRpdGlvbmFsIGxpbWl0ZXIgb3V0cHV0IGRlbGF5ICovCisgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ICs9IHBjbUxpbWl0ZXJfR2V0RGVsYXkoc2VsZi0+aExpbWl0ZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBJZiBudW1DaGFubmVscyA9IDEgd2UgZG8gbm90IG5lZWQgaW50ZXJsZWF2aW5nLiBUaGUgc2FtZSBhcHBsaWVzIGlmCisgICAgICAgICAgU0JSIG9yIE1QUyBhcmUgdXNlZCwgc2luY2UgdGhlaXIgb3V0cHV0IGlzIGludGVybGVhdmVkIGFscmVhZHkKKyAgICAgICAgICAocmVzYW1wbGVkIG9yIG5vdCkgKi8KKyAgICAgICAgICBpZiAoKHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMgPT0gMSkgfHwgKHNlbGYtPnNickVuYWJsZWQpIHx8CisgICAgICAgICAgICAgIChzZWxmLT5tcHNFbmFibGVDdXJyKSkgeworICAgICAgICAgICAgc2NhbGVWYWx1ZXNTYXR1cmF0ZSgKKyAgICAgICAgICAgICAgICBwVGltZURhdGEsIHBUaW1lRGF0YVBjbVBvc3QsCisgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgKiBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgIFBDTV9PVVRfSEVBRFJPT00pOworCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNjYWxlVmFsdWVzU2F0dXJhdGUoCisgICAgICAgICAgICAgICAgKElOVF9QQ00gKilzZWxmLT53b3JrQnVmZmVyQ29yZTIsIHBUaW1lRGF0YVBjbVBvc3QsCisgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgKiBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgIFBDTV9PVVRfSEVBRFJPT00pOworICAgICAgICAgICAgLyogSW50ZXJsZWF2ZSBvdXB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgIEZES19pbnRlcmxlYXZlKChJTlRfUENNICopc2VsZi0+d29ya0J1ZmZlckNvcmUyLCBwVGltZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IC8qIGlmIChzZWxmLT5zdHJlYW1JbmZvLmV4dEFvdCAhPSBBT1RfQUFDX1NMUykqLworCisgICAgICBpZiAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDKSB7CisgICAgICAgIGlmIChzZWxmLT5mbHVzaFN0YXR1cyA9PSBBQUNERUNfVVNBQ19EQVNIX0lQRl9GTFVTSF9PTiAmJgorICAgICAgICAgICAgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSkgeworICAgICAgICAgIENBYWNEZWNvZGVyX1ByZXBhcmVDcm9zc0ZhZGUocFRpbWVEYXRhLCBzZWxmLT5wVGltZURhdGFGbHVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSwgMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcmVwYXJlIGNyb3NzZmFkZSBidWZmZXIgZm9yIGZhZGUgaW4gKi8KKyAgICAgICAgaWYgKCFhcHBseUNyb3NzZmFkZSAmJiBzZWxmLT5hcHBseUNyb3NzZmFkZSAmJgorICAgICAgICAgICAgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSkgeworICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFRJTUVfREFUQV9GTFVTSF9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgICAgc2VsZi0+cFRpbWVEYXRhRmx1c2hbY2hdW2ldID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYXBwbHlDcm9zc2ZhZGUgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFwcGx5Q3Jvc3NmYWRlICYmIHNlbGYtPmFwcGx5Q3Jvc3NmYWRlICYmCisgICAgICAgICAgICAhKGFjY2Vzc1VuaXQgPCBudW1QcmVyb2xsQVUpICYmCisgICAgICAgICAgICAoc2VsZi0+YnVpbGRVcFN0YXR1cyA9PSBBQUNERUNfVVNBQ19CVUlMRF9VUF9PTikpIHsKKyAgICAgICAgICBDQWFjRGVjb2Rlcl9BcHBseUNyb3NzRmFkZShwVGltZURhdGEsIHNlbGYtPnBUaW1lRGF0YUZsdXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUsIDEpOworICAgICAgICAgIHNlbGYtPmFwcGx5Q3Jvc3NmYWRlID0gMDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBTaWduYWwgaW50ZXJydXB0aW9uIHRvIHRha2UgZWZmZWN0IGluIG5leHQgZnJhbWUuICovCisgICAgICBpZiAoKGZsYWdzICYgQUFDREVDX0ZMVVNIIHx8IHNlbGYtPmZsdXNoU3RhdHVzKSAmJgorICAgICAgICAgICEoZmxhZ3MgJiBBQUNERUNfQ09OQ0VBTCkpIHsKKyAgICAgICAgYWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oc2VsZik7CisgICAgICB9CisKKyAgICAgIC8qIFVwZGF0ZSBleHRlcm5hbGx5IHZpc2libGUgY29weSBvZiBmbGFncyAqLworICAgICAgc2VsZi0+c3RyZWFtSW5mby5mbGFncyA9IHNlbGYtPmZsYWdzWzBdOworCisgICAgfSAvKiBVU0FDIERBU0ggSVBGIGZsdXNoaW5nIHBvc3NpYmxlIGVuZCAqLworICAgIGlmIChhY2Nlc3NVbml0IDwgbnVtUHJlcm9sbEFVKSB7CisgICAgICBGREtwdXNoQmFjayhoQnNBdSwgYXVTdGFydEFuY2hvciAtIEZES2dldFZhbGlkQml0cyhoQnNBdSkpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKHNlbGYtPmJ1aWxkVXBTdGF0dXMgPT0gQUFDREVDX1JTVjYwX0JVSUxEX1VQX09OKSB8fAorICAgICAgICAgIChzZWxmLT5idWlsZFVwU3RhdHVzID09IEFBQ0RFQ19SU1Y2MF9CVUlMRF9VUF9PTl9JTl9CQU5EKSB8fAorICAgICAgICAgIChzZWxmLT5idWlsZFVwU3RhdHVzID09IEFBQ0RFQ19VU0FDX0JVSUxEX1VQX09OKSkgeworICAgICAgICBzZWxmLT5idWlsZFVwQ250LS07CisKKyAgICAgICAgaWYgKHNlbGYtPmJ1aWxkVXBDbnQgPCAwKSB7CisgICAgICAgICAgc2VsZi0+YnVpbGRVcFN0YXR1cyA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQykgeworICAgICAgICBpZiAoc2VsZi0+Zmx1c2hTdGF0dXMgPT0gQUFDREVDX1VTQUNfREFTSF9JUEZfRkxVU0hfT04gJiYKKyAgICAgICAgICAgICEoZmxhZ3MgJiBBQUNERUNfQ09OQ0VBTCkpIHsKKyAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIGZsYWdzICYgQUFDREVDX0NMUkhJU1QgKSB7Ci0gICAgICAvKiBEZWxldGUgdGhlIGRlbGF5ZWQgc2lnbmFsLiAqLwotICAgICAgcmVzZXRMaW1pdGVyKHNlbGYtPmhMaW1pdGVyKTsKKyAgICBpZiAoc2VsZi0+Zmx1c2hTdGF0dXMgIT0gQUFDREVDX1VTQUNfREFTSF9JUEZfRkxVU0hfT04pIHsKKyAgICAgIGFjY2Vzc1VuaXQrKzsKICAgICB9Ci0gICAgaWYgKHNlbGYtPmxpbWl0ZXJFbmFibGVDdXJyKQotICAgIHsKLSAgICAgIC8qIFNldCBhY3R1YWwgc2lnbmFsIHBhcmFtZXRlcnMgKi8KLSAgICAgIHNldExpbWl0ZXJOQ2hhbm5lbHMoc2VsZi0+aExpbWl0ZXIsIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMpOwotICAgICAgc2V0TGltaXRlclNhbXBsZVJhdGUoc2VsZi0+aExpbWl0ZXIsIHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSk7Ci0KLSAgICAgIGFwcGx5TGltaXRlcigKLSAgICAgICAgICAgICAgc2VsZi0+aExpbWl0ZXIsCi0gICAgICAgICAgICAgIHBUaW1lRGF0YSwKLSAgICAgICAgICAgICAgc2VsZi0+ZXh0R2FpbiwKLSAgICAgICAgICAgICAmcGNtTGltaXRlclNjYWxlLAotICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICBzZWxmLT5leHRHYWluRGVsYXksCi0gICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplCi0gICAgICAgICAgICAgICk7Ci0KLSAgICAgIC8qIEFubm91bmNlIHRoZSBhZGRpdGlvbmFsIGxpbWl0ZXIgb3V0cHV0IGRlbGF5ICovCi0gICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ICs9IGdldExpbWl0ZXJEZWxheShzZWxmLT5oTGltaXRlcik7Ci0gICAgfQotICAgIH0KLQotCi0gICAgLyogU2lnbmFsIGludGVycnVwdGlvbiB0byB0YWtlIGVmZmVjdCBpbiBuZXh0IGZyYW1lLiAqLwotICAgIGlmICggZmxhZ3MgJiBBQUNERUNfRkxVU0ggKSB7Ci0gICAgICBhYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgZXh0ZXJuYWxseSB2aXNpYmxlIGNvcHkgb2YgZmxhZ3MgKi8KLSAgICBzZWxmLT5zdHJlYW1JbmZvLmZsYWdzID0gc2VsZi0+ZmxhZ3M7CisgIH0gd2hpbGUgKChhY2Nlc3NVbml0IDwgbnVtQWNjZXNzVW5pdHMpIHx8CisgICAgICAgICAgICgoc2VsZi0+Zmx1c2hTdGF0dXMgPT0gQUFDREVDX1VTQUNfREFTSF9JUEZfRkxVU0hfT04pICYmCisgICAgICAgICAgICAhKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpKSk7CiAKIGJhaWw6CiAKLSAgICAvKiBVcGRhdGUgU3RhdGlzdGljcyAqLwotICAgIGFhY0RlY29kZXJfVXBkYXRlQml0U3RyZWFtQ291bnRlcnMoJnNlbGYtPnN0cmVhbUluZm8sIGhCcywgbkJpdHMsIEVycm9yU3RhdHVzKTsKKyAgLyogZXJyb3IgaW4gcmVuZGVyZXIgcGFydCBvY2N1cnJlZCwgRXJyb3JTdGF0dXMgd2FzIHNldCB0byBpbnZhbGlkIG91dHB1dCAqLworICBpZiAoZkVuZEF1Tm90QWRqdXN0ZWQgJiYgIUlTX09VVFBVVF9WQUxJRChFcnJvclN0YXR1cykgJiYKKyAgICAgIChhY2Nlc3NVbml0IDwgbnVtUHJlcm9sbEFVKSkgeworICAgIHRyYW5zcG9ydERlY19FbmRBY2Nlc3NVbml0KHNlbGYtPmhJbnB1dCk7CisgIH0KIAotICAgIC8qIENoZWNrIHdoZXRoZXIgZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2guICovCi0gICAgaWYgKHRpbWVEYXRhU2l6ZV9leHRlcm4gPCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzKnNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplKSB7Ci0gICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfT1VUUFVUX0JVRkZFUl9UT09fU01BTEw7Ci0gICAgfQorICAvKiBVcGRhdGUgU3RhdGlzdGljcyAqLworICBhYWNEZWNvZGVyX1VwZGF0ZUJpdFN0cmVhbUNvdW50ZXJzKCZzZWxmLT5zdHJlYW1JbmZvLCBoQnMsIG5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzKTsKKyAgaWYgKCgoc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA8PSAwKSB8fAorICAgICAgIChzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSA8PSAwKSB8fAorICAgICAgIChzZWxmLT5zdHJlYW1JbmZvLnNhbXBsZVJhdGUgPD0gMCkpICYmCisgICAgICBJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpKSB7CisgICAgLyogRW5zdXJlIGNvbnNpc3RlbmN5IG9mIElTX09VVFBVVF9WQUxJRCgpIG1hY3JvLiAqLworICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTktOT1dOOworICB9CiAKLSAgICAvKiBVcGRhdGUgZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlci4gKi8KLSAgICBpZiAoIElTX09VVFBVVF9WQUxJRChFcnJvclN0YXR1cykgKSB7Ci0gICAgICBGREttZW1jcHkocFRpbWVEYXRhX2V4dGVybiwgcFRpbWVEYXRhLCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzKnNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplKnNpemVvZigqcFRpbWVEYXRhKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgRkRLbWVtY2xlYXIocFRpbWVEYXRhX2V4dGVybiwgdGltZURhdGFTaXplX2V4dGVybipzaXplb2YoKnBUaW1lRGF0YV9leHRlcm4pKTsKLSAgICB9CisgIC8qIENoZWNrIHdoZXRoZXIgZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2guICovCisgIGlmICh0aW1lRGF0YVNpemVfZXh0ZXJuIDwKKyAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMgKiBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSkgeworICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTDsKKyAgfQogCi0gICAgcmV0dXJuIEVycm9yU3RhdHVzOworICAvKiBVcGRhdGUgZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlci4gKi8KKyAgaWYgKElTX09VVFBVVF9WQUxJRChFcnJvclN0YXR1cykpIHsKKyAgICBGREttZW1jcHkocFRpbWVEYXRhX2V4dGVybiwgcFRpbWVEYXRhLAorICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzICogc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgKgorICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwVGltZURhdGEpKTsKKyAgfSBlbHNlIHsKKyAgICBGREttZW1jbGVhcihwVGltZURhdGFfZXh0ZXJuLAorICAgICAgICAgICAgICAgIHRpbWVEYXRhU2l6ZV9leHRlcm4gKiBzaXplb2YoKnBUaW1lRGF0YV9leHRlcm4pKTsKKyAgfQorCisgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAotTElOS1NQRUNfQ1BQIHZvaWQgYWFjRGVjb2Rlcl9DbG9zZSAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgKQotewotICBpZiAoc2VsZiA9PSBOVUxMKQotICAgIHJldHVybjsKLQorTElOS1NQRUNfQ1BQIHZvaWQgYWFjRGVjb2Rlcl9DbG9zZShIQU5ETEVfQUFDREVDT0RFUiBzZWxmKSB7CisgIGlmIChzZWxmID09IE5VTEwpIHJldHVybjsKIAogICBpZiAoc2VsZi0+aExpbWl0ZXIgIT0gTlVMTCkgewotICAgIGRlc3Ryb3lMaW1pdGVyKHNlbGYtPmhMaW1pdGVyKTsKKyAgICBwY21MaW1pdGVyX0Rlc3Ryb3koc2VsZi0+aExpbWl0ZXIpOwogICB9CiAKICAgaWYgKHNlbGYtPmhQY21VdGlscyAhPSBOVUxMKSB7Ci0gICAgcGNtRG14X0Nsb3NlKCAmc2VsZi0+aFBjbVV0aWxzICk7CisgICAgcGNtRG14X0Nsb3NlKCZzZWxmLT5oUGNtVXRpbHMpOwogICB9CiAKKyAgRkRLX2RyY0RlY19DbG9zZSgmc2VsZi0+aFVuaURyY0RlY29kZXIpOwogCisgIGlmIChzZWxmLT5wTXBlZ1N1cnJvdW5kRGVjb2RlciAhPSBOVUxMKSB7CisgICAgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9DbG9zZSgKKyAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIpOworICB9CiAKICAgaWYgKHNlbGYtPmhTYnJEZWNvZGVyICE9IE5VTEwpIHsKICAgICBzYnJEZWNvZGVyX0Nsb3NlKCZzZWxmLT5oU2JyRGVjb2Rlcik7CkBAIC0xMDk1LDI0ICsxOTU5LDI0IEBACiAgIENBYWNEZWNvZGVyX0Nsb3NlKHNlbGYpOwogfQogCi0KLUxJTktTUEVDX0NQUCBDU3RyZWFtSW5mbyogYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiApCi17CitMSU5LU1BFQ19DUFAgQ1N0cmVhbUluZm8gKmFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbyhIQU5ETEVfQUFDREVDT0RFUiBzZWxmKSB7CiAgIHJldHVybiBDQWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKHNlbGYpOwogfQogCi1MSU5LU1BFQ19DUFAgSU5UIGFhY0RlY29kZXJfR2V0TGliSW5mbyAoIExJQl9JTkZPICppbmZvICkKLXsKK0xJTktTUEVDX0NQUCBJTlQgYWFjRGVjb2Rlcl9HZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKSB7CiAgIGludCBpOwogCiAgIGlmIChpbmZvID09IE5VTEwpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KIAotICBzYnJEZWNvZGVyX0dldExpYkluZm8oIGluZm8gKTsKLSAgdHJhbnNwb3J0RGVjX0dldExpYkluZm8oIGluZm8gKTsKLSAgRkRLX3Rvb2xzR2V0TGliSW5mbyggaW5mbyApOwotICBwY21EbXhfR2V0TGliSW5mbyggaW5mbyApOworICBzYnJEZWNvZGVyX0dldExpYkluZm8oaW5mbyk7CisgIG1wZWdTdXJyb3VuZERlY29kZXJfR2V0TGliSW5mbyhpbmZvKTsKKyAgdHJhbnNwb3J0RGVjX0dldExpYkluZm8oaW5mbyk7CisgIEZES190b29sc0dldExpYkluZm8oaW5mbyk7CisgIHBjbURteF9HZXRMaWJJbmZvKGluZm8pOworICBwY21MaW1pdGVyX0dldExpYkluZm8oaW5mbyk7CisgIEZES19kcmNEZWNfR2V0TGliSW5mbyhpbmZvKTsKIAogICAvKiBzZWFyY2ggZm9yIG5leHQgZnJlZSB0YWIgKi8KICAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CkBAIC0xMTI1LDQxICsxOTg5LDIzIEBACiAKICAgaW5mby0+bW9kdWxlX2lkID0gRkRLX0FBQ0RFQzsKICAgLyogYnVpbGQgb3duIGxpYnJhcnkgaW5mbyAqLwotICBpbmZvLT52ZXJzaW9uID0gTElCX1ZFUlNJT04oQUFDREVDT0RFUl9MSUJfVkwwLCBBQUNERUNPREVSX0xJQl9WTDEsIEFBQ0RFQ09ERVJfTElCX1ZMMik7CisgIGluZm8tPnZlcnNpb24gPQorICAgICAgTElCX1ZFUlNJT04oQUFDREVDT0RFUl9MSUJfVkwwLCBBQUNERUNPREVSX0xJQl9WTDEsIEFBQ0RFQ09ERVJfTElCX1ZMMik7CiAgIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKTsKICAgaW5mby0+YnVpbGRfZGF0ZSA9IEFBQ0RFQ09ERVJfTElCX0JVSUxEX0RBVEU7CiAgIGluZm8tPmJ1aWxkX3RpbWUgPSBBQUNERUNPREVSX0xJQl9CVUlMRF9USU1FOwogICBpbmZvLT50aXRsZSA9IEFBQ0RFQ09ERVJfTElCX1RJVExFOwogCiAgIC8qIFNldCBmbGFncyAqLwotICBpbmZvLT5mbGFncyA9IDAKLSAgICAgIHwgQ0FQRl9BQUNfTEMKLSAgICAgIHwgQ0FQRl9FUl9BQUNfU0NBTAotICAgICAgfCBDQVBGX0FBQ19WQ0IxMQotICAgICAgfCBDQVBGX0FBQ19IQ1IKLSAgICAgIHwgQ0FQRl9BQUNfUlZMQwotICAgICAgfCBDQVBGX0VSX0FBQ19MRAotICAgICAgfCBDQVBGX0VSX0FBQ19FTEQKLSAgICAgIHwgQ0FQRl9BQUNfQ09OQ0VBTE1FTlQKLSAgICAgIHwgQ0FQRl9BQUNfRFJDCisgIGluZm8tPmZsYWdzID0gMCB8IENBUEZfQUFDX0xDIHwgQ0FQRl9FUl9BQUNfTEMgfCBDQVBGX0VSX0FBQ19TQ0FMIHwKKyAgICAgICAgICAgICAgICBDQVBGX0FBQ19WQ0IxMSB8IENBUEZfQUFDX0hDUiB8IENBUEZfQUFDX1JWTEMgfCBDQVBGX0VSX0FBQ19MRCB8CisgICAgICAgICAgICAgICAgQ0FQRl9FUl9BQUNfRUxEIHwgQ0FQRl9BQUNfQ09OQ0VBTE1FTlQgfCBDQVBGX0FBQ19EUkMgfAorICAgICAgICAgICAgICAgIENBUEZfQUFDX01QRUc0IHwgQ0FQRl9BQUNfRFJNX0JTRk9STUFUIHwgQ0FQRl9BQUNfMTAyNCB8CisgICAgICAgICAgICAgICAgQ0FQRl9BQUNfOTYwIHwgQ0FQRl9BQUNfNTEyIHwgQ0FQRl9BQUNfNDgwIHwKKyAgICAgICAgICAgICAgICBDQVBGX0FBQ19FTERfRE9XTlNDQUxFCiAKLSAgICAgIHwgQ0FQRl9BQUNfTVBFRzQKLQotICAgICAgfCBDQVBGX0FBQ19EUk1fQlNGT1JNQVQKLQotICAgICAgfCBDQVBGX0FBQ18xMDI0Ci0gICAgICB8IENBUEZfQUFDXzk2MAotCi0gICAgICB8IENBUEZfQUFDXzUxMgotCi0gICAgICB8IENBUEZfQUFDXzQ4MAotCi0gICAgICA7CisgICAgICAgICAgICAgICAgfCBDQVBGX0FBQ19VU0FDIHwgQ0FQRl9FUl9BQUNfRUxEVjIgfCBDQVBGX0FBQ19VTklEUkM7CiAgIC8qIEVuZCBvZiBmbGFncyAqLwogCiAgIHJldHVybiAwOwogfQotCi0KLQotCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FybS9ibG9ja19hcm0uY3BwIGIvbGliQUFDZGVjL3NyYy9hcm0vYmxvY2tfYXJtLmNwcAppbmRleCBmYmMxYmYzLi4zYzFiNGJhIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FybS9ibG9ja19hcm0uY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvYXJtL2Jsb2NrX2FybS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTYgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBBcnRodXIgVHJpdHRoYXJ0CisKICAgIERlc2NyaXB0aW9uOiAoQVJNIG9wdGltaXNlZCkgU2NhbGluZyBvZiBzcGVjdHJhbCBkYXRhCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2RlZmluZSBGVU5DVElPTl9DQmxvY2tfU2NhbGVTcGVjdHJhbERhdGFfZnVuYzEKIApAQCAtOTcsMjYgKzEwNywyMCBAQAogICAgICAgICAgbG9vcCBvdmVyaGVhZCBwZXIgc2FtcGxlLCB0aGF0IGdvZXMgZG93biB0byAxLWN5Y2xlIHBlciBzYW1wbGUKICAgICAgICAgIHdpdGggYW4gb3B0aW1hbCA0eC1sb29wIGNvbnN0cnVjdCAoZG8gLSA0eCAtIHdoaWxlKS4KICovCi0KLUZES19JTkxJTkUgc3RhdGljIHZvaWQgQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhX2Z1bmMxKAotICAgIEZJWFBfREJMICpwU3BlY3RydW0sCi0gICAgaW50IG1heF9iYW5kLAotICAgIGNvbnN0IFNIT1JUICogUkVTVFJJQ1QgQmFuZE9mZnNldHMsCi0gICAgaW50IFNwZWNTY2FsZV93aW5kb3csCi0gICAgY29uc3QgU0hPUlQgKiBSRVNUUklDVCBwU2ZiU2NhbGUsCi0gICAgaW50IHdpbmRvdykKLXsKK3N0YXRpYyBpbmxpbmUgdm9pZCBDQmxvY2tfU2NhbGVTcGVjdHJhbERhdGFfZnVuYzEoCisgICAgRklYUF9EQkwgKnBTcGVjdHJ1bSwgaW50IG1heFNmYnMsIGNvbnN0IFNIT1JUICpSRVNUUklDVCBCYW5kT2Zmc2V0cywKKyAgICBpbnQgU3BlY1NjYWxlX3dpbmRvdywgY29uc3QgU0hPUlQgKlJFU1RSSUNUIHBTZmJTY2FsZSwgaW50IHdpbmRvdykgewogICBpbnQgYmFuZF9vZmZzZXQgPSAwOwotICBmb3IgKGludCBiYW5kPTA7IGJhbmQgPCBtYXhfYmFuZDsgYmFuZCsrKQotICB7CisgIGZvciAoaW50IGJhbmQgPSAwOyBiYW5kIDwgbWF4U2ZiczsgYmFuZCsrKSB7CiAgICAgaW50IHJ1bnMgPSBiYW5kX29mZnNldDsKLSAgICBiYW5kX29mZnNldCA9IEJhbmRPZmZzZXRzW2JhbmQrMV07Ci0gICAgcnVucyA9IGJhbmRfb2Zmc2V0IC0gcnVuczsgICAgLyogaXMgYWx3YXlzIGEgbXVsdGlwbGUgb2YgNCAqLwotICAgIGludCBzY2FsZSA9IFNwZWNTY2FsZV93aW5kb3ctcFNmYlNjYWxlW3dpbmRvdyoxNitiYW5kXTsKLSAgICBpZiAoc2NhbGUpCi0gICAgewotICAgICAgZG8KLSAgICAgIHsKKyAgICBiYW5kX29mZnNldCA9IEJhbmRPZmZzZXRzW2JhbmQgKyAxXTsKKyAgICBydW5zID0gYmFuZF9vZmZzZXQgLSBydW5zOyAvKiBpcyBhbHdheXMgYSBtdWx0aXBsZSBvZiA0ICovCisgICAgRkRLX0FTU0VSVCgocnVucyAmIDMpID09IDApOworICAgIGludCBzY2FsZSA9CisgICAgICAgIGZNaW4oREZSQUNUX0JJVFMgLSAxLCBTcGVjU2NhbGVfd2luZG93IC0gcFNmYlNjYWxlW3dpbmRvdyAqIDE2ICsgYmFuZF0pOworCisgICAgaWYgKHNjYWxlKSB7CisgICAgICBkbyB7CiAgICAgICAgIEZJWFBfREJMIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CiAgICAgICAgIHRtcDAgPSBwU3BlY3RydW1bMF07CiAgICAgICAgIHRtcDEgPSBwU3BlY3RydW1bMV07CkBAIC0xMzAsMTEgKzEzNCw5IEBACiAgICAgICAgICpwU3BlY3RydW0rKyA9IHRtcDE7CiAgICAgICAgICpwU3BlY3RydW0rKyA9IHRtcDI7CiAgICAgICAgICpwU3BlY3RydW0rKyA9IHRtcDM7Ci0gICAgICB9IHdoaWxlICgocnVucyA9IHJ1bnMtNCkgIT0gMCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwU3BlY3RydW0rPSBydW5zOworICAgICAgfSB3aGlsZSAoKHJ1bnMgPSBydW5zIC0gNCkgIT0gMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBTcGVjdHJ1bSArPSBydW5zOwogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9ibG9jay5jcHAgYi9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcAppbmRleCBhMTkyODRlLi43ZDJhNGI5IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyOCArOTAsMzMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IGxvbmcvc2hvcnQtYmxvY2sgZGVjb2RpbmcKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImJsb2NrLmgiCiAKICNpbmNsdWRlICJhYWNfcm9tLmgiCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgInNjYWxlLmgiCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogCisjaW5jbHVkZSAidXNhY2RlY19mYWMuaCIKKyNpbmNsdWRlICJ1c2FjZGVjX2xwZC5oIgorI2luY2x1ZGUgInVzYWNkZWNfbHBjLmgiCisjaW5jbHVkZSAiRkRLX3RyaWdGY3RzLmgiCiAKLQorI2luY2x1ZGUgImFjX2FyaXRoX2NvZGVyLmgiCiAKICNpbmNsdWRlICJhYWNkZWNfaGNyLmgiCiAjaW5jbHVkZSAicnZsYy5oIgogCi0KICNpZiBkZWZpbmVkKF9fYXJtX18pCiAjaW5jbHVkZSAiYXJtL2Jsb2NrX2FybS5jcHAiCiAjZW5kaWYKQEAgLTExMSwxMzUgKzEyNywxNjkgQEAKICAgVGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBlc2NhcGUgc2VxdWVuY2UgZnJvbSB0aGUgYml0c3RyZWFtLAogICBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCBoYXMgdGhlCiAgIHZhbHVlIDE2LgorICBBIGxpbWl0YXRpb24gaXMgaW1wbGVtZW50ZWQgdG8gbWF4aW1hbCAzMSBiaXRzIHRvIHByZXZlbnQgZW5kbGVzcyBsb29wcy4KKyAgSWYgaXQgc3RyaWtlcywgTUFYX1FVQU5USVpFRF9WQUxVRSArIDEgaXMgcmV0dXJuZWQsIGluZGVwZW5kZW50IG9mIHRoZSBzaWduIG9mCisgIHBhcmFtZXRlciBxLgogCiAgIFxyZXR1cm4gIHF1YW50aXplZCBjb2VmZmljaWVudAogKi8KIExPTkcgQ0Jsb2NrX0dldEVzY2FwZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgLyohPCBwb2ludGVyIHRvIGJpdHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTE9ORyBxKSAgICAgICAgLyohPCBxdWFudGl6ZWQgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMT05HIHEpICAgICAgICAgICAgLyohPCBxdWFudGl6ZWQgY29lZmZpY2llbnQgKi8KIHsKLSAgTE9ORyBpLCBvZmYsIG5lZyA7CisgIGlmIChmQWJzKHEpICE9IDE2KSByZXR1cm4gKHEpOwogCi0gIGlmIChxIDwgMCkKLSAgewotICAgIGlmIChxICE9IC0xNikgcmV0dXJuIHE7Ci0gICAgbmVnID0gMTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBpZiAocSAhPSArMTYpIHJldHVybiBxOwotICAgIG5lZyA9IDA7CisgIExPTkcgaSwgb2ZmOworICBmb3IgKGkgPSA0OyBpIDwgMzI7IGkrKykgeworICAgIGlmIChGREtyZWFkQml0KGJzKSA9PSAwKSBicmVhazsKICAgfQogCi0gIGZvciAoaT00OyA7IGkrKykKLSAgewotICAgIGlmIChGREtyZWFkQml0cyhicywxKSA9PSAwKQotICAgICAgYnJlYWs7Ci0gIH0KKyAgaWYgKGkgPT0gMzIpIHJldHVybiAoTUFYX1FVQU5USVpFRF9WQUxVRSArIDEpOwogCi0gIGlmIChpID4gMTYpCi0gIHsKLSAgICBpZiAoaSAtIDE2ID4gQ0FDSEVfQklUUykgeyAvKiBjYW5ub3QgcmVhZCBtb3JlIHRoYW4gIkNBQ0hFX0JJVFMiIGJpdHMgYXQgb25jZSBpbiB0aGUgZnVuY3Rpb24gRkRLcmVhZEJpdHMoKSAqLwotICAgICAgcmV0dXJuIChNQVhfUVVBTlRJWkVEX1ZBTFVFICsgMSk7IC8qIHJldHVybmluZyBpbnZhbGlkIHZhbHVlIHRoYXQgd2lsbCBiZSBjYXB0dXJlZCBsYXRlciAqLwotICAgIH0KLQotICAgIG9mZiA9IEZES3JlYWRCaXRzKGJzLGktMTYpIDw8IDE2OwotICAgIG9mZiB8PSBGREtyZWFkQml0cyhicywxNik7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgb2ZmID0gRkRLcmVhZEJpdHMoYnMsaSk7Ci0gIH0KLQorICBvZmYgPSBGREtyZWFkQml0cyhicywgaSk7CiAgIGkgPSBvZmYgKyAoMSA8PCBpKTsKIAotICBpZiAobmVnKSBpID0gLWk7CisgIGlmIChxIDwgMCkgaSA9IC1pOwogCiAgIHJldHVybiBpOwogfQogCiBBQUNfREVDT0RFUl9FUlJPUiBDQmxvY2tfUmVhZFNjYWxlRmFjdG9yRGF0YSgKLSAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgIFVJTlQgZmxhZ3MKLSAgICAgICAgKQoteworICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgIFVJTlQgZmxhZ3MpIHsKICAgaW50IHRlbXA7CiAgIGludCBiYW5kOwogICBpbnQgZ3JvdXA7CiAgIGludCBwb3NpdGlvbiA9IDA7IC8qIGFjY3UgZm9yIGludGVuc2l0eSBkZWx0YSBjb2RpbmcgKi8KLSAgaW50IGZhY3RvciA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluOyAvKiBhY2N1IGZvciBzY2FsZSBmYWN0b3IgZGVsdGEgY29kaW5nICovCisgIGludCBmYWN0b3IgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8KKyAgICAgICAgICAgICAgICAgICAuR2xvYmFsR2FpbjsgLyogYWNjdSBmb3Igc2NhbGUgZmFjdG9yIGRlbHRhIGNvZGluZyAqLwogICBVQ0hBUiAqcENvZGVCb29rID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9vazsKICAgU0hPUlQgKnBTY2FsZUZhY3RvciA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3I7Ci0gIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gKmhjYiA9JkFBQ2NvZGVCb29rRGVzY3JpcHRpb25UYWJsZVtCT09LU0NMXTsKKyAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiID0gJkFBQ2NvZGVCb29rRGVzY3JpcHRpb25UYWJsZVtCT09LU0NMXTsKIAotICBpbnQgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKLSAgZm9yIChncm91cD0wOyBncm91cCA8IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7IGdyb3VwKyspCi0gIHsKLSAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAocENvZGVCb29rW2dyb3VwKjE2K2JhbmRdKSB7CisgIGNvbnN0IFVTSE9SVCgqQ29kZUJvb2spW0h1ZmZtYW5FbnRyaWVzXSA9IGhjYi0+Q29kZUJvb2s7CiAKLSAgICAgIGNhc2UgWkVST19IQ0I6IC8qIHplcm8gYm9vayAqLwotICAgICAgICBwU2NhbGVGYWN0b3JbZ3JvdXAqMTYrYmFuZF0gPSAwOwotICAgICAgICBicmVhazsKKyAgaW50IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCA9CisgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICAgICAgIGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgIHN3aXRjaCAocENvZGVCb29rW2JhbmRdKSB7CisgICAgICAgIGNhc2UgWkVST19IQ0I6IC8qIHplcm8gYm9vayAqLworICAgICAgICAgIHBTY2FsZUZhY3RvcltiYW5kXSA9IDA7CisgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGRlZmF1bHQ6IC8qIGRlY29kZSBzY2FsZSBmYWN0b3IgKi8KLSAgICAgICAgewotICAgICAgICAgIHRlbXAgPSBDQmxvY2tfRGVjb2RlSHVmZm1hbldvcmQoYnMsaGNiKTsKLSAgICAgICAgICBmYWN0b3IgKz0gdGVtcCAtIDYwOyAvKiBNSURGQUMgMS41IGRCICovCi0gICAgICAgIH0KLSAgICAgICAgcFNjYWxlRmFjdG9yW2dyb3VwKjE2K2JhbmRdID0gZmFjdG9yIC0gMTAwOwotICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLyogZGVjb2RlIHNjYWxlIGZhY3RvciAqLworICAgICAgICAgIGlmICghKChmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpKSAmJiBiYW5kID09IDAgJiYKKyAgICAgICAgICAgICAgICBncm91cCA9PSAwKSkgeworICAgICAgICAgICAgdGVtcCA9IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZENCKGJzLCBDb2RlQm9vayk7CisgICAgICAgICAgICBmYWN0b3IgKz0gdGVtcCAtIDYwOyAvKiBNSURGQUMgMS41IGRCICovCisgICAgICAgICAgfQorICAgICAgICAgIHBTY2FsZUZhY3RvcltiYW5kXSA9IGZhY3RvciAtIDEwMDsKKyAgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOiAvKiBpbnRlbnNpdHkgc3RlZXJpbmcgKi8KLSAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6Ci0gICAgICAgIHRlbXAgPSBDQmxvY2tfRGVjb2RlSHVmZm1hbldvcmQoYnMsaGNiKTsKLSAgICAgICAgcG9zaXRpb24gKz0gdGVtcCAtIDYwOwotICAgICAgICBwU2NhbGVGYWN0b3JbZ3JvdXAqMTYrYmFuZF0gPSBwb3NpdGlvbiAtIDEwMDsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjogLyogaW50ZW5zaXR5IHN0ZWVyaW5nICovCisgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6CisgICAgICAgICAgdGVtcCA9IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZENCKGJzLCBDb2RlQm9vayk7CisgICAgICAgICAgcG9zaXRpb24gKz0gdGVtcCAtIDYwOworICAgICAgICAgIHBTY2FsZUZhY3RvcltiYW5kXSA9IHBvc2l0aW9uIC0gMTAwOworICAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIE5PSVNFX0hDQjogLyogUE5TICovCi0gICAgICAgIGlmIChmbGFncyAmIChBQ19NUFNfUkVTfEFDX1VTQUN8QUNfUlNWRDUwKSkgewotICAgICAgICAgIHJldHVybiBBQUNfREVDX1BBUlNFX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIENQbnNfUmVhZCggJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEuYWFjLlBuc0RhdGEsIGJzLCBoY2IsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3IsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluLCBiYW5kLCBncm91cCk7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5PSVNFX0hDQjogLyogUE5TICovCisgICAgICAgICAgaWYgKGZsYWdzICYgKEFDX01QRUdEX1JFUyB8IEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkpIHsKKyAgICAgICAgICAgIHJldHVybiBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgICBDUG5zX1JlYWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEuYWFjLlBuc0RhdGEsIGJzLCBoY2IsCisgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluLAorICAgICAgICAgICAgICAgICAgICBiYW5kLCBncm91cCk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQorICAgIHBDb2RlQm9vayArPSAxNjsKKyAgICBwU2NhbGVGYWN0b3IgKz0gMTY7CiAgIH0KIAogICByZXR1cm4gQUFDX0RFQ19PSzsKIH0KIAotdm9pZCBDQmxvY2tfU2NhbGVTcGVjdHJhbERhdGEoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8pCi17Cit2b2lkIENCbG9ja19TY2FsZVNwZWN0cmFsRGF0YShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbWF4U2ZicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvKSB7CiAgIGludCBiYW5kOwogICBpbnQgd2luZG93OwotICBjb25zdCBTSE9SVCAqIFJFU1RSSUNUIHBTZmJTY2FsZSAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNmYlNjYWxlOwotICBTSE9SVCAqIFJFU1RSSUNUIHBTcGVjU2NhbGUgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGU7Ci0gIGludCBncm91cHdpbixncm91cDsKLSAgY29uc3QgU0hPUlQgKiBSRVNUUklDVCBCYW5kT2Zmc2V0cyA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKLSAgU1BFQ1RSQUxfUFRSIFJFU1RSSUNUIHBTcGVjdHJhbENvZWZmaWNpZW50ID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQ7CisgIGNvbnN0IFNIT1JUICpSRVNUUklDVCBwU2ZiU2NhbGUgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNmYlNjYWxlOworICBTSE9SVCAqUkVTVFJJQ1QgcFNwZWNTY2FsZSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZTsKKyAgaW50IGdyb3Vwd2luLCBncm91cDsKKyAgY29uc3QgU0hPUlQgKlJFU1RSSUNUIEJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygKKyAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7CisgIFNQRUNUUkFMX1BUUiBSRVNUUklDVCBwU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudDsKIAorICBGREttZW1jbGVhcihwU3BlY1NjYWxlLCA4ICogc2l6ZW9mKFNIT1JUKSk7CiAKLSAgRkRLbWVtY2xlYXIocFNwZWNTY2FsZSwgOCpzaXplb2YoU0hPUlQpKTsKLQotICBpbnQgbWF4X2JhbmQgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOwotICBmb3IgKHdpbmRvdz0wLCBncm91cD0wOyBncm91cCA8IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7IGdyb3VwKyspCi0gIHsKLSAgICBmb3IgKGdyb3Vwd2luPTA7IGdyb3Vwd2luIDwgR2V0V2luZG93R3JvdXBMZW5ndGgoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sZ3JvdXApOyBncm91cHdpbisrLCB3aW5kb3crKykKLSAgICB7CisgIGZvciAod2luZG93ID0gMCwgZ3JvdXAgPSAwOworICAgICAgIGdyb3VwIDwgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsgZ3JvdXArKykgeworICAgIGZvciAoZ3JvdXB3aW4gPSAwOyBncm91cHdpbiA8IEdldFdpbmRvd0dyb3VwTGVuZ3RoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywgZ3JvdXApOworICAgICAgICAgZ3JvdXB3aW4rKywgd2luZG93KyspIHsKICAgICAgIGludCBTcGVjU2NhbGVfd2luZG93ID0gcFNwZWNTY2FsZVt3aW5kb3ddOwotICAgICAgRklYUF9EQkwgKnBTcGVjdHJ1bSA9IFNQRUMocFNwZWN0cmFsQ29lZmZpY2llbnQsIHdpbmRvdywgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgpOworICAgICAgRklYUF9EQkwgKnBTcGVjdHJ1bSA9IFNQRUMocFNwZWN0cmFsQ29lZmZpY2llbnQsIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgpOwogCiAgICAgICAvKiBmaW5kIHNjYWxpbmcgZm9yIGN1cnJlbnQgd2luZG93ICovCi0gICAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IG1heF9iYW5kOyBiYW5kKyspCi0gICAgICB7Ci0gICAgICAgIFNwZWNTY2FsZV93aW5kb3cgPSBmTWF4KFNwZWNTY2FsZV93aW5kb3csIChpbnQpcFNmYlNjYWxlW3dpbmRvdyoxNitiYW5kXSk7CisgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbWF4U2ZiczsgYmFuZCsrKSB7CisgICAgICAgIFNwZWNTY2FsZV93aW5kb3cgPQorICAgICAgICAgICAgZk1heChTcGVjU2NhbGVfd2luZG93LCAoaW50KXBTZmJTY2FsZVt3aW5kb3cgKiAxNiArIGJhbmRdKTsKICAgICAgIH0KIAotICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5UbnNEYXRhLkFjdGl2ZSkgewotICAgICAgICBTcGVjU2NhbGVfd2luZG93ICs9IFROU19TQ0FMRTsKKyAgICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+VG5zRGF0YS5BY3RpdmUgJiYKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+VG5zRGF0YS5OdW1iZXJPZkZpbHRlcnNbd2luZG93XSA+CisgICAgICAgICAgICAgIDApIHsKKyAgICAgICAgaW50IGZpbHRlcl9pbmRleCwgU3BlY1NjYWxlX3dpbmRvd190bnM7CisgICAgICAgIGludCB0bnNfc3RhcnQsIHRuc19zdG9wOworCisgICAgICAgIC8qIEZpbmQgbWF4IHNjYWxlIG9mIFROUyBiYW5kcyAqLworICAgICAgICBTcGVjU2NhbGVfd2luZG93X3RucyA9IDA7CisgICAgICAgIHRuc19zdGFydCA9IEdldE1heGltdW1UbnNCYW5kcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLT5zYW1wbGluZ1JhdGVJbmRleCk7CisgICAgICAgIHRuc19zdG9wID0gMDsKKyAgICAgICAgZm9yIChmaWx0ZXJfaW5kZXggPSAwOworICAgICAgICAgICAgIGZpbHRlcl9pbmRleCA8IChpbnQpcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlRuc0RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk51bWJlck9mRmlsdGVyc1t3aW5kb3ddOworICAgICAgICAgICAgIGZpbHRlcl9pbmRleCsrKSB7CisgICAgICAgICAgZm9yIChiYW5kID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlRuc0RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpbHRlclt3aW5kb3ddW2ZpbHRlcl9pbmRleF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0YXJ0QmFuZDsKKyAgICAgICAgICAgICAgIGJhbmQgPCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+VG5zRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlsdGVyW3dpbmRvd11bZmlsdGVyX2luZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAuU3RvcEJhbmQ7CisgICAgICAgICAgICAgICBiYW5kKyspIHsKKyAgICAgICAgICAgIFNwZWNTY2FsZV93aW5kb3dfdG5zID0KKyAgICAgICAgICAgICAgICBmTWF4KFNwZWNTY2FsZV93aW5kb3dfdG5zLCAoaW50KXBTZmJTY2FsZVt3aW5kb3cgKiAxNiArIGJhbmRdKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogRmluZCBUTlMgbGluZSBib3VuZGFyaWVzIGZvciBhbGwgVE5TIGZpbHRlcnMgKi8KKyAgICAgICAgICB0bnNfc3RhcnQgPQorICAgICAgICAgICAgICBmTWluKHRuc19zdGFydCwgKGludClwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+VG5zRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaWx0ZXJbd2luZG93XVtmaWx0ZXJfaW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0YXJ0QmFuZCk7CisgICAgICAgICAgdG5zX3N0b3AgPQorICAgICAgICAgICAgICBmTWF4KHRuc19zdG9wLCAoaW50KXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5UbnNEYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlsdGVyW3dpbmRvd11bZmlsdGVyX2luZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0b3BCYW5kKTsKKyAgICAgICAgfQorICAgICAgICBTcGVjU2NhbGVfd2luZG93X3RucyA9IFNwZWNTY2FsZV93aW5kb3dfdG5zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+VG5zRGF0YS5HYWluTGQ7CisgICAgICAgIEZES19BU1NFUlQodG5zX3N0b3AgPj0gdG5zX3N0YXJ0KTsKKyAgICAgICAgLyogQ29uc2lkZXIgZXhpc3RpbmcgaGVhZHJvb20gb2YgYWxsIE1EQ1QgbGluZXMgaW5zaWRlIHRoZSBUTlMgYmFuZHMuICovCisgICAgICAgIFNwZWNTY2FsZV93aW5kb3dfdG5zIC09CisgICAgICAgICAgICBnZXRTY2FsZWZhY3RvcihwU3BlY3RydW0gKyBCYW5kT2Zmc2V0c1t0bnNfc3RhcnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZE9mZnNldHNbdG5zX3N0b3BdIC0gQmFuZE9mZnNldHNbdG5zX3N0YXJ0XSk7CisgICAgICAgIGlmIChTcGVjU2NhbGVfd2luZG93IDw9IDE3KSB7CisgICAgICAgICAgU3BlY1NjYWxlX3dpbmRvd190bnMrKzsKKyAgICAgICAgfQorICAgICAgICAvKiBBZGQgZW5vdWdoIG1hbnRpc3NhIGhlYWQgcm9vbSBzdWNoIHRoYXQgdGhlIHNwZWN0cnVtIGlzIHN0aWxsCisgICAgICAgICAgIHJlcHJlc2VudGFibGUgYWZ0ZXIgYXBwbHlpbmcgVE5TLiAqLworICAgICAgICBTcGVjU2NhbGVfd2luZG93ID0gZk1heChTcGVjU2NhbGVfd2luZG93LCBTcGVjU2NhbGVfd2luZG93X3Rucyk7CiAgICAgICB9CiAKICAgICAgIC8qIHN0b3JlIHNjYWxpbmcgb2YgY3VycmVudCB3aW5kb3cgKi8KQEAgLTI0Nyw3OSArMjk3LDgwIEBACiAKICNpZmRlZiBGVU5DVElPTl9DQmxvY2tfU2NhbGVTcGVjdHJhbERhdGFfZnVuYzEKIAotICAgICAgQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhX2Z1bmMxKHBTcGVjdHJ1bSwgbWF4X2JhbmQsIEJhbmRPZmZzZXRzLCBTcGVjU2NhbGVfd2luZG93LCBwU2ZiU2NhbGUsIHdpbmRvdyk7CisgICAgICBDQmxvY2tfU2NhbGVTcGVjdHJhbERhdGFfZnVuYzEocFNwZWN0cnVtLCBtYXhTZmJzLCBCYW5kT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjU2NhbGVfd2luZG93LCBwU2ZiU2NhbGUsIHdpbmRvdyk7CiAKLSNlbHNlIC8qIEZVTkNUSU9OX0NCbG9ja19TY2FsZVNwZWN0cmFsRGF0YV9mdW5jMSAqLwotICAgICAgZm9yIChiYW5kPTA7IGJhbmQgPCBtYXhfYmFuZDsgYmFuZCsrKQotICAgICAgewotICAgICAgICBpbnQgc2NhbGUgPSBTcGVjU2NhbGVfd2luZG93IC0gcFNmYlNjYWxlW3dpbmRvdyoxNitiYW5kXTsKLSAgICAgICAgaWYgKHNjYWxlKQotICAgICAgICB7Ci0gICAgICAgICAgLyogZm9sbG93aW5nIHJlbGF0aW9uIGNhbiBiZSB1c2VkIGZvciBvcHRpbWl6YXRpb25zOiAoQmFuZE9mZnNldHNbaV0lNCkgPT0gMCBmb3IgYWxsIGkgKi8KLSAgICAgICAgICBpbnQgbWF4X2luZGV4ID0gQmFuZE9mZnNldHNbYmFuZCsxXTsKLSAgICAgICAgICBmb3IgKGludCBpbmRleCA9IEJhbmRPZmZzZXRzW2JhbmRdOyBpbmRleCA8IG1heF9pbmRleDsgaW5kZXgrKykKLSAgICAgICAgICB7CisjZWxzZSAgLyogRlVOQ1RJT05fQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhX2Z1bmMxICovCisgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbWF4U2ZiczsgYmFuZCsrKSB7CisgICAgICAgIGludCBzY2FsZSA9IGZNaW4oREZSQUNUX0JJVFMgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNTY2FsZV93aW5kb3cgLSBwU2ZiU2NhbGVbd2luZG93ICogMTYgKyBiYW5kXSk7CisgICAgICAgIGlmIChzY2FsZSkgeworICAgICAgICAgIEZES19BU1NFUlQoc2NhbGUgPiAwKTsKKworICAgICAgICAgIC8qIGZvbGxvd2luZyByZWxhdGlvbiBjYW4gYmUgdXNlZCBmb3Igb3B0aW1pemF0aW9uczoKKyAgICAgICAgICAgKiAoQmFuZE9mZnNldHNbaV0lNCkgPT0gMCBmb3IgYWxsIGkgKi8KKyAgICAgICAgICBpbnQgbWF4X2luZGV4ID0gQmFuZE9mZnNldHNbYmFuZCArIDFdOworICAgICAgICAgIERXT1JEX0FMSUdORUQocFNwZWN0cnVtKTsKKyAgICAgICAgICBmb3IgKGludCBpbmRleCA9IEJhbmRPZmZzZXRzW2JhbmRdOyBpbmRleCA8IG1heF9pbmRleDsgaW5kZXgrKykgewogICAgICAgICAgICAgcFNwZWN0cnVtW2luZGV4XSA+Pj0gc2NhbGU7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9Ci0jZW5kaWYgIC8qIEZVTkNUSU9OX0NCbG9ja19TY2FsZVNwZWN0cmFsRGF0YV9mdW5jMSAqLworI2VuZGlmIC8qIEZVTkNUSU9OX0NCbG9ja19TY2FsZVNwZWN0cmFsRGF0YV9mdW5jMSAqLwogICAgIH0KICAgfQotCiB9CiAKLUFBQ19ERUNPREVSX0VSUk9SIENCbG9ja19SZWFkU2VjdGlvbkRhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICBmbGFncykKLXsKK0FBQ19ERUNPREVSX0VSUk9SIENCbG9ja19SZWFkU2VjdGlvbkRhdGEoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIGNvbnN0IFVJTlQgZmxhZ3MpIHsKICAgaW50IHRvcCwgYmFuZDsKICAgaW50IHNlY3RfbGVuLCBzZWN0X2xlbl9pbmNyOwogICBpbnQgZ3JvdXA7CiAgIFVDSEFSIHNlY3RfY2I7CiAgIFVDSEFSICpwQ29kZUJvb2sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rOwogICAvKiBIQ1IgaW5wdXQgKGxvbmcpICovCi0gIFNIT1JUICpwTnVtTGluZXNJblNlYyAgICA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5hTnVtTGluZUluU2VjNEhjcjsKLSAgaW50ICAgIG51bUxpbmVzSW5TZWNJZHggID0gMDsKLSAgVUNIQVIgKnBIY3JDb2RlQm9vayAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmFDb2RlQm9va3M0SGNyOwotICBjb25zdCBTSE9SVCAqQmFuZE9mZnNldHMgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7CisgIFNIT1JUICpwTnVtTGluZXNJblNlYyA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMuYU51bUxpbmVJblNlYzRIY3I7CisgIGludCBudW1MaW5lc0luU2VjSWR4ID0gMDsKKyAgVUNIQVIgKnBIY3JDb2RlQm9vayA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMuYUNvZGVCb29rczRIY3I7CisgIGNvbnN0IFNIT1JUICpCYW5kT2Zmc2V0cyA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoCisgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOwogICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubnVtYmVyU2VjdGlvbiA9IDA7CiAgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKIAotICBGREttZW1jbGVhcihwQ29kZUJvb2ssIHNpemVvZihVQ0hBUikqKDgqMTYpKTsKKyAgRkRLbWVtY2xlYXIocENvZGVCb29rLCBzaXplb2YoVUNIQVIpICogKDggKiAxNikpOwogCi0gIGNvbnN0IGludCBuYml0cyA9IChJc0xvbmdCbG9jaygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gMSkgPyA1IDogMzsKKyAgY29uc3QgaW50IG5iaXRzID0KKyAgICAgIChJc0xvbmdCbG9jaygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gMSkgPyA1IDogMzsKIAotICBpbnQgc2VjdF9lc2NfdmFsID0gKDEgPDwgbmJpdHMpIC0gMSA7CisgIGludCBzZWN0X2VzY192YWwgPSAoMSA8PCBuYml0cykgLSAxOwogCi0gIFVDSEFSIFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7Ci0gIGZvciAoZ3JvdXA9MDsgZ3JvdXA8R2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsgZ3JvdXArKykKLSAgewotICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyApCi0gICAgeworICBVQ0hBUiBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgPQorICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKyAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKyAgICAgICBncm91cCsrKSB7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDspIHsKICAgICAgIHNlY3RfbGVuID0gMDsKLSAgICAgIGlmICggZmxhZ3MgJiBBQ19FUl9WQ0IxMSApICB7Ci0gICAgICAgIHNlY3RfY2IgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBzZWN0X2NiID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw0KTsKKyAgICAgIGlmIChmbGFncyAmIEFDX0VSX1ZDQjExKSB7CisgICAgICAgIHNlY3RfY2IgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDUpOworICAgICAgfSBlbHNlCisgICAgICAgIHNlY3RfY2IgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDQpOwogCi0gICAgICBpZiAoICgoZmxhZ3MgJiBBQ19FUl9WQ0IxMSkgPT0gMCkgfHwgKCBzZWN0X2NiIDwgMTEgKSB8fCAoKHNlY3RfY2IgPiAxMSkgJiYgKHNlY3RfY2IgPCAxNikpICkgeworICAgICAgaWYgKCgoZmxhZ3MgJiBBQ19FUl9WQ0IxMSkgPT0gMCkgfHwgKHNlY3RfY2IgPCAxMSkgfHwKKyAgICAgICAgICAoKHNlY3RfY2IgPiAxMSkgJiYgKHNlY3RfY2IgPCAxNikpKSB7CiAgICAgICAgIHNlY3RfbGVuX2luY3IgPSBGREtyZWFkQml0cyhicywgbmJpdHMpOwotICAgICAgICB3aGlsZSAoc2VjdF9sZW5faW5jciA9PSBzZWN0X2VzY192YWwpCi0gICAgICAgIHsKKyAgICAgICAgd2hpbGUgKHNlY3RfbGVuX2luY3IgPT0gc2VjdF9lc2NfdmFsKSB7CiAgICAgICAgICAgc2VjdF9sZW4gKz0gc2VjdF9lc2NfdmFsOwogICAgICAgICAgIHNlY3RfbGVuX2luY3IgPSBGREtyZWFkQml0cyhicywgbmJpdHMpOwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNlY3RfbGVuX2luY3IgPSAxOwogICAgICAgfQogCiAgICAgICBzZWN0X2xlbiArPSBzZWN0X2xlbl9pbmNyOwogCi0KICAgICAgIHRvcCA9IGJhbmQgKyBzZWN0X2xlbjsKIAogICAgICAgaWYgKGZsYWdzICYgQUNfRVJfSENSKSB7CkBAIC0zMjcsMTAgKzM3OCwxMyBAQAogICAgICAgICBpZiAobnVtTGluZXNJblNlY0lkeCA+PSBNQVhfU0ZCX0hDUikgewogICAgICAgICAgIHJldHVybiBBQUNfREVDX1BBUlNFX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGlmICh0b3AgPiAoaW50KUdldE51bWJlck9mU2NhbGVGYWN0b3JCYW5kcygKKyAgICAgICAgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pKSB7CisgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgIH0KICAgICAgICAgcE51bUxpbmVzSW5TZWNbbnVtTGluZXNJblNlY0lkeF0gPSBCYW5kT2Zmc2V0c1t0b3BdIC0gQmFuZE9mZnNldHNbYmFuZF07CiAgICAgICAgIG51bUxpbmVzSW5TZWNJZHgrKzsKLSAgICAgICAgaWYgKHNlY3RfY2IgPT0gQk9PS1NDTCkKLSAgICAgICAgeworICAgICAgICBpZiAoc2VjdF9jYiA9PSBCT09LU0NMKSB7CiAgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9DT0RFX0JPT0s7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgKnBIY3JDb2RlQm9vaysrID0gc2VjdF9jYjsKQEAgLTMzOSwyNTkgKzM5MywzNDAgQEAKICAgICAgIH0KIAogICAgICAgLyogQ2hlY2sgc3BlY3RyYWwgbGluZSBsaW1pdHMgKi8KLSAgICAgIGlmIChJc0xvbmdCbG9jayggJihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSApKQotICAgICAgeworICAgICAgaWYgKElzTG9uZ0Jsb2NrKCYocEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpKSB7CiAgICAgICAgIGlmICh0b3AgPiA2NCkgewogICAgICAgICAgIHJldHVybiBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsgLyogc2hvcnQgYmxvY2sgKi8KLSAgICAgICAgaWYgKHRvcCArIGdyb3VwKjE2ID4gKDggKiAxNikpIHsKKyAgICAgICAgaWYgKHRvcCArIGdyb3VwICogMTYgPiAoOCAqIDE2KSkgewogICAgICAgICAgIHJldHVybiBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKICAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvKiBDaGVjayBpZiBkZWNvZGVkIGNvZGVib29rIGluZGV4IGlzIGZlYXNpYmxlICovCi0gICAgICBpZiAoIChzZWN0X2NiID09IEJPT0tTQ0wpCi0gICAgICAgfHwgKCAoc2VjdF9jYiA9PSBJTlRFTlNJVFlfSENCIHx8IHNlY3RfY2IgPT0gSU5URU5TSVRZX0hDQjIpICYmIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPT0gMCkKLSAgICAgICAgICkKLSAgICAgIHsKKyAgICAgIGlmICgoc2VjdF9jYiA9PSBCT09LU0NMKSB8fAorICAgICAgICAgICgoc2VjdF9jYiA9PSBJTlRFTlNJVFlfSENCIHx8IHNlY3RfY2IgPT0gSU5URU5TSVRZX0hDQjIpICYmCisgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPT0gMCkpIHsKICAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9DT0RFX0JPT0s7CiAgICAgICB9CiAKICAgICAgIC8qIFN0b3JlIGNvZGVib29rIGluZGV4ICovCi0gICAgICBmb3IgKDsgYmFuZCA8IHRvcDsgYmFuZCsrKQotICAgICAgewotICAgICAgICBwQ29kZUJvb2tbZ3JvdXAqMTYrYmFuZF0gPSBzZWN0X2NiOworICAgICAgZm9yICg7IGJhbmQgPCB0b3A7IGJhbmQrKykgeworICAgICAgICBwQ29kZUJvb2tbZ3JvdXAgKiAxNiArIGJhbmRdID0gc2VjdF9jYjsKICAgICAgIH0KICAgICB9CiAgIH0KIAotCiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAogLyogbXNvOiBwcm92aWRlcyBhIGZhc3RlciB3YXkgdG8gaS1xdWFudGl6ZSBhIHdob2xlIGJhbmQgaW4gb25lIGdvICovCiAKIC8qKgotICogXGJyaWVmIGludmVyc2UgcXVhbnRpemUgb25lIHNmYi4gRWFjaCB2YWx1ZSBvZiB0aGUgc2ZiIGlzIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8gdGhlCi0gKiAgICAgICAgZm9ybXVsYTogc3BlY3RydW1baV0gPSBTaWduKHNwZWN0cnVtW2ldKSAqIE1hdGlzc2Eoc3BlY3RydW1baV0pXig0LzMpICogMl4obHNiLzQpLgorICogXGJyaWVmIGludmVyc2UgcXVhbnRpemUgb25lIHNmYi4gRWFjaCB2YWx1ZSBvZiB0aGUgc2ZiIGlzIHByb2Nlc3NlZCBhY2NvcmRpbmcKKyAqIHRvIHRoZSBmb3JtdWxhOiBzcGVjdHJ1bVtpXSA9IFNpZ24oc3BlY3RydW1baV0pICogTWF0aXNzYShzcGVjdHJ1bVtpXSleKDQvMykKKyAqICogMl4obHNiLzQpLgogICogXHBhcmFtIHNwZWN0cnVtIHBvaW50ZXIgdG8gZmlyc3QgbGluZSBvZiB0aGUgc2ZiIHRvIGJlIGludmVyc2UgcXVhbnRpemVkLgogICogXHBhcmFtIG5vTGluZXMgbnVtYmVyIG9mIGxpbmVzIGJlbG9uZ2luZyB0byB0aGUgc2ZiLgogICogXHBhcmFtIGxzYiBsYXN0IDIgYml0cyBvZiB0aGUgc2NhbGUgZmFjdG9yIG9mIHRoZSBzZmIuCiAgKiBccGFyYW0gc2NhbGUgbWF4IGFsbG93ZWQgc2hpZnQgc2NhbGUgZm9yIHRoZSBzZmIuCiAgKi8KLXN0YXRpYwotdm9pZCBJbnZlcnNlUXVhbnRpemVCYW5kKCBGSVhQX0RCTCAqIFJFU1RSSUNUIHNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbHNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlICkKLXsKLSAgICBjb25zdCBGSVhQX0RCTCAqIFJFU1RSSUNUIEludmVyc2VRdWFudFRhYmxlcj0oRklYUF9EQkwgKilJbnZlcnNlUXVhbnRUYWJsZTsKLSAgICBjb25zdCBGSVhQX0RCTCAqIFJFU1RSSUNUIE1hbnRpc3NhVGFibGVyPShGSVhQX0RCTCAqKU1hbnRpc3NhVGFibGVbbHNiXTsKLSAgICBjb25zdCBTQ0hBUiogUkVTVFJJQ1QgRXhwb25lbnRUYWJsZXI9KFNDSEFSKilFeHBvbmVudFRhYmxlW2xzYl07CitzdGF0aWMgaW5saW5lIHZvaWQgSW52ZXJzZVF1YW50aXplQmFuZCgKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc3BlY3RydW0sIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBJbnZlcnNlUXVhbnRUYWJsZXIsCisgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIE1hbnRpc3NhVGFibGVyLAorICAgIGNvbnN0IFNDSEFSICpSRVNUUklDVCBFeHBvbmVudFRhYmxlciwgSU5UIG5vTGluZXMsIElOVCBzY2FsZSkgeworICBzY2FsZSA9IHNjYWxlICsgMTsgLyogKzEgdG8gY29tcGVuc2F0ZSBmTXVsdERpdjIgc2hpZnQtcmlnaHQgaW4gbG9vcCAqLwogCi0gICAgRklYUF9EQkwgKnB0ciA9IHNwZWN0cnVtOwotICAgIEZJWFBfREJMIHNpZ25lZFZhbHVlOworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRyID0gc3BlY3RydW07CisgIEZJWFBfREJMIHNpZ25lZFZhbHVlOwogCi0gICAgRkRLX0FTU0VSVChub0xpbmVzPjIpOwotICAgIGZvciAoSU5UIGk9bm9MaW5lczsgaS0tOyApCi0gICAgewotICAgICAgICBpZiAoKHNpZ25lZFZhbHVlID0gKnB0cisrKSAhPSBGTDJGWENPTlNUX0RCTCgwKSkKLSAgICAgICAgewotICAgICAgICAgIEZJWFBfREJMIHZhbHVlID0gZkFicyhzaWduZWRWYWx1ZSk7Ci0gICAgICAgICAgVUlOVCBmcmVlQml0cyA9IENudExlYWRpbmdaZXJvcyh2YWx1ZSk7Ci0gICAgICAgICAgVUlOVCBleHBvbmVudCA9IDMyIC0gZnJlZUJpdHM7CisgIGZvciAoSU5UIGkgPSBub0xpbmVzOyBpLS07KSB7CisgICAgaWYgKChzaWduZWRWYWx1ZSA9ICpwdHIrKykgIT0gRkwyRlhDT05TVF9EQkwoMCkpIHsKKyAgICAgIEZJWFBfREJMIHZhbHVlID0gZkFicyhzaWduZWRWYWx1ZSk7CisgICAgICBVSU5UIGZyZWVCaXRzID0gQ250TGVhZGluZ1plcm9zKHZhbHVlKTsKKyAgICAgIFVJTlQgZXhwb25lbnQgPSAzMiAtIGZyZWVCaXRzOwogCi0gICAgICAgICAgVUlOVCB4ID0gKFVJTlQpIChMT05HKXZhbHVlIDw8IChJTlQpIGZyZWVCaXRzOwotICAgICAgICAgIHggPDw9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0IG91dCBzaWduIGJpdCB0byBhdm9pZCBtYXNraW5nIGxhdGVyIG9uICovCi0gICAgICAgICAgVUlOVCB0YWJsZUluZGV4ID0geCA+PiAyNDsKLSAgICAgICAgICB4ID0gKHggPj4gMjApICYgIDB4MEY7CisgICAgICBVSU5UIHggPSAoVUlOVCkoTE9ORyl2YWx1ZSA8PCAoSU5UKWZyZWVCaXRzOworICAgICAgeCA8PD0gMTsgLyogc2hpZnQgb3V0IHNpZ24gYml0IHRvIGF2b2lkIG1hc2tpbmcgbGF0ZXIgb24gKi8KKyAgICAgIFVJTlQgdGFibGVJbmRleCA9IHggPj4gMjQ7CisgICAgICB4ID0gKHggPj4gMjApICYgMHgwRjsKIAotICAgICAgICAgIFVJTlQgcjA9KFVJTlQpKExPTkcpSW52ZXJzZVF1YW50VGFibGVyW3RhYmxlSW5kZXgrMF07Ci0gICAgICAgICAgVUlOVCByMT0oVUlOVCkoTE9ORylJbnZlcnNlUXVhbnRUYWJsZXJbdGFibGVJbmRleCsxXTsKLSAgICAgICAgICBVSU5UIHRlbXA9IChyMSAtIHIwKSp4ICsgKHIwIDw8IDQpOworICAgICAgVUlOVCByMCA9IChVSU5UKShMT05HKUludmVyc2VRdWFudFRhYmxlclt0YWJsZUluZGV4ICsgMF07CisgICAgICBVSU5UIHIxID0gKFVJTlQpKExPTkcpSW52ZXJzZVF1YW50VGFibGVyW3RhYmxlSW5kZXggKyAxXTsKKyAgICAgIFVJTlQgdGVtcCA9IChyMSAtIHIwKSAqIHggKyAocjAgPDwgNCk7CiAKLSAgICAgICAgICB2YWx1ZSA9IGZNdWx0RGl2MigoRklYUF9EQkwpdGVtcCwgTWFudGlzc2FUYWJsZXJbZXhwb25lbnRdKTsKKyAgICAgIHZhbHVlID0gZk11bHREaXYyKChGSVhQX0RCTCl0ZW1wLCBNYW50aXNzYVRhYmxlcltleHBvbmVudF0pOwogCi0gICAgICAgICAgLyogKyAxIGNvbXBlbnNhdGVzIGZNdWx0RGl2MigpICovCi0gICAgICAgICAgc2NhbGVWYWx1ZUluUGxhY2UoJnZhbHVlLCBzY2FsZSArIEV4cG9uZW50VGFibGVyW2V4cG9uZW50XSArIDEpOworICAgICAgLyogKyAxIGNvbXBlbnNhdGVzIGZNdWx0RGl2MigpICovCisgICAgICBzY2FsZVZhbHVlSW5QbGFjZSgmdmFsdWUsIHNjYWxlICsgRXhwb25lbnRUYWJsZXJbZXhwb25lbnRdKTsKIAotICAgICAgICAgIHNpZ25lZFZhbHVlID0gKHNpZ25lZFZhbHVlIDwgKEZJWFBfREJMKTApID8gLXZhbHVlIDogdmFsdWU7Ci0gICAgICAgICAgcHRyWy0xXSA9IHNpZ25lZFZhbHVlOwotICAgICAgICB9CisgICAgICBzaWduZWRWYWx1ZSA9IChzaWduZWRWYWx1ZSA8IChGSVhQX0RCTCkwKSA/IC12YWx1ZSA6IHZhbHVlOworICAgICAgcHRyWy0xXSA9IHNpZ25lZFZhbHVlOwogICAgIH0KKyAgfQogfQogCi1BQUNfREVDT0RFUl9FUlJPUiBDQmxvY2tfSW52ZXJzZVF1YW50aXplU3BlY3RyYWxEYXRhKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvKQoteworc3RhdGljIGlubGluZSBGSVhQX0RCTCBtYXhhYnNfRChjb25zdCBGSVhQX0RCTCAqcFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBub0xpbmVzKSB7CisgIC8qIEZpbmQgbWF4IHNwZWN0cmFsIGxpbmUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgc2ZiICovCisgIEZJWFBfREJMIGxvY01heCA9IChGSVhQX0RCTCkwOworICBpbnQgaTsKKworICBEV09SRF9BTElHTkVEKHBTcGVjdHJhbENvZWZmaWNpZW50KTsKKworICBmb3IgKGkgPSBub0xpbmVzOyBpLS0gPiAwOykgeworICAgIC8qIEV4cGVuc2l2ZSBtZW1vcnkgYWNjZXNzICovCisgICAgbG9jTWF4ID0gZk1heChmaXhwX2FicyhwU3BlY3RyYWxDb2VmZmljaWVudFtpXSksIGxvY01heCk7CisgIH0KKworICByZXR1cm4gbG9jTWF4OworfQorCitBQUNfREVDT0RFUl9FUlJPUiBDQmxvY2tfSW52ZXJzZVF1YW50aXplU3BlY3RyYWxEYXRhKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIFVDSEFSICpiYW5kX2lzX25vaXNlLAorICAgIFVDSEFSIGFjdGl2ZV9iYW5kX3NlYXJjaCkgewogICBpbnQgd2luZG93LCBncm91cCwgZ3JvdXB3aW4sIGJhbmQ7Ci0gIGludCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICBpbnQgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkID0KKyAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CiAgIFVDSEFSICpSRVNUUklDVCBwQ29kZUJvb2sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rOwogICBTSE9SVCAqUkVTVFJJQ1QgcFNmYlNjYWxlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTZmJTY2FsZTsKICAgU0hPUlQgKlJFU1RSSUNUIHBTY2FsZUZhY3RvciA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3I7Ci0gIGNvbnN0IFNIT1JUICpSRVNUUklDVCBCYW5kT2Zmc2V0cyA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgY29uc3QgU0hPUlQgKlJFU1RSSUNUIEJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygKKyAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7CisgIGNvbnN0IFNIT1JUIHRvdGFsX2JhbmRzID0KKyAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUb3RhbCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CiAKLSAgRkRLbWVtY2xlYXIocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTZmJTY2FsZSwgKDgqMTYpKnNpemVvZihTSE9SVCkpOworICBGREttZW1jbGVhcihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNmYlNjYWxlLAorICAgICAgICAgICAgICAoOCAqIDE2KSAqIHNpemVvZihTSE9SVCkpOwogCi0gIGZvciAod2luZG93PTAsIGdyb3VwPTA7IGdyb3VwIDwgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsgZ3JvdXArKykKLSAgewotICAgIGZvciAoZ3JvdXB3aW49MDsgZ3JvdXB3aW4gPCBHZXRXaW5kb3dHcm91cExlbmd0aCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyxncm91cCk7IGdyb3Vwd2luKyssIHdpbmRvdysrKQotICAgIHsKKyAgZm9yICh3aW5kb3cgPSAwLCBncm91cCA9IDA7CisgICAgICAgZ3JvdXAgPCBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOyBncm91cCsrKSB7CisgICAgZm9yIChncm91cHdpbiA9IDA7IGdyb3Vwd2luIDwgR2V0V2luZG93R3JvdXBMZW5ndGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBncm91cCk7CisgICAgICAgICBncm91cHdpbisrLCB3aW5kb3crKykgewogICAgICAgLyogaW52ZXJzZSBxdWFudGl6YXRpb24gKi8KLSAgICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspCi0gICAgICB7Ci0gICAgICAgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9IFNQRUMocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCkgKyBCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgICBGSVhQX0RCTCAqcFNwZWN0cmFsQ29lZmZpY2llbnQgPQorICAgICAgICAgICAgU1BFQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LAorICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoKSArCisgICAgICAgICAgICBCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgICAgRklYUF9EQkwgbG9jTWF4OwogCi0gICAgICAgIGludCBub0xpbmVzID0gQmFuZE9mZnNldHNbYmFuZCsxXSAtIEJhbmRPZmZzZXRzW2JhbmRdOwotICAgICAgICBpbnQgYm5kcyA9IGdyb3VwKjE2K2JhbmQ7Ci0gICAgICAgIGludCBpOworICAgICAgICBjb25zdCBpbnQgbm9MaW5lcyA9IEJhbmRPZmZzZXRzW2JhbmQgKyAxXSAtIEJhbmRPZmZzZXRzW2JhbmRdOworICAgICAgICBjb25zdCBpbnQgYm5kcyA9IGdyb3VwICogMTYgKyBiYW5kOwogCi0gICAgICAgIGlmICgocENvZGVCb29rW2JuZHNdID09IFpFUk9fSENCKQotICAgICAgICAgfHwgKHBDb2RlQm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCKQotICAgICAgICAgfHwgKHBDb2RlQm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCMikKLSAgICAgICAgICAgKQorICAgICAgICBpZiAoKHBDb2RlQm9va1tibmRzXSA9PSBaRVJPX0hDQikgfHwKKyAgICAgICAgICAgIChwQ29kZUJvb2tbYm5kc10gPT0gSU5URU5TSVRZX0hDQikgfHwKKyAgICAgICAgICAgIChwQ29kZUJvb2tbYm5kc10gPT0gSU5URU5TSVRZX0hDQjIpKQogICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGlmIChwQ29kZUJvb2tbYm5kc10gPT0gTk9JU0VfSENCKQotICAgICAgICB7Ci0gICAgICAgICAgLyogTGVhdmUgaGVhZHJvb20gZm9yIFBOUyB2YWx1ZXMuICsgMSBiZWNhdXNlIGNlaWwobG9nMigyXigwLjI1KjMpKSkgPSAxLAotICAgICAgICAgICAgIHdvcnN0IGNhc2Ugb2YgYWRkaXRpb25hbCBoZWFkcm9vbSByZXF1aXJlZCBiZWNhdXNlIG9mIHRoZSBzY2FsZWZhY3Rvci4gKi8KLSAgICAgICAgICBwU2ZiU2NhbGVbd2luZG93KjE2K2JhbmRdID0gKHBTY2FsZUZhY3RvciBbYm5kc10gPj4gMikgKyAxIDsKKyAgICAgICAgaWYgKHBDb2RlQm9va1tibmRzXSA9PSBOT0lTRV9IQ0IpIHsKKyAgICAgICAgICAvKiBMZWF2ZSBoZWFkcm9vbSBmb3IgUE5TIHZhbHVlcy4gKyAxIGJlY2F1c2UgY2VpbChsb2cyKDJeKDAuMjUqMykpKSA9CisgICAgICAgICAgICAgMSwgd29yc3QgY2FzZSBvZiBhZGRpdGlvbmFsIGhlYWRyb29tIHJlcXVpcmVkIGJlY2F1c2Ugb2YgdGhlCisgICAgICAgICAgICAgc2NhbGVmYWN0b3IuICovCisgICAgICAgICAgcFNmYlNjYWxlW3dpbmRvdyAqIDE2ICsgYmFuZF0gPSAocFNjYWxlRmFjdG9yW2JuZHNdID4+IDIpICsgMTsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIC8qIEZpbmQgbWF4IHNwZWN0cmFsIGxpbmUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgc2ZiICovCi0gICAgICAgIEZJWFBfREJMIGxvY01heCA9IChGSVhQX0RCTCkwOworICAgICAgICBsb2NNYXggPSBtYXhhYnNfRChwU3BlY3RyYWxDb2VmZmljaWVudCwgbm9MaW5lcyk7CiAKLSAgICAgICAgZm9yIChpID0gbm9MaW5lczsgaS0tIDsgKSB7Ci0gICAgICAgICAgLyogRXhwZW5zaXZlIG1lbW9yeSBhY2Nlc3MgKi8KLSAgICAgICAgICBsb2NNYXggPSBmTWF4KGZpeHBfYWJzKHBTcGVjdHJhbENvZWZmaWNpZW50W2ldKSwgbG9jTWF4KTsKKyAgICAgICAgaWYgKGFjdGl2ZV9iYW5kX3NlYXJjaCkgeworICAgICAgICAgIGlmIChsb2NNYXggIT0gRklYUF9EQkwoMCkpIHsKKyAgICAgICAgICAgIGJhbmRfaXNfbm9pc2VbZ3JvdXAgKiAxNiArIGJhbmRdID0gMDsKKyAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKiBDaGVhcCByb2J1c3RuZXNzIGltcHJvdmVtZW50IC0gRG8gbm90IHJlbW92ZSEhISAqLwogICAgICAgICBpZiAoZml4cF9hYnMobG9jTWF4KSA+IChGSVhQX0RCTClNQVhfUVVBTlRJWkVEX1ZBTFVFKSB7Ci0gICAgICAgICAgcmV0dXJuIEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICAgICAgICAgIHJldHVybiBBQUNfREVDX1BBUlNFX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgLyoKLSAgICAgICAgICAgVGhlIGludmVyc2UgcXVhbnRpemVkIHNwZWN0cmFsIGxpbmVzIGFyZSBkZWZpbmVkIGJ5OgotICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudFtpXSA9IFNpZ24ocFNwZWN0cmFsQ29lZmZpY2llbnRbaV0pICogMl4oMC4yNSpwU2NhbGVGYWN0b3JbYm5kc10pICogcFNwZWN0cmFsQ29lZmZpY2llbnRbaV1eKDQvMykKLSAgICAgICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvOgotICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudFtpXSAgICA9IFNpZ24ocFNwZWN0cmFsQ29lZmZpY2llbnRbaV0pICogKDJeKHBTY2FsZUZhY3RvcltibmRzXSAlIDQpICogcFNwZWN0cmFsQ29lZmZpY2llbnRbaV1eKDQvMykpCi0gICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50X2VbaV0gKz0gcFNjYWxlRmFjdG9yW2JuZHNdLzQKKyAgICAgICAgLyogQWRkZWQgYnkgWW91bGl5IE5pbm92OgorICAgICAgICBUaGUgaW52ZXJzZSBxdWFudGl6YXRpb24gb3BlcmF0aW9uIGlzIGdpdmVuIGJ5IChJU08vSUVDIDE0NDk2LTM6MjAwOShFKSkKKyAgICAgICAgYnk6CisKKyAgICAgICAgeF9pbnZxdWFudD1TaWduKHhfcXVhbnQpLiBhYnMoeF9xdWFudCleKDQvMykKKworICAgICAgICBXZSBhcHBseSBhIGdhaW4sIGRlcml2ZWQgZnJvbSB0aGUgc2NhbGUgZmFjdG9yIGZvciB0aGUgcGFydGljdWxhciBzZmIsCisgICAgICAgIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorCisgICAgICAgIGdhaW49Ml4oMC4yNSpTY2FsZUZhY3RvcikKKworICAgICAgICBTbywgYWZ0ZXIgc2NhbGluZyB3ZSBoYXZlOgorCisgICAgICAgIHhfcmVzY2FsZT1nYWluKnhfaW52cXVhbnQ9U2lnbih4X3F1YW50KSoyXigwLjI1KlNjYWxlRmFjdG9yKSphYnMoc19xdWFudCleKDQvMykKKworICAgICAgICBXZSBjb3VsZCByZXByZXNlbnQgdGhlIFNjYWxlRmFjdG9yIGFzOgorCisgICAgICAgIFNjYWxlRmFjdG9yPSAoU2NhbGVGYWN0b3IgPj4gMikqNCArIFNjYWxlRmFjdG9yICU0CisKKyAgICAgICAgV2hlbiB3ZSBzdWJzdGl0dXRlIGl0IHdlIGdldDoKKworICAgICAgICB4X3Jlc2NhbGU9U2lnbih4X3F1YW50KSoyXihTY2FsZUZhY3Rvcj4+MikqICgKKyAgICAgICAgMl4oMC4yNSooU2NhbGVGYWN0b3IlNCkpKmFicyhzX3F1YW50KV4oNC8zKSkKKworICAgICAgICBXaGVuIHdlIHNldDogbXNiPShTY2FsZUZhY3Rvcj4+MikgYW5kIGxzYj0oU2NhbGVGYWN0b3IlNCksIHdlIG9idGFpbjoKKworICAgICAgICB4X3Jlc2NhbGU9U2lnbih4X3F1YW50KSooMl5tc2IpKiAoIDJeKGxzYi80KSphYnMoc19xdWFudCleKDQvMykpCisKKyAgICAgICAgVGhlIHJlc2NhbGVkIG91dHB1dCBjYW4gYmUgcmVwcmVzZW50ZWQgYnk6CisgICAgICAgICAgIG1hbnRpc3NhIDogU2lnbih4X3F1YW50KSooIDJeKGxzYi80KSphYnMoc19xdWFudCleKDQvMykpCisgICAgICAgICAgIGV4cG9uZW50IDooMl5tc2IpCisKICAgICAgICAgKi8KLSAgICAgICAgewotICAgICAgICAgIGludCBtc2IgPSBwU2NhbGVGYWN0b3IgW2JuZHNdID4+IDIgOwotICAgICAgICAgIGludCBsc2IgPSBwU2NhbGVGYWN0b3IgW2JuZHNdICYgMHgwMyA7CiAKLSAgICAgICAgICBpbnQgc2NhbGUgPSBHZXRTY2FsZUZyb21WYWx1ZShsb2NNYXgsIGxzYik7CisgICAgICAgIGludCBtc2IgPSBwU2NhbGVGYWN0b3JbYm5kc10gPj4gMjsKIAotICAgICAgICAgIHBTZmJTY2FsZVt3aW5kb3cqMTYrYmFuZF0gPSBtc2IgLSBzY2FsZTsKLSAgICAgICAgICBJbnZlcnNlUXVhbnRpemVCYW5kKHBTcGVjdHJhbENvZWZmaWNpZW50LCBub0xpbmVzLCBsc2IsIHNjYWxlKTsKKyAgICAgICAgLyogSW52ZXJzZSBxdWFudGl6ZSBiYW5kIG9ubHkgaWYgaXQgaXMgbm90IGVtcHR5ICovCisgICAgICAgIGlmIChsb2NNYXggIT0gRklYUF9EQkwoMCkpIHsKKyAgICAgICAgICBpbnQgbHNiID0gcFNjYWxlRmFjdG9yW2JuZHNdICYgMHgwMzsKKworICAgICAgICAgIGludCBzY2FsZSA9IEV2YWx1YXRlUG93ZXI0MygmbG9jTWF4LCBsc2IpOworCisgICAgICAgICAgc2NhbGUgPSBDbnRMZWFkaW5nWmVyb3MobG9jTWF4KSAtIHNjYWxlIC0gMjsKKworICAgICAgICAgIHBTZmJTY2FsZVt3aW5kb3cgKiAxNiArIGJhbmRdID0gbXNiIC0gc2NhbGU7CisgICAgICAgICAgSW52ZXJzZVF1YW50aXplQmFuZChwU3BlY3RyYWxDb2VmZmljaWVudCwgSW52ZXJzZVF1YW50VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW50aXNzYVRhYmxlW2xzYl0sIEV4cG9uZW50VGFibGVbbHNiXSwgbm9MaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwU2ZiU2NhbGVbd2luZG93ICogMTYgKyBiYW5kXSA9IG1zYjsKICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQogCisgICAgICB9IC8qIGZvciAoYmFuZD0wOyBiYW5kIDwgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspICovCisKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgYXJyYXkgaXMgY2xlYXJlZCB0byB0aGUgZW5kICovCisgICAgICBTSE9SVCBzdGFydF9jbGVhciA9IEJhbmRPZmZzZXRzW1NjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZF07CisgICAgICBTSE9SVCBlbmRfY2xlYXIgPSBCYW5kT2Zmc2V0c1t0b3RhbF9iYW5kc107CisgICAgICBpbnQgZGlmZl9jbGVhciA9IChpbnQpKGVuZF9jbGVhciAtIHN0YXJ0X2NsZWFyKTsKKyAgICAgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICAgICAgU1BFQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LAorICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCkgKworICAgICAgICAgIHN0YXJ0X2NsZWFyOworICAgICAgRkRLbWVtY2xlYXIocFNwZWN0cmFsQ29lZmZpY2llbnQsIGRpZmZfY2xlYXIgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICAgIH0gLyogZm9yIChncm91cHdpbj0wOyBncm91cHdpbiA8CisgICAgICAgICBHZXRXaW5kb3dHcm91cExlbmd0aCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyxncm91cCk7CisgICAgICAgICBncm91cHdpbisrLCB3aW5kb3crKykgKi8KKyAgfSAgIC8qIGZvciAod2luZG93PTAsIGdyb3VwPTA7IGdyb3VwIDwKKyAgICAgICAgIEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7IGdyb3VwKyspKi8KIAogICByZXR1cm4gQUFDX0RFQ19PSzsKIH0KIAorQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX1JlYWRTcGVjdHJhbERhdGEoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIGNvbnN0IFVJTlQgZmxhZ3MpIHsKKyAgaW50IGluZGV4LCBpOworICBjb25zdCBTSE9SVCAqUkVTVFJJQ1QgQmFuZE9mZnNldHMgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKAorICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKIAotQUFDX0RFQ09ERVJfRVJST1IgIENCbG9ja19SZWFkU3BlY3RyYWxEYXRhKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgZmxhZ3MpCi17Ci0gIGludCBpLGluZGV4OwotICBpbnQgd2luZG93LGdyb3VwLGdyb3Vwd2luLGdyb3Vwb2Zmc2V0LGJhbmQ7Ci0gIFVDSEFSICpSRVNUUklDVCBwQ29kZUJvb2sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rOwotICBjb25zdCBTSE9SVCAqUkVTVFJJQ1QgQmFuZE9mZnNldHMgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7Ci0KLSAgU1BFQ1RSQUxfUFRSIHBTcGVjdHJhbENvZWZmaWNpZW50ID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQ7Ci0gIEZJWFBfREJMIGxvY01heDsKLQotICBpbnQgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKyAgU1BFQ1RSQUxfUFRSIHBTcGVjdHJhbENvZWZmaWNpZW50ID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50OwogCiAgIEZES19BU1NFUlQoQmFuZE9mZnNldHMgIT0gTlVMTCk7CiAKICAgRkRLbWVtY2xlYXIocFNwZWN0cmFsQ29lZmZpY2llbnQsIHNpemVvZihTUEVDVFJVTSkpOwogCi0gIGlmICggKGZsYWdzICYgQUNfRVJfSENSKSA9PSAwICkKLSAgeworICBpZiAoKGZsYWdzICYgQUNfRVJfSENSKSA9PSAwKSB7CisgICAgaW50IGdyb3VwOworICAgIGludCBncm91cG9mZnNldDsKKyAgICBVQ0hBUiAqcENvZGVCb29rID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9vazsKKyAgICBpbnQgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkID0KKyAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKyAgICBpbnQgZ3JhbnVsZUxlbmd0aCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGg7CisKICAgICBncm91cG9mZnNldCA9IDA7CiAKICAgICAvKiBwbGFpbiBodWZmbWFuIGRlY29kZXIgIHNob3J0ICovCi0gICAgZm9yIChncm91cD0wOyBncm91cCA8IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7IGdyb3VwKyspCi0gICAgewotICAgICAgZm9yIChiYW5kPTA7IGJhbmQgPCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykKLSAgICAgIHsKLSAgICAgICAgaW50IGJuZHMgPSBncm91cCoxNitiYW5kOwotICAgICAgICBVQ0hBUiBjdXJyZW50Q0IgPSBwQ29kZUJvb2tbYm5kc107CisgICAgaW50IG1heF9ncm91cCA9IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CiAKLSAgICAgICAgLyogcGF0Y2ggdG8gcnVuIHBsYWluLWh1ZmZtYW4tZGVjb2RlciB3aXRoIHZjYjExIGlucHV0IGNvZGVib29rcyAoTEFWLWNoZWNraW5nIG1pZ2h0IGJlIHBvc3NpYmxlIGJlbG93IHVzaW5nIHRoZSB2aXJ0dWFsIGNiIGFuZCBhIExBVi10YWJsZSkgKi8KKyAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBtYXhfZ3JvdXA7IGdyb3VwKyspIHsKKyAgICAgIGludCBtYXhfZ3JvdXB3aW4gPQorICAgICAgICAgIEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBncm91cCk7CisgICAgICBpbnQgYmFuZDsKKworICAgICAgaW50IGJuZHMgPSBncm91cCAqIDE2OworCisgICAgICBpbnQgYmFuZE9mZnNldDEgPSBCYW5kT2Zmc2V0c1swXTsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKywgYm5kcysrKSB7CisgICAgICAgIFVDSEFSIGN1cnJlbnRDQiA9IHBDb2RlQm9va1tibmRzXTsKKyAgICAgICAgaW50IGJhbmRPZmZzZXQwID0gYmFuZE9mZnNldDE7CisgICAgICAgIGJhbmRPZmZzZXQxID0gQmFuZE9mZnNldHNbYmFuZCArIDFdOworCisgICAgICAgIC8qIHBhdGNoIHRvIHJ1biBwbGFpbi1odWZmbWFuLWRlY29kZXIgd2l0aCB2Y2IxMSBpbnB1dCBjb2RlYm9va3MKKyAgICAgICAgICogKExBVi1jaGVja2luZyBtaWdodCBiZSBwb3NzaWJsZSBiZWxvdyB1c2luZyB0aGUgdmlydHVhbCBjYiBhbmQgYQorICAgICAgICAgKiBMQVYtdGFibGUpICovCiAgICAgICAgIGlmICgoY3VycmVudENCID49IDE2KSAmJiAoY3VycmVudENCIDw9IDMxKSkgewogICAgICAgICAgIHBDb2RlQm9va1tibmRzXSA9IGN1cnJlbnRDQiA9IDExOwogICAgICAgICB9Ci0gICAgICAgIGlmICggISgoY3VycmVudENCID09IFpFUk9fSENCKQotICAgICAgICAgICAgfHwgKGN1cnJlbnRDQiA9PSBOT0lTRV9IQ0IpCi0gICAgICAgICAgICB8fCAoY3VycmVudENCID09IElOVEVOU0lUWV9IQ0IpCi0gICAgICAgICAgICB8fCAoY3VycmVudENCID09IElOVEVOU0lUWV9IQ0IyKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiID0gJkFBQ2NvZGVCb29rRGVzY3JpcHRpb25UYWJsZVtjdXJyZW50Q0JdOworICAgICAgICBpZiAoKChjdXJyZW50Q0IgIT0gWkVST19IQ0IpICYmIChjdXJyZW50Q0IgIT0gTk9JU0VfSENCKSAmJgorICAgICAgICAgICAgIChjdXJyZW50Q0IgIT0gSU5URU5TSVRZX0hDQikgJiYgKGN1cnJlbnRDQiAhPSBJTlRFTlNJVFlfSENCMikpKSB7CisgICAgICAgICAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiID0KKyAgICAgICAgICAgICAgJkFBQ2NvZGVCb29rRGVzY3JpcHRpb25UYWJsZVtjdXJyZW50Q0JdOwogICAgICAgICAgIGludCBzdGVwID0gaGNiLT5EaW1lbnNpb247CiAgICAgICAgICAgaW50IG9mZnNldCA9IGhjYi0+T2Zmc2V0OwogICAgICAgICAgIGludCBiaXRzID0gaGNiLT5udW1CaXRzOwotICAgICAgICAgIGludCBtYXNrID0gKDE8PGJpdHMpLTE7CisgICAgICAgICAgaW50IG1hc2sgPSAoMSA8PCBiaXRzKSAtIDE7CisgICAgICAgICAgY29uc3QgVVNIT1JUKCpDb2RlQm9vaylbSHVmZm1hbkVudHJpZXNdID0gaGNiLT5Db2RlQm9vazsKKyAgICAgICAgICBpbnQgZ3JvdXB3aW47CiAKLSAgICAgICAgICBmb3IgKGdyb3Vwd2luPTA7IGdyb3Vwd2luIDwgR2V0V2luZG93R3JvdXBMZW5ndGgoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sZ3JvdXApOyBncm91cHdpbisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdpbmRvdyA9IGdyb3Vwb2Zmc2V0ICsgZ3JvdXB3aW47CisgICAgICAgICAgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSA9CisgICAgICAgICAgICAgICZwU3BlY3RyYWxDb2VmZmljaWVudFtncm91cG9mZnNldCAqIGdyYW51bGVMZW5ndGhdOwogCi0gICAgICAgICAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtID0gU1BFQyhwU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoKTsKLQotICAgICAgICAgICAgbG9jTWF4ID0gKEZJWFBfREJMKTAgOwotCi0gICAgICAgICAgICBmb3IgKGluZGV4PUJhbmRPZmZzZXRzW2JhbmRdOyBpbmRleCA8IEJhbmRPZmZzZXRzW2JhbmQrMV07IGluZGV4Kz1zdGVwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnQgaWR4ID0gQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkKGJzLGhjYik7Ci0KLSAgICAgICAgICAgICAgZm9yIChpPTA7IGk8c3RlcDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wOwotCi0gICAgICAgICAgICAgICAgdG1wID0gKEZJWFBfREJMKSgoaWR4ICYgbWFzayktb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBpZHggPj49IGJpdHM7Ci0KLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gRklYUF9EQkwoMCkpCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IChGREtyZWFkQml0cyhicywxKSk/IC10bXAgOiB0bXA7CisgICAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBmb3IgKGdyb3Vwd2luID0gMDsgZ3JvdXB3aW4gPCBtYXhfZ3JvdXB3aW47IGdyb3Vwd2luKyspIHsKKyAgICAgICAgICAgICAgZm9yIChpbmRleCA9IGJhbmRPZmZzZXQwOyBpbmRleCA8IGJhbmRPZmZzZXQxOyBpbmRleCArPSBzdGVwKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZENCKGJzLCBDb2RlQm9vayk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0ZXA7IGkrKywgaWR4ID4+PSBiaXRzKSB7CisgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0bXAgPSAoRklYUF9EQkwpKChpZHggJiBtYXNrKSAtIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEZJWFBfREJMKDApKSB0bXAgPSAoRkRLcmVhZEJpdChicykpID8gLXRtcCA6IHRtcDsKKyAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVtpbmRleCArIGldID0gdG1wOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1baW5kZXgraV0gPSB0bXA7Ci0gICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICBpZiAoY3VycmVudENCID09IEVTQ0JPT0spCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1baW5kZXgrMF0gPSAoRklYUF9EQkwpQ0Jsb2NrX0dldEVzY2FwZShicywgKExPTkcpbWRjdFNwZWN0cnVtW2luZGV4KzBdKTsKLSAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1baW5kZXgrMV0gPSAoRklYUF9EQkwpQ0Jsb2NrX0dldEVzY2FwZShicywgKExPTkcpbWRjdFNwZWN0cnVtW2luZGV4KzFdKTsKLQorICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q0IgPT0gRVNDQk9PSykgeworICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVtpbmRleCArIGpdID0gKEZJWFBfREJMKUNCbG9ja19HZXRFc2NhcGUoCisgICAgICAgICAgICAgICAgICAgICAgICBicywgKExPTkcpbWRjdFNwZWN0cnVtW2luZGV4ICsgal0pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBtZGN0U3BlY3RydW0gKz0gZ3JhbnVsZUxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChncm91cHdpbiA9IDA7IGdyb3Vwd2luIDwgbWF4X2dyb3Vwd2luOyBncm91cHdpbisrKSB7CisgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBiYW5kT2Zmc2V0MDsgaW5kZXggPCBiYW5kT2Zmc2V0MTsgaW5kZXggKz0gc3RlcCkgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBDQmxvY2tfRGVjb2RlSHVmZm1hbldvcmRDQihicywgQ29kZUJvb2spOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdGVwOyBpKyssIGlkeCA+Pj0gYml0cykgeworICAgICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtW2luZGV4ICsgaV0gPSAoRklYUF9EQkwpKChpZHggJiBtYXNrKSAtIG9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q0IgPT0gRVNDQk9PSykgeworICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVtpbmRleCArIGpdID0gKEZJWFBfREJMKUNCbG9ja19HZXRFc2NhcGUoCisgICAgICAgICAgICAgICAgICAgICAgICBicywgKExPTkcpbWRjdFNwZWN0cnVtW2luZGV4ICsgal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBtZGN0U3BlY3RydW0gKz0gZ3JhbnVsZUxlbmd0aDsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGdyb3Vwb2Zmc2V0ICs9IEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLGdyb3VwKTsKKyAgICAgIGdyb3Vwb2Zmc2V0ICs9IG1heF9ncm91cHdpbjsKICAgICB9CiAgICAgLyogcGxhaW4gaHVmZm1hbiBkZWNvZGluZyAoc2hvcnQpIGZpbmlzaGVkICovCiAgIH0KKwogICAvKiBIQ1IgLSBIdWZmbWFuIENvZGV3b3JkIFJlb3JkZXJpbmcgIHNob3J0ICovCi0gIGVsc2UgIC8qIGlmICggZmxhZ3MgJiBBQ19FUl9IQ1IgKSAqLworICBlbHNlIC8qIGlmICggZmxhZ3MgJiBBQ19FUl9IQ1IgKSAqLworCiAgIHsKICAgICBIX0hDUl9JTkZPIGhIY3IgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVySGNySW5mbzsKKwogICAgIGludCBoY3JTdGF0dXMgPSAwOwogCiAgICAgLyogYWR2YW5jZWQgSHVmZm1hbiBkZWNvZGluZyBzdGFydHMgaGVyZSAoSENSIGRlY29kaW5nIDopICovCi0gICAgaWYgKCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgIT0gMCApIHsKLQorICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMKKyAgICAgICAgICAgIC5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSAhPSAwKSB7CiAgICAgICAvKiBIQ1IgaW5pdGlhbGl6YXRpb24gc2hvcnQgKi8KICAgICAgIGhjclN0YXR1cyA9IEhjckluaXQoaEhjciwgcEFhY0RlY29kZXJDaGFubmVsSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8sIGJzKTsKIApAQCAtNjAwLDcgKzczNSw4IEBACiAgICAgICB9CiAKICAgICAgIC8qIEhDUiBkZWNvZGluZyBzaG9ydCAqLwotICAgICAgaGNyU3RhdHVzID0gSGNyRGVjb2RlcihoSGNyLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbywgYnMpOworICAgICAgaGNyU3RhdHVzID0KKyAgICAgICAgICBIY3JEZWNvZGVyKGhIY3IsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBTYW1wbGluZ1JhdGVJbmZvLCBicyk7CiAKICAgICAgIGlmIChoY3JTdGF0dXMgIT0gMCkgewogI2lmIEhDUl9FUlJPUl9DT05DRUFMTUVOVApAQCAtNjEwLDEwMCArNzQ2LDMxNCBAQAogI2VuZGlmIC8qIEhDUl9FUlJPUl9DT05DRUFMTUVOVCAqLwogICAgICAgfQogCi0gICAgICBGREtwdXNoRm9yIChicywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhKTsKKyAgICAgIEZES3B1c2hGb3IoYnMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYworICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSk7CiAgICAgfQogICB9CiAgIC8qIEhDUiAtIEh1ZmZtYW4gQ29kZXdvcmQgUmVvcmRlcmluZyBzaG9ydCBmaW5pc2hlZCAqLwogCi0KLQotICBpZiAoIElzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSAmJiAhKGZsYWdzICYgKEFDX0VMRHxBQ19TQ0FMQUJMRSkpICkKLSAgeworICBpZiAoSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pICYmCisgICAgICAhKGZsYWdzICYgKEFDX0VMRCB8IEFDX1NDQUxBQkxFKSkpIHsKICAgICAvKiBhcHBseSBwdWxzZSBkYXRhICovCi0gICAgQ1B1bHNlRGF0YV9BcHBseSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLlB1bHNlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgU1BFQ19MT05HKHBTcGVjdHJhbENvZWZmaWNpZW50KSk7CisgICAgQ1B1bHNlRGF0YV9BcHBseSgKKyAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5QdWxzZURhdGEsCisgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8pLAorICAgICAgICBTUEVDX0xPTkcocFNwZWN0cmFsQ29lZmZpY2llbnQpKTsKICAgfQogCi0KICAgcmV0dXJuIEFBQ19ERUNfT0s7CiB9CiAKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBub2lzZV9sZXZlbF90YWJbOF0gPSB7CisgICAgLyogRkRLcG93KDIsIChmbG9hdCkobm9pc2VfbGV2ZWwtMTQpLzMuMGYpICogMjsgKCoyIHRvIGNvbXBlbnNhdGUgZm9yCisgICAgICAgZk11bHREaXYyKSBub2lzZV9sZXZlbF90YWIobm9pc2VfbGV2ZWw9PTApID09IDAgYnkgZGVmaW5pdGlvbgorICAgICovCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MDAwMDAwMDAgLyoweDBhMTQ1MTczKi8pLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDBjYjJmZjVlKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxMDAwMDAwMCksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MTQyOGEyZTcpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDE5NjVmZWJkKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgyMDAwMDAwMCksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4Mjg1MTQ2MDYpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDMyY2JmZDMzKX07CiAKK3ZvaWQgQ0Jsb2NrX0FwcGx5Tm9pc2UoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIFVMT05HICpuZlJhbmRvbVNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpiYW5kX2lzX25vaXNlKSB7CisgIGNvbnN0IFNIT1JUICpzd2Jfb2Zmc2V0ID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygKKyAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7CisgIGludCBnLCB3aW4sIGd3aW4sIHNmYiwgbm9pc2VGaWxsaW5nU3RhcnRPZmZzZXQsIG5mU3RhcnRPZmZzZXRfc2ZiOwogCi12b2lkIEFwcGx5VG9vbHMgKCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10sCi0gICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hhbm5lbCApCi17CisgIC8qIE9idGFpbiBub2lzZSBsZXZlbCBhbmQgc2NhbGUgZmFjdG9yIG9mZnNldC4gKi8KKyAgaW50IG5vaXNlX2xldmVsID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYworICAgICAgICAgICAgICAgICAgICAgICAgLmZkX25vaXNlX2xldmVsX2FuZF9vZmZzZXQgPj4KKyAgICAgICAgICAgICAgICAgICAgNTsKKyAgY29uc3QgRklYUF9TR0wgbm9pc2VWYWxfcG9zID0gbm9pc2VfbGV2ZWxfdGFiW25vaXNlX2xldmVsXTsKIAotICBpZiAoICEoZmxhZ3MgJiAoQUNfVVNBQ3xBQ19SU1ZENTB8QUNfTVBTX1JFUykpICkgewotICAgIENQbnNfQXBwbHkoCi0gICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5kYXRhLmFhYy5QbnNEYXRhLAotICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+aWNzSW5mbywKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPnBTcGVjdHJhbENvZWZmaWNpZW50LAotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+c3BlY1NjYWxlLAotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwKLSAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+Z3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgIGNoYW5uZWwKLSAgICAgICAgICAgICk7CisgIC8qIG5vaXNlX29mZnNldCBjYW4gY2hhbmdlIGV2ZW4gd2hlbiBub2lzZV9sZXZlbD0wLiBOZWNjZXNhcnkgZm9yIElHRiBzdGVyZW8KKyAgICogZmlsbGluZyAqLworICBjb25zdCBpbnQgbm9pc2Vfb2Zmc2V0ID0gKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZkX25vaXNlX2xldmVsX2FuZF9vZmZzZXQgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWYpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OworCisgIGludCBtYXhfc2ZiID0KKyAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CisKKyAgbm9pc2VGaWxsaW5nU3RhcnRPZmZzZXQgPQorICAgICAgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBCTE9DS19TSE9SVCkKKyAgICAgICAgICA/IDIwCisgICAgICAgICAgOiAxNjA7CisgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoID09IDk2KSB7CisgICAgbm9pc2VGaWxsaW5nU3RhcnRPZmZzZXQgPQorICAgICAgICAoMyAqIG5vaXNlRmlsbGluZ1N0YXJ0T2Zmc2V0KSAvCisgICAgICAgIDQ7IC8qIHNjYWxlIG9mZnNldCB3aXRoIDMvNCBmb3IgY29yZUNvZGVyRnJhbWVMZW5ndGggPT0gNzY4ICovCiAgIH0KIAotICBDVG5zX0FwcGx5ICgKLSAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5wRHluRGF0YS0+VG5zRGF0YSwKLSAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5pY3NJbmZvLAotICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPnBTcGVjdHJhbENvZWZmaWNpZW50LAotICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPmdyYW51bGVMZW5ndGgKLSAgICAgICAgICApOworICAvKiBkZXRlcm1pbmUgc2ZiIGZyb20gd2hlcmUgb24gbm9pc2UgZmlsbGluZyBpcyBhcHBsaWVkICovCisgIGZvciAoc2ZiID0gMDsgc3diX29mZnNldFtzZmJdIDwgbm9pc2VGaWxsaW5nU3RhcnRPZmZzZXQ7IHNmYisrKQorICAgIDsKKyAgbmZTdGFydE9mZnNldF9zZmIgPSBzZmI7CisKKyAgLyogaWYgKG5vaXNlX2xldmVsIT0wKSAqLworICB7CisgICAgZm9yIChnID0gMCwgd2luID0gMDsgZyA8IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CisgICAgICAgICBnKyspIHsKKyAgICAgIGludCB3aW5kb3dHcm91cExlbmd0aCA9CisgICAgICAgICAgR2V0V2luZG93R3JvdXBMZW5ndGgoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIGcpOworICAgICAgZm9yIChzZmIgPSBuZlN0YXJ0T2Zmc2V0X3NmYjsgc2ZiIDwgbWF4X3NmYjsgc2ZiKyspIHsKKyAgICAgICAgaW50IGJpbl9zdGFydCA9IHN3Yl9vZmZzZXRbc2ZiXTsKKyAgICAgICAgaW50IGJpbl9zdG9wID0gc3diX29mZnNldFtzZmIgKyAxXTsKKworICAgICAgICBpbnQgZmxhZ04gPSBiYW5kX2lzX25vaXNlW2cgKiAxNiArIHNmYl07CisKKyAgICAgICAgLyogaWYgYWxsIGJpbnMgb2Ygb25lIHNmYiBpbiBvbmUgd2luZG93IGdyb3VwIGFyZSB6ZXJvIG1vZGlmeSB0aGUgc2NhbGUKKyAgICAgICAgICogZmFjdG9yIGJ5IG5vaXNlX29mZnNldCAqLworICAgICAgICBpZiAoZmxhZ04pIHsKKyAgICAgICAgICAvKiBDaGFuZ2Ugc2NhbGluZyBmYWN0b3JzIGZvciBlbXB0eSBzaWduYWwgYmFuZHMgKi8KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2cgKiAxNiArIHNmYl0gKz0KKyAgICAgICAgICAgICAgbm9pc2Vfb2Zmc2V0OworICAgICAgICAgIC8qIHNjYWxlIGZhY3RvciAic2YiIGltcGxpZWQgZ2FpbiAiZyIgaXMgZyA9IDJeKHNmLzQpICovCisgICAgICAgICAgZm9yIChnd2luID0gMDsgZ3dpbiA8IHdpbmRvd0dyb3VwTGVuZ3RoOyBnd2luKyspIHsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhCisgICAgICAgICAgICAgICAgLT5hU2ZiU2NhbGVbKHdpbiArIGd3aW4pICogMTYgKyBzZmJdICs9IChub2lzZV9vZmZzZXQgPj4gMik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVUxPTkcgc2VlZCA9ICpuZlJhbmRvbVNlZWQ7CisgICAgICAgIC8qICsgMSBiZWNhdXNlIGV4cG9uZW50IG9mIE1hbnRpc3NhVGFibGVbbHNiXVswXSBpcyBhbHdheXMgMS4gKi8KKyAgICAgICAgaW50IHNjYWxlID0KKyAgICAgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2cgKiAxNiArIHNmYl0gPj4KKyAgICAgICAgICAgICAyKSArCisgICAgICAgICAgICAxOworICAgICAgICBpbnQgbHNiID0KKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbZyAqIDE2ICsgc2ZiXSAmIDM7CisgICAgICAgIEZJWFBfREJMIG1hbnRpc3NhID0gTWFudGlzc2FUYWJsZVtsc2JdWzBdOworCisgICAgICAgIGZvciAoZ3dpbiA9IDA7IGd3aW4gPCB3aW5kb3dHcm91cExlbmd0aDsgZ3dpbisrKSB7CisgICAgICAgICAgRklYUF9EQkwgKnBTcGVjID0KKyAgICAgICAgICAgICAgU1BFQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgd2luICsgZ3dpbiwKKyAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoKTsKKworICAgICAgICAgIGludCBzY2FsZTEgPSBzY2FsZSAtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+YVNmYlNjYWxlWyh3aW4gKyBnd2luKSAqIDE2ICsgc2ZiXTsKKyAgICAgICAgICBGSVhQX0RCTCBzY2FsZWRfbm9pc2VWYWxfcG9zID0KKyAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdERpdjIobm9pc2VWYWxfcG9zLCBtYW50aXNzYSksIHNjYWxlMSk7CisgICAgICAgICAgRklYUF9EQkwgc2NhbGVkX25vaXNlVmFsX25lZyA9IC1zY2FsZWRfbm9pc2VWYWxfcG9zOworCisgICAgICAgICAgLyogSWYgdGhlIHdob2xlIGJhbmQgaXMgemVybywganVzdCBmaWxsIHdpdGhvdXQgY2hlY2tpbmcgKi8KKyAgICAgICAgICBpZiAoZmxhZ04pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGJpbiA9IGJpbl9zdGFydDsgYmluIDwgYmluX3N0b3A7IGJpbisrKSB7CisgICAgICAgICAgICAgIHNlZWQgPSAoVUxPTkcpKAorICAgICAgICAgICAgICAgICAgKFVJTlQ2NClzZWVkICogNjkwNjkgKworICAgICAgICAgICAgICAgICAgNSk7IC8qIElubGluZWQ6IFVzYWNSYW5kb21TaWduIC0gb3JpZ2luIGluIHVzYWNkZWNfbHBkLmggKi8KKyAgICAgICAgICAgICAgcFNwZWNbYmluXSA9CisgICAgICAgICAgICAgICAgICAoc2VlZCAmIDB4MTAwMDApID8gc2NhbGVkX25vaXNlVmFsX25lZyA6IHNjYWxlZF9ub2lzZVZhbF9wb3M7CisgICAgICAgICAgICB9IC8qIGZvciAoYmluLi4uKSAqLworICAgICAgICAgIH0KKyAgICAgICAgICAvKklmIGJhbmQgaXMgc3BhcnNlbHkgZmlsbGVkLCBjaGVjayBmb3IgMCBhbmQgZmlsbCAqLworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgYmluID0gYmluX3N0YXJ0OyBiaW4gPCBiaW5fc3RvcDsgYmluKyspIHsKKyAgICAgICAgICAgICAgaWYgKHBTcGVjW2Jpbl0gPT0gKEZJWFBfREJMKTApIHsKKyAgICAgICAgICAgICAgICBzZWVkID0gKFVMT05HKSgKKyAgICAgICAgICAgICAgICAgICAgKFVJTlQ2NClzZWVkICogNjkwNjkgKworICAgICAgICAgICAgICAgICAgICA1KTsgLyogSW5saW5lZDogVXNhY1JhbmRvbVNpZ24gLSBvcmlnaW4gaW4gdXNhY2RlY19scGQuaCAqLworICAgICAgICAgICAgICAgIHBTcGVjW2Jpbl0gPSAoc2VlZCAmIDB4MTAwMDApID8gc2NhbGVkX25vaXNlVmFsX25lZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2NhbGVkX25vaXNlVmFsX3BvczsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvKiBmb3IgKGJpbi4uLikgKi8KKyAgICAgICAgICB9CisKKyAgICAgICAgfSAvKiBmb3IgKGd3aW4uLi4pICovCisgICAgICAgICpuZlJhbmRvbVNlZWQgPSBzZWVkOworICAgICAgfSAvKiBmb3IgKHNmYi4uLikgKi8KKyAgICAgIHdpbiArPSB3aW5kb3dHcm91cExlbmd0aDsKKyAgICB9IC8qIGZvciAoZy4uLikgKi8KKworICB9IC8qIC4uLiAqLwogfQogCi1zdGF0aWMKLWludCBnZXRXaW5kb3cyTnIoaW50IGxlbmd0aCwgaW50IHNoYXBlKQoteworQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX1JlYWRBY1NwZWN0cmFsRGF0YSgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgY29uc3QgVUlOVCBmcmFtZV9sZW5ndGgsCisgICAgY29uc3QgVUlOVCBmbGFncykgeworICBBQUNfREVDT0RFUl9FUlJPUiBlcnJvckFBQyA9IEFBQ19ERUNfT0s7CisgIEFSSVRIX0NPRElOR19FUlJPUiBlcnJvciA9IEFSSVRIX0NPREVSX09LOworICBpbnQgYXJpdGhfcmVzZXRfZmxhZywgbGcsIG51bVdpbiwgd2luLCB3aW5MZW47CisgIGNvbnN0IFNIT1JUICpSRVNUUklDVCBCYW5kT2Zmc2V0czsKKworICAvKiBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzICovCisgIEJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgbGcgPSBCYW5kT2Zmc2V0c1tHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoCisgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyldOworCisgIG51bVdpbiA9IEdldFdpbmRvd3NQZXJGcmFtZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CisgIHdpbkxlbiA9IChJc0xvbmdCbG9jaygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpCisgICAgICAgICAgICAgICA/IChpbnQpZnJhbWVfbGVuZ3RoCisgICAgICAgICAgICAgICA6IChpbnQpZnJhbWVfbGVuZ3RoIC8gbnVtV2luOworCisgIGlmIChmbGFncyAmIEFDX0lOREVQKSB7CisgICAgYXJpdGhfcmVzZXRfZmxhZyA9IDE7CisgIH0gZWxzZSB7CisgICAgYXJpdGhfcmVzZXRfZmxhZyA9IChVU0hPUlQpRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgfQorCisgIGZvciAod2luID0gMDsgd2luIDwgbnVtV2luOyB3aW4rKykgeworICAgIGVycm9yID0KKyAgICAgICAgQ0FyY29fRGVjb2RlQXJpdGhEYXRhKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmhBckNvLCBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW4sIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGcsIHdpbkxlbiwgYXJpdGhfcmVzZXRfZmxhZyAmJiAod2luID09IDApKTsKKyAgICBpZiAoZXJyb3IgIT0gQVJJVEhfQ09ERVJfT0spIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworYmFpbDoKKyAgaWYgKGVycm9yID09IEFSSVRIX0NPREVSX0VSUk9SKSB7CisgICAgZXJyb3JBQUMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICB9CisKKyAgcmV0dXJuIGVycm9yQUFDOworfQorCit2b2lkIEFwcGx5VG9vbHMoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1tdLAorICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZWxGbGFncywgY29uc3QgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgY29uc3QgaW50IGNvbW1vbl93aW5kb3cpIHsKKyAgaWYgKCEoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX01QRUdEX1JFUyB8IEFDX1JTVjYwM0RBKSkpIHsKKyAgICBDUG5zX0FwcGx5KCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5kYXRhLmFhYy5QbnNEYXRhLAorICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPmljc0luZm8sCisgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5wU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPnNwZWNTY2FsZSwKKyAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPmdyYW51bGVMZW5ndGgsIGNoYW5uZWwpOworICB9CisKKyAgVUNIQVIgbmJhbmRzID0KKyAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+aWNzSW5mbyk7CisKKyAgQ1Ruc19BcHBseSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+cER5bkRhdGEtPlRuc0RhdGEsCisgICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPmljc0luZm8sCisgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPmdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgbmJhbmRzLCAoZWxGbGFncyAmIEFDX0VMX0VOSEFOQ0VEX05PSVNFKSA/IDEgOiAwLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0V2luZG93Mk5yKGludCBsZW5ndGgsIGludCBzaGFwZSkgewogICBpbnQgbnIgPSAwOwogCiAgIGlmIChzaGFwZSA9PSAyKSB7CiAgICAgLyogTG93IE92ZXJsYXAsIDMvNCB6ZXJvZWQgKi8KLSAgICBuciA9IChsZW5ndGggKiAzKT4+MjsKKyAgICBuciA9IChsZW5ndGggKiAzKSA+PiAyOwogICB9CiAKICAgcmV0dXJuIG5yOwogfQogCi12b2lkIENCbG9ja19GcmVxdWVuY3lUb1RpbWUoQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gb3V0U2FtcGxlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUIGZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lT2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBXb3JrQnVmZmVyMSApCi17Ci0gIGludCBmciwgZmwsIHRsLCBuU2FtcGxlcywgblNwZWM7CitGSVhQX0RCTCBnZXRfZ2Fpbihjb25zdCBGSVhQX0RCTCAqeCwgY29uc3QgRklYUF9EQkwgKnksIGludCBuKSB7CisgIEZJWFBfREJMIGNvcnIgPSAoRklYUF9EQkwpMDsKKyAgRklYUF9EQkwgZW5lciA9IChGSVhQX0RCTCkxOwogCi0gIC8qIERldGVybWluZSBsZWZ0IHNsb3BlIGxlbmd0aCAoZmwpLCByaWdodCBzbG9wZSBsZW5ndGggKGZyKSBhbmQgdHJhbnNmb3JtIGxlbmd0aCAodGwpLgotICAgICBVU0FDOiBUaGUgc2xvcGUgbGVuZ3RoIG1heSBtaXNtYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBmcmFtZSBpbiBjYXNlIG9mIExQRCAvIEZECi0gICAgICAgICAgIHRyYW5zaXRpb25zLiBUaGUgYWRqdXN0bWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBpbWRjdCBpbXBsZW1lbnRhdGlvbi4KKyAgaW50IGhlYWRyb29tX3ggPSBnZXRTY2FsZWZhY3Rvcih4LCBuKTsKKyAgaW50IGhlYWRyb29tX3kgPSBnZXRTY2FsZWZhY3Rvcih5LCBuKTsKKworICAvKkNhbGN1bGF0ZSB0aGUgbm9ybWFsaXphdGlvbiBuZWNlc3NhcnkgZHVlIHRvIGFkZGl0aW9uKi8KKyAgLyogQ2hlY2sgZm9yIHBvd2VyIG9mIHR3byAvc3BlY2lhbCBjYXNlICovCisgIElOVCB3aWR0aF9zaGlmdCA9IChJTlQpKGZOb3JteigoRklYUF9EQkwpbikpOworICAvKiBHZXQgdGhlIG51bWJlciBvZiBiaXRzIG5lY2Vzc2FyeSBtaW51cyBvbmUsIGJlY2F1c2Ugd2UgbmVlZCBvbmUgc2lnbiBiaXQKKyAgICogb25seSAqLworICB3aWR0aF9zaGlmdCA9IDMxIC0gd2lkdGhfc2hpZnQ7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBjb3JyICs9CisgICAgICAgIGZNdWx0RGl2MigoeFtpXSA8PCBoZWFkcm9vbV94KSwgKHlbaV0gPDwgaGVhZHJvb21feSkpID4+IHdpZHRoX3NoaWZ0OworICAgIGVuZXIgKz0gZlBvdzJEaXYyKCh5W2ldIDw8IGhlYWRyb29tX3kpKSA+PiB3aWR0aF9zaGlmdDsKKyAgfQorCisgIGludCBleHBfY29yciA9ICgxNyAtIGhlYWRyb29tX3gpICsgKDE3IC0gaGVhZHJvb21feSkgKyB3aWR0aF9zaGlmdCArIDE7CisgIGludCBleHBfZW5lciA9ICgoMTcgLSBoZWFkcm9vbV95KSA8PCAxKSArIHdpZHRoX3NoaWZ0ICsgMTsKKworICBpbnQgdGVtcF9leHAgPSAwOworICBGSVhQX0RCTCBvdXRwdXQgPSBmRGl2Tm9ybVNpZ25lZChjb3JyLCBlbmVyLCAmdGVtcF9leHApOworCisgIGludCBvdXRwdXRfZXhwID0gKGV4cF9jb3JyIC0gZXhwX2VuZXIpICsgdGVtcF9leHA7CisKKyAgSU5UIG91dHB1dF9zaGlmdCA9IDE3IC0gb3V0cHV0X2V4cDsKKyAgb3V0cHV0X3NoaWZ0ID0gZk1pbihvdXRwdXRfc2hpZnQsIDMxKTsKKworICBvdXRwdXQgPSBzY2FsZVZhbHVlKG91dHB1dCwgLW91dHB1dF9zaGlmdCk7CisKKyAgcmV0dXJuIG91dHB1dDsKK30KKwordm9pZCBDQmxvY2tfRnJlcXVlbmN5VG9UaW1lKAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywgRklYUF9QQ00gb3V0U2FtcGxlc1tdLAorICAgIGNvbnN0IFNIT1JUIGZyYW1lTGVuLCBjb25zdCBpbnQgZnJhbWVPaywgRklYUF9EQkwgKnBXb3JrQnVmZmVyMSwKKyAgICBVSU5UIGVsRmxhZ3MsIElOVCBlbENoKSB7CisgIGludCBmciwgZmwsIHRsLCBuU3BlYzsKKworI2lmIGRlZmluZWQoRkRLX0FTU0VSVF9FTkFCTEUpCisgIExPTkcgblNhbXBsZXM7CisjZW5kaWYKKworICAvKiBEZXRlcm1pbmUgbGVmdCBzbG9wZSBsZW5ndGggKGZsKSwgcmlnaHQgc2xvcGUgbGVuZ3RoIChmcikgYW5kIHRyYW5zZm9ybQorICAgICBsZW5ndGggKHRsKS4gVVNBQzogVGhlIHNsb3BlIGxlbmd0aCBtYXkgbWlzbWF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgZnJhbWUgaW4KKyAgICAgY2FzZSBvZiBMUEQgLyBGRCB0cmFuc2l0aW9ucy4gVGhlIGFkanVzdG1lbnQgaXMgaGFuZGxlZCBieSB0aGUgaW1kY3QKKyAgICAgaW1wbGVtZW50YXRpb24uCiAgICovCiAgIHRsID0gZnJhbWVMZW47CiAgIG5TcGVjID0gMTsKIAotICBzd2l0Y2goIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8uV2luZG93U2VxdWVuY2UgKSB7CisgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mby5XaW5kb3dTZXF1ZW5jZSkgewogICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBPbmx5TG9uZ1NlcXVlbmNlOgorICAgIGNhc2UgQkxPQ0tfTE9ORzoKICAgICAgIGZsID0gZnJhbWVMZW47Ci0gICAgICBmciA9IGZyYW1lTGVuIC0gZ2V0V2luZG93Mk5yKGZyYW1lTGVuLCBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpOworICAgICAgZnIgPSBmcmFtZUxlbiAtCisgICAgICAgICAgIGdldFdpbmRvdzJOcihmcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSk7CisgICAgICAvKiBOZXcgc3RhcnR1cCBuZWVkcyBkaWZmZXJlbnRpYXRpb24gYmV0d2VlbiBzaW5lIHNoYXBlIGFuZCBsb3cgb3ZlcmxhcAorICAgICAgICAgc2hhcGUuIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgZm9yIHRoZSBMRC1BQUMgdHJhbnNmb3JtYXRpb24gd2luZG93cywKKyAgICAgICAgIGJlY2F1c2UgdGhlIHNsb3BlIGxlbmd0aCBjYW4gYmUgZGlmZmVyZW50IHdoaWxlIHVzaW5nIHRoZSBzYW1lIHdpbmRvdworICAgICAgICAgc2VxdWVuY2UuICovCisgICAgICBpZiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3QucHJldl90bCA9PSAwKSB7CisgICAgICAgIGZsID0gZnI7CisgICAgICB9CiAgICAgICBicmVhazsKLSAgICBjYXNlIExvbmdTdG9wU2VxdWVuY2U6CisgICAgY2FzZSBCTE9DS19TVE9QOgogICAgICAgZmwgPSBmcmFtZUxlbiA+PiAzOwogICAgICAgZnIgPSBmcmFtZUxlbjsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgTG9uZ1N0YXJ0U2VxdWVuY2U6IC8qIG9yIFN0b3BTdGFydFNlcXVlbmNlICovCisgICAgY2FzZSBCTE9DS19TVEFSVDogLyogb3IgU3RvcFN0YXJ0U2VxdWVuY2UgKi8KICAgICAgIGZsID0gZnJhbWVMZW47CiAgICAgICBmciA9IGZyYW1lTGVuID4+IDM7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEVpZ2h0U2hvcnRTZXF1ZW5jZToKKyAgICBjYXNlIEJMT0NLX1NIT1JUOgogICAgICAgZmwgPSBmciA9IGZyYW1lTGVuID4+IDM7CiAgICAgICB0bCA+Pj0gMzsKICAgICAgIG5TcGVjID0gODsKQEAgLTcxMSw0OCArMTA2MSwxOTggQEAKICAgfQogCiAgIHsKLSAgICBpbnQgaTsKKyAgICBpbnQgbGFzdF9mcmFtZV9sb3N0ID0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGNfbG9zdDsKIAotICAgIHsKLSAgICAgIEZJWFBfREJMICp0bXAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+d29ya0J1ZmZlckNvcmUxLT5tZGN0T3V0VGVtcDsKLQotICAgICAgblNhbXBsZXMgPSBpbWRjdF9ibG9jaygKLSAgICAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3QsCi0gICAgICAgICAgICAgIHRtcCwKLSAgICAgICAgICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KSwKLSAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlLAotICAgICAgICAgICAgICBuU3BlYywKLSAgICAgICAgICAgICAgZnJhbWVMZW4sCi0gICAgICAgICAgICAgIHRsLAotICAgICAgICAgICAgICBGREtnZXRXaW5kb3dTbG9wZShmbCwgR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSwKLSAgICAgICAgICAgICAgZmwsCi0gICAgICAgICAgICAgIEZES2dldFdpbmRvd1Nsb3BlKGZyLCBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpLAotICAgICAgICAgICAgICBmciwKLSAgICAgICAgICAgICAgKEZJWFBfREJMKTAgKTsKLQotICAgICAgZm9yIChpPTA7IGk8ZnJhbWVMZW47IGkrKykgewotICAgICAgICBvdXRTYW1wbGVzW2kqc3RyaWRlXSA9IElNRENUX1NDQUxFKHRtcFtpXSk7CisgICAgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfY29yZV9tb2RlID09IExQRCkgeworICAgICAgSU5UIGZhY19GQiA9IDE7CisgICAgICBpZiAoZWxGbGFncyAmIEFDX0VMX0ZVTExCQU5ETFBEKSB7CisgICAgICAgIGZhY19GQiA9IDI7CiAgICAgICB9CisKKyAgICAgIEZJWFBfREJMICpzeW50aDsKKworICAgICAgLyogS2VlcCBzb21lIGZyZWUgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiBUbyBiZSB1c2VkIGZvcgorICAgICAgICogcGFzdCBkYXRhICovCisgICAgICBpZiAoIShlbEZsYWdzICYgQUNfRUxfTFBEU1RFUkVPSURYKSkgeworICAgICAgICBzeW50aCA9IHBXb3JrQnVmZmVyMSArICgoUElUX01BWF9NQVggLSAoMSAqIExfU1VCRlIpKSAqIGZhY19GQik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzeW50aCA9IHBXb3JrQnVmZmVyMSArIFBJVF9NQVhfTUFYICogZmFjX0ZCOworICAgICAgfQorCisgICAgICBpbnQgZmFjX2xlbmd0aCA9CisgICAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8uV2luZG93U2VxdWVuY2UgPT0gQkxPQ0tfU0hPUlQpCisgICAgICAgICAgICAgID8gKGZyYW1lTGVuID4+IDQpCisgICAgICAgICAgICAgIDogKGZyYW1lTGVuID4+IDMpOworCisgICAgICBJTlQgcGl0Y2hbTkJfU1VCRlJfU1VQRVJGUiArIFNZTl9TRkRdOworICAgICAgRklYUF9EQkwgcGl0X2dhaW5bTkJfU1VCRlJfU1VQRVJGUiArIFNZTl9TRkRdOworCisgICAgICBpbnQgbmJEaXYgPSAoZWxGbGFncyAmIEFDX0VMX0ZVTExCQU5ETFBEKSA/IDIgOiA0OworICAgICAgaW50IGxGcmFtZSA9IChlbEZsYWdzICYgQUNfRUxfRlVMTEJBTkRMUEQpID8gZnJhbWVMZW4gLyAyIDogZnJhbWVMZW47CisgICAgICBpbnQgbmJTdWJmciA9CisgICAgICAgICAgbEZyYW1lIC8gKG5iRGl2ICogTF9TVUJGUik7IC8qIG51bWJlciBvZiBzdWJmcmFtZXMgcGVyIGRpdmlzaW9uICovCisgICAgICBpbnQgTHBkU2ZkID0gKG5iRGl2ICogbmJTdWJmcikgPj4gMTsKKyAgICAgIGludCBTeW5TZmQgPSBMcGRTZmQgLSBCUEZfU0ZEOworCisgICAgICBGREttZW1jbGVhcigKKyAgICAgICAgICBwaXRjaCwKKyAgICAgICAgICBzaXplb2YoCisgICAgICAgICAgICAgIHBpdGNoKSk7ICAvLyBhZGRlZCB0byBwcmV2ZW50IGZlcnJldCBlcnJvcnMgaW4gYmFzc19wZl8xc2ZfZGVsYXkKKyAgICAgIEZES21lbWNsZWFyKHBpdF9nYWluLCBzaXplb2YocGl0X2dhaW4pKTsKKworICAgICAgLyogRkFDIGNhc2UgKi8KKyAgICAgIGlmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlID09IDAgfHwKKyAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlID09IDQpIHsKKyAgICAgICAgRklYUF9EQkwgZmFjX2J1ZltMRkFDXTsKKyAgICAgICAgRklYUF9MUEMgKkEgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZbMF07CisKKyAgICAgICAgaWYgKCFmcmFtZU9rIHx8IGxhc3RfZnJhbWVfbG9zdCB8fAorICAgICAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVswXSA9PSBOVUxMKSkgeworICAgICAgICAgIEZES21lbWNsZWFyKGZhY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVswXSA9IGZhY19idWY7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhX2VbMF0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgSU5UIEFfZXhwOyAvKiBsaW5lYXIgcHJlZGljdGlvbiBjb2VmZmljaWVudHMgZXhwb25lbnQgKi8KKyAgICAgICAgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgICAgICAgICAgQVtpXSA9IEZYX0RCTDJGWF9MUEMoZml4cF9jb3MoCisgICAgICAgICAgICAgICAgZk11bHQocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBjNF9sc2ZbaV0sCisgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woKDEgPDwgTFNQQVJHX1NDQUxFKSAqIE1fUEkgLyA2NDAwLjApKSwKKyAgICAgICAgICAgICAgICBMU0ZfU0NBTEUgLSBMU1BBUkdfU0NBTEUpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBFX0xQQ19mX2xzcF9hX2NvbnZlcnNpb24oQSwgQSwgJkFfZXhwKTsKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZChGREtfQVNTRVJUX0VOQUJMRSkKKyAgICAgICAgblNhbXBsZXMgPQorI2VuZGlmCisgICAgICAgICAgICBDTHBkX0ZBQ19BY2VscDJNZGN0KAorICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdCwgc3ludGgsCisgICAgICAgICAgICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KSwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGUsIG5TcGVjLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVswXSwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFfZVswXSwgZmFjX2xlbmd0aCwKKyAgICAgICAgICAgICAgICBmcmFtZUxlbiwgdGwsCisgICAgICAgICAgICAgICAgRkRLZ2V0V2luZG93U2xvcGUoCisgICAgICAgICAgICAgICAgICAgIGZyLCBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpLAorICAgICAgICAgICAgICAgIGZyLCBBLCBBX2V4cCwgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmFjZWxwLAorICAgICAgICAgICAgICAgIChGSVhQX0RCTCkwLCAvKiBGQUMgZ2FpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQuICovCisgICAgICAgICAgICAgICAgKGxhc3RfZnJhbWVfbG9zdCB8fCAhZnJhbWVPayksIDEsCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGRfbW9kZSwgMCwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5jdXJyQWxpYXNpbmdTeW1tZXRyeSk7CisKKyAgICAgIH0gZWxzZSB7CisjaWYgZGVmaW5lZChGREtfQVNTRVJUX0VOQUJMRSkKKyAgICAgICAgblNhbXBsZXMgPQorI2VuZGlmCisgICAgICAgICAgICBpbWx0X2Jsb2NrKAorICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdCwgc3ludGgsCisgICAgICAgICAgICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KSwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGUsIG5TcGVjLCBmcmFtZUxlbiwgdGwsCisgICAgICAgICAgICAgICAgRkRLZ2V0V2luZG93U2xvcGUoCisgICAgICAgICAgICAgICAgICAgIGZsLCBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpLAorICAgICAgICAgICAgICAgIGZsLAorICAgICAgICAgICAgICAgIEZES2dldFdpbmRvd1Nsb3BlKAorICAgICAgICAgICAgICAgICAgICBmciwgR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSwKKyAgICAgICAgICAgICAgICBmciwgKEZJWFBfREJMKTAsCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Y3VyckFsaWFzaW5nU3ltbWV0cnkKKyAgICAgICAgICAgICAgICAgICAgPyBNTFRfRkxBR19DVVJSX0FMSUFTX1NZTU1FVFJZCisgICAgICAgICAgICAgICAgICAgIDogMCk7CisgICAgICB9CisgICAgICBGREtfQVNTRVJUKG5TYW1wbGVzID09IGZyYW1lTGVuKTsKKworICAgICAgLyogVGhlICJpZiIgY2xhdXNlIGlzIGVudGVyZWQgYm90aCBmb3IgZnVsbGJhbmRMcGQgbW9ubyBhbmQKKyAgICAgICAqIG5vbi1mdWxsYmFuZExwZCouIFRoZSAiZWxzZSItPiBqdXN0IGZvciBmdWxsYmFuZExwZCBzdGVyZW8qLworICAgICAgaWYgKCEoZWxGbGFncyAmIEFDX0VMX0xQRFNURVJFT0lEWCkpIHsKKyAgICAgICAgRkRLbWVtY3B5KHBpdGNoLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfVF9wZiwKKyAgICAgICAgICAgICAgICAgIFN5blNmZCAqIHNpemVvZihJTlQpKTsKKyAgICAgICAgRkRLbWVtY3B5KHBpdF9nYWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfZ2Fpbl9wZiwKKyAgICAgICAgICAgICAgICAgIFN5blNmZCAqIHNpemVvZihGSVhQX0RCTCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSBTeW5TZmQ7IGkgPCBMcGRTZmQgKyAzOyBpKyspIHsKKyAgICAgICAgICBwaXRjaFtpXSA9IExfU1VCRlI7CisgICAgICAgICAgcGl0X2dhaW5baV0gPSAoRklYUF9EQkwpMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlID09IDApIHsKKyAgICAgICAgICBwaXRjaFtTeW5TZmRdID0gcGl0Y2hbU3luU2ZkIC0gMV07CisgICAgICAgICAgcGl0X2dhaW5bU3luU2ZkXSA9IHBpdF9nYWluW1N5blNmZCAtIDFdOworICAgICAgICAgIGlmIChJc0xvbmdCbG9jaygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpIHsKKyAgICAgICAgICAgIHBpdGNoW1N5blNmZCArIDFdID0gcGl0Y2hbU3luU2ZkXTsKKyAgICAgICAgICAgIHBpdF9nYWluW1N5blNmZCArIDFdID0gcGl0X2dhaW5bU3luU2ZkXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDb3B5IG9sZCBkYXRhIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAqLworICAgICAgICB7CisgICAgICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgICAgICBwV29ya0J1ZmZlcjEsIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9zeW50aCwKKyAgICAgICAgICAgICAgKChQSVRfTUFYX01BWCAtICgxICogTF9TVUJGUikpICogZmFjX0ZCKSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICB9CisKKyAgICAgICAgRklYUF9EQkwgKnAyX3N5bnRoID0gcFdvcmtCdWZmZXIxICsgKFBJVF9NQVhfTUFYICogZmFjX0ZCKTsKKworICAgICAgICAvKiByZWNhbGN1bGF0ZSBwaXRjaCBnYWluIHRvIGFsbG93IHBvc3RmaWxlcmluZyBvbiBGQUMgYXJlYSAqLworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFN5blNmZCArIDI7IGkrKykgeworICAgICAgICAgIGludCBUID0gcGl0Y2hbaV07CisgICAgICAgICAgRklYUF9EQkwgZ2FpbiA9IHBpdF9nYWluW2ldOworCisgICAgICAgICAgaWYgKGdhaW4gPiAoRklYUF9EQkwpMCkgeworICAgICAgICAgICAgZ2FpbiA9IGdldF9nYWluKCZwMl9zeW50aFtpICogTF9TVUJGUiAqIGZhY19GQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAyX3N5bnRoWyhpICogTF9TVUJGUiAqIGZhY19GQikgLSBmYWNfRkIgKiBUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMX1NVQkZSICogZmFjX0ZCKTsKKyAgICAgICAgICAgIHBpdF9nYWluW2ldID0gZ2FpbjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBiYXNzX3BmXzFzZl9kZWxheShwMl9zeW50aCwgcGl0Y2gsIHBpdF9nYWluLCBmcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKExwZFNmZCArIDIpICogTF9TVUJGUiArIEJQRl9TRkQgKiBMX1NVQkZSLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbiAtIChMcGRTZmQgKyA0KSAqIExfU1VCRlIsIG91dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm1lbV9icGYpOworICAgICAgfQorCisgICAgfSBlbHNlIC8qIGxhc3RfY29yZV9tb2RlIHdhcyBub3QgTFBEICovCisgICAgeworICAgICAgRklYUF9EQkwgKnRtcCA9CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbVN0YXRpY0RhdGEtPnBXb3JrQnVmZmVyQ29yZTEtPm1kY3RPdXRUZW1wOworI2lmIGRlZmluZWQoRkRLX0FTU0VSVF9FTkFCTEUpCisgICAgICBuU2FtcGxlcyA9CisjZW5kaWYKKyAgICAgICAgICBpbWx0X2Jsb2NrKCZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdCwgdG1wLAorICAgICAgICAgICAgICAgICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZSwgblNwZWMsIGZyYW1lTGVuLCB0bCwKKyAgICAgICAgICAgICAgICAgICAgIEZES2dldFdpbmRvd1Nsb3BlKAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsLCBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpLAorICAgICAgICAgICAgICAgICAgICAgZmwsCisgICAgICAgICAgICAgICAgICAgICBGREtnZXRXaW5kb3dTbG9wZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICBmciwgR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSwKKyAgICAgICAgICAgICAgICAgICAgIGZyLCAoRklYUF9EQkwpMCwKKyAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmN1cnJBbGlhc2luZ1N5bW1ldHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgPyBNTFRfRkxBR19DVVJSX0FMSUFTX1NZTU1FVFJZCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAwKTsKKworICAgICAgc2NhbGVWYWx1ZXNTYXR1cmF0ZShvdXRTYW1wbGVzLCB0bXAsIGZyYW1lTGVuLCBNRENUX09VVF9IRUFEUk9PTSk7CiAgICAgfQogICB9CiAKICAgRkRLX0FTU0VSVChuU2FtcGxlcyA9PSBmcmFtZUxlbik7CiAKKyAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9jb3JlX21vZGUgPQorICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8uV2luZG93U2VxdWVuY2UgPT0gQkxPQ0tfU0hPUlQpID8gRkRfU0hPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZEX0xPTkc7CisgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGUgPSAyNTU7CiB9CiAKICNpbmNsdWRlICJsZGZpbHRiYW5rLmgiCi12b2lkIENCbG9ja19GcmVxdWVuY3lUb1RpbWVMb3dEZWxheSggQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gb3V0U2FtcGxlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0IGZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgc3RyaWRlICkKLXsKLSAgSW52TWRjdFRyYW5zZm9ybUxvd0RlbGF5X2ZkayAoCi0gICAgICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KSwKLSAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGVbMF0sCi0gICAgICAgICAgb3V0U2FtcGxlcywKLSAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5wT3ZlcmxhcEJ1ZmZlciwKLSAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgZnJhbWVMZW4KLSAgICAgICAgICApOwordm9pZCBDQmxvY2tfRnJlcXVlbmN5VG9UaW1lTG93RGVsYXkoCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBGSVhQX1BDTSBvdXRTYW1wbGVzW10sCisgICAgY29uc3Qgc2hvcnQgZnJhbWVMZW4pIHsKKyAgSW52TWRjdFRyYW5zZm9ybUxvd0RlbGF5X2ZkaygKKyAgICAgIFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCksCisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGVbMF0sIG91dFNhbXBsZXMsCisgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5wT3ZlcmxhcEJ1ZmZlciwgZnJhbWVMZW4pOwogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9ibG9jay5oIGIvbGliQUFDZGVjL3NyYy9ibG9jay5oCmluZGV4IGY5Mzk0ZjYuLmYwZjU2Y2QgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYmxvY2suaAorKysgYi9saWJBQUNkZWMvc3JjL2Jsb2NrLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBsb25nL3Nob3J0LWJsb2NrIGRlY29kaW5nCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgQkxPQ0tfSAogI2RlZmluZSBCTE9DS19ICkBAIC05NywyNSArMTA5LDE5IEBACiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCiAvKiBQTlMgKG9mIGJsb2NrKSAqLwotdm9pZCBDUG5zX1JlYWQgKENQbnNEYXRhICpwUG5zRGF0YSwKLSAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgICAgICAgICBjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uICpoY2IsCi0gICAgICAgICAgICAgICAgU0hPUlQgKnBTY2FsZUZhY3RvciwKLSAgICAgICAgICAgICAgICBVQ0hBUiBnbG9iYWxfZ2FpbiwKLSAgICAgICAgICAgICAgICBpbnQgYmFuZCwKLSAgICAgICAgICAgICAgICBpbnQgZ3JvdXApOwordm9pZCBDUG5zX1JlYWQoQ1Buc0RhdGEgKnBQbnNEYXRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gKmhjYiwgU0hPUlQgKnBTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgIFVDSEFSIGdsb2JhbF9nYWluLCBpbnQgYmFuZCwgaW50IGdyb3VwKTsKIAordm9pZCBDUG5zX0FwcGx5KGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLAorICAgICAgICAgICAgICAgIFNQRUNUUkFMX1BUUiBwU3BlY3RydW0sIGNvbnN0IFNIT1JUICpwU3BlY1NjYWxlLAorICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpwU2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgsIGNvbnN0IGludCBjaGFubmVsKTsKIAotdm9pZCBDUG5zX0FwcGx5IChjb25zdCBDUG5zRGF0YSAqcFBuc0RhdGEsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywKLSAgICAgICAgICAgICAgICAgU1BFQ1RSQUxfUFRSIHBTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgICAgKnBTcGVjU2NhbGUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICAgICpwU2NhbGVGYWN0b3IsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW5uZWwpOwotCi0KK3ZvaWQgQ0Jsb2NrX0FwcGx5Tm9pc2UoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIFVMT05HICpuZlJhbmRvbVNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpiYW5kX2lzX25vaXNlKTsKIAogLyogVE5TIChvZiBibG9jaykgKi8KIC8qIQpAQCAtMTI2LDI4ICsxMzIsMjEgQEAKIAogICBccmV0dXJuICBub25lCiAqLwotdm9pZCBDVG5zX1JlYWREYXRhUHJlc2VudEZsYWcoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVG5zRGF0YSAqcFRuc0RhdGEpOwordm9pZCBDVG5zX1JlYWREYXRhUHJlc2VudEZsYWcoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENUbnNEYXRhICpwVG5zRGF0YSk7CiAKLXZvaWQgQ1Ruc19SZWFkRGF0YVByZXNlbnRVc2FjKAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIENUbnNEYXRhICpwVG5zRGF0YTAsCi0gICAgICAgIENUbnNEYXRhICpwVG5zRGF0YTEsCi0gICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywKLSAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgY29uc3QgaW50IGZDb21tb25XaW5kb3cKLSAgICAgICAgKTsKK3ZvaWQgQ1Ruc19SZWFkRGF0YVByZXNlbnRVc2FjKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQ1Ruc0RhdGEgKnBUbnNEYXRhMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUbnNEYXRhICpwVG5zRGF0YTEsIFVDSEFSICpwdG5zX29uX2xyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLCBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBlbEZsYWdzLCBjb25zdCBpbnQgZkNvbW1vbldpbmRvdyk7CiAKLUFBQ19ERUNPREVSX0VSUk9SIENUbnNfUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVG5zRGF0YSAqcFRuc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MpOworQUFDX0RFQ09ERVJfRVJST1IgQ1Ruc19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDVG5zRGF0YSAqcFRuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLCBjb25zdCBVSU5UIGZsYWdzKTsKIAotdm9pZCBDVG5zX0FwcGx5ICggQ1Ruc0RhdGEgKlJFU1RSSUNUIHBUbnNEYXRhLCAvKiE8IHBvaW50ZXIgdG8gYWFjIGRlY29kZXIgaW5mbyAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLAotICAgICAgICAgICAgICAgICAgU1BFQ1RSQUxfUFRSIHBTcGVjdHJhbENvZWZmaWNpZW50LAotICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCk7Cit2b2lkIENUbnNfQXBwbHkoQ1Ruc0RhdGEgKlJFU1RSSUNUIHBUbnNEYXRhLCAvKiE8IHBvaW50ZXIgdG8gYWFjIGRlY29kZXIgaW5mbyAqLworICAgICAgICAgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywgU1BFQ1RSQUxfUFRSIHBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoLCBjb25zdCBVQ0hBUiBuYmFuZHMsCisgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgaWdmX2FjdGl2ZSwgY29uc3QgVUlOVCBmbGFncyk7CiAKIC8qIEJsb2NrICovCiAKQEAgLTE1NSwxNyArMTU0LDE2IEBACiAKIC8qKgogICogXGJyaWVmIFJlYWQgc2NhbGUgZmFjdG9yIGRhdGEuIFNlZSBjaGFwdGVyIDQuNi4yLjMuMiBvZiBJU08vSUVDIDE0NDk2LTMuCi0gKiAgICAgICAgVGhlIFNGX09GRlNFVCA9IDEwMCB2YWx1ZSByZWZlcmVuY2VkIGluIGNoYXB0ZXIgNC42LjIuMy4zIGlzIGFscmVhZHkgc3Vic3RyYWN0ZWQKLSAqICAgICAgICBmcm9tIHRoZSBzY2FsZSBmYWN0b3IgdmFsdWVzLiBBbHNvIGluY2x1ZGVzIFBOUyBkYXRhIHJlYWRpbmcuCisgKiAgICAgICAgVGhlIFNGX09GRlNFVCA9IDEwMCB2YWx1ZSByZWZlcmVuY2VkIGluIGNoYXB0ZXIgNC42LjIuMy4zIGlzIGFscmVhZHkKKyAqIHN1YnN0cmFjdGVkIGZyb20gdGhlIHNjYWxlIGZhY3RvciB2YWx1ZXMuIEFsc28gaW5jbHVkZXMgUE5TIGRhdGEgcmVhZGluZy4KICAqIFxwYXJhbSBicyBiaXQgc3RyZWFtIGhhbmRsZSBkYXRhIHNvdXJjZQotICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gY2hhbm5lbCBjb250ZXh0IGluZm8gd2VyZSBkZWNvZGVkIGRhdGEgaXMgc3RvcmVkIGludG8uCisgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBjaGFubmVsIGNvbnRleHQgaW5mbyB3ZXJlIGRlY29kZWQgZGF0YSBpcworICogc3RvcmVkIGludG8uCiAgKiBccGFyYW0gZmxhZ3MgdGhlIGRlY29kZXIgZmxhZ3MuCiAgKi8KIEFBQ19ERUNPREVSX0VSUk9SIENCbG9ja19SZWFkU2NhbGVGYWN0b3JEYXRhKAotICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgY29uc3QgVUlOVCBmbGFncwotICAgICAgICApOworICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgIGNvbnN0IFVJTlQgZmxhZ3MpOwogCiAvKioKICAqIFxicmllZiBSZWFkIEh1ZmZtYW4gZW5jb2RlZCBzcGVjdHJhbCBkYXRhLgpAQCAtMTczLDExMSArMTcxLDEyNCBAQAogICogXHBhcmFtIHBTYW1wbGluZ1JhdGVJbmZvIHNhbXBsaW5nIHJhdGUgaW5mbyAoc2ZiIG9mZnNldHMpLgogICogXHBhcmFtIGZsYWdzIHN5bnRheCBmbGFncy4KICAqLwotQUFDX0RFQ09ERVJfRVJST1IgIENCbG9ja19SZWFkU3BlY3RyYWxEYXRhKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgZmxhZ3MpOwotCi0KLUFBQ19ERUNPREVSX0VSUk9SIENCbG9ja19SZWFkU2VjdGlvbkRhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICBmbGFncyk7CitBQUNfREVDT0RFUl9FUlJPUiBDQmxvY2tfUmVhZFNwZWN0cmFsRGF0YSgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgY29uc3QgVUlOVCBmbGFncyk7CiAKIC8qKgotICogXGJyaWVmIGZpbmQgYSBjb21tb24gZXhwb25lbnQgKHNoaWZ0IGZhY3RvcikgZm9yIGFsbCBzZmIgaW4gZWFjaCBTcGVjdHJhbCB3aW5kb3csIGFuZCBzdG9yZSB0aGVtIGludG8KLSAqICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvOjpzcGVjU2NhbGUuCisgKiBcYnJpZWYgUmVhZCBBcml0aG1ldGljIGVuY29kZWQgc3BlY3RyYWwgZGF0YS4KICAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIGNoYW5uZWwgY29udGV4dCBpbmZvLgorICogXHBhcmFtIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gc3RhdGljIGNoYW5uZWwgY29udGV4dCBpbmZvLgorICogXHBhcmFtIHBTYW1wbGluZ1JhdGVJbmZvIHNhbXBsaW5nIHJhdGUgaW5mbyAoc2ZiIG9mZnNldHMpLgorICogXHBhcmFtIGZyYW1lX2xlbmd0aCBzcGVjdHJhbCB3aW5kb3cgbGVuZ3RoLgorICogXHBhcmFtIGZsYWdzIHN5bnRheCBmbGFncy4KKyAqIFxyZXR1cm4gZXJyb3IgY29kZS4KKyAqLworQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX1JlYWRBY1NwZWN0cmFsRGF0YSgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgY29uc3QgVUlOVCBmcmFtZV9sZW5ndGgsCisgICAgY29uc3QgVUlOVCBmbGFncyk7CisKK0FBQ19ERUNPREVSX0VSUk9SIENCbG9ja19SZWFkU2VjdGlvbkRhdGEoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIGNvbnN0IFVJTlQgZmxhZ3MpOworCisvKioKKyAqIFxicmllZiBmaW5kIGEgY29tbW9uIGV4cG9uZW50IChzaGlmdCBmYWN0b3IpIGZvciBhbGwgc2ZiIGluIGVhY2ggU3BlY3RyYWwKKyAqIHdpbmRvdywgYW5kIHN0b3JlIHRoZW0gaW50byBDQWFjRGVjb2RlckNoYW5uZWxJbmZvOjpzcGVjU2NhbGUuCisgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBjaGFubmVsIGNvbnRleHQgaW5mby4KKyAqIFxwYXJhbSBVQ0hBUiBtYXhTZmJzIG1heGltdW0gbnVtYmVyIG9mIFNGQnMgdG8gYmUgcHJvY2Vzc2VkIChtaWdodCBkaWZmZXIKKyAqIGZyb20gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mby5NYXhTZkJhbmRzKQogICogXHBhcmFtIHBTYW1wbGluZ1JhdGVJbmZvIHNhbXBsaW5nIHJhdGUgaW5mbyAoc2ZiIG9mZnNldHMpLgogICovCi12b2lkIENCbG9ja19TY2FsZVNwZWN0cmFsRGF0YShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbyk7Cit2b2lkIENCbG9ja19TY2FsZVNwZWN0cmFsRGF0YShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbWF4U2ZicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvKTsKIAogLyoqCiAgKiBcYnJpZWYgQXBwbHkgVE5TIGFuZCBQTlMgdG9vbHMuCiAgKi8KLXZvaWQgQXBwbHlUb29scyAoIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsICk7Cit2b2lkIEFwcGx5VG9vbHMoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1tdLAorICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZWxGbGFncywgY29uc3QgaW50IGNoYW5uZWwsIGNvbnN0IGludCBtYXliZV9qc3RlcmVvKTsKIAogLyoqCiAgKiBcYnJpZWYgVHJhbnNmb3JtIE1EQ1Qgc3BlY3RyYWwgZGF0YSBpbnRvIHRpbWUgZG9tYWluCiAgKi8KLXZvaWQgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZShDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSBvdXRTYW1wbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgZnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVPaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIxKTsKK3ZvaWQgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZSgKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIEZJWFBfUENNIG91dFNhbXBsZXNbXSwKKyAgICBjb25zdCBTSE9SVCBmcmFtZUxlbiwgY29uc3QgaW50IGZyYW1lT2ssIEZJWFBfREJMICpwV29ya0J1ZmZlcjEsCisgICAgVUlOVCBlbEZsYWdzLCBJTlQgZWxDaCk7CiAKIC8qKgogICogXGJyaWVmIFRyYW5zZm9ybSBkb3VibGUgbGFwcGVkIE1EQ1QgKEFBQy1FTEQpIHNwZWN0cmFsIGRhdGEgaW50byB0aW1lIGRvbWFpbi4KICAqLwotdm9pZCBDQmxvY2tfRnJlcXVlbmN5VG9UaW1lTG93RGVsYXkoQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNIG91dFNhbXBsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0IGZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBzdHJpZGUpOwordm9pZCBDQmxvY2tfRnJlcXVlbmN5VG9UaW1lTG93RGVsYXkoCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBGSVhQX1BDTSBvdXRTYW1wbGVzW10sCisgICAgY29uc3Qgc2hvcnQgZnJhbWVMZW4pOwogCi1BQUNfREVDT0RFUl9FUlJPUiBDQmxvY2tfSW52ZXJzZVF1YW50aXplU3BlY3RyYWxEYXRhKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvKTsKK0FBQ19ERUNPREVSX0VSUk9SIENCbG9ja19JbnZlcnNlUXVhbnRpemVTcGVjdHJhbERhdGEoCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgVUNIQVIgKmJhbmRfaXNfbm9pc2UsCisgICAgVUNIQVIgYWN0aXZlX2JhbmRfc2VhcmNoKTsKIAogLyoqCiAgKiBcYnJpZWYgQ2FsY3VsYXRlIDJeKGxzYi80KSAqIHZhbHVlXig0LzMpCi0gKiBccGFyYW0gcFZhbHVlIHBvaW50ZXIgdG8gcXVhbnRpemVkIHZhbHVlLiBUaGUgaW52ZXJzZSBxdWFudGl6ZWQgcmVzdWx0IGlzIHN0b3JlZCBiYWNrIGhlcmUuCi0gKiBccGFyYW0gbHNiIDIgTFNCcyBvZiB0aGUgc2NhbGUgZmFjdG9yIChzY2FsZUZhY3RvciAlIDQpIGFwcGxpZWQgYXMgcG93ZXIgMiBmYWN0b3IgdG8gdGhlCi0gKiAgICAgICAgcmVzdWx0aW5nIGludmVyc2UgcXVhbnRpemVkIHZhbHVlLgorICogXHBhcmFtIHBWYWx1ZSBwb2ludGVyIHRvIHF1YW50aXplZCB2YWx1ZS4gVGhlIGludmVyc2UgcXVhbnRpemVkIHJlc3VsdCBpcworICogc3RvcmVkIGJhY2sgaGVyZS4KKyAqIFxwYXJhbSBsc2IgMiBMU0JzIG9mIHRoZSBzY2FsZSBmYWN0b3IgKHNjYWxlRmFjdG9yICUgNCkgYXBwbGllZCBhcyBwb3dlciAyCisgKiBmYWN0b3IgdG8gdGhlIHJlc3VsdGluZyBpbnZlcnNlIHF1YW50aXplZCB2YWx1ZS4KICAqIFxyZXR1cm4gdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgKG1hbnRpc3NhKSBzdG9yZWQgaW50byAqcFZhbHVlLgogICovCiBGREtfSU5MSU5FCi1pbnQgRXZhbHVhdGVQb3dlcjQzICggRklYUF9EQkwgKnBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICBVSU5UIGxzYiApCi17CitpbnQgRXZhbHVhdGVQb3dlcjQzKEZJWFBfREJMICpwVmFsdWUsIFVJTlQgbHNiKSB7CiAgIEZJWFBfREJMIHZhbHVlOwogICBVSU5UIGZyZWVCaXRzOwogICBVSU5UIGV4cG9uZW50OwogCiAgIHZhbHVlID0gKnBWYWx1ZTsKLSAgZnJlZUJpdHMgPSBmTm9ybXogKHZhbHVlKSA7Ci0gIGV4cG9uZW50ID0gREZSQUNUX0JJVFMgLSBmcmVlQml0cyA7Ci0gIEZES19BU1NFUlQgKGV4cG9uZW50IDwgMTQpOworICBmcmVlQml0cyA9IGZOb3Jteih2YWx1ZSk7CisgIGV4cG9uZW50ID0gREZSQUNUX0JJVFMgLSBmcmVlQml0czsKKyAgRkRLX0FTU0VSVChleHBvbmVudCA8IDE0KTsKIAotICBVSU5UIHggPSAoKChpbnQpdmFsdWUgPDwgZnJlZUJpdHMpID4+IDE5KSA7Ci0gIFVJTlQgdGFibGVJbmRleCA9ICh4ICYgMHgwRkZGKSA+PiA0IDsKLSAgRklYUF9EQkwgaW52UVZhbCA7CisgIFVJTlQgeCA9ICgoKGludCl2YWx1ZSA8PCBmcmVlQml0cykgPj4gMTkpOworICBVSU5UIHRhYmxlSW5kZXggPSAoeCAmIDB4MEZGRikgPj4gNDsKKyAgRklYUF9EQkwgaW52UVZhbDsKIAogICB4ID0geCAmIDB4MEY7CiAKLSAgVUlOVCByMD0oTE9ORylJbnZlcnNlUXVhbnRUYWJsZSBbdGFibGVJbmRleCswXTsKLSAgVUlOVCByMT0oTE9ORylJbnZlcnNlUXVhbnRUYWJsZSBbdGFibGVJbmRleCsxXTsKLSAgVVNIT1JUIG54PTE2LXg7Ci0gIFVJTlQgdGVtcD0ocjApKm54KyhyMSkqeDsKKyAgVUlOVCByMCA9IChMT05HKUludmVyc2VRdWFudFRhYmxlW3RhYmxlSW5kZXggKyAwXTsKKyAgVUlOVCByMSA9IChMT05HKUludmVyc2VRdWFudFRhYmxlW3RhYmxlSW5kZXggKyAxXTsKKyAgVVNIT1JUIG54ID0gMTYgLSB4OworICBVSU5UIHRlbXAgPSAocjApKm54ICsgKHIxKSp4OwogICBpbnZRVmFsID0gKEZJWFBfREJMKXRlbXA7CiAKICAgRkRLX0FTU0VSVChsc2IgPCA0KTsKLSAgKnBWYWx1ZSA9IGZNdWx0RGl2MiAoaW52UVZhbCwgTWFudGlzc2FUYWJsZSBbbHNiXVtleHBvbmVudF0pIDsKKyAgKnBWYWx1ZSA9IGZNdWx0RGl2MihpbnZRVmFsLCBNYW50aXNzYVRhYmxlW2xzYl1bZXhwb25lbnRdKTsKIAogICAvKiArIDEgY29tcGVuc2F0ZXMgZk11bHREaXYyKCkuICovCi0gIHJldHVybiBFeHBvbmVudFRhYmxlIFtsc2JdW2V4cG9uZW50XSArIDE7CisgIHJldHVybiBFeHBvbmVudFRhYmxlW2xzYl1bZXhwb25lbnRdICsgMTsKIH0KIAorLyogUmVjYWxjdWxhdGUgZ2FpbiAqLworRklYUF9EQkwgZ2V0X2dhaW4oY29uc3QgRklYUF9EQkwgKngsIGNvbnN0IEZJWFBfREJMICp5LCBpbnQgbik7CisKIC8qKgotICogXGJyaWVmIGRldGVybWluZSB0aGUgcmVxdWlyZWQgc2hpZnQgc2NhbGUgZm9yIHRoZSBnaXZlbiBxdWFudGl6ZWQgdmFsdWUgYW5kIHNjYWxlIChmYWN0b3IgJSA0KSB2YWx1ZS4KKyAqIFxicmllZiBkZXRlcm1pbmUgdGhlIHJlcXVpcmVkIHNoaWZ0IHNjYWxlIGZvciB0aGUgZ2l2ZW4gcXVhbnRpemVkIHZhbHVlIGFuZAorICogc2NhbGUgKGZhY3RvciAlIDQpIHZhbHVlLgogICovCi1GREtfSU5MSU5FIGludCBHZXRTY2FsZUZyb21WYWx1ZSAoRklYUF9EQkwgdmFsdWUsIHVuc2lnbmVkIGludCBsc2IpCi17Ci0gIGlmICh2YWx1ZSE9KEZJWFBfREJMKTApCi0gIHsKLSAgICBpbnQgc2NhbGUgPSBFdmFsdWF0ZVBvd2VyNDMgKCZ2YWx1ZSwgbHNiKSA7Ci0gICAgcmV0dXJuIENudExlYWRpbmdaZXJvcyAodmFsdWUpIC0gc2NhbGUgLSAyIDsKLSAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7IC8qIFJldHVybiB6ZXJvLCBiZWNhdXNlIGl0cyB1c2VsZXNzIHRvIHNjYWxlIGEgemVybyB2YWx1ZSwgc2F2ZXMgd29ya2xvYWQgYW5kIGF2b2lkcyBzY2FsaW5nIG92ZXJzaGlmdHMuICovCitGREtfSU5MSU5FIGludCBHZXRTY2FsZUZyb21WYWx1ZShGSVhQX0RCTCB2YWx1ZSwgdW5zaWduZWQgaW50IGxzYikgeworICBpZiAodmFsdWUgIT0gKEZJWFBfREJMKTApIHsKKyAgICBpbnQgc2NhbGUgPSBFdmFsdWF0ZVBvd2VyNDMoJnZhbHVlLCBsc2IpOworICAgIHJldHVybiBDbnRMZWFkaW5nWmVyb3ModmFsdWUpIC0gc2NhbGUgLSAyOworICB9IGVsc2UKKyAgICByZXR1cm4gMDsgLyogUmV0dXJuIHplcm8sIGJlY2F1c2UgaXRzIHVzZWxlc3MgdG8gc2NhbGUgYSB6ZXJvIHZhbHVlLCBzYXZlcworICAgICAgICAgICAgICAgICB3b3JrbG9hZCBhbmQgYXZvaWRzIHNjYWxpbmcgb3ZlcnNoaWZ0cy4gKi8KIH0KIAotCi0vLyNpZmRlZiBBQUNERUNfSFVGRk1BTkRFQ09ERVJfRU5BQkxFCi0KIC8qIQogICBcYnJpZWYgUmVhZCBodWZmbWFuIGNvZGV3b3JkCiAKQEAgLTI4NiwyNyArMjk3LDI0IEBACiAKICAgXHJldHVybiAgaW5kZXggdmFsdWUKICovCi1pbmxpbmUgaW50IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZCggSEFORExFX0ZES19CSVRTVFJFQU0gYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGJpdHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gKmhjYiApICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBjb2RlYm9vayBkZXNjcmlwdGlvbiAqLworaW5saW5lIGludCBDQmxvY2tfRGVjb2RlSHVmZm1hbldvcmQoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYml0c3RyZWFtICovCisgICAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiKSAvKiE8IHBvaW50ZXIgdG8gY29kZWJvb2sgZGVzY3JpcHRpb24gKi8KIHsKICAgVUlOVCB2YWw7CiAgIFVJTlQgaW5kZXggPSAwOwotICBjb25zdCBVU0hPUlQgKCpDb2RlQm9vaykgW0h1ZmZtYW5FbnRyaWVzXSA9IGhjYi0+Q29kZUJvb2s7CisgIGNvbnN0IFVTSE9SVCgqQ29kZUJvb2spW0h1ZmZtYW5FbnRyaWVzXSA9IGhjYi0+Q29kZUJvb2s7CiAKLSAgd2hpbGUgKDEpCi0gIHsKLSAgICB2YWwgPSBDb2RlQm9va1tpbmRleF1bRkRLcmVhZEJpdHMoYnMsSHVmZm1hbkJpdHMpXTsgLyogRXhwZW5zaXZlIG1lbW9yeSBhY2Nlc3MgKi8KKyAgd2hpbGUgKDEpIHsKKyAgICB2YWwgPSBDb2RlQm9va1tpbmRleF0KKyAgICAgICAgICAgICAgICAgIFtGREtyZWFkQml0cyhicywgSHVmZm1hbkJpdHMpXTsgLyogRXhwZW5zaXZlIG1lbW9yeSBhY2Nlc3MgKi8KIAotICAgIGlmICgodmFsICYgMSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbmRleCA9IHZhbD4+MjsKKyAgICBpZiAoKHZhbCAmIDEpID09IDApIHsKKyAgICAgIGluZGV4ID0gdmFsID4+IDI7CiAgICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICh2YWwgJiAyKQotICAgICAgewotICAgICAgICBGREtwdXNoQmFja0NhY2hlKGJzLDEpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodmFsICYgMikgeworICAgICAgICBGREtwdXNoQmFja0NhY2hlKGJzLCAxKTsKICAgICAgIH0KIAogICAgICAgdmFsID4+PSAyOwpAQCAtMzE2LDcgKzMyNCwyMiBAQAogCiAgIHJldHVybiB2YWw7CiB9CitpbmxpbmUgaW50IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZENCKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCAvKiE8IHBvaW50ZXIgdG8gYml0c3RyZWFtICovCisgICAgY29uc3QgVVNIT1JUICgKKyAgICAgICAgKkNvZGVCb29rKVtIdWZmbWFuRW50cmllc10pIC8qITwgcG9pbnRlciB0byBjb2RlYm9vayBkZXNjcmlwdGlvbiAqLworeworICBVSU5UIGluZGV4ID0gMDsKIAotLy8jZW5kaWYgLyogQUFDREVDX0hVRkZNQU5ERUNPREVSX0VOQUJMRSAqLworICB3aGlsZSAoMSkgeworICAgIGluZGV4ID0gQ29kZUJvb2tbaW5kZXhdW0ZES3JlYWQyQml0cyhicyldOyAvKiBFeHBlbnNpdmUgbWVtb3J5IGFjY2VzcyAqLworICAgIGlmIChpbmRleCAmIDEpIGJyZWFrOworICAgIGluZGV4ID4+PSAyOworICB9CisgIGlmIChpbmRleCAmIDIpIHsKKyAgICBGREtwdXNoQmFja0NhY2hlKGJzLCAxKTsKKyAgfQorICByZXR1cm4gaW5kZXggPj4gMjsKK30KIAogI2VuZGlmIC8qICNpZm5kZWYgQkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9jaGFubmVsLmNwcCBiL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbC5jcHAKaW5kZXggNTQ3NTA3OS4uY2ZmZmQ1NyAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9jaGFubmVsLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2NoYW5uZWwuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIxICs5MCwyMSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjoKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImNoYW5uZWwuaCIKICNpbmNsdWRlICJhYWNkZWNvZGVyLmgiCiAjaW5jbHVkZSAiYmxvY2suaCIKICNpbmNsdWRlICJhYWNkZWNfdG5zLmgiCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgotI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKIAogI2luY2x1ZGUgImNvbmNlYWwuaCIKIApAQCAtMTAxLDI3ICsxMTIsNDYgQEAKIAogI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKIAorI2luY2x1ZGUgInVzYWNkZWNfbHBkLmgiCisjaW5jbHVkZSAidXNhY2RlY19mYWMuaCIKIAotc3RhdGljCi12b2lkIE1hcE1pZFNpZGVNYXNrVG9QbnNDb3JyZWxhdGlvbiAoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSkKLXsKK3N0YXRpYyB2b2lkIE1hcE1pZFNpZGVNYXNrVG9QbnNDb3JyZWxhdGlvbigKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzJdKSB7CiAgIGludCBncm91cDsKIAotICBmb3IgKGdyb3VwID0gMCA7IGdyb3VwIDwgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5XaW5kb3dHcm91cHM7CisgICAgICAgZ3JvdXArKykgewogICAgIFVDSEFSIGdyb3VwTWFzayA9IDEgPDwgZ3JvdXA7CiAKLSAgICBmb3IgKFVDSEFSIGJhbmQgPSAwIDsgYmFuZCA8IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8uTWF4U2ZCYW5kczsgYmFuZCsrKSB7Ci0gICAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YS5Nc1VzZWRbYmFuZF0gJiBncm91cE1hc2spIHsgLyogY2hhbm5lbHMgYXJlIGNvcnJlbGF0ZWQgKi8KLSAgICAgICAgQ1Buc19TZXRDb3JyZWxhdGlvbigmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+ZGF0YS5hYWMuUG5zRGF0YSwgZ3JvdXAsIGJhbmQsIDApOworICAgIGZvciAoVUNIQVIgYmFuZCA9IDA7IGJhbmQgPCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLk1heFNmQmFuZHM7CisgICAgICAgICBiYW5kKyspIHsKKyAgICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLk1zVXNlZFtiYW5kXSAmCisgICAgICAgICAgZ3JvdXBNYXNrKSB7IC8qIGNoYW5uZWxzIGFyZSBjb3JyZWxhdGVkICovCisgICAgICAgIENQbnNfU2V0Q29ycmVsYXRpb24oJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmRhdGEuYWFjLlBuc0RhdGEsIGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQsIDApOwogCi0gICAgICAgIGlmIChDUG5zX0lzUG5zVXNlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+ZGF0YS5hYWMuUG5zRGF0YSwgZ3JvdXAsIGJhbmQpICYmCi0gICAgICAgICAgICBDUG5zX0lzUG5zVXNlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+ZGF0YS5hYWMuUG5zRGF0YSwgZ3JvdXAsIGJhbmQpKQotICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGEuTXNVc2VkW2JhbmRdIF49IGdyb3VwTWFzazsgLyogY2xlYXIgdGhlIGdyb3VwTWFzay1iaXQgKi8KKyAgICAgICAgaWYgKENQbnNfSXNQbnNVc2VkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5kYXRhLmFhYy5QbnNEYXRhLCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQpICYmCisgICAgICAgICAgICBDUG5zX0lzUG5zVXNlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+ZGF0YS5hYWMuUG5zRGF0YSwgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kKSkKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLk1zVXNlZFtiYW5kXSBePQorICAgICAgICAgICAgICBncm91cE1hc2s7IC8qIGNsZWFyIHRoZSBncm91cE1hc2stYml0ICovCiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKK3N0YXRpYyB2b2lkIENsZWFuX0NvbXBsZXhfUHJlZGljdGlvbl9jb2VmZmljaWVudHMoCisgICAgQ0pvaW50U3RlcmVvUGVyc2lzdGVudERhdGEgKnBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLCBpbnQgd2luZG93R3JvdXBzLAorICAgIGNvbnN0IGludCBsb3dfbGltaXQsIGNvbnN0IGludCBoaWdoX2xpbWl0KSB7CisgIGZvciAoaW50IGdyb3VwID0gMDsgZ3JvdXAgPCB3aW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICBmb3IgKGludCBzZmIgPSBsb3dfbGltaXQ7IHNmYiA8IGhpZ2hfbGltaXQ7IHNmYisrKSB7CisgICAgICBwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+YWxwaGFfcV9yZV9wcmV2W2dyb3VwXVtzZmJdID0gMDsKKyAgICAgIHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX2ltX3ByZXZbZ3JvdXBdW3NmYl0gPSAwOworICAgIH0KKyAgfQorfQorCiAvKiEKICAgXGJyaWVmIERlY29kZSBjaGFubmVsIHBhaXIgZWxlbWVudAogCkBAIC0xMjksNzkgKzE1OSwyMzUgQEAKIAogICBccmV0dXJuICBub25lCiAqLwotdm9pZCBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlKCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzJdLCAvKiE8IHBvaW50ZXIgdG8gYWFjIGRlY29kZXIgY2hhbm5lbCBpbmZvICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVsX2NoYW5uZWxzKQotewotICBpbnQgY2gsIG1heWJlX2pzdGVyZW8gPSAwOwordm9pZCBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8KKyAgICAgICAgKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0sIC8qITwgcG9pbnRlciB0byBhYWMgZGVjb2RlciBjaGFubmVsIGluZm8gKi8KKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWzJdLAorICAgIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBVSU5UIGZsYWdzLCBVSU5UIGVsRmxhZ3MsCisgICAgaW50IGVsX2NoYW5uZWxzKSB7CisgIGludCBjaCA9IDA7CiAKLSAgbWF5YmVfanN0ZXJlbyA9IChlbF9jaGFubmVscyA+IDEpOworICBpbnQgbWF4U2ZCYW5kc0wgPSAwLCBtYXhTZkJhbmRzUiA9IDA7CisgIGludCBtYXliZV9qc3RlcmVvID0gKGVsX2NoYW5uZWxzID4gMSk7CiAKLSAgZm9yIChjaCA9IDA7IGNoIDwgZWxfY2hhbm5lbHM7IGNoKyspIHsKLSAgICBpZiAoIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfSU1EQ1QKLSAgICAgIHx8IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfRUxERkIgKQotICAgIHsKLSAgICAgIENCbG9ja19JbnZlcnNlUXVhbnRpemVTcGVjdHJhbERhdGEocEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgaWYgKGZsYWdzICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkgJiYgZWxfY2hhbm5lbHMgPT0gMikgeworICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5kYXRhLnVzYWMuY29yZV9tb2RlIHx8CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmRhdGEudXNhYy5jb3JlX21vZGUpIHsKKyAgICAgIG1heWJlX2pzdGVyZW8gPSAwOwogICAgIH0KICAgfQogCisgIGlmIChtYXliZV9qc3RlcmVvKSB7CisgICAgbWF4U2ZCYW5kc0wgPQorICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pOworICAgIG1heFNmQmFuZHNSID0KKyAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5pY3NJbmZvKTsKIAorICAgIC8qIGFwcGx5IG1zICovCisgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cpIHsKKyAgICAgIGlmICghKGZsYWdzICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkpKSB7CisgICAgICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5kYXRhLmFhYy5QbnNEYXRhLlBuc0FjdGl2ZSB8fAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+ZGF0YS5hYWMuUG5zRGF0YS5QbnNBY3RpdmUpIHsKKyAgICAgICAgICBNYXBNaWRTaWRlTWFza1RvUG5zQ29ycmVsYXRpb24ocEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIGlmIHRuc19vbl9sciA9PSAxIHJ1biBNUyAqLyAvKiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+c3BlY2lmaWNUby51c2FjLnRuc19hY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAxKSAqLworICAgICAgaWYgKCgoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkgJiYKKyAgICAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMudG5zX29uX2xyID09CisgICAgICAgICAgICAxKSkgfHwKKyAgICAgICAgICAoKGZsYWdzICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkpID09IDApKSB7CisgICAgICAgIGludCBtYXhfc2ZiX3N0ZSA9IChJTlQpKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8ubWF4X3NmYl9zdGUpOworCisgICAgICAgIENKb2ludFN0ZXJlb19BcHBseU1TKAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+YVNmYlNjYWxlLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cER5bkRhdGEtPmFTZmJTY2FsZSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnNwZWNTY2FsZSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnNwZWNTY2FsZSwKKyAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvKSwKKyAgICAgICAgICAgIEdldFdpbmRvd0dyb3VwTGVuZ3RoVGFibGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pLAorICAgICAgICAgICAgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSwgbWF4X3NmYl9zdGUsCisgICAgICAgICAgICBtYXhTZkJhbmRzTCwgbWF4U2ZCYW5kc1IsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdCisgICAgICAgICAgICAgICAgLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLnN0b3JlX2RteF9yZV9wcmV2LAorICAgICAgICAgICAgJihwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdCisgICAgICAgICAgICAgICAgICAtPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGEuc3RvcmVfZG14X3JlX3ByZXZfZSksCisgICAgICAgICAgICAxKTsKKworICAgICAgfSAvKiBpZiAoICgoZWxGbGFncyAmIEFDX0VMX1VTQUNfQ1BfUE9TU0lCTEUpLi4uLiAqLworICAgIH0gICAvKiBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdykqLworCisgICAgLyogYXBwbHkgaW50ZW5zaXR5IHN0ZXJlbyAqLyAvKiBtb2RpZmllcyBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10tPmFTcGVjU2ZiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoIShmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpKSkgeworICAgICAgaWYgKChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID09CisgICAgICAgICAgIDEpICYmCisgICAgICAgICAgKGVsX2NoYW5uZWxzID09IDIpKSB7CisgICAgICAgIENKb2ludFN0ZXJlb19BcHBseUlTKAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvKSwKKyAgICAgICAgICAgIEdldFdpbmRvd0dyb3VwTGVuZ3RoVGFibGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pLAorICAgICAgICAgICAgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSwKKyAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgKKyAgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbykpOworICAgICAgfQorICAgIH0KKyAgfSAvKiBtYXliZV9zdGVyZW8gKi8KKworICBmb3IgKGNoID0gMDsgY2ggPCBlbF9jaGFubmVsczsgY2grKykgeworICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cmVuZGVyTW9kZSA9PSBBQUNERUNfUkVOREVSX0xQRCkgeworICAgICAgLyogRGVjb2RlIExQRCBkYXRhICovCisgICAgICBDTHBkQ2hhbm5lbFN0cmVhbV9EZWNvZGUocEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0sIGZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgVUNIQVIgbm9TZmJzID0KKyAgICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5pY3NJbmZvKTsKKyAgICAgIC8qIEZvciBVU0FDIGNvbW1vbiB3aW5kb3c6IG1heF9zZmIgb2YgYm90aCBjaGFubmVscyBtYXkgZGlmZmVyCisgICAgICAgKiAoY29tbW9uX21heF9zZmIgPT0gMCkuICovCisgICAgICBpZiAoKG1heWJlX2pzdGVyZW8gPT0gMSkgJiYKKyAgICAgICAgICAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9PQorICAgICAgICAgICAxKSkgeworICAgICAgICBub1NmYnMgPSBmTWF4KG1heFNmQmFuZHNMLCBtYXhTZkJhbmRzUik7CisgICAgICB9CisgICAgICBpbnQgQ1BfYWN0aXZlID0gMDsKKyAgICAgIGlmIChlbEZsYWdzICYgQUNfRUxfVVNBQ19DUF9QT1NTSUJMRSkgeworICAgICAgICBDUF9hY3RpdmUgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXQorICAgICAgICAgICAgICAgICAgICAgICAgLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLmNwbHhfcHJlZF9mbGFnOworICAgICAgfQorCisgICAgICAvKiBPbWl0IHdyaXRpbmcgb2YgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnNwZWNTY2FsZSBmb3IgY29tcGxleAorICAgICAgICAgc3RlcmVvIHByZWRpY3Rpb24gc2luY2Ugc2NhbGluZyBoYXMgYWxyZWFkeSBiZWVuIGNhcnJpZWQgb3V0LiAqLworICAgICAgaW50IG1heF9zZmJfc3RlID0gKElOVCkocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5tYXhfc2ZiX3N0ZSk7CisKKyAgICAgIGlmICgoIUNQX2FjdGl2ZSkgfHwgKENQX2FjdGl2ZSAmJiAobWF4X3NmYl9zdGUgPCBub1NmYnMpKSB8fAorICAgICAgICAgICgoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkgJiYKKyAgICAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMudG5zX29uX2xyID09CisgICAgICAgICAgICAwKSkpIHsKKyAgICAgICAgQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLCBub1NmYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbyk7CisKKyAgICAgICAgLypBY3RpdmUgZm9yIHRoZSBjYXNlIG9mIFROUyBhcHBsaWVkIGJlZm9yZSBNUy9DUCovCisgICAgICAgIGlmICgoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkgJiYKKyAgICAgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+c3BlY2lmaWNUby51c2FjLnRuc19vbl9sciA9PQorICAgICAgICAgICAgIDApKSB7CisgICAgICAgICAgaWYgKElzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbykpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9TZmJzOyBpKyspIHsKKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhLT5hU2ZiU2NhbGVbaV0gPQorICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnNwZWNTY2FsZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBub1NmYnM7IGorKykgeworICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+YVNmYlNjYWxlW2kgKiAxNiArIGpdID0KKyAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnNwZWNTY2FsZVtpXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSAvKiBFbmQgImZvciAoY2ggPSAwOyBjaCA8IGVsX2NoYW5uZWxzOyBjaCsrKSIgKi8KIAogICBpZiAobWF5YmVfanN0ZXJlbykgewogICAgIC8qIGFwcGx5IG1zICovCiAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cpIHsKLSAgICAgIGludCBtYXhTZkJhbmRzTCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbyk7Ci0gICAgICBpbnQgbWF4U2ZCYW5kc1IgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmljc0luZm8pOwotICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmRhdGEuYWFjLlBuc0RhdGEuUG5zQWN0aXZlIHx8IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmRhdGEuYWFjLlBuc0RhdGEuUG5zQWN0aXZlKSB7Ci0gICAgICAgIE1hcE1pZFNpZGVNYXNrVG9QbnNDb3JyZWxhdGlvbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKKyAgICB9IC8qIENvbW1vbldpbmRvdyAqLworICAgIGVsc2UgeworICAgICAgaWYgKGVsRmxhZ3MgJiBBQ19FTF9VU0FDX0NQX1BPU1NJQkxFKSB7CisgICAgICAgIEZES21lbWNsZWFyKAorICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tMXQorICAgICAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEuYWxwaGFfcV9yZV9wcmV2LAorICAgICAgICAgICAgSm9pbnRTdGVyZW9NYXhpbXVtR3JvdXBzICogSm9pbnRTdGVyZW9NYXhpbXVtQmFuZHMgKiBzaXplb2YoU0hPUlQpKTsKKyAgICAgICAgRkRLbWVtY2xlYXIoCisgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW0xdCisgICAgICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS5hbHBoYV9xX2ltX3ByZXYsCisgICAgICAgICAgICBKb2ludFN0ZXJlb01heGltdW1Hcm91cHMgKiBKb2ludFN0ZXJlb01heGltdW1CYW5kcyAqIHNpemVvZihTSE9SVCkpOworICAgICAgfQorICAgIH0KKworICB9IC8qIGlmIChtYXliZV9qc3RlcmVvKSAqLworCisgIGZvciAoY2ggPSAwOyBjaCA8IGVsX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfTFBEKSB7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghKGZsYWdzICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkpKSB7CisgICAgICAgIC8qIFVzZSBzYW1lIHNlZWQgZm9yIGNvdXBsZWQgY2hhbm5lbHMgKENQRSkgKi8KKyAgICAgICAgaW50IHBuc0NoID0gKGNoID4gMCkgPyBMIDogY2g7CisgICAgICAgIENQbnNfVXBkYXRlTm9pc2VTdGF0ZSgKKyAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+ZGF0YS5hYWMuUG5zRGF0YSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bcG5zQ2hdLT5kYXRhLmFhYy5QbnNEYXRhLmN1cnJlbnRTZWVkLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21EYXRhLT5wbnNSYW5kb21TZWVkKTsKICAgICAgIH0KIAotICAgICAgQ0pvaW50U3RlcmVvX0FwcGx5TVMocEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFdpbmRvd0dyb3VwTGVuZ3RoVGFibGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmQmFuZHNMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZCYW5kc1IpOworICAgICAgaWYgKCghKGZsYWdzICYgKEFDX1VTQUMpKSkgfHwKKyAgICAgICAgICAoKGZsYWdzICYgKEFDX1VTQUMpKSAmJgorICAgICAgICAgICAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYy50bnNfYWN0aXZlID09CisgICAgICAgICAgICAxKSkgfHwKKyAgICAgICAgICAobWF5YmVfanN0ZXJlbyA9PSAwKSkgeworICAgICAgICBBcHBseVRvb2xzKAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8sIGZsYWdzLCBlbEZsYWdzLCBjaCwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cpOworICAgICAgfQorICAgIH0gLyogRW5kICJ9IGVsc2UiICovCisgIH0gICAvKiBFbmQgImZvciAoY2ggPSAwOyBjaCA8IGVsX2NoYW5uZWxzOyBjaCsrKSIgKi8KKworICBpZiAobWF5YmVfanN0ZXJlbykgeworICAgIC8qIGFwcGx5IG1zICovCisgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cpIHsKKyAgICAgIC8qIGlmIHRuc19vbl9sciA9PSAwIHJ1biBNUyAqLworICAgICAgaWYgKChmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpKSAmJgorICAgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+c3BlY2lmaWNUby51c2FjLnRuc19vbl9sciA9PQorICAgICAgICAgICAwKSkgeworICAgICAgICBpbnQgbWF4X3NmYl9zdGUgPSAoSU5UKShwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLm1heF9zZmJfc3RlKTsKKworICAgICAgICBDSm9pbnRTdGVyZW9fQXBwbHlNUygKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPmFTZmJTY2FsZSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnBEeW5EYXRhLT5hU2ZiU2NhbGUsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5zcGVjU2NhbGUsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5zcGVjU2NhbGUsCisgICAgICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbyksCisgICAgICAgICAgICBHZXRXaW5kb3dHcm91cExlbmd0aFRhYmxlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSwKKyAgICAgICAgICAgIEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbyksIG1heF9zZmJfc3RlLAorICAgICAgICAgICAgbWF4U2ZCYW5kc0wsIG1heFNmQmFuZHNSLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXQorICAgICAgICAgICAgICAgIC0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YS5zdG9yZV9kbXhfcmVfcHJldiwKKyAgICAgICAgICAgICYocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXQorICAgICAgICAgICAgICAgICAgLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLnN0b3JlX2RteF9yZV9wcmV2X2UpLAorICAgICAgICAgICAgMSk7CisgICAgICB9CisKKyAgICB9IC8qIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93KSAqLworCisgIH0gLyogaWYgKG1heWJlX2pzdGVyZW8pICovCisKKyAgZm9yIChjaCA9IDA7IGNoIDwgZWxfY2hhbm5lbHM7IGNoKyspIHsKKyAgICBpZiAoZWxGbGFncyAmIEFDX0VMX1VTQUNfQ1BfUE9TU0lCTEUpIHsKKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhLT5qb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLmNsZWFyU3BlY3RyYWxDb2VmZnMgPSAwOwogICAgIH0KLQotICAgIC8qIGFwcGx5IGludGVuc2l0eSBzdGVyZW8gKi8gLyogbW9kaWZpZXMgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tdLT5hU3BlY1NmYiAqLwotICAgIENKb2ludFN0ZXJlb19BcHBseUlTKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgIEdldFdpbmRvd0dyb3VwTGVuZ3RoVGFibGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgIEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID8gMSA6IDApOwotCiAgIH0KIAotICBmb3IgKGNoID0gMDsgY2ggPCBlbF9jaGFubmVsczsgY2grKykKLSAgewotICAgIHsKLSAgICAgIC8qIHdyaXRlIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5zcGVjU2NhbGUgKi8KLSAgICAgIENCbG9ja19TY2FsZVNwZWN0cmFsRGF0YShwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwgcFNhbXBsaW5nUmF0ZUluZm8pOwotCi0gICAgICBBcHBseVRvb2xzIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbywgZmxhZ3MsIGNoKTsKLSAgICB9Ci0KLSAgfQotCi0gIENSdmxjX0VsZW1lbnRDaGVjaygKLSAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCi0gICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgZWxfY2hhbm5lbHMKLSAgICAgICAgICApOworICBDUnZsY19FbGVtZW50Q2hlY2socEFhY0RlY29kZXJDaGFubmVsSW5mbywgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBlbF9jaGFubmVscyk7CiB9CiAKLXZvaWQgQ0NoYW5uZWxfQ29kZWJvb2tUYWJsZUluaXQoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbykKLXsKK3ZvaWQgQ0NoYW5uZWxfQ29kZWJvb2tUYWJsZUluaXQoCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbykgewogICBpbnQgYiwgdywgbWF4QmFuZHMsIG1heFdpbmRvd3M7CiAgIGludCBtYXhTZmIgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOwogICBVQ0hBUiAqcENvZGVCb29rID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9vazsKIAotICBpZiAoIElzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSApIHsKKyAgaWYgKElzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSkgewogICAgIG1heEJhbmRzID0gNjQ7CiAgICAgbWF4V2luZG93cyA9IDE7CiAgIH0gZWxzZSB7CkBAIC0yMDksNjAgKzM5NSw2OSBAQAogICAgIG1heFdpbmRvd3MgPSA4OwogICB9CiAKLSAgZm9yICh3ID0gMDsgdzxtYXhXaW5kb3dzOyB3KyspIHsKKyAgZm9yICh3ID0gMDsgdyA8IG1heFdpbmRvd3M7IHcrKykgewogICAgIGZvciAoYiA9IDA7IGIgPCBtYXhTZmI7IGIrKykgewogICAgICAgcENvZGVCb29rW2JdID0gRVNDQk9PSzsKICAgICB9Ci0gICAgZm9yICg7IGI8bWF4QmFuZHM7IGIrKykgeworICAgIGZvciAoOyBiIDwgbWF4QmFuZHM7IGIrKykgewogICAgICAgcENvZGVCb29rW2JdID0gWkVST19IQ0I7CiAgICAgfQogICAgIHBDb2RlQm9vayArPSBtYXhCYW5kczsKICAgfQogfQogCi0KIC8qCiAgKiBBcmJpdHJhcnkgb3JkZXIgYml0c3RyZWFtIHBhcnNlcgogICovCi0KLUFBQ19ERUNPREVSX0VSUk9SIENDaGFubmVsRWxlbWVudF9SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICBmcmFtZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBudW1iZXJPZkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgZXBDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVFJBTlNQT1JUREVDIHBUcERlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworQUFDX0RFQ09ERVJfRVJST1IgQ0NoYW5uZWxFbGVtZW50X1JlYWQoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tdLAorICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGFvdCwgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgY29uc3QgVUlOVCBmbGFncywgY29uc3QgVUlOVCBlbEZsYWdzLCBjb25zdCBVSU5UIGZyYW1lX2xlbmd0aCwKKyAgICBjb25zdCBVQ0hBUiBudW1iZXJPZkNoYW5uZWxzLCBjb25zdCBTQ0hBUiBlcENvbmZpZywKKyAgICBIQU5ETEVfVFJBTlNQT1JUREVDIHBUcERlYykgewogICBBQUNfREVDT0RFUl9FUlJPUiBlcnJvciA9IEFBQ19ERUNfT0s7CiAgIGNvbnN0IGVsZW1lbnRfbGlzdF90ICpsaXN0OwogICBpbnQgaSwgY2gsIGRlY2lzaW9uX2JpdDsKICAgaW50IGNyY1JlZzEgPSAtMSwgY3JjUmVnMiA9IC0xOworICBpbnQgY3BseFByZWQ7CisgIGludCBpbmRfc3dfY2NlX2ZsYWcgPSAwLCBudW1fZ2Fpbl9lbGVtZW50X2xpc3RzID0gMDsKIAotICBGREtfQVNTRVJUKCAobnVtYmVyT2ZDaGFubmVscyA9PSAxKSB8fCAobnVtYmVyT2ZDaGFubmVscyA9PSAyKSApOworICBGREtfQVNTRVJUKChudW1iZXJPZkNoYW5uZWxzID09IDEpIHx8IChudW1iZXJPZkNoYW5uZWxzID09IDIpKTsKIAogICAvKiBHZXQgY2hhbm5lbCBlbGVtZW50IHNlcXVlbmNlIHRhYmxlICovCi0gIGxpc3QgPSBnZXRCaXRzdHJlYW1FbGVtZW50TGlzdChhb3QsIGVwQ29uZmlnLCBudW1iZXJPZkNoYW5uZWxzLCAwKTsKKyAgbGlzdCA9IGdldEJpdHN0cmVhbUVsZW1lbnRMaXN0KGFvdCwgZXBDb25maWcsIG51bWJlck9mQ2hhbm5lbHMsIDAsIGVsRmxhZ3MpOwogICBpZiAobGlzdCA9PSBOVUxMKSB7CiAgICAgZXJyb3IgPSBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKICAgICBnb3RvIGJhaWw7CiAgIH0KIAogICBDVG5zX1Jlc2V0KCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+VG5zRGF0YSk7CisgIC8qIFNldCBjb21tb24gd2luZG93IHRvIDAgYnkgZGVmYXVsdC4gSWYgc2lnbmFsaXplZCBpbiB0aGUgYml0IHN0cmVhbSBpdCB3aWxsCisgICAqIGJlIG92ZXJ3cml0dGVuIGxhdGVyIGV4cGxpY2l0ZWx5ICovCisgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPSAwOworICBpZiAoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkgeworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMudG5zX2FjdGl2ZSA9IDA7CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYy50bnNfb25fbHIgPSAwOworICB9CiAgIGlmIChudW1iZXJPZkNoYW5uZWxzID09IDIpIHsKICAgICBDVG5zX1Jlc2V0KCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+VG5zRGF0YSk7CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IDA7CiAgIH0KIAotICBpZiAoZmxhZ3MgJiAoQUNfRUxEfEFDX1NDQUxBQkxFKSkgeworICBjcGx4UHJlZCA9IDA7CisgIGlmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICE9IE5VTEwpIHsKKyAgICBpZiAoZWxGbGFncyAmIEFDX0VMX1VTQUNfQ1BfUE9TU0lCTEUpIHsKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGEuY3BseF9wcmVkX2ZsYWcgPSAwOworICAgICAgY3BseFByZWQgPSAxOworICAgIH0KKyAgfQorCisgIGlmICgwIHx8IChmbGFncyAmIChBQ19FTEQgfCBBQ19TQ0FMQUJMRSkpKSB7CiAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IDE7CiAgICAgaWYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMikgewotICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3c7Ci0gICAgfQotICAgIGlmIChudW1iZXJPZkNoYW5uZWxzID09IDIpIHsKLSAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93OworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdzsKICAgICB9CiAgIH0KIApAQCAtMjcyLDE3MCArNDY3LDQxMyBAQAogICBkZWNpc2lvbl9iaXQgPSAwOwogICBkbyB7CiAgICAgc3dpdGNoIChsaXN0LT5pZFtpXSkgewotICAgIGNhc2UgZWxlbWVudF9pbnN0YW5jZV90YWc6Ci0gICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5FbGVtZW50SW5zdGFuY2VUYWcgPSBGREtyZWFkQml0cyhoQnMsIDQpOwotICAgICAgaWYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMikgewotICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5FbGVtZW50SW5zdGFuY2VUYWcgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5FbGVtZW50SW5zdGFuY2VUYWc7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvbW1vbl93aW5kb3c6Ci0gICAgICBkZWNpc2lvbl9iaXQgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IEZES3JlYWRCaXRzKGhCcywgMSk7Ci0gICAgICBpZiAobnVtYmVyT2ZDaGFubmVscyA9PSAyKSB7Ci0gICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBpY3NfaW5mbzoKLSAgICAgIC8qIFJlYWQgaW5kaXZpZHVhbCBjaGFubmVsIGluZm8gKi8KLSAgICAgIGVycm9yID0gSWNzUmVhZCggaEJzLAotICAgICAgICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICk7CisgICAgICBjYXNlIGVsZW1lbnRfaW5zdGFuY2VfdGFnOgorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5FbGVtZW50SW5zdGFuY2VUYWcgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgICBpZiAobnVtYmVyT2ZDaGFubmVscyA9PSAyKSB7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+RWxlbWVudEluc3RhbmNlVGFnID0KKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+RWxlbWVudEluc3RhbmNlVGFnOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBjb21tb25fd2luZG93OgorICAgICAgICBkZWNpc2lvbl9iaXQgPQorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPQorICAgICAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICAgIGlmIChudW1iZXJPZkNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID0KKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgaWNzX2luZm86CisgICAgICAgIC8qIHN0b3JlIGxhc3Qgd2luZG93IHNlcXVlbmNlICh1dGlsaXplZCBpbiBjb21wbGV4IHN0ZXJlbyBwcmVkaWN0aW9uKQorICAgICAgICAgKiBiZWZvcmUgcmVhZGluZyBuZXcgY2hhbm5lbC1pbmZvICovCisgICAgICAgIGlmIChjcGx4UHJlZCkgeworICAgICAgICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93KSB7CisgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWzBdCisgICAgICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS53aW5TZXFQcmV2ID0KKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvLldpbmRvd1NlcXVlbmNlOworICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1swXQorICAgICAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEud2luU2hhcGVQcmV2ID0KKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvLldpbmRvd1NoYXBlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBSZWFkIGluZGl2aWR1YWwgY2hhbm5lbCBpbmZvICovCisgICAgICAgIGVycm9yID0gSWNzUmVhZChoQnMsICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLCBmbGFncyk7CiAKLSAgICAgIGlmIChudW1iZXJPZkNoYW5uZWxzID09IDIgJiYgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdykgewotICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5pY3NJbmZvID0gcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+aWNzSW5mbzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworICAgICAgICBpZiAoZWxGbGFncyAmIEFDX0VMX0xGRSAmJgorICAgICAgICAgICAgR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5pY3NJbmZvKSAhPQorICAgICAgICAgICAgICAgIEJMT0NLX0xPTkcpIHsKKyAgICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAorICAgICAgICBpZiAobnVtYmVyT2ZDaGFubmVscyA9PSAyICYmCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93KSB7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+aWNzSW5mbyA9CisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPmljc0luZm87CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIGx0cF9kYXRhX3ByZXNlbnQ6Ci0gICAgICBpZiAoRkRLcmVhZEJpdHMoaEJzLCAxKSAhPSAwKSB7Ci0gICAgICAgIGVycm9yID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9QUkVESUNUSU9OOwotICAgICAgfQotICAgICAgYnJlYWs7CisgICAgICBjYXNlIGNvbW1vbl9tYXhfc2ZiOgorICAgICAgICBpZiAoRkRLcmVhZEJpdChoQnMpID09IDApIHsKKyAgICAgICAgICBlcnJvciA9IEljc1JlYWRNYXhTZmIoaEJzLCAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+aWNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBtczoKLSAgICAgIGlmICggQ0pvaW50U3RlcmVvX1JlYWQoCi0gICAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YSwgCi0gICAgICAgICAgICAgIEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+aWNzSW5mbyksCi0gICAgICAgICAgICAgIEdldFNjYWxlTWF4RmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+aWNzSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5pY3NJbmZvKSwKLSAgICAgICAgICAgICAgZmxhZ3MpICkKKyAgICAgIGNhc2UgbHRwX2RhdGFfcHJlc2VudDoKKyAgICAgICAgaWYgKEZES3JlYWRCaXRzKGhCcywgMSkgIT0gMCkgeworICAgICAgICAgIGVycm9yID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9QUkVESUNUSU9OOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIG1zOgorCisgICAgICAgIElOVCBtYXhfc2ZiX3N0ZTsKKyAgICAgICAgSU5UIG1heF9zZmJfc3RlX2NsZWFyOworCisgICAgICAgIG1heF9zZmJfc3RlID0gR2V0U2NhbGVNYXhGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKAorICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPmljc0luZm8sCisgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+aWNzSW5mbyk7CisKKyAgICAgICAgbWF4X3NmYl9zdGVfY2xlYXIgPSA2NDsKKworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvLm1heF9zZmJfc3RlID0gKFVDSEFSKW1heF9zZmJfc3RlOworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5pY3NJbmZvLm1heF9zZmJfc3RlID0gKFVDSEFSKW1heF9zZmJfc3RlOworCisgICAgICAgIGlmIChmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWNjAzREEpICYmCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9PQorICAgICAgICAgICAgICAgIDApIHsKKyAgICAgICAgICBDbGVhbl9Db21wbGV4X1ByZWRpY3Rpb25fY29lZmZpY2llbnRzKAorICAgICAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1swXQorICAgICAgICAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEsCisgICAgICAgICAgICAgIEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+aWNzSW5mbyksIDAsIDY0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChDSm9pbnRTdGVyZW9fUmVhZCgKKyAgICAgICAgICAgICAgICBoQnMsICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLAorICAgICAgICAgICAgICAgIEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+aWNzSW5mbyksCisgICAgICAgICAgICAgICAgbWF4X3NmYl9zdGUsIG1heF9zZmJfc3RlX2NsZWFyLAorICAgICAgICAgICAgICAgIC8qIGpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEgYW5kIGNwbHhQcmVkaWN0aW9uRGF0YSBhcmUgb25seQorICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS9hbGxvY2F0ZWQgaWYgY3BseFByZWQgaXMgYWN0aXZlLiAqLworICAgICAgICAgICAgICAgICgoY3BseFByZWQgPT0gMCkgfHwgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgID8gTlVMTAorICAgICAgICAgICAgICAgICAgICA6ICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhLT5qb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLAorICAgICAgICAgICAgICAgICgoY3BseFByZWQgPT0gMCkgfHwgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgID8gTlVMTAorICAgICAgICAgICAgICAgICAgICA6IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLT5wQ29tU3RhdGljRGF0YS0+Y3BseFByZWRpY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgIGNwbHhQcmVkLAorICAgICAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUb3RhbCgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+aWNzSW5mbyksCisgICAgICAgICAgICAgICAgR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPmljc0luZm8pLAorICAgICAgICAgICAgICAgIGZsYWdzKSkgeworICAgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGdsb2JhbF9nYWluOgorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4gPQorICAgICAgICAgICAgKFVDSEFSKUZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHNlY3Rpb25fZGF0YToKKyAgICAgICAgZXJyb3IgPSBDQmxvY2tfUmVhZFNlY3Rpb25EYXRhKGhCcywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywgZmxhZ3MpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBzY2FsZV9mYWN0b3JfZGF0YV91c2FjOgorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+Y3VyckFsaWFzaW5nU3ltbWV0cnkgPSAwOworICAgICAgICAvKiBTZXQgYWN0aXZlIHNmYiBjb2RlYm9vayBpbmRleGVzIHRvIEhDQl9FU0MgdG8gbWFrZSB0aGVtICJhY3RpdmUiICovCisgICAgICAgIENDaGFubmVsX0NvZGVib29rVGFibGVJbml0KAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0pOyAvKiAgZXF1YWxzIFJlYWRTZWN0aW9uRGF0YShzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicykgaW4gZmxvYXQgc29mdC4gYmxvY2suYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiB+NTk5ICovCisgICAgICAgIC8qIE5vdGU6IFRoZSBtaXNzaW5nICJicmVhayIgaXMgaW50ZW50aW9uYWwgaGVyZSwgc2luY2Ugd2UgbmVlZCB0byBjYWxsCisgICAgICAgICAqIENCbG9ja19SZWFkU2NhbGVGYWN0b3JEYXRhKCkuICovCisKKyAgICAgIGNhc2Ugc2NhbGVfZmFjdG9yX2RhdGE6CisgICAgICAgIGlmIChmbGFncyAmIEFDX0VSX1JWTEMpIHsKKyAgICAgICAgICAvKiByZWFkIFJWTEMgZGF0YSBmcm9tIGJpdHN0cmVhbSAoZXJyb3Igc2Vucy4gY2F0LiAxKSAqLworICAgICAgICAgIENSdmxjX1JlYWQocEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sIGhCcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZXJyb3IgPSBDQmxvY2tfUmVhZFNjYWxlRmFjdG9yRGF0YShwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwgaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHB1bHNlOgorICAgICAgICBpZiAoQ1B1bHNlRGF0YV9SZWFkKAorICAgICAgICAgICAgICAgIGhCcywKKyAgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5QdWxzZURhdGEsCisgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfTG9uZywgLyogcHVsc2UgZGF0YSBpcyBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQgaW4gbG9uZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyEgKi8KKyAgICAgICAgICAgICAgICAodm9pZCAqKSZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbywKKyAgICAgICAgICAgICAgICBmcmFtZV9sZW5ndGgpICE9IDApIHsKKyAgICAgICAgICBlcnJvciA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0bnNfZGF0YV9wcmVzZW50OgorICAgICAgICBDVG5zX1JlYWREYXRhUHJlc2VudEZsYWcoCisgICAgICAgICAgICBoQnMsICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPlRuc0RhdGEpOworICAgICAgICBpZiAoZWxGbGFncyAmIEFDX0VMX0xGRSAmJgorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhLT5UbnNEYXRhLkRhdGFQcmVzZW50KSB7CisgICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0bnNfZGF0YToKKyAgICAgICAgLyogdG5zX2RhdGFfcHJlc2VudCBpcyBjaGVja2VkIGluc2lkZSBDVG5zX1JlYWQoKS4gKi8KKyAgICAgICAgZXJyb3IgPSBDVG5zX1JlYWQoaEJzLCAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhLT5UbnNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmljc0luZm8sIGZsYWdzKTsKKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBnYWluX2NvbnRyb2xfZGF0YToKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudDoKKyAgICAgICAgaWYgKEZES3JlYWRCaXRzKGhCcywgMSkpIHsKKyAgICAgICAgICBlcnJvciA9IEFBQ19ERUNfVU5TVVBQT1JURURfR0FJTl9DT05UUk9MX0RBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdHdfZGF0YToKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGNvbW1vbl90dzoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRuc19kYXRhX3ByZXNlbnRfdXNhYzoKKyAgICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMudG5zX2FjdGl2ZSkgeworICAgICAgICAgIENUbnNfUmVhZERhdGFQcmVzZW50VXNhYygKKyAgICAgICAgICAgICAgaEJzLCAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPlRuc0RhdGEsCisgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+VG5zRGF0YSwKKyAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMudG5zX29uX2xyLAorICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+aWNzSW5mbywgZmxhZ3MsIGVsRmxhZ3MsCisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMudG5zX29uX2xyID0KKyAgICAgICAgICAgICAgKFVDSEFSKTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGNvcmVfbW9kZToKKyAgICAgICAgZGVjaXNpb25fYml0ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmRhdGEudXNhYy5jb3JlX21vZGUgPSBkZWNpc2lvbl9iaXQ7CisgICAgICAgIGlmICgoY2ggPT0gMSkgJiYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPmRhdGEudXNhYy5jb3JlX21vZGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+ZGF0YS51c2FjLmNvcmVfbW9kZSkpIHsKKyAgICAgICAgICAvKiBTdGVyZW9Db3JlVG9vbEluZm8oY29yZV9tb2RlW2NoXSApICovCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IDA7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRuc19hY3RpdmU6CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMudG5zX2FjdGl2ZSA9CisgICAgICAgICAgICBGREtyZWFkQml0KGhCcyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBub2lzZToKKyAgICAgICAgaWYgKGVsRmxhZ3MgJiBBQ19FTF9VU0FDX05PSVNFKSB7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgLT5wRHluRGF0YS0+c3BlY2lmaWNUby51c2FjLmZkX25vaXNlX2xldmVsX2FuZF9vZmZzZXQgPQorICAgICAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDMgKyA1KTsgLyogTm9pc2UgbGV2ZWwgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbHBkX2NoYW5uZWxfc3RyZWFtOgorCiAgICAgICB7Ci0gICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgZXJyb3IgPSBDTHBkQ2hhbm5lbFN0cmVhbV9SZWFkKC8qID0gbHBkX2NoYW5uZWxfc3RyZWFtKCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCcywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLCBmbGFncyk7CiAgICAgICB9Ci0gICAgICBicmVhazsKIAotICAgIGNhc2UgZ2xvYmFsX2dhaW46Ci0gICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGhCcyw4KTsKLSAgICAgIGJyZWFrOworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cmVuZGVyTW9kZSA9IEFBQ0RFQ19SRU5ERVJfTFBEOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZmFjX2RhdGE6IHsKKyAgICAgICAgaW50IGZGYWNEYXRQcmVzZW50ID0gRkRLcmVhZEJpdChoQnMpOwogCi0gICAgY2FzZSBzZWN0aW9uX2RhdGE6Ci0gICAgICBlcnJvciA9IENCbG9ja19SZWFkU2VjdGlvbkRhdGEoIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyApOwotICAgICAgYnJlYWs7CisgICAgICAgIC8qIFdlZSBuZWVkIGEgdmFsaWQgZmFjX2RhdGFbMF0gZXZlbiBpZiBubyBGQUMgZGF0YSBpcyBwcmVzZW50IChhcworICAgICAgICAgKiB0ZW1wb3JhbCBidWZmZXIpICovCisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5kYXRhLnVzYWMuZmFjX2RhdGFbMF0gPQorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmRhdGEudXNhYy5mYWNfZGF0YTA7CiAKKyAgICAgICAgaWYgKGZGYWNEYXRQcmVzZW50KSB7CisgICAgICAgICAgaWYgKGVsRmxhZ3MgJiBBQ19FTF9MRkUpIHsKKyAgICAgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBGQUMgZGF0YSBwcmVzZW50LCB0aGlzIGZyYW1lIGlzIEZELCBzbyB0aGUgbGFzdCBtb2RlIGhhZCB0byBiZQorICAgICAgICAgICAqIEFDRUxQLiAqLworICAgICAgICAgIGlmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+bGFzdF9jb3JlX21vZGUgIT0gTFBEIHx8CisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5sYXN0X2xwZF9tb2RlICE9IDApIHsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5kYXRhLnVzYWMuY29yZV9tb2RlX2xhc3QgPSBMUEQ7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+ZGF0YS51c2FjLmxwZF9tb2RlX2xhc3QgPSAwOworICAgICAgICAgICAgLyogV2UgY2FuJ3QgY2hhbmdlIHRoZSBwYXN0ISBTbyBsb29rIHRvIHRoZSBmdXR1cmUgYW5kIGdvIGFoZWFkISAqLworICAgICAgICAgIH0KKyAgICAgICAgICBDTHBkX0ZBQ19SZWFkKGhCcywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmRhdGEudXNhYy5mYWNfZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5kYXRhLnVzYWMuZmFjX2RhdGFfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENMcGRfRkFDX2dldExlbmd0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0xvbmdCbG9jaygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmljc0luZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5ncmFudWxlTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+bGFzdF9jb3JlX21vZGUgPT0gTFBEICYmCisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5sYXN0X2xwZF9tb2RlID09IDApIHsKKyAgICAgICAgICAgIC8qIEFDRUxQIHRvIEZEIHRyYW5zaXRvbnMgd2l0aG91dCBGQUMgYXJlIHBvc3NpYmxlLiBUaGF0IGlzIHdoeSB3ZQorICAgICAgICAgICAgemVybyBpdCBvdXQgKGkuZSBGQUMgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBpbiB0aGUgc3Vic2VxdWVudAorICAgICAgICAgICAgY2FsY3VsYXRpb25zICovCisgICAgICAgICAgICBGREttZW1jbGVhcihwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+ZGF0YS51c2FjLmZhY19kYXRhMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExGQUMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIGVzYzJfcnZsYzoKKyAgICAgICAgaWYgKGZsYWdzICYgQUNfRVJfUlZMQykgeworICAgICAgICAgIENSdmxjX0RlY29kZShwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0sIGhCcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIHNjYWxlX2ZhY3Rvcl9kYXRhOgotICAgICAgaWYgKGZsYWdzICYgQUNfRVJfUlZMQykgewotICAgICAgICAvKiByZWFkIFJWTEMgZGF0YSBmcm9tIGJpdHN0cmVhbSAoZXJyb3Igc2Vucy4gY2F0LiAxKSAqLyAKLSAgICAgICAgQ1J2bGNfUmVhZChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwgaEJzKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBDQmxvY2tfUmVhZFNjYWxlRmFjdG9yRGF0YShwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwgaEJzLCBmbGFncyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgZXNjMV9oY3I6CisgICAgICAgIGlmIChmbGFncyAmIEFDX0VSX0hDUikgeworICAgICAgICAgIENIY3JfUmVhZChoQnMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLAorICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkNoYW5uZWxzID09IDIgPyBJRF9DUEUgOiBJRF9TQ0UpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBwdWxzZToKLSAgICAgIGlmICggQ1B1bHNlRGF0YV9SZWFkKCBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5QdWxzZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfTG9uZywgLyogcHVsc2UgZGF0YSBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgcHJlc2VudCBpbiBsb25nIGJsb2NrcyEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5pY3NJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2xlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICApICE9IDAgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0bnNfZGF0YV9wcmVzZW50OgotICAgICAgQ1Ruc19SZWFkRGF0YVByZXNlbnRGbGFnKGhCcywgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+VG5zRGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRuc19kYXRhOgotICAgICAgLyogdG5zX2RhdGFfcHJlc2VudCBpcyBjaGVja2VkIGluc2lkZSBDVG5zX1JlYWQoKS4gKi8KLSAgICAgIGVycm9yID0gQ1Ruc19SZWFkKGhCcywgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+VG5zRGF0YSwgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5pY3NJbmZvLCBmbGFncyk7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2Ugc3BlY3RyYWxfZGF0YToKKyAgICAgICAgZXJyb3IgPSBDQmxvY2tfUmVhZFNwZWN0cmFsRGF0YShoQnMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLCBmbGFncyk7CisgICAgICAgIGlmIChmbGFncyAmIEFDX0VMRCkgeworICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID0gQUFDREVDX1JFTkRFUl9FTERGQjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoZmxhZ3MgJiBBQ19IREFBQykgeworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnJlbmRlck1vZGUgPSBBQUNERUNfUkVOREVSX0lOVElNRENUOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cmVuZGVyTW9kZSA9IEFBQ0RFQ19SRU5ERVJfSU1EQ1Q7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBnYWluX2NvbnRyb2xfZGF0YToKLSAgICAgIGJyZWFrOwotICAgIAotICAgIGNhc2UgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudDoKLSAgICAgIGlmIChGREtyZWFkQml0cyhoQnMsIDEpKSB7Ci0gICAgICAgIGVycm9yID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9HQUlOX0NPTlRST0xfREFUQTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlc2MyX3J2bGM6Ci0gICAgICBpZiAoZmxhZ3MgJiBBQ19FUl9SVkxDKSB7Ci0gICAgICAgIENSdmxjX0RlY29kZSgKLSAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwKLSAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXSwKLSAgICAgICAgICAgICAgICBoQnMKLSAgICAgICAgICAgICAgICApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVzYzFfaGNyOgotICAgICAgaWYgKGZsYWdzICYgQUNfRVJfSENSKSB7Ci0gICAgICAgIENIY3JfUmVhZChoQnMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdICk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Ugc3BlY3RyYWxfZGF0YToKLSAgICAgIGVycm9yID0gQ0Jsb2NrX1JlYWRTcGVjdHJhbERhdGEoIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyApOwotICAgICAgaWYgKGZsYWdzICYgQUNfRUxEKSB7Ci0gICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID0gQUFDREVDX1JFTkRFUl9FTERGQjsKLSAgICAgIH0gZWxzZSB7CisgICAgICBjYXNlIGFjX3NwZWN0cmFsX2RhdGE6CisgICAgICAgIGVycm9yID0gQ0Jsb2NrX1JlYWRBY1NwZWN0cmFsRGF0YSgKKyAgICAgICAgICAgIGhCcywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLAorICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sIGZyYW1lX2xlbmd0aCwgZmxhZ3MpOwogICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cmVuZGVyTW9kZSA9IEFBQ0RFQ19SRU5ERVJfSU1EQ1Q7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKyAgICAgICAgYnJlYWs7CiAKKyAgICAgIGNhc2UgY291cGxlZF9lbGVtZW50czogeworICAgICAgICBpbnQgbnVtX2NvdXBsZWRfZWxlbWVudHMsIGM7CiAKLSAgICAgIC8qIENSQyBoYW5kbGluZyAqLwotICAgIGNhc2UgYWR0c2NyY19zdGFydF9yZWcxOgotICAgICAgaWYgKHBUcERlYyAhPSBOVUxMKSB7Ci0gICAgICAgIGNyY1JlZzEgPSB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcocFRwRGVjLCAxOTIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBhZHRzY3JjX3N0YXJ0X3JlZzI6Ci0gICAgICBpZiAocFRwRGVjICE9IE5VTEwpIHsKLSAgICAgICAgY3JjUmVnMiA9IHRyYW5zcG9ydERlY19DcmNTdGFydFJlZyhwVHBEZWMsIDEyOCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGFkdHNjcmNfZW5kX3JlZzE6Ci0gICAgY2FzZSBkcm1jcmNfZW5kX3JlZzoKLSAgICAgIGlmIChwVHBEZWMgIT0gTlVMTCkgewotICAgICAgICB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKHBUcERlYywgY3JjUmVnMSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGFkdHNjcmNfZW5kX3JlZzI6Ci0gICAgICBpZiAocFRwRGVjICE9IE5VTEwpIHsKLSAgICAgICAgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhwVHBEZWMsIGNyY1JlZzIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBkcm1jcmNfc3RhcnRfcmVnOgotICAgICAgaWYgKHBUcERlYyAhPSBOVUxMKSB7Ci0gICAgICAgIGNyY1JlZzEgPSB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcocFRwRGVjLCAwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworICAgICAgICBpbmRfc3dfY2NlX2ZsYWcgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgIG51bV9jb3VwbGVkX2VsZW1lbnRzID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKIAotICAgICAgLyogTm9uIGRhdGEgY2FzZXMgKi8KLSAgICBjYXNlIG5leHRfY2hhbm5lbDoKLSAgICAgIGNoID0gKGNoICsgMSkgJSBudW1iZXJPZkNoYW5uZWxzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsaW5rX3NlcXVlbmNlOgotICAgICAgbGlzdCA9IGxpc3QtPm5leHRbZGVjaXNpb25fYml0XTsKLSAgICAgIGk9LTE7Ci0gICAgICBicmVhazsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IChudW1fY291cGxlZF9lbGVtZW50cyArIDEpOyBjKyspIHsKKyAgICAgICAgICBpbnQgY2NfdGFyZ2V0X2lzX2NwZTsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvciA9IEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOwotICAgICAgYnJlYWs7CisgICAgICAgICAgbnVtX2dhaW5fZWxlbWVudF9saXN0cysrOworICAgICAgICAgIGNjX3RhcmdldF9pc19jcGUgPSBGREtyZWFkQml0KGhCcyk7IC8qIGNjX3RhcmdldF9pc19jcGVbY10gKi8KKyAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDQpOyAgICAgICAgICAgICAgICAvKiBjY190YXJnZXRfdGFnX3NlbGVjdFtjXSAqLworCisgICAgICAgICAgaWYgKGNjX3RhcmdldF9pc19jcGUpIHsKKyAgICAgICAgICAgIGludCBjY19sLCBjY19yOworCisgICAgICAgICAgICBjY19sID0gRkRLcmVhZEJpdChoQnMpOyAvKiBjY19sW2NdICovCisgICAgICAgICAgICBjY19yID0gRkRLcmVhZEJpdChoQnMpOyAvKiBjY19yW2NdICovCisKKyAgICAgICAgICAgIGlmIChjY19sICYmIGNjX3IpIHsKKyAgICAgICAgICAgICAgbnVtX2dhaW5fZWxlbWVudF9saXN0cysrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGREtyZWFkQml0KGhCcyk7ICAgICAvKiBjY19kb21haW4gKi8KKyAgICAgICAgRkRLcmVhZEJpdChoQnMpOyAgICAgLyogZ2Fpbl9lbGVtZW50X3NpZ24gICovCisgICAgICAgIEZES3JlYWRCaXRzKGhCcywgMik7IC8qIGdhaW5fZWxlbWVudF9zY2FsZSAqLworICAgICAgfSBicmVhazsKKworICAgICAgY2FzZSBnYWluX2VsZW1lbnRfbGlzdHM6IHsKKyAgICAgICAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiOworICAgICAgICBVQ0hBUiAqcENvZGVCb29rOworICAgICAgICBpbnQgYzsKKworICAgICAgICBoY2IgPSAmQUFDY29kZUJvb2tEZXNjcmlwdGlvblRhYmxlW0JPT0tTQ0xdOworICAgICAgICBwQ29kZUJvb2sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPmFDb2RlQm9vazsKKworICAgICAgICBmb3IgKGMgPSAxOyBjIDwgbnVtX2dhaW5fZWxlbWVudF9saXN0czsgYysrKSB7CisgICAgICAgICAgaW50IGNnZTsKKyAgICAgICAgICBpZiAoaW5kX3N3X2NjZV9mbGFnKSB7CisgICAgICAgICAgICBjZ2UgPSAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjZ2UgPSBGREtyZWFkQml0cyhoQnMsIDEpOyAvKiBjb21tb25fZ2Fpbl9lbGVtZW50X3ByZXNlbnRbY10gKi8KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGNnZSkgeworICAgICAgICAgICAgLyogSHVmZm1hbiAqLworICAgICAgICAgICAgQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkKAorICAgICAgICAgICAgICAgIGhCcywgaGNiKTsgLyogaGNvZF9zZltjb21tb25fZ2Fpbl9lbGVtZW50W2NdXSAxLi4xOSAqLworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgZywgc2ZiOworICAgICAgICAgICAgZm9yIChnID0gMDsKKyAgICAgICAgICAgICAgICAgZyA8IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmljc0luZm8pOworICAgICAgICAgICAgICAgICBnKyspIHsKKyAgICAgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbyk7CisgICAgICAgICAgICAgICAgICAgc2ZiKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocENvZGVCb29rW3NmYl0gIT0gWkVST19IQ0IpIHsKKyAgICAgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gKi8KKyAgICAgICAgICAgICAgICAgIENCbG9ja19EZWNvZGVIdWZmbWFuV29yZCgKKyAgICAgICAgICAgICAgICAgICAgICBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgaGNiKTsgLyogaGNvZF9zZltkcGNtX2dhaW5fZWxlbWVudFtjXVtnXVtzZmJdXSAxLi4xOSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKworICAgICAgICAvKiBDUkMgaGFuZGxpbmcgKi8KKyAgICAgIGNhc2UgYWR0c2NyY19zdGFydF9yZWcxOgorICAgICAgICBpZiAocFRwRGVjICE9IE5VTEwpIHsKKyAgICAgICAgICBjcmNSZWcxID0gdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnKHBUcERlYywgMTkyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYWR0c2NyY19zdGFydF9yZWcyOgorICAgICAgICBpZiAocFRwRGVjICE9IE5VTEwpIHsKKyAgICAgICAgICBjcmNSZWcyID0gdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnKHBUcERlYywgMTI4KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYWR0c2NyY19lbmRfcmVnMToKKyAgICAgIGNhc2UgZHJtY3JjX2VuZF9yZWc6CisgICAgICAgIGlmIChwVHBEZWMgIT0gTlVMTCkgeworICAgICAgICAgIHRyYW5zcG9ydERlY19DcmNFbmRSZWcocFRwRGVjLCBjcmNSZWcxKTsKKyAgICAgICAgICBjcmNSZWcxID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGFkdHNjcmNfZW5kX3JlZzI6CisgICAgICAgIGlmIChjcmNSZWcxICE9IC0xKSB7CisgICAgICAgICAgZXJyb3IgPSBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKKyAgICAgICAgfSBlbHNlIGlmIChwVHBEZWMgIT0gTlVMTCkgeworICAgICAgICAgIHRyYW5zcG9ydERlY19DcmNFbmRSZWcocFRwRGVjLCBjcmNSZWcyKTsKKyAgICAgICAgICBjcmNSZWcyID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGRybWNyY19zdGFydF9yZWc6CisgICAgICAgIGlmIChwVHBEZWMgIT0gTlVMTCkgeworICAgICAgICAgIGNyY1JlZzEgPSB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcocFRwRGVjLCAwKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICAvKiBOb24gZGF0YSBjYXNlcyAqLworICAgICAgY2FzZSBuZXh0X2NoYW5uZWw6CisgICAgICAgIGNoID0gKGNoICsgMSkgJSBudW1iZXJPZkNoYW5uZWxzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbGlua19zZXF1ZW5jZToKKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHRbZGVjaXNpb25fYml0XTsKKyAgICAgICAgaSA9IC0xOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3IgPSBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgaWYgKGVycm9yICE9IEFBQ19ERUNfT0spIHsKQEAgLTQ0Niw2ICs4ODQsNDAgQEAKIAogICB9IHdoaWxlIChsaXN0LT5pZFtpXSAhPSBlbmRfb2Zfc2VxdWVuY2UpOwogCisgIGZvciAoY2ggPSAwOyBjaCA8IG51bWJlck9mQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9JTURDVCB8fAorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cmVuZGVyTW9kZSA9PSBBQUNERUNfUkVOREVSX0VMREZCKSB7CisgICAgICAvKiBTaG93cyB3aGljaCBiYW5kcyBhcmUgZW1wdHkuICovCisgICAgICBVQ0hBUiAqYmFuZF9pc19ub2lzZSA9CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhLT5iYW5kX2lzX25vaXNlOworICAgICAgRkRLbWVtc2V0KGJhbmRfaXNfbm9pc2UsIChVQ0hBUikxLCBzaXplb2YoVUNIQVIpICogKDggKiAxNikpOworCisgICAgICBlcnJvciA9IENCbG9ja19JbnZlcnNlUXVhbnRpemVTcGVjdHJhbERhdGEoCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sIHBTYW1wbGluZ1JhdGVJbmZvLCBiYW5kX2lzX25vaXNlLCAxKTsKKyAgICAgIGlmIChlcnJvciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgIH0KKworICAgICAgaWYgKGVsRmxhZ3MgJiBBQ19FTF9VU0FDX05PSVNFKSB7CisgICAgICAgIENCbG9ja19BcHBseU5vaXNlKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLCBwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5uZlJhbmRvbVNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRfaXNfbm9pc2UpOworCisgICAgICB9IC8qIGlmIChlbEZsYWdzICYgQUNfRUxfVVNBQ19OT0lTRSkgKi8KKyAgICB9CisgIH0KKwogYmFpbDoKKyAgaWYgKGNyY1JlZzEgIT0gLTEgfHwgY3JjUmVnMiAhPSAtMSkgeworICAgIGlmIChlcnJvciA9PSBBQUNfREVDX09LKSB7CisgICAgICBlcnJvciA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICAgIH0KKyAgICBpZiAoY3JjUmVnMSAhPSAtMSkgeworICAgICAgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhwVHBEZWMsIGNyY1JlZzEpOworICAgIH0KKyAgICBpZiAoY3JjUmVnMiAhPSAtMSkgeworICAgICAgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhwVHBEZWMsIGNyY1JlZzIpOworICAgIH0KKyAgfQogICByZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2NoYW5uZWwuaCBiL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbC5oCmluZGV4IDExNDY5OTguLmVkNDY2NjYgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbC5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQ2ICs5MCw0OCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjoKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBDSEFOTkVMX0gKICNkZWZpbmUgQ0hBTk5FTF9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKLSNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogI2luY2x1ZGUgImNoYW5uZWxpbmZvLmgiCiAjaW5jbHVkZSAidHBkZWNfbGliLmgiCiAKIC8qKgotICogXGJyaWVmIEluaXQgY29kZUJvb2sgU0ZCIGluZGljZXMgKHNlY3Rpb24gZGF0YSkgd2l0aCBIQ0JfRVNDLiBVc2VmdWwgZm9yIGJpdHN0cmVhbXMKLSAqIHdoaWNoIGRvIG5vdCBoYXZlIGFueSBzZWN0aW9uIGRhdGEsIGJ1dCBzdGlsbCBTRkIncyAoc2NhbGUgZmFjdG9yIGJhbmRzKS4gVGhpcyBoYXMKLSAqIHRoZSBlZmZlY3QgdGhhdCB1cHRvIHRoZSBhbW91bnQgb2YgdHJhbnNtaXR0ZWQgU0ZCIGFyZSB0cmVhdGVkIGFzIG5vbi16ZXJvLgotICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gY2hhbm5lbCBpbmZvIHN0cnVjdHVyZSBjb250YWluaW5nIGEgdmFsaWQgaWNzSW5mbyBzdHJ1Y3QuCisgKiBcYnJpZWYgSW5pdCBjb2RlQm9vayBTRkIgaW5kaWNlcyAoc2VjdGlvbiBkYXRhKSB3aXRoIEhDQl9FU0MuIFVzZWZ1bCBmb3IKKyAqIGJpdHN0cmVhbXMgd2hpY2ggZG8gbm90IGhhdmUgYW55IHNlY3Rpb24gZGF0YSwgYnV0IHN0aWxsIFNGQidzIChzY2FsZSBmYWN0b3IKKyAqIGJhbmRzKS4gVGhpcyBoYXMgdGhlIGVmZmVjdCB0aGF0IHVwdG8gdGhlIGFtb3VudCBvZiB0cmFuc21pdHRlZCBTRkIgYXJlCisgKiB0cmVhdGVkIGFzIG5vbi16ZXJvLgorICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gY2hhbm5lbCBpbmZvIHN0cnVjdHVyZSBjb250YWluaW5nIGEgdmFsaWQKKyAqIGljc0luZm8gc3RydWN0LgogICovCiB2b2lkIENDaGFubmVsX0NvZGVib29rVGFibGVJbml0KENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOwogCiAvKioKICAqIFxicmllZiBkZWNvZGUgYSBjaGFubmVsIGVsZW1lbnQuIFRvIGJlIGNhbGxlZCBhZnRlciBDQ2hhbm5lbEVsZW1lbnRfUmVhZCgpCi0gKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBwb2ludGVyIHRvIGNoYW5uZWwgZGF0YSBzdHJ1Y3QuIERlcGVuZGluZyBvbiBlbF9jaGFubmVscyBlaXRoZXIgb25lIG9yIHR3by4KKyAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIHBvaW50ZXIgdG8gY2hhbm5lbCBkYXRhIHN0cnVjdC4gRGVwZW5kaW5nIG9uCisgKiBlbF9jaGFubmVscyBlaXRoZXIgb25lIG9yIHR3by4KICAqIFxwYXJhbSBwU2FtcGxpbmdSYXRlSW5mbyBwb2ludGVyIHRvIHNhbXBsZSByYXRlIGluZm9ybWF0aW9uIHN0cnVjdHVyZQogICogXHBhcmFtIGVsX2NoYW5uZWxzIGFtb3VudCBvZiBjaGFubmVscyBvZiB0aGUgZWxlbWVudCB0byBiZSBkZWNvZGVkLgogICogXHBhcmFtIG91dHB1dCBwb2ludGVyIHRvIHRpbWUgZG9tYWluIG91dHB1dCBidWZmZXIgKEFDRUxQKQotICogXHBhcmFtIHN0cmlkZSBmYWN0b3IgZm9yIGFjY2Vzc2luZyBvdXRwdXQKICAqLwotdm9pZCBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlICggQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWxfY2hhbm5lbHMgKTsKLQordm9pZCBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1syXSwKKyAgICBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgVUlOVCBmbGFncywgVUlOVCBlbEZsYWdzLAorICAgIGludCBlbF9jaGFubmVscyk7CiAKIC8qKgogICogXGJyaWVmIFJlYWQgY2hhbm5lbCBlbGVtZW50IG9mIGdpdmVuIHR5cGUgZnJvbSBiaXRzdHJlYW0uCkBAIC0xMjYsMjMgKzEzOSwyMiBAQAogICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gcG9pbnRlciBhcnJheSB0byBzdG9yZSBjaGFubmVsIGluZm9ybWF0aW9uLgogICogXHBhcmFtIGFvdCBBdWRpbyBPYmplY3QgVHlwZQogICogXHBhcmFtIHBTYW1wbGluZ1JhdGVJbmZvIHNhbXBsaW5nIHJhdGUgaW5mbyB0YWJsZS4KLSAqIFxwYXJhbSBmbGFncyBwYXJzZXIgZ3VpZGFuY2UgZmxhZ3MKLSAqIFxwYXJhbSBudW1iZXJPZkNoYW5uZWxzIGFtb3VuIG9mIGNoYW5uZWxzIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0IHRvIGJlIHBhcnNlZC4KLSAqIFxwYXJhbSBlcENvbmZpZyB0aGUgY3VycmVudCBlcENvbmZpZyB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBBdWRpbyBTcGVjaWZpYyBDb25maWcuCisgKiBccGFyYW0gZmxhZ3MgY29tbW9uIHBhcnNlciBndWlkYW5jZSBmbGFncworICogXHBhcmFtIGVsRmxhZ3MgZWxlbWVudCBzcGVjaWZpYyBwYXJzZXIgZ3VpZGFuY2UgZmxhZ3MKKyAqIFxwYXJhbSBudW1iZXJPZkNoYW5uZWxzIGFtb3VuIG9mIGNoYW5uZWxzIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0IHRvIGJlCisgKiBwYXJzZWQuCisgKiBccGFyYW0gZXBDb25maWcgdGhlIGN1cnJlbnQgZXBDb25maWcgdmFsdWUgb2J0YWluZWQgZnJvbSB0aGUgQXVkaW8gU3BlY2lmaWMKKyAqIENvbmZpZy4KICAqIFxwYXJhbSBwVHAgdHJhbnNwb3J0IGRlY29kZXIgaGFuZGxlIHJlcXVpcmVkIGZvciBBRFRTIENSQyBjaGVja2luZy4KICAqIC4uLgogICogXHJldHVybiBhbiBBQUNfREVDT0RFUl9FUlJPUiBlcnJvciBjb2RlLgogICovCi1BQUNfREVDT0RFUl9FUlJPUiBDQ2hhbm5lbEVsZW1lbnRfUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgZnJhbWVfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgbnVtYmVyT2ZDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSIGVwQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVERFQyBwVHBEZWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitBQUNfREVDT0RFUl9FUlJPUiBDQ2hhbm5lbEVsZW1lbnRfUmVhZCgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXSwKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYW90LCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBVSU5UIGVsRmxhZ3MsIGNvbnN0IFVJTlQgZnJhbWVfbGVuZ3RoLAorICAgIGNvbnN0IFVDSEFSIG51bWJlck9mQ2hhbm5lbHMsIGNvbnN0IFNDSEFSIGVwQ29uZmlnLAorICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgcFRwRGVjKTsKIAogI2VuZGlmIC8qICNpZm5kZWYgQ0hBTk5FTF9IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2NoYW5uZWxpbmZvLmNwcCBiL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbGluZm8uY3BwCmluZGV4IDc2ZDU4OTUuLjc5YWRkNWIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbGluZm8uY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbGluZm8uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI3ICs5MCwyMyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogaW5kaXZpZHVhbCBjaGFubmVsIHN0cmVhbSBpbmZvCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJjaGFubmVsaW5mby5oIgogI2luY2x1ZGUgImFhY19yb20uaCIKICNpbmNsdWRlICJhYWNfcmFtLmgiCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCi0KLUFBQ19ERUNPREVSX0VSUk9SIEljc1JlYWRNYXhTZmIgKAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgQ0ljc0luZm8gKnBJY3NJbmZvLAotICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbwotICAgICAgICApCi17CitBQUNfREVDT0RFUl9FUlJPUiBJY3NSZWFkTWF4U2ZiKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDSWNzSW5mbyAqcEljc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvKSB7CiAgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKICAgaW50IG5iaXRzOwogCkBAIC0xMTAsMzYgKzExNywzMSBAQAogICAgIG5iaXRzID0gNDsKICAgICBwSWNzSW5mby0+VG90YWxTZkJhbmRzID0gcFNhbXBsaW5nUmF0ZUluZm8tPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKICAgfQotICBwSWNzSW5mby0+TWF4U2ZCYW5kcyA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsIG5iaXRzKTsKKyAgcEljc0luZm8tPk1heFNmQmFuZHMgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIG5iaXRzKTsKIAotICBpZiAocEljc0luZm8tPk1heFNmQmFuZHMgPiBwSWNzSW5mby0+VG90YWxTZkJhbmRzKXsKKyAgaWYgKHBJY3NJbmZvLT5NYXhTZkJhbmRzID4gcEljc0luZm8tPlRvdGFsU2ZCYW5kcykgewogICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKICAgfQogCiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAotCi0KLUFBQ19ERUNPREVSX0VSUk9SIEljc1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENJY3NJbmZvICpwSWNzSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyogcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MpCi17CitBQUNfREVDT0RFUl9FUlJPUiBJY3NSZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDSWNzSW5mbyAqcEljc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzKSB7CiAgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKIAogICBwSWNzSW5mby0+VmFsaWQgPSAwOwogCi0gIGlmIChmbGFncyAmIEFDX0VMRCl7Ci0gICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gT25seUxvbmdTZXF1ZW5jZTsKKyAgaWYgKGZsYWdzICYgQUNfRUxEKSB7CisgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gQkxPQ0tfTE9ORzsKICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSAwOwotICB9Ci0gIGVsc2UgewotICAgIGlmICggIShmbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MCkpICkgewotICAgICAgRkRLcmVhZEJpdHMoYnMsMSk7CisgIH0gZWxzZSB7CisgICAgaWYgKCEoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkpIHsKKyAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsKICAgICB9Ci0gICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKLSAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpOworICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IChCTE9DS19UWVBFKUZES3JlYWRCaXRzKGJzLCAyKTsKKyAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDEpOwogICAgIGlmIChmbGFncyAmIEFDX0xEKSB7CiAgICAgICBpZiAocEljc0luZm8tPldpbmRvd1NoYXBlKSB7CiAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9IDI7IC8qIHNlbGVjdCBsb3cgb3ZlcmxhcCBpbnN0ZWFkIG9mIEtCRCAqLwpAQCAtMTQ4LDggKzE1MCw4IEBACiAgIH0KIAogICAvKiBTYW5pdHkgY2hlY2sgKi8KLSAgaWYgKCAoZmxhZ3MgJiAoQUNfRUxEfEFDX0xEKSkgJiYgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlICE9IE9ubHlMb25nU2VxdWVuY2UpIHsKLSAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBPbmx5TG9uZ1NlcXVlbmNlOworICBpZiAoKGZsYWdzICYgKEFDX0VMRCB8IEFDX0xEKSkgJiYgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlICE9IEJMT0NLX0xPTkcpIHsKKyAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBCTE9DS19MT05HOwogICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKICAgICBnb3RvIGJhaWw7CiAgIH0KQEAgLTE1OSwxMSArMTYxLDEyIEBACiAgICAgZ290byBiYWlsOwogICB9CiAKLSAgaWYgKElzTG9uZ0Jsb2NrKHBJY3NJbmZvKSkKLSAgewotICAgIGlmICggIShmbGFncyAmIChBQ19FTER8QUNfU0NBTEFCTEV8QUNfQlNBQ3xBQ19VU0FDfEFDX1JTVkQ1MCkpICkgLyogSWYgbm90IEVMRCBub3IgU2NhbGFibGUgbm9yIEJTQUMgbm9yIFVTQUMgc3ludGF4IHRoZW4gLi4uICovCisgIGlmIChJc0xvbmdCbG9jayhwSWNzSW5mbykpIHsKKyAgICBpZiAoIShmbGFncyAmIChBQ19FTEQgfCBBQ19TQ0FMQUJMRSB8IEFDX0JTQUMgfCBBQ19VU0FDIHwgQUNfUlNWRDUwIHwKKyAgICAgICAgICAgICAgICAgICBBQ19SU1Y2MDNEQSkpKSAvKiBJZiBub3QgRUxEIG5vciBTY2FsYWJsZSBub3IgQlNBQyBub3IgVVNBQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCB0aGVuIC4uLiAqLwogICAgIHsKLSAgICAgIGlmICgoVUNIQVIpRkRLcmVhZEJpdHMoYnMsMSkgIT0gMCApIC8qIFVDSEFSIFByZWRpY3RvckRhdGFQcmVzZW50ICovCisgICAgICBpZiAoKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKSAhPSAwKSAvKiBVQ0hBUiBQcmVkaWN0b3JEYXRhUHJlc2VudCAqLwogICAgICAgewogICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfVU5TVVBQT1JURURfUFJFRElDVElPTjsKICAgICAgICAgZ290byBiYWlsOwpAQCAtMTcyLDQ1ICsxNzUsMzYgQEAKIAogICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cHMgPSAxOwogICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cExlbmd0aFswXSA9IDE7Ci0gIH0KLSAgZWxzZQotICB7CisgIH0gZWxzZSB7CiAgICAgSU5UIGk7CiAgICAgVUlOVCBtYXNrOwogCi0gICAgcEljc0luZm8tPlNjYWxlRmFjdG9yR3JvdXBpbmcgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDcpOworICAgIHBJY3NJbmZvLT5TY2FsZUZhY3Rvckdyb3VwaW5nID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA3KTsKIAotICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cHMgPSAwIDsKKyAgICBwSWNzSW5mby0+V2luZG93R3JvdXBzID0gMDsKIAotICAgIGZvciAoaT0wOyBpIDwgKDgtMSk7IGkrKykKLSAgICB7CisgICAgZm9yIChpID0gMDsgaSA8ICg4IC0gMSk7IGkrKykgewogICAgICAgbWFzayA9IDEgPDwgKDYgLSBpKTsKICAgICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cExlbmd0aFtpXSA9IDE7CiAKLSAgICAgIGlmIChwSWNzSW5mby0+U2NhbGVGYWN0b3JHcm91cGluZyAmIG1hc2spCi0gICAgICB7CisgICAgICBpZiAocEljc0luZm8tPlNjYWxlRmFjdG9yR3JvdXBpbmcgJiBtYXNrKSB7CiAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cExlbmd0aFtwSWNzSW5mby0+V2luZG93R3JvdXBzXSsrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgcEljc0luZm8tPldpbmRvd0dyb3VwcysrOwogICAgICAgfQogICAgIH0KIAogICAgIC8qIGxvb3AgcnVucyB0byBpIDwgNyBvbmx5ICovCi0gICAgcEljc0luZm8tPldpbmRvd0dyb3VwTGVuZ3RoWzgtMV0gPSAxOworICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cExlbmd0aFs4IC0gMV0gPSAxOwogICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cHMrKzsKICAgfQogCi0KIGJhaWw6Ci0gIGlmIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKQotICAgIHBJY3NJbmZvLT5WYWxpZCA9IDE7CisgIGlmIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSBwSWNzSW5mby0+VmFsaWQgPSAxOwogCiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAotCiAvKgogICBpbnRlcmxlYXZlIGNvZGVib29rcyB0aGUgZm9sbG93aW5nIHdheQogCkBAIC0yMjQsNTMgKzIxOCw4MCBAQAogICAgICAoMjcwdykgICAgICgyNzF3KQogKi8KIAotCiAvKgogICBUYWJsZSBlbnRyaWVzIGFyZSBzb3J0ZWQgYXMgZm9sbG93aW5nOgogICB8IG51bV9zd2JfbG9uZ193aW5kb3cgfCBzZmJhbmRzX2xvbmcgfCBudW1fc3diX3Nob3J0X3dpbmRvdyB8IHNmYmFuZHNfc2hvcnQgfAogKi8KLUFBQ19ERUNPREVSX0VSUk9SIGdldFNhbXBsaW5nUmF0ZUluZm8oCi0gICAgICAgIFNhbXBsaW5nUmF0ZUluZm8gKnQsCi0gICAgICAgIFVJTlQgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICBVSU5UIHNhbXBsaW5nUmF0ZUluZGV4LAotICAgICAgICBVSU5UIHNhbXBsaW5nUmF0ZQotICAgICAgICApCi17CitBQUNfREVDT0RFUl9FUlJPUiBnZXRTYW1wbGluZ1JhdGVJbmZvKFNhbXBsaW5nUmF0ZUluZm8gKnQsIFVJTlQgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsaW5nUmF0ZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsaW5nUmF0ZSkgewogICBpbnQgaW5kZXggPSAwOwogCisgIC8qIFNlYXJjaCBjbG9zZXN0IHNhbXBsZXJhdGUgYWNjb3JkaW5nIHRvIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpIDguMi40IChUYWJsZQorICAgKiAzOCk6ICovCisgIGlmICgoc2FtcGxpbmdSYXRlSW5kZXggPj0gMTUpIHx8IChzYW1wbGVzUGVyRnJhbWUgPT0gNzY4KSkgeworICAgIGNvbnN0IFVJTlQgYm9yZGVyc1tdID0geyhVSU5UKS0xLCA5MjAxNywgNzUxMzIsIDU1NDI2LCA0NjAwOSwgMzc1NjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc3MTMsICAgIDIzMDA0LCAxODc4MywgMTM4NTYsIDExNTAyLCA5MzkxfTsKKyAgICBVSU5UIGksIHNhbXBsaW5nUmF0ZVNlYXJjaCA9IHNhbXBsaW5nUmF0ZTsKKworICAgIGlmIChzYW1wbGVzUGVyRnJhbWUgPT0gNzY4KSB7CisgICAgICBzYW1wbGluZ1JhdGVTZWFyY2ggPSAoc2FtcGxpbmdSYXRlICogNCkgLyAzOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAxMTsgaSsrKSB7CisgICAgICBpZiAoYm9yZGVyc1tpXSA+IHNhbXBsaW5nUmF0ZVNlYXJjaCAmJgorICAgICAgICAgIHNhbXBsaW5nUmF0ZVNlYXJjaCA+PSBib3JkZXJzW2kgKyAxXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgc2FtcGxpbmdSYXRlSW5kZXggPSBpOworICB9CiAKICAgdC0+c2FtcGxpbmdSYXRlSW5kZXggPSBzYW1wbGluZ1JhdGVJbmRleDsKICAgdC0+c2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwogCiAgIHN3aXRjaCAoc2FtcGxlc1BlckZyYW1lKSB7Ci0gIGNhc2UgMTAyNDoKLSAgICBpbmRleCA9IDA7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgOTYwOgotICAgIGluZGV4ID0gMTsKLSAgICBicmVhazsKLSAgY2FzZSA1MTI6Ci0gICAgaW5kZXggPSAzOwotICAgIGJyZWFrOwotICBjYXNlIDQ4MDoKLSAgICBpbmRleCA9IDQ7Ci0gICAgYnJlYWs7CisgICAgY2FzZSAxMDI0OgorICAgICAgaW5kZXggPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5NjA6CisgICAgICBpbmRleCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc2ODoKKyAgICAgIGluZGV4ID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTEyOgorICAgICAgaW5kZXggPSAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODA6CisgICAgICBpbmRleCA9IDQ7CisgICAgICBicmVhazsKIAotICBkZWZhdWx0OgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgIH0KKworICB0LT5TY2FsZUZhY3RvckJhbmRzX0xvbmcgPQorICAgICAgc2ZiT2Zmc2V0VGFibGVzW2luZGV4XVtzYW1wbGluZ1JhdGVJbmRleF0uc2ZiT2Zmc2V0TG9uZzsKKyAgdC0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydCA9CisgICAgICBzZmJPZmZzZXRUYWJsZXNbaW5kZXhdW3NhbXBsaW5nUmF0ZUluZGV4XS5zZmJPZmZzZXRTaG9ydDsKKyAgdC0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmcgPQorICAgICAgc2ZiT2Zmc2V0VGFibGVzW2luZGV4XVtzYW1wbGluZ1JhdGVJbmRleF0ubnVtYmVyT2ZTZmJMb25nOworICB0LT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQgPQorICAgICAgc2ZiT2Zmc2V0VGFibGVzW2luZGV4XVtzYW1wbGluZ1JhdGVJbmRleF0ubnVtYmVyT2ZTZmJTaG9ydDsKKworICBpZiAodC0+U2NhbGVGYWN0b3JCYW5kc19Mb25nID09IE5VTEwgfHwKKyAgICAgIHQtPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19Mb25nID09IDApIHsKKyAgICB0LT5zYW1wbGluZ1JhdGUgPSAwOwogICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKICAgfQogCi0gIHQtPlNjYWxlRmFjdG9yQmFuZHNfTG9uZyA9IHNmYk9mZnNldFRhYmxlc1tpbmRleF1bc2FtcGxpbmdSYXRlSW5kZXhdLnNmYk9mZnNldExvbmc7Ci0gIHQtPlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQgPSBzZmJPZmZzZXRUYWJsZXNbaW5kZXhdW3NhbXBsaW5nUmF0ZUluZGV4XS5zZmJPZmZzZXRTaG9ydDsKLSAgdC0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmcgPSBzZmJPZmZzZXRUYWJsZXNbaW5kZXhdW3NhbXBsaW5nUmF0ZUluZGV4XS5udW1iZXJPZlNmYkxvbmc7Ci0gIHQtPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19TaG9ydCA9IHNmYk9mZnNldFRhYmxlc1tpbmRleF1bc2FtcGxpbmdSYXRlSW5kZXhdLm51bWJlck9mU2ZiU2hvcnQ7Ci0KLSAgaWYgKHQtPlNjYWxlRmFjdG9yQmFuZHNfTG9uZyA9PSBOVUxMIHx8IHQtPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19Mb25nID09IDApIHsKLSAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7Ci0gIH0KLQotICBGREtfQVNTRVJUKHQtPlNjYWxlRmFjdG9yQmFuZHNfTG9uZ1t0LT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZ10gPT0gc2FtcGxlc1BlckZyYW1lKTsKLSAgRkRLX0FTU0VSVCh0LT5TY2FsZUZhY3RvckJhbmRzX1Nob3J0ID09IE5VTEwgfHwgdC0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydFt0LT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnRdKjggPT0gc2FtcGxlc1BlckZyYW1lKTsKKyAgRkRLX0FTU0VSVCgoVUlOVCl0LT5TY2FsZUZhY3RvckJhbmRzX0xvbmdbdC0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmddID09CisgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lKTsKKyAgRkRLX0FTU0VSVCgKKyAgICAgIHQtPlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQgPT0gTlVMTCB8fAorICAgICAgKFVJTlQpdC0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydFt0LT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnRdICogOCA9PQorICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSk7CiAKICAgcmV0dXJuIEFBQ19ERUNfT0s7CiB9CmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2NoYW5uZWxpbmZvLmggYi9saWJBQUNkZWMvc3JjL2NoYW5uZWxpbmZvLmgKaW5kZXggZTA5MmFiMy4uNDVhMjg4ZiAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9jaGFubmVsaW5mby5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbGluZm8uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IGluZGl2aWR1YWwgY2hhbm5lbCBzdHJlYW0gaW5mbwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIENIQU5ORUxJTkZPX0gKICNkZWZpbmUgQ0hBTk5FTElORk9fSApAQCAtMTA4LDEwICsxMjAsMjEgQEAKICNpbmNsdWRlICJhYWNkZWNfaGNyX3R5cGVzLmgiCiAjaW5jbHVkZSAicnZsY19pbmZvLmgiCiAKKyNpbmNsdWRlICJ1c2FjZGVjX2FjZWxwLmgiCisjaW5jbHVkZSAidXNhY2RlY19jb25zdC5oIgorI2luY2x1ZGUgInVzYWNkZWNfcm9tLmgiCisKKyNpbmNsdWRlICJhY19hcml0aF9jb2Rlci5oIgogCiAjaW5jbHVkZSAiY29uY2VhbF90eXBlcy5oIgogCi0gI2luY2x1ZGUgImFhY2RlY19kcmNfdHlwZXMuaCIKKyNpbmNsdWRlICJhYWNkZWNfZHJjX3R5cGVzLmgiCisKKyNkZWZpbmUgV0JfU0VDVElPTl9TSVpFICgxMDI0ICogMikKKworI2RlZmluZSBEUk1fQlNfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoNTEyKSAvKiBzaXplIG9mIHRoZSBkeW5hbWljIGJ1ZmZlciB3aGljaCBpcyB1c2VkIHRvIHJldmVyc2UgdGhlIGJpdHMgb2YgXAorICAgICAgICAgICB0aGUgRFJNIFNCUiBwYXlsb2FkICovCiAKIC8qIE91dHB1dCByZW5kZXJpbmcgbW9kZSAqLwogdHlwZWRlZiBlbnVtIHsKQEAgLTEyMiwyMSArMTQ1LDExIEBACiAgIEFBQ0RFQ19SRU5ERVJfSU5USU1EQ1QKIH0gQUFDREVDX1JFTkRFUl9NT0RFOwogCi1lbnVtIHsKLSAgTUFYX1FVQU5USVpFRF9WQUxVRSA9IDgxOTEKLX07CitlbnVtIHsgTUFYX1FVQU5USVpFRF9WQUxVRSA9IDgxOTEgfTsKIAotZW51bQotewotICBPbmx5TG9uZ1NlcXVlbmNlID0gMCwKLSAgTG9uZ1N0YXJ0U2VxdWVuY2UsCi0gIEVpZ2h0U2hvcnRTZXF1ZW5jZSwKLSAgTG9uZ1N0b3BTZXF1ZW5jZQotfTsKK3R5cGVkZWYgZW51bSB7IEZEX0xPTkcsIEZEX1NIT1JULCBMUEQgfSBVU0FDX0NPUkVNT0RFOwogCi0KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIGNvbnN0IFNIT1JUICpTY2FsZUZhY3RvckJhbmRzX0xvbmc7CiAgIGNvbnN0IFNIT1JUICpTY2FsZUZhY3RvckJhbmRzX1Nob3J0OwogICBVQ0hBUiBOdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKQEAgLTE0NSwyMDAgKzE1OCwzMTUgQEAKICAgVUlOVCBzYW1wbGluZ1JhdGU7CiB9IFNhbXBsaW5nUmF0ZUluZm87CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIFVDSEFSIENvbW1vbldpbmRvdzsKICAgVUNIQVIgR2xvYmFsR2FpbjsKIAogfSBDUmF3RGF0YUluZm87CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIFVDSEFSIFdpbmRvd0dyb3VwTGVuZ3RoWzhdOwogICBVQ0hBUiBXaW5kb3dHcm91cHM7CiAgIFVDSEFSIFZhbGlkOwogCi0gIFVDSEFSIFdpbmRvd1NoYXBlOyAgICAvKiAwOiBzaW5lIHdpbmRvdywgMTogS0JELCAyOiBsb3cgb3ZlcmxhcCAqLwotICBVQ0hBUiBXaW5kb3dTZXF1ZW5jZTsgLyogU2VlIGVudW0gYWJvdmUsIDA6IGxvbmcsIDE6IHN0YXJ0LCAyOiBzaG9ydCwgMzogc3RvcCAqLworICBVQ0hBUiBXaW5kb3dTaGFwZTsgICAgICAgICAvKiAwOiBzaW5lIHdpbmRvdywgMTogS0JELCAyOiBsb3cgb3ZlcmxhcCAqLworICBCTE9DS19UWVBFIFdpbmRvd1NlcXVlbmNlOyAvKiBtZGN0Lmg7IDA6IGxvbmcsIDE6IHN0YXJ0LCAyOiBzaG9ydCwgMzogc3RvcCAqLwogICBVQ0hBUiBNYXhTZkJhbmRzOworICBVQ0hBUiBtYXhfc2ZiX3N0ZTsKICAgVUNIQVIgU2NhbGVGYWN0b3JHcm91cGluZzsKIAogICBVQ0hBUiBUb3RhbFNmQmFuZHM7CiAKIH0gQ0ljc0luZm87CiAKLQotZW51bQoteworZW51bSB7CiAgIFpFUk9fSENCID0gMCwKLSAgRVNDQk9PSyAgPSAxMSwKKyAgRVNDQk9PSyA9IDExLAogICBOU1BFQ0JPT0tTID0gRVNDQk9PSyArIDEsCi0gIEJPT0tTQ0wgICAgPSBOU1BFQ0JPT0tTLAotICBOT0lTRV9IQ0IgICAgICA9IDEzLAorICBCT09LU0NMID0gTlNQRUNCT09LUywKKyAgTk9JU0VfSENCID0gMTMsCiAgIElOVEVOU0lUWV9IQ0IyID0gMTQsCi0gIElOVEVOU0lUWV9IQ0IgID0gMTUsCisgIElOVEVOU0lUWV9IQ0IgPSAxNSwKICAgTEFTVF9IQ0IKIH07CiAKLSNkZWZpbmUgVE5TX1NDQUxFICAzCisvKiBUaGlzIHN0cnVjdCBob2xkcyB0aGUgcGVyc2lzdGVudCBkYXRhIHNoYXJlZCBieSBib3RoIGNoYW5uZWxzIG9mIGEgQ1BFLgorICAgSXQgbmVlZHMgdG8gYmUgYWxsb2NhdGVkIGZvciBlYWNoIENQRS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgQ0pvaW50U3RlcmVvUGVyc2lzdGVudERhdGEgam9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YTsKK30gQ3BlUGVyc2lzdGVudERhdGE7CiAKIC8qCiAgKiBUaGlzIHN0cnVjdCBtdXN0IGJlIGFsbG9jYXRlZCBvbmUgZm9yIGV2ZXJ5IGNoYW5uZWwgYW5kIG11c3QgYmUgcGVyc2lzdGVudC4KICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgRklYUF9EQkwgKnBPdmVybGFwQnVmZmVyOwogICBtZGN0X3QgSU1kY3Q7CiAKKyAgQ0FyY29EYXRhICpoQXJDbzsKIAorICBJTlQgcG5zQ3VycmVudFNlZWQ7CiAKLSAgQ0RyY0NoYW5uZWxEYXRhICAgZHJjRGF0YTsKKyAgLyogTFBEIG1lbW9yeSAqLworICBGSVhQX0RCTCBvbGRfc3ludGhbUElUX01BWF9NQVggLSBMX1NVQkZSXTsKKyAgSU5UIG9sZF9UX3BmW1NZTl9TRkRdOworICBGSVhQX0RCTCBvbGRfZ2Fpbl9wZltTWU5fU0ZEXTsKKyAgRklYUF9EQkwgbWVtX2JwZltMX0ZJTFQgKyBMX1NVQkZSXTsKKyAgVUNIQVIKKyAgb2xkX2JwZl9jb250cm9sX2luZm87IC8qICgxOiBlbmFibGUsIDA6IGRpc2FibGUpIGJwZiBmb3IgcGFzdCBzdXBlcmZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBVU0FDX0NPUkVNT0RFIGxhc3RfY29yZV9tb2RlOyAvKiBjb3JlIG1vZGUgdXNlZCBieSB0aGUgZGVjb2RlciBpbiBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS4gKG5vdCBzaWduYWxsZWQgYnkgdGhlIGJpdHN0cmVhbSwgc2VlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm86OmNvcmVfbW9kZV9sYXN0ICEhICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVDSEFSIGxhc3RfbHBkX21vZGU7ICAgICAgLyogTFBEIG1vZGUgdXNlZCBieSB0aGUgZGVjb2RlciBpbiBsYXN0IExQRCBzdWJmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IHNpZ25hbGxlZCBieSB0aGUgYml0c3RyZWFtLCBzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvOjpscGRfbW9kZV9sYXN0ICEhICkgKi8KKyAgVUNIQVIgbGFzdF9sYXN0X2xwZF9tb2RlOyAvKiBMUEQgbW9kZSB1c2VkIGluIHNlY29uZCBsYXN0IExQRCBzdWJmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IHNpZ25hbGxlZCBieSB0aGUgYml0c3RyZWFtKSAqLworICBVQ0hBUiBsYXN0X2xwY19sb3N0OyAgICAgIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBwcmV2aW91cyBMUEMgaXMgbG9zdCAqLworCisgIEZJWFBfTFBDCisgIGxwYzRfbHNmW01fTFBfRklMVEVSX09SREVSXTsgLyogTGFzdCBMUEM0IGNvZWZmaWNpZW50cyBpbiBMU0YgZG9tYWluLiAqLworICBGSVhQX0xQQyBsc2ZfYWRhcHRpdmVfbWVhbltNX0xQX0ZJTFRFUl9PUkRFUl07IC8qIEFkYXB0aXZlIG1lYW4gb2YgTFBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnRzIGluIExTRiBkb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY29uY2VhbG1lbnQuICovCisgIEZJWFBfTFBDIGxwX2NvZWZmX29sZFsyXVtNX0xQX0ZJTFRFUl9PUkRFUl07ICAgLyogTGFzdCBMUEMgY29lZmZpY2llbnRzIGluIExQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4uIGxwX2NvZWZmX29sZFswXSBpcyBscGM0IChjb2VmZnMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCBmb2xkaW5nIHBvaW50IG9mIGxhc3QgdGN4IGZyYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwX2NvZWZmX29sZFsxXSBhcmUgY29lZmZzIGZvciBsZWZ0IGZvbGRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50IG9mIGxhc3QgdGN4IGZyYW1lICovCisgIElOVCBscF9jb2VmZl9vbGRfZXhwWzJdOworCisgIEZJWFBfU0dMCisgIG9sZFN0YWJpbGl0eTsgLyogTFBDIGNvZWZmIHN0YWJpbGl0eSB2YWx1ZSBmcm9tIGxhc3QgZnJhbWUgKHJlcXVpcmVkIGZvcgorICAgICAgICAgICAgICAgICAgIFRDWCBjb25jZWFsbWVudCkuICovCisgIFVJTlQgbnVtTG9zdExwZEZyYW1lczsgLyogTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGxvc3Qgc3ViZnJhbWVzLiAqLworCisgIC8qIFRDWCBtZW1vcnkgKi8KKyAgRklYUF9EQkwgbGFzdF90Y3hfZ2FpbjsKKyAgSU5UIGxhc3RfdGN4X2dhaW5fZTsKKyAgRklYUF9EQkwgbGFzdF9hbGZkX2dhaW5zWzMyXTsgLyogU2NhbGVkIGJ5IG9uZSBiaXQuICovCisgIFNIT1JUIGxhc3RfdGN4X3BpdGNoOworICBVQ0hBUiBsYXN0X3RjeF9ub2lzZV9mYWN0b3I7CisKKyAgLyogQUNFTFAgbWVtb3J5ICovCisgIENBY2VscFN0YXRpY01lbSBhY2VscDsKKworICBVTE9ORyBuZlJhbmRvbVNlZWQ7IC8qIHNlZWQgdmFsdWUgZm9yIFVTQUMgbm9pc2UgZmlsbGluZyByYW5kb20gZ2VuZXJhdG9yICovCisKKyAgQ0RyY0NoYW5uZWxEYXRhIGRyY0RhdGE7CiAgIENDb25jZWFsbWVudEluZm8gY29uY2VhbG1lbnRJbmZvOwogCi19IENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm87CisgIENwZVBlcnNpc3RlbnREYXRhICpwQ3BlU3RhdGljRGF0YTsKIAorfSBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvOwogCiAvKgogICogVGhpcyB1bmlvbiBtdXN0IGJlIGFsbG9jYXRlZCBmb3IgZXZlcnkgZWxlbWVudCAodXAgdG8gMiBjaGFubmVscykuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQogICAvKiBDb21tb24gYml0IHN0cmVhbSBkYXRhICovCi0gIFNIT1JUIGFTY2FsZUZhY3RvclsoOCoxNildOyAgICAgICAgICAgLyogU3BlY3RyYWwgc2NhbGUgZmFjdG9ycyBmb3IgZWFjaCBzZmIgaW4gZWFjaCB3aW5kb3cuICovCi0gIFNIT1JUIGFTZmJTY2FsZVsoOCoxNildOyAgICAgICAgICAgICAgLyogY291bGQgYmUgZnJlZSBhZnRlciBBcHBseVRvb2xzKCkgKi8KLSAgVUNIQVIgYUNvZGVCb29rWyg4KjE2KV07ICAgICAgICAgICAgICAvKiBzZWN0aW9uIGRhdGE6IGNvZGVib29rIGZvciBlYWNoIHdpbmRvdyBhbmQgc2ZiLiAqLwotICBDVG5zRGF0YSAgICAgICAgIFRuc0RhdGE7Ci0gIENSYXdEYXRhSW5mbyAgICAgUmF3RGF0YUluZm87CisgIFNIT1JUIGFTY2FsZUZhY3RvclsoCisgICAgICA4ICogMTYpXTsgLyogU3BlY3RyYWwgc2NhbGUgZmFjdG9ycyBmb3IgZWFjaCBzZmIgaW4gZWFjaCB3aW5kb3cuICovCisgIFNIT1JUIGFTZmJTY2FsZVsoOCAqIDE2KV07IC8qIGNvdWxkIGJlIGZyZWUgYWZ0ZXIgQXBwbHlUb29scygpICovCisgIFVDSEFSCisgIGFDb2RlQm9va1soOCAqIDE2KV07IC8qIHNlY3Rpb24gZGF0YTogY29kZWJvb2sgZm9yIGVhY2ggd2luZG93IGFuZCBzZmIuICovCisgIFVDSEFSIGJhbmRfaXNfbm9pc2VbKDggKiAxNildOworICBDVG5zRGF0YSBUbnNEYXRhOworICBDUmF3RGF0YUluZm8gUmF3RGF0YUluZm87CiAKICAgc2hvdWxkQmVVbmlvbiB7Ci0KICAgICBzdHJ1Y3QgewogICAgICAgQ1B1bHNlRGF0YSBQdWxzZURhdGE7Ci0gICAgICBTSE9SVCBhTnVtTGluZUluU2VjNEhjcltNQVhfU0ZCX0hDUl07ICAgICAgICAgIC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgZXhjZXB0IGZvciBEcm0gc3ludGF4ICovCi0gICAgICBVQ0hBUiBhQ29kZUJvb2tzNEhjcltNQVhfU0ZCX0hDUl07ICAgICAgICAgICAgIC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgZXhjZXB0IGZvciBEcm0gc3ludGF4LiBTYW1lIGFzICJhQ29kZUJvb2siID8gKi8KKyAgICAgIFNIT1JUIGFOdW1MaW5lSW5TZWM0SGNyW01BWF9TRkJfSENSXTsgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZm9yIERybSBzeW50YXggKi8KKyAgICAgIFVDSEFSCisgICAgICBhQ29kZUJvb2tzNEhjcltNQVhfU0ZCX0hDUl07IC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgZXhjZXB0IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm0gc3ludGF4LiBTYW1lIGFzICJhQ29kZUJvb2siID8gKi8KICAgICAgIFNIT1JUIGxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOwogICAgICAgU0NIQVIgbGVuT2ZMb25nZXN0Q29kZXdvcmQ7CiAgICAgICBTQ0hBUiBudW1iZXJTZWN0aW9uOwogICAgICAgU0NIQVIgcnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LOwogICAgICAgU0NIQVIgcnZsY0ludGVuc2l0eVVzZWQ7CiAgICAgfSBhYWM7Ci0gIH0gc3BlY2lmaWNUbzsKKyAgICBzdHJ1Y3QgeworICAgICAgVUNIQVIgZmRfbm9pc2VfbGV2ZWxfYW5kX29mZnNldDsKKyAgICAgIFVDSEFSIHRuc19hY3RpdmU7CisgICAgICBVQ0hBUiB0bnNfb25fbHI7CisgICAgICBVQ0hBUiB0Y3hfbm9pc2VfZmFjdG9yWzRdOworICAgICAgVUNIQVIgdGN4X2dsb2JhbF9nYWluWzRdOworICAgIH0gdXNhYzsKKyAgfQorICBzcGVjaWZpY1RvOwogCiB9IENBYWNEZWNvZGVyRHluYW1pY0RhdGE7CiAKIHR5cGVkZWYgc2hvdWxkQmVVbmlvbiB7Ci0gIENBYWNEZWNvZGVyRHluYW1pY0RhdGEgcEFhY0RlY29kZXJEeW5hbWljRGF0YVsyXTsKKyAgVUNIQVIgRHJtQnNCdWZmZXJbRFJNX0JTX0JVRkZFUl9TSVpFXTsKIAotICAvKiBDb21tb24gc2lnbmFsIGRhdGEsIGNhbiBiZSB1c2VkIG9uY2UgdGhlIGJpdCBzdHJlYW0gZGF0YSBmcm9tIGFib3ZlIGlzIG5vdCB1c2VkIGFueW1vcmUuICovCisgIC8qIENvbW1vbiBzaWduYWwgZGF0YSwgY2FuIGJlIHVzZWQgb25jZSB0aGUgYml0IHN0cmVhbSBkYXRhIGZyb20gYWJvdmUgaXMgbm90CisgICAqIHVzZWQgYW55bW9yZS4gKi8KICAgRklYUF9EQkwgbWRjdE91dFRlbXBbMTAyNF07Ci0gIEZJWFBfREJMIHNicldvcmtCdWZmZXJbMTAyNCoyXTsKIAotfSBDV29ya0J1ZmZlckNvcmUxOworICBGSVhQX0RCTCBzeW50aF9idWZbKFBJVF9NQVhfTUFYICsgU1lOX0RFTEFZICsgTF9GUkFNRV9QTFVTKV07CisKKyAgRklYUF9EQkwgd29ya0J1ZmZlcltXQl9TRUNUSU9OX1NJWkVdOworfQorQ1dvcmtCdWZmZXJDb3JlMTsKIAogLyogQ29tbW9uIGRhdGEgcmVmZXJlbmNlZCBieSBhbGwgY2hhbm5lbHMgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQotICBDV29ya0J1ZmZlckNvcmUxICp3b3JrQnVmZmVyQ29yZTE7Ci0gIEZJWFBfREJMKiB3b3JrQnVmZmVyQ29yZTI7CisgIENBYWNEZWNvZGVyRHluYW1pY0RhdGEgcEFhY0RlY29kZXJEeW5hbWljRGF0YVsyXTsKIAogICBDUG5zSW50ZXJDaGFubmVsRGF0YSBwbnNJbnRlckNoYW5uZWxEYXRhOwotICBJTlQgcG5zQ3VycmVudFNlZWQ7Ci0gIElOVCBwbnNSYW5kb21TZWVkWyg4KjE2KV07CisgIElOVCBwbnNSYW5kb21TZWVkWyg4ICogMTYpXTsKIAotICBDSm9pbnRTdGVyZW9EYXRhIGpvaW50U3RlcmVvRGF0YTsgICAgICAgICAgICAgIC8qIE9uZSBmb3Igb25lIGVsZW1lbnQgKi8KKyAgQ0pvaW50U3RlcmVvRGF0YSBqb2ludFN0ZXJlb0RhdGE7IC8qIE9uZSBmb3Igb25lIGVsZW1lbnQgKi8KIAogICBzaG91bGRCZVVuaW9uIHsKICAgICBzdHJ1Y3QgewogICAgICAgQ0VySGNySW5mbyBlckhjckluZm87CiAgICAgICBDRXJSdmxjSW5mbyBlclJ2bGNJbmZvOwotICAgICAgU0hPUlQgYVJ2bGNTY2ZFc2NbUlZMQ19NQVhfU0ZCXTsgICAgICAgICAgICAgICAvKiBuZWVkZWQgb25jZSBmb3IgYWxsIGNoYW5uZWxzICovCi0gICAgICBTSE9SVCBhUnZsY1NjZkZ3ZFtSVkxDX01BWF9TRkJdOyAgICAgICAgICAgICAgIC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgKi8KLSAgICAgIFNIT1JUIGFSdmxjU2NmQndkW1JWTENfTUFYX1NGQl07ICAgICAgICAgICAgICAgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscyAqLworICAgICAgU0hPUlQgYVJ2bGNTY2ZFc2NbUlZMQ19NQVhfU0ZCXTsgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscyAqLworICAgICAgU0hPUlQgYVJ2bGNTY2ZGd2RbUlZMQ19NQVhfU0ZCXTsgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscyAqLworICAgICAgU0hPUlQgYVJ2bGNTY2ZCd2RbUlZMQ19NQVhfU0ZCXTsgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscyAqLwogICAgIH0gYWFjOwotCi0gIH0gb3ZlcmxheTsKKyAgfQorICBvdmVybGF5OwogCiB9IENBYWNEZWNvZGVyQ29tbW9uRGF0YTsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBDV29ya0J1ZmZlckNvcmUxICpwV29ya0J1ZmZlckNvcmUxOworICBDQ3BseFByZWRpY3Rpb25EYXRhICpjcGx4UHJlZGljdGlvbkRhdGE7Cit9IENBYWNEZWNvZGVyQ29tbW9uU3RhdGljRGF0YTsKIAogLyoKLSAqIFRoaXMgc3RydWN0IG11c3QgYmUgYWxsb2NhdGVkIG9uZSBmb3IgZXZlcnkgY2hhbm5lbHMgb2YgZXZlcnkgZWxlbWVudCBhbmQgbXVzdCBiZSBwZXJzaXN0ZW50LgotICogQW1vbmcgaXRzIG1lbWJlcnMsIHRoZSBmb2xsb3dpbmcgbWVtb3J5IGFyZWFzIGNhbiBiZSBvdmVyd3JpdHRlbiB1bmRlciB0aGUgZ2l2ZW4gY29uZGl0aW9uczoKLSAqICAtIHBTcGVjdHJhbENvZWZmaWNpZW50IFRoZSBtZW1vcnkgcG9pbnRlZCB0byBjYW4gYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgdGltZSBzaWduYWwgcmVuZGVyaW5nLgorICogVGhpcyBzdHJ1Y3QgbXVzdCBiZSBhbGxvY2F0ZWQgb25lIGZvciBldmVyeSBjaGFubmVsIG9mIGV2ZXJ5IGVsZW1lbnQgYW5kIG11c3QKKyAqIGJlIHBlcnNpc3RlbnQuIEFtb25nIGl0cyBtZW1iZXJzLCB0aGUgZm9sbG93aW5nIG1lbW9yeSBhcmVhcyBjYW4gYmUKKyAqIG92ZXJ3cml0dGVuIHVuZGVyIHRoZSBnaXZlbiBjb25kaXRpb25zOgorICogIC0gcFNwZWN0cmFsQ29lZmZpY2llbnQgVGhlIG1lbW9yeSBwb2ludGVkIHRvIGNhbiBiZSBvdmVyd3JpdHRlbiBhZnRlciB0aW1lCisgKiBzaWduYWwgcmVuZGVyaW5nLgogICogIC0gZGF0YSBjYW4gYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgdGltZSBzaWduYWwgcmVuZGVyaW5nLgotICogIC0gcER5bkRhdGEgbWVtb3J5IHBvaW50ZWQgdG8gY2FuIGJlIG92ZXJ3cml0dGVuIGFmdGVyIGVhY2ggQ0NoYW5uZWxFbGVtZW50X0RlY29kZSgpIGNhbGwuCi0gKiAgLSBwQ29tRGF0YS0+b3ZlcmxheSBtZW1vcnkgcG9pbnRlZCB0byBjYW4gYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgZWFjaCBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlKCkgY2FsbC4uCisgKiAgLSBwRHluRGF0YSBtZW1vcnkgcG9pbnRlZCB0byBjYW4gYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgZWFjaAorICogQ0NoYW5uZWxFbGVtZW50X0RlY29kZSgpIGNhbGwuCisgKiAgLSBwQ29tRGF0YS0+b3ZlcmxheSBtZW1vcnkgcG9pbnRlZCB0byBjYW4gYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgZWFjaAorICogQ0NoYW5uZWxFbGVtZW50X0RlY29kZSgpIGNhbGwuLgogICovCi10eXBlZGVmIHN0cnVjdAotewotICBTUEVDVFJBTF9QVFIgcFNwZWN0cmFsQ29lZmZpY2llbnQ7ICAgICAgICAgICAgIC8qIFNwZWN0cmFsIGNvZWZmaWNpZW50cyBvZiBlYWNoIHdpbmRvdyAqLwotICBTSE9SVCBzcGVjU2NhbGVbOF07ICAgICAgICAgICAgICAgICAgLyogU2NhbGUgc2hpZnQgdmFsdWVzIG9mIGVhY2ggc3BlY3RydW0gd2luZG93ICovCi0gIENJY3NJbmZvIGljc0luZm87Ci0gIElOVCBncmFudWxlTGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2l6ZSBvZiBzbWFsbGVzdCBzcGVjdHJ1bSBwaWVjZSAqLwotICBVQ0hBUiBFbGVtZW50SW5zdGFuY2VUYWc7Ci0KLSAgQUFDREVDX1JFTkRFUl9NT0RFIHJlbmRlck1vZGU7ICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2lnbmFsIHJlbmRlcmluZyBtb2RlICovCi0KK3R5cGVkZWYgc3RydWN0IHsKICAgc2hvdWxkQmVVbmlvbiB7CiAgICAgc3RydWN0IHsKKyAgICAgIEZJWFBfREJMIGZhY19kYXRhMFtMRkFDXTsKKyAgICAgIFVDSEFSIGZhY19kYXRhX2VbNF07CisgICAgICBGSVhQX0RCTAorICAgICAgKmZhY19kYXRhWzRdOyAvKiBQb2ludGVycyB0byB1bnVzZWQgcGFydHMgb2YgcFNwZWN0cmFsQ29lZmZpY2llbnQgKi8KKworICAgICAgVUNIQVIgY29yZV9tb2RlOyAvKiBjdXJyZW50IGNvcmUgbW9kZSAqLworICAgICAgVVNBQ19DT1JFTU9ERQorICAgICAgY29yZV9tb2RlX2xhc3Q7ICAgICAgLyogcHJldmlvdXMgY29yZSBtb2RlLCBzaWduYWxsZWQgaW4gdGhlIGJpdHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCBkb25lIGJ5IHRoZSBkZWNvZGVyLCBzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm86Omxhc3RfY29yZV9tb2RlICEhKSovCisgICAgICBVQ0hBUiBscGRfbW9kZV9sYXN0OyAvKiBwcmV2aW91cyBMUEQgbW9kZSwgc2lnbmFsbGVkIGluIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgZG9uZSBieSB0aGUgZGVjb2Rlciwgc2VlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvOjpsYXN0X2NvcmVfbW9kZSAhISkqLworICAgICAgVUNIQVIgbW9kWzRdOworICAgICAgVUNIQVIgYnBmX2NvbnRyb2xfaW5mbzsgLyogKDE6IGVuYWJsZSwgMDogZGlzYWJsZSkgYnBmIGZvciBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcmZyYW1lICovCisKKyAgICAgIEZJWFBfTFBDIGxzcF9jb2VmZls1XVtNX0xQX0ZJTFRFUl9PUkRFUl07IC8qIGxpbmVhciBwcmVkaWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudHMgaW4gTFNQIGRvbWFpbiAqLworICAgICAgRklYUF9MUEMKKyAgICAgIGxwX2NvZWZmWzVdW01fTFBfRklMVEVSX09SREVSXTsgLyogbGluZWFyIHByZWRpY3Rpb24gY29lZmZpY2llbnRzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQIGRvbWFpbiAqLworICAgICAgSU5UIGxwX2NvZWZmX2V4cFs1XTsKKyAgICAgIEZJWFBfTFBDIGxzZl9hZGFwdGl2ZV9tZWFuX2NhbmQKKyAgICAgICAgICBbTV9MUF9GSUxURVJfT1JERVJdOyAvKiBjb25jZWFsbWVudDogaXMgY29waWVkIHRvCisgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sc2ZfYWRhcHRpdmVfbWVhbiBvbmNlIGZyYW1lIGlzCisgICAgICAgICAgICAgICAgICBhc3N1bWVkIHRvIGJlIGNvcnJlY3QqLworICAgICAgRklYUF9TR0wgYVN0YWJpbGl0eVs0XTsgIC8qIExQQyBjb2VmZiBzdGFiaWxpdHkgdmFsdWVzIHJlcXVpcmVkIGZvciBBQ0VMUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBUQ1ggKGNvbmNlYWxtZW50KSAqLworCisgICAgICBDQWNlbHBDaGFubmVsRGF0YSBhY2VscFs0XTsKKworICAgICAgRklYUF9EQkwgdGN4X2dhaW5bNF07CisgICAgICBTQ0hBUiB0Y3hfZ2Fpbl9lWzRdOworICAgIH0gdXNhYzsKKworICAgIHN0cnVjdCB7CiAgICAgICBDUG5zRGF0YSBQbnNEYXRhOyAvKiBOb3QgcmVxdWlyZWQgZm9yIFVTQUMgKi8KICAgICB9IGFhYzsKKyAgfQorICBkYXRhOwogCi0gICAgc3RydWN0IHsKLSAgICB9IHVzYWM7Ci0gIH0gZGF0YTsKKyAgU1BFQ1RSQUxfUFRSIHBTcGVjdHJhbENvZWZmaWNpZW50OyAvKiBTcGVjdHJhbCBjb2VmZmljaWVudHMgb2YgZWFjaCB3aW5kb3cgKi8KKyAgU0hPUlQgc3BlY1NjYWxlWzhdOyAvKiBTY2FsZSBzaGlmdCB2YWx1ZXMgb2YgZWFjaCBzcGVjdHJ1bSB3aW5kb3cgKi8KKyAgQ0ljc0luZm8gaWNzSW5mbzsKKyAgSU5UIGdyYW51bGVMZW5ndGg7IC8qIFNpemUgb2Ygc21hbGxlc3Qgc3BlY3RydW0gcGllY2UgKi8KKyAgVUNIQVIgRWxlbWVudEluc3RhbmNlVGFnOwogCi0gIENBYWNEZWNvZGVyRHluYW1pY0RhdGEgKnBEeW5EYXRhOyAvKiBEYXRhIHJlcXVpcmVkIGZvciBvbmUgZWxlbWVudCBhbmQgZGlzY2FyZGVkIGFmdGVyIGRlY29kaW5nICovCi0gIENBYWNEZWNvZGVyQ29tbW9uRGF0YSAgKnBDb21EYXRhOyAvKiBEYXRhIHJlcXVpcmVkIGZvciBvbmUgY2hhbm5lbCBhdCBhIHRpbWUgZHVyaW5nIGRlY29kZSAqLworICBBQUNERUNfUkVOREVSX01PREUgcmVuZGVyTW9kZTsgLyogT3V0cHV0IHNpZ25hbCByZW5kZXJpbmcgbW9kZSAqLworCisgIENBYWNEZWNvZGVyRHluYW1pY0RhdGEgKgorICAgICAgcER5bkRhdGE7IC8qIERhdGEgcmVxdWlyZWQgZm9yIG9uZSBlbGVtZW50IGFuZCBkaXNjYXJkZWQgYWZ0ZXIgZGVjb2RpbmcgKi8KKyAgQ0FhY0RlY29kZXJDb21tb25EYXRhCisgICAgICAqcENvbURhdGE7IC8qIERhdGEgcmVxdWlyZWQgZm9yIG9uZSBjaGFubmVsIGF0IGEgdGltZSBkdXJpbmcgZGVjb2RlICovCisgIENBYWNEZWNvZGVyQ29tbW9uU3RhdGljRGF0YSAqcENvbVN0YXRpY0RhdGE7IC8qIFBlcnNpc3RlbnQgZGF0YSByZXF1aXJlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIGNoYW5uZWwgYXQgYSB0aW1lIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGUgKi8KKworICBpbnQgY3VyckFsaWFzaW5nU3ltbWV0cnk7IC8qIHJlcXVpcmVkIGZvciBSU1ZENjAgTUNUICovCiAKIH0gQ0FhY0RlY29kZXJDaGFubmVsSW5mbzsKIAogLyogY2hhbm5lbGluZm8uY3BwICovCiAKLUFBQ19ERUNPREVSX0VSUk9SIGdldFNhbXBsaW5nUmF0ZUluZm8oU2FtcGxpbmdSYXRlSW5mbyAqdCwgVUlOVCBzYW1wbGVzUGVyRnJhbWUsIFVJTlQgc2FtcGxpbmdSYXRlSW5kZXgsIFVJTlQgc2FtcGxpbmdSYXRlKTsKK0FBQ19ERUNPREVSX0VSUk9SIGdldFNhbXBsaW5nUmF0ZUluZm8oU2FtcGxpbmdSYXRlSW5mbyAqdCwgVUlOVCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxpbmdSYXRlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxpbmdSYXRlKTsKIAogLyoqCiAgKiBcYnJpZWYgUmVhZCBtYXggU0ZCIGZyb20gYml0IHN0cmVhbSBhbmQgYXNzaWduIFRvdGFsU2ZCYW5kcyBhY2NvcmRpbmcKICAqICAgICAgICB0byB0aGUgd2luZG93IHNlcXVlbmNlIGFuZCBzYW1wbGUgcmF0ZS4KICAqIFxwYXJhbSBoQnMgYml0IHN0cmVhbSBoYW5kbGUgYXMgZGF0YSBzb3VyY2UKLSAqIFxwYXJhbSBwSWNzSW5mbyBJY3NJbmZvIHN0cnVjdHVyZSB0byByZWFkIHRoZSB3aW5kb3cgc2VxdWVuY2UgYW5kIHN0b3JlIE1heFNmQmFuZHMgYW5kIFRvdGFsU2ZCYW5kcworICogXHBhcmFtIHBJY3NJbmZvIEljc0luZm8gc3RydWN0dXJlIHRvIHJlYWQgdGhlIHdpbmRvdyBzZXF1ZW5jZSBhbmQgc3RvcmUKKyAqIE1heFNmQmFuZHMgYW5kIFRvdGFsU2ZCYW5kcwogICogXHBhcmFtIHBTYW1wbGluZ1JhdGVJbmZvIHJlYWQgb25seQogICovCi1BQUNfREVDT0RFUl9FUlJPUiBJY3NSZWFkTWF4U2ZiICgKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICBDSWNzSW5mbyAqcEljc0luZm8sCi0gICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvCi0gICAgICAgICk7CitBQUNfREVDT0RFUl9FUlJPUiBJY3NSZWFkTWF4U2ZiKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQ0ljc0luZm8gKnBJY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbyk7CiAKLUFBQ19ERUNPREVSX0VSUk9SIEljc1JlYWQoCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICBDSWNzSW5mbyAqcEljc0luZm8sCi0gICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8qIFNhbXBsaW5nUmF0ZUluZm9UYWJsZSwKLSAgICAgICAgY29uc3QgVUlOVCBmbGFncwotICAgICAgICApOworQUFDX0RFQ09ERVJfRVJST1IgSWNzUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0ljc0luZm8gKnBJY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpTYW1wbGluZ1JhdGVJbmZvVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MpOwogCiAvKiBzdGVyZW8uY3BwLCBvbmx5IGNhbGxlZCBmcm9tIHRoaXMgZmlsZSAqLwogCiAvKiEKLSAgXGJyaWVmIEFwcGxpZXMgTVMgc3RlcmVvLiAKLSAgCisgIFxicmllZiBBcHBsaWVzIE1TIHN0ZXJlby4KKwogICBUaGUgZnVuY3Rpb24gYXBwbGllcyBNUyBzdGVyZW8uCiAKICAgXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gYWFjIGNoYW5uZWwgaW5mby4KICAgXHBhcmFtIHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzIHBvaW50ZXIgdG8gc2NhbGVmYWN0b3IgYmFuZCBvZmZzZXRzLgogICBccGFyYW0gcFdpbmRvd0dyb3VwTGVuZ3RoIHBvaW50ZXIgdG8gd2luZG93IGdyb3VwIGxlbmd0aCBhcnJheS4KICAgXHBhcmFtIHdpbmRvd0dyb3VwcyBudW1iZXIgb2Ygd2luZG93IGdyb3Vwcy4KLSAgXHBhcmFtIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHNjYWxlZmFjdG9yIGJhbmRzIGluIGxlZnQgY2hhbm5lbC4KLSAgXHBhcmFtIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFIgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHNjYWxlZmFjdG9yIGJhbmRzIGluIHJpZ2h0IGNoYW5uZWwuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXkgZGlmZmVyIGZyb20gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTCBvbmx5IGZvciBVU0FDLgotICBccmV0dXJuICBub25lCisgIFxwYXJhbSBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMIG51bWJlciBvZiB0cmFuc21pdHRlZCBzY2FsZWZhY3RvciBiYW5kcyBpbgorICBsZWZ0IGNoYW5uZWwuIFxwYXJhbSBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRSIG51bWJlciBvZiB0cmFuc21pdHRlZAorICBzY2FsZWZhY3RvciBiYW5kcyBpbiByaWdodCBjaGFubmVsLiBNYXkgZGlmZmVyIGZyb20KKyAgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTCBvbmx5IGZvciBVU0FDLiBccmV0dXJuICBub25lCiAqLwotdm9pZCBDSm9pbnRTdGVyZW9fQXBwbHlNUyhDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCAqcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpwV2luZG93R3JvdXBMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB3aW5kb3dHcm91cHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkUik7Cit2b2lkIENKb2ludFN0ZXJlb19BcHBseU1TKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1syXSwKKyAgICBGSVhQX0RCTCAqc3BlY3RydW1MLCBGSVhQX0RCTCAqc3BlY3RydW1SLCBTSE9SVCAqU0ZCbGVmdFNjYWxlLAorICAgIFNIT1JUICpTRkJyaWdodFNjYWxlLCBTSE9SVCAqc3BlY1NjYWxlTCwgU0hPUlQgKnNwZWNTY2FsZVIsCisgICAgY29uc3QgU0hPUlQgKnBTY2FsZUZhY3RvckJhbmRPZmZzZXRzLCBjb25zdCBVQ0hBUiAqcFdpbmRvd0dyb3VwTGVuZ3RoLAorICAgIGNvbnN0IGludCB3aW5kb3dHcm91cHMsIGNvbnN0IGludCBtYXhfc2ZiX3N0ZV9vdXRzaWRlLAorICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMLAorICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRSLCBGSVhQX0RCTCAqc3RvcmVfZG14X3JlX3ByZXYsCisgICAgU0hPUlQgKnN0b3JlX2RteF9yZV9wcmV2X2UsIGNvbnN0IGludCBtYWluYmFuZF9mbGFnKTsKIAogLyohCiAgIFxicmllZiBBcHBsaWVzIGludGVuc2l0eSBzdGVyZW8KQEAgLTM1MCwxMDEgKzQ3OCw4NyBAQAogICBccGFyYW0gcFdpbmRvd0dyb3VwTGVuZ3RoIHBvaW50ZXIgdG8gd2luZG93IGdyb3VwIGxlbmd0aCBhcnJheS4KICAgXHBhcmFtIHdpbmRvd0dyb3VwcyBudW1iZXIgb2Ygd2luZG93IGdyb3Vwcy4KICAgXHBhcmFtIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgc2NhbGVmYWN0b3IgYmFuZHMuCi0gIFxwYXJhbSBDb21tb25XaW5kb3cgY29tbW9uIHdpbmRvdyBiaXQuCiAgIFxyZXR1cm4gIG5vbmUKICovCiB2b2lkIENKb2ludFN0ZXJlb19BcHBseUlTKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0ICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnBXaW5kb3dHcm91cExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHdpbmRvd0dyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBDb21tb25XaW5kb3cpOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQpOwogCiAvKiBhYWNkZWNfcG5zLmNwcCAqLwotaW50IENQbnNfSXNQbnNVc2VkIChjb25zdCBDUG5zRGF0YSAqcFBuc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJhbmQpOworaW50IENQbnNfSXNQbnNVc2VkKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwgY29uc3QgaW50IGdyb3VwLCBjb25zdCBpbnQgYmFuZCk7CiAKLXZvaWQgQ1Buc19TZXRDb3JyZWxhdGlvbihDUG5zRGF0YSAqcFBuc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYW5kLAordm9pZCBDUG5zX1NldENvcnJlbGF0aW9uKENQbnNEYXRhICpwUG5zRGF0YSwgY29uc3QgaW50IGdyb3VwLCBjb25zdCBpbnQgYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3V0b2ZwaGFzZSk7CiAKIC8qKioqKioqKioqKioqKioqKiogaW5saW5lIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKiovCiAKLWlubGluZSBVQ0hBUiBJc1ZhbGlkKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykKLXsKLSAgcmV0dXJuIHBJY3NJbmZvLT5WYWxpZDsKK2lubGluZSBVQ0hBUiBJc1ZhbGlkKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykgeyByZXR1cm4gcEljc0luZm8tPlZhbGlkOyB9CisKK2lubGluZSBVQ0hBUiBJc0xvbmdCbG9jayhjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pIHsKKyAgcmV0dXJuIChwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgIT0gQkxPQ0tfU0hPUlQpOwogfQogCi1pbmxpbmUgVUNIQVIgSXNMb25nQmxvY2soY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKQotewotICByZXR1cm4gKHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSAhPSBFaWdodFNob3J0U2VxdWVuY2UpOwotfQotCi1pbmxpbmUgVUNIQVIgR2V0V2luZG93U2hhcGUoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKQoteworaW5saW5lIFVDSEFSIEdldFdpbmRvd1NoYXBlKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykgewogICByZXR1cm4gcEljc0luZm8tPldpbmRvd1NoYXBlOwogfQogCi1pbmxpbmUgVUNIQVIgR2V0V2luZG93U2VxdWVuY2UoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKQoteworaW5saW5lIEJMT0NLX1RZUEUgR2V0V2luZG93U2VxdWVuY2UoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKSB7CiAgIHJldHVybiBwSWNzSW5mby0+V2luZG93U2VxdWVuY2U7CiB9CiAKLWlubGluZSBjb25zdCBTSE9SVCAqR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cyhjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8qIHNhbXBsaW5nUmF0ZUluZm8pCi17Ci0gIGlmIChJc0xvbmdCbG9jayhwSWNzSW5mbykpCi0gIHsKK2lubGluZSBjb25zdCBTSE9SVCAqR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygKKyAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnNhbXBsaW5nUmF0ZUluZm8pIHsKKyAgaWYgKElzTG9uZ0Jsb2NrKHBJY3NJbmZvKSkgewogICAgIHJldHVybiBzYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX0xvbmc7Ci0gIH0KLSAgZWxzZQotICB7CisgIH0gZWxzZSB7CiAgICAgcmV0dXJuIHNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CiAgIH0KIH0KIAotaW5saW5lIGludCBHZXRXaW5kb3dzUGVyRnJhbWUoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKQotewotICByZXR1cm4gKHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9PSBFaWdodFNob3J0U2VxdWVuY2UpID8gOCA6IDE7CitpbmxpbmUgVUNIQVIgR2V0TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzKAorICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqc2FtcGxpbmdSYXRlSW5mbykgeworICBpZiAoSXNMb25nQmxvY2socEljc0luZm8pKSB7CisgICAgcmV0dXJuIHNhbXBsaW5nUmF0ZUluZm8tPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19Mb25nOworICB9IGVsc2UgeworICAgIHJldHVybiBzYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CisgIH0KIH0KIAotaW5saW5lIFVDSEFSIEdldFdpbmRvd0dyb3Vwcyhjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCi17CitpbmxpbmUgaW50IEdldFdpbmRvd3NQZXJGcmFtZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pIHsKKyAgcmV0dXJuIChwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPT0gQkxPQ0tfU0hPUlQpID8gOCA6IDE7Cit9CisKK2lubGluZSBVQ0hBUiBHZXRXaW5kb3dHcm91cHMoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKSB7CiAgIHJldHVybiBwSWNzSW5mby0+V2luZG93R3JvdXBzOwogfQogCi1pbmxpbmUgVUNIQVIgR2V0V2luZG93R3JvdXBMZW5ndGgoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLCBjb25zdCBJTlQgaW5kZXgpCi17CitpbmxpbmUgVUNIQVIgR2V0V2luZG93R3JvdXBMZW5ndGgoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLCBjb25zdCBJTlQgaW5kZXgpIHsKICAgcmV0dXJuIHBJY3NJbmZvLT5XaW5kb3dHcm91cExlbmd0aFtpbmRleF07CiB9CiAKLWlubGluZSBjb25zdCBVQ0hBUiAqR2V0V2luZG93R3JvdXBMZW5ndGhUYWJsZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCi17CitpbmxpbmUgY29uc3QgVUNIQVIgKkdldFdpbmRvd0dyb3VwTGVuZ3RoVGFibGUoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKSB7CiAgIHJldHVybiBwSWNzSW5mby0+V2luZG93R3JvdXBMZW5ndGg7CiB9CiAKLWlubGluZSBVQ0hBUiBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKQoteworaW5saW5lIFVDSEFSIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZChjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pIHsKICAgcmV0dXJuIHBJY3NJbmZvLT5NYXhTZkJhbmRzOwogfQogCi1pbmxpbmUgVUNIQVIgR2V0U2NhbGVNYXhGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbzAsIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbzEpCi17CitpbmxpbmUgVUNIQVIgR2V0U2NhbGVNYXhGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbzEpIHsKICAgcmV0dXJuIGZNYXgocEljc0luZm8wLT5NYXhTZkJhbmRzLCBwSWNzSW5mbzEtPk1heFNmQmFuZHMpOwogfQogCi1pbmxpbmUgVUNIQVIgR2V0U2NhbGVGYWN0b3JCYW5kc1RvdGFsKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykKLXsKK2lubGluZSBVQ0hBUiBHZXRTY2FsZUZhY3RvckJhbmRzVG90YWwoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKSB7CiAgIHJldHVybiBwSWNzSW5mby0+VG90YWxTZkJhbmRzOwogfQogCiAvKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGFwcGxpZXMgdG8gQUFDLUxDIG9ubHkgISAqLwotaW5saW5lIFVDSEFSIEdldE1heGltdW1UbnNCYW5kcyhjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IGludCBzYW1wbGluZ1JhdGVJbmRleCkKLXsKK2lubGluZSBVQ0hBUiBHZXRNYXhpbXVtVG5zQmFuZHMoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2FtcGxpbmdSYXRlSW5kZXgpIHsKICAgcmV0dXJuIHRuc19tYXhfYmFuZHNfdGJsW3NhbXBsaW5nUmF0ZUluZGV4XVshSXNMb25nQmxvY2socEljc0luZm8pXTsKIH0KIAogI2VuZGlmIC8qICNpZm5kZWYgQ0hBTk5FTElORk9fSCAqLwotCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2NvbmNlYWwuY3BwIGIvbGliQUFDZGVjL3NyYy9jb25jZWFsLmNwcAppbmRleCAxYzMxM2VmLi41NjlkNjcyIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2NvbmNlYWwuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvY29uY2VhbC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNTMgKzkwLDU4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBpbmRlcGVuZGVudCBjaGFubmVsIGNvbmNlYWxtZW50CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBccGFnZSBjb25jZWFsbWVudCBBQUMgY29yZSBjb25jZWFsbWVudAogCi0gIFRoaXMgQUFDIGNvcmUgaW1wbGVtZW50YXRpb24gaW5jbHVkZXMgYSBjb25jZWFsbWVudCBmdW5jdGlvbiwgd2hpY2ggY2FuIGJlIGVuYWJsZWQKLSAgdXNpbmcgdGhlIHNldmVyYWwgZGVmaW5lcyBkdXJpbmcgY29tcGlsYXRpb24uCisgIFRoaXMgQUFDIGNvcmUgaW1wbGVtZW50YXRpb24gaW5jbHVkZXMgYSBjb25jZWFsbWVudCBmdW5jdGlvbiwgd2hpY2ggY2FuIGJlCisgIGVuYWJsZWQgdXNpbmcgdGhlIHNldmVyYWwgZGVmaW5lcyBkdXJpbmcgY29tcGlsYXRpb24uCiAKLSAgVGhlcmUgYXJlIHZhcmlvdXMgdGVzdHMgaW5zaWRlIHRoZSBjb3JlLCBzdGFydGluZyB3aXRoIHNpbXBsZSBDUkMgdGVzdHMgYW5kIGVuZGluZyBpbgotICBhIHZhcmlldHkgb2YgcGxhdXNpYmlsaXR5IGNoZWNrcy4gSWYgc3VjaCBhIGNoZWNrIGluZGljYXRlcyBhbiBpbnZhbGlkIGJpdHN0cmVhbSwgdGhlbgotICBjb25jZWFsbWVudCBpcyBhcHBsaWVkLgorICBUaGVyZSBhcmUgdmFyaW91cyB0ZXN0cyBpbnNpZGUgdGhlIGNvcmUsIHN0YXJ0aW5nIHdpdGggc2ltcGxlIENSQyB0ZXN0cyBhbmQKKyAgZW5kaW5nIGluIGEgdmFyaWV0eSBvZiBwbGF1c2liaWxpdHkgY2hlY2tzLiBJZiBzdWNoIGEgY2hlY2sgaW5kaWNhdGVzIGFuCisgIGludmFsaWQgYml0c3RyZWFtLCB0aGVuIGNvbmNlYWxtZW50IGlzIGFwcGxpZWQuCiAKLSAgQ29uY2VhbG1lbnQgaXMgYWxzbyBhcHBsaWVkIHdoZW4gdGhlIGNhbGxpbmcgbWFpbiBwcm9ncmFtIGluZGljYXRlcyBhIGRpc3RvcnRlZCBvciBtaXNzaW5nCi0gIGRhdGEgZnJhbWUgdXNpbmcgdGhlIGZyYW1lT0sgZmxhZy4gVGhpcyBpcyB1c2VkIGZvciBlcnJvciBkZXRlY3Rpb24gb24gdGhlIHRyYW5zcG9ydCBsYXllci4KLSAgKFNlZSBiZWxvdykKKyAgQ29uY2VhbG1lbnQgaXMgYWxzbyBhcHBsaWVkIHdoZW4gdGhlIGNhbGxpbmcgbWFpbiBwcm9ncmFtIGluZGljYXRlcyBhCisgIGRpc3RvcnRlZCBvciBtaXNzaW5nIGRhdGEgZnJhbWUgdXNpbmcgdGhlIGZyYW1lT0sgZmxhZy4gVGhpcyBpcyB1c2VkIGZvciBlcnJvcgorICBkZXRlY3Rpb24gb24gdGhlIHRyYW5zcG9ydCBsYXllci4gKFNlZSBiZWxvdykKIAogICBUaGVyZSBhcmUgdGhyZWUgY29uY2VhbG1lbnQtbW9kZXM6CiAKLSAgMSkgTXV0aW5nOiBUaGUgc3BlY3RyYWwgZGF0YSBpcyBzaW1wbHkgc2V0IHRvIHplcm8gaW4gY2FzZSBvZiBhbiBkZXRlY3RlZCBlcnJvci4KKyAgMSkgTXV0aW5nOiBUaGUgc3BlY3RyYWwgZGF0YSBpcyBzaW1wbHkgc2V0IHRvIHplcm8gaW4gY2FzZSBvZiBhbiBkZXRlY3RlZAorICBlcnJvci4KIAotICAyKSBOb2lzZSBzdWJzdGl0dXRpb246IEluIGNhc2Ugb2YgYW4gZGV0ZWN0ZWQgZXJyb3IsIGNvbmNlYWxtZW50IGNvcGllcyB0aGUgbGFzdCBmcmFtZSBhbmQgYWRkcwotICAgICBhdHRlbnVhdGVzIHRoZSBzcGVjdHJhbCBkYXRhLiBGb3IgdGhpcyBtb2RlIHlvdSBoYXZlIHRvIHNldCB0aGUgI0NPTkNFQUxfTk9JU0UgZGVmaW5lLgotICAgICBOb2lzZSBzdWJzdGl0dXRpb24gYWRkcyBubyBhZGRpdGlvbmFsIGRlbGF5LgorICAyKSBOb2lzZSBzdWJzdGl0dXRpb246IEluIGNhc2Ugb2YgYW4gZGV0ZWN0ZWQgZXJyb3IsIGNvbmNlYWxtZW50IGNvcGllcyB0aGUKKyAgbGFzdCBmcmFtZSBhbmQgYWRkcyBhdHRlbnVhdGVzIHRoZSBzcGVjdHJhbCBkYXRhLiBGb3IgdGhpcyBtb2RlIHlvdSBoYXZlIHRvCisgIHNldCB0aGUgI0NPTkNFQUxfTk9JU0UgZGVmaW5lLiBOb2lzZSBzdWJzdGl0dXRpb24gYWRkcyBubyBhZGRpdGlvbmFsIGRlbGF5LgogCi0gIDMpIEludGVycG9sYXRpb246IFRoZSBpbnRlcnBvbGF0aW9uIHJvdXRpbmUgc3dhcHMgdGhlIHNwZWN0cmFsIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgYW5kIHRoZQotICAgICBjdXJyZW50IGZyYW1lIGp1c3QgYmVmb3JlIHRoZSBmaW5hbCBmcmVxdWVuY3kgdG8gdGltZSBjb252ZXJzaW9uLiBJbiBjYXNlIGEgc2luZ2xlIGZyYW1lIGlzCi0gICAgIGNvcnJ1cHRlZCwgY29uY2VhbG1hbnQgaW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIGxhc3QgZ29vZCBhbmQgdGhlIGZpcnN0IGdvb2QgZnJhbWUgdG8gY3JlYXRlCi0gICAgIHRoZSBzcGVjdHJhbCBkYXRhIGZvciB0aGUgbWlzc2luZyBmcmFtZS4gSWYgbXVsdGlwbGUgZnJhbWVzIGFyZSBjb3JydXB0ZWQsIGNvbmNlYWxtZW50Ci0gICAgIGltcGxlbWVudHMgZmlyc3QgYSBmYWRlIG91dCBiYXNlZCBvbiBzbGlnaHRseSBtb2RpZmllZCBzcGVjdHJhbCB2YWx1ZXMgZnJvbSB0aGUgbGFzdCBnb29kCi0gICAgIGZyYW1lLiBBcyBzb29uIGFzIGdvb2QgZnJhbWVzIGFyZSBhdmFpbGFibGUsIGNvbmNlYWxtYW50IGZhZGVzIGluIHRoZSBuZXcgc3BlY3RyYWwgZGF0YS4KLSAgICAgRm9yIHRoaXMgbW9kZSB5b3UgaGF2ZSB0byBzZXQgdGhlICNDT05DRUFMX0lOVEVSIGRlZmluZS4gTm90ZSB0aGF0IGluIHRoaXMgY2FzZSwgeW91IGFsc28KLSAgICAgbmVlZCB0byBzZXQgI1NCUl9CU19ERUxBWV9FTkFCTEUsIHdoaWNoIGJhc2ljYWxseSBhZGRzIGFwcHJvcmlhdGUgZGVsYXkgaW4gdGhlIFNCUiBkZWNvZGVyLgotICAgICBOb3RlIHRoYXQgdGhlIEludGVycG9sYXRpbmctQ29uY2VhbG1lbnQgaW5jcmVhc2VzIHRoZSBkZWxheSBvZiB5b3VyIGRlY29kZXIgYnkgb25lIGZyYW1lCi0gICAgIGFuZCB0aGF0IGl0IGRvZXMgcmVxdWlyZSBhZGRpdGlvbmFsIHJlc291cmNlcyBzdWNoIGFzIG1lbW9yeSBhbmQgY29tcHV0YXRpb25hbCBjb21wbGV4aXR5LgorICAzKSBJbnRlcnBvbGF0aW9uOiBUaGUgaW50ZXJwb2xhdGlvbiByb3V0aW5lIHN3YXBzIHRoZSBzcGVjdHJhbCBkYXRhIGZyb20gdGhlCisgIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBmcmFtZSBqdXN0IGJlZm9yZSB0aGUgZmluYWwgZnJlcXVlbmN5IHRvIHRpbWUKKyAgY29udmVyc2lvbi4gSW4gY2FzZSBhIHNpbmdsZSBmcmFtZSBpcyBjb3JydXB0ZWQsIGNvbmNlYWxtYW50IGludGVycG9sYXRlcworICBiZXR3ZWVuIHRoZSBsYXN0IGdvb2QgYW5kIHRoZSBmaXJzdCBnb29kIGZyYW1lIHRvIGNyZWF0ZSB0aGUgc3BlY3RyYWwgZGF0YSBmb3IKKyAgdGhlIG1pc3NpbmcgZnJhbWUuIElmIG11bHRpcGxlIGZyYW1lcyBhcmUgY29ycnVwdGVkLCBjb25jZWFsbWVudCBpbXBsZW1lbnRzCisgIGZpcnN0IGEgZmFkZSBvdXQgYmFzZWQgb24gc2xpZ2h0bHkgbW9kaWZpZWQgc3BlY3RyYWwgdmFsdWVzIGZyb20gdGhlIGxhc3QgZ29vZAorICAgICBmcmFtZS4gQXMgc29vbiBhcyBnb29kIGZyYW1lcyBhcmUgYXZhaWxhYmxlLCBjb25jZWFsbWFudCBmYWRlcyBpbiB0aGUgbmV3CisgIHNwZWN0cmFsIGRhdGEuIEZvciB0aGlzIG1vZGUgeW91IGhhdmUgdG8gc2V0IHRoZSAjQ09OQ0VBTF9JTlRFUiBkZWZpbmUuIE5vdGUKKyAgdGhhdCBpbiB0aGlzIGNhc2UsIHlvdSBhbHNvIG5lZWQgdG8gc2V0ICNTQlJfQlNfREVMQVlfRU5BQkxFLCB3aGljaCBiYXNpY2FsbHkKKyAgYWRkcyBhcHByb3JpYXRlIGRlbGF5IGluIHRoZSBTQlIgZGVjb2Rlci4gTm90ZSB0aGF0IHRoZQorICBJbnRlcnBvbGF0aW5nLUNvbmNlYWxtZW50IGluY3JlYXNlcyB0aGUgZGVsYXkgb2YgeW91ciBkZWNvZGVyIGJ5IG9uZSBmcmFtZSBhbmQKKyAgdGhhdCBpdCBkb2VzIHJlcXVpcmUgYWRkaXRpb25hbCByZXNvdXJjZXMgc3VjaCBhcyBtZW1vcnkgYW5kIGNvbXB1dGF0aW9uYWwKKyAgY29tcGxleGl0eS4KIAogICA8aDI+SG93IGNvbmNlYWxtZW50IGNhbiBiZSB1c2VkIHdpdGggZXJyb3JzIG9uIHRoZSB0cmFuc3BvcnQgbGF5ZXI8L2gyPgogCi0gIE1hbnkgZXJyb3JzIGNhbiBvciBoYXZlIHRvIGJlIGRldGVjdGVkIG9uIHRoZSB0cmFuc3BvcnQgbGF5ZXIuIEZvciBleGFtcGxlIGluIElQIGJhc2VkIHN5c3RlbXMKLSAgcGFja2V0IGxvc3MgY2FuIG9jY3VyLiBUaGUgdHJhbnNwb3J0IHByb3RvY29sIHVzZWQgc2hvdWxkIGluZGljYXRlIHN1Y2ggcGFja2V0IGxvc3MgYnkgaW5zZXJ0aW5nCi0gIGFuIGVtcHR5IGZyYW1lIHdpdGggZnJhbWVPSz0wLgorICBNYW55IGVycm9ycyBjYW4gb3IgaGF2ZSB0byBiZSBkZXRlY3RlZCBvbiB0aGUgdHJhbnNwb3J0IGxheWVyLiBGb3IgZXhhbXBsZSBpbgorICBJUCBiYXNlZCBzeXN0ZW1zIHBhY2tldCBsb3NzIGNhbiBvY2N1ci4gVGhlIHRyYW5zcG9ydCBwcm90b2NvbCB1c2VkIHNob3VsZAorICBpbmRpY2F0ZSBzdWNoIHBhY2tldCBsb3NzIGJ5IGluc2VydGluZyBhbiBlbXB0eSBmcmFtZSB3aXRoIGZyYW1lT0s9MC4KICovCiAKICNpbmNsdWRlICJjb25jZWFsLmgiCkBAIC0xMzMsMTcxICsxNDksMTUzIEBACiAjaW5jbHVkZSAiYWFjX3JvbS5oIgogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKLQogLyogUE5TIChvZiBibG9jaykgKi8KICNpbmNsdWRlICJhYWNkZWNfcG5zLmgiCiAjaW5jbHVkZSAiYmxvY2suaCIKIAotI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKKyNkZWZpbmUgQ09OQ0VBTF9ERkxUX0NPTUZfTk9JU0VfTEVWRUwgKDB4MTAwMDAwKQogCi0jZGVmaW5lIENPTkNFQUxfREZMVF9DT01GX05PSVNFX0xFVkVMICAgICAoIDQ2ICkgIC8qIH49IC03MCBkQiAqLwotCisjZGVmaW5lIENPTkNFQUxfTk9UX0RFRklORUQgKChVQ0hBUiktMSkKIAogLyogZGVmYXVsdCBzZXR0aW5ncyAqLwotI2RlZmluZSBDT05DRUFMX0RGTFRfRkFERU9VVF9GUkFNRVMgICAgICAgKCA1ICkKLSNkZWZpbmUgQ09OQ0VBTF9ERkxUX0ZBREVJTl9GUkFNRVMgICAgICAgICggNSApCi0jZGVmaW5lIENPTkNFQUxfREZMVF9NVVRFX1JFTEVBU0VfRlJBTUVTICAoIDMgKQorI2RlZmluZSBDT05DRUFMX0RGTFRfRkFERU9VVF9GUkFNRVMgKDYpCisjZGVmaW5lIENPTkNFQUxfREZMVF9GQURFSU5fRlJBTUVTICg1KQorI2RlZmluZSBDT05DRUFMX0RGTFRfTVVURV9SRUxFQVNFX0ZSQU1FUyAoMCkKIAotI2RlZmluZSBDT05DRUFMX0RGTFRfRkFERV9GQUNUT1IgICAgICAgICAgKCAwLjcwNzEwNjc4MTE4NjU0OGYgKSAgIC8qIDEvc3FydCgyKSAqLworI2RlZmluZSBDT05DRUFMX0RGTFRfRkFERV9GQUNUT1IgKDAuNzA3MTA2NzgxMTg2NTQ4ZikgLyogMS9zcXJ0KDIpICovCiAKIC8qIHNvbWUgb2Z0ZW4gdXNlZCBjb25zdGFudHM6ICovCi0jZGVmaW5lIEZJWFBfWkVSTyAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wZikKLSNkZWZpbmUgRklYUF9PTkUgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxLjBmKQotI2RlZmluZSBGSVhQX0ZMX0NPUlJFQ1RJT04gIEZMMkZYQ09OU1RfREJMKDAuNTMzMzMzMzMzMzMzMzMzMzNmKQorI2RlZmluZSBGSVhQX1pFUk8gRkwyRlhDT05TVF9EQkwoMC4wZikKKyNkZWZpbmUgRklYUF9PTkUgRkwyRlhDT05TVF9EQkwoMS4wZikKKyNkZWZpbmUgRklYUF9GTF9DT1JSRUNUSU9OIEZMMkZYQ09OU1RfREJMKDAuNTMzMzMzMzMzMzMzMzMzMzNmKQogCiAvKiBGb3IgcGFyYW1ldGVyIGNvbnZlcnNpb24gKi8KLSNkZWZpbmUgQ09OQ0VBTF9QQVJBTUVURVJfQklUUyAgICAgICAgICAgICAgKCA4ICkKLSNkZWZpbmUgQ09OQ0VBTF9NQVhfUVVBTlRfRkFDVE9SICAgICAgICAgICAgKCAoMTw8Q09OQ0VBTF9QQVJBTUVURVJfQklUUyktMSApCi0vKiNkZWZpbmUgQ09OQ0VBTF9NSU5fQVRURU5VQVRJT05fRkFDVE9SXzAyNSAgKCBGTDJGWENPTlNUX0RCTCgwLjk3MTYyNzk1MTU3NzEwNjE3NCkgKSovICAvKiAtMC4yNSBkQiAqLwotI2RlZmluZSBDT05DRUFMX01JTl9BVFRFTlVBVElPTl9GQUNUT1JfMDI1X0xEICBGTDJGWENPTlNUX0RCTCgtMC4wNDE1MjQxMDExODYwOTIwMjk1OTY4NTM0NDUyMTIyOTkpCi0vKiNkZWZpbmUgQ09OQ0VBTF9NSU5fQVRURU5VQVRJT05fRkFDVE9SXzA1MCAgKCBGTDJGWENPTlNUX0RCTCgwLjk0NDA2MDg3NjI4NTkyMzM4MCkgKSovICAvKiAtMC41MCBkQiAqLwotI2RlZmluZSBDT05DRUFMX01JTl9BVFRFTlVBVElPTl9GQUNUT1JfMDUwX0xEIEZMMkZYQ09OU1RfREJMKC0wLjA4MzA0ODIwMjM3MjE4NDA1OTI1MzU5NzAwODE0NTI5MykKKyNkZWZpbmUgQ09OQ0VBTF9QQVJBTUVURVJfQklUUyAoOCkKKyNkZWZpbmUgQ09OQ0VBTF9NQVhfUVVBTlRfRkFDVE9SICgoMSA8PCBDT05DRUFMX1BBUkFNRVRFUl9CSVRTKSAtIDEpCisvKiNkZWZpbmUgQ09OQ0VBTF9NSU5fQVRURU5VQVRJT05fRkFDVE9SXzAyNSAgKCBGTDJGWENPTlNUX0RCTCgwLjk3MTYyNzk1MTU3NzEwNjE3NCkgKSovIC8qIC0wLjI1IGRCICovCisjZGVmaW5lIENPTkNFQUxfTUlOX0FUVEVOVUFUSU9OX0ZBQ1RPUl8wMjVfTEQgXAorICBGTDJGWENPTlNUX0RCTCgtMC4wNDE1MjQxMDExODYwOTIwMjk1OTY4NTM0NDUyMTIyOTkpCisvKiNkZWZpbmUgQ09OQ0VBTF9NSU5fQVRURU5VQVRJT05fRkFDVE9SXzA1MCAgKCBGTDJGWENPTlNUX0RCTCgwLjk0NDA2MDg3NjI4NTkyMzM4MCkgKSovIC8qIC0wLjUwIGRCICovCisjZGVmaW5lIENPTkNFQUxfTUlOX0FUVEVOVUFUSU9OX0ZBQ1RPUl8wNTBfTEQgXAorICBGTDJGWENPTlNUX0RCTCgtMC4wODMwNDgyMDIzNzIxODQwNTkyNTM1OTcwMDgxNDUyOTMpCiAKIHR5cGVkZWYgZW51bSB7CiAgIENDb25jZWFsbWVudF9Ob0V4cGFuZCwKICAgQ0NvbmNlYWxtZW50X0V4cGFuZCwKICAgQ0NvbmNlYWxtZW50X0NvbXByZXNzCi19Ci1DQ29uY2VhbG1lbnRFeHBhbmRUeXBlOworfSBDQ29uY2VhbG1lbnRFeHBhbmRUeXBlOwogCiBzdGF0aWMgY29uc3QgRklYUF9TR0wgZmFjTW9kNFRhYmxlWzRdID0gewotICBGTDJGWENPTlNUX1NHTCgwLjUwMDAwMDAwMGYpLCAgIC8qIEZJWFBfU0dMKDB4NDAwMCksICAyXi0oMS0wLDAwKSAqLwotICBGTDJGWENPTlNUX1NHTCgwLjU5NDYwMzU1OGYpLCAgIC8qIEZJWFBfU0dMKDB4NGMxYiksICAyXi0oMS0wLDI1KSAqLwotICBGTDJGWENPTlNUX1NHTCgwLjcwNzEwNjc4MWYpLCAgIC8qIEZJWFBfU0dMKDB4NWE4MiksICAyXi0oMS0wLDUwKSAqLwotICBGTDJGWENPTlNUX1NHTCgwLjg0MDg5NjQxNWYpICAgIC8qIEZJWFBfU0dMKDB4NmJhMikgICAyXi0oMS0wLDc1KSAqLworICAgIEZMMkZYQ09OU1RfU0dMKDAuNTAwMDAwMDAwZiksIC8qIEZJWFBfU0dMKDB4NDAwMCksICAyXi0oMS0wLDAwKSAqLworICAgIEZMMkZYQ09OU1RfU0dMKDAuNTk0NjAzNTU4ZiksIC8qIEZJWFBfU0dMKDB4NGMxYiksICAyXi0oMS0wLDI1KSAqLworICAgIEZMMkZYQ09OU1RfU0dMKDAuNzA3MTA2NzgxZiksIC8qIEZJWFBfU0dMKDB4NWE4MiksICAyXi0oMS0wLDUwKSAqLworICAgIEZMMkZYQ09OU1RfU0dMKDAuODQwODk2NDE1ZikgIC8qIEZJWFBfU0dMKDB4NmJhMikgICAyXi0oMS0wLDc1KSAqLwogfTsKIAorc3RhdGljIHZvaWQgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KAorICAgIEZJWFBfREJMICpzcGVjdHJ1bSwgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgY29uc3QgaW50IGJsb2NrVHlwZSwgQ0NvbmNlYWxtZW50RXhwYW5kVHlwZSBleCwgaW50ICpzZmJFbmVyZ3kpOwogCitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfSW50ZXJwb2xhdGVCdWZmZXIoRklYUF9EQkwgKnNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpwU3BlY1NjYWxlUHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcFNwZWNTY2FsZUFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcFNwZWNTY2FsZU91dCwgaW50ICplblBydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuQWN0LCBpbnQgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpwU2ZiT2Zmc2V0KTsKIAotCi1zdGF0aWMgdm9pZAotICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3kgKAotICAgIEZJWFBfREJMICAgICAgICAgICAgICAgKnNwZWN0cnVtLAotICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIGJsb2NrVHlwZSwKLSAgICBDQ29uY2VhbG1lbnRFeHBhbmRUeXBlICBleCwKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3kKLSAgKTsKLQotc3RhdGljIHZvaWQKLSAgQ0NvbmNlYWxtZW50X0ludGVycG9sYXRlQnVmZmVyICgKLSAgICBGSVhQX0RCTCAgICAqc3BlY3RydW0sCi0gICAgU0hPUlQgICAgICAgKnBTcGVjU2NhbGVQcmV2LAotICAgIFNIT1JUICAgICAgICpwU3BlY1NjYWxlQWN0LAotICAgIFNIT1JUICAgICAgICpwU3BlY1NjYWxlT3V0LAotICAgIGludCAgICAgICAgICplblBydiwKLSAgICBpbnQgICAgICAgICAqZW5BY3QsCi0gICAgaW50ICAgICAgICAgIHNmYkNudCwKLSAgICBjb25zdCBTSE9SVCAqcFNmYk9mZnNldAotICApOwotCi1zdGF0aWMgaW50Ci0gIENDb25jZWFsbWVudF9BcHBseUludGVyICgKLSAgICBDQ29uY2VhbG1lbnRJbmZvICAgICAgICpwQ29uY2VhbG1lbnRJbmZvLAorc3RhdGljIGludCBDQ29uY2VhbG1lbnRfQXBwbHlJbnRlcigKKyAgICBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbG1lbnRJbmZvLAogICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgY29uc3QgaW50ICBzYW1wbGVzUGVyRnJhbWUsCi0gICAgY29uc3QgaW50ICBpbXByb3ZlVG9uYWwsCi0gICAgY29uc3QgaW50ICBmcmFtZU9rCi0gICk7CisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsCisgICAgY29uc3QgaW50IGltcHJvdmVUb25hbCwgY29uc3QgaW50IGZyYW1lT2ssIGNvbnN0IGludCBtdXRlX3JlbGVhc2VfYWN0aXZlKTsKIAotCi0KLXN0YXRpYyBpbnQKLSAgQ0NvbmNlYWxtZW50X0FwcGx5Tm9pc2UgKAorc3RhdGljIGludCBDQ29uY2VhbG1lbnRfQXBwbHlOb2lzZSgKICAgICBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbG1lbnRJbmZvLAogICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCiAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICBjb25zdCBpbnQgICAgc2FtcGxlc1BlckZyYW1lLAotICAgIGNvbnN0IFVJTlQgZmxhZ3MKLSAgKTsKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwKKyAgICBjb25zdCBVSU5UIGZsYWdzKTsKIAotc3RhdGljIHZvaWQKLSAgQ0NvbmNlYWxtZW50X1VwZGF0ZVN0YXRlICgKLSAgICBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbG1lbnRJbmZvLAotICAgIGludCBmcmFtZU9rCi0gICk7CitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfVXBkYXRlU3RhdGUoCisgICAgQ0NvbmNlYWxtZW50SW5mbyAqcENvbmNlYWxtZW50SW5mbywgaW50IGZyYW1lT2ssCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBjb25zdCBpbnQgc2FtcGxlc1BlckZyYW1lLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKIAotc3RhdGljIHZvaWQKLSAgQ0NvbmNlYWxtZW50X0FwcGx5UmFuZG9tU2lnbiAoCi0gICAgaW50ICAgICAgICBpUmFuZG9tUGhhc2UsCi0gICAgRklYUF9EQkwgICpzcGVjLAotICAgIGludCAgICAgICAgc2FtcGxlc1BlckZyYW1lCi0gICk7CitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfQXBwbHlSYW5kb21TaWduKGludCBpUmFuZG9tUGhhc2UsIEZJWFBfREJMICpzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlc1BlckZyYW1lKTsKIAorLyogVGltZURvbWFpbkZhZGluZyAqLworc3RhdGljIHZvaWQgQ0NvbmNlYWxtZW50X1RERmFkZVBjbUF0dChpbnQgc3RhcnQsIGludCBsZW4sIEZJWFBfREJMIGZhZGVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZmFkZVN0b3AsIEZJWFBfUENNICpwY21kYXRhKTsKK3N0YXRpYyB2b2lkIENDb25jZWFsbWVudF9UREZhZGVGaWxsRmFkaW5nU3RhdGlvbnMoRklYUF9EQkwgKmZhZGluZ1N0YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZhZGluZ1N0ZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBmYWRlU3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZmFkZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURGZhZGluZ1R5cGUgZmFkaW5nVHlwZSk7CitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfVERGYWRpbmdfZG9MaW5lYXJGYWRpbmdTdGVwcyhpbnQgKmZhZGluZ1N0ZXBzKTsKIAotc3RhdGljIGludCBDQ29uY2VhbG1lbnRfR2V0V2luU2VxKGludCBwcmV2V2luU2VxKQotewotICBpbnQgbmV3V2luU2VxID0gT25seUxvbmdTZXF1ZW5jZTsKKy8qIFN0cmVhbWxpbmUgdGhlIHN0YXRlIG1hY2hpbmUgKi8KK3N0YXRpYyBpbnQgQ0NvbmNlYWxtZW50X0FwcGx5RmFkZU91dCgKKyAgICBpbnQgbW9kZSwgQ0NvbmNlYWxtZW50SW5mbyAqcENvbmNlYWxtZW50SW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOworCitzdGF0aWMgaW50IENDb25jZWFsbWVudF9URE5vaXNlX1JhbmRvbShVTE9ORyAqc2VlZCk7CitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfVEROb2lzZV9BcHBseShDQ29uY2VhbG1lbnRJbmZvICpjb25zdCBwQ29uY2VhbG1lbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxlbiwgRklYUF9QQ00gKmNvbnN0IHBjbWRhdGEpOworCitzdGF0aWMgQkxPQ0tfVFlQRSBDQ29uY2VhbG1lbnRfR2V0V2luU2VxKGludCBwcmV2V2luU2VxKSB7CisgIEJMT0NLX1RZUEUgbmV3V2luU2VxID0gQkxPQ0tfTE9ORzsKIAogICAvKiBUcnkgdG8gaGF2ZSBvbmx5IGxvbmcgYmxvY2tzICovCi0gIGlmICggcHJldldpblNlcSA9PSBMb25nU3RhcnRTZXF1ZW5jZQotICAgIHx8IHByZXZXaW5TZXEgPT0gRWlnaHRTaG9ydFNlcXVlbmNlICkKLSAgewotICAgIG5ld1dpblNlcSA9IExvbmdTdG9wU2VxdWVuY2U7CisgIGlmIChwcmV2V2luU2VxID09IEJMT0NLX1NUQVJUIHx8IHByZXZXaW5TZXEgPT0gQkxPQ0tfU0hPUlQpIHsKKyAgICBuZXdXaW5TZXEgPSBCTE9DS19TVE9QOwogICB9CiAKICAgcmV0dXJuIChuZXdXaW5TZXEpOwogfQogCi0KIC8qIQogICBcYnJpZWYgSW5pdCBjb21tb24gY29uY2VhbG1lbnQgaW5mb3JtYXRpb24gZGF0YQogCi0gIFxwQ29uY2VhbENvbW1vbkRhdGEgUG9pbnRlciB0byB0aGUgY29uY2VhbG1lbnQgY29tbW9uIGRhdGEgc3RydWN0dXJlLgotCi0gIFxyZXR1cm4gIG5vbmUKKyAgXHBhcmFtIHBDb25jZWFsQ29tbW9uRGF0YSBQb2ludGVyIHRvIHRoZSBjb25jZWFsbWVudCBjb21tb24gZGF0YSBzdHJ1Y3R1cmUuCiAqLwotdm9pZAotICBDQ29uY2VhbG1lbnRfSW5pdENvbW1vbkRhdGEgKENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEpCi17Ci0gIGlmIChwQ29uY2VhbENvbW1vbkRhdGEgIT0gTlVMTCkKLSAgewordm9pZCBDQ29uY2VhbG1lbnRfSW5pdENvbW1vbkRhdGEoQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSkgeworICBpZiAocENvbmNlYWxDb21tb25EYXRhICE9IE5VTEwpIHsKICAgICBpbnQgaTsKIAogICAgIC8qIFNldCBkZWZhdWx0IGVycm9yIGNvbmNlYWxtZW50IHRlY2huaXF1ZSAqLwogICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bWV0aG9kID0gQ29uY2VhbE1ldGhvZEludGVyOwogCi0gICAgcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzICAgICA9IENPTkNFQUxfREZMVF9GQURFT1VUX0ZSQU1FUzsKLSAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyAgICAgID0gQ09OQ0VBTF9ERkxUX0ZBREVJTl9GUkFNRVM7CisgICAgcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzID0gQ09OQ0VBTF9ERkxUX0ZBREVPVVRfRlJBTUVTOworICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzID0gQ09OQ0VBTF9ERkxUX0ZBREVJTl9GUkFNRVM7CiAgICAgcENvbmNlYWxDb21tb25EYXRhLT5udW1NdXRlUmVsZWFzZUZyYW1lcyA9IENPTkNFQUxfREZMVF9NVVRFX1JFTEVBU0VfRlJBTUVTOwogCi0gICAgcENvbmNlYWxDb21tb25EYXRhLT5jb21mb3J0Tm9pc2VMZXZlbCAgICA9IENPTkNFQUxfREZMVF9DT01GX05PSVNFX0xFVkVMOworICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+Y29tZm9ydE5vaXNlTGV2ZWwgPQorICAgICAgICAoRklYUF9EQkwpQ09OQ0VBTF9ERkxUX0NPTUZfTk9JU0VfTEVWRUw7CiAKICAgICAvKiBJbml0IGZhZGUgZmFjdG9ycyAoc3ltZXRyaWMpICovCi0gICAgcENvbmNlYWxDb21tb25EYXRhLT5mYWRlT3V0RmFjdG9yWzBdID0gRkwyRlhDT05TVF9TR0woIENPTkNFQUxfREZMVF9GQURFX0ZBQ1RPUiApOwotICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZUluRmFjdG9yWzBdICA9IHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3RvclswXTsKKyAgICBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbMF0gPQorICAgICAgICBGTDJGWENPTlNUX1NHTChDT05DRUFMX0RGTFRfRkFERV9GQUNUT1IpOworICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZUluRmFjdG9yWzBdID0gcENvbmNlYWxDb21tb25EYXRhLT5mYWRlT3V0RmFjdG9yWzBdOwogCiAgICAgZm9yIChpID0gMTsgaSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlM7IGkrKykgewotICAgICAgcENvbmNlYWxDb21tb25EYXRhLT5mYWRlT3V0RmFjdG9yW2ldID0gRlhfREJMMkZYX1NHTChmTXVsdChwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbaS0xXSxGTDJGWENPTlNUX1NHTChDT05DRUFMX0RGTFRfRkFERV9GQUNUT1IpKSk7Ci0gICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVJbkZhY3RvcltpXSAgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbaV07CisgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbaV0gPQorICAgICAgICAgIEZYX0RCTDJGWF9TR0woZk11bHQocENvbmNlYWxDb21tb25EYXRhLT5mYWRlT3V0RmFjdG9yW2kgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKENPTkNFQUxfREZMVF9GQURFX0ZBQ1RPUikpKTsKKyAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZUluRmFjdG9yW2ldID0KKyAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbaV07CiAgICAgfQogICB9CiB9CiAKLQotCiAvKiEKICAgXGJyaWVmIEdldCBjdXJyZW50IGNvbmNlYWxtZW50IG1ldGhvZC4KIAotICBccENvbmNlYWxDb21tb25EYXRhIFBvaW50ZXIgdG8gY29tbW9uIGNvbmNlYWxtZW50IGRhdGEgKGZvciBhbGwgY2hhbm5lbHMpCi0KLSAgXHJldHVybiBDb25jZWFsbWVudCBtZXRob2QuCisgIFxwYXJhbSBwQ29uY2VhbENvbW1vbkRhdGEgUG9pbnRlciB0byBjb21tb24gY29uY2VhbG1lbnQgZGF0YSAoZm9yIGFsbAorICBjaGFubmVscykKICovCi1DQ29uY2VhbG1lbnRNZXRob2QKLSAgQ0NvbmNlYWxtZW50X0dldE1ldGhvZCggQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSApCi17CitDQ29uY2VhbG1lbnRNZXRob2QgQ0NvbmNlYWxtZW50X0dldE1ldGhvZChDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhKSB7CiAgIENDb25jZWFsbWVudE1ldGhvZCBtZXRob2QgPSBDb25jZWFsTWV0aG9kTm9uZTsKIAogICBpZiAocENvbmNlYWxDb21tb25EYXRhICE9IE5VTEwpIHsKQEAgLTMwNyw5NSArMzA1LDk1IEBACiAgIHJldHVybiAobWV0aG9kKTsKIH0KIAotCiAvKiEKICAgXGJyaWVmIEluaXQgY29uY2VhbG1lbnQgaW5mb3JtYXRpb24gZm9yIGVhY2ggY2hhbm5lbAogCi0gIFRoZSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgY29uY2VhbG1lbnQgaW5mb3JtYXRpb24uIFR3byBtZXRob2RzIGNhbiBiZSBjaG9zZW46Ci0gICAgICAgICAgICAgMCA9IGludGVycG9sYXRpb24gbWV0aG9kIChhZGRzIGRlbGF5KQotICAgICAgICAgICAgIDEgPSBub2lzZSBzdWJzdGl0dXRpb24gKG5vIGRlbGF5LCBsb3cgY29tcGxleGl0eSkKLQotICBccmV0dXJuICBub25lCisgIFxwYXJhbSBwQ29uY2VhbENoYW5uZWxJbmZvIFBvaW50ZXIgdG8gdGhlIGNoYW5uZWwgcmVsYXRlZCBjb25jZWFsbWVudCBpbmZvCisgIHN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZC4gXHBhcmFtIHBDb25jZWFsQ29tbW9uRGF0YSAgUG9pbnRlciB0byBjb21tb24KKyAgY29uY2VhbG1lbnQgZGF0YSAoZm9yIGFsbCBjaGFubmVscykgXHBhcmFtIGluaXRSZW5kZXJNb2RlICAgICAgSW5pdGlhbCByZW5kZXIKKyAgbW9kZSB0byBiZSBzZXQgZm9yIHRoZSBjdXJyZW50IGNoYW5uZWwuIFxwYXJhbSBzYW1wbGVzUGVyRnJhbWUgICAgIFRoZSBudW1iZXIKKyAgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuCiAqLwotdm9pZAotICBDQ29uY2VhbG1lbnRfSW5pdENoYW5uZWxEYXRhICgKLSAgICBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbENoYW5uZWxJbmZvLAotICAgIENDb25jZWFsUGFyYW1zICAgKnBDb25jZWFsQ29tbW9uRGF0YSwKLSAgICBpbnQgc2FtcGxlc1BlckZyYW1lICkKLXsKK3ZvaWQgQ0NvbmNlYWxtZW50X0luaXRDaGFubmVsRGF0YShDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbENoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX1JFTkRFUl9NT0RFIGluaXRSZW5kZXJNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzUGVyRnJhbWUpIHsKICAgaW50IGk7CisgIHBDb25jZWFsQ2hhbm5lbEluZm8tPlRETm9pc2VTZWVkID0gMDsKKyAgRkRLbWVtY2xlYXIocENvbmNlYWxDaGFubmVsSW5mby0+VEROb2lzZVN0YXRlcywKKyAgICAgICAgICAgICAgc2l6ZW9mKHBDb25jZWFsQ2hhbm5lbEluZm8tPlRETm9pc2VTdGF0ZXMpKTsKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+VEROb2lzZUNvZWZbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjA1Zik7CisgIHBDb25jZWFsQ2hhbm5lbEluZm8tPlRETm9pc2VDb2VmWzFdID0gRkwyRlhDT05TVF9TR0woMC41Zik7CisgIHBDb25jZWFsQ2hhbm5lbEluZm8tPlRETm9pc2VDb2VmWzJdID0gRkwyRlhDT05TVF9TR0woMC40NWYpOwogCiAgIHBDb25jZWFsQ2hhbm5lbEluZm8tPnBDb25jZWFsUGFyYW1zID0gcENvbmNlYWxDb21tb25EYXRhOwogCi0gIEZES21lbWNsZWFyKHBDb25jZWFsQ2hhbm5lbEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsIDEwMjQgKiBzaXplb2YoRklYUF9DTkNMKSk7CisgIHBDb25jZWFsQ2hhbm5lbEluZm8tPmxhc3RSZW5kZXJNb2RlID0gaW5pdFJlbmRlck1vZGU7CisKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+d2luZG93U2hhcGUgPSBDT05DRUFMX05PVF9ERUZJTkVEOworICBwQ29uY2VhbENoYW5uZWxJbmZvLT53aW5kb3dTZXF1ZW5jZSA9IEJMT0NLX0xPTkc7IC8qIGRlZmF1bHQgdHlwZSAqLworICBwQ29uY2VhbENoYW5uZWxJbmZvLT5sYXN0V2luR3JwTGVuID0gMTsKKworICBwQ29uY2VhbENoYW5uZWxJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7CisKKyAgRkRLbWVtY2xlYXIocENvbmNlYWxDaGFubmVsSW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgMTAyNCAqIHNpemVvZihGSVhQX0NOQ0wpKTsKIAogICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgcENvbmNlYWxDaGFubmVsSW5mby0+c3BlY1NjYWxlW2ldID0gMDsKICAgfQogCi0gIHBDb25jZWFsQ2hhbm5lbEluZm8tPmlSYW5kb21QaGFzZSAgID0gMDsKLQotICBwQ29uY2VhbENoYW5uZWxJbmZvLT53aW5kb3dTZXF1ZW5jZSA9IDA7Ci0gIHBDb25jZWFsQ2hhbm5lbEluZm8tPndpbmRvd1NoYXBlICAgID0gMDsKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+aVJhbmRvbVBoYXNlID0gMDsKIAogICBwQ29uY2VhbENoYW5uZWxJbmZvLT5wcmV2RnJhbWVPa1swXSA9IDE7CiAgIHBDb25jZWFsQ2hhbm5lbEluZm8tPnByZXZGcmFtZU9rWzFdID0gMTsKIAotICBwQ29uY2VhbENoYW5uZWxJbmZvLT5jbnRGYWRlRnJhbWVzICA9IDA7CisgIHBDb25jZWFsQ2hhbm5lbEluZm8tPmNudEZhZGVGcmFtZXMgPSAwOwogICBwQ29uY2VhbENoYW5uZWxJbmZvLT5jbnRWYWxpZEZyYW1lcyA9IDA7Ci0KLSAgcENvbmNlYWxDaGFubmVsSW5mby0+Y29uY2VhbFN0YXRlICAgPSBDb25jZWFsU3RhdGVfT2s7Ci0KKyAgcENvbmNlYWxDaGFubmVsSW5mby0+ZmFkZV9vbGQgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+d2luR3JwT2Zmc2V0WzBdID0gMDsKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+d2luR3JwT2Zmc2V0WzFdID0gMDsKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+YXR0R3JwT2Zmc2V0WzBdID0gMDsKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+YXR0R3JwT2Zmc2V0WzFdID0gMDsKIH0KIAotCiAvKiEKICAgXGJyaWVmIFNldCBlcnJvciBjb25jZWFsbWVudCBwYXJhbWV0ZXJzCiAKLSAgXGNvbmNlYWxQYXJhbXMKLSAgXG1ldGhvZAotICBcZmFkZU91dFNsb3BlCi0gIFxmYWRlSW5TbG9wZQotICBcbXV0ZVJlbGVhc2UKLSAgXGNvbWZOb2lzZUxldmVsCi0KLSAgXHJldHVybiAgbm9uZQorICBccGFyYW0gY29uY2VhbFBhcmFtcworICBccGFyYW0gbWV0aG9kCisgIFxwYXJhbSBmYWRlT3V0U2xvcGUKKyAgXHBhcmFtIGZhZGVJblNsb3BlCisgIFxwYXJhbSBtdXRlUmVsZWFzZQorICBccGFyYW0gY29tZk5vaXNlTGV2ZWwKICovCiBBQUNfREVDT0RFUl9FUlJPUgotICBDQ29uY2VhbG1lbnRfU2V0UGFyYW1zICgKLSAgICBDQ29uY2VhbFBhcmFtcyAqY29uY2VhbFBhcmFtcywKLSAgICBpbnQgIG1ldGhvZCwKLSAgICBpbnQgIGZhZGVPdXRTbG9wZSwKLSAgICBpbnQgIGZhZGVJblNsb3BlLAotICAgIGludCAgbXV0ZVJlbGVhc2UsCi0gICAgaW50ICBjb21mTm9pc2VMZXZlbCApCi17CitDQ29uY2VhbG1lbnRfU2V0UGFyYW1zKENDb25jZWFsUGFyYW1zICpjb25jZWFsUGFyYW1zLCBpbnQgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmFkZU91dFNsb3BlLCBpbnQgZmFkZUluU2xvcGUsIGludCBtdXRlUmVsZWFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgY29tZk5vaXNlTGV2ZWwpIHsKICAgLyogc2V0IGNvbmNlYWxtZW50IHRlY2huaXF1ZSAqLwogICBpZiAobWV0aG9kICE9IEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQpIHsKLSAgICBzd2l0Y2ggKChDQ29uY2VhbG1lbnRNZXRob2QpbWV0aG9kKQotICAgIHsKLSAgICBjYXNlIENvbmNlYWxNZXRob2RNdXRlOgotICAgIGNhc2UgQ29uY2VhbE1ldGhvZE5vaXNlOgotICAgIGNhc2UgQ29uY2VhbE1ldGhvZEludGVyOgotICAgICAgLyogQmUgc3VyZSB0byBlbmFibGUgZGVsYXkgYWRqdXN0bWVudCBvZiBTQlIgZGVjb2RlciEgKi8KLSAgICAgIGlmIChjb25jZWFsUGFyYW1zID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBzZXQgcGFyYW0gKi8KLSAgICAgICAgY29uY2VhbFBhcmFtcy0+bWV0aG9kID0gKENDb25jZWFsbWVudE1ldGhvZCltZXRob2Q7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKyAgICBzd2l0Y2ggKChDQ29uY2VhbG1lbnRNZXRob2QpbWV0aG9kKSB7CisgICAgICBjYXNlIENvbmNlYWxNZXRob2RNdXRlOgorICAgICAgY2FzZSBDb25jZWFsTWV0aG9kTm9pc2U6CisgICAgICBjYXNlIENvbmNlYWxNZXRob2RJbnRlcjoKKyAgICAgICAgLyogQmUgc3VyZSB0byBlbmFibGUgZGVsYXkgYWRqdXN0bWVudCBvZiBTQlIgZGVjb2RlciEgKi8KKyAgICAgICAgaWYgKGNvbmNlYWxQYXJhbXMgPT0gTlVMTCkgeworICAgICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIHNldCBwYXJhbSAqLworICAgICAgICAgIGNvbmNlYWxQYXJhbXMtPm1ldGhvZCA9IChDQ29uY2VhbG1lbnRNZXRob2QpbWV0aG9kOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICAgfQogICB9CiAKICAgLyogc2V0IG51bWJlciBvZiBmcmFtZXMgZm9yIGZhZGUtb3V0IHNsb3BlICovCiAgIGlmIChmYWRlT3V0U2xvcGUgIT0gQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCkgewotICAgIGlmICggKGZhZGVPdXRTbG9wZSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMpCi0gICAgICAmJiAoZmFkZU91dFNsb3BlID49IDApICkKLSAgICB7CisgICAgaWYgKChmYWRlT3V0U2xvcGUgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTKSAmJiAoZmFkZU91dFNsb3BlID49IDApKSB7CiAgICAgICBpZiAoY29uY2VhbFBhcmFtcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgICAgfSBlbHNlIHsKQEAgLTQwOSw5ICs0MDcsNyBAQAogCiAgIC8qIHNldCBudW1iZXIgb2YgZnJhbWVzIGZvciBmYWRlLWluIHNsb3BlICovCiAgIGlmIChmYWRlSW5TbG9wZSAhPSBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVEKSB7Ci0gICAgaWYgKCAoZmFkZUluU2xvcGUgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTKQotICAgICAgJiYgKGZhZGVJblNsb3BlID49IDEpICkKLSAgICB7CisgICAgaWYgKChmYWRlSW5TbG9wZSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMpICYmIChmYWRlSW5TbG9wZSA+PSAwKSkgewogICAgICAgaWYgKGNvbmNlYWxQYXJhbXMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKICAgICAgIH0gZWxzZSB7CkBAIC00MjUsOSArNDIxLDggQEAKIAogICAvKiBzZXQgbnVtYmVyIG9mIGVycm9yLWZyZWUgZnJhbWVzIGFmdGVyIHdoaWNoIHRoZSBtdXRpbmcgd2lsbCBiZSByZWxlYXNlZCAqLwogICBpZiAobXV0ZVJlbGVhc2UgIT0gQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCkgewotICAgIGlmICggKG11dGVSZWxlYXNlIDwgKENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlM8PDEpKQotICAgICAgJiYgKG11dGVSZWxlYXNlID49IDApICkKLSAgICB7CisgICAgaWYgKChtdXRlUmVsZWFzZSA8IChDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTIDw8IDEpKSAmJgorICAgICAgICAobXV0ZVJlbGVhc2UgPj0gMCkpIHsKICAgICAgIGlmIChjb25jZWFsUGFyYW1zID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICAgICB9IGVsc2UgewpAQCAtNDQwLDUwICs0MzUsNDYgQEAKICAgfQogCiAgIC8qIHNldCBjb25mb3J0IG5vaXNlIGxldmVsIHdoaWNoIHdpbGwgYmUgaW5zZXJ0ZWQgd2hpbGUgaW4gc3RhdGUgJ211dGluZycgKi8KLSAgaWYgKGNvbWZOb2lzZUxldmVsICE9IEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQpIHsKLSAgICBpZiAoIChjb21mTm9pc2VMZXZlbCA8IC0xKQotICAgICAgfHwgKGNvbWZOb2lzZUxldmVsID4gMTI3KSApIHsKKyAgaWYgKGNvbWZOb2lzZUxldmVsICE9IChGSVhQX0RCTClBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVEKSB7CisgICAgaWYgKChjb21mTm9pc2VMZXZlbCA8IChGSVhQX0RCTCkwKSB8fAorICAgICAgICAoY29tZk5vaXNlTGV2ZWwgPiAoRklYUF9EQkwpTUFYVkFMX0RCTCkpIHsKICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgIH0KICAgICBpZiAoY29uY2VhbFBhcmFtcyA9PSBOVUxMKSB7CiAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKICAgICB9IGVsc2UgewotICAgICAgY29uY2VhbFBhcmFtcy0+Y29tZm9ydE5vaXNlTGV2ZWwgPSBjb21mTm9pc2VMZXZlbDsKKyAgICAgIGNvbmNlYWxQYXJhbXMtPmNvbWZvcnROb2lzZUxldmVsID0gKEZJWFBfREJMKWNvbWZOb2lzZUxldmVsOwogICAgIH0KICAgfQogCiAgIHJldHVybiAoQUFDX0RFQ19PSyk7CiB9CiAKLQogLyohCiAgIFxicmllZiBTZXQgZmFkZS1vdXQvaW4gYXR0ZW51YXRpb24gZmFjdG9yIHZlY3RvcnMKIAotICBcY29uY2VhbFBhcmFtcwotICBcZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yCi0gIFxmYWRlSW5BdHRlbnVhdGlvblZlY3RvcgorICBccGFyYW0gY29uY2VhbFBhcmFtcworICBccGFyYW0gZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yCisgIFxwYXJhbSBmYWRlSW5BdHRlbnVhdGlvblZlY3RvcgogCiAgIFxyZXR1cm4gMCBpZiBPSyBhbGwgb3RoZXIgdmFsdWVzIGluZGljYXRlIGVycm9ycwogKi8KIEFBQ19ERUNPREVSX0VSUk9SCi0gIENDb25jZWFsbWVudF9TZXRBdHRlbnVhdGlvbiAoCi0gICAgQ0NvbmNlYWxQYXJhbXMgKmNvbmNlYWxQYXJhbXMsCi0gICAgU0hPUlQgKmZhZGVPdXRBdHRlbnVhdGlvblZlY3RvciwKLSAgICBTSE9SVCAqZmFkZUluQXR0ZW51YXRpb25WZWN0b3IgKQotewotICBpZiAoIChmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3IgPT0gTlVMTCkKLSAgICAmJiAoZmFkZUluQXR0ZW51YXRpb25WZWN0b3IgID09IE5VTEwpICkgeworQ0NvbmNlYWxtZW50X1NldEF0dGVudWF0aW9uKENDb25jZWFsUGFyYW1zICpjb25jZWFsUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKmZhZGVJbkF0dGVudWF0aW9uVmVjdG9yKSB7CisgIGlmICgoZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yID09IE5VTEwpICYmIChmYWRlSW5BdHRlbnVhdGlvblZlY3RvciA9PSBOVUxMKSkgewogICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICB9CiAKICAgLyogRmFkZS1vdXQgZmFjdG9ycyAqLwotICBpZiAoZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yICE9IE5VTEwpCi0gIHsKKyAgaWYgKGZhZGVPdXRBdHRlbnVhdGlvblZlY3RvciAhPSBOVUxMKSB7CiAgICAgaW50IGk7CiAKICAgICAvKiBjaGVjayBxdWFudGl6ZWQgZmFjdG9ycyBmaXJzdCAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTOyBpKyspIHsKLSAgICAgIGlmICgoZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yW2ldIDwgMCkgfHwgKGZhZGVPdXRBdHRlbnVhdGlvblZlY3RvcltpXSA+IENPTkNFQUxfTUFYX1FVQU5UX0ZBQ1RPUikpIHsKKyAgICAgIGlmICgoZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yW2ldIDwgMCkgfHwKKyAgICAgICAgICAoZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yW2ldID4gQ09OQ0VBTF9NQVhfUVVBTlRfRkFDVE9SKSkgewogICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgICAgIH0KICAgICB9CkBAIC00OTIsMjYgKzQ4MywyNCBAQAogICAgIH0KIAogICAgIC8qIG5vdyBkZXF1YW50aXplIGZhY3RvcnMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUzsgaSsrKSAKLSAgICB7CisgICAgZm9yIChpID0gMDsgaSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlM7IGkrKykgewogICAgICAgY29uY2VhbFBhcmFtcy0+ZmFkZU91dEZhY3RvcltpXSA9Ci0gICAgICAgIEZYX0RCTDJGWF9TR0woIGZMZFBvdyggICAgQ09OQ0VBTF9NSU5fQVRURU5VQVRJT05fRkFDVE9SXzAyNV9MRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoKElOVCkoRkwyRlhDT05TVF9EQkwoMS4wLzIuMCk+PihDT05DRUFMX1BBUkFNRVRFUl9CSVRTLTEpKSAqIChJTlQpZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yW2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05DRUFMX1BBUkFNRVRFUl9CSVRTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICBGWF9EQkwyRlhfU0dMKGZMZFBvdyhDT05DRUFMX01JTl9BVFRFTlVBVElPTl9GQUNUT1JfMDI1X0xELCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoKElOVCkoRkwyRlhDT05TVF9EQkwoMS4wIC8gMi4wKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENPTkNFQUxfUEFSQU1FVEVSX0JJVFMgLSAxKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVClmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3JbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTkNFQUxfUEFSQU1FVEVSX0JJVFMpKTsKICAgICB9CiAgIH0KIAogICAvKiBGYWRlLWluIGZhY3RvcnMgKi8KLSAgaWYgKGZhZGVJbkF0dGVudWF0aW9uVmVjdG9yICE9IE5VTEwpCi0gIHsKKyAgaWYgKGZhZGVJbkF0dGVudWF0aW9uVmVjdG9yICE9IE5VTEwpIHsKICAgICBpbnQgaTsKIAogICAgIC8qIGNoZWNrIHF1YW50aXplZCBmYWN0b3JzIGZpcnN0ICovCiAgICAgZm9yIChpID0gMDsgaSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlM7IGkrKykgewotICAgICAgaWYgKChmYWRlSW5BdHRlbnVhdGlvblZlY3RvcltpXSA8IDApIHx8IChmYWRlSW5BdHRlbnVhdGlvblZlY3RvcltpXSA+IENPTkNFQUxfTUFYX1FVQU5UX0ZBQ1RPUikpIHsKKyAgICAgIGlmICgoZmFkZUluQXR0ZW51YXRpb25WZWN0b3JbaV0gPCAwKSB8fAorICAgICAgICAgIChmYWRlSW5BdHRlbnVhdGlvblZlY3RvcltpXSA+IENPTkNFQUxfTUFYX1FVQU5UX0ZBQ1RPUikpIHsKICAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICAgICB9CiAgICAgfQpAQCAtNTIwLDM0ICs1MDksMjYgQEAKICAgICB9CiAKICAgICAvKiBub3cgZGVxdWFudGl6ZSBmYWN0b3JzICovCi0gICAgZm9yIChpID0gMDsgaSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlM7IGkrKykKLSAgICB7Ci0gICAgICBjb25jZWFsUGFyYW1zLT5mYWRlSW5GYWN0b3JbaV0gPQotICAgICAgICBGWF9EQkwyRlhfU0dMKCBmTGRQb3coIENPTkNFQUxfTUlOX0FUVEVOVUFUSU9OX0ZBQ1RPUl8wMjVfTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgoSU5UKShGSVhQX09ORT4+Q09OQ0VBTF9QQVJBTUVURVJfQklUUykgKiAoSU5UKWZhZGVJbkF0dGVudWF0aW9uVmVjdG9yW2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OQ0VBTF9QQVJBTUVURVJfQklUUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICApOworICAgIGZvciAoaSA9IDA7IGkgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTOyBpKyspIHsKKyAgICAgIGNvbmNlYWxQYXJhbXMtPmZhZGVJbkZhY3RvcltpXSA9IEZYX0RCTDJGWF9TR0woCisgICAgICAgICAgZkxkUG93KENPTkNFQUxfTUlOX0FUVEVOVUFUSU9OX0ZBQ1RPUl8wMjVfTEQsIDAsCisgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoKElOVCkoRklYUF9PTkUgPj4gQ09OQ0VBTF9QQVJBTUVURVJfQklUUykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpZmFkZUluQXR0ZW51YXRpb25WZWN0b3JbaV0pLAorICAgICAgICAgICAgICAgICBDT05DRUFMX1BBUkFNRVRFUl9CSVRTKSk7CiAgICAgfQogICB9CiAKICAgcmV0dXJuIChBQUNfREVDX09LKTsKIH0KIAotCiAvKiEKICAgXGJyaWVmIEdldCBzdGF0ZSBvZiBjb25jZWFsbWVudCBtb2R1bGUuCiAKLSAgXHBDb25jZWFsQ2hhbm5lbEluZm8KKyAgXHBhcmFtIHBDb25jZWFsQ2hhbm5lbEluZm8KIAogICBccmV0dXJuIENvbmNlYWxtZW50IHN0YXRlLgogKi8KLUNDb25jZWFsbWVudFN0YXRlCi0gIENDb25jZWFsbWVudF9HZXRTdGF0ZSAoCi0gICAgQ0NvbmNlYWxtZW50SW5mbyAqcENvbmNlYWxDaGFubmVsSW5mbwotICApCi17CitDQ29uY2VhbG1lbnRTdGF0ZSBDQ29uY2VhbG1lbnRfR2V0U3RhdGUoQ0NvbmNlYWxtZW50SW5mbyAqcENvbmNlYWxDaGFubmVsSW5mbykgewogICBDQ29uY2VhbG1lbnRTdGF0ZSBzdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKIAogICBpZiAocENvbmNlYWxDaGFubmVsSW5mbyAhPSBOVUxMKSB7CkBAIC01NTcsMjU0ICs1MzgsMjQ3IEBACiAgIHJldHVybiAoc3RhdGUpOwogfQogCi0KLXN0YXRpYyB2b2lkIENDb25jZWFsbWVudF9mYWtlUG5zRGF0YSAoCi0gICBDUG5zRGF0YSAqcFBuc0RhdGEsCi0gICBDSWNzSW5mbyAqcEljc0luZm8sCi0gICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgIFNIT1JUICpwU3BlY1NjYWxlLAotICAgU0hPUlQgKnBTY2FsZUZhY3RvciwKLSAgIGNvbnN0IGludCBsZXZlbCApCi17Ci0gIENQbnNJbnRlckNoYW5uZWxEYXRhICpwSW50ZXJDaGFubmVsRGF0YSA9IHBQbnNEYXRhLT5wUG5zSW50ZXJDaGFubmVsRGF0YTsKLQotICBpbnQgIHBuc0JhbmQsIGJhbmQsIGdyb3VwLCB3aW47Ci0gIC8vaW50ICBkZWx0YSA9IDA7Ci0gIGludCAgd2luZG93c1BlckZyYW1lID0gR2V0V2luZG93c1BlckZyYW1lKHBJY3NJbmZvKTsKLSAgaW50ICByZWZMZXZlbCA9ICh3aW5kb3dzUGVyRnJhbWUgPiAxKSA/IDgyIDogOTE7Ci0KLSAgRkRLX0FTU0VSVChsZXZlbCA+PSAwICYmIGxldmVsIDw9IDEyNyk7Ci0KLSAgZm9yICh3aW4gPSAwOyB3aW4gPCB3aW5kb3dzUGVyRnJhbWU7IHdpbisrKSB7Ci0gICAgcFNwZWNTY2FsZVt3aW5dID0gMzE7Ci0gIH0KLQotICAvKiBmYWtlIElDUyBpbmZvIGlmIG5lY2Vzc2FyeSAqLwotICBpZiAoIUlzVmFsaWQocEljc0luZm8pKSB7Ci0gICAgcEljc0luZm8tPldpbmRvd0dyb3VwcyA9IDE7Ci0gICAgaWYgKElzTG9uZ0Jsb2NrKHBJY3NJbmZvKSkgewotICAgICAgcEljc0luZm8tPlRvdGFsU2ZCYW5kcyA9IHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKLSAgICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cExlbmd0aFswXSA9IDE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcEljc0luZm8tPlRvdGFsU2ZCYW5kcyA9IHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7Ci0gICAgICBwSWNzSW5mby0+V2luZG93R3JvdXBMZW5ndGhbMF0gPSA4OwotICAgIH0KLSAgICBwSWNzSW5mby0+TWF4U2ZCYW5kcyA9IHBJY3NJbmZvLT5Ub3RhbFNmQmFuZHM7Ci0gIH0KLQotICAvKiBnbG9iYWwgYWN0aXZhdGUgUE5TICovCi0gIHBQbnNEYXRhLT5QbnNBY3RpdmUgPSAxOwotICAvKiBzZXQgZW5lcmd5IGxldmVsICovCi0gIHBQbnNEYXRhLT5DdXJyZW50RW5lcmd5ID0gZml4TWF4KCAwLCByZWZMZXZlbCAtIGxldmVsICk7Ci0KLSAgLyoKLSAgICB2YWx1ZTogfCBBdmcuIFJNUyBwb3dlciB8IEF2Zy4gUk1TIHBvd2VyIHwKLSAgICAgICAgICAgfCBzcGVjU2NhbGUgPSAyMiB8IHNwZWNTY2FsZSA9IDMxIHwKLSAgICAtLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAgNSAgfCAgICAgICAgICAgICAgICB8ICAtOTkuMCBkQgotICAgICAgIDE1ICB8ICAgICAgICAgICAgICAgIHwgIC05MC4wIGRCCi0gICAgICAgMjUgIHwgICAgICAgICAgICAgICAgfCAgLTg5LjcgZEIgCi0gICAgICAgMzUgIHwgICAgICAgICAgICAgICAgfCAgLTg1LjMgZEIKLSAgICAgIC4uLiAgfCAgICAuLi4gICAgICAgICB8ICAgLi4uCi0gICAgICAgNDUgIHwgIC02OS45IGRCICAgICAgfCAgLTcwLjAgZEIKLSAgICAgICA1MCAgfCAgLTYyLjIgZEIgICAgICB8ICAKLSAgICAgICA1NSAgfCAgLTU1LjYgZEIgICAgICB8ICAtNTQuNiBkQgotICAgICAgIDYwICB8ICAtNDcuMCBkQiAgICAgIHwKLSAgICAgICA2NSAgfCAgLTM5LjUgZEIgICAgICB8ICAtMzkuNSBkQgotICAgICAgIDcwICB8ICAtMzEuOSBkQiAgICAgIHwgIAotICAgICAgIDc1ICB8ICAtMjQuNCBkQiAgICAgIHwgIC0yNC40IGRCCi0gICAgICAgODAgIHwgIC0xNi45IGRCICAgICAgfCAgCi0gICAgICAgODUgIHwgICAtOS40IGRCIChjKSAgfCAgIC05LjQgZEIKLSAgICAgICA5MCAgfCAgIC0zLjkgZEIgKGMpICB8ICAKLSAgICAgICA5NSAgfCAgICAgICAgICAgICAgICB8ICAgLTIuMSBkQgotICAgICAgMTAwICB8ICAgICAgICAgICAgICAgIHwgICAtMS42IGRCCi0gICAgICAxMDUgIHwgICAgICAgICAgICAgICAgfCAgIC0xLjQgZEIKLSAgKi8KLQotICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgR2V0V2luZG93R3JvdXBzKHBJY3NJbmZvKTsgZ3JvdXArKykKLSAgewotICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKHBJY3NJbmZvKTsgYmFuZCsrKQotICAgIHsKLSAgICAgIHBuc0JhbmQgPSBncm91cCAqIDE2ICsgYmFuZDsKLQotICAgICAgaWYgKHBuc0JhbmQgPj0gTk9fT0ZCQU5EUykgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAvL3BQbnNEYXRhLT5DdXJyZW50RW5lcmd5ICs9IGRlbHRhIDsKLSAgICAgIHBTY2FsZUZhY3RvcltwbnNCYW5kXSA9IHBQbnNEYXRhLT5DdXJyZW50RW5lcmd5OwotICAgICAgcEludGVyQ2hhbm5lbERhdGEtPmNvcnJlbGF0ZWRbcG5zQmFuZF0gPSAwOwotICAgICAgcFBuc0RhdGEtPnBuc1VzZWRbcG5zQmFuZF0gPSAxOwotICAgIH0KLSAgfQotfQotCi0KIC8qIQogICBcYnJpZWYgU3RvcmUgZGF0YSBmb3IgY29uY2VhbG1lbnQgdGVjaG5pcXVlcyBhcHBsaWVkIGxhdGVyCiAKICAgSW50ZXJmYWNlIGZ1bmN0aW9uIHRvIHN0b3JlIGRhdGEgZm9yIGRpZmZlcmVudCBjb25jZWFsbWVudCBzdHJhdGVnaWVzCi0KLSAgIFxyZXR1cm4gIG5vbmUKICAqLwotdm9pZAotICBDQ29uY2VhbG1lbnRfU3RvcmUgKAordm9pZCBDQ29uY2VhbG1lbnRfU3RvcmUoCiAgICAgQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKQotewotICBpZiAoICEocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZSA9PSBBQUNERUNfUkVOREVSX0xQRAotICAgICAgKSApCi0gIHsKLSAgICBGSVhQX0RCTCAqcFNwZWN0cmFsQ29lZmZpY2llbnQgPSAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KTsKLSAgICBTSE9SVCAgICAqcFNwZWNTY2FsZSAgICAgICAgICAgPSAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlOwotICAgIENJY3NJbmZvICpwSWNzSW5mbyAgICAgICAgICAgICA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvOworICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pIHsKKyAgVUNIQVIgbmJEaXYgPSBOQl9ESVY7CiAKLSAgICBTSE9SVCAgdFNwZWNTY2FsZVs4XTsKLSAgICBVQ0hBUiAgdFdpbmRvd1NoYXBlLCB0V2luZG93U2VxdWVuY2U7CisgIGlmICghKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9MUEQgJiYKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLm1vZFtuYkRpdiAtIDFdID09IDApKQorCisgIHsKKyAgICBGSVhQX0RCTCAqcFNwZWN0cmFsQ29lZmZpY2llbnQgPQorICAgICAgICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpOworICAgIFNIT1JUICpwU3BlY1NjYWxlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlOworICAgIENJY3NJbmZvICpwSWNzSW5mbyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvOworCisgICAgU0hPUlQgdFNwZWNTY2FsZVs4XTsKKyAgICBVQ0hBUiB0V2luZG93U2hhcGU7CisgICAgQkxPQ0tfVFlQRSB0V2luZG93U2VxdWVuY2U7CiAKICAgICAvKiBzdG9yZSBvbGQgd2luZG93IGluZm9zIGZvciBzd2FwcGluZyAqLwogICAgIHRXaW5kb3dTZXF1ZW5jZSA9IGhDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlOwotICAgIHRXaW5kb3dTaGFwZSAgICA9IGhDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOworICAgIHRXaW5kb3dTaGFwZSA9IGhDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOwogCiAgICAgLyogc3RvcmUgb2xkIHNjYWxlIGZhY3RvcnMgZm9yIHN3YXBwaW5nICovCi0gICAgRkRLbWVtY3B5KHRTcGVjU2NhbGUsIGhDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZSwgOCpzaXplb2YoU0hPUlQpKTsKKyAgICBGREttZW1jcHkodFNwZWNTY2FsZSwgaENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlLCA4ICogc2l6ZW9mKFNIT1JUKSk7CiAKICAgICAvKiBzdG9yZSBuZXcgd2luZG93IGluZm9zICovCiAgICAgaENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPSBHZXRXaW5kb3dTZXF1ZW5jZShwSWNzSW5mbyk7Ci0gICAgaENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGUgICAgPSBHZXRXaW5kb3dTaGFwZShwSWNzSW5mbyk7Ci0gICAgaENvbmNlYWxtZW50SW5mby0+bGFzdFdpbkdycExlbiAgPSAqKEdldFdpbmRvd0dyb3VwTGVuZ3RoVGFibGUocEljc0luZm8pK0dldFdpbmRvd0dyb3VwcyhwSWNzSW5mbyktMSk7CisgICAgaENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGUgPSBHZXRXaW5kb3dTaGFwZShwSWNzSW5mbyk7CisgICAgaENvbmNlYWxtZW50SW5mby0+bGFzdFdpbkdycExlbiA9CisgICAgICAgICooR2V0V2luZG93R3JvdXBMZW5ndGhUYWJsZShwSWNzSW5mbykgKyBHZXRXaW5kb3dHcm91cHMocEljc0luZm8pIC0gMSk7CiAKICAgICAvKiBzdG9yZSBuZXcgc2NhbGUgZmFjdG9ycyAqLwotICAgIEZES21lbWNweShoQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGUsIHBTcGVjU2NhbGUsIDgqc2l6ZW9mKFNIT1JUKSk7CisgICAgRkRLbWVtY3B5KGhDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZSwgcFNwZWNTY2FsZSwgOCAqIHNpemVvZihTSE9SVCkpOwogCi0gICAgaWYgKENDb25jZWFsbWVudF9HZXREZWxheShoQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcykgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBzdG9yZSBuZXcgc3BlY3RyYWwgYmlucyAqLworICAgIGlmIChoQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcy0+bWV0aG9kIDwgQ29uY2VhbE1ldGhvZEludGVyKSB7CisgICAgLyogc3RvcmUgbmV3IHNwZWN0cmFsIGJpbnMgKi8KICNpZiAoQ05DTF9GUkFDVF9CSVRTID09IERGUkFDVF9CSVRTKQotICAgICAgRkRLbWVtY3B5KGhDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsIHBTcGVjdHJhbENvZWZmaWNpZW50LCAxMDI0ICogc2l6ZW9mKEZJWFBfQ05DTCkpOworICAgICAgRkRLbWVtY3B5KGhDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsIHBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgICAgIDEwMjQgKiBzaXplb2YoRklYUF9DTkNMKSk7CiAjZWxzZQotICAgICAgRklYUF9DTkNMICpSRVNUUklDVCBwQ25jbCA9ICZoQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50WzEwMjQtMV07Ci0gICAgICBGSVhQX0RCTCAgKlJFU1RSSUNUIHBTcGVjID0gJnBTcGVjdHJhbENvZWZmaWNpZW50WzEwMjQtMV07CisgICAgICBGSVhQX0NOQ0wgKlJFU1RSSUNUIHBDbmNsID0KKyAgICAgICAgICAmaENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFsxMDI0IC0gMV07CisgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFNwZWMgPSAmcFNwZWN0cmFsQ29lZmZpY2llbnRbMTAyNCAtIDFdOwogICAgICAgaW50IGk7Ci0KICAgICAgIGZvciAoaSA9IDEwMjQ7IGkgIT0gMDsgaS0tKSB7CiAgICAgICAgICpwQ25jbC0tID0gRlhfREJMMkZYX0NOQ0woKnBTcGVjLS0pOwogICAgICAgfQogI2VuZGlmCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGSVhQX0NOQ0wgKlJFU1RSSUNUIHBDbmNsID0gJmhDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnRbMTAyNC0xXTsKLSAgICAgIEZJWFBfREJMICAqUkVTVFJJQ1QgcFNwZWMgPSAmcFNwZWN0cmFsQ29lZmZpY2llbnRbMTAyNC0xXTsKLSAgICAgIGludCBpOworICAgIH0gZWxzZSB7CisgICAgLyogc3dhcCBzcGVjdHJhbCBkYXRhICovCisjaWYgKEZJWFBfQ05DTCA9PSBGSVhQX0RCTCkKKyAgICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwU3BlY1RtcCwgRklYUF9EQkwsIDEwMjQpOworICAgICAgRkRLbWVtY3B5KHBTcGVjVG1wLCBwU3BlY3RyYWxDb2VmZmljaWVudCwgMTAyNCAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY3B5KHBTcGVjdHJhbENvZWZmaWNpZW50LCBoQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgICAgIDEwMjQgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNweShoQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50LCBwU3BlY1RtcCwKKyAgICAgICAgICAgICAgICAxMDI0ICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBTcGVjVG1wLCBGSVhQX0RCTCwgMTAyNCk7CisjZWxzZQorICAgICAgRklYUF9DTkNMICpSRVNUUklDVCBwQ25jbCA9CisgICAgICAgICAgJmhDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnRbMTAyNCAtIDFdOworICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBTcGVjID0gJnBTcGVjdHJhbENvZWZmaWNpZW50WzEwMjQgLSAxXTsKKyAgICAgIEZJWFBfREJMIHRTcGVjOwogCi0gICAgICAvKiBzd2FwIHNwZWN0cmFsIGRhdGEgKi8KLSAgICAgIGZvciAoaSA9IDEwMjQ7IGkgIT0gMDsgaS0tKSB7Ci0gICAgICAgIEZJWFBfREJMIHRTcGVjID0gKnBTcGVjOworICAgICAgZm9yIChpbnQgaSA9IDEwMjQ7IGkgIT0gMDsgaS0tKSB7CisgICAgICAgIHRTcGVjID0gKnBTcGVjOwogICAgICAgICAqcFNwZWMtLSA9IEZYX0NOQ0wyRlhfREJMKCpwQ25jbCk7Ci0gICAgICAgICpwQ25jbC0tID0gRlhfREJMMkZYX0NOQ0woIHRTcGVjKTsKKyAgICAgICAgKnBDbmNsLS0gPSBGWF9EQkwyRlhfQ05DTCh0U3BlYyk7CiAgICAgICB9CisjZW5kaWYKIAogICAgICAgLyogY29tcGxldGUgc3dhcHBpbmcgb2Ygd2luZG93IGluZm9zICovCiAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSB0V2luZG93U2VxdWVuY2U7Ci0gICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgICAgPSB0V2luZG93U2hhcGU7CisgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSB0V2luZG93U2hhcGU7CiAKICAgICAgIC8qIGNvbXBsZXRlIHN3YXBwaW5nIG9mIHNjYWxlIGZhY3RvcnMgKi8KLSAgICAgIEZES21lbWNweShwU3BlY1NjYWxlLCB0U3BlY1NjYWxlLCA4KnNpemVvZihTSE9SVCkpOworICAgICAgRkRLbWVtY3B5KHBTcGVjU2NhbGUsIHRTcGVjU2NhbGUsIDggKiBzaXplb2YoU0hPUlQpKTsKICAgICB9CiAgIH0KLSAgCi19CiAKKyAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9MUEQpIHsKKyAgICAvKiBTdG9yZSBMU0Y0ICovCisgICAgRkRLbWVtY3B5KGhDb25jZWFsbWVudEluZm8tPmxzZjQsIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwYzRfbHNmLAorICAgICAgICAgICAgICBzaXplb2YoaENvbmNlYWxtZW50SW5mby0+bHNmNCkpOworICAgIC8qIFN0b3JlIFRDWCBnYWluICovCisgICAgaENvbmNlYWxtZW50SW5mby0+bGFzdF90Y3hfZ2FpbiA9CisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X2dhaW47CisgICAgaENvbmNlYWxtZW50SW5mby0+bGFzdF90Y3hfZ2Fpbl9lID0KKyAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF90Y3hfZ2Fpbl9lOworICB9Cit9CiAKIC8qIQogICBcYnJpZWYgQXBwbHkgY29uY2VhbG1lbnQKIAogICBJbnRlcmZhY2UgZnVuY3Rpb24gdG8gZGlmZmVyZW50IGNvbmNlYWxtZW50IHN0cmF0ZWdpZXMKLQotICAgXHJldHVybiAgbm9uZQogICovCi1pbnQKLSAgQ0NvbmNlYWxtZW50X0FwcGx5ICgKK2ludCBDQ29uY2VhbG1lbnRfQXBwbHkoCiAgICAgQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAogICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCi0gICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwKLSAgICBjb25zdCBVQ0hBUiBsYXN0THBkTW9kZSwKLSAgICBjb25zdCBpbnQgZnJhbWVPaywKLSAgICBjb25zdCBVSU5UIGZsYWdzKQoteworICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBjb25zdCBpbnQgc2FtcGxlc1BlckZyYW1lLAorICAgIGNvbnN0IFVDSEFSIGxhc3RMcGRNb2RlLCBjb25zdCBpbnQgZnJhbWVPaywgY29uc3QgVUlOVCBmbGFncykgewogICBpbnQgYXBwbGllZFByb2Nlc3NpbmcgPSAwOworICBjb25zdCBpbnQgbXV0ZV9yZWxlYXNlX2FjdGl2ZSA9CisgICAgICBmcmFtZU9rICYmIChoQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPj0gQ29uY2VhbFN0YXRlX011dGUpICYmCisgICAgICAoaENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgKyAxIDw9CisgICAgICAgaENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXMtPm51bU11dGVSZWxlYXNlRnJhbWVzKTsKIAotICBpZiAoIChmcmFtZU9rID09IDApCi0gICAgJiYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGUgIT0gKEFBQ0RFQ19SRU5ERVJfTU9ERSloQ29uY2VhbG1lbnRJbmZvLT5sYXN0UmVuZGVyTW9kZSkgKSB7Ci0gICAgLyogcmVzdG9yZSB0aGUgbGFzdCByZW5kZXIgbW9kZSB0byBzdGF5IGluIHRoZSBzYW1lIGRvbWFpbiB3aGljaCBhbGxvd3MgdG8gZG8gYSBwcm9wZXIgY29uY2VhbG1lbnQgKi8KLSAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5yZW5kZXJNb2RlID0gKEFBQ0RFQ19SRU5ERVJfTU9ERSloQ29uY2VhbG1lbnRJbmZvLT5sYXN0UmVuZGVyTW9kZTsKLSAgfSBlbHNlIHsKLSAgICAvKiBvdGhlcndpc2Ugc3RvcmUgdGhlIGN1cnJlbnQgbW9kZSAqLwotICAgIGhDb25jZWFsbWVudEluZm8tPmxhc3RSZW5kZXJNb2RlID0gKFNDSEFSKXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGU7CisgIGlmIChoQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZSA9PSBDT05DRUFMX05PVF9ERUZJTkVEKSB7CisgICAgLyogSW5pdGlhbGl6ZSB3aW5kb3dfc2hhcGUgd2l0aCBzYW1lIHZhbHVlIGFzIGluIHRoZSBjdXJyZW50IChwYXJzZWQpIGZyYW1lLgorICAgICAgIEJlY2F1c2Ugc2VjdGlvbiA0LjYuMTEuMy4yIChXaW5kb3dpbmcgYW5kIGJsb2NrIHN3aXRjaGluZykgb2YgSVNPL0lFQworICAgICAgIDE0NDk2LTM6MjAwOSBzYXlzOiBGb3IgdGhlIGZpcnN0IHJhd19kYXRhX2Jsb2NrKCkgdG8gYmUgZGVjb2RlZCB0aGUKKyAgICAgICB3aW5kb3dfc2hhcGUgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IGhhbGYgb2YgdGhlIHdpbmRvdyBhcmUgaWRlbnRpY2FsLiAqLworICAgIGhDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mby5XaW5kb3dTaGFwZTsKICAgfQogCi0gIGlmICggZnJhbWVPayApCi0gIHsKKyAgaWYgKGZyYW1lT2sgJiYgIW11dGVfcmVsZWFzZV9hY3RpdmUpIHsKKyAgICAvKiBVcGRhdGUgcmVuZGVyIG1vZGUgaWYgZnJhbWVPayBleGNlcHQgZm9yIG9uZ29pbmcgbXV0ZSByZWxlYXNlIHN0YXRlLiAqLworICAgIGhDb25jZWFsbWVudEluZm8tPmxhc3RSZW5kZXJNb2RlID0KKyAgICAgICAgKFNDSEFSKXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGU7CisKICAgICAvKiBSZXNjdWUgY3VycmVudCBkYXRhIGZvciBjb25jZWFsbWVudCBpbiBmdXR1cmUgZnJhbWVzICovCi0gICAgQ0NvbmNlYWxtZW50X1N0b3JlICggaENvbmNlYWxtZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKTsKLSAgICAvKiBSZXNldCBpbmRleCB0byByYW5kb20gc2lnbiB2ZWN0b3IgdG8gbWFrZSBzaWduIGNhbGN1bGF0aW9uIGZyYW1lIGFnbm9zdGljIAorICAgIENDb25jZWFsbWVudF9TdG9yZShoQ29uY2VhbG1lbnRJbmZvLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKTsKKyAgICAvKiBSZXNldCBpbmRleCB0byByYW5kb20gc2lnbiB2ZWN0b3IgdG8gbWFrZSBzaWduIGNhbGN1bGF0aW9uIGZyYW1lIGFnbm9zdGljCiAgICAgICAgKG9ubHkgZGVwZW5kcyBvbiBudW1iZXIgb2Ygc3Vic2VxdWVudGx5IGNvbmNlYWxlZCBzcGVjdHJhbCBibG9ja3MpICovCi0gICAgICAgIGhDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSA9IDA7CisgICAgaENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlID0gMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaENvbmNlYWxtZW50SW5mby0+bGFzdFJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9JTlZBTElEKSB7CisgICAgICBoQ29uY2VhbG1lbnRJbmZvLT5sYXN0UmVuZGVyTW9kZSA9IEFBQ0RFQ19SRU5ERVJfSU1EQ1Q7CisgICAgfQorICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGUgPQorICAgICAgICAoQUFDREVDX1JFTkRFUl9NT0RFKWhDb25jZWFsbWVudEluZm8tPmxhc3RSZW5kZXJNb2RlOwogICB9CiAKICAgLyogaGFuZCBjdXJyZW50IGZyYW1lIHN0YXR1cyB0byB0aGUgc3RhdGUgbWFjaGluZSAqLwotICBDQ29uY2VhbG1lbnRfVXBkYXRlU3RhdGUoIGhDb25jZWFsbWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVPayApOworICBDQ29uY2VhbG1lbnRfVXBkYXRlU3RhdGUoaENvbmNlYWxtZW50SW5mbywgZnJhbWVPaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOwogCiAgIHsKLSAgICAvKiBDcmVhdGUgZGF0YSBmb3Igc2lnbmFsIHJlbmRlcmluZyBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGNvbmNlYWxtZW50IG1ldGhvZCBhbmQgZGVjb2RlciBvcGVyYXRpbmcgbW9kZS4gKi8KKyAgICBpZiAoIWZyYW1lT2sgJiYgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZSA9PSBBQUNERUNfUkVOREVSX0lNRENUKSB7CisgICAgICAvKiBMUEMgZXh0cmFwb2xhdGlvbiAqLworICAgICAgQ0xwY19Db25jZWFsKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5sc3BfY29lZmYsCisgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBjNF9sc2YsCisgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHNmX2FkYXB0aXZlX21lYW4sCisgICAgICAgICAgICAgICAgICAgaENvbmNlYWxtZW50SW5mby0+bGFzdFJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9JTURDVCk7CisgICAgICBGREttZW1jcHkoaENvbmNlYWxtZW50SW5mby0+bHNmNCwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBjNF9sc2YsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwYzRfbHNmKSk7CisgICAgfQogCisgICAgLyogQ3JlYXRlIGRhdGEgZm9yIHNpZ25hbCByZW5kZXJpbmcgYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBjb25jZWFsbWVudAorICAgICAqIG1ldGhvZCBhbmQgZGVjb2RlciBvcGVyYXRpbmcgbW9kZS4gKi8KIAotICAgIGlmICggIShwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfTFBECi0gICAgICAgICkKLSAgICAgICAgKQotICAgIHsKLSAgICAgIHN3aXRjaCAoaENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXMtPm1ldGhvZCkKLSAgICAgIHsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICBjYXNlIENvbmNlYWxNZXRob2RNdXRlOgotICAgICAgICBpZiAoIWZyYW1lT2spIHsKLSAgICAgICAgICAvKiBNdXRlIHNwZWN0cmFsIGRhdGEgaW4gY2FzZSBvZiBlcnJvcnMgKi8KLSAgICAgICAgICBGREttZW1jbGVhcihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgc2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICAgICAgLyogU2V0IGxhc3Qgd2luZG93IHNoYXBlICovCi0gICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mby5XaW5kb3dTaGFwZSA9IGhDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOwotICAgICAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKKyAgICBpZiAoKCFmcmFtZU9rIHx8IG11dGVfcmVsZWFzZV9hY3RpdmUpICYmCisgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfTFBEKSkgeworICAgICAgLyogUmVzdG9yZSBvbGQgTFNGNCAqLworICAgICAgRkRLbWVtY3B5KHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwYzRfbHNmLCBoQ29uY2VhbG1lbnRJbmZvLT5sc2Y0LAorICAgICAgICAgICAgICAgIHNpemVvZihwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scGM0X2xzZikpOworICAgICAgLyogUmVzdG9yZSBvbGQgVENYIGdhaW4gKi8KKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X2dhaW4gPQorICAgICAgICAgIGhDb25jZWFsbWVudEluZm8tPmxhc3RfdGN4X2dhaW47CisgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X3RjeF9nYWluX2UgPQorICAgICAgICAgIGhDb25jZWFsbWVudEluZm8tPmxhc3RfdGN4X2dhaW5fZTsKKyAgICB9CisKKyAgICBpZiAoIShwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfTFBEICYmCisgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGRfbW9kZSA9PSAwKSkgeworICAgICAgc3dpdGNoIChoQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcy0+bWV0aG9kKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZE11dGU6CisgICAgICAgICAgaWYgKCFmcmFtZU9rKSB7CisgICAgICAgICAgICAvKiBNdXRlIHNwZWN0cmFsIGRhdGEgaW4gY2FzZSBvZiBlcnJvcnMgKi8KKyAgICAgICAgICAgIEZES21lbWNsZWFyKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgICAvKiBTZXQgbGFzdCB3aW5kb3cgc2hhcGUgKi8KKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8uV2luZG93U2hhcGUgPQorICAgICAgICAgICAgICAgIGhDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOworICAgICAgICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENvbmNlYWxNZXRob2ROb2lzZToKKyAgICAgICAgICAvKiBOb2lzZSBzdWJzdGl0dXRpb24gZXJyb3IgY29uY2VhbG1lbnQgdGVjaG5pcXVlICovCisgICAgICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSBDQ29uY2VhbG1lbnRfQXBwbHlOb2lzZSgKKyAgICAgICAgICAgICAgaENvbmNlYWxtZW50SW5mbywgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8sIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZEludGVyOgorICAgICAgICAgIC8qIEVuZXJneSBpbnRlcnBvbGF0aW9uIGNvbmNlYWxtZW50IGJhc2VkIG9uIDNHUFAgKi8KKyAgICAgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IENDb25jZWFsbWVudF9BcHBseUludGVyKAorICAgICAgICAgICAgICBoQ29uY2VhbG1lbnRJbmZvLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCAwLCAvKiBkb24ndCB1c2UgdG9uYWwgaW1wcm92ZW1lbnQgKi8KKyAgICAgICAgICAgICAgZnJhbWVPaywgbXV0ZV9yZWxlYXNlX2FjdGl2ZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghZnJhbWVPayB8fCBtdXRlX3JlbGVhc2VfYWN0aXZlKSB7CisgICAgICAvKiBzaW1wbHkgcmVzdG9yZSB0aGUgYnVmZmVyICovCisgICAgICBGSVhQX0RCTCAqcFNwZWN0cmFsQ29lZmZpY2llbnQgPQorICAgICAgICAgIFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCk7CisgICAgICBTSE9SVCAqcFNwZWNTY2FsZSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZTsKKyAgICAgIENJY3NJbmZvICpwSWNzSW5mbyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvOworI2lmIChDTkNMX0ZSQUNUX0JJVFMgIT0gREZSQUNUX0JJVFMpCisgICAgICBGSVhQX0NOQ0wgKlJFU1RSSUNUIHBDbmNsID0KKyAgICAgICAgICAmaENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFsxMDI0IC0gMV07CisgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFNwZWMgPSAmcFNwZWN0cmFsQ29lZmZpY2llbnRbMTAyNCAtIDFdOworICAgICAgaW50IGk7CisjZW5kaWYKKworICAgICAgLyogcmVzdG9yZSB3aW5kb3cgaW5mb3MgKGdyaSkgZG8gd2UgbmVlZCB0aGF0PyAqLworICAgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gaENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2U7CisgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSBoQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZTsKKworICAgICAgaWYgKGhDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAhPSBDb25jZWFsU3RhdGVfTXV0ZSkgeworICAgICAgICAvKiByZXN0b3JlIHNjYWxlIGZhY3RvcnMgKi8KKyAgICAgICAgRkRLbWVtY3B5KHBTcGVjU2NhbGUsIGhDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZSwgOCAqIHNpemVvZihTSE9SVCkpOworCisgICAgICAgIC8qIHJlc3RvcmUgc3BlY3RyYWwgYmlucyAqLworI2lmIChDTkNMX0ZSQUNUX0JJVFMgPT0gREZSQUNUX0JJVFMpCisgICAgICAgIEZES21lbWNweShwU3BlY3RyYWxDb2VmZmljaWVudCwgaENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgICAgIDEwMjQgKiBzaXplb2YoRklYUF9EQkwpKTsKKyNlbHNlCisgICAgICAgIGZvciAoaSA9IDEwMjQ7IGkgIT0gMDsgaS0tKSB7CisgICAgICAgICAgKnBTcGVjLS0gPSBGWF9DTkNMMkZYX0RCTCgqcENuY2wtLSk7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGNsZWFyIHNjYWxlIGZhY3RvcnMgKi8KKyAgICAgICAgRkRLbWVtY2xlYXIocFNwZWNTY2FsZSwgOCAqIHNpemVvZihTSE9SVCkpOwogCi0gICAgICBjYXNlIENvbmNlYWxNZXRob2ROb2lzZToKLSAgICAgICAgLyogTm9pc2Ugc3Vic3RpdHV0aW9uIGVycm9yIGNvbmNlYWxtZW50IHRlY2huaXF1ZSAqLwotICAgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9Ci0gICAgICAgICAgQ0NvbmNlYWxtZW50X0FwcGx5Tm9pc2UgKGhDb25jZWFsbWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZEludGVyOgotICAgICAgICAvKiBFbmVyZ3kgaW50ZXJwb2xhdGlvbiBjb25jZWFsbWVudCBiYXNlZCBvbiAzR1BQICovCi0gICAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0KLSAgICAgICAgICBDQ29uY2VhbG1lbnRfQXBwbHlJbnRlciAoaENvbmNlYWxtZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8qIGRvbid0IHVzZSB0b25hbCBpbXByb3ZlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU9rKTsKLSAgICAgICAgYnJlYWs7Ci0KKyAgICAgICAgLyogY2xlYXIgYnVmZmVyICovCisgICAgICAgIEZES21lbWNsZWFyKHBTcGVjdHJhbENvZWZmaWNpZW50LCAxMDI0ICogc2l6ZW9mKEZJWFBfQ05DTCkpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtODEyLDcgKzc4Niw3IEBACiAgIGhDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzBdID0gaENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV07CiAgIGhDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzFdID0gZnJhbWVPazsKIAotICByZXR1cm4gYXBwbGllZFByb2Nlc3Npbmc7CisgIHJldHVybiBtdXRlX3JlbGVhc2VfYWN0aXZlID8gLTEgOiBhcHBsaWVkUHJvY2Vzc2luZzsKIH0KIAogLyohCkBAIC04MjAsMzA4ICs3OTQsMTkxIEBACiAKICAgSW4gY2FzZSBvZiBmcmFtZSBsb3N0IHRoaXMgZnVuY3Rpb24gcHJvZHVjZXMgYSBub2lzeSBmcmFtZSB3aXRoIHJlc3BlY3QgdG8gdGhlCiAgIGVuZXJnaWVzIHZhbHVlcyBvZiBwYXN0IGZyYW1lLgotCi1ccmV0dXJuICBub25lCiAgKi8KLXN0YXRpYyBpbnQKLSAgQ0NvbmNlYWxtZW50X0FwcGx5Tm9pc2UgKENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsbWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MpCi17Ci0gIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEgPSBwQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtczsKLQotICBGSVhQX0RCTCAqcFNwZWN0cmFsQ29lZmZpY2llbnQgPSAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KTsKLSAgU0hPUlQgICAgKnBTcGVjU2NhbGUgICAgICAgICAgID0gIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZTsKLSAgQ0ljc0luZm8gKnBJY3NJbmZvICAgICAgICAgICAgID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm87CitzdGF0aWMgaW50IENDb25jZWFsbWVudF9BcHBseU5vaXNlKAorICAgIENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsbWVudEluZm8sCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBjb25zdCBpbnQgc2FtcGxlc1BlckZyYW1lLAorICAgIGNvbnN0IFVJTlQgZmxhZ3MpIHsKKyAgRklYUF9EQkwgKnBTcGVjdHJhbENvZWZmaWNpZW50ID0KKyAgICAgIFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCk7CisgIENJY3NJbmZvICpwSWNzSW5mbyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvOwogCiAgIGludCBhcHBsaWVkUHJvY2Vzc2luZyA9IDA7CiAKLSAgRkRLX0FTU0VSVCgoc2FtcGxlc1BlckZyYW1lPj00ODApICYmIChzYW1wbGVzUGVyRnJhbWU8PTEwMjQpKTsKLSAgRkRLX0FTU0VSVCgoc2FtcGxlc1BlckZyYW1lJjB4MUYpID09IDApOworICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8gIT0gTlVMTCk7CisgIEZES19BU1NFUlQoKHNhbXBsZXNQZXJGcmFtZSA+PSAxMjApICYmIChzYW1wbGVzUGVyRnJhbWUgPD0gMTAyNCkpOwogCi0gIHN3aXRjaCAocENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlKQotICB7Ci0gIGNhc2UgQ29uY2VhbFN0YXRlX09rOgotICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSEgKi8KLSAgICBicmVhazsKKyAgc3dpdGNoIChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUpIHsKKyAgICBjYXNlIENvbmNlYWxTdGF0ZV9PazoKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSEgKi8KKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgQ29uY2VhbFN0YXRlX1NpbmdsZToKLSAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZU91dDoKLSAgICB7Ci0gICAgICAvKiByZXN0b3JlIGZyZXF1ZW5jeSBjb2VmZmljaWVudHMgZnJvbSBidWZmZXIgd2l0aCBhIHNwZWNpZmljIG11dGluZyAqLwotICAgICAgRklYUF9TR0wgIGZhYzsKLSAgICAgIGludCB3aW4sIG51bVdpbmRvd3MgPSAxOwotICAgICAgaW50IHdpbmRvd0xlbiA9IHNhbXBsZXNQZXJGcmFtZTsKLSAgICAgIGludCB0RmFkZUZyYW1lcywgbGFzdFdpbmRvdyA9IDA7Ci0gICAgICBpbnQgd2luX2lkeF9zdHJpZGUgPSAxOworICAgIGNhc2UgQ29uY2VhbFN0YXRlX1NpbmdsZToKKyAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlT3V0OgorICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSBDQ29uY2VhbG1lbnRfQXBwbHlGYWRlT3V0KAorICAgICAgICAgIC8qbW9kZSA9Ki8xLCBwQ29uY2VhbG1lbnRJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgcEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CisgICAgICBicmVhazsKIAotICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvICE9IE5VTEwpOwotICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID49IDApOwotICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUyk7Ci0gICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPD0gcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzKTsKLQotICAgICAgLyogZ2V0IGF0dGVudWF0aW9uIGZhY3RvciAqLwotICAgICAgdEZhZGVGcmFtZXMgPSBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzOwotICAgICAgZmFjID0gcENvbmNlYWxDb21tb25EYXRhLT5mYWRlT3V0RmFjdG9yW3RGYWRlRnJhbWVzXTsKLQotICAgICAgLyogc2V0IG9sZCB3aW5kb3cgcGFyYW1ldGVycyAqLwotICAgICAgewotICAgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgICAgPSBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZTsKLSAgICAgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gcENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2U7Ci0KLSAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlID09IDIpIHsKLSAgICAgICAgICAvKiBzaG9ydCBibG9jayBoYW5kbGluZyAqLwotICAgICAgICAgIG51bVdpbmRvd3MgPSA4OwotICAgICAgICAgIHdpbmRvd0xlbiAgPSBzYW1wbGVzUGVyRnJhbWUgPj4gMzsKLSAgICAgICAgICBsYXN0V2luZG93ID0gbnVtV2luZG93cyAtIHBDb25jZWFsbWVudEluZm8tPmxhc3RXaW5HcnBMZW47Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yICh3aW4gPSAwOyB3aW4gPCBudW1XaW5kb3dzOyB3aW4rKykgewotICAgICAgICBGSVhQX0NOQ0wgKnBDbmNsID0gcENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCArIChsYXN0V2luZG93ICogd2luZG93TGVuKTsKLSAgICAgICAgRklYUF9EQkwgICpwT3V0ICA9IHBTcGVjdHJhbENvZWZmaWNpZW50ICsgKHdpbiAqIHdpbmRvd0xlbik7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIEZES19BU1NFUlQoKGxhc3RXaW5kb3cgKiB3aW5kb3dMZW4gKyB3aW5kb3dMZW4pIDw9IHNhbXBsZXNQZXJGcmFtZSk7Ci0KLSAgICAgICAgLyogcmVzdG9yZSBmcmVxdWVuY3kgY29lZmZpY2llbnRzIGZyb20gYnVmZmVyIHdpdGggYSBzcGVjaWZpYyBhdHRlbnVhdGlvbiAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2luZG93TGVuOyBpKyspIHsKLSAgICAgICAgICBwT3V0W2ldID0gZk11bHQocENuY2xbaV0sIGZhYyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBhcHBseSByYW5kb20gY2hhbmdlIG9mIHNpZ24gZm9yIHNwZWN0cmFsIGNvZWZmaWNpZW50cyAqLwotICAgICAgICBDQ29uY2VhbG1lbnRfQXBwbHlSYW5kb21TaWduKHBDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93TGVuICk7Ci0KLSAgICAgICAgLyogSW5jcmVtZW50IHJhbmRvbSBwaGFzZSBpbmRleCB0byBhdm9pZCByZXBldGl0aW9uIGFydGlmYWN0cy4gKi8KLSAgICAgICAgcENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlID0gKHBDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSArIDEpICYgKEFBQ19ORl9OT19SQU5ET01fVkFMIC0gMSk7Ci0KLSAgICAgICAgLyogc2V0IG9sZCBzY2FsZSBmYWN0b3JzICovCi0gICAgICAgIHBTcGVjU2NhbGVbd2luKndpbl9pZHhfc3RyaWRlXSA9IHBDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZVt3aW5faWR4X3N0cmlkZSpsYXN0V2luZG93KytdOwotCi0gICAgICAgIGlmICggKGxhc3RXaW5kb3cgPj0gbnVtV2luZG93cykKLSAgICAgICAgICAmJiAobnVtV2luZG93cyA+ICAxKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBlbmQgb2Ygc2VxdWVuY2UgLT4gcmV3aW5kICovCi0gICAgICAgICAgbGFzdFdpbmRvdyA9IG51bVdpbmRvd3MgLSBwQ29uY2VhbG1lbnRJbmZvLT5sYXN0V2luR3JwTGVuOwotICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgYXR0ZW51YXRpb24gZmFjdG9yIHRvIGdldCBhIGZhc3RlciBmYWRlLW91dCAqLwotICAgICAgICAgIHRGYWRlRnJhbWVzICs9IDE7Ci0gICAgICAgICAgaWYgKHRGYWRlRnJhbWVzIDwgcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzKSB7Ci0gICAgICAgICAgICBmYWMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbdEZhZGVGcmFtZXNdOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWMgPSAoRklYUF9TR0wpMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogc3RvcmUgdGVtcCB2YXJzICovCi0gICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gdEZhZGVGcmFtZXM7Ci0gICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQ29uY2VhbFN0YXRlX011dGU6Ci0gICAgeworICAgIGNhc2UgQ29uY2VhbFN0YXRlX011dGU6IHsKICAgICAgIC8qIHNldCBkdW1teSB3aW5kb3cgcGFyYW1ldGVycyAqLwotICAgICAgcEljc0luZm8tPlZhbGlkICAgICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyaWdnZXIgdGhlIGdlbmVyYXRpb24gb2YgYSBjb25zaXRlbnQgSWNzSW5mbyAqLwotICAgICAgcEljc0luZm8tPldpbmRvd1NoYXBlICAgID0gcENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7ICAgIC8qIFByZXZlbnQgYW4gaW52YWxpZCBXaW5kb3dTaGFwZSAocmVxdWlyZWQgZm9yIEYvVCB0cmFuc2Zvcm0pICovCi0gICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBDQ29uY2VhbG1lbnRfR2V0V2luU2VxKHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlKTsKLSAgICAgIHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlID0gcEljc0luZm8tPldpbmRvd1NlcXVlbmNlOyAvKiBTdG9yZSBmb3IgbmV4dCBmcmFtZSAoc3BlY3RydW0gaW4gY29uY2VhbG1lbnQgYnVmZmVyIGNhbid0IGJlIHVzZWQgYXQgYWxsKSAqLworICAgICAgcEljc0luZm8tPlZhbGlkID0gMDsgLyogVHJpZ2dlciB0aGUgZ2VuZXJhdGlvbiBvZiBhIGNvbnNpdGVudCBJY3NJbmZvICovCisgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPQorICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOyAvKiBQcmV2ZW50IGFuIGludmFsaWQgV2luZG93U2hhcGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVpcmVkIGZvciBGL1QgdHJhbnNmb3JtKSAqLworICAgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0KKyAgICAgICAgICBDQ29uY2VhbG1lbnRfR2V0V2luU2VxKHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlKTsKKyAgICAgIHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlID0KKyAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2U7IC8qIFN0b3JlIGZvciBuZXh0IGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3BlY3RydW0gaW4gY29uY2VhbG1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBjYW4ndCBiZSB1c2VkIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwpICovCiAKICAgICAgIC8qIG11dGUgc3BlY3RyYWwgZGF0YSAqLwogICAgICAgRkRLbWVtY2xlYXIocFNwZWN0cmFsQ29lZmZpY2llbnQsIHNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY2xlYXIocENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gICAgICBpZiAoICEoZmxhZ3MgJiAoQUNfVVNBQ3xBQ19SU1ZENTApKSAKLSAgICAgICAgICAgJiYgcENvbmNlYWxDb21tb25EYXRhLT5jb21mb3J0Tm9pc2VMZXZlbCA+PSAwCi0gICAgICAgICAgICYmIHBDb25jZWFsQ29tbW9uRGF0YS0+Y29tZm9ydE5vaXNlTGV2ZWwgPD0gNjEgLyogLTkwZEIgKi8pCi0gICAgICAgIHsKLSAgICAgICAgLyogaW5zZXJ0IGNvbWZvcnQgbm9pc2UgdXNpbmcgUE5TICovCi0gICAgICAgIENDb25jZWFsbWVudF9mYWtlUG5zRGF0YSAoCi0gICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS5hYWMuUG5zRGF0YSwKLSAgICAgICAgICBwSWNzSW5mbywKLSAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNmYlNjYWxlLAotICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3IsCi0gICAgICAgICAgcENvbmNlYWxDb21tb25EYXRhLT5jb21mb3J0Tm9pc2VMZXZlbAotICAgICAgICApOwotCi0gICAgICAgIENQbnNfQXBwbHkgKAotICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEuYWFjLlBuc0RhdGEsCi0gICAgICAgICAgICAgICAgcEljc0luZm8sCi0gICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQsCi0gICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlLAotICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3IsCi0gICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAwICAvKiBhbHdheXMgYXBwbHkgdG8gZmlyc3QgY2hhbm5lbCAqLwotICAgICAgICAgICAgICApOwotICAgICAgfQogICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSAxOwotICAgIH0KLSAgICBicmVhazsKKyAgICB9IGJyZWFrOwogCi0gIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVJbjoKLSAgICB7Ci0gICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0gMCk7Ci0gICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTKTsKLSAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzKTsKKyAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlSW46IHsKKyAgICAgIC8qIFRpbWVEb21haW5GYWRpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBBdHRlbnVhdGlvbiBvZiBzaWduYWwgaXMgZG9uZSBpbiBDQ29uY2VhbG1lbnRfVERGYWRpbmcoKSAqLwogCi0gICAgICAvKiBhdHRlbnVhdGUgc2lnbmFsIHRvIGdldCBhIHNtb290aCBmYWRlLWluICovCi0gICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcE91dCA9ICZwU3BlY3RyYWxDb2VmZmljaWVudFtzYW1wbGVzUGVyRnJhbWUtMV07Ci0gICAgICBGSVhQX1NHTCBmYWMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVJbkZhY3RvcltwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzXTsKLSAgICAgIGludCBpOwotCi0gICAgICBmb3IgKGkgPSBzYW1wbGVzUGVyRnJhbWU7IGkgIT0gMDsgaS0tKSB7Ci0gICAgICAgICpwT3V0ID0gZk11bHQoKnBPdXQsIGZhYyk7Ci0gICAgICAgIHBPdXQtLTsKLSAgICAgIH0KICAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgfSBicmVhazsKIAotICBkZWZhdWx0OgotICAgIC8qIHdlIHNob3VsZG4ndCBjb21lIGhlcmUgYW55d2F5ICovCi0gICAgRkRLX0FTU0VSVCgwKTsKLSAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogd2Ugc2hvdWxkbid0IGNvbWUgaGVyZSBhbnl3YXkgKi8KKyAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICBicmVhazsKICAgfQogCiAgIHJldHVybiBhcHBsaWVkUHJvY2Vzc2luZzsKIH0KIAotCiAvKiEKICAgXGJyaWVmIEFwcGx5IGNvbmNlYWxtZW50IGludGVycG9sYXRpb24KIAogICBUaGUgZnVuY3Rpb24gc3dhcHMgdGhlIGRhdGEgZnJvbSB0aGUgY3VycmVudCBhbmQgdGhlIHByZXZpb3VzIGZyYW1lLiBJZiBhbgogICBlcnJvciBoYXMgb2NjdXJlZCwgZnJhbWUgaW50ZXJwb2xhdGlvbiBpcyBwZXJmb3JtZWQgdG8gcmVzdG9yZSB0aGUgbWlzc2luZwogICBmcmFtZS4gSW4gY2FzZSBvZiBtdWx0aXBsZSBmYXVsdHkgZnJhbWVzLCBmYWRlLWluIGFuZCBmYWRlLW91dCBpcyBhcHBsaWVkLgotCi0gIFxyZXR1cm4gIG5vbmUKICovCi1zdGF0aWMgaW50Ci0gIENDb25jZWFsbWVudF9BcHBseUludGVyICgKLSAgICBDQ29uY2VhbG1lbnRJbmZvICAgICAgICpwQ29uY2VhbG1lbnRJbmZvLAorc3RhdGljIGludCBDQ29uY2VhbG1lbnRfQXBwbHlJbnRlcigKKyAgICBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbG1lbnRJbmZvLAogICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgY29uc3QgaW50ICBzYW1wbGVzUGVyRnJhbWUsCi0gICAgY29uc3QgaW50ICBpbXByb3ZlVG9uYWwsCi0gICAgY29uc3QgaW50ICBmcmFtZU9rICkKLXsKLSAgQ0NvbmNlYWxQYXJhbXMgICAqcENvbmNlYWxDb21tb25EYXRhICAgID0gIHBDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zOworICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBjb25zdCBpbnQgc2FtcGxlc1BlckZyYW1lLAorICAgIGNvbnN0IGludCBpbXByb3ZlVG9uYWwsIGNvbnN0IGludCBmcmFtZU9rLCBjb25zdCBpbnQgbXV0ZV9yZWxlYXNlX2FjdGl2ZSkgeworI2lmIGRlZmluZWQoRkRLX0FTU0VSVF9FTkFCTEUpCisgIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEgPSBwQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtczsKKyNlbmRpZgogCi0gIEZJWFBfREJMICAgICAgICAgKnBTcGVjdHJhbENvZWZmaWNpZW50ICA9ICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpOwotICBDSWNzSW5mbyAgICAgICAgICpwSWNzSW5mbyAgICAgICAgICAgICAgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbzsKLSAgU0hPUlQgICAgICAgICAgICAqcFNwZWNTY2FsZSAgICAgICAgICAgID0gIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZTsKLQorICBGSVhQX0RCTCAqcFNwZWN0cmFsQ29lZmZpY2llbnQgPQorICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KTsKKyAgQ0ljc0luZm8gKnBJY3NJbmZvID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm87CisgIFNIT1JUICpwU3BlY1NjYWxlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlOwogCiAgIGludCBzZmJFbmVyZ3lQcmV2WzY0XTsKLSAgaW50IHNmYkVuZXJneUFjdCBbNjRdOworICBpbnQgc2ZiRW5lcmd5QWN0WzY0XTsKIAogICBpbnQgaSwgYXBwbGllZFByb2Nlc3NpbmcgPSAwOwogCiAgIC8qIGNsZWFyL2luaXQgKi8KICAgRkRLbWVtY2xlYXIoc2ZiRW5lcmd5UHJldiwgNjQgKiBzaXplb2YoaW50KSk7Ci0gIEZES21lbWNsZWFyKHNmYkVuZXJneUFjdCwgIDY0ICogc2l6ZW9mKGludCkpOworICBGREttZW1jbGVhcihzZmJFbmVyZ3lBY3QsIDY0ICogc2l6ZW9mKGludCkpOwogCi0KLSAgaWYgKCFmcmFtZU9rKQotICB7CisgIGlmICghZnJhbWVPayB8fCBtdXRlX3JlbGVhc2VfYWN0aXZlKSB7CiAgICAgLyogUmVzdG9yZSBsYXN0IGZyYW1lIGZyb20gY29uY2VhbG1lbnQgYnVmZmVyICovCi0gICAgcEljc0luZm8tPldpbmRvd1NoYXBlICAgID0gcENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7CisgICAgcEljc0luZm8tPldpbmRvd1NoYXBlID0gcENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7CiAgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gcENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2U7CiAKICAgICAvKiBSZXN0b3JlIHNwZWN0cmFsIGRhdGEgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlc1BlckZyYW1lOyBpKyspIHsKLSAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50W2ldID0gRlhfQ05DTDJGWF9EQkwocENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFtpXSk7CisgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudFtpXSA9CisgICAgICAgICAgRlhfQ05DTDJGWF9EQkwocENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFtpXSk7CiAgICAgfQogCiAgICAgLyogUmVzdG9yZSBzY2FsZSBmYWN0b3JzICovCi0gICAgRkRLbWVtY3B5KHBTcGVjU2NhbGUsIHBDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZSwgOCpzaXplb2YoU0hPUlQpKTsKKyAgICBGREttZW1jcHkocFNwZWNTY2FsZSwgcENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlLCA4ICogc2l6ZW9mKFNIT1JUKSk7CiAgIH0KIAogICAvKiBpZiBwcmV2aW91cyBmcmFtZSB3YXMgbm90IG9rICovCi0gIGlmICghcENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0pIHsKLQorICBpZiAoIXBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzFdIHx8IG11dGVfcmVsZWFzZV9hY3RpdmUpIHsKICAgICAvKiBpZiBjdXJyZW50IGZyYW1lIChmX24pIGlzIG9rIGFuZCB0aGUgbGFzdCBidXQgb25lIGZyYW1lIChmXyhuLTIpKQogICAgICAgIHdhcyBvaywgdG9vLCB0aGVuIGludGVycG9sYXRlIGJvdGggZnJhbWVzIGluIG9yZGVyIHRvIGdlbmVyYXRlCiAgICAgICAgdGhlIGN1cnJlbnQgb3V0cHV0IGZyYW1lIChmXyhuLTEpKS4gT3RoZXJ3aXNlLCB1c2UgdGhlIGxhc3Qgc3RvcmVkCiAgICAgICAgZnJhbWUgKGZfKG4tMikgb3IgZl8obi0zKSBvciAuLi4pLiAqLwotICAgIGlmIChmcmFtZU9rICYmIHBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzBdKQotICAgIHsKKyAgICBpZiAoZnJhbWVPayAmJiBwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1swXSAmJiAhbXV0ZV9yZWxlYXNlX2FjdGl2ZSkgewogICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSAxOwogCi0KLSAgICAgIC8qIEludGVycG9sYXRlIGJvdGggZnJhbWVzIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjdXJyZW50IG91dHB1dCBmcmFtZSAoZl8obi0xKSkuICovCi0gICAgICBpZiAocEljc0luZm8tPldpbmRvd1NlcXVlbmNlID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgewotICAgICAgICAvKiBmXyhuLTIpID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSAqLworICAgICAgLyogSW50ZXJwb2xhdGUgYm90aCBmcmFtZXMgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGN1cnJlbnQgb3V0cHV0IGZyYW1lCisgICAgICAgKiAoZl8obi0xKSkuICovCisgICAgICBpZiAocEljc0luZm8tPldpbmRvd1NlcXVlbmNlID09IEJMT0NLX1NIT1JUKSB7CisgICAgICAgIC8qIGZfKG4tMikgPT0gQkxPQ0tfU0hPUlQgKi8KICAgICAgICAgLyogc2hvcnQtLT8/Pz8/Py0tc2hvcnQsIHNob3J0LS0/Pz8/Pz8tLWxvbmcgaW50ZXJwb2xhdGlvbiAqLwogICAgICAgICAvKiBzaG9ydC0tc2hvcnQtLS1zaG9ydCwgc2hvcnQtLS1sb25nLS0tbG9uZyBpbnRlcnBvbGF0aW9uICovCiAKICAgICAgICAgaW50IHduZDsKIAotICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKSB7IC8qIGZfbiA9PSBFaWdodFNob3J0U2VxdWVuY2UgKi8KKyAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlID09CisgICAgICAgICAgICBCTE9DS19TSE9SVCkgeyAvKiBmX24gPT0gQkxPQ0tfU0hPUlQgKi8KICAgICAgICAgICAvKiBzaG9ydC0tc2hvcnQtLS1zaG9ydCBpbnRlcnBvbGF0aW9uICovCiAKLSAgICAgICAgICBpbnQgc2NhbGVGYWN0b3JCYW5kc1RvdGFsID0gcFNhbXBsaW5nUmF0ZUluZm8tPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKLSAgICAgICAgICBjb25zdCBTSE9SVCAqcFNmYk9mZnNldCAgID0gcFNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7Ci0gICAgICAgICAgcEljc0luZm8tPldpbmRvd1NoYXBlID0gMTsKLSAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBFaWdodFNob3J0U2VxdWVuY2U7CisgICAgICAgICAgaW50IHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9CisgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CisgICAgICAgICAgY29uc3QgU0hPUlQgKnBTZmJPZmZzZXQgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKKyAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSAoc2FtcGxlc1BlckZyYW1lIDw9IDUxMikgPyAyIDogMTsKKyAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBCTE9DS19TSE9SVDsKIAotICAgICAgICAgIGZvciAod25kID0gMDsgd25kIDwgODsgd25kKyspCi0gICAgICAgICAgeworICAgICAgICAgIGZvciAod25kID0gMDsgd25kIDwgODsgd25kKyspIHsKICAgICAgICAgICAgIENDb25jZWFsbWVudF9DYWxjQmFuZEVuZXJneSgKLSAgICAgICAgICAgICAgJnBTcGVjdHJhbENvZWZmaWNpZW50W3duZCAqIChzYW1wbGVzUGVyRnJhbWUgLyA4KV0sIC8qIHNwZWNfKG4tMikgKi8KLSAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgRWlnaHRTaG9ydFNlcXVlbmNlLAotICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAotICAgICAgICAgICAgICAgc2ZiRW5lcmd5UHJldik7CisgICAgICAgICAgICAgICAgJnBTcGVjdHJhbENvZWZmaWNpZW50W3duZCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYW1wbGVzUGVyRnJhbWUgLyA4KV0sIC8qIHNwZWNfKG4tMikgKi8KKyAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywgQkxPQ0tfU0hPUlQsIENDb25jZWFsbWVudF9Ob0V4cGFuZCwKKyAgICAgICAgICAgICAgICBzZmJFbmVyZ3lQcmV2KTsKIAogICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KAotICAgICAgICAgICAgICAmcENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFt3bmQgKiAoc2FtcGxlc1BlckZyYW1lIC8gOCldLCAvKiBzcGVjX24gKi8KLSAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgRWlnaHRTaG9ydFNlcXVlbmNlLAotICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAotICAgICAgICAgICAgICAgc2ZiRW5lcmd5QWN0KTsKKyAgICAgICAgICAgICAgICAmcENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFt3bmQgKiAoc2FtcGxlc1BlckZyYW1lIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCldLCAvKiBzcGVjX24gKi8KKyAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywgQkxPQ0tfU0hPUlQsIENDb25jZWFsbWVudF9Ob0V4cGFuZCwKKyAgICAgICAgICAgICAgICBzZmJFbmVyZ3lBY3QpOwogCiAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfSW50ZXJwb2xhdGVCdWZmZXIoCi0gICAgICAgICAgICAgICZwU3BlY3RyYWxDb2VmZmljaWVudFt3bmQgKiAoc2FtcGxlc1BlckZyYW1lIC8gOCldLCAvKiBzcGVjXyhuLTEpICovCi0gICAgICAgICAgICAgICZwU3BlY1NjYWxlW3duZF0sCi0gICAgICAgICAgICAgICZwQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGVbd25kXSwKLSAgICAgICAgICAgICAgJnBTcGVjU2NhbGVbd25kXSwKLSAgICAgICAgICAgICAgIHNmYkVuZXJneVByZXYsCi0gICAgICAgICAgICAgICBzZmJFbmVyZ3lBY3QsCi0gICAgICAgICAgICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwsCi0gICAgICAgICAgICAgICBwU2ZiT2Zmc2V0KTsKLQorICAgICAgICAgICAgICAgICZwU3BlY3RyYWxDb2VmZmljaWVudFt3bmQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2FtcGxlc1BlckZyYW1lIC8gOCldLCAvKiBzcGVjXyhuLTEpICovCisgICAgICAgICAgICAgICAgJnBTcGVjU2NhbGVbd25kXSwgJnBDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZVt3bmRdLAorICAgICAgICAgICAgICAgICZwU3BlY1NjYWxlW3duZF0sIHNmYkVuZXJneVByZXYsIHNmYkVuZXJneUFjdCwKKyAgICAgICAgICAgICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwsIHBTZmJPZmZzZXQpOwogICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgLyogZl9uICE9IEVpZ2h0U2hvcnRTZXF1ZW5jZSAqLworICAgICAgICB9IGVsc2UgeyAvKiBmX24gIT0gQkxPQ0tfU0hPUlQgKi8KICAgICAgICAgICAvKiBzaG9ydC0tLWxvbmctLS1sb25nIGludGVycG9sYXRpb24gKi8KIAotICAgICAgICAgIGludCBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmc7Ci0gICAgICAgICAgY29uc3QgU0hPUlQgKnBTZmJPZmZzZXQgICA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgICAgICAgICAgaW50IHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9CisgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKKyAgICAgICAgICBjb25zdCBTSE9SVCAqcFNmYk9mZnNldCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX0xvbmc7CiAgICAgICAgICAgU0hPUlQgc3BlY1NjYWxlT3V0OwogCi0gICAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KCZwU3BlY3RyYWxDb2VmZmljaWVudFtzYW1wbGVzUGVyRnJhbWUgLSAoc2FtcGxlc1BlckZyYW1lIC8gOCldLCAvKiBbd25kXSBzcGVjXyhuLTIpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdodFNob3J0U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDb25jZWFsbWVudF9FeHBhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUFjdCk7CisgICAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KAorICAgICAgICAgICAgICAmcFNwZWN0cmFsQ29lZmZpY2llbnRbc2FtcGxlc1BlckZyYW1lIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYW1wbGVzUGVyRnJhbWUgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpXSwgLyogW3duZF0gc3BlY18obi0yKSAqLworICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywgQkxPQ0tfU0hPUlQsIENDb25jZWFsbWVudF9FeHBhbmQsCisgICAgICAgICAgICAgIHNmYkVuZXJneUFjdCk7CiAKLSAgICAgICAgICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3kocENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwgLyogc3BlY19uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5TG9uZ1NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfTm9FeHBhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkVuZXJneVByZXYpOworICAgICAgICAgIENDb25jZWFsbWVudF9DYWxjQmFuZEVuZXJneSgKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwgLyogc3BlY19uICovCisgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLCBCTE9DS19MT05HLCBDQ29uY2VhbG1lbnRfTm9FeHBhbmQsCisgICAgICAgICAgICAgIHNmYkVuZXJneVByZXYpOwogCiAgICAgICAgICAgcEljc0luZm8tPldpbmRvd1NoYXBlID0gMDsKLSAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBMb25nU3RvcFNlcXVlbmNlOworICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IEJMT0NLX1NUT1A7CiAKLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlc1BlckZyYW1lIDsgaSsrKSB7Ci0gICAgICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudFtpXSA9IHBDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnRbaV07IC8qIHNwZWNfbiAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzUGVyRnJhbWU7IGkrKykgeworICAgICAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnRbaV0gPQorICAgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnRbaV07IC8qIHNwZWNfbiAqLwogICAgICAgICAgIH0KIAogICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsgLyogc2VhcmNoIGZvciBtYXgoc3BlY1NjYWxlKSAqLwpAQCAtMTEzMSwxNCArOTg4LDkgQEAKICAgICAgICAgICB9CiAKICAgICAgICAgICBDQ29uY2VhbG1lbnRfSW50ZXJwb2xhdGVCdWZmZXIoCi0gICAgICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudCwgLyogc3BlY18obi0xKSAqLwotICAgICAgICAgICAmcENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlWzBdLAotICAgICAgICAgICAmcFNwZWNTY2FsZVswXSwKLSAgICAgICAgICAgJnNwZWNTY2FsZU91dCwKLSAgICAgICAgICAgIHNmYkVuZXJneVByZXYsCi0gICAgICAgICAgICBzZmJFbmVyZ3lBY3QsCi0gICAgICAgICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwsCi0gICAgICAgICAgICBwU2ZiT2Zmc2V0KTsKKyAgICAgICAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnQsIC8qIHNwZWNfKG4tMSkgKi8KKyAgICAgICAgICAgICAgJnBDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZVswXSwgJnBTcGVjU2NhbGVbMF0sICZzcGVjU2NhbGVPdXQsCisgICAgICAgICAgICAgIHNmYkVuZXJneVByZXYsIHNmYkVuZXJneUFjdCwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsLCBwU2ZiT2Zmc2V0KTsKIAogICAgICAgICAgIHBTcGVjU2NhbGVbMF0gPSBzcGVjU2NhbGVPdXQ7CiAgICAgICAgIH0KQEAgLTExNDYsMjEgKzk5OCwyMSBAQAogICAgICAgICAvKiBsb25nLS0/Pz8/Pz8tLXNob3J0LCBsb25nLS0/Pz8/Pz8tLWxvbmcgaW50ZXJwb2xhdGlvbiAqLwogICAgICAgICAvKiBsb25nLS0tbG9uZy0tLXNob3J0LCBsb25nLS0tbG9uZy0tLWxvbmcgaW50ZXJwb2xhdGlvbiAqLwogCi0gICAgICAgIGludCBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmc7Ci0gICAgICAgIGNvbnN0IFNIT1JUICpwU2ZiT2Zmc2V0ICAgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nOwotICAgICAgICBTSE9SVCBzcGVjU2NhbGVBY3QgICAgICAgID0gcENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlWzBdOworICAgICAgICBpbnQgc2NhbGVGYWN0b3JCYW5kc1RvdGFsID0KKyAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKKyAgICAgICAgY29uc3QgU0hPUlQgKnBTZmJPZmZzZXQgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nOworICAgICAgICBTSE9SVCBzcGVjU2NhbGVBY3QgPSBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGVbMF07CiAKLSAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KHBTcGVjdHJhbENvZWZmaWNpZW50LCAgLyogc3BlY18obi0yKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5TG9uZ1NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5UHJldik7CisgICAgICAgIENDb25jZWFsbWVudF9DYWxjQmFuZEVuZXJneShwU3BlY3RyYWxDb2VmZmljaWVudCwgLyogc3BlY18obi0yKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sIEJMT0NLX0xPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfTm9FeHBhbmQsIHNmYkVuZXJneVByZXYpOwogCi0gICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZSA9PSBFaWdodFNob3J0U2VxdWVuY2UpIHsgIC8qIGZfbiA9PSBFaWdodFNob3J0U2VxdWVuY2UgKi8KKyAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlID09CisgICAgICAgICAgICBCTE9DS19TSE9SVCkgeyAvKiBmX24gPT0gQkxPQ0tfU0hPUlQgKi8KICAgICAgICAgICAvKiBsb25nLS0tbG9uZy0tLXNob3J0IGludGVycG9sYXRpb24gKi8KIAotICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9IDE7Ci0gICAgICAgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gTG9uZ1N0YXJ0U2VxdWVuY2U7CisgICAgICAgICAgcEljc0luZm8tPldpbmRvd1NoYXBlID0gKHNhbXBsZXNQZXJGcmFtZSA8PSA1MTIpID8gMiA6IDE7CisgICAgICAgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gQkxPQ0tfU1RBUlQ7CiAKICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7IC8qIHNlYXJjaCBmb3IgbWF4KHNwZWNTY2FsZSkgKi8KICAgICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGVbaV0gPiBzcGVjU2NhbGVBY3QpIHsKQEAgLTExNjksMzEwICsxMDIxLDI3NyBAQAogICAgICAgICAgIH0KIAogICAgICAgICAgIC8qIEV4cGFuZCBmaXJzdCBzaG9ydCBzcGVjdHJ1bSAqLwotICAgICAgICAgIENDb25jZWFsbWVudF9DYWxjQmFuZEVuZXJneShwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50LCAgLyogc3BlY19uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdodFNob3J0U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDb25jZWFsbWVudF9FeHBhbmQsICAvKiAhISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5QWN0KTsKKyAgICAgICAgICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3koCisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsICAgICAgICAgICAgICAgLyogc3BlY19uICovCisgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLCBCTE9DS19TSE9SVCwgQ0NvbmNlYWxtZW50X0V4cGFuZCwgLyogISEhICovCisgICAgICAgICAgICAgIHNmYkVuZXJneUFjdCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgLyogbG9uZy0tLWxvbmctLS1sb25nIGludGVycG9sYXRpb24gKi8KIAogICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9IDA7Ci0gICAgICAgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gT25seUxvbmdTZXF1ZW5jZTsKKyAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBCTE9DS19MT05HOwogCi0gICAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KHBDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsICAvKiBzcGVjX24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHlMb25nU2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDb25jZWFsbWVudF9Ob0V4cGFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5QWN0KTsKKyAgICAgICAgICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3koCisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsIC8qIHNwZWNfbiAqLworICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywgQkxPQ0tfTE9ORywgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAorICAgICAgICAgICAgICBzZmJFbmVyZ3lBY3QpOwogICAgICAgICB9CiAKLSAgICAgICAgICBDQ29uY2VhbG1lbnRfSW50ZXJwb2xhdGVCdWZmZXIoCi0gICAgICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudCwgIC8qIHNwZWNfKG4tMSkgKi8KLSAgICAgICAgICAgJnBTcGVjU2NhbGVbMF0sCi0gICAgICAgICAgICZzcGVjU2NhbGVBY3QsCi0gICAgICAgICAgICZwU3BlY1NjYWxlWzBdLAotICAgICAgICAgICAgc2ZiRW5lcmd5UHJldiwKLSAgICAgICAgICAgIHNmYkVuZXJneUFjdCwKLSAgICAgICAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCwKLSAgICAgICAgICAgIHBTZmJPZmZzZXQpOwotCisgICAgICAgIENDb25jZWFsbWVudF9JbnRlcnBvbGF0ZUJ1ZmZlcigKKyAgICAgICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50LCAvKiBzcGVjXyhuLTEpICovCisgICAgICAgICAgICAmcFNwZWNTY2FsZVswXSwgJnNwZWNTY2FsZUFjdCwgJnBTcGVjU2NhbGVbMF0sIHNmYkVuZXJneVByZXYsCisgICAgICAgICAgICBzZmJFbmVyZ3lBY3QsIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCwgcFNmYk9mZnNldCk7CiAgICAgICB9CiAgICAgfQogCi0gICAgICAvKiBOb2lzZSBzdWJzdGl0dXRpb24gb2Ygc2lnbiBvZiB0aGUgb3V0cHV0IHNwZWN0cmFsIGNvZWZmaWNpZW50cyAqLwotICAgICAgQ0NvbmNlYWxtZW50X0FwcGx5UmFuZG9tU2lnbiAocENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUpOwotICAgICAgLyogSW5jcmVtZW50IHJhbmRvbSBwaGFzZSBpbmRleCB0byBhdm9pZCByZXBldGl0aW9uIGFydGlmYWN0cy4gKi8KLSAgICAgIHBDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSA9IChwQ29uY2VhbG1lbnRJbmZvLT5pUmFuZG9tUGhhc2UgKyAxKSAmIChBQUNfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOworICAgIC8qIE5vaXNlIHN1YnN0aXR1dGlvbiBvZiBzaWduIG9mIHRoZSBvdXRwdXQgc3BlY3RyYWwgY29lZmZpY2llbnRzICovCisgICAgQ0NvbmNlYWxtZW50X0FwcGx5UmFuZG9tU2lnbihwQ29uY2VhbG1lbnRJbmZvLT5pUmFuZG9tUGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudCwgc2FtcGxlc1BlckZyYW1lKTsKKyAgICAvKiBJbmNyZW1lbnQgcmFuZG9tIHBoYXNlIGluZGV4IHRvIGF2b2lkIHJlcGV0aXRpb24gYXJ0aWZhY3RzLiAqLworICAgIHBDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSA9CisgICAgICAgIChwQ29uY2VhbG1lbnRJbmZvLT5pUmFuZG9tUGhhc2UgKyAxKSAmIChBQUNfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwogICB9CiAKICAgLyogc2NhbGUgc3BlY3RydW0gYWNjb3JkaW5nIHRvIGNvbmNlYWxtZW50IHN0YXRlICovCi0gIHN3aXRjaCAocENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlKQotICB7Ci0gIGNhc2UgQ29uY2VhbFN0YXRlX1NpbmdsZToKLSAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZU91dDoKLSAgICB7Ci0gICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0gMCk7Ci0gICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTKTsKLSAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcyk7Ci0KLSAgICAgIC8qIHJlc3RvcmUgZnJlcXVlbmN5IGNvZWZmaWNpZW50cyBmcm9tIGJ1ZmZlciB3aXRoIGEgc3BlY2lmaWMgbXV0aW5nICovCi0gICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcE91dCA9ICZwU3BlY3RyYWxDb2VmZmljaWVudFtzYW1wbGVzUGVyRnJhbWUtMV07Ci0gICAgICBGSVhQX1NHTCBmYWMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lc107Ci0KLSAgICAgIGZvciAoaSA9IHNhbXBsZXNQZXJGcmFtZTsgaSAhPSAwOyBpLS0pIHsKLSAgICAgICAgKnBPdXQgPSBmTXVsdCgqcE91dCwgZmFjKTsKLSAgICAgICAgcE91dC0tOwotICAgICAgfQorICBzd2l0Y2ggKHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSkgeworICAgIGNhc2UgQ29uY2VhbFN0YXRlX1NpbmdsZToKICAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgICBicmVhazsKIAotICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlSW46Ci0gICAgeworICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVPdXQ6IHsKICAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA+PSAwKTsKLSAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMpOwotICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwgcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMpOworICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwKKyAgICAgICAgICAgICAgICAgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUyk7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPAorICAgICAgICAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMpOwogCi0gICAgICAvKiBhdHRlbnVhdGUgc2lnbmFsIHRvIGdldCBhIHNtb290aCBmYWRlLWluICovCi0gICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcE91dCA9ICZwU3BlY3RyYWxDb2VmZmljaWVudFtzYW1wbGVzUGVyRnJhbWUtMV07Ci0gICAgICBGSVhQX1NHTCBmYWMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVJbkZhY3RvcltwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzXTsKKyAgICAgIC8qIFRpbWVEb21haW5GYWRpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBBdHRlbnVhdGlvbiBvZiBzaWduYWwgaXMgZG9uZSBpbiBDQ29uY2VhbG1lbnRfVERGYWRpbmcoKSAqLwogCi0gICAgICBmb3IgKGkgPSBzYW1wbGVzUGVyRnJhbWU7IGkgIT0gMDsgaS0tKSB7Ci0gICAgICAgICpwT3V0ID0gZk11bHQoKnBPdXQsIGZhYyk7Ci0gICAgICAgIHBPdXQtLTsKLSAgICAgIH0KICAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgfSBicmVhazsKIAotICBjYXNlIENvbmNlYWxTdGF0ZV9NdXRlOgotICAgIHsKLSAgICAgIGludCBmYWMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmNvbWZvcnROb2lzZUxldmVsOworICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVJbjogeworICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID49IDApOworICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwKKyAgICAgICAgICAgICAgICAgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUyk7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPAorICAgICAgICAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyk7CiAKKyAgICAgIC8qIFRpbWVEb21haW5GYWRpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBBdHRlbnVhdGlvbiBvZiBzaWduYWwgaXMgZG9uZSBpbiBDQ29uY2VhbG1lbnRfVERGYWRpbmcoKSAqLworCisgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7CisgICAgfSBicmVhazsKKworICAgIGNhc2UgQ29uY2VhbFN0YXRlX011dGU6IHsKICAgICAgIC8qIHNldCBkdW1teSB3aW5kb3cgcGFyYW1ldGVycyAqLwotICAgICAgcEljc0luZm8tPlZhbGlkICAgICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyaWdnZXIgdGhlIGdlbmVyYXRpb24gb2YgYSBjb25zaXRlbnQgSWNzSW5mbyAqLwotICAgICAgcEljc0luZm8tPldpbmRvd1NoYXBlICAgID0gcENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7ICAgIC8qIFByZXZlbnQgYW4gaW52YWxpZCBXaW5kb3dTaGFwZSAocmVxdWlyZWQgZm9yIEYvVCB0cmFuc2Zvcm0pICovCi0gICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBDQ29uY2VhbG1lbnRfR2V0V2luU2VxKHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlKTsKLSAgICAgIHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlID0gcEljc0luZm8tPldpbmRvd1NlcXVlbmNlOyAvKiBTdG9yZSBmb3IgbmV4dCBmcmFtZSAoc3BlY3RydW0gaW4gY29uY2VhbG1lbnQgYnVmZmVyIGNhbid0IGJlIHVzZWQgYXQgYWxsKSAqLworICAgICAgcEljc0luZm8tPlZhbGlkID0gMDsgLyogVHJpZ2dlciB0aGUgZ2VuZXJhdGlvbiBvZiBhIGNvbnNpdGVudCBJY3NJbmZvICovCisgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPQorICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOyAvKiBQcmV2ZW50IGFuIGludmFsaWQgV2luZG93U2hhcGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVpcmVkIGZvciBGL1QgdHJhbnNmb3JtKSAqLworICAgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0KKyAgICAgICAgICBDQ29uY2VhbG1lbnRfR2V0V2luU2VxKHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlKTsKKyAgICAgIHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlID0KKyAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2U7IC8qIFN0b3JlIGZvciBuZXh0IGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3BlY3RydW0gaW4gY29uY2VhbG1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBjYW4ndCBiZSB1c2VkIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwpICovCiAKICAgICAgIC8qIG11dGUgc3BlY3RyYWwgZGF0YSAqLwogICAgICAgRkRLbWVtY2xlYXIocFNwZWN0cmFsQ29lZmZpY2llbnQsIHNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gICAgICBpZiAoZmFjID49IDAgJiYgZmFjIDw9IDYxKSB7Ci0gICAgICAgIC8qIGluc2VydCBjb21mb3J0IG5vaXNlIHVzaW5nIFBOUyAqLwotICAgICAgICBDQ29uY2VhbG1lbnRfZmFrZVBuc0RhdGEgKAotICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEuYWFjLlBuc0RhdGEsCi0gICAgICAgICAgcEljc0luZm8sCi0gICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlLAotICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3IsCi0gICAgICAgICAgZmFjCi0gICAgICAgICk7Ci0KLSAgICAgICAgQ1Buc19BcHBseSAoCi0gICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS5hYWMuUG5zRGF0YSwKLSAgICAgICAgICAgICAgICBwSWNzSW5mbywKLSAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwKLSAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGUsCi0gICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwKLSAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgIDAgIC8qIGFsd2F5cyBhcHBseSB0byBmaXJzdCBjaGFubmVsICovCi0gICAgICAgICAgICAgICk7Ci0gICAgICB9CiAgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7Ci0gICAgfQotICAgIGJyZWFrOworICAgIH0gYnJlYWs7CiAKLSAgZGVmYXVsdDoKLSAgICAvKiBub3RoaW5nIHRvIGRvIGhlcmUgKi8KLSAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogbm90aGluZyB0byBkbyBoZXJlICovCisgICAgICBicmVhazsKICAgfQogCiAgIHJldHVybiBhcHBsaWVkUHJvY2Vzc2luZzsKIH0KIAotCiAvKiEKICAgXGJyaWVmIENhbGN1bGF0ZSB0aGUgc3BlY3RyYWwgZW5lcmd5CiAKICAgVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYmFuZC13aXNlIHRoZSBzcGVjdHJhbCBlbmVyZ3kuIFRoaXMgaXMgdXNlZCBmb3IKICAgZnJhbWUgaW50ZXJwb2xhdGlvbi4KLQotICBccmV0dXJuICBub25lCiAqLwotc3RhdGljIHZvaWQKLSAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5ICgKLSAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICpzcGVjdHJ1bSwKLSAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBibG9ja1R5cGUsCi0gICAgQ0NvbmNlYWxtZW50RXhwYW5kVHlwZSAgZXhwYW5kVHlwZSwKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3kgKQoteworc3RhdGljIHZvaWQgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KAorICAgIEZJWFBfREJMICpzcGVjdHJ1bSwgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgY29uc3QgaW50IGJsb2NrVHlwZSwgQ0NvbmNlYWxtZW50RXhwYW5kVHlwZSBleHBhbmRUeXBlLCBpbnQgKnNmYkVuZXJneSkgewogICBjb25zdCBTSE9SVCAqcFNmYk9mZnNldDsKICAgaW50IGxpbmUsIHNmYiwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsID0gMDsKLSAgCi0gIC8qIEluIHRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb25zLCBlbkFjY3UgaXMgaW5pdGlhbGl6ZWQgd2l0aCBMU0ItdmFsdWUgaW4gb3JkZXIgdG8gYXZvaWQgemVybyBlbmVyZ3ktbGV2ZWwgKi8KKworICAvKiBJbiB0aGUgZm9sbG93aW5nIGNhbGN1bGF0aW9ucywgZW5BY2N1IGlzIGluaXRpYWxpemVkIHdpdGggTFNCLXZhbHVlIGluCisgICAqIG9yZGVyIHRvIGF2b2lkIHplcm8gZW5lcmd5LWxldmVsICovCiAKICAgbGluZSA9IDA7CiAKLSAgc3dpdGNoKGJsb2NrVHlwZSkgeworICBzd2l0Y2ggKGJsb2NrVHlwZSkgeworICAgIGNhc2UgQkxPQ0tfTE9ORzoKKyAgICBjYXNlIEJMT0NLX1NUQVJUOgorICAgIGNhc2UgQkxPQ0tfU1RPUDoKIAotICBjYXNlIE9ubHlMb25nU2VxdWVuY2U6Ci0gIGNhc2UgTG9uZ1N0YXJ0U2VxdWVuY2U6Ci0gIGNhc2UgTG9uZ1N0b3BTZXF1ZW5jZToKKyAgICAgIGlmIChleHBhbmRUeXBlID09IENDb25jZWFsbWVudF9Ob0V4cGFuZCkgeworICAgICAgICAvKiBzdGFuZGFyZCBsb25nIGNhbGN1bGF0aW9uICovCisgICAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9CisgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgICAgICAgIHBTZmJPZmZzZXQgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nOwogCi0gICAgaWYgKGV4cGFuZFR5cGUgPT0gQ0NvbmNlYWxtZW50X05vRXhwYW5kKSB7Ci0gICAgICAvKiBzdGFuZGFyZCBsb25nIGNhbGN1bGF0aW9uICovCi0gICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmc7Ci0gICAgICBwU2ZiT2Zmc2V0ICAgICAgICAgICAgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nOwotCi0gICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNjYWxlRmFjdG9yQmFuZHNUb3RhbDsgc2ZiKyspIHsKLSAgICAgICAgRklYUF9EQkwgZW5BY2N1ID0gKEZJWFBfREJMKShMT05HKTE7Ci0gICAgICAgIGludCBzZmJTY2FsZSA9IChzaXplb2YoTE9ORyk8PDMpIC0gQ250TGVhZGluZ1plcm9zKHBTZmJPZmZzZXRbc2ZiKzFdIC0gcFNmYk9mZnNldFtzZmJdKSAtIDE7Ci0gICAgICAgIC8qIHNjYWxpbmcgZGVwZW5kcyBvbiBzZmIgd2lkdGguICovCi0gICAgICAgIGZvciAoIDsgbGluZSA8IHBTZmJPZmZzZXRbc2ZiKzFdOyBsaW5lKyspIHsKLSAgICAgICAgICBlbkFjY3UgKz0gZlBvdzJEaXYyKCooc3BlY3RydW0gKyBsaW5lKSkgPj4gc2ZiU2NhbGU7CisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsOyBzZmIrKykgeworICAgICAgICAgIEZJWFBfREJMIGVuQWNjdSA9IChGSVhQX0RCTCkoTE9ORykxOworICAgICAgICAgIGludCBzZmJTY2FsZSA9CisgICAgICAgICAgICAgIChzaXplb2YoTE9ORykgPDwgMykgLQorICAgICAgICAgICAgICBDbnRMZWFkaW5nWmVyb3MocFNmYk9mZnNldFtzZmIgKyAxXSAtIHBTZmJPZmZzZXRbc2ZiXSkgLSAxOworICAgICAgICAgIC8qIHNjYWxpbmcgZGVwZW5kcyBvbiBzZmIgd2lkdGguICovCisgICAgICAgICAgZm9yICg7IGxpbmUgPCBwU2ZiT2Zmc2V0W3NmYiArIDFdOyBsaW5lKyspIHsKKyAgICAgICAgICAgIGVuQWNjdSArPSBmUG93MkRpdjIoKihzcGVjdHJ1bSArIGxpbmUpKSA+PiBzZmJTY2FsZTsKKyAgICAgICAgICB9CisgICAgICAgICAgKihzZmJFbmVyZ3kgKyBzZmIpID0gQ250TGVhZGluZ1plcm9zKGVuQWNjdSkgLSAxOwogICAgICAgICB9Ci0gICAgICAgICooc2ZiRW5lcmd5ICsgc2ZiKSA9IENudExlYWRpbmdaZXJvcyhlbkFjY3UpIC0gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBjb21wcmVzcyBsb25nIHRvIHNob3J0ICovCi0gICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX1Nob3J0OwotICAgICAgcFNmYk9mZnNldCAgICAgICAgICAgID0gcFNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBjb21wcmVzcyBsb25nIHRvIHNob3J0ICovCisgICAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9CisgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX1Nob3J0OworICAgICAgICBwU2ZiT2Zmc2V0ID0gcFNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CiAKLSAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsOyBzZmIrKykgewotICAgICAgICBGSVhQX0RCTCBlbkFjY3UgPSAoRklYUF9EQkwpKExPTkcpMTsKLSAgICAgICAgaW50IHNmYlNjYWxlID0gKHNpemVvZihMT05HKTw8MykgLSBDbnRMZWFkaW5nWmVyb3MocFNmYk9mZnNldFtzZmIrMV0gLSBwU2ZiT2Zmc2V0W3NmYl0pIC0gMTsKLSAgICAgICAgLyogc2NhbGluZyBkZXBlbmRzIG9uIHNmYiB3aWR0aC4gKi8KLSAgICAgICAgZm9yICg7IGxpbmUgPCBwU2ZiT2Zmc2V0W3NmYisxXSA8PCAzOyBsaW5lKyspIHsKLSAgICAgICAgICBlbkFjY3UgKz0gKGVuQWNjdSArIChmUG93MkRpdjIoKihzcGVjdHJ1bSArIGxpbmUpKSA+PiBzZmJTY2FsZSkpID4+IDM7CisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsOyBzZmIrKykgeworICAgICAgICAgIEZJWFBfREJMIGVuQWNjdSA9IChGSVhQX0RCTCkoTE9ORykxOworICAgICAgICAgIGludCBzZmJTY2FsZSA9CisgICAgICAgICAgICAgIChzaXplb2YoTE9ORykgPDwgMykgLQorICAgICAgICAgICAgICBDbnRMZWFkaW5nWmVyb3MocFNmYk9mZnNldFtzZmIgKyAxXSAtIHBTZmJPZmZzZXRbc2ZiXSkgLSAxOworICAgICAgICAgIC8qIHNjYWxpbmcgZGVwZW5kcyBvbiBzZmIgd2lkdGguICovCisgICAgICAgICAgZm9yICg7IGxpbmUgPCBwU2ZiT2Zmc2V0W3NmYiArIDFdIDw8IDM7IGxpbmUrKykgeworICAgICAgICAgICAgZW5BY2N1ICs9CisgICAgICAgICAgICAgICAgKGVuQWNjdSArIChmUG93MkRpdjIoKihzcGVjdHJ1bSArIGxpbmUpKSA+PiBzZmJTY2FsZSkpID4+IDM7CisgICAgICAgICAgfQorICAgICAgICAgICooc2ZiRW5lcmd5ICsgc2ZiKSA9IENudExlYWRpbmdaZXJvcyhlbkFjY3UpIC0gMTsKICAgICAgICAgfQotICAgICAgICAqKHNmYkVuZXJneSArIHNmYikgPSBDbnRMZWFkaW5nWmVyb3MoZW5BY2N1KSAtIDE7CiAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOworICAgICAgYnJlYWs7CiAKLSAgY2FzZSBFaWdodFNob3J0U2VxdWVuY2U6CisgICAgY2FzZSBCTE9DS19TSE9SVDoKIAotICAgIGlmIChleHBhbmRUeXBlID09IENDb25jZWFsbWVudF9Ob0V4cGFuZCkgewotICAgICAgLyogICBzdGFuZGFyZCBzaG9ydCBjYWxjdWxhdGlvbiAqLwotICAgICAgc2NhbGVGYWN0b3JCYW5kc1RvdGFsID0gcFNhbXBsaW5nUmF0ZUluZm8tPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKLSAgICAgIHBTZmJPZmZzZXQgICAgICAgICAgICA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX1Nob3J0OworICAgICAgaWYgKGV4cGFuZFR5cGUgPT0gQ0NvbmNlYWxtZW50X05vRXhwYW5kKSB7CisgICAgICAgIC8qICAgc3RhbmRhcmQgc2hvcnQgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgc2NhbGVGYWN0b3JCYW5kc1RvdGFsID0KKyAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CisgICAgICAgIHBTZmJPZmZzZXQgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKIAotICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzY2FsZUZhY3RvckJhbmRzVG90YWw7IHNmYisrKSB7Ci0gICAgICAgIEZJWFBfREJMIGVuQWNjdSA9IChGSVhQX0RCTCkoTE9ORykxOwotICAgICAgICBpbnQgc2ZiU2NhbGUgPSAoc2l6ZW9mKExPTkcpPDwzKSAtIENudExlYWRpbmdaZXJvcyhwU2ZiT2Zmc2V0W3NmYisxXSAtIHBTZmJPZmZzZXRbc2ZiXSkgLSAxOwotICAgICAgICAvKiBzY2FsaW5nIGRlcGVuZHMgb24gc2ZiIHdpZHRoLiAqLwotICAgICAgICBmb3IgKCA7IGxpbmUgPCBwU2ZiT2Zmc2V0W3NmYisxXTsgbGluZSsrKSB7Ci0gICAgICAgICAgZW5BY2N1ICs9IGZQb3cyRGl2MigqKHNwZWN0cnVtICsgbGluZSkpID4+IHNmYlNjYWxlOworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNjYWxlRmFjdG9yQmFuZHNUb3RhbDsgc2ZiKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCBlbkFjY3UgPSAoRklYUF9EQkwpKExPTkcpMTsKKyAgICAgICAgICBpbnQgc2ZiU2NhbGUgPQorICAgICAgICAgICAgICAoc2l6ZW9mKExPTkcpIDw8IDMpIC0KKyAgICAgICAgICAgICAgQ250TGVhZGluZ1plcm9zKHBTZmJPZmZzZXRbc2ZiICsgMV0gLSBwU2ZiT2Zmc2V0W3NmYl0pIC0gMTsKKyAgICAgICAgICAvKiBzY2FsaW5nIGRlcGVuZHMgb24gc2ZiIHdpZHRoLiAqLworICAgICAgICAgIGZvciAoOyBsaW5lIDwgcFNmYk9mZnNldFtzZmIgKyAxXTsgbGluZSsrKSB7CisgICAgICAgICAgICBlbkFjY3UgKz0gZlBvdzJEaXYyKCooc3BlY3RydW0gKyBsaW5lKSkgPj4gc2ZiU2NhbGU7CisgICAgICAgICAgfQorICAgICAgICAgICooc2ZiRW5lcmd5ICsgc2ZiKSA9IENudExlYWRpbmdaZXJvcyhlbkFjY3UpIC0gMTsKICAgICAgICAgfQotICAgICAgICAqKHNmYkVuZXJneSArIHNmYikgPSBDbnRMZWFkaW5nWmVyb3MoZW5BY2N1KSAtIDE7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLyogIGV4cGFuZCBzaG9ydCB0byBsb25nIHNwZWN0cnVtICovCi0gICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmc7Ci0gICAgICBwU2ZiT2Zmc2V0ICAgICAgICAgICAgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogIGV4cGFuZCBzaG9ydCB0byBsb25nIHNwZWN0cnVtICovCisgICAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9CisgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgICAgICAgIHBTZmJPZmZzZXQgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nOwogCi0gICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNjYWxlRmFjdG9yQmFuZHNUb3RhbDsgc2ZiKyspIHsKLSAgICAgICAgRklYUF9EQkwgZW5BY2N1ID0gKEZJWFBfREJMKShMT05HKTE7Ci0gICAgICAgIGludCBzZmJTY2FsZSA9IChzaXplb2YoTE9ORyk8PDMpIC0gQ250TGVhZGluZ1plcm9zKHBTZmJPZmZzZXRbc2ZiKzFdIC0gcFNmYk9mZnNldFtzZmJdKSAtIDE7Ci0gICAgICAgIC8qIHNjYWxpbmcgZGVwZW5kcyBvbiBzZmIgd2lkdGguICovCi0gICAgICAgIGZvciAoIDsgbGluZSA8IHBTZmJPZmZzZXRbc2ZiKzFdOyBsaW5lKyspIHsKLSAgICAgICAgICBlbkFjY3UgKz0gZlBvdzJEaXYyKCooc3BlY3RydW0gKyAobGluZSA+PiAzKSkpID4+IHNmYlNjYWxlOworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNjYWxlRmFjdG9yQmFuZHNUb3RhbDsgc2ZiKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCBlbkFjY3UgPSAoRklYUF9EQkwpKExPTkcpMTsKKyAgICAgICAgICBpbnQgc2ZiU2NhbGUgPQorICAgICAgICAgICAgICAoc2l6ZW9mKExPTkcpIDw8IDMpIC0KKyAgICAgICAgICAgICAgQ250TGVhZGluZ1plcm9zKHBTZmJPZmZzZXRbc2ZiICsgMV0gLSBwU2ZiT2Zmc2V0W3NmYl0pIC0gMTsKKyAgICAgICAgICAvKiBzY2FsaW5nIGRlcGVuZHMgb24gc2ZiIHdpZHRoLiAqLworICAgICAgICAgIGZvciAoOyBsaW5lIDwgcFNmYk9mZnNldFtzZmIgKyAxXTsgbGluZSsrKSB7CisgICAgICAgICAgICBlbkFjY3UgKz0gZlBvdzJEaXYyKCooc3BlY3RydW0gKyAobGluZSA+PiAzKSkpID4+IHNmYlNjYWxlOworICAgICAgICAgIH0KKyAgICAgICAgICAqKHNmYkVuZXJneSArIHNmYikgPSBDbnRMZWFkaW5nWmVyb3MoZW5BY2N1KSAtIDE7CiAgICAgICAgIH0KLSAgICAgICAgKihzZmJFbmVyZ3kgKyBzZmIpID0gQ250TGVhZGluZ1plcm9zKGVuQWNjdSkgLSAxOwogICAgICAgfQotICAgIH0KLSAgICBicmVhazsKKyAgICAgIGJyZWFrOwogICB9CiB9CiAKLQogLyohCiAgIFxicmllZiBJbnRlcnBvbGF0ZSBidWZmZXIKIAogICBUaGUgZnVuY3Rpb24gY3JlYXRlcyB0aGUgaW50ZXJwb2xhdGVkIHNwZWN0cmFsIGRhdGEgYWNjb3JkaW5nIHRvIHRoZQogICBlbmVyZ3kgb2YgdGhlIGxhc3QgZ29vZCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgKGdvb2QpIGZyYW1lLgotCi0gIFxyZXR1cm4gIG5vbmUKICovCi1zdGF0aWMgdm9pZAotICBDQ29uY2VhbG1lbnRfSW50ZXJwb2xhdGVCdWZmZXIgKAotICAgIEZJWFBfREJMICAgICpzcGVjdHJ1bSwKLSAgICBTSE9SVCAgICAgICAqcFNwZWNTY2FsZVBydiwKLSAgICBTSE9SVCAgICAgICAqcFNwZWNTY2FsZUFjdCwKLSAgICBTSE9SVCAgICAgICAqcFNwZWNTY2FsZU91dCwKLSAgICBpbnQgICAgICAgICAqZW5QcnYsCi0gICAgaW50ICAgICAgICAgKmVuQWN0LAotICAgIGludCAgICAgICAgICBzZmJDbnQsCi0gICAgY29uc3QgU0hPUlQgKnBTZmJPZmZzZXQgKQotewotICBpbnQgICAgc2ZiLCBsaW5lID0gMDsKLSAgaW50ICAgIGZhY19zaGlmdDsKLSAgaW50ICAgIGZhY19tb2Q7CitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfSW50ZXJwb2xhdGVCdWZmZXIoRklYUF9EQkwgKnNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpwU3BlY1NjYWxlUHJ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpwU3BlY1NjYWxlQWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpwU3BlY1NjYWxlT3V0LCBpbnQgKmVuUHJ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5BY3QsIGludCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKnBTZmJPZmZzZXQpIHsKKyAgaW50IHNmYiwgbGluZSA9IDA7CisgIGludCBmYWNfc2hpZnQ7CisgIGludCBmYWNfbW9kOwogICBGSVhQX0RCTCBhY2N1OwogCiAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgewotCi0gICAgZmFjX3NoaWZ0ID0gZW5QcnZbc2ZiXSAtIGVuQWN0W3NmYl0gKyAoKCpwU3BlY1NjYWxlQWN0IC0gKnBTcGVjU2NhbGVQcnYpIDw8IDEpOwotICAgIGZhY19tb2QgICA9IGZhY19zaGlmdCAmIDM7CisgICAgZmFjX3NoaWZ0ID0KKyAgICAgICAgZW5QcnZbc2ZiXSAtIGVuQWN0W3NmYl0gKyAoKCpwU3BlY1NjYWxlQWN0IC0gKnBTcGVjU2NhbGVQcnYpIDw8IDEpOworICAgIGZhY19tb2QgPSBmYWNfc2hpZnQgJiAzOwogICAgIGZhY19zaGlmdCA9IChmYWNfc2hpZnQgPj4gMikgKyAxOwogICAgIGZhY19zaGlmdCArPSAqcFNwZWNTY2FsZVBydiAtIGZpeE1heCgqcFNwZWNTY2FsZVBydiwgKnBTcGVjU2NhbGVBY3QpOwogCi0gICAgZm9yICg7IGxpbmUgPCBwU2ZiT2Zmc2V0W3NmYisxXTsgbGluZSsrKSB7Ci0gICAgICBhY2N1ID0gZk11bHQoKihzcGVjdHJ1bStsaW5lKSwgZmFjTW9kNFRhYmxlW2ZhY19tb2RdKTsKKyAgICBmb3IgKDsgbGluZSA8IHBTZmJPZmZzZXRbc2ZiICsgMV07IGxpbmUrKykgeworICAgICAgYWNjdSA9IGZNdWx0KCooc3BlY3RydW0gKyBsaW5lKSwgZmFjTW9kNFRhYmxlW2ZhY19tb2RdKTsKICAgICAgIGlmIChmYWNfc2hpZnQgPCAwKSB7CiAgICAgICAgIGFjY3UgPj49IC1mYWNfc2hpZnQ7CiAgICAgICB9IGVsc2UgewogICAgICAgICBhY2N1IDw8PSBmYWNfc2hpZnQ7CiAgICAgICB9Ci0gICAgICAqKHNwZWN0cnVtK2xpbmUpID0gYWNjdTsKKyAgICAgICooc3BlY3RydW0gKyBsaW5lKSA9IGFjY3U7CiAgICAgfQogICB9CiAgICpwU3BlY1NjYWxlT3V0ID0gZml4TWF4KCpwU3BlY1NjYWxlUHJ2LCAqcFNwZWNTY2FsZUFjdCk7CiB9CiAKKy8qIQorICBcYnJpZWYgRmluZCBuZXh0IGZhZGluZyBmcmFtZSBpbiBjYXNlIG9mIGNoYW5naW5nIGZhZGluZyBkaXJlY3Rpb24KIAorICBccGFyYW0gcENvbmNlYWxDb21tb25EYXRhIFBvaW50ZXIgdG8gdGhlIGNvbmNlYWxtZW50IGNvbW1vbiBkYXRhIHN0cnVjdHVyZS4KKyAgXHBhcmFtIGFjdEZhZGVJbmRleCBMYXN0IGluZGV4IHVzZWQgZm9yIGZhZGluZworICBccGFyYW0gZGlyZWN0aW9uIERpcmVjdGlvbiBvZiBjaGFuZ2U6IDAgOiBjaGFuZ2UgZnJvbSBGQURFLU9VVCB0byBGQURFLUlOLCAgMQorICA6IGNoYW5nZSBmcm9tIEZBREUtSU4gdG8gRkFERS1PVVQKIAorICBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIG5leHQgZmFkaW5nIGluZGV4IHRvIGJlIHVzZWQgZm9yIHRoZSBmYWRpbmcKKyAgZGlyZWN0aW9uIHRvIGJlIGNoYW5nZWQgdG8uCisqLwogCi1zdGF0aWMgSU5UIGZpbmRFcXVpRmFkZUZyYW1lICgKLSAgICBDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhLAotICAgIElOVCBhY3RGYWRlSW5kZXgsCi0gICAgaW50IGRpcmVjdGlvbiApCi17CitzdGF0aWMgSU5UIGZpbmRFcXVpRmFkZUZyYW1lKENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhY3RGYWRlSW5kZXgsIGludCBkaXJlY3Rpb24pIHsKICAgRklYUF9TR0wgKnBGYWN0b3I7Ci0gIEZJWFBfU0dMICByZWZlcmVuY2VWYWw7Ci0gIEZJWFBfU0dMICBtaW5EaWZmID0gKEZJWFBfU0dMKU1BWFZBTF9TR0w7CisgIEZJWFBfU0dMIHJlZmVyZW5jZVZhbDsKKyAgRklYUF9TR0wgbWluRGlmZiA9IChGSVhQX1NHTClNQVhWQUxfU0dMOwogCi0gIElOVCAgbnVtRnJhbWVzID0gMDsKLSAgSU5UICBuZXh0RmFkZUluZGV4ID0gMDsKKyAgSU5UIG5leHRGYWRlSW5kZXggPSAwOwogCi0gIGludCAgaTsKKyAgaW50IGk7CiAKICAgLyogaW5pdCBkZXBlbmRpbmcgb24gZGlyZWN0aW9uICovCi0gIGlmIChkaXJlY3Rpb24gPT0gMCkgeyAgLyogRkFERS1PVVQgPT4gRkFERS1JTiAqLwotICAgIG51bUZyYW1lcyA9IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzOwotICAgIHJlZmVyZW5jZVZhbCA9IHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3RvclthY3RGYWRlSW5kZXhdID4+IDE7CisgIGlmIChkaXJlY3Rpb24gPT0gMCkgeyAvKiBGQURFLU9VVCA9PiBGQURFLUlOICovCisgICAgaWYgKGFjdEZhZGVJbmRleCA8IDApIHsKKyAgICAgIHJlZmVyZW5jZVZhbCA9IChGSVhQX1NHTClNQVhWQUxfU0dMOworICAgIH0gZWxzZSB7CisgICAgICByZWZlcmVuY2VWYWwgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbYWN0RmFkZUluZGV4XSA+PiAxOworICAgIH0KICAgICBwRmFjdG9yID0gcENvbmNlYWxDb21tb25EYXRhLT5mYWRlSW5GYWN0b3I7Ci0gIH0KLSAgZWxzZSB7ICAvKiBGQURFLUlOID0+IEZBREUtT1VUICovCi0gICAgbnVtRnJhbWVzID0gcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzOwotICAgIHJlZmVyZW5jZVZhbCA9IHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZUluRmFjdG9yW2FjdEZhZGVJbmRleF0gPj4gMTsKKyAgfSBlbHNlIHsgLyogRkFERS1JTiA9PiBGQURFLU9VVCAqLworICAgIGlmIChhY3RGYWRlSW5kZXggPCAwKSB7CisgICAgICByZWZlcmVuY2VWYWwgPSAoRklYUF9TR0wpTUFYVkFMX1NHTDsKKyAgICB9IGVsc2UgeworICAgICAgcmVmZXJlbmNlVmFsID0gcENvbmNlYWxDb21tb25EYXRhLT5mYWRlSW5GYWN0b3JbYWN0RmFkZUluZGV4XSA+PiAxOworICAgIH0KICAgICBwRmFjdG9yID0gcENvbmNlYWxDb21tb25EYXRhLT5mYWRlT3V0RmFjdG9yOwogICB9CiAKICAgLyogc2VhcmNoIGZvciBtaW5pbXVtIGRpZmZlcmVuY2UgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7Ci0gICAgRklYUF9TR0wgZGlmZiA9IGZpeHBfYWJzKChwRmFjdG9yW2ldPj4xKSAtIHJlZmVyZW5jZVZhbCk7CisgIGZvciAoaSA9IDA7IGkgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTOyBpKyspIHsKKyAgICBGSVhQX1NHTCBkaWZmID0gZml4cF9hYnMoKHBGYWN0b3JbaV0gPj4gMSkgLSByZWZlcmVuY2VWYWwpOwogICAgIGlmIChkaWZmIDwgbWluRGlmZikgewogICAgICAgbWluRGlmZiA9IGRpZmY7CiAgICAgICBuZXh0RmFkZUluZGV4ID0gaTsKQEAgLTE0ODAsMTMgKzEyOTksMTcgQEAKICAgfQogCiAgIC8qIGNoZWNrIGFuZCBhZGp1c3QgZGVwZW5kaW5nIG9uIGRpcmVjdGlvbiAqLwotICBpZiAoZGlyZWN0aW9uID09IDApIHsgIC8qIEZBREUtT1VUID0+IEZBREUtSU4gKi8KLSAgICBpZiAoKChwRmFjdG9yW25leHRGYWRlSW5kZXhdPj4xKSA8PSByZWZlcmVuY2VWYWwpICYmIChuZXh0RmFkZUluZGV4ID4gMCkpIHsKKyAgaWYgKGRpcmVjdGlvbiA9PSAwKSB7IC8qIEZBREUtT1VUID0+IEZBREUtSU4gKi8KKyAgICBpZiAobmV4dEZhZGVJbmRleCA+IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzKSB7CisgICAgICBuZXh0RmFkZUluZGV4ID0gZk1heChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyAtIDEsIDApOworICAgIH0KKyAgICBpZiAoKChwRmFjdG9yW25leHRGYWRlSW5kZXhdID4+IDEpIDw9IHJlZmVyZW5jZVZhbCkgJiYKKyAgICAgICAgKG5leHRGYWRlSW5kZXggPiAwKSkgewogICAgICAgbmV4dEZhZGVJbmRleCAtPSAxOwogICAgIH0KLSAgfQotICBlbHNlIHsgIC8qIEZBREUtSU4gPT4gRkFERS1PVVQgKi8KLSAgICBpZiAoKChwRmFjdG9yW25leHRGYWRlSW5kZXhdPj4xKSA+PSByZWZlcmVuY2VWYWwpICYmIChuZXh0RmFkZUluZGV4IDwgbnVtRnJhbWVzLTEpKSB7CisgIH0gZWxzZSB7IC8qIEZBREUtSU4gPT4gRkFERS1PVVQgKi8KKyAgICBpZiAoKChwRmFjdG9yW25leHRGYWRlSW5kZXhdID4+IDEpID49IHJlZmVyZW5jZVZhbCkgJiYKKyAgICAgICAgKG5leHRGYWRlSW5kZXggPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTIC0gMSkpIHsKICAgICAgIG5leHRGYWRlSW5kZXggKz0gMTsKICAgICB9CiAgIH0KQEAgLTE0OTQsMjY4ICsxMzE3LDMwNCBAQAogICByZXR1cm4gKG5leHRGYWRlSW5kZXgpOwogfQogCi0KIC8qIQogICBcYnJpZWYgVXBkYXRlIHRoZSBjb25jZWFsbWVudCBzdGF0ZQogCiAgIFRoZSBmdW5jdGlvbiB1cGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29uY2VhbG1lbnQgc3RhdGUtbWFjaGluZS4gVGhlCiAgIHN0YXRlcyBhcmU6IG11dGUsIGZhZGUtaW4sIGZhZGUtb3V0LCBpbnRlcnBvbGF0ZSBhbmQgZnJhbWUtb2suCi0KLSAgXHJldHVybiAgbm9uZQogKi8KLXN0YXRpYyB2b2lkCi0gIENDb25jZWFsbWVudF9VcGRhdGVTdGF0ZSAoCi0gICAgQ0NvbmNlYWxtZW50SW5mbyAqcENvbmNlYWxtZW50SW5mbywKLSAgICBpbnQgZnJhbWVPayApCi17CitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfVXBkYXRlU3RhdGUoCisgICAgQ0NvbmNlYWxtZW50SW5mbyAqcENvbmNlYWxtZW50SW5mbywgaW50IGZyYW1lT2ssCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBjb25zdCBpbnQgc2FtcGxlc1BlckZyYW1lLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKSB7CiAgIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEgPSBwQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtczsKIAotICBzd2l0Y2ggKHBDb25jZWFsQ29tbW9uRGF0YS0+bWV0aG9kKQotICB7Ci0gIGNhc2UgQ29uY2VhbE1ldGhvZE5vaXNlOgotICAgIHsKKyAgc3dpdGNoIChwQ29uY2VhbENvbW1vbkRhdGEtPm1ldGhvZCkgeworICAgIGNhc2UgQ29uY2VhbE1ldGhvZE5vaXNlOiB7CiAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlICE9IENvbmNlYWxTdGF0ZV9PaykgewogICAgICAgICAvKiBjb3VudCB0aGUgdmFsaWQgZnJhbWVzIGR1cmluZyBjb25jZWFsbWVudCBwcm9jZXNzICovCiAgICAgICAgIGlmIChmcmFtZU9rKSB7CiAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgKz0gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyAgPSAwOworICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID0gMDsKICAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvKiAtLSBTVEFURSBNQUNISU5FIGZvciBOb2lzZSBTdWJzdGl0dXRpb24gLS0gKi8KLSAgICAgIHN3aXRjaCAocENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlKQotICAgICAgewotICAgICAgY2FzZSBDb25jZWFsU3RhdGVfT2s6Ci0gICAgICAgIGlmICghZnJhbWVPaykgewotICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgPiAwKSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgU0lOR0xFLUZSQU1FLUxPU1MgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAgID0gQ29uY2VhbFN0YXRlX1NpbmdsZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9NdXRlOwotICAgICAgICAgIH0KLSAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzICA9IDA7Ci0gICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUpIHsKKyAgICAgICAgY2FzZSBDb25jZWFsU3RhdGVfT2s6CisgICAgICAgICAgaWYgKCFmcmFtZU9rKSB7CisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gMDsKKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID0gMDsKKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmF0dEdycE9mZnNldFswXSA9IDA7CisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5hdHRHcnBPZmZzZXRbMV0gPSAwOworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luR3JwT2Zmc2V0WzBdID0gMDsKKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPndpbkdycE9mZnNldFsxXSA9IDA7CisgICAgICAgICAgICBpZiAocENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzID4gMCkgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgU0lOR0xFLUZSQU1FLUxPU1MgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX1NpbmdsZTsKKyAgICAgICAgICAgICAgLyogbW9kZSAwIGp1c3QgdXBkYXRlcyB0aGUgRmFkaW5nIGNvdW50ZXIgKi8KKyAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0FwcGx5RmFkZU91dCgKKyAgICAgICAgICAgICAgICAgIC8qbW9kZSA9Ki8wLCBwQ29uY2VhbG1lbnRJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKIAotICAgICAgY2FzZSBDb25jZWFsU3RhdGVfU2luZ2xlOiAgLyogSnVzdCBhIHByZS1zdGFnZSBiZWZvcmUgZmFkZS1vdXQgYmVnaW5zLiBTdGF5IGhlcmUgb25seSBvbmUgZnJhbWUhICovCi0gICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgKz0gMTsKLSAgICAgICAgaWYgKGZyYW1lT2spIHsKLSAgICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPiBwQ29uY2VhbENvbW1vbkRhdGEtPm51bU11dGVSZWxlYXNlRnJhbWVzKSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1JTiAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlICA9IENvbmNlYWxTdGF0ZV9GYWRlSW47Ci0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gZmluZEVxdWlGYWRlRnJhbWUoIHBDb25jZWFsQ29tbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcy0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIEZhZGVPdXQgLT4gRmFkZUluICovKTsKLSAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX1NpbmdsZTogLyogSnVzdCBhIHByZS1zdGFnZSBiZWZvcmUgZmFkZS1vdXQgYmVnaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXkgaGVyZSBvbmx5IG9uZSBmcmFtZSEgKi8KKyAgICAgICAgICBpZiAoZnJhbWVPaykgewogICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE9LICovCiAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID49IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcykgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9NdXRlOwogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1PVVQgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9GYWRlT3V0OworICAgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0KKyAgICAgICAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMpIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1PVVQgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX0ZhZGVPdXQ7CisgICAgICAgICAgICAgIC8qIG1vZGUgMCBqdXN0IHVwZGF0ZXMgdGhlIEZhZGluZyBjb3VudGVyICovCisgICAgICAgICAgICAgIENDb25jZWFsbWVudF9BcHBseUZhZGVPdXQoCisgICAgICAgICAgICAgICAgICAvKm1vZGUgPSovMCwgcENvbmNlYWxtZW50SW5mbywgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgcEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlT3V0OgotICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzICs9IDE7ICAvKiB1c2VkIHRvIGFkZHJlc3MgdGhlIGZhZGUtb3V0IGZhY3RvcnMgKi8KLSAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID4gcENvbmNlYWxDb21tb25EYXRhLT5udW1NdXRlUmVsZWFzZUZyYW1lcykgewotICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyA+IDApIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBGQURFLUlOICovCi0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgID0gQ29uY2VhbFN0YXRlX0ZhZGVJbjsKLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSBmaW5kRXF1aUZhZGVGcmFtZSggcENvbmNlYWxDb21tb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogRmFkZU91dCAtPiBGYWRlSW4gKi8pOworICAgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlT3V0OgorICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyA+CisgICAgICAgICAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtSU4gKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX0ZhZGVJbjsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA9IGZpbmRFcXVpRmFkZUZyYW1lKAorICAgICAgICAgICAgICAgICAgcENvbmNlYWxDb21tb25EYXRhLCBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzLAorICAgICAgICAgICAgICAgICAgMCAvKiBGYWRlT3V0IC0+IEZhZGVJbiAqLyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgICAgfQogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgICAgIGlmIChmcmFtZU9rKSB7CisgICAgICAgICAgICAgIC8qIHdlIGhhdmUgZ29vZCBmcmFtZSBpbmZvcm1hdGlvbiBidXQgc3RheSBmdWxseSBpbiBjb25jZWFsbWVudCAtCisgICAgICAgICAgICAgICAqIHJlc2V0IHdpbkdycE9mZnNldC9hdHRHcnBPZmZzZXQgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luR3JwT2Zmc2V0WzBdID0gMDsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luR3JwT2Zmc2V0WzFdID0gMDsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+YXR0R3JwT2Zmc2V0WzBdID0gMDsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+YXR0R3JwT2Zmc2V0WzFdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID49CisgICAgICAgICAgICAgICAgcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzKSB7CisgICAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBNVVRFICovCisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9NdXRlOworICAgICAgICAgICAgfSBlbHNlIC8qIFN0YXkgaW4gRkFERS1PVVQgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogbW9kZSAwIGp1c3QgdXBkYXRlcyB0aGUgRmFkaW5nIGNvdW50ZXIgKi8KKyAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0FwcGx5RmFkZU91dCgKKyAgICAgICAgICAgICAgICAgIC8qbW9kZSA9Ki8wLCBwQ29uY2VhbG1lbnRJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0gcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzKSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIENvbmNlYWxTdGF0ZV9NdXRlOgotICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPiBwQ29uY2VhbENvbW1vbkRhdGEtPm51bU11dGVSZWxlYXNlRnJhbWVzKSB7Ci0gICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzID4gMCkgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtSU4gKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9GYWRlSW47Ci0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMgLSAxOworICAgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9NdXRlOgorICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyA+CisgICAgICAgICAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtSU4gKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX0ZhZGVJbjsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA9CisgICAgICAgICAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyAtIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgICAgfQogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgICAgIGlmIChmcmFtZU9rKSB7CisgICAgICAgICAgICAgIC8qIHdlIGhhdmUgZ29vZCBmcmFtZSBpbmZvcm1hdGlvbiBidXQgc3RheSBmdWxseSBpbiBjb25jZWFsbWVudCAtCisgICAgICAgICAgICAgICAqIHJlc2V0IHdpbkdycE9mZnNldC9hdHRHcnBPZmZzZXQgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luR3JwT2Zmc2V0WzBdID0gMDsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luR3JwT2Zmc2V0WzFdID0gMDsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+YXR0R3JwT2Zmc2V0WzBdID0gMDsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+YXR0R3JwT2Zmc2V0WzFdID0gMDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVJbjoKLSAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyAtPSAxOyAgLyogdXNlZCB0byBhZGRyZXNzIHRoZSBmYWRlLWluIGZhY3RvcnMgKi8KLSAgICAgICAgaWYgKGZyYW1lT2spIHsKLSAgICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8IDApIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAocENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzID4gMCkgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtT1VUICovCi0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgID0gQ29uY2VhbFN0YXRlX0ZhZGVPdXQ7Ci0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gZmluZEVxdWlGYWRlRnJhbWUoIHBDb25jZWFsQ29tbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcysxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qIEZhZGVJbiAtPiBGYWRlT3V0ICovKTsKKyAgICAgICAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZUluOgorICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgLT0gMTsKKyAgICAgICAgICBpZiAoZnJhbWVPaykgeworICAgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPCAwKSB7CisgICAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBNVVRFICovCi0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfTXV0ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzID4gMCkgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1PVVQgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX0ZhZGVPdXQ7CisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSBmaW5kRXF1aUZhZGVGcmFtZSgKKyAgICAgICAgICAgICAgICAgIHBDb25jZWFsQ29tbW9uRGF0YSwgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyArIDEsCisgICAgICAgICAgICAgICAgICAxIC8qIEZhZGVJbiAtPiBGYWRlT3V0ICovKTsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luR3JwT2Zmc2V0WzBdID0gMDsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luR3JwT2Zmc2V0WzFdID0gMDsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+YXR0R3JwT2Zmc2V0WzBdID0gMDsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+YXR0R3JwT2Zmc2V0WzFdID0gMDsKIAotICAgICAgZGVmYXVsdDoKLSAgICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgICAgIC0+Y250RmFkZUZyYW1lcy0tOyAvKiBkZWNyZWFzZSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0FwcGx5RmFkZU91dCgpIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZWFzZSwgYWNjb3JkaW5nbHkgKi8KKyAgICAgICAgICAgICAgLyogbW9kZSAwIGp1c3QgdXBkYXRlcyB0aGUgRmFkaW5nIGNvdW50ZXIgKi8KKyAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0FwcGx5RmFkZU91dCgKKyAgICAgICAgICAgICAgICAgIC8qbW9kZSA9Ki8wLCBwQ29uY2VhbG1lbnRJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBNVVRFICovCisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9NdXRlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOworICAgIH0gYnJlYWs7CiAKLSAgY2FzZSBDb25jZWFsTWV0aG9kSW50ZXI6Ci0gIGNhc2UgQ29uY2VhbE1ldGhvZFRvbmFsOgotICAgIHsKKyAgICBjYXNlIENvbmNlYWxNZXRob2RJbnRlcjoKKyAgICBjYXNlIENvbmNlYWxNZXRob2RUb25hbDogewogICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAhPSBDb25jZWFsU3RhdGVfT2spIHsKICAgICAgICAgLyogY291bnQgdGhlIHZhbGlkIGZyYW1lcyBkdXJpbmcgY29uY2VhbG1lbnQgcHJvY2VzcyAqLwotICAgICAgICBpZiAoIHBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzFdIHx8Ci0gICAgICAgICAgICAocENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMF0gJiYgIXBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzFdICYmIGZyYW1lT2spICkgewotICAgICAgICAgIC8qIFRoZSBmcmFtZSBpcyBPSyBldmVuIGlmIGl0IGNhbiBiZSBlc3RpbWF0ZWQgYnkgdGhlIGVuZXJneSBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobSAqLworICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0gfHwKKyAgICAgICAgICAgIChwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1swXSAmJgorICAgICAgICAgICAgICFwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXSAmJiBmcmFtZU9rKSkgeworICAgICAgICAgIC8qIFRoZSBmcmFtZSBpcyBPSyBldmVuIGlmIGl0IGNhbiBiZSBlc3RpbWF0ZWQgYnkgdGhlIGVuZXJneQorICAgICAgICAgICAqIGludGVycG9sYXRpb24gYWxnb3JpdGhtICovCiAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgKz0gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyAgPSAwOworICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID0gMDsKICAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvKiAtLSBTVEFURSBNQUNISU5FIGZvciBlbmVyZ3kgaW50ZXJwb2xhdGlvbiAtLSAqLwotICAgICAgc3dpdGNoIChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUpCi0gICAgICB7Ci0gICAgICBjYXNlIENvbmNlYWxTdGF0ZV9PazoKLSAgICAgICAgaWYgKCEocENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0gfHwKLSAgICAgICAgICAgICAocENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMF0gJiYgIXBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzFdICYmIGZyYW1lT2spKSkgewotICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgPiAwKSB7Ci0gICAgICAgICAgICAvKiBGYWRlIG91dCBvbmx5IGlmIHRoZSBlbmVyZ3kgaW50ZXJwb2xhdGlvbiBhbGdvcml0aG0gY2FuIG5vdCBiZSBhcHBsaWVkISAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlICAgPSBDb25jZWFsU3RhdGVfRmFkZU91dDsKKyAgICAgIHN3aXRjaCAocENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlKSB7CisgICAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX09rOgorICAgICAgICAgIGlmICghKHBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzFdIHx8CisgICAgICAgICAgICAgICAgKHBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzBdICYmCisgICAgICAgICAgICAgICAgICFwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXSAmJiBmcmFtZU9rKSkpIHsKKyAgICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICAgIC8qIEZhZGUgb3V0IG9ubHkgaWYgdGhlIGVuZXJneSBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobSBjYW4gbm90IGJlCisgICAgICAgICAgICAgICAqIGFwcGxpZWQhICovCisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9GYWRlT3V0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gMDsKKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDb25jZWFsU3RhdGVfU2luZ2xlOgorICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlT3V0OgorICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgKz0gMTsKKworICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyA+CisgICAgICAgICAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtSU4gKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX0ZhZGVJbjsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA9IGZpbmRFcXVpRmFkZUZyYW1lKAorICAgICAgICAgICAgICAgICAgcENvbmNlYWxDb21tb25EYXRhLCBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIC0gMSwKKyAgICAgICAgICAgICAgICAgIDAgLyogRmFkZU91dCAtPiBGYWRlSW4gKi8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE9LICovCisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9NdXRlOworICAgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0KKyAgICAgICAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMpIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgID0gMDsKLSAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX1NpbmdsZToKLSAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOwotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDb25jZWFsU3RhdGVfTXV0ZToKKyAgICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPgorICAgICAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bU11dGVSZWxlYXNlRnJhbWVzKSB7CisgICAgICAgICAgICBpZiAocENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMgPiAwKSB7CisgICAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBGQURFLUlOICovCisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9GYWRlSW47CisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPQorICAgICAgICAgICAgICAgICAgcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMgLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE9LICovCisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVPdXQ6Ci0gICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgKz0gMTsKKyAgICAgICAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZUluOgorICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgLT0KKyAgICAgICAgICAgICAgMTsgLyogdXNlZCB0byBhZGRyZXNzIHRoZSBmYWRlLWluIGZhY3RvcnMgKi8KIAotICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPiBwQ29uY2VhbENvbW1vbkRhdGEtPm51bU11dGVSZWxlYXNlRnJhbWVzKSB7Ci0gICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzID4gMCkgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtSU4gKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAgPSBDb25jZWFsU3RhdGVfRmFkZUluOwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA9IGZpbmRFcXVpRmFkZUZyYW1lKCBwQ29uY2VhbENvbW1vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBGYWRlT3V0IC0+IEZhZGVJbiAqLyk7CisgICAgICAgICAgaWYgKGZyYW1lT2sgfHwgcENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0pIHsKKyAgICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgICAgfQogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBGQURFLU9VVCAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfRmFkZU91dDsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA9IGZpbmRFcXVpRmFkZUZyYW1lKAorICAgICAgICAgICAgICAgICAgcENvbmNlYWxDb21tb25EYXRhLCBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzICsgMSwKKyAgICAgICAgICAgICAgICAgIDEgLyogRmFkZUluIC0+IEZhZGVPdXQgKi8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID49IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcykgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9NdXRlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBDb25jZWFsU3RhdGVfTXV0ZToKLSAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID4gcENvbmNlYWxDb21tb25EYXRhLT5udW1NdXRlUmVsZWFzZUZyYW1lcykgewotICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyA+IDApIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBGQURFLUlOICovCi0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfRmFkZUluOwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA9IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzIC0gMTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE9LICovCi0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlSW46Ci0gICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgLT0gMTsgIC8qIHVzZWQgdG8gYWRkcmVzcyB0aGUgZmFkZS1pbiBmYWN0b3JzICovCi0KLSAgICAgICAgaWYgKGZyYW1lT2sgfHwgcENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0pIHsKLSAgICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8IDApIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAocENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzID4gMCkgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtT1VUICovCi0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgID0gQ29uY2VhbFN0YXRlX0ZhZGVPdXQ7Ci0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gZmluZEVxdWlGYWRlRnJhbWUoIHBDb25jZWFsQ29tbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcysxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qIEZhZGVJbiAtPiBGYWRlT3V0ICovKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9NdXRlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgICBicmVhazsKICAgICAgIH0gLyogRW5kIHN3aXRjaChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUpICovCi0gICAgfQotICAgIGJyZWFrOworICAgIH0gYnJlYWs7CiAKLSAgZGVmYXVsdDoKLSAgICAvKiBEb24ndCBuZWVkIGEgc3RhdGUgbWFjaGluZSBmb3Igb3RoZXIgY29uY2VhbG1lbnQgbWV0aG9kcy4gKi8KLSAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogRG9uJ3QgbmVlZCBhIHN0YXRlIG1hY2hpbmUgZm9yIG90aGVyIGNvbmNlYWxtZW50IG1ldGhvZHMuICovCisgICAgICBicmVhazsKICAgfQotCiB9CiAKLQogLyohCiBcYnJpZWYgUmFuZG9taXplcyB0aGUgc2lnbiBvZiB0aGUgc3BlY3RyYWwgZGF0YQogCiAgIFRoZSBmdW5jdGlvbiB0b2dnbGVzIHRoZSBzaWduIG9mIHRoZSBzcGVjdHJhbCBkYXRhIHJhbmRvbWx5LiBUaGlzIGlzCiAgIHVzZWZ1bCB0byBlbnN1cmUgdGhlIHF1YWxpdHkgb2YgdGhlIGNvbmNlYWxlZCBmcmFtZXMuCi0KLVxyZXR1cm4gIG5vbmUKICAqLwotc3RhdGljCi12b2lkIENDb25jZWFsbWVudF9BcHBseVJhbmRvbVNpZ24gKGludCByYW5kb21QaGFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzUGVyRnJhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworc3RhdGljIHZvaWQgQ0NvbmNlYWxtZW50X0FwcGx5UmFuZG9tU2lnbihpbnQgcmFuZG9tUGhhc2UsIEZJWFBfREJMICpzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlc1BlckZyYW1lKSB7CiAgIGludCBpOwotICBVU0hPUlQgcGFja2VkU2lnbj0wOworICBVU0hPUlQgcGFja2VkU2lnbiA9IDA7CiAKLSAgLyogcmFuZG9tIHRhYmxlIDUxMngxNmJpdCBoYXMgYmVlbiByZWR1Y2VkIHRvIDUxMiBwYWNrZWQgc2lnbiBiaXRzID0gMzJ4MTYgYml0ICovCisgIC8qIHJhbmRvbSB0YWJsZSA1MTJ4MTZiaXQgaGFzIGJlZW4gcmVkdWNlZCB0byA1MTIgcGFja2VkIHNpZ24gYml0cyA9IDMyeDE2IGJpdAorICAgKi8KIAogICAvKiByZWFkIGN1cnJlbnQgcGFja2VkIHNpZ24gd29yZCAqLwotICBwYWNrZWRTaWduID0gcmFuZG9tU2lnbltyYW5kb21QaGFzZT4+NF07Ci0gIHBhY2tlZFNpZ24gPj49IChyYW5kb21QaGFzZSYweGYpOworICBwYWNrZWRTaWduID0gQWFjRGVjX3JhbmRvbVNpZ25bcmFuZG9tUGhhc2UgPj4gNF07CisgIHBhY2tlZFNpZ24gPj49IChyYW5kb21QaGFzZSAmIDB4Zik7CiAKLSAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXNQZXJGcmFtZSA7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlc1BlckZyYW1lOyBpKyspIHsKICAgICBpZiAoKHJhbmRvbVBoYXNlICYgMHhmKSA9PSAwKSB7Ci0gICAgICBwYWNrZWRTaWduID0gcmFuZG9tU2lnbltyYW5kb21QaGFzZT4+NF07CisgICAgICBwYWNrZWRTaWduID0gQWFjRGVjX3JhbmRvbVNpZ25bcmFuZG9tUGhhc2UgPj4gNF07CiAgICAgfQogCiAgICAgaWYgKHBhY2tlZFNpZ24gJiAweDEpIHsKQEAgLTE3NjcsNTMgKzE2MjYsNiBAQAogICB9CiB9CiAKLQotLyohCi0gIFxicmllZiBHZXQgZmFkZWluZyBmYWN0b3IgZm9yIGN1cnJlbnQgY29uY2VhbG1lbnQgc3RhdGUuCi0KLSAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZhY3RvciB1c2VkIGZvciBmYWRpbmcgdGhhdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IGludGVybmFsIHN0YXRlLgotCi0gIFxyZXR1cm4gRmFkZSBmYWN0b3IKLSAqLwotRklYUF9EQkwKLSAgQ0NvbmNlYWxtZW50X0dldEZhZGVGYWN0b3IgKAotICAgICAgQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKLSAgICAgIGNvbnN0IGludCBmUHJldmlvdXNGYWN0b3IKLSAgKQotewotICBGSVhQX0RCTCBmYWMgPSAoRklYUF9EQkwpMDsKLQotICBDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhID0gaENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXM7Ci0KLSAgaWYgKGhDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zLT5tZXRob2QgPiBDb25jZWFsTWV0aG9kTXV0ZSkgewotICAgIHN3aXRjaCAoaENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlKSB7Ci0gICAgICBkZWZhdWx0OgotICAgICAgY2FzZSBDb25jZWFsU3RhdGVfTXV0ZToKLSAgICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDb25jZWFsU3RhdGVfT2s6Ci0gICAgICAgIGZhYyA9IChGSVhQX0RCTClNQVhWQUxfREJMOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX1NpbmdsZToKLSAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVPdXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgaWR4ID0gaENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyAtICgoZlByZXZpb3VzRmFjdG9yICE9IDApID8gMSA6IDApOwotICAgICAgICAgIGZhYyA9IChpZHggPCAwKSA/IChGSVhQX0RCTClNQVhWQUxfREJMIDogRlhfU0dMMkZYX0RCTChwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbaWR4XSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlSW46Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgaWR4ID0gaENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyArICgoZlByZXZpb3VzRmFjdG9yICE9IDApID8gMSA6IDApOwotICAgICAgICAgIGZhYyA9IChpZHggPj0gaENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXMtPm51bUZhZGVJbkZyYW1lcykgPyAoRklYUF9EQkwpMCA6IEZYX1NHTDJGWF9EQkwocENvbmNlYWxDb21tb25EYXRhLT5mYWRlSW5GYWN0b3JbaWR4XSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIChmYWMpOwotfQotCi0KIC8qIQogICBcYnJpZWYgR2V0IGZhZGVpbmcgZmFjdG9yIGZvciBjdXJyZW50IGNvbmNlYWxtZW50IHN0YXRlLgogCkBAIC0xODIzLDEyICsxNjM1LDggQEAKIAogICBccmV0dXJuIEZyYW1lIE9LIGZsYWcgb2YgcHJldmlvdXMgZnJhbWUuCiAgKi8KLWludAotICBDQ29uY2VhbG1lbnRfR2V0TGFzdEZyYW1lT2sgKAotICAgICAgQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKLSAgICAgIGNvbnN0IGludCBmQmVmb3JlQXBwbHkKLSAgKQoteworaW50IENDb25jZWFsbWVudF9HZXRMYXN0RnJhbWVPayhDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZkJlZm9yZUFwcGx5KSB7CiAgIGludCBwcmV2RnJhbWVPayA9IDE7CiAKICAgaWYgKGhDb25jZWFsbWVudEluZm8gIT0gTlVMTCkgewpAQCAtMTgzOSwyOCArMTY0Nyw0NDggQEAKIH0KIAogLyohCi0gIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBkZWxheSBmcmFtZXMgaW50cm9kdWNlZCBieSBjb25jZWFsbWVudCB0ZWNobmlxdWUuIAorICBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgZGVsYXkgZnJhbWVzIGludHJvZHVjZWQgYnkgY29uY2VhbG1lbnQgdGVjaG5pcXVlLgogCiAgIFxyZXR1cm4gTnVtYmVyIG9mIGRlbGF5IGZyYW1lcy4KICAqLwotVUlOVAotICBDQ29uY2VhbG1lbnRfR2V0RGVsYXkgKAotICAgICAgQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YQotICApCi17CitVSU5UIENDb25jZWFsbWVudF9HZXREZWxheShDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhKSB7CiAgIFVJTlQgZnJhbWVEZWxheSA9IDA7CiAKICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YSAhPSBOVUxMKSB7CiAgICAgc3dpdGNoIChwQ29uY2VhbENvbW1vbkRhdGEtPm1ldGhvZCkgewotICAgIGNhc2UgQ29uY2VhbE1ldGhvZFRvbmFsOgotICAgIGNhc2UgQ29uY2VhbE1ldGhvZEludGVyOgotICAgICAgZnJhbWVEZWxheSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7CisgICAgICBjYXNlIENvbmNlYWxNZXRob2RUb25hbDoKKyAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZEludGVyOgorICAgICAgICBmcmFtZURlbGF5ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKICAgICB9CiAgIH0KIAogICByZXR1cm4gZnJhbWVEZWxheTsKIH0KIAorc3RhdGljIGludCBDQ29uY2VhbG1lbnRfQXBwbHlGYWRlT3V0KAorICAgIGludCBtb2RlLCBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbG1lbnRJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbykgeworICAvKiBtb2RlIDEgPSBhcHBseSBSYW5kb21TaWduIGFuZCBtdXRlIHNwZWN0cmFsIGNvZWZmaWNpZW50cyBpZiBuZWNlc3NhcnksICAqCisgICAqIG1vZGUgMCA9IFVwZGF0ZSBjbnRGYWRlRnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIC8qIHJlc3RvcmUgZnJlcXVlbmN5IGNvZWZmaWNpZW50cyBmcm9tIGJ1ZmZlciB3aXRoIGEgc3BlY2lmaWMgbXV0aW5nICovCisgIGludCBzcmNXaW4sIGRzdFdpbiwgbnVtV2luZG93cyA9IDE7CisgIGludCB3aW5kb3dMZW4gPSBzYW1wbGVzUGVyRnJhbWU7CisgIGludCBzcmNHcnBTdGFydCA9IDA7CisgIGludCB3aW5JZHhTdHJpZGUgPSAxOworICBpbnQgbnVtV2luR3JwUGVyRmFjLCBhdHRJZHgsIGF0dElkeFN0cmlkZTsKKyAgaW50IGk7CisgIGludCBhcHBsaWVkUHJvY2Vzc2luZyA9IDA7CisKKyAgQ0ljc0luZm8gKnBJY3NJbmZvID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm87CisgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpOworICBTSE9SVCAqcFNwZWNTY2FsZSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZTsKKworICAvKiBzZXQgb2xkIHdpbmRvdyBwYXJhbWV0ZXJzICovCisgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5sYXN0UmVuZGVyTW9kZSA9PSBBQUNERUNfUkVOREVSX0xQRCkgeworICAgIHN3aXRjaCAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGRfbW9kZSkgeworICAgICAgY2FzZSAxOgorICAgICAgICBudW1XaW5kb3dzID0gNDsKKyAgICAgICAgc3JjR3JwU3RhcnQgPSAzOworICAgICAgICB3aW5kb3dMZW4gPSBzYW1wbGVzUGVyRnJhbWUgPj4gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIG51bVdpbmRvd3MgPSAyOworICAgICAgICBzcmNHcnBTdGFydCA9IDE7CisgICAgICAgIHdpbmRvd0xlbiA9IHNhbXBsZXNQZXJGcmFtZSA+PiAxOworICAgICAgICB3aW5JZHhTdHJpZGUgPSAyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgbnVtV2luZG93cyA9IDE7CisgICAgICAgIHNyY0dycFN0YXJ0ID0gMDsKKyAgICAgICAgd2luZG93TGVuID0gc2FtcGxlc1BlckZyYW1lOworICAgICAgICB3aW5JZHhTdHJpZGUgPSA0OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcENvbmNlYWxtZW50SW5mby0+bGFzdFdpbkdycExlbiA9IDE7CisgIH0gZWxzZSB7CisgICAgcEljc0luZm8tPldpbmRvd1NoYXBlID0gcENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7CisgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gcENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2U7CisKKyAgICBpZiAocENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPT0gQkxPQ0tfU0hPUlQpIHsKKyAgICAgIC8qIHNob3J0IGJsb2NrIGhhbmRsaW5nICovCisgICAgICBudW1XaW5kb3dzID0gODsKKyAgICAgIHdpbmRvd0xlbiA9IHNhbXBsZXNQZXJGcmFtZSA+PiAzOworICAgICAgc3JjR3JwU3RhcnQgPSBudW1XaW5kb3dzIC0gcENvbmNlYWxtZW50SW5mby0+bGFzdFdpbkdycExlbjsKKyAgICB9CisgIH0KKworICBhdHRJZHhTdHJpZGUgPQorICAgICAgZk1heCgxLCAoaW50KShudW1XaW5kb3dzIC8gKHBDb25jZWFsbWVudEluZm8tPmxhc3RXaW5HcnBMZW4gKyAxKSkpOworCisgIC8qIGxvYWQgbGFzdCBzdGF0ZSAqLworICBhdHRJZHggPSBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzOworICBudW1XaW5HcnBQZXJGYWMgPSBwQ29uY2VhbG1lbnRJbmZvLT5hdHRHcnBPZmZzZXRbbW9kZV07CisgIHNyY1dpbiA9IHNyY0dycFN0YXJ0ICsgcENvbmNlYWxtZW50SW5mby0+d2luR3JwT2Zmc2V0W21vZGVdOworCisgIEZES19BU1NFUlQoKHNyY0dycFN0YXJ0ICogd2luZG93TGVuICsgd2luZG93TGVuKSA8PSBzYW1wbGVzUGVyRnJhbWUpOworICBGREtfQVNTRVJUKChzcmNXaW4gKiB3aW5kb3dMZW4gKyB3aW5kb3dMZW4pIDw9IDEwMjQpOworCisgIGZvciAoZHN0V2luID0gMDsgZHN0V2luIDwgbnVtV2luZG93czsgZHN0V2luICs9IDEpIHsKKyAgICBGSVhQX0NOQ0wgKnBDbmNsID0KKyAgICAgICAgcENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCArIChzcmNXaW4gKiB3aW5kb3dMZW4pOworICAgIEZJWFBfREJMICpwT3V0ID0gcFNwZWN0cmFsQ29lZmZpY2llbnQgKyAoZHN0V2luICogd2luZG93TGVuKTsKKworICAgIGlmIChtb2RlID09IDEpIHsKKyAgICAgIC8qIG11dGUgaWYgYXR0SWR4IGdldHMgbGFyZ2UgZW5hdWdoICovCisgICAgICBpZiAoYXR0SWR4ID4gcENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXMtPm51bUZhZGVPdXRGcmFtZXMpIHsKKyAgICAgICAgRkRLbWVtY2xlYXIocENuY2wsIHNpemVvZihGSVhQX0RCTCkgKiB3aW5kb3dMZW4pOworICAgICAgfQorCisgICAgICAvKiByZXN0b3JlIGZyZXF1ZW5jeSBjb2VmZmljaWVudHMgZnJvbSBidWZmZXIgLSBhdHRlbnVhdGlvbiBpcyBkb25lIGxhdGVyCisgICAgICAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3aW5kb3dMZW47IGkrKykgeworICAgICAgICBwT3V0W2ldID0gcENuY2xbaV07CisgICAgICB9CisKKyAgICAgIC8qIGFwcGx5IHJhbmRvbSBjaGFuZ2Ugb2Ygc2lnbiBmb3Igc3BlY3RyYWwgY29lZmZpY2llbnRzICovCisgICAgICBDQ29uY2VhbG1lbnRfQXBwbHlSYW5kb21TaWduKHBDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSwgcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93TGVuKTsKKworICAgICAgLyogSW5jcmVtZW50IHJhbmRvbSBwaGFzZSBpbmRleCB0byBhdm9pZCByZXBldGl0aW9uIGFydGlmYWN0cy4gKi8KKyAgICAgIHBDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSA9CisgICAgICAgICAgKHBDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSArIDEpICYgKEFBQ19ORl9OT19SQU5ET01fVkFMIC0gMSk7CisKKyAgICAgIC8qIHNldCBvbGQgc2NhbGUgZmFjdG9ycyAqLworICAgICAgcFNwZWNTY2FsZVtkc3RXaW4gKiB3aW5JZHhTdHJpZGVdID0KKyAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGVbc3JjV2luICogd2luSWR4U3RyaWRlXTsKKyAgICB9CisKKyAgICBzcmNXaW4gKz0gMTsKKworICAgIGlmIChzcmNXaW4gPj0gbnVtV2luZG93cykgeworICAgICAgLyogZW5kIG9mIHNlcXVlbmNlIC0+IHJld2luZCB0byBmaXJzdCB3aW5kb3cgb2YgZ3JvdXAgKi8KKyAgICAgIHNyY1dpbiA9IHNyY0dycFN0YXJ0OworICAgICAgbnVtV2luR3JwUGVyRmFjICs9IDE7CisgICAgICBpZiAobnVtV2luR3JwUGVyRmFjID49IGF0dElkeFN0cmlkZSkgeworICAgICAgICBudW1XaW5HcnBQZXJGYWMgPSAwOworICAgICAgICBhdHRJZHggKz0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBzdG9yZSBjdXJyZW50IHN0YXRlICovCisKKyAgcENvbmNlYWxtZW50SW5mby0+d2luR3JwT2Zmc2V0W21vZGVdID0gc3JjV2luIC0gc3JjR3JwU3RhcnQ7CisgIEZES19BU1NFUlQoKHBDb25jZWFsbWVudEluZm8tPndpbkdycE9mZnNldFttb2RlXSA+PSAwKSAmJgorICAgICAgICAgICAgIChwQ29uY2VhbG1lbnRJbmZvLT53aW5HcnBPZmZzZXRbbW9kZV0gPCA4KSk7CisgIHBDb25jZWFsbWVudEluZm8tPmF0dEdycE9mZnNldFttb2RlXSA9IG51bVdpbkdycFBlckZhYzsKKyAgRkRLX0FTU0VSVCgocENvbmNlYWxtZW50SW5mby0+YXR0R3JwT2Zmc2V0W21vZGVdID49IDApICYmCisgICAgICAgICAgICAgKHBDb25jZWFsbWVudEluZm8tPmF0dEdycE9mZnNldFttb2RlXSA8IGF0dElkeFN0cmlkZSkpOworCisgIGlmIChtb2RlID09IDApIHsKKyAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gYXR0SWR4OworICB9CisKKyAgYXBwbGllZFByb2Nlc3NpbmcgPSAxOworCisgIHJldHVybiBhcHBsaWVkUHJvY2Vzc2luZzsKK30KKworLyohCisgIFxicmllZiBEbyBUaW1lIGRvbWFpbiBmYWRpbmcgKFRERmFkaW5nKSBpbiBjb25jZWFsbWVudCBjYXNlCisKKyAgSW4gY2FzZSBvZiBjb25jZWFsbWVudCwgdGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIHRoZSBmYWRpbmcsIGFmdGVyIHRpbWUKK2RvbWFpbiBzaWduYWwgaGFzIGJlZW4gcmVuZGVyZWQgYnkgdGhlIHJlc3BlY3RpdmUgc2lnbmFsIHJlbmRlcmluZyBmdW5jdGlvbnMuCisgIFRoZSBmYWRpbmcgb3V0IGluIGNhc2Ugb2YgQUNFTFAgZGVjb2RpbmcgaXMgbm90IGRvbmUgYnkgdGhpcyBmdW5jdGlvbiBidXQgYnkKK3RoZSBBQ0VMUCBkZWNvZGVyIGZvciB0aGUgZmlyc3QgY29uY2VhbGVkIGZyYW1lIGlmIENPTkNFQUxfQ09SRV9JR05PUkFOVF9GQURFIGlzCitub3Qgc2V0LgorCisgIFRpbWVEb21haW4gZmFkaW5nIG5ldmVyIGNyZWF0ZXMganVtcHMgaW4gZW5lcmd5IC8gZGlzY29udGludWl0aWVzLCBpdCBhbHdheXMKK2RvZXMgYSBjb250aW51b3VzIGZhZGluZy4gVG8gYWNoaWV2ZSB0aGlzLCBmYWRpbmcgaXMgYWx3YXlzIGRvbmUgZnJvbSBhIHN0YXJ0aW5nCitwb2ludCB0byBhIHRhcmdldCBwb2ludCwgd2hpbGUgdGhlIHN0YXJ0aW5nIHBvaW50IGlzIGFsd2F5cyBkZXRlcm1pbmVkIHRvIGJlIHRoZQorbGFzdCB0YXJnZXQgcG9pbnQuIEJ5IHZhcnlpbmcgdGhlIHRhcmdldCBwb2ludCBvZiBhIGZhZGluZywgdGhlIGZhZGluZyBzbG9wZSBjYW4KK2JlIGNvbnRyb2xsZWQuCisKKyAgVGhpcyBwcmluY2lwbGUgaXMgYXBwbGllZCB0byB0aGUgZmFkaW5nIHdpdGhpbiBhIGZyYW1lIGFuZCB0aGUgZmFkaW5nIGZyb20KK2ZyYW1lIHRvIGZyYW1lLgorCisgIE9uZSBmcmFtZSBpcyBkaXZpZGVkIGludG8gOCBzdWJmcmFtZXMgdG8gb2J0YWluIDggcGFydHMgb2YgZmFkaW5nIHNsb3Blcword2l0aGluIGEgZnJhbWUsIGVhY2ggbWF5YmUgd2l0aCBpdHMgb3duIGdyYWRpZW50LgorCisgIFdvcmtmbG93OgorICAxLikgRGV0ZXJtaW5lIEZhZGluZyBiZWhhdmlvciBhbmQgZW5kLW9mLWZyYW1lIHRhcmdldCBmYWRpbmcgbGV2ZWwsIGJhc2VkIG9uCitjb25jZWFsbWVudFN0YXRlIChkZXRlcm1pbmVkIGJ5IENDb25jZWFsbWVudF9VcGRhdGVTdGF0ZSgpKSBhbmQgdGhlIGNvcmUgbW9kZS4KKyAgICAgICAgLSBCeSBfREVGQVVMVF8sCisgICAgICAgICAgVGhlIHRhcmdldCBmYWRpbmcgbGV2ZWwgaXMgZGV0ZXJtaW5lZCBieSBmYWRlT3V0RmFjdG9yW2NudEZhZGVGcmFtZXNdCitpbiBjYXNlIG9mIGZhZGVPdXQsIG9yIGZhZGVJbkZhY3RvcltjbnRGYWRlRnJhbWVzXSBpbiBjYXNlIG9mIGZhZGVJbi4KKyAgICAgICAgICAtLT4gZmFkaW5nIHR5cGUgaXMgRkFERV9USU1FRE9NQUlOIGluIHRoaXMgY2FzZS4gVGFyZ2V0IGZhZGluZyBsZXZlbAoraXMgZGV0ZXJtaW5lZCBieSBmYWRpbmcgaW5kZXggY250RmFkZUZyYW1lcy4KKworICAgICAgICAtIElmIGNvbmNlYWxtZW50U3RhdGUgaXMgc2lnbmFsbGluZyBhIF9NVVRFRCBTSUdOQUxfLAorICAgICAgICAgIFRERmFkaW5nIGRlY2F5cyB0byAwIHdpdGhpbiAxLzh0aCBvZiBhIGZyYW1lIGlmIG51bUZhZGVPdXRGcmFtZXMgPT0gMC4KKyAgICAgICAgICAtLT4gZmFkaW5nIHR5cGUgaXMgRkFERV9USU1FRE9NQUlOX1RPU1BFQ1RSQUxNVVRFIGluIHRoaXMgY2FzZS4KKworICAgICAgICAtIElmIGNvbmNlYWxtZW50U3RhdGUgaXMgc2lnbmFsbGluZyB0aGUgX0VORCBPRiBNVVRJTkdfLAorICAgICAgICAgIFRERmFkaW5nIGZhZGVzIHRvIHRhcmdldCBmYWRpbmcgbGV2ZWwgd2l0aGluIDEvOHRoIG9mIGEgZnJhbWUgaWYKK251bUZhZGVJbkZyYW1lcyA9PSAwLgorICAgICAgICAgIC0tPiBmYWRpbmcgdHlwZSBpcyBGQURFX1RJTUVET01BSU5fRlJPTVNQRUNUUkFMTVVURSBpbiB0aGlzIGNhc2UuCitUYXJnZXQgZmFkaW5nIGxldmVsIGlzIGRldGVybWluZWQgYnkgZmFkaW5nIGluZGV4IGNudEZhZGVGcmFtZXMuCisKKyNpZm5kZWYgQ09OQ0VBTF9DT1JFX0lHTk9SQU5UX0ZBREUKKyAgICAgICAgLSBJbiBjYXNlIG9mIGFuIF9BQ0VMUCBGQURFT1VUXywKKyAgICAgICAgICBUREZhZGluZyBsZWF2ZXMgZmFkaW5nIGNvbnRyb2wgdG8gQUNFTFAgZGVjb2RlciBmb3IgMS8yIGZyYW1lLgorICAgICAgICAgIC0tPiBmYWRpbmcgdHlwZSBpcyBGQURFX0FDRUxQRE9NQUlOIGluIHRoaXMgY2FzZS4KKyNlbmRpZgorCisgIDIuKSBSZW5kZXIgZmFkaW5nIGxldmVscyB3aXRoaW4gY3VycmVudCBmcmFtZSBhbmQgZG8gdGhlIGZpbmFsIGZhZGluZzoKKyAgICAgIE1hcCBGYWRpbmcgc2xvcGVzIHRvIGZhZGluZyBsZXZlbHMgYW5kIGFwcGx5IHRvIHRpbWUgZG9tYWluIHNpZ25hbC4KKworCisqLworCitJTlQgQ0NvbmNlYWxtZW50X1RERmFkaW5nKAorICAgIGludCBsZW4sIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKipwcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBGSVhQX1BDTSAqcGNtZGF0YSwgRklYUF9QQ00gKnBjbWRhdGFfMSkgeworICAvKgorICBEbyB0aGUgZmFkaW5nIGluIFRpbWUgZG9tYWluIGJhc2VkIG9uIGNvbmNlYWxtZW50IHN0YXRlcyBhbmQgY29yZSBtb2RlCisgICovCisgIEZJWFBfREJMIGZhZGVTdG9wLCBhdHRNdXRlID0gKEZJWFBfREJMKTA7CisgIGludCBpZHggPSAwLCBpaTsKKyAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyA9CisgICAgICAqcHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm87CisgIENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsbWVudEluZm8gPQorICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbzsKKyAgQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsUGFyYW1zID0gcENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXM7CisgIGNvbnN0IENDb25jZWFsbWVudFN0YXRlIGNvbmNlYWxTdGF0ZSA9IHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZTsKKyAgVERmYWRpbmdUeXBlIGZhZGluZ1R5cGU7CisgIEZJWFBfREJMIGZhZGluZ1N0YXRpb25zWzldID0gezB9OworICBpbnQgZmFkaW5nU3RlcHNbOF0gPSB7MH07CisgIGNvbnN0IEZJWFBfREJMIGZhZGVTdGFydCA9CisgICAgICBwQ29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgLT5mYWRlX29sZDsgLyogc3RhcnQgZmFkaW5nIGF0IGxhc3QgZW5kLW9mLWZyYW1lIGF0dGVudWF0aW9uICovCisgIEZJWFBfU0dMICpmYWRlRmFjdG9yID0gcENvbmNlYWxQYXJhbXMtPmZhZGVPdXRGYWN0b3I7CisgIGNvbnN0IElOVCBjbnRGYWRlRnJhbWVzID0gcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lczsKKyAgaW50IFRERmFkZU91dFN0b3BCZWZvcmVNdXRlID0gMTsKKyAgaW50IFRERmFkZUluU3RvcEJlZm9yZUZ1bGxMZXZlbCA9IDE7CisKKyAgLyoKKyAgZGV0ZXJtaW5lIEZhZGluZyBiZWhhdmlvdXIgKGVuZC1vZi1mcmFtZSBhdHRlbnVhdGlvbiBhbmQgZmFkaW5nIHR5cGUpICgxLikKKyAgKi8KKworICBzd2l0Y2ggKGNvbmNlYWxTdGF0ZSkgeworICAgIGNhc2UgQ29uY2VhbFN0YXRlX1NpbmdsZToKKyAgICBjYXNlIENvbmNlYWxTdGF0ZV9NdXRlOgorICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVPdXQ6CisgICAgICBpZHggPSAocENvbmNlYWxQYXJhbXMtPm1ldGhvZCA9PSBDb25jZWFsTWV0aG9kTm9pc2UpID8gY250RmFkZUZyYW1lcyAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjbnRGYWRlRnJhbWVzOworICAgICAgZmFkaW5nVHlwZSA9IEZBREVfVElNRURPTUFJTjsKKworICAgICAgaWYgKGNvbmNlYWxTdGF0ZSA9PSBDb25jZWFsU3RhdGVfTXV0ZSB8fAorICAgICAgICAgIChjbnRGYWRlRnJhbWVzICsgVERGYWRlT3V0U3RvcEJlZm9yZU11dGUpID4KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXMtPm51bUZhZGVPdXRGcmFtZXMpIHsKKyAgICAgICAgZmFkaW5nVHlwZSA9IEZBREVfVElNRURPTUFJTl9UT1NQRUNUUkFMTVVURTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZUluOgorICAgICAgaWR4ID0gY250RmFkZUZyYW1lczsKKyAgICAgIGlkeCAtPSBUREZhZGVJblN0b3BCZWZvcmVGdWxsTGV2ZWw7CisgICAgY2FzZSBDb25jZWFsU3RhdGVfT2s6CisgICAgICBmYWRlRmFjdG9yID0gcENvbmNlYWxQYXJhbXMtPmZhZGVJbkZhY3RvcjsKKyAgICAgIGlkeCA9IChjb25jZWFsU3RhdGUgPT0gQ29uY2VhbFN0YXRlX09rKSA/IC0xIDogaWR4OworICAgICAgZmFkaW5nVHlwZSA9IChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGVfb2xkID09IENvbmNlYWxTdGF0ZV9NdXRlKQorICAgICAgICAgICAgICAgICAgICAgICA/IEZBREVfVElNRURPTUFJTl9GUk9NU1BFQ1RSQUxNVVRFCisgICAgICAgICAgICAgICAgICAgICAgIDogRkFERV9USU1FRE9NQUlOOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICBmYWRpbmdUeXBlID0gRkFERV9USU1FRE9NQUlOX1RPU1BFQ1RSQUxNVVRFOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBkZXRlcm1pbmUgVGFyZ2V0IGVuZC1vZi1mcmFtZSBmYWRpbmcgbGV2ZWwgYW5kIGZhZGluZyBzbG9wZSAqLworICBzd2l0Y2ggKGZhZGluZ1R5cGUpIHsKKyAgICBjYXNlIEZBREVfVElNRURPTUFJTl9GUk9NU1BFQ1RSQUxNVVRFOgorICAgICAgZmFkZVN0b3AgPQorICAgICAgICAgIChpZHggPCAwKSA/IChGSVhQX0RCTClNQVhWQUxfREJMIDogRlhfU0dMMkZYX0RCTChmYWRlRmFjdG9yW2lkeF0pOworICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zLT5udW1GYWRlSW5GcmFtZXMgPT0gMCkgeworICAgICAgICAvKiBkbyBzdGVwIGFzIGZhc3QgYXMgcG9zc2libGUgKi8KKyAgICAgICAgZmFkaW5nU3RlcHNbMF0gPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIENDb25jZWFsbWVudF9UREZhZGluZ19kb0xpbmVhckZhZGluZ1N0ZXBzKCZmYWRpbmdTdGVwc1swXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZBREVfVElNRURPTUFJTjoKKyAgICAgIGZhZGVTdG9wID0KKyAgICAgICAgICAoaWR4IDwgMCkgPyAoRklYUF9EQkwpTUFYVkFMX0RCTCA6IEZYX1NHTDJGWF9EQkwoZmFkZUZhY3RvcltpZHhdKTsKKyAgICAgIENDb25jZWFsbWVudF9UREZhZGluZ19kb0xpbmVhckZhZGluZ1N0ZXBzKCZmYWRpbmdTdGVwc1swXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZBREVfVElNRURPTUFJTl9UT1NQRUNUUkFMTVVURToKKyAgICAgIGZhZGVTdG9wID0gYXR0TXV0ZTsKKyAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcy0+bnVtRmFkZU91dEZyYW1lcyA9PSAwKSB7CisgICAgICAgIC8qIGRvIHN0ZXAgYXMgZmFzdCBhcyBwb3NzaWJsZSAqLworICAgICAgICBmYWRpbmdTdGVwc1swXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ0NvbmNlYWxtZW50X1RERmFkaW5nX2RvTGluZWFyRmFkaW5nU3RlcHMoJmZhZGluZ1N0ZXBzWzBdKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyoKKyAgUmVuZGVyIGZhZGluZyBsZXZlbHMgd2l0aGluIGN1cnJlbnQgZnJhbWUgYW5kIGRvIHRoZSBmaW5hbCBmYWRpbmcgKDIuKQorICAqLworCisgIGxlbiA+Pj0gMzsKKyAgQ0NvbmNlYWxtZW50X1RERmFkZUZpbGxGYWRpbmdTdGF0aW9ucyhmYWRpbmdTdGF0aW9ucywgZmFkaW5nU3RlcHMsIGZhZGVTdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhZGVTdGFydCwgZmFkaW5nVHlwZSk7CisKKyAgaWYgKChmYWRpbmdTdGF0aW9uc1s4XSAhPSAoRklYUF9EQkwpTUFYVkFMX0RCTCkgfHwKKyAgICAgIChmYWRpbmdTdGF0aW9uc1s3XSAhPSAoRklYUF9EQkwpTUFYVkFMX0RCTCkgfHwKKyAgICAgIChmYWRpbmdTdGF0aW9uc1s2XSAhPSAoRklYUF9EQkwpTUFYVkFMX0RCTCkgfHwKKyAgICAgIChmYWRpbmdTdGF0aW9uc1s1XSAhPSAoRklYUF9EQkwpTUFYVkFMX0RCTCkgfHwKKyAgICAgIChmYWRpbmdTdGF0aW9uc1s0XSAhPSAoRklYUF9EQkwpTUFYVkFMX0RCTCkgfHwKKyAgICAgIChmYWRpbmdTdGF0aW9uc1szXSAhPSAoRklYUF9EQkwpTUFYVkFMX0RCTCkgfHwKKyAgICAgIChmYWRpbmdTdGF0aW9uc1syXSAhPSAoRklYUF9EQkwpTUFYVkFMX0RCTCkgfHwKKyAgICAgIChmYWRpbmdTdGF0aW9uc1sxXSAhPSAoRklYUF9EQkwpTUFYVkFMX0RCTCkgfHwKKyAgICAgIChmYWRpbmdTdGF0aW9uc1swXSAhPQorICAgICAgIChGSVhQX0RCTClNQVhWQUxfREJMKSkgLyogaWYgdGhlcmUncyBzb21ldGhpbmcgdG8gZmFkZSAqLworICB7CisgICAgaW50IHN0YXJ0ID0gMDsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCA4OyBpaSsrKSB7CisgICAgICBDQ29uY2VhbG1lbnRfVERGYWRlUGNtQXR0KHN0YXJ0LCBsZW4sIGZhZGluZ1N0YXRpb25zW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFkaW5nU3RhdGlvbnNbaWkgKyAxXSwgcGNtZGF0YSk7CisgICAgICBzdGFydCArPSBsZW47CisgICAgfQorICB9CisgIENDb25jZWFsbWVudF9URE5vaXNlX0FwcGx5KHBDb25jZWFsbWVudEluZm8sIGxlbiwgcGNtZGF0YSk7CisKKyAgLyogU2F2ZSBlbmQtb2YtZnJhbWUgYXR0ZW51YXRpb24gYW5kIGZhZGluZyB0eXBlICovCisgIHBDb25jZWFsbWVudEluZm8tPmxhc3RGYWRpbmdUeXBlID0gZmFkaW5nVHlwZTsKKyAgcENvbmNlYWxtZW50SW5mby0+ZmFkZV9vbGQgPSBmYWRlU3RvcDsKKyAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlX29sZCA9IGNvbmNlYWxTdGF0ZTsKKworICByZXR1cm4gMTsKK30KKworLyogYXR0ZW51YXRlIHBjbWRhdGEgaW4gVGltZSBEb21haW4gRmFkaW5nIHByb2Nlc3MgKi8KK3N0YXRpYyB2b2lkIENDb25jZWFsbWVudF9UREZhZGVQY21BdHQoaW50IHN0YXJ0LCBpbnQgbGVuLCBGSVhQX0RCTCBmYWRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGZhZGVTdG9wLCBGSVhQX1BDTSAqcGNtZGF0YSkgeworICBpbnQgaTsKKyAgRklYUF9EQkwgZFN0ZXA7CisgIEZJWFBfREJMIGRHYWluOworICBGSVhQX0RCTCBkR2Fpbl9hcHBseTsKKyAgaW50IGJpdHNoaWZ0ID0gKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMpOworCisgIC8qIHNldCBzdGFydCBlbmVyZ3kgKi8KKyAgZEdhaW4gPSBmYWRlU3RhcnQ7CisgIC8qIGRldGVybWluZSBlbmVyZ3kgc3RlcHMgZnJvbSBzYW1wbGUgdG8gc2FtcGxlICovCisgIGRTdGVwID0gKEZJWFBfREJMKSgoaW50KSgoZmFkZVN0YXJ0ID4+IDEpIC0gKGZhZGVTdG9wID4+IDEpKSAvIGxlbikgPDwgMTsKKworICBmb3IgKGkgPSBzdGFydDsgaSA8IChzdGFydCArIGxlbik7IGkrKykgeworICAgIGRHYWluIC09IGRTdGVwOworICAgIC8qIHByZXZlbnQgZ2FpbiBmcm9tIGdldHRpbmcgbmVnYXRpdmUgZHVlIHRvIHBvc3NpYmxlIGZpeHBvaW50IGluYWNjdXJhY2llcworICAgICAqLworICAgIGRHYWluX2FwcGx5ID0gZk1heCgoRklYUF9EQkwpMCwgZEdhaW4pOworICAgIC8qIGZpbmFsbHksIGF0dGVudWF0ZSBzYW1wbGVzICovCisgICAgcGNtZGF0YVtpXSA9IChGSVhQX1BDTSkoKGZNdWx0KHBjbWRhdGFbaV0sIChkR2Fpbl9hcHBseSkpKSA+PiBiaXRzaGlmdCk7CisgIH0KK30KKworLyoKK1xicmllZiBGaWxsIEZhZGluZ1N0YXRpb25zCisKK1RoZSBmYWRpbmdzdGF0aW9ucyBhcmUgdGhlIGF0dGVudWF0aW9uIGZhY3RvcnMsIGJlaW5nIGFwcGxpZWQgdG8gaXRzIGRlZGljYXRlZAorcG9ydGlvbnMgb2YgcGNtIGRhdGEuIFRoZXkgYXJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGZhZGluZ3N0ZXBzLiBPbmUgZmFkaW5nc3RlcAoraXMgdGhlIHdlaWdodGVkIGNvbnRyaWJ1dGlvbiB0byB0aGUgZmFkaW5nIHNsb3BlIHdpdGhpbiBpdHMgZGVkaWNhdGVkIHBvcnRpb24gb2YKK3BjbSBkYXRhLgorCisqRmFkaW5nc3RlcHMgIDogICAgICAwICAwICAwICAxICAwICAxICAyICAwCisKKyAgICAgICAgICAgICAgICAgIHw8LSAgMSBGcmFtZSBwY20gZGF0YSAtPnwKKyAgICAgIGZhZGVTdGFydC0tPnxfX19fX19fX19fICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgIF4gIF4gIF4gIF4gXF9fX18gICAgICAgIHwKKyBBdHRlbnVhdGlvbiAgOiAgIHwgIHwgIHwgIHwgIF4gIF5cX18gICAgIHwKKyAgICAgICAgICAgICAgICAgIHwgIHwgIHwgIHwgIHwgIHwgIF5cICAgIHwKKyAgICAgICAgICAgICAgICAgIHwgIHwgIHwgIHwgIHwgIHwgIHwgXF9fX3w8LS0gZmFkZVN0b3AKKyAgICAgICAgICAgICAgICAgIHwgIHwgIHwgIHwgIHwgIHwgIHwgIF4gIF4KKyAgICAgICAgICAgICAgICAgIHwgIHwgIHwgIHwgIHwgIHwgIHwgIHwgIHwKK0ZhZGluZ3N0YXRpb25zOiAgWzBdWzFdWzJdWzNdWzRdWzVdWzZdWzddWzhdCisKKyhGYWRpbmdzdGF0aW9ucyAiWzBdIiBpcyAiWzhdIGZyb20gcHJldmlvdXMgZnJhbWUiLCB0aGVyZWZvcmUgaXRzIG5vdCBtZWFuaW5nZnVsCit0byBiZSBlZGl0ZWQpCisKKyovCitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfVERGYWRlRmlsbEZhZGluZ1N0YXRpb25zKEZJWFBfREJMICpmYWRpbmdTdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmYWRpbmdTdGVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZmFkZVN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGZhZGVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVERmYWRpbmdUeXBlIGZhZGluZ1R5cGUpIHsKKyAgaW50IGk7CisgIElOVCBmYWRpbmdTdGVwc19zdW0gPSAwOworICBJTlQgZmFkZURpZmY7CisKKyAgZmFkaW5nU3RlcHNfc3VtID0gZmFkaW5nU3RlcHNbMF0gKyBmYWRpbmdTdGVwc1sxXSArIGZhZGluZ1N0ZXBzWzJdICsKKyAgICAgICAgICAgICAgICAgICAgZmFkaW5nU3RlcHNbM10gKyBmYWRpbmdTdGVwc1s0XSArIGZhZGluZ1N0ZXBzWzVdICsKKyAgICAgICAgICAgICAgICAgICAgZmFkaW5nU3RlcHNbNl0gKyBmYWRpbmdTdGVwc1s3XTsKKyAgZmFkZURpZmYgPSAoKElOVCkoZmFkZVN0b3AgLSBmYWRlU3RhcnQpIC8gZk1heChmYWRpbmdTdGVwc19zdW0sIChJTlQpMSkpOworICBmYWRpbmdTdGF0aW9uc1swXSA9IGZhZGVTdGFydDsKKyAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworICAgIGZhZGluZ1N0YXRpb25zW2ldID0KKyAgICAgICAgZmFkaW5nU3RhdGlvbnNbaSAtIDFdICsgKEZJWFBfREJMKShmYWRlRGlmZiAqIGZhZGluZ1N0ZXBzW2kgLSAxXSk7CisgIH0KKyAgZmFkaW5nU3RhdGlvbnNbOF0gPSBmYWRlU3RvcDsKK30KKworc3RhdGljIHZvaWQgQ0NvbmNlYWxtZW50X1RERmFkaW5nX2RvTGluZWFyRmFkaW5nU3RlcHMoaW50ICpmYWRpbmdTdGVwcykgeworICBmYWRpbmdTdGVwc1swXSA9IGZhZGluZ1N0ZXBzWzFdID0gZmFkaW5nU3RlcHNbMl0gPSBmYWRpbmdTdGVwc1szXSA9CisgICAgICBmYWRpbmdTdGVwc1s0XSA9IGZhZGluZ1N0ZXBzWzVdID0gZmFkaW5nU3RlcHNbNl0gPSBmYWRpbmdTdGVwc1s3XSA9IDE7Cit9CisKKy8qIGVuZCBvZiBUaW1lRG9tYWluRmFkaW5nIGZ1bmN0aW9ucyAqLworCisvKiBkZXJpdmVkIGZyb20gaW50IFVzYWNSYW5kb21TaWduKCkgKi8KK3N0YXRpYyBpbnQgQ0NvbmNlYWxtZW50X1RETm9pc2VfUmFuZG9tKFVMT05HICpzZWVkKSB7CisgICpzZWVkID0gKFVMT05HKSgoKFVJTlQ2NCkoKnNlZWQpICogNjkwNjkpICsgNSk7CisgIHJldHVybiAoaW50KSgqc2VlZCk7Cit9CisKK3N0YXRpYyB2b2lkIENDb25jZWFsbWVudF9URE5vaXNlX0FwcGx5KENDb25jZWFsbWVudEluZm8gKmNvbnN0IHBDb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGVuLCBGSVhQX1BDTSAqY29uc3QgcGNtZGF0YSkgeworICBGSVhQX1BDTSAqc3RhdGVzID0gcENvbmNlYWxtZW50SW5mby0+VEROb2lzZVN0YXRlczsKKyAgRklYUF9QQ00gbm9pc2VWYWw7CisgIEZJWFBfREJMIG5vaXNlVmFsTG9uZzsKKyAgRklYUF9TR0wgKmNvZWYgPSBwQ29uY2VhbG1lbnRJbmZvLT5URE5vaXNlQ29lZjsKKyAgRklYUF9EQkwgVEROb2lzZUF0dDsKKyAgVUxPTkcgc2VlZCA9IHBDb25jZWFsbWVudEluZm8tPlRETm9pc2VTZWVkID0KKyAgICAgIChVTE9ORylDQ29uY2VhbG1lbnRfVEROb2lzZV9SYW5kb20oJnBDb25jZWFsbWVudEluZm8tPlRETm9pc2VTZWVkKSArIDE7CisKKyAgVEROb2lzZUF0dCA9IHBDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zLT5jb21mb3J0Tm9pc2VMZXZlbDsKKworICBpbnQgaWk7CisKKyAgaWYgKChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgIT0gQ29uY2VhbFN0YXRlX09rIHx8CisgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlX29sZCAhPSBDb25jZWFsU3RhdGVfT2spICYmCisgICAgICBURE5vaXNlQXR0ICE9IChGSVhQX0RCTCkwKSB7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgKGxlbiA8PCAzKTsgaWkrKykgeworICAgICAgLyogY3JlYXRlIGZpbHRlcmVkIG5vaXNlICovCisgICAgICBzdGF0ZXNbMl0gPSBzdGF0ZXNbMV07CisgICAgICBzdGF0ZXNbMV0gPSBzdGF0ZXNbMF07CisgICAgICBzdGF0ZXNbMF0gPSAoKEZJWFBfUENNKUNDb25jZWFsbWVudF9URE5vaXNlX1JhbmRvbSgmc2VlZCkpOworICAgICAgbm9pc2VWYWxMb25nID0gZk11bHQoc3RhdGVzWzBdLCBjb2VmWzBdKSArIGZNdWx0KHN0YXRlc1sxXSwgY29lZlsxXSkgKworICAgICAgICAgICAgICAgICAgICAgZk11bHQoc3RhdGVzWzJdLCBjb2VmWzJdKTsKKyAgICAgIG5vaXNlVmFsID0gRlhfREJMMkZYX1BDTShmTXVsdChub2lzZVZhbExvbmcsIFRETm9pc2VBdHQpKTsKKworICAgICAgLyogYWRkIGZpbHRlcmVkIG5vaXNlIC0gY2hlY2sgZm9yIGNsaXBwaW5nLCBiZWZvcmUgKi8KKyAgICAgIGlmIChub2lzZVZhbCA+IChGSVhQX1BDTSkwICYmCisgICAgICAgICAgcGNtZGF0YVtpaV0gPiAoRklYUF9QQ00pTUFYVkFMX0ZJWFBfUENNIC0gbm9pc2VWYWwpIHsKKyAgICAgICAgbm9pc2VWYWwgPSBub2lzZVZhbCAqIChGSVhQX1BDTSktMTsKKyAgICAgIH0gZWxzZSBpZiAobm9pc2VWYWwgPCAoRklYUF9QQ00pMCAmJgorICAgICAgICAgICAgICAgICBwY21kYXRhW2lpXSA8IChGSVhQX1BDTSlNSU5WQUxfRklYUF9QQ00gLSBub2lzZVZhbCkgeworICAgICAgICBub2lzZVZhbCA9IG5vaXNlVmFsICogKEZJWFBfUENNKS0xOworICAgICAgfQorCisgICAgICBwY21kYXRhW2lpXSArPSBub2lzZVZhbDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvY29uY2VhbC5oIGIvbGliQUFDZGVjL3NyYy9jb25jZWFsLmgKaW5kZXggMjBlNjc0Zi4uZTAxYTc5NiAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9jb25jZWFsLmgKKysrIGIvbGliQUFDZGVjL3NyYy9jb25jZWFsLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNzAgKzkwLDYzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBpbmRlcGVuZGVudCBjaGFubmVsIGNvbmNlYWxtZW50CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX0NPTkNFQUxfSF8KLSNkZWZpbmUgX0NPTkNFQUxfSF8KLQotI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisjaWZuZGVmIENPTkNFQUxfSAorI2RlZmluZSBDT05DRUFMX0gKIAogI2luY2x1ZGUgImNoYW5uZWxpbmZvLmgiCiAKLSNkZWZpbmUgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCAoIDB4RkZGRSApCisjZGVmaW5lIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQgKDB4RkZGRSkKIAotdm9pZCBDQ29uY2VhbG1lbnRfSW5pdENvbW1vbkRhdGEgIChDQ29uY2VhbFBhcmFtcyAgICpwQ29uY2VhbENvbW1vbkRhdGEpOwordm9pZCBDQ29uY2VhbG1lbnRfSW5pdENvbW1vbkRhdGEoQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSk7CiAKLXZvaWQgQ0NvbmNlYWxtZW50X0luaXRDaGFubmVsRGF0YSAoQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxQYXJhbXMgICAqcENvbmNlYWxDb21tb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHNhbXBsZXNQZXJGcmFtZSk7Cit2b2lkIENDb25jZWFsbWVudF9Jbml0Q2hhbm5lbERhdGEoQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0RFQ19SRU5ERVJfTU9ERSBpbml0UmVuZGVyTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlc1BlckZyYW1lKTsKIAotQ0NvbmNlYWxtZW50TWV0aG9kCi0gICAgIENDb25jZWFsbWVudF9HZXRNZXRob2QgICAgICAgKENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEpOworQ0NvbmNlYWxtZW50TWV0aG9kIENDb25jZWFsbWVudF9HZXRNZXRob2QoQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSk7CiAKLVVJTlQKLSAgQ0NvbmNlYWxtZW50X0dldERlbGF5ICAgICAgICAgICAoQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSk7CitVSU5UIENDb25jZWFsbWVudF9HZXREZWxheShDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhKTsKIAogQUFDX0RFQ09ERVJfRVJST1IKLSAgICAgQ0NvbmNlYWxtZW50X1NldFBhcmFtcyAgICAgICAoQ0NvbmNlYWxQYXJhbXMgKmNvbmNlYWxQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGZhZGVPdXRTbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBmYWRlSW5TbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtdXRlUmVsZWFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBjb21mTm9pc2VMZXZlbCk7CitDQ29uY2VhbG1lbnRfU2V0UGFyYW1zKENDb25jZWFsUGFyYW1zICpjb25jZWFsUGFyYW1zLCBpbnQgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmFkZU91dFNsb3BlLCBpbnQgZmFkZUluU2xvcGUsIGludCBtdXRlUmVsZWFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgY29tZk5vaXNlTGV2ZWwpOwogCi1DQ29uY2VhbG1lbnRTdGF0ZQotICAgICBDQ29uY2VhbG1lbnRfR2V0U3RhdGUgICAgICAgIChDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvKTsKK0NDb25jZWFsbWVudFN0YXRlIENDb25jZWFsbWVudF9HZXRTdGF0ZShDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvKTsKIAogQUFDX0RFQ09ERVJfRVJST1IKLSAgICAgQ0NvbmNlYWxtZW50X1NldEF0dGVudWF0aW9uICAoQ0NvbmNlYWxQYXJhbXMgKmNvbmNlYWxQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpmYWRlSW5BdHRlbnVhdGlvblZlY3Rvcik7CitDQ29uY2VhbG1lbnRfU2V0QXR0ZW51YXRpb24oQ0NvbmNlYWxQYXJhbXMgKmNvbmNlYWxQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKmZhZGVPdXRBdHRlbnVhdGlvblZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAqZmFkZUluQXR0ZW51YXRpb25WZWN0b3IpOwogCi12b2lkIENDb25jZWFsbWVudF9TdG9yZSAgICAgICAgICAgKENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKTsKK3ZvaWQgQ0NvbmNlYWxtZW50X1N0b3JlKAorICAgIENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8sCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKTsKIAotaW50ICBDQ29uY2VhbG1lbnRfQXBwbHkgICAgICAgICAgIChDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgbGFzdExwZE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBGcmFtZU9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzKTsKK2ludCBDQ29uY2VhbG1lbnRfQXBwbHkoCisgICAgQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsCisgICAgY29uc3QgVUNIQVIgbGFzdExwZE1vZGUsIGNvbnN0IGludCBGcmFtZU9rLCBjb25zdCBVSU5UIGZsYWdzKTsKIAotRklYUF9EQkwKLSAgICAgQ0NvbmNlYWxtZW50X0dldEZhZGVGYWN0b3IgICAoQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZQcmV2aW91c0ZhY3Rvcik7CitpbnQgQ0NvbmNlYWxtZW50X0dldExhc3RGcmFtZU9rKENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmQmVmb3JlQXBwbHkpOwogCi1pbnQgIENDb25jZWFsbWVudF9HZXRMYXN0RnJhbWVPayAgKENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmQmVmb3JlQXBwbHkpOworSU5UIENDb25jZWFsbWVudF9UREZhZGluZygKKyAgICBpbnQgbGVuLCBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICoqcHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgRklYUF9QQ00gKnBjbWRhdGEsIEZJWFBfUENNICpwY21kYXRhXzEpOwogCi0jZW5kaWYgLyogI2lmbmRlZiBfQ09OQ0VBTF9IXyAqLworI2VuZGlmIC8qICNpZm5kZWYgQ09OQ0VBTF9IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2NvbmNlYWxfdHlwZXMuaCBiL2xpYkFBQ2RlYy9zcmMvY29uY2VhbF90eXBlcy5oCmluZGV4IDMxYmM2NDUuLmQ5MDM3NGUgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvY29uY2VhbF90eXBlcy5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvY29uY2VhbF90eXBlcy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQ4ICs5MCw0NSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCisKICAgIERlc2NyaXB0aW9uOiBFcnJvciBjb25jZWFsbWVudCBzdHJ1Y3RzIGFuZCB0eXBlcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIENPTkNFQUxfVFlQRVNfSAogI2RlZmluZSBDT05DRUFMX1RZUEVTX0gKIAotCi0KICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKICNpbmNsdWRlICJydmxjX2luZm8uaCIKIAorI2luY2x1ZGUgInVzYWNkZWNfbHBjLmgiCiAKLSNkZWZpbmUgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUyAgICAgICggMTYgKQorI2RlZmluZSBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTICgzMikKIAotICNkZWZpbmUgRklYUF9DTkNMICAgICAgICBGSVhQX0RCTAotICNkZWZpbmUgRkwyRlhDT05TVF9DTkNMICBGTDJGWENPTlNUX0RCTAotICNkZWZpbmUgRlhfREJMMkZYX0NOQ0wKLSAjZGVmaW5lIEZYX0NOQ0wyRlhfREJMCi0gI2RlZmluZSBDTkNMX0ZSQUNUX0JJVFMgIERGUkFDVF9CSVRTCisjZGVmaW5lIEZJWFBfQ05DTCBGSVhQX0RCTAorI2RlZmluZSBGTDJGWENPTlNUX0NOQ0wgRkwyRlhDT05TVF9EQkwKKyNkZWZpbmUgRlhfREJMMkZYX0NOQ0wKKyNkZWZpbmUgRlhfQ05DTDJGWF9EQkwKKyNkZWZpbmUgQ05DTF9GUkFDVF9CSVRTIERGUkFDVF9CSVRTCiAKIC8qIFdhcm5pbmc6IERvIG5vdCBldmVyIGNoYW5nZSB0aGVzZSB2YWx1ZXMuICovCi10eXBlZGVmIGVudW0KLXsKLSAgQ29uY2VhbE1ldGhvZE5vbmUgID0gLTEsCi0gIENvbmNlYWxNZXRob2RNdXRlICA9ICAwLAotICBDb25jZWFsTWV0aG9kTm9pc2UgPSAgMSwKLSAgQ29uY2VhbE1ldGhvZEludGVyID0gIDIsCi0gIENvbmNlYWxNZXRob2RUb25hbCA9ICAzCit0eXBlZGVmIGVudW0geworICBDb25jZWFsTWV0aG9kTm9uZSA9IC0xLAorICBDb25jZWFsTWV0aG9kTXV0ZSA9IDAsCisgIENvbmNlYWxNZXRob2ROb2lzZSA9IDEsCisgIENvbmNlYWxNZXRob2RJbnRlciA9IDIsCisgIENvbmNlYWxNZXRob2RUb25hbCA9IDMKIAogfSBDQ29uY2VhbG1lbnRNZXRob2Q7CiAKLQotdHlwZWRlZiBlbnVtCi17Cit0eXBlZGVmIGVudW0gewogICBDb25jZWFsU3RhdGVfT2ssCiAgIENvbmNlYWxTdGF0ZV9TaW5nbGUsCiAgIENvbmNlYWxTdGF0ZV9GYWRlSW4sCkBAIC0xMjksNTAgKzEzNyw2NyBAQAogCiB9IENDb25jZWFsbWVudFN0YXRlOwogCit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfU0dMIGZhZGVPdXRGYWN0b3JbQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SU107CisgIEZJWFBfU0dMIGZhZGVJbkZhY3RvcltDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTXTsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRklYUF9TR0wgIGZhZGVPdXRGYWN0b3JbQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SU107Ci0gIEZJWFBfU0dMICBmYWRlSW5GYWN0b3IgW0NPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlNdOworICBDQ29uY2VhbG1lbnRNZXRob2QgbWV0aG9kOwogCi0gIENDb25jZWFsbWVudE1ldGhvZCAgbWV0aG9kOwotCi0gIGludCAgbnVtRmFkZU91dEZyYW1lczsKLSAgaW50ICBudW1GYWRlSW5GcmFtZXM7Ci0gIGludCAgbnVtTXV0ZVJlbGVhc2VGcmFtZXM7Ci0gIGludCAgY29tZm9ydE5vaXNlTGV2ZWw7CisgIGludCBudW1GYWRlT3V0RnJhbWVzOworICBpbnQgbnVtRmFkZUluRnJhbWVzOworICBpbnQgbnVtTXV0ZVJlbGVhc2VGcmFtZXM7CisgIEZJWFBfREJMIGNvbWZvcnROb2lzZUxldmVsOwogCiB9IENDb25jZWFsUGFyYW1zOwogCit0eXBlZGVmIGVudW0geworICBGQURFX1RJTUVET01BSU5fVE9TUEVDVFJBTE1VVEUgPSAxLAorICBGQURFX1RJTUVET01BSU5fRlJPTVNQRUNUUkFMTVVURSwKKyAgRkFERV9USU1FRE9NQUlOCit9IFREZmFkaW5nVHlwZTsKIAotCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxQYXJhbXM7CiAKICAgRklYUF9DTkNMIHNwZWN0cmFsQ29lZmZpY2llbnRbMTAyNF07Ci0gIFNIT1JUICAgICBzcGVjU2NhbGVbOF07CisgIFNIT1JUIHNwZWNTY2FsZVs4XTsKIAotICBJTlQgICAgaVJhbmRvbVBoYXNlOwotICBJTlQgICAgcHJldkZyYW1lT2tbMl07Ci0gIElOVCAgICBjbnRGYWRlRnJhbWVzOwotICBJTlQgICAgY250VmFsaWRGcmFtZXM7CisgIElOVCBpUmFuZG9tUGhhc2U7CisgIElOVCBwcmV2RnJhbWVPa1syXTsKKyAgSU5UIGNudFZhbGlkRnJhbWVzOworICBJTlQgY250RmFkZUZyYW1lczsgLyogU3RhdGUgZm9yIHNpZ25hbCBmYWRlLWluL291dCAqLworICAvKiBTdGF0ZXMgZm9yIHNpZ25hbCBmYWRlLW91dCBvZiBmcmFtZXMgd2l0aCBtb3JlIHRoYW4gb25lIHdpbmRvdy9zdWJmcmFtZSAtCisgICAgWzBdIHVzZWQgYnkgVXBkYXRlIENudEZhZGVGcmFtZXMgbW9kZSBvZiBDQ29uY2VhbG1lbnRfQXBwbHlGYWRlT3V0LCBbMV0gdXNlZAorICAgIGJ5IEZhZGVPdXQgbW9kZSAqLworICBpbnQgd2luR3JwT2Zmc2V0WzJdOyAvKiBTdGF0ZSBmb3Igc2lnbmFsIGZhZGUtb3V0IG9mIGZyYW1lcyB3aXRoIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93L3N1YmZyYW1lICovCisgIGludCBhdHRHcnBPZmZzZXRbMl07IC8qIFN0YXRlIGZvciBmYXN0ZXIgc2lnbmFsIGZhZGUtb3V0IG9mIGZyYW1lcyB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudCBzaWduYWwgcGFydHMgKi8KIAotICBTSE9SVCBhUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbUlZMQ19NQVhfU0ZCXTsgIC8qIG5lZWRlZCBvbmNlIHBlciBjaGFubmVsICovCi0gIFVDSEFSIGFSdmxjUHJldmlvdXNDb2RlYm9va1tSVkxDX01BWF9TRkJdOyAgICAgLyogbmVlZGVkIG9uY2UgcGVyIGNoYW5uZWwgKi8KKyAgU0NIQVIgbGFzdFJlbmRlck1vZGU7CisKKyAgVUNIQVIgd2luZG93U2hhcGU7CisgIEJMT0NLX1RZUEUgd2luZG93U2VxdWVuY2U7CisgIFVDSEFSIGxhc3RXaW5HcnBMZW47CisKKyAgQ0NvbmNlYWxtZW50U3RhdGUgY29uY2VhbFN0YXRlOworICBDQ29uY2VhbG1lbnRTdGF0ZSBjb25jZWFsU3RhdGVfb2xkOworICBGSVhQX0RCTCBmYWRlX29sZDsgICAgICAgICAgIC8qIGxhc3QgZmFkaW5nIGZhY3RvciAqLworICBURGZhZGluZ1R5cGUgbGFzdEZhZGluZ1R5cGU7IC8qIGxhc3QgZmFkaW5nIHR5cGUgKi8KKworICBTSE9SVCBhUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbUlZMQ19NQVhfU0ZCXTsgLyogbmVlZGVkIG9uY2UgcGVyIGNoYW5uZWwgKi8KKyAgVUNIQVIgYVJ2bGNQcmV2aW91c0NvZGVib29rW1JWTENfTUFYX1NGQl07ICAgIC8qIG5lZWRlZCBvbmNlIHBlciBjaGFubmVsICovCiAgIFNDSEFSIHJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yT0s7CiAgIFNDSEFSIHJ2bGNQcmV2aW91c0Jsb2NrVHlwZTsKIAotCi0gIFNDSEFSICBsYXN0UmVuZGVyTW9kZTsKLQotICBVQ0hBUiAgd2luZG93U2hhcGU7Ci0gIFVDSEFSICB3aW5kb3dTZXF1ZW5jZTsKLSAgVUNIQVIgIGxhc3RXaW5HcnBMZW47Ci0KLSAgQ0NvbmNlYWxtZW50U3RhdGUgY29uY2VhbFN0YXRlOworICBGSVhQX0xQQyBsc2Y0W01fTFBfRklMVEVSX09SREVSXTsKKyAgRklYUF9EQkwgbGFzdF90Y3hfZ2FpbjsKKyAgSU5UIGxhc3RfdGN4X2dhaW5fZTsKKyAgVUxPTkcgVEROb2lzZVNlZWQ7CisgIEZJWFBfUENNIFRETm9pc2VTdGF0ZXNbM107CisgIEZJWFBfU0dMIFRETm9pc2VDb2VmWzNdOworICBGSVhQX1NHTCBURE5vaXNlQXR0OwogCiB9IENDb25jZWFsbWVudEluZm87CiAKLQogI2VuZGlmIC8qICNpZm5kZWYgQ09OQ0VBTF9UWVBFU19IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2RlYnVnLmggYi9saWJBQUNkZWMvc3JjL2RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MDMyOTEuLjAwMDAwMDAKLS0tIGEvbGliQUFDZGVjL3NyYy9kZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCi0gICBEZXNjcmlwdGlvbjogZGVidWcgb3V0cHV0Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBERUJVR19ICi0jZGVmaW5lIERFQlVHX0gKLQotI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9sZGZpbHRiYW5rLmNwcCBiL2xpYkFBQ2RlYy9zcmMvbGRmaWx0YmFuay5jcHAKaW5kZXggYzA4Y2M0MS4uNjZhNTkxNCAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9sZGZpbHRiYW5rLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2xkZmlsdGJhbmsuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE5ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0qCi0gKiAgIGZpbGVuYW1lOiBsZGZpbHRiYW5rLmMKLSAqICAgcHJvamVjdCA6IE1QRUctNCBBdWRpbyBEZWNvZGVyCi0gKiAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBsb3cgZGVsYXkgZmlsdGVyYmFuawotICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBsb3cgZGVsYXkgZmlsdGVyYmFuaworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAibGRmaWx0YmFuay5oIgogCi0KICNpbmNsdWRlICJhYWNfcm9tLmgiCiAjaW5jbHVkZSAiZGN0LmgiCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgpAQCAtOTksMTEwICsxMDksMTY2IEBACiAKICNkZWZpbmUgTERGQl9IRUFEUk9PTSAyCiAKLXN0YXRpYyB2b2lkIG11bHRFMl9EaW52Rl9mZGsoSU5UX1BDTSAqb3V0cHV0LCBGSVhQX0RCTCogeCwgY29uc3QgRklYUF9XVEIqIGZiLCBGSVhQX0RCTCogeiwgY29uc3QgaW50IE4sIGNvbnN0IGludCAgc3RyaWRlKQotewotICBpbnQgaSwgc2NhbGU7CisjaWYgZGVmaW5lZChfX2FybV9fKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG11bHRFMl9EaW52Rl9mZGsoRklYUF9QQ00gKm91dHB1dCwgRklYUF9EQkwgKngsIGNvbnN0IEZJWFBfV1RCICpmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnosIGNvbnN0IGludCBOKSB7CisgIGludCBpOwogCiAgIC8qICBzY2FsZSBmb3IgRklYUF9EQkwgLT4gSU5UX1BDTSBjb252ZXJzaW9uLiAqLwotICBzY2FsZSA9IChERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTKSAtIExERkJfSEVBRFJPT007CisgIGNvbnN0IGludCBzY2FsZSA9IChERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTKSAtIExERkJfSEVBRFJPT007CisjaWYgKChERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTIC0gTERGQl9IRUFEUk9PTSkgPiAwKQorICBGSVhQX0RCTCBybmRfdmFsX3d0czAgPSAoRklYUF9EQkwpMDsKKyAgRklYUF9EQkwgcm5kX3ZhbF93dHMxID0gKEZJWFBfREJMKTA7CisgIGlmICgtV1RTMCAtIDEgKyBzY2FsZSkKKyAgICBybmRfdmFsX3d0czAgPSAoRklYUF9EQkwpKDEgPDwgKC1XVFMwIC0gMSArIHNjYWxlIC0gMSkpOworICBpZiAoLVdUUzEgLSAxICsgc2NhbGUpCisgICAgcm5kX3ZhbF93dHMxID0gKEZJWFBfREJMKSgxIDw8ICgtV1RTMSAtIDEgKyBzY2FsZSAtIDEpKTsKKyNlbmRpZgogCi0gIGZvcihpPTA7aTxOLzQ7aSsrKQotICB7CisgIGZvciAoaSA9IDA7IGkgPCBOIC8gNDsgaSsrKSB7CiAgICAgRklYUF9EQkwgejAsIHoyLCB0bXA7CiAKLSAgICB6MiA9IHhbTi8yK2ldOwotICAgIHowID0gejIgKyAoIGZNdWx0RGl2Mih6W04vMitpXSwgZmJbMipOICsgaV0pID4+ICgtV1RTMi0xKSApOworICAgIHoyID0geFtOIC8gMiArIGldOworICAgIHowID0gejIgKyAoZk11bHREaXYyKHpbTiAvIDIgKyBpXSwgZmJbMiAqIE4gKyBpXSkgPj4gKC1XVFMyIC0gMSkpOwogCi0gICAgeltOLzIraV0gPSB4W04vMi0xLWldICsgKCBmTXVsdERpdjIoeltOICsgaV0sIGZiWzIqTiArIE4vMiArIGldKSA+PiAoLVdUUzItMSkgKTsKKyAgICB6W04gLyAyICsgaV0gPSB4W04gLyAyIC0gMSAtIGldICsKKyAgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKHpbTiArIGldLCBmYlsyICogTiArIE4gLyAyICsgaV0pID4+ICgtV1RTMiAtIDEpKTsKIAotICAgIHRtcCA9ICggZk11bHREaXYyKHpbTi8yK2ldLCBmYltOK04vMi0xLWldKSArIGZNdWx0RGl2Mih6W2ldLCBmYltOK04vMitpXSkgKSA7CisgICAgdG1wID0gKGZNdWx0RGl2Mih6W04gLyAyICsgaV0sIGZiW04gKyBOIC8gMiAtIDEgLSBpXSkgKworICAgICAgICAgICBmTXVsdERpdjIoeltpXSwgZmJbTiArIE4gLyAyICsgaV0pKTsKIAotI2lmIChTQU1QTEVfQklUUyA8PSAxNikKLSAgICBGREtfQVNTRVJUKCAoLVdUUzEtMSArIHNjYWxlKSA+PSAwKTsKLSAgICBvdXRwdXRbKE4qMy80LTEtaSkqc3RyaWRlXSA9IChJTlRfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKHRtcCwgLVdUUzEtMSArIHNjYWxlLCBTQU1QTEVfQklUUyk7CisjaWYgKChERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTIC0gTERGQl9IRUFEUk9PTSkgPiAwKQorICAgIEZES19BU1NFUlQoKC1XVFMxIC0gMSArIHNjYWxlKSA+PSAwKTsKKyAgICBGREtfQVNTRVJUKHRtcCA8PSAoKEZJWFBfREJMKTB4N0ZGRkZGRkYgLQorICAgICAgICAgICAgICAgICAgICAgICBybmRfdmFsX3d0czEpKTsgLyogcm91bmRpbmcgbXVzdCBub3QgY2F1c2Ugb3ZlcmZsb3cgKi8KKyAgICBvdXRwdXRbKE4gKiAzIC8gNCAtIDEgLSBpKV0gPSAoRklYUF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoCisgICAgICAgIHRtcCArIHJuZF92YWxfd3RzMSwgLVdUUzEgLSAxICsgc2NhbGUsIFBDTV9PVVRfQklUUyk7CiAjZWxzZQotICAgIEZES19BU1NFUlQoIChXVFMxKzEgLSBzY2FsZSkgPj0gMCk7Ci0gICAgb3V0cHV0WyhOKjMvNC0xLWkpKnN0cmlkZV0gPSAoSU5UX1BDTSlTQVRVUkFURV9MRUZUX1NISUZUKHRtcCwgV1RTMSsxIC0gc2NhbGUsIFNBTVBMRV9CSVRTKTsKKyAgICBGREtfQVNTRVJUKChXVFMxICsgMSAtIHNjYWxlKSA+PSAwKTsKKyAgICBvdXRwdXRbKE4gKiAzIC8gNCAtIDEgLSBpKV0gPQorICAgICAgICAoRklYUF9QQ00pU0FUVVJBVEVfTEVGVF9TSElGVCh0bXAsIFdUUzEgKyAxIC0gc2NhbGUsIFBDTV9PVVRfQklUUyk7CiAjZW5kaWYKIAogICAgIHpbaV0gPSB6MDsKICAgICB6W04gKyBpXSA9IHoyOwogICB9CiAKLSAgZm9yKGk9Ti80O2k8Ti8yO2krKykKLSAgeworICBmb3IgKGkgPSBOIC8gNDsgaSA8IE4gLyAyOyBpKyspIHsKICAgICBGSVhQX0RCTCB6MCwgejIsIHRtcDAsIHRtcDE7CiAKLSAgICB6MiA9IHhbTi8yK2ldOwotICAgIHowID0gejIgKyAoIGZNdWx0RGl2Mih6W04vMitpXSwgZmJbMipOICsgaV0pID4+ICgtV1RTMi0xKSApOworICAgIHoyID0geFtOIC8gMiArIGldOworICAgIHowID0gejIgKyAoZk11bHREaXYyKHpbTiAvIDIgKyBpXSwgZmJbMiAqIE4gKyBpXSkgPj4gKC1XVFMyIC0gMSkpOwogCi0gICAgeltOLzIraV0gPSB4W04vMi0xLWldICsgKCBmTXVsdERpdjIoeltOICsgaV0sIGZiWzIqTiArIE4vMiArIGldKSA+PiAoLVdUUzItMSkgKTsKKyAgICB6W04gLyAyICsgaV0gPSB4W04gLyAyIC0gMSAtIGldICsKKyAgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKHpbTiArIGldLCBmYlsyICogTiArIE4gLyAyICsgaV0pID4+ICgtV1RTMiAtIDEpKTsKIAotICAgIHRtcDAgPSAoIGZNdWx0RGl2Mih6W04vMitpXSwgZmJbTi8yLTEtaV0pICAgKyBmTXVsdERpdjIoeltpXSwgZmJbTi8yK2ldKSAgICkgOwotICAgIHRtcDEgPSAoIGZNdWx0RGl2Mih6W04vMitpXSwgZmJbTitOLzItMS1pXSkgKyBmTXVsdERpdjIoeltpXSwgZmJbTitOLzIraV0pICkgOworICAgIHRtcDAgPSAoZk11bHREaXYyKHpbTiAvIDIgKyBpXSwgZmJbTiAvIDIgLSAxIC0gaV0pICsKKyAgICAgICAgICAgIGZNdWx0RGl2Mih6W2ldLCBmYltOIC8gMiArIGldKSk7CisgICAgdG1wMSA9IChmTXVsdERpdjIoeltOIC8gMiArIGldLCBmYltOICsgTiAvIDIgLSAxIC0gaV0pICsKKyAgICAgICAgICAgIGZNdWx0RGl2Mih6W2ldLCBmYltOICsgTiAvIDIgKyBpXSkpOwogCi0jaWYgKFNBTVBMRV9CSVRTIDw9IDE2KQotICAgIEZES19BU1NFUlQoICgtV1RTMC0xICsgc2NhbGUpID49IDApOwotICAgIG91dHB1dFsoaS1OLzQpKnN0cmlkZV0gICAgID0gKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQodG1wMCwgLVdUUzAtMSArIHNjYWxlLCBTQU1QTEVfQklUUyk7Ci0gICAgb3V0cHV0WyhOKjMvNC0xLWkpKnN0cmlkZV0gPSAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCh0bXAxLCAtV1RTMS0xICsgc2NhbGUsIFNBTVBMRV9CSVRTKTsKKyNpZiAoKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMgLSBMREZCX0hFQURST09NKSA+IDApCisgICAgRkRLX0FTU0VSVCgoLVdUUzAgLSAxICsgc2NhbGUpID49IDApOworICAgIEZES19BU1NFUlQodG1wMCA8PSAoKEZJWFBfREJMKTB4N0ZGRkZGRkYgLQorICAgICAgICAgICAgICAgICAgICAgICAgcm5kX3ZhbF93dHMwKSk7IC8qIHJvdW5kaW5nIG11c3Qgbm90IGNhdXNlIG92ZXJmbG93ICovCisgICAgRkRLX0FTU0VSVCh0bXAxIDw9ICgoRklYUF9EQkwpMHg3RkZGRkZGRiAtCisgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmFsX3d0czEpKTsgLyogcm91bmRpbmcgbXVzdCBub3QgY2F1c2Ugb3ZlcmZsb3cgKi8KKyAgICBvdXRwdXRbKGkgLSBOIC8gNCldID0gKEZJWFBfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKAorICAgICAgICB0bXAwICsgcm5kX3ZhbF93dHMwLCAtV1RTMCAtIDEgKyBzY2FsZSwgUENNX09VVF9CSVRTKTsKKyAgICBvdXRwdXRbKE4gKiAzIC8gNCAtIDEgLSBpKV0gPSAoRklYUF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoCisgICAgICAgIHRtcDEgKyBybmRfdmFsX3d0czEsIC1XVFMxIC0gMSArIHNjYWxlLCBQQ01fT1VUX0JJVFMpOwogI2Vsc2UKLSAgICBGREtfQVNTRVJUKCAoV1RTMCsxIC0gc2NhbGUpID49IDApOwotICAgIG91dHB1dFsoaS1OLzQpKnN0cmlkZV0gICAgID0gKElOVF9QQ00pU0FUVVJBVEVfTEVGVF9TSElGVCh0bXAwLCBXVFMwKzEgLSBzY2FsZSwgU0FNUExFX0JJVFMpOwotICAgIG91dHB1dFsoTiozLzQtMS1pKSpzdHJpZGVdID0gKElOVF9QQ00pU0FUVVJBVEVfTEVGVF9TSElGVCh0bXAxLCBXVFMxKzEgLSBzY2FsZSwgU0FNUExFX0JJVFMpOworICAgIEZES19BU1NFUlQoKFdUUzAgKyAxIC0gc2NhbGUpID49IDApOworICAgIG91dHB1dFsoaSAtIE4gLyA0KV0gPQorICAgICAgICAoRklYUF9QQ00pU0FUVVJBVEVfTEVGVF9TSElGVCh0bXAwLCBXVFMwICsgMSAtIHNjYWxlLCBQQ01fT1VUX0JJVFMpOworICAgIG91dHB1dFsoTiAqIDMgLyA0IC0gMSAtIGkpXSA9CisgICAgICAgIChGSVhQX1BDTSlTQVRVUkFURV9MRUZUX1NISUZUKHRtcDEsIFdUUzEgKyAxIC0gc2NhbGUsIFBDTV9PVVRfQklUUyk7CiAjZW5kaWYKICAgICB6W2ldID0gejA7CiAgICAgeltOICsgaV0gPSB6MjsKICAgfQogCiAgIC8qIEV4Y2hhbmdlIHF1YXJ0ZXIgcGFydHMgb2YgeCB0byBicmluZyB0aGVtIGluIHRoZSAicmlnaHQiIG9yZGVyICovCi0gIGZvcihpPTA7aTxOLzQ7aSsrKQotICB7Ci0gICAgRklYUF9EQkwgdG1wMCA9IGZNdWx0RGl2Mih6W2ldLCBmYltOLzIraV0pOworICBmb3IgKGkgPSAwOyBpIDwgTiAvIDQ7IGkrKykgeworICAgIEZJWFBfREJMIHRtcDAgPSBmTXVsdERpdjIoeltpXSwgZmJbTiAvIDIgKyBpXSk7CiAKLSNpZiAoU0FNUExFX0JJVFMgPD0gMTYpCi0gICAgRkRLX0FTU0VSVCggKC1XVFMwLTEgKyBzY2FsZSkgPj0gMCk7Ci0gICAgb3V0cHV0WyhOKjMvNCArIGkpKnN0cmlkZV0gPSAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCh0bXAwLCAtV1RTMC0xICsgc2NhbGUsIFNBTVBMRV9CSVRTKTsKKyNpZiAoKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMgLSBMREZCX0hFQURST09NKSA+IDApCisgICAgRkRLX0FTU0VSVCgoLVdUUzAgLSAxICsgc2NhbGUpID49IDApOworICAgIEZES19BU1NFUlQodG1wMCA8PSAoKEZJWFBfREJMKTB4N0ZGRkZGRkYgLQorICAgICAgICAgICAgICAgICAgICAgICAgcm5kX3ZhbF93dHMwKSk7IC8qIHJvdW5kaW5nIG11c3Qgbm90IGNhdXNlIG92ZXJmbG93ICovCisgICAgb3V0cHV0WyhOICogMyAvIDQgKyBpKV0gPSAoRklYUF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoCisgICAgICAgIHRtcDAgKyBybmRfdmFsX3d0czAsIC1XVFMwIC0gMSArIHNjYWxlLCBQQ01fT1VUX0JJVFMpOwogI2Vsc2UKLSAgICBGREtfQVNTRVJUKCAoV1RTMCsxIC0gc2NhbGUpID49IDApOwotICAgIG91dHB1dFsoTiozLzQgKyBpKSpzdHJpZGVdID0gKElOVF9QQ00pU0FUVVJBVEVfTEVGVF9TSElGVCh0bXAwLCBXVFMwKzEgLSBzY2FsZSwgU0FNUExFX0JJVFMpOworICAgIEZES19BU1NFUlQoKFdUUzAgKyAxIC0gc2NhbGUpID49IDApOworICAgIG91dHB1dFsoTiAqIDMgLyA0ICsgaSldID0KKyAgICAgICAgKEZJWFBfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQodG1wMCwgV1RTMCArIDEgLSBzY2FsZSwgUENNX09VVF9CSVRTKTsKICNlbmRpZgogICB9CiB9CiAKLWludCBJbnZNZGN0VHJhbnNmb3JtTG93RGVsYXlfZmRrIChGSVhQX0RCTCAqbWRjdERhdGEsIGNvbnN0IGludCBtZGN0RGF0YV9lLCBJTlRfUENNICpvdXRwdXQsIEZJWFBfREJMICpmc19idWZmZXIsIGNvbnN0IGludCBzdHJpZGUsIGNvbnN0IGludCBOKSB7Ci0KK2ludCBJbnZNZGN0VHJhbnNmb3JtTG93RGVsYXlfZmRrKEZJWFBfREJMICptZGN0RGF0YSwgY29uc3QgaW50IG1kY3REYXRhX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1BDTSAqb3V0cHV0LCBGSVhQX0RCTCAqZnNfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IE4pIHsKICAgY29uc3QgRklYUF9XVEIgKmNvZWY7CiAgIEZJWFBfREJMIGdhaW4gPSAoRklYUF9EQkwpMDsKLSAgaW50IHNjYWxlID0gbWRjdERhdGFfZSArIE1EQ1RfT1VUX0hFQURST09NIC0gTERGQl9IRUFEUk9PTTsgLyogVGhlIExERkJfSEVBRFJPT00gaXMgY29tcGVuc2F0ZWQgaW5zaWRlIG11bHRFMl9EaW52Rl9mZGsoKSBiZWxvdyAqLworICBpbnQgc2NhbGUgPSBtZGN0RGF0YV9lICsgTURDVF9PVVRfSEVBRFJPT00gLQorICAgICAgICAgICAgICBMREZCX0hFQURST09NOyAvKiBUaGUgTERGQl9IRUFEUk9PTSBpcyBjb21wZW5zYXRlZCBpbnNpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdEUyX0RpbnZGX2ZkaygpIGJlbG93ICovCiAKICAgLyogU2VsZWN0IExEIHdpbmRvdyBzbG9wZSAqLwotICBpZiAoTiA9PSA1MTIpCi0gICAgY29lZiA9IChGSVhQX1dUQiopTG93RGVsYXlTeW50aGVzaXM1MTI7Ci0gIGVsc2UKLSAgICBjb2VmID0gKEZJWFBfV1RCKilMb3dEZWxheVN5bnRoZXNpczQ4MDsKKyAgc3dpdGNoIChOKSB7CisgICAgY2FzZSAyNTY6CisgICAgICBjb2VmID0gTG93RGVsYXlTeW50aGVzaXMyNTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0MDoKKyAgICAgIGNvZWYgPSBMb3dEZWxheVN5bnRoZXNpczI0MDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTYwOgorICAgICAgY29lZiA9IExvd0RlbGF5U3ludGhlc2lzMTYwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjg6CisgICAgICBjb2VmID0gTG93RGVsYXlTeW50aGVzaXMxMjg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDoKKyAgICAgIGNvZWYgPSBMb3dEZWxheVN5bnRoZXNpczEyMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTEyOgorICAgICAgY29lZiA9IExvd0RlbGF5U3ludGhlc2lzNTEyOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODA6CisgICAgZGVmYXVsdDoKKyAgICAgIGNvZWYgPSBMb3dEZWxheVN5bnRoZXNpczQ4MDsKKyAgICAgIGJyZWFrOworICB9CiAKICAgLyoKICAgICAgQXBwbHkgZXhwb25lbnQgYW5kIDEvTiBmYWN0b3IuCiAgICAgIE5vdGU6ICJzY2FsZSIgaXMgb2ZmIGJ5IG9uZSBiZWNhdXNlIGZvciBMRF9NRENUIHRoZSB3aW5kb3cgbGVuZ3RoIGlzIHR3aWNlCi0gICAgIHRoZSB3aW5kb3cgbGVuZ3RoIG9mIGEgcmVndWxhciBNRENULiBUaGlzIGlzIGNvcnJlY3RlZCBpbnNpZGUgbXVsdEUyX0RpbnZGX2ZkaygpLgotICAgICBSZWZlciB0byBJU08vSUVDIDE0NDk2LTM6MjAwOSBwYWdlIDI3NywgY2hhcHRlciA0LjYuMjAuMiAiTG93IERlbGF5IFdpbmRvdyIuCisgICAgIHRoZSB3aW5kb3cgbGVuZ3RoIG9mIGEgcmVndWxhciBNRENULiBUaGlzIGlzIGNvcnJlY3RlZCBpbnNpZGUKKyAgICAgbXVsdEUyX0RpbnZGX2ZkaygpLiBSZWZlciB0byBJU08vSUVDIDE0NDk2LTM6MjAwOSBwYWdlIDI3NywKKyAgICAgY2hhcHRlciA0LjYuMjAuMiAiTG93IERlbGF5IFdpbmRvdyIuCiAgICAqLwogICBpbWRjdF9nYWluKCZnYWluLCAmc2NhbGUsIE4pOwogCiAgIGRjdF9JVihtZGN0RGF0YSwgTiwgJnNjYWxlKTsKIAorICBpZiAoTiA9PSAyNTYgfHwgTiA9PSAyNDAgfHwgTiA9PSAxNjApIHsKKyAgICBzY2FsZSAtPSAxOworICB9IGVsc2UgaWYgKE4gPT0gMTI4IHx8IE4gPT0gMTIwKSB7CisgICAgc2NhbGUgLT0gMjsKKyAgfQorCiAgIGlmIChnYWluICE9IChGSVhQX0RCTCkwKSB7CiAgICAgc2NhbGVWYWx1ZXNXaXRoRmFjdG9yKG1kY3REYXRhLCBnYWluLCBOLCBzY2FsZSk7CiAgIH0gZWxzZSB7CiAgICAgc2NhbGVWYWx1ZXMobWRjdERhdGEsIE4sIHNjYWxlKTsKICAgfQogCi0gIC8qIFNpbmNlIGFsbCBleHBvbmVudCBhbmQgZmFjdG9ycyBoYXZlIGJlZW4gYXBwbGllZCwgY3VycmVudCBleHBvbmVudCBpcyB6ZXJvLiAqLwotICBtdWx0RTJfRGludkZfZmRrKG91dHB1dCwgbWRjdERhdGEsIGNvZWYsIGZzX2J1ZmZlciwgTiwgc3RyaWRlKTsKKyAgLyogU2luY2UgYWxsIGV4cG9uZW50IGFuZCBmYWN0b3JzIGhhdmUgYmVlbiBhcHBsaWVkLCBjdXJyZW50IGV4cG9uZW50IGlzIHplcm8uCisgICAqLworICBtdWx0RTJfRGludkZfZmRrKG91dHB1dCwgbWRjdERhdGEsIGNvZWYsIGZzX2J1ZmZlciwgTik7CiAKICAgcmV0dXJuICgxKTsKIH0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9sZGZpbHRiYW5rLmggYi9saWJBQUNkZWMvc3JjL2xkZmlsdGJhbmsuaAppbmRleCBkMWY5NDAyLi5iNjNkYTZiIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2xkZmlsdGJhbmsuaAorKysgYi9saWJBQUNkZWMvc3JjL2xkZmlsdGJhbmsuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMSArOTAsMjMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAqICAgZmlsZW5hbWU6IGxkZmlsdGJhbmsuaAotICogICBwcm9qZWN0IDogTVBFRy00IEF1ZGlvIERlY29kZXIKLSAqICAgY29udGVudHMvZGVzY3JpcHRpb246IGxvdyBkZWxheSBmaWx0ZXJiYW5rIGludGVyZmFjZQotICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBBdXRob3Iocyk6CiAKLSNpZm5kZWYgX0xERklMVEJBTktfSAotI2RlZmluZSBfTERGSUxUQkFOS19ICisgICBEZXNjcmlwdGlvbjogbG93IGRlbGF5IGZpbHRlcmJhbmsgaW50ZXJmYWNlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTERGSUxUQkFOS19ICisjZGVmaW5lIExERklMVEJBTktfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCi0KLWludCBJbnZNZGN0VHJhbnNmb3JtTG93RGVsYXlfZmRrICgKLSAgICAgICAgRklYUF9EQkwgKm1kY3RkYXRhX20sCi0gICAgICAgIGNvbnN0IGludCBtZGN0ZGF0YV9lLAotICAgICAgICBJTlRfUENNICptZGN0T3V0LAotICAgICAgICBGSVhQX0RCTCAqZnNfYnVmZmVyLAotICAgICAgICBjb25zdCBpbnQgc3RyaWRlLAotICAgICAgICBjb25zdCBpbnQgZnJhbWVMZW5ndGgKLSAgICAgICAgKTsKLQoraW50IEludk1kY3RUcmFuc2Zvcm1Mb3dEZWxheV9mZGsoRklYUF9EQkwgKm1kY3RkYXRhX20sIGNvbnN0IGludCBtZGN0ZGF0YV9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9QQ00gKm1kY3RPdXQsIEZJWFBfREJMICpmc19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVMZW5ndGgpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvb3ZlcmxhcGFkZC5oIGIvbGliQUFDZGVjL3NyYy9vdmVybGFwYWRkLmgKaW5kZXggMTQ2OWJlNy4uNDllZWNkOCAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9vdmVybGFwYWRkLmgKKysrIGIvbGliQUFDZGVjL3NyYy9vdmVybGFwYWRkLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjcgKzkwLDMxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIE9WRVJMQVBBRERfSAogI2RlZmluZSBPVkVSTEFQQUREX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAotI2RlZmluZSAgT3ZlcmxhcEJ1ZmZlclNpemUgICgxMDI0KjIpCisvKiBFTEQgdXNlcyBkaWZmZXJlbnQgb3ZlcmxhcCB3aGljaCBpcyB0d2ljZSB0aGUgZnJhbWUgc2l6ZTogKi8KKyNkZWZpbmUgT3ZlcmxhcEJ1ZmZlclNpemUgKDc2OCkKIAogdHlwZWRlZiBGSVhQX0RCTCBTUEVDVFJVTVsxMDI0XTsKLXR5cGVkZWYgRklYUF9EQkwgKiBTUEVDVFJBTF9QVFI7Cit0eXBlZGVmIEZJWFBfREJMKiBTUEVDVFJBTF9QVFI7CiAKLSNkZWZpbmUgU1BFQ19MT05HKHB0cikgICAgICAgKHB0cikKLSNkZWZpbmUgU1BFQyhwdHIsdyxnbCkgICAgICAoKHB0cikrKCh3KSooZ2wpKSkKKyNkZWZpbmUgU1BFQ19MT05HKHB0cikgKHB0cikKKyNkZWZpbmUgU1BFQyhwdHIsIHcsIGdsKSAoKHB0cikgKyAoKHcpICogKGdsKSkpCiAKKyNkZWZpbmUgU1BFQ19UQ1gocHRyLCBmLCBnbCwgZmIpIFwKKyAgKChwdHIpICsgKChmKSAqIChnbCAqIDIpICogKCgoZmIpID09IDApID8gMSA6IDIpKSkKIAogI2VuZGlmIC8qICNpZm5kZWYgT1ZFUkxBUEFERF9IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3B1bHNlZGF0YS5jcHAgYi9saWJBQUNkZWMvc3JjL3B1bHNlZGF0YS5jcHAKaW5kZXggMGYyZjBlYy4uZWI2ZDViYyAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9wdWxzZWRhdGEuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvcHVsc2VkYXRhLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0MiArOTAsMzcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IHB1bHNlIGRhdGEgdG9vbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAicHVsc2VkYXRhLmgiCiAKLQogI2luY2x1ZGUgImNoYW5uZWxpbmZvLmgiCiAKLQotSU5UIENQdWxzZURhdGFfUmVhZCgKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgIENQdWxzZURhdGEgKmNvbnN0IFB1bHNlRGF0YSwKLSAgICAgICAgY29uc3QgU0hPUlQgKnNmYl9zdGFydGxpbmVzLAotICAgICAgICBjb25zdCB2b2lkICpwSWNzSW5mbywKLSAgICAgICAgY29uc3QgU0hPUlQgZnJhbWVfbGVuZ3RoCi0gICAgICAgICkKLXsKLSAgaW50IGksIGs9MDsKLSAgY29uc3QgVUlOVCBNYXhTZkJhbmRzID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKChDSWNzSW5mbyopcEljc0luZm8pOworSU5UIENQdWxzZURhdGFfUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ1B1bHNlRGF0YSAqY29uc3QgUHVsc2VEYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAqc2ZiX3N0YXJ0bGluZXMsIGNvbnN0IHZvaWQgKnBJY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCBmcmFtZV9sZW5ndGgpIHsKKyAgaW50IGksIGsgPSAwOworICBjb25zdCBVSU5UIE1heFNmQmFuZHMgPQorICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKChjb25zdCBDSWNzSW5mbyAqKXBJY3NJbmZvKTsKIAogICAvKiByZXNldCBwdWxzZSBkYXRhIGZsYWcgKi8KICAgUHVsc2VEYXRhLT5QdWxzZURhdGFQcmVzZW50ID0gMDsKIAotICBpZiAoKFB1bHNlRGF0YS0+UHVsc2VEYXRhUHJlc2VudCA9IChVQ0hBUikgRkRLcmVhZEJpdChicykpICE9IDApIHsKLSAgICBpZiAoIUlzTG9uZ0Jsb2NrKChDSWNzSW5mbyopcEljc0luZm8pKSB7CisgIGlmICgoUHVsc2VEYXRhLT5QdWxzZURhdGFQcmVzZW50ID0gKFVDSEFSKUZES3JlYWRCaXQoYnMpKSAhPSAwKSB7CisgICAgaWYgKCFJc0xvbmdCbG9jaygoY29uc3QgQ0ljc0luZm8gKilwSWNzSW5mbykpIHsKICAgICAgIHJldHVybiBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKICAgICB9CiAKLSAgICBQdWxzZURhdGEtPk51bWJlclB1bHNlID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKLSAgICBQdWxzZURhdGEtPlB1bHNlU3RhcnRCYW5kID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw2KTsKKyAgICBQdWxzZURhdGEtPk51bWJlclB1bHNlID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAyKTsKKyAgICBQdWxzZURhdGEtPlB1bHNlU3RhcnRCYW5kID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA2KTsKIAogICAgIGlmIChQdWxzZURhdGEtPlB1bHNlU3RhcnRCYW5kID49IE1heFNmQmFuZHMpIHsKICAgICAgIHJldHVybiBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKQEAgLTEyMiwzNyArMTI4LDM3IEBACiAKICAgICBrID0gc2ZiX3N0YXJ0bGluZXNbUHVsc2VEYXRhLT5QdWxzZVN0YXJ0QmFuZF07CiAKLSAgICBmb3IgKGk9MDsgaTw9UHVsc2VEYXRhLT5OdW1iZXJQdWxzZTsgaSsrKSB7Ci0gICAgICBQdWxzZURhdGEtPlB1bHNlT2Zmc2V0W2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw1KTsKLSAgICAgIFB1bHNlRGF0YS0+UHVsc2VBbXBbaV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICAgIGZvciAoaSA9IDA7IGkgPD0gUHVsc2VEYXRhLT5OdW1iZXJQdWxzZTsgaSsrKSB7CisgICAgICBQdWxzZURhdGEtPlB1bHNlT2Zmc2V0W2ldID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA1KTsKKyAgICAgIFB1bHNlRGF0YS0+UHVsc2VBbXBbaV0gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDQpOwogICAgICAgayArPSBQdWxzZURhdGEtPlB1bHNlT2Zmc2V0W2ldOwogICAgIH0KIAogICAgIGlmIChrID49IGZyYW1lX2xlbmd0aCkgewotICAgICAgICByZXR1cm4gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgICByZXR1cm4gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CiAgICAgfQogICB9CiAKLQogICByZXR1cm4gMDsKIH0KIAotdm9pZCBDUHVsc2VEYXRhX0FwcGx5KENQdWxzZURhdGEgKlB1bHNlRGF0YSwgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHB1bHNlIGRhdGEgc2lkZSBpbmZvICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgKnBTY2FsZUZhY3RvckJhbmRPZmZzZXRzLCAvKiE8IHBvaW50ZXIgdG8gc2NhbGVmYWN0b3IgYmFuZCBvZmZzZXRzICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvZWYpICAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHNwZWN0cnVtICovCit2b2lkIENQdWxzZURhdGFfQXBwbHkoCisgICAgQ1B1bHNlRGF0YSAqUHVsc2VEYXRhLCAvKiE8IHBvaW50ZXIgdG8gcHVsc2UgZGF0YSBzaWRlIGluZm8gKi8KKyAgICBjb25zdCBzaG9ydAorICAgICAgICAqcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMsIC8qITwgcG9pbnRlciB0byBzY2FsZWZhY3RvciBiYW5kIG9mZnNldHMgKi8KKyAgICBGSVhQX0RCTCAqY29lZikgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gc3BlY3RydW0gKi8KIHsKLSAgaW50IGksazsKKyAgaW50IGksIGs7CiAKLSAgaWYgKFB1bHNlRGF0YS0+UHVsc2VEYXRhUHJlc2VudCkKLSAgeworICBpZiAoUHVsc2VEYXRhLT5QdWxzZURhdGFQcmVzZW50KSB7CiAgICAgayA9IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW1B1bHNlRGF0YS0+UHVsc2VTdGFydEJhbmRdOwogCi0gICAgZm9yIChpPTA7IGk8PVB1bHNlRGF0YS0+TnVtYmVyUHVsc2U7IGkrKykKLSAgICB7CisgICAgZm9yIChpID0gMDsgaSA8PSBQdWxzZURhdGEtPk51bWJlclB1bHNlOyBpKyspIHsKICAgICAgIGsgKz0gUHVsc2VEYXRhLT5QdWxzZU9mZnNldFtpXTsKLSAgICAgIGlmIChjb2VmIFtrXSA+IChGSVhQX0RCTCkwKSBjb2VmW2tdICs9IChGSVhQX0RCTCkoaW50KVB1bHNlRGF0YS0+UHVsc2VBbXBbaV07Ci0gICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmW2tdIC09IChGSVhQX0RCTCkoaW50KVB1bHNlRGF0YS0+UHVsc2VBbXBbaV07CisgICAgICBpZiAoY29lZltrXSA+IChGSVhQX0RCTCkwKQorICAgICAgICBjb2VmW2tdICs9IChGSVhQX0RCTCkoaW50KVB1bHNlRGF0YS0+UHVsc2VBbXBbaV07CisgICAgICBlbHNlCisgICAgICAgIGNvZWZba10gLT0gKEZJWFBfREJMKShpbnQpUHVsc2VEYXRhLT5QdWxzZUFtcFtpXTsKICAgICB9CiAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9wdWxzZWRhdGEuaCBiL2xpYkFBQ2RlYy9zcmMvcHVsc2VkYXRhLmgKaW5kZXggZmE5N2Q5OS4uMTVhZTExYyAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9wdWxzZWRhdGEuaAorKysgYi9saWJBQUNkZWMvc3JjL3B1bHNlZGF0YS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI3ICs5MCwyNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogcHVsc2UgZGF0YSB0b29sCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgUFVMU0VEQVRBX0gKICNkZWZpbmUgUFVMU0VEQVRBX0gKIAotCi0KICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCiAjZGVmaW5lIE5fTUFYX0xJTkVTIDQKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgVUNIQVIgUHVsc2VEYXRhUHJlc2VudDsKICAgVUNIQVIgTnVtYmVyUHVsc2U7CiAgIFVDSEFSIFB1bHNlU3RhcnRCYW5kOwpAQCAtMTE0LDE3ICsxMjMsMTQgQEAKICAqIHRoZSBiaXRzdHJlYW0uCiAgKgogICogXHBhcmFtIGJzIGJpdCBzdHJlYW0gaGFuZGxlIGRhdGEgc291cmNlLgotICogXHBhcmFtIFB1bHNlRGF0YSBwb2ludGVyIHRvIGEgQ1B1bHNlRGF0YSB3ZXJlIHRoZSBkZWNvZGVkIGRhdGEgaXMgc3RvcmVkIGludG8uCisgKiBccGFyYW0gUHVsc2VEYXRhIHBvaW50ZXIgdG8gYSBDUHVsc2VEYXRhIHdlcmUgdGhlIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQKKyAqIGludG8uCiAgKiBccGFyYW0gTWF4U2ZCYW5kcyBtYXggbnVtYmVyIG9mIHNjYWxlIGZhY3RvciBiYW5kcy4KICAqIFxyZXR1cm4gMCBvbiBzdWNjZXNzLCAhPSAwIG9uIHBhcnNlIGVycm9yLgogICovCi1JTlQgQ1B1bHNlRGF0YV9SZWFkKAotICAgICAgICBjb25zdCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgQ1B1bHNlRGF0YSAqY29uc3QgUHVsc2VEYXRhLAotICAgICAgICBjb25zdCBTSE9SVCAqc2ZiX3N0YXJ0bGluZXMsCi0gICAgICAgIGNvbnN0IHZvaWQgKnBJY3NJbmZvLAotICAgICAgICBjb25zdCBTSE9SVCBmcmFtZV9sZW5ndGgKLSAgICAgICAgKTsKK0lOVCBDUHVsc2VEYXRhX1JlYWQoY29uc3QgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENQdWxzZURhdGEgKmNvbnN0IFB1bHNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKnNmYl9zdGFydGxpbmVzLCBjb25zdCB2b2lkICpwSWNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgZnJhbWVfbGVuZ3RoKTsKIAogLyoqCiAgKiBcYnJpZWYgQXBwbHkgcHVsc2UgZGF0YSB0byBzcGVjdHJhbCBsaW5lcwpAQCAtMTM0LDEyICsxNDAsMTEgQEAKICAqCiAgKiBccGFyYW0gUHVsc2VEYXRhIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzbHkgZGVjb2RlZCBwdWxzZSBkYXRhLgogICogXHBhcmFtIHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzIHNjYWxlIGZhY3RvciBiYW5kIGxpbmUgb2Zmc2V0IHRhYmxlLgotICogXHBhcmFtIGNvZWYgcG9pbnRlciB0byB0aGUgc3BlY3RyYWwgZGF0YSB3ZXJlIHB1bHNlIGRhdGEgc2hvdWxkIGJlIGFwcGxpZWQgdG8uCisgKiBccGFyYW0gY29lZiBwb2ludGVyIHRvIHRoZSBzcGVjdHJhbCBkYXRhIHdlcmUgcHVsc2UgZGF0YSBzaG91bGQgYmUgYXBwbGllZAorICogdG8uCiAgKiBccmV0dXJuICBub25lCi0qLworICovCiB2b2lkIENQdWxzZURhdGFfQXBwbHkoQ1B1bHNlRGF0YSAqUHVsc2VEYXRhLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0ICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29lZik7Ci0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCAqcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMsIEZJWFBfREJMICpjb2VmKTsKIAogI2VuZGlmIC8qICNpZm5kZWYgUFVMU0VEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvcnZsYy5jcHAgYi9saWJBQUNkZWMvc3JjL3J2bGMuY3BwCmluZGV4IDE2ZjBiZjUuLmI3YTliZTEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvcnZsYy5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9ydmxjLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQpAQCAtODksNyArMTA4LDYgQEAKIAogI2luY2x1ZGUgInJ2bGMuaCIKIAotCiAjaW5jbHVkZSAiYmxvY2suaCIKIAogI2luY2x1ZGUgImFhY19yb20uaCIKQEAgLTEwMCwyNiArMTE4LDI1IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBmdW5jdGlvbjogICAgIHJ2bGNJbml0CiAKLSAgICAgZGVzY3JpcHRpb246ICBpbml0IFJWTEMgYnkgZGF0YSBmcm9tIGNoYW5uZWxpbmZvLCB3aGljaCB3YXMgZGVjb2RlZCBwcmV2aW91c2x5IGFuZAotICAgICAgICAgICAgICAgICAgIHNldCB1cCBwb2ludGVycworICAgICBkZXNjcmlwdGlvbjogIGluaXQgUlZMQyBieSBkYXRhIGZyb20gY2hhbm5lbGluZm8sIHdoaWNoIHdhcyBkZWNvZGVkCitwcmV2aW91c2x5IGFuZCBzZXQgdXAgcG9pbnRlcnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIGlucHV0OiAgICAgLSBwb2ludGVyIHJ2bGMgc3RydWN0dXJlCiAgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIGNoYW5uZWwgaW5mbyBzdHJ1Y3R1cmUKICAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgYml0c3RyZWFtIHN0cnVjdHVyZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgICAtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYwotdm9pZCBydmxjSW5pdCAoQ0VyUnZsY0luZm8gICAgICAgICAgICAqcFJ2bGMsCi0gICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCi17CitzdGF0aWMgdm9pZCBydmxjSW5pdChDRXJSdmxjSW5mbyAqcFJ2bGMsCisgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpIHsKICAgLyogUlZMQyBjb21tb24gaW5pdGlhbGl6YXRpb24gcGFydCAyIG9mIDIgKi8KLSAgU0hPUlQgICAgICpwU2NmRXNjID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRXNjOwotICBTSE9SVCAgICAgKnBTY2ZGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2Q7Ci0gIFNIT1JUICAgICAqcFNjZkJ3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZDsKLSAgU0hPUlQgICAgICpwU2NhbGVGYWN0b3IgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yOworICBTSE9SVCAqcFNjZkVzYyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkVzYzsKKyAgU0hPUlQgKnBTY2ZGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2Q7CisgIFNIT1JUICpwU2NmQndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkOworICBTSE9SVCAqcFNjYWxlRmFjdG9yID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcjsKICAgaW50IGJuZHM7CiAKICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNJbnRlbnNpdHlVc2VkID0gMDsKQEAgLTEyOSw3ICsxNDYsNyBAQAogICBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzQndkID0gMDsKIAogICBwUnZsYy0+aW50ZW5zaXR5X3VzZWQgPSAwOwotICBwUnZsYy0+ZXJyb3JMb2dSdmxjICAgPSAwOworICBwUnZsYy0+ZXJyb3JMb2dSdmxjID0gMDsKIAogICBwUnZsYy0+Y29uY2VhbF9tYXggPSBDT05DRUFMX01BWF9JTklUOwogICBwUnZsYy0+Y29uY2VhbF9taW4gPSBDT05DRUFMX01JTl9JTklUOwpAQCAtMTM3LDggKzE1NCw4IEBACiAgIHBSdmxjLT5jb25jZWFsX21heF9lc2MgPSBDT05DRUFMX01BWF9JTklUOwogICBwUnZsYy0+Y29uY2VhbF9taW5fZXNjID0gQ09OQ0VBTF9NSU5fSU5JVDsKIAotICBwUnZsYy0+cEh1ZmZUcmVlUnZsY0VzY2FwZSAgPSBhSHVmZlRyZWVSdmxjRXNjYXBlOwotICBwUnZsYy0+cEh1ZmZUcmVlUnZsQ29kZXdkcyAgPSBhSHVmZlRyZWVSdmxDb2Rld2RzOworICBwUnZsYy0+cEh1ZmZUcmVlUnZsY0VzY2FwZSA9IGFIdWZmVHJlZVJ2bGNFc2NhcGU7CisgIHBSdmxjLT5wSHVmZlRyZWVSdmxDb2Rld2RzID0gYUh1ZmZUcmVlUnZsQ29kZXdkczsKIAogICAvKiBpbml0IHNjZiBhcnJheXMgKGZvciBzYXZldHkgKGluIGNhc2Ugb2YgdGhlcmUgYXJlIG9ubHkgemVybyBjb2RlYm9va3MpKSAqLwogICBmb3IgKGJuZHMgPSAwOyBibmRzIDwgUlZMQ19NQVhfU0ZCOyBibmRzKyspIHsKQEAgLTE0OCwzMyArMTY1LDM3IEBACiAgICAgcFNjYWxlRmFjdG9yW2JuZHNdID0gMDsKICAgfQogCi0gIC8qIHNldCBiYXNlIGJpdHN0cmVhbSBwdHIgdG8gdGhlIFJWTC1jb2RlZCBwYXJ0IChzdGFydCBvZiBSVkxDIGRhdGEgKEVTQyAyKSkgKi8KLSAgRkRLc3luY0NhY2hlIChicyk7CisgIC8qIHNldCBiYXNlIGJpdHN0cmVhbSBwdHIgdG8gdGhlIFJWTC1jb2RlZCBwYXJ0IChzdGFydCBvZiBSVkxDIGRhdGEgKEVTQyAyKSkKKyAgICovCisgIEZES3N5bmNDYWNoZShicyk7CisgIHBSdmxjLT5ic0FuY2hvciA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKTsKIAotICBwUnZsYy0+Yml0c3RyZWFtSW5kZXhSdmxGd2QgPSBGREtnZXRCaXRDbnQoYnMpOyAvKiBmaXJzdCBiaXQgd2l0aGluIFJWTCBjb2RlZCBibG9jayBhcyBzdGFydCBhZGRyZXNzIGZvciAgZm9yd2FyZCBkZWNvZGluZyAqLwotICBwUnZsYy0+Yml0c3RyZWFtSW5kZXhSdmxCd2QgPSBGREtnZXRCaXRDbnQoYnMpICsgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmIC0gMTsgLyogbGFzdCBiaXQgd2l0aGluIFJWTCBjb2RlZCBibG9jayBhcyBzdGFydCBhZGRyZXNzIGZvciBiYWNrd2FyZCBkZWNvZGluZyAqLworICBwUnZsYy0+Yml0c3RyZWFtSW5kZXhSdmxGd2QgPQorICAgICAgMDsgLyogZmlyc3QgYml0IHdpdGhpbiBSVkwgY29kZWQgYmxvY2sgYXMgc3RhcnQgYWRkcmVzcyBmb3IgIGZvcndhcmQKKyAgICAgICAgICAgIGRlY29kaW5nICovCisgIHBSdmxjLT5iaXRzdHJlYW1JbmRleFJ2bEJ3ZCA9CisgICAgICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2YgLSAxOyAvKiBsYXN0IGJpdCB3aXRoaW4gUlZMIGNvZGVkIGJsb2NrIGFzIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGZvciBiYWNrd2FyZCBkZWNvZGluZyAqLwogCi0gIC8qIHNraXAgUlZMQy1iaXRzdHJlYW0tcGFydCAtLSBwb2ludGluZyBub3cgdG8gZXNjYXBlcyAoaWYgcHJlc2VudCkgb3IgdG8gVE5TIGRhdGEgKGlmIHByZXNlbnQpICovCi0gIEZES3B1c2hGb3IgKGJzLCBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2YpOworICAvKiBza2lwIFJWTEMtYml0c3RyZWFtLXBhcnQgLS0gcG9pbnRpbmcgbm93IHRvIGVzY2FwZXMgKGlmIHByZXNlbnQpIG9yIHRvIFROUworICAgKiBkYXRhIChpZiBwcmVzZW50KSAqLworICBGREtwdXNoRm9yKGJzLCBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2YpOwogCi0gIGlmICggcFJ2bGMtPnNmX2VzY2FwZXNfcHJlc2VudCAhPSAwICkgewotCisgIGlmIChwUnZsYy0+c2ZfZXNjYXBlc19wcmVzZW50ICE9IDApIHsKICAgICAvKiBsb2NhdGUgaW50ZXJuYWwgYml0c3RyZWFtIHB0ciBhdCBlc2NhcGVzICh3aGljaCBpcyB0aGUgc2Vjb25kIHBhcnQpICovCi0gICAgRkRLc3luY0NhY2hlIChicyk7Ci0gICAgcFJ2bGMtPmJpdHN0cmVhbUluZGV4RXNjID0gRkRLZ2V0Qml0Q250KGJzKTsKKyAgICBGREtzeW5jQ2FjaGUoYnMpOworICAgIHBSdmxjLT5iaXRzdHJlYW1JbmRleEVzYyA9IHBSdmxjLT5ic0FuY2hvciAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKTsKIAotICAgIC8qIHNraXAgZXNjYXBlUlZMQy1iaXRzdHJlYW0tcGFydCAtLSBwb2ludGluZyB0byBUTlMgZGF0YSAoaWYgcHJlc2VudCkgICB0byBtYWtlIGRlY29kZXIgY29udGludWUgKi8KLSAgICAvKiBkZWNvZGluZyBvZiBSVkxDIHNob3VsZCB3b3JrIGRlc3BpdGUgdGhpcyBzZWNvbmQgcHVzaEZvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYmVjYXVzZSAgICAgICAgKi8KLSAgICAvKiBiaXRzdHJlYW0gaW5pdGlhbGl6YXRpb24gaXMgdmFsaWQgZm9yIGJvdGggRVNDMiBkYXRhIHBhcnRzIChSVkwtY29kZWQgdmFsdWVzIGFuZCBFU0MtY29kZWQgdmFsdWVzKSAqLwotICAgIEZES3B1c2hGb3IgKGJzLCBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcyk7CisgICAgLyogc2tpcCBlc2NhcGVSVkxDLWJpdHN0cmVhbS1wYXJ0IC0tIHBvaW50aW5nIHRvIFROUyBkYXRhIChpZiBwcmVzZW50KSAgIHRvCisgICAgICogbWFrZSBkZWNvZGVyIGNvbnRpbnVlICovCisgICAgLyogZGVjb2Rpbmcgb2YgUlZMQyBzaG91bGQgd29yayBkZXNwaXRlIHRoaXMgc2Vjb25kIHB1c2hGb3IgZHVyaW5nCisgICAgICogaW5pdGlhbGl6YXRpb24gYmVjYXVzZSAgICAgICAgKi8KKyAgICAvKiBiaXRzdHJlYW0gaW5pdGlhbGl6YXRpb24gaXMgdmFsaWQgZm9yIGJvdGggRVNDMiBkYXRhIHBhcnRzIChSVkwtY29kZWQKKyAgICAgKiB2YWx1ZXMgYW5kIEVTQy1jb2RlZCB2YWx1ZXMpICovCisgICAgRkRLcHVzaEZvcihicywgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpOwogICB9Ci0KLSNpZiBWRVJCT1NFX1JWTENfSU5JVAotICBEZWJ1Z091dHB1dEluaXQocFJ2bGMscEFhY0RlY29kZXJDaGFubmVsSW5mbyk7Ci0jZW5kaWYKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBmdW5jdGlvbjogICAgIHJ2bGNDaGVja0ludGVuc2l0eUNiCiAKQEAgLTE4NywyMCArMjA4LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBpbnRlbnNpdHkgY29kZWJvb2sgaXMgdXNlZAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgICAtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYwotdm9pZCBydmxjQ2hlY2tJbnRlbnNpdHlDYiAoQ0VyUnZsY0luZm8gICAgICAgICAgICAqcFJ2bGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKQoteworc3RhdGljIHZvaWQgcnZsY0NoZWNrSW50ZW5zaXR5Q2IoCisgICAgQ0VyUnZsY0luZm8gKnBSdmxjLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKSB7CiAgIGludCBncm91cCwgYmFuZCwgYm5kczsKIAogICBwUnZsYy0+aW50ZW5zaXR5X3VzZWQgPSAwOwogCi0gIGZvciAoZ3JvdXA9MDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7Ci0gICAgZm9yIChiYW5kPTA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewotICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7Ci0gICAgICBpZiAoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdID09IElOVEVOU0lUWV9IQ0IpIHx8IChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdID09IElOVEVOU0lUWV9IQ0IyKSApIHsKKyAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOworICAgICAgaWYgKChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdID09CisgICAgICAgICAgIElOVEVOU0lUWV9IQ0IpIHx8CisgICAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10gPT0KKyAgICAgICAgICAgSU5URU5TSVRZX0hDQjIpKSB7CiAgICAgICAgIHBSdmxjLT5pbnRlbnNpdHlfdXNlZCA9IDE7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQpAQCAtMjA4LDQ5ICsyMzEsNDcgQEAKICAgfQogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGZ1bmN0aW9uOiAgICAgcnZsY0RlY29kZUVzY2FwZVdvcmQKIAotICAgICBkZXNjcmlwdGlvbjogIERlY29kZSBhIGh1ZmZtYW4gY29kZWQgUlZMQyBFc2NhcGUtd29yZC4gVGhpcyB2YWx1ZSBpcyBwYXJ0IG9mIGEgRFBDTSBjb2RlZAotICAgICAgICAgICAgICAgICAgIHNjYWxlZmFjdG9yLgorICAgICBkZXNjcmlwdGlvbjogIERlY29kZSBhIGh1ZmZtYW4gY29kZWQgUlZMQyBFc2NhcGUtd29yZC4gVGhpcyB2YWx1ZSBpcyBwYXJ0CitvZiBhIERQQ00gY29kZWQgc2NhbGVmYWN0b3IuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICBpbnB1dDogICAgIC0gcG9pbnRlciBydmxjIHN0cnVjdHVyZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgcmV0dXJuOiAgICAtIGEgc2luZ2xlIFJWTEMtRXNjYXBlIHZhbHVlIHdoaWNoIGhhZCB0byBiZSBhcHBsaWVkIHRvIGEgRFBDTSB2YWx1ZSAod2hpY2gKLSAgICAgICAgICAgICAgICAgICAgIGhhcyBhIGFic29sdXRlIHZhbHVlIG9mIDcpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICByZXR1cm46ICAgIC0gYSBzaW5nbGUgUlZMQy1Fc2NhcGUgdmFsdWUgd2hpY2ggaGFkIHRvIGJlIGFwcGxpZWQgdG8gYQorRFBDTSB2YWx1ZSAod2hpY2ggaGFzIGEgYWJzb2x1dGUgdmFsdWUgb2YgNykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi1zdGF0aWMKLVNDSEFSIHJ2bGNEZWNvZGVFc2NhcGVXb3JkIChDRXJSdmxjSW5mbyAgICAgICAgICAqcFJ2bGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGJzKQotewotICBpbnQgICAgICAgICAgIGk7Ci0gIFNDSEFSICAgICAgICAgdmFsdWU7Ci0gIFVDSEFSICAgICAgICAgY2FycnlCaXQ7Ci0gIFVJTlQgICAgICAgICAgdHJlZU5vZGU7Ci0gIFVJTlQgICAgICAgICAgYnJhbmNoVmFsdWU7Ci0gIFVJTlQgICAgICAgICAgYnJhbmNoTm9kZTsKK3N0YXRpYyBTQ0hBUiBydmxjRGVjb2RlRXNjYXBlV29yZChDRXJSdmxjSW5mbyAqcFJ2bGMsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CisgIGludCBpOworICBTQ0hBUiB2YWx1ZTsKKyAgVUNIQVIgY2FycnlCaXQ7CisgIFVJTlQgdHJlZU5vZGU7CisgIFVJTlQgYnJhbmNoVmFsdWU7CisgIFVJTlQgYnJhbmNoTm9kZTsKIAotICBVU0hPUlQqICAgICAgIHBCaXRzdHJlYW1JbmRleEVzYzsKLSAgY29uc3QgVUlOVCogICBwRXNjVHJlZTsKKyAgSU5UICpwQml0c3RyZWFtSW5kZXhFc2M7CisgIGNvbnN0IFVJTlQgKnBFc2NUcmVlOwogCiAgIHBFc2NUcmVlID0gcFJ2bGMtPnBIdWZmVHJlZVJ2bGNFc2NhcGU7CiAgIHBCaXRzdHJlYW1JbmRleEVzYyA9ICYocFJ2bGMtPmJpdHN0cmVhbUluZGV4RXNjKTsKLSAgdHJlZU5vZGUgPSAqcEVzY1RyZWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBhdCBzdGFydGluZyBub2RlICovCisgIHRyZWVOb2RlID0gKnBFc2NUcmVlOyAvKiBpbml0IGF0IHN0YXJ0aW5nIG5vZGUgKi8KIAotICBmb3IgKGk9TUFYX0xFTl9SVkxDX0VTQ0FQRV9XT1JELTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgY2FycnlCaXQgPSBydmxjUmVhZEJpdEZyb21CaXRzdHJlYW0oYnMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRzdHJlYW1JbmRleEVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0QpOworICBmb3IgKGkgPSBNQVhfTEVOX1JWTENfRVNDQVBFX1dPUkQgLSAxOyBpID49IDA7IGktLSkgeworICAgIGNhcnJ5Qml0ID0KKyAgICAgICAgcnZsY1JlYWRCaXRGcm9tQml0c3RyZWFtKGJzLCAvKiBnZXQgbmV4dCBiaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdmxjLT5ic0FuY2hvciwgcEJpdHN0cmVhbUluZGV4RXNjLCBGV0QpOwogCi0gICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGh1ZmZtYW4gZGVjb2RpbmcsIGRvIGEgc2luZ2xlIHN0ZXAgaW4gaHVmZm1hbiBkZWNvZGluZyB0cmVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hOb2RlKTsKKyAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsIC8qIGh1ZmZtYW4gZGVjb2RpbmcsIGRvIGEgc2luZ2xlIHN0ZXAgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW4gZGVjb2RpbmcgdHJlZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlTm9kZSwgJmJyYW5jaFZhbHVlLCAmYnJhbmNoTm9kZSk7CiAKLSAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0gVEVTVF9CSVRfMTApIHsgICAgICAgICAgICAgICAgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgLS0+IGEgUlZMQy1lc2NhcGUtd29yZCBpcyBjb21wbGV0ZWx5IGRlY29kZWQgKi8KLSAgICAgIHZhbHVlID0gKFNDSEFSKSBicmFuY2hOb2RlICYgQ0xSX0JJVF8xMDsKKyAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0KKyAgICAgICAgVEVTVF9CSVRfMTApIHsgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgLS0+IGEgUlZMQy1lc2NhcGUtd29yZCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWx5IGRlY29kZWQgKi8KKyAgICAgIHZhbHVlID0gKFNDSEFSKWJyYW5jaE5vZGUgJiBDTFJfQklUXzEwOwogICAgICAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMgLT0gKE1BWF9MRU5fUlZMQ19FU0NBUEVfV09SRCAtIGkpOwogCiAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMgPCAwKSB7CkBAIC0yNTksMzIgKzI4MCwzMyBAQAogICAgICAgfQogCiAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdHJlZU5vZGUgPSAqKHBFc2NUcmVlICsgYnJhbmNoVmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCisgICAgfSBlbHNlIHsKKyAgICAgIHRyZWVOb2RlID0gKigKKyAgICAgICAgICBwRXNjVHJlZSArCisgICAgICAgICAgYnJhbmNoVmFsdWUpOyAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCiAgICAgfQogICB9CiAKICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX0FMTF9FU0NBUEVfV09SRFNfSU5WQUxJRDsKIAotICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG91bGQgbm90IGJlIHJlYWNoZWQgKi8KKyAgcmV0dXJuIC0xOyAvKiBzaG91bGQgbm90IGJlIHJlYWNoZWQgKi8KIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBmdW5jdGlvbjogICAgIHJ2bGNEZWNvZGVFc2NhcGVzCiAKICAgICAgZGVzY3JpcHRpb246ICBEZWNvZGVzIGFsbCBodWZmbWFuIGNvZGVkIFJWTEMgRXNjYXBlIFdvcmRzLgotICAgICAgICAgICAgICAgICAgIEhlcmUgYSBkaWZmZXJlbmNlIHRvIHRoZSBwc2V1ZG8tY29kZS1pbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIGNhbiBiZSAKLSAgICAgICAgICAgICAgICAgICBmb3VuZC4gQSB3aGlsZSBsb29wIChhbmQgbm90IHR3byBuZXN0ZWQgZm9yIGxvb3BzKSBpcyB1c2VkIGZvciB0d28gcmVhc29uczoKKyAgICAgICAgICAgICAgICAgICBIZXJlIGEgZGlmZmVyZW5jZSB0byB0aGUgcHNldWRvLWNvZGUtaW1wbGVtZW50YXRpb24gZnJvbQorc3RhbmRhcmQgY2FuIGJlIGZvdW5kLiBBIHdoaWxlIGxvb3AgKGFuZCBub3QgdHdvIG5lc3RlZCBmb3IgbG9vcHMpIGlzIHVzZWQgZm9yCit0d28gcmVhc29uczoKIAotICAgICAgICAgICAgICAgICAgIDEuIFRoZSBwbGFpbiBodWZmbWFuIGVuY29kZWQgZXNjYXBlcyBhcmUgZGVjb2RlZCBiZWZvcmUgdGhlIFJWTC1jb2RlZCAKLSAgICAgICAgICAgICAgICAgICAgICBzY2FsZWZhY3RvcnMuIFRoZXJlZm9yZSB0aGUgZXNjYXBlcyBhcmUgcHJlc2VudCBpbiB0aGUgc2Vjb25kIHN0ZXAgCi0gICAgICAgICAgICAgICAgICAgICAgd2hlbiBkZWNvZGluZyB0aGUgUlZMLWNvZGVkLXNjYWxlZmFjdG9yIHZhbHVlcyBpbiBmb3J3YXJkIGFuZCAKLSAgICAgICAgICAgICAgICAgICAgICBiYWNrd2FyZCBkaXJlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgMS4gVGhlIHBsYWluIGh1ZmZtYW4gZW5jb2RlZCBlc2NhcGVzIGFyZSBkZWNvZGVkIGJlZm9yZSB0aGUKK1JWTC1jb2RlZCBzY2FsZWZhY3RvcnMuIFRoZXJlZm9yZSB0aGUgZXNjYXBlcyBhcmUgcHJlc2VudCBpbiB0aGUgc2Vjb25kIHN0ZXAKKyAgICAgICAgICAgICAgICAgICAgICB3aGVuIGRlY29kaW5nIHRoZSBSVkwtY29kZWQtc2NhbGVmYWN0b3IgdmFsdWVzIGluIGZvcndhcmQKK2FuZCBiYWNrd2FyZCBkaXJlY3Rpb24uCiAKLSAgICAgICAgICAgICAgICAgICAgICBXaGVuIHRoZSBSVkwtY29kZWQgc2NhbGVmYWN0b3JzIGFyZSBkZWNvZGVkIGFuZCB0aGVyZSBhIGVzY2FwZSBpcyAKLSAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIHRoZW4gaXQgaXMganVzdCB0YWtlbiBvdXQgb2YgdGhlIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgICAgICAgICAgICAgICAgICBXaGVuIHRoZSBSVkwtY29kZWQgc2NhbGVmYWN0b3JzIGFyZSBkZWNvZGVkIGFuZCB0aGVyZSBhCitlc2NhcGUgaXMgbmVlZGVkLCB0aGVuIGl0IGlzIGp1c3QgdGFrZW4gb3V0IG9mIHRoZSBhcnJheSBpbiBhc2NlbmRpbmcgb3JkZXIuCiAKICAgICAgICAgICAgICAgICAgICAyLiBJdCdzIGZhc3Rlci4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yOTQsMjkgKzMxNiwyNSBAQAogICAgICAgICByZXR1cm46ICAgIC0gMCBvayAgICAgdGhlIGRlY29kZWQgZXNjYXBlcyBzZWVtIHRvIGJlIHZhbGlkCiAgICAgICAgICAgICAgICAgICAgLSAxIGVycm9yICB0aGVyZSB3YXMgYSBlcnJvciBkZXRlY3RlZCBkdXJpbmcgZGVjb2RpbmcgZXNjYXBlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IGFsbCBlc2NhcGVzIGFyZSBpbnZhbGlkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYwotdm9pZCBydmxjRGVjb2RlRXNjYXBlcyAoQ0VyUnZsY0luZm8gICAgICAgICAgKnBSdmxjLAotICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgICAgICAgICAgICAgICAgKnBFc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMpCi17Ci0gIFNDSEFSICBlc2NXb3JkOwotICBTQ0hBUiAgZXNjQ250PTA7Ci0gIFNIT1JUKiBwRXNjQml0Q250U3VtOworc3RhdGljIHZvaWQgcnZsY0RlY29kZUVzY2FwZXMoQ0VyUnZsY0luZm8gKnBSdmxjLCBTSE9SVCAqcEVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CisgIFNDSEFSIGVzY1dvcmQ7CisgIFNDSEFSIGVzY0NudCA9IDA7CisgIFNIT1JUICpwRXNjQml0Q250U3VtOwogCiAgIHBFc2NCaXRDbnRTdW0gPSAmKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKTsKIAogICAvKiBEZWNvZGUgYWxsIFJWTEMtRXNjYXBlIHdvcmRzIHdpdGggYSBwbGFpbiBIdWZmbWFuLURlY29kZXIgKi8KLSAgd2hpbGUgKCAqcEVzY0JpdENudFN1bSA+IDAgKSB7CisgIHdoaWxlICgqcEVzY0JpdENudFN1bSA+IDApIHsKICAgICBlc2NXb3JkID0gcnZsY0RlY29kZUVzY2FwZVdvcmQocFJ2bGMsIGJzKTsKIAogICAgIGlmIChlc2NXb3JkID49IDApIHsKLQogICAgICAgcEVzY1tlc2NDbnRdID0gZXNjV29yZDsKICAgICAgIGVzY0NudCsrOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX0FMTF9FU0NBUEVfV09SRFNfSU5WQUxJRDsKICAgICAgIHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNFc2MgPSBlc2NDbnQ7CiAKQEAgLTMyNyw3ICszNDUsNiBAQAogICBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjID0gZXNjQ250OwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGZ1bmN0aW9uOiAgICAgZGVjb2RlUlZMQ29kZXdvcmQKIApAQCAtMzM2LDY4ICszNTMsNzIgQEAKICAgICAgICAgaW5wdXQ6ICAgICAtIEZESyBiaXRzdHJlYW0gaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIHJ2bGMgc3RydWN0dXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICByZXR1cm46ICAgIC0gYSBkcGNtIHZhbHVlIHdoaWNoIGlzIHdpdGhpbiByYW5nZSBbMCwxLC4uLDE0XSBpbiBjYXNlIG9mIG5vIGVycm9ycy4KLSAgICAgICAgICAgICAgICAgICAgIFRoZSBvZmZzZXQgb2YgNyBtdXN0IGJlIHN1YnRyYWN0ZWQgdG8gZ2V0IGEgdmFsaWQgZHBjbSBzY2FsZWZhY3RvciB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgZXJyb3JzIGEgZm9yYmlkZGVuIGNvZGV3b3JkIGlzIGRldGVjdGVkIC0tPiByZXR1cm5pbmcgLTEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgIHJldHVybjogICAgLSBhIGRwY20gdmFsdWUgd2hpY2ggaXMgd2l0aGluIHJhbmdlIFswLDEsLi4sMTRdIGluIGNhc2Ugb2YKK25vIGVycm9ycy4gVGhlIG9mZnNldCBvZiA3IG11c3QgYmUgc3VidHJhY3RlZCB0byBnZXQgYSB2YWxpZCBkcGNtIHNjYWxlZmFjdG9yCit2YWx1ZS4gSW4gY2FzZSBvZiBlcnJvcnMgYSBmb3JiaWRkZW4gY29kZXdvcmQgaXMgZGV0ZWN0ZWQgLS0+IHJldHVybmluZyAtMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLVNDSEFSIGRlY29kZVJWTENvZGV3b3JkIChIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsIENFclJ2bGNJbmZvICpwUnZsYykKLXsKLSAgaW50ICAgICBpOwotICBTQ0hBUiAgIHZhbHVlOwotICBVQ0hBUiAgIGNhcnJ5Qml0OwotICBVSU5UICAgIGJyYW5jaFZhbHVlOwotICBVSU5UICAgIGJyYW5jaE5vZGU7CitTQ0hBUiBkZWNvZGVSVkxDb2Rld29yZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0VyUnZsY0luZm8gKnBSdmxjKSB7CisgIGludCBpOworICBTQ0hBUiB2YWx1ZTsKKyAgVUNIQVIgY2FycnlCaXQ7CisgIFVJTlQgYnJhbmNoVmFsdWU7CisgIFVJTlQgYnJhbmNoTm9kZTsKIAogICBjb25zdCBVSU5UICpwUnZsQ29kZVRyZWUgPSBwUnZsYy0+cEh1ZmZUcmVlUnZsQ29kZXdkczsKLSAgVUNIQVIgICBkaXJlY3Rpb24gICAgICAgID0gcFJ2bGMtPmRpcmVjdGlvbjsKLSAgVVNIT1JUICpwQml0c3RySW5keFJ2bCAgID0gcFJ2bGMtPnBCaXRzdHJJbmR4UnZsX1JWTDsKLSAgVUlOVCAgICB0cmVlTm9kZSAgICAgICAgID0gKnBSdmxDb2RlVHJlZTsKKyAgVUNIQVIgZGlyZWN0aW9uID0gcFJ2bGMtPmRpcmVjdGlvbjsKKyAgSU5UICpwQml0c3RySW5keFJ2bCA9IHBSdmxjLT5wQml0c3RySW5keFJ2bF9SVkw7CisgIFVJTlQgdHJlZU5vZGUgPSAqcFJ2bENvZGVUcmVlOwogCi0gIGZvciAoaT1NQVhfTEVOX1JWTENfQ09ERV9XT1JELTE7IGkgPj0gMDsgaS0tKSB7IAotICAgIGNhcnJ5Qml0ID0gcnZsY1JlYWRCaXRGcm9tQml0c3RyZWFtKGJzLCAgICAgICAgICAgICAvKiBnZXQgbmV4dCBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0c3RySW5keFJ2bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24pOworICBmb3IgKGkgPSBNQVhfTEVOX1JWTENfQ09ERV9XT1JEIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBjYXJyeUJpdCA9CisgICAgICAgIHJ2bGNSZWFkQml0RnJvbUJpdHN0cmVhbShicywgLyogZ2V0IG5leHQgYml0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnZsYy0+YnNBbmNob3IsIHBCaXRzdHJJbmR4UnZsLCBkaXJlY3Rpb24pOwogCi0gICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LCAgICAgICAgICAgICAgICAgICAgIC8qIGh1ZmZtYW4gZGVjb2RpbmcsIGRvIGEgc2luZ2xlIHN0ZXAgaW4gaHVmZm1hbiBkZWNvZGluZyB0cmVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hOb2RlKTsKKyAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsIC8qIGh1ZmZtYW4gZGVjb2RpbmcsIGRvIGEgc2luZ2xlIHN0ZXAgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW4gZGVjb2RpbmcgdHJlZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlTm9kZSwgJmJyYW5jaFZhbHVlLCAmYnJhbmNoTm9kZSk7CiAKLSAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0gVEVTVF9CSVRfMTApIHsgICAgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgLS0+IGEgUlZMQy1jb2Rld29yZCBpcyBjb21wbGV0ZWx5IGRlY29kZWQgKi8KLSAgICAgIHZhbHVlID0gKFNDSEFSKSAoYnJhbmNoTm9kZSAmIENMUl9CSVRfMTApOwotICAgICAgKnBSdmxjLT5wUnZsQml0Q250X1JWTCAtPSAoTUFYX0xFTl9SVkxDX0NPREVfV09SRCAtIGkpOyAgCi0gICAgICAKKyAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0KKyAgICAgICAgVEVTVF9CSVRfMTApIHsgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgLS0+IGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUlZMQy1jb2Rld29yZCBpcyBjb21wbGV0ZWx5IGRlY29kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICB2YWx1ZSA9IChTQ0hBUikoYnJhbmNoTm9kZSAmIENMUl9CSVRfMTApOworICAgICAgKnBSdmxjLT5wUnZsQml0Q250X1JWTCAtPSAoTUFYX0xFTl9SVkxDX0NPREVfV09SRCAtIGkpOworCiAgICAgICAvKiBjaGVjayBhdmFpbGFibGUgYml0cyBmb3IgZGVjb2RpbmcgKi8KICAgICAgIGlmICgqcFJ2bGMtPnBSdmxCaXRDbnRfUlZMIDwgMCkgewotICAgICAgICBpZiAoZGlyZWN0aW9uID09ICBGV0QpIHsgCi0gICAgICAgICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX1JWTF9TVU1fQklUX0NPVU5URVJfQkVMT1dfWkVST19GV0Q7IH0KLSAgICAgICAgZWxzZSB7IAotICAgICAgICAgIHBSdmxjLT5lcnJvckxvZ1J2bGMgfD0gUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fQldEOyB9Ci0gICAgICAgIHZhbHVlID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpZ25hbGl6ZSBhbiBlcnJvciBpbiByZXR1cm4gdmFsdWUsIGJlY2F1c2UgdG9vIG1hbnkgYml0cyB3YXMgZGVjb2RlZCAqLworICAgICAgICBpZiAoZGlyZWN0aW9uID09IEZXRCkgeworICAgICAgICAgIHBSdmxjLT5lcnJvckxvZ1J2bGMgfD0gUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fRldEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBSdmxjLT5lcnJvckxvZ1J2bGMgfD0gUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fQldEOworICAgICAgICB9CisgICAgICAgIHZhbHVlID0gLTE7IC8qIHNpZ25hbGl6ZSBhbiBlcnJvciBpbiByZXR1cm4gdmFsdWUsIGJlY2F1c2UgdG9vIG1hbnkgYml0cworICAgICAgICAgICAgICAgICAgICAgICB3YXMgZGVjb2RlZCAqLwogICAgICAgfQotICAgICAgCisKICAgICAgIC8qIGNoZWNrIG1heCB2YWx1ZSBvZiBkcGNtIHZhbHVlICovCiAgICAgICBpZiAodmFsdWUgPiBNQVhfQUxMT1dFRF9EUENNX0lOREVYKSB7Ci0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gIEZXRCkgeyAKLSAgICAgICAgICBwUnZsYy0+ZXJyb3JMb2dSdmxjIHw9IFJWTENfRVJST1JfRk9SQklEREVOX0NXX0RFVEVDVEVEX0ZXRDsgCisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRldEKSB7CisgICAgICAgICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX0ZPUkJJRERFTl9DV19ERVRFQ1RFRF9GV0Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX0ZPUkJJRERFTl9DV19ERVRFQ1RFRF9CV0Q7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7IAotICAgICAgICAgIHBSdmxjLT5lcnJvckxvZ1J2bGMgfD0gUlZMQ19FUlJPUl9GT1JCSURERU5fQ1dfREVURUNURURfQldEOyAKLSAgICAgICAgfQotICAgICAgICB2YWx1ZSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaWduYWxpemUgYW4gZXJyb3IgaW4gcmV0dXJuIHZhbHVlLCBiZWNhdXNlIGEgZm9yYmlkZGVuIGN3IHdhcyBkZXRlY3RlZCovCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB2YWx1ZSA9IC0xOyAvKiBzaWduYWxpemUgYW4gZXJyb3IgaW4gcmV0dXJuIHZhbHVlLCBiZWNhdXNlIGEgZm9yYmlkZGVuCisgICAgICAgICAgICAgICAgICAgICAgIGN3IHdhcyBkZXRlY3RlZCovCisgICAgICB9CiAKLSAgICAgIHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGEgZHBjbSB2YWx1ZSB3aXRoIG9mZnNldCArNyBvciBhbiBlcnJvciBzdGF0dXMgKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB0cmVlTm9kZSA9ICoocFJ2bENvZGVUcmVlICsgYnJhbmNoVmFsdWUpOyAgICAgICAgIC8qIHVwZGF0ZSB0cmVlTm9kZSBmb3IgZnVydGhlciBzdGVwIGluIGRlY29kaW5nIHRyZWUgKi8KKyAgICAgIHJldHVybiB2YWx1ZTsgLyogcmV0dXJuIGEgZHBjbSB2YWx1ZSB3aXRoIG9mZnNldCArNyBvciBhbiBlcnJvciBzdGF0dXMgKi8KKyAgICB9IGVsc2UgeworICAgICAgdHJlZU5vZGUgPSAqKAorICAgICAgICAgIHBSdmxDb2RlVHJlZSArCisgICAgICAgICAgYnJhbmNoVmFsdWUpOyAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCiAgICAgfQogICB9Ci0gIAotICByZXR1cm4gLTE7ICAKLX0KIAorICByZXR1cm4gLTE7Cit9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGZ1bmN0aW9uOiAgICAgcnZsY0RlY29kZUZvcndhcmQKQEAgLTQwOSw5NCArNDMwLDU2IEBACiAgICAgICAgICAgICAgICAgICAgLSBoYW5kbGUgdG8gRkRLIGJpdHN0cmVhbQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgICAtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYwotdm9pZCBydmxjRGVjb2RlRm9yd2FyZCAoQ0VyUnZsY0luZm8gICAgICAgICAgICAqcFJ2bGMsCi0gICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCi17Ci0gIGludCBiYW5kICA9IDA7CitzdGF0aWMgdm9pZCBydmxjRGVjb2RlRm9yd2FyZChDRXJSdmxjSW5mbyAqcFJ2bGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpIHsKKyAgaW50IGJhbmQgPSAwOwogICBpbnQgZ3JvdXAgPSAwOwotICBpbnQgYm5kcyAgPSAwOworICBpbnQgYm5kcyA9IDA7CiAKICAgU0hPUlQgZHBjbTsKIAotICBTSE9SVCAgZmFjdG9yICAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVDsKLSAgU0hPUlQgIHBvc2l0aW9uID0gLSBTRl9PRkZTRVQ7Ci0gIFNIT1JUICBub2lzZW5yZyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUIC0gOTAgLSAyNTY7CisgIFNIT1JUIGZhY3RvciA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVDsKKyAgU0hPUlQgcG9zaXRpb24gPSAtU0ZfT0ZGU0VUOworICBTSE9SVCBub2lzZW5yZyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0KKyAgICAgICAgICAgICAgICAgICBTRl9PRkZTRVQgLSA5MCAtIDI1NjsKIAotICBTSE9SVCogcFNjZkZ3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZDsKLSAgU0hPUlQqIHBTY2ZFc2MgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZFc2M7Ci0gIFVDSEFSKiBwRXNjRndkQ250ID0gJihwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRndkKTsKLSAgCisgIFNIT1JUICpwU2NmRndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkOworICBTSE9SVCAqcFNjZkVzYyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkVzYzsKKyAgVUNIQVIgKnBFc2NGd2RDbnQgPSAmKHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNGd2QpOworCiAgIHBSdmxjLT5wUnZsQml0Q250X1JWTCA9ICYocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmX2Z3ZCk7CiAgIHBSdmxjLT5wQml0c3RySW5keFJ2bF9SVkwgPSAmKHBSdmxjLT5iaXRzdHJlYW1JbmRleFJ2bEZ3ZCk7CiAKLSAgKnBFc2NGd2RDbnQgICAgICAgPSAwOwotICBwUnZsYy0+ZGlyZWN0aW9uICA9IEZXRDsKKyAgKnBFc2NGd2RDbnQgPSAwOworICBwUnZsYy0+ZGlyZWN0aW9uID0gRldEOwogICBwUnZsYy0+bm9pc2VfdXNlZCA9IDA7Ci0gIHBSdmxjLT5zZl91c2VkICAgID0gMDsKLSAgcFJ2bGMtPmxhc3RTY2YgICAgPSAwOwotICBwUnZsYy0+bGFzdE5yZyAgICA9IDA7Ci0gIHBSdmxjLT5sYXN0SXMgICAgID0gMDsgICAgICAgICAKKyAgcFJ2bGMtPnNmX3VzZWQgPSAwOworICBwUnZsYy0+bGFzdFNjZiA9IDA7CisgIHBSdmxjLT5sYXN0TnJnID0gMDsKKyAgcFJ2bGMtPmxhc3RJcyA9IDA7CiAKLSAgcnZsY0NoZWNrSW50ZW5zaXR5Q2IocFJ2bGMscEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CisgIHJ2bGNDaGVja0ludGVuc2l0eUNiKHBSdmxjLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKIAogICAvKiBtYWluIGxvb3AgZndkIGxvbmcgKi8KLSAgZm9yIChncm91cD0wOyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKLSAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7Ci0gICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKKyAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOwogCiAgICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKKyAgICAgICAgY2FzZSBaRVJPX0hDQjoKKyAgICAgICAgICBwU2NmRndkW2JuZHNdID0gMDsKKyAgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBaRVJPX0hDQiA6Ci0gICAgICAgIHBTY2ZGd2RbYm5kc10gPSAwOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMiA6Ci0gICAgICBjYXNlIElOVEVOU0lUWV9IQ0IgIDoKLSAgICAgICAgLyogc3RvcmUgZHBjbV9pc19wb3NpdGlvbiAqLwotICAgICAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsKLSAgICAgICAgaWYgKCBkcGNtIDwgMCApIHsKLSAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBibmRzOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBkcGNtIC09IFRBQkxFX09GRlNFVDsKLSAgICAgICAgaWYgKChkcGNtID09IE1JTl9SVkwpIHx8IChkcGNtID09IE1BWF9SVkwpKSB7Ci0gICAgICAgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKSB7Ci0gICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBibmRzOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsgCi0gICAgICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MrKzsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsgCi0gICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MrKzsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKnBFc2NGd2RDbnQpKys7Ci0gICAgICAgICAgICBpZiAocFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyA9PSBDT05DRUFMX01BWF9JTklUKSB7Ci0gICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heF9lc2MgPSBibmRzOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwb3NpdGlvbiArPSBkcGNtOwotICAgICAgICBwU2NmRndkW2JuZHNdID0gcG9zaXRpb247Ci0gICAgICAgIHBSdmxjLT5sYXN0SXMgPSBwb3NpdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTk9JU0VfSENCIDoKLSAgICAgICAgaWYgKHBSdmxjLT5ub2lzZV91c2VkID09IDApIHsKLSAgICAgICAgICBwUnZsYy0+bm9pc2VfdXNlZCA9IDE7Ci0gICAgICAgICAgcFJ2bGMtPmZpcnN0X25vaXNlX2JhbmQgPSBibmRzOwotICAgICAgICAgIG5vaXNlbnJnICs9IHBSdmxjLT5kcGNtX25vaXNlX25yZzsKLSAgICAgICAgICBwU2NmRndkW2JuZHNdID0gMTAwICsgbm9pc2Vucmc7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgcFJ2bGMtPmxhc3ROcmcgPSBub2lzZW5yZzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMjoKKyAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgorICAgICAgICAgIC8qIHN0b3JlIGRwY21faXNfcG9zaXRpb24gKi8KICAgICAgICAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsKLSAgICAgICAgICBpZiAoIGRwY20gPCAwICkgeworICAgICAgICAgIGlmIChkcGNtIDwgMCkgewogICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gYm5kczsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9CkBAIC01MDUsMTMgKzQ4OCwxMSBAQAogICAgICAgICAgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKSB7CiAgICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IGJuZHM7CiAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7IAotICAgICAgICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MrKzsgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSB7IAotICAgICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MrKzsgCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7CisgICAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYysrOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MrKzsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAoKnBFc2NGd2RDbnQpKys7CiAgICAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9tYXhfZXNjID09IENPTkNFQUxfTUFYX0lOSVQpIHsKQEAgLTUxOSw1MCArNTAwLDg0IEBACiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgbm9pc2VucmcgKz0gZHBjbTsKLSAgICAgICAgICBwU2NmRndkW2JuZHNdID0gMTAwICsgbm9pc2Vucmc7Ci0gICAgICAgICAgcFJ2bGMtPmxhc3ROcmcgPSBub2lzZW5yZzsgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLmFhYy5QbnNEYXRhLnBuc1VzZWRbYm5kc10gPSAxOwotICAgICAgICBicmVhayA7CisgICAgICAgICAgcG9zaXRpb24gKz0gZHBjbTsKKyAgICAgICAgICBwU2NmRndkW2JuZHNdID0gcG9zaXRpb247CisgICAgICAgICAgcFJ2bGMtPmxhc3RJcyA9IHBvc2l0aW9uOworICAgICAgICAgIGJyZWFrOwogCi0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgcFJ2bGMtPnNmX3VzZWQgPSAxOwotICAgICAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsKLSAgICAgICAgaWYgKCBkcGNtIDwgMCApIHsKLSAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBibmRzOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBkcGNtIC09IFRBQkxFX09GRlNFVDsKLSAgICAgICAgaWYgKChkcGNtID09IE1JTl9SVkwpIHx8IChkcGNtID09IE1BWF9SVkwpKSB7Ci0gICAgICAgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKSB7CisgICAgICAgIGNhc2UgTk9JU0VfSENCOgorICAgICAgICAgIGlmIChwUnZsYy0+bm9pc2VfdXNlZCA9PSAwKSB7CisgICAgICAgICAgICBwUnZsYy0+bm9pc2VfdXNlZCA9IDE7CisgICAgICAgICAgICBwUnZsYy0+Zmlyc3Rfbm9pc2VfYmFuZCA9IGJuZHM7CisgICAgICAgICAgICBub2lzZW5yZyArPSBwUnZsYy0+ZHBjbV9ub2lzZV9ucmc7CisgICAgICAgICAgICBwU2NmRndkW2JuZHNdID0gMTAwICsgbm9pc2Vucmc7CisgICAgICAgICAgICBwUnZsYy0+bGFzdE5yZyA9IG5vaXNlbnJnOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsKKyAgICAgICAgICAgIGlmIChkcGNtIDwgMCkgeworICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBibmRzOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkcGNtIC09IFRBQkxFX09GRlNFVDsKKyAgICAgICAgICAgIGlmICgoZHBjbSA9PSBNSU5fUlZMKSB8fCAoZHBjbSA9PSBNQVhfUlZMKSkgeworICAgICAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKKyAgICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBibmRzOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7CisgICAgICAgICAgICAgICAgICBkcGNtIC09ICpwU2NmRXNjKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKCpwRXNjRndkQ250KSsrOworICAgICAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9tYXhfZXNjID09IENPTkNFQUxfTUFYX0lOSVQpIHsKKyAgICAgICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heF9lc2MgPSBibmRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9pc2VucmcgKz0gZHBjbTsKKyAgICAgICAgICAgIHBTY2ZGd2RbYm5kc10gPSAxMDAgKyBub2lzZW5yZzsKKyAgICAgICAgICAgIHBSdmxjLT5sYXN0TnJnID0gbm9pc2Vucmc7CisgICAgICAgICAgfQorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEuYWFjLlBuc0RhdGEucG5zVXNlZFtibmRzXSA9IDE7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBwUnZsYy0+c2ZfdXNlZCA9IDE7CisgICAgICAgICAgZHBjbSA9IGRlY29kZVJWTENvZGV3b3JkKGJzLCBwUnZsYyk7CisgICAgICAgICAgaWYgKGRwY20gPCAwKSB7CiAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBibmRzOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsgCi0gICAgICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MrKzsgfQotICAgICAgICAgICAgZWxzZSB7IAotICAgICAgICAgICAgICBkcGNtICs9ICpwU2NmRXNjKys7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgKCpwRXNjRndkQ250KSsrOwotICAgICAgICAgICAgaWYgKHBSdmxjLT5jb25jZWFsX21heF9lc2MgPT0gQ09OQ0VBTF9NQVhfSU5JVCkgewotICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXhfZXNjID0gYm5kczsKKyAgICAgICAgICBkcGNtIC09IFRBQkxFX09GRlNFVDsKKyAgICAgICAgICBpZiAoKGRwY20gPT0gTUlOX1JWTCkgfHwgKGRwY20gPT0gTUFYX1JWTCkpIHsKKyAgICAgICAgICAgIGlmIChwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcykgeworICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBibmRzOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7CisgICAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYysrOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAoKnBFc2NGd2RDbnQpKys7CisgICAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9tYXhfZXNjID09IENPTkNFQUxfTUFYX0lOSVQpIHsKKyAgICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXhfZXNjID0gYm5kczsKKyAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmYWN0b3IgKz0gZHBjbTsKLSAgICAgICAgcFNjZkZ3ZFtibmRzXSA9IGZhY3RvcjsKLSAgICAgICAgcFJ2bGMtPmxhc3RTY2YgPSBmYWN0b3I7Ci0gICAgICAgIGJyZWFrOworICAgICAgICAgIGZhY3RvciArPSBkcGNtOworICAgICAgICAgIHBTY2ZGd2RbYm5kc10gPSBmYWN0b3I7CisgICAgICAgICAgcFJ2bGMtPmxhc3RTY2YgPSBmYWN0b3I7CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CiAKICAgLyogcG9zdGZldGNoIGZ3ZCBsb25nICovCiAgIGlmIChwUnZsYy0+aW50ZW5zaXR5X3VzZWQpIHsKLSAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsgICAgICAvKiBkcGNtX2lzX2xhc3RfcG9zaXRpb24gKi8KLSAgICBpZiAoIGRwY20gPCAwICkgeworICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOyAvKiBkcGNtX2lzX2xhc3RfcG9zaXRpb24gKi8KKyAgICBpZiAoZHBjbSA8IDApIHsKICAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IGJuZHM7CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTcxLDE1ICs1ODYsMTMgQEAKICAgICAgIGlmIChwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcykgewogICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBibmRzOwogICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKGRwY20gPT0gTUlOX1JWTCkgeyAKLSAgICAgICAgICBkcGNtIC09ICpwU2NmRXNjKys7IAorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRwY20gPT0gTUlOX1JWTCkgeworICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkcGNtICs9ICpwU2NmRXNjKys7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7IAotICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MrKzsgCi0gICAgICAgIH0KLSAgICAgICAgKCpwRXNjRndkQ250KSsrOyAgCisgICAgICAgICgqcEVzY0Z3ZENudCkrKzsKICAgICAgICAgaWYgKHBSdmxjLT5jb25jZWFsX21heF9lc2MgPT0gQ09OQ0VBTF9NQVhfSU5JVCkgewogICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heF9lc2MgPSBibmRzOwogICAgICAgICB9CkBAIC01ODksNyArNjAyLDYgQEAKICAgfQogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGZ1bmN0aW9uOiAgICAgcnZsY0RlY29kZUJhY2t3YXJkCiAKQEAgLTYwMCwyMiArNjEyLDIyIEBACiAgICAgICAgICAgICAgICAgICAgLSBoYW5kbGUgRkRLIGJpdHN0cmVhbQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgICAtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYwotdm9pZCBydmxjRGVjb2RlQmFja3dhcmQgKENFclJ2bGNJbmZvICAgICAgICAgICAgKnBSdmxjLAotICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCi17Ci0gIFNIT1JUICBiYW5kLCBncm91cCwgZHBjbSwgb2Zmc2V0OwotICBTSE9SVCAgYm5kcyA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZC0xOworc3RhdGljIHZvaWQgcnZsY0RlY29kZUJhY2t3YXJkKENFclJ2bGNJbmZvICpwUnZsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CisgIFNIT1JUIGJhbmQsIGdyb3VwLCBkcGNtLCBvZmZzZXQ7CisgIFNIT1JUIGJuZHMgPSBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQgLSAxOwogCi0gIFNIT1JUICBmYWN0b3IgICAgID0gcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiAtIFNGX09GRlNFVDsKLSAgU0hPUlQgIHBvc2l0aW9uICAgPSBwUnZsYy0+ZHBjbV9pc19sYXN0X3Bvc2l0aW9uIC0gU0ZfT0ZGU0VUOwotICBTSE9SVCAgbm9pc2VucmcgICA9IHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gKyBwUnZsYy0+ZHBjbV9ub2lzZV9sYXN0X3Bvc2l0aW9uIC0gU0ZfT0ZGU0VUIC0gOTAgLSAyNTY7CisgIFNIT1JUIGZhY3RvciA9IHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gLSBTRl9PRkZTRVQ7CisgIFNIT1JUIHBvc2l0aW9uID0gcFJ2bGMtPmRwY21faXNfbGFzdF9wb3NpdGlvbiAtIFNGX09GRlNFVDsKKyAgU0hPUlQgbm9pc2VucmcgPSBwUnZsYy0+cmV2X2dsb2JhbF9nYWluICsgcFJ2bGMtPmRwY21fbm9pc2VfbGFzdF9wb3NpdGlvbiAtCisgICAgICAgICAgICAgICAgICAgU0ZfT0ZGU0VUIC0gOTAgLSAyNTY7CiAKLSAgU0hPUlQgKnBTY2ZCd2QgICAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2Q7Ci0gIFNIT1JUICpwU2NmRXNjICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRXNjOworICBTSE9SVCAqcFNjZkJ3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZDsKKyAgU0hPUlQgKnBTY2ZFc2MgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZFc2M7CiAgIFVDSEFSICpwRXNjRXNjQ250ID0gJihwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjKTsKICAgVUNIQVIgKnBFc2NCd2RDbnQgPSAmKHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNCd2QpOwogCkBAIC02MjQsMTUgKzYzNiwxNSBAQAogCiAgICpwRXNjQndkQ250ID0gMDsKICAgcFJ2bGMtPmRpcmVjdGlvbiA9IEJXRDsKLSAgcFNjZkVzYyArPSAqcEVzY0VzY0NudCAtIDE7ICAgICAgICAgICAgIC8qIHNldCBwU2NmRXNjIHRvIGxhc3QgZW50cnkgKi8KKyAgcFNjZkVzYyArPSAqcEVzY0VzY0NudCAtIDE7IC8qIHNldCBwU2NmRXNjIHRvIGxhc3QgZW50cnkgKi8KICAgcFJ2bGMtPmZpcnN0U2NmID0gMDsKICAgcFJ2bGMtPmZpcnN0TnJnID0gMDsKICAgcFJ2bGMtPmZpcnN0SXMgPSAwOwogCiAgIC8qIHByZWZldGNoIGxvbmcgQldEICovCiAgIGlmIChwUnZsYy0+aW50ZW5zaXR5X3VzZWQpIHsKLSAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsgICAgICAvKiBkcGNtX2lzX2xhc3RfcG9zaXRpb24gKi8KLSAgICBpZiAoIGRwY20gPCAwICkgeworICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOyAvKiBkcGNtX2lzX2xhc3RfcG9zaXRpb24gKi8KKyAgICBpZiAoZHBjbSA8IDApIHsKICAgICAgIHBSdmxjLT5kcGNtX2lzX2xhc3RfcG9zaXRpb24gPSAwOwogICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gYm5kczsKICAgICAgIHJldHVybjsKQEAgLTY0MiwxNSArNjU0LDEzIEBACiAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gYm5kczsKICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICB9IGVsc2UgewogICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7CiAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYy0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MtLTsKICAgICAgICAgfQotICAgICAgICAoKnBFc2NCd2RDbnQpKys7ICAKKyAgICAgICAgKCpwRXNjQndkQ250KSsrOwogICAgICAgICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9PSBDT05DRUFMX01JTl9JTklUKSB7CiAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9IGJuZHM7CiAgICAgICAgIH0KQEAgLTY2MCwxNzEgKzY3MCwxNjIgQEAKICAgfQogCiAgIC8qIG1haW4gbG9vcCBsb25nIEJXRCAqLwotICBmb3IgKGdyb3VwPXBSdmxjLT5udW1XaW5kb3dHcm91cHMtMTsgZ3JvdXAgPj0gMDsgZ3JvdXAtLSkgewotICAgIGZvciAoYmFuZD1wUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQtMTsgYmFuZCA+PSAwOyBiYW5kLS0pIHsKLSAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICBmb3IgKGdyb3VwID0gcFJ2bGMtPm51bVdpbmRvd0dyb3VwcyAtIDE7IGdyb3VwID49IDA7IGdyb3VwLS0pIHsKKyAgICBmb3IgKGJhbmQgPSBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQgLSAxOyBiYW5kID49IDA7IGJhbmQtLSkgeworICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOwogICAgICAgaWYgKChiYW5kID09IDApICYmIChwUnZsYy0+bnVtV2luZG93R3JvdXBzICE9IDEpKQogICAgICAgICBvZmZzZXQgPSAxNiAtIHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCArIDE7CiAgICAgICBlbHNlCiAgICAgICAgIG9mZnNldCA9IDE7CiAKICAgICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSkgeworICAgICAgICBjYXNlIFpFUk9fSENCOgorICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSAwOworICAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIFpFUk9fSENCIDoKLSAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IDA7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyIDoKLSAgICAgIGNhc2UgSU5URU5TSVRZX0hDQiAgOgotICAgICAgICAvKiBzdG9yZSBkcGNtX2lzX3Bvc2l0aW9uICovCi0gICAgICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOwotICAgICAgICBpZiAoIGRwY20gPCAwICkgewotICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBwb3NpdGlvbjsKLSAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBGREttYXgoMCxibmRzLW9mZnNldCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGRwY20gLT0gVEFCTEVfT0ZGU0VUOwotICAgICAgICBpZiAoKGRwY20gPT0gTUlOX1JWTCkgfHwgKGRwY20gPT0gTUFYX1JWTCkpIHsKLSAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKLSAgICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBwb3NpdGlvbjsKLSAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbiA9IEZES21heCgwLGJuZHMtb2Zmc2V0KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7Ci0gICAgICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICBkcGNtICs9ICpwU2NmRXNjLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKnBFc2NCd2RDbnQpKys7Ci0gICAgICAgICAgICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9PSBDT05DRUFMX01JTl9JTklUKSB7Ci0gICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbl9lc2MgPSBGREttYXgoMCxibmRzLW9mZnNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBTY2ZCd2RbYm5kc10gPSBwb3NpdGlvbjsKLSAgICAgICAgcG9zaXRpb24gLT0gZHBjbTsgIAotICAgICAgICBwUnZsYy0+Zmlyc3RJcyA9IHBvc2l0aW9uOyAKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTk9JU0VfSENCIDoKLSAgICAgICAgaWYgKCBibmRzID09IHBSdmxjLT5maXJzdF9ub2lzZV9iYW5kICkgewotICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBwUnZsYy0+ZHBjbV9ub2lzZV9ucmcgKyBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVCAtIDkwIC0gMjU2OyAgICAgICAgIAotICAgICAgICAgIHBSdmxjLT5maXJzdE5yZyA9IHBTY2ZCd2RbYm5kc107Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6CisgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjoKKyAgICAgICAgICAvKiBzdG9yZSBkcGNtX2lzX3Bvc2l0aW9uICovCiAgICAgICAgICAgZHBjbSA9IGRlY29kZVJWTENvZGV3b3JkKGJzLCBwUnZsYyk7Ci0gICAgICAgICAgaWYgKCBkcGNtIDwgMCApIHsKLSAgICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBub2lzZW5yZzsKLSAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbiA9IEZES21heCgwLGJuZHMtb2Zmc2V0KTsKKyAgICAgICAgICBpZiAoZHBjbSA8IDApIHsKKyAgICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbiA9IGZNYXgoMCwgYm5kcyAtIG9mZnNldCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgfQogICAgICAgICAgIGRwY20gLT0gVEFCTEVfT0ZGU0VUOwogICAgICAgICAgIGlmICgoZHBjbSA9PSBNSU5fUlZMKSB8fCAoZHBjbSA9PSBNQVhfUlZMKSkgewogICAgICAgICAgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKSB7Ci0gICAgICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBub2lzZW5yZzsKLSAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gRkRLbWF4KDAsYm5kcy1vZmZzZXQpOworICAgICAgICAgICAgICBwU2NmQndkW2JuZHNdID0gcG9zaXRpb247CisgICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbiA9IGZNYXgoMCwgYm5kcyAtIG9mZnNldCk7CiAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYgKGRwY20gPT0gTUlOX1JWTCkgewogICAgICAgICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MtLTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBkcGNtICs9ICpwU2NmRXNjLS07CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgKCpwRXNjQndkQ250KSsrOwogICAgICAgICAgICAgICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9PSBDT05DRUFMX01JTl9JTklUKSB7Ci0gICAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9IEZES21heCgwLGJuZHMtb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW5fZXNjID0gZk1heCgwLCBibmRzIC0gb2Zmc2V0KTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBwU2NmQndkW2JuZHNdID0gbm9pc2Vucmc7Ci0gICAgICAgICAgbm9pc2VucmcgLT0gZHBjbTsKLSAgICAgICAgICBwUnZsYy0+Zmlyc3ROcmcgPSBub2lzZW5yZzsKLSAgICAgICAgfQotICAgICAgICBicmVhayA7CisgICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IHBvc2l0aW9uOworICAgICAgICAgIHBvc2l0aW9uIC09IGRwY207CisgICAgICAgICAgcFJ2bGMtPmZpcnN0SXMgPSBwb3NpdGlvbjsKKyAgICAgICAgICBicmVhazsKIAotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOwotICAgICAgICBpZiAoIGRwY20gPCAwICkgewotICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBmYWN0b3I7Ci0gICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gRkRLbWF4KDAsYm5kcy1vZmZzZXQpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBkcGNtIC09IFRBQkxFX09GRlNFVDsKLSAgICAgICAgaWYgKChkcGNtID09IE1JTl9SVkwpIHx8IChkcGNtID09IE1BWF9SVkwpKSB7Ci0gICAgICAgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKSB7CisgICAgICAgIGNhc2UgTk9JU0VfSENCOgorICAgICAgICAgIGlmIChibmRzID09IHBSdmxjLT5maXJzdF9ub2lzZV9iYW5kKSB7CisgICAgICAgICAgICBwU2NmQndkW2JuZHNdID0KKyAgICAgICAgICAgICAgICBwUnZsYy0+ZHBjbV9ub2lzZV9ucmcgKworICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0KKyAgICAgICAgICAgICAgICBTRl9PRkZTRVQgLSA5MCAtIDI1NjsKKyAgICAgICAgICAgIHBSdmxjLT5maXJzdE5yZyA9IHBTY2ZCd2RbYm5kc107CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOworICAgICAgICAgICAgaWYgKGRwY20gPCAwKSB7CisgICAgICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBub2lzZW5yZzsKKyAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gZk1heCgwLCBibmRzIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHBjbSAtPSBUQUJMRV9PRkZTRVQ7CisgICAgICAgICAgICBpZiAoKGRwY20gPT0gTUlOX1JWTCkgfHwgKGRwY20gPT0gTUFYX1JWTCkpIHsKKyAgICAgICAgICAgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKSB7CisgICAgICAgICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IG5vaXNlbnJnOworICAgICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbiA9IGZNYXgoMCwgYm5kcyAtIG9mZnNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsKKyAgICAgICAgICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MtLTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgZHBjbSArPSAqcFNjZkVzYy0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAoKnBFc2NCd2RDbnQpKys7CisgICAgICAgICAgICAgICAgaWYgKHBSdmxjLT5jb25jZWFsX21pbl9lc2MgPT0gQ09OQ0VBTF9NSU5fSU5JVCkgeworICAgICAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9IGZNYXgoMCwgYm5kcyAtIG9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU2NmQndkW2JuZHNdID0gbm9pc2Vucmc7CisgICAgICAgICAgICBub2lzZW5yZyAtPSBkcGNtOworICAgICAgICAgICAgcFJ2bGMtPmZpcnN0TnJnID0gbm9pc2Vucmc7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZHBjbSA9IGRlY29kZVJWTENvZGV3b3JkKGJzLCBwUnZsYyk7CisgICAgICAgICAgaWYgKGRwY20gPCAwKSB7CiAgICAgICAgICAgICBwU2NmQndkW2JuZHNdID0gZmFjdG9yOwotICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gRkRLbWF4KDAsYm5kcy1vZmZzZXQpOworICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gZk1heCgwLCBibmRzIC0gb2Zmc2V0KTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7Ci0gICAgICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICBkcGNtICs9ICpwU2NmRXNjLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKnBFc2NCd2RDbnQpKys7Ci0gICAgICAgICAgICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9PSBDT05DRUFMX01JTl9JTklUKSB7Ci0gICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbl9lc2MgPSBGREttYXgoMCxibmRzLW9mZnNldCk7CisgICAgICAgICAgZHBjbSAtPSBUQUJMRV9PRkZTRVQ7CisgICAgICAgICAgaWYgKChkcGNtID09IE1JTl9SVkwpIHx8IChkcGNtID09IE1BWF9SVkwpKSB7CisgICAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKKyAgICAgICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IGZhY3RvcjsKKyAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gZk1heCgwLCBibmRzIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKGRwY20gPT0gTUlOX1JWTCkgeworICAgICAgICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MtLTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkcGNtICs9ICpwU2NmRXNjLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKCpwRXNjQndkQ250KSsrOworICAgICAgICAgICAgICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9PSBDT05DRUFMX01JTl9JTklUKSB7CisgICAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9IGZNYXgoMCwgYm5kcyAtIG9mZnNldCk7CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IGZhY3RvcjsKLSAgICAgICAgZmFjdG9yIC09IGRwY207Ci0gICAgICAgIHBSdmxjLT5maXJzdFNjZiA9IGZhY3RvcjsKLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IGZhY3RvcjsKKyAgICAgICAgICBmYWN0b3IgLT0gZHBjbTsKKyAgICAgICAgICBwUnZsYy0+Zmlyc3RTY2YgPSBmYWN0b3I7CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZnVuY3Rpb246ICAgICBydmxjRmluYWxFcnJvckRldGVjdGlvbiAgICAgICAgICAgICAKKyAgICAgZnVuY3Rpb246ICAgICBydmxjRmluYWxFcnJvckRldGVjdGlvbgogCi0gICAgIGRlc2NyaXB0aW9uOiAgQ2FsbCBSVkxDIGNvbmNlYWxtZW50IGlmIGVycm9yIHdhcyBkZXRlY3RlZCBpbiBkZWNvZGluZyBwcm9jZXNzCisgICAgIGRlc2NyaXB0aW9uOiAgQ2FsbCBSVkxDIGNvbmNlYWxtZW50IGlmIGVycm9yIHdhcyBkZXRlY3RlZCBpbiBkZWNvZGluZworcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgaW5wdXQ6ICAgICAtIHBvaW50ZXIgcnZsYyBzdHJ1Y3R1cmUKICAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgY2hhbm5lbCBpbmZvIHN0cnVjdHVyZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgICAtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYwotdm9pZCBydmxjRmluYWxFcnJvckRldGVjdGlvbiAoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAgKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKQotewotICBDRXJSdmxjSW5mbyAqcFJ2bGMgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87Ci0gIFVDSEFSIEVycm9yU3RhdHVzQ29tcGxldGUgICAgICAgPSAwOwotICBVQ0hBUiBFcnJvclN0YXR1c0xlbmd0aEZ3ZCAgICAgID0gMDsKLSAgVUNIQVIgRXJyb3JTdGF0dXNMZW5ndGhCd2QgICAgICA9IDA7Ci0gIFVDSEFSIEVycm9yU3RhdHVzTGVuZ3RoRXNjYXBlcyAgPSAwOwotICBVQ0hBUiBFcnJvclN0YXR1c0ZpcnN0U2NmICAgICAgID0gMDsKLSAgVUNIQVIgRXJyb3JTdGF0dXNMYXN0U2NmICAgICAgICA9IDA7Ci0gIFVDSEFSIEVycm9yU3RhdHVzRmlyc3ROcmcgICAgICAgPSAwOwotICBVQ0hBUiBFcnJvclN0YXR1c0xhc3ROcmcgICAgICAgID0gMDsKLSAgVUNIQVIgRXJyb3JTdGF0dXNGaXJzdElzICAgICAgICA9IDA7Ci0gIFVDSEFSIEVycm9yU3RhdHVzTGFzdElzICAgICAgICAgPSAwOworc3RhdGljIHZvaWQgcnZsY0ZpbmFsRXJyb3JEZXRlY3Rpb24oCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKSB7CisgIENFclJ2bGNJbmZvICpwUnZsYyA9CisgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87CisgIFVDSEFSIEVycm9yU3RhdHVzQ29tcGxldGUgPSAwOworICBVQ0hBUiBFcnJvclN0YXR1c0xlbmd0aEZ3ZCA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzTGVuZ3RoQndkID0gMDsKKyAgVUNIQVIgRXJyb3JTdGF0dXNMZW5ndGhFc2NhcGVzID0gMDsKKyAgVUNIQVIgRXJyb3JTdGF0dXNGaXJzdFNjZiA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzTGFzdFNjZiA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzRmlyc3ROcmcgPSAwOworICBVQ0hBUiBFcnJvclN0YXR1c0xhc3ROcmcgPSAwOworICBVQ0hBUiBFcnJvclN0YXR1c0ZpcnN0SXMgPSAwOworICBVQ0hBUiBFcnJvclN0YXR1c0xhc3RJcyA9IDA7CiAgIFVDSEFSIEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dGd2QgPSAwOwogICBVQ0hBUiBFcnJvclN0YXR1c0ZvcmJpZGRlbkN3QndkID0gMDsKLSAgVUNIQVIgRXJyb3JTdGF0dXNOdW1Fc2NhcGVzRndkICA9IDA7Ci0gIFVDSEFSIEVycm9yU3RhdHVzTnVtRXNjYXBlc0J3ZCAgPSAwOwotICBVQ0hBUiBDb25jZWFsU3RhdHVzICAgICAgICAgICAgID0gMTsKLSAgVUNIQVIgY3VycmVudEJsb2NrVHlwZTsgIC8qIHNob3J0OiAwLCBub3Qgc2hvcnQ6IDEqLwotCi0jaWYgVkVSQk9TRV9SVkxDX09VVFBVVAotICBDSEFSICBTdHJhdGVneVs2MF09Ik5vIjsKLSAgU0hPUlQgY29uY2VhbF9tYXg7Ci0gIFNIT1JUIGNvbmNlYWxfbWluOwotI2VuZGlmCisgIFVDSEFSIEVycm9yU3RhdHVzTnVtRXNjYXBlc0Z3ZCA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzTnVtRXNjYXBlc0J3ZCA9IDA7CisgIFVDSEFSIENvbmNlYWxTdGF0dXMgPSAxOworICBVQ0hBUiBjdXJyZW50QmxvY2tUeXBlOyAvKiBzaG9ydDogMCwgbm90IHNob3J0OiAxKi8KIAogICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMTsKIAotICAvKiBpbnZhbGlkIGVzY2FwZSB3b3JkcywgYml0IGNvdW50ZXIgdW5lcXVhbCB6ZXJvLCBmb3JiaWRkZW4gY29kZXdvcmQgZGV0ZWN0ZWQgKi8KKyAgLyogaW52YWxpZCBlc2NhcGUgd29yZHMsIGJpdCBjb3VudGVyIHVuZXF1YWwgemVybywgZm9yYmlkZGVuIGNvZGV3b3JkIGRldGVjdGVkCisgICAqLwogICBpZiAocFJ2bGMtPmVycm9yTG9nUnZsYyAmIFJWTENfRVJST1JfRk9SQklEREVOX0NXX0RFVEVDVEVEX0ZXRCkKICAgICBFcnJvclN0YXR1c0ZvcmJpZGRlbkN3RndkID0gMTsKIApAQCAtODMyLDEwMCArODMzLDEwMiBAQAogICAgIEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dCd2QgPSAxOwogCiAgIC8qIGJpdCBjb3VudGVyIGZvcndhcmQgdW5lcXVhbCB6ZXJvICovCi0gIGlmIChwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2ZfZndkKQotICAgIEVycm9yU3RhdHVzTGVuZ3RoRndkID0gMTsKKyAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZl9md2QpIEVycm9yU3RhdHVzTGVuZ3RoRndkID0gMTsKIAogICAvKiBiaXQgY291bnRlciBiYWNrd2FyZCB1bmVxdWFsIHplcm8gKi8KLSAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZl9id2QpCi0gICAgRXJyb3JTdGF0dXNMZW5ndGhCd2QgPSAxOworICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmX2J3ZCkgRXJyb3JTdGF0dXNMZW5ndGhCd2QgPSAxOwogCiAgIC8qIGJpdCBjb3VudGVyIGVzY2FwZSBzZXF1ZW5jZXMgdW5lcXVhbCB6ZXJvICovCiAgIGlmIChwUnZsYy0+c2ZfZXNjYXBlc19wcmVzZW50KQotICAgIGlmIChwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcykKLSAgICAgIEVycm9yU3RhdHVzTGVuZ3RoRXNjYXBlcyA9IDE7CisgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKSBFcnJvclN0YXR1c0xlbmd0aEVzY2FwZXMgPSAxOwogCiAgIGlmIChwUnZsYy0+c2ZfdXNlZCkgewogICAgIC8qIGZpcnN0IGRlY29kZWQgc2NmIGRvZXMgbm90IG1hdGNoIHRvIGdsb2JhbCBnYWluIGluIGJhY2t3YXJkIGRpcmVjdGlvbiAqLwotICAgIGlmIChwUnZsYy0+Zmlyc3RTY2YgIT0gKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUKSApIAorICAgIGlmIChwUnZsYy0+Zmlyc3RTY2YgIT0KKyAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUKSkKICAgICAgIEVycm9yU3RhdHVzRmlyc3RTY2YgPSAxOwogCi0gICAgLyogbGFzdCBkZWNvZGVkIHNjZiBkb2VzIG5vdCBtYXRjaCB0byByZXYgZ2xvYmFsIGdhaW4gaW4gZm9yd2FyZCBkaXJlY3Rpb24gKi8KLSAgICBpZiAocFJ2bGMtPmxhc3RTY2YgIT0gKHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gLSBTRl9PRkZTRVQpICkgCisgICAgLyogbGFzdCBkZWNvZGVkIHNjZiBkb2VzIG5vdCBtYXRjaCB0byByZXYgZ2xvYmFsIGdhaW4gaW4gZm9yd2FyZCBkaXJlY3Rpb24KKyAgICAgKi8KKyAgICBpZiAocFJ2bGMtPmxhc3RTY2YgIT0gKHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gLSBTRl9PRkZTRVQpKQogICAgICAgRXJyb3JTdGF0dXNMYXN0U2NmID0gMTsKICAgfQogCiAgIGlmIChwUnZsYy0+bm9pc2VfdXNlZCkgewotICAgIC8qIGZpcnN0IGRlY29kZWQgbnJnIGRvZXMgbm90IG1hdGNoIHRvIGRwY21fbm9pc2VfbnJnIGluIGJhY2t3YXJkIGRpcmVjdGlvbiAqLwotICAgIGlmIChwUnZsYy0+Zmlyc3ROcmcgIT0gKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluICsgcFJ2bGMtPmRwY21fbm9pc2VfbnJnIC0gU0ZfT0ZGU0VUIC05MCAtIDI1NikgKSAKKyAgICAvKiBmaXJzdCBkZWNvZGVkIG5yZyBkb2VzIG5vdCBtYXRjaCB0byBkcGNtX25vaXNlX25yZyBpbiBiYWNrd2FyZCBkaXJlY3Rpb24KKyAgICAgKi8KKyAgICBpZiAocFJ2bGMtPmZpcnN0TnJnICE9CisgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiArCisgICAgICAgICBwUnZsYy0+ZHBjbV9ub2lzZV9ucmcgLSBTRl9PRkZTRVQgLSA5MCAtIDI1NikpCiAgICAgICBFcnJvclN0YXR1c0ZpcnN0TnJnID0gMTsKIAotICAgIC8qIGxhc3QgZGVjb2RlZCBucmcgZG9lcyBub3QgbWF0Y2ggdG8gZHBjbV9ub2lzZV9sYXN0X3Bvc2l0aW9uIGluIGZvcndhcmQgZGlyZWN0aW9uICovCi0gICAgaWYgKHBSdmxjLT5sYXN0TnJnICE9IChwUnZsYy0+cmV2X2dsb2JhbF9nYWluICsgcFJ2bGMtPmRwY21fbm9pc2VfbGFzdF9wb3NpdGlvbiAtIFNGX09GRlNFVCAtIDkwIC0gMjU2KSApIAorICAgIC8qIGxhc3QgZGVjb2RlZCBucmcgZG9lcyBub3QgbWF0Y2ggdG8gZHBjbV9ub2lzZV9sYXN0X3Bvc2l0aW9uIGluIGZvcndhcmQKKyAgICAgKiBkaXJlY3Rpb24gKi8KKyAgICBpZiAocFJ2bGMtPmxhc3ROcmcgIT0KKyAgICAgICAgKHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gKyBwUnZsYy0+ZHBjbV9ub2lzZV9sYXN0X3Bvc2l0aW9uIC0gU0ZfT0ZGU0VUIC0KKyAgICAgICAgIDkwIC0gMjU2KSkKICAgICAgIEVycm9yU3RhdHVzTGFzdE5yZyA9IDE7CiAgIH0KIAogICBpZiAocFJ2bGMtPmludGVuc2l0eV91c2VkKSB7CiAgICAgLyogZmlyc3QgZGVjb2RlZCBpcyBwb3NpdGlvbiBkb2VzIG5vdCBtYXRjaCBpbiBiYWNrd2FyZCBkaXJlY3Rpb24gKi8KLSAgICBpZiAocFJ2bGMtPmZpcnN0SXMgIT0gKC1TRl9PRkZTRVQpICkgCi0gICAgICBFcnJvclN0YXR1c0ZpcnN0SXMgPSAxOworICAgIGlmIChwUnZsYy0+Zmlyc3RJcyAhPSAoLVNGX09GRlNFVCkpIEVycm9yU3RhdHVzRmlyc3RJcyA9IDE7CiAKICAgICAvKiBsYXN0IGRlY29kZWQgaXMgcG9zaXRpb24gZG9lcyBub3QgbWF0Y2ggaW4gZm9yd2FyZCBkaXJlY3Rpb24gKi8KLSAgICBpZiAocFJ2bGMtPmxhc3RJcyAhPSAocFJ2bGMtPmRwY21faXNfbGFzdF9wb3NpdGlvbiAtIFNGX09GRlNFVCkgKSAKKyAgICBpZiAocFJ2bGMtPmxhc3RJcyAhPSAocFJ2bGMtPmRwY21faXNfbGFzdF9wb3NpdGlvbiAtIFNGX09GRlNFVCkpCiAgICAgICBFcnJvclN0YXR1c0xhc3RJcyA9IDE7CiAgIH0KIAogICAvKiBkZWNvZGVkIGVzY2FwZXMgYW5kIHVzZWQgZXNjYXBlcyBpbiBmb3J3YXJkIGRpcmVjdGlvbiBkbyBub3QgZml0ICovCi0gIGlmICgocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0Z3ZCAhPSBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjKSAmJiAocFJ2bGMtPmNvbmNlYWxfbWF4ID09IENPTkNFQUxfTUFYX0lOSVQpKSB7CisgIGlmICgocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0Z3ZCAhPSBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjKSAmJgorICAgICAgKHBSdmxjLT5jb25jZWFsX21heCA9PSBDT05DRUFMX01BWF9JTklUKSkgewogICAgIEVycm9yU3RhdHVzTnVtRXNjYXBlc0Z3ZCA9IDE7CiAgIH0KIAogICAvKiBkZWNvZGVkIGVzY2FwZXMgYW5kIHVzZWQgZXNjYXBlcyBpbiBiYWNrd2FyZCBkaXJlY3Rpb24gZG8gbm90IGZpdCAqLwotICBpZiAoKHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNCd2QgIT0gcFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0VzYykgJiYgKHBSdmxjLT5jb25jZWFsX21pbiA9PSBDT05DRUFMX01JTl9JTklUKSkgeworICBpZiAoKHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNCd2QgIT0gcFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0VzYykgJiYKKyAgICAgIChwUnZsYy0+Y29uY2VhbF9taW4gPT0gQ09OQ0VBTF9NSU5fSU5JVCkpIHsKICAgICBFcnJvclN0YXR1c051bUVzY2FwZXNCd2QgPSAxOwogICB9CiAKLSNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCi0gIGNvbmNlYWxfbWF4ID0gcFJ2bGMtPmNvbmNlYWxfbWF4OwotICBjb25jZWFsX21pbiA9IHBSdmxjLT5jb25jZWFsX21pbjsKLSNlbmRpZgorICBpZiAoRXJyb3JTdGF0dXNMZW5ndGhFc2NhcGVzIHx8CisgICAgICAoKChwUnZsYy0+Y29uY2VhbF9tYXggPT0gQ09OQ0VBTF9NQVhfSU5JVCkgJiYKKyAgICAgICAgKHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNGd2QgIT0gcFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0VzYykgJiYKKyAgICAgICAgKEVycm9yU3RhdHVzTGFzdFNjZiB8fCBFcnJvclN0YXR1c0xhc3ROcmcgfHwgRXJyb3JTdGF0dXNMYXN0SXMpKQogCi0gIGlmICggICAgRXJyb3JTdGF0dXNMZW5ndGhFc2NhcGVzCi0gICAgICB8fCAoIAotICAgICAgICAgICAoICAgKHBSdmxjLT5jb25jZWFsX21heCA9PSBDT05DRUFMX01BWF9JTklUKSAKLSAgICAgICAgICAgICYmIChwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRndkICE9IHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNFc2MpCi0gICAgICAgICAgICAmJiAoRXJyb3JTdGF0dXNMYXN0U2NmIHx8IEVycm9yU3RhdHVzTGFzdE5yZyB8fCBFcnJvclN0YXR1c0xhc3RJcykgKQotICAgICAgICAgICAKLSAgICAgICAgICAgICYmIAorICAgICAgICYmCiAKLSAgICAgICAgICAgKCAgIChwUnZsYy0+Y29uY2VhbF9taW4gPT0gQ09OQ0VBTF9NSU5fSU5JVCkgCi0gICAgICAgICAgICAmJiAocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0J3ZCAhPSBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjKQotICAgICAgICAgICAgJiYgKEVycm9yU3RhdHVzRmlyc3RTY2YgfHwgRXJyb3JTdGF0dXNGaXJzdE5yZyB8fCBFcnJvclN0YXR1c0ZpcnN0SXMpICkgCi0gICAgICAgICApICAgIAotICAgICAgfHwgKCAgIChwUnZsYy0+Y29uY2VhbF9tYXggPT0gQ09OQ0VBTF9NQVhfSU5JVCkgCi0gICAgICAgICAgJiYgKChwUnZsYy0+cmV2X2dsb2JhbF9nYWluIC0gU0ZfT0ZGU0VUIC0gcFJ2bGMtPmxhc3RTY2YpIDwgLTE1KQotICAgICAgICAgKQotICAgICAgfHwgKCAgIChwUnZsYy0+Y29uY2VhbF9taW4gPT0gQ09OQ0VBTF9NSU5fSU5JVCkgCi0gICAgICAgICAgJiYgKChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVCAtIHBSdmxjLT5maXJzdFNjZikgPCAtMTUpCi0gICAgICAgICApCi0gICAgICkgewotICAgIGlmICgocFJ2bGMtPmNvbmNlYWxfbWF4ID09IENPTkNFQUxfTUFYX0lOSVQpIHx8IChwUnZsYy0+Y29uY2VhbF9taW4gPT0gQ09OQ0VBTF9NSU5fSU5JVCkpIHsKLSAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IDA7IAotICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gRkRLbWF4KDAsIChwUnZsYy0+bnVtV2luZG93R3JvdXBzLTEpKjE2K3BSdmxjLT5tYXhTZmJUcmFuc21pdHRlZC0xKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBGREttaW4ocFJ2bGMtPmNvbmNlYWxfbWF4LHBSdmxjLT5jb25jZWFsX21heF9lc2MpOyAKLSAgICAgIHBSdmxjLT5jb25jZWFsX21pbiA9IEZES21heChwUnZsYy0+Y29uY2VhbF9taW4scFJ2bGMtPmNvbmNlYWxfbWluX2VzYyk7CisgICAgICAgKChwUnZsYy0+Y29uY2VhbF9taW4gPT0gQ09OQ0VBTF9NSU5fSU5JVCkgJiYKKyAgICAgICAgKHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNCd2QgIT0gcFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0VzYykgJiYKKyAgICAgICAgKEVycm9yU3RhdHVzRmlyc3RTY2YgfHwgRXJyb3JTdGF0dXNGaXJzdE5yZyB8fCBFcnJvclN0YXR1c0ZpcnN0SXMpKSkgfHwKKyAgICAgICgocFJ2bGMtPmNvbmNlYWxfbWF4ID09IENPTkNFQUxfTUFYX0lOSVQpICYmCisgICAgICAgKChwUnZsYy0+cmV2X2dsb2JhbF9nYWluIC0gU0ZfT0ZGU0VUIC0gcFJ2bGMtPmxhc3RTY2YpIDwgLTE1KSkgfHwKKyAgICAgICgocFJ2bGMtPmNvbmNlYWxfbWluID09IENPTkNFQUxfTUlOX0lOSVQpICYmCisgICAgICAgKChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVCAtCisgICAgICAgICBwUnZsYy0+Zmlyc3RTY2YpIDwgLTE1KSkpIHsKKyAgICBpZiAoKHBSdmxjLT5jb25jZWFsX21heCA9PSBDT05DRUFMX01BWF9JTklUKSB8fAorICAgICAgICAocFJ2bGMtPmNvbmNlYWxfbWluID09IENPTkNFQUxfTUlOX0lOSVQpKSB7CisgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSAwOworICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gZk1heCgKKyAgICAgICAgICAwLCAocFJ2bGMtPm51bVdpbmRvd0dyb3VwcyAtIDEpICogMTYgKyBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQgLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gZk1pbihwUnZsYy0+Y29uY2VhbF9tYXgsIHBSdmxjLT5jb25jZWFsX21heF9lc2MpOworICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gZk1heChwUnZsYy0+Y29uY2VhbF9taW4sIHBSdmxjLT5jb25jZWFsX21pbl9lc2MpOwogICAgIH0KICAgfQogCi0gIEVycm9yU3RhdHVzQ29tcGxldGUgPSAgICBFcnJvclN0YXR1c0xhc3RTY2YgfHwgRXJyb3JTdGF0dXNGaXJzdFNjZiB8fCBFcnJvclN0YXR1c0xhc3ROcmcgfHwgRXJyb3JTdGF0dXNGaXJzdE5yZwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgRXJyb3JTdGF0dXNMYXN0SXMgfHwgRXJyb3JTdGF0dXNGaXJzdElzIHx8IEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dGd2QgfHwgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0J3ZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVycm9yU3RhdHVzTGVuZ3RoRndkIHx8IEVycm9yU3RhdHVzTGVuZ3RoQndkIHx8IEVycm9yU3RhdHVzTGVuZ3RoRXNjYXBlcyB8fCBFcnJvclN0YXR1c051bUVzY2FwZXNGd2QgCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBFcnJvclN0YXR1c051bUVzY2FwZXNCd2Q7CisgIEVycm9yU3RhdHVzQ29tcGxldGUgPSBFcnJvclN0YXR1c0xhc3RTY2YgfHwgRXJyb3JTdGF0dXNGaXJzdFNjZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXNMYXN0TnJnIHx8IEVycm9yU3RhdHVzRmlyc3ROcmcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzTGFzdElzIHx8IEVycm9yU3RhdHVzRmlyc3RJcyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0Z3ZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0J3ZCB8fCBFcnJvclN0YXR1c0xlbmd0aEZ3ZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXNMZW5ndGhCd2QgfHwgRXJyb3JTdGF0dXNMZW5ndGhFc2NhcGVzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0YXR1c051bUVzY2FwZXNGd2QgfHwgRXJyb3JTdGF0dXNOdW1Fc2NhcGVzQndkOwogCi0gIGN1cnJlbnRCbG9ja1R5cGUgPSAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgPyAwIDogMTsKKyAgY3VycmVudEJsb2NrVHlwZSA9CisgICAgICAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEJMT0NLX1NIT1JUKSA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKIAotICAgCiAgIGlmICghRXJyb3JTdGF0dXNDb21wbGV0ZSkgewogICAgIGludCBiYW5kOwogICAgIGludCBncm91cDsKQEAgLTkzNCwxMTEgKzkzNywxMTUgQEAKIAogICAgIGxhc3RTZmJJbmRleCA9IChwUnZsYy0+bnVtV2luZG93R3JvdXBzID4gMSkgPyAxNiA6IDY0OwogCi0gICAgZm9yIChncm91cD0wOyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKLSAgICAgIGZvciAoYmFuZD0wOyBiYW5kPHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7Ci0gICAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwotICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbYm5kc10gPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykKLSAgICB7Ci0gICAgICBmb3IgKGJhbmQ9MDsgYmFuZDxwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewotICAgICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKLSAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc107CisgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICAgIGJuZHMgPSAxNiAqIGdyb3VwICsgYmFuZDsKKyAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdID0KKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc107CiAgICAgICB9Ci0gICAgICBmb3IgKDsgYmFuZCA8bGFzdFNmYkluZGV4OyBiYW5kKyspIHsKLSAgICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7CisgICAgICBmb3IgKDsgYmFuZCA8IGxhc3RTZmJJbmRleDsgYmFuZCsrKSB7CisgICAgICAgIGJuZHMgPSAxNiAqIGdyb3VwICsgYmFuZDsKICAgICAgICAgRkRLX0FTU0VSVChibmRzID49IDAgJiYgYm5kcyA8IFJWTENfTUFYX1NGQik7Ci0gICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gPSBaRVJPX0hDQjsKKyAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdID0gWkVST19IQ0I7CiAgICAgICB9CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGludCBiYW5kOwogICAgIGludCBncm91cDsKIAotICAgIC8qIEEgc2luZ2xlIGJpdCBlcnJvciB3YXMgZGV0ZWN0ZWQgaW4gZGVjb2Rpbmcgb2YgZHBjbSB2YWx1ZXMuIEl0IGFsc28gY291bGQgYmUgYW4gZXJyb3Igd2l0aCBtb3JlIGJpdHMgaW4gZGVjb2RpbmcKLSAgICAgICBvZiBlc2NhcGVzIGFuZCBkcGNtIHZhbHVlcyB3aGVyZWJ5IGFuIGlsbGVnYWwgY29kZXdvcmQgZm9sbG93ZWQgbm90IGRpcmVjdGx5IGFmdGVyIHRoZSBjb3JydXB0ZWQgYml0cyBidXQganVzdCAKLSAgICAgICBhZnRlciBkZWNvZGluZyBzb21lIG1vcmUgKHdyb25nKSBzY2FsZWZhY3RvcnMuIFVzZSB0aGUgc21hbGxlciBzY2FsZWZhY3RvciBmcm9tIGZvcndhcmQgZGVjb2RpbmcsIGJhY2t3YXJkIGRlY29kaW5nCi0gICAgICAgYW5kIHByZXZpb3VzIGZyYW1lLiAqLwotICAgIGlmICggICAoKHBSdmxjLT5jb25jZWFsX21pbiAhPSBDT05DRUFMX01JTl9JTklUKSB8fCAocFJ2bGMtPmNvbmNlYWxfbWF4ICE9IENPTkNFQUxfTUFYX0lOSVQpKSAmJiAocFJ2bGMtPmNvbmNlYWxfbWluIDw9IHBSdmxjLT5jb25jZWFsX21heCkgCi0gICAgICAgICYmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzQmxvY2tUeXBlID09IGN1cnJlbnRCbG9ja1R5cGUpICYmIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5ydmxjUHJldmlvdXNTY2FsZUZhY3Rvck9LCi0gICAgICAgICYmIHBSdmxjLT5zZl9jb25jZWFsbWVudCAmJiBDb25jZWFsU3RhdHVzICkKLSAgICB7Ci0gICAgICBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VTY2ZPZlByZXZGcmFtZUFzUmVmZXJlbmNlIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKTsKLSAgICAgIENvbmNlYWxTdGF0dXM9MDsKLSNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCi0gICAgICBGREtzdHJjcHkoU3RyYXRlZ3ksIlllcyAoQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlU2NmT2ZQcmV2RnJhbWVBc1JlZmVyZW5jZSkiKTsKLSNlbmRpZgorICAgIC8qIEEgc2luZ2xlIGJpdCBlcnJvciB3YXMgZGV0ZWN0ZWQgaW4gZGVjb2Rpbmcgb2YgZHBjbSB2YWx1ZXMuIEl0IGFsc28gY291bGQKKyAgICAgICBiZSBhbiBlcnJvciB3aXRoIG1vcmUgYml0cyBpbiBkZWNvZGluZyBvZiBlc2NhcGVzIGFuZCBkcGNtIHZhbHVlcyB3aGVyZWJ5CisgICAgICAgYW4gaWxsZWdhbCBjb2Rld29yZCBmb2xsb3dlZCBub3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIGNvcnJ1cHRlZCBiaXRzIGJ1dAorICAgICAgIGp1c3QgYWZ0ZXIgZGVjb2Rpbmcgc29tZSBtb3JlICh3cm9uZykgc2NhbGVmYWN0b3JzLiBVc2UgdGhlIHNtYWxsZXIKKyAgICAgICBzY2FsZWZhY3RvciBmcm9tIGZvcndhcmQgZGVjb2RpbmcsIGJhY2t3YXJkIGRlY29kaW5nIGFuZCBwcmV2aW91cyBmcmFtZS4KKyAgICAgKi8KKyAgICBpZiAoKChwUnZsYy0+Y29uY2VhbF9taW4gIT0gQ09OQ0VBTF9NSU5fSU5JVCkgfHwKKyAgICAgICAgIChwUnZsYy0+Y29uY2VhbF9tYXggIT0gQ09OQ0VBTF9NQVhfSU5JVCkpICYmCisgICAgICAgIChwUnZsYy0+Y29uY2VhbF9taW4gPD0gcFJ2bGMtPmNvbmNlYWxfbWF4KSAmJgorICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c0Jsb2NrVHlwZSA9PQorICAgICAgICAgY3VycmVudEJsb2NrVHlwZSkgJiYKKyAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAucnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JPSyAmJgorICAgICAgICBwUnZsYy0+c2ZfY29uY2VhbG1lbnQgJiYgQ29uY2VhbFN0YXR1cykgeworICAgICAgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlU2NmT2ZQcmV2RnJhbWVBc1JlZmVyZW5jZSgKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKTsKKyAgICAgIENvbmNlYWxTdGF0dXMgPSAwOwogICAgIH0KIAotICAgIC8qIEEgc2luZ2xlIGJpdCBlcnJvciB3YXMgZGV0ZWN0ZWQgaW4gZGVjb2Rpbmcgb2YgZHBjbSB2YWx1ZXMuIEl0IGFsc28gY291bGQgYmUgYW4gZXJyb3Igd2l0aCBtb3JlIGJpdHMgaW4gZGVjb2RpbmcKLSAgICAgICBvZiBlc2NhcGVzIGFuZCBkcGNtIHZhbHVlcyB3aGVyZWJ5IGFuIGlsbGVnYWwgY29kZXdvcmQgZm9sbG93ZWQgbm90IGRpcmVjdGx5IGFmdGVyIHRoZSBjb3JydXB0ZWQgYml0cyBidXQganVzdCAKLSAgICAgICBhZnRlciBkZWNvZGluZyBzb21lIG1vcmUgKHdyb25nKSBzY2FsZWZhY3RvcnMuIFVzZSB0aGUgc21hbGxlciBzY2FsZWZhY3RvciBmcm9tIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRlY29kaW5nLiAqLwotICAgIGlmICggICAocFJ2bGMtPmNvbmNlYWxfbWluIDw9IHBSdmxjLT5jb25jZWFsX21heCkgICYmICgocFJ2bGMtPmNvbmNlYWxfbWluICE9IENPTkNFQUxfTUlOX0lOSVQpIHx8IChwUnZsYy0+Y29uY2VhbF9tYXggIT0gQ09OQ0VBTF9NQVhfSU5JVCkpCi0gICAgICAgICYmICEocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yT0sgJiYgcFJ2bGMtPnNmX2NvbmNlYWxtZW50ICYmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzQmxvY2tUeXBlID09IGN1cnJlbnRCbG9ja1R5cGUpKQotICAgICAgICAmJiBDb25jZWFsU3RhdHVzICkKLSAgICB7Ci0gICAgICBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VMb3dlclNjZk9mQ3VycmVudEZyYW1lIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKLSAgICAgIENvbmNlYWxTdGF0dXM9MDsKLSNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCi0gICAgICBGREtzdHJjcHkoU3RyYXRlZ3ksIlllcyAoQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlTG93ZXJTY2ZPZkN1cnJlbnRGcmFtZSkiKTsKLSNlbmRpZgorICAgIC8qIEEgc2luZ2xlIGJpdCBlcnJvciB3YXMgZGV0ZWN0ZWQgaW4gZGVjb2Rpbmcgb2YgZHBjbSB2YWx1ZXMuIEl0IGFsc28gY291bGQKKyAgICAgICBiZSBhbiBlcnJvciB3aXRoIG1vcmUgYml0cyBpbiBkZWNvZGluZyBvZiBlc2NhcGVzIGFuZCBkcGNtIHZhbHVlcyB3aGVyZWJ5CisgICAgICAgYW4gaWxsZWdhbCBjb2Rld29yZCBmb2xsb3dlZCBub3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIGNvcnJ1cHRlZCBiaXRzIGJ1dAorICAgICAgIGp1c3QgYWZ0ZXIgZGVjb2Rpbmcgc29tZSBtb3JlICh3cm9uZykgc2NhbGVmYWN0b3JzLiBVc2UgdGhlIHNtYWxsZXIKKyAgICAgICBzY2FsZWZhY3RvciBmcm9tIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRlY29kaW5nLiAqLworICAgIGlmICgocFJ2bGMtPmNvbmNlYWxfbWluIDw9IHBSdmxjLT5jb25jZWFsX21heCkgJiYKKyAgICAgICAgKChwUnZsYy0+Y29uY2VhbF9taW4gIT0gQ09OQ0VBTF9NSU5fSU5JVCkgfHwKKyAgICAgICAgIChwUnZsYy0+Y29uY2VhbF9tYXggIT0gQ09OQ0VBTF9NQVhfSU5JVCkpICYmCisgICAgICAgICEocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgIC5ydmxjUHJldmlvdXNTY2FsZUZhY3Rvck9LICYmCisgICAgICAgICAgcFJ2bGMtPnNmX2NvbmNlYWxtZW50ICYmCisgICAgICAgICAgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgLnJ2bGNQcmV2aW91c0Jsb2NrVHlwZSA9PSBjdXJyZW50QmxvY2tUeXBlKSkgJiYKKyAgICAgICAgQ29uY2VhbFN0YXR1cykgeworICAgICAgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlTG93ZXJTY2ZPZkN1cnJlbnRGcmFtZShwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKKyAgICAgIENvbmNlYWxTdGF0dXMgPSAwOwogICAgIH0KIAotICAgIC8qIE5vIGVycm9ycyB3ZXJlIGRldGVjdGVkIGluIGRlY29kaW5nIG9mIGVzY2FwZXMgYW5kIGRwY20gdmFsdWVzIGhvd2V2ZXIgdGhlIGZpcnN0IGFuZCBsYXN0IHZhbHVlIAotICAgICAgIG9mIGEgZ3JvdXAgKGlzLG5yZyxzZikgaXMgaW5jb3JyZWN0ICovICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKCAgIChwUnZsYy0+Y29uY2VhbF9taW4gPD0gcFJ2bGMtPmNvbmNlYWxfbWF4KSAgJiYgKChFcnJvclN0YXR1c0xhc3RTY2YgJiYgRXJyb3JTdGF0dXNGaXJzdFNjZikgCi0gICAgICAgIHx8IChFcnJvclN0YXR1c0xhc3ROcmcgJiYgRXJyb3JTdGF0dXNGaXJzdE5yZykgfHwgKEVycm9yU3RhdHVzTGFzdElzICYmIEVycm9yU3RhdHVzRmlyc3RJcykpIAotICAgICAgICAmJiAhKEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dGd2QgfHwgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0J3ZCB8fCBFcnJvclN0YXR1c0xlbmd0aEVzY2FwZXMgKSAmJiBDb25jZWFsU3RhdHVzKQotICAgIHsKLSAgICAgIFN0YXRpc3RpY2FsRXN0aW1hdGlvbiAocEFhY0RlY29kZXJDaGFubmVsSW5mbyk7Ci0gICAgICBDb25jZWFsU3RhdHVzPTA7Ci0jaWYgVkVSQk9TRV9SVkxDX09VVFBVVAotICAgICAgRkRLc3RyY3B5KFN0cmF0ZWd5LCJZZXMgKFN0YXRpc3RpY2FsRXN0aW1hdGlvbikiKTsKLSNlbmRpZgorICAgIC8qIE5vIGVycm9ycyB3ZXJlIGRldGVjdGVkIGluIGRlY29kaW5nIG9mIGVzY2FwZXMgYW5kIGRwY20gdmFsdWVzIGhvd2V2ZXIKKyAgICAgICB0aGUgZmlyc3QgYW5kIGxhc3QgdmFsdWUgb2YgYSBncm91cCAoaXMsbnJnLHNmKSBpcyBpbmNvcnJlY3QgKi8KKyAgICBpZiAoKHBSdmxjLT5jb25jZWFsX21pbiA8PSBwUnZsYy0+Y29uY2VhbF9tYXgpICYmCisgICAgICAgICgoRXJyb3JTdGF0dXNMYXN0U2NmICYmIEVycm9yU3RhdHVzRmlyc3RTY2YpIHx8CisgICAgICAgICAoRXJyb3JTdGF0dXNMYXN0TnJnICYmIEVycm9yU3RhdHVzRmlyc3ROcmcpIHx8CisgICAgICAgICAoRXJyb3JTdGF0dXNMYXN0SXMgJiYgRXJyb3JTdGF0dXNGaXJzdElzKSkgJiYKKyAgICAgICAgIShFcnJvclN0YXR1c0ZvcmJpZGRlbkN3RndkIHx8IEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dCd2QgfHwKKyAgICAgICAgICBFcnJvclN0YXR1c0xlbmd0aEVzY2FwZXMpICYmCisgICAgICAgIENvbmNlYWxTdGF0dXMpIHsKKyAgICAgIFN0YXRpc3RpY2FsRXN0aW1hdGlvbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKKyAgICAgIENvbmNlYWxTdGF0dXMgPSAwOwogICAgIH0KIAotICAgIC8qIEEgZXJyb3Igd2l0aCBtb3JlIGJpdHMgaW4gZGVjb2Rpbmcgb2YgZXNjYXBlcyBhbmQgZHBjbSB2YWx1ZXMgd2FzIGRldGVjdGVkLiBVc2UgdGhlIHNtYWxsZXIgc2NhbGVmYWN0b3IgZnJvbSBmb3J3YXJkIAotICAgICAgIGRlY29kaW5nLCBiYWNrd2FyZCBkZWNvZGluZyBhbmQgcHJldmlvdXMgZnJhbWUuICovCi0gICAgaWYgKCAgIChwUnZsYy0+Y29uY2VhbF9taW4gPD0gcFJ2bGMtPmNvbmNlYWxfbWF4KSAmJiBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JPSyAmJiBwUnZsYy0+c2ZfY29uY2VhbG1lbnQKLSAgICAgICAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5ydmxjUHJldmlvdXNCbG9ja1R5cGUgPT0gY3VycmVudEJsb2NrVHlwZSkgJiYgQ29uY2VhbFN0YXR1cyApCi0gICAgewotICAgICAgUHJlZGljdGl2ZUludGVycG9sYXRpb24ocEFhY0RlY29kZXJDaGFubmVsSW5mbywgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyk7Ci0gICAgICBDb25jZWFsU3RhdHVzPTA7Ci0jaWYgVkVSQk9TRV9SVkxDX09VVFBVVAotICAgICAgRkRLc3RyY3B5KFN0cmF0ZWd5LCJZZXMgKFByZWRpY3RpdmVJbnRlcnBvbGF0aW9uKSIpOwotI2VuZGlmCisgICAgLyogQSBlcnJvciB3aXRoIG1vcmUgYml0cyBpbiBkZWNvZGluZyBvZiBlc2NhcGVzIGFuZCBkcGNtIHZhbHVlcyB3YXMKKyAgICAgICBkZXRlY3RlZC4gVXNlIHRoZSBzbWFsbGVyIHNjYWxlZmFjdG9yIGZyb20gZm9yd2FyZCBkZWNvZGluZywgYmFja3dhcmQKKyAgICAgICBkZWNvZGluZyBhbmQgcHJldmlvdXMgZnJhbWUuICovCisgICAgaWYgKChwUnZsYy0+Y29uY2VhbF9taW4gPD0gcFJ2bGMtPmNvbmNlYWxfbWF4KSAmJgorICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgIC5ydmxjUHJldmlvdXNTY2FsZUZhY3Rvck9LICYmCisgICAgICAgIHBSdmxjLT5zZl9jb25jZWFsbWVudCAmJgorICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c0Jsb2NrVHlwZSA9PQorICAgICAgICAgY3VycmVudEJsb2NrVHlwZSkgJiYKKyAgICAgICAgQ29uY2VhbFN0YXR1cykgeworICAgICAgUHJlZGljdGl2ZUludGVycG9sYXRpb24ocEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pOworICAgICAgQ29uY2VhbFN0YXR1cyA9IDA7CiAgICAgfQogCi0gICAgLyogQ2FsbCBmcmFtZSBjb25jZWFsbWVudCwgYmVjYXVzZSBubyBiZXR0ZXIgc3RyYXRlZ3kgd2FzIGZvdW5kLiBTZXR0aW5nIHRoZSBzY2FsZWZhY3RvcnMgdG8gemVybyBpcyBkb25lIGZvciBkZWJ1Z2dpbmcgCi0gICAgICAgcHVycG9zZXMgKi8KKyAgICAvKiBDYWxsIGZyYW1lIGNvbmNlYWxtZW50LCBiZWNhdXNlIG5vIGJldHRlciBzdHJhdGVneSB3YXMgZm91bmQuIFNldHRpbmcgdGhlCisgICAgICAgc2NhbGVmYWN0b3JzIHRvIHplcm8gaXMgZG9uZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzICovCiAgICAgaWYgKENvbmNlYWxTdGF0dXMpIHsKLSAgICAgIGZvciAoZ3JvdXA9MDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7Ci0gICAgICAgIGZvciAoYmFuZD0wOyBiYW5kPHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7Ci0gICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvclsxNipncm91cCtiYW5kXSA9IDA7CisgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbMTYgKiBncm91cCArIGJhbmRdID0gMDsKICAgICAgICAgfQogICAgICAgfQotICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9IDA7Ci0jaWYgVkVSQk9TRV9SVkxDX09VVFBVVAotICAgICAgRkRLc3RyY3B5KFN0cmF0ZWd5LCJZZXMgKEZyYW1lQ29uY2VhbG1lbnQpIik7Ci0jZW5kaWYKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYworICAgICAgICAgIC5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0sgPSAwOwogICAgIH0KICAgfQotCi0jaWYgVkVSQk9TRV9SVkxDX09VVFBVVAotICBEZWJ1Z091dHB1dERpc3RvcnRlZEJpdHN0cmVhbXMocFJ2bGMscEFhY0RlY29kZXJDaGFubmVsSW5mbyxFcnJvclN0YXR1c0xlbmd0aEZ3ZCxFcnJvclN0YXR1c0xlbmd0aEJ3ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzTGVuZ3RoRXNjYXBlcyxFcnJvclN0YXR1c0ZpcnN0U2NmLEVycm9yU3RhdHVzTGFzdFNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzRmlyc3ROcmcsRXJyb3JTdGF0dXNMYXN0TnJnLEVycm9yU3RhdHVzRmlyc3RJcyxFcnJvclN0YXR1c0xhc3RJcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dGd2QsRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0J3ZCxFcnJvclN0YXR1c051bUVzY2FwZXNGd2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0YXR1c051bUVzY2FwZXNCd2QsY29uY2VhbF9tYXgsY29uY2VhbF9taW4sU3RyYXRlZ3kpOwotI2VuZGlmCiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZnVuY3Rpb246ICAgICBDUnZsY19SZWFkICAgICAgICAgICAgIAorICAgICBmdW5jdGlvbjogICAgIENSdmxjX1JlYWQKIAogICAgICBkZXNjcmlwdGlvbjogIFJlYWQgUlZMQyBFU0MxIGRhdGEgKHNpZGUgaW5mbykgZnJvbSBiaXRzdHJlYW0uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTA0Nyw1NiArMTA1NCw1OCBAQAogICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciBiaXRzdHJlYW0gc3RydWN0dXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotdm9pZCBDUnZsY19SZWFkICgKLSAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCi17Ci0gIENFclJ2bGNJbmZvICpwUnZsYyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKK3ZvaWQgQ1J2bGNfUmVhZChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CisgIENFclJ2bGNJbmZvICpwUnZsYyA9CisgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87CiAKLSAgaW50ICBncm91cCxiYW5kOworICBpbnQgZ3JvdXAsIGJhbmQ7CiAKICAgLyogUlZMQyBsb25nIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICBJbml0IHBhcnQgMSBvZiAyICovCi0gIHBSdmxjLT5udW1XaW5kb3dHcm91cHMgICA9IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7Ci0gIHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7Ci0gIHBSdmxjLT5ub2lzZV91c2VkICAgICAgICAgICAgICAgPSAgMDsgICAgICAgICAgICAgICAgICAvKiBub2lzZSBkZXRlY3Rpb24gKi8KLSAgcFJ2bGMtPmRwY21fbm9pc2VfbnJnICAgICAgICAgICA9ICAwOyAgICAgICAgICAgICAgICAgIC8qIG9ubHkgZm9yIGRlYnVnZ2luZyAqLwotICBwUnZsYy0+ZHBjbV9ub2lzZV9sYXN0X3Bvc2l0aW9uID0gIDA7ICAgICAgICAgICAgICAgICAgLyogb25seSBmb3IgZGVidWdnaW5nICovCi0gIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzICAgPSAtMTsgLyogZGVmYXVsdCB2YWx1ZSBpcyB1c2VkIGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvbmNlYWxtZW50ICovCisgIHBSdmxjLT5udW1XaW5kb3dHcm91cHMgPSBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQgPQorICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKyAgcFJ2bGMtPm5vaXNlX3VzZWQgPSAwOyAgICAgICAgICAgICAgIC8qIG5vaXNlIGRldGVjdGlvbiAqLworICBwUnZsYy0+ZHBjbV9ub2lzZV9ucmcgPSAwOyAgICAgICAgICAgLyogb25seSBmb3IgZGVidWdnaW5nICovCisgIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gPSAwOyAvKiBvbmx5IGZvciBkZWJ1Z2dpbmcgKi8KKyAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMgPQorICAgICAgLTE7IC8qIGRlZmF1bHQgdmFsdWUgaXMgdXNlZCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb25jZWFsbWVudCAqLwogCiAgIC8qIHJlYWQgb25seSBlcnJvciBzZW5zaXRpdml0eSBjbGFzcyAxIGRhdGEgKEVTQyAxIC0gZGF0YSkgKi8KLSAgcFJ2bGMtPnNmX2NvbmNlYWxtZW50ICAgID0gRkRLcmVhZEJpdHMoYnMsMSk7ICAgICAgICAgICAgICAgICAgICAvKiAjMSAqLwotICBwUnZsYy0+cmV2X2dsb2JhbF9nYWluICAgPSBGREtyZWFkQml0cyhicyw4KTsgICAgICAgICAgICAgICAgICAgIC8qICMyICovCisgIHBSdmxjLT5zZl9jb25jZWFsbWVudCA9IEZES3JlYWRCaXRzKGJzLCAxKTsgIC8qICMxICovCisgIHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gPSBGREtyZWFkQml0cyhicywgOCk7IC8qICMyICovCiAKLSAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBFaWdodFNob3J0U2VxdWVuY2UpIHsKLSAgICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2YgPSBGREtyZWFkQml0cyhicywxMSk7ICAgICAgICAgICAgICAgICAvKiAjMyAqLwotICB9ICAgICAgICAgICAgCi0gIGVsc2UgewotICAgIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZiA9IEZES3JlYWRCaXRzKGJzLDkpOyAgICAgICAgICAgICAgICAgIC8qICMzICovCisgIGlmIChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gQkxPQ0tfU0hPUlQpIHsKKyAgICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2YgPSBGREtyZWFkQml0cyhicywgMTEpOyAvKiAjMyAqLworICB9IGVsc2UgeworICAgIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZiA9IEZES3JlYWRCaXRzKGJzLCA5KTsgLyogIzMgKi8KICAgfQogCiAgIC8qIGNoZWNrIGlmIG5vaXNlIGNvZGVib29rIGlzIHVzZWQgKi8KICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgewotICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKLSAgICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rWzE2Kmdyb3VwK2JhbmRdID09IE5PSVNFX0hDQikgeworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbMTYgKiBncm91cCArIGJhbmRdID09CisgICAgICAgICAgTk9JU0VfSENCKSB7CiAgICAgICAgIHBSdmxjLT5ub2lzZV91c2VkID0gMTsKLSAgICAgICAgYnJlYWs7ICAKKyAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgaWYgKHBSdmxjLT5ub2lzZV91c2VkKSAKLSAgICBwUnZsYy0+ZHBjbV9ub2lzZV9ucmcgPSBGREtyZWFkQml0cyhicywgOSk7ICAgICAgICAgICAgICAvKiAjNCAgUE5TICovICAgIAorICBpZiAocFJ2bGMtPm5vaXNlX3VzZWQpCisgICAgcFJ2bGMtPmRwY21fbm9pc2VfbnJnID0gRkRLcmVhZEJpdHMoYnMsIDkpOyAvKiAjNCAgUE5TICovCiAKLSAgcFJ2bGMtPnNmX2VzY2FwZXNfcHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgICAgICAvKiAjNSAgICAgICovCisgIHBSdmxjLT5zZl9lc2NhcGVzX3ByZXNlbnQgPSBGREtyZWFkQml0cyhicywgMSk7IC8qICM1ICAgICAgKi8KIAotICBpZiAoIHBSdmxjLT5zZl9lc2NhcGVzX3ByZXNlbnQpIHsKLSAgICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcyA9IEZES3JlYWRCaXRzKGJzLCA4KTsgICAgICAvKiAjNiAgICAgICovCisgIGlmIChwUnZsYy0+c2ZfZXNjYXBlc19wcmVzZW50KSB7CisgICAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMgPSBGREtyZWFkQml0cyhicywgOCk7IC8qICM2ICAgICAgKi8KICAgfQogCi0gIGlmIChwUnZsYy0+bm9pc2VfdXNlZCkgeyAKLSAgICBwUnZsYy0+ZHBjbV9ub2lzZV9sYXN0X3Bvc2l0aW9uID0gRkRLcmVhZEJpdHMoYnMsIDkpOyAgICAvKiAjNyAgUE5TICovICAgIAorICBpZiAocFJ2bGMtPm5vaXNlX3VzZWQpIHsKKyAgICBwUnZsYy0+ZHBjbV9ub2lzZV9sYXN0X3Bvc2l0aW9uID0gRkRLcmVhZEJpdHMoYnMsIDkpOyAvKiAjNyAgUE5TICovCiAgICAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmIC09IDk7CiAgIH0KIApAQCAtMTEwNCwxNiArMTExMywxNSBAQAogICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2ZfYndkID0gcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmOwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGZ1bmN0aW9uOiAgICAgQ1J2bGNfRGVjb2RlICAgICAgICAgICAgIAorICAgICBmdW5jdGlvbjogICAgIENSdmxjX0RlY29kZQogCiAgICAgIGRlc2NyaXB0aW9uOiAgRGVjb2RlIHJ2bGMgZGF0YQotICAgICAgICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiByZWFkcyBib3RoIHRoZSBlc2NhcGUgc2VxdWVuY2VzIGFuZCB0aGUgc2NhbGVmYWN0b3JzIGluIGZvcndhcmQKLSAgICAgICAgICAgICAgICAgICBhbmQgYmFja3dhcmQgZGlyZWN0aW9uLiBJZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyBkZWNvZGluZyBwcm9jZXNzIHdoaWNoIGNhbiAKLSAgICAgICAgICAgICAgICAgICBub3QgYmUgY29uY2VhbGVkIHdpdGggdGhlIHJ2bGMgY29uY2VhbG1lbnQgZnJhbWUgY29uY2VhbG1lbnQgd2lsbCBiZSBpbml0aWF0ZWQuIAotICAgICAgICAgICAgICAgICAgIFRoZW4gdGhlIGVsZW1lbnQgInJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyIgaW4gdGhlIGRlY29kZXIgY2hhbm5lbCBpbmZvIGlzIHNldCAKLSAgICAgICAgICAgICAgICAgICB0byAwIG90aGVyd2lzZSBpdCBpcyBzZXQgdG8gMS4gCisgICAgICAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHJlYWRzIGJvdGggdGhlIGVzY2FwZSBzZXF1ZW5jZXMgYW5kIHRoZQorc2NhbGVmYWN0b3JzIGluIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRpcmVjdGlvbi4gSWYgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcKK2RlY29kaW5nIHByb2Nlc3Mgd2hpY2ggY2FuIG5vdCBiZSBjb25jZWFsZWQgd2l0aCB0aGUgcnZsYyBjb25jZWFsbWVudCBmcmFtZQorY29uY2VhbG1lbnQgd2lsbCBiZSBpbml0aWF0ZWQuIFRoZW4gdGhlIGVsZW1lbnQgInJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyIgaW4KK3RoZSBkZWNvZGVyIGNoYW5uZWwgaW5mbyBpcyBzZXQgdG8gMCBvdGhlcndpc2UgaXQgaXMgc2V0IHRvIDEuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICBpbnB1dDogICAgIC0gcG9pbnRlciBydmxjIHN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciBjaGFubmVsIGluZm8gc3RydWN0dXJlCkBAIC0xMTIxLDYyICsxMTI5LDQ1IEBACiAgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIGJpdHN0cmVhbSBzdHJ1Y3R1cmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIHJldHVybjogICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXZvaWQgQ1J2bGNfRGVjb2RlICgKLSAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAgKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICBicwotICAgICAgICApCi17Ci0gIENFclJ2bGNJbmZvICpwUnZsYyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKLSAgSU5UICBiaXRDbnRPZmZzdDsKLSAgVUlOVCBzYXZlQml0Q250Owordm9pZCBDUnZsY19EZWNvZGUoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicykgeworICBDRXJSdmxjSW5mbyAqcFJ2bGMgPQorICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lclJ2bGNJbmZvOworICBJTlQgYml0Q250T2Zmc3Q7CisgIElOVCBzYXZlQml0Q250OwogCi0gIHJ2bGNJbml0KHBSdmxjLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sYnMpOyAgCisgIHJ2bGNJbml0KHBSdmxjLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBicyk7CiAKICAgLyogc2F2ZSBiaXRzdHJlYW0gcG9zaXRpb24gKi8KLSAgc2F2ZUJpdENudCA9IEZES2dldEJpdENudChicyk7CisgIHNhdmVCaXRDbnQgPSAoSU5UKUZES2dldFZhbGlkQml0cyhicyk7CiAKLSNpZiBSVkxDX0FEVkFOQ0VEX0JJVFNUUkVBTV9FUlJPUl9HRU5FUkFUT1JfU0YKLSAgR2VuZXJhdGVTaW5nbGVCaXRFcnJvcihwUnZsYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAmKHBSdmxjLT5iaXRzdHJlYW1JbmRleFJ2bEZ3ZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmLAotICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotI2VuZGlmCi0KLSNpZiBSVkxDX0FEVkFOQ0VEX0JJVFNUUkVBTV9FUlJPUl9HRU5FUkFUT1JfRVNDCiAgIGlmIChwUnZsYy0+c2ZfZXNjYXBlc19wcmVzZW50KQotICAgIEdlbmVyYXRlU2luZ2xlQml0RXJyb3IocFJ2bGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBSdmxjLT5iaXRzdHJlYW1JbmRleEVzYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwotI2VuZGlmCisgICAgcnZsY0RlY29kZUVzY2FwZXMoCisgICAgICAgIHBSdmxjLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZFc2MsIGJzKTsKIAotICBpZiAoIHBSdmxjLT5zZl9lc2NhcGVzX3ByZXNlbnQpCi0gICAgcnZsY0RlY29kZUVzY2FwZXMocFJ2bGMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkVzYywgYnMpOwotCi0gIHJ2bGNEZWNvZGVGb3J3YXJkKHBSdmxjLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIGJzKTsgICAgCi0gIHJ2bGNEZWNvZGVCYWNrd2FyZChwUnZsYyxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBicyk7CisgIHJ2bGNEZWNvZGVGb3J3YXJkKHBSdmxjLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBicyk7CisgIHJ2bGNEZWNvZGVCYWNrd2FyZChwUnZsYywgcEFhY0RlY29kZXJDaGFubmVsSW5mbywgYnMpOwogICBydmxjRmluYWxFcnJvckRldGVjdGlvbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKTsKIAotICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0ludGVuc2l0eVVzZWQgPSBwUnZsYy0+aW50ZW5zaXR5X3VzZWQ7CisgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjSW50ZW5zaXR5VXNlZCA9CisgICAgICBwUnZsYy0+aW50ZW5zaXR5X3VzZWQ7CiAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEuYWFjLlBuc0RhdGEuUG5zQWN0aXZlID0gcFJ2bGMtPm5vaXNlX3VzZWQ7CiAKICAgLyogcmVzdG9yZSBiaXRzdHJlYW0gcG9zaXRpb24gKi8KLSAgYml0Q250T2Zmc3QgPSBzYXZlQml0Q250IC0gRkRLZ2V0Qml0Q250KGJzKTsKLSAgaWYoIGJpdENudE9mZnN0ICkgeworICBiaXRDbnRPZmZzdCA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSAtIHNhdmVCaXRDbnQ7CisgIGlmIChiaXRDbnRPZmZzdCkgewogICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCBiaXRDbnRPZmZzdCk7CiAgIH0KIH0KIAotdm9pZCBDUnZsY19FbGVtZW50Q2hlY2sgKAotICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10sCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgY29uc3QgSU5UIGVsQ2hhbm5lbHMKLSAgICAgICAgKQotewordm9pZCBDUnZsY19FbGVtZW50Q2hlY2soCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1tdLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKKyAgICBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBJTlQgZWxDaGFubmVscykgewogICBpbnQgY2g7CiAKICAgLyogUmVxdWlyZWQgZm9yIE1QUyByZXNpZHVhbHMuICovCkBAIC0xMTg1LDMxICsxMTc2LDQyIEBACiAgIH0KIAogICAvKiBSVkxDIHNwZWNpZmljIHNhbml0eSBjaGVja3MgKi8KLSAgaWYgKCAoZmxhZ3MgJiBBQ19FUl9SVkxDKSAmJiAoZWxDaGFubmVscyA9PSAyKSkgeyAvKiB0byBiZSByZXZpZXdlZCAqLwotICAgIGlmICggKCAocEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAwKSB8fAotICAgICAgICAgICAocEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAwKSApCi0gICAgICAgICYmICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLk1zTWFza1ByZXNlbnQgICkgewotICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9IDA7Ci0gICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMDsKKyAgaWYgKChmbGFncyAmIEFDX0VSX1JWTEMpICYmIChlbENoYW5uZWxzID09IDIpKSB7IC8qIHRvIGJlIHJldmlld2VkICovCisgICAgaWYgKCgocEFhY0RlY29kZXJDaGFubmVsSW5mb1swXQorICAgICAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0sgPT0gMCkgfHwKKyAgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdCisgICAgICAgICAgICAgIC0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAwKSkgJiYKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YS5Nc01hc2tQcmVzZW50KSB7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdCisgICAgICAgICAgLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMDsKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0KKyAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0sgPSAwOwogICAgIH0KIAotICAgIGlmICggICAocEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAwKQotICAgICAgICAmJiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAxKQotICAgICAgICAmJiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNJbnRlbnNpdHlVc2VkID09IDEpICl7Ci0gICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMDsKKyAgICBpZiAoKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0KKyAgICAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0sgPT0gMCkgJiYKKyAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0KKyAgICAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0sgPT0gMSkgJiYKKyAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0KKyAgICAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjSW50ZW5zaXR5VXNlZCA9PSAxKSkgeworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXQorICAgICAgICAgIC0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9IDA7CiAgICAgfQogICB9CiAKLSAgZm9yIChjaCA9IDA7IGNoIDwgZWxDaGFubmVsczsgY2ggKyspCi0gIHsKLSAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c0Jsb2NrVHlwZSA9IChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgPyAwIDogMTsKKyAgZm9yIChjaCA9IDA7IGNoIDwgZWxDaGFubmVsczsgY2grKykgeworICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzQmxvY2tUeXBlID0KKyAgICAgICAgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbykgPT0gQkxPQ0tfU0hPUlQpCisgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgIDogMTsKICAgICBpZiAoZmxhZ3MgJiBBQ19FUl9SVkxDKSB7Ci0gICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yT0sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yT0sgPSAwOworICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAtPmNvbmNlYWxtZW50SW5mby5ydmxjUHJldmlvdXNTY2FsZUZhY3Rvck9LID0KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXQorICAgICAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JPSyA9IDA7CiAgICAgfQogICB9CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9ydmxjLmggYi9saWJBQUNkZWMvc3JjL3J2bGMuaAppbmRleCAxOGQ1ZmEzLi45YzYwZDUxIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL3J2bGMuaAorKysgYi9saWJBQUNkZWMvc3JjL3J2bGMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQpAQCAtOTAsOCArMTA5LDYgQEAKICNpZm5kZWYgUlZMQ19ICiAjZGVmaW5lIFJWTENfSAogCi0KLQogI2luY2x1ZGUgImFhY2RlY29kZXIuaCIKICNpbmNsdWRlICJjaGFubmVsLmgiCiAjaW5jbHVkZSAicnZsY19pbmZvLmgiCkBAIC0xMDAsMzUgKzExNywzNyBAQAogLyogICAgZXJyb3JMb2dSdmxjOiBBIHdvcmQgb2YgMzIgYml0cyB1c2VkIGZvciBsb2dnaW5nIHBvc3NpYmxlIGVycm9ycyAqLwogLyogICAgICAgICAgICAgICAgICB3aXRoaW4gUlZMQyBpbiBjYXNlIG9mIGRpc3RvcnRlZCBiaXRzdHJlYW1zLiAgICAgICAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVkxDX0VSUk9SX0FMTF9FU0NBUEVfV09SRFNfSU5WQUxJRCAgICAgICAgICAgICAgMHg4MDAwMDAwMCAgIC8qICBFU0MtRGVjICBEdXJpbmcgUlZMQy1Fc2NhcGUtZGVjb2RpbmcgdGhlcmUgaGF2ZSBiZWVuIG1vcmUgYml0cyBkZWNvZGVkIGFzIHRoZXJlIGFyZSBhdmFpbGFibGUgKi8KLSNkZWZpbmUgUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fRldEICAgIDB4NDAwMDAwMDAgICAvKiAgUlZMLURlYyAgbmVnYXRpdmUgc3VtLWJpdGNvdW50ZXIgZHVyaW5nIFJWTC1md2QtZGVjb2RpbmcgKGxvbmcrc2hydCkgKi8KLSNkZWZpbmUgUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fQldEICAgIDB4MjAwMDAwMDAgICAvKiAgUlZMLURlYyAgbmVnYXRpdmUgc3VtLWJpdGNvdW50ZXIgZHVyaW5nIFJWTC1md2QtZGVjb2RpbmcgKGxvbmcrc2hydCkgKi8KLSNkZWZpbmUgUlZMQ19FUlJPUl9GT1JCSURERU5fQ1dfREVURUNURURfRldEICAgICAgICAgICAgIDB4MDgwMDAwMDAgICAvKiAgUlZMLURlYyAgZm9yYmlkZGVuIGNvZGV3b3JkIGRldGVjdGVkIGZ3ZCAobG9uZytzaHJ0KSAqLwotI2RlZmluZSBSVkxDX0VSUk9SX0ZPUkJJRERFTl9DV19ERVRFQ1RFRF9CV0QgICAgICAgICAgICAgMHgwNDAwMDAwMCAgIC8qICBSVkwtRGVjICBmb3JiaWRkZW4gY29kZXdvcmQgZGV0ZWN0ZWQgYndkIChsb25nK3NocnQpICovCisjZGVmaW5lIFJWTENfRVJST1JfQUxMX0VTQ0FQRV9XT1JEU19JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4ODAwMDAwMDAgLyogIEVTQy1EZWMgIER1cmluZyBSVkxDLUVzY2FwZS1kZWNvZGluZyB0aGVyZSBoYXZlIGJlZW4gbW9yZSBcCisgICAgICAgICAgICAgICAgYml0cyBkZWNvZGVkIGFzIHRoZXJlIGFyZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fRldEICAgICAgICAgICAgICAgICAgICAgXAorICAweDQwMDAwMDAwIC8qICBSVkwtRGVjICBuZWdhdGl2ZSBzdW0tYml0Y291bnRlciBkdXJpbmcgUlZMLWZ3ZC1kZWNvZGluZyBcCisgICAgICAgICAgICAgICAgKGxvbmcrc2hydCkgKi8KKyNkZWZpbmUgUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fQldEICAgICAgICAgICAgICAgICAgICAgXAorICAweDIwMDAwMDAwIC8qICBSVkwtRGVjICBuZWdhdGl2ZSBzdW0tYml0Y291bnRlciBkdXJpbmcgUlZMLWZ3ZC1kZWNvZGluZyBcCisgICAgICAgICAgICAgICAgKGxvbmcrc2hydCkgKi8KKyNkZWZpbmUgUlZMQ19FUlJPUl9GT1JCSURERU5fQ1dfREVURUNURURfRldEIFwKKyAgMHgwODAwMDAwMCAvKiAgUlZMLURlYyAgZm9yYmlkZGVuIGNvZGV3b3JkIGRldGVjdGVkIGZ3ZCAobG9uZytzaHJ0KSAqLworI2RlZmluZSBSVkxDX0VSUk9SX0ZPUkJJRERFTl9DV19ERVRFQ1RFRF9CV0QgXAorICAweDA0MDAwMDAwIC8qICBSVkwtRGVjICBmb3JiaWRkZW4gY29kZXdvcmQgZGV0ZWN0ZWQgYndkIChsb25nK3NocnQpICovCiAKK3ZvaWQgQ1J2bGNfUmVhZChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKTsKIAotCi12b2lkIENSdmxjX1JlYWQgKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGJzKTsKLQotdm9pZCBDUnZsY19EZWNvZGUgKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGJzKTsKK3ZvaWQgQ1J2bGNfRGVjb2RlKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpOwogCiAvKioKLSAqIFxicmllZiBwZXJmb3JtZSBzYW5pdHkgY2hlY2tzIHRvIHRoZSBjaGFubmVsIGRhdGEgY29ycmVzcG9uZGluZyB0byBvbmUgY2hhbm5lbCBlbGVtZW50LgorICogXGJyaWVmIHBlcmZvcm1lIHNhbml0eSBjaGVja3MgdG8gdGhlIGNoYW5uZWwgZGF0YSBjb3JyZXNwb25kaW5nIHRvIG9uZQorICogY2hhbm5lbCBlbGVtZW50LgogICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8KICAqIFxwYXJhbSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvCiAgKiBccGFyYW0gZWxDaGFubmVscyBhbW91bnQgb2YgY2hhbm5lbHMgb2YgdGhlIGNoYW5uZWwgZWxlbWVudC4KICAqLwotdm9pZCBDUnZsY19FbGVtZW50Q2hlY2sgKAotICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10sCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgY29uc3QgSU5UIGVsQ2hhbm5lbHMKLSAgICAgICAgKTsKLQotCi0KK3ZvaWQgQ1J2bGNfRWxlbWVudENoZWNrKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXSwKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgY29uc3QgVUlOVCBmbGFncywgY29uc3QgSU5UIGVsQ2hhbm5lbHMpOwogCiAjZW5kaWYgLyogUlZMQ19IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3J2bGNfaW5mby5oIGIvbGliQUFDZGVjL3NyYy9ydmxjX2luZm8uaAppbmRleCA2MzkzNGFmLi5lN2IzYjk5IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL3J2bGNfaW5mby5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvcnZsY19pbmZvLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNyArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKQEAgLTg5LDg4ICsxMDgsOTcgQEAKICNpZm5kZWYgUlZMQ19JTkZPX0gKICNkZWZpbmUgUlZMQ19JTkZPX0gKIAorI2RlZmluZSBGV0QgMCAvKiBiaXRzdHJlYW0gZGVjb2RpbmcgZGlyZWN0aW9uIGZvcndhcmQgKFJWTCBjb2RlZCBwYXJ0KSAqLworI2RlZmluZSBCV0QgMSAvKiBiaXRzdHJlYW0gZGVjb2RpbmcgZGlyZWN0aW9uIGJhY2t3YXJkIChSVkwgY29kZWQgcGFydCkgKi8KIAorI2RlZmluZSBNQVhfUlZMIDcgIC8qIHBvc2l0aXZlIFJWTEMgZXNjYXBlICovCisjZGVmaW5lIE1JTl9SVkwgLTcgLyogbmVnYXRpdmUgUlZMQyBlc2NhcGUgKi8KKyNkZWZpbmUgTUFYX0FMTE9XRURfRFBDTV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMTQgLyogdGhlIG1heGltdW0gYWxsb3dlZCBpbmRleCBvZiBhIGRlY29kZWQgZHBjbSB2YWx1ZSAob2Zmc2V0IFwKKyAgICAgICAgJ1RBQkxFX09GRlNFVCcgaW5jbCAtLT4gbXVzdCBiZSBzdWJ0cmFjdGVkKSAqLworI2RlZmluZSBUQUJMRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgNyAvKiBkcGNtIG9mZnNldCBvZiB2YWxpZCBvdXRwdXQgdmFsdWVzIG9mIHJ2bCB0YWJsZSBkZWNvZGluZywgdGhlIHJ2bCB0YWJsZSBcCisgICAgICAgb3VseSByZXR1cm5zIHBvc2l0aXZlIHZhbHVlcywgdGhlcmVmb3JlIHRoZSBvZmZzZXQgKi8KKyNkZWZpbmUgTUFYX0xFTl9SVkxDX0NPREVfV09SRCA5IC8qIG1heCBsZW5ndGggb2YgYSBSVkwgY29kZXdvcmQgaW4gYml0cyAqLworI2RlZmluZSBNQVhfTEVOX1JWTENfRVNDQVBFX1dPUkQgXAorICAyMCAvKiBtYXggbGVuZ3RoIG9mIGh1ZmZtYW4gY29kZWQgUlZMQyBlc2NhcGUgd29yZCBpbiBiaXRzICovCiAKLSNkZWZpbmUgRldEICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgLyogYml0c3RyZWFtIGRlY29kaW5nIGRpcmVjdGlvbiBmb3J3YXJkIChSVkwgY29kZWQgcGFydCkgKi8KLSNkZWZpbmUgQldEICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgLyogYml0c3RyZWFtIGRlY29kaW5nIGRpcmVjdGlvbiBiYWNrd2FyZCAoUlZMIGNvZGVkIHBhcnQpICovCisjZGVmaW5lIERQQ01fTk9JU0VfTlJHX0JJVFMgOQorI2RlZmluZSBTRl9PRkZTRVQgMTAwIC8qIG9mZnNldCBmb3IgY29ycmVjdGluZyBzY2YgdmFsdWUgKi8KIAotI2RlZmluZSBNQVhfUlZMICAgICAgICAgICAgICAgICAgICAgICA3ICAgICAvKiBwb3NpdGl2ZSBSVkxDIGVzY2FwZSAqLwotI2RlZmluZSBNSU5fUlZMICAgICAgICAgICAgICAgICAgICAgIC03ICAgICAvKiBuZWdhdGl2ZSBSVkxDIGVzY2FwZSAqLwotI2RlZmluZSBNQVhfQUxMT1dFRF9EUENNX0lOREVYICAgICAgIDE0ICAgICAvKiB0aGUgbWF4aW11bSBhbGxvd2VkIGluZGV4IG9mIGEgZGVjb2RlZCBkcGNtIHZhbHVlIChvZmZzZXQgJ1RBQkxFX09GRlNFVCcgaW5jbCAtLT4gbXVzdCBiZSBzdWJ0cmFjdGVkKSAqLwotI2RlZmluZSBUQUJMRV9PRkZTRVQgICAgICAgICAgICAgICAgICA3ICAgICAvKiBkcGNtIG9mZnNldCBvZiB2YWxpZCBvdXRwdXQgdmFsdWVzIG9mIHJ2bCB0YWJsZSBkZWNvZGluZywgdGhlIHJ2bCB0YWJsZSBvdWx5IHJldHVybnMgcG9zaXRpdmUgdmFsdWVzLCB0aGVyZWZvcmUgdGhlIG9mZnNldCAqLwotI2RlZmluZSBNQVhfTEVOX1JWTENfQ09ERV9XT1JEICAgICAgICA5ICAgICAvKiBtYXggbGVuZ3RoIG9mIGEgUlZMIGNvZGV3b3JkIGluIGJpdHMgKi8KLSNkZWZpbmUgTUFYX0xFTl9SVkxDX0VTQ0FQRV9XT1JEICAgICAyMCAgICAgLyogbWF4IGxlbmd0aCBvZiBodWZmbWFuIGNvZGVkIFJWTEMgZXNjYXBlIHdvcmQgaW4gYml0cyAqLworI2RlZmluZSBDT05DRUFMX01BWF9JTklUIDEzMTEgIC8qIGFyYml0cmFyeSB2YWx1ZSAqLworI2RlZmluZSBDT05DRUFMX01JTl9JTklUIC0xMzExIC8qIGFyYml0cmFyeSB2YWx1ZSAqLwogCi0jZGVmaW5lIERQQ01fTk9JU0VfTlJHX0JJVFMgICAgICAgICAgIDkKLSNkZWZpbmUgU0ZfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDEwMCAgICAgLyogb2Zmc2V0IGZvciBjb3JyZWN0aW5nIHNjZiB2YWx1ZSAqLwotCi0jZGVmaW5lIENPTkNFQUxfTUFYX0lOSVQgICAgICAgICAgIDEzMTEgICAgIC8qIGFyYml0cmFyeSB2YWx1ZSAqLwotI2RlZmluZSBDT05DRUFMX01JTl9JTklUICAgICAgICAgIC0xMzExICAgICAvKiBhcmJpdHJhcnkgdmFsdWUgKi8KLQotI2RlZmluZSBSVkxDX01BWF9TRkIgICAgICAgICAgICAgICgoOCkgKiAoMTYpKQorI2RlZmluZSBSVkxDX01BWF9TRkIgKCg4KSAqICgxNikpCiAKIC8qIHNpZGVpbmZvIG9mIFJWTEMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIC0tLS0tLS0gRVNDIDEgRGF0YTogLS0tLS0tLS0tICovICAgICAvKiBvcmRlciBvZiBSVkxDLWJpdHN0cmVhbSBjb21wb25lbnRzIGluIGJpdHN0cmVhbSAoUlZMQy1pbml0aWFsaXphdGlvbiksIGV2ZXJ5IGNvbXBvbmVudCBhcHBlYXJzIG9ubHkgb25jZSBpbiBiaXRzdHJlYW0gKi8KLSAgSU5UICAgICAgICBzZl9jb25jZWFsbWVudDsgICAgICAgICAgICAgIC8qIDEgICAgICAgICAgKi8KLSAgSU5UICAgICAgICByZXZfZ2xvYmFsX2dhaW47ICAgICAgICAgICAgIC8qIDIgICAgICAgICAgKi8KLSAgU0hPUlQgICAgICBsZW5ndGhfb2ZfcnZsY19zZjsgICAgICAgICAgIC8qIDMgICAgICAgICAgKi8gIC8qIG9yaWdpbmFsIHZhbHVlLCBnZXRzIG1vZGlmaWVkIChzdWJ0cmFjdCA5KSBpbiBjYXNlIG9mIG5vaXNlIChQTlMpOyBpcyBrZXB0IGZvciBsYXRlciB1c2UgKi8KLSAgSU5UICAgICAgICBkcGNtX25vaXNlX25yZzsgICAgICAgICAgICAgIC8qIDQgb3B0aW9uYWwgKi8KLSAgSU5UICAgICAgICBzZl9lc2NhcGVzX3ByZXNlbnQ7ICAgICAgICAgIC8qIDUgICAgICAgICAgKi8KLSAgU0hPUlQgICAgICBsZW5ndGhfb2ZfcnZsY19lc2NhcGVzOyAgICAgIC8qIDYgb3B0aW9uYWwgKi8KLSAgSU5UICAgICAgICBkcGNtX25vaXNlX2xhc3RfcG9zaXRpb247ICAgIC8qIDcgb3B0aW9uYWwgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogLS0tLS0tLSBFU0MgMSBEYXRhOiAtLS0tLS0tLS0gKi8gLyogb3JkZXIgb2YgUlZMQy1iaXRzdHJlYW0gY29tcG9uZW50cyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gKFJWTEMtaW5pdGlhbGl6YXRpb24pLCBldmVyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgYXBwZWFycyBvbmx5IG9uY2UgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtICovCisgIElOVCBzZl9jb25jZWFsbWVudDsgICAgICAgICAgICAgICAgIC8qIDEgICAgICAgICAgKi8KKyAgSU5UIHJldl9nbG9iYWxfZ2FpbjsgICAgICAgICAgICAgICAgLyogMiAgICAgICAgICAqLworICBTSE9SVCBsZW5ndGhfb2ZfcnZsY19zZjsgLyogMyAgICAgICAgICAqLyAvKiBvcmlnaW5hbCB2YWx1ZSwgZ2V0cyBtb2RpZmllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VidHJhY3QgOSkgaW4gY2FzZSBvZiBub2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUE5TKTsgaXMga2VwdCBmb3IgbGF0ZXIgdXNlICovCisgIElOVCBkcGNtX25vaXNlX25yZzsgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgb3B0aW9uYWwgKi8KKyAgSU5UIHNmX2VzY2FwZXNfcHJlc2VudDsgICAgICAgICAgICAgICAgICAgLyogNSAgICAgICAgICAqLworICBTSE9SVCBsZW5ndGhfb2ZfcnZsY19lc2NhcGVzOyAgICAgICAgICAgICAvKiA2IG9wdGlvbmFsICovCisgIElOVCBkcGNtX25vaXNlX2xhc3RfcG9zaXRpb247ICAgICAgICAgICAgIC8qIDcgb3B0aW9uYWwgKi8KIAotICBJTlQgICAgICAgIGRwY21faXNfbGFzdF9wb3NpdGlvbjsKKyAgSU5UIGRwY21faXNfbGFzdF9wb3NpdGlvbjsKIAotICBTSE9SVCAgICAgIGxlbmd0aF9vZl9ydmxjX3NmX2Z3ZDsgICAgICAgLyogbGVuZ3RoX29mX3J2bGNfc2YgdXNlZCBmb3IgZm9yd2FyZCBkZWNvZGluZyAqLwotICBTSE9SVCAgICAgIGxlbmd0aF9vZl9ydmxjX3NmX2J3ZDsgICAgICAgLyogbGVuZ3RoX29mX3J2bGNfc2YgdXNlZCBmb3IgYmFja3dhcmQgZGVjb2RpbmcgKi8KKyAgU0hPUlQgbGVuZ3RoX29mX3J2bGNfc2ZfZndkOyAvKiBsZW5ndGhfb2ZfcnZsY19zZiB1c2VkIGZvciBmb3J3YXJkIGRlY29kaW5nICovCisgIFNIT1JUCisgIGxlbmd0aF9vZl9ydmxjX3NmX2J3ZDsgLyogbGVuZ3RoX29mX3J2bGNfc2YgdXNlZCBmb3IgYmFja3dhcmQgZGVjb2RpbmcgKi8KIAogICAvKiBmb3IgUlZMLUNvZGV3b3JkIGRlY29kZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmd2QgYW5kIGJ3ZCBkZWNvZGluZyAqLwotICBTSE9SVCAgICAgKnBSdmxCaXRDbnRfUlZMOwotICBVU0hPUlQgICAgKnBCaXRzdHJJbmR4UnZsX1JWTDsKKyAgU0hPUlQgKnBSdmxCaXRDbnRfUlZMOworICBJTlQgKnBCaXRzdHJJbmR4UnZsX1JWTDsKIAotICBVQ0hBUiAgICAgIG51bVdpbmRvd0dyb3VwczsKLSAgVUNIQVIgICAgICBtYXhTZmJUcmFuc21pdHRlZDsKLSAgVUNIQVIgICAgICBmaXJzdF9ub2lzZV9ncm91cDsKLSAgVUNIQVIgICAgICBmaXJzdF9ub2lzZV9iYW5kOwotICBVQ0hBUiAgICAgIGRpcmVjdGlvbjsKKyAgVUNIQVIgbnVtV2luZG93R3JvdXBzOworICBVQ0hBUiBtYXhTZmJUcmFuc21pdHRlZDsKKyAgVUNIQVIgZmlyc3Rfbm9pc2VfZ3JvdXA7CisgIFVDSEFSIGZpcnN0X25vaXNlX2JhbmQ7CisgIFVDSEFSIGRpcmVjdGlvbjsKIAogICAvKiBiaXRzdHJlYW0gaW5kaWNlcyAqLwotICBVU0hPUlQgICAgIGJpdHN0cmVhbUluZGV4UnZsRndkOyAgICAgICAgLyogYmFzZSBhZGRyZXNzIG9mIFJWTC1jb2RlZC1zY2FsZWZhY3RvciBkYXRhIChFU0MgMikgZm9yIGZvcndhcmQgIGRlY29kaW5nICovCi0gIFVTSE9SVCAgICAgYml0c3RyZWFtSW5kZXhSdmxCd2Q7ICAgICAgICAvKiBiYXNlIGFkZHJlc3Mgb2YgUlZMLWNvZGVkLXNjYWxlZmFjdG9yIGRhdGEgKEVTQyAyKSBmb3IgYmFja3dhcmQgZGVjb2RpbmcgKi8KLSAgVVNIT1JUICAgICBiaXRzdHJlYW1JbmRleEVzYzsgICAgICAgICAgIC8qIGJhc2UgYWRkcmVzcyB3aGVyZSBSVkxDLWVzY2FwZXMgc3RhcnQgKEVTQyAyKSAqLworICBJTlQgYnNBbmNob3I7ICAgICAgICAgICAgIC8qIGhjciBiaXQgYnVmZmVyIHJlZmVyZW5jZSBpbmRleCAqLworICBJTlQgYml0c3RyZWFtSW5kZXhSdmxGd2Q7IC8qIGJhc2UgYWRkcmVzcyBvZiBSVkwtY29kZWQtc2NhbGVmYWN0b3IgZGF0YSAoRVNDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikgZm9yIGZvcndhcmQgIGRlY29kaW5nICovCisgIElOVCBiaXRzdHJlYW1JbmRleFJ2bEJ3ZDsgLyogYmFzZSBhZGRyZXNzIG9mIFJWTC1jb2RlZC1zY2FsZWZhY3RvciBkYXRhIChFU0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSBmb3IgYmFja3dhcmQgZGVjb2RpbmcgKi8KKyAgSU5UIGJpdHN0cmVhbUluZGV4RXNjOyAgICAvKiBiYXNlIGFkZHJlc3Mgd2hlcmUgUlZMQy1lc2NhcGVzIHN0YXJ0IChFU0MgMikgKi8KIAogICAvKiBkZWNvZGluZyB0cmVlcyAqLwogICBjb25zdCBVSU5UICpwSHVmZlRyZWVSdmxDb2Rld2RzOwogICBjb25zdCBVSU5UICpwSHVmZlRyZWVSdmxjRXNjYXBlOwogCiAgIC8qIGVzY2FwZSBjb3VudGVycyAqLwotICBVQ0hBUiAgICAgIG51bURlY29kZWRFc2NhcGVXb3Jkc0Z3ZDsgICAgLyogd2hlbiBkZWNvZGluZyBSVkwtY29kZXMgZm9yd2FyZCAgKi8KLSAgVUNIQVIgICAgICBudW1EZWNvZGVkRXNjYXBlV29yZHNCd2Q7ICAgIC8qIHdoZW4gZGVjb2RpbmcgUlZMLWNvZGVzIGJhY2t3YXJkICovCi0gIFVDSEFSICAgICAgbnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjOyAgICAvKiB3aGVuIGRlY29kaW5nIHRoZSBlc2NhcGUtV29yZHMgKi8KKyAgVUNIQVIgbnVtRGVjb2RlZEVzY2FwZVdvcmRzRndkOyAvKiB3aGVuIGRlY29kaW5nIFJWTC1jb2RlcyBmb3J3YXJkICAqLworICBVQ0hBUiBudW1EZWNvZGVkRXNjYXBlV29yZHNCd2Q7IC8qIHdoZW4gZGVjb2RpbmcgUlZMLWNvZGVzIGJhY2t3YXJkICovCisgIFVDSEFSIG51bURlY29kZWRFc2NhcGVXb3Jkc0VzYzsgLyogd2hlbiBkZWNvZGluZyB0aGUgZXNjYXBlLVdvcmRzICovCiAKLSAgU0NIQVIgICAgICBub2lzZV91c2VkOwotICBTQ0hBUiAgICAgIGludGVuc2l0eV91c2VkOwotICBTQ0hBUiAgICAgIHNmX3VzZWQ7CisgIFNDSEFSIG5vaXNlX3VzZWQ7CisgIFNDSEFSIGludGVuc2l0eV91c2VkOworICBTQ0hBUiBzZl91c2VkOwogCi0gIFNIT1JUICAgICAgZmlyc3RTY2Y7Ci0gIFNIT1JUICAgICAgbGFzdFNjZjsKLSAgU0hPUlQgICAgICBmaXJzdE5yZzsKLSAgU0hPUlQgICAgICBsYXN0TnJnOwotICBTSE9SVCAgICAgIGZpcnN0SXM7Ci0gIFNIT1JUICAgICAgbGFzdElzOworICBTSE9SVCBmaXJzdFNjZjsKKyAgU0hPUlQgbGFzdFNjZjsKKyAgU0hPUlQgZmlyc3ROcmc7CisgIFNIT1JUIGxhc3ROcmc7CisgIFNIT1JUIGZpcnN0SXM7CisgIFNIT1JUIGxhc3RJczsKIAogICAvKiAtLS0tLS0gUlZMQyBlcnJvciBkZXRlY3Rpb24gLS0tLS0tICovCi0gIFVJTlQgICAgICAgZXJyb3JMb2dSdmxjOyAgICAgICAgICAgICAgICAvKiBzdG9yZSBSVkxDIGVycm9ycyAgKi8KLSAgU0hPUlQgICAgICBjb25jZWFsX21pbjsgICAgICAgICAgICAgICAgIC8qIGlzIHNldCBhdCBiYWNrd2FyZCBkZWNvZGluZyAgKi8KLSAgU0hPUlQgICAgICBjb25jZWFsX21heDsgICAgICAgICAgICAgICAgIC8qIGlzIHNldCBhdCBmb3J3YXJkICBkZWNvZGluZyAgKi8KLSAgU0hPUlQgICAgICBjb25jZWFsX21pbl9lc2M7ICAgICAgICAgICAgIC8qIGlzIHNldCBhdCBiYWNrd2FyZCBkZWNvZGluZyAgKi8KLSAgU0hPUlQgICAgICBjb25jZWFsX21heF9lc2M7ICAgICAgICAgICAgIC8qIGlzIHNldCBhdCBmb3J3YXJkICBkZWNvZGluZyAgKi8KKyAgVUlOVCBlcnJvckxvZ1J2bGM7ICAgICAvKiBzdG9yZSBSVkxDIGVycm9ycyAgKi8KKyAgU0hPUlQgY29uY2VhbF9taW47ICAgICAvKiBpcyBzZXQgYXQgYmFja3dhcmQgZGVjb2RpbmcgICovCisgIFNIT1JUIGNvbmNlYWxfbWF4OyAgICAgLyogaXMgc2V0IGF0IGZvcndhcmQgIGRlY29kaW5nICAqLworICBTSE9SVCBjb25jZWFsX21pbl9lc2M7IC8qIGlzIHNldCBhdCBiYWNrd2FyZCBkZWNvZGluZyAgKi8KKyAgU0hPUlQgY29uY2VhbF9tYXhfZXNjOyAvKiBpcyBzZXQgYXQgZm9yd2FyZCAgZGVjb2RpbmcgICovCiB9IENFclJ2bGNJbmZvOwogCiB0eXBlZGVmIENFclJ2bGNJbmZvIFJWTENfSU5GTzsgLyogdGVtcCAqLwogCi0KLQogI2VuZGlmIC8qIFJWTENfSU5GT19IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3J2bGNiaXQuY3BwIGIvbGliQUFDZGVjL3NyYy9ydmxjYml0LmNwcAppbmRleCA2ZWZiYjkzLi5iMGM0NTk2IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL3J2bGNiaXQuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvcnZsY2JpdC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNyArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKQEAgLTg5LDI4ICsxMDgsMjcgQEAKIAogI2luY2x1ZGUgInJ2bGNiaXQuaCIKIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBmdW5jdGlvbjogICAgIHJ2bGNSZWFkQml0RnJvbUJpdHN0cmVhbQogCi0gICAgIGRlc2NyaXB0aW9uOiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYml0IGZyb20gdGhlIGJpdHN0cmVhbSBhY2NvcmRpbmcgdG8gcmVhZCBkaXJlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgSXQgaXMgY2FsbGVkIHZlcnkgb2Z0ZW4sIHRoZXJlZm9yZSBpdCBtYWtlcyBzZW5zZSB0byBpbmxpbmUgaXQgKHJ1bnRpbWUpLgorICAgICBkZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJpdCBmcm9tIHRoZSBiaXRzdHJlYW0gYWNjb3JkaW5nIHRvCityZWFkIGRpcmVjdGlvbi4gSXQgaXMgY2FsbGVkIHZlcnkgb2Z0ZW4sIHRoZXJlZm9yZSBpdCBtYWtlcyBzZW5zZSB0byBpbmxpbmUgaXQKKyhydW50aW1lKS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIGlucHV0OiAgICAgLSBiaXRzdHJlYW0KICAgICAgICAgICAgICAgICAgICAtIHBQb3NpdGlvbgogICAgICAgICAgICAgICAgICAgIC0gcmVhZERpcmVjdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgICAtIGJpdCBmcm9tIGJpdHN0cmVhbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi1VQ0hBUiBydmxjUmVhZEJpdEZyb21CaXRzdHJlYW0gKEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgIHJlYWREaXJlY3Rpb24pCi17Ci0gIFVJTlQgICBiaXQ7Ci0gIElOVCAgICByZWFkQml0T2Zmc2V0ID0gKnBQb3NpdGlvbi1GREtnZXRCaXRDbnQoYnMpOworVUNIQVIgcnZsY1JlYWRCaXRGcm9tQml0c3RyZWFtKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBjb25zdCBJTlQgYnNBbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwUG9zaXRpb24sIFVDSEFSIHJlYWREaXJlY3Rpb24pIHsKKyAgVUlOVCBiaXQ7CisgIElOVCByZWFkQml0T2Zmc2V0ID0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpIC0gYnNBbmNob3IgKyAqcFBvc2l0aW9uOwogCi0gIGlmKCByZWFkQml0T2Zmc2V0ICkgeworICBpZiAocmVhZEJpdE9mZnNldCkgewogICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCByZWFkQml0T2Zmc2V0KTsKICAgfQogCkBAIC0xMjgsNCArMTQ2LDMgQEAKIAogICByZXR1cm4gKGJpdCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvcnZsY2JpdC5oIGIvbGliQUFDZGVjL3NyYy9ydmxjYml0LmgKaW5kZXggMDJmYmE4OC4uMjU3ODQ1MyAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9ydmxjYml0LmgKKysrIGIvbGliQUFDZGVjL3NyYy9ydmxjYml0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTEgKzkwLDEyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIFJvYmVydCBXZWlkbmVyIChEU1AgU29sdXRpb25zKQorCiAgICBEZXNjcmlwdGlvbjogUlZMQyBEZWNvZGVyOiBCaXRzdHJlYW0gcmVhZGluZwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTEsMTMgKzEwMyw5IEBACiAjaWZuZGVmIFJWTENCSVRfSAogI2RlZmluZSBSVkxDQklUX0gKIAotCi0KICNpbmNsdWRlICJydmxjLmgiCiAKLVVDSEFSIHJ2bGNSZWFkQml0RnJvbUJpdHN0cmVhbSAoSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7Ci0KK1VDSEFSIHJ2bGNSZWFkQml0RnJvbUJpdHN0cmVhbShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgY29uc3QgSU5UIGJzQW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcFBvc2l0aW9uLCBVQ0hBUiByZWFkRGlyZWN0aW9uKTsKIAogI2VuZGlmIC8qIFJWTENCSVRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9ydmxjY29uY2VhbC5jcHAgYi9saWJBQUNkZWMvc3JjL3J2bGNjb25jZWFsLmNwcAppbmRleCBjZjMzZGQ1Li43N2ZkYTY4IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL3J2bGNjb25jZWFsLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL3J2bGNjb25jZWFsLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQpAQCAtODksMzcgKzEwOCwzMyBAQAogCiAjaW5jbHVkZSAicnZsY2NvbmNlYWwuaCIKIAotCiAjaW5jbHVkZSAiYmxvY2suaCIKICNpbmNsdWRlICJydmxjLmgiCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGZ1bmN0aW9uOiAgICAgIGNhbGNSZWZWYWxGd2QKIAotICBkZXNjcmlwdGlvbjogICBUaGUgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgc2NhbGVmYWN0b3Igd2hpY2ggaXMgY2xvc2VkIHRvIHRoZSBzY2FsZWZhY3RvcmJhbmQKLSAgICAgICAgICAgICAgICAgY29uY2VhbF9taW4uIFRoZSBzYW1lIGlzIGRvbmUgZm9yIGludGVuc2l0eSBkYXRhIGFuZCBub2lzZSBlbmVyZ2llcy4KKyAgZGVzY3JpcHRpb246ICAgVGhlIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIHNjYWxlZmFjdG9yIHdoaWNoIGlzIGNsb3NlZCB0byB0aGUKK3NjYWxlZmFjdG9yYmFuZCBjb25jZWFsX21pbi4gVGhlIHNhbWUgaXMgZG9uZSBmb3IgaW50ZW5zaXR5IGRhdGEgYW5kIG5vaXNlCitlbmVyZ2llcy4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIG91dHB1dDogICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIHNjZgogICAgICAgICAgICAgICAgICAtIHJlZmVyZW5jZSB2YWx1ZSBpbnRlcm5zaXR5IGRhdGEKICAgICAgICAgICAgICAgICAgLSByZWZlcmVuY2UgdmFsdWUgbm9pc2UgZW5lcmd5CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICByZXR1cm46ICAgICAgICAtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYwotdm9pZCBjYWxjUmVmVmFsRndkIChDRXJSdmxjSW5mbyAqcFJ2bGMsCi0gICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGludCAqcmVmSXNGd2QsCi0gICAgICAgICAgICAgICAgICAgIGludCAqcmVmTnJnRndkLAotICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZlNjZkZ3ZCkKLXsKLSAgaW50IGJhbmQsYm5kcyxncm91cCxzdGFydEJhbmQ7Ci0gIGludCBpZElzLGlkTnJnLGlkU2NmOwotICBpbnQgY29uY2VhbF9taW4sY29uY2VhbF9ncm91cF9taW47CitzdGF0aWMgdm9pZCBjYWxjUmVmVmFsRndkKENFclJ2bGNJbmZvICpwUnZsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyZWZJc0Z3ZCwgaW50ICpyZWZOcmdGd2QsIGludCAqcmVmU2NmRndkKSB7CisgIGludCBiYW5kLCBibmRzLCBncm91cCwgc3RhcnRCYW5kOworICBpbnQgaWRJcywgaWROcmcsIGlkU2NmOworICBpbnQgY29uY2VhbF9taW4sIGNvbmNlYWxfZ3JvdXBfbWluOwogICBpbnQgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CiAKLQotICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkKKyAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBCTE9DS19TSE9SVCkKICAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDE2OwogICBlbHNlCiAgICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSA2NDsKQEAgLTEzMSw2OSArMTQ2LDcxIEBACiAgIGlkSXMgPSBpZE5yZyA9IGlkU2NmID0gMTsKIAogICAvKiBzZXQgcmVmZXJlbmNlIHZhbHVlcyAqLwotICAqcmVmSXNGd2QgPSAtIFNGX09GRlNFVDsKLSAgKnJlZk5yZ0Z3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUIC0gOTAgLSAyNTY7Ci0gICpyZWZTY2ZGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVDsKKyAgKnJlZklzRndkID0gLVNGX09GRlNFVDsKKyAgKnJlZk5yZ0Z3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0KKyAgICAgICAgICAgICAgIFNGX09GRlNFVCAtIDkwIC0gMjU2OworICAqcmVmU2NmRndkID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUOwogCi0gIHN0YXJ0QmFuZCA9IGNvbmNlYWxfbWluLTE7Ci0gIGZvciAoZ3JvdXA9Y29uY2VhbF9ncm91cF9taW47IGdyb3VwID49IDA7IGdyb3VwLS0pIHsKLSAgICBmb3IgKGJhbmQ9c3RhcnRCYW5kOyBiYW5kID49IDA7IGJhbmQtLSkgewotICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7CisgIHN0YXJ0QmFuZCA9IGNvbmNlYWxfbWluIC0gMTsKKyAgZm9yIChncm91cCA9IGNvbmNlYWxfZ3JvdXBfbWluOyBncm91cCA+PSAwOyBncm91cC0tKSB7CisgICAgZm9yIChiYW5kID0gc3RhcnRCYW5kOyBiYW5kID49IDA7IGJhbmQtLSkgeworICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOwogICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CiAgICAgICAgIGNhc2UgWkVST19IQ0I6CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjoKICAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMjoKICAgICAgICAgICBpZiAoaWRJcykgewotICAgICAgICAgICAgKnJlZklzRndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwotICAgICAgICAgICAgaWRJcz0wOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCisgICAgICAgICAgICAqcmVmSXNGd2QgPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgICAgICAgICAgIGlkSXMgPSAwOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE5PSVNFX0hDQjoKICAgICAgICAgICBpZiAoaWROcmcpIHsKLSAgICAgICAgICAgICpyZWZOcmdGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107Ci0gICAgICAgICAgICBpZE5yZz0wOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCisgICAgICAgICAgICAqcmVmTnJnRndkID0KKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgICAgICAgICBpZE5yZyA9IDA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBoYXMgYmVlbiBzZXQgKi8KICAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWsgOworICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIGlmIChpZFNjZikgewotICAgICAgICAgICAgKnJlZlNjZkZ3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKLSAgICAgICAgICAgIGlkU2NmPTA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBoYXMgYmVlbiBzZXQgKi8KKyAgICAgICAgICAgICpyZWZTY2ZGd2QgPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgICAgICAgICAgIGlkU2NmID0gMDsgLyogcmVmZXJlbmNlIHZhbHVlIGhhcyBiZWVuIHNldCAqLwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9Ci0gICAgc3RhcnRCYW5kID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTE7CisgICAgc3RhcnRCYW5kID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkIC0gMTsKICAgfQotCiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGZ1bmN0aW9uOiAgICAgIGNhbGNSZWZWYWxCd2QKIAotICBkZXNjcmlwdGlvbjogICBUaGUgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgc2NhbGVmYWN0b3Igd2hpY2ggaXMgY2xvc2VkIHRvIHRoZSBzY2FsZWZhY3RvcmJhbmQKLSAgICAgICAgICAgICAgICAgY29uY2VhbF9tYXguIFRoZSBzYW1lIGlzIGRvbmUgZm9yIGludGVuc2l0eSBkYXRhIGFuZCBub2lzZSBlbmVyZ2llcy4KKyAgZGVzY3JpcHRpb246ICAgVGhlIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIHNjYWxlZmFjdG9yIHdoaWNoIGlzIGNsb3NlZCB0byB0aGUKK3NjYWxlZmFjdG9yYmFuZCBjb25jZWFsX21heC4gVGhlIHNhbWUgaXMgZG9uZSBmb3IgaW50ZW5zaXR5IGRhdGEgYW5kIG5vaXNlCitlbmVyZ2llcy4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIG91dHB1dDogICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIHNjZgogICAgICAgICAgICAgICAgICAtIHJlZmVyZW5jZSB2YWx1ZSBpbnRlcm5zaXR5IGRhdGEKICAgICAgICAgICAgICAgICAgLSByZWZlcmVuY2UgdmFsdWUgbm9pc2UgZW5lcmd5CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICByZXR1cm46ICAgICAgICAtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYwotdm9pZCBjYWxjUmVmVmFsQndkIChDRXJSdmxjSW5mbyAqcFJ2bGMsCi0gICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGludCAqcmVmSXNCd2QsCi0gICAgICAgICAgICAgICAgICAgIGludCAqcmVmTnJnQndkLAotICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZlNjZkJ3ZCkKLXsKLSAgaW50IGJhbmQsYm5kcyxncm91cCxzdGFydEJhbmQ7Ci0gIGludCBpZElzLGlkTnJnLGlkU2NmOwotICBpbnQgY29uY2VhbF9tYXgsY29uY2VhbF9ncm91cF9tYXg7CitzdGF0aWMgdm9pZCBjYWxjUmVmVmFsQndkKENFclJ2bGNJbmZvICpwUnZsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyZWZJc0J3ZCwgaW50ICpyZWZOcmdCd2QsIGludCAqcmVmU2NmQndkKSB7CisgIGludCBiYW5kLCBibmRzLCBncm91cCwgc3RhcnRCYW5kOworICBpbnQgaWRJcywgaWROcmcsIGlkU2NmOworICBpbnQgY29uY2VhbF9tYXgsIGNvbmNlYWxfZ3JvdXBfbWF4OwogICBpbnQgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CiAKLSAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBFaWdodFNob3J0U2VxdWVuY2UpCisgIGlmIChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gQkxPQ0tfU0hPUlQpCiAgICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSAxNjsKICAgZWxzZQogICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gNjQ7CkBAIC0yMDYsODYgKzIyMyw5MSBAQAogCiAgIC8qIHNldCByZWZlcmVuY2UgdmFsdWVzICovCiAgICpyZWZJc0J3ZCA9IHBSdmxjLT5kcGNtX2lzX2xhc3RfcG9zaXRpb24gLSBTRl9PRkZTRVQ7Ci0gICpyZWZOcmdCd2QgPSBwUnZsYy0+cmV2X2dsb2JhbF9nYWluICsgcFJ2bGMtPmRwY21fbm9pc2VfbGFzdF9wb3NpdGlvbiAtIFNGX09GRlNFVCAtIDkwIC0gMjU2ICsgcFJ2bGMtPmRwY21fbm9pc2VfbnJnOworICAqcmVmTnJnQndkID0gcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiArIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gLQorICAgICAgICAgICAgICAgU0ZfT0ZGU0VUIC0gOTAgLSAyNTYgKyBwUnZsYy0+ZHBjbV9ub2lzZV9ucmc7CiAgICpyZWZTY2ZCd2QgPSBwUnZsYy0+cmV2X2dsb2JhbF9nYWluIC0gU0ZfT0ZGU0VUOwogCi0gIHN0YXJ0QmFuZD1jb25jZWFsX21heCsxOworICBzdGFydEJhbmQgPSBjb25jZWFsX21heCArIDE7CiAKICAgLyogaWYgbmVlZGVkLCByZS1zZXQgcmVmZXJlbmNlIHZhbHVlcyAqLwotICBmb3IgKGdyb3VwPWNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKLSAgICBmb3IgKGJhbmQ9c3RhcnRCYW5kOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKLSAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICBmb3IgKGdyb3VwID0gY29uY2VhbF9ncm91cF9tYXg7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICBibmRzID0gMTYgKiBncm91cCArIGJhbmQ7CiAgICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKICAgICAgICAgY2FzZSBaRVJPX0hDQjoKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgogICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgogICAgICAgICAgIGlmIChpZElzKSB7Ci0gICAgICAgICAgICAqcmVmSXNCd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107Ci0gICAgICAgICAgICBpZElzPTA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBoYXMgYmVlbiBzZXQgKi8KKyAgICAgICAgICAgICpyZWZJc0J3ZCA9CisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOworICAgICAgICAgICAgaWRJcyA9IDA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBoYXMgYmVlbiBzZXQgKi8KICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTk9JU0VfSENCOgogICAgICAgICAgIGlmIChpZE5yZykgewotICAgICAgICAgICAgKnJlZk5yZ0J3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKLSAgICAgICAgICAgIGlkTnJnPTA7ICAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCisgICAgICAgICAgICAqcmVmTnJnQndkID0KKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgICAgICAgICAgICBpZE5yZyA9IDA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBoYXMgYmVlbiBzZXQgKi8KICAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWsgOworICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIGlmIChpZFNjZikgewotICAgICAgICAgICAgKnJlZlNjZkJ3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKLSAgICAgICAgICAgIGlkU2NmPTA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBoYXMgYmVlbiBzZXQgKi8KKyAgICAgICAgICAgICpyZWZTY2ZCd2QgPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgICAgICAgIGlkU2NmID0gMDsgLyogcmVmZXJlbmNlIHZhbHVlIGhhcyBiZWVuIHNldCAqLwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9Ci0gICAgc3RhcnRCYW5kPTA7CisgICAgc3RhcnRCYW5kID0gMDsKICAgfQotCiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgZnVuY3Rpb246ICAgICAgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlTG93ZXJTY2ZPZkN1cnJlbnRGcmFtZQogCi0gIGRlc2NyaXB0aW9uOiAgIFRoaXMgYXBwcm9hY2ggYnkgbWVhbnMgb2YgYmlkaXJlY3Rpb25hbCBlc3RpbWF0aW9uIGlzIGdlbmVyYWxseSBwZXJmb3JtZWQgd2hlbgotICAgICAgICAgICAgICAgICBhIHNpbmdsZSBiaXQgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQsIHRoZSBiaXQgZXJyb3IgY2FuIGJlIGlzb2xhdGVkIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgJ2NvbmNlYWxfbWluJyBhbmQgJ2NvbmNlYWxfbWF4JyBhbmQgdGhlICdzZl9jb25jZWFsbWVudCcgZmxhZyBpcyBub3Qgc2V0LiBUaGUKLSAgICAgICAgICAgICAgICAgc2V0cyBvZiBzY2FsZWZhY3RvcnMgZGVjb2RlZCBpbiBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkaXJlY3Rpb24gYXJlIGNvbXBhcmVkCi0gICAgICAgICAgICAgICAgIHdpdGggZWFjaCBvdGhlci4gVGhlIHNtYWxsZXIgc2NhbGVmYWN0b3Igd2lsbCBiZSBjb25zaWRlcmVkIGFzIHRoZSBjb3JyZWN0IG9uZQotICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuIFRoZSByZWNvbnN0cnVjdGlvbiBvZiB0aGUgc2NhbGVmYWN0b3JzIHdpdGggdGhpcyBhcHByb2FjaCBhcmNoaWV2ZQotICAgICAgICAgICAgICAgICBnb29kIHJlc3VsdHMgaW4gYXVkaW8gcXVhbGl0eS4gVGhlIHN0cmF0ZWd5IG11c3QgYmUgYXBwbGllZCB0byBzY2FsZWZhY3RvcnMsCi0gICAgICAgICAgICAgICAgIGludGVuc2l0eSBkYXRhIGFuZCBub2lzZSBlbmVyZ3kgc2VwZXJhdGVseS4KKyAgZGVzY3JpcHRpb246ICAgVGhpcyBhcHByb2FjaCBieSBtZWFucyBvZiBiaWRpcmVjdGlvbmFsIGVzdGltYXRpb24gaXMgZ2VuZXJhbGx5CitwZXJmb3JtZWQgd2hlbiBhIHNpbmdsZSBiaXQgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQsIHRoZSBiaXQgZXJyb3IgY2FuIGJlCitpc29sYXRlZCBiZXR3ZWVuICdjb25jZWFsX21pbicgYW5kICdjb25jZWFsX21heCcgYW5kIHRoZSAnc2ZfY29uY2VhbG1lbnQnIGZsYWcKK2lzIG5vdCBzZXQuIFRoZSBzZXRzIG9mIHNjYWxlZmFjdG9ycyBkZWNvZGVkIGluIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRpcmVjdGlvbgorYXJlIGNvbXBhcmVkIHdpdGggZWFjaCBvdGhlci4gVGhlIHNtYWxsZXIgc2NhbGVmYWN0b3Igd2lsbCBiZSBjb25zaWRlcmVkIGFzIHRoZQorY29ycmVjdCBvbmUgcmVzcGVjdGl2ZWx5LiBUaGUgcmVjb25zdHJ1Y3Rpb24gb2YgdGhlIHNjYWxlZmFjdG9ycyB3aXRoIHRoaXMKK2FwcHJvYWNoIGFyY2hpZXZlIGdvb2QgcmVzdWx0cyBpbiBhdWRpbyBxdWFsaXR5LiBUaGUgc3RyYXRlZ3kgbXVzdCBiZSBhcHBsaWVkIHRvCitzY2FsZWZhY3RvcnMsIGludGVuc2l0eSBkYXRhIGFuZCBub2lzZSBlbmVyZ3kgc2VwZXJhdGVseS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIG91dHB1dDogICAgICAgIENvbmNlYWxlZCBzY2FsZWZhY3Rvciwgbm9pc2UgZW5lcmd5IGFuZCBpbnRlbnNpdHkgZGF0YSBiZXR3ZWVuIGNvbmNlYWxfbWluIGFuZAotICAgICAgICAgICAgICAgICBjb25jZWFsX21heAorICBvdXRwdXQ6ICAgICAgICBDb25jZWFsZWQgc2NhbGVmYWN0b3IsIG5vaXNlIGVuZXJneSBhbmQgaW50ZW5zaXR5IGRhdGEgYmV0d2VlbgorY29uY2VhbF9taW4gYW5kIGNvbmNlYWxfbWF4CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICByZXR1cm46ICAgICAgICAtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXZvaWQgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlTG93ZXJTY2ZPZkN1cnJlbnRGcmFtZSAoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbykKLXsKLSAgQ0VyUnZsY0luZm8gKnBSdmxjID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lclJ2bGNJbmZvOwotICBpbnQgYmFuZCxibmRzLHN0YXJ0QmFuZCxlbmRCYW5kLGdyb3VwOwotICBpbnQgY29uY2VhbF9taW4sY29uY2VhbF9tYXg7Ci0gIGludCBjb25jZWFsX2dyb3VwX21pbixjb25jZWFsX2dyb3VwX21heDsKK3ZvaWQgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlTG93ZXJTY2ZPZkN1cnJlbnRGcmFtZSgKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKSB7CisgIENFclJ2bGNJbmZvICpwUnZsYyA9CisgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87CisgIGludCBiYW5kLCBibmRzLCBzdGFydEJhbmQsIGVuZEJhbmQsIGdyb3VwOworICBpbnQgY29uY2VhbF9taW4sIGNvbmNlYWxfbWF4OworICBpbnQgY29uY2VhbF9ncm91cF9taW4sIGNvbmNlYWxfZ3JvdXBfbWF4OwogICBpbnQgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CiAKLSAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBFaWdodFNob3J0U2VxdWVuY2UpIHsKKyAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBCTE9DS19TSE9SVCkgewogICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gMTY7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSA2NDsKICAgfQotICAKLSAgLyogSWYgYW4gZXJyb3Igd2FzIGRldGVjdGVkIGp1c3QgaW4gZm9yd2FyZCBvciBiYWNrd2FyZCBkaXJlY3Rpb24sIHNldCB0aGUgY29ycmVzcG9uZGluZyBib3JkZXIgZm9yIGNvbmNlYWxtZW50IHRvIGEKLSAgICAgYXBwcm9wcmlhdGUgc2NhbGVmYWN0b3IgYmFuZC4gVGhlIGJvcmRlciBpcyBzZXQgdG8gZmlyc3Qgb3IgbGFzdCBzZmIgcmVzcGVjdGl2ZWx5LCBiZWNhdXNlIHRoZSBlcnJvciB3aWxsIHBvc3NpYmx5IAotICAgICBub3QgZm9sbG93IGRpcmVjdGx5IGFmdGVyIHRoZSBjb3JydXB0IGJpdCBidXQganVzdCBhZnRlciBkZWNvZGluZyBzb21lIG1vcmUgKHdyb25nKSBzY2FsZWZhY3RvcnMuICovCi0gIGlmIChwUnZsYy0+Y29uY2VhbF9taW4gPT0gQ09OQ0VBTF9NSU5fSU5JVCkKLSAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSAwOworCisgIC8qIElmIGFuIGVycm9yIHdhcyBkZXRlY3RlZCBqdXN0IGluIGZvcndhcmQgb3IgYmFja3dhcmQgZGlyZWN0aW9uLCBzZXQgdGhlCisgICAgIGNvcnJlc3BvbmRpbmcgYm9yZGVyIGZvciBjb25jZWFsbWVudCB0byBhIGFwcHJvcHJpYXRlIHNjYWxlZmFjdG9yIGJhbmQuIFRoZQorICAgICBib3JkZXIgaXMgc2V0IHRvIGZpcnN0IG9yIGxhc3Qgc2ZiIHJlc3BlY3RpdmVseSwgYmVjYXVzZSB0aGUgZXJyb3Igd2lsbAorICAgICBwb3NzaWJseSBub3QgZm9sbG93IGRpcmVjdGx5IGFmdGVyIHRoZSBjb3JydXB0IGJpdCBidXQganVzdCBhZnRlciBkZWNvZGluZworICAgICBzb21lIG1vcmUgKHdyb25nKSBzY2FsZWZhY3RvcnMuICovCisgIGlmIChwUnZsYy0+Y29uY2VhbF9taW4gPT0gQ09OQ0VBTF9NSU5fSU5JVCkgcFJ2bGMtPmNvbmNlYWxfbWluID0gMDsKIAogICBpZiAocFJ2bGMtPmNvbmNlYWxfbWF4ID09IENPTkNFQUxfTUFYX0lOSVQpCi0gICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gKHBSdmxjLT5udW1XaW5kb3dHcm91cHMtMSkqMTYrcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTE7CisgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0KKyAgICAgICAgKHBSdmxjLT5udW1XaW5kb3dHcm91cHMgLSAxKSAqIDE2ICsgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkIC0gMTsKIAogICBjb25jZWFsX21pbiA9IHBSdmxjLT5jb25jZWFsX21pbiAlIE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwogICBjb25jZWFsX2dyb3VwX21pbiA9IHBSdmxjLT5jb25jZWFsX21pbiAvIE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwpAQCAtMjkzLDIwICszMTUsMjEgQEAKICAgY29uY2VhbF9ncm91cF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXggLyBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKIAogICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluID09IHBSdmxjLT5jb25jZWFsX21heCkgewotCi0gICAgaW50IHJlZklzRndkLHJlZk5yZ0Z3ZCxyZWZTY2ZGd2Q7Ci0gICAgaW50IHJlZklzQndkLHJlZk5yZ0J3ZCxyZWZTY2ZCd2Q7CisgICAgaW50IHJlZklzRndkLCByZWZOcmdGd2QsIHJlZlNjZkZ3ZDsKKyAgICBpbnQgcmVmSXNCd2QsIHJlZk5yZ0J3ZCwgcmVmU2NmQndkOwogCiAgICAgYm5kcyA9IHBSdmxjLT5jb25jZWFsX21pbjsKLSAgICBjYWxjUmVmVmFsRndkKHBSdmxjLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sJnJlZklzRndkLCZyZWZOcmdGd2QsJnJlZlNjZkZ3ZCk7Ci0gICAgY2FsY1JlZlZhbEJ3ZChwUnZsYyxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCZyZWZJc0J3ZCwmcmVmTnJnQndkLCZyZWZTY2ZCd2QpOworICAgIGNhbGNSZWZWYWxGd2QocFJ2bGMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sICZyZWZJc0Z3ZCwgJnJlZk5yZ0Z3ZCwKKyAgICAgICAgICAgICAgICAgICZyZWZTY2ZGd2QpOworICAgIGNhbGNSZWZWYWxCd2QocFJ2bGMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sICZyZWZJc0J3ZCwgJnJlZk5yZ0J3ZCwKKyAgICAgICAgICAgICAgICAgICZyZWZTY2ZCd2QpOwogCiAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CiAgICAgICBjYXNlIFpFUk9fSENCOgogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjoKICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6Ci0gICAgICAgIGlmIChyZWZJc0Z3ZCA8IHJlZklzQndkKSAKKyAgICAgICAgaWYgKHJlZklzRndkIDwgcmVmSXNCd2QpCiAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHJlZklzRndkOwogICAgICAgICBlbHNlCiAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHJlZklzQndkOwpAQCAtMzIwLDU1ICszNDMsNjQgQEAKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIGlmIChyZWZTY2ZGd2QgPCByZWZTY2ZCd2QpCiAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHJlZlNjZkZ3ZDsKLSAgICAgICAgZWxzZSAKKyAgICAgICAgZWxzZQogICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSByZWZTY2ZCd2Q7CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWF4XSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtwUnZsYy0+Y29uY2VhbF9tYXhdOwotICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtwUnZsYy0+Y29uY2VhbF9taW5dID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW3BSdmxjLT5jb25jZWFsX21pbl07CisgIH0gZWxzZSB7CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgIC5hUnZsY1NjZkZ3ZFtwUnZsYy0+Y29uY2VhbF9tYXhdID0KKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgICAgICAuYVJ2bGNTY2ZCd2RbcFJ2bGMtPmNvbmNlYWxfbWF4XTsKKyAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMKKyAgICAgICAgLmFSdmxjU2NmQndkW3BSdmxjLT5jb25jZWFsX21pbl0gPQorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMKKyAgICAgICAgICAgIC5hUnZsY1NjZkZ3ZFtwUnZsYy0+Y29uY2VhbF9taW5dOwogCi0gICAgLyogY29uc2lkZXIgdGhlIHNtYWxsZXIgb2YgdGhlIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRlY29kZWQgdmFsdWUgYXMgdGhlIGNvcnJlY3Qgb25lICovICAKLSAgICBzdGFydEJhbmQgPSBjb25jZWFsX21pbjsgICAgICAKLSAgICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gY29uY2VhbF9ncm91cF9tYXgpICAgCi0gICAgICBlbmRCYW5kID0gY29uY2VhbF9tYXg7ICAgICAgCi0gICAgZWxzZSAgICAgICAgICAKLSAgICAgIGVuZEJhbmQgPSBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQtMTsgICAgICAgCisgICAgLyogY29uc2lkZXIgdGhlIHNtYWxsZXIgb2YgdGhlIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRlY29kZWQgdmFsdWUgYXMgdGhlCisgICAgICogY29ycmVjdCBvbmUgKi8KKyAgICBzdGFydEJhbmQgPSBjb25jZWFsX21pbjsKKyAgICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gY29uY2VhbF9ncm91cF9tYXgpCisgICAgICBlbmRCYW5kID0gY29uY2VhbF9tYXg7CisgICAgZWxzZQorICAgICAgZW5kQmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCAtIDE7CiAKLSAgICBmb3IgKGdyb3VwPWNvbmNlYWxfZ3JvdXBfbWluOyBncm91cCA8PSBjb25jZWFsX2dyb3VwX21heDsgZ3JvdXArKykgeyAgCi0gICAgICBmb3IgKGJhbmQ9c3RhcnRCYW5kOyBiYW5kIDw9IGVuZEJhbmQ7IGJhbmQrKykgeyAgCi0gICAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOyAgCi0gICAgICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10gPCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pICAKLSAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgIGZvciAoZ3JvdXAgPSBjb25jZWFsX2dyb3VwX21pbjsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9tYXg7IGdyb3VwKyspIHsKKyAgICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8PSBlbmRCYW5kOyBiYW5kKyspIHsKKyAgICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOworICAgICAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdIDwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSkKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwogICAgICAgICBlbHNlCi0gICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKLSAgICAgIH0gIAotICAgICAgc3RhcnRCYW5kID0gMDsgICAKLSAgICAgIGlmICgoZ3JvdXArMSkgPT0gY29uY2VhbF9ncm91cF9tYXgpICAKLSAgICAgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWF4OyAgCi0gICAgfSAgCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgIH0KKyAgICAgIHN0YXJ0QmFuZCA9IDA7CisgICAgICBpZiAoKGdyb3VwICsgMSkgPT0gY29uY2VhbF9ncm91cF9tYXgpIGVuZEJhbmQgPSBjb25jZWFsX21heDsKKyAgICB9CiAgIH0KIAogICAvKiBub3cgY29weSBhbGwgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlciB3aGljaCBuZWVkcyBub3QgdG8gYmUgY29uY2VhbGVkICovCi0gIGlmIChjb25jZWFsX2dyb3VwX21pbiA9PSAwKSAKLSAgICBlbmRCYW5kID0gY29uY2VhbF9taW47ICAgIAotICBlbHNlICAgICAgICAKLSAgICBlbmRCYW5kID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyAgICAgCi0gIGZvciAoZ3JvdXA9MDsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9taW47IGdyb3VwKyspIHsKLSAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IGVuZEJhbmQ7IGJhbmQrKykgewotICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7Ci0gICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gMCkKKyAgICBlbmRCYW5kID0gY29uY2VhbF9taW47CisgIGVsc2UKKyAgICBlbmRCYW5kID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9taW47IGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgZW5kQmFuZDsgYmFuZCsrKSB7CisgICAgICBibmRzID0gMTYgKiBncm91cCArIGJhbmQ7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CiAgICAgfQotICAgIGlmICgoZ3JvdXArMSkgPT0gY29uY2VhbF9ncm91cF9taW4pIAotICAgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWluOyAgICAKKyAgICBpZiAoKGdyb3VwICsgMSkgPT0gY29uY2VhbF9ncm91cF9taW4pIGVuZEJhbmQgPSBjb25jZWFsX21pbjsKICAgfQogCi0gIHN0YXJ0QmFuZCA9IGNvbmNlYWxfbWF4KzE7ICAgIAotICBmb3IgKGdyb3VwPWNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKLSAgICBmb3IgKGJhbmQ9c3RhcnRCYW5kOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKLSAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwotICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgc3RhcnRCYW5kID0gY29uY2VhbF9tYXggKyAxOworICBmb3IgKGdyb3VwID0gY29uY2VhbF9ncm91cF9tYXg7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICBibmRzID0gMTYgKiBncm91cCArIGJhbmQ7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CiAgICAgfQogICAgIHN0YXJ0QmFuZCA9IDA7CiAgIH0KQEAgLTM3Nyw3MSArNDA5LDc5IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBmdW5jdGlvbjogICAgICBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VTY2ZPZlByZXZGcmFtZUFzUmVmZXJlbmNlCiAKLSAgZGVzY3JpcHRpb246ICAgVGhpcyBhcHByb2FjaCBieSBtZWFucyBvZiBiaWRpcmVjdGlvbmFsIGVzdGltYXRpb24gaXMgZ2VuZXJhbGx5IHBlcmZvcm1lZCB3aGVuCi0gICAgICAgICAgICAgICAgIGEgc2luZ2xlIGJpdCBlcnJvciBoYXMgYmVlbiBkZXRlY3RlZCwgdGhlIGJpdCBlcnJvciBjYW4gYmUgaXNvbGF0ZWQgYmV0d2VlbiAKLSAgICAgICAgICAgICAgICAgJ2NvbmNlYWxfbWluJyBhbmQgJ2NvbmNlYWxfbWF4JywgdGhlICdzZl9jb25jZWFsbWVudCcgZmxhZyBpcyBzZXQgYW5kIHRoZSAKLSAgICAgICAgICAgICAgICAgcHJldmlvdXMgZnJhbWUgaGFzIHRoZSBzYW1lIGJsb2NrIHR5cGUgYXMgdGhlIGN1cnJlbnQgZnJhbWUuIFRoZSBzY2FsZWZhY3RvciAKLSAgICAgICAgICAgICAgICAgZGVjb2RlZCBpbiBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkaXJlY3Rpb24gYW5kIHRoZSBzY2FsZWZhY3RvciBvZiB0aGUgcHJldmlvdXMgCi0gICAgICAgICAgICAgICAgIGZyYW1lIGFyZSBjb21wYXJlZCB3aXRoIGVhY2ggb3RoZXIuIFRoZSBzbWFsbGVyIHNjYWxlZmFjdG9yIHdpbGwgYmUgY29uc2lkZXJlZCAKLSAgICAgICAgICAgICAgICAgYXMgdGhlIGNvcnJlY3Qgb25lLiBBdCB0aGlzIHRoZSBjb2RlYm9vayBvZiB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgZnJhbWUgbXVzdCAKLSAgICAgICAgICAgICAgICAgYmUgb2YgdGhlIHNhbWUgc2V0IChzY2YsIG5yZywgaXMpIGluIGVhY2ggc2NhbGVmYWN0b3JiYW5kLiBPdGhlcndpc2UgdGhlIAotICAgICAgICAgICAgICAgICBzY2FsZWZhY3RvciBvZiB0aGUgcHJldmlvdXMgZnJhbWUgaXMgbm90IGNvbnNpZGVyZWQgaW4gdGhlIG1pbmltdW0gY2FsY3VsYXRpb24uIAotICAgICAgICAgICAgICAgICBUaGUgcmVjb25zdHJ1Y3Rpb24gb2YgdGhlIHNjYWxlZmFjdG9ycyB3aXRoIHRoaXMgYXBwcm9hY2ggYXJjaGlldmUgZ29vZCByZXN1bHRzIAotICAgICAgICAgICAgICAgICBpbiBhdWRpbyBxdWFsaXR5LiBUaGUgc3RyYXRlZ3kgbXVzdCBiZSBhcHBsaWVkIHRvIHNjYWxlZmFjdG9ycywgaW50ZW5zaXR5IGRhdGEgCi0gICAgICAgICAgICAgICAgIGFuZCBub2lzZSBlbmVyZ3kgc2VwZXJhdGVseS4KKyAgZGVzY3JpcHRpb246ICAgVGhpcyBhcHByb2FjaCBieSBtZWFucyBvZiBiaWRpcmVjdGlvbmFsIGVzdGltYXRpb24gaXMgZ2VuZXJhbGx5CitwZXJmb3JtZWQgd2hlbiBhIHNpbmdsZSBiaXQgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQsIHRoZSBiaXQgZXJyb3IgY2FuIGJlCitpc29sYXRlZCBiZXR3ZWVuICdjb25jZWFsX21pbicgYW5kICdjb25jZWFsX21heCcsIHRoZSAnc2ZfY29uY2VhbG1lbnQnIGZsYWcgaXMKK3NldCBhbmQgdGhlIHByZXZpb3VzIGZyYW1lIGhhcyB0aGUgc2FtZSBibG9jayB0eXBlIGFzIHRoZSBjdXJyZW50IGZyYW1lLiBUaGUKK3NjYWxlZmFjdG9yIGRlY29kZWQgaW4gZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9uIGFuZCB0aGUgc2NhbGVmYWN0b3Igb2YgdGhlCitwcmV2aW91cyBmcmFtZSBhcmUgY29tcGFyZWQgd2l0aCBlYWNoIG90aGVyLiBUaGUgc21hbGxlciBzY2FsZWZhY3RvciB3aWxsIGJlCitjb25zaWRlcmVkIGFzIHRoZSBjb3JyZWN0IG9uZS4gQXQgdGhpcyB0aGUgY29kZWJvb2sgb2YgdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50CitmcmFtZSBtdXN0IGJlIG9mIHRoZSBzYW1lIHNldCAoc2NmLCBucmcsIGlzKSBpbiBlYWNoIHNjYWxlZmFjdG9yYmFuZC4gT3RoZXJ3aXNlCit0aGUgc2NhbGVmYWN0b3Igb2YgdGhlIHByZXZpb3VzIGZyYW1lIGlzIG5vdCBjb25zaWRlcmVkIGluIHRoZSBtaW5pbXVtCitjYWxjdWxhdGlvbi4gVGhlIHJlY29uc3RydWN0aW9uIG9mIHRoZSBzY2FsZWZhY3RvcnMgd2l0aCB0aGlzIGFwcHJvYWNoIGFyY2hpZXZlCitnb29kIHJlc3VsdHMgaW4gYXVkaW8gcXVhbGl0eS4gVGhlIHN0cmF0ZWd5IG11c3QgYmUgYXBwbGllZCB0byBzY2FsZWZhY3RvcnMsCitpbnRlbnNpdHkgZGF0YSBhbmQgbm9pc2UgZW5lcmd5IHNlcGVyYXRlbHkuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBvdXRwdXQ6ICAgICAgICBDb25jZWFsZWQgc2NhbGVmYWN0b3IsIG5vaXNlIGVuZXJneSBhbmQgaW50ZW5zaXR5IGRhdGEgYmV0d2VlbiBjb25jZWFsX21pbiBhbmQgCi0gICAgICAgICAgICAgICAgIGNvbmNlYWxfbWF4CisgIG91dHB1dDogICAgICAgIENvbmNlYWxlZCBzY2FsZWZhY3Rvciwgbm9pc2UgZW5lcmd5IGFuZCBpbnRlbnNpdHkgZGF0YSBiZXR3ZWVuCitjb25jZWFsX21pbiBhbmQgY29uY2VhbF9tYXgKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHJldHVybjogICAgICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotdm9pZCBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VTY2ZPZlByZXZGcmFtZUFzUmVmZXJlbmNlICgKLSAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbwotICAgICAgICApCi17Ci0gIENFclJ2bGNJbmZvICpwUnZsYyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKLSAgaW50IGJhbmQsYm5kcyxzdGFydEJhbmQsZW5kQmFuZCxncm91cDsKLSAgaW50IGNvbmNlYWxfbWluLGNvbmNlYWxfbWF4OwotICBpbnQgY29uY2VhbF9ncm91cF9taW4sY29uY2VhbF9ncm91cF9tYXg7Cit2b2lkIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZVNjZk9mUHJldkZyYW1lQXNSZWZlcmVuY2UoCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKSB7CisgIENFclJ2bGNJbmZvICpwUnZsYyA9CisgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87CisgIGludCBiYW5kLCBibmRzLCBzdGFydEJhbmQsIGVuZEJhbmQsIGdyb3VwOworICBpbnQgY29uY2VhbF9taW4sIGNvbmNlYWxfbWF4OworICBpbnQgY29uY2VhbF9ncm91cF9taW4sIGNvbmNlYWxfZ3JvdXBfbWF4OwogICBpbnQgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7Ci0gIGludCBjb21tb25NaW47CisgIFNIT1JUIGNvbW1vbk1pbjsKIAotICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgeworICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEJMT0NLX1NIT1JUKSB7CiAgICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSAxNjsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDY0OwogICB9CiAKLSAgLyogSWYgYW4gZXJyb3Igd2FzIGRldGVjdGVkIGp1c3QgaW4gZm9yd2FyZCBvciBiYWNrd2FyZCBkaXJlY3Rpb24sIHNldCB0aGUgY29ycmVzcG9uZGluZyBib3JkZXIgZm9yIGNvbmNlYWxtZW50IHRvIGEKLSAgICAgYXBwcm9wcmlhdGUgc2NhbGVmYWN0b3IgYmFuZC4gVGhlIGJvcmRlciBpcyBzZXQgdG8gZmlyc3Qgb3IgbGFzdCBzZmIgcmVzcGVjdGl2ZWx5LCBiZWNhdXNlIHRoZSBlcnJvciB3aWxsIHBvc3NpYmx5IAotICAgICBub3QgZm9sbG93IGRpcmVjdGx5IGFmdGVyIHRoZSBjb3JydXB0IGJpdCBidXQganVzdCBhZnRlciBkZWNvZGluZyBzb21lIG1vcmUgKHdyb25nKSBzY2FsZWZhY3RvcnMuICovCi0gIGlmIChwUnZsYy0+Y29uY2VhbF9taW4gPT0gQ09OQ0VBTF9NSU5fSU5JVCkKLSAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSAwOworICAvKiBJZiBhbiBlcnJvciB3YXMgZGV0ZWN0ZWQganVzdCBpbiBmb3J3YXJkIG9yIGJhY2t3YXJkIGRpcmVjdGlvbiwgc2V0IHRoZQorICAgICBjb3JyZXNwb25kaW5nIGJvcmRlciBmb3IgY29uY2VhbG1lbnQgdG8gYSBhcHByb3ByaWF0ZSBzY2FsZWZhY3RvciBiYW5kLiBUaGUKKyAgICAgYm9yZGVyIGlzIHNldCB0byBmaXJzdCBvciBsYXN0IHNmYiByZXNwZWN0aXZlbHksIGJlY2F1c2UgdGhlIGVycm9yIHdpbGwKKyAgICAgcG9zc2libHkgbm90IGZvbGxvdyBkaXJlY3RseSBhZnRlciB0aGUgY29ycnVwdCBiaXQgYnV0IGp1c3QgYWZ0ZXIgZGVjb2RpbmcKKyAgICAgc29tZSBtb3JlICh3cm9uZykgc2NhbGVmYWN0b3JzLiAqLworICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluID09IENPTkNFQUxfTUlOX0lOSVQpIHBSdmxjLT5jb25jZWFsX21pbiA9IDA7CiAKICAgaWYgKHBSdmxjLT5jb25jZWFsX21heCA9PSBDT05DRUFMX01BWF9JTklUKQotICAgIHBSdmxjLT5jb25jZWFsX21heCA9IChwUnZsYy0+bnVtV2luZG93R3JvdXBzLTEpKjE2K3BSdmxjLT5tYXhTZmJUcmFuc21pdHRlZC0xOworICAgIHBSdmxjLT5jb25jZWFsX21heCA9CisgICAgICAgIChwUnZsYy0+bnVtV2luZG93R3JvdXBzIC0gMSkgKiAxNiArIHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCAtIDE7CiAKICAgY29uY2VhbF9taW4gPSBwUnZsYy0+Y29uY2VhbF9taW4gJSBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKICAgY29uY2VhbF9ncm91cF9taW4gPSBwUnZsYy0+Y29uY2VhbF9taW4gLyBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKICAgY29uY2VhbF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXggJSBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKICAgY29uY2VhbF9ncm91cF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXggLyBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKIAotICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWF4XSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtwUnZsYy0+Y29uY2VhbF9tYXhdOyAgCi0gIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtwUnZsYy0+Y29uY2VhbF9taW5dID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW3BSdmxjLT5jb25jZWFsX21pbl07ICAKKyAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWF4XSA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMKKyAgICAgICAgICAuYVJ2bGNTY2ZCd2RbcFJ2bGMtPmNvbmNlYWxfbWF4XTsKKyAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAuYVJ2bGNTY2ZCd2RbcFJ2bGMtPmNvbmNlYWxfbWluXSA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMKKyAgICAgICAgICAuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWluXTsKIAotICAvKiBjb25zaWRlciB0aGUgc21hbGxlciBvZiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RlZCB2YWx1ZSBhcyB0aGUgY29ycmVjdCBvbmUgKi8KLSAgc3RhcnRCYW5kID0gY29uY2VhbF9taW47ICAgIAotICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gY29uY2VhbF9ncm91cF9tYXgpIAotICAgIGVuZEJhbmQgPSBjb25jZWFsX21heDsgICAgCi0gIGVsc2UgICAgICAgIAotICAgIGVuZEJhbmQgPSBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQtMTsgICAgIAorICAvKiBjb25zaWRlciB0aGUgc21hbGxlciBvZiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RlZCB2YWx1ZSBhcyB0aGUKKyAgICogY29ycmVjdCBvbmUgKi8KKyAgc3RhcnRCYW5kID0gY29uY2VhbF9taW47CisgIGlmIChjb25jZWFsX2dyb3VwX21pbiA9PSBjb25jZWFsX2dyb3VwX21heCkKKyAgICBlbmRCYW5kID0gY29uY2VhbF9tYXg7CisgIGVsc2UKKyAgICBlbmRCYW5kID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkIC0gMTsKIAotICBmb3IgKGdyb3VwPWNvbmNlYWxfZ3JvdXBfbWluOyBncm91cCA8PSBjb25jZWFsX2dyb3VwX21heDsgZ3JvdXArKykgewotICAgIGZvciAoYmFuZD1zdGFydEJhbmQ7IGJhbmQgPD0gZW5kQmFuZDsgYmFuZCsrKSB7Ci0gICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKKyAgZm9yIChncm91cCA9IGNvbmNlYWxfZ3JvdXBfbWluOyBncm91cCA8PSBjb25jZWFsX2dyb3VwX21heDsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8PSBlbmRCYW5kOyBiYW5kKyspIHsKKyAgICAgIGJuZHMgPSAxNiAqIGdyb3VwICsgYmFuZDsKICAgICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSkgewogICAgICAgICBjYXNlIFpFUk9fSENCOgogICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSAwOwpAQCAtNDQ5LDYyICs0ODksOTIgQEAKIAogICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6CiAgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6Ci0gICAgICAgICAgaWYgKCAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXT09SU5URU5TSVRZX0hDQikgfHwgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc109PUlOVEVOU0lUWV9IQ0IyKSApIHsKLSAgICAgICAgICAgIGNvbW1vbk1pbiA9IEZES21pbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10scEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKTsKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBGREttaW4oY29tbW9uTWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgIGlmICgocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCKSB8fAorICAgICAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCMikpIHsKKyAgICAgICAgICAgIGNvbW1vbk1pbiA9IGZNaW4oCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgICAgICAgICAgICAgICAuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgICAgZk1pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBmTWluKAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMKKyAgICAgICAgICAgICAgICAgICAgLmFSdmxjU2NmQndkW2JuZHNdKTsKICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBOT0lTRV9IQ0I6Ci0gICAgICAgICAgaWYgKCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdPT1OT0lTRV9IQ0IgKSB7Ci0gICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7Ci0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CisgICAgICAgICAgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSA9PSBOT0lTRV9IQ0IpIHsKKyAgICAgICAgICAgIGNvbW1vbk1pbiA9IGZNaW4oCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgICAgICAgICAgICAgICAuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgICAgZk1pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gZk1pbigKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10sCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgICAgICAgICAgICAgIC5hUnZsY1NjZkJ3ZFtibmRzXSk7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaWYgKCAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1aRVJPX0hDQikKLSAgICAgICAgICAgICAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10hPU5PSVNFX0hDQikKLSAgICAgICAgICAgICAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10hPUlOVEVOU0lUWV9IQ0IpIAotICAgICAgICAgICAgICAmJiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSE9SU5URU5TSVRZX0hDQjIpICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pOwotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IEZES21pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbYm5kc10pOworICAgICAgICAgIGlmICgocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSAhPSBaRVJPX0hDQikgJiYKKyAgICAgICAgICAgICAgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gIT0gTk9JU0VfSENCKSAmJgorICAgICAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSAhPSBJTlRFTlNJVFlfSENCKSAmJgorICAgICAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSAhPSBJTlRFTlNJVFlfSENCMikpIHsKKyAgICAgICAgICAgIGNvbW1vbk1pbiA9IGZNaW4oCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgICAgICAgICAgICAgICAuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgICAgZk1pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gZk1pbigKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10sCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgICAgICAgICAgICAgIC5hUnZsY1NjZkJ3ZFtibmRzXSk7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KLSAgICBzdGFydEJhbmQgPSAwOyAKLSAgICBpZiAoKGdyb3VwKzEpID09IGNvbmNlYWxfZ3JvdXBfbWF4KQotICAgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWF4OworICAgIHN0YXJ0QmFuZCA9IDA7CisgICAgaWYgKChncm91cCArIDEpID09IGNvbmNlYWxfZ3JvdXBfbWF4KSBlbmRCYW5kID0gY29uY2VhbF9tYXg7CiAgIH0KIAogICAvKiBub3cgY29weSBhbGwgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlciB3aGljaCBuZWVkcyBub3QgdG8gYmUgY29uY2VhbGVkICovCi0gIGlmIChjb25jZWFsX2dyb3VwX21pbiA9PSAwKSAKLSAgICBlbmRCYW5kID0gY29uY2VhbF9taW47ICAgIAotICBlbHNlICAgICAgICAKLSAgICBlbmRCYW5kID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyAgICAgCi0gIGZvciAoZ3JvdXA9MDsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9taW47IGdyb3VwKyspIHsKLSAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IGVuZEJhbmQ7IGJhbmQrKykgewotICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7Ci0gICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gMCkKKyAgICBlbmRCYW5kID0gY29uY2VhbF9taW47CisgIGVsc2UKKyAgICBlbmRCYW5kID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9taW47IGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgZW5kQmFuZDsgYmFuZCsrKSB7CisgICAgICBibmRzID0gMTYgKiBncm91cCArIGJhbmQ7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CiAgICAgfQotICAgIGlmICgoZ3JvdXArMSkgPT0gY29uY2VhbF9ncm91cF9taW4pIAotICAgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWluOyAgICAKKyAgICBpZiAoKGdyb3VwICsgMSkgPT0gY29uY2VhbF9ncm91cF9taW4pIGVuZEJhbmQgPSBjb25jZWFsX21pbjsKICAgfQogCi0gIHN0YXJ0QmFuZCA9IGNvbmNlYWxfbWF4KzE7ICAgIAotICBmb3IgKGdyb3VwPWNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKLSAgICBmb3IgKGJhbmQ9c3RhcnRCYW5kOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKLSAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwotICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgc3RhcnRCYW5kID0gY29uY2VhbF9tYXggKyAxOworICBmb3IgKGdyb3VwID0gY29uY2VhbF9ncm91cF9tYXg7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICBibmRzID0gMTYgKiBncm91cCArIGJhbmQ7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CiAgICAgfQogICAgIHN0YXJ0QmFuZCA9IDA7CiAgIH0KQEAgLTUxMyw4MSArNTgzLDgyIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBmdW5jdGlvbjogICAgICBTdGF0aXN0aWNhbEVzdGltYXRpb24KIAotICBkZXNjcmlwdGlvbjogICBUaGlzIGFwcHJvYWNoIGJ5IG1lYW5zIG9mIHN0YXRpc3RpY2FsIGVzdGltYXRpb24gaXMgZ2VuZXJhbGx5IHBlcmZvcm1lZCB3aGVuIAotICAgICAgICAgICAgICAgICBib3RoIHRoZSBzdGFydCB2YWx1ZSBhbmQgdGhlIGVuZCB2YWx1ZSBhcmUgZGlmZmVyZW50IGFuZCBubyBmdXJ0aGVyIGVycm9ycyBoYXZlIAotICAgICAgICAgICAgICAgICBiZWVuIGRldGVjdGVkLiBDb25zaWRlcmluZyB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RlZCBzY2FsZWZhY3RvcnMsIHRoZSAKLSAgICAgICAgICAgICAgICAgc2V0IHdpdGggdGhlIGxvd2VyIHNjYWxlZmFjdG9ycyBpbiBzdW0gd2lsbCBiZSBjb25zaWRlcmVkIGFzIHRoZSBjb3JyZWN0IG9uZS4gCi0gICAgICAgICAgICAgICAgIFRoZSBzY2FsZWZhY3RvcnMgYXJlIGRpZmZlcmVudGlhbGx5IGVuY29kZWQuIE5vcm1hbGx5IGl0IHdvdWxkIHJlYWNoIHRvIGNvbXBhcmUgCi0gICAgICAgICAgICAgICAgIG9uZSBwYWlyIG9mIHRoZSBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkZWNvZGVkIHNjYWxlZmFjdG9ycyB0byBzcGVjaWZ5IHRoZSBsb3dlciAKLSAgICAgICAgICAgICAgICAgc2V0LiBCdXQgaGF2aW5nIGRldGVjdGVkIG5vIGZ1cnRoZXIgZXJyb3JzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhlIGFic2VuY2UKLSAgICAgICAgICAgICAgICAgb2YgZXJyb3JzLiBUaGVyZWZvcmUgYWxsIHNjYWxlZmFjdG9ycyBkZWNvZGVkIGluIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRpcmVjdGlvbiAKLSAgICAgICAgICAgICAgICAgYXJlIHN1bW1lZCB1cCBzZXBlcmF0ZWx5LiBUaGUgc2V0IHdpdGggdGhlIGxvd2VyIHN1bSB3aWxsIGJlIHVzZWQuIFRoZSBzdHJhdGVneSAKLSAgICAgICAgICAgICAgICAgbXVzdCBiZSBhcHBsaWVkIHRvIHNjYWxlZmFjdG9ycywgaW50ZW5zaXR5IGRhdGEgYW5kIG5vaXNlIGVuZXJneSBzZXBlcmF0ZWx5LgorICBkZXNjcmlwdGlvbjogICBUaGlzIGFwcHJvYWNoIGJ5IG1lYW5zIG9mIHN0YXRpc3RpY2FsIGVzdGltYXRpb24gaXMgZ2VuZXJhbGx5CitwZXJmb3JtZWQgd2hlbiBib3RoIHRoZSBzdGFydCB2YWx1ZSBhbmQgdGhlIGVuZCB2YWx1ZSBhcmUgZGlmZmVyZW50IGFuZCBubworZnVydGhlciBlcnJvcnMgaGF2ZSBiZWVuIGRldGVjdGVkLiBDb25zaWRlcmluZyB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RlZAorc2NhbGVmYWN0b3JzLCB0aGUgc2V0IHdpdGggdGhlIGxvd2VyIHNjYWxlZmFjdG9ycyBpbiBzdW0gd2lsbCBiZSBjb25zaWRlcmVkIGFzCit0aGUgY29ycmVjdCBvbmUuIFRoZSBzY2FsZWZhY3RvcnMgYXJlIGRpZmZlcmVudGlhbGx5IGVuY29kZWQuIE5vcm1hbGx5IGl0IHdvdWxkCityZWFjaCB0byBjb21wYXJlIG9uZSBwYWlyIG9mIHRoZSBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkZWNvZGVkIHNjYWxlZmFjdG9ycyB0bworc3BlY2lmeSB0aGUgbG93ZXIgc2V0LiBCdXQgaGF2aW5nIGRldGVjdGVkIG5vIGZ1cnRoZXIgZXJyb3JzIGRvZXMgbm90CituZWNlc3NhcmlseSBtZWFuIHRoZSBhYnNlbmNlIG9mIGVycm9ycy4gVGhlcmVmb3JlIGFsbCBzY2FsZWZhY3RvcnMgZGVjb2RlZCBpbgorZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9uIGFyZSBzdW1tZWQgdXAgc2VwZXJhdGVseS4gVGhlIHNldCB3aXRoIHRoZSBsb3dlcgorc3VtIHdpbGwgYmUgdXNlZC4gVGhlIHN0cmF0ZWd5IG11c3QgYmUgYXBwbGllZCB0byBzY2FsZWZhY3RvcnMsIGludGVuc2l0eSBkYXRhCithbmQgbm9pc2UgZW5lcmd5IHNlcGVyYXRlbHkuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBvdXRwdXQ6ICAgICAgICBDb25jZWFsZWQgc2NhbGVmYWN0b3IsIG5vaXNlIGVuZXJneSBhbmQgaW50ZW5zaXR5IGRhdGEKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHJldHVybjogICAgICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotdm9pZCBTdGF0aXN0aWNhbEVzdGltYXRpb24gKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pCi17Ci0gIENFclJ2bGNJbmZvICpwUnZsYyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKLSAgaW50IGJhbmQsYm5kcyxncm91cDsKLSAgaW50IHN1bUlzRndkLHN1bUlzQndkOyAgICAgICAgICAgIC8qIHN1bSBvZiBpbnRlbnNpdHkgZGF0YSBmb3J3YXJkL2JhY2t3YXJkICovCi0gIGludCBzdW1OcmdGd2Qsc3VtTnJnQndkOyAgICAgICAgICAvKiBzdW0gb2Ygbm9pc2UgZW5lcmd5IGRhdGEgZm9yd2FyZC9iYWNrd2FyZCAqLwotICBpbnQgc3VtU2NmRndkLHN1bVNjZkJ3ZDsgICAgICAgICAgLyogc3VtIG9mIHNjYWxlZmFjdG9yIGRhdGEgZm9yd2FyZC9iYWNrd2FyZCAqLwotICBpbnQgdXNlSXNGd2QsdXNlTnJnRndkLHVzZVNjZkZ3ZDsgLyogdGhlIGZsYWdzIHNpZ25hbHMgdGhlIGVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIGZvciB0aGUgZmluYWwgcmVzdWx0ICovCi0gIGludCBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKLQotICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkKLSAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDE2OwotICBlbHNlCi0gICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSA2NDsKK3ZvaWQgU3RhdGlzdGljYWxFc3RpbWF0aW9uKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pIHsKKyAgQ0VyUnZsY0luZm8gKnBSdmxjID0KKyAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKKyAgaW50IGJhbmQsIGJuZHMsIGdyb3VwOworICBpbnQgc3VtSXNGd2QsIHN1bUlzQndkOyAgIC8qIHN1bSBvZiBpbnRlbnNpdHkgZGF0YSBmb3J3YXJkL2JhY2t3YXJkICovCisgIGludCBzdW1OcmdGd2QsIHN1bU5yZ0J3ZDsgLyogc3VtIG9mIG5vaXNlIGVuZXJneSBkYXRhIGZvcndhcmQvYmFja3dhcmQgKi8KKyAgaW50IHN1bVNjZkZ3ZCwgc3VtU2NmQndkOyAvKiBzdW0gb2Ygc2NhbGVmYWN0b3IgZGF0YSBmb3J3YXJkL2JhY2t3YXJkICovCisgIGludCB1c2VJc0Z3ZCwgdXNlTnJnRndkLCB1c2VTY2ZGd2Q7IC8qIHRoZSBmbGFncyBzaWduYWxzIHRoZSBlbGVtZW50cyB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgdXNlZCBmb3IgdGhlIGZpbmFsIHJlc3VsdCAqLwogCiAgIHN1bUlzRndkID0gc3VtSXNCd2QgPSBzdW1OcmdGd2QgPSBzdW1OcmdCd2QgPSBzdW1TY2ZGd2QgPSBzdW1TY2ZCd2QgPSAwOwogICB1c2VJc0Z3ZCA9IHVzZU5yZ0Z3ZCA9IHVzZVNjZkZ3ZCA9IDA7CiAKLSAgLyogY2FsY3VsYXRlIHN1bSBvZiBlYWNoIGdyb3VwIChzY2YsbnJnLGlzKSBvZiBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkaXJlY3Rpb24gKi8KLSAgZm9yIChncm91cD0wOyBncm91cDxwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7Ci0gICAgZm9yIChiYW5kPTA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewotICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7CisgIC8qIGNhbGN1bGF0ZSBzdW0gb2YgZWFjaCBncm91cCAoc2NmLG5yZyxpcykgb2YgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9uCisgICAqLworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICBibmRzID0gMTYgKiBncm91cCArIGJhbmQ7CiAgICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKICAgICAgICAgY2FzZSBaRVJPX0hDQjoKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6CiAgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6Ci0gICAgICAgICAgc3VtSXNGd2QgKz0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwotICAgICAgICAgIHN1bUlzQndkICs9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgICAgICBzdW1Jc0Z3ZCArPQorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgICAgICAgc3VtSXNCd2QgKz0KKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgTk9JU0VfSENCOgotICAgICAgICAgIHN1bU5yZ0Z3ZCArPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107Ci0gICAgICAgICAgc3VtTnJnQndkICs9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKLSAgICAgICAgICBicmVhayA7CisgICAgICAgICAgc3VtTnJnRndkICs9CisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgICAgICAgICBzdW1OcmdCd2QgKz0KKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOworICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgc3VtU2NmRndkICs9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKLSAgICAgICAgICBzdW1TY2ZCd2QgKz0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOworICAgICAgICAgIHN1bVNjZkZ3ZCArPQorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgICAgICAgc3VtU2NmQndkICs9CisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICAvKiBmaW5kIGZvciBlYWNoIGdyb3VwIChzY2YsbnJnLGlzKSB0aGUgY29ycmVjdCBkaXJlY3Rpb24gKi8KLSAgaWYgKCBzdW1Jc0Z3ZCA8IHN1bUlzQndkICkKLSAgICB1c2VJc0Z3ZCA9IDE7CisgIGlmIChzdW1Jc0Z3ZCA8IHN1bUlzQndkKSB1c2VJc0Z3ZCA9IDE7CiAKLSAgaWYgKCBzdW1OcmdGd2QgPCBzdW1OcmdCd2QgKQotICAgIHVzZU5yZ0Z3ZCA9IDE7CisgIGlmIChzdW1OcmdGd2QgPCBzdW1OcmdCd2QpIHVzZU5yZ0Z3ZCA9IDE7CiAKLSAgaWYgKCBzdW1TY2ZGd2QgPCBzdW1TY2ZCd2QgKQotICAgIHVzZVNjZkZ3ZCA9IDE7CisgIGlmIChzdW1TY2ZGd2QgPCBzdW1TY2ZCd2QpIHVzZVNjZkZ3ZCA9IDE7CiAKICAgLyogY29uY2VhbCBlYWNoIGdyb3VwIChzY2YsbnJnLGlzKSAqLwotICBmb3IgKGdyb3VwPTA7IGdyb3VwPHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKLSAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7Ci0gICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKKyAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOwogICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CiAgICAgICAgIGNhc2UgWkVST19IQ0I6CiAgICAgICAgICAgYnJlYWs7CkBAIC01OTUsNjMgKzY2Niw2MyBAQAogICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6CiAgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6CiAgICAgICAgICAgaWYgKHVzZUlzRndkKQotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgTk9JU0VfSENCOgogICAgICAgICAgIGlmICh1c2VOcmdGd2QpCi0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwogICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107Ci0gICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOworICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgaWYgKHVzZVNjZkZ3ZCkKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CiAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBkZXNjcmlwdGlvbjogICBBcHByb2FjaCBieSBtZWFucyBvZiBwcmVkaWN0aXZlIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBieSBtZWFucyBvZiBwcmVkaWN0aXZlIGVzdGltYXRpb24gaXMgZ2VuZXJhbGx5IHBlcmZvcm1lZCB3aGVuIAotICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgY2Fubm90IGJlIGlzb2xhdGVkIGJldHdlZW4gJ2NvbmNlYWxfbWluJyBhbmQgJ2NvbmNlYWxfbWF4JywgdGhlIAotICAgICAgICAgICAgICAgICAnc2ZfY29uY2VhbG1lbnQnIGZsYWcgaXMgc2V0IGFuZCB0aGUgcHJldmlvdXMgZnJhbWUgaGFzIHRoZSBzYW1lIGJsb2NrIHR5cGUgCi0gICAgICAgICAgICAgICAgIGFzIHRoZSBjdXJyZW50IGZyYW1lLiBDaGVjayBmb3IgZWFjaCBzY2FsZWZhY3RvcmJhbmQgaWYgdGhlIHNhbWUgdHlwZSBvZiBkYXRhIAotICAgICAgICAgICAgICAgICAoc2NhbGVmYWN0b3IsIGludGVybnNpdHkgZGF0YSwgbm9pc2UgZW5lcmdpZXMpIGlzIHRyYW5zbWl0dGVkLiBJZiBzbyB1c2UgdGhlIAotICAgICAgICAgICAgICAgICBzY2FsZWZhY3RvciAoaW50ZW5zaXR5IGRhdGEsIG5vaXNlIGVuZXJneSkgaW4gdGhlIGN1cnJlbnQgZnJhbWUuIE90aGVyd2lzZSBzZXQgCi0gICAgICAgICAgICAgICAgIHRoZSBzY2FsZWZhY3RvciAoaW50ZW5zaXR5IGRhdGEsIG5vaXNlIGVuZXJneSkgZm9yIHRoaXMgc2NhbGVmYWN0b3JiYW5kIHRvIHplcm8uCisgICAgICAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggYnkgbWVhbnMgb2YgcHJlZGljdGl2ZSBlc3RpbWF0aW9uIGlzIGdlbmVyYWxseQorcGVyZm9ybWVkIHdoZW4gdGhlIGVycm9yIGNhbm5vdCBiZSBpc29sYXRlZCBiZXR3ZWVuICdjb25jZWFsX21pbicgYW5kCisnY29uY2VhbF9tYXgnLCB0aGUgJ3NmX2NvbmNlYWxtZW50JyBmbGFnIGlzIHNldCBhbmQgdGhlIHByZXZpb3VzIGZyYW1lIGhhcyB0aGUKK3NhbWUgYmxvY2sgdHlwZSBhcyB0aGUgY3VycmVudCBmcmFtZS4gQ2hlY2sgZm9yIGVhY2ggc2NhbGVmYWN0b3JiYW5kIGlmIHRoZSBzYW1lCit0eXBlIG9mIGRhdGEgKHNjYWxlZmFjdG9yLCBpbnRlcm5zaXR5IGRhdGEsIG5vaXNlIGVuZXJnaWVzKSBpcyB0cmFuc21pdHRlZC4gSWYKK3NvIHVzZSB0aGUgc2NhbGVmYWN0b3IgKGludGVuc2l0eSBkYXRhLCBub2lzZSBlbmVyZ3kpIGluIHRoZSBjdXJyZW50IGZyYW1lLgorT3RoZXJ3aXNlIHNldCB0aGUgc2NhbGVmYWN0b3IgKGludGVuc2l0eSBkYXRhLCBub2lzZSBlbmVyZ3kpIGZvciB0aGlzCitzY2FsZWZhY3RvcmJhbmQgdG8gemVyby4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIG91dHB1dDogICAgICAgIENvbmNlYWxlZCBzY2FsZWZhY3Rvciwgbm9pc2UgZW5lcmd5IGFuZCBpbnRlbnNpdHkgZGF0YQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgcmV0dXJuOiAgICAgICAgLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi12b2lkIFByZWRpY3RpdmVJbnRlcnBvbGF0aW9uICgKLSAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbwotICAgICAgICApCi17Ci0gIENFclJ2bGNJbmZvICpwUnZsYyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKLSAgaW50IGJhbmQsYm5kcyxncm91cDsKLSAgaW50IE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwotICBpbnQgY29tbW9uTWluOwordm9pZCBQcmVkaWN0aXZlSW50ZXJwb2xhdGlvbigKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pIHsKKyAgQ0VyUnZsY0luZm8gKnBSdmxjID0KKyAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKKyAgaW50IGJhbmQsIGJuZHMsIGdyb3VwOworICBTSE9SVCBjb21tb25NaW47CiAKLSAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBFaWdodFNob3J0U2VxdWVuY2UpCi0gICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSAxNjsKLSAgZWxzZQotICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gNjQ7Ci0KLSAgZm9yIChncm91cD0wOyBncm91cDxwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7Ci0gICAgZm9yIChiYW5kPTA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewotICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7CisgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgIGJuZHMgPSAxNiAqIGdyb3VwICsgYmFuZDsKICAgICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSkgewogICAgICAgICBjYXNlIFpFUk9fSENCOgogICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSAwOwpAQCAtNjU5LDM0ICs3MzAsNTQgQEAKIAogICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6CiAgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6Ci0gICAgICAgICAgaWYgKCAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXT09SU5URU5TSVRZX0hDQikgfHwgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc109PUlOVEVOU0lUWV9IQ0IyKSApIHsKLSAgICAgICAgICAgIGNvbW1vbk1pbiA9IEZES21pbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10scEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKTsKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBGREttaW4oY29tbW9uTWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYgKChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdID09IElOVEVOU0lUWV9IQ0IpIHx8CisgICAgICAgICAgICAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdID09IElOVEVOU0lUWV9IQ0IyKSkgeworICAgICAgICAgICAgY29tbW9uTWluID0gZk1pbigKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10sCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgICAgICAgICAgICAgIC5hUnZsY1NjZkJ3ZFtibmRzXSk7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICAgICAgICBmTWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdKTsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IC0xMTA7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgTk9JU0VfSENCOgotICAgICAgICAgIGlmICggcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXT09Tk9JU0VfSENCICkgewotICAgICAgICAgICAgY29tbW9uTWluID0gRkRLbWluKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pOwotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IEZES21pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbYm5kc10pOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdID09IE5PSVNFX0hDQikgeworICAgICAgICAgICAgY29tbW9uTWluID0gZk1pbigKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10sCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgICAgICAgICAgICAgIC5hUnZsY1NjZkJ3ZFtibmRzXSk7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICAgICAgICBmTWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdKTsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IC0xMTA7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaWYgKCAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1aRVJPX0hDQikKLSAgICAgICAgICAgICAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10hPU5PSVNFX0hDQikgCi0gICAgICAgICAgICAgICYmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1JTlRFTlNJVFlfSENCKSAKLSAgICAgICAgICAgICAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10hPUlOVEVOU0lUWV9IQ0IyKSApIHsKLSAgICAgICAgICAgIGNvbW1vbk1pbiA9IEZES21pbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10scEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKTsKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBGREttaW4oY29tbW9uTWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYgKChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdICE9IFpFUk9fSENCKSAmJgorICAgICAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSAhPSBOT0lTRV9IQ0IpICYmCisgICAgICAgICAgICAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdICE9IElOVEVOU0lUWV9IQ0IpICYmCisgICAgICAgICAgICAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdICE9IElOVEVOU0lUWV9IQ0IyKSkgeworICAgICAgICAgICAgY29tbW9uTWluID0gZk1pbigKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10sCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgICAgICAgICAgICAgIC5hUnZsY1NjZkJ3ZFtibmRzXSk7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICAgICAgICBmTWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdKTsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IDA7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwpAQCAtNjk0LDQgKzc4NSwzIEBACiAgICAgfQogICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvcnZsY2NvbmNlYWwuaCBiL2xpYkFBQ2RlYy9zcmMvcnZsY2NvbmNlYWwuaAppbmRleCA3NTBjYmNkLi44ZTIwNjJlIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL3J2bGNjb25jZWFsLmgKKysrIGIvbGliQUFDZGVjL3NyYy9ydmxjY29uY2VhbC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDcgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCkBAIC05MCwyMyArMTA5LDE5IEBACiAjaWZuZGVmIFJWTENDT05DRUFMX0gKICNkZWZpbmUgUlZMQ0NPTkNFQUxfSAogCi0KLQogI2luY2x1ZGUgInJ2bGMuaCIKIAotdm9pZCBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VMb3dlclNjZk9mQ3VycmVudEZyYW1lKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOwordm9pZCBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VMb3dlclNjZk9mQ3VycmVudEZyYW1lKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOwogCiB2b2lkIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZVNjZk9mUHJldkZyYW1lQXNSZWZlcmVuY2UoCi0gICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8KLSAgICAgICAgKTsKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pOwogCi12b2lkIFN0YXRpc3RpY2FsRXN0aW1hdGlvbiAoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbyk7Cit2b2lkIFN0YXRpc3RpY2FsRXN0aW1hdGlvbihDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKIAotdm9pZCBQcmVkaWN0aXZlSW50ZXJwb2xhdGlvbiAoCi0gICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8KLSAgICAgICAgKTsKLQordm9pZCBQcmVkaWN0aXZlSW50ZXJwb2xhdGlvbigKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pOwogCiAjZW5kaWYgLyogUlZMQ0NPTkNFQUxfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9zdGVyZW8uY3BwIGIvbGliQUFDZGVjL3NyYy9zdGVyZW8uY3BwCmluZGV4IDRmMjgyNDQuLmVlZDgyNmIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvc3RlcmVvLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL3N0ZXJlby5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjE2ICs5MCwxMTU4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBqb2ludCBzdGVyZW8gcHJvY2Vzc2luZwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAic3RlcmVvLmgiCiAKLQogI2luY2x1ZGUgImFhY19yb20uaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAjaW5jbHVkZSAiY2hhbm5lbGluZm8uaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKIAotZW51bQotewotICBMID0gMCwKLSAgUiA9IDEKLX07CitlbnVtIHsgTCA9IDAsIFIgPSAxIH07CiAKKyNpbmNsdWRlICJibG9jay5oIgogCi1pbnQgQ0pvaW50U3RlcmVvX1JlYWQoCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICBDSm9pbnRTdGVyZW9EYXRhICpwSm9pbnRTdGVyZW9EYXRhLAotICAgICAgICBjb25zdCBpbnQgd2luZG93R3JvdXBzLAotICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkLAotICAgICAgICBjb25zdCBVSU5UIGZsYWdzCi0gICAgICAgICkKLXsKLSAgaW50IGdyb3VwLGJhbmQ7CitpbnQgQ0pvaW50U3RlcmVvX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgQ0pvaW50U3RlcmVvRGF0YSAqcEpvaW50U3RlcmVvRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgd2luZG93R3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG1heF9zZmJfc3RlX2NsZWFyLAorICAgICAgICAgICAgICAgICAgICAgIENKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhICpwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBDQ3BseFByZWRpY3Rpb25EYXRhICpjcGx4UHJlZGljdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGNwbHhQcmVkaWN0aW9uQWN0aXYsIGludCBzY2FsZUZhY3RvckJhbmRzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd1NlcXVlbmNlLCBjb25zdCBVSU5UIGZsYWdzKSB7CisgIGludCBncm91cCwgYmFuZDsKIAotICBwSm9pbnRTdGVyZW9EYXRhLT5Nc01hc2tQcmVzZW50ID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKKyAgcEpvaW50U3RlcmVvRGF0YS0+TXNNYXNrUHJlc2VudCA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMik7CiAKLSAgRkRLbWVtY2xlYXIocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkLCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQqc2l6ZW9mKFVDSEFSKSk7CisgIEZES21lbWNsZWFyKHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZCwKKyAgICAgICAgICAgICAgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkICogc2l6ZW9mKFVDSEFSKSk7CiAKLSAgc3dpdGNoIChwSm9pbnRTdGVyZW9EYXRhLT5Nc01hc2tQcmVzZW50KQotICB7Ci0gICAgY2FzZSAwIDogLyogbm8gTS9TICovCisgIHBKb2ludFN0ZXJlb0RhdGEtPmNwbHhfcHJlZF9mbGFnID0gMDsKKyAgaWYgKGNwbHhQcmVkaWN0aW9uQWN0aXYpIHsKKyAgICBjcGx4UHJlZGljdGlvbkRhdGEtPnByZWRfZGlyID0gMDsKKyAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmNvbXBsZXhfY29lZiA9IDA7CisgICAgY3BseFByZWRpY3Rpb25EYXRhLT51c2VfcHJldl9mcmFtZSA9IDA7CisgICAgY3BseFByZWRpY3Rpb25EYXRhLT5pZ2ZfcHJlZF9kaXIgPSAwOworICB9CisKKyAgc3dpdGNoIChwSm9pbnRTdGVyZW9EYXRhLT5Nc01hc2tQcmVzZW50KSB7CisgICAgY2FzZSAwOiAvKiBubyBNL1MgKi8KICAgICAgIC8qIGFsbCBmbGFncyBhcmUgYWxyZWFkeSBjbGVhcmVkICovCi0gICAgICBicmVhayA7CisgICAgICBicmVhazsKIAotICAgIGNhc2UgMSA6IC8qIHJlYWQgbXNfdXNlZCAqLwotCi0gICAgICBmb3IgKGdyb3VwPTA7IGdyb3VwPHdpbmRvd0dyb3VwczsgZ3JvdXArKykKLSAgICAgIHsKLSAgICAgICAgZm9yIChiYW5kPTA7IGJhbmQ8c2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspCi0gICAgICAgIHsKLSAgICAgICAgICBwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gfD0gKEZES3JlYWRCaXRzKGJzLDEpIDw8IGdyb3VwKTsKKyAgICBjYXNlIDE6IC8qIHJlYWQgbXNfdXNlZCAqLworICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgd2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgICAgIHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSB8PSAoRkRLcmVhZEJpdHMoYnMsIDEpIDw8IGdyb3VwKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgYnJlYWsgOworICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIDIgOiAvKiBmdWxsIHNwZWN0cnVtIE0vUyAqLwotCi0gICAgICBmb3IgKGJhbmQ9MDsgYmFuZDxzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykKLSAgICAgIHsKLSAgICAgICAgcEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdID0gMjU1IDsgIC8qIHNldCBhbGwgZmxhZ3MgdG8gMSAqLworICAgIGNhc2UgMjogLyogZnVsbCBzcGVjdHJ1bSBNL1MgKi8KKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgICBwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gPSAyNTU7IC8qIHNldCBhbGwgZmxhZ3MgdG8gMSAqLwogICAgICAgfQotICAgICAgYnJlYWsgOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDM6CisgICAgICAvKiBNL1MgY29kaW5nIGlzIGRpc2FibGVkLCBjb21wbGV4IHN0ZXJlbyBwcmVkaWN0aW9uIGlzIGVuYWJsZWQgKi8KKyAgICAgIGlmIChmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpKSB7CisgICAgICAgIGlmIChjcGx4UHJlZGljdGlvbkFjdGl2KSB7IC8qICdpZiAoc3RlcmVvQ29uZmlnSW5kZXggPT0gMCknICovCisKKyAgICAgICAgICBwSm9pbnRTdGVyZW9EYXRhLT5jcGx4X3ByZWRfZmxhZyA9IDE7CisKKyAgICAgICAgICAvKiBjcGx4X3ByZWRfZGF0YSgpICBjcC4gSVNPL0lFQyBGRElTIDIzMDAzLTM6MjAxMShFKSAgVGFibGUgMjYgKi8KKyAgICAgICAgICBpbnQgY3BseF9wcmVkX2FsbCA9IDA7IC8qIGxvY2FsIHVzZSBvbmx5ICovCisgICAgICAgICAgY3BseF9wcmVkX2FsbCA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKworICAgICAgICAgIGlmIChjcGx4X3ByZWRfYWxsKSB7CisgICAgICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCB3aW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICAgICAgICAgICAgVUNIQVIgZ3JvdXBtYXNrID0gKChVQ0hBUikxIDw8IGdyb3VwKTsKKyAgICAgICAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICAgICAgICAgICAgcEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdIHw9IGdyb3VwbWFzazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCB3aW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICAgICAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsKKyAgICAgICAgICAgICAgICAgICBiYW5kICs9IFNGQl9QRVJfUFJFRF9CQU5EKSB7CisgICAgICAgICAgICAgICAgcEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdIHw9IChGREtyZWFkQml0cyhicywgMSkgPDwgZ3JvdXApOworICAgICAgICAgICAgICAgIGlmICgoYmFuZCArIDEpIDwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsKSB7CisgICAgICAgICAgICAgICAgICBwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZCArIDFdIHw9CisgICAgICAgICAgICAgICAgICAgICAgKHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSAmICgoVUNIQVIpMSA8PCBncm91cCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGNwbHhQcmVkaWN0aW9uQWN0aXYpIHsKKyAgICAvKiBJZiBhbGwgc2ZiIGFyZSBNUy1lZCB0aGVuIG5vIGNvbXBsZXggcHJlZGljdGlvbiAqLworICAgIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5Nc01hc2tQcmVzZW50ID09IDMpIHsKKyAgICAgIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5jcGx4X3ByZWRfZmxhZykgeworICAgICAgICBpbnQgZGVsdGFfY29kZV90aW1lID0gMDsKKworICAgICAgICAvKiBzZXQgcG9pbnRlciB0byBIdWZmbWFuIGNvZGVib29rcyAqLworICAgICAgICBjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uICpoY2IgPSAmQUFDY29kZUJvb2tEZXNjcmlwdGlvblRhYmxlW0JPT0tTQ0xdOworICAgICAgICAvKiBzZXQgcHJlZGljdG9ycyB0byB6ZXJvIGluIGNhc2Ugb2YgYSB0cmFuc2l0aW9uIGZyb20gbG9uZyB0byBzaG9ydAorICAgICAgICAgKiB3aW5kb3cgc2VxdWVuY2VzIGFuZCB2aWNlIHZlcnNhICovCisgICAgICAgIGlmICgoKHdpbmRvd1NlcXVlbmNlID09IEJMT0NLX1NIT1JUKSAmJgorICAgICAgICAgICAgIChwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+d2luU2VxUHJldiAhPSBCTE9DS19TSE9SVCkpIHx8CisgICAgICAgICAgICAoKHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT53aW5TZXFQcmV2ID09IEJMT0NLX1NIT1JUKSAmJgorICAgICAgICAgICAgICh3aW5kb3dTZXF1ZW5jZSAhPSBCTE9DS19TSE9SVCkpKSB7CisgICAgICAgICAgRkRLbWVtY2xlYXIocEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPmFscGhhX3FfcmVfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICBKb2ludFN0ZXJlb01heGltdW1Hcm91cHMgKiBKb2ludFN0ZXJlb01heGltdW1CYW5kcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTSE9SVCkpOworICAgICAgICAgIEZES21lbWNsZWFyKHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX2ltX3ByZXYsCisgICAgICAgICAgICAgICAgICAgICAgSm9pbnRTdGVyZW9NYXhpbXVtR3JvdXBzICogSm9pbnRTdGVyZW9NYXhpbXVtQmFuZHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU0hPUlQpKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgRkRLbWVtY2xlYXIoY3BseFByZWRpY3Rpb25EYXRhLT5hbHBoYV9xX3JlLAorICAgICAgICAgICAgICAgICAgICAgIEpvaW50U3RlcmVvTWF4aW11bUdyb3VwcyAqIEpvaW50U3RlcmVvTWF4aW11bUJhbmRzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNIT1JUKSk7CisgICAgICAgICAgRkRLbWVtY2xlYXIoY3BseFByZWRpY3Rpb25EYXRhLT5hbHBoYV9xX2ltLAorICAgICAgICAgICAgICAgICAgICAgIEpvaW50U3RlcmVvTWF4aW11bUdyb3VwcyAqIEpvaW50U3RlcmVvTWF4aW11bUJhbmRzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNIT1JUKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiAwID0gbWlkLT5zaWRlIHByZWRpY3Rpb24sIDEgPSBzaWRlLT5taWQgcHJlZGljdGlvbiAqLworICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPnByZWRfZGlyID0gRkRLcmVhZEJpdHMoYnMsIDEpOworICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmNvbXBsZXhfY29lZiA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKworICAgICAgICBpZiAoY3BseFByZWRpY3Rpb25EYXRhLT5jb21wbGV4X2NvZWYpIHsKKyAgICAgICAgICBpZiAoZmxhZ3MgJiBBQ19JTkRFUCkgeworICAgICAgICAgICAgY3BseFByZWRpY3Rpb25EYXRhLT51c2VfcHJldl9mcmFtZSA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+dXNlX3ByZXZfZnJhbWUgPSBGREtyZWFkQml0cyhicywgMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYgQUNfSU5ERVApIHsKKyAgICAgICAgICBkZWx0YV9jb2RlX3RpbWUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlbHRhX2NvZGVfdGltZSA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgbGFzdF9hbHBoYV9xX3JlID0gMCwgbGFzdF9hbHBoYV9xX2ltID0gMDsKKworICAgICAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IHdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgICAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsKKyAgICAgICAgICAgICAgICAgYmFuZCArPSBTRkJfUEVSX1BSRURfQkFORCkgeworICAgICAgICAgICAgICBpZiAoZGVsdGFfY29kZV90aW1lID09IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgPiAwKSB7CisgICAgICAgICAgICAgICAgICBsYXN0X2FscGhhX3FfcmUgPQorICAgICAgICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9yZVtncm91cCAtIDFdW2JhbmRdOworICAgICAgICAgICAgICAgICAgbGFzdF9hbHBoYV9xX2ltID0KKyAgICAgICAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfaW1bZ3JvdXAgLSAxXVtiYW5kXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh3aW5kb3dTZXF1ZW5jZSA9PSBCTE9DS19TSE9SVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+d2luU2VxUHJldiA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NIT1JUKSkgeworICAgICAgICAgICAgICAgICAgLyogSW5jbHVkZWQgZm9yIGVycm9yLXJvYnVzdG5lc3MgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+d2luR3JvdXBzUHJldiA9PSAwKSByZXR1cm4gLTE7CisKKyAgICAgICAgICAgICAgICAgIGxhc3RfYWxwaGFfcV9yZSA9CisgICAgICAgICAgICAgICAgICAgICAgcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPmFscGhhX3FfcmVfcHJldgorICAgICAgICAgICAgICAgICAgICAgICAgICBbcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPndpbkdyb3Vwc1ByZXYgLSAxXVtiYW5kXTsKKyAgICAgICAgICAgICAgICAgIGxhc3RfYWxwaGFfcV9pbSA9CisgICAgICAgICAgICAgICAgICAgICAgcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPmFscGhhX3FfaW1fcHJldgorICAgICAgICAgICAgICAgICAgICAgICAgICBbcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPndpbkdyb3Vwc1ByZXYgLSAxXVtiYW5kXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgbGFzdF9hbHBoYV9xX3JlID0KKyAgICAgICAgICAgICAgICAgICAgICBwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+YWxwaGFfcV9yZV9wcmV2W2dyb3VwXVtiYW5kXTsKKyAgICAgICAgICAgICAgICAgIGxhc3RfYWxwaGFfcV9pbSA9CisgICAgICAgICAgICAgICAgICAgICAgcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPmFscGhhX3FfaW1fcHJldltncm91cF1bYmFuZF07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGJhbmQgPiAwKSB7CisgICAgICAgICAgICAgICAgICBsYXN0X2FscGhhX3FfcmUgPQorICAgICAgICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9yZVtncm91cF1bYmFuZCAtIDFdOworICAgICAgICAgICAgICAgICAgbGFzdF9hbHBoYV9xX2ltID0KKyAgICAgICAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfaW1bZ3JvdXBdW2JhbmQgLSAxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgbGFzdF9hbHBoYV9xX3JlID0gMDsKKyAgICAgICAgICAgICAgICAgIGxhc3RfYWxwaGFfcV9pbSA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIH0gLyogaWYgKGRlbHRhX2NvZGVfdGltZSA9PSAxKSAqLworCisgICAgICAgICAgICAgIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gJiAoKFVDSEFSKTEgPDwgZ3JvdXApKSB7CisgICAgICAgICAgICAgICAgaW50IGRwY21fYWxwaGFfcmUsIGRwY21fYWxwaGFfaW07CisKKyAgICAgICAgICAgICAgICBkcGNtX2FscGhhX3JlID0gQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkKGJzLCBoY2IpOworICAgICAgICAgICAgICAgIGRwY21fYWxwaGFfcmUgLT0gNjA7CisgICAgICAgICAgICAgICAgZHBjbV9hbHBoYV9yZSAqPSAtMTsKKworICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9yZVtncm91cF1bYmFuZF0gPQorICAgICAgICAgICAgICAgICAgICBkcGNtX2FscGhhX3JlICsgbGFzdF9hbHBoYV9xX3JlOworCisgICAgICAgICAgICAgICAgaWYgKGNwbHhQcmVkaWN0aW9uRGF0YS0+Y29tcGxleF9jb2VmKSB7CisgICAgICAgICAgICAgICAgICBkcGNtX2FscGhhX2ltID0gQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkKGJzLCBoY2IpOworICAgICAgICAgICAgICAgICAgZHBjbV9hbHBoYV9pbSAtPSA2MDsKKyAgICAgICAgICAgICAgICAgIGRwY21fYWxwaGFfaW0gKj0gLTE7CisKKyAgICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9pbVtncm91cF1bYmFuZF0gPQorICAgICAgICAgICAgICAgICAgICAgIGRwY21fYWxwaGFfaW0gKyBsYXN0X2FscGhhX3FfaW07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9pbVtncm91cF1bYmFuZF0gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9yZVtncm91cF1bYmFuZF0gPSAwOworICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9pbVtncm91cF1bYmFuZF0gPSAwOworICAgICAgICAgICAgICB9IC8qIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gJiAoKFVDSEFSKTEgPDwgZ3JvdXApKSAqLworCisgICAgICAgICAgICAgIGlmICgoYmFuZCArIDEpIDwKKyAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCkgeyAvKiA8PSB0aGlzIHNob3VsZCBiZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0IHdheSAoY3AuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNPX0lFQ19GRElTXzIzMDAzLTAoRSkgKi8KKyAgICAgICAgICAgICAgICAvKiAgICA3LjcuMi4zLjIgRGVjb2Rpbmcgb2YgcHJlZGljdGlvbiBjb2VmZmljaWVudHMpICovCisgICAgICAgICAgICAgICAgY3BseFByZWRpY3Rpb25EYXRhLT5hbHBoYV9xX3JlW2dyb3VwXVtiYW5kICsgMV0gPQorICAgICAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfcmVbZ3JvdXBdW2JhbmRdOworICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9pbVtncm91cF1bYmFuZCArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgY3BseFByZWRpY3Rpb25EYXRhLT5hbHBoYV9xX2ltW2dyb3VwXVtiYW5kXTsKKyAgICAgICAgICAgICAgfSAvKiBpZiAoKGJhbmQrMSk8c2NhbGVGYWN0b3JCYW5kc1RvdGFsKSAqLworCisgICAgICAgICAgICAgIHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX3JlX3ByZXZbZ3JvdXBdW2JhbmRdID0KKyAgICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9yZVtncm91cF1bYmFuZF07CisgICAgICAgICAgICAgIHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX2ltX3ByZXZbZ3JvdXBdW2JhbmRdID0KKyAgICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9pbVtncm91cF1bYmFuZF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoYmFuZCA9IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCA8IG1heF9zZmJfc3RlX2NsZWFyOworICAgICAgICAgICAgICAgICBiYW5kKyspIHsKKyAgICAgICAgICAgICAgY3BseFByZWRpY3Rpb25EYXRhLT5hbHBoYV9xX3JlW2dyb3VwXVtiYW5kXSA9IDA7CisgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9pbVtncm91cF1bYmFuZF0gPSAwOworICAgICAgICAgICAgICBwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+YWxwaGFfcV9yZV9wcmV2W2dyb3VwXVtiYW5kXSA9IDA7CisgICAgICAgICAgICAgIHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX2ltX3ByZXZbZ3JvdXBdW2JhbmRdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgd2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBtYXhfc2ZiX3N0ZV9jbGVhcjsgYmFuZCsrKSB7CisgICAgICAgICAgcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPmFscGhhX3FfcmVfcHJldltncm91cF1bYmFuZF0gPSAwOworICAgICAgICAgIHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX2ltX3ByZXZbZ3JvdXBdW2JhbmRdID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT53aW5Hcm91cHNQcmV2ID0gd2luZG93R3JvdXBzOwogICB9CiAKICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIENKb2ludFN0ZXJlb19maWx0ZXJBbmRBZGQoCisgICAgRklYUF9EQkwgKmluLCBpbnQgbGVuLCBpbnQgd2luZG93TGVuLCBjb25zdCBGSVhQX0ZJTFQgKmNvZWZmLCBGSVhQX0RCTCAqb3V0LAorICAgIFVDSEFSIGlzQ3VycmVudCAvKiBvdXRwdXQgdmFsdWVzIHdpdGggZXZlbiBpbmRleCBnZXQgYQorICAgICAgICAgICAgICAgICAgICAgICBwb3NpdHZlIGFkZG9uICg9MSkgb3IgYSBuZWdhdGl2ZSBhZGRvbgorICAgICAgICAgICAgICAgICAgICAgICAoPTApICovCispIHsKKyAgaW50IGksIGo7CisKKyAgaW50IGluZGljZXNfMVtdID0gezIsIDEsIDAsIDEsIDIsIDN9OworICBpbnQgaW5kaWNlc18yW10gPSB7MSwgMCwgMCwgMiwgMywgNH07CisgIGludCBpbmRpY2VzXzNbXSA9IHswLCAwLCAxLCAzLCA0LCA1fTsKKworICBpbnQgc3VidHJfMVtdID0gezYsIDUsIDQsIDIsIDEsIDF9OworICBpbnQgc3VidHJfMltdID0gezUsIDQsIDMsIDEsIDEsIDJ9OworICBpbnQgc3VidHJfM1tdID0gezQsIDMsIDIsIDEsIDIsIDN9OworCisgIGlmIChpc0N1cnJlbnQgPT0gMSkgeworICAgIC8qIGV4cGxvaXQgdGhlIHN5bW1ldHJ5IG9mIHRoZSB0YWJsZTogY29lZmZbNl0gPSAtIGNvZWZmWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZbNV0gPSAtIGNvZWZmWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZbNF0gPSAtIGNvZWZmWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZbM10gPSAwCisgICAgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIG91dFswXSAtPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltpbmRpY2VzXzFbaV1dKSA+PiBTUl9GTkFfT1VUOworICAgICAgb3V0WzBdICs9CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baW5kaWNlc18xWzUgLSBpXV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgb3V0WzFdIC09IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2luZGljZXNfMltpXV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgICBvdXRbMV0gKz0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltpbmRpY2VzXzJbNSAtIGldXSkgPj4gU1JfRk5BX09VVDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICBvdXRbMl0gLT0gKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baW5kaWNlc18zW2ldXSkgPj4gU1JfRk5BX09VVDsKKyAgICAgIG91dFsyXSArPQorICAgICAgICAgIChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2luZGljZXNfM1s1IC0gaV1dKSA+PiBTUl9GTkFfT1VUOworICAgIH0KKworICAgIGZvciAoaiA9IDM7IGogPCAobGVuIC0gMyk7IGorKykgeworICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBvdXRbal0gLT0gKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baiAtIDMgKyBpXSkgPj4gU1JfRk5BX09VVDsKKyAgICAgICAgb3V0W2pdICs9IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2ogKyAzIC0gaV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgb3V0W2xlbiAtIDNdIC09CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5bbGVuIC0gc3VidHJfMVtpXV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgICBvdXRbbGVuIC0gM10gKz0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltsZW4gLSBzdWJ0cl8xWzUgLSBpXV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgb3V0W2xlbiAtIDJdIC09CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5bbGVuIC0gc3VidHJfMltpXV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgICBvdXRbbGVuIC0gMl0gKz0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltsZW4gLSBzdWJ0cl8yWzUgLSBpXV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgb3V0W2xlbiAtIDFdIC09CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5bbGVuIC0gc3VidHJfM1tpXV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgICBvdXRbbGVuIC0gMV0gKz0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltsZW4gLSBzdWJ0cl8zWzUgLSBpXV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgLyogZXhwbG9pdCB0aGUgc3ltbWV0cnkgb2YgdGhlIHRhYmxlOiBjb2VmZls2XSA9IGNvZWZmWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZbNV0gPSBjb2VmZlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmWzRdID0gY29lZmZbMl0KKyAgICAqLworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgb3V0WzBdIC09IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2luZGljZXNfMVtpXV0gPj4gU1JfRk5BX09VVCk7CisgICAgICBvdXRbMF0gLT0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltpbmRpY2VzXzFbNSAtIGldXSA+PiBTUl9GTkFfT1VUKTsKKyAgICB9CisgICAgb3V0WzBdIC09IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbM10sIGluWzBdID4+IFNSX0ZOQV9PVVQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgb3V0WzFdICs9IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2luZGljZXNfMltpXV0gPj4gU1JfRk5BX09VVCk7CisgICAgICBvdXRbMV0gKz0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltpbmRpY2VzXzJbNSAtIGldXSA+PiBTUl9GTkFfT1VUKTsKKyAgICB9CisgICAgb3V0WzFdICs9IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbM10sIGluWzFdID4+IFNSX0ZOQV9PVVQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgb3V0WzJdIC09IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2luZGljZXNfM1tpXV0gPj4gU1JfRk5BX09VVCk7CisgICAgICBvdXRbMl0gLT0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltpbmRpY2VzXzNbNSAtIGldXSA+PiBTUl9GTkFfT1VUKTsKKyAgICB9CisgICAgb3V0WzJdIC09IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbM10sIGluWzJdID4+IFNSX0ZOQV9PVVQpOworCisgICAgZm9yIChqID0gMzsgaiA8IChsZW4gLSA0KTsgaisrKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIG91dFtqXSArPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltqIC0gMyArIGldID4+IFNSX0ZOQV9PVVQpOworICAgICAgICBvdXRbal0gKz0gKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baiArIDMgLSBpXSA+PiBTUl9GTkFfT1VUKTsKKyAgICAgIH0KKyAgICAgIG91dFtqXSArPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmWzNdLCBpbltqXSA+PiBTUl9GTkFfT1VUKTsKKworICAgICAgaisrOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIG91dFtqXSAtPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltqIC0gMyArIGldID4+IFNSX0ZOQV9PVVQpOworICAgICAgICBvdXRbal0gLT0gKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baiArIDMgLSBpXSA+PiBTUl9GTkFfT1VUKTsKKyAgICAgIH0KKyAgICAgIG91dFtqXSAtPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmWzNdLCBpbltqXSA+PiBTUl9GTkFfT1VUKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICBvdXRbbGVuIC0gM10gKz0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltsZW4gLSBzdWJ0cl8xW2ldXSA+PiBTUl9GTkFfT1VUKTsKKyAgICAgIG91dFtsZW4gLSAzXSArPQorICAgICAgICAgIChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2xlbiAtIHN1YnRyXzFbNSAtIGldXSA+PiBTUl9GTkFfT1VUKTsKKyAgICB9CisgICAgb3V0W2xlbiAtIDNdICs9IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbM10sIGluW2xlbiAtIDNdID4+IFNSX0ZOQV9PVVQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgb3V0W2xlbiAtIDJdIC09CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5bbGVuIC0gc3VidHJfMltpXV0gPj4gU1JfRk5BX09VVCk7CisgICAgICBvdXRbbGVuIC0gMl0gLT0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltsZW4gLSBzdWJ0cl8yWzUgLSBpXV0gPj4gU1JfRk5BX09VVCk7CisgICAgfQorICAgIG91dFtsZW4gLSAyXSAtPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmWzNdLCBpbltsZW4gLSAyXSA+PiBTUl9GTkFfT1VUKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIG91dFtsZW4gLSAxXSArPQorICAgICAgICAgIChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2xlbiAtIHN1YnRyXzNbaV1dID4+IFNSX0ZOQV9PVVQpOworICAgICAgb3V0W2xlbiAtIDFdICs9CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5bbGVuIC0gc3VidHJfM1s1IC0gaV1dID4+IFNSX0ZOQV9PVVQpOworICAgIH0KKyAgICBvdXRbbGVuIC0gMV0gKz0gKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZlszXSwgaW5bbGVuIC0gMV0gPj4gU1JfRk5BX09VVCk7CisgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIENKb2ludFN0ZXJlb19HZW5lcmF0ZU1TT3V0cHV0KEZJWFBfREJMICpwU3BlY0xDdXJyQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcFNwZWNSQ3VyckJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBsZWZ0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCByaWdodFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgblNmYkJhbmRzKSB7CisgIHVuc2lnbmVkIGludCBpOworCisgIEZJWFBfREJMIGxlZnRDb2VmZmljaWVudDA7CisgIEZJWFBfREJMIGxlZnRDb2VmZmljaWVudDE7CisgIEZJWFBfREJMIGxlZnRDb2VmZmljaWVudDI7CisgIEZJWFBfREJMIGxlZnRDb2VmZmljaWVudDM7CisKKyAgRklYUF9EQkwgcmlnaHRDb2VmZmljaWVudDA7CisgIEZJWFBfREJMIHJpZ2h0Q29lZmZpY2llbnQxOworICBGSVhQX0RCTCByaWdodENvZWZmaWNpZW50MjsKKyAgRklYUF9EQkwgcmlnaHRDb2VmZmljaWVudDM7CisKKyAgZm9yIChpID0gblNmYkJhbmRzOyBpID4gMDsgaSAtPSA0KSB7CisgICAgbGVmdENvZWZmaWNpZW50MCA9IHBTcGVjTEN1cnJCYW5kW2kgLSA0XTsKKyAgICBsZWZ0Q29lZmZpY2llbnQxID0gcFNwZWNMQ3VyckJhbmRbaSAtIDNdOworICAgIGxlZnRDb2VmZmljaWVudDIgPSBwU3BlY0xDdXJyQmFuZFtpIC0gMl07CisgICAgbGVmdENvZWZmaWNpZW50MyA9IHBTcGVjTEN1cnJCYW5kW2kgLSAxXTsKKworICAgIHJpZ2h0Q29lZmZpY2llbnQwID0gcFNwZWNSQ3VyckJhbmRbaSAtIDRdOworICAgIHJpZ2h0Q29lZmZpY2llbnQxID0gcFNwZWNSQ3VyckJhbmRbaSAtIDNdOworICAgIHJpZ2h0Q29lZmZpY2llbnQyID0gcFNwZWNSQ3VyckJhbmRbaSAtIDJdOworICAgIHJpZ2h0Q29lZmZpY2llbnQzID0gcFNwZWNSQ3VyckJhbmRbaSAtIDFdOworCisgICAgLyogTVMgb3V0cHV0IGdlbmVyYXRpb24gKi8KKyAgICBsZWZ0Q29lZmZpY2llbnQwID4+PSBsZWZ0U2NhbGU7CisgICAgbGVmdENvZWZmaWNpZW50MSA+Pj0gbGVmdFNjYWxlOworICAgIGxlZnRDb2VmZmljaWVudDIgPj49IGxlZnRTY2FsZTsKKyAgICBsZWZ0Q29lZmZpY2llbnQzID4+PSBsZWZ0U2NhbGU7CisKKyAgICByaWdodENvZWZmaWNpZW50MCA+Pj0gcmlnaHRTY2FsZTsKKyAgICByaWdodENvZWZmaWNpZW50MSA+Pj0gcmlnaHRTY2FsZTsKKyAgICByaWdodENvZWZmaWNpZW50MiA+Pj0gcmlnaHRTY2FsZTsKKyAgICByaWdodENvZWZmaWNpZW50MyA+Pj0gcmlnaHRTY2FsZTsKKworICAgIHBTcGVjTEN1cnJCYW5kW2kgLSA0XSA9IGxlZnRDb2VmZmljaWVudDAgKyByaWdodENvZWZmaWNpZW50MDsKKyAgICBwU3BlY0xDdXJyQmFuZFtpIC0gM10gPSBsZWZ0Q29lZmZpY2llbnQxICsgcmlnaHRDb2VmZmljaWVudDE7CisgICAgcFNwZWNMQ3VyckJhbmRbaSAtIDJdID0gbGVmdENvZWZmaWNpZW50MiArIHJpZ2h0Q29lZmZpY2llbnQyOworICAgIHBTcGVjTEN1cnJCYW5kW2kgLSAxXSA9IGxlZnRDb2VmZmljaWVudDMgKyByaWdodENvZWZmaWNpZW50MzsKKworICAgIHBTcGVjUkN1cnJCYW5kW2kgLSA0XSA9IGxlZnRDb2VmZmljaWVudDAgLSByaWdodENvZWZmaWNpZW50MDsKKyAgICBwU3BlY1JDdXJyQmFuZFtpIC0gM10gPSBsZWZ0Q29lZmZpY2llbnQxIC0gcmlnaHRDb2VmZmljaWVudDE7CisgICAgcFNwZWNSQ3VyckJhbmRbaSAtIDJdID0gbGVmdENvZWZmaWNpZW50MiAtIHJpZ2h0Q29lZmZpY2llbnQyOworICAgIHBTcGVjUkN1cnJCYW5kW2kgLSAxXSA9IGxlZnRDb2VmZmljaWVudDMgLSByaWdodENvZWZmaWNpZW50MzsKKyAgfQorfQorCiB2b2lkIENKb2ludFN0ZXJlb19BcHBseU1TKAotICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzJdLAotICAgICAgICBjb25zdCBTSE9SVCAqcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMsCi0gICAgICAgIGNvbnN0IFVDSEFSICpwV2luZG93R3JvdXBMZW5ndGgsCi0gICAgICAgIGNvbnN0IGludCB3aW5kb3dHcm91cHMsCi0gICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMLAotICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkUgotICAgICAgICApCi17Ci0gIENKb2ludFN0ZXJlb0RhdGEgKnBKb2ludFN0ZXJlb0RhdGEgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YTsKLSAgaW50IHdpbmRvdywgZ3JvdXAsIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzJdLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bMl0sCisgICAgRklYUF9EQkwgKnNwZWN0cnVtTCwgRklYUF9EQkwgKnNwZWN0cnVtUiwgU0hPUlQgKlNGQmxlZnRTY2FsZSwKKyAgICBTSE9SVCAqU0ZCcmlnaHRTY2FsZSwgU0hPUlQgKnNwZWNTY2FsZUwsIFNIT1JUICpzcGVjU2NhbGVSLAorICAgIGNvbnN0IFNIT1JUICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywgY29uc3QgVUNIQVIgKnBXaW5kb3dHcm91cExlbmd0aCwKKyAgICBjb25zdCBpbnQgd2luZG93R3JvdXBzLCBjb25zdCBpbnQgbWF4X3NmYl9zdGVfb3V0c2lkZSwKKyAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTCwKKyAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkUiwgRklYUF9EQkwgKnN0b3JlX2RteF9yZV9wcmV2LAorICAgIFNIT1JUICpzdG9yZV9kbXhfcmVfcHJldl9lLCBjb25zdCBpbnQgbWFpbmJhbmRfZmxhZykgeworICBpbnQgd2luZG93LCBncm91cCwgYmFuZDsKKyAgVUNIQVIgZ3JvdXBNYXNrOworICBDSm9pbnRTdGVyZW9EYXRhICpwSm9pbnRTdGVyZW9EYXRhID0KKyAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhOworICBDQ3BseFByZWRpY3Rpb25EYXRhICpjcGx4UHJlZGljdGlvbkRhdGEgPQorICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cENvbVN0YXRpY0RhdGEtPmNwbHhQcmVkaWN0aW9uRGF0YTsKIAotICBGREtfQVNTRVJUKHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwgPT0gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkUik7Ci0gIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCA9IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEw7Ci0gIGZvciAod2luZG93ID0gMCwgZ3JvdXAgPSAwOyBncm91cCA8IHdpbmRvd0dyb3VwczsgZ3JvdXArKykKLSAgewotICAgIFVDSEFSIGdyb3VwTWFzayA9IDEgPDwgZ3JvdXA7CisgIGludCBtYXhfc2ZiX3N0ZSA9CisgICAgICBmTWF4KHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwsIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFIpOworICBpbnQgbWluX3NmYl9zdGUgPQorICAgICAgZk1pbihzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMLCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRSKTsKKyAgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCA9IG1pbl9zZmJfc3RlOwogCi0gICAgZm9yIChpbnQgZ3JvdXB3aW49MDsgZ3JvdXB3aW48cFdpbmRvd0dyb3VwTGVuZ3RoW2dyb3VwXTsgZ3JvdXB3aW4rKywgd2luZG93KyspCisgIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5jcGx4X3ByZWRfZmxhZykgeworICAgIGludCB3aW5kb3dMZW4sIGdyb3Vwd2luLCBmcmFtZU1heFNjYWxlOworICAgIENKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhICpwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YSA9CisgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW0xdCisgICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YTsKKyAgICBGSVhQX0RCTCAqY29uc3Qgc3RhdGljU3BlY3RyYWxDb2VmZnNMID0KKyAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tMXQorICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS5zcGVjdHJhbENvZWZmc1tMXTsKKyAgICBGSVhQX0RCTCAqY29uc3Qgc3RhdGljU3BlY3RyYWxDb2VmZnNSID0KKyAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tMXQorICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS5zcGVjdHJhbENvZWZmc1tSXTsKKyAgICBTSE9SVCAqY29uc3Qgc3RhdGljU3BlY1NjYWxlTCA9CisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEuc3BlY1NjYWxlW0xdOworICAgIFNIT1JUICpjb25zdCBzdGF0aWNTcGVjU2NhbGVSID0KKyAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tMXQorICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS5zcGVjU2NhbGVbUl07CisKKyAgICBGSVhQX0RCTCAqZG14X3JlID0KKyAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tMXQorICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS5zY3JhdGNoQnVmZmVyOworICAgIEZJWFBfREJMICpkbXhfcmVfcHJldiA9CisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEuc2NyYXRjaEJ1ZmZlciArCisgICAgICAgIDEwMjQ7CisKKyAgICAvKiBXaGVuIE1TIGlzIGFwcGxpZWQgb3ZlciB0aGUgbWFpbiBiYW5kIHRoaXMgdmFsdWUgZ2V0cyBjb21wdXRlZC4gT3RoZXJ3aXNlCisgICAgICogKGZvciB0aGUgdGlsZXMpIGl0IHVzZXMgdGhlIGFzc2lnbmVkIHZhbHVlICovCisgICAgU0hPUlQgZG14X3JlX3ByZXZfZSA9ICpzdG9yZV9kbXhfcmVfcHJldl9lOworCisgICAgY29uc3QgRklYUF9GSUxUICpwQ29lZmY7CisgICAgY29uc3QgRklYUF9GSUxUICpwQ29lZmZQcmV2OworICAgIGludCBjb2VmZlBvaW50ZXJPZmZzZXQ7CisKKyAgICBpbnQgcHJldmlvdXNTaGFwZSA9IChpbnQpcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPndpblNoYXBlUHJldjsKKyAgICBpbnQgY3VycmVudFNoYXBlID0gKGludClwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLldpbmRvd1NoYXBlOworCisgICAgLyogY29tcGxleCBzdGVyZW8gcHJlZGljdGlvbiAqLworCisgICAgLyogMC4gcHJlcGFyYXRpb25zICovCisKKyAgICAvKiAwLjAuIGdldCBzY3JhdGNoIGJ1ZmZlciBmb3IgZG93bm1peCBNRFNUICovCisgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChkbXhfaW0sIEZJWFBfREJMLCAxMDI0KTsKKworICAgIC8qIDAuMS4gd2luZG93IGxlbmd0aHMgKi8KKworICAgIC8qIGdldCBsZW5ndGggb2Ygc2hvcnQgd2luZG93IGZvciBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKi8KKyAgICB3aW5kb3dMZW4gPQorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5ncmFudWxlTGVuZ3RoOyAvKiBmcmFtZWxlbmd0aCA3NjggPT4gOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lbGVuZ3RoIDEwMjQgPT4gMTI4ICovCisKKyAgICAvKiBpZiB0aGlzIGlzIG5vIHNob3J0LWJsb2NrIHNldCBsZW5ndGggZm9yIGxvbmctYmxvY2sgKi8KKyAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5XaW5kb3dTZXF1ZW5jZSAhPSBCTE9DS19TSE9SVCkgeworICAgICAgd2luZG93TGVuICo9IDg7CisgICAgfQorCisgICAgLyogMC4yLiBzZXQgcG9pbnRlciB0byBmaWx0ZXItY29lZmZpY2llbnRzIGZvciBNRFNUIGV4Y2l0YXRpb24gaW5jbHVkaW5nCisgICAgICogcHJldmlvdXMgZnJhbWUgcG9ydGlvbnMgKi8KKyAgICAvKiAgICAgIGNwLiBJU08vSUVDIEZESVMgMjMwMDMtMzoyMDExKEUpIHRhYmxlIDEyNSAqLworCisgICAgLyogc2V0IHBvaW50ZXIgdG8gZGVmYXVsdC1wb3NpdGlvbiAqLworICAgIHBDb2VmZlByZXYgPSBtZHN0X2ZpbHRfY29lZl9wcmV2W3ByZXZpb3VzU2hhcGVdOworCisgICAgaWYgKGNwbHhQcmVkaWN0aW9uRGF0YS0+Y29tcGxleF9jb2VmID09IDEpIHsKKyAgICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXQorICAgICAgICAgICAgICAgICAgLT5pY3NJbmZvLldpbmRvd1NlcXVlbmNlKSB7IC8qIGN1cnJlbnQgd2luZG93IHNlcXVlbmNlICovCisgICAgICAgIGNhc2UgQkxPQ0tfU0hPUlQ6CisgICAgICAgIGNhc2UgQkxPQ0tfTE9ORzoKKyAgICAgICAgICBwQ29lZmZQcmV2ID0gbWRzdF9maWx0X2NvZWZfcHJldltwcmV2aW91c1NoYXBlXTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJMT0NLX1NUQVJUOgorICAgICAgICAgIGlmICgocEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPndpblNlcVByZXYgPT0gQkxPQ0tfU0hPUlQpIHx8CisgICAgICAgICAgICAgIChwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+d2luU2VxUHJldiA9PSBCTE9DS19TVEFSVCkpIHsKKyAgICAgICAgICAgIC8qIGEgc3RvcC1zdGFydC1zZXF1ZW5jZSBjYW4gb25seSBmb2xsb3cgb24gYW4gZWlnaHQtc2hvcnQtc2VxdWVuY2UKKyAgICAgICAgICAgICAqIG9yIGEgc3RhcnQtc2VxdWVuY2UgKi8KKyAgICAgICAgICAgIHBDb2VmZlByZXYgPSBtZHN0X2ZpbHRfY29lZl9wcmV2WzIgKyBwcmV2aW91c1NoYXBlXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcENvZWZmUHJldiA9IG1kc3RfZmlsdF9jb2VmX3ByZXZbcHJldmlvdXNTaGFwZV07CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkxPQ0tfU1RPUDoKKyAgICAgICAgICBwQ29lZmZQcmV2ID0gbWRzdF9maWx0X2NvZWZfcHJldlsyICsgcHJldmlvdXNTaGFwZV07CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBwQ29lZmZQcmV2ID0gbWRzdF9maWx0X2NvZWZfcHJldltwcmV2aW91c1NoYXBlXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiAwLjMuIHNldCBwb2ludGVyIHRvIGZpbHRlci1jb2VmZmljaWVudHMgZm9yIE1EU1QgZXhjaXRhdGlvbiAqLworCisgICAgLyogZGVmaW5lIG9mZnNldCBvZiBwb2ludGVyIHRvIGZpbHRlci1jb2VmZmljaWVudHMgZm9yIE1EU1QgZXhpdGF0aW9uCisgICAgICogZW1wbG95aW5nIG9ubHkgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBpZiAoKHByZXZpb3VzU2hhcGUgPT0gU0hBUEVfU0lORSkgJiYgKGN1cnJlbnRTaGFwZSA9PSBTSEFQRV9TSU5FKSkgeworICAgICAgY29lZmZQb2ludGVyT2Zmc2V0ID0gMDsKKyAgICB9IGVsc2UgaWYgKChwcmV2aW91c1NoYXBlID09IFNIQVBFX1NJTkUpICYmIChjdXJyZW50U2hhcGUgPT0gU0hBUEVfS0JEKSkgeworICAgICAgY29lZmZQb2ludGVyT2Zmc2V0ID0gMjsKKyAgICB9IGVsc2UgaWYgKChwcmV2aW91c1NoYXBlID09IFNIQVBFX0tCRCkgJiYgKGN1cnJlbnRTaGFwZSA9PSBTSEFQRV9LQkQpKSB7CisgICAgICBjb2VmZlBvaW50ZXJPZmZzZXQgPSAxOworICAgIH0gZWxzZSAvKiBpZiAoIChwcmV2aW91c1NoYXBlID09IFNIQVBFX0tCRCkgJiYgKGN1cnJlbnRTaGFwZSA9PSBTSEFQRV9TSU5FKQorICAgICAgICAgICAgICApICovCiAgICAgewotICAgICAgaW50IGJhbmQ7Ci0gICAgICBGSVhQX0RCTCAqbGVmdFNwZWN0cnVtLCAqcmlnaHRTcGVjdHJ1bTsKLSAgICAgIFNIT1JUICpsZWZ0U2NhbGUgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPmFTZmJTY2FsZVt3aW5kb3cqMTZdOwotICAgICAgU0hPUlQgKnJpZ2h0U2NhbGUgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cER5bkRhdGEtPmFTZmJTY2FsZVt3aW5kb3cqMTZdOworICAgICAgY29lZmZQb2ludGVyT2Zmc2V0ID0gMzsKKyAgICB9CiAKLSAgICAgIGxlZnRTcGVjdHJ1bSA9IFNQRUMocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+Z3JhbnVsZUxlbmd0aCk7Ci0gICAgICByaWdodFNwZWN0cnVtID0gU1BFQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5ncmFudWxlTGVuZ3RoKTsKKyAgICAvKiBzZXQgcG9pbnRlciB0byBmaWx0ZXItY29lZmZpY2llbnQgdGFibGUgY3AuIElTTy9JRUMgRkRJUyAyMzAwMy0zOjIwMTEoRSkKKyAgICAgKiB0YWJsZSAxMjQgKi8KKyAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgICAgICAtPmljc0luZm8uV2luZG93U2VxdWVuY2UpIHsgLyogY3VycmVudCB3aW5kb3cgc2VxdWVuY2UgKi8KKyAgICAgIGNhc2UgQkxPQ0tfU0hPUlQ6CisgICAgICBjYXNlIEJMT0NLX0xPTkc6CisgICAgICAgIHBDb2VmZiA9IG1kc3RfZmlsdF9jb2VmX2N1cnJbY29lZmZQb2ludGVyT2Zmc2V0XTsKKyAgICAgICAgYnJlYWs7CiAKLSAgICAgIGZvciAoYmFuZD0wOyBiYW5kPHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrKQotICAgICAgewotICAgICAgICBpZiAocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdICYgZ3JvdXBNYXNrKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGxTY2FsZT1sZWZ0U2NhbGVbYmFuZF07Ci0gICAgICAgICAgaW50IHJTY2FsZT1yaWdodFNjYWxlW2JhbmRdOwotICAgICAgICAgIGludCBjb21tb25TY2FsZT1sU2NhbGUgPiByU2NhbGUgPyBsU2NhbGU6clNjYWxlOworICAgICAgY2FzZSBCTE9DS19TVEFSVDoKKyAgICAgICAgaWYgKChwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+d2luU2VxUHJldiA9PSBCTE9DS19TSE9SVCkgfHwKKyAgICAgICAgICAgIChwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+d2luU2VxUHJldiA9PSBCTE9DS19TVEFSVCkpIHsKKyAgICAgICAgICAvKiBhIHN0b3Atc3RhcnQtc2VxdWVuY2UgY2FuIG9ubHkgZm9sbG93IG9uIGFuIGVpZ2h0LXNob3J0LXNlcXVlbmNlIG9yCisgICAgICAgICAgICogYSBzdGFydC1zZXF1ZW5jZSAqLworICAgICAgICAgIHBDb2VmZiA9IG1kc3RfZmlsdF9jb2VmX2N1cnJbMTIgKyBjb2VmZlBvaW50ZXJPZmZzZXRdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBDb2VmZiA9IG1kc3RfZmlsdF9jb2VmX2N1cnJbNCArIGNvZWZmUG9pbnRlck9mZnNldF07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAvKiBJU08vSUVDIDE0NDk2LTMgQ2hhcHRlciA0LjYuOC4xLjEgOgotICAgICAgICAgICAgIE0vUyBqb2ludCBjaGFubmVsIGNvZGluZyBjYW4gb25seSBiZSB1c2VkIGlmIGNvbW1vbl93aW5kb3cgaXMgkTGSLiAqLwotICAgICAgICAgIEZES19BU1NFUlQoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pID09IEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5pY3NJbmZvKSk7Ci0gICAgICAgICAgRkRLX0FTU0VSVChHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbykgPT0gR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmljc0luZm8pKTsKKyAgICAgIGNhc2UgQkxPQ0tfU1RPUDoKKyAgICAgICAgcENvZWZmID0gbWRzdF9maWx0X2NvZWZfY3Vycls4ICsgY29lZmZQb2ludGVyT2Zmc2V0XTsKKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICBjb21tb25TY2FsZSsrOwotICAgICAgICAgIGxlZnRTY2FsZVtiYW5kXT1jb21tb25TY2FsZTsKLSAgICAgICAgICByaWdodFNjYWxlW2JhbmRdPWNvbW1vblNjYWxlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcENvZWZmID0gbWRzdF9maWx0X2NvZWZfY3Vycltjb2VmZlBvaW50ZXJPZmZzZXRdOworICAgIH0KIAotICAgICAgICAgIGxTY2FsZSA9IGZNaW4oREZSQUNUX0JJVFMtMSwgY29tbW9uU2NhbGUgLSBsU2NhbGUpOwotICAgICAgICAgIHJTY2FsZSA9IGZNaW4oREZSQUNUX0JJVFMtMSwgY29tbW9uU2NhbGUgLSByU2NhbGUpOworICAgIC8qIDAuNC4gZmluZCBtYXhpbXVtIGNvbW1vbiAobC9yKSBiYW5kLXNjYWxpbmctZmFjdG9yIGZvciB3aG9sZSBzZXF1ZW5jZQorICAgICAqIChhbGwgd2luZG93cykgKi8KKyAgICBmcmFtZU1heFNjYWxlID0gMDsKKyAgICBmb3IgKHdpbmRvdyA9IDAsIGdyb3VwID0gMDsgZ3JvdXAgPCB3aW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICAgIGZvciAoZ3JvdXB3aW4gPSAwOyBncm91cHdpbiA8IHBXaW5kb3dHcm91cExlbmd0aFtncm91cF07CisgICAgICAgICAgIGdyb3Vwd2luKyssIHdpbmRvdysrKSB7CisgICAgICAgIFNIT1JUICpsZWZ0U2NhbGUgPSAmU0ZCbGVmdFNjYWxlW3dpbmRvdyAqIDE2XTsKKyAgICAgICAgU0hPUlQgKnJpZ2h0U2NhbGUgPSAmU0ZCcmlnaHRTY2FsZVt3aW5kb3cgKiAxNl07CisgICAgICAgIGludCB3aW5kb3dNYXhTY2FsZSA9IDA7CiAKLSAgICAgICAgICBGREtfQVNTRVJUKGxTY2FsZSA+PSAwICYmIHJTY2FsZSA+PSAwKTsKKyAgICAgICAgLyogZmluZCBtYXhpbXVtIHNjYWxpbmcgZmFjdG9yIG9mIGFsbCBiYW5kcyBpbiB0aGlzIHdpbmRvdyAqLworICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbWluX3NmYl9zdGU7IGJhbmQrKykgeworICAgICAgICAgIGludCBsU2NhbGUgPSBsZWZ0U2NhbGVbYmFuZF07CisgICAgICAgICAgaW50IHJTY2FsZSA9IHJpZ2h0U2NhbGVbYmFuZF07CisgICAgICAgICAgaW50IGNvbW1vblNjYWxlID0gKChsU2NhbGUgPiByU2NhbGUpID8gbFNjYWxlIDogclNjYWxlKTsKKyAgICAgICAgICB3aW5kb3dNYXhTY2FsZSA9CisgICAgICAgICAgICAgICh3aW5kb3dNYXhTY2FsZSA8IGNvbW1vblNjYWxlKSA/IGNvbW1vblNjYWxlIDogd2luZG93TWF4U2NhbGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwgPgorICAgICAgICAgICAgbWluX3NmYl9zdGUpIHsgLyogaS5lLiBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMID09IG1heF9zZmJfc3RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBmb3IgKDsgYmFuZCA8IG1heF9zZmJfc3RlOyBiYW5kKyspIHsKKyAgICAgICAgICAgIGludCBsU2NhbGUgPSBsZWZ0U2NhbGVbYmFuZF07CisgICAgICAgICAgICB3aW5kb3dNYXhTY2FsZSA9CisgICAgICAgICAgICAgICAgKHdpbmRvd01heFNjYWxlIDwgbFNjYWxlKSA/IGxTY2FsZSA6IHdpbmRvd01heFNjYWxlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkUiA+CisgICAgICAgICAgICAgIG1pbl9zZmJfc3RlKSB7IC8qIGkuZS4gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkUiA9PSBtYXhfc2ZiX3N0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoOyBiYW5kIDwgbWF4X3NmYl9zdGU7IGJhbmQrKykgeworICAgICAgICAgICAgICBpbnQgclNjYWxlID0gcmlnaHRTY2FsZVtiYW5kXTsKKyAgICAgICAgICAgICAgd2luZG93TWF4U2NhbGUgPQorICAgICAgICAgICAgICAgICAgKHdpbmRvd01heFNjYWxlIDwgclNjYWxlKSA/IHJTY2FsZSA6IHdpbmRvd01heFNjYWxlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgICAgZm9yIChpbnQgaW5kZXg9cFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF07IGluZGV4PHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmQrMV07IGluZGV4KyspCisgICAgICAgIC8qIGZpbmQgbWF4aW11bSBjb21tb24gU0Ygb2YgYWxsIHdpbmRvd3MgKi8KKyAgICAgICAgZnJhbWVNYXhTY2FsZSA9CisgICAgICAgICAgICAoZnJhbWVNYXhTY2FsZSA8IHdpbmRvd01heFNjYWxlKSA/IHdpbmRvd01heFNjYWxlIDogZnJhbWVNYXhTY2FsZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhZGQgc29tZSBoZWFkcm9vbSBmb3Igb3ZlcmZsb3cgcHJvdGVjdGlvbiBkdXJpbmcgZmlsdGVyIGFuZCBhZGQgb3BlcmF0aW9uCisgICAgICovCisgICAgZnJhbWVNYXhTY2FsZSArPSAyOworCisgICAgLyogcHJvY2VzcyBvbiB3aW5kb3ctYmFzaXMgKGkuZS4gaXRlcmF0ZSBvdmVyIGFsbCBncm91cHMgYW5kIGNvcnJlc3BvbmRpbmcKKyAgICAgKiB3aW5kb3dzKSAqLworICAgIGZvciAod2luZG93ID0gMCwgZ3JvdXAgPSAwOyBncm91cCA8IHdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgICAgZ3JvdXBNYXNrID0gMSA8PCBncm91cDsKKworICAgICAgZm9yIChncm91cHdpbiA9IDA7IGdyb3Vwd2luIDwgcFdpbmRvd0dyb3VwTGVuZ3RoW2dyb3VwXTsKKyAgICAgICAgICAgZ3JvdXB3aW4rKywgd2luZG93KyspIHsKKyAgICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgTURTVCB3aXRoIHplcm9zICovCisgICAgICAgIEZES21lbWNsZWFyKCZkbXhfaW1bd2luZG93TGVuICogd2luZG93XSwgd2luZG93TGVuICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICAgICAgLyogMS4gY2FsY3VsYXRlIHRoZSBwcmV2aW91cyBkb3dubWl4IE1EQ1QuIFdlIGRvIHRoaXMgb25jZSBqdXN0IGZvciB0aGUKKyAgICAgICAgICogTWFpbiBiYW5kLiAqLworICAgICAgICBpZiAoY3BseFByZWRpY3Rpb25EYXRhLT5jb21wbGV4X2NvZWYgPT0gMSkgeworICAgICAgICAgIGlmICgoY3BseFByZWRpY3Rpb25EYXRhLT51c2VfcHJldl9mcmFtZSA9PSAxKSAmJiAobWFpbmJhbmRfZmxhZykpIHsKKyAgICAgICAgICAgIC8qIGlmIHRoaXMgaXMgYSBsb25nLWJsb2NrIG9yIHRoZSBmaXJzdCB3aW5kb3cgb2YgYSBzaG9ydC1ibG9jaworICAgICAgICAgICAgICAgY2FsY3VsYXRlIHRoZSBkb3dubWl4IE1EQ1Qgb2YgdGhlIHByZXZpb3VzIGZyYW1lLgorICAgICAgICAgICAgICAgdXNlX3ByZXZfZnJhbWUgaXMgYXNzdW1lZCBub3QgdG8gY2hhbmdlIGR1cmluZyBhIGZyYW1lIQorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgLyogZmlyc3QgZGV0ZXJtaW5lIHNoaWZ0ZmFjdG9ycyB0byBzY2FsZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsICovCisgICAgICAgICAgICBpZiAoKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8uV2luZG93U2VxdWVuY2UgIT0KKyAgICAgICAgICAgICAgICAgQkxPQ0tfU0hPUlQpIHx8CisgICAgICAgICAgICAgICAgKHdpbmRvdyA9PSAwKSkgeworICAgICAgICAgICAgICBpbnQgaW5kZXhfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgaW50IHNyTGVmdENoYW4gPSAwOworICAgICAgICAgICAgICBpbnQgc3JSaWdodENoYW4gPSAwOworICAgICAgICAgICAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5XaW5kb3dTZXF1ZW5jZSA9PQorICAgICAgICAgICAgICAgICAgQkxPQ0tfU0hPUlQpIHsKKyAgICAgICAgICAgICAgICAvKiB1c2UgdGhlIGxhc3Qgd2luZG93IG9mIHRoZSBwcmV2aW91cyBmcmFtZSBmb3IgTURDVAorICAgICAgICAgICAgICAgICAqIGNhbGN1bGF0aW9uIGlmIHRoaXMgaXMgYSBzaG9ydC1ibG9jay4gKi8KKyAgICAgICAgICAgICAgICBpbmRleF9vZmZzZXQgPSB3aW5kb3dMZW4gKiA3OworICAgICAgICAgICAgICAgIGlmIChzdGF0aWNTcGVjU2NhbGVMWzddID4gc3RhdGljU3BlY1NjYWxlUls3XSkgeworICAgICAgICAgICAgICAgICAgc3JSaWdodENoYW4gPSBzdGF0aWNTcGVjU2NhbGVMWzddIC0gc3RhdGljU3BlY1NjYWxlUls3XTsKKyAgICAgICAgICAgICAgICAgIGRteF9yZV9wcmV2X2UgPSBzdGF0aWNTcGVjU2NhbGVMWzddOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzckxlZnRDaGFuID0gc3RhdGljU3BlY1NjYWxlUls3XSAtIHN0YXRpY1NwZWNTY2FsZUxbN107CisgICAgICAgICAgICAgICAgICBkbXhfcmVfcHJldl9lID0gc3RhdGljU3BlY1NjYWxlUls3XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRpY1NwZWNTY2FsZUxbMF0gPiBzdGF0aWNTcGVjU2NhbGVSWzBdKSB7CisgICAgICAgICAgICAgICAgICBzclJpZ2h0Q2hhbiA9IHN0YXRpY1NwZWNTY2FsZUxbMF0gLSBzdGF0aWNTcGVjU2NhbGVSWzBdOworICAgICAgICAgICAgICAgICAgZG14X3JlX3ByZXZfZSA9IHN0YXRpY1NwZWNTY2FsZUxbMF07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNyTGVmdENoYW4gPSBzdGF0aWNTcGVjU2NhbGVSWzBdIC0gc3RhdGljU3BlY1NjYWxlTFswXTsKKyAgICAgICAgICAgICAgICAgIGRteF9yZV9wcmV2X2UgPSBzdGF0aWNTcGVjU2NhbGVSWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIG5vdyBzY2FsZSBjaGFubmVscyBhbmQgZGV0ZXJtaW5lIGRvd25taXggTURDVCBvZiBwcmV2aW91cyBmcmFtZQorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgICAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhLT5qb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhCisgICAgICAgICAgICAgICAgICAgICAgLmNsZWFyU3BlY3RyYWxDb2VmZnMgPT0gMSkgeworICAgICAgICAgICAgICAgIEZES21lbWNsZWFyKGRteF9yZV9wcmV2LCB3aW5kb3dMZW4gKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICAgICAgICBkbXhfcmVfcHJldl9lID0gMDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY3BseFByZWRpY3Rpb25EYXRhLT5wcmVkX2RpciA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd0xlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRteF9yZV9wcmV2W2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3RhdGljU3BlY3RyYWxDb2VmZnNMW2luZGV4X29mZnNldCArIGldID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyTGVmdENoYW4pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljU3BlY3RyYWxDb2VmZnNSW2luZGV4X29mZnNldCArIGldID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyUmlnaHRDaGFuKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93TGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZG14X3JlX3ByZXZbaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKChzdGF0aWNTcGVjdHJhbENvZWZmc0xbaW5kZXhfb2Zmc2V0ICsgaV0gPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JMZWZ0Q2hhbikgLQorICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNTcGVjdHJhbENvZWZmc1JbaW5kZXhfb2Zmc2V0ICsgaV0gPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JSaWdodENoYW4pKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBJbiBjYXNlIHRoYXQgd2UgdXNlIElORiB3ZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBzdGF0ZSBvZiB0aGUKKyAgICAgICAgICAgICAgImRteF9yZV9wcmV2IiAob3JpZ2luYWwgb3IgY29tcHV0ZWQpLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlCisgICAgICAgICAgICAgIGhhdmUgdG8gYXBwbHkgTVMgb3ZlciB0aGUgc2VwYXJhdGUgSUdGIHRpbGVzLiAqLworICAgICAgICAgICAgICBGREttZW1jcHkoc3RvcmVfZG14X3JlX3ByZXYsICZkbXhfcmVfcHJldlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd0xlbiAqIHNpemVvZihGSVhQX0RCTCkpOworCisgICAgICAgICAgICAgIC8qIFBhcnRpY3VsYXIgZXhwb25lbnQgb2YgdGhlIGNvbXB1dGVkL29yaWdpbmFsICJkbXhfcmVfcHJldiIgbXVzdAorICAgICAgICAgICAgICAgKiBiZSBrZXB0IGZvciB0aGUgdGlsZSBNUyBjYWxjdWxhdGlvbnMgaWYgbmVjZXNzYXJ5LiovCisgICAgICAgICAgICAgICpzdG9yZV9kbXhfcmVfcHJldl9lID0gZG14X3JlX3ByZXZfZTsKKworICAgICAgICAgICAgfSAvKiBpZiAoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLldpbmRvd1NlcXVlbmNlICE9CisgICAgICAgICAgICAgICAgIEJMT0NLX1NIT1JUKSB8fCAod2luZG93ID09IDApICkgKi8KKworICAgICAgICAgIH0gLyogaWYgKCBwSm9pbnRTdGVyZW9EYXRhLT51c2VfcHJldl9mcmFtZSA9PSAxICkgKi8KKworICAgICAgICB9IC8qIGlmICggcEpvaW50U3RlcmVvRGF0YS0+Y29tcGxleF9jb2VmID09IDEgKSAqLworCisgICAgICAgIC8qIDIuIGNhbGN1bGF0ZSBkb3dubWl4IE1EQ1Qgb2YgY3VycmVudCBmcmFtZSAqLworCisgICAgICAgIC8qIHNldCBwb2ludGVyIHRvIHNjYWxlLWZhY3Rvci1iYW5kcyBvZiBjdXJyZW50IHdpbmRvdyAqLworICAgICAgICBTSE9SVCAqbGVmdFNjYWxlID0gJlNGQmxlZnRTY2FsZVt3aW5kb3cgKiAxNl07CisgICAgICAgIFNIT1JUICpyaWdodFNjYWxlID0gJlNGQnJpZ2h0U2NhbGVbd2luZG93ICogMTZdOworCisgICAgICAgIHNwZWNTY2FsZUxbd2luZG93XSA9IHNwZWNTY2FsZVJbd2luZG93XSA9IGZyYW1lTWF4U2NhbGU7CisKKyAgICAgICAgLyogYWRhcHQgc2NhbGluZy1mYWN0b3JzIHRvIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgIGlmIChjcGx4UHJlZGljdGlvbkRhdGEtPnVzZV9wcmV2X2ZyYW1lID09IDEpIHsKKyAgICAgICAgICBpZiAod2luZG93ID09IDApIHsKKyAgICAgICAgICAgIGlmIChkbXhfcmVfcHJldl9lIDwgZnJhbWVNYXhTY2FsZSkgeworICAgICAgICAgICAgICBpZiAobWFpbmJhbmRfZmxhZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZXMoZG14X3JlX3ByZXYsIHN0b3JlX2RteF9yZV9wcmV2LCB3aW5kb3dMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShmcmFtZU1heFNjYWxlIC0gZG14X3JlX3ByZXZfZSkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93TGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgIGRteF9yZV9wcmV2W2ldID4+PSAoZnJhbWVNYXhTY2FsZSAtIGRteF9yZV9wcmV2X2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKG1haW5iYW5kX2ZsYWcgPT0gMCkgeworICAgICAgICAgICAgICAgIEZES21lbWNweShkbXhfcmVfcHJldiwgc3RvcmVfZG14X3JlX3ByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd0xlbiAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHNwZWNTY2FsZUxbMF0gPSBkbXhfcmVfcHJldl9lOworICAgICAgICAgICAgICBzcGVjU2NhbGVSWzBdID0gZG14X3JlX3ByZXZfZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeyAvKiB3aW5kb3cgIT0gMCAqLworICAgICAgICAgICAgRkRLX0FTU0VSVChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLldpbmRvd1NlcXVlbmNlID09CisgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NIT1JUKTsKKyAgICAgICAgICAgIGlmIChzcGVjU2NhbGVMW3dpbmRvdyAtIDFdIDwgZnJhbWVNYXhTY2FsZSkgeworICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd0xlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgZG14X3JlW3dpbmRvd0xlbiAqICh3aW5kb3cgLSAxKSArIGldID4+PQorICAgICAgICAgICAgICAgICAgICAoZnJhbWVNYXhTY2FsZSAtIHNwZWNTY2FsZUxbd2luZG93IC0gMV0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzcGVjU2NhbGVMW3dpbmRvd10gPSBzcGVjU2NhbGVMW3dpbmRvdyAtIDFdOworICAgICAgICAgICAgICBzcGVjU2NhbGVSW3dpbmRvd10gPSBzcGVjU2NhbGVSW3dpbmRvdyAtIDFdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBpZiAoIHBKb2ludFN0ZXJlb0RhdGEtPnVzZV9wcmV2X2ZyYW1lID09IDEgKSAqLworCisgICAgICAgIC8qIHNjYWxpbmcgZmFjdG9ycyBvZiBib3RoIGNoYW5uZWxzIG91Z2h0IHRvIGJlIGVxdWFsIG5vdyAqLworICAgICAgICBGREtfQVNTRVJUKHNwZWNTY2FsZUxbd2luZG93XSA9PSBzcGVjU2NhbGVSW3dpbmRvd10pOworCisgICAgICAgIC8qIHJlc2NhbGUgc2lnbmFsIGFuZCBjYWxjdWxhdGUgZG93bm1peCBNRENUICovCisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBtYXhfc2ZiX3N0ZTsgYmFuZCsrKSB7CisgICAgICAgICAgLyogZmlyc3QgYWRhcHQgc2NhbGluZyBvZiBjdXJyZW50IGJhbmQgdG8gc2NhbGluZyBvZiBjdXJyZW50IHdpbmRvdyA9PgorICAgICAgICAgICAqIHNoaWZ0IHNpZ25hbCByaWdodCAqLworICAgICAgICAgIGludCBsU2NhbGUgPSBsZWZ0U2NhbGVbYmFuZF07CisgICAgICAgICAgaW50IHJTY2FsZSA9IHJpZ2h0U2NhbGVbYmFuZF07CisKKyAgICAgICAgICBsU2NhbGUgPSBmTWluKERGUkFDVF9CSVRTIC0gMSwgc3BlY1NjYWxlTFt3aW5kb3ddIC0gbFNjYWxlKTsKKyAgICAgICAgICByU2NhbGUgPSBmTWluKERGUkFDVF9CSVRTIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNTY2FsZUxbd2luZG93XSAtIHJTY2FsZSk7IC8qIEwgb3IgUiBkb2Vzbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjU2NhbGVzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgYXQgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgKi8KKworICAgICAgICAgIC8qIFdyaXRlIGJhY2sgdG8gc2ZiIHNjYWxlIHRvIGNvdmVyIHRoZSBjYXNlIHdoZW4gbWF4X3NmYl9zdGUgPAorICAgICAgICAgICAqIG1heF9zZmIgKi8KKyAgICAgICAgICBsZWZ0U2NhbGVbYmFuZF0gPSByaWdodFNjYWxlW2JhbmRdID0gc3BlY1NjYWxlTFt3aW5kb3ddOworCisgICAgICAgICAgZm9yIChpbnQgaSA9IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmRdOworICAgICAgICAgICAgICAgaSA8IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmQgKyAxXTsgaSsrKSB7CisgICAgICAgICAgICBzcGVjdHJ1bUxbd2luZG93TGVuICogd2luZG93ICsgaV0gPj49IGxTY2FsZTsKKyAgICAgICAgICAgIHNwZWN0cnVtUlt3aW5kb3dMZW4gKiB3aW5kb3cgKyBpXSA+Pj0gclNjYWxlOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIG5vdyBjYWxjdWxhdGUgZG93bm1peCBNRENUICovCisgICAgICAgICAgaWYgKHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSAmIGdyb3VwTWFzaykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmRdOworICAgICAgICAgICAgICAgICBpIDwgcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZCArIDFdOyBpKyspIHsKKyAgICAgICAgICAgICAgZG14X3JlW3dpbmRvd0xlbiAqIHdpbmRvdyArIGldID0KKyAgICAgICAgICAgICAgICAgIHNwZWN0cnVtTFt3aW5kb3dMZW4gKiB3aW5kb3cgKyBpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNwbHhQcmVkaWN0aW9uRGF0YS0+cHJlZF9kaXIgPT0gMCkgeworICAgICAgICAgICAgICBmb3IgKGludCBpID0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF07CisgICAgICAgICAgICAgICAgICAgaSA8IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmQgKyAxXTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZG14X3JlW3dpbmRvd0xlbiAqIHdpbmRvdyArIGldID0KKyAgICAgICAgICAgICAgICAgICAgKHNwZWN0cnVtTFt3aW5kb3dMZW4gKiB3aW5kb3cgKyBpXSArCisgICAgICAgICAgICAgICAgICAgICBzcGVjdHJ1bVJbd2luZG93TGVuICogd2luZG93ICsgaV0pID4+CisgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgICAgICAgICAgICAgICBpIDwgcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZCArIDFdOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkbXhfcmVbd2luZG93TGVuICogd2luZG93ICsgaV0gPQorICAgICAgICAgICAgICAgICAgICAoc3BlY3RydW1MW3dpbmRvd0xlbiAqIHdpbmRvdyArIGldIC0KKyAgICAgICAgICAgICAgICAgICAgIHNwZWN0cnVtUlt3aW5kb3dMZW4gKiB3aW5kb3cgKyBpXSkgPj4KKyAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICB9IC8qIGZvciAoIGJhbmQ9MDsgYmFuZDxtYXhfc2ZiX3N0ZTsgYmFuZCsrICkgKi8KKyAgICAgICAgLyogQ2xlYW4gdW50aWwgdGhlIGVuZCAqLworICAgICAgICBmb3IgKGludCBpID0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbbWF4X3NmYl9zdGVfb3V0c2lkZV07CisgICAgICAgICAgICAgaSA8IHdpbmRvd0xlbjsgaSsrKSB7CisgICAgICAgICAgZG14X3JlW3dpbmRvd0xlbiAqIHdpbmRvdyArIGldID0gKEZJWFBfREJMKTA7CisgICAgICAgIH0KKworICAgICAgICAvKiAzLiBjYWxjdWxhdGUgTURTVC1wb3J0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgZnJhbWUuICovCisgICAgICAgIGlmIChjcGx4UHJlZGljdGlvbkRhdGEtPmNvbXBsZXhfY29lZiA9PSAxKSB7CiAgICAgICAgICAgewotICAgICAgICAgICAgRklYUF9EQkwgbGVmdENvZWZmaWNpZW50ICA9IGxlZnRTcGVjdHJ1bSBbaW5kZXhdIDsKLSAgICAgICAgICAgIEZJWFBfREJMIHJpZ2h0Q29lZmZpY2llbnQgPSByaWdodFNwZWN0cnVtIFtpbmRleF0gOworICAgICAgICAgICAgLyogMy4xIG1vdmUgcG9pbnRlciBpbiBmaWx0ZXItY29lZmZpY2llbnQgdGFibGUgaW4gY2FzZSBvZiBzaG9ydAorICAgICAgICAgICAgICogd2luZG93IHNlcXVlbmNlICovCisgICAgICAgICAgICAvKiAgICAgKG90aGVyIGNvZWZmaWNpZW50cyBhcmUgdXRpbGl6ZWQgZm9yIHRoZSBsYXN0IDcgc2hvcnQKKyAgICAgICAgICAgICAqIHdpbmRvd3MpICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5XaW5kb3dTZXF1ZW5jZSA9PQorICAgICAgICAgICAgICAgICBCTE9DS19TSE9SVCkgJiYKKyAgICAgICAgICAgICAgICAod2luZG93ICE9IDApKSB7CisgICAgICAgICAgICAgIHBDb2VmZiA9IG1kc3RfZmlsdF9jb2VmX2N1cnJbY3VycmVudFNoYXBlXTsKKyAgICAgICAgICAgICAgcENvZWZmUHJldiA9IG1kc3RfZmlsdF9jb2VmX3ByZXZbY3VycmVudFNoYXBlXTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbGVmdENvZWZmaWNpZW50ID4+PSBsU2NhbGUgOwotICAgICAgICAgICAgcmlnaHRDb2VmZmljaWVudCA+Pj0gclNjYWxlIDsKKyAgICAgICAgICAgIC8qIFRoZSBsZW5ndGggb2YgdGhlIGZpbHRlciBwcm9jZXNzaW5nIG11c3QgYmUgZXh0ZW5kZWQgYmVjYXVzZSBvZgorICAgICAgICAgICAgICogZmlsdGVyIGJvdW5kYXJ5IHByb2JsZW1zICovCisgICAgICAgICAgICBpbnQgZXh0ZW5kZWRfYmFuZCA9IGZNaW4oCisgICAgICAgICAgICAgICAgcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbbWF4X3NmYl9zdGVfb3V0c2lkZV0gKyA3LCB3aW5kb3dMZW4pOwogCi0gICAgICAgICAgICBsZWZ0U3BlY3RydW0gW2luZGV4XSA9IGxlZnRDb2VmZmljaWVudCArIHJpZ2h0Q29lZmZpY2llbnQgOwotICAgICAgICAgICAgcmlnaHRTcGVjdHJ1bSBbaW5kZXhdID0gbGVmdENvZWZmaWNpZW50IC0gcmlnaHRDb2VmZmljaWVudCA7CisgICAgICAgICAgICAvKiAzLjIuIGVzdGltYXRlIGRvd25taXggTURTVCBmcm9tIGN1cnJlbnQgZnJhbWUgZG93bm1peCBNRENUICovCisgICAgICAgICAgICBpZiAoKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8uV2luZG93U2VxdWVuY2UgPT0KKyAgICAgICAgICAgICAgICAgQkxPQ0tfU0hPUlQpICYmCisgICAgICAgICAgICAgICAgKHdpbmRvdyAhPSAwKSkgeworICAgICAgICAgICAgICBDSm9pbnRTdGVyZW9fZmlsdGVyQW5kQWRkKCZkbXhfcmVbd2luZG93TGVuICogd2luZG93XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZF9iYW5kLCB3aW5kb3dMZW4sIHBDb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG14X2ltW3dpbmRvd0xlbiAqIHdpbmRvd10sIDEpOworCisgICAgICAgICAgICAgIENKb2ludFN0ZXJlb19maWx0ZXJBbmRBZGQoJmRteF9yZVt3aW5kb3dMZW4gKiAod2luZG93IC0gMSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkX2JhbmQsIHdpbmRvd0xlbiwgcENvZWZmUHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG14X2ltW3dpbmRvd0xlbiAqIHdpbmRvd10sIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgQ0pvaW50U3RlcmVvX2ZpbHRlckFuZEFkZChkbXhfcmUsIGV4dGVuZGVkX2JhbmQsIHdpbmRvd0xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmYsIGRteF9pbSwgMSk7CisKKyAgICAgICAgICAgICAgaWYgKGNwbHhQcmVkaWN0aW9uRGF0YS0+dXNlX3ByZXZfZnJhbWUgPT0gMSkgeworICAgICAgICAgICAgICAgIENKb2ludFN0ZXJlb19maWx0ZXJBbmRBZGQoZG14X3JlX3ByZXYsIGV4dGVuZGVkX2JhbmQsIHdpbmRvd0xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmZlByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG14X2ltW3dpbmRvd0xlbiAqIHdpbmRvd10sIDApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICB9IC8qIGlmKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnRyYW5zZm9ybV9zcGxpdHRpbmdfYWN0aXZlKSAqLworICAgICAgICB9ICAgLyogaWYgKCBwSm9pbnRTdGVyZW9EYXRhLT5jb21wbGV4X2NvZWYgPT0gMSApICovCisKKyAgICAgICAgLyogNC4gdXBtaXggcHJvY2VzcyAqLworICAgICAgICBJTlQgcHJlZF9kaXIgPSBjcGx4UHJlZGljdGlvbkRhdGEtPnByZWRfZGlyID8gLTEgOiAxOworICAgICAgICAvKiAwLjEgaW4gUS0zLjM0ICovCisgICAgICAgIGNvbnN0IEZJWFBfREJMIHBvaW50T25lID0gMHg2NjY2NjY2NjsgLyogMC44ICovCisgICAgICAgIC8qIFNoaWZ0IHZhbHVlIGZvciB0aGUgZG93bm1peCAqLworICAgICAgICBjb25zdCBJTlQgc2hpZnRfZG14ID0gU0ZfRk5BX0NPRUZGUyArIDE7CisKKyAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG1heF9zZmJfc3RlX291dHNpZGU7IGJhbmQrKykgeworICAgICAgICAgIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gJiBncm91cE1hc2spIHsKKyAgICAgICAgICAgIEZJWFBfU0dMIHRlbXBSZSA9CisgICAgICAgICAgICAgICAgKEZJWFBfU0dMKWNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9yZVtncm91cF1bYmFuZF07CisgICAgICAgICAgICBGSVhQX1NHTCB0ZW1wSW0gPQorICAgICAgICAgICAgICAgIChGSVhQX1NHTCljcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfaW1bZ3JvdXBdW2JhbmRdOworCisgICAgICAgICAgICAvKiBGaW5kIHRoZSBtaW5pbXVtIGNvbW1vbiBoZWFkcm9vbSBmb3IgYWxwaGFfcmUgYW5kIGFscGhhX2ltICovCisgICAgICAgICAgICBpbnQgYWxwaGFfcmVfaGVhZHJvb20gPSBDb3VudExlYWRpbmdCaXRzKChJTlQpdGVtcFJlKSAtIDE2OworICAgICAgICAgICAgaWYgKHRlbXBSZSA9PSAoRklYUF9TR0wpMCkgYWxwaGFfcmVfaGVhZHJvb20gPSAxNTsKKyAgICAgICAgICAgIGludCBhbHBoYV9pbV9oZWFkcm9vbSA9IENvdW50TGVhZGluZ0JpdHMoKElOVCl0ZW1wSW0pIC0gMTY7CisgICAgICAgICAgICBpZiAodGVtcEltID09IChGSVhQX1NHTCkwKSBhbHBoYV9pbV9oZWFkcm9vbSA9IDE1OworICAgICAgICAgICAgaW50IHZhbCA9IGZNaW4oYWxwaGFfcmVfaGVhZHJvb20sIGFscGhhX2ltX2hlYWRyb29tKTsKKworICAgICAgICAgICAgLyogTXVsdGlwbHkgYWxwaGEgYnkgMC4xIHdpdGggbWF4aW11bSBwcmVjaXNpb24gKi8KKyAgICAgICAgICAgIEZES19BU1NFUlQodmFsID49IDApOworICAgICAgICAgICAgRklYUF9EQkwgYWxwaGFfcmVfdG1wID0gZk11bHQoKEZJWFBfU0dMKSh0ZW1wUmUgPDwgdmFsKSwgcG9pbnRPbmUpOworICAgICAgICAgICAgRklYUF9EQkwgYWxwaGFfaW1fdG1wID0gZk11bHQoKEZJWFBfU0dMKSh0ZW1wSW0gPDwgdmFsKSwgcG9pbnRPbmUpOworCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgYWxwaGEgZXhwb25lbnQgKi8KKyAgICAgICAgICAgIC8qIChRLTMuMzQgKiBRMTUuMCkgc2hpZnRlZCBsZWZ0IGJ5ICJ2YWwiICovCisgICAgICAgICAgICBpbnQgYWxwaGFfcmVfZXhwID0gLTMgKyAxNSAtIHZhbDsKKworICAgICAgICAgICAgaW50IGhlbHAzX3NoaWZ0ID0gYWxwaGFfcmVfZXhwICsgMTsKKworICAgICAgICAgICAgRklYUF9EQkwgKnAyQ29lZmZMID0gJigKKyAgICAgICAgICAgICAgICBzcGVjdHJ1bUxbd2luZG93TGVuICogd2luZG93ICsgcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF1dKTsKKyAgICAgICAgICAgIEZJWFBfREJMICpwMkNvZWZmUiA9ICYoCisgICAgICAgICAgICAgICAgc3BlY3RydW1SW3dpbmRvd0xlbiAqIHdpbmRvdyArIHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmRdXSk7CisgICAgICAgICAgICBGSVhQX0RCTCAqcDJkbXhJbSA9CisgICAgICAgICAgICAgICAgJihkbXhfaW1bd2luZG93TGVuICogd2luZG93ICsgcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF1dKTsKKyAgICAgICAgICAgIEZJWFBfREJMICpwMmRteFJlID0KKyAgICAgICAgICAgICAgICAmKGRteF9yZVt3aW5kb3dMZW4gKiB3aW5kb3cgKyBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kXV0pOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF07CisgICAgICAgICAgICAgICAgIGkgPCBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kICsgMV07IGkrKykgeworICAgICAgICAgICAgICAvKiBDYWxjdWxhdGluZyBoZWxwZXIgdGVybToKKyAgICAgICAgICAgICAgICAgICAgc2lkZSA9IHNwZWNSW2ldIC0gYWxwaGFfcmVbaV0gKiBkbXhfcmVbaV0gLSBhbHBoYV9pbVtpXSAqCisgICAgICAgICAgICAgICAgZG14X2ltW2ldOworCisgICAgICAgICAgICAgICAgSGVyZSAiZG14X3JlIiBtYXkgYmUgdGhlIHNhbWUgYXMgInNwZWNMIiBvciBhbHRlcm5hdGl2ZWx5IGtlZXAKKyAgICAgICAgICAgICAgICB0aGUgZG93bm1peC4gImRteF9yZSIgYW5kICJzcGVjTCIgYXJlIHR3byBkaWZmZXJlbnQgcG9pbnRlcnMKKyAgICAgICAgICAgICAgICBwb2ludGluZyB0byBzZXBhcmF0ZSBhcnJheXMsIHdoaWNoIG1heSBvciBtYXkgbm90IGNvbnRhaW4gdGhlCisgICAgICAgICAgICAgICAgc2FtZSBkYXRhICh3aXRoIGRpZmZlcmVudCBzY2FsaW5nKS4KKyAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAvKiBoZWxwMTogYWxwaGFfcmVbaV0gKiBkbXhfcmVbaV0gKi8KKyAgICAgICAgICAgICAgRklYUF9EQkwgaGVscDEgPSBmTXVsdERpdjIoYWxwaGFfcmVfdG1wLCAqcDJkbXhSZSsrKTsKKworICAgICAgICAgICAgICAvKiB0bXA6IGRteF9pbVtpXSAqLworICAgICAgICAgICAgICBGSVhQX0RCTCB0bXAgPSAoKnAyZG14SW0rKykgPDwgc2hpZnRfZG14OworCisgICAgICAgICAgICAgIC8qIGhlbHAyOiBhbHBoYV9pbVtpXSAqIGRteF9pbVtpXSAqLworICAgICAgICAgICAgICBGSVhQX0RCTCBoZWxwMiA9IGZNdWx0RGl2MihhbHBoYV9pbV90bXAsIHRtcCk7CisKKyAgICAgICAgICAgICAgLyogaGVscDM6IGFscGhhX3JlW2ldICogZG14X3JlW2ldICsgYWxwaGFfaW1baV0gKiBkbXhfaW1baV0gKi8KKyAgICAgICAgICAgICAgRklYUF9EQkwgaGVscDMgPSBoZWxwMSArIGhlbHAyOworCisgICAgICAgICAgICAgIC8qIHNpZGUgKD0gaGVscDQpID0gc3BlY1JbaV0gLSAoZG14X3JlW2ldICogc3BlY0xbaV0gKyBhbHBoYV9pbVtpXQorICAgICAgICAgICAgICAgKiAqIGRteF9pbVtpXSkgKi8KKyAgICAgICAgICAgICAgRklYUF9EQkwgaGVscDQgPSAqcDJDb2VmZlIgLSBzY2FsZVZhbHVlKGhlbHAzLCBoZWxwM19zaGlmdCk7CisKKyAgICAgICAgICAgICAgLyogV2UgY2FsY3VsYXRlIHRoZSBsZWZ0IGFuZCByaWdodCBvdXRwdXQgYnkgdXNpbmcgdGhlIGhlbHBlcgorICAgICAgICAgICAgICAgKiBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAvKiBzcGVjUltpXSA9IC0vKyAoc3BlY0xbaV0gLSBzaWRlKTsgKi8KKyAgICAgICAgICAgICAgKnAyQ29lZmZSID0KKyAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoKExPTkcpKCpwMkNvZWZmTCAtIGhlbHA0KSAqIChMT05HKXByZWRfZGlyKTsKKyAgICAgICAgICAgICAgcDJDb2VmZlIrKzsKKworICAgICAgICAgICAgICAvKiBzcGVjTFtpXSA9IHNwZWNMW2ldICsgc2lkZTsgKi8KKyAgICAgICAgICAgICAgKnAyQ29lZmZMID0gKnAyQ29lZmZMICsgaGVscDQ7CisgICAgICAgICAgICAgIHAyQ29lZmZMKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgIH0gLyogZm9yICggYmFuZD0wOyBiYW5kIDwgbWF4X3NmYl9zdGU7IGJhbmQrKyApICovCisgICAgICB9ICAgLyogZm9yICggZ3JvdXB3aW49MDsgZ3JvdXB3aW48cFdpbmRvd0dyb3VwTGVuZ3RoW2dyb3VwXTsgZ3JvdXB3aW4rKywKKyAgICAgICAgICAgICB3aW5kb3crKyApICovCisKKyAgICB9IC8qIGZvciAoIHdpbmRvdyA9IDAsIGdyb3VwID0gMDsgZ3JvdXAgPCB3aW5kb3dHcm91cHM7IGdyb3VwKysgKSAqLworCisgICAgLyogZnJlZSBzY3JhdGNoIGJ1ZmZlciAqLworICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKGRteF9pbSwgRklYUF9EQkwsIDEwMjQpOworCisgIH0gZWxzZSB7CisgICAgLyogTVMgc3RlcmVvICovCisKKyAgICBmb3IgKHdpbmRvdyA9IDAsIGdyb3VwID0gMDsgZ3JvdXAgPCB3aW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICAgIGdyb3VwTWFzayA9IDEgPDwgZ3JvdXA7CisKKyAgICAgIGZvciAoaW50IGdyb3Vwd2luID0gMDsgZ3JvdXB3aW4gPCBwV2luZG93R3JvdXBMZW5ndGhbZ3JvdXBdOworICAgICAgICAgICBncm91cHdpbisrLCB3aW5kb3crKykgeworICAgICAgICBGSVhQX0RCTCAqbGVmdFNwZWN0cnVtLCAqcmlnaHRTcGVjdHJ1bTsKKyAgICAgICAgU0hPUlQgKmxlZnRTY2FsZSA9ICZTRkJsZWZ0U2NhbGVbd2luZG93ICogMTZdOworICAgICAgICBTSE9SVCAqcmlnaHRTY2FsZSA9ICZTRkJyaWdodFNjYWxlW3dpbmRvdyAqIDE2XTsKKworICAgICAgICBsZWZ0U3BlY3RydW0gPQorICAgICAgICAgICAgU1BFQyhzcGVjdHJ1bUwsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+Z3JhbnVsZUxlbmd0aCk7CisgICAgICAgIHJpZ2h0U3BlY3RydW0gPQorICAgICAgICAgICAgU1BFQyhzcGVjdHJ1bVIsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+Z3JhbnVsZUxlbmd0aCk7CisKKyAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG1heF9zZmJfc3RlX291dHNpZGU7IGJhbmQrKykgeworICAgICAgICAgIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gJiBncm91cE1hc2spIHsKKyAgICAgICAgICAgIGludCBsU2NhbGUgPSBsZWZ0U2NhbGVbYmFuZF07CisgICAgICAgICAgICBpbnQgclNjYWxlID0gcmlnaHRTY2FsZVtiYW5kXTsKKyAgICAgICAgICAgIGludCBjb21tb25TY2FsZSA9IGxTY2FsZSA+IHJTY2FsZSA/IGxTY2FsZSA6IHJTY2FsZTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXRDdXJyQmFuZCwgb2Zmc2V0TmV4dEJhbmQ7CisKKyAgICAgICAgICAgIC8qIElTTy9JRUMgMTQ0OTYtMyBDaGFwdGVyIDQuNi44LjEuMSA6CisgICAgICAgICAgICAgICBNL1Mgam9pbnQgY2hhbm5lbCBjb2RpbmcgY2FuIG9ubHkgYmUgdXNlZCBpZiBjb21tb25fd2luZG93IGlzIDEuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEZES19BU1NFUlQoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pID09CisgICAgICAgICAgICAgICAgICAgICAgIEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5pY3NJbmZvKSk7CisgICAgICAgICAgICBGREtfQVNTRVJUKEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSA9PQorICAgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+aWNzSW5mbykpOworCisgICAgICAgICAgICBjb21tb25TY2FsZSsrOworICAgICAgICAgICAgbGVmdFNjYWxlW2JhbmRdID0gY29tbW9uU2NhbGU7CisgICAgICAgICAgICByaWdodFNjYWxlW2JhbmRdID0gY29tbW9uU2NhbGU7CisKKyAgICAgICAgICAgIGxTY2FsZSA9IGZNaW4oREZSQUNUX0JJVFMgLSAxLCBjb21tb25TY2FsZSAtIGxTY2FsZSk7CisgICAgICAgICAgICByU2NhbGUgPSBmTWluKERGUkFDVF9CSVRTIC0gMSwgY29tbW9uU2NhbGUgLSByU2NhbGUpOworCisgICAgICAgICAgICBGREtfQVNTRVJUKGxTY2FsZSA+PSAwICYmIHJTY2FsZSA+PSAwKTsKKworICAgICAgICAgICAgb2Zmc2V0Q3VyckJhbmQgPSBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgICAgICAgIG9mZnNldE5leHRCYW5kID0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZCArIDFdOworCisgICAgICAgICAgICBDSm9pbnRTdGVyZW9fR2VuZXJhdGVNU091dHB1dCgmKGxlZnRTcGVjdHJ1bVtvZmZzZXRDdXJyQmFuZF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihyaWdodFNwZWN0cnVtW29mZnNldEN1cnJCYW5kXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsU2NhbGUsIHJTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldE5leHRCYW5kIC0gb2Zmc2V0Q3VyckJhbmQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTCA+IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCkgeworICAgICAgICAgIGZvciAoOyBiYW5kIDwgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTDsgYmFuZCsrKSB7CisgICAgICAgICAgICBpZiAocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdICYgZ3JvdXBNYXNrKSB7CisgICAgICAgICAgICAgIHJpZ2h0U2NhbGVbYmFuZF0gPSBsZWZ0U2NhbGVbYmFuZF07CisKKyAgICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgICAgICAgICAgICAgICBpbmRleCA8IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmQgKyAxXTsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIEZJWFBfREJMIGxlZnRDb2VmZmljaWVudCA9IGxlZnRTcGVjdHJ1bVtpbmRleF07CisgICAgICAgICAgICAgICAgLyogRklYUF9EQkwgcmlnaHRDb2VmZmljaWVudCA9IChGSVhQX0RCTCkwOyAqLworICAgICAgICAgICAgICAgIHJpZ2h0U3BlY3RydW1baW5kZXhdID0gbGVmdENvZWZmaWNpZW50OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFIgPiBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQpIHsKKyAgICAgICAgICBmb3IgKDsgYmFuZCA8IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFI7IGJhbmQrKykgeworICAgICAgICAgICAgaWYgKHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSAmIGdyb3VwTWFzaykgeworICAgICAgICAgICAgICBsZWZ0U2NhbGVbYmFuZF0gPSByaWdodFNjYWxlW2JhbmRdOworCisgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF07CisgICAgICAgICAgICAgICAgICAgaW5kZXggPCBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kICsgMV07IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAvKiBGSVhQX0RCTCBsZWZ0Q29lZmZpY2llbnQgID0gKEZJWFBfREJMKTA7ICovCisgICAgICAgICAgICAgICAgRklYUF9EQkwgcmlnaHRDb2VmZmljaWVudCA9IHJpZ2h0U3BlY3RydW1baW5kZXhdOworCisgICAgICAgICAgICAgICAgbGVmdFNwZWN0cnVtW2luZGV4XSA9IHJpZ2h0Q29lZmZpY2llbnQ7CisgICAgICAgICAgICAgICAgcmlnaHRTcGVjdHJ1bVtpbmRleF0gPSAtcmlnaHRDb2VmZmljaWVudDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgfQogCi0gIC8qIFJlc2V0IE1zVXNlZCBmbGFncyBpZiBubyBleHBsaWNpdCBzaWduYWxsaW5nIHdhcyB0cmFuc21pdHRlZC4gTmVjZXNzYXJ5IGZvciBpbnRlbnNpdHkgY29kaW5nLgotICAgICBQTlMgY29ycmVsYXRpb24gc2lnbmFsbGluZyB3YXMgbWFwcGVkIGJlZm9yZSBjYWxsaW5nIENKb2ludFN0ZXJlb19BcHBseU1TKCkuICovCi0gIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5Nc01hc2tQcmVzZW50ID09IDIpIHsKLSAgICBGREttZW1jbGVhcihwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWQsIEpvaW50U3RlcmVvTWF4aW11bUJhbmRzICogc2l6ZW9mKFVDSEFSKSk7CisgICAgLyogUmVzZXQgTXNVc2VkIGZsYWdzIGlmIG5vIGV4cGxpY2l0IHNpZ25hbGxpbmcgd2FzIHRyYW5zbWl0dGVkLiBOZWNlc3NhcnkKKyAgICAgICBmb3IgaW50ZW5zaXR5IGNvZGluZy4gUE5TIGNvcnJlbGF0aW9uIHNpZ25hbGxpbmcgd2FzIG1hcHBlZCBiZWZvcmUKKyAgICAgICBjYWxsaW5nIENKb2ludFN0ZXJlb19BcHBseU1TKCkuICovCisgICAgaWYgKHBKb2ludFN0ZXJlb0RhdGEtPk1zTWFza1ByZXNlbnQgPT0gMikgeworICAgICAgRkRLbWVtY2xlYXIocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkLAorICAgICAgICAgICAgICAgICAgSm9pbnRTdGVyZW9NYXhpbXVtQmFuZHMgKiBzaXplb2YoVUNIQVIpKTsKKyAgICB9CiAgIH0KIH0KIAotdm9pZCBDSm9pbnRTdGVyZW9fQXBwbHlJUygKLSAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwKLSAgICAgICAgY29uc3QgU0hPUlQgKnBTY2FsZUZhY3RvckJhbmRPZmZzZXRzLAotICAgICAgICBjb25zdCBVQ0hBUiAqcFdpbmRvd0dyb3VwTGVuZ3RoLAotICAgICAgICBjb25zdCBpbnQgd2luZG93R3JvdXBzLAotICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkLAotICAgICAgICBjb25zdCBVSU5UIENvbW1vbldpbmRvdwotICAgICAgICApCi17Ci0gIENKb2ludFN0ZXJlb0RhdGEgKnBKb2ludFN0ZXJlb0RhdGEgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YTsKK3ZvaWQgQ0pvaW50U3RlcmVvX0FwcGx5SVMoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKnBTY2FsZUZhY3RvckJhbmRPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqcFdpbmRvd0dyb3VwTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgd2luZG93R3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKSB7CisgIENKb2ludFN0ZXJlb0RhdGEgKnBKb2ludFN0ZXJlb0RhdGEgPQorICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGE7CiAKLSAgZm9yIChpbnQgd2luZG93PTAsZ3JvdXA9MDsgZ3JvdXA8d2luZG93R3JvdXBzOyBncm91cCsrKQotICB7CisgIGZvciAoaW50IHdpbmRvdyA9IDAsIGdyb3VwID0gMDsgZ3JvdXAgPCB3aW5kb3dHcm91cHM7IGdyb3VwKyspIHsKICAgICBVQ0hBUiAqQ29kZUJvb2s7CiAgICAgU0hPUlQgKlNjYWxlRmFjdG9yOwogICAgIFVDSEFSIGdyb3VwTWFzayA9IDEgPDwgZ3JvdXA7CiAKLSAgICBDb2RlQm9vayA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5wRHluRGF0YS0+YUNvZGVCb29rW2dyb3VwKjE2XTsKLSAgICBTY2FsZUZhY3RvciA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2dyb3VwKjE2XTsKKyAgICBDb2RlQm9vayA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5wRHluRGF0YS0+YUNvZGVCb29rW2dyb3VwICogMTZdOworICAgIFNjYWxlRmFjdG9yID0KKyAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbZ3JvdXAgKiAxNl07CiAKLSAgICBmb3IgKGludCBncm91cHdpbj0wOyBncm91cHdpbjxwV2luZG93R3JvdXBMZW5ndGhbZ3JvdXBdOyBncm91cHdpbisrLCB3aW5kb3crKykKLSAgICB7CisgICAgZm9yIChpbnQgZ3JvdXB3aW4gPSAwOyBncm91cHdpbiA8IHBXaW5kb3dHcm91cExlbmd0aFtncm91cF07CisgICAgICAgICBncm91cHdpbisrLCB3aW5kb3crKykgewogICAgICAgRklYUF9EQkwgKmxlZnRTcGVjdHJ1bSwgKnJpZ2h0U3BlY3RydW07Ci0gICAgICBTSE9SVCAqbGVmdFNjYWxlID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5hU2ZiU2NhbGVbd2luZG93KjE2XTsKLSAgICAgIFNIT1JUICpyaWdodFNjYWxlID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnBEeW5EYXRhLT5hU2ZiU2NhbGVbd2luZG93KjE2XTsKKyAgICAgIFNIT1JUICpsZWZ0U2NhbGUgPQorICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+YVNmYlNjYWxlW3dpbmRvdyAqIDE2XTsKKyAgICAgIFNIT1JUICpyaWdodFNjYWxlID0KKyAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cER5bkRhdGEtPmFTZmJTY2FsZVt3aW5kb3cgKiAxNl07CiAgICAgICBpbnQgYmFuZDsKIAotICAgICAgbGVmdFNwZWN0cnVtID0gU1BFQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5ncmFudWxlTGVuZ3RoKTsKLSAgICAgIHJpZ2h0U3BlY3RydW0gPSBTUEVDKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnBTcGVjdHJhbENvZWZmaWNpZW50LCB3aW5kb3csIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmdyYW51bGVMZW5ndGgpOworICAgICAgbGVmdFNwZWN0cnVtID0gU1BFQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5ncmFudWxlTGVuZ3RoKTsKKyAgICAgIHJpZ2h0U3BlY3RydW0gPSBTUEVDKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5ncmFudWxlTGVuZ3RoKTsKIAotICAgICAgZm9yIChiYW5kPTA7IGJhbmQ8c2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspCi0gICAgICB7Ci0gICAgICAgIGlmICgoQ29kZUJvb2sgW2JhbmRdID09IElOVEVOU0lUWV9IQ0IpIHx8Ci0gICAgICAgICAgICAoQ29kZUJvb2sgW2JhbmRdID09IElOVEVOU0lUWV9IQ0IyKSkKLSAgICAgICAgewotICAgICAgICAgIGludCBiYW5kU2NhbGUgPSAtKFNjYWxlRmFjdG9yIFtiYW5kXSArIDEwMCkgOworICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICAgIGlmICgoQ29kZUJvb2tbYmFuZF0gPT0gSU5URU5TSVRZX0hDQikgfHwKKyAgICAgICAgICAgIChDb2RlQm9va1tiYW5kXSA9PSBJTlRFTlNJVFlfSENCMikpIHsKKyAgICAgICAgICBpbnQgYmFuZFNjYWxlID0gLShTY2FsZUZhY3RvcltiYW5kXSArIDEwMCk7CiAKLSAgICAgICAgICBpbnQgbXNiID0gYmFuZFNjYWxlID4+IDIgOwotICAgICAgICAgIGludCBsc2IgPSBiYW5kU2NhbGUgJiAweDAzIDsKKyAgICAgICAgICBpbnQgbXNiID0gYmFuZFNjYWxlID4+IDI7CisgICAgICAgICAgaW50IGxzYiA9IGJhbmRTY2FsZSAmIDB4MDM7CiAKICAgICAgICAgICAvKiBleHBvbmVudCBvZiBNYW50aXNzYVRhYmxlW2xzYl1bMF0gaXMgMSwgdGh1cyBtc2IrMSBiZWxvdy4gKi8KICAgICAgICAgICBGSVhQX0RCTCBzY2FsZSA9IE1hbnRpc3NhVGFibGVbbHNiXVswXTsKIAogICAgICAgICAgIC8qIElTTy9JRUMgMTQ0OTYtMyBDaGFwdGVyIDQuNi44LjIuMyA6Ci0gICAgICAgICAgICAgVGhlIHVzZSBvZiBpbnRlbnNpdHkgc3RlcmVvIGNvZGluZyBpcyBzaWduYWxlZCBieSB0aGUgdXNlIG9mIHRoZSBwc2V1ZG8gY29kZWJvb2tzCi0gICAgICAgICAgICAgSU5URU5TSVRZX0hDQiBhbmQgSU5URU5TSVRZX0hDQjIgKDE1IGFuZCAxNCkgb25seSBpbiB0aGUgcmlnaHQgY2hhbm5lbCBvZiBhCi0gICAgICAgICAgICAgY2hhbm5lbF9wYWlyX2VsZW1lbnQoKSBoYXZpbmcgYSBjb21tb24gaWNzX2luZm8oKSAoY29tbW9uX3dpbmRvdyA9PSAxKS4gKi8KLSAgICAgICAgICBGREtfQVNTRVJUKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSA9PSBHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+aWNzSW5mbykpOwotICAgICAgICAgIEZES19BU1NFUlQoR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pID09IEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5pY3NJbmZvKSk7CisgICAgICAgICAgICAgVGhlIHVzZSBvZiBpbnRlbnNpdHkgc3RlcmVvIGNvZGluZyBpcyBzaWduYWxlZCBieSB0aGUgdXNlIG9mIHRoZQorICAgICAgICAgICAgIHBzZXVkbyBjb2RlYm9va3MgSU5URU5TSVRZX0hDQiBhbmQgSU5URU5TSVRZX0hDQjIgKDE1IGFuZCAxNCkgb25seQorICAgICAgICAgICAgIGluIHRoZSByaWdodCBjaGFubmVsIG9mIGEgY2hhbm5lbF9wYWlyX2VsZW1lbnQoKSBoYXZpbmcgYSBjb21tb24KKyAgICAgICAgICAgICBpY3NfaW5mbygpIChjb21tb25fd2luZG93ID09IDEpLiAqLworICAgICAgICAgIEZES19BU1NFUlQoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pID09CisgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+aWNzSW5mbykpOworICAgICAgICAgIEZES19BU1NFUlQoR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pID09CisgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+aWNzSW5mbykpOwogCi0gICAgICAgICAgcmlnaHRTY2FsZVtiYW5kXSA9IGxlZnRTY2FsZVtiYW5kXSttc2IrMTsKKyAgICAgICAgICByaWdodFNjYWxlW2JhbmRdID0gbGVmdFNjYWxlW2JhbmRdICsgbXNiICsgMTsKIAotICAgICAgICAgIGlmIChDb21tb25XaW5kb3cgJiYgKHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSAmIGdyb3VwTWFzaykpCi0gICAgICAgICAgewotCisgICAgICAgICAgaWYgKHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSAmIGdyb3VwTWFzaykgewogICAgICAgICAgICAgaWYgKENvZGVCb29rW2JhbmRdID09IElOVEVOU0lUWV9IQ0IpIC8qIF9OT1RfIGluLXBoYXNlICovCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjYWxlID0gLXNjYWxlIDsKKyAgICAgICAgICAgICAgc2NhbGUgPSAtc2NhbGU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChDb2RlQm9va1tiYW5kXSA9PSBJTlRFTlNJVFlfSENCMikgLyogb3V0LW9mLXBoYXNlICovCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjYWxlID0gLXNjYWxlIDsKKyAgICAgICAgICAgICAgc2NhbGUgPSAtc2NhbGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogCi0gICAgICAgICAgZm9yIChpbnQgaW5kZXg9cFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF07IGluZGV4PHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmQrMV07IGluZGV4KyspCi0gICAgICAgICAgewotICAgICAgICAgICAgcmlnaHRTcGVjdHJ1bVtpbmRleF0gPSBmTXVsdChsZWZ0U3BlY3RydW1baW5kZXhdLHNjYWxlKTsKKyAgICAgICAgICBmb3IgKGludCBpbmRleCA9IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmRdOworICAgICAgICAgICAgICAgaW5kZXggPCBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kICsgMV07IGluZGV4KyspIHsKKyAgICAgICAgICAgIHJpZ2h0U3BlY3RydW1baW5kZXhdID0gZk11bHQobGVmdFNwZWN0cnVtW2luZGV4XSwgc2NhbGUpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9zdGVyZW8uaCBiL2xpYkFBQ2RlYy9zcmMvc3RlcmVvLmgKaW5kZXggODk5YjQ4NS4uYWY3YTc0ZiAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9zdGVyZW8uaAorKysgYi9saWJBQUNkZWMvc3JjL3N0ZXJlby5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDM1ICs5MCwxMDAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IGpvaW50IHN0ZXJlbyBwcm9jZXNzaW5nCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgU1RFUkVPX0gKICNkZWZpbmUgU1RFUkVPX0gKIAotCi0KICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCi1lbnVtCi17Ci0gIEpvaW50U3RlcmVvTWF4aW11bUdyb3VwcyA9IDgsCi0gIEpvaW50U3RlcmVvTWF4aW11bUJhbmRzID0gNjQKLX07CisjZGVmaW5lIFNGQl9QRVJfUFJFRF9CQU5EIDIKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKKyNkZWZpbmUgU1JfRk5BX09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAwIC8qIEFkZGl0aW9uYWwgc2NhbGluZyBvZiB0aGUgQ0pvaW50U3RlcmVvX2ZpbHRlckFuZEFkZCgpLW91dHB1dCB0byBhdm9pZCBcCisgICAgICAgb3ZlcmZsb3dzLiAgICAqLworICAgIC8qIFRoZSBzY2FsaW5nIGZhY3RvciBjYW4gYmUgc2V0IHRvIDAgaWYgdGhlIGNvZWZmaWNpZW50cyBhcmUgcHJlc2NhbGVkCisgICAgICogYXBwcm9wcmlhdGVseS4gKi8KKy8qIFByZXNjYWxpbmcgdmlhIGZhY3RvciBTRl9GTkFfQ09FRkZTIGlzIGRvbmUgYXQgY29tcGlsZS10aW1lIGJ1dCBzaG91bGQgb25seQorICogYmUgICAgICAqLworLyogdXRpbGl6ZWQgaWYgdGhlIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIEZJWFBfREJMLiAoY3AuIGFhY19yb20uY3BwLy5oKSAqLworCisvKiBUaGUgTk9fQ1BMWF9QUkVEX0JVR0ZJWC1zd2l0Y2ggd2FzIGludHJvZHVjZWQgdG8gZW5hYmxlIGRlY29kaW5nIG9mCisgICBjb25mb3JtYW5jZS1zdHJlYW1zIGluIHdheSB0aGF0IHRoZXkgYXJlIGNvbXBhcmFibGUgdG8gYnVnZ3kKKyAgIHJlZmVyZW5jZS1zdHJlYW1zLiBUaGlzIGlzIGVzdGFibGlzaGVkIGJ5IHN0b3JpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCisgICBmb3IgY29tcHV0YXRpb24gb2YgdGhlICJkb3dubWl4IE1EQ1Qgb2YgcHJldmlvdXMgZnJhbWUiLiBUaGlzIGlzIG5vdCBzdGFuZGFyZAorICAgY29tcGxpYW50LiBPbmNlIGNvcnJlY3QgcmVmZXJlbmNlLXN0cmVhbXMgZm9yIGNvbXBsZXgtc3RlcmVvLXByZWRpY3Rpb24gYXJlCisgICBhdmFpbGFibGUgdGhpcyBzd2l0Y2ggYmVjb21lcyBvYnNvbGV0ZS4KKyovCisvKiNkZWZpbmUgTk9fQ1BMWF9QUkVEX0JVR0ZJWCovCisKK2VudW0geyBKb2ludFN0ZXJlb01heGltdW1Hcm91cHMgPSA4LCBKb2ludFN0ZXJlb01heGltdW1CYW5kcyA9IDY0IH07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgcHJlZF9kaXI7ICAvLyAwID0gcHJlZGljdGlvbiBmcm9tIG1pZCB0byBzaWRlIGNoYW5uZWwsIDEgPSB2aWNlIHZlcnNhCisgIFVDSEFSCisgIGlnZl9wcmVkX2RpcjsgIC8vIDAgPSBwcmVkaWN0aW9uIGZyb20gbWlkIHRvIHNpZGUgY2hhbm5lbCwgMSA9IHZpY2UgdmVyc2EKKyAgVUNIQVIgY29tcGxleF9jb2VmOyAgICAvLyAwID0gYWxwaGFfcV9pbVt4XSBpcyAwIGZvciBhbGwgcHJlZGljdGlvbiBiYW5kcywgMSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxwaGFfcV9pbVt4XSBpcyB0cmFuc21pdHRlZCB2aWEgYml0c3RyZWFtCisgIFVDSEFSIHVzZV9wcmV2X2ZyYW1lOyAgLy8gMCA9IHVzZSBjdXJyZW50IGZyYW1lIGZvciBNRFNUIGVzdGltYXRpb24sIDEgPSB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGFuZCBwcmV2aW91cyBmcmFtZQorCisgIFNIT1JUIGFscGhhX3FfcmVbSm9pbnRTdGVyZW9NYXhpbXVtR3JvdXBzXVtKb2ludFN0ZXJlb01heGltdW1CYW5kc107CisgIFNIT1JUIGFscGhhX3FfaW1bSm9pbnRTdGVyZW9NYXhpbXVtR3JvdXBzXVtKb2ludFN0ZXJlb01heGltdW1CYW5kc107Cit9IENDcGx4UHJlZGljdGlvbkRhdGE7CisKKy8qIGpvaW50IHN0ZXJlbyBzY3JhdGNoIG1lbW9yeSAodmFsaWQgZm9yIHRoaXMgZnJhbWUpICovCit0eXBlZGVmIHN0cnVjdCB7CiAgIFVDSEFSIE1zTWFza1ByZXNlbnQ7Ci0gIFVDSEFSIE1zVXNlZFtKb2ludFN0ZXJlb01heGltdW1CYW5kc107IC8qITwgZXZlcnkgYXJyeSBlbGVtZW50IGNvbnRhaW5zIGZsYWdzIGZvciB1cCB0byA4IGdyb3VwcyAqLworICBVQ0hBUiBNc1VzZWRbSm9pbnRTdGVyZW9NYXhpbXVtQmFuZHNdOyAvKiE8IGV2ZXJ5IGFycnkgZWxlbWVudCBjb250YWlucyBmbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdXAgdG8gOCBncm91cHMuIHRoaXMgYXJyYXkgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbyB1dGlsaXplZCBmb3IgY29tcGxleCBzdGVyZW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbi4gKi8KKyAgVUNIQVIgSUdGX01zTWFza1ByZXNlbnQ7CisKKyAgVUNIQVIgY3BseF9wcmVkX2ZsYWc7IC8qIHN0ZXJlbyBjb21wbGV4IHByZWRpY3Rpb24gd2FzIHNpZ25hbGxlZCBmb3IgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgKi8KKyAgVUNIQVIgaWdmX2NwbHhfcHJlZF9mbGFnOworCisgIC8qIFRoZSBmb2xsb3dpbmcgYXJyYXkgYW5kIHZhcmlhYmxlIGFyZSBuZWVkZWQgZm9yIHRoZSBjYXNlICB3aGVuIElORiBpcworICAgKiBhY3RpdmUgKi8KKyAgRklYUF9EQkwgc3RvcmVfZG14X3JlX3ByZXZbMTAyNF07CisgIFNIT1JUIHN0b3JlX2RteF9yZV9wcmV2X2U7CisKIH0gQ0pvaW50U3RlcmVvRGF0YTsKIAorLyogam9pbnQgc3RlcmVvIHBlcnNpc3RlbnQgbWVtb3J5ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGNsZWFyU3BlY3RyYWxDb2VmZnM7IC8qIGluZGljYXRlcyB0aGF0IHRoZSBzcGVjdHJhbCBjb2VmZnMgbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkIGJlY2F1c2UgdGhlIHRyYW5zZm9ybSBzcGxpdHRpbmcgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgd2FzIGRpZmZlcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBGSVhQX0RCTCAqc2NyYXRjaEJ1ZmZlcjsgLyogcG9pbnRlciB0byBzY3JhdGNoIGJ1ZmZlciAqLworCisgIEZJWFBfREJMCisgICpzcGVjdHJhbENvZWZmc1syXTsgLyogc3BlY3RyYWwgY29lZmZpY2llbnRzIG9mIHRoaXMgY2hhbm5lbCB1dGlsaXplZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXggc3RlcmVvIHByZWRpY3Rpb24gKi8KKyAgU0hPUlQgKnNwZWNTY2FsZVsyXTsKKworICBTSE9SVCBhbHBoYV9xX3JlX3ByZXZbSm9pbnRTdGVyZW9NYXhpbXVtR3JvdXBzXVtKb2ludFN0ZXJlb01heGltdW1CYW5kc107CisgIFNIT1JUIGFscGhhX3FfaW1fcHJldltKb2ludFN0ZXJlb01heGltdW1Hcm91cHNdW0pvaW50U3RlcmVvTWF4aW11bUJhbmRzXTsKKworICBVQ0hBUiB3aW5TZXFQcmV2OworICBVQ0hBUiB3aW5TaGFwZVByZXY7CisgIFVDSEFSIHdpbkdyb3Vwc1ByZXY7CisKK30gQ0pvaW50U3RlcmVvUGVyc2lzdGVudERhdGE7CiAKIC8qIQogICBcYnJpZWYgUmVhZCBqb2ludCBzdGVyZW8gZGF0YSBmcm9tIGJpdHN0cmVhbQpAQCAtMTE1LDIwICsxOTEsMjEgQEAKICAgVGhlIGZ1bmN0aW9uIHJlYWRzIGpvaW50IHN0ZXJlbyBkYXRhIGZyb20gYml0c3RyZWFtLgogCiAgIFxwYXJhbSBicyBiaXQgc3RyZWFtIGhhbmRsZSBkYXRhIHNvdXJjZS4KLSAgXHBhcmFtIHBKb2ludFN0ZXJlb0RhdGEgcG9pbnRlciB0byBzdGVyZW8gZGF0YSBzdHJ1Y3R1cmUgdG8gcmVjZWl2ZSBkZWNvZGVkIGRhdGEuCi0gIFxwYXJhbSB3aW5kb3dHcm91cHMgbnVtYmVyIG9mIHdpbmRvdyBncm91cHMuCi0gIFxwYXJhbSBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHNjYWxlZmFjdG9yIGJhbmRzLgotICBccGFyYW0gZmxhZ3MgZGVjb2RlciBmbGFncworICBccGFyYW0gcEpvaW50U3RlcmVvRGF0YSBwb2ludGVyIHRvIHN0ZXJlbyBkYXRhIHN0cnVjdHVyZSB0byByZWNlaXZlIGRlY29kZWQKKyAgZGF0YS4gXHBhcmFtIHdpbmRvd0dyb3VwcyBudW1iZXIgb2Ygd2luZG93IGdyb3Vwcy4gXHBhcmFtCisgIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgc2NhbGVmYWN0b3IgYmFuZHMuIFxwYXJhbQorICBmbGFncyBkZWNvZGVyIGZsYWdzCiAKICAgXHJldHVybiAgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4KICovCi1pbnQgQ0pvaW50U3RlcmVvX1JlYWQoCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICBDSm9pbnRTdGVyZW9EYXRhICpwSm9pbnRTdGVyZW9EYXRhLAotICAgICAgICBpbnQgd2luZG93R3JvdXBzLAotICAgICAgICBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkLAotICAgICAgICBVSU5UIGZsYWdzCi0gICAgICAgICk7Ci0KK2ludCBDSm9pbnRTdGVyZW9fUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICBDSm9pbnRTdGVyZW9EYXRhICpwSm9pbnRTdGVyZW9EYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB3aW5kb3dHcm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWF4X3NmYl9zdGVfY2xlYXIsCisgICAgICAgICAgICAgICAgICAgICAgQ0pvaW50U3RlcmVvUGVyc2lzdGVudERhdGEgKnBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLAorICAgICAgICAgICAgICAgICAgICAgIENDcGx4UHJlZGljdGlvbkRhdGEgKmNwbHhQcmVkaWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgY3BseFByZWRpY3Rpb25BY3RpdiwgaW50IHNjYWxlRmFjdG9yQmFuZHNUb3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93U2VxdWVuY2UsIGNvbnN0IFVJTlQgZmxhZ3MpOwogCiAjZW5kaWYgLyogI2lmbmRlZiBTVEVSRU9fSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZV9kNHQ2NC5jcHAgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlX2Q0dDY0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2UwNmNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZV9kNHQ2NC5jcHAKQEAgLTAsMCArMSw0MzkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogQUNFTFAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzYWNkZWNfYWNlX2Q0dDY0LmgiCisKKyNkZWZpbmUgTF9TVUJGUiA2NCAvKiBTdWJmcmFtZSBzaXplICAgICAgICAgICAgICAqLworCisvKgorICogRF9BQ0VMUF9hZGRfcHVsc2UKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgcG9zICAgICAgICAgSTogcG9zaXRpb24gb2YgcHVsc2UKKyAqICAgIG5iX3B1bHNlICAgIEk6IG51bWJlciBvZiBwdWxzZXMKKyAqICAgIHRyYWNrICAgICAgIEk6IHRyYWNrCisgKiAgICBjb2RlICAgICAgICBPOiBmaXhlZCBjb2RlYm9vaworICoKKyAqIEZ1bmN0aW9uOgorICogICAgQWRkIHB1bHNlcyB0byBmaXhlZCBjb2RlYm9vaworICoKKyAqIFJldHVybnM6CisgKiAgICB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIERfQUNFTFBfYWRkX3B1bHNlKFNIT1JUIHBvc1tdLCBTSE9SVCBuYl9wdWxzZSwgU0hPUlQgdHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0NPRCBjb2RlW10pIHsKKyAgU0hPUlQgaSwgazsKKyAgZm9yIChrID0gMDsgayA8IG5iX3B1bHNlOyBrKyspIHsKKyAgICAvKiBpID0gKChwb3Nba10gJiAoMTYtMSkpKk5CX1RSQUNLKSArIHRyYWNrOyAqLworICAgIGkgPSAoKHBvc1trXSAmICgxNiAtIDEpKSA8PCAyKSArIHRyYWNrOworICAgIGlmICgocG9zW2tdICYgMTYpID09IDApIHsKKyAgICAgIGNvZGVbaV0gPSBjb2RlW2ldICsgKEZJWFBfQ09EKSg1MTIgPDwgKENPRF9CSVRTIC0gRlJBQ1RfQklUUykpOworICAgIH0gZWxzZSB7CisgICAgICBjb2RlW2ldID0gY29kZVtpXSAtIChGSVhQX0NPRCkoNTEyIDw8IChDT0RfQklUUyAtIEZSQUNUX0JJVFMpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuOworfQorLyoKKyAqIERfQUNFTFBfZGVjb2RlXzFwX04xCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgIGluZGV4ICAgIEk6IHB1bHNlIGluZGV4CisgKiAgICBOICAgICAgICBJOiBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24KKyAqICAgIG9mZnNldCAgIEk6IG9mZnNldAorICogICAgcG9zICAgICAgTzogcG9zaXRpb24gb2YgdGhlIHB1bHNlCisgKgorICogRnVuY3Rpb246CisgKiAgICBEZWNvZGUgMSBwdWxzZSB3aXRoIE4rMSBiaXRzCisgKgorICogUmV0dXJuczoKKyAqICAgIHZvaWQKKyAqLworc3RhdGljIHZvaWQgRF9BQ0VMUF9kZWNvZGVfMXBfTjEoTE9ORyBpbmRleCwgU0hPUlQgTiwgU0hPUlQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgcG9zW10pIHsKKyAgU0hPUlQgcG9zMTsKKyAgTE9ORyBpLCBtYXNrOworCisgIG1hc2sgPSAoKDEgPDwgTikgLSAxKTsKKyAgLyoKKyAgICogRGVjb2RlIDEgcHVsc2Ugd2l0aCBOKzEgYml0cworICAgKi8KKyAgcG9zMSA9IChTSE9SVCkoKGluZGV4ICYgbWFzaykgKyBvZmZzZXQpOworICBpID0gKChpbmRleCA+PiBOKSAmIDEpOworICBpZiAoaSA9PSAxKSB7CisgICAgcG9zMSArPSAxNjsKKyAgfQorICBwb3NbMF0gPSBwb3MxOworICByZXR1cm47Cit9CisvKgorICogRF9BQ0VMUF9kZWNvZGVfMnBfMk4xCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgIGluZGV4ICAgIEk6IHB1bHNlIGluZGV4CisgKiAgICBOICAgICAgICBJOiBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24KKyAqICAgIG9mZnNldCAgIEk6IG9mZnNldAorICogICAgcG9zICAgICAgTzogcG9zaXRpb24gb2YgdGhlIHB1bHNlCisgKgorICogRnVuY3Rpb246CisgKiAgICBEZWNvZGUgMiBwdWxzZXMgd2l0aCAyKk4rMSBiaXRzCisgKgorICogUmV0dXJuczoKKyAqICAgIHZvaWQKKyAqLworc3RhdGljIHZvaWQgRF9BQ0VMUF9kZWNvZGVfMnBfMk4xKExPTkcgaW5kZXgsIFNIT1JUIE4sIFNIT1JUIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBwb3NbXSkgeworICBTSE9SVCBwb3MxLCBwb3MyOworICBMT05HIG1hc2ssIGk7CisgIG1hc2sgPSAoKDEgPDwgTikgLSAxKTsKKyAgLyoKKyAgICogRGVjb2RlIDIgcHVsc2VzIHdpdGggMipOKzEgYml0cworICAgKi8KKyAgcG9zMSA9IChTSE9SVCkoKChpbmRleCA+PiBOKSAmIG1hc2spICsgb2Zmc2V0KTsKKyAgaSA9IChpbmRleCA+PiAoMiAqIE4pKSAmIDE7CisgIHBvczIgPSAoU0hPUlQpKChpbmRleCAmIG1hc2spICsgb2Zmc2V0KTsKKyAgaWYgKChwb3MyIC0gcG9zMSkgPCAwKSB7CisgICAgaWYgKGkgPT0gMSkgeworICAgICAgcG9zMSArPSAxNjsKKyAgICB9IGVsc2UgeworICAgICAgcG9zMiArPSAxNjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGkgPT0gMSkgeworICAgICAgcG9zMSArPSAxNjsKKyAgICAgIHBvczIgKz0gMTY7CisgICAgfQorICB9CisgIHBvc1swXSA9IHBvczE7CisgIHBvc1sxXSA9IHBvczI7CisgIHJldHVybjsKK30KKy8qCisgKiBEX0FDRUxQX2RlY29kZV8zcF8zTjEKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgaW5kZXggICAgSTogcHVsc2UgaW5kZXgKKyAqICAgIE4gICAgICAgIEk6IG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbgorICogICAgb2Zmc2V0ICAgSTogb2Zmc2V0CisgKiAgICBwb3MgICAgICBPOiBwb3NpdGlvbiBvZiB0aGUgcHVsc2UKKyAqCisgKiBGdW5jdGlvbjoKKyAqICAgIERlY29kZSAzIHB1bHNlcyB3aXRoIDMqTisxIGJpdHMKKyAqCisgKiBSZXR1cm5zOgorICogICAgdm9pZAorICovCitzdGF0aWMgdm9pZCBEX0FDRUxQX2RlY29kZV8zcF8zTjEoTE9ORyBpbmRleCwgU0hPUlQgTiwgU0hPUlQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIHBvc1tdKSB7CisgIFNIT1JUIGo7CisgIExPTkcgbWFzaywgaWR4OworCisgIC8qCisgICAqIERlY29kZSAzIHB1bHNlcyB3aXRoIDMqTisxIGJpdHMKKyAgICovCisgIG1hc2sgPSAoKDEgPDwgKCgyICogTikgLSAxKSkgLSAxKTsKKyAgaWR4ID0gaW5kZXggJiBtYXNrOworICBqID0gb2Zmc2V0OworICBpZiAoKChpbmRleCA+PiAoKDIgKiBOKSAtIDEpKSAmIDEpID09IDEpIHsKKyAgICBqICs9ICgxIDw8IChOIC0gMSkpOworICB9CisgIERfQUNFTFBfZGVjb2RlXzJwXzJOMShpZHgsIE4gLSAxLCBqLCBwb3MpOworICBtYXNrID0gKCgxIDw8IChOICsgMSkpIC0gMSk7CisgIGlkeCA9IChpbmRleCA+PiAoMiAqIE4pKSAmIG1hc2s7CisgIERfQUNFTFBfZGVjb2RlXzFwX04xKGlkeCwgTiwgb2Zmc2V0LCBwb3MgKyAyKTsKKyAgcmV0dXJuOworfQorLyoKKyAqIERfQUNFTFBfZGVjb2RlXzRwXzROMQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICBpbmRleCAgICBJOiBwdWxzZSBpbmRleAorICogICAgTiAgICAgICAgSTogbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uCisgKiAgICBvZmZzZXQgICBJOiBvZmZzZXQKKyAqICAgIHBvcyAgICAgIE86IHBvc2l0aW9uIG9mIHRoZSBwdWxzZQorICoKKyAqIEZ1bmN0aW9uOgorICogICAgRGVjb2RlIDQgcHVsc2VzIHdpdGggNCpOKzEgYml0cworICoKKyAqIFJldHVybnM6CisgKiAgICB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIERfQUNFTFBfZGVjb2RlXzRwXzROMShMT05HIGluZGV4LCBTSE9SVCBOLCBTSE9SVCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgcG9zW10pIHsKKyAgU0hPUlQgajsKKyAgTE9ORyBtYXNrLCBpZHg7CisgIC8qCisgICAqIERlY29kZSA0IHB1bHNlcyB3aXRoIDQqTisxIGJpdHMKKyAgICovCisgIG1hc2sgPSAoKDEgPDwgKCgyICogTikgLSAxKSkgLSAxKTsKKyAgaWR4ID0gaW5kZXggJiBtYXNrOworICBqID0gb2Zmc2V0OworICBpZiAoKChpbmRleCA+PiAoKDIgKiBOKSAtIDEpKSAmIDEpID09IDEpIHsKKyAgICBqICs9ICgxIDw8IChOIC0gMSkpOworICB9CisgIERfQUNFTFBfZGVjb2RlXzJwXzJOMShpZHgsIE4gLSAxLCBqLCBwb3MpOworICBtYXNrID0gKCgxIDw8ICgoMiAqIE4pICsgMSkpIC0gMSk7CisgIGlkeCA9IChpbmRleCA+PiAoMiAqIE4pKSAmIG1hc2s7CisgIERfQUNFTFBfZGVjb2RlXzJwXzJOMShpZHgsIE4sIG9mZnNldCwgcG9zICsgMik7CisgIHJldHVybjsKK30KKy8qCisgKiBEX0FDRUxQX2RlY29kZV80cF80TgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICBpbmRleCAgICBJOiBwdWxzZSBpbmRleAorICogICAgTiAgICAgICAgSTogbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uCisgKiAgICBvZmZzZXQgICBJOiBvZmZzZXQKKyAqICAgIHBvcyAgICAgIE86IHBvc2l0aW9uIG9mIHRoZSBwdWxzZQorICoKKyAqIEZ1bmN0aW9uOgorICogICAgRGVjb2RlIDQgcHVsc2VzIHdpdGggNCpOIGJpdHMKKyAqCisgKiBSZXR1cm5zOgorICogICAgdm9pZAorICovCitzdGF0aWMgdm9pZCBEX0FDRUxQX2RlY29kZV80cF80TihMT05HIGluZGV4LCBTSE9SVCBOLCBTSE9SVCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBwb3NbXSkgeworICBTSE9SVCBqLCBuXzE7CisgIC8qCisgICAqIERlY29kZSA0IHB1bHNlcyB3aXRoIDQqTiBiaXRzCisgICAqLworICBuXzEgPSBOIC0gMTsKKyAgaiA9IG9mZnNldCArICgxIDw8IG5fMSk7CisgIHN3aXRjaCAoKGluZGV4ID4+ICgoNCAqIE4pIC0gMikpICYgMykgeworICAgIGNhc2UgMDoKKyAgICAgIGlmICgoKGluZGV4ID4+ICgoNCAqIG5fMSkgKyAxKSkgJiAxKSA9PSAwKSB7CisgICAgICAgIERfQUNFTFBfZGVjb2RlXzRwXzROMShpbmRleCwgbl8xLCBvZmZzZXQsIHBvcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBEX0FDRUxQX2RlY29kZV80cF80TjEoaW5kZXgsIG5fMSwgaiwgcG9zKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIERfQUNFTFBfZGVjb2RlXzFwX04xKChpbmRleCA+PiAoKDMgKiBuXzEpICsgMSkpLCBuXzEsIG9mZnNldCwgcG9zKTsKKyAgICAgIERfQUNFTFBfZGVjb2RlXzNwXzNOMShpbmRleCwgbl8xLCBqLCBwb3MgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIERfQUNFTFBfZGVjb2RlXzJwXzJOMSgoaW5kZXggPj4gKCgyICogbl8xKSArIDEpKSwgbl8xLCBvZmZzZXQsIHBvcyk7CisgICAgICBEX0FDRUxQX2RlY29kZV8ycF8yTjEoaW5kZXgsIG5fMSwgaiwgcG9zICsgMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBEX0FDRUxQX2RlY29kZV8zcF8zTjEoKGluZGV4ID4+IChuXzEgKyAxKSksIG5fMSwgb2Zmc2V0LCBwb3MpOworICAgICAgRF9BQ0VMUF9kZWNvZGVfMXBfTjEoaW5kZXgsIG5fMSwgaiwgcG9zICsgMyk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm47Cit9CisKKy8qCisgKiBEX0FDRUxQX2RlY29kZV80dAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICBpbmRleCAgICAgICAgICBJOiBpbmRleAorICogICAgbW9kZSAgICAgICAgICAgSTogc3BlZWNoIG1vZGUKKyAqICAgIGNvZGUgICAgICAgICAgIEk6IChROSkgYWxnZWJyYWljIChmaXhlZCkgY29kZWJvb2sgZXhjaXRhdGlvbgorICoKKyAqIEZ1bmN0aW9uOgorICogICAgMjAsIDM2LCA0NCwgNTIsIDY0LCA3MiwgODggYml0cyBhbGdlYnJhaWMgY29kZWJvb2suCisgKiAgICA0IHRyYWNrcyB4IDE2IHBvc2l0aW9ucyBwZXIgdHJhY2sgPSA2NCBzYW1wbGVzLgorICoKKyAqICAgIDIwIGJpdHMgNSs1KzUrNSAtLT4gNCBwdWxzZXMgaW4gYSBmcmFtZSBvZiA2NCBzYW1wbGVzLgorICogICAgMzYgYml0cyA5KzkrOSs5IC0tPiA4IHB1bHNlcyBpbiBhIGZyYW1lIG9mIDY0IHNhbXBsZXMuCisgKiAgICA0NCBiaXRzIDEzKzkrMTMrOSAtLT4gMTAgcHVsc2VzIGluIGEgZnJhbWUgb2YgNjQgc2FtcGxlcy4KKyAqICAgIDUyIGJpdHMgMTMrMTMrMTMrMTMgLS0+IDEyIHB1bHNlcyBpbiBhIGZyYW1lIG9mIDY0IHNhbXBsZXMuCisgKiAgICA2NCBiaXRzIDIrMisyKzIrMTQrMTQrMTQrMTQgLS0+IDE2IHB1bHNlcyBpbiBhIGZyYW1lIG9mIDY0IHNhbXBsZXMuCisgKiAgICA3MiBiaXRzIDEwKzIrMTArMisxMCsxNCsxMCsxNCAtLT4gMTggcHVsc2VzIGluIGEgZnJhbWUgb2YgNjQgc2FtcGxlcy4KKyAqICAgIDg4IGJpdHMgMTErMTErMTErMTErMTErMTErMTErMTEgLS0+IDI0IHB1bHNlcyBpbiBhIGZyYW1lIG9mIDY0IHNhbXBsZXMuCisgKgorICogICAgQWxsIHB1bHNlcyBjYW4gaGF2ZSB0d28gKDIpIHBvc3NpYmxlIGFtcGxpdHVkZXM6ICsxIG9yIC0xLgorICogICAgRWFjaCBwdWxzZSBjYW4gc2l4dGVlbiAoMTYpIHBvc3NpYmxlIHBvc2l0aW9ucy4KKyAqCisgKiAgICBjb2RldmVjdG9yIGxlbmd0aCAgICA2NAorICogICAgbnVtYmVyIG9mIHRyYWNrICAgICAgNAorICogICAgbnVtYmVyIG9mIHBvc2l0aW9uICAgMTYKKyAqCisgKiBSZXR1cm5zOgorICogICAgdm9pZAorICovCit2b2lkIERfQUNFTFBfZGVjb2RlXzR0NjQoU0hPUlQgaW5kZXhbXSwgaW50IG5iaXRzLCBGSVhQX0NPRCBjb2RlW10pIHsKKyAgTE9ORyBMX2luZGV4OworICBTSE9SVCBrLCBwb3NbNl07CisKKyAgRkRLbWVtY2xlYXIoY29kZSwgTF9TVUJGUiAqIHNpemVvZihGSVhQX0NPRCkpOworCisgIC8qIGRlY29kZSB0aGUgcG9zaXRpb25zIGFuZCBzaWducyBvZiBwdWxzZXMgYW5kIGJ1aWxkIHRoZSBjb2Rld29yZCAqLworICBzd2l0Y2ggKG5iaXRzKSB7CisgICAgY2FzZSAxMjoKKyAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrICs9IDIpIHsKKyAgICAgICAgTF9pbmRleCA9IGluZGV4WzIgKiAoayAvIDIpICsgMV07CisgICAgICAgIERfQUNFTFBfZGVjb2RlXzFwX04xKExfaW5kZXgsIDQsIDAsIHBvcyk7CisgICAgICAgIERfQUNFTFBfYWRkX3B1bHNlKHBvcywgMSwgMiAqIChpbmRleFsyICogKGsgLyAyKV0pICsgayAvIDIsIGNvZGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjogeworICAgICAgaW50IGkgPSAwOworICAgICAgaW50IG9mZnNldCA9IGluZGV4W2krK107CisgICAgICBvZmZzZXQgPSAob2Zmc2V0ID09IDApID8gMSA6IDM7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgIGlmIChrICE9IG9mZnNldCkgeworICAgICAgICAgIExfaW5kZXggPSBpbmRleFtpKytdOworICAgICAgICAgIERfQUNFTFBfZGVjb2RlXzFwX04xKExfaW5kZXgsIDQsIDAsIHBvcyk7CisgICAgICAgICAgRF9BQ0VMUF9hZGRfcHVsc2UocG9zLCAxLCBrLCBjb2RlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSAyMDoKKyAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspIHsKKyAgICAgICAgTF9pbmRleCA9IChMT05HKWluZGV4W2tdOworICAgICAgICBEX0FDRUxQX2RlY29kZV8xcF9OMShMX2luZGV4LCA0LCAwLCBwb3MpOworICAgICAgICBEX0FDRUxQX2FkZF9wdWxzZShwb3MsIDEsIGssIGNvZGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyODoKKyAgICAgIGZvciAoayA9IDA7IGsgPCA0IC0gMjsgaysrKSB7CisgICAgICAgIExfaW5kZXggPSAoTE9ORylpbmRleFtrXTsKKyAgICAgICAgRF9BQ0VMUF9kZWNvZGVfMnBfMk4xKExfaW5kZXgsIDQsIDAsIHBvcyk7CisgICAgICAgIERfQUNFTFBfYWRkX3B1bHNlKHBvcywgMiwgaywgY29kZSk7CisgICAgICB9CisgICAgICBmb3IgKGsgPSAyOyBrIDwgNDsgaysrKSB7CisgICAgICAgIExfaW5kZXggPSAoTE9ORylpbmRleFtrXTsKKyAgICAgICAgRF9BQ0VMUF9kZWNvZGVfMXBfTjEoTF9pbmRleCwgNCwgMCwgcG9zKTsKKyAgICAgICAgRF9BQ0VMUF9hZGRfcHVsc2UocG9zLCAxLCBrLCBjb2RlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzY6CisgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgIExfaW5kZXggPSAoTE9ORylpbmRleFtrXTsKKyAgICAgICAgRF9BQ0VMUF9kZWNvZGVfMnBfMk4xKExfaW5kZXgsIDQsIDAsIHBvcyk7CisgICAgICAgIERfQUNFTFBfYWRkX3B1bHNlKHBvcywgMiwgaywgY29kZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ0OgorICAgICAgZm9yIChrID0gMDsgayA8IDQgLSAyOyBrKyspIHsKKyAgICAgICAgTF9pbmRleCA9IChMT05HKWluZGV4W2tdOworICAgICAgICBEX0FDRUxQX2RlY29kZV8zcF8zTjEoTF9pbmRleCwgNCwgMCwgcG9zKTsKKyAgICAgICAgRF9BQ0VMUF9hZGRfcHVsc2UocG9zLCAzLCBrLCBjb2RlKTsKKyAgICAgIH0KKyAgICAgIGZvciAoayA9IDI7IGsgPCA0OyBrKyspIHsKKyAgICAgICAgTF9pbmRleCA9IChMT05HKWluZGV4W2tdOworICAgICAgICBEX0FDRUxQX2RlY29kZV8ycF8yTjEoTF9pbmRleCwgNCwgMCwgcG9zKTsKKyAgICAgICAgRF9BQ0VMUF9hZGRfcHVsc2UocG9zLCAyLCBrLCBjb2RlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTI6CisgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgIExfaW5kZXggPSAoTE9ORylpbmRleFtrXTsKKyAgICAgICAgRF9BQ0VMUF9kZWNvZGVfM3BfM04xKExfaW5kZXgsIDQsIDAsIHBvcyk7CisgICAgICAgIERfQUNFTFBfYWRkX3B1bHNlKHBvcywgMywgaywgY29kZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDY0OgorICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICBMX2luZGV4ID0gKCgoTE9ORylpbmRleFtrXSA8PCAxNCkgKyAoTE9ORylpbmRleFtrICsgNF0pOworICAgICAgICBEX0FDRUxQX2RlY29kZV80cF80TihMX2luZGV4LCA0LCAwLCBwb3MpOworICAgICAgICBEX0FDRUxQX2FkZF9wdWxzZShwb3MsIDQsIGssIGNvZGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEZES19BU1NFUlQoMCk7CisgIH0KKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZV9kNHQ2NC5oIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZV9kNHQ2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YmMzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlX2Q0dDY0LmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogQUNFTFAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVU0FDREVDX0FDRV9ENFQ2NF9ICisjZGVmaW5lIFVTQUNERUNfQUNFX0Q0VDY0X0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworLyogRGF0YSB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBmaXhlZCBjb2RlYm9vayB2ZWN0b3IgKi8KKyNkZWZpbmUgRklYUF9DT0QgRklYUF9TR0wKKyNkZWZpbmUgRlhfQ09EMkZYX0RCTCh4KSAoRlhfU0dMMkZYX0RCTCh4KSkKKyNkZWZpbmUgRlhfREJMMkZYX0NPRCh4KSBGWF9EQkwyRlhfU0dMKCh4KSArIChGSVhQX0RCTCkweDgwMDApCisjZGVmaW5lIEZYX1NHTDJGWF9DT0QoeCkgKHgpCisjZGVmaW5lIENPRF9CSVRTIEZSQUNUX0JJVFMKKwordm9pZCBEX0FDRUxQX2RlY29kZV80dDY0KFNIT1JUIGluZGV4W10sIGludCBuYml0cywgRklYUF9DT0QgY29kZVtdKTsKKworI2VuZGlmIC8qIFVTQUNERUNfQUNFX0Q0VDY0X0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VfbHRwLmNwcCBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VfbHRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY0YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZV9sdHAuY3BwCkBAIC0wLDAgKzEsMjI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBIaWxkZW5icmFuZAorCisgICBEZXNjcmlwdGlvbjogVVNBQyBBQ0VMUCBMVFAgZmlsdGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2FjZGVjX2FjZV9sdHAuaCIKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjZGVmaW5lIFVQX1NBTVAgNAorI2RlZmluZSBMX0lOVEVSUE9MMiAxNgorI2RlZmluZSBMX1NVQkZSIDY0CisKKyNkZWZpbmUgQTIgRkwyRlhfU0dMKDIgKiAwLjE4ZikKKyNkZWZpbmUgQiBGTDJGWF9TR0woMC42NGYpCisKK3N0YXRpYyBjb25zdCBMT05HIFByZWRfbHQ0X2ludGVyNF8yW1VQX1NBTVBdW0xfSU5URVJQT0wyXSA9IHsKKyAgICB7KExPTkcpMHgwMDAwRkZGQywgKExPTkcpMHgwMDA4RkZGQywgKExPTkcpMHhGRkVCMDA0QywgKExPTkcpMHhGRjUwMDE0QSwKKyAgICAgKExPTkcpMHhGREQ5MDM1MSwgKExPTkcpMHhGQjJBMDZDRCwgKExPTkcpMHhGNjkyMEQ0NiwgKExPTkcpMHhFQkI0MkIzNSwKKyAgICAgKExPTkcpMHg2RDlFRUYzOSwgKExPTkcpMHgwNjE4RkUwRiwgKExPTkcpMHhGRkUwMDEzMSwgKExPTkcpMHhGRTU1MDFDNSwKKyAgICAgKExPTkcpMHhGRTVFMDE1RCwgKExPTkcpMHhGRUY3MDBCNiwgKExPTkcpMHhGRjkyMDAzNywgKExPTkcpMHhGRkVDMDAwM30sCisgICAgeyhMT05HKTB4MDAwMkZGRjIsIChMT05HKTB4MDAyNkZGQkQsIChMT05HKTB4MDA1REZGOTgsIChMT05HKTB4MDA1NUZGRUYsCisgICAgIChMT05HKTB4RkY4OTAxNUYsIChMT05HKTB4RkQzQTA0RTUsIChMT05HKTB4RjdEOTBEQUEsIChMT05HKTB4RTY3QTUwRUUsCisgICAgIChMT05HKTB4NTBFRUU2N0EsIChMT05HKTB4MERBQUY3RDksIChMT05HKTB4MDRFNUZEM0EsIChMT05HKTB4MDE1RkZGODksCisgICAgIChMT05HKTB4RkZFRjAwNTUsIChMT05HKTB4RkY5ODAwNUQsIChMT05HKTB4RkZCRDAwMjYsIChMT05HKTB4RkZGMjAwMDJ9LAorICAgIHsoTE9ORykweDAwMDNGRkVDLCAoTE9ORykweDAwMzdGRjkyLCAoTE9ORykweDAwQjZGRUY3LCAoTE9ORykweDAxNURGRTVFLAorICAgICAoTE9ORykweDAxQzVGRTU1LCAoTE9ORykweDAxMzFGRkUwLCAoTE9ORykweEZFMEYwNjE4LCAoTE9ORykweEVGMzk2RDlFLAorICAgICAoTE9ORykweDJCMzVFQkI0LCAoTE9ORykweDBENDZGNjkyLCAoTE9ORykweDA2Q0RGQjJBLCAoTE9ORykweDAzNTFGREQ5LAorICAgICAoTE9ORykweDAxNEFGRjUwLCAoTE9ORykweDAwNENGRkVCLCAoTE9ORykweEZGRkMwMDA4LCAoTE9ORykweEZGRkMwMDAwfSwKKyAgICB7KExPTkcpMHgwMDAyRkZGMiwgKExPTkcpMHgwMDJCRkY5RSwgKExPTkcpMHgwMEI5RkVDRSwgKExPTkcpMHgwMUNGRkQ3NSwKKyAgICAgKExPTkcpMHgwMzVFRkJDMSwgKExPTkcpMHgwNTIxRkEwQywgKExPTkcpMHgwNkFBRjhDOSwgKExPTkcpMHgwNzkwNzg1MiwKKyAgICAgKExPTkcpMHgwNzkwRjhDOSwgKExPTkcpMHgwNkFBRkEwQywgKExPTkcpMHgwNTIxRkJDMSwgKExPTkcpMHgwMzVFRkQ3NSwKKyAgICAgKExPTkcpMHgwMUNGRkVDRSwgKExPTkcpMHgwMEI5RkY5RSwgKExPTkcpMHgwMDJCRkZGMiwgKExPTkcpMHgwMDAyMDAwMH19OworCit2b2lkIFByZWRfbHQ0KEZJWFBfREJMIGV4Y1tdLCAvKiBpbi9vdXQ6IGV4Y2l0YXRpb24gYnVmZmVyICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpbnQgVDAsICAgICAgICAgLyogaW5wdXQgOiBpbnRlZ2VyIHBpdGNoIGxhZyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaW50IGZyYWMgICAgICAgIC8qIGlucHV0IDogZnJhY3Rpb24gb2YgbGFnIGluIHJhbmdlIDAuLjMgICovCispIHsKKyAgaW50IGo7CisgIEZJWFBfREJMICp4OworICBjb25zdCBMT05HICppbnRlcnBvbDsKKyAgRklYUF9EQkwgTF9zdW1iLCBMX3N1bXQ7CisKKyAgeCA9ICZleGNbLVQwIC0gTF9JTlRFUlBPTDIgKyAxXTsKKworICAvKiByZW1hcCBmcmFjIGFuZCB4OgorICAgICAgICAgICAwIC0+IDMgICB4ICh1bmNoYW5nZWQpCisgICAgICAgICAgIDEgLT4gMCAgIHgtLQorICAgICAgICAgICAyIC0+IDEgICB4LS0KKyAgICAgICAgICAgMyAtPiAyICAgeC0tCisgICovCisKKyAgaWYgKC0tZnJhYyA8IDApCisgICAgZnJhYyArPSBVUF9TQU1QOworICBlbHNlCisgICAgeC0tOworCisgIGogPSBMX1NVQkZSICsgMTsKKyAgZG8geworICAgIExPTkcgZmlsdDsKKyAgICBGSVhQX0RCTCB4MCwgeDE7CisgICAgRklYUF9EQkwgKnhpID0geCsrOworICAgIGludGVycG9sID0gUHJlZF9sdDRfaW50ZXI0XzJbZnJhY107CisgICAgaW50IGkgPSAzOworCisgICAgZmlsdCA9ICppbnRlcnBvbCsrOworICAgIHgwID0gKnhpKys7CisgICAgeDEgPSAqeGkrKzsKKyAgICBMX3N1bXQgPSBmTXVsdERpdjIoeDAsIChGSVhQX1NHTCkoKFNIT1JUKShmaWx0ID4+IDE2KSkpOworICAgIExfc3VtYiA9IGZNdWx0RGl2Mih4MSwgKEZJWFBfU0dMKSgoU0hPUlQpZmlsdCkpOworICAgIGRvIHsKKyAgICAgIGZpbHQgPSAqaW50ZXJwb2wrKzsKKyAgICAgIHgwID0gKnhpKys7CisgICAgICB4MSA9ICp4aSsrOworICAgICAgTF9zdW10ID0gZk11bHRBZGREaXYyKExfc3VtdCwgeDAsIChGSVhQX1NHTCkoKFNIT1JUKShmaWx0ID4+IDE2KSkpOworICAgICAgTF9zdW1iID0gZk11bHRBZGREaXYyKExfc3VtYiwgeDEsIChGSVhQX1NHTCkoKFNIT1JUKWZpbHQpKTsKKworICAgICAgZmlsdCA9ICppbnRlcnBvbCsrOworICAgICAgeDAgPSAqeGkrKzsKKyAgICAgIHgxID0gKnhpKys7CisgICAgICBMX3N1bXQgPSBmTXVsdEFkZERpdjIoTF9zdW10LCB4MCwgKEZJWFBfU0dMKSgoU0hPUlQpKGZpbHQgPj4gMTYpKSk7CisgICAgICBMX3N1bWIgPSBmTXVsdEFkZERpdjIoTF9zdW1iLCB4MSwgKEZJWFBfU0dMKSgoU0hPUlQpZmlsdCkpOworCisgICAgICBmaWx0ID0gKmludGVycG9sKys7CisgICAgICB4MCA9ICp4aSsrOworICAgICAgeDEgPSAqeGkrKzsKKyAgICAgIExfc3VtdCA9IGZNdWx0QWRkRGl2MihMX3N1bXQsIHgwLCAoRklYUF9TR0wpKChTSE9SVCkoZmlsdCA+PiAxNikpKTsKKyAgICAgIExfc3VtYiA9IGZNdWx0QWRkRGl2MihMX3N1bWIsIHgxLCAoRklYUF9TR0wpKChTSE9SVClmaWx0KSk7CisKKyAgICAgIGZpbHQgPSAqaW50ZXJwb2wrKzsKKyAgICAgIHgwID0gKnhpKys7CisgICAgICB4MSA9ICp4aSsrOworICAgICAgTF9zdW10ID0gZk11bHRBZGREaXYyKExfc3VtdCwgeDAsIChGSVhQX1NHTCkoKFNIT1JUKShmaWx0ID4+IDE2KSkpOworICAgICAgTF9zdW1iID0gZk11bHRBZGREaXYyKExfc3VtYiwgeDEsIChGSVhQX1NHTCkoKFNIT1JUKWZpbHQpKTsKKworICAgICAgZmlsdCA9ICppbnRlcnBvbCsrOworICAgICAgeDAgPSAqeGkrKzsKKyAgICAgIHgxID0gKnhpKys7CisgICAgICBMX3N1bXQgPSBmTXVsdEFkZERpdjIoTF9zdW10LCB4MCwgKEZJWFBfU0dMKSgoU0hPUlQpKGZpbHQgPj4gMTYpKSk7CisgICAgICBMX3N1bWIgPSBmTXVsdEFkZERpdjIoTF9zdW1iLCB4MSwgKEZJWFBfU0dMKSgoU0hPUlQpZmlsdCkpOworICAgIH0gd2hpbGUgKC0taSAhPSAwKTsKKworICAgIExfc3VtYiA8PD0gMTsKKyAgICBMX3N1bWIgPSBmQWRkU2F0dXJhdGUoTF9zdW10IDw8IDEsIExfc3VtYik7CisgICAgKmV4YysrID0gTF9zdW1iOworICB9IHdoaWxlICgtLWogIT0gMCk7CisgIHJldHVybjsKK30KKwordm9pZCBQcmVkX2x0NF9wb3N0ZmlsdGVyKEZJWFBfREJMIGV4Y1tdIC8qIGluL291dDogZXhjaXRhdGlvbiBidWZmZXIgKi8KKykgeworICAvKgorICBleGNbaV0gICA9IEEqZXhjW2ktMV0gKyBCKmV4Y1tpXSArIEEqZXhjW2krMV0KKyAgZXhjW2krMV0gPSAgICAgICAgICAgICAgQSpleGNbaV0gKyBCKmV4Y1tpKzFdICsgQSpleGNbaSsyXSA7IGkgPSAwOjI6NjIKKyAgKi8KKyAgaW50IGk7CisgIEZJWFBfREJMIHN1bTAsIHN1bTEsIGFfZXhjMCwgYV9leGMxOworICBhX2V4YzAgPSBmTXVsdERpdjIoQTIsIGV4Y1stMV0pOworICBhX2V4YzEgPSBmTXVsdERpdjIoQTIsIGV4Y1swXSk7CisKKyAgLyogQVJNOTI2OiAyMiBjeWNsZXMvaXRlcmF0aW9uICovCisgIGZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpICs9IDIpIHsKKyAgICBzdW0wID0gYV9leGMwICsgZk11bHQoQiwgZXhjW2ldKTsKKyAgICBzdW0xID0gYV9leGMxICsgZk11bHQoQiwgZXhjW2kgKyAxXSk7CisgICAgYV9leGMwID0gZk11bHREaXYyKEEyLCBleGNbaSArIDFdKTsKKyAgICBhX2V4YzEgPSBmTXVsdERpdjIoQTIsIGV4Y1tpICsgMl0pOworICAgIGV4Y1tpXSA9IHN1bTAgKyBhX2V4YzA7CisgICAgZXhjW2kgKyAxXSA9IHN1bTEgKyBhX2V4YzE7CisgIH0KKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZV9sdHAuaCBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VfbHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyOGFjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VfbHRwLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOiBVU0FDIEFDRUxQIExUUCBmaWx0ZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVU0FDREVDX0FDRV9MVFBfSAorI2RlZmluZSBVU0FDREVDX0FDRV9MVFBfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisvKioKKyAqIFxicmllZiBDb21wdXRlIHRoZSBpbml0aWFsIGFkYXB0aXZlIGNvZGVib29rIGV4Y2l0YXRpb24gdicobikgYnkKKyAqIGludGVycG9sYXRpbmcgdGhlIHBhc3QgZXhjaXRhdGlvbiB2ZWN0b3IgdScobikuCisgKiBccGFyYW0gZXhjIHBvaW50cyB0byBhZGFwdGl2ZSBjb2RlYm9vayBvZiBjdXJyZW50IHN1YmZyYW1lIChpbnB1dC9vdXRwdXQpCisgKiBccGFyYW0gVDAgaW50ZWdlciBwYXJ0IG9mIGRlY29kZWQgcGl0Y2ggbGFnIChpbnB1dCkKKyAqIFxwYXJhbSBmcmFjIGZyYWN0aW9uYWwgcGFydCBvZiBkZWNvZGVkIHBpdGNoIGxhZyAoMC4uMykgKGlucHV0KQorICovCit2b2lkIFByZWRfbHQ0KEZJWFBfREJMIGV4Y1tdLCAvKiBpbi9vdXQ6IGV4Y2l0YXRpb24gYnVmZmVyICovCisgICAgICAgICAgICAgIGludCBUMCwgICAgICAgICAvKiBpbnB1dCA6IGludGVnZXIgcGl0Y2ggbGFnICovCisgICAgICAgICAgICAgIGludCBmcmFjICAgICAgICAvKiBpbnB1dCA6IGZyYWN0aW9uIG9mIGxhZyAgICovCispOworCisvKioKKyAqIFxicmllZiBDb21wdXRlIHRoZSBhZGFwdGl2ZSBjb2RlYm9vayBleGNpdGF0aW9uIHYobikgaW4gY2FzZSBvZgorICogbHRwX2ZpbHRlcmluZ19mbGFnID09IDAuCisgKiBccGFyYW0gZXhjIHBvaW50cyB0byBhZGFwdGl2ZSBjb2RlYm9vayBvZiBjdXJyZW50IHN1YmZyYW1lIChpbnB1dC9vdXRwdXQpCisgKi8KK3ZvaWQgUHJlZF9sdDRfcG9zdGZpbHRlcihGSVhQX0RCTCBleGNbXSAvKiBpbi9vdXQ6IGV4Y2l0YXRpb24gYnVmZmVyICovCispOworCisjZW5kaWYgLyogVVNBQ0RFQ19BQ0VfTFRQX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VscC5jcHAgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlbHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMWY0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlbHAuY3BwCkBAIC0wLDAgKzEsMTI5NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF0dGhpYXMgSGlsZGVuYnJhbmQKKworICAgRGVzY3JpcHRpb246IFVTQUMgQUNFTFAgZnJhbWUgZGVjb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNhY2RlY19hY2VscC5oIgorCisjaW5jbHVkZSAidXNhY2RlY19hY2VfZDR0NjQuaCIKKyNpbmNsdWRlICJ1c2FjZGVjX2FjZV9sdHAuaCIKKyNpbmNsdWRlICJ1c2FjZGVjX3JvbS5oIgorI2luY2x1ZGUgInVzYWNkZWNfbHBjLmgiCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworI2RlZmluZSBQSVRfRlIyXzEyazggMTI4IC8qIE1pbmltdW0gcGl0Y2ggbGFnIHdpdGggcmVzb2x1dGlvbiAxLzIgICAgICAqLworI2RlZmluZSBQSVRfRlIxXzEyazggMTYwIC8qIE1pbmltdW0gcGl0Y2ggbGFnIHdpdGggcmVzb2x1dGlvbiAxICAgICAgICAqLworI2RlZmluZSBUSUxUX0NPREUyIFwKKyAgRkwyRlhDT05TVF9TR0woMC4zZiAqIDIuMGYpIC8qIEFDRUxQIGNvZGUgcHJlLWVtcGhhc2lzIGZhY3RvciAoICoyICkgICAgICAqLworI2RlZmluZSBQSVRfU0hBUlAgXAorICBGTDJGWENPTlNUX1NHTCgwLjg1ZikgLyogcGl0Y2ggc2hhcnBlbmluZyBmYWN0b3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBSRUVNUEhfRkFDIFwKKyAgRkwyRlhDT05TVF9TR0woMC42OGYpIC8qIEFDRUxQIHN5bnRoIHByZS1lbXBoYXNpcyBmYWN0b3IgICAgICAgICAgICAqLworCisjZGVmaW5lIEFDRUxQX0hFQURST09NIDEKKyNkZWZpbmUgQUNFTFBfT1VUU0NBTEUgKE1EQ1RfT1VUX0hFQURST09NIC0gQUNFTFBfSEVBRFJPT00pCisKKy8qKgorICogXGJyaWVmIENhbGN1bGF0ZSBwcmUtZW1waGFzaXMgKDEgLSBtdSB6Xi0xKSBvbiBpbnB1dCBzaWduYWwuCisgKiBccGFyYW1baW5dIGluIHBvaW50ZXIgdG8gaW5wdXQgc2lnbmFsOyBpblstMV0gaXMgYWxzbyBuZWVkZWQuCisgKiBccGFyYW1bb3V0XSBvdXQgcG9pbnRlciB0byBvdXRwdXQgc2lnbmFsLgorICogXHBhcmFtW2luXSBMIGxlbmd0aCBvZiBmaWx0ZXJpbmcuCisgKi8KKy8qIHN0YXRpYyAqLwordm9pZCBFX1VUSUxfcHJlZW1waChjb25zdCBGSVhQX0RCTCAqaW4sIEZJWFBfREJMICpvdXQsIElOVCBMKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBMOyBpKyspIHsKKyAgICBvdXRbaV0gPSBpbltpXSAtIGZNdWx0KFBSRUVNUEhfRkFDLCBpbltpIC0gMV0pOworICB9CisKKyAgcmV0dXJuOworfQorCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgZGUtZW1waGFzaXMgMS8oMSAtIFRJTFRfQ09ERSB6Xi0xKSBvbiBpbm5vdmF0aXZlIGNvZGVib29rCisgKiB2ZWN0b3IuCisgKiBccGFyYW1baW4sb3V0XSB4IGlubm92YXRpdmUgY29kZWJvb2sgdmVjdG9yLgorICovCitzdGF0aWMgdm9pZCBQcmVlbXBoX2NvZGUoCisgICAgRklYUF9DT0QgeFtdIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLworKSB7CisgIGludCBpOworICBGSVhQX0RCTCBMX3RtcDsKKworICAvKiBBUk05MjY6IDEyIGN5Y2xlcyBwZXIgc2FtcGxlICovCisgIGZvciAoaSA9IExfU1VCRlIgLSAxOyBpID4gMDsgaS0tKSB7CisgICAgTF90bXAgPSBGWF9DT0QyRlhfREJMKHhbaV0pOworICAgIExfdG1wIC09IGZNdWx0RGl2Mih4W2kgLSAxXSwgVElMVF9DT0RFMik7CisgICAgeFtpXSA9IEZYX0RCTDJGWF9DT0QoTF90bXApOworICB9Cit9CisKKy8qKgorICogXGJyaWVmIEFwcGx5IHBpdGNoIHNoYXJwZW5lciB0byB0aGUgaW5ub3ZhdGl2ZSBjb2RlYm9vayB2ZWN0b3IuCisgKiBccGFyYW1baW4sb3V0XSB4IGlubm92YXRpdmUgY29kZWJvb2sgdmVjdG9yLgorICogXHBhcmFtW2luXSBwaXRfbGFnIGRlY29kZWQgcGl0Y2ggbGFnLgorICovCitzdGF0aWMgdm9pZCBQaXRfc2hycCgKKyAgICBGSVhQX0NPRCB4W10sIC8qIGluL291dDogaW1wdWxzZSByZXNwb25zZSAob3IgYWxnZWJyYWljIGNvZGUpICovCisgICAgaW50IHBpdF9sYWcgICAvKiBpbnB1dCA6IHBpdGNoIGxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworKSB7CisgIGludCBpOworICBGSVhQX0RCTCBMX3RtcDsKKworICBmb3IgKGkgPSBwaXRfbGFnOyBpIDwgTF9TVUJGUjsgaSsrKSB7CisgICAgTF90bXAgPSBGWF9DT0QyRlhfREJMKHhbaV0pOworICAgIExfdG1wICs9IGZNdWx0KHhbaSAtIHBpdF9sYWddLCBQSVRfU0hBUlApOworICAgIHhbaV0gPSBGWF9EQkwyRlhfQ09EKExfdG1wKTsKKyAgfQorCisgIHJldHVybjsKK30KKworICAvKioKKyAgICogXGJyaWVmIENhbGN1bGF0ZSBRdWFudGl6ZWQgY29kZWJvb2sgZ2FpbiwgUXVhbnRpemVkIHBpdGNoIGdhaW4gYW5kIHVuYmlhc2VkCisgICAqICAgICAgICBJbm5vdmF0aXZlIGNvZGUgdmVjdG9yIGVuZXJneS4KKyAgICogXHBhcmFtW2luXSBpbmRleCBpbmRleCBvZiBxdWFudGl6ZXIuCisgICAqIFxwYXJhbVtpbl0gY29kZSBpbm5vdmF0aXZlIGNvZGUgdmVjdG9yIHdpdGggZXhwb25lbnQgPSBTRl9DT0RFLgorICAgKiBccGFyYW1bb3V0XSBnYWluX3BpdCBRdWFudGl6ZWQgcGl0Y2ggZ2FpbiBnX3Agd2l0aCBleHBvbmVudCA9IFNGX0dBSU5fUC4KKyAgICogXHBhcmFtW291dF0gZ2Fpbl9jb2RlIFF1YW50aXplZCBjb2RlYm9vayBnYWluIGdfYy4KKyAgICogXHBhcmFtW2luXSBtZWFuX2VuZXIgbWVhbl9lbmVyIGRlZmluZWQgaW4gb3Blbi1sb29wICgyIGJpdHMpLCBleHBvbmVudCA9IDcuCisgICAqIFxwYXJhbVtvdXRdIEVfY29kZSB1bmJpYXNlZCBpbm5vdmF0aXZlIGNvZGUgdmVjdG9yIGVuZXJneS4KKyAgICogXHBhcmFtW291dF0gRV9jb2RlX2UgZXhwb25lbnQgb2YgdW5iaWFzZWQgaW5ub3ZhdGl2ZSBjb2RlIHZlY3RvciBlbmVyZ3kuCisgICAqLworCisjZGVmaW5lIFNGX01FQU5fRU5FUl9MRzEwIDkKKworLyogcG93KDEwLjAsIHsxOCwgMzAsIDQyLCA1NH0vMjAuMCkgLyhmbG9hdCkoMTw8U0ZfTUVBTl9FTkVSX0xHMTApICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgcG93XzEwX21lYW5fZW5lcmd5WzRdID0gezB4MDFmYzVlYmQsIDB4MDdlN2RiOTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWY3OTFmNjUsIDB4N2Q0YmZiYTN9OworCitzdGF0aWMgdm9pZCBEX2dhaW4yX3BsdXMoaW50IGluZGV4LCBGSVhQX0NPRCBjb2RlW10sIEZJWFBfU0dMICpnYWluX3BpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZ2Fpbl9jb2RlLCBpbnQgbWVhbl9lbmVyX2JpdHMsIGludCBiZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgKnBhc3RfZ3BpdCwgRklYUF9EQkwgKnBhc3RfZ2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBFbmVyX2NvZGUsIGludCAqcEVuZXJfY29kZV9lKSB7CisgIEZJWFBfREJMIEx0bXA7CisgIEZJWFBfREJMIGdjb2RlMCwgZ2NvZGVfaW5vdjsKKyAgSU5UIGdjb2RlMF9lLCBnY29kZV9pbm92X2U7CisgIGludCBpOworCisgIEZJWFBfREJMIGVuZXJfY29kZTsKKyAgSU5UIGVuZXJfY29kZV9lOworCisgIC8qIGVuZXJfY29kZSA9IHN1bShjb2RlW11eMikgKi8KKyAgZW5lcl9jb2RlID0gRklYUF9EQkwoMCk7CisgIGZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpKyspIHsKKyAgICBlbmVyX2NvZGUgKz0gZlBvdzJEaXYyKGNvZGVbaV0pOworICB9CisKKyAgZW5lcl9jb2RlX2UgPSBmTWF4KGZOb3JtKGVuZXJfY29kZSkgLSAxLCAwKTsKKyAgZW5lcl9jb2RlIDw8PSBlbmVyX2NvZGVfZTsKKyAgZW5lcl9jb2RlX2UgPSAyICogU0ZfQ09ERSArIDEgLSBlbmVyX2NvZGVfZTsKKworICAvKiBleHBvcnQgZW5lcmd5IG9mIGNvZGUgZm9yIGNhbGNfcGVyaW9kX2ZhY3RvcigpICovCisgICpwRW5lcl9jb2RlID0gZW5lcl9jb2RlOworICAqcEVuZXJfY29kZV9lID0gZW5lcl9jb2RlX2U7CisKKyAgZW5lcl9jb2RlICs9IHNjYWxlVmFsdWUoRkwyRlhDT05TVF9EQkwoMC4wMWYpLCAtZW5lcl9jb2RlX2UpOworCisgIC8qIGVuZXJfY29kZSAqPSAxL0xfU1VCRlIsIGFuZCBtYWtlIGV4cG9uZW50IGV2ZW4gKGJlY2F1c2Ugb2Ygc3F1YXJlIHJvb3QKKyAgICogYmVsb3cpLiAqLworICBpZiAoZW5lcl9jb2RlX2UgJiAxKSB7CisgICAgZW5lcl9jb2RlX2UgLT0gNTsKKyAgICBlbmVyX2NvZGUgPj49IDE7CisgIH0gZWxzZSB7CisgICAgZW5lcl9jb2RlX2UgLT0gNjsKKyAgfQorICBnY29kZV9pbm92ID0gaW52U3FydE5vcm0yKGVuZXJfY29kZSwgJmdjb2RlMF9lKTsKKyAgZ2NvZGVfaW5vdl9lID0gZ2NvZGUwX2UgLSAoZW5lcl9jb2RlX2UgPj4gMSk7CisKKyAgaWYgKGJmaSkgeworICAgIEZJWFBfREJMIHRnY29kZTsKKyAgICBGSVhQX1NHTCB0Z3BpdDsKKworICAgIHRncGl0ID0gKnBhc3RfZ3BpdDsKKworICAgIGlmICh0Z3BpdCA+IEZMMkZYQ09OU1RfU0dMKDAuOTVmIC8gKDEgPDwgU0ZfR0FJTl9QKSkpIHsKKyAgICAgIHRncGl0ID0gRkwyRlhDT05TVF9TR0woMC45NWYgLyAoMSA8PCBTRl9HQUlOX1ApKTsKKyAgICB9IGVsc2UgaWYgKHRncGl0IDwgRkwyRlhDT05TVF9TR0woMC41ZiAvICgxIDw8IFNGX0dBSU5fUCkpKSB7CisgICAgICB0Z3BpdCA9IEZMMkZYQ09OU1RfU0dMKDAuNWYgLyAoMSA8PCBTRl9HQUlOX1ApKTsKKyAgICB9CisgICAgKmdhaW5fcGl0ID0gdGdwaXQ7CisgICAgdGdwaXQgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KHRncGl0LCBGTDJGWENPTlNUX0RCTCgwLjk1ZikpKTsKKyAgICAqcGFzdF9ncGl0ID0gdGdwaXQ7CisKKyAgICB0Z3BpdCA9IEZMMkZYQ09OU1RfU0dMKDEuNGYgLyAoMSA8PCBTRl9HQUlOX1ApKSAtIHRncGl0OworICAgIHRnY29kZSA9IGZNdWx0KCpwYXN0X2djb2RlLCB0Z3BpdCkgPDwgU0ZfR0FJTl9QOworICAgICpnYWluX2NvZGUgPSBzY2FsZVZhbHVlKGZNdWx0KHRnY29kZSwgZ2NvZGVfaW5vdiksIGdjb2RlX2lub3ZfZSk7CisgICAgKnBhc3RfZ2NvZGUgPSB0Z2NvZGU7CisKKyAgICByZXR1cm47CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tIERlY29kZSBnYWlucyAtLS0tLS0tLS0tLS0tLS0qLworICAvKgorICAgZ2NvZGUwID0gcG93KDEwLjAsIChmbG9hdCltZWFuX2VuZXIvMjAuMCk7CisgICBnY29kZTAgPSBnY29kZTAgLyBzcXJ0KGVuZXJfY29kZS9MX1NVQkZSKTsKKyAgICovCisgIGdjb2RlMCA9IHBvd18xMF9tZWFuX2VuZXJneVttZWFuX2VuZXJfYml0c107CisgIGdjb2RlMCA9IGZNdWx0RGl2MihnY29kZTAsIGdjb2RlX2lub3YpOworICBnY29kZTBfZSA9IGdjb2RlMF9lICsgU0ZfTUVBTl9FTkVSX0xHMTAgLSAoZW5lcl9jb2RlX2UgPj4gMSkgKyAxOworCisgIGkgPSBpbmRleCA8PCAxOworICAqZ2Fpbl9waXQgPSB0X3F1YV9nYWluN2JbaV07IC8qIGFkYXB0aXZlIGNvZGVib29rIGdhaW4gKi8KKyAgLyogdF9xdWFfZ2FpbltpbmQycDFdIDogZml4ZWQgY29kZWJvb2sgZ2FpbiBjb3JyZWN0aW9uIGZhY3RvciAqLworICBMdG1wID0gZk11bHQodF9xdWFfZ2FpbjdiW2kgKyAxXSwgZ2NvZGUwKTsKKyAgKmdhaW5fY29kZSA9IHNjYWxlVmFsdWUoTHRtcCwgZ2NvZGUwX2UgLSBTRl9HQUlOX0MgKyBTRl9RVUFfR0FJTjdCKTsKKworICAvKiB1cGRhdGUgYmFkIGZyYW1lIGhhbmRsZXIgKi8KKyAgKnBhc3RfZ3BpdCA9ICpnYWluX3BpdDsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcGFzdF9nY29kZSAgPSBnYWluX2NvZGUvZ2NvZGVfaW5vdgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB7CisgICAgRklYUF9EQkwgZ2NvZGVfbTsKKyAgICBJTlQgZ2NvZGVfZTsKKworICAgIGdjb2RlX20gPSBmRGl2Tm9ybUhpZ2hQcmVjKEx0bXAsIGdjb2RlX2lub3YsICZnY29kZV9lKTsKKyAgICBnY29kZV9lICs9IChnY29kZTBfZSAtIFNGX0dBSU5fQyArIFNGX1FVQV9HQUlON0IpIC0gKGdjb2RlX2lub3ZfZSk7CisgICAgKnBhc3RfZ2NvZGUgPSBzY2FsZVZhbHVlKGdjb2RlX20sIGdjb2RlX2UpOworICB9Cit9CisKKy8qKgorICogXGJyaWVmIENhbGN1bGF0ZSBwZXJpb2Qvdm9pY2luZyBmYWN0b3Igcl92CisgKiBccGFyYW1baW5dIGV4YyBwaXRjaCBleGNpdGF0aW9uLgorICogXHBhcmFtW2luXSBnYWluX3BpdCBnYWluIG9mIHBpdGNoIGdfcC4KKyAqIFxwYXJhbVtpbl0gZ2Fpbl9jb2RlIGdhaW4gb2YgY29kZSBnX2MuCisgKiBccGFyYW1baW5dIGdhaW5fY29kZV9lIGV4cG9uZW50IG9mIGdhaW4gb2YgY29kZS4KKyAqIFxwYXJhbVtpbl0gZW5lcl9jb2RlIHVuYmlhc2VkIGlubm92YXRpdmUgY29kZSB2ZWN0b3IgZW5lcmd5LgorICogXHBhcmFtW2luXSBlbmVyX2NvZGVfZSBleHBvbmVudCBvZiB1bmJpYXNlZCBpbm5vdmF0aXZlIGNvZGUgdmVjdG9yIGVuZXJneS4KKyAqIFxyZXR1cm4gcGVyaW9kL3ZvaWNlIGZhY3RvciByX3YgKC0xPXVudm9pY2VkIHRvIDE9dm9pY2VkKSwgZXhwb25lbnQgU0ZfUEZBQy4KKyAqLworc3RhdGljIEZJWFBfREJMIGNhbGNfcGVyaW9kX2ZhY3RvcihGSVhQX0RCTCBleGNbXSwgRklYUF9TR0wgZ2Fpbl9waXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGdhaW5fY29kZSwgRklYUF9EQkwgZW5lcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5lcl9jb2RlX2UpIHsKKyAgaW50IGVuZXJfZXhjX2UsIExfdG1wX2UsIHMgPSAwOworICBGSVhQX0RCTCBlbmVyX2V4YywgTF90bXA7CisgIEZJWFBfREJMIHBlcmlvZF9mYWM7CisKKyAgLyogZW5lcmd5IG9mIHBpdGNoIGV4Y2l0YXRpb24gKi8KKyAgZW5lcl9leGMgPSAoRklYUF9EQkwpMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMX1NVQkZSOyBpKyspIHsKKyAgICBlbmVyX2V4YyArPSBmUG93MkRpdjIoZXhjW2ldKSA+PiBzOworICAgIGlmIChlbmVyX2V4YyA+IEZMMkZYQ09OU1RfREJMKDAuNWYpKSB7CisgICAgICBlbmVyX2V4YyA+Pj0gMTsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKworICBlbmVyX2V4Y19lID0gZk5vcm0oZW5lcl9leGMpOworICBlbmVyX2V4YyA9IGZNdWx0KGVuZXJfZXhjIDw8IGVuZXJfZXhjX2UsIGZQb3cyKGdhaW5fcGl0KSk7CisgIGlmIChlbmVyX2V4YyAhPSAoRklYUF9EQkwpMCkgeworICAgIGVuZXJfZXhjX2UgPSAyICogU0ZfRVhDICsgMSArIDIgKiBTRl9HQUlOX1AgLSBlbmVyX2V4Y19lICsgczsKKyAgfSBlbHNlIHsKKyAgICBlbmVyX2V4Y19lID0gMDsKKyAgfQorCisgIC8qIGVuZXJneSBvZiBpbm5vdmF0aXZlIGNvZGUgZXhjaXRhdGlvbiAqLworICAvKiBMX3RtcCA9IGVuZXJfY29kZSAqIGdhaW5fY29kZSpnYWluX2NvZGU7ICovCisgIExfdG1wX2UgPSBmTm9ybShnYWluX2NvZGUpOworICBMX3RtcCA9IGZQb3cyKGdhaW5fY29kZSA8PCBMX3RtcF9lKTsKKyAgTF90bXAgPSBmTXVsdChlbmVyX2NvZGUsIExfdG1wKTsKKyAgTF90bXBfZSA9IDIgKiBTRl9HQUlOX0MgKyBlbmVyX2NvZGVfZSAtIDIgKiBMX3RtcF9lOworCisgIC8qIEZpbmQgY29tbW9uIGV4cG9uZW50ICovCisgIHsKKyAgICBGSVhQX0RCTCBudW0sIGRlbjsKKyAgICBpbnQgZXhwX2RpZmY7CisKKyAgICBleHBfZGlmZiA9IGVuZXJfZXhjX2UgLSBMX3RtcF9lOworICAgIGlmIChleHBfZGlmZiA+PSAwKSB7CisgICAgICBlbmVyX2V4YyA+Pj0gMTsKKyAgICAgIGlmIChleHBfZGlmZiA8PSBERlJBQ1RfQklUUyAtIDIpIHsKKyAgICAgICAgTF90bXAgPj49IGV4cF9kaWZmICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExfdG1wID0gKEZJWFBfREJMKTA7CisgICAgICB9CisgICAgICBkZW4gPSBlbmVyX2V4YyArIExfdG1wOworICAgICAgaWYgKGVuZXJfZXhjX2UgPCBERlJBQ1RfQklUUyAtIDEpIHsKKyAgICAgICAgZGVuICs9IHNjYWxlVmFsdWUoRkwyRlhDT05TVF9EQkwoMC4wMWYpLCAtZW5lcl9leGNfZSAtIDEpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoZXhwX2RpZmYgPj0gLShERlJBQ1RfQklUUyAtIDIpKSB7CisgICAgICAgIGVuZXJfZXhjID4+PSAxIC0gZXhwX2RpZmY7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbmVyX2V4YyA9IChGSVhQX0RCTCkwOworICAgICAgfQorICAgICAgTF90bXAgPj49IDE7CisgICAgICBkZW4gPSBlbmVyX2V4YyArIExfdG1wOworICAgICAgaWYgKExfdG1wX2UgPCBERlJBQ1RfQklUUyAtIDEpIHsKKyAgICAgICAgZGVuICs9IHNjYWxlVmFsdWUoRkwyRlhDT05TVF9EQkwoMC4wMWYpLCAtTF90bXBfZSAtIDEpOworICAgICAgfQorICAgIH0KKyAgICBudW0gPSAoZW5lcl9leGMgLSBMX3RtcCk7CisgICAgbnVtID4+PSBTRl9QRkFDOworCisgICAgaWYgKGRlbiA+IChGSVhQX0RCTCkwKSB7CisgICAgICBpZiAoZW5lcl9leGMgPiBMX3RtcCkgeworICAgICAgICBwZXJpb2RfZmFjID0gc2NodXJfZGl2KG51bSwgZGVuLCAxNik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwZXJpb2RfZmFjID0gLXNjaHVyX2RpdigtbnVtLCBkZW4sIDE2KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcGVyaW9kX2ZhYyA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgIH0KKyAgfQorCisgIC8qIGV4cG9uZW50ID0gU0ZfUEZBQyAqLworICByZXR1cm4gcGVyaW9kX2ZhYzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBub2lzZSBlbmhhbmNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIH5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogLSBFbmhhbmNlIGV4Y2l0YXRpb24gb24gbm9pc2UuIChtb2RpZnkgZ2FpbiBvZiBjb2RlKSAgICAgICAqCisgKiAgIElmIHNpZ25hbCBpcyBub2lzeSBhbmQgTFBDIGZpbHRlciBpcyBzdGFibGUsIG1vdmUgZ2FpbiAgICoKKyAqICAgb2YgY29kZSAxLjUgZEIgdG93YXJkIGdhaW4gb2YgY29kZSB0aHJlc2hvbGQuICAgICAgICAgICAgKgorICogICBUaGlzIGRlY3JlYXNlIGJ5IDMgZEIgbm9pc2UgZW5lcmd5IHZhcmlhdGlvbi4gICAgICAgICAgICAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyAqIFxicmllZiBFbmhhbmNlIGV4Y2l0YXRpb24gb24gbm9pc2UuIChtb2RpZnkgZ2FpbiBvZiBjb2RlKQorICogXHBhcmFtW2luXSBnYWluX2NvZGUgUXVhbnRpemVkIGNvZGVib29rIGdhaW4gZ19jLCBleHBvbmVudCA9IFNGX0dBSU5fQy4KKyAqIFxwYXJhbVtpbl0gcGVyaW9kX2ZhYyBwZXJpb2RpY2l0eSBmYWN0b3IsIGV4cG9uZW50ID0gU0ZfUEZBQy4KKyAqIFxwYXJhbVtpbl0gc3RhYl9mYWMgc3RhYmlsaXR5IGZhY3RvciwgZXhwb25lbnQgPSBTRl9TVEFCLgorICogXHBhcmFtW2luLG91dF0gcF9nY190aHJlc2hvbGQgbW9kaWZpZWQgZ2FpbiBvZiBwcmV2aW91cyBzdWJmcmFtZS4KKyAqIFxyZXR1cm4gZ2Fpbl9jb2RlIHNtb290aGVkIGdhaW4gb2YgY29kZSBnX3NjLCBleHBvbmVudCA9IFNGX0dBSU5fQy4KKyAqLworc3RhdGljIEZJWFBfREJMCitub2lzZV9lbmhhbmNlcigvKiAobykgOiBzbW9vdGhlZCBnYWluIGdfc2MgICAgICAgICAgICAgICAgICAgICBTRl9HQUlOX0MgKi8KKyAgICAgICAgICAgICAgIEZJWFBfREJMIGdhaW5fY29kZSwgLyogKGkpIDogUXVhbnRpemVkIGNvZGVib29rIGdhaW4gU0ZfR0FJTl9DICovCisgICAgICAgICAgICAgICBGSVhQX0RCTCBwZXJpb2RfZmFjLCAvKiAoaSkgOiBwZXJpb2RpY2l0eSBmYWN0b3IgKC0xPXVudm9pY2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPXZvaWNlZCksIFNGX1BGQUMgKi8KKyAgICAgICAgICAgICAgIEZJWFBfU0dMIHN0YWJfZmFjLCAgIC8qIChpKSA6IHN0YWJpbGl0eSBmYWN0b3IgKDAgPD0gLi4uIDwgMS4wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ZfU1RBQiAgICovCisgICAgICAgICAgICAgICBGSVhQX0RCTAorICAgICAgICAgICAgICAgICAgICpwX2djX3RocmVzaG9sZCkgLyogKGlvKTogZ2FpbiBvZiBjb2RlIHRocmVzaG9sZCBTRl9HQUlOX0MgKi8KK3sKKyAgRklYUF9EQkwgZmFjLCBMX3RtcCwgZ2NfdGhyZXM7CisKKyAgZ2NfdGhyZXMgPSAqcF9nY190aHJlc2hvbGQ7CisKKyAgTF90bXAgPSBnYWluX2NvZGU7CisgIGlmIChMX3RtcCA8IGdjX3RocmVzKSB7CisgICAgTF90bXAgKz0gZk11bHREaXYyKGdhaW5fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMi4wICogMC4xOWYpKTsgLyogKzEuNWRCID0+ICooMS4wKzAuMTkpICovCisgICAgaWYgKExfdG1wID4gZ2NfdGhyZXMpIHsKKyAgICAgIExfdG1wID0gZ2NfdGhyZXM7CisgICAgfQorICB9IGVsc2UgeworICAgIExfdG1wID0gZk11bHQoZ2Fpbl9jb2RlLAorICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMS4wZiAvIDEuMTlmKSk7IC8qIC0xLjVkQiA9PiAqMTBeKC0xLjUvMjApICovCisgICAgaWYgKExfdG1wIDwgZ2NfdGhyZXMpIHsKKyAgICAgIExfdG1wID0gZ2NfdGhyZXM7CisgICAgfQorICB9CisgICpwX2djX3RocmVzaG9sZCA9IExfdG1wOworCisgIC8qIHZvaWNpbmcgZmFjdG9yICAgICBsYW1iZGEgPSAwLjUqKDEtcGVyaW9kX2ZhYykgKi8KKyAgLyogZ2FpbiBzbW9vdGhpbmcgZmFjdG9yIFNfbSA9IGxhbWJkYSpzdGFiX2ZhYyAgKD1mYWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLjUoc3RhYl9mYWMgLSBzdGFiX2ZhYyAqIHBlcmlvZF9mYWMpICovCisgIGZhYyA9IChGWF9TR0wyRlhfREJMKHN0YWJfZmFjKSA+PiAoU0ZfUEZBQyArIDEpKSAtCisgICAgICAgIGZNdWx0RGl2MihzdGFiX2ZhYywgcGVyaW9kX2ZhYyk7CisgIC8qIGZhY19lID0gU0ZfUEZBQyArIFNGX1NUQUIgKi8KKyAgRkRLX0FTU0VSVChmYWMgPj0gKEZJWFBfREJMKTApOworCisgIC8qIGdhaW5fY29kZSA9IChmbG9hdCkoKGZhYyp0bXApICsgKCgxLjAtZmFjKSpnYWluX2NvZGUpKTsgKi8KKyAgZ2Fpbl9jb2RlID0gZk11bHQoZmFjLCBMX3RtcCkgLQorICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgtMS4wZiAvICgxIDw8IChTRl9QRkFDICsgU0ZfU1RBQikpKSArIGZhYywKKyAgICAgICAgICAgICAgICAgICAgZ2Fpbl9jb2RlKTsKKyAgZ2Fpbl9jb2RlIDw8PSAoU0ZfUEZBQyArIFNGX1NUQUIpOworCisgIHJldHVybiBnYWluX2NvZGU7Cit9CisKKy8qKgorICogXGJyaWVmIFVwZGF0ZSBhZGFwdGl2ZSBjb2RlYm9vayB1JyhuKSAoZXhjKQorICogICAgICAgIEVuaGFuY2UgcGl0Y2ggb2YgYyhuKSBhbmQgYnVpbGQgcG9zdC1wcm9jZXNzZWQgZXhjaXRhdGlvbiB1KG4pIChleGMyKQorICogXHBhcmFtW2luXSBjb2RlIGlubm92YXRpdmUgY29kZXZlY3RvciBjKG4pLCBleHBvbmVudCA9IFNGX0NPREUuCisgKiBccGFyYW1baW4sb3V0XSBleGMgZmlsdGVyZWQgYWRhcHRpdmUgY29kZWJvb2sgdihuKSwgZXhwb25lbnQgPSBTRl9FWEMuCisgKiBccGFyYW1baW5dIGdhaW5fcGl0IGFkYXB0aXZlIGNvZGVib29rIGdhaW4sIGV4cG9uZW50ID0gU0ZfR0FJTl9QLgorICogXHBhcmFtW2luXSBnYWluX2NvZGUgaW5ub3ZhdGl2ZSBjb2RlYm9vayBnYWluIGdfYywgZXhwb25lbnQgPSBTRl9HQUlOX0MuCisgKiBccGFyYW1baW5dIGdhaW5fY29kZV9zbW9vdGhlZCBzbW9vdGhlZCBpbm5vdi4gY29kZWJvb2sgZ2FpbiBnX3NjLCBleHBvbmVudCA9CisgKiBTRl9HQUlOX0MuCisgKiBccGFyYW1baW5dIHBlcmlvZF9mYWMgcGVyaW9kaWNpdHkgZmFjdG9yIHJfdiwgZXhwb25lbnQgPSBTRl9QRkFDLgorICogXHBhcmFtW291dF0gZXhjMiBwb3N0LXByb2Nlc3NlZCBleGNpdGF0aW9uIHUobiksIGV4cG9uZW50ID0gU0ZfRVhDLgorICovCit2b2lkIEJ1aWxkQWRhcHRpdmVFeGNpdGF0aW9uKAorICAgIEZJWFBfQ09EIGNvZGVbXSwgICAgLyogKGkpIDogYWxnZWJyYWljIGNvZGV2ZWN0b3IgYyhuKSAgICAgICAgICAgICBROSAgKi8KKyAgICBGSVhQX0RCTCBleGNbXSwgICAgIC8qIChpbyk6IGZpbHRlcmVkIGFkYXB0aXZlIGNvZGVib29rIHYobikgICAgICAgUTE1ICovCisgICAgRklYUF9TR0wgZ2Fpbl9waXQsICAvKiAoaSkgOiBhZGFwdGl2ZSBjb2RlYm9vayBnYWluIGdfcCAgICAgICAgICAgIFExNCAqLworICAgIEZJWFBfREJMIGdhaW5fY29kZSwgLyogKGkpIDogaW5ub3ZhdGl2ZSBjb2RlYm9vayBnYWluIGdfYyAgICAgICAgICBRMTYgKi8KKyAgICBGSVhQX0RCTCBnYWluX2NvZGVfc21vb3RoZWQsIC8qIChpKSA6IHNtb290aGVkIGlubm92LiBjb2RlYm9vayBnYWluIGdfc2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFExNiAqLworICAgIEZJWFBfREJMIHBlcmlvZF9mYWMsIC8qIChpKSA6IHBlcmlvZGljaXR5IGZhY3RvciByX3YgICAgICAgICAgICAgICAgUTE1ICovCisgICAgRklYUF9EQkwgZXhjMltdICAgICAgLyogKG8pIDogcG9zdC1wcm9jZXNzZWQgZXhjaXRhdGlvbiB1KG4pICAgICAgICBRMTUgKi8KKykgeworLyogTm90ZTogY29kZVtMX1NVQkZSXSBhbmQgZXhjMltMX1NVQkZSXSBzaGFyZSB0aGUgc2FtZSBtZW1vcnkhCisgICAgICAgICBJZiBleGMyW2ldIGlzIHdyaXR0ZW4sIGNvZGVbaV0gd2lsbCBiZSBkZXN0cm95ZWQhCisqLworI2RlZmluZSBTRiAoU0ZfQ09ERSArIFNGX0dBSU5fQyArIDEgLSBTRl9FWEMpCisKKyAgaW50IGk7CisgIEZJWFBfREJMIHRtcCwgY3BlLCBjb2RlX3Ntb290aF9wcmV2LCBjb2RlX3Ntb290aDsKKworICBGSVhQX0NPRCBjb2RlX2k7CisgIEZJWFBfREJMIGNwZV9jb2RlX3Ntb290aCwgY3BlX2NvZGVfc21vb3RoX3ByZXY7CisKKyAgLyogY3BlID0gKDErcl92KS84ICogMiA7ICggU0YgPSAtMSkgKi8KKyAgY3BlID0gKHBlcmlvZF9mYWMgPj4gKDIgLSBTRl9QRkFDKSkgKyBGTDJGWENPTlNUX0RCTCgwLjI1Zik7CisKKyAgLyogdScobikgKi8KKyAgdG1wID0gZk11bHREaXYyKCpleGMsIGdhaW5fcGl0KSA8PCAoU0ZfR0FJTl9QICsgMSk7IC8qIHYoMCkqZ19wICovCisgICpleGMrKyA9IHRtcCArIChmTXVsdERpdjIoY29kZVswXSwgZ2Fpbl9jb2RlKSA8PCBTRik7CisKKyAgLyogdShuKSAqLworICBjb2RlX3Ntb290aF9wcmV2ID0gZk11bHREaXYyKCpjb2RlKyssIGdhaW5fY29kZV9zbW9vdGhlZCkKKyAgICAgICAgICAgICAgICAgICAgIDw8IFNGOyAvKiBjKDApICogZ19zYyAqLworICBjb2RlX2kgPSAqY29kZSsrOworICBjb2RlX3Ntb290aCA9IGZNdWx0RGl2Mihjb2RlX2ksIGdhaW5fY29kZV9zbW9vdGhlZCkgPDwgU0Y7IC8qIGMoMSkgKiBnX3NjICovCisgIHRtcCArPSBjb2RlX3Ntb290aF9wcmV2OyAvKiB0bXAgPSB2KDApKmdfcCArIGMoMCkqZ19zYyAqLworICBjcGVfY29kZV9zbW9vdGggPSBmTXVsdERpdjIoY3BlLCBjb2RlX3Ntb290aCk7CisgICpleGMyKysgPSB0bXAgLSBjcGVfY29kZV9zbW9vdGg7CisgIGNwZV9jb2RlX3Ntb290aF9wcmV2ID0gZk11bHREaXYyKGNwZSwgY29kZV9zbW9vdGhfcHJldik7CisKKyAgaSA9IExfU1VCRlIgLSAyOworICBkbyAvKiBBUk05MjY6IDIyIGN5Y2xlcyBwZXIgaXRlcmF0aW9uICovCisgIHsKKyAgICAvKiB1JyhuKSAqLworICAgIHRtcCA9IGZNdWx0RGl2MigqZXhjLCBnYWluX3BpdCkgPDwgKFNGX0dBSU5fUCArIDEpOworICAgICpleGMrKyA9IHRtcCArIChmTXVsdERpdjIoY29kZV9pLCBnYWluX2NvZGUpIDw8IFNGKTsKKyAgICAvKiB1KG4pICovCisgICAgdG1wICs9IGNvZGVfc21vb3RoOyAvKiArPSBnX3NjICogYyhpKSAqLworICAgIHRtcCAtPSBjcGVfY29kZV9zbW9vdGhfcHJldjsKKyAgICBjcGVfY29kZV9zbW9vdGhfcHJldiA9IGNwZV9jb2RlX3Ntb290aDsKKyAgICBjb2RlX2kgPSAqY29kZSsrOworICAgIGNvZGVfc21vb3RoID0gZk11bHREaXYyKGNvZGVfaSwgZ2Fpbl9jb2RlX3Ntb290aGVkKSA8PCBTRjsKKyAgICBjcGVfY29kZV9zbW9vdGggPSBmTXVsdERpdjIoY3BlLCBjb2RlX3Ntb290aCk7CisgICAgKmV4YzIrKyA9IHRtcCAtIGNwZV9jb2RlX3Ntb290aDsgLyogdG1wIC0gY19wZSAqIGdfc2MgKiBjKGkrMSkgKi8KKyAgfSB3aGlsZSAoLS1pICE9IDApOworCisgIC8qIHUnKG4pICovCisgIHRtcCA9IGZNdWx0RGl2MigqZXhjLCBnYWluX3BpdCkgPDwgKFNGX0dBSU5fUCArIDEpOworICAqZXhjID0gdG1wICsgKGZNdWx0RGl2Mihjb2RlX2ksIGdhaW5fY29kZSkgPDwgU0YpOworICAvKiB1KG4pICovCisgIHRtcCArPSBjb2RlX3Ntb290aDsKKyAgdG1wIC09IGNwZV9jb2RlX3Ntb290aF9wcmV2OworICAqZXhjMisrID0gdG1wOworCisgIHJldHVybjsKK30KKworLyoqCisgKiBcYnJpZWYgSW50ZXJwb2xhdGUgTFBDIHZlY3RvciBpbiBMU1AgZG9tYWluIGZvciBjdXJyZW50IHN1YmZyYW1lIGFuZCBjb252ZXJ0CisgKiB0byBMUCBkb21haW4KKyAqIFxwYXJhbVtpbl0gbHNwX29sZCBMUEMgdmVjdG9yIChMU1AgZG9tYWluKSBjb3JyZXNwb25kaW5nIHRvIHRoZSBiZWdpbm5pbmcgb2YKKyAqIGN1cnJlbnQgQUNFTFAgZnJhbWUuCisgKiBccGFyYW1baW5dIGxzcF9uZXcgTFBDIHZlY3RvciAoTFNQIGRvbWFpbikgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mCisgKiBjdXJyZW50IEFDRUxQIGZyYW1lLgorICogXHBhcmFtW2luXSBzdWJmcl9uciBudW1iZXIgb2YgY3VycmVudCBBQ0VMUCBzdWJmcmFtZSAwLi4zLgorICogXHBhcmFtW2luXSBuYl9zdWJmciB0b3RhbCBudW1iZXIgb2YgQUNFTFAgc3ViZnJhbWVzIGluIHRoaXMgZnJhbWUuCisgKiBccGFyYW1bb3V0XSBBIExQIGZpbHRlciBjb2VmZmljaWVudHMgZm9yIGN1cnJlbnQgQUNFTFAgc3ViZnJhbWUsIGV4cG9uZW50ID0KKyAqIFNGX0FfQ09FRkZTLgorICovCisvKiBzdGF0aWMgKi8KK3ZvaWQgaW50X2xwY19hY2VscCgKKyAgICBjb25zdCBGSVhQX0xQQyBsc3Bfb2xkW10sIC8qIGlucHV0IDogTFNQcyBmcm9tIHBhc3QgZnJhbWUgICAgICAgICAgICAgICovCisgICAgY29uc3QgRklYUF9MUEMgbHNwX25ld1tdLCAvKiBpbnB1dCA6IExTUHMgZnJvbSBwcmVzZW50IGZyYW1lICAgICAgICAgICAqLworICAgIGludCBzdWJmcl9uciwgaW50IG5iX3N1YmZyLAorICAgIEZJWFBfTFBDCisgICAgICAgIEFbXSwgLyogb3V0cHV0OiBpbnRlcnBvbGF0ZWQgTFAgY29lZmZpY2llbnRzIGZvciBjdXJyZW50IHN1YmZyYW1lICovCisgICAgSU5UICpBX2V4cCkgeworICBpbnQgaTsKKyAgRklYUF9MUEMgbHNwX2ludGVycG9sW01fTFBfRklMVEVSX09SREVSXTsKKyAgRklYUF9TR0wgZmFjX29sZCwgZmFjX25ldzsKKworICBGREtfQVNTRVJUKChuYl9zdWJmciA9PSAzKSB8fCAobmJfc3ViZnIgPT0gNCkpOworCisgIGZhY19vbGQgPSBsc3BfaW50ZXJwb2xfZmFjdG9yW25iX3N1YmZyICYgMHgxXVsobmJfc3ViZnIgLSAxKSAtIHN1YmZyX25yXTsKKyAgZmFjX25ldyA9IGxzcF9pbnRlcnBvbF9mYWN0b3JbbmJfc3ViZnIgJiAweDFdW3N1YmZyX25yXTsKKyAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICBsc3BfaW50ZXJwb2xbaV0gPSBGWF9EQkwyRlhfTFBDKAorICAgICAgICAoZk11bHREaXYyKGxzcF9vbGRbaV0sIGZhY19vbGQpICsgZk11bHREaXYyKGxzcF9uZXdbaV0sIGZhY19uZXcpKSA8PCAxKTsKKyAgfQorCisgIEVfTFBDX2ZfbHNwX2FfY29udmVyc2lvbihsc3BfaW50ZXJwb2wsIEEsIEFfZXhwKTsKKworICByZXR1cm47Cit9CisKKy8qKgorICogXGJyaWVmIFBlcmZvcm0gTFAgc3ludGhlc2lzIGJ5IGZpbHRlcmluZyB0aGUgcG9zdC1wcm9jZXNzZWQgZXhjaXRhdGlvbiB1KG4pCisgKiAgICAgICAgdGhyb3VnaCB0aGUgTFAgc3ludGhlc2lzIGZpbHRlciAxL0EoeikKKyAqIFxwYXJhbVtpbl0gYSBMUCBmaWx0ZXIgY29lZmZpY2llbnRzLCBleHBvbmVudCA9IFNGX0FfQ09FRkZTLgorICogXHBhcmFtW2luXSBsZW5ndGggbGVuZ3RoIG9mIGlucHV0L291dHB1dCBzaWduYWwuCisgKiBccGFyYW1baW5dIHggcG9zdC1wcm9jZXNzZWQgZXhjaXRhdGlvbiB1KG4pLgorICogXHBhcmFtW2luLG91dF0geSBMUCBzeW50aGVzaXMgc2lnbmFsIGFuZCBmaWx0ZXIgbWVtb3J5CisgKiB5Wy1NX0xQX0ZJTFRFUl9PUkRFUi4uLTFdLgorICovCisKKy8qIHN0YXRpYyAqLwordm9pZCBTeW5fZmlsdChjb25zdCBGSVhQX0xQQyBhW10sIC8qIChpKSA6IGFbbV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgUTEyICovCisgICAgICAgICAgICAgIGNvbnN0IElOVCBhX2V4cCwKKyAgICAgICAgICAgICAgSU5UIGxlbmd0aCwgICAvKiAoaSkgOiBsZW5ndGggb2YgaW5wdXQvb3V0cHV0IHNpZ25hbCAoNjR8MTI4KSAgICovCisgICAgICAgICAgICAgIEZJWFBfREJMIHhbXSwgLyogKGkpIDogaW5wdXQgc2lnbmFsIFF4ICAqLworICAgICAgICAgICAgICBGSVhQX0RCTCB5W10gIC8qIChpL28pIDogZmlsdGVyIHN0YXRlcyAvIG91dHB1dCBzaWduYWwgIFF4LXMqLworKSB7CisgIGludCBpLCBqOworICBGSVhQX0RCTCBMX3RtcDsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICBMX3RtcCA9IChGSVhQX0RCTCkwOworCisgICAgZm9yIChqID0gMDsgaiA8IE1fTFBfRklMVEVSX09SREVSOyBqKyspIHsKKyAgICAgIExfdG1wIC09IGZNdWx0RGl2MihhW2pdLCB5W2kgLSAoaiArIDEpXSk7CisgICAgfQorCisgICAgTF90bXAgPSBzY2FsZVZhbHVlKExfdG1wLCBhX2V4cCArIDEpOworICAgIHlbaV0gPSBMX3RtcCArIHhbaV07CisgIH0KKworICByZXR1cm47Cit9CisKKy8qKgorICogXGJyaWVmIENhbGN1bGF0ZSBkZS1lbXBoYXNpcyAxLygxIC0gbXUgel4tMSkgb24gaW5wdXQgc2lnbmFsLgorICogXHBhcmFtW2luXSB4IGlucHV0IHNpZ25hbC4KKyAqIFxwYXJhbVtvdXRdIHkgb3V0cHV0IHNpZ25hbC4KKyAqIFxwYXJhbVtpbl0gTCBsZW5ndGggb2Ygc2lnbmFsLgorICogXHBhcmFtW2luLG91dF0gbWVtIG1lbW9yeSAoc2lnbmFsWy0xXSkuCisgKi8KKy8qIHN0YXRpYyAqLwordm9pZCBEZWVtcGgoRklYUF9EQkwgKngsIEZJWFBfREJMICp5LCBpbnQgTCwgRklYUF9EQkwgKm1lbSkgeworICBpbnQgaTsKKyAgRklYUF9EQkwgeWkgPSAqbWVtOworCisgIGZvciAoaSA9IDA7IGkgPCBMOyBpKyspIHsKKyAgICBGSVhQX0RCTCB4aSA9IHhbaV0gPj4gMTsKKyAgICB4aSA9IGZNdWx0QWRkRGl2Mih4aSwgUFJFRU1QSF9GQUMsIHlpKTsKKyAgICB5aSA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoeGksIDEsIDMyKTsKKyAgICB5W2ldID0geWk7CisgIH0KKyAgKm1lbSA9IHlpOworICByZXR1cm47Cit9CisKKy8qKgorICogXGJyaWVmIENvbXB1dGUgdGhlIExQIHJlc2lkdWFsIGJ5IGZpbHRlcmluZyB0aGUgaW5wdXQgc3BlZWNoIHRocm91Z2ggdGhlCisgKiBhbmFseXNpcyBmaWx0ZXIgQSh6KS4KKyAqIFxwYXJhbVtpbl0gYSBMUCBmaWx0ZXIgY29lZmZpY2llbnRzLCBleHBvbmVudCA9IFNGX0FfQ09FRkZTCisgKiBccGFyYW1baW5dIHggaW5wdXQgc2lnbmFsIChub3RlIHRoYXQgdmFsdWVzIHhbLW0uLi0xXSBhcmUgbmVlZGVkKSwgZXhwb25lbnQgPQorICogU0ZfU1lOVEgKKyAqIFxwYXJhbVtvdXRdIHkgb3V0cHV0IHNpZ25hbCAocmVzaWR1YWwpLCBleHBvbmVudCA9IFNGX0VYQworICogXHBhcmFtW2luXSBsIGxlbmd0aCBvZiBmaWx0ZXJpbmcKKyAqLworLyogc3RhdGljICovCit2b2lkIEVfVVRJTF9yZXNpZHUoY29uc3QgRklYUF9MUEMgKmEsIGNvbnN0IElOVCBhX2V4cCwgRklYUF9EQkwgKngsIEZJWFBfREJMICp5LAorICAgICAgICAgICAgICAgICAgIElOVCBsKSB7CisgIEZJWFBfREJMIHM7CisgIElOVCBpLCBqOworCisgIC8qIChub3RlIHRoYXQgdmFsdWVzIHhbLW0uLi0xXSBhcmUgbmVlZGVkKSAqLworICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CisgICAgcyA9IChGSVhQX0RCTCkwOworCisgICAgZm9yIChqID0gMDsgaiA8IE1fTFBfRklMVEVSX09SREVSOyBqKyspIHsKKyAgICAgIHMgKz0gZk11bHREaXYyKGFbal0sIHhbaSAtIGogLSAxXSk7CisgICAgfQorCisgICAgcyA9IHNjYWxlVmFsdWUocywgYV9leHAgKyAxKTsKKyAgICB5W2ldID0gZkFkZFNhdHVyYXRlKHMsIHhbaV0pOworICB9CisKKyAgcmV0dXJuOworfQorCisvKiB1c2UgdG8gbWFwIHN1YmZyIG51bWJlciB0byBudW1iZXIgb2YgYml0cyB1c2VkIGZvciBhY2JfaW5kZXggKi8KK3N0YXRpYyBjb25zdCBVQ0hBUiBudW1fYWNiX2lkeF9iaXRzX3RhYmxlWzJdW05CX1NVQkZSXSA9IHsKKyAgICB7OSwgNiwgOSwgNn0sIC8qIGNvcmVDb2RlckZyYW1lTGVuZ3RoID09IDEwMjQgKi8KKyAgICB7OSwgNiwgNiwgMH0gIC8qIGNvcmVDb2RlckZyYW1lTGVuZ3RoID09IDc2OCAgKi8KK307CisKK3N0YXRpYyBpbnQgRGVjb2RlUGl0Y2hMYWcoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBudW1fYWNiX2lkeF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgUElUX01JTiwgLyogVE1JTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgUElUX0ZSMiwgLyogVEZSMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgUElUX0ZSMSwgLyogVEZSMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgUElUX01BWCwgLyogVE1BWCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBUMCwgaW50ICpwVDBfZnJhYywgaW50ICpwVDBfbWluLCBpbnQgKnBUMF9tYXgpIHsKKyAgaW50IGFjYl9pZHg7CisgIGludCBlcnJvciA9IDA7CisgIGludCBUMCwgVDBfZnJhYzsKKworICBGREtfQVNTRVJUKChudW1fYWNiX2lkeF9iaXRzID09IDkpIHx8IChudW1fYWNiX2lkeF9iaXRzID09IDYpKTsKKworICBhY2JfaWR4ID0gRkRLcmVhZEJpdHMoaEJzLCBudW1fYWNiX2lkeF9iaXRzKTsKKworICBpZiAobnVtX2FjYl9pZHhfYml0cyA9PSA2KSB7CisgICAgLyogV2hlbiB0aGUgcGl0Y2ggdmFsdWUgaXMgZW5jb2RlZCBvbiA2IGJpdHMsIGEgcGl0Y2ggcmVzb2x1dGlvbiBvZiAxLzQgaXMKKyAgICAgICBhbHdheXMgdXNlZCBpbiB0aGUgcmFuZ2UgW1QxLTgsIFQxKzcuNzVdLCB3aGVyZSBUMSBpcyBuZWFyZXN0IGludGVnZXIgdG8KKyAgICAgICB0aGUgZnJhY3Rpb25hbCBwaXRjaCBsYWcgb2YgdGhlIHByZXZpb3VzIHN1YmZyYW1lLgorICAgICovCisgICAgVDAgPSAqcFQwX21pbiArIGFjYl9pZHggLyA0OworICAgIFQwX2ZyYWMgPSBhY2JfaWR4ICYgMHgzOworICB9IGVsc2UgeyAvKiBudW1fYWNiX2lkeF9iaXRzID09IDkgKi8KKyAgICAvKiBXaGVuIHRoZSBwaXRjaCB2YWx1ZSBpcyBlbmNvZGVkIG9uIDkgYml0cywgYSBmcmFjdGlvbmFsIHBpdGNoIGRlbGF5IGlzCisgICAgICAgdXNlZCB3aXRoIHJlc29sdXRpb25zIDAuMjUgaW4gdGhlIHJhbmdlIFtUTUlOLCBURlIyLTAuMjVdLCByZXNvbHV0aW9ucworICAgICAgIDAuNSBpbiB0aGUgcmFuZ2UgW1RGUjIsIFRGUjEtMC41XSwgYW5kIGludGVnZXJzIG9ubHkgaW4gdGhlIHJhbmdlIFtURlIxLAorICAgICAgIFRNQVhdLiBOT1RFOiBmb3Igc21hbGwgc2FtcGxpbmcgcmF0ZXMgVE1BWCBjYW4gZ2V0IHNtYWxsZXIgdGhhbiBURlIxLgorICAgICovCisgICAgaW50IFQwX21pbiwgVDBfbWF4OworCisgICAgaWYgKGFjYl9pZHggPCAoUElUX0ZSMiAtIFBJVF9NSU4pICogNCkgeworICAgICAgLyogZmlyc3QgaW50ZXJ2YWwgd2l0aCAwLjI1IHBpdGNoIHJlc29sdXRpb24gKi8KKyAgICAgIFQwID0gUElUX01JTiArIChhY2JfaWR4IC8gNCk7CisgICAgICBUMF9mcmFjID0gYWNiX2lkeCAmIDB4MzsKKyAgICB9IGVsc2UgaWYgKGFjYl9pZHggPCAoKFBJVF9GUjIgLSBQSVRfTUlOKSAqIDQgKyAoUElUX0ZSMSAtIFBJVF9GUjIpICogMikpIHsKKyAgICAgIC8qIHNlY29uZCBpbnRlcnZhbCB3aXRoIDAuNSBwaXRjaCByZXNvbHV0aW9uICovCisgICAgICBhY2JfaWR4IC09IChQSVRfRlIyIC0gUElUX01JTikgKiA0OworICAgICAgVDAgPSBQSVRfRlIyICsgKGFjYl9pZHggLyAyKTsKKyAgICAgIFQwX2ZyYWMgPSAoYWNiX2lkeCAmIDB4MSkgKiAyOworICAgIH0gZWxzZSB7CisgICAgICAvKiB0aGlyZCBpbnRlcnZhbCB3aXRoIDEuMCBwaXRjaCByZXNvbHV0aW9uICovCisgICAgICBUMCA9IGFjYl9pZHggKyBQSVRfRlIxIC0gKChQSVRfRlIyIC0gUElUX01JTikgKiA0KSAtCisgICAgICAgICAgICgoUElUX0ZSMSAtIFBJVF9GUjIpICogMik7CisgICAgICBUMF9mcmFjID0gMDsKKyAgICB9CisgICAgLyogZmluZCBUMF9taW4gYW5kIFQwX21heCBmb3Igc3ViZnJhbWUgMSBvciAzICovCisgICAgVDBfbWluID0gVDAgLSA4OworICAgIGlmIChUMF9taW4gPCBQSVRfTUlOKSB7CisgICAgICBUMF9taW4gPSBQSVRfTUlOOworICAgIH0KKyAgICBUMF9tYXggPSBUMF9taW4gKyAxNTsKKyAgICBpZiAoVDBfbWF4ID4gUElUX01BWCkgeworICAgICAgVDBfbWF4ID0gUElUX01BWDsKKyAgICAgIFQwX21pbiA9IFQwX21heCAtIDE1OworICAgIH0KKyAgICAqcFQwX21pbiA9IFQwX21pbjsKKyAgICAqcFQwX21heCA9IFQwX21heDsKKyAgfQorICAqcFQwID0gVDA7CisgICpwVDBfZnJhYyA9IFQwX2ZyYWM7CisKKyAgcmV0dXJuIGVycm9yOworfQorc3RhdGljIHZvaWQgQ29uY2VhbFBpdGNoTGFnKENBY2VscFN0YXRpY01lbSAqYWNlbHBfbWVtLCBjb25zdCBpbnQgUElUX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBUMCwgaW50ICpwVDBfZnJhYykgeworICBVU0hPUlQgKnBvbGRfVDAgPSAmYWNlbHBfbWVtLT5vbGRfVDA7CisgIFVDSEFSICpwb2xkX1QwX2ZyYWMgPSAmYWNlbHBfbWVtLT5vbGRfVDBfZnJhYzsKKworICBpZiAoKGludCkqcG9sZF9UMCA+PSBQSVRfTUFYKSB7CisgICAgKnBvbGRfVDAgPSAoVUNIQVIpKFBJVF9NQVggLSA1KTsKKyAgfQorICAqcFQwID0gKGludCkqcG9sZF9UMDsKKyAgKnBUMF9mcmFjID0gKGludCkqcG9sZF9UMF9mcmFjOworfQorCitzdGF0aWMgVUNIQVIgdGFiX2NvcmVtb2RlMm5iaXRzWzhdID0gezIwLCAyOCwgMzYsIDQ0LCA1MiwgNjQsIDEyLCAxNn07CisKK3N0YXRpYyBpbnQgTWFwQ29yZU1vZGUyTkJpdHMoaW50IGNvcmVfbW9kZSkgeworICByZXR1cm4gKGludCl0YWJfY29yZW1vZGUybmJpdHNbY29yZV9tb2RlXTsKK30KKwordm9pZCBDTHBkX0FjZWxwRGVjb2RlKENBY2VscFN0YXRpY01lbSAqYWNlbHBfbWVtLCBJTlQgaV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9MUEMgbHNwX29sZFtNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9MUEMgbHNwX25ld1tNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgc3RhYl9mYWMsIENBY2VscENoYW5uZWxEYXRhICpwQWNlbHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1Mb3N0U3ViZnJhbWVzLCBpbnQgbGFzdExwY0xvc3QsIGludCBmcmFtZUNudCwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBzeW50aFtdLCBpbnQgcFRbXSwgRklYUF9EQkwgKnBpdF9nYWluLAorICAgICAgICAgICAgICAgICAgICAgIElOVCBjb3JlQ29kZXJGcmFtZUxlbmd0aCkgeworICBpbnQgaV9zdWJmciwgc3ViZnJfbnIsIGxfZGl2LCBUOworICBpbnQgVDAgPSAtMSwgVDBfZnJhYyA9IC0xOyAvKiBtYXJrIGludmFsaWQgKi8KKworICBpbnQgcGl0X2dhaW5faW5kZXggPSAwOworCisgIGNvbnN0IGludCBQSVRfTUFYID0gUElUX01BWF8xMms4ICsgKDYgKiBpX29mZnNldCk7IC8qIG1heGltdW0gcGl0Y2ggbGFnICovCisKKyAgRklYUF9DT0QgKmNvZGU7CisgIEZJWFBfREJMICpleGMyOworICBGSVhQX0RCTCAqc3luOworICBGSVhQX0RCTCAqZXhjOworICBGSVhQX0xQQyBBW01fTFBfRklMVEVSX09SREVSXTsKKyAgSU5UIEFfZXhwOworCisgIEZJWFBfREJMIHBlcmlvZF9mYWM7CisgIEZJWFBfU0dMIGdhaW5fcGl0OworICBGSVhQX0RCTCBnYWluX2NvZGUsIGdhaW5fY29kZV9zbW9vdGgsIEVuZXJfY29kZTsKKyAgaW50IEVuZXJfY29kZV9lOworICBpbnQgbjsKKyAgaW50IGJmaSA9IChudW1Mb3N0U3ViZnJhbWVzID4gMCkgPyAxIDogMDsKKworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoCisgICAgICBleGNfYnVmLCBGSVhQX0RCTCwKKyAgICAgIFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCArIExfRElWICsgMSk7IC8qIDQxMSArIDE3ICsgMjU2ICsgMSA9IDY4NSAqLworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoc3luX2J1ZiwgRklYUF9EQkwsCisgICAgICAgICAgICAgICAgICAgICAgICBNX0xQX0ZJTFRFUl9PUkRFUiArIExfRElWKTsgLyogMTYgKyAyNTYgPSAyNzIgKi8KKyAgLyogdXNlIHNhbWUgbWVtb3J5IGZvciBjb2RlW0xfU1VCRlJdIGFuZCBleGMyW0xfU1VCRlJdICovCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBfYnVmLCBGSVhQX0RCTCwgTF9TVUJGUik7IC8qIDY0ICovCisgIC8qIG1ha2Ugc3VyZSB0aGV5IGRvbid0IG92ZXJsYXAgaWYgdGhleSBhcmUgYWNjZXNzZWQgYWx0ZXJuYXRpbmdseSBpbgorICAgKiBCdWlsZEFkYXB0aXZlRXhjaXRhdGlvbigpICovCisjaWYgKENPRF9CSVRTID09IEZSQUNUX0JJVFMpCisgIGNvZGUgPSAoRklYUF9DT0QgKikodG1wX2J1ZiArIExfU1VCRlIgLyAyKTsKKyNlbGlmIChDT0RfQklUUyA9PSBERlJBQ1RfQklUUykKKyAgY29kZSA9IChGSVhQX0NPRCAqKXRtcF9idWY7CisjZW5kaWYKKyAgZXhjMiA9IChGSVhQX0RCTCAqKXRtcF9idWY7CisKKyAgc3luID0gc3luX2J1ZiArIE1fTFBfRklMVEVSX09SREVSOworICBleGMgPSBleGNfYnVmICsgUElUX01BWF9NQVggKyBMX0lOVEVSUE9MOworCisgIEZES21lbWNweShzeW5fYnVmLCBhY2VscF9tZW0tPm9sZF9zeW5fbWVtLAorICAgICAgICAgICAgTV9MUF9GSUxURVJfT1JERVIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY3B5KGV4Y19idWYsIGFjZWxwX21lbS0+b2xkX2V4Y19tZW0sCisgICAgICAgICAgICAoUElUX01BWF9NQVggKyBMX0lOVEVSUE9MKSAqIHNpemVvZihGSVhQX0RCTCkpOworCisgIEZES21lbWNsZWFyKGV4Y19idWYgKyAoUElUX01BWF9NQVggKyBMX0lOVEVSUE9MKSwKKyAgICAgICAgICAgICAgKExfRElWICsgMSkgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICBsX2RpdiA9IGNvcmVDb2RlckZyYW1lTGVuZ3RoIC8gTkJfRElWOworCisgIGZvciAoaV9zdWJmciA9IDAsIHN1YmZyX25yID0gMDsgaV9zdWJmciA8IGxfZGl2OworICAgICAgIGlfc3ViZnIgKz0gTF9TVUJGUiwgc3ViZnJfbnIrKykgeworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiAtIERlY29kZSBwaXRjaCBsYWcgKFQwIGFuZCBUMF9mcmFjKSAgICAgICAgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoYmZpKSB7CisgICAgICBDb25jZWFsUGl0Y2hMYWcoYWNlbHBfbWVtLCBQSVRfTUFYLCAmVDAsICZUMF9mcmFjKTsKKyAgICB9IGVsc2UgeworICAgICAgVDAgPSAoaW50KXBBY2VscERhdGEtPlQwW3N1YmZyX25yXTsKKyAgICAgIFQwX2ZyYWMgPSAoaW50KXBBY2VscERhdGEtPlQwX2ZyYWNbc3ViZnJfbnJdOworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiAtIEZpbmQgdGhlIHBpdGNoIGdhaW4sIHRoZSBpbnRlcnBvbGF0aW9uIGZpbHRlciAqCisgICAgICogICBhbmQgdGhlIGFkYXB0aXZlIGNvZGVib29rIHZlY3Rvci4gICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgUHJlZF9sdDQoJmV4Y1tpX3N1YmZyXSwgVDAsIFQwX2ZyYWMpOworCisgICAgaWYgKCghYmZpICYmIHBBY2VscERhdGEtPmx0cF9maWx0ZXJpbmdfZmxhZ1tzdWJmcl9ucl0gPT0gMCkgfHwKKyAgICAgICAgKGJmaSAmJiBudW1Mb3N0U3ViZnJhbWVzID09IDEgJiYgc3RhYl9mYWMgPCBGTDJGWENPTlNUX1NHTCgwLjI1ZikpKSB7CisgICAgICAvKiBmaW5kIHBpdGNoIGV4Y2l0YXRpb24gd2l0aCBscCBmaWx0ZXI6IHYnKG4pID0+IHYobikgKi8KKyAgICAgIFByZWRfbHQ0X3Bvc3RmaWx0ZXIoJmV4Y1tpX3N1YmZyXSk7CisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqIC0gRGVjb2RlIGlubm92YXRpdmUgY29kZWJvb2suICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAtIEFkZCB0aGUgZml4ZWQtZ2FpbiBwaXRjaCBjb250cmlidXRpb24gdG8gY29kZVtdLiAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoYmZpKSB7CisgICAgICBmb3IgKG4gPSAwOyBuIDwgTF9TVUJGUjsgbisrKSB7CisgICAgICAgIGNvZGVbbl0gPQorICAgICAgICAgICAgRlhfU0dMMkZYX0NPRCgoRklYUF9TR0wpRV9VVElMX3JhbmRvbSgmYWNlbHBfbWVtLT5zZWVkX2FjZSkpID4+IDQ7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBuYml0cyA9IE1hcENvcmVNb2RlMk5CaXRzKChpbnQpcEFjZWxwRGF0YS0+YWNlbHBfY29yZV9tb2RlKTsKKyAgICAgIERfQUNFTFBfZGVjb2RlXzR0NjQocEFjZWxwRGF0YS0+aWNiX2luZGV4W3N1YmZyX25yXSwgbmJpdHMsICZjb2RlWzBdKTsKKyAgICB9CisKKyAgICBUID0gVDA7CisgICAgaWYgKFQwX2ZyYWMgPiAyKSB7CisgICAgICBUICs9IDE7CisgICAgfQorCisgICAgUHJlZW1waF9jb2RlKGNvZGUpOworICAgIFBpdF9zaHJwKGNvZGUsIFQpOworCisgICAgLyogT3V0cHV0IHBpdGNoIGxhZyBmb3IgYmFzcyBwb3N0LWZpbHRlciAqLworICAgIGlmIChUID4gUElUX01BWCkgeworICAgICAgcFRbc3ViZnJfbnJdID0gUElUX01BWDsKKyAgICB9IGVsc2UgeworICAgICAgcFRbc3ViZnJfbnJdID0gVDsKKyAgICB9CisgICAgRF9nYWluMl9wbHVzKAorICAgICAgICBwQWNlbHBEYXRhLT5nYWluc1tzdWJmcl9ucl0sCisgICAgICAgIGNvZGUsICAgICAgIC8qIChpKSAgOiBJbm5vdmF0aXZlIGNvZGUgdmVjdG9yLCBleHBvbmVudCA9IFNGX0NPREUgKi8KKyAgICAgICAgJmdhaW5fcGl0LCAgLyogKG8pICA6IFF1YW50aXplZCBwaXRjaCBnYWluLCBleHBvbmVudCA9IFNGX0dBSU5fUCAqLworICAgICAgICAmZ2Fpbl9jb2RlLCAvKiAobykgIDogUXVhbnRpemVkIGNvZGVib29rIGdhaW4gICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHBBY2VscERhdGEKKyAgICAgICAgICAgIC0+bWVhbl9lbmVyZ3ksIC8qIChpKSAgOiBtZWFuX2VuZXIgZGVmaW5lZCBpbiBvcGVuLWxvb3AgKDIgYml0cykgKi8KKyAgICAgICAgYmZpLCAmYWNlbHBfbWVtLT5wYXN0X2dwaXQsICZhY2VscF9tZW0tPnBhc3RfZ2NvZGUsCisgICAgICAgICZFbmVyX2NvZGUsICAgIC8qIChvKSAgOiBJbm5vdmF0aXZlIGNvZGUgdmVjdG9yIGVuZXJneSAgICAgICAgICAgICAgKi8KKyAgICAgICAgJkVuZXJfY29kZV9lKTsgLyogKG8pICA6IElubm92YXRpdmUgY29kZSB2ZWN0b3IgZW5lcmd5IGV4cG9uZW50ICAgICAqLworCisgICAgcGl0X2dhaW5bcGl0X2dhaW5faW5kZXgrK10gPSBGWF9TR0wyRlhfREJMKGdhaW5fcGl0KTsKKworICAgIC8qIGNhbGMgcGVyaW9kaWNpdHkgZmFjdG9yIHJfdiAqLworICAgIHBlcmlvZF9mYWMgPQorICAgICAgICBjYWxjX3BlcmlvZF9mYWN0b3IoLyogKG8pIDogZmFjdG9yICgtMT11bnZvaWNlZCB0byAxPXZvaWNlZCkgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZleGNbaV9zdWJmcl0sIC8qIChpKSA6IHBpdGNoIGV4Y2l0YXRpb24sIGV4cG9uZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGX0VYQyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl9waXQsICAgICAgLyogKGkpIDogZ2FpbiBvZiBwaXRjaCwgZXhwb25lbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ZfR0FJTl9QICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluX2NvZGUsICAgICAvKiAoaSkgOiBnYWluIG9mIGNvZGUgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmVyX2NvZGUsICAgICAvKiAoaSkgOiBFbmVyZ3kgb2YgY29kZVtdICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5lcl9jb2RlX2UpOyAgLyogKGkpIDogRXhwb25lbnQgb2YgZW5lcmd5IG9mIGNvZGVbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBpZiAobGFzdExwY0xvc3QgJiYgZnJhbWVDbnQgPT0gMCkgeworICAgICAgaWYgKGdhaW5fcGl0ID4gRkwyRlhDT05TVF9TR0woMS4wZiAvICgxIDw8IFNGX0dBSU5fUCkpKSB7CisgICAgICAgIGdhaW5fcGl0ID0gRkwyRlhDT05TVF9TR0woMS4wZiAvICgxIDw8IFNGX0dBSU5fUCkpOworICAgICAgfQorICAgIH0KKworICAgIGdhaW5fY29kZV9zbW9vdGggPQorICAgICAgICBub2lzZV9lbmhhbmNlcigvKiAobykgOiBzbW9vdGhlZCBnYWluIGdfc2MgZXhwb25lbnQgPSBTRl9HQUlOX0MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl9jb2RlLCAgLyogKGkpIDogUXVhbnRpemVkIGNvZGVib29rIGdhaW4gICovCisgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZF9mYWMsIC8qIChpKSA6IHBlcmlvZGljaXR5IGZhY3RvciAoLTE9dW52b2ljZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT12b2ljZWQpICAqLworICAgICAgICAgICAgICAgICAgICAgICBzdGFiX2ZhYywgICAvKiAoaSkgOiBzdGFiaWxpdHkgZmFjdG9yICgwIDw9IC4uLiA8IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvbmVudCA9IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgJmFjZWxwX21lbS0+Z2NfdGhyZXNob2xkKTsKKworICAgIC8qIENvbXB1dGUgYWRhcHRpdmUgY29kZWJvb2sgdXBkYXRlIHUnKG4pLCBwaXRjaCBlbmhhbmNlbWVudCBjJyhuKSBhbmQKKyAgICAgKiBwb3N0LXByb2Nlc3NlZCBleGNpdGF0aW9uIHUobikuICovCisgICAgQnVpbGRBZGFwdGl2ZUV4Y2l0YXRpb24oY29kZSwgZXhjICsgaV9zdWJmciwgZ2Fpbl9waXQsIGdhaW5fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluX2NvZGVfc21vb3RoLCBwZXJpb2RfZmFjLCBleGMyKTsKKworICAgIC8qIEludGVycG9sYXRlIGZpbHRlciBjb2VmZnMgZm9yIGN1cnJlbnQgc3ViZnJhbWUgaW4gbHNwIGRvbWFpbiBhbmQgY29udmVydAorICAgICAqIHRvIExQIGRvbWFpbiAqLworICAgIGludF9scGNfYWNlbHAobHNwX29sZCwgIC8qIGlucHV0IDogTFNQcyBmcm9tIHBhc3QgZnJhbWUgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBsc3BfbmV3LCAgLyogaW5wdXQgOiBMU1BzIGZyb20gcHJlc2VudCBmcmFtZSAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN1YmZyX25yLCAvKiBpbnB1dCA6IEFDRUxQIHN1YmZyYW1lIGluZGV4ICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgY29yZUNvZGVyRnJhbWVMZW5ndGggLyBMX0RJViwKKyAgICAgICAgICAgICAgICAgIEEsIC8qIG91dHB1dDogTFAgY29lZmZpY2llbnRzIG9mIHRoaXMgc3ViZnJhbWUgICovCisgICAgICAgICAgICAgICAgICAmQV9leHApOworCisgICAgU3luX2ZpbHQoQSwgLyogKGkpIDogYVttXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgQV9leHAsIExfU1VCRlIsIC8qIChpKSA6IGxlbmd0aCAqLworICAgICAgICAgICAgIGV4YzIsIC8qIChpKSA6IGlucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICZzeW5baV9zdWJmcl0gLyogKGkvbykgOiBmaWx0ZXIgc3RhdGVzIC8gb3V0cHV0IHNpZ25hbCAqLworICAgICk7CisKKyAgfSAvKiBlbmQgb2Ygc3ViZnJhbWUgbG9vcCAqLworCisgIC8qIHVwZGF0ZSBwaXRjaCB2YWx1ZSBmb3IgYmZpIHByb2NlZHVyZSAqLworICBhY2VscF9tZW0tPm9sZF9UMF9mcmFjID0gVDBfZnJhYzsKKyAgYWNlbHBfbWVtLT5vbGRfVDAgPSBUMDsKKworICAvKiBzYXZlIG9sZCBleGNpdGF0aW9uIGFuZCBvbGQgc3ludGhlc2lzIG1lbW9yeSBmb3IgbmV4dCBBQ0VMUCBmcmFtZSAqLworICBGREttZW1jcHkoYWNlbHBfbWVtLT5vbGRfZXhjX21lbSwgZXhjICsgbF9kaXYgLSAoUElUX01BWF9NQVggKyBMX0lOVEVSUE9MKSwKKyAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiAoUElUX01BWF9NQVggKyBMX0lOVEVSUE9MKSk7CisgIEZES21lbWNweShhY2VscF9tZW0tPm9sZF9zeW5fbWVtLCBzeW5fYnVmICsgbF9kaXYsCisgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogTV9MUF9GSUxURVJfT1JERVIpOworCisgIERlZW1waChzeW4sIHN5bnRoLCBsX2RpdiwKKyAgICAgICAgICZhY2VscF9tZW0tPmRlX2VtcGhfbWVtKTsgLyogcmVmIHNvZnQ6IG1lbSA9IHN5bnRoWy0xXSAqLworCisgIHNjYWxlVmFsdWVzKHN5bnRoLCBsX2RpdiwgLUFDRUxQX09VVFNDQUxFKTsKKyAgYWNlbHBfbWVtLT5kZWVtcGhfbWVtX3dzeW4gPSBhY2VscF9tZW0tPmRlX2VtcGhfbWVtOworCisgIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wX2J1ZiwgRklYUF9EQkwsIExfU1VCRlIpOworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHN5bl9idWYsIEZJWFBfREJMLCBNX0xQX0ZJTFRFUl9PUkRFUiArIExfRElWKTsKKyAgQ19BTExPQ19TQ1JBVENIX0VORChleGNfYnVmLCBGSVhQX0RCTCwgUElUX01BWF9NQVggKyBMX0lOVEVSUE9MICsgTF9ESVYgKyAxKTsKKyAgcmV0dXJuOworfQorCit2b2lkIENMcGRfQWNlbHBSZXNldChDQWNlbHBTdGF0aWNNZW0gKmFjZWxwKSB7CisgIGFjZWxwLT5nY190aHJlc2hvbGQgPSAoRklYUF9EQkwpMDsKKworICBhY2VscC0+cGFzdF9ncGl0ID0gKEZJWFBfU0dMKTA7CisgIGFjZWxwLT5wYXN0X2djb2RlID0gKEZJWFBfREJMKTA7CisgIGFjZWxwLT5vbGRfVDAgPSA2NDsKKyAgYWNlbHAtPm9sZF9UMF9mcmFjID0gMDsKKyAgYWNlbHAtPmRlZW1waF9tZW1fd3N5biA9IChGSVhQX0RCTCkwOworICBhY2VscC0+d3N5bl9ybXMgPSAoRklYUF9EQkwpMDsKKyAgYWNlbHAtPnNlZWRfYWNlID0gMDsKK30KKworLyogVENYIHRpbWUgZG9tYWluIGNvbmNlYWxtZW50ICovCisvKiAgIENvbXBhcmUgdG8gZmlndXJlIDEzYSBvbiBwYWdlIDU0IGluIDNHUFAgVFMgMjYuMjkwICovCit2b2lkIENMcGRfVGN4VERDb25jZWFsKENBY2VscFN0YXRpY01lbSAqYWNlbHBfbWVtLCBTSE9SVCAqcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDIGxzcF9vbGRbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0xQQyBsc3BfbmV3W01fTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgc3RhYl9mYWMsIElOVCBuTG9zdFNmLCBGSVhQX0RCTCBzeW50aFtdLAorICAgICAgICAgICAgICAgICAgICAgICBJTlQgY29yZUNvZGVyRnJhbWVMZW5ndGgsIFVDSEFSIGxhc3RfdGN4X25vaXNlX2ZhY3RvcikgeworICAvKiByZXBlYXQgcGFzdCBleGNpdGF0aW9uIHdpdGggcGl0Y2ggZnJvbSBwcmV2aW91cyBkZWNvZGVkIFRDWCBmcmFtZSAqLworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoCisgICAgICBleGNfYnVmLCBGSVhQX0RCTCwKKyAgICAgIFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCArIExfRElWKTsgLyogNDExICsgIDE3ICsgMjU2ICsgMSA9ICAqLworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoc3luX2J1ZiwgRklYUF9EQkwsCisgICAgICAgICAgICAgICAgICAgICAgICBNX0xQX0ZJTFRFUl9PUkRFUiArIExfRElWKTsgLyogMjU2ICsgIDE2ICAgICAgICAgICA9ICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICArPSAgKi8KKyAgRklYUF9EQkwgbnNfYnVmW0xfRElWICsgMV07CisgIEZJWFBfREJMICpzeW4gPSBzeW5fYnVmICsgTV9MUF9GSUxURVJfT1JERVI7CisgIEZJWFBfREJMICpleGMgPSBleGNfYnVmICsgUElUX01BWF9NQVggKyBMX0lOVEVSUE9MOworICBGSVhQX0RCTCAqbnMgPSBuc19idWYgKyAxOworICBGSVhQX0RCTCB0bXAsIGZhY3RfZXhjOworICBJTlQgVCA9IGZNaW4oKnBpdGNoLCAoU0hPUlQpUElUX01BWF9NQVgpOworICBpbnQgaSwgaV9zdWJmciwgc3ViZnJfbnI7CisgIGludCBsRGl2ID0gY29yZUNvZGVyRnJhbWVMZW5ndGggLyBOQl9ESVY7CisKKyAgRkRLbWVtY3B5KHN5bl9idWYsIGFjZWxwX21lbS0+b2xkX3N5bl9tZW0sCisgICAgICAgICAgICBNX0xQX0ZJTFRFUl9PUkRFUiAqIHNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jcHkoZXhjX2J1ZiwgYWNlbHBfbWVtLT5vbGRfZXhjX21lbSwKKyAgICAgICAgICAgIChQSVRfTUFYX01BWCArIExfSU5URVJQT0wpICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgLyogaWYgd2UgbG9zdCBhbGwgcGFja2V0cyAoaS5lLiAxIHBhY2tldCBvZiBUQ1gtMjAgbXMsIDIgcGFja2V0cyBvZgorICAgICB0aGUgVENYLTQwIG1zIG9yIDQgcGFja2V0cyBvZiB0aGUgVENYLTgwbXMpLCB3ZSBsb3N0IHRoZSB3aG9sZQorICAgICBjb2RlZCBmcmFtZSBleHRyYXBvbGF0aW9uIHN0cmF0ZWd5OiByZXBlYXQgbG9zdCBleGNpdGF0aW9uIGFuZAorICAgICB1c2UgZXh0cmFwb2xhdGVkIExTRnMgKi8KKworICAvKiBBTVItV0IrIGxpa2UgVENYIFREIGNvbmNlYWxtZW50ICovCisKKyAgLyogbnVtYmVyIG9mIGxvc3QgZnJhbWUgY21wdCAqLworICBpZiAobkxvc3RTZiA8IDIpIHsKKyAgICBmYWN0X2V4YyA9IEZMMkZYQ09OU1RfREJMKDAuOGYpOworICB9IGVsc2UgeworICAgIGZhY3RfZXhjID0gRkwyRlhDT05TVF9EQkwoMC40Zik7CisgIH0KKworICAvKiByZXBlYXQgcGFzdCBleGNpdGF0aW9uICovCisgIGZvciAoaSA9IDA7IGkgPCBsRGl2OyBpKyspIHsKKyAgICBleGNbaV0gPSBmTXVsdChmYWN0X2V4YywgZXhjW2kgLSBUXSk7CisgIH0KKworICB0bXAgPSBmTXVsdChmYWN0X2V4YywgYWNlbHBfbWVtLT53c3luX3Jtcyk7CisgIGFjZWxwX21lbS0+d3N5bl9ybXMgPSB0bXA7CisKKyAgLyogaW5pdCBkZWVtcGhfbWVtX3dzeW4gKi8KKyAgYWNlbHBfbWVtLT5kZWVtcGhfbWVtX3dzeW4gPSBleGNbLTFdOworCisgIG5zWy0xXSA9IGFjZWxwX21lbS0+ZGVlbXBoX21lbV93c3luOworCisgIGZvciAoaV9zdWJmciA9IDAsIHN1YmZyX25yID0gMDsgaV9zdWJmciA8IGxEaXY7CisgICAgICAgaV9zdWJmciArPSBMX1NVQkZSLCBzdWJmcl9ucisrKSB7CisgICAgRklYUF9EQkwgdFJlc1tMX1NVQkZSXTsKKyAgICBGSVhQX0xQQyBBW01fTFBfRklMVEVSX09SREVSXTsKKyAgICBJTlQgQV9leHA7CisKKyAgICAvKiBpbnRlcnBvbGF0ZSBMUEMgY29lZmZpY2llbnRzICovCisgICAgaW50X2xwY19hY2VscChsc3Bfb2xkLCBsc3BfbmV3LCBzdWJmcl9uciwgbERpdiAvIExfU1VCRlIsIEEsICZBX2V4cCk7CisKKyAgICBTeW5fZmlsdChBLCAgICAgICAgICAgICAgLyogKGkpIDogYVttXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICovCisgICAgICAgICAgICAgQV9leHAsIExfU1VCRlIsIC8qIChpKSA6IGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICZleGNbaV9zdWJmcl0sICAvKiAoaSkgOiBpbnB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAmc3luW2lfc3ViZnJdICAgLyogKGkvbykgOiBmaWx0ZXIgc3RhdGVzIC8gb3V0cHV0IHNpZ25hbCAgICAgICovCisgICAgKTsKKworICAgIEVfTFBDX2Ffd2VpZ2h0KAorICAgICAgICBBLCBBLAorICAgICAgICBNX0xQX0ZJTFRFUl9PUkRFUik7IC8qIG92ZXJ3cml0ZSBBIGFzIGl0IGlzIG5vdCBuZWVkZWQgYW55IGxvbmdlciAqLworCisgICAgRV9VVElMX3Jlc2lkdShBLCBBX2V4cCwgJnN5bltpX3N1YmZyXSwgdFJlcywgTF9TVUJGUik7CisKKyAgICBEZWVtcGgodFJlcywgJm5zW2lfc3ViZnJdLCBMX1NVQkZSLCAmYWNlbHBfbWVtLT5kZWVtcGhfbWVtX3dzeW4pOworCisgICAgLyogQW1wbGl0dWRlIGxpbWl0ZXIgKHNhdHVyYXRlIGF0IHdzeW5fcm1zKSAqLworICAgIGZvciAoaSA9IGlfc3ViZnI7IGkgPCBpX3N1YmZyICsgTF9TVUJGUjsgaSsrKSB7CisgICAgICBpZiAobnNbaV0gPiB0bXApIHsKKyAgICAgICAgbnNbaV0gPSB0bXA7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobnNbaV0gPCAtdG1wKSB7CisgICAgICAgICAgbnNbaV0gPSAtdG1wOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgRV9VVElMX3ByZWVtcGgoJm5zW2lfc3ViZnJdLCB0UmVzLCBMX1NVQkZSKTsKKworICAgIFN5bl9maWx0KEEsICAgICAgICAgICAgICAvKiAoaSkgOiBhW21dIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICAgICAgICAgKi8KKyAgICAgICAgICAgICBBX2V4cCwgTF9TVUJGUiwgLyogKGkpIDogbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgdFJlcywgICAgICAgICAgIC8qIChpKSA6IGlucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICZzeW5baV9zdWJmcl0gICAvKiAoaS9vKSA6IGZpbHRlciBzdGF0ZXMgLyBvdXRwdXQgc2lnbmFsICAgICAgKi8KKyAgICApOworCisgICAgRkRLbWVtbW92ZSgmc3ludGhbaV9zdWJmcl0sICZzeW5baV9zdWJmcl0sIExfU1VCRlIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgfQorCisgIC8qIHNhdmUgb2xkIGV4Y2l0YXRpb24gYW5kIG9sZCBzeW50aGVzaXMgbWVtb3J5IGZvciBuZXh0IEFDRUxQIGZyYW1lICovCisgIEZES21lbWNweShhY2VscF9tZW0tPm9sZF9leGNfbWVtLCBleGMgKyBsRGl2IC0gKFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCksCisgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogKFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCkpOworICBGREttZW1jcHkoYWNlbHBfbWVtLT5vbGRfc3luX21lbSwgc3luX2J1ZiArIGxEaXYsCisgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogTV9MUF9GSUxURVJfT1JERVIpOworICBhY2VscF9tZW0tPmRlX2VtcGhfbWVtID0gYWNlbHBfbWVtLT5kZWVtcGhfbWVtX3dzeW47CisKKyAgQ19BTExPQ19TQ1JBVENIX0VORChzeW5fYnVmLCBGSVhQX0RCTCwgTV9MUF9GSUxURVJfT1JERVIgKyBMX0RJVik7CisgIENfQUxMT0NfU0NSQVRDSF9FTkQoZXhjX2J1ZiwgRklYUF9EQkwsIFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCArIExfRElWKTsKK30KKwordm9pZCBBY2VscF9QcmVQcm9jZXNzaW5nKEZJWFBfREJMICpzeW50aF9idWYsIEZJWFBfREJMICpvbGRfc3ludGgsIElOVCAqcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpvbGRfVF9wZiwgRklYUF9EQkwgKnBpdF9nYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpvbGRfZ2Fpbl9wZiwgSU5UIHNhbXBsaW5nUmF0ZSwgSU5UICppX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY29yZUNvZGVyRnJhbWVMZW5ndGgsIElOVCBzeW5TZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5iU3ViZnJTdXBlcmZyKSB7CisgIGludCBuOworCisgIC8qIGluaXQgYmVnaW5uaW5nIG9mIHN5bnRoX2J1ZiB3aXRoIG9sZCBzeW50aGVzaXMgZnJvbSBwcmV2aW91cyBmcmFtZSAqLworICBGREttZW1jcHkoc3ludGhfYnVmLCBvbGRfc3ludGgsIHNpemVvZihGSVhQX0RCTCkgKiAoUElUX01BWF9NQVggLSBCUEZfREVMQVkpKTsKKworICAvKiBjYWxjdWxhdGUgcGl0Y2ggbGFnIG9mZnNldCBmb3IgQUNFTFAgZGVjb2RlciAqLworICAqaV9vZmZzZXQgPQorICAgICAgKHNhbXBsaW5nUmF0ZSAqIFBJVF9NSU5fMTJrOCArIChGU0NBTEVfREVOT00gLyAyKSkgLyBGU0NBTEVfREVOT00gLQorICAgICAgUElUX01JTl8xMms4OworCisgIC8qIGZvciBiYXNzIHBvc3RmaWx0ZXIgKi8KKyAgZm9yIChuID0gMDsgbiA8IHN5blNmZDsgbisrKSB7CisgICAgcGl0Y2hbbl0gPSBvbGRfVF9wZltuXTsKKyAgICBwaXRfZ2FpbltuXSA9IG9sZF9nYWluX3BmW25dOworICB9CisgIGZvciAobiA9IDA7IG4gPCBuYlN1YmZyU3VwZXJmcjsgbisrKSB7CisgICAgcGl0Y2hbbiArIHN5blNmZF0gPSBMX1NVQkZSOworICAgIHBpdF9nYWluW24gKyBzeW5TZmRdID0gKEZJWFBfREJMKTA7CisgIH0KK30KKwordm9pZCBBY2VscF9Qb3N0UHJvY2Vzc2luZyhGSVhQX0RCTCAqc3ludGhfYnVmLCBGSVhQX0RCTCAqb2xkX3N5bnRoLCBJTlQgKnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm9sZF9UX3BmLCBJTlQgY29yZUNvZGVyRnJhbWVMZW5ndGgsIElOVCBzeW5TZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuYlN1YmZyU3VwZXJmcikgeworICBpbnQgbjsKKworICAvKiBzdG9yZSBsYXN0IHBhcnQgb2Ygc3ludGhfYnVmICh3aGljaCBpcyBub3QgaGFuZGxlZCBieSB0aGUgSU1EQ1Qgb3ZlcmxhcCkKKyAgICogZm9yIG5leHQgZnJhbWUgKi8KKyAgRkRLbWVtY3B5KG9sZF9zeW50aCwgc3ludGhfYnVmICsgY29yZUNvZGVyRnJhbWVMZW5ndGgsCisgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogKFBJVF9NQVhfTUFYIC0gQlBGX0RFTEFZKSk7CisKKyAgLyogZm9yIGJhc3MgcG9zdGZpbHRlciAqLworICBmb3IgKG4gPSAwOyBuIDwgc3luU2ZkOyBuKyspIHsKKyAgICBvbGRfVF9wZltuXSA9IHBpdGNoW25iU3ViZnJTdXBlcmZyICsgbl07CisgIH0KK30KKworI2RlZmluZSBMX0ZBQ19aSVIgKExGQUMpCisKK3ZvaWQgQ0xwZF9BY2VscF9aaXIoY29uc3QgRklYUF9MUEMgQVtdLCBjb25zdCBJTlQgQV9leHAsCisgICAgICAgICAgICAgICAgICAgIENBY2VscFN0YXRpY01lbSAqYWNlbHBfbWVtLCBjb25zdCBJTlQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB6aXJbXSwgaW50IGRvRGVlbXBoKSB7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBfYnVmLCBGSVhQX0RCTCwgTF9GQUNfWklSICsgTV9MUF9GSUxURVJfT1JERVIpOworICBGREtfQVNTRVJUKGxlbmd0aCA8PSBMX0ZBQ19aSVIpOworCisgIEZES21lbWNweSh0bXBfYnVmLCBhY2VscF9tZW0tPm9sZF9zeW5fbWVtLAorICAgICAgICAgICAgTV9MUF9GSUxURVJfT1JERVIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtc2V0KHRtcF9idWYgKyBNX0xQX0ZJTFRFUl9PUkRFUiwgMCwgTF9GQUNfWklSICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgU3luX2ZpbHQoQSwgQV9leHAsIGxlbmd0aCwgJnRtcF9idWZbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAmdG1wX2J1ZltNX0xQX0ZJTFRFUl9PUkRFUl0pOworICBpZiAoIWRvRGVlbXBoKSB7CisgICAgLyogaWYgbGFzdCBscGQgbW9kZSB3YXMgVEQgY29uY2VhbG1lbnQsIHRoZW4gYnlwYXNzIGRlZW1waCAqLworICAgIEZES21lbWNweSh6aXIsIHRtcF9idWYsIGxlbmd0aCAqIHNpemVvZigqemlyKSk7CisgIH0gZWxzZSB7CisgICAgRGVlbXBoKCZ0bXBfYnVmW01fTFBfRklMVEVSX09SREVSXSwgJnppclswXSwgbGVuZ3RoLAorICAgICAgICAgICAmYWNlbHBfbWVtLT5kZV9lbXBoX21lbSk7CisgICAgc2NhbGVWYWx1ZXMoemlyLCBsZW5ndGgsIC1BQ0VMUF9PVVRTQ0FMRSk7CisgIH0KKyAgQ19BTExPQ19TQ1JBVENIX0VORCh0bXBfYnVmLCBGSVhQX0RCTCwgTF9GQUNfWklSICsgTV9MUF9GSUxURVJfT1JERVIpOworfQorCit2b2lkIENMcGRfQWNlbHBQcmVwYXJlSW50ZXJuYWxNZW0oY29uc3QgRklYUF9EQkwgKnN5bnRoLCBVQ0hBUiBsYXN0X2xwZF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGxhc3RfbGFzdF9scGRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0xQQyAqQV9uZXcsIGNvbnN0IElOVCBBX25ld19leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9MUEMgKkFfb2xkLCBjb25zdCBJTlQgQV9vbGRfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBY2VscFN0YXRpY01lbSAqYWNlbHBfbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjb3JlQ29kZXJGcmFtZUxlbmd0aCwgSU5UIGNsZWFyT2xkRXhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGxwZF9tb2RlKSB7CisgIGludCBsX2RpdiA9CisgICAgICBjb3JlQ29kZXJGcmFtZUxlbmd0aCAvIE5CX0RJVjsgLyogbGVuZ3RoIG9mIG9uZSBBQ0VMUC9UQ1gyMCBmcmFtZSAqLworICBpbnQgbF9kaXZfcGFydGlhbDsKKyAgRklYUF9EQkwgKnN5biwgKm9sZF9leGNfbWVtOworCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChzeW50aF9idWYsIEZJWFBfREJMLAorICAgICAgICAgICAgICAgICAgICAgICAgUElUX01BWF9NQVggKyBMX0lOVEVSUE9MICsgTV9MUF9GSUxURVJfT1JERVIpOworICBzeW4gPSAmc3ludGhfYnVmW01fTFBfRklMVEVSX09SREVSXTsKKworICBsX2Rpdl9wYXJ0aWFsID0gUElUX01BWF9NQVggKyBMX0lOVEVSUE9MIC0gbF9kaXY7CisgIG9sZF9leGNfbWVtID0gYWNlbHBfbWVtLT5vbGRfZXhjX21lbTsKKworICBpZiAobHBkX21vZGUgPT0gNCkgeworICAgIC8qIEJ5cGFzcyBEb21haW4gY29udmVyc2lvbi4gVENYVEQgQ29uY2VhbG1lbnQgZG9lcyBubyBkZWVtcGhhc2lzIGluIHRoZQorICAgICAqIGVuZC4gKi8KKyAgICBGREttZW1jcHkoCisgICAgICAgIHN5bnRoX2J1ZiwgJnN5bnRoWy0oUElUX01BWF9NQVggKyBMX0lOVEVSUE9MICsgTV9MUF9GSUxURVJfT1JERVIpXSwKKyAgICAgICAgKFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCArIE1fTFBfRklMVEVSX09SREVSKSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIC8qIFNldCBkZWVtcGhhc2lzIG1lbW9yeSBzdGF0ZSBmb3IgVEQgY29uY2VhbG1lbnQgKi8KKyAgICBhY2VscF9tZW0tPmRlZW1waF9tZW1fd3N5biA9IHNjYWxlVmFsdWVTYXR1cmF0ZShzeW50aFstMV0sIEFDRUxQX09VVFNDQUxFKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBjb252ZXJ0IHBhc3QgW1BJVF9NQVhfTUFYK0xfSU5URVJQT0wrTV9MUF9GSUxURVJfT1JERVJdIHN5bnRoZXNpcyB0bworICAgICAqIHByZWVtcGggZG9tYWluICovCisgICAgRV9VVElMX3ByZWVtcGgoJnN5bnRoWy0oUElUX01BWF9NQVggKyBMX0lOVEVSUE9MICsgTV9MUF9GSUxURVJfT1JERVIpXSwKKyAgICAgICAgICAgICAgICAgICBzeW50aF9idWYsIFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCArIE1fTFBfRklMVEVSX09SREVSKTsKKyAgICBzY2FsZVZhbHVlc1NhdHVyYXRlKHN5bnRoX2J1ZiwgUElUX01BWF9NQVggKyBMX0lOVEVSUE9MICsgTV9MUF9GSUxURVJfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICBBQ0VMUF9PVVRTQ0FMRSk7CisgIH0KKworICAvKiBTZXQgZGVlbXBoYXNpcyBtZW1vcnkgc3RhdGUgKi8KKyAgYWNlbHBfbWVtLT5kZV9lbXBoX21lbSA9IHNjYWxlVmFsdWVTYXR1cmF0ZShzeW50aFstMV0sIEFDRUxQX09VVFNDQUxFKTsKKworICAvKiB1cGRhdGUgYWNlbHAgc3ludGggZmlsdGVyIG1lbW9yeSAqLworICBGREttZW1jcHkoYWNlbHBfbWVtLT5vbGRfc3luX21lbSwKKyAgICAgICAgICAgICZzeW5bUElUX01BWF9NQVggKyBMX0lOVEVSUE9MIC0gTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgTV9MUF9GSUxURVJfT1JERVIgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICBpZiAoY2xlYXJPbGRFeGMpIHsKKyAgICBGREttZW1jbGVhcihvbGRfZXhjX21lbSwgKFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCkgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHN5bnRoX2J1ZiwgRklYUF9EQkwsCisgICAgICAgICAgICAgICAgICAgICAgICBQSVRfTUFYX01BWCArIExfSU5URVJQT0wgKyBNX0xQX0ZJTFRFUl9PUkRFUik7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogdXBkYXRlIHBhc3QgW1BJVF9NQVhfTUFYK0xfSU5URVJQT0xdIHNhbXBsZXMgb2YgZXhjIG1lbW9yeSAqLworICBpZiAobGFzdF9scGRfbW9kZSA9PSAxKSB7ICAgICAgICAvKiBsYXN0IGZyYW1lIHdhcyBUQ1gyMCAqLworICAgIGlmIChsYXN0X2xhc3RfbHBkX21vZGUgPT0gMCkgeyAvKiBBQ0VMUCAtPiBUQ1gyMCAtPiBBQ0VMUCB0cmFuc2l0aW9uICovCisgICAgICAvKiBEZWxheSB2YWxpZCBwYXJ0IG9mIGV4Y2l0YXRpb24gYnVmZmVyIChmcm9tIHByZXZpb3VzIEFDRUxQIGZyYW1lKSBieQorICAgICAgICogbF9kaXYgc2FtcGxlcyAqLworICAgICAgRkRLbWVtbW92ZShvbGRfZXhjX21lbSwgb2xkX2V4Y19tZW0gKyBsX2RpdiwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIGxfZGl2X3BhcnRpYWwpOworICAgIH0gZWxzZSBpZiAobGFzdF9sYXN0X2xwZF9tb2RlID4gMCkgeyAvKiBUQ1ggLT4gVENYMjAgLT4gQUNFTFAgdHJhbnNpdGlvbiAqLworICAgICAgRV9VVElMX3Jlc2lkdShBX29sZCwgQV9vbGRfZXhwLCBzeW4sIG9sZF9leGNfbWVtLCBsX2Rpdl9wYXJ0aWFsKTsKKyAgICB9CisgICAgRV9VVElMX3Jlc2lkdShBX25ldywgQV9uZXdfZXhwLCBzeW4gKyBsX2Rpdl9wYXJ0aWFsLAorICAgICAgICAgICAgICAgICAgb2xkX2V4Y19tZW0gKyBsX2Rpdl9wYXJ0aWFsLCBsX2Rpdik7CisgIH0gZWxzZSB7IC8qIHByZXYgZnJhbWUgd2FzIEZELCBUQ1g0MCBvciBUQ1g4MCAqLworICAgIGludCBleGNfQV9uZXdfbGVuZ3RoID0gKGNvcmVDb2RlckZyYW1lTGVuZ3RoIC8gMiA+IFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29yZUNvZGVyRnJhbWVMZW5ndGggLyAyOworICAgIGludCBleGNfQV9vbGRfbGVuZ3RoID0gUElUX01BWF9NQVggKyBMX0lOVEVSUE9MIC0gZXhjX0FfbmV3X2xlbmd0aDsKKyAgICBFX1VUSUxfcmVzaWR1KEFfb2xkLCBBX29sZF9leHAsIHN5biwgb2xkX2V4Y19tZW0sIGV4Y19BX29sZF9sZW5ndGgpOworICAgIEVfVVRJTF9yZXNpZHUoQV9uZXcsIEFfbmV3X2V4cCwgJnN5bltleGNfQV9vbGRfbGVuZ3RoXSwKKyAgICAgICAgICAgICAgICAgICZvbGRfZXhjX21lbVtleGNfQV9vbGRfbGVuZ3RoXSwgZXhjX0FfbmV3X2xlbmd0aCk7CisgIH0KKyAgQ19BTExPQ19TQ1JBVENIX0VORChzeW50aF9idWYsIEZJWFBfREJMLAorICAgICAgICAgICAgICAgICAgICAgIFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCArIE1fTFBfRklMVEVSX09SREVSKTsKKworICByZXR1cm47Cit9CisKK0ZJWFBfREJMICpDTHBkX0FDRUxQX0dldEZyZWVFeGNNZW0oQ0FjZWxwU3RhdGljTWVtICphY2VscF9tZW0sIElOVCBsZW5ndGgpIHsKKyAgRkRLX0FTU0VSVChsZW5ndGggPD0gUElUX01BWF9NQVggKyBMX0lOVEVSUE9MKTsKKyAgcmV0dXJuIGFjZWxwX21lbS0+b2xkX2V4Y19tZW07Cit9CisKK0lOVCBDTHBkX0FjZWxwUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIENBY2VscENoYW5uZWxEYXRhICphY2VscCwKKyAgICAgICAgICAgICAgICAgICBJTlQgYWNlbHBfY29yZV9tb2RlLCBJTlQgY29yZUNvZGVyRnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgSU5UIGlfb2Zmc2V0KSB7CisgIGludCBuYl9zdWJmciA9IGNvcmVDb2RlckZyYW1lTGVuZ3RoIC8gTF9ESVY7CisgIGNvbnN0IFVDSEFSICpudW1fYWNiX2luZGV4X2JpdHMgPQorICAgICAgKG5iX3N1YmZyID09IDQpID8gbnVtX2FjYl9pZHhfYml0c190YWJsZVswXSA6IG51bV9hY2JfaWR4X2JpdHNfdGFibGVbMV07CisgIGludCBuYml0czsKKyAgaW50IGVycm9yID0gMDsKKworICBjb25zdCBpbnQgUElUX01JTiA9IFBJVF9NSU5fMTJrOCArIGlfb2Zmc2V0OworICBjb25zdCBpbnQgUElUX0ZSMiA9IFBJVF9GUjJfMTJrOCAtIGlfb2Zmc2V0OworICBjb25zdCBpbnQgUElUX0ZSMSA9IFBJVF9GUjFfMTJrODsKKyAgY29uc3QgaW50IFBJVF9NQVggPSBQSVRfTUFYXzEyazggKyAoNiAqIGlfb2Zmc2V0KTsKKyAgaW50IFQwLCBUMF9mcmFjLCBUMF9taW4gPSAwLCBUMF9tYXg7CisKKyAgaWYgKFBJVF9NQVggPiBQSVRfTUFYX01BWCkgeworICAgIGVycm9yID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisKKyAgYWNlbHAtPmFjZWxwX2NvcmVfbW9kZSA9IGFjZWxwX2NvcmVfbW9kZTsKKworICBuYml0cyA9IE1hcENvcmVNb2RlMk5CaXRzKGFjZWxwX2NvcmVfbW9kZSk7CisKKyAgLyogZGVjb2RlIG1lYW4gZW5lcmd5IHdpdGggMiBiaXRzIDogMTgsIDMwLCA0MiBvciA1NCBkQiAqLworICBhY2VscC0+bWVhbl9lbmVyZ3kgPSBGREtyZWFkQml0cyhoQnMsIDIpOworCisgIGZvciAoaW50IHNmciA9IDA7IHNmciA8IG5iX3N1YmZyOyBzZnIrKykgeworICAgIC8qIHJlYWQgQUNCIGluZGV4IGFuZCBzdG9yZSBUMCBhbmQgVDBfZnJhYyBmb3IgZWFjaCBBQ0VMUCBzdWJmcmFtZS4gKi8KKyAgICBlcnJvciA9IERlY29kZVBpdGNoTGFnKGhCcywgbnVtX2FjYl9pbmRleF9iaXRzW3Nmcl0sIFBJVF9NSU4sIFBJVF9GUjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVRfRlIxLCBQSVRfTUFYLCAmVDAsICZUMF9mcmFjLCAmVDBfbWluLCAmVDBfbWF4KTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgYWNlbHAtPlQwW3Nmcl0gPSAoVVNIT1JUKVQwOworICAgIGFjZWxwLT5UMF9mcmFjW3Nmcl0gPSAoVUNIQVIpVDBfZnJhYzsKKyAgICBhY2VscC0+bHRwX2ZpbHRlcmluZ19mbGFnW3Nmcl0gPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIHN3aXRjaCAobmJpdHMpIHsKKyAgICAgIGNhc2UgMTI6IC8qIDEyIGJpdHMgQU1SLVdCIGNvZGVib29rIGlzIHVzZWQgKi8KKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzBdID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzFdID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzJdID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzNdID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE2OiAvKiAxNiBiaXRzIEFNUi1XQiBjb2RlYm9vayBpcyB1c2VkICovCisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVswXSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsxXSA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsyXSA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVszXSA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyMDogLyogMjAgYml0cyBBTVItV0IgY29kZWJvb2sgaXMgdXNlZCAqLworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMF0gPSBGREtyZWFkQml0cyhoQnMsIDUpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMV0gPSBGREtyZWFkQml0cyhoQnMsIDUpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMl0gPSBGREtyZWFkQml0cyhoQnMsIDUpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bM10gPSBGREtyZWFkQml0cyhoQnMsIDUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjg6IC8qIDI4IGJpdHMgQU1SLVdCIGNvZGVib29rIGlzIHVzZWQgKi8KKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzBdID0gRkRLcmVhZEJpdHMoaEJzLCA5KTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzFdID0gRkRLcmVhZEJpdHMoaEJzLCA5KTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzJdID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzNdID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM2OiAvKiAzNiBiaXRzIEFNUi1XQiBjb2RlYm9vayBpcyB1c2VkICovCisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVswXSA9IEZES3JlYWRCaXRzKGhCcywgOSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsxXSA9IEZES3JlYWRCaXRzKGhCcywgOSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsyXSA9IEZES3JlYWRCaXRzKGhCcywgOSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVszXSA9IEZES3JlYWRCaXRzKGhCcywgOSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0NDogLyogNDQgYml0cyBBTVItV0IgY29kZWJvb2sgaXMgdXNlZCAqLworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMF0gPSBGREtyZWFkQml0cyhoQnMsIDEzKTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzFdID0gRkRLcmVhZEJpdHMoaEJzLCAxMyk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsyXSA9IEZES3JlYWRCaXRzKGhCcywgOSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVszXSA9IEZES3JlYWRCaXRzKGhCcywgOSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1MjogLyogNTIgYml0cyBBTVItV0IgY29kZWJvb2sgaXMgdXNlZCAqLworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMF0gPSBGREtyZWFkQml0cyhoQnMsIDEzKTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzFdID0gRkRLcmVhZEJpdHMoaEJzLCAxMyk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsyXSA9IEZES3JlYWRCaXRzKGhCcywgMTMpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bM10gPSBGREtyZWFkQml0cyhoQnMsIDEzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDY0OiAvKiA2NCBiaXRzIEFNUi1XQiBjb2RlYm9vayBpcyB1c2VkICovCisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVswXSA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsxXSA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsyXSA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVszXSA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVs0XSA9IEZES3JlYWRCaXRzKGhCcywgMTQpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bNV0gPSBGREtyZWFkQml0cyhoQnMsIDE0KTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzZdID0gRkRLcmVhZEJpdHMoaEJzLCAxNCk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVs3XSA9IEZES3JlYWRCaXRzKGhCcywgMTQpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBhY2VscC0+Z2FpbnNbc2ZyXSA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZWxwLmggYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlbHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGU0MWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZWxwLmgKQEAgLTAsMCArMSwyODEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOiBVU0FDIEFDRUxQIGZyYW1lIGRlY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVU0FDREVDX0FDRUxQX0gKKyNkZWZpbmUgVVNBQ0RFQ19BQ0VMUF9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgInVzYWNkZWNfY29uc3QuaCIKKyNpbmNsdWRlICJ1c2FjZGVjX3JvbS5oIgorCisvLyNkZWZpbmUgRU5IQU5DRURfVENYX1REX0NPTkNFQUxfRU5BQkxFCisKKy8qKiBTdHJ1Y3R1cmUgd2hpY2ggaG9sZHMgdGhlIEFDRUxQIGludGVybmFsIHBlcnNpc3RlbnQgbWVtb3J5ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfREJMIG9sZF9leGNfbWVtW1BJVF9NQVhfTUFYICsgTF9JTlRFUlBPTF07CisgIEZJWFBfREJMIG9sZF9zeW5fbWVtW01fTFBfRklMVEVSX09SREVSXTsgLyogc3ludGhlc2lzIGZpbHRlciBzdGF0ZXMgKi8KKyAgRklYUF9TR0wgQVtNX0xQX0ZJTFRFUl9PUkRFUl07CisgIElOVCBBX2V4cDsKKyAgRklYUF9EQkwgZ2NfdGhyZXNob2xkOworICBGSVhQX0RCTCBkZV9lbXBoX21lbTsKKyAgRklYUF9TR0wgcGFzdF9ncGl0OworICBGSVhQX0RCTCBwYXN0X2djb2RlOworICBVU0hPUlQgb2xkX1QwOworICBVQ0hBUiBvbGRfVDBfZnJhYzsKKyAgRklYUF9EQkwgZGVlbXBoX21lbV93c3luOworICBGSVhQX0RCTCB3c3luX3JtczsKKyAgU0hPUlQgc2VlZF9hY2U7Cit9IENBY2VscFN0YXRpY01lbTsKKworLyoqIFN0cnVjdHVyZSB3aGljaCBob2xkcyB0aGUgcGFyYW1ldGVyIGRhdGEgbmVlZGVkIHRvIGRlY29kZSBvbmUgQUNFTFAgZnJhbWUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIKKyAgYWNlbHBfY29yZV9tb2RlOyAgIC8qKjwgbWVhbiBleGNpdGF0aW9uIGVuZXJneSBpbmRleCBmb3Igd2hvbGUgQUNFTFAgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAqLworICBVQ0hBUiBtZWFuX2VuZXJneTsgLyoqPCBhY2VscCBjb3JlIG1vZGUgZm9yIHdob2xlIEFDRUxQIGZyYW1lICovCisgIFVTSE9SVCBUMFtOQl9TVUJGUl07CisgIFVDSEFSIFQwX2ZyYWNbTkJfU1VCRlJdOworICBVQ0hBUiBsdHBfZmlsdGVyaW5nX2ZsYWdbTkJfU1VCRlJdOyAvKio8IGNvbnRyb2xscyB3aGV0aGVyIExUUCBwb3N0ZmlsdGVyIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSBmb3IgZWFjaCBBQ0VMUCBzdWJmcmFtZSAqLworICBTSE9SVCBpY2JfaW5kZXhbTkJfU1VCRlJdCisgICAgICAgICAgICAgICAgIFs4XTsgLyoqPCBpbm5vdmF0aXZlIGNvZGVib29rIGluZGV4IGZvciBlYWNoIEFDRUxQIHN1YmZyYW1lICovCisgIFVDSEFSIGdhaW5zW05CX1NVQkZSXTsgLyoqPCBnYWluIGluZGV4IGZvciBlYWNoIEFDRUxQIHN1YmZyYW1lICovCit9IENBY2VscENoYW5uZWxEYXRhOworCisvKioKKyAqIFxicmllZiBSZWFkIHRoZSBhY2VscF9jb2RpbmcoKSBiaXRzdHJlYW0gcGFydC4KKyAqIFxwYXJhbVtpbl0gaEJzIGJpdHN0cmVhbSBoYW5kbGUgdG8gcmVhZCBkYXRhIGZyb20uCisgKiBccGFyYW1bb3V0XSBhY2VscERhdGEgcG9pbnRlciB0byBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIHBhcnNlZCBkYXRhIG9mIG9uZQorICogQUNFTFAgZnJhbWUuCisgKiBccGFyYW1baW5dIGFjZWxwX2NvcmVfbW9kZSB0aGUgQUNFTFAgY29yZSBtb2RlIGluZGV4LgorICogXHBhcmFtW2luXSBjb3JlQ29kZXJGcmFtZUxlbmd0aCBsZW5ndGggb2YgY29yZSBjb2RlciBmcmFtZSAoMTAyNHw3NjgpCisgKi8KK0lOVCBDTHBkX0FjZWxwUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIENBY2VscENoYW5uZWxEYXRhICphY2VscERhdGEsCisgICAgICAgICAgICAgICAgICAgSU5UIGFjZWxwX2NvcmVfbW9kZSwgSU5UIGlfb2Zmc2V0LCBJTlQgY29yZUNvZGVyRnJhbWVMZW5ndGgpOworLyoqCisgKiBcYnJpZWYgSW5pdGlhbGl6YXRpb24gb2YgbWVtb3J5IGJlZm9yZSBvbmUgTFBEIGZyYW1lIGlzIGRlY29kZWQKKyAqIFxwYXJhbVtvdXRdIHN5bnRoX2J1ZiBzeW50aGVzaXMgYnVmZmVyIHRvIGJlIGluaXRpYWxpemVkLCBleHBvbmVudCA9IFNGX1NZTlRICisgKiBccGFyYW1baW5dIG9sZF9zeW50aCBwYXN0IHN5bnRoZXNpcyBvZiBwcmV2aW91cyBMUEQgZnJhbWUsIGV4cG9uZW50ID0KKyAqIFNGX1NZTlRICisgKiBccGFyYW1bb3V0XSBzeW50aF9idWZfZmIgZnVsbGJhbmQgc3ludGhlc2lzIGJ1ZmZlciB0byBiZSBpbml0aWFsaXplZCwKKyAqIGV4cG9uZW50ID0gU0ZfU1lOVEgKKyAqIFxwYXJhbVtpbl0gb2xkX3N5bnRoX2ZiIHBhc3QgZnVsbGJhbmQgc3ludGhlc2lzIG9mIHByZXZpb3VzIExQRCBmcmFtZSwKKyAqIGV4cG9uZW50ID0gU0ZfU1lOVEgKKyAqIFxwYXJhbVtvdXRdIHBpdGNoIHZlY3RvciB3aGVyZSBkZWNvZGVkIHBpdGNoIGxhZyB2YWx1ZXMgYXJlIHN0b3JlZAorICogXHBhcmFtW2luXSBvbGRfVF9wZiBwYXN0IHBpdGNoIGxhZyB2YWx1ZXMgb2YgcHJldmlvdXMgTFBEIGZyYW1lCisgKiBccGFyYW1baW5dIHNhbXBsaW5nUmF0ZSBzYW1wbGluZyByYXRlIGZvciBwaXRjaCBsYWcgb2Zmc2V0IGNhbGN1bGF0aW9uCisgKiBccGFyYW1bb3V0XSBpX29mZnNldCBwaXRjaCBsYWcgb2Zmc2V0IGZvciB0aGUgZGVjb2Rpbmcgb2YgdGhlIHBpdGNoIGxhZworICogXHBhcmFtW2luXSBjb3JlQ29kZXJGcmFtZUxlbmd0aCBsZW5ndGggb2YgY29yZSBjb2RlciBmcmFtZSAoMTAyNHw3NjgpCisgKi8KK3ZvaWQgQWNlbHBfUHJlUHJvY2Vzc2luZyhGSVhQX0RCTCAqc3ludGhfYnVmLCBGSVhQX0RCTCAqb2xkX3N5bnRoLCBJTlQgKnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqb2xkX1RfcGYsIEZJWFBfREJMICpwaXRfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqb2xkX2dhaW5fcGYsIElOVCBzYW1wbGluZ1JhdGUsIElOVCAqaV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNvcmVDb2RlckZyYW1lTGVuZ3RoLCBJTlQgc3luU2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuYlN1YmZyU3VwZXJmcik7CisKKy8qKgorICogXGJyaWVmIFNhdmUgdGFpbCBvZiBidWZmZXJzIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG5leHQgTFBEIGZyYW1lCisgKiBccGFyYW1baW5dIHN5bnRoX2J1ZiBzeW50aGVzaXMgb2YgY3VycmVudCBMUEQgZnJhbWUsIGV4cG9uZW50ID0gU0ZfU1lOVEgKKyAqIFxwYXJhbVtvdXRdIG9sZF9zeW50aCBtZW1vcnkgd2hlcmUgdGFpbCBvZiBmdWxsYmFuZCBzeW50aF9idWYgaXMgc3RvcmVkLAorICogZXhwb25lbnQgPSBTRl9TWU5USAorICogXHBhcmFtW2luXSBzeW50aF9idWZfZmIgZnVsbGJhbmQgc3ludGhlc2lzIG9mIGN1cnJlbnQgTFBEIGZyYW1lLCBleHBvbmVudCA9CisgKiBTRl9TWU5USAorICogXHBhcmFtW291dF0gb2xkX3N5bnRoX2ZiIG1lbW9yeSB3aGVyZSB0YWlsIG9mIGZ1bGxiYW5kIHN5bnRoX2J1ZiBpcyBzdG9yZWQsCisgKiBleHBvbmVudCA9IFNGX1NZTlRICisgKiBccGFyYW1baW5dIHBpdGNoIGRlY29kZWQgcGl0Y2ggbGFnIHZhbHVlcyBvZiBjdXJyZW50IExQRCBmcmFtZQorICogXHBhcmFtW291dF0gb2xkX1RfcGYgbWVtb3J5IHdoZXJlIGxhc3QgU1lOX1NGRCBwaXRjaCBsYWcgdmFsdWVzIGFyZSBzdG9yZWQKKyAqLwordm9pZCBBY2VscF9Qb3N0UHJvY2Vzc2luZyhGSVhQX0RCTCAqc3ludGhfYnVmLCBGSVhQX0RCTCAqb2xkX3N5bnRoLCBJTlQgKnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm9sZF9UX3BmLCBJTlQgY29yZUNvZGVyRnJhbWVMZW5ndGgsIElOVCBzeW5TZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuYlN1YmZyU3VwZXJmcik7CisKKy8qKgorICogXGJyaWVmIERlY29kZSBvbmUgQUNFTFAgZnJhbWUgKHRocmVlIG9yIGZvdXIgQUNFTFAgc3ViZnJhbWVzIHdpdGggNjQgc2FtcGxlcworICogZWFjaCkKKyAqIFxwYXJhbVtpbixvdXRdIGFjZWxwX21lbSBwb2ludGVyIHRvIEFDRUxQIG1lbW9yeSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gaV9vZmZzZXQgcGl0Y2ggbGFnIG9mZnNldAorICogXHBhcmFtW2luXSBsc3Bfb2xkIExQQyBmaWx0ZXIgaW4gTFNQIGRvbWFpbiBjb3JyZXNwb25kaW5nIHRvIHByZXZpb3VzIGZyYW1lCisgKiBccGFyYW1baW5dIGxzcF9uZXcgTFBDIGZpbHRlciBpbiBMU1AgZG9tYWluIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCBmcmFtZQorICogXHBhcmFtW2luXSBzdGFiX2ZhYyBzdGFiaWxpdHkgZmFjdG9yIGNvbnN0cmFpbmVkIGJ5IDA8PXN0YWJfZmFjPD0xLjAsCisgKiBleHBvbmVudCA9IFNGX1NUQUIKKyAqIFxwYXJhbVtpbl0gYWNlbHBEYXRhIHBvaW50ZXIgdG8gc3RydWN0IHdpdGggZGF0YSB3aGljaCBpcyBuZWVkZWQgZm9yIGRlY29kaW5nCisgKiBvbmUgQUNFTFAgZnJhbWUKKyAqIFxwYXJhbVtvdXRdIHN5bnRoIEFDRUxQIG91dHB1dCBzaWduYWwKKyAqIFxwYXJhbVtvdXRdIHBUIGZvdXIgZGVjb2RlZCBwaXRjaCBsYWcgdmFsdWVzCisgKiBccGFyYW1baW5dIGNvcmVDb2RlckZyYW1lTGVuZ3RoIGxlbmd0aCBvZiBjb3JlIGNvZGVyIGZyYW1lICgxMDI0fDc2OCkKKyAqLwordm9pZCBDTHBkX0FjZWxwRGVjb2RlKENBY2VscFN0YXRpY01lbSAqYWNlbHBfbWVtLCBJTlQgaV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9MUEMgbHNwX29sZFtNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9MUEMgbHNwX25ld1tNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgc3RhYl9mYWMsIENBY2VscENoYW5uZWxEYXRhICphY2VscERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bUxvc3RTdWJmcmFtZXMsIGludCBsYXN0THBjTG9zdCwgaW50IGZyYW1lQ250LAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHN5bnRoW10sIGludCBwVFtdLCBGSVhQX0RCTCAqcGl0X2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgSU5UIGNvcmVDb2RlckZyYW1lTGVuZ3RoKTsKKworLyoqCisgKiBcYnJpZWYgUmVzZXQgQUNFTFAgaW50ZXJuYWwgbWVtb3J5LgorICogXHBhcmFtW291dF0gYWNlbHBfbWVtIHBvaW50ZXIgdG8gQUNFTFAgbWVtb3J5IHN0cnVjdHVyZQorICovCit2b2lkIENMcGRfQWNlbHBSZXNldChDQWNlbHBTdGF0aWNNZW0gKmFjZWxwX21lbSk7CisKKy8qKgorICogXGJyaWVmIEluaXRpYWxpemUgQUNFTFAgaW50ZXJuYWwgbWVtb3J5IGluIGNhc2Ugb2YgRkFDIGJlZm9yZSBBQ0VMUCBkZWNvZGVyCisgKiBpcyBjYWxsZWQKKyAqIFxwYXJhbVtpbl0gc3ludGggcG9pbnRzIHRvIGVuZCsxIG9mIHBhc3QgdmFsaWQgc3ludGhlc2lzIHNpZ25hbCwgZXhwb25lbnQgPQorICogU0ZfU1lOVEgKKyAqIFxwYXJhbVtpbl0gbGFzdF9scGRfbW9kZSBsYXN0IGxwZCBtb2RlCisgKiBccGFyYW1baW5dIGxhc3RfbGFzdF9scGRfbW9kZSBscGQgbW9kZSBiZWZvcmUgbGFzdF9scGRfbW9kZQorICogXHBhcmFtW2luXSBBX25ldyBMUCBzeW50aGVzaXMgZmlsdGVyIGNvZWZmcyBjb3JyZXNwb25kaW5nIHRvIGxhc3QgZnJhbWUsCisgKiBleHBvbmVudCA9IFNGX0FfQ09FRkZTCisgKiBccGFyYW1baW5dIEFfb2xkIExQIHN5bnRoZXNpcyBmaWx0ZXIgY29lZmZzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZyYW1lIGJlZm9yZQorICogbGFzdCBmcmFtZSwgZXhwb25lbnQgPSBTRl9BX0NPRUZGUworICogXHBhcmFtW2luLG91dF0gYWNlbHBfbWVtIHBvaW50ZXIgdG8gQUNFTFAgbWVtb3J5IHN0cnVjdHVyZQorICogXHBhcmFtW2luXSBjb3JlQ29kZXJGcmFtZUxlbmd0aCBsZW5ndGggb2YgY29yZSBjb2RlciBmcmFtZSAoMTAyNHw3NjgpCisgKi8KK3ZvaWQgQ0xwZF9BY2VscFByZXBhcmVJbnRlcm5hbE1lbShjb25zdCBGSVhQX0RCTCAqc3ludGgsIFVDSEFSIGxhc3RfbHBkX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbGFzdF9sYXN0X2xwZF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDICpBX25ldywgY29uc3QgSU5UIEFfbmV3X2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0xQQyAqQV9vbGQsIGNvbnN0IElOVCBBX29sZF9leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FjZWxwU3RhdGljTWVtICphY2VscF9tZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNvcmVDb2RlckZyYW1lTGVuZ3RoLCBJTlQgY2xlYXJPbGRFeGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbHBkX21vZGUpOworCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgemVybyBpbnB1dCByZXNwb25zZSAoemlyKSBvZiB0aGUgYWNlbHAgc3ludGhlc2lzIGZpbHRlcgorICogXHBhcmFtW2luXSBBIExQIHN5bnRoZXNpcyBmaWx0ZXIgY29lZmZpY2llbnRzLCBleHBvbmVudCA9IFNGX0FfQ09FRkZTCisgKiBccGFyYW1baW4sb3V0XSBhY2VscF9tZW0gcG9pbnRlciB0byBBQ0VMUCBtZW1vcnkgc3RydWN0dXJlCisgKiBccGFyYW1baW5dIGxlbmd0aCBsZW5ndGggb2YgemlyCisgKiBccGFyYW1bb3V0XSB6aXIgcG9pbnRlciB0byB6aXIgb3V0cHV0IGJ1ZmZlciwgZXhwb25lbnQgPSBTRl9TWU5USAorICovCit2b2lkIENMcGRfQWNlbHBfWmlyKGNvbnN0IEZJWFBfTFBDIEFbXSwgY29uc3QgSU5UIEFfZXhwLAorICAgICAgICAgICAgICAgICAgICBDQWNlbHBTdGF0aWNNZW0gKmFjZWxwX21lbSwgY29uc3QgSU5UIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgemlyW10sIGludCBkb0RlZW1waCk7CisKKy8qKgorICogXGJyaWVmIEJvcnJvdyBzdGF0aWMgZXhjaXRhdGlvbiBtZW1vcnkgZnJvbSBBQ0VMUCBkZWNvZGVyCisgKiBccGFyYW1baW5dIGFjZWxwX21lbSBwb2ludGVyIHRvIEFDRUxQIG1lbW9yeSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gbGVuZ3RoIG51bWJlciBvZiByZXF1ZXN0ZWQgRklYUF9EQkwgdmFsdWVzCisgKiBccmV0dXJuIHBvaW50ZXIgdG8gcmVxdWVzdGVkIG1lbW9yeQorICoKKyAqIFRoZSBjYWxsZXIgaGFzIHRvIHRha2UgY2FyZSBub3QgdG8gb3ZlcndyaXRlIHZhbGlkIG1lbW9yeSBhcmVhcy4KKyAqIER1cmluZyBUQ1gvRkFDIGNhbGN1bGF0aW9ucyBhbmQgYmVmb3JlIENMcGRfQWNlbHBQcmVwYXJlSW50ZXJuYWxNZW0oKSBpcworICogY2FsbGVkLCB0aGUgZm9sbG93aW5nIG1lbW9yeSBzaXplIGlzIGF2YWlsYWJsZToKKyAqIC0gMjU2IHNhbXBsZXMgaW4gY2FzZSBvZiBBQ0VMUCAtPiBUQ1gyMCAtPiBBQ0VMUCB0cmFuc2l0aW9uCisgKiAtIFBJVF9NQVhfTUFYK0xfSU5URVJQT0wgc2FtcGxlcyBpbiBhbGwgb3RoZXIgY2FzZXMKKyAqLworRklYUF9EQkwgKkNMcGRfQUNFTFBfR2V0RnJlZUV4Y01lbShDQWNlbHBTdGF0aWNNZW0gKmFjZWxwX21lbSwgSU5UIGxlbmd0aCk7CisKK3ZvaWQgQ0xwZF9UY3hURENvbmNlYWwoQ0FjZWxwU3RhdGljTWVtICphY2VscF9tZW0sIFNIT1JUICpwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9MUEMgbHNwX29sZFtNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDIGxzcF9uZXdbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBzdGFiX2ZhYywgSU5UIG51bUxvc3RTdWJmcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHN5bnRoW10sIElOVCBjb3JlQ29kZXJGcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbGFzdF90Y3hfbm9pc2VfZmFjdG9yKTsKKworaW5saW5lIFNIT1JUIEVfVVRJTF9yYW5kb20oU0hPUlQgKnNlZWQpIHsKKyAgKnNlZWQgPSAoU0hPUlQpKCgoKExPTkcpKnNlZWQgKiAoTE9ORykzMTgyMSkgPj4gMSkgKyAoTE9ORykxMzg0OSk7CisgIHJldHVybiAoKnNlZWQpOworfQorCisjZW5kaWYgLyogVVNBQ0RFQ19BQ0VMUF9IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3VzYWNkZWNfY29uc3QuaCBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19jb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGJhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfY29uc3QuaApAQCAtMCwwICsxLDIwMiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorCisgICBEZXNjcmlwdGlvbjogVVNBQyByZWxhdGVkIGNvbnN0YW50cworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFVTQUNERUNfQ09OU1RfSAorI2RlZmluZSBVU0FDREVDX0NPTlNUX0gKKworLyogc2NhbGUgZmFjdG9ycyAqLworI2RlZmluZSBTRl9DT0RFIDYgICAgICAgLyogZXhwb25lbnQgb2YgY29kZVtdLCBmaXhlZCBjb2RlYm9vayB2ZWN0b3IgKi8KKyNkZWZpbmUgU0ZfR0FJTl9DIDE2ICAgIC8qIGV4cG9uZW50IG9mIGdhaW4gY29kZSBhbmQgc21vb3RoZWQgZ2FpbiBjb2RlICovCisjZGVmaW5lIFNGX0VYQyAxNiAgICAgICAvKiBleHBvbmVudCBvZiBleGNbXSBhbmQgZXhjMltdLCBleGNpdGF0aW9uIGJ1ZmZlciAqLworI2RlZmluZSBTRl9HQUlOX1AgMSAgICAgLyogZXhwb25lbnQgb2YgZ2Fpbl9waXQgKi8KKyNkZWZpbmUgU0ZfUEZBQyAwICAgICAgIC8qIGV4cG9uZW50IG9mIHBlcmlvZC92b2ljaW5nIGZhY3RvciAqLworI2RlZmluZSBTRl9TWU5USCBTRl9FWEMgLyogZXhwb25lbnQgb2Ygc3ludGhlc2lzIGJ1ZmZlciAqLworI2RlZmluZSBTRl9BX0NPRUZGUyAzICAgLyogZXhwb25lbnQgb2YgTFAgZG9tYWluIHN5bnRoZXNpcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KKyNkZWZpbmUgU0ZfU1RBQiAxICAgICAgIC8qIGV4cG9uZW50IG9mIHN0YWJpbGl0eSBmYWN0b3IgKi8KKworLyogZGVmaW5pdGlvbnMgd2hpY2ggYXJlIGluZGVwZW5kZW50IG9mIGNvcmVDb2RlckZyYW1lTGVuZ3RoICovCisjZGVmaW5lIE1fTFBfRklMVEVSX09SREVSIDE2IC8qIExQIGZpbHRlciBvcmRlciAqLworCisjZGVmaW5lIFBJVF9NSU5fMTJrOCAzNCAgICAvKiBNaW5pbXVtIHBpdGNoIGxhZyB3aXRoIHJlc29sdXRpb24gMS80ICovCisjZGVmaW5lIFBJVF9NQVhfMTJrOCAyMzEgICAvKiBNYXhpbXVtIHBpdGNoIGxhZyBmb3IgZnM9MTIuOGtIeiAqLworI2RlZmluZSBGU0NBTEVfREVOT00gMTI4MDAgLyogRnJlcXVlbmN5IHNjYWxlIGRlbm9taW5hdG9yICovCisjZGVmaW5lIEZBQ19GU0NBTEVfTUlOIFwKKyAgNjAwMCAvKiBNaW5pbXVtIGFsbG93ZWQgZnJlcXVlbmN5IHNjYWxlIGZvciBhY2VscCBkZWNvZGVyICovCisKKyNpZiAhZGVmaW5lZChMUERfTUFYX0NPUkVfU1IpCisjZGVmaW5lIExQRF9NQVhfQ09SRV9TUiAyNDAwMCAvKiBEZWZhdWx0IHZhbHVlIGZyb20gcmVmIHNvZnQgKi8KKyNlbmRpZgorI2RlZmluZSBGQUNfRlNDQUxFX01BWCBcCisgIExQRF9NQVhfQ09SRV9TUiAvKiBNYXhpbXVtIGFsbG93ZWQgZnJlcXVlbmN5IHNjYWxlIGZvciBhY2VscCBkZWNvZGVyICovCisKKy8qIE1heGltdW0gcGl0Y2ggbGFnICg9IDQxMSBmb3IgZnNfbWF4ID0gMjQwMDApICovCisjZGVmaW5lIFBJVF9NQVhfVE1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUElUX01BWF8xMms4ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICg2ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoKEZBQ19GU0NBTEVfTUFYICogUElUX01JTl8xMms4KSArIChGU0NBTEVfREVOT00gLyAyKSkgLyBGU0NBTEVfREVOT00pIC0gXAorICAgICBQSVRfTUlOXzEyazgpKSkKKyNpZiAoUElUX01BWF9UTVAgPCBcCisgICAgIDI1NikgLyogY2Fubm90IGJlIHNtYWxsZXIgYmVjYXVzZSBvZiB0Y3ggdGltZSBkb21haW4gY29uY2VhbG1lbnQgKi8KKyNkZWZpbmUgUElUX01BWF9NQVggMjU2CisjZWxzZQorI2RlZmluZSBQSVRfTUFYX01BWCBQSVRfTUFYX1RNUAorI2VuZGlmCisKKyNkZWZpbmUgTkJfRElWIDQgICAvKiBudW1iZXIgb2YgZGl2aXNpb24gKDIwbXMpIHBlciA4MG1zIGZyYW1lICovCisjZGVmaW5lIExfU1VCRlIgNjQgLyogc3ViZnJhbWUgc2l6ZSAoNW1zKSAqLworI2RlZmluZSBCUEZfU0ZEIDEgIC8qIGJhc3MgcG9zdGZpbHRlciBkZWxheSAoc3ViZnJhbWUpICovCisjZGVmaW5lIEJQRl9ERUxBWSAoQlBGX1NGRCAqIExfU1VCRlIpIC8qIGJhc3MgcG9zdGZpbHRlciBkZWxheSAoc2FtcGxlcykgKi8KKworI2RlZmluZSBMX0ZJTFQgMTIgIC8qIERlbGF5IG9mIHVwLXNhbXBsaW5nIGZpbHRlciAoYmFzcyBwb3N0LWZpbHRlcikgKi8KKyNkZWZpbmUgTF9FWFRSQSA5NiAvKiBmb3IgYmFzcyBwb3N0LWZpbHRlciAqLworI2RlZmluZSBMX0lOVEVSUE9MIFwKKyAgKDE2ICsgMSkgLyogTGVuZ3RoIG9mIGZpbHRlciBmb3IgaW50ZXJwb2xhdGlvbiAoYWNlbHAgZGVjb2RlcikgKi8KKworLyogZGVmaW5pdGlvbnMgZm9yIGNvcmVDb2RlckZyYW1lTGVuZ3RoID0gMTAyNCAqLworI2RlZmluZSBMX0ZSQU1FX1BMVVNfMTAyNCAxMDI0IC8qIGxlbmd0aCBvZiBvbmUgODBtcyBzdXBlcmZyYW1lICovCisjZGVmaW5lIExfRElWXzEwMjQgXAorICAoTF9GUkFNRV9QTFVTXzEwMjQgLyBOQl9ESVYpIC8qIGxlbmd0aCBvZiBvbmUgYWNlbHAgb3IgdGN4MjAgZnJhbWUgKi8KKyNkZWZpbmUgTkJfU1VCRlJfMTAyNCBcCisgIChMX0RJVl8xMDI0IC8gTF9TVUJGUikgLyogbnVtYmVyIG9mIDVtcyBzdWJmcmFtZSBwZXIgZGl2aXNpb24gKi8KKyNkZWZpbmUgTkJfU1VCRlJfU1VQRVJGUl8xMDI0IFwKKyAgKExfRlJBTUVfUExVU18xMDI0IC8gTF9TVUJGUikgLyogbnVtYmVyIG9mIDVtcyBzdWJmcmFtZSBwZXIgODBtcyBmcmFtZSAqLworI2RlZmluZSBBQUNfU0ZEXzEwMjQgKE5CX1NVQkZSX1NVUEVSRlJfMTAyNCAvIDIpIC8qIEFBQyBkZWxheSAoc3ViZnJhbWUpICovCisjZGVmaW5lIEFBQ19ERUxBWV8xMDI0IChBQUNfU0ZEXzEwMjQgKiBMX1NVQkZSKSAgLyogQUFDIGRlbGF5IChzYW1wbGVzKSAqLworI2RlZmluZSBTWU5fU0ZEXzEwMjQgKEFBQ19TRkRfMTAyNCAtIEJQRl9TRkQpIC8qIHN5bnRoZXNpcyBkZWxheSAoc3ViZnJhbWUpICovCisjZGVmaW5lIFNZTl9ERUxBWV8xMDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoU1lOX1NGRF8xMDI0ICogTF9TVUJGUikgICAgICAgICAvKiBzeW50aGVzaXMgZGVsYXkgKHNhbXBsZXMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExGQUNfMTAyNCAoTF9ESVZfMTAyNCAvIDIpIC8qIEZBQyBmcmFtZSBsZW5ndGggKi8KKyNkZWZpbmUgTEZBQ19TSE9SVF8xMDI0IFwKKyAgKExfRElWXzEwMjQgLyA0KSAgICAgICAgLyogZm9yIHRyYW5zaXRpb25zIEVJR0hUX1NIT1JUIEZELT5MUEQgYW5kIHZ2LiAqLworI2RlZmluZSBGRE5TX05QVFNfMTAyNCA2NCAvKiBGRCBub2lzZSBzaGFwaW5nIHJlc29sdXRpb24gKDY0PTEwMEh6L3BvaW50KSAqLworCisvKiBkZWZpbml0aW9ucyBmb3IgY29yZUNvZGVyRnJhbWVMZW5ndGggPSA3NjggKi8KKyNkZWZpbmUgTF9GUkFNRV9QTFVTXzc2OCA3NjgKKyNkZWZpbmUgTF9ESVZfNzY4IFwKKyAgKExfRlJBTUVfUExVU183NjggLyBOQl9ESVYpIC8qIGxlbmd0aCBvZiBvbmUgYWNlbHAgb3IgdGN4MjAgZnJhbWUgKi8KKyNkZWZpbmUgTkJfU1VCRlJfNzY4IFwKKyAgKExfRElWXzc2OCAvIExfU1VCRlIpIC8qIG51bWJlciBvZiA1bXMgc3ViZnJhbWUgcGVyIGRpdmlzaW9uICovCisjZGVmaW5lIE5CX1NVQkZSX1NVUEVSRlJfNzY4IFwKKyAgKExfRlJBTUVfUExVU183NjggLyBMX1NVQkZSKSAvKiBudW1iZXIgb2YgNW1zIHN1YmZyYW1lIHBlciA4MG1zIGZyYW1lICovCisjZGVmaW5lIEFBQ19TRkRfNzY4IChOQl9TVUJGUl9TVVBFUkZSXzc2OCAvIDIpIC8qIEFBQyBkZWxheSAoc3ViZnJhbWUpICovCisjZGVmaW5lIEFBQ19ERUxBWV83NjggKEFBQ19TRkRfNzY4ICogTF9TVUJGUikgIC8qIEFBQyBkZWxheSAoc2FtcGxlcykgKi8KKyNkZWZpbmUgU1lOX1NGRF83NjggKEFBQ19TRkRfNzY4IC0gQlBGX1NGRCkgICAgLyogc3ludGhlc2lzIGRlbGF5IChzdWJmcmFtZSkgKi8KKyNkZWZpbmUgU1lOX0RFTEFZXzc2OCAoU1lOX1NGRF83NjggKiBMX1NVQkZSKSAgLyogc3ludGhlc2lzIGRlbGF5IChzYW1wbGVzKSAqLworI2RlZmluZSBMRkFDXzc2OCAoTF9ESVZfNzY4IC8gMikgICAgICAgICAgICAgICAvKiBGQUMgZnJhbWUgbGVuZ3RoICovCisjZGVmaW5lIExGQUNfU0hPUlRfNzY4IFwKKyAgKExfRElWXzc2OCAvIDQpIC8qIGZvciB0cmFuc2l0aW9ucyBFSUdIVF9TSE9SVCBGRC0+TFBEIGFuZCB2di4gKi8KKworLyogbWF4aW11bSAodXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24pICovCisjZGVmaW5lIExfRlJBTUVfUExVUyBMX0ZSQU1FX1BMVVNfMTAyNAorI2RlZmluZSBMX0RJViBMX0RJVl8xMDI0CisjZGVmaW5lIE5CX1NVQkZSIE5CX1NVQkZSXzEwMjQKKyNkZWZpbmUgTkJfU1VCRlJfU1VQRVJGUiBOQl9TVUJGUl9TVVBFUkZSXzEwMjQKKyNkZWZpbmUgQUFDX1NGRCBBQUNfU0ZEXzEwMjQKKyNkZWZpbmUgQUFDX0RFTEFZIEFBQ19ERUxBWV8xMDI0CisjZGVmaW5lIFNZTl9TRkQgU1lOX1NGRF8xMDI0CisjZGVmaW5lIFNZTl9ERUxBWSBTWU5fREVMQVlfMTAyNAorI2RlZmluZSBMRkFDIExGQUNfMTAyNAorI2RlZmluZSBMRkFDX1NIT1JUIExGQUNfU0hPUlRfMTAyNAorI2RlZmluZSBGRE5TX05QVFMgRkROU19OUFRTXzEwMjQKKworI2VuZGlmIC8qIFVTQUNERUNfQ09OU1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy91c2FjZGVjX2ZhYy5jcHAgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfZmFjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNlNGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2ZhYy5jcHAKQEAgLTAsMCArMSw3NDMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKworICAgRGVzY3JpcHRpb246IFVTQUMgRkFDCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2FjZGVjX2ZhYy5oIgorCisjaW5jbHVkZSAidXNhY2RlY19jb25zdC5oIgorI2luY2x1ZGUgInVzYWNkZWNfbHBjLmgiCisjaW5jbHVkZSAidXNhY2RlY19hY2VscC5oIgorI2luY2x1ZGUgInVzYWNkZWNfcm9tLmgiCisjaW5jbHVkZSAiZGN0LmgiCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorI2luY2x1ZGUgIm1kY3QuaCIKKworI2RlZmluZSBTUEVDX0ZBQyhwdHIsIGksIGdsKSAoKHB0cikgKyAoKGkpICogKGdsKSkpCisKK0ZJWFBfREJMICpDTHBkX0ZBQ19HZXRNZW1vcnkoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbW9kW05CX0RJVl0sIGludCAqcFN0YXRlKSB7CisgIEZJWFBfREJMICpwdHI7CisgIGludCBpOworICBpbnQgayA9IDA7CisgIGludCBtYXhfd2luZG93cyA9IDg7CisKKyAgRkRLX0FTU0VSVCgqcFN0YXRlID49IDAgJiYgKnBTdGF0ZSA8IG1heF93aW5kb3dzKTsKKworICAvKiBMb29rIGZvciBmcmVlIHNwYWNlIHRvIHN0b3JlIEZBQyBkYXRhLiAyIEZBQyBkYXRhIGJsb2NrcyBmaXQgaW50byBlYWNoIFRDWAorICAgKiBzcGVjdHJhbCBkYXRhIGJsb2NrLiAqLworICBmb3IgKGkgPSAqcFN0YXRlOyBpIDwgbWF4X3dpbmRvd3M7IGkrKykgeworICAgIGlmIChtb2RbaSA+PiAxXSA9PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAqcFN0YXRlID0gaSArIDE7CisKKyAgaWYgKGkgPT0gbWF4X3dpbmRvd3MpIHsKKyAgICBwdHIgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGEwOworICB9IGVsc2UgeworICAgIEZES19BU1NFUlQobW9kWyhpID4+IDEpXSA9PSAwKTsKKyAgICBwdHIgPSBTUEVDX0ZBQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgaSwKKyAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoIDw8IGspOworICB9CisKKyAgcmV0dXJuIHB0cjsKK30KKworaW50IENMcGRfRkFDX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBGSVhQX0RCTCAqcEZhYywgVUNIQVIgKnBGYWNTY2FsZSwKKyAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsIGludCB1c2VfZ2FpbiwgaW50IGZyYW1lKSB7CisgIEZJWFBfREJMIGZhY19nYWluOworICBpbnQgZmFjX2dhaW5fZSA9IDA7CisKKyAgaWYgKHVzZV9nYWluKSB7CisgICAgQ0xwZF9EZWNvZGVHYWluKCZmYWNfZ2FpbiwgJmZhY19nYWluX2UsIEZES3JlYWRCaXRzKGhCcywgNykpOworICB9CisKKyAgaWYgKENMcGNfRGVjb2RlQVZRKGhCcywgcEZhYywgMSwgMSwgbGVuZ3RoKSAhPSAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgeworICAgIGludCBzY2FsZTsKKworICAgIHNjYWxlID0gZ2V0U2NhbGVmYWN0b3IocEZhYywgbGVuZ3RoKTsKKyAgICBzY2FsZVZhbHVlcyhwRmFjLCBsZW5ndGgsIHNjYWxlKTsKKyAgICBwRmFjU2NhbGVbZnJhbWVdID0gREZSQUNUX0JJVFMgLSAxIC0gc2NhbGU7CisgIH0KKworICBpZiAodXNlX2dhaW4pIHsKKyAgICBpbnQgaTsKKworICAgIHBGYWNTY2FsZVtmcmFtZV0gKz0gZmFjX2dhaW5fZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgcEZhY1tpXSA9IGZNdWx0KHBGYWNbaV0sIGZhY19nYWluKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogXGJyaWVmIEFwcGx5IHN5bnRoZXNpcyBmaWx0ZXIgd2l0aCB6ZXJvIGlucHV0IHRvIHguIFRoZSBvdmVyYWxsIGZpbHRlciBnYWluCisgKiBpcyAxLjAuCisgKiBccGFyYW0gYSBMUEMgZmlsdGVyIGNvZWZmaWNpZW50cy4KKyAqIFxwYXJhbSBsZW5ndGggbGVuZ3RoIG9mIHRoZSBpbnB1dC9vdXRwdXQgZGF0YSB2ZWN0b3IgeC4KKyAqIFxwYXJhbSB4IGlucHV0L291dHB1dCB2ZWN0b3IsIHdoZXJlIHRoZSBzeW50aGVzaXMgZmlsdGVyIGlzIGFwcGxpZWQgaW4gcGxhY2UuCisgKi8KK3N0YXRpYyB2b2lkIFN5bl9maWx0X3plcm8oY29uc3QgRklYUF9MUEMgYVtdLCBjb25zdCBJTlQgYV9leHAsIElOVCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHhbXSkgeworICBpbnQgaSwgajsKKyAgRklYUF9EQkwgTF90bXA7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgTF90bXAgPSAoRklYUF9EQkwpMDsKKworICAgIGZvciAoaiA9IDA7IGogPCBmTWluKGksIE1fTFBfRklMVEVSX09SREVSKTsgaisrKSB7CisgICAgICBMX3RtcCAtPSBmTXVsdERpdjIoYVtqXSwgeFtpIC0gKGogKyAxKV0pOworICAgIH0KKworICAgIExfdG1wID0gc2NhbGVWYWx1ZShMX3RtcCwgYV9leHAgKyAxKTsKKworICAgIHhbaV0gPSBzY2FsZVZhbHVlU2F0dXJhdGUoKHhbaV0gPj4gMSkgKyAoTF90bXAgPj4gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsgLyogQXZvaWQgb3ZlcmZsb3cgaXNzdWVzIGFuZCBzYXR1cmF0ZS4gKi8KKyAgfQorfQorCisvKiBUYWJsZSBpcyBhbHNvIGNvcnJlY3QgZm9yIGNvcmVDb2RlckZyYW1lTGVuZ3RoID0gNzY4LiBGYWN0b3IgMy80IGlzIGNhbmNlbGVkCisgICBvdXQ6IGdhaW5GYWMgPSAwLjUgKiBzcXJ0KGZhY19sZW5ndGgvbEZyYW1lKQorKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBnYWluRmFjWzRdID0gezB4NDAwMDAwMDAsIDB4MmQ0MTNjY2QsIDB4MjAwMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE2YTA5ZTY2fTsKKwordm9pZCBDRmFjX0FwcGx5R2FpbnMoRklYUF9EQkwgZmFjX2RhdGFbTEZBQ10sIGNvbnN0IElOVCBmYWNfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgdGN4X2dhaW4sIGNvbnN0IEZJWFBfREJMIGFsZmRfZ2FpbnNbXSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBtb2QpIHsKKyAgRklYUF9EQkwgZmFjRmFjdG9yOworICBpbnQgaTsKKworICBGREtfQVNTRVJUKChmYWNfbGVuZ3RoID09IDEyOCkgfHwgKGZhY19sZW5ndGggPT0gOTYpKTsKKworICAvKiAyKSBBcHBseSBnYWluIGZhY3RvciB0byBGQUMgZGF0YSAqLworICBmYWNGYWN0b3IgPSBmTXVsdChnYWluRmFjW21vZF0sIHRjeF9nYWluKTsKKyAgZm9yIChpID0gMDsgaSA8IGZhY19sZW5ndGg7IGkrKykgeworICAgIGZhY19kYXRhW2ldID0gZk11bHQoZmFjX2RhdGFbaV0sIGZhY0ZhY3Rvcik7CisgIH0KKworICAvKiAzKSBBcHBseSBzcGVjdHJ1bSBkZXNoYXBpbmcgdXNpbmcgYWxmZF9nYWlucyAqLworICBmb3IgKGkgPSAwOyBpIDwgZmFjX2xlbmd0aCAvIDQ7IGkrKykgeworICAgIGludCBrOworCisgICAgayA9IGkgPj4gKDMgLSBtb2QpOworICAgIGZhY19kYXRhW2ldID0gZk11bHQoZmFjX2RhdGFbaV0sIGFsZmRfZ2FpbnNba10pCisgICAgICAgICAgICAgICAgICA8PCAxOyAvKiBhbGZkX2dhaW5zIGlzIHNjYWxlZCBieSBvbmUgYml0LiAqLworICB9Cit9CisKK3N0YXRpYyB2b2lkIENGYWNfQ2FsY0ZhY1NpZ25hbChGSVhQX0RCTCAqcE91dCwgRklYUF9EQkwgKnBGYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZhY19zY2FsZSwgY29uc3QgaW50IGZhY19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9MUEMgQVtNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIEFfZXhwLCBjb25zdCBpbnQgZkFkZFppciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXNGZEZhYykgeworICBGSVhQX0xQQyB3QVtNX0xQX0ZJTFRFUl9PUkRFUl07CisgIEZJWFBfREJMIHRmX2dhaW4gPSAoRklYUF9EQkwpMDsKKyAgaW50IHdsZW5ndGg7CisgIGludCBzY2FsZSA9IGZhY19zY2FsZTsKKworICAvKiBvYnRhaW4gdHJhbmZvcm0gZ2Fpbi4gKi8KKyAgaW1kY3RfZ2FpbigmdGZfZ2FpbiwgJnNjYWxlLCBpc0ZkRmFjID8gMCA6IGZhY19sZW5ndGgpOworCisgIC8qIDQpIENvbXB1dGUgaW52ZXJzZSBEQ1QtSVYgb2YgRkFDIGRhdGEuIE91dHB1dCBzY2FsZSBvZiBEQ1QgSVYgaXMgMTYgYml0cy4KKyAgICovCisgIGRjdF9JVihwRmFjLCBmYWNfbGVuZ3RoLCAmc2NhbGUpOworICAvKiBkY3RfSVYgc2NhbGUgPSBsb2cyKGZhY19sZW5ndGgpLiAiLSA3IiBpcyBhIGZhY3RvciBvZiAyLzEyOCAqLworICBpZiAodGZfZ2FpbiAhPSAoRklYUF9EQkwpMCkgeyAvKiBub24tcmFkaXggMiB0cmFuc2Zvcm0gZ2FpbiAqLworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGZhY19sZW5ndGg7IGkrKykgeworICAgICAgcEZhY1tpXSA9IGZNdWx0KHRmX2dhaW4sIHBGYWNbaV0pOworICAgIH0KKyAgfQorICBzY2FsZVZhbHVlc1NhdHVyYXRlKHBPdXQsIHBGYWMsIGZhY19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOyAvKiBBdm9pZCBvdmVyZmxvdyBpc3N1ZXMgYW5kIHNhdHVyYXRlLiAqLworCisgIEVfTFBDX2Ffd2VpZ2h0KHdBLCBBLCBNX0xQX0ZJTFRFUl9PUkRFUik7CisKKyAgLyogV2UgbmVlZCB0aGUgb3V0cHV0IG9mIHRoZSBJSVIgZmlsdGVyIHRvIGJlIGxvbmdlciB0aGFuICJmYWNfbGVuZ3RoIi4KKyAgRm9yIHRoaXMgcmVhc29uIHdlIHJ1biBpdCB3aXRoIHplcm8gaW5wdXQgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQKKyAgc2VxdWVuY2UsIGkuZS4gd2UgZ2VuZXJhdGUgaXRzIFpJUiBhbmQgZXh0ZW5kIHRoZSBvdXRwdXQgc2lnbmFsLiovCisgIEZES21lbWNsZWFyKHBPdXQgKyBmYWNfbGVuZ3RoLCBmYWNfbGVuZ3RoICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIHdsZW5ndGggPSAyICogZmFjX2xlbmd0aDsKKworICAvKiA1KSBBcHBseSB3ZWlnaHRlZCBzeW50aGVzaXMgZmlsdGVyIHRvIEZBQyBkYXRhLCBpbmNsdWRpbmcgb3B0aW9uYWwgWmlyICg1LgorICAgKiBpdGVtIDQpLiAqLworICBTeW5fZmlsdF96ZXJvKHdBLCBBX2V4cCwgd2xlbmd0aCwgcE91dCk7Cit9CisKK0lOVCBDTHBkX0ZBQ19NZGN0MkFjZWxwKEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKm91dHB1dCwgRklYUF9EQkwgKnBGYWMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZmFjX3NjYWxlLCBGSVhQX0xQQyAqQSwgSU5UIEFfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5yT3V0U2FtcGxlcywgY29uc3QgSU5UIGZhY19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaXNGZEZhYywgVUNIQVIgcHJldldpbmRvd1NoYXBlKSB7CisgIEZJWFBfREJMICpwT3ZsOworICBGSVhQX0RCTCAqcE91dDA7CisgIGNvbnN0IEZJWFBfV1RQICpwV2luZG93OworICBpbnQgaSwgZmwsIG5yU2FtcGxlcyA9IDA7CisKKyAgRkRLX0FTU0VSVChmYWNfbGVuZ3RoIDw9IDEwMjQgLyAoNCAqIDIpKTsKKworICBmbCA9IGZhY19sZW5ndGggKiAyOworCisgIHBXaW5kb3cgPSBGREtnZXRXaW5kb3dTbG9wZShmbCwgcHJldldpbmRvd1NoYXBlKTsKKworICAvKiBBZGFwdCB3aW5kb3cgc2xvcGUgbGVuZ3RoIGluIGNhc2Ugb2YgZnJhbWUgbG9zcy4gKi8KKyAgaWYgKGhNZGN0LT5wcmV2X2ZyICE9IGZsKSB7CisgICAgaW50IG5sID0gMDsKKyAgICBpbWRjdF9hZGFwdF9wYXJhbWV0ZXJzKGhNZGN0LCAmZmwsICZubCwgZmFjX2xlbmd0aCwgcFdpbmRvdywgbnJPdXRTYW1wbGVzKTsKKyAgICBGREtfQVNTRVJUKG5sID09IDApOworICB9CisKKyAgaWYgKG5yU2FtcGxlcyA8IG5yT3V0U2FtcGxlcykgeworICAgIHBPdXQwID0gb3V0cHV0OworICAgIG5yU2FtcGxlcyArPSBoTWRjdC0+b3Zfb2Zmc2V0OworICAgIC8qIFB1cmdlIGJ1ZmZlcmVkIG91dHB1dC4gKi8KKyAgICBGREttZW1jcHkocE91dDAsIGhNZGN0LT5vdmVybGFwLnRpbWUsIGhNZGN0LT5vdl9vZmZzZXQgKiBzaXplb2YocE91dDBbMF0pKTsKKyAgICBoTWRjdC0+b3Zfb2Zmc2V0ID0gMDsKKyAgfQorCisgIHBPdmwgPSBoTWRjdC0+b3ZlcmxhcC5mcmVxICsgaE1kY3QtPm92X3NpemUgLSAxOworCisgIGlmIChuclNhbXBsZXMgPj0gbnJPdXRTYW1wbGVzKSB7CisgICAgcE91dDAgPSBoTWRjdC0+b3ZlcmxhcC50aW1lICsgaE1kY3QtPm92X29mZnNldDsKKyAgICBoTWRjdC0+b3Zfb2Zmc2V0ICs9IGhNZGN0LT5wcmV2X25yICsgZmwgLyAyOworICB9IGVsc2UgeworICAgIHBPdXQwID0gb3V0cHV0ICsgbnJTYW1wbGVzOworICAgIG5yU2FtcGxlcyArPSBoTWRjdC0+cHJldl9uciArIGZsIC8gMjsKKyAgfQorICBpZiAoaE1kY3QtPnByZXZQcmV2QWxpYXNTeW1tZXRyeSA9PSAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhNZGN0LT5wcmV2X25yOyBpKyspIHsKKyAgICAgIEZJWFBfREJMIHggPSAtKCpwT3ZsLS0pOworICAgICAgKnBPdXQwID0gSU1EQ1RfU0NBTEVfREJMKHgpOworICAgICAgcE91dDArKzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhNZGN0LT5wcmV2X25yOyBpKyspIHsKKyAgICAgIEZJWFBfREJMIHggPSAoKnBPdmwtLSk7CisgICAgICAqcE91dDAgPSBJTURDVF9TQ0FMRV9EQkwoeCk7CisgICAgICBwT3V0MCsrOworICAgIH0KKyAgfQorICBoTWRjdC0+cHJldl9uciA9IDA7CisKKyAgeworICAgIGlmIChwRmFjICE9IE5VTEwpIHsKKyAgICAgIC8qIE5vdGU6IFRoZSBGQUMgZ2FpbiBtaWdodCBoYXZlIGJlZW4gYXBwbGllZCBkaXJlY3RseSBhZnRlciBiaXQgc3RyZWFtCisgICAgICAgKiBwYXJzZSBpbiB0aGlzIGNhc2UuICovCisgICAgICBDRmFjX0NhbGNGYWNTaWduYWwocE91dDAsIHBGYWMsIGZhY19zY2FsZSwgZmFjX2xlbmd0aCwgQSwgQV9leHAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNGZEZhYyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENsZWFyIGJ1ZmZlciBiZWNhdXNlIG9mIHRoZSBvdmVybGFwIGFuZCBBREQhICovCisgICAgICBGREttZW1jbGVhcihwT3V0MCwgZmFjX2xlbmd0aCAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIH0KKyAgfQorCisgIGkgPSAwOworCisgIGlmIChoTWRjdC0+cHJldlByZXZBbGlhc1N5bW1ldHJ5ID09IDApIHsKKyAgICBmb3IgKDsgaSA8IGZsIC8gMjsgaSsrKSB7CisgICAgICBGSVhQX0RCTCB4MDsKKworICAgICAgLyogT3ZlcmxhcCBBZGQgKi8KKyAgICAgIHgwID0gLWZNdWx0KCpwT3ZsLS0sIHBXaW5kb3dbaV0udi5yZSk7CisKKyAgICAgICpwT3V0MCArPSBJTURDVF9TQ0FMRV9EQkwoeDApOworICAgICAgcE91dDArKzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yICg7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgRklYUF9EQkwgeDA7CisKKyAgICAgIC8qIE92ZXJsYXAgQWRkICovCisgICAgICB4MCA9IGZNdWx0KCpwT3ZsLS0sIHBXaW5kb3dbaV0udi5yZSk7CisKKyAgICAgICpwT3V0MCArPSBJTURDVF9TQ0FMRV9EQkwoeDApOworICAgICAgcE91dDArKzsKKyAgICB9CisgIH0KKyAgaWYgKGhNZGN0LT5wRmFjWmlyICE9CisgICAgICAwKSB7IC8qIHRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGZvciBBQ0VMUCAtPiBUQ1gyMCAtPiBBQ0VMUCB0cmFuc2l0aW9uICovCisgICAgRklYUF9EQkwgKnBPdXQgPSBwT3V0MCAtIGZsIC8gMjsgLyogZmwvMiA9PSBmYWNfbGVuZ3RoICovCisgICAgZm9yIChpID0gMDsgaSA8IGZsIC8gMjsgaSsrKSB7CisgICAgICBwT3V0W2ldICs9IElNRENUX1NDQUxFX0RCTChoTWRjdC0+cEZhY1ppcltpXSk7CisgICAgfQorICAgIGhNZGN0LT5wRmFjWmlyID0gTlVMTDsKKyAgfQorCisgIGhNZGN0LT5wcmV2X2ZyID0gMDsKKyAgaE1kY3QtPnByZXZfbnIgPSAwOworICBoTWRjdC0+cHJldl90bCA9IDA7CisgIGhNZGN0LT5wcmV2UHJldkFsaWFzU3ltbWV0cnkgPSBoTWRjdC0+cHJldkFsaWFzU3ltbWV0cnk7CisKKyAgcmV0dXJuIG5yU2FtcGxlczsKK30KKworSU5UIENMcGRfRkFDX0FjZWxwMk1kY3QoSF9NRENUIGhNZGN0LCBGSVhQX0RCTCAqb3V0cHV0LCBGSVhQX0RCTCAqX3BTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgc3BlY19zY2FsZVtdLCBjb25zdCBpbnQgblNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcEZhYywgY29uc3QgaW50IGZhY19zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBmYWNfbGVuZ3RoLCBJTlQgbm9PdXRTYW1wbGVzLCBjb25zdCBJTlQgdGwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1dUUCAqd3JzLCBjb25zdCBJTlQgZnIsIEZJWFBfTFBDIEFbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UIEFfZXhwLCBDQWNlbHBTdGF0aWNNZW0gKmFjZWxwX21lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGdhaW4sIGNvbnN0IGludCBsYXN0X2ZyYW1lX2xvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXNGZEZhYywgY29uc3QgVUNIQVIgbGFzdF9scGRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBrLCBpbnQgY3VyckFsaWFzaW5nU3ltbWV0cnkpIHsKKyAgRklYUF9EQkwgKnBDdXJyLCAqcE92bCwgKnBTcGVjOworICBjb25zdCBGSVhQX1dUUCAqcFdpbmRvdzsKKyAgY29uc3QgRklYUF9XVEIgKkZhY1dpbmRvd1ppcl9jb25jZWFsOworICBVQ0hBUiBkb0ZhY1ppckNvbmNlYWwgPSAwOworICBpbnQgZG9EZWVtcGggPSAxOworICBjb25zdCBGSVhQX1dUQiAqRmFjV2luZG93WmlyLCAqRmFjV2luZG93U3ludGg7CisgIEZJWFBfREJMICpwT3V0MCA9IG91dHB1dCwgKnBPdXQxOworICBpbnQgdywgaSwgZmwsIG5sLCBuciwgZl9sZW4sIG5yU2FtcGxlcyA9IDAsIHMgPSAwLCBzY2FsZSwgdG90YWxfZ2Fpbl9lOworICBGSVhQX0RCTCAqcEYsICpwRkFDX2FuZF9GQUNfWklSID0gTlVMTDsKKyAgRklYUF9EQkwgdG90YWxfZ2FpbiA9IGdhaW47CisKKyAgRkRLX0FTU0VSVChmYWNfbGVuZ3RoIDw9IDEwMjQgLyAoNCAqIDIpKTsKKyAgc3dpdGNoIChmYWNfbGVuZ3RoKSB7CisgICAgLyogY29yZUNvZGVyRnJhbWVMZW5ndGggPSAxMDI0ICovCisgICAgY2FzZSAxMjg6CisgICAgICBwV2luZG93ID0gU2luZVdpbmRvdzI1NjsKKyAgICAgIEZhY1dpbmRvd1ppciA9IEZhY1dpbmRvd1ppcjEyODsKKyAgICAgIEZhY1dpbmRvd1N5bnRoID0gRmFjV2luZG93U3ludGgxMjg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY0OgorICAgICAgcFdpbmRvdyA9IFNpbmVXaW5kb3cxMjg7CisgICAgICBGYWNXaW5kb3daaXIgPSBGYWNXaW5kb3daaXI2NDsKKyAgICAgIEZhY1dpbmRvd1N5bnRoID0gRmFjV2luZG93U3ludGg2NDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICBwV2luZG93ID0gU2luZVdpbmRvdzY0OworICAgICAgRmFjV2luZG93WmlyID0gRmFjV2luZG93WmlyMzI7CisgICAgICBGYWNXaW5kb3dTeW50aCA9IEZhY1dpbmRvd1N5bnRoMzI7CisgICAgICBicmVhazsKKyAgICAvKiBjb3JlQ29kZXJGcmFtZUxlbmd0aCA9IDc2OCAqLworICAgIGNhc2UgOTY6CisgICAgICBwV2luZG93ID0gU2luZVdpbmRvdzE5MjsKKyAgICAgIEZhY1dpbmRvd1ppciA9IEZhY1dpbmRvd1ppcjk2OworICAgICAgRmFjV2luZG93U3ludGggPSBGYWNXaW5kb3dTeW50aDk2OworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODoKKyAgICAgIHBXaW5kb3cgPSBTaW5lV2luZG93OTY7CisgICAgICBGYWNXaW5kb3daaXIgPSBGYWNXaW5kb3daaXI0ODsKKyAgICAgIEZhY1dpbmRvd1N5bnRoID0gRmFjV2luZG93U3ludGg0ODsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOworICAgICAgcmV0dXJuIDA7CisgIH0KKworICBGYWNXaW5kb3daaXJfY29uY2VhbCA9IEZhY1dpbmRvd1N5bnRoOworICAvKiBEZXJpdmUgTlIgYW5kIE5MICovCisgIGZsID0gZmFjX2xlbmd0aCAqIDI7CisgIG5sID0gKHRsIC0gZmwpID4+IDE7CisgIG5yID0gKHRsIC0gZnIpID4+IDE7CisKKyAgaWYgKG5vT3V0U2FtcGxlcyA+IG5yU2FtcGxlcykgeworICAgIC8qIFB1cmdlIGJ1ZmZlcmVkIG91dHB1dC4gKi8KKyAgICBGREttZW1jcHkocE91dDAsIGhNZGN0LT5vdmVybGFwLnRpbWUsIGhNZGN0LT5vdl9vZmZzZXQgKiBzaXplb2YocE91dDBbMF0pKTsKKyAgICBuclNhbXBsZXMgPSBoTWRjdC0+b3Zfb2Zmc2V0OworICAgIGhNZGN0LT5vdl9vZmZzZXQgPSAwOworICB9CisKKyAgaWYgKG5yU2FtcGxlcyA+PSBub091dFNhbXBsZXMpIHsKKyAgICBwT3V0MSA9IGhNZGN0LT5vdmVybGFwLnRpbWUgKyBoTWRjdC0+b3Zfb2Zmc2V0OworICAgIGlmIChoTWRjdC0+b3Zfb2Zmc2V0IDwgZmFjX2xlbmd0aCkgeworICAgICAgcE91dDAgPSBvdXRwdXQgKyBuclNhbXBsZXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHBPdXQwID0gcE91dDE7CisgICAgfQorICAgIGhNZGN0LT5vdl9vZmZzZXQgKz0gZmFjX2xlbmd0aCArIG5sOworICB9IGVsc2UgeworICAgIHBPdXQxID0gb3V0cHV0ICsgbnJTYW1wbGVzOworICAgIHBPdXQwID0gb3V0cHV0ICsgbnJTYW1wbGVzOworICB9CisKKyAgeworICAgIHBGQUNfYW5kX0ZBQ19aSVIgPSBDTHBkX0FDRUxQX0dldEZyZWVFeGNNZW0oYWNlbHBfbWVtLCAyICogZmFjX2xlbmd0aCk7CisgICAgeworICAgICAgY29uc3QgRklYUF9EQkwgKnBUbXAxLCAqcFRtcDI7CisKKyAgICAgIGRvRmFjWmlyQ29uY2VhbCB8PSAoKGxhc3RfZnJhbWVfbG9zdCAhPSAwKSAmJiAoayA9PSAwKSk7CisgICAgICBkb0RlZW1waCAmPSAobGFzdF9scGRfbW9kZSAhPSA0KTsKKyAgICAgIGlmIChkb0ZhY1ppckNvbmNlYWwpIHsKKyAgICAgICAgLyogQUNFTFAgY29udHJpYnV0aW9uIGluIGNvbmNlYWxtZW50IGNhc2U6CisgICAgICAgICAgIFVzZSBaSVIgd2l0aCBhIG1vZGlmaWVkIFpJUiB3aW5kb3cgdG8gcHJlc2VydmUgc29tZSBtb3JlIGVuZXJneS4KKyAgICAgICAgICAgRG9udCB1c2UgRkFDLCB3aGljaCBjb250YWlucyB3cm9uZyBpbmZvcm1hdGlvbiBmb3IgY29uY2VhbGVkIGZyYW1lCisgICAgICAgICAgIERvbnQgdXNlIGxhc3QgQUNFTFAgc2FtcGxlcywgYnV0IGRvdWJsZSBaSVIsIGluc3RlYWQgKGFmdGVyd2FyZHMpICovCisgICAgICAgIEZES21lbWNsZWFyKHBGQUNfYW5kX0ZBQ19aSVIsIDIgKiBmYWNfbGVuZ3RoICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZhY1dpbmRvd1N5bnRoID0gKEZJWFBfV1RCICopcEZBQ19hbmRfRkFDX1pJUjsKKyAgICAgICAgRmFjV2luZG93WmlyID0gRmFjV2luZG93WmlyX2NvbmNlYWw7CisgICAgICB9IGVsc2UgeworICAgICAgICBDRmFjX0NhbGNGYWNTaWduYWwocEZBQ19hbmRfRkFDX1pJUiwgcEZhYywgZmFjX3NjYWxlICsgcywgZmFjX2xlbmd0aCwgQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFfZXhwLCAxLCBpc0ZkRmFjKTsKKyAgICAgIH0KKyAgICAgIC8qIDYpIEdldCB3aW5kb3dlZCBwYXN0IEFDRUxQIHNhbXBsZXMgYW5kIEFDRUxQIFpJUiBzaWduYWwgKi8KKworICAgICAgLyoKKyAgICAgICAqIEdldCBBQ0VMUCBaSVIgKHBGYWNbXSkgYW5kIEFDRUxQIHBhc3Qgc2FtcGxlcyAocE91dDBbXSkgYW5kIGFkZCB0aGVtCisgICAgICAgKiB0byB0aGUgRkFDIHN5bnRoIHNpZ25hbCBjb250cmlidXRpb24gb24gcE91dDFbXS4KKyAgICAgICAqLworICAgICAgeworICAgICAgICB7CisgICAgICAgICAgQ0xwZF9BY2VscF9aaXIoQSwgQV9leHAsIGFjZWxwX21lbSwgZmFjX2xlbmd0aCwgcEZhYywgZG9EZWVtcGgpOworCisgICAgICAgICAgcFRtcDEgPSBwT3V0MDsKKyAgICAgICAgICBwVG1wMiA9IHBGYWM7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwLCB3ID0gMDsgaSA8IGZhY19sZW5ndGg7IGkrKykgeworICAgICAgICAgIEZJWFBfREJMIHg7CisgICAgICAgICAgLyogRGl2MiBpcyBjb21wZW5zYXRlZCBieSB0YWJsZSBzY2FsaW5nICovCisgICAgICAgICAgeCA9IGZNdWx0RGl2MihwVG1wMltpXSwgRmFjV2luZG93WmlyW3ddKTsKKyAgICAgICAgICB4ICs9IGZNdWx0RGl2MihwVG1wMVstaSAtIDFdLCBGYWNXaW5kb3dTeW50aFt3XSk7CisgICAgICAgICAgeCArPSBwRkFDX2FuZF9GQUNfWklSW2ldOworICAgICAgICAgIHBPdXQxW2ldID0geDsKKworICAgICAgICAgIHcrKzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZG9GYWNaaXJDb25jZWFsKSB7CisgICAgICAgIC8qIFpJUiBpcyB0aGUgb25seSBBQ0VMUCBjb250cmlidXRpb24sIHNvIGRvdWJsZSBpdCAqLworICAgICAgICBzY2FsZVZhbHVlcyhwT3V0MSwgZmFjX2xlbmd0aCwgMSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKG5yU2FtcGxlcyA8IG5vT3V0U2FtcGxlcykgeworICAgIG5yU2FtcGxlcyArPSBmYWNfbGVuZ3RoICsgbmw7CisgIH0KKworICAvKiBPYnRhaW4gdHJhbnNmb3JtIGdhaW4gKi8KKyAgdG90YWxfZ2FpbiA9IGdhaW47CisgIHRvdGFsX2dhaW5fZSA9IDA7CisgIGltZGN0X2dhaW4oJnRvdGFsX2dhaW4sICZ0b3RhbF9nYWluX2UsIHRsKTsKKworICAvKiBJTURDVCBvdmVybGFwIGFkZCAqLworICBzY2FsZSA9IHRvdGFsX2dhaW5fZTsKKyAgcFNwZWMgPSBfcFNwZWM7CisKKyAgLyogTm90ZTp3aGVuIGNvbW1pbmcgZnJvbSBhbiBMUEQgZnJhbWUgKFRDWC9BQ0VMUCkgdGhlIHByZXZpb3VzIGFsaXNhaW5nCisgICAqIHN5bW1ldHJ5IG11c3QgYWx3YXlzIGJlIDAgKi8KKyAgaWYgKGN1cnJBbGlhc2luZ1N5bW1ldHJ5ID09IDApIHsKKyAgICBkY3RfSVYocFNwZWMsIHRsLCAmc2NhbGUpOworICB9IGVsc2UgeworICAgIEZJWFBfREJMIF90bXBbMTAyNCArIEFMSUdOTUVOVF9ERUZBVUxUIC8gc2l6ZW9mKEZJWFBfREJMKV07CisgICAgRklYUF9EQkwgKnRtcCA9IChGSVhQX0RCTCAqKUFMSUdOX1BUUihfdG1wKTsKKyAgICBDX0FMTE9DX0FMSUdORURfUkVHSVNURVIodG1wLCBzaXplb2YoX3RtcCkpOworICAgIGRzdF9JSUkocFNwZWMsIHRtcCwgdGwsICZzY2FsZSk7CisgICAgQ19BTExPQ19BTElHTkVEX1VOUkVHSVNURVIodG1wKTsKKyAgfQorCisgIC8qIE9wdGlvbmFsIHNjYWxpbmcgb2YgdGltZSBkb21haW4gLSBubyB5ZXQgd2luZG93ZWQgLSBvZiBjdXJyZW50IHNwZWN0cnVtICovCisgIGlmICh0b3RhbF9nYWluICE9IChGSVhQX0RCTCkwKSB7CisgICAgc2NhbGVWYWx1ZXNXaXRoRmFjdG9yKHBTcGVjLCB0b3RhbF9nYWluLCB0bCwgc3BlY19zY2FsZVswXSArIHNjYWxlKTsKKyAgfSBlbHNlIHsKKyAgICBzY2FsZVZhbHVlcyhwU3BlYywgdGwsIHNwZWNfc2NhbGVbMF0gKyBzY2FsZSk7CisgIH0KKworICBwT3V0MSArPSBmbCAvIDIgLSAxOworICBwQ3VyciA9IHBTcGVjICsgdGwgLSBmbCAvIDI7CisKKyAgZm9yIChpID0gMDsgaSA8IGZsIC8gMjsgaSsrKSB7CisgICAgRklYUF9EQkwgeDE7CisKKyAgICAvKiBGQUMgc2lnbmFsIGlzIGFscmVhZHkgb24gcE91dDEsIGJlY2F1c2Ugb2YgdGhhdCB0aGUgKz0gb3BlcmF0b3IuICovCisgICAgeDEgPSBmTXVsdCgqcEN1cnIrKywgcFdpbmRvd1tpXS52LnJlKTsKKyAgICBGREtfQVNTRVJUKChwT3V0MSA+PSBoTWRjdC0+b3ZlcmxhcC50aW1lICYmCisgICAgICAgICAgICAgICAgcE91dDEgPCBoTWRjdC0+b3ZlcmxhcC50aW1lICsgaE1kY3QtPm92X3NpemUpIHx8CisgICAgICAgICAgICAgICAocE91dDEgPj0gb3V0cHV0ICYmIHBPdXQxIDwgb3V0cHV0ICsgMTAyNCkpOworICAgICpwT3V0MSArPSBJTURDVF9TQ0FMRV9EQkwoLXgxKTsKKyAgICBwT3V0MS0tOworICB9CisKKyAgLyogTkwgb3V0cHV0IHNhbXBsZXMgVEwvMitGTC8yLi5UTC4gLSBjdXJyZW50W0ZMLzIuLjBdICovCisgIHBPdXQxICs9IChmbCAvIDIpICsgMTsKKworICBwRkFDX2FuZF9GQUNfWklSICs9IGZhY19sZW5ndGg7IC8qIHNldCBwb2ludGVyIHRvIGJlZ2lubmluZyBvZiBGQUMgWklSICovCisKKyAgaWYgKG5sID09IDApIHsKKyAgICAvKiBzYXZlIHBvaW50ZXIgdG8gd3JpdGUgRkFDIFpJUiBkYXRhIGxhdGVyICovCisgICAgaE1kY3QtPnBGYWNaaXIgPSBwRkFDX2FuZF9GQUNfWklSOworICB9IGVsc2UgeworICAgIEZES19BU1NFUlQobmwgPj0gZmFjX2xlbmd0aCk7CisgICAgLyogRkFDIFpJUiB3aWxsIGJlIGFkZGVkIG5vdyAuLi4gKi8KKyAgICBoTWRjdC0+cEZhY1ppciA9IE5VTEw7CisgIH0KKworICBwRiA9IHBGQUNfYW5kX0ZBQ19aSVI7CisgIGZfbGVuID0gZmFjX2xlbmd0aDsKKworICBwQ3VyciA9IHBTcGVjICsgdGwgLSBmbCAvIDIgLSAxOworICBmb3IgKGkgPSAwOyBpIDwgbmw7IGkrKykgeworICAgIEZJWFBfREJMIHggPSAtKCpwQ3Vyci0tKTsKKyAgICAvKiA1KSAoaXRlbSA0KSBTeW50aGVzaXMgZmlsdGVyIFppciBjb21wb25lbnQsIEZBQyBaSVIgKGFub3RoZXIgb25lKS4gKi8KKyAgICBpZiAoaSA8IGZfbGVuKSB7CisgICAgICB4ICs9ICpwRisrOworICAgIH0KKworICAgIEZES19BU1NFUlQoKHBPdXQxID49IGhNZGN0LT5vdmVybGFwLnRpbWUgJiYKKyAgICAgICAgICAgICAgICBwT3V0MSA8IGhNZGN0LT5vdmVybGFwLnRpbWUgKyBoTWRjdC0+b3Zfc2l6ZSkgfHwKKyAgICAgICAgICAgICAgIChwT3V0MSA+PSBvdXRwdXQgJiYgcE91dDEgPCBvdXRwdXQgKyAxMDI0KSk7CisgICAgKnBPdXQxID0gSU1EQ1RfU0NBTEVfREJMKHgpOworICAgIHBPdXQxKys7CisgIH0KKworICBoTWRjdC0+cHJldl9uciA9IG5yOworICBoTWRjdC0+cHJldl9mciA9IGZyOworICBoTWRjdC0+cHJldl93cnMgPSB3cnM7CisgIGhNZGN0LT5wcmV2X3RsID0gdGw7CisgIGhNZGN0LT5wcmV2UHJldkFsaWFzU3ltbWV0cnkgPSBoTWRjdC0+cHJldkFsaWFzU3ltbWV0cnk7CisgIGhNZGN0LT5wcmV2QWxpYXNTeW1tZXRyeSA9IGN1cnJBbGlhc2luZ1N5bW1ldHJ5OworICBmbCA9IGZyOworICBubCA9IG5yOworCisgIHBPdmwgPSBwU3BlYyArIHRsIC8gMiAtIDE7CisgIHBPdXQwID0gcE91dDE7CisKKyAgZm9yICh3ID0gMTsgdyA8IG5TcGVjOyB3KyspIC8qIGZvciBBQ0VMUCAtPiBGRCBzaG9ydCAqLworICB7CisgICAgY29uc3QgRklYUF9XVFAgKnBXaW5kb3dfcHJldjsKKworICAgIC8qIFNldHVwIHdpbmRvdyBwb2ludGVycyAqLworICAgIHBXaW5kb3dfcHJldiA9IGhNZGN0LT5wcmV2X3dyczsKKworICAgIC8qIEN1cnJlbnQgc3BlY3RydW0gKi8KKyAgICBwU3BlYyA9IF9wU3BlYyArIHcgKiB0bDsKKworICAgIHNjYWxlID0gdG90YWxfZ2Fpbl9lOworCisgICAgLyogRm9yIHRoZSBzZWNvbmQsIHRoaXJkLCBldGMuIHNob3J0IGZyYW1lcyB0aGUgYWxpc2Fpbmcgc3ltbWV0cnkgaXMgZXF1YWwsCisgICAgICogZWl0aGVyICgwLDApIG9yICgxLDEpICovCisgICAgaWYgKGN1cnJBbGlhc2luZ1N5bW1ldHJ5ID09IDApIHsKKyAgICAgIC8qIERDVCBJViBvZiBjdXJyZW50IHNwZWN0cnVtICovCisgICAgICBkY3RfSVYocFNwZWMsIHRsLCAmc2NhbGUpOworICAgIH0gZWxzZSB7CisgICAgICBkc3RfSVYocFNwZWMsIHRsLCAmc2NhbGUpOworICAgIH0KKworICAgIC8qIE9wdGlvbmFsIHNjYWxpbmcgb2YgdGltZSBkb21haW4gLSBubyB5ZXQgd2luZG93ZWQgLSBvZiBjdXJyZW50IHNwZWN0cnVtCisgICAgICovCisgICAgLyogYW5kIGRlLXNjYWxlIGN1cnJlbnQgc3BlY3RydW0gc2lnbmFsICh0aW1lIGRvbWFpbiwgbm8geWV0IHdpbmRvd2VkKSAqLworICAgIGlmICh0b3RhbF9nYWluICE9IChGSVhQX0RCTCkwKSB7CisgICAgICBzY2FsZVZhbHVlc1dpdGhGYWN0b3IocFNwZWMsIHRvdGFsX2dhaW4sIHRsLCBzcGVjX3NjYWxlW3ddICsgc2NhbGUpOworICAgIH0gZWxzZSB7CisgICAgICBzY2FsZVZhbHVlcyhwU3BlYywgdGwsIHNwZWNfc2NhbGVbd10gKyBzY2FsZSk7CisgICAgfQorCisgICAgaWYgKG5vT3V0U2FtcGxlcyA8PSBuclNhbXBsZXMpIHsKKyAgICAgIC8qIERpdmVydCBvdXRwdXQgZmlyc3QgaGFsZiB0byBvdmVybGFwIGJ1ZmZlciBpZiB3ZSBhbHJlYWR5IGdvdCBlbm91Z2gKKyAgICAgICAqIG91dHB1dCBzYW1wbGVzLiAqLworICAgICAgcE91dDAgPSBoTWRjdC0+b3ZlcmxhcC50aW1lICsgaE1kY3QtPm92X29mZnNldDsKKyAgICAgIGhNZGN0LT5vdl9vZmZzZXQgKz0gaE1kY3QtPnByZXZfbnIgKyBmbCAvIDI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEFjY291bnQgb3V0cHV0IHNhbXBsZXMgKi8KKyAgICAgIG5yU2FtcGxlcyArPSBoTWRjdC0+cHJldl9uciArIGZsIC8gMjsKKyAgICB9CisKKyAgICAvKiBOUiBvdXRwdXQgc2FtcGxlcyAwIC4uIE5SLiAtb3ZlcmxhcFtUTC8yLi5UTC8yLU5SXSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBoTWRjdC0+cHJldl9ucjsgaSsrKSB7CisgICAgICBGSVhQX0RCTCB4ID0gLSgqcE92bC0tKTsKKyAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICAgIHBPdXQwKys7CisgICAgfQorCisgICAgaWYgKG5vT3V0U2FtcGxlcyA8PSBuclNhbXBsZXMpIHsKKyAgICAgIC8qIERpdmVydCBvdXRwdXQgc2Vjb25kIGhhbGYgdG8gb3ZlcmxhcCBidWZmZXIgaWYgd2UgYWxyZWFkeSBnb3QgZW5vdWdoCisgICAgICAgKiBvdXRwdXQgc2FtcGxlcy4gKi8KKyAgICAgIHBPdXQxID0gaE1kY3QtPm92ZXJsYXAudGltZSArIGhNZGN0LT5vdl9vZmZzZXQgKyBmbCAvIDIgLSAxOworICAgICAgaE1kY3QtPm92X29mZnNldCArPSBmbCAvIDIgKyBubDsKKyAgICB9IGVsc2UgeworICAgICAgcE91dDEgPSBwT3V0MCArIChmbCAtIDEpOworICAgICAgbnJTYW1wbGVzICs9IGZsIC8gMiArIG5sOworICAgIH0KKworICAgIC8qIG91dHB1dCBzYW1wbGVzIGJlZm9yZSB3aW5kb3cgY3Jvc3NpbmcgcG9pbnQgTlIgLi4gVEwvMi4KKyAgICAgKiAtb3ZlcmxhcFtUTC8yLU5SLi5UTC8yLU5SLUZMLzJdICsgY3VycmVudFtOUi4uVEwvMl0gKi8KKyAgICAvKiBvdXRwdXQgc2FtcGxlcyBhZnRlciB3aW5kb3cgY3Jvc3NpbmcgcG9pbnQgVEwvMiAuLiBUTC8yK0ZMLzIuCisgICAgICogLW92ZXJsYXBbMC4uRkwvMl0gLSBjdXJyZW50W1RMLzIuLkZMLzJdICovCisgICAgcEN1cnIgPSBwU3BlYyArIHRsIC0gZmwgLyAyOworICAgIGlmIChjdXJyQWxpYXNpbmdTeW1tZXRyeSA9PSAwKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZmwgLyAyOyBpKyspIHsKKyAgICAgICAgRklYUF9EQkwgeDAsIHgxOworCisgICAgICAgIGNwbHhNdWx0KCZ4MSwgJngwLCAqcEN1cnIrKywgLSpwT3ZsLS0sIHBXaW5kb3dfcHJldltpXSk7CisgICAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTCh4MCk7CisgICAgICAgICpwT3V0MSA9IElNRENUX1NDQUxFX0RCTCgteDEpOworICAgICAgICBwT3V0MCsrOworICAgICAgICBwT3V0MS0tOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoaE1kY3QtPnByZXZQcmV2QWxpYXNTeW1tZXRyeSA9PSAwKSB7CisgICAgICAgIC8qIEp1bXAgRFNUIElJIC0+IERTVCBJViBmb3IgdGhlIHNlY29uZCB3aW5kb3cgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZsIC8gMjsgaSsrKSB7CisgICAgICAgICAgRklYUF9EQkwgeDAsIHgxOworCisgICAgICAgICAgY3BseE11bHQoJngxLCAmeDAsICpwQ3VycisrLCAtKnBPdmwtLSwgcFdpbmRvd19wcmV2W2ldKTsKKyAgICAgICAgICAqcE91dDAgPSBJTURDVF9TQ0FMRV9EQkwoeDApOworICAgICAgICAgICpwT3V0MSA9IElNRENUX1NDQUxFX0RCTCh4MSk7CisgICAgICAgICAgcE91dDArKzsKKyAgICAgICAgICBwT3V0MS0tOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBKdW1wIERTVCBJViAtPiBEU1QgSVYgZnJvbSB0aGUgc2Vjb25kIHdpbmRvdyBvbiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmwgLyAyOyBpKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCB4MCwgeDE7CisKKyAgICAgICAgICBjcGx4TXVsdCgmeDEsICZ4MCwgKnBDdXJyKyssICpwT3ZsLS0sIHBXaW5kb3dfcHJldltpXSk7CisgICAgICAgICAgKnBPdXQwID0gSU1EQ1RfU0NBTEVfREJMKHgwKTsKKyAgICAgICAgICAqcE91dDEgPSBJTURDVF9TQ0FMRV9EQkwoeDEpOworICAgICAgICAgIHBPdXQwKys7CisgICAgICAgICAgcE91dDEtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChoTWRjdC0+cEZhY1ppciAhPSAwKSB7CisgICAgICAvKiBhZGQgRkFDIFpJUiBvZiBwcmV2aW91cyBBQ0VMUCAtPiBtZGN0IHRyYW5zaXRpb24gKi8KKyAgICAgIEZJWFBfREJMICpwT3V0ID0gcE91dDAgLSBmbCAvIDI7CisgICAgICBGREtfQVNTRVJUKGZsIC8gMiA8PSAxMjgpOworICAgICAgZm9yIChpID0gMDsgaSA8IGZsIC8gMjsgaSsrKSB7CisgICAgICAgIHBPdXRbaV0gKz0gSU1EQ1RfU0NBTEVfREJMKGhNZGN0LT5wRmFjWmlyW2ldKTsKKyAgICAgIH0KKyAgICAgIGhNZGN0LT5wRmFjWmlyID0gTlVMTDsKKyAgICB9CisgICAgcE91dDAgKz0gKGZsIC8gMik7CisKKyAgICAvKiBOTCBvdXRwdXQgc2FtcGxlcyBUTC8yK0ZMLzIuLlRMLiAtIGN1cnJlbnRbRkwvMi4uMF0gKi8KKyAgICBwT3V0MSArPSAoZmwgLyAyKSArIDE7CisgICAgcEN1cnIgPSBwU3BlYyArIHRsIC0gZmwgLyAyIC0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmw7IGkrKykgeworICAgICAgRklYUF9EQkwgeCA9IC0oKnBDdXJyLS0pOworICAgICAgKnBPdXQxID0gSU1EQ1RfU0NBTEVfREJMKHgpOworICAgICAgcE91dDErKzsKKyAgICB9CisKKyAgICAvKiBTZXQgb3ZlcmxhcCBzb3VyY2UgcG9pbnRlciBmb3IgbmV4dCB3aW5kb3cgcE92bCA9IHBTcGVjICsgdGwvMiAtIDE7ICovCisgICAgcE92bCA9IHBTcGVjICsgdGwgLyAyIC0gMTsKKworICAgIC8qIFByZXZpb3VzIHdpbmRvdyB2YWx1ZXMuICovCisgICAgaE1kY3QtPnByZXZfbnIgPSBucjsKKyAgICBoTWRjdC0+cHJldl9mciA9IGZyOworICAgIGhNZGN0LT5wcmV2X3RsID0gdGw7CisgICAgaE1kY3QtPnByZXZfd3JzID0gcFdpbmRvd19wcmV2OworICAgIGhNZGN0LT5wcmV2UHJldkFsaWFzU3ltbWV0cnkgPSBoTWRjdC0+cHJldkFsaWFzU3ltbWV0cnk7CisgICAgaE1kY3QtPnByZXZBbGlhc1N5bW1ldHJ5ID0gY3VyckFsaWFzaW5nU3ltbWV0cnk7CisgIH0KKworICAvKiBTYXZlIG92ZXJsYXAgKi8KKworICBwT3ZsID0gaE1kY3QtPm92ZXJsYXAuZnJlcSArIGhNZGN0LT5vdl9zaXplIC0gdGwgLyAyOworICBGREtfQVNTRVJUKHBPdmwgPj0gaE1kY3QtPm92ZXJsYXAudGltZSArIGhNZGN0LT5vdl9vZmZzZXQpOworICBGREtfQVNTRVJUKHRsIC8gMiA8PSBoTWRjdC0+b3Zfc2l6ZSk7CisgIGZvciAoaSA9IDA7IGkgPCB0bCAvIDI7IGkrKykgeworICAgIHBPdmxbaV0gPSBfcFNwZWNbaSArICh3IC0gMSkgKiB0bF07CisgIH0KKworICByZXR1cm4gbnJTYW1wbGVzOworfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy91c2FjZGVjX2ZhYy5oIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2ZhYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTM1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfZmFjLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKworICAgRGVzY3JpcHRpb246IFVTQUMgRkFDCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVVNBQ0RFQ19GQUNfSAorI2RlZmluZSBVU0FDREVDX0ZBQ19ICisKKyNpbmNsdWRlICJjaGFubmVsaW5mby5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworLyoqCisgKiBcYnJpZWYgR2V0IHRoZSBhZGRyZXNzIG9mIGEgbWVtb3J5IGFyZWEgb2YgdGhlIHNwZWN0cmFsIGRhdGEgbWVtb3J5IHdlcmUgdGhlCisgKiBGQUMgZGF0YSBjYW4gYmUgc3RvcmVkIGludG8uCisgKiBccGFyYW0gc3BlYyBTUEVDVFJBTF9QVFIgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgc3BlY3RyYWwgZGF0YS4KKyAqIFxwYXJhbSBtb2QgdGhlIGN1cnJlbnQgTFBEIG1vZCBhcnJheS4KKyAqIFxwYXJhbSBwU3RhdGUgcG9pbnRlciB0byBhIHByaXZhdGUgc3RhdGUgdmFyaWFibGUgd2hpY2ggbXVzdCBiZSAwIGZvciB0aGUKKyAqIGZpcnN0IGNhbGwgYW5kIG5vdCBjaGFuZ2VkIGV4dGVybmFsbHkuCisgKiBccGFyYW0gaXNGdWxsYmFuZExQRCBpcyAxIGlmIGZ1bGxiYW5kIExQRCBtb2RlIGlzIG9uLCBvdGhlcndpc2UgaXQgaXMgMC4KKyAqLworRklYUF9EQkwgKkNMcGRfRkFDX0dldE1lbW9yeShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBtb2RbTkJfU1VCRlJdLCBpbnQgKnBTdGF0ZSk7CisKKy8qKgorICogXGJyaWVmIHJlYWQgYSBmYWMgYml0c3RyZWFtIGRhdGEgYmxvY2suCisgKiBccGFyYW0gaEJzIGEgYml0IHN0cmVhbSBoYW5kbGUsIHdoZXJlIHRoZSBmYWMgYml0c3RyZWFtIGRhdGEgaXMgbG9jYXRlZC4KKyAqIFxwYXJhbSBwRmFjIHBvaW50ZXIgdG8gd2VyZSB0aGUgRkFDIGRhdGEgd2lsbCBiZSBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSBwRmFjU2NhbGUgcG9pbnRlciB0byB3ZXJlIHRoZSBGQUMgZGF0YSBzY2FsZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZAorICogaW50by4KKyAqIFxwYXJhbSB0Y3hfZ2FpbiB2YWx1ZSB0byBiZSB1c2VkIGFzIEZBQyBnYWluLiBJZiB6ZXJvLCByZWFkIGZhY19nYWluIGZyb20KKyAqIGJpdHN0cmVhbS4KKyAqIFxwYXJhbSB0Y3hfZ2Fpbl9lIGV4cG9uZW4gdmFsdWUgb2YgdGN4X2dhaW4uCisgKiBccGFyYW0gZnJhbWUgdGhlIHN1YmZyYW1lIHRvIGJlIGNvbnNpZGVyZWQgZnJvbSB0aGUgY3VycmVudCBzdXBlcmZyYW1lLgorICogQWx3YXlzIDAgZm9yIEZEIGNhc2UuCisgKiBccmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuCisgKi8KK2ludCBDTHBkX0ZBQ19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgRklYUF9EQkwgKnBGYWMsIFVDSEFSICpwRmFjU2NhbGUsCisgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLCBpbnQgdXNlX2dhaW4sIGludCBmcmFtZSk7CisKKy8qKgorICogXGJyaWVmIEFwcGx5IFRDWCBhbmQgQUxGRCBnYWlucyB0byBGQUMgZGF0YS4KKyAqIFxwYXJhbSBmYWNfZGF0YSBwb2ludGVyIHRvIEZBQyBkYXRhLgorICogXHBhcmFtIGZhY19sZW5ndGggRkFDIGxlbmd0aCAoMTI4IG9yIDk2KS4KKyAqIFxwYXJhbSB0Y3hfZ2FpbiBUQ1ggZ2FpbgorICogXHBhcmFtIGFsZmRfZ2FpbnMgcG9pbnRlciB0byBhbGZkIGdhaW5zLgorICogXHBhcmFtIG1vZCBtb2QgdmFsdWUgKDEsMiwzKSBvZiBUQ1ggZnJhbWUgd2hlcmUgdGhlIEZBQyBzaWduYWwgbmVlZHMgdG8gYmUKKyAqIGFwcGxpZWQuCisgKi8KK3ZvaWQgQ0ZhY19BcHBseUdhaW5zKEZJWFBfREJMIGZhY19kYXRhW0xGQUNdLCBjb25zdCBJTlQgZmFjX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHRjeF9nYWluLCBjb25zdCBGSVhQX0RCTCBhbGZkX2dhaW5zW10sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbW9kKTsKKworLyoqCisgKiBcYnJpZWYgRG8gRkFDIHRyYW5zaXRpb24gZnJvbSBmcmVxdWVuY3kgZG9tYWluIHRvIEFDRUxQIGRvbWFpbi4KKyAqLworSU5UIENMcGRfRkFDX01kY3QyQWNlbHAoSF9NRENUIGhNZGN0LCBGSVhQX0RCTCAqb3V0cHV0LCBGSVhQX0RCTCAqcEZhY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZhY19kYXRhX2UsIEZJWFBfTFBDICpBLCBJTlQgQV9leHAsCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnJPdXRTYW1wbGVzLCBjb25zdCBJTlQgZmFjX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpc0ZkRmFjLCBVQ0hBUiBwcmV2V2luZG93U2hhcGUpOworCisvKioKKyAqIFxicmllZiBEbyBGQUMgdHJhbnNpdGlvbiBmcm9tIEFDRUxQIGRvbWFpbiB0byBmcmVxdWVuY3kgZG9tYWluLgorICogXHBhcmFtIGhNZGN0IE1EQ1QgY29udGV4dC4KKyAqIFxwYXJhbSBvdXRwdXQgcG9pbnRlciBmb3IgdGltZSBkb21haW4gb3V0cHV0LgorICogXHBhcmFtIHBTcGVjIHBvaW50ZXIgdG8gTURDVCBzcGVjdHJ1bSBpbnB1dC4KKyAqIFxwYXJhbSBzcGVjX3NjYWxlIE1EQ1Qgc3BlY3RydW0gZXhwb25lbnRzLgorICogXHBhcmFtIG5TcGVjIGFtb3VudCBvZiBjb250aWd1b3MgTURDVCBzcGVjdHJhLgorICogXHBhcmFtIHBGYWMgcG9pbnRlciB0byBGQUMgTURDVCBkb21haW4gZGF0YS4KKyAqIFxwYXJhbSBmYWNfc2NhbGUgZXhwb25lbnQgb2YgRkFDIGRhdGEuCisgKiBccGFyYW0gZmFjX2xlbmd0aCBsZW5ndGggb2YgRkFDIGRhdGEuCisgKiBccGFyYW0gbnJTYW1wbGVzIHJvb20gaW4gc2FtcGxlcyBpbiBvdXRwdXQgYnVmZmVyLgorICogXHBhcmFtIHRsIE1EQ1QgdHJhbnNmb3JtIGxlbmd0aCBvZiBwU3BlYy4KKyAqIFxwYXJhbSB3cnMgcmlnaHQgTURDVCB3aW5kb3cgc2xvcGUuCisgKiBccGFyYW0gZnIgcmlnaHQgTURDVCB3aW5kb3cgc2xvcGUgbGVuZ3RoLgorICogXHBhcmFtIEEgTFAgZG9tYWluIGZpbHRlciBjb2VmZmljaWVudHMuCisgKiBccGFyYW0gZGVlbXBoX21lbSBkZWVtcGhhc2lzIGZpbHRlciBzdGF0ZS4KKyAqIFxwYXJhbSBnYWluIGdhaW4gdG8gYmUgYXBwbGllZCB0byBGQUMgZGF0YSBiZWZvcmUgb3ZlcmxhcCBhZGQuCisgKiBccGFyYW0gb2xkX3N5bl9tZW0gU3ludGhlc2lzIGZpbHRlciBzdGF0ZS4KKyAqIFxwYXJhbSBpc0ZkRmFjIGluZGljYXRlcyBmYWMgcHJvY2Vzc2luZyBmcm9tIG9yIHRvIEZELgorICogXHBhcmFtIHBGYWNEYXRhIGZhYyBkYXRhIHN0b3JlZCBmb3IgZnVsbGJhbmQgTFBELgorICogXHBhcmFtIGVsRmxhZ3MgZWxlbWVudCBzcGVjaWZpYyBwYXJzZXIgZ3VpZGFuY2UgZmxhZ3MuCisgKiBccGFyYW0gaXNGYWNGb3JGdWxsYmFuZCBpbmRpY2F0ZXMgdGhhdCBmYWMgaXMgcHJvY2Vzc2VkIGZvciBmdWxsYmFuZCBMUEQuCisgKi8KK0lOVCBDTHBkX0ZBQ19BY2VscDJNZGN0KEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKm91dHB1dCwgRklYUF9EQkwgKnBTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgc3BlY19zY2FsZVtdLCBjb25zdCBpbnQgblNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcEZhY19kYXRhLCBjb25zdCBpbnQgZmFjX2RhdGFfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBmYWNfbGVuZ3RoLCBJTlQgbnJTYW1wbGVzLCBjb25zdCBJTlQgdGwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1dUUCAqd3JzLCBjb25zdCBJTlQgZnIsIEZJWFBfTFBDIEFbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UIEFfZXhwLCBDQWNlbHBTdGF0aWNNZW0gKmFjZWxwX21lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGdhaW4sIGNvbnN0IGludCBsYXN0X2ZyYW1lX2xvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXNGZEZhYywgY29uc3QgVUNIQVIgbGFzdF9scGQsIGNvbnN0IGludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN1cnJBbGlhc2luZ1N5bW1ldHJ5KTsKKworI2VuZGlmIC8qIFVTQUNERUNfRkFDX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19scGMuY3BwIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2xwYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxNDYzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19scGMuY3BwCkBAIC0wLDAgKzEsMTE5NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF0dGhpYXMgSGlsZGVuYnJhbmQsIE1hbnVlbCBKYW5kZXIKKworICAgRGVzY3JpcHRpb246IFVTQUMgTFBDL0FWUSBkZWNvZGUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzYWNkZWNfbHBjLmgiCisKKyNpbmNsdWRlICJ1c2FjZGVjX3JvbS5oIgorI2luY2x1ZGUgIkZES190cmlnRmN0cy5oIgorCisjZGVmaW5lIE5RX01BWCAzNgorCisvKgorICogSGVscGVyIGZ1bmN0aW9ucy4KKyAqLworCisvKioKKyAqIFxicmllZiBSZWFkIHVuYXJ5IGNvZGUuCisgKiBccGFyYW0gaEJzIGJpdHN0cmVhbSBoYW5kbGUgYXMgZGF0YSBzb3VyY2UuCisgKiBccmV0dXJuIGRlY29kZWQgdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3ZsY2xiZihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpIHsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgd2hpbGUgKEZES3JlYWRCaXRzKGhCcywgMSkgJiYgcmVzdWx0IDw9IE5RX01BWCkgeworICAgIHJlc3VsdCsrOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogXGJyaWVmIFJlYWQgYml0IGNvdW50IGxpbWl0ZWQgdW5hcnkgY29kZS4KKyAqIFxwYXJhbSBoQnMgYml0c3RyZWFtIGhhbmRsZSBhcyBkYXRhIHNvdXJjZQorICogXHBhcmFtIG4gbWF4IGFtb3VudCBvZiBiaXRzIHRvIGJlIHJlYWQuCisgKiBccmV0dXJuIGRlY29kZWQgdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3ZsY2xiZl9uKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IG4pIHsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgd2hpbGUgKEZES3JlYWRCaXRzKGhCcywgMSkpIHsKKyAgICByZXN1bHQrKzsKKyAgICBuLS07CisgICAgaWYgKG4gPD0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEFsZ2VicmFpYyBWZWN0b3IgUXVhbnRpemVyCisgKi8KKworLyogWkZfU0NBTEUgbXVzdCBiZSBncmVhdGVyIHRoYW4gKG51bWJlciBvZiBGSVhQX1pGKS8yCisgICBiZWNhdXNlIHRoZSBsb3NzIG9mIHByZWNpc2lvbiBjYXVzZWQgYnkgZlBvdzJEaXYyIGluIFJFOF9QUFYoKSAqLworLy8jZGVmaW5lIFpGX1NDQUxFICgoTlFfTUFYLTMpPj4xKQorI2RlZmluZSBaRl9TQ0FMRSAoKERGUkFDVF9CSVRTIC8gMikpCisjZGVmaW5lIEZJWFBfWkYgRklYUF9EQkwKKyNkZWZpbmUgSU5UMlpGKHgsIHMpIChGSVhQX1pGKSgoeCkgPDwgKFpGX1NDQUxFIC0gKHMpKSkKKyNkZWZpbmUgWkYySU5UKHgpIChJTlQpKCh4KSA+PiBaRl9TQ0FMRSkKKworLyogMS4wIGluIFpGIGZvcm1hdCBmb3JtYXQgKi8KKyNkZWZpbmUgT05FWkYgKChGSVhQX1pGKUlOVDJaRigxLCAwKSkKKworLyogc3RhdGljICovCit2b2lkIG5lYXJlc3RfbmVpZ2hib3JfMkQ4KEZJWFBfWkYgeFs4XSwgaW50IHlbOF0pIHsKKyAgRklYUF9aRiBzLCBlbSwgZVs4XTsKKyAgaW50IGksIGosIHN1bTsKKworICAvKiByb3VuZCB4IGludG8gMlpeOCBpLmUuIGNvbXB1dGUgeT0oeTEsLi4uLHk4KSBzdWNoIHRoYXQgeWkgPSAyW3hpLzJdCisgICAgIHdoZXJlIFsuXSBpcyB0aGUgbmVhcmVzdCBpbnRlZ2VyIG9wZXJhdG9yCisgICAgIGluIHRoZSBtZWFuIHRpbWUsIGNvbXB1dGUgc3VtID0geTErLi4uK3k4CisgICovCisgIHN1bSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICBGSVhQX1pGIHRtcDsKKyAgICAvKiByb3VuZCB0byAuLi4sIC0yLCAwLCAyLCAuLi4gKFstMS4uMVsgLS0+IDApICovCisgICAgaWYgKHhbaV0gPCAoRklYUF9aRikwKSB7CisgICAgICB0bXAgPSBPTkVaRiAtIHhbaV07CisgICAgICB5W2ldID0gLTIgKiAoKFpGMklOVCh0bXApKSA+PiAxKTsKKyAgICB9IGVsc2UgeworICAgICAgdG1wID0gT05FWkYgKyB4W2ldOworICAgICAgeVtpXSA9IDIgKiAoKFpGMklOVCh0bXApKSA+PiAxKTsKKyAgICB9CisgICAgc3VtICs9IHlbaV07CisgIH0KKyAgLyogY2hlY2sgaWYgeTErLi4uK3k4IGlzIGEgbXVsdGlwbGUgb2YgNAorICAgICBpZiBub3QsIHkgaXMgbm90IHJvdW5kIHhqIGluIHRoZSB3cm9uZyB3YXkgd2hlcmUgaiBpcyBkZWZpbmVkIGJ5CisgICAgICAgIGogPSBhcmcgbWF4X2kgfCB4aSAteWl8CisgICAgICh0aGlzIGlzIGNhbGxlZCB0aGUgV2FnbmVyIHJ1bGUpCisgICovCisgIGlmIChzdW0gJSA0KSB7CisgICAgLyogZmluZCBqID0gYXJnIG1heF9pIHwgeGkgLXlpfCAqLworICAgIGVtID0gKEZJWFBfU0dMKTA7CisgICAgaiA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgLyogY29tcHV0ZSBlaSA9IHhpLXlpICovCisgICAgICBlW2ldID0geFtpXSAtIElOVDJaRih5W2ldLCAwKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgLyogY29tcHV0ZSB8ZWl8ID0gfCB4aS15aSB8ICovCisgICAgICBpZiAoZVtpXSA8IChGSVhQX1pGKTApIHsKKyAgICAgICAgcyA9IC1lW2ldOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcyA9IGVbaV07CisgICAgICB9CisgICAgICAvKiBjaGVjayBpZiB8ZWl8IGlzIG1heGltYWwsIGlmIHNvLCBzZXQgaj1pICovCisgICAgICBpZiAoZW0gPCBzKSB7CisgICAgICAgIGVtID0gczsKKyAgICAgICAgaiA9IGk7CisgICAgICB9CisgICAgfQorICAgIC8qIHJvdW5kIHhqIGluIHRoZSAid3Jvbmcgd2F5IiAqLworICAgIGlmIChlW2pdIDwgKEZJWFBfWkYpMCkgeworICAgICAgeVtqXSAtPSAyOworICAgIH0gZWxzZSB7CisgICAgICB5W2pdICs9IDI7CisgICAgfQorICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUkU4X1BQVih4LHkpCisgIE5FQVJFU1QgTkVJR0hCT1IgU0VBUkNIIElOIElORklOSVRFIExBVFRJQ0UgUkU4CisgIHRoZSBhbGdvcml0aG0gaXMgYmFzZWQgb24gdGhlIGRlZmluaXRpb24gb2YgUkU4IGFzCisgICAgICBSRTggPSAoMkQ4KSBVICgyRDgrWzEsMSwxLDEsMSwxLDEsMV0pCisgIGl0IGFwcGxpZXMgdGhlIGNvc2V0IGRlY29kaW5nIG9mIFNsb2FuZSBhbmQgQ29ud2F5CisgIChpKSB4OiBwb2ludCBpbiBSXjggaW4gMzItWkZfU0NBTEUuWkZfU0NBTEUgZm9ybWF0CisgIChvKSB5OiBwb2ludCBpbiBSRTggKDgtZGltZW5zaW9uYWwgaW50ZWdlciB2ZWN0b3IpCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworLyogc3RhdGljICovCit2b2lkIFJFOF9QUFYoRklYUF9aRiB4W10sIFNIT1JUIHlbXSwgaW50IHIpIHsKKyAgaW50IGksIHkwWzhdLCB5MVs4XTsKKyAgRklYUF9aRiB4MVs4XSwgdG1wOworICBGSVhQX0RCTCBlOworCisgIC8qIGZpbmQgdGhlIG5lYXJlc3QgbmVpZ2hib3IgeTAgb2YgeCBpbiAyRDggKi8KKyAgbmVhcmVzdF9uZWlnaGJvcl8yRDgoeCwgeTApOworICAvKiBmaW5kIHRoZSBuZWFyZXN0IG5laWdoYm9yIHkxIG9mIHggaW4gMkQ4KygxLC4uLiwxKSAoYnkgY29zZXQgZGVjb2RpbmcpICovCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICB4MVtpXSA9IHhbaV0gLSBPTkVaRjsKKyAgfQorICBuZWFyZXN0X25laWdoYm9yXzJEOCh4MSwgeTEpOworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgeTFbaV0gKz0gMTsKKyAgfQorCisgIC8qIGNvbXB1dGUgZTA9fHx4LXkwfHxeMiBhbmQgZTE9fHx4LXkxfHxeMiAqLworICBlID0gKEZJWFBfREJMKTA7CisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICB0bXAgPSB4W2ldIC0gSU5UMlpGKHkwW2ldLCAwKTsKKyAgICBlICs9IGZQb3cyRGl2MigKKyAgICAgICAgdG1wIDw8IHIpOyAvKiBzaGlmdCBsZWZ0IHRvIGVuc3VyZSB0aGF0IG5vIGZyYWN0IHBhcnQgYml0cyBnZXQgbG9zdC4gKi8KKyAgICB0bXAgPSB4W2ldIC0gSU5UMlpGKHkxW2ldLCAwKTsKKyAgICBlIC09IGZQb3cyRGl2Mih0bXAgPDwgcik7CisgIH0KKyAgLyogc2VsZWN0IGJlc3QgY2FuZGlkYXRlIHkwIG9yIHkxIHRvIG1pbmltaXplIGRpc3RvcnRpb24gKi8KKyAgaWYgKGUgPCAoRklYUF9EQkwpMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgIHlbaV0gPSB5MFtpXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgeVtpXSA9IHkxW2ldOworICAgIH0KKyAgfQorfQorCisvKiB0YWJsZSBsb29rLXVwIG9mIHVuc2lnbmVkIHZhbHVlOiBmaW5kIGkgd2hlcmUgaW5kZXggPj0gdGFibGVbaV0KKyAgIE5vdGU6IHJhbmdlIG11c3QgYmUgPj0gMiwgaW5kZXggbXVzdCBiZSA+PSB0YWJsZVswXSAqLworc3RhdGljIGludCB0YWJsZV9sb29rdXAoY29uc3QgVVNIT1JUICp0YWJsZSwgdW5zaWduZWQgaW50IGluZGV4LCBpbnQgcmFuZ2UpIHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gNDsgaSA8IHJhbmdlOyBpICs9IDQpIHsKKyAgICBpZiAoaW5kZXggPCB0YWJsZVtpXSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChpID4gcmFuZ2UpIHsKKyAgICBpID0gcmFuZ2U7CisgIH0KKworICBpZiAoaW5kZXggPCB0YWJsZVtpIC0gMl0pIHsKKyAgICBpIC09IDI7CisgIH0KKyAgaWYgKGluZGV4IDwgdGFibGVbaSAtIDFdKSB7CisgICAgaS0tOworICB9CisgIGktLTsKKworICByZXR1cm4gKGkpOyAvKiBpbmRleCA+PSB0YWJsZVtpXSAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHJlOF9kZWNvZGVfcmFua19vZl9wZXJtdXRhdGlvbihyYW5rLCB4cywgeCkKKyAgREVDT0RJTkcgT0YgVEhFIFJBTksgT0YgVEhFIFBFUk1VVEFUSU9OIE9GIHhzCisgIChpKSByYW5rOiBpbmRleCAocmFuaykgb2YgYSBwZXJtdXRhdGlvbgorICAoaSkgeHM6ICAgc2lnbmVkIGxlYWRlciBpbiBSRTggKDgtZGltZW5zaW9uYWwgaW50ZWdlciB2ZWN0b3IpCisgIChvKSB4OiAgICBwb2ludCBpbiBSRTggKDgtZGltZW5zaW9uYWwgaW50ZWdlciB2ZWN0b3IpCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyB2b2lkIHJlOF9kZWNvZGVfcmFua19vZl9wZXJtdXRhdGlvbihpbnQgcmFuaywgaW50ICp4cywgU0hPUlQgeFs4XSkgeworICBJTlQgYVs4XSwgd1s4XSwgQiwgZmFjLCBmYWNfQiwgdGFyZ2V0OworICBpbnQgaSwgajsKKworICAvKiAtLS0gcHJlLXByb2Nlc3NpbmcgYmFzZWQgb24gdGhlIHNpZ25lZCBsZWFkZXIgeHMgLS0tCisgICAgIC0gY29tcHV0ZSB0aGUgYWxwaGFiZXQgYT1bYVswXSAuLi4gYVtxLTFdXSBvZiB4IChxIGVsZW1lbnRzKQorICAgICAgIHN1Y2ggdGhhdCBhWzBdIT0uLi4hPWFbcS0xXQorICAgICAgIGl0IGlzIGFzc3VtZWQgdGhhdCB4cyBpcyBzb3J0ZWQgaW4gdGhlIGZvcm0gb2YgYSBzaWduZWQgbGVhZGVyCisgICAgICAgd2hpY2ggY2FuIGJlIHN1bW1hcml6ZWQgaW4gMiByZXF1aXJlbWVudHM6CisgICAgICAgICAgYSkgfHhzWzBdfCA+PSB8eHNbMV18ID49IHx4c1syXXwgPj0gLi4uID49IHx4c1s3XXwKKyAgICAgICAgICBiKSBpZiB8eHNbaV18PXx4c1tpLTFdfCwgeHNbaV0+PXhzW2krMV0KKyAgICAgICB3aGVyZSB8LnwgaW5kaWNhdGVzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvcGVyYXRvcgorICAgICAtIGNvbXB1dGUgcSAodGhlIG51bWJlciBvZiBzeW1ib2xzIGluIHRoZSBhbHBoYWJldCkKKyAgICAgLSBjb21wdXRlIHdbMC4ucS0xXSB3aGVyZSB3W2pdIGNvdW50cyB0aGUgbnVtYmVyIG9mIG9jY3VyZW5jZXMgb2YKKyAgICAgICB0aGUgc3ltYm9sIGFbal0gaW4geHMKKyAgICAgLSBjb21wdXRlIEIgPSBwcm9kX2o9MC4ucS0xICh3W2pdISkgd2hlcmUgLiEgaXMgdGhlIGZhY3RvcmlhbCAqLworICAvKiB4c1tpXSwgeHNbaS0xXSBhbmQgcHRyX3cvYSovCisgIGogPSAwOworICB3W2pdID0gMTsKKyAgYVtqXSA9IHhzWzBdOworICBCID0gMTsKKyAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworICAgIGlmICh4c1tpXSAhPSB4c1tpIC0gMV0pIHsKKyAgICAgIGorKzsKKyAgICAgIHdbal0gPSAxOworICAgICAgYVtqXSA9IHhzW2ldOworICAgIH0gZWxzZSB7CisgICAgICB3W2pdKys7CisgICAgICBCICo9IHdbal07CisgICAgfQorICB9CisKKyAgLyogLS0tIGFjdHVhbCByYW5rIGRlY29kaW5nIC0tLQorICAgICB0aGUgcmFuayBvZiB4ICh3aGVyZSB4IGlzIGEgcGVybXV0YXRpb24gb2YgeHMpIGlzIGJhc2VkIG9uCisgICAgIFNjaGFsa3dpamsncyBmb3JtdWxhCisgICAgIGl0IGlzIGdpdmVuIGJ5IHJhbms9c3VtX3trPTAuLjd9IChBX2sgKiBmYWNfay9CX2spCisgICAgIHRoZSBkZWNvZGluZyBvZiB0aGlzIHJhbmsgaXMgc2VxdWVudGlhbCBhbmQgcmVjb25zdHJ1Y3RzIHhbMC4uN10KKyAgICAgZWxlbWVudCBieSBlbGVtZW50IGZyb20geFswXSB0byB4WzddCisgICAgIFt0aGUgdHJpY2t5IHBhcnQgaXMgdGhlIGluZmVyZW5jZSBvZiBBX2sgZm9yIGVhY2ggay4uLl0KKyAgICovCisKKyAgaWYgKHdbMF0gPT0gOCkgeworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgIHhbaV0gPSBhWzBdOyAvKiBhdm9pZCBmYWMgb2YgNDAzMjAgKi8KKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGFyZ2V0ID0gcmFuayAqIEI7CisgICAgZmFjX0IgPSAxOworICAgIC8qIGRlY29kZSB4IGVsZW1lbnQgYnkgZWxlbWVudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgIGZhYyA9IGZhY19CICogZmRrX2RlY190YWJfZmFjdG9yaWFsW2ldOyAvKiBmYWMgPSAxLi41MDQwICovCisgICAgICBqID0gLTE7CisgICAgICBkbyB7CisgICAgICAgIHRhcmdldCAtPSB3Wysral0gKiBmYWM7CisgICAgICB9IHdoaWxlICh0YXJnZXQgPj0gMCk7IC8qIG1heCBvZiAzMCB0ZXN0cyAvIFNWICovCisgICAgICB4W2ldID0gYVtqXTsKKyAgICAgIC8qIHVwZGF0ZSByYW5rLCBkZW5vbWluYXRvciBCIChCX2spIGFuZCBjb3VudGVyIHdbal0gKi8KKyAgICAgIHRhcmdldCArPSB3W2pdICogZmFjOyAvKiB0YXJnZXQgPSBmYWNfQipCKnJhbmsgKi8KKyAgICAgIGZhY19CICo9IHdbal07CisgICAgICB3W2pdLS07CisgICAgfQorICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgcmU4X2RlY29kZV9iYXNlX2luZGV4KG4sIEksIHkpCisgIERFQ09ESU5HIE9GIEFOIElOREVYIElOIFFuIChuPTAsMiwzIG9yIDQpCisgIChpKSBuOiBjb2RlYm9vayBudW1iZXIgKCpuIGlzIGFuIGludGVnZXIgZGVmaW5lZCBpbiB7MCwyLDMsNH0pCisgIChpKSBJOiBpbmRleCBvZiBjIChwb2ludGVyIHRvIHVuc2lnbmVkIDE2LWJpdCB3b3JkKQorICAobykgeTogcG9pbnQgaW4gUkU4ICg4LWRpbWVuc2lvbmFsIGludGVnZXIgdmVjdG9yKQorICBub3RlOiB0aGUgaW5kZXggSSBpcyBkZWZpbmVkIGFzIGEgMzItYml0IHdvcmQsIGJ1dCBvbmx5CisgIDE2IGJpdHMgYXJlIHJlcXVpcmVkIChsb25nIGNhbiBiZSByZXBsYWNlZCBieSB1bnNpZ25lZCBpbnRlZ2VyKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCByZThfZGVjb2RlX2Jhc2VfaW5kZXgoaW50ICpuLCBVSU5UIGluZGV4LCBTSE9SVCB5WzhdKSB7CisgIGludCBpLCBpbSwgdCwgc2lnbl9jb2RlLCBrYSwga3MsIHJhbmssIGxlYWRlcls4XTsKKworICBpZiAoKm4gPCAyKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgeVtpXSA9IDA7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIGluZGV4ID0gKHVuc2lnbmVkIGludCkqSTsKKyAgICAvKiBzZWFyY2ggZm9yIHRoZSBpZGVudGlmaWVyIGthIG9mIHRoZSBhYnNvbHV0ZSBsZWFkZXIgKHRhYmxlLWxvb2t1cCkKKyAgICAgICBRMiBpcyBhIHN1YnNldCBvZiBRMyAtIHRoZSB0d28gY2FzZXMgYXJlIGNvbnNpZGVyZWQgaW4gdGhlIHNhbWUgYnJhbmNoCisgICAgICovCisgICAgc3dpdGNoICgqbikgeworICAgICAgY2FzZSAyOgorICAgICAgY2FzZSAzOgorICAgICAgICBpID0gdGFibGVfbG9va3VwKGZka19kZWNfSTMsIGluZGV4LCBOQl9MRFEzKTsKKyAgICAgICAga2EgPSBmZGtfZGVjX0EzW2ldOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgaSA9IHRhYmxlX2xvb2t1cChmZGtfZGVjX0k0LCBpbmRleCwgTkJfTERRNCk7CisgICAgICAgIGthID0gZmRrX2RlY19BNFtpXTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIHJlY29uc3RydWN0IHRoZSBhYnNvbHV0ZSBsZWFkZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICBsZWFkZXJbaV0gPSBmZGtfZGVjX0RhW2thXVtpXTsKKyAgICB9CisgICAgLyogc2VhcmNoIGZvciB0aGUgaWRlbnRpZmllciBrcyBvZiB0aGUgc2lnbmVkIGxlYWRlciAodGFibGUgbG9vay11cCkKKyAgICAgICAodGhpcyBzZWFyY2ggaXMgZm9jdXNlZCBiYXNlZCBvbiB0aGUgaWRlbnRpZmllciBrYSBvZiB0aGUgYWJzb2x1dGUKKyAgICAgICAgbGVhZGVyKSovCisgICAgdCA9IGZka19kZWNfSWFba2FdOworICAgIGltID0gZmRrX2RlY19Oc1trYV07CisgICAga3MgPSB0YWJsZV9sb29rdXAoZmRrX2RlY19JcyArIHQsIGluZGV4LCBpbSk7CisKKyAgICAvKiByZWNvbnN0cnVjdCB0aGUgc2lnbmVkIGxlYWRlciBmcm9tIGl0cyBzaWduIGNvZGUgKi8KKyAgICBzaWduX2NvZGUgPSAyICogZmRrX2RlY19Ec1t0ICsga3NdOworICAgIGZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7CisgICAgICBsZWFkZXJbaV0gKj0gKDEgLSAoc2lnbl9jb2RlICYgMikpOworICAgICAgc2lnbl9jb2RlID4+PSAxOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgYW5kIGRlY29kZSB0aGUgcmFuayBvZiB0aGUgcGVybXV0YXRpb24gKi8KKyAgICByYW5rID0gaW5kZXggLSBmZGtfZGVjX0lzW3QgKyBrc107IC8qIHJhbmsgPSBpbmRleCAtIGNhcmRpbmFsaXR5IG9mZnNldCAqLworCisgICAgcmU4X2RlY29kZV9yYW5rX29mX3Blcm11dGF0aW9uKHJhbmssIGxlYWRlciwgeSk7CisgIH0KKyAgcmV0dXJuOworfQorCisvKiByZThfeTJrKHksbSxrKQorICAgVk9ST05PSSBJTkRFWElORyAoSU5ERVggREVDT0RJTkcpIGsgLT4geQorICAgKGkpIGs6IFZvcm9ub2kgaW5kZXgga1swLi43XQorICAgKGkpIG06IFZvcm9ub2kgbW9kdWxvIChtID0gMl5yID0gMTw8ciwgd2hlcmUgciBpcyBpbnRlZ2VyID49MikKKyAgIChpKSByOiBWb3Jvbm9pIG9yZGVyICAobSA9IDJeciA9IDE8PHIsIHdoZXJlIHIgaXMgaW50ZWdlciA+PTIpCisgICAobykgeTogOC1kaW1lbnNpb25hbCBwb2ludCB5WzAuLjddIGluIFJFOAorICovCitzdGF0aWMgdm9pZCByZThfazJ5KGludCAqaywgaW50IHIsIFNIT1JUICp5KSB7CisgIGludCBpLCB0bXAsIHN1bTsKKyAgU0hPUlQgdls4XTsKKyAgRklYUF9aRiB6Zls4XTsKKworICBGREtfQVNTRVJUKHIgPD0gWkZfU0NBTEUpOworCisgIC8qIGNvbXB1dGUgeSA9IGsgTSBhbmQgej0oeS1hKS9tLCB3aGVyZQorICAgICBNID0gWzQgICAgICAgIF0KKyAgICAgICAgIFsyIDIgICAgICBdCisgICAgICAgICBbfCAgIFwgICAgXQorICAgICAgICAgWzIgICAgIDIgIF0KKyAgICAgICAgIFsxIDEgXyAxIDFdCisgICAgIGE9KDIsMCwuLi4sMCkKKyAgICAgbSA9IDE8PHIKKyAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgIHlbaV0gPSBrWzddOworICB9CisgIHpmWzddID0gSU5UMlpGKHlbN10sIHIpOworICBzdW0gPSAwOworICBmb3IgKGkgPSA2OyBpID49IDE7IGktLSkgeworICAgIHRtcCA9IDIgKiBrW2ldOworICAgIHN1bSArPSB0bXA7CisgICAgeVtpXSArPSB0bXA7CisgICAgemZbaV0gPSBJTlQyWkYoeVtpXSwgcik7CisgIH0KKyAgeVswXSArPSAoNCAqIGtbMF0gKyBzdW0pOworICB6ZlswXSA9IElOVDJaRih5WzBdIC0gMiwgcik7CisgIC8qIGZpbmQgbmVhcmVzdCBuZWlnaGJvciB2IG9mIHogaW4gaW5maW5pdGUgUkU4ICovCisgIFJFOF9QUFYoemYsIHYsIHIpOworICAvKiBjb21wdXRlIHkgLT0gbSB2ICovCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICB5W2ldIC09IChTSE9SVCkodltpXSA8PCByKTsKKyAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJFOF9kZWMobiwgSSwgaywgeSkKKyAgTVVMVEktUkFURSBJTkRFWElORyBPRiBBIFBPSU5UIHkgaW4gVEhFIExBVFRJQ0UgUkU4IChJTkRFWCBERUNPRElORykKKyAgKGkpIG46IGNvZGVib29rIG51bWJlciAoKm4gaXMgYW4gaW50ZWdlciBkZWZpbmVkIGluIHswLDIsMyw0LC4uLG5fbWF4fSkuIG5fbWF4CisgID0gMzYgKGkpIEk6IGluZGV4IG9mIGMgKHBvaW50ZXIgdG8gdW5zaWduZWQgMTYtYml0IHdvcmQpIChpKSBrOiBpbmRleCBvZiB2CisgICg4LWRpbWVuc2lvbmFsIHZlY3RvciBvZiBiaW5hcnkgaW5kaWNlcykgPSBWb3Jvbm9pIGluZGV4IChvKSB5OiBwb2ludCBpbiBSRTgKKyAgKDgtZGltZW5zaW9uYWwgaW50ZWdlciB2ZWN0b3IpIG5vdGU6IHRoZSBpbmRleCBJIGlzIGRlZmluZWQgYXMgYSAzMi1iaXQgd29yZCwKKyAgYnV0IG9ubHkgMTYgYml0cyBhcmUgcmVxdWlyZWQgKGxvbmcgY2FuIGJlIHJlcGxhY2VkIGJ5IHVuc2lnbmVkIGludGVnZXIpCisKKyAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgUkU4X2RlYyhpbnQgbiwgaW50IEksIGludCAqaywgRklYUF9EQkwgKnkpIHsKKyAgU0hPUlQgdls4XTsKKyAgU0hPUlQgX3lbOF07CisgIFVJTlQgcjsKKyAgaW50IGk7CisKKyAgLyogQ2hlY2sgYm91bmQgb2YgY29kZWJvb2sgcW4gKi8KKyAgaWYgKG4gPiBOUV9NQVgpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBkZWNvZGUgdGhlIHN1Yi1pbmRpY2VzIEkgYW5kIGt2W10gYWNjb3JkaW5nIHRvIHRoZSBjb2RlYm9vayBudW1iZXIgbjoKKyAgICAgaWYgbj0wLDIsMyw0LCBkZWNvZGUgSSAobm8gVm9yb25vaSBleHRlbnNpb24pCisgICAgIGlmIG4+NCwgVm9yb25vaSBleHRlbnNpb24gaXMgdXNlZCwgZGVjb2RlIEkgYW5kIGt2W10gKi8KKyAgaWYgKG4gPD0gNCkgeworICAgIHJlOF9kZWNvZGVfYmFzZV9pbmRleCgmbiwgSSwgX3kpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgIHlbaV0gPSAoTE9ORylfeVtpXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogY29tcHV0ZSB0aGUgVm9yb25vaSBtb2R1bG8gbSA9IDJeciB3aGVyZSByIGlzIGV4dGVuc2lvbiBvcmRlciAqLworICAgIHIgPSAoKG4gLSAzKSA+PiAxKTsKKworICAgIHdoaWxlIChuID4gNCkgeworICAgICAgbiAtPSAyOworICAgIH0KKyAgICAvKiBkZWNvZGUgYmFzZSBjb2RlYm9vayBpbmRleCBJIGludG8gYyAoYyBpcyBhbiBlbGVtZW50IG9mIFEzIG9yIFE0KQorICAgICAgIFtoZXJlIGMgaXMgc3RvcmVkIGluIHkgdG8gc2F2ZSBtZW1vcnldICovCisgICAgcmU4X2RlY29kZV9iYXNlX2luZGV4KCZuLCBJLCBfeSk7CisgICAgLyogZGVjb2RlIFZvcm9ub2kgaW5kZXgga1tdIGludG8gdiAqLworICAgIHJlOF9rMnkoaywgciwgdik7CisgICAgLyogcmVjb25zdHJ1Y3QgeSBhcyB5ID0gbSBjICsgdiAod2l0aCBtPTJeciwgciBpbnRlZ2VyID49MSkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICB5W2ldID0gKExPTkcpKChfeVtpXSA8PCByKSArIHZbaV0pOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc3RhcnQgTFBDIGRlY29kZSBzdHVmZiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8jZGVmaW5lIE0gICAgICAgICAxNgorI2RlZmluZSBGUkVRX01BWCA2NDAwLjBmCisjZGVmaW5lIEZSRVFfRElWIDQwMC4wZgorI2RlZmluZSBMU0ZfR0FQIDUwLjBmCisKKy8qKgorICogXGJyaWVmIGNhbGN1bGF0ZSBpbnZlcnNlIHdlaWdodGluZyBmYWN0b3IgYW5kIGFkZCBub24td2VpZ2h0ZWQgcmVzaWR1YWwKKyAqICAgICAgICBMU0YgdmVjdG9yIHRvIGZpcnN0IHN0YWdlIExTRiBhcHByb3hpbWF0aW9uCisgKiBccGFyYW0gbHNmcSBmaXJzdCBzdGFnZSBMU0YgYXBwcm94aW1hdGlvbiB2YWx1ZXMuCisgKiBccGFyYW0geHEgd2VpZ2h0ZWQgcmVzaWR1YWwgTFNGIHZlY3RvcgorICogXHBhcmFtIG5rX21vZGUgY29kZSBib29rIG51bWJlciBjb2RpbmcgbW9kZS4KKyAqLworc3RhdGljIHZvaWQgbHNmX3dlaWdodF8yc3QoRklYUF9MUEMgKmxzZnEsIEZJWFBfREJMICp4cSwgaW50IG5rX21vZGUpIHsKKyAgRklYUF9MUEMgZFtNX0xQX0ZJTFRFUl9PUkRFUiArIDFdOworICBGSVhQX1NHTCBmYWN0b3I7CisgIExPTkcgdzsgLyogaW52ZXJzZSB3ZWlnaHQgZmFjdG9yICovCisgIGludCBpOworCisgIC8qIGNvbXB1dGUgbHNmIGRpc3RhbmNlICovCisgIGRbMF0gPSBsc2ZxWzBdOworICBkW01fTFBfRklMVEVSX09SREVSXSA9CisgICAgICBGTDJGWENPTlNUX0xQQyhGUkVRX01BWCAvICgxIDw8IExTRl9TQ0FMRSkpIC0gbHNmcVtNX0xQX0ZJTFRFUl9PUkRFUiAtIDFdOworICBmb3IgKGkgPSAxOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgIGRbaV0gPSBsc2ZxW2ldIC0gbHNmcVtpIC0gMV07CisgIH0KKworICBzd2l0Y2ggKG5rX21vZGUpIHsKKyAgICBjYXNlIDA6CisgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX1NHTCgyLjBmICogNjAuMGYgLyBGUkVRX0RJVik7CisgICAgICBicmVhazsgLyogYWJzICovCisgICAgY2FzZSAxOgorICAgICAgZmFjdG9yID0gRkwyRlhDT05TVF9TR0woMi4wZiAqIDY1LjBmIC8gRlJFUV9ESVYpOworICAgICAgYnJlYWs7IC8qIG1pZCAqLworICAgIGNhc2UgMjoKKyAgICAgIGZhY3RvciA9IEZMMkZYQ09OU1RfU0dMKDIuMGYgKiA2NC4wZiAvIEZSRVFfRElWKTsKKyAgICAgIGJyZWFrOyAvKiByZWwxICovCisgICAgZGVmYXVsdDoKKyAgICAgIGZhY3RvciA9IEZMMkZYQ09OU1RfU0dMKDIuMGYgKiA2My4wZiAvIEZSRVFfRElWKTsKKyAgICAgIGJyZWFrOyAvKiByZWwyICovCisgIH0KKyAgLyogYWRkIG5vbi13ZWlnaHRlZCByZXNpZHVhbCBMU0YgdmVjdG9yIHRvIExTRjFzdCAqLworICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgIHcgPSAoTE9ORylmTXVsdERpdjIoZmFjdG9yLCBzcXJ0Rml4cChmTXVsdChkW2ldLCBkW2kgKyAxXSkpKTsKKyAgICBsc2ZxW2ldID0gZkFkZFNhdHVyYXRlKGxzZnFbaV0sIEZYX0RCTDJGWF9MUEMoKEZJWFBfREJMKSh3ICogKExPTkcpeHFbaV0pKSk7CisgIH0KKworICByZXR1cm47Cit9CisKKy8qKgorICogXGJyaWVmIGRlY29kZSBucW4gYW1vdW50IG9mIGNvZGUgYm9vayBudW1iZXJzLiBUaGVzZSB2YWx1ZXMgZGV0ZXJtaW5lIHRoZQorICogYW1vdW50IG9mIGZvbGxvd2luZyBiaXRzIGZvciBucW4gQVZRIFJFOCB2ZWN0b3JzLgorICogXHBhcmFtIG5rX21vZGUgcXVhbnRpemF0aW9uIG1vZGUuCisgKiBccGFyYW0gbnFuIGFtb3VudCBjb2RlIGJvb2sgbnVtYmVyIHRvIHJlYWQuCisgKiBccGFyYW0gcW4gcG9pbnRlciB0byBvdXRwdXQgYnVmZmVyIHRvIGhvbGQgZGVjb2RlZCBjb2RlIGJvb2sgbnVtYmVycyBxbi4KKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX3FuKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IG5rX21vZGUsIGludCBucW4sCisgICAgICAgICAgICAgICAgICAgICAgaW50IHFuW10pIHsKKyAgaW50IG47CisKKyAgaWYgKG5rX21vZGUgPT0gMSkgeyAvKiBuayBtb2RlIDEgKi8KKyAgICAvKiBVbmFyeSBjb2RlIGZvciBtaWQgTFBDMS9MUEMzICovCisgICAgLyogUTA9MCwgUTI9MTAsIFEzPTExMCwgLi4uICovCisgICAgZm9yIChuID0gMDsgbiA8IG5xbjsgbisrKSB7CisgICAgICBxbltuXSA9IGdldF92bGNsYmYoaEJzKTsKKyAgICAgIGlmIChxbltuXSA+IDApIHsKKyAgICAgICAgcW5bbl0rKzsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7IC8qIG5rX21vZGUgMCwgMyBhbmQgMiAqLworICAgIC8qIDIgYml0cyB0byBzcGVjaWZ5IFEyLFEzLFE0LGV4dCAqLworICAgIGZvciAobiA9IDA7IG4gPCBucW47IG4rKykgeworICAgICAgcW5bbl0gPSAyICsgRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICB9CisgICAgaWYgKG5rX21vZGUgPT0gMikgeworICAgICAgLyogVW5hcnkgY29kZSBmb3IgcmVsIExQQzEvTFBDMyAqLworICAgICAgLyogUTAgPSAwLCBRNT0xMCwgUTY9MTEwLCAuLi4gKi8KKyAgICAgIGZvciAobiA9IDA7IG4gPCBucW47IG4rKykgeworICAgICAgICBpZiAocW5bbl0gPiA0KSB7CisgICAgICAgICAgcW5bbl0gPSBnZXRfdmxjbGJmKGhCcyk7CisgICAgICAgICAgaWYgKHFuW25dID4gMCkgcW5bbl0gKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7IC8qIG5rX21vZGUgPT0gKDAgYW5kIDMpICovCisgICAgICAvKiBVbmFyeSBjb2RlIGZvciBhYnMgYW5kIHJlbCBMUEMwL0xQQzIgKi8KKyAgICAgIC8qIFE1ID0gMCwgUTY9MTAsIFEwPTExMCwgUTc9MTExMCwgLi4uICovCisgICAgICBmb3IgKG4gPSAwOyBuIDwgbnFuOyBuKyspIHsKKyAgICAgICAgaWYgKHFuW25dID4gNCkgeworICAgICAgICAgIHFuW25dID0gZ2V0X3ZsY2xiZihoQnMpOworICAgICAgICAgIHN3aXRjaCAocW5bbl0pIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgcW5bbl0gPSA1OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgcW5bbl0gPSA2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgcW5bbl0gPSAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHFuW25dICs9IDQ7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAqIFxicmllZiByZW9yZGVyIExTRiBjb2VmZmljaWVudHMgdG8gbWluaW11bSBkaXN0YW5jZS4KKyAqIFxwYXJhbSBsc2YgcG9pbnRlciB0byBidWZmZXIgY29udGFpbmluZyBMU0YgY29lZmZpY2llbnRzIGFuZCB3aGVyZSByZW9yZGVyZWQKKyAqIExTRiBjb2VmZmljaWVudHMgd2lsbCBiZSBzdG9yZWQgaW50bywgc2NhbGVkIGJ5IExTRl9TQ0FMRS4KKyAqIFxwYXJhbSBtaW5fZGlzdCBtaW4gZGlzdGFuY2Ugc2NhbGVkIGJ5IExTRl9TQ0FMRQorICogXHBhcmFtIG4gbnVtYmVyIG9mIExTRi9MU1AgY29lZmZpY2llbnRzLgorICovCitzdGF0aWMgdm9pZCByZW9yZGVyX2xzZihGSVhQX0xQQyAqbHNmLCBGSVhQX0xQQyBtaW5fZGlzdCwgaW50IG4pIHsKKyAgRklYUF9MUEMgbHNmX21pbjsKKyAgaW50IGk7CisKKyAgbHNmX21pbiA9IG1pbl9kaXN0OworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgaWYgKGxzZltpXSA8IGxzZl9taW4pIHsKKyAgICAgIGxzZltpXSA9IGxzZl9taW47CisgICAgfQorICAgIGxzZl9taW4gPSBmQWRkU2F0dXJhdGUobHNmW2ldLCBtaW5fZGlzdCk7CisgIH0KKworICAvKiByZXZlcnNlICovCisgIGxzZl9taW4gPSBGTDJGWENPTlNUX0xQQyhGUkVRX01BWCAvICgxIDw8IExTRl9TQ0FMRSkpIC0gbWluX2Rpc3Q7CisgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IGktLSkgeworICAgIGlmIChsc2ZbaV0gPiBsc2ZfbWluKSB7CisgICAgICBsc2ZbaV0gPSBsc2ZfbWluOworICAgIH0KKworICAgIGxzZl9taW4gPSBsc2ZbaV0gLSBtaW5fZGlzdDsKKyAgfQorfQorCisvKioKKyAqIFxicmllZiBGaXJzdCBzdGFnZSBhcHByb3hpbWF0aW9uCisgKiBccGFyYW0gaEJzIGJpdHN0cmVhbSBoYW5kbGUgYXMgZGF0YSBzb3VyY2UKKyAqIFxwYXJhbSBsc2ZxIHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlciB0byBob2xkIExQQyBjb2VmZmljaWVudHMgc2NhbGVkIGJ5CisgKiBMU0ZfU0NBTEUuCisgKi8KK3N0YXRpYyB2b2lkIHZscGNfMXN0X2RlYygKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIC8qIGlucHV0OiAgY29kZWJvb2sgaW5kZXggICAgICAgICAgICAgICAgICAqLworICAgIEZJWFBfTFBDICpsc2ZxICAgICAgICAgICAgLyogaS9vOiAgICBpOnByZWRpY3Rpb24gICBvOnF1YW50aXplZCBsc2YgICovCispIHsKKyAgY29uc3QgRklYUF9MUEMgKnBfZGljbzsKKyAgaW50IGksIGluZGV4OworCisgIGluZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKKyAgcF9kaWNvID0gJmZka19kZWNfZGljb19sc2ZfYWJzXzhiW2luZGV4ICogTV9MUF9GSUxURVJfT1JERVJdOworICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgIGxzZnFbaV0gPSBwX2RpY29baV07CisgIH0KK30KKworLyoqCisgKiBcYnJpZWYgRG8gZmlyc3Qgc3RhZ2UgYXBwcm94aW1hdGlvbiB3ZWlnaHRpbmcgYW5kIG11bHRpcGx5IHdpdGggQVZRCisgKiByZWZpbmVtZW50LgorICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlIGRhdGEgc3NvdXJjZS4KKyAqIFxwYXJhbSBsc2ZxIGJ1ZmZlciBob2xkaW5nIDFzdCBzdGFnZSBhcHByb3gsIDJuZCBzdGFnZSBhcHByb3ggaXMgYWRkZWQgdG8KKyAqIHRoaXMgdmFsdWVzLgorICogXHBhcmFtIG5rX21vZGUgcXVhbnRpemF0aW9uIG1vZGUuCisgKiBccmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgdmxwY18yc3RfZGVjKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICBGSVhQX0xQQyAqbHNmcSwgLyogaS9vOiAgICBpOjFzdCBzdGFnZSAgIG86MXN0KzJuZCBzdGFnZSAgICovCisgICAgaW50IG5rX21vZGUgICAgIC8qIGlucHV0OiAgMD1hYnMsID4wPXJlbCAgICAgICAgICAgICAgICAgICAqLworKSB7CisgIGludCBlcnI7CisgIEZJWFBfREJMIHhxW01fTFBfRklMVEVSX09SREVSXTsgLyogd2VpZ2h0ZWQgcmVzaWR1YWwgTFNGIHZlY3RvciAqLworCisgIC8qIERlY29kZSBBVlEgcmVmaW5lbWVudCAqLworICB7IGVyciA9IENMcGNfRGVjb2RlQVZRKGhCcywgeHEsIG5rX21vZGUsIDIsIDgpOyB9CisgIGlmIChlcnIgIT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGFkZCBub24td2VpZ2h0ZWQgcmVzaWR1YWwgTFNGIHZlY3RvciB0byBMU0Yxc3QgKi8KKyAgbHNmX3dlaWdodF8yc3QobHNmcSwgeHEsIG5rX21vZGUpOworCisgIC8qIHJlb3JkZXIgKi8KKyAgcmVvcmRlcl9sc2YobHNmcSwgRkwyRlhDT05TVF9MUEMoTFNGX0dBUCAvICgxIDw8IExTRl9TQ0FMRSkpLAorICAgICAgICAgICAgICBNX0xQX0ZJTFRFUl9PUkRFUik7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFeHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb25zCisgKi8KKworaW50IENMcGNfRGVjb2RlQVZRKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgRklYUF9EQkwgKnBPdXRwdXQsIGludCBua19tb2RlLAorICAgICAgICAgICAgICAgICAgIGludCBub19xbiwgaW50IGxlbmd0aCkgeworICBpbnQgaSwgbDsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDggKiBub19xbikgeworICAgIGludCBxblsyXSwgbmssIG4sIEk7CisgICAgaW50IGt2WzhdID0gezB9OworCisgICAgZGVjb2RlX3FuKGhCcywgbmtfbW9kZSwgbm9fcW4sIHFuKTsKKworICAgIGZvciAobCA9IDA7IGwgPCBub19xbjsgbCsrKSB7CisgICAgICBpZiAocW5bbF0gPT0gMCkgeworICAgICAgICBGREttZW1jbGVhcigmcE91dHB1dFtpICsgbCAqIDhdLCA4ICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICB9CisKKyAgICAgIC8qIFZvcm9ub2kgZXh0ZW5zaW9uIG9yZGVyICggbmsgKSAqLworICAgICAgbmsgPSAwOworICAgICAgbiA9IHFuW2xdOworICAgICAgaWYgKHFuW2xdID4gNCkgeworICAgICAgICBuayA9IChxbltsXSAtIDMpID4+IDE7CisgICAgICAgIG4gPSBxbltsXSAtIG5rICogMjsKKyAgICAgIH0KKworICAgICAgLyogQmFzZSBjb2RlYm9vayBpbmRleCwgaW4gcmV2ZXJzZSBiaXQgZ3JvdXAgb3JkZXIgKCEpICovCisgICAgICBJID0gRkRLcmVhZEJpdHMoaEJzLCA0ICogbik7CisKKyAgICAgIGlmIChuayA+IDApIHsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgICAgIGt2W2pdID0gRkRLcmVhZEJpdHMoaEJzLCBuayk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKFJFOF9kZWMocW5bbF0sIEksIGt2LCAmcE91dHB1dFtpICsgbCAqIDhdKSAhPSAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBDTHBjX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBGSVhQX0xQQyBsc3BbXVtNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgIEZJWFBfTFBDIGxwYzRfbHNmW01fTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgICAgRklYUF9MUEMgbHNmX2FkYXB0aXZlX21lYW5fY2FuZFtNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgIEZJWFBfU0dMIHBTdGFiaWxpdHlbXSwgVUNIQVIgKm1vZCwgaW50IGZpcnN0X2xwZF9mbGFnLAorICAgICAgICAgICAgICBpbnQgbGFzdF9scGNfbG9zdCwgaW50IGxhc3RfZnJhbWVfb2spIHsKKyAgaW50IGksIGssIGVycjsKKyAgaW50IG1vZGVfbHBjX2JpbiA9IDA7IC8qIG1vZGVfbHBjIGJpdHN0cmVhbSByZXByZXNlbnRhdGlvbiAqLworICBpbnQgbHBjX3ByZXNlbnRbNV0gPSB7MCwgMCwgMCwgMCwgMH07CisgIGludCBscGMwX2F2YWlsYWJsZSA9IDE7CisgIGludCBzID0gMDsKKyAgaW50IGwgPSAzOworICBjb25zdCBpbnQgbmJEaXYgPSBOQl9ESVY7CisKKyAgbHBjX3ByZXNlbnRbNCA+PiBzXSA9IDE7IC8qIExQQzQgKi8KKworICAvKiBEZWNvZGUgTFBDIGZpbHRlcnMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogTFBDIDQsMCwyLDEsMyAqLworCisgIC8qKiogRGVjb2RlIExQQzQgKioqLworICB2bHBjXzFzdF9kZWMoaEJzLCBsc3BbNCA+PiBzXSk7CisgIGVyciA9IHZscGNfMnN0X2RlYyhoQnMsIGxzcFs0ID4+IHNdLCAwKTsgLyogbmtfbW9kZSA9IDAgKi8KKyAgaWYgKGVyciAhPSAwKSB7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIC8qKiogRGVjb2RlIExQQzAgYW5kIExQQzIgKioqLworICBrID0gMDsKKyAgaWYgKCFmaXJzdF9scGRfZmxhZykgeworICAgIGxwY19wcmVzZW50WzBdID0gMTsKKyAgICBscGMwX2F2YWlsYWJsZSA9ICFsYXN0X2xwY19sb3N0OworICAgIC8qIG9sZCBMUEM0IGlzIG5ldyBMUEMwICovCisgICAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgIGxzcFswXVtpXSA9IGxwYzRfbHNmW2ldOworICAgIH0KKyAgICAvKiBza2lwIExQQzAgYW5kIGNvbnRpbnVlIHdpdGggTFBDMiAqLworICAgIGsgPSAyOworICB9CisKKyAgZm9yICg7IGsgPCBsOyBrICs9IDIpIHsKKyAgICBpbnQgbmtfbW9kZSA9IDA7CisKKyAgICBpZiAoKGsgPT0gMikgJiYgKG1vZFswXSA9PSAzKSkgeworICAgICAgYnJlYWs7IC8qIHNraXAgTFBDMiAqLworICAgIH0KKworICAgIGxwY19wcmVzZW50W2sgPj4gc10gPSAxOworCisgICAgbW9kZV9scGNfYmluID0gRkRLcmVhZEJpdChoQnMpOworCisgICAgaWYgKG1vZGVfbHBjX2JpbiA9PSAwKSB7CisgICAgICAvKiBMUEMwL0xQQzI6IEFicyAqLworICAgICAgdmxwY18xc3RfZGVjKGhCcywgbHNwW2sgPj4gc10pOworICAgIH0gZWxzZSB7CisgICAgICAvKiBMUEMwL0xQQzI6IFJlbFIgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgICAgIGxzcFtrID4+IHNdW2ldID0gbHNwWzQgPj4gc11baV07CisgICAgICB9CisgICAgICBua19tb2RlID0gMzsKKyAgICB9CisKKyAgICBlcnIgPSB2bHBjXzJzdF9kZWMoaEJzLCBsc3BbayA+PiBzXSwgbmtfbW9kZSk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgfQorCisgIC8qKiogRGVjb2RlIExQQzEgKioqLworICBpZiAobW9kWzBdIDwgMikgeyAvKiBlbHNlOiBza2lwIExQQzEgKi8KKyAgICBscGNfcHJlc2VudFsxXSA9IDE7CisgICAgbW9kZV9scGNfYmluID0gZ2V0X3ZsY2xiZl9uKGhCcywgMik7CisKKyAgICBzd2l0Y2ggKG1vZGVfbHBjX2JpbikgeworICAgICAgY2FzZSAxOgorICAgICAgICAvKiBMUEMxOiBhYnMgKi8KKyAgICAgICAgdmxwY18xc3RfZGVjKGhCcywgbHNwWzFdKTsKKyAgICAgICAgZXJyID0gdmxwY18yc3RfZGVjKGhCcywgbHNwWzFdLCAwKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgLyogTFBDMTogbWlkMCAobm8gc2Vjb25kIHN0YWdlIEFWUSBxdWFudGl6ZXIgaW4gdGhpcyBjYXNlKSAqLworICAgICAgICBpZiAobHBjMF9hdmFpbGFibGUpIHsgLyogTFBDMC9sc2ZbMF0gbWlnaHQgYmUgemVybyBzb21lIHRpbWVzICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgICAgICAgIGxzcFsxXVtpXSA9IChsc3BbMF1baV0gPj4gMSkgKyAobHNwWzJdW2ldID4+IDEpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgICAgICAgICAgbHNwWzFdW2ldID0gbHNwWzJdW2ldOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgLyogTFBDMTogUmVsUiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgICAgICAgIGxzcFsxXVtpXSA9IGxzcFsyXVtpXTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSB2bHBjXzJzdF9kZWMoaEJzLCBsc3BbMV0sIDIgPDwgcyk7CisgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyoqKiBEZWNvZGUgTFBDMyAqKiovCisgIGlmICgobW9kWzJdIDwgMikpIHsgLyogZWxzZTogc2tpcCBMUEMzICovCisgICAgaW50IG5rX21vZGUgPSAwOworICAgIGxwY19wcmVzZW50WzNdID0gMTsKKworICAgIG1vZGVfbHBjX2JpbiA9IGdldF92bGNsYmZfbihoQnMsIDMpOworCisgICAgc3dpdGNoIChtb2RlX2xwY19iaW4pIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgLyogTFBDMzogYWJzICovCisgICAgICAgIHZscGNfMXN0X2RlYyhoQnMsIGxzcFszXSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAwOgorICAgICAgICAvKiBMUEMzOiBtaWQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgICAgICBsc3BbM11baV0gPSAobHNwWzJdW2ldID4+IDEpICsgKGxzcFs0XVtpXSA+PiAxKTsKKyAgICAgICAgfQorICAgICAgICBua19tb2RlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIC8qIExQQzM6IHJlbEwgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgICAgICBsc3BbM11baV0gPSBsc3BbMl1baV07CisgICAgICAgIH0KKyAgICAgICAgbmtfbW9kZSA9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICAvKiBMUEMzOiByZWxSICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgICAgICAgbHNwWzNdW2ldID0gbHNwWzRdW2ldOworICAgICAgICB9CisgICAgICAgIG5rX21vZGUgPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZXJyID0gdmxwY18yc3RfZGVjKGhCcywgbHNwWzNdLCBua19tb2RlKTsKKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICB9CisKKyAgaWYgKCFscGMwX2F2YWlsYWJsZSAmJiAhbGFzdF9mcmFtZV9vaykgeworICAgIC8qIExQQygwKSB3YXMgbG9zdC4gVXNlIG5leHQgYXZhaWxhYmxlIExQQyhrKSBpbnN0ZWFkICovCisgICAgZm9yIChrID0gMTsgayA8IChuYkRpdiArIDEpOyBrKyspIHsKKyAgICAgIGlmIChscGNfcHJlc2VudFtrXSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworI2RlZmluZSBMU0ZfSU5JVF9USUxUICgwLjI1ZikKKyAgICAgICAgICBpZiAobW9kWzBdID4gMCkgeworICAgICAgICAgICAgbHNwWzBdW2ldID0gRlhfREJMMkZYX0xQQygKKyAgICAgICAgICAgICAgICBmTXVsdChsc3Bba11baV0sIEZMMkZYQ09OU1RfU0dMKDEuMGYgLSBMU0ZfSU5JVF9USUxUKSkgKworICAgICAgICAgICAgICAgIGZNdWx0KGZka19kZWNfbHNmX2luaXRbaV0sIEZMMkZYQ09OU1RfU0dMKExTRl9JTklUX1RJTFQpKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxzcFswXVtpXSA9IGxzcFtrXVtpXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICBscGM0X2xzZltpXSA9IGxzcFs0ID4+IHNdW2ldOworICB9CisKKyAgeworICAgIEZJWFBfREJMIGRpdkZhYzsKKyAgICBpbnQgbGFzdCwgbnVtTHBjID0gMDsKKworICAgIGkgPSBuYkRpdjsKKyAgICBkbyB7CisgICAgICBudW1McGMgKz0gbHBjX3ByZXNlbnRbaS0tXTsKKyAgICB9IHdoaWxlIChpID49IDAgJiYgbnVtTHBjIDwgMyk7CisKKyAgICBsYXN0ID0gaTsKKworICAgIHN3aXRjaCAobnVtTHBjKSB7CisgICAgICBjYXNlIDM6CisgICAgICAgIGRpdkZhYyA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAzLjBmKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGRpdkZhYyA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAyLjBmKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBkaXZGYWMgPSBGTDJGWENPTlNUX0RCTCgxLjBmKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogZ2V0IHRoZSBhZGFwdGl2ZSBtZWFuIGZvciB0aGUgbmV4dCAoYmFkKSBmcmFtZSAqLworICAgIGZvciAoayA9IDA7IGsgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaysrKSB7CisgICAgICBGSVhQX0RCTCB0bXAgPSAoRklYUF9EQkwpMDsKKyAgICAgIGZvciAoaSA9IG5iRGl2OyBpID4gbGFzdDsgaS0tKSB7CisgICAgICAgIGlmIChscGNfcHJlc2VudFtpXSkgeworICAgICAgICAgIHRtcCA9IGZNdWx0QWRkKHRtcCA+PiAxLCBsc3BbaV1ba10sIGRpdkZhYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxzZl9hZGFwdGl2ZV9tZWFuX2NhbmRba10gPSBGWF9EQkwyRlhfTFBDKHRtcCk7CisgICAgfQorICB9CisKKyAgLyogY2FsY3VsYXRlIHN0YWJpbGl0eSBmYWN0b3IgVGhldGEuIE5lZWRlZCBmb3IgQUNFTFAgZGVjb2RlciBhbmQgY29uY2VhbG1lbnQKKyAgICovCisgIHsKKyAgICBGSVhQX0xQQyAqbHNmX3ByZXYsICpsc2ZfY3VycjsKKyAgICBrID0gMDsKKworICAgIEZES19BU1NFUlQobHBjX3ByZXNlbnRbMF0gPT0gMSAmJiBscGNfcHJlc2VudFs0ID4+IHNdID09IDEpOworICAgIGxzZl9wcmV2ID0gbHNwWzBdOworICAgIGZvciAoaSA9IDE7IGkgPCAobmJEaXYgKyAxKTsgaSsrKSB7CisgICAgICBpZiAobHBjX3ByZXNlbnRbaV0pIHsKKyAgICAgICAgRklYUF9EQkwgdG1wID0gKEZJWFBfREJMKTA7CisgICAgICAgIGludCBqOworICAgICAgICBsc2ZfY3VyciA9IGxzcFtpXTsKKworICAgICAgICAvKiBzdW0gPSB0bXAgKiAyXihMU0ZfU0NBTEUqMiArIDQpICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaisrKSB7CisgICAgICAgICAgdG1wICs9IGZQb3cyRGl2MigoRklYUF9TR0wpKGxzZl9jdXJyW2pdIC0gbHNmX3ByZXZbal0pKSA+PiAzOworICAgICAgICB9CisKKyAgICAgICAgLyogdG1wID0gKGZsb2F0KShGTDJGWENPTlNUX0RCTCgxLjI1ZikgLSBmTXVsdCh0bXAsCisgICAgICAgICAqIEZMMkZYQ09OU1RfREJMKDEvNDAwMDAwLjBmKSkpOyAqLworICAgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgxLjI1ZiAvICgxIDw8IExTRl9TQ0FMRSkpIC0KKyAgICAgICAgICAgICAgZk11bHQodG1wLCBGTDJGWENPTlNUX0RCTCgoMSA8PCAoTFNGX1NDQUxFICsgNCkpIC8gNDAwMDAwLjBmKSk7CisgICAgICAgIGlmICh0bXAgPj0gRkwyRlhDT05TVF9EQkwoMS4wZiAvICgxIDw8IExTRl9TQ0FMRSkpKSB7CisgICAgICAgICAgcFN0YWJpbGl0eVtrXSA9IEZMMkZYQ09OU1RfU0dMKDEuMGYgLyAyLjBmKTsKKyAgICAgICAgfSBlbHNlIGlmICh0bXAgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICAgIHBTdGFiaWxpdHlba10gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwU3RhYmlsaXR5W2tdID0gRlhfREJMMkZYX1NHTCh0bXAgPDwgKExTRl9TQ0FMRSAtIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxzZl9wcmV2ID0gbHNmX2N1cnI7CisgICAgICAgIGsgPSBpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTWFyayBzdGFiaWxpdHkgdmFsdWUgYXMgdW5kZWZpbmVkLiAqLworICAgICAgICBwU3RhYmlsaXR5W2ldID0gKEZJWFBfU0dMKS0xOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGNvbnZlcnQgaW50byBMU1AgZG9tYWluICovCisgIGZvciAoaSA9IDA7IGkgPCAobmJEaXYgKyAxKTsgaSsrKSB7CisgICAgaWYgKGxwY19wcmVzZW50W2ldKSB7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgTV9MUF9GSUxURVJfT1JERVI7IGsrKykgeworICAgICAgICBsc3BbaV1ba10gPSBGWF9EQkwyRlhfTFBDKAorICAgICAgICAgICAgZml4cF9jb3MoZk11bHQobHNwW2ldW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woKDEgPDwgTFNQQVJHX1NDQUxFKSAqIE1fUEkgLyA2NDAwLjApKSwKKyAgICAgICAgICAgICAgICAgICAgIExTRl9TQ0FMRSAtIExTUEFSR19TQ0FMRSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCit2b2lkIENMcGNfQ29uY2VhbChGSVhQX0xQQyBsc3BbXVtNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICBGSVhQX0xQQyBscGM0X2xzZltNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICBGSVhQX0xQQyBsc2ZfYWRhcHRpdmVfbWVhbltNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZmlyc3RfbHBkX2ZsYWcpIHsKKyAgaW50IGksIGo7CisKKyNkZWZpbmUgQkVUQSAoRkwyRlhDT05TVF9TR0woMC4yNWYpKQorI2RlZmluZSBPTkVfQkVUQSAoRkwyRlhDT05TVF9TR0woMC43NWYpKQorI2RlZmluZSBCRklfRkFDIChGTDJGWENPTlNUX1NHTCgwLjkwZikpCisjZGVmaW5lIE9ORV9CRklfRkFDIChGTDJGWENPTlNUX1NHTCgwLjEwZikpCisKKyAgLyogRnJhbWUgbG9zcyBjb25jZWFsbWVudCAoY291bGQgYmUgaW1wcm92ZWQpICovCisKKyAgaWYgKGZpcnN0X2xwZF9mbGFnKSB7CisgICAgLyogUmVzZXQgcGFzdCBMU0YgdmFsdWVzICovCisgICAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgIGxzcFswXVtpXSA9IGxwYzRfbHNmW2ldID0gZmRrX2RlY19sc2ZfaW5pdFtpXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogb2xkIExQQzQgaXMgbmV3IExQQzAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgICAgbHNwWzBdW2ldID0gbHBjNF9sc2ZbaV07CisgICAgfQorICB9CisKKyAgLyogTFBDMSAqLworICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgIEZJWFBfTFBDIGxzZl9tZWFuID0gRlhfREJMMkZYX0xQQyhmTXVsdChCRVRBLCBmZGtfZGVjX2xzZl9pbml0W2ldKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KE9ORV9CRVRBLCBsc2ZfYWRhcHRpdmVfbWVhbltpXSkpOworCisgICAgbHNwWzFdW2ldID0gRlhfREJMMkZYX0xQQyhmTXVsdChCRklfRkFDLCBscGM0X2xzZltpXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoT05FX0JGSV9GQUMsIGxzZl9tZWFuKSk7CisgIH0KKworICAvKiBMUEMyIC0gTFBDNCAqLworICBmb3IgKGogPSAyOyBqIDw9IDQ7IGorKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgICAvKiBsc2ZfbWVhbltpXSA9ICBGWF9EQkwyRlhfTFBDKGZNdWx0KChGSVhQX0xQQykoQkVUQSArIGogKgorICAgICAgICAgRkwyRlhDT05TVF9MUEMoMC4xZikpLCBmZGtfZGVjX2xzZl9pbml0W2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmTXVsdCgoRklYUF9MUEMpKE9ORV9CRVRBIC0gaiAqCisgICAgICAgICBGTDJGWENPTlNUX0xQQygwLjFmKSksIGxzZl9hZGFwdGl2ZV9tZWFuW2ldKSk7ICovCisKKyAgICAgIEZJWFBfTFBDIGxzZl9tZWFuID0gRlhfREJMMkZYX0xQQygKKyAgICAgICAgICBmTXVsdCgoRklYUF9TR0wpKEJFVEEgKyAoRklYUF9TR0wpKGogKiAoSU5UKUZMMkZYQ09OU1RfU0dMKDAuMWYpKSksCisgICAgICAgICAgICAgICAgKEZJWFBfU0dMKWZka19kZWNfbHNmX2luaXRbaV0pICsKKyAgICAgICAgICBmTXVsdCgKKyAgICAgICAgICAgICAgKEZJWFBfU0dMKShPTkVfQkVUQSAtIChGSVhQX1NHTCkoaiAqIChJTlQpRkwyRlhDT05TVF9TR0woMC4xZikpKSwKKyAgICAgICAgICAgICAgbHNmX2FkYXB0aXZlX21lYW5baV0pKTsKKworICAgICAgbHNwW2pdW2ldID0gRlhfREJMMkZYX0xQQyhmTXVsdChCRklfRkFDLCBsc3BbaiAtIDFdW2ldKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KE9ORV9CRklfRkFDLCBsc2ZfbWVhbikpOworICAgIH0KKyAgfQorCisgIC8qIFVwZGF0ZSBwYXN0IHZhbHVlcyBmb3IgdGhlIGZ1dHVyZSAqLworICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgIGxwYzRfbHNmW2ldID0gbHNwWzRdW2ldOworICB9CisKKyAgLyogY29udmVydCBpbnRvIExTUCBkb21haW4gKi8KKyAgZm9yIChqID0gMDsgaiA8IDU7IGorKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgICBsc3Bbal1baV0gPSBGWF9EQkwyRlhfTFBDKGZpeHBfY29zKAorICAgICAgICAgIGZNdWx0KGxzcFtqXVtpXSwgRkwyRlhDT05TVF9TR0woKDEgPDwgTFNQQVJHX1NDQUxFKSAqIE1fUEkgLyA2NDAwLjApKSwKKyAgICAgICAgICBMU0ZfU0NBTEUgLSBMU1BBUkdfU0NBTEUpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBFX0xQQ19hX3dlaWdodChGSVhQX0xQQyAqd0EsIGNvbnN0IEZJWFBfTFBDICpBLCBpbnQgbSkgeworICBGSVhQX0RCTCBmOworICBpbnQgaTsKKworICBmID0gRkwyRlhDT05TVF9EQkwoMC45MmYpOworICBmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CisgICAgd0FbaV0gPSBGWF9EQkwyRlhfTFBDKGZNdWx0KEFbaV0sIGYpKTsKKyAgICBmID0gZk11bHQoZiwgRkwyRlhDT05TVF9EQkwoMC45MmYpKTsKKyAgfQorfQorCit2b2lkIENMcGRfRGVjb2RlR2FpbihGSVhQX0RCTCAqZ2FpbiwgSU5UICpnYWluX2UsIGludCBnYWluX2NvZGUpIHsKKyAgLyogZ2FpbiAqIDJeKGdhaW5fZSkgPSAxMF4oZ2Fpbl9jb2RlLzI4KSAqLworICAqZ2FpbiA9IGZMZFBvdygKKyAgICAgIEZMMkZYQ09OU1RfREJMKDMuMzIxOTI4MDk0ODg3MzYyMzQ3ODcwMzE5NDI5NDg5NCAvIDQuMCksIC8qIGxvZzIoMTApKi8KKyAgICAgIDIsCisgICAgICBmTXVsdERpdjIoKEZJWFBfREJMKWdhaW5fY29kZSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gNyksCisgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMi4wZiAvIDI4LjBmKSksCisgICAgICA3LCBnYWluX2UpOworfQorCisgIC8qKgorICAgKiBcYnJpZWYgKiAgIEZpbmQgdGhlIHBvbHlub21pYWwgRjEoeikgb3IgRjIoeikgZnJvbSB0aGUgTFNQcy4KKyAgICogVGhpcyBpcyBwZXJmb3JtZWQgYnkgZXhwYW5kaW5nIHRoZSBwcm9kdWN0IHBvbHlub21pYWxzOgorICAgKgorICAgKiBGMSh6KSA9ICAgcHJvZHVjdCAgICggMSAtIDIgTFNQX2kgel4tMSArIHpeLTIgKQorICAgKiAgICAgICAgIGk9MCwyLDQsNiw4CisgICAqIEYyKHopID0gICBwcm9kdWN0ICAgKCAxIC0gMiBMU1BfaSB6Xi0xICsgel4tMiApCisgICAqICAgICAgICAgaT0xLDMsNSw3LDkKKyAgICoKKyAgICogd2hlcmUgTFNQX2kgYXJlIHRoZSBMU1BzIGluIHRoZSBjb3NpbmUgZG9tYWluLgorICAgKiBSLkEuU2FsYW1pICAgIE9jdG9iZXIgMTk5MAorICAgKiBccGFyYW0gbHNwIGlucHV0LCBsaW5lIHNwZWN0cmFsIGZyZXEuIChjb3NpbmUgZG9tYWluKQorICAgKiBccGFyYW0gZiBvdXRwdXQsIHRoZSBjb2VmZmljaWVudHMgb2YgRjEgb3IgRjIsIHNjYWxlZCBieSA4IGJpdHMKKyAgICogXHBhcmFtIG4gbm8gb2YgY29lZmZpY2llbnRzIChtLzIpCisgICAqIFxwYXJhbSBmbGFnIDEgOiBGMSh6KSA7IDIgOiBGMih6KQorICAgKi8KKworI2RlZmluZSBTRl9GIDgKKworc3RhdGljIHZvaWQgZ2V0X2xzcHBvbChGSVhQX0xQQyBsc3BbXSwgRklYUF9EQkwgZltdLCBpbnQgbiwgaW50IGZsYWcpIHsKKyAgRklYUF9EQkwgYjsKKyAgRklYUF9MUEMgKnBsc3A7CisgIGludCBpLCBqOworCisgIHBsc3AgPSBsc3AgKyBmbGFnIC0gMTsKKyAgZlswXSA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoMSA8PCBTRl9GKSk7CisgIGIgPSAtRlhfTFBDMkZYX0RCTCgqcGxzcCk7CisgIGZbMV0gPSBiID4+IChTRl9GIC0gMSk7CisgIGZvciAoaSA9IDI7IGkgPD0gbjsgaSsrKSB7CisgICAgcGxzcCArPSAyOworICAgIGIgPSAtRlhfTFBDMkZYX0RCTCgqcGxzcCk7CisgICAgZltpXSA9ICgoZk11bHREaXYyKGIsIGZbaSAtIDFdKSA8PCAxKSArIChmW2kgLSAyXSkpIDw8IDE7CisgICAgZm9yIChqID0gaSAtIDE7IGogPiAxOyBqLS0pIHsKKyAgICAgIGZbal0gPSBmW2pdICsgKGZNdWx0RGl2MihiLCBmW2ogLSAxXSkgPDwgMikgKyBmW2ogLSAyXTsKKyAgICB9CisgICAgZlsxXSA9IGZbMV0gKyAoYiA+PiAoU0ZfRiAtIDEpKTsKKyAgfQorICByZXR1cm47Cit9CisKKyNkZWZpbmUgTkMgTV9MUF9GSUxURVJfT1JERVIgLyAyCisKKy8qKgorICogXGJyaWVmIGxzcCBpbnB1dCBMU1AgdmVjdG9yCisgKiBcYnJpZWYgYSBvdXRwdXQgTFAgZmlsdGVyIGNvZWZmaWNpZW50IHZlY3RvciBzY2FsZWQgYnkgU0ZfQV9DT0VGRlMuCisgKi8KK3ZvaWQgRV9MUENfZl9sc3BfYV9jb252ZXJzaW9uKEZJWFBfTFBDICpsc3AsIEZJWFBfTFBDICphLCBJTlQgKmFfZXhwKSB7CisgIEZJWFBfREJMIGYxW05DICsgMV0sIGYyW05DICsgMV07CisgIGludCBpLCBrOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAqICBGaW5kIHRoZSBwb2x5bm9taWFscyBGMSh6KSBhbmQgRjIoeikgICAgICAgICAgICAgICAqCisgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIGdldF9sc3Bwb2wobHNwLCBmMSwgTkMsIDEpOworICBnZXRfbHNwcG9sKGxzcCwgZjIsIE5DLCAyKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgKiAgTXVsdGlwbHkgRjEoeikgYnkgKDErel4tMSkgYW5kIEYyKHopIGJ5ICgxLXpeLTEpICAgKgorICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgZm9yIChpID0gTkM7IGkgPiAwOyBpLS0pIHsKKyAgICBmMVtpXSArPSBmMVtpIC0gMV07CisgICAgZjJbaV0gLT0gZjJbaSAtIDFdOworICB9CisKKyAgRklYUF9EQkwgYURCTFtNX0xQX0ZJTFRFUl9PUkRFUl07CisKKyAgZm9yIChpID0gMSwgayA9IE1fTFBfRklMVEVSX09SREVSIC0gMTsgaSA8PSBOQzsgaSsrLCBrLS0pIHsKKyAgICBGSVhQX0RCTCB0bXAxLCB0bXAyOworCisgICAgdG1wMSA9IGYxW2ldID4+IDE7CisgICAgdG1wMiA9IGYyW2ldID4+IDE7CisKKyAgICBhREJMW2kgLSAxXSA9ICh0bXAxICsgdG1wMik7CisgICAgYURCTFtrXSA9ICh0bXAxIC0gdG1wMik7CisgIH0KKworICBpbnQgaGVhZHJvb21fYSA9IGdldFNjYWxlZmFjdG9yKGFEQkwsIE1fTFBfRklMVEVSX09SREVSKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgIGFbaV0gPSBGWF9EQkwyRlhfTFBDKGFEQkxbaV0gPDwgaGVhZHJvb21fYSk7CisgIH0KKworICAqYV9leHAgPSA4IC0gaGVhZHJvb21fYTsKK30KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19scGMuaCBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19scGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjcxM2MxCi0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2xwYy5oCkBAIC0wLDAgKzEsMTkwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBIaWxkZW5icmFuZCwgTWFudWVsIEphbmRlcgorCisgICBEZXNjcmlwdGlvbjogVVNBQyBMUEMvQVZRIGRlY29kZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFVTQUNERUNfTFBDX0gKKyNkZWZpbmUgVVNBQ0RFQ19MUENfSAorCisjaW5jbHVkZSAiY2hhbm5lbGluZm8uaCIKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgInVzYWNkZWNfcm9tLmgiCisKKyNkZWZpbmUgTFNQQVJHX1NDQUxFIDEwCisKKy8qKgorICogXGJyaWVmIEFWUSAocmVmaW5lbWVudCkgZGVjb2RlCisgKiBccGFyYW0gaEJzIGJpdHN0cmVhbSBoYW5kbGUKKyAqIFxwYXJhbSBsc2ZxIGJ1ZmZlciBmb3IgQVZRIGRlY29kZSBvdXRwdXQuCisgKiBccGFyYW0gbmtfbW9kZSBxdWFudGl6YXRpb24gbW9kZS4KKyAqIFxwYXJhbSBucW4gYW1vdW50IG9mIHNwbGl0L2ludGVybGVhdmVkIFJFOCB2ZWN0b3JzLgorICogXHBhcmFtIHRvdGFsIGFtb3VudCBvZiBpbmRpdmlkdWFsIGRhdGEgdmFsdWVzIHRvIGRlY29kZS4KKyAqIFxyZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4KKyAqLworaW50IENMcGNfRGVjb2RlQVZRKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgRklYUF9EQkwgKmxzZnEsIGludCBua19tb2RlLAorICAgICAgICAgICAgICAgICAgIGludCBucW4sIGludCBsZW5ndGgpOworCisvKioKKyAqIFxicmllZiBSZWFkIGFuZCBkZWNvZGUgTFBDIGNvZWZpY2llbnQgc2V0cy4gRmlyc3Qgc3RhZ2UgYXBwcm94aW1hdGlvbiArIEFWUQorICogZGVjb2RlLgorICogXHBhcmFtW2luXSAgaEJzIGJpdHN0cmVhbSBoYW5kbGUgdG8gcmVhZCBkYXRhIGZyb20uCisgKiBccGFyYW1bb3V0XSBsc3AgYnVmZmVyIGludG8gd2hpY2ggdGhlIGRlY29kZWQgTFNQIGNvZWZmaWNpZW50cyB3aWxsIGJlIHN0b3JlZAorICogaW50by4KKyAqIFxwYXJhbVtpbixvdXRdIGxwYzRfbHNmIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBkZWNvZGVkIExDUDQgTFNGIGNvZWZmaWNpZW50cworICogd2lsbCBiZSBzdG9yZWQgaW50byAocGVyc2lzdGVudCkuCisgKiBccGFyYW1bb3V0XSBsc2ZfYWRhcHRpdmVfbWVhbl9jYW5kIGxzZiBhZGFwdGl2ZSBtZWFuIHZlY3RvciBuZWVkZWQgZm9yCisgKiBjb25jZWFsbWVudC4KKyAqIFxwYXJhbVtvdXRdIHBTdGFiaWxpdHkgYXJyYXkgd2l0aCBzdGFiaWxpdHkgdmFsdWVzIGZvciB0aGUgQUNFTFAgZGVjb2RlciAoYW5kCisgKiBjb25jZWFsbWVudCkuCisgKiBccGFyYW1baW5dICBtb2QgYXJyYXkgd2hpY2ggZGVmaW5lcyBtb2RlcyAoQUNFTFAsIFRDWDIwfDQwfDgwKSBhcmUgdXNlZCBpbgorICogdGhlIGN1cnJlbnQgc3VwZXJmcmFtZS4KKyAqIFxwYXJhbVtpbl0gIGZpcnN0X2xwZF9mbGFnIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgTFBDMAorICogXHBhcmFtW2luXSAgbGFzdF9scGNfbG9zdCBpbmRpY2F0ZSB0aGF0IExQQzQgb2YgcHJldmlvdXMgZnJhbWUgd2FzIGxvc3QuCisgKiBccGFyYW1baW5dICBsYXN0X2ZyYW1lX29rIGluZGljYXRlIHRoYXQgdGhlIGxhc3QgZnJhbWUgd2FzIG9rLgorICogXHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLgorICovCitpbnQgQ0xwY19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgRklYUF9MUEMgbHNwW11bTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICBGSVhQX0xQQyBscGM0X2xzZltNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgIEZJWFBfTFBDIGxzZl9hZGFwdGl2ZV9tZWFuX2NhbmRbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICBGSVhQX1NHTCBwU3RhYmlsaXR5W10sIFVDSEFSICptb2QsIGludCBmaXJzdF9scGRfZmxhZywKKyAgICAgICAgICAgICAgaW50IGxhc3RfbHBjX2xvc3QsIGludCBsYXN0X2ZyYW1lX29rKTsKKworLyoqCisgKiBcYnJpZWYgR2VuZXJhdGUgTFBDIGNvZWZmaWNpZW50IHNldHMgaW4gY2FzZSBmcmFtZSBsb3NzLgorICogXHBhcmFtIGxzcCBidWZmZXIgaW50byB3aGljaCB0aGUgZGVjb2RlZCBMU1AgY29lZmZpY2llbnRzIHdpbGwgYmUgc3RvcmVkCisgKiBpbnRvLgorICogXHBhcmFtIGxwYzRfbHNmIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBkZWNvZGVkIExDUDQgTFNGIGNvZWZmaWNpZW50cyB3aWxsIGJlCisgKiBzdG9yZWQgaW50byAocGVyc2lzdGVudCkuCisgKiBccGFyYW0gaXNmX2FkYXB0aXZlX21lYW4KKyAqIFxwYXJhbSBmaXJzdF9scGRfZmxhZyBpbmRpY2F0ZXMgdGhlIHByZXZpb3VzIExTRjQgY29lZmZpY2llbnRzIGxwYzRfbHNmW10gYXJlCisgKiBub3QgdmFsaWQuCisgKi8KK3ZvaWQgQ0xwY19Db25jZWFsKEZJWFBfTFBDIGxzcFtdW01fTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgICAgICAgIEZJWFBfTFBDIGxwYzRfbHNmW01fTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgICAgICAgIEZJWFBfTFBDIGlzZl9hZGFwdGl2ZV9tZWFuW01fTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmaXJzdF9scGRfZmxhZyk7CisKKy8qKgorICogXGJyaWVmIGFwcGx5IGFic29sdXRlIHdlaWdodGluZworICogXHBhcmFtIEEgd2VpZ2h0ZWQgTFBDIGNvZWZmaWNpZW50IHZlY3RvciBvdXRwdXQuIFRoZSBmaXJzdCBjb2VmZmNpZW50IGlzCisgKiBpbXBsaWNpdGx5IDEuMAorICogXHBhcmFtIEEgTFBDIGNvZWZmaWNpZW50IHZlY3Rvci4gVGhlIGZpcnN0IGNvZWZmY2llbnQgaXMgaW1wbGljaXRseSAxLjAKKyAqIFxwYXJhbSBtIGxlbmd0aCBvZiB2ZWN0b3IgQQorICovCisvKiBzdGF0aWMgKi8KK3ZvaWQgRV9MUENfYV93ZWlnaHQoRklYUF9MUEMgKndBLCBjb25zdCBGSVhQX0xQQyAqQSwgY29uc3QgaW50IG0pOworCisvKioKKyAqIFxicmllZiBkZWNvZGUgVENYL0ZBQyBnYWluLiBJbiBjYXNlIG9mIFRDWCB0aGUgbGcvc3FydChybXMpIHBhcnQKKyAqICAgICAgICBtdXN0IHN0aWxsIGJlIGFwcGxpZWQgdG8gb2J0YWluIHRoZSBnYWluIHZhbHVlLgorICogXHBhcmFtIGdhaW4gKG8pIHBvaW50ZXIgd2VyZSB0aGUgZ2FpbiBtYW50aXNzYSBpcyBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSBnYWluX2UgKG8pIHBvaW50ZXIgd2VyZSB0aGUgZ2FpbiBleHBvbmVudCBpcyBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSBnYWluX2NvZGUgKGkpIHRoZSA3IGJpdCBiaW5hcnkgd29yZCBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGluZyB0aGUgZ2Fpbi4KKyAqLwordm9pZCBDTHBkX0RlY29kZUdhaW4oRklYUF9EQkwgKmdhaW4sIElOVCAqZ2Fpbl9lLCBpbnQgZ2Fpbl9jb2RlKTsKKworLyoqCisgKiBcYnJpZWYgY29udmVydCBMU1AgY29lZmZpY2llbnRzIGludG8gTFAgZG9tYWluLgorICovCit2b2lkIEVfTFBDX2ZfbHNwX2FfY29udmVyc2lvbihGSVhQX0xQQyAqbHNwLCBGSVhQX0xQQyAqYSwgSU5UICphX2V4cCk7CisKKyNlbmRpZiAvKiBVU0FDREVDX0xQQ19IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3VzYWNkZWNfbHBkLmNwcCBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19scGQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDY5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfbHBkLmNwcApAQCAtMCwwICsxLDIwMjkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKworICAgRGVzY3JpcHRpb246IFVTQUMgTGluZWFyIFByZWRpY3Rpb24gRG9tYWluIGNvZGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNhY2RlY19scGQuaCIKKworI2luY2x1ZGUgInVzYWNkZWNfcm9tLmgiCisjaW5jbHVkZSAidXNhY2RlY19mYWMuaCIKKyNpbmNsdWRlICJ1c2FjZGVjX2xwYy5oIgorI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKKyNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJtZGN0LmgiCisjaW5jbHVkZSAidXNhY2RlY19hY2VscC5oIgorI2luY2x1ZGUgIm92ZXJsYXBhZGQuaCIKKworI2luY2x1ZGUgImNvbmNlYWwuaCIKKworI2luY2x1ZGUgImJsb2NrLmgiCisKKyNkZWZpbmUgU0ZfUElUQ0hfVFJBQ0sgNgorI2RlZmluZSBTRl9HQUlOIDMKKyNkZWZpbmUgTUlOX1ZBTCBGTDJGWENPTlNUX0RCTCgwLjBmKQorI2RlZmluZSBNQVhfVkFMIChGSVhQX0RCTCkgTUFYVkFMX0RCTAorCisjaW5jbHVkZSAiYWNfYXJpdGhfY29kZXIuaCIKKwordm9pZCBmaWx0TFAoY29uc3QgRklYUF9EQkwgKnN5biwgRklYUF9QQ00gKnN5bl9vdXQsIEZJWFBfREJMICpub2lzZSwKKyAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMICpmaWx0LCBJTlQgc3RvcCwgaW50IGxlbikgeworICBJTlQgaSwgajsKKyAgRklYUF9EQkwgdG1wOworCisgIGZvciAoaSA9IDA7IGkgPCBzdG9wOyBpKyspIHsKKyAgICB0bXAgPSBmTXVsdERpdjIobm9pc2VbaV0sIGZpbHRbMF0pOyAgLy8gRmlsdCBpbiBRLTEuMTYKKyAgICBmb3IgKGogPSAxOyBqIDw9IGxlbjsgaisrKSB7CisgICAgICB0bXAgKz0gZk11bHREaXYyKChub2lzZVtpIC0gal0gKyBub2lzZVtpICsgal0pLCBmaWx0W2pdKTsKKyAgICB9CisgICAgc3luX291dFtpXSA9IChGSVhQX1BDTSkoSU1EQ1RfU0NBTEUoc3luW2ldIC0gdG1wKSk7CisgIH0KK30KKwordm9pZCBiYXNzX3BmXzFzZl9kZWxheSgKKyAgICBGSVhQX0RCTCAqc3luLCAgIC8qIChpKSA6IDEyLjhrSHogc3ludGhlc2lzIHRvIHBvc3RmaWx0ZXIgICAgICAgICAgICAgICovCisgICAgY29uc3QgSU5UICpUX3NmLCAvKiAoaSkgOiBQaXRjaCBwZXJpb2QgZm9yIGFsbCBzdWJmcmFtZXMgKFRfc2ZbMTZdKSAgICAqLworICAgIEZJWFBfREJMICpwaXRfZ2FpbiwKKyAgICBjb25zdCBpbnQgZnJhbWVfbGVuZ3RoLCAvKiAoaSkgOiBmcmFtZSBsZW5ndGggKHNob3VsZCBiZSA3Njh8MTAyNCkgKi8KKyAgICBjb25zdCBJTlQgbF9mcmFtZSwKKyAgICBjb25zdCBJTlQgbF9uZXh0LCAvKiAoaSkgOiBsb29rIGFoZWFkIGZvciBzeW1tZXRyaWMgZmlsdGVyaW5nICAgICAgICAgICAqLworICAgIEZJWFBfUENNICpzeW50aF9vdXQsIC8qIChvKSA6IGZpbHRlcmVkIHN5bnRoZXNpcyAod2l0aCBkZWxheSBvZiAxIHN1YmZyKSAqLworICAgIEZJWFBfREJMIG1lbV9icGZbXSkgLyogaS9vIDogbWVtb3J5IHN0YXRlIFtMX0ZJTFQrTF9TVUJGUl0gICAgICAgICAgICAgICAgKi8KK3sKKyAgSU5UIGksIHNmLCBpX3N1YmZyLCBULCBUMiwgbGc7CisKKyAgRklYUF9EQkwgdG1wLCBlbmVyLCBjb3JyLCBnYWluOworICBGSVhQX0RCTCAqbm9pc2UsICpub2lzZV9pbjsKKyAgRklYUF9EQkwKKyAgbm9pc2VfYnVmW0xfRklMVCArICgyICogTF9TVUJGUildOyAgLy8gTF9GSUxUID0gMTIsIExfU1VCRlIgPSA2NCA9PiAxNDAKKyAgY29uc3QgRklYUF9EQkwgKngsICp5OworCisgIHsKKyAgICBub2lzZSA9IG5vaXNlX2J1ZiArIExfRklMVDsgIC8vIExfRklMVCA9IDEyIGRlbGF5IG9mIHVwc2FtcGxpbmcgZmlsdGVyCisgICAgbm9pc2VfaW4gPSBub2lzZV9idWYgKyBMX0ZJTFQgKyBMX1NVQkZSOworICAgIC8qIElucHV0IHNjYWxpbmcgb2YgdGhlIEJQRiBtZW1vcnkgKi8KKyAgICBzY2FsZVZhbHVlcyhtZW1fYnBmLCAoTF9GSUxUICsgTF9TVUJGUiksIDEpOworICB9CisKKyAgaW50IGdhaW5fZXhwID0gMTc7CisKKyAgc2YgPSAwOworICBmb3IgKGlfc3ViZnIgPSAwOyBpX3N1YmZyIDwgbF9mcmFtZTsgaV9zdWJmciArPSBMX1NVQkZSLCBzZisrKSB7CisgICAgVCA9IFRfc2Zbc2ZdOworICAgIGdhaW4gPSBwaXRfZ2FpbltzZl07CisKKyAgICAvKiBHYWluIGlzIGluIFExNy4xNCAqLworICAgIC8qIElmIGdhaW4gPiAxIHNldCB0byAxICovCisgICAgaWYgKGdhaW4gPiAoRklYUF9EQkwpKDEgPDwgMTQpKSBnYWluID0gKEZJWFBfREJMKSgxIDw8IDE0KTsKKworICAgIC8qIElmIGdhaW4gPCAwIHNldCB0byAwICovCisgICAgaWYgKGdhaW4gPCAoRklYUF9EQkwpMCkgZ2FpbiA9IChGSVhQX0RCTCkwOworCisgICAgaWYgKGdhaW4gPiAoRklYUF9EQkwpMCkgeworICAgICAgLyogcGl0Y2ggdHJhY2tlcjogdGVzdCBwaXRjaC8yIHRvIGF2b2lkIGNvbnRpbnVvdXMgcGl0Y2ggZG91YmxpbmcgKi8KKyAgICAgIC8qIE5vdGU6IHBpdGNoIGlzIGxpbWl0ZWQgdG8gUElUX01JTiAoMzQgPSAzNzZIeikgYXQgdGhlIGVuY29kZXIgICovCisgICAgICBUMiA9IFQgPj4gMTsKKyAgICAgIHggPSAmc3luW2lfc3ViZnIgLSBMX0VYVFJBXTsKKyAgICAgIHkgPSAmc3luW2lfc3ViZnIgLSBUMiAtIExfRVhUUkFdOworCisgICAgICBlbmVyID0gKEZJWFBfREJMKTA7CisgICAgICBjb3JyID0gKEZJWFBfREJMKTA7CisgICAgICB0bXAgPSAoRklYUF9EQkwpMDsKKworICAgICAgaW50IGhlYWRyb29tX3ggPSBnZXRTY2FsZWZhY3Rvcih4LCBMX1NVQkZSICsgTF9FWFRSQSk7CisgICAgICBpbnQgaGVhZHJvb21feSA9IGdldFNjYWxlZmFjdG9yKHksIExfU1VCRlIgKyBMX0VYVFJBKTsKKworICAgICAgaW50IHdpZHRoX3NoaWZ0ID0gNzsKKworICAgICAgZm9yIChpID0gMDsgaSA8IChMX1NVQkZSICsgTF9FWFRSQSk7IGkrKykgeworICAgICAgICBlbmVyICs9IGZQb3cyRGl2MigoeFtpXSA8PCBoZWFkcm9vbV94KSkgPj4gd2lkdGhfc2hpZnQ7CisgICAgICAgIGNvcnIgKz0gZk11bHREaXYyKCh4W2ldIDw8IGhlYWRyb29tX3gpLCAoeVtpXSA8PCBoZWFkcm9vbV95KSkgPj4KKyAgICAgICAgICAgICAgICB3aWR0aF9zaGlmdDsKKyAgICAgICAgdG1wICs9IGZQb3cyRGl2MigoeVtpXSA8PCBoZWFkcm9vbV95KSkgPj4gd2lkdGhfc2hpZnQ7CisgICAgICB9CisKKyAgICAgIGludCBleHBfZW5lciA9ICgoMTcgLSBoZWFkcm9vbV94KSA8PCAxKSArIHdpZHRoX3NoaWZ0ICsgMTsKKyAgICAgIGludCBleHBfY29yciA9ICgxNyAtIGhlYWRyb29tX3gpICsgKDE3IC0gaGVhZHJvb21feSkgKyB3aWR0aF9zaGlmdCArIDE7CisgICAgICBpbnQgZXhwX3RtcCA9ICgoMTcgLSBoZWFkcm9vbV95KSA8PCAxKSArIHdpZHRoX3NoaWZ0ICsgMTsKKworICAgICAgLyogQWRkIDAuMDEgdG8gImVuZXIiLiBBZGp1c3QgZXhwb25lbnRzICovCisgICAgICBGSVhQX0RCTCBwb2ludF96ZXJvX29uZSA9IChGSVhQX0RCTCkweDUxZWI4NTFmOyAvKiBJbiBRLTYuMzcgKi8KKyAgICAgIGludCBkaWZmOworICAgICAgZW5lciA9IGZBZGROb3JtKGVuZXIsIGV4cF9lbmVyLCBwb2ludF96ZXJvX29uZSwgLTYsICZleHBfZW5lcik7CisgICAgICBjb3JyID0gZkFkZE5vcm0oY29yciwgZXhwX2NvcnIsIHBvaW50X3plcm9fb25lLCAtNiwgJmV4cF9jb3JyKTsKKyAgICAgIHRtcCA9IGZBZGROb3JtKHRtcCwgZXhwX3RtcCwgcG9pbnRfemVyb19vbmUsIC02LCAmZXhwX3RtcCk7CisKKyAgICAgIC8qIHVzZSBUMiBpZiBub3JtYWxpemVkIGNvcnJlbGF0aW9uID4gMC45NSAqLworICAgICAgSU5UIHMxLCBzMjsKKyAgICAgIHMxID0gQ250TGVhZGluZ1plcm9zKGVuZXIpIC0gMTsKKyAgICAgIHMyID0gQ250TGVhZGluZ1plcm9zKHRtcCkgLSAxOworCisgICAgICBGSVhQX0RCTCBlbmVyX2J5X3RtcCA9IGZNdWx0RGl2MihlbmVyIDw8IHMxLCB0bXAgPDwgczIpOworICAgICAgaW50IGVuZXJfYnlfdG1wX2V4cCA9IChleHBfZW5lciAtIHMxKSArIChleHBfdG1wIC0gczIpICsgMTsKKworICAgICAgaWYgKGVuZXJfYnlfdG1wX2V4cCAmIDEpIHsKKyAgICAgICAgZW5lcl9ieV90bXAgPDw9IDE7CisgICAgICAgIGVuZXJfYnlfdG1wX2V4cCAtPSAxOworICAgICAgfQorCisgICAgICBpbnQgdGVtcF9leHAgPSAwOworCisgICAgICBGSVhQX0RCTCB0ZW1wMSA9IGludlNxcnROb3JtMihlbmVyX2J5X3RtcCwgJnRlbXBfZXhwKTsKKworICAgICAgaW50IHRlbXAxX2V4cCA9IHRlbXBfZXhwIC0gKGVuZXJfYnlfdG1wX2V4cCA+PiAxKTsKKworICAgICAgRklYUF9EQkwgdG1wX3Jlc3VsdCA9IGZNdWx0KGNvcnIsIHRlbXAxKTsKKworICAgICAgaW50IHRtcF9yZXN1bHRfZXhwID0gZXhwX2NvcnIgKyB0ZW1wMV9leHA7CisKKyAgICAgIGRpZmYgPSB0bXBfcmVzdWx0X2V4cCAtIDA7CisgICAgICBGSVhQX0RCTCBwb2ludDk1ID0gRkwyRlhDT05TVF9EQkwoMC45NWYpOworICAgICAgaWYgKGRpZmYgPj0gMCkgeworICAgICAgICBkaWZmID0gZk1pbihkaWZmLCAzMSk7CisgICAgICAgIHBvaW50OTUgPSBGTDJGWENPTlNUX0RCTCgwLjk1ZikgPj4gZGlmZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpZmYgPSBmTWF4KGRpZmYsIC0zMSk7CisgICAgICAgIHRtcF9yZXN1bHQgPj49ICgtZGlmZik7CisgICAgICB9CisKKyAgICAgIGlmICh0bXBfcmVzdWx0ID4gcG9pbnQ5NSkgVCA9IFQyOworCisgICAgICAvKiBwcmV2ZW50IHRoYXQgbm9pc2UgY2FsY3VsYXRpb24gYmVsb3cgcmVhY2hlcyBpbnRvIG5vdCBkZWZpbmVkIHNpZ25hbAorICAgICAgICAgcGFydHMgYXQgdGhlIGVuZCBvZiB0aGUgc3ludGhfYnVmIG9yIGluIG90aGVyIHdvcmRzIHJlc3RyaWN0IHRoZSBiZWxvdworICAgICAgICAgdXNlZCBpbmRleCAoaStpX3N1YmZyK1QpIDwgbF9mcmFtZSArIGxfbmV4dAorICAgICAgKi8KKyAgICAgIGxnID0gbF9mcmFtZSArIGxfbmV4dCAtIFQgLSBpX3N1YmZyOworCisgICAgICBpZiAobGcgPiBMX1NVQkZSKQorICAgICAgICBsZyA9IExfU1VCRlI7CisgICAgICBlbHNlIGlmIChsZyA8IDApCisgICAgICAgIGxnID0gMDsKKworICAgICAgLyogbGltaXQgZ2FpbiB0byBhdm9pZCBwcm9ibGVtIG9uIGJ1cnN0ICovCisgICAgICBpZiAobGcgPiAwKSB7CisgICAgICAgIEZJWFBfREJMIHRtcDE7CisKKyAgICAgICAgLyogbWF4KGxnKSA9IDY0ID0+IHNjYWxlIHdpdGggNiBiaXRzIG1pbnVzIDEgKGZQb3cyRGl2MikgKi8KKworICAgICAgICBzMSA9IGdldFNjYWxlZmFjdG9yKCZzeW5baV9zdWJmcl0sIGxnKTsKKyAgICAgICAgczIgPSBnZXRTY2FsZWZhY3Rvcigmc3luW2lfc3ViZnIgKyBUXSwgbGcpOworICAgICAgICBJTlQgcyA9IGZpeE1pbihzMSwgczIpOworCisgICAgICAgIHRtcCA9IChGSVhQX0RCTCkwOworICAgICAgICBlbmVyID0gKEZJWFBfREJMKTA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZzsgaSsrKSB7CisgICAgICAgICAgdG1wICs9IGZQb3cyRGl2MihzeW5baSArIGlfc3ViZnJdIDw8IHMxKSA+PiAoU0ZfUElUQ0hfVFJBQ0spOworICAgICAgICAgIGVuZXIgKz0gZlBvdzJEaXYyKHN5bltpICsgaV9zdWJmciArIFRdIDw8IHMyKSA+PiAoU0ZfUElUQ0hfVFJBQ0spOworICAgICAgICB9CisgICAgICAgIHRtcCA9IHRtcCA+PiBmTWluKERGUkFDVF9CSVRTIC0gMSwgKDIgKiAoczEgLSBzKSkpOworICAgICAgICBlbmVyID0gZW5lciA+PiBmTWluKERGUkFDVF9CSVRTIC0gMSwgKDIgKiAoczIgLSBzKSkpOworCisgICAgICAgIC8qIGVycm9yIHJvYnVzdG5lc3M6IGZvciB0aGUgc3BlY2lmaWMgY2FzZSBzeW5bLi4uXSA9PSAtMS4wZiBmb3IgYWxsIDY0CisgICAgICAgICAgIHNhbXBsZXMgZW5lciBvciB0bXAgbWlnaHQgb3ZlcmZsb3cgYW5kIGJlY29tZSBuZWdhdGl2ZS4gRm9yIGFsbCBzYW5lCisgICAgICAgICAgIGNhc2VzIHdlIGhhdmUgZW5vdWdoIGhlYWRyb29tLgorICAgICAgICAqLworICAgICAgICBpZiAoZW5lciA8PSAoRklYUF9EQkwpMCkgeworICAgICAgICAgIGVuZXIgPSAoRklYUF9EQkwpMTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG1wIDw9IChGSVhQX0RCTCkwKSB7CisgICAgICAgICAgdG1wID0gKEZJWFBfREJMKTE7CisgICAgICAgIH0KKyAgICAgICAgRkRLX0FTU0VSVChlbmVyID4gKEZJWFBfREJMKTApOworCisgICAgICAgIC8qIHRtcCA9IHNxcnQodG1wL2VuZXIpICovCisgICAgICAgIGludCByZXN1bHRfZSA9IDA7CisgICAgICAgIHRtcDEgPSBmRGl2Tm9ybSh0bXAsIGVuZXIsICZyZXN1bHRfZSk7CisgICAgICAgIGlmIChyZXN1bHRfZSAmIDEpIHsKKyAgICAgICAgICB0bXAxID4+PSAxOworICAgICAgICAgIHJlc3VsdF9lICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgdG1wID0gc3FydEZpeHAodG1wMSk7CisgICAgICAgIHJlc3VsdF9lID4+PSAxOworCisgICAgICAgIGdhaW5fZXhwID0gMTc7CisKKyAgICAgICAgZGlmZiA9IHJlc3VsdF9lIC0gZ2Fpbl9leHA7CisKKyAgICAgICAgRklYUF9EQkwgZ2FpbjEgPSBnYWluOworCisgICAgICAgIGlmIChkaWZmID49IDApIHsKKyAgICAgICAgICBkaWZmID0gZk1pbihkaWZmLCAzMSk7CisgICAgICAgICAgZ2FpbjEgPj49IGRpZmY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0X2UgKz0gKC1kaWZmKTsKKyAgICAgICAgICBkaWZmID0gZk1heChkaWZmLCAtMzEpOworICAgICAgICAgIHRtcCA+Pj0gKC1kaWZmKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0bXAgPCBnYWluMSkgeworICAgICAgICAgIGdhaW4gPSB0bXA7CisgICAgICAgICAgZ2Fpbl9leHAgPSByZXN1bHRfZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBjYWxjdWxhdGUgbm9pc2UgYmFzZWQgb24gdm9pY2VkIHBpdGNoICovCisgICAgICAvKiBmTXVsdERpdjIoKSByZXBsYWNlcyB3ZWlnaHRpbmcgb2YgZ2FpbiB3aXRoIDAuNSAqLworICAgICAgZGlmZiA9IGdhaW5fZXhwIC0gMTc7CisgICAgICBpZiAoZGlmZiA+PSAwKSB7CisgICAgICAgIGdhaW4gPDw9IGRpZmY7CisgICAgICB9IGVsc2UgeworICAgICAgICBnYWluID4+PSAoLWRpZmYpOworICAgICAgfQorCisgICAgICBzMSA9IENudExlYWRpbmdaZXJvcyhnYWluKSAtIDE7CisgICAgICBzMSAtPSAxNjsgLyogTGVhZGluZyBiaXRzIGZvciBTR0wgKi8KKworICAgICAgRklYUF9TR0wgZ2FpblNHTCA9IEZYX0RCTDJGWF9TR0woZ2FpbiA8PCAxNik7CisKKyAgICAgIGdhaW5TR0wgPSBnYWluU0dMIDw8IHMxOworCisgICAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZzsgaSsrKSB7CisgICAgICAgICAgLyogc2NhbGVkIHdpdGggU0ZfU1lOVEggKyBnYWluX3NmICsgMSAqLworICAgICAgICAgIG5vaXNlX2luW2ldID0KKyAgICAgICAgICAgICAgKGZNdWx0KGdhaW5TR0wsIHN5bltpICsgaV9zdWJmcl0gLSAoc3luW2kgKyBpX3N1YmZyIC0gVF0gPj4gMSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzeW5baSArIGlfc3ViZnIgKyBUXSA+PiAxKSkpID4+CisgICAgICAgICAgICAgIHMxOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gbGc7IGkgPCBMX1NVQkZSOyBpKyspIHsKKyAgICAgICAgICAvKiBzY2FsZWQgd2l0aCBTRl9TWU5USCArIGdhaW5fc2YgKyAxICovCisgICAgICAgICAgbm9pc2VfaW5baV0gPQorICAgICAgICAgICAgICAoZk11bHQoZ2FpblNHTCwgc3luW2kgKyBpX3N1YmZyXSAtIHN5bltpICsgaV9zdWJmciAtIFRdKSkgPj4gczE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgRkRLbWVtc2V0KG5vaXNlX2luLCAoRklYUF9EQkwpMCwgTF9TVUJGUiAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIH0KKworICAgIHsKKyAgICAgIEZES21lbWNweShub2lzZV9idWYsIG1lbV9icGYsIChMX0ZJTFQgKyBMX1NVQkZSKSAqIHNpemVvZihGSVhQX0RCTCkpOworCisgICAgICBGREttZW1jcHkobWVtX2JwZiwgbm9pc2VfYnVmICsgTF9TVUJGUiwKKyAgICAgICAgICAgICAgICAoTF9GSUxUICsgTF9TVUJGUikgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICB9CisKKyAgICAvKiBzdWJzdHJhY3QgZnJvbSB2b2ljZWQgc3BlZWNoIGxvdy1wYXNzIGZpbHRlcmVkIG5vaXNlICovCisgICAgLyogZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgc2NhbGVkIHdpdGggZmFjdG9yIFNGX0ZJTFRfTFAgKDEpICovCisKKyAgICB7CisgICAgICBmaWx0TFAoJnN5bltpX3N1YmZyIC0gTF9TVUJGUl0sICZzeW50aF9vdXRbaV9zdWJmcl0sIG5vaXNlLAorICAgICAgICAgICAgIGZka19kZWNfZmlsdF9scCwgTF9TVUJGUiwgTF9GSUxUKTsKKyAgICB9CisgIH0KKworICB7CisKKyAgfQorCisgIC8vIFRvIGJlIGRldGVybWluZWQgKGluZm8gZnJvbSBCZW4pCisgIHsKKyAgICAvKiBPdXRwdXQgc2NhbGluZyBvZiB0aGUgQlBGIG1lbW9yeSAqLworICAgIHNjYWxlVmFsdWVzKG1lbV9icGYsIChMX0ZJTFQgKyBMX1NVQkZSKSwgLTEpOworICAgIC8qIENvcHkgdGhlIHJlc3Qgb2YgdGhlIHNpZ25hbCAoYWZ0ZXIgdGhlIGZhYykgKi8KKyAgICBzY2FsZVZhbHVlc1NhdHVyYXRlKChGSVhQX1BDTSAqKSZzeW50aF9vdXRbbF9mcmFtZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwgKikmc3luW2xfZnJhbWUgLSBMX1NVQkZSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZV9sZW5ndGggLSBsX2ZyYW1lKSwgTURDVF9PVVRfSEVBRFJPT00pOworICB9CisKKyAgcmV0dXJuOworfQorCisvKgorICogRnJlcXVlbmN5IERvbWFpbiBOb2lzZSBTaGFwaW5nCisgKi8KKworLyoqCisgKiBcYnJpZWYgQWRhcHRpdmUgTG93IEZyZXF1ZW5jaWVzIERlZW1waGFzaXMgb2Ygc3BlY3RyYWwgY29lZmZpY2llbnRzLgorICoKKyAqIEVuc3VyZSBxdWFudGl6YXRpb24gb2YgbG93IGZyZXF1ZW5jaWVzIGluIGNhc2Ugd2hlcmUgdGhlCisgKiBzaWduYWwgZHluYW1pYyBpcyBoaWdoZXIgdGhhbiB0aGUgTFBDIG5vaXNlIHNoYXBpbmcuCisgKiBUaGlzIGlzIHRoZSBpbnZlcnNlIG9wZXJhdGlvbiBvZiBhZGFwX2xvd19mcmVxX2VtcGgoKS4KKyAqIE91dHB1dCBnYWluIG9mIGFsbCBibG9ja3MuCisgKgorICogXHBhcmFtIHggcG9pbnRlciB0byB0aGUgc3BlY3RyYWwgY29lZmZpY2llbnRzLCByZXF1aXJlcyAxIGJpdCBoZWFkcm9vbS4KKyAqIFxwYXJhbSBsZyBsZW5ndGggb2YgeC4KKyAqIFxwYXJhbSBiVXNlTmV3QWxmZSBpZiBzZXQsIGFwcGx5IEFMRkQgZm9yIGZ1bGxiYW5kIGxwZC4KKyAqIFxwYXJhbSBnYWluTHBjMSBwb2ludGVyIHRvIGdhaW4gYmFzZWQgb24gb2xkIGlucHV0IExQQyBjb2VmZmljaWVudHMuCisgKiBccGFyYW0gZ2FpbkxwYzIgcG9pbnRlciB0byBnYWluIGJhc2VkIG9uIG5ldyBpbnB1dCBMUEMgY29lZmZpY2llbnRzLgorICogXHBhcmFtIGFsZmRfZ2FpbnMgcG9pbnRlciB0byBvdXRwdXQgZ2FpbnMuCisgKiBccGFyYW0gcyBjdXJyZW50IHNjYWxlIHNoaWZ0IGZhY3RvciBvZiB4LgorICovCisjZGVmaW5lIEFMRkRQT1cyX1NDQUxFIDMKKy8qc3RhdGljKi8KK3ZvaWQgQ0xwZF9BZGFwdExvd0ZyZXFEZWVtcGgoRklYUF9EQkwgeFtdLCBpbnQgbGcsIEZJWFBfREJMIGFsZmRfZ2FpbnNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHMpIHsKKyAgeworICAgIGludCBpLCBqLCBrLCBpX21heDsKKyAgICBGSVhQX0RCTCBtYXgsIGZhYzsKKyAgICAvKiBOb3RlOiBUaGlzIHN0YWNrIGFycmF5IHNhdmVzIHRlbXBvcmFyeSBhY2N1bXVsYXRpb24gcmVzdWx0cyB0byBiZSB1c2VkIGluCisgICAgICogYSBzZWNvbmQgcnVuICovCisgICAgLyogICAgICAgVGhlIHNpemUgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gKDEwMjQvNCkvOD0zMiAqLworICAgIEZJWFBfREJMIHRtcF9wb3cyWzMyXTsKKworICAgIHMgPSBzICogMiArIEFMRkRQT1cyX1NDQUxFOworCisgICAgayA9IDg7CisgICAgaV9tYXggPSBsZyAvIDQ7IC8qIEFMRkQgcmFuZ2UgPSAxNjAwSHogKGxnID0gNjQwMEh6KSAqLworCisgICAgLyogZmluZCBzcGVjdHJhbCBwZWFrICovCisgICAgbWF4ID0gRkwyRlhfREJMKDAuMDFmKSA+PiBzOworICAgIGZvciAoaSA9IDA7IGkgPCBpX21heDsgaSArPSBrKSB7CisgICAgICBGSVhQX0RCTCB0bXA7CisKKyAgICAgIHRtcCA9IEZJWFBfREJMKDApOworICAgICAgRklYUF9EQkwgKnBYID0gJnhbaV07CisKKyAgICAgIGogPSA4OworICAgICAgZG8geworICAgICAgICBGSVhQX0RCTCB4MCA9ICpwWCsrOworICAgICAgICBGSVhQX0RCTCB4MSA9ICpwWCsrOworICAgICAgICB4MCA9IGZQb3cyRGl2Mih4MCk7CisgICAgICAgIHgxID0gZlBvdzJEaXYyKHgxKTsKKyAgICAgICAgdG1wID0gdG1wICsgKHgwID4+IChBTEZEUE9XMl9TQ0FMRSAtIDEpKTsKKyAgICAgICAgdG1wID0gdG1wICsgKHgxID4+IChBTEZEUE9XMl9TQ0FMRSAtIDEpKTsKKyAgICAgIH0gd2hpbGUgKChqID0gaiAtIDIpICE9IDApOworICAgICAgdG1wID0gZk1heCh0bXAsIChGTDJGWF9EQkwoMC4wMWYpID4+IHMpKTsKKyAgICAgIHRtcF9wb3cyW2kgPj4gM10gPSB0bXA7CisgICAgICBpZiAodG1wID4gbWF4KSB7CisgICAgICAgIG1heCA9IHRtcDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBkZWVtcGhhc2lzIG9mIGFsbCBibG9ja3MgYmVsb3cgdGhlIHBlYWsgKi8KKyAgICBmYWMgPSBGTDJGWF9EQkwoMC4xZikgPj4gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaV9tYXg7IGkgKz0gaykgeworICAgICAgRklYUF9EQkwgdG1wOworICAgICAgSU5UIHNoaWZ0aTsKKworICAgICAgdG1wID0gdG1wX3BvdzJbaSA+PiAzXTsKKworICAgICAgLyogdG1wID0gKGZsb2F0KXNxcnQodG1wL21heCk7ICovCisKKyAgICAgIC8qIHZhbHVlIG9mIHRtcCBpcyBiZXR3ZWVuIDgvMiptYXheMiBhbmQgbWF4XjIgLyAyLiAqLworICAgICAgLyogcmVxdWlyZWQgc2hpZnQgZmFjdG9yIG9mIGRpdmlzaW9uIGNhbiBncm93IHVwIHRvIDI3CisgICAgICAgICAoZ3Jvd3MgZXhwb25lbnRpYWxseSBmb3IgdmFsdWVzIHRvd2FyZCB6ZXJvKQorICAgICAgICAgdGh1cyB1c2luZyBub3JtYWxpemVkIGRpdmlzaW9uIHRvIGFzc3VyZSB2YWxpZCByZXN1bHQuICovCisgICAgICB7CisgICAgICAgIElOVCBzZDsKKworICAgICAgICBpZiAodG1wICE9IChGSVhQX0RCTCkwKSB7CisgICAgICAgICAgdG1wID0gZkRpdk5vcm0obWF4LCB0bXAsICZzZCk7CisgICAgICAgICAgaWYgKHNkICYgMSkgeworICAgICAgICAgICAgc2QrKzsKKyAgICAgICAgICAgIHRtcCA+Pj0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdG1wID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgICAgICAgc2QgPSAwOworICAgICAgICB9CisgICAgICAgIHRtcCA9IGludlNxcnROb3JtMih0bXAsICZzaGlmdGkpOworICAgICAgICB0bXAgPSBzY2FsZVZhbHVlKHRtcCwgc2hpZnRpIC0gMSAtIChzZCAvIDIpKTsKKyAgICAgIH0KKyAgICAgIGlmICh0bXAgPiBmYWMpIHsKKyAgICAgICAgZmFjID0gdG1wOworICAgICAgfQorICAgICAgRklYUF9EQkwgKnBYID0gJnhbaV07CisKKyAgICAgIGogPSA4OworICAgICAgZG8geworICAgICAgICBGSVhQX0RCTCB4MCA9IHBYWzBdOworICAgICAgICBGSVhQX0RCTCB4MSA9IHBYWzFdOworICAgICAgICB4MCA9IGZNdWx0RGl2Mih4MCwgZmFjKTsKKyAgICAgICAgeDEgPSBmTXVsdERpdjIoeDEsIGZhYyk7CisgICAgICAgIHgwID0geDAgPDwgMjsKKyAgICAgICAgeDEgPSB4MSA8PCAyOworICAgICAgICAqcFgrKyA9IHgwOworICAgICAgICAqcFgrKyA9IHgxOworCisgICAgICB9IHdoaWxlICgoaiA9IGogLSAyKSAhPSAwKTsKKyAgICAgIC8qIFN0b3JlIGdhaW5zIGZvciBGQUMgKi8KKyAgICAgICphbGZkX2dhaW5zKysgPSBmYWM7CisgICAgfQorICB9Cit9CisKKy8qKgorICogXGJyaWVmIEludGVycG9sYXRlZCBOb2lzZSBTaGFwaW5nIGZvciBtZGN0IGNvZWZmaWNpZW50cy4KKyAqIFRoaXMgYWxnb3JpdGhtIHNoYXBlcyB0ZW1wb3JhbGx5IHRoZSBzcGVjdHJhbCBub2lzZSBiZXR3ZWVuCisgKiB0aGUgdHdvIHNwZWN0cmFsIG5vaXNlIHJlcHJlc2VudGlvbiAoRkROU19OUFRTIG9mIHJlc29sdXRpb24pLgorICogVGhlIG5vaXNlIGlzIHNoYXBlZCBtb25vdG9uaWNhbGx5IGJldHdlZW4gdGhlIHR3byBwb2ludHMKKyAqIHVzaW5nIGEgY3VydmVkIHNoYXBlIHRvIGZhdm9yIHRoZSBsb3dlciBnYWluIGluIG1pZC1mcmFtZS4KKyAqIE9ERlQgYW5kIGFtcGxpdHVkIGNhbGN1bGF0aW9uIGFyZSBhcHBsaWVkIHRvIHRoZSAyIExQQyBjb2VmZmljaWVudHMgZmlyc3QuCisgKgorICogXHBhcmFtIHIgcG9pbnRlciB0byBzcGVjdHJ1bSBkYXRhLgorICogXHBhcmFtIHJtcyBSTVMgb2Ygb3V0cHV0IHNwZWN0cnVtLgorICogXHBhcmFtIGxnIGxlbmd0aCBvZiByLgorICogXHBhcmFtIEExIHBvaW50ZXIgdG8gb2xkIGlucHV0IExQQyBjb2VmZmljaWVudHMgb2YgbGVuZ3RoIE1fTFBfRklMVEVSX09SREVSCisgKiBzY2FsZWQgYnkgU0ZfQV9DT0VGRlMuCisgKiBccGFyYW0gQTIgcG9pbnRlciB0byBuZXcgaW5wdXQgTFBDIGNvZWZmaWNpZW50cyBvZiBsZW5ndGggTV9MUF9GSUxURVJfT1JERVIKKyAqIHNjYWxlZCBieSBTRl9BX0NPRUZGUy4KKyAqIFxwYXJhbSBiTHBjMk1kY3QgZmxhZ3MgY29udHJvbCBscGMybWRjdCBjb252ZXJzaW9uIGFuZCBub2lzZSBzaGFwaW5nLgorICogXHBhcmFtIGdhaW5McGMxIHBvaW50ZXIgdG8gZ2FpbiBiYXNlZCBvbiBvbGQgaW5wdXQgTFBDIGNvZWZmaWNpZW50cy4KKyAqIFxwYXJhbSBnYWluTHBjMiBwb2ludGVyIHRvIGdhaW4gYmFzZWQgb24gbmV3IGlucHV0IExQQyBjb2VmZmljaWVudHMuCisgKiBccGFyYW0gZ0xwY19lIHBvaW50ZXIgdG8gZXhwb25lbnQgb2YgZ2FpbkxwYzEgYW5kIGdhaW5McGMyLgorICovCisvKiBzdGF0aWMgKi8KKyNkZWZpbmUgTlNIQVBFX1NDQUxFICg0KQorCisjZGVmaW5lIExQQzJNRENUX0NBTEMgKDEpCisjZGVmaW5lIExQQzJNRENUX0dBSU5fTE9BRCAoMikKKyNkZWZpbmUgTFBDMk1EQ1RfR0FJTl9TQVZFICg0KQorI2RlZmluZSBMUEMyTURDVF9BUFBMWV9OU0hBUEUgKDgpCisKK3ZvaWQgbHBjMm1kY3RBbmROb2lzZVNoYXBpbmcoRklYUF9EQkwgKnIsIFNIT1JUICpwU2NhbGUsIGNvbnN0IElOVCBsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGZkbnNfbnB0cywgY29uc3QgRklYUF9MUEMgKkExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgQTFfZXhwLCBjb25zdCBGSVhQX0xQQyAqQTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBBMl9leHApIHsKKyAgRklYUF9EQkwgKnRtcDIgPSBOVUxMOworICBGSVhQX0RCTCBycl9taW51c19vbmU7CisgIGludCBpLCBrLCBzLCBzdGVwOworCisgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQodG1wMSwgRklYUF9EQkwsIEZETlNfTlBUUyAqIDgpCisKKyAgeworICAgIHRtcDIgPSB0bXAxICsgZmRuc19ucHRzICogNDsKKworICAgIC8qIGxwYzJtZGN0KCkgKi8KKworICAgIC8qIE9ERlQuIEVfTFBDX2Ffd2VpZ2h0KCkgZm9yIEExIGFuZCBBMiB2ZWN0b3JzIGlzIGluY2x1ZGVkIGludG8gdGhlIGxvb3AKKyAgICAgKiBiZWxvdy4gKi8KKyAgICBGSVhQX0RCTCBmID0gRkwyRlhDT05TVF9EQkwoMC45MmYpOworCisgICAgY29uc3QgRklYUF9TVFAgKlNpblRhYjsKKyAgICBpbnQga19zdGVwOworICAgIC8qIG5lZWRlZCB2YWx1ZXM6IHNpbihwaGkpLCBjb3MocGhpKTsgcGhpID0gaSpQSS8oMipmZG5zX25wdHMpLCBpID0gMCAuLi4KKyAgICAgKiBNX0xQX0ZJTFRFUl9PUkRFUiAqLworICAgIHN3aXRjaCAoZmRuc19ucHRzKSB7CisgICAgICBjYXNlIDY0OgorICAgICAgICBTaW5UYWIgPSBTaW5lVGFibGU1MTI7CisgICAgICAgIGtfc3RlcCA9ICg1MTIgLyA2NCk7CisgICAgICAgIEZES19BU1NFUlQoNTEyID49IDY0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ4OgorICAgICAgICBTaW5UYWIgPSBTaW5lVGFibGUzODQ7CisgICAgICAgIGtfc3RlcCA9IDM4NCAvIDQ4OworICAgICAgICBGREtfQVNTRVJUKDM4NCA+PSA0OCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaSA9IDAsIGsgPSBrX3N0ZXA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrLCBrICs9IGtfc3RlcCkgeworICAgICAgRklYUF9TVFAgY3MgPSBTaW5UYWJba107CisgICAgICBGSVhQX0RCTCB3QTEsIHdBMjsKKworICAgICAgd0ExID0gZk11bHQoQTFbaV0sIGYpOworICAgICAgd0EyID0gZk11bHQoQTJbaV0sIGYpOworCisgICAgICAvKiByW2ldID0gQVtpXSpjb3MoKSAqLworICAgICAgdG1wMVsyICsgaSAqIDJdID0gZk11bHQod0ExLCBjcy52LnJlKTsKKyAgICAgIHRtcDJbMiArIGkgKiAyXSA9IGZNdWx0KHdBMiwgY3Mudi5yZSk7CisgICAgICAvKiBpW2ldID0gQVtpXSpzaW4oKSAqLworICAgICAgdG1wMVszICsgaSAqIDJdID0gLWZNdWx0KHdBMSwgY3Mudi5pbSk7CisgICAgICB0bXAyWzMgKyBpICogMl0gPSAtZk11bHQod0EyLCBjcy52LmltKTsKKworICAgICAgZiA9IGZNdWx0KGYsIEZMMkZYQ09OU1RfREJMKDAuOTJmKSk7CisgICAgfQorCisgICAgLyogR3VhcmFudGVlIGF0IGxlYXN0IDIgYml0cyBvZiBoZWFkcm9vbSBmb3IgdGhlIEZGVCAqLworICAgIC8qICIzIiBzdGFuZHMgZm9yIDEuMCB3aXRoIDIgYml0cyBvZiBoZWFkcm9vbTsgKEExX2V4cCArIDIpIGd1YXJhbnRlc3MgMgorICAgICAqIGJpdHMgb2YgaGVhZHJvb20gaWYgQTFfZXhwID4gMSAqLworICAgIGludCBBMV9leHBfZml4ID0gZk1heCgzLCBBMV9leHAgKyAyKTsKKyAgICBpbnQgQTJfZXhwX2ZpeCA9IGZNYXgoMywgQTJfZXhwICsgMik7CisKKyAgICAvKiBTZXQgMS4wIGluIHRoZSBwcm9wZXIgZm9ybWF0ICovCisgICAgdG1wMVswXSA9IChGSVhQX0RCTCkoSU5UKSgoVUxPTkcpMHg4MDAwMDAwMCA+PiBBMV9leHBfZml4KTsKKyAgICB0bXAyWzBdID0gKEZJWFBfREJMKShJTlQpKChVTE9ORykweDgwMDAwMDAwID4+IEEyX2V4cF9maXgpOworCisgICAgdG1wMVsxXSA9IHRtcDJbMV0gPSAoRklYUF9EQkwpMDsKKworICAgIC8qIENsZWFyIHRoZSByZXN0byBvZiB0aGUgYXJyYXkgKi8KKyAgICBGREttZW1jbGVhcigKKyAgICAgICAgdG1wMSArIDIgKiAoTV9MUF9GSUxURVJfT1JERVIgKyAxKSwKKyAgICAgICAgMiAqIChmZG5zX25wdHMgKiAyIC0gKE1fTFBfRklMVEVSX09SREVSICsgMSkpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY2xlYXIoCisgICAgICAgIHRtcDIgKyAyICogKE1fTFBfRklMVEVSX09SREVSICsgMSksCisgICAgICAgIDIgKiAoZmRuc19ucHRzICogMiAtIChNX0xQX0ZJTFRFUl9PUkRFUiArIDEpKSAqIHNpemVvZihGSVhQX0RCTCkpOworCisgICAgLyogR3VhcmFudGVlIDIgYml0cyBvZiBoZWFkcm9vbSBmb3IgRkZUICovCisgICAgc2NhbGVWYWx1ZXMoJnRtcDFbMl0sICgyICogTV9MUF9GSUxURVJfT1JERVIpLCAoQTFfZXhwIC0gQTFfZXhwX2ZpeCkpOworICAgIHNjYWxlVmFsdWVzKCZ0bXAyWzJdLCAoMiAqIE1fTFBfRklMVEVSX09SREVSKSwgKEEyX2V4cCAtIEEyX2V4cF9maXgpKTsKKworICAgIElOVCBzMjsKKyAgICBzID0gQTFfZXhwX2ZpeDsKKyAgICBzMiA9IEEyX2V4cF9maXg7CisKKyAgICBmZnQoMiAqIGZkbnNfbnB0cywgdG1wMSwgJnMpOworICAgIGZmdCgyICogZmRuc19ucHRzLCB0bXAyLCAmczIpOworCisgICAgLyogQWRqdXN0IHRoZSBleHBvbmVudHMgb2YgYm90aCBmZnQgb3V0cHV0cyBpZiBuZWNlc3NhcnkqLworICAgIGlmIChzID4gczIpIHsKKyAgICAgIHNjYWxlVmFsdWVzKHRtcDIsIDIgKiBmZG5zX25wdHMsIHMyIC0gcyk7CisgICAgICBzMiA9IHM7CisgICAgfSBlbHNlIGlmIChzIDwgczIpIHsKKyAgICAgIHNjYWxlVmFsdWVzKHRtcDEsIDIgKiBmZG5zX25wdHMsIHMgLSBzMik7CisgICAgICBzID0gczI7CisgICAgfQorCisgICAgRkRLX0FTU0VSVChzID09IHMyKTsKKyAgfQorCisgIC8qIEdldCBhbXBsaXR1ZGUgYW5kIGFwcGx5IGdhaW5zICovCisgIHN0ZXAgPSBsZyAvIGZkbnNfbnB0czsKKyAgcnJfbWludXNfb25lID0gKEZJWFBfREJMKTA7CisKKyAgZm9yIChrID0gMDsgayA8IGZkbnNfbnB0czsgaysrKSB7CisgICAgRklYUF9EQkwgZzEsIGcyLCBpbnZfZzFfZzIsIGEsIGI7CisgICAgSU5UIGludl9nMV9nMl9lOworICAgIGludCBnX2UsIHNoaWZ0OworCisgICAgeworICAgICAgRklYUF9EQkwgcmVhbCwgaW1hZzsKKyAgICAgIGludCBzaTEsIHNpMiwgc0lucHV0OworCisgICAgICByZWFsID0gdG1wMVtrICogMl07CisgICAgICBpbWFnID0gdG1wMVtrICogMiArIDFdOworICAgICAgc0lucHV0ID0gZk1heChmTWluKGZOb3JtKHJlYWwpLCBmTm9ybShpbWFnKSkgLSAxLCAwKTsKKyAgICAgIHJlYWwgPDw9IHNJbnB1dDsKKyAgICAgIGltYWcgPDw9IHNJbnB1dDsKKyAgICAgIC8qIGcxX2UgPSBzaTEgLSAyKnMvMiAqLworICAgICAgZzEgPSBpbnZTcXJ0Tm9ybTIoZlBvdzIocmVhbCkgKyBmUG93MihpbWFnKSwgJnNpMSk7CisgICAgICBzaTEgKz0gc0lucHV0OworCisgICAgICByZWFsID0gdG1wMltrICogMl07CisgICAgICBpbWFnID0gdG1wMltrICogMiArIDFdOworICAgICAgc0lucHV0ID0gZk1heChmTWluKGZOb3JtKHJlYWwpLCBmTm9ybShpbWFnKSkgLSAxLCAwKTsKKyAgICAgIHJlYWwgPDw9IHNJbnB1dDsKKyAgICAgIGltYWcgPDw9IHNJbnB1dDsKKyAgICAgIC8qIGcyX2UgPSBzaTIgLSAyKnMvMiAqLworICAgICAgZzIgPSBpbnZTcXJ0Tm9ybTIoZlBvdzIocmVhbCkgKyBmUG93MihpbWFnKSwgJnNpMik7CisgICAgICBzaTIgKz0gc0lucHV0OworCisgICAgICAvKiBQaWNrIGEgY29tbW9uIHNjYWxlIGZhY3RvciBmb3IgZzEgYW5kIGcyICovCisgICAgICBpZiAoc2kxID4gc2kyKSB7CisgICAgICAgIGcyID4+PSBzaTEgLSBzaTI7CisgICAgICAgIGdfZSA9IHNpMSAtIHM7CisgICAgICB9IGVsc2UgeworICAgICAgICBnMSA+Pj0gc2kyIC0gc2kxOworICAgICAgICBnX2UgPSBzaTIgLSBzOworICAgICAgfQorICAgIH0KKworICAgIC8qIGVuZCBvZiBscGMybWRjdCgpICovCisKKyAgICBGREtfQVNTRVJUKGcxID49IChGSVhQX0RCTCkwKTsKKyAgICBGREtfQVNTRVJUKGcyID49IChGSVhQX0RCTCkwKTsKKworICAgIC8qIG1kY3RfSW50Tm9pc2VTaGFwaW5nKCkgKi8KKyAgICB7CisgICAgICAvKiBpbnZfZzFfZzIgKiAyXmludl9nMV9nMl9lID0gMS8oZzErZzIpICovCisgICAgICBpbnZfZzFfZzIgPSAoZzEgPj4gMSkgKyAoZzIgPj4gMSk7CisgICAgICBpZiAoaW52X2cxX2cyICE9IChGSVhQX0RCTCkwKSB7CisgICAgICAgIGludl9nMV9nMiA9IGZEaXZOb3JtKEZMMkZYQ09OU1RfREJMKDAuNWYpLCBpbnZfZzFfZzIsICZpbnZfZzFfZzJfZSk7CisgICAgICAgIGludl9nMV9nMl9lID0gaW52X2cxX2cyX2UgLSBnX2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnZfZzFfZzIgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICAgICAgaW52X2cxX2cyX2UgPSAwOworICAgICAgfQorCisgICAgICBpZiAoZ19lIDwgMCkgeworICAgICAgICAvKiBhX2UgPSBnX2UgKyBpbnZfZzFfZzJfZSArIDEgKi8KKyAgICAgICAgYSA9IHNjYWxlVmFsdWUoZk11bHQoZk11bHQoZzEsIGcyKSwgaW52X2cxX2cyKSwgZ19lKTsKKyAgICAgICAgLyogYl9lID0gZ19lICsgaW52X2cxX2cyX2UgKi8KKyAgICAgICAgYiA9IGZNdWx0KGcyIC0gZzEsIGludl9nMV9nMik7CisgICAgICAgIHNoaWZ0ID0gZ19lICsgaW52X2cxX2cyX2UgKyAxIC0gTlNIQVBFX1NDQUxFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogYV9lID0gKGdfZStnX2UpICsgaW52X2cxX2cyX2UgKyAxICovCisgICAgICAgIGEgPSBmTXVsdChmTXVsdChnMSwgZzIpLCBpbnZfZzFfZzIpOworICAgICAgICAvKiBiX2UgPSAoZ19lK2dfZSkgKyBpbnZfZzFfZzJfZSAqLworICAgICAgICBiID0gc2NhbGVWYWx1ZShmTXVsdChnMiAtIGcxLCBpbnZfZzFfZzIpLCAtZ19lKTsKKyAgICAgICAgc2hpZnQgPSAoZ19lICsgZ19lKSArIGludl9nMV9nMl9lICsgMSAtIE5TSEFQRV9TQ0FMRTsKKyAgICAgIH0KKworICAgICAgZm9yIChpID0gayAqIHN0ZXA7IGkgPCAoayArIDEpICogc3RlcDsgaSsrKSB7CisgICAgICAgIEZJWFBfREJMIHRtcDsKKworICAgICAgICAvKiBycltpXSA9IDIqYSpyW2ldICsgYipycltpLTFdICovCisgICAgICAgIHRtcCA9IGZNdWx0KGEsIHJbaV0pOworICAgICAgICB0bXAgKz0gc2NhbGVWYWx1ZShmTXVsdERpdjIoYiwgcnJfbWludXNfb25lKSwgTlNIQVBFX1NDQUxFKTsKKyAgICAgICAgdG1wID0gc2NhbGVWYWx1ZVNhdHVyYXRlKHRtcCwgc2hpZnQpOworICAgICAgICBycl9taW51c19vbmUgPSB0bXA7CisgICAgICAgIHJbaV0gPSB0bXA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogZW5kIG9mIG1kY3RfSW50Tm9pc2VTaGFwaW5nKCkgKi8KKyAgeyAqcFNjYWxlICs9IE5TSEFQRV9TQ0FMRTsgfQorCisgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHRtcDEsIEZJWFBfREJMLCBGRE5TX05QVFMgKiA4KQorfQorCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGVzIHRoZSBlbmVyZ3kuCisgKiBccGFyYW0gciBwb2ludGVyIHRvIHNwZWN0cnVtLgorICogXHBhcmFtIHJzIHNjYWxlIGZhY3RvciBvZiBzcGVjdHJ1bSByLgorICogXHBhcmFtIGxnIGZyYW1lIGxlbmd0aCBpbiBhdWRpbyBzYW1wbGVzLgorICogXHBhcmFtIHJtc19lIHBvaW50ZXIgdG8gZXhwb25lbnQgb2YgZW5lcmd5IHZhbHVlLgorICogXHJldHVybiBtYW50aXNzYSBvZiBlbmVyZ3kgdmFsdWUuCisgKi8KK3N0YXRpYyBGSVhQX0RCTCBjYWxjRW5lcmd5KGNvbnN0IEZJWFBfREJMICpyLCBjb25zdCBTSE9SVCBycywgY29uc3QgSU5UIGxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpybXNfZSkgeworICBpbnQgaGVhZHJvb20gPSBnZXRTY2FsZWZhY3RvcihyLCBsZyk7CisKKyAgRklYUF9EQkwgcm1zX20gPSAwOworCisgIC8qIENhbGN1bGF0ZSBudW1iZXIgb2YgZ3Jvd3RoIGJpdHMgZHVlIHRvIGFkZGl0aW9uICovCisgIElOVCBzaGlmdCA9IChJTlQpKGZOb3JteigoRklYUF9EQkwpbGcpKTsKKyAgc2hpZnQgPSAzMSAtIHNoaWZ0OworCisgIC8qIEdlbmVyYXRlIDFlLTIgaW4gUS02LjM3ICovCisgIGNvbnN0IEZJWFBfREJMIHZhbHVlMF8wMSA9IDB4NTFlYjg1MWU7CisgIGNvbnN0IElOVCB2YWx1ZTBfMDFfZXhwID0gLTY7CisKKyAgLyogRmluZCB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdGluZyBlbmVyZ3kgdmFsdWUgKi8KKyAgKnJtc19lID0gKChycyAtIGhlYWRyb29tKSA8PCAxKSArIHNoaWZ0ICsgMTsKKworICBJTlQgZGVsdGEgPSAqcm1zX2UgLSB2YWx1ZTBfMDFfZXhwOworICBpZiAoZGVsdGEgPiAwKSB7CisgICAgLyogTGltaXQgc2hpZnRfdG8gMzEqLworICAgIGRlbHRhID0gZk1pbigzMSwgZGVsdGEpOworICAgIHJtc19tID0gdmFsdWUwXzAxID4+IGRlbHRhOworICB9IGVsc2UgeworICAgIHJtc19tID0gdmFsdWUwXzAxOworICAgICpybXNfZSA9IHZhbHVlMF8wMV9leHA7CisgICAgc2hpZnQgPSBzaGlmdCAtIGRlbHRhOworICAgIC8qIExpbWl0IHNoaWZ0X3RvIDMxKi8KKyAgICBzaGlmdCA9IGZNaW4oMzEsIHNoaWZ0KTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGc7IGkrKykgeworICAgIHJtc19tICs9IGZQb3cyRGl2MihyW2ldIDw8IGhlYWRyb29tKSA+PiBzaGlmdDsKKyAgfQorCisgIHJldHVybiBybXNfbTsKK30KKworLyoqCisgKiBcYnJpZWYgVENYIGdhaW4gY2FsY3VsYXRpb24uCisgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBjaGFubmVsIGNvbnRleHQgZGF0YS4KKyAqIFxwYXJhbSByIG91dHB1dCBzcGVjdHJ1bS4KKyAqIFxwYXJhbSBybXNfZSBwb2ludGVyIHRvIG1hbnRpc3NhIG9mIGVuZXJneSB2YWx1ZS4KKyAqIFxwYXJhbSBybXNfZSBwb2ludGVyIHRvIGV4cG9uZW50IG9mIGVuZXJneSB2YWx1ZS4KKyAqIFxwYXJhbSBmcmFtZSB0aGUgZnJhbWUgaW5kZXggb2YgdGhlIExQRCBzdXBlciBmcmFtZS4KKyAqIFxwYXJhbSBsZyB0aGUgZnJhbWUgbGVuZ3RoIGluIGF1ZGlvIHNhbXBsZXMuCisgKiBccGFyYW0gZ2Fpbl9tIHBvaW50ZXIgdG8gbWFudGlzc2Egb2YgVENYIGdhaW4uCisgKiBccGFyYW0gZ2Fpbl9lIHBvaW50ZXIgdG8gZXhwb25lbnQgb2YgVENYIGdhaW4uCisgKiBccGFyYW0gZWxGbGFncyBlbGVtZW50IHNwZWNpZmljIHBhcnNlciBndWlkYW5jZSBmbGFncy4KKyAqIFxwYXJhbSBsZ19mYiB0aGUgZnVsbGJhbmQgZnJhbWUgbGVuZ3RoIGluIGF1ZGlvIHNhbXBsZXMuCisgKiBccGFyYW0gSUdGX2JnbiB0aGUgSUdGIHN0YXJ0IGluZGV4LgorICovCitzdGF0aWMgdm9pZCBjYWxjVENYR2FpbihDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnIsIEZJWFBfREJMIHJtc19tLCBJTlQgcm1zX2UsIGNvbnN0IElOVCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBsZykgeworICBpZiAoKHJtc19tICE9IChGSVhQX0RCTCkwKSkgeworICAgIEZJWFBfREJMIHRjeF9nYWluX207CisgICAgSU5UIHRjeF9nYWluX2U7CisKKyAgICBDTHBkX0RlY29kZUdhaW4oJnRjeF9nYWluX20sICZ0Y3hfZ2Fpbl9lLAorICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby51c2FjCisgICAgICAgICAgICAgICAgICAgICAgICAudGN4X2dsb2JhbF9nYWluW2ZyYW1lXSk7CisKKyAgICAvKiBybXMgKiAyXnJtc19lID0gbGcvc3FydChzdW0oc3BlY14yKSkgKi8KKyAgICBpZiAocm1zX2UgJiAxKSB7CisgICAgICBybXNfbSA+Pj0gMTsKKyAgICAgIHJtc19lKys7CisgICAgfQorCisgICAgeworICAgICAgRklYUF9EQkwgZnhfbGc7CisgICAgICBJTlQgZnhfbGdfZSwgczsKKyAgICAgIElOVCBpbnZfZTsKKworICAgICAgLyogbGcgPSBmeF9sZyAqIDJeZnhfbGdfZSAqLworICAgICAgcyA9IGZOb3JtKChGSVhQX0RCTClsZyk7CisgICAgICBmeF9sZyA9IChGSVhQX0RCTClsZyA8PCBzOworICAgICAgZnhfbGdfZSA9IERGUkFDVF9CSVRTIC0gMSAtIHM7CisgICAgICAvKiAxL3NxcnQocm1zKSAqLworICAgICAgcm1zX20gPSBpbnZTcXJ0Tm9ybTIocm1zX20sICZpbnZfZSk7CisgICAgICBybXNfbSA9IGZNdWx0KHJtc19tLCBmeF9sZyk7CisgICAgICBybXNfZSA9IGludl9lIC0gKHJtc19lID4+IDEpICsgZnhfbGdfZTsKKyAgICB9CisKKyAgICB7CisgICAgICBpbnQgcyA9IGZOb3JtKHRjeF9nYWluX20pOworICAgICAgdGN4X2dhaW5fbSA9IHRjeF9nYWluX20gPDwgczsKKyAgICAgIHRjeF9nYWluX2UgLT0gczsKKyAgICB9CisKKyAgICB0Y3hfZ2Fpbl9tID0gZk11bHREaXYyKHRjeF9nYWluX20sIHJtc19tKTsKKyAgICB0Y3hfZ2Fpbl9lID0gdGN4X2dhaW5fZSArIHJtc19lOworCisgICAgLyogZ2xvYmFsX2dhaW4gKiAyXihnbG9iYWxfZ2Fpbl9lK3Jtc19lKSA9ICgxMF4oZ2xvYmFsX2dhaW4vMjgpKSAqIHJtcyAqCisgICAgICogMl5ybXNfZSAqLworICAgIHsKKyAgICAgIHsgdGN4X2dhaW5fZSArPSAxOyB9CisgICAgfQorCisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLnRjeF9nYWluW2ZyYW1lXSA9IHRjeF9nYWluX207CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLnRjeF9nYWluX2VbZnJhbWVdID0gdGN4X2dhaW5fZTsKKworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZVtmcmFtZV0gKz0gdGN4X2dhaW5fZTsKKyAgfQorfQorCisvKioKKyAqIFxicmllZiBGRE5TIGRlY29kaW5nLgorICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gY2hhbm5lbCBjb250ZXh0IGRhdGEuCisgKiBccGFyYW0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyBjaGFubmVsIGNvbnRleHQgc3RhdGljIGRhdGEuCisgKiBccGFyYW0gciBvdXRwdXQgc3BlY3RydW0uCisgKiBccGFyYW0gbGcgdGhlIGZyYW1lIGxlbmd0aCBpbiBhdWRpbyBzYW1wbGVzLgorICogXHBhcmFtIGZyYW1lIHRoZSBmcmFtZSBpbmRleCBvZiB0aGUgTFBEIHN1cGVyIGZyYW1lLgorICogXHBhcmFtIHBTY2FsZSBwb2ludGVyIHRvIGN1cnJlbnQgc2NhbGUgc2hpZnQgZmFjdG9yIG9mIHJbXS4KKyAqIFxwYXJhbSBBMSBvbGQgaW5wdXQgTFBDIGNvZWZmaWNpZW50cyBvZiBsZW5ndGggTV9MUF9GSUxURVJfT1JERVIuCisgKiBccGFyYW0gQTIgbmV3IGlucHV0IExQQyBjb2VmZmljaWVudHMgb2YgbGVuZ3RoIE1fTFBfRklMVEVSX09SREVSLgorICogXHBhcmFtIHBBbGZkR2FpbnMgcG9pbnRlciBmb3IgQUxGRCBnYWlucyBvdXRwdXQgc2NhbGVkIGJ5IDEuCisgKiBccGFyYW0gZmRuc19ucHRzIG51bWJlciBvZiBsaW5lcyAoRkROU19OUFRTKS4KKyAqIFxwYXJhbSBpbmZfbWFzayBwb2ludGVyIHRvIG5vaXNlIG1hc2suCisgKiBccGFyYW0gSUdGX3dpbl9tb2RlIElHRiB3aW5kb3cgbW9kZSAoTE9ORywgU0hPUlQsIFRDWDEwLCBUQ1gyMCkuCisgKiBccGFyYW0gZnJhbWVUeXBlIChJR0ZfRlJBTUVfRElWSVNJT05fQUFDX09SX1RDWF9MT05HIG9yCisgKiBJR0ZfRlJBTUVfRElWSVNJT05fVENYX1NIT1JUXzEpLgorICogXHBhcmFtIGVsRmxhZ3MgZWxlbWVudCBzcGVjaWZpYyBwYXJzZXIgZ3VpZGFuY2UgZmxhZ3MuCisgKiBccGFyYW0gbGdfZmIgdGhlIGZ1bGxiYW5kIGZyYW1lIGxlbmd0aCBpbiBhdWRpbyBzYW1wbGVzLgorICogXHBhcmFtIElHRl9iZ24gdGhlIElHRiBzdGFydCBpbmRleC4KKyAqIFxwYXJhbSBybXNfbSBtYW50aXNzZSBvZiBlbmVyZ3kuCisgKiBccGFyYW0gcm1zX2UgZXhwb25lbnQgb2YgZW5lcmd5LgorICovCisvKiBzdGF0aWMgKi8KK3ZvaWQgQ0xwZF9GZG5zRGVjb2RlKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgcltdLCBjb25zdCBJTlQgbGcsIGNvbnN0IElOVCBmcmFtZSwgU0hPUlQgKnBTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDIEExW01fTFBfRklMVEVSX09SREVSXSwgY29uc3QgSU5UIEExX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDIEEyW01fTFBfRklMVEVSX09SREVSXSwgY29uc3QgSU5UIEEyX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHBBbGZkR2FpbnNbTEZBQyAvIDRdLCBjb25zdCBJTlQgZmRuc19ucHRzKSB7CisgIC8qIFdlaWdodCBMUEMgY29lZmZpY2llbnRzIHVzaW5nIFJtIHZhbHVlcyAqLworICBDTHBkX0FkYXB0TG93RnJlcURlZW1waChyLCBsZywgcEFsZmRHYWlucywgKnBTY2FsZSk7CisKKyAgRklYUF9EQkwgcm1zX20gPSAoRklYUF9EQkwpMDsKKyAgSU5UIHJtc19lID0gMDsKKyAgeworICAgIC8qIENhbGN1bGF0ZSBFbmVyZ3kgKi8KKyAgICBybXNfbSA9IGNhbGNFbmVyZ3kociwgKnBTY2FsZSwgbGcsICZybXNfZSk7CisgIH0KKworICBjYWxjVENYR2FpbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCByLCBybXNfbSwgcm1zX2UsIGZyYW1lLCBsZyk7CisKKyAgLyogQXBwbHkgT0RGVCBhbmQgTm9pc2UgU2hhcGluZy4gTFAgY29lZmZpY2llbnQgKEExLCBBMikgd2VpZ2h0aW5nIGlzIGRvbmUKKyAgICogaW5zaWRlIG9uIHRoZSBmbHkuICovCisKKyAgbHBjMm1kY3RBbmROb2lzZVNoYXBpbmcociwgcFNjYWxlLCBsZywgZmRuc19ucHRzLCBBMSwgQTFfZXhwLCBBMiwgQTJfZXhwKTsKK30KKworLyoqCisgKiBmaW5kIHBpdGNoIGZvciBUQ1gyMCAodGltZSBkb21haW4pIGNvbmNlYWxtZW50LgorICovCitzdGF0aWMgaW50IGZpbmRfbXBpdGNoKEZJWFBfREJMIHhyaVtdLCBpbnQgbGcpIHsKKyAgRklYUF9EQkwgbWF4LCBwaXRjaDsKKyAgSU5UIHBpdGNoX2U7CisgIGludCBpLCBuOworCisgIG1heCA9IChGSVhQX0RCTCkwOworICBuID0gMjsKKworICAvKiBmaW5kIG1heGltdW0gYmVsb3cgNDAwSHogKi8KKyAgZm9yIChpID0gMjsgaSA8IChsZyA+PiA0KTsgaSArPSAyKSB7CisgICAgRklYUF9EQkwgdG1wID0gZlBvdzJEaXYyKHhyaVtpXSkgKyBmUG93MkRpdjIoeHJpW2kgKyAxXSk7CisgICAgaWYgKHRtcCA+IG1heCkgeworICAgICAgbWF4ID0gdG1wOworICAgICAgbiA9IGk7CisgICAgfQorICB9CisKKyAgLy8gcGl0Y2ggPSAoKGZsb2F0KWxnPDwxKS8oZmxvYXQpbjsKKyAgcGl0Y2ggPSBmRGl2Tm9ybSgoRklYUF9EQkwpbGcgPDwgMSwgKEZJWFBfREJMKW4sICZwaXRjaF9lKTsKKyAgcGl0Y2ggPj49IGZpeE1heCgwLCBERlJBQ1RfQklUUyAtIDEgLSBwaXRjaF9lIC0gMTYpOworCisgIC8qIGZpbmQgcGl0Y2ggbXVsdGlwbGUgdW5kZXIgMjBtcyAqLworICBpZiAocGl0Y2ggPj0gKEZJWFBfREJMKSgoMjU2IDw8IDE2KSAtIDEpKSB7IC8qMjMxLjBmKi8KKyAgICBuID0gMjU2OworICB9IGVsc2UgeworICAgIEZJWFBfREJMIG1waXRjaCA9IHBpdGNoOworICAgIHdoaWxlIChtcGl0Y2ggPCAoRklYUF9EQkwpKDI1NSA8PCAxNikpIHsKKyAgICAgIG1waXRjaCArPSBwaXRjaDsKKyAgICB9CisgICAgbiA9IChpbnQpKG1waXRjaCAtIHBpdGNoKSA+PiAxNjsKKyAgfQorCisgIHJldHVybiAobik7Cit9CisKKy8qKgorICogbnVtYmVyIG9mIHNwZWN0cmFsIGNvZWZmaWNpZW50cyAvIHRpbWUgZG9tYWluIHNhbXBsZXMgdXNpbmcgZnJhbWUgbW9kZSBhcworICogaW5kZXguCisgKi8KK3N0YXRpYyBjb25zdCBpbnQgbGdfdGFibGVfY2NmbFsyXVs0XSA9IHsKKyAgICB7MjU2LCAyNTYsIDUxMiwgMTAyNH0sIC8qIGNvcmVDb2RlckZyYW1lTGVuZ3RoID0gMTAyNCAqLworICAgIHsxOTIsIDE5MiwgMzg0LCA3Njh9ICAgLyogY29yZUNvZGVyRnJhbWVMZW5ndGggPSA3NjggICovCit9OworCisvKioKKyAqIFxicmllZiBEZWNvZGUgYW5kIHJlbmRlciBvbmUgTURDVC1UQ1ggZnJhbWUuCisgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBjaGFubmVsIGNvbnRleHQgZGF0YS4KKyAqIFxwYXJhbSBsZyB0aGUgZnJhbWUgbGVuZ3RoIGluIGF1ZGlvIHNhbXBsZXMuCisgKiBccGFyYW0gZnJhbWUgdGhlIGZyYW1lIGluZGV4IG9mIHRoZSBMUEQgc3VwZXIgZnJhbWUuCisgKi8KK3N0YXRpYyB2b2lkIENMcGRfVGN4RGVjb2RlKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgVUlOVCBmbGFncywKKyAgICBpbnQgbW9kLCBpbnQgbGFzdF9tb2QsIGludCBmcmFtZSwgaW50IGZyYW1lT2spIHsKKyAgRklYUF9EQkwgKnBBbGZkX2dhaW5zID0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9hbGZkX2dhaW5zOworICBVTE9ORyAqcFNlZWQgPSAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bmZSYW5kb21TZWVkOworICBpbnQgbGcgPSAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCA9PSAxMjgpCisgICAgICAgICAgICAgICA/IGxnX3RhYmxlX2NjZmxbMF1bbW9kICsgMF0KKyAgICAgICAgICAgICAgIDogbGdfdGFibGVfY2NmbFsxXVttb2QgKyAwXTsKKyAgaW50IG5leHRfZnJhbWUgPSBmcmFtZSArICgxIDw8IChtb2QgLSAxKSk7CisgIGludCBpc0Z1bGxCYW5kTHBkID0gMDsKKworICAvKiBPYnRhaW4gcltdIHZlY3RvciBieSBjb21iaW5pbmcgdGhlIHF1YW50W10gYW5kIG5vaXNlW10gdmVjdG9ycyAqLworICB7CisgICAgRklYUF9EQkwgbm9pc2VfbGV2ZWw7CisgICAgRklYUF9EQkwgKmNvZWZmcyA9CisgICAgICAgIFNQRUNfVENYKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCwgaXNGdWxsQmFuZExwZCk7CisgICAgaW50IHNjYWxlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlW2ZyYW1lXTsKKyAgICBpbnQgaSwgbmZCZ24sIG5mRW5kOworICAgIFVDSEFSIHRjeF9ub2lzZV9mYWN0b3IgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby51c2FjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGN4X25vaXNlX2ZhY3RvcltmcmFtZV07CisKKyAgICAvKiBmaW5kIHBpdGNoIGZvciBiZmkgY2FzZSAqLworICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X3BpdGNoID0gZmluZF9tcGl0Y2goY29lZmZzLCBsZyk7CisKKyAgICBpZiAoZnJhbWVPaykgeworICAgICAgLyogc3RvcmUgZm9yIGNvbmNlYWxtZW50ICovCisgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X3RjeF9ub2lzZV9mYWN0b3IgPSB0Y3hfbm9pc2VfZmFjdG9yOworICAgIH0gZWxzZSB7CisgICAgICAvKiByZXN0b3JlIGxhc3QgZnJhbWVzIHZhbHVlICovCisgICAgICB0Y3hfbm9pc2VfZmFjdG9yID0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF90Y3hfbm9pc2VfZmFjdG9yOworICAgIH0KKworICAgIG5vaXNlX2xldmVsID0KKyAgICAgICAgKEZJWFBfREJMKSgoTE9ORylGTDJGWENPTlNUX0RCTCgwLjA2MjVmKSAqICg4IC0gdGN4X25vaXNlX2ZhY3RvcikpOworICAgIG5vaXNlX2xldmVsID0gc2NhbGVWYWx1ZShub2lzZV9sZXZlbCwgLXNjYWxlKTsKKworICAgIGNvbnN0IEZJWFBfREJMIG5lZ19ub2lzZV9sZXZlbCA9IC1ub2lzZV9sZXZlbDsKKworICAgIHsKKyAgICAgIG5mQmduID0gbGcgLyA2OworICAgICAgbmZFbmQgPSBsZzsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBuZkJnbjsgaSA8IG5mRW5kIC0gNzsgaSArPSA4KSB7CisgICAgICBMT05HIHRtcDsKKworICAgICAgLyogRmlsbCBhbGwgOCBjb25zZWN1dGl2ZSB6ZXJvIGNvZWZmcyB3aXRoIG5vaXNlICovCisgICAgICB0bXAgPSBjb2VmZnNbaSArIDBdIHwgY29lZmZzW2kgKyAxXSB8IGNvZWZmc1tpICsgMl0gfCBjb2VmZnNbaSArIDNdIHwKKyAgICAgICAgICAgIGNvZWZmc1tpICsgNF0gfCBjb2VmZnNbaSArIDVdIHwgY29lZmZzW2kgKyA2XSB8IGNvZWZmc1tpICsgN107CisKKyAgICAgIGlmICh0bXAgPT0gMCkgeworICAgICAgICBmb3IgKGludCBrID0gaTsgayA8IGkgKyA4OyBrKyspIHsKKyAgICAgICAgICBVc2FjUmFuZG9tU2lnbihwU2VlZCkgPyAoY29lZmZzW2tdID0gbmVnX25vaXNlX2xldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChjb2VmZnNba10gPSBub2lzZV9sZXZlbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKChuZkVuZCAtIGkpID4KKyAgICAgICAgMCkgeyAvKiBub2lzZSBmaWxsaW5nIGZvciBsYXN0ICJiYW5kIiB3aXRoIGxlc3MgdGhhbiA4IGJpbnMgKi8KKyAgICAgIExPTkcgdG1wID0gKExPTkcpY29lZmZzW2ldOworICAgICAgaW50IGs7CisKKyAgICAgIEZES19BU1NFUlQoKG5mRW5kIC0gaSkgPCA4KTsKKyAgICAgIGZvciAoayA9IDE7IGsgPCAobmZFbmQgLSBpKTsgaysrKSB7CisgICAgICAgIHRtcCB8PSAoTE9ORyljb2VmZnNbaSArIGtdOworICAgICAgfQorICAgICAgaWYgKHRtcCA9PSAwKSB7CisgICAgICAgIGZvciAoayA9IGk7IGsgPCBuZkVuZDsgaysrKSB7CisgICAgICAgICAgVXNhY1JhbmRvbVNpZ24ocFNlZWQpID8gKGNvZWZmc1trXSA9IG5lZ19ub2lzZV9sZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoY29lZmZzW2tdID0gbm9pc2VfbGV2ZWwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgeworICAgIC8qIENvbnZlcnQgTFBDIHRvIExQIGRvbWFpbiAqLworICAgIGlmIChsYXN0X21vZCA9PSAwKSB7CisgICAgICAvKiBOb3RlOiBUaGUgY2FzZSB3aGVyZSBsYXN0X21vZCA9PSAyNTUgaXMgaGFuZGxlZCBieSBvdGhlciBtZWFucworICAgICAgICogaW4gQ0xwZENoYW5uZWxTdHJlYW1fUmVhZCgpICovCisgICAgICBFX0xQQ19mX2xzcF9hX2NvbnZlcnNpb24oCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxzcF9jb2VmZltmcmFtZV0sCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmW2ZyYW1lXSwKKyAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFtmcmFtZV0pOworICAgIH0KKworICAgIEVfTFBDX2ZfbHNwX2FfY29udmVyc2lvbigKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxzcF9jb2VmZltuZXh0X2ZyYW1lXSwKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmW25leHRfZnJhbWVdLAorICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFtuZXh0X2ZyYW1lXSk7CisKKyAgICAvKiBGRE5TIGRlY29kaW5nICovCisgICAgQ0xwZF9GZG5zRGVjb2RlKAorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICBTUEVDX1RDWChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgZnJhbWUsCisgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgsIGlzRnVsbEJhbmRMcGQpLAorICAgICAgICBsZywgZnJhbWUsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZSArIGZyYW1lLAorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZbZnJhbWVdLAorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZfZXhwW2ZyYW1lXSwKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmW25leHRfZnJhbWVdLAorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZfZXhwW25leHRfZnJhbWVdLCBwQWxmZF9nYWlucywKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCAvIDIgLyogPT0gRkROU19OUFRTKGNjZmwpICovCisgICAgKTsKKyAgfQorfQorCisvKioKKyAqIFxicmllZiBSZWFkIHRoZSB0Y3hfY29kaW5nIGJpdHN0cmVhbSBwYXJ0CisgKiBccGFyYW0gaEJzIGJpdHN0cmVhbSBoYW5kbGUgdG8gcmVhZCBmcm9tLgorICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gY2hhbm5lbCBjb250ZXh0IGluZm8gdG8gc3RvcmUgZGF0YSBpbnRvLgorICogXHBhcmFtIGxnIHRoZSBmcmFtZSBsZW5ndGggaW4gYXVkaW8gc2FtcGxlcy4KKyAqIFxwYXJhbSBmaXJzdF90Y3hfZmxhZyBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGlzIGlzIHRoZSBmaXJzdCBUQ1ggZnJhbWUuCisgKiBccGFyYW0gZnJhbWUgdGhlIGZyYW1lIGluZGV4IG9mIHRoZSBMUEQgc3VwZXIgZnJhbWUuCisgKi8KK3N0YXRpYyBBQUNfREVDT0RFUl9FUlJPUiBDTHBkX1RDWF9SZWFkKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCBpbnQgbGcsCisgICAgaW50IGZpcnN0X3RjeF9mbGFnLCBpbnQgZnJhbWUsIFVJTlQgZmxhZ3MpIHsKKyAgQUFDX0RFQ09ERVJfRVJST1IgZXJyb3JBQUMgPSBBQUNfREVDX09LOworICBBUklUSF9DT0RJTkdfRVJST1IgZXJyb3IgPSBBUklUSF9DT0RFUl9PSzsKKyAgRklYUF9EQkwgKnBTcGVjOworICBpbnQgYXJpdGhfcmVzZXRfZmxhZyA9IDA7CisgIGludCBpc0Z1bGxCYW5kTHBkID0gMDsKKworICBwU3BlYyA9IFNQRUNfVENYKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoLCBpc0Z1bGxCYW5kTHBkKTsKKworICAvKiBUQ1ggbm9pc2UgbGV2ZWwgKi8KKyAgeworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMudGN4X25vaXNlX2ZhY3RvcltmcmFtZV0gPQorICAgICAgICBGREtyZWFkQml0cyhoQnMsIDMpOworICB9CisgIC8qIFRDWCBnbG9iYWwgZ2FpbiAqLworICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby51c2FjLnRjeF9nbG9iYWxfZ2FpbltmcmFtZV0gPQorICAgICAgRkRLcmVhZEJpdHMoaEJzLCA3KTsKKworICAvKiBBcml0aG1ldGljIGNvZGVkIHJlc2lkdWFsL3NwZWN0cnVtICovCisgIGlmIChmaXJzdF90Y3hfZmxhZykgeworICAgIGlmIChmbGFncyAmIEFDX0lOREVQKSB7CisgICAgICBhcml0aF9yZXNldF9mbGFnID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgYXJpdGhfcmVzZXRfZmxhZyA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgfQorICB9CisKKyAgLyogQ0FyY29fRGVjb2RlQXJpdGhEYXRhKCkgb3V0cHV0IHNjYWxlIG9mICJwU3BlYyIgaXMgREZSQUNUX0JJVFMtMSAqLworICBlcnJvciA9IENBcmNvX0RlY29kZUFyaXRoRGF0YShwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5oQXJDbywgaEJzLCBwU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGcsIGxnLCBhcml0aF9yZXNldF9mbGFnKTsKKworICAvKiBSZXNjYWxlIHJlc2lkdWFsL3NwZWN0cnVtICovCisgIHsKKyAgICBpbnQgc2NhbGUgPSBnZXRTY2FsZWZhY3RvcihwU3BlYywgbGcpIC0gMjsgLyogTGVhdmUgMiBiaXRzIGhlYWRyb29tICovCisKKyAgICAvKiBFeHBvbmVudCBvZiBDQXJjb19EZWNvZGVBcml0aERhdGEoKSBvdXRwdXQgaXMgREZSQUNUX0JJVFM7IGludGVnZXIKKyAgICAgKiB2YWx1ZXMuICovCisgICAgc2NhbGVWYWx1ZXMocFNwZWMsIGxnLCBzY2FsZSk7CisgICAgc2NhbGUgPSBERlJBQ1RfQklUUyAtIDEgLSBzY2FsZTsKKworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZVtmcmFtZV0gPSBzY2FsZTsKKyAgfQorCisgIGlmIChlcnJvciA9PSBBUklUSF9DT0RFUl9FUlJPUikgZXJyb3JBQUMgPSBBQUNfREVDX1VOS05PV047CisKKyAgcmV0dXJuIGVycm9yQUFDOworfQorCisvKioKKyAqIFxicmllZiB0cmFuc2xhdGUgbHBkX21vZGUgaW50byB0aGUgbW9kW10gYXJyYXkgd2hpY2ggZGVzY3JpYmVzIHRoZSBtb2RlIG9mCisgKiBlYWNoIGVhY2ggTFBEIGZyYW1lCisgKiBccGFyYW0gbW9kW10gdGhlIGFycmF5IHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbW9kZSBpbmRleGVzIG9mIHRoZQorICogaW5pZGl2aWR1YWwgZnJhbWVzLgorICogXHBhcmFtIGxwZF9tb2RlIHRoZSBscGRfbW9kZSBmaWVsZCByZWFkIGZyb20gdGhlIGxwZF9jaGFubmVsX3N0cmVhbQorICovCitzdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IgQ0xwZF9SZWFkQW5kTWFwTHBkTW9kZVRvTW9kQXJyYXkoCisgICAgVUNIQVIgbW9kWzRdLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIFVJTlQgZWxGbGFncykgeworICBpbnQgbHBkX21vZGU7CisKKyAgeworICAgIGxwZF9tb2RlID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKworICAgIGlmIChscGRfbW9kZSA+IDI1IHx8IGxwZF9tb2RlIDwgMCkgeworICAgICAgcmV0dXJuIEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgfQorCisgICAgc3dpdGNoIChscGRfbW9kZSkgeworICAgICAgY2FzZSAyNToKKyAgICAgICAgLyogMSA4ME1TIGZyYW1lICovCisgICAgICAgIG1vZFswXSA9IG1vZFsxXSA9IG1vZFsyXSA9IG1vZFszXSA9IDM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyNDoKKyAgICAgICAgLyogMiA0ME1TIGZyYW1lcyAqLworICAgICAgICBtb2RbMF0gPSBtb2RbMV0gPSBtb2RbMl0gPSBtb2RbM10gPSAyOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN3aXRjaCAobHBkX21vZGUgPj4gMikgeworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIC8qIGxwZF9tb2RlIDE5IC0gMTYgID0+IDEgNDBNUyBhbmQgMiAyME1TIGZyYW1lcyAqLworICAgICAgICAgICAgbW9kWzBdID0gbW9kWzFdID0gMjsKKyAgICAgICAgICAgIG1vZFsyXSA9IChscGRfbW9kZSAmIDEpID8gMSA6IDA7CisgICAgICAgICAgICBtb2RbM10gPSAobHBkX21vZGUgJiAyKSA/IDEgOiAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgLyogbHBkX21vZGUgMjMgLSAyMCA9PiAyIDIwTVMgYW5kIDEgNDBNUyBmcmFtZXMgKi8KKyAgICAgICAgICAgIG1vZFsyXSA9IG1vZFszXSA9IDI7CisgICAgICAgICAgICBtb2RbMF0gPSAobHBkX21vZGUgJiAxKSA/IDEgOiAwOworICAgICAgICAgICAgbW9kWzFdID0gKGxwZF9tb2RlICYgMikgPyAxIDogMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBscGRfbW9kZSA8IDE2ID0+IDQgMjBNUyBmcmFtZXMgKi8KKyAgICAgICAgICAgIG1vZFswXSA9IChscGRfbW9kZSAmIDEpID8gMSA6IDA7CisgICAgICAgICAgICBtb2RbMV0gPSAobHBkX21vZGUgJiAyKSA/IDEgOiAwOworICAgICAgICAgICAgbW9kWzJdID0gKGxwZF9tb2RlICYgNCkgPyAxIDogMDsKKyAgICAgICAgICAgIG1vZFszXSA9IChscGRfbW9kZSAmIDgpID8gMSA6IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEFBQ19ERUNfT0s7Cit9CisKK3N0YXRpYyB2b2lkIENMcGRfUmVzZXQoCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIGludCBrZWVwX3Bhc3Rfc2lnbmFsKSB7CisgIGludCBpOworCisgIC8qIFJlc2V0IFRDWCAvIEFDRUxQIGNvbW1vbiBtZW1vcnkgKi8KKyAgaWYgKCFrZWVwX3Bhc3Rfc2lnbmFsKSB7CisgICAgRkRLbWVtY2xlYXIocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+b2xkX3N5bnRoLAorICAgICAgICAgICAgICAgIHNpemVvZihwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfc3ludGgpKTsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIExTRnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scGM0X2xzZltpXSA9IGZka19kZWNfbHNmX2luaXRbaV07CisgIH0KKworICAvKiBSZXNldCBtZW1vcnkgbmVlZGVkIGJ5IGJhc3MgcG9zdC1maWx0ZXIgKi8KKyAgRkRLbWVtY2xlYXIocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bWVtX2JwZiwKKyAgICAgICAgICAgICAgc2l6ZW9mKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm1lbV9icGYpKTsKKworICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfYnBmX2NvbnRyb2xfaW5mbyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBTWU5fU0ZEOyBpKyspIHsKKyAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfVF9wZltpXSA9IDY0OworICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9nYWluX3BmW2ldID0gKEZJWFBfREJMKTA7CisgIH0KKworICAvKiBSZXNldCBBQ0VMUCBtZW1vcnkgKi8KKyAgQ0xwZF9BY2VscFJlc2V0KCZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5hY2VscCk7CisKKyAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGNfbG9zdCA9IDA7ICAgICAgLyogcHJldl9scGNfbG9zdCAqLworICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X3RjeF9waXRjaCA9IExfRElWOyAvKiBwaXRjaF90Y3ggICAgICovCisgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm51bUxvc3RMcGRGcmFtZXMgPSAwOyAgIC8qIG5iTG9zdENtcHQgICAgKi8KK30KKworLyoKKyAqIEV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbnMKKyAqLworCitBQUNfREVDT0RFUl9FUlJPUiBDTHBkQ2hhbm5lbFN0cmVhbV9SZWFkKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBVSU5UIGZsYWdzKSB7CisgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yID0gQUFDX0RFQ19PSzsKKyAgaW50IGZpcnN0X3RjeF9mbGFnOworICBpbnQgaywgbmJEaXYsIGZGYWNEYXRhUHJlc2VudCwgZmlyc3RfbHBkX2ZsYWcsIGFjZWxwX2NvcmVfbW9kZSwKKyAgICAgIGZhY0dldE1lbVN0YXRlID0gMDsKKyAgVUNIQVIgKm1vZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5tb2Q7CisgIGludCBscGRfbW9kZV9sYXN0LCBwcmV2X2ZyYW1lX3dhc19scGQ7CisgIFVTQUNfQ09SRU1PREUgY29yZV9tb2RlX2xhc3Q7CisgIGNvbnN0IGludCBsZ190YWJsZV9vZmZzZXQgPSAwOworICBjb25zdCBpbnQgKmxnX3RhYmxlID0gKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGggPT0gMTI4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJmxnX3RhYmxlX2NjZmxbMF1bbGdfdGFibGVfb2Zmc2V0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmxnX3RhYmxlX2NjZmxbMV1bbGdfdGFibGVfb2Zmc2V0XTsKKyAgaW50IGxhc3RfbHBjX2xvc3QgPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwY19sb3N0OworCisgIGludCBsYXN0X2ZyYW1lX29rID0gQ0NvbmNlYWxtZW50X0dldExhc3RGcmFtZU9rKAorICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbywgMSk7CisKKyAgSU5UIGlfb2Zmc2V0OworICBVSU5UIHNhbXBsaW5nUmF0ZTsKKworICBzYW1wbGluZ1JhdGUgPSBwU2FtcGxpbmdSYXRlSW5mby0+c2FtcGxpbmdSYXRlOworCisgIGlfb2Zmc2V0ID0KKyAgICAgIChJTlQpKHNhbXBsaW5nUmF0ZSAqIFBJVF9NSU5fMTJrOCArIChGU0NBTEVfREVOT00gLyAyKSkgLyBGU0NBTEVfREVOT00gLQorICAgICAgKElOVClQSVRfTUlOXzEyazg7CisKKyAgaWYgKHBTYW1wbGluZ1JhdGVJbmZvLT5zYW1wbGluZ1JhdGUgPgorICAgICAgRkFDX0ZTQ0FMRV9NQVggLyogbWF4aW11bSBhbGxvd2VkIGNvcmUgc2FtcGxpbmcgZnJlcXVlbmN5ICovKSB7CisgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGFjZWxwX2NvcmVfbW9kZSA9IEZES3JlYWRCaXRzKGhCcywgMyk7CisKKyAgLyogbHBkX21vZGUgKi8KKyAgZXJyb3IgPSBDTHBkX1JlYWRBbmRNYXBMcGRNb2RlVG9Nb2RBcnJheShtb2QsIGhCcywgMCk7CisgIGlmIChlcnJvciAhPSBBQUNfREVDX09LKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogYnBmX2NvbnRyb2xfaW5mbyAqLworICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuYnBmX2NvbnRyb2xfaW5mbyA9IEZES3JlYWRCaXQoaEJzKTsKKworICAvKiBsYXN0X2NvcmVfbW9kZSAqLworICBwcmV2X2ZyYW1lX3dhc19scGQgPSBGREtyZWFkQml0KGhCcyk7CisgIC8qIGZhY19kYXRhX3ByZXNlbnQgKi8KKyAgZkZhY0RhdGFQcmVzZW50ID0gRkRLcmVhZEJpdChoQnMpOworCisgIC8qIFNldCB2YWxpZCB2YWx1ZXMgZnJvbQorICAgKiBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT57bGFzdF9jb3JlX21vZGUsbGFzdF9scGRfbW9kZX0gKi8KKyAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmNvcmVfbW9kZV9sYXN0ID0KKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfY29yZV9tb2RlOworICBscGRfbW9kZV9sYXN0ID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwZF9tb2RlX2xhc3QgPQorICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGRfbW9kZTsKKworICBpZiAocHJldl9mcmFtZV93YXNfbHBkID09IDApIHsKKyAgICAvKiBMYXN0IGZyYW1lIHdhcyBGRCAqLworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5jb3JlX21vZGVfbGFzdCA9IEZEX0xPTkc7CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwZF9tb2RlX2xhc3QgPSAyNTU7CisgIH0gZWxzZSB7CisgICAgLyogTGFzdCBmcmFtZSB3YXMgTFBEICovCisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmNvcmVfbW9kZV9sYXN0ID0gTFBEOworICAgIGlmICgoKG1vZFswXSA9PSAwKSAmJiBmRmFjRGF0YVByZXNlbnQpIHx8CisgICAgICAgICgobW9kWzBdICE9IDApICYmICFmRmFjRGF0YVByZXNlbnQpKSB7CisgICAgICAvKiBDdXJyZW5kIG1vZCBpcyBBQ0VMUCwgZmFjIGRhdGEgcHJlc2VudCAtPiBUQ1gsIGN1cnJlbnQgbW9kIFRDWCwgbm8gZmFjCisgICAgICAgKiBkYXRhIC0+IFRDWCAqLworICAgICAgaWYgKGxwZF9tb2RlX2xhc3QgPT0gMCkgeworICAgICAgICAvKiBCaXQgc3RyZWFtIGludGVycnVwdGlvbiBkZXRlY3RlZC4gQXNzdW1lIGxhc3QgVENYIG1vZGUgYXMgVENYMjAuICovCisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scGRfbW9kZV9sYXN0ID0gMTsKKyAgICAgIH0KKyAgICAgIC8qIEVsc2UgYXNzdW1lIHRoYXQgcmVtZW1iZXJlZCBUQ1ggbW9kZSBpcyBjb3JyZWN0LiAqLworICAgIH0gZWxzZSB7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBkX21vZGVfbGFzdCA9IDA7CisgICAgfQorICB9CisKKyAgZmlyc3RfbHBkX2ZsYWcgPSAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmNvcmVfbW9kZV9sYXN0ICE9CisgICAgICAgICAgICAgICAgICAgIExQRCk7IC8qIERlcGVuZHMgb24gYml0c3RyZWFtIGNvbmZpZ3VyYXRpb24gKi8KKyAgZmlyc3RfdGN4X2ZsYWcgPSAxOworCisgIGlmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2NvcmVfbW9kZSAhPQorICAgICAgTFBEKSB7IC8qIEFUVEVOVElPTjogUmVzZXQgZGVwZW5kcyBvbiB3aGF0IHdlIHJlbmRlcmVkIGJlZm9yZSEgKi8KKyAgICBDTHBkX1Jlc2V0KHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sIDApOworCisgICAgaWYgKCFsYXN0X2ZyYW1lX29rKSB7CisgICAgICAvKiBJZiBsYXN0IHJlbmRlcmVkIGZyYW1lIHdhcyBub3QgTFBEIGFuZCBmaXJzdCBscGQgZmxhZyBpcyBub3Qgc2V0LCB0aGlzCisgICAgICAgKiBtdXN0IGJlIGFuIGVycm9yIC0gc2V0IGxhc3RfbHBjX2xvc3QgZmxhZyAqLworICAgICAgbGFzdF9scGNfbG9zdCB8PSAoZmlyc3RfbHBkX2ZsYWcpID8gMCA6IDE7CisgICAgfQorICB9CisKKyAgY29yZV9tb2RlX2xhc3QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuY29yZV9tb2RlX2xhc3Q7CisgIGxwZF9tb2RlX2xhc3QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBkX21vZGVfbGFzdDsKKworICBuYkRpdiA9IE5CX0RJVjsKKworICAvKiBrIGlzIHRoZSBmcmFtZSBpbmRleC4gSWYgYSBmcmFtZSBpcyBvZiBzaXplIDQwTVMgb3IgODBNUywKKyAgICAgdGhpcyBmcmFtZSBpbmRleCBpcyBpbmNyZW1lbnRlZCAyIG9yIDQgaW5zdGVhZCBvZiAxIHJlc3BlY3RpdmVseS4gKi8KKworICBrID0gMDsKKyAgd2hpbGUgKGsgPCBuYkRpdikgeworICAgIC8qIFJlc2V0IEZBQyBkYXRhIHBvaW50ZXJzIGluIG9yZGVyIHRvIGF2b2lkIGFwcGx5aW5nIG9sZCByYW5kb20gRkFDIGRhdGEuCisgICAgICovCisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhW2tdID0gTlVMTDsKKworICAgIGlmICgoayA9PSAwICYmIGNvcmVfbW9kZV9sYXN0ID09IExQRCAmJiBmRmFjRGF0YVByZXNlbnQpIHx8CisgICAgICAgIChscGRfbW9kZV9sYXN0ID09IDAgJiYgbW9kW2tdID4gMCkgfHwKKyAgICAgICAgKChscGRfbW9kZV9sYXN0ICE9IDI1NSkgJiYgbHBkX21vZGVfbGFzdCA+IDAgJiYgbW9kW2tdID09IDApKSB7CisgICAgICBpbnQgZXJyOworCisgICAgICAvKiBBc3NpZ24gRkFDIG1lbW9yeSAqLworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhW2tdID0KKyAgICAgICAgICBDTHBkX0ZBQ19HZXRNZW1vcnkocEFhY0RlY29kZXJDaGFubmVsSW5mbywgbW9kLCAmZmFjR2V0TWVtU3RhdGUpOworCisgICAgICAvKiBGQUMgZm9yIChBQ0VMUCAtPiBUQ1gpIG9yIChUQ1ggLT4gQUNFTFApICovCisgICAgICBlcnIgPSBDTHBkX0ZBQ19SZWFkKAorICAgICAgICAgIGhCcywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhW2tdLAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YV9lLAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgsIC8qID09IGZhY19sZW5ndGggKi8KKyAgICAgICAgICAwLCBrKTsKKyAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobW9kW2tdID09IDApIC8qIGFjZWxwLW1vZGUgKi8KKyAgICB7CisgICAgICBpbnQgZXJyOworICAgICAgZXJyID0gQ0xwZF9BY2VscFJlYWQoCisgICAgICAgICAgaEJzLCAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmFjZWxwW2tdLCBhY2VscF9jb3JlX21vZGUsCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCAqIDggLyogY29yZUNvZGVyRnJhbWVMZW5ndGggKi8sCisgICAgICAgICAgaV9vZmZzZXQpOworICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICBscGRfbW9kZV9sYXN0ID0gMDsKKyAgICAgIGsrKzsKKyAgICB9IGVsc2UgLyogbW9kZSAhPSAwICA9PiAgVENYICovCisgICAgeworICAgICAgZXJyb3IgPSBDTHBkX1RDWF9SZWFkKGhCcywgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCBsZ190YWJsZVttb2Rba11dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3RjeF9mbGFnLCBrLCBmbGFncyk7CisKKyAgICAgIGxwZF9tb2RlX2xhc3QgPSBtb2Rba107CisgICAgICBmaXJzdF90Y3hfZmxhZyA9IDA7CisgICAgICBrICs9IDEgPDwgKG1vZFtrXSAtIDEpOworICAgIH0KKyAgICBpZiAoZXJyb3IgIT0gQUFDX0RFQ19PSykgeworICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCisgIHsKKyAgICBpbnQgZXJyOworCisgICAgLyogUmVhZCBMUEMgY29lZmZpY2llbnRzICovCisgICAgZXJyID0gQ0xwY19SZWFkKAorICAgICAgICBoQnMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5sc3BfY29lZmYsCisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwYzRfbHNmLAorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHNmX2FkYXB0aXZlX21lYW5fY2FuZCwKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmFTdGFiaWxpdHksIG1vZCwgZmlyc3RfbHBkX2ZsYWcsCisgICAgICAgIC8qIGlmIGxhc3QgbHBjNCBpcyBhdmFpbGFibGUgZnJvbSBjb25jZWFsbWVudCBkbyBub3QgZXh0cmFwb2xhdGUgbHBjMAorICAgICAgICAgICBmcm9tIGxwYzIgKi8KKyAgICAgICAgKG1vZFswXSAmIDB4MykgPyAwCisgICAgICAgICAgICAgICAgICAgICAgIDogKGxhc3RfbHBjX2xvc3QgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9jb3JlX21vZGUgIT0gTFBEKSwKKyAgICAgICAgbGFzdF9mcmFtZV9vayk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9CisKKyAgLyogYWRqdXN0IG9sZCBsc3BbXSBmb2xsb3dpbmcgdG8gYSBiYWQgZnJhbWUgKHRvIGF2b2lkIG92ZXJzaG9vdCkgKHJlZjoKKyAgICogZGVjX0xQRC5jKSAqLworICBpZiAobGFzdF9scGNfbG9zdCAmJiAhbGFzdF9mcmFtZV9vaykgeworICAgIGludCBrX25leHQ7CisgICAgayA9IDA7CisgICAgd2hpbGUgKGsgPCBuYkRpdikgeworICAgICAgaW50IGk7CisgICAgICBrX25leHQgPSBrICsgKCgobW9kW2tdICYgMHgzKSA9PSAwKSA/IDEgOiAoMSA8PCAobW9kW2tdIC0gMSkpKTsKKyAgICAgIEZJWFBfTFBDICpsc3Bfb2xkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxzcF9jb2VmZltrXTsKKyAgICAgIEZJWFBfTFBDICpsc3BfbmV3ID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxzcF9jb2VmZltrX25leHRdOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgICAgICBpZiAobHNwX25ld1tpXSA8IGxzcF9vbGRbaV0pIHsKKyAgICAgICAgICBsc3Bfb2xkW2ldID0gbHNwX25ld1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgayA9IGtfbmV4dDsKKyAgICB9CisgIH0KKworICBpZiAoIUNDb25jZWFsbWVudF9HZXRMYXN0RnJhbWVPaygKKyAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLCAxKSkgeworICAgIEVfTFBDX2ZfbHNwX2FfY29udmVyc2lvbigKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxzcF9jb2VmZlswXSwKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmWzBdLAorICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFswXSk7CisgIH0gZWxzZSBpZiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGRfbW9kZSAhPSAwKSB7CisgICAgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGUgPT0gMjU1KSB7CisgICAgICAvKiBXZSBuZWVkIGl0IGZvciBUQ1ggZGVjb2Rpbmcgb3IgQUNFTFAgZXhjaXRhdGlvbiB1cGRhdGUgKi8KKyAgICAgIEVfTFBDX2ZfbHNwX2FfY29udmVyc2lvbigKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHNwX2NvZWZmWzBdLAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZlswXSwKKyAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFswXSk7CisgICAgfSBlbHNlIHsgLyogbGFzdF9scGRfbW9kZSB3YXMgVENYICovCisgICAgICAvKiBDb3B5IG9sZCBMUEM0IExQIGRvbWFpbiBjb2VmZmljaWVudHMgdG8gTFBDMCBMUCBkb21haW4gYnVmZmVyICh0byBhdm9pZAorICAgICAgICogY29udmVydGluZyBMU1AgY29lZmZpY2llbnRzIGFnYWluKS4gKi8KKyAgICAgIEZES21lbWNweShwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZbMF0sCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBfY29lZmZfb2xkWzBdLAorICAgICAgICAgICAgICAgIE1fTFBfRklMVEVSX09SREVSICogc2l6ZW9mKEZJWFBfTFBDKSk7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZfZXhwWzBdID0KKyAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scF9jb2VmZl9vbGRfZXhwWzBdOworICAgIH0KKyAgfSAvKiBjYXNlIGxhc3RfbHBkX21vZGUgd2FzIEFDRUxQIGlzIGhhbmRsZWQgYnkgQ0xwZF9UY3hEZWNvZGUoKSAqLworCisgIGlmIChmRmFjRGF0YVByZXNlbnQgJiYgKGNvcmVfbW9kZV9sYXN0ICE9IExQRCkpIHsKKyAgICBpbnQgcHJldl9mcmFtZV93YXNfc2hvcnQ7CisKKyAgICBwcmV2X2ZyYW1lX3dhc19zaG9ydCA9IEZES3JlYWRCaXQoaEJzKTsKKworICAgIGlmIChwcmV2X2ZyYW1lX3dhc19zaG9ydCkgeworICAgICAgY29yZV9tb2RlX2xhc3QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuY29yZV9tb2RlX2xhc3QgPQorICAgICAgICAgIEZEX1NIT1JUOworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwZF9tb2RlX2xhc3QgPSAyNTU7CisKKyAgICAgIGlmICgocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9jb3JlX21vZGUgIT0gRkRfU0hPUlQpICYmCisgICAgICAgICAgQ0NvbmNlYWxtZW50X0dldExhc3RGcmFtZU9rKAorICAgICAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLCAxKSkgeworICAgICAgICAvKiBVU0FDIENvbmZvcm1hbmNlIGRvY3VtZW50OgorICAgICAgICAgICBzaG9ydF9mYWNfZmxhZyAgIHNoYWxsIGJlIGVuY29kZWQgd2l0aCBhIHZhbHVlIG9mIDEgaWYgdGhlCisgICAgICAgICAgIHdpbmRvd19zZXF1ZW5jZSBvZiB0aGUgcHJldmlvdXMgZnJhbWUgd2FzIDIgKEVJR0hUX1NIT1JUX1NFUVVFTkNFKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2Ugc2hvcnRfZmFjX2ZsYWcgc2hhbGwgYmUgZW5jb2RlZCB3aXRoIGEKKyAgICAgICAgICAgdmFsdWUgb2YgMC4gKi8KKyAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorCisgICAgLyogQXNzaWduIG1lbW9yeSAqLworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVswXSA9CisgICAgICAgIENMcGRfRkFDX0dldE1lbW9yeShwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBtb2QsICZmYWNHZXRNZW1TdGF0ZSk7CisKKyAgICB7CisgICAgICBpbnQgZXJyOworCisgICAgICAvKiBGQUMgZm9yIEZEIC0+IEFDRUxQICovCisgICAgICBlcnIgPSBDTHBkX0ZBQ19SZWFkKAorICAgICAgICAgIGhCcywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhWzBdLAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YV9lLAorICAgICAgICAgIENMcGRfRkFDX2dldExlbmd0aChjb3JlX21vZGVfbGFzdCAhPSBGRF9TSE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCksCisgICAgICAgICAgMSwgMCk7CisgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorICB9CisKK2JhaWw6CisgIGlmIChlcnJvciA9PSBBQUNfREVDX09LKSB7CisgICAgLyogY2hlY2sgY29uc2l0ZW5jeSBvZiBsYXN0IGNvcmUvbHBkIG1vZGUgdmFsdWVzICovCisgICAgaWYgKChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuY29yZV9tb2RlX2xhc3QgIT0KKyAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfY29yZV9tb2RlKSAmJgorICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGNfbG9zdCA9PSAwKSkgeworICAgICAgLyogU29tZXRoaW5nIGdvdCB3cm9uZyEgKi8KKyAgICAgIC8qIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsgKi8gLyogVGhyb3dpbmcgZXJyb3JzIGRvZXMgbm90IGhlbHAgKi8KKyAgICB9IGVsc2UgaWYgKChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuY29yZV9tb2RlX2xhc3QgPT0gTFBEKSAmJgorICAgICAgICAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scGRfbW9kZV9sYXN0ICE9CisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGRfbW9kZSkgJiYKKyAgICAgICAgICAgICAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwY19sb3N0ID09IDApKSB7CisgICAgICAvKiBTb21ldGhpbmcgZ290IHdyb25nISAqLworICAgICAgLyogZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOyAqLyAvKiBUaHJvd2luZyBlcnJvcnMgZG9lcyBub3QgaGVscCAqLworICAgIH0KKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKwordm9pZCBDTHBkQ2hhbm5lbFN0cmVhbV9EZWNvZGUoCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCBVSU5UIGZsYWdzKSB7CisgIFVDSEFSICptb2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubW9kOworICBpbnQgazsKKyAgVUNIQVIgbGFzdF9scGRfbW9kZTsKKyAgaW50IG5iRGl2ID0gTkJfRElWOworCisgIC8qIGsgaXMgdGhlIGZyYW1lIGluZGV4LiBJZiBhIGZyYW1lIGlzIG9mIHNpemUgNDBNUyBvciA4ME1TLAorICAgICB0aGlzIGZyYW1lIGluZGV4IGlzIGluY3JlbWVudGVkIDIgb3IgNCBpbnN0ZWFkIG9mIDEgcmVzcGVjdGl2ZWx5LiAqLworICBrID0gMDsKKyAgbGFzdF9scGRfbW9kZSA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMKKyAgICAgICAgICAubHBkX21vZGVfbGFzdDsgLyogY291bGQgYmUgZGlmZmVyZW50IHRvIHdoYXQgaGFzIGJlZW4gcmVuZGVyZWQgKi8KKyAgd2hpbGUgKGsgPCBuYkRpdikgeworICAgIGlmIChtb2Rba10gPT0gMCkgeworICAgICAgLyogQUNFTFAgKi8KKworICAgICAgLyogSWYgRkFDIChmYWNfZGF0YVtrXSAhPSBOVUxMKSwgYW5kIHByZXZpb3VzIGZyYW1lIHdhcyBUQ1gsIGFwcGx5IChUQ1gpCisgICAgICAgKiBnYWlucyB0byBGQUMgZGF0YSAqLworICAgICAgaWYgKGxhc3RfbHBkX21vZGUgPiAwICYmIGxhc3RfbHBkX21vZGUgIT0gMjU1ICYmCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhW2tdKSB7CisgICAgICAgIENGYWNfQXBwbHlHYWlucyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFba10sCisgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF90Y3hfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfYWxmZF9nYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0X2xwZF9tb2RlIDwgNCkgPyBsYXN0X2xwZF9tb2RlIDogMyk7CisKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhX2Vba10gKz0KKyAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X2dhaW5fZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogVENYICovCisgICAgICBDTHBkX1RjeERlY29kZShwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG1vZFtrXSwgbGFzdF9scGRfbW9kZSwgaywgMSAvKiBmcmFtZU9rID09IDEgKi8KKyAgICAgICk7CisKKyAgICAgIC8qIFN0b3JlIFRDWCBnYWluIHNjYWxlIGZvciBuZXh0IHBvc3NpYmxlIEZBQyB0cmFuc2l0aW9uLiAqLworICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF90Y3hfZ2FpbiA9CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLnRjeF9nYWluW2tdOworICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF90Y3hfZ2Fpbl9lID0KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMudGN4X2dhaW5fZVtrXTsKKworICAgICAgLyogSWYgRkFDIChmYWNfZGF0YVtrXSAhPSBOVUxMKSwgYXBwbHkgZ2FpbnMgKi8KKyAgICAgIGlmIChsYXN0X2xwZF9tb2RlID09IDAgJiYgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhW2tdKSB7CisgICAgICAgIENGYWNfQXBwbHlHYWlucygKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVtrXSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGggLyogPT0gZmFjX2xlbmd0aCAqLywKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy50Y3hfZ2FpbltrXSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfYWxmZF9nYWlucywgbW9kW2tdKTsKKworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFfZVtrXSArPQorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLnRjeF9nYWluX2Vba107CisgICAgICB9CisgICAgfQorCisgICAgLyogcmVtZW1iZXIgcHJldmlvdXMgbW9kZSAqLworICAgIGxhc3RfbHBkX21vZGUgPSBtb2Rba107CisKKyAgICAvKiBJbmNyZWFzZSBrIHRvIG5leHQgZnJhbWUgKi8KKyAgICBrICs9IChtb2Rba10gPT0gMCkgPyAxIDogKDEgPDwgKG1vZFtrXSAtIDEpKTsKKyAgfQorfQorCitBQUNfREVDT0RFUl9FUlJPUiBDTHBkX1JlbmRlclRpbWVTaWduYWwoCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBGSVhQX1BDTSAqcFRpbWVEYXRhLAorICAgIElOVCBsRnJhbWUsIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBVSU5UIGZyYW1lT2ssIFVJTlQgZmxhZ3MsCisgICAgVUlOVCBzdHJtRmxhZ3MpIHsKKyAgVUNIQVIgKm1vZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5tb2Q7CisgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yID0gQUFDX0RFQ19PSzsKKyAgaW50IGssIGlfb2Zmc2V0OworICBpbnQgbGFzdF9rOworICBpbnQgbnJTYW1wbGVzID0gMDsKKyAgaW50IGZhY0ZCID0gMTsKKyAgaW50IG5iRGl2ID0gTkJfRElWOworICBpbnQgbERpdiA9IGxGcmFtZSAvIG5iRGl2OyAvKiBsZW5ndGggb2YgZGl2aXNpb24gKGFjZWxwIG9yIHRjeDIwIGZyYW1lKSovCisgIGludCBsRmFjID0gbERpdiAvIDI7CisgIGludCBuYlN1YmZyID0KKyAgICAgIGxGcmFtZSAvIChuYkRpdiAqIExfU1VCRlIpOyAvKiBudW1iZXIgb2Ygc3ViZnJhbWVzIHBlciBkaXZpc2lvbiAqLworICBpbnQgbmJTdWJmclN1cGVyZnIgPSBuYkRpdiAqIG5iU3ViZnI7CisgIGludCBzeW5TZmQgPSAobmJTdWJmclN1cGVyZnIgLyAyKSAtIEJQRl9TRkQ7CisgIGludCBTeW5EZWxheSA9IHN5blNmZCAqIExfU1VCRlI7CisgIGludCBhYWNEZWxheSA9IGxGcmFtZSAvIDI7CisKKyAgLyoKKyAgIEluIHJlc3BlY3QgdG8gdGhlIHJlZmVyZW5jZSBzb2Z0d2FyZSwgdGhlIHN5bnRoIHBvaW50ZXIgaGVyZSBpcyBsYWdnaW5nIGJ5CisgICBhYWNEZWxheSAoID09IFNZTl9ERUxBWSArIEJQRl9ERUxBWSApIHNhbXBsZXMuIFRoZSBjb3JyZXNwb25kaW5nIG9sZAorICAgc3ludGhlc2lzIHNhbXBsZXMgYXJlIGhhbmRsZWQgYnkgdGhlIElNRENUIG92ZXJsYXAuCisgICAqLworCisgIEZJWFBfREJMICpzeW50aF9idWYgPQorICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbVN0YXRpY0RhdGEtPnBXb3JrQnVmZmVyQ29yZTEtPnN5bnRoX2J1ZjsKKyAgRklYUF9EQkwgKnN5bnRoID0gc3ludGhfYnVmICsgUElUX01BWF9NQVggLSBCUEZfREVMQVk7CisgIFVDSEFSIGxhc3RfbHBkX21vZGUsIGxhc3RfbGFzdF9scGRfbW9kZSwgbGFzdF9scGNfbG9zdCwgbGFzdF9mcmFtZV9sb3N0OworCisgIElOVCBwaXRjaFtOQl9TVUJGUl9TVVBFUkZSICsgU1lOX1NGRF07CisgIEZJWFBfREJMIHBpdF9nYWluW05CX1NVQkZSX1NVUEVSRlIgKyBTWU5fU0ZEXTsKKworICBjb25zdCBpbnQgKmxnX3RhYmxlOworICBpbnQgbGdfdGFibGVfb2Zmc2V0ID0gMDsKKworICBVSU5UIHNhbXBsaW5nUmF0ZSA9IHBTYW1wbGluZ1JhdGVJbmZvLT5zYW1wbGluZ1JhdGU7CisKKyAgRkRLbWVtY2xlYXIocGl0Y2gsIChOQl9TVUJGUl9TVVBFUkZSICsgU1lOX1NGRCkgKiBzaXplb2YoSU5UKSk7CisKKyAgaWYgKGZsYWdzICYgQUFDREVDX0ZMVVNIKSB7CisgICAgQ0xwZF9SZXNldChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgZmxhZ3MgJiBBQUNERUNfRkxVU0gpOworICAgIGZyYW1lT2sgPSAwOworICB9CisKKyAgc3dpdGNoIChsRnJhbWUpIHsKKyAgICBjYXNlIDEwMjQ6CisgICAgICBsZ190YWJsZSA9ICZsZ190YWJsZV9jY2ZsWzBdW2xnX3RhYmxlX29mZnNldF07CisgICAgICBicmVhazsKKyAgICBjYXNlIDc2ODoKKyAgICAgIGxnX3RhYmxlID0gJmxnX3RhYmxlX2NjZmxbMV1bbGdfdGFibGVfb2Zmc2V0XTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOworICAgICAgcmV0dXJuIEFBQ19ERUNfVU5LTk9XTjsKKyAgfQorCisgIGxhc3RfZnJhbWVfbG9zdCA9ICFDQ29uY2VhbG1lbnRfR2V0TGFzdEZyYW1lT2soCisgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLCAwKTsKKworICAvKiBNYWludGFpbiBMUEQgbW9kZSBmcm9tIHByZXZpb3VzIGZyYW1lICovCisgIGlmICgocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9jb3JlX21vZGUgPT0gRkRfTE9ORykgfHwKKyAgICAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2NvcmVfbW9kZSA9PSBGRF9TSE9SVCkpIHsKKyAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlID0gMjU1OworICB9CisKKyAgaWYgKCFmcmFtZU9rKSB7CisgICAgRklYUF9EQkwgb2xkX3RjeF9nYWluOworICAgIEZJWFBfU0dMIG9sZF9zdGFiOworICAgIFNDSEFSIG9sZF90Y3hfZ2Fpbl9lOworICAgIGludCBuTG9zdFNmOworCisgICAgbGFzdF9scGRfbW9kZSA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGU7CisgICAgb2xkX3RjeF9nYWluID0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF90Y3hfZ2FpbjsKKyAgICBvbGRfdGN4X2dhaW5fZSA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X2dhaW5fZTsKKyAgICBvbGRfc3RhYiA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZFN0YWJpbGl0eTsKKyAgICBuTG9zdFNmID0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bnVtTG9zdExwZEZyYW1lczsKKworICAgIC8qIHBhdGNoIHRoZSBsYXN0IExQRCBtb2RlICovCisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwZF9tb2RlX2xhc3QgPSBsYXN0X2xwZF9tb2RlOworCisgICAgLyogRG8gbW9kZSBleHRyYXBvbGF0aW9uIGFuZCByZXBlYXQgdGhlIHByZXZpb3VzIG1vZGU6CisgICAgICAgaWYgcHJldmlvdXMgbW9kZSA9IEFDRUxQICAgICAgICAtPiBBQ0VMUAorICAgICAgIGlmIHByZXZpb3VzIG1vZGUgPSBUQ1gtMjAvNDAgICAgLT4gVENYLTIwCisgICAgICAgaWYgcHJldmlvdXMgbW9kZSA9IFRDWC04MCAgICAgICAtPiBUQ1gtODAKKyAgICAgICBub3RlczoKKyAgICAgICAtIEFDRUxQIGlzIG5vdCBhbGxvd2VkIGFmdGVyIFRDWCAobm8gcGl0Y2ggaW5mb3JtYXRpb24gdG8gcmV1c2UpCisgICAgICAgLSBUQ1gtNDAgaXMgbm90IGFsbG93ZWQgaW4gdGhlIG1vZGUgcmVwZXRpdGlvbiB0byBrZWVwIHRoZSBsb2dpYyBzaW1wbGUKKyAgICAgKi8KKyAgICBzd2l0Y2ggKGxhc3RfbHBkX21vZGUpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgbW9kWzBdID0gbW9kWzFdID0gbW9kWzJdID0gbW9kWzNdID0gMDsgLyogLT4gQUNFTFAgY29uY2VhbG1lbnQgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIG1vZFswXSA9IG1vZFsxXSA9IG1vZFsyXSA9IG1vZFszXSA9IDM7IC8qIC0+IFRDWCBGRCBjb25jZWFsbWVudCAqLworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgbW9kWzBdID0gbW9kWzFdID0gbW9kWzJdID0gbW9kWzNdID0gMjsgLyogLT4gVENYIEZEIGNvbmNlYWxtZW50ICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgbW9kWzBdID0gbW9kWzFdID0gbW9kWzJdID0gbW9kWzNdID0gNDsgLyogLT4gVENYIFREIGNvbmNlYWxtZW50ICovCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIExQQyBleHRyYXBvbGF0aW9uICovCisgICAgQ0xwY19Db25jZWFsKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5sc3BfY29lZmYsCisgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwYzRfbHNmLAorICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sc2ZfYWRhcHRpdmVfbWVhbiwKKyAgICAgICAgICAgICAgICAgLyoocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bnVtTG9zdExwZEZyYW1lcyA9PSAwKSB8fCovCisgICAgICAgICAgICAgICAgIChsYXN0X2xwZF9tb2RlID09IDI1NSkpOworCisgICAgaWYgKChsYXN0X2xwZF9tb2RlID4gMCkgJiYgKGxhc3RfbHBkX21vZGUgPCAyNTUpKSB7CisgICAgICAvKiBDb3B5IG9sZCBMUEM0IExQIGRvbWFpbiBjb2VmZmljaWVudHMgdG8gTFBDMCBMUCBkb21haW4gYnVmZmVyICh0byBhdm9pZAorICAgICAgICogY29udmVydGluZyBMU1AgY29lZmZpY2llbnRzIGFnYWluKS4gKi8KKyAgICAgIEZES21lbWNweShwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZbMF0sCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBfY29lZmZfb2xkWzBdLAorICAgICAgICAgICAgICAgIE1fTFBfRklMVEVSX09SREVSICogc2l6ZW9mKEZJWFBfTFBDKSk7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZfZXhwWzBdID0KKyAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scF9jb2VmZl9vbGRfZXhwWzBdOworICAgIH0gLyogY2FzZSBsYXN0X2xwZF9tb2RlIHdhcyBBQ0VMUCBpcyBoYW5kbGVkIGJ5IENMcGRfVGN4RGVjb2RlKCkgKi8KKyAgICAvKiBjYXNlIGxhc3RfbHBkX21vZGUgd2FzIFRpbWUgZG9tYWluIFRDWCBjb25jZWFsbWVudCBpcyBoYW5kbGVkIGFmdGVyIHRoaXMKKyAgICAgKiAiaWYgKCFmcmFtZU9rKSItYmxvY2sgKi8KKworICAgIC8qIGsgaXMgdGhlIGZyYW1lIGluZGV4LiBJZiBhIGZyYW1lIGlzIG9mIHNpemUgNDBNUyBvciA4ME1TLAorICAgICAgIHRoaXMgZnJhbWUgaW5kZXggaXMgaW5jcmVtZW50ZWQgMiBvciA0IGluc3RlYWQgb2YgMSByZXNwZWN0aXZlbHkuICovCisgICAgayA9IDA7CisgICAgd2hpbGUgKGsgPCBuYkRpdikgeworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLnRjeF9nYWluW2tdID0gb2xkX3RjeF9nYWluOworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLnRjeF9nYWluX2Vba10gPSBvbGRfdGN4X2dhaW5fZTsKKworICAgICAgLyogcmVzdG9yZSBzdGFiaWxpdHkgdmFsdWUgZnJvbSBsYXN0IGZyYW1lICovCisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuYVN0YWJpbGl0eVtrXSA9IG9sZF9zdGFiOworCisgICAgICAvKiBJbmNyZWFzZSBrIHRvIG5leHQgZnJhbWUgKi8KKyAgICAgIGsgKz0gKChtb2Rba10gJiAweDMpID09IDApID8gMSA6ICgxIDw8ICgobW9kW2tdICYgMHgzKSAtIDEpKTsKKworICAgICAgbkxvc3RTZisrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGUgPT0gNCkgJiYgKG1vZFswXSA+IDApKSB7CisgICAgICAvKiBDb3B5IG9sZCBMUEM0IExQIGRvbWFpbiBjb2VmZmljaWVudHMgdG8gTFBDMCBMUCBkb21haW4gYnVmZmVyICh0byBhdm9pZAorICAgICAgICogY29udmVydGluZyBMU1AgY29lZmZpY2llbnRzIGFnYWluKS4gKi8KKyAgICAgIEZES21lbWNweShwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZbMF0sCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBfY29lZmZfb2xkWzBdLAorICAgICAgICAgICAgICAgIE1fTFBfRklMVEVSX09SREVSICogc2l6ZW9mKEZJWFBfTFBDKSk7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZfZXhwWzBdID0KKyAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scF9jb2VmZl9vbGRfZXhwWzBdOworICAgIH0KKyAgfQorCisgIEFjZWxwX1ByZVByb2Nlc3Npbmcoc3ludGhfYnVmLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfc3ludGgsIHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9UX3BmLCBwaXRfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfZ2Fpbl9wZiwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICZpX29mZnNldCwgbEZyYW1lLCBzeW5TZmQsIG5iU3ViZnJTdXBlcmZyKTsKKworICAvKiBrIGlzIHRoZSBmcmFtZSBpbmRleC4gSWYgYSBmcmFtZSBpcyBvZiBzaXplIDQwTVMgb3IgODBNUywKKyAgICAgdGhpcyBmcmFtZSBpbmRleCBpcyBpbmNyZW1lbnRlZCAyIG9yIDQgaW5zdGVhZCBvZiAxIHJlc3BlY3RpdmVseS4gKi8KKyAgayA9IDA7CisgIGxhc3RfayA9IC0xOyAvKiBtYXJrIGludmFsaWQgKi8KKyAgbGFzdF9scGRfbW9kZSA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGU7CisgIGxhc3RfbGFzdF9scGRfbW9kZSA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbGFzdF9scGRfbW9kZTsKKyAgbGFzdF9scGNfbG9zdCA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBjX2xvc3QgfCBsYXN0X2ZyYW1lX2xvc3Q7CisKKyAgLyogVGhpcyBidWZmZXIgbXVzdCBiZSBhdmFsYWJsZSBmb3IgdGhlIGNhc2Ugb2YgRkQtPkFDRUxQIHRyYW5zaXRpb24uIFRoZQorICBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBpcyB1c2VkIGFmdGVyIHRoZSBCUEYgdG8gb3ZlcndyaXRlIHRoZSBvdXRwdXQgc2lnbmFsLgorICBPbmx5IHRoZSBGQUMgYXJlYSBtdXN0IGJlIGFmZmVjdGVkIGJ5IHRoZSBCUEYgKi8KKworICB3aGlsZSAoayA8IG5iRGl2KSB7CisgICAgaWYgKGZyYW1lT2sgPT0gMCkgeworICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bnVtTG9zdExwZEZyYW1lcysrOworICAgIH0gZWxzZSB7CisgICAgICBsYXN0X2ZyYW1lX2xvc3QgfD0KKyAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bnVtTG9zdExwZEZyYW1lcyA+IDApID8gMSA6IDA7CisgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5udW1Mb3N0THBkRnJhbWVzID0gMDsKKyAgICB9CisgICAgaWYgKG1vZFtrXSA9PSAwIHx8IG1vZFtrXSA9PSA0KSB7CisgICAgICAvKiBBQ0VMUCBvciBUQ1ggdGltZSBkb21haW4gY29uY2VhbG1lbnQgKi8KKyAgICAgIEZJWFBfREJMICphY2VscF9vdXQ7CisKKyAgICAgIC8qIEZBQyBtYW5hZ2VtZW50ICovCisgICAgICBpZiAoKGxhc3RfbHBkX21vZGUgIT0gMCkgJiYgKGxhc3RfbHBkX21vZGUgIT0gNCkpIC8qIFRDWCBURCBjb25jZWFsbWVudCAqLworICAgICAgeworICAgICAgICBGSVhQX0RCTCAqcEZhY0RhdGEgPSBOVUxMOworCisgICAgICAgIGlmIChmcmFtZU9rICYmICFsYXN0X2ZyYW1lX2xvc3QpIHsKKyAgICAgICAgICBwRmFjRGF0YSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVtrXTsKKyAgICAgICAgfQorCisgICAgICAgIG5yU2FtcGxlcyArPSBDTHBkX0ZBQ19NZGN0MkFjZWxwKAorICAgICAgICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0LCBzeW50aCArIG5yU2FtcGxlcywgcEZhY0RhdGEsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFfZVtrXSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZltrXSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZl9leHBba10sCisgICAgICAgICAgICBsRnJhbWUgLSBuclNhbXBsZXMsCisgICAgICAgICAgICBDTHBkX0ZBQ19nZXRMZW5ndGgoCisgICAgICAgICAgICAgICAgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfY29yZV9tb2RlICE9IEZEX1NIT1JUKSB8fAorICAgICAgICAgICAgICAgICAgICAoayA+IDApLAorICAgICAgICAgICAgICAgIGxGYWMpLAorICAgICAgICAgICAgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfY29yZV9tb2RlICE9IExQRCkgJiYgKGsgPT0gMCksCisgICAgICAgICAgICAwKTsKKworICAgICAgICBGREttZW1jcHkoCisgICAgICAgICAgICBzeW50aCArIG5yU2FtcGxlcywgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3Qub3ZlcmxhcC50aW1lLAorICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3Qub3Zfb2Zmc2V0ICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIHsKKyAgICAgICAgICBGSVhQX0xQQyAqbHBfcHJldiA9CisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYworICAgICAgICAgICAgICAgICAgLmxwX2NvZWZmWzBdOyAvKiBpbml0IHZhbHVlIGRvZXMgbm90IHJlYWwgbWF0dGVyICovCisgICAgICAgICAgSU5UIGxwX3ByZXZfZXhwID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFswXTsKKworICAgICAgICAgIGlmIChsYXN0X2xwZF9tb2RlICE9IDI1NSkgeyAvKiBsYXN0IG1vZGUgd2FzIHRjeCAqLworICAgICAgICAgICAgbGFzdF9rID0gayAtICgxIDw8IChsYXN0X2xwZF9tb2RlIC0gMSkpOworICAgICAgICAgICAgaWYgKGxhc3RfayA8IDApIHsKKyAgICAgICAgICAgICAgbHBfcHJldiA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwX2NvZWZmX29sZFsxXTsKKyAgICAgICAgICAgICAgbHBfcHJldl9leHAgPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scF9jb2VmZl9vbGRfZXhwWzFdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgbHBfcHJldiA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZltsYXN0X2tdOworICAgICAgICAgICAgICBscF9wcmV2X2V4cCA9CisgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZfZXhwW2xhc3Rfa107CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgQ0xwZF9BY2VscFByZXBhcmVJbnRlcm5hbE1lbSgKKyAgICAgICAgICAgICAgc3ludGggKyBhYWNEZWxheSArIGsgKiBsRGl2LCBsYXN0X2xwZF9tb2RlLAorICAgICAgICAgICAgICAobGFzdF9sYXN0X2xwZF9tb2RlID09IDQpID8gMCA6IGxhc3RfbGFzdF9scGRfbW9kZSwKKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmW2tdLAorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZfZXhwW2tdLCBscF9wcmV2LAorICAgICAgICAgICAgICBscF9wcmV2X2V4cCwgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmFjZWxwLCBsRnJhbWUsCisgICAgICAgICAgICAgIChsYXN0X2ZyYW1lX2xvc3QgJiYgayA8IDIpLCBtb2Rba10pOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoayA9PSAwICYmIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0Lm92X29mZnNldCAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICBsRnJhbWUgLyBmYWNGQiAvIDIpIHsKKyAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdC5vdl9vZmZzZXQgPSBsRnJhbWUgLyBmYWNGQiAvIDI7CisgICAgICAgIH0KKyAgICAgICAgbnJTYW1wbGVzICs9IGltZGN0X2RyYWluKCZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoICsgbnJTYW1wbGVzLCBsRnJhbWUgLyBmYWNGQiAtIG5yU2FtcGxlcyk7CisgICAgICB9CisKKyAgICAgIGlmIChuclNhbXBsZXMgPj0gbEZyYW1lIC8gZmFjRkIpIHsKKyAgICAgICAgLyogV3JpdGUgQUNFTFAgdGltZSBkb21haW4gc2FtcGxlcyBpbnRvIElNRENUIG92ZXJsYXAgYnVmZmVyIGF0CisgICAgICAgICAqIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0Lm92ZXJsYXAudGltZSArCisgICAgICAgICAqIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0Lm92X29mZnNldAorICAgICAgICAgKi8KKyAgICAgICAgYWNlbHBfb3V0ID0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3Qub3ZlcmxhcC50aW1lICsKKyAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3Qub3Zfb2Zmc2V0OworCisgICAgICAgIC8qIEFjY291bnQgQUNFTFAgdGltZSBkb21haW4gb3V0cHV0IHNhbXBsZXMgdG8gb3ZlcmxhcCBidWZmZXIgKi8KKyAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3Qub3Zfb2Zmc2V0ICs9IGxEaXY7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBXcml0ZSBBQ0VMUCB0aW1lIGRvbWFpbiBzYW1wbGVzIGludG8gb3V0cHV0IGJ1ZmZlciBhdCBwVGltZURhdGEgKworICAgICAgICAgKiBuclNhbXBsZXMgKi8KKyAgICAgICAgYWNlbHBfb3V0ID0gc3ludGggKyBuclNhbXBsZXM7CisKKyAgICAgICAgLyogQWNjb3VudCBBQ0VMUCB0aW1lIGRvbWFpbiBvdXRwdXQgc2FtcGxlcyB0byBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIG5yU2FtcGxlcyArPSBsRGl2OworICAgICAgfQorCisgICAgICBpZiAobW9kW2tdID09IDQpIHsKKyAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+YWNlbHAud3N5bl9ybXMgPSBzY2FsZVZhbHVlKAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLnRjeF9nYWluW2tdLAorICAgICAgICAgICAgZml4TWluKDAsCisgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLnRjeF9nYWluX2Vba10gLSBTRl9FWEMpKTsKKyAgICAgICAgQ0xwZF9UY3hURENvbmNlYWwoJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmFjZWxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF90Y3hfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5sc3BfY29lZmZba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5sc3BfY29lZmZbayArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuYVN0YWJpbGl0eVtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bnVtTG9zdExwZEZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWNlbHBfb3V0LCBsRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X25vaXNlX2ZhY3Rvcik7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZES19BU1NFUlQocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmFTdGFiaWxpdHlba10gPj0KKyAgICAgICAgICAgICAgICAgICAoRklYUF9TR0wpMCk7CisgICAgICAgIENMcGRfQWNlbHBEZWNvZGUoJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmFjZWxwLCBpX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHNwX2NvZWZmW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5sc3BfY29lZmZbayArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5hU3RhYmlsaXR5W2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuYWNlbHBba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bnVtTG9zdExwZEZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2xwY19sb3N0LCBrLCBhY2VscF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBpdGNoWyhrICogbmJTdWJmcikgKyBzeW5TZmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwaXRfZ2FpblsoayAqIG5iU3ViZnIpICsgc3luU2ZkXSwgbEZyYW1lKTsKKyAgICAgIH0KKworICAgICAgaWYgKG1vZFtrXSAhPSA0KSB7CisgICAgICAgIGlmIChsYXN0X2xwZF9tb2RlICE9IDAgJiYKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYworICAgICAgICAgICAgICAgIC5icGZfY29udHJvbF9pbmZvKSB7IC8qIEZEL1RDWCAtPiBBQ0VMUCB0cmFuc2l0aW9uICovCisgICAgICAgICAgLyogYmFzcyBwb3N0LWZpbHRlciBwYXN0IEZBQyBhcmVhIChwYXN0IHR3byAob25lIGZvciBGRCBzaG9ydCkKKyAgICAgICAgICAgKiBzdWJmcmFtZXMpICovCisgICAgICAgICAgaW50IGN1cnJlbnRTZiA9IHN5blNmZCArIGsgKiBuYlN1YmZyOworCisgICAgICAgICAgaWYgKChrID4gMCkgfHwgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfY29yZV9tb2RlICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgIEZEX1NIT1JUKSkgeyAvKiBUQ1ggb3IgRkQgbG9uZyAtPiBBQ0VMUCAqLworICAgICAgICAgICAgcGl0Y2hbY3VycmVudFNmIC0gMl0gPSBwaXRjaFtjdXJyZW50U2YgLSAxXSA9IHBpdGNoW2N1cnJlbnRTZl07CisgICAgICAgICAgICBwaXRfZ2FpbltjdXJyZW50U2YgLSAyXSA9IHBpdF9nYWluW2N1cnJlbnRTZiAtIDFdID0KKyAgICAgICAgICAgICAgICBwaXRfZ2FpbltjdXJyZW50U2ZdOworICAgICAgICAgIH0gZWxzZSB7IC8qIEZEIHNob3J0IC0+IEFDRUxQICovCisgICAgICAgICAgICBwaXRjaFtjdXJyZW50U2YgLSAxXSA9IHBpdGNoW2N1cnJlbnRTZl07CisgICAgICAgICAgICBwaXRfZ2FpbltjdXJyZW50U2YgLSAxXSA9IHBpdF9nYWluW2N1cnJlbnRTZl07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsgLyogVENYICovCisgICAgICBpbnQgbGcgPSBsZ190YWJsZVttb2Rba11dOworICAgICAgaW50IGlzRnVsbEJhbmRMcGQgPSAwOworCisgICAgICAvKiBGQUMgbWFuYWdlbWVudCAqLworICAgICAgaWYgKChsYXN0X2xwZF9tb2RlID09IDApIHx8IChsYXN0X2xwZF9tb2RlID09IDQpKSAvKiBUQ1ggVEQgY29uY2VhbG1lbnQgKi8KKyAgICAgIHsKKyAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChmYWNfYnVmLCBGSVhQX0RCTCwgMTAyNCAvIDgpOworCisgICAgICAgIC8qIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVtrXSA9PSBOVUxMIG1lYW5zIG5vIEZBQworICAgICAgICAgKiBkYXRhIGF2YWlsYWJsZS4gKi8KKyAgICAgICAgaWYgKGxhc3RfZnJhbWVfbG9zdCA9PSAxIHx8CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFba10gPT0gTlVMTCkgeworICAgICAgICAgIEZES21lbWNsZWFyKGZhY19idWYsIDEwMjQgLyA4ICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhW2tdID0gZmFjX2J1ZjsKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFfZVtrXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBuclNhbXBsZXMgKz0gQ0xwZF9GQUNfQWNlbHAyTWRjdCgKKyAgICAgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdCwgc3ludGggKyBuclNhbXBsZXMsCisgICAgICAgICAgICBTUEVDX1RDWChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgaywKKyAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgsIGlzRnVsbEJhbmRMcGQpLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlICsgaywgMSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVtrXSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YV9lW2tdLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCAvKiA9PSBmYWNfbGVuZ3RoICovLAorICAgICAgICAgICAgbEZyYW1lIC0gbnJTYW1wbGVzLCBsZywKKyAgICAgICAgICAgIEZES2dldFdpbmRvd1Nsb3BlKGxEaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpLAorICAgICAgICAgICAgbERpdiwgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmW2tdLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFtrXSwKKyAgICAgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5hY2VscCwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy50Y3hfZ2FpbltrXSwKKyAgICAgICAgICAgIChsYXN0X2ZyYW1lX2xvc3QgfHwgIWZyYW1lT2spLCAwIC8qIGlzIG5vdCBGRCBGQUMgKi8KKyAgICAgICAgICAgICwKKyAgICAgICAgICAgIGxhc3RfbHBkX21vZGUsIGssCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvCisgICAgICAgICAgICAgICAgLT5jdXJyQWxpYXNpbmdTeW1tZXRyeSAvKiBOb3RlOiBUaGUgY3VycmVudCBhbGlhc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbWV0cnkgZm9yIGEgVENYIChpLmUuIExQRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIG11c3QgYWx3YXlzIGJlIDAgKi8KKyAgICAgICAgKTsKKworICAgICAgICBwaXRjaFsoayAqIG5iU3ViZnIpICsgc3luU2ZkICsgMV0gPSBwaXRjaFsoayAqIG5iU3ViZnIpICsgc3luU2ZkXSA9CisgICAgICAgICAgICBwaXRjaFsoayAqIG5iU3ViZnIpICsgc3luU2ZkIC0gMV07CisgICAgICAgIHBpdF9nYWluWyhrICogbmJTdWJmcikgKyBzeW5TZmQgKyAxXSA9CisgICAgICAgICAgICBwaXRfZ2FpblsoayAqIG5iU3ViZnIpICsgc3luU2ZkXSA9CisgICAgICAgICAgICAgICAgcGl0X2dhaW5bKGsgKiBuYlN1YmZyKSArIHN5blNmZCAtIDFdOworCisgICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKGZhY19idWYsIEZJWFBfREJMLCAxMDI0IC8gOCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgdGwgPSBsZzsKKyAgICAgICAgaW50IGZsID0gbERpdjsKKyAgICAgICAgaW50IGZyID0gbERpdjsKKworICAgICAgICBuclNhbXBsZXMgKz0gaW1sdF9ibG9jaygKKyAgICAgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdCwgc3ludGggKyBuclNhbXBsZXMsCisgICAgICAgICAgICBTUEVDX1RDWChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgaywKKyAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgsIGlzRnVsbEJhbmRMcGQpLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlICsgaywgMSwgbEZyYW1lIC0gbnJTYW1wbGVzLCB0bCwKKyAgICAgICAgICAgIEZES2dldFdpbmRvd1Nsb3BlKGZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSwKKyAgICAgICAgICAgIGZsLAorICAgICAgICAgICAgRkRLZ2V0V2luZG93U2xvcGUoZnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpLAorICAgICAgICAgICAgZnIsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy50Y3hfZ2FpbltrXSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmN1cnJBbGlhc2luZ1N5bW1ldHJ5CisgICAgICAgICAgICAgICAgPyBNTFRfRkxBR19DVVJSX0FMSUFTX1NZTU1FVFJZCisgICAgICAgICAgICAgICAgOiAwKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogcmVtZW1iZXIgcHJldmlvdXMgbW9kZSAqLworICAgIGxhc3RfbGFzdF9scGRfbW9kZSA9IGxhc3RfbHBkX21vZGU7CisgICAgbGFzdF9scGRfbW9kZSA9IG1vZFtrXTsKKyAgICBsYXN0X2xwY19sb3N0ID0gKGZyYW1lT2sgPT0gMCkgPyAxIDogMDsKKworICAgIC8qIEluY3JlYXNlIGsgdG8gbmV4dCBmcmFtZSAqLworICAgIGxhc3RfayA9IGs7CisgICAgayArPSAoKG1vZFtrXSAmIDB4MykgPT0gMCkgPyAxIDogKDEgPDwgKG1vZFtrXSAtIDEpKTsKKyAgfQorCisgIGlmIChmcmFtZU9rKSB7CisgICAgLyogYXNzdW1lIGRhdGEgd2FzIG9rID0+IHN0b3JlIGZvciBjb25jZWFsbWVudCAqLworICAgIEZES19BU1NFUlQocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmFTdGFiaWxpdHlbbGFzdF9rXSA+PQorICAgICAgICAgICAgICAgKEZJWFBfU0dMKTApOworICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZFN0YWJpbGl0eSA9CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5hU3RhYmlsaXR5W2xhc3Rfa107CisgICAgRkRLbWVtY3B5KHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxzZl9hZGFwdGl2ZV9tZWFuLAorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHNmX2FkYXB0aXZlX21lYW5fY2FuZCwKKyAgICAgICAgICAgICAgTV9MUF9GSUxURVJfT1JERVIgKiBzaXplb2YoRklYUF9MUEMpKTsKKyAgfQorCisgIC8qIHN0b3JlIHBhc3QgbHAgY29lZmZzIGZvciBuZXh0IHN1cGVyZnJhbWUgKHRoZXkgYXJlIG9ubHkgdmFsaWQgYW5kIG5lZWRlZCBpZgorICAgKiBsYXN0X2xwZF9tb2RlIHdhcyB0Y3gpICovCisgIGlmIChsYXN0X2xwZF9tb2RlID4gMCkgeworICAgIEZES21lbWNweShwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scF9jb2VmZl9vbGRbMF0sCisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZltuYkRpdl0sCisgICAgICAgICAgICAgIE1fTFBfRklMVEVSX09SREVSICogc2l6ZW9mKEZJWFBfTFBDKSk7CisgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBfY29lZmZfb2xkX2V4cFswXSA9CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZl9leHBbbmJEaXZdOworICAgIEZES21lbWNweShwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scF9jb2VmZl9vbGRbMV0sCisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZltsYXN0X2tdLAorICAgICAgICAgICAgICBNX0xQX0ZJTFRFUl9PUkRFUiAqIHNpemVvZihGSVhQX0xQQykpOworICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwX2NvZWZmX29sZF9leHBbMV0gPQorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZfZXhwW2xhc3Rfa107CisgIH0KKworICBGREtfQVNTRVJUKG5yU2FtcGxlcyA9PSBsRnJhbWUpOworCisgIC8qIGNoZWNrIHdoZXRoZXIgdXNhZ2Ugb2YgYmFzcyBwb3N0ZmlsdGVyIHdhcyBkZS1hY3RpdmF0ZWQgaW4gdGhlIGJpdHN0cmVhbTsKKyAgIGlmIHllcywgc2V0IHBpdGNoIGdhaW4gdG8gMCAqLworICBpZiAoIShwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuYnBmX2NvbnRyb2xfaW5mbykpIHsKKyAgICBpZiAobW9kWzBdICE9IDAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9icGZfY29udHJvbF9pbmZvKSkgeworICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBuYlN1YmZyU3VwZXJmcjsgaSsrKQorICAgICAgICBwaXRfZ2FpbltzeW5TZmQgKyBpXSA9IChGSVhQX0RCTCkwOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5iU3ViZnJTdXBlcmZyOyBpKyspCisgICAgICAgIHBpdF9nYWluW3N5blNmZCArIGldID0gKEZJWFBfREJMKTA7CisgICAgfQorICB9CisKKyAgLyogZm9yIGJhc3MgcG9zdGZpbHRlciAqLworICBmb3IgKGludCBuID0gMDsgbiA8IHN5blNmZDsgbisrKSB7CisgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+b2xkX1RfcGZbbl0gPSBwaXRjaFtuYlN1YmZyU3VwZXJmciArIG5dOworICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9nYWluX3BmW25dID0gcGl0X2dhaW5bbmJTdWJmclN1cGVyZnIgKyBuXTsKKyAgfQorCisgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9icGZfY29udHJvbF9pbmZvID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5icGZfY29udHJvbF9pbmZvOworCisgIHsKKyAgICBJTlQgbG9va2FoZWFkID0gLUJQRl9ERUxBWTsKKyAgICBpbnQgY29weVNhbXAgPSAobW9kW25iRGl2IC0gMV0gPT0gMCkgPyAoYWFjRGVsYXkpIDogKGFhY0RlbGF5IC0gbEZhYyk7CisKKyAgICAvKiBDb3B5IGVub3VnaCB0aW1lIGRvbWFpbiBzYW1wbGVzIGZyb20gTURDVCB0byBzeW50aGVzaXMgYnVmZmVyIGFzIG5lZWRlZAorICAgICAqIGJ5IHRoZSBiYXNzIHBvc3RmaWx0ZXIgKi8KKworICAgIGxvb2thaGVhZCArPSBpbWRjdF9jb3B5X292X2FuZF9ucigmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoICsgbnJTYW1wbGVzLCBjb3B5U2FtcCk7CisKKyAgICBGREtfQVNTRVJUKGxvb2thaGVhZCA9PSBjb3B5U2FtcCAtIEJQRl9ERUxBWSk7CisKKyAgICBGSVhQX0RCTCAqcDJfc3ludGggPSBzeW50aCArIEJQRl9ERUxBWTsKKworICAgIC8qIHJlY2FsY3VsYXRlIHBpdGNoIGdhaW4gdG8gYWxsb3cgcG9zdGZpbGVyaW5nIG9uIEZBQyBhcmVhICovCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYlN1YmZyU3VwZXJmcjsgaSsrKSB7CisgICAgICBpbnQgVCA9IHBpdGNoW2ldOworICAgICAgRklYUF9EQkwgZ2FpbiA9IHBpdF9nYWluW2ldOworCisgICAgICBpZiAoZ2FpbiA+IChGSVhQX0RCTCkwKSB7CisgICAgICAgIGdhaW4gPSBnZXRfZ2FpbigmcDJfc3ludGhbaSAqIExfU1VCRlJdLCAmcDJfc3ludGhbKGkgKiBMX1NVQkZSKSAtIFRdLAorICAgICAgICAgICAgICAgICAgICAgICAgTF9TVUJGUik7CisgICAgICAgIHBpdF9nYWluW2ldID0gZ2FpbjsKKyAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICBiYXNzX3BmXzFzZl9kZWxheShwMl9zeW50aCwgcGl0Y2gsIHBpdF9nYWluLCBsRnJhbWUsIGxGcmFtZSAvIGZhY0ZCLAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kW25iRGl2IC0gMV0gPyAoU3luRGVsYXkgLSAobERpdiAvIDIpKSA6IFN5bkRlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEYXRhLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5tZW1fYnBmKTsKKyAgICB9CisgIH0KKworICBBY2VscF9Qb3N0UHJvY2Vzc2luZyhzeW50aF9idWYsIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9zeW50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2gsIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9UX3BmLCBsRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHN5blNmZCwgbmJTdWJmclN1cGVyZnIpOworCisgIC8qIFN0b3JlIGxhc3QgbW9kZSBmb3IgbmV4dCBzdXBlciBmcmFtZSAqLworICB7IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfY29yZV9tb2RlID0gTFBEOyB9CisgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGUgPSBsYXN0X2xwZF9tb2RlOworICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xhc3RfbHBkX21vZGUgPSBsYXN0X2xhc3RfbHBkX21vZGU7CisgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBjX2xvc3QgPSBsYXN0X2xwY19sb3N0OworCisgIHJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19scGQuaCBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19scGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTc5MzhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2xwZC5oCkBAIC0wLDAgKzEsMTk4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKKyAgIERlc2NyaXB0aW9uOiBVU0FDIExpbmVhciBQcmVkaWN0aW9uIERvbWFpbiBjb2RpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVU0FDREVDX0xQRF9ICisjZGVmaW5lIFVTQUNERUNfTFBEX0gKKworI2luY2x1ZGUgImNoYW5uZWxpbmZvLmgiCisKKyNkZWZpbmUgT1BUSU1JWkVfQVZHX1BFUkZPUk1BTkNFCisKKy8qKgorICogXGJyaWVmIHJlYWQgYSBscGRfY2hhbm5lbF9zdHJlYW0uCisgKiBccGFyYW0gaEJzIGEgYml0IHN0cmVhbSBoYW5kbGUsIHdoZXJlIHRoZSBscGRfY2hhbm5lbF9zdHJlYW0gaXMgbG9jYXRlZC4KKyAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIHRoZSBjaGFubmVsIGNvbnRleHQgc3RydWN0dXJlIGZvciBzdG9yaW5nIHJlYWQKKyAqIGRhdGEuCisgKiBccGFyYW0gZmxhZ3MgYml0IHN0cmVhbSBzeW50YXggZmxhZ3MuCisgKiBccmV0dXJuIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yIGNvZGUuCisgKi8KK0FBQ19ERUNPREVSX0VSUk9SIENMcGRDaGFubmVsU3RyZWFtX1JlYWQoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIFVJTlQgZmxhZ3MpOworCisvKioKKyAqIFxicmllZiBkZWNvZGUgb25lIGxwZF9jaGFubmVsX3N0cmVhbSBhbmQgcmVuZGVyIHRoZSBhdWRpbyBvdXRwdXQuCisgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBzdHJ1Y3QgaG9sZGluZyB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiB0byBiZQorICogcmVuZGVyZWQuCisgKiBccGFyYW0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyBzdHJ1Y3QgaG9sZGluZyB0aGUgcGVyc2lzdGVudCBjaGFubmVsCisgKiBpbmZvcm1hdGlvbiB0byBiZSByZW5kZXJlZC4KKyAqIFxwYXJhbSBwU2FtcGxpbmdSYXRlSW5mbyBob2xkcyB0aGUgc2FtcGxpbmcgcmF0ZSBpbmZvcm1hdGlvbgorICogXHBhcmFtIGVsRmxhZ3MgaG9sZHMgdGhlIGludGVybmFsIGRlY29kZXIgZmxhZ3MKKyAqLwordm9pZCBDTHBkQ2hhbm5lbFN0cmVhbV9EZWNvZGUoCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCBVSU5UIGZsYWdzKTsKKworLyoqCisgKiBcYnJpZWYgZ2VuZXJhdGUgdGltZSBkb21haW4gb3V0cHV0IHNpZ25hbCBmb3IgTFBEIGNoYW5uZWwgc3RyZWFtcworICogXHBhcmFtIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8KKyAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvCisgKiBccGFyYW0gcFRpbWVEYXRhIHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlcgorICogXHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBhbW91bnQgb2Ygb3V0cHV0IHNhbXBsZXMKKyAqIFxwYXJhbSBwU2FtcGxpbmdSYXRlSW5mbyBob2xkcyB0aGUgc2FtcGxpbmcgcmF0ZSBpbmZvcm1hdGlvbgorICogXHBhcmFtIHBXb3JrQnVmZmVyMSBwb2ludGVyIHRvIHdvcmsgYnVmZmVyIGZvciB0ZW1wb3JhbCBkYXRhCisgKi8KK0FBQ19ERUNPREVSX0VSUk9SIENMcGRfUmVuZGVyVGltZVNpZ25hbCgKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIEZJWFBfUENNICpwVGltZURhdGEsCisgICAgSU5UIHNhbXBsZXNQZXJGcmFtZSwgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIFVJTlQgZnJhbWVPaywKKyAgICBVSU5UIGZsYWdzLCBVSU5UIHN0cm1GbGFncyk7CisKK3N0YXRpYyBpbmxpbmUgSU5UIENMcGRfRkFDX2dldExlbmd0aChpbnQgZk5vdFNob3J0QmxvY2ssIGludCBmYWNfbGVuZ3RoX2xvbmcpIHsKKyAgaWYgKGZOb3RTaG9ydEJsb2NrKSB7CisgICAgcmV0dXJuIChmYWNfbGVuZ3RoX2xvbmcpOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWNfbGVuZ3RoX2xvbmcgLyAyOworICB9Cit9CisKK3ZvaWQgZmlsdExQKGNvbnN0IEZJWFBfREJMICpzeW4sIEZJWFBfUENNICpzeW5fb3V0LCBGSVhQX0RCTCAqbm9pc2UsCisgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCAqZmlsdCwgSU5UIHN0b3AsIGludCBsZW4pOworCisvKioKKyAqIFxicmllZiBwZXJmb3JtIGEgbG93LWZyZXF1ZW5jeSBwaXRjaCBlbmhhbmNlbWVudCBvbiB0aW1lIGRvbWFpbiBzaWduYWwKKyAqIFxwYXJhbVtpbl0gc3luIHBvaW50ZXIgdG8gdGltZSBkb21haW4gaW5wdXQgc2lnbmFsCisgKiBccGFyYW1baW5dIHN5bkZCIHBvaW50ZXIgdG8gdGltZSBkb21haW4gaW5wdXQgc2lnbmFsCisgKiBccGFyYW1baW5dIHVwc2FtcGxpbmcgZmFjdG9yCisgKiBccGFyYW1baW5dIFRfc2YgYXJyYXkgd2l0aCBwYXN0IGRlY29kZWQgcGl0Y2ggcGVyaW9kIHZhbHVlcyBmb3IgZWFjaCBzdWJmcmFtZQorICogXHBhcmFtW2luXSBub25femVyb19nYWluX2ZsYWdzIGluZGljYXRlcyB3aGV0aGVyIHBpdGNoIGdhaW5zIG9mIHBhc3QKKyAqIHN1YmZyYW1lcyBhcmUgemVybyBvciBub3QsIG1zYiAtPiBbMSBCUEZfREVMQVkgc3ViZnJdWzcgU1lOX0RFTEFZIHN1YmZyXVsxNgorICogbmV3IHN1YmZyXSA8LSBsc2IKKyAqIFxwYXJhbVtpbl0gbF9mcmFtZSBsZW5ndGggb2YgZmlsdGVyaW5nLCBtdXN0IGJlIG11bHRpcGxlIG9mIExfU1VCRlIKKyAqIFxwYXJhbVtpbl0gbF9uZXh0IGxlbmd0aCBvZiBhbGxvd2VkIGxvb2sgYWhlYWQgb24gc3luW2ldLCBpIDwgbF9mcmFtZStsX25leHQKKyAqIFxwYXJhbVtvdXRdIHN5bnRoX291dCBwb2ludGVyIHRvIHRpbWUgZG9tYWluIG91dHB1dCBzaWduYWwKKyAqIFxwYXJhbVtpbixvdXRdIG1lbV9icGYgcG9pbnRlciB0byBmaWx0ZXIgbWVtb3J5IChMX0ZJTFQrTF9TVUJGUikKKyAqLworCit2b2lkIGJhc3NfcGZfMXNmX2RlbGF5KEZJWFBfREJMIHN5bltdLCBjb25zdCBJTlQgVF9zZltdLCBGSVhQX0RCTCAqcGl0X2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZV9sZW5ndGgsIGNvbnN0IElOVCBsX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbF9uZXh0LCBGSVhQX1BDTSAqc3ludGhfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBtZW1fYnBmW10pOworCisvKioKKyAqIFxicmllZiByYW5kb20gc2lnbiBnZW5lcmF0b3IgZm9yIEZEIGFuZCBUQ1ggbm9pc2UgZmlsbGluZworICogXHBhcmFtW2luLG91dF0gc2VlZCBwb2ludGVyIHRvIHJhbmRvbSBzZWVkCisgKiBccmV0dXJuIGlmIHJldHVybiB2YWx1ZSBpcyB6ZXJvIHVzZSBwb3NpdGl2ZSBzaWduCisgKiBcTm90ZTogVGhpcyBjb2RlIGlzIGFsc28gaW1wbGVtZW50ZWQgYXMgYSBjb3B5IGluIGJsb2NrLmNwcCwgZ3JlcCBmb3IKKyAqICJVc2FjUmFuZG9tU2lnbiIKKyAqLworRkRLX0lOTElORQoraW50IFVzYWNSYW5kb21TaWduKFVMT05HICpzZWVkKSB7CisgICpzZWVkID0gKFVMT05HKSgoVUlOVDY0KSgqc2VlZCkgKiA2OTA2OSArIDUpOworCisgIHJldHVybiAoaW50KSgoKnNlZWQpICYgMHgxMDAwMCk7Cit9CisKK3ZvaWQgQ0ZkcF9SZXNldChDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKTsKKworI2VuZGlmIC8qIFVTQUNERUNfTFBEX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19yb20uY3BwIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX3JvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5ZTk5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19yb20uY3BwCkBAIC0wLDAgKzEsMTUwNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTS4gSmFuZGVyCisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNhY2RlY19yb20uaCIKKworI2RlZmluZSBOQl9TUEhFUkUgMzIKKyNkZWZpbmUgTkJfTEVBREVSIDM3CisjZGVmaW5lIE5CX0xEU0lHTiAyMjYKKyNkZWZpbmUgTkJfTERRMyA5CisjZGVmaW5lIE5CX0xEUTQgMjgKKworLyogRm9yIGJhc3MgcG9zdCBmaWx0ZXIgKi8KKyNkZWZpbmUgRkwyRlhDT05TVF9TR0xfRklMVChhKSBGTDJGWENPTlNUX1NHTChhKigxIDw8IFNGX0ZJTFRfTFApKQorI2RlZmluZSBTRl9GSUxUX0xQIDEKKworLyogdGFibGUgb2YgZmFjdG9yaWFsICovCitjb25zdCBVSU5UIGZka19kZWNfdGFiX2ZhY3RvcmlhbFs4XSA9IHs1MDQwLCA3MjAsIDEyMCwgMjQsIDYsIDIsIDEsIDF9OworCisvKiAgRGEgLSBBYnNvbHV0ZSBsZWFkZXJzICovCitjb25zdCBVQ0hBUiBmZGtfZGVjX0RhW05CX0xFQURFUl1bOF0gPSB7CisgICAgezEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9LCAgIHsyLCAyLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7MiwgMiwgMiwgMiwgMCwgMCwgMCwgMH0sICAgezMsIDEsIDEsIDEsIDEsIDEsIDEsIDF9LAorICAgIHs0LCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgICB7MiwgMiwgMiwgMiwgMiwgMiwgMCwgMH0sCisgICAgezMsIDMsIDEsIDEsIDEsIDEsIDEsIDF9LCAgIHs0LCAyLCAyLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7MiwgMiwgMiwgMiwgMiwgMiwgMiwgMn0sICAgezMsIDMsIDMsIDEsIDEsIDEsIDEsIDF9LAorICAgIHs0LCAyLCAyLCAyLCAyLCAwLCAwLCAwfSwgICB7NCwgNCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezUsIDEsIDEsIDEsIDEsIDEsIDEsIDF9LCAgIHszLCAzLCAzLCAzLCAxLCAxLCAxLCAxfSwKKyAgICB7NCwgMiwgMiwgMiwgMiwgMiwgMiwgMH0sICAgezQsIDQsIDIsIDIsIDAsIDAsIDAsIDB9LAorICAgIHs1LCAzLCAxLCAxLCAxLCAxLCAxLCAxfSwgICB7NiwgMiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezQsIDQsIDQsIDAsIDAsIDAsIDAsIDB9LCAgIHs2LCAyLCAyLCAyLCAwLCAwLCAwLCAwfSwKKyAgICB7NiwgNCwgMiwgMCwgMCwgMCwgMCwgMH0sICAgezcsIDEsIDEsIDEsIDEsIDEsIDEsIDF9LAorICAgIHs4LCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgICB7NiwgNiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezgsIDIsIDIsIDAsIDAsIDAsIDAsIDB9LCAgIHs4LCA0LCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7OSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sICAgezEwLCAyLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7OCwgOCwgMCwgMCwgMCwgMCwgMCwgMH0sICAgezEwLCA2LCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7MTIsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LCAgezEyLCA0LCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7MTAsIDEwLCAwLCAwLCAwLCAwLCAwLCAwfSwgezE0LCAyLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7MTIsIDgsIDAsIDAsIDAsIDAsIDAsIDB9LCAgezE2LCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7MjAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9fTsKKworLyogRHMgLSBTaWduIGNvZGVzIG9mIGFsbCBzaWduZWQgbGVhZGVycyAqLworY29uc3QgVUNIQVIgZmRrX2RlY19Ec1tOQl9MRFNJR05dID0geworICAgIDAsICAgMywgICAxNSwgIDYzLCAgMjU1LCAwLCAgIDY0LCAgMTkyLCAwLCAgIDE2LCAgNDgsICAxMTIsIDI0MCwgMSwgICA3LAorICAgIDMxLCAgMTI3LCAxMjgsIDEzMSwgMTQzLCAxOTEsIDAsICAgMTI4LCAwLCAgIDQsICAgMTIsICAyOCwgIDYwLCAgMTI0LCAyNTIsCisgICAgMCwgICAzLCAgIDE1LCAgNjMsICA2NSwgIDcxLCAgOTUsICAxOTIsIDE5NSwgMjA3LCAyNTUsIDAsICAgMzIsICA5NiwgIDEyOCwKKyAgICAxNjAsIDIyNCwgMCwgICAxLCAgIDMsICAgNywgICAxNSwgIDMxLCAgNjMsICAxMjcsIDI1NSwgMSwgICA3LCAgIDMxLCAgMzIsCisgICAgMzUsICA0NywgIDk3LCAgMTAzLCAxMjcsIDIyNCwgMjI3LCAyMzksIDAsICAgOCwgICAyNCwgIDU2LCAgMTIwLCAxMjgsIDEzNiwKKyAgICAxNTIsIDE4NCwgMjQ4LCAwLCAgIDY0LCAgMTkyLCAwLCAgIDMsICAgMTUsICA2MywgIDEyOSwgMTM1LCAxNTksIDI1NSwgMCwKKyAgICAzLCAgIDE1LCAgMTcsICAyMywgIDQ4LCAgNTEsICA2MywgIDExMywgMTE5LCAyNDAsIDI0MywgMjU1LCAwLCAgIDIsICAgNiwKKyAgICAxNCwgIDMwLCAgNjIsICAxMjYsIDEyOCwgMTMwLCAxMzQsIDE0MiwgMTU4LCAxOTAsIDI1NCwgMCwgICAxNiwgIDQ4LCAgNjQsCisgICAgODAsICAxMTIsIDE5MiwgMjA4LCAyNDAsIDEsICAgNywgICAzMSwgIDY0LCAgNjcsICA3OSwgIDEyNywgMTI4LCAxMzEsIDE0MywKKyAgICAxOTEsIDE5MywgMTk5LCAyMjMsIDAsICAgNjQsICAxMjgsIDE5MiwgMCwgICAzMiwgIDk2LCAgMjI0LCAwLCAgIDE2LCAgNDgsCisgICAgMTEyLCAxMjgsIDE0NCwgMTc2LCAyNDAsIDAsICAgMzIsICA2NCwgIDk2LCAgMTI4LCAxNjAsIDE5MiwgMjI0LCAxLCAgIDcsCisgICAgMzEsICAxMjcsIDEyOCwgMTMxLCAxNDMsIDE5MSwgMCwgICAxMjgsIDAsICAgNjQsICAxOTIsIDAsICAgMzIsICA5NiwgIDEyOCwKKyAgICAxNjAsIDIyNCwgMCwgICA2NCwgIDEyOCwgMTkyLCAwLCAgIDMsICAgMTUsICA2MywgIDEyOSwgMTM1LCAxNTksIDI1NSwgMCwKKyAgICA2NCwgIDEyOCwgMTkyLCAwLCAgIDY0LCAgMTkyLCAwLCAgIDY0LCAgMTI4LCAxOTIsIDAsICAgMTI4LCAwLCAgIDY0LCAgMTI4LAorICAgIDE5MiwgMCwgICA2NCwgIDE5MiwgMCwgICA2NCwgIDEyOCwgMTkyLCAwLCAgIDY0LCAgMTI4LCAxOTIsIDAsICAgMTI4LCAwLAorICAgIDEyOH07CisKKy8qIE5zIC0gTnVtYmVyIG9mIHNpZ25lZCBsZWFkZXIgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGFic29sdXRlIGxlYWRlciAqLworY29uc3QgVUNIQVIgZmRrX2RlY19Oc1tOQl9MRUFERVJdID0geworICAgIDUsIDMsIDUsIDgsIDIsIDcsIDExLCA2LCA5LCAxMiwgMTAsIDMsIDgsIDEzLCAxNCwgOSwgMTQsIDQsIDQsCisgICAgOCwgOCwgOCwgMiwgMywgNiwgNCwgIDgsIDQsIDMsICA0LCAgMiwgNCwgMywgIDQsICA0LCAyLCAgMn07CisKKy8qIElhIC0gUG9zaXRpb24gb2YgdGhlIGZpcnN0IHNpZ25lZCBsZWFkZXIgYXNzb2NpYXRlZCB0byBhbiBhYnNvbHV0ZSBsZWFkZXIgKi8KK2NvbnN0IFVDSEFSIGZka19kZWNfSWFbTkJfTEVBREVSXSA9IHsKKyAgICAwLCAgIDUsICAgOCwgICAxMywgIDIxLCAgMjMsICAzMCwgIDQxLCAgNDcsICA1NiwgIDY4LCAgNzgsICA4MSwKKyAgICA4OSwgIDEwMiwgMTE2LCAxMjUsIDEzOSwgMTQzLCAxNDcsIDE1NSwgMTYzLCAxNzEsIDE3MywgMTc2LCAxODIsCisgICAgMTg2LCAxOTQsIDE5OCwgMjAxLCAyMDUsIDIwNywgMjExLCAyMTQsIDIxOCwgMjIyLCAyMjR9OworCisvKiBJcyAtIENhcmRpbmFsaXRlIG9mZnNldCBvZiBzaWduZWQgbGVhZGVycyAqLworY29uc3QgVVNIT1JUIGZka19kZWNfSXNbTkJfTERTSUdOXSA9IHsKKyAgICAwLCAgICAgMSwgICAgIDI5LCAgICA5OSwgICAgMTI3LCAgIDEyOCwgICAxNTYsICAgMjEyLCAgIDI1NiwgICAzMjYsICAgNjA2LAorICAgIDEwMjYsICAxMzA2LCAgMTM3NiwgIDE0MzIsICAxNzEyLCAgMTg4MCwgIDE4ODgsICAxODk2LCAgMjA2NCwgIDIzNDQsICAyNDAsCisgICAgMjQ4LCAgIDAsICAgICAyOCwgICAgMTk2LCAgIDYxNiwgICAxMTc2LCAgMTU5NiwgIDE3NjQsICAxNzkyLCAgMTgyMCwgIDIyNDAsCisgICAgMjY2MCwgIDI2ODgsICAzMDI0LCAgNDE0NCwgIDQ0ODAsICA0NTA4LCAgNDkyOCwgIDUzNDgsICAyNDAwLCAgMjU2OCwgIDI5MDQsCisgICAgMzA3MiwgIDMyNDAsICAzNTc2LCAgNTM3NiwgIDUzNzcsICA1Mzg1LCAgNTQxMywgIDU0NjksICA1NTM5LCAgNTU5NSwgIDU2MjMsCisgICAgNTYzMSwgIDU2MzIsICA1OTEyLCAgNjQ3MiwgIDY1MjgsICA2Njk2LCAgODM3NiwgIDkyMTYsICAxMDA1NiwgMTE3MzYsIDExOTA0LAorICAgIDExOTYwLCAxMjUyMCwgMTI4MDAsIDEzMDgwLCAxNDIwMCwgMTU4ODAsIDE3MDAwLCAxNzI4MCwgMTc1NjAsIDE4NjgwLCAyMDM2MCwKKyAgICAyMTQ4MCwgMzc0NCwgIDM3NzIsICAzODI4LCAgMjE3NjAsIDIxNzY4LCAyMTkzNiwgMjIyMTYsIDIyMjcyLCAyMjMyOCwgMjI2MDgsCisgICAgMjI3NzYsIDIyNzg0LCAyMjg1NCwgMjMyNzQsIDIzMzQ0LCAyNDQ2NCwgMjU1ODQsIDI2MDA0LCAyODUyNCwgMjg5NDQsIDMwMDY0LAorICAgIDMxMTg0LCAzMTI1NCwgMzE2NzQsIDMxNzQ0LCAzMTgwMCwgMzIxMzYsIDMyOTc2LCAzNDA5NiwgMzQ5MzYsIDM1MjcyLCAzNTMyOCwKKyAgICAzNTM4NCwgMzU3MjAsIDM2NTYwLCAzNzY4MCwgMzg1MjAsIDM4ODU2LCAzODkxMiwgMzkzMzIsIDQwMTcyLCA0MDU5MiwgNDE0MzIsCisgICAgNDMxMTIsIDQzOTUyLCA0NDM3MiwgNDUyMTIsIDQ1NjMyLCA0NTk2OCwgNDcwODgsIDQ3NDI0LCA0NzQ4MCwgNDgzMjAsIDQ5MTYwLAorICAgIDQ5MjE2LCA0OTI3MiwgNTAxMTIsIDUwOTUyLCA1MTAwOCwgNTEzNDQsIDUyNDY0LCAzODU2LCAgMzkxMiwgIDM5NjgsICA0MDI0LAorICAgIDUyODAwLCA1Mjg1NiwgNTMwMjQsIDUzMTkyLCA1MzI0OCwgNTM1MjgsIDU0MzY4LCA1NTIwOCwgNTU0ODgsIDU1NzY4LCA1NjYwOCwKKyAgICA1NzQ0OCwgNTc3MjgsIDU4MDY0LCA1ODQwMCwgNTg3MzYsIDU5MDcyLCA1OTQwOCwgNTk3NDQsIDYwMDgwLCA2MDQxNiwgNjA0NzIsCisgICAgNjA3NTIsIDYwOTIwLCA2MDkyOCwgNjA5MzYsIDYxMTA0LCA2MTM4NCwgNDA4MCwgIDQwODgsICA2MTQ0MCwgNjE0NjgsIDYxNTI0LAorICAgIDYxNTUyLCA2MTcyMCwgNjIwNTYsIDYyMjI0LCA2MjM5MiwgNjI3MjgsIDYyODk2LCA2Mjk1MiwgNjMwMDgsIDYzMDY0LCA2MzEyMCwKKyAgICA2MzEyOCwgNjMyOTYsIDYzNTc2LCA2MzYzMiwgNjM2ODgsIDYzOTY4LCA2NDEzNiwgNjQxNDQsIDY0MjAwLCA2NDI1NiwgNjQzMTIsCisgICAgNjQzNjgsIDY0Mzk2LCA2NDQ1MiwgNjQ0ODAsIDY0NTM2LCA2NDU5MiwgNjQ2NDgsIDY0NzA0LCA2NDcxMiwgNjQ3MjAsIDY0Nzc2LAorICAgIDY0ODMyLCA2NDg4OCwgNjQ5NDQsIDY0OTcyLCA2NTAyOCwgNjUwNTYsIDY1MTEyLCA2NTE2OCwgNjUyMjQsIDY1MjgwLCA2NTMzNiwKKyAgICA2NTM5MiwgNjU0NDgsIDY1NTA0LCA2NTUxMiwgNjU1MjAsIDY1NTI4fTsKKworLyogQTMgLSBOdW1iZXIgb2YgdGhlIGFic29sdXRlIGxlYWRlcnMgaW4gY29kZWJvb2tzIFEyIGFuZCBRMyAqLworY29uc3QgVUNIQVIgZmRrX2RlY19BM1tOQl9MRFEzXSA9IHswLCAxLCA0LCAyLCAzLCA3LCAxMSwgMTcsIDIyfTsKKworLyogQTQgLSBOdW1iZXIgb2YgdGhlIGFic29sdXRlIGxlYWRlcnMgaW4gY29kZWJvb2sgUTQgKi8KK2NvbnN0IFVDSEFSIGZka19kZWNfQTRbTkJfTERRNF0gPSB7NSwgIDYsICA4LCAgOSwgIDEwLCAxMiwgMTMsIDE0LCAxNSwgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCAxOSwgMjAsIDIxLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzZ9OworCisvKiBJMyAtIENhcmRpbmFsaXR5IG9mZnNldHMgZm9yIGFic29sdXRlIGxlYWRlcnMgaW4gUTMgKi8KK2NvbnN0IFVTSE9SVCBmZGtfZGVjX0kzW05CX0xEUTNdID0gezAsICAgIDEyOCwgIDI0MCwgIDI1NiwgMTM3NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAsIDM3NDQsIDM4NTYsIDQwODB9OworCisvKiBJNCAtIENhcmRpbmFsaXR5IG9mZnNldCBmb3IgYWJzb2x1dGUgbGVhZGVycyBpbiBRNCAqLworY29uc3QgVVNIT1JUIGZka19kZWNfSTRbTkJfTERRNF0gPSB7CisgICAgMCwgICAgIDE3OTIsICA1Mzc2LCAgNTYzMiwgIDEyODAwLCAyMTc2MCwgMjI3ODQsIDMxNzQ0LCAzODkxMiwgNDU2MzIsCisgICAgNTI4MDAsIDUzMjQ4LCA1NzcyOCwgNjA0MTYsIDYxNDQwLCA2MTU1MiwgNjI4OTYsIDYzMTIwLCA2NDE0NCwgNjQzNjgsCisgICAgNjQ0ODAsIDY0NzA0LCA2NDcyMCwgNjQ5NDQsIDY1MDU2LCA2NTI4MCwgNjU1MDQsIDY1NTIwfTsKKworLyogSW5pdGlhbCBJU0YgbWVtb3J5IGZvciBjb25jZWFsbWVudCBjYXNlICovCisjZGVmaW5lIExTRkkoeCkgKCh4KSA8PCAoRlJBQ1RfQklUUyAtIExTRl9TQ0FMRSAtIDEpKQorCitjb25zdCBGSVhQX0xQQyBmZGtfZGVjX2xzZl9pbml0WzE2XSA9IHsxNTA2LCAgMzAxMiwgIDQ1MTgsICA2MDI0LCAgNzUyOSwgIDkwMzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDU0MSwgMTIwNDcsIDEzNTUzLCAxNTA1OSwgMTY1NjUsIDE4MDcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk1NzYsIDIxMDgyLCAyMjU4OCwgMjQwOTR9OworCisvKiBkaWNvX2xzZl9hYnNfOGIgaXMgc2NhbGVkIGJ5IDEvKDE8PDEzKSAqLworI2RlZmluZSBESUNPKHgpIEZYX0RCTDJGWENPTlNUX0xQQyh4ID4+IChMU0ZfU0NBTEUgLSAxMykpCisKK2NvbnN0IEZJWFBfTFBDIGZka19kZWNfZGljb19sc2ZfYWJzXzhiW10gPSB7CisgICAgRElDTygweDA1ZTU3ZmU4KSwgRElDTygweDBhYzAwODEwKSwgRElDTygweDExZWQ4NTAwKSwgRElDTygweDE2ZDQyY2UwKSwKKyAgICBESUNPKDB4MWJlYjFlMjApLCBESUNPKDB4MjE3ZWFmNDApLCBESUNPKDB4Mjc2OGM3NDApLCBESUNPKDB4MmQyNmY2MDApLAorICAgIERJQ08oMHgzMmZlNjhjMCksIERJQ08oMHgzOGIxZDk4MCksIERJQ08oMHgzZTk1YmQ4MCksIERJQ08oMHg0NDZkYWIwMCksCisgICAgRElDTygweDRhYmZkMjgwKSwgRElDTygweDUwOTRiMzgwKSwgRElDTygweDU2Y2NiODAwKSwgRElDTygweDVjOWFiYTAwKSwKKyAgICBESUNPKDB4MDk2NjBjYTApLCBESUNPKDB4MTBhYjRjMDApLCBESUNPKDB4MTVhMTZmMjApLCBESUNPKDB4MTlkM2M3ODApLAorICAgIERJQ08oMHgxZWU5OTA2MCksIERJQ08oMHgyNDFkMTIwMCksIERJQ08oMHgyOWM4MzcwMCksIERJQ08oMHgyZjA5OGYwMCksCisgICAgRElDTygweDM0ODAzZmMwKSwgRElDTygweDNhMzdiYzAwKSwgRElDTygweDNmZjU1NTgwKSwgRElDTygweDQ1ZGE5MjgwKSwKKyAgICBESUNPKDB4NGJlYzY3MDApLCBESUNPKDB4NTE2OWUzMDApLCBESUNPKDB4NTc3OTdjODApLCBESUNPKDB4NWQwOWFlODApLAorICAgIERJQ08oMHgwOGEyMDNiMCksIERJQ08oMHgwZDZlZDFhMCksIERJQ08oMHgxNTJjY2YyMCksIERJQ08oMHgxOTYzOWRjMCksCisgICAgRElDTygweDFkN2UzZTYwKSwgRElDTygweDIxZjRhN2MwKSwgRElDTygweDI3YjJmOGMwKSwgRElDTygweDJkYmI0NDgwKSwKKyAgICBESUNPKDB4MzNlY2RlODApLCBESUNPKDB4Mzk4MmUxMDApLCBESUNPKDB4M2VhMTYxMDApLCBESUNPKDB4NDNhYjYwODApLAorICAgIERJQ08oMHg0OTUzNGE4MCksIERJQ08oMHg0ZWE3ZTEwMCksIERJQ08oMHg1NTBkNjMwMCksIERJQ08oMHg1YmNkY2M4MCksCisgICAgRElDTygweDA3MmRkMDQ4KSwgRElDTygweDBjNjU0NjkwKSwgRElDTygweDE0MzZlOTQwKSwgRElDTygweDE5NDU5NjgwKSwKKyAgICBESUNPKDB4MWUwMDQxYzApLCBESUNPKDB4MjI0MGRjODApLCBESUNPKDB4MjZkZTQwNDApLCBESUNPKDB4MmI1MDliMDApLAorICAgIERJQ08oMHgzMDlkODc4MCksIERJQ08oMHgzNjE1MTE4MCksIERJQ08oMHgzYzZjMTIwMCksIERJQ08oMHg0MmRmNmI4MCksCisgICAgRElDTygweDRhMTQ0NDAwKSwgRElDTygweDUwNTQxMjgwKSwgRElDTygweDU2YzM0YjgwKSwgRElDTygweDVjYjZjNjAwKSwKKyAgICBESUNPKDB4MDUxZmVmMDApLCBESUNPKDB4MDZiOWZiNDgpLCBESUNPKDB4MGI0ZjljYzApLCBESUNPKDB4MTdlMjc4MDApLAorICAgIERJQ08oMHgxYjhjNzM0MCksIERJQ08oMHgxZjc3MmNhMCksIERJQ08oMHgyNDc4ZGM4MCksIERJQ08oMHgyODI0MjI0MCksCisgICAgRElDTygweDJmMjdjNjQwKSwgRElDTygweDMzYjAzZTgwKSwgRElDTygweDM4MWYyMGMwKSwgRElDTygweDNjNjYyYzAwKSwKKyAgICBESUNPKDB4NDk1NjUwODApLCBESUNPKDB4NTI5YjBmMDApLCBESUNPKDB4NTgzZWQwODApLCBESUNPKDB4NWQ4Y2VjMDApLAorICAgIERJQ08oMHgwNzFjNGQxOCksIERJQ08oMHgwOTc4NTNiMCksIERJQ08oMHgwZjBmMDY5MCksIERJQ08oMHgxNTdiZjk4MCksCisgICAgRElDTygweDE4MDFmNTgwKSwgRElDTygweDFkZWIwYzIwKSwgRElDTygweDI1MjNkYTQwKSwgRElDTygweDI4NTM0NjAwKSwKKyAgICBESUNPKDB4MmViNDk5YzApLCBESUNPKDB4MzJlYjVhYzApLCBESUNPKDB4MzY3NDk1ODApLCBESUNPKDB4M2E3NDgyMDApLAorICAgIERJQ08oMHg0MzI1ZjcwMCksIERJQ08oMHg1MTVkODMwMCksIERJQ08oMHg1OGExODcwMCksIERJQ08oMHg1ZDcyMjEwMCksCisgICAgRElDTygweDA2Y2JjZDg4KSwgRElDTygweDA4YmI2NzQwKSwgRElDTygweDBkZWFkMzEwKSwgRElDTygweDE1MmYwY2MwKSwKKyAgICBESUNPKDB4MTg0Mjc2NDApLCBESUNPKDB4MWQ5ZjJmMjApLCBESUNPKDB4MjJiYTNiNDApLCBESUNPKDB4MjcxYTZlODApLAorICAgIERJQ08oMHgyYzY3N2VjMCksIERJQ08oMHgzMTA2MWIwMCksIERJQ08oMHgzNDllZWY0MCksIERJQ08oMHgzYzUzMWI4MCksCisgICAgRElDTygweDRhZWQwNTgwKSwgRElDTygweDRmOGJiZjgwKSwgRElDTygweDU0Yjc0OTgwKSwgRElDTygweDViYzliNzAwKSwKKyAgICBESUNPKDB4MDQ2NDEwYzgpLCBESUNPKDB4MDY1MjJhYjApLCBESUNPKDB4MGI2NTI4YzApLCBESUNPKDB4MGY5NGJkOTApLAorICAgIERJQ08oMHgxYThmOGI4MCksIERJQ08oMHgxZWE1NzgyMCksIERJQ08oMHgyMzNlZTE4MCksIERJQ08oMHgyN2IzYWNjMCksCisgICAgRElDTygweDJiZDFkMjQwKSwgRElDTygweDJmYzRiY2MwKSwgRElDTygweDNhOThlYTQwKSwgRElDTygweDQzZDNmNTAwKSwKKyAgICBESUNPKDB4NDliMzc1ODApLCBESUNPKDB4NGUyYWZkMDApLCBESUNPKDB4NTU5NTMzMDApLCBESUNPKDB4NWQzNmY2MDApLAorICAgIERJQ08oMHgwNWQwZjZjOCksIERJQ08oMHgwN2U1NmQ5MCksIERJQ08oMHgwYmU5ODA4MCksIERJQ08oMHgwZjk1NmYzMCksCisgICAgRElDTygweDEyNTliM2MwKSwgRElDTygweDFmMDhiMjQwKSwgRElDTygweDI1MDA4YzAwKSwgRElDTygweDI5MDBiMTgwKSwKKyAgICBESUNPKDB4MzFlYTZmMDApLCBESUNPKDB4MzUyZDFlMDApLCBESUNPKDB4M2M5NzBjODApLCBESUNPKDB4NDUyNzEyMDApLAorICAgIERJQ08oMHg0YjYzMjI4MCksIERJQ08oMHg1MDk4YTQ4MCksIERJQ08oMHg1NjcyZmM4MCksIERJQ08oMHg1YzE2MzE4MCksCisgICAgRElDTygweDA1YmQ4MWEwKSwgRElDTygweDA3ZDRiOGYwKSwgRElDTygweDBjZTIyNGIwKSwgRElDTygweDExMGFiZTIwKSwKKyAgICBESUNPKDB4MTNkZmVhYzApLCBESUNPKDB4MTdkZWRhZTApLCBESUNPKDB4MjUzNWMwYzApLCBESUNPKDB4MmExOWRhODApLAorICAgIERJQ08oMHgyZTUyMjRjMCksIERJQ08oMHgzOGRkZWVjMCksIERJQ08oMHgzZGE5OWQ4MCksIERJQ08oMHg0Mjc5OTEwMCksCisgICAgRElDTygweDQ4OTczYjAwKSwgRElDTygweDRlYTYyODgwKSwgRElDTygweDUzZjc3ZTgwKSwgRElDTygweDViZDljMTAwKSwKKyAgICBESUNPKDB4MDM5NWNkNTApLCBESUNPKDB4MDU4MjQ0YjgpLCBESUNPKDB4MGFmNDU1MjApLCBESUNPKDB4MTMyOWNlYTApLAorICAgIERJQ08oMHgxYTM5NzBjMCksIERJQ08oMHgxZDlmMmUwMCksIERJQ08oMHgyMTcwNDQwMCksIERJQ08oMHgyNzdhMzRjMCksCisgICAgRElDTygweDMwMjE1YjQwKSwgRElDTygweDMzODc1MDQwKSwgRElDTygweDNjMTU5ODQwKSwgRElDTygweDQ1MmZlYTAwKSwKKyAgICBESUNPKDB4NDk4MWQyMDApLCBESUNPKDB4NGUxNWE5ODApLCBESUNPKDB4NTRlODQ3ODApLCBESUNPKDB4NWM3OWVhMDApLAorICAgIERJQ08oMHgwNTQxM2I5OCksIERJQ08oMHgwODEzMmE4MCksIERJQ08oMHgwZGM3ZjA1MCksIERJQ08oMHgxM2UyNTQ2MCksCisgICAgRElDTygweDE3ODRiZjgwKSwgRElDTygweDFkNjMwMjAwKSwgRElDTygweDIzOGJjODgwKSwgRElDTygweDI4Y2MwODgwKSwKKyAgICBESUNPKDB4MzBkYTFhNDApLCBESUNPKDB4MzkxZTIyMDApLCBESUNPKDB4NDE1ZDhkMDApLCBESUNPKDB4NDhmMTMyODApLAorICAgIERJQ08oMHg0ZTMwMDMwMCksIERJQ08oMHg1MmU1NjU4MCksIERJQ08oMHg1ODQ5ZmU4MCksIERJQ08oMHg1Y2RlZjQwMCksCisgICAgRElDTygweDA0YTA1OGM4KSwgRElDTygweDA3NTY5Yjg4KSwgRElDTygweDBlZjI2NjEwKSwgRElDTygweDEzMjA4MTQwKSwKKyAgICBESUNPKDB4MTY4YzA1MDApLCBESUNPKDB4MWFmZWMwODApLCBESUNPKDB4MjJhMGFiYzApLCBESUNPKDB4MmEwNTc4ODApLAorICAgIERJQ08oMHgyZmQxYzg0MCksIERJQ08oMHgzNzAzYzY4MCksIERJQ08oMHgzZDMyNmI4MCksIERJQ08oMHg0M2RmMmU4MCksCisgICAgRElDTygweDRhNmY5MDAwKSwgRElDTygweDUwOTAwZDgwKSwgRElDTygweDU2YzczZjAwKSwgRElDTygweDVjYzNkYTgwKSwKKyAgICBESUNPKDB4MDY1Yzk5ZTgpLCBESUNPKDB4MDkwNjBjNTApLCBESUNPKDB4MGQxZWYxYzApLCBESUNPKDB4MTZiZDkwMjApLAorICAgIERJQ08oMHgxYTA0ZGFlMCksIERJQ08oMHgxZTNjMDU4MCksIERJQ08oMHgyNTc4MzcwMCksIERJQ08oMHgyOTcxMGFjMCksCisgICAgRElDTygweDMwOWNiYjgwKSwgRElDTygweDM2YzY2MjgwKSwgRElDTygweDNhZGIwNTgwKSwgRElDTygweDQxYjM3ZTAwKSwKKyAgICBESUNPKDB4NDk2Y2E3MDApLCBESUNPKDB4NGRhYjc2MDApLCBESUNPKDB4NTJiZTYyODApLCBESUNPKDB4NThmZWM0ODApLAorICAgIERJQ08oMHgwNDY0MDg4MCksIERJQ08oMHgwNWE3NWFiOCksIERJQ08oMHgwZWRiYTQxMCksIERJQ08oMHgxNmUwNzZhMCksCisgICAgRElDTygweDE5OGFjZWMwKSwgRElDTygweDFlYjVmYWUwKSwgRElDTygweDIyOGM5MDAwKSwgRElDTygweDI5OTg2YzAwKSwKKyAgICBESUNPKDB4MmM3ODBjODApLCBESUNPKDB4MzgwNzhkYzApLCBESUNPKDB4M2Y0MmRjMDApLCBESUNPKDB4NDQxYmE5MDApLAorICAgIERJQ08oMHg0OTJmODA4MCksIERJQ08oMHg0ZWQ4NWQwMCksIERJQ08oMHg1NDYwNTgwMCksIERJQ08oMHg1ZDEwNmE4MCksCisgICAgRElDTygweDA0NWNiOTcwKSwgRElDTygweDA2MjdhODI4KSwgRElDTygweDBkYjM1MjkwKSwgRElDTygweDE3NzhmNzgwKSwKKyAgICBESUNPKDB4MWEyNDNjNjApLCBESUNPKDB4MjNjMmRkNDApLCBESUNPKDB4MjdjNTc4NDApLCBESUNPKDB4MmY1M2NkODApLAorICAgIERJQ08oMHgzNmY2NTYwMCksIERJQ08oMHgzYmMxYjJjMCksIERJQ08oMHg0MGMzNjUwMCksIERJQ08oMHg0NjA3NDE4MCksCisgICAgRElDTygweDRiNTUxYjgwKSwgRElDTygweDUwYTk5NzAwKSwgRElDTygweDU2OWI2YzgwKSwgRElDTygweDVjYTI1NzgwKSwKKyAgICBESUNPKDB4MDVlZjI4MjgpLCBESUNPKDB4MDdkM2FkZjgpLCBESUNPKDB4MGI1NDE2ZDApLCBESUNPKDB4MGY5YWRiNzApLAorICAgIERJQ08oMHgxMjZlNzM2MCksIERJQ08oMHgxYmFmZjQ2MCksIERJQ08oMHgyYjVkZWNjMCksIERJQ08oMHgzMTAzNjIwMCksCisgICAgRElDTygweDM0Y2E3NTAwKSwgRElDTygweDM5NjgxMzQwKSwgRElDTygweDNkYTk3MTAwKSwgRElDTygweDQxNjFlZTAwKSwKKyAgICBESUNPKDB4NDZhNjJlODApLCBESUNPKDB4NGQxYjkzODApLCBESUNPKDB4NTMwZTAzMDApLCBESUNPKDB4NTlmZjA0ODApLAorICAgIERJQ08oMHgwNGY1YmM1MCksIERJQ08oMHgwNmU5MGQxOCksIERJQ08oMHgwYzJhZjQ4MCksIERJQ08oMHgxMjNmNzQwMCksCisgICAgRElDTygweDE1MzBhMTYwKSwgRElDTygweDE4YWEzZGMwKSwgRElDTygweDFjYzBhMjQwKSwgRElDTygweDJjZGIwMmMwKSwKKyAgICBESUNPKDB4MzI5MDlhMDApLCBESUNPKDB4MzZiYWU2NDApLCBESUNPKDB4M2M5MTdhODApLCBESUNPKDB4NDAxMjE5MDApLAorICAgIERJQ08oMHg0OGE5MGQ4MCksIERJQ08oMHg1MWNjYzE4MCksIERJQ08oMHg1ODg0ZWEwMCksIERJQ08oMHg1ZGJjNDI4MCksCisgICAgRElDTygweDA1NzkxNDEwKSwgRElDTygweDA3YjBkZDgwKSwgRElDTygweDBiZWM0MTkwKSwgRElDTygweDEzYzMwNTIwKSwKKyAgICBESUNPKDB4MTdhYzE5MDApLCBESUNPKDB4MWI2ZjFkMDApLCBESUNPKDB4MjZlNTRmNDApLCBESUNPKDB4MmQ0YTgwNDApLAorICAgIERJQ08oMHgzMTFjNjg0MCksIERJQ08oMHgzOGVjNDE4MCksIERJQ08oMHgzZjBjNDM0MCksIERJQ08oMHg0MjdjNWIwMCksCisgICAgRElDTygweDQ4ODZlNDgwKSwgRElDTygweDUwNGEwYjAwKSwgRElDTygweDU2ZDQ4NzAwKSwgRElDTygweDVjODBmNjAwKSwKKyAgICBESUNPKDB4MDRiNTg4ODApLCBESUNPKDB4MDc0M2YwZDgpLCBESUNPKDB4MGJlOTVlMjApLCBESUNPKDB4MGZkMGQ5YjApLAorICAgIERJQ08oMHgxYzJlMTFhMCksIERJQ08oMHgyMjQxYWY4MCksIERJQ08oMHgyOTZlODNjMCksIERJQ08oMHgyZjE2YWRjMCksCisgICAgRElDTygweDMyY2Q2ZmMwKSwgRElDTygweDM3NGRkZWMwKSwgRElDTygweDNkYTk1ZjgwKSwgRElDTygweDQ1ZDU2YzgwKSwKKyAgICBESUNPKDB4NGM2YWZhODApLCBESUNPKDB4NTE0MWYzODApLCBESUNPKDB4NTYxNmIzODApLCBESUNPKDB4NWM1OGY1ODApLAorICAgIERJQ08oMHgwM2Y0YjM2OCksIERJQ08oMHgwNTkzOTg5MCksIERJQ08oMHgwOWQ5NTQ4MCksIERJQ08oMHgxMjJjYWM2MCksCisgICAgRElDTygweDE3ZTI3ZTAwKSwgRElDTygweDFmOWRjNjgwKSwgRElDTygweDI2ZTI2NjgwKSwgRElDTygweDJhZTY0MDQwKSwKKyAgICBESUNPKDB4MmRkNmNmNDApLCBESUNPKDB4MzI5NWM0MDApLCBESUNPKDB4M2UyM2I0MDApLCBESUNPKDB4NDRmZDAzODApLAorICAgIERJQ08oMHg0YWQ3YTcwMCksIERJQ08oMHg1MTI5NWU4MCksIERJQ08oMHg1OTRhOTQwMCksIERJQ08oMHg1ZTQxYWEwMCksCisgICAgRElDTygweDA0MjRiOWQ4KSwgRElDTygweDA1YjMwNTA4KSwgRElDTygweDA5MzgwZjIwKSwgRElDTygweDBjOTUwOWMwKSwKKyAgICBESUNPKDB4MTg3MzA4NjApLCBESUNPKDB4MjE5YTlkNDApLCBESUNPKDB4MjRmNjk5YzApLCBESUNPKDB4Mjg5YjI2ODApLAorICAgIERJQ08oMHgyY2I2MjI0MCksIERJQ08oMHgzNmU4ODE4MCksIERJQ08oMHgzZTk2ODgwMCksIERJQ08oMHg0ODA1M2M4MCksCisgICAgRElDTygweDRkNmRjYTgwKSwgRElDTygweDUxZDlhNTgwKSwgRElDTygweDU2M2U1YTgwKSwgRElDTygweDVjMGIyYjgwKSwKKyAgICBESUNPKDB4MDM0NTZhZTgpLCBESUNPKDB4MDRlNDk5NDgpLCBESUNPKDB4MDdkZDBlODgpLCBESUNPKDB4MGVkNWNkMzApLAorICAgIERJQ08oMHgxYjA2ZTk4MCksIERJQ08oMHgxZGUyYjljMCksIERJQ08oMHgyMTE2MDU0MCksIERJQ08oMHgyNzBhODI0MCksCisgICAgRElDTygweDMzNTJhMjgwKSwgRElDTygweDNiOGI2YzAwKSwgRElDTygweDQwMjQxNDAwKSwgRElDTygweDQzZjYwZjgwKSwKKyAgICBESUNPKDB4NGE4OTc5MDApLCBESUNPKDB4NTE2OTJhMDApLCBESUNPKDB4NTc0NDlkMDApLCBESUNPKDB4NWQ0OTc0ODApLAorICAgIERJQ08oMHgwNGI5NDI5MCksIERJQ08oMHgwNjdlOTlkMCksIERJQ08oMHgwYWIwNjg0MCksIERJQ08oMHgwZTY5NzA3MCksCisgICAgRElDTygweDE3NDVjNDYwKSwgRElDTygweDIyZWU4MDQwKSwgRElDTygweDI2NDdlOGMwKSwgRElDTygweDJiYzJjNjgwKSwKKyAgICBESUNPKDB4MmZkNTdkMDApLCBESUNPKDB4MzcxODY2ODApLCBESUNPKDB4M2QwNzQ1MDApLCBESUNPKDB4NDEyYjI4MDApLAorICAgIERJQ08oMHg0NTc5YWYwMCksIERJQ08oMHg0Y2FmZjk4MCksIERJQ08oMHg1NTdhZGQwMCksIERJQ08oMHg1YzZhZTc4MCksCisgICAgRElDTygweDA0MjNhMDkwKSwgRElDTygweDA1YjliY2EwKSwgRElDTygweDA5MWI0NWQwKSwgRElDTygweDBjNWI2ZDYwKSwKKyAgICBESUNPKDB4MTk0ZGQxYzApLCBESUNPKDB4MWZjODUwMjApLCBESUNPKDB4MjQ4NmIwODApLCBESUNPKDB4MjkyMGFmODApLAorICAgIERJQ08oMHgyZGQ0ZjE0MCksIERJQ08oMHgzNTk4YmU0MCksIERJQ08oMHgzYjljMTQ0MCksIERJQ08oMHg0MmQxOTI4MCksCisgICAgRElDTygweDRhMzE0MjgwKSwgRElDTygweDUwYjAwYTAwKSwgRElDTygweDU2YzU1NDAwKSwgRElDTygweDVkNWJhMzAwKSwKKyAgICBESUNPKDB4MDNlNjhiMjgpLCBESUNPKDB4MDVhN2IxOTApLCBESUNPKDB4MDkxN2YwMDApLCBESUNPKDB4MGQyNDcwNTApLAorICAgIERJQ08oMHgxOWU2MzdhMCksIERJQ08oMHgyMjIxYTU0MCksIERJQ08oMHgyNzc3ZTU0MCksIERJQ08oMHgyYzEwMzM4MCksCisgICAgRElDTygweDMwYzJlMDQwKSwgRElDTygweDM4OWYxMjQwKSwgRElDTygweDNmNGEyYzgwKSwgRElDTygweDQ1NGE0YzAwKSwKKyAgICBESUNPKDB4NGIwYWI2ODApLCBESUNPKDB4NTBjZjYwMDApLCBESUNPKDB4NTcxYzA3MDApLCBESUNPKDB4NWQyZWY2MDApLAorICAgIERJQ08oMHgwNDg4NmYxOCksIERJQ08oMHgwNjUxMDNlOCksIERJQ08oMHgwYTYwN2Q0MCksIERJQ08oMHgwZGI5MTk2MCksCisgICAgRElDTygweDEzNTQ2ZjIwKSwgRElDTygweDIyZjVlMjAwKSwgRElDTygweDI3MDY0MjQwKSwgRElDTygweDJlMzcxZDQwKSwKKyAgICBESUNPKDB4MzM2NTkyNDApLCBESUNPKDB4MzhhYTFjNDApLCBESUNPKDB4NDE3YmIyODApLCBESUNPKDB4NDdjYTk0ODApLAorICAgIERJQ08oMHg0ZGQ2ZmI4MCksIERJQ08oMHg1MjhlMzQ4MCksIERJQ08oMHg1N2M0OWQ4MCksIERJQ08oMHg1Y2M5ODEwMCksCisgICAgRElDTygweDAyZGIyMzcwKSwgRElDTygweDA0Mzk4ODQ4KSwgRElDTygweDA3YThkYTM4KSwgRElDTygweDEwYjkwMjgwKSwKKyAgICBESUNPKDB4MWEyYTRhMjApLCBESUNPKDB4MjBiMWY2NDApLCBESUNPKDB4Mjc3MDk2YzApLCBESUNPKDB4MmRjNTY4YzApLAorICAgIERJQ08oMHgzNDFiMzNjMCksIERJQ08oMHgzYTAwMDY0MCksIERJQ08oMHg0MDE1Mjg4MCksIERJQ08oMHg0NWVlZWUwMCksCisgICAgRElDTygweDRjMDhjNDgwKSwgRElDTygweDUxYmYwNjAwKSwgRElDTygweDU3OTlhMTgwKSwgRElDTygweDVkMjNkYjgwKSwKKyAgICBESUNPKDB4MDQ3YjE0OTgpLCBESUNPKDB4MDYwODk4NDgpLCBESUNPKDB4MDkwNWFmMjApLCBESUNPKDB4MGJmMTNjMjApLAorICAgIERJQ08oMHgxMWZjZjYyMCksIERJQ08oMHgxZjc5Y2QwMCksIERJQ08oMHgyNTdmNmI0MCksIERJQ08oMHgyY2ZjMjYwMCksCisgICAgRElDTygweDMxNjEwMDQwKSwgRElDTygweDM1ZWE4MjgwKSwgRElDTygweDNjNzc0YmMwKSwgRElDTygweDQ0NDE3MjgwKSwKKyAgICBESUNPKDB4NGI0MzI1MDApLCBESUNPKDB4NTEwZTk0ODApLCBESUNPKDB4NTZmMmU0ODApLCBESUNPKDB4NWQyODI3ODApLAorICAgIERJQ08oMHgwMmNmZDBiMCksIERJQ08oMHgwNDI4NDVkOCksIERJQ08oMHgwYTFmYTYxMCksIERJQ08oMHgxNTkxMWZjMCksCisgICAgRElDTygweDFiYzA3ZjAwKSwgRElDTygweDIyODFkNjQwKSwgRElDTygweDI4N2FiY2MwKSwgRElDTygweDJlYzZiNDAwKSwKKyAgICBESUNPKDB4MzRhMGQwNDApLCBESUNPKDB4M2FhNGRjYzApLCBESUNPKDB4NDA3NGQ5ODApLCBESUNPKDB4NDY3MjZiODApLAorICAgIERJQ08oMHg0YzNiZjkwMCksIERJQ08oMHg1MjA1NTEwMCksIERJQ08oMHg1N2IyMDUwMCksIERJQ08oMHg1ZDM0ZGE4MCksCisgICAgRElDTygweDA0ZDRmNzY4KSwgRElDTygweDA2Y2FkODI4KSwgRElDTygweDBiNTJhNTQwKSwgRElDTygweDBlYTIyNGUwKSwKKyAgICBESUNPKDB4MTNjM2Y0NjApLCBESUNPKDB4MjM4MDg5MDApLCBESUNPKDB4MjdkMWNlYzApLCBESUNPKDB4MmQ2MDUxYzApLAorICAgIERJQ08oMHgzM2M1ZmYwMCksIERJQ08oMHgzN2VmMjQ0MCksIERJQ08oMHgzZDJhNTMwMCksIERJQ08oMHg0MzI2NjAwMCksCisgICAgRElDTygweDRhNTNhMTAwKSwgRElDTygweDUwYWNjZTgwKSwgRElDTygweDU3NjEyMTAwKSwgRElDTygweDVjZGVlMzgwKSwKKyAgICBESUNPKDB4MDQwMzlhODgpLCBESUNPKDB4MDYyNmRjYjApLCBESUNPKDB4MGMwNTk2MjApLCBESUNPKDB4MTJjM2RiMjApLAorICAgIERJQ08oMHgxYmI5ZWI0MCksIERJQ08oMHgyNDBmZGEwMCksIERJQ08oMHgyYmFhYjg0MCksIERJQ08oMHgzMTc3YzVjMCksCisgICAgRElDTygweDM2Y2YyZTQwKSwgRElDTygweDNjMDI1MTAwKSwgRElDTygweDQwYmI4ZDAwKSwgRElDTygweDQ1OTYwODAwKSwKKyAgICBESUNPKDB4NGFkYWNhMDApLCBESUNPKDB4NTA1YTczMDApLCBESUNPKDB4NTY2YTY0MDApLCBESUNPKDB4NWM4Y2UwMDApLAorICAgIERJQ08oMHgwNjI4OTFlOCksIERJQ08oMHgwOTY4MDgxMCksIERJQ08oMHgwZTlhMTFiMCksIERJQ08oMHgxNTIzZTMyMCksCisgICAgRElDTygweDFjNTdkYjAwKSwgRElDTygweDIxZjIyYzgwKSwgRElDTygweDI4YWVlYjAwKSwgRElDTygweDJlNGZkNjAwKSwKKyAgICBESUNPKDB4MzQxY2YwMDApLCBESUNPKDB4M2E1MDM0YzApLCBESUNPKDB4NDA2MDBmODApLCBESUNPKDB4NDYxZmRlMDApLAorICAgIERJQ08oMHg0YzM2ODQ4MCksIERJQ08oMHg1MWRiYmMwMCksIERJQ08oMHg1NzcwOTc4MCksIERJQ08oMHg1Y2NlOTg4MCksCisgICAgRElDTygweDA1ZDQxZjcwKSwgRElDTygweDBhNjViYjMwKSwgRElDTygweDEzMmRkZmEwKSwgRElDTygweDE3ZDI2ODIwKSwKKyAgICBESUNPKDB4MWU2ZDgzODApLCBESUNPKDB4MjRlNjhkYzApLCBESUNPKDB4MmI2OGM0YzApLCBESUNPKDB4MzBmYTI4ODApLAorICAgIERJQ08oMHgzNjE5OThjMCksIERJQ08oMHgzYWExZDY0MCksIERJQ08oMHgzZjk0MjQwMCksIERJQ08oMHg0NGQxMTY4MCksCisgICAgRElDTygweDRhYjhlNTgwKSwgRElDTygweDUwNjQzYjgwKSwgRElDTygweDU2OTdmZTAwKSwgRElDTygweDVjYjNhNzgwKSwKKyAgICBESUNPKDB4MDcwN2ZhMTApLCBESUNPKDB4MGNiOGJlYjApLCBESUNPKDB4MTUwMTFkMjApLCBESUNPKDB4MWE0YWQzMDApLAorICAgIERJQ08oMHgyMDk5NzA4MCksIERJQ08oMHgyNmRiZTI0MCksIERJQ08oMHgyZDkwNzg4MCksIERJQ08oMHgzMzA3YTNjMCksCisgICAgRElDTygweDM4ODE5NzQwKSwgRElDTygweDNkM2U4OWMwKSwgRElDTygweDQxZWEyMzAwKSwgRElDTygweDQ2OWNlMjAwKSwKKyAgICBESUNPKDB4NGJlNjE2ODApLCBESUNPKDB4NTEyNjFiODApLCBESUNPKDB4NTcxNmVmODApLCBESUNPKDB4NWNiYTI5MDApLAorICAgIERJQ08oMHgwODRkYzgzMCksIERJQ08oMHgwZjE2ZjYxMCksIERJQ08oMHgxNmNhMjQyMCksIERJQ08oMHgxYmI1ODM4MCksCisgICAgRElDTygweDIyZjAwZjAwKSwgRElDTygweDI5NmJhNGMwKSwgRElDTygweDMwNmQyNjAwKSwgRElDTygweDM2MmNhMDgwKSwKKyAgICBESUNPKDB4M2I4NmQyODApLCBESUNPKDB4M2ZmYTk2YzApLCBESUNPKDB4NDQ2YTUzMDApLCBESUNPKDB4NDhkMGZkMDApLAorICAgIERJQ08oMHg0ZDhhMDgwMCksIERJQ08oMHg1MjViZjIwMCksIERJQ08oMHg1N2Y1YWEwMCksIERJQ08oMHg1ZDU2OTQ4MCksCisgICAgRElDTygweDA4ZDY2NGYwKSwgRElDTygweDExMGM4NTIwKSwgRElDTygweDE4NjVmYTQwKSwgRElDTygweDFlZmUzMTYwKSwKKyAgICBESUNPKDB4MjZmMzg3NDApLCBESUNPKDB4MmQ0NjA4YzApLCBESUNPKDB4MzI4NjI1MDApLCBESUNPKDB4Mzc0Zjg4NDApLAorICAgIERJQ08oMHgzYmZhOTkwMCksIERJQ08oMHgzZmY1YzhjMCksIERJQ08oMHg0NDUwYzUwMCksIERJQ08oMHg0OTE4ZTY4MCksCisgICAgRElDTygweDRlMWQwZjAwKSwgRElDTygweDUzMzQyNjAwKSwgRElDTygweDU4YTM4ZTAwKSwgRElDTygweDVkYmJmZjAwKSwKKyAgICBESUNPKDB4MDkxNDNmZDApLCBESUNPKDB4MGY0MDFjMzApLCBESUNPKDB4MTY5YzFlZTApLCBESUNPKDB4MWJjZmIyODApLAorICAgIERJQ08oMHgyMTkwZGQwMCksIERJQ08oMHgyN2JmNTZjMCksIERJQ08oMHgyZThlMDY0MCksIERJQ08oMHgzNGI2NzA4MCksCisgICAgRElDTygweDNiNTM0ZGMwKSwgRElDTygweDQxMTM0YzAwKSwgRElDTygweDQ2N2EzMjgwKSwgRElDTygweDRiZDYzNjAwKSwKKyAgICBESUNPKDB4NTBkZTg3MDApLCBESUNPKDB4NTU2NTc1ODApLCBESUNPKDB4NWEwY2VmMDApLCBESUNPKDB4NWU4YWEyMDApLAorICAgIERJQ08oMHgwNmI1ZDg2MCksIERJQ08oMHgwYzhhNTAwMCksIERJQ08oMHgxMzM0MzYyMCksIERJQ08oMHgxN2EyYWJlMCksCisgICAgRElDTygweDFjYWY3MzQwKSwgRElDTygweDIyYTNmNzQwKSwgRElDTygweDI5MDU5OTgwKSwgRElDTygweDJlY2ZmODgwKSwKKyAgICBESUNPKDB4MzRjZTBmMDApLCBESUNPKDB4M2FkMzIyODApLCBESUNPKDB4NDBmMDhkODApLCBESUNPKDB4NDZkMWQ0MDApLAorICAgIERJQ08oMHg0Y2E5ZGYwMCksIERJQ08oMHg1MjNiOTU4MCksIERJQ08oMHg1N2VhOWI4MCksIERJQ08oMHg1ZDRhOWEwMCksCisgICAgRElDTygweDAzODIyZmVjKSwgRElDTygweDA1MjJjNjcwKSwgRElDTygweDA5OWY4OWEwKSwgRElDTygweDEyZGRjOWMwKSwKKyAgICBESUNPKDB4MTdjM2QzODApLCBESUNPKDB4MWQyN2VjMjApLCBESUNPKDB4MjIxOWU0ODApLCBESUNPKDB4MjVmZGY1ODApLAorICAgIERJQ08oMHgzMjlkNjUwMCksIERJQ08oMHgzNjhiYTA0MCksIERJQ08oMHgzYWZlZGIwMCksIERJQ08oMHg0MzBkYjk4MCksCisgICAgRElDTygweDRhMTA1MzgwKSwgRElDTygweDUxMjA1MDgwKSwgRElDTygweDU2NzNiODgwKSwgRElDTygweDVjYTJlNTAwKSwKKyAgICBESUNPKDB4MDRlMDc0MDgpLCBESUNPKDB4MDZhMTNkYzApLCBESUNPKDB4MGIzMWM3ODApLCBESUNPKDB4MGU2N2ZjZDApLAorICAgIERJQ08oMHgxMzcyMzI0MCksIERJQ08oMHgxZjg3YTg0MCksIERJQ08oMHgyMzIxYWIwMCksIERJQ08oMHgyYzYwNDY4MCksCisgICAgRElDTygweDMxMGJjMTgwKSwgRElDTygweDM1MWVlYTQwKSwgRElDTygweDNhMmQ2NDQwKSwgRElDTygweDNlN2ViYWMwKSwKKyAgICBESUNPKDB4NDc5OGVmODApLCBESUNPKDB4NTA3MjExMDApLCBESUNPKDB4NTdmZjk4ODApLCBESUNPKDB4NWRjMmUwODApLAorICAgIERJQ08oMHgwNWQ2MjZiOCksIERJQ08oMHgwN2VhZjE0MCksIERJQ08oMHgwYzU2NzViMCksIERJQ08oMHgwZWJhN2IwMCksCisgICAgRElDTygweDFhN2YzNmMwKSwgRElDTygweDFmOTY5MjAwKSwgRElDTygweDI0NGQ4YzAwKSwgRElDTygweDI5NjY2NDQwKSwKKyAgICBESUNPKDB4MmM5NGIxMDApLCBESUNPKDB4MzE4NjUzODApLCBESUNPKDB4MzcxM2MwMDApLCBESUNPKDB4M2MyMjhmNDApLAorICAgIERJQ08oMHg0Mjk2ZWQ4MCksIERJQ08oMHg0ZGNiZGUwMCksIERJQ08oMHg1NjA1OWEwMCksIERJQ08oMHg1YzkzMmQwMCksCisgICAgRElDTygweDA3ZGNlYjIwKSwgRElDTygweDBiNTMzZmUwKSwgRElDTygweDBlYjE4ODgwKSwgRElDTygweDEzMTI0MjIwKSwKKyAgICBESUNPKDB4MTY3Zjc0ZTApLCBESUNPKDB4MWFmYmVlNDApLCBESUNPKDB4MjI5ZTJmODApLCBESUNPKDB4MjZiMDVlYzApLAorICAgIERJQ08oMHgyYzdiNDA0MCksIERJQ08oMHgzMjgwNjE0MCksIERJQ08oMHgzOGRhNjU0MCksIERJQ08oMHgzZTQ5NTU0MCksCisgICAgRElDTygweDQ0NGQzODgwKSwgRElDTygweDRlNzg0NDAwKSwgRElDTygweDU4NjVmNTgwKSwgRElDTygweDVlNjE2MTgwKSwKKyAgICBESUNPKDB4MDYzOTU3OTApLCBESUNPKDB4MDg0YjhmMjApLCBESUNPKDB4MGQwZTI2YTApLCBESUNPKDB4MTA4OTdhYzApLAorICAgIERJQ08oMHgxNGJjZDA4MCksIERJQ08oMHgxYzViYWJlMCksIERJQ08oMHgyMTA4ZjljMCksIERJQ08oMHgyNzRmOGU4MCksCisgICAgRElDTygweDJiMGJhMTgwKSwgRElDTygweDMwNWI4NDgwKSwgRElDTygweDM4M2FkMzAwKSwgRElDTygweDNlMzRmNDQwKSwKKyAgICBESUNPKDB4NDdmN2FhMDApLCBESUNPKDB4NGZkYjU4ODApLCBESUNPKDB4NTZiOGMyODApLCBESUNPKDB4NWQwN2Q3MDApLAorICAgIERJQ08oMHgwNTFmMDg4MCksIERJQ08oMHgwNzFiOGZhOCksIERJQ08oMHgwY2U3OWM5MCksIERJQ08oMHgxMDA1YmQ2MCksCisgICAgRElDTygweDE0YTRhMDgwKSwgRElDTygweDE4M2RlZjQwKSwgRElDTygweDFlZThkMGEwKSwgRElDTygweDJjNWI5YmMwKSwKKyAgICBESUNPKDB4MzA5ZjlkYzApLCBESUNPKDB4MzU2NTkzODApLCBESUNPKDB4M2MwNDM5YzApLCBESUNPKDB4NDk2MDM4MDApLAorICAgIERJQ08oMHg1MDE4YTgwMCksIERJQ08oMHg1NDg2MjM4MCksIERJQ08oMHg1OTNlZGQ4MCksIERJQ08oMHg1ZDQxNWI4MCksCisgICAgRElDTygweDA1MWM4MTA4KSwgRElDTygweDA2YmQ5N2Q4KSwgRElDTygweDBiNDdkMDMwKSwgRElDTygweDBkOWM4MWEwKSwKKyAgICBESUNPKDB4MTc4ZjBiZTApLCBESUNPKDB4MWNkZjdjODApLCBESUNPKDB4MjE4M2RiNDApLCBESUNPKDB4MjZlYzcxODApLAorICAgIERJQ08oMHgyYTM4NTZjMCksIERJQ08oMHgzNjZjOWI0MCksIERJQ08oMHgzZDM2MTFjMCksIERJQ08oMHg0Mjc4ODEwMCksCisgICAgRElDTygweDQ5ODFmMjAwKSwgRElDTygweDRkZDY4MzgwKSwgRElDTygweDU1Mjg2YTAwKSwgRElDTygweDVjYzcyNTAwKSwKKyAgICBESUNPKDB4MDZlZTU4YzgpLCBESUNPKDB4MDk4YjEzMTApLCBESUNPKDB4MGNjYmQ4ODApLCBESUNPKDB4MGY5ZDY4ZjApLAorICAgIERJQ08oMHgxMjc3YWM0MCksIERJQ08oMHgxZDcxZmFhMCksIERJQ08oMHgyMzBkOTQ4MCksIERJQ08oMHgyNzZiOGMwMCksCisgICAgRElDTygweDJlYzc3MDAwKSwgRElDTygweDMxZjJhNzAwKSwgRElDTygweDNiZWUwMjAwKSwgRElDTygweDQyMjUwNzAwKSwKKyAgICBESUNPKDB4NDY2YjcxMDApLCBESUNPKDB4NGRlNDE5ODApLCBESUNPKDB4NTZhMDhkODApLCBESUNPKDB4NWQ3MDA4ODApLAorICAgIERJQ08oMHgwNjJmMWQ4MCksIERJQ08oMHgwOTFiY2QzMCksIERJQ08oMHgwY2Q4NzVlMCksIERJQ08oMHgwZmQ0MmU2MCksCisgICAgRElDTygweDEzMjJiOTgwKSwgRElDTygweDFmMTFiNDgwKSwgRElDTygweDI2NTFlNWMwKSwgRElDTygweDI5ZjliNDgwKSwKKyAgICBESUNPKDB4MmUyMzg4NDApLCBESUNPKDB4MzBmYzU4YzApLCBESUNPKDB4MzdhYTMwNDApLCBESUNPKDB4M2U5YWM1ODApLAorICAgIERJQ08oMHg0NGM2ZmQwMCksIERJQ08oMHg0ZWJhNDMwMCksIERJQ08oMHg1NmZkYWQwMCksIERJQ08oMHg1ZDg4NTcwMCksCisgICAgRElDTygweDA0MjEzYTc4KSwgRElDTygweDA1ZDAyOGMwKSwgRElDTygweDA5YTFmOWUwKSwgRElDTygweDBkMjhhZTkwKSwKKyAgICBESUNPKDB4MTUxODE5YTApLCBESUNPKDB4MWM3OGM4NjApLCBESUNPKDB4MjFkNzhmMDApLCBESUNPKDB4Mjk5OTJjYzApLAorICAgIERJQ08oMHgyZmJkYzE4MCksIERJQ08oMHgzNmJhYjcwMCksIERJQ08oMHgzZDRkYjFjMCksIERJQ08oMHg0NDAyYTI4MCksCisgICAgRElDTygweDRhOTIwNzAwKSwgRElDTygweDUwOTg4NjAwKSwgRElDTygweDU3MTdjMTAwKSwgRElDTygweDVkNTJjMjAwKSwKKyAgICBESUNPKDB4MDM2YWY0YmMpLCBESUNPKDB4MDUxNGNmNDApLCBESUNPKDB4MDllYzJkMzApLCBESUNPKDB4MTEzZGUxNjApLAorICAgIERJQ08oMHgxOTkxYjcwMCksIERJQ08oMHgyMDU5MGJjMCksIERJQ08oMHgyMzg5MmEwMCksIERJQ08oMHgyNjU0Y2QwMCksCisgICAgRElDTygweDJmZjVjMGMwKSwgRElDTygweDM4N2VkMzgwKSwgRElDTygweDNlMzA1MzAwKSwgRElDTygweDQ2MTM3NzAwKSwKKyAgICBESUNPKDB4NGJjMjkxMDApLCBESUNPKDB4NGY5NmRkODApLCBESUNPKDB4NTY0YWNhMDApLCBESUNPKDB4NWM0ZDllODApLAorICAgIERJQ08oMHgwNDEwNTFhMCksIERJQ08oMHgwNzM0ZGFkOCksIERJQ08oMHgxMDY0ZTc4MCksIERJQ08oMHgxNGQ4YmYwMCksCisgICAgRElDTygweDE5NzI3ZTQwKSwgRElDTygweDFmN2JlZGUwKSwgRElDTygweDI1YjVlYmMwKSwgRElDTygweDJjNzFmZDQwKSwKKyAgICBESUNPKDB4MzI4MTM3NDApLCBESUNPKDB4MzkzNDBjODApLCBESUNPKDB4M2Y5NzRmNDApLCBESUNPKDB4NDVjYTE1ODApLAorICAgIERJQ08oMHg0YmU2OWYwMCksIERJQ08oMHg1MWM5YzkwMCksIERJQ08oMHg1N2ExY2U4MCksIERJQ08oMHg1ZDBiMmIwMCksCisgICAgRElDTygweDA0YjczMDA4KSwgRElDTygweDA2NTk4YjYwKSwgRElDTygweDBiMGFlZTAwKSwgRElDTygweDE1YWM3YmEwKSwKKyAgICBESUNPKDB4MThiNWUzNDApLCBESUNPKDB4MWY1MzA4YzApLCBESUNPKDB4MjNjZmM0YzApLCBESUNPKDB4MjdkM2ZkYzApLAorICAgIERJQ08oMHgzMDEzODA4MCksIERJQ08oMHgzNDNjODVjMCksIERJQ08oMHgzODljYjU0MCksIERJQ08oMHg0MmRlZjkwMCksCisgICAgRElDTygweDRhYTZhMDAwKSwgRElDTygweDRmNzE5NTgwKSwgRElDTygweDU1ODVkMDgwKSwgRElDTygweDViYzAzZjAwKSwKKyAgICBESUNPKDB4MDU2MDFiODgpLCBESUNPKDB4MDc2MTZiODgpLCBESUNPKDB4MGMyMmJhNDApLCBESUNPKDB4MTZiYzgyMDApLAorICAgIERJQ08oMHgxOTJlYmY4MCksIERJQ08oMHgxZjcxYzEyMCksIERJQ08oMHgyNWM1OWQwMCksIERJQ08oMHgyOGY3NmQwMCksCisgICAgRElDTygweDMzZGJkZDgwKSwgRElDTygweDM5ZjQwZDgwKSwgRElDTygweDNkYTBjODgwKSwgRElDTygweDQzMmMxZTAwKSwKKyAgICBESUNPKDB4NGFhMTlkODApLCBESUNPKDB4NTEwMDZmODApLCBESUNPKDB4NTZhNjJlODApLCBESUNPKDB4NWM2N2QwMDApLAorICAgIERJQ08oMHgwNTMwOTVkMCksIERJQ08oMHgwNmM0M2ZjOCksIERJQ08oMHgwZjgwYTQ2MCksIERJQ08oMHgxMzliNDk2MCksCisgICAgRElDTygweDE3NjllZDgwKSwgRElDTygweDFjODI4YjAwKSwgRElDTygweDIxMTk1OTgwKSwgRElDTygweDI2MzI5ODAwKSwKKyAgICBESUNPKDB4MjlmMzU5MDApLCBESUNPKDB4MmRjOWRmODApLCBESUNPKDB4Mzc5NWYwYzApLCBESUNPKDB4NDMxMzliMDApLAorICAgIERJQ08oMHg0YWNhZTY4MCksIERJQ08oMHg1MDQ4ZGUwMCksIERJQ08oMHg1N2MxMTg4MCksIERJQ08oMHg1ZGIzNTkwMCksCisgICAgRElDTygweDA0NjZlMTgwKSwgRElDTygweDA1ZDMxNTUwKSwgRElDTygweDEwY2FkMjAwKSwgRElDTygweDE2OGMyYmUwKSwKKyAgICBESUNPKDB4MWE1ZTk1ODApLCBESUNPKDB4MWVmMmQ0ODApLCBESUNPKDB4MjM4ZGIyNDApLCBESUNPKDB4MjkyMGNlODApLAorICAgIERJQ08oMHgyYzgwYjRjMCksIERJQ08oMHgzMGJiMjcwMCksIERJQ08oMHgzOGIyNTdjMCksIERJQ08oMHg0NmFiZDU4MCksCisgICAgRElDTygweDRjMzBkZDgwKSwgRElDTygweDUwZTUxODgwKSwgRElDTygweDU3ODJhYjgwKSwgRElDTygweDVkMjNkYTgwKSwKKyAgICBESUNPKDB4MDY3MDBmNzgpLCBESUNPKDB4MDg1ZWMwYTApLCBESUNPKDB4MGMwMzcyODApLCBESUNPKDB4MTZkOTBhNjApLAorICAgIERJQ08oMHgxYmY0NmMwMCksIERJQ08oMHgxZTZmNDc0MCksIERJQ08oMHgyMmMyYzE4MCksIERJQ08oMHgyNjNmYTJjMCksCisgICAgRElDTygweDJjNGE3NGMwKSwgRElDTygweDM2NDJiMDQwKSwgRElDTygweDNhNDc2OTAwKSwgRElDTygweDNlYTEyODQwKSwKKyAgICBESUNPKDB4NDZiNmU4ODApLCBESUNPKDB4NGI1YmFkODApLCBESUNPKDB4NTE1MmE1MDApLCBESUNPKDB4NWMxYzYwODApLAorICAgIERJQ08oMHgwNDFmODEwOCksIERJQ08oMHgwNWVmMWQ5OCksIERJQ08oMHgwY2U0MzMwMCksIERJQ08oMHgxMTY0N2NjMCksCisgICAgRElDTygweDE2ZTc3ZmUwKSwgRElDTygweDFjZGFmYzQwKSwgRElDTygweDIxODgzMmMwKSwgRElDTygweDI2ZGQxYjQwKSwKKyAgICBESUNPKDB4MmM3NzYxMDApLCBESUNPKDB4MzRmMWViODApLCBESUNPKDB4M2NhZjYxMDApLCBESUNPKDB4NDU2MzBhODApLAorICAgIERJQ08oMHg0YzBjNTM4MCksIERJQ08oMHg1MTdhZTk4MCksIERJQ08oMHg1NjdmNDI4MCksIERJQ08oMHg1YzRiZjkwMCksCisgICAgRElDTygweDA2NjczZjE4KSwgRElDTygweDA5MWVlNTEwKSwgRElDTygweDBkNmNjYjEwKSwgRElDTygweDEyNTAzMjQwKSwKKyAgICBESUNPKDB4MTU4Njk2ZTApLCBESUNPKDB4MWYwMzU0MjApLCBESUNPKDB4MjRlNmVhYzApLCBESUNPKDB4MmEwM2JmNDApLAorICAgIERJQ08oMHgzMjlhYTAwMCksIERJQ08oMHgzNzVhYWZjMCksIERJQ08oMHgzZGExMzNjMCksIERJQ08oMHg0NTY0NTYwMCksCisgICAgRElDTygweDRjNDQ3YzAwKSwgRElDTygweDUxYTI2YjAwKSwgRElDTygweDU3OTE3YzAwKSwgRElDTygweDVjNTU3NjgwKSwKKyAgICBESUNPKDB4MDRmODRjMTgpLCBESUNPKDB4MDZkYjRjMzApLCBESUNPKDB4MGQ1M2E5NDApLCBESUNPKDB4MTA5NWNkMjApLAorICAgIERJQ08oMHgxNDJiMGIyMCksIERJQ08oMHgxODQyMjljMCksIERJQ08oMHgyMDE0NzI4MCksIERJQ08oMHgyNTE1Mjc0MCksCisgICAgRElDTygweDJkYjg5ZmMwKSwgRElDTygweDM1ZjNkMjAwKSwgRElDTygweDQwMGFhNjgwKSwgRElDTygweDQ3YTUxYzAwKSwKKyAgICBESUNPKDB4NGQ5YzVjMDApLCBESUNPKDB4NTI1ZDE2ODApLCBESUNPKDB4NTgzMmFmMDApLCBESUNPKDB4NWQyN2Q1ODApLAorICAgIERJQ08oMHgwNWM5NzNkMCksIERJQ08oMHgwN2MyNTgxMCksIERJQ08oMHgwZTkyOGU1MCksIERJQ08oMHgxMmY1YWQwMCksCisgICAgRElDTygweDE2YjJhODAwKSwgRElDTygweDFjMmM5Y2UwKSwgRElDTygweDIwYjBmMTAwKSwgRElDTygweDI4YmUxOTQwKSwKKyAgICBESUNPKDB4MmQwZjNjMDApLCBESUNPKDB4MzBhMDZmNDApLCBESUNPKDB4Mzk5ZTQzNDApLCBESUNPKDB4NDZiNDgyODApLAorICAgIERJQ08oMHg0YmJiYzMwMCksIERJQ08oMHg1MDI4MzcwMCksIERJQ08oMHg1NGExYTgwMCksIERJQ08oMHg1YWIyMGM4MCksCisgICAgRElDTygweDAzZGY5MzkwKSwgRElDTygweDA1NWZmMWUwKSwgRElDTygweDBiYmViNjQwKSwgRElDTygweDE3ZDkwNmMwKSwKKyAgICBESUNPKDB4MWFjMjAxNDApLCBESUNPKDB4MWZkODQ0NDApLCBESUNPKDB4MjQ1MDI2MDApLCBESUNPKDB4MmE5ZmU2NDApLAorICAgIERJQ08oMHgyZWY3OTcwMCksIERJQ08oMHgzNGNiZWQ0MCksIERJQ08oMHgzYzQ4Y2QwMCksIERJQ08oMHg0M2NjY2U4MCksCisgICAgRElDTygweDQ5YjFkNTAwKSwgRElDTygweDUwMTQ1ZTAwKSwgRElDTygweDU2ZjE2ZjgwKSwgRElDTygweDVkNDZkZDgwKSwKKyAgICBESUNPKDB4MDRhNjllZjApLCBESUNPKDB4MDY0NzA0ODApLCBESUNPKDB4MGRlZmJkMDApLCBESUNPKDB4MTU5MGU5MDApLAorICAgIERJQ08oMHgxODExNDAwMCksIERJQ08oMHgxYmRhNmM2MCksIERJQ08oMHgxZjY0ZDE2MCksIERJQ08oMHgyOGQ4ZDY0MCksCisgICAgRElDTygweDJkNGUyODgwKSwgRElDTygweDM0Y2ZlMzgwKSwgRElDTygweDNiNzA3N2MwKSwgRElDTygweDQyZjM2YTgwKSwKKyAgICBESUNPKDB4NDk2MTU1ODApLCBESUNPKDB4NGZmOWQyMDApLCBESUNPKDB4NTY1N2VmODApLCBESUNPKDB4NWNiOTEzMDApLAorICAgIERJQ08oMHgwMzg4OTNkYyksIERJQ08oMHgwNTM1Y2RmMCksIERJQ08oMHgwYWFiZmY4MCksIERJQ08oMHgxNDZkYWFhMCksCisgICAgRElDTygweDE4NDhjNzAwKSwgRElDTygweDFjZTU3OGMwKSwgRElDTygweDIxMTE2MDAwKSwgRElDTygweDJiMTE2ZDQwKSwKKyAgICBESUNPKDB4MzIxMTM1MDApLCBESUNPKDB4Mzc1MWE0ODApLCBESUNPKDB4M2U4OGMyMDApLCBESUNPKDB4NDRjYjE4MDApLAorICAgIERJQ08oMHg0YWYxYzIwMCksIERJQ08oMHg1MTIyYjk4MCksIERJQ08oMHg1NzgyYmM4MCksIERJQ08oMHg1ZDIwYmUwMCksCisgICAgRElDTygweDAzMTE4NDM0KSwgRElDTygweDA0YWZlMmU4KSwgRElDTygweDA4ZjE0NGYwKSwgRElDTygweDEyYzc4N2MwKSwKKyAgICBESUNPKDB4MWMzMmU0ZTApLCBESUNPKDB4MWY3MDExODApLCBESUNPKDB4MjM2MmY3NDApLCBESUNPKDB4MmI5OTVjYzApLAorICAgIERJQ08oMHgzMzIyYzU0MCksIERJQ08oMHgzOTUxZjIwMCksIERJQ08oMHgzZjdjMmM4MCksIERJQ08oMHg0NTY5YzQ4MCksCisgICAgRElDTygweDRiMmE2MjAwKSwgRElDTygweDUwOTA1ZTgwKSwgRElDTygweDU2MjM2NjgwKSwgRElDTygweDVjMzJmYTAwKSwKKyAgICBESUNPKDB4MDQ2MGMzYjApLCBESUNPKDB4MDYxZTEzNzgpLCBESUNPKDB4MGIwN2Y2MTApLCBESUNPKDB4MTY2ZTA2ODApLAorICAgIERJQ08oMHgxOGQwZjAyMCksIERJQ08oMHgyMTEyMDM0MCksIERJQ08oMHgyNGQ0YzAwMCksIERJQ08oMHgyOWJhZmMwMCksCisgICAgRElDTygweDMzOGMwNzQwKSwgRElDTygweDM2Y2ZiYzAwKSwgRElDTygweDNmMzEzOTAwKSwgRElDTygweDQ3YmY5YzAwKSwKKyAgICBESUNPKDB4NGRkNWQ0ODApLCBESUNPKDB4NTI4NDgyMDApLCBESUNPKDB4NTg1YWRkMDApLCBESUNPKDB4NWNmN2I0ODApLAorICAgIERJQ08oMHgwNDFhNGJjOCksIERJQ08oMHgwNWNhMDkyMCksIERJQ08oMHgwYTNhZTViMCksIERJQ08oMHgxM2ZiYjg0MCksCisgICAgRElDTygweDFjZGQzZDAwKSwgRElDTygweDIwOWQ1YjgwKSwgRElDTygweDI3ZTc4ZTgwKSwgRElDTygweDJkMWY0ZWMwKSwKKyAgICBESUNPKDB4MzJkODRjODApLCBESUNPKDB4M2I4YWE2ODApLCBESUNPKDB4NDI4OWMxODApLCBESUNPKDB4NDZjMzM1ODApLAorICAgIERJQ08oMHg0YzIzZTU4MCksIERJQ08oMHg1MTU4MzE4MCksIERJQ08oMHg1NmY1MjY4MCksIERJQ08oMHg1YzdhM2QwMCksCisgICAgRElDTygweDAzMDY3NDA0KSwgRElDTygweDA1OTE0MDM4KSwgRElDTygweDEwZDMzZTYwKSwgRElDTygweDE3Mzc3MTgwKSwKKyAgICBESUNPKDB4MWQ3ZjMyYTApLCBESUNPKDB4MjM4NDg4ODApLCBESUNPKDB4MjlkMzIyMDApLCBESUNPKDB4MmZiMTY3YzApLAorICAgIERJQ08oMHgzNTZjODQ4MCksIERJQ08oMHgzYjQyMDI4MCksIERJQ08oMHg0MTA2ZDA4MCksIERJQ08oMHg0NmQyOTI4MCksCisgICAgRElDTygweDRjOGExMjAwKSwgRElDTygweDUyMzgzMzAwKSwgRElDTygweDU3ZGI4ZjgwKSwgRElDTygweDVkNjFmMjAwKSwKKyAgICBESUNPKDB4MDRiYWYzNjgpLCBESUNPKDB4MDY2NzBhMDgpLCBESUNPKDB4MGUwY2JkOTApLCBESUNPKDB4MTI2Mjk5YzApLAorICAgIERJQ08oMHgxN2VkNzIyMCksIERJQ08oMHgxZTM2OTkwMCksIERJQ08oMHgyMmQ3ZDMwMCksIERJQ08oMHgyYzBmOTMwMCksCisgICAgRElDTygweDJmNWU3ZmMwKSwgRElDTygweDNiN2MwZDQwKSwgRElDTygweDQwNWFmZjgwKSwgRElDTygweDQ0ZjJlZjgwKSwKKyAgICBESUNPKDB4NDk4MmI0MDApLCBESUNPKDB4NGU1MDEzODApLCBESUNPKDB4NTM5ZGFhMDApLCBESUNPKDB4NWMxMTRiMDApLAorICAgIERJQ08oMHgwNjk0YzE3MCksIERJQ08oMHgwOTJkNjg5MCksIERJQ08oMHgwZDBmYWVlMCksIERJQ08oMHgxMzgwMGQwMCksCisgICAgRElDTygweDE3MGY4ZDgwKSwgRElDTygweDFiY2Q4MjQwKSwgRElDTygweDI0NmE4NDgwKSwgRElDTygweDI4YmFiNjQwKSwKKyAgICBESUNPKDB4MmY0ODJhYzApLCBESUNPKDB4MzZlNzM2YzApLCBESUNPKDB4M2FhYTY4YzApLCBESUNPKDB4M2ZjNDM1MDApLAorICAgIERJQ08oMHg0NmUxNjAwMCksIERJQ08oMHg0YjNmYmMwMCksIERJQ08oMHg0ZmY2OGU4MCksIERJQ08oMHg1YWFiZjYwMCksCisgICAgRElDTygweDA1ZTg0OWEwKSwgRElDTygweDBiNDg1YTgwKSwgRElDTygweDE0YmU1MmMwKSwgRElDTygweDFhMDc5MzgwKSwKKyAgICBESUNPKDB4MWU4YjFjZTApLCBESUNPKDB4MjJmYmNhMDApLCBESUNPKDB4MjhjMzZhNDApLCBESUNPKDB4MmUzYjJhMDApLAorICAgIERJQ08oMHgzNDM2MGI4MCksIERJQ08oMHgzYTI0Y2YwMCksIERJQ08oMHgzZmZmNjIwMCksIERJQ08oMHg0NWE2YmYwMCksCisgICAgRElDTygweDRiYWY3ODAwKSwgRElDTygweDUxNzIwZTgwKSwgRElDTygweDU3NTYwYzgwKSwgRElDTygweDVjZTU3ZTAwKSwKKyAgICBESUNPKDB4MDc1MWRhMzgpLCBESUNPKDB4MGYwOTQ5ZjApLCBESUNPKDB4MTgxNDE4NjApLCBESUNPKDB4MWRmY2IyYzApLAorICAgIERJQ08oMHgyNGFkYmYwMCksIERJQ08oMHgyOTZhZjI0MCksIERJQ08oMHgyZGJlNjBjMCksIERJQ08oMHgzMTc5YWU0MCksCisgICAgRElDTygweDM1ZWM0NDAwKSwgRElDTygweDNhYjc2NDAwKSwgRElDTygweDQwMzRmNDAwKSwgRElDTygweDQ1Y2ZjNzAwKSwKKyAgICBESUNPKDB4NGJlYTZiMDApLCBESUNPKDB4NTE2ZjVmMDApLCBESUNPKDB4NTc2NTUzMDApLCBESUNPKDB4NWNmYzBlMDApLAorICAgIERJQ08oMHgwNjk5MDBkMCksIERJQ08oMHgwZDM3OTUyMCksIERJQ08oMHgxNzVkMDU2MCksIERJQ08oMHgxYzRkOTJjMCksCisgICAgRElDTygweDIxNDA3NjgwKSwgRElDTygweDI1MGQwMzQwKSwgRElDTygweDI5ODA0OTQwKSwgRElDTygweDJkZmI5YWMwKSwKKyAgICBESUNPKDB4MzM3YTFmODApLCBESUNPKDB4MzkxMDVmYzApLCBESUNPKDB4M2VmZDAzODApLCBESUNPKDB4NDRiY2UzODApLAorICAgIERJQ08oMHg0YjA3Y2M4MCksIERJQ08oMHg1MGFkN2QwMCksIERJQ08oMHg1NmRkY2U4MCksIERJQ08oMHg1Y2I5YTAwMCksCisgICAgRElDTygweDA2OWM2OTQ4KSwgRElDTygweDBhNTZlYTEwKSwgRElDTygweDBmN2NjYTIwKSwgRElDTygweDEyZDE4NjgwKSwKKyAgICBESUNPKDB4MTcwMzZkMDApLCBESUNPKDB4MWY0YzFlODApLCBESUNPKDB4MjYyZTU1NDApLCBESUNPKDB4MmI5NTFlNDApLAorICAgIERJQ08oMHgzNDY4YWQ0MCksIERJQ08oMHgzYTJiMjEwMCksIERJQ08oMHgzZjAyZjBjMCksIERJQ08oMHg0MzgzZTQwMCksCisgICAgRElDTygweDQ4Mzc0MTgwKSwgRElDTygweDRkOGVlYzgwKSwgRElDTygweDU0ZDc0ODAwKSwgRElDTygweDVjMzA5NjAwKSwKKyAgICBESUNPKDB4MDVhNTAxNTgpLCBESUNPKDB4MDc5N2UzNTApLCBESUNPKDB4MGNmMWYyMzApLCBESUNPKDB4MTRmM2ZiMjApLAorICAgIERJQ08oMHgxNzY3NjQwMCksIERJQ08oMHgyMDYzNjc4MCksIERJQ08oMHgyNjE3ZWY4MCksIERJQ08oMHgyOWNiZjcwMCksCisgICAgRElDTygweDMyZWQ1N2MwKSwgRElDTygweDM3NGMzMDgwKSwgRElDTygweDNiMzQ4ZTQwKSwgRElDTygweDNmZGUwMTgwKSwKKyAgICBESUNPKDB4NDRkMzhjMDApLCBESUNPKDB4NGE4YzYxMDApLCBESUNPKDB4NTVmMGU0MDApLCBESUNPKDB4NWRmZWQxMDApLAorICAgIERJQ08oMHgwNGI3NDIyOCksIERJQ08oMHgwNjIzZDNlMCksIERJQ08oMHgwYWI0YzY3MCksIERJQ08oMHgxYmRlN2ZhMCksCisgICAgRElDTygweDFmY2I2YWMwKSwgRElDTygweDIzNDRhNTQwKSwgRElDTygweDI3NWY3YzQwKSwgRElDTygweDJiN2E4MzAwKSwKKyAgICBESUNPKDB4MzE0MDc0NDApLCBESUNPKDB4MzUyMzc3MDApLCBESUNPKDB4Mzg3OTg1NDApLCBESUNPKDB4M2QwYWYzNDApLAorICAgIERJQ08oMHg0MjI0Yzk4MCksIERJQ08oMHg0OWExNzkwMCksIERJQ08oMHg1NzcwMjg4MCksIERJQ08oMHg1ZGJhNGMwMCksCisgICAgRElDTygweDAzYzgzYzg0KSwgRElDTygweDA1Y2M1MmQ4KSwgRElDTygweDBiNjQ0YzEwKSwgRElDTygweDEyOWFiOWEwKSwKKyAgICBESUNPKDB4MWNlZTQ2YzApLCBESUNPKDB4MjE1MmIwODApLCBESUNPKDB4MjQ3YjFjMDApLCBESUNPKDB4Mjc2OTcxODApLAorICAgIERJQ08oMHgzMDRmNzUwMCksIERJQ08oMHgzODk1ZDg4MCksIERJQ08oMHgzYzNhMTc0MCksIERJQ08oMHg0MTNhY2U4MCksCisgICAgRElDTygweDQ2MmIwMTAwKSwgRElDTygweDRhYjA3ZTAwKSwgRElDTygweDUwOTY3NTgwKSwgRElDTygweDViYTVlNzAwKSwKKyAgICBESUNPKDB4MDZiY2ZkYTgpLCBESUNPKDB4MDhjOGI5MjApLCBESUNPKDB4MGRlMjE1MzApLCBESUNPKDB4MTAyOGQzMjApLAorICAgIERJQ08oMHgxNjhjZmUwMCksIERJQ08oMHgyMGY3OGE0MCksIERJQ08oMHgyNDg0OTNjMCksIERJQ08oMHgyYzM0YmY4MCksCisgICAgRElDTygweDJmZjg4NTQwKSwgRElDTygweDMyZDI4YzQwKSwgRElDTygweDM2ZDk5NjQwKSwgRElDTygweDQ0MzhlNTAwKSwKKyAgICBESUNPKDB4NGJhY2RiMDApLCBESUNPKDB4NTAzNDM3MDApLCBESUNPKDB4NTZiNzkwODApLCBESUNPKDB4NWI2OTRkMDApLAorICAgIERJQ08oMHgwNjkxMDlhMCksIERJQ08oMHgwYTczYmM1MCksIERJQ08oMHgwZTNjODMzMCksIERJQ08oMHgxMzA4MjYyMCksCisgICAgRElDTygweDFjM2EzNzYwKSwgRElDTygweDIwMGI1ZTgwKSwgRElDTygweDI1NmE0ODgwKSwgRElDTygweDJiMjU2YWMwKSwKKyAgICBESUNPKDB4MmYzNGFmYzApLCBESUNPKDB4MzU1ODAyMDApLCBESUNPKDB4M2UwYmQ5YzApLCBESUNPKDB4NDNkOTI5MDApLAorICAgIERJQ08oMHg0OTRlNmUwMCksIERJQ08oMHg0ZjFhMjc4MCksIERJQ08oMHg1NTMyYTk4MCksIERJQ08oMHg1YTgzNWE4MCksCisgICAgRElDTygweDA0MDUzNDUwKSwgRElDTygweDA1Y2I4ZmUwKSwgRElDTygweDA5NzM4N2IwKSwgRElDTygweDExMjFhZjAwKSwKKyAgICBESUNPKDB4MWFiZjYyYzApLCBESUNPKDB4MWUzOWJiZTApLCBESUNPKDB4MjQzZGUzMDApLCBESUNPKDB4MmI0NDBlYzApLAorICAgIERJQ08oMHgyZjJjMTQ4MCksIERJQ08oMHgzNDY5N2Q4MCksIERJQ08oMHg0MDVmODYwMCksIERJQ08oMHg0NDBiNmY4MCksCisgICAgRElDTygweDQ3MzczMTAwKSwgRElDTygweDRjNzY0ZjgwKSwgRElDTygweDU1MjkzNzgwKSwgRElDTygweDVjNTlhNzgwKSwKKyAgICBESUNPKDB4MDNjNWI0YTQpLCBESUNPKDB4MDU2ZmIzODApLCBESUNPKDB4MDliOGY5MTApLCBESUNPKDB4MTM4MzNmYTApLAorICAgIERJQ08oMHgxODVlZWQ2MCksIERJQ08oMHgxY2UzM2Q0MCksIERJQ08oMHgyNDJlNDEwMCksIERJQ08oMHgyODJlNWI4MCksCisgICAgRElDTygweDJjZmU0ZDQwKSwgRElDTygweDM4YTA2ZDgwKSwgRElDTygweDNlMDAyMjQwKSwgRElDTygweDQyM2JlNDAwKSwKKyAgICBESUNPKDB4NDlhNWU2MDApLCBESUNPKDB4NTA5MmI3ODApLCBESUNPKDB4NTcwMjNkMDApLCBESUNPKDB4NWQ1ZjdjODApLAorICAgIERJQ08oMHgwNzdhZGEzOCksIERJQ08oMHgwOWQ1YWM3MCksIERJQ08oMHgwZTU4YmUzMCksIERJQ08oMHgxNGZiMjA0MCksCisgICAgRElDTygweDE3ZmM5ZGMwKSwgRElDTygweDFjMmMzMWUwKSwgRElDTygweDI2Y2YxYjAwKSwgRElDTygweDJhOTFiYTgwKSwKKyAgICBESUNPKDB4MmVkODgwYzApLCBESUNPKDB4MzhjYmY5MDApLCBESUNPKDB4M2QyZmM3MDApLCBESUNPKDB4NDA1ZDIyODApLAorICAgIERJQ08oMHg0MzljMWQwMCksIERJQ08oMHg0ZGQxNjgwMCksIERJQ08oMHg1NjcyYzA4MCksIERJQ08oMHg1ZDMxMzg4MCksCisgICAgRElDTygweDA0MjcyMDkwKSwgRElDTygweDA1ZDc2ZTE4KSwgRElDTygweDBiNGQ4MDgwKSwgRElDTygweDEyODgzZjYwKSwKKyAgICBESUNPKDB4MTc5NTIxODApLCBESUNPKDB4MjA0MGQ0ODApLCBESUNPKDB4MjNlOGNjMDApLCBESUNPKDB4MjgxOWMyMDApLAorICAgIERJQ08oMHgyYjg3MTA0MCksIERJQ08oMHgzNTdjOGYwMCksIERJQ08oMHgzY2FmOWFjMCksIERJQ08oMHg0MGEzOTM4MCksCisgICAgRElDTygweDQ1YmMyNzgwKSwgRElDTygweDRlNGFhMzAwKSwgRElDTygweDU2OGMyMjgwKSwgRElDTygweDVjYWRjNDAwKSwKKyAgICBESUNPKDB4MDM3NWIwM2MpLCBESUNPKDB4MDU2ZjBiNDApLCBESUNPKDB4MGIwZGM5MzApLCBESUNPKDB4MTI4YzUxZTApLAorICAgIERJQ08oMHgxODlmYTM2MCksIERJQ08oMHgxYzgxOTdlMCksIERJQ08oMHgxZWVkNTJhMCksIERJQ08oMHgyM2VkNDUwMCksCisgICAgRElDTygweDJlNWViODQwKSwgRElDTygweDM2NDE1YTQwKSwgRElDTygweDNkY2Y2MzQwKSwgRElDTygweDQzMTI2ZTgwKSwKKyAgICBESUNPKDB4NGFlYjdmODApLCBESUNPKDB4NTAxZTEyODApLCBESUNPKDB4NTg1MmIxMDApLCBESUNPKDB4NWQwNDBkODApLAorICAgIERJQ08oMHgwNjM1MWI4OCksIERJQ08oMHgwN2Y5MGFjMCksIERJQ08oMHgwYmFiNGVhMCksIERJQ08oMHgxOGQwNGI0MCksCisgICAgRElDTygweDFmMWUxNDgwKSwgRElDTygweDIxOWFiY2MwKSwgRElDTygweDI2MWMzMWMwKSwgRElDTygweDJhNjExYTAwKSwKKyAgICBESUNPKDB4MmU3MjU0ODApLCBESUNPKDB4MzZiNTExYzApLCBESUNPKDB4M2QzNjJmMDApLCBESUNPKDB4NDBiZTZkODApLAorICAgIERJQ08oMHg0NTZkYzQwMCksIERJQ08oMHg0Yjc0YzU4MCksIERJQ08oMHg1NWM4MjY4MCksIERJQ08oMHg1ZTMxODQ4MCksCisgICAgRElDTygweDA0NjIxMmQ4KSwgRElDTygweDA1Y2E5NWU4KSwgRElDTygweDBhMDJkOTEwKSwgRElDTygweDFhZTU4ZjQwKSwKKyAgICBESUNPKDB4MWU3M2VjMjApLCBESUNPKDB4MjE5N2Q2NDApLCBESUNPKDB4MjU4MWRmMDApLCBESUNPKDB4MjljODM3ODApLAorICAgIERJQ08oMHgzMTI5NDMwMCksIERJQ08oMHgzNTZmOGE0MCksIERJQ08oMHgzYjk3ZDI0MCksIERJQ08oMHg0NTA1Y2M4MCksCisgICAgRElDTygweDRiNDk3NjAwKSwgRElDTygweDUwNGU4NzgwKSwgRElDTygweDU1NjQ0NDgwKSwgRElDTygweDViZGVkZjgwKSwKKyAgICBESUNPKDB4MDUxNGY3OTgpLCBESUNPKDB4MDZiZDBkMDApLCBESUNPKDB4MGZjMzE1NTApLCBESUNPKDB4MTNkZmIxYTApLAorICAgIERJQ08oMHgxN2RkYTkwMCksIERJQ08oMHgyMDRhOGM0MCksIERJQ08oMHgyMzA5NTMwMCksIERJQ08oMHgyZDBkYTA0MCksCisgICAgRElDTygweDMxYjJhNTQwKSwgRElDTygweDM0NjIwMTgwKSwgRElDTygweDNhYjNlMDAwKSwgRElDTygweDQ0OGFjMzAwKSwKKyAgICBESUNPKDB4NGJlNmE2MDApLCBESUNPKDB4NTExNGUyODApLCBESUNPKDB4NTYyYjA3ODApLCBESUNPKDB4NWI4MzNjMDApLAorICAgIERJQ08oMHgwNzBmNWVmMCksIERJQ08oMHgwOTE5YzJiMCksIERJQ08oMHgwZTc3ODc0MCksIERJQ08oMHgxNTRkYjMyMCksCisgICAgRElDTygweDE3N2NmYmUwKSwgRElDTygweDFlYTY2MDQwKSwgRElDTygweDIzNjY2NjgwKSwgRElDTygweDI4MzljNDAwKSwKKyAgICBESUNPKDB4MzBjYzRlYzApLCBESUNPKDB4MzQ0NGEyODApLCBESUNPKDB4MzhjOTM1ODApLCBESUNPKDB4NDJhODBlMDApLAorICAgIERJQ08oMHg0YzQzMzg4MCksIERJQ08oMHg1MTllNGY4MCksIERJQ08oMHg1NmZmOGY4MCksIERJQ08oMHg1YmUxODIwMCksCisgICAgRElDTygweDA2NmM1OTY4KSwgRElDTygweDA4YTU4OWYwKSwgRElDTygweDBjYTRkN2EwKSwgRElDTygweDBmZmRlZmIwKSwKKyAgICBESUNPKDB4MTI5NDNmNDApLCBESUNPKDB4MWJlODRlZTApLCBESUNPKDB4MjEyNzY1NDApLCBESUNPKDB4MjY1YTk1NDApLAorICAgIERJQ08oMHgyZTBkZTE0MCksIERJQ08oMHgzMjUxNDhjMCksIERJQ08oMHgzYmQwNWQ0MCksIERJQ08oMHg0MWU4MTc4MCksCisgICAgRElDTygweDRiN2NmNDAwKSwgRElDTygweDUzMjg5NDAwKSwgRElDTygweDU5N2Q5MDAwKSwgRElDTygweDVlNDU4ZTAwKSwKKyAgICBESUNPKDB4MDRkYTNlNDApLCBESUNPKDB4MDZlOGUxYjApLCBESUNPKDB4MGI5YjFhMjApLCBESUNPKDB4MTEyNjRiYzApLAorICAgIERJQ08oMHgxNGYzZDdlMCksIERJQ08oMHgxY2Y5YzEwMCksIERJQ08oMHgyMzU2OGY0MCksIERJQ08oMHgyOTJiNTM4MCksCisgICAgRElDTygweDMzODc4ZDQwKSwgRElDTygweDM4ZGFjODQwKSwgRElDTygweDNkNTc4MjAwKSwgRElDTygweDQyMjNhODgwKSwKKyAgICBESUNPKDB4NDczZmI3MDApLCBESUNPKDB4NGM3NjU1MDApLCBESUNPKDB4NTQ2YzY0ODApLCBESUNPKDB4NWM3NmQyODApLAorICAgIERJQ08oMHgwNWU2M2JiMCksIERJQ08oMHgwN2ExYTQyOCksIERJQ08oMHgwZWM0ZmYxMCksIERJQ08oMHgxMzQ4YTEwMCksCisgICAgRElDTygweDE2MjA0ZjQwKSwgRElDTygweDFhMGE2NDQwKSwgRElDTygweDFlMzNmNmMwKSwgRElDTygweDJhZThjY2MwKSwKKyAgICBESUNPKDB4MmVkNWU2YzApLCBESUNPKDB4MzI0Mjc2MDApLCBESUNPKDB4Mzc5ZDk5ODApLCBESUNPKDB4M2MwZjQwODApLAorICAgIERJQ08oMHg0NDFlYTY4MCksIERJQ08oMHg0ZTU5MmIwMCksIERJQ08oMHg1NmUyNzcwMCksIERJQ08oMHg1ZGEyZTI4MCksCisgICAgRElDTygweDA0NzRkZTgwKSwgRElDTygweDA2MTY3MjQ4KSwgRElDTygweDBjZTY1MGUwKSwgRElDTygweDEzNWI0YWEwKSwKKyAgICBESUNPKDB4MTZjZWEyYTApLCBESUNPKDB4MWQxMzhhYzApLCBESUNPKDB4MjIwYTg0YzApLCBESUNPKDB4Mjc1Y2EzODApLAorICAgIERJQ08oMHgyYzMwMDM0MCksIERJQ08oMHgzMzNiM2Q4MCksIERJQ08oMHgzN2EzNTA4MCksIERJQ08oMHg0MGI4Mzg4MCksCisgICAgRElDTygweDQ5NGM0NzgwKSwgRElDTygweDRmZjcxYzgwKSwgRElDTygweDU2ZGIyZDgwKSwgRElDTygweDVkMGFhYzAwKSwKKyAgICBESUNPKDB4MDc0NmNkMDApLCBESUNPKDB4MDlkZWZmMTApLCBESUNPKDB4MGU0YTM1NjApLCBESUNPKDB4MTRmMDA1ZTApLAorICAgIERJQ08oMHgxODZhNGRlMCksIERJQ08oMHgxY2QwYjI0MCksIERJQ08oMHgyMjI4N2JjMCksIERJQ08oMHgyNmNlZDUwMCksCisgICAgRElDTygweDJkNTdjNDQwKSwgRElDTygweDMxZDk0M2MwKSwgRElDTygweDM2NGIwZjgwKSwgRElDTygweDNjODVhMDQwKSwKKyAgICBESUNPKDB4NDI0MGNhMDApLCBESUNPKDB4NGE2NDgwODApLCBESUNPKDB4NTRkMTIyMDApLCBESUNPKDB4NWQxYTFjMDApLAorICAgIERJQ08oMHgwNTUyMmViMCksIERJQ08oMHgwNzA0ZWZiOCksIERJQ08oMHgwYzY2Y2Q1MCksIERJQ08oMHgxNWFlZmNhMCksCisgICAgRElDTygweDE4NGY3YjAwKSwgRElDTygweDFlNGIyNmEwKSwgRElDTygweDIyNjY3NjQwKSwgRElDTygweDI4NGU0ZTAwKSwKKyAgICBESUNPKDB4MmQ4YmUzYzApLCBESUNPKDB4MzEzNzZmMDApLCBESUNPKDB4MzljZDk4MDApLCBESUNPKDB4M2U0NmI3NDApLAorICAgIERJQ08oMHg0M2FmMDM4MCksIERJQ08oMHg0ZTFkZWMwMCksIERJQ08oMHg1NjJhYzUwMCksIERJQ08oMHg1ZDQ1ZjU4MCksCisgICAgRElDTygweDA2MmY1NzA4KSwgRElDTygweDA4ZDA3OWEwKSwgRElDTygweDBjMWI0OTIwKSwgRElDTygweDEzZjE0N2MwKSwKKyAgICBESUNPKDB4MWFlNzdjODApLCBESUNPKDB4MWQyMDBlYTApLCBESUNPKDB4MjM2ZTQ3NDApLCBESUNPKDB4MmI5OGQwMDApLAorICAgIERJQ08oMHgyZWVmYzYwMCksIERJQ08oMHgzNGM2NzRjMCksIERJQ08oMHgzZDM2ZjU0MCksIERJQ08oMHg0MTFkOGMwMCksCisgICAgRElDTygweDQ1YzUwMzAwKSwgRElDTygweDRkMjA3NDgwKSwgRElDTygweDU1NjAzMTAwKSwgRElDTygweDVjNDQyZDgwKSwKKyAgICBESUNPKDB4MDUxMGJjZDApLCBESUNPKDB4MDZlYzAwYTApLCBESUNPKDB4MGI2Mzk1NTApLCBESUNPKDB4MTVkYWEyYzApLAorICAgIERJQ08oMHgxOGMwYmE2MCksIERJQ08oMHgxZTBmN2Q2MCksIERJQ08oMHgyNGIwNWM4MCksIERJQ08oMHgyODA2MzhjMCksCisgICAgRElDTygweDMxNGE2NTgwKSwgRElDTygweDM1ZTRiMmMwKSwgRElDTygweDNhZWYyYmMwKSwgRElDTygweDQxNThjMjgwKSwKKyAgICBESUNPKDB4NGQyNDUxMDApLCBESUNPKDB4NTNjNjlhODApLCBESUNPKDB4NTk3ZjEwMDApLCBESUNPKDB4NWRjYjAwODApLAorICAgIERJQ08oMHgwNDJjYjc0OCksIERJQ08oMHgwNWQ3MTBiMCksIERJQ08oMHgwYWZlNjEzMCksIERJQ08oMHgxMjU2Y2RjMCksCisgICAgRElDTygweDE1YjhjZDAwKSwgRElDTygweDFkYzcyZDIwKSwgRElDTygweDIyMDVmYzAwKSwgRElDTygweDJhM2QwZDAwKSwKKyAgICBESUNPKDB4MmYzYmE2MDApLCBESUNPKDB4MzNiM2Q4NDApLCBESUNPKDB4M2I1YTU0NDApLCBESUNPKDB4NDE2YzlkMDApLAorICAgIERJQ08oMHg0OTdjZGQ4MCksIERJQ08oMHg1MDQwNWUwMCksIERJQ08oMHg1NzBjYTk4MCksIERJQ08oMHg1ZDNhYTE4MCksCisgICAgRElDTygweDA0NDNiN2I4KSwgRElDTygweDA2M2Q4NTg4KSwgRElDTygweDBjNzZlZjIwKSwgRElDTygweDEyNzA5YjQwKSwKKyAgICBESUNPKDB4MTY0OWYwYTApLCBESUNPKDB4MjBjNTIyYzApLCBESUNPKDB4MjRjZGU0MDApLCBESUNPKDB4MmJhNzgyODApLAorICAgIERJQ08oMHgzMTA0YzM0MCksIERJQ08oMHgzNjBiMTc0MCksIERJQ08oMHgzY2Q2YTZjMCksIERJQ08oMHg0MjU3MzgwMCksCisgICAgRElDTygweDQ4YjE4NDgwKSwgRElDTygweDRmY2ExZTAwKSwgRElDTygweDU3MDBjMTAwKSwgRElDTygweDVjZjE0NDgwKSwKKyAgICBESUNPKDB4MDUxMjM2MjgpLCBESUNPKDB4MDZiZjEwYjApLCBESUNPKDB4MGJkZTc1NzApLCBESUNPKDB4MTc1YjdlZTApLAorICAgIERJQ08oMHgxYTEzNDQ2MCksIERJQ08oMHgyMGZhNDEwMCksIERJQ08oMHgyNWVkYTQ0MCksIERJQ08oMHgyOWMzYjU0MCksCisgICAgRElDTygweDMxOGExYjQwKSwgRElDTygweDM1ZTBkNTAwKSwgRElDTygweDNhMTQ3ZjAwKSwgRElDTygweDNmMDhlOTgwKSwKKyAgICBESUNPKDB4NDQ1ZDc1ODApLCBESUNPKDB4NGVjNDhjODApLCBESUNPKDB4NTg4YmNlODApLCBESUNPKDB4NWRmYWUzMDApLAorICAgIERJQ08oMHgwNGM5ZTc1MCksIERJQ08oMHgwNjUyMjRmOCksIERJQ08oMHgwYzZmMWUzMCksIERJQ08oMHgxYTJmZmNhMCksCisgICAgRElDTygweDFjYWM2MTQwKSwgRElDTygweDIxYzJhNjQwKSwgRElDTygweDI1ZmI4YWMwKSwgRElDTygweDJhYjkwZjAwKSwKKyAgICBESUNPKDB4MzMxODkyMDApLCBESUNPKDB4MzgwODhhYzApLCBESUNPKDB4M2JiN2RlNDApLCBESUNPKDB4NDAxODA4MDApLAorICAgIERJQ08oMHg0NDUzYzMwMCksIERJQ08oMHg0Y2RiYTg4MCksIERJQ08oMHg1NDkwMjY4MCksIERJQ08oMHg1YmIyMTcwMCksCisgICAgRElDTygweDA2OTU4NTcwKSwgRElDTygweDA5N2YzMmIwKSwgRElDTygweDBjYjQxOGIwKSwgRElDTygweDE0MWI2OTAwKSwKKyAgICBESUNPKDB4MWM4Y2ZiMDApLCBESUNPKDB4MWZhYjc5MjApLCBESUNPKDB4MjQ3N2M4MDApLCBESUNPKDB4MmFhYmVkNDApLAorICAgIERJQ08oMHgyZWIxYTA4MCksIERJQ08oMHgzMzlmNjdjMCksIERJQ08oMHgzYWJjYzI0MCksIERJQ08oMHgzZjY2MWIwMCksCisgICAgRElDTygweDQ1NjYzMjgwKSwgRElDTygweDRjNjgwODAwKSwgRElDTygweDUxNzAzMDAwKSwgRElDTygweDU4YTBlMDAwKSwKKyAgICBESUNPKDB4MDY5ZjZjODgpLCBESUNPKDB4MDk1ZTE0OTApLCBESUNPKDB4MGNmNDQyYjApLCBESUNPKDB4MTBlYThkNjApLAorICAgIERJQ08oMHgxMzc3YjU4MCksIERJQ08oMHgxOTVlZDQ4MCksIERJQ08oMHgyNjU0MmIwMCksIERJQ08oMHgyYzllYTcwMCksCisgICAgRElDTygweDMxOGQ4YWMwKSwgRElDTygweDM2NGU1YTQwKSwgRElDTygweDNhMGRiMDAwKSwgRElDTygweDNlMTA4N2MwKSwKKyAgICBESUNPKDB4NDUwY2EzODApLCBESUNPKDB4NGM3ODFkMDApLCBESUNPKDB4NTNjZjdhMDApLCBESUNPKDB4NWM3ZDEyODApLAorICAgIERJQ08oMHgwNmU1MWQ5OCksIERJQ08oMHgwOWViOGQzMCksIERJQ08oMHgwZTY2ODNkMCksIERJQ08oMHgxMjk0MThhMCksCisgICAgRElDTygweDE1NjJmYzgwKSwgRElDTygweDFmNzA4NjYwKSwgRElDTygweDI1M2YxMDAwKSwgRElDTygweDI5M2ExNmMwKSwKKyAgICBESUNPKDB4MmU3YzFkODApLCBESUNPKDB4MzE2ZTc1YzApLCBESUNPKDB4MzVhN2ZiYzApLCBESUNPKDB4M2JmYmY3ODApLAorICAgIERJQ08oMHg0MTZhOTIwMCksIERJQ08oMHg0YmUzNjQwMCksIERJQ08oMHg1NmRjN2E4MCksIERJQ08oMHg1ZDY0ZWE4MCksCisgICAgRElDTygweDA1NzRkMGM4KSwgRElDTygweDA3NDhlZmQwKSwgRElDTygweDBiNTEwODYwKSwgRElDTygweDBlMjE5ZTAwKSwKKyAgICBESUNPKDB4MTI5OWNjMDApLCBESUNPKDB4MWVmNzA2YTApLCBESUNPKDB4MjJjYTM4YzApLCBESUNPKDB4Mjg4MjBhMDApLAorICAgIERJQ08oMHgyY2M2MzVjMCksIERJQ08oMHgzMWVmNDc0MCksIERJQ08oMHgzYTVlODljMCksIERJQ08oMHg0MmFjYWEwMCksCisgICAgRElDTygweDRiMmJmNTAwKSwgRElDTygweDUxNWUwOTgwKSwgRElDTygweDU3OTQ5NDAwKSwgRElDTygweDVkMDAyNTAwKSwKKyAgICBESUNPKDB4MDdjNzE1ZDApLCBESUNPKDB4MGIzZmExMTApLCBESUNPKDB4MGU3NDUzNzApLCBESUNPKDB4MTFlOTM1NjApLAorICAgIERJQ08oMHgxNGJhZDY4MCksIERJQ08oMHgxODlhMDQwMCksIERJQ08oMHgyNDBiMTI0MCksIERJQ08oMHgyYTZiMzU4MCksCisgICAgRElDTygweDJlNWUxMzgwKSwgRElDTygweDM1MjA3MmMwKSwgRElDTygweDNhNTAzN2MwKSwgRElDTygweDNlMzcyNmMwKSwKKyAgICBESUNPKDB4NDcyNWVkODApLCBESUNPKDB4NGY4ODU5MDApLCBESUNPKDB4NTRjOGQ1ODApLCBESUNPKDB4NWIyNjE2ODApLAorICAgIERJQ08oMHgwNzVmMDJhOCksIERJQ08oMHgwYTIxNDkwMCksIERJQ08oMHgwZTE4OWRlMCksIERJQ08oMHgxMzc2ZDVhMCksCisgICAgRElDTygweDE2M2Q1YzgwKSwgRElDTygweDFhOTRiM2UwKSwgRElDTygweDIxMzc2OTgwKSwgRElDTygweDI1OWMzMTQwKSwKKyAgICBESUNPKDB4MmU2NjNiYzApLCBESUNPKDB4MzM3ODg0YzApLCBESUNPKDB4M2EwMzVjMDApLCBESUNPKDB4NDBiMzJjMDApLAorICAgIERJQ08oMHg0YjIxZGUwMCksIERJQ08oMHg1MzI5OGYwMCksIERJQ08oMHg1ODc4ODA4MCksIERJQ08oMHg1Y2ZhN2MwMCksCisgICAgRElDTygweDA1NjU4OTg4KSwgRElDTygweDA3OTdmNDcwKSwgRElDTygweDBkMjUwODEwKSwgRElDTygweDEwMmZjMmEwKSwKKyAgICBESUNPKDB4MTM3MzhmZTApLCBESUNPKDB4MTc0MGJiYzApLCBESUNPKDB4MjQ5MWIzODApLCBESUNPKDB4MjhiYzU4MDApLAorICAgIERJQ08oMHgyYzc1YTk0MCksIERJQ08oMHgzMjVjYjUwMCksIERJQ08oMHgzNzk0NDc0MCksIERJQ08oMHg0MDVmMmQ4MCksCisgICAgRElDTygweDQ4ZWI4ZjAwKSwgRElDTygweDUwNjc2ZjgwKSwgRElDTygweDU2ZjcwMzgwKSwgRElDTygweDVkNjJjMDAwKSwKKyAgICBESUNPKDB4MDUzMWI1NDApLCBESUNPKDB4MDZhZTY0YzApLCBESUNPKDB4MGNmN2FkMzApLCBESUNPKDB4MTFjODMwMDApLAorICAgIERJQ08oMHgxNGVkYzk4MCksIERJQ08oMHgxOGQ0MzZjMCksIERJQ08oMHgxZTE4NDA4MCksIERJQ08oMHgyNjAzYmI4MCksCisgICAgRElDTygweDJhMmYyZjgwKSwgRElDTygweDMzYmRiZTAwKSwgRElDTygweDNhMTA2NmMwKSwgRElDTygweDQyYjlmZjAwKSwKKyAgICBESUNPKDB4NGE2MTc1ODApLCBESUNPKDB4NTE2MTk0ODApLCBESUNPKDB4NTdjY2Q1MDApLCBESUNPKDB4NWQ0ZDE2MDApLAorICAgIERJQ08oMHgwM2U0MGJhYyksIERJQ08oMHgwNWY1MzE1OCksIERJQ08oMHgwZTc2ZDNiMCksIERJQ08oMHgxN2MxNTdhMCksCisgICAgRElDTygweDFjY2I1YmMwKSwgRElDTygweDI1MDEyOWMwKSwgRElDTygweDJiN2Q5ZDAwKSwgRElDTygweDMzMjI0ZDgwKSwKKyAgICBESUNPKDB4Mzk2NmY2MDApLCBESUNPKDB4M2YzOTk0ODApLCBESUNPKDB4NDQ0OWZjODApLCBESUNPKDB4NDk0MDFiODApLAorICAgIERJQ08oMHg0ZTJhYjU4MCksIERJQ08oMHg1MzExNzAwMCksIERJQ08oMHg1ODQ4ZTA4MCksIERJQ08oMHg1ZDY2YTI4MCksCisgICAgRElDTygweDA0MWQ0ZjYwKSwgRElDTygweDA3MGU4MDgwKSwgRElDTygweDEzOTBlYzQwKSwgRElDTygweDE3N2M0MmMwKSwKKyAgICBESUNPKDB4MWJlYjE0MDApLCBESUNPKDB4MjA4YjA1ODApLCBESUNPKDB4MjY0Y2JiNDApLCBESUNPKDB4MmJkMzA5NDApLAorICAgIERJQ08oMHgzMGIzMDg4MCksIERJQ08oMHgzNjk3OGU4MCksIERJQ08oMHgzY2IyYTE0MCksIERJQ08oMHg0M2Y2YjA4MCksCisgICAgRElDTygweDRhODgxMDAwKSwgRElDTygweDUwNWNhNzgwKSwgRElDTygweDU2OWE1ZDgwKSwgRElDTygweDVjYWUzNTgwKSwKKyAgICBESUNPKDB4MDNmM2M3NjApLCBESUNPKDB4MDU1NjRlMDgpLCBESUNPKDB4MDllMzEwZDApLCBESUNPKDB4MWI5YjNkMDApLAorICAgIERJQ08oMHgyMDkwOWFjMCksIERJQ08oMHgyMzgyZWVjMCksIERJQ08oMHgyNzhjNjcwMCksIERJQ08oMHgyYjM0ZDUwMCksCisgICAgRElDTygweDMwZmEyYWMwKSwgRElDTygweDM0ZDI3ZDQwKSwgRElDTygweDM4ZTMzNGMwKSwgRElDTygweDNkNzMyNDQwKSwKKyAgICBESUNPKDB4NDZkMDc4MDApLCBESUNPKDB4NTFmNGQ0MDApLCBESUNPKDB4NTc3NDRmODApLCBESUNPKDB4NWQ1NmJiODApLAorICAgIERJQ08oMHgwM2FiZmRkOCksIERJQ08oMHgwNTEyYjE0MCksIERJQ08oMHgxMzVmNzUwMCksIERJQ08oMHgxOWZjYzRjMCksCisgICAgRElDTygweDFkMGIxYjgwKSwgRElDTygweDIxZWNhNTQwKSwgRElDTygweDI1OGY4NzAwKSwgRElDTygweDI5ZTI5MmMwKSwKKyAgICBESUNPKDB4MmM1MWZlODApLCBESUNPKDB4MzFlMmExODApLCBESUNPKDB4M2M2Mzg2NDApLCBESUNPKDB4NDQ4NzNhMDApLAorICAgIERJQ08oMHg0YmI3ZTgwMCksIERJQ08oMHg1MDc4ZjcwMCksIERJQ08oMHg1N2ZjOWI4MCksIERJQ08oMHg1ZGVmMWMwMCksCisgICAgRElDTygweDA0NzIxZWYwKSwgRElDTygweDA2Njg4MTU4KSwgRElDTygweDBmNjVhNWQwKSwgRElDTygweDE0NDk5ODQwKSwKKyAgICBESUNPKDB4MWJmNWI4YzApLCBESUNPKDB4MWYzM2I3MDApLCBESUNPKDB4MjY0YjY5MDApLCBESUNPKDB4MmMzZTY3ODApLAorICAgIERJQ08oMHgyZWM4ZDQ0MCksIERJQ08oMHgzMjM4ODVjMCksIERJQ08oMHgzNzE0MzMwMCksIERJQ08oMHgzYmFmYTgwMCksCisgICAgRElDTygweDQ5MDMwNDgwKSwgRElDTygweDU0YzE2YjAwKSwgRElDTygweDU4ZWM0YjAwKSwgRElDTygweDVkNzEzZDAwKSwKKyAgICBESUNPKDB4MDNkMTE0ZTQpLCBESUNPKDB4MDY3ZTViNDApLCBESUNPKDB4MTAzOTM0MjApLCBESUNPKDB4MTQ5NjEzMDApLAorICAgIERJQ08oMHgxYTU5Y2ZhMCksIERJQ08oMHgyMDg1NDI0MCksIERJQ08oMHgyNmIzZjMwMCksIERJQ08oMHgyZTNlMjg0MCksCisgICAgRElDTygweDMyM2JkMzAwKSwgRElDTygweDM3YzQ5MjgwKSwgRElDTygweDNkNzllNTAwKSwgRElDTygweDQzNTJkODgwKSwKKyAgICBESUNPKDB4NDllMTc5ODApLCBESUNPKDB4NGZjNzJmODApLCBESUNPKDB4NTVjMGM2ODApLCBESUNPKDB4NWM1M2M3MDApLAorICAgIERJQ08oMHgwNTNmNWRlOCksIERJQ08oMHgwNzUxNjJiOCksIERJQ08oMHgwZmFlODA1MCksIERJQ08oMHgxM2VjMGVlMCksCisgICAgRElDTygweDE3ZjkyNDQwKSwgRElDTygweDFmMDU0NDQwKSwgRElDTygweDI0YjE1ZDQwKSwgRElDTygweDJhZGQ0NDgwKSwKKyAgICBESUNPKDB4MmUzMDYzMDApLCBESUNPKDB4MzU0MjA2ODApLCBESUNPKDB4M2M2YjZlMDApLCBESUNPKDB4NDJmYzAzODApLAorICAgIERJQ08oMHg0NzMyZTM4MCksIERJQ08oMHg0Y2ViMjIwMCksIERJQ08oMHg1MjJlZmUwMCksIERJQ08oMHg1YWExMjY4MCksCisgICAgRElDTygweDA2MTExNzI4KSwgRElDTygweDA4MTgzYzgwKSwgRElDTygweDBkMDI2NjUwKSwgRElDTygweDE0YjQxOTQwKSwKKyAgICBESUNPKDB4MTdlMzczMjApLCBESUNPKDB4MWM0MGIxNjApLCBESUNPKDB4MjE5YzU0MDApLCBESUNPKDB4MjZkODg4NDApLAorICAgIERJQ08oMHgyYmZkZmUwMCksIERJQ08oMHgzMTVhMjgwMCksIERJQ08oMHgzOGNkNzE0MCksIERJQ08oMHgzZGUyMjc0MCksCisgICAgRElDTygweDQ4ZmYxMzAwKSwgRElDTygweDUzZWY0MTgwKSwgRElDTygweDVhNDc5MzgwKSwgRElDTygweDVlYTFlMzgwKSwKKyAgICBESUNPKDB4MDdlYTBmYTgpLCBESUNPKDB4MGE4NDRlZjApLCBESUNPKDB4MGUxMDIzYzApLCBESUNPKDB4MTIwOGQ5ODApLAorICAgIERJQ08oMHgxNTg5MTM2MCksIERJQ08oMHgxYmViYzM4MCksIERJQ08oMHgyMDg3ZGE0MCksIERJQ08oMHgyNTdhYzk0MCksCisgICAgRElDTygweDJjYWVmYTAwKSwgRElDTygweDMwMGRlZmMwKSwgRElDTygweDM3NmFhMDAwKSwgRElDTygweDQzOGFhZDgwKSwKKyAgICBESUNPKDB4NDlmMDA1MDApLCBESUNPKDB4NGUwMjM3ODApLCBESUNPKDB4NTI0ZTU4MDApLCBESUNPKDB4NWFiY2I5ODApLAorICAgIERJQ08oMHgwNzljZmM4OCksIERJQ08oMHgwYTM2NzI0MCksIERJQ08oMHgwZjIyNDMzMCksIERJQ08oMHgxNWI1MTU0MCksCisgICAgRElDTygweDE5MDY1NDIwKSwgRElDTygweDFkZGJlMGEwKSwgRElDTygweDIzYTk5ZDgwKSwgRElDTygweDI4YzJkMzQwKSwKKyAgICBESUNPKDB4MmY2MjdlNDApLCBESUNPKDB4MzQ4N2UwODApLCBESUNPKDB4MzhiNzZiYzApLCBESUNPKDB4M2QxMzU1ODApLAorICAgIERJQ08oMHg0Mzc5OWE4MCksIERJQ08oMHg0ODlhNTAwMCksIERJQ08oMHg0ZWNlNjI4MCksIERJQ08oMHg1YTgyZjUwMCksCisgICAgRElDTygweDA2YzM3ZTQwKSwgRElDTygweDA5M2YwNTQwKSwgRElDTygweDBlMGQwYzMwKSwgRElDTygweDE3NDg3ODYwKSwKKyAgICBESUNPKDB4MWJmNzgwMjApLCBESUNPKDB4MjAzMTgwMDApLCBESUNPKDB4MjYwYjgzMDApLCBESUNPKDB4MmM2MTU5ODApLAorICAgIERJQ08oMHgzMGM4ODQ0MCksIERJQ08oMHgzNjQzM2I0MCksIERJQ08oMHgzYmRiOGM0MCksIERJQ08oMHg0MDA1MGM4MCksCisgICAgRElDTygweDQ0MDYyZjgwKSwgRElDTygweDQ4YThkNDgwKSwgRElDTygweDRkZDY0ZDAwKSwgRElDTygweDU1YWJkMzgwKSwKKyAgICBESUNPKDB4MDVlOWU4MjgpLCBESUNPKDB4MDdmMjQzMzApLCBESUNPKDB4MGM4YjRmZTApLCBESUNPKDB4MGVjZDI4MjApLAorICAgIERJQ08oMHgxN2YwNWMwMCksIERJQ08oMHgxZmRiNDU2MCksIERJQ08oMHgyNGI0Yzk0MCksIERJQ08oMHgyOTY4ZDBjMCksCisgICAgRElDTygweDJjYmYzNTAwKSwgRElDTygweDM4MWVhZGMwKSwgRElDTygweDNkM2JhZjQwKSwgRElDTygweDQyODI4MDgwKSwKKyAgICBESUNPKDB4NDdmMzYzMDApLCBESUNPKDB4NGM4YzY2MDApLCBESUNPKDB4NTFkNjZmMDApLCBESUNPKDB4NWE3ZTAzMDApLAorICAgIERJQ08oMHgwNjVjNWNmOCksIERJQ08oMHgwODg4MjU0MCksIERJQ08oMHgwZDg4N2M3MCksIERJQ08oMHgxMTJhYzU2MCksCisgICAgRElDTygweDE1MGNjZGMwKSwgRElDTygweDE5ZTQ5YzIwKSwgRElDTygweDFlYjY1NjgwKSwgRElDTygweDJhNzZlMDQwKSwKKyAgICBESUNPKDB4MmY2NWZjMDApLCBESUNPKDB4MzZkNzljYzApLCBESUNPKDB4M2M4NWE5MDApLCBESUNPKDB4NDA4ZGM2ODApLAorICAgIERJQ08oMHg0NDk2NDcwMCksIERJQ08oMHg0YTk4ZWIwMCksIERJQ08oMHg1NTI4YjUwMCksIERJQ08oMHg1ZDY2MGY4MCksCisgICAgRElDTygweDA2YjU2MjMwKSwgRElDTygweDA4ZTM0MGYwKSwgRElDTygweDBlMWU0MzgwKSwgRElDTygweDExMmQyZDQwKSwKKyAgICBESUNPKDB4MTU4ZGZkZTApLCBESUNPKDB4MjI3ZTYwNDApLCBESUNPKDB4MjZiZmY3YzApLCBESUNPKDB4MmI3M2ExMDApLAorICAgIERJQ08oMHgzMjE5OTU4MCksIERJQ08oMHgzNTg1YTI0MCksIERJQ08oMHgzOThhNWQ0MCksIERJQ08oMHgzZGI4YzZjMCksCisgICAgRElDTygweDQzOTA1NjAwKSwgRElDTygweDQ5NDVmODAwKSwgRElDTygweDRmMzEwMzgwKSwgRElDTygweDVhNmQyNDAwKSwKKyAgICBESUNPKDB4MDVjZmM2ZjgpLCBESUNPKDB4MDgzMmU2NTApLCBESUNPKDB4MGRlODJmODApLCBESUNPKDB4MWExYWZlODApLAorICAgIERJQ08oMHgxZTlhMWY4MCksIERJQ08oMHgyMjFhY2Q4MCksIERJQ08oMHgyN2ZhMDBjMCksIERJQ08oMHgyYzRkZjk4MCksCisgICAgRElDTygweDMxZTA0YmMwKSwgRElDTygweDM4YzllZDQwKSwgRElDTygweDNkYjg2MDgwKSwgRElDTygweDQyOGVjODAwKSwKKyAgICBESUNPKDB4NDg1MDA1MDApLCBESUNPKDB4NGUxY2E1ODApLCBESUNPKDB4NTNkM2Y1MDApLCBESUNPKDB4NWFhNmJlMDApLAorICAgIERJQ08oMHgwNTBjYzRkMCksIERJQ08oMHgwNzBjMjE4MCksIERJQ08oMHgwYzRjYTk4MCksIERJQ08oMHgwZmNlOWY0MCksCisgICAgRElDTygweDE0YWY0MTYwKSwgRElDTygweDIyMDZhNzgwKSwgRElDTygweDI1ODQ4ZTgwKSwgRElDTygweDJjMmI4NGMwKSwKKyAgICBESUNPKDB4MzVhMzk5ODApLCBESUNPKDB4MzkxNGJkODApLCBESUNPKDB4M2NhZmY1ODApLCBESUNPKDB4M2ZjYjA2MDApLAorICAgIERJQ08oMHg0NDI2YjM4MCksIERJQ08oMHg0ODZjOTcwMCksIERJQ08oMHg0ZjczMDQ4MCksIERJQ08oMHg1YWZkMzk4MCksCisgICAgRElDTygweDA1ZTQwNjQwKSwgRElDTygweDA4MzBkZjUwKSwgRElDTygweDBiOWU4M2UwKSwgRElDTygweDE1OGJhY2MwKSwKKyAgICBESUNPKDB4MWQwNjkyZTApLCBESUNPKDB4MjAyMWUwYzApLCBESUNPKDB4MjY1NzJlMDApLCBESUNPKDB4MmQ1OGNjNDApLAorICAgIERJQ08oMHgzMGRkMGY4MCksIERJQ08oMHgzNjFkNjhjMCksIERJQ08oMHgzZTMwODZjMCksIERJQ08oMHg0MjQ1MDgwMCksCisgICAgRElDTygweDQ2YzI1ODAwKSwgRElDTygweDRjNDVjZjAwKSwgRElDTygweDUxZGQ0MjAwKSwgRElDTygweDU3MzI2NTAwKSwKKyAgICBESUNPKDB4MDRkMzJmYTApLCBESUNPKDB4MDY0ZWQyYzApLCBESUNPKDB4MGIwN2NkNzApLCBESUNPKDB4MWM3ZjZkYTApLAorICAgIERJQ08oMHgyMTNiYzE0MCksIERJQ08oMHgyNTA1MWZjMCksIERJQ08oMHgyOTVjZDFjMCksIERJQ08oMHgyYzlmNGY4MCksCisgICAgRElDTygweDMyMjcxNTQwKSwgRElDTygweDM2YThlYzgwKSwgRElDTygweDNhOGU2YjQwKSwgRElDTygweDNlMTM3NTgwKSwKKyAgICBESUNPKDB4NDI3OTU0ODApLCBESUNPKDB4NDc3OWI3ODApLCBESUNPKDB4NGY3ZDk2MDApLCBESUNPKDB4NWMwOWIwMDApLAorICAgIERJQ08oMHgwNDRiMDc0OCksIERJQ08oMHgwNWZlZTY4MCksIERJQ08oMHgwOGY2Njk2MCksIERJQ08oMHgxMWRiNTk0MCksCisgICAgRElDTygweDIxOWVkZTgwKSwgRElDTygweDI3ZmI5NmMwKSwgRElDTygweDJhZmZjOTgwKSwgRElDTygweDJlYWRjM2MwKSwKKyAgICBESUNPKDB4MzI4OTU3MDApLCBESUNPKDB4MzcxODBkMDApLCBESUNPKDB4M2Q0YmY4ODApLCBESUNPKDB4NDE3NDE5ODApLAorICAgIERJQ08oMHg0NjBkODI4MCksIERJQ08oMHg0YzM0YmU4MCksIERJQ08oMHg1NDUzMWU4MCksIERJQ08oMHg1Yzg3NDAwMCksCisgICAgRElDTygweDAzZTI1ZGNjKSwgRElDTygweDA2OWU4MTcwKSwgRElDTygweDEzYjNkOWMwKSwgRElDTygweDFhODAzMjYwKSwKKyAgICBESUNPKDB4MWVkM2E0YTApLCBESUNPKDB4MjNlYTYzODApLCBESUNPKDB4Mjg4M2I5MDApLCBESUNPKDB4MmUwY2VhYzApLAorICAgIERJQ08oMHgzMzA4ZTQwMCksIERJQ08oMHgzODc5NmRjMCksIERJQ08oMHgzZTMxOGU4MCksIERJQ08oMHg0NDFkYTA4MCksCisgICAgRElDTygweDRhODkyMzAwKSwgRElDTygweDUwOWI5ZjgwKSwgRElDTygweDU2Y2FhMzgwKSwgRElDTygweDVjYzM5ZTAwKSwKKyAgICBESUNPKDB4MDUwMjMwMzgpLCBESUNPKDB4MDZiNmI0ZDgpLCBESUNPKDB4MGE0NDkzNzApLCBESUNPKDB4MTViODZlYTApLAorICAgIERJQ08oMHgyMjRhOTIwMCksIERJQ08oMHgyNzJlNmY0MCksIERJQ08oMHgyYTYxNzcwMCksIERJQ08oMHgyZTkxNWQwMCksCisgICAgRElDTygweDMyNDBhYzQwKSwgRElDTygweDM3NjM2MzAwKSwgRElDTygweDNkZDNlYTgwKSwgRElDTygweDQyMGUxZjgwKSwKKyAgICBESUNPKDB4NDViZjA2ODApLCBESUNPKDB4NGEyNmQ5ODApLCBESUNPKDB4NGY4MmE5MDApLCBESUNPKDB4NTY1NzY4MDApLAorICAgIERJQ08oMHgwM2Q2MzBmNCksIERJQ08oMHgwODIxNDBhMCksIERJQ08oMHgxMjY0NDcwMCksIERJQ08oMHgxNmI4MGNjMCksCisgICAgRElDTygweDFiYTkwYzQwKSwgRElDTygweDIxYzM4MzAwKSwgRElDTygweDI3ZGQxNDgwKSwgRElDTygweDJlMThlZTAwKSwKKyAgICBESUNPKDB4MzNmYjcyYzApLCBESUNPKDB4MzlmOWQ5ODApLCBESUNPKDB4NDAyMTkzMDApLCBESUNPKDB4NDYwN2ZkMDApLAorICAgIERJQ08oMHg0YzA3ZTUwMCksIERJQ08oMHg1MWJhOGYwMCksIERJQ08oMHg1N2EyNDI4MCksIERJQ08oMHg1ZDM2NzcwMCksCisgICAgRElDTygweDA4MGE1ODgwKSwgRElDTygweDBlZjNmNTcwKSwgRElDTygweDE0MWZkNmMwKSwgRElDTygweDE3YzE2M2EwKSwKKyAgICBESUNPKDB4MWMyODQwYTApLCBESUNPKDB4MjExMWZlMDApLCBESUNPKDB4MjczNzZiYzApLCBESUNPKDB4MmNjN2VkYzApLAorICAgIERJQ08oMHgzMjliMDEwMCksIERJQ08oMHgzODZkM2U0MCksIERJQ08oMHgzZWMxYmRjMCksIERJQ08oMHg0NTNmNjIwMCksCisgICAgRElDTygweDRiZjE2MDgwKSwgRElDTygweDUxYmRlZDAwKSwgRElDTygweDU3YmE2ODAwKSwgRElDTygweDVkMmZmZDgwKSwKKyAgICBESUNPKDB4MDg2NDM1OTApLCBESUNPKDB4MGU5MTFmMDApLCBESUNPKDB4MTU5MTEzODApLCBESUNPKDB4MWFiNWUxODApLAorICAgIERJQ08oMHgyMDdmZjYwMCksIERJQ08oMHgyNjM5OWIwMCksIERJQ08oMHgyY2FkYWU4MCksIERJQ08oMHgzMjc2Y2E0MCksCisgICAgRElDTygweDM4OWQ5Y2MwKSwgRElDTygweDNlYjIyMTgwKSwgRElDTygweDQ0NTcwNzAwKSwgRElDTygweDQ5ZDE1ODAwKSwKKyAgICBESUNPKDB4NGY1OTEzMDApLCBESUNPKDB4NTQ1NjZhODApLCBESUNPKDB4NTk2N2RiMDApLCBESUNPKDB4NWUzMDc3ODApLAorICAgIERJQ08oMHgwNzEyMGZhOCksIERJQ08oMHgwYzc5MWM2MCksIERJQ08oMHgxMTJkM2I2MCksIERJQ08oMHgxNDk0NTJhMCksCisgICAgRElDTygweDE5ZDJjMTAwKSwgRElDTygweDIwMmYxNTQwKSwgRElDTygweDI2OWMxMGMwKSwgRElDTygweDJiZTIyODgwKSwKKyAgICBESUNPKDB4MzEyYTA3YzApLCBESUNPKDB4MzY5ODRmYzApLCBESUNPKDB4M2M3YWMzYzApLCBESUNPKDB4NDM1YjUwMDApLAorICAgIERJQ08oMHg0YWE2MDI4MCksIERJQ08oMHg1MGY1MGMwMCksIERJQ08oMHg1NzE5ZjcwMCksIERJQ08oMHg1Y2I5ODY4MCksCisgICAgRElDTygweDA1NTE3Yzg4KSwgRElDTygweDA2YmEwYTcwKSwgRElDTygweDBkYTE2N2MwKSwgRElDTygweDE5OTE4NDQwKSwKKyAgICBESUNPKDB4MWJiMzcyMjApLCBESUNPKDB4MjA2ODEwODApLCBESUNPKDB4MjNkYzY3NDApLCBESUNPKDB4MmExNDAzYzApLAorICAgIERJQ08oMHgzMWE3MTU4MCksIERJQ08oMHgzNGZmMDYwMCksIERJQ08oMHgzOTViN2NjMCksIERJQ08oMHg0MjAxOTIwMCksCisgICAgRElDTygweDRjODE4ZDAwKSwgRElDTygweDUxM2ZmNDAwKSwgRElDTygweDU3MzFjZTAwKSwgRElDTygweDVjNWYxMTgwKSwKKyAgICBESUNPKDB4MDRmNzRlYzApLCBESUNPKDB4MDY3YjQ2MjgpLCBESUNPKDB4MGRjNGM5YzApLCBESUNPKDB4MTllOWZhNDApLAorICAgIERJQ08oMHgxY2YwMGEwMCksIERJQ08oMHgyMTYwMmE4MCksIERJQ08oMHgyNTMzNGE4MCksIERJQ08oMHgyOWIzYTgwMCksCisgICAgRElDTygweDJmOWIzNjAwKSwgRElDTygweDMzOGMwNTQwKSwgRElDTygweDM3MGMzY2MwKSwgRElDTygweDNhYmJjM2MwKSwKKyAgICBESUNPKDB4NDA1M2EwMDApLCBESUNPKDB4NGYxNGQ5ODApLCBESUNPKDB4NTdlMGI2MDApLCBESUNPKDB4NWQ5NWU3ODApLAorICAgIERJQ08oMHgwNWQ4NDRiOCksIERJQ08oMHgwN2EwNTYwOCksIERJQ08oMHgwYjc4MzdmMCksIERJQ08oMHgxNjFmYjQ2MCksCisgICAgRElDTygweDE5YzMxZDAwKSwgRElDTygweDFjZjM2MjgwKSwgRElDTygweDIwY2NjMjAwKSwgRElDTygweDI0YWUzOTgwKSwKKyAgICBESUNPKDB4MmUyYjU4MDApLCBESUNPKDB4MzMxNmFmODApLCBESUNPKDB4Mzc0MzJiMDApLCBESUNPKDB4NDA1MGIyODApLAorICAgIERJQ08oMHg0NjA1YmUwMCksIERJQ08oMHg0Y2M3ODkwMCksIERJQ08oMHg1NTZkMjA4MCksIERJQ08oMHg1YzU3ODMwMCksCisgICAgRElDTygweDA1NTFiNzY4KSwgRElDTygweDA3MDI0ZjYwKSwgRElDTygweDEwNDVmZGUwKSwgRElDTygweDE2NDgwMTIwKSwKKyAgICBESUNPKDB4MTk5NzQ0MjApLCBESUNPKDB4MWVjMmIyODApLCBESUNPKDB4MjI4YjMwYzApLCBESUNPKDB4Mjk1ZTBlYzApLAorICAgIERJQ08oMHgyZDg3NzVjMCksIERJQ08oMHgzMGVmMTQ0MCksIERJQ08oMHgzNTk3ODA4MCksIERJQ08oMHgzYTJhYjQ4MCksCisgICAgRElDTygweDQwMjI5NzgwKSwgRElDTygweDRkYTQwOTgwKSwgRElDTygweDU3MThlNDgwKSwgRElDTygweDVkNjhkNDAwKSwKKyAgICBESUNPKDB4MDNmOTAzZTQpLCBESUNPKDB4MDY3MzE1ODApLCBESUNPKDB4MGVjZjQ4NTApLCBESUNPKDB4MTJlNTc5MjApLAorICAgIERJQ08oMHgxYTY5ZWNlMCksIERJQ08oMHgxZmUzMjcwMCksIERJQ08oMHgyNTg1YjljMCksIERJQ08oMHgyYWEwMDZjMCksCisgICAgRElDTygweDJmMjBlYTgwKSwgRElDTygweDM3Mjk4YmMwKSwgRElDTygweDNkZjJhMDAwKSwgRElDTygweDQ0YTZjNjAwKSwKKyAgICBESUNPKDB4NGIxMGRlMDApLCBESUNPKDB4NTEwZmI4ODApLCBESUNPKDB4NTc0OWMyODApLCBESUNPKDB4NWQwYjk0ODApLAorICAgIERJQ08oMHgwM2M0MThmYyksIERJQ08oMHgwNTZjNGNkMCksIERJQ08oMHgwZDBjZjA3MCksIERJQ08oMHgxOTA3YTJjMCksCisgICAgRElDTygweDFiZTliYzAwKSwgRElDTygweDIxNTk5NDgwKSwgRElDTygweDI1NzAwZTQwKSwgRElDTygweDJjODNlMjgwKSwKKyAgICBESUNPKDB4MzI5ZmE3YzApLCBESUNPKDB4Mzg5ZjRjYzApLCBESUNPKDB4M2VmNjA5MDApLCBESUNPKDB4NDRjMTkzMDApLAorICAgIERJQ08oMHg0YWY1NmQwMCksIERJQ08oMHg1MTJlZWM4MCksIERJQ08oMHg1NzcyYWQwMCksIERJQ08oMHg1ZDM3ZjM4MCksCisgICAgRElDTygweDA0ZDU3OTIwKSwgRElDTygweDA3MTZiNWUwKSwgRElDTygweDBjYjNiY2MwKSwgRElDTygweDExOTdmNzQwKSwKKyAgICBESUNPKDB4MTYzZTVmYzApLCBESUNPKDB4MjE5NGU0MDApLCBESUNPKDB4Mjc0YmI2MDApLCBESUNPKDB4MmY1ZDcwODApLAorICAgIERJQ08oMHgzNjFlZTM0MCksIERJQ08oMHgzYjNiMjJjMCksIERJQ08oMHgzZjgwMDQwMCksIERJQ08oMHg0MzI3ZWY4MCksCisgICAgRElDTygweDQ4YjVkMjAwKSwgRElDTygweDUxMTZkMzAwKSwgRElDTygweDU5NjUyZTgwKSwgRElDTygweDVlNDQ0ZDAwKSwKKyAgICBESUNPKDB4MDc1NWI2YjApLCBESUNPKDB4MGI2OGMyYzApLCBESUNPKDB4MGYzNDQxZDApLCBESUNPKDB4MTI0YTAxYTApLAorICAgIERJQ08oMHgxODkxMDYwMCksIERJQ08oMHgyMDkxMWI4MCksIERJQ08oMHgyODFmNzEwMCksIERJQ08oMHgyZTRkZDY0MCksCisgICAgRElDTygweDMzNWJkOGMwKSwgRElDTygweDM3ZjE0YTgwKSwgRElDTygweDNjYWI3YjgwKSwgRElDTygweDQzYmUzMTgwKSwKKyAgICBESUNPKDB4NGJlZWUxMDApLCBESUNPKDB4NTIyOTIxODApLCBESUNPKDB4NTdlZmVhMDApLCBESUNPKDB4NWQxNzczMDApLAorICAgIERJQ08oMHgwNzFhNzc0OCksIERJQ08oMHgwYzZjZjFiMCksIERJQ08oMHgxMGRiMTUwMCksIERJQ08oMHgxNDNiY2EwMCksCisgICAgRElDTygweDFiODZhOTAwKSwgRElDTygweDIyZWQxZDgwKSwgRElDTygweDJhMWY2MWMwKSwgRElDTygweDMwNWYxNDAwKSwKKyAgICBESUNPKDB4MzY0NWY1ODApLCBESUNPKDB4M2JlNDViMDApLCBESUNPKDB4NDE2NmVhODApLCBESUNPKDB4NDZjM2YyMDApLAorICAgIERJQ08oMHg0Yzc0MDQwMCksIERJQ08oMHg1MWUzMGQwMCksIERJQ08oMHg1N2EzNzAwMCksIERJQ08oMHg1Y2ZjNDk4MCksCisgICAgRElDTygweDA4Y2RkNWIwKSwgRElDTygweDBkYWY5ODQwKSwgRElDTygweDExY2MwMmEwKSwgRElDTygweDE1ODhlZDQwKSwKKyAgICBESUNPKDB4MWNmZWY1ZTApLCBESUNPKDB4MjM5ZjEyYzApLCBESUNPKDB4Mjk2ZDNiNDApLCBESUNPKDB4MmU2MWMyNDApLAorICAgIERJQ08oMHgzMzNkYzgwMCksIERJQ08oMHgzODVkMDAwMCksIERJQ08oMHgzZTFlNTE4MCksIERJQ08oMHg0NDE5NmUwMCksCisgICAgRElDTygweDRhODMzMDAwKSwgRElDTygweDUwM2Q3YjgwKSwgRElDTygweDU2NTU2NjgwKSwgRElDTygweDVjNDEwYzAwKSwKKyAgICBESUNPKDB4MDczNzI0MDgpLCBESUNPKDB4MGQ1YzQxZjApLCBESUNPKDB4MTU1ZGMxNDApLCBESUNPKDB4MWE5YTNjYzApLAorICAgIERJQ08oMHgyMTc0MDk4MCksIERJQ08oMHgyNzEzOWY0MCksIERJQ08oMHgyYzk3NzA0MCksIERJQ08oMHgzMGNmZTVjMCksCisgICAgRElDTygweDM1MzgxMjQwKSwgRElDTygweDM5YjgzMTQwKSwgRElDTygweDNlZjNmZTgwKSwgRElDTygweDQ0NTQ3MjAwKSwKKyAgICBESUNPKDB4NGE4MTI4MDApLCBESUNPKDB4NTA0NmMyMDApLCBESUNPKDB4NTY5NTdkMDApLCBESUNPKDB4NWM4NWNkODApLAorICAgIERJQ08oMHgwNmRhNjk5MCksIERJQ08oMHgwYmM0MTI1MCksIERJQ08oMHgxM2Q1NDgwMCksIERJQ08oMHgxOTc5YzIyMCksCisgICAgRElDTygweDFmYWQyZjAwKSwgRElDTygweDI0YmJlMGMwKSwgRElDTygweDI5YzA4ZjAwKSwgRElDTygweDJlMzRiOTQwKSwKKyAgICBESUNPKDB4MzJjODllNDApLCBESUNPKDB4Mzc2YTIwNDApLCBESUNPKDB4M2NkODEwODApLCBESUNPKDB4NDI2N2JkMDApLAorICAgIERJQ08oMHg0OGU4ZTgwMCksIERJQ08oMHg0ZjE1MDI4MCksIERJQ08oMHg1NWNiMTk4MCksIERJQ08oMHg1YzQyOGI4MCksCisgICAgRElDTygweDA4N2Q0NWQwKSwgRElDTygweDBjZjFlZjIwKSwgRElDTygweDEzNWNiYTIwKSwgRElDTygweDE2ZmM3NDIwKSwKKyAgICBESUNPKDB4MWIyNzcyZTApLCBESUNPKDB4MWZkNGZlNjApLCBESUNPKDB4MjYwYTBiODApLCBESUNPKDB4MmJjNTRjMDApLAorICAgIERJQ08oMHgzMTY5NGNjMCksIERJQ08oMHgzNmQwODA4MCksIERJQ08oMHgzYzI0NWM4MCksIERJQ08oMHg0MTE3MDkwMCksCisgICAgRElDTygweDQ3YjE4NjAwKSwgRElDTygweDRlNzA2MTgwKSwgRElDTygweDU1OGQyMDAwKSwgRElDTygweDVjNDI4ZDAwKSwKKyAgICBESUNPKDB4MDgxZTY0OTApLCBESUNPKDB4MGQxNmE3ZDApLCBESUNPKDB4MTI0Y2NkMjApLCBESUNPKDB4MTU0YzIwYzApLAorICAgIERJQ08oMHgxOTQ1ZDhjMCksIERJQ08oMHgxZWUwYjcwMCksIERJQ08oMHgyNmEwMWYwMCksIERJQ08oMHgyZDU1NGU0MCksCisgICAgRElDTygweDM0MzJlYjgwKSwgRElDTygweDNhNjA1NTAwKSwgRElDTygweDQwMWQ4OTgwKSwgRElDTygweDQ1NzM3NjgwKSwKKyAgICBESUNPKDB4NGIwM2NiMDApLCBESUNPKDB4NTA2NjY3ODApLCBESUNPKDB4NTZhMGNkMDApLCBESUNPKDB4NWNiNDY0ODApLAorICAgIERJQ08oMHgwNmM1ODI3OCksIERJQ08oMHgwOTFiMTBiMCksIERJQ08oMHgwZTBlNzRmMCksIERJQ08oMHgxMWZhZjk4MCksCisgICAgRElDTygweDE0YTQ4NjAwKSwgRElDTygweDFlNmY3NTAwKSwgRElDTygweDI3Zjc3MTAwKSwgRElDTygweDJhYjQ5OTQwKSwKKyAgICBESUNPKDB4MzJhMWY2ODApLCBESUNPKDB4MzhjYjJhODApLCBESUNPKDB4M2MzZmYxNDApLCBESUNPKDB4M2Y2ODFjYzApLAorICAgIERJQ08oMHg0NDMxMDcwMCksIERJQ08oMHg0ZmEyMTcwMCksIERJQ08oMHg1ODZjNjE4MCksIERJQ08oMHg1ZGY3NDIwMCksCisgICAgRElDTygweDA2YTNlNDc4KSwgRElDTygweDA5NzE0NDAwKSwgRElDTygweDBkOTBiN2EwKSwgRElDTygweDEyZGYyNzIwKSwKKyAgICBESUNPKDB4MTYxOGYzMjApLCBESUNPKDB4MWFjNTI4NDApLCBESUNPKDB4Mjc2MTI5MDApLCBESUNPKDB4MmU0MzhlMDApLAorICAgIERJQ08oMHgzMjJiNmFjMCksIERJQ08oMHgzODAyMjk0MCksIERJQ08oMHgzZDJhNTE4MCksIERJQ08oMHg0MGQ3NmI4MCksCisgICAgRElDTygweDQ2NjcxNTAwKSwgRElDTygweDRjNWJkNDgwKSwgRElDTygweDUxN2EyNTAwKSwgRElDTygweDU3Nzc1YjAwKSwKKyAgICBESUNPKDB4MDU2YzIyMzApLCBESUNPKDB4MDdiOGY5ZDgpLCBESUNPKDB4MGJjNmUwNjApLCBESUNPKDB4MTZhYzJjODApLAorICAgIERJQ08oMHgxYTkyZmMwMCksIERJQ08oMHgxZTE1ZjAwMCksIERJQ08oMHgyOGI3MzIwMCksIERJQ08oMHgyY2Q5ZTVjMCksCisgICAgRElDTygweDMxOTZlY2MwKSwgRElDTygweDNhYmFlMzQwKSwgRElDTygweDQwNDBjNTgwKSwgRElDTygweDQ0YzE4ZDgwKSwKKyAgICBESUNPKDB4NGMwODY4MDApLCBESUNPKDB4NTBiNzg1MDApLCBESUNPKDB4NTRlNDI2MDApLCBESUNPKDB4NWE1NDlhODApLAorICAgIERJQ08oMHgwNGY5ZmExMCksIERJQ08oMHgwNzQxOTM1OCksIERJQ08oMHgwYzNlMTVmMCksIERJQ08oMHgxNzRjMTgwMCksCisgICAgRElDTygweDFhYjFmZTYwKSwgRElDTygweDIzYTEyNjgwKSwgRElDTygweDI3OTU1NzgwKSwgRElDTygweDJkMTRiMWMwKSwKKyAgICBESUNPKDB4MzVjZWZiMDApLCBESUNPKDB4Mzk1NzY3MDApLCBESUNPKDB4M2U4MmI3ODApLCBESUNPKDB4NDJiNmE2ODApLAorICAgIERJQ08oMHg0NzZkMTg4MCksIERJQ08oMHg0YjZjZGQwMCksIERJQ08oMHg1Mjc1ODY4MCksIERJQ08oMHg1YjY5ZTUwMCksCisgICAgRElDTygweDA2MGI3YWIwKSwgRElDTygweDA4MWMwNWMwKSwgRElDTygweDBiNTQwMzAwKSwgRElDTygweDBmNTY0MjcwKSwKKyAgICBESUNPKDB4MTIxMGFhODApLCBESUNPKDB4MTc3MWUwNjApLCBESUNPKDB4MjVkNzMyODApLCBESUNPKDB4MmU0OWUzODApLAorICAgIERJQ08oMHgzMTljMTEwMCksIERJQ08oMHgzNzcxZTcwMCksIERJQ08oMHgzYzUzMmY0MCksIERJQ08oMHg0MGM5YTkwMCksCisgICAgRElDTygweDQ4Y2JmNTgwKSwgRElDTygweDRmODE5OTgwKSwgRElDTygweDU2NmY5NDAwKSwgRElDTygweDVjZmRkOTgwKSwKKyAgICBESUNPKDB4MDRlZmI3YjgpLCBESUNPKDB4MGI4YTM3MTApLCBESUNPKDB4MTI0ZmQ1MjApLCBESUNPKDB4MTg0NmRkZTApLAorICAgIERJQ08oMHgxZTc3YTllMCksIERJQ08oMHgyNDNlYTgwMCksIERJQ08oMHgyYTRlMzI4MCksIERJQ08oMHgyZmY1MzJjMCksCisgICAgRElDTygweDM1ZDI3NjgwKSwgRElDTygweDNiOGNkYjAwKSwgRElDTygweDQxNDYzMDAwKSwgRElDTygweDQ3MDZjNzAwKSwKKyAgICBESUNPKDB4NGNhNDJkODApLCBESUNPKDB4NTI1ZDkyMDApLCBESUNPKDB4NTdkYWJiODApLCBESUNPKDB4NWQ1OWE4MDApLAorICAgIERJQ08oMHgwMzYyMGRlYyksIERJQ08oMHgwOTU4NzJlMCksIERJQ08oMHgxMDhkNDkyMCksIERJQ08oMHgxNmU5ZWEwMCksCisgICAgRElDTygweDFkNjBiMmUwKSwgRElDTygweDIzNWU5ZDAwKSwgRElDTygweDI5ODkzYjgwKSwgRElDTygweDJmNTlhM2MwKSwKKyAgICBESUNPKDB4MzU1NmI4ODApLCBESUNPKDB4M2IxMGJkYzApLCBESUNPKDB4NDBmNDk1MDApLCBESUNPKDB4NDY5Y2M0ODApLAorICAgIERJQ08oMHg0Yzc2MmQwMCksIERJQ08oMHg1MWYxNjk4MCksIERJQ08oMHg1NzhjNmQwMCksIERJQ08oMHg1YzliNWEwMCksCisgICAgRElDTygweDA1ZGQ5YmMwKSwgRElDTygweDA3OWM1YjIwKSwgRElDTygweDBkMzE5YWYwKSwgRElDTygweDE4OTk3MDQwKSwKKyAgICBESUNPKDB4MWMwYTE5ODApLCBESUNPKDB4MjBlOTI2YzApLCBESUNPKDB4MjVjYTE2NDApLCBESUNPKDB4Mjk4NzkzNDApLAorICAgIERJQ08oMHgzMGIyNzA0MCksIERJQ08oMHgzNjA3NzM0MCksIERJQ08oMHgzOWFjM2QwMCksIERJQ08oMHgzZDY4NmNjMCksCisgICAgRElDTygweDQyOGU1ZjAwKSwgRElDTygweDQ3YzFiZjgwKSwgRElDTygweDRlNzIwODAwKSwgRElDTygweDViNDE5ODgwKSwKKyAgICBESUNPKDB4MDc2OTQyNTgpLCBESUNPKDB4MGI1MGRiOTApLCBESUNPKDB4MGYzODQ5NTApLCBESUNPKDB4MTQwZGFjNDApLAorICAgIERJQ08oMHgxN2M1MGQ4MCksIERJQ08oMHgxYjQ5YjMwMCksIERJQ08oMHgyNDc0NjIwMCksIERJQ08oMHgyY2U5MmZjMCksCisgICAgRElDTygweDMwOWZkYWMwKSwgRElDTygweDM1YzAyYTAwKSwgRElDTygweDNhYTNkZjAwKSwgRElDTygweDNlMWVkYjAwKSwKKyAgICBESUNPKDB4NDMxYWQyODApLCBESUNPKDB4NGI1N2Y1MDApLCBESUNPKDB4NTE0NjM5ODApLCBESUNPKDB4NTg2YjUyMDApLAorICAgIERJQ08oMHgwNjQwMWRkMCksIERJQ08oMHgwOGQzZDliMCksIERJQ08oMHgwY2EwZjUxMCksIERJQ08oMHgxMGVkMTkyMCksCisgICAgRElDTygweDE0NTFjMmUwKSwgRElDTygweDIwODJmNjQwKSwgRElDTygweDI4NzJjMGMwKSwgRElDTygweDJjYTlkYTAwKSwKKyAgICBESUNPKDB4MzIxOWNkMDApLCBESUNPKDB4MzU5NzczMDApLCBESUNPKDB4M2E4YmExYzApLCBESUNPKDB4NDNkNWYyODApLAorICAgIERJQ08oMHg0OWE1MWYwMCksIERJQ08oMHg0ZGU5YjQwMCksIERJQ08oMHg1MzYyZWY4MCksIERJQ08oMHg1OTM4NzMwMCksCisgICAgRElDTygweDA1ODljNDMwKSwgRElDTygweDA3ODA5OTE4KSwgRElDTygweDBkMDg2ZjgwKSwgRElDTygweDEwMzcxYzIwKSwKKyAgICBESUNPKDB4MTUxODQyYzApLCBESUNPKDB4MWJmY2IxYzApLCBESUNPKDB4MjI0NDEwNDApLCBESUNPKDB4MjcyMmI1YzApLAorICAgIERJQ08oMHgyYjYwM2ZjMCksIERJQ08oMHgzMTQ0NjVjMCksIERJQ08oMHg0MDMwOGIwMCksIERJQ08oMHg0N2Q1YTIwMCksCisgICAgRElDTygweDRiZjdlMDAwKSwgRElDTygweDRmOTM3MjAwKSwgRElDTygweDU1ODRlYjAwKSwgRElDTygweDVjYjAyMjAwKSwKKyAgICBESUNPKDB4MDNiNTkyZjApLCBESUNPKDB4MDU2YmE3MzgpLCBESUNPKDB4MGE4ZTIyNTApLCBESUNPKDB4MTcyNDM2YzApLAorICAgIERJQ08oMHgxYWQzNWRhMCksIERJQ08oMHgxZDcyZGM4MCksIERJQ08oMHgyMGNkMzkwMCksIERJQ08oMHgyYTk2Mjk0MCksCisgICAgRElDTygweDJmM2I2NzAwKSwgRElDTygweDMzMzEyYjQwKSwgRElDTygweDM4ZGM2NjgwKSwgRElDTygweDQxNjU5MjAwKSwKKyAgICBESUNPKDB4NGQzNmEzODApLCBESUNPKDB4NTJiMDA5ODApLCBESUNPKDB4NThjODI4MDApLCBESUNPKDB4NWQ3NDE2MDApLAorICAgIERJQ08oMHgwNWJkZmUxMCksIERJQ08oMHgwNzU2ZGEyMCksIERJQ08oMHgwY2QzMWZlMCksIERJQ08oMHgxMzBmMTgyMCksCisgICAgRElDTygweDE1NjFjYWEwKSwgRElDTygweDE5NjJhYjIwKSwgRElDTygweDFjMzEwODQwKSwgRElDTygweDI4YmY2ZjgwKSwKKyAgICBESUNPKDB4MmQyZDQ1MDApLCBESUNPKDB4MzIzMGY5MDApLCBESUNPKDB4M2FjMmVhODApLCBESUNPKDB4M2ViZTcxYzApLAorICAgIERJQ08oMHg0ODI4MDcwMCksIERJQ08oMHg1MDI1NDkwMCksIERJQ08oMHg1ODUwYTIwMCksIERJQ08oMHg1ZTY4NzIwMCksCisgICAgRElDTygweDA0ZTJiN2U4KSwgRElDTygweDA2N2Y1NDMwKSwgRElDTygweDBhODg5OWEwKSwgRElDTygweDBkNTcxNTYwKSwKKyAgICBESUNPKDB4MWM0MmY0NDApLCBESUNPKDB4MjJlMjFmYzApLCBESUNPKDB4MjcwNzQzNDApLCBESUNPKDB4MmM0OTMyNDApLAorICAgIERJQ08oMHgyZjdlY2UwMCksIERJQ08oMHgzMzk1OWVjMCksIERJQ08oMHgzOTJkMzAwMCksIERJQ08oMHg0NTlmYzgwMCksCisgICAgRElDTygweDRiYTVmNzAwKSwgRElDTygweDRmZGU3NzgwKSwgRElDTygweDU1ZjkwMzgwKSwgRElDTygweDVjOTI4YjAwKSwKKyAgICBESUNPKDB4MDU1N2I5NDApLCBESUNPKDB4MDc1ZjAxNTgpLCBESUNPKDB4MGJkOGM1NDApLCBESUNPKDB4MGY0ZWUzNzApLAorICAgIERJQ08oMHgxNDFkYzkwMCksIERJQ08oMHgxYjI0MWYwMCksIERJQ08oMHgyMWMzMmE4MCksIERJQ08oMHgyOWEyMzk4MCksCisgICAgRElDTygweDJlNDc1MzgwKSwgRElDTygweDM2MTZmOWMwKSwgRElDTygweDNhNTJhNTAwKSwgRElDTygweDQwMzQ1ZjAwKSwKKyAgICBESUNPKDB4NDc2M2E1MDApLCBESUNPKDB4NGViNWJiODApLCBESUNPKDB4NTYxZDQ0ODApLCBESUNPKDB4NWQzODg1ODApLAorICAgIERJQ08oMHgwNTdkN2QwOCksIERJQ08oMHgwNzM4YzI0MCksIERJQ08oMHgwYmY0NmUxMCksIERJQ08oMHgwZWM5M2RhMCksCisgICAgRElDTygweDE0YWIzY2MwKSwgRElDTygweDIzZDBmNWMwKSwgRElDTygweDI3MWU5OTAwKSwgRElDTygweDJjMGVlNGMwKSwKKyAgICBESUNPKDB4MzAxZDFmMDApLCBESUNPKDB4MzM4NjgwNDApLCBESUNPKDB4MzdjZGRlMDApLCBESUNPKDB4M2M4MDU0NDApLAorICAgIERJQ08oMHg0M2M2OTIwMCksIERJQ08oMHg0ZjVjOWEwMCksIERJQ08oMHg1NmViM2U4MCksIERJQ08oMHg1Y2RhZGM4MCksCisgICAgRElDTygweDA2Y2RiYWIwKSwgRElDTygweDA5OTllNjAwKSwgRElDTygweDBkZjM5NzkwKSwgRElDTygweDEyZmZjOWEwKSwKKyAgICBESUNPKDB4MTVjZmU3YTApLCBESUNPKDB4MWM1OTkzMDApLCBESUNPKDB4MjFhZmQ2MDApLCBESUNPKDB4MjY4NDJiYzApLAorICAgIERJQ08oMHgzMjA2N2MwMCksIERJQ08oMHgzNjhiYjA4MCksIERJQ08oMHgzYzM1MGM0MCksIERJQ08oMHg0NGU4YmUwMCksCisgICAgRElDTygweDRhYzg0MDAwKSwgRElDTygweDRmOWMxMjgwKSwgRElDTygweDU0NDllYzAwKSwgRElDTygweDU5NGQ1ODgwKSwKKyAgICBESUNPKDB4MDQ5YTZiZDApLCBESUNPKDB4MDY4NDlmMDgpLCBESUNPKDB4MTA1OTJiNDApLCBESUNPKDB4MTY4YzE5NDApLAorICAgIERJQ08oMHgxOTkyZGY0MCksIERJQ08oMHgxZTkxYjMwMCksIERJQ08oMHgyMjM3ZTEwMCksIERJQ08oMHgyY2Q3M2E4MCksCisgICAgRElDTygweDMwZTdjMTAwKSwgRElDTygweDM2MWE0NWMwKSwgRElDTygweDNjZGQxZjQwKSwgRElDTygweDQxZDVkMTAwKSwKKyAgICBESUNPKDB4NDZmNzk0ODApLCBESUNPKDB4NGU0NGM4ODApLCBESUNPKDB4NTU4MzBlODApLCBESUNPKDB4NWQ3YzA2ODApLAorICAgIERJQ08oMHgwNTA4Nzk1OCksIERJQ08oMHgwNmZiN2U0MCksIERJQ08oMHgwYWM1YWNlMCksIERJQ08oMHgxNGU5MWQ4MCksCisgICAgRElDTygweDE5YWM2OGMwKSwgRElDTygweDFkYmY3NjAwKSwgRElDTygweDI2ZjkxNmMwKSwgRElDTygweDJiZDJjOTgwKSwKKyAgICBESUNPKDB4MzA3Zjc5MDApLCBESUNPKDB4MzhlMDdlNDApLCBESUNPKDB4M2RmN2YxYzApLCBESUNPKDB4NDEzMjNkMDApLAorICAgIERJQ08oMHg0NGQyZjQ4MCksIERJQ08oMHg0OGZiMDQ4MCksIERJQ08oMHg1MWUxNzkwMCksIERJQ08oMHg1YzE1ZDcwMCksCisgICAgRElDTygweDAzNDZjZjQwKSwgRElDTygweDA1NDIzNDA4KSwgRElDTygweDBiNjQwY2UwKSwgRElDTygweDEzMDU1MDYwKSwKKyAgICBESUNPKDB4MWE4YzBiNjApLCBESUNPKDB4MWQ4ZDIyODApLCBESUNPKDB4MjE4YjY1MDApLCBESUNPKDB4MmMzODU3MDApLAorICAgIERJQ08oMHgzMDkyN2I0MCksIERJQ08oMHgzNWQ4Mjg4MCksIERJQ08oMHgzYWE4N2UwMCksIERJQ08oMHgzZGE0NmE0MCksCisgICAgRElDTygweDQ1ZWE1MjgwKSwgRElDTygweDUxMWVjYjgwKSwgRElDTygweDU3YjUzYjAwKSwgRElDTygweDVkNDkxNDAwKSwKKyAgICBESUNPKDB4MDU2YWExYzgpLCBESUNPKDB4MDc1YTA5YTApLCBESUNPKDB4MGE1ZDYxZDApLCBESUNPKDB4MTNjYjlmZTApLAorICAgIERJQ08oMHgxZjkyNGRjMCksIERJQ08oMHgyMzdhMTFjMCksIERJQ08oMHgyNzdkNmI4MCksIERJQ08oMHgyYzJiYTQ0MCksCisgICAgRElDTygweDMwMTk1YzgwKSwgRElDTygweDM1MjUwY2MwKSwgRElDTygweDNiNzE4MjAwKSwgRElDTygweDQwMTEzYzgwKSwKKyAgICBESUNPKDB4NDRkZjI2ODApLCBESUNPKDB4NDlmMGVkODApLCBESUNPKDB4NTA3OTE5ODApLCBESUNPKDB4NWFjMTA2MDApLAorICAgIERJQ08oMHgwNDZmMWU1MCksIERJQ08oMHgwNjFkZDc1OCksIERJQ08oMHgxMjM2YmVjMCksIERJQ08oMHgxNmMwNzM0MCksCisgICAgRElDTygweDFhNzM5OWMwKSwgRElDTygweDFmNjFlZTIwKSwgRElDTygweDI0NGIyMjgwKSwgRElDTygweDJiODAzZTQwKSwKKyAgICBESUNPKDB4MmVkYTUzMDApLCBESUNPKDB4MzMxMjEwYzApLCBESUNPKDB4Mzc3M2JmYzApLCBESUNPKDB4NDExYzg0MDApLAorICAgIERJQ08oMHg0ODhmZjM4MCksIERJQ08oMHg0ZmFkMjcwMCksIERJQ08oMHg1NTg0NTAwMCksIERJQ08oMHg1Y2E3NGMwMCksCisgICAgRElDTygweDA0YjQ1NmYwKSwgRElDTygweDA1ZmNhMTk4KSwgRElDTygweDBhZDA1NmQwKSwgRElDTygweDE5YzNiZmUwKSwKKyAgICBESUNPKDB4MWQ0NDYxMDApLCBESUNPKDB4MjBmNjcyMDApLCBESUNPKDB4MjRhNDBiNDApLCBESUNPKDB4MjhkNDcyYzApLAorICAgIERJQ08oMHgyZGE4MTNjMCksIERJQ08oMHgzMTg4MDIwMCksIERJQ08oMHgzNTM0NGY0MCksIERJQ08oMHgzY2E3ZjM0MCksCisgICAgRElDTygweDRhYTk0MzAwKSwgRElDTygweDRmOTIxNTAwKSwgRElDTygweDU1MTZkNzAwKSwgRElDTygweDVjODMyODgwKSwKKyAgICBESUNPKDB4MDdmNDY4YzApLCBESUNPKDB4MGJiYjZlOTApLCBESUNPKDB4MGYwZjg3MzApLCBESUNPKDB4MTQzZDYxODApLAorICAgIERJQ08oMHgxOThiODRjMCksIERJQ08oMHgxYzZiMzBhMCksIERJQ08oMHgyMTljODAwMCksIERJQ08oMHgyODc5NTc4MCksCisgICAgRElDTygweDJjY2UzZDAwKSwgRElDTygweDMyOWIxMTAwKSwgRElDTygweDNhOGQyMjQwKSwgRElDTygweDNmNTc5MDgwKSwKKyAgICBESUNPKDB4NDVhNzQ0MDApLCBESUNPKDB4NGQwMDBmODApLCBESUNPKDB4NTJiZDY4ODApLCBESUNPKDB4NWE3NDNhODApLAorICAgIERJQ08oMHgwNjk3OTQ5OCksIERJQ08oMHgwODhmZWNmMCksIERJQ08oMHgwZjFkYWM5MCksIERJQ08oMHgxMjA3NzE2MCksCisgICAgRElDTygweDE2ZDViMTIwKSwgRElDTygweDFjNTQ2NWMwKSwgRElDTygweDIxYWQxNGMwKSwgRElDTygweDI4MmJlMjgwKSwKKyAgICBESUNPKDB4MmI2NmEzODApLCBESUNPKDB4MmZhM2YyMDApLCBESUNPKDB4MzVhMDY1MDApLCBESUNPKDB4M2E0NThkMDApLAorICAgIERJQ08oMHg0NGFlZmMwMCksIERJQ08oMHg0ZTkyZjYwMCksIERJQ08oMHg1NWI5ZmE4MCksIERJQ08oMHg1Y2ZlMDI4MCksCisgICAgRElDTygweDA1NTJiNDA4KSwgRElDTygweDA2ZjZjZTM4KSwgRElDTygweDBlOGY4ZDgwKSwgRElDTygweDEzOTVlOTAwKSwKKyAgICBESUNPKDB4MTdjN2I0NDApLCBESUNPKDB4MWVjNjRkYzApLCBESUNPKDB4MjM2ZTIyMDApLCBESUNPKDB4MmFiYzBiODApLAorICAgIERJQ08oMHgyZTEzMTI0MCksIERJQ08oMHgzMjkyMTEwMCksIERJQ08oMHgzNzI2MzNjMCksIERJQ08oMHgzY2E5Nzg0MCksCisgICAgRElDTygweDQ5NmU1MDAwKSwgRElDTygweDRmODZhODAwKSwgRElDTygweDU0MDcyMzAwKSwgRElDTygweDViZTMxYzgwKSwKKyAgICBESUNPKDB4MDQ3MGMwYjgpLCBESUNPKDB4MDY2MmM0NjgpLCBESUNPKDB4MGM0OTNmZDApLCBESUNPKDB4MWExOTQ5YzApLAorICAgIERJQ08oMHgxZmViY2MyMCksIERJQ08oMHgyMzY0ZTkwMCksIERJQ08oMHgyYTBjY2UwMCksIERJQ08oMHgyZjZmODE0MCksCisgICAgRElDTygweDM0MThiMDAwKSwgRElDTygweDNjNWM3YTQwKSwgRElDTygweDQyZDM5MTAwKSwgRElDTygweDQ3NmMyYjAwKSwKKyAgICBESUNPKDB4NGUxMWMzMDApLCBESUNPKDB4NTM2MjE1MDApLCBESUNPKDB4NTgzZmQyODApLCBESUNPKDB4NWNlMjY2MDApLAorICAgIERJQ08oMHgwNGIwMDZjMCksIERJQ08oMHgwOWExZWQ0MCksIERJQ08oMHgxMzVhZWUwMCksIERJQ08oMHgxOTNiNTE4MCksCisgICAgRElDTygweDFmMzY3OWEwKSwgRElDTygweDI0ZmRiY2MwKSwgRElDTygweDJiODIzZTAwKSwgRElDTygweDMxODM1NzgwKSwKKyAgICBESUNPKDB4MzdjNzRjYzApLCBESUNPKDB4M2RmNjY3ODApLCBESUNPKDB4NDNjMTg1ODApLCBESUNPKDB4NDk0NjU5ODApLAorICAgIERJQ08oMHg0ZWQwY2UwMCksIERJQ08oMHg1M2Q2ZmI4MCksIERJQ08oMHg1OTA2NDMwMCksIERJQ08oMHg1ZGVhYTEwMCksCisgICAgRElDTygweDAzY2JjNDljKSwgRElDTygweDA3NzM1OTMwKSwgRElDTygweDEzOGFhYTIwKSwgRElDTygweDFhMWU2OWEwKSwKKyAgICBESUNPKDB4MjFiZTkzYzApLCBESUNPKDB4MjkzNmY3ODApLCBESUNPKDB4MmZhNzZmODApLCBESUNPKDB4MzRhZTZiMDApLAorICAgIERJQ08oMHgzOTZiN2I4MCksIERJQ08oMHgzZGJjNjcwMCksIERJQ08oMHg0MjFhOTEwMCksIERJQ08oMHg0NmZkMjE4MCksCisgICAgRElDTygweDRjNWRjYTgwKSwgRElDTygweDUxOTIzYjgwKSwgRElDTygweDU3NmQxMzAwKSwgRElDTygweDVkMjg4NjgwKSwKKyAgICBESUNPKDB4MDNjYWI3ZDApLCBESUNPKDB4MDUyYzg4YjgpLCBESUNPKDB4MDllZDI0ZjApLCBESUNPKDB4MWMyNjE4MjApLAorICAgIERJQ08oMHgyMDkwOTZjMCksIERJQ08oMHgyMzYxZTA4MCksIERJQ08oMHgyNzI5MjgwMCksIERJQ08oMHgyYmJkYzZjMCksCisgICAgRElDTygweDMyOTJkYTgwKSwgRElDTygweDM2ODY2YTQwKSwgRElDTygweDNjNGQ1MTAwKSwgRElDTygweDQ1MjMzNDAwKSwKKyAgICBESUNPKDB4NGQ5MjhhMDApLCBESUNPKDB4NTJjYTlkMDApLCBESUNPKDB4NTgyMGQwMDApLCBESUNPKDB4NWQ5MDM4ODApLAorICAgIERJQ08oMHgwM2Y4MzcxOCksIERJQ08oMHgwNTQwZmE5MCksIERJQ08oMHgxMzAyODEyMCksIERJQ08oMHgxYWQ2ZTE2MCksCisgICAgRElDTygweDFkNzg0ODgwKSwgRElDTygweDIyMDI4OTAwKSwgRElDTygweDI1OTc2YjQwKSwgRElDTygweDJiMjkzNzAwKSwKKyAgICBESUNPKDB4MmRkYjg2YzApLCBESUNPKDB4MzE3YzQzNDApLCBESUNPKDB4MzRlNjJlYzApLCBESUNPKDB4M2I3MWJkMDApLAorICAgIERJQ08oMHg0YmMzNDc4MCksIERJQ08oMHg1Mjk4MjQwMCksIERJQ08oMHg1N2ZhMjgwMCksIERJQ08oMHg1ZjE5Y2MwMCksCisgICAgRElDTygweDA0OWNlYjUwKSwgRElDTygweDA2YThkNGUwKSwgRElDTygweDA5ZGIyNDcwKSwgRElDTygweDEyMGUzZTYwKSwKKyAgICBESUNPKDB4MWM4ZWJiODApLCBESUNPKDB4MjEyMjFkMDApLCBESUNPKDB4MjY3OWJmYzApLCBESUNPKDB4MmIxZTc2MDApLAorICAgIERJQ08oMHgyZWJiY2Y4MCksIERJQ08oMHgzMmQ1YWZjMCksIERJQ08oMHgzZDFiZWYwMCksIERJQ08oMHg0MWIxMWEwMCksCisgICAgRElDTygweDQ1YmIyZDgwKSwgRElDTygweDRjYjcwMzAwKSwgRElDTygweDU3MmZkYzgwKSwgRElDTygweDVkODc2ZTgwKSwKKyAgICBESUNPKDB4MDRhYmRhNjgpLCBESUNPKDB4MDY2OThjZDApLCBESUNPKDB4MGNhODcyMzApLCBESUNPKDB4MTUwODZhODApLAorICAgIERJQ08oMHgxNzZjZjRlMCksIERJQ08oMHgyMjg5OTQ0MCksIERJQ08oMHgyNjhmYzUwMCksIERJQ08oMHgyYmEyZDk0MCksCisgICAgRElDTygweDMzNTA1OTgwKSwgRElDTygweDM2OTQ0YmMwKSwgRElDTygweDNiMjBjMjgwKSwgRElDTygweDQzN2U4ZjAwKSwKKyAgICBESUNPKDB4NGJmMjllODApLCBESUNPKDB4NTE3NzZhODApLCBESUNPKDB4NTdhNzc4MDApLCBESUNPKDB4NWNmNmMxODApLAorICAgIERJQ08oMHgwNmQ3ZjVjMCksIERJQ08oMHgwOGZkM2NjMCksIERJQ08oMHgwZDg4MDdlMCksIERJQ08oMHgxMTQwZDUwMCksCisgICAgRElDTygweDE0NmRmYzgwKSwgRElDTygweDFlOWZiYWEwKSwgRElDTygweDIzZDdiZjAwKSwgRElDTygweDI4YjJhZTgwKSwKKyAgICBESUNPKDB4MmU1YTliMDApLCBESUNPKDB4MzI3MDA1YzApLCBESUNPKDB4Mzc3MzY2NDApLCBESUNPKDB4NDAwMWM1MDApLAorICAgIERJQ08oMHg0YTg2MmIwMCksIERJQ08oMHg0ZjdhMmUwMCksIERJQ08oMHg1NGEyMjA4MCksIERJQ08oMHg1Yjc2YzM4MCksCisgICAgRElDTygweDA2NzFmYjY4KSwgRElDTygweDA4ZTRiZjMwKSwgRElDTygweDBkODAxMjUwKSwgRElDTygweDExNzZiODIwKSwKKyAgICBESUNPKDB4MTUxMjg4NjApLCBESUNPKDB4MWVlMjExODApLCBESUNPKDB4MjQ3OTk1ODApLCBESUNPKDB4Mjk0MTVhNDApLAorICAgIERJQ08oMHgyZWZhMjM4MCksIERJQ08oMHgzM2ZlNTA0MCksIERJQ08oMHgzOWJmNmQwMCksIERJQ08oMHgzZjI4YjM4MCksCisgICAgRElDTygweDQ0MmIyMjgwKSwgRElDTygweDQ5M2RlNjgwKSwgRElDTygweDU0Mzc3NzAwKSwgRElDTygweDVkM2E1NDgwKSwKKyAgICBESUNPKDB4MDY1Yjc5NzApLCBESUNPKDB4MDg3ODIwYjApLCBESUNPKDB4MGQ4ZDZhYTApLCBESUNPKDB4MTY3MTg2MjApLAorICAgIERJQ08oMHgxYTNhOGY0MCksIERJQ08oMHgxZjQwOTljMCksIERJQ08oMHgyNGQ4N2I0MCksIERJQ08oMHgyOTZkODVjMCksCisgICAgRElDTygweDJmODg3YzgwKSwgRElDTygweDM0MmQxYjQwKSwgRElDTygweDM4ODdmYzQwKSwgRElDTygweDNkNzU4YjQwKSwKKyAgICBESUNPKDB4NDI2NDFjODApLCBESUNPKDB4NDdiZjY5ODApLCBESUNPKDB4NTVmODI5MDApLCBESUNPKDB4NWUxMzJhMDApLAorICAgIERJQ08oMHgwNWRkYmMwMCksIERJQ08oMHgwODFmMTdhMCksIERJQ08oMHgwYmYyM2FjMCksIERJQ08oMHgxMmZjOGQ2MCksCisgICAgRElDTygweDE3MmJjNDQwKSwgRElDTygweDFhODMzNTQwKSwgRElDTygweDFlOTQyMjAwKSwgRElDTygweDIxZTQ3N2MwKSwKKyAgICBESUNPKDB4MmU3NWRhODApLCBESUNPKDB4Mzk5ZWZhYzApLCBESUNPKDB4M2RmYjY5MDApLCBESUNPKDB4NDI4YjM3ODApLAorICAgIERJQ08oMHg0OTIyYTA4MCksIERJQ08oMHg0ZDRjMTcwMCksIERJQ08oMHg1MWJiZWUwMCksIERJQ08oMHg1YjRjZmM4MCksCisgICAgRElDTygweDA2ZWNmMzgwKSwgRElDTygweDA4ZjgzOTkwKSwgRElDTygweDBjYjU1NjgwKSwgRElDTygweDE0MGIyODYwKSwKKyAgICBESUNPKDB4MTgwODRkMDApLCBESUNPKDB4MWFmZjk5NDApLCBESUNPKDB4MWY1ZjZmMDApLCBESUNPKDB4MjI0YTNkODApLAorICAgIERJQ08oMHgyYjBmNDljMCksIERJQ08oMHgzNjEzYjI4MCksIERJQ08oMHgzOTE4OGY0MCksIERJQ08oMHgzZWZhMzY0MCksCisgICAgRElDTygweDQ3NzFlNDAwKSwgRElDTygweDRjYTMyMzgwKSwgRElDTygweDU0NjI3NTgwKSwgRElDTygweDVjYjkxMDAwKSwKKyAgICBESUNPKDB4MDY5ZTdmOTgpLCBESUNPKDB4MDg3MGM3NjApLCBESUNPKDB4MGQ3YjczYTApLCBESUNPKDB4MTVhYjEwNDApLAorICAgIERJQ08oMHgxOGE0ZDIyMCksIERJQ08oMHgxYzRjMWYyMCksIERJQ08oMHgxZmZhZjIwMCksIERJQ08oMHgyNDE0MjU4MCksCisgICAgRElDTygweDMwZTQ3NTQwKSwgRElDTygweDM3MzQwMjAwKSwgRElDTygweDNhNjlhZjQwKSwgRElDTygweDNlZDQ3MWMwKSwKKyAgICBESUNPKDB4NDQxNTc4ODApLCBESUNPKDB4NDg2YjdmMDApLCBESUNPKDB4NTJlZDJiMDApLCBESUNPKDB4NWNlM2E5ODApLAorICAgIERJQ08oMHgwNDdmMTA4MCksIERJQ08oMHgwNjQ2MzIzMCksIERJQ08oMHgwYjU2NmU4MCksIERJQ08oMHgwZWRiOTA4MCksCisgICAgRElDTygweDEyOGEyZmEwKSwgRElDTygweDE3NDhiMzQwKSwgRElDTygweDIxMGIyYjAwKSwgRElDTygweDI4MDk5YjgwKSwKKyAgICBESUNPKDB4MmY1MTk3NDApLCBESUNPKDB4MzZmZTgyYzApLCBESUNPKDB4M2Q5MjRiODApLCBESUNPKDB4NDNjZDNjMDApLAorICAgIERJQ08oMHg0YTc3NDY4MCksIERJQ08oMHg1MGQxNWYwMCksIERJQ08oMHg1NzNiMzU4MCksIERJQ08oMHg1ZDRjMWMwMCksCisgICAgRElDTygweDA1ZmE2YTY4KSwgRElDTygweDA4NjZlNGMwKSwgRElDTygweDBkMTMzY2MwKSwgRElDTygweDE1NmQ2YjIwKSwKKyAgICBESUNPKDB4MThhYmViZTApLCBESUNPKDB4MWQzNzQ5MDApLCBESUNPKDB4MjNkMjNkMDApLCBESUNPKDB4MjdiMzcwYzApLAorICAgIERJQ08oMHgyZjYzZWYwMCksIERJQ08oMHgzNTJhMDYwMCksIERJQ08oMHgzYTY0M2E0MCksIERJQ08oMHgzZjU3Zjk4MCksCisgICAgRElDTygweDQ1N2E3ZjAwKSwgRElDTygweDUyMGY2MjAwKSwgRElDTygweDU5M2IyYzgwKSwgRElDTygweDVlMTkyYjgwKSwKKyAgICBESUNPKDB4MDRlNGUwYzgpLCBESUNPKDB4MDY3YzM0NTApLCBESUNPKDB4MGFjYWJlNzApLCBESUNPKDB4MTg2NWVlYzApLAorICAgIERJQ08oMHgxYzVlOWJjMCksIERJQ08oMHgyMDJmYWNjMCksIERJQ08oMHgyNGE2MDljMCksIERJQ08oMHgyOGRiN2IwMCksCisgICAgRElDTygweDJlZmJkNzgwKSwgRElDTygweDMzNmZlNWMwKSwgRElDTygweDM4MTlhNWMwKSwgRElDTygweDNlNzA5YjQwKSwKKyAgICBESUNPKDB4NDQzNWZmODApLCBESUNPKDB4NGJkNWZiODApLCBESUNPKDB4NTU2NGExMDApLCBESUNPKDB4NWQwYTQ5ODApLAorICAgIERJQ08oMHgwNWE3MmYwMCksIERJQ08oMHgwNzAxOTliMCksIERJQ08oMHgwZTY1NDc4MCksIERJQ08oMHgxNGZjNzc4MCksCisgICAgRElDTygweDE3NDI4M2MwKSwgRElDTygweDFiMjMxNDgwKSwgRElDTygweDFlN2I5MDAwKSwgRElDTygweDI3YTAxM2MwKSwKKyAgICBESUNPKDB4MmI0MmY1MDApLCBESUNPKDB4MmZkOWNhMDApLCBESUNPKDB4MzY3MmEwYzApLCBESUNPKDB4M2NjMjNmNDApLAorICAgIERJQ08oMHg0ODI5OWQ4MCksIERJQ08oMHg0ZjkyYTgwMCksIERJQ08oMHg1NjRkNzY4MCksIERJQ08oMHg1ZDNhYjU4MCksCisgICAgRElDTygweDAzZTYzNzY0KSwgRElDTygweDA1YmFhM2YwKSwgRElDTygweDBhYjJhMzAwKSwgRElDTygweDEyY2M1ZjYwKSwKKyAgICBESUNPKDB4MTlhOGQ1ZTApLCBESUNPKDB4MWVhNzg4ZTApLCBESUNPKDB4MjJjZDUwYzApLCBESUNPKDB4MjVkNDhhMDApLAorICAgIERJQ08oMHgyOTkyNDU0MCksIERJQ08oMHgzMjc2MmEwMCksIERJQ08oMHgzYmJhNTVjMCksIERJQ08oMHg0MjIyZTgwMCksCisgICAgRElDTygweDRhYmExMjgwKSwgRElDTygweDUwMWQwYjgwKSwgRElDTygweDU3MDkxMjAwKSwgRElDTygweDVkNmJmMTgwKSwKKyAgICBESUNPKDB4MDQ3ZGFlYjApLCBESUNPKDB4MDY5NTQ4YjgpLCBESUNPKDB4MGIwMDI0MTApLCBESUNPKDB4MTNmZjcwNjApLAorICAgIERJQ08oMHgxODZhZWM0MCksIERJQ08oMHgyMTBkYjI0MCksIERJQ08oMHgyNmYxY2U4MCksIERJQ08oMHgyYjczYzljMCksCisgICAgRElDTygweDMzZDU3MjQwKSwgRElDTygweDM4NTg5OGMwKSwgRElDTygweDNlZWE4Y2MwKSwgRElDTygweDQzYzc5YjAwKSwKKyAgICBESUNPKDB4NDk2ZWMyMDApLCBESUNPKDB4NGUxNTA3ODApLCBESUNPKDB4NTRkY2I3MDApLCBESUNPKDB4NWMzZjczODApLAorICAgIERJQ08oMHgwNzlmZDI1OCksIERJQ08oMHgwYjkzYmQ1MCksIERJQ08oMHgwZmY3ZDhiMCksIERJQ08oMHgxNGJkNGUwMCksCisgICAgRElDTygweDE5NTM2YWUwKSwgRElDTygweDFkOGIxNjQwKSwgRElDTygweDIzNzQ3Y2MwKSwgRElDTygweDI4NjFmMjgwKSwKKyAgICBESUNPKDB4MmQ3ZDI4ODApLCBESUNPKDB4MzU4M2IwNDApLCBESUNPKDB4M2MzY2FiMDApLCBESUNPKDB4NDFiN2I1ODApLAorICAgIERJQ08oMHg0OThjZmM4MCksIERJQ08oMHg1MDZjYmQwMCksIERJQ08oMHg1Nzg0NzYwMCksIERJQ08oMHg1ZDA1ZGU4MCksCisgICAgRElDTygweDA2NDM0ZWMwKSwgRElDTygweDA4MDVjY2QwKSwgRElDTygweDBjNGI0YzAwKSwgRElDTygweDEzZDU1MWMwKSwKKyAgICBESUNPKDB4MTY4NWFiZTApLCBESUNPKDB4MWE4M2VhNjApLCBESUNPKDB4MWRkYzM3MDApLCBESUNPKDB4MjJiYzQ2MDApLAorICAgIERJQ08oMHgyYzdjYTVjMCksIERJQ08oMHgzMGE1ODljMCksIERJQ08oMHgzOTVhODcwMCksIERJQ08oMHg0MGM5MjkwMCksCisgICAgRElDTygweDQ3MmZhZTgwKSwgRElDTygweDRmNmY2ZTgwKSwgRElDTygweDU3MWIzZjgwKSwgRElDTygweDVkOGU2OTgwKSwKKyAgICBESUNPKDB4MDVlYzIxYjApLCBESUNPKDB4MDc5ZWUzODgpLCBESUNPKDB4MGU0YjQ1ODApLCBESUNPKDB4MTFhYmYxMDApLAorICAgIERJQ08oMHgxNjU4OGVjMCksIERJQ08oMHgxYzk4NGVjMCksIERJQ08oMHgyMGEzODRjMCksIERJQ08oMHgyOGQ2YmUwMCksCisgICAgRElDTygweDJiY2NhNzQwKSwgRElDTygweDM2MDRiNjAwKSwgRElDTygweDNmMDI3MjgwKSwgRElDTygweDQzNGFmMDAwKSwKKyAgICBESUNPKDB4NDhkYWMyODApLCBESUNPKDB4NGQ3ZThhMDApLCBESUNPKDB4NTFmNjE4MDApLCBESUNPKDB4NWE2ZDkzODApLAorICAgIERJQ08oMHgwNTUyYzZjMCksIERJQ08oMHgwNzBjMjJhMCksIERJQ08oMHgwYTQxMWI1MCksIERJQ08oMHgwZTNlNTI3MCksCisgICAgRElDTygweDExOTNiYjYwKSwgRElDTygweDFiMTc3ZTAwKSwgRElDTygweDI3NWIyNTAwKSwgRElDTygweDJiNDJiZDgwKSwKKyAgICBESUNPKDB4MzIyZDdlNDApLCBESUNPKDB4M2ExNzA4ODApLCBESUNPKDB4M2Q2NmI1ODApLCBESUNPKDB4NDE0MTMyODApLAorICAgIERJQ08oMHg0NmE5Y2U4MCksIERJQ08oMHg0ZTRlMzgwMCksIERJQ08oMHg1NzFmODM4MCksIERJQ08oMHg1ZGRhZTM4MCksCisgICAgRElDTygweDA1NTYwMmMwKSwgRElDTygweDA2ZTY5MTE4KSwgRElDTygweDBjOWQxM2YwKSwgRElDTygweDEwOTBkNTAwKSwKKyAgICBESUNPKDB4MTM4ZDIyODApLCBESUNPKDB4MTcxYmY1NDApLCBESUNPKDB4MWI1ODUxODApLCBESUNPKDB4Mjg4Yjk3NDApLAorICAgIERJQ08oMHgyZGIyMDJjMCksIERJQ08oMHgzNTI1ZTY4MCksIERJQ08oMHgzYzMwMzkwMCksIERJQ08oMHg0MzExZGY4MCksCisgICAgRElDTygweDQ5YjkyYzAwKSwgRElDTygweDUwOWRlOTAwKSwgRElDTygweDU2ZTlhMDgwKSwgRElDTygweDVkNTIzYTgwKSwKKyAgICBESUNPKDB4MDRlNzk4MTApLCBESUNPKDB4MDY5NjI2ZTgpLCBESUNPKDB4MGE2Y2Y2ODApLCBESUNPKDB4MGRhNjY4YzApLAorICAgIERJQ08oMHgxMTU4NzJhMCksIERJQ08oMHgyMDMyZWVjMCksIERJQ08oMHgyNTM0NWRjMCksIERJQ08oMHgyYWU4ZWE0MCksCisgICAgRElDTygweDMwMjI0MjgwKSwgRElDTygweDM1MWZmNjQwKSwgRElDTygweDNjZTY1YTgwKSwgRElDTygweDQ1NGJmZjAwKSwKKyAgICBESUNPKDB4NGVlMDg5ODApLCBESUNPKDB4NTQzYjQyODApLCBESUNPKDB4NTljMTkyODApLCBESUNPKDB4NWRkZmJiMDApLAorICAgIERJQ08oMHgwM2YwYmI5OCksIERJQ08oMHgwNTg4ZjRmMCksIERJQ08oMHgwYTg2MmJjMCksIERJQ08oMHgxNGVjNzZlMCksCisgICAgRElDTygweDE4NGI4YTgwKSwgRElDTygweDFmN2JiZDgwKSwgRElDTygweDIzZjFhN2MwKSwgRElDTygweDJjMzY3OTAwKSwKKyAgICBESUNPKDB4MzIzNGFmODApLCBESUNPKDB4MzU0NjBhYzApLCBESUNPKDB4Mzg1MTRjMDApLCBESUNPKDB4M2Q1ZjM1NDApLAorICAgIERJQ08oMHg0ODM5NDk4MCksIERJQ08oMHg0ZmJkZDM4MCksIERJQ08oMHg1NmRlMDI4MCksIERJQ08oMHg1ZDRlNjUwMCksCisgICAgRElDTygweDA2MDUwZjI4KSwgRElDTygweDA4MDcwYWYwKSwgRElDTygweDBiZTMxMjQwKSwgRElDTygweDBmNWU1M2UwKSwKKyAgICBESUNPKDB4MTI1ZjE3NDApLCBESUNPKDB4MjE1YjFmYzApLCBESUNPKDB4Mjg4M2Q4ODApLCBESUNPKDB4MmMxODEwODApLAorICAgIERJQ08oMHgzMjgxMDI4MCksIERJQ08oMHgzNWQ1NjgwMCksIERJQ08oMHgzYTliMDg4MCksIERJQ08oMHgzZmZhYWY4MCksCisgICAgRElDTygweDQ0YzY1NTAwKSwgRElDTygweDRhNDVhZTgwKSwgRElDTygweDU2YjRlZDgwKSwgRElDTygweDVlNGFkYzAwKSwKKyAgICBESUNPKDB4MDM3MmJiYjQpLCBESUNPKDB4MDRlYTQ4NDgpLCBESUNPKDB4MDliOGRlNzApLCBESUNPKDB4MTUxYjRhNDApLAorICAgIERJQ08oMHgxYmU2NWEwMCksIERJQ08oMHgyMDc2NTVjMCksIERJQ08oMHgyNzIwZGQwMCksIERJQ08oMHgyZmM2Y2MwMCksCisgICAgRElDTygweDM1YjA2M2MwKSwgRElDTygweDM5YmQzMGMwKSwgRElDTygweDNkYzViNTgwKSwgRElDTygweDQyYWY3YjAwKSwKKyAgICBESUNPKDB4NDhkMmJmMDApLCBESUNPKDB4NGY0NmJiODApLCBESUNPKDB4NTVmN2NhODApLCBESUNPKDB4NWNhN2U5ODApLAorICAgIERJQ08oMHgwMzNmODY4YyksIERJQ08oMHgwNGQ5YTBlMCksIERJQ08oMHgwYTE4ZDZkMCksIERJQ08oMHgxM2RhNTU4MCksCisgICAgRElDTygweDE4MWFlODgwKSwgRElDTygweDIwN2Q4NTgwKSwgRElDTygweDI2MjAyMmMwKSwgRElDTygweDJjNmRlMDQwKSwKKyAgICBESUNPKDB4MzMyMWYxMDApLCBESUNPKDB4MzkyN2YwYzApLCBESUNPKDB4M2Y3NGNlNDApLCBESUNPKDB4NDU3M2U5ODApLAorICAgIERJQ08oMHg0YmE2NmM4MCksIERJQ08oMHg1MWEyNjEwMCksIERJQ08oMHg1N2QzYTgwMCksIERJQ08oMHg1ZDUyZTc4MCksCisgICAgRElDTygweDA1MTg5ODYwKSwgRElDTygweDA3MjMxODQ4KSwgRElDTygweDBiOTE1NzEwKSwgRElDTygweDBmMDVkNmMwKSwKKyAgICBESUNPKDB4MTNiYjA4MjApLCBESUNPKDB4MjIzYWRmMDApLCBESUNPKDB4MjZjZTFlYzApLCBESUNPKDB4MmNlMWFjMDApLAorICAgIERJQ08oMHgzNDAxZjZjMCksIERJQ08oMHgzYjhjMjI0MCksIERJQ08oMHg0MGU0YTQwMCksIERJQ08oMHg0NTY3NGYwMCksCisgICAgRElDTygweDRiMDRiODgwKSwgRElDTygweDRmMjUzMjAwKSwgRElDTygweDU0MTY4NjAwKSwgRElDTygweDU4ZjUyNzgwKSwKKyAgICBESUNPKDB4MDMzOGQxODQpLCBESUNPKDB4MDUyMDU3OTApLCBESUNPKDB4MDlhYmNkODApLCBESUNPKDB4MGY1M2ZmNjApLAorICAgIERJQ08oMHgxYTdmZTkwMCksIERJQ08oMHgxZWY5Mzg2MCksIERJQ08oMHgyMzhlMmQ4MCksIERJQ08oMHgyYmQ4MWJjMCksCisgICAgRElDTygweDMzMTYxMjQwKSwgRElDTygweDM2OGNmYjgwKSwgRElDTygweDNhMjhiNWMwKSwgRElDTygweDQwYzdhNjAwKSwKKyAgICBESUNPKDB4NGJhYzc3ODApLCBESUNPKDB4NTI0Yjc4ODApLCBESUNPKDB4NTg2Mzg0ODApLCBESUNPKDB4NWRhMDdiMDApLAorICAgIERJQ08oMHgwNGQwNmYzOCksIERJQ08oMHgwNjVmMTUxOCksIERJQ08oMHgwYzliMzFiMCksIERJQ08oMHgxMDU3MGQ0MCksCisgICAgRElDTygweDE1ZTc5MGEwKSwgRElDTygweDIwZjE2MzgwKSwgRElDTygweDI0NmYyM2MwKSwgRElDTygweDJlMjIyODAwKSwKKyAgICBESUNPKDB4MzE5OGJmMDApLCBESUNPKDB4MzRiODQ2NDApLCBESUNPKDB4MzhmNWI0NDApLCBESUNPKDB4NDMxMmRmODApLAorICAgIERJQ08oMHg0ZDJkMzAwMCksIERJQ08oMHg1MjA5ZWU4MCksIERJQ08oMHg1NzljZjE4MCksIERJQ08oMHg1Y2IzNzY4MCksCisgICAgRElDTygweDA0MmU2NTYwKSwgRElDTygweDA1ZWFmZjMwKSwgRElDTygweDBhMDkwZDMwKSwgRElDTygweDBkOWYyYWIwKSwKKyAgICBESUNPKDB4MWE2ZjAyNjApLCBESUNPKDB4MjA5ZTBjMDApLCBESUNPKDB4MjVkYzk1YzApLCBESUNPKDB4MjlmODk4NDApLAorICAgIERJQ08oMHgyZjM3Mjg0MCksIERJQ08oMHgzYTMwMTk0MCksIERJQ08oMHgzZjBlMmU4MCksIERJQ08oMHg0NDQ2NWM4MCksCisgICAgRElDTygweDQ5MjA3NzgwKSwgRElDTygweDRkZmRhYjgwKSwgRElDTygweDUzMmVjMDAwKSwgRElDTygweDVhY2VmZDAwKSwKKyAgICBESUNPKDB4MDRlMThhZDgpLCBESUNPKDB4MDZkNWI2NjApLCBESUNPKDB4MGIyYTIyZDApLCBESUNPKDB4MGUwZTRlZjApLAorICAgIERJQ08oMHgxOTgzMDRhMCksIERJQ08oMHgxZTRhMjVjMCksIERJQ08oMHgyM2RlMzdjMCksIERJQ08oMHgyOTA2NzljMCksCisgICAgRElDTygweDJkNTIzYjAwKSwgRElDTygweDMzN2RmOTQwKSwgRElDTygweDM3OTQ4MTAwKSwgRElDTygweDNkZTA3MzAwKSwKKyAgICBESUNPKDB4NDllZTZlODApLCBESUNPKDB4NTA1NzYxMDApLCBESUNPKDB4NTVmYjFlMDApLCBESUNPKDB4NWQwODA1MDApLAorICAgIERJQ08oMHgwNTMxMjMwOCksIERJQ08oMHgwNzA0NjNmMCksIERJQ08oMHgwZGFmZmJhMCksIERJQ08oMHgxMmQ4YzNjMCksCisgICAgRElDTygweDE2M2FiN2EwKSwgRElDTygweDIwYzY0YzQwKSwgRElDTygweDI0YzhmZTQwKSwgRElDTygweDJhNmY2NWMwKSwKKyAgICBESUNPKDB4MzA1NWUxMDApLCBESUNPKDB4MzQ0MjBkODApLCBESUNPKDB4Mzg5ZGVkMDApLCBESUNPKDB4M2NjNTc2NDApLAorICAgIERJQ08oMHg0MjgwY2QwMCksIERJQ08oMHg0ZTBhNGMwMCksIERJQ08oMHg1NzY3NWYwMCksIERJQ08oMHg1ZDg3ZDQ4MCksCisgICAgRElDTygweDA0N2JkNTk4KSwgRElDTygweDA2Y2IxNDk4KSwgRElDTygweDBjMzU5OTMwKSwgRElDTygweDEzODE2NWUwKSwKKyAgICBESUNPKDB4MWNhZTM2NDApLCBESUNPKDB4MjE2NDc2NDApLCBESUNPKDB4MjgzNmZhYzApLCBESUNPKDB4MmNkN2I4NDApLAorICAgIERJQ08oMHgzMGQ4MzljMCksIERJQ08oMHgzNjBjOTQ0MCksIERJQ08oMHgzYWU1Y2E0MCksIERJQ08oMHg0MGE5M2IwMCksCisgICAgRElDTygweDQ5NDAxZTgwKSwgRElDTygweDRmNzM5YzgwKSwgRElDTygweDU0ZjMzYzAwKSwgRElDTygweDVjMTkwMjAwKSwKKyAgICBESUNPKDB4MDUxYzAwMDApLCBESUNPKDB4MDZiNDUyNTgpLCBESUNPKDB4MGE1ZWVlNTApLCBESUNPKDB4MGQ0NmZjMzApLAorICAgIERJQ08oMHgxMjViYmM2MCksIERJQ08oMHgyNTNkOGNjMCksIERJQ08oMHgyYTFmZDZjMCksIERJQ08oMHgyZGY0Y2Y4MCksCisgICAgRElDTygweDMyMzllM2MwKSwgRElDTygweDM1YTY4M2MwKSwgRElDTygweDNiMGJiOTgwKSwgRElDTygweDQwOWIzZDAwKSwKKyAgICBESUNPKDB4NDY2MzM1ODApLCBESUNPKDB4NGYyYjA2MDApLCBESUNPKDB4NTc3Y2VhODApLCBESUNPKDB4NWQ4NmVmMDApLAorICAgIERJQ08oMHgwM2QxOWVlYyksIERJQ08oMHgwN2NjZTZkMCksIERJQ08oMHgxNDNiNGIwMCksIERJQ08oMHgxYTY1Nzg4MCksCisgICAgRElDTygweDIxMmUwMjgwKSwgRElDTygweDI4MzFmYmMwKSwgRElDTygweDJmOGJhMDgwKSwgRElDTygweDM1ZGI4MDQwKSwKKyAgICBESUNPKDB4M2JmMTdmMDApLCBESUNPKDB4NDEzZWIxMDApLCBESUNPKDB4NDYxNTQ5MDApLCBESUNPKDB4NGFlMTgwODApLAorICAgIERJQ08oMHg0ZjliYTE4MCksIERJQ08oMHg1NDI4YmEwMCksIERJQ08oMHg1OTBlOTA4MCksIERJQ08oMHg1ZGUwZDg4MCksCisgICAgRElDTygweDA4YzdlNzIwKSwgRElDTygweDBmZjE0ODEwKSwgRElDTygweDE3NThjYzQwKSwgRElDTygweDFjYzc0NGMwKSwKKyAgICBESUNPKDB4MjNlNDVjYzApLCBESUNPKDB4MmI1Mjc5NDApLCBESUNPKDB4MzIxMzg1ODApLCBESUNPKDB4MzdiNzczODApLAorICAgIERJQ08oMHgzZDdkYTQ4MCksIERJQ08oMHg0Mjc1YTgwMCksIERJQ08oMHg0NzNlY2YwMCksIERJQ08oMHg0YmM3ZGM4MCksCisgICAgRElDTygweDUwNTEyNDAwKSwgRElDTygweDU0ZDJjNjAwKSwgRElDTygweDU5OGNlNjgwKSwgRElDTygweDVlMWUwODAwKSwKKyAgICBESUNPKDB4MDkxNjc5MTApLCBESUNPKDB4MTA3NjQ0YTApLCBESUNPKDB4MTcxYTU5ZTApLCBESUNPKDB4MWJlMWVhNjApLAorICAgIERJQ08oMHgyMTM0NzY4MCksIERJQ08oMHgyNjVhNWIwMCksIERJQ08oMHgyYmU0MWE0MCksIERJQ08oMHgzMTE2ZTcwMCksCisgICAgRElDTygweDM2OGIwMzAwKSwgRElDTygweDNjMjI1ZTgwKSwgRElDTygweDQxYTZlODgwKSwgRElDTygweDQ3NjMxNjgwKSwKKyAgICBESUNPKDB4NGQ0N2Q5MDApLCBESUNPKDB4NTJhMjg0MDApLCBESUNPKDB4NTgzZjBlODApLCBESUNPKDB4NWQ3N2JjODApLAorICAgIERJQ08oMHgwNDBiZGY4OCksIERJQ08oMHgwNWIwNjJhMCksIERJQ08oMHgwYjRhMmY3MCksIERJQ08oMHgxYjhjZDg4MCksCisgICAgRElDTygweDFlYzU4YzQwKSwgRElDTygweDIzNjYxODgwKSwgRElDTygweDI3OTBiYTgwKSwgRElDTygweDJkMGQ2YzQwKSwKKyAgICBESUNPKDB4MzRmMGJjNDApLCBESUNPKDB4M2EzNTNmODApLCBESUNPKDB4M2ZjM2JjNDApLCBESUNPKDB4NDQ5OTg3MDApLAorICAgIERJQ08oMHg0OWIxNzA4MCksIERJQ08oMHg0ZjMxZmEwMCksIERJQ08oMHg1NTMxMWM4MCksIERJQ08oMHg1YjVjOGY4MCksCisgICAgRElDTygweDA0M2UyYmQwKSwgRElDTygweDA2NDViMGYwKSwgRElDTygweDBhZGU1YjkwKSwgRElDTygweDBkNjUzYTkwKSwKKyAgICBESUNPKDB4MWJjMjI0YTApLCBESUNPKDB4MWY2MjNkYzApLCBESUNPKDB4MjdlOWE4NDApLCBESUNPKDB4MmM3MTliYzApLAorICAgIERJQ08oMHgyZjJhYzA0MCksIERJQ08oMHgzMjY4ODMwMCksIERJQ08oMHgzNjY5NWMwMCksIERJQ08oMHgzYjhhYmU0MCksCisgICAgRElDTygweDQ3MTUzYTgwKSwgRElDTygweDUyNDkxYjAwKSwgRElDTygweDU3YmE3NjgwKSwgRElDTygweDVjZTZjMzAwKSwKKyAgICBESUNPKDB4MDUyOTQwYjgpLCBESUNPKDB4MDZmMjgyMjgpLCBESUNPKDB4MGE3NDFjOTApLCBESUNPKDB4MGRhYTMxMTApLAorICAgIERJQ08oMHgxMTNiYjJlMCksIERJQ08oMHgyMDEwYjY0MCksIERJQ08oMHgyNjEwZjM4MCksIERJQ08oMHgyYTVjNzc0MCksCisgICAgRElDTygweDJmNzcwM2MwKSwgRElDTygweDMzODhkMDgwKSwgRElDTygweDNjZWFiZTQwKSwgRElDTygweDQyNDYyYTgwKSwKKyAgICBESUNPKDB4NDdmYjBlMDApLCBESUNPKDB4NGY3YWM0ODApLCBESUNPKDB4NTcwNmY1ODApLCBESUNPKDB4NWQ5MmI4MDApLAorICAgIERJQ08oMHgwM2ExMzRhNCksIERJQ08oMHgwNTYyMzQ3MCksIERJQ08oMHgwOTBhMGZlMCksIERJQ08oMHgxMmY3ZDNlMCksCisgICAgRElDTygweDFkNjNlNDQwKSwgRElDTygweDIwZTZhYzgwKSwgRElDTygweDI0N2RhOGMwKSwgRElDTygweDI3ZDk5NjAwKSwKKyAgICBESUNPKDB4MzEyZTk5YzApLCBESUNPKDB4MzY4ZmIzODApLCBESUNPKDB4M2IzZTNlYzApLCBESUNPKDB4NDBmZWFkODApLAorICAgIERJQ08oMHg0ODg4ZmEwMCksIERJQ08oMHg0ZmJkNTYwMCksIERJQ08oMHg1Nzk1YTQ4MCksIERJQ08oMHg1ZDk3MzAwMCksCisgICAgRElDTygweDA1Njk3OTkwKSwgRElDTygweDA2ZjMzODAwKSwgRElDTygweDBiMjk4MjkwKSwgRElDTygweDBkZTQ3YTYwKSwKKyAgICBESUNPKDB4MTJlZjYyYTApLCBESUNPKDB4MjFlMzBhMDApLCBESUNPKDB4MjVmOGZmMDApLCBESUNPKDB4MmIyMjg3YzApLAorICAgIERJQ08oMHgyZjExZmMwMCksIERJQ08oMHgzMzEzODAwMCksIERJQ08oMHgzN2I0OWY4MCksIERJQ08oMHg0MTMyNTEwMCksCisgICAgRElDTygweDRhYjYyODAwKSwgRElDTygweDUwMWVhZTgwKSwgRElDTygweDU2MjI4NzgwKSwgRElDTygweDVjNWQ4MzAwKSwKKyAgICBESUNPKDB4MDYzODMwZDgpLCBESUNPKDB4MDhhNzZhMzApLCBESUNPKDB4MGQzNzY4OTApLCBESUNPKDB4MTE3ZDNhMDApLAorICAgIERJQ08oMHgxNDc2ZTVjMCksIERJQ08oMHgxZTIxNTcyMCksIERJQ08oMHgyNGJjZDY4MCksIERJQ08oMHgyOTY3NGFjMCksCisgICAgRElDTygweDJmYWFiMzQwKSwgRElDTygweDMzODQzYTAwKSwgRElDTygweDM4MjJlOTAwKSwgRElDTygweDNkMzBiNmMwKSwKKyAgICBESUNPKDB4NDljZDU0ODApLCBESUNPKDB4NTMxODdkMDApLCBESUNPKDB4NTkxZmUxMDApLCBESUNPKDB4NWRiMzBmODApLAorICAgIERJQ08oMHgwNWNkYzM3OCksIERJQ08oMHgwNzVjNTBjOCksIERJQ08oMHgwZTAxZjgzMCksIERJQ08oMHgxMmI3MDQ4MCksCisgICAgRElDTygweDE1ZTMzM2UwKSwgRElDTygweDE5MmM5ZjQwKSwgRElDTygweDFkMmQ2YjgwKSwgRElDTygweDJjMDljYTQwKSwKKyAgICBESUNPKDB4MmVlYTVjYzApLCBESUNPKDB4MzJjODkzODApLCBESUNPKDB4Mzc2YTViNDApLCBESUNPKDB4NDJhNDI2MDApLAorICAgIERJQ08oMHg0YzY5NTkwMCksIERJQ08oMHg1MjY5ZTM4MCksIERJQ08oMHg1ODZkNmM4MCksIERJQ08oMHg1Y2ViZGI4MCksCisgICAgRElDTygweDA1MmJiYjgwKSwgRElDTygweDA3MDJlMjY4KSwgRElDTygweDBjYTE5NmQwKSwgRElDTygweDBmNDhjZWYwKSwKKyAgICBESUNPKDB4MTlkMjhiNjApLCBESUNPKDB4MWVjNDRhNDApLCBESUNPKDB4MjRkNDBmMDApLCBESUNPKDB4MjllMWVhYzApLAorICAgIERJQ08oMHgyY2FmYWE4MCksIERJQ08oMHgzMDFiZDRjMCksIERJQ08oMHgzNTdlYzIwMCksIERJQ08oMHg0MjI1NDQ4MCksCisgICAgRElDTygweDRiZTMyMDAwKSwgRElDTygweDRmN2E0YTAwKSwgRElDTygweDU0NDdmYzAwKSwgRElDTygweDVjY2E2YTAwKSwKKyAgICBESUNPKDB4MDUwZmRkMTgpLCBESUNPKDB4MDZjNzdlMTApLCBESUNPKDB4MTA1NjExNDApLCBESUNPKDB4MTU2NGMzNDApLAorICAgIERJQ08oMHgxODY3YWJlMCksIERJQ08oMHgxZjAwZmJhMCksIERJQ08oMHgyMmMwNjI0MCksIERJQ08oMHgyYWVkNzY4MCksCisgICAgRElDTygweDJlY2MyNGMwKSwgRElDTygweDMyYWJiMzAwKSwgRElDTygweDM2YjQyMzQwKSwgRElDTygweDNlZDhmNDgwKSwKKyAgICBESUNPKDB4NGJiZGZlODApLCBESUNPKDB4NTE2YmY4MDApLCBESUNPKDB4NTg2ODhiMDApLCBESUNPKDB4NWRkNDQ5ODApLAorICAgIERJQ08oMHgwNThhYTEzMCksIERJQ08oMHgwN2Q2OWJhOCksIERJQ08oMHgwZDUyMWY0MCksIERJQ08oMHgwZmYzN2JhMCksCisgICAgRElDTygweDE4MTI1ZWMwKSwgRElDTygweDFmM2E0NTIwKSwgRElDTygweDIzMzQ5ODQwKSwgRElDTygweDJjNzU5NTgwKSwKKyAgICBESUNPKDB4MmZjMjFjMDApLCBESUNPKDB4MzNhNDJmYzApLCBESUNPKDB4M2RjOTI5MDApLCBESUNPKDB4NDdiZWZkMDApLAorICAgIERJQ08oMHg0Y2NkMjQ4MCksIERJQ08oMHg1MTk3YTIwMCksIERJQ08oMHg1NmEyZWEwMCksIERJQ08oMHg1YmRmYTkwMCksCisgICAgRElDTygweDA1YWM4NjQwKSwgRElDTygweDA3NmFlYzg4KSwgRElDTygweDBlMmUzMjMwKSwgRElDTygweDExNGI2ZjQwKSwKKyAgICBESUNPKDB4MTU1ZDEwYTApLCBESUNPKDB4MTliYWM2MDApLCBESUNPKDB4MWZiZDc1YzApLCBESUNPKDB4MjQ1OWMwYzApLAorICAgIERJQ08oMHgyODIyOWI4MCksIERJQ08oMHgyZjU4NmZjMCksIERJQ08oMHgzZDA2OTdjMCksIERJQ08oMHg0MmE3YTUwMCksCisgICAgRElDTygweDQ5YjBiYjgwKSwgRElDTygweDRlNjQyZTgwKSwgRElDTygweDU1Nzc0MjgwKSwgRElDTygweDVkMWE3OTAwKSwKKyAgICBESUNPKDB4MDVlZmI0NzApLCBESUNPKDB4MDgzMWM4YTApLCBESUNPKDB4MGQzNWVjZTApLCBESUNPKDB4MTNlZGM0MDApLAorICAgIERJQ08oMHgxNmM4ZmVjMCksIERJQ08oMHgxYmIyNTg2MCksIERJQ08oMHgyMDRmMzE0MCksIERJQ08oMHgyNzdiOGE0MCksCisgICAgRElDTygweDJmZTlhMDAwKSwgRElDTygweDMzYWY3YzQwKSwgRElDTygweDNiN2QyOTAwKSwgRElDTygweDQxOWM5YTgwKSwKKyAgICBESUNPKDB4NDU5MWRjODApLCBESUNPKDB4NGJkYWZkMDApLCBESUNPKDB4NTU2Mzg4ODApLCBESUNPKDB4NWNlZjIzMDApLAorICAgIERJQ08oMHgwNWNmNDk4OCksIERJQ08oMHgwNzhmYThjMCksIERJQ08oMHgwYzI5MTk1MCksIERJQ08oMHgxMmUwNTMyMCksCisgICAgRElDTygweDE1NTk5N2UwKSwgRElDTygweDE5NWRmNTQwKSwgRElDTygweDFjMWI4MmMwKSwgRElDTygweDIyYzI5NDAwKSwKKyAgICBESUNPKDB4MzA3ZWRlYzApLCBESUNPKDB4MzRlODI5YzApLCBESUNPKDB4M2IxYjUwNDApLCBESUNPKDB4NDM0ZGU0MDApLAorICAgIERJQ08oMHg0OTZiOTkwMCksIERJQ08oMHg0ZmY4ODA4MCksIERJQ08oMHg1NjA0YzQ4MCksIERJQ08oMHg1Yzg0YjA4MCksCisgICAgRElDTygweDAzNjc5ZmE0KSwgRElDTygweDA1MGQ0YTIwKSwgRElDTygweDA5ZmVlYzEwKSwgRElDTygweDEwMGEyMWUwKSwKKyAgICBESUNPKDB4MTQ4M2IyNjApLCBESUNPKDB4MWQ3NmM3ODApLCBESUNPKDB4MjRlNzVjODApLCBESUNPKDB4MmJkNjI4ODApLAorICAgIERJQ08oMHgzMjM1MGE0MCksIERJQ08oMHgzOGJlMDFjMCksIERJQ08oMHgzZjA1YTI4MCksIERJQ08oMHg0NTI5NWU4MCksCisgICAgRElDTygweDRiNTU0ODAwKSwgRElDTygweDUxNjE4ODgwKSwgRElDTygweDU3NWExNTAwKSwgRElDTygweDVkMTA5ZDgwKSwKKyAgICBESUNPKDB4MDM0ZmZkMDgpLCBESUNPKDB4MDRkY2NlYTgpLCBESUNPKDB4MDdlMjg5YjgpLCBESUNPKDB4MGQ2OTUwZDApLAorICAgIERJQ08oMHgxODlhY2VjMCksIERJQ08oMHgxZTNiZjI0MCksIERJQ08oMHgyNTM1YWE0MCksIERJQ08oMHgyYjg4ZDE0MCksCisgICAgRElDTygweDMyOWJiYjAwKSwgRElDTygweDM4NmMzNTAwKSwgRElDTygweDNlOTUwODAwKSwgRElDTygweDQ0YzQzZjAwKSwKKyAgICBESUNPKDB4NGIwODk3ODApLCBESUNPKDB4NTEyMjMyODApLCBESUNPKDB4NTc0Yzk3ODApLCBESUNPKDB4NWQzNjY0MDApLAorICAgIERJQ08oMHgwMzZkOGRiOCksIERJQ08oMHgwNGZkODhiOCksIERJQ08oMHgwOTcwMGE3MCksIERJQ08oMHgxMTZiNzNjMCksCisgICAgRElDTygweDE3MjU4YzQwKSwgRElDTygweDFmZDAzMDAwKSwgRElDTygweDIzZmRmNDAwKSwgRElDTygweDI4ZTA4ZGMwKSwKKyAgICBESUNPKDB4MzJkNjg4YzApLCBESUNPKDB4Mzc5MjBiMDApLCBESUNPKDB4M2RhYWEwODApLCBESUNPKDB4NDZhMTZjMDApLAorICAgIERJQ08oMHg0ZjhjMzEwMCksIERJQ08oMHg1NGExMzcwMCksIERJQ08oMHg1OWQyNGI4MCksIERJQ08oMHg1Y2VhNGQ4MCksCisgICAgRElDTygweDA1Nzk3Yzg4KSwgRElDTygweDA4MGRjOGYwKSwgRElDTygweDBiZDIxNTIwKSwgRElDTygweDEwOTViNTQwKSwKKyAgICBESUNPKDB4MTM4ZmQ0MDApLCBESUNPKDB4MWFlZDE5YzApLCBESUNPKDB4MjlmZWFkMDApLCBESUNPKDB4MmY3MGNlYzApLAorICAgIERJQ08oMHgzMzI3ZGYwMCksIERJQ08oMHgzYTgxMmQwMCksIERJQ08oMHg0MDBhODM4MCksIERJQ08oMHg0NDlkYWEwMCksCisgICAgRElDTygweDRjZDZiNjAwKSwgRElDTygweDUxZjEyNDAwKSwgRElDTygweDU2YmRmZDgwKSwgRElDTygweDViZTBhMTAwKSwKKyAgICBESUNPKDB4MDRkZTZkNzgpLCBESUNPKDB4MDcyYWVkNDApLCBESUNPKDB4MGM2ZmM0NjApLCBESUNPKDB4MGYyNjAyMjApLAorICAgIERJQ08oMHgxNzlkMDBjMCksIERJQ08oMHgxZTgyNDRlMCksIERJQ08oMHgyMzg2NzI0MCksIERJQ08oMHgyYmFmNzY4MCksCisgICAgRElDTygweDJmYTZkMjQwKSwgRElDTygweDM3ZTgzZDQwKSwgRElDTygweDNkMWNiZmMwKSwgRElDTygweDQzOWQwYTAwKSwKKyAgICBESUNPKDB4NDlmZDNlMDApLCBESUNPKDB4NTAwOTVlODApLCBESUNPKDB4NTU5ZjIwODApLCBESUNPKDB4NWI4ODlhMDApLAorICAgIERJQ08oMHgwNDJmNWMxMCksIERJQ08oMHgwNjFhYjNlOCksIERJQ08oMHgwZGQ4ZjE2MCksIERJQ08oMHgxMjZlMGI0MCksCisgICAgRElDTygweDE2ZWE5MDQwKSwgRElDTygweDIwYTMxNzAwKSwgRElDTygweDI0NjA4MTQwKSwgRElDTygweDJlYzY1MDgwKSwKKyAgICBESUNPKDB4MzM0ZTFhNDApLCBESUNPKDB4MzgyNTIxMDApLCBESUNPKDB4M2ZmZjA5MDApLCBESUNPKDB4NDY1MTlhODApLAorICAgIERJQ08oMHg0YzVlMGQ4MCksIERJQ08oMHg1MThjNTgwMCksIERJQ08oMHg1NmM1YjA4MCksIERJQ08oMHg1YzZlYmI4MCksCisgICAgRElDTygweDA0NWNlMjMwKSwgRElDTygweDA2NzU0N2IwKSwgRElDTygweDBhMjFjNjcwKSwgRElDTygweDE0MDhiODIwKSwKKyAgICBESUNPKDB4MWMwNTA1YzApLCBESUNPKDB4MWU4MDZjODApLCBESUNPKDB4MjZkM2M2NDApLCBESUNPKDB4MmNhNTczYzApLAorICAgIERJQ08oMHgzMDE0ZDg4MCksIERJQ08oMHgzNzcxMDhjMCksIERJQ08oMHgzZjM1Y2Y4MCksIERJQ08oMHg0MzU2NjEwMCksCisgICAgRElDTygweDRhNjEyOTAwKSwgRElDTygweDUxNjBjNzgwKSwgRElDTygweDU3ZDNlMzAwKSwgRElDTygweDVkNDE0YjgwKSwKKyAgICBESUNPKDB4MDRjOGVkYTgpLCBESUNPKDB4MDZhMzIzMjApLCBESUNPKDB4MDlhYjI1OTApLCBESUNPKDB4MTQyMzA3NjApLAorICAgIERJQ08oMHgyMGZiMjNjMCksIERJQ08oMHgyNGFhMjg4MCksIERJQ08oMHgyODVhMjU4MCksIERJQ08oMHgyYzQ2NGFjMCksCisgICAgRElDTygweDMwMDk4MjgwKSwgRElDTygweDM2MjMyNzgwKSwgRElDTygweDNlNDI4ZDQwKSwgRElDTygweDQyOTgyMjgwKSwKKyAgICBESUNPKDB4NDdlNjBkODApLCBESUNPKDB4NGUxZWNjMDApLCBESUNPKDB4NTVlYjkyMDApLCBESUNPKDB4NWM4MWVkMDApLAorICAgIERJQ08oMHgwNDBkMGI5MCksIERJQ08oMHgwNTg2YzVjMCksIERJQ08oMHgwYmVhMjE5MCksIERJQ08oMHgxZGM4ZGQ2MCksCisgICAgRElDTygweDIwYTA3YzQwKSwgRElDTygweDI0MzdlNTgwKSwgRElDTygweDI3Y2E1ZmMwKSwgRElDTygweDJkMDE3OTgwKSwKKyAgICBESUNPKDB4MzQxMDAwNDApLCBESUNPKDB4MzhkM2FmYzApLCBESUNPKDB4M2RhOWI3MDApLCBESUNPKDB4NDIwODI0ODApLAorICAgIERJQ08oMHg0NjU4NmYwMCksIERJQ08oMHg0ZTNjM2Q4MCksIERJQ08oMHg1NWUxZWUwMCksIERJQ08oMHg1YzkzOGQwMCksCisgICAgRElDTygweDAzZDE4YzY0KSwgRElDTygweDA1OTQxZDYwKSwgRElDTygweDExNmIyNTYwKSwgRElDTygweDE5Y2M4ODIwKSwKKyAgICBESUNPKDB4MWNlOTMwYzApLCBESUNPKDB4MjI2MjYwODApLCBESUNPKDB4MjZkMmNmODApLCBESUNPKDB4MmNlMmM5ODApLAorICAgIERJQ08oMHgzMDUzNjFjMCksIERJQ08oMHgzNGI2NTkwMCksIERJQ08oMHgzOWVlNWI0MCksIERJQ08oMHg0MTUwODQwMCksCisgICAgRElDTygweDQ3ZWUxZTgwKSwgRElDTygweDUwMzExMTgwKSwgRElDTygweDU2Y2IwYzAwKSwgRElDTygweDVkNTYxNjgwKSwKKyAgICBESUNPKDB4MGFmMjJjZjApLCBESUNPKDB4MTU0ZTFjNjApLCBESUNPKDB4MWI0NGZmNjApLCBESUNPKDB4MjA4N2QwYzApLAorICAgIERJQ08oMHgyNTJmNzM4MCksIERJQ08oMHgyOGZlNjZjMCksIERJQ08oMHgyZDBlOTgwMCksIERJQ08oMHgzMGY3ZWUwMCksCisgICAgRElDTygweDM2MDZkNjQwKSwgRElDTygweDNiYWMwYTQwKSwgRElDTygweDQxN2MzNzAwKSwgRElDTygweDQ3MGMyOTAwKSwKKyAgICBESUNPKDB4NGNjMjBkMDApLCBESUNPKDB4NTFlNTVlODApLCBESUNPKDB4NTc2YmMyMDApLCBESUNPKDB4NWNhYTcwODApLAorICAgIERJQ08oMHgwNDMzMTRlMCksIERJQ08oMHgwNWNiNDdiMCksIERJQ08oMHgwOTg1ZGYyMCksIERJQ08oMHgxODVhMjJjMCksCisgICAgRElDTygweDFlYTY4MzAwKSwgRElDTygweDIxYWY5MTAwKSwgRElDTygweDI1Y2RjYjQwKSwgRElDTygweDI5N2UwYTgwKSwKKyAgICBESUNPKDB4MzE0MmFjODApLCBESUNPKDB4MzU4YmIwNDApLCBESUNPKDB4M2ExMzQ1YzApLCBESUNPKDB4NDAyY2E1ODApLAorICAgIERJQ08oMHg0ZDk2NDc4MCksIERJQ08oMHg1NDIwY2Y4MCksIERJQ08oMHg1OTJhZGY4MCksIERJQ08oMHg1ZGZlN2E4MCksCisgICAgRElDTygweDA0YzcwZTIwKSwgRElDTygweDA2MmZkNmYwKSwgRElDTygweDExM2M2MGEwKSwgRElDTygweDE1OWU5OTAwKSwKKyAgICBESUNPKDB4MTkzM2U1YTApLCBESUNPKDB4MWRlY2ZmYTApLCBESUNPKDB4MjIzNzM0MDApLCBESUNPKDB4MjdlZDcxODApLAorICAgIERJQ08oMHgyYTgzNDljMCksIERJQ08oMHgyZjc4Zjk0MCksIERJQ08oMHgzZDVjODU0MCksIERJQ08oMHg0MjljMzUwMCksCisgICAgRElDTygweDQ5MzZlMzAwKSwgRElDTygweDRkZTA4ZDAwKSwgRElDTygweDUyNjI3NzAwKSwgRElDTygweDVkODIyNjgwKSwKKyAgICBESUNPKDB4MDQ5ODI3NzApLCBESUNPKDB4MDZhYjFhZDgpLCBESUNPKDB4MGNiYTEwOTApLCBESUNPKDB4MTA4MzlkNjApLAorICAgIERJQ08oMHgxYWNkNmE2MCksIERJQ08oMHgxZjU1NDU2MCksIERJQ08oMHgyNDMxYzFjMCksIERJQ08oMHgyOTVkYjgwMCksCisgICAgRElDTygweDJkMzc0YzAwKSwgRElDTygweDMxZjJmZDgwKSwgRElDTygweDNhMjAwNDgwKSwgRElDTygweDQxNmJlYTgwKSwKKyAgICBESUNPKDB4NGJhMWNlMDApLCBESUNPKDB4NTJhODgwMDApLCBESUNPKDB4NThkMGRiMDApLCBESUNPKDB4NWQzZTU4MDApLAorICAgIERJQ08oMHgwNTllMGU3MCksIERJQ08oMHgwODE2NmJhMCksIERJQ08oMHgwYzlkZjU5MCksIERJQ08oMHgxMWRlNWY0MCksCisgICAgRElDTygweDE0YzA4ZWEwKSwgRElDTygweDFjNWFkNmUwKSwgRElDTygweDI0MTc4ZWMwKSwgRElDTygweDI4ZWI3NjQwKSwKKyAgICBESUNPKDB4MzE2MjYyODApLCBESUNPKDB4MzVkNDMxMDApLCBESUNPKDB4M2NhZDEwYzApLCBESUNPKDB4NDIyZTE0ODApLAorICAgIERJQ08oMHg0OWJhZWUwMCksIERJQ08oMHg1M2RkNzE4MCksIERJQ08oMHg1YTE3YmI4MCksIERJQ08oMHg1ZTRiYjE4MCksCisgICAgRElDTygweDAzYzY0ZDAwKSwgRElDTygweDA1ZGUwYjI4KSwgRElDTygweDBjY2I4MmIwKSwgRElDTygweDE0NGIxYzAwKSwKKyAgICBESUNPKDB4MTllMzllYzApLCBESUNPKDB4MjFlNzk1YzApLCBESUNPKDB4MjgxNDkzODApLCBESUNPKDB4MmYxZmY3YzApLAorICAgIERJQ08oMHgzNWI3YzkwMCksIERJQ08oMHgzYzVmNDgwMCksIERJQ08oMHg0Mjc5OWMwMCksIERJQ08oMHg0ODc0NjE4MCksCisgICAgRElDTygweDRlOGY0ZDAwKSwgRElDTygweDUzYjk4MzgwKSwgRElDTygweDU4ZDYwMDAwKSwgRElDTygweDVkNzFhMDAwKSwKKyAgICBESUNPKDB4MDUwYTI5OTApLCBESUNPKDB4MDcxYmRiODgpLCBESUNPKDB4MGYwZDc2YjApLCBESUNPKDB4MTdhNzhkZTApLAorICAgIERJQ08oMHgxYWEyMDcyMCksIERJQ08oMHgyMmVlYTNjMCksIERJQ08oMHgyNzZlOTY0MCksIERJQ08oMHgyZWNjNGQ4MCksCisgICAgRElDTygweDMzNWY3OTAwKSwgRElDTygweDM3ODM4NjQwKSwgRElDTygweDNjODFiZTgwKSwgRElDTygweDQxYTRlNDAwKSwKKyAgICBESUNPKDB4NDc2ZmEyODApLCBESUNPKDB4NGYyYWI3ODApLCBESUNPKDB4NTZlODdiODApLCBESUNPKDB4NWNiZjI5MDApLAorICAgIERJQ08oMHgwNjcyNGM5OCksIERJQ08oMHgwOTlmNWUyMCksIERJQ08oMHgxMTliY2VjMCksIERJQ08oMHgxNmJlMTFhMCksCisgICAgRElDTygweDE5ZDUzYjAwKSwgRElDTygweDFlYjUxMzYwKSwgRElDTygweDIzMDJjMzAwKSwgRElDTygweDI5YzIwZDQwKSwKKyAgICBESUNPKDB4MzBkZDUyMDApLCBESUNPKDB4MzY1NzZhODApLCBESUNPKDB4M2UzZTc1NDApLCBESUNPKDB4NDVhYTlmODApLAorICAgIERJQ08oMHg0YzgzMzMwMCksIERJQ08oMHg1MWQ3ZWQwMCksIERJQ08oMHg1N2E0YTM4MCksIERJQ08oMHg1Y2NlOTEwMCksCisgICAgRElDTygweDA1NTg4YjYwKSwgRElDTygweDA3NWE3MGEwKSwgRElDTygweDBlZjk2ZTMwKSwgRElDTygweDEyYWMxMTAwKSwKKyAgICBESUNPKDB4MTY0OWRkZTApLCBESUNPKDB4MWE1MGNkYzApLCBESUNPKDB4MjI0ODYxNDApLCBESUNPKDB4MjdjN2M4MDApLAorICAgIERJQ08oMHgyZTA4YmQ4MCksIERJQ08oMHgzNTVkMjBjMCksIERJQ08oMHgzOTI1YTljMCksIERJQ08oMHg0NGUyYjQ4MCksCisgICAgRElDTygweDRmYTRlNjgwKSwgRElDTygweDU0NzBlMTgwKSwgRElDTygweDU5NWZlZTgwKSwgRElDTygweDVkNjcyZjAwKSwKKyAgICBESUNPKDB4MDRhNzgxYzApLCBESUNPKDB4MDYwYTg5ZjApLCBESUNPKDB4MTExZjU2YTApLCBESUNPKDB4MTZiOTNiZTApLAorICAgIERJQ08oMHgxOWNlOTEyMCksIERJQ08oMHgxZTFmZGE2MCksIERJQ08oMHgyMjU5Zjg4MCksIERJQ08oMHgyODVjYWQ4MCksCisgICAgRElDTygweDJiMTQwZWMwKSwgRElDTygweDJmMDY5OTQwKSwgRElDTygweDMzYmJjZTQwKSwgRElDTygweDNkZDNlNmMwKSwKKyAgICBESUNPKDB4NDkxNTQ4ODApLCBESUNPKDB4NTAwOGUzODApLCBESUNPKDB4NTY4YzQ2ODApLCBESUNPKDB4NWRhNDM3ODApLAorICAgIERJQ08oMHgwNTNhZGUzOCksIERJQ08oMHgwNzA4YTIwMCksIERJQ08oMHgwYmFkNDNkMCksIERJQ08oMHgxODYwY2Y0MCksCisgICAgRElDTygweDFjNDBkYmUwKSwgRElDTygweDFmNWEwMTIwKSwgRElDTygweDI1YmNmN2MwKSwgRElDTygweDI5ZTBjODQwKSwKKyAgICBESUNPKDB4MmYyMjM4NDApLCBESUNPKDB4MzkwYzg5NDApLCBESUNPKDB4M2UxZDczNDApLCBESUNPKDB4NDFjNmEwMDApLAorICAgIERJQ08oMHg0NmNjMjg4MCksIERJQ08oMHg1MDA2ZTI4MCksIERJQ08oMHg1NzQ0ZTE4MCksIERJQ08oMHg1ZDI5Nzc4MCksCisgICAgRElDTygweDA0MDFhM2YwKSwgRElDTygweDA3YmU0YTA4KSwgRElDTygweDE0ZjVmMWEwKSwgRElDTygweDFjMzQ4MDgwKSwKKyAgICBESUNPKDB4MjI2NzUzYzApLCBESUNPKDB4Mjc0YjFiODApLCBESUNPKDB4MmMxMWEzMDApLCBESUNPKDB4MzA3OThjMDApLAorICAgIERJQ08oMHgzNTU5OGM4MCksIERJQ08oMHgzYWFiMThjMCksIERJQ08oMHg0MDMwZjM4MCksIERJQ08oMHg0NWM3YjQwMCksCisgICAgRElDTygweDRiZTViZTAwKSwgRElDTygweDUxODBkYjgwKSwgRElDTygweDU3NjEzYjAwKSwgRElDTygweDVjZmZmZjgwKSwKKyAgICBESUNPKDB4MDg0YjMwOTApLCBESUNPKDB4MGZlNWIzYjApLCBESUNPKDB4MTZkZmQ0ODApLCBESUNPKDB4MWQwYWE3MDApLAorICAgIERJQ08oMHgyNGUwODE4MCksIERJQ08oMHgyYjQ5ODY0MCksIERJQ08oMHgzMDg4NWI4MCksIERJQ08oMHgzNGNjYzQ4MCksCisgICAgRElDTygweDM4ZmVkZWMwKSwgRElDTygweDNjZGY5YzQwKSwgRElDTygweDQxNzM3NjAwKSwgRElDTygweDQ2YWI5ODAwKSwKKyAgICBESUNPKDB4NGM3NzJlODApLCBESUNPKDB4NTFlNWI5ODApLCBESUNPKDB4NTdkZjk5MDApLCBESUNPKDB4NWQ1ZDcxODApLAorICAgIERJQ08oMHgwOTU0OWYwMCksIERJQ08oMHgxMmI4NGRhMCksIERJQ08oMHgxYWVhZjFjMCksIERJQ08oMHgyMTQyYTljMCksCisgICAgRElDTygweDI3NWM5YTAwKSwgRElDTygweDJjMjYwYzgwKSwgRElDTygweDMwMzhjNzAwKSwgRElDTygweDM0MDgxZDAwKSwKKyAgICBESUNPKDB4Mzg2MTJmNDApLCBESUNPKDB4M2QwYmY4YzApLCBESUNPKDB4NDI0NzNlMDApLCBESUNPKDB4NDdlY2FkODApLAorICAgIERJQ08oMHg0ZGIzNDM4MCksIERJQ08oMHg1MmYwYWIwMCksIERJQ08oMHg1ODRjYzk4MCksIERJQ08oMHg1ZDYyYWU4MCksCisgICAgRElDTygweDBhZWNhMWUwKSwgRElDTygweDE0MzU0NzAwKSwgRElDTygweDE5OTU1YmEwKSwgRElDTygweDFkZTMzMWUwKSwKKyAgICBESUNPKDB4MjFjZDYwYzApLCBESUNPKDB4MjVlNzJkODApLCBESUNPKDB4MmE0MDI4ODApLCBESUNPKDB4MmVmYTY0YzApLAorICAgIERJQ08oMHgzNDc4ZDljMCksIERJQ08oMHgzYTg4OWU4MCksIERJQ08oMHg0MDc0NGUwMCksIERJQ08oMHg0NjI2ZmU4MCksCisgICAgRElDTygweDRiZDgwOTAwKSwgRElDTygweDUxMTIwZjAwKSwgRElDTygweDU2ZDhkMjgwKSwgRElDTygweDVjNjU0NDAwKSwKKyAgICBESUNPKDB4MDdhNDBhZjgpLCBESUNPKDB4MGU2NWVjMjApLCBESUNPKDB4MTRjNzY3ODApLCBESUNPKDB4MTliMzVhNjApLAorICAgIERJQ08oMHgxZjc2YjdjMCksIERJQ08oMHgyNGY1MTJjMCksIERJQ08oMHgyYWU4OWYwMCksIERJQ08oMHgzMDM2YzNjMCksCisgICAgRElDTygweDM2MDQxODAwKSwgRElDTygweDNiYzRkZjgwKSwgRElDTygweDQxYWRiMDgwKSwgRElDTygweDQ3N2ZiYjgwKSwKKyAgICBESUNPKDB4NGQ1YWE0ODApLCBESUNPKDB4NTJjYjA2MDApLCBESUNPKDB4NTg2ZjcyODApLCBESUNPKDB4NWRiNDAxODApLAorICAgIERJQ08oMHgwMzk5NzYxMCksIERJQ08oMHgwNjE3NWRiMCksIERJQ08oMHgwZWE4YzljMCksIERJQ08oMHgxNDM5NzAwMCksCisgICAgRElDTygweDFiYTM0ZjYwKSwgRElDTygweDIyMzQ2NjgwKSwgRElDTygweDI4OTU4MDgwKSwgRElDTygweDJlYTc2ODQwKSwKKyAgICBESUNPKDB4MzNlZTY4YzApLCBESUNPKDB4MzllNzY5YzApLCBESUNPKDB4M2Y4NjI1MDApLCBESUNPKDB4NDU3OWIwODApLAorICAgIERJQ08oMHg0YjQ5Y2QwMCksIERJQ08oMHg1MTA3ZGE4MCksIERJQ08oMHg1NzNjZGUwMCksIERJQ08oMHg1ZDA5MDc4MCksCisgICAgRElDTygweDA0NmZjMmY4KSwgRElDTygweDA2NDBkYmMwKSwgRElDTygweDA5ZGE3YWIwKSwgRElDTygweDE3NGU0MjIwKSwKKyAgICBESUNPKDB4MjNkYzhjYzApLCBESUNPKDB4MjcwMTYyMDApLCBESUNPKDB4MmE5YTUyNDApLCBESUNPKDB4MmU2Y2M3YzApLAorICAgIERJQ08oMHgzMjFjZWQ0MCksIERJQ08oMHgzOGNhMmQwMCksIERJQ08oMHg0MTQ4MjY4MCksIERJQ08oMHg0NTFlMzcwMCksCisgICAgRElDTygweDRiOTBkODAwKSwgRElDTygweDUwZDBiYTgwKSwgRElDTygweDU1NjAyZTgwKSwgRElDTygweDVhNDY1MjAwKSwKKyAgICBESUNPKDB4MDNjYTdlMjgpLCBESUNPKDB4MDU3YzlkZDApLCBESUNPKDB4MGM5ZmYwZTApLCBESUNPKDB4MTk1N2ZhZTApLAorICAgIERJQ08oMHgxZmVmNzg2MCksIERJQ08oMHgyNzkyMGM4MCksIERJQ08oMHgyY2IyMzNjMCksIERJQ08oMHgzMjAxNWM4MCksCisgICAgRElDTygweDM2YWY0ZjQwKSwgRElDTygweDNhYzE4MjQwKSwgRElDTygweDNmOTNkOGMwKSwgRElDTygweDQ0ZWFlZjgwKSwKKyAgICBESUNPKDB4NGFhYjVkODApLCBESUNPKDB4NTA4NDBlODApLCBESUNPKDB4NTZjNGNjODApLCBESUNPKDB4NWNiMjY2MDApLAorICAgIERJQ08oMHgwMzhkNTNmOCksIERJQ08oMHgwNTBkMTExOCksIERJQ08oMHgwYmMxNDY5MCksIERJQ08oMHgxODkxODAwMCksCisgICAgRElDTygweDFlMmE2ZWUwKSwgRElDTygweDI0Y2MwYzAwKSwgRElDTygweDJhNzY3ZDQwKSwgRElDTygweDJlNjE0OTQwKSwKKyAgICBESUNPKDB4MzI4NTljNDApLCBESUNPKDB4Mzc3ZmQ5NDApLCBESUNPKDB4M2QzYTNlNDApLCBESUNPKDB4NDNlODEzODApLAorICAgIERJQ08oMHg0YWFhYzA4MCksIERJQ08oMHg1MDllNzgwMCksIERJQ08oMHg1NzAyM2EwMCksIERJQ08oMHg1ZDczM2MwMCksCisgICAgRElDTygweDA0Y2ZhNWUwKSwgRElDTygweDA2ZGVlYjM4KSwgRElDTygweDBhNTAxYzQwKSwgRElDTygweDEzNmQ4YWEwKSwKKyAgICBESUNPKDB4MTdmMTZlNDApLCBESUNPKDB4MWMxMTkzMDApLCBESUNPKDB4MjYxNTRiMDApLCBESUNPKDB4MmEwZGExMDApLAorICAgIERJQ08oMHgyZjU5MzVjMCksIERJQ08oMHgzNzEwOGQ0MCksIERJQ08oMHgzYWVmMDdjMCksIERJQ08oMHgzZmNjZjM0MCksCisgICAgRElDTygweDQ3ZTRhMDgwKSwgRElDTygweDRkOGRlMTAwKSwgRElDTygweDU0ZWI2OTgwKSwgRElDTygweDVjZGI1MzgwKX07CisKKy8qIEFDRUxQOiB0YWJsZSBmb3IgZGVjb2RpbmcKKyAgIGFkYXB0aXZlIGNvZGVib29rIGdhaW4gZ19wIChsZWZ0IGNvbHVtbikuIFNjYWxlZCBieSAyLjBmLgorICAgaW5ub3ZhdGl2ZSBjb2RlYm9vayBnYWluIGdfYyAocmlnaHQgY29sdW1uKS4gU2NhbGVkIGJ5IDE2LjBmLgorKi8KK2NvbnN0IEZJWFBfU0dMIHRfcXVhX2dhaW43YlsxMjggKiAyXSA9IHsKKyAgICAyMDQsICAgNDQxLCAgIDQ2NCwgICAxOTc3LCAgODY5LCAgIDEwNzcsICAxMDcyLCAgMzA2MiwgIDEyODEsICA0NzU5LCAgMTY0NywKKyAgICAxNTM5LCAgMTg0NSwgIDcwMjAsICAxODUzLCAgNjM0LCAgIDE5OTUsICAyMzM2LCAgMjM1MSwgIDE1NDAwLCAyNjYxLCAgMTE2NSwKKyAgICAyNzAyLCAgMzkwMCwgIDI3MTAsICAxMDEzMywgMzE5NSwgIDE3NTIsICAzNDk4LCAgMjYyNCwgIDM2NjMsICA4NDksICAgMzk4NCwKKyAgICA1Njk3LCAgNDIxNCwgIDMzOTksICA0NDE1LCAgMTMwNCwgIDQ2OTUsICAyMDU2LCAgNTM3NiwgIDQ1NTgsICA1Mzg2LCAgNjc2LAorICAgIDU1MTgsICAyMzU1NCwgNTU2NywgIDc3OTQsICA1NjQ0LCAgMzA2MSwgIDU2NzIsICAxNTEzLCAgNTk1NywgIDIzMzgsICA2NTMzLAorICAgIDEwNjAsICA2ODA0LCAgNTk5OCwgIDY4MjAsICAxNzY3LCAgNjkzNywgIDM4MzcsICA3Mjc3LCAgNDE0LCAgIDczMDUsICAyNjY1LAorICAgIDc0NjYsICAxMTMwNCwgNzk0MiwgIDc5NCwgICA4MDA3LCAgMTk4MiwgIDgwMDcsICAxMzY2LCAgODMyNiwgIDMxMDUsICA4MzM2LAorICAgIDQ4MTAsICA4NzA4LCAgNzk1NCwgIDg5ODksICAyMjc5LCAgOTAzMSwgIDEwNTUsICA5MjQ3LCAgMzU2OCwgIDkyODMsICAxNjMxLAorICAgIDk2NTQsICA2MzExLCAgOTgxMSwgIDI2MDUsICAxMDEyMCwgNjgzLCAgIDEwMTQzLCA0MTc5LCAgMTAyNDUsIDE5NDYsICAxMDMzNSwKKyAgICAxMjE4LCAgMTA0NjgsIDk5NjAsICAxMDY1MSwgMzAwMCwgIDEwOTUxLCAxNTMwLCAgMTA5NjksIDUyOTAsICAxMTIwMywgMjMwNSwKKyAgICAxMTMyNSwgMzU2MiwgIDExNzcxLCA2NzU0LCAgMTE4MzksIDE4NDksICAxMTk0MSwgNDQ5NSwgIDExOTU0LCAxMjk4LCAgMTE5NzUsCisgICAgMTUyMjMsIDExOTc3LCA4ODMsICAgMTE5ODYsIDI4NDIsICAxMjQzOCwgMjE0MSwgIDEyNTkzLCAzNjY1LCAgMTI2MzYsIDgzNjcsCisgICAgMTI2NTgsIDE1OTQsICAxMjg4NiwgMjYyOCwgIDEyOTg0LCA0OTQyLCAgMTMxNDYsIDExMTUsICAxMzIyNCwgNTI0LCAgIDEzMzQxLAorICAgIDMxNjMsICAxMzM5OSwgMTkyMywgIDEzNTQ5LCA1OTYxLCAgMTM2MDYsIDE0MDEsICAxMzY1NSwgMjM5OSwgIDEzNzgyLCAzOTA5LAorICAgIDEzODY4LCAxMDkyMywgMTQyMjYsIDE3MjMsICAxNDIzMiwgMjkzOSwgIDE0Mjc4LCA3NTI4LCAgMTQ0MzksIDQ1OTgsICAxNDQ1MSwKKyAgICA5ODQsICAgMTQ0NTgsIDIyNjUsICAxNDc5MiwgMTQwMywgIDE0ODE4LCAzNDQ1LCAgMTQ4OTksIDU3MDksICAxNTAxNywgMTUzNjIsCisgICAgMTUwNDgsIDE5NDYsICAxNTA2OSwgMjY1NSwgIDE1NDA1LCA5NTkxLCAgMTU0MDUsIDQwNzksICAxNTU3MCwgNzE4MywgIDE1Njg3LAorICAgIDIyODYsICAxNTY5MSwgMTYyNCwgIDE1Njk5LCAzMDY4LCAgMTU3NzIsIDUxNDksICAxNTg2OCwgMTIwNSwgIDE1OTcwLCA2OTYsCisgICAgMTYyNDksIDM1ODQsICAxNjMzOCwgMTkxNywgIDE2NDI0LCAyNTYwLCAgMTY0ODMsIDQ0MzgsICAxNjUyOSwgNjQxMCwgIDE2NjIwLAorICAgIDExOTY2LCAxNjgzOSwgODc4MCwgIDE3MDMwLCAzMDUwLCAgMTcwMzMsIDE4MzI1LCAxNzA5MiwgMTU2OCwgIDE3MTIzLCA1MTk3LAorICAgIDE3MzUxLCAyMTEzLCAgMTczNzQsIDk4MCwgICAxNzU2NiwgMjYyMTQsIDE3NjA5LCAzOTEyLCAgMTc2MzksIDMyNzY3LCAxODE1MSwKKyAgICA3ODcxLCAgMTgxOTcsIDI1MTYsICAxODIwMiwgNTY0OSwgIDE4Njc5LCAzMjgzLCAgMTg5MzAsIDEzNzAsICAxOTI3MSwgMTM3NTcsCisgICAgMTkzMTcsIDQxMjAsICAxOTQ2MCwgMTk3MywgIDE5NjU0LCAxMDAxOCwgMTk3NjQsIDY3OTIsICAxOTkxMiwgNTEzNSwgIDIwMDQwLAorICAgIDI4NDEsICAyMTIzNCwgMTk4MzN9OworCisvKiBBQ0VMUDogZmFjdG9yIHRhYmxlIGZvciBpbnRlcnBvbGF0aW9uIG9mIExQQyBjb2VmZnMgaW4gTFNQIGRvbWFpbiAqLworY29uc3QgRklYUF9TR0wgbHNwX2ludGVycG9sX2ZhY3RvclsyXVtOQl9TVUJGUl0gPSB7CisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMTI1ZiksIEZMMkZYQ09OU1RfU0dMKDAuMzc1ZiksIEZMMkZYQ09OU1RfU0dMKDAuNjI1ZiksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODc1Zil9LCAvKiBmb3IgY29yZUNvZGVyRnJhbWVMZW5ndGggPSAxMDI0ICovCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMTY2NjY3ZiksIEZMMkZYQ09OU1RfU0dMKDAuNWYpLCBGTDJGWENPTlNUX1NHTCgwLjgzMzMzM2YpLAorICAgICAweDB9IC8qIGZvciBjb3JlQ29kZXJGcmFtZUxlbmd0aCA9IDc2OCAgKi8KK307CisKKy8qIEZvciBiYXNzIHBvc3QgZmlsdGVyICovCisjaWZuZGVmIFRBQkxFX2ZpbHRfbHAKK2NvbnN0IEZJWFBfU0dMIGZka19kZWNfZmlsdF9scFsxICsgTF9GSUxUXSA9IHsKKyAgICBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDg4MjUwZiksIEZMMkZYQ09OU1RfU0dMX0ZJTFQoMC4wODY0MTBmKSwKKyAgICBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDgxMDc0ZiksIEZMMkZYQ09OU1RfU0dMX0ZJTFQoMC4wNzI3NjhmKSwKKyAgICBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDYyMjk0ZiksIEZMMkZYQ09OU1RfU0dMX0ZJTFQoMC4wNTA2MjNmKSwKKyAgICBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDM4Nzc0ZiksIEZMMkZYQ09OU1RfU0dMX0ZJTFQoMC4wMjc2OTJmKSwKKyAgICBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDE4MTMwZiksIEZMMkZYQ09OU1RfU0dMX0ZJTFQoMC4wMTA1NzhmKSwKKyAgICBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDA1MjIxZiksIEZMMkZYQ09OU1RfU0dMX0ZJTFQoMC4wMDE5NDZmKSwKKyAgICBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDAwMzg1Zil9OworI2VuZGlmCisKKy8qIEZBQyB3aW5kb3cgdGFibGVzIGZvciBjb3JlQ29kZXJGcmFtZUxlbmd0aCA9IDEwMjQgKi8KK2NvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1N5bnRoMTI4W10gPSB7CisgICAgV1RDKDB4N2ZmZjYyMTYpLCBXVEMoMHg3ZmZhNzJkMSksIFdUQygweDdmZjA5NDc4KSwgV1RDKDB4N2ZlMWM3NmIpLAorICAgIFdUQygweDdmY2UwYzNlKSwgV1RDKDB4N2ZiNTYzYjMpLCBXVEMoMHg3Zjk3Y2ViZCksIFdUQygweDdmNzU0ZTgwKSwKKyAgICBXVEMoMHg3ZjRkZTQ1MSksIFdUQygweDdmMjE5MWI0KSwgV1RDKDB4N2VmMDU4NjApLCBXVEMoMHg3ZWJhM2EzOSksCisgICAgV1RDKDB4N2U3ZjM5NTcpLCBXVEMoMHg3ZTNmNTdmZiksIFdUQygweDdkZmE5OGE4KSwgV1RDKDB4N2RiMGZkZjgpLAorICAgIFdUQygweDdkNjI4YWM2KSwgV1RDKDB4N2QwZjQyMTgpLCBXVEMoMHg3Y2I3MjcyNCksIFdUQygweDdjNWEzZDUwKSwKKyAgICBXVEMoMHg3YmY4ODgzMCksIFdUQygweDdiOTIwYjg5KSwgV1RDKDB4N2IyNmNiNGYpLCBXVEMoMHg3YWI2Y2JhNCksCisgICAgV1RDKDB4N2E0MjEwZDgpLCBXVEMoMHg3OWM4OWY2ZSksIFdUQygweDc5NGE3YzEyKSwgV1RDKDB4NzhjN2FiYTIpLAorICAgIFdUQygweDc4NDAzMzI5KSwgV1RDKDB4NzdiNDE3ZGYpLCBXVEMoMHg3NzIzNWYyZCksIFdUQygweDc2OGUwZWE2KSwKKyAgICBXVEMoMHg3NWY0MmMwYiksIFdUQygweDc1NTViZDRjKSwgV1RDKDB4NzRiMmM4ODQpLCBXVEMoMHg3NDBiNTNmYiksCisgICAgV1RDKDB4NzM1ZjY2MjYpLCBXVEMoMHg3MmFmMDVhNyksIFdUQygweDcxZmEzOTQ5KSwgV1RDKDB4NzE0MTA4MDUpLAorICAgIFdUQygweDcwODM3OGZmKSwgV1RDKDB4NmZjMTkzODUpLCBXVEMoMHg2ZWZiNWYxMiksIFdUQygweDZlMzBlMzRhKSwKKyAgICBXVEMoMHg2ZDYyMjdmYSksIFdUQygweDZjOGYzNTFjKSwgV1RDKDB4NmJiODEyZDEpLCBXVEMoMHg2YWRjYzk2NCksCisgICAgV1RDKDB4NjlmZDYxNGEpLCBXVEMoMHg2OTE5ZTMyMCksIFdUQygweDY4MzI1N2FiKSwgV1RDKDB4Njc0NmM3ZDgpLAorICAgIFdUQygweDY2NTczY2JiKSwgV1RDKDB4NjU2M2JmOTIpLCBXVEMoMHg2NDZjNTliZiksIFdUQygweDYzNzExNGNjKSwKKyAgICBXVEMoMHg2MjcxZmE2OSksIFdUQygweDYxNmYxNDZjKSwgV1RDKDB4NjA2ODZjY2YpLCBXVEMoMHg1ZjVlMGRiMyksCisgICAgV1RDKDB4NWU1MDAxNWQpLCBXVEMoMHg1ZDNlNTIzNyksIFdUQygweDVjMjkwYWNjKSwgV1RDKDB4NWIxMDM1Y2YpLAorICAgIFdUQygweDU5ZjNkZTEyKSwgV1RDKDB4NThkNDBlOGMpLCBXVEMoMHg1N2IwZDI1NiksIFdUQygweDU2OGEzNGE5KSwKKyAgICBXVEMoMHg1NTYwNDBlMiksIFdUQygweDU0MzMwMjdkKSwgV1RDKDB4NTMwMjg1MTgpLCBXVEMoMHg1MWNlZDQ2ZSksCisgICAgV1RDKDB4NTA5N2ZjNWUpLCBXVEMoMHg0ZjVlMDhlMyksIFdUQygweDRlMjEwNjE3KSwgV1RDKDB4NGNlMTAwMzQpLAorICAgIFdUQygweDRiOWUwMzkwKSwgV1RDKDB4NGE1ODFjOWUpLCBXVEMoMHg0OTBmNTdlZSksIFdUQygweDQ3YzNjMjJmKSwKKyAgICBXVEMoMHg0Njc1NjgyOCksIFdUQygweDQ1MjQ1NmJkKSwgV1RDKDB4NDNkMDlhZWQpLCBXVEMoMHg0MjdhNDFkMCksCisgICAgV1RDKDB4NDEyMTU4OWIpLCBXVEMoMHgzZmM1ZWM5OCksIFdUQygweDNlNjgwYjJjKSwgV1RDKDB4M2QwN2MxZDYpLAorICAgIFdUQygweDNiYTUxZTI5KSwgV1RDKDB4M2E0MDJkZDIpLCBXVEMoMHgzOGQ4ZmU5MyksIFdUQygweDM3NmY5ZTQ2KSwKKyAgICBXVEMoMHgzNjA0MWFkOSksIFdUQygweDM0OTY4MjUwKSwgV1RDKDB4MzMyNmUyYzMpLCBXVEMoMHgzMWI1NGE1ZSksCisgICAgV1RDKDB4MzA0MWM3NjEpLCBXVEMoMHgyZWNjNjgxZSksIFdUQygweDJkNTUzYWZjKSwgV1RDKDB4MmJkYzRlNmYpLAorICAgIFdUQygweDJhNjFiMTAxKSwgV1RDKDB4MjhlNTcxNGIpLCBXVEMoMHgyNzY3OWRmNCksIFdUQygweDI1ZTg0NWI2KSwKKyAgICBXVEMoMHgyNDY3Nzc1OCksIFdUQygweDIyZTU0MWFmKSwgV1RDKDB4MjE2MWIzYTApLCBXVEMoMHgxZmRjZGMxYiksCisgICAgV1RDKDB4MWU1NmNhMWUpLCBXVEMoMHgxY2NmOGNiMyksIFdUQygweDFiNDczMmVmKSwgV1RDKDB4MTliZGNiZjMpLAorICAgIFdUQygweDE4MzM2NmU5KSwgV1RDKDB4MTZhODEzMDUpLCBXVEMoMHgxNTFiZGY4NiksIFdUQygweDEzOGVkYmIxKSwKKyAgICBXVEMoMHgxMjAxMTZkNSksIFdUQygweDEwNzJhMDQ4KSwgV1RDKDB4MGVlMzg3NjYpLCBXVEMoMHgwZDUzZGI5MiksCisgICAgV1RDKDB4MGJjM2FjMzUpLCBXVEMoMHgwYTMzMDhiZCksIFdUQygweDA4YTIwMDlhKSwgV1RDKDB4MDcxMGEzNDUpLAorICAgIFdUQygweDA1N2YwMDM1KSwgV1RDKDB4MDNlZDI2ZTYpLCBXVEMoMHgwMjViMjZkNyksIFdUQygweDAwYzkwZjg4KSwKK307Citjb25zdCBGSVhQX1dUQiBGYWNXaW5kb3daaXIxMjhbXSA9IHsKKyAgICBXVEMoMHg3ZjM2ZjA3OCksIFdUQygweDdkYTRkOTI5KSwgV1RDKDB4N2MxMmQ5MWEpLCBXVEMoMHg3YTgwZmZjYiksCisgICAgV1RDKDB4NzhlZjVjYmIpLCBXVEMoMHg3NzVkZmY2NiksIFdUQygweDc1Y2NmNzQzKSwgV1RDKDB4NzQzYzUzY2IpLAorICAgIFdUQygweDcyYWMyNDZlKSwgV1RDKDB4NzExYzc4OWEpLCBXVEMoMHg2ZjhkNWZiOCksIFdUQygweDZkZmVlOTJiKSwKKyAgICBXVEMoMHg2YzcxMjQ0ZiksIFdUQygweDZhZTQyMDdhKSwgV1RDKDB4Njk1N2VjZmIpLCBXVEMoMHg2N2NjOTkxNyksCisgICAgV1RDKDB4NjY0MjM0MGQpLCBXVEMoMHg2NGI4Y2QxMSksIFdUQygweDYzMzA3MzRkKSwgV1RDKDB4NjFhOTM1ZTIpLAorICAgIFdUQygweDYwMjMyM2U1KSwgV1RDKDB4NWU5ZTRjNjApLCBXVEMoMHg1ZDFhYmU1MSksIFdUQygweDViOTg4OGE4KSwKKyAgICBXVEMoMHg1YTE3YmE0YSksIFdUQygweDU4OTg2MjBjKSwgV1RDKDB4NTcxYThlYjUpLCBXVEMoMHg1NTllNGVmZiksCisgICAgV1RDKDB4NTQyM2IxOTEpLCBXVEMoMHg1MmFhYzUwNCksIFdUQygweDUxMzM5N2UyKSwgV1RDKDB4NGZiZTM4OWYpLAorICAgIFdUQygweDRlNGFiNWEyKSwgV1RDKDB4NGNkOTFkM2QpLCBXVEMoMHg0YjY5N2RiMCksIFdUQygweDQ5ZmJlNTI3KSwKKyAgICBXVEMoMHg0ODkwNjFiYSksIFdUQygweDQ3MjcwMTZkKSwgV1RDKDB4NDViZmQyMmUpLCBXVEMoMHg0NDVhZTFkNyksCisgICAgV1RDKDB4NDJmODNlMmEpLCBXVEMoMHg0MTk3ZjRkNCksIFdUQygweDQwM2ExMzY4KSwgV1RDKDB4M2VkZWE3NjUpLAorICAgIFdUQygweDNkODViZTMwKSwgV1RDKDB4M2MyZjY1MTMpLCBXVEMoMHgzYWRiYTk0MyksIFdUQygweDM5OGE5N2Q4KSwKKyAgICBXVEMoMHgzODNjM2RkMSksIFdUQygweDM2ZjBhODEyKSwgV1RDKDB4MzVhN2UzNjIpLCBXVEMoMHgzNDYxZmM3MCksCisgICAgV1RDKDB4MzMxZWZmY2MpLCBXVEMoMHgzMWRlZjllOSksIFdUQygweDMwYTFmNzFkKSwgV1RDKDB4MmY2ODAzYTIpLAorICAgIFdUQygweDJlMzEyYjkyKSwgV1RDKDB4MmNmZDdhZTgpLCBXVEMoMHgyYmNjZmQ4MyksIFdUQygweDJhOWZiZjFlKSwKKyAgICBXVEMoMHgyOTc1Y2I1NyksIFdUQygweDI4NGYyZGFhKSwgV1RDKDB4MjcyYmYxNzQpLCBXVEMoMHgyNjBjMjFlZSksCisgICAgV1RDKDB4MjRlZmNhMzEpLCBXVEMoMHgyM2Q2ZjUzNCksIFdUQygweDIyYzFhZGM5KSwgV1RDKDB4MjFhZmZlYTMpLAorICAgIFdUQygweDIwYTFmMjRkKSwgV1RDKDB4MWY5NzkzMzEpLCBXVEMoMHgxZTkwZWI5NCksIFdUQygweDFkOGUwNTk3KSwKKyAgICBXVEMoMHgxYzhlZWIzNCksIFdUQygweDFiOTNhNjQxKSwgV1RDKDB4MWE5YzQwNmUpLCBXVEMoMHgxOWE4YzM0NSksCisgICAgV1RDKDB4MThiOTM4MjgpLCBXVEMoMHgxN2NkYTg1NSksIFdUQygweDE2ZTYxY2UwKSwgV1RDKDB4MTYwMjllYjYpLAorICAgIFdUQygweDE1MjMzNjljKSwgV1RDKDB4MTQ0N2VkMmYpLCBXVEMoMHgxMzcwY2FlNCksIFdUQygweDEyOWRkODA2KSwKKyAgICBXVEMoMHgxMWNmMWNiNiksIFdUQygweDExMDRhMGVlKSwgV1RDKDB4MTAzZTZjN2IpLCBXVEMoMHgwZjdjODcwMSksCisgICAgV1RDKDB4MGViZWY3ZmIpLCBXVEMoMHgwZTA1YzZiNyksIFdUQygweDBkNTBmYTU5KSwgV1RDKDB4MGNhMDk5ZGEpLAorICAgIFdUQygweDBiZjRhYzA1KSwgV1RDKDB4MGI0ZDM3N2MpLCBXVEMoMHgwYWFhNDJiNCksIFdUQygweDBhMGJkM2Y1KSwKKyAgICBXVEMoMHgwOTcxZjE1YSksIFdUQygweDA4ZGNhMGQzKSwgV1RDKDB4MDg0YmU4MjEpLCBXVEMoMHgwN2JmY2NkNyksCisgICAgV1RDKDB4MDczODU0NWUpLCBXVEMoMHgwNmI1ODNlZSksIFdUQygweDA2Mzc2MDkyKSwgV1RDKDB4MDViZGVmMjgpLAorICAgIFdUQygweDA1NDkzNDVjKSwgV1RDKDB4MDRkOTM0YjEpLCBXVEMoMHgwNDZkZjQ3NyksIFdUQygweDA0MDc3N2QwKSwKKyAgICBXVEMoMHgwM2E1YzJiMCksIFdUQygweDAzNDhkOGRjKSwgV1RDKDB4MDJmMGJkZTgpLCBXVEMoMHgwMjlkNzUzYSksCisgICAgV1RDKDB4MDI0ZjAyMDgpLCBXVEMoMHgwMjA1Njc1OCksIFdUQygweDAxYzBhODAxKSwgV1RDKDB4MDE4MGM2YTkpLAorICAgIFdUQygweDAxNDVjNWM3KSwgV1RDKDB4MDEwZmE3YTApLCBXVEMoMHgwMGRlNmU0YyksIFdUQygweDAwYjIxYmFmKSwKKyAgICBXVEMoMHgwMDhhYjE4MCksIFdUQygweDAwNjgzMTQzKSwgV1RDKDB4MDA0YTljNGQpLCBXVEMoMHgwMDMxZjNjMiksCisgICAgV1RDKDB4MDAxZTM4OTUpLCBXVEMoMHgwMDBmNmI4OCksIFdUQygweDAwMDU4ZDJmKSwgV1RDKDB4MDAwMDlkZWEpLAorfTsKK2NvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1N5bnRoNjRbXSA9IHsKKyAgICBXVEMoMHg3ZmZkODg1YSksIFdUQygweDdmZTljYmMwKSwgV1RDKDB4N2ZjMjU1OTYpLCBXVEMoMHg3Zjg3MmJmMyksCisgICAgV1RDKDB4N2YzODU3ZjYpLCBXVEMoMHg3ZWQ1ZTVjNiksIFdUQygweDdlNWZlNDkzKSwgV1RDKDB4N2RkNjY2OGYpLAorICAgIFdUQygweDdkMzk4MGVjKSwgV1RDKDB4N2M4OTRiZGUpLCBXVEMoMHg3YmM1ZTI5MCksIFdUQygweDdhZWY2MzIzKSwKKyAgICBXVEMoMHg3YTA1ZWVhZCksIFdUQygweDc5MDlhOTJkKSwgV1RDKDB4NzdmYWI5ODkpLCBXVEMoMHg3NmQ5NDk4OSksCisgICAgV1RDKDB4NzVhNTg1Y2YpLCBXVEMoMHg3NDVmOWRkMSksIFdUQygweDczMDdjM2QwKSwgV1RDKDB4NzE5ZTJjZDIpLAorICAgIFdUQygweDcwMjMxMDlhKSwgV1RDKDB4NmU5NmE5OWQpLCBXVEMoMHg2Y2Y5MzRmYyksIFdUQygweDZiNGFmMjc5KSwKKyAgICBXVEMoMHg2OThjMjQ2YyksIFdUQygweDY3YmQwZmJkKSwgV1RDKDB4NjVkZGZiZDMpLCBXVEMoMHg2M2VmMzI5MCksCisgICAgV1RDKDB4NjFmMTAwM2YpLCBXVEMoMHg1ZmUzYjM4ZCksIFdUQygweDVkYzc5ZDdjKSwgV1RDKDB4NWI5ZDExNTQpLAorICAgIFdUQygweDU5NjQ2NDk4KSwgV1RDKDB4NTcxZGVlZmEpLCBXVEMoMHg1NGNhMGE0YiksIFdUQygweDUyNjkxMjZlKSwKKyAgICBXVEMoMHg0ZmZiNjU0ZCksIFdUQygweDRkODE2MmM0KSwgV1RDKDB4NGFmYjZjOTgpLCBXVEMoMHg0ODY5ZTY2NSksCisgICAgV1RDKDB4NDVjZDM1OGYpLCBXVEMoMHg0MzI1YzEzNSksIFdUQygweDQwNzNmMjFkKSwgV1RDKDB4M2RiODMyYTYpLAorICAgIFdUQygweDNhZjJlZWI3KSwgV1RDKDB4MzgyNDkzYjApLCBXVEMoMHgzNTRkOTA1NyksIFdUQygweDMyNmU1NGM3KSwKKyAgICBXVEMoMHgyZjg3NTI2MiksIFdUQygweDJjOThmYmJhKSwgV1RDKDB4MjlhM2M0ODUpLCBXVEMoMHgyNmE4MjE4NiksCisgICAgV1RDKDB4MjNhNjg4N2YpLCBXVEMoMHgyMDlmNzAxYyksIFdUQygweDFkOTM0ZmU1KSwgV1RDKDB4MWE4MmEwMjYpLAorICAgIFdUQygweDE3NmRkOWRlKSwgV1RDKDB4MTQ1NTc2YjEpLCBXVEMoMHgxMTM5ZjBjZiksIFdUQygweDBlMWJjMmU0KSwKKyAgICBXVEMoMHgwYWZiNjgwNSksIFdUQygweDA3ZDk1YjllKSwgV1RDKDB4MDRiNjE5NWQpLCBXVEMoMHgwMTkyMWQyMCksCit9OworY29uc3QgRklYUF9XVEIgRmFjV2luZG93WmlyNjRbXSA9IHsKKyAgICBXVEMoMHg3ZTZkZTJlMCksIFdUQygweDdiNDllNmEzKSwgV1RDKDB4NzgyNmE0NjIpLCBXVEMoMHg3NTA0OTdmYiksCisgICAgV1RDKDB4NzFlNDNkMWMpLCBXVEMoMHg2ZWM2MGYzMSksIFdUQygweDZiYWE4OTRmKSwgV1RDKDB4Njg5MjI2MjIpLAorICAgIFdUQygweDY1N2Q1ZmRhKSwgV1RDKDB4NjI2Y2IwMWIpLCBXVEMoMHg1ZjYwOGZlNCksIFdUQygweDVjNTk3NzgxKSwKKyAgICBXVEMoMHg1OTU3ZGU3YSksIFdUQygweDU2NWMzYjdiKSwgV1RDKDB4NTM2NzA0NDYpLCBXVEMoMHg1MDc4YWQ5ZSksCisgICAgV1RDKDB4NGQ5MWFiMzkpLCBXVEMoMHg0YWIyNmZhOSksIFdUQygweDQ3ZGI2YzUwKSwgV1RDKDB4NDUwZDExNDkpLAorICAgIFdUQygweDQyNDdjZDVhKSwgV1RDKDB4M2Y4YzBkZTMpLCBXVEMoMHgzY2RhM2VjYiksIFdUQygweDNhMzJjYTcxKSwKKyAgICBXVEMoMHgzNzk2MTk5YiksIFdUQygweDM1MDQ5MzY4KSwgV1RDKDB4MzI3ZTlkM2MpLCBXVEMoMHgzMDA0OWFiMyksCisgICAgV1RDKDB4MmQ5NmVkOTIpLCBXVEMoMHgyYjM1ZjViNSksIFdUQygweDI4ZTIxMTA2KSwgV1RDKDB4MjY5YjliNjgpLAorICAgIFdUQygweDI0NjJlZWFjKSwgV1RDKDB4MjIzODYyODQpLCBXVEMoMHgyMDFjNGM3MyksIFdUQygweDFlMGVmZmMxKSwKKyAgICBXVEMoMHgxYzEwY2Q3MCksIFdUQygweDFhMjIwNDJkKSwgV1RDKDB4MTg0MmYwNDMpLCBXVEMoMHgxNjczZGI5NCksCisgICAgV1RDKDB4MTRiNTBkODcpLCBXVEMoMHgxMzA2Y2IwNCksIFdUQygweDExNjk1NjYzKSwgV1RDKDB4MGZkY2VmNjYpLAorICAgIFdUQygweDBlNjFkMzJlKSwgV1RDKDB4MGNmODNjMzApLCBXVEMoMHgwYmEwNjIyZiksIFdUQygweDBhNWE3YTMxKSwKKyAgICBXVEMoMHgwOTI2YjY3NyksIFdUQygweDA4MDU0Njc3KSwgV1RDKDB4MDZmNjU2ZDMpLCBXVEMoMHgwNWZhMTE1MyksCisgICAgV1RDKDB4MDUxMDljZGQpLCBXVEMoMHgwNDNhMWQ3MCksIFdUQygweDAzNzZiNDIyKSwgV1RDKDB4MDJjNjdmMTQpLAorICAgIFdUQygweDAyMjk5OTcxKSwgV1RDKDB4MDFhMDFiNmQpLCBXVEMoMHgwMTJhMWEzYSksIFdUQygweDAwYzdhODBhKSwKKyAgICBXVEMoMHgwMDc4ZDQwZCksIFdUQygweDAwM2RhYTZhKSwgV1RDKDB4MDAxNjM0NDApLCBXVEMoMHgwMDAyNzdhNiksCit9OworY29uc3QgRklYUF9XVEIgRmFjV2luZG93U3ludGgzMltdID0geworICAgIFdUQygweDdmZjYyMTgyKSwgV1RDKDB4N2ZhNzM2YjQpLCBXVEMoMHg3ZjA5OTFjNCksIFdUQygweDdlMWQ5M2VhKSwKKyAgICBXVEMoMHg3Y2UzY2ViMiksIFdUQygweDdiNWQwMzllKSwgV1RDKDB4Nzk4YTIzYjEpLCBXVEMoMHg3NzZjNGVkYiksCisgICAgV1RDKDB4NzUwNGQzNDUpLCBXVEMoMHg3MjU1MmM4NSksIFdUQygweDZmNWYwMmIyKSwgV1RDKDB4NmMyNDI5NjApLAorICAgIFdUQygweDY4YTY5ZTgxKSwgV1RDKDB4NjRlODg5MjYpLCBXVEMoMHg2MGVjMzgzMCksIFdUQygweDVjYjQyMGUwKSwKKyAgICBXVEMoMHg1ODQyZGQ1NCksIFdUQygweDUzOWIyYWYwKSwgV1RDKDB4NGViZmU4YTUpLCBXVEMoMHg0OWI0MTUzMyksCisgICAgV1RDKDB4NDQ3YWNkNTApLCBXVEMoMHgzZjE3NDliOCksIFdUQygweDM5OGNkZDMyKSwgV1RDKDB4MzNkZWYyODcpLAorICAgIFdUQygweDJlMTEwYTYyKSwgV1RDKDB4MjgyNmI5MjgpLCBXVEMoMHgyMjIzYTRjNSksIFdUQygweDFjMGI4MjZhKSwKKyAgICBXVEMoMHgxNWUyMTQ0NSksIFdUQygweDBmYWIyNzJiKSwgV1RDKDB4MDk2YTkwNDkpLCBXVEMoMHgwMzI0MmFiZiksCit9OworY29uc3QgRklYUF9XVEIgRmFjV2luZG93WmlyMzJbXSA9IHsKKyAgICBXVEMoMHg3Y2RiZDU0MSksIFdUQygweDc2OTU2ZmI3KSwgV1RDKDB4NzA1NGQ4ZDUpLCBXVEMoMHg2YTFkZWJiYiksCisgICAgV1RDKDB4NjNmNDdkOTYpLCBXVEMoMHg1ZGRjNWIzYiksIFdUQygweDU3ZDk0NmQ4KSwgV1RDKDB4NTFlZWY1OWUpLAorICAgIFdUQygweDRjMjEwZDc5KSwgV1RDKDB4NDY3MzIyY2UpLCBXVEMoMHg0MGU4YjY0OCksIFdUQygweDNiODUzMmIwKSwKKyAgICBXVEMoMHgzNjRiZWFjZCksIFdUQygweDMxNDAxNzViKSwgV1RDKDB4MmM2NGQ1MTApLCBXVEMoMHgyN2JkMjJhYyksCisgICAgV1RDKDB4MjM0YmRmMjApLCBXVEMoMHgxZjEzYzdkMCksIFdUQygweDFiMTc3NmRhKSwgV1RDKDB4MTc1OTYxN2YpLAorICAgIFdUQygweDEzZGJkNmEwKSwgV1RDKDB4MTBhMGZkNGUpLCBXVEMoMHgwZGFhZDM3YiksIFdUQygweDBhZmIyY2JiKSwKKyAgICBXVEMoMHgwODkzYjEyNSksIFdUQygweDA2NzVkYzRmKSwgV1RDKDB4MDRhMmZjNjIpLCBXVEMoMHgwMzFjMzE0ZSksCisgICAgV1RDKDB4MDFlMjZjMTYpLCBXVEMoMHgwMGY2NmUzYyksIFdUQygweDAwNThjOTRjKSwgV1RDKDB4MDAwOWRlN2UpLAorfTsKKworLyogRkFDIHdpbmRvdyB0YWJsZXMgZm9yIGNvcmVDb2RlckZyYW1lTGVuZ3RoID0gNzY4ICovCitjb25zdCBGSVhQX1dUQiBGYWNXaW5kb3dTeW50aDk2W10gPSB7CisgICAgV1RDKDB4N2ZmZWU3NDQpLCBXVEMoMHg3ZmY2MjE4MiksIFdUQygweDdmZTQ5Njk4KSwgV1RDKDB4N2ZjYTQ3YjkpLAorICAgIFdUQygweDdmYTczNmI0KSwgV1RDKDB4N2Y3YjY1ZWYpLCBXVEMoMHg3ZjQ2ZDg2YyksIFdUQygweDdmMDk5MWM0KSwKKyAgICBXVEMoMHg3ZWMzOTYyYSksIFdUQygweDdlNzRlYTZhKSwgV1RDKDB4N2UxZDkzZWEpLCBXVEMoMHg3ZGJkOThhNCksCisgICAgV1RDKDB4N2Q1NGZmMmUpLCBXVEMoMHg3Y2UzY2ViMiksIFdUQygweDdjNmEwZWYyKSwgV1RDKDB4N2JlN2M4NDcpLAorICAgIFdUQygweDdiNWQwMzllKSwgV1RDKDB4N2FjOWNhN2EpLCBXVEMoMHg3YTJlMjZmMiksIFdUQygweDc5OGEyM2IxKSwKKyAgICBXVEMoMHg3OGRkY2JmNSksIFdUQygweDc4MjkyYjhkKSwgV1RDKDB4Nzc2YzRlZGIpLCBXVEMoMHg3NmE3NDJkMSksCisgICAgV1RDKDB4NzVkYTE0ZWYpLCBXVEMoMHg3NTA0ZDM0NSksIFdUQygweDc0Mjc4YzcyKSwgV1RDKDB4NzM0MjRmYTApLAorICAgIFdUQygweDcyNTUyYzg1KSwgV1RDKDB4NzE2MDMzNjEpLCBXVEMoMHg3MDYzNzRmZiksIFdUQygweDZmNWYwMmIyKSwKKyAgICBXVEMoMHg2ZTUyZWU1MiksIFdUQygweDZkM2Y0YTQwKSwgV1RDKDB4NmMyNDI5NjApLCBXVEMoMHg2YjAxOWYxYSksCisgICAgV1RDKDB4NjlkN2JmNTcpLCBXVEMoMHg2OGE2OWU4MSksIFdUQygweDY3NmU1MTgzKSwgV1RDKDB4NjYyZWVkYzMpLAorICAgIFdUQygweDY0ZTg4OTI2KSwgV1RDKDB4NjM5YjNhMGIpLCBXVEMoMHg2MjQ3MTc0OSksIFdUQygweDYwZWMzODMwKSwKKyAgICBXVEMoMHg1ZjhhYjQ4NyksIFdUQygweDVlMjJhNDg3KSwgV1RDKDB4NWNiNDIwZTApLCBXVEMoMHg1YjNmNDJhZSksCisgICAgV1RDKDB4NTljNDIzODEpLCBXVEMoMHg1ODQyZGQ1NCksIFdUQygweDU2YmI4YTkwKSwgV1RDKDB4NTUyZTQ2MDUpLAorICAgIFdUQygweDUzOWIyYWYwKSwgV1RDKDB4NTIwMjU0ZWYpLCBXVEMoMHg1MDYzZTAwOCksIFdUQygweDRlYmZlOGE1KSwKKyAgICBXVEMoMHg0ZDE2OGI4YiksIFdUQygweDRiNjdlNWU0KSwgV1RDKDB4NDliNDE1MzMpLCBXVEMoMHg0N2ZiMzc1NyksCisgICAgV1RDKDB4NDYzZDZhODcpLCBXVEMoMHg0NDdhY2Q1MCksIFdUQygweDQyYjM3ZTk2KSwgV1RDKDB4NDBlNzlkOGMpLAorICAgIFdUQygweDNmMTc0OWI4KSwgV1RDKDB4M2Q0MmEyZWMpLCBXVEMoMHgzYjY5Yzk0NyksIFdUQygweDM5OGNkZDMyKSwKKyAgICBXVEMoMHgzN2FiZmY1ZCksIFdUQygweDM1Yzc1MGJjKSwgV1RDKDB4MzNkZWYyODcpLCBXVEMoMHgzMWYzMDYzOCksCisgICAgV1RDKDB4MzAwM2FkODUpLCBXVEMoMHgyZTExMGE2MiksIFdUQygweDJjMWIzZWZiKSwgV1RDKDB4MmEyMjZkYjUpLAorICAgIFdUQygweDI4MjZiOTI4KSwgV1RDKDB4MjYyODQ0MjIpLCBXVEMoMHgyNDI3MzE5ZCksIFdUQygweDIyMjNhNGM1KSwKKyAgICBXVEMoMHgyMDFkYzBlZiksIFdUQygweDFlMTVhOTlhKSwgV1RDKDB4MWMwYjgyNmEpLCBXVEMoMHgxOWZmNmYyYSksCisgICAgV1RDKDB4MTdmMTkzYzUpLCBXVEMoMHgxNWUyMTQ0NSksIFdUQygweDEzZDExNGQwKSwgV1RDKDB4MTFiZWI5YWEpLAorICAgIFdUQygweDBmYWIyNzJiKSwgV1RDKDB4MGQ5NjgxYzIpLCBXVEMoMHgwYjgwZWRmMSksIFdUQygweDA5NmE5MDQ5KSwKKyAgICBXVEMoMHgwNzUzOGQ2YiksIFdUQygweDA1M2MwYTAxKSwgV1RDKDB4MDMyNDJhYmYpLCBXVEMoMHgwMTBjMTQ2MCksCit9OworY29uc3QgRklYUF9XVEIgRmFjV2luZG93WmlyOTZbXSA9IHsKKyAgICBXVEMoMHg3ZWYzZWJhMCksIFdUQygweDdjZGJkNTQxKSwgV1RDKDB4N2FjM2Y1ZmYpLCBXVEMoMHg3OGFjNzI5NSksCisgICAgV1RDKDB4NzY5NTZmYjcpLCBXVEMoMHg3NDdmMTIwZiksIFdUQygweDcyNjk3ZTNlKSwgV1RDKDB4NzA1NGQ4ZDUpLAorICAgIFdUQygweDZlNDE0NjU2KSwgV1RDKDB4NmMyZWViMzApLCBXVEMoMHg2YTFkZWJiYiksIFdUQygweDY4MGU2YzNiKSwKKyAgICBXVEMoMHg2NjAwOTBkNiksIFdUQygweDYzZjQ3ZDk2KSwgV1RDKDB4NjFlYTU2NjYpLCBXVEMoMHg1ZmUyM2YxMSksCisgICAgV1RDKDB4NWRkYzViM2IpLCBXVEMoMHg1YmQ4Y2U2MyksIFdUQygweDU5ZDdiYmRlKSwgV1RDKDB4NTdkOTQ2ZDgpLAorICAgIFdUQygweDU1ZGQ5MjRiKSwgV1RDKDB4NTNlNGMxMDUpLCBXVEMoMHg1MWVlZjU5ZSksIFdUQygweDRmZmM1MjdiKSwKKyAgICBXVEMoMHg0ZTBjZjljOCksIFdUQygweDRjMjEwZDc5KSwgV1RDKDB4NGEzOGFmNDQpLCBXVEMoMHg0ODU0MDBhMyksCisgICAgV1RDKDB4NDY3MzIyY2UpLCBXVEMoMHg0NDk2MzZiOSksIFdUQygweDQyYmQ1ZDE0KSwgV1RDKDB4NDBlOGI2NDgpLAorICAgIFdUQygweDNmMTg2Mjc0KSwgV1RDKDB4M2Q0YzgxNmEpLCBXVEMoMHgzYjg1MzJiMCksIFdUQygweDM5YzI5NTc5KSwKKyAgICBXVEMoMHgzODA0YzhhOSksIFdUQygweDM2NGJlYWNkKSwgV1RDKDB4MzQ5ODFhMWMpLCBXVEMoMHgzMmU5NzQ3NSksCisgICAgV1RDKDB4MzE0MDE3NWIpLCBXVEMoMHgyZjljMWZmOCksIFdUQygweDJkZmRhYjExKSwgV1RDKDB4MmM2NGQ1MTApLAorICAgIFdUQygweDJhZDFiOWZiKSwgV1RDKDB4Mjk0NDc1NzApLCBXVEMoMHgyN2JkMjJhYyksIFdUQygweDI2M2JkYzdmKSwKKyAgICBXVEMoMHgyNGMwYmQ1MiksIFdUQygweDIzNGJkZjIwKSwgV1RDKDB4MjFkZDViNzkpLCBXVEMoMHgyMDc1NGI3OSksCisgICAgV1RDKDB4MWYxM2M3ZDApLCBXVEMoMHgxZGI4ZThiNyksIFdUQygweDFjNjRjNWY1KSwgV1RDKDB4MWIxNzc2ZGEpLAorICAgIFdUQygweDE5ZDExMjNkKSwgV1RDKDB4MTg5MWFlN2QpLCBXVEMoMHgxNzU5NjE3ZiksIFdUQygweDE2Mjg0MGE5KSwKKyAgICBXVEMoMHgxNGZlNjBlNiksIFdUQygweDEzZGJkNmEwKSwgV1RDKDB4MTJjMGI1YzApLCBXVEMoMHgxMWFkMTFhZSksCisgICAgV1RDKDB4MTBhMGZkNGUpLCBXVEMoMHgwZjljOGIwMSksIFdUQygweDBlOWZjYzlmKSwgV1RDKDB4MGRhYWQzN2IpLAorICAgIFdUQygweDBjYmRiMDYwKSwgV1RDKDB4MGJkODczOGUpLCBXVEMoMHgwYWZiMmNiYiksIFdUQygweDBhMjVlYjExKSwKKyAgICBXVEMoMHgwOTU4YmQyZiksIFdUQygweDA4OTNiMTI1KSwgV1RDKDB4MDdkNmQ0NzMpLCBXVEMoMHgwNzIyMzQwYiksCisgICAgV1RDKDB4MDY3NWRjNGYpLCBXVEMoMHgwNWQxZDkwZSksIFdUQygweDA1MzYzNTg2KSwgV1RDKDB4MDRhMmZjNjIpLAorICAgIFdUQygweDA0MTgzN2I5KSwgV1RDKDB4MDM5NWYxMGUpLCBXVEMoMHgwMzFjMzE0ZSksIFdUQygweDAyYWIwMGQyKSwKKyAgICBXVEMoMHgwMjQyNjc1YyksIFdUQygweDAxZTI2YzE2KSwgV1RDKDB4MDE4YjE1OTYpLCBXVEMoMHgwMTNjNjlkNiksCisgICAgV1RDKDB4MDBmNjZlM2MpLCBXVEMoMHgwMGI5Mjc5NCksIFdUQygweDAwODQ5YTExKSwgV1RDKDB4MDA1OGM5NGMpLAorICAgIFdUQygweDAwMzViODQ3KSwgV1RDKDB4MDAxYjY5NjgpLCBXVEMoMHgwMDA5ZGU3ZSksIFdUQygweDAwMDExOGJjKSwKK307Citjb25zdCBGSVhQX1dUQiBGYWNXaW5kb3dTeW50aDQ4W10gPSB7CisgICAgV1RDKDB4N2ZmYjlkMTUpLCBXVEMoMHg3ZmQ4ODc4ZSksIFdUQygweDdmOTI2NjFkKSwgV1RDKDB4N2YyOTRiZmQpLAorICAgIFdUQygweDdlOWQ1NWZjKSwgV1RDKDB4N2RlZWFhN2EpLCBXVEMoMHg3ZDFkNzk1OCksIFdUQygweDdjMjlmYmVlKSwKKyAgICBXVEMoMHg3YjE0NzRmZCksIFdUQygweDc5ZGQzMDk4KSwgV1RDKDB4Nzg4NDg0MTQpLCBXVEMoMHg3NzBhY2RlYyksCisgICAgV1RDKDB4NzU3MDc1YWMpLCBXVEMoMHg3M2I1ZWJkMSksIFdUQygweDcxZGJhOWFiKSwgV1RDKDB4NmZlMjMxM2MpLAorICAgIFdUQygweDZkY2EwZDE0KSwgV1RDKDB4NmI5M2QwMmUpLCBXVEMoMHg2OTQwMTVjMyksIFdUQygweDY2Y2Y4MTIwKSwKKyAgICBXVEMoMHg2NDQyYmQ3ZSksIFdUQygweDYxOWE3ZGNlKSwgV1RDKDB4NWVkNzdjOGEpLCBXVEMoMHg1YmZhN2I4MiksCisgICAgV1RDKDB4NTkwNDQzYTcpLCBXVEMoMHg1NWY1YTRkMiksIFdUQygweDUyY2Y3NThmKSwgV1RDKDB4NGY5MjkyZGMpLAorICAgIFdUQygweDRjM2ZkZmY0KSwgV1RDKDB4NDhkODQ2MDkpLCBXVEMoMHg0NTVjYjQwYyksIFdUQygweDQxY2UxZTY1KSwKKyAgICBXVEMoMHgzZTJkN2ViMSksIFdUQygweDNhN2JkMzgyKSwgV1RDKDB4MzZiYTIwMTQpLCBXVEMoMHgzMmU5NmMwOSksCisgICAgV1RDKDB4MmYwYWMzMjApLCBXVEMoMHgyYjFmMzRlYiksIFdUQygweDI3MjdkNDg2KSwgV1RDKDB4MjMyNWI4NDcpLAorICAgIFdUQygweDFmMTlmOTdiKSwgV1RDKDB4MWIwNWI0MGYpLCBXVEMoMHgxNmVhMDY0NiksIFdUQygweDEyYzgxMDZmKSwKKyAgICBXVEMoMHgwZWEwZjQ4YyksIFdUQygweDBhNzVkNjBlKSwgV1RDKDB4MDY0N2Q5N2MpLCBXVEMoMHgwMjE4MjQyNyksCit9OworY29uc3QgRklYUF9XVEIgRmFjV2luZG93WmlyNDhbXSA9IHsKKyAgICBXVEMoMHg3ZGU3ZGJkOSksIFdUQygweDc5YjgyNjg0KSwgV1RDKDB4NzU4YTI5ZjIpLCBXVEMoMHg3MTVmMGI3NCksCisgICAgV1RDKDB4NmQzN2VmOTEpLCBXVEMoMHg2OTE1ZjliYSksIFdUQygweDY0ZmE0YmYxKSwgV1RDKDB4NjBlNjA2ODUpLAorICAgIFdUQygweDVjZGE0N2I5KSwgV1RDKDB4NThkODJiN2EpLCBXVEMoMHg1NGUwY2IxNSksIFdUQygweDUwZjUzY2UwKSwKKyAgICBXVEMoMHg0ZDE2OTNmNyksIFdUQygweDQ5NDVkZmVjKSwgV1RDKDB4NDU4NDJjN2UpLCBXVEMoMHg0MWQyODE0ZiksCisgICAgV1RDKDB4M2UzMWUxOWIpLCBXVEMoMHgzYWEzNGJmNCksIFdUQygweDM3MjdiOWY3KSwgV1RDKDB4MzNjMDIwMGMpLAorICAgIFdUQygweDMwNmQ2ZDI0KSwgV1RDKDB4MmQzMDhhNzEpLCBXVEMoMHgyYTBhNWIyZSksIFdUQygweDI2ZmJiYzU5KSwKKyAgICBXVEMoMHgyNDA1ODQ3ZSksIFdUQygweDIxMjg4Mzc2KSwgV1RDKDB4MWU2NTgyMzIpLCBXVEMoMHgxYmJkNDI4MiksCisgICAgV1RDKDB4MTkzMDdlZTApLCBXVEMoMHgxNmJmZWEzZCksIFdUQygweDE0NmMyZmQyKSwgV1RDKDB4MTIzNWYyZWMpLAorICAgIFdUQygweDEwMWRjZWM0KSwgV1RDKDB4MGUyNDU2NTUpLCBXVEMoMHgwYzRhMTQyZiksIFdUQygweDBhOGY4YTU0KSwKKyAgICBXVEMoMHgwOGY1MzIxNCksIFdUQygweDA3N2I3YmVjKSwgV1RDKDB4MDYyMmNmNjgpLCBXVEMoMHgwNGViOGIwMyksCisgICAgV1RDKDB4MDNkNjA0MTIpLCBXVEMoMHgwMmUyODZhOCksIFdUQygweDAyMTE1NTg2KSwgV1RDKDB4MDE2MmFhMDQpLAorICAgIFdUQygweDAwZDZiNDAzKSwgV1RDKDB4MDA2ZDk5ZTMpLCBXVEMoMHgwMDI3Nzg3MiksIFdUQygweDAwMDQ2MmViKSwKK307CmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3VzYWNkZWNfcm9tLmggYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkNGNiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19yb20uaApAQCAtMCwwICsxLDE1NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTS4gSmFuZGVyCisKKyAgIERlc2NyaXB0aW9uOiByZTguaAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFVTQUNERUNfUk9NX0gKKyNkZWZpbmUgVVNBQ0RFQ19ST01fSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgIkZES19scGMuaCIKKworI2luY2x1ZGUgInVzYWNkZWNfY29uc3QuaCIKKworLyogUkU4IGxhdHRpY2UgcXVhbnRpc2VyIGNvbnN0YW50cyAqLworI2RlZmluZSBOQl9TUEhFUkUgMzIKKyNkZWZpbmUgTkJfTEVBREVSIDM3CisjZGVmaW5lIE5CX0xEU0lHTiAyMjYKKyNkZWZpbmUgTkJfTERRMyA5CisjZGVmaW5lIE5CX0xEUTQgMjgKKworI2RlZmluZSBMU0ZfU0NBTEUgMTMKKworLyogUkU4IGxhdHRpY2UgcXVhbnRpc2VyIHRhYmxlcyAqLworZXh0ZXJuIGNvbnN0IFVJTlQgZmRrX2RlY190YWJfZmFjdG9yaWFsWzhdOworZXh0ZXJuIGNvbnN0IFVDSEFSIGZka19kZWNfSWFbTkJfTEVBREVSXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBmZGtfZGVjX0RzW05CX0xEU0lHTl07CitleHRlcm4gY29uc3QgVVNIT1JUIGZka19kZWNfSXNbTkJfTERTSUdOXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBmZGtfZGVjX05zW10sIGZka19kZWNfQTNbXSwgZmRrX2RlY19BNFtdOworZXh0ZXJuIGNvbnN0IFVDSEFSIGZka19kZWNfRGFbXVs4XTsKK2V4dGVybiBjb25zdCBVU0hPUlQgZmRrX2RlY19JM1tdLCBmZGtfZGVjX0k0W107CisKKy8qIHRlbXAgZmxvYXQgdGFibGVzIGZvciBMUEMgZGVjb2RpbmcgKi8KK2V4dGVybiBjb25zdCBGSVhQX0xQQyBmZGtfZGVjX2xzZl9pbml0WzE2XTsKK2V4dGVybiBjb25zdCBGSVhQX0xQQyBmZGtfZGVjX2RpY29fbHNmX2Fic184YlsxNiAqIDI1Nl07CisKKy8qIEFDRUxQIHRhYmxlcyAqLworI2RlZmluZSBTRl9RVUFfR0FJTjdCIDQKK2V4dGVybiBjb25zdCBGSVhQX1NHTCB0X3F1YV9nYWluN2JbMTI4ICogMl07CitleHRlcm4gY29uc3QgRklYUF9TR0wgbHNwX2ludGVycG9sX2ZhY3RvclsyXVtOQl9TVUJGUl07CisKKy8qIEZvciBiYXNzIHBvc3QgZmlsdGVyICovCisjZGVmaW5lIExfRklMVCAxMiAvKiBEZWxheSBvZiB1cC1zYW1wbGluZyBmaWx0ZXIgICAgICAgICAgICAgICAgKi8KKworZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGZka19kZWNfZmlsdF9scFsxICsgTF9GSUxUXTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1N5bnRoMTI4WzEyOF07CitleHRlcm4gY29uc3QgRklYUF9XVEIgRmFjV2luZG93WmlyMTI4WzEyOF07CitleHRlcm4gY29uc3QgRklYUF9XVEIgRmFjV2luZG93U3ludGg2NFs2NF07CitleHRlcm4gY29uc3QgRklYUF9XVEIgRmFjV2luZG93WmlyNjRbNjRdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1N5bnRoMzJbMzJdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1ppcjMyWzMyXTsKK2V4dGVybiBjb25zdCBGSVhQX1dUQiBGYWNXaW5kb3dTeW50aDk2Wzk2XTsKK2V4dGVybiBjb25zdCBGSVhQX1dUQiBGYWNXaW5kb3daaXI5Nls5Nl07CitleHRlcm4gY29uc3QgRklYUF9XVEIgRmFjV2luZG93U3ludGg0OFs0OF07CitleHRlcm4gY29uc3QgRklYUF9XVEIgRmFjV2luZG93WmlyNDhbNDhdOworCisjZW5kaWYgLyogVVNBQ0RFQ19ST01fSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL2luY2x1ZGUvYWFjZW5jX2xpYi5oIGIvbGliQUFDZW5jL2luY2x1ZGUvYWFjZW5jX2xpYi5oCmluZGV4IDgyOGE5MTcuLjJlNDc1NzEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9pbmNsdWRlL2FhY2VuY19saWIuaAorKysgYi9saWJBQUNlbmMvaW5jbHVkZS9hYWNlbmNfbGliLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTIgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy00IEhFLUFBQyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBMb2h3YXNzZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKgogICogXGZpbGUgICBhYWNlbmNfbGliLmgKQEAgLTk0LDg3ICsxMDgsMTA2IEBACiAKIFxzZWN0aW9uIFNjb3BlCiAKLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBhbmQgdXNhZ2Ugb2YgdGhlIElTTy9NUEVHLTIvNCBBQUMgRW5jb2RlcgotbGlicmFyeSBkZXZlbG9wZWQgYnkgdGhlIEZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIChJSVMpLgorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGFuZCB1c2FnZSBvZiB0aGUgSVNPL01QRUctMi80CitBQUMgRW5jb2RlciBsaWJyYXJ5IGRldmVsb3BlZCBieSB0aGUgRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQKK0NpcmN1aXRzIChJSVMpLgogCi1UaGUgbGlicmFyeSBpbXBsZW1lbnRzIGVuY29kaW5nIG9uIHRoZSBiYXNpcyBvZiB0aGUgTVBFRy0yIGFuZCBNUEVHLTQgQUFDIExvdy1Db21wbGV4aXR5Ci1zdGFuZGFyZCwgYW5kIGRlcGVuZGluZyBvbiB0aGUgbGlicmFyeSdzIGNvbmZpZ3VyYXRpb24sIE1QRUctNCBIaWdoLUVmZmljaWVuY3kgQUFDIHYyIGFuZC9vciBBQUMtRUxEIHN0YW5kYXJkLgorVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBlbmNvZGluZyBvbiB0aGUgYmFzaXMgb2YgdGhlIE1QRUctMiBhbmQgTVBFRy00IEFBQworTG93LUNvbXBsZXhpdHkgc3RhbmRhcmQsIGFuZCBkZXBlbmRpbmcgb24gdGhlIGxpYnJhcnkncyBjb25maWd1cmF0aW9uLCBNUEVHLTQKK0hpZ2gtRWZmaWNpZW5jeSBBQUMgdjIgYW5kL29yIEFBQy1FTEQgc3RhbmRhcmQuCiAKLUFsbCByZWZlcmVuY2VzIHRvIFNCUiAoU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbikgYXJlIG9ubHkgYXBwbGljYWJsZSB0byBIRS1BQUMgb3IgQUFDLUVMRCB2ZXJzaW9ucwotb2YgdGhlIGxpYnJhcnkuIEFsbCByZWZlcmVuY2VzIHRvIFBTIChQYXJhbWV0cmljIFN0ZXJlbykgYXJlIG9ubHkgYXBwbGljYWJsZSB0byBIRS1BQUMgdjIKLXZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LgorQWxsIHJlZmVyZW5jZXMgdG8gU0JSIChTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvIEhFLUFBQworb3IgQUFDLUVMRCB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4gQWxsIHJlZmVyZW5jZXMgdG8gUFMgKFBhcmFtZXRyaWMgU3RlcmVvKSBhcmUKK29ubHkgYXBwbGljYWJsZSB0byBIRS1BQUMgdjIgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkuCiAKIFxzZWN0aW9uIGVuY0Jhc2ljcyBFbmNvZGVyIEJhc2ljcwogCi1UaGlzIGRvY3VtZW50IGNhbiBvbmx5IGdpdmUgYSByb3VnaCBvdmVydmlldyBhYm91dCB0aGUgSVNPL01QRUctMiBhbmQgSVNPL01QRUctNCBBQUMgYXVkaW8gY29kaW5nCi1zdGFuZGFyZC4gVG8gdW5kZXJzdGFuZCBhbGwgdGhlIHRlcm1zIGluIHRoaXMgZG9jdW1lbnQsIHlvdSBhcmUgZW5jb3VyYWdlZCB0byByZWFkIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzLgorVGhpcyBkb2N1bWVudCBjYW4gb25seSBnaXZlIGEgcm91Z2ggb3ZlcnZpZXcgYWJvdXQgdGhlIElTTy9NUEVHLTIgYW5kIElTTy9NUEVHLTQKK0FBQyBhdWRpbyBjb2Rpbmcgc3RhbmRhcmQuIFRvIHVuZGVyc3RhbmQgYWxsIHRoZSB0ZXJtcyBpbiB0aGlzIGRvY3VtZW50LCB5b3UgYXJlCitlbmNvdXJhZ2VkIHRvIHJlYWQgdGhlIGZvbGxvd2luZyBkb2N1bWVudHMuCiAKLS0gSVNPL0lFQyAxMzgxOC03IChNUEVHLTIgQUFDKSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mIE1QRUctMiBBQUMgYXVkaW8gYml0c3RyZWFtcy4KLS0gSVNPL0lFQyAxNDQ5Ni0zIChNUEVHLTQgQUFDLCBzdWJwYXJ0cyAxIGFuZCA0KSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mIE1QRUctNCBBQUMgYXVkaW8gYml0c3RyZWFtcy4KLS0gTHV0emt5LCBTY2h1bGxlciwgR2F5ZXIsIEtyJmF1bWw7bWVyLCBXYWJuaWssICJBIGd1aWRlbGluZSB0byBhdWRpbyBjb2RlYyBkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAorLSBJU08vSUVDIDEzODE4LTcgKE1QRUctMiBBQUMpLCB3aGljaCBkZWZpbmVzIHRoZSBzeW50YXggb2YgTVBFRy0yIEFBQyBhdWRpbworYml0c3RyZWFtcy4KKy0gSVNPL0lFQyAxNDQ5Ni0zIChNUEVHLTQgQUFDLCBzdWJwYXJ0cyAxIGFuZCA0KSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mCitNUEVHLTQgQUFDIGF1ZGlvIGJpdHN0cmVhbXMuCistIEx1dHpreSwgU2NodWxsZXIsIEdheWVyLCBLciZhdW1sO21lciwgV2FibmlrLCAiQSBndWlkZWxpbmUgdG8gYXVkaW8gY29kZWMKK2RlbGF5IiwgMTE2dGggQUVTIENvbnZlbnRpb24sIE1heSA4LCAyMDA0CiAKLU1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nIGlzIGJhc2VkIG9uIGEgdGltZS10by1mcmVxdWVuY3kgbWFwcGluZyBvZiB0aGUgc2lnbmFsLiBUaGUgc2lnbmFsIGlzCi1wYXJ0aXRpb25lZCBpbnRvIG92ZXJsYXBwaW5nIHBvcnRpb25zIGFuZCB0cmFuc2Zvcm1lZCBpbnRvIGZyZXF1ZW5jeSBkb21haW4uIFRoZSBzcGVjdHJhbCBjb21wb25lbnRzCi1hcmUgdGhlbiBxdWFudGl6ZWQgYW5kIGNvZGVkLiBcbgotQW4gTVBFRy0yIG9yIE1QRUctNCBBQUMgYXVkaW8gYml0c3RyZWFtIGlzIGNvbXBvc2VkIG9mIGZyYW1lcy4gQ29udHJhcnkgdG8gTVBFRy0xLzIgTGF5ZXItMyAobXAzKSwgdGhlCi1sZW5ndGggb2YgaW5kaXZpZHVhbCBmcmFtZXMgaXMgbm90IHJlc3RyaWN0ZWQgdG8gYSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMsIGJ1dCBjYW4gdGFrZSBvbiBhbnkgbGVuZ3RoCi1iZXR3ZWVuIDEgYW5kIDc2OCBieXRlcy4KK01QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nIGlzIGJhc2VkIG9uIGEgdGltZS10by1mcmVxdWVuY3kgbWFwcGluZyBvZiB0aGUKK3NpZ25hbC4gVGhlIHNpZ25hbCBpcyBwYXJ0aXRpb25lZCBpbnRvIG92ZXJsYXBwaW5nIHBvcnRpb25zIGFuZCB0cmFuc2Zvcm1lZCBpbnRvCitmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwgY29tcG9uZW50cyBhcmUgdGhlbiBxdWFudGl6ZWQgYW5kIGNvZGVkLiBcbiBBbgorTVBFRy0yIG9yIE1QRUctNCBBQUMgYXVkaW8gYml0c3RyZWFtIGlzIGNvbXBvc2VkIG9mIGZyYW1lcy4gQ29udHJhcnkgdG8gTVBFRy0xLzIKK0xheWVyLTMgKG1wMyksIHRoZSBsZW5ndGggb2YgaW5kaXZpZHVhbCBmcmFtZXMgaXMgbm90IHJlc3RyaWN0ZWQgdG8gYSBmaXhlZAorbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24gYW55IGxlbmd0aCBiZXR3ZWVuIDEgYW5kIDc2OCBieXRlcy4KIAogCiBccGFnZSBMSUJVU0UgTGlicmFyeSBVc2FnZQogCiBcc2VjdGlvbiBJbnRlcmZhY2VEZXNjcmlwdGlvbiBBUEkgRmlsZXMKIAotQWxsIEFQSSBoZWFkZXIgZmlsZXMgYXJlIGxvY2F0ZWQgaW4gdGhlIGZvbGRlciAvaW5jbHVkZSBvZiB0aGUgcmVsZWFzZSBwYWNrYWdlLiBBbGwgaGVhZGVyIGZpbGVzCi1hcmUgcHJvdmlkZWQgZm9yIHVzYWdlIGluIEMvQysrIHByb2dyYW1zLiBUaGUgQUFDIGVuY29kZXIgbGlicmFyeSBBUEkgZnVuY3Rpb25zIGFyZSBsb2NhdGVkIGF0Ci1hYWNlbmNfbGliLmguCitBbGwgQVBJIGhlYWRlciBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgZm9sZGVyIC9pbmNsdWRlIG9mIHRoZSByZWxlYXNlIHBhY2thZ2UuCitBbGwgaGVhZGVyIGZpbGVzIGFyZSBwcm92aWRlZCBmb3IgdXNhZ2UgaW4gQy9DKysgcHJvZ3JhbXMuIFRoZSBBQUMgZW5jb2RlcgorbGlicmFyeSBBUEkgZnVuY3Rpb25zIGFyZSBsb2NhdGVkIGluIGFhY2VuY19saWIuaC4KIAotSW4gYmluYXJ5IHJlbGVhc2VzIHRoZSBlbmNvZGVyIGNvcmUgcmVzaWRlcyBpbiBzdGF0aWNhbGx5IGxpbmthYmxlIGxpYnJhcmllcyBjYWxsZWQgZm9yIGV4YW1wbGUKLWxpYkFBQ2VuYy5hL2xpYkZESy5hIChMSU5VWCkgb3IgRkRLX2Zhc3RhYWNsaWIubGliIChNUyBWaXN1YWwgQysrKSBmb3IgdGhlIHBsYWluIEFBQy1MQyBjb3JlIGVuY29kZXIKLWFuZCBsaWJTQlJlbmMuYSAoTElOVVgpIG9yIEZES19zYnJFbmNMaWIubGliIChNUyBWaXN1YWwgQysrKSBmb3IgdGhlIFNCUiAoU3BlY3RyYWwgQmFuZAotUmVwbGljYXRpb24pIGFuZCBQUyAoUGFyYW1ldHJpYyBTdGVyZW8pIG1vZHVsZXMuCitJbiBiaW5hcnkgcmVsZWFzZXMgdGhlIGVuY29kZXIgY29yZSByZXNpZGVzIGluIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyaWVzCitjYWxsZWQgZm9yIGV4YW1wbGUgbGliQUFDZW5jLmEvbGliRkRLLmEgKExJTlVYKSBvciBGREtfZmFzdGFhY2xpYi5saWIgKE1TIFZpc3VhbAorQysrKSBmb3IgdGhlIHBsYWluIEFBQy1MQyBjb3JlIGVuY29kZXIgYW5kIGxpYlNCUmVuYy5hIChMSU5VWCkgb3IKK0ZES19zYnJFbmNMaWIubGliIChNUyBWaXN1YWwgQysrKSBmb3IgdGhlIFNCUiAoU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbikgYW5kIFBTCisoUGFyYW1ldHJpYyBTdGVyZW8pIG1vZHVsZXMuCiAKIFxzZWN0aW9uIENhbGxpbmdTZXF1ZW5jZSBDYWxsaW5nIFNlcXVlbmNlCiAKLUZvciBlbmNvZGluZyBvZiBJU08vTVBFRy0yLzQgQUFDIGJpdHN0cmVhbXMgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBpcyBtYW5kYXRvcnkuIElucHV0IHJlYWQgYW5kIG91dHB1dAotd3JpdGUgZnVuY3Rpb25zIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgb3BlbiBhbmQgY2xvc2UgZnVuY3Rpb25zIGFyZSBsZWZ0IG91dCwgc2luY2UgdGhleSBtYXkgYmUKLWltcGxlbWVudGVkIGRpZmZlcmVudGx5IGFjY29yZGluZyB0byB0aGUgdXNlcidzIHNwZWNpZmljIHJlcXVpcmVtZW50cy4gVGhlIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gaW4KLW1haW4uY3BwIHVzZXMgZmlsZS1iYXNlZCBpbnB1dC9vdXRwdXQuCitGb3IgZW5jb2Rpbmcgb2YgSVNPL01QRUctMi80IEFBQyBiaXRzdHJlYW1zIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgaXMgbWFuZGF0b3J5LgorSW5wdXQgcmVhZCBhbmQgb3V0cHV0IHdyaXRlIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIG9wZW4gYW5kCitjbG9zZSBmdW5jdGlvbnMgYXJlIGxlZnQgb3V0LCBzaW5jZSB0aGV5IG1heSBiZSBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseQorYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3Mgc3BlY2lmaWMgcmVxdWlyZW1lbnRzLiBUaGUgZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiB1c2VzCitmaWxlLWJhc2VkIGlucHV0L291dHB1dC4KIAotLSMgQ2FsbCBhYWNFbmNPcGVuKCkgdG8gYWxsb2NhdGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIHJlcXVpcmVkIFxyZWYgZW5jT3BlbiAiY29uZmlndXJhdGlvbiIuXG4KLVxkb250aW5jbHVkZSBtYWluLmNwcAotXHNraXBsaW5lIGhBYWNFbmNvZGVyID0KLVxza2lwbGluZSBhYWNFbmNPcGVuCi0tIyBDYWxsIGFhY0VuY29kZXJfU2V0UGFyYW0oKSBmb3IgZWFjaCBwYXJhbWV0ZXIgdG8gYmUgc2V0LiBBT1QsIHNhbXBsaW5ncmF0ZSwgY2hhbm5lbE1vZGUsIGJpdHJhdGUgYW5kIHRyYW5zcG9ydCB0eXBlIGFyZSBccmVmIGVuY1BhcmFtcyAibWFuZGF0b3J5Ii4KLVxjb2RlCi0gICAgRXJyb3JTdGF0dXMgPSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBwYXJhbWV0ZXIsIHZhbHVlKTsKKy0jIENhbGwgYWFjRW5jT3BlbigpIHRvIGFsbG9jYXRlIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCByZXF1aXJlZCBccmVmIGVuY09wZW4KKyJjb25maWd1cmF0aW9uIi4gXGNvZGUgSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIgPSBOVUxMOyBpZiAoIChFcnJvclN0YXR1cyA9CithYWNFbmNPcGVuKCZoQWFjRW5jb2RlciwwLDApKSAhPSBBQUNFTkNfT0sgKSB7IFxlbmRjb2RlCistIyBDYWxsIGFhY0VuY29kZXJfU2V0UGFyYW0oKSBmb3IgZWFjaCBwYXJhbWV0ZXIgdG8gYmUgc2V0LiBBT1QsIHNhbXBsaW5ncmF0ZSwKK2NoYW5uZWxNb2RlLCBiaXRyYXRlIGFuZCB0cmFuc3BvcnQgdHlwZSBhcmUgXHJlZiBlbmNQYXJhbXMgIm1hbmRhdG9yeSIuIFxjb2RlCitFcnJvclN0YXR1cyA9IGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIHBhcmFtZXRlciwgdmFsdWUpOwogXGVuZGNvZGUKLS0jIENhbGwgYWFjRW5jRW5jb2RlKCkgd2l0aCBOVUxMIHBhcmFtZXRlcnMgdG8gXHJlZiBlbmNSZWNvbmYgImluaXRpYWxpemUiIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBwcmVzZW50IHBhcmFtZXRlciBzZXQuCi1cc2tpcGxpbmUgYWFjRW5jRW5jb2RlCi0tIyBDYWxsIGFhY0VuY0luZm8oKSB0byByZXRyaWV2ZSBhIGNvbmZpZ3VyYXRpb24gZGF0YSBibG9jayB0byBiZSB0cmFuc21pdHRlZCBvdXQgb2YgYmFuZC4gVGhpcyBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIFJGQzM2NDAgb3IgUkZDMzAxNiBsaWtlIHRyYW5zcG9ydC4KLVxkb250aW5jbHVkZSBtYWluLmNwcAotXHNraXBsaW5lIGVuY0luZm8KLVxza2lwbGluZSBhYWNFbmNJbmZvCistIyBDYWxsIGFhY0VuY0VuY29kZSgpIHdpdGggTlVMTCBwYXJhbWV0ZXJzIHRvIFxyZWYgZW5jUmVjb25mICJpbml0aWFsaXplIgorZW5jb2RlciBpbnN0YW5jZSB3aXRoIHByZXNlbnQgcGFyYW1ldGVyIHNldC4gXGNvZGUgRXJyb3JTdGF0dXMgPQorYWFjRW5jRW5jb2RlKGhBYWNFbmNvZGVyLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsgXGVuZGNvZGUKKy0jIENhbGwgYWFjRW5jSW5mbygpIHRvIHJldHJpZXZlIGEgY29uZmlndXJhdGlvbiBkYXRhIGJsb2NrIHRvIGJlIHRyYW5zbWl0dGVkCitvdXQgb2YgYmFuZC4gVGhpcyBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIFJGQzM2NDAgb3IgUkZDMzAxNiBsaWtlIHRyYW5zcG9ydC4KK1xjb2RlCitBQUNFTkNfSW5mb1N0cnVjdCBlbmNJbmZvOworYWFjRW5jSW5mbyhoQWFjRW5jb2RlciwgJmVuY0luZm8pOworXGVuZGNvZGUKIC0jIEVuY29kZSBpbnB1dCBhdWRpbyBkYXRhIGluIGxvb3AuCi1cc2tpcCBFbmNvZGUgYXMgbG9uZyBhcwotXHNraXBsaW5lIGRvCi1cdW50aWwgewotRmVlZCBccmVmIGZlZWRJbkJ1ZiAiaW5wdXQgYnVmZmVyIiB3aXRoIG5ldyBhdWRpbyBkYXRhIGFuZCBwcm92aWRlIGlucHV0L291dHB1dCBccmVmIGJ1ZkRlcyAiYXJndW1lbnRzIiB0byBhYWNFbmNFbmNvZGUoKS4KLVxza2lwbGluZSBhYWNFbmNFbmNvZGUKLVx1bnRpbCA7Ci1Xcml0ZSBccmVmIHdyaXRlT3V0RGF0YSAib3V0cHV0IGRhdGEiIHRvIGZpbGUgb3IgYXVkaW8gZGV2aWNlLiBcc2tpcGxpbmUgd2hpbGUKK1xjb2RlCitkbworeworXGVuZGNvZGUKK0ZlZWQgXHJlZiBmZWVkSW5CdWYgImlucHV0IGJ1ZmZlciIgd2l0aCBuZXcgYXVkaW8gZGF0YSBhbmQgcHJvdmlkZSBpbnB1dC9vdXRwdXQKK1xyZWYgYnVmRGVzICJhcmd1bWVudHMiIHRvIGFhY0VuY0VuY29kZSgpLiBcY29kZSBFcnJvclN0YXR1cyA9CithYWNFbmNFbmNvZGUoaEFhY0VuY29kZXIsICZpbkJ1ZkRlc2MsICZvdXRCdWZEZXNjLCAmaW5hcmdzLCAmb3V0YXJncyk7IFxlbmRjb2RlCitXcml0ZSBccmVmIHdyaXRlT3V0RGF0YSAib3V0cHV0IGRhdGEiIHRvIGZpbGUgb3IgYXVkaW8gZGV2aWNlLgorXGNvZGUKK30gd2hpbGUgKEVycm9yU3RhdHVzPT1BQUNFTkNfT0spOworXGVuZGNvZGUKIC0jIENhbGwgYWFjRW5jQ2xvc2UoKSBhbmQgZGVzdHJveSBlbmNvZGVyIGluc3RhbmNlLgotXHNraXBsaW5lIGFhY0VuY0Nsb3NlCitcY29kZQorYWFjRW5jQ2xvc2UoJmhBYWNFbmNvZGVyKTsKK1xlbmRjb2RlCisKIAogXHNlY3Rpb24gZW5jT3BlbiBFbmNvZGVyIEluc3RhbmNlIEFsbG9jYXRpb24KIAotVGhlIGFzc2lnbm1lbnQgb2YgdGhlIGFhY0VuY09wZW4oKSBmdW5jdGlvbiBpcyB2ZXJ5IGZsZXhpYmxlIGFuZCBjYW4gYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheS4KLS0gSWYgdGhlIGFtb3VudCBvZiBtZW1vcnkgY29uc3VtcHRpb24gaXMgbm90IGFuIGlzc3VlLCB0aGUgZW5jb2RlciBpbnN0YW5jZSBjYW4gYmUgYWxsb2NhdGVkCi1mb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBvc3NpYmxlIGF1ZGlvIGNoYW5uZWxzIChmb3IgZXhhbXBsZSA2IG9yIDgpIHdpdGggdGhlIGZ1bGwgZnVuY3Rpb25hbCByYW5nZSBzdXBwb3J0ZWQgYnkgdGhlIGxpYnJhcnkuCi1UaGlzIGlzIHRoZSBkZWZhdWx0IG9wZW4gcHJvY2VkdXJlIGZvciB0aGUgQUFDIGVuY29kZXIgaWYgbWVtb3J5IGNvbnN1bXB0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgbWluaW1pemVkLgotXGNvZGUgYWFjRW5jT3BlbigmaEFhY0VuY29kZXIsMCwwKSBcZW5kY29kZQotLSBJZiB0aGUgcmVxdWlyZWQgTVBFRy00IEFPVHMgZG8gbm90IGNhbGwgZm9yIHRoZSBmdWxsIGZ1bmN0aW9uYWwgcmFuZ2Ugb2YgdGhlIGxpYnJhcnksIGVuY29kZXIgbW9kdWxlcyBjYW4gYmUgYWxsb2NhdGVkIHNlbGVjdGl2ZWx5LgotXHZlcmJhdGltCitUaGUgYXNzaWdubWVudCBvZiB0aGUgYWFjRW5jT3BlbigpIGZ1bmN0aW9uIGlzIHZlcnkgZmxleGlibGUgYW5kIGNhbiBiZSB1c2VkIGluCit0aGUgZm9sbG93aW5nIHdheS4KKy0gSWYgdGhlIGFtb3VudCBvZiBtZW1vcnkgY29uc3VtcHRpb24gaXMgbm90IGFuIGlzc3VlLCB0aGUgZW5jb2RlciBpbnN0YW5jZSBjYW4KK2JlIGFsbG9jYXRlZCBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBvc3NpYmxlIGF1ZGlvIGNoYW5uZWxzIChmb3IgZXhhbXBsZSA2IG9yCis4KSB3aXRoIHRoZSBmdWxsIGZ1bmN0aW9uYWwgcmFuZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LiBUaGlzIGlzIHRoZSBkZWZhdWx0CitvcGVuIHByb2NlZHVyZSBmb3IgdGhlIEFBQyBlbmNvZGVyIGlmIG1lbW9yeSBjb25zdW1wdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlCittaW5pbWl6ZWQuIFxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLDAsMCkgXGVuZGNvZGUKKy0gSWYgdGhlIHJlcXVpcmVkIE1QRUctNCBBT1RzIGRvIG5vdCBjYWxsIGZvciB0aGUgZnVsbCBmdW5jdGlvbmFsIHJhbmdlIG9mIHRoZQorbGlicmFyeSwgZW5jb2RlciBtb2R1bGVzIGNhbiBiZSBhbGxvY2F0ZWQgc2VsZWN0aXZlbHkuIFx2ZXJiYXRpbQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgQUFDIHwgU0JSIHwgIFBTIHwgTUQgfCAgICAgICAgIEZMQUdTICAgICAgICAgfCB2YWx1ZQogLS0tLS0rLS0tLS0rLS0tLS0rLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tCkBAIC0xOTEsMTI5ICsyMjQsMTc4IEBACiAgLSBNRDogQWxsb2NhdGUgTWV0YSBEYXRhIG1vZHVsZSB3aXRoaW4gQUFDIGVuY29kZXIuCiBcZW5kdmVyYmF0aW0KIFxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLHZhbHVlLDApIFxlbmRjb2RlCi0tIFNwZWNpZnlpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHRvIGJlIHN1cHBvcnRlZCBpbiB0aGUgZW5jb2RlciBpbnN0YW5jZSBjYW4gYmUgZG9uZSBhcyBmb2xsb3dzLgotIC0gRm9yIGV4YW1wbGUgYWxsb2NhdGUgYW4gZW5jb2RlciBpbnN0YW5jZSB3aGljaCBzdXBwb3J0cyAyIGNoYW5uZWxzIGZvciBhbGwgc3VwcG9ydGVkIEFPVHMuCi0gICBUaGUgbGlicmFyeSBpdHNlbGYgbWF5IGJlIGNhcGFibGUgb2YgZW5jb2RpbmcgdXAgdG8gNiBvciA4IGNoYW5uZWxzIGJ1dCBpbiB0aGlzIGV4YW1wbGUgb25seSAyIGNoYW5uZWwgZW5jb2RpbmcgaXMgcmVxdWlyZWQgYW5kIHRodXMgb25seSBidWZmZXJzIGZvciAyIGNoYW5uZWxzIGFyZSBhbGxvY2F0ZWQgdG8gc2F2ZSBkYXRhIG1lbW9yeS4KLVxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLDAsMikgXGVuZGNvZGUKLSAtIEFkZGl0aW9uYWxseSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIGNoYW5uZWxzIGluIHRoZSBTQlIgbW9kdWxlIGNhbiBiZSBkZW5vdGVkIHNlcGFyYXRlbHkuXG4KLSAgIEluIHRoaXMgZXhhbXBsZSB0aGUgZW5jb2RlciBpbnN0YW5jZSBwcm92aWRlcyBhIG1heGltdW0gb2YgNiBjaGFubmVscyBvdXQgb2Ygd2hpY2ggdXAgdG8gMiBjaGFubmVscyBzdXBwb3J0IFNCUi4KLSAgIFRoaXMgZW5jb2RlciBpbnN0YW5jZSBjYW4gcHJvZHVjZSBmb3IgZXhhbXBsZSA1LjEgY2hhbm5lbCBBQUMtTEMgc3RyZWFtcyBvciBzdGVyZW8gSEUtQUFDICh2Mikgc3RyZWFtcy4KLSAgIEhFLUFBQyA1LjEgbXVsdGkgY2hhbm5lbCBpcyBub3QgcG9zc2libGUgc2luY2Ugb25seSAyIG91dCBvZiA2IGNoYW5uZWxzIHN1cHBvcnQgU0JSLCB3aGljaCBzYXZlcyBkYXRhIG1lbW9yeS4KLVxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLDAsNnwoMjw8OCkpIFxlbmRjb2RlCi1cbgorLSBTcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyB0byBiZSBzdXBwb3J0ZWQgaW4gdGhlIGVuY29kZXIKK2luc3RhbmNlIGNhbiBiZSBkb25lIGFzIGZvbGxvd3MuCisgLSBGb3IgZXhhbXBsZSBhbGxvY2F0ZSBhbiBlbmNvZGVyIGluc3RhbmNlIHdoaWNoIHN1cHBvcnRzIDIgY2hhbm5lbHMgZm9yIGFsbAorc3VwcG9ydGVkIEFPVHMuIFRoZSBsaWJyYXJ5IGl0c2VsZiBtYXkgYmUgY2FwYWJsZSBvZiBlbmNvZGluZyB1cCB0byA2IG9yIDgKK2NoYW5uZWxzIGJ1dCBpbiB0aGlzIGV4YW1wbGUgb25seSAyIGNoYW5uZWwgZW5jb2RpbmcgaXMgcmVxdWlyZWQgYW5kIHRodXMgb25seQorYnVmZmVycyBmb3IgMiBjaGFubmVscyBhcmUgYWxsb2NhdGVkIHRvIHNhdmUgZGF0YSBtZW1vcnkuIFxjb2RlCithYWNFbmNPcGVuKCZoQWFjRW5jb2RlciwwLDIpIFxlbmRjb2RlCisgLSBBZGRpdGlvbmFsbHkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBjaGFubmVscyBpbiB0aGUgU0JSIG1vZHVsZSBjYW4KK2JlIGRlbm90ZWQgc2VwYXJhdGVseS5cbiBJbiB0aGlzIGV4YW1wbGUgdGhlIGVuY29kZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBtYXhpbXVtCitvZiA2IGNoYW5uZWxzIG91dCBvZiB3aGljaCB1cCB0byAyIGNoYW5uZWxzIHN1cHBvcnQgU0JSLiBUaGlzIGVuY29kZXIgaW5zdGFuY2UKK2NhbiBwcm9kdWNlIGZvciBleGFtcGxlIDUuMSBjaGFubmVsIEFBQy1MQyBzdHJlYW1zIG9yIHN0ZXJlbyBIRS1BQUMgKHYyKQorc3RyZWFtcy4gSEUtQUFDIDUuMSBtdWx0aSBjaGFubmVsIGlzIG5vdCBwb3NzaWJsZSBzaW5jZSBvbmx5IDIgb3V0IG9mIDYgY2hhbm5lbHMKK3N1cHBvcnQgU0JSLCB3aGljaCBzYXZlcyBkYXRhIG1lbW9yeS4gXGNvZGUgYWFjRW5jT3BlbigmaEFhY0VuY29kZXIsMCw2fCgyPDw4KSkKK1xlbmRjb2RlIFxuCiAKIFxzZWN0aW9uIGJ1ZkRlcyBJbnB1dC9PdXRwdXQgQXJndW1lbnRzCiAKIFxzdWJzZWN0aW9uIGFsbG9jSU9CdWZzIFByb3ZpZGUgQnVmZmVyIERlc2NyaXB0b3JzCi1JbiB0aGUgcHJlc2VudCBlbmNvZGVyIEFQSSwgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgZGVzY3JpYmVkIHdpdGggXHJlZiBBQUNFTkNfQnVmRGVzYyAiYnVmZmVyIGRlc2NyaXB0b3JzIi4gVGhpcyBtZWNoYW5pc20gYWxsb3dzIGEgZmxleGlibGUgaGFuZGxpbmcKLW9mIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB3aXRob3V0IGltcGFjdCB0byB0aGUgYWN0dWFsIGVuY29kaW5nIGNhbGwuIE9wdGlvbmFsIGJ1ZmZlcnMgYXJlIG5lY2Vzc2FyeSBlLmcuIGZvciBhbmNpbGxhcnkgZGF0YSwgbWV0YSBkYXRhIGlucHV0IG9yIGFkZGl0aW9uYWwgb3V0cHV0Ci1idWZmZXJzIGRlc2NyaWJpbmcgc3VwZXJmcmFtaW5nIGRhdGEgaW4gREFCKyBvciBEUk0rLlxuCi1BdCBsZWFzdCBvbmUgaW5wdXQgYnVmZmVyIGZvciBhdWRpbyBpbnB1dCBkYXRhIGFuZCBvbmUgb3V0cHV0IGJ1ZmZlciBmb3IgYml0c3RyZWFtIGRhdGEgbXVzdCBiZSBhbGxvY2F0ZWQuIFRoZSBpbnB1dCBidWZmZXIgc2l6ZSBjYW4gYmUgYSB1c2VyIGRlZmluZWQgbXVsdGlwbGUKLW9mIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMuIFBDTSBpbnB1dCBkYXRhIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIHVzZXIgZGVmaW5lZCBQQ00gYnVmZmVyIHRvIGFuIGludGVybmFsIGlucHV0IGJ1ZmZlciBhbmQgc28gaW5wdXQgZGF0YSBjYW4gYmUgbGVzcyB0aGFuIG9uZSBBQUMgYXVkaW8gZnJhbWUuCi1UaGUgb3V0cHV0IGJ1ZmZlciBzaXplIHNob3VsZCBiZSA2MTQ0IGJpdHMgcGVyIGNoYW5uZWwgZXhjbHVkaW5nIHRoZSBMRkUgY2hhbm5lbC4KLUlmIHRoZSBvdXRwdXQgZGF0YSBkb2VzIG5vdCBmaXQgaW50byB0aGUgcHJvdmlkZWQgYnVmZmVyLCBhbiBBQUNFTkNfRVJST1Igd2lsbCBiZSByZXR1cm5lZCBieSBhYWNFbmNFbmNvZGUoKS4KLVxkb250aW5jbHVkZSBtYWluLmNwcAotXHNraXBsaW5lIGlucHV0QnVmZmVyCi1cdW50aWwgb3V0cHV0QnVmZmVyCitJbiB0aGUgcHJlc2VudCBlbmNvZGVyIEFQSSwgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgZGVzY3JpYmVkIHdpdGggXHJlZgorQUFDRU5DX0J1ZkRlc2MgImJ1ZmZlciBkZXNjcmlwdG9ycyIuIFRoaXMgbWVjaGFuaXNtIGFsbG93cyBhIGZsZXhpYmxlIGhhbmRsaW5nCitvZiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgd2l0aG91dCBpbXBhY3QgdG8gdGhlIGFjdHVhbCBlbmNvZGluZyBjYWxsLiBPcHRpb25hbAorYnVmZmVycyBhcmUgbmVjZXNzYXJ5IGUuZy4gZm9yIGFuY2lsbGFyeSBkYXRhLCBtZXRhIGRhdGEgaW5wdXQgb3IgYWRkaXRpb25hbAorb3V0cHV0IGJ1ZmZlcnMgZGVzY3JpYmluZyBzdXBlcmZyYW1pbmcgZGF0YSBpbiBEQUIrIG9yIERSTSsuXG4gQXQgbGVhc3Qgb25lCitpbnB1dCBidWZmZXIgZm9yIGF1ZGlvIGlucHV0IGRhdGEgYW5kIG9uZSBvdXRwdXQgYnVmZmVyIGZvciBiaXRzdHJlYW0gZGF0YSBtdXN0CitiZSBhbGxvY2F0ZWQuIFRoZSBpbnB1dCBidWZmZXIgc2l6ZSBjYW4gYmUgYSB1c2VyIGRlZmluZWQgbXVsdGlwbGUgb2YgdGhlIG51bWJlcgorb2YgaW5wdXQgY2hhbm5lbHMuIFBDTSBpbnB1dCBkYXRhIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIHVzZXIgZGVmaW5lZCBQQ00KK2J1ZmZlciB0byBhbiBpbnRlcm5hbCBpbnB1dCBidWZmZXIgYW5kIHNvIGlucHV0IGRhdGEgY2FuIGJlIGxlc3MgdGhhbiBvbmUgQUFDCithdWRpbyBmcmFtZS4gVGhlIG91dHB1dCBidWZmZXIgc2l6ZSBzaG91bGQgYmUgNjE0NCBiaXRzIHBlciBjaGFubmVsIGV4Y2x1ZGluZwordGhlIExGRSBjaGFubmVsLiBJZiB0aGUgb3V0cHV0IGRhdGEgZG9lcyBub3QgZml0IGludG8gdGhlIHByb3ZpZGVkIGJ1ZmZlciwgYW4KK0FBQ0VOQ19FUlJPUiB3aWxsIGJlIHJldHVybmVkIGJ5IGFhY0VuY0VuY29kZSgpLiBcY29kZSBzdGF0aWMgSU5UX1BDTQoraW5wdXRCdWZmZXJbOCoyMDQ4XTsgc3RhdGljIFVDSEFSICAgICAgICAgICAgYW5jaWxsYXJ5QnVmZmVyWzUwXTsgc3RhdGljCitBQUNFTkNfTWV0YURhdGEgIG1ldGFEYXRhU2V0dXA7IHN0YXRpYyBVQ0hBUiAgICAgICAgICAgIG91dHB1dEJ1ZmZlcls4MTkyXTsKK1xlbmRjb2RlCisKIEFsbCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBtdXN0IGJlIGNsdXN0ZXJlZCBpbiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBhcnJheXMuCi1cc2tpcGxpbmUgaW5CdWZmZXIKLVx1bnRpbCBvdXRCdWZmZXJFbFNpemUKK1xjb2RlCitzdGF0aWMgdm9pZCogaW5CdWZmZXJbXSAgICAgICAgPSB7IGlucHV0QnVmZmVyLCBhbmNpbGxhcnlCdWZmZXIsICZtZXRhRGF0YVNldHVwCit9OyBzdGF0aWMgSU5UICAgaW5CdWZmZXJJZHNbXSAgICAgPSB7IElOX0FVRElPX0RBVEEsIElOX0FOQ0lMTFJZX0RBVEEsCitJTl9NRVRBREFUQV9TRVRVUCB9OyBzdGF0aWMgSU5UICAgaW5CdWZmZXJTaXplW10gICAgPSB7IHNpemVvZihpbnB1dEJ1ZmZlciksCitzaXplb2YoYW5jaWxsYXJ5QnVmZmVyKSwgc2l6ZW9mKG1ldGFEYXRhU2V0dXApIH07IHN0YXRpYyBJTlQgICBpbkJ1ZmZlckVsU2l6ZVtdCis9IHsgc2l6ZW9mKElOVF9QQ00pLCBzaXplb2YoVUNIQVIpLCBzaXplb2YoQUFDRU5DX01ldGFEYXRhKSB9OworCitzdGF0aWMgdm9pZCogb3V0QnVmZmVyW10gICAgICAgPSB7IG91dHB1dEJ1ZmZlciB9Oworc3RhdGljIElOVCAgIG91dEJ1ZmZlcklkc1tdICAgID0geyBPVVRfQklUU1RSRUFNX0RBVEEgfTsKK3N0YXRpYyBJTlQgICBvdXRCdWZmZXJTaXplW10gICA9IHsgc2l6ZW9mKG91dHB1dEJ1ZmZlcikgfTsKK3N0YXRpYyBJTlQgICBvdXRCdWZmZXJFbFNpemVbXSA9IHsgc2l6ZW9mKFVDSEFSKSB9OworXGVuZGNvZGUKKwogQWxsb2NhdGUgYnVmZmVyIGRlc2NyaXB0b3JzCi1cc2tpcGxpbmUgQUFDRU5DX0J1ZkRlc2MKLVxza2lwbGluZSBBQUNFTkNfQnVmRGVzYworXGNvZGUKK0FBQ0VOQ19CdWZEZXNjIGluQnVmRGVzYzsKK0FBQ0VOQ19CdWZEZXNjIG91dEJ1ZkRlc2M7CitcZW5kY29kZQorCiBJbml0aWFsaXplIGlucHV0IGJ1ZmZlciBkZXNjcmlwdG9yCi1cc2tpcGxpbmUgaW5CdWZEZXNjCi1cdW50aWwgYnVmRWxTaXplcworXGNvZGUKK2luQnVmRGVzYy5udW1CdWZzICAgICAgICAgICAgPSBzaXplb2YoaW5CdWZmZXIpL3NpemVvZih2b2lkKik7CitpbkJ1ZkRlc2MuYnVmcyAgICAgICAgICAgICAgPSAodm9pZCoqKSZpbkJ1ZmZlcjsKK2luQnVmRGVzYy5idWZmZXJJZGVudGlmaWVycyA9IGluQnVmZmVySWRzOworaW5CdWZEZXNjLmJ1ZlNpemVzICAgICAgICAgID0gaW5CdWZmZXJTaXplOworaW5CdWZEZXNjLmJ1ZkVsU2l6ZXMgICAgICAgID0gaW5CdWZmZXJFbFNpemU7CitcZW5kY29kZQorCiBJbml0aWFsaXplIG91dHB1dCBidWZmZXIgZGVzY3JpcHRvcgotXHNraXBsaW5lIG91dEJ1ZkRlc2MKLVx1bnRpbCBidWZFbFNpemVzCitcY29kZQorb3V0QnVmRGVzYy5udW1CdWZzICAgICAgICAgICA9IHNpemVvZihvdXRCdWZmZXIpL3NpemVvZih2b2lkKik7CitvdXRCdWZEZXNjLmJ1ZnMgICAgICAgICAgICAgID0gKHZvaWQqKikmb3V0QnVmZmVyOworb3V0QnVmRGVzYy5idWZmZXJJZGVudGlmaWVycyA9IG91dEJ1ZmZlcklkczsKK291dEJ1ZkRlc2MuYnVmU2l6ZXMgICAgICAgICAgPSBvdXRCdWZmZXJTaXplOworb3V0QnVmRGVzYy5idWZFbFNpemVzICAgICAgICA9IG91dEJ1ZmZlckVsU2l6ZTsKK1xlbmRjb2RlCiAKIFxzdWJzZWN0aW9uIGFyZ0xpc3RzIFByb3ZpZGUgSW5wdXQvT3V0cHV0IEFyZ3VtZW50IExpc3RzCi1UaGUgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMgb2YgYW4gYWFjRW5jRW5jb2RlKCkgY2FsbCBhcmUgZGVzY3JpYmVkIGluIGFyZ3VtZW50IHN0cnVjdHVyZXMuCi1cZG9udGluY2x1ZGUgbWFpbi5jcHAKLVxza2lwbGluZSBBQUNFTkNfSW5BcmdzCi1cc2tpcGxpbmUgQUFDRU5DX091dEFyZ3MKK1RoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cyBvZiBhbiBhYWNFbmNFbmNvZGUoKSBjYWxsIGFyZSBkZXNjcmliZWQgaW4KK2FyZ3VtZW50IHN0cnVjdHVyZXMuIFxjb2RlIEFBQ0VOQ19JbkFyZ3MgICAgIGluYXJnczsgQUFDRU5DX091dEFyZ3MgICAgb3V0YXJnczsKK1xlbmRjb2RlCiAKIFxzZWN0aW9uIGZlZWRJbkJ1ZiBGZWVkIElucHV0IEJ1ZmZlcgotVGhlIGlucHV0IGJ1ZmZlciBzaG91bGQgYmUgaGFuZGxlZCBhcyBhIG1vZHVsbyBidWZmZXIuIE5ldyBhdWRpbyBkYXRhIGluIHRoZSBmb3JtIG9mIHB1bHNlLWNvZGUtCi1tb2R1bGF0ZWQgc2FtcGxlcyAoUENNKSBtdXN0IGJlIHJlYWQgZnJvbSBleHRlcm5hbCBhbmQgYmUgZmVkIHRvIHRoZSBpbnB1dCBidWZmZXIgZGVwZW5kaW5nIG9uIGl0cwotZmlsbCBsZXZlbC4gVGhlIHJlcXVpcmVkIHNhbXBsZSBiaXRyYXRlIChyZXByZXNlbnRlZCBieSB0aGUgZGF0YSB0eXBlIElOVF9QQ00gd2hpY2ggaXMgMTYsIDI0IG9yIDMyCi1iaXRzIHdpZGUpIGlzIGZpeGVkIGFuZCBkZXBlbmRzIG9uIGxpYnJhcnkgY29uZmlndXJhdGlvbiAodXN1YWxseSAxNiBiaXQpLgorVGhlIGlucHV0IGJ1ZmZlciBzaG91bGQgYmUgaGFuZGxlZCBhcyBhIG1vZHVsbyBidWZmZXIuIE5ldyBhdWRpbyBkYXRhIGluIHRoZQorZm9ybSBvZiBwdWxzZS1jb2RlLSBtb2R1bGF0ZWQgc2FtcGxlcyAoUENNKSBtdXN0IGJlIHJlYWQgZnJvbSBleHRlcm5hbCBhbmQgYmUKK2ZlZCB0byB0aGUgaW5wdXQgYnVmZmVyIGRlcGVuZGluZyBvbiBpdHMgZmlsbCBsZXZlbC4gVGhlIHJlcXVpcmVkIHNhbXBsZSBiaXRyYXRlCisocmVwcmVzZW50ZWQgYnkgdGhlIGRhdGEgdHlwZSBJTlRfUENNIHdoaWNoIGlzIDE2LCAyNCBvciAzMiBiaXRzIHdpZGUpIGlzIGZpeGVkCithbmQgZGVwZW5kcyBvbiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gKHVzdWFsbHkgMTYgYml0KS4gXGNvZGUgaW5hcmdzLm51bUluU2FtcGxlcworKz0gV0FWX0lucHV0UmVhZCAoIHdhdkluLCAmaW5wdXRCdWZmZXJbaW5hcmdzLm51bUluU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREttaW4oZW5jSW5mby5pbnB1dENoYW5uZWxzKmVuY0luZm8uZnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlucHV0QnVmZmVyKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKElOVF9QQ00pLWluYXJncy5udW1JblNhbXBsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNUExFX0JJVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworXGVuZGNvZGUKIAotXGRvbnRpbmNsdWRlIG1haW4uY3BwCi1cc2tpcGxpbmUgV0FWX0lucHV0UmVhZAotXHVudGlsIDsKLUFmdGVyIHRoZSBlbmNvZGVyJ3MgaW50ZXJuYWwgYnVmZmVyIGlzIGZlZCB3aXRoIGluY29taW5nIGF1ZGlvIHNhbXBsZXMsIGFuZCBhYWNFbmNFbmNvZGUoKQotcHJvY2Vzc2VkIHRoZSBuZXcgaW5wdXQgZGF0YSwgdXBkYXRlL21vdmUgcmVtYWluaW5nIHNhbXBsZXMgaW4gaW5wdXQgYnVmZmVyLCBzaW11bGF0aW5nIGEgbW9kdWxvIGJ1ZmZlcjoKLVxza2lwbGluZSBvdXRhcmdzLm51bUluU2FtcGxlcz4wCi1cdW50aWwgfQorQWZ0ZXIgdGhlIGVuY29kZXIncyBpbnRlcm5hbCBidWZmZXIgaXMgZmVkIHdpdGggaW5jb21pbmcgYXVkaW8gc2FtcGxlcywgYW5kCithYWNFbmNFbmNvZGUoKSBwcm9jZXNzZWQgdGhlIG5ldyBpbnB1dCBkYXRhLCB1cGRhdGUvbW92ZSByZW1haW5pbmcgc2FtcGxlcyBpbgoraW5wdXQgYnVmZmVyLCBzaW11bGF0aW5nIGEgbW9kdWxvIGJ1ZmZlcjogXGNvZGUgaWYgKG91dGFyZ3MubnVtSW5TYW1wbGVzPjApIHsKKyAgICBGREttZW1tb3ZlKCBpbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAmaW5wdXRCdWZmZXJbb3V0YXJncy5udW1JblNhbXBsZXNdLAorICAgICAgICAgICAgICAgIHNpemVvZihJTlRfUENNKSooaW5hcmdzLm51bUluU2FtcGxlcy1vdXRhcmdzLm51bUluU2FtcGxlcykgKTsKKyAgICBpbmFyZ3MubnVtSW5TYW1wbGVzIC09IG91dGFyZ3MubnVtSW5TYW1wbGVzOworfQorXGVuZGNvZGUKIAogXHNlY3Rpb24gd3JpdGVPdXREYXRhIE91dHB1dCBCaXRzdHJlYW0gRGF0YQotSWYgYW55IEFBQyBiaXRzdHJlYW0gZGF0YSBpcyBhdmFpbGFibGUsIHdyaXRlIGl0IHRvIG91dHB1dCBmaWxlIG9yIGRldmljZS4gVGhpcyBjYW4gYmUgZG9uZSBvbmNlIHRoZQotZm9sbG93aW5nIGNvbmRpdGlvbiBpcyB0cnVlOgotXGRvbnRpbmNsdWRlIG1haW4uY3BwCi1cc2tpcCBWYWxpZCBiaXRzdHJlYW0gYXZhaWxhYmxlCi1cc2tpcGxpbmUgb3V0YXJncworSWYgYW55IEFBQyBiaXRzdHJlYW0gZGF0YSBpcyBhdmFpbGFibGUsIHdyaXRlIGl0IHRvIG91dHB1dCBmaWxlIG9yIGRldmljZS4gVGhpcworY2FuIGJlIGRvbmUgb25jZSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBpcyB0cnVlOiBcY29kZSBpZgorKG91dGFyZ3MubnVtT3V0Qnl0ZXM+MCkgewogCi1cc2tpcGxpbmUgb3V0Qnl0ZXM+MAorfQorXGVuZGNvZGUKIAotSWYgeW91IHVzZSBmaWxlIEkvTyB0aGVuIGZvciBleGFtcGxlIGNhbGwgbXBlZ0ZpbGVXcml0ZV9Xcml0ZSgpIGZyb20gdGhlIGxpYnJhcnkgbGliTXBlZ0ZpbGVXcml0ZQotCi1cZG9udGluY2x1ZGUgbWFpbi5jcHAKLVxza2lwbGluZSBtcGVnRmlsZVdyaXRlX1dyaXRlCitJZiB5b3UgdXNlIGZpbGUgSS9PIHRoZW4gZm9yIGV4YW1wbGUgY2FsbCBtcGVnRmlsZVdyaXRlX1dyaXRlKCkgZnJvbSB0aGUgbGlicmFyeQorbGliTXBlZ0ZpbGVXcml0ZSBcY29kZSBtcGVnRmlsZVdyaXRlX1dyaXRlKGhNcGVnRmlsZSwgb3V0cHV0QnVmZmVyLAorb3V0YXJncy5udW1PdXRCeXRlcywgYWFjRW5jb2Rlcl9HZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0dSQU5VTEVfTEVOR1RIKSk7CitcZW5kY29kZQogCiBcc2VjdGlvbiBjZmdNZXRhRGF0YSBNZXRhIERhdGEgQ29uZmlndXJhdGlvbgogCi1JZiB0aGUgcHJlc2VudCBsaWJyYXJ5IGlzIGNvbmZpZ3VyZWQgd2l0aCBNZXRhZGF0YSBzdXBwb3J0LCBpdCBpcyBwb3NzaWJsZSB0byBpbnNlcnQgbWV0YSBkYXRhIHNpZGUgaW5mbyBpbnRvIHRoZSBnZW5lcmF0ZWQKLWF1ZGlvIGJpdHN0cmVhbSB3aGlsZSBlbmNvZGluZy4KK0lmIHRoZSBwcmVzZW50IGxpYnJhcnkgaXMgY29uZmlndXJlZCB3aXRoIE1ldGFkYXRhIHN1cHBvcnQsIGl0IGlzIHBvc3NpYmxlIHRvCitpbnNlcnQgbWV0YSBkYXRhIHNpZGUgaW5mbyBpbnRvIHRoZSBnZW5lcmF0ZWQgYXVkaW8gYml0c3RyZWFtIHdoaWxlIGVuY29kaW5nLgogCi1UbyB3b3JrIHdpdGggbWV0YSBkYXRhIHRoZSBlbmNvZGVyIGluc3RhbmNlIGhhcyB0byBiZSBccmVmIGVuY09wZW4gImFsbG9jYXRlZCIgd2l0aCBtZXRhIGRhdGEgc3VwcG9ydC4gVGhlIG1ldGEgZGF0YSBtb2RlIG11c3QgYmUgYmUgY29uZmlndXJlZCB3aXRoCi10aGUgOjpBQUNFTkNfTUVUQURBVEFfTU9ERSBwYXJhbWV0ZXIgYW5kIGFhY0VuY29kZXJfU2V0UGFyYW0oKSBmdW5jdGlvbi4KLVxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19NRVRBREFUQV9NT0RFLCAwLTIpOyBcZW5kY29kZQorVG8gd29yayB3aXRoIG1ldGEgZGF0YSB0aGUgZW5jb2RlciBpbnN0YW5jZSBoYXMgdG8gYmUgXHJlZiBlbmNPcGVuICJhbGxvY2F0ZWQiCit3aXRoIG1ldGEgZGF0YSBzdXBwb3J0LiBUaGUgbWV0YSBkYXRhIG1vZGUgbXVzdCBiZSBiZSBjb25maWd1cmVkIHdpdGggdGhlCis6OkFBQ0VOQ19NRVRBREFUQV9NT0RFIHBhcmFtZXRlciBhbmQgYWFjRW5jb2Rlcl9TZXRQYXJhbSgpIGZ1bmN0aW9uLiBcY29kZQorYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX01FVEFEQVRBX01PREUsIDAtMyk7IFxlbmRjb2RlCiAKLVRoaXMgY29uZmlndXJhdGlvbiBpbmRpY2F0ZXMgaG93IHRvIGVtYmVkIG1ldGEgZGF0YSBpbnRvIGJpdHN0cmVtLiBFaXRoZXIgbm8gaW5zZXJ0aW9uLCBNUEVHIG9yIEVUU0kgc3R5bGUuCi1UaGUgbWV0YSBkYXRhIGl0c2VsZiBtdXN0IGJlIHNwZWNpZmllZCB3aXRoaW4gdGhlIG1ldGEgZGF0YSBzZXR1cCBzdHJ1Y3R1cmUgQUFDRU5DX01ldGFEYXRhLgorVGhpcyBjb25maWd1cmF0aW9uIGluZGljYXRlcyBob3cgdG8gZW1iZWQgbWV0YSBkYXRhIGludG8gYml0c3RyZW0uIEVpdGhlciBubworaW5zZXJ0aW9uLCBNUEVHIG9yIEVUU0kgc3R5bGUuIFRoZSBtZXRhIGRhdGEgaXRzZWxmIG11c3QgYmUgc3BlY2lmaWVkIHdpdGhpbiB0aGUKK21ldGEgZGF0YSBzZXR1cCBzdHJ1Y3R1cmUgQUFDRU5DX01ldGFEYXRhLgogCi1DaGFuZ2luZyBvbmUgb2YgdGhlIEFBQ0VOQ19NZXRhRGF0YSBzZXR1cCBwYXJhbWV0ZXJzIGNhbiBiZSBhY2hpZXZlZCBmcm9tIG91dHNpZGUgdGhlIGxpYnJhcnkgd2l0aGluIDo6SU5fTUVUQURBVEFfU0VUVVAgaW5wdXQKLWJ1ZmZlci4gVGhlcmUgaXMgbm8gbmVlZCB0byBzdXBwbHkgbWV0YSBkYXRhIHNldHVwIHN0cnVjdHVyZSBldmVyeSBmcmFtZS4gSWYgdGhlcmUgaXMgbm8gbmV3IG1ldGEgc2V0dXAgZGF0YSBhdmFpbGFibGUsIHRoZQotZW5jb2RlciB1c2VzIHRoZSBwcmV2aW91cyBzZXR1cCBvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIGluaXRpYWwgc3RhdGUuCitDaGFuZ2luZyBvbmUgb2YgdGhlIEFBQ0VOQ19NZXRhRGF0YSBzZXR1cCBwYXJhbWV0ZXJzIGNhbiBiZSBhY2hpZXZlZCBmcm9tCitvdXRzaWRlIHRoZSBsaWJyYXJ5IHdpdGhpbiA6OklOX01FVEFEQVRBX1NFVFVQIGlucHV0IGJ1ZmZlci4gVGhlcmUgaXMgbm8gbmVlZCB0bworc3VwcGx5IG1ldGEgZGF0YSBzZXR1cCBzdHJ1Y3R1cmUgZXZlcnkgZnJhbWUuIElmIHRoZXJlIGlzIG5vIG5ldyBtZXRhIHNldHVwIGRhdGEKK2F2YWlsYWJsZSwgdGhlIGVuY29kZXIgdXNlcyB0aGUgcHJldmlvdXMgc2V0dXAgb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbgoraW5pdGlhbCBzdGF0ZS4KIAotSW4gZ2VuZXJhbCB0aGUgYXVkaW8gY29tcHJlc3NvciBhbmQgbGltaXRlciB3aXRoaW4gdGhlIGVuY29kZXIgbGlicmFyeSBjYW4gYmUgY29uZmlndXJlZCB3aXRoIHRoZSA6OkFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRSBwYXJhbWV0ZXIKK0luIGdlbmVyYWwgdGhlIGF1ZGlvIGNvbXByZXNzb3IgYW5kIGxpbWl0ZXIgd2l0aGluIHRoZSBlbmNvZGVyIGxpYnJhcnkgY2FuIGJlCitjb25maWd1cmVkIHdpdGggdGhlIDo6QUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIHBhcmFtZXRlcgogQUFDRU5DX01ldGFEYXRhOjpkcmNfcHJvZmlsZSBhbmQgYW5kIEFBQ0VOQ19NZXRhRGF0YTo6Y29tcF9wcm9maWxlLgogXG4KIAogXHNlY3Rpb24gZW5jUmVjb25mIEVuY29kZXIgUmVjb25maWd1cmF0aW9uCiAKLVRoZSBlbmNvZGVyIGxpYnJhcnkgYWxsb3dzIHJlY29uZmlndXJhdGlvbiBvZiB0aGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIG5ldyBzZXR0aW5ncwotY29udGludW91c2x5IGJldHdlZW4gZW5jb2RpbmcgZnJhbWVzLiBFYWNoIHBhcmFtZXRlciB0byBiZSBjaGFuZ2VkIG11c3QgYmUgc2V0IHdpdGgKLWEgc2luZ2xlIGFhY0VuY29kZXJfU2V0UGFyYW0oKSBjYWxsLiBUaGUgaW50ZXJuYWwgc3RhdHVzIG9mIGVhY2ggcGFyYW1ldGVyIGNhbiBiZQotcmV0cmlldmVkIHdpdGggYW4gYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGNhbGwuXG4KLVRoZXJlIGlzIG5vIHN0YW5kLWFsb25lIHJlY29uZmlndXJhdGlvbiBmdW5jdGlvbiBhdmFpbGFibGUuIFdoZW4gcGFyYW1ldGVycyB3ZXJlCi1tb2RpZmllZCBmcm9tIG91dHNpZGUgdGhlIGxpYnJhcnksIGFuIGludGVybmFsIGNvbnRyb2wgbWVjaGFuaXNtIHRyaWdnZXJzIHRoZSBuZWNlc3NhcnkKK1RoZSBlbmNvZGVyIGxpYnJhcnkgYWxsb3dzIHJlY29uZmlndXJhdGlvbiBvZiB0aGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIG5ldworc2V0dGluZ3MgY29udGludW91c2x5IGJldHdlZW4gZW5jb2RpbmcgZnJhbWVzLiBFYWNoIHBhcmFtZXRlciB0byBiZSBjaGFuZ2VkIG11c3QKK2JlIHNldCB3aXRoIGEgc2luZ2xlIGFhY0VuY29kZXJfU2V0UGFyYW0oKSBjYWxsLiBUaGUgaW50ZXJuYWwgc3RhdHVzIG9mIGVhY2gKK3BhcmFtZXRlciBjYW4gYmUgcmV0cmlldmVkIHdpdGggYW4gYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGNhbGwuXG4gVGhlcmUgaXMgbm8KK3N0YW5kLWFsb25lIHJlY29uZmlndXJhdGlvbiBmdW5jdGlvbiBhdmFpbGFibGUuIFdoZW4gcGFyYW1ldGVycyB3ZXJlIG1vZGlmaWVkCitmcm9tIG91dHNpZGUgdGhlIGxpYnJhcnksIGFuIGludGVybmFsIGNvbnRyb2wgbWVjaGFuaXNtIHRyaWdnZXJzIHRoZSBuZWNlc3NhcnkKIHJlY29uZmlndXJhdGlvbiBwcm9jZXNzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb2xsb3dpbmcKLWFhY0VuY0VuY29kZSgpIGNhbGwuIFRoaXMgc3RhdGUgY2FuIGJlIG9ic2VydmVkIGZyb20gZXh0ZXJuYWwgdmlhIHRoZSBBQUNFTkNfSU5JVF9TVEFUVVMKLWFuZCBhYWNFbmNvZGVyX0dldFBhcmFtKCkgZnVuY3Rpb24uIFRoZSByZWNvbmZpZ3VyYXRpb24gcHJvY2VzcyBjYW4gYWxzbyBiZSBhcHBsaWVkCi1pbW1lZGlhdGVseSB3aGVuIGFsbCBwYXJhbWV0ZXJzIG9mIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwgYXJlIE5VTEwgd2l0aCBhIHZhbGlkIGVuY29kZXIKLWhhbmRsZS5cblxuCi1UaGUgaW50ZXJuYWwgcmVjb25maWd1cmF0aW9uIHByb2Nlc3MgY2FuIGJlIGNvbnRyb2xsZWQgZnJvbSBleHRlcm4gd2l0aCB0aGUgZm9sbG93aW5nIGFjY2Vzcy4KLVxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19DT05UUk9MX1NUQVRFLCBBQUNFTkNfQ1RSTEZMQUdTKTsgXGVuZGNvZGUKK2FhY0VuY0VuY29kZSgpIGNhbGwuIFRoaXMgc3RhdGUgY2FuIGJlIG9ic2VydmVkIGZyb20gZXh0ZXJuYWwgdmlhIHRoZQorQUFDRU5DX0lOSVRfU1RBVFVTIGFuZCBhYWNFbmNvZGVyX0dldFBhcmFtKCkgZnVuY3Rpb24uIFRoZSByZWNvbmZpZ3VyYXRpb24KK3Byb2Nlc3MgY2FuIGFsc28gYmUgYXBwbGllZCBpbW1lZGlhdGVseSB3aGVuIGFsbCBwYXJhbWV0ZXJzIG9mIGFuIGFhY0VuY0VuY29kZSgpCitjYWxsIGFyZSBOVUxMIHdpdGggYSB2YWxpZCBlbmNvZGVyIGhhbmRsZS5cblxuIFRoZSBpbnRlcm5hbCByZWNvbmZpZ3VyYXRpb24KK3Byb2Nlc3MgY2FuIGJlIGNvbnRyb2xsZWQgZnJvbSBleHRlcm4gd2l0aCB0aGUgZm9sbG93aW5nIGFjY2Vzcy4gXGNvZGUKK2FhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19DT05UUk9MX1NUQVRFLCBBQUNFTkNfQ1RSTEZMQUdTKTsKK1xlbmRjb2RlCiAKIAogXHNlY3Rpb24gZW5jUGFyYW1zIEVuY29kZXIgUGFyYW1ldHJpemF0aW9uCiAKLUFsbCBwYXJhbWV0ZXJlcyBsaXN0ZWQgaW4gOjpBQUNFTkNfUEFSQU0gY2FuIGJlIG1vZGlmaWVkIHdpdGhpbiBhbiBlbmNvZGVyIGluc3RhbmNlLgorQWxsIHBhcmFtZXRlcmVzIGxpc3RlZCBpbiA6OkFBQ0VOQ19QQVJBTSBjYW4gYmUgbW9kaWZpZWQgd2l0aGluIGFuIGVuY29kZXIKK2luc3RhbmNlLgogCiBcc3Vic2VjdGlvbiBlbmNNYW5kYXRvcnkgTWFuZGF0b3J5IEVuY29kZXIgUGFyYW1ldGVycwotVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlIGVuY29kZXIgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQuCi1cY29kZQotYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0FPVCwgdmFsdWUpOworVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlIGVuY29kZXIgaW5zdGFuY2UgaXMKK2luaXRpYWxpemVkLiBcY29kZSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQU9ULCB2YWx1ZSk7CiBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQklUUkFURSwgdmFsdWUpOwogYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX1NBTVBMRVJBVEUsIHZhbHVlKTsKIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19DSEFOTkVMTU9ERSwgdmFsdWUpOwogXGVuZGNvZGUKLUJleW9uZCB0aGF0IGlzIGFuIGludGVybmFsIGF1dG8gbW9kZSB3aGljaCBwcmVpbml0aXppYWxpemVzIHRoZSA6OkFBQ0VOQ19CSVRSQVRFIHBhcmFtZXRlcgotaWYgdGhlIHBhcmFtZXRlciB3YXMgbm90IHNldCBmcm9tIGV4dGVybi4gVGhlIGJpdHJhdGUgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGVmZmVjdGl2ZQotY2hhbm5lbHMgYW5kIHNhbXBsaW5nIHJhdGUgYW5kIGlzIGRldGVybWluZWQgYXMgZm9sbG93cy4KK0JleW9uZCB0aGF0IGlzIGFuIGludGVybmFsIGF1dG8gbW9kZSB3aGljaCBwcmVpbml0aXppYWxpemVzIHRoZSA6OkFBQ0VOQ19CSVRSQVRFCitwYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciB3YXMgbm90IHNldCBmcm9tIGV4dGVybi4gVGhlIGJpdHJhdGUgZGVwZW5kcyBvbiB0aGUKK251bWJlciBvZiBlZmZlY3RpdmUgY2hhbm5lbHMgYW5kIHNhbXBsaW5nIHJhdGUgYW5kIGlzIGRldGVybWluZWQgYXMgZm9sbG93cy4KIFxjb2RlCiBBQUMtTEMgKEFPVF9BQUNfTEMpOiAxLjUgYml0cyBwZXIgc2FtcGxlCiBIRS1BQUMgKEFPVF9TQlIpOiAwLjYyNSBiaXRzIHBlciBzYW1wbGUgKGR1YWxyYXRlIHNicikKQEAgLTMyMywxMDggKzQwNSwyNjYgQEAKIAogXHN1YnNlY3Rpb24gY2hhbm5lbE1vZGUgQ2hhbm5lbCBNb2RlIENvbmZpZ3VyYXRpb24KIFRoZSBpbnB1dCBhdWRpbyBkYXRhIGlzIGRlc2NyaWJlZCB3aXRoIHRoZSA6OkFBQ0VOQ19DSEFOTkVMTU9ERSBwYXJhbWV0ZXIgaW4gdGhlCi1hYWNFbmNvZGVyX1NldFBhcmFtKCkgY2FsbC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIGEgJ251bWJlciBvZgotaW5wdXQgY2hhbm5lbHMnIGFyZ3VtZW50LiBJbnN0ZWFkLCB0aGUgY2hhbm5lbE1vZGUgbXVzdCBiZSBzZXQgYXMgZm9sbG93cy4KLVxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19DSEFOTkVMTU9ERSwgdmFsdWUpOyBcZW5kY29kZQotVGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gOjpDSEFOTkVMX01PREUgYW5kIGNhbiBiZSBtYXBwZWQgZnJvbSB0aGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzCi1pbiB0aGUgZm9sbG93aW5nIHdheS4KLVxkb250aW5jbHVkZSBtYWluLmNwcAotXHNraXAgQ0hBTk5FTF9NT0RFIGNoTW9kZSA9IE1PREVfSU5WQUxJRDsKLVx1bnRpbCByZXR1cm4KK2FhY0VuY29kZXJfU2V0UGFyYW0oKSBjYWxsLiBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIHRoZSBlbmNvZGVyIGluc3RhbmNlIHdpdGgKK2EgJ251bWJlciBvZiBpbnB1dCBjaGFubmVscycgYXJndW1lbnQuIEluc3RlYWQsIHRoZSBjaGFubmVsTW9kZSBtdXN0IGJlIHNldCBhcworZm9sbG93cy4gXGNvZGUgYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0NIQU5ORUxNT0RFLCB2YWx1ZSk7CitcZW5kY29kZSBUaGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiA6OkNIQU5ORUxfTU9ERSBhbmQgY2FuIGJlIG1hcHBlZCBmcm9tIHRoZQorbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzIGluIHRoZSBmb2xsb3dpbmcgd2F5LiBcY29kZSBDSEFOTkVMX01PREUgY2hNb2RlID0KK01PREVfSU5WQUxJRDsKKworc3dpdGNoIChuQ2hhbm5lbHMpIHsKKyAgY2FzZSAxOiAgY2hNb2RlID0gTU9ERV8xOyAgICAgICAgICBicmVhazsKKyAgY2FzZSAyOiAgY2hNb2RlID0gTU9ERV8yOyAgICAgICAgICBicmVhazsKKyAgY2FzZSAzOiAgY2hNb2RlID0gTU9ERV8xXzI7ICAgICAgICBicmVhazsKKyAgY2FzZSA0OiAgY2hNb2RlID0gTU9ERV8xXzJfMTsgICAgICBicmVhazsKKyAgY2FzZSA1OiAgY2hNb2RlID0gTU9ERV8xXzJfMjsgICAgICBicmVhazsKKyAgY2FzZSA2OiAgY2hNb2RlID0gTU9ERV8xXzJfMl8xOyAgICBicmVhazsKKyAgY2FzZSA3OiAgY2hNb2RlID0gTU9ERV82XzE7ICAgICAgICBicmVhazsKKyAgY2FzZSA4OiAgY2hNb2RlID0gTU9ERV83XzFfQkFDSzsgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBjaE1vZGUgPSBNT0RFX0lOVkFMSUQ7Cit9CityZXR1cm4gY2hNb2RlOworXGVuZGNvZGUKKworXHN1YnNlY3Rpb24gYml0cmVzZXJ2b2lyIEJpdHJlc2Vydm9pciBDb25maWd1cmF0aW9uCitJbiBBQUMsIHRoZSBkZWZhdWx0IGJpdHJlc2Vydm9pciBjb25maWd1cmF0aW9uIGRlcGVuZHMgb24gdGhlIGNob3NlbiBiaXRyYXRlIHBlcgorZnJhbWUgYW5kIHRoZSBudW1iZXIgb2YgZWZmZWN0aXZlIGNoYW5uZWxzLiBUaGUgc2l6ZSBjYW4gYmUgZGV0ZXJtaW5lZCBhcyBiZWxvdy4KK1xmWworYml0cmVzZXJ2b2lyID0gbkVmZkNoYW5uZWxzKjYxNDQgLSAoYml0cmF0ZSpmcmFtZWxlbmd0aC9zYW1wbGVyYXRlKQorXGZdCitEdWUgdG8gYXVkaW8gcXVhbGl0eSBjb25jZXJucyBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoZSBiaXRyZXNlcnZvaXIKK3NpemUgdG8gYSBsb3dlciB2YWx1ZSB0aGFuIHRoZSBkZWZhdWx0IHNldHRpbmchIEhvd2V2ZXIsIGZvciBtaW5pbWl6aW5nIHRoZQorZGVsYXkgZm9yIHN0cmVhbWluZyBhcHBsaWNhdGlvbnMgb3IgZm9yIGFjaGlldmluZyBhIGNvbnN0YW50IHNpemUgb2YgdGhlCitiaXRzdHJlYW0gcGFja2FnZXMgaW4gZWFjaCBmcmFtZSwgaXQgbWF5IGJlIG5lY2Vzc2FyYXkgdG8gY2hhbmdlIHRoZQorYml0cmVzZXJ2b2lyIHNpemUuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgOjpBQUNFTkNfUEVBS19CSVRSQVRFIHBhcmFtZXRlci4KK1xjb2RlCithYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfUEVBS19CSVRSQVRFLCB2YWx1ZSk7CitcZW5kY29kZQorQnkgc2V0dGluZyA6OkFBQ0VOQ19CSVRSQVRFTU9ERSB0byBmaXhlZCBmcmFtaW5nLCB0aGUgYml0cmVzZXJ2b2lyIGlzIGRpc2FibGVkLgorQSBkaXNhYmxlZCBiaXRyZXNlcnZvaXIgcmVzdWx0cyBpbiBhIGNvbnN0YW50IHNpemUgZm9yIGVhY2ggYml0c3RyZWFtIHBhY2thZ2UuCitQbGVhc2Ugbm90ZSB0aGF0IGVzcGVjaWFsbHkgYXQgbG93ZXIgYml0cmF0ZXMgYSBkaXNhYmxlZCBiaXRyZXNlcnZvaXIgY2FuCitkb3duZ3JhZGUgdGhlIGF1ZGlvIHF1YWxpdHkgY29uc2lkZXJhYmx5ISBUaGUgZGVmYXVsdCBiaXRyZXNlcnZvaXIgY29uZmlndXJhdGlvbgorY2FuIGJlIGFjaGlldmVkIGFzIGZvbGxvd3MuIFxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsCitBQUNFTkNfQklUUkVTRVJWT0lSLCAtMSk7IFxlbmRjb2RlCisKK1RvIGFjaGlldmUgYWNjZXB0YWJsZSBhdWRpbyBxdWFsaXR5IHdpdGggYSByZWR1Y2VkIGJpdHJlc2Vydm9pciBzaXplIHNldHRpbmcgYXQKK2xlYXN0IDEwMDAgYml0cyBwZXIgYXVkaW8gY2hhbm5lbCBpcyByZWNvbW1lbmRlZC4gRm9yIGEgbXVsdGljaGFubmVsIGF1ZGlvIGZpbGUKK3dpdGggNS4xIGNoYW5uZWxzIHRoZSBiaXRyZXNlcnZvaXIgcmVkdWNlZCB0byA1MDAwIGJpdHMgcmVzdWx0cyBpbiBhY2NlcHRhYmxlCithdWRpbyBxdWFsaXR5LgorCisKK1xzdWJzZWN0aW9uIHZicm1vZGUgVmFyaWFibGUgQml0cmF0ZSBNb2RlCitUaGUgZW5jb2RlciBwcm92aWRlcyB2YXJpb3VzIFZhcmlhYmxlIEJpdHJhdGUgTW9kZXMgdGhhdCBkaWZmZXIgaW4gYXVkaW8gcXVhbGl0eQorYW5kIGF2ZXJhZ2Ugb3ZlcmFsbCBiaXRyYXRlLiBUaGUgZ2l2ZW4gdmFsdWVzIGFyZSBhdmVyYWdlcyBvdmVyIHRpbWUsIGRpZmZlcmVudAorZW5jb2RlciBzZXR0aW5ncyBhbmQgc3Ryb25nbHkgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIGF1ZGlvIHNpZ25hbC4gVGhlIFZCUgorY29uZmlndXJhdGlvbnMgY2FuIGJlIGFkanVzdGVkIHZpYSA6OkFBQ0VOQ19CSVRSQVRFTU9ERSBlbmNvZGVyIHBhcmFtZXRlci4KK1x2ZXJiYXRpbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBWQlJfTU9ERSB8IEFwcHJveC4gQml0cmF0ZSBpbiBrYnBzL2NoYW5uZWwKKyAgICAgICAgICB8ICAgICBBQUMtTEMgICAgfCAgQUFDLUxEL0FDX0VMRAorLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBWQlJfMSB8ICAgIDMyIC0gIDQ4ICAgfCAgICAgIDMyIC0gIDU2CisgICAgVkJSXzIgfCAgICA0MCAtICA1NiAgIHwgICAgICA0MCAtICA2NAorICAgIFZCUl8zIHwgICAgNDggLSAgNjQgICB8ICAgICAgNDggLSAgNzIKKyAgICBWQlJfNCB8ICAgIDY0IC0gIDgwICAgfCAgICAgIDY0IC0gIDg4CisgICAgVkJSXzUgfCAgICA5NiAtIDEyMCAgIHwgICAgIDExMiAtIDE0NAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xlbmR2ZXJiYXRpbQorVGhlIGJpdHJhdGUgcmFuZ2VzIGFwcGx5IGZvciBpbmRpdmlkdWFsIGF1ZGlvIGNoYW5uZWxzLiBJbiBjYXNlIG9mIG11bHRpY2hhbm5lbAorY29uZmlndXJhdGlvbnMgdGhlIGF2ZXJhZ2UgYml0cmF0ZSBtaWdodCBiZSBlc3RpbWF0ZWQgYnkgbXVsdGlwbHlpbmcgd2l0aCB0aGUKK251bWJlciBvZiBlZmZlY3RpdmUgY2hhbm5lbHMuIFRoaXMgY29ycmVzcG9uZHMgdG8gYWxsIGF1ZGlvIGlucHV0IGNoYW5uZWxzCitleGNsdXNpdmVseSB0aGUgbG93IGZyZXF1ZW5jeSBjaGFubmVsLiBBdCBjb25maWd1cmF0aW9ucyB3aGljaCBhcmUgbWFraW5nIHVzZSBvZgorZG93bm1peCBtb2R1bGVzIHRoZSBBQUMgY29yZSBjaGFubmVscyByZXNwZWN0aXZlbHkgZG93bm1peCBjaGFubmVscyBzaGFsbCBiZQorY29uc2lkZXJlZC4gRm9yIDo6QUFDRU5DX0FPVCB3aGljaCBhcmUgdXNpbmcgU0JSLCB0aGUgYXZlcmFnZSBiaXRyYXRlIGNhbiBiZQorZXN0aW1hdGVkIGJ5IHVzaW5nIHRoZSByYXRpbyBvZiAwLjUgZm9yIGR1YWxyYXRlIFNCUiBhbmQgMC43NSBmb3IgZG93bnNhbXBsZWQKK1NCUiBjb25maWd1cmF0aW9ucy4KKwogCiBcc3Vic2VjdGlvbiBlbmNRdWFsIEF1ZGlvIFF1YWxpdHkgQ29uc2lkZXJhdGlvbnMKLVRoZSBkZWZhdWx0IGVuY29kZXIgY29uZmlndXJhdGlvbiBpcyBzdWdnZXN0ZWQgdG8gYmUgdXNlZC4gRW5jb2RlciB0b29scyBzdWNoIGFzIFROUyBhbmQgUE5TCi1hcmUgYWN0aXZhdGVkIGJ5IGRlZmF1bHQgYW5kIGFyZSBpbnRlcm5hbGx5IGNvbnRyb2xsZWQgKHNlZSBccmVmIEJFSEFWSU9VUl9UT09MUykuCitUaGUgZGVmYXVsdCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gaXMgc3VnZ2VzdGVkIHRvIGJlIHVzZWQuIEVuY29kZXIgdG9vbHMgc3VjaCBhcworVE5TIGFuZCBQTlMgYXJlIGFjdGl2YXRlZCBieSBkZWZhdWx0IGFuZCBhcmUgaW50ZXJuYWxseSBjb250cm9sbGVkIChzZWUgXHJlZgorQkVIQVZJT1VSX1RPT0xTKS4KIAotVGhlcmUgaXMgYW4gYWRkaXRpb25hbCBxdWFsaXR5IHBhcmFtZXRlciBjYWxsZWQgOjpBQUNFTkNfQUZURVJCVVJORVIuIEluIHRoZSBkZWZhdWx0Ci1jb25maWd1cmF0aW9uIHRoaXMgcXVhbGl0eSBzd2l0Y2ggaXMgZGVhY3RpdmF0ZWQgYmVjYXVzZSBpdCB3b3VsZCBjYXVzZSBhIHdvcmtsb2FkCi1pbmNyZWFzZSB3aGljaCBtaWdodCBiZSBzaWduaWZpY2FudC4gSWYgd29ya2xvYWQgaXMgbm90IGFuIGlzc3VlIGluIHRoZSBhcHBsaWNhdGlvbgotd2UgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgdGhpcyBmZWF0dXJlLgotXGNvZGUgYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0FGVEVSQlVSTkVSLCAxKTsgXGVuZGNvZGUKK1RoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcXVhbGl0eSBwYXJhbWV0ZXIgY2FsbGVkIDo6QUFDRU5DX0FGVEVSQlVSTkVSLiBJbiB0aGUKK2RlZmF1bHQgY29uZmlndXJhdGlvbiB0aGlzIHF1YWxpdHkgc3dpdGNoIGlzIGRlYWN0aXZhdGVkIGJlY2F1c2UgaXQgd291bGQgY2F1c2UKK2Egd29ya2xvYWQgaW5jcmVhc2Ugd2hpY2ggbWlnaHQgYmUgc2lnbmlmaWNhbnQuIElmIHdvcmtsb2FkIGlzIG5vdCBhbiBpc3N1ZSBpbgordGhlIGFwcGxpY2F0aW9uIHdlIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIHRoaXMgZmVhdHVyZS4gXGNvZGUKK2FhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19BRlRFUkJVUk5FUiwgMC8xKTsgXGVuZGNvZGUKIAogXHN1YnNlY3Rpb24gZW5jRUxEIEVMRCBBdXRvIENvbmZpZ3VyYXRpb24gTW9kZQotRm9yIEVMRCBjb25maWd1cmF0aW9uIGEgc28gY2FsbGVkIGF1dG8gY29uZmlndXJhdG9yIGlzIGF2YWlsYWJsZSB3aGljaCBjb25maWd1cmVzIFNCUiBhbmQgdGhlIFNCUiByYXRpbyBieSBpdHNlbGYuCi1UaGUgY29uZmlndXJhdG9yIGlzIHVzZWQgd2hlbiB0aGUgZW5jb2RlciBwYXJhbWV0ZXIgOjpBQUNFTkNfU0JSX01PREUgYW5kIDo6QUFDRU5DX1NCUl9SQVRJTyBhcmUgbm90IHNldCBleHBsaWNpdGVseS4KK0ZvciBFTEQgY29uZmlndXJhdGlvbiBhIHNvIGNhbGxlZCBhdXRvIGNvbmZpZ3VyYXRvciBpcyBhdmFpbGFibGUgd2hpY2gKK2NvbmZpZ3VyZXMgU0JSIGFuZCB0aGUgU0JSIHJhdGlvIGJ5IGl0c2VsZi4gVGhlIGNvbmZpZ3VyYXRvciBpcyB1c2VkIHdoZW4gdGhlCitlbmNvZGVyIHBhcmFtZXRlciA6OkFBQ0VOQ19TQlJfTU9ERSBhbmQgOjpBQUNFTkNfU0JSX1JBVElPIGFyZSBub3Qgc2V0CitleHBsaWNpdGx5LgogCi1CYXNlZCBvbiBzYW1wbGluZyByYXRlIGFuZCBjaG9zZW4gYml0cmF0ZSBwZXIgY2hhbm5lbCBhIHJlYXNvbmFibGUgU0JSIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB1c2VkLgotXHZlcmJhdGltCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgU2FtcGxpbmcgUmF0ZSAgfCBDaGFubmVsIEJpdHJhdGUgfCAgU0JSIHwgICAgICAgU0JSIFJhdGlvCi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KLSBdbWluLCAxNl0ga0h6ICAgfCAgICAgbWluIC0gMjc5OTkgfCAgIG9uIHwgZG93bnNhbXBsZWQgU0JSCi0gICAgICAgICAgICAgICAgIHwgICAyODAwMCAtICAgbWF4IHwgIG9mZiB8ICAgICAgICAgICAgIC0tLQotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCi0gXTE2IC0gMjRdIGtIeiAgIHwgICAgIG1pbiAtIDM5OTk5IHwgICBvbiB8IGRvd25zYW1wbGVkIFNCUgotICAgICAgICAgICAgICAgICB8ICAgNDAwMDAgLSAgIG1heCB8ICBvZmYgfCAgICAgICAgICAgICAtLS0KLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQotIF0yNCAtIDMyXSBrSHogICB8ICAgICBtaW4gLSAyNzk5OSB8ICAgb24gfCAgICBkdWFscmF0ZSBTQlIKLSAgICAgICAgICAgICAgICAgfCAgIDI4MDAwIC0gNTU5OTkgfCAgIG9uIHwgZG93bnNhbXBsZWQgU0JSCi0gICAgICAgICAgICAgICAgIHwgICA1NjAwMCAtICAgbWF4IHwgIG9mZiB8ICAgICAgICAgICAgIC0tLQotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCi0gXTMyIC0gNDQuMV0ga0h6IHwgICAgIG1pbiAtIDYzOTk5IHwgICBvbiB8ICAgIGR1YWxyYXRlIFNCUgotICAgICAgICAgICAgICAgICB8ICAgNjQwMDAgLSAgIG1heCB8ICBvZmYgfCAgICAgICAgICAgICAtLS0KLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQotIF00NC4xIC0gNDhdIGtIeiB8ICAgICBtaW4gLSA2Mzk5OSB8ICAgb24gfCAgICBkdWFscmF0ZSBTQlIKLSAgICAgICAgICAgICAgICAgfCAgIDY0MDAwIC0gbWF4ICAgfCAgb2ZmIHwgICAgICAgICAgICAgLS0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Jhc2VkIG9uIHNhbXBsaW5nIHJhdGUgYW5kIGNob3NlbiBiaXRyYXRlIGEgcmVhc29uYWJsZSBTQlIgY29uZmlndXJhdGlvbiB3aWxsIGJlCit1c2VkLiBcdmVyYmF0aW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNhbXBsaW5nIFJhdGUgfCAgIFRvdGFsIEJpdHJhdGUgfCBOby4gb2YgfCBTQlIgfCAgICAgICBTQlIgUmF0aW8KKyAgICAgW2tIel0gICAgIHwgICAgICBbYml0L3NdICAgIHwgIENoYW4gIHwgICAgIHwKKyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgIHwgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLSstLS0tLS0tLS0tLS0tLS0tLQorICAgICBdbWluLCAxNlsgfCAgICBtaW4gLSAgICBtYXggfCAgICAgIDEgfCBvZmYgfCAgICAgICAgICAgICAtLS0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIFsxNl0gfCAgICBtaW4gLSAgMjc5OTkgfCAgICAgIDEgfCAgb24gfCBkb3duc2FtcGxlZCBTQlIKKyAgICAgICAgICAgICAgIHwgIDI4MDAwIC0gICAgbWF4IHwgICAgICAxIHwgb2ZmIHwgICAgICAgICAgICAgLS0tCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgXTE2IC0gMjRdIHwgICAgbWluIC0gIDM5OTk5IHwgICAgICAxIHwgIG9uIHwgZG93bnNhbXBsZWQgU0JSCisgICAgICAgICAgICAgICB8ICA0MDAwMCAtICAgIG1heCB8ICAgICAgMSB8IG9mZiB8ICAgICAgICAgICAgIC0tLQorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCisgICAgIF0yNCAtIDMyXSB8ICAgIG1pbiAtICAyNzk5OSB8ICAgICAgMSB8ICBvbiB8ICAgIGR1YWxyYXRlIFNCUgorICAgICAgICAgICAgICAgfCAgMjgwMDAgLSAgNTU5OTkgfCAgICAgIDEgfCAgb24gfCBkb3duc2FtcGxlZCBTQlIKKyAgICAgICAgICAgICAgIHwgIDU2MDAwIC0gICAgbWF4IHwgICAgICAxIHwgb2ZmIHwgICAgICAgICAgICAgLS0tCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyAgIF0zMiAtIDQ0LjFdIHwgICAgbWluIC0gIDYzOTk5IHwgICAgICAxIHwgIG9uIHwgICAgZHVhbHJhdGUgU0JSCisgICAgICAgICAgICAgICB8ICA2NDAwMCAtICAgIG1heCB8ICAgICAgMSB8IG9mZiB8ICAgICAgICAgICAgIC0tLQorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCisgICBdNDQuMSAtIDQ4XSB8ICAgIG1pbiAtICA2Mzk5OSB8ICAgICAgMSB8ICBvbiB8ICAgIGR1YWxyYXRlIFNCUgorICAgICAgICAgICAgICAgfCAgNjQwMDAgLSAgbWF4ICAgfCAgICAgIDEgfCBvZmYgfCAgICAgICAgICAgICAtLS0KKyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgIHwgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLSstLS0tLS0tLS0tLS0tLS0tLQorICAgICBdbWluLCAxNlsgfCAgICBtaW4gLSAgICBtYXggfCAgICAgIDIgfCBvZmYgfCAgICAgICAgICAgICAtLS0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIFsxNl0gfCAgICBtaW4gLSAgMzE5OTkgfCAgICAgIDIgfCAgb24gfCBkb3duc2FtcGxlZCBTQlIKKyAgICAgICAgICAgICAgIHwgIDMyMDAwIC0gIDYzOTk5IHwgICAgICAyIHwgIG9uIHwgZG93bnNhbXBsZWQgU0JSCisgICAgICAgICAgICAgICB8ICA2NDAwMCAtICAgIG1heCB8ICAgICAgMiB8IG9mZiB8ICAgICAgICAgICAgIC0tLQorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCisgICAgIF0xNiAtIDI0XSB8ICAgIG1pbiAtICA0Nzk5OSB8ICAgICAgMiB8ICBvbiB8IGRvd25zYW1wbGVkIFNCUgorICAgICAgICAgICAgICAgfCAgNDgwMDAgLSAgNzk5OTkgfCAgICAgIDIgfCAgb24gfCBkb3duc2FtcGxlZCBTQlIKKyAgICAgICAgICAgICAgIHwgIDgwMDAwIC0gICAgbWF4IHwgICAgICAyIHwgb2ZmIHwgICAgICAgICAgICAgLS0tCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgXTI0IC0gMzJdIHwgICAgbWluIC0gIDMxOTk5IHwgICAgICAyIHwgIG9uIHwgICAgZHVhbHJhdGUgU0JSCisgICAgICAgICAgICAgICB8ICAzMjAwMCAtICA2Nzk5OSB8ICAgICAgMiB8ICBvbiB8ICAgIGR1YWxyYXRlIFNCUgorICAgICAgICAgICAgICAgfCAgNjgwMDAgLSAgOTU5OTkgfCAgICAgIDIgfCAgb24gfCBkb3duc2FtcGxlZCBTQlIKKyAgICAgICAgICAgICAgIHwgIDk2MDAwIC0gICAgbWF4IHwgICAgICAyIHwgb2ZmIHwgICAgICAgICAgICAgLS0tCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyAgIF0zMiAtIDQ0LjFdIHwgICAgbWluIC0gIDQzOTk5IHwgICAgICAyIHwgIG9uIHwgICAgZHVhbHJhdGUgU0JSCisgICAgICAgICAgICAgICB8ICA0NDAwMCAtIDEyNzk5OSB8ICAgICAgMiB8ICBvbiB8ICAgIGR1YWxyYXRlIFNCUgorICAgICAgICAgICAgICAgfCAxMjgwMDAgLSAgICBtYXggfCAgICAgIDIgfCBvZmYgfCAgICAgICAgICAgICAtLS0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQorICAgXTQ0LjEgLSA0OF0gfCAgICBtaW4gLSAgNDM5OTkgfCAgICAgIDIgfCAgb24gfCAgICBkdWFscmF0ZSBTQlIKKyAgICAgICAgICAgICAgIHwgIDQ0MDAwIC0gMTI3OTk5IHwgICAgICAyIHwgIG9uIHwgICAgZHVhbHJhdGUgU0JSCisgICAgICAgICAgICAgICB8IDEyODAwMCAtICBtYXggICB8ICAgICAgMiB8IG9mZiB8ICAgICAgICAgICAgIC0tLQorICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBcZW5kdmVyYmF0aW0KIAorXHN1YnNlY3Rpb24gZW5jRHNFTEQgUmVkdWNlZCBEZWxheSAoRG93bnNjYWxlZCkgTW9kZQorVGhlIGRvd25zY2FsZWQgbW9kZSBvZiBBQUMtRUxEIHJlZHVjZXMgdGhlIGFsZ29yaXRobWljIGRlbGF5IG9mIEFBQy1FTEQgYnkKK3ZpcnR1YWxseSBpbmNyZWFzaW5nIHRoZSBzYW1wbGluZyByYXRlLiBXaGVuIHVzaW5nIHRoZSBkb3duc2NhbGVkIG1vZGUsIHRoZQorYml0cmF0ZSBzaG91bGQgYmUgaW5jcmVhc2VkIGZvciBrZWVwaW5nIHRoZSBzYW1lIGF1ZGlvIHF1YWxpdHkgbGV2ZWwuIEZvciBjb21tb24KK3NpZ25hbHMsIHRoZSBiaXRyYXRlIHNob3VsZCBiZSBpbmNyZWFzZWQgYnkgMjUlIGZvciBhIGRvd25zY2FsZSBmYWN0b3Igb2YgMi4KKworQ3VycmVudGx5LCBkb3duc2NhbGluZyBmYWN0b3JzIDIgYW5kIDQgYXJlIHN1cHBvcnRlZC4KK1RvIGVuYWJsZSB0aGUgZG93bnNjYWxlZCBtb2RlIGluIHRoZSBlbmNvZGVyLCB0aGUgZnJhbWVsZW5ndGggcGFyYW1ldGVyCitBQUNFTkNfR1JBTlVMRV9MRU5HVEggbXVzdCBiZSBzZXQgYWNjb3JkaW5nbHkgdG8gMjU2IG9yIDI0MCBmb3IgYSBkb3duc2NhbGUKK2ZhY3RvciBvZiAyIG9yIDEyOCBvciAxMjAgZm9yIGEgZG93bnNjYWxlIGZhY3RvciBvZiA0LiBUaGUgZGVmYXVsdCB2YWx1ZXMgb2YgNTEyCitvciA0ODAgbWVhbiB0aGF0IG5vIGRvd25zY2FsaW5nIGlzIGFwcGxpZWQuIFxjb2RlCithYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfR1JBTlVMRV9MRU5HVEgsIDI1Nik7CithYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfR1JBTlVMRV9MRU5HVEgsIDEyOCk7CitcZW5kY29kZQorCitEb3duc2NhbGVkIGJpdHN0cmVhbXMgYXJlIGZ1bGx5IGJhY2t3YXJkcyBjb21wYXRpYmxlLiBIb3dldmVyLCB0aGUgbGVnYWN5CitkZWNvZGVyIG5lZWRzIHRvIHN1cHBvcnQgaGlnaCBzYW1wbGUgcmF0ZSwgZS5nLiA5NmtIei4gVGhlIHNpZ25hbGVkIHNhbXBsaW5nCityYXRlIGlzIG11bHRpcGxpZWQgYnkgdGhlIGRvd25zY2FsZSBmYWN0b3IuIEFsdGhvdWdoIG5vdCByZXF1aXJlZCwgZG93bnNjYWxpbmcKK3Nob3VsZCBiZSBhcHBsaWVkIHdoZW4gZGVjb2RpbmcgZG93bnNjYWxlZCBiaXRzdHJlYW1zLiBJdCByZWR1Y2VzIENQVSB3b3JrbG9hZAorYW5kIHRoZSBvdXRwdXQgd2lsbCBoYXZlIHRoZSBzYW1lIHNhbXBsaW5nIHJhdGUgYXMgdGhlIGlucHV0LiBJbiBhbiBpZGVhbAorY29uZmlndXJhdGlvbiBib3RoIGVuY29kZXIgYW5kIGRlY29kZXIgc2hvdWxkIHJ1biB3aXRoIHRoZSBzYW1lIGRvd25zY2FsZQorZmFjdG9yLgorCitUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIGFwcHJveGltYXRlIGZpbHRlciBiYW5rIGRlbGF5cyBpbiBtcyBmb3IgY29tbW9uCitzYW1wbGluZyByYXRlcyhzcikgYXQgZnJhbWVzaXplKGZzKSwgYW5kIGRvd25zY2FsZSBmYWN0b3IoZHNmKSwgYmFzZWQgb24gdGhpcworZm9ybXVsYTogXGZbIDEwMDAgKiBmcyAvIChkc2YgKiBzcikgXGZdCisKK1x2ZXJiYXRpbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIHwgNTEyLzIgfCA1MTIvNCB8IDQ4MC8yIHwgNDgwLzQKKy0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCisyMjA1MCB8IDE3LjQxIHwgIDguNzEgfCAxNi4zMyB8ICA4LjE2CiszMjAwMCB8IDEyLjAwIHwgIDYuMDAgfCAxMS4yNSB8ICA1LjYyCis0NDEwMCB8ICA4LjcxIHwgIDQuMzUgfCAgOC4xNiB8ICA0LjA4Cis0ODAwMCB8ICA4LjAwIHwgIDQuMDAgfCAgNy41MCB8ICAzLjc1CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorXGVuZHZlcmJhdGltCiAKIFxzZWN0aW9uIGF1ZGlvY2hDZmcgQXVkaW8gQ2hhbm5lbCBDb25maWd1cmF0aW9uCi1UaGUgTVBFRyBzdGFuZGFyZCByZWZlcnMgb2Z0ZW4gdG8gdGhlIHNvLWNhbGxlZCBDaGFubmVsIENvbmZpZ3VyYXRpb24uIFRoaXMgQ2hhbm5lbCBDb25maWd1cmF0aW9uIGlzIHVzZWQgZm9yIGEgZml4ZWQgQ2hhbm5lbAotTWFwcGluZy4gVGhlIGNvbmZpZ3VyYXRpb25zIDEtNyBhcmUgcHJlZGVmaW5lZCBpbiBNUEVHIHN0YW5kYXJkIGFuZCB1c2VkIGZvciBpbXBsaWNpdCBzaWduYWxsaW5nIHdpdGhpbiB0aGUgZW5jb2RlZCBiaXRzdHJlYW0uCi1Gb3IgdXNlciBkZWZpbmVkIENvbmZpZ3VyYXRpb25zIHRoZSBDaGFubmVsIENvbmZpZ3VyYXRpb24gaXMgc2V0IHRvIDAgYW5kIHRoZSBDaGFubmVsIE1hcHBpbmcgbXVzdCBiZSBleHBsZWNpdGx5IGRlc2NyaWJlZCB3aXRoIGFuIGFwcHJvcHJpYXRlCi1Qcm9ncmFtIENvbmZpZyBFbGVtZW50LiBUaGUgcHJlc2VudCBFbmNvZGVyIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGFsbG93IHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSB0aGlzIENoYW5uZWwgQ29uZmlndXJhdGlvbiBmcm9tCi1leHRlcm4uIFRoZSBFbmNvZGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGZpeGVkIENoYW5uZWwgTW9kZXMgd2hpY2ggYXJlIG1hcHBlZCB0byBDaGFubmVsIENvbmZpZ3VyYXRpb24gYXMgZm9sbG93LgotXHZlcmJhdGltCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gQ2hhbm5lbE1vZGUgICAgICAgICAgIHwgQ2hDZmcgIHwgZnJvbnRfRWwgICAgICB8IHNpZGVfRWwgIHwgYmFja19FbCAgfCBsZmVfRWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0KLU1PREVfMSAgICAgICAgICAgICAgICAgfCAgICAgIDEgfCBTQ0UgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8Ci1NT0RFXzIgICAgICAgICAgICAgICAgIHwgICAgICAyIHwgQ1BFICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfAotTU9ERV8xXzIgICAgICAgICAgICAgICB8ICAgICAgMyB8IFNDRSwgQ1BFICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKLU1PREVfMV8yXzEgICAgICAgICAgICAgfCAgICAgIDQgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCBTQ0UgICAgICB8Ci1NT0RFXzFfMl8yICAgICAgICAgICAgIHwgICAgICA1IHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwgQ1BFICAgICAgfAotTU9ERV8xXzJfMl8xICAgICAgICAgICB8ICAgICAgNiB8IFNDRSwgQ1BFICAgICAgfCAgICAgICAgICB8IENQRSAgICAgIHwgTEZFCi1NT0RFXzFfMl8yXzJfMSAgICAgICAgIHwgICAgICA3IHwgU0NFLCBDUEUsIENQRSB8ICAgICAgICAgIHwgQ1BFICAgICAgfCBMRkUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0KLU1PREVfN18xX1JFQVJfU1VSUk9VTkQgfCAgICAgIDAgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCBDUEUsIENQRSB8IExGRQotTU9ERV83XzFfRlJPTlRfQ0VOVEVSICB8ICAgICAgMCB8IFNDRSwgQ1BFLCBDUEUgfCAgICAgICAgICB8IENQRSAgICAgIHwgTEZFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gLSBTQ0U6IFNpbmdsZSBDaGFubmVsIEVsZW1lbnQuCi0gLSBDUEU6IENoYW5uZWwgUGFpci4KLSAtIFNDRTogTG93IEZyZXF1ZW5jeSBFbGVtZW50LgotXGVuZHZlcmJhdGltCitUaGUgTVBFRyBzdGFuZGFyZCByZWZlcnMgb2Z0ZW4gdG8gdGhlIHNvLWNhbGxlZCBDaGFubmVsIENvbmZpZ3VyYXRpb24uIFRoaXMKK0NoYW5uZWwgQ29uZmlndXJhdGlvbiBpcyB1c2VkIGZvciBhIGZpeGVkIENoYW5uZWwgTWFwcGluZy4gVGhlIGNvbmZpZ3VyYXRpb25zCisxLTcgYW5kIDExLDEyLDE0IGFyZSBwcmVkZWZpbmVkIGluIE1QRUcgc3RhbmRhcmQgYW5kIHVzZWQgZm9yIGltcGxpY2l0CitzaWduYWxsaW5nIHdpdGhpbiB0aGUgZW5jb2RlZCBiaXRzdHJlYW0uIEZvciB1c2VyIGRlZmluZWQgQ29uZmlndXJhdGlvbnMgdGhlCitDaGFubmVsIENvbmZpZ3VyYXRpb24gaXMgc2V0IHRvIDAgYW5kIHRoZSBDaGFubmVsIE1hcHBpbmcgbXVzdCBiZSBleHBsZWNpdGx5CitkZXNjcmliZWQgd2l0aCBhbiBhcHByb3ByaWF0ZSBQcm9ncmFtIENvbmZpZyBFbGVtZW50LiBUaGUgcHJlc2VudCBFbmNvZGVyCitpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyB0aGUgdXNlciB0byBjb25maWd1cmUgdGhpcyBDaGFubmVsIENvbmZpZ3VyYXRpb24KK2Zyb20gZXh0ZXJuLiBUaGUgRW5jb2RlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBmaXhlZCBDaGFubmVsIE1vZGVzIHdoaWNoIGFyZQorbWFwcGVkIHRvIENoYW5uZWwgQ29uZmlndXJhdGlvbiBhcyBmb2xsb3cuIFx2ZXJiYXRpbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENoYW5uZWxNb2RlICAgICAgICAgICB8IENoQ2ZnIHwgSGVpZ2h0IHwgZnJvbnRfRWwgICAgICB8IHNpZGVfRWwgIHwgYmFja19FbCAgfAorbGZlX0VsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tCitNT0RFXzEgICAgICAgICAgICAgICAgIHwgICAgIDEgfCBOT1JNICAgfCBTQ0UgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8CitNT0RFXzIgICAgICAgICAgICAgICAgIHwgICAgIDIgfCBOT1JNICAgfCBDUEUgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8CitNT0RFXzFfMiAgICAgICAgICAgICAgIHwgICAgIDMgfCBOT1JNICAgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8CitNT0RFXzFfMl8xICAgICAgICAgICAgIHwgICAgIDQgfCBOT1JNICAgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCBTQ0UgICAgICB8CitNT0RFXzFfMl8yICAgICAgICAgICAgIHwgICAgIDUgfCBOT1JNICAgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCBDUEUgICAgICB8CitNT0RFXzFfMl8yXzEgICAgICAgICAgIHwgICAgIDYgfCBOT1JNICAgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCBDUEUgICAgICB8CitMRkUgTU9ERV8xXzJfMl8yXzEgICAgICAgICB8ICAgICA3IHwgTk9STSAgIHwgU0NFLCBDUEUsIENQRSB8ICAgICAgICAgIHwgQ1BFCit8IExGRSBNT0RFXzZfMSAgICAgICAgICAgICAgIHwgICAgMTEgfCBOT1JNICAgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCBDUEUsCitTQ0UgfCBMRkUgTU9ERV83XzFfQkFDSyAgICAgICAgICB8ICAgIDEyIHwgTk9STSAgIHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwKK0NQRSwgQ1BFIHwgTEZFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tCitNT0RFXzdfMV9UT1BfRlJPTlQgICAgIHwgICAgMTQgfCBOT1JNICAgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCBDUEUgICAgICB8CitMRkUgfCAgICAgICB8IFRPUCAgICB8IENQRSAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0KK01PREVfN18xX1JFQVJfU1VSUk9VTkQgfCAgICAgMCB8IE5PUk0gICB8IFNDRSwgQ1BFICAgICAgfCAgICAgICAgICB8IENQRSwgQ1BFIHwKK0xGRSBNT0RFXzdfMV9GUk9OVF9DRU5URVIgIHwgICAgIDAgfCBOT1JNICAgfCBTQ0UsIENQRSwgQ1BFIHwgICAgICAgICAgfCBDUEUKK3wgTEZFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistIE5PUk06IE5vcm1hbCBIZWlnaHQgTGF5ZXIuICAgICAtIFRPUDogVG9wIEhlaWdodCBMYXllci4gIC0gQlRNOiBCb3R0b20gSGVpZ2h0CitMYXllci4KKy0gU0NFOiBTaW5nbGUgQ2hhbm5lbCBFbGVtZW50LiAgIC0gQ1BFOiBDaGFubmVsIFBhaXIuICAgICAgLSBMRkU6IExvdyBGcmVxdWVuY3kKK0VsZW1lbnQuIFxlbmR2ZXJiYXRpbQogCi1Nb3Jlb3ZlciwgdGhlIFRhYmxlIGRlc2NyaWJlcyBhbGwgZml4ZWQgQ2hhbm5lbCBFbGVtZW50cyBmb3IgZWFjaCBDaGFubmVsIE1vZGUgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGEgc3BlYWtlciBhcnJhbmdlbWVudC4gVGhlCi1hcnJhbmdlbWVudCBpbmNsdWRlcyBmcm9udCwgc2lkZSwgYmFjayBhbmQgbGZlIEF1ZGlvIENoYW5uZWwgRWxlbWVudHMuXG4KLVRoaXMgbWFwcGluZyBvZiBBdWRpbyBDaGFubmVsIEVsZW1lbnRzIGlzIGRlZmluZWQgaW4gTVBFRyBzdGFuZGFyZCBmb3IgQ2hhbm5lbCBDb25maWcgMS03LiBUaGUgQ2hhbm5lbCBhc3NpZ25tZW50IGZvciBNT0RFXzFfMSwKLU1PREVfMl8yIGFuZCBNT0RFXzJfMSBpcyB1c2VkIGZyb20gdGhlIEFSSUIgc3RhbmRhcmQuIEFsbCBvdGhlciBjb25maWd1cmF0aW9ucyBhcmUgZGVmaW5lZCBhcyBzdWdnZXN0ZWQgaW4gTVBFRy5cbgotSW4gY2FzZSBvZiBDaGFubmVsIENvbmZpZyAwIG9yIHdyaXRpbmcgbWF0cml4IG1peGRvd24gY29lZmZpY2llbnRzLCB0aGUgZW5jb2RlciBlbmFibGVzIHRoZSB3cml0aW5nIG9mIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQKLWl0c2VsZiBhcyBkZXNjcmliZWQgaW4gXHJlZiBlbmNQQ0UuIFRoZSBjb25maWd1cmF0aW9uIHVzZWQgaW4gUHJvZ3JhbSBDb25maWcgRWxlbWVudCByZWZlcnMgdG8gdGhlIGRlbm90ZWQgVGFibGUuXG4KLUJlc2lkZSB0aGUgQ2hhbm5lbCBFbGVtZW50IGFzc2lnbm1lbnQgdGhlIENoYW5uZWwgTW9kZXMgYXJlIHJlc3Bvc2libGUgZm9yIGF1ZGlvIGlucHV0IGRhdGEgY2hhbm5lbCBtYXBwaW5nLiBUaGUgQ2hhbm5lbCBNYXBwaW5nCi1vZiB0aGUgYXVkaW8gZGF0YSBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCA6OkFBQ0VOQ19DSEFOTkVMT1JERVIgd2hpY2ggY2FuIGJlIE1QRUcgb3IgV0FWIGxpa2Ugb3JkZXIuXG4KLUZvbGxvd2luZyBUYWJsZSBkZXNjcmliZXMgdGhlIGNvbXBsZXRlIGNoYW5uZWwgbWFwcGluZyBmb3IgYm90aCBDaGFubmVsIE9yZGVyIGNvbmZpZ3VyYXRpb25zLgorVGhlIFRhYmxlIGRlc2NyaWJlcyBhbGwgZml4ZWQgQ2hhbm5lbCBFbGVtZW50cyBmb3IgZWFjaCBDaGFubmVsIE1vZGUgd2hpY2ggYXJlCithc3NpZ25lZCB0byBhIHNwZWFrZXIgYXJyYW5nZW1lbnQuIFRoZSBhcnJhbmdlbWVudCBpbmNsdWRlcyBmcm9udCwgc2lkZSwgYmFjaworYW5kIGxmZSBBdWRpbyBDaGFubmVsIEVsZW1lbnRzIGluIHRoZSBub3JtYWwgaGVpZ2h0IGxheWVyLCBwb3NzaWJseSBmb2xsb3dlZCBieQorZnJvbnQsIHNpZGUsIGFuZCBiYWNrIGVsZW1lbnRzIGluIHRoZSB0b3AgYW5kIGJvdHRvbSBsYXllciAoQ2hhbm5lbAorQ29uZmlndXJhdGlvbiAxNCkuIFxuIFRoaXMgbWFwcGluZyBvZiBBdWRpbyBDaGFubmVsIEVsZW1lbnRzIGlzIGRlZmluZWQgaW4gTVBFRworc3RhbmRhcmQgZm9yIENoYW5uZWwgQ29uZmlnIDEtNyBhbmQgMTEsMTIsMTQuXG4gSW4gY2FzZSBvZiBDaGFubmVsIENvbmZpZyAwIG9yCit3cml0aW5nIG1hdHJpeCBtaXhkb3duIGNvZWZmaWNpZW50cywgdGhlIGVuY29kZXIgZW5hYmxlcyB0aGUgd3JpdGluZyBvZiBQcm9ncmFtCitDb25maWcgRWxlbWVudCBpdHNlbGYgYXMgZGVzY3JpYmVkIGluIFxyZWYgZW5jUENFLiBUaGUgY29uZmlndXJhdGlvbiB1c2VkIGluCitQcm9ncmFtIENvbmZpZyBFbGVtZW50IHJlZmVycyB0byB0aGUgZGVub3RlZCBUYWJsZS5cbiBCZXNpZGUgdGhlIENoYW5uZWwgRWxlbWVudAorYXNzaWdubWVudCB0aGUgQ2hhbm5lbCBNb2RlcyBhcmUgcmVzcG9zaWJsZSBmb3IgYXVkaW8gaW5wdXQgZGF0YSBjaGFubmVsCittYXBwaW5nLiBUaGUgQ2hhbm5lbCBNYXBwaW5nIG9mIHRoZSBhdWRpbyBkYXRhIGRlcGVuZHMgb24gdGhlIHNlbGVjdGVkCis6OkFBQ0VOQ19DSEFOTkVMT1JERVIgd2hpY2ggY2FuIGJlIE1QRUcgb3IgV0FWIGxpa2Ugb3JkZXIuXG4gRm9sbG93aW5nIHRhYmxlCitkZXNjcmliZXMgdGhlIGNvbXBsZXRlIGNoYW5uZWwgbWFwcGluZyBmb3IgYm90aCBDaGFubmVsIE9yZGVyIGNvbmZpZ3VyYXRpb25zLgogXHZlcmJhdGltCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENoYW5uZWxNb2RlICAgICAgICAgICAgfCAgTVBFRy1DaGFubmVsb3JkZXIgICAgICAgICAgICB8ICBXQVYtQ2hhbm5lbG9yZGVyCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KLU1PREVfMSAgICAgICAgICAgICAgICAgfCAwIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgICB8IDAgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfAotTU9ERV8yICAgICAgICAgICAgICAgICB8IDAgfCAxIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgMCB8IDEgfCAgIHwgICB8ICAgfCAgIHwgICB8Ci1NT0RFXzFfMiAgICAgICAgICAgICAgIHwgMCB8IDEgfCAyIHwgICB8ICAgfCAgIHwgICB8ICAgfCAyIHwgMCB8IDEgfCAgIHwgICB8ICAgfCAgIHwKLU1PREVfMV8yXzEgICAgICAgICAgICAgfCAwIHwgMSB8IDIgfCAzIHwgICB8ICAgfCAgIHwgICB8IDIgfCAwIHwgMSB8IDMgfCAgIHwgICB8ICAgfAotTU9ERV8xXzJfMiAgICAgICAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgICB8ICAgfCAgIHwgMiB8IDAgfCAxIHwgMyB8IDQgfCAgIHwgICB8Ci1NT0RFXzFfMl8yXzEgICAgICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgICB8ICAgfCAyIHwgMCB8IDEgfCA0IHwgNSB8IDMgfCAgIHwKLU1PREVfMV8yXzJfMl8xICAgICAgICAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDIgfCA2IHwgNyB8IDAgfCAxIHwgNCB8IDUgfCAzCitNT0RFXzEgICAgICAgICAgICAgICAgIHwgMCB8ICAgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfCAwIHwgICB8ICAgfCAgIHwgICB8ICAgfAorfCBNT0RFXzIgICAgICAgICAgICAgICAgIHwgMCB8IDEgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfCAwIHwgMSB8ICAgfCAgIHwgICB8Cit8ICAgfCBNT0RFXzFfMiAgICAgICAgICAgICAgIHwgMCB8IDEgfCAyIHwgICB8ICAgfCAgIHwgICB8ICAgfCAyIHwgMCB8IDEgfCAgIHwKK3wgICB8ICAgfCBNT0RFXzFfMl8xICAgICAgICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8ICAgfCAgIHwgICB8ICAgfCAyIHwgMCB8IDEgfCAzCit8ICAgfCAgIHwgICB8IE1PREVfMV8yXzIgICAgICAgICAgICAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8ICAgfCAgIHwgICB8IDIgfCAwIHwgMQorfCAzIHwgNCB8ICAgfCAgIHwgTU9ERV8xXzJfMl8xICAgICAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8ICAgfCAgIHwgMiB8IDAKK3wgMSB8IDQgfCA1IHwgMyB8ICAgfCBNT0RFXzFfMl8yXzJfMSAgICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCAyCit8IDYgfCA3IHwgMCB8IDEgfCA0IHwgNSB8IDMgTU9ERV82XzEgICAgICAgICAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfAorfCAyIHwgMCB8IDEgfCA0IHwgNSB8IDYgfCAzIHwgTU9ERV83XzFfQkFDSyAgICAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYKK3wgNyB8IDIgfCAwIHwgMSB8IDYgfCA3IHwgNCB8IDUgfCAzIE1PREVfN18xX1RPUF9GUk9OVCAgICAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8Cis1IHwgNiB8IDcgfCAyIHwgMCB8IDEgfCA0IHwgNSB8IDMgfCA2IHwgNwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCi1NT0RFXzdfMV9SRUFSX1NVUlJPVU5EIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCAyIHwgMCB8IDEgfCA2IHwgNyB8IDQgfCA1IHwgMwotTU9ERV83XzFfRlJPTlRfQ0VOVEVSICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgMiB8IDYgfCA3IHwgMCB8IDEgfCA0IHwgNSB8IDMKK01PREVfN18xX1JFQVJfU1VSUk9VTkQgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDIgfCAwIHwgMSB8IDYgfCA3IHwgNCB8Cis1IHwgMyBNT0RFXzdfMV9GUk9OVF9DRU5URVIgIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCAyIHwgNiB8IDcgfCAwIHwgMQorfCA0IHwgNSB8IDMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogXGVuZHZlcmJhdGltCiAKLVRoZSBkZW5vdGVkIG1hcHBpbmcgaXMgaW1wb3J0YW50IGZvciBjb3JyZWN0IGF1ZGlvIGNoYW5uZWwgYXNzaWdubWVudCB3aGVuIHVzaW5nIE1QRUcgb3IgV0FWIG9yZGVyaW5nLiBUaGUgaW5jb21pbmcgYXVkaW8KLWNoYW5uZWxzIGFyZSBkaXN0cmlidXRlZCBNUEVHIGxpa2Ugc3RhcnRpbmcgYXQgdGhlIGZyb250IGNoYW5uZWxzIGFuZCBlbmRpbmcgYXQgdGhlIGJhY2sgY2hhbm5lbHMuIFRoZSBkaXN0cmlidXRpb24gaXMgdXNlZCBhcwotZGVzY3JpYmVkIGluIFRhYmxlIGNvbmNlcmluZyBDaGFubmVsIENvbmZpZyBhbmQgZml4IGNoYW5uZWwgZWxlbWVudHMuIFBsZWFzZSBzZWUgdGhlIGZvbGxvd2luZyBleGFtcGxlIGZvciBjbGFyaWZpY2F0aW9uLgorVGhlIGRlbm90ZWQgbWFwcGluZyBpcyBpbXBvcnRhbnQgZm9yIGNvcnJlY3QgYXVkaW8gY2hhbm5lbCBhc3NpZ25tZW50IHdoZW4gdXNpbmcKK01QRUcgb3IgV0FWIG9yZGVyaW5nLiBUaGUgaW5jb21pbmcgYXVkaW8gY2hhbm5lbHMgYXJlIGRpc3RyaWJ1dGVkIE1QRUcgbGlrZQorc3RhcnRpbmcgYXQgdGhlIGZyb250IGNoYW5uZWxzIGFuZCBlbmRpbmcgYXQgdGhlIGJhY2sgY2hhbm5lbHMuIFRoZSBkaXN0cmlidXRpb24KK2lzIHVzZWQgYXMgZGVzY3JpYmVkIGluIFRhYmxlIGNvbmNlcmluZyBDaGFubmVsIENvbmZpZyBhbmQgZml4IGNoYW5uZWwgZWxlbWVudHMuCitQbGVhc2Ugc2VlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBmb3IgY2xhcmlmaWNhdGlvbi4KIAogXHZlcmJhdGltCiBFeGFtcGxlOiBNT0RFXzFfMl8yXzEgLSBXQVYtQ2hhbm5lbG9yZGVyIDUuMQpAQCAtNDQ0LDIwMSArNjg0LDI3NiBAQAogXHNlY3Rpb24gc3VwcEJpdHJhdGVzIFN1cHBvcnRlZCBCaXRyYXRlcwogCiBUaGUgRkRLIEFBQyBFbmNvZGVyIHByb3ZpZGVzIGEgd2lkZSByYW5nZSBvZiBzdXBwb3J0ZWQgYml0cmF0ZXMuCi1UaGUgbWluaW11bSBhbmQgbWF4aW11bSBhbGxvd2VkIGJpdHJhdGUgZGVwZW5kcyBvbiB0aGUgQXVkaW8gT2JqZWN0IFR5cGUuIEZvciBBQUMtTEMgdGhlIG1pbmltdW0KLWJpdHJhdGUgaXMgdGhlIGJpdHJhdGUgdGhhdCBpcyByZXF1aXJlZCB0byB3cml0ZSB0aGUgbW9zdCBiYXNpYyBhbmQgbWluaW1hbCB2YWxpZCBiaXRzdHJlYW0uCi1JdCBjb25zaXN0cyBvZiB0aGUgYml0c3RyZWFtIGZvcm1hdCBoZWFkZXIgaW5mb3JtYXRpb24gYW5kIG90aGVyIHN0YXRpYy9tYW5kYXRvcnkgaW5mb3JtYXRpb24KLXdpdGhpbiB0aGUgQUFDIHBheWxvYWQuIFRoZSBtYXhpbXVtIEFBQyBmcmFtZXNpemUgYWxsb3dlZCBieSB0aGUgTVBFRy00IHN0YW5kYXJkCi1kZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGFsbG93ZWQgYml0cmF0ZSBmb3IgQUFDLUxDLiBGb3IgSEUtQUFDIGFuZCBIRS1BQUMgdjIgYSBsaWJyYXJ5IGludGVybmFsCi1sb29rLXVwIHRhYmxlIGlzIHVzZWQuCitUaGUgbWluaW11bSBhbmQgbWF4aW11bSBhbGxvd2VkIGJpdHJhdGUgZGVwZW5kcyBvbiB0aGUgQXVkaW8gT2JqZWN0IFR5cGUuIEZvcgorQUFDLUxDIHRoZSBtaW5pbXVtIGJpdHJhdGUgaXMgdGhlIGJpdHJhdGUgdGhhdCBpcyByZXF1aXJlZCB0byB3cml0ZSB0aGUgbW9zdAorYmFzaWMgYW5kIG1pbmltYWwgdmFsaWQgYml0c3RyZWFtLiBJdCBjb25zaXN0cyBvZiB0aGUgYml0c3RyZWFtIGZvcm1hdCBoZWFkZXIKK2luZm9ybWF0aW9uIGFuZCBvdGhlciBzdGF0aWMvbWFuZGF0b3J5IGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgQUFDIHBheWxvYWQuIFRoZQorbWF4aW11bSBBQUMgZnJhbWVzaXplIGFsbG93ZWQgYnkgdGhlIE1QRUctNCBzdGFuZGFyZCBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtCithbGxvd2VkIGJpdHJhdGUgZm9yIEFBQy1MQy4gRm9yIEhFLUFBQyBhbmQgSEUtQUFDIHYyIGEgbGlicmFyeSBpbnRlcm5hbCBsb29rLXVwCit0YWJsZSBpcyB1c2VkLgogCi1BIGdvb2Qgd29ya2luZyBwb2ludCBpbiB0ZXJtcyBvZiBhdWRpbyBxdWFsaXR5LCBzYW1wbGluZyByYXRlIGFuZCBiaXRyYXRlLCBpcyBhdCAxIHRvIDEuNQotYml0cy9hdWRpbyBzYW1wbGUgZm9yIEFBQy1MQywgMC42MjUgYml0cy9hdWRpbyBzYW1wbGUgZm9yIGR1YWxyYXRlIEhFLUFBQywgMS4xMjUgYml0cy9hdWRpbyBzYW1wbGUKLWZvciBkb3duc2FtcGxlZCBIRS1BQUMgYW5kIDAuNSBiaXRzL2F1ZGlvIHNhbXBsZSBmb3IgSEUtQUFDIHYyLgotRm9yIGV4YW1wbGUgZm9yIG9uZSBjaGFubmVsIHdpdGggYSBzYW1wbGluZyBmcmVxdWVuY3kgb2YgNDgga0h6LCB0aGUgcmFuZ2UgZnJvbQotNDgga2JpdC9zIHRvIDcyIGtiaXQvcyBhY2hpZXZlcyByZWFzb25hYmxlIGF1ZGlvIHF1YWxpdHkgZm9yIEFBQy1MQy4KK0EgZ29vZCB3b3JraW5nIHBvaW50IGluIHRlcm1zIG9mIGF1ZGlvIHF1YWxpdHksIHNhbXBsaW5nIHJhdGUgYW5kIGJpdHJhdGUsIGlzIGF0CisxIHRvIDEuNSBiaXRzL2F1ZGlvIHNhbXBsZSBmb3IgQUFDLUxDLCAwLjYyNSBiaXRzL2F1ZGlvIHNhbXBsZSBmb3IgZHVhbHJhdGUKK0hFLUFBQywgMS4xMjUgYml0cy9hdWRpbyBzYW1wbGUgZm9yIGRvd25zYW1wbGVkIEhFLUFBQyBhbmQgMC41IGJpdHMvYXVkaW8gc2FtcGxlCitmb3IgSEUtQUFDIHYyLiBGb3IgZXhhbXBsZSBmb3Igb25lIGNoYW5uZWwgd2l0aCBhIHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiA0OCBrSHosCit0aGUgcmFuZ2UgZnJvbSA0OCBrYml0L3MgdG8gNzIga2JpdC9zIGFjaGlldmVzIHJlYXNvbmFibGUgYXVkaW8gcXVhbGl0eSBmb3IKK0FBQy1MQy4KIAotRm9yIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHRoZSBsb3dlc3QgcG9zc2libGUgYXVkaW8gaW5wdXQgc2FtcGxpbmcgZnJlcXVlbmN5IGlzIDE2IGtIeiBiZWNhdXNlIHRoZW4gdGhlCi1BQUMtTEMgY29yZSBlbmNvZGVyIG9wZXJhdGVzIGluIGR1YWwgcmF0ZSBtb2RlIGF0IGl0cyBsb3dlc3QgcG9zc2libGUgc2FtcGxpbmcgZnJlcXVlbmN5LCB3aGljaCBpcyA4IGtIei4KLUhFLUFBQyB2MiByZXF1aXJlcyBzdGVyZW8gaW5wdXQgYXVkaW8gZGF0YS4KK0ZvciBIRS1BQUMgYW5kIEhFLUFBQyB2MiB0aGUgbG93ZXN0IHBvc3NpYmxlIGF1ZGlvIGlucHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSBpcworMTYga0h6IGJlY2F1c2UgdGhlbiB0aGUgQUFDLUxDIGNvcmUgZW5jb2RlciBvcGVyYXRlcyBpbiBkdWFsIHJhdGUgbW9kZSBhdCBpdHMKK2xvd2VzdCBwb3NzaWJsZSBzYW1wbGluZyBmcmVxdWVuY3ksIHdoaWNoIGlzIDgga0h6LiBIRS1BQUMgdjIgcmVxdWlyZXMgc3RlcmVvCitpbnB1dCBhdWRpbyBkYXRhLgogCi1QbGVhc2Ugbm90ZSB0aGF0IGluIEhFLUFBQyBvciBIRS1BQUMgdjIgbW9kZSB0aGUgZW5jb2RlciBzdXBwb3J0cyBtdWNoIGhpZ2hlciBiaXRyYXRlcyB0aGFuIGFyZQotYXBwcm9wcmlhdGUgZm9yIEhFLUFBQyBvciBIRS1BQUMgdjIuIEZvciBleGFtcGxlLCBhdCBhIGJpdHJhdGUgb2YgbW9yZSB0aGFuIDY0IGtiaXQvcyBmb3IgYSBzdGVyZW8KLWF1ZGlvIHNpZ25hbCBhdCA0NC4xIGtIeiBpdCB1c3VhbGx5IG1ha2VzIHNlbnNlIHRvIHVzZSBBQUMtTEMsIHdoaWNoIHdpbGwgcHJvZHVjZSBiZXR0ZXIgYXVkaW8KLXF1YWxpdHkgYXQgdGhhdCBiaXRyYXRlIHRoYW4gSEUtQUFDIG9yIEhFLUFBQyB2Mi4KK1BsZWFzZSBub3RlIHRoYXQgaW4gSEUtQUFDIG9yIEhFLUFBQyB2MiBtb2RlIHRoZSBlbmNvZGVyIHN1cHBvcnRzIG11Y2ggaGlnaGVyCitiaXRyYXRlcyB0aGFuIGFyZSBhcHByb3ByaWF0ZSBmb3IgSEUtQUFDIG9yIEhFLUFBQyB2Mi4gRm9yIGV4YW1wbGUsIGF0IGEgYml0cmF0ZQorb2YgbW9yZSB0aGFuIDY0IGtiaXQvcyBmb3IgYSBzdGVyZW8gYXVkaW8gc2lnbmFsIGF0IDQ0LjEga0h6IGl0IHVzdWFsbHkgbWFrZXMKK3NlbnNlIHRvIHVzZSBBQUMtTEMsIHdoaWNoIHdpbGwgcHJvZHVjZSBiZXR0ZXIgYXVkaW8gcXVhbGl0eSBhdCB0aGF0IGJpdHJhdGUKK3RoYW4gSEUtQUFDIG9yIEhFLUFBQyB2Mi4KIAogXHNlY3Rpb24gcmVvbW1lbmRlZENvbmZpZyBSZWNvbW1lbmRlZCBTYW1wbGluZyBSYXRlIGFuZCBCaXRyYXRlIENvbWJpbmF0aW9ucwogCi1UaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHJlY29tbWVuZGVkIGVuY29kZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi13aGljaCB3ZSBkZXRlcm1pbmVkIGJ5IHZpcnR1ZSBvZiBudW1lcm91cyBsaXN0ZW5pbmcgdGVzdHMuCitUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHJlY29tbWVuZGVkIGVuY29kZXIgY29uZmlndXJhdGlvbgorcGFyYW1ldGVycyB3aGljaCB3ZSBkZXRlcm1pbmVkIGJ5IHZpcnR1ZSBvZiBudW1lcm91cyBsaXN0ZW5pbmcgdGVzdHMuCiAKIFxzdWJzZWN0aW9uIHJlb21tZW5kZWRDb25maWdMQyBBQUMtTEMsIEhFLUFBQywgSEUtQUFDdjIgaW4gRHVhbHJhdGUgU0JSIG1vZGUuCiBcdmVyYmF0aW0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BdWRpbyBPYmplY3QgVHlwZSAgfCAgQml0IFJhdGUgUmFuZ2UgIHwgICAgICAgICAgICBTdXBwb3J0ZWQgIHwgUHJlZmVycmVkICB8IE5vLiBvZgotICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBbYml0L3NdICB8ICAgICAgIFNhbXBsaW5nIFJhdGVzICB8ICAgIFNhbXBsLiAgfCAgQ2hhbi4KLSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBba0h6XSAgfCAgICAgIFJhdGUgIHwKLSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgW2tIel0gIHwKK0F1ZGlvIE9iamVjdCBUeXBlICB8ICBCaXQgUmF0ZSBSYW5nZSAgfCAgICAgICAgICAgIFN1cHBvcnRlZCAgfCBQcmVmZXJyZWQgIHwgTm8uCitvZiB8ICAgICAgICAgW2JpdC9zXSAgfCAgICAgICBTYW1wbGluZyBSYXRlcyAgfCAgICBTYW1wbC4gIHwgIENoYW4uIHwKK3wgICAgICAgICAgICAgICAgW2tIel0gIHwgICAgICBSYXRlICB8IHwgICAgICAgICAgICAgICAgICB8Cit8ICAgICBba0h6XSAgfAogLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KLUFBQyBMQyArIFNCUiArIFBTICB8ICAgODAwMCAtICAxMTk5OSAgfCAgICAgICAgIDIyLjA1LCAyNC4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAyCi1BQUMgTEMgKyBTQlIgKyBQUyAgfCAgMTIwMDAgLSAgMTc5OTkgIHwgICAgICAgICAgICAgICAgMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMgotQUFDIExDICsgU0JSICsgUFMgIHwgIDE4MDAwIC0gIDM5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDIKLUFBQyBMQyArIFNCUiArIFBTICB8ICA0MDAwMCAtICA1NjAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAyCitBQUMgTEMgKyBTQlIgKyBQUyAgfCAgIDgwMDAgLSAgMTE5OTkgIHwgICAgICAgICAyMi4wNSwgMjQuMDAgIHwgICAgIDI0LjAwICB8IDIKK0FBQyBMQyArIFNCUiArIFBTICB8ICAxMjAwMCAtICAxNzk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwgMgorQUFDIExDICsgU0JSICsgUFMgIHwgIDE4MDAwIC0gIDM5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAyCitBQUMgTEMgKyBTQlIgKyBQUyAgfCAgNDAwMDAgLSAgNjQwMDAgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ4LjAwICB8IDIKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1BQUMgTEMgKyBTQlIgICAgICAgfCAgIDgwMDAgLSAgMTE5OTkgIHwgICAgICAgICAyMi4wNSwgMjQuMDAgIHwgICAgIDI0LjAwICB8ICAgICAgMQotQUFDIExDICsgU0JSICAgICAgIHwgIDEyMDAwIC0gIDE3OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDEKLUFBQyBMQyArIFNCUiAgICAgICB8ICAxODAwMCAtICAzOTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAxCi1BQUMgTEMgKyBTQlIgICAgICAgfCAgNDAwMDAgLSAgNTYwMDAgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMQotQUFDIExDICsgU0JSICAgICAgIHwgIDE2MDAwIC0gIDI3OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKLUFBQyBMQyArIFNCUiAgICAgICB8ICAyODAwMCAtICA2Mzk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCi1BQUMgTEMgKyBTQlIgICAgICAgfCAgNjQwMDAgLSAxMjgwMDAgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMgorQUFDIExDICsgU0JSICAgICAgIHwgICA4MDAwIC0gIDExOTk5ICB8ICAgICAgICAgMjIuMDUsIDI0LjAwICB8ICAgICAyNC4wMCAgfCAxCitBQUMgTEMgKyBTQlIgICAgICAgfCAgMTIwMDAgLSAgMTc5OTkgIHwgICAgICAgICAgICAgICAgMzIuMDAgIHwgICAgIDMyLjAwICB8IDEKK0FBQyBMQyArIFNCUiAgICAgICB8ICAxODAwMCAtICAzOTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgMQorQUFDIExDICsgU0JSICAgICAgIHwgIDQwMDAwIC0gIDY0MDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAxCiAtLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotQUFDIExDICsgU0JSICAgICAgIHwgIDY0MDAwIC0gIDY5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCA1LCA1LjEKLUFBQyBMQyArIFNCUiAgICAgICB8ICA3MDAwMCAtIDE1OTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgNSwgNS4xCi1BQUMgTEMgKyBTQlIgICAgICAgfCAxNjAwMDAgLSAyNDU5OTkgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgNQotQUFDIExDICsgU0JSICAgICAgIHwgMTYwMDAwIC0gMjY1OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICA1LjEKK0FBQyBMQyArIFNCUiAgICAgICB8ICAxNjAwMCAtICAyNzk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgMzIuMDAgIHwgMgorQUFDIExDICsgU0JSICAgICAgIHwgIDI4MDAwIC0gIDYzOTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAyCitBQUMgTEMgKyBTQlIgICAgICAgfCAgNjQwMDAgLSAxMjgwMDAgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ4LjAwICB8IDIKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1BQUMgTEMgICAgICAgICAgICAgfCAgIDgwMDAgLSAgMTU5OTkgIHwgMTEuMDI1LCAxMi4wMCwgMTYuMDAgIHwgICAgIDEyLjAwICB8ICAgICAgMQotQUFDIExDICAgICAgICAgICAgIHwgIDE2MDAwIC0gIDIzOTk5ICB8ICAgICAgICAgICAgICAgIDE2LjAwICB8ICAgICAxNi4wMCAgfCAgICAgIDEKLUFBQyBMQyAgICAgICAgICAgICB8ICAyNDAwMCAtICAzMTk5OSAgfCAgMTYuMDAsIDIyLjA1LCAyNC4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAxCi1BQUMgTEMgICAgICAgICAgICAgfCAgMzIwMDAgLSAgNTU5OTkgIHwgICAgICAgICAgICAgICAgMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMQotQUFDIExDICAgICAgICAgICAgIHwgIDU2MDAwIC0gMTYwMDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDEKLUFBQyBMQyAgICAgICAgICAgICB8IDE2MDAwMSAtIDI4ODAwMCAgfCAgICAgICAgICAgICAgICA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCitBQUMgTEMgKyBTQlIgICAgICAgfCAgNjQwMDAgLSAgNjk5OTkgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDMyLjAwICB8Cis1LCA1LjEgQUFDIExDICsgU0JSICAgICAgIHwgIDcwMDAwIC0gMjM5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMAorfCA1LCA1LjEgQUFDIExDICsgU0JSICAgICAgIHwgMjQwMDAwIC0gMzE5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8Cis0OC4wMCAgfCA1LCA1LjEKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1BQUMgTEMgICAgICAgICAgICAgfCAgMTYwMDAgLSAgMjM5OTkgIHwgMTEuMDI1LCAxMi4wMCwgMTYuMDAgIHwgICAgIDEyLjAwICB8ICAgICAgMgotQUFDIExDICAgICAgICAgICAgIHwgIDI0MDAwIC0gIDMxOTk5ICB8ICAgICAgICAgICAgICAgIDE2LjAwICB8ICAgICAxNi4wMCAgfCAgICAgIDIKLUFBQyBMQyAgICAgICAgICAgICB8ICAzMjAwMCAtICAzOTk5OSAgfCAgMTYuMDAsIDIyLjA1LCAyNC4wMCAgfCAgICAgMjIuMDUgIHwgICAgICAyCi1BQUMgTEMgICAgICAgICAgICAgfCAgNDAwMDAgLSAgOTU5OTkgIHwgICAgICAgICAgICAgICAgMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMgotQUFDIExDICAgICAgICAgICAgIHwgIDk2MDAwIC0gMTExOTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKLUFBQyBMQyAgICAgICAgICAgICB8IDExMjAwMCAtIDMyMDAwMSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCi1BQUMgTEMgICAgICAgICAgICAgfCAzMjAwMDIgLSA1NzYwMDAgIHwgICAgICAgICAgICAgICAgNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMgorQUFDIExDICAgICAgICAgICAgIHwgICA4MDAwIC0gIDE1OTk5ICB8IDExLjAyNSwgMTIuMDAsIDE2LjAwICB8ICAgICAxMi4wMCAgfCAxCitBQUMgTEMgICAgICAgICAgICAgfCAgMTYwMDAgLSAgMjM5OTkgIHwgICAgICAgICAgICAgICAgMTYuMDAgIHwgICAgIDE2LjAwICB8IDEKK0FBQyBMQyAgICAgICAgICAgICB8ICAyNDAwMCAtICAzMTk5OSAgfCAgMTYuMDAsIDIyLjA1LCAyNC4wMCAgfCAgICAgMjQuMDAgIHwgMQorQUFDIExDICAgICAgICAgICAgIHwgIDMyMDAwIC0gIDU1OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAxCitBQUMgTEMgICAgICAgICAgICAgfCAgNTYwMDAgLSAxNjAwMDAgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ0LjEwICB8IDEKK0FBQyBMQyAgICAgICAgICAgICB8IDE2MDAwMSAtIDI4ODAwMCAgfCAgICAgICAgICAgICAgICA0OC4wMCAgfCAgICAgNDguMDAgIHwgMQogLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KLUFBQyBMQyAgICAgICAgICAgICB8IDE2MDAwMCAtIDIzOTk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwgNSwgNS4xCi1BQUMgTEMgICAgICAgICAgICAgfCAyNDAwMDAgLSAyNzk5OTkgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDMyLjAwICB8IDUsIDUuMQotQUFDIExDICAgICAgICAgICAgIHwgMjgwMDAwIC0gODAwMDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCA1LCA1LjEKK0FBQyBMQyAgICAgICAgICAgICB8ICAxNjAwMCAtICAyMzk5OSAgfCAxMS4wMjUsIDEyLjAwLCAxNi4wMCAgfCAgICAgMTIuMDAgIHwgMgorQUFDIExDICAgICAgICAgICAgIHwgIDI0MDAwIC0gIDMxOTk5ICB8ICAgICAgICAgICAgICAgIDE2LjAwICB8ICAgICAxNi4wMCAgfCAyCitBQUMgTEMgICAgICAgICAgICAgfCAgMzIwMDAgLSAgMzk5OTkgIHwgIDE2LjAwLCAyMi4wNSwgMjQuMDAgIHwgICAgIDIyLjA1ICB8IDIKK0FBQyBMQyAgICAgICAgICAgICB8ICA0MDAwMCAtICA5NTk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwgMgorQUFDIExDICAgICAgICAgICAgIHwgIDk2MDAwIC0gMTExOTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAyCitBQUMgTEMgICAgICAgICAgICAgfCAxMTIwMDAgLSAzMjAwMDEgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ0LjEwICB8IDIKK0FBQyBMQyAgICAgICAgICAgICB8IDMyMDAwMiAtIDU3NjAwMCAgfCAgICAgICAgICAgICAgICA0OC4wMCAgfCAgICAgNDguMDAgIHwgMgorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KK0FBQyBMQyAgICAgICAgICAgICB8IDE2MDAwMCAtIDIzOTk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwKKzUsIDUuMSBBQUMgTEMgICAgICAgICAgICAgfCAyNDAwMDAgLSAyNzk5OTkgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDMyLjAwCit8IDUsIDUuMSBBQUMgTEMgICAgICAgICAgICAgfCAyODAwMDAgLSA4MDAwMDAgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwKKzQ0LjEwICB8IDUsIDUuMQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFxlbmR2ZXJiYXRpbSBcbgogCi1cc3Vic2VjdGlvbiByZW9tbWVuZGVkQ29uZmlnTEQgQUFDLUxELCBBQUMtRUxELCBBQUMtRUxEIHdpdGggU0JSIGluIER1YWxyYXRlIFNCUiBtb2RlLgotXHZlcmJhdGltCitcc3Vic2VjdGlvbiByZW9tbWVuZGVkQ29uZmlnTEQgQUFDLUxELCBBQUMtRUxELCBBQUMtRUxEIHdpdGggU0JSIGluIER1YWxyYXRlIFNCUgorbW9kZS4gVW5saWtlIHRvIEhFLUFBQyBjb25maWd1cmF0aW9uIHRoZSBTQlIgaXMgbm90IGNvdmVyZWQgYnkgRUxEIGF1ZGlvIG9iamVjdAordHlwZSBhbmQgbmVlZHMgdG8gYmUgZW5hYmxlZCBleHBsaWNpdGx5LiBVc2UgOjpBQUNFTkNfU0JSX01PREUgdG8gY29uZmlndXJlIFNCUgorYW5kIGl0cyBzYW1wbGluZ3JhdGUgcmF0aW8gd2l0aCA6OkFBQ0VOQ19TQlJfUkFUSU8gcGFyYW1ldGVyLiBcdmVyYmF0aW0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BdWRpbyBPYmplY3QgVHlwZSAgfCAgQml0IFJhdGUgUmFuZ2UgIHwgICAgICAgICAgICBTdXBwb3J0ZWQgIHwgUHJlZmVycmVkICB8IE5vLiBvZgotICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBbYml0L3NdICB8ICAgICAgIFNhbXBsaW5nIFJhdGVzICB8ICAgIFNhbXBsLiAgfCAgQ2hhbi4KLSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBba0h6XSAgfCAgICAgIFJhdGUgIHwKLSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgW2tIel0gIHwKK0F1ZGlvIE9iamVjdCBUeXBlICB8ICBCaXQgUmF0ZSBSYW5nZSAgfCAgICAgICAgICAgIFN1cHBvcnRlZCAgfCBQcmVmZXJyZWQgIHwgTm8uCitvZiB8ICAgICAgICAgW2JpdC9zXSAgfCAgICAgICBTYW1wbGluZyBSYXRlcyAgfCAgICBTYW1wbC4gIHwgIENoYW4uIHwKK3wgICAgICAgICAgICAgICAgW2tIel0gIHwgICAgICBSYXRlICB8IHwgICAgICAgICAgICAgICAgICB8Cit8ICAgICBba0h6XSAgfAogLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KLUVMRCArIFNCUiAgICAgICAgICB8ICAxODAwMCAtICAyNDk5OSAgfCAgICAgICAgMzIuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCi1FTEQgKyBTQlIgICAgICAgICAgfCAgMjUwMDAgLSAgMzE5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMQotRUxEICsgU0JSICAgICAgICAgIHwgIDMyMDAwIC0gIDY0MDAwICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDEKK0VMRCArIFNCUiAgICAgICAgICB8ICAxODAwMCAtICAyNDk5OSAgfCAgICAgICAgMzIuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgMQorRUxEICsgU0JSICAgICAgICAgIHwgIDI1MDAwIC0gIDMxOTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAxCitFTEQgKyBTQlIgICAgICAgICAgfCAgMzIwMDAgLSAgNjQwMDAgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8IDEKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1FTEQgKyBTQlIgICAgICAgICAgfCAgMzIwMDAgLSAgNTE5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMgotRUxEICsgU0JSICAgICAgICAgIHwgIDUyMDAwIC0gMTI4MDAwICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKK0VMRCArIFNCUiAgICAgICAgICB8ICAzMjAwMCAtICA1MTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgMgorRUxEICsgU0JSICAgICAgICAgIHwgIDUyMDAwIC0gMTI4MDAwICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAyCiAtLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotRUxEICsgU0JSICAgICAgICAgIHwgIDcyMDAwIC0gMTYwMDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDMKK0VMRCArIFNCUiAgICAgICAgICB8ICA3ODAwMCAtIDE2MDAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgMwogLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KLUVMRCArIFNCUiAgICAgICAgICB8ICA5NjAwMCAtIDIxMjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA0CitFTEQgKyBTQlIgICAgICAgICAgfCAxMDQwMDAgLSAyMTIwMDAgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8IDQKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1FTEQgKyBTQlIgICAgICAgICAgfCAxMjAwMDAgLSAyNDYwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgNQorRUxEICsgU0JSICAgICAgICAgIHwgMTMwMDAwIC0gMjQ2MDAwICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfAorNSwgNS4xCiAtLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotRUxEICsgU0JSICAgICAgICAgIHwgMTIwMDAwIC0gMjY2MDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICA1LjEKK0xELCBFTEQgICAgICAgICAgICB8ICAxNjAwMCAtICAxOTk5OSAgfCAgICAgICAgMTYuMDAgLSAyNC4wMCAgfCAgICAgMTYuMDAgIHwgMQorTEQsIEVMRCAgICAgICAgICAgIHwgIDIwMDAwIC0gIDM5OTk5ICB8ICAgICAgICAxNi4wMCAtIDMyLjAwICB8ICAgICAyNC4wMCAgfCAxCitMRCwgRUxEICAgICAgICAgICAgfCAgNDAwMDAgLSAgNDk5OTkgIHwgICAgICAgIDIyLjA1IC0gMzIuMDAgIHwgICAgIDMyLjAwICB8IDEKK0xELCBFTEQgICAgICAgICAgICB8ICA1MDAwMCAtICA2MTk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgMQorTEQsIEVMRCAgICAgICAgICAgIHwgIDYyMDAwIC0gIDg0OTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAxCitMRCwgRUxEICAgICAgICAgICAgfCAgODUwMDAgLSAxOTIwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8IDEKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1MRCwgRUxEICAgICAgICAgICAgfCAgMTYwMDAgLSAgMTk5OTkgIHwgICAgICAgIDE2LjAwIC0gMjQuMDAgIHwgICAgIDE2LjAwICB8ICAgICAgMQotTEQsIEVMRCAgICAgICAgICAgIHwgIDIwMDAwIC0gIDM5OTk5ICB8ICAgICAgICAxNi4wMCAtIDMyLjAwICB8ICAgICAyNC4wMCAgfCAgICAgIDEKLUxELCBFTEQgICAgICAgICAgICB8ICA0MDAwMCAtICA0OTk5OSAgfCAgICAgICAgMjIuMDUgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCi1MRCwgRUxEICAgICAgICAgICAgfCAgNTAwMDAgLSAgNjE5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgMQotTEQsIEVMRCAgICAgICAgICAgIHwgIDYyMDAwIC0gIDg0OTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDEKLUxELCBFTEQgICAgICAgICAgICB8ICA4NTAwMCAtIDE5MjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCitMRCwgRUxEICAgICAgICAgICAgfCAgNjQwMDAgLSAgNzU5OTkgIHwgICAgICAgIDI0LjAwIC0gMzIuMDAgIHwgICAgIDMyLjAwICB8IDIKK0xELCBFTEQgICAgICAgICAgICB8ICA3NjAwMCAtICA5Nzk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgMgorTEQsIEVMRCAgICAgICAgICAgIHwgIDk4MDAwIC0gMTM1OTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAyCitMRCwgRUxEICAgICAgICAgICAgfCAxMzYwMDAgLSAzODQwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8IDIKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1MRCwgRUxEICAgICAgICAgICAgfCAgNjQwMDAgLSAgNzU5OTkgIHwgICAgICAgIDI0LjAwIC0gMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMgotTEQsIEVMRCAgICAgICAgICAgIHwgIDc2MDAwIC0gIDk3OTk5ICB8ICAgICAgICAyNC4wMCAtIDQ0LjEwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKLUxELCBFTEQgICAgICAgICAgICB8ICA5ODAwMCAtIDEzNTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCi1MRCwgRUxEICAgICAgICAgICAgfCAxMzYwMDAgLSAzODQwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMgorTEQsIEVMRCAgICAgICAgICAgIHwgIDk2MDAwIC0gMTEzOTk5ICB8ICAgICAgICAyNC4wMCAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAzCitMRCwgRUxEICAgICAgICAgICAgfCAxMTQwMDAgLSAxNDY5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8IDMKK0xELCBFTEQgICAgICAgICAgICB8IDE0NzAwMCAtIDIwMzk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgMworTEQsIEVMRCAgICAgICAgICAgIHwgMjA0MDAwIC0gNTc2MDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAzCiAtLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotTEQsIEVMRCAgICAgICAgICAgIHwgIDk2MDAwIC0gMTEzOTk5ICB8ICAgICAgICAyNC4wMCAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDMKLUxELCBFTEQgICAgICAgICAgICB8IDExNDAwMCAtIDE0Njk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAzCi1MRCwgRUxEICAgICAgICAgICAgfCAxNDcwMDAgLSAyMDM5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMwotTEQsIEVMRCAgICAgICAgICAgIHwgMjA0MDAwIC0gNTc2MDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDMKK0xELCBFTEQgICAgICAgICAgICB8IDEyODAwMCAtIDE1MTk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgNAorTEQsIEVMRCAgICAgICAgICAgIHwgMTUyMDAwIC0gMTk1OTk5ICB8ICAgICAgICAyNC4wMCAtIDQ0LjEwICB8ICAgICAzMi4wMCAgfCA0CitMRCwgRUxEICAgICAgICAgICAgfCAxOTYwMDAgLSAyNzE5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8IDQKK0xELCBFTEQgICAgICAgICAgICB8IDI3MjAwMCAtIDc2ODAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgNAogLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KLUxELCBFTEQgICAgICAgICAgICB8IDEyODAwMCAtIDE1MTk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICA0Ci1MRCwgRUxEICAgICAgICAgICAgfCAxNTIwMDAgLSAxOTU5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgNAotTEQsIEVMRCAgICAgICAgICAgIHwgMTk2MDAwIC0gMjcxOTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDQKLUxELCBFTEQgICAgICAgICAgICB8IDI3MjAwMCAtIDc2ODAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotTEQsIEVMRCAgICAgICAgICAgIHwgMTYwMDAwIC0gMTg5OTk5ICB8ICAgICAgICAyNC4wMCAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDUKLUxELCBFTEQgICAgICAgICAgICB8IDE5MDAwMCAtIDI0NDk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICA1Ci1MRCwgRUxEICAgICAgICAgICAgfCAyNDUwMDAgLSAzMzk5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgNQotTEQsIEVMRCAgICAgICAgICAgIHwgMzQwMDAwIC0gOTYwMDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDUKK0xELCBFTEQgICAgICAgICAgICB8IDE2MDAwMCAtIDE4OTk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwKKzUsIDUuMSBMRCwgRUxEICAgICAgICAgICAgfCAxOTAwMDAgLSAyNDQ5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwCit8IDUsIDUuMSBMRCwgRUxEICAgICAgICAgICAgfCAyNDUwMDAgLSAzMzk5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwKKzQ0LjEwICB8IDUsIDUuMSBMRCwgRUxEICAgICAgICAgICAgfCAzNDAwMDAgLSA5NjAwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwKKzQ4LjAwICB8IDUsIDUuMQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFxlbmR2ZXJiYXRpbSBcbgogCiBcc3Vic2VjdGlvbiByZW9tbWVuZGVkQ29uZmlnRUxEIEFBQy1FTEQgd2l0aCBTQlIgaW4gRG93bnNhbXBsZWQgU0JSIG1vZGUuCiBcdmVyYmF0aW0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BdWRpbyBPYmplY3QgVHlwZSAgfCAgQml0IFJhdGUgUmFuZ2UgIHwgICAgICAgICAgICBTdXBwb3J0ZWQgIHwgUHJlZmVycmVkICB8IE5vLiBvZgotICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBbYml0L3NdICB8ICAgICAgIFNhbXBsaW5nIFJhdGVzICB8ICAgIFNhbXBsLiAgfCAgQ2hhbi4KLSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBba0h6XSAgfCAgICAgIFJhdGUgIHwKLSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgW2tIel0gIHwKK0F1ZGlvIE9iamVjdCBUeXBlICB8ICBCaXQgUmF0ZSBSYW5nZSAgfCAgICAgICAgICAgIFN1cHBvcnRlZCAgfCBQcmVmZXJyZWQgIHwgTm8uCitvZiB8ICAgICAgICAgW2JpdC9zXSAgfCAgICAgICBTYW1wbGluZyBSYXRlcyAgfCAgICBTYW1wbC4gIHwgIENoYW4uIHwKK3wgICAgICAgICAgICAgICAgW2tIel0gIHwgICAgICBSYXRlICB8IHwgICAgICAgICAgICAgICAgICB8Cit8ICAgICBba0h6XSAgfAogLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KLUVMRCArIFNCUiAgICAgICAgICB8ICAxODAwMCAtICAyNDk5OSAgfCAgICAgICAgMTYuMDAgLSAyMi4wNSAgfCAgICAgMjIuMDUgIHwgICAgICAxCi0oZG93bnNhbXBsZWQgU0JSKSAgfCAgMjUwMDAgLSAgMzU5OTkgIHwgICAgICAgIDIyLjA1IC0gMzIuMDAgIHwgICAgIDI0LjAwICB8ICAgICAgMQotICAgICAgICAgICAgICAgICAgIHwgIDM2MDAwIC0gIDY0MDAwICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDEKK0VMRCArIFNCUiAgICAgICAgICB8ICAxODAwMCAtIDI0OTk5ICAgfCAgICAgICAgMTYuMDAgLSAyMi4wNSAgfCAgICAgMjIuMDUgIHwgMQorKGRvd25zYW1wbGVkIFNCUikgIHwgIDI1MDAwIC0gMzE5OTkgICB8ICAgICAgICAxNi4wMCAtIDI0LjAwICB8ICAgICAyNC4wMCAgfCAxCisgICAgICAgICAgICAgICAgICAgfCAgMzIwMDAgLSA0Nzk5OSAgIHwgICAgICAgIDIyLjA1IC0gMzIuMDAgIHwgICAgIDMyLjAwICB8IDEKKyAgICAgICAgICAgICAgICAgICB8ICA0ODAwMCAtIDY0MDAwICAgfCAgICAgICAgMjIuMDUgLSA0OC4wMCAgfCAgICAgMzIuMDAgIHwgMQorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KK0VMRCArIFNCUiAgICAgICAgICB8ICAzMjAwMCAtIDUxOTk5ICAgfCAgICAgICAgMTYuMDAgLSAyNC4wMCAgfCAgICAgMjQuMDAgIHwgMgorKGRvd25zYW1wbGVkIFNCUikgIHwgIDUyMDAwIC0gNTk5OTkgICB8ICAgICAgICAyMi4wNSAtIDI0LjAwICB8ICAgICAyNC4wMCAgfCAyCisgICAgICAgICAgICAgICAgICAgfCAgNjAwMDAgLSA5NTk5OSAgIHwgICAgICAgIDIyLjA1IC0gMzIuMDAgIHwgICAgIDMyLjAwICB8IDIKKyAgICAgICAgICAgICAgICAgICB8ICA5NjAwMCAtIDEyODAwMCAgfCAgICAgICAgMjIuMDUgLSA0OC4wMCAgfCAgICAgMzIuMDAgIHwgMgorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KK0VMRCArIFNCUiAgICAgICAgICB8ICA3ODAwMCAtICA5OTk5OSAgfCAgICAgICAgMjIuMDUgLSAyNC4wMCAgfCAgICAgMjQuMDAgIHwgMworKGRvd25zYW1wbGVkIFNCUikgIHwgMTAwMDAwIC0gMTQzOTk5ICB8ICAgICAgICAyMi4wNSAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAzCisgICAgICAgICAgICAgICAgICAgfCAxNDQwMDAgLSAxNTk5OTkgIHwgICAgICAgIDIyLjA1IC0gNDguMDAgIHwgICAgIDMyLjAwICB8IDMKKyAgICAgICAgICAgICAgICAgICB8IDE2MDAwMCAtIDE5MjAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgMzIuMDAgIHwgMworLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KK0VMRCArIFNCUiAgICAgICAgICB8IDEwNDAwMCAtIDE0OTk5OSAgfCAgICAgICAgMjIuMDUgLSAyNC4wMCAgfCAgICAgMjQuMDAgIHwgNAorKGRvd25zYW1wbGVkIFNCUikgIHwgMTUwMDAwIC0gMTkxOTk5ICB8ICAgICAgICAyMi4wNSAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCA0CisgICAgICAgICAgICAgICAgICAgfCAxOTIwMDAgLSAyMTE5OTkgIHwgICAgICAgIDIyLjA1IC0gNDguMDAgIHwgICAgIDMyLjAwICB8IDQKKyAgICAgICAgICAgICAgICAgICB8IDIxMjAwMCAtIDI1NjAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgMzIuMDAgIHwgNAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KK0VMRCArIFNCUiAgICAgICAgICB8IDEzMDAwMCAtIDE3MTk5OSAgfCAgICAgICAgMjIuMDUgLSAyNC4wMCAgfCAgICAgMjQuMDAgIHwKKzUsIDUuMSAoZG93bnNhbXBsZWQgU0JSKSAgfCAxNzIwMDAgLSAyMzk5OTkgIHwgICAgICAgIDIyLjA1IC0gMzIuMDAgIHwgICAgIDMyLjAwCit8IDUsIDUuMSB8IDI0MDAwMCAtIDMyMDAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgMzIuMDAgIHwgNSwgNS4xCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogXGVuZHZlcmJhdGltIFxuCiAKK1xzdWJzZWN0aW9uIHJlb21tZW5kZWRDb25maWdFTER2MiBBQUMtRUxEIHYyLCBBQUMtRUxEIHYyIHdpdGggU0JSLgorVGhlIEVMRCB2MiAyMTIgY29uZmlndXJhdGlvbiBtdXN0IGJlIGNvbmZpZ3VyZWQgZXhwbGljaXRseSB3aXRoCis6OkFBQ0VOQ19DSEFOTkVMTU9ERSBwYXJhbWV0ZXIgYWNjb3JkaW5nIE1PREVfMjEyIHZhbHVlLiBTQlIgY2FuIGJlIGNvbmZpZ3VyZWQKK3NlcGFyYXRlbHkgdGhyb3VnaCA6OkFBQ0VOQ19TQlJfTU9ERSBhbmQgOjpBQUNFTkNfU0JSX1JBVElPIHBhcmFtZXRlci4gRm9sbG93aW5nCitjb25maWd1cmF0aW9ucyBzaGFsbCBhcHBseSB0byBib3RoIGZyYW1lbGVuZ3RocyA0ODAgYW5kIDUxMi4gRm9yIEVMRCB2MgorY29uZmlndXJhdGlvbiB3aXRob3V0IFNCUiBhbmQgZnJhbWVsZW5ndGggNDgwIHRoZSBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZSBpcworcmVzdHJpY3RlZCB0byB0aGUgcmFuZ2UgZnJvbSAxNiBrSHogdXAgdG8gMjQga0h6LiBcdmVyYmF0aW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBdWRpbyBPYmplY3QgVHlwZSAgfCAgQml0IFJhdGUgUmFuZ2UgIHwgICAgICAgICAgICBTdXBwb3J0ZWQgIHwgUHJlZmVycmVkICB8IE5vLgorb2YgfCAgICAgICAgIFtiaXQvc10gIHwgICAgICAgU2FtcGxpbmcgUmF0ZXMgIHwgICAgU2FtcGwuICB8ICBDaGFuLiB8Cit8ICAgICAgICAgICAgICAgIFtrSHpdICB8ICAgICAgUmF0ZSAgfCB8ICAgICAgICAgICAgICAgICAgfAorfCAgICAgW2tIel0gIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitFTEQtMjEyICAgICAgICAgICAgfCAgMTYwMDAgLSAgMTk5OTkgIHwgICAgICAgIDE2LjAwIC0gMjQuMDAgIHwgICAgIDE2LjAwICB8IDIKKyh3aXRob3V0IFNCUikgICAgICB8ICAyMDAwMCAtICAzOTk5OSAgfCAgICAgICAgMTYuMDAgLSAzMi4wMCAgfCAgICAgMjQuMDAgIHwgMgorICAgICAgICAgICAgICAgICAgIHwgIDQwMDAwIC0gIDQ5OTk5ICB8ICAgICAgICAyMi4wNSAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAyCisgICAgICAgICAgICAgICAgICAgfCAgNTAwMDAgLSAgNjE5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8IDIKKyAgICAgICAgICAgICAgICAgICB8ICA2MjAwMCAtICA4NDk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgMgorICAgICAgICAgICAgICAgICAgIHwgIDg1MDAwIC0gMTkyMDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAyCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorRUxELTIxMiArIFNCUiAgICAgIHwgIDE4MDAwIC0gIDIwOTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAyCisoZHVhbHJhdGUgU0JSKSAgICAgfCAgMjEwMDAgLSAgMjU5OTkgIHwgICAgICAgIDMyLjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8IDIKKyAgICAgICAgICAgICAgICAgICB8ICAyNjAwMCAtICAzMTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgMgorICAgICAgICAgICAgICAgICAgIHwgIDMyMDAwIC0gIDY0MDAwICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAyCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorRUxELTIxMiArIFNCUiAgICAgIHwgIDE4MDAwIC0gIDE5OTk5ICB8ICAgICAgICAxNi4wMCAtIDIyLjA1ICB8ICAgICAyMi4wNSAgfCAyCisoZG93bnNhbXBsZWQgU0JSKSAgfCAgMjAwMDAgLSAgMjQ5OTkgIHwgICAgICAgIDE2LjAwIC0gMjQuMDAgIHwgICAgIDIyLjA1ICB8IDIKKyAgICAgICAgICAgICAgICAgICB8ICAyNTAwMCAtICAzMTk5OSAgfCAgICAgICAgMTYuMDAgLSAyNC4wMCAgfCAgICAgMjQuMDAgIHwgMgorICAgICAgICAgICAgICAgICAgIHwgIDMyMDAwIC0gIDY0MDAwICB8ICAgICAgICAyNC4wMCAtIDI0LjAwICB8ICAgICAyNC4wMCAgfCAyCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorXGVuZHZlcmJhdGltIFxuCiAKIFxwYWdlIEVOQ09ERVJCRUhBVklPVVIgRW5jb2RlciBCZWhhdmlvdXIKIAogXHNlY3Rpb24gQkVIQVZJT1VSX0JBTkRXSURUSCBCYW5kd2lkdGgKIAotVGhlIEZESyBBQUMgZW5jb2RlciB1c3VhbGx5IGRvZXMgbm90IHVzZSB0aGUgZnVsbCBmcmVxdWVuY3kgcmFuZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbCwgYnV0IHJlc3RyaWN0cyB0aGUgYmFuZHdpZHRoCi1hY2NvcmRpbmcgdG8gY2VydGFpbiBsaWJyYXJ5LWludGVybmFsIHNldHRpbmdzLiBUaGV5IGNhbiBiZSBjaGFuZ2VkIGluIHRoZSB0YWJsZSAiYmFuZFdpZHRoVGFibGUiIGluIHRoZQotZmlsZSBiYW5kd2lkdGguY3BwIChpZiBhdmFpbGFibGUpLgorVGhlIEZESyBBQUMgZW5jb2RlciB1c3VhbGx5IGRvZXMgbm90IHVzZSB0aGUgZnVsbCBmcmVxdWVuY3kgcmFuZ2Ugb2YgdGhlIGlucHV0CitzaWduYWwsIGJ1dCByZXN0cmljdHMgdGhlIGJhbmR3aWR0aCBhY2NvcmRpbmcgdG8gY2VydGFpbiBsaWJyYXJ5LWludGVybmFsCitzZXR0aW5ncy4gVGhleSBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgdGFibGUgImJhbmRXaWR0aFRhYmxlIiBpbiB0aGUgZmlsZQorYmFuZHdpZHRoLmNwcCAoaWYgYXZhaWxhYmxlKS4KIAotVGhlIGVuY29kZXIgQVBJIHByb3ZpZGVzIHRoZSA6OkFBQ0VOQ19CQU5EV0lEVEggcGFyYW1ldGVyIHRvIGFkanVzdCB0aGUgYmFuZHdpZHRoIGV4cGxpY2l0bHkuCi1cY29kZQotYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0JBTkRXSURUSCwgdmFsdWUpOwotXGVuZGNvZGUKK1RoZSBlbmNvZGVyIEFQSSBwcm92aWRlcyB0aGUgOjpBQUNFTkNfQkFORFdJRFRIIHBhcmFtZXRlciB0byBhZGp1c3QgdGhlCitiYW5kd2lkdGggZXhwbGljaXRseS4gXGNvZGUgYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0JBTkRXSURUSCwKK3ZhbHVlKTsgXGVuZGNvZGUKIAotSG93ZXZlciBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoZXNlIHNldHRpbmdzLCBiZWNhdXNlIHRoZXkgYXJlIGJhc2VkIG9uIG51bWVyaW91cyBsaXN0ZW5pbmcKLXRlc3RzIGFuZCBjYXJlZnVsIHR3ZWFrcyB0byBlbnN1cmUgdGhlIGJlc3Qgb3ZlcmFsbCBlbmNvZGluZyBxdWFsaXR5LgorSG93ZXZlciBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoZXNlIHNldHRpbmdzLCBiZWNhdXNlIHRoZXkgYXJlIGJhc2VkCitvbiBudW1lcm91cyBsaXN0ZW5pbmcgdGVzdHMgYW5kIGNhcmVmdWwgdHdlYWtzIHRvIGVuc3VyZSB0aGUgYmVzdCBvdmVyYWxsCitlbmNvZGluZyBxdWFsaXR5LiBBbHNvLCB0aGUgbWF4aW11bSBiYW5kd2lkdGggdGhhdCBjYW4gYmUgc2V0IG1hbnVhbGx5IGJ5IHRoZQordXNlciBpcyAyMGtIeiBvciBmcy8yLCB3aGljaGV2ZXIgdmFsdWUgaXMgc21hbGxlci4KIAotVGhlb3JldGljYWxseSBhIHNpZ25hbCBvZiBmb3IgZXhhbXBsZSA0OCBrSHogY2FuIGNvbnRhaW4gZnJlcXVlbmNpZXMgdXAgdG8gMjQga0h6LCBidXQgdG8gdXNlIHRoaXMgZnVsbCByYW5nZQotaW4gYW4gYXVkaW8gZW5jb2RlciB1c3VhbGx5IGRvZXMgbm90IG1ha2Ugc2Vuc2UuIFVzdWFsbHkgdGhlIGVuY29kZXIgaGFzIGEgdmVyeSBsaW1pdGVkIGFtb3VudCBvZgotYml0cyB0byBzcGVuZCAodHlwaWNhbGx5IDEyOCBrYml0L3MgZm9yIHN0ZXJlbyA0OCBrSHogY29udGVudCkgYW5kIHRvIGFsbG93IGZ1bGwgcmFuZ2UgYmFuZHdpZHRoIHdvdWxkCi13YXN0ZSBhIGxvdCBvZiB0aGVzZSBiaXRzIGZvciBmcmVxdWVuY2llcyB0aGUgaHVtYW4gZWFyIGlzIGhhcmRseSBhYmxlIHRvIHBlcmNlaXZlIGFueXdheSwgaWYgYXQgYWxsLiBIZW5jZSBpdAotaXMgd2lzZSB0byB1c2UgdGhlIGF2YWlsYWJsZSBiaXRzIGZvciB0aGUgcmVhbGx5IGltcG9ydGFudCBmcmVxdWVuY3kgcmFuZ2UgYW5kIGp1c3Qgc2tpcCB0aGUgcmVzdC4KLUF0IGxvd2VyIGJpdHJhdGVzIChlLiBnLiA8PSA4MCBrYml0L3MgZm9yIHN0ZXJlbyA0OCBrSHogY29udGVudCkgdGhlIGVuY29kZXIgd2lsbCBjaG9vc2UgYW4gZXZlbiBzbWFsbGVyCi1iYW5kd2lkdGgsIGJlY2F1c2UgYW4gZW5jb2RlZCBzaWduYWwgd2l0aCBzbWFsbGVyIGJhbmR3aWR0aCBhbmQgaGVuY2UgbGVzcyBhcnRpZmFjdHMgc291bmRzIGJldHRlciB0aGFuIGEgc2lnbmFsCi13aXRoIGhpZ2hlciBiYW5kd2lkdGggYnV0IHRoZW4gbW9yZSBjb2RpbmcgYXJ0ZWZhY3RzIGFjcm9zcyBhbGwgZnJlcXVlbmNpZXMuIFRoZXNlIGFydGVmYWN0cyB3b3VsZCBvY2N1ciBpZgotc21hbGwgYml0cmF0ZXMgYW5kIGhpZ2ggYmFuZHdpZHRocyBhcmUgY2hvc2VuIGJlY2F1c2UgdGhlIGF2YWlsYWJsZSBiaXRzIGFyZSBqdXN0IG5vdCBlbm91Z2ggdG8gZW5jb2RlIGFsbAotZnJlcXVlbmNpZXMgd2VsbC4KK1RoZW9yZXRpY2FsbHkgYSBzaWduYWwgb2YgZm9yIGV4YW1wbGUgNDgga0h6IGNhbiBjb250YWluIGZyZXF1ZW5jaWVzIHVwIHRvIDI0CitrSHosIGJ1dCB0byB1c2UgdGhpcyBmdWxsIHJhbmdlIGluIGFuIGF1ZGlvIGVuY29kZXIgdXN1YWxseSBkb2VzIG5vdCBtYWtlIHNlbnNlLgorVXN1YWxseSB0aGUgZW5jb2RlciBoYXMgYSB2ZXJ5IGxpbWl0ZWQgYW1vdW50IG9mIGJpdHMgdG8gc3BlbmQgKHR5cGljYWxseSAxMjgKK2tiaXQvcyBmb3Igc3RlcmVvIDQ4IGtIeiBjb250ZW50KSBhbmQgdG8gYWxsb3cgZnVsbCByYW5nZSBiYW5kd2lkdGggd291bGQgd2FzdGUKK2EgbG90IG9mIHRoZXNlIGJpdHMgZm9yIGZyZXF1ZW5jaWVzIHRoZSBodW1hbiBlYXIgaXMgaGFyZGx5IGFibGUgdG8gcGVyY2VpdmUKK2FueXdheSwgaWYgYXQgYWxsLiBIZW5jZSBpdCBpcyB3aXNlIHRvIHVzZSB0aGUgYXZhaWxhYmxlIGJpdHMgZm9yIHRoZSByZWFsbHkKK2ltcG9ydGFudCBmcmVxdWVuY3kgcmFuZ2UgYW5kIGp1c3Qgc2tpcCB0aGUgcmVzdC4gQXQgbG93ZXIgYml0cmF0ZXMgKGUuIGcuIDw9IDgwCitrYml0L3MgZm9yIHN0ZXJlbyA0OCBrSHogY29udGVudCkgdGhlIGVuY29kZXIgd2lsbCBjaG9vc2UgYW4gZXZlbiBzbWFsbGVyCitiYW5kd2lkdGgsIGJlY2F1c2UgYW4gZW5jb2RlZCBzaWduYWwgd2l0aCBzbWFsbGVyIGJhbmR3aWR0aCBhbmQgaGVuY2UgbGVzcworYXJ0aWZhY3RzIHNvdW5kcyBiZXR0ZXIgdGhhbiBhIHNpZ25hbCB3aXRoIGhpZ2hlciBiYW5kd2lkdGggYnV0IHRoZW4gbW9yZSBjb2RpbmcKK2FydGVmYWN0cyBhY3Jvc3MgYWxsIGZyZXF1ZW5jaWVzLiBUaGVzZSBhcnRlZmFjdHMgd291bGQgb2NjdXIgaWYgc21hbGwgYml0cmF0ZXMKK2FuZCBoaWdoIGJhbmR3aWR0aHMgYXJlIGNob3NlbiBiZWNhdXNlIHRoZSBhdmFpbGFibGUgYml0cyBhcmUganVzdCBub3QgZW5vdWdoIHRvCitlbmNvZGUgYWxsIGZyZXF1ZW5jaWVzIHdlbGwuCiAKLVVuZm9ydHVuYXRlbHkgc29tZSBwZW9wbGUgZXZhbHVhdGUgZW5jb2RpbmcgcXVhbGl0eSBiYXNlZCBvbiBwb3NzaWJsZSBiYW5kd2lkdGggYXMgd2VsbCwgYnV0IGl0IGlzIGEgdHdvLXNpZGVkCi1zd29yZCBjb25zaWRlcmluZyB0aGUgdHJhZGUtb2ZmIGRlc2NyaWJlZCBhYm92ZS4KK1VuZm9ydHVuYXRlbHkgc29tZSBwZW9wbGUgZXZhbHVhdGUgZW5jb2RpbmcgcXVhbGl0eSBiYXNlZCBvbiBwb3NzaWJsZSBiYW5kd2lkdGgKK2FzIHdlbGwsIGJ1dCBpdCBpcyBhIGRvdWJsZS1lZGdlZCBzd29yZCBjb25zaWRlcmluZyB0aGUgdHJhZGUtb2ZmIGRlc2NyaWJlZAorYWJvdmUuCiAKLUFub3RoZXIgYXNwZWN0IGlzIHdvcmtsb2FkIGNvbnN1bXB0aW9uLiBUaGUgaGlnaGVyIHRoZSBhbGxvd2VkIGJhbmR3aWR0aCwgdGhlIG1vcmUgZnJlcXVlbmN5IGxpbmVzIGhhdmUgdG8gYmUKLXByb2Nlc3NlZCwgd2hpY2ggaW4gdHVybiBpbmNyZWFzZXMgdGhlIHdvcmtsb2FkLgorQW5vdGhlciBhc3BlY3QgaXMgd29ya2xvYWQgY29uc3VtcHRpb24uIFRoZSBoaWdoZXIgdGhlIGFsbG93ZWQgYmFuZHdpZHRoLCB0aGUKK21vcmUgZnJlcXVlbmN5IGxpbmVzIGhhdmUgdG8gYmUgcHJvY2Vzc2VkLCB3aGljaCBpbiB0dXJuIGluY3JlYXNlcyB0aGUgd29ya2xvYWQuCiAKIFxzZWN0aW9uIEZSQU1FU0laRVNfQU5EX0JJVF9SRVNFUlZPSVIgRnJhbWUgU2l6ZXMgJiBCaXQgUmVzZXJ2b2lyCiAKIEZvciBBQUMgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gY29uc3RhbnQgYml0IHJhdGUgYW5kIGNvbnN0YW50IGZyYW1lCi1sZW5ndGggZHVlIHRvIHRoZSBzby1jYWxsZWQgYml0IHJlc2Vydm9pciB0ZWNobmlxdWUsIHdoaWNoIGFsbG93cyB0aGUgZW5jb2RlciB0byB1c2UgbGVzcwotYml0cyBpbiBhbiBBQUMgZnJhbWUgZm9yIHRob3NlIGF1ZGlvIHNpZ25hbCBzZWN0aW9ucyB3aGljaCBhcmUgZWFzeSB0byBlbmNvZGUsCi1hbmQgdGhlbiBzcGVuZCB0aGVtIGF0IGEgbGF0ZXIgcG9pbnQgaW4KLXRpbWUgZm9yIG1vcmUgY29tcGxleCBhdWRpbyBzZWN0aW9ucy4gVGhlIGV4dGVudCB0byB3aGljaCB0aGlzICJiaXQgZXhjaGFuZ2UiCi1pcyBkb25lIGlzIGxpbWl0ZWQgdG8gYWxsb3cgZm9yIHJlbGlhYmxlIGFuZCByZWxhdGl2ZWx5IGxvdyBkZWxheSByZWFsIHRpbWUKLXN0cmVhbWluZy4KK2xlbmd0aCBkdWUgdG8gdGhlIHNvLWNhbGxlZCBiaXQgcmVzZXJ2b2lyIHRlY2huaXF1ZSwgd2hpY2ggYWxsb3dzIHRoZSBlbmNvZGVyIHRvCit1c2UgbGVzcyBiaXRzIGluIGFuIEFBQyBmcmFtZSBmb3IgdGhvc2UgYXVkaW8gc2lnbmFsIHNlY3Rpb25zIHdoaWNoIGFyZSBlYXN5IHRvCitlbmNvZGUsIGFuZCB0aGVuIHNwZW5kIHRoZW0gYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lIGZvciBtb3JlIGNvbXBsZXggYXVkaW8KK3NlY3Rpb25zLiBUaGUgZXh0ZW50IHRvIHdoaWNoIHRoaXMgImJpdCBleGNoYW5nZSIgaXMgZG9uZSBpcyBsaW1pdGVkIHRvIGFsbG93Citmb3IgcmVsaWFibGUgYW5kIHJlbGF0aXZlbHkgbG93IGRlbGF5IHJlYWwgdGltZSBzdHJlYW1pbmcuIFRoZXJlZm9yZSwgZm9yCitBQUMtRUxELCB0aGUgYml0cmVzZXJ2b2lyIGlzIGxpbWl0ZWQuIEl0IHZhcmllcyBiZXR3ZWVuIDUwMCBhbmQgNDAwMCBiaXRzL2ZyYW1lLAorZGVwZW5kaW5nIG9uIHRoZSBiaXRyYXRlL2NoYW5uZWwuCistIEZvciBhIGJpdHJhdGUgb2YgMTJrYnBzL2NoYW5uZWwgYW5kIGJlbG93LCB0aGUgQUFDLUVMRCBiaXRyZXNlcnZvaXIgaXMgNTAwCitiaXRzL2ZyYW1lLgorLSBGb3IgYSBiaXRyYXRlIG9mIDcwa2Jwcy9jaGFubmVsIGFuZCBhYm92ZSwgdGhlIEFBQy1FTEQgYml0cmVzZXJ2b2lyIGlzIDQwMDAKK2JpdHMvZnJhbWUuCistIEJldHdlZW4gMTJrYnBzL2NoYW5uZWwgYW5kIDcwa2Jwcy9jaGFubmVsLCB0aGUgQUFDLUVMRCBiaXRyZXJ2b2lyIGlzIGluY3JlYXNlZAorbGluZWFybHkuCistIEZvciBBQUMtTEMsIHRoZSBiaXRyYXRlIGlzIG9ubHkgbGltaXRlZCBieSB0aGUgbWF4aW11bSBBQUMgZnJhbWUgbGVuZ3RoLiBJdAoraXMsIHJlZ2FyZGxlc3Mgb2YgdGhlIGF2YWlsYWJsZSBiaXQgcmVzZXJ2b2lyLCBkZWZpbmVkIGFzIDYxNDQgYml0cyBwZXIgY2hhbm5lbC4KKwogT3ZlciBhIGxvbmdlciBwZXJpb2QgaW4gdGltZSB0aGUgYml0cmF0ZSB3aWxsIGJlIGNvbnN0YW50IGluIHRoZSBBQUMgY29uc3RhbnQKIGJpdHJhdGUgbW9kZSwgZS5nLiBmb3IgSVNETiB0cmFuc21pc3Npb24uIFRoaXMgbWVhbnMgdGhhdCBpbiBBQUMgZWFjaCBiaXRzdHJlYW0KIGZyYW1lIHdpbGwgaW4gZ2VuZXJhbCBoYXZlIGEgZGlmZmVyZW50IGxlbmd0aCBpbiBieXRlcyBidXQgb3ZlciB0aW1lIGl0Ci13aWxsIHJlYWNoIHRoZSB0YXJnZXQgYml0cmF0ZS4gT25lIGNvdWxkIGFsc28gbWFrZSBhbiBNUEVHIGNvbXBsaWFudAord2lsbCByZWFjaCB0aGUgdGFyZ2V0IGJpdHJhdGUuCisKKworT25lIGNvdWxkIGFsc28gbWFrZSBhbiBNUEVHIGNvbXBsaWFudAogQUFDIGVuY29kZXIgd2hpY2ggYWx3YXlzIHByb2R1Y2VzIGNvbnN0YW50IGxlbmd0aCBwYWNrYWdlcyBmb3IgZWFjaCBBQUMgZnJhbWUsCiBidXQgdGhlIGF1ZGlvIHF1YWxpdHkgd291bGQgYmUgY29uc2lkZXJhYmx5IHdvcnNlIHNpbmNlIHRoZSBiaXQgcmVzZXJ2b2lyCiB0ZWNobmlxdWUgd291bGQgaGF2ZSB0byBiZSBzd2l0Y2hlZCBvZmYgY29tcGxldGVseS4gQSBoaWdoZXIgYml0IHJhdGUgd291bGQgaGF2ZQogdG8gYmUgdXNlZCB0byBnZXQgdGhlIHNhbWUgYXVkaW8gcXVhbGl0eSBhcyB3aXRoIGFuIGVuYWJsZWQgYml0IHJlc2Vydm9pci4KIAotVGhlIG1heGltdW0gQUFDIGZyYW1lIGxlbmd0aCwgcmVnYXJkbGVzcyBvZiB0aGUgYXZhaWxhYmxlIGJpdCByZXNlcnZvaXIsIGlzIGRlZmluZWQKLWFzIDYxNDQgYml0cyBwZXIgY2hhbm5lbC4KLQogRm9yIG1wMyBieSB0aGUgd2F5LCB0aGUgc2FtZSBiaXQgcmVzZXJ2b2lyIHRlY2huaXF1ZSBleGlzdHMsIGJ1dCB0aGVyZSBlYWNoIGJpdAogc3RyZWFtIGZyYW1lIGhhcyBhIGNvbnN0YW50IGxlbmd0aCBmb3IgYSBnaXZlbiBiaXQgcmF0ZSAoaWdub3JpbmcgdGhlCiBwYWRkaW5nIGJ5dGUpLiBJbiBtcDMgdGhlcmUgaXMgYSBzby1jYWxsZWQgImJhY2sgcG9pbnRlciIgd2hpY2ggdGVsbHMKQEAgLTY1Myw4ICs5NjgsOCBAQAogXHN1YnNlY3Rpb24gQkVIQVZJT1VSX0VTVElNX0FWR19GUkFNRVNJWkVTIEVzdGltYXRpbmcgQXZlcmFnZSBGcmFtZSBTaXplcwogCiBBIEhFLUFBQyB2MSBvciB2MiBhdWRpbyBmcmFtZSBjb250YWlucyAyMDQ4IFBDTSBzYW1wbGVzIHBlciBjaGFubmVsICh0aGVyZSBpcwotYWxzbyBvbmUgbW9kZSB3aXRoIDE5MjAgc2FtcGxlcyBwZXIgY2hhbm5lbCBidXQgdGhpcyBpcyBvbmx5IGZvciBzcGVjaWFsIHB1cnBvc2VzCi1zdWNoIGFzIERBQisgZGlnaXRhbCByYWRpbykuCithbHNvIG9uZSBtb2RlIHdpdGggMTkyMCBzYW1wbGVzIHBlciBjaGFubmVsIGJ1dCB0aGlzIGlzIG9ubHkgZm9yIHNwZWNpYWwKK3B1cnBvc2VzIHN1Y2ggYXMgREFCKyBkaWdpdGFsIHJhZGlvKS4KIAogVGhlIG51bWJlciBvZiBIRS1BQUMgZnJhbWVzIFxmJE5cX0ZSQU1FU1xmJCBwZXIgc2Vjb25kIGF0IDQ0LjEga0h6IGlzOgogCkBAIC02NjIsNyArOTc3LDggQEAKIE5cX0ZSQU1FUyA9IDQ0MTAwIC8gMjA0OCA9IDIxLjUzMzIKIFxmXQogCi1BdCBhIGJpdCByYXRlIG9mIDgga2JwcyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYml0cyBwZXIgZnJhbWUgXGYkTlxfQklUU1xfUEVSXF9GUkFNRVxmJCBpczoKK0F0IGEgYml0IHJhdGUgb2YgOCBrYnBzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBiaXRzIHBlciBmcmFtZQorXGYkTlxfQklUU1xfUEVSXF9GUkFNRVxmJCBpczoKIAogXGZbCiBOXF9CSVRTXF9QRVJcX0ZSQU1FID0gODAwMCAvIDIxLjUzMzIgPSAzNzEuNTIKQEAgLTY3MCw3ICs5ODYsOCBAQAogCiB3aGljaCBpcyBhYm91dCA0Ni40NCBieXRlcyBwZXIgZW5jb2RlZCBmcmFtZS4KIAotQXQgYSBiaXQgcmF0ZSBvZiAzMiBrYnBzLCB3aGljaCBpcyBxdWl0ZSBoaWdoIGZvciBzaW5nbGUgY2hhbm5lbCBIRS1BQUMgdjEsIGl0IGlzOgorQXQgYSBiaXQgcmF0ZSBvZiAzMiBrYnBzLCB3aGljaCBpcyBxdWl0ZSBoaWdoIGZvciBzaW5nbGUgY2hhbm5lbCBIRS1BQUMgdjEsIGl0CitpczoKIAogXGZbCiBOXF9CSVRTXF9QRVJcX0ZSQU1FID0gMzIwMDAgLyAyMS41MzMyID0gMTQ4NgpAQCAtNjc4LDM4NSArOTk1LDU1MSBAQAogCiB3aGljaCBpcyBhYm91dCAxODUuNzYgYnl0ZXMgcGVyIGVuY29kZWQgZnJhbWUuCiAKLVRoZXNlIGJpdHMvZnJhbWUgZmlndXJlcyBhcmUgYXZlcmFnZSBmaWd1cmVzIHdoZXJlIGVhY2ggQUFDIGZyYW1lIGdlbmVyYWxseSBoYXMgYSBkaWZmZXJlbnQKLXNpemUgaW4gYnl0ZXMuIFRvIGNhbGN1bGF0ZSB0aGUgc2FtZSBmb3IgQUFDLUxDIGp1c3QgdXNlIDEwMjQgaW5zdGVhZCBvZiAyMDQ4IFBDTSBzYW1wbGVzIHBlcgotZnJhbWUgYW5kIGNoYW5uZWwuCi1Gb3IgQUFDLUxEL0VMRCBpdCBpcyBlaXRoZXIgNDgwIG9yIDUxMiBQQ00gc2FtcGxlcyBwZXIgZnJhbWUgYW5kIGNoYW5uZWwuCitUaGVzZSBiaXRzL2ZyYW1lIGZpZ3VyZXMgYXJlIGF2ZXJhZ2UgZmlndXJlcyB3aGVyZSBlYWNoIEFBQyBmcmFtZSBnZW5lcmFsbHkgaGFzCithIGRpZmZlcmVudCBzaXplIGluIGJ5dGVzLiBUbyBjYWxjdWxhdGUgdGhlIHNhbWUgZm9yIEFBQy1MQyBqdXN0IHVzZSAxMDI0CitpbnN0ZWFkIG9mIDIwNDggUENNIHNhbXBsZXMgcGVyIGZyYW1lIGFuZCBjaGFubmVsLiBGb3IgQUFDLUxEL0VMRCBpdCBpcyBlaXRoZXIKKzQ4MCBvciA1MTIgUENNIHNhbXBsZXMgcGVyIGZyYW1lIGFuZCBjaGFubmVsLgogCiAKIFxzZWN0aW9uIEJFSEFWSU9VUl9UT09MUyBFbmNvZGVyIFRvb2xzCiAKLVRoZSBBQUMgZW5jb2RlciBzdXBwb3J0cyBUTlMsIFBOUywgTVMsIEludGVuc2l0eSBhbmQgYWN0aXZhdGVzIHRoZXNlIHRvb2xzIGRlcGVuZGluZyBvbiB0aGUgYXVkaW8gc2lnbmFsIGFuZAotdGhlIGVuY29kZXIgY29uZmlndXJhdGlvbiAoaS5lLiBiaXRyYXRlIG9yIEFPVCkuIEl0IGlzIG5vdCByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlc2UgdG9vbHMgbWFudWFsbHkuCitUaGUgQUFDIGVuY29kZXIgc3VwcG9ydHMgVE5TLCBQTlMsIE1TLCBJbnRlbnNpdHkgYW5kIGFjdGl2YXRlcyB0aGVzZSB0b29scworZGVwZW5kaW5nIG9uIHRoZSBhdWRpbyBzaWduYWwgYW5kIHRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKGkuZS4gYml0cmF0ZSBvcgorQU9UKS4gSXQgaXMgbm90IHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGVzZSB0b29scyBtYW51YWxseS4KIAotUE5TIGltcHJvdmVzIGVuY29kaW5nIHF1YWxpdHkgb25seSBmb3IgY2VydGFpbiBiaXRyYXRlcy4gVGhlcmVmb3JlIGl0IG1ha2VzIHNlbnNlIHRvIGFjdGl2YXRlIFBOUyBvbmx5IGZvcgotdGhlc2UgYml0cmF0ZXMgYW5kIHNhdmUgdGhlIHByb2Nlc3NpbmcgcG93ZXIgcmVxdWlyZWQgZm9yIFBOUyAoYWJvdXQgMTAgJSBvZiB0aGUgZW5jb2Rlcikgd2hlbiB1c2luZyBvdGhlcgotYml0cmF0ZXMuIFRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluc2lkZSB0aGUgZW5jb2RlciBsaWJyYXJ5LiBQTlMgaXMgZGlzYWJsZWQgaW5zaWRlIHRoZSBlbmNvZGVyIGxpYnJhcnkgaWYKLWFuIE1QRUctMiBBT1QgaXMgY2hvb3NlbiBzaW5jZSBQTlMgaXMgYW4gTVBFRy00IEFBQyBmZWF0dXJlLgorUE5TIGltcHJvdmVzIGVuY29kaW5nIHF1YWxpdHkgb25seSBmb3IgY2VydGFpbiBiaXRyYXRlcy4gVGhlcmVmb3JlIGl0IG1ha2VzCitzZW5zZSB0byBhY3RpdmF0ZSBQTlMgb25seSBmb3IgdGhlc2UgYml0cmF0ZXMgYW5kIHNhdmUgdGhlIHByb2Nlc3NpbmcgcG93ZXIKK3JlcXVpcmVkIGZvciBQTlMgKGFib3V0IDEwICUgb2YgdGhlIGVuY29kZXIpIHdoZW4gdXNpbmcgb3RoZXIgYml0cmF0ZXMuIFRoaXMgaXMKK2RvbmUgYXV0b21hdGljYWxseSBpbnNpZGUgdGhlIGVuY29kZXIgbGlicmFyeS4gUE5TIGlzIGRpc2FibGVkIGluc2lkZSB0aGUKK2VuY29kZXIgbGlicmFyeSBpZiBhbiBNUEVHLTIgQU9UIGlzIGNob29zZW4gc2luY2UgUE5TIGlzIGFuIE1QRUctNCBBQUMgZmVhdHVyZS4KIAotSWYgU0JSIGlzIGFjdGl2YXRlZCwgdGhlIGVuY29kZXIgYXV0b21hdGljYWxseSBkZWFjdGl2YXRlcyBQTlMgaW50ZXJuYWxseS4gSWYgVE5TIGlzIGRpc2FibGVkIGJ1dCBQTlMgaXMgYWxsb3dlZCwKLXRoZSBlbmNvZGVyIGRlYWN0aXZhdGVzIFBOUyBjYWxjdWxhdGlvbiBpbnRlcm5hbGx5LgorSWYgU0JSIGlzIGFjdGl2YXRlZCwgdGhlIGVuY29kZXIgYXV0b21hdGljYWxseSBkZWFjdGl2YXRlcyBQTlMgaW50ZXJuYWxseS4gSWYKK1ROUyBpcyBkaXNhYmxlZCBidXQgUE5TIGlzIGFsbG93ZWQsIHRoZSBlbmNvZGVyIGRlYWN0aXZhdGVzIFBOUyBjYWxjdWxhdGlvbgoraW50ZXJuYWxseS4KIAogKi8KIAotI2lmbmRlZiBfQUFDX0VOQ19MSUJfSF8KLSNkZWZpbmUgX0FBQ19FTkNfTElCX0hfCisjaWZuZGVmIEFBQ0VOQ19MSUJfSAorI2RlZmluZSBBQUNFTkNfTElCX0gKIAogI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgogI2luY2x1ZGUgIkZES19hdWRpby5oIgogCi0KIC8qKgogICogIEFBQyBlbmNvZGVyIGVycm9yIGNvZGVzLgogICovCiB0eXBlZGVmIGVudW0gewotICAgIEFBQ0VOQ19PSyAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwLCAgLyohPCBObyBlcnJvciBoYXBwZW5lZC4gQWxsIGZpbmUuICovCisgIEFBQ0VOQ19PSyA9IDB4MDAwMCwgLyohPCBObyBlcnJvciBoYXBwZW5lZC4gQWxsIGZpbmUuICovCiAKLSAgICBBQUNFTkNfSU5WQUxJRF9IQU5ETEUgICAgICAgICA9IDB4MDAyMCwgIC8qITwgSGFuZGxlIHBhc3NlZCB0byBmdW5jdGlvbiBjYWxsIHdhcyBpbnZhbGlkLiAqLwotICAgIEFBQ0VOQ19NRU1PUllfRVJST1IgICAgICAgICAgID0gMHgwMDIxLCAgLyohPCBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCi0gICAgQUFDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUiAgPSAweDAwMjIsICAvKiE8IFBhcmFtZXRlciBub3QgYXZhaWxhYmxlLiAqLwotICAgIEFBQ0VOQ19JTlZBTElEX0NPTkZJRyAgICAgICAgID0gMHgwMDIzLCAgLyohPCBDb25maWd1cmF0aW9uIG5vdCBwcm92aWRlZC4gKi8KKyAgQUFDRU5DX0lOVkFMSURfSEFORExFID0KKyAgICAgIDB4MDAyMCwgLyohPCBIYW5kbGUgcGFzc2VkIHRvIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQuICovCisgIEFBQ0VOQ19NRU1PUllfRVJST1IgPSAweDAwMjEsICAgICAgICAgIC8qITwgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLworICBBQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSID0gMHgwMDIyLCAvKiE8IFBhcmFtZXRlciBub3QgYXZhaWxhYmxlLiAqLworICBBQUNFTkNfSU5WQUxJRF9DT05GSUcgPSAweDAwMjMsICAgICAgICAvKiE8IENvbmZpZ3VyYXRpb24gbm90IHByb3ZpZGVkLiAqLwogCi0gICAgQUFDRU5DX0lOSVRfRVJST1IgICAgICAgICAgICAgPSAweDAwNDAsICAvKiE8IEdlbmVyYWwgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCi0gICAgQUFDRU5DX0lOSVRfQUFDX0VSUk9SICAgICAgICAgPSAweDAwNDEsICAvKiE8IEFBQyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwotICAgIEFBQ0VOQ19JTklUX1NCUl9FUlJPUiAgICAgICAgID0gMHgwMDQyLCAgLyohPCBTQlIgbGlicmFyeSBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KLSAgICBBQUNFTkNfSU5JVF9UUF9FUlJPUiAgICAgICAgICA9IDB4MDA0MywgIC8qITwgVHJhbnNwb3J0IGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCi0gICAgQUFDRU5DX0lOSVRfTUVUQV9FUlJPUiAgICAgICAgPSAweDAwNDQsICAvKiE8IE1ldGEgZGF0YSBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLworICBBQUNFTkNfSU5JVF9FUlJPUiA9IDB4MDA0MCwgICAgIC8qITwgR2VuZXJhbCBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KKyAgQUFDRU5DX0lOSVRfQUFDX0VSUk9SID0gMHgwMDQxLCAvKiE8IEFBQyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLworICBBQUNFTkNfSU5JVF9TQlJfRVJST1IgPSAweDAwNDIsIC8qITwgU0JSIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCisgIEFBQ0VOQ19JTklUX1RQX0VSUk9SID0gMHgwMDQzLCAvKiE8IFRyYW5zcG9ydCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLworICBBQUNFTkNfSU5JVF9NRVRBX0VSUk9SID0KKyAgICAgIDB4MDA0NCwgLyohPCBNZXRhIGRhdGEgbGlicmFyeSBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KKyAgQUFDRU5DX0lOSVRfTVBTX0VSUk9SID0gMHgwMDQ1LCAvKiE8IE1QUyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwogCi0gICAgQUFDRU5DX0VOQ09ERV9FUlJPUiAgICAgICAgICAgPSAweDAwNjAsICAvKiE8IFRoZSBlbmNvZGluZyBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBieSBhbiB1bmV4cGVjdGVkIGVycm9yLiAqLworICBBQUNFTkNfRU5DT0RFX0VSUk9SID0gMHgwMDYwLCAvKiE8IFRoZSBlbmNvZGluZyBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBieSBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkIGVycm9yLiAqLwogCi0gICAgQUFDRU5DX0VOQ09ERV9FT0YgICAgICAgICAgICAgPSAweDAwODAgICAvKiE8IEVuZCBvZiBmaWxlIHJlYWNoZWQuICovCisgIEFBQ0VOQ19FTkNPREVfRU9GID0gMHgwMDgwIC8qITwgRW5kIG9mIGZpbGUgcmVhY2hlZC4gKi8KIAogfSBBQUNFTkNfRVJST1I7CiAKLQogLyoqCiAgKiAgQUFDIGVuY29kZXIgYnVmZmVyIGRlc2NyaXB0b3JzIGlkZW50aWZpZXIuCi0gKiAgVGhpcyBpZGVudGlmaWVyIGFyZSB1c2VkIHdpdGhpbiBidWZmZXIgZGVzY3JpcHRvcnMgQUFDRU5DX0J1ZkRlc2M6OmJ1ZmZlcklkZW50aWZpZXJzLgorICogIFRoaXMgaWRlbnRpZmllciBhcmUgdXNlZCB3aXRoaW4gYnVmZmVyIGRlc2NyaXB0b3JzCisgKiBBQUNFTkNfQnVmRGVzYzo6YnVmZmVySWRlbnRpZmllcnMuCiAgKi8KIHR5cGVkZWYgZW51bSB7Ci0gICAgLyogSW5wdXQgYnVmZmVyIGlkZW50aWZpZXIuICovCi0gICAgSU5fQVVESU9fREFUQSAgICAgID0gMCwgICAgICAgICAgICAgICAgICAvKiE8IEF1ZGlvIGlucHV0IGJ1ZmZlciwgaW50ZXJsZWF2ZWQgSU5UX1BDTSBzYW1wbGVzLiAqLwotICAgIElOX0FOQ0lMTFJZX0RBVEEgICA9IDEsICAgICAgICAgICAgICAgICAgLyohPCBBbmNpbGxhcnkgZGF0YSB0byBiZSBlbWJlZGRlZCBpbnRvIGJpdHN0cmVhbS4gKi8KLSAgICBJTl9NRVRBREFUQV9TRVRVUCAgPSAyLCAgICAgICAgICAgICAgICAgIC8qITwgU2V0dXAgc3RydWN0dXJlIGZvciBlbWJlZGRpbmcgbWV0YSBkYXRhLiAqLworICAvKiBJbnB1dCBidWZmZXIgaWRlbnRpZmllci4gKi8KKyAgSU5fQVVESU9fREFUQSA9IDAsICAgIC8qITwgQXVkaW8gaW5wdXQgYnVmZmVyLCBpbnRlcmxlYXZlZCBJTlRfUENNIHNhbXBsZXMuICovCisgIElOX0FOQ0lMTFJZX0RBVEEgPSAxLCAvKiE8IEFuY2lsbGFyeSBkYXRhIHRvIGJlIGVtYmVkZGVkIGludG8gYml0c3RyZWFtLiAqLworICBJTl9NRVRBREFUQV9TRVRVUCA9IDIsIC8qITwgU2V0dXAgc3RydWN0dXJlIGZvciBlbWJlZGRpbmcgbWV0YSBkYXRhLiAqLwogCi0gICAgLyogT3V0cHV0IGJ1ZmZlciBpZGVudGlmaWVyLiAqLwotICAgIE9VVF9CSVRTVFJFQU1fREFUQSA9IDMsICAgICAgICAgICAgICAgICAgLyohPCBCdWZmZXIgaG9sZHMgYml0c3RyZWFtIG91dHB1dCBkYXRhLiAqLwotICAgIE9VVF9BVV9TSVpFUyAgICAgICA9IDQgICAgICAgICAgICAgICAgICAgLyohPCBCdWZmZXIgY29udGFpbnMgc2l6ZXMgb2YgZWFjaCBhY2Nlc3MgdW5pdC4gVGhpcyBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBuZWNlc3NhcnkgZm9yIHN1cGVyZnJhbWluZy4gKi8KKyAgLyogT3V0cHV0IGJ1ZmZlciBpZGVudGlmaWVyLiAqLworICBPVVRfQklUU1RSRUFNX0RBVEEgPSAzLCAvKiE8IEJ1ZmZlciBob2xkcyBiaXRzdHJlYW0gb3V0cHV0IGRhdGEuICovCisgIE9VVF9BVV9TSVpFUyA9CisgICAgICA0IC8qITwgQnVmZmVyIGNvbnRhaW5zIHNpemVzIG9mIGVhY2ggYWNjZXNzIHVuaXQuIFRoaXMgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICBpcyBuZWNlc3NhcnkgZm9yIHN1cGVyZnJhbWluZy4gKi8KIAogfSBBQUNFTkNfQnVmZmVySWRlbnRpZmllcjsKIAotCiAvKioKICAqICBBQUMgZW5jb2RlciBoYW5kbGUuCiAgKi8KIHR5cGVkZWYgc3RydWN0IEFBQ0VOQ09ERVIgKkhBTkRMRV9BQUNFTkNPREVSOwogCi0KIC8qKgogICogIFByb3ZpZGVzIHNvbWUgaW5mbyBhYm91dCB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uLgogICovCiB0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgbWF4T3V0QnVmQnl0ZXM7IC8qITwgTWF4aW11bSBudW1iZXIgb2YgZW5jb2RlciBiaXRzdHJlYW0gYnl0ZXMgd2l0aGluIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS4gU2l6ZSBkZXBlbmRzIG9uIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyBpbiBlbmNvZGVyIGluc3RhbmNlLiBGb3Igc3VwZXJmcmFtaW5nIChhcworICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciBleGFtcGxlIGluIERBQispLCBzaXplIGhhcyB0byBiZSBhIG11bHRpcGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZ2x5LiAqLwogCi0gICAgVUlOVCAgICAgICAgICAgICAgICBtYXhPdXRCdWZCeXRlczsgICAgICAvKiE8IE1heGltdW0gbnVtYmVyIG9mIGVuY29kZXIgYml0c3RyZWFtIGJ5dGVzIHdpdGhpbiBvbmUgZnJhbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgZGVwZW5kcyBvbiBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgY2hhbm5lbHMgaW4gZW5jb2RlciBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHN1cGVyZnJhbWluZyAoYXMgdXNlZCBmb3IgZXhhbXBsZSBpbiBEQUIrKSwgc2l6ZSBoYXMgdG8gYmUgYSBtdWx0aXBsZSBhY2NvcmRpbmdseS4gKi8KKyAgVUlOVCBtYXhBbmNCeXRlczsgLyohPCBNYXhpbXVtIG51bWJlciBvZiBhbmNpbGxhcnkgZGF0YSBieXRlcyB3aGljaCBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgaW50byBiaXRzdHJlYW0gd2l0aGluIG9uZSBmcmFtZS4gKi8KIAotICAgIFVJTlQgICAgICAgICAgICAgICAgbWF4QW5jQnl0ZXM7ICAgICAgICAgLyohPCBNYXhpbXVtIG51bWJlciBvZiBhbmNpbGxhcnkgZGF0YSBieXRlcyB3aGljaCBjYW4gYmUgaW5zZXJ0ZWQgaW50bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gd2l0aGluIG9uZSBmcmFtZS4gKi8KKyAgVUlOVCBpbkJ1ZkZpbGxMZXZlbDsgLyohPCBJbnRlcm5hbCBpbnB1dCBidWZmZXIgZmlsbCBsZXZlbCBpbiBzYW1wbGVzIHBlcgorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLiBUaGlzIHBhcmFtZXRlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzYW1wbGluZ3JhdGUgb3IgY2hhbm5lbChNb2RlL09yZGVyKSBjaGFuZ2VzLiAqLwogCi0gICAgVUlOVCAgICAgICAgICAgICAgICBpbkJ1ZkZpbGxMZXZlbDsgICAgICAvKiE8IEludGVybmFsIGlucHV0IGJ1ZmZlciBmaWxsIGxldmVsIGluIHNhbXBsZXMgcGVyIGNoYW5uZWwuIFRoaXMgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYXV0b21hdGljYWxseSBiZSBjbGVhcmVkIGlmIHNhbXBsaW5ncmF0ZSBvciBjaGFubmVsKE1vZGUvT3JkZXIpIGNoYW5nZXMuICovCisgIFVJTlQgaW5wdXRDaGFubmVsczsgLyohPCBOdW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgZXhwZWN0ZWQgaW4gZW5jb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLiAqLwogCi0gICAgVUlOVCAgICAgICAgICAgICAgICBpbnB1dENoYW5uZWxzOyAgICAgICAvKiE8IE51bWJlciBvZiBpbnB1dCBjaGFubmVscyBleHBlY3RlZCBpbiBlbmNvZGluZyBwcm9jZXNzLiAqLworICBVSU5UIGZyYW1lTGVuZ3RoOyAvKiE8IEFtb3VudCBvZiBpbnB1dCBhdWRpbyBzYW1wbGVzIGNvbnN1bWVkIGVhY2ggZnJhbWUgcGVyCisgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsIGRlcGVuZGluZyBvbiBhdWRpbyBvYmplY3QgdHlwZSBjb25maWd1cmF0aW9uLiAqLwogCi0gICAgVUlOVCAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aDsgICAgICAgICAvKiE8IEFtb3VudCBvZiBpbnB1dCBhdWRpbyBzYW1wbGVzIGNvbnN1bWVkIGVhY2ggZnJhbWUgcGVyIGNoYW5uZWwsIGRlcGVuZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBhdWRpbyBvYmplY3QgdHlwZSBjb25maWd1cmF0aW9uLiAqLworICBVSU5UIG5EZWxheTsgLyohPCBDb2RlYyBkZWxheSBpbiBQQ00gc2FtcGxlcy9jaGFubmVsLiBEZXBlbmRzIG9uIGZyYW1lbGVuZ3RoCisgICAgICAgICAgICAgICAgICBhbmQgQU9ULiBEb2VzIG5vdCBpbmNsdWRlIGZyYW1pbmcgZGVsYXkgZm9yIGZpbGxpbmcgdXAgZW5jb2RlcgorICAgICAgICAgICAgICAgICAgUENNIGlucHV0IGJ1ZmZlci4gKi8KIAotICAgIFVJTlQgICAgICAgICAgICAgICAgZW5jb2RlckRlbGF5OyAgICAgICAgLyohPCBDb2RlYyBkZWxheSBpbiBQQ00gc2FtcGxlcy9jaGFubmVsLiBEZXBlbmRzIG9uIGZyYW1lbGVuZ3RoIGFuZCBBT1QuIERvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgZnJhbWluZyBkZWxheSBmb3IgZmlsbGluZyB1cCBlbmNvZGVyIFBDTSBpbnB1dCBidWZmZXIuICovCisgIFVJTlQgbkRlbGF5Q29yZTsgLyohPCBDb2RlYyBkZWxheSBpbiBQQ00gc2FtcGxlcy9jaGFubmVsLCB3L28gZGVsYXkgY2F1c2VkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgdGhlIGRlY29kZXIgU0JSIG1vZHVsZS4gVGhpcyBkZWxheSBpcyBuZWVkZWQgdG8gY29ycmVjdGx5CisgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgZWRpdCBsaXN0cyBmb3IgZ2FwbGVzcyBwbGF5YmFjay4gVGhlIGRlY29kZXIgbWF5IG5vdAorICAgICAgICAgICAgICAgICAgICAgIGtub3cgaG93IG11Y2ggZGVsYXkgaXMgaW50cm9kY3VlZCBieSBTQlIsIHNpbmNlIGl0IG1heSBub3QKKyAgICAgICAgICAgICAgICAgICAgICBrbm93IGlmIFNCUiBpcyBhY3RpdmUgYXQgYWxsIChpbXBsaWNpdCBzaWduYWxpbmcpLAorICAgICAgICAgICAgICAgICAgICAgIHRoZXJlZm9yZSB0aGUgZGVvY2RlciBtdXN0IHRha2UgaW50byBhY2NvdW50IGFueSBkZWxheQorICAgICAgICAgICAgICAgICAgICAgIGNhdXNlZCBieSB0aGUgU0JSIG1vZHVsZS4gKi8KIAotICAgIFVDSEFSICAgICAgICAgICAgICAgY29uZkJ1Zls2NF07ICAgICAgICAgLyohPCBDb25maWd1cmF0aW9uIGJ1ZmZlciBpbiBiaW5hcnkgZm9ybWF0IGFzIGFuIEF1ZGlvU3BlY2lmaWNDb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgU3RyZWFtTXV4Q29uZmlnIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgdHJhbnNwb3J0IHR5cGUuICovCisgIFVDSEFSIGNvbmZCdWZbNjRdOyAvKiE8IENvbmZpZ3VyYXRpb24gYnVmZmVyIGluIGJpbmFyeSBmb3JtYXQgYXMgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3BlY2lmaWNDb25maWcgb3IgU3RyZWFtTXV4Q29uZmlnIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIHRyYW5zcG9ydCB0eXBlLiAqLwogCi0gICAgVUlOVCAgICAgICAgICAgICAgICBjb25mU2l6ZTsgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBjb25mQnVmLiAqLworICBVSU5UIGNvbmZTaXplOyAvKiE8IE51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBjb25mQnVmLiAqLwogCiB9IEFBQ0VOQ19JbmZvU3RydWN0OwogCi0KIC8qKgogICogIERlc2NyaWJlcyB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGZvciBhbiBhYWNFbmNFbmNvZGUoKSBjYWxsLgogICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgSU5UICAgICAgICAgICAgICAgICBudW1CdWZzOyAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBidWZmZXJzLiAqLwotICAgIHZvaWQgICAgICAgICAgICAgICoqYnVmczsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHZlY3RvciBjb250YWluaW5nIGJ1ZmZlciBhZGRyZXNzZXMuICovCi0gICAgSU5UICAgICAgICAgICAgICAgICpidWZmZXJJZGVudGlmaWVyczsgICAvKiE8IElkZW50aWZpZXIgb2YgZWFjaCBidWZmZXIgZWxlbWVudC4gU2VlIDo6QUFDRU5DX0J1ZmZlcklkZW50aWZpZXIuICovCi0gICAgSU5UICAgICAgICAgICAgICAgICpidWZTaXplczsgICAgICAgICAgICAvKiE8IFNpemUgb2YgZWFjaCBidWZmZXIgaW4gOC1iaXQgYnl0ZXMuICovCi0gICAgSU5UICAgICAgICAgICAgICAgICpidWZFbFNpemVzOyAgICAgICAgICAvKiE8IFNpemUgb2YgZWFjaCBidWZmZXIgZWxlbWVudCBpbiBieXRlcy4gKi8KKyAgSU5UIG51bUJ1ZnM7ICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYnVmZmVycy4gKi8KKyAgdm9pZCAqKmJ1ZnM7ICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHZlY3RvciBjb250YWluaW5nIGJ1ZmZlciBhZGRyZXNzZXMuICovCisgIElOVCAqYnVmZmVySWRlbnRpZmllcnM7IC8qITwgSWRlbnRpZmllciBvZiBlYWNoIGJ1ZmZlciBlbGVtZW50LiBTZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpBQUNFTkNfQnVmZmVySWRlbnRpZmllci4gKi8KKyAgSU5UICpidWZTaXplczsgICAgICAgICAgLyohPCBTaXplIG9mIGVhY2ggYnVmZmVyIGluIDgtYml0IGJ5dGVzLiAqLworICBJTlQgKmJ1ZkVsU2l6ZXM7ICAgICAgICAvKiE8IFNpemUgb2YgZWFjaCBidWZmZXIgZWxlbWVudCBpbiBieXRlcy4gKi8KIAogfSBBQUNFTkNfQnVmRGVzYzsKIAotCiAvKioKICAqICBEZWZpbmVzIHRoZSBpbnB1dCBhcmd1bWVudHMgZm9yIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBJTlQgICAgICAgICAgICAgICAgIG51bUluU2FtcGxlczsgICAgICAgIC8qITwgTnVtYmVyIG9mIHZhbGlkIGlucHV0IGF1ZGlvIHNhbXBsZXMgKG11bHRpcGxlIG9mIGlucHV0IGNoYW5uZWxzKS4gKi8KLSAgICBJTlQgICAgICAgICAgICAgICAgIG51bUFuY0J5dGVzOyAgICAgICAgIC8qITwgTnVtYmVyIG9mIGFuY2lsbGFyeSBkYXRhIGJ5dGVzIHRvIGJlIGVuY29kZWQuICovCisgIElOVCBudW1JblNhbXBsZXM7IC8qITwgTnVtYmVyIG9mIHZhbGlkIGlucHV0IGF1ZGlvIHNhbXBsZXMgKG11bHRpcGxlIG9mIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzKS4gKi8KKyAgSU5UIG51bUFuY0J5dGVzOyAgLyohPCBOdW1iZXIgb2YgYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgdG8gYmUgZW5jb2RlZC4gKi8KIAogfSBBQUNFTkNfSW5BcmdzOwogCi0KIC8qKgogICogIERlZmluZXMgdGhlIG91dHB1dCBhcmd1bWVudHMgZm9yIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBJTlQgICAgICAgICAgICAgICAgIG51bU91dEJ5dGVzOyAgICAgICAgIC8qITwgTnVtYmVyIG9mIHZhbGlkIGJpdHN0cmVhbSBieXRlcyBnZW5lcmF0ZWQgZHVyaW5nIGFhY0VuY0VuY29kZSgpLiAqLwotICAgIElOVCAgICAgICAgICAgICAgICAgbnVtSW5TYW1wbGVzOyAgICAgICAgLyohPCBOdW1iZXIgb2YgaW5wdXQgYXVkaW8gc2FtcGxlcyBjb25zdW1lZCBieSB0aGUgZW5jb2Rlci4gKi8KLSAgICBJTlQgICAgICAgICAgICAgICAgIG51bUFuY0J5dGVzOyAgICAgICAgIC8qITwgTnVtYmVyIG9mIGFuY2lsbGFyeSBkYXRhIGJ5dGVzIGNvbnN1bWVkIGJ5IHRoZSBlbmNvZGVyLiAqLworICBJTlQgbnVtT3V0Qnl0ZXM7ICAvKiE8IE51bWJlciBvZiB2YWxpZCBiaXRzdHJlYW0gYnl0ZXMgZ2VuZXJhdGVkIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICBhYWNFbmNFbmNvZGUoKS4gKi8KKyAgSU5UIG51bUluU2FtcGxlczsgLyohPCBOdW1iZXIgb2YgaW5wdXQgYXVkaW8gc2FtcGxlcyBjb25zdW1lZCBieSB0aGUgZW5jb2Rlci4KKyAgICAgICAgICAgICAgICAgICAgICovCisgIElOVCBudW1BbmNCeXRlczsgIC8qITwgTnVtYmVyIG9mIGFuY2lsbGFyeSBkYXRhIGJ5dGVzIGNvbnN1bWVkIGJ5IHRoZSBlbmNvZGVyLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSU5UIGJpdFJlc1N0YXRlOyAgLyohPCBTdGF0ZSBvZiB0aGUgYml0IHJlc2Vydm9pciBpbiBiaXRzLiAqLwogCiB9IEFBQ0VOQ19PdXRBcmdzOwogCi0KIC8qKgogICogIE1ldGEgRGF0YSBDb21wcmVzc2lvbiBQcm9maWxlcy4KICAqLwogdHlwZWRlZiBlbnVtIHsKLSAgICBBQUNFTkNfTUVUQURBVEFfRFJDX05PTkUgICAgICAgICAgPSAwLCAgIC8qITwgTm9uZS4gKi8KLSAgICBBQUNFTkNfTUVUQURBVEFfRFJDX0ZJTE1TVEFOREFSRCAgPSAxLCAgIC8qITwgRmlsbSBzdGFuZGFyZC4gKi8KLSAgICBBQUNFTkNfTUVUQURBVEFfRFJDX0ZJTE1MSUdIVCAgICAgPSAyLCAgIC8qITwgRmlsbSBsaWdodC4gKi8KLSAgICBBQUNFTkNfTUVUQURBVEFfRFJDX01VU0lDU1RBTkRBUkQgPSAzLCAgIC8qITwgTXVzaWMgc3RhbmRhcmQuICovCi0gICAgQUFDRU5DX01FVEFEQVRBX0RSQ19NVVNJQ0xJR0hUICAgID0gNCwgICAvKiE8IE11c2ljIGxpZ2h0LiAqLwotICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfU1BFRUNIICAgICAgICA9IDUgICAgLyohPCBTcGVlY2guICovCisgIEFBQ0VOQ19NRVRBREFUQV9EUkNfTk9ORSA9IDAsICAgICAgICAgIC8qITwgTm9uZS4gKi8KKyAgQUFDRU5DX01FVEFEQVRBX0RSQ19GSUxNU1RBTkRBUkQgPSAxLCAgLyohPCBGaWxtIHN0YW5kYXJkLiAqLworICBBQUNFTkNfTUVUQURBVEFfRFJDX0ZJTE1MSUdIVCA9IDIsICAgICAvKiE8IEZpbG0gbGlnaHQuICovCisgIEFBQ0VOQ19NRVRBREFUQV9EUkNfTVVTSUNTVEFOREFSRCA9IDMsIC8qITwgTXVzaWMgc3RhbmRhcmQuICovCisgIEFBQ0VOQ19NRVRBREFUQV9EUkNfTVVTSUNMSUdIVCA9IDQsICAgIC8qITwgTXVzaWMgbGlnaHQuICovCisgIEFBQ0VOQ19NRVRBREFUQV9EUkNfU1BFRUNIID0gNSwgICAgICAgIC8qITwgU3BlZWNoLiAqLworICBBQUNFTkNfTUVUQURBVEFfRFJDX05PVF9QUkVTRU5UID0KKyAgICAgIDI1NiAvKiE8IERpc2FibGUgd3JpdGluZyBnYWluIGZhY3RvciAodXNlZCBmb3IgY29tcF9wcm9maWxlIG9ubHkpLiAqLwogCiB9IEFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRTsKIAotCiAvKioKICAqICBNZXRhIERhdGEgc2V0dXAgc3RydWN0dXJlLgogICovCiB0eXBlZGVmIHN0cnVjdCB7CisgIEFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRQorICBkcmNfcHJvZmlsZTsgLyohPCBNUEVHIERSQyBjb21wcmVzc2lvbiBwcm9maWxlLiBTZWUKKyAgICAgICAgICAgICAgICAgIDo6QUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFLiAqLworICBBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUKKyAgY29tcF9wcm9maWxlOyAvKiE8IEVUU0kgaGVhdnkgY29tcHJlc3Npb24gcHJvZmlsZS4gU2VlCisgICAgICAgICAgICAgICAgICAgOjpBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUuICovCiAKLSAgQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIGRyY19wcm9maWxlOyAgICAgICAgICAgICAvKiE8IE1QRUcgRFJDIGNvbXByZXNzaW9uIHByb2ZpbGUuIFNlZSA6OkFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRS4gKi8KLSAgQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIGNvbXBfcHJvZmlsZTsgICAgICAgICAgICAvKiE8IEVUU0kgaGVhdnkgY29tcHJlc3Npb24gcHJvZmlsZS4gU2VlIDo6QUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFLiAqLworICBJTlQgZHJjX1RhcmdldFJlZkxldmVsOyAgLyohPCBVc2VkIHRvIGRlZmluZSBleHBlY3RlZCBsZXZlbCB0bzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVkIHdpdGggMTYgYml0LiB4KjJeMTYuICovCisgIElOVCBjb21wX1RhcmdldFJlZkxldmVsOyAvKiE8IEFkanVzdCBsaW1pdGVyIHRvIGF2b2lkIG92ZXJsb2FkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZWQgd2l0aCAxNiBiaXQuIHgqMl4xNi4gKi8KIAotICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgZHJjX1RhcmdldFJlZkxldmVsOyAgICAgIC8qITwgVXNlZCB0byBkZWZpbmUgZXhwZWN0ZWQgbGV2ZWwgdG86Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZWQgd2l0aCAxNiBiaXQuIHgqMl4xNi4gKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfVGFyZ2V0UmVmTGV2ZWw7ICAgICAvKiE8IEFkanVzdCBsaW1pdGVyIHRvIGF2b2lkIG92ZXJsb2FkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVkIHdpdGggMTYgYml0LiB4KjJeMTYuICovCisgIElOVCBwcm9nX3JlZl9sZXZlbF9wcmVzZW50OyAvKiE8IEZsYWcsIGlmIHByb2dfcmVmX2xldmVsIGlzIHByZXNlbnQgKi8KKyAgSU5UIHByb2dfcmVmX2xldmVsOyAgICAgICAgIC8qITwgUHJvZ3JhbW1lIFJlZmVyZW5jZSBMZXZlbCA9IERpYWxvZ3VlIExldmVsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzEuNzVkQiAuLiAwIGRCIDsgc3RlcHNpemU6IDAuMjVkQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZWQgd2l0aCAxNiBiaXQuIHgqMl4xNi4qLwogCi0gIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nX3JlZl9sZXZlbF9wcmVzZW50OyAgLyohPCBGbGFnLCBpZiBwcm9nX3JlZl9sZXZlbCBpcyBwcmVzZW50ICovCi0gIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nX3JlZl9sZXZlbDsgICAgICAgICAgLyohPCBQcm9ncmFtbWUgUmVmZXJlbmNlIExldmVsID0gRGlhbG9ndWUgTGV2ZWw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzEuNzVkQiAuLiAwIGRCIDsgc3RlcHNpemU6IDAuMjVkQgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVkIHdpdGggMTYgYml0LiB4KjJeMTYuKi8KKyAgVUNIQVIgUENFX21peGRvd25faWR4X3ByZXNlbnQ7IC8qITwgRmxhZywgaWYgZG14LWlkeCBzaG91bGQgYmUgd3JpdHRlbiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbW1lIGNvbmZpZyBlbGVtZW50ICovCisgIFVDSEFSIEVUU0lfRG14THZsX3ByZXNlbnQ7ICAgICAvKiE8IEZsYWcsIGlmIGRteC1sdmwgc2hvdWxkIGJlIHdyaXR0ZW4gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVUU0ktYW5jRGF0YSAqLwogCi0gIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICBQQ0VfbWl4ZG93bl9pZHhfcHJlc2VudDsgLyohPCBGbGFnLCBpZiBkbXgtaWR4IHNob3VsZCBiZSB3cml0dGVuIGluIHByb2dyYW1tZSBjb25maWcgZWxlbWVudCAqLwotICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgRVRTSV9EbXhMdmxfcHJlc2VudDsgICAgIC8qITwgRmxhZywgaWYgZG14LWx2bCBzaG91bGQgYmUgd3JpdHRlbiBpbiBFVFNJLWFuY0RhdGEgKi8KKyAgU0NIQVIgY2VudGVyTWl4TGV2ZWw7IC8qITwgQ2VudGVyIGRvd25taXggbGV2ZWwgKDAuLi43LCBhY2NvcmRpbmcgdG8gdGFibGUpICovCisgIFNDSEFSIHN1cnJvdW5kTWl4TGV2ZWw7IC8qITwgU3Vycm91bmQgZG93bm1peCBsZXZlbCAoMC4uLjcsIGFjY29yZGluZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSkgKi8KIAotICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyTWl4TGV2ZWw7ICAgICAgICAgIC8qITwgQ2VudGVyIGRvd25taXggbGV2ZWwgKDAuLi43LCBhY2NvcmRpbmcgdG8gdGFibGUpICovCi0gIFNDSEFSICAgICAgICAgICAgICAgICAgICAgICBzdXJyb3VuZE1peExldmVsOyAgICAgICAgLyohPCBTdXJyb3VuZCBkb3dubWl4IGxldmVsICgwLi4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLworICBVQ0hBUgorICBkb2xieVN1cnJvdW5kTW9kZTsgLyohPCBJbmRpY2F0aW9uIGZvciBEb2xieSBTdXJyb3VuZCBFbmNvZGluZyBNb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERvbGJ5IFN1cnJvdW5kIG1vZGUgbm90IGluZGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IDItY2ggYXVkaW8gcGFydCBpcyBub3QgRG9sYnkgc3Vycm91bmQgZW5jb2RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IDItY2ggYXVkaW8gcGFydCBpcyBEb2xieSBzdXJyb3VuZCBlbmNvZGVkICovCiAKLSAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgIGRvbGJ5U3Vycm91bmRNb2RlOyAgICAgICAvKiE8IEluZGljYXRpb24gZm9yIERvbGJ5IFN1cnJvdW5kIEVuY29kaW5nIE1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERvbGJ5IFN1cnJvdW5kIG1vZGUgbm90IGluZGljYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiAyLWNoIGF1ZGlvIHBhcnQgaXMgbm90IERvbGJ5IHN1cnJvdW5kIGVuY29kZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogMi1jaCBhdWRpbyBwYXJ0IGlzIERvbGJ5IHN1cnJvdW5kIGVuY29kZWQgKi8KKyAgVUNIQVIgZHJjUHJlc2VudGF0aW9uTW9kZTsgLyohPCBJbmRpY2F0aW4gZm9yIERSQyBQcmVzZW50YXRpb24gTW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IFByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IFByZXNlbnRhdGlvbiBtb2RlIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IFByZXNlbnRhdGlvbiBtb2RlIDIgKi8KKworICBzdHJ1Y3QgeworICAgIC8qIGV4dGVuZGVkIGFuY2lsbGFyeSBkYXRhICovCisgICAgVUNIQVIgZXh0QW5jRGF0YUVuYWJsZTsgLyo8IEluZGljYXRlcyBpZiBNUEVHNF9leHRfYW5jaWxsYXJ5X2RhdGEoKSBleGlzdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogTm8gTVBFRzRfZXh0X2FuY2lsbGFyeV9kYXRhKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogSW5zZXJ0IE1QRUc0X2V4dF9hbmNpbGxhcnlfZGF0YSgpLiAqLworCisgICAgVUNIQVIKKyAgICBleHREb3dubWl4TGV2ZWxFbmFibGU7ICAgLyo8IEluZGljYXRlcyBpZiBleHRfZG93bm1peGluZ19sZXZlbHMoKSBleGlzdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IE5vIGV4dF9kb3dubWl4aW5nX2xldmVscygpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBJbnNlcnQgZXh0X2Rvd25taXhpbmdfbGV2ZWxzKCkuICovCisgICAgVUNIQVIgZXh0RG93bm1peExldmVsX0E7IC8qPCBEb3dubWl4IGxldmVsIGluZGV4IEEgKDAuLi43LCBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUpICovCisgICAgVUNIQVIgZXh0RG93bm1peExldmVsX0I7IC8qPCBEb3dubWl4IGxldmVsIGluZGV4IEIgKDAuLi43LCBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUpICovCisKKyAgICBVQ0hBUiBkbXhHYWluRW5hYmxlOyAvKjwgSW5kaWNhdGVzIGlmIGV4dF9kb3dubWl4aW5nX2dsb2JhbF9nYWlucygpIGV4aXN0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBObyBleHRfZG93bm1peGluZ19nbG9iYWxfZ2FpbnMoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBJbnNlcnQgZXh0X2Rvd25taXhpbmdfZ2xvYmFsX2dhaW5zKCkuICovCisgICAgSU5UIGRteEdhaW41OyAgICAgICAgLyo8IEdhaW4gZmFjdG9yIGZvciBkb3dubWl4IHRvIDUgY2hhbm5lbHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTUuNzVkQiAuLiAtMTUuNzVkQjsgc3RlcHNpemU6IDAuMjVkQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVkIHdpdGggMTYgYml0LiB4KjJeMTYuKi8KKyAgICBJTlQgZG14R2FpbjI7ICAgICAgICAvKjwgR2FpbiBmYWN0b3IgZm9yIGRvd25taXggdG8gMiBjaGFubmVscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNS43NWRCIC4uIC0xNS43NWRCOyBzdGVwc2l6ZTogMC4yNWRCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZWQgd2l0aCAxNiBiaXQuIHgqMl4xNi4qLworCisgICAgVUNIQVIgbGZlRG14RW5hYmxlOyAvKjwgSW5kaWNhdGVzIGlmIGV4dF9kb3dubWl4aW5nX2xmZV9sZXZlbCgpIGV4aXN0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IE5vIGV4dF9kb3dubWl4aW5nX2xmZV9sZXZlbCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogSW5zZXJ0IGV4dF9kb3dubWl4aW5nX2xmZV9sZXZlbCgpLiAqLworICAgIFVDSEFSIGxmZURteExldmVsOyAgLyo8IERvd25taXggbGV2ZWwgaW5kZXggZm9yIExGRSAoMC4uMTUsIGFjY29yZGluZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUpICovCisKKyAgfSBFeHRNZXRhRGF0YTsKKwogfSBBQUNFTkNfTWV0YURhdGE7CiAKLQogLyoqCiAgKiBBQUMgZW5jb2RlciBjb250cm9sIGZsYWdzLgogICoKLSAqIEluIGludGVyYWN0aW9uIHdpdGggdGhlIDo6QUFDRU5DX0NPTlRST0xfU1RBVEUgcGFyYW1ldGVyIGl0IGlzIHBvc3NpYmxlIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwKLSAqIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gb3ZlcndyaXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSBmcm9tIGV4dGVybiB3aGVuIG5lY2Vzc2FyeS4KKyAqIEluIGludGVyYWN0aW9uIHdpdGggdGhlIDo6QUFDRU5DX0NPTlRST0xfU1RBVEUgcGFyYW1ldGVyIGl0IGlzIHBvc3NpYmxlIHRvCisgKiBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuIEl0IGlzIGFsc28KKyAqIHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgZnJvbSBleHRlcm4gd2hlbiBuZWNlc3NhcnkuCiAgKi8KLXR5cGVkZWYgZW51bQotewotICAgIEFBQ0VOQ19JTklUX05PTkUgICAgICAgICAgICAgID0gMHgwMDAwLCAgLyohPCBEbyBub3QgdHJpZ2dlciBpbml0aWFsaXphdGlvbi4gKi8KLSAgICBBQUNFTkNfSU5JVF9DT05GSUcgICAgICAgICAgICA9IDB4MDAwMSwgIC8qITwgSW5pdGlhbGl6ZSBhbGwgZW5jb2RlciBtb2R1bGVzIGNvbmZpZ3VyYXRpb24uICovCi0gICAgQUFDRU5DX0lOSVRfU1RBVEVTICAgICAgICAgICAgPSAweDAwMDIsICAvKiE8IFJlc2V0IGFsbCBlbmNvZGVyIG1vZHVsZXMgaGlzdG9yeSBidWZmZXIuICovCi0gICAgQUFDRU5DX0lOSVRfVFJBTlNQT1JUICAgICAgICAgPSAweDEwMDAsICAvKiE8IEluaXRpYWxpemUgdHJhbnNwb3J0IGxpYiB3aXRoIG5ldyBwYXJhbWV0ZXJzLiAqLwotICAgIEFBQ0VOQ19SRVNFVF9JTkJVRkZFUiAgICAgICAgID0gMHgyMDAwLCAgLyohPCBSZXNldCBmaWxsIGxldmVsIG9mIGludGVybmFsIGlucHV0IGJ1ZmZlci4gKi8KLSAgICBBQUNFTkNfSU5JVF9BTEwgICAgICAgICAgICAgICA9IDB4RkZGRiAgIC8qITwgSW5pdGlhbGl6ZSBhbGwuICovCi19Ci1BQUNFTkNfQ1RSTEZMQUdTOwotCit0eXBlZGVmIGVudW0geworICBBQUNFTkNfSU5JVF9OT05FID0gMHgwMDAwLCAvKiE8IERvIG5vdCB0cmlnZ2VyIGluaXRpYWxpemF0aW9uLiAqLworICBBQUNFTkNfSU5JVF9DT05GSUcgPQorICAgICAgMHgwMDAxLCAvKiE8IEluaXRpYWxpemUgYWxsIGVuY29kZXIgbW9kdWxlcyBjb25maWd1cmF0aW9uLiAqLworICBBQUNFTkNfSU5JVF9TVEFURVMgPSAweDAwMDIsIC8qITwgUmVzZXQgYWxsIGVuY29kZXIgbW9kdWxlcyBoaXN0b3J5IGJ1ZmZlci4gKi8KKyAgQUFDRU5DX0lOSVRfVFJBTlNQT1JUID0KKyAgICAgIDB4MTAwMCwgLyohPCBJbml0aWFsaXplIHRyYW5zcG9ydCBsaWIgd2l0aCBuZXcgcGFyYW1ldGVycy4gKi8KKyAgQUFDRU5DX1JFU0VUX0lOQlVGRkVSID0KKyAgICAgIDB4MjAwMCwgICAgICAgICAgICAgIC8qITwgUmVzZXQgZmlsbCBsZXZlbCBvZiBpbnRlcm5hbCBpbnB1dCBidWZmZXIuICovCisgIEFBQ0VOQ19JTklUX0FMTCA9IDB4RkZGRiAvKiE8IEluaXRpYWxpemUgYWxsLiAqLworfSBBQUNFTkNfQ1RSTEZMQUdTOwogCiAvKioKICAqIFxicmllZiAgQUFDIGVuY29kZXIgc2V0dGluZyBwYXJhbWV0ZXJzLgogICoKLSAqIFVzZSBhYWNFbmNvZGVyX1NldFBhcmFtKCkgZnVuY3Rpb24gdG8gY29uZmlndXJlLCBvciB1c2UgYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGZ1bmN0aW9uIHRvIHJlYWQKLSAqIHRoZSBpbnRlcm5hbCBzdGF0dXMgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLgorICogVXNlIGFhY0VuY29kZXJfU2V0UGFyYW0oKSBmdW5jdGlvbiB0byBjb25maWd1cmUsIG9yIHVzZSBhYWNFbmNvZGVyX0dldFBhcmFtKCkKKyAqIGZ1bmN0aW9uIHRvIHJlYWQgdGhlIGludGVybmFsIHN0YXR1cyBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMuCiAgKi8KLXR5cGVkZWYgZW51bQotewotICBBQUNFTkNfQU9UICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTAwLCAgLyohPCBBdWRpbyBvYmplY3QgdHlwZS4gU2VlIDo6QVVESU9fT0JKRUNUX1RZUEUgaW4gRkRLX2F1ZGlvLmguCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogTVBFRy00IEFBQyBMb3cgQ29tcGxleGl0eS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA1OiBNUEVHLTQgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbiAoSEUtQUFDKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOTogTVBFRy00IEFBQyBMb3cgQ29tcGxleGl0eSB3aXRoIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24gYW5kIFBhcmFtZXRyaWMgU3RlcmVvIChIRS1BQUMgdjIpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHVzZWQgb25seSB3aXRoIHN0ZXJlbyBpbnB1dCBhdWRpbyBkYXRhLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDIzOiBNUEVHLTQgQUFDIExvdy1EZWxheS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAzOTogTVBFRy00IEFBQyBFbmhhbmNlZCBMb3ctRGVsYXkuIFNpbmNlIHRoZXJlIGlzIG5vIDo6QVVESU9fT0JKRUNUX1RZUEUgZm9yIEVMRCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5hdGlvbiB3aXRoIFNCUiBkZWZpbmVkLCBlbmFibGUgU0JSIGV4cGxpY2l0ZWx5IGJ5IDo6QUFDRU5DX1NCUl9NT0RFIHBhcmFtZXRlci4gKi8KK3R5cGVkZWYgZW51bSB7CisgIEFBQ0VOQ19BT1QgPQorICAgICAgMHgwMTAwLCAvKiE8IEF1ZGlvIG9iamVjdCB0eXBlLiBTZWUgOjpBVURJT19PQkpFQ1RfVFlQRSBpbiBGREtfYXVkaW8uaC4KKyAgICAgICAgICAgICAgICAgICAtIDI6IE1QRUctNCBBQUMgTG93IENvbXBsZXhpdHkuCisgICAgICAgICAgICAgICAgICAgLSA1OiBNUEVHLTQgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAoSEUtQUFDKS4KKyAgICAgICAgICAgICAgICAgICAtIDI5OiBNUEVHLTQgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZAorICAgICAgICAgICAgICAgICBSZXBsaWNhdGlvbiBhbmQgUGFyYW1ldHJpYyBTdGVyZW8gKEhFLUFBQyB2MikuIFRoaXMKKyAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBjYW4gYmUgdXNlZCBvbmx5IHdpdGggc3RlcmVvIGlucHV0IGF1ZGlvIGRhdGEuCisgICAgICAgICAgICAgICAgICAgLSAyMzogTVBFRy00IEFBQyBMb3ctRGVsYXkuCisgICAgICAgICAgICAgICAgICAgLSAzOTogTVBFRy00IEFBQyBFbmhhbmNlZCBMb3ctRGVsYXkuIFNpbmNlIHRoZXJlIGlzIG5vCisgICAgICAgICAgICAgICAgIDo6QVVESU9fT0JKRUNUX1RZUEUgZm9yIEVMRCBpbiBjb21iaW5hdGlvbiB3aXRoIFNCUiBkZWZpbmVkLAorICAgICAgICAgICAgICAgICBlbmFibGUgU0JSIGV4cGxpY2l0ZWx5IGJ5IDo6QUFDRU5DX1NCUl9NT0RFIHBhcmFtZXRlci4gVGhlIEVMRAorICAgICAgICAgICAgICAgICB2MiAyMTIgY29uZmlndXJhdGlvbiBjYW4gYmUgY29uZmlndXJlZCBieSA6OkFBQ0VOQ19DSEFOTkVMTU9ERQorICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgICAgICAgLSAxMjk6IE1QRUctMiBBQUMgTG93IENvbXBsZXhpdHkuCisgICAgICAgICAgICAgICAgICAgLSAxMzI6IE1QRUctMiBBQUMgTG93IENvbXBsZXhpdHkgd2l0aCBTcGVjdHJhbCBCYW5kCisgICAgICAgICAgICAgICAgIFJlcGxpY2F0aW9uIChIRS1BQUMpLgogCi0gIEFBQ0VOQ19CSVRSQVRFICAgICAgICAgICAgICAgICAgPSAweDAxMDEsICAvKiE8IFRvdGFsIGVuY29kZXIgYml0cmF0ZS4gVGhpcyBwYXJhbWV0ZXIgaXMgbWFuZGF0b3J5IGFuZCBpbnRlcmFjdHMgd2l0aCA6OkFBQ0VOQ19CSVRSQVRFTU9ERS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBDQlI6IEJpdHJhdGUgaW4gYml0cy9zZWNvbmQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIFxyZWYgc3VwcEJpdHJhdGVzIGZvciBkZXRhaWxzLiAqLworICAgICAgICAgICAgICAgICAgIFBsZWFzZSBub3RlIHRoYXQgdGhlIHZpcnR1YWwgTVBFRy0yIEFPVCdzIGJhc2ljYWxseSBkaXNhYmxlcworICAgICAgICAgICAgICAgICBub24tZXhpc3RpbmcgUGVyY2VwdHVhbCBOb2lzZSBTdWJzdGl0dXRpb24gdG9vbCBpbiBBQUMgZW5jb2RlcgorICAgICAgICAgICAgICAgICBhbmQgY29udHJvbHMgdGhlIE1QRUdfSUQgZmxhZyBpbiBhZHRzIGhlYWRlci4gVGhlIHZpcnR1YWwKKyAgICAgICAgICAgICAgICAgTVBFRy0yIEFPVCBkb2Vzbid0IHByb2hpYml0IHNwZWNpZmljIHRyYW5zcG9ydCBmb3JtYXRzLiAqLwogCi0gIEFBQ0VOQ19CSVRSQVRFTU9ERSAgICAgICAgICAgICAgPSAweDAxMDIsICAvKiE8IEJpdHJhdGUgbW9kZS4gQ29uZmlndXJhdGlvbiBjYW4gYmUgZGlmZmVyZW50IGtpbmQgb2YgYml0cmF0ZSBjb25maWd1cmF0aW9uczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBDb25zdGFudCBiaXRyYXRlLCB1c2UgYml0cmF0ZSBhY2NvcmRpbmcgdG8gOjpBQUNFTkNfQklUUkFURS4gKGRlZmF1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l0aGluIG5vbmUgTEQvRUxEIDo6QVVESU9fT0JKRUNUX1RZUEUsIHRoZSBDQlIgbW9kZSBtYWtlcyB1c2Ugb2YgZnVsbCBhbGxvd2VkIGJpdHJlc2Vydm9pci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiBjb250cmFzdCwgYXQgTG93LURlbGF5IDo6QVVESU9fT0JKRUNUX1RZUEUgdGhlIGJpdHJlc2Vydm9pciBpcyBrZXB0IHZlcnkgc21hbGwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gODogTEQvRUxEIGZ1bGwgYml0cmVzZXJ2b2lyIGZvciBwYWNrZXQgYmFzZWQgdHJhbnNtaXNzaW9uLiAqLworICBBQUNFTkNfQklUUkFURSA9IDB4MDEwMSwgLyohPCBUb3RhbCBlbmNvZGVyIGJpdHJhdGUuIFRoaXMgcGFyYW1ldGVyIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5kYXRvcnkgYW5kIGludGVyYWN0cyB3aXRoIDo6QUFDRU5DX0JJVFJBVEVNT0RFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIENCUjogQml0cmF0ZSBpbiBiaXRzL3NlY29uZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBWQlI6IFZhcmlhYmxlIGJpdHJhdGUuIEJpdHJhdGUgYXJndW1lbnQgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgaWdub3JlZC4gU2VlIFxyZWYgc3VwcEJpdHJhdGVzIGZvciBkZXRhaWxzLiAqLwogCi0gIEFBQ0VOQ19TQU1QTEVSQVRFICAgICAgICAgICAgICAgPSAweDAxMDMsICAvKiE8IEF1ZGlvIGlucHV0IGRhdGEgc2FtcGxpbmcgcmF0ZS4gRW5jb2RlciBzdXBwb3J0cyBmb2xsb3dpbmcgc2FtcGxpbmcgcmF0ZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgNjQwMDAsIDg4MjAwLCA5NjAwMCAqLworICBBQUNFTkNfQklUUkFURU1PREUgPSAweDAxMDIsIC8qITwgQml0cmF0ZSBtb2RlLiBDb25maWd1cmF0aW9uIGNhbiBiZSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kIG9mIGJpdHJhdGUgY29uZmlndXJhdGlvbnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IENvbnN0YW50IGJpdHJhdGUsIHVzZSBiaXRyYXRlIGFjY29yZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIDo6QUFDRU5DX0JJVFJBVEUuIChkZWZhdWx0KSBXaXRoaW4gbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEL0VMRCA6OkFVRElPX09CSkVDVF9UWVBFLCB0aGUgQ0JSIG1vZGUgbWFrZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Ugb2YgZnVsbCBhbGxvd2VkIGJpdHJlc2Vydm9pci4gSW4gY29udHJhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgTG93LURlbGF5IDo6QVVESU9fT0JKRUNUX1RZUEUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmVzZXJ2b2lyIGlzIGtlcHQgdmVyeSBzbWFsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogVmFyaWFibGUgYml0cmF0ZSBtb2RlLCBccmVmIHZicm1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyeSBsb3cgYml0cmF0ZSIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgXHJlZiB2YnJtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvdyBiaXRyYXRlIi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMzogVmFyaWFibGUgYml0cmF0ZSBtb2RlLCBccmVmIHZicm1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVkaXVtIGJpdHJhdGUiLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA0OiBWYXJpYWJsZSBiaXRyYXRlIG1vZGUsIFxyZWYgdmJybW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWdoIGJpdHJhdGUiLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA1OiBWYXJpYWJsZSBiaXRyYXRlIG1vZGUsIFxyZWYgdmJybW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJ5IGhpZ2ggYml0cmF0ZSIuICovCiAKLSAgQUFDRU5DX1NCUl9NT0RFICAgICAgICAgICAgICAgICA9IDB4MDEwNCwgIC8qITwgQ29uZmlndXJlIFNCUiBpbmRlcGVuZGVudGx5IG9mIHRoZSBjaG9zZW4gQXVkaW8gT2JqZWN0IFR5cGUgOjpBVURJT19PQkpFQ1RfVFlQRS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgZm9yIEVMRCBhdWRpbyBvYmplY3QgdHlwZSBvbmx5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIC0xOiBVc2UgRUxEIFNCUiBhdXRvIGNvbmZpZ3VyYXRvciAoZGVmYXVsdCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogRGlzYWJsZSBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVuYWJsZSBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uLiAqLworICBBQUNFTkNfU0FNUExFUkFURSA9IDB4MDEwMywgLyohPCBBdWRpbyBpbnB1dCBkYXRhIHNhbXBsaW5nIHJhdGUuIEVuY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIGZvbGxvd2luZyBzYW1wbGluZyByYXRlczogODAwMCwgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsIDY0MDAwLCA4ODIwMCwgOTYwMDAgKi8KIAotICBBQUNFTkNfR1JBTlVMRV9MRU5HVEggICAgICAgICAgID0gMHgwMTA1LCAgLyohPCBDb3JlIGVuY29kZXIgKEFBQykgYXVkaW8gZnJhbWUgbGVuZ3RoIGluIHNhbXBsZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTAyNDogRGVmYXVsdCBjb25maWd1cmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDUxMjogRGVmYXVsdCBMRC9FTEQgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA0ODA6IE9wdGlvbmFsIGxlbmd0aCBpbiBMRC9FTEQgY29uZmlndXJhdGlvbi4gKi8KKyAgQUFDRU5DX1NCUl9NT0RFID0gMHgwMTA0LCAvKiE8IENvbmZpZ3VyZSBTQlIgaW5kZXBlbmRlbnRseSBvZiB0aGUgY2hvc2VuIEF1ZGlvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IFR5cGUgOjpBVURJT19PQkpFQ1RfVFlQRS4gVGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBmb3IgRUxEIGF1ZGlvIG9iamVjdCB0eXBlIG9ubHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIC0xOiBVc2UgRUxEIFNCUiBhdXRvIGNvbmZpZ3VyYXRvciAoZGVmYXVsdCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERpc2FibGUgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogRW5hYmxlIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24uICovCiAKLSAgQUFDRU5DX0NIQU5ORUxNT0RFICAgICAgICAgICAgICA9IDB4MDEwNiwgIC8qITwgU2V0IGV4cGxpY2l0IGNoYW5uZWwgbW9kZS4gQ2hhbm5lbCBtb2RlIG11c3QgbWF0Y2ggd2l0aCBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMS03IGFuZCAzMywzNDogTVBFRyBjaGFubmVsIG1vZGVzIHN1cHBvcnRlZCwgc2VlIDo6Q0hBTk5FTF9NT0RFIGluIEZES19hdWRpby5oLiAqLworICBBQUNFTkNfR1JBTlVMRV9MRU5HVEggPQorICAgICAgMHgwMTA1LCAvKiE8IENvcmUgZW5jb2RlciAoQUFDKSBhdWRpbyBmcmFtZSBsZW5ndGggaW4gc2FtcGxlczoKKyAgICAgICAgICAgICAgICAgICAtIDEwMjQ6IERlZmF1bHQgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAtIDUxMjogRGVmYXVsdCBsZW5ndGggaW4gTEQvRUxEIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgLSA0ODA6IExlbmd0aCBpbiBMRC9FTEQgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAtIDI1NjogTGVuZ3RoIGZvciBFTEQgcmVkdWNlZCBkZWxheSBtb2RlICh4MikuCisgICAgICAgICAgICAgICAgICAgLSAyNDA6IExlbmd0aCBmb3IgRUxEIHJlZHVjZWQgZGVsYXkgbW9kZSAoeDIpLgorICAgICAgICAgICAgICAgICAgIC0gMTI4OiBMZW5ndGggZm9yIEVMRCByZWR1Y2VkIGRlbGF5IG1vZGUgKHg0KS4KKyAgICAgICAgICAgICAgICAgICAtIDEyMDogTGVuZ3RoIGZvciBFTEQgcmVkdWNlZCBkZWxheSBtb2RlICh4NCkuICovCiAKLSAgQUFDRU5DX0NIQU5ORUxPUkRFUiAgICAgICAgICAgICA9IDB4MDEwNywgIC8qITwgSW5wdXQgYXVkaW8gZGF0YSBjaGFubmVsIG9yZGVyaW5nIHNjaGVtZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBNUEVHIGNoYW5uZWwgb3JkZXJpbmcgKGUuIGcuIDUuMTogQywgTCwgUiwgU0wsIFNSLCBMRkUpLiAoZGVmYXVsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBXQVZFIGZpbGUgZm9ybWF0IGNoYW5uZWwgb3JkZXJpbmcgKGUuIGcuIDUuMTogTCwgUiwgQywgTEZFLCBTTCwgU1IpLiAqLworICBBQUNFTkNfQ0hBTk5FTE1PREUgPSAweDAxMDYsIC8qITwgU2V0IGV4cGxpY2l0IGNoYW5uZWwgbW9kZS4gQ2hhbm5lbCBtb2RlIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCB3aXRoIG51bWJlciBvZiBpbnB1dCBjaGFubmVscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMS03LCAxMSwxMiwxNCBhbmQgMzMsMzQ6IE1QRUcgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVzIHN1cHBvcnRlZCwgc2VlIDo6Q0hBTk5FTF9NT0RFIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLX2F1ZGlvLmguICovCiAKLSAgQUFDRU5DX1NCUl9SQVRJTyAgICAgICAgICAgICAgICA9IDB4MDEwOCwgIC8qITwgIENvbnRyb2xzIGFjdGl2YXRpb24gb2YgZG93bnNhbXBsZWQgU0JSLiBXaXRoIGRvd25zYW1wbGVkIFNCUiwgdGhlIGRlbGF5IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ZXIuIE9uIHRoZSBvdGhlciBoYW5kLCBmb3IgYWNoaWV2aW5nIHRoZSBzYW1lIHF1YWxpdHkgbGV2ZWwsIGRvd25zYW1wbGVkIFNCUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgbW9yZSBiaXRzIHRoYW4gZHVhbC1yYXRlIFNCUi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGggZG93bnNhbXBsZWQgU0JSLCB0aGUgQUFDIGVuY29kZXIgd2lsbCB3b3JrIGF0IHRoZSBzYW1lIHNhbXBsaW5nIHJhdGUgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlIgZW5jb2RlciAoc2luZ2xlIHJhdGUpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG93bnNhbXBsZWQgU0JSIGlzIHN1cHBvcnRlZCBmb3IgQUFDLUVMRCBhbmQgSEUtQUFDdjEuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IERvd25zYW1wbGVkIFNCUiAoZGVmYXVsdCBmb3IgRUxEKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogRHVhbC1yYXRlIFNCUiAgIChkZWZhdWx0IGZvciBIRS1BQUMpLiAqLworICBBQUNFTkNfQ0hBTk5FTE9SREVSID0KKyAgICAgIDB4MDEwNywgLyohPCBJbnB1dCBhdWRpbyBkYXRhIGNoYW5uZWwgb3JkZXJpbmcgc2NoZW1lOgorICAgICAgICAgICAgICAgICAgIC0gMDogTVBFRyBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEMsIEwsIFIsIFNMLCBTUiwgTEZFKS4KKyAgICAgICAgICAgICAgICAgKGRlZmF1bHQpCisgICAgICAgICAgICAgICAgICAgLSAxOiBXQVZFIGZpbGUgZm9ybWF0IGNoYW5uZWwgb3JkZXJpbmcgKGUuIGcuIDUuMTogTCwgUiwgQywKKyAgICAgICAgICAgICAgICAgTEZFLCBTTCwgU1IpLiAqLwogCi0gIEFBQ0VOQ19BRlRFUkJVUk5FUiAgICAgICAgICAgICAgPSAweDAyMDAsICAvKiE8IFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSB1c2Ugb2YgdGhlIGFmdGVyYnVybmVyIGZlYXR1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhZnRlcmJ1cm5lciBpcyBhIHR5cGUgb2YgYW5hbHlzaXMgYnkgc3ludGhlc2lzIGFsZ29yaXRobSB3aGljaCBpbmNyZWFzZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHF1YWxpdHkgYnV0IGFsc28gdGhlIHJlcXVpcmVkIHByb2Nlc3NpbmcgcG93ZXIuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGFsd2F5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZSB0aGlzIGlmIGFkZGl0aW9uYWwgbWVtb3J5IGNvbnN1bXB0aW9uIGFuZCBwcm9jZXNzaW5nIHBvd2VyIGNvbnN1bXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBhIHByb2JsZW0uIElmIGluY3JlYXNlZCBNSHogYW5kIG1lbW9yeSBjb25zdW1wdGlvbiBhcmUgYW4gaXNzdWUgdGhlbiB0aGUgTUh6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBtZW1vcnkgY29zdCBvZiB0aGlzIG9wdGlvbmFsIG1vZHVsZSBuZWVkIHRvIGJlIGV2YWx1YXRlZCBhZ2FpbnN0IHRoZSBpbXByb3ZlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhdWRpbyBxdWFsaXR5IG9uIGEgY2FzZSBieSBjYXNlIGJhc2lzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERpc2FibGUgYWZ0ZXJidXJuZXIgKGRlZmF1bHQpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVuYWJsZSBhZnRlcmJ1cm5lci4gKi8KKyAgQUFDRU5DX1NCUl9SQVRJTyA9CisgICAgICAweDAxMDgsIC8qITwgIENvbnRyb2xzIGFjdGl2YXRpb24gb2YgZG93bnNhbXBsZWQgU0JSLiBXaXRoIGRvd25zYW1wbGVkCisgICAgICAgICAgICAgICAgIFNCUiwgdGhlIGRlbGF5IHdpbGwgYmUgc2hvcnRlci4gT24gdGhlIG90aGVyIGhhbmQsIGZvcgorICAgICAgICAgICAgICAgICBhY2hpZXZpbmcgdGhlIHNhbWUgcXVhbGl0eSBsZXZlbCwgZG93bnNhbXBsZWQgU0JSIG5lZWRzIG1vcmUKKyAgICAgICAgICAgICAgICAgYml0cyB0aGFuIGR1YWwtcmF0ZSBTQlIuIFdpdGggZG93bnNhbXBsZWQgU0JSLCB0aGUgQUFDIGVuY29kZXIKKyAgICAgICAgICAgICAgICAgd2lsbCB3b3JrIGF0IHRoZSBzYW1lIHNhbXBsaW5nIHJhdGUgYXMgdGhlIFNCUiBlbmNvZGVyIChzaW5nbGUKKyAgICAgICAgICAgICAgICAgcmF0ZSkuIERvd25zYW1wbGVkIFNCUiBpcyBzdXBwb3J0ZWQgZm9yIEFBQy1FTEQgYW5kIEhFLUFBQ3YxLgorICAgICAgICAgICAgICAgICAgICAtIDE6IERvd25zYW1wbGVkIFNCUiAoZGVmYXVsdCBmb3IgRUxEKS4KKyAgICAgICAgICAgICAgICAgICAgLSAyOiBEdWFsLXJhdGUgU0JSICAgKGRlZmF1bHQgZm9yIEhFLUFBQykuICovCiAKLSAgQUFDRU5DX0JBTkRXSURUSCAgICAgICAgICAgICAgICA9IDB4MDIwMywgIC8qITwgQ29yZSBlbmNvZGVyIGF1ZGlvIGJhbmR3aWR0aDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEZXRlcm1pbmUgYmFuZHdpZHRoIGludGVybmFsbHkgKGRlZmF1bHQsIHNlZSBjaGFwdGVyIFxyZWYgQkVIQVZJT1VSX0JBTkRXSURUSCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMSB0byBmcy8yOiBGcmVxdWVuY3kgYmFuZHdpZHRoIGluIEhlcnR6LiAoRXhwZXJ0cyBvbmx5LCBiZXR0ZXIgZG8gbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VjaCB0aGlzIHZhbHVlIHRvIGF2b2lkIGRlZ3JhZGVkIGF1ZGlvIHF1YWxpdHkpICovCisgIEFBQ0VOQ19BRlRFUkJVUk5FUiA9CisgICAgICAweDAyMDAsIC8qITwgVGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIHVzZSBvZiB0aGUgYWZ0ZXJidXJuZXIgZmVhdHVyZS4KKyAgICAgICAgICAgICAgICAgICBUaGUgYWZ0ZXJidXJuZXIgaXMgYSB0eXBlIG9mIGFuYWx5c2lzIGJ5IHN5bnRoZXNpcyBhbGdvcml0aG0KKyAgICAgICAgICAgICAgICAgd2hpY2ggaW5jcmVhc2VzIHRoZSBhdWRpbyBxdWFsaXR5IGJ1dCBhbHNvIHRoZSByZXF1aXJlZAorICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHBvd2VyLiBJdCBpcyByZWNvbW1lbmRlZCB0byBhbHdheXMgYWN0aXZhdGUgdGhpcyBpZgorICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsIG1lbW9yeSBjb25zdW1wdGlvbiBhbmQgcHJvY2Vzc2luZyBwb3dlciBjb25zdW1wdGlvbgorICAgICAgICAgICAgICAgICAgIGlzIG5vdCBhIHByb2JsZW0uIElmIGluY3JlYXNlZCBNSHogYW5kIG1lbW9yeSBjb25zdW1wdGlvbiBhcmUKKyAgICAgICAgICAgICAgICAgYW4gaXNzdWUgdGhlbiB0aGUgTUh6IGFuZCBtZW1vcnkgY29zdCBvZiB0aGlzIG9wdGlvbmFsIG1vZHVsZQorICAgICAgICAgICAgICAgICBuZWVkIHRvIGJlIGV2YWx1YXRlZCBhZ2FpbnN0IHRoZSBpbXByb3ZlbWVudCBpbiBhdWRpbyBxdWFsaXR5CisgICAgICAgICAgICAgICAgIG9uIGEgY2FzZSBieSBjYXNlIGJhc2lzLgorICAgICAgICAgICAgICAgICAgIC0gMDogRGlzYWJsZSBhZnRlcmJ1cm5lciAoZGVmYXVsdCkuCisgICAgICAgICAgICAgICAgICAgLSAxOiBFbmFibGUgYWZ0ZXJidXJuZXIuICovCiAKLSAgQUFDRU5DX1BFQUtfQklUUkFURSAgICAgICAgICAgICA9IDB4MDIwNywgIC8qITwgUGVhayBiaXRyYXRlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHRvIGFkanVzdCBtYXhpbXVtIGJpdHMgcGVyIGF1ZGlvIGZyYW1lLiBCaXRyYXRlIGlzIGluIGJpdHMvc2Vjb25kLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHBlYWsgYml0cmF0ZSB3aWxsIGludGVybmFsbHkgYmUgbGltaXRlZCB0byB0aGUgY2hvc2VuIGJpdHJhdGUgOjpBQUNFTkNfQklUUkFURSBhcyBsb3dlciBsaW1pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIG51bWJlcl9vZl9lZmZlY3RpdmVfY2hhbm5lbHMqNjE0NCBiaXQgYXMgdXBwZXIgbGltaXQuCisgIEFBQ0VOQ19CQU5EV0lEVEggPSAweDAyMDMsIC8qITwgQ29yZSBlbmNvZGVyIGF1ZGlvIGJhbmR3aWR0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERldGVybWluZSBhdWRpbyBiYW5kd2lkdGggaW50ZXJuYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCwgc2VlIGNoYXB0ZXIgXHJlZiBCRUhBVklPVVJfQkFORFdJRFRIKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgdG8gZnMvMjogQXVkaW8gYmFuZHdpZHRoIGluIEhlcnR6LiBMaW1pdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIDIwa0h6IG1heC4gTm90IHVzYWJsZSBpZiBTQlIgaXMgYWN0aXZlLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcgaXMgZm9yIGV4cGVydHMgb25seSwgYmV0dGVyIGRvIG5vdCB0b3VjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHZhbHVlIHRvIGF2b2lkIGRlZ3JhZGVkIGF1ZGlvIHF1YWxpdHkuICovCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGUgcGVhayBiaXRyYXRlIGVxdWFsIHRvIDo6QUFDRU5DX0JJVFJBVEUgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IHRoZSBhdWRpbyBmcmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBvZiBjb25zdGFudCBzaXplLiBTaW5jZSB0aGUgcGVhayBiaXRhdGUgaXMgaW4gYml0cy9zZWNvbmQsIHRoZSBmcmFtZSBzaXplcyBjYW4gdmFyeSBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgYnl0ZSBpbiBvbmUgb3IgdGhlIG90aGVyIGRpcmVjdGlvbiBvdmVyIHZhcmlvdXMgZnJhbWVzLiBIb3dldmVyLCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gcmVkdWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwZWFrIHBpdHJhdGUgdG8gOjpBQUNFTkNfQklUUkFURSAtIGl0IHdvdWxkIGRpc2FibGUgdGhlIGJpdHJlc2Vydm9pciwgd2hpY2ggd291bGQgYWZmZWN0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBxdWFsaXR5IGJ5IGEgbGFyZ2UgYW1vdW50LiAqLworICBBQUNFTkNfUEVBS19CSVRSQVRFID0KKyAgICAgIDB4MDIwNywgLyohPCBQZWFrIGJpdHJhdGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgdG8gYWRqdXN0IG1heGltdW0gYml0cworICAgICAgICAgICAgICAgICBwZXIgYXVkaW8gZnJhbWUuIEJpdHJhdGUgaXMgaW4gYml0cy9zZWNvbmQuIFRoZSBwZWFrIGJpdHJhdGUKKyAgICAgICAgICAgICAgICAgd2lsbCBpbnRlcm5hbGx5IGJlIGxpbWl0ZWQgdG8gdGhlIGNob3NlbiBiaXRyYXRlCisgICAgICAgICAgICAgICAgIDo6QUFDRU5DX0JJVFJBVEUgYXMgbG93ZXIgbGltaXQgYW5kIHRoZQorICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfZWZmZWN0aXZlX2NoYW5uZWxzKjYxNDQgYml0IGFzIHVwcGVyIGxpbWl0LgogCi0gIEFBQ0VOQ19UUkFOU01VWCAgICAgICAgICAgICAgICAgPSAweDAzMDAsICAvKiE8IFRyYW5zcG9ydCB0eXBlIHRvIGJlIHVzZWQuIFNlZSA6OlRSQU5TUE9SVF9UWVBFIGluIEZES19hdWRpby5oLiBGb2xsb3dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gZW5jb2RlciBsaWJyYXJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IHJhdyBhY2Nlc3MgdW5pdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBBRElGIGJpdHN0cmVhbSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBBRFRTIGJpdHN0cmVhbSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA2OiBBdWRpbyBNdXggRWxlbWVudHMgKExBVE0pIHdpdGggbXV4Q29uZmlnUHJlc2VudCA9IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA3OiBBdWRpbyBNdXggRWxlbWVudHMgKExBVE0pIHdpdGggbXV4Q29uZmlnUHJlc2VudCA9IDAsIG91dCBvZiBiYW5kIFN0cmVhbU11eENvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEwOiBBdWRpbyBTeW5jIFN0cmVhbSAoTE9BUykgKi8KKyAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoZSBwZWFrIGJpdHJhdGUgZXF1YWwgdG8gOjpBQUNFTkNfQklUUkFURSBkb2VzIG5vdAorICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSBtZWFuIHRoYXQgdGhlIGF1ZGlvIGZyYW1lcyB3aWxsIGJlIG9mIGNvbnN0YW50CisgICAgICAgICAgICAgICAgIHNpemUuIFNpbmNlIHRoZSBwZWFrIGJpdGF0ZSBpcyBpbiBiaXRzL3NlY29uZCwgdGhlIGZyYW1lIHNpemVzCisgICAgICAgICAgICAgICAgIGNhbiB2YXJ5IGJ5IG9uZSBieXRlIGluIG9uZSBvciB0aGUgb3RoZXIgZGlyZWN0aW9uIG92ZXIgdmFyaW91cworICAgICAgICAgICAgICAgICBmcmFtZXMuIEhvd2V2ZXIsIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byByZWR1Y2UgdGhlIHBlYWsKKyAgICAgICAgICAgICAgICAgcGl0cmF0ZSB0byA6OkFBQ0VOQ19CSVRSQVRFIC0gaXQgd291bGQgZGlzYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgYml0cmVzZXJ2b2lyLCB3aGljaCB3b3VsZCBhZmZlY3QgdGhlIGF1ZGlvIHF1YWxpdHkgYnkgYSBsYXJnZQorICAgICAgICAgICAgICAgICBhbW91bnQuICovCiAKLSAgQUFDRU5DX0hFQURFUl9QRVJJT0QgICAgICAgICAgICA9IDB4MDMwMSwgIC8qITwgRnJhbWUgY291bnQgcGVyaW9kIGZvciBzZW5kaW5nIGluLWJhbmQgY29uZmlndXJhdGlvbiBidWZmZXJzIHdpdGhpbiBMQVRNL0xPQVMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IGxheWVyLiBBZGRpdGlvbmFsbHkgdGhpcyBwYXJhbWV0ZXIgY29uZmlndXJlcyB0aGUgUENFIHJlcGV0aXRpb24gcGVyaW9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHJhd19kYXRhX2Jsb2NrKCkuIFNlZSBccmVmIGVuY1BDRS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweEZGOiBhdXRvLW1vZGUgZGVmYXVsdCAxMCBmb3IgVFRfTVA0X0FEVFMsIFRUX01QNF9MT0FTIGFuZCBUVF9NUDRfTEFUTV9NQ1AxLCBvdGhlcndpc2UgMC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBuOiBGcmFtZSBjb3VudCBwZXJpb2QuICovCisgIEFBQ0VOQ19UUkFOU01VWCA9IDB4MDMwMCwgLyohPCBUcmFuc3BvcnQgdHlwZSB0byBiZSB1c2VkLiBTZWUgOjpUUkFOU1BPUlRfVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEZES19hdWRpby5oLiBGb2xsb3dpbmcgdHlwZXMgY2FuIGJlIGNvbmZpZ3VyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBlbmNvZGVyIGxpYnJhcnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IHJhdyBhY2Nlc3MgdW5pdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogQURJRiBiaXRzdHJlYW0gZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IEFEVFMgYml0c3RyZWFtIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA2OiBBdWRpbyBNdXggRWxlbWVudHMgKExBVE0pIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXhDb25maWdQcmVzZW50ID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA3OiBBdWRpbyBNdXggRWxlbWVudHMgKExBVE0pIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXhDb25maWdQcmVzZW50ID0gMCwgb3V0IG9mIGJhbmQgU3RyZWFtTXV4Q29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEwOiBBdWRpbyBTeW5jIFN0cmVhbSAoTE9BUykgKi8KIAotICBBQUNFTkNfU0lHTkFMSU5HX01PREUgICAgICAgICAgID0gMHgwMzAyLCAgLyohPCBTaWduYWxpbmcgbW9kZSBvZiB0aGUgZXh0ZW5zaW9uIEFPVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBJbXBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmxlIHNpZ25hbGluZyAoZGVmYXVsdCBmb3Igbm9uLU1QRUctNCBiYXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFPVCdzIGFuZCBmb3IgdGhlIHRyYW5zcG9ydCBmb3JtYXRzIEFESUYgYW5kIEFEVFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBIHN0cmVhbSB0aGF0IHVzZXMgaW1wbGljaXQgc2lnbmFsaW5nIGNhbiBiZSBkZWNvZGVkIGJ5IGV2ZXJ5IEFBQyBkZWNvZGVyLCBldmVuIEFBQy1MQy1vbmx5IGRlY29kZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgb25seSBkZWNvZGUgdGhlIGxvdy1mcmVxdWVuY3kgcGFydCBvZiB0aGUgc3RyZWFtLCByZXN1bHRpbmcgaW4gYSBiYW5kLWxpbWl0ZWQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIG1ldGhvZCB3b3JrcyB3aXRoIGFsbCB0cmFuc3BvcnQgZm9ybWF0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayB3aXRoIGRvd25zYW1wbGVkIFNCUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEV4cGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgc2lnbmFsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBIHN0cmVhbSB0aGF0IHVzZXMgZXhwbGljaXQgYmFja3dhcmQgY29tcGF0aWJsZSBzaWduYWxpbmcgY2FuIGJlIGRlY29kZWQgYnkgZXZlcnkgQUFDIGRlY29kZXIsIGV2ZW4gQUFDLUxDLW9ubHkgZGVjb2RlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEFuIEFBQy1MQy1vbmx5IGRlY29kZXIgd2lsbCBvbmx5IGRlY29kZSB0aGUgbG93LWZyZXF1ZW5jeSBwYXJ0IG9mIHRoZSBzdHJlYW0sIHJlc3VsdGluZyBpbiBhIGJhbmQtbGltaXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEEgZGVjb2RlciBub3QgY2FwYWJsZSBvZiBkZWNvZGluZyBQUyB3aWxsIG9ubHkgZGVjb2RlIHRoZSBBQUMtTEMrU0JSIHBhcnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgc3RyZWFtIGNvbnRhaW5lZCBQUywgdGhlIHJlc3VsdCB3aWxsIGJlIGEgYSBkZWNvZGVkIG1vbm8gZG93bm1peAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayB3aXRoIEFESUYgb3IgQURUUy4gRm9yIExPQVMvTEFUTSwgaXQgb25seSB3b3JrcyB3aXRoIEF1ZGlvTXV4VmVyc2lvbj09MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2QgZG9lcyB3b3JrIHdpdGggZG93bnNhbXBsZWQgU0JSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogRXhwbGljaXQgaGllcmFyY2hpY2FsIHNpZ25hbGluZyAoZGVmYXVsdCBmb3IgTVBFRy00IGJhc2VkIEFPVCdzIGFuZCBmb3IgYWxsIHRyYW5zcG9ydCBmb3JtYXRzIGV4Y2x1ZGluZyBBRElGIGFuZCBBRFRTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBzdHJlYW0gdGhhdCB1c2VzIGV4cGxpY2l0IGhpZXJhcmNoaWNhbCBzaWduYWxpbmcgY2FuIGJlIGRlY29kZWQgb25seSBieSBIRS1BQUMgZGVjb2RlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEFuIEFBQy1MQy1vbmx5IGRlY29kZXIgd2lsbCBub3QgZGVjb2RlIGEgc3RyZWFtIHRoYXQgdXNlcyBleHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBIGRlY29kZXIgbm90IGNhcGFibGUgb2YgZGVjb2RpbmcgUFMgd2lsbCBub3QgZGVjb2RlIHRoZSBzdHJlYW0gYXQgYWxsIGlmIGl0IGNvbnRhaW5lZCBQUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayB3aXRoIEFESUYgb3IgQURUUy4gSXQgd29ya3Mgd2l0aCBMT0FTL0xBVE0gYW5kIHRoZSBNUEVHLTQgRmlsZSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgd29yayB3aXRoIGRvd25zYW1wbGVkIFNCUgorICBBQUNFTkNfSEVBREVSX1BFUklPRCA9CisgICAgICAweDAzMDEsIC8qITwgRnJhbWUgY291bnQgcGVyaW9kIGZvciBzZW5kaW5nIGluLWJhbmQgY29uZmlndXJhdGlvbiBidWZmZXJzCisgICAgICAgICAgICAgICAgIHdpdGhpbiBMQVRNL0xPQVMgdHJhbnNwb3J0IGxheWVyLiBBZGRpdGlvbmFsbHkgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgY29uZmlndXJlcyB0aGUgUENFIHJlcGV0aXRpb24gcGVyaW9kIGluIHJhd19kYXRhX2Jsb2NrKCkuIFNlZQorICAgICAgICAgICAgICAgICBccmVmIGVuY1BDRS4KKyAgICAgICAgICAgICAgICAgICAtIDB4RkY6IGF1dG8tbW9kZSBkZWZhdWx0IDEwIGZvciBUVF9NUDRfQURUUywgVFRfTVA0X0xPQVMgYW5kCisgICAgICAgICAgICAgICAgIFRUX01QNF9MQVRNX01DUDEsIG90aGVyd2lzZSAwLgorICAgICAgICAgICAgICAgICAgIC0gbjogRnJhbWUgY291bnQgcGVyaW9kLiAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbWFraW5nIHN1cmUgdGhhdCB0aGUgbGlzdGVuZXIgYWx3YXlzIGV4cGVyaWVuY2VzIHRoZSBiZXN0IGF1ZGlvIHF1YWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nIHNob3VsZCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25seSBhIGZ1bGwgSEUtQUFDLWNhcGFibGUgZGVjb2RlciB3aWxsIGRlY29kZSB0aG9zZSBzdHJlYW1zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGF1ZGlvIGlzIHBsYXllZCBhdCBmdWxsIGJhbmR3aWR0aC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBiZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBpdCBpcyByZWNvbW1lbmRlZCB0byBlbmNvZGUgd2l0aCBpbXBsaWNpdCBTQlIgc2lnbmFsaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBkZWNvZGVyIGNhcGFibGUgb2YgQUFDLUxDIG9ubHkgd2lsbCB0aGVuIG9ubHkgZGVjb2RlIHRoZSBBQUMgcGFydCwgd2hpY2ggbWVhbnMgdGhlIGRlY29kZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHdpbGwgc291bmQgYmFuZC1saW1pdGVkLgorICBBQUNFTkNfU0lHTkFMSU5HX01PREUgPQorICAgICAgMHgwMzAyLCAvKiE8IFNpZ25hbGluZyBtb2RlIG9mIHRoZSBleHRlbnNpb24gQU9UOgorICAgICAgICAgICAgICAgICAgIC0gMDogSW1wbGljaXQgYmFja3dhcmQgY29tcGF0aWJsZSBzaWduYWxpbmcgKGRlZmF1bHQgZm9yCisgICAgICAgICAgICAgICAgIG5vbi1NUEVHLTQgYmFzZWQgQU9UJ3MgYW5kIGZvciB0aGUgdHJhbnNwb3J0IGZvcm1hdHMgQURJRiBhbmQKKyAgICAgICAgICAgICAgICAgQURUUykKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBzdHJlYW0gdGhhdCB1c2VzIGltcGxpY2l0IHNpZ25hbGluZyBjYW4gYmUgZGVjb2RlZAorICAgICAgICAgICAgICAgICBieSBldmVyeSBBQUMgZGVjb2RlciwgZXZlbiBBQUMtTEMtb25seSBkZWNvZGVycworICAgICAgICAgICAgICAgICAgICAgICAgLSBBbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgb25seSBkZWNvZGUgdGhlCisgICAgICAgICAgICAgICAgIGxvdy1mcmVxdWVuY3kgcGFydCBvZiB0aGUgc3RyZWFtLCByZXN1bHRpbmcgaW4gYSBiYW5kLWxpbWl0ZWQKKyAgICAgICAgICAgICAgICAgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIHdvcmtzIHdpdGggYWxsIHRyYW5zcG9ydCBmb3JtYXRzCisgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBkb3duc2FtcGxlZCBTQlIKKyAgICAgICAgICAgICAgICAgICAtIDE6IEV4cGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgc2lnbmFsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAtIEEgc3RyZWFtIHRoYXQgdXNlcyBleHBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmxlCisgICAgICAgICAgICAgICAgIHNpZ25hbGluZyBjYW4gYmUgZGVjb2RlZCBieSBldmVyeSBBQUMgZGVjb2RlciwgZXZlbiBBQUMtTEMtb25seQorICAgICAgICAgICAgICAgICBkZWNvZGVycworICAgICAgICAgICAgICAgICAgICAgICAgLSBBbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgb25seSBkZWNvZGUgdGhlCisgICAgICAgICAgICAgICAgIGxvdy1mcmVxdWVuY3kgcGFydCBvZiB0aGUgc3RyZWFtLCByZXN1bHRpbmcgaW4gYSBiYW5kLWxpbWl0ZWQKKyAgICAgICAgICAgICAgICAgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAtIEEgZGVjb2RlciBub3QgY2FwYWJsZSBvZiBkZWNvZGluZyBQUyB3aWxsIG9ubHkgZGVjb2RlCisgICAgICAgICAgICAgICAgIHRoZSBBQUMtTEMrU0JSIHBhcnQuIElmIHRoZSBzdHJlYW0gY29udGFpbmVkIFBTLCB0aGUgcmVzdWx0CisgICAgICAgICAgICAgICAgIHdpbGwgYmUgYSBhIGRlY29kZWQgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBBRElGIG9yIEFEVFMuIEZvcgorICAgICAgICAgICAgICAgICBMT0FTL0xBVE0sIGl0IG9ubHkgd29ya3Mgd2l0aCBBdWRpb011eFZlcnNpb249PTEKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2QgZG9lcyB3b3JrIHdpdGggZG93bnNhbXBsZWQgU0JSCisgICAgICAgICAgICAgICAgICAgLSAyOiBFeHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nIChkZWZhdWx0IGZvciBNUEVHLTQKKyAgICAgICAgICAgICAgICAgYmFzZWQgQU9UJ3MgYW5kIGZvciBhbGwgdHJhbnNwb3J0IGZvcm1hdHMgZXhjbHVkaW5nIEFESUYgYW5kCisgICAgICAgICAgICAgICAgIEFEVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAtIEEgc3RyZWFtIHRoYXQgdXNlcyBleHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nIGNhbgorICAgICAgICAgICAgICAgICBiZSBkZWNvZGVkIG9ubHkgYnkgSEUtQUFDIGRlY29kZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAtIEFuIEFBQy1MQy1vbmx5IGRlY29kZXIgd2lsbCBub3QgZGVjb2RlIGEgc3RyZWFtIHRoYXQKKyAgICAgICAgICAgICAgICAgdXNlcyBleHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAtIEEgZGVjb2RlciBub3QgY2FwYWJsZSBvZiBkZWNvZGluZyBQUyB3aWxsIG5vdCBkZWNvZGUKKyAgICAgICAgICAgICAgICAgdGhlIHN0cmVhbSBhdCBhbGwgaWYgaXQgY29udGFpbmVkIFBTCisgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBBRElGIG9yIEFEVFMuIEl0IHdvcmtzCisgICAgICAgICAgICAgICAgIHdpdGggTE9BUy9MQVRNIGFuZCB0aGUgTVBFRy00IEZpbGUgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgd29yayB3aXRoIGRvd25zYW1wbGVkIFNCUgogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgTVBFRy0yIHRyYW5zcG9ydCB0eXBlcyAoQURUUyxBRElGKSwgb25seSBpbXBsaWNpdCBzaWduYWxpbmcgaXMgcG9zc2libGUuCisgICAgICAgICAgICAgICAgICAgIEZvciBtYWtpbmcgc3VyZSB0aGF0IHRoZSBsaXN0ZW5lciBhbHdheXMgZXhwZXJpZW5jZXMgdGhlCisgICAgICAgICAgICAgICAgIGJlc3QgYXVkaW8gcXVhbGl0eSwgZXhwbGljaXQgaGllcmFyY2hpY2FsIHNpZ25hbGluZyBzaG91bGQgYmUKKyAgICAgICAgICAgICAgICAgdXNlZC4gVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25seSBhIGZ1bGwgSEUtQUFDLWNhcGFibGUgZGVjb2RlcgorICAgICAgICAgICAgICAgICB3aWxsIGRlY29kZSB0aG9zZSBzdHJlYW1zLiBUaGUgYXVkaW8gaXMgcGxheWVkIGF0IGZ1bGwKKyAgICAgICAgICAgICAgICAgYmFuZHdpZHRoLiBGb3IgYmVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaXQgaXMgcmVjb21tZW5kZWQKKyAgICAgICAgICAgICAgICAgdG8gZW5jb2RlIHdpdGggaW1wbGljaXQgU0JSIHNpZ25hbGluZy4gQSBkZWNvZGVyIGNhcGFibGUgb2YKKyAgICAgICAgICAgICAgICAgQUFDLUxDIG9ubHkgd2lsbCB0aGVuIG9ubHkgZGVjb2RlIHRoZSBBQUMgcGFydCwgd2hpY2ggbWVhbnMgdGhlCisgICAgICAgICAgICAgICAgIGRlY29kZWQgYXVkaW8gd2lsbCBzb3VuZCBiYW5kLWxpbWl0ZWQuCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBMT0FTIGFuZCBMQVRNLCBleHBsaWNpdCBiYWNrd2FyZHMgY29tcGF0aWJsZSBzaWduYWxpbmcgb25seSB3b3JrcyB0b2dldGhlciB3aXRoIEF1ZGlvTXV4VmVyc2lvbj09MS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWFzb24gaXMgdGhhdCwgZm9yIGV4cGxpY2l0IGJhY2t3YXJkcyBjb21wYXRpYmxlIHNpZ25hbGluZywgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBBU0MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIGRlY29kZXIgdGhhdCBpcyBvbmx5IGNhcGFibGUgb2YgZGVjb2RpbmcgQUFDLUxDIHdpbGwgc2tpcCB0aGlzIHBhcnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXZlcnRoZWxlc3MsIGZvciBqdW1waW5nIHRvIHRoZSBlbmQgb2YgdGhlIEFTQywgaXQgbmVlZHMgdG8ga25vdyB0aGUgQVNDIGxlbmd0aC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbWl0dGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBBU0MgaXMgYSBmZWF0dXJlIG9mIEF1ZGlvTXV4VmVyc2lvbj09MSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHRyYW5zbWl0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBBU0Mgd2l0aCBBdWRpb011eFZlcnNpb249PTAsIHRoZXJlZm9yZSBhbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgbm90IGJlIGFibGUgdG8gcGFyc2UgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9BUy9MQVRNIHN0cmVhbSB0aGF0IHdhcyBiZWluZyBlbmNvZGVkIHdpdGggQXVkaW9NdXhWZXJzaW9uPT0wLgorICAgICAgICAgICAgICAgICAgICBGb3IgTVBFRy0yIHRyYW5zcG9ydCB0eXBlcyAoQURUUyxBRElGKSwgb25seSBpbXBsaWNpdAorICAgICAgICAgICAgICAgICBzaWduYWxpbmcgaXMgcG9zc2libGUuCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBkb3duc2FtcGxlZCBTQlIsIGV4cGxpY2l0IHNpZ25hbGluZyBpcyBtYW5kYXRvcnkuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBzYW1wbGluZyBmcmVxdWVuY3kgKHdoaWNoIGlzIGluIGNhc2Ugb2YgU0JSIHRoZSBzYW1wbGluZyBmcmVxdXFuY3kgb2YgdGhlIFNCUiBwYXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIG9ubHkgYmUgc2lnbmFsZWQgaW4gZXhwbGljaXQgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgRm9yIExPQVMgYW5kIExBVE0sIGV4cGxpY2l0IGJhY2t3YXJkcyBjb21wYXRpYmxlIHNpZ25hbGluZworICAgICAgICAgICAgICAgICBvbmx5IHdvcmtzIHRvZ2V0aGVyIHdpdGggQXVkaW9NdXhWZXJzaW9uPT0xLiBUaGUgcmVhc29uIGlzCisgICAgICAgICAgICAgICAgIHRoYXQsIGZvciBleHBsaWNpdCBiYWNrd2FyZHMgY29tcGF0aWJsZSBzaWduYWxpbmcsIGFkZGl0aW9uYWwKKyAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgQVNDLiBBIGRlY29kZXIgdGhhdCBpcyBvbmx5CisgICAgICAgICAgICAgICAgIGNhcGFibGUgb2YgZGVjb2RpbmcgQUFDLUxDIHdpbGwgc2tpcCB0aGlzIHBhcnQuIE5ldmVydGhlbGVzcywKKyAgICAgICAgICAgICAgICAgZm9yIGp1bXBpbmcgdG8gdGhlIGVuZCBvZiB0aGUgQVNDLCBpdCBuZWVkcyB0byBrbm93IHRoZSBBU0MKKyAgICAgICAgICAgICAgICAgbGVuZ3RoLiBUcmFuc21pdHRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgQVNDIGlzIGEgZmVhdHVyZSBvZgorICAgICAgICAgICAgICAgICBBdWRpb011eFZlcnNpb249PTEsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB0cmFuc21pdCB0aGUgbGVuZ3RoCisgICAgICAgICAgICAgICAgIG9mIHRoZSBBU0Mgd2l0aCBBdWRpb011eFZlcnNpb249PTAsIHRoZXJlZm9yZSBhbiBBQUMtTEMtb25seQorICAgICAgICAgICAgICAgICBkZWNvZGVyIHdpbGwgbm90IGJlIGFibGUgdG8gcGFyc2UgYSBMT0FTL0xBVE0gc3RyZWFtIHRoYXQgd2FzCisgICAgICAgICAgICAgICAgIGJlaW5nIGVuY29kZWQgd2l0aCBBdWRpb011eFZlcnNpb249PTAuCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBBQUMtRUxELCB0aGUgU0JSIGluZm9ybWF0aW9uIGlzIHRyYW5zbWl0dGVkIGluIHRoZSBFTERTcGVjaWZpYyBDb25maWcsIHdoaWNoIGlzIHBhcnQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1NwZWNpZmljQ29uZmlnLiBUaGVyZWZvcmUsIHRoZSBzZXR0aW5ncyBoZXJlIHdpbGwgaGF2ZSBubyBlZmZlY3Qgb24gQUFDLUVMRC4qLworICAgICAgICAgICAgICAgICAgICBGb3IgZG93bnNhbXBsZWQgU0JSLCBleHBsaWNpdCBzaWduYWxpbmcgaXMgbWFuZGF0b3J5LiBUaGUKKyAgICAgICAgICAgICAgICAgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhlIGV4dGVuc2lvbiBzYW1wbGluZyBmcmVxdWVuY3kgKHdoaWNoCisgICAgICAgICAgICAgICAgIGlzIGluIGNhc2Ugb2YgU0JSIHRoZSBzYW1wbGluZyBmcmVxdXFuY3kgb2YgdGhlIFNCUiBwYXJ0KSBjYW4KKyAgICAgICAgICAgICAgICAgb25seSBiZSBzaWduYWxlZCBpbiBleHBsaWNpdCBtb2RlLgogCi0gIEFBQ0VOQ19UUFNVQkZSQU1FUyAgICAgICAgICAgICAgPSAweDAzMDMsICAvKiE8IE51bWJlciBvZiBzdWIgZnJhbWVzIGluIGEgdHJhbnNwb3J0IGZyYW1lIGZvciBMT0FTL0xBVE0gb3IgQURUUyAoZGVmYXVsdCAxKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBRFRTOiBNYXhpbXVtIG51bWJlciBvZiBzdWIgZnJhbWVzIHJlc3RyaWN0ZWQgdG8gNC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBMT0FTL0xBVE06IE1heGltdW0gbnVtYmVyIG9mIHN1YiBmcmFtZXMgcmVzdHJpY3RlZCB0byAyLiovCisgICAgICAgICAgICAgICAgICAgIEZvciBBQUMtRUxELCB0aGUgU0JSIGluZm9ybWF0aW9uIGlzIHRyYW5zbWl0dGVkIGluIHRoZQorICAgICAgICAgICAgICAgICBFTERTcGVjaWZpYyBDb25maWcsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIEF1ZGlvU3BlY2lmaWNDb25maWcuCisgICAgICAgICAgICAgICAgIFRoZXJlZm9yZSwgdGhlIHNldHRpbmdzIGhlcmUgd2lsbCBoYXZlIG5vIGVmZmVjdCBvbiBBQUMtRUxELiovCiAKLSAgQUFDRU5DX0FVRElPTVVYVkVSICAgICAgICAgICAgICA9IDB4MDMwNCwgIC8qITwgQXVkaW9NdXhWZXJzaW9uIHRvIGJlIHVzZWQgZm9yIExBVE0uIChBdWRpb011eFZlcnNpb25BLCBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkKToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEZWZhdWx0LCBubyB0cmFuc21pc3Npb24gb2YgdGFyYSBCdWZmZXIgZnVsbG5lc3MsIG5vIEFTQyBsZW5ndGggYW5kIGluY2x1ZGluZyBhY3R1YWwgbGF0bSBCdWZmZXIgZnVsbG5lcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBUcmFuc21pc3Npb24gb2YgdGFyYSBCdWZmZXIgZnVsbG5lc3MsIEFTQyBsZW5ndGggYW5kIGFjdHVhbCBsYXRtIEJ1ZmZlciBmdWxsbmVzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBUcmFuc21pc3Npb24gb2YgdGFyYSBCdWZmZXIgZnVsbG5lc3MsIEFTQyBsZW5ndGggYW5kIG1heGltdW0gbGV2ZWwgb2YgbGF0bSBCdWZmZXIgZnVsbG5lc3MuICovCisgIEFBQ0VOQ19UUFNVQkZSQU1FUyA9CisgICAgICAweDAzMDMsIC8qITwgTnVtYmVyIG9mIHN1YiBmcmFtZXMgaW4gYSB0cmFuc3BvcnQgZnJhbWUgZm9yIExPQVMvTEFUTSBvcgorICAgICAgICAgICAgICAgICBBRFRTIChkZWZhdWx0IDEpLgorICAgICAgICAgICAgICAgICAgIC0gQURUUzogTWF4aW11bSBudW1iZXIgb2Ygc3ViIGZyYW1lcyByZXN0cmljdGVkIHRvIDQuCisgICAgICAgICAgICAgICAgICAgLSBMT0FTL0xBVE06IE1heGltdW0gbnVtYmVyIG9mIHN1YiBmcmFtZXMgcmVzdHJpY3RlZCB0byAyLiovCiAKLSAgQUFDRU5DX1BST1RFQ1RJT04gICAgICAgICAgICAgICA9IDB4MDMwNiwgIC8qITwgQ29uZmlndXJlIHByb3RlY3Rpb24gaW4gdHJhbnBzb3J0IGxheWVyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IE5vIHByb3RlY3Rpb24uIChkZWZhdWx0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IENSQyBhY3RpdmUgZm9yIEFEVFMgYml0c3RyZWFtIGZvcm1hdC4gKi8KKyAgQUFDRU5DX0FVRElPTVVYVkVSID0KKyAgICAgIDB4MDMwNCwgLyohPCBBdWRpb011eFZlcnNpb24gdG8gYmUgdXNlZCBmb3IgTEFUTS4gKEF1ZGlvTXV4VmVyc2lvbkEsCisgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQpOgorICAgICAgICAgICAgICAgICAgIC0gMDogRGVmYXVsdCwgbm8gdHJhbnNtaXNzaW9uIG9mIHRhcmEgQnVmZmVyIGZ1bGxuZXNzLCBubyBBU0MKKyAgICAgICAgICAgICAgICAgbGVuZ3RoIGFuZCBpbmNsdWRpbmcgYWN0dWFsIGxhdG0gQnVmZmVyIGZ1bGxuZXMuCisgICAgICAgICAgICAgICAgICAgLSAxOiBUcmFuc21pc3Npb24gb2YgdGFyYSBCdWZmZXIgZnVsbG5lc3MsIEFTQyBsZW5ndGggYW5kCisgICAgICAgICAgICAgICAgIGFjdHVhbCBsYXRtIEJ1ZmZlciBmdWxsbmVzcy4KKyAgICAgICAgICAgICAgICAgICAtIDI6IFRyYW5zbWlzc2lvbiBvZiB0YXJhIEJ1ZmZlciBmdWxsbmVzcywgQVNDIGxlbmd0aCBhbmQKKyAgICAgICAgICAgICAgICAgbWF4aW11bSBsZXZlbCBvZiBsYXRtIEJ1ZmZlciBmdWxsbmVzcy4gKi8KIAotICBBQUNFTkNfQU5DSUxMQVJZX0JJVFJBVEUgICAgICAgID0gMHgwNTAwLCAgLyohPCBDb25zdGFudCBhbmNpbGxhcnkgZGF0YSBiaXRyYXRlIGluIGJpdHMvc2Vjb25kLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IEVpdGhlciBubyBhbmNpbGxhcnkgZGF0YSBvciBpbnNlcnQgZXhhY3QgbnVtYmVyIG9mIGJ5dGVzLCBkZW5vdGVkIHZpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IHBhcmFtZXRlciwgbnVtQW5jQnl0ZXMgaW4gQUFDRU5DX0luQXJncy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBlbHNlOiBJbnNlcnQgYW5jaWxsYXJ5IGRhdGEgd2l0aCBzcGVjaWZpZWQgYml0cmF0ZS4gKi8KKyAgQUFDRU5DX1BST1RFQ1RJT04gPSAweDAzMDYsIC8qITwgQ29uZmlndXJlIHByb3RlY3Rpb24gaW4gdHJhbnNwb3J0IGxheWVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IE5vIHByb3RlY3Rpb24uIChkZWZhdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IENSQyBhY3RpdmUgZm9yIEFEVFMgdHJhbnNwb3J0IGZvcm1hdC4gKi8KIAotICBBQUNFTkNfTUVUQURBVEFfTU9ERSAgICAgICAgICAgID0gMHgwNjAwLCAgLyohPCBDb25maWd1cmUgTWV0YSBEYXRhLiBTZWUgOjpBQUNFTkNfTWV0YURhdGEgZm9yIGZ1cnRoZXIgZGV0YWlsczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEbyBub3QgZW1iZWQgYW55IG1ldGFkYXRhLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVtYmVkIE1QRUcgZGVmaW5lZCBtZXRhZGF0YSBvbmx5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IEVtYmVkIGFsbCBtZXRhZGF0YS4gKi8KKyAgQUFDRU5DX0FOQ0lMTEFSWV9CSVRSQVRFID0KKyAgICAgIDB4MDUwMCwgLyohPCBDb25zdGFudCBhbmNpbGxhcnkgZGF0YSBiaXRyYXRlIGluIGJpdHMvc2Vjb25kLgorICAgICAgICAgICAgICAgICAgIC0gMDogRWl0aGVyIG5vIGFuY2lsbGFyeSBkYXRhIG9yIGluc2VydCBleGFjdCBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgYnl0ZXMsIGRlbm90ZWQgdmlhIGlucHV0IHBhcmFtZXRlciwgbnVtQW5jQnl0ZXMgaW4KKyAgICAgICAgICAgICAgICAgQUFDRU5DX0luQXJncy4KKyAgICAgICAgICAgICAgICAgICAtIGVsc2U6IEluc2VydCBhbmNpbGxhcnkgZGF0YSB3aXRoIHNwZWNpZmllZCBiaXRyYXRlLiAqLwogCi0gIEFBQ0VOQ19DT05UUk9MX1NUQVRFICAgICAgICAgICAgPSAweEZGMDAsICAvKiE8IFRoZXJlIGlzIGFuIGF1dG9tYXRpYyBwcm9jZXNzIHdoaWNoIGludGVybmFsbHkgcmVjb25maWd1cmVzIHRoZSBlbmNvZGVyIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBjaGFuZ2VkIG9yIGFuIGVycm9yIG9jY3VyZWQuIFRoaXMgcGFyYW1lcnRlciBhbGxvd3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRpbmcgb3IgZ2V0dGluZyB0aGUgY29udHJvbCBzdGF0dXMgb2YgdGhpcyBwcm9jZXNzLiBTZWUgOjpBQUNFTkNfQ1RSTEZMQUdTLiAqLworICBBQUNFTkNfTUVUQURBVEFfTU9ERSA9IDB4MDYwMCwgLyohPCBDb25maWd1cmUgTWV0YSBEYXRhLiBTZWUgOjpBQUNFTkNfTWV0YURhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmdXJ0aGVyIGRldGFpbHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogRG8gbm90IGVtYmVkIGFueSBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBFbWJlZCBkeW5hbWljX3JhbmdlX2luZm8gbWV0YWRhdGEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogRW1iZWQgZHluYW1pY19yYW5nZV9pbmZvIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5X2RhdGEgbWV0YWRhdGEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMzogRW1iZWQgYW5jaWxsYXJ5X2RhdGEgbWV0YWRhdGEuICovCiAKLSAgQUFDRU5DX05PTkUgICAgICAgICAgICAgICAgICAgICA9IDB4RkZGRiAgIC8qITwgLS0tLS0tICovCisgIEFBQ0VOQ19DT05UUk9MX1NUQVRFID0KKyAgICAgIDB4RkYwMCwgLyohPCBUaGVyZSBpcyBhbiBhdXRvbWF0aWMgcHJvY2VzcyB3aGljaCBpbnRlcm5hbGx5IHJlY29uZmlndXJlcworICAgICAgICAgICAgICAgICB0aGUgZW5jb2RlciBpbnN0YW5jZSB3aGVuIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgY2hhbmdlZCBvcgorICAgICAgICAgICAgICAgICBhbiBlcnJvciBvY2N1cmVkLiBUaGlzIHBhcmFtZXJ0ZXIgYWxsb3dzIG92ZXJ3cml0aW5nIG9yIGdldHRpbmcKKyAgICAgICAgICAgICAgICAgdGhlIGNvbnRyb2wgc3RhdHVzIG9mIHRoaXMgcHJvY2Vzcy4gU2VlIDo6QUFDRU5DX0NUUkxGTEFHUy4gKi8KKworICBBQUNFTkNfTk9ORSA9IDB4RkZGRiAvKiE8IC0tLS0tLSAqLwogCiB9IEFBQ0VOQ19QQVJBTTsKIAotCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCkBAIC0xMDY0LDMzICsxNTQ3LDQwIEBACiAvKioKICAqIFxicmllZiAgT3BlbiBhbiBpbnN0YW5jZSBvZiB0aGUgZW5jb2Rlci4KICAqCi0gKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBhIGZ1bmN0aW9uYWwgcmFuZ2UgZGVub3RlZCBieSB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycy4KLSAqIFByZWluaXRpYWxpemUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KKyAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gZW5jb2RlciBpbnN0YW5jZSB3aXRoIGEgZnVuY3Rpb25hbCByYW5nZSBkZW5vdGVkIGJ5CisgKiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycy4gUHJlaW5pdGlhbGl6ZSBlbmNvZGVyIGluc3RhbmNlIHdpdGggZGVmYXVsdAorICogY29uZmlndXJhdGlvbi4KICAqCiAgKiBccGFyYW0gcGhBYWNFbmNvZGVyICBBIHBvaW50ZXIgdG8gYW4gZW5jb2RlciBoYW5kbGUuIEluaXRpYWxpemVkIG9uIHJldHVybi4KLSAqIFxwYXJhbSBlbmNNb2R1bGVzICAgIFNwZWNpZnkgZW5jb2RlciBtb2R1bGVzIHRvIGJlIHN1cHBvcnRlZCBpbiB0aGlzIGVuY29kZXIgaW5zdGFuY2U6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAtIDB4MDogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgYXZhaWxhYmxlIGVuY29kZXIgbW9kdWxlcy4KLSAqICAgICAgICAgICAgICAgICAgICAgIC0gZWxzZTogU2VsZWN0IG1lbW9yeSBhbGxvY2F0aW9uIHJlZ2FyZGluZyBlbmNvZGVyIG1vZHVsZXMuIEZvbGxvd2luZyBmbGFncyBhcmUgcG9zc2libGUgYW5kIGNhbiBiZSBjb21iaW5lZC4KKyAqIFxwYXJhbSBlbmNNb2R1bGVzICAgIFNwZWNpZnkgZW5jb2RlciBtb2R1bGVzIHRvIGJlIHN1cHBvcnRlZCBpbiB0aGlzIGVuY29kZXIKKyAqIGluc3RhbmNlOgorICogICAgICAgICAgICAgICAgICAgICAgLSAweDA6IEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIGF2YWlsYWJsZSBlbmNvZGVyCisgKiBtb2R1bGVzLgorICogICAgICAgICAgICAgICAgICAgICAgLSBlbHNlOiBTZWxlY3QgbWVtb3J5IGFsbG9jYXRpb24gcmVnYXJkaW5nIGVuY29kZXIKKyAqIG1vZHVsZXMuIEZvbGxvd2luZyBmbGFncyBhcmUgcG9zc2libGUgYW5kIGNhbiBiZSBjb21iaW5lZC4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweDAxOiBBQUMgbW9kdWxlLgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4MDI6IFNCUiBtb2R1bGUuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMHgwNDogUFMgbW9kdWxlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4MDg6IE1QUyBtb2R1bGUuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMHgxMDogTWV0YWRhdGEgbW9kdWxlLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGV4YW1wbGU6ICgweDAxfDB4MDJ8MHgwNHwweDEwKSBhbGxvY2F0ZXMgYWxsIG1vZHVsZXMgYW5kIGlzIGVxdWl2YWxlbnQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGRlbm90ZXQgYnkgMHgwLgotICogXHBhcmFtIG1heENoYW5uZWxzICAgTnVtYmVyIG9mIGNoYW5uZWxzIHRvIGJlIGFsbG9jYXRlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAtIDA6IEFsbG9jYXRlIG1heGltdW0gbnVtYmVyIG9mIEFBQyBhbmQgU0JSIGNoYW5uZWxzIGFzIHN1cHBvcnRlZCBieSB0aGUgbGlicmFyeS4KLSAqICAgICAgICAgICAgICAgICAgICAgIC0gbkNoYW5uZWxzOiBVc2Ugc2FtZSBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyBmb3IgYWxsb2NhdGluZyBtZW1vcnkgaW4gQUFDIGFuZCBTQlIgbW9kdWxlLgotICogICAgICAgICAgICAgICAgICAgICAgLSBuQ2hhbm5lbHMgfCAoblNickNoPDw4KTogTnVtYmVyIG9mIFNCUiBjaGFubmVscyBjYW4gYmUgZGlmZmVyZW50IHRvIEFBQyBjaGFubmVscyB0byBzYXZlIGRhdGEgbWVtb3J5LgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGV4YW1wbGU6ICgweDAxfDB4MDJ8MHgwNHwweDA4fDB4MTApIGFsbG9jYXRlcworICogYWxsIG1vZHVsZXMgYW5kIGlzIGVxdWl2YWxlbnQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGRlbm90ZXQgYnkgMHgwLgorICogXHBhcmFtIG1heENoYW5uZWxzICAgTnVtYmVyIG9mIGNoYW5uZWxzIHRvIGJlIGFsbG9jYXRlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuCisgKiBiZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzOgorICogICAgICAgICAgICAgICAgICAgICAgLSAwOiBBbGxvY2F0ZSBtYXhpbXVtIG51bWJlciBvZiBBQUMgYW5kIFNCUiBjaGFubmVscyBhcworICogc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LgorICogICAgICAgICAgICAgICAgICAgICAgLSBuQ2hhbm5lbHM6IFVzZSBzYW1lIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIGZvcgorICogYWxsb2NhdGluZyBtZW1vcnkgaW4gQUFDIGFuZCBTQlIgbW9kdWxlLgorICogICAgICAgICAgICAgICAgICAgICAgLSBuQ2hhbm5lbHMgfCAoblNickNoPDw4KTogTnVtYmVyIG9mIFNCUiBjaGFubmVscyBjYW4gYmUKKyAqIGRpZmZlcmVudCB0byBBQUMgY2hhbm5lbHMgdG8gc2F2ZSBkYXRhIG1lbW9yeS4KICAqCiAgKiBccmV0dXJuCiAgKiAgICAgICAgICAtIEFBQ0VOQ19PSywgb24gc3VjY2VzLgotICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9IQU5ETEUsIEFBQ0VOQ19NRU1PUllfRVJST1IsIEFBQ0VOQ19JTlZBTElEX0NPTkZJRywgb24gZmFpbHVyZS4KKyAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBBQUNFTkNfTUVNT1JZX0VSUk9SLCBBQUNFTkNfSU5WQUxJRF9DT05GSUcsCisgKiBvbiBmYWlsdXJlLgogICovCi1BQUNFTkNfRVJST1IgYWFjRW5jT3BlbigKLSAgICAgICAgSEFORExFX0FBQ0VOQ09ERVIgICAgICAgICpwaEFhY0VuY29kZXIsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgZW5jTW9kdWxlcywKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICBtYXhDaGFubmVscwotICAgICAgICApOwotCitBQUNFTkNfRVJST1IgYWFjRW5jT3BlbihIQU5ETEVfQUFDRU5DT0RFUiAqcGhBYWNFbmNvZGVyLCBjb25zdCBVSU5UIGVuY01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG1heENoYW5uZWxzKTsKIAogLyoqCiAgKiBcYnJpZWYgIENsb3NlIHRoZSBlbmNvZGVyIGluc3RhbmNlLgpAQCAtMTEwMyw2MyArMTU5Myw3MiBAQAogICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCiAgKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgb24gZmFpbHVyZS4KICAqLwotQUFDRU5DX0VSUk9SIGFhY0VuY0Nsb3NlKAotICAgICAgICBIQU5ETEVfQUFDRU5DT0RFUiAgICAgICAgKnBoQWFjRW5jb2RlcgotICAgICAgICApOwotCitBQUNFTkNfRVJST1IgYWFjRW5jQ2xvc2UoSEFORExFX0FBQ0VOQ09ERVIgKnBoQWFjRW5jb2Rlcik7CiAKIC8qKgogICogXGJyaWVmIEVuY29kZSBhdWRpbyBkYXRhLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IGZvciBlbmNvZGluZyBhdWRpbyBkYXRhLiBJbiBhZGRpdGlvbiB0aGUgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFuIGVuY29kZXIgKHJlKWNvbmZpZ3VyYXRpb24KLSAqIHByb2Nlc3MuCi0gKiAtIFBDTSBpbnB1dCBkYXRhIHdpbGwgYmUgcmV0cmlldmVkIGZyb20gZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIHVudGlsIHRoZSBmaWxsIGxldmVsIGFsbG93cyBlbmNvZGluZyBhIHNpbmdsZSBmcmFtZS4KLSAqICAgVGhpcyBmdW5jdGlvbmFsaXR5IGFsbG93cyBhbiBleHRlcm5hbCBidWZmZXIgd2l0aCByZWR1Y2VkIHNpemUgaW4gY29tcGFyaXNvbiB0byB0aGUgQUFDIG9yIEhFLUFBQyBhdWRpbyBmcmFtZSBsZW5ndGguCi0gKiAtIElmIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgc2FtcGxlcyBhcmd1bWVudCBpcyB6ZXJvLCBqdXN0IGludGVybmFsIHJlaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBhcHBsaWVkIGlmIGl0IGlzCi0gKiAgIHJlcXVlc3RlZC4KLSAqIC0gQXQgdGhlIGVuZCBvZiBhIGZpbGUgdGhlIGZsdXNoaW5nIHByb2Nlc3MgY2FuIGJlIHRyaWdnZXJkIHZpYSBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgc2FtcGxlcyBhcmd1bWVudCB0byAtMS4KLSAqICAgVGhlIGVuY29kZXIgZGVsYXkgbGluZXMgYXJlIGZ1bGx5IGZsdXNoZWQgd2hlbiB0aGUgZW5jb2RlciByZXR1cm5zIG5vIHZhbGlkIGJpdHN0cmVhbSBkYXRhIEFBQ0VOQ19PdXRBcmdzOjpudW1PdXRCeXRlcy4KLSAqICAgRnVydGhlcm1vcmUgdGhlIGVuZCBvZiBmaWxlIGlzIHNpZ25hbGVkIGJ5IHRoZSByZXR1cm4gdmFsdWUgQUFDRU5DX0VOQ09ERV9FT0YuCi0gKiAtIElmIGFuIGVycm9yIG9jY3VyZWQgaW4gdGhlIHByZXZpb3VzIGZyYW1lIG9yIGFueSBvZiB0aGUgZW5jb2RlciBwYXJhbWV0ZXJzIGNoYW5nZWQsIGFuIGludGVybmFsIHJlaW5pdGlhbGl6YXRpb24KLSAqICAgcHJvY2VzcyB3aWxsIGJlIGFwcGxpZWQgYmVmb3JlIGVuY29kaW5nIHRoZSBpbmNvbWluZyBhdWRpbyBzYW1wbGVzLgotICogLSBUaGUgZnVuY3Rpb24gY2FuIGFsc28gYmUgdXNlZCBmb3IgYW4gaW5kZXBlbmRlbnQgcmVjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2l0aG91dCBlbmNvZGluZy4gVGhlIGZpcnN0IHBhcmFtZXRlciBoYXMgdG8gYmUgYQotICogICB2YWxpZCBlbmNvZGVyIGhhbmRsZSBhbmQgYWxsIG90aGVyIHBhcmFtZXRlcnMgY2FuIGJlIHNldCB0byBOVUxMLgotICogLSBJZiB0aGUgc2l6ZSBvZiB0aGUgZXh0ZXJuYWwgYml0YnVmZmVyIGluIG91dEJ1ZkRlc2MgaXMgbm90IHN1ZmZpY2llbnQgZm9yIHdyaXRpbmcgdGhlIHdob2xlIGJpdHN0cmVhbSwgYW4gaW50ZXJuYWwKLSAqICAgZXJyb3Igd2lsbCBiZSB0aGUgcmV0dXJuIHZhbHVlIGFuZCBhIHJlY29uZmlndXJhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IGZvciBlbmNvZGluZyBhdWRpbyBkYXRhLiBJbiBhZGRpdGlvbiB0aGUgZnVuY3Rpb24gY2FuCisgKiBiZSB1c2VkIGZvciBhbiBlbmNvZGVyIChyZSljb25maWd1cmF0aW9uIHByb2Nlc3MuCisgKiAtIFBDTSBpbnB1dCBkYXRhIHdpbGwgYmUgcmV0cmlldmVkIGZyb20gZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIHVudGlsIHRoZSBmaWxsCisgKiBsZXZlbCBhbGxvd3MgZW5jb2RpbmcgYSBzaW5nbGUgZnJhbWUuIFRoaXMgZnVuY3Rpb25hbGl0eSBhbGxvd3MgYW4gZXh0ZXJuYWwKKyAqIGJ1ZmZlciB3aXRoIHJlZHVjZWQgc2l6ZSBpbiBjb21wYXJpc29uIHRvIHRoZSBBQUMgb3IgSEUtQUFDIGF1ZGlvIGZyYW1lCisgKiBsZW5ndGguCisgKiAtIElmIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgc2FtcGxlcyBhcmd1bWVudCBpcyB6ZXJvLCBqdXN0IGludGVybmFsCisgKiByZWluaXRpYWxpemF0aW9uIHdpbGwgYmUgYXBwbGllZCBpZiBpdCBpcyByZXF1ZXN0ZWQuCisgKiAtIEF0IHRoZSBlbmQgb2YgYSBmaWxlIHRoZSBmbHVzaGluZyBwcm9jZXNzIGNhbiBiZSB0cmlnZ2VyZCB2aWEgc2V0dGluZyB0aGUKKyAqIHZhbHVlIG9mIHRoZSBpbnB1dCBzYW1wbGVzIGFyZ3VtZW50IHRvIC0xLiBUaGUgZW5jb2RlciBkZWxheSBsaW5lcyBhcmUgZnVsbHkKKyAqIGZsdXNoZWQgd2hlbiB0aGUgZW5jb2RlciByZXR1cm5zIG5vIHZhbGlkIGJpdHN0cmVhbSBkYXRhCisgKiBBQUNFTkNfT3V0QXJnczo6bnVtT3V0Qnl0ZXMuIEZ1cnRoZXJtb3JlIHRoZSBlbmQgb2YgZmlsZSBpcyBzaWduYWxlZCBieSB0aGUKKyAqIHJldHVybiB2YWx1ZSBBQUNFTkNfRU5DT0RFX0VPRi4KKyAqIC0gSWYgYW4gZXJyb3Igb2NjdXJlZCBpbiB0aGUgcHJldmlvdXMgZnJhbWUgb3IgYW55IG9mIHRoZSBlbmNvZGVyIHBhcmFtZXRlcnMKKyAqIGNoYW5nZWQsIGFuIGludGVybmFsIHJlaW5pdGlhbGl6YXRpb24gcHJvY2VzcyB3aWxsIGJlIGFwcGxpZWQgYmVmb3JlIGVuY29kaW5nCisgKiB0aGUgaW5jb21pbmcgYXVkaW8gc2FtcGxlcy4KKyAqIC0gVGhlIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHVzZWQgZm9yIGFuIGluZGVwZW5kZW50IHJlY29uZmlndXJhdGlvbiBwcm9jZXNzCisgKiB3aXRob3V0IGVuY29kaW5nLiBUaGUgZmlyc3QgcGFyYW1ldGVyIGhhcyB0byBiZSBhIHZhbGlkIGVuY29kZXIgaGFuZGxlIGFuZAorICogYWxsIG90aGVyIHBhcmFtZXRlcnMgY2FuIGJlIHNldCB0byBOVUxMLgorICogLSBJZiB0aGUgc2l6ZSBvZiB0aGUgZXh0ZXJuYWwgYml0YnVmZmVyIGluIG91dEJ1ZkRlc2MgaXMgbm90IHN1ZmZpY2llbnQgZm9yCisgKiB3cml0aW5nIHRoZSB3aG9sZSBiaXRzdHJlYW0sIGFuIGludGVybmFsIGVycm9yIHdpbGwgYmUgdGhlIHJldHVybiB2YWx1ZSBhbmQgYQorICogcmVjb25maWd1cmF0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkLgogICoKICAqIFxwYXJhbSBoQWFjRW5jb2RlciAgICAgICAgICAgQSB2YWxpZCBBQUMgZW5jb2RlciBoYW5kbGUuCiAgKiBccGFyYW0gaW5CdWZEZXNjICAgICAgICAgICAgIElucHV0IGJ1ZmZlciBkZXNjcmlwdG9yLCBzZWUgQUFDRU5DX0J1ZkRlc2M6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQXQgbGVhc3Qgb25lIGlucHV0IGJ1ZmZlciB3aXRoIGF1ZGlvIGRhdGEgaXMgZXhwZWN0ZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gT3B0aW9uYWxseSBhIHNlY29uZCBpbnB1dCBidWZmZXIgd2l0aCBhbmNpbGxhcnkgZGF0YSBjYW4gYmUgZmVkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEF0IGxlYXN0IG9uZSBpbnB1dCBidWZmZXIgd2l0aCBhdWRpbyBkYXRhIGlzCisgKiBleHBlY3RlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBPcHRpb25hbGx5IGEgc2Vjb25kIGlucHV0IGJ1ZmZlciB3aXRoCisgKiBhbmNpbGxhcnkgZGF0YSBjYW4gYmUgZmVkLgogICogXHBhcmFtIG91dEJ1ZkRlc2MgICAgICAgICAgICBPdXRwdXQgYnVmZmVyIGRlc2NyaXB0b3IsIHNlZSBBQUNFTkNfQnVmRGVzYzoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQcm92aWRlIG9uZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgZW5jb2RlZCBiaXRzdHJlYW0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBvbmUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIGVuY29kZWQKKyAqIGJpdHN0cmVhbS4KICAqIFxwYXJhbSBpbmFyZ3MgICAgICAgICAgICAgICAgSW5wdXQgYXJndW1lbnRzLCBzZWUgQUFDRU5DX0luQXJncy4KICAqIFxwYXJhbSBvdXRhcmdzICAgICAgICAgICAgICAgT3V0cHV0IGFyZ3VtZW50cywgQUFDRU5DX091dEFyZ3MuCiAgKgogICogXHJldHVybgogICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCi0gKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgQUFDRU5DX0VOQ09ERV9FUlJPUiwgb24gZmFpbHVyZSBpbiBlbmNvZGluZyBwcm9jZXNzLgotICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9DT05GSUcsIEFBQ0VOQ19JTklUX0VSUk9SLCBBQUNFTkNfSU5JVF9BQUNfRVJST1IsIEFBQ0VOQ19JTklUX1NCUl9FUlJPUiwgQUFDRU5DX0lOSVRfVFBfRVJST1IsCi0gKiAgICAgICAgICAgIEFBQ0VOQ19JTklUX01FVEFfRVJST1IsIG9uIGZhaWx1cmUgaW4gZW5jb2RlciBpbml0aWFsaXphdGlvbi4KKyAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBBQUNFTkNfRU5DT0RFX0VSUk9SLCBvbiBmYWlsdXJlIGluIGVuY29kaW5nCisgKiBwcm9jZXNzLgorICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9DT05GSUcsIEFBQ0VOQ19JTklUX0VSUk9SLCBBQUNFTkNfSU5JVF9BQUNfRVJST1IsCisgKiBBQUNFTkNfSU5JVF9TQlJfRVJST1IsIEFBQ0VOQ19JTklUX1RQX0VSUk9SLCBBQUNFTkNfSU5JVF9NRVRBX0VSUk9SLAorICogQUFDRU5DX0lOSVRfTVBTX0VSUk9SLCBvbiBmYWlsdXJlIGluIGVuY29kZXIgaW5pdGlhbGl6YXRpb24uCisgKiAgICAgICAgICAtIEFBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVIsIG9uIGluY29ycmVjdCBpbnB1dCBvciBvdXRwdXQgYnVmZmVyCisgKiBkZXNjcmlwdG9yIGluaXRpYWxpemF0aW9uLgogICogICAgICAgICAgLSBBQUNFTkNfRU5DT0RFX0VPRiwgd2hlbiBmbHVzaGluZyBmdWxseSBjb25jbHVkZWQuCiAgKi8KLUFBQ0VOQ19FUlJPUiBhYWNFbmNFbmNvZGUoCi0gICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19CdWZEZXNjICAgICAqaW5CdWZEZXNjLAotICAgICAgICBjb25zdCBBQUNFTkNfQnVmRGVzYyAgICAgKm91dEJ1ZkRlc2MsCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19JbkFyZ3MgICAgICAqaW5hcmdzLAotICAgICAgICBBQUNFTkNfT3V0QXJncyAgICAgICAgICAgKm91dGFyZ3MKLSAgICAgICAgKTsKLQorQUFDRU5DX0VSUk9SIGFhY0VuY0VuY29kZShjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDRU5DX0J1ZkRlc2MgKmluQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDRU5DX0J1ZkRlc2MgKm91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBQ0VOQ19JbkFyZ3MgKmluYXJncywgQUFDRU5DX091dEFyZ3MgKm91dGFyZ3MpOwogCiAvKioKICAqIFxicmllZiAgQWNxdWlyZSBpbmZvIGFib3V0IHByZXNlbnQgZW5jb2RlciBpbnN0YW5jZS4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBpbmZvcm1hdGlvbiBvZiB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uLiBJbiBhZGRpdGlvbiB0byBpbmZvcm1hdGl2ZSBpbnRlcm5hbCBzdGF0ZXMsCi0gKiBhIGNvbmZpZ3VyYXRpb24gZGF0YSBibG9jayBvZiB0aGUgY3VycmVudCBlbmNvZGVyIHNldHRpbmdzIHdpbGwgYmUgcmV0dXJuZWQuIFRoZSBmb3JtYXQgaXMgZWl0aGVyIEF1ZGlvIFNwZWNpZmljIENvbmZpZwotICogaW4gY2FzZSBvZiBSYXcgUGFja2V0cyB0cmFuc3BvcnQgZm9ybWF0IG9yIFN0cmVhbU11eENvbmZpZyBpbiBjYXNlIG9mIExPQVMvTEFUTSB0cmFuc3BvcnQgZm9ybWF0LiBUaGUgY29uZmlndXJhdGlvbgotICogZGF0YSBibG9jayBpcyBiaW5hcnkgY29kZWQgYXMgc3BlY2lmaWVkIGluIElTTy9JRUMgMTQ0OTYtMyAoTVBFRy00IGF1ZGlvKSwgdG8gYmUgdXNlZCBkaXJlY3RseSBmb3IgTVBFRy00IEZpbGUgRm9ybWF0Ci0gKiBvciBSRkMzMDE2IG9yIFJGQzM2NDAgYXBwbGljYXRpb25zLgorICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgaW5mb3JtYXRpb24gb2YgdGhlIGVuY29kZXIgY29uZmlndXJhdGlvbi4gSW4gYWRkaXRpb24KKyAqIHRvIGluZm9ybWF0aXZlIGludGVybmFsIHN0YXRlcywgYSBjb25maWd1cmF0aW9uIGRhdGEgYmxvY2sgb2YgdGhlIGN1cnJlbnQKKyAqIGVuY29kZXIgc2V0dGluZ3Mgd2lsbCBiZSByZXR1cm5lZC4gVGhlIGZvcm1hdCBpcyBlaXRoZXIgQXVkaW8gU3BlY2lmaWMgQ29uZmlnCisgKiBpbiBjYXNlIG9mIFJhdyBQYWNrZXRzIHRyYW5zcG9ydCBmb3JtYXQgb3IgU3RyZWFtTXV4Q29uZmlnIGluIGNhc2Ugb2YKKyAqIExPQVMvTEFUTSB0cmFuc3BvcnQgZm9ybWF0LiBUaGUgY29uZmlndXJhdGlvbiBkYXRhIGJsb2NrIGlzIGJpbmFyeSBjb2RlZCBhcworICogc3BlY2lmaWVkIGluIElTTy9JRUMgMTQ0OTYtMyAoTVBFRy00IGF1ZGlvKSwgdG8gYmUgdXNlZCBkaXJlY3RseSBmb3IgTVBFRy00CisgKiBGaWxlIEZvcm1hdCBvciBSRkMzMDE2IG9yIFJGQzM2NDAgYXBwbGljYXRpb25zLgogICoKICAqIFxwYXJhbSBoQWFjRW5jb2RlciAgICAgICAgICAgQSB2YWxpZCBBQUMgZW5jb2RlciBoYW5kbGUuCiAgKiBccGFyYW0gcEluZm8gICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gQUFDRU5DX0luZm9TdHJ1Y3QuIEZpbGxlZCBvbiByZXR1cm4uCkBAIC0xMTY4LDUwICsxNjY3LDQ1IEBACiAgKiAgICAgICAgICAtIEFBQ0VOQ19PSywgb24gc3VjY2VzLgogICogICAgICAgICAgLSBBQUNFTkNfSU5JVF9FUlJPUiwgb24gZmFpbHVyZS4KICAqLwotQUFDRU5DX0VSUk9SIGFhY0VuY0luZm8oCi0gICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCi0gICAgICAgIEFBQ0VOQ19JbmZvU3RydWN0ICAgICAgICAqcEluZm8KLSAgICAgICAgKTsKLQorQUFDRU5DX0VSUk9SIGFhY0VuY0luZm8oY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfSW5mb1N0cnVjdCAqcEluZm8pOwogCiAvKioKICAqIFxicmllZiAgU2V0IG9uZSBzaW5nbGUgQUFDIGVuY29kZXIgcGFyYW1ldGVyLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNvbmZpZ3VyYXRpb24gb2YgYWxsIGVuY29kZXIgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gOjpBQUNFTkNfUEFSQU0uIEVhY2ggcGFyYW1ldGVyIG11c3QgYmUKLSAqIHNldCB3aXRoIGEgc2VwYXJhdGUgZnVuY3Rpb24gY2FsbC4gQW4gaW50ZXJuYWwgdmFsaWRhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZSByYW5nZSB3aWxsIGJlIGRvbmUgYW5kIGFuCi0gKiBpbnRlcm5hbCByZWNvbmZpZ3VyYXRpb24gd2lsbCBiZSBzaWduYWxlZC4gVGhlIGFjdHVhbCBjb25maWd1cmF0aW9uIGFkb3B0aW9uIGlzIHBhcnQgb2YgdGhlIHN1YnNlcXVlbnQgYWFjRW5jRW5jb2RlKCkgY2FsbC4KKyAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNvbmZpZ3VyYXRpb24gb2YgYWxsIGVuY29kZXIgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4KKyAqIDo6QUFDRU5DX1BBUkFNLiBFYWNoIHBhcmFtZXRlciBtdXN0IGJlIHNldCB3aXRoIGEgc2VwYXJhdGUgZnVuY3Rpb24gY2FsbC4gQW4KKyAqIGludGVybmFsIHZhbGlkYXRpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgcmFuZ2Ugd2lsbCBiZSBkb25lIGFuZCBhbgorICogaW50ZXJuYWwgcmVjb25maWd1cmF0aW9uIHdpbGwgYmUgc2lnbmFsZWQuIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBhZG9wdGlvbgorICogaXMgcGFydCBvZiB0aGUgc3Vic2VxdWVudCBhYWNFbmNFbmNvZGUoKSBjYWxsLgogICoKICAqIFxwYXJhbSBoQWFjRW5jb2RlciAgICAgICAgICAgQSB2YWxpZCBBQUMgZW5jb2RlciBoYW5kbGUuCiAgKiBccGFyYW0gcGFyYW0gICAgICAgICAgICAgICAgIFBhcmFtZXRlciB0byBiZSBzZXQuIFNlZSA6OkFBQ0VOQ19QQVJBTS4KLSAqIFxwYXJhbSB2YWx1ZSAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHZhbHVlLiBTZWUgcGFyYW1ldGVyIGRlc2NyaXB0aW9uIGluIDo6QUFDRU5DX1BBUkFNLgorICogXHBhcmFtIHZhbHVlICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgdmFsdWUuIFNlZSBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gaW4KKyAqIDo6QUFDRU5DX1BBUkFNLgogICoKICAqIFxyZXR1cm4KICAqICAgICAgICAgIC0gQUFDRU5DX09LLCBvbiBzdWNjZXNzLgotICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9IQU5ETEUsIEFBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVIsIEFBQ0VOQ19JTlZBTElEX0NPTkZJRywgb24gZmFpbHVyZS4KKyAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBBQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSLAorICogQUFDRU5DX0lOVkFMSURfQ09ORklHLCBvbiBmYWlsdXJlLgogICovCi1BQUNFTkNfRVJST1IgYWFjRW5jb2Rlcl9TZXRQYXJhbSgKLSAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgICBoQWFjRW5jb2RlciwKLSAgICAgICAgY29uc3QgQUFDRU5DX1BBUkFNICAgICAgICBwYXJhbSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICB2YWx1ZQotICAgICAgICApOwotCitBQUNFTkNfRVJST1IgYWFjRW5jb2Rlcl9TZXRQYXJhbShjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBQ0VOQ19QQVJBTSBwYXJhbSwgY29uc3QgVUlOVCB2YWx1ZSk7CiAKIC8qKgogICogXGJyaWVmICBHZXQgb25lIHNpbmdsZSBBQUMgZW5jb2RlciBwYXJhbWV0ZXIuCiAgKgotICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgY29tcGxlbWVudCB0byBhYWNFbmNvZGVyX1NldFBhcmFtKCkuIEFmdGVyIGVuY29kZXIgcmVpbml0aWFsaXphdGlvbiB3aXRoIHVzZXIgZGVmaW5lZCBzZXR0aW5ncywKLSAqIHRoZSBpbnRlcm5hbCBzdGF0dXMgY2FuIGJlIG9idGFpbmVkIG9mIGVhY2ggcGFyYW1ldGVyLCBzcGVjaWZpZWQgd2l0aCA6OkFBQ0VOQ19QQVJBTS4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGNvbXBsZW1lbnQgdG8gYWFjRW5jb2Rlcl9TZXRQYXJhbSgpLiBBZnRlciBlbmNvZGVyCisgKiByZWluaXRpYWxpemF0aW9uIHdpdGggdXNlciBkZWZpbmVkIHNldHRpbmdzLCB0aGUgaW50ZXJuYWwgc3RhdHVzIGNhbiBiZQorICogb2J0YWluZWQgb2YgZWFjaCBwYXJhbWV0ZXIsIHNwZWNpZmllZCB3aXRoIDo6QUFDRU5DX1BBUkFNLgogICoKICAqIFxwYXJhbSBoQWFjRW5jb2RlciAgICAgICAgICAgQSB2YWxpZCBBQUMgZW5jb2RlciBoYW5kbGUuCiAgKiBccGFyYW0gcGFyYW0gICAgICAgICAgICAgICAgIFBhcmFtZXRlciB0byBiZSByZXR1cm5lZC4gU2VlIDo6QUFDRU5DX1BBUkFNLgogICoKICAqIFxyZXR1cm4gIEludGVybmFsIGNvbmZpZ3VyYXRpb24gdmFsdWUgb2Ygc3BlY2lmZWQgcGFyYW1ldGVyIDo6QUFDRU5DX1BBUkFNLgogICovCi1VSU5UIGFhY0VuY29kZXJfR2V0UGFyYW0oCi0gICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19QQVJBTSAgICAgICAgcGFyYW0KLSAgICAgICAgKTsKLQorVUlOVCBhYWNFbmNvZGVyX0dldFBhcmFtKGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBQ0VOQ19QQVJBTSBwYXJhbSk7CiAKIC8qKgogICogXGJyaWVmICBHZXQgaW5mb3JtYXRpb24gYWJvdXQgZW5jb2RlciBsaWJyYXJ5IGJ1aWxkLgpAQCAtMTIyNCwxMyArMTcxOCwxMCBAQAogICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCiAgKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgQUFDRU5DX0lOSVRfRVJST1IsIG9uIGZhaWx1cmUuCiAgKi8KLUFBQ0VOQ19FUlJPUiBhYWNFbmNHZXRMaWJJbmZvKAotICAgICAgICBMSUJfSU5GTyAgICAgICAgICAgICAgICAgKmluZm8KLSAgICAgICAgKTsKLQorQUFDRU5DX0VSUk9SIGFhY0VuY0dldExpYkluZm8oTElCX0lORk8gKmluZm8pOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgogCi0jZW5kaWYgICAvKiBfQUFDX0VOQ19MSUJfSF8gKi8KKyNlbmRpZiAvKiBBQUNFTkNfTElCX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JhbS5jcHAgYi9saWJBQUNlbmMvc3JjL2FhY0VuY19yYW0uY3BwCmluZGV4IGJlM2VlYTIuLjc3YjExMzEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JhbS5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9hYWNFbmNfcmFtLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcnM6ICAgICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgotICAgQ29udGVudHMvZGVzY3JpcHRpb246CisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogLyohCiAgIFxmaWxlCiAgIFxicmllZiAgTWVtb3J5IGxheW91dApAQCAtOTUsMTAwICsxMDgsMTAxIEBACiAKICNpbmNsdWRlICJhYWNFbmNfcmFtLmgiCiAKLSAgQ19BQUxMT0NfTUVNIChBQUNkeW5hbWljX1JBTSwgRklYUF9EQkwsIEFBQ19FTkNfRFlOX1JBTV9TSVpFL3NpemVvZihGSVhQX0RCTCkpCitDX0FBTExPQ19NRU0oQUFDZHluYW1pY19SQU0sIEZJWFBfREJMLCBBQUNfRU5DX0RZTl9SQU1fU0laRSAvIHNpemVvZihGSVhQX0RCTCkpCiAKIC8qCi0gIFN0YXRpYyBtZW1vcnkgYXJlYXMsIG11c3Qgbm90IGJlIG92ZXJ3cml0dGVuIGluIG90aGVyIHNlY3Rpb25zIG9mIHRoZSBkZWNvZGVyICEKKyAgU3RhdGljIG1lbW9yeSBhcmVhcywgbXVzdCBub3QgYmUgb3ZlcndyaXR0ZW4gaW4gb3RoZXIgc2VjdGlvbnMgb2YgdGhlIGRlY29kZXIKKyAgIQogKi8KIAogLyoKICBUaGUgc3RydWN0dXJlIEFhY0VuY29kZXIgY29udGFpbnMgYWxsIEVuY29kZXIgc3RydWN0dXJlcy4KICovCiAKLUNfQUxMT0NfTUVNIChSYW1fYWFjRW5jX0FhY0VuY29kZXIsICAgICAgICAgICBBQUNfRU5DLCAgICAgICAgICAxKQotCitDX0FMTE9DX01FTShSYW1fYWFjRW5jX0FhY0VuY29kZXIsIHN0cnVjdCBBQUNfRU5DLCAxKQogCiAvKgogICAgVGhlIHN0cnVjdHVyZSBQU1lfSU5URVJOQWwgY29udGFpbnMgYWxsIHBzeWNoIGNvbmZpZ3VyYXRpb24gYW5kIGRhdGEgcG9pbnRlci4KICAgICogUHN5U3RhdGljIGhvbGRzIGxhc3QgYW5kIGN1cnJlbnQgUHN5Y2ggZGF0YS4KLSAgICogUHN5SW5wdXRCdWZmZXIgY29udGFpbnMgdGltZSBpbnB1dC4gU2lnbmFsIGlzIG5lZWRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIFBzeWNoLgotICAgICBNZW1vcnkgY2FuIGJlIHJldXNlZCBhZnRlciBzaWduYWwgaXMgaW4gdGltZSBkb21haW4uCi0gICAqIFBzeURhdGEgY29udGFpbnMgc3BlY3RyYWwsIG5yZyBhbmQgdGhyZXNob2xkIGluZm9ybWF0aW9uLiBOZWNlc3NhcnkgZGF0YSBhcmUKLSAgICAgY29waWVkIGludG8gUHN5T3V0LCBzbyBtZW1vcnkgaXMgYXZhaWxhYmxlIGFmdGVyIGxlYXZpbmcgcHN5Y2guCi0gICAqIFRuc0RhdGEsIENoYW9zTWVhc3VyZSwgUG5zRGF0YSBhcmUgdGVtcG9yYXJpbHkgbmVjZXNzYXJ5LCBlLmcuIHVzZSBtZW1vcnkgZnJvbQotICAgICBQc3lJbnB1dEJ1ZmZlci4KKyAgICogUHN5SW5wdXRCdWZmZXIgY29udGFpbnMgdGltZSBpbnB1dC4gU2lnbmFsIGlzIG5lZWRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICBQc3ljaC4gTWVtb3J5IGNhbiBiZSByZXVzZWQgYWZ0ZXIgc2lnbmFsIGlzIGluIHRpbWUgZG9tYWluLgorICAgKiBQc3lEYXRhIGNvbnRhaW5zIHNwZWN0cmFsLCBucmcgYW5kIHRocmVzaG9sZCBpbmZvcm1hdGlvbi4gTmVjZXNzYXJ5IGRhdGEKKyAgIGFyZSBjb3BpZWQgaW50byBQc3lPdXQsIHNvIG1lbW9yeSBpcyBhdmFpbGFibGUgYWZ0ZXIgbGVhdmluZyBwc3ljaC4KKyAgICogVG5zRGF0YSwgQ2hhb3NNZWFzdXJlLCBQbnNEYXRhIGFyZSB0ZW1wb3JhcmlseSBuZWNlc3NhcnksIGUuZy4gdXNlIG1lbW9yeQorICAgZnJvbSBQc3lJbnB1dEJ1ZmZlci4KICovCiAKLUNfQUxMT0NfTUVNMiAoUmFtX2FhY0VuY19Qc3lFbGVtZW50LCBQU1lfRUxFTUVOVCwgMSwgKDgpKQorQ19BTExPQ19NRU0yKFJhbV9hYWNFbmNfUHN5RWxlbWVudCwgUFNZX0VMRU1FTlQsIDEsICgoOCkpKQogCi1DX0FMTE9DX01FTSAgKFJhbV9hYWNFbmNfUHN5SW50ZXJuYWwsIFBTWV9JTlRFUk5BTCwgMSkKLUNfQUxMT0NfTUVNMiAoUmFtX2FhY0VuY19Qc3lTdGF0aWMsICAgUFNZX1NUQVRJQywgICAxLCAoOCkpCitDX0FMTE9DX01FTShSYW1fYWFjRW5jX1BzeUludGVybmFsLCBQU1lfSU5URVJOQUwsIDEpCitDX0FMTE9DX01FTTIoUmFtX2FhY0VuY19Qc3lTdGF0aWMsIFBTWV9TVEFUSUMsIDEsICg4KSkKIAotQ19BTExPQ19NRU0yIChSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyLCBJTlRfUENNLCBNQVhfSU5QVVRfQlVGRkVSX1NJWkUsICg4KSkKK0NfQUxMT0NfTUVNMihSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyLCBJTlRfUENNLCBNQVhfSU5QVVRfQlVGRkVSX1NJWkUsICg4KSkKIAotICBQU1lfRFlOQU1JQyAqR2V0UmFtX2FhY0VuY19Qc3lEeW5hbWljIChpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKSB7Ci0gICAgICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNIT0wKTsKLSAgICAgIHJldHVybiAoKFBTWV9EWU5BTUlDKikgKGR5bmFtaWNfUkFNICsgUF9CVUZfMSArIG4qc2l6ZW9mKFBTWV9EWU5BTUlDKSkpOwotICB9Ci0KLSAgQ19BTExPQ19NRU0gKFJhbV9ic091dGJ1ZmZlciwgVUNIQVIsIE9VVFBVVEJVRkZFUl9TSVpFKQorUFNZX0RZTkFNSUMgKkdldFJhbV9hYWNFbmNfUHN5RHluYW1pYyhpbnQgbiwgVUNIQVIgKmR5bmFtaWNfUkFNKSB7CisgIEZES19BU1NFUlQoZHluYW1pY19SQU0gIT0gMCk7CisgIC8qIFRoZSByZWludGVycHJldF9jYXN0IGlzIHVzZWQgdG8gc3VwcHJlc3MgYSBjb21waWxlciB3YXJuaW5nLiBXZSBrbm93IHRoYXQKKyAgICogKGR5bmFtaWNfUkFNICsgUF9CVUZfMSArIG4qc2l6ZW9mKFBTWV9EWU5BTUlDKSkgaXMgc3VmZmljaWVudGx5IGFsaWduZWQsIHNvCisgICAqIHRoZSBjYXN0IGlzIHNhZmUgKi8KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UFNZX0RZTkFNSUMgKj4ocmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KAorICAgICAgZHluYW1pY19SQU0gKyBQX0JVRl8xICsgbiAqIHNpemVvZihQU1lfRFlOQU1JQykpKTsKK30KIAogLyoKICAgIFRoZSBzdHJ1Y3R1cmUgUFNZX09VVCBob2xkcyBhbGwgcHN5Y2hvYWNjb3VzdGljIGRhdGEgbmVlZGVkCiAgICBpbiBxdWFudGl6YXRpb24gbW9kdWxlCiAqLwotQ19BTExPQ19NRU0yIChSYW1fYWFjRW5jX1BzeU91dCwgICAgICAgICBQU1lfT1VULCAxLCAoMSkpCitDX0FMTE9DX01FTTIoUmFtX2FhY0VuY19Qc3lPdXQsIFBTWV9PVVQsIDEsICgxKSkKIAotQ19BTExPQ19NRU0yIChSYW1fYWFjRW5jX1BzeU91dEVsZW1lbnRzLCBQU1lfT1VUX0VMRU1FTlQsIDEsICgxKSooOCkpCi1DX0FMTE9DX01FTTIgKFJhbV9hYWNFbmNfUHN5T3V0Q2hhbm5lbCwgIFBTWV9PVVRfQ0hBTk5FTCwgMSwgKDEpKig4KSkKLQorQ19BTExPQ19NRU0yKFJhbV9hYWNFbmNfUHN5T3V0RWxlbWVudHMsIFBTWV9PVVRfRUxFTUVOVCwgMSwgKDEpICogKCg4KSkpCitDX0FMTE9DX01FTTIoUmFtX2FhY0VuY19Qc3lPdXRDaGFubmVsLCBQU1lfT1VUX0NIQU5ORUwsIDEsICgxKSAqICg4KSkKIAogLyoKLSAgIFRoZSBzdHJ1Y3R1cmUgUUNfU1RBVEUgY29udGFpbnMgcHJlaW5pdGlhbGl6ZWQgc2V0dGluZ3MgYW5kIHF1YW50aXplciBzdHJ1Y3R1cmVzLgorICAgVGhlIHN0cnVjdHVyZSBRQ19TVEFURSBjb250YWlucyBwcmVpbml0aWFsaXplZCBzZXR0aW5ncyBhbmQgcXVhbnRpemVyCisgICBzdHJ1Y3R1cmVzLgogICAgKiBBZGp1c3RUaHJlc2hvbGQgc3RydWN0dXJlIGNvbnRhaW5zIGVsZW1lbnQtd2lzZSBzZXR0aW5ncy4KICAgICogRWxlbWVudEJpdHMgY29udGFpbnMgZWxlbW50LXdpc2UgYml0IGNvbnN1bXB0aW9uIHNldHRpbmdzLgogICAgKiBXaGVuIENSQyBpcyBhY3RpdmUsIGxvb2t1cCB0YWJsZSBpcyBuZWNlc3NhcnkgZm9yIGZhc3QgY3JjIGNhbGN1bGF0aW9uLgotICAgKiBCaXRjb3VudGVyIGNvbnRhaW5zIGJ1ZmZlciB0byBmaW5kIG9wdGltYWwgY29kZWJvb2tzIGFuZCBtaW5pbWFsIGJpdCBjb25zdW1wdGlvbi4KLSAgICAgVmFsdWVzIGFyZSB0ZW1wb3JhcmlseSwgc28gZHluYW1pYyBtZW1vcnkgY2FuIGJlIHVzZWQuCisgICAqIEJpdGNvdW50ZXIgY29udGFpbnMgYnVmZmVyIHRvIGZpbmQgb3B0aW1hbCBjb2RlYm9va3MgYW5kIG1pbmltYWwgYml0CisgICBjb25zdW1wdGlvbi4gVmFsdWVzIGFyZSB0ZW1wb3JhcmlseSwgc28gZHluYW1pYyBtZW1vcnkgY2FuIGJlIHVzZWQuCiAqLwogCi1DX0FMTE9DX01FTSAoUmFtX2FhY0VuY19RQ3N0YXRlLCBRQ19TVEFURSwgMSkKLUNfQUxMT0NfTUVNIChSYW1fYWFjRW5jX0FkanVzdFRocmVzaG9sZCwgQURKX1RIUl9TVEFURSwgMSkKK0NfQUxMT0NfTUVNKFJhbV9hYWNFbmNfUUNzdGF0ZSwgUUNfU1RBVEUsIDEpCitDX0FMTE9DX01FTShSYW1fYWFjRW5jX0FkanVzdFRocmVzaG9sZCwgQURKX1RIUl9TVEFURSwgMSkKIAotQ19BTExPQ19NRU0yIChSYW1fYWFjRW5jX0FkalRoclN0YXRlRWxlbWVudCwgQVRTX0VMRU1FTlQsIDEsICg4KSkKLUNfQUxMT0NfTUVNMiAoUmFtX2FhY0VuY19FbGVtZW50Qml0cywgRUxFTUVOVF9CSVRTLCAxLCAoOCkpCi1DX0FMTE9DX01FTSAoUmFtX2FhY0VuY19CaXRDbnRyU3RhdGUsIEJJVENOVFJfU1RBVEUsIDEpCitDX0FMTE9DX01FTTIoUmFtX2FhY0VuY19BZGpUaHJTdGF0ZUVsZW1lbnQsIEFUU19FTEVNRU5ULCAxLCAoKDgpKSkKK0NfQUxMT0NfTUVNMihSYW1fYWFjRW5jX0VsZW1lbnRCaXRzLCBFTEVNRU5UX0JJVFMsIDEsICgoOCkpKQorQ19BTExPQ19NRU0oUmFtX2FhY0VuY19CaXRDbnRyU3RhdGUsIHN0cnVjdCBCSVRDTlRSX1NUQVRFLCAxKQogCi0gIElOVCAqR2V0UmFtX2FhY0VuY19CaXRMb29rVXAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSkgewotICAgIEZES19BU1NFUlQoZHluYW1pY19SQU0hPTApOwotICAgIHJldHVybiAoKElOVCopIChkeW5hbWljX1JBTSArIFBfQlVGXzEpKTsKLSAgfQotICBJTlQgKkdldFJhbV9hYWNFbmNfTWVyZ2VHYWluTG9va1VwKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pIHsKLSAgICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNIT0wKTsKLSAgICByZXR1cm4gKChJTlQqKSAoZHluYW1pY19SQU0gKyBQX0JVRl8xICsgc2l6ZW9mKElOVCkqKE1BWF9TRkJfTE9ORyooQ09ERV9CT09LX0VTQ19ORFgrMSkpKSk7Ci0gIH0KLQorSU5UICpHZXRSYW1fYWFjRW5jX0JpdExvb2tVcChpbnQgbiwgVUNIQVIgKmR5bmFtaWNfUkFNKSB7CisgIEZES19BU1NFUlQoZHluYW1pY19SQU0gIT0gMCk7CisgIC8qIFRoZSByZWludGVycHJldF9jYXN0IGlzIHVzZWQgdG8gc3VwcHJlc3MgYSBjb21waWxlciB3YXJuaW5nLiBXZSBrbm93IHRoYXQKKyAgICogKGR5bmFtaWNfUkFNICsgUF9CVUZfMSkgaXMgc3VmZmljaWVudGx5IGFsaWduZWQsIHNvIHRoZSBjYXN0IGlzIHNhZmUgKi8KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8SU5UICo+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KGR5bmFtaWNfUkFNICsgUF9CVUZfMSkpOworfQorSU5UICpHZXRSYW1fYWFjRW5jX01lcmdlR2Fpbkxvb2tVcChpbnQgbiwgVUNIQVIgKmR5bmFtaWNfUkFNKSB7CisgIEZES19BU1NFUlQoZHluYW1pY19SQU0gIT0gMCk7CisgIC8qIFRoZSByZWludGVycHJldF9jYXN0IGlzIHVzZWQgdG8gc3VwcHJlc3MgYSBjb21waWxlciB3YXJuaW5nLiBXZSBrbm93IHRoYXQKKyAgICogKGR5bmFtaWNfUkFNICsgUF9CVUZfMSArIHNpemVvZihJTlQpKihNQVhfU0ZCX0xPTkcqKENPREVfQk9PS19FU0NfTkRYKzEpKSkKKyAgICogaXMgc3VmZmljaWVudGx5IGFsaWduZWQsIHNvIHRoZSBjYXN0IGlzIHNhZmUgKi8KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8SU5UICo+KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPigKKyAgICAgIGR5bmFtaWNfUkFNICsgUF9CVUZfMSArCisgICAgICBzaXplb2YoSU5UKSAqIChNQVhfU0ZCX0xPTkcgKiAoQ09ERV9CT09LX0VTQ19ORFggKyAxKSkpKTsKK30KIAogLyoKLSAgIFRoZSBzdHJ1Y3R1cmUgUUNfT1VUIGNvbnRhaW5zIHNldHRpbmdzIGFuZCBzdHJ1Y3R1cmVzIGhvbGRpbmcgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgotICAgbmVlZGVkIGluIGJpdHN0cmVhbXdyaXRlci4KKyAgIFRoZSBzdHJ1Y3R1cmUgUUNfT1VUIGNvbnRhaW5zIHNldHRpbmdzIGFuZCBzdHJ1Y3R1cmVzIGhvbGRpbmcgYWxsIG5lY2Vzc2FyeQorICAgaW5mb3JtYXRpb24gbmVlZGVkIGluIGJpdHN0cmVhbXdyaXRlci4KICovCiAKLUNfQUxMT0NfTUVNMiAoUmFtX2FhY0VuY19RQ291dCwgUUNfT1VULCAxLCAoMSkpCi1DX0FMTE9DX01FTTIgKFJhbV9hYWNFbmNfUUNlbGVtZW50LCBRQ19PVVRfRUxFTUVOVCwgKDEpLCAoOCkpCi0gIFFDX09VVF9DSEFOTkVMICpHZXRSYW1fYWFjRW5jX1FDY2hhbm5lbCAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSkgewotICAgICAgRkRLX0FTU0VSVChkeW5hbWljX1JBTSE9MCk7Ci0gICAgICByZXR1cm4gKChRQ19PVVRfQ0hBTk5FTCopIChkeW5hbWljX1JBTSArIFBfQlVGXzAgKyBuKnNpemVvZihRQ19PVVRfQ0hBTk5FTCkpKTsKLSAgfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQorQ19BTExPQ19NRU0yKFJhbV9hYWNFbmNfUUNvdXQsIFFDX09VVCwgMSwgKDEpKQorQ19BTExPQ19NRU0yKFJhbV9hYWNFbmNfUUNlbGVtZW50LCBRQ19PVVRfRUxFTUVOVCwgMSwgKDEpICogKCg4KSkpCitRQ19PVVRfQ0hBTk5FTCAqR2V0UmFtX2FhY0VuY19RQ2NoYW5uZWwoaW50IG4sIFVDSEFSICpkeW5hbWljX1JBTSkgeworICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNICE9IDApOworICAvKiBUaGUgcmVpbnRlcnByZXRfY2FzdCBpcyB1c2VkIHRvIHN1cHByZXNzIGEgY29tcGlsZXIgd2FybmluZy4gV2Uga25vdyB0aGF0CisgICAqIChkeW5hbWljX1JBTSArIFBfQlVGXzAgKyBuKnNpemVvZihRQ19PVVRfQ0hBTk5FTCkpIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLAorICAgKiBzbyB0aGUgY2FzdCBpcyBzYWZlICovCisgIHJldHVybiByZWludGVycHJldF9jYXN0PFFDX09VVF9DSEFOTkVMICo+KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPigKKyAgICAgIGR5bmFtaWNfUkFNICsgUF9CVUZfMCArIG4gKiBzaXplb2YoUUNfT1VUX0NIQU5ORUwpKSk7Cit9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2FhY0VuY19yYW0uaCBiL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JhbS5oCmluZGV4IGNmN2RhN2MuLjA3NzVhYWUgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JhbS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JhbS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIzICs5MCwyNCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yczogICAgICBNLiBMb2h3YXNzZXIsIE0uIEdheWVyCi0gICBDb250ZW50cy9kZXNjcmlwdGlvbjoKKyAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIsIE0uIEdheWVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBNZW1vcnkgbGF5b3V0ICAgCisgIFxicmllZiAgTWVtb3J5IGxheW91dAogICBcYXV0aG9yIE1hcmt1cyBMb2h3YXNzZXIKICovCiAKLSNpZm5kZWYgQUFDX0VOQ19SQU1fSAotI2RlZmluZSBBQUNfRU5DX1JBTV9ICisjaWZuZGVmIEFBQ0VOQ19SQU1fSAorI2RlZmluZSBBQUNFTkNfUkFNX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIApAQCAtMTA3LDMyICsxMTksMzUgQEAKICNpbmNsdWRlICJiaXRfY250LmgiCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAKLSAgI2RlZmluZSAgT1VUUFVUQlVGRkVSX1NJWkUgICAgKDgxOTIpICAvKiE8IE91dHB1dCBidWZmZXIgc2l6ZSBoYXMgdG8gYmUgYXQgbGVhc3QgNjE0NCBiaXRzIHBlciBjaGFubmVsICg3NjggYnl0ZXMpLiBGREsgYml0YnVmZmVyIGltcGxlbWVudGF0aW9uIGV4cGVjdHMgYnVmZmVyIG9mIHNpemUgMl5uLiAqLwotCisjZGVmaW5lIE9VVFBVVEJVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDgxOTIpIC8qITwgT3V0cHV0IGJ1ZmZlciBzaXplIGhhcyB0byBiZSBhdCBsZWFzdCA2MTQ0IGJpdHMgcGVyIGNoYW5uZWwgXAorICAgICAgICAgICAgKDc2OCBieXRlcykuIEZESyBiaXRidWZmZXIgaW1wbGVtZW50YXRpb24gZXhwZWN0cyBidWZmZXIgb2YgICBcCisgICAgICAgICAgICBzaXplIDJebi4gKi8KIAogLyoKLSAgTW92ZWQgQUFDX0VOQyBzdHJ1Y3QgZGVmaW5pdGlvbiBmcm9tIGFhY19lbmMuY3BwIGludG8gYWFjRW5jX3JhbS5oIHRvIGdldCBzaXplIGFuZCByZXNwZWN0aXZlCi0gIHN0YXRpYyBtZW1vcnkgaW4gYWFjRW5jX3JhbS5jcHAuCi0gIGFhY19lbmMuaCBpcyB0aGUgb3V0d2FyZCB2aXNpYmxlIGhlYWRlciBmaWxlIGFuZCBwdXR0aW5nIHRoZSBzdHJ1Y3QgaW50byB3b3VsZCBjYXVzZSBuZWNlc3NpdHkKLSAgb2YgYWRkaXRpb25hbCB2aXNpYmxlIGhlYWRlciBmaWxlcyBvdXRzaWRlIGxpYnJhcnkuCisgIE1vdmVkIEFBQ19FTkMgc3RydWN0IGRlZmluaXRpb24gZnJvbSBhYWNfZW5jLmNwcCBpbnRvIGFhY0VuY19yYW0uaCB0byBnZXQgc2l6ZQorICBhbmQgcmVzcGVjdGl2ZSBzdGF0aWMgbWVtb3J5IGluIGFhY0VuY19yYW0uY3BwLiBhYWNfZW5jLmggaXMgdGhlIG91dHdhcmQKKyAgdmlzaWJsZSBoZWFkZXIgZmlsZSBhbmQgcHV0dGluZyB0aGUgc3RydWN0IGludG8gd291bGQgY2F1c2UgbmVjZXNzaXR5IG9mCisgIGFkZGl0aW9uYWwgdmlzaWJsZSBoZWFkZXIgZmlsZXMgb3V0c2lkZSBsaWJyYXJ5LgogKi8KIAogLyogZGVmaW5lIGhCaXRzdHJlYW0gc2l6ZTogbWF4IEFBQyBmcmFtZWxlbmd0aCBpcyA2MTQ0IGJpdHMvY2hhbm5lbCAqLwotLyojZGVmaW5lIEJVRkZFUl9CSVRTVFJfU0laRSAoKDY0MDAqKDgpL2JiV29yZFNpemUpICAgICsoKGJiV29yZFNpemUgLSAxKSAvIGJiV29yZFNpemUpKSovCisvKiNkZWZpbmUgQlVGRkVSX0JJVFNUUl9TSVpFICgoNjQwMCooOCkvYmJXb3JkU2l6ZSkgICAgKygoYmJXb3JkU2l6ZSAtIDEpIC8KKyAqIGJiV29yZFNpemUpKSovCiAKIHN0cnVjdCBBQUNfRU5DIHsKKyAgQUFDRU5DX0NPTkZJRyAqY29uZmlnOwogCi0gIEFBQ0VOQ19DT05GSUcgICAgKmNvbmZpZzsKKyAgSU5UIGFuY2lsbGFyeUJpdHNQZXJGcmFtZTsgLyogYW5jaWxsYXJ5IGJpdHMgcGVyIGZyYW1lIGNhbGN1bGF0ZWQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnkgcmF0ZSAqLwogCi0gIElOVCAgICAgICAgICAgICAgIGFuY2lsbGFyeUJpdHNQZXJGcmFtZTsgICAgICAgICAgICAgIC8qIGFuY2lsbGFyeSBiaXRzIHBlciBmcmFtZSBjYWxjdWxhdGVkIGZyb20gYW5jaWxsYXJ5IHJhdGUgKi8KKyAgQ0hBTk5FTF9NQVBQSU5HIGNoYW5uZWxNYXBwaW5nOwogCi0gIENIQU5ORUxfTUFQUElORyAgIGNoYW5uZWxNYXBwaW5nOworICBRQ19TVEFURSAqcWNLZXJuZWw7CisgIFFDX09VVCAqcWNPdXRbKDEpXTsKIAotICBRQ19TVEFURSAgICAgICAgICpxY0tlcm5lbDsKLSAgUUNfT1VUICAgICAgICAgICAqcWNPdXRbKDEpXTsKLQotICBQU1lfT1VUICAgICAgICAgICpwc3lPdXRbKDEpXTsKLSAgUFNZX0lOVEVSTkFMICAgICAqcHN5S2VybmVsOworICBQU1lfT1VUICpwc3lPdXRbKDEpXTsKKyAgUFNZX0lOVEVSTkFMICpwc3lLZXJuZWw7CiAKICAgLyogbGlmZXRpbWUgdmFycyAqLwogCkBAIC0xNDAsNTAgKzE1NSw2MSBAQAogICBJTlQgYmFuZHdpZHRoOTBkQjsKICAgQUFDRU5DX0JJVFJBVEVfTU9ERSBiaXRyYXRlTW9kZTsKIAotICBJTlQgICAgZG9udFdyaXRlQWRpZjsgICAgICAvKiB1c2U6IHdyaXRlIEFESUYgaGVhZGVyIG9ubHkgYmVmb3JlIDFzdCBmcmFtZSAqLworICBJTlQgZG9udFdyaXRlQWRpZjsgLyogdXNlOiB3cml0ZSBBRElGIGhlYWRlciBvbmx5IGJlZm9yZSAxc3QgZnJhbWUgKi8KIAotICBGSVhQX0RCTCAgKmR5bmFtaWNfUkFNOworICBGSVhQX0RCTCAqZHluYW1pY19SQU07CiAKLQotICBJTlQgbWF4Q2hhbm5lbHM7ICAgICAgICAgICAvKiB1c2VkIHdoaWxlIGFsbG9jYXRpb24gKi8KKyAgSU5UIG1heENoYW5uZWxzOyAvKiB1c2VkIHdoaWxlIGFsbG9jYXRpb24gKi8KICAgSU5UIG1heEVsZW1lbnRzOwogICBJTlQgbWF4RnJhbWVzOwogCi0gIEFVRElPX09CSkVDVF9UWVBFIGFvdDsgICAgLyogQU9UIHRvIGJlIHVzZWQgd2hpbGUgZW5jb2RpbmcuICAqLworICBBVURJT19PQkpFQ1RfVFlQRSBhb3Q7IC8qIEFPVCB0byBiZSB1c2VkIHdoaWxlIGVuY29kaW5nLiAgKi8KK307CiAKLX0gOworI2RlZmluZSBtYXhTaXplKGEsIGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKIAotI2RlZmluZSBtYXhTaXplKGEsYikgKCAoKGEpPihiKSkgPyAoYSkgOiAoYikgKQorI2RlZmluZSBCSVRfTE9PS19VUF9TSVpFIFwKKyAgKHNpemVvZihJTlQpICogKE1BWF9TRkJfTE9ORyAqIChDT0RFX0JPT0tfRVNDX05EWCArIDEpKSkKKyNkZWZpbmUgTUVSR0VfR0FJTl9MT09LX1VQX1NJWkUgKHNpemVvZihJTlQpICogTUFYX1NGQl9MT05HKQogCi0jZGVmaW5lIEJJVF9MT09LX1VQX1NJWkUgICAgICAgICAoIHNpemVvZihJTlQpKihNQVhfU0ZCX0xPTkcqKENPREVfQk9PS19FU0NfTkRYKzEpKSApCi0jZGVmaW5lIE1FUkdFX0dBSU5fTE9PS19VUF9TSVpFICAoIHNpemVvZihJTlQpKk1BWF9TRkJfTE9ORyApCi0KLQorLyogU2l6ZSBvZiBBaEZsYWcgYnVmZmVyIGluIGZ1bmN0aW9uIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKCkgKi8KKyNkZWZpbmUgQURKX1RIUl9BSF9GTEFHX1NJWkUgKHNpemVvZihVQ0hBUikgKiAoKDgpKSAqICgyKSAqIE1BWF9HUk9VUEVEX1NGQikKKy8qIFNpemUgb2YgVGhyRXhwIGJ1ZmZlciBpbiBmdW5jdGlvbiBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZSgpICovCisjZGVmaW5lIEFESl9USFJfVEhSX0VYUF9TSVpFIChzaXplb2YoRklYUF9EQkwpICogKCg4KSkgKiAoMikgKiBNQVhfR1JPVVBFRF9TRkIpCisvKiBTaXplIG9mIHNmYk5BY3RpdmVMaW5lc0xkRGF0YSBidWZmZXIgaW4gZnVuY3Rpb24gRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2goKSAqLworI2RlZmluZSBBREpfVEhSX0FDVF9MSU5fTERfREFUQV9TSVpFIFwKKyAgKHNpemVvZihGSVhQX0RCTCkgKiAoKDgpKSAqICgyKSAqIE1BWF9HUk9VUEVEX1NGQikKKy8qIFRvdGFsIGFtb3VudCBvZiBkeW5hbWljIGJ1ZmZlciBuZWVkZWQgaW4gYWRqdXN0IHRocmVzaG9sZHMgZnVuY3Rpb25hbGl0eSAqLworI2RlZmluZSBBREpfVEhSX1NJWkUgXAorICAoQURKX1RIUl9BSF9GTEFHX1NJWkUgKyBBREpfVEhSX1RIUl9FWFBfU0laRSArIEFESl9USFJfQUNUX0xJTl9MRF9EQVRBX1NJWkUpCiAKIC8qIER5bmFtaWMgUkFNIC0gQWxsb2NhdGlvbiAqLwogLyoKLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotIHwgICBQX0JVRl8wICAgfCAgICAgICAgIFBfQlVGXzEgICAgICAgICAgICB8Ci0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLSB8ICBRQ19PVVRfQ0ggIHwgICAgICAgICBQU1lfRFlOICAgICAgICAgICAgfAotICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi0gfCAgICAgICAgICAgICB8IEJpdExvb2tVcCtNZXJnZUdhaW5Mb29rVXAgIHwKLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotIHwgICAgICAgICAgICAgfCAgQml0c3RyZWFtIG91dHB1dCBidWZmZXIgICB8Ci0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworIHwgICBQX0JVRl8wICAgfCAgICAgICAgICAgICAgIFBfQlVGXzEgICAgICAgICAgICAgICB8CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyB8ICBRQ19PVVRfQ0ggIHwgICAgICAgICAgICAgICBQU1lfRFlOICAgICAgICAgICAgICAgfAorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgfCAgICAgICAgICAgICB8ICAgICAgIEJpdExvb2tVcCtNZXJnZUdhaW5Mb29rVXAgICAgIHwKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworIHwgICAgICAgICAgICAgfCBBSF9GTEFHIHwgVEhSX0VYUCB8IEFDVF9MSU5fTERfREFUQSB8CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyB8ICAgICAgICAgICAgIHwgICAgICAgQml0c3RyZWFtIG91dHB1dCBidWZmZXIgICAgICAgfAorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAqLwogCi0jZGVmaW5lIEJVRl9TSVpFXzAgICAgICAgKCBBTElHTl9TSVpFKHNpemVvZihRQ19PVVRfQ0hBTk5FTCkqKDgpKSApCi0jZGVmaW5lIEJVRl9TSVpFXzEgICAgICAgKCBBTElHTl9TSVpFKG1heFNpemUoc2l6ZW9mKFBTWV9EWU5BTUlDKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUX0xPT0tfVVBfU0laRStNRVJHRV9HQUlOX0xPT0tfVVBfU0laRSkpKSApCisjZGVmaW5lIEJVRl9TSVpFXzAgKEFMSUdOX1NJWkUoc2l6ZW9mKFFDX09VVF9DSEFOTkVMKSAqICg4KSkpCisjZGVmaW5lIEJVRl9TSVpFXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFMSUdOX1NJWkUobWF4U2l6ZShtYXhTaXplKHNpemVvZihQU1lfRFlOQU1JQyksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVF9MT09LX1VQX1NJWkUgKyBNRVJHRV9HQUlOX0xPT0tfVVBfU0laRSkpLCBcCisgICAgICAgICAgICAgICAgICAgICAgQURKX1RIUl9TSVpFKSkpCiAKLSNkZWZpbmUgUF9CVUZfMCAgICAgICAgICAoIDAgKQotI2RlZmluZSBQX0JVRl8xICAgICAgICAgICggUF9CVUZfMCArIEJVRl9TSVpFXzAgKQorI2RlZmluZSBQX0JVRl8wICgwKQorI2RlZmluZSBQX0JVRl8xIChQX0JVRl8wICsgQlVGX1NJWkVfMCkKIAotI2RlZmluZSBBQUNfRU5DX0RZTl9SQU1fU0laRSAgKCBCVUZfU0laRV8wICsgQlVGX1NJWkVfMSApCisjZGVmaW5lIEFBQ19FTkNfRFlOX1JBTV9TSVpFIChCVUZfU0laRV8wICsgQlVGX1NJWkVfMSkKIAotCi0gIEhfQUxMT0NfTUVNIChBQUNkeW5hbWljX1JBTSwgRklYUF9EQkwpCitIX0FMTE9DX01FTShBQUNkeW5hbWljX1JBTSwgRklYUF9EQkwpCiAvKgogICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIEVORCAtIER5bmFtaWMgUkFNIC0gQWxsb2NhdGlvbiAqLwpAQCAtMTkxLDM2ICsyMTcsMzMgQEAKIC8qCiAgIFNlZSBmdXJ0aGVyIE1lbW9yeSBBbGxvY2F0aW9uIGRldGFpbHMgaW4gYWFjRW5jX3JhbS5jcHAKICovCi0gIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX0FhY0VuY29kZXIsIEFBQ19FTkMpCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX0FhY0VuY29kZXIsIEFBQ19FTkMpCiAKLSAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfUHN5RWxlbWVudCwgUFNZX0VMRU1FTlQpCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX1BzeUVsZW1lbnQsIFBTWV9FTEVNRU5UKQogCi0gIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX1BzeUludGVybmFsLCBQU1lfSU5URVJOQUwpCi0gIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX1BzeVN0YXRpYywgUFNZX1NUQVRJQykKLSAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfUHN5SW5wdXRCdWZmZXIsIElOVF9QQ00pCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX1BzeUludGVybmFsLCBQU1lfSU5URVJOQUwpCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX1BzeVN0YXRpYywgUFNZX1NUQVRJQykKK0hfQUxMT0NfTUVNKFJhbV9hYWNFbmNfUHN5SW5wdXRCdWZmZXIsIElOVF9QQ00pCiAKLSAgUFNZX0RZTkFNSUMgKkdldFJhbV9hYWNFbmNfUHN5RHluYW1pYyAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7Ci0gIEhfQUxMT0NfTUVNIChSYW1fYnNPdXRidWZmZXIsIFVDSEFSKQorUFNZX0RZTkFNSUMgKkdldFJhbV9hYWNFbmNfUHN5RHluYW1pYyhpbnQgbiwgVUNIQVIgKmR5bmFtaWNfUkFNKTsKIAotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19Qc3lPdXRDaGFubmVsLCBQU1lfT1VUX0NIQU5ORUwpCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX1BzeU91dENoYW5uZWwsIFBTWV9PVVRfQ0hBTk5FTCkKIAotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19Qc3lPdXQsIFBTWV9PVVQpCi0gIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX1BzeU91dEVsZW1lbnRzLCBQU1lfT1VUX0VMRU1FTlQpCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX1BzeU91dCwgUFNZX09VVCkKK0hfQUxMT0NfTUVNKFJhbV9hYWNFbmNfUHN5T3V0RWxlbWVudHMsIFBTWV9PVVRfRUxFTUVOVCkKIAotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19RQ3N0YXRlLCBRQ19TVEFURSkKLSAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfQWRqdXN0VGhyZXNob2xkLCBBREpfVEhSX1NUQVRFKQorSF9BTExPQ19NRU0oUmFtX2FhY0VuY19RQ3N0YXRlLCBRQ19TVEFURSkKK0hfQUxMT0NfTUVNKFJhbV9hYWNFbmNfQWRqdXN0VGhyZXNob2xkLCBBREpfVEhSX1NUQVRFKQogCi0gIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX0FkalRoclN0YXRlRWxlbWVudCwgQVRTX0VMRU1FTlQpCi0gIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX0VsZW1lbnRCaXRzLCBFTEVNRU5UX0JJVFMpCi0gIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX0JpdENudHJTdGF0ZSwgQklUQ05UUl9TVEFURSkKK0hfQUxMT0NfTUVNKFJhbV9hYWNFbmNfQWRqVGhyU3RhdGVFbGVtZW50LCBBVFNfRUxFTUVOVCkKK0hfQUxMT0NfTUVNKFJhbV9hYWNFbmNfRWxlbWVudEJpdHMsIEVMRU1FTlRfQklUUykKK0hfQUxMT0NfTUVNKFJhbV9hYWNFbmNfQml0Q250clN0YXRlLCBCSVRDTlRSX1NUQVRFKQogCi0gIElOVCAqR2V0UmFtX2FhY0VuY19CaXRMb29rVXAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7Ci0gIElOVCAqR2V0UmFtX2FhY0VuY19NZXJnZUdhaW5Mb29rVXAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7Ci0gIFFDX09VVF9DSEFOTkVMICpHZXRSYW1fYWFjRW5jX1FDY2hhbm5lbCAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7CitJTlQgKkdldFJhbV9hYWNFbmNfQml0TG9va1VwKGludCBuLCBVQ0hBUiAqZHluYW1pY19SQU0pOworSU5UICpHZXRSYW1fYWFjRW5jX01lcmdlR2Fpbkxvb2tVcChpbnQgbiwgVUNIQVIgKmR5bmFtaWNfUkFNKTsKK1FDX09VVF9DSEFOTkVMICpHZXRSYW1fYWFjRW5jX1FDY2hhbm5lbChpbnQgbiwgVUNIQVIgKmR5bmFtaWNfUkFNKTsKIAotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19RQ291dCwgUUNfT1VUKQotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19RQ2VsZW1lbnQsIFFDX09VVF9FTEVNRU5UKQorSF9BTExPQ19NRU0oUmFtX2FhY0VuY19RQ291dCwgUUNfT1VUKQorSF9BTExPQ19NRU0oUmFtX2FhY0VuY19RQ2VsZW1lbnQsIFFDX09VVF9FTEVNRU5UKQogCi0KLSNlbmRpZiAvKiAjaWZuZGVmIEFBQ19FTkNfUkFNX0ggKi8KLQorI2VuZGlmIC8qICNpZm5kZWYgQUFDRU5DX1JBTV9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2FhY0VuY19yb20uY3BwIGIvbGliQUFDZW5jL3NyYy9hYWNFbmNfcm9tLmNwcAppbmRleCBjNjQ3N2UzLi5hYzBmYTlkIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2FhY0VuY19yb20uY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JvbS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNTc0ICs5MCw3MjMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcnM6ICAgICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgotICAgQ29udGVudHMvZGVzY3JpcHRpb246CisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImFhY0VuY19yb20uaCIKIAogLyoKICAgIEh1ZmZtYW4gVGFibGVzCiAqLwotY29uc3QgVUxPTkcgRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlszXVszXVszXVszXT0KLXsKLSAgewotICAgIHsgezB4MDAwYjAwMDksMHgwMDA5MDAwNywweDAwMGIwMDA5fSwgezB4MDAwYTAwMDgsMHgwMDA3MDAwNiwweDAwMGEwMDA4fSwgezB4MDAwYjAwMDksMHgwMDA5MDAwOCwweDAwMGIwMDA5fSB9LAotICAgIHsgezB4MDAwYTAwMDgsMHgwMDA3MDAwNiwweDAwMGEwMDA3fSwgezB4MDAwNzAwMDYsMHgwMDA1MDAwNSwweDAwMDcwMDA2fSwgezB4MDAwOTAwMDcsMHgwMDA3MDAwNiwweDAwMGEwMDA4fSB9LAotICAgIHsgezB4MDAwYjAwMDksMHgwMDA5MDAwNywweDAwMGIwMDA4fSwgezB4MDAwOTAwMDgsMHgwMDA3MDAwNiwweDAwMDkwMDA4fSwgezB4MDAwYjAwMDksMHgwMDA5MDAwNywweDAwMGIwMDA5fSB9Ci0gIH0sCi0gIHsKLSAgICB7IHsweDAwMDkwMDA4LDB4MDAwNzAwMDYsMHgwMDA5MDAwN30sIHsweDAwMDcwMDA2LDB4MDAwNTAwMDUsMHgwMDA3MDAwNn0sIHsweDAwMDkwMDA3LDB4MDAwNzAwMDYsMHgwMDA5MDAwOH0gfSwKLSAgICB7IHsweDAwMDcwMDA2LDB4MDAwNTAwMDUsMHgwMDA3MDAwNn0sIHsweDAwMDUwMDA1LDB4MDAwMTAwMDMsMHgwMDA1MDAwNX0sIHsweDAwMDcwMDA2LDB4MDAwNTAwMDUsMHgwMDA3MDAwNn0gfSwKLSAgICB7IHsweDAwMDkwMDA4LDB4MDAwNzAwMDYsMHgwMDA5MDAwN30sIHsweDAwMDcwMDA2LDB4MDAwNTAwMDUsMHgwMDA3MDAwNn0sIHsweDAwMDkwMDA4LDB4MDAwNzAwMDYsMHgwMDA5MDAwOH0gfQotICB9LAotICB7Ci0gICAgeyB7MHgwMDBiMDAwOSwweDAwMDkwMDA3LDB4MDAwYjAwMDl9LCB7MHgwMDA5MDAwOCwweDAwMDcwMDA2LDB4MDAwOTAwMDh9LCB7MHgwMDBiMDAwOCwweDAwMDkwMDA3LDB4MDAwYjAwMDl9IH0sCi0gICAgeyB7MHgwMDBhMDAwOCwweDAwMDcwMDA2LDB4MDAwOTAwMDd9LCB7MHgwMDA3MDAwNiwweDAwMDUwMDA0LDB4MDAwNzAwMDZ9LCB7MHgwMDA5MDAwOCwweDAwMDcwMDA2LDB4MDAwYTAwMDd9IH0sCi0gICAgeyB7MHgwMDBiMDAwOSwweDAwMDkwMDA3LDB4MDAwYjAwMDl9LCB7MHgwMDBhMDAwNywweDAwMDcwMDA2LDB4MDAwOTAwMDh9LCB7MHgwMDBiMDAwOSwweDAwMDkwMDA3LDB4MDAwYjAwMDl9IH0KLSAgfQotfTsKK2NvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2x0YWIxXzJbM11bM11bM11bM10gPSB7CisgICAge3t7MHgwMDBiMDAwOSwgMHgwMDA5MDAwNywgMHgwMDBiMDAwOX0sCisgICAgICB7MHgwMDBhMDAwOCwgMHgwMDA3MDAwNiwgMHgwMDBhMDAwOH0sCisgICAgICB7MHgwMDBiMDAwOSwgMHgwMDA5MDAwOCwgMHgwMDBiMDAwOX19LAorICAgICB7ezB4MDAwYTAwMDgsIDB4MDAwNzAwMDYsIDB4MDAwYTAwMDd9LAorICAgICAgezB4MDAwNzAwMDYsIDB4MDAwNTAwMDUsIDB4MDAwNzAwMDZ9LAorICAgICAgezB4MDAwOTAwMDcsIDB4MDAwNzAwMDYsIDB4MDAwYTAwMDh9fSwKKyAgICAge3sweDAwMGIwMDA5LCAweDAwMDkwMDA3LCAweDAwMGIwMDA4fSwKKyAgICAgIHsweDAwMDkwMDA4LCAweDAwMDcwMDA2LCAweDAwMDkwMDA4fSwKKyAgICAgIHsweDAwMGIwMDA5LCAweDAwMDkwMDA3LCAweDAwMGIwMDA5fX19LAorICAgIHt7ezB4MDAwOTAwMDgsIDB4MDAwNzAwMDYsIDB4MDAwOTAwMDd9LAorICAgICAgezB4MDAwNzAwMDYsIDB4MDAwNTAwMDUsIDB4MDAwNzAwMDZ9LAorICAgICAgezB4MDAwOTAwMDcsIDB4MDAwNzAwMDYsIDB4MDAwOTAwMDh9fSwKKyAgICAge3sweDAwMDcwMDA2LCAweDAwMDUwMDA1LCAweDAwMDcwMDA2fSwKKyAgICAgIHsweDAwMDUwMDA1LCAweDAwMDEwMDAzLCAweDAwMDUwMDA1fSwKKyAgICAgIHsweDAwMDcwMDA2LCAweDAwMDUwMDA1LCAweDAwMDcwMDA2fX0sCisgICAgIHt7MHgwMDA5MDAwOCwgMHgwMDA3MDAwNiwgMHgwMDA5MDAwN30sCisgICAgICB7MHgwMDA3MDAwNiwgMHgwMDA1MDAwNSwgMHgwMDA3MDAwNn0sCisgICAgICB7MHgwMDA5MDAwOCwgMHgwMDA3MDAwNiwgMHgwMDA5MDAwOH19fSwKKyAgICB7e3sweDAwMGIwMDA5LCAweDAwMDkwMDA3LCAweDAwMGIwMDA5fSwKKyAgICAgIHsweDAwMDkwMDA4LCAweDAwMDcwMDA2LCAweDAwMDkwMDA4fSwKKyAgICAgIHsweDAwMGIwMDA4LCAweDAwMDkwMDA3LCAweDAwMGIwMDA5fX0sCisgICAgIHt7MHgwMDBhMDAwOCwgMHgwMDA3MDAwNiwgMHgwMDA5MDAwN30sCisgICAgICB7MHgwMDA3MDAwNiwgMHgwMDA1MDAwNCwgMHgwMDA3MDAwNn0sCisgICAgICB7MHgwMDA5MDAwOCwgMHgwMDA3MDAwNiwgMHgwMDBhMDAwN319LAorICAgICB7ezB4MDAwYjAwMDksIDB4MDAwOTAwMDcsIDB4MDAwYjAwMDl9LAorICAgICAgezB4MDAwYTAwMDcsIDB4MDAwNzAwMDYsIDB4MDAwOTAwMDh9LAorICAgICAgezB4MDAwYjAwMDksIDB4MDAwOTAwMDcsIDB4MDAwYjAwMDl9fX19OwogCitjb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9sdGFiM180WzNdWzNdWzNdWzNdID0geworICAgIHt7ezB4MDAwMTAwMDQsIDB4MDAwNDAwMDUsIDB4MDAwODAwMDh9LAorICAgICAgezB4MDAwNDAwMDUsIDB4MDAwNTAwMDQsIDB4MDAwODAwMDh9LAorICAgICAgezB4MDAwOTAwMDksIDB4MDAwOTAwMDgsIDB4MDAwYTAwMGJ9fSwKKyAgICAge3sweDAwMDQwMDA1LCAweDAwMDYwMDA1LCAweDAwMDkwMDA4fSwKKyAgICAgIHsweDAwMDYwMDA1LCAweDAwMDYwMDA0LCAweDAwMDkwMDA4fSwKKyAgICAgIHsweDAwMDkwMDA4LCAweDAwMDkwMDA3LCAweDAwMGEwMDBhfX0sCisgICAgIHt7MHgwMDA5MDAwOSwgMHgwMDBhMDAwOCwgMHgwMDBkMDAwYn0sCisgICAgICB7MHgwMDA5MDAwOCwgMHgwMDA5MDAwOCwgMHgwMDBiMDAwYX0sCisgICAgICB7MHgwMDBiMDAwYiwgMHgwMDBhMDAwYSwgMHgwMDBjMDAwYn19fSwKKyAgICB7e3sweDAwMDQwMDA0LCAweDAwMDYwMDA1LCAweDAwMGEwMDA4fSwKKyAgICAgIHsweDAwMDYwMDA0LCAweDAwMDcwMDA0LCAweDAwMGEwMDA4fSwKKyAgICAgIHsweDAwMGEwMDA4LCAweDAwMGEwMDA4LCAweDAwMGMwMDBhfX0sCisgICAgIHt7MHgwMDA1MDAwNCwgMHgwMDA3MDAwNCwgMHgwMDBiMDAwOH0sCisgICAgICB7MHgwMDA2MDAwNCwgMHgwMDA3MDAwNCwgMHgwMDBhMDAwN30sCisgICAgICB7MHgwMDA5MDAwOCwgMHgwMDA5MDAwNywgMHgwMDBiMDAwOX19LAorICAgICB7ezB4MDAwOTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwZDAwMGF9LAorICAgICAgezB4MDAwODAwMDcsIDB4MDAwOTAwMDcsIDB4MDAwYzAwMDl9LAorICAgICAgezB4MDAwYTAwMGEsIDB4MDAwYjAwMDksIDB4MDAwYzAwMGF9fX0sCisgICAge3t7MHgwMDA4MDAwOCwgMHgwMDBhMDAwOCwgMHgwMDBmMDAwYn0sCisgICAgICB7MHgwMDA5MDAwOCwgMHgwMDBiMDAwNywgMHgwMDBmMDAwYX0sCisgICAgICB7MHgwMDBkMDAwYiwgMHgwMDBlMDAwYSwgMHgwMDEwMDAwY319LAorICAgICB7ezB4MDAwODAwMDgsIDB4MDAwYTAwMDcsIDB4MDAwZTAwMGF9LAorICAgICAgezB4MDAwOTAwMDcsIDB4MDAwYTAwMDcsIDB4MDAwZTAwMDl9LAorICAgICAgezB4MDAwYzAwMGEsIDB4MDAwYzAwMDksIDB4MDAwZjAwMGJ9fSwKKyAgICAge3sweDAwMGIwMDBiLCAweDAwMGMwMDBhLCAweDAwMTAwMDBjfSwKKyAgICAgIHsweDAwMGEwMDBhLCAweDAwMGIwMDA5LCAweDAwMGYwMDBifSwKKyAgICAgIHsweDAwMGMwMDBiLCAweDAwMGMwMDBhLCAweDAwMGYwMDBifX19fTsKIAotY29uc3QgVUxPTkcgRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFszXVszXVszXVszXT0KLXsKLSAgewotICAgIHsgezB4MDAwMTAwMDQsMHgwMDA0MDAwNSwweDAwMDgwMDA4fSwgezB4MDAwNDAwMDUsMHgwMDA1MDAwNCwweDAwMDgwMDA4fSwgezB4MDAwOTAwMDksMHgwMDA5MDAwOCwweDAwMGEwMDBifSB9LAotICAgIHsgezB4MDAwNDAwMDUsMHgwMDA2MDAwNSwweDAwMDkwMDA4fSwgezB4MDAwNjAwMDUsMHgwMDA2MDAwNCwweDAwMDkwMDA4fSwgezB4MDAwOTAwMDgsMHgwMDA5MDAwNywweDAwMGEwMDBhfSB9LAotICAgIHsgezB4MDAwOTAwMDksMHgwMDBhMDAwOCwweDAwMGQwMDBifSwgezB4MDAwOTAwMDgsMHgwMDA5MDAwOCwweDAwMGIwMDBhfSwgezB4MDAwYjAwMGIsMHgwMDBhMDAwYSwweDAwMGMwMDBifSB9Ci0gIH0sCi0gIHsKLSAgICB7IHsweDAwMDQwMDA0LDB4MDAwNjAwMDUsMHgwMDBhMDAwOH0sIHsweDAwMDYwMDA0LDB4MDAwNzAwMDQsMHgwMDBhMDAwOH0sIHsweDAwMGEwMDA4LDB4MDAwYTAwMDgsMHgwMDBjMDAwYX0gfSwKLSAgICB7IHsweDAwMDUwMDA0LDB4MDAwNzAwMDQsMHgwMDBiMDAwOH0sIHsweDAwMDYwMDA0LDB4MDAwNzAwMDQsMHgwMDBhMDAwN30sIHsweDAwMDkwMDA4LDB4MDAwOTAwMDcsMHgwMDBiMDAwOX0gfSwKLSAgICB7IHsweDAwMDkwMDA4LDB4MDAwYTAwMDgsMHgwMDBkMDAwYX0sIHsweDAwMDgwMDA3LDB4MDAwOTAwMDcsMHgwMDBjMDAwOX0sIHsweDAwMGEwMDBhLDB4MDAwYjAwMDksMHgwMDBjMDAwYX0gfQotICB9LAotICB7Ci0gICAgeyB7MHgwMDA4MDAwOCwweDAwMGEwMDA4LDB4MDAwZjAwMGJ9LCB7MHgwMDA5MDAwOCwweDAwMGIwMDA3LDB4MDAwZjAwMGF9LCB7MHgwMDBkMDAwYiwweDAwMGUwMDBhLDB4MDAxMDAwMGN9IH0sCi0gICAgeyB7MHgwMDA4MDAwOCwweDAwMGEwMDA3LDB4MDAwZTAwMGF9LCB7MHgwMDA5MDAwNywweDAwMGEwMDA3LDB4MDAwZTAwMDl9LCB7MHgwMDBjMDAwYSwweDAwMGMwMDA5LDB4MDAwZjAwMGJ9IH0sCi0gICAgeyB7MHgwMDBiMDAwYiwweDAwMGMwMDBhLDB4MDAxMDAwMGN9LCB7MHgwMDBhMDAwYSwweDAwMGIwMDA5LDB4MDAwZjAwMGJ9LCB7MHgwMDBjMDAwYiwweDAwMGMwMDBhLDB4MDAwZjAwMGJ9IH0KLSAgfQotfTsKK2NvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2x0YWI1XzZbOV1bOV0gPSB7CisgICAgezB4MDAwZDAwMGIsIDB4MDAwYzAwMGEsIDB4MDAwYjAwMDksIDB4MDAwYjAwMDksIDB4MDAwYTAwMDksIDB4MDAwYjAwMDksCisgICAgIDB4MDAwYjAwMDksIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGJ9LAorICAgIHsweDAwMGMwMDBhLCAweDAwMGIwMDA5LCAweDAwMGEwMDA4LCAweDAwMDkwMDA3LCAweDAwMDgwMDA3LCAweDAwMDkwMDA3LAorICAgICAweDAwMGEwMDA4LCAweDAwMGIwMDA5LCAweDAwMGMwMDBhfSwKKyAgICB7MHgwMDBjMDAwOSwgMHgwMDBhMDAwOCwgMHgwMDA5MDAwNiwgMHgwMDA4MDAwNiwgMHgwMDA3MDAwNiwgMHgwMDA4MDAwNiwKKyAgICAgMHgwMDA5MDAwNiwgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOX0sCisgICAgezB4MDAwYjAwMDksIDB4MDAwOTAwMDcsIDB4MDAwODAwMDYsIDB4MDAwNTAwMDQsIDB4MDAwNDAwMDQsIDB4MDAwNTAwMDQsCisgICAgIDB4MDAwODAwMDYsIDB4MDAwOTAwMDcsIDB4MDAwYjAwMDl9LAorICAgIHsweDAwMGEwMDA5LCAweDAwMDgwMDA3LCAweDAwMDcwMDA2LCAweDAwMDQwMDA0LCAweDAwMDEwMDA0LCAweDAwMDQwMDA0LAorICAgICAweDAwMDcwMDA2LCAweDAwMDgwMDA3LCAweDAwMGIwMDA5fSwKKyAgICB7MHgwMDBiMDAwOSwgMHgwMDA5MDAwNywgMHgwMDA4MDAwNiwgMHgwMDA1MDAwNCwgMHgwMDA0MDAwNCwgMHgwMDA1MDAwNCwKKyAgICAgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNywgMHgwMDBiMDAwOX0sCisgICAgezB4MDAwYjAwMDksIDB4MDAwYTAwMDgsIDB4MDAwOTAwMDYsIDB4MDAwODAwMDYsIDB4MDAwNzAwMDYsIDB4MDAwODAwMDYsCisgICAgIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDl9LAorICAgIHsweDAwMGMwMDBhLCAweDAwMGIwMDA5LCAweDAwMGEwMDA4LCAweDAwMDkwMDA3LCAweDAwMDgwMDA3LCAweDAwMDkwMDA3LAorICAgICAweDAwMGEwMDA3LCAweDAwMGIwMDA4LCAweDAwMGMwMDBhfSwKKyAgICB7MHgwMDBkMDAwYiwgMHgwMDBjMDAwYSwgMHgwMDBjMDAwOSwgMHgwMDBiMDAwOSwgMHgwMDBhMDAwOSwgMHgwMDBhMDAwOSwKKyAgICAgMHgwMDBiMDAwOSwgMHgwMDBjMDAwYSwgMHgwMDBkMDAwYn19OwogCi1jb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9sdGFiNV82WzldWzldPQotewotICB7MHgwMDBkMDAwYiwgMHgwMDBjMDAwYSwgMHgwMDBiMDAwOSwgMHgwMDBiMDAwOSwgMHgwMDBhMDAwOSwgMHgwMDBiMDAwOSwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwYSwgMHgwMDBkMDAwYn0sCi0gIHsweDAwMGMwMDBhLCAweDAwMGIwMDA5LCAweDAwMGEwMDA4LCAweDAwMDkwMDA3LCAweDAwMDgwMDA3LCAweDAwMDkwMDA3LCAweDAwMGEwMDA4LCAweDAwMGIwMDA5LCAweDAwMGMwMDBhfSwKLSAgezB4MDAwYzAwMDksIDB4MDAwYTAwMDgsIDB4MDAwOTAwMDYsIDB4MDAwODAwMDYsIDB4MDAwNzAwMDYsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDl9LAotICB7MHgwMDBiMDAwOSwgMHgwMDA5MDAwNywgMHgwMDA4MDAwNiwgMHgwMDA1MDAwNCwgMHgwMDA0MDAwNCwgMHgwMDA1MDAwNCwgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNywgMHgwMDBiMDAwOX0sCi0gIHsweDAwMGEwMDA5LCAweDAwMDgwMDA3LCAweDAwMDcwMDA2LCAweDAwMDQwMDA0LCAweDAwMDEwMDA0LCAweDAwMDQwMDA0LCAweDAwMDcwMDA2LCAweDAwMDgwMDA3LCAweDAwMGIwMDA5fSwKLSAgezB4MDAwYjAwMDksIDB4MDAwOTAwMDcsIDB4MDAwODAwMDYsIDB4MDAwNTAwMDQsIDB4MDAwNDAwMDQsIDB4MDAwNTAwMDQsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDcsIDB4MDAwYjAwMDl9LAotICB7MHgwMDBiMDAwOSwgMHgwMDBhMDAwOCwgMHgwMDA5MDAwNiwgMHgwMDA4MDAwNiwgMHgwMDA3MDAwNiwgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNiwgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOX0sCi0gIHsweDAwMGMwMDBhLCAweDAwMGIwMDA5LCAweDAwMGEwMDA4LCAweDAwMDkwMDA3LCAweDAwMDgwMDA3LCAweDAwMDkwMDA3LCAweDAwMGEwMDA3LCAweDAwMGIwMDA4LCAweDAwMGMwMDBhfSwKLSAgezB4MDAwZDAwMGIsIDB4MDAwYzAwMGEsIDB4MDAwYzAwMDksIDB4MDAwYjAwMDksIDB4MDAwYTAwMDksIDB4MDAwYTAwMDksIDB4MDAwYjAwMDksIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGJ9Ci19OworY29uc3QgVUxPTkcgRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFs4XVs4XSA9IHsKKyAgICB7MHgwMDAxMDAwNSwgMHgwMDAzMDAwNCwgMHgwMDA2MDAwNSwgMHgwMDA3MDAwNiwgMHgwMDA4MDAwNywgMHgwMDA5MDAwOCwKKyAgICAgMHgwMDBhMDAwOSwgMHgwMDBiMDAwYX0sCisgICAgezB4MDAwMzAwMDQsIDB4MDAwNDAwMDMsIDB4MDAwNjAwMDQsIDB4MDAwNzAwMDUsIDB4MDAwODAwMDYsIDB4MDAwODAwMDcsCisgICAgIDB4MDAwOTAwMDcsIDB4MDAwOTAwMDh9LAorICAgIHsweDAwMDYwMDA1LCAweDAwMDYwMDA0LCAweDAwMDcwMDA0LCAweDAwMDgwMDA1LCAweDAwMDgwMDA2LCAweDAwMDkwMDA3LAorICAgICAweDAwMDkwMDA3LCAweDAwMGEwMDA4fSwKKyAgICB7MHgwMDA3MDAwNiwgMHgwMDA3MDAwNSwgMHgwMDA4MDAwNSwgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNiwgMHgwMDA5MDAwNywKKyAgICAgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOH0sCisgICAgezB4MDAwODAwMDcsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDcsIDB4MDAwYTAwMDcsCisgICAgIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDl9LAorICAgIHsweDAwMDkwMDA4LCAweDAwMDgwMDA3LCAweDAwMDkwMDA2LCAweDAwMDkwMDA3LCAweDAwMGEwMDA3LCAweDAwMGEwMDA4LAorICAgICAweDAwMGIwMDA4LCAweDAwMGIwMDBhfSwKKyAgICB7MHgwMDBhMDAwOSwgMHgwMDA5MDAwNywgMHgwMDA5MDAwNywgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOCwKKyAgICAgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOX0sCisgICAgezB4MDAwYjAwMGEsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDksIDB4MDAwYjAwMDksCisgICAgIDB4MDAwYzAwMDksIDB4MDAwYzAwMGF9fTsKIAotY29uc3QgVUxPTkcgRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFs4XVs4XT0KLXsKLSAgezB4MDAwMTAwMDUsIDB4MDAwMzAwMDQsIDB4MDAwNjAwMDUsIDB4MDAwNzAwMDYsIDB4MDAwODAwMDcsIDB4MDAwOTAwMDgsIDB4MDAwYTAwMDksIDB4MDAwYjAwMGF9LAotICB7MHgwMDAzMDAwNCwgMHgwMDA0MDAwMywgMHgwMDA2MDAwNCwgMHgwMDA3MDAwNSwgMHgwMDA4MDAwNiwgMHgwMDA4MDAwNywgMHgwMDA5MDAwNywgMHgwMDA5MDAwOH0sCi0gIHsweDAwMDYwMDA1LCAweDAwMDYwMDA0LCAweDAwMDcwMDA0LCAweDAwMDgwMDA1LCAweDAwMDgwMDA2LCAweDAwMDkwMDA3LCAweDAwMDkwMDA3LCAweDAwMGEwMDA4fSwKLSAgezB4MDAwNzAwMDYsIDB4MDAwNzAwMDUsIDB4MDAwODAwMDUsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwOTAwMDcsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDh9LAotICB7MHgwMDA4MDAwNywgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNiwgMHgwMDA5MDAwNiwgMHgwMDBhMDAwNywgMHgwMDBhMDAwNywgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOX0sCi0gIHsweDAwMDkwMDA4LCAweDAwMDgwMDA3LCAweDAwMDkwMDA2LCAweDAwMDkwMDA3LCAweDAwMGEwMDA3LCAweDAwMGEwMDA4LCAweDAwMGIwMDA4LCAweDAwMGIwMDBhfSwKLSAgezB4MDAwYTAwMDksIDB4MDAwOTAwMDcsIDB4MDAwOTAwMDcsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYzAwMDksIDB4MDAwYzAwMDl9LAotICB7MHgwMDBiMDAwYSwgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOSwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYX0KLX07Citjb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9sdGFiOV8xMFsxM11bMTNdID0geworICAgIHsweDAwMDEwMDA2LCAweDAwMDMwMDA1LCAweDAwMDYwMDA2LCAweDAwMDgwMDA2LCAweDAwMDkwMDA3LCAweDAwMGEwMDA4LAorICAgICAweDAwMGEwMDA5LCAweDAwMGIwMDBhLCAweDAwMGIwMDBhLCAweDAwMGMwMDBhLCAweDAwMGMwMDBiLCAweDAwMGQwMDBiLAorICAgICAweDAwMGQwMDBjfSwKKyAgICB7MHgwMDAzMDAwNSwgMHgwMDA0MDAwNCwgMHgwMDA2MDAwNCwgMHgwMDA3MDAwNSwgMHgwMDA4MDAwNiwgMHgwMDA4MDAwNywKKyAgICAgMHgwMDA5MDAwNywgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOSwgMHgwMDBiMDAwYSwgMHgwMDBjMDAwYSwKKyAgICAgMHgwMDBjMDAwYn0sCisgICAgezB4MDAwNjAwMDYsIDB4MDAwNjAwMDQsIDB4MDAwNzAwMDUsIDB4MDAwODAwMDUsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsCisgICAgIDB4MDAwYTAwMDcsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsCisgICAgIDB4MDAwYzAwMGF9LAorICAgIHsweDAwMDgwMDA2LCAweDAwMDcwMDA1LCAweDAwMDgwMDA1LCAweDAwMDkwMDA1LCAweDAwMDkwMDA2LCAweDAwMGEwMDA3LAorICAgICAweDAwMGEwMDA3LCAweDAwMGIwMDA4LCAweDAwMGIwMDA4LCAweDAwMGIwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDBhLAorICAgICAweDAwMGQwMDBhfSwKKyAgICB7MHgwMDA5MDAwNywgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNiwgMHgwMDA5MDAwNiwgMHgwMDBhMDAwNiwgMHgwMDBhMDAwNywKKyAgICAgMHgwMDBiMDAwNywgMHgwMDBiMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYSwKKyAgICAgMHgwMDBkMDAwYX0sCisgICAgezB4MDAwYTAwMDgsIDB4MDAwOTAwMDcsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDcsIDB4MDAwYjAwMDcsIDB4MDAwYjAwMDcsCisgICAgIDB4MDAwYjAwMDgsIDB4MDAwYzAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGEsCisgICAgIDB4MDAwZDAwMGJ9LAorICAgIHsweDAwMGIwMDA5LCAweDAwMDkwMDA3LCAweDAwMGEwMDA3LCAweDAwMGIwMDA3LCAweDAwMGIwMDA3LCAweDAwMGIwMDA4LAorICAgICAweDAwMGMwMDA4LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5LCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLAorICAgICAweDAwMGQwMDBifSwKKyAgICB7MHgwMDBiMDAwOSwgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBjMDAwOCwKKyAgICAgMHgwMDBjMDAwOSwgMHgwMDBkMDAwOSwgMHgwMDBkMDAwOSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYiwKKyAgICAgMHgwMDBkMDAwYn0sCisgICAgezB4MDAwYjAwMDksIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYjAwMDgsCisgICAgIDB4MDAwYzAwMDksIDB4MDAwYzAwMDksIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZTAwMGEsIDB4MDAwZDAwMGIsCisgICAgIDB4MDAwZTAwMGJ9LAorICAgIHsweDAwMGIwMDBhLCAweDAwMGEwMDA5LCAweDAwMGIwMDA5LCAweDAwMGIwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5LAorICAgICAweDAwMGMwMDA5LCAweDAwMGMwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGUwMDBiLCAweDAwMGUwMDBiLAorICAgICAweDAwMGUwMDBjfSwKKyAgICB7MHgwMDBjMDAwYSwgMHgwMDBiMDAwOSwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYSwKKyAgICAgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBlMDAwYiwgMHgwMDBlMDAwYiwgMHgwMDBlMDAwYiwKKyAgICAgMHgwMDBmMDAwY30sCisgICAgezB4MDAwYzAwMGIsIDB4MDAwYjAwMGEsIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGEsCisgICAgIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGIsIDB4MDAwZTAwMGIsIDB4MDAwZTAwMGIsIDB4MDAwZjAwMGIsCisgICAgIDB4MDAwZjAwMGN9LAorICAgIHsweDAwMGQwMDBiLCAweDAwMGMwMDBhLCAweDAwMGMwMDBhLCAweDAwMGMwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLAorICAgICAweDAwMGQwMDBhLCAweDAwMGQwMDBiLCAweDAwMGUwMDBiLCAweDAwMGUwMDBjLCAweDAwMGUwMDBjLCAweDAwMGUwMDBjLAorICAgICAweDAwMGYwMDBjfX07CiAKLWNvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2x0YWI5XzEwWzEzXVsxM109Ci17Ci0gIHsweDAwMDEwMDA2LCAweDAwMDMwMDA1LCAweDAwMDYwMDA2LCAweDAwMDgwMDA2LCAweDAwMDkwMDA3LCAweDAwMGEwMDA4LCAweDAwMGEwMDA5LCAweDAwMGIwMDBhLCAweDAwMGIwMDBhLCAweDAwMGMwMDBhLCAweDAwMGMwMDBiLCAweDAwMGQwMDBiLCAweDAwMGQwMDBjfSwKLSAgezB4MDAwMzAwMDUsIDB4MDAwNDAwMDQsIDB4MDAwNjAwMDQsIDB4MDAwNzAwMDUsIDB4MDAwODAwMDYsIDB4MDAwODAwMDcsIDB4MDAwOTAwMDcsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDksIDB4MDAwYjAwMGEsIDB4MDAwYzAwMGEsIDB4MDAwYzAwMGJ9LAotICB7MHgwMDA2MDAwNiwgMHgwMDA2MDAwNCwgMHgwMDA3MDAwNSwgMHgwMDA4MDAwNSwgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNiwgMHgwMDBhMDAwNywgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYSwgMHgwMDBjMDAwYX0sCi0gIHsweDAwMDgwMDA2LCAweDAwMDcwMDA1LCAweDAwMDgwMDA1LCAweDAwMDkwMDA1LCAweDAwMDkwMDA2LCAweDAwMGEwMDA3LCAweDAwMGEwMDA3LCAweDAwMGIwMDA4LCAweDAwMGIwMDA4LCAweDAwMGIwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDBhLCAweDAwMGQwMDBhfSwKLSAgezB4MDAwOTAwMDcsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDYsIDB4MDAwYTAwMDcsIDB4MDAwYjAwMDcsIDB4MDAwYjAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYzAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGF9LAotICB7MHgwMDBhMDAwOCwgMHgwMDA5MDAwNywgMHgwMDA5MDAwNiwgMHgwMDBhMDAwNywgMHgwMDBiMDAwNywgMHgwMDBiMDAwNywgMHgwMDBiMDAwOCwgMHgwMDBjMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYn0sCi0gIHsweDAwMGIwMDA5LCAweDAwMDkwMDA3LCAweDAwMGEwMDA3LCAweDAwMGIwMDA3LCAweDAwMGIwMDA3LCAweDAwMGIwMDA4LCAweDAwMGMwMDA4LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5LCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBifSwKLSAgezB4MDAwYjAwMDksIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYzAwMDgsIDB4MDAwYzAwMDksIDB4MDAwZDAwMDksIDB4MDAwZDAwMDksIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGIsIDB4MDAwZDAwMGJ9LAotICB7MHgwMDBiMDAwOSwgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBlMDAwYSwgMHgwMDBkMDAwYiwgMHgwMDBlMDAwYn0sCi0gIHsweDAwMGIwMDBhLCAweDAwMGEwMDA5LCAweDAwMGIwMDA5LCAweDAwMGIwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGUwMDBiLCAweDAwMGUwMDBiLCAweDAwMGUwMDBjfSwKLSAgezB4MDAwYzAwMGEsIDB4MDAwYjAwMDksIDB4MDAwYjAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZTAwMGIsIDB4MDAwZTAwMGIsIDB4MDAwZTAwMGIsIDB4MDAwZjAwMGN9LAotICB7MHgwMDBjMDAwYiwgMHgwMDBiMDAwYSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYSwgMHgwMDBjMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYiwgMHgwMDBlMDAwYiwgMHgwMDBlMDAwYiwgMHgwMDBmMDAwYiwgMHgwMDBmMDAwY30sCi0gIHsweDAwMGQwMDBiLCAweDAwMGMwMDBhLCAweDAwMGMwMDBhLCAweDAwMGMwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBiLCAweDAwMGUwMDBiLCAweDAwMGUwMDBjLCAweDAwMGUwMDBjLCAweDAwMGUwMDBjLCAweDAwMGYwMDBjfQotfTsKK2NvbnN0IFVDSEFSIEZES2FhY0VuY19odWZmX2x0YWIxMVsxN11bMTddID0geworICAgIHsweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA4LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLAorICAgICAweDBjLCAweDBiLCAweDBjLCAweDBjLCAweDBhfSwKKyAgICB7MHgwNSwgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwKKyAgICAgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwOH0sCisgICAgezB4MDYsIDB4MDUsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksCisgICAgIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDh9LAorICAgIHsweDA3LCAweDA2LCAweDA2LCAweDA2LCAweDA3LCAweDA3LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LAorICAgICAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDA4fSwKKyAgICB7MHgwOCwgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwKKyAgICAgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOH0sCisgICAgezB4MDgsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksIDB4MDksCisgICAgIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDh9LAorICAgIHsweDA5LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LCAweDBhLAorICAgICAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDA4fSwKKyAgICB7MHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwKKyAgICAgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOH0sCisgICAgezB4MGEsIDB4MDksIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsCisgICAgIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MDh9LAorICAgIHsweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLAorICAgICAweDBhLCAweDBhLCAweDBiLCAweDBiLCAweDA4fSwKKyAgICB7MHgwYiwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwKKyAgICAgMHgwYiwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwOH0sCisgICAgezB4MGIsIDB4MGEsIDB4MDksIDB4MDksIDB4MGEsIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsCisgICAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MDh9LAorICAgIHsweDBiLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLAorICAgICAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDA5fSwKKyAgICB7MHgwYiwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwKKyAgICAgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwOX0sCisgICAgezB4MGIsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsCisgICAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MDl9LAorICAgIHsweDBjLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLCAweDBiLCAweDBiLAorICAgICAweDBiLCAweDBiLCAweDBjLCAweDBjLCAweDA5fSwKKyAgICB7MHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwKKyAgICAgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwNX19OwogCi1jb25zdCBVQ0hBUiBGREthYWNFbmNfaHVmZl9sdGFiMTFbMTddWzE3XT0KLXsKLSAgezB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsIDB4MGMsIDB4MGIsIDB4MGMsIDB4MGMsIDB4MGF9LAotICB7MHgwNSwgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwOH0sCi0gIHsweDA2LCAweDA1LCAweDA1LCAweDA2LCAweDA3LCAweDA3LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDA4fSwKLSAgezB4MDcsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDh9LAotICB7MHgwOCwgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOH0sCi0gIHsweDA4LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDA4fSwKLSAgezB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDh9LAotICB7MHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOH0sCi0gIHsweDBhLCAweDA5LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDA4fSwKLSAgezB4MGEsIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsIDB4MDh9LAotICB7MHgwYiwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwOH0sCi0gIHsweDBiLCAweDBhLCAweDA5LCAweDA5LCAweDBhLCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDA4fSwKLSAgezB4MGIsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MDl9LAotICB7MHgwYiwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwOX0sCi0gIHsweDBiLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDA5fSwKLSAgezB4MGMsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGMsIDB4MGMsIDB4MDl9LAotICB7MHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwNX0KLX07Citjb25zdCBVQ0hBUiBGREthYWNFbmNfaHVmZl9sdGFic2NmWzEyMV0gPSB7CisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEyLCAweDEzLCAweDEyLAorICAgIDB4MTEsIDB4MTEsIDB4MTAsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MGYsIDB4MGYsIDB4MGUsCisgICAgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwYywgMHgwYywgMHgwYywgMHgwYiwKKyAgICAweDBjLCAweDBiLCAweDBhLCAweDBhLCAweDBhLCAweDA5LCAweDA5LCAweDA4LCAweDA4LCAweDA4LCAweDA3LAorICAgIDB4MDYsIDB4MDYsIDB4MDUsIDB4MDQsIDB4MDMsIDB4MDEsIDB4MDQsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDYsCisgICAgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwKKyAgICAweDBiLCAweDBiLCAweDBjLCAweDBjLCAweDBkLCAweDBkLCAweDBkLCAweDBlLCAweDBlLCAweDEwLCAweDBmLAorICAgIDB4MTAsIDB4MGYsIDB4MTIsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgICAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzfTsKIAotY29uc3QgVUNIQVIgRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZlsxMjFdPQotewotICAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAotICAweDEzLCAweDEzLCAweDEzLCAweDEyLCAweDEzLCAweDEyLCAweDExLCAweDExLCAweDEwLCAweDExLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDBmLCAweDBmLAotICAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBkLCAweDBkLCAweDBjLCAweDBjLCAweDBjLCAweDBiLCAweDBjLCAweDBiLCAweDBhLCAweDBhLAotICAweDBhLCAweDA5LCAweDA5LCAweDA4LCAweDA4LCAweDA4LCAweDA3LCAweDA2LCAweDA2LCAweDA1LCAweDA0LCAweDAzLCAweDAxLCAweDA0LCAweDA0LCAweDA1LAotICAweDA2LCAweDA2LCAweDA3LCAweDA3LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBjLAotICAweDBjLCAweDBkLCAweDBkLCAweDBkLCAweDBlLCAweDBlLCAweDEwLCAweDBmLCAweDEwLCAweDBmLCAweDEyLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAotICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAotICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzCi19OworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIxWzNdWzNdWzNdWzNdID0ge3t7ezB4MDdmOCwgMHgwMWYxLCAweDA3ZmR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDNmNSwgMHgwMDY4LCAweDAzZjB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDdmNywgMHgwMWVjLCAweDA3ZjV9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAzZjEsIDB4MDA3MiwgMHgwM2Y0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwNzQsIDB4MDAxMSwgMHgwMDc2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAxZWIsIDB4MDA2YywgMHgwM2Y2fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwN2ZjLCAweDAxZTEsIDB4MDdmMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMWYwLCAweDAwNjEsIDB4MDFmNn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwN2YyLCAweDAxZWEsIDB4MDdmYn19fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3sweDAxZjIsIDB4MDA2OSwgMHgwMWVkfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwNzcsIDB4MDAxNywgMHgwMDZmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAxZTYsIDB4MDA2NCwgMHgwMWU1fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwMDY3LCAweDAwMTUsIDB4MDA2Mn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDEyLCAweDAwMDAsIDB4MDAxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDY1LCAweDAwMTYsIDB4MDA2ZH19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDFlOSwgMHgwMDYzLCAweDAxZTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDA2YiwgMHgwMDEzLCAweDAwNzF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFlMywgMHgwMDcwLCAweDAxZjN9fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t7MHgwN2ZlLCAweDAxZTcsIDB4MDdmM30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMWVmLCAweDAwNjAsIDB4MDFlZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwN2YwLCAweDAxZTIsIDB4MDdmYX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDNmMywgMHgwMDZhLCAweDAxZTh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDA3NSwgMHgwMDEwLCAweDAwNzN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFmNCwgMHgwMDZlLCAweDAzZjd9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDA3ZjYsIDB4MDFlMCwgMHgwN2Y5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAzZjIsIDB4MDA2NiwgMHgwMWY1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDA3ZmYsIDB4MDFmNywgMHgwN2Y0fX19fTsKIAorY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIyWzNdWzNdWzNdWzNdID0ge3t7ezB4MDFmMywgMHgwMDZmLCAweDAxZmR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDBlYiwgMHgwMDIzLCAweDAwZWF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFmNywgMHgwMGU4LCAweDAxZmF9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAwZjIsIDB4MDAyZCwgMHgwMDcwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMjAsIDB4MDAwNiwgMHgwMDJifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwNmUsIDB4MDAyOCwgMHgwMGU5fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwMWY5LCAweDAwNjYsIDB4MDBmOH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMGU3LCAweDAwMWIsIDB4MDBmMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMWY0LCAweDAwNmIsIDB4MDFmNX19fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3sweDAwZWMsIDB4MDAyYSwgMHgwMDZjfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMmMsIDB4MDAwYSwgMHgwMDI3fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwNjcsIDB4MDAxYSwgMHgwMGY1fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwMDI0LCAweDAwMDgsIDB4MDAxZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDA5LCAweDAwMDAsIDB4MDAwN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDFkLCAweDAwMGIsIDB4MDAzMH19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDBlZiwgMHgwMDFjLCAweDAwNjR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAxZSwgMHgwMDBjLCAweDAwMjl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDBmMywgMHgwMDJmLCAweDAwZjB9fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t7MHgwMWZjLCAweDAwNzEsIDB4MDFmMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMGY0LCAweDAwMjEsIDB4MDBlNn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMGY3LCAweDAwNjgsIDB4MDFmOH19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDBlZSwgMHgwMDIyLCAweDAwNjV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAzMSwgMHgwMDAyLCAweDAwMjZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDBlZCwgMHgwMDI1LCAweDAwNmF9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAxZmIsIDB4MDA3MiwgMHgwMWZlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwNjksIDB4MDAyZSwgMHgwMGY2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAxZmYsIDB4MDA2ZCwgMHgwMWY2fX19fTsKIAotY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIxWzNdWzNdWzNdWzNdPQotewotICB7Ci0gICAgeyB7MHgwN2Y4LDB4MDFmMSwweDA3ZmR9LCB7MHgwM2Y1LDB4MDA2OCwweDAzZjB9LCB7MHgwN2Y3LDB4MDFlYywweDA3ZjV9IH0sCi0gICAgeyB7MHgwM2YxLDB4MDA3MiwweDAzZjR9LCB7MHgwMDc0LDB4MDAxMSwweDAwNzZ9LCB7MHgwMWViLDB4MDA2YywweDAzZjZ9IH0sCi0gICAgeyB7MHgwN2ZjLDB4MDFlMSwweDA3ZjF9LCB7MHgwMWYwLDB4MDA2MSwweDAxZjZ9LCB7MHgwN2YyLDB4MDFlYSwweDA3ZmJ9IH0KLSAgfSwKLSAgewotICAgIHsgezB4MDFmMiwweDAwNjksMHgwMWVkfSwgezB4MDA3NywweDAwMTcsMHgwMDZmfSwgezB4MDFlNiwweDAwNjQsMHgwMWU1fSB9LAotICAgIHsgezB4MDA2NywweDAwMTUsMHgwMDYyfSwgezB4MDAxMiwweDAwMDAsMHgwMDE0fSwgezB4MDA2NSwweDAwMTYsMHgwMDZkfSB9LAotICAgIHsgezB4MDFlOSwweDAwNjMsMHgwMWU0fSwgezB4MDA2YiwweDAwMTMsMHgwMDcxfSwgezB4MDFlMywweDAwNzAsMHgwMWYzfSB9Ci0gIH0sCi0gIHsKLSAgICB7IHsweDA3ZmUsMHgwMWU3LDB4MDdmM30sIHsweDAxZWYsMHgwMDYwLDB4MDFlZX0sIHsweDA3ZjAsMHgwMWUyLDB4MDdmYX0gfSwKLSAgICB7IHsweDAzZjMsMHgwMDZhLDB4MDFlOH0sIHsweDAwNzUsMHgwMDEwLDB4MDA3M30sIHsweDAxZjQsMHgwMDZlLDB4MDNmN30gfSwKLSAgICB7IHsweDA3ZjYsMHgwMWUwLDB4MDdmOX0sIHsweDAzZjIsMHgwMDY2LDB4MDFmNX0sIHsweDA3ZmYsMHgwMWY3LDB4MDdmNH0gfQotICB9Ci19OworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIzWzNdWzNdWzNdWzNdID0ge3t7ezB4MDAwMCwgMHgwMDA5LCAweDAwZWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwYiwgMHgwMDE5LCAweDAwZjB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFlYiwgMHgwMWU2LCAweDAzZjJ9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAwMGEsIDB4MDAzNSwgMHgwMWVmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMzQsIDB4MDAzNywgMHgwMWU5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAxZWQsIDB4MDFlNywgMHgwM2YzfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwMWVlLCAweDAzZWQsIDB4MWZmYX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMWVjLCAweDAxZjIsIDB4MDdmOX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwN2Y4LCAweDAzZjgsIDB4MGZmOH19fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3sweDAwMDgsIDB4MDAzOCwgMHgwM2Y2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMzYsIDB4MDA3NSwgMHgwM2YxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAzZWIsIDB4MDNlYywgMHgwZmY0fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwMDE4LCAweDAwNzYsIDB4MDdmNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDM5LCAweDAwNzQsIDB4MDNlZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMWYzLCAweDAxZjQsIDB4MDdmNn19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDFlOCwgMHgwM2VhLCAweDFmZmN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDBmMiwgMHgwMWYxLCAweDBmZmJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDNmNSwgMHgwN2YzLCAweDBmZmN9fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t7MHgwMGVlLCAweDAzZjcsIDB4N2ZmZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMWYwLCAweDA3ZjUsIDB4N2ZmZH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgxZmZiLCAweDNmZmEsIDB4ZmZmZn19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDBmMSwgMHgwM2YwLCAweDNmZmN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFlYSwgMHgwM2VlLCAweDNmZmJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MGZmNiwgMHgwZmZhLCAweDdmZmN9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDA3ZjIsIDB4MGZmNSwgMHhmZmZlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAzZjQsIDB4MDdmNywgMHg3ZmZifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmZjcsIDB4MGZmOSwgMHg3ZmZhfX19fTsKIAotY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIyWzNdWzNdWzNdWzNdPQotewotICB7Ci0gICAgeyB7MHgwMWYzLDB4MDA2ZiwweDAxZmR9LCB7MHgwMGViLDB4MDAyMywweDAwZWF9LCB7MHgwMWY3LDB4MDBlOCwweDAxZmF9IH0sCi0gICAgeyB7MHgwMGYyLDB4MDAyZCwweDAwNzB9LCB7MHgwMDIwLDB4MDAwNiwweDAwMmJ9LCB7MHgwMDZlLDB4MDAyOCwweDAwZTl9IH0sCi0gICAgeyB7MHgwMWY5LDB4MDA2NiwweDAwZjh9LCB7MHgwMGU3LDB4MDAxYiwweDAwZjF9LCB7MHgwMWY0LDB4MDA2YiwweDAxZjV9IH0KLSAgfSwKLSAgewotICAgIHsgezB4MDBlYywweDAwMmEsMHgwMDZjfSwgezB4MDAyYywweDAwMGEsMHgwMDI3fSwgezB4MDA2NywweDAwMWEsMHgwMGY1fSB9LAotICAgIHsgezB4MDAyNCwweDAwMDgsMHgwMDFmfSwgezB4MDAwOSwweDAwMDAsMHgwMDA3fSwgezB4MDAxZCwweDAwMGIsMHgwMDMwfSB9LAotICAgIHsgezB4MDBlZiwweDAwMWMsMHgwMDY0fSwgezB4MDAxZSwweDAwMGMsMHgwMDI5fSwgezB4MDBmMywweDAwMmYsMHgwMGYwfSB9Ci0gIH0sCi0gIHsKLSAgICB7IHsweDAxZmMsMHgwMDcxLDB4MDFmMn0sIHsweDAwZjQsMHgwMDIxLDB4MDBlNn0sIHsweDAwZjcsMHgwMDY4LDB4MDFmOH0gfSwKLSAgICB7IHsweDAwZWUsMHgwMDIyLDB4MDA2NX0sIHsweDAwMzEsMHgwMDAyLDB4MDAyNn0sIHsweDAwZWQsMHgwMDI1LDB4MDA2YX0gfSwKLSAgICB7IHsweDAxZmIsMHgwMDcyLDB4MDFmZX0sIHsweDAwNjksMHgwMDJlLDB4MDBmNn0sIHsweDAxZmYsMHgwMDZkLDB4MDFmNn0gfQotICB9Ci19OworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI0WzNdWzNdWzNdWzNdID0ge3t7ezB4MDAwNywgMHgwMDE2LCAweDAwZjZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAxOCwgMHgwMDA4LCAweDAwZWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFlZiwgMHgwMGYzLCAweDA3Zjh9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAwMTksIDB4MDAxNywgMHgwMGVkfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMTUsIDB4MDAwMSwgMHgwMGUyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwZjAsIDB4MDA3MCwgMHgwM2YwfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwMWVlLCAweDAwZjEsIDB4MDdmYX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMGVlLCAweDAwZTQsIDB4MDNmMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwN2Y2LCAweDAzZWYsIDB4MDdmZH19fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3sweDAwMDUsIDB4MDAxNCwgMHgwMGYyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMDksIDB4MDAwNCwgMHgwMGU1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwZjQsIDB4MDBlOCwgMHgwM2Y0fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwMDA2LCAweDAwMDIsIDB4MDBlN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDAzLCAweDAwMDAsIDB4MDA2Yn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMGUzLCAweDAwNjksIDB4MDFmM319LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDBlYiwgMHgwMGU2LCAweDAzZjZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDA2ZSwgMHgwMDZhLCAweDAxZjR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDNlYywgMHgwMWYwLCAweDAzZjl9fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t7MHgwMGY1LCAweDAwZWMsIDB4MDdmYn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMGVhLCAweDAwNmYsIDB4MDNmN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwN2Y5LCAweDAzZjMsIDB4MGZmZn19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDBlOSwgMHgwMDZkLCAweDAzZjh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDA2YywgMHgwMDY4LCAweDAxZjV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDNlZSwgMHgwMWYyLCAweDA3ZjR9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDA3ZjcsIDB4MDNmMSwgMHgwZmZlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAzZWQsIDB4MDFmMSwgMHgwN2Y1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDA3ZmUsIDB4MDNmNSwgMHgwN2ZjfX19fTsKIAotY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIzWzNdWzNdWzNdWzNdPQotewotICB7Ci0gICAgeyB7MHgwMDAwLDB4MDAwOSwweDAwZWZ9LCB7MHgwMDBiLDB4MDAxOSwweDAwZjB9LCB7MHgwMWViLDB4MDFlNiwweDAzZjJ9IH0sCi0gICAgeyB7MHgwMDBhLDB4MDAzNSwweDAxZWZ9LCB7MHgwMDM0LDB4MDAzNywweDAxZTl9LCB7MHgwMWVkLDB4MDFlNywweDAzZjN9IH0sCi0gICAgeyB7MHgwMWVlLDB4MDNlZCwweDFmZmF9LCB7MHgwMWVjLDB4MDFmMiwweDA3Zjl9LCB7MHgwN2Y4LDB4MDNmOCwweDBmZjh9IH0KLSAgfSwKLSAgewotICAgIHsgezB4MDAwOCwweDAwMzgsMHgwM2Y2fSwgezB4MDAzNiwweDAwNzUsMHgwM2YxfSwgezB4MDNlYiwweDAzZWMsMHgwZmY0fSB9LAotICAgIHsgezB4MDAxOCwweDAwNzYsMHgwN2Y0fSwgezB4MDAzOSwweDAwNzQsMHgwM2VmfSwgezB4MDFmMywweDAxZjQsMHgwN2Y2fSB9LAotICAgIHsgezB4MDFlOCwweDAzZWEsMHgxZmZjfSwgezB4MDBmMiwweDAxZjEsMHgwZmZifSwgezB4MDNmNSwweDA3ZjMsMHgwZmZjfSB9Ci0gIH0sCi0gIHsKLSAgICB7IHsweDAwZWUsMHgwM2Y3LDB4N2ZmZX0sIHsweDAxZjAsMHgwN2Y1LDB4N2ZmZH0sIHsweDFmZmIsMHgzZmZhLDB4ZmZmZn0gfSwKLSAgICB7IHsweDAwZjEsMHgwM2YwLDB4M2ZmY30sIHsweDAxZWEsMHgwM2VlLDB4M2ZmYn0sIHsweDBmZjYsMHgwZmZhLDB4N2ZmY30gfSwKLSAgICB7IHsweDA3ZjIsMHgwZmY1LDB4ZmZmZX0sIHsweDAzZjQsMHgwN2Y3LDB4N2ZmYn0sIHsweDBmZjcsMHgwZmY5LDB4N2ZmYX0gfQotICB9Ci19OworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI1WzldWzldID0geworICAgIHsweDFmZmYsIDB4MGZmNywgMHgwN2Y0LCAweDA3ZTgsIDB4MDNmMSwgMHgwN2VlLCAweDA3ZjksIDB4MGZmOCwgMHgxZmZkfSwKKyAgICB7MHgwZmZkLCAweDA3ZjEsIDB4MDNlOCwgMHgwMWU4LCAweDAwZjAsIDB4MDFlYywgMHgwM2VlLCAweDA3ZjIsIDB4MGZmYX0sCisgICAgezB4MGZmNCwgMHgwM2VmLCAweDAxZjIsIDB4MDBlOCwgMHgwMDcwLCAweDAwZWMsIDB4MDFmMCwgMHgwM2VhLCAweDA3ZjN9LAorICAgIHsweDA3ZWIsIDB4MDFlYiwgMHgwMGVhLCAweDAwMWEsIDB4MDAwOCwgMHgwMDE5LCAweDAwZWUsIDB4MDFlZiwgMHgwN2VkfSwKKyAgICB7MHgwM2YwLCAweDAwZjIsIDB4MDA3MywgMHgwMDBiLCAweDAwMDAsIDB4MDAwYSwgMHgwMDcxLCAweDAwZjMsIDB4MDdlOX0sCisgICAgezB4MDdlZiwgMHgwMWVlLCAweDAwZWYsIDB4MDAxOCwgMHgwMDA5LCAweDAwMWIsIDB4MDBlYiwgMHgwMWU5LCAweDA3ZWN9LAorICAgIHsweDA3ZjYsIDB4MDNlYiwgMHgwMWYzLCAweDAwZWQsIDB4MDA3MiwgMHgwMGU5LCAweDAxZjEsIDB4MDNlZCwgMHgwN2Y3fSwKKyAgICB7MHgwZmY2LCAweDA3ZjAsIDB4MDNlOSwgMHgwMWVkLCAweDAwZjEsIDB4MDFlYSwgMHgwM2VjLCAweDA3ZjgsIDB4MGZmOX0sCisgICAgezB4MWZmYywgMHgwZmZjLCAweDBmZjUsIDB4MDdlYSwgMHgwM2YzLCAweDAzZjIsIDB4MDdmNSwgMHgwZmZiLCAweDFmZmV9fTsKIAotY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI0WzNdWzNdWzNdWzNdPQotewotICB7Ci0gICAgeyB7MHgwMDA3LDB4MDAxNiwweDAwZjZ9LCB7MHgwMDE4LDB4MDAwOCwweDAwZWZ9LCB7MHgwMWVmLDB4MDBmMywweDA3Zjh9IH0sCi0gICAgeyB7MHgwMDE5LDB4MDAxNywweDAwZWR9LCB7MHgwMDE1LDB4MDAwMSwweDAwZTJ9LCB7MHgwMGYwLDB4MDA3MCwweDAzZjB9IH0sCi0gICAgeyB7MHgwMWVlLDB4MDBmMSwweDA3ZmF9LCB7MHgwMGVlLDB4MDBlNCwweDAzZjJ9LCB7MHgwN2Y2LDB4MDNlZiwweDA3ZmR9IH0KLSAgfSwKLSAgewotICAgIHsgezB4MDAwNSwweDAwMTQsMHgwMGYyfSwgezB4MDAwOSwweDAwMDQsMHgwMGU1fSwgezB4MDBmNCwweDAwZTgsMHgwM2Y0fSB9LAotICAgIHsgezB4MDAwNiwweDAwMDIsMHgwMGU3fSwgezB4MDAwMywweDAwMDAsMHgwMDZifSwgezB4MDBlMywweDAwNjksMHgwMWYzfSB9LAotICAgIHsgezB4MDBlYiwweDAwZTYsMHgwM2Y2fSwgezB4MDA2ZSwweDAwNmEsMHgwMWY0fSwgezB4MDNlYywweDAxZjAsMHgwM2Y5fSB9Ci0gIH0sCi0gIHsKLSAgICB7IHsweDAwZjUsMHgwMGVjLDB4MDdmYn0sIHsweDAwZWEsMHgwMDZmLDB4MDNmN30sIHsweDA3ZjksMHgwM2YzLDB4MGZmZn0gfSwKLSAgICB7IHsweDAwZTksMHgwMDZkLDB4MDNmOH0sIHsweDAwNmMsMHgwMDY4LDB4MDFmNX0sIHsweDAzZWUsMHgwMWYyLDB4MDdmNH0gfSwKLSAgICB7IHsweDA3ZjcsMHgwM2YxLDB4MGZmZX0sIHsweDAzZWQsMHgwMWYxLDB4MDdmNX0sIHsweDA3ZmUsMHgwM2Y1LDB4MDdmY30gfQotICB9Ci19OwotY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI1WzldWzldPQotewotICB7MHgxZmZmLCAweDBmZjcsIDB4MDdmNCwgMHgwN2U4LCAweDAzZjEsIDB4MDdlZSwgMHgwN2Y5LCAweDBmZjgsIDB4MWZmZH0sCi0gIHsweDBmZmQsIDB4MDdmMSwgMHgwM2U4LCAweDAxZTgsIDB4MDBmMCwgMHgwMWVjLCAweDAzZWUsIDB4MDdmMiwgMHgwZmZhfSwKLSAgezB4MGZmNCwgMHgwM2VmLCAweDAxZjIsIDB4MDBlOCwgMHgwMDcwLCAweDAwZWMsIDB4MDFmMCwgMHgwM2VhLCAweDA3ZjN9LAotICB7MHgwN2ViLCAweDAxZWIsIDB4MDBlYSwgMHgwMDFhLCAweDAwMDgsIDB4MDAxOSwgMHgwMGVlLCAweDAxZWYsIDB4MDdlZH0sCi0gIHsweDAzZjAsIDB4MDBmMiwgMHgwMDczLCAweDAwMGIsIDB4MDAwMCwgMHgwMDBhLCAweDAwNzEsIDB4MDBmMywgMHgwN2U5fSwKLSAgezB4MDdlZiwgMHgwMWVlLCAweDAwZWYsIDB4MDAxOCwgMHgwMDA5LCAweDAwMWIsIDB4MDBlYiwgMHgwMWU5LCAweDA3ZWN9LAotICB7MHgwN2Y2LCAweDAzZWIsIDB4MDFmMywgMHgwMGVkLCAweDAwNzIsIDB4MDBlOSwgMHgwMWYxLCAweDAzZWQsIDB4MDdmN30sCi0gIHsweDBmZjYsIDB4MDdmMCwgMHgwM2U5LCAweDAxZWQsIDB4MDBmMSwgMHgwMWVhLCAweDAzZWMsIDB4MDdmOCwgMHgwZmY5fSwKLSAgezB4MWZmYywgMHgwZmZjLCAweDBmZjUsIDB4MDdlYSwgMHgwM2YzLCAweDAzZjIsIDB4MDdmNSwgMHgwZmZiLCAweDFmZmV9Ci19OworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI2WzldWzldID0geworICAgIHsweDA3ZmUsIDB4MDNmZCwgMHgwMWYxLCAweDAxZWIsIDB4MDFmNCwgMHgwMWVhLCAweDAxZjAsIDB4MDNmYywgMHgwN2ZkfSwKKyAgICB7MHgwM2Y2LCAweDAxZTUsIDB4MDBlYSwgMHgwMDZjLCAweDAwNzEsIDB4MDA2OCwgMHgwMGYwLCAweDAxZTYsIDB4MDNmN30sCisgICAgezB4MDFmMywgMHgwMGVmLCAweDAwMzIsIDB4MDAyNywgMHgwMDI4LCAweDAwMjYsIDB4MDAzMSwgMHgwMGViLCAweDAxZjd9LAorICAgIHsweDAxZTgsIDB4MDA2ZiwgMHgwMDJlLCAweDAwMDgsIDB4MDAwNCwgMHgwMDA2LCAweDAwMjksIDB4MDA2YiwgMHgwMWVlfSwKKyAgICB7MHgwMWVmLCAweDAwNzIsIDB4MDAyZCwgMHgwMDAyLCAweDAwMDAsIDB4MDAwMywgMHgwMDJmLCAweDAwNzMsIDB4MDFmYX0sCisgICAgezB4MDFlNywgMHgwMDZlLCAweDAwMmIsIDB4MDAwNywgMHgwMDAxLCAweDAwMDUsIDB4MDAyYywgMHgwMDZkLCAweDAxZWN9LAorICAgIHsweDAxZjksIDB4MDBlZSwgMHgwMDMwLCAweDAwMjQsIDB4MDAyYSwgMHgwMDI1LCAweDAwMzMsIDB4MDBlYywgMHgwMWYyfSwKKyAgICB7MHgwM2Y4LCAweDAxZTQsIDB4MDBlZCwgMHgwMDZhLCAweDAwNzAsIDB4MDA2OSwgMHgwMDc0LCAweDAwZjEsIDB4MDNmYX0sCisgICAgezB4MDdmZiwgMHgwM2Y5LCAweDAxZjYsIDB4MDFlZCwgMHgwMWY4LCAweDAxZTksIDB4MDFmNSwgMHgwM2ZiLCAweDA3ZmN9fTsKIAotY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI2WzldWzldPQotewotICB7MHgwN2ZlLCAweDAzZmQsIDB4MDFmMSwgMHgwMWViLCAweDAxZjQsIDB4MDFlYSwgMHgwMWYwLCAweDAzZmMsIDB4MDdmZH0sCi0gIHsweDAzZjYsIDB4MDFlNSwgMHgwMGVhLCAweDAwNmMsIDB4MDA3MSwgMHgwMDY4LCAweDAwZjAsIDB4MDFlNiwgMHgwM2Y3fSwKLSAgezB4MDFmMywgMHgwMGVmLCAweDAwMzIsIDB4MDAyNywgMHgwMDI4LCAweDAwMjYsIDB4MDAzMSwgMHgwMGViLCAweDAxZjd9LAotICB7MHgwMWU4LCAweDAwNmYsIDB4MDAyZSwgMHgwMDA4LCAweDAwMDQsIDB4MDAwNiwgMHgwMDI5LCAweDAwNmIsIDB4MDFlZX0sCi0gIHsweDAxZWYsIDB4MDA3MiwgMHgwMDJkLCAweDAwMDIsIDB4MDAwMCwgMHgwMDAzLCAweDAwMmYsIDB4MDA3MywgMHgwMWZhfSwKLSAgezB4MDFlNywgMHgwMDZlLCAweDAwMmIsIDB4MDAwNywgMHgwMDAxLCAweDAwMDUsIDB4MDAyYywgMHgwMDZkLCAweDAxZWN9LAotICB7MHgwMWY5LCAweDAwZWUsIDB4MDAzMCwgMHgwMDI0LCAweDAwMmEsIDB4MDAyNSwgMHgwMDMzLCAweDAwZWMsIDB4MDFmMn0sCi0gIHsweDAzZjgsIDB4MDFlNCwgMHgwMGVkLCAweDAwNmEsIDB4MDA3MCwgMHgwMDY5LCAweDAwNzQsIDB4MDBmMSwgMHgwM2ZhfSwKLSAgezB4MDdmZiwgMHgwM2Y5LCAweDAxZjYsIDB4MDFlZCwgMHgwMWY4LCAweDAxZTksIDB4MDFmNSwgMHgwM2ZiLCAweDA3ZmN9Ci19OworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI3WzhdWzhdID0geworICAgIHsweDAwMDAsIDB4MDAwNSwgMHgwMDM3LCAweDAwNzQsIDB4MDBmMiwgMHgwMWViLCAweDAzZWQsIDB4MDdmN30sCisgICAgezB4MDAwNCwgMHgwMDBjLCAweDAwMzUsIDB4MDA3MSwgMHgwMGVjLCAweDAwZWUsIDB4MDFlZSwgMHgwMWY1fSwKKyAgICB7MHgwMDM2LCAweDAwMzQsIDB4MDA3MiwgMHgwMGVhLCAweDAwZjEsIDB4MDFlOSwgMHgwMWYzLCAweDAzZjV9LAorICAgIHsweDAwNzMsIDB4MDA3MCwgMHgwMGViLCAweDAwZjAsIDB4MDFmMSwgMHgwMWYwLCAweDAzZWMsIDB4MDNmYX0sCisgICAgezB4MDBmMywgMHgwMGVkLCAweDAxZTgsIDB4MDFlZiwgMHgwM2VmLCAweDAzZjEsIDB4MDNmOSwgMHgwN2ZifSwKKyAgICB7MHgwMWVkLCAweDAwZWYsIDB4MDFlYSwgMHgwMWYyLCAweDAzZjMsIDB4MDNmOCwgMHgwN2Y5LCAweDA3ZmN9LAorICAgIHsweDAzZWUsIDB4MDFlYywgMHgwMWY0LCAweDAzZjQsIDB4MDNmNywgMHgwN2Y4LCAweDBmZmQsIDB4MGZmZX0sCisgICAgezB4MDdmNiwgMHgwM2YwLCAweDAzZjIsIDB4MDNmNiwgMHgwN2ZhLCAweDA3ZmQsIDB4MGZmYywgMHgwZmZmfX07CiAKLWNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiN1s4XVs4XT0KLXsKLSAgezB4MDAwMCwgMHgwMDA1LCAweDAwMzcsIDB4MDA3NCwgMHgwMGYyLCAweDAxZWIsIDB4MDNlZCwgMHgwN2Y3fSwKLSAgezB4MDAwNCwgMHgwMDBjLCAweDAwMzUsIDB4MDA3MSwgMHgwMGVjLCAweDAwZWUsIDB4MDFlZSwgMHgwMWY1fSwKLSAgezB4MDAzNiwgMHgwMDM0LCAweDAwNzIsIDB4MDBlYSwgMHgwMGYxLCAweDAxZTksIDB4MDFmMywgMHgwM2Y1fSwKLSAgezB4MDA3MywgMHgwMDcwLCAweDAwZWIsIDB4MDBmMCwgMHgwMWYxLCAweDAxZjAsIDB4MDNlYywgMHgwM2ZhfSwKLSAgezB4MDBmMywgMHgwMGVkLCAweDAxZTgsIDB4MDFlZiwgMHgwM2VmLCAweDAzZjEsIDB4MDNmOSwgMHgwN2ZifSwKLSAgezB4MDFlZCwgMHgwMGVmLCAweDAxZWEsIDB4MDFmMiwgMHgwM2YzLCAweDAzZjgsIDB4MDdmOSwgMHgwN2ZjfSwKLSAgezB4MDNlZSwgMHgwMWVjLCAweDAxZjQsIDB4MDNmNCwgMHgwM2Y3LCAweDA3ZjgsIDB4MGZmZCwgMHgwZmZlfSwKLSAgezB4MDdmNiwgMHgwM2YwLCAweDAzZjIsIDB4MDNmNiwgMHgwN2ZhLCAweDA3ZmQsIDB4MGZmYywgMHgwZmZmfQotfTsKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiOFs4XVs4XSA9IHsKKyAgICB7MHgwMDBlLCAweDAwMDUsIDB4MDAxMCwgMHgwMDMwLCAweDAwNmYsIDB4MDBmMSwgMHgwMWZhLCAweDAzZmV9LAorICAgIHsweDAwMDMsIDB4MDAwMCwgMHgwMDA0LCAweDAwMTIsIDB4MDAyYywgMHgwMDZhLCAweDAwNzUsIDB4MDBmOH0sCisgICAgezB4MDAwZiwgMHgwMDAyLCAweDAwMDYsIDB4MDAxNCwgMHgwMDJlLCAweDAwNjksIDB4MDA3MiwgMHgwMGY1fSwKKyAgICB7MHgwMDJmLCAweDAwMTEsIDB4MDAxMywgMHgwMDJhLCAweDAwMzIsIDB4MDA2YywgMHgwMGVjLCAweDAwZmF9LAorICAgIHsweDAwNzEsIDB4MDAyYiwgMHgwMDJkLCAweDAwMzEsIDB4MDA2ZCwgMHgwMDcwLCAweDAwZjIsIDB4MDFmOX0sCisgICAgezB4MDBlZiwgMHgwMDY4LCAweDAwMzMsIDB4MDA2YiwgMHgwMDZlLCAweDAwZWUsIDB4MDBmOSwgMHgwM2ZjfSwKKyAgICB7MHgwMWY4LCAweDAwNzQsIDB4MDA3MywgMHgwMGVkLCAweDAwZjAsIDB4MDBmNiwgMHgwMWY2LCAweDAxZmR9LAorICAgIHsweDAzZmQsIDB4MDBmMywgMHgwMGY0LCAweDAwZjcsIDB4MDFmNywgMHgwMWZiLCAweDAxZmMsIDB4MDNmZn19OwogCi1jb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjhbOF1bOF09Ci17Ci0gIHsweDAwMGUsIDB4MDAwNSwgMHgwMDEwLCAweDAwMzAsIDB4MDA2ZiwgMHgwMGYxLCAweDAxZmEsIDB4MDNmZX0sCi0gIHsweDAwMDMsIDB4MDAwMCwgMHgwMDA0LCAweDAwMTIsIDB4MDAyYywgMHgwMDZhLCAweDAwNzUsIDB4MDBmOH0sCi0gIHsweDAwMGYsIDB4MDAwMiwgMHgwMDA2LCAweDAwMTQsIDB4MDAyZSwgMHgwMDY5LCAweDAwNzIsIDB4MDBmNX0sCi0gIHsweDAwMmYsIDB4MDAxMSwgMHgwMDEzLCAweDAwMmEsIDB4MDAzMiwgMHgwMDZjLCAweDAwZWMsIDB4MDBmYX0sCi0gIHsweDAwNzEsIDB4MDAyYiwgMHgwMDJkLCAweDAwMzEsIDB4MDA2ZCwgMHgwMDcwLCAweDAwZjIsIDB4MDFmOX0sCi0gIHsweDAwZWYsIDB4MDA2OCwgMHgwMDMzLCAweDAwNmIsIDB4MDA2ZSwgMHgwMGVlLCAweDAwZjksIDB4MDNmY30sCi0gIHsweDAxZjgsIDB4MDA3NCwgMHgwMDczLCAweDAwZWQsIDB4MDBmMCwgMHgwMGY2LCAweDAxZjYsIDB4MDFmZH0sCi0gIHsweDAzZmQsIDB4MDBmMywgMHgwMGY0LCAweDAwZjcsIDB4MDFmNywgMHgwMWZiLCAweDAxZmMsIDB4MDNmZn0KLX07Citjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjlbMTNdWzEzXSA9IHsKKyAgICB7MHgwMDAwLCAweDAwMDUsIDB4MDAzNywgMHgwMGU3LCAweDAxZGUsIDB4MDNjZSwgMHgwM2Q5LCAweDA3YzgsIDB4MDdjZCwKKyAgICAgMHgwZmM4LCAweDBmZGQsIDB4MWZlNCwgMHgxZmVjfSwKKyAgICB7MHgwMDA0LCAweDAwMGMsIDB4MDAzNSwgMHgwMDcyLCAweDAwZWEsIDB4MDBlZCwgMHgwMWUyLCAweDAzZDEsIDB4MDNkMywKKyAgICAgMHgwM2UwLCAweDA3ZDgsIDB4MGZjZiwgMHgwZmQ1fSwKKyAgICB7MHgwMDM2LCAweDAwMzQsIDB4MDA3MSwgMHgwMGU4LCAweDAwZWMsIDB4MDFlMSwgMHgwM2NmLCAweDAzZGQsIDB4MDNkYiwKKyAgICAgMHgwN2QwLCAweDBmYzcsIDB4MGZkNCwgMHgwZmU0fSwKKyAgICB7MHgwMGU2LCAweDAwNzAsIDB4MDBlOSwgMHgwMWRkLCAweDAxZTMsIDB4MDNkMiwgMHgwM2RjLCAweDA3Y2MsIDB4MDdjYSwKKyAgICAgMHgwN2RlLCAweDBmZDgsIDB4MGZlYSwgMHgxZmRifSwKKyAgICB7MHgwMWRmLCAweDAwZWIsIDB4MDFkYywgMHgwMWU2LCAweDAzZDUsIDB4MDNkZSwgMHgwN2NiLCAweDA3ZGQsIDB4MDdkYywKKyAgICAgMHgwZmNkLCAweDBmZTIsIDB4MGZlNywgMHgxZmUxfSwKKyAgICB7MHgwM2QwLCAweDAxZTAsIDB4MDFlNCwgMHgwM2Q2LCAweDA3YzUsIDB4MDdkMSwgMHgwN2RiLCAweDBmZDIsIDB4MDdlMCwKKyAgICAgMHgwZmQ5LCAweDBmZWIsIDB4MWZlMywgMHgxZmU5fSwKKyAgICB7MHgwN2M0LCAweDAxZTUsIDB4MDNkNywgMHgwN2M2LCAweDA3Y2YsIDB4MDdkYSwgMHgwZmNiLCAweDBmZGEsIDB4MGZlMywKKyAgICAgMHgwZmU5LCAweDFmZTYsIDB4MWZmMywgMHgxZmY3fSwKKyAgICB7MHgwN2QzLCAweDAzZDgsIDB4MDNlMSwgMHgwN2Q0LCAweDA3ZDksIDB4MGZkMywgMHgwZmRlLCAweDFmZGQsIDB4MWZkOSwKKyAgICAgMHgxZmUyLCAweDFmZWEsIDB4MWZmMSwgMHgxZmY2fSwKKyAgICB7MHgwN2QyLCAweDAzZDQsIDB4MDNkYSwgMHgwN2M3LCAweDA3ZDcsIDB4MDdlMiwgMHgwZmNlLCAweDBmZGIsIDB4MWZkOCwKKyAgICAgMHgxZmVlLCAweDNmZjAsIDB4MWZmNCwgMHgzZmYyfSwKKyAgICB7MHgwN2UxLCAweDAzZGYsIDB4MDdjOSwgMHgwN2Q2LCAweDBmY2EsIDB4MGZkMCwgMHgwZmU1LCAweDBmZTYsIDB4MWZlYiwKKyAgICAgMHgxZmVmLCAweDNmZjMsIDB4M2ZmNCwgMHgzZmY1fSwKKyAgICB7MHgwZmUwLCAweDA3Y2UsIDB4MDdkNSwgMHgwZmM2LCAweDBmZDEsIDB4MGZlMSwgMHgxZmUwLCAweDFmZTgsIDB4MWZmMCwKKyAgICAgMHgzZmYxLCAweDNmZjgsIDB4M2ZmNiwgMHg3ZmZjfSwKKyAgICB7MHgwZmU4LCAweDA3ZGYsIDB4MGZjOSwgMHgwZmQ3LCAweDBmZGMsIDB4MWZkYywgMHgxZmRmLCAweDFmZWQsIDB4MWZmNSwKKyAgICAgMHgzZmY5LCAweDNmZmIsIDB4N2ZmZCwgMHg3ZmZlfSwKKyAgICB7MHgxZmU3LCAweDBmY2MsIDB4MGZkNiwgMHgwZmRmLCAweDFmZGUsIDB4MWZkYSwgMHgxZmU1LCAweDFmZjIsIDB4M2ZmYSwKKyAgICAgMHgzZmY3LCAweDNmZmMsIDB4M2ZmZCwgMHg3ZmZmfX07CiAKLWNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiOVsxM11bMTNdPQotewotICB7MHgwMDAwLCAweDAwMDUsIDB4MDAzNywgMHgwMGU3LCAweDAxZGUsIDB4MDNjZSwgMHgwM2Q5LCAweDA3YzgsIDB4MDdjZCwgMHgwZmM4LCAweDBmZGQsIDB4MWZlNCwgMHgxZmVjfSwKLSAgezB4MDAwNCwgMHgwMDBjLCAweDAwMzUsIDB4MDA3MiwgMHgwMGVhLCAweDAwZWQsIDB4MDFlMiwgMHgwM2QxLCAweDAzZDMsIDB4MDNlMCwgMHgwN2Q4LCAweDBmY2YsIDB4MGZkNX0sCi0gIHsweDAwMzYsIDB4MDAzNCwgMHgwMDcxLCAweDAwZTgsIDB4MDBlYywgMHgwMWUxLCAweDAzY2YsIDB4MDNkZCwgMHgwM2RiLCAweDA3ZDAsIDB4MGZjNywgMHgwZmQ0LCAweDBmZTR9LAotICB7MHgwMGU2LCAweDAwNzAsIDB4MDBlOSwgMHgwMWRkLCAweDAxZTMsIDB4MDNkMiwgMHgwM2RjLCAweDA3Y2MsIDB4MDdjYSwgMHgwN2RlLCAweDBmZDgsIDB4MGZlYSwgMHgxZmRifSwKLSAgezB4MDFkZiwgMHgwMGViLCAweDAxZGMsIDB4MDFlNiwgMHgwM2Q1LCAweDAzZGUsIDB4MDdjYiwgMHgwN2RkLCAweDA3ZGMsIDB4MGZjZCwgMHgwZmUyLCAweDBmZTcsIDB4MWZlMX0sCi0gIHsweDAzZDAsIDB4MDFlMCwgMHgwMWU0LCAweDAzZDYsIDB4MDdjNSwgMHgwN2QxLCAweDA3ZGIsIDB4MGZkMiwgMHgwN2UwLCAweDBmZDksIDB4MGZlYiwgMHgxZmUzLCAweDFmZTl9LAotICB7MHgwN2M0LCAweDAxZTUsIDB4MDNkNywgMHgwN2M2LCAweDA3Y2YsIDB4MDdkYSwgMHgwZmNiLCAweDBmZGEsIDB4MGZlMywgMHgwZmU5LCAweDFmZTYsIDB4MWZmMywgMHgxZmY3fSwKLSAgezB4MDdkMywgMHgwM2Q4LCAweDAzZTEsIDB4MDdkNCwgMHgwN2Q5LCAweDBmZDMsIDB4MGZkZSwgMHgxZmRkLCAweDFmZDksIDB4MWZlMiwgMHgxZmVhLCAweDFmZjEsIDB4MWZmNn0sCi0gIHsweDA3ZDIsIDB4MDNkNCwgMHgwM2RhLCAweDA3YzcsIDB4MDdkNywgMHgwN2UyLCAweDBmY2UsIDB4MGZkYiwgMHgxZmQ4LCAweDFmZWUsIDB4M2ZmMCwgMHgxZmY0LCAweDNmZjJ9LAotICB7MHgwN2UxLCAweDAzZGYsIDB4MDdjOSwgMHgwN2Q2LCAweDBmY2EsIDB4MGZkMCwgMHgwZmU1LCAweDBmZTYsIDB4MWZlYiwgMHgxZmVmLCAweDNmZjMsIDB4M2ZmNCwgMHgzZmY1fSwKLSAgezB4MGZlMCwgMHgwN2NlLCAweDA3ZDUsIDB4MGZjNiwgMHgwZmQxLCAweDBmZTEsIDB4MWZlMCwgMHgxZmU4LCAweDFmZjAsIDB4M2ZmMSwgMHgzZmY4LCAweDNmZjYsIDB4N2ZmY30sCi0gIHsweDBmZTgsIDB4MDdkZiwgMHgwZmM5LCAweDBmZDcsIDB4MGZkYywgMHgxZmRjLCAweDFmZGYsIDB4MWZlZCwgMHgxZmY1LCAweDNmZjksIDB4M2ZmYiwgMHg3ZmZkLCAweDdmZmV9LAotICB7MHgxZmU3LCAweDBmY2MsIDB4MGZkNiwgMHgwZmRmLCAweDFmZGUsIDB4MWZkYSwgMHgxZmU1LCAweDFmZjIsIDB4M2ZmYSwgMHgzZmY3LCAweDNmZmMsIDB4M2ZmZCwgMHg3ZmZmfQotfTsKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiMTBbMTNdWzEzXSA9IHsKKyAgICB7MHgwMDIyLCAweDAwMDgsIDB4MDAxZCwgMHgwMDI2LCAweDAwNWYsIDB4MDBkMywgMHgwMWNmLCAweDAzZDAsIDB4MDNkNywKKyAgICAgMHgwM2VkLCAweDA3ZjAsIDB4MDdmNiwgMHgwZmZkfSwKKyAgICB7MHgwMDA3LCAweDAwMDAsIDB4MDAwMSwgMHgwMDA5LCAweDAwMjAsIDB4MDA1NCwgMHgwMDYwLCAweDAwZDUsIDB4MDBkYywKKyAgICAgMHgwMWQ0LCAweDAzY2QsIDB4MDNkZSwgMHgwN2U3fSwKKyAgICB7MHgwMDFjLCAweDAwMDIsIDB4MDAwNiwgMHgwMDBjLCAweDAwMWUsIDB4MDAyOCwgMHgwMDViLCAweDAwY2QsIDB4MDBkOSwKKyAgICAgMHgwMWNlLCAweDAxZGMsIDB4MDNkOSwgMHgwM2YxfSwKKyAgICB7MHgwMDI1LCAweDAwMGIsIDB4MDAwYSwgMHgwMDBkLCAweDAwMjQsIDB4MDA1NywgMHgwMDYxLCAweDAwY2MsIDB4MDBkZCwKKyAgICAgMHgwMWNjLCAweDAxZGUsIDB4MDNkMywgMHgwM2U3fSwKKyAgICB7MHgwMDVkLCAweDAwMjEsIDB4MDAxZiwgMHgwMDIzLCAweDAwMjcsIDB4MDA1OSwgMHgwMDY0LCAweDAwZDgsIDB4MDBkZiwKKyAgICAgMHgwMWQyLCAweDAxZTIsIDB4MDNkZCwgMHgwM2VlfSwKKyAgICB7MHgwMGQxLCAweDAwNTUsIDB4MDAyOSwgMHgwMDU2LCAweDAwNTgsIDB4MDA2MiwgMHgwMGNlLCAweDAwZTAsIDB4MDBlMiwKKyAgICAgMHgwMWRhLCAweDAzZDQsIDB4MDNlMywgMHgwN2VifSwKKyAgICB7MHgwMWM5LCAweDAwNWUsIDB4MDA1YSwgMHgwMDVjLCAweDAwNjMsIDB4MDBjYSwgMHgwMGRhLCAweDAxYzcsIDB4MDFjYSwKKyAgICAgMHgwMWUwLCAweDAzZGIsIDB4MDNlOCwgMHgwN2VjfSwKKyAgICB7MHgwMWUzLCAweDAwZDIsIDB4MDBjYiwgMHgwMGQwLCAweDAwZDcsIDB4MDBkYiwgMHgwMWM2LCAweDAxZDUsIDB4MDFkOCwKKyAgICAgMHgwM2NhLCAweDAzZGEsIDB4MDdlYSwgMHgwN2YxfSwKKyAgICB7MHgwMWUxLCAweDAwZDQsIDB4MDBjZiwgMHgwMGQ2LCAweDAwZGUsIDB4MDBlMSwgMHgwMWQwLCAweDAxZDYsIDB4MDNkMSwKKyAgICAgMHgwM2Q1LCAweDAzZjIsIDB4MDdlZSwgMHgwN2ZifSwKKyAgICB7MHgwM2U5LCAweDAxY2QsIDB4MDFjOCwgMHgwMWNiLCAweDAxZDEsIDB4MDFkNywgMHgwMWRmLCAweDAzY2YsIDB4MDNlMCwKKyAgICAgMHgwM2VmLCAweDA3ZTYsIDB4MDdmOCwgMHgwZmZhfSwKKyAgICB7MHgwM2ViLCAweDAxZGQsIDB4MDFkMywgMHgwMWQ5LCAweDAxZGIsIDB4MDNkMiwgMHgwM2NjLCAweDAzZGMsIDB4MDNlYSwKKyAgICAgMHgwN2VkLCAweDA3ZjMsIDB4MDdmOSwgMHgwZmY5fSwKKyAgICB7MHgwN2YyLCAweDAzY2UsIDB4MDFlNCwgMHgwM2NiLCAweDAzZDgsIDB4MDNkNiwgMHgwM2UyLCAweDAzZTUsIDB4MDdlOCwKKyAgICAgMHgwN2Y0LCAweDA3ZjUsIDB4MDdmNywgMHgwZmZifSwKKyAgICB7MHgwN2ZhLCAweDAzZWMsIDB4MDNkZiwgMHgwM2UxLCAweDAzZTQsIDB4MDNlNiwgMHgwM2YwLCAweDA3ZTksIDB4MDdlZiwKKyAgICAgMHgwZmY4LCAweDBmZmUsIDB4MGZmYywgMHgwZmZmfX07CiAKLWNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiMTBbMTNdWzEzXT0KLXsKLSAgezB4MDAyMiwgMHgwMDA4LCAweDAwMWQsIDB4MDAyNiwgMHgwMDVmLCAweDAwZDMsIDB4MDFjZiwgMHgwM2QwLCAweDAzZDcsIDB4MDNlZCwgMHgwN2YwLCAweDA3ZjYsIDB4MGZmZH0sCi0gIHsweDAwMDcsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDksIDB4MDAyMCwgMHgwMDU0LCAweDAwNjAsIDB4MDBkNSwgMHgwMGRjLCAweDAxZDQsIDB4MDNjZCwgMHgwM2RlLCAweDA3ZTd9LAotICB7MHgwMDFjLCAweDAwMDIsIDB4MDAwNiwgMHgwMDBjLCAweDAwMWUsIDB4MDAyOCwgMHgwMDViLCAweDAwY2QsIDB4MDBkOSwgMHgwMWNlLCAweDAxZGMsIDB4MDNkOSwgMHgwM2YxfSwKLSAgezB4MDAyNSwgMHgwMDBiLCAweDAwMGEsIDB4MDAwZCwgMHgwMDI0LCAweDAwNTcsIDB4MDA2MSwgMHgwMGNjLCAweDAwZGQsIDB4MDFjYywgMHgwMWRlLCAweDAzZDMsIDB4MDNlN30sCi0gIHsweDAwNWQsIDB4MDAyMSwgMHgwMDFmLCAweDAwMjMsIDB4MDAyNywgMHgwMDU5LCAweDAwNjQsIDB4MDBkOCwgMHgwMGRmLCAweDAxZDIsIDB4MDFlMiwgMHgwM2RkLCAweDAzZWV9LAotICB7MHgwMGQxLCAweDAwNTUsIDB4MDAyOSwgMHgwMDU2LCAweDAwNTgsIDB4MDA2MiwgMHgwMGNlLCAweDAwZTAsIDB4MDBlMiwgMHgwMWRhLCAweDAzZDQsIDB4MDNlMywgMHgwN2VifSwKLSAgezB4MDFjOSwgMHgwMDVlLCAweDAwNWEsIDB4MDA1YywgMHgwMDYzLCAweDAwY2EsIDB4MDBkYSwgMHgwMWM3LCAweDAxY2EsIDB4MDFlMCwgMHgwM2RiLCAweDAzZTgsIDB4MDdlY30sCi0gIHsweDAxZTMsIDB4MDBkMiwgMHgwMGNiLCAweDAwZDAsIDB4MDBkNywgMHgwMGRiLCAweDAxYzYsIDB4MDFkNSwgMHgwMWQ4LCAweDAzY2EsIDB4MDNkYSwgMHgwN2VhLCAweDA3ZjF9LAotICB7MHgwMWUxLCAweDAwZDQsIDB4MDBjZiwgMHgwMGQ2LCAweDAwZGUsIDB4MDBlMSwgMHgwMWQwLCAweDAxZDYsIDB4MDNkMSwgMHgwM2Q1LCAweDAzZjIsIDB4MDdlZSwgMHgwN2ZifSwKLSAgezB4MDNlOSwgMHgwMWNkLCAweDAxYzgsIDB4MDFjYiwgMHgwMWQxLCAweDAxZDcsIDB4MDFkZiwgMHgwM2NmLCAweDAzZTAsIDB4MDNlZiwgMHgwN2U2LCAweDA3ZjgsIDB4MGZmYX0sCi0gIHsweDAzZWIsIDB4MDFkZCwgMHgwMWQzLCAweDAxZDksIDB4MDFkYiwgMHgwM2QyLCAweDAzY2MsIDB4MDNkYywgMHgwM2VhLCAweDA3ZWQsIDB4MDdmMywgMHgwN2Y5LCAweDBmZjl9LAotICB7MHgwN2YyLCAweDAzY2UsIDB4MDFlNCwgMHgwM2NiLCAweDAzZDgsIDB4MDNkNiwgMHgwM2UyLCAweDAzZTUsIDB4MDdlOCwgMHgwN2Y0LCAweDA3ZjUsIDB4MDdmNywgMHgwZmZifSwKLSAgezB4MDdmYSwgMHgwM2VjLCAweDAzZGYsIDB4MDNlMSwgMHgwM2U0LCAweDAzZTYsIDB4MDNmMCwgMHgwN2U5LCAweDA3ZWYsIDB4MGZmOCwgMHgwZmZlLCAweDBmZmMsIDB4MGZmZn0KLX07Citjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjExWzIxXVsxN10gPSB7CisgICAgezB4MDAwMCwgMHgwMDA2LCAweDAwMTksIDB4MDAzZCwgMHgwMDljLCAweDAwYzYsIDB4MDFhNywgMHgwMzkwLCAweDAzYzIsCisgICAgIDB4MDNkZiwgMHgwN2U2LCAweDA3ZjMsIDB4MGZmYiwgMHgwN2VjLCAweDBmZmEsIDB4MGZmZSwgMHgwMzhlfSwKKyAgICB7MHgwMDA1LCAweDAwMDEsIDB4MDAwOCwgMHgwMDE0LCAweDAwMzcsIDB4MDA0MiwgMHgwMDkyLCAweDAwYWYsIDB4MDE5MSwKKyAgICAgMHgwMWE1LCAweDAxYjUsIDB4MDM5ZSwgMHgwM2MwLCAweDAzYTIsIDB4MDNjZCwgMHgwN2Q2LCAweDAwYWV9LAorICAgIHsweDAwMTcsIDB4MDAwNywgMHgwMDA5LCAweDAwMTgsIDB4MDAzOSwgMHgwMDQwLCAweDAwOGUsIDB4MDBhMywgMHgwMGI4LAorICAgICAweDAxOTksIDB4MDFhYywgMHgwMWMxLCAweDAzYjEsIDB4MDM5NiwgMHgwM2JlLCAweDAzY2EsIDB4MDA5ZH0sCisgICAgezB4MDAzYywgMHgwMDE1LCAweDAwMTYsIDB4MDAxYSwgMHgwMDNiLCAweDAwNDQsIDB4MDA5MSwgMHgwMGE1LCAweDAwYmUsCisgICAgIDB4MDE5NiwgMHgwMWFlLCAweDAxYjksIDB4MDNhMSwgMHgwMzkxLCAweDAzYTUsIDB4MDNkNSwgMHgwMDk0fSwKKyAgICB7MHgwMDlhLCAweDAwMzYsIDB4MDAzOCwgMHgwMDNhLCAweDAwNDEsIDB4MDA4YywgMHgwMDliLCAweDAwYjAsIDB4MDBjMywKKyAgICAgMHgwMTllLCAweDAxYWIsIDB4MDFiYywgMHgwMzlmLCAweDAzOGYsIDB4MDNhOSwgMHgwM2NmLCAweDAwOTN9LAorICAgIHsweDAwYmYsIDB4MDAzZSwgMHgwMDNmLCAweDAwNDMsIDB4MDA0NSwgMHgwMDllLCAweDAwYTcsIDB4MDBiOSwgMHgwMTk0LAorICAgICAweDAxYTIsIDB4MDFiYSwgMHgwMWMzLCAweDAzYTYsIDB4MDNhNywgMHgwM2JiLCAweDAzZDQsIDB4MDA5Zn0sCisgICAgezB4MDFhMCwgMHgwMDhmLCAweDAwOGQsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTYsIDB4MDBiNiwgMHgwMGM0LCAweDAxOWYsCisgICAgIDB4MDFhZiwgMHgwMWJmLCAweDAzOTksIDB4MDNiZiwgMHgwM2I0LCAweDAzYzksIDB4MDNlNywgMHgwMGE4fSwKKyAgICB7MHgwMWI2LCAweDAwYWIsIDB4MDBhNCwgMHgwMGFhLCAweDAwYjIsIDB4MDBjMiwgMHgwMGM1LCAweDAxOTgsIDB4MDFhNCwKKyAgICAgMHgwMWI4LCAweDAzOGMsIDB4MDNhNCwgMHgwM2M0LCAweDAzYzYsIDB4MDNkZCwgMHgwM2U4LCAweDAwYWR9LAorICAgIHsweDAzYWYsIDB4MDE5MiwgMHgwMGJkLCAweDAwYmMsIDB4MDE4ZSwgMHgwMTk3LCAweDAxOWEsIDB4MDFhMywgMHgwMWIxLAorICAgICAweDAzOGQsIDB4MDM5OCwgMHgwM2I3LCAweDAzZDMsIDB4MDNkMSwgMHgwM2RiLCAweDA3ZGQsIDB4MDBiNH0sCisgICAgezB4MDNkZSwgMHgwMWE5LCAweDAxOWIsIDB4MDE5YywgMHgwMWExLCAweDAxYWEsIDB4MDFhZCwgMHgwMWIzLCAweDAzOGIsCisgICAgIDB4MDNiMiwgMHgwM2I4LCAweDAzY2UsIDB4MDNlMSwgMHgwM2UwLCAweDA3ZDIsIDB4MDdlNSwgMHgwMGI3fSwKKyAgICB7MHgwN2UzLCAweDAxYmIsIDB4MDFhOCwgMHgwMWE2LCAweDAxYjAsIDB4MDFiMiwgMHgwMWI3LCAweDAzOWIsIDB4MDM5YSwKKyAgICAgMHgwM2JhLCAweDAzYjUsIDB4MDNkNiwgMHgwN2Q3LCAweDAzZTQsIDB4MDdkOCwgMHgwN2VhLCAweDAwYmF9LAorICAgIHsweDA3ZTgsIDB4MDNhMCwgMHgwMWJkLCAweDAxYjQsIDB4MDM4YSwgMHgwMWM0LCAweDAzOTIsIDB4MDNhYSwgMHgwM2IwLAorICAgICAweDAzYmMsIDB4MDNkNywgMHgwN2Q0LCAweDA3ZGMsIDB4MDdkYiwgMHgwN2Q1LCAweDA3ZjAsIDB4MDBjMX0sCisgICAgezB4MDdmYiwgMHgwM2M4LCAweDAzYTMsIDB4MDM5NSwgMHgwMzlkLCAweDAzYWMsIDB4MDNhZSwgMHgwM2M1LCAweDAzZDgsCisgICAgIDB4MDNlMiwgMHgwM2U2LCAweDA3ZTQsIDB4MDdlNywgMHgwN2UwLCAweDA3ZTksIDB4MDdmNywgMHgwMTkwfSwKKyAgICB7MHgwN2YyLCAweDAzOTMsIDB4MDFiZSwgMHgwMWMwLCAweDAzOTQsIDB4MDM5NywgMHgwM2FkLCAweDAzYzMsIDB4MDNjMSwKKyAgICAgMHgwM2QyLCAweDA3ZGEsIDB4MDdkOSwgMHgwN2RmLCAweDA3ZWIsIDB4MDdmNCwgMHgwN2ZhLCAweDAxOTV9LAorICAgIHsweDA3ZjgsIDB4MDNiZCwgMHgwMzljLCAweDAzYWIsIDB4MDNhOCwgMHgwM2IzLCAweDAzYjksIDB4MDNkMCwgMHgwM2UzLAorICAgICAweDAzZTUsIDB4MDdlMiwgMHgwN2RlLCAweDA3ZWQsIDB4MDdmMSwgMHgwN2Y5LCAweDA3ZmMsIDB4MDE5M30sCisgICAgezB4MGZmZCwgMHgwM2RjLCAweDAzYjYsIDB4MDNjNywgMHgwM2NjLCAweDAzY2IsIDB4MDNkOSwgMHgwM2RhLCAweDA3ZDMsCisgICAgIDB4MDdlMSwgMHgwN2VlLCAweDA3ZWYsIDB4MDdmNSwgMHgwN2Y2LCAweDBmZmMsIDB4MGZmZiwgMHgwMTlkfSwKKyAgICB7MHgwMWMyLCAweDAwYjUsIDB4MDBhMSwgMHgwMDk2LCAweDAwOTcsIDB4MDA5NSwgMHgwMDk5LCAweDAwYTAsIDB4MDBhMiwKKyAgICAgMHgwMGFjLCAweDAwYTksIDB4MDBiMSwgMHgwMGIzLCAweDAwYmIsIDB4MDBjMCwgMHgwMThmLCAweDAwMDR9LAorICAgIHsweDAwMTgsIDB4MDAyZSwgMHgwMDAwLCAweDAwNWEsIDB4MDBhNSwgMHgwMGY4LCAweDAwYjcsIDB4MDA5NCwgMHgwMGY5LAorICAgICAweDAwNGQsIDB4MDAyMSwgMHgwMDJiLCAweDAwNGYsIDB4MDA3YiwgMHgwMGJjLCAweDAwNDYsIDB4MDAxNX0sCisgICAgezB4MDA0MiwgMHgwMDM3LCAweDAwNzgsIDB4MDAwZCwgMHgwMDY4LCAweDAwNWYsIDB4MDAwZCwgMHgwMDVlLCAweDAwNWEsCisgICAgIDB4MDBiZSwgMHgwMDYzLCAweDAwN2UsIDB4MDAxZiwgMHgwMDkyLCAweDAwMWEsIDB4MDBhYiwgMHgwMDMyfSwKKyAgICB7MHgwMGU2LCAweDAwMzcsIDB4MDAwMCwgMHgwMDU4LCAweDAwMGIsIDB4MDA1YSwgMHgwMGUxLCAweDAwNWQsIDB4MDAyOSwKKyAgICAgMHgwMDE3LCAweDAwN2UsIDB4MDA2OSwgMHgwMGFhLCAweDAwNTQsIDB4MDAyOSwgMHgwMDMyLCAweDAwNDF9LAorICAgIHsweDAwNDYsIDB4MDBlYSwgMHgwMDM0LCAweDAwZWEsIDB4MDAxMSwgMHgwMDFiLCAweDAwYTksIDB4MDA5NCwgMHgwMGUyLAorICAgICAweDAwMzEsIDB4MDBkMCwgMHgwMGU1LCAweDAwMDcsIDB4MDA3MCwgMHgwMDY5LCAweDAwM2UsIDB4MDAyMX19OwogCi1jb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjExWzIxXVsxN109Ci17Ci0gIHsweDAwMDAsIDB4MDAwNiwgMHgwMDE5LCAweDAwM2QsIDB4MDA5YywgMHgwMGM2LCAweDAxYTcsIDB4MDM5MCwgMHgwM2MyLCAweDAzZGYsIDB4MDdlNiwgMHgwN2YzLCAweDBmZmIsIDB4MDdlYywgMHgwZmZhLCAweDBmZmUsIDB4MDM4ZX0sCi0gIHsweDAwMDUsIDB4MDAwMSwgMHgwMDA4LCAweDAwMTQsIDB4MDAzNywgMHgwMDQyLCAweDAwOTIsIDB4MDBhZiwgMHgwMTkxLCAweDAxYTUsIDB4MDFiNSwgMHgwMzllLCAweDAzYzAsIDB4MDNhMiwgMHgwM2NkLCAweDA3ZDYsIDB4MDBhZX0sCi0gIHsweDAwMTcsIDB4MDAwNywgMHgwMDA5LCAweDAwMTgsIDB4MDAzOSwgMHgwMDQwLCAweDAwOGUsIDB4MDBhMywgMHgwMGI4LCAweDAxOTksIDB4MDFhYywgMHgwMWMxLCAweDAzYjEsIDB4MDM5NiwgMHgwM2JlLCAweDAzY2EsIDB4MDA5ZH0sCi0gIHsweDAwM2MsIDB4MDAxNSwgMHgwMDE2LCAweDAwMWEsIDB4MDAzYiwgMHgwMDQ0LCAweDAwOTEsIDB4MDBhNSwgMHgwMGJlLCAweDAxOTYsIDB4MDFhZSwgMHgwMWI5LCAweDAzYTEsIDB4MDM5MSwgMHgwM2E1LCAweDAzZDUsIDB4MDA5NH0sCi0gIHsweDAwOWEsIDB4MDAzNiwgMHgwMDM4LCAweDAwM2EsIDB4MDA0MSwgMHgwMDhjLCAweDAwOWIsIDB4MDBiMCwgMHgwMGMzLCAweDAxOWUsIDB4MDFhYiwgMHgwMWJjLCAweDAzOWYsIDB4MDM4ZiwgMHgwM2E5LCAweDAzY2YsIDB4MDA5M30sCi0gIHsweDAwYmYsIDB4MDAzZSwgMHgwMDNmLCAweDAwNDMsIDB4MDA0NSwgMHgwMDllLCAweDAwYTcsIDB4MDBiOSwgMHgwMTk0LCAweDAxYTIsIDB4MDFiYSwgMHgwMWMzLCAweDAzYTYsIDB4MDNhNywgMHgwM2JiLCAweDAzZDQsIDB4MDA5Zn0sCi0gIHsweDAxYTAsIDB4MDA4ZiwgMHgwMDhkLCAweDAwOTAsIDB4MDA5OCwgMHgwMGE2LCAweDAwYjYsIDB4MDBjNCwgMHgwMTlmLCAweDAxYWYsIDB4MDFiZiwgMHgwMzk5LCAweDAzYmYsIDB4MDNiNCwgMHgwM2M5LCAweDAzZTcsIDB4MDBhOH0sCi0gIHsweDAxYjYsIDB4MDBhYiwgMHgwMGE0LCAweDAwYWEsIDB4MDBiMiwgMHgwMGMyLCAweDAwYzUsIDB4MDE5OCwgMHgwMWE0LCAweDAxYjgsIDB4MDM4YywgMHgwM2E0LCAweDAzYzQsIDB4MDNjNiwgMHgwM2RkLCAweDAzZTgsIDB4MDBhZH0sCi0gIHsweDAzYWYsIDB4MDE5MiwgMHgwMGJkLCAweDAwYmMsIDB4MDE4ZSwgMHgwMTk3LCAweDAxOWEsIDB4MDFhMywgMHgwMWIxLCAweDAzOGQsIDB4MDM5OCwgMHgwM2I3LCAweDAzZDMsIDB4MDNkMSwgMHgwM2RiLCAweDA3ZGQsIDB4MDBiNH0sCi0gIHsweDAzZGUsIDB4MDFhOSwgMHgwMTliLCAweDAxOWMsIDB4MDFhMSwgMHgwMWFhLCAweDAxYWQsIDB4MDFiMywgMHgwMzhiLCAweDAzYjIsIDB4MDNiOCwgMHgwM2NlLCAweDAzZTEsIDB4MDNlMCwgMHgwN2QyLCAweDA3ZTUsIDB4MDBiN30sCi0gIHsweDA3ZTMsIDB4MDFiYiwgMHgwMWE4LCAweDAxYTYsIDB4MDFiMCwgMHgwMWIyLCAweDAxYjcsIDB4MDM5YiwgMHgwMzlhLCAweDAzYmEsIDB4MDNiNSwgMHgwM2Q2LCAweDA3ZDcsIDB4MDNlNCwgMHgwN2Q4LCAweDA3ZWEsIDB4MDBiYX0sCi0gIHsweDA3ZTgsIDB4MDNhMCwgMHgwMWJkLCAweDAxYjQsIDB4MDM4YSwgMHgwMWM0LCAweDAzOTIsIDB4MDNhYSwgMHgwM2IwLCAweDAzYmMsIDB4MDNkNywgMHgwN2Q0LCAweDA3ZGMsIDB4MDdkYiwgMHgwN2Q1LCAweDA3ZjAsIDB4MDBjMX0sCi0gIHsweDA3ZmIsIDB4MDNjOCwgMHgwM2EzLCAweDAzOTUsIDB4MDM5ZCwgMHgwM2FjLCAweDAzYWUsIDB4MDNjNSwgMHgwM2Q4LCAweDAzZTIsIDB4MDNlNiwgMHgwN2U0LCAweDA3ZTcsIDB4MDdlMCwgMHgwN2U5LCAweDA3ZjcsIDB4MDE5MH0sCi0gIHsweDA3ZjIsIDB4MDM5MywgMHgwMWJlLCAweDAxYzAsIDB4MDM5NCwgMHgwMzk3LCAweDAzYWQsIDB4MDNjMywgMHgwM2MxLCAweDAzZDIsIDB4MDdkYSwgMHgwN2Q5LCAweDA3ZGYsIDB4MDdlYiwgMHgwN2Y0LCAweDA3ZmEsIDB4MDE5NX0sCi0gIHsweDA3ZjgsIDB4MDNiZCwgMHgwMzljLCAweDAzYWIsIDB4MDNhOCwgMHgwM2IzLCAweDAzYjksIDB4MDNkMCwgMHgwM2UzLCAweDAzZTUsIDB4MDdlMiwgMHgwN2RlLCAweDA3ZWQsIDB4MDdmMSwgMHgwN2Y5LCAweDA3ZmMsIDB4MDE5M30sCi0gIHsweDBmZmQsIDB4MDNkYywgMHgwM2I2LCAweDAzYzcsIDB4MDNjYywgMHgwM2NiLCAweDAzZDksIDB4MDNkYSwgMHgwN2QzLCAweDA3ZTEsIDB4MDdlZSwgMHgwN2VmLCAweDA3ZjUsIDB4MDdmNiwgMHgwZmZjLCAweDBmZmYsIDB4MDE5ZH0sCi0gIHsweDAxYzIsIDB4MDBiNSwgMHgwMGExLCAweDAwOTYsIDB4MDA5NywgMHgwMDk1LCAweDAwOTksIDB4MDBhMCwgMHgwMGEyLCAweDAwYWMsIDB4MDBhOSwgMHgwMGIxLCAweDAwYjMsIDB4MDBiYiwgMHgwMGMwLCAweDAxOGYsIDB4MDAwNH0sCi0gIHsweDAwMTgsIDB4MDAyZSwgMHgwMDAwLCAweDAwNWEsIDB4MDBhNSwgMHgwMGY4LCAweDAwYjcsIDB4MDA5NCwgMHgwMGY5LCAweDAwNGQsIDB4MDAyMSwgMHgwMDJiLCAweDAwNGYsIDB4MDA3YiwgMHgwMGJjLCAweDAwNDYsIDB4MDAxNX0sCi0gIHsweDAwNDIsIDB4MDAzNywgMHgwMDc4LCAweDAwMGQsIDB4MDA2OCwgMHgwMDVmLCAweDAwMGQsIDB4MDA1ZSwgMHgwMDVhLCAweDAwYmUsIDB4MDA2MywgMHgwMDdlLCAweDAwMWYsIDB4MDA5MiwgMHgwMDFhLCAweDAwYWIsIDB4MDAzMn0sCi0gIHsweDAwZTYsIDB4MDAzNywgMHgwMDAwLCAweDAwNTgsIDB4MDAwYiwgMHgwMDVhLCAweDAwZTEsIDB4MDA1ZCwgMHgwMDI5LCAweDAwMTcsIDB4MDA3ZSwgMHgwMDY5LCAweDAwYWEsIDB4MDA1NCwgMHgwMDI5LCAweDAwMzIsIDB4MDA0MX0sCi0gIHsweDAwNDYsIDB4MDBlYSwgMHgwMDM0LCAweDAwZWEsIDB4MDAxMSwgMHgwMDFiLCAweDAwYTksIDB4MDA5NCwgMHgwMGUyLCAweDAwMzEsIDB4MDBkMCwgMHgwMGU1LCAweDAwMDcsIDB4MDA3MCwgMHgwMDY5LCAweDAwM2UsIDB4MDAyMX0KLX07Ci0KLWNvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2N0YWJzY2ZbMTIxXT0KLXsKLSAgMHgwMDAzZmZlOCwgMHgwMDAzZmZlNiwgMHgwMDAzZmZlNywgMHgwMDAzZmZlNSwgMHgwMDA3ZmZmNSwgMHgwMDA3ZmZmMSwgMHgwMDA3ZmZlZCwgMHgwMDA3ZmZmNiwKLSAgMHgwMDA3ZmZlZSwgMHgwMDA3ZmZlZiwgMHgwMDA3ZmZmMCwgMHgwMDA3ZmZmYywgMHgwMDA3ZmZmZCwgMHgwMDA3ZmZmZiwgMHgwMDA3ZmZmZSwgMHgwMDA3ZmZmNywKLSAgMHgwMDA3ZmZmOCwgMHgwMDA3ZmZmYiwgMHgwMDA3ZmZmOSwgMHgwMDAzZmZlNCwgMHgwMDA3ZmZmYSwgMHgwMDAzZmZlMywgMHgwMDAxZmZlZiwgMHgwMDAxZmZmMCwKLSAgMHgwMDAwZmZmNSwgMHgwMDAxZmZlZSwgMHgwMDAwZmZmMiwgMHgwMDAwZmZmMywgMHgwMDAwZmZmNCwgMHgwMDAwZmZmMSwgMHgwMDAwN2ZmNiwgMHgwMDAwN2ZmNywKLSAgMHgwMDAwM2ZmOSwgMHgwMDAwM2ZmNSwgMHgwMDAwM2ZmNywgMHgwMDAwM2ZmMywgMHgwMDAwM2ZmNiwgMHgwMDAwM2ZmMiwgMHgwMDAwMWZmNywgMHgwMDAwMWZmNSwKLSAgMHgwMDAwMGZmOSwgMHgwMDAwMGZmNywgMHgwMDAwMGZmNiwgMHgwMDAwMDdmOSwgMHgwMDAwMGZmNCwgMHgwMDAwMDdmOCwgMHgwMDAwMDNmOSwgMHgwMDAwMDNmNywKLSAgMHgwMDAwMDNmNSwgMHgwMDAwMDFmOCwgMHgwMDAwMDFmNywgMHgwMDAwMDBmYSwgMHgwMDAwMDBmOCwgMHgwMDAwMDBmNiwgMHgwMDAwMDA3OSwgMHgwMDAwMDAzYSwKLSAgMHgwMDAwMDAzOCwgMHgwMDAwMDAxYSwgMHgwMDAwMDAwYiwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwYSwgMHgwMDAwMDAwYywgMHgwMDAwMDAxYiwKLSAgMHgwMDAwMDAzOSwgMHgwMDAwMDAzYiwgMHgwMDAwMDA3OCwgMHgwMDAwMDA3YSwgMHgwMDAwMDBmNywgMHgwMDAwMDBmOSwgMHgwMDAwMDFmNiwgMHgwMDAwMDFmOSwKLSAgMHgwMDAwMDNmNCwgMHgwMDAwMDNmNiwgMHgwMDAwMDNmOCwgMHgwMDAwMDdmNSwgMHgwMDAwMDdmNCwgMHgwMDAwMDdmNiwgMHgwMDAwMDdmNywgMHgwMDAwMGZmNSwKLSAgMHgwMDAwMGZmOCwgMHgwMDAwMWZmNCwgMHgwMDAwMWZmNiwgMHgwMDAwMWZmOCwgMHgwMDAwM2ZmOCwgMHgwMDAwM2ZmNCwgMHgwMDAwZmZmMCwgMHgwMDAwN2ZmNCwKLSAgMHgwMDAwZmZmNiwgMHgwMDAwN2ZmNSwgMHgwMDAzZmZlMiwgMHgwMDA3ZmZkOSwgMHgwMDA3ZmZkYSwgMHgwMDA3ZmZkYiwgMHgwMDA3ZmZkYywgMHgwMDA3ZmZkZCwKLSAgMHgwMDA3ZmZkZSwgMHgwMDA3ZmZkOCwgMHgwMDA3ZmZkMiwgMHgwMDA3ZmZkMywgMHgwMDA3ZmZkNCwgMHgwMDA3ZmZkNSwgMHgwMDA3ZmZkNiwgMHgwMDA3ZmZmMiwKLSAgMHgwMDA3ZmZkZiwgMHgwMDA3ZmZlNywgMHgwMDA3ZmZlOCwgMHgwMDA3ZmZlOSwgMHgwMDA3ZmZlYSwgMHgwMDA3ZmZlYiwgMHgwMDA3ZmZlNiwgMHgwMDA3ZmZlMCwKLSAgMHgwMDA3ZmZlMSwgMHgwMDA3ZmZlMiwgMHgwMDA3ZmZlMywgMHgwMDA3ZmZlNCwgMHgwMDA3ZmZlNSwgMHgwMDA3ZmZkNywgMHgwMDA3ZmZlYywgMHgwMDA3ZmZmNCwKLSAgMHgwMDA3ZmZmMwotfTsKK2NvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2N0YWJzY2ZbMTIxXSA9IHsKKyAgICAweDAwMDNmZmU4LCAweDAwMDNmZmU2LCAweDAwMDNmZmU3LCAweDAwMDNmZmU1LCAweDAwMDdmZmY1LCAweDAwMDdmZmYxLAorICAgIDB4MDAwN2ZmZWQsIDB4MDAwN2ZmZjYsIDB4MDAwN2ZmZWUsIDB4MDAwN2ZmZWYsIDB4MDAwN2ZmZjAsIDB4MDAwN2ZmZmMsCisgICAgMHgwMDA3ZmZmZCwgMHgwMDA3ZmZmZiwgMHgwMDA3ZmZmZSwgMHgwMDA3ZmZmNywgMHgwMDA3ZmZmOCwgMHgwMDA3ZmZmYiwKKyAgICAweDAwMDdmZmY5LCAweDAwMDNmZmU0LCAweDAwMDdmZmZhLCAweDAwMDNmZmUzLCAweDAwMDFmZmVmLCAweDAwMDFmZmYwLAorICAgIDB4MDAwMGZmZjUsIDB4MDAwMWZmZWUsIDB4MDAwMGZmZjIsIDB4MDAwMGZmZjMsIDB4MDAwMGZmZjQsIDB4MDAwMGZmZjEsCisgICAgMHgwMDAwN2ZmNiwgMHgwMDAwN2ZmNywgMHgwMDAwM2ZmOSwgMHgwMDAwM2ZmNSwgMHgwMDAwM2ZmNywgMHgwMDAwM2ZmMywKKyAgICAweDAwMDAzZmY2LCAweDAwMDAzZmYyLCAweDAwMDAxZmY3LCAweDAwMDAxZmY1LCAweDAwMDAwZmY5LCAweDAwMDAwZmY3LAorICAgIDB4MDAwMDBmZjYsIDB4MDAwMDA3ZjksIDB4MDAwMDBmZjQsIDB4MDAwMDA3ZjgsIDB4MDAwMDAzZjksIDB4MDAwMDAzZjcsCisgICAgMHgwMDAwMDNmNSwgMHgwMDAwMDFmOCwgMHgwMDAwMDFmNywgMHgwMDAwMDBmYSwgMHgwMDAwMDBmOCwgMHgwMDAwMDBmNiwKKyAgICAweDAwMDAwMDc5LCAweDAwMDAwMDNhLCAweDAwMDAwMDM4LCAweDAwMDAwMDFhLCAweDAwMDAwMDBiLCAweDAwMDAwMDA0LAorICAgIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMGMsIDB4MDAwMDAwMWIsIDB4MDAwMDAwMzksIDB4MDAwMDAwM2IsCisgICAgMHgwMDAwMDA3OCwgMHgwMDAwMDA3YSwgMHgwMDAwMDBmNywgMHgwMDAwMDBmOSwgMHgwMDAwMDFmNiwgMHgwMDAwMDFmOSwKKyAgICAweDAwMDAwM2Y0LCAweDAwMDAwM2Y2LCAweDAwMDAwM2Y4LCAweDAwMDAwN2Y1LCAweDAwMDAwN2Y0LCAweDAwMDAwN2Y2LAorICAgIDB4MDAwMDA3ZjcsIDB4MDAwMDBmZjUsIDB4MDAwMDBmZjgsIDB4MDAwMDFmZjQsIDB4MDAwMDFmZjYsIDB4MDAwMDFmZjgsCisgICAgMHgwMDAwM2ZmOCwgMHgwMDAwM2ZmNCwgMHgwMDAwZmZmMCwgMHgwMDAwN2ZmNCwgMHgwMDAwZmZmNiwgMHgwMDAwN2ZmNSwKKyAgICAweDAwMDNmZmUyLCAweDAwMDdmZmQ5LCAweDAwMDdmZmRhLCAweDAwMDdmZmRiLCAweDAwMDdmZmRjLCAweDAwMDdmZmRkLAorICAgIDB4MDAwN2ZmZGUsIDB4MDAwN2ZmZDgsIDB4MDAwN2ZmZDIsIDB4MDAwN2ZmZDMsIDB4MDAwN2ZmZDQsIDB4MDAwN2ZmZDUsCisgICAgMHgwMDA3ZmZkNiwgMHgwMDA3ZmZmMiwgMHgwMDA3ZmZkZiwgMHgwMDA3ZmZlNywgMHgwMDA3ZmZlOCwgMHgwMDA3ZmZlOSwKKyAgICAweDAwMDdmZmVhLCAweDAwMDdmZmViLCAweDAwMDdmZmU2LCAweDAwMDdmZmUwLCAweDAwMDdmZmUxLCAweDAwMDdmZmUyLAorICAgIDB4MDAwN2ZmZTMsIDB4MDAwN2ZmZTQsIDB4MDAwN2ZmZTUsIDB4MDAwN2ZmZDcsIDB4MDAwN2ZmZWMsIDB4MDAwN2ZmZjQsCisgICAgMHgwMDA3ZmZmM307CiAKIC8qCiAgIHRhYmxlIG9mICgwLjUwMDAwLi4uMS4wMDAwMCkgXjAuNzUKICovCi1jb25zdCBGSVhQX1FURCBGREthYWNFbmNfbVRhYl8zXzRbTUFOVF9TSVpFXSA9Ci17Ci0gIFFUQygweDRjMWJmODI5KSwgUVRDKDB4NGMzODgwZGUpLCBRVEMoMHg0YzU1MDYwMyksIFFUQygweDRjNzE4NzljKSwgUVRDKDB4NGM4ZTA1YWEpLCBRVEMoMHg0Y2FhODAzMCksIFFUQygweDRjYzZmNzJmKSwgUVRDKDB4NGNlMzZhYWIpLAotICBRVEMoMHg0Y2ZmZGFhNCksIFFUQygweDRkMWM0NzFkKSwgUVRDKDB4NGQzOGIwMTkpLCBRVEMoMHg0ZDU1MTU5YSksIFFUQygweDRkNzE3N2ExKSwgUVRDKDB4NGQ4ZGQ2MzEpLCBRVEMoMHg0ZGFhMzE0YiksIFFUQygweDRkYzY4OGYzKSwKLSAgUVRDKDB4NGRlMmRkMmEpLCBRVEMoMHg0ZGZmMmRmMiksIFFUQygweDRlMWI3YjRkKSwgUVRDKDB4NGUzN2M1M2QpLCBRVEMoMHg0ZTU0MGJjNSksIFFUQygweDRlNzA0ZWU2KSwgUVRDKDB4NGU4YzhlYTMpLCBRVEMoMHg0ZWE4Y2FmZCksCi0gIFFUQygweDRlYzUwM2Y3KSwgUVRDKDB4NGVlMTM5OTIpLCBRVEMoMHg0ZWZkNmJkMCksIFFUQygweDRmMTk5YWI0KSwgUVRDKDB4NGYzNWM2NDApLCBRVEMoMHg0ZjUxZWU3NSksIFFUQygweDRmNmUxMzU2KSwgUVRDKDB4NGY4YTM0ZTQpLAotICBRVEMoMHg0ZmE2NTMyMSksIFFUQygweDRmYzI2ZTEwKSwgUVRDKDB4NGZkZTg1YjIpLCBRVEMoMHg0ZmZhOWEwYSksIFFUQygweDUwMTZhYjE4KSwgUVRDKDB4NTAzMmI4ZTApLCBRVEMoMHg1MDRlYzM2MiksIFFUQygweDUwNmFjYWExKSwKLSAgUVRDKDB4NTA4NmNlYTApLCBRVEMoMHg1MGEyY2Y1ZSksIFFUQygweDUwYmVjY2UwKSwgUVRDKDB4NTBkYWM3MjUpLCBRVEMoMHg1MGY2YmUzMSksIFFUQygweDUxMTJiMjA1KSwgUVRDKDB4NTEyZWEyYTMpLCBRVEMoMHg1MTRhOTAwZCksCi0gIFFUQygweDUxNjY3YTQ1KSwgUVRDKDB4NTE4MjYxNGMpLCBRVEMoMHg1MTllNDUyNCksIFFUQygweDUxYmEyNWNmKSwgUVRDKDB4NTFkNjAzNTApLCBRVEMoMHg1MWYxZGRhNyksIFFUQygweDUyMGRiNGQ2KSwgUVRDKDB4NTIyOTg4ZTApLAotICBRVEMoMHg1MjQ1NTljNiksIFFUQygweDUyNjEyNzg5KSwgUVRDKDB4NTI3Y2YyMmQpLCBRVEMoMHg1Mjk4YjliMSksIFFUQygweDUyYjQ3ZTE5KSwgUVRDKDB4NTJkMDNmNjUpLCBRVEMoMHg1MmViZmQ5OCksIFFUQygweDUzMDdiOGI0KSwKLSAgUVRDKDB4NTMyMzcwYjkpLCBRVEMoMHg1MzNmMjVhYSksIFFUQygweDUzNWFkNzg5KSwgUVRDKDB4NTM3Njg2NTYpLCBRVEMoMHg1MzkyMzIxNSksIFFUQygweDUzYWRkYWM2KSwgUVRDKDB4NTNjOTgwNmIpLCBRVEMoMHg1M2U1MjMwNiksCi0gIFFUQygweDU0MDBjMjk4KSwgUVRDKDB4NTQxYzVmMjQpLCBRVEMoMHg1NDM3ZjhhYiksIFFUQygweDU0NTM4ZjJlKSwgUVRDKDB4NTQ2ZjIyYWYpLCBRVEMoMHg1NDhhYjMzMCksIFFUQygweDU0YTY0MGIzKSwgUVRDKDB4NTRjMWNiMzgpLAotICBRVEMoMHg1NGRkNTJjMiksIFFUQygweDU0ZjhkNzUzKSwgUVRDKDB4NTUxNDU4ZWIpLCBRVEMoMHg1NTJmZDc4ZCksIFFUQygweDU1NGI1MzM5KSwgUVRDKDB4NTU2NmNiZjMpLCBRVEMoMHg1NTgyNDFiYiksIFFUQygweDU1OWRiNDkyKSwKLSAgUVRDKDB4NTViOTI0N2IpLCBRVEMoMHg1NWQ0OTE3NyksIFFUQygweDU1ZWZmYjg3KSwgUVRDKDB4NTYwYjYyYWQpLCBRVEMoMHg1NjI2YzZlYiksIFFUQygweDU2NDIyODQyKSwgUVRDKDB4NTY1ZDg2YjQpLCBRVEMoMHg1Njc4ZTI0MiksCi0gIFFUQygweDU2OTQzYWVlKSwgUVRDKDB4NTZhZjkwYjkpLCBRVEMoMHg1NmNhZTNhNCksIFFUQygweDU2ZTYzM2IyKSwgUVRDKDB4NTcwMTgwZTQpLCBRVEMoMHg1NzFjY2IzYiksIFFUQygweDU3MzgxMmI4KSwgUVRDKDB4NTc1MzU3NWUpLAotICBRVEMoMHg1NzZlOTkyZSksIFFUQygweDU3ODlkODI5KSwgUVRDKDB4NTdhNTE0NTApLCBRVEMoMHg1N2MwNGRhNiksIFFUQygweDU3ZGI4NDJiKSwgUVRDKDB4NTdmNmI3ZTEpLCBRVEMoMHg1ODExZThjOSksIFFUQygweDU4MmQxNmU2KSwKLSAgUVRDKDB4NTg0ODQyMzgpLCBRVEMoMHg1ODYzNmFjMCksIFFUQygweDU4N2U5MDgxKSwgUVRDKDB4NTg5OWIzN2MpLCBRVEMoMHg1OGI0ZDNiMSksIFFUQygweDU4Y2ZmMTIzKSwgUVRDKDB4NThlYjBiZDMpLCBRVEMoMHg1OTA2MjNjMiksCi0gIFFUQygweDU5MjEzOGYyKSwgUVRDKDB4NTkzYzRiNjMpLCBRVEMoMHg1OTU3NWIxOSksIFFUQygweDU5NzI2ODEyKSwgUVRDKDB4NTk4ZDcyNTMpLCBRVEMoMHg1OWE4NzlkYSksIFFUQygweDU5YzM3ZWFiKSwgUVRDKDB4NTlkZTgwYzYpLAotICBRVEMoMHg1OWY5ODAyZCksIFFUQygweDVhMTQ3Y2UwKSwgUVRDKDB4NWEyZjc2ZTIpLCBRVEMoMHg1YTRhNmUzNCksIFFUQygweDVhNjU2MmQ2KSwgUVRDKDB4NWE4MDU0Y2IpLCBRVEMoMHg1YTliNDQxNCksIFFUQygweDVhYjYzMGIyKSwKLSAgUVRDKDB4NWFkMTFhYTYpLCBRVEMoMHg1YWVjMDFmMSksIFFUQygweDViMDZlNjk2KSwgUVRDKDB4NWIyMWM4OTUpLCBRVEMoMHg1YjNjYTdlZiksIFFUQygweDViNTc4NGE2KSwgUVRDKDB4NWI3MjVlYmMpLCBRVEMoMHg1YjhkMzYzMSksCi0gIFFUQygweDViYTgwYjA2KSwgUVRDKDB4NWJjMmRkM2UpLCBRVEMoMHg1YmRkYWNkOSksIFFUQygweDViZjg3OWQ4KSwgUVRDKDB4NWMxMzQ0M2QpLCBRVEMoMHg1YzJlMGMwOSksIFFUQygweDVjNDhkMTNlKSwgUVRDKDB4NWM2MzkzZGMpLAotICBRVEMoMHg1YzdlNTNlNSksIFFUQygweDVjOTkxMTVhKSwgUVRDKDB4NWNiM2NjM2MpLCBRVEMoMHg1Y2NlODQ4ZCksIFFUQygweDVjZTkzYTRlKSwgUVRDKDB4NWQwM2VkODApLCBRVEMoMHg1ZDFlOWUyNCksIFFUQygweDVkMzk0YzNiKSwKLSAgUVRDKDB4NWQ1M2Y3YzcpLCBRVEMoMHg1ZDZlYTBjOSksIFFUQygweDVkODk0NzQyKSwgUVRDKDB4NWRhM2ViMzMpLCBRVEMoMHg1ZGJlOGM5ZSksIFFUQygweDVkZDkyYjg0KSwgUVRDKDB4NWRmM2M3ZTUpLCBRVEMoMHg1ZTBlNjFjMyksCi0gIFFUQygweDVlMjhmOTIwKSwgUVRDKDB4NWU0MzhkZmMpLCBRVEMoMHg1ZTVlMjA1OSksIFFUQygweDVlNzhiMDM3KSwgUVRDKDB4NWU5MzNkOTkpLCBRVEMoMHg1ZWFkYzg3ZSksIFFUQygweDVlYzg1MGU5KSwgUVRDKDB4NWVlMmQ2ZGEpLAotICBRVEMoMHg1ZWZkNWE1MyksIFFUQygweDVmMTdkYjU0KSwgUVRDKDB4NWYzMjU5ZTApLCBRVEMoMHg1ZjRjZDVmNiksIFFUQygweDVmNjc0Zjk5KSwgUVRDKDB4NWY4MWM2YzgpLCBRVEMoMHg1ZjljM2I4NyksIFFUQygweDVmYjZhZGQ0KSwKLSAgUVRDKDB4NWZkMTFkYjMpLCBRVEMoMHg1ZmViOGIyMyksIFFUQygweDYwMDVmNjI2KSwgUVRDKDB4NjAyMDVlYmQpLCBRVEMoMHg2MDNhYzRlOSksIFFUQygweDYwNTUyOGFjKSwgUVRDKDB4NjA2ZjhhMDUpLCBRVEMoMHg2MDg5ZThmNyksCi0gIFFUQygweDYwYTQ0NTgzKSwgUVRDKDB4NjBiZTlmYTkpLCBRVEMoMHg2MGQ4Zjc2YiksIFFUQygweDYwZjM0Y2NhKSwgUVRDKDB4NjEwZDlmYzcpLCBRVEMoMHg2MTI3ZjA2MiksIFFUQygweDYxNDIzZTllKSwgUVRDKDB4NjE1YzhhN2EpLAotICBRVEMoMHg2MTc2ZDNmOSksIFFUQygweDYxOTExYjFiKSwgUVRDKDB4NjFhYjVmZTEpLCBRVEMoMHg2MWM1YTI0ZCksIFFUQygweDYxZGZlMjVmKSwgUVRDKDB4NjFmYTIwMTgpLCBRVEMoMHg2MjE0NWI3YSksIFFUQygweDYyMmU5NDg1KSwKLSAgUVRDKDB4NjI0OGNiM2IpLCBRVEMoMHg2MjYyZmY5ZCksIFFUQygweDYyN2QzMWFiKSwgUVRDKDB4NjI5NzYxNjcpLCBRVEMoMHg2MmIxOGVkMSksIFFUQygweDYyY2JiOWViKSwgUVRDKDB4NjJlNWUyYjYpLCBRVEMoMHg2MzAwMDkzMyksCi0gIFFUQygweDYzMWEyZDYyKSwgUVRDKDB4NjMzNDRmNDUpLCBRVEMoMHg2MzRlNmVkZCksIFFUQygweDYzNjg4YzJiKSwgUVRDKDB4NjM4MmE3MzApLCBRVEMoMHg2MzljYmZlYyksIFFUQygweDYzYjZkNjYxKSwgUVRDKDB4NjNkMGVhOTApLAotICBRVEMoMHg2M2VhZmM3YSksIFFUQygweDY0MDUwYzFmKSwgUVRDKDB4NjQxZjE5ODIpLCBRVEMoMHg2NDM5MjRhMiksIFFUQygweDY0NTMyZDgwKSwgUVRDKDB4NjQ2ZDM0MWYpLCBRVEMoMHg2NDg3Mzg3ZSksIFFUQygweDY0YTEzYTllKSwKLSAgUVRDKDB4NjRiYjNhODEpLCBRVEMoMHg2NGQ1MzgyOCksIFFUQygweDY0ZWYzMzkzKSwgUVRDKDB4NjUwOTJjYzQpLCBRVEMoMHg2NTIzMjNiYiksIFFUQygweDY1M2QxODc5KSwgUVRDKDB4NjU1NzBiMDApLCBRVEMoMHg2NTcwZmI1MCksCi0gIFFUQygweDY1OGFlOTZiKSwgUVRDKDB4NjVhNGQ1NTApLCBRVEMoMHg2NWJlYmYwMSksIFFUQygweDY1ZDhhNjgwKSwgUVRDKDB4NjVmMjhiY2MpLCBRVEMoMHg2NjBjNmVlOCksIFFUQygweDY2MjY0ZmQzKSwgUVRDKDB4NjY0MDJlOGYpLAotICBRVEMoMHg2NjVhMGIxYyksIFFUQygweDY2NzNlNTdkKSwgUVRDKDB4NjY4ZGJkYjApLCBRVEMoMHg2NmE3OTNiOCksIFFUQygweDY2YzE2Nzk1KSwgUVRDKDB4NjZkYjM5NDkpLCBRVEMoMHg2NmY1MDhkNCksIFFUQygweDY3MGVkNjM2KSwKLSAgUVRDKDB4NjcyOGExNzIpLCBRVEMoMHg2NzQyNmE4NyksIFFUQygweDY3NWMzMTc3KSwgUVRDKDB4Njc3NWY2NDMpLCBRVEMoMHg2NzhmYjhlYiksIFFUQygweDY3YTk3OTcxKSwgUVRDKDB4NjdjMzM3ZDUpLCBRVEMoMHg2N2RjZjQxOCksCi0gIFFUQygweDY3ZjZhZTNiKSwgUVRDKDB4NjgxMDY2M2YpLCBRVEMoMHg2ODJhMWMyNSksIFFUQygweDY4NDNjZmVkKSwgUVRDKDB4Njg1ZDgxOTkpLCBRVEMoMHg2ODc3MzEyOSksIFFUQygweDY4OTBkZTlmKSwgUVRDKDB4NjhhYTg5ZmEpLAotICBRVEMoMHg2OGM0MzMzZCksIFFUQygweDY4ZGRkYTY3KSwgUVRDKDB4NjhmNzdmN2EpLCBRVEMoMHg2OTExMjI3NyksIFFUQygweDY5MmFjMzVlKSwgUVRDKDB4Njk0NDYyMzApLCBRVEMoMHg2OTVkZmVlZSksIFFUQygweDY5Nzc5OTlhKSwKLSAgUVRDKDB4Njk5MTMyMzIpLCBRVEMoMHg2OWFhYzhiYSksIFFUQygweDY5YzQ1ZDMxKSwgUVRDKDB4NjlkZGVmOTgpLCBRVEMoMHg2OWY3N2ZmMCksIFFUQygweDZhMTEwZTNhKSwgUVRDKDB4NmEyYTlhNzcpLCBRVEMoMHg2YTQ0MjRhOCksCi0gIFFUQygweDZhNWRhY2NjKSwgUVRDKDB4NmE3NzMyZTYpLCBRVEMoMHg2YTkwYjZmNiksIFFUQygweDZhYWEzOGZkKSwgUVRDKDB4NmFjM2I4ZmIpLCBRVEMoMHg2YWRkMzZmMiksIFFUQygweDZhZjZiMmUyKSwgUVRDKDB4NmIxMDJjY2QpLAotICBRVEMoMHg2YjI5YTRiMiksIFFUQygweDZiNDMxYTkyKSwgUVRDKDB4NmI1YzhlNmYpLCBRVEMoMHg2Yjc2MDA0YSksIFFUQygweDZiOGY3MDIyKSwgUVRDKDB4NmJhOGRkZjkpLCBRVEMoMHg2YmMyNDlkMCksIFFUQygweDZiZGJiM2E3KSwKLSAgUVRDKDB4NmJmNTFiODApLCBRVEMoMHg2YzBlODE1YSksIFFUQygweDZjMjdlNTM3KSwgUVRDKDB4NmM0MTQ3MTgpLCBRVEMoMHg2YzVhYTZmZCksIFFUQygweDZjNzQwNGU3KSwgUVRDKDB4NmM4ZDYwZDcpLCBRVEMoMHg2Y2E2YmFjZSksCi0gIFFUQygweDZjYzAxMmNjKSwgUVRDKDB4NmNkOTY4ZDIpLCBRVEMoMHg2Y2YyYmNlMSksIFFUQygweDZkMGMwZWY5KSwgUVRDKDB4NmQyNTVmMWQpLCBRVEMoMHg2ZDNlYWQ0YiksIFFUQygweDZkNTdmOTg1KSwgUVRDKDB4NmQ3MTQzY2MpLAotICBRVEMoMHg2ZDhhOGMyMSksIFFUQygweDZkYTNkMjgzKSwgUVRDKDB4NmRiZDE2ZjUpLCBRVEMoMHg2ZGQ2NTk3NiksIFFUQygweDZkZWY5YTA4KSwgUVRDKDB4NmUwOGQ4YWIpLCBRVEMoMHg2ZTIyMTU2MCksIFFUQygweDZlM2I1MDI3KSwKLSAgUVRDKDB4NmU1NDg5MDIpLCBRVEMoMHg2ZTZkYmZmMSksIFFUQygweDZlODZmNGY1KSwgUVRDKDB4NmVhMDI4MGUpLCBRVEMoMHg2ZWI5NTkzZSksIFFUQygweDZlZDI4ODg1KSwgUVRDKDB4NmVlYmI1ZTMpLCBRVEMoMHg2ZjA0ZTE1YSksCi0gIFFUQygweDZmMWUwYWVhKSwgUVRDKDB4NmYzNzMyOTQpLCBRVEMoMHg2ZjUwNTg1OSksIFFUQygweDZmNjk3YzM5KSwgUVRDKDB4NmY4MjllMzUpLCBRVEMoMHg2ZjliYmU0ZSksIFFUQygweDZmYjRkYzg1KSwgUVRDKDB4NmZjZGY4ZDkpLAotICBRVEMoMHg2ZmU3MTM0ZCksIFFUQygweDcwMDAyYmUwKSwgUVRDKDB4NzAxOTQyOTMpLCBRVEMoMHg3MDMyNTc2NyksIFFUQygweDcwNGI2YTVkKSwgUVRDKDB4NzA2NDdiNzYpLCBRVEMoMHg3MDdkOGFiMSksIFFUQygweDcwOTY5ODExKSwKLSAgUVRDKDB4NzBhZmEzOTQpLCBRVEMoMHg3MGM4YWQzZCksIFFUQygweDcwZTFiNTBjKSwgUVRDKDB4NzBmYWJiMDEpLCBRVEMoMHg3MTEzYmYxZCksIFFUQygweDcxMmNjMTYxKSwgUVRDKDB4NzE0NWMxY2UpLCBRVEMoMHg3MTVlYzA2NCksCi0gIFFUQygweDcxNzdiZDI0KSwgUVRDKDB4NzE5MGI4MGYpLCBRVEMoMHg3MWE5YjEyNCksIFFUQygweDcxYzJhODY2KSwgUVRDKDB4NzFkYjlkZDQpLCBRVEMoMHg3MWY0OTE3MCksIFFUQygweDcyMGQ4MzM5KSwgUVRDKDB4NzIyNjczMzEpLAotICBRVEMoMHg3MjNmNjE1OSksIFFUQygweDcyNTg0ZGIwKSwgUVRDKDB4NzI3MTM4MzgpLCBRVEMoMHg3MjhhMjBmMSksIFFUQygweDcyYTMwN2RiKSwgUVRDKDB4NzJiYmVjZjkpLCBRVEMoMHg3MmQ0ZDA0OSksIFFUQygweDcyZWRiMWNlKSwKLSAgUVRDKDB4NzMwNjkxODcpLCBRVEMoMHg3MzFmNmY3NSksIFFUQygweDczMzg0Yjk4KSwgUVRDKDB4NzM1MTI1ZjMpLCBRVEMoMHg3MzY5ZmU4NCksIFFUQygweDczODJkNTRkKSwgUVRDKDB4NzM5YmFhNGUpLCBRVEMoMHg3M2I0N2Q4OSksCi0gIFFUQygweDczY2Q0ZWZkKSwgUVRDKDB4NzNlNjFlYWIpLCBRVEMoMHg3M2ZlZWM5NCksIFFUQygweDc0MTdiOGI4KSwgUVRDKDB4NzQzMDgzMTkpLCBRVEMoMHg3NDQ5NGJiNiksIFFUQygweDc0NjIxMjkxKSwgUVRDKDB4NzQ3YWQ3YWEpLAotICBRVEMoMHg3NDkzOWIwMiksIFFUQygweDc0YWM1Yzk4KSwgUVRDKDB4NzRjNTFjNmYpLCBRVEMoMHg3NGRkZGE4NiksIFFUQygweDc0ZjY5NmRlKSwgUVRDKDB4NzUwZjUxNzgpLCBRVEMoMHg3NTI4MGE1NCksIFFUQygweDc1NDBjMTc0KSwKLSAgUVRDKDB4NzU1OTc2ZDcpLCBRVEMoMHg3NTcyMmE3ZSksIFFUQygweDc1OGFkYzY5KSwgUVRDKDB4NzVhMzhjOWIpLCBRVEMoMHg3NWJjM2IxMiksIFFUQygweDc1ZDRlN2NmKSwgUVRDKDB4NzVlZDkyZDQpLCBRVEMoMHg3NjA2M2MyMSksCi0gIFFUQygweDc2MWVlM2I2KSwgUVRDKDB4NzYzNzg5OTQpLCBRVEMoMHg3NjUwMmRiYyksIFFUQygweDc2NjhkMDJlKSwgUVRDKDB4NzY4MTcwZWIpLCBRVEMoMHg3NjlhMGZmMyksIFFUQygweDc2YjJhZDQ3KSwgUVRDKDB4NzZjYjQ4ZTcpLAotICBRVEMoMHg3NmUzZTJkNSksIFFUQygweDc2ZmM3YjEwKSwgUVRDKDB4NzcxNTExOWEpLCBRVEMoMHg3NzJkYTY3MyksIFFUQygweDc3NDYzOTliKSwgUVRDKDB4Nzc1ZWNiMTMpLCBRVEMoMHg3Nzc3NWFkYyksIFFUQygweDc3OGZlOGY2KSwKLSAgUVRDKDB4NzdhODc1NjEpLCBRVEMoMHg3N2MxMDAxZiksIFFUQygweDc3ZDk4OTMwKSwgUVRDKDB4NzdmMjEwOTUpLCBRVEMoMHg3ODBhOTY0ZCksIFFUQygweDc4MjMxYTViKSwgUVRDKDB4NzgzYjljYmQpLCBRVEMoMHg3ODU0MWQ3NSksCi0gIFFUQygweDc4NmM5Yzg0KSwgUVRDKDB4Nzg4NTE5ZTkpLCBRVEMoMHg3ODlkOTVhNiksIFFUQygweDc4YjYwZmJiKSwgUVRDKDB4NzhjZTg4MjgpLCBRVEMoMHg3OGU2ZmVlZiksIFFUQygweDc4ZmY3NDBmKSwgUVRDKDB4NzkxN2U3OGEpLAotICBRVEMoMHg3OTMwNTk1ZiksIFFUQygweDc5NDhjOTkwKSwgUVRDKDB4Nzk2MTM4MWQpLCBRVEMoMHg3OTc5YTUwNiksIFFUQygweDc5OTIxMDRjKSwgUVRDKDB4NzlhYTc5ZjApLCBRVEMoMHg3OWMyZTFmMSksIFFUQygweDc5ZGI0ODUyKSwKLSAgUVRDKDB4NzlmM2FkMTEpLCBRVEMoMHg3YTBjMTAzMSksIFFUQygweDdhMjQ3MWIwKSwgUVRDKDB4N2EzY2QxOTEpLCBRVEMoMHg3YTU1MmZkMyksIFFUQygweDdhNmQ4Yzc2KSwgUVRDKDB4N2E4NWU3N2QpLCBRVEMoMHg3YTllNDBlNiksCi0gIFFUQygweDdhYjY5OGIyKSwgUVRDKDB4N2FjZWVlZTMpLCBRVEMoMHg3YWU3NDM3OCksIFFUQygweDdhZmY5NjczKSwgUVRDKDB4N2IxN2U3ZDIpLCBRVEMoMHg3YjMwMzc5OSksIFFUQygweDdiNDg4NWM1KSwgUVRDKDB4N2I2MGQyNTkpLAotICBRVEMoMHg3Yjc5MWQ1NSksIFFUQygweDdiOTE2NmI5KSwgUVRDKDB4N2JhOWFlODYpLCBRVEMoMHg3YmMxZjRiYyksIFFUQygweDdiZGEzOTVjKSwgUVRDKDB4N2JmMjdjNjYpLCBRVEMoMHg3YzBhYmRkYiksIFFUQygweDdjMjJmZGJiKSwKLSAgUVRDKDB4N2MzYjNjMDcpLCBRVEMoMHg3YzUzNzhjMCksIFFUQygweDdjNmJiM2U1KSwgUVRDKDB4N2M4M2VkNzgpLCBRVEMoMHg3YzljMjU3OSksIFFUQygweDdjYjQ1YmU5KSwgUVRDKDB4N2NjYzkwYzcpLCBRVEMoMHg3Y2U0YzQxNCksCi0gIFFUQygweDdjZmNmNWQyKSwgUVRDKDB4N2QxNTI2MDApLCBRVEMoMHg3ZDJkNTQ5ZiksIFFUQygweDdkNDU4MWIwKSwgUVRDKDB4N2Q1ZGFkMzIpLCBRVEMoMHg3ZDc1ZDcyNyksIFFUQygweDdkOGRmZjhmKSwgUVRDKDB4N2RhNjI2NmEpLAotICBRVEMoMHg3ZGJlNGJiYSksIFFUQygweDdkZDY2ZjdkKSwgUVRDKDB4N2RlZTkxYjYpLCBRVEMoMHg3ZTA2YjI2NCksIFFUQygweDdlMWVkMTg4KSwgUVRDKDB4N2UzNmVmMjIpLCBRVEMoMHg3ZTRmMGIzNCksIFFUQygweDdlNjcyNWJkKSwKLSAgUVRDKDB4N2U3ZjNlYmQpLCBRVEMoMHg3ZTk3NTYzNiksIFFUQygweDdlYWY2YzI4KSwgUVRDKDB4N2VjNzgwOTMpLCBRVEMoMHg3ZWRmOTM3OCksIFFUQygweDdlZjdhNGQ3KSwgUVRDKDB4N2YwZmI0YjEpLCBRVEMoMHg3ZjI3YzMwNyksCi0gIFFUQygweDdmM2ZjZmQ4KSwgUVRDKDB4N2Y1N2RiMjUpLCBRVEMoMHg3ZjZmZTRlZiksIFFUQygweDdmODdlZDM2KSwgUVRDKDB4N2Y5ZmYzZmIpLCBRVEMoMHg3ZmI3ZjkzZSksIFFUQygweDdmY2ZmY2ZmKSwgUVRDKDB4N2ZlN2ZmNDApCi19OworY29uc3QgRklYUF9RVEQgRkRLYWFjRW5jX21UYWJfM180W01BTlRfU0laRV0gPSB7CisgICAgUVRDKDB4NGMxYmY4MjkpLCBRVEMoMHg0YzM4ODBkZSksIFFUQygweDRjNTUwNjAzKSwgUVRDKDB4NGM3MTg3OWMpLAorICAgIFFUQygweDRjOGUwNWFhKSwgUVRDKDB4NGNhYTgwMzApLCBRVEMoMHg0Y2M2ZjcyZiksIFFUQygweDRjZTM2YWFiKSwKKyAgICBRVEMoMHg0Y2ZmZGFhNCksIFFUQygweDRkMWM0NzFkKSwgUVRDKDB4NGQzOGIwMTkpLCBRVEMoMHg0ZDU1MTU5YSksCisgICAgUVRDKDB4NGQ3MTc3YTEpLCBRVEMoMHg0ZDhkZDYzMSksIFFUQygweDRkYWEzMTRiKSwgUVRDKDB4NGRjNjg4ZjMpLAorICAgIFFUQygweDRkZTJkZDJhKSwgUVRDKDB4NGRmZjJkZjIpLCBRVEMoMHg0ZTFiN2I0ZCksIFFUQygweDRlMzdjNTNkKSwKKyAgICBRVEMoMHg0ZTU0MGJjNSksIFFUQygweDRlNzA0ZWU2KSwgUVRDKDB4NGU4YzhlYTMpLCBRVEMoMHg0ZWE4Y2FmZCksCisgICAgUVRDKDB4NGVjNTAzZjcpLCBRVEMoMHg0ZWUxMzk5MiksIFFUQygweDRlZmQ2YmQwKSwgUVRDKDB4NGYxOTlhYjQpLAorICAgIFFUQygweDRmMzVjNjQwKSwgUVRDKDB4NGY1MWVlNzUpLCBRVEMoMHg0ZjZlMTM1NiksIFFUQygweDRmOGEzNGU0KSwKKyAgICBRVEMoMHg0ZmE2NTMyMSksIFFUQygweDRmYzI2ZTEwKSwgUVRDKDB4NGZkZTg1YjIpLCBRVEMoMHg0ZmZhOWEwYSksCisgICAgUVRDKDB4NTAxNmFiMTgpLCBRVEMoMHg1MDMyYjhlMCksIFFUQygweDUwNGVjMzYyKSwgUVRDKDB4NTA2YWNhYTEpLAorICAgIFFUQygweDUwODZjZWEwKSwgUVRDKDB4NTBhMmNmNWUpLCBRVEMoMHg1MGJlY2NlMCksIFFUQygweDUwZGFjNzI1KSwKKyAgICBRVEMoMHg1MGY2YmUzMSksIFFUQygweDUxMTJiMjA1KSwgUVRDKDB4NTEyZWEyYTMpLCBRVEMoMHg1MTRhOTAwZCksCisgICAgUVRDKDB4NTE2NjdhNDUpLCBRVEMoMHg1MTgyNjE0YyksIFFUQygweDUxOWU0NTI0KSwgUVRDKDB4NTFiYTI1Y2YpLAorICAgIFFUQygweDUxZDYwMzUwKSwgUVRDKDB4NTFmMWRkYTcpLCBRVEMoMHg1MjBkYjRkNiksIFFUQygweDUyMjk4OGUwKSwKKyAgICBRVEMoMHg1MjQ1NTljNiksIFFUQygweDUyNjEyNzg5KSwgUVRDKDB4NTI3Y2YyMmQpLCBRVEMoMHg1Mjk4YjliMSksCisgICAgUVRDKDB4NTJiNDdlMTkpLCBRVEMoMHg1MmQwM2Y2NSksIFFUQygweDUyZWJmZDk4KSwgUVRDKDB4NTMwN2I4YjQpLAorICAgIFFUQygweDUzMjM3MGI5KSwgUVRDKDB4NTMzZjI1YWEpLCBRVEMoMHg1MzVhZDc4OSksIFFUQygweDUzNzY4NjU2KSwKKyAgICBRVEMoMHg1MzkyMzIxNSksIFFUQygweDUzYWRkYWM2KSwgUVRDKDB4NTNjOTgwNmIpLCBRVEMoMHg1M2U1MjMwNiksCisgICAgUVRDKDB4NTQwMGMyOTgpLCBRVEMoMHg1NDFjNWYyNCksIFFUQygweDU0MzdmOGFiKSwgUVRDKDB4NTQ1MzhmMmUpLAorICAgIFFUQygweDU0NmYyMmFmKSwgUVRDKDB4NTQ4YWIzMzApLCBRVEMoMHg1NGE2NDBiMyksIFFUQygweDU0YzFjYjM4KSwKKyAgICBRVEMoMHg1NGRkNTJjMiksIFFUQygweDU0ZjhkNzUzKSwgUVRDKDB4NTUxNDU4ZWIpLCBRVEMoMHg1NTJmZDc4ZCksCisgICAgUVRDKDB4NTU0YjUzMzkpLCBRVEMoMHg1NTY2Y2JmMyksIFFUQygweDU1ODI0MWJiKSwgUVRDKDB4NTU5ZGI0OTIpLAorICAgIFFUQygweDU1YjkyNDdiKSwgUVRDKDB4NTVkNDkxNzcpLCBRVEMoMHg1NWVmZmI4NyksIFFUQygweDU2MGI2MmFkKSwKKyAgICBRVEMoMHg1NjI2YzZlYiksIFFUQygweDU2NDIyODQyKSwgUVRDKDB4NTY1ZDg2YjQpLCBRVEMoMHg1Njc4ZTI0MiksCisgICAgUVRDKDB4NTY5NDNhZWUpLCBRVEMoMHg1NmFmOTBiOSksIFFUQygweDU2Y2FlM2E0KSwgUVRDKDB4NTZlNjMzYjIpLAorICAgIFFUQygweDU3MDE4MGU0KSwgUVRDKDB4NTcxY2NiM2IpLCBRVEMoMHg1NzM4MTJiOCksIFFUQygweDU3NTM1NzVlKSwKKyAgICBRVEMoMHg1NzZlOTkyZSksIFFUQygweDU3ODlkODI5KSwgUVRDKDB4NTdhNTE0NTApLCBRVEMoMHg1N2MwNGRhNiksCisgICAgUVRDKDB4NTdkYjg0MmIpLCBRVEMoMHg1N2Y2YjdlMSksIFFUQygweDU4MTFlOGM5KSwgUVRDKDB4NTgyZDE2ZTYpLAorICAgIFFUQygweDU4NDg0MjM4KSwgUVRDKDB4NTg2MzZhYzApLCBRVEMoMHg1ODdlOTA4MSksIFFUQygweDU4OTliMzdjKSwKKyAgICBRVEMoMHg1OGI0ZDNiMSksIFFUQygweDU4Y2ZmMTIzKSwgUVRDKDB4NThlYjBiZDMpLCBRVEMoMHg1OTA2MjNjMiksCisgICAgUVRDKDB4NTkyMTM4ZjIpLCBRVEMoMHg1OTNjNGI2MyksIFFUQygweDU5NTc1YjE5KSwgUVRDKDB4NTk3MjY4MTIpLAorICAgIFFUQygweDU5OGQ3MjUzKSwgUVRDKDB4NTlhODc5ZGEpLCBRVEMoMHg1OWMzN2VhYiksIFFUQygweDU5ZGU4MGM2KSwKKyAgICBRVEMoMHg1OWY5ODAyZCksIFFUQygweDVhMTQ3Y2UwKSwgUVRDKDB4NWEyZjc2ZTIpLCBRVEMoMHg1YTRhNmUzNCksCisgICAgUVRDKDB4NWE2NTYyZDYpLCBRVEMoMHg1YTgwNTRjYiksIFFUQygweDVhOWI0NDE0KSwgUVRDKDB4NWFiNjMwYjIpLAorICAgIFFUQygweDVhZDExYWE2KSwgUVRDKDB4NWFlYzAxZjEpLCBRVEMoMHg1YjA2ZTY5NiksIFFUQygweDViMjFjODk1KSwKKyAgICBRVEMoMHg1YjNjYTdlZiksIFFUQygweDViNTc4NGE2KSwgUVRDKDB4NWI3MjVlYmMpLCBRVEMoMHg1YjhkMzYzMSksCisgICAgUVRDKDB4NWJhODBiMDYpLCBRVEMoMHg1YmMyZGQzZSksIFFUQygweDViZGRhY2Q5KSwgUVRDKDB4NWJmODc5ZDgpLAorICAgIFFUQygweDVjMTM0NDNkKSwgUVRDKDB4NWMyZTBjMDkpLCBRVEMoMHg1YzQ4ZDEzZSksIFFUQygweDVjNjM5M2RjKSwKKyAgICBRVEMoMHg1YzdlNTNlNSksIFFUQygweDVjOTkxMTVhKSwgUVRDKDB4NWNiM2NjM2MpLCBRVEMoMHg1Y2NlODQ4ZCksCisgICAgUVRDKDB4NWNlOTNhNGUpLCBRVEMoMHg1ZDAzZWQ4MCksIFFUQygweDVkMWU5ZTI0KSwgUVRDKDB4NWQzOTRjM2IpLAorICAgIFFUQygweDVkNTNmN2M3KSwgUVRDKDB4NWQ2ZWEwYzkpLCBRVEMoMHg1ZDg5NDc0MiksIFFUQygweDVkYTNlYjMzKSwKKyAgICBRVEMoMHg1ZGJlOGM5ZSksIFFUQygweDVkZDkyYjg0KSwgUVRDKDB4NWRmM2M3ZTUpLCBRVEMoMHg1ZTBlNjFjMyksCisgICAgUVRDKDB4NWUyOGY5MjApLCBRVEMoMHg1ZTQzOGRmYyksIFFUQygweDVlNWUyMDU5KSwgUVRDKDB4NWU3OGIwMzcpLAorICAgIFFUQygweDVlOTMzZDk5KSwgUVRDKDB4NWVhZGM4N2UpLCBRVEMoMHg1ZWM4NTBlOSksIFFUQygweDVlZTJkNmRhKSwKKyAgICBRVEMoMHg1ZWZkNWE1MyksIFFUQygweDVmMTdkYjU0KSwgUVRDKDB4NWYzMjU5ZTApLCBRVEMoMHg1ZjRjZDVmNiksCisgICAgUVRDKDB4NWY2NzRmOTkpLCBRVEMoMHg1ZjgxYzZjOCksIFFUQygweDVmOWMzYjg3KSwgUVRDKDB4NWZiNmFkZDQpLAorICAgIFFUQygweDVmZDExZGIzKSwgUVRDKDB4NWZlYjhiMjMpLCBRVEMoMHg2MDA1ZjYyNiksIFFUQygweDYwMjA1ZWJkKSwKKyAgICBRVEMoMHg2MDNhYzRlOSksIFFUQygweDYwNTUyOGFjKSwgUVRDKDB4NjA2ZjhhMDUpLCBRVEMoMHg2MDg5ZThmNyksCisgICAgUVRDKDB4NjBhNDQ1ODMpLCBRVEMoMHg2MGJlOWZhOSksIFFUQygweDYwZDhmNzZiKSwgUVRDKDB4NjBmMzRjY2EpLAorICAgIFFUQygweDYxMGQ5ZmM3KSwgUVRDKDB4NjEyN2YwNjIpLCBRVEMoMHg2MTQyM2U5ZSksIFFUQygweDYxNWM4YTdhKSwKKyAgICBRVEMoMHg2MTc2ZDNmOSksIFFUQygweDYxOTExYjFiKSwgUVRDKDB4NjFhYjVmZTEpLCBRVEMoMHg2MWM1YTI0ZCksCisgICAgUVRDKDB4NjFkZmUyNWYpLCBRVEMoMHg2MWZhMjAxOCksIFFUQygweDYyMTQ1YjdhKSwgUVRDKDB4NjIyZTk0ODUpLAorICAgIFFUQygweDYyNDhjYjNiKSwgUVRDKDB4NjI2MmZmOWQpLCBRVEMoMHg2MjdkMzFhYiksIFFUQygweDYyOTc2MTY3KSwKKyAgICBRVEMoMHg2MmIxOGVkMSksIFFUQygweDYyY2JiOWViKSwgUVRDKDB4NjJlNWUyYjYpLCBRVEMoMHg2MzAwMDkzMyksCisgICAgUVRDKDB4NjMxYTJkNjIpLCBRVEMoMHg2MzM0NGY0NSksIFFUQygweDYzNGU2ZWRkKSwgUVRDKDB4NjM2ODhjMmIpLAorICAgIFFUQygweDYzODJhNzMwKSwgUVRDKDB4NjM5Y2JmZWMpLCBRVEMoMHg2M2I2ZDY2MSksIFFUQygweDYzZDBlYTkwKSwKKyAgICBRVEMoMHg2M2VhZmM3YSksIFFUQygweDY0MDUwYzFmKSwgUVRDKDB4NjQxZjE5ODIpLCBRVEMoMHg2NDM5MjRhMiksCisgICAgUVRDKDB4NjQ1MzJkODApLCBRVEMoMHg2NDZkMzQxZiksIFFUQygweDY0ODczODdlKSwgUVRDKDB4NjRhMTNhOWUpLAorICAgIFFUQygweDY0YmIzYTgxKSwgUVRDKDB4NjRkNTM4MjgpLCBRVEMoMHg2NGVmMzM5MyksIFFUQygweDY1MDkyY2M0KSwKKyAgICBRVEMoMHg2NTIzMjNiYiksIFFUQygweDY1M2QxODc5KSwgUVRDKDB4NjU1NzBiMDApLCBRVEMoMHg2NTcwZmI1MCksCisgICAgUVRDKDB4NjU4YWU5NmIpLCBRVEMoMHg2NWE0ZDU1MCksIFFUQygweDY1YmViZjAxKSwgUVRDKDB4NjVkOGE2ODApLAorICAgIFFUQygweDY1ZjI4YmNjKSwgUVRDKDB4NjYwYzZlZTgpLCBRVEMoMHg2NjI2NGZkMyksIFFUQygweDY2NDAyZThmKSwKKyAgICBRVEMoMHg2NjVhMGIxYyksIFFUQygweDY2NzNlNTdkKSwgUVRDKDB4NjY4ZGJkYjApLCBRVEMoMHg2NmE3OTNiOCksCisgICAgUVRDKDB4NjZjMTY3OTUpLCBRVEMoMHg2NmRiMzk0OSksIFFUQygweDY2ZjUwOGQ0KSwgUVRDKDB4NjcwZWQ2MzYpLAorICAgIFFUQygweDY3MjhhMTcyKSwgUVRDKDB4Njc0MjZhODcpLCBRVEMoMHg2NzVjMzE3NyksIFFUQygweDY3NzVmNjQzKSwKKyAgICBRVEMoMHg2NzhmYjhlYiksIFFUQygweDY3YTk3OTcxKSwgUVRDKDB4NjdjMzM3ZDUpLCBRVEMoMHg2N2RjZjQxOCksCisgICAgUVRDKDB4NjdmNmFlM2IpLCBRVEMoMHg2ODEwNjYzZiksIFFUQygweDY4MmExYzI1KSwgUVRDKDB4Njg0M2NmZWQpLAorICAgIFFUQygweDY4NWQ4MTk5KSwgUVRDKDB4Njg3NzMxMjkpLCBRVEMoMHg2ODkwZGU5ZiksIFFUQygweDY4YWE4OWZhKSwKKyAgICBRVEMoMHg2OGM0MzMzZCksIFFUQygweDY4ZGRkYTY3KSwgUVRDKDB4NjhmNzdmN2EpLCBRVEMoMHg2OTExMjI3NyksCisgICAgUVRDKDB4NjkyYWMzNWUpLCBRVEMoMHg2OTQ0NjIzMCksIFFUQygweDY5NWRmZWVlKSwgUVRDKDB4Njk3Nzk5OWEpLAorICAgIFFUQygweDY5OTEzMjMyKSwgUVRDKDB4NjlhYWM4YmEpLCBRVEMoMHg2OWM0NWQzMSksIFFUQygweDY5ZGRlZjk4KSwKKyAgICBRVEMoMHg2OWY3N2ZmMCksIFFUQygweDZhMTEwZTNhKSwgUVRDKDB4NmEyYTlhNzcpLCBRVEMoMHg2YTQ0MjRhOCksCisgICAgUVRDKDB4NmE1ZGFjY2MpLCBRVEMoMHg2YTc3MzJlNiksIFFUQygweDZhOTBiNmY2KSwgUVRDKDB4NmFhYTM4ZmQpLAorICAgIFFUQygweDZhYzNiOGZiKSwgUVRDKDB4NmFkZDM2ZjIpLCBRVEMoMHg2YWY2YjJlMiksIFFUQygweDZiMTAyY2NkKSwKKyAgICBRVEMoMHg2YjI5YTRiMiksIFFUQygweDZiNDMxYTkyKSwgUVRDKDB4NmI1YzhlNmYpLCBRVEMoMHg2Yjc2MDA0YSksCisgICAgUVRDKDB4NmI4ZjcwMjIpLCBRVEMoMHg2YmE4ZGRmOSksIFFUQygweDZiYzI0OWQwKSwgUVRDKDB4NmJkYmIzYTcpLAorICAgIFFUQygweDZiZjUxYjgwKSwgUVRDKDB4NmMwZTgxNWEpLCBRVEMoMHg2YzI3ZTUzNyksIFFUQygweDZjNDE0NzE4KSwKKyAgICBRVEMoMHg2YzVhYTZmZCksIFFUQygweDZjNzQwNGU3KSwgUVRDKDB4NmM4ZDYwZDcpLCBRVEMoMHg2Y2E2YmFjZSksCisgICAgUVRDKDB4NmNjMDEyY2MpLCBRVEMoMHg2Y2Q5NjhkMiksIFFUQygweDZjZjJiY2UxKSwgUVRDKDB4NmQwYzBlZjkpLAorICAgIFFUQygweDZkMjU1ZjFkKSwgUVRDKDB4NmQzZWFkNGIpLCBRVEMoMHg2ZDU3Zjk4NSksIFFUQygweDZkNzE0M2NjKSwKKyAgICBRVEMoMHg2ZDhhOGMyMSksIFFUQygweDZkYTNkMjgzKSwgUVRDKDB4NmRiZDE2ZjUpLCBRVEMoMHg2ZGQ2NTk3NiksCisgICAgUVRDKDB4NmRlZjlhMDgpLCBRVEMoMHg2ZTA4ZDhhYiksIFFUQygweDZlMjIxNTYwKSwgUVRDKDB4NmUzYjUwMjcpLAorICAgIFFUQygweDZlNTQ4OTAyKSwgUVRDKDB4NmU2ZGJmZjEpLCBRVEMoMHg2ZTg2ZjRmNSksIFFUQygweDZlYTAyODBlKSwKKyAgICBRVEMoMHg2ZWI5NTkzZSksIFFUQygweDZlZDI4ODg1KSwgUVRDKDB4NmVlYmI1ZTMpLCBRVEMoMHg2ZjA0ZTE1YSksCisgICAgUVRDKDB4NmYxZTBhZWEpLCBRVEMoMHg2ZjM3MzI5NCksIFFUQygweDZmNTA1ODU5KSwgUVRDKDB4NmY2OTdjMzkpLAorICAgIFFUQygweDZmODI5ZTM1KSwgUVRDKDB4NmY5YmJlNGUpLCBRVEMoMHg2ZmI0ZGM4NSksIFFUQygweDZmY2RmOGQ5KSwKKyAgICBRVEMoMHg2ZmU3MTM0ZCksIFFUQygweDcwMDAyYmUwKSwgUVRDKDB4NzAxOTQyOTMpLCBRVEMoMHg3MDMyNTc2NyksCisgICAgUVRDKDB4NzA0YjZhNWQpLCBRVEMoMHg3MDY0N2I3NiksIFFUQygweDcwN2Q4YWIxKSwgUVRDKDB4NzA5Njk4MTEpLAorICAgIFFUQygweDcwYWZhMzk0KSwgUVRDKDB4NzBjOGFkM2QpLCBRVEMoMHg3MGUxYjUwYyksIFFUQygweDcwZmFiYjAxKSwKKyAgICBRVEMoMHg3MTEzYmYxZCksIFFUQygweDcxMmNjMTYxKSwgUVRDKDB4NzE0NWMxY2UpLCBRVEMoMHg3MTVlYzA2NCksCisgICAgUVRDKDB4NzE3N2JkMjQpLCBRVEMoMHg3MTkwYjgwZiksIFFUQygweDcxYTliMTI0KSwgUVRDKDB4NzFjMmE4NjYpLAorICAgIFFUQygweDcxZGI5ZGQ0KSwgUVRDKDB4NzFmNDkxNzApLCBRVEMoMHg3MjBkODMzOSksIFFUQygweDcyMjY3MzMxKSwKKyAgICBRVEMoMHg3MjNmNjE1OSksIFFUQygweDcyNTg0ZGIwKSwgUVRDKDB4NzI3MTM4MzgpLCBRVEMoMHg3MjhhMjBmMSksCisgICAgUVRDKDB4NzJhMzA3ZGIpLCBRVEMoMHg3MmJiZWNmOSksIFFUQygweDcyZDRkMDQ5KSwgUVRDKDB4NzJlZGIxY2UpLAorICAgIFFUQygweDczMDY5MTg3KSwgUVRDKDB4NzMxZjZmNzUpLCBRVEMoMHg3MzM4NGI5OCksIFFUQygweDczNTEyNWYzKSwKKyAgICBRVEMoMHg3MzY5ZmU4NCksIFFUQygweDczODJkNTRkKSwgUVRDKDB4NzM5YmFhNGUpLCBRVEMoMHg3M2I0N2Q4OSksCisgICAgUVRDKDB4NzNjZDRlZmQpLCBRVEMoMHg3M2U2MWVhYiksIFFUQygweDczZmVlYzk0KSwgUVRDKDB4NzQxN2I4YjgpLAorICAgIFFUQygweDc0MzA4MzE5KSwgUVRDKDB4NzQ0OTRiYjYpLCBRVEMoMHg3NDYyMTI5MSksIFFUQygweDc0N2FkN2FhKSwKKyAgICBRVEMoMHg3NDkzOWIwMiksIFFUQygweDc0YWM1Yzk4KSwgUVRDKDB4NzRjNTFjNmYpLCBRVEMoMHg3NGRkZGE4NiksCisgICAgUVRDKDB4NzRmNjk2ZGUpLCBRVEMoMHg3NTBmNTE3OCksIFFUQygweDc1MjgwYTU0KSwgUVRDKDB4NzU0MGMxNzQpLAorICAgIFFUQygweDc1NTk3NmQ3KSwgUVRDKDB4NzU3MjJhN2UpLCBRVEMoMHg3NThhZGM2OSksIFFUQygweDc1YTM4YzliKSwKKyAgICBRVEMoMHg3NWJjM2IxMiksIFFUQygweDc1ZDRlN2NmKSwgUVRDKDB4NzVlZDkyZDQpLCBRVEMoMHg3NjA2M2MyMSksCisgICAgUVRDKDB4NzYxZWUzYjYpLCBRVEMoMHg3NjM3ODk5NCksIFFUQygweDc2NTAyZGJjKSwgUVRDKDB4NzY2OGQwMmUpLAorICAgIFFUQygweDc2ODE3MGViKSwgUVRDKDB4NzY5YTBmZjMpLCBRVEMoMHg3NmIyYWQ0NyksIFFUQygweDc2Y2I0OGU3KSwKKyAgICBRVEMoMHg3NmUzZTJkNSksIFFUQygweDc2ZmM3YjEwKSwgUVRDKDB4NzcxNTExOWEpLCBRVEMoMHg3NzJkYTY3MyksCisgICAgUVRDKDB4Nzc0NjM5OWIpLCBRVEMoMHg3NzVlY2IxMyksIFFUQygweDc3Nzc1YWRjKSwgUVRDKDB4Nzc4ZmU4ZjYpLAorICAgIFFUQygweDc3YTg3NTYxKSwgUVRDKDB4NzdjMTAwMWYpLCBRVEMoMHg3N2Q5ODkzMCksIFFUQygweDc3ZjIxMDk1KSwKKyAgICBRVEMoMHg3ODBhOTY0ZCksIFFUQygweDc4MjMxYTViKSwgUVRDKDB4NzgzYjljYmQpLCBRVEMoMHg3ODU0MWQ3NSksCisgICAgUVRDKDB4Nzg2YzljODQpLCBRVEMoMHg3ODg1MTllOSksIFFUQygweDc4OWQ5NWE2KSwgUVRDKDB4NzhiNjBmYmIpLAorICAgIFFUQygweDc4Y2U4ODI4KSwgUVRDKDB4NzhlNmZlZWYpLCBRVEMoMHg3OGZmNzQwZiksIFFUQygweDc5MTdlNzhhKSwKKyAgICBRVEMoMHg3OTMwNTk1ZiksIFFUQygweDc5NDhjOTkwKSwgUVRDKDB4Nzk2MTM4MWQpLCBRVEMoMHg3OTc5YTUwNiksCisgICAgUVRDKDB4Nzk5MjEwNGMpLCBRVEMoMHg3OWFhNzlmMCksIFFUQygweDc5YzJlMWYxKSwgUVRDKDB4NzlkYjQ4NTIpLAorICAgIFFUQygweDc5ZjNhZDExKSwgUVRDKDB4N2EwYzEwMzEpLCBRVEMoMHg3YTI0NzFiMCksIFFUQygweDdhM2NkMTkxKSwKKyAgICBRVEMoMHg3YTU1MmZkMyksIFFUQygweDdhNmQ4Yzc2KSwgUVRDKDB4N2E4NWU3N2QpLCBRVEMoMHg3YTllNDBlNiksCisgICAgUVRDKDB4N2FiNjk4YjIpLCBRVEMoMHg3YWNlZWVlMyksIFFUQygweDdhZTc0Mzc4KSwgUVRDKDB4N2FmZjk2NzMpLAorICAgIFFUQygweDdiMTdlN2QyKSwgUVRDKDB4N2IzMDM3OTkpLCBRVEMoMHg3YjQ4ODVjNSksIFFUQygweDdiNjBkMjU5KSwKKyAgICBRVEMoMHg3Yjc5MWQ1NSksIFFUQygweDdiOTE2NmI5KSwgUVRDKDB4N2JhOWFlODYpLCBRVEMoMHg3YmMxZjRiYyksCisgICAgUVRDKDB4N2JkYTM5NWMpLCBRVEMoMHg3YmYyN2M2NiksIFFUQygweDdjMGFiZGRiKSwgUVRDKDB4N2MyMmZkYmIpLAorICAgIFFUQygweDdjM2IzYzA3KSwgUVRDKDB4N2M1Mzc4YzApLCBRVEMoMHg3YzZiYjNlNSksIFFUQygweDdjODNlZDc4KSwKKyAgICBRVEMoMHg3YzljMjU3OSksIFFUQygweDdjYjQ1YmU5KSwgUVRDKDB4N2NjYzkwYzcpLCBRVEMoMHg3Y2U0YzQxNCksCisgICAgUVRDKDB4N2NmY2Y1ZDIpLCBRVEMoMHg3ZDE1MjYwMCksIFFUQygweDdkMmQ1NDlmKSwgUVRDKDB4N2Q0NTgxYjApLAorICAgIFFUQygweDdkNWRhZDMyKSwgUVRDKDB4N2Q3NWQ3MjcpLCBRVEMoMHg3ZDhkZmY4ZiksIFFUQygweDdkYTYyNjZhKSwKKyAgICBRVEMoMHg3ZGJlNGJiYSksIFFUQygweDdkZDY2ZjdkKSwgUVRDKDB4N2RlZTkxYjYpLCBRVEMoMHg3ZTA2YjI2NCksCisgICAgUVRDKDB4N2UxZWQxODgpLCBRVEMoMHg3ZTM2ZWYyMiksIFFUQygweDdlNGYwYjM0KSwgUVRDKDB4N2U2NzI1YmQpLAorICAgIFFUQygweDdlN2YzZWJkKSwgUVRDKDB4N2U5NzU2MzYpLCBRVEMoMHg3ZWFmNmMyOCksIFFUQygweDdlYzc4MDkzKSwKKyAgICBRVEMoMHg3ZWRmOTM3OCksIFFUQygweDdlZjdhNGQ3KSwgUVRDKDB4N2YwZmI0YjEpLCBRVEMoMHg3ZjI3YzMwNyksCisgICAgUVRDKDB4N2YzZmNmZDgpLCBRVEMoMHg3ZjU3ZGIyNSksIFFUQygweDdmNmZlNGVmKSwgUVRDKDB4N2Y4N2VkMzYpLAorICAgIFFUQygweDdmOWZmM2ZiKSwgUVRDKDB4N2ZiN2Y5M2UpLCBRVEMoMHg3ZmNmZmNmZiksIFFUQygweDdmZTdmZjQwKX07CiAKIC8qCiAgIHRhYmxlIG9mIHBvdygyLjAsMC4yNSpxKS8yLjAsIHFbMC4uNCkKICovCi1jb25zdCBGSVhQX1FURCBGREthYWNFbmNfcXVhbnRUYWJsZVFbNF0gPSB7IFFUQygweDQwMDAwMDAwKSwgUVRDKDB4NGMxYmY3ZmYpLCBRVEMoMHg1YTgyNzk3ZiksIFFUQygweDZiYTI3ZTdmKSB9OworY29uc3QgRklYUF9RVEQgRkRLYWFjRW5jX3F1YW50VGFibGVRWzRdID0ge1FUQygweDQwMDAwMDAwKSwgUVRDKDB4NGMxYmY3ZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFUQygweDVhODI3OTdmKSwgUVRDKDB4NmJhMjdlN2YpfTsKIAogLyoKICAgdGFibGUgb2YgcG93KDIuMCwwLjc1KmUpLzguMCwgZVswLi40KQogKi8KLWNvbnN0IEZJWFBfUVREIEZES2FhY0VuY19xdWFudFRhYmxlRVs0XSA9IHsgUVRDKDB4MTAwMDAwMDApLCBRVEMoMHgxYWU4OWY5OSksIFFUQygweDJkNDEzY2NkKSwgUVRDKDB4NGMxYmY4MjgpIH07Ci0KK2NvbnN0IEZJWFBfUVREIEZES2FhY0VuY19xdWFudFRhYmxlRVs0XSA9IHtRVEMoMHgxMDAwMDAwMCksIFFUQygweDFhZTg5Zjk5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVEMoMHgyZDQxM2NjZCksIFFUQygweDRjMWJmODI4KX07CiAKIC8qCiAgIHRhYmxlIHRvIGNvdW50IHVzZWQgbnVtYmVyIG9mIGJpdHMKICovCi1jb25zdCBTSE9SVCBGREthYWNFbmNfc2lkZUluZm9UYWJMb25nW01BWF9TRkJfTE9ORyArIDFdID0KLXsKLSAgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksCi0gIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LAotICAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwKLSAgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMGUsCi0gIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLAotICAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwKLSAgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlCi19OworY29uc3QgU0hPUlQgRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZ1tdID0geworICAgIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksCisgICAgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwKKyAgICAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LAorICAgIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsCisgICAgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwKKyAgICAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGV9OwogCi0KLWNvbnN0IFNIT1JUIEZES2FhY0VuY19zaWRlSW5mb1RhYlNob3J0W01BWF9TRkJfU0hPUlQgKyAxXSA9Ci17Ci0gIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDBhLAotICAweDAwMGEsIDB4MDAwYSwgMHgwMDBhLCAweDAwMGEsIDB4MDAwYSwgMHgwMDBhLCAweDAwMGQsIDB4MDAwZAotfTsKLQotCi0KLQotCitjb25zdCBTSE9SVCBGREthYWNFbmNfc2lkZUluZm9UYWJTaG9ydFtdID0geworICAgIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDBhLAorICAgIDB4MDAwYSwgMHgwMDBhLCAweDAwMGEsIDB4MDAwYSwgMHgwMDBhLCAweDAwMGEsIDB4MDAwZCwgMHgwMDBkfTsKIAogLyoKICAgUHN5IENvbmZpZ3VyYXRpb24gY29uc3RhbnRzCiAqLwogCiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY184MDAwX2xvbmdfMTAyNCA9IHsKLSAgICA0MCwKLSAgICB7IDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAgICAgIDIwLCAyMCwgMjAsIDIwLCAyNCwgMjQsIDI0LCAyOCwgMjgsIDMyLCAzNiwgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCA4MCB9Ci19OworICAgIDQwLCB7MTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDE2LAorICAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMjAsIDIwLCAyMCwgMjAsIDI0LCAyNCwgMjQsIDI4LAorICAgICAgICAgMjgsIDMyLCAzNiwgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCA4MH19OwogY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzgwMDBfc2hvcnRfMTI4ID0gewotICAgIDE1LAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAxMiwgMTYsIDIwLCAyMCB9Ci19OworICAgIDE1LCB7NCwgNCwgNCwgNCwgNCwgNCwgNCwgOCwgOCwgOCwgOCwgMTIsIDE2LCAyMCwgMjB9fTsKIAogY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMTEwMjVfbG9uZ18xMDI0ID0gewotICAgIDQzLAotICAgIHsgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAotICAgICAgMTYsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzYsIDQwLCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLAotICAgICAgNjQsIDY0LCA2NCB9Ci19OworICAgIDQzLCB7OCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICAxMiwgMTIsIDEyLCAxMiwKKyAgICAgICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjAsIDI0LCAyNCwgMjgsCisgICAgICAgICAyOCwgMzIsIDM2LCA0MCwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDY0LCA2NH19OwogY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzExMDI1X3Nob3J0XzEyOCA9IHsKLSAgICAxNSwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAxMiwgMTIsIDE2LCAyMCwgMjAgfQotfTsKKyAgICAxNSwgezQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDgsIDgsIDEyLCAxMiwgMTYsIDIwLCAyMH19OwogCiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY18xMjAwMF9sb25nXzEwMjQgPSB7Ci0gICAgNDMsCi0gICAgeyAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCi0gICAgICAxNiwgMTYsIDE2LCAxNiwgMjAsIDIwLCAyMCwgMjQsIDI0LCAyOCwgMjgsIDMyLCAzNiwgNDAsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsCi0gICAgICA2NCwgNjQsIDY0IH0KLX07CisgICAgNDMsIHs4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDEyLCAxMiwgMTIsIDEyLAorICAgICAgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMjAsIDIwLCAyMCwgMjQsIDI0LCAyOCwKKyAgICAgICAgIDI4LCAzMiwgMzYsIDQwLCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgNjQsIDY0fX07CiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfMTIwMDBfc2hvcnRfMTI4ID0gewotICAgIDE1LAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsIDEyLCAxMiwgMTYsIDIwLCAyMCB9Ci19OworICAgIDE1LCB7NCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgOCwgOCwgMTIsIDEyLCAxNiwgMjAsIDIwfX07CiAKIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzE2MDAwX2xvbmdfMTAyNCA9IHsKLSAgICA0MywKLSAgICB7ICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLSAgICAgIDE2LCAxNiwgMTYsIDE2LCAyMCwgMjAsIDIwLCAyNCwgMjQsIDI4LCAyOCwgMzIsIDM2LCA0MCwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwKLSAgICAgIDY0LCA2NCwgNjQgfQotfTsKKyAgICA0MywgezgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMTIsIDEyLCAxMiwgMTIsCisgICAgICAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAyMCwgMjAsIDIwLCAyNCwgMjQsIDI4LAorICAgICAgICAgMjgsIDMyLCAzNiwgNDAsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCA2NCwgNjR9fTsKIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18xNjAwMF9zaG9ydF8xMjggPSB7Ci0gICAgMTUsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgMTIsIDEyLCAxNiwgMjAsIDIwIH0KLX07CisgICAgMTUsIHs0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA4LCA4LCAxMiwgMTIsIDE2LCAyMCwgMjB9fTsKIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzIyMDUwX2xvbmdfMTAyNCA9IHsKLSAgICA0NywKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKLSAgICAgICA4LCAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMjAsIDIwLCAyNCwgMjQsIDI4LCAyOCwgMzIsIDM2LCAzNiwgNDAsIDQ0LCA0OCwKLSAgICAgIDUyLCA1MiwgNjQsIDY0LCA2NCwgNjQsIDY0IH0KLX07CisgICAgNDcsIHs0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICAgICAgOCwgIDgsICA4LCAgOCwgIDgsICAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMjAsIDIwLCAyNCwgMjQsCisgICAgICAgICAyOCwgMjgsIDMyLCAzNiwgMzYsIDQwLCA0NCwgNDgsIDUyLCA1MiwgNjQsIDY0LCA2NCwgNjQsIDY0fX07CiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfMjIwNTBfc2hvcnRfMTI4ID0gewotICAgIDE1LAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTYsIDE2LCAyMCB9Ci19OworICAgIDE1LCB7NCwgNCwgNCwgNCwgNCwgNCwgNCwgOCwgOCwgOCwgMTIsIDEyLCAxNiwgMTYsIDIwfX07CiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY18yNDAwMF9sb25nXzEwMjQgPSB7Ci0gICAgNDcsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCi0gICAgICAgOCwgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjQsIDI0LCAyOCwgMjgsIDMyLCAzNiwgMzYsIDQwLCA0NCwgNDgsCi0gICAgICA1MiwgNTIsIDY0LCA2NCwgNjQsIDY0LCA2NCB9Ci19OworICAgIDQ3LCB7NCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjQsIDI0LAorICAgICAgICAgMjgsIDI4LCAzMiwgMzYsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTIsIDY0LCA2NCwgNjQsIDY0LCA2NH19OwogY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzI0MDAwX3Nob3J0XzEyOCA9IHsKLSAgICAxNSwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAxMiwgMTIsIDE2LCAxNiwgMjAgfQotfTsKKyAgICAxNSwgezQsIDQsIDQsIDQsIDQsIDQsIDQsIDgsIDgsIDgsIDEyLCAxMiwgMTYsIDE2LCAyMH19OwogY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMzIwMDBfbG9uZ18xMDI0ID0gewotICAgIDUxLAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLAotICAgICAgMTIsIDE2LCAxNiwgMjAsIDIwLCAyNCwgMjQsIDI4LCAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAotICAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyIH0KLX07CisgICAgNTEsIHs0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgICAgIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDIwLCAyMCwgMjQsIDI0LCAyOCwgMjgsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMn19OwogY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzMyMDAwX3Nob3J0XzEyOCA9IHsKLSAgICAxNCwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiB9Ci19OworICAgIDE0LCB7NCwgNCwgNCwgNCwgNCwgOCwgOCwgOCwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNn19OwogY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfNDQxMDBfbG9uZ18xMDI0ID0gewotICAgIDQ5LAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLAotICAgICAgMTIsIDE2LCAxNiwgMjAsIDIwLCAyNCwgMjQsIDI4LCAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAotICAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA5NiB9Ci19OworICAgIDQ5LCB7NCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgICAgICAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDk2fX07CiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfNDQxMDBfc2hvcnRfMTI4ID0gewotICAgIDE0LAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2IH0KLX07CisgICAgMTQsIHs0LCA0LCA0LCA0LCA0LCA4LCA4LCA4LCAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2fX07CiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY180ODAwMF9sb25nXzEwMjQgPSB7Ci0gICAgNDksCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsCi0gICAgICAxMiwgMTYsIDE2LCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCi0gICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDk2IH0KLX07CisgICAgNDksIHs0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgICAgIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDIwLCAyMCwgMjQsIDI0LCAyOCwgMjgsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgOTZ9fTsKIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY180ODAwMF9zaG9ydF8xMjggPSB7Ci0gICAgMTQsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYgfQotfTsKKyAgICAxNCwgezQsIDQsIDQsIDQsIDQsIDgsIDgsIDgsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTZ9fTsKIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzY0MDAwX2xvbmdfMTAyNCA9IHsKLSAgICA0NywKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsIDEyLCAxMiwKLSAgICAgIDEyLCAxNiwgMTYsIDE2LCAyMCwgMjQsIDI0LCAyOCwgMzYsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwKLSAgICAgIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwIH0KLX07CisgICAgNDcsIHs0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LAorICAgICAgICAgOCwgIDgsICAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2LCAyMCwgMjQsIDI0LCAyOCwgMzYsIDQwLCA0MCwgNDAsCisgICAgICAgICA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwfX07CiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfNjQwMDBfc2hvcnRfMTI4ID0gewotICAgIDEyLAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgMTYsIDI4LCAzNiB9Ci19OworICAgIDEyLCB7NCwgNCwgNCwgNCwgNCwgNCwgOCwgOCwgOCwgMTYsIDI4LCAzNn19OwogY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfODgyMDBfbG9uZ18xMDI0ID0gewotICAgIDQxLAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsIDEyLAotICAgICAgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMjQsIDI4LCAzNiwgNDQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LAotICAgICAgNjQgfQotfTsKKyAgICA0MSwgezQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAorICAgICAgICAgOCwgIDgsICA4LCAgOCwgIDgsICAxMiwgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMjQsIDI4LAorICAgICAgICAgMzYsIDQ0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjR9fTsKIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY184ODIwMF9zaG9ydF8xMjggPSB7Ci0gICAgMTIsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAxNiwgMjgsIDM2IH0KLX07CisgICAgMTIsIHs0LCA0LCA0LCA0LCA0LCA0LCA4LCA4LCA4LCAxNiwgMjgsIDM2fX07CiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY185NjAwMF9sb25nXzEwMjQgPSB7Ci0gICAgNDEsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwgMTIsCi0gICAgICAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAyNCwgMjgsIDM2LCA0NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsCi0gICAgICA2NCB9Ci19OworICAgIDQxLCB7NCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAyNCwgMjgsCisgICAgICAgICAzNiwgNDQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NH19OwogY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzk2MDAwX3Nob3J0XzEyOCA9IHsKLSAgICAxMiwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDE2LCAyOCwgMzYgfQotfTsKLQorICAgIDEyLCB7NCwgNCwgNCwgNCwgNCwgNCwgOCwgOCwgOCwgMTYsIDI4LCAzNn19OwogCiAvKgogICBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cwpAQCAtNjU1LDU3OCArODE1LDE2NzIgQEAKIC8qCiAgIDMgYml0IHJlc29sdXRpb24KICovCi1jb25zdCBGSVhQX0RCTCBGREthYWNFbmNfdG5zRW5jQ29lZmYzWzhdPQotewotICAoRklYUF9EQkwpMHg4MWYxZDIwMSwgKEZJWFBfREJMKTB4OTEyNjE0ODEsIChGSVhQX0RCTCkweGFkYjkyMzAxLCAoRklYUF9EQkwpMHhkNDM4YWYwMCwgKEZJWFBfREJMKTB4MDAwMDAwMDAsIChGSVhQX0RCTCkweDM3ODk4MDgwLCAoRklYUF9EQkwpMHg2NDEzMGRmZiwgKEZJWFBfREJMKTB4N2NjYTZmZmYKLX07Ci1jb25zdCBGSVhQX0RCTCBGREthYWNFbmNfdG5zQ29lZmYzQm9yZGVyc1s4XT17Ci0gIChGSVhQX0RCTCkweDgwMDAwMDAxIC8qLTQqLywgIChGSVhQX0RCTCkweDg3YjgyNmRmIC8qLTMqLywgIChGSVhQX0RCTCkweDlkZjI0MTU0IC8qLTIqLywgIChGSVhQX0RCTCkweGJmZmZmZmU1IC8qLTEqLywKLSAgKEZJWFBfREJMKTB4ZTljNWU1NzggLyogMCovLCAgKEZJWFBfREJMKTB4MWM3YjkwZjAgLyogMSovLCAgKEZJWFBfREJMKTB4NGZjZTgzYTkgLyogMiovLCAgKEZJWFBfREJMKTB4NzM1MmYyYzMgLyogMyovCitjb25zdCBGSVhQX0xQQyBGREthYWNFbmNfdG5zRW5jQ29lZmYzWzhdID0geworICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDgxZjFkMjAxKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4OTEyNjE0ODEpLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweGFkYjkyMzAxKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4ZDQzOGFmMDApLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDAwMDAwMDAwKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4Mzc4OTgwODApLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDY0MTMwZGZmKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4N2NjYTZmZmYpfTsKK2NvbnN0IEZJWFBfTFBDIEZES2FhY0VuY190bnNDb2VmZjNCb3JkZXJzWzhdID0geworICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDgwMDAwMDAxKSAvKi00Ki8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4ODdiODI2ZGYpIC8qLTMqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg5ZGYyNDE1NCkgLyotMiovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweGJmZmZmZmU1KSAvKi0xKi8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4ZTljNWU1NzgpIC8qIDAqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHgxYzdiOTBmMCkgLyogMSovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDRmY2U4M2E5KSAvKiAyKi8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4NzM1MmYyYzMpIC8qIDMqLwogfTsKIAogLyoKICAgNCBiaXQgcmVzb2x1dGlvbgogKi8KLWNvbnN0IEZJWFBfREJMIEZES2FhY0VuY190bnNFbmNDb2VmZjRbMTZdPQotewotICAoRklYUF9EQkwpMHg4MDhiYzg4MSwgKEZJWFBfREJMKTB4ODRlMmU1ODEsIChGSVhQX0RCTCkweDhkNmI0YTAxLCAoRklYUF9EQkwpMHg5OWRhOTIwMSwgKEZJWFBfREJMKTB4YTljNDU3MDEsIChGSVhQX0RCTCkweGJjOWRkZTgxLCAoRklYUF9EQkwpMHhkMWMyZDUwMCwgKEZJWFBfREJMKTB4ZTg3YWU1NDAsCi0gIChGSVhQX0RCTCkweDAwMDAwMDAwLCAoRklYUF9EQkwpMHgxYTljZDljMCwgKEZJWFBfREJMKTB4MzQwZmYyNDAsIChGSVhQX0RCTCkweDRiM2M4YmZmLCAoRklYUF9EQkwpMHg1ZjFmNWU3ZiwgKEZJWFBfREJMKTB4NmVkOWViN2YsIChGSVhQX0RCTCkweDc5YmMzODdmLCAoRklYUF9EQkwpMHg3ZjRjN2U3ZgorY29uc3QgRklYUF9MUEMgRkRLYWFjRW5jX3Ruc0VuY0NvZWZmNFsxNl0gPSB7CisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4ODA4YmM4ODEpLCBGWF9EQkwyRlhDT05TVF9MUEMoMHg4NGUyZTU4MSksCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4OGQ2YjRhMDEpLCBGWF9EQkwyRlhDT05TVF9MUEMoMHg5OWRhOTIwMSksCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4YTljNDU3MDEpLCBGWF9EQkwyRlhDT05TVF9MUEMoMHhiYzlkZGU4MSksCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4ZDFjMmQ1MDApLCBGWF9EQkwyRlhDT05TVF9MUEMoMHhlODdhZTU0MCksCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4MDAwMDAwMDApLCBGWF9EQkwyRlhDT05TVF9MUEMoMHgxYTljZDljMCksCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4MzQwZmYyNDApLCBGWF9EQkwyRlhDT05TVF9MUEMoMHg0YjNjOGJmZiksCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4NWYxZjVlN2YpLCBGWF9EQkwyRlhDT05TVF9MUEMoMHg2ZWQ5ZWI3ZiksCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4NzliYzM4N2YpLCBGWF9EQkwyRlhDT05TVF9MUEMoMHg3ZjRjN2U3Zil9OworY29uc3QgRklYUF9MUEMgRkRLYWFjRW5jX3Ruc0NvZWZmNEJvcmRlcnNbMTZdID0geworICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDgwMDAwMDAxKSAvKi04Ki8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4ODIyZGVmZjApIC8qLTcqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg4OGE0YmZlNikgLyotNiovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDkzMmMxNTlkKSAvKi01Ki8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4YTE2ODI3YzIpIC8qLTQqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHhiMmRjZGUyNykgLyotMyovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweGM2ZjIwYjkxKSAvKi0yKi8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4ZGNmODljNjQpIC8qLTEqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHhmNDMwOGNlMSkgLyogMCovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDBkNjEzMDU0KSAvKiAxKi8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4Mjc4ZGRlODApIC8qIDIqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg0MDAwMDAxYikgLyogMyovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDU1YTYxMjdiKSAvKiA0Ki8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4Njc4ZGRlOGYpIC8qIDUqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg3NGVmMGVkNykgLyogNiovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDdkMzNmMGRhKSAvKiA3Ki8KIH07Ci1jb25zdCBGSVhQX0RCTCBGREthYWNFbmNfdG5zQ29lZmY0Qm9yZGVyc1sxNl09Ci17Ci0gIChGSVhQX0RCTCkweDgwMDAwMDAxIC8qLTgqLywgIChGSVhQX0RCTCkweDgyMmRlZmYwIC8qLTcqLywgIChGSVhQX0RCTCkweDg4YTRiZmU2IC8qLTYqLywgIChGSVhQX0RCTCkweDkzMmMxNTlkIC8qLTUqLywKLSAgKEZJWFBfREJMKTB4YTE2ODI3YzIgLyotNCovLCAgKEZJWFBfREJMKTB4YjJkY2RlMjcgLyotMyovLCAgKEZJWFBfREJMKTB4YzZmMjBiOTEgLyotMiovLCAgKEZJWFBfREJMKTB4ZGNmODljNjQgLyotMSovLAotICAoRklYUF9EQkwpMHhmNDMwOGNlMSAvKiAwKi8sICAoRklYUF9EQkwpMHgwZDYxMzA1NCAvKiAxKi8sICAoRklYUF9EQkwpMHgyNzhkZGU4MCAvKiAyKi8sICAoRklYUF9EQkwpMHg0MDAwMDAxYiAvKiAzKi8sCi0gIChGSVhQX0RCTCkweDU1YTYxMjdiIC8qIDQqLywgIChGSVhQX0RCTCkweDY3OGRkZThmIC8qIDUqLywgIChGSVhQX0RCTCkweDc0ZWYwZWQ3IC8qIDYqLywgIChGSVhQX0RCTCkweDdkMzNmMGRhIC8qIDcqLwotfTsKLWNvbnN0IEZJWFBfREJMIEZES2FhY0VuY19tVGFiXzRfM0VsY1s1MTJdPXsKLSAgRkwyRlhDT05TVF9EQkwoMC4zOTY4NTAyNjI5OTIwNDk5KSxGTDJGWENPTlNUX0RCTCgwLjM5Nzg4NDA2MzQ4NjgzMzUpLEZMMkZYQ09OU1RfREJMKDAuMzk4OTE4NTM1OTM1NDcxMSksRkwyRlhDT05TVF9EQkwoMC4zOTk5NTM2Nzk0NjYxNDMyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC40MDA5ODk0OTMyMDk4NTMxKSxGTDJGWENPTlNUX0RCTCgwLjQwMjAyNTk3NjMwMDQxMTUpLEZMMkZYQ09OU1RfREJMKDAuNDAzMDYzMTI3ODc0NDIyNyksRkwyRlhDT05TVF9EQkwoMC40MDQxMDA5NDcwNzEyNjk1KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40MDUxMzk0MzMwMzMwOTk2KSxGTDJGWENPTlNUX0RCTCgwLjQwNjE3ODU4NDkwNDgxMTApLEZMMkZYQ09OU1RfREJMKDAuNDA3MjE4NDAxODM0MDM4MCksRkwyRlhDT05TVF9EQkwoMC40MDgyNTg4ODI5NzExMzcyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC40MDkzMDAwMjc0NjkxNzM5KSxGTDJGWENPTlNUX0RCTCgwLjQxMDM0MTgzNDQ4MzkwNzgpLEZMMkZYQ09OU1RfREJMKDAuNDExMzg0MzAzMTczNzc5OCksRkwyRlhDT05TVF9EQkwoMC40MTI0Mjc0MzI2OTk4OTgwKSwKLSAgRkwyRlhDT05TVF9EQkwoMC40MTM0NzEyMjIyMjYwMjQ1KSxGTDJGWENPTlNUX0RCTCgwLjQxNDUxNTY3MDkxODU2MjApLEZMMkZYQ09OU1RfREJMKDAuNDE1NTYwNzc3OTQ2NTQwMCksRkwyRlhDT05TVF9EQkwoMC40MTY2MDY1NDI0ODE2MDIyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC40MTc2NTI5NjM2OTc5OTMyKSxGTDJGWENPTlNUX0RCTCgwLjQxODcwMDA0MDc3MjU0NTIpLEZMMkZYQ09OU1RfREJMKDAuNDE5NzQ3NzcyODg0NjY1MiksRkwyRlhDT05TVF9EQkwoMC40MjA3OTYxNTkyMTYzMjIyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC40MjE4NDUxOTg5NTIwMzQ1KSxGTDJGWENPTlNUX0RCTCgwLjQyMjg5NDg5MTI3ODg1NjcpLEZMMkZYQ09OU1RfREJMKDAuNDIzOTQ1MjM1Mzg2MzY3MyksRkwyRlhDT05TVF9EQkwoMC40MjQ5OTYyMzA0NjY2NTY0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40MjYwNDc4NzU3MTQzMTMwKSxGTDJGWENPTlNUX0RCTCgwLjQyNzEwMDE3MDMyNjQxMjQpLEZMMkZYQ09OU1RfREJMKDAuNDI4MTUzMTEzNTAyNTA0NiksRkwyRlhDT05TVF9EQkwoMC40MjkyMDY3MDQ0NDQ2MDE3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40MzAyNjA5NDIzNTcxNjU4KSxGTDJGWENPTlNUX0RCTCgwLjQzMTMxNTgyNjQ0NzA5NzApLEZMMkZYQ09OU1RfREJMKDAuNDMyMzcxMzU1OTIzNzIxNiksRkwyRlhDT05TVF9EQkwoMC40MzM0Mjc1Mjk5OTg3ODAzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC40MzQ0ODQzNDc4ODY0MTYxKSxGTDJGWENPTlNUX0RCTCgwLjQzNTU0MTgwODgwMzE2MzApLEZMMkZYQ09OU1RfREJMKDAuNDM2NTk5OTExOTY3OTMzOSksRkwyRlhDT05TVF9EQkwoMC40Mzc2NTg2NTY2MDIwMDk2KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40Mzg3MTgwNDE5MjkwMjcyKSxGTDJGWENPTlNUX0RCTCgwLjQzOTc3ODA2NzE3NDk2ODMpLEZMMkZYQ09OU1RfREJMKDAuNDQwODM4NzMxNTY4MTQ4MCksRkwyRlhDT05TVF9EQkwoMC40NDE5MDAwMzQzMzkyMDM5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40NDI5NjE5NzQ3MjEwODQ3KSxGTDJGWENPTlNUX0RCTCgwLjQ0NDAyNDU1MTk0OTAzODgpLEZMMkZYQ09OU1RfREJMKDAuNDQ1MDg3NzY1MjYwNjAzOCksRkwyRlhDT05TVF9EQkwoMC40NDYxNTE2MTM4OTU1OTUzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC40NDcyMTYwOTcwOTYwOTYzKSxGTDJGWENPTlNUX0RCTCgwLjQ0ODI4MTIxNDEwNjQ0NTgpLEZMMkZYQ09OU1RfREJMKDAuNDQ5MzQ2OTY0MTczMjI4NiksRkwyRlhDT05TVF9EQkwoMC40NTA0MTMzNDY1NDUyNjQ4KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40NTE0ODAzNjA0NzM1OTg0KSxGTDJGWENPTlNUX0RCTCgwLjQ1MjU0ODAwNTIxMTQ4NzUpLEZMMkZYQ09OU1RfREJMKDAuNDUzNjE2MjgwMDE0MzkzOSksRkwyRlhDT05TVF9EQkwoMC40NTQ2ODUxODQxMzk5NzE5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40NTU3NTQ3MTY4NDgwNTkxKSxGTDJGWENPTlNUX0RCTCgwLjQ1NjgyNDg3NzQwMDY2NTIpLEZMMkZYQ09OU1RfREJMKDAuNDU3ODk1NjY1MDYxOTYyMyksRkwyRlhDT05TVF9EQkwoMC40NTg5NjcwNzkwOTgyNzQ2KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40NjAwMzkxMTg3NzgwNjg4KSxGTDJGWENPTlNUX0RCTCgwLjQ2MTExMTc4MzM3MTk0MzApLEZMMkZYQ09OU1RfREJMKDAuNDYyMTg1MDcyMTUyNjE4NCksRkwyRlhDT05TVF9EQkwoMC40NjMyNTg5ODQzOTQ5Mjc4KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40NjQzMzM1MTkzNzU4MDY5KSxGTDJGWENPTlNUX0RCTCgwLjQ2NTQwODY3NjM3NDI4NDIpLEZMMkZYQ09OU1RfREJMKDAuNDY2NDg0NDU0NjcxNDcxMyksRkwyRlhDT05TVF9EQkwoMC40Njc1NjA4NTM1NTA1NTMyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC40Njg2Mzc4NzIyOTY3NzkwKSxGTDJGWENPTlNUX0RCTCgwLjQ2OTcxNTUxMDE5NzQ1MjIpLEZMMkZYQ09OU1RfREJMKDAuNDcwNzkzNzY2NTQxOTIxNiksRkwyRlhDT05TVF9EQkwoMC40NzE4NzI2NDA2MjE1NzEzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC40NzI5NTIxMzE3Mjk4MTE4KSxGTDJGWENPTlNUX0RCTCgwLjQ3NDAzMjIzOTE2MjA3MTEpLEZMMkZYQ09OU1RfREJMKDAuNDc1MTEyOTYyMjE1Nzg0NSksRkwyRlhDT05TVF9EQkwoMC40NzYxOTQzMDAxOTAzODY3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40NzcyNzYyNTIzODczMDE1KSxGTDJGWENPTlNUX0RCTCgwLjQ3ODM1ODgxODEwOTkzMzgpLEZMMkZYQ09OU1RfREJMKDAuNDc5NDQxOTk2NjYzNjU5OSksRkwyRlhDT05TVF9EQkwoMC40ODA1MjU3ODczNTU4MTkwKSwKLSAgRkwyRlhDT05TVF9EQkwoMC40ODE2MTAxODk0OTU3MDQyKSxGTDJGWENPTlNUX0RCTCgwLjQ4MjY5NTIwMjM5NDU1MzcpLEZMMkZYQ09OU1RfREJMKDAuNDgzNzgwODI1MzY1NTQyMSksRkwyRlhDT05TVF9EQkwoMC40ODQ4NjcwNTc3MjM3NzE0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40ODU5NTM4OTg3ODYyNjMyKSxGTDJGWENPTlNUX0RCTCgwLjQ4NzA0MTM0Nzg3MTk0ODgpLEZMMkZYQ09OU1RfREJMKDAuNDg4MTI5NDA0MzAxNjYyMSksRkwyRlhDT05TVF9EQkwoMC40ODkyMTgwNjczOTgxMjk4KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40OTAzMDczMzY0ODU5NjQwKSxGTDJGWENPTlNUX0RCTCgwLjQ5MTM5NzIxMDg5MTY1MzMpLEZMMkZYQ09OU1RfREJMKDAuNDkyNDg3Njg5OTQzNTU0NSksRkwyRlhDT05TVF9EQkwoMC40OTM1Nzg3NzI5NzE4ODQ0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40OTQ2NzA0NTkzMDg3MTE2KSxGTDJGWENPTlNUX0RCTCgwLjQ5NTc2Mjc0ODI4Nzk0ODQpLEZMMkZYQ09OU1RfREJMKDAuNDk2ODU1NjM5MjQ1MzQyMyksRkwyRlhDT05TVF9EQkwoMC40OTc5NDkxMzE1MTg0Njg0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC40OTkwNDMyMjQ0NDY3MjExKSxGTDJGWENPTlNUX0RCTCgwLjUwMDEzNzkxNzM3MTMwNjIpLEZMMkZYQ09OU1RfREJMKDAuNTAxMjMzMjA5NjM1MjMyOCksRkwyRlhDT05TVF9EQkwoMC41MDIzMjkxMDA1ODMzMDU2KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41MDM0MjU1ODk1NjIxMTcxKSxGTDJGWENPTlNUX0RCTCgwLjUwNDUyMjY3NTkyMDAzOTkpLEZMMkZYQ09OU1RfREJMKDAuNTA1NjIwMzU5MDA3MjE4MSksRkwyRlhDT05TVF9EQkwoMC41MDY3MTg2MzgxNzU1NjExKSwKLSAgRkwyRlhDT05TVF9EQkwoMC41MDc4MTc1MTI3Nzg3MzQ2KSxGTDJGWENPTlNUX0RCTCgwLjUwODkxNjk4MjE3MjE1MzYpLEZMMkZYQ09OU1RfREJMKDAuNTEwMDE3MDQ1NzEyOTc0OSksRkwyRlhDT05TVF9EQkwoMC41MTExMTc3MDI3NjAwODkzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC41MTIyMTg5NTI2NzQxMTQzKSxGTDJGWENPTlNUX0RCTCgwLjUxMzMyMDc5NDgxNzM4NjgpLEZMMkZYQ09OU1RfREJMKDAuNTE0NDIzMjI4NTUzOTU1MiksRkwyRlhDT05TVF9EQkwoMC41MTU1MjYyNTMyNDk1NzI2KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41MTY2Mjk4NjgyNzE2ODk0KSxGTDJGWENPTlNUX0RCTCgwLjUxNzczNDA3Mjk4OTQ0NjApLEZMMkZYQ09OU1RfREJMKDAuNTE4ODM4ODY2NzczNjY1MiksRkwyRlhDT05TVF9EQkwoMC41MTk5NDQyNDg5OTY4NDU3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41MjEwNTAyMTkwMzMxNTQ0KSxGTDJGWENPTlNUX0RCTCgwLjUyMjE1Njc3NjI1ODQxOTgpLEZMMkZYQ09OU1RfREJMKDAuNTIzMjYzOTIwMDUwMTI0NyksRkwyRlhDT05TVF9EQkwoMC41MjQzNzE2NDk3ODczOTg5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41MjU0Nzk5NjQ4NTEwMTMwKSxGTDJGWENPTlNUX0RCTCgwLjUyNjU4ODg2NDYyMzM3MDUpLEZMMkZYQ09OU1RfREJMKDAuNTI3Njk4MzQ4NDg4NTAyMSksRkwyRlhDT05TVF9EQkwoMC41Mjg4MDg0MTU4MzIwNTc0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41Mjk5MTkwNjYwNDEyOTk1KSxGTDJGWENPTlNUX0RCTCgwLjUzMTAzMDI5ODUwNTA5NzUpLEZMMkZYQ09OU1RfREJMKDAuNTMyMTQyMTEyNjEzOTE5OCksRkwyRlhDT05TVF9EQkwoMC41MzMyNTQ1MDc3NTk4Mjc0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41MzQzNjc0ODMzMzY0Njc4KSxGTDJGWENPTlNUX0RCTCgwLjUzNTQ4MTAzODczOTA2NzUpLEZMMkZYQ09OU1RfREJMKDAuNTM2NTk1MTczMzY0NDI2MiksRkwyRlhDT05TVF9EQkwoMC41Mzc3MDk4ODY2MTA5MDk3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41Mzg4MjUxNzc4Nzg0NDM4KSxGTDJGWENPTlNUX0RCTCgwLjUzOTk0MTA0NjU2ODUwNzUpLEZMMkZYQ09OU1RfREJMKDAuNTQxMDU3NDkyMDg0MTI3MiksRkwyRlhDT05TVF9EQkwoMC41NDIxNzQ1MTM4Mjk4Njk1KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41NDMyOTIxMTEyMTE4MzUzKSxGTDJGWENPTlNUX0RCTCgwLjU0NDQxMDI4MzYzNzY1MzQpLEZMMkZYQ09OU1RfREJMKDAuNTQ1NTI5MDMwNTE2NDc0NCksRkwyRlhDT05TVF9EQkwoMC41NDY2NDgzNTEyNTg5NjQyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC41NDc3NjgyNDUyNzcyOTc2KSxGTDJGWENPTlNUX0RCTCgwLjU0ODg4ODcxMTk4NTE1MjkpLEZMMkZYQ09OU1RfREJMKDAuNTUwMDA5NzUwNzk3NzA1MCksRkwyRlhDT05TVF9EQkwoMC41NTExMzEzNjExMzE2MTk0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41NTIyNTM1NDI0MDUwNDY3KSxGTDJGWENPTlNUX0RCTCgwLjU1MzM3NjI5NDAzNzYxNTgpLEZMMkZYQ09OU1RfREJMKDAuNTU0NDk5NjE1NDUwNDI4NCksRkwyRlhDT05TVF9EQkwoMC41NTU2MjM1MDYwNjYwNTI4KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41NTY3NDc5NjUzMDg1MTgzKSxGTDJGWENPTlNUX0RCTCgwLjU1Nzg3Mjk5MjYwMzMwODcpLEZMMkZYQ09OU1RfREJMKDAuNTU4OTk4NTg3Mzc3MzU2OSksRkwyRlhDT05TVF9EQkwoMC41NjAxMjQ3NDkwNTkwMzg5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41NjEyNTE0NzcwNzgxNjgzKSxGTDJGWENPTlNUX0RCTCgwLjU2MjM3ODc3MDg2NTk4OTgpLEZMMkZYQ09OU1RfREJMKDAuNTYzNTA2NjI5ODU1MTc0MiksRkwyRlhDT05TVF9EQkwoMC41NjQ2MzUwNTM0Nzk4MTI1KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41NjU3NjQwNDExNzU0MDk3KSxGTDJGWENPTlNUX0RCTCgwLjU2Njg5MzU5MjM3ODg3OTkpLEZMMkZYQ09OU1RfREJMKDAuNTY4MDIzNzA2NTI4NTQwNCksRkwyRlhDT05TVF9EQkwoMC41NjkxNTQzODMwNjQxMDU5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41NzAyODU2MjE0MjY2ODMyKSxGTDJGWENPTlNUX0RCTCgwLjU3MTQxNzQyMTA1ODc2NTUpLEZMMkZYQ09OU1RfREJMKDAuNTcyNTQ5NzgxNDA0MjI3MSksRkwyRlhDT05TVF9EQkwoMC41NzM2ODI3MDE5MDgzMTc3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41NzQ4MTYxODIwMTc2NTczKSxGTDJGWENPTlNUX0RCTCgwLjU3NTk1MDIyMTE4MDIzMDQpLEZMMkZYQ09OU1RfREJMKDAuNTc3MDg0ODE4ODQ1MzgxMCksRkwyRlhDT05TVF9EQkwoMC41NzgyMTk5NzQ0NjM4MDY3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41NzkzNTU2ODc0ODc1NTQyKSxGTDJGWENPTlNUX0RCTCgwLjU4MDQ5MTk1NzM3MDAxMzEpLEZMMkZYQ09OU1RfREJMKDAuNTgxNjI4NzgzNTY1OTExNiksRkwyRlhDT05TVF9EQkwoMC41ODI3NjYxNjU1MzEzMTA0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41ODM5MDQxMDI3MjM1OTc5KSxGTDJGWENPTlNUX0RCTCgwLjU4NTA0MjU5NDYwMTQ4NTApLEZMMkZYQ09OU1RfREJMKDAuNTg2MTgxNjQwNjI1MDAwMCksRkwyRlhDT05TVF9EQkwoMC41ODczMjEyNDAyNTU0ODM0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41ODg0NjEzOTI5NTU1ODI2KSxGTDJGWENPTlNUX0RCTCgwLjU4OTYwMjA5ODE4OTI0NzQpLEZMMkZYQ09OU1RfREJMKDAuNTkwNzQzMzU1NDIxNzI0MiksRkwyRlhDT05TVF9EQkwoMC41OTE4ODUxNjQxMTk1NTE3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41OTMwMjc1MjM3NTA1NTU2KSxGTDJGWENPTlNUX0RCTCgwLjU5NDE3MDQzMzc4Mzg0MzQpLEZMMkZYQ09OU1RfREJMKDAuNTk1MzEzODkzNjg5Nzk5OSksRkwyRlhDT05TVF9EQkwoMC41OTY0NTc5MDI5NDAwODE5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC41OTc2MDI0NjEwMDc2MTM5KSxGTDJGWENPTlNUX0RCTCgwLjU5ODc0NzU2NzM2NjU4MjUpLEZMMkZYQ09OU1RfREJMKDAuNTk5ODkzMjIxNDkyNDMyMSksRkwyRlhDT05TVF9EQkwoMC42MDEwMzk0MjI4NjE4NTk3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42MDIxODYxNzA5NTI4MTA2KSxGTDJGWENPTlNUX0RCTCgwLjYwMzMzMzQ2NTI0NDQ3MzMpLEZMMkZYQ09OU1RfREJMKDAuNjA0NDgxMzA1MjE3Mjc0OCksRkwyRlhDT05TVF9EQkwoMC42MDU2Mjk2OTAzNTI4NzYxKSwKLSAgRkwyRlhDT05TVF9EQkwoMC42MDY3Nzg2MjAxMzQxNjcxKSxGTDJGWENPTlNUX0RCTCgwLjYwNzkyODA5NDA0NTI2MjUpLEZMMkZYQ09OU1RfREJMKDAuNjA5MDc4MTExNTcxNDk2NiksRkwyRlhDT05TVF9EQkwoMC42MTAyMjg2NzIxOTk0MTkyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC42MTEzNzk3NzU0MTY3OTA4KSxGTDJGWENPTlNUX0RCTCgwLjYxMjUzMTQyMDcxMjU3NzcpLEZMMkZYQ09OU1RfREJMKDAuNjEzNjgzNjA3NTc2OTQ4MiksRkwyRlhDT05TVF9EQkwoMC42MTQ4MzYzMzU1MDEyNjc0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42MTU5ODk2MDM5NzgwOTI5KSxGTDJGWENPTlNUX0RCTCgwLjYxNzE0MzQxMjUwMTE3MDgpLEZMMkZYQ09OU1RfREJMKDAuNjE4Mjk3NzYwNTY1NDMwNSksRkwyRlhDT05TVF9EQkwoMC42MTk0NTI2NDc2NjY5ODA4KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42MjA2MDgwNzMzMDMxMDU0KSxGTDJGWENPTlNUX0RCTCgwLjYyMTc2NDAzNjk3MjI1ODQpLEZMMkZYQ09OU1RfREJMKDAuNjIyOTIwNTM4MTc0MDU5OCksRkwyRlhDT05TVF9EQkwoMC42MjQwNzc1NzY0MDkyOTE5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42MjUyMzUxNTExNzk4OTM5KSxGTDJGWENPTlNUX0RCTCgwLjYyNjM5MzI2MTk4ODk1ODYpLEZMMkZYQ09OU1RfREJMKDAuNjI3NTUxOTA4MzQwNzI3NSksRkwyRlhDT05TVF9EQkwoMC42Mjg3MTEwODk3NDA1ODY5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42Mjk4NzA4MDU2OTUwNjM1KSxGTDJGWENPTlNUX0RCTCgwLjYzMTAzMTA1NTcxMTgyMDMpLEZMMkZYQ09OU1RfREJMKDAuNjMyMTkxODM5Mjk5NjUyMyksRkwyRlhDT05TVF9EQkwoMC42MzMzNTMxNTU5Njg0ODIzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC42MzQ1MTUwMDUyMjkzNTcxKSxGTDJGWENPTlNUX0RCTCgwLjYzNTY3NzM4NjU5NDQ0MzIpLEZMMkZYQ09OU1RfREJMKDAuNjM2ODQwMjk5NTc3MDIyNCksRkwyRlhDT05TVF9EQkwoMC42MzgwMDM3NDM2OTE0ODgxKSwKLSAgRkwyRlhDT05TVF9EQkwoMC42MzkxNjc3MTg0NTMzNDExKSxGTDJGWENPTlNUX0RCTCgwLjY0MDMzMjIyMzM3OTE4NTYpLEZMMkZYQ09OU1RfREJMKDAuNjQxNDk3MjU3OTg2NzI1NCksRkwyRlhDT05TVF9EQkwoMC42NDI2NjI4MjE3OTQ3NTk0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42NDM4Mjg5MTQzMjMxNzc5KSxGTDJGWENPTlNUX0RCTCgwLjY0NDk5NTUzNTA5Mjk1ODgpLEZMMkZYQ09OU1RfREJMKDAuNjQ2MTYyNjgzNjI2MTYzNiksRkwyRlhDT05TVF9EQkwoMC42NDczMzAzNTk0NDU5MzMwKSwKLSAgRkwyRlhDT05TVF9EQkwoMC42NDg0OTg1NjIwNzY0ODM5KSxGTDJGWENPTlNUX0RCTCgwLjY0OTY2NzI5MTA0MzEwNDcpLEZMMkZYQ09OU1RfREJMKDAuNjUwODM2NTQ1ODcyMTUxOCksRkwyRlhDT05TVF9EQkwoMC42NTIwMDYzMjYwOTEwNDU5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42NTMxNzY2MzEyMjgyNjc5KSxGTDJGWENPTlNUX0RCTCgwLjY1NDM0NzQ2MDgxMzM1NTIpLEZMMkZYQ09OU1RfREJMKDAuNjU1NTE4ODE0Mzc2ODk3OSksRkwyRlhDT05TVF9EQkwoMC42NTY2OTA2OTE0NTA1MzQ5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42NTc4NjMwOTE1NjY5NTA5KSxGTDJGWENPTlNUX0RCTCgwLjY1OTAzNjAxNDI1OTg3MTUpLEZMMkZYQ09OU1RfREJMKDAuNjYwMjA5NDU5MDY0MDYwMyksRkwyRlhDT05TVF9EQkwoMC42NjEzODM0MjU1MTUzMTQ5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42NjI1NTc5MTMxNTA0NjM1KSxGTDJGWENPTlNUX0RCTCgwLjY2MzczMjkyMTUwNzM2MTApLEZMMkZYQ09OU1RfREJMKDAuNjY0OTA4NDUwMTI0ODg1MSksRkwyRlhDT05TVF9EQkwoMC42NjYwODQ0OTg1NDI5MzM1KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42NjcyNjEwNjYzMDI0MTk3KSxGTDJGWENPTlNUX0RCTCgwLjY2ODQzODE1Mjk0NTI2OTEpLEZMMkZYQ09OU1RfREJMKDAuNjY5NjE1NzU4MDE0NDE2MyksRkwyRlhDT05TVF9EQkwoMC42NzA3OTM4ODEwNTM4MDExKSwKLSAgRkwyRlhDT05TVF9EQkwoMC42NzE5NzI1MjE2MDgzNjQ2KSxGTDJGWENPTlNUX0RCTCgwLjY3MzE1MTY3OTIyNDA0NjUpLEZMMkZYQ09OU1RfREJMKDAuNjc0MzMxMzUzNDQ3NzgwNyksRkwyRlhDT05TVF9EQkwoMC42NzU1MTE1NDM4Mjc0OTI3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42NzY2OTIyNDk5MTIwOTU1KSxGTDJGWENPTlNUX0RCTCgwLjY3Nzg3MzQ3MTI1MTQ4NjUpLEZMMkZYQ09OU1RfREJMKDAuNjc5MDU1MjA3Mzk2NTQzNSksRkwyRlhDT05TVF9EQkwoMC42ODAyMzc0NTc4OTkxMjIzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC42ODE0MjAyMjIzMTIwNTI0KSxGTDJGWENPTlNUX0RCTCgwLjY4MjYwMzUwMDE4OTEzNDApLEZMMkZYQ09OU1RfREJMKDAuNjgzNzg3MjkxMDg1MTM0NSksRkwyRlhDT05TVF9EQkwoMC42ODQ5NzE1OTQ1NTU3ODUzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC42ODYxNTY0MTAxNTc3Nzg0KSxGTDJGWENPTlNUX0RCTCgwLjY4NzM0MTczNzQ0ODc2MjkpLEZMMkZYQ09OU1RfREJMKDAuNjg4NTI3NTc1OTg3MzQyMCksRkwyRlhDT05TVF9EQkwoMC42ODk3MTM5MjUzMzMwNjk3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC42OTA5MDA3ODUwNDY0NDczKSxGTDJGWENPTlNUX0RCTCgwLjY5MjA4ODE1NDY4ODkxOTgpLEZMMkZYQ09OU1RfREJMKDAuNjkzMjc2MDMzODIyODczNyksRkwyRlhDT05TVF9EQkwoMC42OTQ0NjQ0MjIwMTE2MzMyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC42OTU2NTMzMTg4MTk0NTY1KSxGTDJGWENPTlNUX0RCTCgwLjY5Njg0MjcyMzgxMTUzMzIpLEZMMkZYQ09OU1RfREJMKDAuNjk4MDMyNjM2NTUzOTgxMyksRkwyRlhDT05TVF9EQkwoMC42OTkyMjMwNTY2MTM4NDM1KSwKLSAgRkwyRlhDT05TVF9EQkwoMC43MDA0MTM5ODM1NTkwODQ1KSxGTDJGWENPTlNUX0RCTCgwLjcwMTYwNTQxNjk1ODU4NjkpLEZMMkZYQ09OU1RfREJMKDAuNzAyNzk3MzU2MzgyMTQ5OSksRkwyRlhDT05TVF9EQkwoMC43MDM5ODk4MDE0MDA0ODQzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC43MDUxODI3NTE1ODUyMTA2KSxGTDJGWENPTlNUX0RCTCgwLjcwNjM3NjIwNjUwODg1NTQpLEZMMkZYQ09OU1RfREJMKDAuNzA3NTcwMTY1NzQ0ODQ4MyksRkwyRlhDT05TVF9EQkwoMC43MDg3NjQ2Mjg4Njc1MTk2KSwKLSAgRkwyRlhDT05TVF9EQkwoMC43MDk5NTk1OTU0NTIwOTYwKSxGTDJGWENPTlNUX0RCTCgwLjcxMTE1NTA2NTA3NDY5ODgpLEZMMkZYQ09OU1RfREJMKDAuNzEyMzUxMDM3MzEyMzQwMiksRkwyRlhDT05TVF9EQkwoMC43MTM1NDc1MTE3NDI5MjAyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC43MTQ3NDQ0ODc5NDUyMjQ0KSxGTDJGWENPTlNUX0RCTCgwLjcxNTk0MTk2NTQ5ODkyMDApLEZMMkZYQ09OU1RfREJMKDAuNzE3MTM5OTQzOTg0NTUzOCksRkwyRlhDT05TVF9EQkwoMC43MTgzMzg0MjI5ODM1NDg2KSwKLSAgRkwyRlhDT05TVF9EQkwoMC43MTk1Mzc0MDIwNzgyMDA1KSxGTDJGWENPTlNUX0RCTCgwLjcyMDczNjg4MDg1MTY3NjIpLEZMMkZYQ09OU1RfREJMKDAuNzIxOTM2ODU4ODg4MDA5NyksRkwyRlhDT05TVF9EQkwoMC43MjMxMzczMzU3NzIwOTk3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC43MjQzMzgzMTEwODk3MDY2KSxGTDJGWENPTlNUX0RCTCgwLjcyNTUzOTc4NDQyNzQ0OTYpLEZMMkZYQ09OU1RfREJMKDAuNzI2NzQxNzU1MzcyODA0MyksRkwyRlhDT05TVF9EQkwoMC43Mjc5NDQyMjM1MTQwOTkyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC43MjkxNDcxODg0NDA1MTMwKSxGTDJGWENPTlNUX0RCTCgwLjczMDM1MDY0OTc0MjA3MjQpLEZMMkZYQ09OU1RfREJMKDAuNzMxNTU0NjA3MDA5NjQ4NyksRkwyRlhDT05TVF9EQkwoMC43MzI3NTkwNTk4MzQ5NTUzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC43MzM5NjQwMDc4MTA1NDQ1KSxGTDJGWENPTlNUX0RCTCgwLjczNTE2OTQ1MDUyOTgwNTUpLEZMMkZYQ09OU1RfREJMKDAuNzM2Mzc1Mzg3NTg2OTYxMCksRkwyRlhDT05TVF9EQkwoMC43Mzc1ODE4MTg1NzcwNjQ3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC43Mzg3ODg3NDMwOTU5OTg3KSxGTDJGWENPTlNUX0RCTCgwLjczOTk5NjE2MDc0MDQ3MDYpLEZMMkZYQ09OU1RfREJMKDAuNzQxMjA0MDcxMTA4MDEwOCksRkwyRlhDT05TVF9EQkwoMC43NDI0MTI0NzM3OTY5NzAxKSwKLSAgRkwyRlhDT05TVF9EQkwoMC43NDM2MjEzNjg0MDY1MTY2KSxGTDJGWENPTlNUX0RCTCgwLjc0NDgzMDc1NDUzNjYzMzQpLEZMMkZYQ09OU1RfREJMKDAuNzQ2MDQwNjMxNzg4MTE1OCksRkwyRlhDT05TVF9EQkwoMC43NDcyNTA5OTk3NjI1Njg2KSwKLSAgRkwyRlhDT05TVF9EQkwoMC43NDg0NjE4NTgwNjI0MDM2KSxGTDJGWENPTlNUX0RCTCgwLjc0OTY3MzIwNjI5MDgzNzIpLEZMMkZYQ09OU1RfREJMKDAuNzUwODg1MDQ0MDUxODg3MiksRkwyRlhDT05TVF9EQkwoMC43NTIwOTczNzA5NTAzNzA0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC43NTMzMTAxODY1OTE5MDA5KSxGTDJGWENPTlNUX0RCTCgwLjc1NDUyMzQ5MDU4Mjg4NjIpLEZMMkZYQ09OU1RfREJMKDAuNzU1NzM3MjgyNTMwNTI1MiksRkwyRlhDT05TVF9EQkwoMC43NTY5NTE1NjIwNDI4MDYyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC43NTgxNjYzMjg3Mjg1MDM1KSxGTDJGWENPTlNUX0RCTCgwLjc1OTM4MTU4MjE5NzE3NTYpLEZMMkZYQ09OU1RfREJMKDAuNzYwNTk3MzIyMDU5MTYxOSksRkwyRlhDT05TVF9EQkwoMC43NjE4MTM1NDc5MjU1ODEwKSwKLSAgRkwyRlhDT05TVF9EQkwoMC43NjMwMzAyNTk0MDgzMjc3KSxGTDJGWENPTlNUX0RCTCgwLjc2NDI0NzQ1NjEyMDA3MDgpLEZMMkZYQ09OU1RfREJMKDAuNzY1NDY1MTM3Njc0MjUwNSksRkwyRlhDT05TVF9EQkwoMC43NjY2ODMzMDM2ODUwNzYwKSwKLSAgRkwyRlhDT05TVF9EQkwoMC43Njc5MDE5NTM3Njc1MjI3KSxGTDJGWENPTlNUX0RCTCgwLjc2OTEyMTA4NzUzNzMzMDcpLEZMMkZYQ09OU1RfREJMKDAuNzcwMzQwNzA0NjExMDAxMSksRkwyRlhDT05TVF9EQkwoMC43NzE1NjA4MDQ2MDU3OTQ4KSwKLSAgRkwyRlhDT05TVF9EQkwoMC43NzI3ODEzODcxMzk3MjkzKSxGTDJGWENPTlNUX0RCTCgwLjc3NDAwMjQ1MTgzMTU3NjUpLEZMMkZYQ09OU1RfREJMKDAuNzc1MjIzOTk4MzAwODYwNSksRkwyRlhDT05TVF9EQkwoMC43NzY0NDYwMjYxNjc4NTUxKSwKLSAgRkwyRlhDT05TVF9EQkwoMC43Nzc2Njg1MzUwNTM1ODE0KSxGTDJGWENPTlNUX0RCTCgwLjc3ODg5MTUyNDU3OTgwNTQpLEZMMkZYQ09OU1RfREJMKDAuNzgwMTE0OTk0MzY5MDM2MCksRkwyRlhDT05TVF9EQkwoMC43ODEzMzg5NDQwNDQ1MjIzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC43ODI1NjMzNzMyMzAyNTEzKSxGTDJGWENPTlNUX0RCTCgwLjc4Mzc4ODI4MTU1MDk0NTgpLEZMMkZYQ09OU1RfREJMKDAuNzg1MDEzNjY4NjMyMDYyMSksRkwyRlhDT05TVF9EQkwoMC43ODYyMzk1MzQwOTk3ODc0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC43ODc0NjU4Nzc1ODEwMzc4KSxGTDJGWENPTlNUX0RCTCgwLjc4ODY5MjY5ODcwMzQ1NTkpLEZMMkZYQ09OU1RfREJMKDAuNzg5OTE5OTk3MDk1NDA4OCksRkwyRlhDT05TVF9EQkwoMC43OTExNDc3NzIzODU5ODUzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC43OTIzNzYwMjQyMDQ5OTQ0KSxGTDJGWENPTlNUX0RCTCgwLjc5MzYwNDc1MjE4Mjk2MjMpLEZMMkZYQ09OU1RfREJMKDAuNzk0ODMzOTU1OTUxMTMwOCksRkwyRlhDT05TVF9EQkwoMC43OTYwNjM2MzUxNDE0NTQ2KSwKLSAgRkwyRlhDT05TVF9EQkwoMC43OTcyOTM3ODkzODY1OTk1KSxGTDJGWENPTlNUX0RCTCgwLjc5ODUyNDQxODMxOTkzOTkpLEZMMkZYQ09OU1RfREJMKDAuNzk5NzU1NTIxNTc1NTU3MCksRkwyRlhDT05TVF9EQkwoMC44MDA5ODcwOTg3ODgyMzU5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC44MDIyMTkxNDk1OTM0NjQ0KSxGTDJGWENPTlNUX0RCTCgwLjgwMzQ1MTY3MzYyNzQzMDEpLEZMMkZYQ09OU1RfREJMKDAuODA0Njg0NjcwNTI3MDE4NSksRkwyRlhDT05TVF9EQkwoMC44MDU5MTgxMzk5Mjk4MTEwKSwKLSAgRkwyRlhDT05TVF9EQkwoMC44MDcxNTIwODE0NzQwODIyKSxGTDJGWENPTlNUX0RCTCgwLjgwODM4NjQ5NDc5ODc5ODkpLEZMMkZYQ09OU1RfREJMKDAuODA5NjIxMzc5NTQzNjE2NiksRkwyRlhDT05TVF9EQkwoMC44MTA4NTY3MzUzNDg4Nzg0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC44MTIwOTI1NjE4NTU2MTI3KSxGTDJGWENPTlNUX0RCTCgwLjgxMzMyODg1ODcwNTUzMDgpLEZMMkZYQ09OU1RfREJMKDAuODE0NTY1NjI1NTQxMDI1MyksRkwyRlhDT05TVF9EQkwoMC44MTU4MDI4NjIwMDUxNjc0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC44MTcwNDA1Njc3NDE3MDUzKSxGTDJGWENPTlNUX0RCTCgwLjgxODI3ODc0MjM5NTA2MjIpLEZMMkZYQ09OU1RfREJMKDAuODE5NTE3Mzg1NjEwMzM0MSksRkwyRlhDT05TVF9EQkwoMC44MjA3NTY0OTcwMzMyODc1KSwKLSAgRkwyRlhDT05TVF9EQkwoMC44MjE5OTYwNzYzMTAzNTgwKSxGTDJGWENPTlNUX0RCTCgwLjgyMzIzNjEyMzA4ODY0NzcpLEZMMkZYQ09OU1RfREJMKDAuODI0NDc2NjM3MDE1OTIzNCksRkwyRlhDT05TVF9EQkwoMC44MjU3MTc2MTc3NDA2MTUwKSwKLSAgRkwyRlhDT05TVF9EQkwoMC44MjY5NTkwNjQ5MTE4MTI1KSxGTDJGWENPTlNUX0RCTCgwLjgyODIwMDk3ODE3OTI2NTApLEZMMkZYQ09OU1RfREJMKDAuODI5NDQzMzU3MTkzMzc4NCksRkwyRlhDT05TVF9EQkwoMC44MzA2ODYyMDE2MDUyMTMyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC44MzE5Mjk1MTEwNjY0ODMxKSxGTDJGWENPTlNUX0RCTCgwLjgzMzE3MzI4NTIyOTU1MjApLEZMMkZYQ09OU1RfREJMKDAuODM0NDE3NTIzNzQ3NDMzNiksRkwyRlhDT05TVF9EQkwoMC44MzU2NjIyMjYyNzM3ODc4KSwKLSAgRkwyRlhDT05TVF9EQkwoMC44MzY5MDczOTI0NjI5MjAyKSxGTDJGWENPTlNUX0RCTCgwLjgzODE1MzAyMTk2OTc3OTMpLEZMMkZYQ09OU1RfREJMKDAuODM5Mzk5MTE0NDQ5OTU0NSksRkwyRlhDT05TVF9EQkwoMC44NDA2NDU2Njk1NTk2NzUyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC44NDE4OTI2ODY5NTU4MDc5KSxGTDJGWENPTlNUX0RCTCgwLjg0MzE0MDE2NjI5NTg1NDQpLEZMMkZYQ09OU1RfREJMKDAuODQ0Mzg4MTA3MjM3OTUwNyksRkwyRlhDT05TVF9EQkwoMC44NDU2MzY1MDk0NDA4NjQyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC44NDY4ODUzNzI1NjM5OTIzKSxGTDJGWENPTlNUX0RCTCgwLjg0ODEzNDY5NjI2NzM2MDYpLEZMMkZYQ09OU1RfREJMKDAuODQ5Mzg0NDgwMjExNjIwOCksRkwyRlhDT05TVF9EQkwoMC44NTA2MzQ3MjQwNTgwNDkyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC44NTE4ODU0Mjc0Njg1NDQyKSxGTDJGWENPTlNUX0RCTCgwLjg1MzEzNjU5MDEwNTYyNTMpLEZMMkZYQ09OU1RfREJMKDAuODU0Mzg4MjExNjMyNDMwNyksRkwyRlhDT05TVF9EQkwoMC44NTU2NDAyOTE3MTI3MTU3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC44NTY4OTI4MzAwMTA4NTEyKSxGTDJGWENPTlNUX0RCTCgwLjg1ODE0NTgyNjE5MTgyMDkpLEZMMkZYQ09OU1RfREJMKDAuODU5Mzk5Mjc5OTIxMjIwNyksRkwyRlhDT05TVF9EQkwoMC44NjA2NTMxOTA4NjUyNTYzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC44NjE5MDc1NTg2OTA3NDE0KSxGTDJGWENPTlNUX0RCTCgwLjg2MzE2MjM4MzA2NTA5NjIpLEZMMkZYQ09OU1RfREJMKDAuODY0NDE3NjYzNjU2MzQ1MiksRkwyRlhDT05TVF9EQkwoMC44NjU2NzM0MDAxMzMxMTYxKSwKLSAgRkwyRlhDT05TVF9EQkwoMC44NjY5Mjk1OTIxNjQ2Mzc1KSxGTDJGWENPTlNUX0RCTCgwLjg2ODE4NjIzOTQyMDczNzEpLEZMMkZYQ09OU1RfREJMKDAuODY5NDQzMzQxNTcxODQwNyksRkwyRlhDT05TVF9EQkwoMC44NzA3MDA4OTgyODg5Njk1KSwKLSAgRkwyRlhDT05TVF9EQkwoMC44NzE5NTg5MDkyNDM3MzkxKSxGTDJGWENPTlNUX0RCTCgwLjg3MzIxNzM3NDEwODM1NzQpLEZMMkZYQ09OU1RfREJMKDAuODc0NDc2MjkyNTU1NjIzMiksRkwyRlhDT05TVF9EQkwoMC44NzU3MzU2NjQyNTg5MjQxKSwKLSAgRkwyRlhDT05TVF9EQkwoMC44NzY5OTU0ODg4OTIyMzUyKSxGTDJGWENPTlNUX0RCTCgwLjg3ODI1NTc2NjEzMDExNzEpLEZMMkZYQ09OU1RfREJMKDAuODc5NTE2NDk1NjQ3NzE0NiksRkwyRlhDT05TVF9EQkwoMC44ODA3Nzc2NzcxMjA3NTQ1KSwKLSAgRkwyRlhDT05TVF9EQkwoMC44ODIwMzkzMTAyMjU1NDQzKSxGTDJGWENPTlNUX0RCTCgwLjg4MzMwMTM5NDYzODk3MDQpLEZMMkZYQ09OU1RfREJMKDAuODg0NTYzOTMwMDM4NDk2OSksRkwyRlhDT05TVF9EQkwoMC44ODU4MjY5MTYxMDIxNjI5KSwKLSAgRkwyRlhDT05TVF9EQkwoMC44ODcwOTAzNTI1MDg1ODE5KSxGTDJGWENPTlNUX0RCTCgwLjg4ODM1NDIzODkzNjkzOTkpLEZMMkZYQ09OU1RfREJMKDAuODg5NjE4NTc1MDY2OTkzMyksRkwyRlhDT05TVF9EQkwoMC44OTA4ODMzNjA1NzkwNjc4KSwKLSAgRkwyRlhDT05TVF9EQkwoMC44OTIxNDg1OTUxNTQwNTY1KSxGTDJGWENPTlNUX0RCTCgwLjg5MzQxNDI3ODQ3MzQxODcpLEZMMkZYQ09OU1RfREJMKDAuODk0NjgwNDEwMjE5MTc3NiksRkwyRlhDT05TVF9EQkwoMC44OTU5NDY5OTAwNzM5MTkxKSwKLSAgRkwyRlhDT05TVF9EQkwoMC44OTcyMTQwMTc3MjA3OTA2KSxGTDJGWENPTlNUX0RCTCgwLjg5ODQ4MTQ5Mjg0MzQ5ODUpLEZMMkZYQ09OU1RfREJMKDAuODk5NzQ5NDE1MTI2MzA3NyksRkwyRlhDT05TVF9EQkwoMC45MDEwMTc3ODQyNTQwMzkwKSwKLSAgRkwyRlhDT05TVF9EQkwoMC45MDIyODY1OTk5MTIwNjgyKSxGTDJGWENPTlNUX0RCTCgwLjkwMzU1NTg2MTc4NjMyNDIpLEZMMkZYQ09OU1RfREJMKDAuOTA0ODI1NTY5NTYzMjg3OCksRkwyRlhDT05TVF9EQkwoMC45MDYwOTU3MjI5Mjk5ODk1KSwKLSAgRkwyRlhDT05TVF9EQkwoMC45MDczNjYzMjE1NzQwMDkyKSxGTDJGWENPTlNUX0RCTCgwLjkwODYzNzM2NTE4MzQ3MjkpLEZMMkZYQ09OU1RfREJMKDAuOTA5OTA4ODUzNDQ3MDUyOCksRkwyRlhDT05TVF9EQkwoMC45MTExODA3ODYwNTM5NjQ3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC45MTI0NTMxNjI2OTM5NjcyKSxGTDJGWENPTlNUX0RCTCgwLjkxMzcyNTk4MzA1NzM1OTQpLEZMMkZYQ09OU1RfREJMKDAuOTE0OTk5MjQ2ODM0OTgwNSksRkwyRlhDT05TVF9EQkwoMC45MTYyNzI5NTM3MTgyMDcxKSwKLSAgRkwyRlhDT05TVF9EQkwoMC45MTc1NDcxMDMzOTg5NTI0KSxGTDJGWENPTlNUX0RCTCgwLjkxODgyMTY5NTU2OTY2NDgpLEZMMkZYQ09OU1RfREJMKDAuOTIwMDk2NzI5OTIzMzI1OCksRkwyRlhDT05TVF9EQkwoMC45MjEzNzIyMDYxNTM0NDk0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC45MjI2NDgxMjM5NTQwNzk1KSxGTDJGWENPTlNUX0RCTCgwLjkyMzkyNDQ4MzAxOTc4OTYpLEZMMkZYQ09OU1RfREJMKDAuOTI1MjAxMjgzMDQ1NjgwNSksRkwyRlhDT05TVF9EQkwoMC45MjY0Nzg1MjM3MjczNzkzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC45Mjc3NTYyMDQ3NjEwMzc2KSxGTDJGWENPTlNUX0RCTCgwLjkyOTAzNDMyNTg0MzMzMDUpLEZMMkZYQ09OU1RfREJMKDAuOTMwMzEyODg2NjcxNDU0NyksRkwyRlhDT05TVF9EQkwoMC45MzE1OTE4ODY5NDMxMjc1KSwKLSAgRkwyRlhDT05TVF9EQkwoMC45MzI4NzEzMjYzNTY1ODQ4KSxGTDJGWENPTlNUX0RCTCgwLjkzNDE1MTIwNDYxMDU4MDIpLEZMMkZYQ09OU1RfREJMKDAuOTM1NDMxNTIxNDA0MzgzNiksRkwyRlhDT05TVF9EQkwoMC45MzY3MTIyNzY0Mzc3NzkyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC45Mzc5OTM0Njk0MTEwNjQ4KSxGTDJGWENPTlNUX0RCTCgwLjkzOTI3NTEwMDAyNTA0OTcpLEZMMkZYQ09OU1RfREJMKDAuOTQwNTU3MTY3OTgxMDU0MiksRkwyRlhDT05TVF9EQkwoMC45NDE4Mzk2NzI5ODA5MDcyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC45NDMxMjI2MTQ3MjY5NDU2KSxGTDJGWENPTlNUX0RCTCgwLjk0NDQwNTk5MjkyMjAxMjQpLEZMMkZYQ09OU1RfREJMKDAuOTQ1Njg5ODA3MjY5NDU1OCksRkwyRlhDT05TVF9EQkwoMC45NDY5NzQwNTc0NzMxMjc1KSwKLSAgRkwyRlhDT05TVF9EQkwoMC45NDgyNTg3NDMyMzczODEwKSxGTDJGWENPTlNUX0RCTCgwLjk0OTU0Mzg2NDI2NzA3MTMpLEZMMkZYQ09OU1RfREJMKDAuOTUwODI5NDIwMjY3NTUyMiksRkwyRlhDT05TVF9EQkwoMC45NTIxMTU0MTA5NDQ2NzYzKSwKLSAgRkwyRlhDT05TVF9EQkwoMC45NTM0MDE4MzYwMDQ3OTI2KSxGTDJGWENPTlNUX0RCTCgwLjk1NDY4ODY5NTE1NDc0NTUpLEZMMkZYQ09OU1RfREJMKDAuOTU1OTc1OTg4MTAxODczOCksRkwyRlhDT05TVF9EQkwoMC45NTcyNjM3MTQ1NTQwMDg3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC45NTg1NTE4NzQyMTk0NzMyKSxGTDJGWENPTlNUX0RCTCgwLjk1OTg0MDQ2NjgwNzA4MDIpLEZMMkZYQ09OU1RfREJMKDAuOTYxMTI5NDkyMDI2MTMxNyksRkwyRlhDT05TVF9EQkwoMC45NjI0MTg5NDk1ODY0MTY4KSwKLSAgRkwyRlhDT05TVF9EQkwoMC45NjM3MDg4MzkxOTgyMTEwKSxGTDJGWENPTlNUX0RCTCgwLjk2NDk5OTE2MDU3MjI3NTApLEZMMkZYQ09OU1RfREJMKDAuOTY2Mjg5OTEzNDE5ODUyNCksRkwyRlhDT05TVF9EQkwoMC45Njc1ODEwOTc0NTI2Njk3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC45Njg4NzI3MTIzODI5MzQzKSxGTDJGWENPTlNUX0RCTCgwLjk3MDE2NDc1NzkyMzMzMzApLEZMMkZYQ09OU1RfREJMKDAuOTcxNDU3MjMzNzg3MDMxNiksRkwyRlhDT05TVF9EQkwoMC45NzI3NTAxMzk2ODc2NzI3KSwKLSAgRkwyRlhDT05TVF9EQkwoMC45NzQwNDM0NzUzMzkzNzQ5KSxGTDJGWENPTlNUX0RCTCgwLjk3NTMzNzI0MDQ1NjczMTMpLEZMMkZYQ09OU1RfREJMKDAuOTc2NjMxNDM0NzU0ODA4NyksRkwyRlhDT05TVF9EQkwoMC45Nzc5MjYwNTc5NDkxNDYwKSwKLSAgRkwyRlhDT05TVF9EQkwoMC45NzkyMjExMDk3NTU3NTI3KSxGTDJGWENPTlNUX0RCTCgwLjk4MDUxNjU4OTg5MTEwODEpLEZMMkZYQ09OU1RfREJMKDAuOTgxODEyNDk4MDcyMTYwMCksRkwyRlhDT05TVF9EQkwoMC45ODMxMDg4MzQwMTYzMjMyKSwKLSAgRkwyRlhDT05TVF9EQkwoMC45ODQ0MDU1OTc0NDE0Nzg2KSxGTDJGWENPTlNUX0RCTCgwLjk4NTcwMjc4ODA2NTk3MTYpLEZMMkZYQ09OU1RfREJMKDAuOTg3MDAwNDA1NjA4NjExMSksRkwyRlhDT05TVF9EQkwoMC45ODgyOTg0NDk3ODg2Njg0KSwKLSAgRkwyRlhDT05TVF9EQkwoMC45ODk1OTY5MjAzMjU4NzU5KSxGTDJGWENPTlNUX0RCTCgwLjk5MDg5NTgxNjk0MDQyNTUpLEZMMkZYQ09OU1RfREJMKDAuOTkyMTk1MTM5MzUyOTY4MCksRkwyRlhDT05TVF9EQkwoMC45OTM0OTQ4ODcyODQ2MTE2KSwKLSAgRkwyRlhDT05TVF9EQkwoMC45OTQ3OTUwNjA0NTY5MjA2KSxGTDJGWENPTlNUX0RCTCgwLjk5NjA5NTY1ODU5MTkxNDQpLEZMMkZYQ09OU1RfREJMKDAuOTk3Mzk2NjgxNDEyMDY2NSksRkwyRlhDT05TVF9EQkwoMC45OTg2OTgxMjg2NDAzMDI1KQotfTsKK2NvbnN0IEZJWFBfREJMIEZES2FhY0VuY19tVGFiXzRfM0VsY1s1MTJdID0geworICAgIEZMMkZYQ09OU1RfREJMKDAuMzk2ODUwMjYyOTkyMDQ5OSksIEZMMkZYQ09OU1RfREJMKDAuMzk3ODg0MDYzNDg2ODMzNSksCisgICAgRkwyRlhDT05TVF9EQkwoMC4zOTg5MTg1MzU5MzU0NzExKSwgRkwyRlhDT05TVF9EQkwoMC4zOTk5NTM2Nzk0NjYxNDMyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQwMDk4OTQ5MzIwOTg1MzEpLCBGTDJGWENPTlNUX0RCTCgwLjQwMjAyNTk3NjMwMDQxMTUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDAzMDYzMTI3ODc0NDIyNyksIEZMMkZYQ09OU1RfREJMKDAuNDA0MTAwOTQ3MDcxMjY5NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MDUxMzk0MzMwMzMwOTk2KSwgRkwyRlhDT05TVF9EQkwoMC40MDYxNzg1ODQ5MDQ4MTEwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQwNzIxODQwMTgzNDAzODApLCBGTDJGWENPTlNUX0RCTCgwLjQwODI1ODg4Mjk3MTEzNzIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDA5MzAwMDI3NDY5MTczOSksIEZMMkZYQ09OU1RfREJMKDAuNDEwMzQxODM0NDgzOTA3OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MTEzODQzMDMxNzM3Nzk4KSwgRkwyRlhDT05TVF9EQkwoMC40MTI0Mjc0MzI2OTk4OTgwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQxMzQ3MTIyMjIyNjAyNDUpLCBGTDJGWENPTlNUX0RCTCgwLjQxNDUxNTY3MDkxODU2MjApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDE1NTYwNzc3OTQ2NTQwMCksIEZMMkZYQ09OU1RfREJMKDAuNDE2NjA2NTQyNDgxNjAyMiksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MTc2NTI5NjM2OTc5OTMyKSwgRkwyRlhDT05TVF9EQkwoMC40MTg3MDAwNDA3NzI1NDUyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQxOTc0Nzc3Mjg4NDY2NTIpLCBGTDJGWENPTlNUX0RCTCgwLjQyMDc5NjE1OTIxNjMyMjIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDIxODQ1MTk4OTUyMDM0NSksIEZMMkZYQ09OU1RfREJMKDAuNDIyODk0ODkxMjc4ODU2NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MjM5NDUyMzUzODYzNjczKSwgRkwyRlhDT05TVF9EQkwoMC40MjQ5OTYyMzA0NjY2NTY0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQyNjA0Nzg3NTcxNDMxMzApLCBGTDJGWENPTlNUX0RCTCgwLjQyNzEwMDE3MDMyNjQxMjQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDI4MTUzMTEzNTAyNTA0NiksIEZMMkZYQ09OU1RfREJMKDAuNDI5MjA2NzA0NDQ0NjAxNyksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MzAyNjA5NDIzNTcxNjU4KSwgRkwyRlhDT05TVF9EQkwoMC40MzEzMTU4MjY0NDcwOTcwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQzMjM3MTM1NTkyMzcyMTYpLCBGTDJGWENPTlNUX0RCTCgwLjQzMzQyNzUyOTk5ODc4MDMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDM0NDg0MzQ3ODg2NDE2MSksIEZMMkZYQ09OU1RfREJMKDAuNDM1NTQxODA4ODAzMTYzMCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MzY1OTk5MTE5Njc5MzM5KSwgRkwyRlhDT05TVF9EQkwoMC40Mzc2NTg2NTY2MDIwMDk2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQzODcxODA0MTkyOTAyNzIpLCBGTDJGWENPTlNUX0RCTCgwLjQzOTc3ODA2NzE3NDk2ODMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDQwODM4NzMxNTY4MTQ4MCksIEZMMkZYQ09OU1RfREJMKDAuNDQxOTAwMDM0MzM5MjAzOSksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NDI5NjE5NzQ3MjEwODQ3KSwgRkwyRlhDT05TVF9EQkwoMC40NDQwMjQ1NTE5NDkwMzg4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ0NTA4Nzc2NTI2MDYwMzgpLCBGTDJGWENPTlNUX0RCTCgwLjQ0NjE1MTYxMzg5NTU5NTMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDQ3MjE2MDk3MDk2MDk2MyksIEZMMkZYQ09OU1RfREJMKDAuNDQ4MjgxMjE0MTA2NDQ1OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NDkzNDY5NjQxNzMyMjg2KSwgRkwyRlhDT05TVF9EQkwoMC40NTA0MTMzNDY1NDUyNjQ4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ1MTQ4MDM2MDQ3MzU5ODQpLCBGTDJGWENPTlNUX0RCTCgwLjQ1MjU0ODAwNTIxMTQ4NzUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDUzNjE2MjgwMDE0MzkzOSksIEZMMkZYQ09OU1RfREJMKDAuNDU0Njg1MTg0MTM5OTcxOSksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NTU3NTQ3MTY4NDgwNTkxKSwgRkwyRlhDT05TVF9EQkwoMC40NTY4MjQ4Nzc0MDA2NjUyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ1Nzg5NTY2NTA2MTk2MjMpLCBGTDJGWENPTlNUX0RCTCgwLjQ1ODk2NzA3OTA5ODI3NDYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDYwMDM5MTE4Nzc4MDY4OCksIEZMMkZYQ09OU1RfREJMKDAuNDYxMTExNzgzMzcxOTQzMCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NjIxODUwNzIxNTI2MTg0KSwgRkwyRlhDT05TVF9EQkwoMC40NjMyNTg5ODQzOTQ5Mjc4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ2NDMzMzUxOTM3NTgwNjkpLCBGTDJGWENPTlNUX0RCTCgwLjQ2NTQwODY3NjM3NDI4NDIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDY2NDg0NDU0NjcxNDcxMyksIEZMMkZYQ09OU1RfREJMKDAuNDY3NTYwODUzNTUwNTUzMiksCisgICAgRkwyRlhDT05TVF9EQkwoMC40Njg2Mzc4NzIyOTY3NzkwKSwgRkwyRlhDT05TVF9EQkwoMC40Njk3MTU1MTAxOTc0NTIyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ3MDc5Mzc2NjU0MTkyMTYpLCBGTDJGWENPTlNUX0RCTCgwLjQ3MTg3MjY0MDYyMTU3MTMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDcyOTUyMTMxNzI5ODExOCksIEZMMkZYQ09OU1RfREJMKDAuNDc0MDMyMjM5MTYyMDcxMSksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NzUxMTI5NjIyMTU3ODQ1KSwgRkwyRlhDT05TVF9EQkwoMC40NzYxOTQzMDAxOTAzODY3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ3NzI3NjI1MjM4NzMwMTUpLCBGTDJGWENPTlNUX0RCTCgwLjQ3ODM1ODgxODEwOTkzMzgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDc5NDQxOTk2NjYzNjU5OSksIEZMMkZYQ09OU1RfREJMKDAuNDgwNTI1Nzg3MzU1ODE5MCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40ODE2MTAxODk0OTU3MDQyKSwgRkwyRlhDT05TVF9EQkwoMC40ODI2OTUyMDIzOTQ1NTM3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ4Mzc4MDgyNTM2NTU0MjEpLCBGTDJGWENPTlNUX0RCTCgwLjQ4NDg2NzA1NzcyMzc3MTQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDg1OTUzODk4Nzg2MjYzMiksIEZMMkZYQ09OU1RfREJMKDAuNDg3MDQxMzQ3ODcxOTQ4OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40ODgxMjk0MDQzMDE2NjIxKSwgRkwyRlhDT05TVF9EQkwoMC40ODkyMTgwNjczOTgxMjk4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ5MDMwNzMzNjQ4NTk2NDApLCBGTDJGWENPTlNUX0RCTCgwLjQ5MTM5NzIxMDg5MTY1MzMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDkyNDg3Njg5OTQzNTU0NSksIEZMMkZYQ09OU1RfREJMKDAuNDkzNTc4NzcyOTcxODg0NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40OTQ2NzA0NTkzMDg3MTE2KSwgRkwyRlhDT05TVF9EQkwoMC40OTU3NjI3NDgyODc5NDg0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ5Njg1NTYzOTI0NTM0MjMpLCBGTDJGWENPTlNUX0RCTCgwLjQ5Nzk0OTEzMTUxODQ2ODQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDk5MDQzMjI0NDQ2NzIxMSksIEZMMkZYQ09OU1RfREJMKDAuNTAwMTM3OTE3MzcxMzA2MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MDEyMzMyMDk2MzUyMzI4KSwgRkwyRlhDT05TVF9EQkwoMC41MDIzMjkxMDA1ODMzMDU2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUwMzQyNTU4OTU2MjExNzEpLCBGTDJGWENPTlNUX0RCTCgwLjUwNDUyMjY3NTkyMDAzOTkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTA1NjIwMzU5MDA3MjE4MSksIEZMMkZYQ09OU1RfREJMKDAuNTA2NzE4NjM4MTc1NTYxMSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MDc4MTc1MTI3Nzg3MzQ2KSwgRkwyRlhDT05TVF9EQkwoMC41MDg5MTY5ODIxNzIxNTM2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUxMDAxNzA0NTcxMjk3NDkpLCBGTDJGWENPTlNUX0RCTCgwLjUxMTExNzcwMjc2MDA4OTMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTEyMjE4OTUyNjc0MTE0MyksIEZMMkZYQ09OU1RfREJMKDAuNTEzMzIwNzk0ODE3Mzg2OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MTQ0MjMyMjg1NTM5NTUyKSwgRkwyRlhDT05TVF9EQkwoMC41MTU1MjYyNTMyNDk1NzI2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUxNjYyOTg2ODI3MTY4OTQpLCBGTDJGWENPTlNUX0RCTCgwLjUxNzczNDA3Mjk4OTQ0NjApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTE4ODM4ODY2NzczNjY1MiksIEZMMkZYQ09OU1RfREJMKDAuNTE5OTQ0MjQ4OTk2ODQ1NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MjEwNTAyMTkwMzMxNTQ0KSwgRkwyRlhDT05TVF9EQkwoMC41MjIxNTY3NzYyNTg0MTk4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUyMzI2MzkyMDA1MDEyNDcpLCBGTDJGWENPTlNUX0RCTCgwLjUyNDM3MTY0OTc4NzM5ODkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTI1NDc5OTY0ODUxMDEzMCksIEZMMkZYQ09OU1RfREJMKDAuNTI2NTg4ODY0NjIzMzcwNSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41Mjc2OTgzNDg0ODg1MDIxKSwgRkwyRlhDT05TVF9EQkwoMC41Mjg4MDg0MTU4MzIwNTc0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUyOTkxOTA2NjA0MTI5OTUpLCBGTDJGWENPTlNUX0RCTCgwLjUzMTAzMDI5ODUwNTA5NzUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTMyMTQyMTEyNjEzOTE5OCksIEZMMkZYQ09OU1RfREJMKDAuNTMzMjU0NTA3NzU5ODI3NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MzQzNjc0ODMzMzY0Njc4KSwgRkwyRlhDT05TVF9EQkwoMC41MzU0ODEwMzg3MzkwNjc1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUzNjU5NTE3MzM2NDQyNjIpLCBGTDJGWENPTlNUX0RCTCgwLjUzNzcwOTg4NjYxMDkwOTcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTM4ODI1MTc3ODc4NDQzOCksIEZMMkZYQ09OU1RfREJMKDAuNTM5OTQxMDQ2NTY4NTA3NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NDEwNTc0OTIwODQxMjcyKSwgRkwyRlhDT05TVF9EQkwoMC41NDIxNzQ1MTM4Mjk4Njk1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU0MzI5MjExMTIxMTgzNTMpLCBGTDJGWENPTlNUX0RCTCgwLjU0NDQxMDI4MzYzNzY1MzQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTQ1NTI5MDMwNTE2NDc0NCksIEZMMkZYQ09OU1RfREJMKDAuNTQ2NjQ4MzUxMjU4OTY0MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NDc3NjgyNDUyNzcyOTc2KSwgRkwyRlhDT05TVF9EQkwoMC41NDg4ODg3MTE5ODUxNTI5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU1MDAwOTc1MDc5NzcwNTApLCBGTDJGWENPTlNUX0RCTCgwLjU1MTEzMTM2MTEzMTYxOTQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTUyMjUzNTQyNDA1MDQ2NyksIEZMMkZYQ09OU1RfREJMKDAuNTUzMzc2Mjk0MDM3NjE1OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NTQ0OTk2MTU0NTA0Mjg0KSwgRkwyRlhDT05TVF9EQkwoMC41NTU2MjM1MDYwNjYwNTI4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU1Njc0Nzk2NTMwODUxODMpLCBGTDJGWENPTlNUX0RCTCgwLjU1Nzg3Mjk5MjYwMzMwODcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTU4OTk4NTg3Mzc3MzU2OSksIEZMMkZYQ09OU1RfREJMKDAuNTYwMTI0NzQ5MDU5MDM4OSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NjEyNTE0NzcwNzgxNjgzKSwgRkwyRlhDT05TVF9EQkwoMC41NjIzNzg3NzA4NjU5ODk4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU2MzUwNjYyOTg1NTE3NDIpLCBGTDJGWENPTlNUX0RCTCgwLjU2NDYzNTA1MzQ3OTgxMjUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTY1NzY0MDQxMTc1NDA5NyksIEZMMkZYQ09OU1RfREJMKDAuNTY2ODkzNTkyMzc4ODc5OSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NjgwMjM3MDY1Mjg1NDA0KSwgRkwyRlhDT05TVF9EQkwoMC41NjkxNTQzODMwNjQxMDU5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU3MDI4NTYyMTQyNjY4MzIpLCBGTDJGWENPTlNUX0RCTCgwLjU3MTQxNzQyMTA1ODc2NTUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTcyNTQ5NzgxNDA0MjI3MSksIEZMMkZYQ09OU1RfREJMKDAuNTczNjgyNzAxOTA4MzE3NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NzQ4MTYxODIwMTc2NTczKSwgRkwyRlhDT05TVF9EQkwoMC41NzU5NTAyMjExODAyMzA0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU3NzA4NDgxODg0NTM4MTApLCBGTDJGWENPTlNUX0RCTCgwLjU3ODIxOTk3NDQ2MzgwNjcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTc5MzU1Njg3NDg3NTU0MiksIEZMMkZYQ09OU1RfREJMKDAuNTgwNDkxOTU3MzcwMDEzMSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41ODE2Mjg3ODM1NjU5MTE2KSwgRkwyRlhDT05TVF9EQkwoMC41ODI3NjYxNjU1MzEzMTA0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU4MzkwNDEwMjcyMzU5NzkpLCBGTDJGWENPTlNUX0RCTCgwLjU4NTA0MjU5NDYwMTQ4NTApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTg2MTgxNjQwNjI1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNTg3MzIxMjQwMjU1NDgzNCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41ODg0NjEzOTI5NTU1ODI2KSwgRkwyRlhDT05TVF9EQkwoMC41ODk2MDIwOTgxODkyNDc0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU5MDc0MzM1NTQyMTcyNDIpLCBGTDJGWENPTlNUX0RCTCgwLjU5MTg4NTE2NDExOTU1MTcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTkzMDI3NTIzNzUwNTU1NiksIEZMMkZYQ09OU1RfREJMKDAuNTk0MTcwNDMzNzgzODQzNCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41OTUzMTM4OTM2ODk3OTk5KSwgRkwyRlhDT05TVF9EQkwoMC41OTY0NTc5MDI5NDAwODE5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU5NzYwMjQ2MTAwNzYxMzkpLCBGTDJGWENPTlNUX0RCTCgwLjU5ODc0NzU2NzM2NjU4MjUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTk5ODkzMjIxNDkyNDMyMSksIEZMMkZYQ09OU1RfREJMKDAuNjAxMDM5NDIyODYxODU5NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MDIxODYxNzA5NTI4MTA2KSwgRkwyRlhDT05TVF9EQkwoMC42MDMzMzM0NjUyNDQ0NzMzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYwNDQ4MTMwNTIxNzI3NDgpLCBGTDJGWENPTlNUX0RCTCgwLjYwNTYyOTY5MDM1Mjg3NjEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjA2Nzc4NjIwMTM0MTY3MSksIEZMMkZYQ09OU1RfREJMKDAuNjA3OTI4MDk0MDQ1MjYyNSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MDkwNzgxMTE1NzE0OTY2KSwgRkwyRlhDT05TVF9EQkwoMC42MTAyMjg2NzIxOTk0MTkyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYxMTM3OTc3NTQxNjc5MDgpLCBGTDJGWENPTlNUX0RCTCgwLjYxMjUzMTQyMDcxMjU3NzcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjEzNjgzNjA3NTc2OTQ4MiksIEZMMkZYQ09OU1RfREJMKDAuNjE0ODM2MzM1NTAxMjY3NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MTU5ODk2MDM5NzgwOTI5KSwgRkwyRlhDT05TVF9EQkwoMC42MTcxNDM0MTI1MDExNzA4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYxODI5Nzc2MDU2NTQzMDUpLCBGTDJGWENPTlNUX0RCTCgwLjYxOTQ1MjY0NzY2Njk4MDgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjIwNjA4MDczMzAzMTA1NCksIEZMMkZYQ09OU1RfREJMKDAuNjIxNzY0MDM2OTcyMjU4NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MjI5MjA1MzgxNzQwNTk4KSwgRkwyRlhDT05TVF9EQkwoMC42MjQwNzc1NzY0MDkyOTE5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYyNTIzNTE1MTE3OTg5MzkpLCBGTDJGWENPTlNUX0RCTCgwLjYyNjM5MzI2MTk4ODk1ODYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjI3NTUxOTA4MzQwNzI3NSksIEZMMkZYQ09OU1RfREJMKDAuNjI4NzExMDg5NzQwNTg2OSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42Mjk4NzA4MDU2OTUwNjM1KSwgRkwyRlhDT05TVF9EQkwoMC42MzEwMzEwNTU3MTE4MjAzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYzMjE5MTgzOTI5OTY1MjMpLCBGTDJGWENPTlNUX0RCTCgwLjYzMzM1MzE1NTk2ODQ4MjMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjM0NTE1MDA1MjI5MzU3MSksIEZMMkZYQ09OU1RfREJMKDAuNjM1Njc3Mzg2NTk0NDQzMiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MzY4NDAyOTk1NzcwMjI0KSwgRkwyRlhDT05TVF9EQkwoMC42MzgwMDM3NDM2OTE0ODgxKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYzOTE2NzcxODQ1MzM0MTEpLCBGTDJGWENPTlNUX0RCTCgwLjY0MDMzMjIyMzM3OTE4NTYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjQxNDk3MjU3OTg2NzI1NCksIEZMMkZYQ09OU1RfREJMKDAuNjQyNjYyODIxNzk0NzU5NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NDM4Mjg5MTQzMjMxNzc5KSwgRkwyRlhDT05TVF9EQkwoMC42NDQ5OTU1MzUwOTI5NTg4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY0NjE2MjY4MzYyNjE2MzYpLCBGTDJGWENPTlNUX0RCTCgwLjY0NzMzMDM1OTQ0NTkzMzApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjQ4NDk4NTYyMDc2NDgzOSksIEZMMkZYQ09OU1RfREJMKDAuNjQ5NjY3MjkxMDQzMTA0NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NTA4MzY1NDU4NzIxNTE4KSwgRkwyRlhDT05TVF9EQkwoMC42NTIwMDYzMjYwOTEwNDU5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY1MzE3NjYzMTIyODI2NzkpLCBGTDJGWENPTlNUX0RCTCgwLjY1NDM0NzQ2MDgxMzM1NTIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjU1NTE4ODE0Mzc2ODk3OSksIEZMMkZYQ09OU1RfREJMKDAuNjU2NjkwNjkxNDUwNTM0OSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NTc4NjMwOTE1NjY5NTA5KSwgRkwyRlhDT05TVF9EQkwoMC42NTkwMzYwMTQyNTk4NzE1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY2MDIwOTQ1OTA2NDA2MDMpLCBGTDJGWENPTlNUX0RCTCgwLjY2MTM4MzQyNTUxNTMxNDkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjYyNTU3OTEzMTUwNDYzNSksIEZMMkZYQ09OU1RfREJMKDAuNjYzNzMyOTIxNTA3MzYxMCksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NjQ5MDg0NTAxMjQ4ODUxKSwgRkwyRlhDT05TVF9EQkwoMC42NjYwODQ0OTg1NDI5MzM1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY2NzI2MTA2NjMwMjQxOTcpLCBGTDJGWENPTlNUX0RCTCgwLjY2ODQzODE1Mjk0NTI2OTEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjY5NjE1NzU4MDE0NDE2MyksIEZMMkZYQ09OU1RfREJMKDAuNjcwNzkzODgxMDUzODAxMSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NzE5NzI1MjE2MDgzNjQ2KSwgRkwyRlhDT05TVF9EQkwoMC42NzMxNTE2NzkyMjQwNDY1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY3NDMzMTM1MzQ0Nzc4MDcpLCBGTDJGWENPTlNUX0RCTCgwLjY3NTUxMTU0MzgyNzQ5MjcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjc2NjkyMjQ5OTEyMDk1NSksIEZMMkZYQ09OU1RfREJMKDAuNjc3ODczNDcxMjUxNDg2NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NzkwNTUyMDczOTY1NDM1KSwgRkwyRlhDT05TVF9EQkwoMC42ODAyMzc0NTc4OTkxMjIzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY4MTQyMDIyMjMxMjA1MjQpLCBGTDJGWENPTlNUX0RCTCgwLjY4MjYwMzUwMDE4OTEzNDApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjgzNzg3MjkxMDg1MTM0NSksIEZMMkZYQ09OU1RfREJMKDAuNjg0OTcxNTk0NTU1Nzg1MyksCisgICAgRkwyRlhDT05TVF9EQkwoMC42ODYxNTY0MTAxNTc3Nzg0KSwgRkwyRlhDT05TVF9EQkwoMC42ODczNDE3Mzc0NDg3NjI5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY4ODUyNzU3NTk4NzM0MjApLCBGTDJGWENPTlNUX0RCTCgwLjY4OTcxMzkyNTMzMzA2OTcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjkwOTAwNzg1MDQ2NDQ3MyksIEZMMkZYQ09OU1RfREJMKDAuNjkyMDg4MTU0Njg4OTE5OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC42OTMyNzYwMzM4MjI4NzM3KSwgRkwyRlhDT05TVF9EQkwoMC42OTQ0NjQ0MjIwMTE2MzMyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY5NTY1MzMxODgxOTQ1NjUpLCBGTDJGWENPTlNUX0RCTCgwLjY5Njg0MjcyMzgxMTUzMzIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjk4MDMyNjM2NTUzOTgxMyksIEZMMkZYQ09OU1RfREJMKDAuNjk5MjIzMDU2NjEzODQzNSksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MDA0MTM5ODM1NTkwODQ1KSwgRkwyRlhDT05TVF9EQkwoMC43MDE2MDU0MTY5NTg1ODY5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjcwMjc5NzM1NjM4MjE0OTkpLCBGTDJGWENPTlNUX0RCTCgwLjcwMzk4OTgwMTQwMDQ4NDMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzA1MTgyNzUxNTg1MjEwNiksIEZMMkZYQ09OU1RfREJMKDAuNzA2Mzc2MjA2NTA4ODU1NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MDc1NzAxNjU3NDQ4NDgzKSwgRkwyRlhDT05TVF9EQkwoMC43MDg3NjQ2Mjg4Njc1MTk2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjcwOTk1OTU5NTQ1MjA5NjApLCBGTDJGWENPTlNUX0RCTCgwLjcxMTE1NTA2NTA3NDY5ODgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzEyMzUxMDM3MzEyMzQwMiksIEZMMkZYQ09OU1RfREJMKDAuNzEzNTQ3NTExNzQyOTIwMiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MTQ3NDQ0ODc5NDUyMjQ0KSwgRkwyRlhDT05TVF9EQkwoMC43MTU5NDE5NjU0OTg5MjAwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjcxNzEzOTk0Mzk4NDU1MzgpLCBGTDJGWENPTlNUX0RCTCgwLjcxODMzODQyMjk4MzU0ODYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzE5NTM3NDAyMDc4MjAwNSksIEZMMkZYQ09OU1RfREJMKDAuNzIwNzM2ODgwODUxNjc2MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MjE5MzY4NTg4ODgwMDk3KSwgRkwyRlhDT05TVF9EQkwoMC43MjMxMzczMzU3NzIwOTk3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjcyNDMzODMxMTA4OTcwNjYpLCBGTDJGWENPTlNUX0RCTCgwLjcyNTUzOTc4NDQyNzQ0OTYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzI2NzQxNzU1MzcyODA0MyksIEZMMkZYQ09OU1RfREJMKDAuNzI3OTQ0MjIzNTE0MDk5MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MjkxNDcxODg0NDA1MTMwKSwgRkwyRlhDT05TVF9EQkwoMC43MzAzNTA2NDk3NDIwNzI0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjczMTU1NDYwNzAwOTY0ODcpLCBGTDJGWENPTlNUX0RCTCgwLjczMjc1OTA1OTgzNDk1NTMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzMzOTY0MDA3ODEwNTQ0NSksIEZMMkZYQ09OU1RfREJMKDAuNzM1MTY5NDUwNTI5ODA1NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MzYzNzUzODc1ODY5NjEwKSwgRkwyRlhDT05TVF9EQkwoMC43Mzc1ODE4MTg1NzcwNjQ3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjczODc4ODc0MzA5NTk5ODcpLCBGTDJGWENPTlNUX0RCTCgwLjczOTk5NjE2MDc0MDQ3MDYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzQxMjA0MDcxMTA4MDEwOCksIEZMMkZYQ09OU1RfREJMKDAuNzQyNDEyNDczNzk2OTcwMSksCisgICAgRkwyRlhDT05TVF9EQkwoMC43NDM2MjEzNjg0MDY1MTY2KSwgRkwyRlhDT05TVF9EQkwoMC43NDQ4MzA3NTQ1MzY2MzM0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc0NjA0MDYzMTc4ODExNTgpLCBGTDJGWENPTlNUX0RCTCgwLjc0NzI1MDk5OTc2MjU2ODYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzQ4NDYxODU4MDYyNDAzNiksIEZMMkZYQ09OU1RfREJMKDAuNzQ5NjczMjA2MjkwODM3MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43NTA4ODUwNDQwNTE4ODcyKSwgRkwyRlhDT05TVF9EQkwoMC43NTIwOTczNzA5NTAzNzA0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc1MzMxMDE4NjU5MTkwMDkpLCBGTDJGWENPTlNUX0RCTCgwLjc1NDUyMzQ5MDU4Mjg4NjIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzU1NzM3MjgyNTMwNTI1MiksIEZMMkZYQ09OU1RfREJMKDAuNzU2OTUxNTYyMDQyODA2MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43NTgxNjYzMjg3Mjg1MDM1KSwgRkwyRlhDT05TVF9EQkwoMC43NTkzODE1ODIxOTcxNzU2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc2MDU5NzMyMjA1OTE2MTkpLCBGTDJGWENPTlNUX0RCTCgwLjc2MTgxMzU0NzkyNTU4MTApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzYzMDMwMjU5NDA4MzI3NyksIEZMMkZYQ09OU1RfREJMKDAuNzY0MjQ3NDU2MTIwMDcwOCksCisgICAgRkwyRlhDT05TVF9EQkwoMC43NjU0NjUxMzc2NzQyNTA1KSwgRkwyRlhDT05TVF9EQkwoMC43NjY2ODMzMDM2ODUwNzYwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc2NzkwMTk1Mzc2NzUyMjcpLCBGTDJGWENPTlNUX0RCTCgwLjc2OTEyMTA4NzUzNzMzMDcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzcwMzQwNzA0NjExMDAxMSksIEZMMkZYQ09OU1RfREJMKDAuNzcxNTYwODA0NjA1Nzk0OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC43NzI3ODEzODcxMzk3MjkzKSwgRkwyRlhDT05TVF9EQkwoMC43NzQwMDI0NTE4MzE1NzY1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc3NTIyMzk5ODMwMDg2MDUpLCBGTDJGWENPTlNUX0RCTCgwLjc3NjQ0NjAyNjE2Nzg1NTEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzc3NjY4NTM1MDUzNTgxNCksIEZMMkZYQ09OU1RfREJMKDAuNzc4ODkxNTI0NTc5ODA1NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC43ODAxMTQ5OTQzNjkwMzYwKSwgRkwyRlhDT05TVF9EQkwoMC43ODEzMzg5NDQwNDQ1MjIzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc4MjU2MzM3MzIzMDI1MTMpLCBGTDJGWENPTlNUX0RCTCgwLjc4Mzc4ODI4MTU1MDk0NTgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzg1MDEzNjY4NjMyMDYyMSksIEZMMkZYQ09OU1RfREJMKDAuNzg2MjM5NTM0MDk5Nzg3NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC43ODc0NjU4Nzc1ODEwMzc4KSwgRkwyRlhDT05TVF9EQkwoMC43ODg2OTI2OTg3MDM0NTU5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc4OTkxOTk5NzA5NTQwODgpLCBGTDJGWENPTlNUX0RCTCgwLjc5MTE0Nzc3MjM4NTk4NTMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzkyMzc2MDI0MjA0OTk0NCksIEZMMkZYQ09OU1RfREJMKDAuNzkzNjA0NzUyMTgyOTYyMyksCisgICAgRkwyRlhDT05TVF9EQkwoMC43OTQ4MzM5NTU5NTExMzA4KSwgRkwyRlhDT05TVF9EQkwoMC43OTYwNjM2MzUxNDE0NTQ2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc5NzI5Mzc4OTM4NjU5OTUpLCBGTDJGWENPTlNUX0RCTCgwLjc5ODUyNDQxODMxOTkzOTkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzk5NzU1NTIxNTc1NTU3MCksIEZMMkZYQ09OU1RfREJMKDAuODAwOTg3MDk4Nzg4MjM1OSksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MDIyMTkxNDk1OTM0NjQ0KSwgRkwyRlhDT05TVF9EQkwoMC44MDM0NTE2NzM2Mjc0MzAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgwNDY4NDY3MDUyNzAxODUpLCBGTDJGWENPTlNUX0RCTCgwLjgwNTkxODEzOTkyOTgxMTApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODA3MTUyMDgxNDc0MDgyMiksIEZMMkZYQ09OU1RfREJMKDAuODA4Mzg2NDk0Nzk4Nzk4OSksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MDk2MjEzNzk1NDM2MTY2KSwgRkwyRlhDT05TVF9EQkwoMC44MTA4NTY3MzUzNDg4Nzg0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgxMjA5MjU2MTg1NTYxMjcpLCBGTDJGWENPTlNUX0RCTCgwLjgxMzMyODg1ODcwNTUzMDgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODE0NTY1NjI1NTQxMDI1MyksIEZMMkZYQ09OU1RfREJMKDAuODE1ODAyODYyMDA1MTY3NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MTcwNDA1Njc3NDE3MDUzKSwgRkwyRlhDT05TVF9EQkwoMC44MTgyNzg3NDIzOTUwNjIyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgxOTUxNzM4NTYxMDMzNDEpLCBGTDJGWENPTlNUX0RCTCgwLjgyMDc1NjQ5NzAzMzI4NzUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODIxOTk2MDc2MzEwMzU4MCksIEZMMkZYQ09OU1RfREJMKDAuODIzMjM2MTIzMDg4NjQ3NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MjQ0NzY2MzcwMTU5MjM0KSwgRkwyRlhDT05TVF9EQkwoMC44MjU3MTc2MTc3NDA2MTUwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgyNjk1OTA2NDkxMTgxMjUpLCBGTDJGWENPTlNUX0RCTCgwLjgyODIwMDk3ODE3OTI2NTApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODI5NDQzMzU3MTkzMzc4NCksIEZMMkZYQ09OU1RfREJMKDAuODMwNjg2MjAxNjA1MjEzMiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MzE5Mjk1MTEwNjY0ODMxKSwgRkwyRlhDT05TVF9EQkwoMC44MzMxNzMyODUyMjk1NTIwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgzNDQxNzUyMzc0NzQzMzYpLCBGTDJGWENPTlNUX0RCTCgwLjgzNTY2MjIyNjI3Mzc4NzgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODM2OTA3MzkyNDYyOTIwMiksIEZMMkZYQ09OU1RfREJMKDAuODM4MTUzMDIxOTY5Nzc5MyksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MzkzOTkxMTQ0NDk5NTQ1KSwgRkwyRlhDT05TVF9EQkwoMC44NDA2NDU2Njk1NTk2NzUyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg0MTg5MjY4Njk1NTgwNzkpLCBGTDJGWENPTlNUX0RCTCgwLjg0MzE0MDE2NjI5NTg1NDQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODQ0Mzg4MTA3MjM3OTUwNyksIEZMMkZYQ09OU1RfREJMKDAuODQ1NjM2NTA5NDQwODY0MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44NDY4ODUzNzI1NjM5OTIzKSwgRkwyRlhDT05TVF9EQkwoMC44NDgxMzQ2OTYyNjczNjA2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg0OTM4NDQ4MDIxMTYyMDgpLCBGTDJGWENPTlNUX0RCTCgwLjg1MDYzNDcyNDA1ODA0OTIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODUxODg1NDI3NDY4NTQ0MiksIEZMMkZYQ09OU1RfREJMKDAuODUzMTM2NTkwMTA1NjI1MyksCisgICAgRkwyRlhDT05TVF9EQkwoMC44NTQzODgyMTE2MzI0MzA3KSwgRkwyRlhDT05TVF9EQkwoMC44NTU2NDAyOTE3MTI3MTU3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg1Njg5MjgzMDAxMDg1MTIpLCBGTDJGWENPTlNUX0RCTCgwLjg1ODE0NTgyNjE5MTgyMDkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODU5Mzk5Mjc5OTIxMjIwNyksIEZMMkZYQ09OU1RfREJMKDAuODYwNjUzMTkwODY1MjU2MyksCisgICAgRkwyRlhDT05TVF9EQkwoMC44NjE5MDc1NTg2OTA3NDE0KSwgRkwyRlhDT05TVF9EQkwoMC44NjMxNjIzODMwNjUwOTYyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg2NDQxNzY2MzY1NjM0NTIpLCBGTDJGWENPTlNUX0RCTCgwLjg2NTY3MzQwMDEzMzExNjEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODY2OTI5NTkyMTY0NjM3NSksIEZMMkZYQ09OU1RfREJMKDAuODY4MTg2MjM5NDIwNzM3MSksCisgICAgRkwyRlhDT05TVF9EQkwoMC44Njk0NDMzNDE1NzE4NDA3KSwgRkwyRlhDT05TVF9EQkwoMC44NzA3MDA4OTgyODg5Njk1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg3MTk1ODkwOTI0MzczOTEpLCBGTDJGWENPTlNUX0RCTCgwLjg3MzIxNzM3NDEwODM1NzQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODc0NDc2MjkyNTU1NjIzMiksIEZMMkZYQ09OU1RfREJMKDAuODc1NzM1NjY0MjU4OTI0MSksCisgICAgRkwyRlhDT05TVF9EQkwoMC44NzY5OTU0ODg4OTIyMzUyKSwgRkwyRlhDT05TVF9EQkwoMC44NzgyNTU3NjYxMzAxMTcxKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg3OTUxNjQ5NTY0NzcxNDYpLCBGTDJGWENPTlNUX0RCTCgwLjg4MDc3NzY3NzEyMDc1NDUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODgyMDM5MzEwMjI1NTQ0MyksIEZMMkZYQ09OU1RfREJMKDAuODgzMzAxMzk0NjM4OTcwNCksCisgICAgRkwyRlhDT05TVF9EQkwoMC44ODQ1NjM5MzAwMzg0OTY5KSwgRkwyRlhDT05TVF9EQkwoMC44ODU4MjY5MTYxMDIxNjI5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg4NzA5MDM1MjUwODU4MTkpLCBGTDJGWENPTlNUX0RCTCgwLjg4ODM1NDIzODkzNjkzOTkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODg5NjE4NTc1MDY2OTkzMyksIEZMMkZYQ09OU1RfREJMKDAuODkwODgzMzYwNTc5MDY3OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC44OTIxNDg1OTUxNTQwNTY1KSwgRkwyRlhDT05TVF9EQkwoMC44OTM0MTQyNzg0NzM0MTg3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg5NDY4MDQxMDIxOTE3NzYpLCBGTDJGWENPTlNUX0RCTCgwLjg5NTk0Njk5MDA3MzkxOTEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODk3MjE0MDE3NzIwNzkwNiksIEZMMkZYQ09OU1RfREJMKDAuODk4NDgxNDkyODQzNDk4NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC44OTk3NDk0MTUxMjYzMDc3KSwgRkwyRlhDT05TVF9EQkwoMC45MDEwMTc3ODQyNTQwMzkwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjkwMjI4NjU5OTkxMjA2ODIpLCBGTDJGWENPTlNUX0RCTCgwLjkwMzU1NTg2MTc4NjMyNDIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTA0ODI1NTY5NTYzMjg3OCksIEZMMkZYQ09OU1RfREJMKDAuOTA2MDk1NzIyOTI5OTg5NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC45MDczNjYzMjE1NzQwMDkyKSwgRkwyRlhDT05TVF9EQkwoMC45MDg2MzczNjUxODM0NzI5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjkwOTkwODg1MzQ0NzA1MjgpLCBGTDJGWENPTlNUX0RCTCgwLjkxMTE4MDc4NjA1Mzk2NDcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTEyNDUzMTYyNjkzOTY3MiksIEZMMkZYQ09OU1RfREJMKDAuOTEzNzI1OTgzMDU3MzU5NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC45MTQ5OTkyNDY4MzQ5ODA1KSwgRkwyRlhDT05TVF9EQkwoMC45MTYyNzI5NTM3MTgyMDcxKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjkxNzU0NzEwMzM5ODk1MjQpLCBGTDJGWENPTlNUX0RCTCgwLjkxODgyMTY5NTU2OTY2NDgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTIwMDk2NzI5OTIzMzI1OCksIEZMMkZYQ09OU1RfREJMKDAuOTIxMzcyMjA2MTUzNDQ5NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC45MjI2NDgxMjM5NTQwNzk1KSwgRkwyRlhDT05TVF9EQkwoMC45MjM5MjQ0ODMwMTk3ODk2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjkyNTIwMTI4MzA0NTY4MDUpLCBGTDJGWENPTlNUX0RCTCgwLjkyNjQ3ODUyMzcyNzM3OTMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTI3NzU2MjA0NzYxMDM3NiksIEZMMkZYQ09OU1RfREJMKDAuOTI5MDM0MzI1ODQzMzMwNSksCisgICAgRkwyRlhDT05TVF9EQkwoMC45MzAzMTI4ODY2NzE0NTQ3KSwgRkwyRlhDT05TVF9EQkwoMC45MzE1OTE4ODY5NDMxMjc1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjkzMjg3MTMyNjM1NjU4NDgpLCBGTDJGWENPTlNUX0RCTCgwLjkzNDE1MTIwNDYxMDU4MDIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTM1NDMxNTIxNDA0MzgzNiksIEZMMkZYQ09OU1RfREJMKDAuOTM2NzEyMjc2NDM3Nzc5MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC45Mzc5OTM0Njk0MTEwNjQ4KSwgRkwyRlhDT05TVF9EQkwoMC45MzkyNzUxMDAwMjUwNDk3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk0MDU1NzE2Nzk4MTA1NDIpLCBGTDJGWENPTlNUX0RCTCgwLjk0MTgzOTY3Mjk4MDkwNzIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTQzMTIyNjE0NzI2OTQ1NiksIEZMMkZYQ09OU1RfREJMKDAuOTQ0NDA1OTkyOTIyMDEyNCksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NDU2ODk4MDcyNjk0NTU4KSwgRkwyRlhDT05TVF9EQkwoMC45NDY5NzQwNTc0NzMxMjc1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk0ODI1ODc0MzIzNzM4MTApLCBGTDJGWENPTlNUX0RCTCgwLjk0OTU0Mzg2NDI2NzA3MTMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTUwODI5NDIwMjY3NTUyMiksIEZMMkZYQ09OU1RfREJMKDAuOTUyMTE1NDEwOTQ0Njc2MyksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NTM0MDE4MzYwMDQ3OTI2KSwgRkwyRlhDT05TVF9EQkwoMC45NTQ2ODg2OTUxNTQ3NDU1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk1NTk3NTk4ODEwMTg3MzgpLCBGTDJGWENPTlNUX0RCTCgwLjk1NzI2MzcxNDU1NDAwODcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTU4NTUxODc0MjE5NDczMiksIEZMMkZYQ09OU1RfREJMKDAuOTU5ODQwNDY2ODA3MDgwMiksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NjExMjk0OTIwMjYxMzE3KSwgRkwyRlhDT05TVF9EQkwoMC45NjI0MTg5NDk1ODY0MTY4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk2MzcwODgzOTE5ODIxMTApLCBGTDJGWENPTlNUX0RCTCgwLjk2NDk5OTE2MDU3MjI3NTApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTY2Mjg5OTEzNDE5ODUyNCksIEZMMkZYQ09OU1RfREJMKDAuOTY3NTgxMDk3NDUyNjY5NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC45Njg4NzI3MTIzODI5MzQzKSwgRkwyRlhDT05TVF9EQkwoMC45NzAxNjQ3NTc5MjMzMzMwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk3MTQ1NzIzMzc4NzAzMTYpLCBGTDJGWENPTlNUX0RCTCgwLjk3Mjc1MDEzOTY4NzY3MjcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTc0MDQzNDc1MzM5Mzc0OSksIEZMMkZYQ09OU1RfREJMKDAuOTc1MzM3MjQwNDU2NzMxMyksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NzY2MzE0MzQ3NTQ4MDg3KSwgRkwyRlhDT05TVF9EQkwoMC45Nzc5MjYwNTc5NDkxNDYwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk3OTIyMTEwOTc1NTc1MjcpLCBGTDJGWENPTlNUX0RCTCgwLjk4MDUxNjU4OTg5MTEwODEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTgxODEyNDk4MDcyMTYwMCksIEZMMkZYQ09OU1RfREJMKDAuOTgzMTA4ODM0MDE2MzIzMiksCisgICAgRkwyRlhDT05TVF9EQkwoMC45ODQ0MDU1OTc0NDE0Nzg2KSwgRkwyRlhDT05TVF9EQkwoMC45ODU3MDI3ODgwNjU5NzE2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk4NzAwMDQwNTYwODYxMTEpLCBGTDJGWENPTlNUX0RCTCgwLjk4ODI5ODQ0OTc4ODY2ODQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTg5NTk2OTIwMzI1ODc1OSksIEZMMkZYQ09OU1RfREJMKDAuOTkwODk1ODE2OTQwNDI1NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC45OTIxOTUxMzkzNTI5NjgwKSwgRkwyRlhDT05TVF9EQkwoMC45OTM0OTQ4ODcyODQ2MTE2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk5NDc5NTA2MDQ1NjkyMDYpLCBGTDJGWENPTlNUX0RCTCgwLjk5NjA5NTY1ODU5MTkxNDQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTk3Mzk2NjgxNDEyMDY2NSksIEZMMkZYQ09OU1RfREJMKDAuOTk4Njk4MTI4NjQwMzAyNSl9OwogCi1jb25zdCBGSVhQX0RCTCBGREthYWNFbmNfc3BlY0V4cE1hbnRUYWJsZUNvbWJFbGNbNF1bMTRdID0KLXsKLSAge0ZMMkZYQ09OU1RfREJMKDAuNTAwMDAwMDAwMDAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNjI5OTYwNTI0OTQ3NDM2NiksIEZMMkZYQ09OU1RfREJMKDAuNzkzNzAwNTI1OTg0MDk5OCksIEZMMkZYQ09OU1RfREJMKDAuNTAwMDAwMDAwMDAwMDAwMCksCi0gICBGTDJGWENPTlNUX0RCTCgwLjYyOTk2MDUyNDk0NzQzNjYpLCBGTDJGWENPTlNUX0RCTCgwLjc5MzcwMDUyNTk4NDA5OTgpLCBGTDJGWENPTlNUX0RCTCgwLjUwMDAwMDAwMDAwMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjYyOTk2MDUyNDk0NzQzNjYpLAotICAgRkwyRlhDT05TVF9EQkwoMC43OTM3MDA1MjU5ODQwOTk4KSwgRkwyRlhDT05TVF9EQkwoMC41MDAwMDAwMDAwMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC42Mjk5NjA1MjQ5NDc0MzY2KSwgRkwyRlhDT05TVF9EQkwoMC43OTM3MDA1MjU5ODQwOTk4KSwKLSAgIEZMMkZYQ09OU1RfREJMKDAuNTAwMDAwMDAwMDAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNjI5OTYwNTI0OTQ3NDM2Nil9LAorY29uc3QgRklYUF9EQkwgRkRLYWFjRW5jX3NwZWNFeHBNYW50VGFibGVDb21iRWxjWzRdWzE0XSA9IHsKKyAgICB7RkwyRlhDT05TVF9EQkwoMC41MDAwMDAwMDAwMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC42Mjk5NjA1MjQ5NDc0MzY2KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC43OTM3MDA1MjU5ODQwOTk4KSwgRkwyRlhDT05TVF9EQkwoMC41MDAwMDAwMDAwMDAwMDAwKSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC42Mjk5NjA1MjQ5NDc0MzY2KSwgRkwyRlhDT05TVF9EQkwoMC43OTM3MDA1MjU5ODQwOTk4KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC41MDAwMDAwMDAwMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC42Mjk5NjA1MjQ5NDc0MzY2KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC43OTM3MDA1MjU5ODQwOTk4KSwgRkwyRlhDT05TVF9EQkwoMC41MDAwMDAwMDAwMDAwMDAwKSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC42Mjk5NjA1MjQ5NDc0MzY2KSwgRkwyRlhDT05TVF9EQkwoMC43OTM3MDA1MjU5ODQwOTk4KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC41MDAwMDAwMDAwMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC42Mjk5NjA1MjQ5NDc0MzY2KX0sCiAKLSAge0ZMMkZYQ09OU1RfREJMKDAuNTk0NjAzNTU3NTAxMzYwNSksIEZMMkZYQ09OU1RfREJMKDAuNzQ5MTUzNTM4NDM4MzQwOCksIEZMMkZYQ09OU1RfREJMKDAuOTQzODc0MzEyNjgxNjkzNSksIEZMMkZYQ09OU1RfREJMKDAuNTk0NjAzNTU3NTAxMzYwNSksCi0gICBGTDJGWENPTlNUX0RCTCgwLjc0OTE1MzUzODQzODM0MDgpLCBGTDJGWENPTlNUX0RCTCgwLjk0Mzg3NDMxMjY4MTY5MzUpLCBGTDJGWENPTlNUX0RCTCgwLjU5NDYwMzU1NzUwMTM2MDUpLCBGTDJGWENPTlNUX0RCTCgwLjc0OTE1MzUzODQzODM0MDgpLAotICAgRkwyRlhDT05TVF9EQkwoMC45NDM4NzQzMTI2ODE2OTM1KSwgRkwyRlhDT05TVF9EQkwoMC41OTQ2MDM1NTc1MDEzNjA1KSwgRkwyRlhDT05TVF9EQkwoMC43NDkxNTM1Mzg0MzgzNDA4KSwgRkwyRlhDT05TVF9EQkwoMC45NDM4NzQzMTI2ODE2OTM1KSwKLSAgIEZMMkZYQ09OU1RfREJMKDAuNTk0NjAzNTU3NTAxMzYwNSksIEZMMkZYQ09OU1RfREJMKDAuNzQ5MTUzNTM4NDM4MzQwOCl9LAorICAgIHtGTDJGWENPTlNUX0RCTCgwLjU5NDYwMzU1NzUwMTM2MDUpLCBGTDJGWENPTlNUX0RCTCgwLjc0OTE1MzUzODQzODM0MDgpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjk0Mzg3NDMxMjY4MTY5MzUpLCBGTDJGWENPTlNUX0RCTCgwLjU5NDYwMzU1NzUwMTM2MDUpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjc0OTE1MzUzODQzODM0MDgpLCBGTDJGWENPTlNUX0RCTCgwLjk0Mzg3NDMxMjY4MTY5MzUpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjU5NDYwMzU1NzUwMTM2MDUpLCBGTDJGWENPTlNUX0RCTCgwLjc0OTE1MzUzODQzODM0MDgpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjk0Mzg3NDMxMjY4MTY5MzUpLCBGTDJGWENPTlNUX0RCTCgwLjU5NDYwMzU1NzUwMTM2MDUpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjc0OTE1MzUzODQzODM0MDgpLCBGTDJGWENPTlNUX0RCTCgwLjk0Mzg3NDMxMjY4MTY5MzUpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjU5NDYwMzU1NzUwMTM2MDUpLCBGTDJGWENPTlNUX0RCTCgwLjc0OTE1MzUzODQzODM0MDgpfSwKIAotICB7RkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NDc2KSwgRkwyRlhDT05TVF9EQkwoMC44OTA4OTg3MTgxNDAzMzkzKSwgRkwyRlhDT05TVF9EQkwoMC41NjEyMzEwMjQxNTQ2ODY1KSwgRkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NDc2KSwKLSAgIEZMMkZYQ09OU1RfREJMKDAuODkwODk4NzE4MTQwMzM5MyksIEZMMkZYQ09OU1RfREJMKDAuNTYxMjMxMDI0MTU0Njg2NSksIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksIEZMMkZYQ09OU1RfREJMKDAuODkwODk4NzE4MTQwMzM5MyksCi0gICBGTDJGWENPTlNUX0RCTCgwLjU2MTIzMTAyNDE1NDY4NjUpLCBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU0NzYpLCBGTDJGWENPTlNUX0RCTCgwLjg5MDg5ODcxODE0MDMzOTMpLCBGTDJGWENPTlNUX0RCTCgwLjU2MTIzMTAyNDE1NDY4NjUpLAotICAgRkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NDc2KSwgRkwyRlhDT05TVF9EQkwoMC44OTA4OTg3MTgxNDAzMzkzKX0sCisgICAge0ZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksIEZMMkZYQ09OU1RfREJMKDAuODkwODk4NzE4MTQwMzM5MyksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNTYxMjMxMDI0MTU0Njg2NSksIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuODkwODk4NzE4MTQwMzM5MyksIEZMMkZYQ09OU1RfREJMKDAuNTYxMjMxMDI0MTU0Njg2NSksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksIEZMMkZYQ09OU1RfREJMKDAuODkwODk4NzE4MTQwMzM5MyksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNTYxMjMxMDI0MTU0Njg2NSksIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuODkwODk4NzE4MTQwMzM5MyksIEZMMkZYQ09OU1RfREJMKDAuNTYxMjMxMDI0MTU0Njg2NSksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksIEZMMkZYQ09OU1RfREJMKDAuODkwODk4NzE4MTQwMzM5Myl9LAogCi0gIHtGTDJGWENPTlNUX0RCTCgwLjg0MDg5NjQxNTI1MzcxNDUpLCBGTDJGWENPTlNUX0RCTCgwLjUyOTczMTU0NzE3OTY0NzcpLCBGTDJGWENPTlNUX0RCTCgwLjY2NzQxOTkyNzA4NTAxNzIpLCBGTDJGWENPTlNUX0RCTCgwLjg0MDg5NjQxNTI1MzcxNDUpLAotICAgRkwyRlhDT05TVF9EQkwoMC41Mjk3MzE1NDcxNzk2NDc3KSwgRkwyRlhDT05TVF9EQkwoMC42Njc0MTk5MjcwODUwMTcyKSwgRkwyRlhDT05TVF9EQkwoMC44NDA4OTY0MTUyNTM3MTQ1KSwgRkwyRlhDT05TVF9EQkwoMC41Mjk3MzE1NDcxNzk2NDc3KSwKLSAgIEZMMkZYQ09OU1RfREJMKDAuNjY3NDE5OTI3MDg1MDE3MiksIEZMMkZYQ09OU1RfREJMKDAuODQwODk2NDE1MjUzNzE0NSksIEZMMkZYQ09OU1RfREJMKDAuNTI5NzMxNTQ3MTc5NjQ3NyksIEZMMkZYQ09OU1RfREJMKDAuNjY3NDE5OTI3MDg1MDE3MiksCi0gICBGTDJGWENPTlNUX0RCTCgwLjg0MDg5NjQxNTI1MzcxNDUpLCBGTDJGWENPTlNUX0RCTCgwLjUyOTczMTU0NzE3OTY0NzcpfQotfTsKKyAgICB7RkwyRlhDT05TVF9EQkwoMC44NDA4OTY0MTUyNTM3MTQ1KSwgRkwyRlhDT05TVF9EQkwoMC41Mjk3MzE1NDcxNzk2NDc3KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC42Njc0MTk5MjcwODUwMTcyKSwgRkwyRlhDT05TVF9EQkwoMC44NDA4OTY0MTUyNTM3MTQ1KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC41Mjk3MzE1NDcxNzk2NDc3KSwgRkwyRlhDT05TVF9EQkwoMC42Njc0MTk5MjcwODUwMTcyKSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC44NDA4OTY0MTUyNTM3MTQ1KSwgRkwyRlhDT05TVF9EQkwoMC41Mjk3MzE1NDcxNzk2NDc3KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC42Njc0MTk5MjcwODUwMTcyKSwgRkwyRlhDT05TVF9EQkwoMC44NDA4OTY0MTUyNTM3MTQ1KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC41Mjk3MzE1NDcxNzk2NDc3KSwgRkwyRlhDT05TVF9EQkwoMC42Njc0MTk5MjcwODUwMTcyKSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC44NDA4OTY0MTUyNTM3MTQ1KSwgRkwyRlhDT05TVF9EQkwoMC41Mjk3MzE1NDcxNzk2NDc3KX19OwogCi1jb25zdCBVQ0hBUiBGREthYWNFbmNfc3BlY0V4cFRhYmxlQ29tYls0XVsxNF0gPQotewotICB7MSwgMiwgMywgNSwgNiwgNywgOSwgMTAsIDExLCAxMywgMTQsIDE1LCAxNywgMTh9LAotICB7MSwgMiwgMywgNSwgNiwgNywgOSwgMTAsIDExLCAxMywgMTQsIDE1LCAxNywgMTh9LAotICB7MSwgMiwgNCwgNSwgNiwgOCwgOSwgMTAsIDEyLCAxMywgMTQsIDE2LCAxNywgMTh9LAotICB7MSwgMywgNCwgNSwgNywgOCwgOSwgMTEsIDEyLCAxMywgMTUsIDE2LCAxNywgMTl9Ci19OwotCitjb25zdCBVQ0hBUiBGREthYWNFbmNfc3BlY0V4cFRhYmxlQ29tYls0XVsxNF0gPSB7CisgICAgezEsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTcsIDE4fSwKKyAgICB7MSwgMiwgMywgNSwgNiwgNywgOSwgMTAsIDExLCAxMywgMTQsIDE1LCAxNywgMTh9LAorICAgIHsxLCAyLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDEzLCAxNCwgMTYsIDE3LCAxOH0sCisgICAgezEsIDMsIDQsIDUsIDcsIDgsIDksIDExLCAxMiwgMTMsIDE1LCAxNiwgMTcsIDE5fX07CiAKICNkZWZpbmUgV1RTMCAxCiAjZGVmaW5lIFdUUzEgMAogI2RlZmluZSBXVFMyIC0yCiAKIGNvbnN0IEZJWFBfV1RCIEVMREFuYWx5c2lzNTEyWzE1MzZdID0gewotICAvKiBwYXJ0IDAgKi8KLSAgV1RDMCgweGZhYzVhNzcwKSwgV1RDMCgweGZhYWZiYWI4KSwgV1RDMCgweGZhOTk2YTQwKSwgV1RDMCgweGZhODJiYmQwKSwgV1RDMCgweGZhNmJiNTM4KSwgV1RDMCgweGZhNTQ1YzM4KSwgV1RDMCgweGZhM2NiNjk4KSwgV1RDMCgweGZhMjRjYTI4KSwgCi0gIFdUQzAoMHhmYTBjOWNhOCksIFdUQzAoMHhmOWY0MzNlOCksIFdUQzAoMHhmOWRiOTU4MCksIFdUQzAoMHhmOWMyYzI5OCksIFdUQzAoMHhmOWE5YjgwMCksIFdUQzAoMHhmOTkwNzI1MCksIFdUQzAoMHhmOTc2ZWUzOCksIFdUQzAoMHhmOTVkMmI4OCksIAotICBXVEMwKDB4Zjk0MzJkMTApLCBXVEMwKDB4ZjkyOGY1YzApLCBXVEMwKDB4ZjkwZTg4NjgpLCBXVEMwKDB4ZjhmM2U0MDApLCBXVEMwKDB4ZjhkOTAzYTApLCBXVEMwKDB4ZjhiZGUyMzgpLCBXVEMwKDB4ZjhhMjdhZjApLCBXVEMwKDB4Zjg4NmNkZTgpLCAKLSAgV1RDMCgweGY4NmFlMDIwKSwgV1RDMCgweGY4NGViNmMwKSwgV1RDMCgweGY4MzI1NmY4KSwgV1RDMCgweGY4MTVjNGI4KSwgV1RDMCgweGY3ZjkwMmMwKSwgV1RDMCgweGY3ZGMxM2IwKSwgV1RDMCgweGY3YmVmYTYwKSwgV1RDMCgweGY3YTFiYTQwKSwgCi0gIFdUQzAoMHhmNzg0NTdjMCksIFdUQzAoMHhmNzY2ZDc4MCksIFdUQzAoMHhmNzQ5M2Q5MCksIFdUQzAoMHhmNzJiODk5MCksIFdUQzAoMHhmNzBkYjVmMCksIFdUQzAoMHhmNmVmYmQzMCksIFdUQzAoMHhmNmQxOWEyMCksIFdUQzAoMHhmNmIzNTJlMCksIAotICBXVEMwKDB4ZjY5NGY4YzApLCBXVEMwKDB4ZjY3NjlkYTApLCBXVEMwKDB4ZjY1ODUzMTApLCBXVEMwKDB4ZjYzYTI4ZDApLCBXVEMwKDB4ZjYxYzJjNjApLCBXVEMwKDB4ZjVmZTZiMTApLCBXVEMwKDB4ZjVlMGYyNTApLCBXVEMwKDB4ZjVjM2NlYjApLCAKLSAgV1RDMCgweGY1YTcwYmUwKSwgV1RDMCgweGY1OGFiNWEwKSwgV1RDMCgweGY1NmVkN2IwKSwgV1RDMCgweGY1NTM3ZTQwKSwgV1RDMCgweGY1MzhiNjEwKSwgV1RDMCgweGY1MWU4YmYwKSwgV1RDMCgweGY1MDUwYzkwKSwgV1RDMCgweGY0ZWM0MzMwKSwgCi0gIFdUQzAoMHhmNGQ0MzliMCksIFdUQzAoMHhmNGJjZjliMCksIFdUQzAoMHhmNGE2OGNlMCksIFdUQzAoMHhmNDkwZmE4MCksIFdUQzAoMHhmNDdjNDc2MCksIFdUQzAoMHhmNDY4NzgzMCksIFdUQzAoMHhmNDU1OGYwMCksIFdUQzAoMHhmNDQzNGZjMCksIAotICBXVEMwKDB4ZjQzMTQwNzApLCBXVEMwKDB4ZjQxZWU0NTApLCBXVEMwKDB4ZjQwYmMxMzApLCBXVEMwKDB4ZjNmNzk5YzApLCBXVEMwKDB4ZjNlMjZkMzApLCBXVEMwKDB4ZjNjYzNkNzApLCBXVEMwKDB4ZjNiNTBjODApLCBXVEMwKDB4ZjM5Y2RkNjApLCAKLSAgV1RDMCgweGYzODNiNDQwKSwgV1RDMCgweGYzNjk5NTUwKSwgV1RDMCgweGYzNGU4NGMwKSwgV1RDMCgweGYzMzI4NmIwKSwgV1RDMCgweGYzMTU5ZjEwKSwgV1RDMCgweGYyZjdkMWIwKSwgV1RDMCgweGYyZDkyMjkwKSwgV1RDMCgweGYyYjk5NGQwKSwgCi0gIFdUQzAoMHhmMjk5MmFkMCksIFdUQzAoMHhmMjc3ZTZkMCksIFdUQzAoMHhmMjU1Y2I2MCksIFdUQzAoMHhmMjMyZGQwMCksIFdUQzAoMHhmMjBmMjI0MCksIFdUQzAoMHhmMWVhYTFkMCksIFdUQzAoMHhmMWM1NjI0MCksIFdUQzAoMHhmMTlmNjNkMCksIAotICBXVEMwKDB4ZjE3OGEwZjApLCBXVEMwKDB4ZjE1MTEzYTApLCBXVEMwKDB4ZjEyOGI1YzApLCBXVEMwKDB4ZjBmZjdmZDApLCBXVEMwKDB4ZjBkNTY4NjApLCBXVEMwKDB4ZjBhYTY2MTApLCBXVEMwKDB4ZjA3ZTZmZDApLCBXVEMwKDB4ZjA1MTgxOTApLCAKLSAgV1RDMCgweGYwMjM5Y2QwKSwgV1RDMCgweGVmZjRjMzIwKSwgV1RDMCgweGVmYzRmNzIwKSwgV1RDMCgweGVmOTQ1MDgwKSwgV1RDMCgweGVmNjJmY2UwKSwgV1RDMCgweGVmMzEyYTQwKSwgV1RDMCgweGVlZmYwNWMwKSwgV1RDMCgweGVlY2NhMmMwKSwgCi0gIFdUQzAoMHhlZTk5ZmFhMCksIFdUQzAoMHhlZTY3MDVhMCksIFdUQzAoMHhlZTMzYmI2MCksIFdUQzAoMHhlZTAwMDA2MCksIFdUQzAoMHhlZGNiYTY2MCksIFdUQzAoMHhlZDk2N2U4MCksIFdUQzAoMHhlZDYwNWI4MCksIFdUQzAoMHhlZDI5M2I0MCksIAotICBXVEMwKDB4ZWNmMTQ2YTApLCBXVEMwKDB4ZWNiOGE4YTApLCBXVEMwKDB4ZWM3ZjhiYzApLCBXVEMwKDB4ZWM0NjEyNjApLCBXVEMwKDB4ZWMwYzU3MjApLCBXVEMwKDB4ZWJkMjc0NDApLCBXVEMwKDB4ZWI5ODgyMjApLCBXVEMwKDB4ZWI1ZTcwNDApLCAKLSAgV1RDMCgweGViMjQwNGMwKSwgV1RDMCgweGVhZTkwNDQwKSwgV1RDMCgweGVhYWQzM2MwKSwgV1RDMCgweGVhNzA2NmMwKSwgV1RDMCgweGVhMzI3ZjYwKSwgV1RDMCgweGU5ZjM2MDAwKSwgV1RDMCgweGU5YjJlZDYwKSwgV1RDMCgweGU5NzEzOTIwKSwgCi0gIFdUQzAoMHhlOTJlODFlMCksIFdUQzAoMHhlOGViMDhjMCksIFdUQzAoMHhlOGE3MGU2MCksIFdUQzAoMHhlODYyZDhlMCksIFdUQzAoMHhlODFlYjM0MCksIFdUQzAoMHhlN2RhZThhMCksIFdUQzAoMHhlNzk3YzFhMCksIFdUQzAoMHhlNzU1NGNhMCksIAotICBXVEMwKDB4ZTcxMzVkYzApLCBXVEMwKDB4ZTZkMWM2YTApLCBXVEMwKDB4ZTY5MDU3MjApLCBXVEMwKDB4ZTY0ZWI5YzApLCBXVEMwKDB4ZTYwYzczMDApLCBXVEMwKDB4ZTVjOTA2MDApLCBXVEMwKDB4ZTU4M2Y5MjApLCBXVEMwKDB4ZTUzZDFjZTApLCAKLSAgV1RDMCgweGU0ZjQ4YzgwKSwgV1RDMCgweGU0YWE2NjQwKSwgV1RDMCgweGU0NWVjYWEwKSwgV1RDMCgweGU0MTIwYmUwKSwgV1RDMCgweGUzYzRhZTYwKSwgV1RDMCgweGUzNzczODYwKSwgV1RDMCgweGUzMmEyZWEwKSwgV1RDMCgweGUyZGRlZWEwKSwgCi0gIFdUQzAoMHhlMjkyYWYwMCksIFdUQzAoMHhlMjQ4YTRhMCksIFdUQzAoMHhlMjAwMDE0MCksIFdUQzAoMHhlMWI4YjY0MCksIFdUQzAoMHhlMTcyNzQ0MCksIFdUQzAoMHhlMTJjZTkwMCksIFdUQzAoMHhlMGU3YzI4MCksIFdUQzAoMHhlMGEyYjQyMCksIAotICBXVEMwKDB4ZTA1ZDc2YzApLCBXVEMwKDB4ZTAxN2MzNjApLCBXVEMwKDB4ZGZkMTU0NDApLCBXVEMwKDB4ZGY4YTA1NDApLCBXVEMwKDB4ZGY0MWQzMDApLCBXVEMwKDB4ZGVmOGJiNDApLCBXVEMwKDB4ZGVhZWJkNDApLCBXVEMwKDB4ZGU2M2U3YzApLCAKLSAgV1RDMCgweGRlMTg1OTQwKSwgV1RDMCgweGRkY2MzMTgwKSwgV1RDMCgweGRkN2Y5MDAwKSwgV1RDMCgweGRkMzI5ZTgwKSwgV1RDMCgweGRjZTU4ZTgwKSwgV1RDMCgweGRjOTg5MzAwKSwgV1RDMCgweGRjNGJkZTQwKSwgV1RDMCgweGRiZmY5NmMwKSwgCi0gIFdUQzAoMHhkYmIzZDc4MCksIFdUQzAoMHhkYjY4YmI4MCksIFdUQzAoMHhkYjFlNWM4MCksIFdUQzAoMHhkYWQ0YzM4MCksIFdUQzAoMHhkYThiZTg0MCksIFdUQzAoMHhkYTQzYzFjMCksIFdUQzAoMHhkOWZjNDc0MCksIFdUQzAoMHhkOWI1NjY0MCksIAotICBXVEMwKDB4ZDk2ZjA0NDApLCBXVEMwKDB4ZDkyOTA2MDApLCBXVEMwKDB4ZDhlMzUwODApLCBXVEMwKDB4ZDg5ZGNkNDApLCBXVEMwKDB4ZDg1ODZiNDApLCBXVEMwKDB4ZDgxMzE5NDApLCBXVEMwKDB4ZDdjZGM2NDApLCBXVEMwKDB4ZDc4ODYxODApLCAKLSAgV1RDMCgweGQ3NDJkYzgwKSwgV1RDMCgweGQ2ZmQyNzgwKSwgV1RDMCgweGQ2YjczNDAwKSwgV1RDMCgweGQ2NzBmZDgwKSwgV1RDMCgweGQ2MmE4YTQwKSwgV1RDMCgweGQ1ZTNlMDgwKSwgV1RDMCgweGQ1OWQwODQwKSwgV1RDMCgweGQ1NTYyYjgwKSwgCi0gIFdUQzAoMHhkNTBmOTU0MCksIFdUQzAoMHhkNGM5OTJjMCksIFdUQzAoMHhkNDg0NmY4MCksIFdUQzAoMHhkNDQwNWE4MCksIFdUQzAoMHhkM2ZkNjU4MCksIFdUQzAoMHhkM2JiYTE0MCksIFdUQzAoMHhkMzdiMWM4MCksIFdUQzAoMHhkMzNiYjc4MCksIAotICBXVEMwKDB4ZDJmZDI0MDApLCBXVEMwKDB4ZDJiZjEyNDApLCBXVEMwKDB4ZDI4MTMzMDApLCBXVEMwKDB4ZDI0MzVhYzApLCBXVEMwKDB4ZDIwNTdmYzApLCBXVEMwKDB4ZDFjNzlhMDApLCBXVEMwKDB4ZDE4OWEyNDApLCBXVEMwKDB4ZDE0YjlkYzApLCAKLSAgV1RDMCgweGQxMGQ5ZTAwKSwgV1RDMCgweGQwY2ZiNTgwKSwgV1RDMCgweGQwOTFmNmMwKSwgV1RDMCgweGQwNTQ4MTAwKSwgV1RDMCgweGQwMTc3ZjQwKSwgV1RDMCgweGNmZGIxY2MwKSwgV1RDMCgweGNmOWY4NGMwKSwgV1RDMCgweGNmNjRkNzgwKSwgCi0gIFdUQzAoMHhjZjJiMmIwMCksIFdUQzAoMHhjZWYyOTQ0MCksIFdUQzAoMHhjZWJiMjY0MCksIFdUQzAoMHhjZTg0YzAwMCksIFdUQzAoMHhjZTRmMGJjMCksIFdUQzAoMHhjZTE5YjIwMCksIFdUQzAoMHhjZGU0NWQ0MCksIFdUQzAoMHhjZGFlZWRjMCksIAotICBXVEMwKDB4Y2Q3OTc5YzApLCBXVEMwKDB4Y2Q0NDE5YzApLCBXVEMwKDB4Y2QwZWU2YzApLCBXVEMwKDB4Y2NkYTA1NDApLCBXVEMwKDB4Y2NhNWE1MDApLCBXVEMwKDB4Y2M3MWY2NDApLCBXVEMwKDB4Y2MzZjI4MDApLCBXVEMwKDB4Y2MwZDQzMDApLCAKLSAgV1RDMCgweGNiZGMyYTAwKSwgV1RDMCgweGNiYWJiZTgwKSwgV1RDMCgweGNiN2JlMjAwKSwgV1RDMCgweGNiNGM4MjAwKSwgV1RDMCgweGNiMWQ5ODAwKSwgV1RDMCgweGNhZWYxZDQwKSwgV1RDMCgweGNhYzEwYmMwKSwgV1RDMCgweGNhOTM2NDQwKSwgCi0gIFdUQzAoMHhjYTY2MmQwMCksIFdUQzAoMHhjYTM5NmQ0MCksIFdUQzAoMHhjYTBkMmI4MCksIFdUQzAoMHhjOWUxNmY4MCksIFdUQzAoMHhjOWI2M2Y4MCksIFdUQzAoMHhjOThiYTJjMCksIFdUQzAoMHhjOTYxYTAwMCksIFdUQzAoMHhjOTM4M2VjMCksIAotICBXVEMwKDB4YzkwYTA0NDApLCBXVEMwKDB4YzhlMGQyODApLCBXVEMwKDB4YzhiNzNiODApLCBXVEMwKDB4Yzg4ZDQ5MDApLCBXVEMwKDB4Yzg2MzA0YzApLCBXVEMwKDB4YzgzODc4YzApLCBXVEMwKDB4YzgwZGFlODApLCBXVEMwKDB4YzdlMmFmYzApLCAKLSAgV1RDMCgweGM3Yjc4NjQwKSwgV1RDMCgweGM3OGMzYzQwKSwgV1RDMCgweGM3NjBkYTgwKSwgV1RDMCgweGM3MzU2NjQwKSwgV1RDMCgweGM3MDlkZTQwKSwgV1RDMCgweGM2ZGU0MWMwKSwgV1RDMCgweGM2YjI4ZmMwKSwgV1RDMCgweGM2ODZiZDQwKSwgCi0gIFdUQzAoMHhjNjVhYjYwMCksIFdUQzAoMHhjNjJlNjU4MCksIFdUQzAoMHhjNjAxYjg4MCksIFdUQzAoMHhjNWQ0YmFjMCksIFdUQzAoMHhjNWE3OTY0MCksIFdUQzAoMHhjNTdhNzZjMCksIFdUQzAoMHhjNTRkODc4MCksIFdUQzAoMHhjNTIwZTg0MCksIAotICBXVEMwKDB4YzRmNGFjYzApLCBXVEMwKDB4YzRjOGU4ODApLCBXVEMwKDB4YzQ5ZGFkODApLCBXVEMwKDB4YzQ3MmU2NDApLCBXVEMwKDB4YzQ0ODU2YzApLCBXVEMwKDB4YzQxZGMxNDApLCBXVEMwKDB4YzNmMmU5NDApLCBXVEMwKDB4YzNjN2JjMDApLCAKLSAgV1RDMCgweGMzOWM0ZjAwKSwgV1RDMCgweGMzNzBiOWMwKSwgV1RDMCgweGMzNDUxM2MwKSwgV1RDMCgweGMzMTk3OTQwKSwgV1RDMCgweGMyZWUwYTAwKSwgV1RDMCgweGMyYzJlNjQwKSwgV1RDMCgweGMyOTgyZDgwKSwgV1RDMCgweGMyNmRmNWMwKSwgCi0gIFdUQzAoMHhjMjQ0NGIwMCksIFdUQzAoMHhjMjFiMzk0MCksIFdUQzAoMHhjMWYyY2JjMCksIFdUQzAoMHhjMWNiMDVjMCksIFdUQzAoMHhjMWEzZTM0MCksIFdUQzAoMHhjMTdkNWYwMCksIFdUQzAoMHhjMTU3NzNjMCksIFdUQzAoMHhjMTMyMDk0MCksIAotICBXVEMwKDB4YzEwY2Y0ODApLCBXVEMwKDB4YzBlODBhMDApLCBXVEMwKDB4YzBjMzFmMDApLCBXVEMwKDB4YzA5ZTI2NDApLCBXVEMwKDB4YzA3OTJlYzApLCBXVEMwKDB4YzA1NDQ5NDApLCBXVEMwKDB4YzAyZjg2YzApLCBXVEMwKDB4YzAwYjA0YzApLCAKLSAgV1RDMCgweGJmZTZlZDAxKSwgV1RDMCgweGJmYzM2YTAxKSwgV1RDMCgweGJmYTBhNTgxKSwgV1RDMCgweGJmN2ViNTgxKSwgV1RDMCgweGJmNWQ5YTgxKSwgV1RDMCgweGJmM2Q1NTAxKSwgV1RDMCgweGJmMWRlNjAxKSwgV1RDMCgweGJlZmY0ODAxKSwgCi0gIFdUQzAoMHhiZWUxNzIwMSksIFdUQzAoMHhiZWM0NTg4MSksIFdUQzAoMHhiZWE3ZjMwMSksIFdUQzAoMHhiZThjMzc4MSksIFdUQzAoMHhiZTcxMjAwMSksIFdUQzAoMHhiZTU2YTM4MSksIFdUQzAoMHhiZTNjYmMwMSksIFdUQzAoMHhiZTIzNjAwMSksIAotICBXVEMwKDB4YmUwYTg1ODEpLCBXVEMwKDB4YmRmMjIxODEpLCBXVEMwKDB4YmRkYTJhMDEpLCBXVEMwKDB4YmRjMjlhODEpLCBXVEMwKDB4YmRhYjcxODEpLCBXVEMwKDB4YmQ5NGIwMDEpLCBXVEMwKDB4YmQ3ZTU1ODEpLCBXVEMwKDB4YmQ2ODY2ODEpLCAKLSAgV1RDMCgweGJkNTJlYjAxKSwgV1RDMCgweGJkM2RlYjgxKSwgV1RDMCgweGJkMjk3MTgxKSwgV1RDMCgweGJkMTU4ODAxKSwgV1RDMCgweGJkMDIzZjAxKSwgV1RDMCgweGJjZWZhNjAxKSwgV1RDMCgweGJjZGRjYzgxKSwgV1RDMCgweGJjY2NiZDAxKSwgCi0gIFdUQzAoMHhiY2JjN2UwMSksIFdUQzAoMHhiY2FkMTUwMSksIFdUQzAoMHhiYzllODgwMSksIFdUQzAoMHhiYzkwZDQ4MSksIFdUQzAoMHhiYzgzZjIwMSksIFdUQzAoMHhiYzc3ZDYwMSksIFdUQzAoMHhiYzZjNzc4MSksIFdUQzAoMHhiYzYxYzQwMSksIAotICBXVEMwKDB4YmM1N2EzMDEpLCBXVEMwKDB4YmM0ZGZiODEpLCBXVEMwKDB4YmM0NGI0ODEpLCBXVEMwKDB4YmMzYmJjMDEpLCBXVEMwKDB4YmMzMzA3ODEpLCBXVEMwKDB4YmMyYThjODEpLCBXVEMwKDB4YmMyMjQxODEpLCBXVEMwKDB4YmMxYTI0MDEpLCAKLSAgV1RDMCgweGJjMTIzYjgxKSwgV1RDMCgweGJjMGE4ZjAxKSwgV1RDMCgweGJjMDMyNjAxKSwgV1RDMCgweGJiZmMwZjgxKSwgV1RDMCgweGJiZjU2MTgxKSwgV1RDMCgweGJiZWYzMzAxKSwgV1RDMCgweGJiZTk5OTgxKSwgV1RDMCgweGJiZTQ5ZDAxKSwgCi0gIFdUQzAoMHhiYmUwMzgwMSksIFdUQzAoMHhiYmRjNjQ4MSksIFdUQzAoMHhiYmQ5MWI4MSksIFdUQzAoMHhiYmQ2NGQwMSksIFdUQzAoMHhiYmQzZTEwMSksIFdUQzAoMHhiYmQxYmQ4MSksIFdUQzAoMHhiYmNmY2E4MSksIFdUQzAoMHhiYmNlMDYwMSksIAotICBXVEMwKDB4YmJjYzgyMDEpLCBXVEMwKDB4YmJjYjUzMDEpLCBXVEMwKDB4YmJjYThkMDEpLCBXVEMwKDB4YmJjYTUwODEpLCBXVEMwKDB4YmJjYWNhMDEpLCBXVEMwKDB4YmJjYzI2ODEpLCBXVEMwKDB4YmJjZTkxODEpLCBXVEMwKDB4YmJkMjEyODEpLCAKLSAgV1RDMCgweGJiZDY4YzgxKSwgV1RDMCgweGJiZGJlMjAxKSwgV1RDMCgweGJiZTFmNDAxKSwgV1RDMCgweGJiZTg5OTAxKSwgV1RDMCgweGJiZWY5YjgxKSwgV1RDMCgweGJiZjZjNjAxKSwgV1RDMCgweGJiZmRlNDgxKSwgV1RDMCgweGJjMDRlMzgxKSwgCi0gIFdUQzAoMHhiYzBiY2Y4MSksIFdUQzAoMHhiYzEyYjgwMSksIFdUQzAoMHhiYzE5YWIwMSksIFdUQzAoMHhiYzIwYWUwMSksIFdUQzAoMHhiYzI3YmQ4MSksIFdUQzAoMHhiYzJlZDY4MSksIFdUQzAoMHhiYzM1ZjUwMSksIFdUQzAoMHhiYzNkMTgwMSksIAotICBXVEMwKDB4YmM0NDQwODEpLCBXVEMwKDB4YmM0YjZlODEpLCBXVEMwKDB4YmM1MmEzODEpLCBXVEMwKDB4YmM1OWRmODEpLCBXVEMwKDB4YmM2MTIzMDEpLCBXVEMwKDB4YmM2ODZlMDEpLCBXVEMwKDB4YmM2ZmMxMDEpLCBXVEMwKDB4YmM3NzFjMDEpLCAKLSAgV1RDMCgweGJjN2U3ZTAxKSwgV1RDMCgweGJjODVlODAxKSwgV1RDMCgweGJjOGQ1OTAxKSwgV1RDMCgweGJjOTRkMjAxKSwgV1RDMCgweGJjOWM1MjgxKSwgV1RDMCgweGJjYTNkYjAxKSwgV1RDMCgweGJjYWI2YzAxKSwgV1RDMCgweGJjYjMwNjAxKSwgCi0gIFdUQzAoMHhiY2JhYTgwMSksIFdUQzAoMHhiY2MyNTE4MSksIFdUQzAoMHhiY2NhMDMwMSksIFdUQzAoMHhiY2QxYmI4MSksIFdUQzAoMHhiY2Q5N2M4MSksIFdUQzAoMHhiY2UxNDYwMSksIFdUQzAoMHhiY2U5MTgwMSksIFdUQzAoMHhiY2YwZjM4MSksIAotICBXVEMwKDB4YmNmOGQ3ODEpLCBXVEMwKDB4YmQwMGMzODEpLCBXVEMwKDB4YmQwOGI3ODEpLCBXVEMwKDB4YmQxMGIzODEpLCBXVEMwKDB4YmQxOGI3ODEpLCBXVEMwKDB4YmQyMGM0MDEpLCBXVEMwKDB4YmQyOGQ5ODEpLCBXVEMwKDB4YmQzMGY4ODEpLCAKLSAgV1RDMCgweGJkMzkxZjgxKSwgV1RDMCgweGJkNDE0ZjAxKSwgV1RDMCgweGJkNDk4NjAxKSwgV1RDMCgweGJkNTFjNDgxKSwgV1RDMCgweGJkNWEwYjAxKSwgV1RDMCgweGJkNjI1OTgxKSwgV1RDMCgweGJkNmFiMTAxKSwgV1RDMCgweGJkNzMxMDgxKSwgCi0gIFdUQzAoMHhiZDdiNzc4MSksIFdUQzAoMHhiZDgzZTY4MSksIFdUQzAoMHhiZDhjNWMwMSksIFdUQzAoMHhiZDk0ZDgwMSksIFdUQzAoMHhiZDlkNWI4MSksIFdUQzAoMHhiZGE1ZTYwMSksIFdUQzAoMHhiZGFlNzg4MSksIFdUQzAoMHhiZGI3MTIwMSksIAotICBXVEMwKDB4YmRiZmIyODEpLCBXVEMwKDB4YmRjODU5ODEpLCBXVEMwKDB4YmRkMTA2ODEpLCBXVEMwKDB4YmRkOWI5ODEpLCBXVEMwKDB4YmRlMjcyMDEpLCBXVEMwKDB4YmRlYjMxMDEpLCBXVEMwKDB4YmRmM2Y3MDEpLCBXVEMwKDB4YmRmY2MzMDEpLCAKLSAgV1RDMCgweGJlMDU5NDgxKSwgV1RDMCgweGJlMGU2YzAxKSwgV1RDMCgweGJlMTc0NzgxKSwgV1RDMCgweGJlMjAyODAxKSwgV1RDMCgweGJlMjkwZDAxKSwgV1RDMCgweGJlMzFmNzAxKSwgV1RDMCgweGJlM2FlNjAxKSwgV1RDMCgweGJlNDNkYTgxKSwgCi0gIFdUQzAoMHhiZTRjZDM4MSksIFdUQzAoMHhiZTU1ZDAwMSksIFdUQzAoMHhiZTVlZDA4MSksIFdUQzAoMHhiZTY3ZDM4MSksIFdUQzAoMHhiZTcwZGEwMSksIFdUQzAoMHhiZTc5ZTQ4MSksIFdUQzAoMHhiZTgyZjMwMSksIFdUQzAoMHhiZThjMDUwMSksIAotICBXVEMwKDB4YmU5NTFhODEpLCBXVEMwKDB4YmU5ZTMyODEpLCBXVEMwKDB4YmVhNzRjODEpLCBXVEMwKDB4YmViMDY4ODEpLCBXVEMwKDB4YmViOTg2ODEpLCBXVEMwKDB4YmVjMmE3ODEpLCBXVEMwKDB4YmVjYmNhODEpLCBXVEMwKDB4YmVkNGYwODEpLCAKLSAgV1RDMCgweGJlZGUxOTAxKSwgV1RDMCgweGJlZTc0MjgxKSwgV1RDMCgweGJlZjA2ZDAxKSwgV1RDMCgweGJlZjk5OTAxKSwgV1RDMCgweGJmMDJjNTgxKSwgV1RDMCgweGJmMGJmMzgxKSwgV1RDMCgweGJmMTUyMzgxKSwgV1RDMCgweGJmMWU1NTAxKSwgCi0gIFdUQzAoMHhiZjI3ODgwMSksIFdUQzAoMHhiZjMwYmIwMSksIFdUQzAoMHhiZjM5ZWU4MSksIFdUQzAoMHhiZjQzMjI4MSksIFdUQzAoMHhiZjRjNTY4MSksIFdUQzAoMHhiZjU1OGIwMSksIFdUQzAoMHhiZjVlYzEwMSksIFdUQzAoMHhiZjY3ZjgwMSksIAotICBXVEMwKDB4YmY3MTJmMDEpLCBXVEMwKDB4YmY3YTY2ODEpLCBXVEMwKDB4YmY4MzlkODEpLCBXVEMwKDB4YmY4Y2Q0ODEpLCBXVEMwKDB4YmY5NjBiMDEpLCBXVEMwKDB4YmY5ZjQxODEpLCBXVEMwKDB4YmZhODc5MDEpLCBXVEMwKDB4YmZiMWIxMDEpLCAKLSAgV1RDMCgweGJmYmFlOTgxKSwgV1RDMCgweGJmYzQyMjAxKSwgV1RDMCgweGJmY2Q1YTAxKSwgV1RDMCgweGJmZDY5MTAxKSwgV1RDMCgweGJmZGZjNzgxKSwgV1RDMCgweGJmZThmYzAxKSwgV1RDMCgweGJmZjIyZjgxKSwgV1RDMCgweGJmZmI2MDgxKSwgCi0gIC8qIHBhcnQgMSAqLwotICBXVEMxKDB4ODAwOTNlMDEpLCBXVEMxKDB4ODAxYjliMDEpLCBXVEMxKDB4ODAyZGY3MDEpLCBXVEMxKDB4ODA0MDUxMDEpLCBXVEMxKDB4ODA1MmE4ODEpLCBXVEMxKDB4ODA2NGZjODEpLCBXVEMxKDB4ODA3NzRjODEpLCBXVEMxKDB4ODA4OTk4ODEpLCAKLSAgV1RDMSgweDgwOWJkZjAxKSwgV1RDMSgweDgwYWUxZjgxKSwgV1RDMSgweDgwYzA1YTAxKSwgV1RDMSgweDgwZDI4ZDgxKSwgV1RDMSgweDgwZTRiYjgxKSwgV1RDMSgweDgwZjZlNDgxKSwgV1RDMSgweDgxMDkwOTgxKSwgV1RDMSgweDgxMWIyOTgxKSwgCi0gIFdUQzEoMHg4MTJkNDQ4MSksIFdUQzEoMHg4MTNmNTk4MSksIFdUQzEoMHg4MTUxNjcwMSksIFdUQzEoMHg4MTYzNmQ4MSksIFdUQzEoMHg4MTc1NmQ4MSksIFdUQzEoMHg4MTg3Njc4MSksIFdUQzEoMHg4MTk5NWMwMSksIFdUQzEoMHg4MWFiNGIwMSksIAotICBXVEMxKDB4ODFiZDM0MDEpLCBXVEMxKDB4ODFjZjE1ODEpLCBXVEMxKDB4ODFlMGVlODEpLCBXVEMxKDB4ODFmMmJmODEpLCBXVEMxKDB4ODIwNDg4ODEpLCBXVEMxKDB4ODIxNjRhODEpLCBXVEMxKDB4ODIyODA1ODEpLCBXVEMxKDB4ODIzOWI5ODEpLCAKLSAgV1RDMSgweDgyNGI2NjAxKSwgV1RDMSgweDgyNWQwOTAxKSwgV1RDMSgweDgyNmVhMjAxKSwgV1RDMSgweDgyODAzMTAxKSwgV1RDMSgweDgyOTFiNjAxKSwgV1RDMSgweDgyYTMzMjgxKSwgV1RDMSgweDgyYjRhNjAxKSwgV1RDMSgweDgyYzYxMTAxKSwgCi0gIFdUQzEoMHg4MmQ3NzIwMSksIFdUQzEoMHg4MmU4YzgwMSksIFdUQzEoMHg4MmZhMTE4MSksIFdUQzEoMHg4MzBiNGY4MSksIFdUQzEoMHg4MzFjODEwMSksIFdUQzEoMHg4MzJkYTc4MSksIFdUQzEoMHg4MzNlYzM4MSksIFdUQzEoMHg4MzRmZDQ4MSksIAotICBXVEMxKDB4ODM2MGQ5MDEpLCBXVEMxKDB4ODM3MWQwODEpLCBXVEMxKDB4ODM4MmJhMDEpLCBXVEMxKDB4ODM5Mzk1MDEpLCBXVEMxKDB4ODNhNDYxODEpLCBXVEMxKDB4ODNiNTIxMDEpLCBXVEMxKDB4ODNjNWQzODEpLCBXVEMxKDB4ODNkNjc4ODEpLCAKLSAgV1RDMSgweDgzZTcwZjAxKSwgV1RDMSgweDgzZjc5NjgxKSwgV1RDMSgweDg0MDgwZDgxKSwgV1RDMSgweDg0MTg3NDAxKSwgV1RDMSgweDg0MjhjYTAxKSwgV1RDMSgweDg0MzkxMDgxKSwgV1RDMSgweDg0NDk0ODgxKSwgV1RDMSgweDg0NTk3MDgxKSwgCi0gIFdUQzEoMHg4NDY5ODg4MSksIFdUQzEoMHg4NDc5OGY4MSksIFdUQzEoMHg4NDg5ODQ4MSksIFdUQzEoMHg4NDk5NjcwMSksIFdUQzEoMHg4NGE5MzgwMSksIFdUQzEoMHg4NGI4ZjgwMSksIFdUQzEoMHg4NGM4YTcwMSksIFdUQzEoMHg4NGQ4NDYwMSksIAotICBXVEMxKDB4ODRlN2QzODEpLCBXVEMxKDB4ODRmNzRlMDEpLCBXVEMxKDB4ODUwNmI1ODEpLCBXVEMxKDB4ODUxNjA5ODEpLCBXVEMxKDB4ODUyNTRhODEpLCBXVEMxKDB4ODUzNDc5MDEpLCBXVEMxKDB4ODU0Mzk2MDEpLCBXVEMxKDB4ODU1MmExODEpLCAKLSAgV1RDMSgweDg1NjE5YTAxKSwgV1RDMSgweDg1NzA3ZjgxKSwgV1RDMSgweDg1N2Y1MTAxKSwgV1RDMSgweDg1OGUwZTAxKSwgV1RDMSgweDg1OWNiNzgxKSwgV1RDMSgweDg1YWI0ZjAxKSwgV1RDMSgweDg1YjlkNDgxKSwgV1RDMSgweDg1Yzg0ODAxKSwgCi0gIFdUQzEoMHg4NWQ2YTk4MSksIFdUQzEoMHg4NWU0ZjgwMSksIFdUQzEoMHg4NWYzMzI4MSksIFdUQzEoMHg4NjAxNTk4MSksIFdUQzEoMHg4NjBmNmUwMSksIFdUQzEoMHg4NjFkNzA4MSksIFdUQzEoMHg4NjJiNjIwMSksIFdUQzEoMHg4NjM5NDMwMSksIAotICBXVEMxKDB4ODY0NzEyODEpLCBXVEMxKDB4ODY1NGQwMDEpLCBXVEMxKDB4ODY2MjdiMDEpLCBXVEMxKDB4ODY3MDEzODEpLCBXVEMxKDB4ODY3ZDlhODEpLCBXVEMxKDB4ODY4YjEwMDEpLCBXVEMxKDB4ODY5ODc1ODEpLCBXVEMxKDB4ODZhNWNhODEpLCAKLSAgV1RDMSgweDg2YjMwZjAxKSwgV1RDMSgweDg2YzA0MzgxKSwgV1RDMSgweDg2Y2Q2NjgxKSwgV1RDMSgweDg2ZGE3OTAxKSwgV1RDMSgweDg2ZTc3YjgxKSwgV1RDMSgweDg2ZjQ2ZDgxKSwgV1RDMSgweDg3MDE0ZjgxKSwgV1RDMSgweDg3MGUyMzAxKSwgCi0gIFdUQzEoMHg4NzFhZTk4MSksIFdUQzEoMHg4NzI3YTM4MSksIFdUQzEoMHg4NzM0NTM4MSksIFdUQzEoMHg4NzQwZjY4MSksIFdUQzEoMHg4NzRkODY4MSksIFdUQzEoMHg4NzU5ZmQwMSksIFdUQzEoMHg4NzY2NTQ4MSksIFdUQzEoMHg4NzcyOTcwMSksIAotICBXVEMxKDB4ODc3ZWRlMDEpLCBXVEMxKDB4ODc4YjQzMDEpLCBXVEMxKDB4ODc5N2RkODEpLCBXVEMxKDB4ODdhNDhiMDEpLCBXVEMxKDB4ODdiMGVmMDEpLCBXVEMxKDB4ODdiY2FiODEpLCBXVEMxKDB4ODdjNzYyMDEpLCBXVEMxKDB4ODdkMGNhODEpLCAKLSAgV1RDMSgweDg3ZmRkNzgxKSwgV1RDMSgweDg4MWRkMzAxKSwgV1RDMSgweDg4NDIzMzAxKSwgV1RDMSgweDg4NmE4YTgxKSwgV1RDMSgweDg4OTYyOTgxKSwgV1RDMSgweDg4YzQ1ZTgxKSwgV1RDMSgweDg4ZjQ3OTAxKSwgV1RDMSgweDg5MjVmMTAxKSwgCi0gIFdUQzEoMHg4OTU4NjkwMSksIFdUQzEoMHg4OThiODMwMSksIFdUQzEoMHg4OWJlZTU4MSksIFdUQzEoMHg4OWYyNjEwMSksIFdUQzEoMHg4YTI1ZjMwMSksIFdUQzEoMHg4YTU5OWE4MSksIFdUQzEoMHg4YThkNTgwMSksIFdUQzEoMHg4YWMxMzM4MSksIAotICBXVEMxKDB4OGFmNTNlODEpLCBXVEMxKDB4OGIyOThiODEpLCBXVEMxKDB4OGI1ZTJjODEpLCBXVEMxKDB4OGI5MzMwMDEpLCBXVEMxKDB4OGJjOGE0MDEpLCBXVEMxKDB4OGJmZTk0MDEpLCBXVEMxKDB4OGMzNTBkMDEpLCBXVEMxKDB4OGM2YzFiMDEpLCAKLSAgV1RDMSgweDhjYTNjYjAxKSwgV1RDMSgweDhjZGMyOTAxKSwgV1RDMSgweDhkMTU0MDgxKSwgV1RDMSgweDhkNGYxYjAxKSwgV1RDMSgweDhkODliZTgxKSwgV1RDMSgweDhkYzUzMDAxKSwgV1RDMSgweDhlMDE3NTgxKSwgV1RDMSgweDhlM2U5NDgxKSwgCi0gIFdUQzEoMHg4ZTdjOTMwMSksIFdUQzEoMHg4ZWJiNzU4MSksIFdUQzEoMHg4ZWZiNDE4MSksIFdUQzEoMHg4ZjNiZmIwMSksIFdUQzEoMHg4ZjdkYTQwMSksIFdUQzEoMHg4ZmMwM2YwMSksIFdUQzEoMHg5MDAzY2U4MSksIFdUQzEoMHg5MDQ4NTQwMSksIAotICBXVEMxKDB4OTA4ZGQxMDEpLCBXVEMxKDB4OTBkNDQ3ODEpLCBXVEMxKDB4OTExYmI5ODEpLCBXVEMxKDB4OTE2NDI3ODEpLCBXVEMxKDB4OTFhZDkyODEpLCBXVEMxKDB4OTFmN2Y5ODEpLCBXVEMxKDB4OTI0MzVkMDEpLCBXVEMxKDB4OTI4ZmJlMDEpLCAKLSAgV1RDMSgweDkyZGQxYjAxKSwgV1RDMSgweDkzMmI3NTAxKSwgV1RDMSgweDkzN2FjYjAxKSwgV1RDMSgweDkzY2IxYzgxKSwgV1RDMSgweDk0MWM2OTAxKSwgV1RDMSgweDk0NmVhZjgxKSwgV1RDMSgweDk0YzFlZTAxKSwgV1RDMSgweDk1MTYyMzgxKSwgCi0gIFdUQzEoMHg5NTZiNGY4MSksIFdUQzEoMHg5NWMxNzA4MSksIFdUQzEoMHg5NjE4ODUwMSksIFdUQzEoMHg5NjcwOGI4MSksIFdUQzEoMHg5NmM5ODM4MSksIFdUQzEoMHg5NzIzNmIwMSksIFdUQzEoMHg5NzdlNDE4MSksIFdUQzEoMHg5N2RhMDQ4MSksIAotICBXVEMxKDB4OTgzNmIyMDEpLCBXVEMxKDB4OTg5NDQ5MDEpLCBXVEMxKDB4OThmMmM2MDEpLCBXVEMxKDB4OTk1MjI4MDEpLCBXVEMxKDB4OTliMjZjODEpLCBXVEMxKDB4OWExMzkxMDEpLCBXVEMxKDB4OWE3NTkzMDEpLCBXVEMxKDB4OWFkODcwODEpLCAKLSAgV1RDMSgweDliM2MyODAxKSwgV1RDMSgweDliYTBiNzAxKSwgV1RDMSgweDljMDYxYjgxKSwgV1RDMSgweDljNmM1NDgxKSwgV1RDMSgweDljZDM1ZjgxKSwgV1RDMSgweDlkM2IzYjgxKSwgV1RDMSgweDlkYTNlNjAxKSwgV1RDMSgweDllMGQ1ZTAxKSwgCi0gIFdUQzEoMHg5ZTc3OWY4MSksIFdUQzEoMHg5ZWUyYTkwMSksIFdUQzEoMHg5ZjRlNzgwMSksIFdUQzEoMHg5ZmJiMDk4MSksIFdUQzEoMHhhMDI4NWQ4MSksIFdUQzEoMHhhMDk2NzIwMSksIFdUQzEoMHhhMTA1NDcwMSksIFdUQzEoMHhhMTc0ZGE4MSksIAotICBXVEMxKDB4YTFlNTJhODEpLCBXVEMxKDB4YTI1NjM1MDEpLCBXVEMxKDB4YTJjN2Y4MDEpLCBXVEMxKDB4YTMzYTcyMDEpLCBXVEMxKDB4YTNhZGEyODEpLCBXVEMxKDB4YTQyMTg4MDEpLCBXVEMxKDB4YTQ5NjIxODEpLCBXVEMxKDB4YTUwYjZlODEpLCAKLSAgV1RDMSgweGE1ODE2ZTgxKSwgV1RDMSgweGE1ZjgxZjgxKSwgV1RDMSgweGE2NmY4MjAxKSwgV1RDMSgweGE2ZTc5NDAxKSwgV1RDMSgweGE3NjA1NjAxKSwgV1RDMSgweGE3ZDljNjgxKSwgV1RDMSgweGE4NTNlNTAxKSwgV1RDMSgweGE4Y2ViMjAxKSwgCi0gIFdUQzEoMHhhOTRhMmMwMSksIFdUQzEoMHhhOWM2NTQwMSksIFdUQzEoMHhhYTQzMjk4MSksIFdUQzEoMHhhYWMwYWQwMSksIFdUQzEoMHhhYjNlZGYwMSksIFdUQzEoMHhhYmJkYzAwMSksIFdUQzEoMHhhYzNkNTAwMSksIFdUQzEoMHhhY2JkOTA4MSksIAotICBXVEMxKDB4YWQzZTgxMDEpLCBXVEMxKDB4YWRjMDIyODEpLCBXVEMxKDB4YWU0Mjc0ODEpLCBXVEMxKDB4YWVjNTc4MDEpLCBXVEMxKDB4YWY0OTJmMDEpLCBXVEMxKDB4YWZjZDlhODEpLCBXVEMxKDB4YjA1MmJjMDEpLCBXVEMxKDB4YjBkODk0MDEpLCAKLSAgV1RDMSgweGIxNWYyMzgxKSwgV1RDMSgweGIxZTY2YTAxKSwgV1RDMSgweGIyNmU2ODgxKSwgV1RDMSgweGIyZjcxZjAxKSwgV1RDMSgweGIzODA4ZDgxKSwgV1RDMSgweGI0MGFiNTAxKSwgV1RDMSgweGI0OTU5NTAxKSwgV1RDMSgweGI1MjEyZTgxKSwgCi0gIFdUQzEoMHg0YTZjZjY3ZiksIFdUQzEoMHg0OWRmZmVmZiksIFdUQzEoMHg0OTUyNjVmZiksIFdUQzEoMHg0OGM0Mjc3ZiksIFdUQzEoMHg0ODM1NDA3ZiksIFdUQzEoMHg0N2E1YWVmZiksIFdUQzEoMHg0NzE1NzBmZiksIFdUQzEoMHg0Njg0ODRmZiksIAotICBXVEMxKDB4NDVmMmVhZmYpLCBXVEMxKDB4NDU2MGEyZmYpLCBXVEMxKDB4NDRjZGFkN2YpLCBXVEMxKDB4NDQzYTBjN2YpLCBXVEMxKDB4NDNhNWMwN2YpLCBXVEMxKDB4NDMxMGNhZmYpLCBXVEMxKDB4NDI3YjJiZmYpLCBXVEMxKDB4NDFlNGUzZmYpLCAKLSAgV1RDMSgweDQxNGRmMmZmKSwgV1RDMSgweDQwYjY1NTdmKSwgV1RDMSgweDQwMWUwNmZmKSwgV1RDMSgweDNmODUwM2MwKSwgV1RDMSgweDNlZWI0ZTAwKSwgV1RDMSgweDNlNTBlYmMwKSwgV1RDMSgweDNkYjVlNjgwKSwgV1RDMSgweDNkMWE0NjgwKSwgCi0gIFdUQzEoMHgzYzdlMTBjMCksIFdUQzEoMHgzYmUxNGNjMCksIFdUQzEoMHgzYjQ0MDJjMCksIFdUQzEoMHgzYWE2MzgwMCksIFdUQzEoMHgzYTA3ZTg0MCksIFdUQzEoMHgzOTY5MDg4MCksIFdUQzEoMHgzOGM5ODcwMCksIFdUQzEoMHgzODI5NWI0MCksIAotICBXVEMxKDB4Mzc4ODhhODApLCBXVEMxKDB4MzZlNzFkNDApLCBXVEMxKDB4MzY0NTFkODApLCBXVEMxKDB4MzVhMjk0MDApLCBXVEMxKDB4MzRmZjg4MDApLCBXVEMxKDB4MzQ1YzA0YzApLCBXVEMxKDB4MzNiODE5NDApLCBXVEMxKDB4MzMxM2QyMDApLCAKLSAgV1RDMSgweDMyNmYzODAwKSwgV1RDMSgweDMxY2E1NjAwKSwgV1RDMSgweDMxMjUzODQwKSwgV1RDMSgweDMwN2ZlOGMwKSwgV1RDMSgweDJmZGE2ZTQwKSwgV1RDMSgweDJmMzRjZTQwKSwgV1RDMSgweDJlOGYwZTQwKSwgV1RDMSgweDJkZTkyZWMwKSwgCi0gIFdUQzEoMHgyZDQzMjc4MCksIFdUQzEoMHgyYzljZWE0MCksIFdUQzEoMHgyYmY2NjMwMCksIFdUQzEoMHgyYjRmODhjMCksIFdUQzEoMHgyYWE4NjRjMCksIFdUQzEoMHgyYTAxMDI0MCksIFdUQzEoMHgyOTU5NmU0MCksIFdUQzEoMHgyOGIxYmE4MCksIAotICBXVEMxKDB4MjgwOWZmNDApLCBXVEMxKDB4Mjc2MjViODApLCBXVEMxKDB4MjZiYWY1ODApLCBXVEMxKDB4MjYxM2U3YzApLCBXVEMxKDB4MjU2ZDNkYzApLCBXVEMxKDB4MjRjNzAzMDApLCBXVEMxKDB4MjQyMTQzODApLCBXVEMxKDB4MjM3YzA4MDApLCAKLSAgV1RDMSgweDIyZDc1NDAwKSwgV1RDMSgweDIyMzMyYTgwKSwgV1RDMSgweDIxOGY4Y2MwKSwgV1RDMSgweDIwZWM3ZTQwKSwgV1RDMSgweDIwNGEwNGMwKSwgV1RDMSgweDFmYTgyNTQwKSwgV1RDMSgweDFmMDZlMzAwKSwgV1RDMSgweDFlNjY0MDAwKSwgCi0gIFdUQzEoMHgxZGM2M2JjMCksIFdUQzEoMHgxZDI2ZDNjMCksIFdUQzEoMHgxYzg4MDNhMCksIFdUQzEoMHgxYmU5Y2M0MCksIFdUQzEoMHgxYjRjMzRjMCksIFdUQzEoMHgxYWFmNDQ4MCksIFdUQzEoMHgxYTEzMDI2MCksIFdUQzEoMHgxOTc3NzRhMCksIAotICBXVEMxKDB4MThkY2EyNjApLCBXVEMxKDB4MTg0Mjk0ZTApLCBXVEMxKDB4MTdhOTU4NDApLCBXVEMxKDB4MTcxMGZkODApLCBXVEMxKDB4MTY3OTljZTApLCBXVEMxKDB4MTVlMzUzNDApLCBXVEMxKDB4MTU0ZTQxYTApLCBXVEMxKDB4MTRiYTgzNjApLCAKLSAgV1RDMSgweDE0MjgyYmUwKSwgV1RDMSgweDEzOTc1MTAwKSwgV1RDMSgweDEzMDgwYWEwKSwgV1RDMSgweDEyN2E2MjQwKSwgV1RDMSgweDExZWU1MGEwKSwgV1RDMSgweDExNjNjYzgwKSwgV1RDMSgweDEwZGFjYjIwKSwgV1RDMSgweDEwNTMzM2EwKSwgCi0gIFdUQzEoMHgwZmNjZGIzMCksIFdUQzEoMHgwZjQ3OGY0MCksIFdUQzEoMHgwZWMzMTcwMCksIFdUQzEoMHgwZTNmNGU4MCksIFdUQzEoMHgwZGJjMjdmMCksIFdUQzEoMHgwZDM5OTAwMCksIFdUQzEoMHgwY2I3NmQwMCksIFdUQzEoMHgwYzM1OWQ1MCksIAotICBXVEMxKDB4MGJiM2ZkNTApLCBXVEMxKDB4MGIzMjZiZDApLCBXVEMxKDB4MGFiMGNhODApLCBXVEMxKDB4MGEyZjBkYzApLCBXVEMxKDB4MDlhZDQwYzApLCBXVEMxKDB4MDkyYjdhOTApLCBXVEMxKDB4MDhhOWRiODApLCBXVEMxKDB4MDgyODVjODApLCAKLSAgV1RDMSgweDA3YTZjN2I4KSwgV1RDMSgweDA3MjRlNGUwKSwgV1RDMSgweDA2YTI3YjgwKSwgV1RDMSgweDA2MWY1MmY4KSwgV1RDMSgweDA1OWIyYWQwKSwgV1RDMSgweDA1MTViNTY4KSwgV1RDMSgweDA0OGVhMDU4KSwgV1RDMSgweDA0MDY2NDA4KSwgCi0gIFdUQzEoMHgwMzdlNTJkOCksIFdUQzEoMHgwMmY3ZDNjOCksIFdUQzEoMHgwMjc0NjE0YyksIFdUQzEoMHgwMWY2MzAwOCksIFdUQzEoMHgwMTgwNDAzYSksIFdUQzEoMHgwMTE1YzQ0MiksIFdUQzEoMHgwMGJhMDllMiksIFdUQzEoMHgwMDZmMDc3YyksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgLyogcGFydCAyICovCi0gIFdUQzIoMHhmZmYzNmJlMSksIFdUQzIoMHhmZmRhZmJjMSksIFdUQzIoMHhmZmMyODAzNSksIFdUQzIoMHhmZmE5ZmU4YSksIFdUQzIoMHhmZjkxN2MwOCksIFdUQzIoMHhmZjc4ZmRmYyksIFdUQzIoMHhmZjYwODlhZiksIFdUQzIoMHhmZjQ4MjQ2YyksIAotICBXVEMyKDB4ZmYyZmQzN2YpLCBXVEMyKDB4ZmYxNzljMzEpLCBXVEMyKDB4ZmVmZjgzYjYpLCBXVEMyKDB4ZmVlNzhkMTgpLCBXVEMyKDB4ZmVjZmI5M2UpLCBXVEMyKDB4ZmViODA4ZjIpLCBXVEMyKDB4ZmVhMDdkMDYpLCBXVEMyKDB4ZmU4OTE2YjQpLCAKLSAgV1RDMigweGZlNzFkN2EwKSwgV1RDMigweGZlNWFjMTc0KSwgV1RDMigweGZlNDNkNWQ2KSwgV1RDMigweGZlMmQxNjdlKSwgV1RDMigweGZlMTY4NTJlKSwgV1RDMigweGZlMDAyM2E2KSwgV1RDMigweGZkZTlmM2Y4KSwgV1RDMigweGZkZDNmZjdjKSwgCi0gIFdUQzIoMHhmZGJlNTZjMCksIFdUQzIoMHhmZGE5MGFhOCksIFdUQzIoMHhmZDk0MmI3OCksIFdUQzIoMHhmZDdmYmIyMCksIFdUQzIoMHhmZDZiYWQ1MCksIFdUQzIoMHhmZDU3ZjUxMCksIFdUQzIoMHhmZDQ0ODU3YyksIFdUQzIoMHhmZDMxNTNmYyksIAotICBXVEMyKDB4ZmQxZTU4NDApLCBXVEMyKDB4ZmQwYjhhMGMpLCBXVEMyKDB4ZmNmOGUxODApLCBXVEMyKDB4ZmNlNjVlZWMpLCBXVEMyKDB4ZmNkNDBhZDApLCBXVEMyKDB4ZmNjMWVlMGMpLCBXVEMyKDB4ZmNiMDExZTgpLCBXVEMyKDB4ZmM5ZTg5NmMpLCAKLSAgV1RDMigweGZjOGQ3MTZjKSwgV1RDMigweGZjN2NlNzIwKSwgV1RDMigweGZjNmQwNzJjKSwgV1RDMigweGZjNWRlMDljKSwgV1RDMigweGZjNGY3NGU4KSwgV1RDMigweGZjNDFjNGU4KSwgV1RDMigweGZjMzRkMGRjKSwgV1RDMigweGZjMjg4YTY4KSwgCi0gIFdUQzIoMHhmYzFjZDQ5YyksIFdUQzIoMHhmYzExOTFlMCksIFdUQzIoMHhmYzA2YTRkMCksIFdUQzIoMHhmYmZiZjNlOCksIFdUQzIoMHhmYmYxNjk5MCksIFdUQzIoMHhmYmU2ZjA2OCksIFdUQzIoMHhmYmRjNzQyOCksIFdUQzIoMHhmYmQxZmM2OCksIAotICBXVEMyKDB4ZmJjN2FjNTApLCBXVEMyKDB4ZmJiZGE4NjgpLCBXVEMyKDB4ZmJiNDE1MDApLCBXVEMyKDB4ZmJhYjE0MzgpLCBXVEMyKDB4ZmJhMmM1ZjgpLCBXVEMyKDB4ZmI5YjRhMDApLCBXVEMyKDB4ZmI5NGJmYTgpLCBXVEMyKDB4ZmI4ZjNiNDgpLCAKLSAgV1RDMigweGZiOGFjNjM4KSwgV1RDMigweGZiODc2OTcwKSwgV1RDMigweGZiODUyZDIwKSwgV1RDMigweGZiODQwYWUwKSwgV1RDMigweGZiODNlZDYwKSwgV1RDMigweGZiODRiZWMwKSwgV1RDMigweGZiODY2OTE4KSwgV1RDMigweGZiODhkNGE4KSwgCi0gIFdUQzIoMHhmYjhiZTgxMCksIFdUQzIoMHhmYjhmODlkMCksIFdUQzIoMHhmYjkzYTA4MCksIFdUQzIoMHhmYjk4MTQxOCksIFdUQzIoMHhmYjljY2RmMCksIFdUQzIoMHhmYmExYjc3MCksIFdUQzIoMHhmYmE2YmFlMCksIFdUQzIoMHhmYmFiZDVjMCksIAotICBXVEMyKDB4ZmJiMTE4ZDgpLCBXVEMyKDB4ZmJiNjk1YzApLCBXVEMyKDB4ZmJiYzVlOTApLCBXVEMyKDB4ZmJjMjkwMzApLCBXVEMyKDB4ZmJjOTUyNjgpLCBXVEMyKDB4ZmJkMGNkNzgpLCBXVEMyKDB4ZmJkOTI5YzgpLCBXVEMyKDB4ZmJlMjk0ZDApLCAKLSAgV1RDMigweGZiZWQ0MTA4KSwgV1RDMigweGZiZjk2MTE4KSwgV1RDMigweGZjMDcyNmM4KSwgV1RDMigweGZjMTZiMDY0KSwgV1RDMigweGZjMjgwODkwKSwgV1RDMigweGZjM2IzOTIwKSwgV1RDMigweGZjNTA0YTk4KSwgV1RDMigweGZjNjcyNzFjKSwgCi0gIFdUQzIoMHhmYzdmOWE3NCksIFdUQzIoMHhmYzk5NmYxOCksIFdUQzIoMHhmY2I0NmViOCksIFdUQzIoMHhmY2QwNTBiMCksIFdUQzIoMHhmY2VjYmEyNCksIFdUQzIoMHhmZDA5NGY2NCksIFdUQzIoMHhmZDI1YjcyMCksIFdUQzIoMHhmZDQxY2U0MCksIAotICBXVEMyKDB4ZmQ1ZGE3ZjgpLCBXVEMyKDB4ZmQ3OTU5ZDgpLCBXVEMyKDB4ZmQ5NGZiNzQpLCBXVEMyKDB4ZmRiMGQzZmMpLCBXVEMyKDB4ZmRjZDVhMzQpLCBXVEMyKDB4ZmRlYjA2ZTQpLCBXVEMyKDB4ZmUwYTUxODQpLCBXVEMyKDB4ZmUyYjkyYzQpLCAKLSAgV1RDMigweGZlNGYwNDg2KSwgV1RDMigweGZlNzRkZjU0KSwgV1RDMigweGZlOWQ1ODg2KSwgV1RDMigweGZlYzg1YjkyKSwgV1RDMigweGZlZjU4YTE2KSwgV1RDMigweGZmMjQ4Mjc1KSwgV1RDMigweGZmNTRlNDAxKSwgV1RDMigweGZmODY2MzMwKSwgCi0gIFdUQzIoMHhmZmI4Yzk5YiksIFdUQzIoMHhmZmViZTFjOSksIFdUQzIoMHgwMDFmNzg2YSksIFdUQzIoMHgwMDUzOGJmOSksIFdUQzIoMHgwMDg4NGNiYyksIFdUQzIoMHgwMGJkZWQyMyksIFdUQzIoMHgwMGY0OWY1NCksIFdUQzIoMHgwMTJjOGVlNCksIAotICBXVEMyKDB4MDE2NWUwZDIpLCBXVEMyKDB4MDFhMGI5ZDYpLCBXVEMyKDB4MDFkZDNkODApLCBXVEMyKDB4MDIxYjc0ZDQpLCBXVEMyKDB4MDI1YjRlNDgpLCBXVEMyKDB4MDI5Y2I3MzApLCBXVEMyKDB4MDJkZjlkMGMpLCBXVEMyKDB4MDMyM2YxYTQpLCAKLSAgV1RDMigweDAzNjlhYjAwKSwgV1RDMigweDAzYjBiZjVjKSwgV1RDMigweDAzZjkyNWEwKSwgV1RDMigweDA0NDJlM2Q4KSwgV1RDMigweDA0OGUwZjQwKSwgV1RDMigweDA0ZGFiZGIwKSwgV1RDMigweDA1MjkwNDMwKSwgV1RDMigweDA1NzhlNDI4KSwgCi0gIFdUQzIoMHgwNWNhNGI2MCksIFdUQzIoMHgwNjFkMjZjMCksIFdUQzIoMHgwNjcxNjNkOCksIFdUQzIoMHgwNmM2ZmYxMCksIFdUQzIoMHgwNzFlMDNiMCksIFdUQzIoMHgwNzc2N2RhMCksIFdUQzIoMHgwN2QwNzkxOCksIFdUQzIoMHgwODJjMDhlMCksIAotICBXVEMyKDB4MDg4OTQ2NjApLCBXVEMyKDB4MDhlODRiNzApLCBXVEMyKDB4MDk0OTMwYjApLCBXVEMyKDB4MDlhYmY4ZDApLCBXVEMyKDB4MGExMDkwMjApLCBXVEMyKDB4MGE3NmUyMTApLCBXVEMyKDB4MGFkZWRhNTApLCBXVEMyKDB4MGI0ODZiODApLCAKLSAgV1RDMigweDBiYjM4ZjAwKSwgV1RDMigweDBjMjAzZTgwKSwgV1RDMigweDBjOGU3M2UwKSwgV1RDMigweDBjZmUyYzMwKSwgV1RDMigweDBkNmY2ODIwKSwgV1RDMigweDBkZTIyODUwKSwgV1RDMigweDBlNTY2ZDkwKSwgV1RDMigweDBlY2MzZGQwKSwgCi0gIFdUQzIoMHgwZjQzYTNhMCksIFdUQzIoMHgwZmJjYTlmMCksIFdUQzIoMHgxMDM3NWI4MCksIFdUQzIoMHgxMGIzYmUyMCksIFdUQzIoMHgxMTMxZDI4MCksIFdUQzIoMHgxMWIxOTk2MCksIFdUQzIoMHgxMjMzMTNhMCksIFdUQzIoMHgxMmI2NDM4MCksIAotICBXVEMyKDB4MTMzYjJkMDApLCBXVEMyKDB4MTNjMWQ0NDApLCBXVEMyKDB4MTQ0YTNkNjApLCBXVEMyKDB4MTRkNDY5MDApLCBXVEMyKDB4MTU2MDU0ODApLCBXVEMyKDB4MTVlZGZkMjApLCBXVEMyKDB4MTY3ZDYwNDApLCBXVEMyKDB4MTcwZTdlODApLCAKLSAgV1RDMigweDE3YTE1YjgwKSwgV1RDMigweDE4MzVmYjAwKSwgV1RDMigweDE4Y2M2MGEwKSwgV1RDMigweDE5NjQ4ZGMwKSwgV1RDMigweDE5ZmU4MGUwKSwgV1RDMigweDFhOWEzOGEwKSwgV1RDMigweDFiMzdiM2UwKSwgV1RDMigweDFiZDZmNDAwKSwgCi0gIFdUQzIoMHgxYzc3ZmQyMCksIFdUQzIoMHgxZDFhZDQwMCksIFdUQzIoMHgxZGJmN2M4MCksIFdUQzIoMHgxZTY1ZjgyMCksIFdUQzIoMHgxZjBlNDU0MCksIFdUQzIoMHgxZmI4NjFlMCksIFdUQzIoMHgyMDY0NGNjMCksIFdUQzIoMHgyMTEyMDY0MCksIAotICBXVEMyKDB4MjFjMTkyNDApLCBXVEMyKDB4MjI3MmY0ODApLCBXVEMyKDB4MjMyNjMwMDApLCBXVEMyKDB4MjNkYjQ1ODApLCBXVEMyKDB4MjQ5MjMzNDApLCBXVEMyKDB4MjU0YWY3MDApLCBXVEMyKDB4MjYwNThlODApLCBXVEMyKDB4MjZjMWZhMDApLCAKLSAgV1RDMigweDI3ODAzZDAwKSwgV1RDMigweDI4NDA1YTQwKSwgV1RDMigweDI5MDI1NTAwKSwgV1RDMigweDI5YzYyZDQwKSwgV1RDMigweDJhOGJlMGMwKSwgV1RDMigweDJiNTM2Y2MwKSwgV1RDMigweDJjMWNjZjgwKSwgV1RDMigweDJjZTgwODQwKSwgCi0gIFdUQzIoMHgyZGI1MTljMCksIFdUQzIoMHgyZTg0MDYwMCksIFdUQzIoMHgyZjU0Y2Y4MCksIFdUQzIoMHgzMDI3NzVjMCksIFdUQzIoMHgzMGZiZjY0MCksIFdUQzIoMHgzMWQyNGUwMCksIFdUQzIoMHgzMmFhN2EwMCksIFdUQzIoMHgzMzg0NzljMCksIAotICBXVEMyKDB4MzQ2MDRlNDApLCBXVEMyKDB4MzUzZGY5MDApLCBXVEMyKDB4MzYxZDdhYzApLCBXVEMyKDB4MzZmZWQyMDApLCBXVEMyKDB4MzdlMWZiNDApLCBXVEMyKDB4MzhjNmYyNDApLCBXVEMyKDB4MzlhZGIyYzApLCBXVEMyKDB4M2E5NjNhMDApLCAKLSAgV1RDMigweDNiODA4NzQwKSwgV1RDMigweDNjNmM5ODgwKSwgV1RDMigweDNkNWE2Y2MwKSwgV1RDMigweDNlNGEwMDQwKSwgV1RDMigweDNmM2I0YmMwKSwgV1RDMigweDQwMmU0OGZmKSwgV1RDMigweDQxMjJmMTdmKSwgV1RDMigweDQyMTkzZjdmKSwgCi0gIFdUQzIoMHg0MzExMmVmZiksIFdUQzIoMHg0NDBhYmJmZiksIFdUQzIoMHg0NTA1ZTJmZiksIFdUQzIoMHg0NjAyOWU3ZiksIFdUQzIoMHg0NzAwZTlmZiksIFdUQzIoMHg0ODAwYmZmZiksIFdUQzIoMHg0OTAyMWJmZiksIFdUQzIoMHg0YTA1MGVmZiksIAotICBXVEMyKDB4NGIwOWJjN2YpLCBXVEMyKDB4NGMxMDRhZmYpLCBXVEMyKDB4NGQxOGRmN2YpLCBXVEMyKDB4NGUyM2EwN2YpLCBXVEMyKDB4NGYzMGIyZmYpLCBXVEMyKDB4NTA0MDNjN2YpLCBXVEMyKDB4NTE1MjYyZmYpLCBXVEMyKDB4NTI2NzRiN2YpLCAKLSAgV1RDMigweDAwMTY3OGIyKSwgV1RDMigweDAwMDYxYTNiKSwgV1RDMigweGZmZmI0NjIyKSwgV1RDMigweGZmZjVlYTk0KSwgV1RDMigweGZmZjVmNWI5KSwgV1RDMigweGZmZmI1NWJkKSwgV1RDMigweDAwMDVmOGNiKSwgV1RDMigweDAwMTVjZDBjKSwgCi0gIFdUQzIoMHgwMDJhYzBhYyksIFdUQzIoMHgwMDQ0YzFkNSksIFdUQzIoMHgwMDYzYmViMiksIFdUQzIoMHgwMDg3YTU2ZCksIFdUQzIoMHgwMGIwNjQzMSksIFdUQzIoMHgwMGRkZTkyOSksIFdUQzIoMHgwMTEwMjI4MCksIFdUQzIoMHgwMTQ2ZmU1ZSksIAotICBXVEMyKDB4MDE4MjZhZjIpLCBXVEMyKDB4MDFjMjU2NjIpLCBXVEMyKDB4MDIwNmFlZGMpLCBXVEMyKDB4MDI0ZjYyODgpLCBXVEMyKDB4MDI5YzVmOTQpLCBXVEMyKDB4MDJlZDk0MjQpLCBXVEMyKDB4MDM0MmVlNmMpLCBXVEMyKDB4MDM5YzVjOTApLCAKLSAgV1RDMigweDAzZjljY2JjKSwgV1RDMigweDA0NWIyZDE4KSwgV1RDMigweDA0YzA2YmQ4KSwgV1RDMigweDA1Mjk3NzE4KSwgV1RDMigweDA1OTYzZDEwKSwgV1RDMigweDA2MDZhYmU4KSwgV1RDMigweDA2N2FiMWMwKSwgV1RDMigweDA2ZjIzY2QwKSwgCi0gIFdUQzIoMHgwNzZkM2I0MCksIFdUQzIoMHgwN2ViOWIzOCksIFdUQzIoMHgwODZkNGFlMCksIFdUQzIoMHgwOGYyMzg2MCksIFdUQzIoMHgwOTdhNTFmMCksIFdUQzIoMHgwYTA1ODViMCksIFdUQzIoMHgwYTkzYzFkMCksIFdUQzIoMHgwYjI0ZjQ3MCksIAotICBXVEMyKDB4MGJiOTBiYzApLCBXVEMyKDB4MGM0ZmY1ZjApLCBXVEMyKDB4MGNlOWExMzApLCBXVEMyKDB4MGQ4NWZiOTApLCBXVEMyKDB4MGUyNGYzNjApLCBXVEMyKDB4MGVjNjc2YjApLCBXVEMyKDB4MGY2YTczYjApLCBXVEMyKDB4MTAxMGQ4ODApLCAKLSAgV1RDMigweDEwYjk5MzYwKSwgV1RDMigweDExNjQ5MjgwKSwgV1RDMigweDEyMTFjNDAwKSwgV1RDMigweDEyYzExNWUwKSwgV1RDMigweDEzNzI3NmEwKSwgV1RDMigweDE0MjVkNDIwKSwgV1RDMigweDE0ZGIxY2EwKSwgV1RDMigweDE1OTIzZTYwKSwgCi0gIFdUQzIoMHgxNjRiMjc4MCksIFdUQzIoMHgxNzA1YzYyMCksIFdUQzIoMHgxN2MyMDg2MCksIFdUQzIoMHgxODdmZGNhMCksIFdUQzIoMHgxOTNmMzBlMCksIFdUQzIoMHgxOWZmZjM0MCksIFdUQzIoMHgxYWMyMTIwMCksIFdUQzIoMHgxYjg1N2I0MCksIAotICBXVEMyKDB4MWM0YTFkNDApLCBXVEMyKDB4MWQwZmU2MDApLCBXVEMyKDB4MWRkNmMzZTApLCBXVEMyKDB4MWU5ZWE0ZTApLCBXVEMyKDB4MWY2Nzc3NDApLCBXVEMyKDB4MjAzMTI5NDApLCBXVEMyKDB4MjBmYmE4YzApLCBXVEMyKDB4MjFjNmU0NDApLCAKLSAgV1RDMigweDIyOTJjOWMwKSwgV1RDMigweDIzNWY0NzgwKSwgV1RDMigweDI0MmM0YjgwKSwgV1RDMigweDI0ZjljNDAwKSwgV1RDMigweDI1Yzc5ZjQwKSwgV1RDMigweDI2OTVjYjQwKSwgV1RDMigweDI3NjQzNjgwKSwgV1RDMigweDI4MzJjZWMwKSwgCi0gIFdUQzIoMHgyOTAxODI0MCksIFdUQzIoMHgyOWQwM2Y4MCksIFdUQzIoMHgyYTllZjQ4MCksIFdUQzIoMHgyYjZkOGYwMCksIFdUQzIoMHgyYzNiZmRjMCksIFdUQzIoMHgyZDBhMmVjMCksIFdUQzIoMHgyZGQ4MTAwMCksIFdUQzIoMHgyZWE1OGZjMCksIAotICBXVEMyKDB4MmY3MjljNDApLCBXVEMyKDB4MzAzZjIzODApLCBXVEMyKDB4MzEwYjE0MDApLCBXVEMyKDB4MzFkNjViODApLCBXVEMyKDB4MzJhMGU4NDApLCBXVEMyKDB4MzM2YWE4YzApLCBXVEMyKDB4MzQzMzhhYzApLCBXVEMyKDB4MzRmYjdjYzApLCAKLSAgV1RDMigweDM1YzI2Y2MwKSwgV1RDMigweDM2ODg0OTAwKSwgV1RDMigweDM3NGNmZjgwKSwgV1RDMigweDM4MTA3ZTgwKSwgV1RDMigweDM4ZDJiNDQwKSwgV1RDMigweDM5OTM4ZWMwKSwgV1RDMigweDNhNTJmYzQwKSwgV1RDMigweDNiMTBlYjAwKSwgCi0gIFdUQzIoMHgzYmNkNDkwMCksIFdUQzIoMHgzYzg4MDQ4MCksIFdUQzIoMHgzZDQxMGJjMCksIFdUQzIoMHgzZGY4NGQwMCksIFdUQzIoMHgzZWFkYjYwMCksIFdUQzIoMHgzZjYxMzU0MCksIFdUQzIoMHg0MDEyYjhmZiksIFdUQzIoMHg0MGMyMmVmZiksIAotICBXVEMyKDB4NDE2Zjg1ZmYpLCBXVEMyKDB4NDIxYWFiN2YpLCBXVEMyKDB4NDJjMzhlN2YpLCBXVEMyKDB4NDM2YTFjN2YpLCBXVEMyKDB4NDQwZTQzN2YpLCBXVEMyKDB4NDRhZmYyN2YpLCBXVEMyKDB4NDU0ZjE2N2YpLCBXVEMyKDB4NDVlYjllZmYpLCAKLSAgV1RDMigweDQ2ODU3OGZmKSwgV1RDMigweDQ3MWM5MzdmKSwgV1RDMigweDQ3YjBkYzdmKSwgV1RDMigweDQ4NDI0MWZmKSwgV1RDMigweDQ4ZDBiMWZmKSwgV1RDMigweDQ5NWMxYTdmKSwgV1RDMigweDQ5ZTQ2YTdmKSwgV1RDMigweDRhNjk4ZjdmKSwgCi0gIFdUQzIoMHg0YWViNzdmZiksIFdUQzIoMHg0YjZhMTFmZiksIFdUQzIoMHg0YmU1NGI3ZiksIFdUQzIoMHg0YzVkMTJmZiksIFdUQzIoMHg0Y2QxNTVmZiksIFdUQzIoMHg0ZDQyMDNmZiksIFdUQzIoMHg0ZGFmMDlmZiksIFdUQzIoMHg0ZTE4NTY3ZiksIAotICBXVEMyKDB4NGU3ZGQ3N2YpLCBXVEMyKDB4NGVkZjdiN2YpLCBXVEMyKDB4NGYzZDMwN2YpLCBXVEMyKDB4NGY5NmU0N2YpLCBXVEMyKDB4NGZlYzg1ZmYpLCBXVEMyKDB4NTAzZTAyZmYpLCBXVEMyKDB4NTA4YjQ5N2YpLCBXVEMyKDB4NTBkNDQ3ZmYpLCAKLSAgV1RDMigweDUxMThlYzdmKSwgV1RDMigweDUxNTkyNGZmKSwgV1RDMigweDUxOTRkZmZmKSwgV1RDMigweDUxY2MwYjdmKSwgV1RDMigweDUxZmU5NWZmKSwgV1RDMigweDUyMmM2Y2ZmKSwgV1RDMigweDUyNTU3ZWZmKSwgV1RDMigweDUyNzliOWZmKSwgCi0gIFdUQzIoMHg1Mjk5MGM3ZiksIFdUQzIoMHg1MmIzNjRmZiksIFdUQzIoMHg1MmM4YjA3ZiksIFdUQzIoMHg1MmQ4ZGRmZiksIFdUQzIoMHg1MmUzZGI3ZiksIFdUQzIoMHg1MmU5OTZmZiksIFdUQzIoMHg1MmU5ZmY3ZiksIFdUQzIoMHg1MmU1MDFmZiksIAotICBXVEMyKDB4NTJkYThjZmYpLCBXVEMyKDB4NTJjYThmN2YpLCBXVEMyKDB4NTJiNGY2N2YpLCBXVEMyKDB4NTI5OWIwN2YpLCBXVEMyKDB4NTI3OGFjN2YpLCBXVEMyKDB4NTI1MWQ3N2YpLCBXVEMyKDB4NTIyNTFmZmYpLCBXVEMyKDB4NTFmMjc0ZmYpLCAKLSAgV1RDMigweDUxYjljMzdmKSwgV1RDMigweDUxN2FmOWZmKSwgV1RDMigweDUxMzYwNzdmKSwgV1RDMigweDUwZWFkOGZmKSwgV1RDMigweDUwOTk1Y2ZmKSwgV1RDMigweDUwNDE4MWZmKSwgV1RDMigweDRmZTMzNWZmKSwgV1RDMigweDRmN2U2NzdmKSwgCi0gIFdUQzIoMHg0ZjEzMDNmZiksIFdUQzIoMHg0ZWEwZjlmZiksIFdUQzIoMHg0ZTI4MzdmZiksIFdUQzIoMHg0ZGE4YWI3ZiksIFdUQzIoMHg0ZDIyNDJmZiksIFdUQzIoMHg0Yzk0ZWNmZiksIFdUQzIoMHg0YzAwOTZmZiksIFdUQzIoMHg0YjY1MmY3ZiksIAotICBXVEMyKDB4NGFjMmE0ZmYpLCBXVEMyKDB4NGExOGU0ZmYpLCBXVEMyKDB4NDk2N2RkZmYpLCBXVEMyKDB4NDhhZjdlN2YpLCBXVEMyKDB4NDdlZmIzZmYpLCBXVEMyKDB4NDcyODZjZmYpLCBXVEMyKDB4NDY1OWFkN2YpLCBXVEMyKDB4NDU4NTZmN2YpLCAKLSAgV1RDMigweDQ0YWZhM2ZmKSwgV1RDMigweDQzZGM1MDdmKSwgV1RDMigweDQzMGY2NTdmKSwgV1RDMigweDQyNGFkNDdmKSwgV1RDMigweDQxOGU5MjdmKSwgV1RDMigweDQwZGE3YmZmKSwgV1RDMigweDQwMmU2ZjdmKSwgV1RDMigweDNmOGEzMTAwKSwgCi0gIFdUQzIoMHgzZWVkNmY0MCksIFdUQzIoMHgzZTU3ZDcwMCksIFdUQzIoMHgzZGM5MTRjMCksIFdUQzIoMHgzZDQwY2M0MCksIFdUQzIoMHgzY2JlOThjMCksIFdUQzIoMHgzYzQyMTU0MCksIFdUQzIoMHgzYmNhZGJjMCksIFdUQzIoMHgzYjU4ODg4MCksIAotICBXVEMyKDB4M2FlYWI3ODApLCBXVEMyKDB4M2E4MTA1NDApLCBXVEMyKDB4M2ExYjBlMDApLCBXVEMyKDB4MzliODZkMDApLCBXVEMyKDB4Mzk1OGJjYzApLCBXVEMyKDB4MzhmYjk3MDApLCBXVEMyKDB4MzhhMDk1YzApLCBXVEMyKDB4Mzg0NzNkODApLCAKLSAgV1RDMigweDM3ZWVmZjQwKSwgV1RDMigweDM3OTc0YjQwKSwgV1RDMigweDM3M2Y5NTAwKSwgV1RDMigweDM2ZTdhZTAwKSwgV1RDMigweDM2OGZjNGMwKSwgV1RDMigweDM2MzgwYjgwKSwgV1RDMigweDM1ZTBiMzAwKSwgV1RDMigweDM1ODljMTQwKSwgCi0gIFdUQzIoMHgzNTMzMTE4MCksIFdUQzIoMHgzNGRjN2M4MCksIFdUQzIoMHgzNDg1ZGM4MCksIFdUQzIoMHgzNDJmMTYwMCksIFdUQzIoMHgzM2Q4MTc4MCksIFdUQzIoMHgzMzgwZDBjMCksIFdUQzIoMHgzMzI5MzEwMCksIFdUQzIoMHgzMmQxMTgwMCksIAotICBXVEMyKDB4MzI3ODU3ODApLCBXVEMyKDB4MzIxZWMwYzApLCBXVEMyKDB4MzFjNDI2ODApLCBXVEMyKDB4MzE2ODg1YzApLCBXVEMyKDB4MzEwYzA1ODApLCBXVEMyKDB4MzBhZWNlYzApLCBXVEMyKDB4MzA1MTA5NDApLCBXVEMyKDB4MmZmMmI4YzApLCAKLSAgV1RDMigweDJmOTNiZjQwKSwgV1RDMigweDJmMzNmYzAwKSwgV1RDMigweDJlZDM1MGMwKSwgV1RDMigweDJlNzFiYTgwKSwgV1RDMigweDJlMGY1MzQwKSwgV1RDMigweDJkYWMzNWMwKSwgV1RDMigweDJkNDg3YzgwKSwgV1RDMigweDJjZTQzMWMwKSwgCi0gIFdUQzIoMHgyYzdmNGZjMCksIFdUQzIoMHgyYzE5ZDA4MCksIFdUQzIoMHgyYmIzYWQ4MCksIFdUQzIoMHgyYjRjZTA4MCksIFdUQzIoMHgyYWU1NjM0MCksIFdUQzIoMHgyYTdkMmY4MCksIFdUQzIoMHgyYTE0M2YwMCksIFdUQzIoMHgyOWFhOGI0MCkgCi19OworICAgIC8qIHBhcnQgMCAqLworICAgIFdUQzAoMHhmYWM1YTc3MCksIFdUQzAoMHhmYWFmYmFiOCksIFdUQzAoMHhmYTk5NmE0MCksIFdUQzAoMHhmYTgyYmJkMCksCisgICAgV1RDMCgweGZhNmJiNTM4KSwgV1RDMCgweGZhNTQ1YzM4KSwgV1RDMCgweGZhM2NiNjk4KSwgV1RDMCgweGZhMjRjYTI4KSwKKyAgICBXVEMwKDB4ZmEwYzljYTgpLCBXVEMwKDB4ZjlmNDMzZTgpLCBXVEMwKDB4ZjlkYjk1ODApLCBXVEMwKDB4ZjljMmMyOTgpLAorICAgIFdUQzAoMHhmOWE5YjgwMCksIFdUQzAoMHhmOTkwNzI1MCksIFdUQzAoMHhmOTc2ZWUzOCksIFdUQzAoMHhmOTVkMmI4OCksCisgICAgV1RDMCgweGY5NDMyZDEwKSwgV1RDMCgweGY5MjhmNWMwKSwgV1RDMCgweGY5MGU4ODY4KSwgV1RDMCgweGY4ZjNlNDAwKSwKKyAgICBXVEMwKDB4ZjhkOTAzYTApLCBXVEMwKDB4ZjhiZGUyMzgpLCBXVEMwKDB4ZjhhMjdhZjApLCBXVEMwKDB4Zjg4NmNkZTgpLAorICAgIFdUQzAoMHhmODZhZTAyMCksIFdUQzAoMHhmODRlYjZjMCksIFdUQzAoMHhmODMyNTZmOCksIFdUQzAoMHhmODE1YzRiOCksCisgICAgV1RDMCgweGY3ZjkwMmMwKSwgV1RDMCgweGY3ZGMxM2IwKSwgV1RDMCgweGY3YmVmYTYwKSwgV1RDMCgweGY3YTFiYTQwKSwKKyAgICBXVEMwKDB4Zjc4NDU3YzApLCBXVEMwKDB4Zjc2NmQ3ODApLCBXVEMwKDB4Zjc0OTNkOTApLCBXVEMwKDB4ZjcyYjg5OTApLAorICAgIFdUQzAoMHhmNzBkYjVmMCksIFdUQzAoMHhmNmVmYmQzMCksIFdUQzAoMHhmNmQxOWEyMCksIFdUQzAoMHhmNmIzNTJlMCksCisgICAgV1RDMCgweGY2OTRmOGMwKSwgV1RDMCgweGY2NzY5ZGEwKSwgV1RDMCgweGY2NTg1MzEwKSwgV1RDMCgweGY2M2EyOGQwKSwKKyAgICBXVEMwKDB4ZjYxYzJjNjApLCBXVEMwKDB4ZjVmZTZiMTApLCBXVEMwKDB4ZjVlMGYyNTApLCBXVEMwKDB4ZjVjM2NlYjApLAorICAgIFdUQzAoMHhmNWE3MGJlMCksIFdUQzAoMHhmNThhYjVhMCksIFdUQzAoMHhmNTZlZDdiMCksIFdUQzAoMHhmNTUzN2U0MCksCisgICAgV1RDMCgweGY1MzhiNjEwKSwgV1RDMCgweGY1MWU4YmYwKSwgV1RDMCgweGY1MDUwYzkwKSwgV1RDMCgweGY0ZWM0MzMwKSwKKyAgICBXVEMwKDB4ZjRkNDM5YjApLCBXVEMwKDB4ZjRiY2Y5YjApLCBXVEMwKDB4ZjRhNjhjZTApLCBXVEMwKDB4ZjQ5MGZhODApLAorICAgIFdUQzAoMHhmNDdjNDc2MCksIFdUQzAoMHhmNDY4NzgzMCksIFdUQzAoMHhmNDU1OGYwMCksIFdUQzAoMHhmNDQzNGZjMCksCisgICAgV1RDMCgweGY0MzE0MDcwKSwgV1RDMCgweGY0MWVlNDUwKSwgV1RDMCgweGY0MGJjMTMwKSwgV1RDMCgweGYzZjc5OWMwKSwKKyAgICBXVEMwKDB4ZjNlMjZkMzApLCBXVEMwKDB4ZjNjYzNkNzApLCBXVEMwKDB4ZjNiNTBjODApLCBXVEMwKDB4ZjM5Y2RkNjApLAorICAgIFdUQzAoMHhmMzgzYjQ0MCksIFdUQzAoMHhmMzY5OTU1MCksIFdUQzAoMHhmMzRlODRjMCksIFdUQzAoMHhmMzMyODZiMCksCisgICAgV1RDMCgweGYzMTU5ZjEwKSwgV1RDMCgweGYyZjdkMWIwKSwgV1RDMCgweGYyZDkyMjkwKSwgV1RDMCgweGYyYjk5NGQwKSwKKyAgICBXVEMwKDB4ZjI5OTJhZDApLCBXVEMwKDB4ZjI3N2U2ZDApLCBXVEMwKDB4ZjI1NWNiNjApLCBXVEMwKDB4ZjIzMmRkMDApLAorICAgIFdUQzAoMHhmMjBmMjI0MCksIFdUQzAoMHhmMWVhYTFkMCksIFdUQzAoMHhmMWM1NjI0MCksIFdUQzAoMHhmMTlmNjNkMCksCisgICAgV1RDMCgweGYxNzhhMGYwKSwgV1RDMCgweGYxNTExM2EwKSwgV1RDMCgweGYxMjhiNWMwKSwgV1RDMCgweGYwZmY3ZmQwKSwKKyAgICBXVEMwKDB4ZjBkNTY4NjApLCBXVEMwKDB4ZjBhYTY2MTApLCBXVEMwKDB4ZjA3ZTZmZDApLCBXVEMwKDB4ZjA1MTgxOTApLAorICAgIFdUQzAoMHhmMDIzOWNkMCksIFdUQzAoMHhlZmY0YzMyMCksIFdUQzAoMHhlZmM0ZjcyMCksIFdUQzAoMHhlZjk0NTA4MCksCisgICAgV1RDMCgweGVmNjJmY2UwKSwgV1RDMCgweGVmMzEyYTQwKSwgV1RDMCgweGVlZmYwNWMwKSwgV1RDMCgweGVlY2NhMmMwKSwKKyAgICBXVEMwKDB4ZWU5OWZhYTApLCBXVEMwKDB4ZWU2NzA1YTApLCBXVEMwKDB4ZWUzM2JiNjApLCBXVEMwKDB4ZWUwMDAwNjApLAorICAgIFdUQzAoMHhlZGNiYTY2MCksIFdUQzAoMHhlZDk2N2U4MCksIFdUQzAoMHhlZDYwNWI4MCksIFdUQzAoMHhlZDI5M2I0MCksCisgICAgV1RDMCgweGVjZjE0NmEwKSwgV1RDMCgweGVjYjhhOGEwKSwgV1RDMCgweGVjN2Y4YmMwKSwgV1RDMCgweGVjNDYxMjYwKSwKKyAgICBXVEMwKDB4ZWMwYzU3MjApLCBXVEMwKDB4ZWJkMjc0NDApLCBXVEMwKDB4ZWI5ODgyMjApLCBXVEMwKDB4ZWI1ZTcwNDApLAorICAgIFdUQzAoMHhlYjI0MDRjMCksIFdUQzAoMHhlYWU5MDQ0MCksIFdUQzAoMHhlYWFkMzNjMCksIFdUQzAoMHhlYTcwNjZjMCksCisgICAgV1RDMCgweGVhMzI3ZjYwKSwgV1RDMCgweGU5ZjM2MDAwKSwgV1RDMCgweGU5YjJlZDYwKSwgV1RDMCgweGU5NzEzOTIwKSwKKyAgICBXVEMwKDB4ZTkyZTgxZTApLCBXVEMwKDB4ZThlYjA4YzApLCBXVEMwKDB4ZThhNzBlNjApLCBXVEMwKDB4ZTg2MmQ4ZTApLAorICAgIFdUQzAoMHhlODFlYjM0MCksIFdUQzAoMHhlN2RhZThhMCksIFdUQzAoMHhlNzk3YzFhMCksIFdUQzAoMHhlNzU1NGNhMCksCisgICAgV1RDMCgweGU3MTM1ZGMwKSwgV1RDMCgweGU2ZDFjNmEwKSwgV1RDMCgweGU2OTA1NzIwKSwgV1RDMCgweGU2NGViOWMwKSwKKyAgICBXVEMwKDB4ZTYwYzczMDApLCBXVEMwKDB4ZTVjOTA2MDApLCBXVEMwKDB4ZTU4M2Y5MjApLCBXVEMwKDB4ZTUzZDFjZTApLAorICAgIFdUQzAoMHhlNGY0OGM4MCksIFdUQzAoMHhlNGFhNjY0MCksIFdUQzAoMHhlNDVlY2FhMCksIFdUQzAoMHhlNDEyMGJlMCksCisgICAgV1RDMCgweGUzYzRhZTYwKSwgV1RDMCgweGUzNzczODYwKSwgV1RDMCgweGUzMmEyZWEwKSwgV1RDMCgweGUyZGRlZWEwKSwKKyAgICBXVEMwKDB4ZTI5MmFmMDApLCBXVEMwKDB4ZTI0OGE0YTApLCBXVEMwKDB4ZTIwMDAxNDApLCBXVEMwKDB4ZTFiOGI2NDApLAorICAgIFdUQzAoMHhlMTcyNzQ0MCksIFdUQzAoMHhlMTJjZTkwMCksIFdUQzAoMHhlMGU3YzI4MCksIFdUQzAoMHhlMGEyYjQyMCksCisgICAgV1RDMCgweGUwNWQ3NmMwKSwgV1RDMCgweGUwMTdjMzYwKSwgV1RDMCgweGRmZDE1NDQwKSwgV1RDMCgweGRmOGEwNTQwKSwKKyAgICBXVEMwKDB4ZGY0MWQzMDApLCBXVEMwKDB4ZGVmOGJiNDApLCBXVEMwKDB4ZGVhZWJkNDApLCBXVEMwKDB4ZGU2M2U3YzApLAorICAgIFdUQzAoMHhkZTE4NTk0MCksIFdUQzAoMHhkZGNjMzE4MCksIFdUQzAoMHhkZDdmOTAwMCksIFdUQzAoMHhkZDMyOWU4MCksCisgICAgV1RDMCgweGRjZTU4ZTgwKSwgV1RDMCgweGRjOTg5MzAwKSwgV1RDMCgweGRjNGJkZTQwKSwgV1RDMCgweGRiZmY5NmMwKSwKKyAgICBXVEMwKDB4ZGJiM2Q3ODApLCBXVEMwKDB4ZGI2OGJiODApLCBXVEMwKDB4ZGIxZTVjODApLCBXVEMwKDB4ZGFkNGMzODApLAorICAgIFdUQzAoMHhkYThiZTg0MCksIFdUQzAoMHhkYTQzYzFjMCksIFdUQzAoMHhkOWZjNDc0MCksIFdUQzAoMHhkOWI1NjY0MCksCisgICAgV1RDMCgweGQ5NmYwNDQwKSwgV1RDMCgweGQ5MjkwNjAwKSwgV1RDMCgweGQ4ZTM1MDgwKSwgV1RDMCgweGQ4OWRjZDQwKSwKKyAgICBXVEMwKDB4ZDg1ODZiNDApLCBXVEMwKDB4ZDgxMzE5NDApLCBXVEMwKDB4ZDdjZGM2NDApLCBXVEMwKDB4ZDc4ODYxODApLAorICAgIFdUQzAoMHhkNzQyZGM4MCksIFdUQzAoMHhkNmZkMjc4MCksIFdUQzAoMHhkNmI3MzQwMCksIFdUQzAoMHhkNjcwZmQ4MCksCisgICAgV1RDMCgweGQ2MmE4YTQwKSwgV1RDMCgweGQ1ZTNlMDgwKSwgV1RDMCgweGQ1OWQwODQwKSwgV1RDMCgweGQ1NTYyYjgwKSwKKyAgICBXVEMwKDB4ZDUwZjk1NDApLCBXVEMwKDB4ZDRjOTkyYzApLCBXVEMwKDB4ZDQ4NDZmODApLCBXVEMwKDB4ZDQ0MDVhODApLAorICAgIFdUQzAoMHhkM2ZkNjU4MCksIFdUQzAoMHhkM2JiYTE0MCksIFdUQzAoMHhkMzdiMWM4MCksIFdUQzAoMHhkMzNiYjc4MCksCisgICAgV1RDMCgweGQyZmQyNDAwKSwgV1RDMCgweGQyYmYxMjQwKSwgV1RDMCgweGQyODEzMzAwKSwgV1RDMCgweGQyNDM1YWMwKSwKKyAgICBXVEMwKDB4ZDIwNTdmYzApLCBXVEMwKDB4ZDFjNzlhMDApLCBXVEMwKDB4ZDE4OWEyNDApLCBXVEMwKDB4ZDE0YjlkYzApLAorICAgIFdUQzAoMHhkMTBkOWUwMCksIFdUQzAoMHhkMGNmYjU4MCksIFdUQzAoMHhkMDkxZjZjMCksIFdUQzAoMHhkMDU0ODEwMCksCisgICAgV1RDMCgweGQwMTc3ZjQwKSwgV1RDMCgweGNmZGIxY2MwKSwgV1RDMCgweGNmOWY4NGMwKSwgV1RDMCgweGNmNjRkNzgwKSwKKyAgICBXVEMwKDB4Y2YyYjJiMDApLCBXVEMwKDB4Y2VmMjk0NDApLCBXVEMwKDB4Y2ViYjI2NDApLCBXVEMwKDB4Y2U4NGMwMDApLAorICAgIFdUQzAoMHhjZTRmMGJjMCksIFdUQzAoMHhjZTE5YjIwMCksIFdUQzAoMHhjZGU0NWQ0MCksIFdUQzAoMHhjZGFlZWRjMCksCisgICAgV1RDMCgweGNkNzk3OWMwKSwgV1RDMCgweGNkNDQxOWMwKSwgV1RDMCgweGNkMGVlNmMwKSwgV1RDMCgweGNjZGEwNTQwKSwKKyAgICBXVEMwKDB4Y2NhNWE1MDApLCBXVEMwKDB4Y2M3MWY2NDApLCBXVEMwKDB4Y2MzZjI4MDApLCBXVEMwKDB4Y2MwZDQzMDApLAorICAgIFdUQzAoMHhjYmRjMmEwMCksIFdUQzAoMHhjYmFiYmU4MCksIFdUQzAoMHhjYjdiZTIwMCksIFdUQzAoMHhjYjRjODIwMCksCisgICAgV1RDMCgweGNiMWQ5ODAwKSwgV1RDMCgweGNhZWYxZDQwKSwgV1RDMCgweGNhYzEwYmMwKSwgV1RDMCgweGNhOTM2NDQwKSwKKyAgICBXVEMwKDB4Y2E2NjJkMDApLCBXVEMwKDB4Y2EzOTZkNDApLCBXVEMwKDB4Y2EwZDJiODApLCBXVEMwKDB4YzllMTZmODApLAorICAgIFdUQzAoMHhjOWI2M2Y4MCksIFdUQzAoMHhjOThiYTJjMCksIFdUQzAoMHhjOTYxYTAwMCksIFdUQzAoMHhjOTM4M2VjMCksCisgICAgV1RDMCgweGM5MGEwNDQwKSwgV1RDMCgweGM4ZTBkMjgwKSwgV1RDMCgweGM4YjczYjgwKSwgV1RDMCgweGM4OGQ0OTAwKSwKKyAgICBXVEMwKDB4Yzg2MzA0YzApLCBXVEMwKDB4YzgzODc4YzApLCBXVEMwKDB4YzgwZGFlODApLCBXVEMwKDB4YzdlMmFmYzApLAorICAgIFdUQzAoMHhjN2I3ODY0MCksIFdUQzAoMHhjNzhjM2M0MCksIFdUQzAoMHhjNzYwZGE4MCksIFdUQzAoMHhjNzM1NjY0MCksCisgICAgV1RDMCgweGM3MDlkZTQwKSwgV1RDMCgweGM2ZGU0MWMwKSwgV1RDMCgweGM2YjI4ZmMwKSwgV1RDMCgweGM2ODZiZDQwKSwKKyAgICBXVEMwKDB4YzY1YWI2MDApLCBXVEMwKDB4YzYyZTY1ODApLCBXVEMwKDB4YzYwMWI4ODApLCBXVEMwKDB4YzVkNGJhYzApLAorICAgIFdUQzAoMHhjNWE3OTY0MCksIFdUQzAoMHhjNTdhNzZjMCksIFdUQzAoMHhjNTRkODc4MCksIFdUQzAoMHhjNTIwZTg0MCksCisgICAgV1RDMCgweGM0ZjRhY2MwKSwgV1RDMCgweGM0YzhlODgwKSwgV1RDMCgweGM0OWRhZDgwKSwgV1RDMCgweGM0NzJlNjQwKSwKKyAgICBXVEMwKDB4YzQ0ODU2YzApLCBXVEMwKDB4YzQxZGMxNDApLCBXVEMwKDB4YzNmMmU5NDApLCBXVEMwKDB4YzNjN2JjMDApLAorICAgIFdUQzAoMHhjMzljNGYwMCksIFdUQzAoMHhjMzcwYjljMCksIFdUQzAoMHhjMzQ1MTNjMCksIFdUQzAoMHhjMzE5Nzk0MCksCisgICAgV1RDMCgweGMyZWUwYTAwKSwgV1RDMCgweGMyYzJlNjQwKSwgV1RDMCgweGMyOTgyZDgwKSwgV1RDMCgweGMyNmRmNWMwKSwKKyAgICBXVEMwKDB4YzI0NDRiMDApLCBXVEMwKDB4YzIxYjM5NDApLCBXVEMwKDB4YzFmMmNiYzApLCBXVEMwKDB4YzFjYjA1YzApLAorICAgIFdUQzAoMHhjMWEzZTM0MCksIFdUQzAoMHhjMTdkNWYwMCksIFdUQzAoMHhjMTU3NzNjMCksIFdUQzAoMHhjMTMyMDk0MCksCisgICAgV1RDMCgweGMxMGNmNDgwKSwgV1RDMCgweGMwZTgwYTAwKSwgV1RDMCgweGMwYzMxZjAwKSwgV1RDMCgweGMwOWUyNjQwKSwKKyAgICBXVEMwKDB4YzA3OTJlYzApLCBXVEMwKDB4YzA1NDQ5NDApLCBXVEMwKDB4YzAyZjg2YzApLCBXVEMwKDB4YzAwYjA0YzApLAorICAgIFdUQzAoMHhiZmU2ZWQwMSksIFdUQzAoMHhiZmMzNmEwMSksIFdUQzAoMHhiZmEwYTU4MSksIFdUQzAoMHhiZjdlYjU4MSksCisgICAgV1RDMCgweGJmNWQ5YTgxKSwgV1RDMCgweGJmM2Q1NTAxKSwgV1RDMCgweGJmMWRlNjAxKSwgV1RDMCgweGJlZmY0ODAxKSwKKyAgICBXVEMwKDB4YmVlMTcyMDEpLCBXVEMwKDB4YmVjNDU4ODEpLCBXVEMwKDB4YmVhN2YzMDEpLCBXVEMwKDB4YmU4YzM3ODEpLAorICAgIFdUQzAoMHhiZTcxMjAwMSksIFdUQzAoMHhiZTU2YTM4MSksIFdUQzAoMHhiZTNjYmMwMSksIFdUQzAoMHhiZTIzNjAwMSksCisgICAgV1RDMCgweGJlMGE4NTgxKSwgV1RDMCgweGJkZjIyMTgxKSwgV1RDMCgweGJkZGEyYTAxKSwgV1RDMCgweGJkYzI5YTgxKSwKKyAgICBXVEMwKDB4YmRhYjcxODEpLCBXVEMwKDB4YmQ5NGIwMDEpLCBXVEMwKDB4YmQ3ZTU1ODEpLCBXVEMwKDB4YmQ2ODY2ODEpLAorICAgIFdUQzAoMHhiZDUyZWIwMSksIFdUQzAoMHhiZDNkZWI4MSksIFdUQzAoMHhiZDI5NzE4MSksIFdUQzAoMHhiZDE1ODgwMSksCisgICAgV1RDMCgweGJkMDIzZjAxKSwgV1RDMCgweGJjZWZhNjAxKSwgV1RDMCgweGJjZGRjYzgxKSwgV1RDMCgweGJjY2NiZDAxKSwKKyAgICBXVEMwKDB4YmNiYzdlMDEpLCBXVEMwKDB4YmNhZDE1MDEpLCBXVEMwKDB4YmM5ZTg4MDEpLCBXVEMwKDB4YmM5MGQ0ODEpLAorICAgIFdUQzAoMHhiYzgzZjIwMSksIFdUQzAoMHhiYzc3ZDYwMSksIFdUQzAoMHhiYzZjNzc4MSksIFdUQzAoMHhiYzYxYzQwMSksCisgICAgV1RDMCgweGJjNTdhMzAxKSwgV1RDMCgweGJjNGRmYjgxKSwgV1RDMCgweGJjNDRiNDgxKSwgV1RDMCgweGJjM2JiYzAxKSwKKyAgICBXVEMwKDB4YmMzMzA3ODEpLCBXVEMwKDB4YmMyYThjODEpLCBXVEMwKDB4YmMyMjQxODEpLCBXVEMwKDB4YmMxYTI0MDEpLAorICAgIFdUQzAoMHhiYzEyM2I4MSksIFdUQzAoMHhiYzBhOGYwMSksIFdUQzAoMHhiYzAzMjYwMSksIFdUQzAoMHhiYmZjMGY4MSksCisgICAgV1RDMCgweGJiZjU2MTgxKSwgV1RDMCgweGJiZWYzMzAxKSwgV1RDMCgweGJiZTk5OTgxKSwgV1RDMCgweGJiZTQ5ZDAxKSwKKyAgICBXVEMwKDB4YmJlMDM4MDEpLCBXVEMwKDB4YmJkYzY0ODEpLCBXVEMwKDB4YmJkOTFiODEpLCBXVEMwKDB4YmJkNjRkMDEpLAorICAgIFdUQzAoMHhiYmQzZTEwMSksIFdUQzAoMHhiYmQxYmQ4MSksIFdUQzAoMHhiYmNmY2E4MSksIFdUQzAoMHhiYmNlMDYwMSksCisgICAgV1RDMCgweGJiY2M4MjAxKSwgV1RDMCgweGJiY2I1MzAxKSwgV1RDMCgweGJiY2E4ZDAxKSwgV1RDMCgweGJiY2E1MDgxKSwKKyAgICBXVEMwKDB4YmJjYWNhMDEpLCBXVEMwKDB4YmJjYzI2ODEpLCBXVEMwKDB4YmJjZTkxODEpLCBXVEMwKDB4YmJkMjEyODEpLAorICAgIFdUQzAoMHhiYmQ2OGM4MSksIFdUQzAoMHhiYmRiZTIwMSksIFdUQzAoMHhiYmUxZjQwMSksIFdUQzAoMHhiYmU4OTkwMSksCisgICAgV1RDMCgweGJiZWY5YjgxKSwgV1RDMCgweGJiZjZjNjAxKSwgV1RDMCgweGJiZmRlNDgxKSwgV1RDMCgweGJjMDRlMzgxKSwKKyAgICBXVEMwKDB4YmMwYmNmODEpLCBXVEMwKDB4YmMxMmI4MDEpLCBXVEMwKDB4YmMxOWFiMDEpLCBXVEMwKDB4YmMyMGFlMDEpLAorICAgIFdUQzAoMHhiYzI3YmQ4MSksIFdUQzAoMHhiYzJlZDY4MSksIFdUQzAoMHhiYzM1ZjUwMSksIFdUQzAoMHhiYzNkMTgwMSksCisgICAgV1RDMCgweGJjNDQ0MDgxKSwgV1RDMCgweGJjNGI2ZTgxKSwgV1RDMCgweGJjNTJhMzgxKSwgV1RDMCgweGJjNTlkZjgxKSwKKyAgICBXVEMwKDB4YmM2MTIzMDEpLCBXVEMwKDB4YmM2ODZlMDEpLCBXVEMwKDB4YmM2ZmMxMDEpLCBXVEMwKDB4YmM3NzFjMDEpLAorICAgIFdUQzAoMHhiYzdlN2UwMSksIFdUQzAoMHhiYzg1ZTgwMSksIFdUQzAoMHhiYzhkNTkwMSksIFdUQzAoMHhiYzk0ZDIwMSksCisgICAgV1RDMCgweGJjOWM1MjgxKSwgV1RDMCgweGJjYTNkYjAxKSwgV1RDMCgweGJjYWI2YzAxKSwgV1RDMCgweGJjYjMwNjAxKSwKKyAgICBXVEMwKDB4YmNiYWE4MDEpLCBXVEMwKDB4YmNjMjUxODEpLCBXVEMwKDB4YmNjYTAzMDEpLCBXVEMwKDB4YmNkMWJiODEpLAorICAgIFdUQzAoMHhiY2Q5N2M4MSksIFdUQzAoMHhiY2UxNDYwMSksIFdUQzAoMHhiY2U5MTgwMSksIFdUQzAoMHhiY2YwZjM4MSksCisgICAgV1RDMCgweGJjZjhkNzgxKSwgV1RDMCgweGJkMDBjMzgxKSwgV1RDMCgweGJkMDhiNzgxKSwgV1RDMCgweGJkMTBiMzgxKSwKKyAgICBXVEMwKDB4YmQxOGI3ODEpLCBXVEMwKDB4YmQyMGM0MDEpLCBXVEMwKDB4YmQyOGQ5ODEpLCBXVEMwKDB4YmQzMGY4ODEpLAorICAgIFdUQzAoMHhiZDM5MWY4MSksIFdUQzAoMHhiZDQxNGYwMSksIFdUQzAoMHhiZDQ5ODYwMSksIFdUQzAoMHhiZDUxYzQ4MSksCisgICAgV1RDMCgweGJkNWEwYjAxKSwgV1RDMCgweGJkNjI1OTgxKSwgV1RDMCgweGJkNmFiMTAxKSwgV1RDMCgweGJkNzMxMDgxKSwKKyAgICBXVEMwKDB4YmQ3Yjc3ODEpLCBXVEMwKDB4YmQ4M2U2ODEpLCBXVEMwKDB4YmQ4YzVjMDEpLCBXVEMwKDB4YmQ5NGQ4MDEpLAorICAgIFdUQzAoMHhiZDlkNWI4MSksIFdUQzAoMHhiZGE1ZTYwMSksIFdUQzAoMHhiZGFlNzg4MSksIFdUQzAoMHhiZGI3MTIwMSksCisgICAgV1RDMCgweGJkYmZiMjgxKSwgV1RDMCgweGJkYzg1OTgxKSwgV1RDMCgweGJkZDEwNjgxKSwgV1RDMCgweGJkZDliOTgxKSwKKyAgICBXVEMwKDB4YmRlMjcyMDEpLCBXVEMwKDB4YmRlYjMxMDEpLCBXVEMwKDB4YmRmM2Y3MDEpLCBXVEMwKDB4YmRmY2MzMDEpLAorICAgIFdUQzAoMHhiZTA1OTQ4MSksIFdUQzAoMHhiZTBlNmMwMSksIFdUQzAoMHhiZTE3NDc4MSksIFdUQzAoMHhiZTIwMjgwMSksCisgICAgV1RDMCgweGJlMjkwZDAxKSwgV1RDMCgweGJlMzFmNzAxKSwgV1RDMCgweGJlM2FlNjAxKSwgV1RDMCgweGJlNDNkYTgxKSwKKyAgICBXVEMwKDB4YmU0Y2QzODEpLCBXVEMwKDB4YmU1NWQwMDEpLCBXVEMwKDB4YmU1ZWQwODEpLCBXVEMwKDB4YmU2N2QzODEpLAorICAgIFdUQzAoMHhiZTcwZGEwMSksIFdUQzAoMHhiZTc5ZTQ4MSksIFdUQzAoMHhiZTgyZjMwMSksIFdUQzAoMHhiZThjMDUwMSksCisgICAgV1RDMCgweGJlOTUxYTgxKSwgV1RDMCgweGJlOWUzMjgxKSwgV1RDMCgweGJlYTc0YzgxKSwgV1RDMCgweGJlYjA2ODgxKSwKKyAgICBXVEMwKDB4YmViOTg2ODEpLCBXVEMwKDB4YmVjMmE3ODEpLCBXVEMwKDB4YmVjYmNhODEpLCBXVEMwKDB4YmVkNGYwODEpLAorICAgIFdUQzAoMHhiZWRlMTkwMSksIFdUQzAoMHhiZWU3NDI4MSksIFdUQzAoMHhiZWYwNmQwMSksIFdUQzAoMHhiZWY5OTkwMSksCisgICAgV1RDMCgweGJmMDJjNTgxKSwgV1RDMCgweGJmMGJmMzgxKSwgV1RDMCgweGJmMTUyMzgxKSwgV1RDMCgweGJmMWU1NTAxKSwKKyAgICBXVEMwKDB4YmYyNzg4MDEpLCBXVEMwKDB4YmYzMGJiMDEpLCBXVEMwKDB4YmYzOWVlODEpLCBXVEMwKDB4YmY0MzIyODEpLAorICAgIFdUQzAoMHhiZjRjNTY4MSksIFdUQzAoMHhiZjU1OGIwMSksIFdUQzAoMHhiZjVlYzEwMSksIFdUQzAoMHhiZjY3ZjgwMSksCisgICAgV1RDMCgweGJmNzEyZjAxKSwgV1RDMCgweGJmN2E2NjgxKSwgV1RDMCgweGJmODM5ZDgxKSwgV1RDMCgweGJmOGNkNDgxKSwKKyAgICBXVEMwKDB4YmY5NjBiMDEpLCBXVEMwKDB4YmY5ZjQxODEpLCBXVEMwKDB4YmZhODc5MDEpLCBXVEMwKDB4YmZiMWIxMDEpLAorICAgIFdUQzAoMHhiZmJhZTk4MSksIFdUQzAoMHhiZmM0MjIwMSksIFdUQzAoMHhiZmNkNWEwMSksIFdUQzAoMHhiZmQ2OTEwMSksCisgICAgV1RDMCgweGJmZGZjNzgxKSwgV1RDMCgweGJmZThmYzAxKSwgV1RDMCgweGJmZjIyZjgxKSwgV1RDMCgweGJmZmI2MDgxKSwKKyAgICAvKiBwYXJ0IDEgKi8KKyAgICBXVEMxKDB4ODAwOTNlMDEpLCBXVEMxKDB4ODAxYjliMDEpLCBXVEMxKDB4ODAyZGY3MDEpLCBXVEMxKDB4ODA0MDUxMDEpLAorICAgIFdUQzEoMHg4MDUyYTg4MSksIFdUQzEoMHg4MDY0ZmM4MSksIFdUQzEoMHg4MDc3NGM4MSksIFdUQzEoMHg4MDg5OTg4MSksCisgICAgV1RDMSgweDgwOWJkZjAxKSwgV1RDMSgweDgwYWUxZjgxKSwgV1RDMSgweDgwYzA1YTAxKSwgV1RDMSgweDgwZDI4ZDgxKSwKKyAgICBXVEMxKDB4ODBlNGJiODEpLCBXVEMxKDB4ODBmNmU0ODEpLCBXVEMxKDB4ODEwOTA5ODEpLCBXVEMxKDB4ODExYjI5ODEpLAorICAgIFdUQzEoMHg4MTJkNDQ4MSksIFdUQzEoMHg4MTNmNTk4MSksIFdUQzEoMHg4MTUxNjcwMSksIFdUQzEoMHg4MTYzNmQ4MSksCisgICAgV1RDMSgweDgxNzU2ZDgxKSwgV1RDMSgweDgxODc2NzgxKSwgV1RDMSgweDgxOTk1YzAxKSwgV1RDMSgweDgxYWI0YjAxKSwKKyAgICBXVEMxKDB4ODFiZDM0MDEpLCBXVEMxKDB4ODFjZjE1ODEpLCBXVEMxKDB4ODFlMGVlODEpLCBXVEMxKDB4ODFmMmJmODEpLAorICAgIFdUQzEoMHg4MjA0ODg4MSksIFdUQzEoMHg4MjE2NGE4MSksIFdUQzEoMHg4MjI4MDU4MSksIFdUQzEoMHg4MjM5Yjk4MSksCisgICAgV1RDMSgweDgyNGI2NjAxKSwgV1RDMSgweDgyNWQwOTAxKSwgV1RDMSgweDgyNmVhMjAxKSwgV1RDMSgweDgyODAzMTAxKSwKKyAgICBXVEMxKDB4ODI5MWI2MDEpLCBXVEMxKDB4ODJhMzMyODEpLCBXVEMxKDB4ODJiNGE2MDEpLCBXVEMxKDB4ODJjNjExMDEpLAorICAgIFdUQzEoMHg4MmQ3NzIwMSksIFdUQzEoMHg4MmU4YzgwMSksIFdUQzEoMHg4MmZhMTE4MSksIFdUQzEoMHg4MzBiNGY4MSksCisgICAgV1RDMSgweDgzMWM4MTAxKSwgV1RDMSgweDgzMmRhNzgxKSwgV1RDMSgweDgzM2VjMzgxKSwgV1RDMSgweDgzNGZkNDgxKSwKKyAgICBXVEMxKDB4ODM2MGQ5MDEpLCBXVEMxKDB4ODM3MWQwODEpLCBXVEMxKDB4ODM4MmJhMDEpLCBXVEMxKDB4ODM5Mzk1MDEpLAorICAgIFdUQzEoMHg4M2E0NjE4MSksIFdUQzEoMHg4M2I1MjEwMSksIFdUQzEoMHg4M2M1ZDM4MSksIFdUQzEoMHg4M2Q2Nzg4MSksCisgICAgV1RDMSgweDgzZTcwZjAxKSwgV1RDMSgweDgzZjc5NjgxKSwgV1RDMSgweDg0MDgwZDgxKSwgV1RDMSgweDg0MTg3NDAxKSwKKyAgICBXVEMxKDB4ODQyOGNhMDEpLCBXVEMxKDB4ODQzOTEwODEpLCBXVEMxKDB4ODQ0OTQ4ODEpLCBXVEMxKDB4ODQ1OTcwODEpLAorICAgIFdUQzEoMHg4NDY5ODg4MSksIFdUQzEoMHg4NDc5OGY4MSksIFdUQzEoMHg4NDg5ODQ4MSksIFdUQzEoMHg4NDk5NjcwMSksCisgICAgV1RDMSgweDg0YTkzODAxKSwgV1RDMSgweDg0YjhmODAxKSwgV1RDMSgweDg0YzhhNzAxKSwgV1RDMSgweDg0ZDg0NjAxKSwKKyAgICBXVEMxKDB4ODRlN2QzODEpLCBXVEMxKDB4ODRmNzRlMDEpLCBXVEMxKDB4ODUwNmI1ODEpLCBXVEMxKDB4ODUxNjA5ODEpLAorICAgIFdUQzEoMHg4NTI1NGE4MSksIFdUQzEoMHg4NTM0NzkwMSksIFdUQzEoMHg4NTQzOTYwMSksIFdUQzEoMHg4NTUyYTE4MSksCisgICAgV1RDMSgweDg1NjE5YTAxKSwgV1RDMSgweDg1NzA3ZjgxKSwgV1RDMSgweDg1N2Y1MTAxKSwgV1RDMSgweDg1OGUwZTAxKSwKKyAgICBXVEMxKDB4ODU5Y2I3ODEpLCBXVEMxKDB4ODVhYjRmMDEpLCBXVEMxKDB4ODViOWQ0ODEpLCBXVEMxKDB4ODVjODQ4MDEpLAorICAgIFdUQzEoMHg4NWQ2YTk4MSksIFdUQzEoMHg4NWU0ZjgwMSksIFdUQzEoMHg4NWYzMzI4MSksIFdUQzEoMHg4NjAxNTk4MSksCisgICAgV1RDMSgweDg2MGY2ZTAxKSwgV1RDMSgweDg2MWQ3MDgxKSwgV1RDMSgweDg2MmI2MjAxKSwgV1RDMSgweDg2Mzk0MzAxKSwKKyAgICBXVEMxKDB4ODY0NzEyODEpLCBXVEMxKDB4ODY1NGQwMDEpLCBXVEMxKDB4ODY2MjdiMDEpLCBXVEMxKDB4ODY3MDEzODEpLAorICAgIFdUQzEoMHg4NjdkOWE4MSksIFdUQzEoMHg4NjhiMTAwMSksIFdUQzEoMHg4Njk4NzU4MSksIFdUQzEoMHg4NmE1Y2E4MSksCisgICAgV1RDMSgweDg2YjMwZjAxKSwgV1RDMSgweDg2YzA0MzgxKSwgV1RDMSgweDg2Y2Q2NjgxKSwgV1RDMSgweDg2ZGE3OTAxKSwKKyAgICBXVEMxKDB4ODZlNzdiODEpLCBXVEMxKDB4ODZmNDZkODEpLCBXVEMxKDB4ODcwMTRmODEpLCBXVEMxKDB4ODcwZTIzMDEpLAorICAgIFdUQzEoMHg4NzFhZTk4MSksIFdUQzEoMHg4NzI3YTM4MSksIFdUQzEoMHg4NzM0NTM4MSksIFdUQzEoMHg4NzQwZjY4MSksCisgICAgV1RDMSgweDg3NGQ4NjgxKSwgV1RDMSgweDg3NTlmZDAxKSwgV1RDMSgweDg3NjY1NDgxKSwgV1RDMSgweDg3NzI5NzAxKSwKKyAgICBXVEMxKDB4ODc3ZWRlMDEpLCBXVEMxKDB4ODc4YjQzMDEpLCBXVEMxKDB4ODc5N2RkODEpLCBXVEMxKDB4ODdhNDhiMDEpLAorICAgIFdUQzEoMHg4N2IwZWYwMSksIFdUQzEoMHg4N2JjYWI4MSksIFdUQzEoMHg4N2M3NjIwMSksIFdUQzEoMHg4N2QwY2E4MSksCisgICAgV1RDMSgweDg3ZmRkNzgxKSwgV1RDMSgweDg4MWRkMzAxKSwgV1RDMSgweDg4NDIzMzAxKSwgV1RDMSgweDg4NmE4YTgxKSwKKyAgICBXVEMxKDB4ODg5NjI5ODEpLCBXVEMxKDB4ODhjNDVlODEpLCBXVEMxKDB4ODhmNDc5MDEpLCBXVEMxKDB4ODkyNWYxMDEpLAorICAgIFdUQzEoMHg4OTU4NjkwMSksIFdUQzEoMHg4OThiODMwMSksIFdUQzEoMHg4OWJlZTU4MSksIFdUQzEoMHg4OWYyNjEwMSksCisgICAgV1RDMSgweDhhMjVmMzAxKSwgV1RDMSgweDhhNTk5YTgxKSwgV1RDMSgweDhhOGQ1ODAxKSwgV1RDMSgweDhhYzEzMzgxKSwKKyAgICBXVEMxKDB4OGFmNTNlODEpLCBXVEMxKDB4OGIyOThiODEpLCBXVEMxKDB4OGI1ZTJjODEpLCBXVEMxKDB4OGI5MzMwMDEpLAorICAgIFdUQzEoMHg4YmM4YTQwMSksIFdUQzEoMHg4YmZlOTQwMSksIFdUQzEoMHg4YzM1MGQwMSksIFdUQzEoMHg4YzZjMWIwMSksCisgICAgV1RDMSgweDhjYTNjYjAxKSwgV1RDMSgweDhjZGMyOTAxKSwgV1RDMSgweDhkMTU0MDgxKSwgV1RDMSgweDhkNGYxYjAxKSwKKyAgICBXVEMxKDB4OGQ4OWJlODEpLCBXVEMxKDB4OGRjNTMwMDEpLCBXVEMxKDB4OGUwMTc1ODEpLCBXVEMxKDB4OGUzZTk0ODEpLAorICAgIFdUQzEoMHg4ZTdjOTMwMSksIFdUQzEoMHg4ZWJiNzU4MSksIFdUQzEoMHg4ZWZiNDE4MSksIFdUQzEoMHg4ZjNiZmIwMSksCisgICAgV1RDMSgweDhmN2RhNDAxKSwgV1RDMSgweDhmYzAzZjAxKSwgV1RDMSgweDkwMDNjZTgxKSwgV1RDMSgweDkwNDg1NDAxKSwKKyAgICBXVEMxKDB4OTA4ZGQxMDEpLCBXVEMxKDB4OTBkNDQ3ODEpLCBXVEMxKDB4OTExYmI5ODEpLCBXVEMxKDB4OTE2NDI3ODEpLAorICAgIFdUQzEoMHg5MWFkOTI4MSksIFdUQzEoMHg5MWY3Zjk4MSksIFdUQzEoMHg5MjQzNWQwMSksIFdUQzEoMHg5MjhmYmUwMSksCisgICAgV1RDMSgweDkyZGQxYjAxKSwgV1RDMSgweDkzMmI3NTAxKSwgV1RDMSgweDkzN2FjYjAxKSwgV1RDMSgweDkzY2IxYzgxKSwKKyAgICBXVEMxKDB4OTQxYzY5MDEpLCBXVEMxKDB4OTQ2ZWFmODEpLCBXVEMxKDB4OTRjMWVlMDEpLCBXVEMxKDB4OTUxNjIzODEpLAorICAgIFdUQzEoMHg5NTZiNGY4MSksIFdUQzEoMHg5NWMxNzA4MSksIFdUQzEoMHg5NjE4ODUwMSksIFdUQzEoMHg5NjcwOGI4MSksCisgICAgV1RDMSgweDk2Yzk4MzgxKSwgV1RDMSgweDk3MjM2YjAxKSwgV1RDMSgweDk3N2U0MTgxKSwgV1RDMSgweDk3ZGEwNDgxKSwKKyAgICBXVEMxKDB4OTgzNmIyMDEpLCBXVEMxKDB4OTg5NDQ5MDEpLCBXVEMxKDB4OThmMmM2MDEpLCBXVEMxKDB4OTk1MjI4MDEpLAorICAgIFdUQzEoMHg5OWIyNmM4MSksIFdUQzEoMHg5YTEzOTEwMSksIFdUQzEoMHg5YTc1OTMwMSksIFdUQzEoMHg5YWQ4NzA4MSksCisgICAgV1RDMSgweDliM2MyODAxKSwgV1RDMSgweDliYTBiNzAxKSwgV1RDMSgweDljMDYxYjgxKSwgV1RDMSgweDljNmM1NDgxKSwKKyAgICBXVEMxKDB4OWNkMzVmODEpLCBXVEMxKDB4OWQzYjNiODEpLCBXVEMxKDB4OWRhM2U2MDEpLCBXVEMxKDB4OWUwZDVlMDEpLAorICAgIFdUQzEoMHg5ZTc3OWY4MSksIFdUQzEoMHg5ZWUyYTkwMSksIFdUQzEoMHg5ZjRlNzgwMSksIFdUQzEoMHg5ZmJiMDk4MSksCisgICAgV1RDMSgweGEwMjg1ZDgxKSwgV1RDMSgweGEwOTY3MjAxKSwgV1RDMSgweGExMDU0NzAxKSwgV1RDMSgweGExNzRkYTgxKSwKKyAgICBXVEMxKDB4YTFlNTJhODEpLCBXVEMxKDB4YTI1NjM1MDEpLCBXVEMxKDB4YTJjN2Y4MDEpLCBXVEMxKDB4YTMzYTcyMDEpLAorICAgIFdUQzEoMHhhM2FkYTI4MSksIFdUQzEoMHhhNDIxODgwMSksIFdUQzEoMHhhNDk2MjE4MSksIFdUQzEoMHhhNTBiNmU4MSksCisgICAgV1RDMSgweGE1ODE2ZTgxKSwgV1RDMSgweGE1ZjgxZjgxKSwgV1RDMSgweGE2NmY4MjAxKSwgV1RDMSgweGE2ZTc5NDAxKSwKKyAgICBXVEMxKDB4YTc2MDU2MDEpLCBXVEMxKDB4YTdkOWM2ODEpLCBXVEMxKDB4YTg1M2U1MDEpLCBXVEMxKDB4YThjZWIyMDEpLAorICAgIFdUQzEoMHhhOTRhMmMwMSksIFdUQzEoMHhhOWM2NTQwMSksIFdUQzEoMHhhYTQzMjk4MSksIFdUQzEoMHhhYWMwYWQwMSksCisgICAgV1RDMSgweGFiM2VkZjAxKSwgV1RDMSgweGFiYmRjMDAxKSwgV1RDMSgweGFjM2Q1MDAxKSwgV1RDMSgweGFjYmQ5MDgxKSwKKyAgICBXVEMxKDB4YWQzZTgxMDEpLCBXVEMxKDB4YWRjMDIyODEpLCBXVEMxKDB4YWU0Mjc0ODEpLCBXVEMxKDB4YWVjNTc4MDEpLAorICAgIFdUQzEoMHhhZjQ5MmYwMSksIFdUQzEoMHhhZmNkOWE4MSksIFdUQzEoMHhiMDUyYmMwMSksIFdUQzEoMHhiMGQ4OTQwMSksCisgICAgV1RDMSgweGIxNWYyMzgxKSwgV1RDMSgweGIxZTY2YTAxKSwgV1RDMSgweGIyNmU2ODgxKSwgV1RDMSgweGIyZjcxZjAxKSwKKyAgICBXVEMxKDB4YjM4MDhkODEpLCBXVEMxKDB4YjQwYWI1MDEpLCBXVEMxKDB4YjQ5NTk1MDEpLCBXVEMxKDB4YjUyMTJlODEpLAorICAgIFdUQzEoMHg0YTZjZjY3ZiksIFdUQzEoMHg0OWRmZmVmZiksIFdUQzEoMHg0OTUyNjVmZiksIFdUQzEoMHg0OGM0Mjc3ZiksCisgICAgV1RDMSgweDQ4MzU0MDdmKSwgV1RDMSgweDQ3YTVhZWZmKSwgV1RDMSgweDQ3MTU3MGZmKSwgV1RDMSgweDQ2ODQ4NGZmKSwKKyAgICBXVEMxKDB4NDVmMmVhZmYpLCBXVEMxKDB4NDU2MGEyZmYpLCBXVEMxKDB4NDRjZGFkN2YpLCBXVEMxKDB4NDQzYTBjN2YpLAorICAgIFdUQzEoMHg0M2E1YzA3ZiksIFdUQzEoMHg0MzEwY2FmZiksIFdUQzEoMHg0MjdiMmJmZiksIFdUQzEoMHg0MWU0ZTNmZiksCisgICAgV1RDMSgweDQxNGRmMmZmKSwgV1RDMSgweDQwYjY1NTdmKSwgV1RDMSgweDQwMWUwNmZmKSwgV1RDMSgweDNmODUwM2MwKSwKKyAgICBXVEMxKDB4M2VlYjRlMDApLCBXVEMxKDB4M2U1MGViYzApLCBXVEMxKDB4M2RiNWU2ODApLCBXVEMxKDB4M2QxYTQ2ODApLAorICAgIFdUQzEoMHgzYzdlMTBjMCksIFdUQzEoMHgzYmUxNGNjMCksIFdUQzEoMHgzYjQ0MDJjMCksIFdUQzEoMHgzYWE2MzgwMCksCisgICAgV1RDMSgweDNhMDdlODQwKSwgV1RDMSgweDM5NjkwODgwKSwgV1RDMSgweDM4Yzk4NzAwKSwgV1RDMSgweDM4Mjk1YjQwKSwKKyAgICBXVEMxKDB4Mzc4ODhhODApLCBXVEMxKDB4MzZlNzFkNDApLCBXVEMxKDB4MzY0NTFkODApLCBXVEMxKDB4MzVhMjk0MDApLAorICAgIFdUQzEoMHgzNGZmODgwMCksIFdUQzEoMHgzNDVjMDRjMCksIFdUQzEoMHgzM2I4MTk0MCksIFdUQzEoMHgzMzEzZDIwMCksCisgICAgV1RDMSgweDMyNmYzODAwKSwgV1RDMSgweDMxY2E1NjAwKSwgV1RDMSgweDMxMjUzODQwKSwgV1RDMSgweDMwN2ZlOGMwKSwKKyAgICBXVEMxKDB4MmZkYTZlNDApLCBXVEMxKDB4MmYzNGNlNDApLCBXVEMxKDB4MmU4ZjBlNDApLCBXVEMxKDB4MmRlOTJlYzApLAorICAgIFdUQzEoMHgyZDQzMjc4MCksIFdUQzEoMHgyYzljZWE0MCksIFdUQzEoMHgyYmY2NjMwMCksIFdUQzEoMHgyYjRmODhjMCksCisgICAgV1RDMSgweDJhYTg2NGMwKSwgV1RDMSgweDJhMDEwMjQwKSwgV1RDMSgweDI5NTk2ZTQwKSwgV1RDMSgweDI4YjFiYTgwKSwKKyAgICBXVEMxKDB4MjgwOWZmNDApLCBXVEMxKDB4Mjc2MjViODApLCBXVEMxKDB4MjZiYWY1ODApLCBXVEMxKDB4MjYxM2U3YzApLAorICAgIFdUQzEoMHgyNTZkM2RjMCksIFdUQzEoMHgyNGM3MDMwMCksIFdUQzEoMHgyNDIxNDM4MCksIFdUQzEoMHgyMzdjMDgwMCksCisgICAgV1RDMSgweDIyZDc1NDAwKSwgV1RDMSgweDIyMzMyYTgwKSwgV1RDMSgweDIxOGY4Y2MwKSwgV1RDMSgweDIwZWM3ZTQwKSwKKyAgICBXVEMxKDB4MjA0YTA0YzApLCBXVEMxKDB4MWZhODI1NDApLCBXVEMxKDB4MWYwNmUzMDApLCBXVEMxKDB4MWU2NjQwMDApLAorICAgIFdUQzEoMHgxZGM2M2JjMCksIFdUQzEoMHgxZDI2ZDNjMCksIFdUQzEoMHgxYzg4MDNhMCksIFdUQzEoMHgxYmU5Y2M0MCksCisgICAgV1RDMSgweDFiNGMzNGMwKSwgV1RDMSgweDFhYWY0NDgwKSwgV1RDMSgweDFhMTMwMjYwKSwgV1RDMSgweDE5Nzc3NGEwKSwKKyAgICBXVEMxKDB4MThkY2EyNjApLCBXVEMxKDB4MTg0Mjk0ZTApLCBXVEMxKDB4MTdhOTU4NDApLCBXVEMxKDB4MTcxMGZkODApLAorICAgIFdUQzEoMHgxNjc5OWNlMCksIFdUQzEoMHgxNWUzNTM0MCksIFdUQzEoMHgxNTRlNDFhMCksIFdUQzEoMHgxNGJhODM2MCksCisgICAgV1RDMSgweDE0MjgyYmUwKSwgV1RDMSgweDEzOTc1MTAwKSwgV1RDMSgweDEzMDgwYWEwKSwgV1RDMSgweDEyN2E2MjQwKSwKKyAgICBXVEMxKDB4MTFlZTUwYTApLCBXVEMxKDB4MTE2M2NjODApLCBXVEMxKDB4MTBkYWNiMjApLCBXVEMxKDB4MTA1MzMzYTApLAorICAgIFdUQzEoMHgwZmNjZGIzMCksIFdUQzEoMHgwZjQ3OGY0MCksIFdUQzEoMHgwZWMzMTcwMCksIFdUQzEoMHgwZTNmNGU4MCksCisgICAgV1RDMSgweDBkYmMyN2YwKSwgV1RDMSgweDBkMzk5MDAwKSwgV1RDMSgweDBjYjc2ZDAwKSwgV1RDMSgweDBjMzU5ZDUwKSwKKyAgICBXVEMxKDB4MGJiM2ZkNTApLCBXVEMxKDB4MGIzMjZiZDApLCBXVEMxKDB4MGFiMGNhODApLCBXVEMxKDB4MGEyZjBkYzApLAorICAgIFdUQzEoMHgwOWFkNDBjMCksIFdUQzEoMHgwOTJiN2E5MCksIFdUQzEoMHgwOGE5ZGI4MCksIFdUQzEoMHgwODI4NWM4MCksCisgICAgV1RDMSgweDA3YTZjN2I4KSwgV1RDMSgweDA3MjRlNGUwKSwgV1RDMSgweDA2YTI3YjgwKSwgV1RDMSgweDA2MWY1MmY4KSwKKyAgICBXVEMxKDB4MDU5YjJhZDApLCBXVEMxKDB4MDUxNWI1NjgpLCBXVEMxKDB4MDQ4ZWEwNTgpLCBXVEMxKDB4MDQwNjY0MDgpLAorICAgIFdUQzEoMHgwMzdlNTJkOCksIFdUQzEoMHgwMmY3ZDNjOCksIFdUQzEoMHgwMjc0NjE0YyksIFdUQzEoMHgwMWY2MzAwOCksCisgICAgV1RDMSgweDAxODA0MDNhKSwgV1RDMSgweDAxMTVjNDQyKSwgV1RDMSgweDAwYmEwOWUyKSwgV1RDMSgweDAwNmYwNzdjKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgLyogcGFydCAyICovCisgICAgV1RDMigweGZmZjM2YmUxKSwgV1RDMigweGZmZGFmYmMxKSwgV1RDMigweGZmYzI4MDM1KSwgV1RDMigweGZmYTlmZThhKSwKKyAgICBXVEMyKDB4ZmY5MTdjMDgpLCBXVEMyKDB4ZmY3OGZkZmMpLCBXVEMyKDB4ZmY2MDg5YWYpLCBXVEMyKDB4ZmY0ODI0NmMpLAorICAgIFdUQzIoMHhmZjJmZDM3ZiksIFdUQzIoMHhmZjE3OWMzMSksIFdUQzIoMHhmZWZmODNiNiksIFdUQzIoMHhmZWU3OGQxOCksCisgICAgV1RDMigweGZlY2ZiOTNlKSwgV1RDMigweGZlYjgwOGYyKSwgV1RDMigweGZlYTA3ZDA2KSwgV1RDMigweGZlODkxNmI0KSwKKyAgICBXVEMyKDB4ZmU3MWQ3YTApLCBXVEMyKDB4ZmU1YWMxNzQpLCBXVEMyKDB4ZmU0M2Q1ZDYpLCBXVEMyKDB4ZmUyZDE2N2UpLAorICAgIFdUQzIoMHhmZTE2ODUyZSksIFdUQzIoMHhmZTAwMjNhNiksIFdUQzIoMHhmZGU5ZjNmOCksIFdUQzIoMHhmZGQzZmY3YyksCisgICAgV1RDMigweGZkYmU1NmMwKSwgV1RDMigweGZkYTkwYWE4KSwgV1RDMigweGZkOTQyYjc4KSwgV1RDMigweGZkN2ZiYjIwKSwKKyAgICBXVEMyKDB4ZmQ2YmFkNTApLCBXVEMyKDB4ZmQ1N2Y1MTApLCBXVEMyKDB4ZmQ0NDg1N2MpLCBXVEMyKDB4ZmQzMTUzZmMpLAorICAgIFdUQzIoMHhmZDFlNTg0MCksIFdUQzIoMHhmZDBiOGEwYyksIFdUQzIoMHhmY2Y4ZTE4MCksIFdUQzIoMHhmY2U2NWVlYyksCisgICAgV1RDMigweGZjZDQwYWQwKSwgV1RDMigweGZjYzFlZTBjKSwgV1RDMigweGZjYjAxMWU4KSwgV1RDMigweGZjOWU4OTZjKSwKKyAgICBXVEMyKDB4ZmM4ZDcxNmMpLCBXVEMyKDB4ZmM3Y2U3MjApLCBXVEMyKDB4ZmM2ZDA3MmMpLCBXVEMyKDB4ZmM1ZGUwOWMpLAorICAgIFdUQzIoMHhmYzRmNzRlOCksIFdUQzIoMHhmYzQxYzRlOCksIFdUQzIoMHhmYzM0ZDBkYyksIFdUQzIoMHhmYzI4OGE2OCksCisgICAgV1RDMigweGZjMWNkNDljKSwgV1RDMigweGZjMTE5MWUwKSwgV1RDMigweGZjMDZhNGQwKSwgV1RDMigweGZiZmJmM2U4KSwKKyAgICBXVEMyKDB4ZmJmMTY5OTApLCBXVEMyKDB4ZmJlNmYwNjgpLCBXVEMyKDB4ZmJkYzc0MjgpLCBXVEMyKDB4ZmJkMWZjNjgpLAorICAgIFdUQzIoMHhmYmM3YWM1MCksIFdUQzIoMHhmYmJkYTg2OCksIFdUQzIoMHhmYmI0MTUwMCksIFdUQzIoMHhmYmFiMTQzOCksCisgICAgV1RDMigweGZiYTJjNWY4KSwgV1RDMigweGZiOWI0YTAwKSwgV1RDMigweGZiOTRiZmE4KSwgV1RDMigweGZiOGYzYjQ4KSwKKyAgICBXVEMyKDB4ZmI4YWM2MzgpLCBXVEMyKDB4ZmI4NzY5NzApLCBXVEMyKDB4ZmI4NTJkMjApLCBXVEMyKDB4ZmI4NDBhZTApLAorICAgIFdUQzIoMHhmYjgzZWQ2MCksIFdUQzIoMHhmYjg0YmVjMCksIFdUQzIoMHhmYjg2NjkxOCksIFdUQzIoMHhmYjg4ZDRhOCksCisgICAgV1RDMigweGZiOGJlODEwKSwgV1RDMigweGZiOGY4OWQwKSwgV1RDMigweGZiOTNhMDgwKSwgV1RDMigweGZiOTgxNDE4KSwKKyAgICBXVEMyKDB4ZmI5Y2NkZjApLCBXVEMyKDB4ZmJhMWI3NzApLCBXVEMyKDB4ZmJhNmJhZTApLCBXVEMyKDB4ZmJhYmQ1YzApLAorICAgIFdUQzIoMHhmYmIxMThkOCksIFdUQzIoMHhmYmI2OTVjMCksIFdUQzIoMHhmYmJjNWU5MCksIFdUQzIoMHhmYmMyOTAzMCksCisgICAgV1RDMigweGZiYzk1MjY4KSwgV1RDMigweGZiZDBjZDc4KSwgV1RDMigweGZiZDkyOWM4KSwgV1RDMigweGZiZTI5NGQwKSwKKyAgICBXVEMyKDB4ZmJlZDQxMDgpLCBXVEMyKDB4ZmJmOTYxMTgpLCBXVEMyKDB4ZmMwNzI2YzgpLCBXVEMyKDB4ZmMxNmIwNjQpLAorICAgIFdUQzIoMHhmYzI4MDg5MCksIFdUQzIoMHhmYzNiMzkyMCksIFdUQzIoMHhmYzUwNGE5OCksIFdUQzIoMHhmYzY3MjcxYyksCisgICAgV1RDMigweGZjN2Y5YTc0KSwgV1RDMigweGZjOTk2ZjE4KSwgV1RDMigweGZjYjQ2ZWI4KSwgV1RDMigweGZjZDA1MGIwKSwKKyAgICBXVEMyKDB4ZmNlY2JhMjQpLCBXVEMyKDB4ZmQwOTRmNjQpLCBXVEMyKDB4ZmQyNWI3MjApLCBXVEMyKDB4ZmQ0MWNlNDApLAorICAgIFdUQzIoMHhmZDVkYTdmOCksIFdUQzIoMHhmZDc5NTlkOCksIFdUQzIoMHhmZDk0ZmI3NCksIFdUQzIoMHhmZGIwZDNmYyksCisgICAgV1RDMigweGZkY2Q1YTM0KSwgV1RDMigweGZkZWIwNmU0KSwgV1RDMigweGZlMGE1MTg0KSwgV1RDMigweGZlMmI5MmM0KSwKKyAgICBXVEMyKDB4ZmU0ZjA0ODYpLCBXVEMyKDB4ZmU3NGRmNTQpLCBXVEMyKDB4ZmU5ZDU4ODYpLCBXVEMyKDB4ZmVjODViOTIpLAorICAgIFdUQzIoMHhmZWY1OGExNiksIFdUQzIoMHhmZjI0ODI3NSksIFdUQzIoMHhmZjU0ZTQwMSksIFdUQzIoMHhmZjg2NjMzMCksCisgICAgV1RDMigweGZmYjhjOTliKSwgV1RDMigweGZmZWJlMWM5KSwgV1RDMigweDAwMWY3ODZhKSwgV1RDMigweDAwNTM4YmY5KSwKKyAgICBXVEMyKDB4MDA4ODRjYmMpLCBXVEMyKDB4MDBiZGVkMjMpLCBXVEMyKDB4MDBmNDlmNTQpLCBXVEMyKDB4MDEyYzhlZTQpLAorICAgIFdUQzIoMHgwMTY1ZTBkMiksIFdUQzIoMHgwMWEwYjlkNiksIFdUQzIoMHgwMWRkM2Q4MCksIFdUQzIoMHgwMjFiNzRkNCksCisgICAgV1RDMigweDAyNWI0ZTQ4KSwgV1RDMigweDAyOWNiNzMwKSwgV1RDMigweDAyZGY5ZDBjKSwgV1RDMigweDAzMjNmMWE0KSwKKyAgICBXVEMyKDB4MDM2OWFiMDApLCBXVEMyKDB4MDNiMGJmNWMpLCBXVEMyKDB4MDNmOTI1YTApLCBXVEMyKDB4MDQ0MmUzZDgpLAorICAgIFdUQzIoMHgwNDhlMGY0MCksIFdUQzIoMHgwNGRhYmRiMCksIFdUQzIoMHgwNTI5MDQzMCksIFdUQzIoMHgwNTc4ZTQyOCksCisgICAgV1RDMigweDA1Y2E0YjYwKSwgV1RDMigweDA2MWQyNmMwKSwgV1RDMigweDA2NzE2M2Q4KSwgV1RDMigweDA2YzZmZjEwKSwKKyAgICBXVEMyKDB4MDcxZTAzYjApLCBXVEMyKDB4MDc3NjdkYTApLCBXVEMyKDB4MDdkMDc5MTgpLCBXVEMyKDB4MDgyYzA4ZTApLAorICAgIFdUQzIoMHgwODg5NDY2MCksIFdUQzIoMHgwOGU4NGI3MCksIFdUQzIoMHgwOTQ5MzBiMCksIFdUQzIoMHgwOWFiZjhkMCksCisgICAgV1RDMigweDBhMTA5MDIwKSwgV1RDMigweDBhNzZlMjEwKSwgV1RDMigweDBhZGVkYTUwKSwgV1RDMigweDBiNDg2YjgwKSwKKyAgICBXVEMyKDB4MGJiMzhmMDApLCBXVEMyKDB4MGMyMDNlODApLCBXVEMyKDB4MGM4ZTczZTApLCBXVEMyKDB4MGNmZTJjMzApLAorICAgIFdUQzIoMHgwZDZmNjgyMCksIFdUQzIoMHgwZGUyMjg1MCksIFdUQzIoMHgwZTU2NmQ5MCksIFdUQzIoMHgwZWNjM2RkMCksCisgICAgV1RDMigweDBmNDNhM2EwKSwgV1RDMigweDBmYmNhOWYwKSwgV1RDMigweDEwMzc1YjgwKSwgV1RDMigweDEwYjNiZTIwKSwKKyAgICBXVEMyKDB4MTEzMWQyODApLCBXVEMyKDB4MTFiMTk5NjApLCBXVEMyKDB4MTIzMzEzYTApLCBXVEMyKDB4MTJiNjQzODApLAorICAgIFdUQzIoMHgxMzNiMmQwMCksIFdUQzIoMHgxM2MxZDQ0MCksIFdUQzIoMHgxNDRhM2Q2MCksIFdUQzIoMHgxNGQ0NjkwMCksCisgICAgV1RDMigweDE1NjA1NDgwKSwgV1RDMigweDE1ZWRmZDIwKSwgV1RDMigweDE2N2Q2MDQwKSwgV1RDMigweDE3MGU3ZTgwKSwKKyAgICBXVEMyKDB4MTdhMTViODApLCBXVEMyKDB4MTgzNWZiMDApLCBXVEMyKDB4MThjYzYwYTApLCBXVEMyKDB4MTk2NDhkYzApLAorICAgIFdUQzIoMHgxOWZlODBlMCksIFdUQzIoMHgxYTlhMzhhMCksIFdUQzIoMHgxYjM3YjNlMCksIFdUQzIoMHgxYmQ2ZjQwMCksCisgICAgV1RDMigweDFjNzdmZDIwKSwgV1RDMigweDFkMWFkNDAwKSwgV1RDMigweDFkYmY3YzgwKSwgV1RDMigweDFlNjVmODIwKSwKKyAgICBXVEMyKDB4MWYwZTQ1NDApLCBXVEMyKDB4MWZiODYxZTApLCBXVEMyKDB4MjA2NDRjYzApLCBXVEMyKDB4MjExMjA2NDApLAorICAgIFdUQzIoMHgyMWMxOTI0MCksIFdUQzIoMHgyMjcyZjQ4MCksIFdUQzIoMHgyMzI2MzAwMCksIFdUQzIoMHgyM2RiNDU4MCksCisgICAgV1RDMigweDI0OTIzMzQwKSwgV1RDMigweDI1NGFmNzAwKSwgV1RDMigweDI2MDU4ZTgwKSwgV1RDMigweDI2YzFmYTAwKSwKKyAgICBXVEMyKDB4Mjc4MDNkMDApLCBXVEMyKDB4Mjg0MDVhNDApLCBXVEMyKDB4MjkwMjU1MDApLCBXVEMyKDB4MjljNjJkNDApLAorICAgIFdUQzIoMHgyYThiZTBjMCksIFdUQzIoMHgyYjUzNmNjMCksIFdUQzIoMHgyYzFjY2Y4MCksIFdUQzIoMHgyY2U4MDg0MCksCisgICAgV1RDMigweDJkYjUxOWMwKSwgV1RDMigweDJlODQwNjAwKSwgV1RDMigweDJmNTRjZjgwKSwgV1RDMigweDMwMjc3NWMwKSwKKyAgICBXVEMyKDB4MzBmYmY2NDApLCBXVEMyKDB4MzFkMjRlMDApLCBXVEMyKDB4MzJhYTdhMDApLCBXVEMyKDB4MzM4NDc5YzApLAorICAgIFdUQzIoMHgzNDYwNGU0MCksIFdUQzIoMHgzNTNkZjkwMCksIFdUQzIoMHgzNjFkN2FjMCksIFdUQzIoMHgzNmZlZDIwMCksCisgICAgV1RDMigweDM3ZTFmYjQwKSwgV1RDMigweDM4YzZmMjQwKSwgV1RDMigweDM5YWRiMmMwKSwgV1RDMigweDNhOTYzYTAwKSwKKyAgICBXVEMyKDB4M2I4MDg3NDApLCBXVEMyKDB4M2M2Yzk4ODApLCBXVEMyKDB4M2Q1YTZjYzApLCBXVEMyKDB4M2U0YTAwNDApLAorICAgIFdUQzIoMHgzZjNiNGJjMCksIFdUQzIoMHg0MDJlNDhmZiksIFdUQzIoMHg0MTIyZjE3ZiksIFdUQzIoMHg0MjE5M2Y3ZiksCisgICAgV1RDMigweDQzMTEyZWZmKSwgV1RDMigweDQ0MGFiYmZmKSwgV1RDMigweDQ1MDVlMmZmKSwgV1RDMigweDQ2MDI5ZTdmKSwKKyAgICBXVEMyKDB4NDcwMGU5ZmYpLCBXVEMyKDB4NDgwMGJmZmYpLCBXVEMyKDB4NDkwMjFiZmYpLCBXVEMyKDB4NGEwNTBlZmYpLAorICAgIFdUQzIoMHg0YjA5YmM3ZiksIFdUQzIoMHg0YzEwNGFmZiksIFdUQzIoMHg0ZDE4ZGY3ZiksIFdUQzIoMHg0ZTIzYTA3ZiksCisgICAgV1RDMigweDRmMzBiMmZmKSwgV1RDMigweDUwNDAzYzdmKSwgV1RDMigweDUxNTI2MmZmKSwgV1RDMigweDUyNjc0YjdmKSwKKyAgICBXVEMyKDB4MDAxNjc4YjIpLCBXVEMyKDB4MDAwNjFhM2IpLCBXVEMyKDB4ZmZmYjQ2MjIpLCBXVEMyKDB4ZmZmNWVhOTQpLAorICAgIFdUQzIoMHhmZmY1ZjViOSksIFdUQzIoMHhmZmZiNTViZCksIFdUQzIoMHgwMDA1ZjhjYiksIFdUQzIoMHgwMDE1Y2QwYyksCisgICAgV1RDMigweDAwMmFjMGFjKSwgV1RDMigweDAwNDRjMWQ1KSwgV1RDMigweDAwNjNiZWIyKSwgV1RDMigweDAwODdhNTZkKSwKKyAgICBXVEMyKDB4MDBiMDY0MzEpLCBXVEMyKDB4MDBkZGU5MjkpLCBXVEMyKDB4MDExMDIyODApLCBXVEMyKDB4MDE0NmZlNWUpLAorICAgIFdUQzIoMHgwMTgyNmFmMiksIFdUQzIoMHgwMWMyNTY2MiksIFdUQzIoMHgwMjA2YWVkYyksIFdUQzIoMHgwMjRmNjI4OCksCisgICAgV1RDMigweDAyOWM1Zjk0KSwgV1RDMigweDAyZWQ5NDI0KSwgV1RDMigweDAzNDJlZTZjKSwgV1RDMigweDAzOWM1YzkwKSwKKyAgICBXVEMyKDB4MDNmOWNjYmMpLCBXVEMyKDB4MDQ1YjJkMTgpLCBXVEMyKDB4MDRjMDZiZDgpLCBXVEMyKDB4MDUyOTc3MTgpLAorICAgIFdUQzIoMHgwNTk2M2QxMCksIFdUQzIoMHgwNjA2YWJlOCksIFdUQzIoMHgwNjdhYjFjMCksIFdUQzIoMHgwNmYyM2NkMCksCisgICAgV1RDMigweDA3NmQzYjQwKSwgV1RDMigweDA3ZWI5YjM4KSwgV1RDMigweDA4NmQ0YWUwKSwgV1RDMigweDA4ZjIzODYwKSwKKyAgICBXVEMyKDB4MDk3YTUxZjApLCBXVEMyKDB4MGEwNTg1YjApLCBXVEMyKDB4MGE5M2MxZDApLCBXVEMyKDB4MGIyNGY0NzApLAorICAgIFdUQzIoMHgwYmI5MGJjMCksIFdUQzIoMHgwYzRmZjVmMCksIFdUQzIoMHgwY2U5YTEzMCksIFdUQzIoMHgwZDg1ZmI5MCksCisgICAgV1RDMigweDBlMjRmMzYwKSwgV1RDMigweDBlYzY3NmIwKSwgV1RDMigweDBmNmE3M2IwKSwgV1RDMigweDEwMTBkODgwKSwKKyAgICBXVEMyKDB4MTBiOTkzNjApLCBXVEMyKDB4MTE2NDkyODApLCBXVEMyKDB4MTIxMWM0MDApLCBXVEMyKDB4MTJjMTE1ZTApLAorICAgIFdUQzIoMHgxMzcyNzZhMCksIFdUQzIoMHgxNDI1ZDQyMCksIFdUQzIoMHgxNGRiMWNhMCksIFdUQzIoMHgxNTkyM2U2MCksCisgICAgV1RDMigweDE2NGIyNzgwKSwgV1RDMigweDE3MDVjNjIwKSwgV1RDMigweDE3YzIwODYwKSwgV1RDMigweDE4N2ZkY2EwKSwKKyAgICBXVEMyKDB4MTkzZjMwZTApLCBXVEMyKDB4MTlmZmYzNDApLCBXVEMyKDB4MWFjMjEyMDApLCBXVEMyKDB4MWI4NTdiNDApLAorICAgIFdUQzIoMHgxYzRhMWQ0MCksIFdUQzIoMHgxZDBmZTYwMCksIFdUQzIoMHgxZGQ2YzNlMCksIFdUQzIoMHgxZTllYTRlMCksCisgICAgV1RDMigweDFmNjc3NzQwKSwgV1RDMigweDIwMzEyOTQwKSwgV1RDMigweDIwZmJhOGMwKSwgV1RDMigweDIxYzZlNDQwKSwKKyAgICBXVEMyKDB4MjI5MmM5YzApLCBXVEMyKDB4MjM1ZjQ3ODApLCBXVEMyKDB4MjQyYzRiODApLCBXVEMyKDB4MjRmOWM0MDApLAorICAgIFdUQzIoMHgyNWM3OWY0MCksIFdUQzIoMHgyNjk1Y2I0MCksIFdUQzIoMHgyNzY0MzY4MCksIFdUQzIoMHgyODMyY2VjMCksCisgICAgV1RDMigweDI5MDE4MjQwKSwgV1RDMigweDI5ZDAzZjgwKSwgV1RDMigweDJhOWVmNDgwKSwgV1RDMigweDJiNmQ4ZjAwKSwKKyAgICBXVEMyKDB4MmMzYmZkYzApLCBXVEMyKDB4MmQwYTJlYzApLCBXVEMyKDB4MmRkODEwMDApLCBXVEMyKDB4MmVhNThmYzApLAorICAgIFdUQzIoMHgyZjcyOWM0MCksIFdUQzIoMHgzMDNmMjM4MCksIFdUQzIoMHgzMTBiMTQwMCksIFdUQzIoMHgzMWQ2NWI4MCksCisgICAgV1RDMigweDMyYTBlODQwKSwgV1RDMigweDMzNmFhOGMwKSwgV1RDMigweDM0MzM4YWMwKSwgV1RDMigweDM0ZmI3Y2MwKSwKKyAgICBXVEMyKDB4MzVjMjZjYzApLCBXVEMyKDB4MzY4ODQ5MDApLCBXVEMyKDB4Mzc0Y2ZmODApLCBXVEMyKDB4MzgxMDdlODApLAorICAgIFdUQzIoMHgzOGQyYjQ0MCksIFdUQzIoMHgzOTkzOGVjMCksIFdUQzIoMHgzYTUyZmM0MCksIFdUQzIoMHgzYjEwZWIwMCksCisgICAgV1RDMigweDNiY2Q0OTAwKSwgV1RDMigweDNjODgwNDgwKSwgV1RDMigweDNkNDEwYmMwKSwgV1RDMigweDNkZjg0ZDAwKSwKKyAgICBXVEMyKDB4M2VhZGI2MDApLCBXVEMyKDB4M2Y2MTM1NDApLCBXVEMyKDB4NDAxMmI4ZmYpLCBXVEMyKDB4NDBjMjJlZmYpLAorICAgIFdUQzIoMHg0MTZmODVmZiksIFdUQzIoMHg0MjFhYWI3ZiksIFdUQzIoMHg0MmMzOGU3ZiksIFdUQzIoMHg0MzZhMWM3ZiksCisgICAgV1RDMigweDQ0MGU0MzdmKSwgV1RDMigweDQ0YWZmMjdmKSwgV1RDMigweDQ1NGYxNjdmKSwgV1RDMigweDQ1ZWI5ZWZmKSwKKyAgICBXVEMyKDB4NDY4NTc4ZmYpLCBXVEMyKDB4NDcxYzkzN2YpLCBXVEMyKDB4NDdiMGRjN2YpLCBXVEMyKDB4NDg0MjQxZmYpLAorICAgIFdUQzIoMHg0OGQwYjFmZiksIFdUQzIoMHg0OTVjMWE3ZiksIFdUQzIoMHg0OWU0NmE3ZiksIFdUQzIoMHg0YTY5OGY3ZiksCisgICAgV1RDMigweDRhZWI3N2ZmKSwgV1RDMigweDRiNmExMWZmKSwgV1RDMigweDRiZTU0YjdmKSwgV1RDMigweDRjNWQxMmZmKSwKKyAgICBXVEMyKDB4NGNkMTU1ZmYpLCBXVEMyKDB4NGQ0MjAzZmYpLCBXVEMyKDB4NGRhZjA5ZmYpLCBXVEMyKDB4NGUxODU2N2YpLAorICAgIFdUQzIoMHg0ZTdkZDc3ZiksIFdUQzIoMHg0ZWRmN2I3ZiksIFdUQzIoMHg0ZjNkMzA3ZiksIFdUQzIoMHg0Zjk2ZTQ3ZiksCisgICAgV1RDMigweDRmZWM4NWZmKSwgV1RDMigweDUwM2UwMmZmKSwgV1RDMigweDUwOGI0OTdmKSwgV1RDMigweDUwZDQ0N2ZmKSwKKyAgICBXVEMyKDB4NTExOGVjN2YpLCBXVEMyKDB4NTE1OTI0ZmYpLCBXVEMyKDB4NTE5NGRmZmYpLCBXVEMyKDB4NTFjYzBiN2YpLAorICAgIFdUQzIoMHg1MWZlOTVmZiksIFdUQzIoMHg1MjJjNmNmZiksIFdUQzIoMHg1MjU1N2VmZiksIFdUQzIoMHg1Mjc5YjlmZiksCisgICAgV1RDMigweDUyOTkwYzdmKSwgV1RDMigweDUyYjM2NGZmKSwgV1RDMigweDUyYzhiMDdmKSwgV1RDMigweDUyZDhkZGZmKSwKKyAgICBXVEMyKDB4NTJlM2RiN2YpLCBXVEMyKDB4NTJlOTk2ZmYpLCBXVEMyKDB4NTJlOWZmN2YpLCBXVEMyKDB4NTJlNTAxZmYpLAorICAgIFdUQzIoMHg1MmRhOGNmZiksIFdUQzIoMHg1MmNhOGY3ZiksIFdUQzIoMHg1MmI0ZjY3ZiksIFdUQzIoMHg1Mjk5YjA3ZiksCisgICAgV1RDMigweDUyNzhhYzdmKSwgV1RDMigweDUyNTFkNzdmKSwgV1RDMigweDUyMjUxZmZmKSwgV1RDMigweDUxZjI3NGZmKSwKKyAgICBXVEMyKDB4NTFiOWMzN2YpLCBXVEMyKDB4NTE3YWY5ZmYpLCBXVEMyKDB4NTEzNjA3N2YpLCBXVEMyKDB4NTBlYWQ4ZmYpLAorICAgIFdUQzIoMHg1MDk5NWNmZiksIFdUQzIoMHg1MDQxODFmZiksIFdUQzIoMHg0ZmUzMzVmZiksIFdUQzIoMHg0ZjdlNjc3ZiksCisgICAgV1RDMigweDRmMTMwM2ZmKSwgV1RDMigweDRlYTBmOWZmKSwgV1RDMigweDRlMjgzN2ZmKSwgV1RDMigweDRkYThhYjdmKSwKKyAgICBXVEMyKDB4NGQyMjQyZmYpLCBXVEMyKDB4NGM5NGVjZmYpLCBXVEMyKDB4NGMwMDk2ZmYpLCBXVEMyKDB4NGI2NTJmN2YpLAorICAgIFdUQzIoMHg0YWMyYTRmZiksIFdUQzIoMHg0YTE4ZTRmZiksIFdUQzIoMHg0OTY3ZGRmZiksIFdUQzIoMHg0OGFmN2U3ZiksCisgICAgV1RDMigweDQ3ZWZiM2ZmKSwgV1RDMigweDQ3Mjg2Y2ZmKSwgV1RDMigweDQ2NTlhZDdmKSwgV1RDMigweDQ1ODU2ZjdmKSwKKyAgICBXVEMyKDB4NDRhZmEzZmYpLCBXVEMyKDB4NDNkYzUwN2YpLCBXVEMyKDB4NDMwZjY1N2YpLCBXVEMyKDB4NDI0YWQ0N2YpLAorICAgIFdUQzIoMHg0MThlOTI3ZiksIFdUQzIoMHg0MGRhN2JmZiksIFdUQzIoMHg0MDJlNmY3ZiksIFdUQzIoMHgzZjhhMzEwMCksCisgICAgV1RDMigweDNlZWQ2ZjQwKSwgV1RDMigweDNlNTdkNzAwKSwgV1RDMigweDNkYzkxNGMwKSwgV1RDMigweDNkNDBjYzQwKSwKKyAgICBXVEMyKDB4M2NiZTk4YzApLCBXVEMyKDB4M2M0MjE1NDApLCBXVEMyKDB4M2JjYWRiYzApLCBXVEMyKDB4M2I1ODg4ODApLAorICAgIFdUQzIoMHgzYWVhYjc4MCksIFdUQzIoMHgzYTgxMDU0MCksIFdUQzIoMHgzYTFiMGUwMCksIFdUQzIoMHgzOWI4NmQwMCksCisgICAgV1RDMigweDM5NThiY2MwKSwgV1RDMigweDM4ZmI5NzAwKSwgV1RDMigweDM4YTA5NWMwKSwgV1RDMigweDM4NDczZDgwKSwKKyAgICBXVEMyKDB4MzdlZWZmNDApLCBXVEMyKDB4Mzc5NzRiNDApLCBXVEMyKDB4MzczZjk1MDApLCBXVEMyKDB4MzZlN2FlMDApLAorICAgIFdUQzIoMHgzNjhmYzRjMCksIFdUQzIoMHgzNjM4MGI4MCksIFdUQzIoMHgzNWUwYjMwMCksIFdUQzIoMHgzNTg5YzE0MCksCisgICAgV1RDMigweDM1MzMxMTgwKSwgV1RDMigweDM0ZGM3YzgwKSwgV1RDMigweDM0ODVkYzgwKSwgV1RDMigweDM0MmYxNjAwKSwKKyAgICBXVEMyKDB4MzNkODE3ODApLCBXVEMyKDB4MzM4MGQwYzApLCBXVEMyKDB4MzMyOTMxMDApLCBXVEMyKDB4MzJkMTE4MDApLAorICAgIFdUQzIoMHgzMjc4NTc4MCksIFdUQzIoMHgzMjFlYzBjMCksIFdUQzIoMHgzMWM0MjY4MCksIFdUQzIoMHgzMTY4ODVjMCksCisgICAgV1RDMigweDMxMGMwNTgwKSwgV1RDMigweDMwYWVjZWMwKSwgV1RDMigweDMwNTEwOTQwKSwgV1RDMigweDJmZjJiOGMwKSwKKyAgICBXVEMyKDB4MmY5M2JmNDApLCBXVEMyKDB4MmYzM2ZjMDApLCBXVEMyKDB4MmVkMzUwYzApLCBXVEMyKDB4MmU3MWJhODApLAorICAgIFdUQzIoMHgyZTBmNTM0MCksIFdUQzIoMHgyZGFjMzVjMCksIFdUQzIoMHgyZDQ4N2M4MCksIFdUQzIoMHgyY2U0MzFjMCksCisgICAgV1RDMigweDJjN2Y0ZmMwKSwgV1RDMigweDJjMTlkMDgwKSwgV1RDMigweDJiYjNhZDgwKSwgV1RDMigweDJiNGNlMDgwKSwKKyAgICBXVEMyKDB4MmFlNTYzNDApLCBXVEMyKDB4MmE3ZDJmODApLCBXVEMyKDB4MmExNDNmMDApLCBXVEMyKDB4MjlhYThiNDApfTsKIAogY29uc3QgRklYUF9XVEIgRUxEQW5hbHlzaXM0ODBbMTQ0MF0gPSB7Ci0gIFdUQzAoMHhmYWNmYmVmMCksIFdUQzAoMHhmYWI4OGMxOCksIFdUQzAoMHhmYWEwZTUyMCksIFdUQzAoMHhmYTg4ZDExMCksIFdUQzAoMHhmYTcwNTZlOCksIFdUQzAoMHhmYTU3N2RiMCksIFdUQzAoMHhmYTNlNGM3MCksIFdUQzAoMHhmYTI0Y2EyOCksIAotICBXVEMwKDB4ZmEwYWZkZTApLCBXVEMwKDB4ZjlmMGVlYTApLCBXVEMwKDB4ZjlkNmEyYzgpLCBXVEMwKDB4ZjliYzFhYjgpLCBXVEMwKDB4ZjlhMTUyMzApLCBXVEMwKDB4Zjk4NjQ1MTApLCBXVEMwKDB4Zjk2YWYwNTgpLCBXVEMwKDB4Zjk0ZjU1YzApLCAKLSAgV1RDMCgweGY5MzM3OGUwKSwgV1RDMCgweGY5MTc1ZDgwKSwgV1RDMCgweGY4ZmIwNDY4KSwgV1RDMCgweGY4ZGU2OGI4KSwgV1RDMCgweGY4YzE4NDM4KSwgV1RDMCgweGY4YTQ1MGQ4KSwgV1RDMCgweGY4ODZjZGU4KSwgV1RDMCgweGY4NjkwMTQ4KSwgCi0gIFdUQzAoMHhmODRhZjE0OCksIFdUQzAoMHhmODJjYTQxMCksIFdUQzAoMHhmODBlMWUxOCksIFdUQzAoMHhmN2VmNjJhMCksIFdUQzAoMHhmN2QwNzRlMCksIFdUQzAoMHhmN2IxNTg3MCksIFdUQzAoMHhmNzkyMTI0MCksIFdUQzAoMHhmNzcyYTdhMCksIAotICBXVEMwKDB4Zjc1MzFlNTApLCBXVEMwKDB4ZjczMzc4MjApLCBXVEMwKDB4ZjcxM2FmZDApLCBXVEMwKDB4ZjZmM2JlYTApLCBXVEMwKDB4ZjZkMzlkYzApLCBXVEMwKDB4ZjZiMzUyZTApLCBXVEMwKDB4ZjY5MmYyODApLCBXVEMwKDB4ZjY3MjkyNTApLCAKLSAgV1RDMCgweGY2NTI0N2EwKSwgV1RDMCgweGY2MzIyNGMwKSwgV1RDMCgweGY2MTIzYTAwKSwgV1RDMCgweGY1ZjI5N2MwKSwgV1RDMCgweGY1ZDM0ZGQwKSwgV1RDMCgweGY1YjQ2YjEwKSwgV1RDMCgweGY1OTVmZDkwKSwgV1RDMCgweGY1NzgxMzkwKSwgCi0gIFdUQzAoMHhmNTVhYmJhMCksIFdUQzAoMHhmNTNlMDUxMCksIFdUQzAoMHhmNTIxZmY3MCksIFdUQzAoMHhmNTA2YmEzMCksIFdUQzAoMHhmNGVjNDMzMCksIFdUQzAoMHhmNGQyYTY4MCksIFdUQzAoMHhmNGI5ZWZlMCksIFdUQzAoMHhmNGEyMmFjMCksIAotICBXVEMwKDB4ZjQ4YjVmNzApLCBXVEMwKDB4ZjQ3NTkzMTApLCBXVEMwKDB4ZjQ2MGNkZTApLCBXVEMwKDB4ZjQ0Y2ZjYzApLCBXVEMwKDB4ZjQzOWFmZjApLCBXVEMwKDB4ZjQyNjRlMDApLCBXVEMwKDB4ZjQxMjNkOTApLCBXVEMwKDB4ZjNmZDEzNzApLCAKLSAgV1RDMCgweGYzZTZiZTAwKSwgV1RDMCgweGYzY2Y0MWEwKSwgV1RDMCgweGYzYjZhMDMwKSwgV1RDMCgweGYzOWNkZDYwKSwgV1RDMCgweGYzODFmZTAwKSwgV1RDMCgweGYzNjYwNzYwKSwgV1RDMCgweGYzNDhmZTcwKSwgV1RDMCgweGYzMmFlODIwKSwgCi0gIFdUQzAoMHhmMzBiYzk0MCksIFdUQzAoMHhmMmViYTY5MCksIFdUQzAoMHhmMmNhODQ4MCksIFdUQzAoMHhmMmE4NjY3MCksIFdUQzAoMHhmMjg1NGY0MCksIFdUQzAoMHhmMjYxNDE5MCksIFdUQzAoMHhmMjNjNDFlMCksIFdUQzAoMHhmMjE2NTdhMCksIAotICBXVEMwKDB4ZjFlZjhhZTApLCBXVEMwKDB4ZjFjN2UzZTApLCBXVEMwKDB4ZjE5ZjYzZDApLCBXVEMwKDB4ZjE3NjA0NTApLCBXVEMwKDB4ZjE0YmJkZjApLCBXVEMwKDB4ZjEyMDg5NjApLCBXVEMwKDB4ZjBmNDVjZDApLCBXVEMwKDB4ZjBjNzJjZTApLCAKLSAgV1RDMCgweGYwOThlZTAwKSwgV1RDMCgweGYwNjk5NmYwKSwgV1RDMCgweGYwMzkyNjIwKSwgV1RDMCgweGYwMDc5ZTEwKSwgV1RDMCgweGVmZDRmZmMwKSwgV1RDMCgweGVmYTE1Y2EwKSwgV1RDMCgweGVmNmNlNjAwKSwgV1RDMCgweGVmMzdkNDYwKSwgCi0gIFdUQzAoMHhlZjAyNWY4MCksIFdUQzAoMHhlZWNjYTJjMCksIFdUQzAoMHhlZTk2OTc2MCksIFdUQzAoMHhlZTYwMzQ0MCksIFdUQzAoMHhlZTI5NmQyMCksIFdUQzAoMHhlZGYyMWMwMCksIFdUQzAoMHhlZGJhMDdlMCksIFdUQzAoMHhlZDgwZjY0MCksIAotICBXVEMwKDB4ZWQ0NmJmNDApLCBXVEMwKDB4ZWQwYjdiMDApLCBXVEMwKDB4ZWNjZjVmYzApLCBXVEMwKDB4ZWM5MmExMjApLCBXVEMwKDB4ZWM1NTZkNjApLCBXVEMwKDB4ZWMxN2U3MDApLCBXVEMwKDB4ZWJkYTJkNDApLCBXVEMwKDB4ZWI5YzVmYTApLCAKLSAgV1RDMCgweGViNWU3MDQwKSwgV1RDMCgweGViMjAxYjIwKSwgV1RDMCgweGVhZTExN2MwKSwgV1RDMCgweGVhYTEyMDAwKSwgV1RDMCgweGVhNjAwMTgwKSwgV1RDMCgweGVhMWQ5OTQwKSwgV1RDMCgweGU5ZDljMTYwKSwgV1RDMCgweGU5OTQ2OGEwKSwgCi0gIFdUQzAoMHhlOTRkYzA0MCksIFdUQzAoMHhlOTA2MTk0MCksIFdUQzAoMHhlOGJkYzE0MCksIFdUQzAoMHhlODc1MGFlMCksIFdUQzAoMHhlODJjNGZhMCksIFdUQzAoMHhlN2UzZWE0MCksIFdUQzAoMHhlNzljMzVlMCksIFdUQzAoMHhlNzU1NGNhMCksIAotICBXVEMwKDB4ZTcwZWZjMDApLCBXVEMwKDB4ZTZjOTBjMjApLCBXVEMwKDB4ZTY4MzNmMDApLCBXVEMwKDB4ZTYzZDIzMDApLCBXVEMwKDB4ZTVmNjIwYTApLCBXVEMwKDB4ZTVhZDlkYzApLCBXVEMwKDB4ZTU2MzIwODApLCBXVEMwKDB4ZTUxNjlkYTApLCAKLSAgV1RDMCgweGU0YzgzZTYwKSwgV1RDMCgweGU0NzgyNDAwKSwgV1RDMCgweGU0MjY5ODQwKSwgV1RDMCgweGUzZDQyZGMwKSwgV1RDMCgweGUzODE4OGMwKSwgV1RDMCgweGUzMmY0YmUwKSwgV1RDMCgweGUyZGRlZWEwKSwgV1RDMCgweGUyOGRiNTIwKSwgCi0gIFdUQzAoMHhlMjNlZTAwMCksIFdUQzAoMHhlMWYxYTU4MCksIFdUQzAoMHhlMWE1ZTNhMCksIFdUQzAoMHhlMTViMzVhMCksIFdUQzAoMHhlMTExMzg2MCksIFdUQzAoMHhlMGM3OGEwMCksIFdUQzAoMHhlMDdkZDBlMCksIFdUQzAoMHhlMDMzYjdjMCksIAotICBXVEMwKDB4ZGZlOGU2ODApLCBXVEMwKDB4ZGY5ZDFmYzApLCBXVEMwKDB4ZGY1MDU1YzApLCBXVEMwKDB4ZGYwMjg3YzApLCBXVEMwKDB4ZGViM2IzNDApLCBXVEMwKDB4ZGU2M2U3YzApLCBXVEMwKDB4ZGUxMzRhMDApLCBXVEMwKDB4ZGRjMjAwMDApLCAKLSAgV1RDMCgweGRkNzAzMTgwKSwgV1RDMCgweGRkMWUxMjgwKSwgV1RDMCgweGRjY2JlMDgwKSwgV1RDMCgweGRjNzlkOTgwKSwgV1RDMCgweGRjMjgzNjAwKSwgV1RDMCgweGRiZDcxZTAwKSwgV1RDMCgweGRiODZiMTQwKSwgV1RDMCgweGRiMzcxMGMwKSwgCi0gIFdUQzAoMHhkYWU4NTBjMCksIFdUQzAoMHhkYTlhNmJjMCksIFdUQzAoMHhkYTRkNTY0MCksIFdUQzAoMHhkYTAxMDY0MCksIFdUQzAoMHhkOWI1NjY0MCksIFdUQzAoMHhkOTZhNTcwMCksIFdUQzAoMHhkOTFmYjcwMCksIFdUQzAoMHhkOGQ1NjYwMCksIAotICBXVEMwKDB4ZDg4YjRhNDApLCBXVEMwKDB4ZDg0MTRmMDApLCBXVEMwKDB4ZDdmNzVmODApLCBXVEMwKDB4ZDdhZDY3NDApLCBXVEMwKDB4ZDc2MzUyYzApLCBXVEMwKDB4ZDcxOTEwNDApLCBXVEMwKDB4ZDZjZThjODApLCBXVEMwKDB4ZDY4M2JkMDApLCAKLSAgV1RDMCgweGQ2MzhhNWMwKSwgV1RDMCgweGQ1ZWQ0ZjgwKSwgV1RDMCgweGQ1YTFjMjQwKSwgV1RDMCgweGQ1NTYyYjgwKSwgV1RDMCgweGQ1MGFlNTAwKSwgV1RDMCgweGQ0YzA0YzgwKSwgV1RDMCgweGQ0NzZiYjQwKSwgV1RDMCgweGQ0MmU2MmMwKSwgCi0gIFdUQzAoMHhkM2U3NTY4MCksIFdUQzAoMHhkM2ExYWQwMCksIFdUQzAoMHhkMzVkNjc4MCksIFdUQzAoMHhkMzFhNDMwMCksIFdUQzAoMHhkMmQ3ZGMwMCksIFdUQzAoMHhkMjk1ZDA4MCksIFdUQzAoMHhkMjUzZDhjMCksIFdUQzAoMHhkMjExZGY0MCksIAotICBXVEMwKDB4ZDFjZmRiYzApLCBXVEMwKDB4ZDE4ZGM0ODApLCBXVEMwKDB4ZDE0YjlkYzApLCBXVEMwKDB4ZDEwOTdjODApLCBXVEMwKDB4ZDBjNzc3MDApLCBXVEMwKDB4ZDA4NWE1MDApLCBXVEMwKDB4ZDA0NDJmNDApLCBXVEMwKDB4ZDAwMzRhODApLCAKLSAgV1RDMCgweGNmYzMyYzAwKSwgV1RDMCgweGNmODQwNDAwKSwgV1RDMCgweGNmNDVmNDAwKSwgV1RDMCgweGNmMDkxM2MwKSwgV1RDMCgweGNlY2Q4MDAwKSwgV1RDMCgweGNlOTMyYzgwKSwgV1RDMCgweGNlNTliZjQwKSwgV1RDMCgweGNlMjBjZDQwKSwgCi0gIFdUQzAoMHhjZGU3ZWM0MCksIFdUQzAoMHhjZGFlZWRjMCksIFdUQzAoMHhjZDc1ZWEwMCksIFdUQzAoMHhjZDNjZmVjMCksIFdUQzAoMHhjZDA0NGI0MCksIFdUQzAoMHhjY2NiZmYwMCksIFdUQzAoMHhjYzk0NTQ4MCksIFdUQzAoMHhjYzVkODc4MCksIAotICBXVEMwKDB4Y2MyN2MzYzApLCBXVEMwKDB4Y2JmMmZjNDApLCBXVEMwKDB4Y2JiZjBhMDApLCBXVEMwKDB4Y2I4YmM3YzApLCBXVEMwKDB4Y2I1OTE4ODApLCBXVEMwKDB4Y2IyNmYwYzApLCBXVEMwKDB4Y2FmNTQ5ODApLCBXVEMwKDB4Y2FjNDFhYzApLCAKLSAgV1RDMCgweGNhOTM2NDQwKSwgV1RDMCgweGNhNjMyZDgwKSwgV1RDMCgweGNhMzM3ZjAwKSwgV1RDMCgweGNhMDQ2MTgwKSwgV1RDMCgweGM5ZDVkZDQwKSwgV1RDMCgweGM5YTdmYTgwKSwgV1RDMCgweGM5N2FjMjAwKSwgV1RDMCgweGM5NGUzYzAwKSwgCi0gIFdUQzAoMHhjOTFkMTg0MCksIFdUQzAoMHhjOGYxNTk4MCksIFdUQzAoMHhjOGM1MjM0MCksIFdUQzAoMHhjODk4ODEwMCksIFdUQzAoMHhjODZiN2YwMCksIFdUQzAoMHhjODNlMjhjMCksIFdUQzAoMHhjODEwOGE4MCksIFdUQzAoMHhjN2UyYWZjMCksIAotICBXVEMwKDB4YzdiNGE0ODApLCBXVEMwKDB4Yzc4Njc0ODApLCBXVEMwKDB4Yzc1ODJiNDApLCBXVEMwKDB4YzcyOWNjODApLCBXVEMwKDB4YzZmYjU3MDApLCBXVEMwKDB4YzZjY2NhNDApLCBXVEMwKDB4YzY5ZTIxODApLCBXVEMwKDB4YzY2ZjQ5YzApLCAKLSAgV1RDMCgweGM2NDAyOWMwKSwgV1RDMCgweGM2MTBhNzQwKSwgV1RDMCgweGM1ZTBiZmMwKSwgV1RDMCgweGM1YjA5ZTgwKSwgV1RDMCgweGM1ODA3OTAwKSwgV1RDMCgweGM1NTA4NDQwKSwgV1RDMCgweGM1MjBlODQwKSwgV1RDMCgweGM0ZjFiZGMwKSwgCi0gIFdUQzAoMHhjNGMzMWQwMCksIFdUQzAoMHhjNDk1MTc4MCksIFdUQzAoMHhjNDY3OGEwMCksIFdUQzAoMHhjNDNhMjhjMCksIFdUQzAoMHhjNDBjYTgwMCksIFdUQzAoMHhjM2RlY2NjMCksIFdUQzAoMHhjM2IwOTk0MCksIFdUQzAoMHhjMzgyMmMwMCksIAotICBXVEMwKDB4YzM1M2EwYzApLCBXVEMwKDB4YzMyNTE3NDApLCBXVEMwKDB4YzJmNmI1MDApLCBXVEMwKDB4YzJjOGExNDApLCBXVEMwKDB4YzI5YjAyYzApLCBXVEMwKDB4YzI2ZGY1YzApLCBXVEMwKDB4YzI0MTg5NDApLCBXVEMwKDB4YzIxNWNiYzApLCAKLSAgV1RDMCgweGMxZWFjYTAwKSwgV1RDMCgweGMxYzA4NjgwKSwgV1RDMCgweGMxOTZmYjAwKSwgV1RDMCgweGMxNmUyMmMwKSwgV1RDMCgweGMxNDVmMDQwKSwgV1RDMCgweGMxMWUzYTgwKSwgV1RDMCgweGMwZjZjYzAwKSwgV1RDMCgweGMwY2Y2ZWMwKSwgCi0gIFdUQzAoMHhjMGE4MDJjMCksIFdUQzAoMHhjMDgwOTI4MCksIFdUQzAoMHhjMDU5MzM0MCksIFdUQzAoMHhjMDMxZjg4MCksIFdUQzAoMHhjMDBiMDRjMCksIFdUQzAoMHhiZmU0ODk4MSksIFdUQzAoMHhiZmJlYmI4MSksIFdUQzAoMHhiZjk5Y2IwMSksIAotICBXVEMwKDB4YmY3NWNjODEpLCBXVEMwKDB4YmY1MmMxMDEpLCBXVEMwKDB4YmYzMGE5MDEpLCBXVEMwKDB4YmYwZjgzMDEpLCBXVEMwKDB4YmVlZjQ2MDEpLCBXVEMwKDB4YmVjZmU2MDEpLCBXVEMwKDB4YmViMTU3MDEpLCBXVEMwKDB4YmU5MzhjODEpLCAKLSAgV1RDMCgweGJlNzY3ZTgxKSwgV1RDMCgweGJlNWEyMzAxKSwgV1RDMCgweGJlM2U3MjAxKSwgV1RDMCgweGJlMjM2MDAxKSwgV1RDMCgweGJlMDhlMTgxKSwgV1RDMCgweGJkZWVlOTgxKSwgV1RDMCgweGJkZDU2YjgxKSwgV1RDMCgweGJkYmM2MzgxKSwgCi0gIFdUQzAoMHhiZGEzZDA4MSksIFdUQzAoMHhiZDhiYjI4MSksIFdUQzAoMHhiZDc0MGI4MSksIFdUQzAoMHhiZDVjZTI4MSksIFdUQzAoMHhiZDQ2NDI4MSksIFdUQzAoMHhiZDMwMzU4MSksIFdUQzAoMHhiZDFhYzgwMSksIFdUQzAoMHhiZDA2MGM4MSksIAotICBXVEMwKDB4YmNmMjE2MDEpLCBXVEMwKDB4YmNkZWY3MDEpLCBXVEMwKDB4YmNjY2JkMDEpLCBXVEMwKDB4YmNiYjcwMDEpLCBXVEMwKDB4YmNhYjE3ODEpLCBXVEMwKDB4YmM5YmI5MDEpLCBXVEMwKDB4YmM4ZDUxMDEpLCBXVEMwKDB4YmM3ZmQzMDEpLCAKLSAgV1RDMCgweGJjNzMzNDAxKSwgV1RDMCgweGJjNjc2NTAxKSwgV1RDMCgweGJjNWM0YzgxKSwgV1RDMCgweGJjNTFjYjAxKSwgV1RDMCgweGJjNDdjMjgxKSwgV1RDMCgweGJjM2UxOTgxKSwgV1RDMCgweGJjMzRjMDgxKSwgV1RDMCgweGJjMmJhYjAxKSwgCi0gIFdUQzAoMHhiYzIyY2Q4MSksIFdUQzAoMHhiYzFhMjQwMSksIFdUQzAoMHhiYzExYjY4MSksIFdUQzAoMHhiYzA5OGQ4MSksIFdUQzAoMHhiYzAxYjM4MSksIFdUQzAoMHhiYmZhM2MwMSksIFdUQzAoMHhiYmYzNDI4MSksIFdUQzAoMHhiYmVjZTI4MSksIAotICBXVEMwKDB4YmJlNzMyMDEpLCBXVEMwKDB4YmJlMjMyODEpLCBXVEMwKDB4YmJkZGRiMDEpLCBXVEMwKDB4YmJkYTI1MDEpLCBXVEMwKDB4YmJkNzAyMDEpLCBXVEMwKDB4YmJkNDU2MDEpLCBXVEMwKDB4YmJkMjAzMDEpLCBXVEMwKDB4YmJjZmVhODEpLCAKLSAgV1RDMCgweGJiY2UwNjAxKSwgV1RDMCgweGJiY2M2YjAxKSwgV1RDMCgweGJiY2IzMjAxKSwgV1RDMCgweGJiY2E3NDgxKSwgV1RDMCgweGJiY2E1ZDAxKSwgV1RDMCgweGJiY2IyMjgxKSwgV1RDMCgweGJiY2NmYzgxKSwgV1RDMCgweGJiZDAxMzAxKSwgCi0gIFdUQzAoMHhiYmQ0NTg4MSksIFdUQzAoMHhiYmQ5YTc4MSksIFdUQzAoMHhiYmRmZGI4MSksIFdUQzAoMHhiYmU2YzgwMSksIFdUQzAoMHhiYmVlMmY4MSksIFdUQzAoMHhiYmY1ZDE4MSksIFdUQzAoMHhiYmZkNmMwMSksIFdUQzAoMHhiYzA0ZTM4MSksIAotICBXVEMwKDB4YmMwYzQ1ODEpLCBXVEMwKDB4YmMxM2E0ODEpLCBXVEMwKDB4YmMxYjEwODEpLCBXVEMwKDB4YmMyMjhmMDEpLCBXVEMwKDB4YmMyYTFhODEpLCBXVEMwKDB4YmMzMWFmMDEpLCBXVEMwKDB4YmMzOTQ5MDEpLCBXVEMwKDB4YmM0MGU4ODEpLCAKLSAgV1RDMCgweGJjNDg4ZTgxKSwgV1RDMCgweGJjNTAzYjgxKSwgV1RDMCgweGJjNTdmMTAxKSwgV1RDMCgweGJjNWZhZTgxKSwgV1RDMCgweGJjNjc3NTAxKSwgV1RDMCgweGJjNmY0NDAxKSwgV1RDMCgweGJjNzcxYzAxKSwgV1RDMCgweGJjN2VmYzgxKSwgCi0gIFdUQzAoMHhiYzg2ZTU4MSksIFdUQzAoMHhiYzhlZDcwMSksIFdUQzAoMHhiYzk2ZDEwMSksIFdUQzAoMHhiYzllZDQ4MSksIFdUQzAoMHhiY2E2ZTEwMSksIFdUQzAoMHhiY2FlZjcwMSksIFdUQzAoMHhiY2I3MTcwMSksIFdUQzAoMHhiY2JmNDAwMSksIAotICBXVEMwKDB4YmNjNzcxODEpLCBXVEMwKDB4YmNjZmFjMDEpLCBXVEMwKDB4YmNkN2VmMDEpLCBXVEMwKDB4YmNlMDNiODEpLCBXVEMwKDB4YmNlODkyODEpLCBXVEMwKDB4YmNmMGYzODEpLCBXVEMwKDB4YmNmOTVlODEpLCBXVEMwKDB4YmQwMWQyODEpLCAKLSAgV1RDMCgweGJkMGE0ZjgxKSwgV1RDMCgweGJkMTJkNTgxKSwgV1RDMCgweGJkMWI2NTAxKSwgV1RDMCgweGJkMjNmZjAxKSwgV1RDMCgweGJkMmNhMjgxKSwgV1RDMCgweGJkMzU1MDgxKSwgV1RDMCgweGJkM2UwODAxKSwgV1RDMCgweGJkNDZjODAxKSwgCi0gIFdUQzAoMHhiZDRmOTEwMSksIFdUQzAoMHhiZDU4NjI4MSksIFdUQzAoMHhiZDYxM2Q4MSksIFdUQzAoMHhiZDZhMjIwMSksIFdUQzAoMHhiZDczMTA4MSksIFdUQzAoMHhiZDdjMDc4MSksIFdUQzAoMHhiZDg1MDcwMSksIFdUQzAoMHhiZDhlMGUwMSksIAotICBXVEMwKDB4YmQ5NzFjODEpLCBXVEMwKDB4YmRhMDMzODEpLCBXVEMwKDB4YmRhOTUzMDEpLCBXVEMwKDB4YmRiMjdiMDEpLCBXVEMwKDB4YmRiYmFiMDEpLCBXVEMwKDB4YmRjNGUzMDEpLCBXVEMwKDB4YmRjZTIxODEpLCBXVEMwKDB4YmRkNzY3MDEpLCAKLSAgV1RDMCgweGJkZTBiMzAxKSwgV1RDMCgweGJkZWEwNjgxKSwgV1RDMCgweGJkZjM2MTAxKSwgV1RDMCgweGJkZmNjMzAxKSwgV1RDMCgweGJlMDYyYjgxKSwgV1RDMCgweGJlMGY5YTAxKSwgV1RDMCgweGJlMTkwZDgxKSwgV1RDMCgweGJlMjI4NjgxKSwgCi0gIFdUQzAoMHhiZTJjMDUwMSksIFdUQzAoMHhiZTM1ODkwMSksIFdUQzAoMHhiZTNmMTM4MSksIFdUQzAoMHhiZTQ4YTMwMSksIFdUQzAoMHhiZTUyMzc4MSksIFdUQzAoMHhiZTViZDAwMSksIFdUQzAoMHhiZTY1NmMwMSksIFdUQzAoMHhiZTZmMGMwMSksIAotICBXVEMwKDB4YmU3OGIwMDEpLCBXVEMwKDB4YmU4MjU4MDEpLCBXVEMwKDB4YmU4YzA1MDEpLCBXVEMwKDB4YmU5NWI1ODEpLCBXVEMwKDB4YmU5ZjY5MDEpLCBXVEMwKDB4YmVhOTFmMDEpLCBXVEMwKDB4YmViMmQ2ODEpLCBXVEMwKDB4YmViYzkxODEpLCAKLSAgV1RDMCgweGJlYzY0ZTgxKSwgV1RDMCgweGJlZDAwZjgxKSwgV1RDMCgweGJlZDlkMjgxKSwgV1RDMCgweGJlZTM5ODAxKSwgV1RDMCgweGJlZWQ1ZjAxKSwgV1RDMCgweGJlZjcyNjgxKSwgV1RDMCgweGJmMDBlZjgxKSwgV1RDMCgweGJmMGFiYTAxKSwgCi0gIFdUQzAoMHhiZjE0ODY4MSksIFdUQzAoMHhiZjFlNTUwMSksIFdUQzAoMHhiZjI4MjUwMSksIFdUQzAoMHhiZjMxZjUwMSksIFdUQzAoMHhiZjNiYzYwMSksIFdUQzAoMHhiZjQ1OTY4MSksIFdUQzAoMHhiZjRmNjgwMSksIFdUQzAoMHhiZjU5M2EwMSksIAotICBXVEMwKDB4YmY2MzBkODEpLCBXVEMwKDB4YmY2Y2UyMDEpLCBXVEMwKDB4YmY3NmI3MDEpLCBXVEMwKDB4YmY4MDhiODEpLCBXVEMwKDB4YmY4YTVmODEpLCBXVEMwKDB4YmY5NDMzMDEpLCBXVEMwKDB4YmY5ZTA3MDEpLCBXVEMwKDB4YmZhN2RjMDEpLCAKLSAgV1RDMCgweGJmYjFiMTAxKSwgV1RDMCgweGJmYmI4NzAxKSwgV1RDMCgweGJmYzU1YzgxKSwgV1RDMCgweGJmY2YzMTgxKSwgV1RDMCgweGJmZDkwNjAxKSwgV1RDMCgweGJmZTJkOTAxKSwgV1RDMCgweGJmZWNhYTgxKSwgV1RDMCgweGJmZjY3YTAxKSwgCi0gIC8qIHBhcnQgMSAqLwotICBXVEMxKDB4ODAxMzA5ODEpLCBXVEMxKDB4ODAyNjlmODEpLCBXVEMxKDB4ODAzYTMzODEpLCBXVEMxKDB4ODA0ZGM0ODEpLCBXVEMxKDB4ODA2MTUyODEpLCBXVEMxKDB4ODA3NGRjMDEpLCBXVEMxKDB4ODA4ODYwODEpLCBXVEMxKDB4ODA5YmRmMDEpLCAKLSAgV1RDMSgweDgwYWY1NzAxKSwgV1RDMSgweDgwYzJjNzgxKSwgV1RDMSgweDgwZDYzMTAxKSwgV1RDMSgweDgwZTk5NDAxKSwgV1RDMSgweDgwZmNmMTgxKSwgV1RDMSgweDgxMTA0YTAxKSwgV1RDMSgweDgxMjM5ZDgxKSwgV1RDMSgweDgxMzZlYTAxKSwgCi0gIFdUQzEoMHg4MTRhMmY4MSksIFdUQzEoMHg4MTVkNmMwMSksIFdUQzEoMHg4MTcwYTE4MSksIFdUQzEoMHg4MTgzY2Y4MSksIFdUQzEoMHg4MTk2Zjc4MSksIFdUQzEoMHg4MWFhMTk4MSksIFdUQzEoMHg4MWJkMzQwMSksIFdUQzEoMHg4MWQwNDY4MSksIAotICBXVEMxKDB4ODFlMzRmODEpLCBXVEMxKDB4ODFmNjRmMDEpLCBXVEMxKDB4ODIwOTQ1ODEpLCBXVEMxKDB4ODIxYzM0MDEpLCBXVEMxKDB4ODIyZjFiMDEpLCBXVEMxKDB4ODI0MWZhMDEpLCBXVEMxKDB4ODI1NGNmMDEpLCBXVEMxKDB4ODI2Nzk5MDEpLCAKLSAgV1RDMSgweDgyN2E1ODAxKSwgV1RDMSgweDgyOGQwYjAxKSwgV1RDMSgweDgyOWZiNDAxKSwgV1RDMSgweDgyYjI1MzAxKSwgV1RDMSgweDgyYzRlODAxKSwgV1RDMSgweDgyZDc3MjAxKSwgV1RDMSgweDgyZTllZjAxKSwgV1RDMSgweDgyZmM1ZjAxKSwgCi0gIFdUQzEoMHg4MzBlYzA4MSksIFdUQzEoMHg4MzIxMTUwMSksIFdUQzEoMHg4MzMzNWM4MSksIFdUQzEoMHg4MzQ1OTg4MSksIFdUQzEoMHg4MzU3YzcwMSksIFdUQzEoMHg4MzY5ZTc4MSksIFdUQzEoMHg4MzdiZjgwMSksIFdUQzEoMHg4MzhkZjgwMSksIAotICBXVEMxKDB4ODM5ZmU4MDEpLCBXVEMxKDB4ODNiMWM4ODEpLCBXVEMxKDB4ODNjMzlhODEpLCBXVEMxKDB4ODNkNTVkMDEpLCBXVEMxKDB4ODNlNzBmMDEpLCBXVEMxKDB4ODNmOGIwMDEpLCBXVEMxKDB4ODQwYTNlODEpLCBXVEMxKDB4ODQxYmI5ODEpLCAKLSAgV1RDMSgweDg0MmQyMjgxKSwgV1RDMSgweDg0M2U3YTgxKSwgV1RDMSgweDg0NGZjMDgxKSwgV1RDMSgweDg0NjBmNTgxKSwgV1RDMSgweDg0NzIxNzAxKSwgV1RDMSgweDg0ODMyNDgxKSwgV1RDMSgweDg0OTQxZDgxKSwgV1RDMSgweDg0YTUwMjAxKSwgCi0gIFdUQzEoMHg4NGI1ZDMwMSksIFdUQzEoMHg4NGM2OTEwMSksIFdUQzEoMHg4NGQ3M2MwMSksIFdUQzEoMHg4NGU3ZDM4MSksIFdUQzEoMHg4NGY4NTU4MSksIFdUQzEoMHg4NTA4YzE4MSksIFdUQzEoMHg4NTE5MTgwMSksIFdUQzEoMHg4NTI5NTg4MSksIAotICBXVEMxKDB4ODUzOTg0ODEpLCBXVEMxKDB4ODU0OTlkMDEpLCBXVEMxKDB4ODU1OWEwODEpLCBXVEMxKDB4ODU2OThlODEpLCBXVEMxKDB4ODU3OTY2MDEpLCBXVEMxKDB4ODU4OTI2ODEpLCBXVEMxKDB4ODU5OGQwODEpLCBXVEMxKDB4ODVhODY1ODEpLCAKLSAgV1RDMSgweDg1YjdlNjAxKSwgV1RDMSgweDg1Yzc1MjAxKSwgV1RDMSgweDg1ZDZhOTgxKSwgV1RDMSgweDg1ZTVlYjgxKSwgV1RDMSgweDg1ZjUxNjgxKSwgV1RDMSgweDg2MDQyYzAxKSwgV1RDMSgweDg2MTMyYzAxKSwgV1RDMSgweDg2MjIxODAxKSwgCi0gIFdUQzEoMHg4NjMwZjE4MSksIFdUQzEoMHg4NjNmYjcwMSksIFdUQzEoMHg4NjRlNjkwMSksIFdUQzEoMHg4NjVkMDU4MSksIFdUQzEoMHg4NjZiOGQ4MSksIFdUQzEoMHg4NjdhMDA4MSksIFdUQzEoMHg4Njg4NjAwMSksIFdUQzEoMHg4Njk2YWQwMSksIAotICBXVEMxKDB4ODZhNGU3ODEpLCBXVEMxKDB4ODZiMzBmMDEpLCBXVEMxKDB4ODZjMTI0MDEpLCBXVEMxKDB4ODZjZjI2MDEpLCBXVEMxKDB4ODZkZDE0ODEpLCBXVEMxKDB4ODZlYWYwODEpLCBXVEMxKDB4ODZmOGJhODEpLCBXVEMxKDB4ODcwNjcyODEpLCAKLSAgV1RDMSgweDg3MTQxYjAxKSwgV1RDMSgweDg3MjFiNDgxKSwgV1RDMSgweDg3MmY0MjAxKSwgV1RDMSgweDg3M2NjMjAxKSwgV1RDMSgweDg3NGEyZjAxKSwgV1RDMSgweDg3NTc4MTgxKSwgV1RDMSgweDg3NjRiMTAxKSwgV1RDMSgweDg3NzFjNjAxKSwgCi0gIFdUQzEoMHg4NzdlZGUwMSksIFdUQzEoMHg4NzhjMTg4MSksIFdUQzEoMHg4Nzk5OGYwMSksIFdUQzEoMHg4N2E3MGU4MSksIFdUQzEoMHg4N2I0MjQ4MSksIFdUQzEoMHg4N2MwNWU4MSksIFdUQzEoMHg4N2NiNTEwMSksIFdUQzEoMHg4N2Q0YWM4MSksIAotICBXVEMxKDB4ODdlNzNkODEpLCBXVEMxKDB4ODgxMjQyODEpLCBXVEMxKDB4ODgzNTM1MDEpLCBXVEMxKDB4ODg1Zjg0ODEpLCBXVEMxKDB4ODg4ZDMxODEpLCBXVEMxKDB4ODhiZTE2ODEpLCBXVEMxKDB4ODhmMTM4MDEpLCBXVEMxKDB4ODkyNWYxMDEpLCAKLSAgV1RDMSgweDg5NWJjZDAxKSwgV1RDMSgweDg5OTI1YTgxKSwgV1RDMSgweDg5YzkyZjgxKSwgV1RDMSgweDhhMDAxZjAxKSwgV1RDMSgweDhhMzcyODgxKSwgV1RDMSgweDhhNmU0YTAxKSwgV1RDMSgweDhhYTU4NjgxKSwgV1RDMSgweDhhZGNlZTAxKSwgCi0gIFdUQzEoMHg4YjE0OTcwMSksIFdUQzEoMHg4YjRjOTcwMSksIFdUQzEoMHg4Yjg1MDI4MSksIFdUQzEoMHg4YmJkZTk4MSksIFdUQzEoMHg4YmY3NWIwMSksIFdUQzEoMHg4YzMxNjY4MSksIFdUQzEoMHg4YzZjMWIwMSksIFdUQzEoMHg4Y2E3ODc4MSksIAotICBXVEMxKDB4OGNlM2JhODEpLCBXVEMxKDB4OGQyMGMzMDEpLCBXVEMxKDB4OGQ1ZWFhMDEpLCBXVEMxKDB4OGQ5ZDc3ODEpLCBXVEMxKDB4OGRkZDMyMDEpLCBXVEMxKDB4OGUxZGUwMDEpLCBXVEMxKDB4OGU1Zjg4ODEpLCBXVEMxKDB4OGVhMjMyMDEpLCAKLSAgV1RDMSgweDhlZTVlMzAxKSwgV1RDMSgweDhmMmFhMTAxKSwgV1RDMSgweDhmNzA2ZjAxKSwgV1RDMSgweDhmYjc0ZjgxKSwgV1RDMSgweDhmZmY0NjAxKSwgV1RDMSgweDkwNDg1NDAxKSwgV1RDMSgweDkwOTI3YjgxKSwgV1RDMSgweDkwZGRjMDAxKSwgCi0gIFdUQzEoMHg5MTJhMjIwMSksIFdUQzEoMHg5MTc3YTMwMSksIFdUQzEoMHg5MWM2NDMwMSksIFdUQzEoMHg5MjE2MDMwMSksIFdUQzEoMHg5MjY2ZTI4MSksIFdUQzEoMHg5MmI4ZTEwMSksIFdUQzEoMHg5MzBiZmY4MSksIFdUQzEoMHg5MzYwM2QwMSksIAotICBXVEMxKDB4OTNiNTk5MDEpLCBXVEMxKDB4OTQwYzEyODEpLCBXVEMxKDB4OTQ2M2E4ODEpLCBXVEMxKDB4OTRiYzU5ODEpLCBXVEMxKDB4OTUxNjIzODEpLCBXVEMxKDB4OTU3MTA2MDEpLCBXVEMxKDB4OTVjY2ZmMDEpLCBXVEMxKDB4OTYyYTBjODEpLCAKLSAgV1RDMSgweDk2ODgyZTAxKSwgV1RDMSgweDk2ZTc2MTAxKSwgV1RDMSgweDk3NDdhNDgxKSwgV1RDMSgweDk3YThmNjgxKSwgV1RDMSgweDk4MGI1NTAxKSwgV1RDMSgweDk4NmViZDgxKSwgV1RDMSgweDk4ZDMyZDgxKSwgV1RDMSgweDk5MzhhMjgxKSwgCi0gIFdUQzEoMHg5OTlmMTk4MSksIFdUQzEoMHg5YTA2OTAwMSksIFdUQzEoMHg5YTZmMDM4MSksIFdUQzEoMHg5YWQ4NzA4MSksIFdUQzEoMHg5YjQyZDU4MSksIFdUQzEoMHg5YmFlMmY4MSksIFdUQzEoMHg5YzFhN2M4MSksIFdUQzEoMHg5Yzg3YmE4MSksIAotICBXVEMxKDB4OWNmNWU3MDEpLCBXVEMxKDB4OWQ2NTAwODEpLCBXVEMxKDB4OWRkNTA0ODEpLCBXVEMxKDB4OWU0NWYwODEpLCBXVEMxKDB4OWViN2MxMDEpLCBXVEMxKDB4OWYyYTcyODEpLCBXVEMxKDB4OWY5ZTAzMDEpLCBXVEMxKDB4YTAxMjcwODEpLCAKLSAgV1RDMSgweGEwODdiOTgxKSwgV1RDMSgweGEwZmRkZDgxKSwgV1RDMSgweGExNzRkYTgxKSwgV1RDMSgweGExZWNhZTAxKSwgV1RDMSgweGEyNjU1NTgxKSwgV1RDMSgweGEyZGVjZTgxKSwgV1RDMSgweGEzNTkxODAxKSwgV1RDMSgweGEzZDQzMDAxKSwgCi0gIFdUQzEoMHhhNDUwMTYwMSksIFdUQzEoMHhhNGNjYzkwMSksIFdUQzEoMHhhNTRhNDcwMSksIFdUQzEoMHhhNWM4OTAwMSksIFdUQzEoMHhhNjQ3YTMwMSksIFdUQzEoMHhhNmM3N2UwMSksIFdUQzEoMHhhNzQ4MjEwMSksIFdUQzEoMHhhN2M5OGIwMSksIAotICBXVEMxKDB4YTg0YmJiODEpLCBXVEMxKDB4YThjZWIyMDEpLCBXVEMxKDB4YTk1MjZkODEpLCBXVEMxKDB4YTlkNmVmMDEpLCBXVEMxKDB4YWE1YzM2MDEpLCBXVEMxKDB4YWFlMjQzMDEpLCBXVEMxKDB4YWI2OTE2ODEpLCBXVEMxKDB4YWJmMGIxODEpLCAKLSAgV1RDMSgweGFjNzkxNDAxKSwgV1RDMSgweGFkMDIzZjAxKSwgV1RDMSgweGFkOGMzMzAxKSwgV1RDMSgweGFlMTZmMDAxKSwgV1RDMSgweGFlYTI3NjgxKSwgV1RDMSgweGFmMmVjOTAxKSwgV1RDMSgweGFmYmJlODAxKSwgV1RDMSgweGIwNDlkNjAxKSwgCi0gIFdUQzEoMHhiMGQ4OTQwMSksIFdUQzEoMHhiMTY4MjI4MSksIFdUQzEoMHhiMWY4ODE4MSksIFdUQzEoMHhiMjg5YjE4MSksIFdUQzEoMHhiMzFiYjMwMSksIFdUQzEoMHhiM2FlODYwMSksIFdUQzEoMHhiNDQyMmI4MSksIFdUQzEoMHhiNGQ2YTM4MSksIAotICBXVEMxKDB4NGE1YTMyN2YpLCBXVEMxKDB4NDljNGFkZmYpLCBXVEMxKDB4NDkyZTYzN2YpLCBXVEMxKDB4NDg5NzRmN2YpLCBXVEMxKDB4NDdmZjZkN2YpLCBXVEMxKDB4NDc2NmJhZmYpLCBXVEMxKDB4NDZjZDM1ZmYpLCBXVEMxKDB4NDYzMmRkN2YpLCAKLSAgV1RDMSgweDQ1OTdiMGZmKSwgV1RDMSgweDQ0ZmJiMWZmKSwgV1RDMSgweDQ0NWVlYWZmKSwgV1RDMSgweDQzYzE2NWZmKSwgV1RDMSgweDQzMjMyMjdmKSwgV1RDMSgweDQyODQyNzdmKSwgV1RDMSgweDQxZTQ4YWZmKSwgV1RDMSgweDQxNDQ1NTdmKSwgCi0gIFdUQzEoMHg0MGEzODY3ZiksIFdUQzEoMHg0MDAxZjVmZiksIFdUQzEoMHgzZjVmNWQ4MCksIFdUQzEoMHgzZWJiYWQwMCksIFdUQzEoMHgzZTE2ZWU0MCksIFdUQzEoMHgzZDcxM2QwMCksIFdUQzEoMHgzY2NhYjcwMCksIFdUQzEoMHgzYzIzNjUwMCksIAotICBXVEMxKDB4M2I3YjU4MDApLCBXVEMxKDB4M2FkMmVjYzApLCBXVEMxKDB4M2EyYTY1NDApLCBXVEMxKDB4Mzk4MWI3YzApLCBXVEMxKDB4MzhkOGJhMDApLCBXVEMxKDB4MzgyZjAxYzApLCBXVEMxKDB4Mzc4NDYyNDApLCBXVEMxKDB4MzZkOGViMDApLCAKLSAgV1RDMSgweDM2MmM5ZWMwKSwgV1RDMSgweDM1N2Y3YTAwKSwgV1RDMSgweDM0ZDE4MzQwKSwgV1RDMSgweDM0MjJjOTAwKSwgV1RDMSgweDMzNzM2YzQwKSwgV1RDMSgweDMyYzM5MDQwKSwgV1RDMSgweDMyMTM0MjgwKSwgV1RDMSgweDMxNjI5MjgwKSwgCi0gIFdUQzEoMHgzMGIxYTAwMCksIFdUQzEoMHgzMDAwODM4MCksIFdUQzEoMHgyZjRmNDI0MCksIFdUQzEoMHgyZTlkZjE4MCksIFdUQzEoMHgyZGVjYzc4MCksIFdUQzEoMHgyZDNiZDY0MCksIFdUQzEoMHgyYzhiMGNjMCksIFdUQzEoMHgyYmRhMzA4MCksIAotICBXVEMxKDB4MmIyOGVjODApLCBXVEMxKDB4MmE3NzM1MDApLCBXVEMxKDB4MjljNTFiNDApLCBXVEMxKDB4MjkxMjkzYzApLCBXVEMxKDB4Mjg1ZjkyODApLCBXVEMxKDB4MjdhYzM1YzApLCBXVEMxKDB4MjZmOGFiNDApLCBXVEMxKDB4MjY0NTRjMDApLCAKLSAgV1RDMSgweDI1OTI1NjAwKSwgV1RDMSgweDI0ZGZkNTgwKSwgV1RDMSgweDI0MmRkZDQwKSwgV1RDMSgweDIzN2M4N2MwKSwgV1RDMSgweDIyY2JlMjQwKSwgV1RDMSgweDIyMWJlZjQwKSwgV1RDMSgweDIxNmNiMDQwKSwgV1RDMSgweDIwYmUyODAwKSwgCi0gIFdUQzEoMHgyMDEwNWM4MCksIFdUQzEoMHgxZjYzNTJhMCksIFdUQzEoMHgxZWI3MTI0MCksIFdUQzEoMHgxZTBiYTE0MCksIFdUQzEoMHgxZDYwZmU0MCksIFdUQzEoMHgxY2I3MjNlMCksIFdUQzEoMHgxYzBlMDMwMCksIFdUQzEoMHgxYjY1OTZjMCksIAotICBXVEMxKDB4MWFiZGU4YTApLCBXVEMxKDB4MWExNmZiZTApLCBXVEMxKDB4MTk3MGM2ODApLCBXVEMxKDB4MThjYjQ4NDApLCBXVEMxKDB4MTgyNjhlMjApLCBXVEMxKDB4MTc4MmEwYzApLCBXVEMxKDB4MTZkZjg5NjApLCBXVEMxKDB4MTYzZDYzMDApLCAKLSAgV1RDMSgweDE1OWM1MmMwKSwgV1RDMSgweDE0ZmM4N2UwKSwgV1RDMSgweDE0NWUyYzgwKSwgV1RDMSgweDEzYzE1YjYwKSwgV1RDMSgweDEzMjYzMjQwKSwgV1RDMSgweDEyOGNkOWEwKSwgV1RDMSgweDExZjU2MmEwKSwgV1RDMSgweDExNWZjMWMwKSwgCi0gIFdUQzEoMHgxMGNiZjE2MCksIFdUQzEoMHgxMDM5ZjIwMCksIFdUQzEoMHgwZmE5YTA4MCksIFdUQzEoMHgwZjFhYmQ5MCksIFdUQzEoMHgwZThkMDFkMCksIFdUQzEoMHgwZTAwMzMzMCksIFdUQzEoMHgwZDc0MzU5MCksIFdUQzEoMHgwY2U4ZWY0MCksIAotICBXVEMxKDB4MGM1ZTE5MDApLCBXVEMxKDB4MGJkMzVkNzApLCBXVEMxKDB4MGI0ODhlYjApLCBXVEMxKDB4MGFiZDg0MTApLCBXVEMxKDB4MGEzMjBhMDApLCBXVEMxKDB4MDlhNjBlNzApLCBXVEMxKDB4MDkxOWFiMDApLCBXVEMxKDB4MDg4ZDBkZTApLCAKLSAgV1RDMSgweDA4MDA2NWUwKSwgV1RDMSgweDA3NzM5NzEwKSwgV1RDMSgweDA2ZTY1ODA4KSwgV1RDMSgweDA2NTg4MzQ4KSwgV1RDMSgweDA1Y2EwYWUwKSwgV1RDMSgweDA1M2FhYWY4KSwgV1RDMSgweDA0YTlmYWYwKSwgV1RDMSgweDA0MTdmNjk4KSwgCi0gIFdUQzEoMHgwMzg1OWZmNCksIFdUQzEoMHgwMmY0OWJlNCksIFdUQzEoMHgwMjY2YjY2OCksIFdUQzEoMHgwMWRlNTU0ZSksIFdUQzEoMHgwMTVmNTBjYSksIFdUQzEoMHgwMGViN2U1ZCksIFdUQzEoMHgwMDkwNGYyNCksIFdUQzEoMHgwMDIxMjg4OSksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICAvKiBwYXJ0IDIgKi8KLSAgV1RDMigweGZmZmVjZTAyKSwgV1RDMigweGZmZTRjM2RmKSwgV1RDMigweGZmY2FhYTU1KSwgV1RDMigweGZmYjA4N2QxKSwgV1RDMigweGZmOTY2MmJmKSwgV1RDMigweGZmN2M0MThiKSwgV1RDMigweGZmNjIyYWEwKSwgV1RDMigweGZmNDgyNDZjKSwgCi0gIFdUQzIoMHhmZjJlMzU1YSksIFdUQzIoMHhmZjE0NjNkYiksIFdUQzIoMHhmZWZhYjYwOCksIFdUQzIoMHhmZWUxMmYwYSksIFdUQzIoMHhmZWM3Y2ZkMiksIFdUQzIoMHhmZWFlOTk1YSksIFdUQzIoMHhmZTk1OGNjNCksIFdUQzIoMHhmZTdjYWJjZSksIAotICBXVEMyKDB4ZmU2M2Y4ODIpLCBXVEMyKDB4ZmU0Yjc0ZTApLCBXVEMyKDB4ZmUzMzIyZjYpLCBXVEMyKDB4ZmUxYjA0ZGMpLCBXVEMyKDB4ZmUwMzFjY2MpLCBXVEMyKDB4ZmRlYjZjZjApLCBXVEMyKDB4ZmRkM2ZmN2MpLCBXVEMyKDB4ZmRiY2U4MzQpLCAKLSAgV1RDMigweGZkYTYzYmI4KSwgV1RDMigweGZkOTAwYzY4KSwgV1RDMigweGZkN2E1OTBjKSwgV1RDMigweGZkNjUxMWI0KSwgV1RDMigweGZkNTAyNmMwKSwgV1RDMigweGZkM2I4OTU0KSwgV1RDMigweGZkMjcyZGYwKSwgV1RDMigweGZkMTMwYWRjKSwgCi0gIFdUQzIoMHhmY2ZmMTVhYyksIFdUQzIoMHhmY2ViNGE2OCksIFdUQzIoMHhmY2Q3YjExMCksIFdUQzIoMHhmY2M0NTRkMCksIFdUQzIoMHhmY2IxNDA2NCksIFdUQzIoMHhmYzllODk2YyksIFdUQzIoMHhmYzhjNTI2NCksIFdUQzIoMHhmYzdhYmVmMCksIAotICBXVEMyKDB4ZmM2OWYwNzgpLCBXVEMyKDB4ZmM1OWY1ZTgpLCBXVEMyKDB4ZmM0YWNmZWMpLCBXVEMyKDB4ZmMzYzgwNjApLCBXVEMyKDB4ZmMyZjAyNjQpLCBXVEMyKDB4ZmMyMjNiN2MpLCBXVEMyKDB4ZmMxNjA3MTQpLCBXVEMyKDB4ZmMwYTQxNTApLCAKLSAgV1RDMigweGZiZmVjOTIwKSwgV1RDMigweGZiZjM4MzIwKSwgV1RDMigweGZiZTg1NWQwKSwgV1RDMigweGZiZGQyNzQwKSwgV1RDMigweGZiZDFmYzY4KSwgV1RDMigweGZiYzZmZWEwKSwgV1RDMigweGZiYmM1YTQ4KSwgV1RDMigweGZiYjIzYjQ4KSwgCi0gIFdUQzIoMHhmYmE4Y2E3OCksIFdUQzIoMHhmYmEwMmU1MCksIFdUQzIoMHhmYjk4OGRlMCksIFdUQzIoMHhmYjkyMGI0MCksIFdUQzIoMHhmYjhjYjg3MCksIFdUQzIoMHhmYjg4OWY2OCksIFdUQzIoMHhmYjg1Y2JlOCksIFdUQzIoMHhmYjg0M2RkMCksIAotICBXVEMyKDB4ZmI4M2RmNzgpLCBXVEMyKDB4ZmI4NDk1ZDApLCBXVEMyKDB4ZmI4NjQ2NjApLCBXVEMyKDB4ZmI4OGQ0YTgpLCBXVEMyKDB4ZmI4YzIxZTgpLCBXVEMyKDB4ZmI5MDBmMjgpLCBXVEMyKDB4ZmI5NDdkYzApLCBXVEMyKDB4ZmI5OTUwYzApLCAKLSAgV1RDMigweGZiOWU2ZDA4KSwgV1RDMigweGZiYTNiNjU4KSwgV1RDMigweGZiYTkxOTA4KSwgV1RDMigweGZiYWU5ZTA4KSwgV1RDMigweGZiYjQ1YmQwKSwgV1RDMigweGZiYmE2NmY4KSwgV1RDMigweGZiYzBkY2YwKSwgV1RDMigweGZiYzdlYWQ4KSwgCi0gIFdUQzIoMHhmYmNmYzIwMCksIFdUQzIoMHhmYmQ4OTMzMCksIFdUQzIoMHhmYmUyOTRkMCksIFdUQzIoMHhmYmVlMDNkMCksIFdUQzIoMHhmYmZiMWRlOCksIFdUQzIoMHhmYzBhMWRhNCksIFdUQzIoMHhmYzFiMjJlMCksIFdUQzIoMHhmYzJlMzhmMCksIAotICBXVEMyKDB4ZmM0MzZkNDgpLCBXVEMyKDB4ZmM1YWJmN2MpLCBXVEMyKDB4ZmM3NDAyNGMpLCBXVEMyKDB4ZmM4ZWYyZTgpLCBXVEMyKDB4ZmNhYjUxYWMpLCBXVEMyKDB4ZmNjOGQwMjQpLCBXVEMyKDB4ZmNlNzA0ZjApLCBXVEMyKDB4ZmQwNTgwY2MpLCAKLSAgV1RDMigweGZkMjNkNGQwKSwgV1RDMigweGZkNDFjZTQwKSwgV1RDMigweGZkNWY4MWIwKSwgV1RDMigweGZkN2QwOGYwKSwgV1RDMigweGZkOWE4NTYwKSwgV1RDMigweGZkYjg1OTM4KSwgV1RDMigweGZkZDcxNzk4KSwgV1RDMigweGZkZjc1M2I4KSwgCi0gIFdUQzIoMHhmZTE5OTNlZSksIFdUQzIoMHhmZTNlMzBmOCksIFdUQzIoMHhmZTY1NmNiYSksIFdUQzIoMHhmZThmOGZkYyksIFdUQzIoMHhmZWJjYThhNCksIFdUQzIoMHhmZWVjNTkwZSksIFdUQzIoMHhmZjFlMjg1YyksIFdUQzIoMHhmZjUxYTBiNyksIAotICBXVEMyKDB4ZmY4NjYzMzApLCBXVEMyKDB4ZmZiYzJjYmIpLCBXVEMyKDB4ZmZmMmJiZmYpLCBXVEMyKDB4MDAyOWQ3OWQpLCBXVEMyKDB4MDA2MThhMjIpLCBXVEMyKDB4MDA5YTExODUpLCBXVEMyKDB4MDBkM2FhOGMpLCBXVEMyKDB4MDEwZThmZjYpLCAKLSAgV1RDMigweDAxNGFmMjllKSwgV1RDMigweDAxODhmZTU2KSwgV1RDMigweDAxYzhlMTA4KSwgV1RDMigweDAyMGFiM2M0KSwgV1RDMigweDAyNGU2OGE4KSwgV1RDMigweDAyOTNlODI0KSwgV1RDMigweDAyZGIxYmM4KSwgV1RDMigweDAzMjNmMWE0KSwgCi0gIFdUQzIoMHgwMzZlNWQ2YyksIFdUQzIoMHgwM2JhNTMyMCksIFdUQzIoMHgwNDA3YzkzOCksIFdUQzIoMHgwNDU2Y2FkMCksIFdUQzIoMHgwNGE3NzI4OCksIFdUQzIoMHgwNGY5ZGI4OCksIFdUQzIoMHgwNTRlMTg4OCksIFdUQzIoMHgwNWE0MWVmMCksIAotICBXVEMyKDB4MDVmYmQ2ZTApLCBXVEMyKDB4MDY1NTI4YzApLCBXVEMyKDB4MDZiMDA4MzgpLCBXVEMyKDB4MDcwYzdlZTApLCBXVEMyKDB4MDc2YTliYjApLCBXVEMyKDB4MDdjYTZkMTApLCBXVEMyKDB4MDgyYzA4ZTApLCBXVEMyKDB4MDg4ZjhkYTApLCAKLSAgV1RDMigweDA4ZjUxYWMwKSwgV1RDMigweDA5NWNjYzIwKSwgV1RDMigweDA5YzY5ZjcwKSwgV1RDMigweDBhMzI3YjQwKSwgV1RDMigweDBhYTA0NmQwKSwgV1RDMigweDBiMGZlYmIwKSwgV1RDMigweDBiODE1ZGQwKSwgV1RDMigweDBiZjQ5NjAwKSwgCi0gIFdUQzIoMHgwYzY5OGM1MCksIFdUQzIoMHgwY2UwM2JhMCksIFdUQzIoMHgwZDU4YTM4MCksIFdUQzIoMHgwZGQyYzUxMCksIFdUQzIoMHgwZTRlYTExMCksIFdUQzIoMHgwZWNjM2RkMCksIFdUQzIoMHgwZjRiYTgwMCksIFdUQzIoMHgwZmNjZWQxMCksIAotICBXVEMyKDB4MTA1MDE5NjApLCBXVEMyKDB4MTBkNTMyYTApLCBXVEMyKDB4MTE1YzM5YzApLCBXVEMyKDB4MTFlNTJmYTApLCBXVEMyKDB4MTI3MDE1NjApLCBXVEMyKDB4MTJmY2VmMjApLCBXVEMyKDB4MTM4YmMyMDApLCBXVEMyKDB4MTQxYzkzMDApLCAKLSAgV1RDMigweDE0YWY2NGEwKSwgV1RDMigweDE1NDQzNGUwKSwgV1RDMigweDE1ZGIwMDIwKSwgV1RDMigweDE2NzNjMzYwKSwgV1RDMigweDE3MGU3ZTgwKSwgV1RDMigweDE3YWIzNWUwKSwgV1RDMigweDE4NDllZTQwKSwgV1RDMigweDE4ZWFhYmEwKSwgCi0gIFdUQzIoMHgxOThkNmYwMCksIFdUQzIoMHgxYTMyMzZhMCksIFdUQzIoMHgxYWQ5MDA4MCksIFdUQzIoMHgxYjgxY2M2MCksIFdUQzIoMHgxYzJjOWRhMCksIFdUQzIoMHgxY2Q5Nzk4MCksIFdUQzIoMHgxZDg4NjVjMCksIFdUQzIoMHgxZTM5NjU0MCksIAotICBXVEMyKDB4MWVlYzc3MDApLCBXVEMyKDB4MWZhMTk4YzApLCBXVEMyKDB4MjA1OGM4NDApLCBXVEMyKDB4MjExMjA2NDApLCBXVEMyKDB4MjFjZDU3MDApLCBXVEMyKDB4MjI4YWJlYzApLCBXVEMyKDB4MjM0YTQxODApLCBXVEMyKDB4MjQwYmRmODApLCAKLSAgV1RDMigweDI0Y2Y5NWMwKSwgV1RDMigweDI1OTU2MWMwKSwgV1RDMigweDI2NWQ0MjAwKSwgV1RDMigweDI3MjczODQwKSwgV1RDMigweDI3ZjM0OGMwKSwgV1RDMigweDI4YzE3NzAwKSwgV1RDMigweDI5OTFjNTAwKSwgV1RDMigweDJhNjQzMDgwKSwgCi0gIFdUQzIoMHgyYjM4YjY4MCksIFdUQzIoMHgyYzBmNTNjMCksIFdUQzIoMHgyY2U4MDg0MCksIFdUQzIoMHgyZGMyZDY4MCksIFdUQzIoMHgyZTlmYzEwMCksIFdUQzIoMHgyZjdlY2FjMCksIFdUQzIoMHgzMDVmZjI4MCksIFdUQzIoMHgzMTQzMzRjMCksIAotICBXVEMyKDB4MzIyODhlMDApLCBXVEMyKDB4MzMwZmZiODApLCBXVEMyKDB4MzNmOTdkODApLCBXVEMyKDB4MzRlNTE1YzApLCBXVEMyKDB4MzVkMmM1YzApLCBXVEMyKDB4MzZjMjhkMDApLCBXVEMyKDB4MzdiNDY3YzApLCBXVEMyKDB4MzhhODUwODApLCAKLSAgV1RDMigweDM5OWU0MjQwKSwgV1RDMigweDNhOTYzYTAwKSwgV1RDMigweDNiOTAzNjAwKSwgV1RDMigweDNjOGMzNDgwKSwgV1RDMigweDNkOGEzMzgwKSwgV1RDMigweDNlOGEyZGMwKSwgV1RDMigweDNmOGMxYjQwKSwgV1RDMigweDQwOGZmMmZmKSwgCi0gIFdUQzIoMHg0MTk1YWU3ZiksIFdUQzIoMHg0MjlkNDc3ZiksIFdUQzIoMHg0M2E2Yjg3ZiksIFdUQzIoMHg0NGIxZmRmZiksIFdUQzIoMHg0NWJmMTFmZiksIFdUQzIoMHg0NmNkZWU3ZiksIFdUQzIoMHg0N2RlOGNmZiksIFdUQzIoMHg0OGYwZTc3ZiksIAotICBXVEMyKDB4NGEwNTBlZmYpLCBXVEMyKDB4NGIxYjJkZmYpLCBXVEMyKDB4NGMzMzcyZmYpLCBXVEMyKDB4NGQ0ZTBiZmYpLCBXVEMyKDB4NGU2YjI1N2YpLCBXVEMyKDB4NGY4YWVkZmYpLCBXVEMyKDB4NTBhZDkyZmYpLCBXVEMyKDB4NTFkMzQxZmYpLCAKLSAgV1RDMigweDAwMjAwNmE5KSwgV1RDMigweDAwMGJmYjM2KSwgV1RDMigweGZmZmU0NWFjKSwgV1RDMigweGZmZjZkMDY0KSwgV1RDMigweGZmZjU4NWJjKSwgV1RDMigweGZmZmE1MDBkKSwgV1RDMigweDAwMDUxOWI0KSwgV1RDMigweDAwMTVjZDBjKSwgCi0gIFdUQzIoMHgwMDJjNTQ3MCksIFdUQzIoMHgwMDQ4OWEzYiksIFdUQzIoMHgwMDZhODhjOCksIFdUQzIoMHgwMDkyMGE3NCksIFdUQzIoMHgwMGJmMDk5OSksIFdUQzIoMHgwMGYxNzA5MiksIFdUQzIoMHgwMTI5MjliYyksIFdUQzIoMHgwMTY2MWY3MCksIAotICBXVEMyKDB4MDFhODNjMGMpLCBXVEMyKDB4MDFlZjY5ZTgpLCBXVEMyKDB4MDIzYjkzNjQpLCBXVEMyKDB4MDI4Y2EyZDQpLCBXVEMyKDB4MDJlMjgyOWMpLCBXVEMyKDB4MDMzZDFkMTApLCBXVEMyKDB4MDM5YzVjOTApLCBXVEMyKDB4MDQwMDJiNzgpLCAKLSAgV1RDMigweDA0Njg3NDE4KSwgV1RDMigweDA0ZDUyMGUwKSwgV1RDMigweDA1NDYxYzE4KSwgV1RDMigweDA1YmI1MDIwKSwgV1RDMigweDA2MzRhNzU4KSwgV1RDMigweDA2YjIwYzIwKSwgV1RDMigweDA3MzM2OGM4KSwgV1RDMigweDA3YjhhN2IwKSwgCi0gIFdUQzIoMHgwODQxYjM0MCksIFdUQzIoMHgwOGNlNzViMCksIFdUQzIoMHgwOTVlZDk4MCksIFdUQzIoMHgwOWYyYzkwMCksIFdUQzIoMHgwYThhMmU4MCksIFdUQzIoMHgwYjI0ZjQ3MCksIFdUQzIoMHgwYmMzMDUxMCksIFdUQzIoMHgwYzY0NGFkMCksIAotICBXVEMyKDB4MGQwOGIwMTApLCBXVEMyKDB4MGRiMDFmMTApLCBXVEMyKDB4MGU1YTgyNTApLCBXVEMyKDB4MGYwN2M0MDApLCBXVEMyKDB4MGZiN2NlYTApLCBXVEMyKDB4MTA2YThjODApLCBXVEMyKDB4MTExZmU4MDApLCBXVEMyKDB4MTFkN2NiNjApLCAKLSAgV1RDMigweDEyOTIyMTIwKSwgV1RDMigweDEzNGVkM2EwKSwgV1RDMigweDE0MGRjZDAwKSwgV1RDMigweDE0Y2VmN2UwKSwgV1RDMigweDE1OTIzZTYwKSwgV1RDMigweDE2NTc4YjAwKSwgV1RDMigweDE3MWVjODIwKSwgV1RDMigweDE3ZTdlMDIwKSwgCi0gIFdUQzIoMHgxOGIyYmQyMCksIFdUQzIoMHgxOTdmNDljMCksIFdUQzIoMHgxYTRkNzA0MCksIFdUQzIoMHgxYjFkMWIwMCksIFdUQzIoMHgxYmVlMzQ2MCksIFdUQzIoMHgxY2MwYTZhMCksIFdUQzIoMHgxZDk0NWM0MCksIFdUQzIoMHgxZTY5M2Y4MCksIAotICBXVEMyKDB4MWYzZjNhYzApLCBXVEMyKDB4MjAxNjM4ODApLCBXVEMyKDB4MjBlZTIyYzApLCBXVEMyKDB4MjFjNmU0NDApLCBXVEMyKDB4MjJhMDY3NDApLCBXVEMyKDB4MjM3YTk2MDApLCBXVEMyKDB4MjQ1NTVhYzApLCBXVEMyKDB4MjUzMGEwNDApLCAKLSAgV1RDMigweDI2MGM1MDgwKSwgV1RDMigweDI2ZTg1NjAwKSwgV1RDMigweDI3YzQ5YjAwKSwgV1RDMigweDI4YTEwYTAwKSwgV1RDMigweDI5N2Q4ZDgwKSwgV1RDMigweDJhNWEwZjgwKSwgV1RDMigweDJiMzY3YTgwKSwgV1RDMigweDJjMTJiOGMwKSwgCi0gIFdUQzIoMHgyY2VlYjUwMCksIFdUQzIoMHgyZGNhNTk0MCksIFdUQzIoMHgyZWE1OGZjMCksIFdUQzIoMHgyZjgwNDM0MCksIFdUQzIoMHgzMDVhNWRjMCksIFdUQzIoMHgzMTMzY2EwMCksIFdUQzIoMHgzMjBjNzIwMCksIFdUQzIoMHgzMmU0NDAwMCksIAotICBXVEMyKDB4MzNiYjFlYzApLCBXVEMyKDB4MzQ5MGY4ODApLCBXVEMyKDB4MzU2NWI3YzApLCBXVEMyKDB4MzYzOTQ2NDApLCBXVEMyKDB4MzcwYjhmMDApLCBXVEMyKDB4MzdkYzdjMDApLCBXVEMyKDB4MzhhYmY3YzApLCBXVEMyKDB4Mzk3OWVjYzApLCAKLSAgV1RDMigweDNhNDY0NTAwKSwgV1RDMigweDNiMTBlYjAwKSwgV1RDMigweDNiZDljOTQwKSwgV1RDMigweDNjYTBjOWMwKSwgV1RDMigweDNkNjVkNzQwKSwgV1RDMigweDNlMjhkYzAwKSwgV1RDMigweDNlZTljMjQwKSwgV1RDMigweDNmYTg3NDgwKSwgCi0gIFdUQzIoMHg0MDY0ZGNmZiksIFdUQzIoMHg0MTFlZTY3ZiksIFdUQzIoMHg0MWQ2N2E3ZiksIFdUQzIoMHg0MjhiODQ3ZiksIFdUQzIoMHg0MzNkZWQ3ZiksIFdUQzIoMHg0M2VkYTBmZiksIFdUQzIoMHg0NDlhODg3ZiksIFdUQzIoMHg0NTQ0OGY3ZiksIAotICBXVEMyKDB4NDVlYjllZmYpLCBXVEMyKDB4NDY4ZmExZmYpLCBXVEMyKDB4NDczMDgyZmYpLCBXVEMyKDB4NDdjZTJjN2YpLCBXVEMyKDB4NDg2ODg4N2YpLCBXVEMyKDB4NDhmZjgwZmYpLCBXVEMyKDB4NDk5MzAwZmYpLCBXVEMyKDB4NGEyMmYyZmYpLCAKLSAgV1RDMigweDRhYWY0MDdmKSwgV1RDMigweDRiMzdkNDdmKSwgV1RDMigweDRiYmM5OTdmKSwgV1RDMigweDRjM2Q3OGZmKSwgV1RDMigweDRjYmE1ZTdmKSwgV1RDMigweDRkMzMzMzdmKSwgV1RDMigweDRkYTdlMjdmKSwgV1RDMigweDRlMTg1NjdmKSwgCi0gIFdUQzIoMHg0ZTg0NzhmZiksIFdUQzIoMHg0ZWVjMzQ3ZiksIFdUQzIoMHg0ZjRmNzM3ZiksIFdUQzIoMHg0ZmFlMjBmZiksIFdUQzIoMHg1MDA4MjVmZiksIFdUQzIoMHg1MDVkNmRmZiksIFdUQzIoMHg1MGFkZTM3ZiksIFdUQzIoMHg1MGY5NmY3ZiksIAotICBXVEMyKDB4NTEzZmZkZmYpLCBXVEMyKDB4NTE4MTc3ZmYpLCBXVEMyKDB4NTFiZGM4N2YpLCBXVEMyKDB4NTFmNGQ5ZmYpLCBXVEMyKDB4NTIyNjk2N2YpLCBXVEMyKDB4NTI1MmU4N2YpLCBXVEMyKDB4NTI3OWI5ZmYpLCBXVEMyKDB4NTI5YWY1ZmYpLCAKLSAgV1RDMigweDUyYjY4NjdmKSwgV1RDMigweDUyY2M1NWZmKSwgV1RDMigweDUyZGM0ZWZmKSwgV1RDMigweDUyZTY1YWZmKSwgV1RDMigweDUyZWE2NTdmKSwgV1RDMigweDUyZTg1N2ZmKSwgV1RDMigweDUyZTAxZDdmKSwgV1RDMigweDUyZDE5ZmZmKSwgCi0gIFdUQzIoMHg1MmJjYzlmZiksIFdUQzIoMHg1MmExODU3ZiksIFdUQzIoMHg1MjdmYmQ3ZiksIFdUQzIoMHg1MjU3NWI3ZiksIFdUQzIoMHg1MjI4NGE3ZiksIFdUQzIoMHg1MWYyNzRmZiksIFdUQzIoMHg1MWI1YzQ3ZiksIFdUQzIoMHg1MTcyMjQ3ZiksIAotICBXVEMyKDB4NTEyNzdkZmYpLCBXVEMyKDB4NTBkNWJjN2YpLCBXVEMyKDB4NTA3Y2M5ZmYpLCBXVEMyKDB4NTAxYzkwZmYpLCBXVEMyKDB4NGZiNGZiN2YpLCBXVEMyKDB4NGY0NWYzZmYpLCBXVEMyKDB4NGVjZjY0ZmYpLCBXVEMyKDB4NGU1MTM4ZmYpLCAKLSAgV1RDMigweDRkY2I1OTdmKSwgV1RDMigweDRkM2RiMWZmKSwgV1RDMigweDRjYTgyYmZmKSwgV1RDMigweDRjMGFiMjdmKSwgV1RDMigweDRiNjUyZjdmKSwgV1RDMigweDRhYjc4ZDdmKSwgV1RDMigweDRhMDFiNjdmKSwgV1RDMigweDQ5NDM5NTdmKSwgCi0gIFdUQzIoMHg0ODdkMTJmZiksIFdUQzIoMHg0N2FlMWY3ZiksIFdUQzIoMHg0NmQ2OGY3ZiksIFdUQzIoMHg0NWY3MTg3ZiksIFdUQzIoMHg0NTEzNTk3ZiksIFdUQzIoMHg0NDMwNDY3ZiksIFdUQzIoMHg0MzUyZDJmZiksIFdUQzIoMHg0MjdlNmJmZiksIAotICBXVEMyKDB4NDFiMzkwZmYpLCBXVEMyKDB4NDBmMjA3N2YpLCBXVEMyKDB4NDAzOWE4N2YpLCBXVEMyKDB4M2Y4YTMxMDApLCBXVEMyKDB4M2VlMzNlMDApLCBXVEMyKDB4M2U0NDZhYzApLCBXVEMyKDB4M2RhZDUxODApLCBXVEMyKDB4M2QxZDdmYzApLCAKLSAgV1RDMigweDNjOTQ3YjAwKSwgV1RDMigweDNjMTFjN2MwKSwgV1RDMigweDNiOTRlYmMwKSwgV1RDMigweDNiMWQ2ZGMwKSwgV1RDMigweDNhYWFkNDgwKSwgV1RDMigweDNhM2NhNzQwKSwgV1RDMigweDM5ZDI2YzQwKSwgV1RDMigweDM5NmJhOGMwKSwgCi0gIFdUQzIoMHgzOTA3ZTA4MCksIFdUQzIoMHgzOGE2OTgwMCksIFdUQzIoMHgzODQ3M2Q4MCksIFdUQzIoMHgzN2U5MjNjMCksIFdUQzIoMHgzNzhiOWI4MCksIFdUQzIoMHgzNzJlMDM4MCksIFdUQzIoMHgzNmQwM2E4MCksIFdUQzIoMHgzNjcyN2YwMCksIAotICBXVEMyKDB4MzYxNTBlNDApLCBXVEMyKDB4MzViODE1NDApLCBXVEMyKDB4MzU1YjgwMDApLCBXVEMyKDB4MzRmZjFkYzApLCBXVEMyKDB4MzRhMmJmYzApLCBXVEMyKDB4MzQ0NjNlODApLCBXVEMyKDB4MzNlOTgyYzApLCBXVEMyKDB4MzM4Yzc4ODApLCAKLSAgV1RDMigweDMzMmYwYmMwKSwgV1RDMigweDMyZDExODAwKSwgV1RDMigweDMyNzI2NWMwKSwgV1RDMigweDMyMTJiYmMwKSwgV1RDMigweDMxYjFlNzQwKSwgV1RDMigweDMxNGZlZjAwKSwgV1RDMigweDMwZWQwNTQwKSwgV1RDMigweDMwODk1YzgwKSwgCi0gIFdUQzIoMHgzMDI1MTg4MCksIFdUQzIoMHgyZmMwMjg4MCksIFdUQzIoMHgyZjVhNjQ4MCksIFdUQzIoMHgyZWYzYTQ4MCksIFdUQzIoMHgyZThiZDY0MCksIFdUQzIoMHgyZTIzMTEwMCksIFdUQzIoMHgyZGI5NzY4MCksIFdUQzIoMHgyZDRmMjcwMCksIAotICBXVEMyKDB4MmNlNDMxYzApLCBXVEMyKDB4MmM3ODkwODApLCBXVEMyKDB4MmMwYzNiYzApLCBXVEMyKDB4MmI5ZjJiYzApLCBXVEMyKDB4MmIzMTU5NDApLCBXVEMyKDB4MmFjMmJjMDApLCBXVEMyKDB4MmE1MzRjYzApLCBXVEMyKDB4MjllMzAzYzApCisgICAgV1RDMCgweGZhY2ZiZWYwKSwgV1RDMCgweGZhYjg4YzE4KSwgV1RDMCgweGZhYTBlNTIwKSwgV1RDMCgweGZhODhkMTEwKSwKKyAgICBXVEMwKDB4ZmE3MDU2ZTgpLCBXVEMwKDB4ZmE1NzdkYjApLCBXVEMwKDB4ZmEzZTRjNzApLCBXVEMwKDB4ZmEyNGNhMjgpLAorICAgIFdUQzAoMHhmYTBhZmRlMCksIFdUQzAoMHhmOWYwZWVhMCksIFdUQzAoMHhmOWQ2YTJjOCksIFdUQzAoMHhmOWJjMWFiOCksCisgICAgV1RDMCgweGY5YTE1MjMwKSwgV1RDMCgweGY5ODY0NTEwKSwgV1RDMCgweGY5NmFmMDU4KSwgV1RDMCgweGY5NGY1NWMwKSwKKyAgICBXVEMwKDB4ZjkzMzc4ZTApLCBXVEMwKDB4ZjkxNzVkODApLCBXVEMwKDB4ZjhmYjA0NjgpLCBXVEMwKDB4ZjhkZTY4YjgpLAorICAgIFdUQzAoMHhmOGMxODQzOCksIFdUQzAoMHhmOGE0NTBkOCksIFdUQzAoMHhmODg2Y2RlOCksIFdUQzAoMHhmODY5MDE0OCksCisgICAgV1RDMCgweGY4NGFmMTQ4KSwgV1RDMCgweGY4MmNhNDEwKSwgV1RDMCgweGY4MGUxZTE4KSwgV1RDMCgweGY3ZWY2MmEwKSwKKyAgICBXVEMwKDB4ZjdkMDc0ZTApLCBXVEMwKDB4ZjdiMTU4NzApLCBXVEMwKDB4Zjc5MjEyNDApLCBXVEMwKDB4Zjc3MmE3YTApLAorICAgIFdUQzAoMHhmNzUzMWU1MCksIFdUQzAoMHhmNzMzNzgyMCksIFdUQzAoMHhmNzEzYWZkMCksIFdUQzAoMHhmNmYzYmVhMCksCisgICAgV1RDMCgweGY2ZDM5ZGMwKSwgV1RDMCgweGY2YjM1MmUwKSwgV1RDMCgweGY2OTJmMjgwKSwgV1RDMCgweGY2NzI5MjUwKSwKKyAgICBXVEMwKDB4ZjY1MjQ3YTApLCBXVEMwKDB4ZjYzMjI0YzApLCBXVEMwKDB4ZjYxMjNhMDApLCBXVEMwKDB4ZjVmMjk3YzApLAorICAgIFdUQzAoMHhmNWQzNGRkMCksIFdUQzAoMHhmNWI0NmIxMCksIFdUQzAoMHhmNTk1ZmQ5MCksIFdUQzAoMHhmNTc4MTM5MCksCisgICAgV1RDMCgweGY1NWFiYmEwKSwgV1RDMCgweGY1M2UwNTEwKSwgV1RDMCgweGY1MjFmZjcwKSwgV1RDMCgweGY1MDZiYTMwKSwKKyAgICBXVEMwKDB4ZjRlYzQzMzApLCBXVEMwKDB4ZjRkMmE2ODApLCBXVEMwKDB4ZjRiOWVmZTApLCBXVEMwKDB4ZjRhMjJhYzApLAorICAgIFdUQzAoMHhmNDhiNWY3MCksIFdUQzAoMHhmNDc1OTMxMCksIFdUQzAoMHhmNDYwY2RlMCksIFdUQzAoMHhmNDRjZmNjMCksCisgICAgV1RDMCgweGY0MzlhZmYwKSwgV1RDMCgweGY0MjY0ZTAwKSwgV1RDMCgweGY0MTIzZDkwKSwgV1RDMCgweGYzZmQxMzcwKSwKKyAgICBXVEMwKDB4ZjNlNmJlMDApLCBXVEMwKDB4ZjNjZjQxYTApLCBXVEMwKDB4ZjNiNmEwMzApLCBXVEMwKDB4ZjM5Y2RkNjApLAorICAgIFdUQzAoMHhmMzgxZmUwMCksIFdUQzAoMHhmMzY2MDc2MCksIFdUQzAoMHhmMzQ4ZmU3MCksIFdUQzAoMHhmMzJhZTgyMCksCisgICAgV1RDMCgweGYzMGJjOTQwKSwgV1RDMCgweGYyZWJhNjkwKSwgV1RDMCgweGYyY2E4NDgwKSwgV1RDMCgweGYyYTg2NjcwKSwKKyAgICBXVEMwKDB4ZjI4NTRmNDApLCBXVEMwKDB4ZjI2MTQxOTApLCBXVEMwKDB4ZjIzYzQxZTApLCBXVEMwKDB4ZjIxNjU3YTApLAorICAgIFdUQzAoMHhmMWVmOGFlMCksIFdUQzAoMHhmMWM3ZTNlMCksIFdUQzAoMHhmMTlmNjNkMCksIFdUQzAoMHhmMTc2MDQ1MCksCisgICAgV1RDMCgweGYxNGJiZGYwKSwgV1RDMCgweGYxMjA4OTYwKSwgV1RDMCgweGYwZjQ1Y2QwKSwgV1RDMCgweGYwYzcyY2UwKSwKKyAgICBXVEMwKDB4ZjA5OGVlMDApLCBXVEMwKDB4ZjA2OTk2ZjApLCBXVEMwKDB4ZjAzOTI2MjApLCBXVEMwKDB4ZjAwNzllMTApLAorICAgIFdUQzAoMHhlZmQ0ZmZjMCksIFdUQzAoMHhlZmExNWNhMCksIFdUQzAoMHhlZjZjZTYwMCksIFdUQzAoMHhlZjM3ZDQ2MCksCisgICAgV1RDMCgweGVmMDI1ZjgwKSwgV1RDMCgweGVlY2NhMmMwKSwgV1RDMCgweGVlOTY5NzYwKSwgV1RDMCgweGVlNjAzNDQwKSwKKyAgICBXVEMwKDB4ZWUyOTZkMjApLCBXVEMwKDB4ZWRmMjFjMDApLCBXVEMwKDB4ZWRiYTA3ZTApLCBXVEMwKDB4ZWQ4MGY2NDApLAorICAgIFdUQzAoMHhlZDQ2YmY0MCksIFdUQzAoMHhlZDBiN2IwMCksIFdUQzAoMHhlY2NmNWZjMCksIFdUQzAoMHhlYzkyYTEyMCksCisgICAgV1RDMCgweGVjNTU2ZDYwKSwgV1RDMCgweGVjMTdlNzAwKSwgV1RDMCgweGViZGEyZDQwKSwgV1RDMCgweGViOWM1ZmEwKSwKKyAgICBXVEMwKDB4ZWI1ZTcwNDApLCBXVEMwKDB4ZWIyMDFiMjApLCBXVEMwKDB4ZWFlMTE3YzApLCBXVEMwKDB4ZWFhMTIwMDApLAorICAgIFdUQzAoMHhlYTYwMDE4MCksIFdUQzAoMHhlYTFkOTk0MCksIFdUQzAoMHhlOWQ5YzE2MCksIFdUQzAoMHhlOTk0NjhhMCksCisgICAgV1RDMCgweGU5NGRjMDQwKSwgV1RDMCgweGU5MDYxOTQwKSwgV1RDMCgweGU4YmRjMTQwKSwgV1RDMCgweGU4NzUwYWUwKSwKKyAgICBXVEMwKDB4ZTgyYzRmYTApLCBXVEMwKDB4ZTdlM2VhNDApLCBXVEMwKDB4ZTc5YzM1ZTApLCBXVEMwKDB4ZTc1NTRjYTApLAorICAgIFdUQzAoMHhlNzBlZmMwMCksIFdUQzAoMHhlNmM5MGMyMCksIFdUQzAoMHhlNjgzM2YwMCksIFdUQzAoMHhlNjNkMjMwMCksCisgICAgV1RDMCgweGU1ZjYyMGEwKSwgV1RDMCgweGU1YWQ5ZGMwKSwgV1RDMCgweGU1NjMyMDgwKSwgV1RDMCgweGU1MTY5ZGEwKSwKKyAgICBXVEMwKDB4ZTRjODNlNjApLCBXVEMwKDB4ZTQ3ODI0MDApLCBXVEMwKDB4ZTQyNjk4NDApLCBXVEMwKDB4ZTNkNDJkYzApLAorICAgIFdUQzAoMHhlMzgxODhjMCksIFdUQzAoMHhlMzJmNGJlMCksIFdUQzAoMHhlMmRkZWVhMCksIFdUQzAoMHhlMjhkYjUyMCksCisgICAgV1RDMCgweGUyM2VlMDAwKSwgV1RDMCgweGUxZjFhNTgwKSwgV1RDMCgweGUxYTVlM2EwKSwgV1RDMCgweGUxNWIzNWEwKSwKKyAgICBXVEMwKDB4ZTExMTM4NjApLCBXVEMwKDB4ZTBjNzhhMDApLCBXVEMwKDB4ZTA3ZGQwZTApLCBXVEMwKDB4ZTAzM2I3YzApLAorICAgIFdUQzAoMHhkZmU4ZTY4MCksIFdUQzAoMHhkZjlkMWZjMCksIFdUQzAoMHhkZjUwNTVjMCksIFdUQzAoMHhkZjAyODdjMCksCisgICAgV1RDMCgweGRlYjNiMzQwKSwgV1RDMCgweGRlNjNlN2MwKSwgV1RDMCgweGRlMTM0YTAwKSwgV1RDMCgweGRkYzIwMDAwKSwKKyAgICBXVEMwKDB4ZGQ3MDMxODApLCBXVEMwKDB4ZGQxZTEyODApLCBXVEMwKDB4ZGNjYmUwODApLCBXVEMwKDB4ZGM3OWQ5ODApLAorICAgIFdUQzAoMHhkYzI4MzYwMCksIFdUQzAoMHhkYmQ3MWUwMCksIFdUQzAoMHhkYjg2YjE0MCksIFdUQzAoMHhkYjM3MTBjMCksCisgICAgV1RDMCgweGRhZTg1MGMwKSwgV1RDMCgweGRhOWE2YmMwKSwgV1RDMCgweGRhNGQ1NjQwKSwgV1RDMCgweGRhMDEwNjQwKSwKKyAgICBXVEMwKDB4ZDliNTY2NDApLCBXVEMwKDB4ZDk2YTU3MDApLCBXVEMwKDB4ZDkxZmI3MDApLCBXVEMwKDB4ZDhkNTY2MDApLAorICAgIFdUQzAoMHhkODhiNGE0MCksIFdUQzAoMHhkODQxNGYwMCksIFdUQzAoMHhkN2Y3NWY4MCksIFdUQzAoMHhkN2FkNjc0MCksCisgICAgV1RDMCgweGQ3NjM1MmMwKSwgV1RDMCgweGQ3MTkxMDQwKSwgV1RDMCgweGQ2Y2U4YzgwKSwgV1RDMCgweGQ2ODNiZDAwKSwKKyAgICBXVEMwKDB4ZDYzOGE1YzApLCBXVEMwKDB4ZDVlZDRmODApLCBXVEMwKDB4ZDVhMWMyNDApLCBXVEMwKDB4ZDU1NjJiODApLAorICAgIFdUQzAoMHhkNTBhZTUwMCksIFdUQzAoMHhkNGMwNGM4MCksIFdUQzAoMHhkNDc2YmI0MCksIFdUQzAoMHhkNDJlNjJjMCksCisgICAgV1RDMCgweGQzZTc1NjgwKSwgV1RDMCgweGQzYTFhZDAwKSwgV1RDMCgweGQzNWQ2NzgwKSwgV1RDMCgweGQzMWE0MzAwKSwKKyAgICBXVEMwKDB4ZDJkN2RjMDApLCBXVEMwKDB4ZDI5NWQwODApLCBXVEMwKDB4ZDI1M2Q4YzApLCBXVEMwKDB4ZDIxMWRmNDApLAorICAgIFdUQzAoMHhkMWNmZGJjMCksIFdUQzAoMHhkMThkYzQ4MCksIFdUQzAoMHhkMTRiOWRjMCksIFdUQzAoMHhkMTA5N2M4MCksCisgICAgV1RDMCgweGQwYzc3NzAwKSwgV1RDMCgweGQwODVhNTAwKSwgV1RDMCgweGQwNDQyZjQwKSwgV1RDMCgweGQwMDM0YTgwKSwKKyAgICBXVEMwKDB4Y2ZjMzJjMDApLCBXVEMwKDB4Y2Y4NDA0MDApLCBXVEMwKDB4Y2Y0NWY0MDApLCBXVEMwKDB4Y2YwOTEzYzApLAorICAgIFdUQzAoMHhjZWNkODAwMCksIFdUQzAoMHhjZTkzMmM4MCksIFdUQzAoMHhjZTU5YmY0MCksIFdUQzAoMHhjZTIwY2Q0MCksCisgICAgV1RDMCgweGNkZTdlYzQwKSwgV1RDMCgweGNkYWVlZGMwKSwgV1RDMCgweGNkNzVlYTAwKSwgV1RDMCgweGNkM2NmZWMwKSwKKyAgICBXVEMwKDB4Y2QwNDRiNDApLCBXVEMwKDB4Y2NjYmZmMDApLCBXVEMwKDB4Y2M5NDU0ODApLCBXVEMwKDB4Y2M1ZDg3ODApLAorICAgIFdUQzAoMHhjYzI3YzNjMCksIFdUQzAoMHhjYmYyZmM0MCksIFdUQzAoMHhjYmJmMGEwMCksIFdUQzAoMHhjYjhiYzdjMCksCisgICAgV1RDMCgweGNiNTkxODgwKSwgV1RDMCgweGNiMjZmMGMwKSwgV1RDMCgweGNhZjU0OTgwKSwgV1RDMCgweGNhYzQxYWMwKSwKKyAgICBXVEMwKDB4Y2E5MzY0NDApLCBXVEMwKDB4Y2E2MzJkODApLCBXVEMwKDB4Y2EzMzdmMDApLCBXVEMwKDB4Y2EwNDYxODApLAorICAgIFdUQzAoMHhjOWQ1ZGQ0MCksIFdUQzAoMHhjOWE3ZmE4MCksIFdUQzAoMHhjOTdhYzIwMCksIFdUQzAoMHhjOTRlM2MwMCksCisgICAgV1RDMCgweGM5MWQxODQwKSwgV1RDMCgweGM4ZjE1OTgwKSwgV1RDMCgweGM4YzUyMzQwKSwgV1RDMCgweGM4OTg4MTAwKSwKKyAgICBXVEMwKDB4Yzg2YjdmMDApLCBXVEMwKDB4YzgzZTI4YzApLCBXVEMwKDB4YzgxMDhhODApLCBXVEMwKDB4YzdlMmFmYzApLAorICAgIFdUQzAoMHhjN2I0YTQ4MCksIFdUQzAoMHhjNzg2NzQ4MCksIFdUQzAoMHhjNzU4MmI0MCksIFdUQzAoMHhjNzI5Y2M4MCksCisgICAgV1RDMCgweGM2ZmI1NzAwKSwgV1RDMCgweGM2Y2NjYTQwKSwgV1RDMCgweGM2OWUyMTgwKSwgV1RDMCgweGM2NmY0OWMwKSwKKyAgICBXVEMwKDB4YzY0MDI5YzApLCBXVEMwKDB4YzYxMGE3NDApLCBXVEMwKDB4YzVlMGJmYzApLCBXVEMwKDB4YzViMDllODApLAorICAgIFdUQzAoMHhjNTgwNzkwMCksIFdUQzAoMHhjNTUwODQ0MCksIFdUQzAoMHhjNTIwZTg0MCksIFdUQzAoMHhjNGYxYmRjMCksCisgICAgV1RDMCgweGM0YzMxZDAwKSwgV1RDMCgweGM0OTUxNzgwKSwgV1RDMCgweGM0Njc4YTAwKSwgV1RDMCgweGM0M2EyOGMwKSwKKyAgICBXVEMwKDB4YzQwY2E4MDApLCBXVEMwKDB4YzNkZWNjYzApLCBXVEMwKDB4YzNiMDk5NDApLCBXVEMwKDB4YzM4MjJjMDApLAorICAgIFdUQzAoMHhjMzUzYTBjMCksIFdUQzAoMHhjMzI1MTc0MCksIFdUQzAoMHhjMmY2YjUwMCksIFdUQzAoMHhjMmM4YTE0MCksCisgICAgV1RDMCgweGMyOWIwMmMwKSwgV1RDMCgweGMyNmRmNWMwKSwgV1RDMCgweGMyNDE4OTQwKSwgV1RDMCgweGMyMTVjYmMwKSwKKyAgICBXVEMwKDB4YzFlYWNhMDApLCBXVEMwKDB4YzFjMDg2ODApLCBXVEMwKDB4YzE5NmZiMDApLCBXVEMwKDB4YzE2ZTIyYzApLAorICAgIFdUQzAoMHhjMTQ1ZjA0MCksIFdUQzAoMHhjMTFlM2E4MCksIFdUQzAoMHhjMGY2Y2MwMCksIFdUQzAoMHhjMGNmNmVjMCksCisgICAgV1RDMCgweGMwYTgwMmMwKSwgV1RDMCgweGMwODA5MjgwKSwgV1RDMCgweGMwNTkzMzQwKSwgV1RDMCgweGMwMzFmODgwKSwKKyAgICBXVEMwKDB4YzAwYjA0YzApLCBXVEMwKDB4YmZlNDg5ODEpLCBXVEMwKDB4YmZiZWJiODEpLCBXVEMwKDB4YmY5OWNiMDEpLAorICAgIFdUQzAoMHhiZjc1Y2M4MSksIFdUQzAoMHhiZjUyYzEwMSksIFdUQzAoMHhiZjMwYTkwMSksIFdUQzAoMHhiZjBmODMwMSksCisgICAgV1RDMCgweGJlZWY0NjAxKSwgV1RDMCgweGJlY2ZlNjAxKSwgV1RDMCgweGJlYjE1NzAxKSwgV1RDMCgweGJlOTM4YzgxKSwKKyAgICBXVEMwKDB4YmU3NjdlODEpLCBXVEMwKDB4YmU1YTIzMDEpLCBXVEMwKDB4YmUzZTcyMDEpLCBXVEMwKDB4YmUyMzYwMDEpLAorICAgIFdUQzAoMHhiZTA4ZTE4MSksIFdUQzAoMHhiZGVlZTk4MSksIFdUQzAoMHhiZGQ1NmI4MSksIFdUQzAoMHhiZGJjNjM4MSksCisgICAgV1RDMCgweGJkYTNkMDgxKSwgV1RDMCgweGJkOGJiMjgxKSwgV1RDMCgweGJkNzQwYjgxKSwgV1RDMCgweGJkNWNlMjgxKSwKKyAgICBXVEMwKDB4YmQ0NjQyODEpLCBXVEMwKDB4YmQzMDM1ODEpLCBXVEMwKDB4YmQxYWM4MDEpLCBXVEMwKDB4YmQwNjBjODEpLAorICAgIFdUQzAoMHhiY2YyMTYwMSksIFdUQzAoMHhiY2RlZjcwMSksIFdUQzAoMHhiY2NjYmQwMSksIFdUQzAoMHhiY2JiNzAwMSksCisgICAgV1RDMCgweGJjYWIxNzgxKSwgV1RDMCgweGJjOWJiOTAxKSwgV1RDMCgweGJjOGQ1MTAxKSwgV1RDMCgweGJjN2ZkMzAxKSwKKyAgICBXVEMwKDB4YmM3MzM0MDEpLCBXVEMwKDB4YmM2NzY1MDEpLCBXVEMwKDB4YmM1YzRjODEpLCBXVEMwKDB4YmM1MWNiMDEpLAorICAgIFdUQzAoMHhiYzQ3YzI4MSksIFdUQzAoMHhiYzNlMTk4MSksIFdUQzAoMHhiYzM0YzA4MSksIFdUQzAoMHhiYzJiYWIwMSksCisgICAgV1RDMCgweGJjMjJjZDgxKSwgV1RDMCgweGJjMWEyNDAxKSwgV1RDMCgweGJjMTFiNjgxKSwgV1RDMCgweGJjMDk4ZDgxKSwKKyAgICBXVEMwKDB4YmMwMWIzODEpLCBXVEMwKDB4YmJmYTNjMDEpLCBXVEMwKDB4YmJmMzQyODEpLCBXVEMwKDB4YmJlY2UyODEpLAorICAgIFdUQzAoMHhiYmU3MzIwMSksIFdUQzAoMHhiYmUyMzI4MSksIFdUQzAoMHhiYmRkZGIwMSksIFdUQzAoMHhiYmRhMjUwMSksCisgICAgV1RDMCgweGJiZDcwMjAxKSwgV1RDMCgweGJiZDQ1NjAxKSwgV1RDMCgweGJiZDIwMzAxKSwgV1RDMCgweGJiY2ZlYTgxKSwKKyAgICBXVEMwKDB4YmJjZTA2MDEpLCBXVEMwKDB4YmJjYzZiMDEpLCBXVEMwKDB4YmJjYjMyMDEpLCBXVEMwKDB4YmJjYTc0ODEpLAorICAgIFdUQzAoMHhiYmNhNWQwMSksIFdUQzAoMHhiYmNiMjI4MSksIFdUQzAoMHhiYmNjZmM4MSksIFdUQzAoMHhiYmQwMTMwMSksCisgICAgV1RDMCgweGJiZDQ1ODgxKSwgV1RDMCgweGJiZDlhNzgxKSwgV1RDMCgweGJiZGZkYjgxKSwgV1RDMCgweGJiZTZjODAxKSwKKyAgICBXVEMwKDB4YmJlZTJmODEpLCBXVEMwKDB4YmJmNWQxODEpLCBXVEMwKDB4YmJmZDZjMDEpLCBXVEMwKDB4YmMwNGUzODEpLAorICAgIFdUQzAoMHhiYzBjNDU4MSksIFdUQzAoMHhiYzEzYTQ4MSksIFdUQzAoMHhiYzFiMTA4MSksIFdUQzAoMHhiYzIyOGYwMSksCisgICAgV1RDMCgweGJjMmExYTgxKSwgV1RDMCgweGJjMzFhZjAxKSwgV1RDMCgweGJjMzk0OTAxKSwgV1RDMCgweGJjNDBlODgxKSwKKyAgICBXVEMwKDB4YmM0ODhlODEpLCBXVEMwKDB4YmM1MDNiODEpLCBXVEMwKDB4YmM1N2YxMDEpLCBXVEMwKDB4YmM1ZmFlODEpLAorICAgIFdUQzAoMHhiYzY3NzUwMSksIFdUQzAoMHhiYzZmNDQwMSksIFdUQzAoMHhiYzc3MWMwMSksIFdUQzAoMHhiYzdlZmM4MSksCisgICAgV1RDMCgweGJjODZlNTgxKSwgV1RDMCgweGJjOGVkNzAxKSwgV1RDMCgweGJjOTZkMTAxKSwgV1RDMCgweGJjOWVkNDgxKSwKKyAgICBXVEMwKDB4YmNhNmUxMDEpLCBXVEMwKDB4YmNhZWY3MDEpLCBXVEMwKDB4YmNiNzE3MDEpLCBXVEMwKDB4YmNiZjQwMDEpLAorICAgIFdUQzAoMHhiY2M3NzE4MSksIFdUQzAoMHhiY2NmYWMwMSksIFdUQzAoMHhiY2Q3ZWYwMSksIFdUQzAoMHhiY2UwM2I4MSksCisgICAgV1RDMCgweGJjZTg5MjgxKSwgV1RDMCgweGJjZjBmMzgxKSwgV1RDMCgweGJjZjk1ZTgxKSwgV1RDMCgweGJkMDFkMjgxKSwKKyAgICBXVEMwKDB4YmQwYTRmODEpLCBXVEMwKDB4YmQxMmQ1ODEpLCBXVEMwKDB4YmQxYjY1MDEpLCBXVEMwKDB4YmQyM2ZmMDEpLAorICAgIFdUQzAoMHhiZDJjYTI4MSksIFdUQzAoMHhiZDM1NTA4MSksIFdUQzAoMHhiZDNlMDgwMSksIFdUQzAoMHhiZDQ2YzgwMSksCisgICAgV1RDMCgweGJkNGY5MTAxKSwgV1RDMCgweGJkNTg2MjgxKSwgV1RDMCgweGJkNjEzZDgxKSwgV1RDMCgweGJkNmEyMjAxKSwKKyAgICBXVEMwKDB4YmQ3MzEwODEpLCBXVEMwKDB4YmQ3YzA3ODEpLCBXVEMwKDB4YmQ4NTA3MDEpLCBXVEMwKDB4YmQ4ZTBlMDEpLAorICAgIFdUQzAoMHhiZDk3MWM4MSksIFdUQzAoMHhiZGEwMzM4MSksIFdUQzAoMHhiZGE5NTMwMSksIFdUQzAoMHhiZGIyN2IwMSksCisgICAgV1RDMCgweGJkYmJhYjAxKSwgV1RDMCgweGJkYzRlMzAxKSwgV1RDMCgweGJkY2UyMTgxKSwgV1RDMCgweGJkZDc2NzAxKSwKKyAgICBXVEMwKDB4YmRlMGIzMDEpLCBXVEMwKDB4YmRlYTA2ODEpLCBXVEMwKDB4YmRmMzYxMDEpLCBXVEMwKDB4YmRmY2MzMDEpLAorICAgIFdUQzAoMHhiZTA2MmI4MSksIFdUQzAoMHhiZTBmOWEwMSksIFdUQzAoMHhiZTE5MGQ4MSksIFdUQzAoMHhiZTIyODY4MSksCisgICAgV1RDMCgweGJlMmMwNTAxKSwgV1RDMCgweGJlMzU4OTAxKSwgV1RDMCgweGJlM2YxMzgxKSwgV1RDMCgweGJlNDhhMzAxKSwKKyAgICBXVEMwKDB4YmU1MjM3ODEpLCBXVEMwKDB4YmU1YmQwMDEpLCBXVEMwKDB4YmU2NTZjMDEpLCBXVEMwKDB4YmU2ZjBjMDEpLAorICAgIFdUQzAoMHhiZTc4YjAwMSksIFdUQzAoMHhiZTgyNTgwMSksIFdUQzAoMHhiZThjMDUwMSksIFdUQzAoMHhiZTk1YjU4MSksCisgICAgV1RDMCgweGJlOWY2OTAxKSwgV1RDMCgweGJlYTkxZjAxKSwgV1RDMCgweGJlYjJkNjgxKSwgV1RDMCgweGJlYmM5MTgxKSwKKyAgICBXVEMwKDB4YmVjNjRlODEpLCBXVEMwKDB4YmVkMDBmODEpLCBXVEMwKDB4YmVkOWQyODEpLCBXVEMwKDB4YmVlMzk4MDEpLAorICAgIFdUQzAoMHhiZWVkNWYwMSksIFdUQzAoMHhiZWY3MjY4MSksIFdUQzAoMHhiZjAwZWY4MSksIFdUQzAoMHhiZjBhYmEwMSksCisgICAgV1RDMCgweGJmMTQ4NjgxKSwgV1RDMCgweGJmMWU1NTAxKSwgV1RDMCgweGJmMjgyNTAxKSwgV1RDMCgweGJmMzFmNTAxKSwKKyAgICBXVEMwKDB4YmYzYmM2MDEpLCBXVEMwKDB4YmY0NTk2ODEpLCBXVEMwKDB4YmY0ZjY4MDEpLCBXVEMwKDB4YmY1OTNhMDEpLAorICAgIFdUQzAoMHhiZjYzMGQ4MSksIFdUQzAoMHhiZjZjZTIwMSksIFdUQzAoMHhiZjc2YjcwMSksIFdUQzAoMHhiZjgwOGI4MSksCisgICAgV1RDMCgweGJmOGE1ZjgxKSwgV1RDMCgweGJmOTQzMzAxKSwgV1RDMCgweGJmOWUwNzAxKSwgV1RDMCgweGJmYTdkYzAxKSwKKyAgICBXVEMwKDB4YmZiMWIxMDEpLCBXVEMwKDB4YmZiYjg3MDEpLCBXVEMwKDB4YmZjNTVjODEpLCBXVEMwKDB4YmZjZjMxODEpLAorICAgIFdUQzAoMHhiZmQ5MDYwMSksIFdUQzAoMHhiZmUyZDkwMSksIFdUQzAoMHhiZmVjYWE4MSksIFdUQzAoMHhiZmY2N2EwMSksCisgICAgLyogcGFydCAxICovCisgICAgV1RDMSgweDgwMTMwOTgxKSwgV1RDMSgweDgwMjY5ZjgxKSwgV1RDMSgweDgwM2EzMzgxKSwgV1RDMSgweDgwNGRjNDgxKSwKKyAgICBXVEMxKDB4ODA2MTUyODEpLCBXVEMxKDB4ODA3NGRjMDEpLCBXVEMxKDB4ODA4ODYwODEpLCBXVEMxKDB4ODA5YmRmMDEpLAorICAgIFdUQzEoMHg4MGFmNTcwMSksIFdUQzEoMHg4MGMyYzc4MSksIFdUQzEoMHg4MGQ2MzEwMSksIFdUQzEoMHg4MGU5OTQwMSksCisgICAgV1RDMSgweDgwZmNmMTgxKSwgV1RDMSgweDgxMTA0YTAxKSwgV1RDMSgweDgxMjM5ZDgxKSwgV1RDMSgweDgxMzZlYTAxKSwKKyAgICBXVEMxKDB4ODE0YTJmODEpLCBXVEMxKDB4ODE1ZDZjMDEpLCBXVEMxKDB4ODE3MGExODEpLCBXVEMxKDB4ODE4M2NmODEpLAorICAgIFdUQzEoMHg4MTk2Zjc4MSksIFdUQzEoMHg4MWFhMTk4MSksIFdUQzEoMHg4MWJkMzQwMSksIFdUQzEoMHg4MWQwNDY4MSksCisgICAgV1RDMSgweDgxZTM0ZjgxKSwgV1RDMSgweDgxZjY0ZjAxKSwgV1RDMSgweDgyMDk0NTgxKSwgV1RDMSgweDgyMWMzNDAxKSwKKyAgICBXVEMxKDB4ODIyZjFiMDEpLCBXVEMxKDB4ODI0MWZhMDEpLCBXVEMxKDB4ODI1NGNmMDEpLCBXVEMxKDB4ODI2Nzk5MDEpLAorICAgIFdUQzEoMHg4MjdhNTgwMSksIFdUQzEoMHg4MjhkMGIwMSksIFdUQzEoMHg4MjlmYjQwMSksIFdUQzEoMHg4MmIyNTMwMSksCisgICAgV1RDMSgweDgyYzRlODAxKSwgV1RDMSgweDgyZDc3MjAxKSwgV1RDMSgweDgyZTllZjAxKSwgV1RDMSgweDgyZmM1ZjAxKSwKKyAgICBXVEMxKDB4ODMwZWMwODEpLCBXVEMxKDB4ODMyMTE1MDEpLCBXVEMxKDB4ODMzMzVjODEpLCBXVEMxKDB4ODM0NTk4ODEpLAorICAgIFdUQzEoMHg4MzU3YzcwMSksIFdUQzEoMHg4MzY5ZTc4MSksIFdUQzEoMHg4MzdiZjgwMSksIFdUQzEoMHg4MzhkZjgwMSksCisgICAgV1RDMSgweDgzOWZlODAxKSwgV1RDMSgweDgzYjFjODgxKSwgV1RDMSgweDgzYzM5YTgxKSwgV1RDMSgweDgzZDU1ZDAxKSwKKyAgICBXVEMxKDB4ODNlNzBmMDEpLCBXVEMxKDB4ODNmOGIwMDEpLCBXVEMxKDB4ODQwYTNlODEpLCBXVEMxKDB4ODQxYmI5ODEpLAorICAgIFdUQzEoMHg4NDJkMjI4MSksIFdUQzEoMHg4NDNlN2E4MSksIFdUQzEoMHg4NDRmYzA4MSksIFdUQzEoMHg4NDYwZjU4MSksCisgICAgV1RDMSgweDg0NzIxNzAxKSwgV1RDMSgweDg0ODMyNDgxKSwgV1RDMSgweDg0OTQxZDgxKSwgV1RDMSgweDg0YTUwMjAxKSwKKyAgICBXVEMxKDB4ODRiNWQzMDEpLCBXVEMxKDB4ODRjNjkxMDEpLCBXVEMxKDB4ODRkNzNjMDEpLCBXVEMxKDB4ODRlN2QzODEpLAorICAgIFdUQzEoMHg4NGY4NTU4MSksIFdUQzEoMHg4NTA4YzE4MSksIFdUQzEoMHg4NTE5MTgwMSksIFdUQzEoMHg4NTI5NTg4MSksCisgICAgV1RDMSgweDg1Mzk4NDgxKSwgV1RDMSgweDg1NDk5ZDAxKSwgV1RDMSgweDg1NTlhMDgxKSwgV1RDMSgweDg1Njk4ZTgxKSwKKyAgICBXVEMxKDB4ODU3OTY2MDEpLCBXVEMxKDB4ODU4OTI2ODEpLCBXVEMxKDB4ODU5OGQwODEpLCBXVEMxKDB4ODVhODY1ODEpLAorICAgIFdUQzEoMHg4NWI3ZTYwMSksIFdUQzEoMHg4NWM3NTIwMSksIFdUQzEoMHg4NWQ2YTk4MSksIFdUQzEoMHg4NWU1ZWI4MSksCisgICAgV1RDMSgweDg1ZjUxNjgxKSwgV1RDMSgweDg2MDQyYzAxKSwgV1RDMSgweDg2MTMyYzAxKSwgV1RDMSgweDg2MjIxODAxKSwKKyAgICBXVEMxKDB4ODYzMGYxODEpLCBXVEMxKDB4ODYzZmI3MDEpLCBXVEMxKDB4ODY0ZTY5MDEpLCBXVEMxKDB4ODY1ZDA1ODEpLAorICAgIFdUQzEoMHg4NjZiOGQ4MSksIFdUQzEoMHg4NjdhMDA4MSksIFdUQzEoMHg4Njg4NjAwMSksIFdUQzEoMHg4Njk2YWQwMSksCisgICAgV1RDMSgweDg2YTRlNzgxKSwgV1RDMSgweDg2YjMwZjAxKSwgV1RDMSgweDg2YzEyNDAxKSwgV1RDMSgweDg2Y2YyNjAxKSwKKyAgICBXVEMxKDB4ODZkZDE0ODEpLCBXVEMxKDB4ODZlYWYwODEpLCBXVEMxKDB4ODZmOGJhODEpLCBXVEMxKDB4ODcwNjcyODEpLAorICAgIFdUQzEoMHg4NzE0MWIwMSksIFdUQzEoMHg4NzIxYjQ4MSksIFdUQzEoMHg4NzJmNDIwMSksIFdUQzEoMHg4NzNjYzIwMSksCisgICAgV1RDMSgweDg3NGEyZjAxKSwgV1RDMSgweDg3NTc4MTgxKSwgV1RDMSgweDg3NjRiMTAxKSwgV1RDMSgweDg3NzFjNjAxKSwKKyAgICBXVEMxKDB4ODc3ZWRlMDEpLCBXVEMxKDB4ODc4YzE4ODEpLCBXVEMxKDB4ODc5OThmMDEpLCBXVEMxKDB4ODdhNzBlODEpLAorICAgIFdUQzEoMHg4N2I0MjQ4MSksIFdUQzEoMHg4N2MwNWU4MSksIFdUQzEoMHg4N2NiNTEwMSksIFdUQzEoMHg4N2Q0YWM4MSksCisgICAgV1RDMSgweDg3ZTczZDgxKSwgV1RDMSgweDg4MTI0MjgxKSwgV1RDMSgweDg4MzUzNTAxKSwgV1RDMSgweDg4NWY4NDgxKSwKKyAgICBXVEMxKDB4ODg4ZDMxODEpLCBXVEMxKDB4ODhiZTE2ODEpLCBXVEMxKDB4ODhmMTM4MDEpLCBXVEMxKDB4ODkyNWYxMDEpLAorICAgIFdUQzEoMHg4OTViY2QwMSksIFdUQzEoMHg4OTkyNWE4MSksIFdUQzEoMHg4OWM5MmY4MSksIFdUQzEoMHg4YTAwMWYwMSksCisgICAgV1RDMSgweDhhMzcyODgxKSwgV1RDMSgweDhhNmU0YTAxKSwgV1RDMSgweDhhYTU4NjgxKSwgV1RDMSgweDhhZGNlZTAxKSwKKyAgICBXVEMxKDB4OGIxNDk3MDEpLCBXVEMxKDB4OGI0Yzk3MDEpLCBXVEMxKDB4OGI4NTAyODEpLCBXVEMxKDB4OGJiZGU5ODEpLAorICAgIFdUQzEoMHg4YmY3NWIwMSksIFdUQzEoMHg4YzMxNjY4MSksIFdUQzEoMHg4YzZjMWIwMSksIFdUQzEoMHg4Y2E3ODc4MSksCisgICAgV1RDMSgweDhjZTNiYTgxKSwgV1RDMSgweDhkMjBjMzAxKSwgV1RDMSgweDhkNWVhYTAxKSwgV1RDMSgweDhkOWQ3NzgxKSwKKyAgICBXVEMxKDB4OGRkZDMyMDEpLCBXVEMxKDB4OGUxZGUwMDEpLCBXVEMxKDB4OGU1Zjg4ODEpLCBXVEMxKDB4OGVhMjMyMDEpLAorICAgIFdUQzEoMHg4ZWU1ZTMwMSksIFdUQzEoMHg4ZjJhYTEwMSksIFdUQzEoMHg4ZjcwNmYwMSksIFdUQzEoMHg4ZmI3NGY4MSksCisgICAgV1RDMSgweDhmZmY0NjAxKSwgV1RDMSgweDkwNDg1NDAxKSwgV1RDMSgweDkwOTI3YjgxKSwgV1RDMSgweDkwZGRjMDAxKSwKKyAgICBXVEMxKDB4OTEyYTIyMDEpLCBXVEMxKDB4OTE3N2EzMDEpLCBXVEMxKDB4OTFjNjQzMDEpLCBXVEMxKDB4OTIxNjAzMDEpLAorICAgIFdUQzEoMHg5MjY2ZTI4MSksIFdUQzEoMHg5MmI4ZTEwMSksIFdUQzEoMHg5MzBiZmY4MSksIFdUQzEoMHg5MzYwM2QwMSksCisgICAgV1RDMSgweDkzYjU5OTAxKSwgV1RDMSgweDk0MGMxMjgxKSwgV1RDMSgweDk0NjNhODgxKSwgV1RDMSgweDk0YmM1OTgxKSwKKyAgICBXVEMxKDB4OTUxNjIzODEpLCBXVEMxKDB4OTU3MTA2MDEpLCBXVEMxKDB4OTVjY2ZmMDEpLCBXVEMxKDB4OTYyYTBjODEpLAorICAgIFdUQzEoMHg5Njg4MmUwMSksIFdUQzEoMHg5NmU3NjEwMSksIFdUQzEoMHg5NzQ3YTQ4MSksIFdUQzEoMHg5N2E4ZjY4MSksCisgICAgV1RDMSgweDk4MGI1NTAxKSwgV1RDMSgweDk4NmViZDgxKSwgV1RDMSgweDk4ZDMyZDgxKSwgV1RDMSgweDk5MzhhMjgxKSwKKyAgICBXVEMxKDB4OTk5ZjE5ODEpLCBXVEMxKDB4OWEwNjkwMDEpLCBXVEMxKDB4OWE2ZjAzODEpLCBXVEMxKDB4OWFkODcwODEpLAorICAgIFdUQzEoMHg5YjQyZDU4MSksIFdUQzEoMHg5YmFlMmY4MSksIFdUQzEoMHg5YzFhN2M4MSksIFdUQzEoMHg5Yzg3YmE4MSksCisgICAgV1RDMSgweDljZjVlNzAxKSwgV1RDMSgweDlkNjUwMDgxKSwgV1RDMSgweDlkZDUwNDgxKSwgV1RDMSgweDllNDVmMDgxKSwKKyAgICBXVEMxKDB4OWViN2MxMDEpLCBXVEMxKDB4OWYyYTcyODEpLCBXVEMxKDB4OWY5ZTAzMDEpLCBXVEMxKDB4YTAxMjcwODEpLAorICAgIFdUQzEoMHhhMDg3Yjk4MSksIFdUQzEoMHhhMGZkZGQ4MSksIFdUQzEoMHhhMTc0ZGE4MSksIFdUQzEoMHhhMWVjYWUwMSksCisgICAgV1RDMSgweGEyNjU1NTgxKSwgV1RDMSgweGEyZGVjZTgxKSwgV1RDMSgweGEzNTkxODAxKSwgV1RDMSgweGEzZDQzMDAxKSwKKyAgICBXVEMxKDB4YTQ1MDE2MDEpLCBXVEMxKDB4YTRjY2M5MDEpLCBXVEMxKDB4YTU0YTQ3MDEpLCBXVEMxKDB4YTVjODkwMDEpLAorICAgIFdUQzEoMHhhNjQ3YTMwMSksIFdUQzEoMHhhNmM3N2UwMSksIFdUQzEoMHhhNzQ4MjEwMSksIFdUQzEoMHhhN2M5OGIwMSksCisgICAgV1RDMSgweGE4NGJiYjgxKSwgV1RDMSgweGE4Y2ViMjAxKSwgV1RDMSgweGE5NTI2ZDgxKSwgV1RDMSgweGE5ZDZlZjAxKSwKKyAgICBXVEMxKDB4YWE1YzM2MDEpLCBXVEMxKDB4YWFlMjQzMDEpLCBXVEMxKDB4YWI2OTE2ODEpLCBXVEMxKDB4YWJmMGIxODEpLAorICAgIFdUQzEoMHhhYzc5MTQwMSksIFdUQzEoMHhhZDAyM2YwMSksIFdUQzEoMHhhZDhjMzMwMSksIFdUQzEoMHhhZTE2ZjAwMSksCisgICAgV1RDMSgweGFlYTI3NjgxKSwgV1RDMSgweGFmMmVjOTAxKSwgV1RDMSgweGFmYmJlODAxKSwgV1RDMSgweGIwNDlkNjAxKSwKKyAgICBXVEMxKDB4YjBkODk0MDEpLCBXVEMxKDB4YjE2ODIyODEpLCBXVEMxKDB4YjFmODgxODEpLCBXVEMxKDB4YjI4OWIxODEpLAorICAgIFdUQzEoMHhiMzFiYjMwMSksIFdUQzEoMHhiM2FlODYwMSksIFdUQzEoMHhiNDQyMmI4MSksIFdUQzEoMHhiNGQ2YTM4MSksCisgICAgV1RDMSgweDRhNWEzMjdmKSwgV1RDMSgweDQ5YzRhZGZmKSwgV1RDMSgweDQ5MmU2MzdmKSwgV1RDMSgweDQ4OTc0ZjdmKSwKKyAgICBXVEMxKDB4NDdmZjZkN2YpLCBXVEMxKDB4NDc2NmJhZmYpLCBXVEMxKDB4NDZjZDM1ZmYpLCBXVEMxKDB4NDYzMmRkN2YpLAorICAgIFdUQzEoMHg0NTk3YjBmZiksIFdUQzEoMHg0NGZiYjFmZiksIFdUQzEoMHg0NDVlZWFmZiksIFdUQzEoMHg0M2MxNjVmZiksCisgICAgV1RDMSgweDQzMjMyMjdmKSwgV1RDMSgweDQyODQyNzdmKSwgV1RDMSgweDQxZTQ4YWZmKSwgV1RDMSgweDQxNDQ1NTdmKSwKKyAgICBXVEMxKDB4NDBhMzg2N2YpLCBXVEMxKDB4NDAwMWY1ZmYpLCBXVEMxKDB4M2Y1ZjVkODApLCBXVEMxKDB4M2ViYmFkMDApLAorICAgIFdUQzEoMHgzZTE2ZWU0MCksIFdUQzEoMHgzZDcxM2QwMCksIFdUQzEoMHgzY2NhYjcwMCksIFdUQzEoMHgzYzIzNjUwMCksCisgICAgV1RDMSgweDNiN2I1ODAwKSwgV1RDMSgweDNhZDJlY2MwKSwgV1RDMSgweDNhMmE2NTQwKSwgV1RDMSgweDM5ODFiN2MwKSwKKyAgICBXVEMxKDB4MzhkOGJhMDApLCBXVEMxKDB4MzgyZjAxYzApLCBXVEMxKDB4Mzc4NDYyNDApLCBXVEMxKDB4MzZkOGViMDApLAorICAgIFdUQzEoMHgzNjJjOWVjMCksIFdUQzEoMHgzNTdmN2EwMCksIFdUQzEoMHgzNGQxODM0MCksIFdUQzEoMHgzNDIyYzkwMCksCisgICAgV1RDMSgweDMzNzM2YzQwKSwgV1RDMSgweDMyYzM5MDQwKSwgV1RDMSgweDMyMTM0MjgwKSwgV1RDMSgweDMxNjI5MjgwKSwKKyAgICBXVEMxKDB4MzBiMWEwMDApLCBXVEMxKDB4MzAwMDgzODApLCBXVEMxKDB4MmY0ZjQyNDApLCBXVEMxKDB4MmU5ZGYxODApLAorICAgIFdUQzEoMHgyZGVjYzc4MCksIFdUQzEoMHgyZDNiZDY0MCksIFdUQzEoMHgyYzhiMGNjMCksIFdUQzEoMHgyYmRhMzA4MCksCisgICAgV1RDMSgweDJiMjhlYzgwKSwgV1RDMSgweDJhNzczNTAwKSwgV1RDMSgweDI5YzUxYjQwKSwgV1RDMSgweDI5MTI5M2MwKSwKKyAgICBXVEMxKDB4Mjg1ZjkyODApLCBXVEMxKDB4MjdhYzM1YzApLCBXVEMxKDB4MjZmOGFiNDApLCBXVEMxKDB4MjY0NTRjMDApLAorICAgIFdUQzEoMHgyNTkyNTYwMCksIFdUQzEoMHgyNGRmZDU4MCksIFdUQzEoMHgyNDJkZGQ0MCksIFdUQzEoMHgyMzdjODdjMCksCisgICAgV1RDMSgweDIyY2JlMjQwKSwgV1RDMSgweDIyMWJlZjQwKSwgV1RDMSgweDIxNmNiMDQwKSwgV1RDMSgweDIwYmUyODAwKSwKKyAgICBXVEMxKDB4MjAxMDVjODApLCBXVEMxKDB4MWY2MzUyYTApLCBXVEMxKDB4MWViNzEyNDApLCBXVEMxKDB4MWUwYmExNDApLAorICAgIFdUQzEoMHgxZDYwZmU0MCksIFdUQzEoMHgxY2I3MjNlMCksIFdUQzEoMHgxYzBlMDMwMCksIFdUQzEoMHgxYjY1OTZjMCksCisgICAgV1RDMSgweDFhYmRlOGEwKSwgV1RDMSgweDFhMTZmYmUwKSwgV1RDMSgweDE5NzBjNjgwKSwgV1RDMSgweDE4Y2I0ODQwKSwKKyAgICBXVEMxKDB4MTgyNjhlMjApLCBXVEMxKDB4MTc4MmEwYzApLCBXVEMxKDB4MTZkZjg5NjApLCBXVEMxKDB4MTYzZDYzMDApLAorICAgIFdUQzEoMHgxNTljNTJjMCksIFdUQzEoMHgxNGZjODdlMCksIFdUQzEoMHgxNDVlMmM4MCksIFdUQzEoMHgxM2MxNWI2MCksCisgICAgV1RDMSgweDEzMjYzMjQwKSwgV1RDMSgweDEyOGNkOWEwKSwgV1RDMSgweDExZjU2MmEwKSwgV1RDMSgweDExNWZjMWMwKSwKKyAgICBXVEMxKDB4MTBjYmYxNjApLCBXVEMxKDB4MTAzOWYyMDApLCBXVEMxKDB4MGZhOWEwODApLCBXVEMxKDB4MGYxYWJkOTApLAorICAgIFdUQzEoMHgwZThkMDFkMCksIFdUQzEoMHgwZTAwMzMzMCksIFdUQzEoMHgwZDc0MzU5MCksIFdUQzEoMHgwY2U4ZWY0MCksCisgICAgV1RDMSgweDBjNWUxOTAwKSwgV1RDMSgweDBiZDM1ZDcwKSwgV1RDMSgweDBiNDg4ZWIwKSwgV1RDMSgweDBhYmQ4NDEwKSwKKyAgICBXVEMxKDB4MGEzMjBhMDApLCBXVEMxKDB4MDlhNjBlNzApLCBXVEMxKDB4MDkxOWFiMDApLCBXVEMxKDB4MDg4ZDBkZTApLAorICAgIFdUQzEoMHgwODAwNjVlMCksIFdUQzEoMHgwNzczOTcxMCksIFdUQzEoMHgwNmU2NTgwOCksIFdUQzEoMHgwNjU4ODM0OCksCisgICAgV1RDMSgweDA1Y2EwYWUwKSwgV1RDMSgweDA1M2FhYWY4KSwgV1RDMSgweDA0YTlmYWYwKSwgV1RDMSgweDA0MTdmNjk4KSwKKyAgICBXVEMxKDB4MDM4NTlmZjQpLCBXVEMxKDB4MDJmNDliZTQpLCBXVEMxKDB4MDI2NmI2NjgpLCBXVEMxKDB4MDFkZTU1NGUpLAorICAgIFdUQzEoMHgwMTVmNTBjYSksIFdUQzEoMHgwMGViN2U1ZCksIFdUQzEoMHgwMDkwNGYyNCksIFdUQzEoMHgwMDIxMjg4OSksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgLyogcGFydCAyICovCisgICAgV1RDMigweGZmZmVjZTAyKSwgV1RDMigweGZmZTRjM2RmKSwgV1RDMigweGZmY2FhYTU1KSwgV1RDMigweGZmYjA4N2QxKSwKKyAgICBXVEMyKDB4ZmY5NjYyYmYpLCBXVEMyKDB4ZmY3YzQxOGIpLCBXVEMyKDB4ZmY2MjJhYTApLCBXVEMyKDB4ZmY0ODI0NmMpLAorICAgIFdUQzIoMHhmZjJlMzU1YSksIFdUQzIoMHhmZjE0NjNkYiksIFdUQzIoMHhmZWZhYjYwOCksIFdUQzIoMHhmZWUxMmYwYSksCisgICAgV1RDMigweGZlYzdjZmQyKSwgV1RDMigweGZlYWU5OTVhKSwgV1RDMigweGZlOTU4Y2M0KSwgV1RDMigweGZlN2NhYmNlKSwKKyAgICBXVEMyKDB4ZmU2M2Y4ODIpLCBXVEMyKDB4ZmU0Yjc0ZTApLCBXVEMyKDB4ZmUzMzIyZjYpLCBXVEMyKDB4ZmUxYjA0ZGMpLAorICAgIFdUQzIoMHhmZTAzMWNjYyksIFdUQzIoMHhmZGViNmNmMCksIFdUQzIoMHhmZGQzZmY3YyksIFdUQzIoMHhmZGJjZTgzNCksCisgICAgV1RDMigweGZkYTYzYmI4KSwgV1RDMigweGZkOTAwYzY4KSwgV1RDMigweGZkN2E1OTBjKSwgV1RDMigweGZkNjUxMWI0KSwKKyAgICBXVEMyKDB4ZmQ1MDI2YzApLCBXVEMyKDB4ZmQzYjg5NTQpLCBXVEMyKDB4ZmQyNzJkZjApLCBXVEMyKDB4ZmQxMzBhZGMpLAorICAgIFdUQzIoMHhmY2ZmMTVhYyksIFdUQzIoMHhmY2ViNGE2OCksIFdUQzIoMHhmY2Q3YjExMCksIFdUQzIoMHhmY2M0NTRkMCksCisgICAgV1RDMigweGZjYjE0MDY0KSwgV1RDMigweGZjOWU4OTZjKSwgV1RDMigweGZjOGM1MjY0KSwgV1RDMigweGZjN2FiZWYwKSwKKyAgICBXVEMyKDB4ZmM2OWYwNzgpLCBXVEMyKDB4ZmM1OWY1ZTgpLCBXVEMyKDB4ZmM0YWNmZWMpLCBXVEMyKDB4ZmMzYzgwNjApLAorICAgIFdUQzIoMHhmYzJmMDI2NCksIFdUQzIoMHhmYzIyM2I3YyksIFdUQzIoMHhmYzE2MDcxNCksIFdUQzIoMHhmYzBhNDE1MCksCisgICAgV1RDMigweGZiZmVjOTIwKSwgV1RDMigweGZiZjM4MzIwKSwgV1RDMigweGZiZTg1NWQwKSwgV1RDMigweGZiZGQyNzQwKSwKKyAgICBXVEMyKDB4ZmJkMWZjNjgpLCBXVEMyKDB4ZmJjNmZlYTApLCBXVEMyKDB4ZmJiYzVhNDgpLCBXVEMyKDB4ZmJiMjNiNDgpLAorICAgIFdUQzIoMHhmYmE4Y2E3OCksIFdUQzIoMHhmYmEwMmU1MCksIFdUQzIoMHhmYjk4OGRlMCksIFdUQzIoMHhmYjkyMGI0MCksCisgICAgV1RDMigweGZiOGNiODcwKSwgV1RDMigweGZiODg5ZjY4KSwgV1RDMigweGZiODVjYmU4KSwgV1RDMigweGZiODQzZGQwKSwKKyAgICBXVEMyKDB4ZmI4M2RmNzgpLCBXVEMyKDB4ZmI4NDk1ZDApLCBXVEMyKDB4ZmI4NjQ2NjApLCBXVEMyKDB4ZmI4OGQ0YTgpLAorICAgIFdUQzIoMHhmYjhjMjFlOCksIFdUQzIoMHhmYjkwMGYyOCksIFdUQzIoMHhmYjk0N2RjMCksIFdUQzIoMHhmYjk5NTBjMCksCisgICAgV1RDMigweGZiOWU2ZDA4KSwgV1RDMigweGZiYTNiNjU4KSwgV1RDMigweGZiYTkxOTA4KSwgV1RDMigweGZiYWU5ZTA4KSwKKyAgICBXVEMyKDB4ZmJiNDViZDApLCBXVEMyKDB4ZmJiYTY2ZjgpLCBXVEMyKDB4ZmJjMGRjZjApLCBXVEMyKDB4ZmJjN2VhZDgpLAorICAgIFdUQzIoMHhmYmNmYzIwMCksIFdUQzIoMHhmYmQ4OTMzMCksIFdUQzIoMHhmYmUyOTRkMCksIFdUQzIoMHhmYmVlMDNkMCksCisgICAgV1RDMigweGZiZmIxZGU4KSwgV1RDMigweGZjMGExZGE0KSwgV1RDMigweGZjMWIyMmUwKSwgV1RDMigweGZjMmUzOGYwKSwKKyAgICBXVEMyKDB4ZmM0MzZkNDgpLCBXVEMyKDB4ZmM1YWJmN2MpLCBXVEMyKDB4ZmM3NDAyNGMpLCBXVEMyKDB4ZmM4ZWYyZTgpLAorICAgIFdUQzIoMHhmY2FiNTFhYyksIFdUQzIoMHhmY2M4ZDAyNCksIFdUQzIoMHhmY2U3MDRmMCksIFdUQzIoMHhmZDA1ODBjYyksCisgICAgV1RDMigweGZkMjNkNGQwKSwgV1RDMigweGZkNDFjZTQwKSwgV1RDMigweGZkNWY4MWIwKSwgV1RDMigweGZkN2QwOGYwKSwKKyAgICBXVEMyKDB4ZmQ5YTg1NjApLCBXVEMyKDB4ZmRiODU5MzgpLCBXVEMyKDB4ZmRkNzE3OTgpLCBXVEMyKDB4ZmRmNzUzYjgpLAorICAgIFdUQzIoMHhmZTE5OTNlZSksIFdUQzIoMHhmZTNlMzBmOCksIFdUQzIoMHhmZTY1NmNiYSksIFdUQzIoMHhmZThmOGZkYyksCisgICAgV1RDMigweGZlYmNhOGE0KSwgV1RDMigweGZlZWM1OTBlKSwgV1RDMigweGZmMWUyODVjKSwgV1RDMigweGZmNTFhMGI3KSwKKyAgICBXVEMyKDB4ZmY4NjYzMzApLCBXVEMyKDB4ZmZiYzJjYmIpLCBXVEMyKDB4ZmZmMmJiZmYpLCBXVEMyKDB4MDAyOWQ3OWQpLAorICAgIFdUQzIoMHgwMDYxOGEyMiksIFdUQzIoMHgwMDlhMTE4NSksIFdUQzIoMHgwMGQzYWE4YyksIFdUQzIoMHgwMTBlOGZmNiksCisgICAgV1RDMigweDAxNGFmMjllKSwgV1RDMigweDAxODhmZTU2KSwgV1RDMigweDAxYzhlMTA4KSwgV1RDMigweDAyMGFiM2M0KSwKKyAgICBXVEMyKDB4MDI0ZTY4YTgpLCBXVEMyKDB4MDI5M2U4MjQpLCBXVEMyKDB4MDJkYjFiYzgpLCBXVEMyKDB4MDMyM2YxYTQpLAorICAgIFdUQzIoMHgwMzZlNWQ2YyksIFdUQzIoMHgwM2JhNTMyMCksIFdUQzIoMHgwNDA3YzkzOCksIFdUQzIoMHgwNDU2Y2FkMCksCisgICAgV1RDMigweDA0YTc3Mjg4KSwgV1RDMigweDA0ZjlkYjg4KSwgV1RDMigweDA1NGUxODg4KSwgV1RDMigweDA1YTQxZWYwKSwKKyAgICBXVEMyKDB4MDVmYmQ2ZTApLCBXVEMyKDB4MDY1NTI4YzApLCBXVEMyKDB4MDZiMDA4MzgpLCBXVEMyKDB4MDcwYzdlZTApLAorICAgIFdUQzIoMHgwNzZhOWJiMCksIFdUQzIoMHgwN2NhNmQxMCksIFdUQzIoMHgwODJjMDhlMCksIFdUQzIoMHgwODhmOGRhMCksCisgICAgV1RDMigweDA4ZjUxYWMwKSwgV1RDMigweDA5NWNjYzIwKSwgV1RDMigweDA5YzY5ZjcwKSwgV1RDMigweDBhMzI3YjQwKSwKKyAgICBXVEMyKDB4MGFhMDQ2ZDApLCBXVEMyKDB4MGIwZmViYjApLCBXVEMyKDB4MGI4MTVkZDApLCBXVEMyKDB4MGJmNDk2MDApLAorICAgIFdUQzIoMHgwYzY5OGM1MCksIFdUQzIoMHgwY2UwM2JhMCksIFdUQzIoMHgwZDU4YTM4MCksIFdUQzIoMHgwZGQyYzUxMCksCisgICAgV1RDMigweDBlNGVhMTEwKSwgV1RDMigweDBlY2MzZGQwKSwgV1RDMigweDBmNGJhODAwKSwgV1RDMigweDBmY2NlZDEwKSwKKyAgICBXVEMyKDB4MTA1MDE5NjApLCBXVEMyKDB4MTBkNTMyYTApLCBXVEMyKDB4MTE1YzM5YzApLCBXVEMyKDB4MTFlNTJmYTApLAorICAgIFdUQzIoMHgxMjcwMTU2MCksIFdUQzIoMHgxMmZjZWYyMCksIFdUQzIoMHgxMzhiYzIwMCksIFdUQzIoMHgxNDFjOTMwMCksCisgICAgV1RDMigweDE0YWY2NGEwKSwgV1RDMigweDE1NDQzNGUwKSwgV1RDMigweDE1ZGIwMDIwKSwgV1RDMigweDE2NzNjMzYwKSwKKyAgICBXVEMyKDB4MTcwZTdlODApLCBXVEMyKDB4MTdhYjM1ZTApLCBXVEMyKDB4MTg0OWVlNDApLCBXVEMyKDB4MThlYWFiYTApLAorICAgIFdUQzIoMHgxOThkNmYwMCksIFdUQzIoMHgxYTMyMzZhMCksIFdUQzIoMHgxYWQ5MDA4MCksIFdUQzIoMHgxYjgxY2M2MCksCisgICAgV1RDMigweDFjMmM5ZGEwKSwgV1RDMigweDFjZDk3OTgwKSwgV1RDMigweDFkODg2NWMwKSwgV1RDMigweDFlMzk2NTQwKSwKKyAgICBXVEMyKDB4MWVlYzc3MDApLCBXVEMyKDB4MWZhMTk4YzApLCBXVEMyKDB4MjA1OGM4NDApLCBXVEMyKDB4MjExMjA2NDApLAorICAgIFdUQzIoMHgyMWNkNTcwMCksIFdUQzIoMHgyMjhhYmVjMCksIFdUQzIoMHgyMzRhNDE4MCksIFdUQzIoMHgyNDBiZGY4MCksCisgICAgV1RDMigweDI0Y2Y5NWMwKSwgV1RDMigweDI1OTU2MWMwKSwgV1RDMigweDI2NWQ0MjAwKSwgV1RDMigweDI3MjczODQwKSwKKyAgICBXVEMyKDB4MjdmMzQ4YzApLCBXVEMyKDB4MjhjMTc3MDApLCBXVEMyKDB4Mjk5MWM1MDApLCBXVEMyKDB4MmE2NDMwODApLAorICAgIFdUQzIoMHgyYjM4YjY4MCksIFdUQzIoMHgyYzBmNTNjMCksIFdUQzIoMHgyY2U4MDg0MCksIFdUQzIoMHgyZGMyZDY4MCksCisgICAgV1RDMigweDJlOWZjMTAwKSwgV1RDMigweDJmN2VjYWMwKSwgV1RDMigweDMwNWZmMjgwKSwgV1RDMigweDMxNDMzNGMwKSwKKyAgICBXVEMyKDB4MzIyODhlMDApLCBXVEMyKDB4MzMwZmZiODApLCBXVEMyKDB4MzNmOTdkODApLCBXVEMyKDB4MzRlNTE1YzApLAorICAgIFdUQzIoMHgzNWQyYzVjMCksIFdUQzIoMHgzNmMyOGQwMCksIFdUQzIoMHgzN2I0NjdjMCksIFdUQzIoMHgzOGE4NTA4MCksCisgICAgV1RDMigweDM5OWU0MjQwKSwgV1RDMigweDNhOTYzYTAwKSwgV1RDMigweDNiOTAzNjAwKSwgV1RDMigweDNjOGMzNDgwKSwKKyAgICBXVEMyKDB4M2Q4YTMzODApLCBXVEMyKDB4M2U4YTJkYzApLCBXVEMyKDB4M2Y4YzFiNDApLCBXVEMyKDB4NDA4ZmYyZmYpLAorICAgIFdUQzIoMHg0MTk1YWU3ZiksIFdUQzIoMHg0MjlkNDc3ZiksIFdUQzIoMHg0M2E2Yjg3ZiksIFdUQzIoMHg0NGIxZmRmZiksCisgICAgV1RDMigweDQ1YmYxMWZmKSwgV1RDMigweDQ2Y2RlZTdmKSwgV1RDMigweDQ3ZGU4Y2ZmKSwgV1RDMigweDQ4ZjBlNzdmKSwKKyAgICBXVEMyKDB4NGEwNTBlZmYpLCBXVEMyKDB4NGIxYjJkZmYpLCBXVEMyKDB4NGMzMzcyZmYpLCBXVEMyKDB4NGQ0ZTBiZmYpLAorICAgIFdUQzIoMHg0ZTZiMjU3ZiksIFdUQzIoMHg0ZjhhZWRmZiksIFdUQzIoMHg1MGFkOTJmZiksIFdUQzIoMHg1MWQzNDFmZiksCisgICAgV1RDMigweDAwMjAwNmE5KSwgV1RDMigweDAwMGJmYjM2KSwgV1RDMigweGZmZmU0NWFjKSwgV1RDMigweGZmZjZkMDY0KSwKKyAgICBXVEMyKDB4ZmZmNTg1YmMpLCBXVEMyKDB4ZmZmYTUwMGQpLCBXVEMyKDB4MDAwNTE5YjQpLCBXVEMyKDB4MDAxNWNkMGMpLAorICAgIFdUQzIoMHgwMDJjNTQ3MCksIFdUQzIoMHgwMDQ4OWEzYiksIFdUQzIoMHgwMDZhODhjOCksIFdUQzIoMHgwMDkyMGE3NCksCisgICAgV1RDMigweDAwYmYwOTk5KSwgV1RDMigweDAwZjE3MDkyKSwgV1RDMigweDAxMjkyOWJjKSwgV1RDMigweDAxNjYxZjcwKSwKKyAgICBXVEMyKDB4MDFhODNjMGMpLCBXVEMyKDB4MDFlZjY5ZTgpLCBXVEMyKDB4MDIzYjkzNjQpLCBXVEMyKDB4MDI4Y2EyZDQpLAorICAgIFdUQzIoMHgwMmUyODI5YyksIFdUQzIoMHgwMzNkMWQxMCksIFdUQzIoMHgwMzljNWM5MCksIFdUQzIoMHgwNDAwMmI3OCksCisgICAgV1RDMigweDA0Njg3NDE4KSwgV1RDMigweDA0ZDUyMGUwKSwgV1RDMigweDA1NDYxYzE4KSwgV1RDMigweDA1YmI1MDIwKSwKKyAgICBXVEMyKDB4MDYzNGE3NTgpLCBXVEMyKDB4MDZiMjBjMjApLCBXVEMyKDB4MDczMzY4YzgpLCBXVEMyKDB4MDdiOGE3YjApLAorICAgIFdUQzIoMHgwODQxYjM0MCksIFdUQzIoMHgwOGNlNzViMCksIFdUQzIoMHgwOTVlZDk4MCksIFdUQzIoMHgwOWYyYzkwMCksCisgICAgV1RDMigweDBhOGEyZTgwKSwgV1RDMigweDBiMjRmNDcwKSwgV1RDMigweDBiYzMwNTEwKSwgV1RDMigweDBjNjQ0YWQwKSwKKyAgICBXVEMyKDB4MGQwOGIwMTApLCBXVEMyKDB4MGRiMDFmMTApLCBXVEMyKDB4MGU1YTgyNTApLCBXVEMyKDB4MGYwN2M0MDApLAorICAgIFdUQzIoMHgwZmI3Y2VhMCksIFdUQzIoMHgxMDZhOGM4MCksIFdUQzIoMHgxMTFmZTgwMCksIFdUQzIoMHgxMWQ3Y2I2MCksCisgICAgV1RDMigweDEyOTIyMTIwKSwgV1RDMigweDEzNGVkM2EwKSwgV1RDMigweDE0MGRjZDAwKSwgV1RDMigweDE0Y2VmN2UwKSwKKyAgICBXVEMyKDB4MTU5MjNlNjApLCBXVEMyKDB4MTY1NzhiMDApLCBXVEMyKDB4MTcxZWM4MjApLCBXVEMyKDB4MTdlN2UwMjApLAorICAgIFdUQzIoMHgxOGIyYmQyMCksIFdUQzIoMHgxOTdmNDljMCksIFdUQzIoMHgxYTRkNzA0MCksIFdUQzIoMHgxYjFkMWIwMCksCisgICAgV1RDMigweDFiZWUzNDYwKSwgV1RDMigweDFjYzBhNmEwKSwgV1RDMigweDFkOTQ1YzQwKSwgV1RDMigweDFlNjkzZjgwKSwKKyAgICBXVEMyKDB4MWYzZjNhYzApLCBXVEMyKDB4MjAxNjM4ODApLCBXVEMyKDB4MjBlZTIyYzApLCBXVEMyKDB4MjFjNmU0NDApLAorICAgIFdUQzIoMHgyMmEwNjc0MCksIFdUQzIoMHgyMzdhOTYwMCksIFdUQzIoMHgyNDU1NWFjMCksIFdUQzIoMHgyNTMwYTA0MCksCisgICAgV1RDMigweDI2MGM1MDgwKSwgV1RDMigweDI2ZTg1NjAwKSwgV1RDMigweDI3YzQ5YjAwKSwgV1RDMigweDI4YTEwYTAwKSwKKyAgICBXVEMyKDB4Mjk3ZDhkODApLCBXVEMyKDB4MmE1YTBmODApLCBXVEMyKDB4MmIzNjdhODApLCBXVEMyKDB4MmMxMmI4YzApLAorICAgIFdUQzIoMHgyY2VlYjUwMCksIFdUQzIoMHgyZGNhNTk0MCksIFdUQzIoMHgyZWE1OGZjMCksIFdUQzIoMHgyZjgwNDM0MCksCisgICAgV1RDMigweDMwNWE1ZGMwKSwgV1RDMigweDMxMzNjYTAwKSwgV1RDMigweDMyMGM3MjAwKSwgV1RDMigweDMyZTQ0MDAwKSwKKyAgICBXVEMyKDB4MzNiYjFlYzApLCBXVEMyKDB4MzQ5MGY4ODApLCBXVEMyKDB4MzU2NWI3YzApLCBXVEMyKDB4MzYzOTQ2NDApLAorICAgIFdUQzIoMHgzNzBiOGYwMCksIFdUQzIoMHgzN2RjN2MwMCksIFdUQzIoMHgzOGFiZjdjMCksIFdUQzIoMHgzOTc5ZWNjMCksCisgICAgV1RDMigweDNhNDY0NTAwKSwgV1RDMigweDNiMTBlYjAwKSwgV1RDMigweDNiZDljOTQwKSwgV1RDMigweDNjYTBjOWMwKSwKKyAgICBXVEMyKDB4M2Q2NWQ3NDApLCBXVEMyKDB4M2UyOGRjMDApLCBXVEMyKDB4M2VlOWMyNDApLCBXVEMyKDB4M2ZhODc0ODApLAorICAgIFdUQzIoMHg0MDY0ZGNmZiksIFdUQzIoMHg0MTFlZTY3ZiksIFdUQzIoMHg0MWQ2N2E3ZiksIFdUQzIoMHg0MjhiODQ3ZiksCisgICAgV1RDMigweDQzM2RlZDdmKSwgV1RDMigweDQzZWRhMGZmKSwgV1RDMigweDQ0OWE4ODdmKSwgV1RDMigweDQ1NDQ4ZjdmKSwKKyAgICBXVEMyKDB4NDVlYjllZmYpLCBXVEMyKDB4NDY4ZmExZmYpLCBXVEMyKDB4NDczMDgyZmYpLCBXVEMyKDB4NDdjZTJjN2YpLAorICAgIFdUQzIoMHg0ODY4ODg3ZiksIFdUQzIoMHg0OGZmODBmZiksIFdUQzIoMHg0OTkzMDBmZiksIFdUQzIoMHg0YTIyZjJmZiksCisgICAgV1RDMigweDRhYWY0MDdmKSwgV1RDMigweDRiMzdkNDdmKSwgV1RDMigweDRiYmM5OTdmKSwgV1RDMigweDRjM2Q3OGZmKSwKKyAgICBXVEMyKDB4NGNiYTVlN2YpLCBXVEMyKDB4NGQzMzMzN2YpLCBXVEMyKDB4NGRhN2UyN2YpLCBXVEMyKDB4NGUxODU2N2YpLAorICAgIFdUQzIoMHg0ZTg0NzhmZiksIFdUQzIoMHg0ZWVjMzQ3ZiksIFdUQzIoMHg0ZjRmNzM3ZiksIFdUQzIoMHg0ZmFlMjBmZiksCisgICAgV1RDMigweDUwMDgyNWZmKSwgV1RDMigweDUwNWQ2ZGZmKSwgV1RDMigweDUwYWRlMzdmKSwgV1RDMigweDUwZjk2ZjdmKSwKKyAgICBXVEMyKDB4NTEzZmZkZmYpLCBXVEMyKDB4NTE4MTc3ZmYpLCBXVEMyKDB4NTFiZGM4N2YpLCBXVEMyKDB4NTFmNGQ5ZmYpLAorICAgIFdUQzIoMHg1MjI2OTY3ZiksIFdUQzIoMHg1MjUyZTg3ZiksIFdUQzIoMHg1Mjc5YjlmZiksIFdUQzIoMHg1MjlhZjVmZiksCisgICAgV1RDMigweDUyYjY4NjdmKSwgV1RDMigweDUyY2M1NWZmKSwgV1RDMigweDUyZGM0ZWZmKSwgV1RDMigweDUyZTY1YWZmKSwKKyAgICBXVEMyKDB4NTJlYTY1N2YpLCBXVEMyKDB4NTJlODU3ZmYpLCBXVEMyKDB4NTJlMDFkN2YpLCBXVEMyKDB4NTJkMTlmZmYpLAorICAgIFdUQzIoMHg1MmJjYzlmZiksIFdUQzIoMHg1MmExODU3ZiksIFdUQzIoMHg1MjdmYmQ3ZiksIFdUQzIoMHg1MjU3NWI3ZiksCisgICAgV1RDMigweDUyMjg0YTdmKSwgV1RDMigweDUxZjI3NGZmKSwgV1RDMigweDUxYjVjNDdmKSwgV1RDMigweDUxNzIyNDdmKSwKKyAgICBXVEMyKDB4NTEyNzdkZmYpLCBXVEMyKDB4NTBkNWJjN2YpLCBXVEMyKDB4NTA3Y2M5ZmYpLCBXVEMyKDB4NTAxYzkwZmYpLAorICAgIFdUQzIoMHg0ZmI0ZmI3ZiksIFdUQzIoMHg0ZjQ1ZjNmZiksIFdUQzIoMHg0ZWNmNjRmZiksIFdUQzIoMHg0ZTUxMzhmZiksCisgICAgV1RDMigweDRkY2I1OTdmKSwgV1RDMigweDRkM2RiMWZmKSwgV1RDMigweDRjYTgyYmZmKSwgV1RDMigweDRjMGFiMjdmKSwKKyAgICBXVEMyKDB4NGI2NTJmN2YpLCBXVEMyKDB4NGFiNzhkN2YpLCBXVEMyKDB4NGEwMWI2N2YpLCBXVEMyKDB4NDk0Mzk1N2YpLAorICAgIFdUQzIoMHg0ODdkMTJmZiksIFdUQzIoMHg0N2FlMWY3ZiksIFdUQzIoMHg0NmQ2OGY3ZiksIFdUQzIoMHg0NWY3MTg3ZiksCisgICAgV1RDMigweDQ1MTM1OTdmKSwgV1RDMigweDQ0MzA0NjdmKSwgV1RDMigweDQzNTJkMmZmKSwgV1RDMigweDQyN2U2YmZmKSwKKyAgICBXVEMyKDB4NDFiMzkwZmYpLCBXVEMyKDB4NDBmMjA3N2YpLCBXVEMyKDB4NDAzOWE4N2YpLCBXVEMyKDB4M2Y4YTMxMDApLAorICAgIFdUQzIoMHgzZWUzM2UwMCksIFdUQzIoMHgzZTQ0NmFjMCksIFdUQzIoMHgzZGFkNTE4MCksIFdUQzIoMHgzZDFkN2ZjMCksCisgICAgV1RDMigweDNjOTQ3YjAwKSwgV1RDMigweDNjMTFjN2MwKSwgV1RDMigweDNiOTRlYmMwKSwgV1RDMigweDNiMWQ2ZGMwKSwKKyAgICBXVEMyKDB4M2FhYWQ0ODApLCBXVEMyKDB4M2EzY2E3NDApLCBXVEMyKDB4MzlkMjZjNDApLCBXVEMyKDB4Mzk2YmE4YzApLAorICAgIFdUQzIoMHgzOTA3ZTA4MCksIFdUQzIoMHgzOGE2OTgwMCksIFdUQzIoMHgzODQ3M2Q4MCksIFdUQzIoMHgzN2U5MjNjMCksCisgICAgV1RDMigweDM3OGI5YjgwKSwgV1RDMigweDM3MmUwMzgwKSwgV1RDMigweDM2ZDAzYTgwKSwgV1RDMigweDM2NzI3ZjAwKSwKKyAgICBXVEMyKDB4MzYxNTBlNDApLCBXVEMyKDB4MzViODE1NDApLCBXVEMyKDB4MzU1YjgwMDApLCBXVEMyKDB4MzRmZjFkYzApLAorICAgIFdUQzIoMHgzNGEyYmZjMCksIFdUQzIoMHgzNDQ2M2U4MCksIFdUQzIoMHgzM2U5ODJjMCksIFdUQzIoMHgzMzhjNzg4MCksCisgICAgV1RDMigweDMzMmYwYmMwKSwgV1RDMigweDMyZDExODAwKSwgV1RDMigweDMyNzI2NWMwKSwgV1RDMigweDMyMTJiYmMwKSwKKyAgICBXVEMyKDB4MzFiMWU3NDApLCBXVEMyKDB4MzE0ZmVmMDApLCBXVEMyKDB4MzBlZDA1NDApLCBXVEMyKDB4MzA4OTVjODApLAorICAgIFdUQzIoMHgzMDI1MTg4MCksIFdUQzIoMHgyZmMwMjg4MCksIFdUQzIoMHgyZjVhNjQ4MCksIFdUQzIoMHgyZWYzYTQ4MCksCisgICAgV1RDMigweDJlOGJkNjQwKSwgV1RDMigweDJlMjMxMTAwKSwgV1RDMigweDJkYjk3NjgwKSwgV1RDMigweDJkNGYyNzAwKSwKKyAgICBXVEMyKDB4MmNlNDMxYzApLCBXVEMyKDB4MmM3ODkwODApLCBXVEMyKDB4MmMwYzNiYzApLCBXVEMyKDB4MmI5ZjJiYzApLAorICAgIFdUQzIoMHgyYjMxNTk0MCksIFdUQzIoMHgyYWMyYmMwMCksIFdUQzIoMHgyYTUzNGNjMCksIFdUQzIoMHgyOWUzMDNjMCl9OworCitjb25zdCBGSVhQX1dUQiBFTERBbmFseXNpczI1Nls3NjhdID0geworICAgIFdUQygweGZhYmFiZGU4KSwgV1RDKDB4ZmE4ZTFlNmEpLCBXVEMoMHhmYTYwMTJhOSksIFdUQygweGZhMzBjOGRkKSwKKyAgICBXVEMoMHhmYTAwNmY0YiksIFdUQygweGY5Y2YzMmM0KSwgV1RDKDB4Zjk5ZDFjYzgpLCBXVEMoMHhmOTZhMTQ4ZCksCisgICAgV1RDKDB4ZjkzNjE4NGQpLCBXVEMoMHhmOTAxM2Q1YiksIFdUQygweGY4Y2I3YjY3KSwgV1RDKDB4Zjg5NGFjZTApLAorICAgIFdUQygweGY4NWNkMjhlKSwgV1RDKDB4ZjgyNDEzZjgpLCBXVEMoMHhmN2VhOTBhZiksIFdUQygweGY3YjA1ZWU2KSwKKyAgICBXVEMoMHhmNzc1OWIwYiksIFdUQygweGY3M2E2NzFmKSwgV1RDKDB4ZjZmZWJlYTMpLCBXVEMoMHhmNmMyN2EwZSksCisgICAgV1RDKDB4ZjY4NWNhMzMpLCBXVEMoMHhmNjQ5MzkwNyksIFdUQygweGY2MGQ0MzdiKSwgV1RDKDB4ZjVkMjU1MWYpLAorICAgIFdUQygweGY1OThkMjczKSwgV1RDKDB4ZjU2MTE5OWUpLCBXVEMoMHhmNTJiOGM2ZiksIFdUQygweGY0Zjg5MDdkKSwKKyAgICBXVEMoMHhmNGM4N2ZkZiksIFdUQygweGY0OWJhODA2KSwgV1RDKDB4ZjQ3MjQyODYpLCBXVEMoMHhmNDRjNjEyNyksCisgICAgV1RDKDB4ZjQyODI0MzUpLCBXVEMoMHhmNDAxY2VhZSksIFdUQygweGYzZDc3NWExKSwgV1RDKDB4ZjNhOTE0NzcpLAorICAgIFdUQygweGYzNzZjMzNmKSwgV1RDKDB4ZjM0MGEzMjgpLCBXVEMoMHhmMzA2ZDRkNiksIFdUQygweGYyYzk3NzVjKSwKKyAgICBXVEMoMHhmMjg4YTNlZCksIFdUQygweGYyNDQ2ZTJhKSwgV1RDKDB4ZjFmY2ZhNDUpLCBXVEMoMHhmMWIyN2IyZCksCisgICAgV1RDKDB4ZjE2NGYzZjQpLCBXVEMoMHhmMTE0MzY1YyksIFdUQygweGYwYzAwNTMyKSwgV1RDKDB4ZjA2ODE3YTkpLAorICAgIFdUQygweGYwMGM0ZWE0KSwgV1RDKDB4ZWZhY2JjN2YpLCBXVEMoMHhlZjRhMjA1ZiksIFdUQygweGVlZTVkYzMzKSwKKyAgICBXVEMoMHhlZTgwOGEwZCksIFdUQygweGVlMTllZWIyKSwgV1RDKDB4ZWRiMTJmNmUpLCBXVEMoMHhlZDQ0ZThlYiksCisgICAgV1RDKDB4ZWNkNTBhMTMpLCBXVEMoMHhlYzYyZDhkZCksIFdUQygweGViZWY2OGIyKSwgV1RDKDB4ZWI3YjgwNWMpLAorICAgIFdUQygweGViMDY5YWY0KSwgV1RDKDB4ZWE4ZWVmMWMpLCBXVEMoMHhlYTEzMWM4NiksIFdUQygweGU5OTIzNGM2KSwKKyAgICBXVEMoMHhlOTBjZDljMiksIFdUQygweGU4ODRmNjViKSwgV1RDKDB4ZTdmY2JkNmQpLCBXVEMoMHhlNzc2NzMwMCksCisgICAgV1RDKDB4ZTZmMjg5ZDApLCBXVEMoMHhlNjZmOTU4YSksIFdUQygweGU1ZWFlOTlmKSwgV1RDKDB4ZTU2MGM0MDMpLAorICAgIFdUQygweGU0Y2ZhYWExKSwgV1RDKDB4ZTQzODg3ZGMpLCBXVEMoMHhlMzlkZWRjNCksIFdUQygweGUzMDNmMTkwKSwKKyAgICBXVEMoMHhlMjZkN2Y1ZCksIFdUQygweGUxZGMzNGZmKSwgV1RDKDB4ZTE0ZjljZWQpLCBXVEMoMHhlMGM1M2NkMCksCisgICAgV1RDKDB4ZTAzYWIwODUpLCBXVEMoMHhkZmFkYzk0OCksIFdUQygweGRmMWQ2NDBjKSwgV1RDKDB4ZGU4OTZiYjYpLAorICAgIFdUQygweGRkZjI1NmFkKSwgV1RDKDB4ZGQ1OTFlM2QpLCBXVEMoMHhkY2JmMGFlYyksIFdUQygweGRjMjVhYjBhKSwKKyAgICBXVEMoMHhkYjhlMzM0YyksIFdUQygweGRhZjk3Nzk0KSwgV1RDKDB4ZGE2N2JlZDkpLCBXVEMoMHhkOWQ4YzUyNCksCisgICAgV1RDKDB4ZDk0YmZhNjIpLCBXVEMoMHhkOGMwODliNSksIFdUQygweGQ4MzVjMTUxKSwgV1RDKDB4ZDdhYjE3MDQpLAorICAgIFdUQygweGQ3MjAwOTA2KSwgV1RDKDB4ZDY5NDIwZGMpLCBXVEMoMHhkNjA3M2MwZCksIFdUQygweGQ1Nzk5NjE1KSwKKyAgICBXVEMoMHhkNGVjN2M4NyksIFdUQygweGQ0NjI0MWM5KSwgV1RDKDB4ZDNkYzViZGUpLCBXVEMoMHhkMzViNGE3OSksCisgICAgV1RDKDB4ZDJkZTEwMzIpLCBXVEMoMHhkMjYyNDZmNSksIFdUQygweGQxZTY4ZWQyKSwgV1RDKDB4ZDE2YWEwYTQpLAorICAgIFdUQygweGQwZWVhNWQyKSwgV1RDKDB4ZDA3MzMwMmIpLCBXVEMoMHhjZmY5Mzc0OSksIFdUQygweGNmODIwZjQ1KSwKKyAgICBXVEMoMHhjZjBlYmIzMCksIFdUQygweGNlOWZkNzAyKSwgV1RDKDB4Y2UzNDU5NmMpLCBXVEMoMHhjZGM5YTgwMyksCisgICAgV1RDKDB4Y2Q1ZWM1ZDYpLCBXVEMoMHhjY2Y0NjhlYyksIFdUQygweGNjOGJiNDFlKSwgV1RDKDB4Y2MyNjE5Y2MpLAorICAgIFdUQygweGNiYzNlMDkwKSwgV1RDKDB4Y2I2NDIyZjUpLCBXVEMoMHhjYjA2NGQyZiksIFdUQygweGNhYWEyYTZkKSwKKyAgICBXVEMoMHhjYTRmYmRjOSksIFdUQygweGM5ZjczYzQzKSwgV1RDKDB4YzlhMGRjOWIpLCBXVEMoMHhjOTRjZGQwMiksCisgICAgV1RDKDB4YzhmNTc4YTQpLCBXVEMoMHhjOGEyNGQxNSksIFdUQygweGM4NGRjNzFmKSwgV1RDKDB4YzdmODM1MTYpLAorICAgIFdUQygweGM3YTFlNGI5KSwgV1RDKDB4Yzc0YjIyYjEpLCBXVEMoMHhjNmY0MTI4NCksIFdUQygweGM2OWNhYmMxKSwKKyAgICBXVEMoMHhjNjQ0OTg2ZCksIFdUQygweGM1ZWI0MTY3KSwgV1RDKDB4YzU5MTAzMTIpLCBXVEMoMHhjNTM3MmM3ZiksCisgICAgV1RDKDB4YzRkZWJhMmUpLCBXVEMoMHhjNDg4M2VjYSksIFdUQygweGM0MzMxMGYwKSwgV1RDKDB4YzNkZDVjNWEpLAorICAgIFdUQygweGMzODY4ODAyKSwgV1RDKDB4YzMyZjQzMWQpLCBXVEMoMHhjMmQ4NmM5ZSksIFdUQygweGMyODMwMGE2KSwKKyAgICBXVEMoMHhjMjJmYWUzMyksIFdUQygweGMxZGVkM2Y3KSwgV1RDKDB4YzE5MDhkN2QpLCBXVEMoMHhjMTQ0YjBlZCksCisgICAgV1RDKDB4YzBmYTdjZWUpLCBXVEMoMHhjMGIwYTNiNSksIFdUQygweGMwNjZiOGQzKSwgV1RDKDB4YzAxZDNiMzIpLAorICAgIFdUQygweGJmZDUxNjFjKSwgV1RDKDB4YmY4ZjkyYWYpLCBXVEMoMHhiZjRkNWNlYSksIFdUQygweGJmMGU3ZDVlKSwKKyAgICBXVEMoMHhiZWQyY2UzYSksIFdUQygweGJlOWEwMDYyKSwgV1RDKDB4YmU2M2NlYzIpLCBXVEMoMHhiZTJmZmQyZiksCisgICAgV1RDKDB4YmRmZTQ1NjUpLCBXVEMoMHhiZGNlNTU2OCksIFdUQygweGJkYTAwM2RmKSwgV1RDKDB4YmQ3MzUwMTgpLAorICAgIFdUQygweGJkNDg1YjJjKSwgV1RDKDB4YmQxZjY5YmQpLCBXVEMoMHhiY2Y4ZGI3YyksIFdUQygweGJjZDUyYjBhKSwKKyAgICBXVEMoMHhiY2I0YWU0YSksIFdUQygweGJjOTc5MzgyKSwgV1RDKDB4YmM3ZGNiYWIpLCBXVEMoMHhiYzY3MDlkYyksCisgICAgV1RDKDB4YmM1MmMxYjEpLCBXVEMoMHhiYzQwMmYyYiksIFdUQygweGJjMmVjMzdiKSwgV1RDKDB4YmMxZTJjYjMpLAorICAgIFdUQygweGJjMGU1ZDVmKSwgV1RDKDB4YmJmZjhmMjMpLCBXVEMoMHhiYmYyMzhkMiksIFdUQygweGJiZTcwN2Q0KSwKKyAgICBXVEMoMHhiYmRlM2M2MyksIFdUQygweGJiZDdhNjU4KSwgV1RDKDB4YmJkMmM3ZjApLCBXVEMoMHhiYmNlZTE4YiksCisgICAgV1RDKDB4YmJjYmRlYmIpLCBXVEMoMHhiYmNhNWFiMSksIFdUQygweGJiY2I1NjIyKSwgV1RDKDB4YmJkMDMyZTQpLAorICAgIFdUQygweGJiZDkxZDRkKSwgV1RDKDB4YmJlNTM3NTcpLCBXVEMoMHhiYmYzMmY1NCksIFdUQygweGJjMDE2NzgxKSwKKyAgICBXVEMoMHhiYzBmNDMzYSksIFdUQygweGJjMWQyYWE0KSwgV1RDKDB4YmMyYjQ5MTIpLCBXVEMoMHhiYzM5ODVkZiksCisgICAgV1RDKDB4YmM0N2Q2YjkpLCBXVEMoMHhiYzU2NDA5OSksIFdUQygweGJjNjRjNzhhKSwgV1RDKDB4YmM3MzZkOTYpLAorICAgIFdUQygweGJjODIzMjEwKSwgV1RDKDB4YmM5MTE0ODQpLCBXVEMoMHhiY2EwMTViOCksIFdUQygweGJjYWYzN2ViKSwKKyAgICBXVEMoMHhiY2JlN2JjMyksIFdUQygweGJjY2RkZTRkKSwgV1RDKDB4YmNkZDYwMzcpLCBXVEMoMHhiY2VkMDQ5YSksCisgICAgV1RDKDB4YmNmY2NjODEpLCBXVEMoMHhiZDBjYjQ4MiksIFdUQygweGJkMWNiY2FhKSwgV1RDKDB4YmQyY2U3ZWEpLAorICAgIFdUQygweGJkM2QzNjNiKSwgV1RDKDB4YmQ0ZGE0NDUpLCBXVEMoMHhiZDVlMzEyZCksIFdUQygweGJkNmVkZmQxKSwKKyAgICBXVEMoMHhiZDdmYWUxNCksIFdUQygweGJkOTA5OTFiKSwgV1RDKDB4YmRhMTlmY2YpLCBXVEMoMHhiZGIyYzQ2NCksCisgICAgV1RDKDB4YmRjNDA1M2IpLCBXVEMoMHhiZGQ1NWY0YiksIFdUQygweGJkZTZkMGEwKSwgV1RDKDB4YmRmODVjNTEpLAorICAgIFdUQygweGJlMDlmZmEzKSwgV1RDKDB4YmUxYmI3MjQpLCBXVEMoMHhiZTJkODE2MCksIFdUQygweGJlM2Y1Zjk4KSwKKyAgICBXVEMoMHhiZTUxNTE0NCksIFdUQygweGJlNjM1MWE5KSwgV1RDKDB4YmU3NTVlYmQpLCBXVEMoMHhiZTg3N2I4ZSksCisgICAgV1RDKDB4YmU5OWE2M2QpLCBXVEMoMHhiZWFiZGE0NSksIFdUQygweGJlYmUxNmIwKSwgV1RDKDB4YmVkMDVkMWMpLAorICAgIFdUQygweGJlZTJhZGE5KSwgV1RDKDB4YmVmNTAyZTIpLCBXVEMoMHhiZjA3NWM0MCksIFdUQygweGJmMTliYzBiKSwKKyAgICBXVEMoMHhiZjJjMjE3ZiksIFdUQygweGJmM2U4ODdhKSwgV1RDKDB4YmY1MGYwOWQpLCBXVEMoMHhiZjYzNWM3NyksCisgICAgV1RDKDB4YmY3NWNhYzApLCBXVEMoMHhiZjg4MzkwNSksIFdUQygweGJmOWFhNjJiKSwgV1RDKDB4YmZhZDE0ZjEpLAorICAgIFdUQygweGJmYmY4NWM3KSwgV1RDKDB4YmZkMWY1OTIpLCBXVEMoMHhiZmU0NjFmYyksIFdUQygweGJmZjZjODZhKSwKKyAgICBXVEMoMHg4MDEyNmM4ZCksIFdUQygweDgwMzcyNDQ4KSwgV1RDKDB4ODA1YmQyZmQpLCBXVEMoMHg4MDgwNzMxNSksCisgICAgV1RDKDB4ODBhNGZmZmEpLCBXVEMoMHg4MGM5NzQ4ZCksIFdUQygweDgwZWRkMDhiKSwgV1RDKDB4ODExMjFhMjMpLAorICAgIFdUQygweDgxMzY0ZmRlKSwgV1RDKDB4ODE1YTZiMTYpLCBXVEMoMHg4MTdlNmIzNiksIFdUQygweDgxYTI1NDMzKSwKKyAgICBXVEMoMHg4MWM2MjVjOCksIFdUQygweDgxZTlkODAxKSwgV1RDKDB4ODIwZDZhNWMpLCBXVEMoMHg4MjMwZTA2MCksCisgICAgV1RDKDB4ODI1NDM4YzApLCBXVEMoMHg4Mjc3NmFjNyksIFdUQygweDgyOWE3NTU1KSwgV1RDKDB4ODJiZDVjYTMpLAorICAgIFdUQygweDgyZTAxZTgwKSwgV1RDKDB4ODMwMmIyMDApLCBXVEMoMHg4MzI1MTU5MCksIFdUQygweDgzNDc0ZDc5KSwKKyAgICBXVEMoMHg4MzY5NTY2ZiksIFdUQygweDgzOGIyOTU3KSwgV1RDKDB4ODNhY2MyZDkpLCBXVEMoMHg4M2NlMjdjMSksCisgICAgV1RDKDB4ODNlZjU0YjkpLCBXVEMoMHg4NDEwNDJkMSksIFdUQygweDg0MzBlZjE1KSwgV1RDKDB4ODQ1MTVlODQpLAorICAgIFdUQygweDg0NzE4ZTMyKSwgV1RDKDB4ODQ5MTc4MDQpLCBXVEMoMHg4NGIxMWEyNSksIFdUQygweDg0ZDA3ODhkKSwKKyAgICBXVEMoMHg4NGVmOTMyMiksIFdUQygweDg1MGU2MWVjKSwgV1RDKDB4ODUyY2U0MDApLCBXVEMoMHg4NTRiMWUwYSksCisgICAgV1RDKDB4ODU2OTBmMmMpLCBXVEMoMHg4NTg2YjIwNyksIFdUQygweDg1YTQwNTdiKSwgV1RDKDB4ODVjMTEwN2QpLAorICAgIFdUQygweDg1ZGRkMzM1KSwgV1RDKDB4ODVmYTQ4NWUpLCBXVEMoMHg4NjE2NzE3MiksIFdUQygweDg2MzI1NDlkKSwKKyAgICBXVEMoMHg4NjRkZjM4OCksIFdUQygweDg2Njk0OTdlKSwgV1RDKDB4ODY4NDU3NTcpLCBXVEMoMHg4NjlmMjIxOCksCisgICAgV1RDKDB4ODZiOWFiNWEpLCBXVEMoMHg4NmQzZjFiZiksIFdUQygweDg2ZWRmNjhmKSwgV1RDKDB4ODcwN2JhZjEpLAorICAgIFdUQygweDg3MjE0N2UwKSwgV1RDKDB4ODczYWE2ZmMpLCBXVEMoMHg4NzUzYzU3MSksIFdUQygweDg3NmM3NmU2KSwKKyAgICBXVEMoMHg4Nzg1MGFiNyksIFdUQygweDg3OWUzNzNiKSwgV1RDKDB4ODdiNmVhMzcpLCBXVEMoMHg4N2NjNDE4OCksCisgICAgV1RDKDB4ODgwZDQzMDApLCBXVEMoMHg4ODU1ZTlmZiksIFdUQygweDg4YWNmY2EwKSwgV1RDKDB4ODkwZDBmOTQpLAorICAgIFdUQygweDg5NzFlN2Q1KSwgV1RDKDB4ODlkOGEwYzEpLCBXVEMoMHg4YTNmYzQyNSksIFdUQygweDhhYTc0MTA1KSwKKyAgICBXVEMoMHg4YjBmNWI5MyksIFdUQygweDhiNzhhMTA3KSwgV1RDKDB4OGJlMzhiYjMpLCBXVEMoMHg4YzUwODA5MiksCisgICAgV1RDKDB4OGNiZmUzODQpLCBXVEMoMHg4ZDMyMTRmMSksIFdUQygweDhkYTc1ZDIxKSwgV1RDKDB4OGUxZmU5NmMpLAorICAgIFdUQygweDhlOWJlNzZhKSwgV1RDKDB4OGYxYjgwNmMpLCBXVEMoMHg4ZjllZDMxNCksIFdUQygweDkwMjVmMjZhKSwKKyAgICBXVEMoMHg5MGIwZWNlYSksIFdUQygweDkxM2ZkMGViKSwgV1RDKDB4OTFkMmE2ODQpLCBXVEMoMHg5MjY5NmRlYSksCisgICAgV1RDKDB4OTMwNDI4NjgpLCBXVEMoMHg5M2EyZDQ1NiksIFdUQygweDk0NDU2ZDIwKSwgV1RDKDB4OTRlYmU5ZTUpLAorICAgIFdUQygweDk1OTY0MTc4KSwgV1RDKDB4OTY0NDZhMDUpLCBXVEMoMHg5NmY2NTk1OCksIFdUQygweDk3YWMwNTlhKSwKKyAgICBXVEMoMHg5ODY1NjA4OSksIFdUQygweDk5MjI1YTgwKSwgV1RDKDB4OTllMmUyZTgpLCBXVEMoMHg5YWE2ZTY2NiksCisgICAgV1RDKDB4OWI2ZTU0YjgpLCBXVEMoMHg5YzM5MWQ5OSksIFdUQygweDlkMDczMzhhKSwgV1RDKDB4OWRkODg4OGQpLAorICAgIFdUQygweDllYWQwYjVjKSwgV1RDKDB4OWY4NGE4NzEpLCBXVEMoMHhhMDVmNGZiMyksIFdUQygweGExM2NmOTEzKSwKKyAgICBXVEMoMHhhMjFkOTg5MSksIFdUQygweGEzMDExZTI3KSwgV1RDKDB4YTNlNzdlYjQpLCBXVEMoMHhhNGQwYjE5MCksCisgICAgV1RDKDB4YTViY2IwZDcpLCBXVEMoMHhhNmFiNzUwYyksIFdUQygweGE3OWNmODg0KSwgV1RDKDB4YTg5MTM1Y2IpLAorICAgIFdUQygweGE5ODgyYTQ0KSwgV1RDKDB4YWE4MWQ1NzgpLCBXVEMoMHhhYjdlMzlhNiksIFdUQygweGFjN2Q1YTM2KSwKKyAgICBXVEMoMHhhZDdmM2JhNSksIFdUQygweGFlODNkZmVkKSwgV1RDKDB4YWY4YjRlMTYpLCBXVEMoMHhiMDk1OTExYyksCisgICAgV1RDKDB4YjFhMmFmZDEpLCBXVEMoMHhiMmIyYWM5ZiksIFdUQygweGIzYzU4ODA3KSwgV1RDKDB4YjRkYjRkNWUpLAorICAgIFdUQygweDRhMjY4ZWFkKSwgV1RDKDB4NDkwYjViYTcpLCBXVEMoMHg0N2VkOGQzMCksIFdUQygweDQ2Y2QxMGM1KSwKKyAgICBXVEMoMHg0NWE5ZGNjMSksIFdUQygweDQ0ODNmMjY3KSwgV1RDKDB4NDM1YjVhZWIpLCBXVEMoMHg0MjMwMWQxMiksCisgICAgV1RDKDB4NDEwMjNhMTUpLCBXVEMoMHgzZmQxOWJmMSksIFdUQygweDNlOWUzMWUxKSwgV1RDKDB4M2Q2ODI5ODYpLAorICAgIFdUQygweDNjMmZjMDAxKSwgV1RDKDB4M2FmNTJkOGYpLCBXVEMoMHgzOWI4OGI3ZCksIFdUQygweDM4Nzk4NjQyKSwKKyAgICBXVEMoMHgzNzM3ZTZkMyksIFdUQygweDM1ZjNlOThhKSwgV1RDKDB4MzRhZGQ0NWMpLCBXVEMoMHgzMzY2MDA4MyksCisgICAgV1RDKDB4MzIxY2NmM2EpLCBXVEMoMHgzMGQyOTYzZSksIFdUQygweDJmODdhMjhmKSwgV1RDKDB4MmUzYzIyY2QpLAorICAgIFdUQygweDJjZjAxMGU1KSwgV1RDKDB4MmJhMmZmZTUpLCBXVEMoMHgyYTU0YmE5MyksIFdUQygweDI5MDU5NmY1KSwKKyAgICBXVEMoMHgyN2I2MjgwNiksIFdUQygweDI2Njc2MmI4KSwgV1RDKDB4MjUxYTExYjEpLCBXVEMoMHgyM2NlOTRmOSksCisgICAgV1RDKDB4MjI4NTJkZGIpLCBXVEMoMHgyMTNkZjM0MCksIFdUQygweDFmZjkwMTg1KSwgV1RDKDB4MWViNjdkOTQpLAorICAgIFdUQygweDFkNzY3NDg1KSwgV1RDKDB4MWMzOGQ0NzcpLCBXVEMoMHgxYWZkYTc0NyksIFdUQygweDE5YzUyNDhiKSwKKyAgICBXVEMoMHgxODhmODI1OSksIFdUQygweDE3NWQwZDQwKSwgV1RDKDB4MTYyZTUzMjApLCBXVEMoMHgxNTA0MzZjZCksCisgICAgV1RDKDB4MTNkZjhkM2YpLCBXVEMoMHgxMmMxMDJmMSksIFdUQygweDExYThkZDY1KSwgV1RDKDB4MTA5NmQ0OTApLAorICAgIFdUQygweDBmOGExNzU1KSwgV1RDKDB4MGU4MTFkY2QpLCBXVEMoMHgwZDdhY2I5YSksIFdUQygweDBjNzY3ZDAwKSwKKyAgICBXVEMoMHgwYjczMzRkOSksIFdUQygweDBhNmZlZjMxKSwgV1RDKDB4MDk2YzVhODcpLCBXVEMoMHgwODY5MWFkYiksCisgICAgV1RDKDB4MDc2NWUzOTUpLCBXVEMoMHgwNjYxMDMwOSksIFdUQygweDA1NThhMGQyKSwgV1RDKDB4MDQ0YTk0NmMpLAorICAgIFdUQygweDAzM2FjYjUyKSwgV1RDKDB4MDIzNDcwNmYpLCBXVEMoMHgwMTQ5MzlkYyksIFdUQygweDAwOTI4NTc3KSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4ZmZlNzM1OTMpLCBXVEMoMHhmZmI2M2ZjZiksIFdUQygweGZmODUzYzFmKSwgV1RDKDB4ZmY1NDU0ZDcpLAorICAgIFdUQygweGZmMjNiNDRiKSwgV1RDKDB4ZmVmMzg0MTcpLCBXVEMoMHhmZWMzZGM5YSksIFdUQygweGZlOTRjNTExKSwKKyAgICBXVEMoMHhmZTY2NDc1MyksIFdUQygweGZlMzg3MDg2KSwgV1RDKDB4ZmUwYjRlNjMpLCBXVEMoMHhmZGRlZjE1YyksCisgICAgV1RDKDB4ZmRiM2EzZjYpLCBXVEMoMHhmZDg5ZTYxMSksIFdUQygweGZkNjFjNzUwKSwgV1RDKDB4ZmQzYWU1ODUpLAorICAgIFdUQygweGZkMTRlYzA5KSwgV1RDKDB4ZmNlZjliMDYpLCBXVEMoMHhmY2NhZjUwOSksIFdUQygweGZjYTc0MTgwKSwKKyAgICBXVEMoMHhmYzg1MThhMyksIFdUQygweGZjNjU1YzdhKSwgV1RDKDB4ZmM0ODg1NDUpLCBXVEMoMHhmYzJlOTk5OCksCisgICAgV1RDKDB4ZmMxNzI2YmIpLCBXVEMoMHhmYzAxNDYzZiksIFdUQygweGZiZWMyYzY0KSwgV1RDKDB4ZmJkNzM1Y2UpLAorICAgIFdUQygweGZiYzI5ZThlKSwgV1RDKDB4ZmJhZjgwNDIpLCBXVEMoMHhmYjllZWJhMCksIFdUQygweGZiOTFkYzA1KSwKKyAgICBXVEMoMHhmYjg4ZjQyMCksIFdUQygweGZiODQ3OWViKSwgV1RDKDB4ZmI4NDM5OGIpLCBXVEMoMHhmYjg3ODg0YiksCisgICAgV1RDKDB4ZmI4ZGE4YmYpLCBXVEMoMHhmYjk1ZDAyMCksIFdUQygweGZiOWYzZTQ5KSwgV1RDKDB4ZmJhOTQ0OGEpLAorICAgIFdUQygweGZiYjNjZjEwKSwgV1RDKDB4ZmJiZjY3ZTcpLCBXVEMoMHhmYmNjZjY1ZCksIFdUQygweGZiZGRiYTU4KSwKKyAgICBXVEMoMHhmYmYzMWY0NiksIFdUQygweGZjMGViMjM2KSwgV1RDKDB4ZmMzMTY0ZjApLCBXVEMoMHhmYzViODI2OSksCisgICAgV1RDKDB4ZmM4YzViY2QpLCBXVEMoMHhmY2MyNDhlZSksIFdUQygweGZjZmIwNTZjKSwgV1RDKDB4ZmQzM2NjMjYpLAorICAgIFdUQygweGZkNmI4NGVlKSwgV1RDKDB4ZmRhMmQ5ZTcpLCBXVEMoMHhmZGRjMDNmYiksIFdUQygweGZlMWFhZjU3KSwKKyAgICBXVEMoMHhmZTYxYTBhZiksIFdUQygweGZlYjI4ZGY3KSwgV1RDKDB4ZmYwY2QzNDMpLCBXVEMoMHhmZjZkODM4OCksCisgICAgV1RDKDB4ZmZkMjQzMzEpLCBXVEMoMHgwMDM5NmZlMyksIFdUQygweDAwYTJmYjNlKSwgV1RDKDB4MDExMDcwNTApLAorICAgIFdUQygweDAxODMxOTAwKSwgV1RDKDB4MDFmYzIzNzcpLCBXVEMoMHgwMjdiZDFmYyksIFdUQygweDAzMDE5YTJkKSwKKyAgICBXVEMoMHgwMzhkMGE4OCksIFdUQygweDA0MWRkODhmKSwgV1RDKDB4MDRiNDM0OTUpLCBXVEMoMHgwNTUwYzFlZiksCisgICAgV1RDKDB4MDVmMzhiZDYpLCBXVEMoMHgwNjljMDUyMyksIFdUQygweDA3NGExMTRlKSwgV1RDKDB4MDdmZTBjZWIpLAorICAgIFdUQygweDA4Yjg4ZTMzKSwgV1RDKDB4MDk3YTU5NjUpLCBXVEMoMHgwYTQzODMxOCksIFdUQygweDBiMTM3MDQ2KSwKKyAgICBXVEMoMHgwYmU5YjVhYiksIFdUQygweDBjYzYxZmE5KSwgV1RDKDB4MGRhODk3YjIpLCBXVEMoMHgwZTkxMjNiMyksCisgICAgV1RDKDB4MGY3ZmYyMDApLCBXVEMoMHgxMDc1NTY5NiksIFdUQygweDExNzE3Zjk0KSwgV1RDKDB4MTI3NDc0YTApLAorICAgIFdUQygweDEzN2U0ODlkKSwgV1RDKDB4MTQ4ZjFiMDIpLCBXVEMoMHgxNWE2ZjE1ZSksIFdUQygweDE2YzViN2M5KSwKKyAgICBXVEMoMHgxN2ViNzJiMSksIFdUQygweDE5MTgzZTUxKSwgV1RDKDB4MWE0YzI0NDQpLCBXVEMoMHgxYjg3MWIxYyksCisgICAgV1RDKDB4MWNjOTJlOTIpLCBXVEMoMHgxZTEyN2ZmYyksIFdUQygweDFmNjMxOWI5KSwgV1RDKDB4MjBiYWVmNzgpLAorICAgIFdUQygweDIyMWEwODYxKSwgV1RDKDB4MjM4MDdmOTQpLCBXVEMoMHgyNGVlNWE4OSksIFdUQygweDI2NjM4OThkKSwKKyAgICBXVEMoMHgyN2UwMTAxZSksIFdUQygweDI5NjQwNThkKSwgV1RDKDB4MmFlZjZiY2YpLCBXVEMoMHgyYzgyMzBmYyksCisgICAgV1RDKDB4MmUxYzU0NWIpLCBXVEMoMHgyZmJkZTcyYiksIFdUQygweDMxNjZlNzZmKSwgV1RDKDB4MzMxNzNmNWQpLAorICAgIFdUQygweDM0Y2VlOGMzKSwgV1RDKDB4MzY4ZGViZTEpLCBXVEMoMHgzODU0M2Q0ZiksIFdUQygweDNhMjFiZDk0KSwKKyAgICBXVEMoMHgzYmY2NTc2ZiksIFdUQygweDNkZDFmZjA3KSwgV1RDKDB4M2ZiNDk0OGUpLCBXVEMoMHg0MTlkZTQxNCksCisgICAgV1RDKDB4NDM4ZGMyMDIpLCBXVEMoMHg0NTg0MGU3ZCksIFdUQygweDQ3ODBhNDM1KSwgV1RDKDB4NDk4MzYwOWYpLAorICAgIFdUQygweDRiOGNjNTQ4KSwgV1RDKDB4NGQ5ZGY3OTYpLCBXVEMoMHg0ZmI4MWY0NiksIFdUQygweDUxZGM4NjkwKSwKKyAgICBXVEMoMHgwMDBkOTcwZCksIFdUQygweGZmZjdlYTY3KSwgV1RDKDB4ZmZmN2ZjM2QpLCBXVEMoMHgwMDBkM2RlMiksCisgICAgV1RDKDB4MDAzNzIwYWQpLCBXVEMoMHgwMDc1MTVmMSksIFdUQygweDAwYzY4ZjA0KSwgV1RDKDB4MDEyYWZkM2IpLAorICAgIFdUQygweDAxYTFkMWVjKSwgV1RDKDB4MDIyYTdlNjkpLCBXVEMoMHgwMmM0NzQwOCksIFdUQygweDAzNmYyNDIwKSwKKyAgICBXVEMoMHgwNDJhMDAwMSksIFdUQygweDA0ZjQ3OTA1KSwgV1RDKDB4MDVjZTAwN2UpLCBXVEMoMHgwNmI2MDdiZSksCisgICAgV1RDKDB4MDdhYzAwMjgpLCBXVEMoMHgwOGFmNWIwMSksIFdUQygweDA5YmY4OWE3KSwgV1RDKDB4MGFkYmZkNmQpLAorICAgIFdUQygweDBjMDQyNzk4KSwgV1RDKDB4MGQzNzc5OTcpLCBXVEMoMHgwZTc1NjRiNSksIFdUQygweDBmYmQ1YTNhKSwKKyAgICBXVEMoMHgxMTBlY2I4NSksIFdUQygweDEyNjkyOWZiKSwgV1RDKDB4MTNjYmU2ZTYpLCBXVEMoMHgxNTM2NzM3NiksCisgICAgV1RDKDB4MTZhODQxM2YpLCBXVEMoMHgxODIwYzE1ZiksIFdUQygweDE5OWY2NTY4KSwgV1RDKDB4MWIyMzllNmIpLAorICAgIFdUQygweDFjYWNkZGUyKSwgV1RDKDB4MWUzYTk1MWEpLCBXVEMoMHgxZmNjMzU2ZiksIFdUQygweDIxNjEzMDFmKSwKKyAgICBXVEMoMHgyMmY4ZjZiNyksIFdUQygweDI0OTJmYTRhKSwgV1RDKDB4MjYyZWFjM2YpLCBXVEMoMHgyN2NiN2UyMCksCisgICAgV1RDKDB4Mjk2OGUwYzQpLCBXVEMoMHgyYjA2NDYyNSksIFdUQygweDJjYTMxZjFhKSwgV1RDKDB4MmUzZWRkMmEpLAorICAgIFdUQygweDJmZDhmMTlmKSwgV1RDKDB4MzE3MGNlMDApLCBXVEMoMHgzMzA1ZTMyYyksIFdUQygweDM0OTdhMmRmKSwKKyAgICBXVEMoMHgzNjI1N2U3OCksIFdUQygweDM3YWVlNzBiKSwgV1RDKDB4MzkzMzRlMDUpLCBXVEMoMHgzYWIyMjQ5OCksCisgICAgV1RDKDB4M2MyYWRjMmMpLCBXVEMoMHgzZDljZTY0NSksIFdUQygweDNmMDdiM2VmKSwgV1RDKDB4NDA2YWI2Y2EpLAorICAgIFdUQygweDQxYzU2MDAxKSwgV1RDKDB4NDMxNzIxNGEpLCBXVEMoMHg0NDVmNmIzNCksIFdUQygweDQ1OWRhZjVkKSwKKyAgICBXVEMoMHg0NmQxNWY1NiksIFdUQygweDQ3ZjllZDcxKSwgV1RDKDB4NDkxNmQxMWYpLCBXVEMoMHg0YTI3NTc3MCksCisgICAgV1RDKDB4NGIyYjJmZmYpLCBXVEMoMHg0YzIxOWVhZSksIFdUQygweDRkMGEyMGNiKSwgV1RDKDB4NGRlNDI4OGUpLAorICAgIFdUQygweDRlYWYyNjNkKSwgV1RDKDB4NGY2YThiYjgpLCBXVEMoMHg1MDE1Y2EzMyksIFdUQygweDUwYjA1MmRkKSwKKyAgICBXVEMoMHg1MTM5OTc1NyksIFdUQygweDUxYjEwOGM2KSwgV1RDKDB4NTIxNjE5MGEpLCBXVEMoMHg1MjY4Mzg3YyksCisgICAgV1RDKDB4NTJhNmQ5MzMpLCBXVEMoMHg1MmQxNmMxOSksIFdUQygweDUyZTc2MjhiKSwgV1RDKDB4NTJlODJlYTMpLAorICAgIFdUQygweDUyZDM0MDdkKSwgV1RDKDB4NTJhODBhMjgpLCBXVEMoMHg1MjY1ZmQ0MyksIFdUQygweDUyMGM4YTFkKSwKKyAgICBXVEMoMHg1MTliMjJjOCksIFdUQygweDUxMTEzOGUwKSwgV1RDKDB4NTA2ZTNjODIpLCBXVEMoMHg0ZmIxYTAzNyksCisgICAgV1RDKDB4NGVkYWQ0ZTMpLCBXVEMoMHg0ZGU5NGMyZCksIFdUQygweDRjZGM3NmQ4KSwgV1RDKDB4NGJiM2M2ODMpLAorICAgIFdUQygweDRhNmVhY2QyKSwgV1RDKDB4NDkwYzlhYmUpLCBXVEMoMHg0NzhkMDRmMSksIFdUQygweDQ1ZjAwNDIwKSwKKyAgICBXVEMoMHg0NDQ1NjczZiksIFdUQygweDQyYWMwZDJlKSwgV1RDKDB4NDEzMzgzNjQpLCBXVEMoMHgzZmRiNWI1OCksCisgICAgV1RDKDB4M2VhMWMzMGYpLCBXVEMoMHgzZDg0Mjc4MCksIFdUQygweDNjN2ZhNzYzKSwgV1RDKDB4M2I5MTFiOTYpLAorICAgIFdUQygweDNhYjU2MGJmKSwgV1RDKDB4MzllOTU5MDgpLCBXVEMoMHgzOTI5ZGViYiksIFdUQygweDM4NzNiZDRkKSwKKyAgICBXVEMoMHgzN2MzMWRiMiksIFdUQygweDM3MTNhNTljKSwgV1RDKDB4MzY2M2RlYjIpLCBXVEMoMHgzNWI1MmYyMyksCisgICAgV1RDKDB4MzUwN2M2MWUpLCBXVEMoMHgzNDVhN2Y0MiksIFdUQygweDMzYWM3ZTBjKSwgV1RDKDB4MzJmZDM2NmYpLAorICAgIFdUQygweDMyNGJhYTI4KSwgV1RDKDB4MzE5Njc0ZTkpLCBXVEMoMHgzMGRkN2UxYSksIFdUQygweDMwMjFmM2U4KSwKKyAgICBXVEMoMHgyZjYzZjkwMyksIFdUQygweDJlYTJhMWFhKSwgV1RDKDB4MmRkZGQ5N2IpLCBXVEMoMHgyZDE2Njk4NSksCisgICAgV1RDKDB4MmM0Y2E0MmYpLCBXVEMoMHgyYjgwNWNjYSksIFdUQygweDJhYjE2MmFhKSwgV1RDKDB4MjlkZjdiMTcpLAogfTsKIAorY29uc3QgRklYUF9XVEIgRUxEQW5hbHlzaXMyNDBbNzIwXSA9IHsKKyAgICBXVEMoMHhmYWI5NDc3YiksIFdUQygweGZhODk5MzQ0KSwgV1RDKDB4ZmE1ODQ1ZGQpLCBXVEMoMHhmYTI1OTc2MiksCisgICAgV1RDKDB4ZjlmMWMwMDUpLCBXVEMoMHhmOWJjZWZlNiksIFdUQygweGY5ODcxZThiKSwgV1RDKDB4Zjk1MDMzOTcpLAorICAgIFdUQygweGY5MTgzZjQ3KSwgV1RDKDB4ZjhkZjRlYWMpLCBXVEMoMHhmOGE1M2JhNyksIFdUQygweGY4NjlmMGJlKSwKKyAgICBXVEMoMHhmODJkOTc1OSksIFdUQygweGY3ZjA1OTNlKSwgV1RDKDB4ZjdiMjUyMGEpLCBXVEMoMHhmNzczYTM3YyksCisgICAgV1RDKDB4ZjczNDc1Y2UpLCBXVEMoMHhmNmY0YmVkZCksIFdUQygweGY2YjQ1NWE4KSwgV1RDKDB4ZjY3Mzk1MjUpLAorICAgIFdUQygweGY2MzMyNTEwKSwgV1RDKDB4ZjVmMzkzOGIpLCBXVEMoMHhmNWI1NjA3MyksIFdUQygweGY1NzkwMGJkKSwKKyAgICBXVEMoMHhmNTNlZTgyZCksIFdUQygweGY1MDc5MTQ5KSwgV1RDKDB4ZjRkMzZmZmMpLCBXVEMoMHhmNGEyZTUyNiksCisgICAgV1RDKDB4ZjQ3NjNkOTEpLCBXVEMoMHhmNDRkOTg3MiksIFdUQygweGY0MjZlYWVkKSwgV1RDKDB4ZjNmZGMxNjEpLAorICAgIFdUQygweGYzZDAwMWZmKSwgV1RDKDB4ZjM5ZGFmY2MpLCBXVEMoMHhmMzY2ZWI0MyksIFdUQygweGYzMmJkY2RjKSwKKyAgICBXVEMoMHhmMmVjYWI4MCksIFdUQygweGYyYTk3YjM0KSwgV1RDKDB4ZjI2MjY1YWUpLCBXVEMoMHhmMjE3OGE2ZiksCisgICAgV1RDKDB4ZjFjOTI0NTgpLCBXVEMoMHhmMTc3NTJiOSksIFdUQygweGYxMjFlNmFjKSwgV1RDKDB4ZjBjODlhNjMpLAorICAgIFdUQygweGYwNmIxNWVmKSwgV1RDKDB4ZjAwOTJlODYpLCBXVEMoMHhlZmEyZmQ0MiksIFdUQygweGVmMzk3ZWJjKSwKKyAgICBXVEMoMHhlZWNlNTFjNiksIFdUQygweGVlNjFlOGI2KSwgV1RDKDB4ZWRmM2Q5MmUpLCBXVEMoMHhlZDgyYzMzMCksCisgICAgV1RDKDB4ZWQwZDU4YmIpLCBXVEMoMHhlYzk0ODkxYiksIFdUQygweGVjMTlkNDM1KSwgV1RDKDB4ZWI5ZTRlNGUpLAorICAgIFdUQygweGViMjIxMDAwKSwgV1RDKDB4ZWFhMzI0MjIpLCBXVEMoMHhlYTFmYjQ0MCksIFdUQygweGU5OTY5NWQyKSwKKyAgICBXVEMoMHhlOTA4NTlhYiksIFdUQygweGU4Nzc1MTE0KSwgV1RDKDB4ZTdlNjJiMzcpLCBXVEMoMHhlNzU3ODE0NyksCisgICAgV1RDKDB4ZTZjYjNhYzEpLCBXVEMoMHhlNjNmNTY5NiksIFdUQygweGU1YWZlOTE2KSwgV1RDKDB4ZTUxOTA5MGYpLAorICAgIFdUQygweGU0N2FhYjBkKSwgV1RDKDB4ZTNkNmMyZDApLCBXVEMoMHhlMzMxZGFlNyksIFdUQygweGUyOTAzMWUxKSwKKyAgICBXVEMoMHhlMWY0MDkyNiksIFdUQygweGUxNWQ4N2QyKSwgV1RDKDB4ZTBjOWQ3MjcpLCBXVEMoMHhlMDM2MGFkNSksCisgICAgV1RDKDB4ZGY5ZjgxYWYpLCBXVEMoMHhkZjA0ZjlmOSksIFdUQygweGRlNjY2OTdmKSwgV1RDKDB4ZGRjNDhjYTEpLAorICAgIFdUQygweGRkMjBhNDJhKSwgV1RDKDB4ZGM3YzY4NTMpLCBXVEMoMHhkYmQ5YTQ3NiksIFdUQygweGRiMzk4YThjKSwKKyAgICBXVEMoMHhkYTljZDdjMiksIFdUQygweGRhMDM2NWNmKSwgV1RDKDB4ZDk2Y2FkODUpLCBXVEMoMHhkOGQ3YjdhMyksCisgICAgV1RDKDB4ZDg0MzllOGMpLCBXVEMoMHhkN2FmYjczZCksIFdUQygweGQ3MWI2MzQ3KSwgV1RDKDB4ZDY4NjE0OWEpLAorICAgIFdUQygweGQ1ZWZhYjJjKSwgV1RDKDB4ZDU1ODg3N2UpLCBXVEMoMHhkNGMyOWRiYyksIFdUQygweGQ0MzBhMGFhKSwKKyAgICBXVEMoMHhkM2EzZDQ5MCksIFdUQygweGQzMWM1ODhmKSwgV1RDKDB4ZDI5N2UwNzUpLCBXVEMoMHhkMjEzZWYzMyksCisgICAgV1RDKDB4ZDE4ZmQ1NjYpLCBXVEMoMHhkMTBiOGQzZiksIFdUQygweGQwODdiMjUwKSwgV1RDKDB4ZDAwNTRlZjIpLAorICAgIFdUQygweGNmODVmOTRhKSwgV1RDKDB4Y2YwYWY1ZjcpLCBXVEMoMHhjZTk0ZmFmNSksIFdUQygweGNlMjI5NDA5KSwKKyAgICBXVEMoMHhjZGIwYjVmOCksIFdUQygweGNkM2VjNTU0KSwgV1RDKDB4Y2NjZGJmNTgpLCBXVEMoMHhjYzVmMzlkNSksCisgICAgV1RDKDB4Y2JmNDllZjUpLCBXVEMoMHhjYjhkNWY3MyksIFdUQygweGNiMjg4MDFjKSwgV1RDKDB4Y2FjNWEyNjUpLAorICAgIFdUQygweGNhNjRhZDJlKSwgV1RDKDB4Y2EwNWQ3ZmQpLCBXVEMoMHhjOWE5NjYwMiksIFdUQygweGM5NGY5Zjc5KSwKKyAgICBXVEMoMHhjOGYyYjk1NCksIFdUQygweGM4OTllNzk1KSwgV1RDKDB4YzgzZjk0YWEpLCBXVEMoMHhjN2U0MWY2MyksCisgICAgV1RDKDB4Yzc4N2U2OWYpLCBXVEMoMHhjNzJiM2ZkMCksIFdUQygweGM2Y2UzZjBmKSwgV1RDKDB4YzY3MGMxNzUpLAorICAgIFdUQygweGM2MTIyNGNmKSwgV1RDKDB4YzViMjFmZWMpLCBXVEMoMHhjNTUyMDJhNCksIFdUQygweGM0ZjMzNTNhKSwKKyAgICBXVEMoMHhjNDk2ODU5NyksIFdUQygweGM0M2I5M2YyKSwgV1RDKDB4YzNlMDNkMjYpLCBXVEMoMHhjMzgzYTAxMSksCisgICAgV1RDKDB4YzMyNjhhZWQpLCBXVEMoMHhjMmNhMTAzOSksIFdUQygweGMyNmY1YmNjKSwgV1RDKDB4YzIxNzI2YzkpLAorICAgIFdUQygweGMxYzFkNWIyKSwgV1RDKDB4YzE2ZjY2YmEpLCBXVEMoMHhjMTFmNzZkOSksIFdUQygweGMwZDBhOWY2KSwKKyAgICBXVEMoMHhjMDgxY2RkYiksIFdUQygweGMwMzMzMTgwKSwgV1RDKDB4YmZlNWJiNTQpLCBXVEMoMHhiZjlhZWU5MCksCisgICAgV1RDKDB4YmY1M2Q1ODcpLCBXVEMoMHhiZjEwODg1NSksIFdUQygweGJlZDBkZTA1KSwgV1RDKDB4YmU5NDc3ZDcpLAorICAgIFdUQygweGJlNWIwMzBmKSwgV1RDKDB4YmUyNDM2NDIpLCBXVEMoMHhiZGVmYjcyZiksIFdUQygweGJkYmQyOWRmKSwKKyAgICBXVEMoMHhiZDhjNzFhYiksIFdUQygweGJkNWQ5OWNiKSwgV1RDKDB4YmQzMGUzNzUpLCBXVEMoMHhiZDA2YWZjYyksCisgICAgV1RDKDB4YmNkZjhjN2YpLCBXVEMoMHhiY2JiZjcwNCksIFdUQygweGJjOWMzMDdlKSwgV1RDKDB4YmM4MDNiODYpLAorICAgIFdUQygweGJjNjdjMGM3KSwgV1RDKDB4YmM1MjFkM2QpLCBXVEMoMHhiYzNlNjU2MSksIFdUQygweGJjMmJmMmNiKSwKKyAgICBXVEMoMHhiYzFhNjg3MiksIFdUQygweGJjMDljZTE1KSwgV1RDKDB4YmJmYTc2NGYpLCBXVEMoMHhiYmVkMTM1NiksCisgICAgV1RDKDB4YmJlMjU3ZmEpLCBXVEMoMHhiYmRhNDA5OSksIFdUQygweGJiZDQ2YTMxKSwgV1RDKDB4YmJjZmZhNzYpLAorICAgIFdUQygweGJiY2M3NjZkKSwgV1RDKDB4YmJjYTc4MmYpLCBXVEMoMHhiYmNiMTZjNyksIFdUQygweGJiY2ZmNzdjKSwKKyAgICBXVEMoMHhiYmQ5NzhlNiksIFdUQygweGJiZTY4ZTVmKSwgV1RDKDB4YmJmNTkzZWQpLCBXVEMoMHhiYzA0YTgzNCksCisgICAgV1RDKDB4YmMxMzY5NDEpLCBXVEMoMHhiYzIyNTJjMyksIFdUQygweGJjMzE3MjNkKSwgV1RDKDB4YmM0MGFiOTIpLAorICAgIFdUQygweGJjNGZmZTJkKSwgV1RDKDB4YmM1ZjcwNzIpLCBXVEMoMHhiYzZmMDUyMCksIFdUQygweGJjN2ViZDIzKSwKKyAgICBXVEMoMHhiYzhlOTc0NiksIFdUQygweGJjOWU5NDJmKSwgV1RDKDB4YmNhZWI2MzMpLCBXVEMoMHhiY2JlZmU4YiksCisgICAgV1RDKDB4YmNjZjY5YmIpLCBXVEMoMHhiY2RmZjkyZSksIFdUQygweGJjZjBiMDRmKSwgV1RDKDB4YmQwMThlYmQpLAorICAgIFdUQygweGJkMTI5MTkyKSwgV1RDKDB4YmQyM2I5YjgpLCBXVEMoMHhiZDM1MGFmYiksIFdUQygweGJkNDY4MjBlKSwKKyAgICBXVEMoMHhiZDU4MWJmYyksIFdUQygweGJkNjlkYjExKSwgV1RDKDB4YmQ3YmJmNTcpLCBXVEMoMHhiZDhkYzU4NCksCisgICAgV1RDKDB4YmQ5ZmVhYWQpLCBXVEMoMHhiZGIyMzFhNCksIFdUQygweGJkYzQ5OGVhKSwgV1RDKDB4YmRkNzFjZDEpLAorICAgIFdUQygweGJkZTliYjU3KSwgV1RDKDB4YmRmYzc3ZDkpLCBXVEMoMHhiZTBmNGU5MyksIFdUQygweGJlMjIzYWU1KSwKKyAgICBXVEMoMHhiZTM1M2NmNSksIFdUQygweGJlNDg1Njg5KSwgV1RDKDB4YmU1YjgzMjkpLCBXVEMoMHhiZTZlYmU4OCksCisgICAgV1RDKDB4YmU4MjBhZmQpLCBXVEMoMHhiZTk1NjgxMSksIFdUQygweGJlYThkMTA5KSwgV1RDKDB4YmViYzQzNTIpLAorICAgIFdUQygweGJlY2ZjMGZiKSwgV1RDKDB4YmVlMzRhMDcpLCBXVEMoMHhiZWY2ZDg4NCksIFdUQygweGJmMGE2YmIxKSwKKyAgICBXVEMoMHhiZjFlMDY4NSksIFdUQygweGJmMzFhNjg1KSwgV1RDKDB4YmY0NTQ4M2MpLCBXVEMoMHhiZjU4ZWI2YiksCisgICAgV1RDKDB4YmY2YzkzNzYpLCBXVEMoMHhiZjgwM2M5MCksIFdUQygweGJmOTNlNGI5KSwgV1RDKDB4YmZhNzhkMDUpLAorICAgIFdUQygweGJmYmIzODMwKSwgV1RDKDB4YmZjZWUzMzkpLCBXVEMoMHhiZmUyOGFhOSksIFdUQygweGJmZjYyYjg5KSwKKyAgICBXVEMoMHg4MDEzYTVmNCksIFdUQygweDgwM2FjZmQ2KSwgV1RDKDB4ODA2MWVlYzcpLCBXVEMoMHg4MDg4ZmM3MyksCisgICAgV1RDKDB4ODBhZmYyNzApLCBXVEMoMHg4MGQ2Y2JlNSksIFdUQygweDgwZmQ4YzJhKSwgV1RDKDB4ODEyNDM3YTgpLAorICAgIFdUQygweDgxNGFjOTRmKSwgV1RDKDB4ODE3MTNhZGMpLCBXVEMoMHg4MTk3OTA5OCksIFdUQygweDgxYmRjY2I3KSwKKyAgICBXVEMoMHg4MWUzZTczOCksIFdUQygweDgyMDlkZDA0KSwgV1RDKDB4ODIyZmIyM2EpLCBXVEMoMHg4MjU1NjViYiksCisgICAgV1RDKDB4ODI3YWVkOTQpLCBXVEMoMHg4MmEwNDkwOSksIFdUQygweDgyYzU3Yzg1KSwgV1RDKDB4ODJlYTgzMWMpLAorICAgIFdUQygweDgzMGY1MzlkKSwgV1RDKDB4ODMzM2VlYmEpLCBXVEMoMHg4MzU4NTg1YSksIFdUQygweDgzN2M4ODJlKSwKKyAgICBXVEMoMHg4M2EwNzc0MiksIFdUQygweDgzYzQyOGE1KSwgV1RDKDB4ODNlNzljNGMpLCBXVEMoMHg4NDBhY2E2NSksCisgICAgV1RDKDB4ODQyZGFkODEpLCBXVEMoMHg4NDUwNGFjMCksIFdUQygweDg0NzI5ZmIxKSwgV1RDKDB4ODQ5NGE0ZjEpLAorICAgIFdUQygweDg0YjY1OTMyKSwgV1RDKDB4ODRkN2MwZjgpLCBXVEMoMHg4NGY4ZDkzNiksIFdUQygweDg1MTk5YTU5KSwKKyAgICBXVEMoMHg4NTNhMDVhMSksIFdUQygweDg1NWEyMDIzKSwgV1RDKDB4ODU3OWU0NmUpLCBXVEMoMHg4NTk5NGQ1NSksCisgICAgV1RDKDB4ODViODYxOTApLCBXVEMoMHg4NWQ3MjNlNiksIFdUQygweDg1ZjU4ZmE5KSwgV1RDKDB4ODYxM2EzY2UpLAorICAgIFdUQygweDg2MzE2N2I1KSwgV1RDKDB4ODY0ZWRkZmUpLCBXVEMoMHg4NjZjMDEzOCksIFdUQygweDg2ODhkMmU0KSwKKyAgICBXVEMoMHg4NmE1NTkwMSksIFdUQygweDg2YzE5NDk3KSwgV1RDKDB4ODZkZDgzOTApLCBXVEMoMHg4NmY5Mjg4ZiksCisgICAgV1RDKDB4ODcxNDg3ZTApLCBXVEMoMHg4NzJmYWRkMCksIFdUQygweDg3NGE5YTFlKSwgV1RDKDB4ODc2NTE5ZDApLAorICAgIFdUQygweDg3N2Y0NzFlKSwgV1RDKDB4ODc5OWZiMzYpLCBXVEMoMHg4N2I0OGI5NyksIFdUQygweDg3Y2JhMDIxKSwKKyAgICBXVEMoMHg4ODBmNjdhZSksIFdUQygweDg4NWUwZjkxKSwgV1RDKDB4ODhiYzg0Y2QpLCBXVEMoMHg4OTI0NDY0MCksCisgICAgV1RDKDB4ODk5MGE0NWQpLCBXVEMoMHg4OWZlNjc2NiksIFdUQygweDhhNmM5MDY1KSwgV1RDKDB4OGFkYjMxZTYpLAorICAgIFdUQygweDhiNGFkNWIzKSwgV1RDKDB4OGJiYzIwNjgpLCBXVEMoMHg4YzJmOTNmZiksIFdUQygweDhjYTVhOTIyKSwKKyAgICBXVEMoMHg4ZDFlZDcyZCksIFdUQygweDhkOWI3ZGRiKSwgV1RDKDB4OGUxYmQ2Y2MpLCBXVEMoMHg4ZWEwMTkyNCksCisgICAgV1RDKDB4OGYyODc3MTYpLCBXVEMoMHg4ZmI1MTQzZSksIFdUQygweDkwNDYwNzRlKSwgV1RDKDB4OTBkYjYxMmIpLAorICAgIFdUQygweDkxNzUzMjYzKSwgV1RDKDB4OTIxMzgwOTQpLCBXVEMoMHg5MmI2NGNmMyksIFdUQygweDkzNWQ5NmM5KSwKKyAgICBXVEMoMHg5NDA5NWE1NiksIFdUQygweDk0Yjk4ZmQ0KSwgV1RDKDB4OTU2ZTJhODcpLCBXVEMoMHg5NjI3MWZmNiksCisgICAgV1RDKDB4OTZlNDYzMDkpLCBXVEMoMHg5N2E1ZTgwZCksIFdUQygweDk4NmI5ZTU1KSwgV1RDKDB4OTkzNTcyYWYpLAorICAgIFdUQygweDlhMDM1MGNlKSwgV1RDKDB4OWFkNTIxNTQpLCBXVEMoMHg5YmFhZDEwZiksIFdUQygweDljODQ0Y2RkKSwKKyAgICBXVEMoMHg5ZDYxODQzNyksIFdUQygweDllNDI2NWIyKSwgV1RDKDB4OWYyNmQ5YWQpLCBXVEMoMHhhMDBlYzliMCksCisgICAgV1RDKDB4YTBmYTI5MTYpLCBXVEMoMHhhMWU4ZWMyMCksIFdUQygweGEyZGFmZmE0KSwgV1RDKDB4YTNkMDU0NjgpLAorICAgIFdUQygweGE0YzhlMDA3KSwgV1RDKDB4YTVjNDlhZTQpLCBXVEMoMHhhNmMzN2MyNCksIFdUQygweGE3YzU3ZDAzKSwKKyAgICBXVEMoMHhhOGNhOTc1MCksIFdUQygweGE5ZDJjN2YyKSwgV1RDKDB4YWFkZTBmNmYpLCBXVEMoMHhhYmVjNzE3NyksCisgICAgV1RDKDB4YWNmZGYyYjEpLCBXVEMoMHhhZTEyOTc0MCksIFdUQygweGFmMmE2MzIxKSwgV1RDKDB4YjA0NTYzYTYpLAorICAgIFdUQygweGIxNjNhMmU2KSwgV1RDKDB4YjI4NTI0YzQpLCBXVEMoMHhiM2E5ZWFmNyksIFdUQygweGI0ZDFmZjFiKSwKKyAgICBXVEMoMHg0YTFkMjg4MCksIFdUQygweDQ4ZWVlNTZlKSwgV1RDKDB4NDdiZGE4ODIpLCBXVEMoMHg0Njg5NWM3OSksCisgICAgV1RDKDB4NDU1MWY4YTEpLCBXVEMoMHg0NDE3ODE3YiksIFdUQygweDQyZGEwMjNkKSwgV1RDKDB4NDE5OTgwY2EpLAorICAgIFdUQygweDQwNTVmNDYzKSwgV1RDKDB4M2YwZjNiNTEpLCBXVEMoMHgzZGM1NmUxOCksIFdUQygweDNjNzhkOTQzKSwKKyAgICBXVEMoMHgzYjI5YmYzZCksIFdUQygweDM5ZDg0ZWEwKSwgV1RDKDB4Mzg4NDMzN2QpLCBXVEMoMHgzNzJkMjM3MSksCisgICAgV1RDKDB4MzVkMzY0ZWEpLCBXVEMoMHgzNDc3NGNlZiksIFdUQygweDMzMTk0ZDNhKSwgV1RDKDB4MzFiOWQ1ODYpLAorICAgIFdUQygweDMwNTk0ZmNmKSwgV1RDKDB4MmVmODBiNjMpLCBXVEMoMHgyZDk2MzBkNSksIFdUQygweDJjMzM3YzAwKSwKKyAgICBXVEMoMHgyYWNmNmE5ZSksIFdUQygweDI5NmEzMjA1KSwgV1RDKDB4MjgwNDY4MjUpLCBXVEMoMHgyNjlmMTc1MiksCisgICAgV1RDKDB4MjUzYjUzMTQpLCBXVEMoMHgyM2Q5OTkzZiksIFdUQygweDIyN2EzYzc3KSwgV1RDKDB4MjExZDU5YTApLAorICAgIFdUQygweDFmYzMxNGZkKSwgV1RDKDB4MWU2Yjk4MzQpLCBXVEMoMHgxZDE2ZWI1OCksIFdUQygweDFiYzRmODJlKSwKKyAgICBXVEMoMHgxYTc1ZTQ4MSksIFdUQygweDE5MjlmMzg5KSwgV1RDKDB4MTdlMTZlZTMpLCBXVEMoMHgxNjljZDc1OCksCisgICAgV1RDKDB4MTU1ZDFhZTUpLCBXVEMoMHgxNDIzNTE4MiksIFdUQygweDEyZjA1MWRlKSwgV1RDKDB4MTFjNDk5M2IpLAorICAgIFdUQygweDEwOWZkZjRjKSwgV1RDKDB4MGY4MTM1MWMpLCBXVEMoMHgwZTY2YzVlNiksIFdUQygweDBkNGY0YjE2KSwKKyAgICBXVEMoMHgwYzM5ZjAxMyksIFdUQygweDBiMjU3NjVkKSwgV1RDKDB4MGExMGM1MWUpLCBXVEMoMHgwOGZiZWUzNSksCisgICAgV1RDKDB4MDdlNzk4NmYpLCBXVEMoMHgwNmQyNWZlNyksIFdUQygweDA1YmExYjUyKSwgV1RDKDB4MDQ5YzMzYjcpLAorICAgIFdUQygweDAzNzljZWI5KSwgV1RDKDB4MDI1ZWU3YzcpLCBXVEMoMHgwMTVlZGMxYyksIFdUQygweDAwOTc4ZGViKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHhmZmU1OTQ3NCksIFdUQygweGZmYjE1OGY4KSwgV1RDKDB4ZmY3ZDEyNzUpLCBXVEMoMHhmZjQ4ZjQ0YyksCisgICAgV1RDKDB4ZmYxNTMxZTMpLCBXVEMoMHhmZWUxZmFhOSksIFdUQygweGZlYWY2MjZlKSwgV1RDKDB4ZmU3ZDcyMjcpLAorICAgIFdUQygweGZlNGMzODNmKSwgV1RDKDB4ZmUxYmM0ZmYpLCBXVEMoMHhmZGVjMjk3ZiksIFdUQygweGZkYmQ5ZjZjKSwKKyAgICBXVEMoMHhmZDkwYmJmMCksIFdUQygweGZkNjViYTczKSwgV1RDKDB4ZmQzYzJkMzIpLCBXVEMoMHhmZDEzYWIzNSksCisgICAgV1RDKDB4ZmNlYmU4MTEpLCBXVEMoMHhmY2M0ZWVhZSksIFdUQygweGZjOWYxZDY0KSwgV1RDKDB4ZmM3YjQ4YjApLAorICAgIFdUQygweGZjNWE3MjgyKSwgV1RDKDB4ZmMzY2VmOWIpLCBXVEMoMHhmYzIyOWY0YyksIFdUQygweGZjMGE5ZTI5KSwKKyAgICBXVEMoMHhmYmYzZGNjYiksIFdUQygweGZiZGQ4MGMzKSwgV1RDKDB4ZmJjNzU1NmMpLCBXVEMoMHhmYmIyODljZiksCisgICAgV1RDKDB4ZmJhMDZmOTkpLCBXVEMoMHhmYjkyM2FjYSksIFdUQygweGZiODhiYjU3KSwgV1RDKDB4ZmI4NDQ1N2YpLAorICAgIFdUQygweGZiODQ4YzJlKSwgV1RDKDB4ZmI4OGJkMjgpLCBXVEMoMHhmYjhmZWRhMSksIFdUQygweGZiOTkyOGViKSwKKyAgICBXVEMoMHhmYmEzOGI5ZSksIFdUQygweGZiYWU3MTFjKSwgV1RDKDB4ZmJiYTM1MzgpLCBXVEMoMHhmYmM3YWY5ZCksCisgICAgV1RDKDB4ZmJkODQ4NWUpLCBXVEMoMHhmYmVkYTIzOCksIFdUQygweGZjMDk5ZGU0KSwgV1RDKDB4ZmMyZDk4MWYpLAorICAgIFdUQygweGZjNTlmZDBkKSwgV1RDKDB4ZmM4ZTE1ODMpLCBXVEMoMHhmY2M3ZTBkNyksIFdUQygweGZkMDQ4ZDAzKSwKKyAgICBXVEMoMHhmZDQwZGZhZiksIFdUQygweGZkN2MxZDM1KSwgV1RDKDB4ZmRiNzY3Y2MpLCBXVEMoMHhmZGY2NGE5ZiksCisgICAgV1RDKDB4ZmUzZDAyNDIpLCBXVEMoMHhmZThlMzMxNiksIFdUQygweGZlZWFkMmI5KSwgV1RDKDB4ZmY0ZmZmOGMpLAorICAgIFdUQygweGZmYmE3YjExKSwgV1RDKDB4MDAyODFjYWUpLCBXVEMoMHgwMDk4NDdkMSksIFdUQygweDAxMGNiNjUzKSwKKyAgICBXVEMoMHgwMTg3MDYzOSksIFdUQygweDAyMDg5ZGI1KSwgV1RDKDB4MDI5MWI1NzEpLCBXVEMoMHgwMzIxYTRjMSksCisgICAgV1RDKDB4MDNiN2VkYTApLCBXVEMoMHgwNDU0NGM3ZiksIFdUQygweDA0Zjc0MTM0KSwgV1RDKDB4MDVhMTY4MTApLAorICAgIFdUQygweDA2NTI1ODI5KSwgV1RDKDB4MDcwOTk0ZDQpLCBXVEMoMHgwN2M3NjdiYSksIFdUQygweDA4OGM2OWI4KSwKKyAgICBXVEMoMHgwOTU5ODYzNCksIFdUQygweDBhMmYxNGNhKSwgV1RDKDB4MGIwYzY3N2IpLCBXVEMoMHgwYmYwZjU3NiksCisgICAgV1RDKDB4MGNkYzdmNzMpLCBXVEMoMHgwZGNlZWQ1NCksIFdUQygweDBlYzg0YTAwKSwgV1RDKDB4MGZjOGRiODYpLAorICAgIFdUQygweDEwZDEwMjc4KSwgV1RDKDB4MTFlMGUwNWUpLCBXVEMoMHgxMmY4ODBjYyksIFdUQygweDE0MTgwNDliKSwKKyAgICBXVEMoMHgxNTNmODZiMyksIFdUQygweDE2NmVmNWEzKSwgV1RDKDB4MTdhNjQ4NzgpLCBXVEMoMHgxOGU1OWRkZSksCisgICAgV1RDKDB4MWEyZDA4OGIpLCBXVEMoMHgxYjdjN2U0MSksIFdUQygweDFjZDQwYWI3KSwgV1RDKDB4MWUzM2Q1NDIpLAorICAgIFdUQygweDFmOWJlN2E1KSwgV1RDKDB4MjEwYzM0NGYpLCBXVEMoMHgyMjg0Y2I4NSksIFdUQygweDI0MDVjYTQ4KSwKKyAgICBXVEMoMHgyNThmMmI3ZiksIFdUQygweDI3MjBlMDYzKSwgV1RDKDB4MjhiYWZkNDkpLCBXVEMoMHgyYTVkOTUwYyksCisgICAgV1RDKDB4MmMwODk2ZTQpLCBXVEMoMHgyZGJiZjdkNCksIFdUQygweDJmNzdjYTI4KSwgV1RDKDB4MzEzYzEyNzMpLAorICAgIFdUQygweDMzMDhiN2U0KSwgV1RDKDB4MzRkZGIwZWMpLCBXVEMoMHgzNmJiMDZiNyksIFdUQygweDM4YTBhOTM1KSwKKyAgICBXVEMoMHgzYThlNzI3MCksIFdUQygweDNjODQ0Y2E5KSwgV1RDKDB4M2U4MjI2N2UpLCBXVEMoMHg0MDg3Y2NmYSksCisgICAgV1RDKDB4NDI5NTAzNTIpLCBXVEMoMHg0NGE5OWNlNyksIFdUQygweDQ2YzU3MDkzKSwgV1RDKDB4NDhlODRkYmUpLAorICAgIFdUQygweDRiMTI3NTA2KSwgV1RDKDB4NGQ0NTJkMjkpLCBXVEMoMHg0ZjgxZTA2NiksIFdUQygweDUxY2ExMWM0KSwKKyAgICBXVEMoMHgwMDBjODJlOCksIFdUQygweGZmZjZmNDBjKSwgV1RDKDB4ZmZmYTEyNjApLCBXVEMoMHgwMDE1MzBiZiksCisgICAgV1RDKDB4MDA0N2EyMDIpLCBXVEMoMHgwMDkwYjkwMyksIFdUQygweDAwZWZjODlmKSwgV1RDKDB4MDE2NDIzYWYpLAorICAgIFdUQygweDAxZWQxZDBlKSwgV1RDKDB4MDI4YTA3OTYpLCBXVEMoMHgwMzNhMzYyMCksIFdUQygweDAzZmNmYjg5KSwKKyAgICBXVEMoMHgwNGQxYWFhYSksIFdUQygweDA1Yjc5NjVjKSwgV1RDKDB4MDZhZTExNzkpLCBXVEMoMHgwN2I0NmVlOCksCisgICAgV1RDKDB4MDhjYTAxNzMpLCBXVEMoMHgwOWVlMWMwMCksIFdUQygweDBiMjAxMTYyKSwgV1RDKDB4MGM1ZjM0NmUpLAorICAgIFdUQygweDBkYWFkODA4KSwgV1RDKDB4MGYwMjRmMTcpLCBXVEMoMHgxMDY0ZWM0YiksIFdUQygweDExZDIwMmM0KSwKKyAgICBXVEMoMHgxMzQ4ZTUxNCksIFdUQygweDE0YzhlNjJmKSwgV1RDKDB4MTY1MTU5MGEpLCBXVEMoMHgxN2UxOTA1MSksCisgICAgV1RDKDB4MTk3OGRmMjcpLCBXVEMoMHgxYjE2OTgxMiksIFdUQygweDFjYmEwZTE1KSwgV1RDKDB4MWU2Mjk0MDcpLAorICAgIFdUQygweDIwMGY3Y2Q0KSwgV1RDKDB4MjFjMDFiMjkpLCBXVEMoMHgyMzczYzIyOCksIFdUQygweDI1MjljNDUzKSwKKyAgICBXVEMoMHgyNmUxNzRiOSksIFdUQygweDI4OWEyNjJmKSwgV1RDKDB4MmE1MzJiYmEpLCBXVEMoMHgyYzBiZDdiMiksCisgICAgV1RDKDB4MmRjMzdkOTIpLCBXVEMoMHgyZjc5NmZjZSksIFdUQygweDMxMmQwMTdhKSwgV1RDKDB4MzJkZDg1MTMpLAorICAgIFdUQygweDM0OGE0ZGRlKSwgV1RDKDB4MzYzMmFlYjMpLCBXVEMoMHgzN2Q1ZmEyOSksIFdUQygweDM5NzM4MzM0KSwKKyAgICBXVEMoMHgzYjBhOWM5OSksIFdUQygweDNjOWE5OTI2KSwgV1RDKDB4M2UyMmNjMjEpLCBXVEMoMHgzZmEyODdkYyksCisgICAgV1RDKDB4NDExOTFmODkpLCBXVEMoMHg0Mjg1ZTVmYyksIFdUQygweDQzZTgyZTAyKSwgV1RDKDB4NDUzZjRhNDApLAorICAgIFdUQygweDQ2OGE4ZGQ5KSwgV1RDKDB4NDdjOTRjMjMpLCBXVEMoMHg0OGZhZGM3YyksIFdUQygweDRhMWU3NWY5KSwKKyAgICBXVEMoMHg0YjMzOWVjZiksIFdUQygweDRjMzk4MWIxKSwgV1RDKDB4NGQyZjdjZDMpLCBXVEMoMHg0ZTE0ZTM4MSksCisgICAgV1RDKDB4NGVlOTA4MDQpLCBXVEMoMHg0ZmFiM2Q2YSksIFdUQygweDUwNWFkNmJkKSwgV1RDKDB4NTBmNzI2YTMpLAorICAgIFdUQygweDUxN2Y3ZmVhKSwgV1RDKDB4NTFmMzM1ZmQpLCBXVEMoMHg1MjUxOWIwZiksIFdUQygweDUyOWEwMWYyKSwKKyAgICBXVEMoMHg1MmNiYmUzMSksIFdUQygweDUyZTYyMWQ5KSwgV1RDKDB4NTJlODgwYWEpLCBXVEMoMHg1MmQyMmM3YSksCisgICAgV1RDKDB4NTJhMjc4YTUpLCBXVEMoMHg1MjU4Yjg4MCksIFdUQygweDUxZjQzZTFkKSwgV1RDKDB4NTE3NDVjMzgpLAorICAgIFdUQygweDUwZDg2NjllKSwgV1RDKDB4NTAxZmFmMGUpLCBXVEMoMHg0ZjQ5ODk3ZSksIFdUQygweDRlNTU0ODA0KSwKKyAgICBXVEMoMHg0ZDQyM2Q5ZSksIFdUQygweDRjMGZiZDhiKSwgV1RDKDB4NGFiZDFhNGQpLCBXVEMoMHg0OTQ5YTY5OCksCisgICAgV1RDKDB4NDdiNGI3ZjkpLCBXVEMoMHg0NWZlMmI2ZCksIFdUQygweDQ0Mzc1MDE5KSwgV1RDKDB4NDI4NGU5NmUpLAorICAgIFdUQygweDQwZjdlZmEyKSwgV1RDKDB4M2Y4ZjhiMzMpLCBXVEMoMHgzZTQ5NDMxMSksIFdUQygweDNkMjFlMzViKSwKKyAgICBXVEMoMHgzYzE1YzYyMSksIFdUQygweDNiMjExNWYzKSwgV1RDKDB4M2E0MDA4YWEpLCBXVEMoMHgzOTZlZDJhNiksCisgICAgV1RDKDB4MzhhOTlhMWQpLCBXVEMoMHgzN2VjMTE3NyksIFdUQygweDM3MzBmMTU0KSwgV1RDKDB4MzY3NTZjMTUpLAorICAgIFdUQygweDM1YmFmYjBkKSwgV1RDKDB4MzUwMjAwOTMpLCBXVEMoMHgzNDQ5MjM4MSksIFdUQygweDMzOGY2MjI2KSwKKyAgICBXVEMoMHgzMmQ0MGEzNCksIFdUQygweDMyMTViZDczKSwgV1RDKDB4MzE1MzAyY2UpLCBXVEMoMHgzMDhjN2M0MSksCisgICAgV1RDKDB4MmZjMzUzMmYpLCBXVEMoMHgyZWY2ZGU4ZiksIFdUQygweDJlMjY1YTdmKSwgV1RDKDB4MmQ1MjdiZmQpLAorICAgIFdUQygweDJjN2JmMDM1KSwgV1RDKDB4MmJhMjk3NWIpLCBXVEMoMHgyYWM2MzU1MiksIFdUQygweDI5ZTY4NmNhKSwKK307CiAKK2NvbnN0IEZJWFBfV1RCIEVMREFuYWx5c2lzMTI4WzM4NF0gPSB7CisgICAgV1RDKDB4ZmFhNDllOTgpLCBXVEMoMHhmYTQ4OTI5ZiksIFdUQygweGY5ZTdlYjM5KSwgV1RDKDB4Zjk4M2I4MjkpLAorICAgIFdUQygweGY5MWJjNWNiKSwgV1RDKDB4ZjhiMDM3NmYpLCBXVEMoMHhmODQwOGQ2MiksIFdUQygweGY3Y2Q4YzFlKSwKKyAgICBXVEMoMHhmNzU4MGRhMyksIFdUQygweGY2ZTBiMGRjKSwgV1RDKDB4ZjY2Nzc1M2MpLCBXVEMoMHhmNWVmYTRjZiksCisgICAgV1RDKDB4ZjU3Y2I2ZGUpLCBXVEMoMHhmNTExYjYyYiksIFdUQygweGY0YjFhODYwKSwgV1RDKDB4ZjQ1ZWU4ZjgpLAorICAgIFdUQygweGY0MTU3MTBkKSwgV1RDKDB4ZjNjMGM0ZjMpLCBXVEMoMHhmMzVjMmFmOSksIFdUQygweGYyZTg5NjIwKSwKKyAgICBXVEMoMHhmMjY2ZjNjYiksIFdUQygweGYxZDgxOWJmKSwgV1RDKDB4ZjEzY2ZmMmYpLCBXVEMoMHhmMDk0ODlkMiksCisgICAgV1RDKDB4ZWZkY2ZhODApLCBXVEMoMHhlZjE4MjA1OSksIFdUQygweGVlNGQ2YzYwKSwgV1RDKDB4ZWQ3YjhkYTcpLAorICAgIFdUQygweGVjOWMyN2IxKSwgV1RDKDB4ZWJiNTdkMGQpLCBXVEMoMHhlYWNiMzkxOCksIFdUQygweGU5ZDM1NTkxKSwKKyAgICBXVEMoMHhlOGM5MTc2ZSksIFdUQygweGU3YjkzZTQyKSwgV1RDKDB4ZTZiMTBlNDcpLCBXVEMoMHhlNWE2Yjg3NSksCisgICAgV1RDKDB4ZTQ4NGMzNDUpLCBXVEMoMHhlMzUwOWYxYiksIFdUQygweGUyMjQyNTRjKSwgV1RDKDB4ZTEwYTRlMTgpLAorICAgIFdUQygweGRmZjRhNjY4KSwgV1RDKDB4ZGVkM2Q4ODEpLCBXVEMoMHhkZGE1ZWQ5OCksIFdUQygweGRjNzIyZDEzKSwKKyAgICBXVEMoMHhkYjQzNzM2MCksIFdUQygweGRhMWZlZmVkKSwgV1RDKDB4ZDkwNjIzYjIpLCBXVEMoMHhkN2YwNzBmNSksCisgICAgV1RDKDB4ZDZkYTM2MWIpLCBXVEMoMHhkNWMwNzg2ZiksIFdUQygweGQ0YTZlMTg4KSwgV1RDKDB4ZDM5YjM3YjQpLAorICAgIFdUQygweGQyYTAxZmYyKSwgV1RDKDB4ZDFhOGEwNWMpLCBXVEMoMHhkMGIwY2Y0NyksIFdUQygweGNmYmQzNTI3KSwKKyAgICBXVEMoMHhjZWQ2YjhkNyksIFdUQygweGNkZmYwYTY2KSwgV1RDKDB4Y2QyOTc4YTQpLCBXVEMoMHhjYzU4NzE4MyksCisgICAgV1RDKDB4Y2I5M2JmZGIpLCBXVEMoMHhjYWQ4MDc3MyksIFdUQygweGNhMjMzYzJiKSwgV1RDKDB4Yzk3NjhiNWUpLAorICAgIFdUQygweGM4Y2MxMzBjKSwgV1RDKDB4YzgyMzFhY2QpLCBXVEMoMHhjNzc2OGRlNCksIFdUQygweGM2Yzg2YmRmKSwKKyAgICBXVEMoMHhjNjE4MWFhMSksIFdUQygweGM1NjNmNmNlKSwgV1RDKDB4YzRiMzNhMmEpLCBXVEMoMHhjNDA4NWZjZiksCisgICAgV1RDKDB4YzM1YWU3MmUpLCBXVEMoMHhjMmFkN2FkZiksIFdUQygweGMyMDZlZDk0KSwgV1RDKDB4YzE2YTU3NDQpLAorICAgIFdUQygweGMwZDU5NjI1KSwgV1RDKDB4YzA0MWUyMWIpLCBXVEMoMHhiZmIxZWUwNSksIFdUQygweGJmMmQ4MmVhKSwKKyAgICBXVEMoMHhiZWI2MGZlOSksIFdUQygweGJlNDk5ZGE4KSwgV1RDKDB4YmRlNjE4OTEpLCBXVEMoMHhiZDg5NzViNiksCisgICAgV1RDKDB4YmQzMzlkMzYpLCBXVEMoMHhiY2U2YTA4YiksIFdUQygweGJjYTViMmY5KSwgV1RDKDB4YmM3MjEwMDIpLAorICAgIFdUQygweGJjNDk0ZDQxKSwgV1RDKDB4YmMyNjYxNjApLCBXVEMoMHhiYzA2ZDE0ZiksIFdUQygweGJiZWM1MmM3KSwKKyAgICBXVEMoMHhiYmRhYWY3OSksIFdUQygweGJiZDBiZTk5KSwgV1RDKDB4YmJjYWUxMzkpLCBXVEMoMHhiYmNkMzU5YyksCisgICAgV1RDKDB4YmJkZWQ1ZDMpLCBXVEMoMHhiYmZhNThjZiksIFdUQygweGJjMTYyZjlkKSwgV1RDKDB4YmMzMjY1MzQpLAorICAgIFdUQygweGJjNGYwODFjKSwgV1RDKDB4YmM2YzE2NzgpLCBXVEMoMHhiYzg5OWY5MyksIFdUQygweGJjYTdhMjYzKSwKKyAgICBXVEMoMHhiY2M2Mjk1NCksIFdUQygweGJjZTUyZGRjKSwgV1RDKDB4YmQwNGJjN2YpLCBXVEMoMHhiZDI0Y2Q4ZiksCisgICAgV1RDKDB4YmQ0NTY5OTgpLCBXVEMoMHhiZDY2ODQyOCksIFdUQygweGJkODgyMDdjKSwgV1RDKDB4YmRhYTJlNGIpLAorICAgIFdUQygweGJkY2NhZjNlKSwgV1RDKDB4YmRlZjkzMmMpLCBXVEMoMHhiZTEyZDkzNiksIFdUQygweGJlMzY2ZGQ2KSwKKyAgICBXVEMoMHhiZTVhNGZkOSksIFdUQygweGJlN2U2YjQ5KSwgV1RDKDB4YmVhMmJmM2YpLCBXVEMoMHhiZWM3MzhiNSksCisgICAgV1RDKDB4YmVlYmQ3OTEpLCBXVEMoMHhiZjEwOGI0OSksIFdUQygweGJmMzU1NGFhKSwgV1RDKDB4YmY1YTI1Y2YpLAorICAgIFdUQygweGJmN2YwMjBiKSwgV1RDKDB4YmZhM2RkMjUpLCBXVEMoMHhiZmM4YmUxZSksIFdUQygweGJmZWQ5NWY2KSwKKyAgICBXVEMoMHg4MDI0YzkzMyksIFdUQygweDgwNmUyNGZiKSwgV1RDKDB4ODBiNzNkOTYpLCBXVEMoMHg4MGZmZjc4YyksCisgICAgV1RDKDB4ODE0ODYxMmYpLCBXVEMoMHg4MTkwNjI2ZSksIFdUQygweDgxZDgwMzBhKSwgV1RDKDB4ODIxZjI4ZTEpLAorICAgIFdUQygweDgyNjVkNmJlKSwgV1RDKDB4ODJhYmVkNTYpLCBXVEMoMHg4MmYxNmU0MCksIFdUQygweDgzMzYzNmQyKSwKKyAgICBXVEMoMHg4MzdhNDcwYSksIFdUQygweDgzYmQ3YmU2KSwgV1RDKDB4ODNmZmQ0MTUpLCBXVEMoMHg4NDQxMmU2NiksCisgICAgV1RDKDB4ODQ4MThjNGYpLCBXVEMoMHg4NGMwZDE4YyksIFdUQygweDg0ZmYwNDI5KSwgV1RDKDB4ODUzYzA5YTUpLAorICAgIFdUQygweDg1NzdlYWNmKSwgV1RDKDB4ODViMjk0MDIpLCBXVEMoMHg4NWVjMTdiZiksIFdUQygweDg2MjQ2YjUwKSwKKyAgICBXVEMoMHg4NjViYTdkNyksIFdUQygweDg2OTFjNGMwKSwgV1RDKDB4ODZjNmQ3MmEpLCBXVEMoMHg4NmZhZTA2YyksCisgICAgV1RDKDB4ODcyZGZjZDEpLCBXVEMoMHg4NzYwMmM2YSksIFdUQygweDg3OTE4YTI3KSwgV1RDKDB4ODdjMjJlZjgpLAorICAgIFdUQygweDg4MmY3YzIwKSwgV1RDKDB4ODhkYzM4YWIpLCBXVEMoMHg4OWE1MmY0NyksIFdUQygweDhhNzM3NjM1KSwKKyAgICBXVEMoMHg4YjQzZDA4ZCksIFdUQygweDhjMTliZTlmKSwgV1RDKDB4OGNmODljZTcpLCBXVEMoMHg4ZGUzMzdlOSksCisgICAgV1RDKDB4OGVkYjNlMDIpLCBXVEMoMHg4ZmUxZTgxNSksIFdUQygweDkwZjdlMTA3KSwgV1RDKDB4OTIxZDhiOTUpLAorICAgIFdUQygweDkzNTMwMDhjKSwgV1RDKDB4OTQ5ODJmZDcpLCBXVEMoMHg5NWVjZGM2ZCksIFdUQygweDk3NTBiODdmKSwKKyAgICBXVEMoMHg5OGMzNmFkNiksIFdUQygweDlhNDQ3Njc0KSwgV1RDKDB4OWJkMzRlOWMpLCBXVEMoMHg5ZDZmNzZmYSksCisgICAgV1RDKDB4OWYxODc4MGQpLCBXVEMoMHhhMGNkYzQ4NyksIFdUQygweGEyOGVmZjhlKSwgV1RDKDB4YTQ1YmJlNGIpLAorICAgIFdUQygweGE2MzNiYWFmKSwgV1RDKDB4YTgxNmJmZjApLCBXVEMoMHhhYTA0YTkwZCksIFdUQygweGFiZmQ3MjA1KSwKKyAgICBXVEMoMHhhZTAxMzU2YiksIFdUQygweGIwMTAxNDc3KSwgV1RDKDB4YjIyYTUyNDQpLCBXVEMoMHhiNDUwMGIwMiksCisgICAgV1RDKDB4NDk5OTQ2ZjMpLCBXVEMoMHg0NzVkYTVhZiksIFdUQygweDQ1MTczZGNlKSwgV1RDKDB4NDJjNjEwYWQpLAorICAgIFdUQygweDQwNmE0NGIwKSwgV1RDKDB4M2UwMzdjZTgpLCBXVEMoMHgzYjkyYjgwNiksIFdUQygweDM5MTk1Y2QwKSwKKyAgICBXVEMoMHgzNjk2MmYxNyksIFdUQygweDM0MGExYjI4KSwgV1RDKDB4MzE3N2NkZTYpLCBXVEMoMHgyZWUxZjIwZCksCisgICAgV1RDKDB4MmM0OWIwZDYpLCBXVEMoMHgyOWFkM2Q3NCksIFdUQygweDI3MGU5ZWMxKSwgV1RDKDB4MjQ3NDEzMmYpLAorICAgIFdUQygweDIxZTE0YTAxKSwgV1RDKDB4MWY1NzcwNGUpLCBXVEMoMHgxY2Q3NThjZSksIFdUQygweDFhNjEwZDQ4KSwKKyAgICBXVEMoMHgxN2Y1ZGI4OCksIFdUQygweDE1OThhMTg4KSwgV1RDKDB4MTM0ZjdhNDApLCBXVEMoMHgxMTFmMWNhMCksCisgICAgV1RDKDB4MGYwNTNiODMpLCBXVEMoMHgwY2Y4NzFkYiksIFdUQygweDBhZjE5ZTYwKSwgV1RDKDB4MDhlYWE1NmQpLAorICAgIFdUQygweDA2ZTNjNDczKSwgV1RDKDB4MDRkMjVjYzkpLCBXVEMoMHgwMmI1OWI0ZCksIFdUQygweDAwZTViYzRjKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweGZmY2ViZjE0KSwgV1RDKDB4ZmY2Y2MyNDkpLCBXVEMoMHhmZjBiOGJkYSksIFdUQygweGZlYWMzZTVmKSwKKyAgICBXVEMoMHhmZTRmNDYzOCksIFdUQygweGZkZjUwNTJmKSwgV1RDKDB4ZmQ5ZThjZjQpLCBXVEMoMHhmZDRlMzRlYSksCisgICAgV1RDKDB4ZmQwMjMxNDIpLCBXVEMoMHhmY2I4ZjZmNyksIFdUQygweGZjNzRlMDkwKSwgV1RDKDB4ZmMzYjMzZTgpLAorICAgIFdUQygweGZjMGMxMjU0KSwgV1RDKDB4ZmJlMWIyZWIpLCBXVEMoMHhmYmI4Y2U3MyksIFdUQygweGZiOTdlNTExKSwKKyAgICBXVEMoMHhmYjg2MjczZCksIFdUQygweGZiODU3YTNlKSwgV1RDKDB4ZmI5MTg4MTMpLCBXVEMoMHhmYmE0MzY5MiksCisgICAgV1RDKDB4ZmJiOTZmMjQpLCBXVEMoMHhmYmQ0ZGNjMyksIFdUQygweGZjMDAwY2Q1KSwgV1RDKDB4ZmM0NTg2NTMpLAorICAgIFdUQygweGZjYTZjZDk4KSwgV1RDKDB4ZmQxNzhjOGUpLCBXVEMoMHhmZDg3Mjk3OSksIFdUQygweGZkZmE3MjFlKSwKKyAgICBXVEMoMHhmZTg4Yzc3YyksIFdUQygweGZmM2M4YjVjKSwgV1RDKDB4MDAwNTllYmMpLCBXVEMoMHgwMGQ5MWRiMCksCisgICAgV1RDKDB4MDFiZWM1NTUpLCBXVEMoMHgwMmJkZmI4MCksIFdUQygweDAzZDRjODQ2KSwgV1RDKDB4MDUwMWFkNTMpLAorICAgIFdUQygweDA2NDcxOWIyKSwgV1RDKDB4MDdhMzRhMmIpLCBXVEMoMHgwOTE4ODE0YiksIFdUQygweDBhYWFhYTZiKSwKKyAgICBXVEMoMHgwYzU3MjhiOSksIFdUQygweDBlMWMxYTBmKSwgV1RDKDB4MGZmOWNjZDEpLCBXVEMoMHgxMWYyMWZmYiksCisgICAgV1RDKDB4MTQwNWQwNzMpLCBXVEMoMHgxNjM1Nzc2YiksIFdUQygweDE4ODBmNGU1KSwgV1RDKDB4MWFlOGJkY2IpLAorICAgIFdUQygweDFkNmNlZGUzKSwgV1RDKDB4MjAwZTFkOTMpLCBXVEMoMHgyMmNjNTZmZCksIFdUQygweDI1YTgwODU4KSwKKyAgICBXVEMoMHgyOGExMWJkZCksIFdUQygweDJiYjdlMzYzKSwgV1RDKDB4MmVlYzJmMGYpLCBXVEMoMHgzMjNlMjk4ZCksCisgICAgV1RDKDB4MzVhZDdmMGIpLCBXVEMoMHgzOTNhMTk4OSksIFdUQygweDNjZTM0YTY1KSwgV1RDKDB4NDBhODY4M2QpLAorICAgIFdUQygweDQ0ODgxYzk0KSwgV1RDKDB4NDg4MTNjYjMpLCBXVEMoMHg0Yzk0NTIzZCksIFdUQygweDUwYzhlZmYwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDA1M2ExZWEpLCBXVEMoMHgwMGY2NzA2NiksCisgICAgV1RDKDB4MDFlM2Y2MWIpLCBXVEMoMHgwMzE3YmRhZiksIFdUQygweDA0OGQ1MWNhKSwgV1RDKDB4MDY0MDNkMTEpLAorICAgIFdUQygweDA4MmMwYTM0KSwgV1RDKDB4MGE0YzQzZDIpLCBXVEMoMHgwYzljNzQ4ZSksIFdUQygweDBmMTgyNzE4KSwKKyAgICBXVEMoMHgxMWJhZTYxNiksIFdUQygweDE0ODAzYzFiKSwgV1RDKDB4MTc2M2IzZTYpLCBXVEMoMHgxYTYwZDgzMiksCisgICAgV1RDKDB4MWQ3MzMzNmIpLCBXVEMoMHgyMDk2NTA2OCksIFdUQygweDIzYzViOWQ2KSwgV1RDKDB4MjZmY2ZhMWEpLAorICAgIFdUQygweDJhMzc5YzMwKSwgV1RDKDB4MmQ3MTJhNzUpLCBXVEMoMHgzMGE1MmZiYSksIFdUQygweDMzY2YzNmE5KSwKKyAgICBXVEMoMHgzNmVhY2ExNSksIFdUQygweDM5ZjM3NDNiKSwgV1RDKDB4M2NlNGJmYzIpLCBXVEMoMHgzZmJhMzdiOCksCisgICAgV1RDKDB4NDI2ZjY2NzEpLCBXVEMoMHg0NGZmZDZlOCksIFdUQygweDQ3NjcxMzI2KSwgV1RDKDB4NDlhMGIyZDApLAorICAgIFdUQygweDRiYTgxYmUxKSwgV1RDKDB4NGQ3OGZkMWUpLCBXVEMoMHg0ZjBlZDUwMyksIFdUQygweDUwNjUyZTI4KSwKKyAgICBXVEMoMHg1MTc3OTM1MSksIFdUQygweDUyNDE4ZmJlKSwgV1RDKDB4NTJiZWFkNzUpLCBXVEMoMHg1MmVhNzZjYyksCisgICAgV1RDKDB4NTJjMDc3OTMpLCBXVEMoMHg1MjNjMzkxOCksIFdUQygweDUxNTk0NzBlKSwgV1RDKDB4NTAxMzJiMzYpLAorICAgIFdUQygweDRlNjU3MTI4KSwgV1RDKDB4NGM0YmEzMWQpLCBXVEMoMHg0OWMxNGI2MCksIFdUQygweDQ2YzFlOWU0KSwKKyAgICBXVEMoMHg0Mzc0ZTE3OSksIFdUQygweDQwODM3N2IxKSwgV1RDKDB4M2UwZmEwYWEpLCBXVEMoMHgzYzA1ZDU4NCksCisgICAgV1RDKDB4M2E0ZDk4ODgpLCBXVEMoMHgzOGNkZDhmYSksIFdUQygweDM3NmI3NWM0KSwgV1RDKDB4MzYwYzUxYTcpLAorICAgIFdUQygweDM0YjEyZmRjKSwgV1RDKDB4MzM1NTBkOWYpLCBXVEMoMHgzMWYxOTU1YyksIFdUQygweDMwN2ZmY2IyKSwKKyAgICBXVEMoMHgyZjAzYzQ0ZCksIFdUQygweDJkN2E2Yjg2KSwgV1RDKDB4MmJlNmQzZDQpLCBXVEMoMHgyYTQ4ZDIxOSksCit9OworCitjb25zdCBGSVhQX1dUQiBFTERBbmFseXNpczEyMFszNjBdID0geworICAgIFdUQygweGZhYTFhNDBhKSwgV1RDKDB4ZmEzZjE3M2QpLCBXVEMoMHhmOWQ3NzYwYyksIFdUQygweGY5NmJjYzEyKSwKKyAgICBXVEMoMHhmOGZiZTgyYyksIFdUQygweGY4ODdiYjI2KSwgV1RDKDB4ZjgwZjEzMWEpLCBXVEMoMHhmNzkzMGQwMyksCisgICAgV1RDKDB4ZjcxNGFlYWYpLCBXVEMoMHhmNjkzZjVhMSksIFdUQygweGY2MTMzODViKSwgV1RDKDB4ZjU5NmVmMGUpLAorICAgIFdUQygweGY1MjJkY2M0KSwgV1RDKDB4ZjRiYWIxZjYpLCBXVEMoMHhmNDYxNzAwYyksIFdUQygweGY0MTJlMWZlKSwKKyAgICBXVEMoMHhmM2I3NjliMSksIFdUQygweGYzNDllYWNhKSwgV1RDKDB4ZjJjYjkxNjQpLCBXVEMoMHhmMjNkNmQ3YiksCisgICAgV1RDKDB4ZjFhMGFiMjgpLCBXVEMoMHhmMGY1YzIwZiksIFdUQygweGYwM2FhZGQ5KSwgV1RDKDB4ZWY2ZThjNjYpLAorICAgIFdUQygweGVlOTg0OTEwKSwgV1RDKDB4ZWRiYmNiZjgpLCBXVEMoMHhlY2QxNDM1YiksIFdUQygweGViZGMxYjc3KSwKKyAgICBXVEMoMHhlYWUzMTMzOCksIFdUQygweGU5ZGJlYTlhKSwgV1RDKDB4ZThjMDA1ZWEpLCBXVEMoMHhlNzllNzA2OCksCisgICAgV1RDKDB4ZTY4NTZkY2UpLCBXVEMoMHhlNTY1N2M3OSksIFdUQygweGU0MjkyOGU5KSwgV1RDKDB4ZTJlMDc1NmUpLAorICAgIFdUQygweGUxYTgzY2Y1KSwgV1RDKDB4ZTA4MDFmYWIpLCBXVEMoMHhkZjUyYmZlYiksIFdUQygweGRlMTVkMWIxKSwKKyAgICBXVEMoMHhkY2NlNzFiYSksIFdUQygweGRiODkzMWJmKSwgV1RDKDB4ZGE0ZmJiZTgpLCBXVEMoMHhkOTIyMGE5OCksCisgICAgV1RDKDB4ZDdmOWFmMGMpLCBXVEMoMHhkNmQwZTFkZiksIFdUQygweGQ1YTQxZjE1KSwgV1RDKDB4ZDQ3OTAzMzApLAorICAgIFdUQygweGQzNWY4NGI4KSwgV1RDKDB4ZDI1NWU4ODEpLCBXVEMoMHhkMTRkYWYwMCksIFdUQygweGQwNDYzOGUyKSwKKyAgICBXVEMoMHhjZjQ3ZGZmNyksIFdUQygweGNlNWI4ODUwKSwgV1RDKDB4Y2Q3N2IxZDYpLCBXVEMoMHhjYzk2MGVjMCksCisgICAgV1RDKDB4Y2JjMGE2YTQpLCBXVEMoMHhjYWY2ZDRmNyksIFdUQygweGNhMzRmYTdkKSwgV1RDKDB4Yzk3YzI2YzApLAorICAgIFdUQygweGM4YzY4NjhhKSwgV1RDKDB4YzgxMWY4NzMpLCBXVEMoMHhjNzU5OWRiOCksIFdUQygweGM2OWY5NzgwKSwKKyAgICBXVEMoMHhjNWUyNDA0MyksIFdUQygweGM1MjI2Mzg0KSwgV1RDKDB4YzQ2OGY1NDcpLCBXVEMoMHhjM2IyMGJlOSksCisgICAgV1RDKDB4YzJmODI2ZjApLCBXVEMoMHhjMjQyZWEwMiksIFdUQygweGMxOTg0NGFlKSwgV1RDKDB4YzBmODA3MTQpLAorICAgIFdUQygweGMwNWE2ZGExKSwgV1RDKDB4YmZiZmU2ZDMpLCBXVEMoMHhiZjMxYjViNCksIFdUQygweGJlYjI0ODQzKSwKKyAgICBXVEMoMHhiZTNmNGNiNCksIFdUQygweGJkZDYzNTk5KSwgV1RDKDB4YmQ3NGM2YjIpLCBXVEMoMHhiZDFiNzEyOCksCisgICAgV1RDKDB4YmNjZDRiNDEpLCBXVEMoMHhiYzhkYzA4ZSksIFdUQygweGJjNWNhMmJkKSwgV1RDKDB4YmMzNTA5ZjEpLAorICAgIFdUQygweGJjMTFmOTA0KSwgV1RDKDB4YmJmMzc4NDgpLCBXVEMoMHhiYmRkZmI2YiksIFdUQygweGJiZDIxNGVhKSwKKyAgICBXVEMoMHhiYmNiM2ExMSksIFdUQygweGJiY2NlNTgxKSwgV1RDKDB4YmJkZmE2YmEpLCBXVEMoMHhiYmZkMmZhNSksCisgICAgV1RDKDB4YmMxYWQ1MTYpLCBXVEMoMHhiYzM5MGMxNiksIFdUQygweGJjNTdiMzIzKSwgV1RDKDB4YmM3NmRkMWYpLAorICAgIFdUQygweGJjOTY5MTcyKSwgV1RDKDB4YmNiNmQ2MTEpLCBXVEMoMHhiY2Q3YWM4ZSksIFdUQygweGJjZjkxYWY5KSwKKyAgICBXVEMoMHhiZDFiMjBiZCksIFdUQygweGJkM2RjMWY1KSwgV1RDKDB4YmQ2MGY2NzgpLCBXVEMoMHhiZDg0YmVjNyksCisgICAgV1RDKDB4YmRhOTA5YzApLCBXVEMoMHhiZGNkZDc2ZSksIFdUQygweGJkZjMxNjFjKSwgV1RDKDB4YmUxOGMxZTUpLAorICAgIFdUQygweGJlM2VjNmM1KSwgV1RDKDB4YmU2NTFmMTkpLCBXVEMoMHhiZThiYjc4YiksIFdUQygweGJlYjI4OGUxKSwKKyAgICBXVEMoMHhiZWQ5ODQ4YiksIFdUQygweGJmMDBhMTZmKSwgV1RDKDB4YmYyN2Q2ODEpLCBXVEMoMHhiZjRmMTk1OCksCisgICAgV1RDKDB4YmY3NjY4MGUpLCBXVEMoMHhiZjlkYjg1YyksIFdUQygweGJmYzUwZTA5KSwgV1RDKDB4YmZlYzViZGYpLAorICAgIFdUQygweDgwMjczYmRiKSwgV1RDKDB4ODA3NTc3ZGUpLCBXVEMoMHg4MGMzNjMwZCksIFdUQygweDgxMTBlNGNiKSwKKyAgICBXVEMoMHg4MTVlMDVkYSksIFdUQygweDgxYWFiMjBmKSwgV1RDKDB4ODFmNmU2OGUpLCBXVEMoMHg4MjQyOTBkMCksCisgICAgV1RDKDB4ODI4ZGEwNGMpLCBXVEMoMHg4MmQ4MDYxZiksIFdUQygweDgzMjFhNzQwKSwgV1RDKDB4ODM2YTc3ZjkpLAorICAgIFdUQygweDgzYjI1NzRmKSwgV1RDKDB4ODNmOTNjYzEpLCBXVEMoMHg4NDNmMDRhNiksIFdUQygweDg0ODNhY2QxKSwKKyAgICBXVEMoMHg4NGM3MTYzOSksIFdUQygweDg1MDk0NGRhKSwgV1RDKDB4ODU0YTFkM2EpLCBXVEMoMHg4NTg5YTQzNyksCisgICAgV1RDKDB4ODVjN2NjZjkpLCBXVEMoMHg4NjA0YTQyZiksIFdUQygweDg2NDAyY2ZiKSwgV1RDKDB4ODY3YTc0MGQpLAorICAgIFdUQygweDg2YjM3ZmYyKSwgV1RDKDB4ODZlYjVmNmYpLCBXVEMoMHg4NzIyMjEwOSksIFdUQygweDg3NTdlYjVmKSwKKyAgICBXVEMoMHg4NzhjODM0MSksIFdUQygweDg3YzBiZTUxKSwgV1RDKDB4ODgzNDVmY2EpLCBXVEMoMHg4OGVmOTdmYiksCisgICAgV1RDKDB4ODljNzc4YzUpLCBXVEMoMHg4YWEzY2MyMCksIFdUQygweDhiODMzZDU2KSwgV1RDKDB4OGM2YTQyYTkpLAorICAgIFdUQygweDhkNWNiNzg3KSwgV1RDKDB4OGU1ZDc3ODcpLCBXVEMoMHg4ZjZlM2M1YiksIFdUQygweDkwOTAyNjQwKSwKKyAgICBXVEMoMHg5MWMzY2EyOCksIFdUQygweDkzMDk2MjJkKSwgV1RDKDB4OTQ2MGU3ZDApLCBXVEMoMHg5NWNhMWFkMiksCisgICAgV1RDKDB4OTc0NDlkZmYpLCBXVEMoMHg5OGQwMDYxMiksIFdUQygweDlhNmJiYzE5KSwgV1RDKDB4OWMxNzE2NGQpLAorICAgIFdUQygweDlkZDE4MGZjKSwgV1RDKDB4OWY5YTYzMDQpLCBXVEMoMHhhMTcxMWY1NiksIFdUQygweGEzNTU0MjVlKSwKKyAgICBXVEMoMHhhNTQ2NTg0NiksIFdUQygweGE3NDQxOTBmKSwgV1RDKDB4YTk0ZTRjYTkpLCBXVEMoMHhhYjY0ZGNmMCksCisgICAgV1RDKDB4YWQ4N2UwNjgpLCBXVEMoMHhhZmI3N2JmYSksIFdUQygweGIxZjNmYjJiKSwgV1RDKDB4YjQzZDg4NWMpLAorICAgIFdUQygweDQ5ODY2NDUxKSwgV1RDKDB4NDcyM2U1NmIpLCBXVEMoMHg0NGI1MWU4ZCksIFdUQygweDQyM2EyMTgwKSwKKyAgICBXVEMoMHgzZmIyZmUwZiksIFdUQygweDNkMWY3OGYyKSwgV1RDKDB4M2E4MTUzYjcpLCBXVEMoMHgzN2Q5MDZmZiksCisgICAgV1RDKDB4MzUyNTllN2UpLCBXVEMoMHgzMjY5YmExOCksIFdUQygweDJmYThjMWVhKSwgV1RDKDB4MmNlNGZiYWIpLAorICAgIFdUQygweDJhMWNlYmQ1KSwgV1RDKDB4Mjc1MTlhYzEpLCBXVEMoMHgyNDhhMmRlOSksIFdUQygweDIxY2I3YTc5KSwKKyAgICBXVEMoMHgxZjE2ZmMxMyksIFdUQygweDFjNmQ5YTUwKSwgV1RDKDB4MTljZjgzYzEpLCBXVEMoMHgxNzNlOTk0MyksCisgICAgV1RDKDB4MTRiZjZhNzEpLCBXVEMoMHgxMjU5OGY3NCksIFdUQygweDEwMGZlMjdmKSwgV1RDKDB4MGRkYWI0NmEpLAorICAgIFdUQygweDBiYWZhYjlkKSwgV1RDKDB4MDk4NjRmYzcpLCBXVEMoMHgwNzVkM2FjOCksIFdUQygweDA1MmMwZmMyKSwKKyAgICBXVEMoMHgwMmVhODQyYiksIFdUQygweDAwZjIxZDE5KSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweGZmY2I3YjRkKSwgV1RDKDB4ZmY2MmZiMjApLCBXVEMoMHhmZWZiODJlMiksIFdUQygweGZlOTY1NDgyKSwKKyAgICBXVEMoMHhmZTMzZTRiZiksIFdUQygweGZkZDRiOWI1KSwgV1RDKDB4ZmQ3YjA0ZWMpLCBXVEMoMHhmZDI3Y2ZlNCksCisgICAgV1RDKDB4ZmNkODRjZmQpLCBXVEMoMHhmYzhjZTFkNCksIFdUQygweGZjNGI0NWUxKSwgV1RDKDB4ZmMxNjY2ZGEpLAorICAgIFdUQygweGZiZThhZjI2KSwgV1RDKDB4ZmJiY2FkOWUpLCBXVEMoMHhmYjk4YzZhZCksIFdUQygweGZiODVkZDg3KSwKKyAgICBXVEMoMHhmYjg2MzU1YiksIFdUQygweGZiOTQ1ODliKSwgV1RDKDB4ZmJhOGVkOGEpLCBXVEMoMHhmYmMwYTczNSksCisgICAgV1RDKDB4ZmJlMjNmOGQpLCBXVEMoMHhmYzFhOTJjNCksIFdUQygweGZjNzMzMTVmKSwgV1RDKDB4ZmNlNjExYTEpLAorICAgIFdUQygweGZkNWU5NGQ5KSwgV1RDKDB4ZmRkNjFjYWIpLCBXVEMoMHhmZTY0MjdmZCksIFdUQygweGZmMWM5MmRhKSwKKyAgICBXVEMoMHhmZmYxMDU0MiksIFdUQygweDAwZDFkNThhKSwgV1RDKDB4MDFjNmRhYWIpLCBXVEMoMHgwMmQ4ZGJjMyksCisgICAgV1RDKDB4MDQwNTU3YTYpLCBXVEMoMHgwNTRiNmY5MSksIFdUQygweDA2YWQyYjJiKSwgV1RDKDB4MDgyOGY0YzUpLAorICAgIFdUQygweDA5YzM0OGQxKSwgV1RDKDB4MGI3ZGNiNTYpLCBXVEMoMHgwZDU0ZDk4ZSksIFdUQygweDBmNDdhNTk5KSwKKyAgICBXVEMoMHgxMTU3ZmExYiksIFdUQygweDEzODc0M2FlKSwgV1RDKDB4MTVkNjQyM2YpLCBXVEMoMHgxODQ0ZjBhZSksCisgICAgV1RDKDB4MWFkM2MyNzMpLCBXVEMoMHgxZDgyZTY1YyksIFdUQygweDIwNTMwNmUxKSwgV1RDKDB4MjM0NDNkNWMpLAorICAgIFdUQygweDI2NTZmYWU4KSwgV1RDKDB4Mjk4YjNhNWEpLCBXVEMoMHgyY2UxM2E3ZCksIFdUQygweDMwNThlMGUzKSwKKyAgICBXVEMoMHgzM2YyMjk1MCksIFdUQygweDM3YWNkMGIyKSwgV1RDKDB4M2I4ODVlNmIpLCBXVEMoMHgzZjg0MDQxMiksCisgICAgV1RDKDB4NDM5ZTY1ZWUpLCBXVEMoMHg0N2Q2MDE0ZSksIFdUQygweDRjMmFhODU3KSwgV1RDKDB4NTBhNDY4NzYpLAorICAgIFdUQygweGZmZmU5YjAyKSwgV1RDKDB4MDAwNGFjNjEpLCBXVEMoMHgwMDY5NjM5ZCksIFdUQygweDAxMjc1NzhiKSwKKyAgICBXVEMoMHgwMjM5MWVmZSksIFdUQygweDAzOTk1MGNjKSwgV1RDKDB4MDU0MjgzYmYpLCBXVEMoMHgwNzJmNGViYSksCisgICAgV1RDKDB4MDk1YTQ4OGMpLCBXVEMoMHgwYmJlMDgwMiksIFdUQygweDBlNTUyM2Y5KSwgV1RDKDB4MTExYTMzMmUpLAorICAgIFdUQygweDE0MDdjY2EyKSwgV1RDKDB4MTcxODg2ZjUpLCBXVEMoMHgxYTQ2ZjkyNyksIFdUQygweDFkOGRiOWUxKSwKKyAgICBXVEMoMHgyMGU3NjAwZCksIFdUQygweDI0NGU4MmEzKSwgV1RDKDB4MjdiZGI4NDYpLCBXVEMoMHgyYjJmOTdhOCksCisgICAgV1RDKDB4MmU5ZWI3ZWEpLCBXVEMoMHgzMjA1YWZkMSksIFdUQygweDM1NWYxNjFjKSwgV1RDKDB4MzhhNTgxZDcpLAorICAgIFdUQygweDNiZDM4OTRhKSwgV1RDKDB4M2VlM2MzOTgpLCBXVEMoMHg0MWQwYzdhZSksIFdUQygweDQ0OTUyY2I4KSwKKyAgICBXVEMoMHg0NzJiODg1NiksIFdUQygweDQ5OGU3ZWVlKSwgV1RDKDB4NGJiODgyNDUpLCBXVEMoMHg0ZGE0NGQ5ZiksCisgICAgV1RDKDB4NGY0YzZiN2QpLCBXVEMoMHg1MGFiNzI5OCksIFdUQygweDUxYmJmYTExKSwgV1RDKDB4NTI3ODk4ZmIpLAorICAgIFdUQygweDUyZGJlNWYyKSwgV1RDKDB4NTJlMDc3NzgpLCBXVEMoMHg1MjgwZTUxZiksIFdUQygweDUxYjdjNGYxKSwKKyAgICBXVEMoMHg1MDdmYWRjNyksIFdUQygweDRlZDMzNmRkKSwgV1RDKDB4NGNhY2Y3NDkpLCBXVEMoMHg0YTA3ODUzNCksCisgICAgV1RDKDB4NDZkZDZkY2MpLCBXVEMoMHg0MzU5OWUyMiksIFdUQygweDQwM2Y0OGRhKSwgV1RDKDB4M2RiMWVkODkpLAorICAgIFdUQygweDNiOThiZDI0KSwgV1RDKDB4MzlkNWIwMDMpLCBXVEMoMHgzODRhMzI5MiksIFdUQygweDM2ZDMyOGZmKSwKKyAgICBXVEMoMHgzNTVlNjNhNiksIFdUQygweDMzZWM2OWQ4KSwgV1RDKDB4MzI3NTVlYmQpLCBXVEMoMHgzMGYwMWZjZSksCisgICAgV1RDKDB4MmY1ZDk2NDYpLCBXVEMoMHgyZGJjYzYxNSksIFdUQygweDJjMGZhMTQ1KSwgV1RDKDB4MmE1NmNlNTMpLAorfTsKZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JvbS5oIGIvbGliQUFDZW5jL3NyYy9hYWNFbmNfcm9tLmgKaW5kZXggODYyNDE3Zi4uZmQ1MGNhYiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hYWNFbmNfcm9tLmgKKysrIGIvbGliQUFDZW5jL3NyYy9hYWNFbmNfcm9tLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzkgKzkwLDQyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3JzOiAgICAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKLSAgIENvbnRlbnRzL2Rlc2NyaXB0aW9uOgorICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIE1lbW9yeSBsYXlvdXQgICAKKyAgXGJyaWVmICBNZW1vcnkgbGF5b3V0CiAgIFxhdXRob3IgTWFya3VzIExvaHdhc3NlcgogKi8KIAotI2lmbmRlZiBBQUNfRU5DX1JPTV9ICi0jZGVmaW5lIEFBQ19FTkNfUk9NX0gKKyNpZm5kZWYgQUFDRU5DX1JPTV9ICisjZGVmaW5lIEFBQ0VOQ19ST01fSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCisjaW5jbHVkZSAiRkRLX2xwYy5oIgogCiAvKgogICBIdWZmbWFuIFRhYmxlcwogKi8KLWV4dGVybiBjb25zdCBVTE9ORyAgRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlszXVszXVszXVszXTsKLWV4dGVybiBjb25zdCBVTE9ORyAgRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFszXVszXVszXVszXTsKLWV4dGVybiBjb25zdCBVTE9ORyAgRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNls5XVs5XTsKLWV4dGVybiBjb25zdCBVTE9ORyAgRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFs4XVs4XTsKLWV4dGVybiBjb25zdCBVTE9ORyAgRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbMTNdWzEzXTsKLWV4dGVybiBjb25zdCBVQ0hBUiAgRkRLYWFjRW5jX2h1ZmZfbHRhYjExWzE3XVsxN107Ci1leHRlcm4gY29uc3QgVUNIQVIgIEZES2FhY0VuY19odWZmX2x0YWJzY2ZbMTIxXTsKK2V4dGVybiBjb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9sdGFiMV8yWzNdWzNdWzNdWzNdOworZXh0ZXJuIGNvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2x0YWIzXzRbM11bM11bM11bM107CitleHRlcm4gY29uc3QgVUxPTkcgRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNls5XVs5XTsKK2V4dGVybiBjb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9sdGFiN184WzhdWzhdOworZXh0ZXJuIGNvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2x0YWI5XzEwWzEzXVsxM107CitleHRlcm4gY29uc3QgVUNIQVIgRkRLYWFjRW5jX2h1ZmZfbHRhYjExWzE3XVsxN107CitleHRlcm4gY29uc3QgVUNIQVIgRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZlsxMjFdOwogZXh0ZXJuIGNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiMVszXVszXVszXVszXTsKIGV4dGVybiBjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjJbM11bM11bM11bM107CiBleHRlcm4gY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIzWzNdWzNdWzNdWzNdOwpAQCAtMTIzLDEzICsxMzcsMTMgQEAKIGV4dGVybiBjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjlbMTNdWzEzXTsKIGV4dGVybiBjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjEwWzEzXVsxM107CiBleHRlcm4gY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIxMVsyMV1bMTddOwotZXh0ZXJuIGNvbnN0IFVMT05HICBGREthYWNFbmNfaHVmZl9jdGFic2NmWzEyMV07CitleHRlcm4gY29uc3QgVUxPTkcgRkRLYWFjRW5jX2h1ZmZfY3RhYnNjZlsxMjFdOwogCiAvKgogICBxdWFudGl6ZXIKICovCiAjZGVmaW5lIE1BTlRfRElHSVRTIDkKLSNkZWZpbmUgTUFOVF9TSVpFICAgKDE8PE1BTlRfRElHSVRTKQorI2RlZmluZSBNQU5UX1NJWkUgKDEgPDwgTUFOVF9ESUdJVFMpCiAKICNpZiBkZWZpbmVkKEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYpCiAjZGVmaW5lIEZJWFBfUVREIEZJWFBfU0dMCkBAIC0xNDcsNTAgKzE2MSw0NyBAQAogZXh0ZXJuIGNvbnN0IEZJWFBfREJMIEZES2FhY0VuY19zcGVjRXhwTWFudFRhYmxlQ29tYkVsY1s0XVsxNF07CiBleHRlcm4gY29uc3QgVUNIQVIgRkRLYWFjRW5jX3NwZWNFeHBUYWJsZUNvbWJbNF1bMTRdOwogCi0KIC8qCiAgIHRhYmxlIHRvIGNvdW50IHVzZWQgbnVtYmVyIG9mIGJpdHMKICovCi1leHRlcm4gY29uc3QgU0hPUlQgRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZ1tNQVhfU0ZCX0xPTkcgKyAxXTsKLWV4dGVybiBjb25zdCBTSE9SVCBGREthYWNFbmNfc2lkZUluZm9UYWJTaG9ydFtNQVhfU0ZCX1NIT1JUICsgMV07Ci0KK2V4dGVybiBjb25zdCBTSE9SVCBGREthYWNFbmNfc2lkZUluZm9UYWJMb25nW107CitleHRlcm4gY29uc3QgU0hPUlQgRkRLYWFjRW5jX3NpZGVJbmZvVGFiU2hvcnRbXTsKIAogLyoKICAgUHN5IENvbmZpZ3VyYXRpb24gY29uc3RhbnRzCiAqLwotZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY184MDAwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY184MDAwX2xvbmdfMTAyNDsKIGV4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfODAwMF9zaG9ydF8xMjg7Ci1leHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzExMDI1X2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY18xMTAyNV9sb25nXzEwMjQ7CiBleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzExMDI1X3Nob3J0XzEyODsKLWV4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyAgcF9GREthYWNFbmNfMTIwMDBfbG9uZ18xMDI0OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzEyMDAwX2xvbmdfMTAyNDsKIGV4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfMTIwMDBfc2hvcnRfMTI4OwotZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY18xNjAwMF9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMTYwMDBfbG9uZ18xMDI0OwogZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18xNjAwMF9zaG9ydF8xMjg7Ci1leHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzIyMDUwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY18yMjA1MF9sb25nXzEwMjQ7CiBleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzIyMDUwX3Nob3J0XzEyODsKLWV4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyAgcF9GREthYWNFbmNfMjQwMDBfbG9uZ18xMDI0OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzI0MDAwX2xvbmdfMTAyNDsKIGV4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfMjQwMDBfc2hvcnRfMTI4OwotZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY18zMjAwMF9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMzIwMDBfbG9uZ18xMDI0OwogZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18zMjAwMF9zaG9ydF8xMjg7Ci1leHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzQ0MTAwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY180NDEwMF9sb25nXzEwMjQ7CiBleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzQ0MTAwX3Nob3J0XzEyODsKLWV4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyAgcF9GREthYWNFbmNfNDgwMDBfbG9uZ18xMDI0OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzQ4MDAwX2xvbmdfMTAyNDsKIGV4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfNDgwMDBfc2hvcnRfMTI4OwotZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY182NDAwMF9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfNjQwMDBfbG9uZ18xMDI0OwogZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY182NDAwMF9zaG9ydF8xMjg7Ci1leHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzg4MjAwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY184ODIwMF9sb25nXzEwMjQ7CiBleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzg4MjAwX3Nob3J0XzEyODsKLWV4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyAgcF9GREthYWNFbmNfOTYwMDBfbG9uZ18xMDI0OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzk2MDAwX2xvbmdfMTAyNDsKIGV4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfOTYwMDBfc2hvcnRfMTI4OwogCi0KIC8qCiAgIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzCiAqLwotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIEZES2FhY0VuY190bnNFbmNDb2VmZjNbOF07Ci1leHRlcm4gY29uc3QgRklYUF9EQkwgRkRLYWFjRW5jX3Ruc0NvZWZmM0JvcmRlcnNbOF07Ci1leHRlcm4gY29uc3QgRklYUF9EQkwgRkRLYWFjRW5jX3Ruc0VuY0NvZWZmNFsxNl07Ci1leHRlcm4gY29uc3QgRklYUF9EQkwgRkRLYWFjRW5jX3Ruc0NvZWZmNEJvcmRlcnNbMTZdOworZXh0ZXJuIGNvbnN0IEZJWFBfTFBDIEZES2FhY0VuY190bnNFbmNDb2VmZjNbOF07CitleHRlcm4gY29uc3QgRklYUF9MUEMgRkRLYWFjRW5jX3Ruc0NvZWZmM0JvcmRlcnNbOF07CitleHRlcm4gY29uc3QgRklYUF9MUEMgRkRLYWFjRW5jX3Ruc0VuY0NvZWZmNFsxNl07CitleHRlcm4gY29uc3QgRklYUF9MUEMgRkRLYWFjRW5jX3Ruc0NvZWZmNEJvcmRlcnNbMTZdOwogCiAjZGVmaW5lIFdUQzAgV1RDCiAjZGVmaW5lIFdUQzEgV1RDCkBAIC0xOTgsNiArMjA5LDkgQEAKIAogZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEVMREFuYWx5c2lzNTEyWzE1MzZdOwogZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEVMREFuYWx5c2lzNDgwWzE0NDBdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEVMREFuYWx5c2lzMjU2Wzc2OF07CitleHRlcm4gY29uc3QgRklYUF9XVEIgRUxEQW5hbHlzaXMyNDBbNzIwXTsKK2V4dGVybiBjb25zdCBGSVhQX1dUQiBFTERBbmFseXNpczEyOFszODRdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEVMREFuYWx5c2lzMTIwWzM2MF07CiAKLQotI2VuZGlmIC8qICNpZm5kZWYgQUFDX0VOQ19ST01fSCAqLworI2VuZGlmIC8qICNpZm5kZWYgQUFDRU5DX1JPTV9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2FhY2VuYy5jcHAgYi9saWJBQUNlbmMvc3JjL2FhY2VuYy5jcHAKaW5kZXggNWU4YzA4ZC4uOGI4YTFhZCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hYWNlbmMuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGYXN0IE1QRUcgQUFDIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAotICAgY29udGVudHMvZGVzY3JpcHRpb246IGZhc3QgYWFjIGNvZGVyIGZ1bmN0aW9ucworICAgQXV0aG9yKHMpOiAgIE0uIFNjaHVnIC8gQS4gR3JvZXNjaGVsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBmYXN0IGFhYyBjb2RlciBmdW5jdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImFhY2VuYy5oIgogCkBAIC0xMDIsNzQgKzExNCw1MyBAQAogCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAorI2RlZmluZSBCSVRSRVNfTUFYX0xEIDQwMDAKKyNkZWZpbmUgQklUUkVTX01JTl9MRCA1MDAKKyNkZWZpbmUgQklUUkFURV9NQVhfTEQgNzAwMDAgLyogTWF4IGFzc3VtZWQgYml0cmF0ZSBmb3IgYml0cmVzIGNhbGN1bGF0aW9uICovCisjZGVmaW5lIEJJVFJBVEVfTUlOX0xEIDEyMDAwIC8qIE1pbiBhc3N1bWVkIGJpdHJhdGUgZm9yIGJpdHJlcyBjYWxjdWxhdGlvbiAqLwogCitJTlQgRkRLYWFjRW5jX0NhbGNCaXRzUGVyRnJhbWUoY29uc3QgSU5UIGJpdFJhdGUsIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxpbmdSYXRlKSB7CisgIGludCBzaGlmdCA9IDA7CisgIHdoaWxlICgoZnJhbWVMZW5ndGggJiB+KCgxIDw8IChzaGlmdCArIDEpKSAtIDEpKSA9PSBmcmFtZUxlbmd0aCAmJgorICAgICAgICAgKHNhbXBsaW5nUmF0ZSAmIH4oKDEgPDwgKHNoaWZ0ICsgMSkpIC0gMSkpID09IHNhbXBsaW5nUmF0ZSkgeworICAgIHNoaWZ0Kys7CisgIH0KIAotCi0jZGVmaW5lIE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTiA2MTQ0Ci0KLUlOVCBGREthYWNFbmNfQ2FsY0JpdHNQZXJGcmFtZSgKLSAgICAgICAgY29uc3QgSU5UIGJpdFJhdGUsCi0gICAgICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZQotICAgICAgICApCi17Ci0gICAgaW50IHNoaWZ0ID0gMDsKLSAgICB3aGlsZSAoKGZyYW1lTGVuZ3RoICYgfigoMSA8PCAoc2hpZnQgKyAxKSkgLSAxKSkgPT0gZnJhbWVMZW5ndGgKLSAgICAgICAgJiYgKHNhbXBsaW5nUmF0ZSAmIH4oKDEgPDwgKHNoaWZ0ICsgMSkpIC0gMSkpID09IHNhbXBsaW5nUmF0ZSkKLSAgICB7Ci0gICAgICBzaGlmdCsrOwotICAgIH0KLQotICAgIHJldHVybiAoYml0UmF0ZSooZnJhbWVMZW5ndGg+PnNoaWZ0KSkgLyAoc2FtcGxpbmdSYXRlPj5zaGlmdCk7CisgIHJldHVybiAoYml0UmF0ZSAqIChmcmFtZUxlbmd0aCA+PiBzaGlmdCkpIC8gKHNhbXBsaW5nUmF0ZSA+PiBzaGlmdCk7CiB9CiAKLUlOVCBGREthYWNFbmNfQ2FsY0JpdHJhdGUoCi0gICAgICAgIGNvbnN0IElOVCBiaXRzUGVyRnJhbWUsCi0gICAgICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZQotICAgICAgICApCi17Ci0gICAgaW50IHNoaWZ0ID0gMDsKLSAgICB3aGlsZSAoKGZyYW1lTGVuZ3RoICYgfigoMSA8PCAoc2hpZnQgKyAxKSkgLSAxKSkgPT0gZnJhbWVMZW5ndGgKLSAgICAgICAgJiYgKHNhbXBsaW5nUmF0ZSAmIH4oKDEgPDwgKHNoaWZ0ICsgMSkpIC0gMSkpID09IHNhbXBsaW5nUmF0ZSkKLSAgICB7Ci0gICAgICBzaGlmdCsrOwotICAgIH0KK0lOVCBGREthYWNFbmNfQ2FsY0JpdHJhdGUoY29uc3QgSU5UIGJpdHNQZXJGcmFtZSwgY29uc3QgSU5UIGZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxpbmdSYXRlKSB7CisgIGludCBzaGlmdCA9IDA7CisgIHdoaWxlICgoZnJhbWVMZW5ndGggJiB+KCgxIDw8IChzaGlmdCArIDEpKSAtIDEpKSA9PSBmcmFtZUxlbmd0aCAmJgorICAgICAgICAgKHNhbXBsaW5nUmF0ZSAmIH4oKDEgPDwgKHNoaWZ0ICsgMSkpIC0gMSkpID09IHNhbXBsaW5nUmF0ZSkgeworICAgIHNoaWZ0Kys7CisgIH0KIAotICAgIHJldHVybiAoYml0c1BlckZyYW1lICogKHNhbXBsaW5nUmF0ZT4+c2hpZnQpKSAvICggZnJhbWVMZW5ndGg+PnNoaWZ0KSA7Ci0KKyAgcmV0dXJuIChiaXRzUGVyRnJhbWUgKiAoc2FtcGxpbmdSYXRlID4+IHNoaWZ0KSkgLyAoZnJhbWVMZW5ndGggPj4gc2hpZnQpOwogfQogCi1zdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRDaGVja0FuY2lsbGFyeShJTlQgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmFtZWxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhbmNpbGxhcnlSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICphbmNpbGxhcnlCaXRzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSk7CitzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRDaGVja0FuY2lsbGFyeSgKKyAgICBJTlQgYml0UmF0ZSwgSU5UIGZyYW1lbGVuZ3RoLCBJTlQgYW5jaWxsYXJ5UmF0ZSwgSU5UICphbmNpbGxhcnlCaXRzUGVyRnJhbWUsCisgICAgSU5UIHNhbXBsZVJhdGUpOwogCi1JTlQgRkRLYWFjRW5jX0xpbWl0Qml0cmF0ZSgKLSAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCi0gICAgICAgIElOVCBjb3JlU2FtcGxpbmdSYXRlLAotICAgICAgICBJTlQgZnJhbWVMZW5ndGgsCi0gICAgICAgIElOVCBuQ2hhbm5lbHMsCi0gICAgICAgIElOVCBuQ2hhbm5lbHNFZmYsCi0gICAgICAgIElOVCBiaXRSYXRlLAotICAgICAgICBJTlQgYXZlcmFnZUJpdHMsCi0gICAgICAgIElOVCAqcEF2ZXJhZ2VCaXRzUGVyRnJhbWUsCi0gICAgICAgIElOVCBiaXRyYXRlTW9kZSwKLSAgICAgICAgSU5UIG5TdWJGcmFtZXMKLSAgICAgICAgKQotewotICBJTlQgdHJhbnNwb3J0Qml0cywgcHJldkJpdFJhdGUsIGF2ZXJhZ2VCaXRzUGVyRnJhbWUsIHNoaWZ0ID0gMCwgaXRlcj0wOwotCi0gIHdoaWxlICggKGZyYW1lTGVuZ3RoICYgfigoMTw8KHNoaWZ0KzEpKS0xKSkgPT0gZnJhbWVMZW5ndGgKLSAgICAmJiAoY29yZVNhbXBsaW5nUmF0ZSAmIH4oKDE8PChzaGlmdCsxKSktMSkpID09IGNvcmVTYW1wbGluZ1JhdGUgKQotICB7Ci0gICAgc2hpZnQgKys7CitJTlQgRkRLYWFjRW5jX0xpbWl0Qml0cmF0ZShIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNvcmVTYW1wbGluZ1JhdGUsIElOVCBmcmFtZUxlbmd0aCwgSU5UIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuQ2hhbm5lbHNFZmYsIElOVCBiaXRSYXRlLCBJTlQgYXZlcmFnZUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBBdmVyYWdlQml0c1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0JJVFJBVEVfTU9ERSBiaXRyYXRlTW9kZSwgSU5UIG5TdWJGcmFtZXMpIHsKKyAgSU5UIHRyYW5zcG9ydEJpdHMsIHByZXZCaXRSYXRlLCBhdmVyYWdlQml0c1BlckZyYW1lLCBtaW5CaXRyYXRlID0gMCwgaXRlciA9IDA7CisgIElOVCBtaW5CaXRzUGVyRnJhbWUgPSA0MCAqIG5DaGFubmVsczsKKyAgaWYgKGlzTG93RGVsYXkoYW90KSkgeworICAgIG1pbkJpdHJhdGUgPSA4MDAwICogbkNoYW5uZWxzRWZmOwogICB9CiAKICAgZG8gewogICAgIHByZXZCaXRSYXRlID0gYml0UmF0ZTsKLSAgICAgYXZlcmFnZUJpdHNQZXJGcmFtZSA9IChiaXRSYXRlKihmcmFtZUxlbmd0aD4+c2hpZnQpKSAvIChjb3JlU2FtcGxpbmdSYXRlPj5zaGlmdCkgLyBuU3ViRnJhbWVzOworICAgIGF2ZXJhZ2VCaXRzUGVyRnJhbWUgPQorICAgICAgICBGREthYWNFbmNfQ2FsY0JpdHNQZXJGcmFtZShiaXRSYXRlLCBmcmFtZUxlbmd0aCwgY29yZVNhbXBsaW5nUmF0ZSkgLworICAgICAgICBuU3ViRnJhbWVzOwogCiAgICAgaWYgKHBBdmVyYWdlQml0c1BlckZyYW1lICE9IE5VTEwpIHsKICAgICAgICpwQXZlcmFnZUJpdHNQZXJGcmFtZSA9IGF2ZXJhZ2VCaXRzUGVyRnJhbWU7CkBAIC0xODIsMzIgKzE3MywzNCBAQAogICAgICAgdHJhbnNwb3J0Qml0cyA9IDIwODsKICAgICB9CiAKLSAgICBiaXRSYXRlID0gRkRLbWF4KGJpdFJhdGUsICgoKCg0MCAqIG5DaGFubmVscykgKyB0cmFuc3BvcnRCaXRzKSAqIChjb3JlU2FtcGxpbmdSYXRlKSkgLyBmcmFtZUxlbmd0aCkgKTsKKyAgICBiaXRSYXRlID0gZk1heChiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgIGZNYXgobWluQml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjQml0cmF0ZSgobWluQml0c1BlckZyYW1lICsgdHJhbnNwb3J0Qml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGgsIGNvcmVTYW1wbGluZ1JhdGUpKSk7CiAgICAgRkRLX0FTU0VSVChiaXRSYXRlID49IDApOwogCi0gICAgYml0UmF0ZSA9IEZES21pbihiaXRSYXRlLCAoKG5DaGFubmVsc0VmZiAqIE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTikqKGNvcmVTYW1wbGluZ1JhdGU+PnNoaWZ0KSkgLyAoZnJhbWVMZW5ndGg+PnNoaWZ0KSkgOworICAgIGJpdFJhdGUgPSBmTWluKGJpdFJhdGUsIEZES2FhY0VuY19DYWxjQml0cmF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5DaGFubmVsc0VmZiAqIE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoLCBjb3JlU2FtcGxpbmdSYXRlKSk7CiAgICAgRkRLX0FTU0VSVChiaXRSYXRlID49IDApOwogCi0gIH0gd2hpbGUgKHByZXZCaXRSYXRlICE9IGJpdFJhdGUgJiYgaXRlcisrIDwgMykgOworICB9IHdoaWxlIChwcmV2Qml0UmF0ZSAhPSBiaXRSYXRlICYmIGl0ZXIrKyA8IDMpOwogCiAgIHJldHVybiBiaXRSYXRlOwogfQogCi0KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGU7CiAgIGludCBjaGFuQml0cmF0ZVsyXTsgLyogbW9uby9zdGVyZW8gc2V0dGluZ3MgKi8KIH0gQ09ORklHX1RBQl9FTlRSWV9WQlI7CiAKIHN0YXRpYyBjb25zdCBDT05GSUdfVEFCX0VOVFJZX1ZCUiBjb25maWdUYWJWQlJbXSA9IHsKLSAge0FBQ0VOQ19CUl9NT0RFX0NCUiwgICB7ICAgICAwLCAgICAgMH19ICwKLSAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8xLCB7IDMyMDAwLCAyMDAwMH19ICwKLSAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8yLCB7IDQwMDAwLCAzMjAwMH19ICwKLSAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8zLCB7IDU2MDAwLCA0ODAwMH19ICwKLSAge0FBQ0VOQ19CUl9NT0RFX1ZCUl80LCB7IDcyMDAwLCA2NDAwMH19ICwKLSAge0FBQ0VOQ19CUl9NT0RFX1ZCUl81LCB7MTEyMDAwLCA5NjAwMH19Ci19OworICAgIHtBQUNFTkNfQlJfTU9ERV9DQlIsIHswLCAwfX0sCisgICAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8xLCB7MzIwMDAsIDIwMDAwfX0sCisgICAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8yLCB7NDAwMDAsIDMyMDAwfX0sCisgICAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8zLCB7NTYwMDAsIDQ4MDAwfX0sCisgICAge0FBQ0VOQ19CUl9NT0RFX1ZCUl80LCB7NzIwMDAsIDY0MDAwfX0sCisgICAge0FBQ0VOQ19CUl9NT0RFX1ZCUl81LCB7MTEyMDAwLCA5NjAwMH19fTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yMTgsMzAgKzIxMSwzMCBAQAogICAgICByZXR1cm5zOiAgICAgIHZiciBiaXRyYXRlCiAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotSU5UIEZES2FhY0VuY19HZXRWQlJCaXRyYXRlKElOVCBiaXRyYXRlTW9kZSwgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlKQoteworSU5UIEZES2FhY0VuY19HZXRWQlJCaXRyYXRlKEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlKSB7CiAgIElOVCBiaXRyYXRlID0gMDsKICAgSU5UIG1vbm9TdGVyZW9Nb2RlID0gMDsgLyogZGVmYXVsdCBtb25vICovCiAKLSAgaWYgKEZES2FhY0VuY19HZXRNb25vU3RlcmVvTW9kZShjaGFubmVsTW9kZSk9PUVMX01PREVfU1RFUkVPKSB7Ci0gICAgICBtb25vU3RlcmVvTW9kZSA9IDE7CisgIGlmIChGREthYWNFbmNfR2V0TW9ub1N0ZXJlb01vZGUoY2hhbm5lbE1vZGUpID09IEVMX01PREVfU1RFUkVPKSB7CisgICAgbW9ub1N0ZXJlb01vZGUgPSAxOwogICB9CiAKLSAgc3dpdGNoKChBQUNFTkNfQklUUkFURV9NT0RFKWJpdHJhdGVNb2RlKXsKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKLSAgICBiaXRyYXRlID0gY29uZmlnVGFiVkJSW2JpdHJhdGVNb2RlXS5jaGFuQml0cmF0ZVttb25vU3RlcmVvTW9kZV07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfSU5WQUxJRDoKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfU0ZSOgotICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0ZGOgotICBkZWZhdWx0OgotICAgIGJpdHJhdGUgPSAwOwotICAgIGJyZWFrOworICBzd2l0Y2ggKGJpdHJhdGVNb2RlKSB7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8yOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzM6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl81OgorICAgICAgYml0cmF0ZSA9IGNvbmZpZ1RhYlZCUltiaXRyYXRlTW9kZV0uY2hhbkJpdHJhdGVbbW9ub1N0ZXJlb01vZGVdOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9JTlZBTElEOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfQ0JSOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfU0ZSOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfRkY6CisgICAgZGVmYXVsdDoKKyAgICAgIGJpdHJhdGUgPSAwOworICAgICAgYnJlYWs7CiAgIH0KIAogICAvKiBjb252ZXJ0IGNoYW5uZWwgYml0cmF0ZSB0byBvdmVyYWxsIGJpdHJhdGUqLwpAQCAtMjU3LDM4ICsyNTAsMzkgQEAKICAqCiAgKiBccmV0dXJuICBDb3JyZWN0ZWQgYml0cmVzZXJ2b2lyIGxldmVsIHVzZWQgaW4gdHJhbnNwb3J0IGxpYnJhcnkuCiAgKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX0VuY0JpdHJlc1RvVHBCaXRyZXMoCi0gICAgICAgIGNvbnN0IEhBTkRMRV9BQUNfRU5DICAgICAgaEFhY0VuYwotICAgICAgICApCi17Ci0gIElOVCB0cmFuc3BvckJpdHJlc2Vydm9pciA9IDA7CitzdGF0aWMgSU5UIEZES2FhY0VuY19FbmNCaXRyZXNUb1RwQml0cmVzKGNvbnN0IEhBTkRMRV9BQUNfRU5DIGhBYWNFbmMpIHsKKyAgSU5UIHRyYW5zcG9ydEJpdHJlc2Vydm9pciA9IDA7CiAKICAgc3dpdGNoIChoQWFjRW5jLT5iaXRyYXRlTW9kZSkgewogICAgIGNhc2UgQUFDRU5DX0JSX01PREVfQ0JSOgotICAgICAgdHJhbnNwb3JCaXRyZXNlcnZvaXIgPSBoQWFjRW5jLT5xY0tlcm5lbC0+Yml0UmVzVG90OyAvKiBlbmNvZGVyIGJpdHJlc2Vydm9pciBsZXZlbCAqLworICAgICAgdHJhbnNwb3J0Qml0cmVzZXJ2b2lyID0KKyAgICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbC0+Yml0UmVzVG90OyAvKiBlbmNvZGVyIGJpdHJlc2Vydm9pciBsZXZlbCAqLwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKICAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8yOgogICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzM6CiAgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKICAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl81OgotICAgICAgdHJhbnNwb3JCaXRyZXNlcnZvaXIgPSBGREtfSU5UX01BWDsgLyogc2lnbmFsIHZhcmlhYmxlIGJpdHJhdGUgKi8KKyAgICAgIHRyYW5zcG9ydEJpdHJlc2Vydm9pciA9IEZES19JTlRfTUFYOyAvKiBzaWduYWwgdmFyaWFibGUgYml0cmF0ZSAqLwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9GRjoKICAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1NGUjoKLSAgICAgIHRyYW5zcG9yQml0cmVzZXJ2b2lyID0gMDsgICAgICAgICAgIC8qIHN1cGVyIGZyYW1pbmcgYW5kIGZpeGVkIGZyYW1pbmcgKi8KLSAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpdGhvdXQgYml0cmVzZXJ2b2lyIHNpZ25hbGluZyAqLworICAgICAgdHJhbnNwb3J0Qml0cmVzZXJ2b2lyID0gMDsgLyogc3VwZXIgZnJhbWluZyBhbmQgZml4ZWQgZnJhbWluZyAqLworICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgLyogd2l0aG91dCBiaXRyZXNlcnZvaXIgc2lnbmFsaW5nICovCiAgICAgZGVmYXVsdDoKICAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0lOVkFMSUQ6Ci0gICAgICB0cmFuc3BvckJpdHJlc2Vydm9pciA9IDA7ICAgICAgICAgICAvKiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24qLwotICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIHRyYW5zcG9ydEJpdHJlc2Vydm9pciA9IDA7IC8qIGludmFsaWQgY29uZmlndXJhdGlvbiovCiAgIH0KIAotICBpZiAoaEFhY0VuYy0+Y29uZmlnLT5hdWRpb011eFZlcnNpb249PTIpIHsKLSAgICB0cmFuc3BvckJpdHJlc2Vydm9pciA9IE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTiAqIGhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nLm5DaGFubmVsc0VmZjsKKyAgaWYgKGhBYWNFbmMtPmNvbmZpZy0+YXVkaW9NdXhWZXJzaW9uID09IDIpIHsKKyAgICB0cmFuc3BvcnRCaXRyZXNlcnZvaXIgPQorICAgICAgICBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4gKiBoQWFjRW5jLT5jaGFubmVsTWFwcGluZy5uQ2hhbm5lbHNFZmY7CiAgIH0KIAotICByZXR1cm4gdHJhbnNwb3JCaXRyZXNlcnZvaXI7CisgIHJldHVybiB0cmFuc3BvcnRCaXRyZXNlcnZvaXI7Cit9CisKK0lOVCBGREthYWNFbmNfR2V0Qml0UmVzZXJ2b2lyU3RhdGUoY29uc3QgSEFORExFX0FBQ19FTkMgaEFhY0VuY29kZXIpIHsKKyAgcmV0dXJuIEZES2FhY0VuY19FbmNCaXRyZXNUb1RwQml0cmVzKGhBYWNFbmNvZGVyKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjk4LDQwICsyOTIsMzkgQEAKICAgICAgcmV0dXJuczogICAgICAtLS0KIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZES2FhY0VuY19BYWNJbml0RGVmYXVsdENvbmZpZyhBQUNFTkNfQ09ORklHICpjb25maWcpCi17Ci0gICAgLyogbWFrZSB0aGVwcmUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHN0cnVjdHMgZmxleGlibGUgKi8KLSAgICBGREttZW1jbGVhcihjb25maWcsIHNpemVvZihBQUNFTkNfQ09ORklHKSk7Cit2b2lkIEZES2FhY0VuY19BYWNJbml0RGVmYXVsdENvbmZpZyhBQUNFTkNfQ09ORklHICpjb25maWcpIHsKKyAgLyogbWFrZSB0aGUgcHJlaW5pdGlhbGl6YXRpb24gb2YgdGhlIHN0cnVjdHMgZmxleGlibGUgKi8KKyAgRkRLbWVtY2xlYXIoY29uZmlnLCBzaXplb2YoQUFDRU5DX0NPTkZJRykpOwogCi0gICAgLyogZGVmYXVsdCBhbmNpbGxhcnkgKi8KLSAgICBjb25maWctPmFuY19SYXRlID0gMDsgICAgICAgICAvKiBubyBhbmNpbGxhcnkgZGF0YSAqLwotICAgIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGUgPSAwOyAgIC8qIG5vIGFkZGl0aW9uYWwgY29uc3VtZWQgYml0cmF0ZSAqLworICAvKiBkZWZhdWx0IGFuY2lsbGFyeSAqLworICBjb25maWctPmFuY19SYXRlID0gMDsgICAgICAgLyogbm8gYW5jaWxsYXJ5IGRhdGEgKi8KKyAgY29uZmlnLT5hbmNEYXRhQml0UmF0ZSA9IDA7IC8qIG5vIGFkZGl0aW9uYWwgY29uc3VtZWQgYml0cmF0ZSAqLwogCi0gICAgLyogZGVmYXVsdCBjb25maWd1cmF0aW9ucyAqLwotICAgIGNvbmZpZy0+Yml0UmF0ZSAgICAgICAgID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHJhdGUgbXVzdCBiZSBzZXQqLwotICAgIGNvbmZpZy0+YXZlcmFnZUJpdHMgICAgID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIGluc3RlYWQgb2YgYml0cmF0ZS9zIHdlIGNhbiBjb25maWd1cmUgYml0cy9zdXBlcmZyYW1lICovCi0gICAgY29uZmlnLT5iaXRyYXRlTW9kZSAgICAgPSAwOwotICAgIGNvbmZpZy0+YmFuZFdpZHRoICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGdldCBiYW5kd2lkdGggZnJvbSB0YWJsZSAqLwotICAgIGNvbmZpZy0+dXNlVG5zICAgICAgICAgID0gVE5TX0VOQUJMRV9NQVNLOyAgICAgIC8qIHRucyBlbmFibGVkIGNvbXBsZXRseSAqLwotICAgIGNvbmZpZy0+dXNlUG5zICAgICAgICAgID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIGRlcGVuZGluZyBvbiBjaGFubmVsQml0cmF0ZSB0aGlzIG1pZ2h0IGJlIHNldCB0byAwIGxhdGVyICovCi0gICAgY29uZmlnLT51c2VJUyAgICAgICAgICAgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogSW50ZW5zaXR5IFN0ZXJlbyBDb25maWd1cmF0aW9uICovCi0gICAgY29uZmlnLT5mcmFtZWxlbmd0aCAgICAgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogRnJhbWVzaXplIG5vdCBjb25maWd1cmVkICovCi0gICAgY29uZmlnLT5zeW50YXhGbGFncyAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCBzeW50YXggd2l0aCBubyBzcGVjaWFsaXRpZXMgKi8KLSAgICBjb25maWctPmVwQ29uZmlnICAgICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBubyBFUiBzeW50YXggLT4gbm8gYWRkaXRpb25hbCBlcnJvciBwcm90ZWN0aW9uICovCi0gICAgY29uZmlnLT5uU3ViRnJhbWVzICAgICAgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCwgbm8gc3ViIGZyYW1lcyAqLwotICAgIGNvbmZpZy0+Y2hhbm5lbE9yZGVyICAgID0gQ0hfT1JERVJfTVBFRzsgICAgICAgIC8qIFVzZSBNUEVHIGNoYW5uZWwgb3JkZXJpbmcuICovCi0gICAgY29uZmlnLT5jaGFubmVsTW9kZSAgICAgPSBNT0RFX1VOS05PV047Ci0gICAgY29uZmlnLT5taW5CaXRzUGVyRnJhbWUgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogbWludW0gbnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBBVSAqLwotICAgIGNvbmZpZy0+bWF4Qml0c1BlckZyYW1lID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIG1pbnVtIG51bWJlciBvZiBiaXRzIGluIGVhY2ggQVUgKi8KLSAgICBjb25maWctPmJpdHJlc2Vydm9pciAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0LCB1bmluaXRpYWxpemVkIHZhbHVlICovCi0gICAgY29uZmlnLT5hdWRpb011eFZlcnNpb24gPSAtMTsgICAgICAgICAgICAgICAgICAgLyogYXVkaW8gbXV4IHZlcnNpb24gbm90IGNvbmZpZ3VyZWQgKi8KLQotICAgIC8qIGluaXQgdGFicyBpbiBmaXhwb2ludF9tYXRoICovCi0gICAgSW5pdExkSW50KCk7Ci0gICAgSW5pdEludlNxcnRUYWIoKTsKKyAgLyogZGVmYXVsdCBjb25maWd1cmF0aW9ucyAqLworICBjb25maWctPmJpdFJhdGUgPSAtMTsgLyogYml0cmF0ZSBtdXN0IGJlIHNldCovCisgIGNvbmZpZy0+YXZlcmFnZUJpdHMgPQorICAgICAgLTE7IC8qIGluc3RlYWQgb2YgYml0cmF0ZS9zIHdlIGNhbiBjb25maWd1cmUgYml0cy9zdXBlcmZyYW1lICovCisgIGNvbmZpZy0+Yml0cmF0ZU1vZGUgPQorICAgICAgQUFDRU5DX0JSX01PREVfQ0JSOyAgICAgICAgICAgLyogc2V0IGJpdHJhdGUgbW9kZSB0byBjb25zdGFudCBiaXRyYXRlICovCisgIGNvbmZpZy0+YmFuZFdpZHRoID0gMDsgICAgICAgICAgICAvKiBnZXQgYmFuZHdpZHRoIGZyb20gdGFibGUgKi8KKyAgY29uZmlnLT51c2VUbnMgPSBUTlNfRU5BQkxFX01BU0s7IC8qIHRucyBlbmFibGVkIGNvbXBsZXRseSAqLworICBjb25maWctPnVzZVBucyA9CisgICAgICAxOyAvKiBkZXBlbmRpbmcgb24gY2hhbm5lbEJpdHJhdGUgdGhpcyBtaWdodCBiZSBzZXQgdG8gMCBsYXRlciAqLworICBjb25maWctPnVzZUlTID0gMTsgICAgICAgIC8qIEludGVuc2l0eSBTdGVyZW8gQ29uZmlndXJhdGlvbiAqLworICBjb25maWctPnVzZU1TID0gMTsgICAgICAgIC8qIE1TIFN0ZXJlbyB0b29sICovCisgIGNvbmZpZy0+ZnJhbWVsZW5ndGggPSAtMTsgLyogRnJhbWVzaXplIG5vdCBjb25maWd1cmVkICovCisgIGNvbmZpZy0+c3ludGF4RmxhZ3MgPSAwOyAgLyogZGVmYXVsdCBzeW50YXggd2l0aCBubyBzcGVjaWFsaXRpZXMgKi8KKyAgY29uZmlnLT5lcENvbmZpZyA9IC0xOyAgICAvKiBubyBFUiBzeW50YXggLT4gbm8gYWRkaXRpb25hbCBlcnJvciBwcm90ZWN0aW9uICovCisgIGNvbmZpZy0+blN1YkZyYW1lcyA9IDE7ICAgLyogZGVmYXVsdCwgbm8gc3ViIGZyYW1lcyAqLworICBjb25maWctPmNoYW5uZWxPcmRlciA9IENIX09SREVSX01QRUc7IC8qIFVzZSBNUEVHIGNoYW5uZWwgb3JkZXJpbmcuICovCisgIGNvbmZpZy0+Y2hhbm5lbE1vZGUgPSBNT0RFX1VOS05PV047CisgIGNvbmZpZy0+bWluQml0c1BlckZyYW1lID0gLTE7IC8qIG1pbnVtIG51bWJlciBvZiBiaXRzIGluIGVhY2ggQVUgKi8KKyAgY29uZmlnLT5tYXhCaXRzUGVyRnJhbWUgPSAtMTsgLyogbWludW0gbnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBBVSAqLworICBjb25maWctPmF1ZGlvTXV4VmVyc2lvbiA9IC0xOyAvKiBhdWRpbyBtdXggdmVyc2lvbiBub3QgY29uZmlndXJlZCAqLworICBjb25maWctPmRvd25zY2FsZUZhY3RvciA9CisgICAgICAxOyAvKiBkb3duc2NhbGUgZmFjdG9yIGZvciBFTEQgcmVkdWNlZCBkZWxheSBtb2RlLCAxIGlzIG5vcm1hbCBFTEQgKi8KIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfT3BlbgpAQCAtMzM5LDE2ICszMzIsMTMgQEAKICAgICByZXR1cm5zOiAgICAgIGVycm9yIGNvZGUKIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX09wZW4oSEFORExFX0FBQ19FTkMgICpwaEFhY0VuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5TdWJGcmFtZXMpCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfT3BlbihIQU5ETEVfQUFDX0VOQyAqcGhBYWNFbmMsIGNvbnN0IElOVCBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLCBjb25zdCBJTlQgblN1YkZyYW1lcykgewogICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKLSAgQUFDX0VOQyAgICAgICAgICAgKmhBYWNFbmMgPSBOVUxMOwotICBVQ0hBUiAgICAgICAgICAgICAqZHluYW1pY1JBTSA9IE5VTEw7CisgIEFBQ19FTkMgKmhBYWNFbmMgPSBOVUxMOworICBVQ0hBUiAqZHluYW1pY1JBTSA9IE5VTEw7CiAKLSAgaWYgKHBoQWFjRW5jPT1OVUxMKSB7CisgIGlmIChwaEFhY0VuYyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIEFBQ19FTkNfSU5WQUxJRF9IQU5ETEU7CiAgIH0KIApAQCAtMzYwLDgyICszNTAsNjUgQEAKICAgfQogICBGREttZW1jbGVhcihoQWFjRW5jLCBzaXplb2YoQUFDX0VOQykpOwogCi0gIGhBYWNFbmMtPmR5bmFtaWNfUkFNID0gR2V0QUFDZHluYW1pY19SQU0oKTsKLSAgZHluYW1pY1JBTSA9IChVQ0hBUiopaEFhY0VuYy0+ZHluYW1pY19SQU07CisgIGlmIChOVUxMID09IChoQWFjRW5jLT5keW5hbWljX1JBTSA9IEdldEFBQ2R5bmFtaWNfUkFNKCkpKSB7CisgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgZHluYW1pY1JBTSA9IChVQ0hBUiAqKWhBYWNFbmMtPmR5bmFtaWNfUkFNOwogCiAgIC8qIGFsbG9jYXRlIHRoZSBQc3kgYXVkIFBzeSBPdXQgc3RydWN0dXJlICovCi0gICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Qc3lOZXcoJmhBYWNFbmMtPnBzeUtlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgICBnb3RvIGJhaWw7CisgIEVycm9yU3RhdHVzID0KKyAgICAgIEZES2FhY0VuY19Qc3lOZXcoJmhBYWNFbmMtPnBzeUtlcm5lbCwgbkVsZW1lbnRzLCBuQ2hhbm5lbHMsIGR5bmFtaWNSQU0pOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgZ290byBiYWlsOwogCi0gICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Qc3lPdXROZXcoaEFhY0VuYy0+cHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblN1YkZyYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICAgZ290byBiYWlsOworICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Qc3lPdXROZXcoaEFhY0VuYy0+cHN5T3V0LCBuRWxlbWVudHMsIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TdWJGcmFtZXMsIGR5bmFtaWNSQU0pOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgZ290byBiYWlsOwogCiAgIC8qIGFsbG9jYXRlIHRoZSBRJkMgT3V0IHN0cnVjdHVyZSAqLwotICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19RQ091dE5ldyhoQWFjRW5jLT5xY091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TdWJGcmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICBnb3RvIGJhaWw7CisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDT3V0TmV3KGhBYWNFbmMtPnFjT3V0LCBuRWxlbWVudHMsIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblN1YkZyYW1lcywgZHluYW1pY1JBTSk7CisgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSBnb3RvIGJhaWw7CiAKICAgLyogYWxsb2NhdGUgdGhlIFEmQyBrZXJuZWwgKi8KLSAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNOZXcoJmhBYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxkeW5hbWljUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgIGdvdG8gYmFpbDsKKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNOZXcoJmhBYWNFbmMtPnFjS2VybmVsLCBuRWxlbWVudHMsIGR5bmFtaWNSQU0pOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgZ290byBiYWlsOwogCiAgIGhBYWNFbmMtPm1heENoYW5uZWxzID0gbkNoYW5uZWxzOwogICBoQWFjRW5jLT5tYXhFbGVtZW50cyA9IG5FbGVtZW50czsKLSAgaEFhY0VuYy0+bWF4RnJhbWVzICAgPSBuU3ViRnJhbWVzOworICBoQWFjRW5jLT5tYXhGcmFtZXMgPSBuU3ViRnJhbWVzOwogCiBiYWlsOgogICAqcGhBYWNFbmMgPSBoQWFjRW5jOwogICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CiAKLQotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRpYWxpemUoSEFORExFX0FBQ19FTkMgICAgICBoQWFjRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0NPTkZJRyAgICAgICpjb25maWcsICAgICAvKiBwcmUtaW5pdGlhbGl6ZWQgY29uZmlnIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgICAgICAgICAgICAgIGluaXRGbGFncykKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0aWFsaXplKAorICAgIEhBTkRMRV9BQUNfRU5DIGhBYWNFbmMsCisgICAgQUFDRU5DX0NPTkZJRyAqY29uZmlnLCAvKiBwcmUtaW5pdGlhbGl6ZWQgY29uZmlnIHN0cnVjdCAqLworICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBVTE9ORyBpbml0RmxhZ3MpIHsKICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7Ci0gIElOVCBwc3lCaXRyYXRlLCB0bnNNYXNrOyAvL0lOVCBwcm9maWxlID0gMTsKLSAgQ0hBTk5FTF9NQVBQSU5HICAgKmNtID0gTlVMTDsKKyAgSU5UIHBzeUJpdHJhdGUsIHRuc01hc2s7ICAvLyBJTlQgcHJvZmlsZSA9IDE7CisgIENIQU5ORUxfTUFQUElORyAqY20gPSBOVUxMOwogCi0gIElOVCBxbWJmYWMsIHFidzsKKyAgSU5UIG1iZmFjX2UsIHFidzsKICAgRklYUF9EQkwgbWJmYWMsIGJ3X3JhdGlvOwogICBRQ19JTklUIHFjSW5pdDsKICAgSU5UIGF2ZXJhZ2VCaXRzUGVyRnJhbWUgPSAwOworICBpbnQgYml0cmVzTWluID0gMDsgLyogdGhlIGJpdHJlc2Vydm9pciBpcyBhbHdheXMgYmlnIGZvciBBQUMtTEMgKi8KKyAgY29uc3QgQ0hBTk5FTF9NT0RFIHByZXZDaGFubmVsTW9kZSA9IGhBYWNFbmMtPmVuY29kZXJNb2RlOwogCi0gIGlmIChjb25maWc9PU5VTEwpCi0gICAgcmV0dXJuIEFBQ19FTkNfSU5WQUxJRF9IQU5ETEU7CisgIGlmIChjb25maWcgPT0gTlVMTCkgcmV0dXJuIEFBQ19FTkNfSU5WQUxJRF9IQU5ETEU7CiAKICAgLyoqKioqKioqKioqKioqKioqKiogc2FuaXR5IGNoZWNrcyAqKioqKioqKioqKioqKioqKioqLwogCiAgIC8qIGNoZWNrIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgaWYgKGNvbmZpZy0+bkNoYW5uZWxzICA8IDEgfHwgY29uZmlnLT5uQ2hhbm5lbHMgPiAoOCkpIHsKKyAgaWYgKGNvbmZpZy0+bkNoYW5uZWxzIDwgMSB8fCBjb25maWctPm5DaGFubmVscyA+ICg4KSkgewogICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CiAgIH0KIAogICAvKiBjaGVjayBzYW1wbGUgcmF0ZSAqLwotICBzd2l0Y2ggKGNvbmZpZy0+c2FtcGxlUmF0ZSkKLSAgeworICBzd2l0Y2ggKGNvbmZpZy0+c2FtcGxlUmF0ZSkgewogICAgIGNhc2UgODAwMDoKICAgICBjYXNlIDExMDI1OgogICAgIGNhc2UgMTIwMDA6CkBAIC00NTQsNTIgKzQyNyw0NCBAQAogICB9CiAKICAgLyogYml0cmF0ZSBoYXMgdG8gYmUgc2V0ICovCi0gIGlmIChjb25maWctPmJpdFJhdGU9PS0xKSB7Ci0gICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9CSVRSQVRFOworICBpZiAoY29uZmlnLT5iaXRSYXRlID09IC0xKSB7CisgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURTsKICAgfQogCiAgIC8qIGNoZWNrIGJpdCByYXRlICovCiAKICAgaWYgKEZES2FhY0VuY19MaW1pdEJpdHJhdGUoCi0gICAgICAgICAgaFRwRW5jLAotICAgICAgICAgIGNvbmZpZy0+c2FtcGxlUmF0ZSwKLSAgICAgICAgICBjb25maWctPmZyYW1lbGVuZ3RoLAotICAgICAgICAgIGNvbmZpZy0+bkNoYW5uZWxzLAotICAgICAgICAgIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oY29uZmlnLT5jaGFubmVsTW9kZSktPm5DaGFubmVsc0VmZiwKLSAgICAgICAgICBjb25maWctPmJpdFJhdGUsCi0gICAgICAgICAgY29uZmlnLT5hdmVyYWdlQml0cywKLSAgICAgICAgICZhdmVyYWdlQml0c1BlckZyYW1lLAotICAgICAgICAgIGNvbmZpZy0+Yml0cmF0ZU1vZGUsCi0gICAgICAgICAgY29uZmlnLT5uU3ViRnJhbWVzCi0gICAgICAgICAgKSAhPSBjb25maWctPmJpdFJhdGUKLSAgICAgICYmICEoKGNvbmZpZy0+Yml0cmF0ZU1vZGU+PTEpICYmIChjb25maWctPmJpdHJhdGVNb2RlPD01KSkKLSAgICAgKQotICB7CisgICAgICAgICAgaFRwRW5jLCBjb25maWctPmF1ZGlvT2JqZWN0VHlwZSwgY29uZmlnLT5zYW1wbGVSYXRlLAorICAgICAgICAgIGNvbmZpZy0+ZnJhbWVsZW5ndGgsIGNvbmZpZy0+bkNoYW5uZWxzLAorICAgICAgICAgIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oY29uZmlnLT5jaGFubmVsTW9kZSkKKyAgICAgICAgICAgICAgLT5uQ2hhbm5lbHNFZmYsCisgICAgICAgICAgY29uZmlnLT5iaXRSYXRlLCBjb25maWctPmF2ZXJhZ2VCaXRzLCAmYXZlcmFnZUJpdHNQZXJGcmFtZSwKKyAgICAgICAgICBjb25maWctPmJpdHJhdGVNb2RlLCBjb25maWctPm5TdWJGcmFtZXMpICE9IGNvbmZpZy0+Yml0UmF0ZSAmJgorICAgICAgIShBQUNFTkNfQlJfTU9ERV9JU19WQlIoY29uZmlnLT5iaXRyYXRlTW9kZSkpKSB7CiAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURTsKICAgfQogCiAgIGlmIChjb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfVkNCMTEpIHsKLSAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0VSX0ZPUk1BVDsKKyAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQ7CiAgIH0KICAgaWYgKGNvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19FUl9IQ1IpIHsKLSAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0VSX0ZPUk1BVDsKKyAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQ7CiAgIH0KIAogICAvKiBjaGVjayBmcmFtZSBsZW5ndGggKi8KLSAgc3dpdGNoIChjb25maWctPmZyYW1lbGVuZ3RoKQotICB7CisgIHN3aXRjaCAoY29uZmlnLT5mcmFtZWxlbmd0aCkgewogICAgIGNhc2UgMTAyNDoKLSAgICAgIGlmICggY29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRAotICAgICAgICB8fCBjb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCApCi0gICAgICB7CisgICAgICBpZiAoaXNMb3dEZWxheShjb25maWctPmF1ZGlvT2JqZWN0VHlwZSkpIHsKICAgICAgICAgcmV0dXJuIEFBQ19FTkNfSU5WQUxJRF9GUkFNRV9MRU5HVEg7CiAgICAgICB9CiAgICAgICBicmVhazsKKyAgICBjYXNlIDEyODoKKyAgICBjYXNlIDI1NjoKICAgICBjYXNlIDUxMjoKKyAgICBjYXNlIDEyMDoKKyAgICBjYXNlIDI0MDoKICAgICBjYXNlIDQ4MDoKLSAgICAgIGlmICggY29uZmlnLT5hdWRpb09iamVjdFR5cGUgIT0gQU9UX0VSX0FBQ19MRAotICAgICAgICAmJiBjb25maWctPmF1ZGlvT2JqZWN0VHlwZSAhPSBBT1RfRVJfQUFDX0VMRCApCi0gICAgICB7CisgICAgICBpZiAoIWlzTG93RGVsYXkoY29uZmlnLT5hdWRpb09iamVjdFR5cGUpKSB7CiAgICAgICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfRlJBTUVfTEVOR1RIOwogICAgICAgfQogICAgICAgYnJlYWs7CkBAIC01MDgsMTg5ICs0NzMsMjQxIEBACiAgIH0KIAogICBpZiAoY29uZmlnLT5hbmNfUmF0ZSAhPSAwKSB7CisgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdENoZWNrQW5jaWxsYXJ5KAorICAgICAgICBjb25maWctPmJpdFJhdGUsIGNvbmZpZy0+ZnJhbWVsZW5ndGgsIGNvbmZpZy0+YW5jX1JhdGUsCisgICAgICAgICZoQWFjRW5jLT5hbmNpbGxhcnlCaXRzUGVyRnJhbWUsIGNvbmZpZy0+c2FtcGxlUmF0ZSk7CisgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIGdvdG8gYmFpbDsKIAotICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0Q2hlY2tBbmNpbGxhcnkoY29uZmlnLT5iaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mcmFtZWxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YW5jX1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjRW5jLT5hbmNpbGxhcnlCaXRzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZVJhdGUpOwotICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICAgICBnb3RvIGJhaWw7Ci0KLQotICAgICAvKiB1cGRhdGUgZXN0aW1hdGVkIGNvbnN1bWVkIGJpdHJhdGUgKi8KLSAgICAgY29uZmlnLT5hbmNEYXRhQml0UmF0ZSArPSAoIChoQWFjRW5jLT5hbmNpbGxhcnlCaXRzUGVyRnJhbWUgKiBjb25maWctPnNhbXBsZVJhdGUpIC8gY29uZmlnLT5mcmFtZWxlbmd0aCApOwotCisgICAgLyogdXBkYXRlIGVzdGltYXRlZCBjb25zdW1lZCBiaXRyYXRlICovCisgICAgY29uZmlnLT5hbmNEYXRhQml0UmF0ZSArPQorICAgICAgICBGREthYWNFbmNfQ2FsY0JpdHJhdGUoaEFhY0VuYy0+YW5jaWxsYXJ5Qml0c1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mcmFtZWxlbmd0aCwgY29uZmlnLT5zYW1wbGVSYXRlKTsKICAgfQogCiAgIC8qIG1heGltYWwgYWxsb3dlZCBEU0UgYnl0ZXMgaW4gZnJhbWUgKi8KLSAgewotICAvKiBmaXhwb2ludCBjYWxjdWxhdGlvbiovCi0gIElOVCBxX3JlcywgZW5jQml0cmF0ZSwgc2M7Ci0gIEZJWFBfREJMIHRtcCA9IGZEaXZOb3JtKGNvbmZpZy0+ZnJhbWVsZW5ndGgsIGNvbmZpZy0+c2FtcGxlUmF0ZSwgJnFfcmVzKTsKLSAgZW5jQml0cmF0ZSA9IChjb25maWctPmJpdFJhdGUvKi1jb25maWctPmFuY0RhdGFCaXRSYXRlKi8pLSAoSU5UKShjb25maWctPm5DaGFubmVscyo4MDAwKTsKLSAgc2MgPSBDb3VudExlYWRpbmdCaXRzKGVuY0JpdHJhdGUpOwotICBjb25maWctPm1heEFuY0J5dGVzUGVyQVUgPSBGREttaW4oICgyNTYpLCBGREttYXgoMCwoSU5UKShmTXVsdERpdjIodG1wLCAoRklYUF9EQkwpKGVuY0JpdHJhdGU8PHNjKSk+PigtcV9yZXMrc2MtMSszKSkpICk7Ci0gIH0KKyAgY29uZmlnLT5tYXhBbmNCeXRlc1BlckFVID0KKyAgICAgIGZNaW4oKDI1NiksIGZNYXgoMCwgRkRLYWFjRW5jX0NhbGNCaXRzUGVyRnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5iaXRSYXRlIC0gKGNvbmZpZy0+bkNoYW5uZWxzICogODAwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mcmFtZWxlbmd0aCwgY29uZmlnLT5zYW1wbGVSYXRlKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMykpOwogCiAgIC8qIGJpbmQgY29uZmlnIHRvIGhBYWNFbmMtPmNvbmZpZyAqLwogICBoQWFjRW5jLT5jb25maWcgPSBjb25maWc7CiAKICAgLyogc2V0IGhBYWNFbmMtPmJpdHJhdGVNb2RlICovCi0gIGhBYWNFbmMtPmJpdHJhdGVNb2RlID0gKEFBQ0VOQ19CSVRSQVRFX01PREUpY29uZmlnLT5iaXRyYXRlTW9kZTsKKyAgaEFhY0VuYy0+Yml0cmF0ZU1vZGUgPSBjb25maWctPmJpdHJhdGVNb2RlOwogCiAgIGhBYWNFbmMtPmVuY29kZXJNb2RlID0gY29uZmlnLT5jaGFubmVsTW9kZTsKIAotICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoaEFhY0VuYy0+ZW5jb2Rlck1vZGUsIGNvbmZpZy0+Y2hhbm5lbE9yZGVyLCAmaEFhY0VuYy0+Y2hhbm5lbE1hcHBpbmcpOwotICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICBnb3RvIGJhaWw7CisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRDaGFubmVsTWFwcGluZygKKyAgICAgIGhBYWNFbmMtPmVuY29kZXJNb2RlLCBjb25maWctPmNoYW5uZWxPcmRlciwgJmhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIGdvdG8gYmFpbDsKIAogICBjbSA9ICZoQWFjRW5jLT5jaGFubmVsTWFwcGluZzsKIAotICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19EZXRlcm1pbmVCYW5kV2lkdGgoJmhBYWNFbmMtPmNvbmZpZy0+YmFuZFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5iYW5kV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmJpdFJhdGUgLSBjb25maWctPmFuY0RhdGFCaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Yml0cmF0ZU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZyYW1lbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5lbmNvZGVyTW9kZSk7Ci0gIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgIGdvdG8gYmFpbDsKKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfRGV0ZXJtaW5lQmFuZFdpZHRoKAorICAgICAgY29uZmlnLT5iYW5kV2lkdGgsIGNvbmZpZy0+Yml0UmF0ZSAtIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGUsCisgICAgICBoQWFjRW5jLT5iaXRyYXRlTW9kZSwgY29uZmlnLT5zYW1wbGVSYXRlLCBjb25maWctPmZyYW1lbGVuZ3RoLCBjbSwKKyAgICAgIGhBYWNFbmMtPmVuY29kZXJNb2RlLCAmaEFhY0VuYy0+Y29uZmlnLT5iYW5kV2lkdGgpOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgZ290byBiYWlsOwogCiAgIGhBYWNFbmMtPmJhbmR3aWR0aDkwZEIgPSAoSU5UKWhBYWNFbmMtPmNvbmZpZy0+YmFuZFdpZHRoOwogCiAgIHRuc01hc2sgPSBjb25maWctPnVzZVRucyA/IFROU19FTkFCTEVfTUFTSyA6IDB4MDsKICAgcHN5Qml0cmF0ZSA9IGNvbmZpZy0+Yml0UmF0ZSAtIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGU7CiAKLSAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfcHN5SW5pdChoQWFjRW5jLT5wc3lLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPm1heEZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5tYXhDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmF1ZGlvT2JqZWN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSk7Ci0gIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgIGdvdG8gYmFpbDsKKyAgaWYgKChoQWFjRW5jLT5lbmNvZGVyTW9kZSAhPSBwcmV2Q2hhbm5lbE1vZGUpIHx8IChpbml0RmxhZ3MgIT0gMCkpIHsKKyAgICAvKiBSZWluaXRpYWxpemUgcHN5Y2ggc3RhdGVzIGluIGNhc2Ugb2YgY2hhbm5lbCBjb25maWd1cmF0aW9uIGNoYW5nZSBvcmUgaWYKKyAgICAgKiBmdWxsIHJlc2V0IHJlcXVlc3RlZC4gKi8KKyAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19wc3lJbml0KGhBYWNFbmMtPnBzeUtlcm5lbCwgaEFhY0VuYy0+cHN5T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+bWF4RnJhbWVzLCBoQWFjRW5jLT5tYXhDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlLCBjbSk7CisgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIGdvdG8gYmFpbDsKKyAgfQogCi0gIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX3BzeU1haW5Jbml0KGhBYWNFbmMtPnBzeUtlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5hdWRpb09iamVjdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+ZnJhbWVsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmJhbmR3aWR0aDkwZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXNlUG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnVzZUlTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmxhZ3MpOwotICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICBnb3RvIGJhaWw7CisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX3BzeU1haW5Jbml0KAorICAgICAgaEFhY0VuYy0+cHN5S2VybmVsLCBjb25maWctPmF1ZGlvT2JqZWN0VHlwZSwgY20sIGNvbmZpZy0+c2FtcGxlUmF0ZSwKKyAgICAgIGNvbmZpZy0+ZnJhbWVsZW5ndGgsIHBzeUJpdHJhdGUsIHRuc01hc2ssIGhBYWNFbmMtPmJhbmR3aWR0aDkwZEIsCisgICAgICBjb25maWctPnVzZVBucywgY29uZmlnLT51c2VJUywgY29uZmlnLT51c2VNUywgY29uZmlnLT5zeW50YXhGbGFncywKKyAgICAgIGluaXRGbGFncyk7CisgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSBnb3RvIGJhaWw7CiAKICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNPdXRJbml0KGhBYWNFbmMtPnFjT3V0LCBoQWFjRW5jLT5tYXhGcmFtZXMsIGNtKTsKLSAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgZ290byBiYWlsOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgZ290byBiYWlsOwogCisgIHFjSW5pdC5jaGFubmVsTWFwcGluZyA9ICZoQWFjRW5jLT5jaGFubmVsTWFwcGluZzsKKyAgcWNJbml0LnNjZUNwZSA9IDA7CiAKKyAgaWYgKEFBQ0VOQ19CUl9NT0RFX0lTX1ZCUihjb25maWctPmJpdHJhdGVNb2RlKSkgeworICAgIHFjSW5pdC5hdmVyYWdlQml0cyA9IChhdmVyYWdlQml0c1BlckZyYW1lICsgNykgJiB+NzsKKyAgICBxY0luaXQuYml0UmVzID0gTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOICogY20tPm5DaGFubmVsc0VmZjsKKyAgICBxY0luaXQubWF4Qml0cyA9IE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTiAqIGNtLT5uQ2hhbm5lbHNFZmY7CisgICAgcWNJbml0Lm1heEJpdHMgPSAoY29uZmlnLT5tYXhCaXRzUGVyRnJhbWUgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaXhNaW4ocWNJbml0Lm1heEJpdHMsIGNvbmZpZy0+bWF4Qml0c1BlckZyYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogcWNJbml0Lm1heEJpdHM7CisgICAgcWNJbml0Lm1heEJpdHMgPSBmaXhNYXgocWNJbml0Lm1heEJpdHMsIChhdmVyYWdlQml0c1BlckZyYW1lICsgNykgJiB+Nyk7CisgICAgcWNJbml0Lm1pbkJpdHMgPQorICAgICAgICAoY29uZmlnLT5taW5CaXRzUGVyRnJhbWUgIT0gLTEpID8gY29uZmlnLT5taW5CaXRzUGVyRnJhbWUgOiAwOworICAgIHFjSW5pdC5taW5CaXRzID0gZml4TWluKHFjSW5pdC5taW5CaXRzLCBhdmVyYWdlQml0c1BlckZyYW1lICYgfjcpOworICB9IGVsc2UgeworICAgIElOVCBiaXRyZXNlcnZvaXIgPSAtMTsgLyogZGVmYXVsdCBiaXRyc2Vydm9pciBzaXplKi8KKyAgICBpZiAoaXNMb3dEZWxheShjb25maWctPmF1ZGlvT2JqZWN0VHlwZSkpIHsKKyAgICAgIElOVCBiclBlckNoYW5uZWwgPSBjb25maWctPmJpdFJhdGUgLyBjb25maWctPm5DaGFubmVsczsKKyAgICAgIGJyUGVyQ2hhbm5lbCA9IGZNaW4oQklUUkFURV9NQVhfTEQsIGZNYXgoQklUUkFURV9NSU5fTEQsIGJyUGVyQ2hhbm5lbCkpOwogCi0gIHFjSW5pdC5jaGFubmVsTWFwcGluZyAgICAgID0gJmhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nOwotICBxY0luaXQuc2NlQ3BlICAgICAgICAgICAgICA9IDA7CisgICAgICAvKiBiaXRyZXNlcnZvaXIgID0KKyAgICAgICAqIChtYXhCaXRSZXMtbWluQml0UmVzKS8obWF4Qml0UmF0ZS1taW5CaXRyYXRlKSooYml0UmF0ZS1taW5CaXRyYXRlKSttaW5CaXRSZXM7CisgICAgICAgKi8KKyAgICAgIEZJWFBfREJMIHNsb3BlID0gZkRpdk5vcm0oCisgICAgICAgICAgKGJyUGVyQ2hhbm5lbCAtIEJJVFJBVEVfTUlOX0xEKSwKKyAgICAgICAgICBCSVRSQVRFX01BWF9MRCAtIEJJVFJBVEVfTUlOX0xEKTsgLyogY2FsYyBzbG9wZSBmb3IgaW50ZXJwb2xhdGlvbiAqLworICAgICAgYml0cmVzZXJ2b2lyID0gZk11bHRJKHNsb3BlLCAoSU5UKShCSVRSRVNfTUFYX0xEIC0gQklUUkVTX01JTl9MRCkpICsKKyAgICAgICAgICAgICAgICAgICAgIEJJVFJFU19NSU5fTEQ7ICAgICAvKiBpbnRlcnBvbGF0ZSAqLworICAgICAgYml0cmVzZXJ2b2lyID0gYml0cmVzZXJ2b2lyICYgfjc7IC8qIGFsaWduIHRvIGJ5dGVzICovCisgICAgICBiaXRyZXNNaW4gPSBCSVRSRVNfTUlOX0xEOworICAgIH0KIAotICBpZiAoKGNvbmZpZy0+Yml0cmF0ZU1vZGU+PTEpICYmIChjb25maWctPmJpdHJhdGVNb2RlPD01KSkgewotICAgICAgcWNJbml0LmF2ZXJhZ2VCaXRzICAgICA9IChhdmVyYWdlQml0c1BlckZyYW1lKzcpJn43OwotICAgICAgcWNJbml0LmJpdFJlcyAgICAgICAgICA9IE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTipjbS0+bkNoYW5uZWxzRWZmOwotICAgICAgcWNJbml0Lm1heEJpdHMgICAgICAgICA9IE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTipjbS0+bkNoYW5uZWxzRWZmOwotICAgICAgcWNJbml0Lm1heEJpdHMgICAgICAgICA9IChjb25maWctPm1heEJpdHNQZXJGcmFtZSE9LTEpID8gZml4TWluKHFjSW5pdC5tYXhCaXRzLCBjb25maWctPm1heEJpdHNQZXJGcmFtZSkgOiBxY0luaXQubWF4Qml0czsKLSAgICAgIHFjSW5pdC5tYXhCaXRzICAgICAgICAgPSBmaXhNYXgocWNJbml0Lm1heEJpdHMsIChhdmVyYWdlQml0c1BlckZyYW1lKzcpJn43KTsKLSAgICAgIHFjSW5pdC5taW5CaXRzICAgICAgICAgPSAoY29uZmlnLT5taW5CaXRzUGVyRnJhbWUhPS0xKSA/IGNvbmZpZy0+bWluQml0c1BlckZyYW1lIDogMDsKLSAgICAgIHFjSW5pdC5taW5CaXRzICAgICAgICAgPSBmaXhNaW4ocWNJbml0Lm1pbkJpdHMsIGF2ZXJhZ2VCaXRzUGVyRnJhbWUmfjcpOwotICB9Ci0gIGVsc2UKLSAgewotICAgICAgaW50IG1heEJpdHJlczsKLSAgICAgIHFjSW5pdC5hdmVyYWdlQml0cyAgICAgPSAoYXZlcmFnZUJpdHNQZXJGcmFtZSs3KSZ+NzsKLSAgICAgIG1heEJpdHJlcyAgICAgICAgICAgICAgPSAoTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOKmNtLT5uQ2hhbm5lbHNFZmYpIC0gcWNJbml0LmF2ZXJhZ2VCaXRzOwotICAgICAgcWNJbml0LmJpdFJlcyAgICAgICAgICA9IChjb25maWctPmJpdHJlc2Vydm9pciE9LTEpID8gRkRLbWluKGNvbmZpZy0+Yml0cmVzZXJ2b2lyLCBtYXhCaXRyZXMpIDogbWF4Qml0cmVzOworICAgIGludCBtYXhCaXRyZXM7CisgICAgcWNJbml0LmF2ZXJhZ2VCaXRzID0gKGF2ZXJhZ2VCaXRzUGVyRnJhbWUgKyA3KSAmIH43OworICAgIG1heEJpdHJlcyA9CisgICAgICAgIChNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4gKiBjbS0+bkNoYW5uZWxzRWZmKSAtIHFjSW5pdC5hdmVyYWdlQml0czsKKyAgICBxY0luaXQuYml0UmVzID0KKyAgICAgICAgKGJpdHJlc2Vydm9pciAhPSAtMSkgPyBmTWluKGJpdHJlc2Vydm9pciwgbWF4Qml0cmVzKSA6IG1heEJpdHJlczsKIAotICAgICAgcWNJbml0Lm1heEJpdHMgICAgICAgICA9IGZpeE1pbihNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4qY20tPm5DaGFubmVsc0VmZiwgKChhdmVyYWdlQml0c1BlckZyYW1lKzcpJn43KStxY0luaXQuYml0UmVzKTsKLSAgICAgIHFjSW5pdC5tYXhCaXRzICAgICAgICAgPSAoY29uZmlnLT5tYXhCaXRzUGVyRnJhbWUhPS0xKSA/IGZpeE1pbihxY0luaXQubWF4Qml0cywgY29uZmlnLT5tYXhCaXRzUGVyRnJhbWUpIDogcWNJbml0Lm1heEJpdHM7Ci0gICAgICBxY0luaXQubWF4Qml0cyAgICAgICAgID0gZml4TWluKE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTipjbS0+bkNoYW5uZWxzRWZmLCBmaXhNYXgocWNJbml0Lm1heEJpdHMsIChhdmVyYWdlQml0c1BlckZyYW1lKzcrOCkmfjcpKTsKKyAgICBxY0luaXQubWF4Qml0cyA9IGZpeE1pbihNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4gKiBjbS0+bkNoYW5uZWxzRWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYXZlcmFnZUJpdHNQZXJGcmFtZSArIDcpICYgfjcpICsgcWNJbml0LmJpdFJlcyk7CisgICAgcWNJbml0Lm1heEJpdHMgPSAoY29uZmlnLT5tYXhCaXRzUGVyRnJhbWUgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaXhNaW4ocWNJbml0Lm1heEJpdHMsIGNvbmZpZy0+bWF4Qml0c1BlckZyYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogcWNJbml0Lm1heEJpdHM7CisgICAgcWNJbml0Lm1heEJpdHMgPQorICAgICAgICBmaXhNaW4oTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOICogY20tPm5DaGFubmVsc0VmZiwKKyAgICAgICAgICAgICAgIGZpeE1heChxY0luaXQubWF4Qml0cywgKGF2ZXJhZ2VCaXRzUGVyRnJhbWUgKyA3ICsgOCkgJiB+NykpOwogCi0gICAgICBxY0luaXQubWluQml0cyAgICAgICAgID0gZml4TWF4KDAsICgoYXZlcmFnZUJpdHNQZXJGcmFtZS0xKSZ+NyktcWNJbml0LmJpdFJlcy10cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsICgoYXZlcmFnZUJpdHNQZXJGcmFtZSs3KSZ+NykrcWNJbml0LmJpdFJlcykpOwotICAgICAgcWNJbml0Lm1pbkJpdHMgICAgICAgICA9IChjb25maWctPm1pbkJpdHNQZXJGcmFtZSE9LTEpID8gZml4TWF4KHFjSW5pdC5taW5CaXRzLCBjb25maWctPm1pbkJpdHNQZXJGcmFtZSkgOiBxY0luaXQubWluQml0czsKLSAgICAgIHFjSW5pdC5taW5CaXRzICAgICAgICAgPSBmaXhNaW4ocWNJbml0Lm1pbkJpdHMsIChhdmVyYWdlQml0c1BlckZyYW1lIC0gdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoaFRwRW5jLCBxY0luaXQubWF4Qml0cykpJn43KTsKKyAgICBxY0luaXQubWluQml0cyA9IGZpeE1heCgKKyAgICAgICAgMCwgKChhdmVyYWdlQml0c1BlckZyYW1lIC0gMSkgJiB+NykgLSBxY0luaXQuYml0UmVzIC0KKyAgICAgICAgICAgICAgIHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKAorICAgICAgICAgICAgICAgICAgIGhUcEVuYywgKChhdmVyYWdlQml0c1BlckZyYW1lICsgNykgJiB+NykgKyBxY0luaXQuYml0UmVzKSk7CisgICAgcWNJbml0Lm1pbkJpdHMgPSAoY29uZmlnLT5taW5CaXRzUGVyRnJhbWUgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaXhNYXgocWNJbml0Lm1pbkJpdHMsIGNvbmZpZy0+bWluQml0c1BlckZyYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogcWNJbml0Lm1pbkJpdHM7CisgICAgcWNJbml0Lm1pbkJpdHMgPSBmaXhNaW4oCisgICAgICAgIHFjSW5pdC5taW5CaXRzLCAoYXZlcmFnZUJpdHNQZXJGcmFtZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoaFRwRW5jLCBxY0luaXQubWF4Qml0cykpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB+Nyk7CiAgIH0KIAotICBxY0luaXQuc2FtcGxlUmF0ZSAgICAgICAgICA9IGNvbmZpZy0+c2FtcGxlUmF0ZTsKLSAgcWNJbml0LmFkdmFuY2VkQml0c1RvUGUgICAgPSBpc0xvd0RlbGF5KGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSA/IDEgOiAwIDsKLSAgcWNJbml0Lm5TdWJGcmFtZXMgICAgICAgICAgPSBjb25maWctPm5TdWJGcmFtZXM7CisgIHFjSW5pdC5zYW1wbGVSYXRlID0gY29uZmlnLT5zYW1wbGVSYXRlOworICBxY0luaXQuaXNMb3dEZWxheSA9IGlzTG93RGVsYXkoY29uZmlnLT5hdWRpb09iamVjdFR5cGUpID8gMSA6IDA7CisgIHFjSW5pdC5uU3ViRnJhbWVzID0gY29uZmlnLT5uU3ViRnJhbWVzOwogICBxY0luaXQucGFkZGluZy5wYWRkaW5nUmVzdCA9IGNvbmZpZy0+c2FtcGxlUmF0ZTsKIAotICAvKiBDYWxjIG1lYW5QZTogcWNJbml0Lm1lYW5QZSA9IDEwLjBmICogRlJBTUVfTEVOX0xPTkcgKiBoQWFjRW5jLT5iYW5kd2lkdGg5MGRCLyhjb25maWctPnNhbXBsZVJhdGUvMi4wZik7ICovCi0gIGJ3X3JhdGlvID0gZkRpdk5vcm0oKEZJWFBfREJMKSgxMCpjb25maWctPmZyYW1lbGVuZ3RoKmhBYWNFbmMtPmJhbmR3aWR0aDkwZEIpLCAoRklYUF9EQkwpKGNvbmZpZy0+c2FtcGxlUmF0ZSksICZxYncpOwotICBxY0luaXQubWVhblBlID0gRkRLbWF4KChJTlQpc2NhbGVWYWx1ZShid19yYXRpbywgcWJ3KzEtKERGUkFDVF9CSVRTLTEpKSwgMSk7Ci0KLSAgLyogQ2FsYyBtYXhCaXRGYWMgKi8KLSAgbWJmYWMgPSBmRGl2Tm9ybSgoTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOLTc0NCkqY20tPm5DaGFubmVsc0VmZiwgcWNJbml0LmF2ZXJhZ2VCaXRzL3FjSW5pdC5uU3ViRnJhbWVzLCAmcW1iZmFjKTsKLSAgcW1iZmFjID0gREZSQUNUX0JJVFMtMS1xbWJmYWM7Ci0gIHFjSW5pdC5tYXhCaXRGYWMgPSAocW1iZmFjID4gMjQpID8gKG1iZmFjID4+IChxbWJmYWMgLSAyNCkpOihtYmZhYyA8PCAoMjQgLSBxbWJmYWMpKTsKLQotICBzd2l0Y2goY29uZmlnLT5iaXRyYXRlTW9kZSl7Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfQ0JSOgotICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX0NCUjsKLSAgICBicmVhazsKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKLSAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfMTsKLSAgICBicmVhazsKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKLSAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfMjsKLSAgICBicmVhazsKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKLSAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfMzsKLSAgICBicmVhazsKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKLSAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfNDsKLSAgICBicmVhazsKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKLSAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfNTsKLSAgICBicmVhazsKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9TRlI6Ci0gICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfU0ZSOwotICAgIGJyZWFrOwotICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0ZGOgotICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX0ZGOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19VTlNVUFBPUlRFRF9CSVRSQVRFX01PREU7Ci0gICAgZ290byBiYWlsOworICBpZiAocWNJbml0LmJpdFJlcyA+PSBiaXRyZXNNaW4gKiBjb25maWctPm5DaGFubmVscykgeworICAgIHFjSW5pdC5iaXRSZXNNb2RlID0gQUFDRU5DX0JSX01PREVfRlVMTDsgLyogZnVsbCBiaXRyZXNlcnZvaXIgKi8KKyAgfSBlbHNlIGlmIChxY0luaXQuYml0UmVzID4gMCkgeworICAgIHFjSW5pdC5iaXRSZXNNb2RlID0gQUFDRU5DX0JSX01PREVfUkVEVUNFRDsgLyogcmVkdWNlZCBiaXRyZXNlcnZvaXIgKi8KKyAgfSBlbHNlIHsKKyAgICBxY0luaXQuYml0UmVzTW9kZSA9IEFBQ0VOQ19CUl9NT0RFX0RJU0FCTEVEOyAvKiBkaXNhYmxlZCBiaXRyZXNlcnZvaXIgKi8KICAgfQogCi0gIHFjSW5pdC5pbnZRdWFudCA9IChjb25maWctPnVzZVJlcXVhbnQpPzI6MDsKKyAgLyogQ29uZmlndXJlIGJpdHJhdGUgZGlzdHJpYnV0aW9uIHN0cmF0ZWd5LiAqLworICBzd2l0Y2ggKGNvbmZpZy0+Y2hhbm5lbE1vZGUpIHsKKyAgICBjYXNlIE1PREVfMV8yOgorICAgIGNhc2UgTU9ERV8xXzJfMToKKyAgICBjYXNlIE1PREVfMV8yXzI6CisgICAgY2FzZSBNT0RFXzFfMl8yXzE6CisgICAgY2FzZSBNT0RFXzZfMToKKyAgICBjYXNlIE1PREVfMV8yXzJfMl8xOgorICAgIGNhc2UgTU9ERV83XzFfQkFDSzoKKyAgICBjYXNlIE1PREVfN18xX1RPUF9GUk9OVDoKKyAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgICBxY0luaXQuYml0RGlzdHJpYnV0aW9uTW9kZSA9IDA7IC8qIG92ZXIgYWxsIGVsZW1lbnRzIGJpdHJhdGUgZXN0aW1hdGlvbiAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzE6CisgICAgY2FzZSBNT0RFXzI6CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbCBub24gbXBlZyBkZWZpbmVkIGNoYW5uZWwgbW9kZXMgKi8KKyAgICAgIHFjSW5pdC5iaXREaXN0cmlidXRpb25Nb2RlID0gMTsgLyogZWxlbWVudC13aXNlIGJpdCBiaXRyYXRlIGVzdGltYXRpb24gKi8KKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uZmlnLT5jaGFubmVsTW9kZSAqLwogCi0gIC8qIG1heEl0ZXJhdGlvbnMgc2hvdWxkIGJlIHNldCB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVxdWFudGl6YXRpb24gaXRlcmF0aW9ucyB0aGF0IGFyZQotICAgKiBhbGxvd2VkIGJlZm9yZSB0aGUgY3Jhc2ggcmVjb3ZlcnkgZnVuY3Rpb25hbGl0eSBpcyBhY3RpdmF0ZWQuIFRoaXMgc2V0dGluZyBzaG91bGQgYmUgYWRqdXN0ZWQKLSAgICogdG8gdGhlIHByb2Nlc3NpbmcgcG93ZXIgYXZhaWxhYmxlLCBpLmUuIHRvIHRoZSBwcm9jZXNzaW5nIHBvd2VyIGhlYWRyb29tIGluIG9uZSBmcmFtZSB0aGF0IGlzCi0gICAqIHN0aWxsIGxlZnQgYWZ0ZXIgbm9ybWFsIGVuY29kaW5nIHdpdGhvdXQgcmVxdWFudGl6YXRpb24uIFBsZWFzZSBub3RlIHRoYXQgaWYgYWN0aXZhdGVkIHRoaXMKLSAgICogZnVuY3Rpb25hbGl0eSBpcyB1c2VkIG1vc3QgbGlrZWx5IG9ubHkgaW4gY2FzZXMgd2hlcmUgdGhlIGVuY29kZXIgaXMgb3BlcmF0aW5nIGJleW9uZAotICAgKiByZWNvbW1lbmRlZCBzZXR0aW5ncywgaS5lLiB0aGUgYXVkaW8gcXVhbGl0eSBpcyBzdWJvcHRpbWFsIGFueXdheS4gQWN0aXZhdGluZyB0aGUgY3Jhc2gKLSAgICogcmVjb3ZlcnkgZG9lcyBub3QgZnVydGhlciByZWR1Y2UgYXVkaW8gcXVhbGl0eSBzaWduaWZpY2FudGx5IGluIHRoZXNlIGNhc2VzLiAqLwotICBpZiAoIChjb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0xEKSB8fCAoY29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQpICkgeworICAvKiBDYWxjIG1lYW5QZTogcWNJbml0Lm1lYW5QZSA9IDEwLjBmICogRlJBTUVfTEVOX0xPTkcgKgorICAgKiBoQWFjRW5jLT5iYW5kd2lkdGg5MGRCLyhjb25maWctPnNhbXBsZVJhdGUvMi4wZik7ICovCisgIGJ3X3JhdGlvID0KKyAgICAgIGZEaXZOb3JtKChGSVhQX0RCTCkoMTAgKiBjb25maWctPmZyYW1lbGVuZ3RoICogaEFhY0VuYy0+YmFuZHdpZHRoOTBkQiksCisgICAgICAgICAgICAgICAoRklYUF9EQkwpKGNvbmZpZy0+c2FtcGxlUmF0ZSksICZxYncpOworICBxY0luaXQubWVhblBlID0KKyAgICAgIGZNYXgoKElOVClzY2FsZVZhbHVlKGJ3X3JhdGlvLCBxYncgKyAxIC0gKERGUkFDVF9CSVRTIC0gMSkpLCAxKTsKKworICAvKiBDYWxjIG1heEJpdEZhYywgc2NhbGUgaXQgdG8gMjQgYml0IGFjY3VyYWN5ICovCisgIG1iZmFjID0gZkRpdk5vcm0ocWNJbml0Lm1heEJpdHMsIHFjSW5pdC5hdmVyYWdlQml0cyAvIHFjSW5pdC5uU3ViRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICZtYmZhY19lKTsKKyAgcWNJbml0Lm1heEJpdEZhYyA9IHNjYWxlVmFsdWUobWJmYWMsIC0oREZSQUNUX0JJVFMgLSAxIC0gMjQgLSBtYmZhY19lKSk7CisKKyAgc3dpdGNoIChjb25maWctPmJpdHJhdGVNb2RlKSB7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6CisgICAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9DQlI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8xOgorICAgICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfVkJSXzE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8yOgorICAgICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfVkJSXzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zOgorICAgICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfVkJSXzM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl80OgorICAgICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfVkJSXzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl81OgorICAgICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfVkJSXzU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1NGUjoKKyAgICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1NGUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfRkY6CisgICAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9GRjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURV9NT0RFOworICAgICAgZ290byBiYWlsOworICB9CisKKyAgcWNJbml0LmludlF1YW50ID0gKGNvbmZpZy0+dXNlUmVxdWFudCkgPyAyIDogMDsKKworICAvKiBtYXhJdGVyYXRpb25zIHNob3VsZCBiZSBzZXQgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcXVhbnRpemF0aW9uCisgICAqIGl0ZXJhdGlvbnMgdGhhdCBhcmUgYWxsb3dlZCBiZWZvcmUgdGhlIGNyYXNoIHJlY292ZXJ5IGZ1bmN0aW9uYWxpdHkgaXMKKyAgICogYWN0aXZhdGVkLiBUaGlzIHNldHRpbmcgc2hvdWxkIGJlIGFkanVzdGVkIHRvIHRoZSBwcm9jZXNzaW5nIHBvd2VyCisgICAqIGF2YWlsYWJsZSwgaS5lLiB0byB0aGUgcHJvY2Vzc2luZyBwb3dlciBoZWFkcm9vbSBpbiBvbmUgZnJhbWUgdGhhdCBpcyBzdGlsbAorICAgKiBsZWZ0IGFmdGVyIG5vcm1hbCBlbmNvZGluZyB3aXRob3V0IHJlcXVhbnRpemF0aW9uLiBQbGVhc2Ugbm90ZSB0aGF0IGlmCisgICAqIGFjdGl2YXRlZCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgdXNlZCBtb3N0IGxpa2VseSBvbmx5IGluIGNhc2VzIHdoZXJlIHRoZQorICAgKiBlbmNvZGVyIGlzIG9wZXJhdGluZyBiZXlvbmQgcmVjb21tZW5kZWQgc2V0dGluZ3MsIGkuZS4gdGhlIGF1ZGlvIHF1YWxpdHkgaXMKKyAgICogc3Vib3B0aW1hbCBhbnl3YXkuIEFjdGl2YXRpbmcgdGhlIGNyYXNoIHJlY292ZXJ5IGRvZXMgbm90IGZ1cnRoZXIgcmVkdWNlCisgICAqIGF1ZGlvIHF1YWxpdHkgc2lnbmlmaWNhbnRseSBpbiB0aGVzZSBjYXNlcy4gKi8KKyAgaWYgKGlzTG93RGVsYXkoY29uZmlnLT5hdWRpb09iamVjdFR5cGUpKSB7CiAgICAgcWNJbml0Lm1heEl0ZXJhdGlvbnMgPSAyOwotICB9Ci0gIGVsc2UKLSAgeworICB9IGVsc2UgewogICAgIHFjSW5pdC5tYXhJdGVyYXRpb25zID0gNTsKICAgfQogCiAgIHFjSW5pdC5iaXRyYXRlID0gY29uZmlnLT5iaXRSYXRlIC0gY29uZmlnLT5hbmNEYXRhQml0UmF0ZTsKIAotICBxY0luaXQuc3RhdGljQml0cyA9IHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgcWNJbml0LmF2ZXJhZ2VCaXRzL3FjSW5pdC5uU3ViRnJhbWVzKTsKKyAgcWNJbml0LnN0YXRpY0JpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cygKKyAgICAgIGhUcEVuYywgcWNJbml0LmF2ZXJhZ2VCaXRzIC8gcWNJbml0Lm5TdWJGcmFtZXMpOwogCi0gIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDSW5pdChoQWFjRW5jLT5xY0tlcm5lbCwgJnFjSW5pdCk7Ci0gIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgIGdvdG8gYmFpbDsKKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNJbml0KGhBYWNFbmMtPnFjS2VybmVsLCAmcWNJbml0LCBpbml0RmxhZ3MpOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgZ290byBiYWlsOwogCi0gIGhBYWNFbmMtPmFvdCA9IGhBYWNFbmMtPmNvbmZpZy0+YXVkaW9PYmplY3RUeXBlOworICAvKiBNYXAgdmlydHVhbCBhb3QncyB0byBpbnRlcm4gYW90IHVzZWQgaW4gYml0c3RyZWFtIHdyaXRlci4gKi8KKyAgc3dpdGNoIChoQWFjRW5jLT5jb25maWctPmF1ZGlvT2JqZWN0VHlwZSkgeworICAgIGNhc2UgQU9UX01QMl9BQUNfTEM6CisgICAgICBoQWFjRW5jLT5hb3QgPSBBT1RfQUFDX0xDOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBT1RfTVAyX1NCUjoKKyAgICAgIGhBYWNFbmMtPmFvdCA9IEFPVF9TQlI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaEFhY0VuYy0+YW90ID0gaEFhY0VuYy0+Y29uZmlnLT5hdWRpb09iamVjdFR5cGU7CisgIH0KIAogICAvKiBjb21tb24gdGhpbmdzICovCiAKQEAgLTcwMSw3ICs3MTgsNiBAQAogICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0VuY29kZUZyYW1lCkBAIC03MDksMjc3ICs3MjUsMjM1IEBACiAgICAgcmV0dXJuczogICAgICBlcnJvciBjb2RlCiAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19FbmNvZGVGcmFtZSggSEFORExFX0FBQ19FTkMgICAgICAgaEFhY0VuYywgICAgICAgICAgLyogZW5jb2RlciBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNKiBSRVNUUklDVCAgICBpbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiAgICAgICAgICAgICAgICAgbk91dEJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfRVhUX1BBWUxPQUQgICBleHRQYXlsb2FkW01BWF9UT1RBTF9FWFRfUEFZTE9BRFNdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7Ci0gICAgaW50ICAgIGVsLCBuLCBjPTA7Ci0gICAgVUNIQVIgIGV4dFBheWxvYWRVc2VkW01BWF9UT1RBTF9FWFRfUEFZTE9BRFNdOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0VuY29kZUZyYW1lKAorICAgIEhBTkRMRV9BQUNfRU5DIGhBYWNFbmMsIC8qIGVuY29kZXIgaGFuZGxlICovCisgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsIElOVF9QQ00gKlJFU1RSSUNUIGlucHV0QnVmZmVyLAorICAgIGNvbnN0IFVJTlQgaW5wdXRCdWZmZXJCdWZTaXplLCBJTlQgKm5PdXRCeXRlcywKKyAgICBBQUNFTkNfRVhUX1BBWUxPQUQgZXh0UGF5bG9hZFtNQVhfVE9UQUxfRVhUX1BBWUxPQURTXSkgeworICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKKyAgaW50IGVsLCBuLCBjID0gMDsKKyAgVUNIQVIgZXh0UGF5bG9hZFVzZWRbTUFYX1RPVEFMX0VYVF9QQVlMT0FEU107CiAKLSAgICBDSEFOTkVMX01BUFBJTkcgKmNtICAgICAgPSAmaEFhY0VuYy0+Y2hhbm5lbE1hcHBpbmc7CisgIENIQU5ORUxfTUFQUElORyAqY20gPSAmaEFhY0VuYy0+Y2hhbm5lbE1hcHBpbmc7CiAKKyAgUFNZX09VVCAqcHN5T3V0ID0gaEFhY0VuYy0+cHN5T3V0W2NdOworICBRQ19PVVQgKnFjT3V0ID0gaEFhY0VuYy0+cWNPdXRbY107CiAKKyAgRkRLbWVtY2xlYXIoZXh0UGF5bG9hZFVzZWQsIE1BWF9UT1RBTF9FWFRfUEFZTE9BRFMgKiBzaXplb2YoVUNIQVIpKTsKIAotICAgIFBTWV9PVVQgKnBzeU91dCA9IGhBYWNFbmMtPnBzeU91dFtjXTsKLSAgICBRQ19PVVQgICpxY091dCAgPSBoQWFjRW5jLT5xY091dFtjXTsKKyAgcWNPdXQtPmVsZW1lbnRFeHRCaXRzID0gMDsgLyogc3VtIHVwIGFsbCBleHRlbmRlZCBiaXQgb2YgZWFjaCBlbGVtZW50ICovCisgIHFjT3V0LT5zdGF0aWNCaXRzID0gMDsgICAgIC8qIHN1bSB1cCBzaWRlIGluZm8gYml0cyBvZiBlYWNoIGVsZW1lbnQgKi8KKyAgcWNPdXQtPnRvdGFsTm9SZWRQZSA9IDA7ICAgLyogc3VtIHVwIFBFICovCiAKLSAgICBGREttZW1jbGVhcihleHRQYXlsb2FkVXNlZCwgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUyAqIHNpemVvZihVQ0hBUikpOworICAvKiBhZHZhbmNlIHBzeWNob2Fjb3VzdGljcyAqLworICBmb3IgKGVsID0gMDsgZWwgPCBjbS0+bkVsZW1lbnRzOyBlbCsrKSB7CisgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9bZWxdOwogCi0gICAgcWNPdXQtPmVsZW1lbnRFeHRCaXRzID0gMDsgLyogc3VtIHVwIGFsbCBleHRlbmRlZCBiaXQgb2YgZWFjaCBlbGVtZW50ICovCi0gICAgcWNPdXQtPnN0YXRpY0JpdHMgICAgID0gMDsgLyogc3VtIHVwIHNpZGUgaW5mbyBiaXRzIG9mIGVhY2ggZWxlbWVudCAqLwotICAgIHFjT3V0LT50b3RhbE5vUmVkUGUgICA9IDA7IC8qIHN1bSB1cCBQRSAqLworICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKKyAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkgeworICAgICAgaW50IGNoOwogCi0gICAgLyogYWR2YW5jZSBwc3ljaG9hY291c3RpY3MgKi8KLSAgICBmb3IgKGVsPTA7IGVsPGNtLT5uRWxlbWVudHM7IGVsKyspIHsKLSAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9bZWxdOworICAgICAgLyogdXBkYXRlIHBvaW50ZXIhKi8KKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGVsSW5mby5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9CisgICAgICAgICAgICBwc3lPdXQtPnBzeU91dEVsZW1lbnRbZWxdLT5wc3lPdXRDaGFubmVsW2NoXTsKKyAgICAgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbiA9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5xY091dENoYW5uZWxbY2hdOwogCi0gICAgICAgIGlmICggKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKQotICAgICAgICAgIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkKLSAgICAgICAgICB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNoOworICAgICAgICBwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0gPSBxY091dENoYW4tPm1kY3RTcGVjdHJ1bTsKKyAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5ID0gcWNPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3k7CisgICAgICAgIHBzeU91dENoYW4tPnNmYkVuZXJneSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5OworICAgICAgICBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGEgPSBxY091dENoYW4tPnNmYkVuZXJneUxkRGF0YTsKKyAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhID0gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGE7CisgICAgICAgIHBzeU91dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhOworICAgICAgfQogCi0gICAgICAgICAgICAvKiB1cGRhdGUgcG9pbnRlciEqLwotICAgICAgICAgICAgZm9yKGNoPTA7Y2g8ZWxJbmZvLm5DaGFubmVsc0luRWw7Y2grKykgewotICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9IHBzeU91dC0+cHN5T3V0RWxlbWVudFtlbF0tPnBzeU91dENoYW5uZWxbY2hdOwotICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICAqcWNPdXRDaGFuID0gcWNPdXQtPnFjRWxlbWVudFtlbF0tPnFjT3V0Q2hhbm5lbFtjaF07CisgICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19wc3lNYWluKAorICAgICAgICAgIGVsSW5mby5uQ2hhbm5lbHNJbkVsLCBoQWFjRW5jLT5wc3lLZXJuZWwtPnBzeUVsZW1lbnRbZWxdLAorICAgICAgICAgIGhBYWNFbmMtPnBzeUtlcm5lbC0+cHN5RHluYW1pYywgaEFhY0VuYy0+cHN5S2VybmVsLT5wc3lDb25mLAorICAgICAgICAgIHBzeU91dC0+cHN5T3V0RWxlbWVudFtlbF0sIGlucHV0QnVmZmVyLCBpbnB1dEJ1ZmZlckJ1ZlNpemUsCisgICAgICAgICAgY20tPmVsSW5mb1tlbF0uQ2hhbm5lbEluZGV4LCBjbS0+bkNoYW5uZWxzKTsKIAotICAgICAgICAgICAgICAgIHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bSAgICAgICA9IHFjT3V0Q2hhbi0+bWRjdFNwZWN0cnVtOwotICAgICAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYlNwcmVhZEVuZXJneSAgPSBxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneTsKLSAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJFbmVyZ3kgICAgICAgICAgPSBxY091dENoYW4tPnNmYkVuZXJneTsKLSAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGEgICAgPSBxY091dENoYW4tPnNmYkVuZXJneUxkRGF0YTsKLSAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGEgICAgPSBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YTsKLSAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGEgPSBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YTsKKyAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSByZXR1cm4gRXJyb3JTdGF0dXM7CiAKLSAgICAgICAgICAgIH0KKyAgICAgIC8qIEZvcm1GYWN0b3IsIFBlIGFuZCBzdGF0aWNCaXREZW1hbmQgY2FsY3VsYXRpb24gKi8KKyAgICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDTWFpblByZXBhcmUoCisgICAgICAgICAgJmVsSW5mbywgaEFhY0VuYy0+cWNLZXJuZWwtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtlbF0sCisgICAgICAgICAgcHN5T3V0LT5wc3lPdXRFbGVtZW50W2VsXSwgcWNPdXQtPnFjRWxlbWVudFtlbF0sIGhBYWNFbmMtPmFvdCwKKyAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLCBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKIAotICAgICAgICAgICAgRkRLYWFjRW5jX3BzeU1haW4oZWxJbmZvLm5DaGFubmVsc0luRWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5wc3lLZXJuZWwtPnBzeUVsZW1lbnRbZWxdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cHN5S2VybmVsLT5wc3lEeW5hbWljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cHN5S2VybmVsLT5wc3lDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRFbGVtZW50W2VsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmVsSW5mb1tlbF0uQ2hhbm5lbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPm5DaGFubmVscworICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKIAotICAgICAgICAgICAgICAgICAgICApOworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0gICAgICAgICAgICAvKiBGb3JtRmFjdG9yLCBQZSBhbmQgc3RhdGljQml0RGVtYW5kIGNhbGN1bGF0aW9uICovCi0gICAgICAgICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19RQ01haW5QcmVwYXJlKCZlbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbC0+aEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2VsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0RWxlbWVudFtlbF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKKyAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRCaXRzVXNlZCA9IDA7CisgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+bkV4dGVuc2lvbnMgPSAwOworICAgICAgLyogcmVzZXQgZXh0ZW5zaW9uIHBheWxvYWQgKi8KKyAgICAgIEZES21lbWNsZWFyKCZxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgKDEpICogc2l6ZW9mKFFDX09VVF9FWFRFTlNJT04pKTsKIAotICAgICAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgIGZvciAobiA9IDA7IG4gPCBNQVhfVE9UQUxfRVhUX1BBWUxPQURTOyBuKyspIHsKKyAgICAgICAgaWYgKCFleHRQYXlsb2FkVXNlZFtuXSAmJiAoZXh0UGF5bG9hZFtuXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID09IGVsKSAmJgorICAgICAgICAgICAgKGV4dFBheWxvYWRbbl0uZGF0YVNpemUgPiAwKSAmJiAoZXh0UGF5bG9hZFtuXS5wRGF0YSAhPSBOVUxMKSkgeworICAgICAgICAgIGludCBpZHggPSBxY091dC0+cWNFbGVtZW50W2VsXS0+bkV4dGVuc2lvbnMrKzsKIAotICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0Qml0c1VzZWQgPSAwOwotICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPm5FeHRlbnNpb25zID0gMDsKLSAgICAgICAgICAgIC8qIHJlc2V0IGV4dGVuc2lvbiBwYXlsb2FkICovCi0gICAgICAgICAgICBGREttZW1jbGVhcigmcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dGVuc2lvbiwgKDEpKnNpemVvZihRQ19PVVRfRVhURU5TSU9OKSk7Ci0KLSAgICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUzsgbisrICkgewotICAgICAgICAgICAgICAgIGlmICggIWV4dFBheWxvYWRVc2VkW25dCi0gICAgICAgICAgICAgICAgICAmJiAoZXh0UGF5bG9hZFtuXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID09IGVsKQotICAgICAgICAgICAgICAgICAgJiYgKGV4dFBheWxvYWRbbl0uZGF0YVNpemUgPiAwKQotICAgICAgICAgICAgICAgICAgJiYgKGV4dFBheWxvYWRbbl0ucERhdGEgIT0gTlVMTCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5uRXh0ZW5zaW9ucysrOwotCi0gICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb25baWR4XS50eXBlICAgICAgICAgPSBleHRQYXlsb2FkW25dLmRhdGFUeXBlOyAgIC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIHR5cGU/ICovCi0gICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb25baWR4XS5uUGF5bG9hZEJpdHMgPSBleHRQYXlsb2FkW25dLmRhdGFTaXplOwotICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uW2lkeF0ucFBheWxvYWQgPSBleHRQYXlsb2FkW25dLnBEYXRhOwotICAgICAgICAgICAgICAgICAgICAvKiBOb3cgYXNrIHRoZSBiaXRzdHJlYW0gZW5jb2RlciBob3cgbWFueSBiaXRzIHdlIG5lZWQgdG8gZW5jb2RlIHRoZSBkYXRhIHdpdGggdGhlIGN1cnJlbnQgYml0c3RyZWFtIHN5bnRheDogKi8KLSAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dEJpdHNVc2VkICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb25baWR4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+YW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnICk7Ci0gICAgICAgICAgICAgICAgICAgIGV4dFBheWxvYWRVc2VkW25dID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHN1bSB1cCBleHRlbnNpb24gYW5kIHN0YXRpYyBiaXRzIGZvciBhbGwgY2hhbm5lbCBlbGVtZW50cyAqLwotICAgICAgICAgICAgcWNPdXQtPmVsZW1lbnRFeHRCaXRzICs9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRCaXRzVXNlZDsKLSAgICAgICAgICAgIHFjT3V0LT5zdGF0aWNCaXRzICAgKz0gcWNPdXQtPnFjRWxlbWVudFtlbF0tPnN0YXRpY0JpdHNVc2VkOwotCi0gICAgICAgICAgICAvKiBzdW0gdXAgcGUgKi8KLSAgICAgICAgICAgIHFjT3V0LT50b3RhbE5vUmVkUGUgKz0gcWNPdXQtPnFjRWxlbWVudFtlbF0tPnBlRGF0YS5wZTsKKyAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uW2lkeF0udHlwZSA9CisgICAgICAgICAgICAgIGV4dFBheWxvYWRbbl0uZGF0YVR5cGU7IC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIHR5cGU/ICovCisgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dGVuc2lvbltpZHhdLm5QYXlsb2FkQml0cyA9CisgICAgICAgICAgICAgIGV4dFBheWxvYWRbbl0uZGF0YVNpemU7CisgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dGVuc2lvbltpZHhdLnBQYXlsb2FkID0gZXh0UGF5bG9hZFtuXS5wRGF0YTsKKyAgICAgICAgICAvKiBOb3cgYXNrIHRoZSBiaXRzdHJlYW0gZW5jb2RlciBob3cgbWFueSBiaXRzIHdlIG5lZWQgdG8gZW5jb2RlIHRoZQorICAgICAgICAgICAqIGRhdGEgd2l0aCB0aGUgY3VycmVudCBiaXRzdHJlYW0gc3ludGF4OiAqLworICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRCaXRzVXNlZCArPSBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKAorICAgICAgICAgICAgICBOVUxMLCAmcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dGVuc2lvbltpZHhdLCAwLCAwLAorICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLCBoQWFjRW5jLT5hb3QsCisgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+ZXBDb25maWcpOworICAgICAgICAgIGV4dFBheWxvYWRVc2VkW25dID0gMTsKICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBzdW0gdXAgZXh0ZW5zaW9uIGFuZCBzdGF0aWMgYml0cyBmb3IgYWxsIGNoYW5uZWwgZWxlbWVudHMgKi8KKyAgICAgIHFjT3V0LT5lbGVtZW50RXh0Qml0cyArPSBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0Qml0c1VzZWQ7CisgICAgICBxY091dC0+c3RhdGljQml0cyArPSBxY091dC0+cWNFbGVtZW50W2VsXS0+c3RhdGljQml0c1VzZWQ7CisKKyAgICAgIC8qIHN1bSB1cCBwZSAqLworICAgICAgcWNPdXQtPnRvdGFsTm9SZWRQZSArPSBxY091dC0+cWNFbGVtZW50W2VsXS0+cGVEYXRhLnBlOwogICAgIH0KKyAgfQogCi0gICAgcWNPdXQtPm5FeHRlbnNpb25zICAgPSAwOwotICAgIHFjT3V0LT5nbG9iYWxFeHRCaXRzID0gMDsKKyAgcWNPdXQtPm5FeHRlbnNpb25zID0gMDsKKyAgcWNPdXQtPmdsb2JhbEV4dEJpdHMgPSAwOwogCi0gICAgLyogcmVzZXQgZXh0ZW5zaW9uIHBheWxvYWQgKi8KLSAgICBGREttZW1jbGVhcigmcWNPdXQtPmV4dGVuc2lvbiwgKDIrMikqc2l6ZW9mKFFDX09VVF9FWFRFTlNJT04pKTsKKyAgLyogcmVzZXQgZXh0ZW5zaW9uIHBheWxvYWQgKi8KKyAgRkRLbWVtY2xlYXIoJnFjT3V0LT5leHRlbnNpb24sICgyICsgMikgKiBzaXplb2YoUUNfT1VUX0VYVEVOU0lPTikpOwogCi0gICAgLyogQWRkIGV4dGVuc2lvbiBwYXlsb2FkIG5vdCBhc3NpZ25lZCB0byBhbiBjaGFubmVsIGVsZW1lbnQKLSAgICAgIChBbmNpbGxhcnkgZGF0YSBpcyB0aGUgb25seSBzdXBwb3J0ZWQgdHlwZSB1cCB0byBub3cpICovCi0gICAgZm9yICggbiA9IDA7IG4gPCBNQVhfVE9UQUxfRVhUX1BBWUxPQURTOyBuKysgKSB7Ci0gICAgICAgIGlmICggIWV4dFBheWxvYWRVc2VkW25dCi0gICAgICAgICAgJiYgKGV4dFBheWxvYWRbbl0uYXNzb2NpYXRlZENoRWxlbWVudCA9PSAtMSkKLSAgICAgICAgICAmJiAoZXh0UGF5bG9hZFtuXS5wRGF0YSAhPSBOVUxMKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFVJTlQgcGF5bG9hZEJpdHMgPSAwOworICAvKiBBZGQgZXh0ZW5zaW9uIHBheWxvYWQgbm90IGFzc2lnbmVkIHRvIGFuIGNoYW5uZWwgZWxlbWVudAorICAgIChBbmNpbGxhcnkgZGF0YSBpcyB0aGUgb25seSBzdXBwb3J0ZWQgdHlwZSB1cCB0byBub3cpICovCisgIGZvciAobiA9IDA7IG4gPCBNQVhfVE9UQUxfRVhUX1BBWUxPQURTOyBuKyspIHsKKyAgICBpZiAoIWV4dFBheWxvYWRVc2VkW25dICYmIChleHRQYXlsb2FkW25dLmFzc29jaWF0ZWRDaEVsZW1lbnQgPT0gLTEpICYmCisgICAgICAgIChleHRQYXlsb2FkW25dLnBEYXRhICE9IE5VTEwpKSB7CisgICAgICBVSU5UIHBheWxvYWRCaXRzID0gMDsKIAotICAgICAgICAgICAgaWYgKGV4dFBheWxvYWRbbl0uZGF0YVR5cGUgPT0gRVhUX0RBVEFfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIGlmIChoQWFjRW5jLT5hbmNpbGxhcnlCaXRzUGVyRnJhbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogZ3JhbnRlZCBmcmFtZSBkc2UgYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBwYXlsb2FkQml0cyA9IGhBYWNFbmMtPmFuY2lsbGFyeUJpdHNQZXJGcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGFuYyBkYXRhIGlmIGJpdHJhdGUgY29uc3RyYWludCBmdWxmaWxsZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChleHRQYXlsb2FkW25dLmRhdGFTaXplPj4zKSA8PSBoQWFjRW5jLT5jb25maWctPm1heEFuY0J5dGVzUGVyQVUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRCaXRzID0gZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXlsb2FkQml0cyA9IGZpeE1pbiggZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZSwgcGF5bG9hZEJpdHMgKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGF5bG9hZEJpdHMgPSBleHRQYXlsb2FkW25dLmRhdGFTaXplOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGF5bG9hZEJpdHMgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBpZHggPSBxY091dC0+bkV4dGVuc2lvbnMrKzsKLQotICAgICAgICAgICAgICAgIHFjT3V0LT5leHRlbnNpb25baWR4XS50eXBlICAgICAgICAgPSBleHRQYXlsb2FkW25dLmRhdGFUeXBlOyAgIC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIHR5cGU/ICovCi0gICAgICAgICAgICAgICAgcWNPdXQtPmV4dGVuc2lvbltpZHhdLm5QYXlsb2FkQml0cyA9IHBheWxvYWRCaXRzOwotICAgICAgICAgICAgICAgIHFjT3V0LT5leHRlbnNpb25baWR4XS5wUGF5bG9hZCA9IGV4dFBheWxvYWRbbl0ucERhdGE7Ci0gICAgICAgICAgICAgICAgLyogTm93IGFzayB0aGUgYml0c3RyZWFtIGVuY29kZXIgaG93IG1hbnkgYml0cyB3ZSBuZWVkIHRvIGVuY29kZSB0aGUgZGF0YSB3aXRoIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBzeW50YXg6ICovCi0gICAgICAgICAgICAgICAgcWNPdXQtPmdsb2JhbEV4dEJpdHMgKz0gRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YSggTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+ZXh0ZW5zaW9uW2lkeF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnICk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dFBheWxvYWRbbl0uZGF0YVR5cGUgPT0gRVhUX0RBVEFfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgICAgICAvKiBzdWJzdHJhY3QgdGhlIHByb2Nlc3NlZCBiaXRzICovCi0gICAgICAgICAgICAgICAgICAgIGV4dFBheWxvYWRbbl0uZGF0YVNpemUgLT0gcGF5bG9hZEJpdHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4dFBheWxvYWRVc2VkW25dID0gMTsKLSAgICAgICAgICAgIH0KKyAgICAgIGlmIChleHRQYXlsb2FkW25dLmRhdGFUeXBlID09IEVYVF9EQVRBX0VMRU1FTlQpIHsKKyAgICAgICAgaWYgKGhBYWNFbmMtPmFuY2lsbGFyeUJpdHNQZXJGcmFtZSkgeworICAgICAgICAgIC8qIGdyYW50ZWQgZnJhbWUgZHNlIGJpdHJhdGUgKi8KKyAgICAgICAgICBwYXlsb2FkQml0cyA9IGhBYWNFbmMtPmFuY2lsbGFyeUJpdHNQZXJGcmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiB3cml0ZSBhbmMgZGF0YSBpZiBiaXRyYXRlIGNvbnN0cmFpbnQgZnVsZmlsbGVkICovCisgICAgICAgICAgaWYgKChleHRQYXlsb2FkW25dLmRhdGFTaXplID4+IDMpIDw9CisgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+bWF4QW5jQnl0ZXNQZXJBVSkgeworICAgICAgICAgICAgcGF5bG9hZEJpdHMgPSBleHRQYXlsb2FkW25dLmRhdGFTaXplOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KKyAgICAgICAgcGF5bG9hZEJpdHMgPSBmaXhNaW4oZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZSwgcGF5bG9hZEJpdHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGF5bG9hZEJpdHMgPSBleHRQYXlsb2FkW25dLmRhdGFTaXplOworICAgICAgfQogCi0gICAgaWYgKCEoaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncyAmIChBQ19TQ0FMQUJMRXxBQ19FUikpKSB7Ci0gICAgICBxY091dC0+Z2xvYmFsRXh0Qml0cyArPSBFTF9JRF9CSVRTOyAgLyogYWRkIGJpdHMgZm9yIElEX0VORCAqLwotICAgIH0KKyAgICAgIGlmIChwYXlsb2FkQml0cyA+IDApIHsKKyAgICAgICAgaW50IGlkeCA9IHFjT3V0LT5uRXh0ZW5zaW9ucysrOwogCi0gICAgLyogYnVpbGQgYml0c3RyZWFtIGFsbCBuU3ViRnJhbWVzICovCi0gICAgewotICAgICAgICBJTlQgdG90YWxCaXRzICAgID0gMDsgICAvKiBUb3RhbCBBVSBiaXRzICovOwotICAgICAgICBJTlQgYXZnVG90YWxCaXRzID0gMDsKLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgIC8qIEdldCBhdmVyYWdlIHRvdGFsIGJpdHMgKi8KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBmcmFtZSB3aXNlIGJpdHJhdGUgYWRhcHRpb24gKi8KLSAgICAgICAgICAgIEZES2FhY0VuY19BZGp1c3RCaXRyYXRlKGhBYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdmdUb3RhbEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmZyYW1lbGVuZ3RoKTsKLQotICAgICAgICAgICAgLyogYWRqdXN0IHN1cGVyIGZyYW1lIGJpdHJhdGUgKi8KLSAgICAgICAgICAgIGF2Z1RvdGFsQml0cyAqPSBoQWFjRW5jLT5jb25maWctPm5TdWJGcmFtZXM7CisgICAgICAgIHFjT3V0LT5leHRlbnNpb25baWR4XS50eXBlID0KKyAgICAgICAgICAgIGV4dFBheWxvYWRbbl0uZGF0YVR5cGU7IC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIHR5cGU/ICovCisgICAgICAgIHFjT3V0LT5leHRlbnNpb25baWR4XS5uUGF5bG9hZEJpdHMgPSBwYXlsb2FkQml0czsKKyAgICAgICAgcWNPdXQtPmV4dGVuc2lvbltpZHhdLnBQYXlsb2FkID0gZXh0UGF5bG9hZFtuXS5wRGF0YTsKKyAgICAgICAgLyogTm93IGFzayB0aGUgYml0c3RyZWFtIGVuY29kZXIgaG93IG1hbnkgYml0cyB3ZSBuZWVkIHRvIGVuY29kZSB0aGUKKyAgICAgICAgICogZGF0YSB3aXRoIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBzeW50YXg6ICovCisgICAgICAgIHFjT3V0LT5nbG9iYWxFeHRCaXRzICs9IEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoCisgICAgICAgICAgICBOVUxMLCAmcWNPdXQtPmV4dGVuc2lvbltpZHhdLCAwLCAwLCBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAorICAgICAgICAgICAgaEFhY0VuYy0+YW90LCBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKKyAgICAgICAgaWYgKGV4dFBheWxvYWRbbl0uZGF0YVR5cGUgPT0gRVhUX0RBVEFfRUxFTUVOVCkgeworICAgICAgICAgIC8qIHN1YnN0cmFjdCB0aGUgcHJvY2Vzc2VkIGJpdHMgKi8KKyAgICAgICAgICBleHRQYXlsb2FkW25dLmRhdGFTaXplIC09IHBheWxvYWRCaXRzOwogICAgICAgICB9CisgICAgICAgIGV4dFBheWxvYWRVc2VkW25dID0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotICAgICAgICAvKiBNYWtlIGZpcnN0IGVzdGltYXRlIG9mIHRyYW5zcG9ydCBoZWFkZXIgb3ZlcmhlYWQuCi0gICAgICAgICAgIFRha2UgbWF4aW11bSBwb3NzaWJsZSBmcmFtZSBzaXplIGludG8gYWNjb3VudCB0byBwcmV2ZW50IGJpdHJlc2Vydm9pciB1bmRlcnJ1bi4gKi8KLSAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwtPmdsb2JIZHJCaXRzID0gdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoaFRwRW5jLCBhdmdUb3RhbEJpdHMgKyBoQWFjRW5jLT5xY0tlcm5lbC0+Yml0UmVzVG90KTsKKyAgaWYgKCEoaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncyAmIChBQ19TQ0FMQUJMRSB8IEFDX0VSKSkpIHsKKyAgICBxY091dC0+Z2xvYmFsRXh0Qml0cyArPSBFTF9JRF9CSVRTOyAvKiBhZGQgYml0cyBmb3IgSURfRU5EICovCisgIH0KIAotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNNYWluKGhBYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdUb3RhbEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaEFhY0VuYy0+YW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+ZXBDb25maWcpOwotCi0gICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY191cGRhdGVGaWxsQml0cyhjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLT5lbGVtZW50Qml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNPdXQpOwotICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKLQotICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfRmluYWxpemVCaXRDb25zdW1wdGlvbihjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyk7Ci0gICAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7Ci0gICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgICAgICB0b3RhbEJpdHMgKz0gcWNPdXQtPnRvdGFsQml0czsKLQotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgRkRLYWFjRW5jX3VwZGF0ZUJpdHJlcyhjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY091dCk7Ci0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgICAgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCi0gICAgICAgICAgICAgIC8qIHdyaXRlIGJpdHN0cmVhbSBoZWFkZXIgKi8KLSAgICAgICAgICAgICAgdHJhbnNwb3J0RW5jX1dyaXRlQWNjZXNzVW5pdCgKLSAgICAgICAgICAgICAgICAgICAgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICB0b3RhbEJpdHMsCi0gICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19FbmNCaXRyZXNUb1RwQml0cmVzKGhBYWNFbmMpLAotICAgICAgICAgICAgICAgICAgICBjbS0+bkNoYW5uZWxzRWZmKTsKLQotICAgICAgICAgICAgICAvKiB3cml0ZSBiaXRzdHJlYW0gKi8KLSAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfV3JpdGVCaXRzdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgY20sCi0gICAgICAgICAgICAgICAgICAgIHFjT3V0LAotICAgICAgICAgICAgICAgICAgICBwc3lPdXQsCi0gICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5hb3QsCi0gICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+ZXBDb25maWcpOwotCi0gICAgICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKLQotICAgICAgICAgICAgICAvKiB0cmFuc3BvcnRFbmNfRW5kQWNjZXNzVW5pdCgpIGlzIGJlaW5nIGNhbGxlZCBpbnNpZGUgRkRLYWFjRW5jX1dyaXRlQml0c3RyZWFtKCkgKi8KLSAgICAgICAgICAgICAgdHJhbnNwb3J0RW5jX0dldEZyYW1lKGhUcEVuYywgbk91dEJ5dGVzKTsKLQotICAgIH0gLyogLWVuZC0gaWYgKGN1ckZyYW1lPT1oQWFjRW5jLT5xY0tlcm5lbC0+blN1YkZyYW1lcykgKi8KLQorICAvKiBidWlsZCBiaXRzdHJlYW0gYWxsIG5TdWJGcmFtZXMgKi8KKyAgeworICAgIElOVCB0b3RhbEJpdHMgPSAwOyAvKiBUb3RhbCBBVSBiaXRzICovCisgICAgOworICAgIElOVCBhdmdUb3RhbEJpdHMgPSAwOwogCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIHJldHVybiBBQUNfRU5DX09LOworICAgIC8qIEdldCBhdmVyYWdlIHRvdGFsIGJpdHMgKi8KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgeworICAgICAgLyogZnJhbWUgd2lzZSBiaXRyYXRlIGFkYXB0aW9uICovCisgICAgICBGREthYWNFbmNfQWRqdXN0Qml0cmF0ZSgKKyAgICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbCwgY20sICZhdmdUb3RhbEJpdHMsIGhBYWNFbmMtPmNvbmZpZy0+Yml0UmF0ZSwKKyAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnNhbXBsZVJhdGUsIGhBYWNFbmMtPmNvbmZpZy0+ZnJhbWVsZW5ndGgpOworCisgICAgICAvKiBhZGp1c3Qgc3VwZXIgZnJhbWUgYml0cmF0ZSAqLworICAgICAgYXZnVG90YWxCaXRzICo9IGhBYWNFbmMtPmNvbmZpZy0+blN1YkZyYW1lczsKKyAgICB9CisKKyAgICAvKiBNYWtlIGZpcnN0IGVzdGltYXRlIG9mIHRyYW5zcG9ydCBoZWFkZXIgb3ZlcmhlYWQuCisgICAgICAgVGFrZSBtYXhpbXVtIHBvc3NpYmxlIGZyYW1lIHNpemUgaW50byBhY2NvdW50IHRvIHByZXZlbnQgYml0cmVzZXJ2b2lyCisgICAgICAgdW5kZXJydW4uICovCisgICAgaEFhY0VuYy0+cWNLZXJuZWwtPmdsb2JIZHJCaXRzID0gdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoCisgICAgICAgIGhUcEVuYywgYXZnVG90YWxCaXRzICsgaEFhY0VuYy0+cWNLZXJuZWwtPmJpdFJlc1RvdCk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDTWFpbigKKyAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwsIGhBYWNFbmMtPnBzeU91dCwgaEFhY0VuYy0+cWNPdXQsIGF2Z1RvdGFsQml0cywgY20sCisgICAgICAgIGhBYWNFbmMtPmFvdCwgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyk7CisKKyAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgcmV0dXJuIEVycm9yU3RhdHVzOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY191cGRhdGVGaWxsQml0cygKKyAgICAgICAgY20sIGhBYWNFbmMtPnFjS2VybmVsLCBoQWFjRW5jLT5xY0tlcm5lbC0+ZWxlbWVudEJpdHMsIGhBYWNFbmMtPnFjT3V0KTsKKyAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgcmV0dXJuIEVycm9yU3RhdHVzOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0ZpbmFsaXplQml0Q29uc3VtcHRpb24oCisgICAgICAgIGNtLCBoQWFjRW5jLT5xY0tlcm5lbCwgcWNPdXQsIHFjT3V0LT5xY0VsZW1lbnQsIGhUcEVuYywgaEFhY0VuYy0+YW90LAorICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLCBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKKyAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgcmV0dXJuIEVycm9yU3RhdHVzOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICB0b3RhbEJpdHMgKz0gcWNPdXQtPnRvdGFsQml0czsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBGREthYWNFbmNfdXBkYXRlQml0cmVzKGNtLCBoQWFjRW5jLT5xY0tlcm5lbCwgaEFhY0VuYy0+cWNPdXQpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KKyAgICAvKiB3cml0ZSBiaXRzdHJlYW0gaGVhZGVyICovCisgICAgaWYgKFRSQU5TUE9SVEVOQ19PSyAhPQorICAgICAgICB0cmFuc3BvcnRFbmNfV3JpdGVBY2Nlc3NVbml0KGhUcEVuYywgdG90YWxCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19FbmNCaXRyZXNUb1RwQml0cmVzKGhBYWNFbmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5uQ2hhbm5lbHNFZmYpKSB7CisgICAgICByZXR1cm4gQUFDX0VOQ19VTktOT1dOOworICAgIH0KKworICAgIC8qIHdyaXRlIGJpdHN0cmVhbSAqLworICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1dyaXRlQml0c3RyZWFtKAorICAgICAgICBoVHBFbmMsIGNtLCBxY091dCwgcHN5T3V0LCBoQWFjRW5jLT5xY0tlcm5lbCwgaEFhY0VuYy0+YW90LAorICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLCBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKKworICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSByZXR1cm4gRXJyb3JTdGF0dXM7CisKKyAgICAvKiB0cmFuc3BvcnRFbmNfRW5kQWNjZXNzVW5pdCgpIGlzIGJlaW5nIGNhbGxlZCBpbnNpZGUKKyAgICAgKiBGREthYWNFbmNfV3JpdGVCaXRzdHJlYW0oKSAqLworICAgIGlmIChUUkFOU1BPUlRFTkNfT0sgIT0gdHJhbnNwb3J0RW5jX0dldEZyYW1lKGhUcEVuYywgbk91dEJ5dGVzKSkgeworICAgICAgcmV0dXJuIEFBQ19FTkNfVU5LTk9XTjsKKyAgICB9CisKKyAgfSAvKiAtZW5kLSBpZiAoY3VyRnJhbWU9PWhBYWNFbmMtPnFjS2VybmVsLT5uU3ViRnJhbWVzKSAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05OTAsMjkgKzk2NCwyNyBAQAogCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgRkRLYWFjRW5jX0Nsb3NlKCBIQU5ETEVfQUFDX0VOQyogIHBoQWFjRW5jKSAgIC8qIGVuY29kZXIgaGFuZGxlICovCit2b2lkIEZES2FhY0VuY19DbG9zZShIQU5ETEVfQUFDX0VOQyAqcGhBYWNFbmMpIC8qIGVuY29kZXIgaGFuZGxlICovCiB7Ci0gICAgaWYgKCpwaEFhY0VuYyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEFBQ19FTkMgKmhBYWNFbmMgPSAoQUFDX0VOQyopKnBoQWFjRW5jOworICBpZiAoKnBoQWFjRW5jID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQUFDX0VOQyAqaEFhY0VuYyA9IChBQUNfRU5DICopKnBoQWFjRW5jOwogCi0gICBpZiAoaEFhY0VuYy0+ZHluYW1pY19SQU0gIT0gTlVMTCkKLSAgICAgICBGcmVlQUFDZHluYW1pY19SQU0oJmhBYWNFbmMtPmR5bmFtaWNfUkFNKTsKKyAgaWYgKGhBYWNFbmMtPmR5bmFtaWNfUkFNICE9IE5VTEwpIEZyZWVBQUNkeW5hbWljX1JBTSgmaEFhY0VuYy0+ZHluYW1pY19SQU0pOwogCi0gICAgRkRLYWFjRW5jX1BzeUNsb3NlKCZoQWFjRW5jLT5wc3lLZXJuZWwsaEFhY0VuYy0+cHN5T3V0KTsKKyAgRkRLYWFjRW5jX1BzeUNsb3NlKCZoQWFjRW5jLT5wc3lLZXJuZWwsIGhBYWNFbmMtPnBzeU91dCk7CiAKLSAgICBGREthYWNFbmNfUUNDbG9zZSgmaEFhY0VuYy0+cWNLZXJuZWwsIGhBYWNFbmMtPnFjT3V0KTsKKyAgRkRLYWFjRW5jX1FDQ2xvc2UoJmhBYWNFbmMtPnFjS2VybmVsLCBoQWFjRW5jLT5xY091dCk7CiAKLSAgICBGcmVlUmFtX2FhY0VuY19BYWNFbmNvZGVyKHBoQWFjRW5jKTsKKyAgRnJlZVJhbV9hYWNFbmNfQWFjRW5jb2RlcihwaEFhY0VuYyk7CiB9CiAKLQogLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGluIHRoaXMgc291cmNlIGZpbGUgb25seSBmb3IgY29udmVuaWVuY2UgYW5kICovCiAvKiBuZWVkIG5vdCBiZSB2aXNpYmxlIG91dHNpZGUgb2YgYSBwb3NzaWJsZSBlbmNvZGVyIGxpYnJhcnkuICovCiAKIC8qIGJhc2ljIGRlZmluZXMgZm9yIGFuY2lsbGFyeSBkYXRhICovCi0jZGVmaW5lIE1BWF9BTkNSQVRFIDE5MjAwICAgICAgICAgICAgLyogYW5jaWxsYXJ5IHJhdGUgPj0gMTkyMDAgaXNuJ3QgdmFsaWQgKi8KKyNkZWZpbmUgTUFYX0FOQ1JBVEUgMTkyMDAgLyogYW5jaWxsYXJ5IHJhdGUgPj0gMTkyMDAgaXNuJ3QgdmFsaWQgKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTAyMSw0MiArOTkzLDMzIEBACiAgICAgcmV0dXJuOiAgICAgICAgaWYgc3VjY2VzcyBvciBOVUxMIGlmIGVycm9yCiAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdENoZWNrQW5jaWxsYXJ5KElOVCBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZyYW1lbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFuY2lsbGFyeVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmFuY2lsbGFyeUJpdHNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlKQotewotICBJTlQgZGlmZlRvQnl0ZUFsaWduOwotCitzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRDaGVja0FuY2lsbGFyeSgKKyAgICBJTlQgYml0UmF0ZSwgSU5UIGZyYW1lbGVuZ3RoLCBJTlQgYW5jaWxsYXJ5UmF0ZSwgSU5UICphbmNpbGxhcnlCaXRzUGVyRnJhbWUsCisgICAgSU5UIHNhbXBsZVJhdGUpIHsKICAgLyogZG9uJ3QgdXNlIG5lZ2F0aXZlIGFuY2lsbGFyeSByYXRlcyAqLwotICBpZiAoIGFuY2lsbGFyeVJhdGUgPCAtMSApCi0gICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQU5DX0JJVFJBVEU7CisgIGlmIChhbmNpbGxhcnlSYXRlIDwgLTEpIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0FOQ19CSVRSQVRFOwogCiAgIC8qIGNoZWNrIGlmIGFuY2lsbGFyeSByYXRlIGlzIG9rICovCi0gIGlmICggKGFuY2lsbGFyeVJhdGUgIT0gKC0xKSkgJiYgKGFuY2lsbGFyeVJhdGUgIT0gMCkgKSB7CisgIGlmICgoYW5jaWxsYXJ5UmF0ZSAhPSAoLTEpKSAmJiAoYW5jaWxsYXJ5UmF0ZSAhPSAwKSkgewogICAgIC8qIGFuY1JhdGUgPD0gMTUlIG9mIGJpdHJhdGUgJiYgYW5jUmF0ZSA8IDE5MjAwICovCi0gICAgaWYgKCAoIGFuY2lsbGFyeVJhdGUgPj0gTUFYX0FOQ1JBVEUgKSB8fAotICAgICAgICAgKCAoYW5jaWxsYXJ5UmF0ZSAqIDIwKSA+IChiaXRSYXRlICogMykgKSApIHsKKyAgICBpZiAoKGFuY2lsbGFyeVJhdGUgPj0gTUFYX0FOQ1JBVEUpIHx8CisgICAgICAgICgoYW5jaWxsYXJ5UmF0ZSAqIDIwKSA+IChiaXRSYXRlICogMykpKSB7CiAgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9BTkNfQklUUkFURTsKICAgICB9Ci0gIH0KLSAgZWxzZSBpZiAoYW5jaWxsYXJ5UmF0ZSA9PSAtMSkgeworICB9IGVsc2UgaWYgKGFuY2lsbGFyeVJhdGUgPT0gLTEpIHsKICAgICAvKiBpZiBubyBzcGVjaWFsIGFuY1JhdGUgaXMgcmVxdWVzdGVkIGJ1dCBhIGFuY2lsbGFyeSBmaWxlIGlzCiAgICAgICAgc3RhdGVkLCB0aGVuIGdlbmVyYXRlIGEgYW5jaWxsYXJ5IHJhdGUgbWF0Y2hpbmcgdG8gdGhlIGJpdHJhdGUgKi8KICAgICBpZiAoYml0UmF0ZSA+PSAoTUFYX0FOQ1JBVEUgKiAxMCkpIHsKICAgICAgIC8qIGFuY2lsbGFyeSByYXRlIGlzIDE5MTk5ICovCiAgICAgICBhbmNpbGxhcnlSYXRlID0gKE1BWF9BTkNSQVRFIC0gMSk7Ci0gICAgfQotICAgIGVsc2UgeyAvKiAxMCUgb2YgYml0cmF0ZSAqLworICAgIH0gZWxzZSB7IC8qIDEwJSBvZiBiaXRyYXRlICovCiAgICAgICBhbmNpbGxhcnlSYXRlID0gYml0UmF0ZSAvIDEwOwogICAgIH0KICAgfQogCiAgIC8qIG1ha2UgYW5jaWxsYXJ5Qml0c1BlckZyYW1lIGJ5dGUgYWxpZ24gKi8KLSAgKmFuY2lsbGFyeUJpdHNQZXJGcmFtZSA9IChhbmNpbGxhcnlSYXRlICogZnJhbWVsZW5ndGggKSAvIHNhbXBsZVJhdGU7Ci0gIGRpZmZUb0J5dGVBbGlnbiA9ICphbmNpbGxhcnlCaXRzUGVyRnJhbWUgJSA4OwotICAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lID0gKmFuY2lsbGFyeUJpdHNQZXJGcmFtZSAtIGRpZmZUb0J5dGVBbGlnbjsKKyAgKmFuY2lsbGFyeUJpdHNQZXJGcmFtZSA9CisgICAgICBGREthYWNFbmNfQ2FsY0JpdHNQZXJGcmFtZShhbmNpbGxhcnlSYXRlLCBmcmFtZWxlbmd0aCwgc2FtcGxlUmF0ZSkgJiB+MHg3OwogCiAgIHJldHVybiBBQUNfRU5DX09LOwogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hYWNlbmMuaCBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jLmgKaW5kZXggNzk1MjRiNS4uMGUwZDhjMSAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hYWNlbmMuaAorKysgYi9saWJBQUNlbmMvc3JjL2FhY2VuYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE3ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqICBGYXN0IE1QRUcgQUFDIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAotICAgY29udGVudHMvZGVzY3JpcHRpb246IGZhc3QgYWFjIGNvZGVyIGludGVyZmFjZSBsaWJyYXJ5IGZ1bmN0aW9ucworICAgQXV0aG9yKHMpOiAgIE0uIFNjaHVnIC8gQS4gR3JvZXNjaGVsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBmYXN0IGFhYyBjb2RlciBpbnRlcmZhY2UgbGlicmFyeSBmdW5jdGlvbnMKIAotI2lmbmRlZiBfYWFjZW5jX2hfCi0jZGVmaW5lIF9hYWNlbmNfaF8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQUFDRU5DX0gKKyNkZWZpbmUgQUFDRU5DX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKICNpbmNsdWRlICJGREtfYXVkaW8uaCIKQEAgLTk4LDEwICsxMTAsNyBAQAogCiAjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKIAotI2RlZmluZSBCSVRSRVNfTUFYX0xEICAgNDAwMAotI2RlZmluZSBCSVRSRVNfTUlOX0xEICAgIDUwMAotI2RlZmluZSBCSVRSQVRFX01BWF9MRCA3MDAwMCAvKiBNYXggYXNzdW1lZCBiaXRyYXRlIGZvciBiaXRyZXMgY2FsY3VsYXRpb24gKi8KLSNkZWZpbmUgQklUUkFURV9NSU5fTEQgMTIwMDAgLyogTWluIGFzc3VtZWQgYml0cmF0ZSBmb3IgYml0cmVzIGNhbGN1bGF0aW9uICovCisjZGVmaW5lIE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTiA2MTQ0CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC0xMTEsMTkyICsxMjAsMjE4IEBACiAgKiBBQUMtTEMgZXJyb3IgY29kZXMuCiAgKi8KIHR5cGVkZWYgZW51bSB7Ci0gIEFBQ19FTkNfT0sgICAgICAgPSAweDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFsbCBmaW5lLiAqLworICBBQUNfRU5DX09LID0gMHgwMDAwLCAvKiE8IEFsbCBmaW5lLiAqLwogCi0gIEFBQ19FTkNfVU5LTk9XTiAgPSAweDAwMDIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVycm9yIGNvbmRpdGlvbiBpcyBvZiB1bmtub3duIHJlYXNvbiwgb3IgZnJvbSBhbm90aGVyIG1vZHVsZS4gICAgICAgICAgICAgICovCisgIEFBQ19FTkNfVU5LTk9XTiA9IDB4MDAwMiwgLyohPCBFcnJvciBjb25kaXRpb24gaXMgb2YgdW5rbm93biByZWFzb24sIG9yIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIG1vZHVsZS4gICAgICAgICAgICAgICovCiAKICAgLyogaW5pdGlhbGl6YXRpb24gZXJyb3JzICovCi0gIGFhY19lbmNfaW5pdF9lcnJvcl9zdGFydCAgICAgID0gMHgyMDAwLAotICBBQUNfRU5DX0lOVkFMSURfSEFORExFICAgICAgICA9IDB4MjAyMCwgICAgICAgICAgICAgLyohPCBUaGUgaGFuZGxlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gY2FsbCB3YXMgaW52YWxpZCAocHJvYmFibHkgTlVMTCkuICAgICAgICAqLwotICBBQUNfRU5DX0lOVkFMSURfRlJBTUVfTEVOR1RIICA9IDB4MjA4MCwgICAgICAgICAgICAgLyohPCBJbnZhbGlkIGZyYW1lIGxlbmd0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX0lOVkFMSURfTl9DSEFOTkVMUyAgICA9IDB4MjBlMCwgICAgICAgICAgICAgLyohPCBJbnZhbGlkIGFtb3VudCBvZiBhdWRpbyBpbnB1dCBjaGFubmVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX0lOVkFMSURfU0ZCX1RBQkxFICAgICA9IDB4MjE0MCwgICAgICAgICAgICAgLyohPCBJbnRlcm5hbCBlbmNvZGVyIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBhYWNfZW5jX2luaXRfZXJyb3Jfc3RhcnQgPSAweDIwMDAsCisgIEFBQ19FTkNfSU5WQUxJRF9IQU5ETEUgPSAweDIwMjAsIC8qITwgVGhlIGhhbmRsZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIGludmFsaWQgKHByb2JhYmx5IE5VTEwpLiAgICAgICAgKi8KKyAgQUFDX0VOQ19JTlZBTElEX0ZSQU1FX0xFTkdUSCA9CisgICAgICAweDIwODAsIC8qITwgSW52YWxpZCBmcmFtZSBsZW5ndGggKG11c3QgYmUgMTAyNCBvciA5NjApLiAqLworICBBQUNfRU5DX0lOVkFMSURfTl9DSEFOTkVMUyA9CisgICAgICAweDIwZTAsIC8qITwgSW52YWxpZCBhbW91bnQgb2YgYXVkaW8gaW5wdXQgY2hhbm5lbHMuICovCisgIEFBQ19FTkNfSU5WQUxJRF9TRkJfVEFCTEUgPSAweDIxNDAsIC8qITwgSW50ZXJuYWwgZW5jb2RlciBlcnJvci4gKi8KIAotICBBQUNfRU5DX1VOU1VQUE9SVEVEX0FPVCAgICAgICAgICAgID0gMHgzMDAwLCAgICAgICAgLyohPCBUaGUgQXVkaW8gT2JqZWN0IFR5cGUgKEFPVCkgaXMgbm90IHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX1VOU1VQUE9SVEVEX0JJVFJBVEUgICAgICAgID0gMHgzMDIwLCAgICAgICAgLyohPCBUaGUgY2hvc2VuIGJpdHJhdGUgaXMgbm90IHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX1VOU1VQUE9SVEVEX0JJVFJBVEVfTU9ERSAgID0gMHgzMDI4LCAgICAgICAgLyohPCBVbnN1cHBvcnRlZCBiaXQgcmF0ZSBtb2RlIChDQlIgb3IgVkJSKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX1VOU1VQUE9SVEVEX0FOQ19CSVRSQVRFICAgID0gMHgzMDQwLCAgICAgICAgLyohPCBVbnN1cHBvcnRlZCBhbmNpbGxheSBiaXRyYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX1VOU1VQUE9SVEVEX0FOQ19NT0RFICAgICAgID0gMHgzMDYwLAotICBBQUNfRU5DX1VOU1VQUE9SVEVEX1RSQU5TUE9SVF9UWVBFID0gMHgzMDgwLCAgICAgICAgLyohPCBUaGUgYml0c3RyZWFtIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX1VOU1VQUE9SVEVEX0VSX0ZPUk1BVCAgICAgID0gMHgzMGEwLCAgICAgICAgLyohPCBUaGUgZXJyb3IgcmVzaWxpZW5jZSB0b29sIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX1VOU1VQUE9SVEVEX0VQQ09ORklHICAgICAgID0gMHgzMGMwLCAgICAgICAgLyohPCBUaGUgZXJyb3IgcHJvdGVjdGlvbiBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUcgID0gMHgzMGUwLCAgICAgICAgLyohPCBUaGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIChlaXRoZXIgbnVtYmVyIG9yIGFycmFuZ2VtZW50KSBpcyBub3Qgc3VwcG9ydGVkLiAqLwotICBBQUNfRU5DX1VOU1VQUE9SVEVEX1NBTVBMSU5HUkFURSAgID0gMHgzMTAwLCAgICAgICAgLyohPCBTYW1wbGUgcmF0ZSBvZiBhdWRpbyBpbnB1dCBpcyBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX05PX01FTU9SWSAgICAgICAgICAgICAgICAgID0gMHgzMTIwLCAgICAgICAgLyohPCBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5LiAqLwotICBBQUNfRU5DX1BFX0lOSVRfVEFCTEVfTk9UX0ZPVU5EICAgID0gMHgzMTQwLCAgICAgICAgLyohPCBJbnRlcm5hbCBlbmNvZGVyIGVycm9yLiAgICAqLworICBBQUNfRU5DX1VOU1VQUE9SVEVEX0FPVCA9CisgICAgICAweDMwMDAsIC8qITwgVGhlIEF1ZGlvIE9iamVjdCBUeXBlIChBT1QpIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfRklMVEVSQkFOSyA9CisgICAgICAweDMwMTAsIC8qITwgRmlsdGVyYmFuayB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURSA9CisgICAgICAweDMwMjAsIC8qITwgVGhlIGNob3NlbiBiaXRyYXRlIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURV9NT0RFID0KKyAgICAgIDB4MzAyOCwgLyohPCBVbnN1cHBvcnRlZCBiaXQgcmF0ZSBtb2RlIChDQlIgb3IgVkJSKS4gKi8KKyAgQUFDX0VOQ19VTlNVUFBPUlRFRF9BTkNfQklUUkFURSA9CisgICAgICAweDMwNDAsIC8qITwgVW5zdXBwb3J0ZWQgYW5jaWxsYXkgYml0cmF0ZS4gKi8KKyAgQUFDX0VOQ19VTlNVUFBPUlRFRF9BTkNfTU9ERSA9IDB4MzA2MCwKKyAgQUFDX0VOQ19VTlNVUFBPUlRFRF9UUkFOU1BPUlRfVFlQRSA9CisgICAgICAweDMwODAsIC8qITwgVGhlIGJpdHN0cmVhbSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KKyAgQUFDX0VOQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQgPQorICAgICAgMHgzMGEwLCAvKiE8IFRoZSBlcnJvciByZXNpbGllbmNlIHRvb2wgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfRVBDT05GSUcgPQorICAgICAgMHgzMGMwLCAvKiE8IFRoZSBlcnJvciBwcm90ZWN0aW9uIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfRU5DX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUcgPQorICAgICAgMHgzMGUwLCAvKiE8IFRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKGVpdGhlciBudW1iZXIgb3IgYXJyYW5nZW1lbnQpIGlzCisgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFID0KKyAgICAgIDB4MzEwMCwgLyohPCBTYW1wbGUgcmF0ZSBvZiBhdWRpbyBpbnB1dCBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfRU5DX05PX01FTU9SWSA9IDB4MzEyMCwgICAgICAgICAgICAgICAvKiE8IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkuICovCisgIEFBQ19FTkNfUEVfSU5JVF9UQUJMRV9OT1RfRk9VTkQgPSAweDMxNDAsIC8qITwgSW50ZXJuYWwgZW5jb2RlciBlcnJvci4gICAgKi8KIAogICBhYWNfZW5jX2luaXRfZXJyb3JfZW5kLAogCiAgIC8qIGVuY29kZSBlcnJvcnMgKi8KLSAgYWFjX2VuY19lcnJvcl9zdGFydCAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDAsCi0gIEFBQ19FTkNfUVVBTlRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDIwLCAgICAgICAvKiE8IFRvbyBtYW55IGJpdHMgdXNlZCBpbiBxdWFudGl6YXRpb24uICAgICAgICAgICAgICovCi0gIEFBQ19FTkNfV1JJVFRFTl9CSVRTX0VSUk9SICAgICAgICAgICAgICAgID0gMHg0MDQwLCAgICAgICAvKiE8IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIHdyaXR0ZW4gYml0cywgZGlmZmVycyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkIG51bWJlciBvZiBiaXRzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX1BOU19UQUJMRV9FUlJPUiAgICAgICAgICAgICAgICAgICA9IDB4NDA2MCwgICAgICAgLyohPCBQTlMgbGV2ZWwgb3V0IG9mIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX0dMT0JBTF9HQUlOX1RPT19ISUdIICAgICAgICAgICAgICA9IDB4NDA4MCwgICAgICAgLyohPCBJbnRlcm5hbCBxdWFudGl6ZXIgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX0JJVFJFU19UT09fTE9XICAgICAgICAgICAgICAgICAgICA9IDB4NDBhMCwgICAgICAgLyohPCBUb28gZmV3ICBiaXRzIGluIGJpdCByZXNlcnZvaXIuICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX0JJVFJFU19UT09fSElHSCAgICAgICAgICAgICAgICAgICA9IDB4NDBhMSwgICAgICAgLyohPCBUb28gbWFueSBiaXRzIGluIGJpdCByZXNlcnZvaXIuICAgICAgICAgICAgICAgICAqLwotICBBQUNfRU5DX0lOVkFMSURfQ0hBTk5FTF9CSVRSQVRFICAgICAgICAgICA9IDB4NDEwMCwKLSAgQUFDX0VOQ19JTlZBTElEX0VMRU1FTlRJTkZPX1RZUEUgICAgICAgICAgPSAweDQxMjAsICAgICAgIC8qITwgSW50ZXJuYWwgZW5jb2RlciBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgYWFjX2VuY19lcnJvcl9zdGFydCA9IDB4NDAwMCwKKyAgQUFDX0VOQ19RVUFOVF9FUlJPUiA9IDB4NDAyMCwgLyohPCBUb28gbWFueSBiaXRzIHVzZWQgaW4gcXVhbnRpemF0aW9uLiAqLworICBBQUNfRU5DX1dSSVRURU5fQklUU19FUlJPUiA9CisgICAgICAweDQwNDAsIC8qITwgVW5leHBlY3RlZCBudW1iZXIgb2Ygd3JpdHRlbiBiaXRzLCBkaWZmZXJzIHRvCisgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZCBudW1iZXIgb2YgYml0cy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQUFDX0VOQ19QTlNfVEFCTEVfRVJST1IgPSAweDQwNjAsICAgICAgLyohPCBQTlMgbGV2ZWwgb3V0IG9mIHJhbmdlLiAgICAgICovCisgIEFBQ19FTkNfR0xPQkFMX0dBSU5fVE9PX0hJR0ggPSAweDQwODAsIC8qITwgSW50ZXJuYWwgcXVhbnRpemVyIGVycm9yLiAqLworICBBQUNfRU5DX0JJVFJFU19UT09fTE9XID0gMHg0MGEwLCAvKiE8IFRvbyBmZXcgIGJpdHMgaW4gYml0IHJlc2Vydm9pci4gICAgICAgKi8KKyAgQUFDX0VOQ19CSVRSRVNfVE9PX0hJR0ggPSAweDQwYTEsIC8qITwgVG9vIG1hbnkgYml0cyBpbiBiaXQgcmVzZXJ2b2lyLiAgICAgICovCisgIEFBQ19FTkNfSU5WQUxJRF9DSEFOTkVMX0JJVFJBVEUgPSAweDQxMDAsCisgIEFBQ19FTkNfSU5WQUxJRF9FTEVNRU5USU5GT19UWVBFID0gMHg0MTIwLCAvKiE8IEludGVybmFsIGVuY29kZXIgZXJyb3IuICovCiAKLSAgQUFDX0VOQ19XUklURV9TQ0FMX0VSUk9SICAgICAgICAgICAgICAgICAgPSAweDQxZTAsICAgICAgIC8qITwgRXJyb3Igd3JpdGluZyBzY2FsZWZhY0RhdGEuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19XUklURV9TRUNfRVJST1IgICAgICAgICAgICAgICAgICAgPSAweDQyMDAsICAgICAgIC8qITwgRXJyb3Igd3JpdGluZyBzZWN0aW9uRGF0YS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19XUklURV9TUEVDX0VSUk9SICAgICAgICAgICAgICAgICAgPSAweDQyMjAsICAgICAgIC8qITwgRXJyb3Igd3JpdGluZyBzcGVjdHJhbERhdGEuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQUFDX0VOQ19XUklURV9TQ0FMX0VSUk9SID0gMHg0MWUwLCAvKiE8IEVycm9yIHdyaXRpbmcgc2NhbGVmYWNEYXRhLiAqLworICBBQUNfRU5DX1dSSVRFX1NFQ19FUlJPUiA9IDB4NDIwMCwgIC8qITwgRXJyb3Igd3JpdGluZyBzZWN0aW9uRGF0YS4gICovCisgIEFBQ19FTkNfV1JJVEVfU1BFQ19FUlJPUiA9IDB4NDIyMCwgLyohPCBFcnJvciB3cml0aW5nIHNwZWN0cmFsRGF0YS4gKi8KICAgYWFjX2VuY19lcnJvcl9lbmQKIAogfSBBQUNfRU5DT0RFUl9FUlJPUjsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNkZWZpbmUgQU5DX0RBVEFfQlVGRkVSU0laRSAxMDI0ICAgICAgLyogYW5jQnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgQU5DX0RBVEFfQlVGRkVSU0laRSAxMDI0IC8qIGFuY0J1ZmZlciBzaXplICovCiAKLSNkZWZpbmUgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUyAgKCgoOCkgKiAoMSkpICsgKDIrMikpCi0KKyNkZWZpbmUgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUyAoKCgoOCkpICogKDEpKSArICgyICsgMikpCiAKIHR5cGVkZWYgZW51bSB7Ci0gIEFBQ0VOQ19CUl9NT0RFX0lOVkFMSUQgPSAtMSwgIC8qITwgSW52YWxpZCBiaXRyYXRlIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFBQ0VOQ19CUl9NT0RFX0NCUiAgICAgPSAgMCwgIC8qITwgQ29uc3RhbnQgYml0cmF0ZSBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFBQ0VOQ19CUl9NT0RFX1ZCUl8xICAgPSAgMSwgIC8qITwgVmFyaWFibGUgYml0cmF0ZSBtb2RlLCBhYm91dCAzMiBrYnBzL2NoYW5uZWwuICAgICovCi0gIEFBQ0VOQ19CUl9NT0RFX1ZCUl8yICAgPSAgMiwgIC8qITwgVmFyaWFibGUgYml0cmF0ZSBtb2RlLCBhYm91dCA0MCBrYnBzL2NoYW5uZWwuICAgICovCi0gIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zICAgPSAgMywgIC8qITwgVmFyaWFibGUgYml0cmF0ZSBtb2RlLCBhYm91dCA0OC01NiBrYnBzL2NoYW5uZWwuICovCi0gIEFBQ0VOQ19CUl9NT0RFX1ZCUl80ICAgPSAgNCwgIC8qITwgVmFyaWFibGUgYml0cmF0ZSBtb2RlLCBhYm91dCA2NCBrYnBzL2NoYW5uZWwuICAgICovCi0gIEFBQ0VOQ19CUl9NT0RFX1ZCUl81ICAgPSAgNSwgIC8qITwgVmFyaWFibGUgYml0cmF0ZSBtb2RlLCBhYm91dCA4MC05NiBrYnBzL2NoYW5uZWwuICovCi0gIEFBQ0VOQ19CUl9NT0RFX0ZGICAgICAgPSAgNiwgIC8qITwgRml4ZWQgZnJhbWUgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFBQ0VOQ19CUl9NT0RFX1NGUiAgICAgPSAgNyAgIC8qITwgU3VwZXJmcmFtZSBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFBQ0VOQ19CUl9NT0RFX0lOVkFMSUQgPSAtMSwgLyohPCBJbnZhbGlkIGJpdHJhdGUgbW9kZS4gKi8KKyAgQUFDRU5DX0JSX01PREVfQ0JSID0gMCwgICAgICAvKiE8IENvbnN0YW50IGJpdHJhdGUgbW9kZS4gICAgICAqLworICBBQUNFTkNfQlJfTU9ERV9WQlJfMSA9IDEsIC8qITwgVmFyaWFibGUgYml0cmF0ZSBtb2RlLCB2ZXJ5IGxvdyBiaXRyYXRlLiAgICAqLworICBBQUNFTkNfQlJfTU9ERV9WQlJfMiA9IDIsIC8qITwgVmFyaWFibGUgYml0cmF0ZSBtb2RlLCBsb3cgYml0cmF0ZS4gICAgKi8KKyAgQUFDRU5DX0JSX01PREVfVkJSXzMgPSAzLCAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgbWVkaXVtIGJpdHJhdGUuICAgICovCisgIEFBQ0VOQ19CUl9NT0RFX1ZCUl80ID0gNCwgLyohPCBWYXJpYWJsZSBiaXRyYXRlIG1vZGUsIGhpZ2ggYml0cmF0ZS4gICAgKi8KKyAgQUFDRU5DX0JSX01PREVfVkJSXzUgPSA1LCAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgdmVyeSBoaWdoIGJpdHJhdGUuICAgICovCisgIEFBQ0VOQ19CUl9NT0RFX0ZGID0gNiwgICAgLyohPCBGaXhlZCBmcmFtZSBtb2RlLiAgICAgICAqLworICBBQUNFTkNfQlJfTU9ERV9TRlIgPSA3ICAgIC8qITwgU3VwZXJmcmFtZSBtb2RlLiAgICAgICAqLwogCiB9IEFBQ0VOQ19CSVRSQVRFX01PREU7CiAKKyNkZWZpbmUgQUFDRU5DX0JSX01PREVfSVNfVkJSKGJyTW9kZSkgKChick1vZGUgPj0gMSkgJiYgKGJyTW9kZSA8PSA1KSkKKwogdHlwZWRlZiBlbnVtIHsKIAotICBDSF9PUkRFUl9NUEVHID0gMCwgIC8qITwgTVBFRyBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEMsIEwsIFIsIFNMLCBTUiwgTEZFKSAgICAgICAgICAgKi8KLSAgQ0hfT1JERVJfV0FWICAgICAgICAvKiE8IFdBViBmaWxlZm9ybWF0IGNoYW5uZWwgb3JkZXJpbmcgKGUuIGcuIDUuMTogTCwgUiwgQywgTEZFLCBTTCwgU1IpICovCisgIENIX09SREVSX01QRUcgPQorICAgICAgMCwgLyohPCBNUEVHIGNoYW5uZWwgb3JkZXJpbmcgKGUuIGcuIDUuMTogQywgTCwgUiwgU0wsIFNSLCBMRkUpICAgICAgICovCisgIENIX09SREVSX1dBViAvKiE8IFdBViBmaWxlZm9ybWF0IGNoYW5uZWwgb3JkZXJpbmcgKGUuIGcuIDUuMTogTCwgUiwgQywgTEZFLAorICAgICAgICAgICAgICAgICAgU0wsIFNSKSAqLwogCiB9IENIQU5ORUxfT1JERVI7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RydWN0dXJlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0cnVjdCBBQUNFTkNfQ09ORklHIHsKLSAgSU5UICAgc2FtcGxlUmF0ZTsgICAgICAgICAgICAgLyogZW5jb2RlciBzYW1wbGUgcmF0ZSAqLwotICBJTlQgICBiaXRSYXRlOyAgICAgICAgICAgICAgICAvKiBlbmNvZGVyIGJpdCByYXRlIGluIGJpdHMvc2VjICovCi0gIElOVCAgIGFuY0RhdGFCaXRSYXRlOyAgICAgICAgIC8qIGFkZGl0aW9uYWwgYml0cyBjb25zdW1lZCBieSBhbmMgZGF0YSBvciBzYnIgaGF2ZSB0byBiZSBjb25zaWVkZXJlZCB3aGlsZSBjb25maWd1cmF0aW9uICovCisgIElOVCBzYW1wbGVSYXRlOyAgICAgLyogZW5jb2RlciBzYW1wbGUgcmF0ZSAqLworICBJTlQgYml0UmF0ZTsgICAgICAgIC8qIGVuY29kZXIgYml0IHJhdGUgaW4gYml0cy9zZWMgKi8KKyAgSU5UIGFuY0RhdGFCaXRSYXRlOyAvKiBhZGRpdGlvbmFsIGJpdHMgY29uc3VtZWQgYnkgYW5jIGRhdGEgb3Igc2JyIGhhdmUgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zaWVkZXJlZCB3aGlsZSBjb25maWd1cmF0aW9uICovCiAKLSAgSU5UICAgblN1YkZyYW1lczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGZyYW1lcyBpbiBzdXBlciBmcmFtZSAobm90IEFEVFMvTEFUTSBzdWJmcmFtZXMgISkgKi8KLSAgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlOyAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlICAqLworICBJTlQgblN1YkZyYW1lczsgLyogbnVtYmVyIG9mIGZyYW1lcyBpbiBzdXBlciBmcmFtZSAobm90IEFEVFMvTEFUTSBzdWJmcmFtZXMgISkKKyAgICAgICAgICAgICAgICAgICAqLworICBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGU7IC8qIEF1ZGlvIE9iamVjdCBUeXBlICAqLwogCi0gIElOVCAgIGF2ZXJhZ2VCaXRzOyAgICAgICAgICAgIC8qIGVuY29kZXIgYml0IHJhdGUgaW4gYml0cy9zdXBlcmZyYW1lICovCi0gIElOVCAgIGJpdHJhdGVNb2RlOyAgICAgICAgICAgIC8qIGVuY29kZXIgYml0cmF0ZSBtb2RlIChDQlIvVkJSKSAqLwotICBJTlQgICBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgdG8gcHJvY2VzcyAqLwotICBDSEFOTkVMX09SREVSIGNoYW5uZWxPcmRlcjsgICAvKiBJbnB1dCBDaGFubmVsIG9yZGVyaW5nIHNjaGVtZS4gKi8KLSAgSU5UICAgYmFuZFdpZHRoOyAgICAgICAgICAgICAgLyogdGFyZ2V0ZWQgYXVkaW8gYmFuZHdpZHRoIGluIEh6ICovCi0gIENIQU5ORUxfTU9ERSAgY2hhbm5lbE1vZGU7ICAgIC8qIGVuY29kZXIgY2hhbm5lbCBtb2RlIGNvbmZpZ3VyYXRpb24gKi8KLSAgSU5UICAgZnJhbWVsZW5ndGg7ICAgICAgICAgICAgLyogdXNlZCBmcmFtZSBzaXplICovCisgIElOVCBhdmVyYWdlQml0czsgICAgICAgICAgICAgICAgIC8qIGVuY29kZXIgYml0IHJhdGUgaW4gYml0cy9zdXBlcmZyYW1lICovCisgIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGU7IC8qIGVuY29kZXIgYml0cmF0ZSBtb2RlIChDQlIvVkJSKSAqLworICBJTlQgbkNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgdG8gcHJvY2VzcyAqLworICBDSEFOTkVMX09SREVSIGNoYW5uZWxPcmRlcjsgICAgICAvKiBpbnB1dCBDaGFubmVsIG9yZGVyaW5nIHNjaGVtZS4gKi8KKyAgSU5UIGJhbmRXaWR0aDsgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0ZWQgYXVkaW8gYmFuZHdpZHRoIGluIEh6ICovCisgIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZTsgICAgICAgIC8qIGVuY29kZXIgY2hhbm5lbCBtb2RlIGNvbmZpZ3VyYXRpb24gKi8KKyAgSU5UIGZyYW1lbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyogdXNlZCBmcmFtZSBzaXplICovCiAKLSAgVUlOVCAgc3ludGF4RmxhZ3M7ICAgICAgICAgICAgLyogYml0c3RyZWFtcyBzeW50YXggY29uZmlndXJhdGlvbiAqLwotICBTQ0hBUiBlcENvbmZpZzsgICAgICAgICAgICAgICAvKiBlcnJvciBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgVUlOVCBzeW50YXhGbGFnczsgLyogYml0c3RyZWFtcyBzeW50YXggY29uZmlndXJhdGlvbiAqLworICBTQ0hBUiBlcENvbmZpZzsgICAvKiBlcnJvciBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gKi8KIAotICBJTlQgICBhbmNfUmF0ZTsgICAgICAgICAgICAgICAvKiBhbmNpbGxhcnkgcmF0ZSwgMCAoZGlzYWJsZWQpLCAtMSAoZGVmYXVsdCkgZWxzZSBkZXNpcmVkIHJhdGUgKi8KLSAgVUlOVCAgbWF4QW5jQnl0ZXNQZXJBVTsKLSAgSU5UICAgbWluQml0c1BlckZyYW1lOyAgICAgICAgLyogbWluaW11bSBudW1iZXIgb2YgYml0cyBpbiBBVSAqLwotICBJTlQgICBtYXhCaXRzUGVyRnJhbWU7ICAgICAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGluIEFVICovCi0gIElOVCAgIGJpdHJlc2Vydm9pcjsgICAgICAgICAgIC8qIHNpemUgb2YgYml0cmVzZXJ2b2lyICovCisgIElOVCBhbmNfUmF0ZTsgLyogYW5jaWxsYXJ5IHJhdGUsIDAgKGRpc2FibGVkKSwgLTEgKGRlZmF1bHQpIGVsc2UgZGVzaXJlZCByYXRlCisgICAgICAgICAgICAgICAgICovCisgIFVJTlQgbWF4QW5jQnl0ZXNQZXJBVTsKKyAgSU5UIG1pbkJpdHNQZXJGcmFtZTsgLyogbWluaW11bSBudW1iZXIgb2YgYml0cyBpbiBBVSAqLworICBJTlQgbWF4Qml0c1BlckZyYW1lOyAvKiBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGluIEFVICovCiAKLSAgSU5UICAgYXVkaW9NdXhWZXJzaW9uOyAgICAgICAgLyogYXVkaW8gbXV4IHZlcnNpb24gaW4gbG9hcy9sYXRtIHRyYW5zcG9ydCBmb3JtYXQgKi8KKyAgSU5UIGF1ZGlvTXV4VmVyc2lvbjsgLyogYXVkaW8gbXV4IHZlcnNpb24gaW4gbG9hcy9sYXRtIHRyYW5zcG9ydCBmb3JtYXQgKi8KIAotICBVSU5UICBzYnJSYXRpbzsgICAgICAgICAgICAgICAvKiBzYnIgc2FtcGxpbmcgcmF0ZSByYXRpbzogZHVhbC0gb3Igc2luZ2xlLXJhdGUgKi8KKyAgVUlOVCBzYnJSYXRpbzsgLyogc2JyIHNhbXBsaW5nIHJhdGUgcmF0aW86IGR1YWwtIG9yIHNpbmdsZS1yYXRlICovCiAKLSAgVUNIQVIgdXNlVG5zOyAgICAgICAgICAgICAgICAgLyogZmxhZzogdXNlIHRlbXBvcmFsIG5vaXNlIHNoYXBpbmcgKi8KLSAgVUNIQVIgdXNlUG5zOyAgICAgICAgICAgICAgICAgLyogZmxhZzogdXNlIHBlcmNlcHR1YWwgbm9pc2Ugc3Vic3RpdHV0aW9uICovCi0gIFVDSEFSIHVzZUlTOyAgICAgICAgICAgICAgICAgIC8qIGZsYWc6IHVzZSBpbnRlbnNpdHkgY29kaW5nICovCisgIFVDSEFSIHVzZVRuczsgLyogZmxhZzogdXNlIHRlbXBvcmFsIG5vaXNlIHNoYXBpbmcgKi8KKyAgVUNIQVIgdXNlUG5zOyAvKiBmbGFnOiB1c2UgcGVyY2VwdHVhbCBub2lzZSBzdWJzdGl0dXRpb24gKi8KKyAgVUNIQVIgdXNlSVM7ICAvKiBmbGFnOiB1c2UgaW50ZW5zaXR5IGNvZGluZyAqLworICBVQ0hBUiB1c2VNUzsgIC8qIGZsYWc6IHVzZSBtcyBzdGVyZW8gdG9vbCAqLwogCi0gIFVDSEFSIHVzZVJlcXVhbnQ7ICAgICAgICAgICAgIC8qIGZsYWc6IHVzZSBhZnRlcmJ1cm5lciAqLworICBVQ0hBUiB1c2VSZXF1YW50OyAvKiBmbGFnOiB1c2UgYWZ0ZXJidXJuZXIgKi8KKworICBVSU5UIGRvd25zY2FsZUZhY3RvcjsKIH07CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgVUNIQVIgICAgICAgICAgICAqcERhdGE7ICAgICAgLyogcG9pbnRlciB0byBleHRlbnNpb24gcGF5bG9hZCBkYXRhICovCi0gIFVJTlQgICAgICAgICAgICAgIGRhdGFTaXplOyAgIC8qIGV4dGVuc2lvbiBwYXlsb2FkIGRhdGEgc2l6ZSBpbiBiaXRzICovCi0gIEVYVF9QQVlMT0FEX1RZUEUgIGRhdGFUeXBlOyAgIC8qIGV4dGVuc2lvbiBwYXlsb2FkIGRhdGEgdHlwZSAqLwotICBJTlQgICAgICAgICAgICAgICBhc3NvY2lhdGVkQ2hFbGVtZW50OyAgLyogbnVtYmVyIG9mIHRoZSBjaGFubmVsIGVsZW1lbnQgdGhlIGRhdGEgaXMgYXNzaWduZWQgdG8gKi8KKyAgVUNIQVIgKnBEYXRhOyAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBleHRlbnNpb24gcGF5bG9hZCBkYXRhICovCisgIFVJTlQgZGF0YVNpemU7ICAgICAgICAgICAgIC8qIGV4dGVuc2lvbiBwYXlsb2FkIGRhdGEgc2l6ZSBpbiBiaXRzICovCisgIEVYVF9QQVlMT0FEX1RZUEUgZGF0YVR5cGU7IC8qIGV4dGVuc2lvbiBwYXlsb2FkIGRhdGEgdHlwZSAqLworICBJTlQgYXNzb2NpYXRlZENoRWxlbWVudDsgLyogbnVtYmVyIG9mIHRoZSBjaGFubmVsIGVsZW1lbnQgdGhlIGRhdGEgaXMgYXNzaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvICovCiB9IEFBQ0VOQ19FWFRfUEFZTE9BRDsKIAogdHlwZWRlZiBzdHJ1Y3QgQUFDX0VOQyAqSEFORExFX0FBQ19FTkM7CiAKIC8qKgotICogXGJyaWVmIENhbGN1bGF0ZSBmcmFtZXNpemUgaW4gYml0cyBmb3IgZ2l2ZW4gYml0IHJhdGUsIGZyYW1lIGxlbmd0aCBhbmQgc2FtcGxpbmcgcmF0ZS4KKyAqIFxicmllZiBDYWxjdWxhdGUgZnJhbWVzaXplIGluIGJpdHMgZm9yIGdpdmVuIGJpdCByYXRlLCBmcmFtZSBsZW5ndGggYW5kCisgKiBzYW1wbGluZyByYXRlLgogICoKICAqIFxwYXJhbSBiaXRSYXRlICAgICAgICAgICAgICAgVHRhcmdldCBiaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZC4KICAqIFxwYXJhbSBmcmFtZUxlbmd0aCAgICAgICAgICAgTnVtYmVyIG9mIGF1ZGlvIHNhbXBsZXMgaW4gb25lIGZyYW1lLgogICogXHBhcmFtIHNhbXBsaW5nUmF0ZSAgICAgICAgICBTYW1wbGluZyByYXRlIGluIEh6LgogICoKICAqIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICAgRnJhbWVzaXplIGluIGJpdHMgcGVyIGZyYW1lLgotKi8KLUlOVCBGREthYWNFbmNfQ2FsY0JpdHNQZXJGcmFtZSgKLSAgICAgICAgY29uc3QgSU5UIGJpdFJhdGUsCi0gICAgICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZQotICAgICAgICApOworICovCitJTlQgRkRLYWFjRW5jX0NhbGNCaXRzUGVyRnJhbWUoY29uc3QgSU5UIGJpdFJhdGUsIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxpbmdSYXRlKTsKIAogLyoqCi0gKiBcYnJpZWYgQ2FsY3VsYXRlIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kIGZvciBnaXZlbiBmcmFtZXNpemUsIGZyYW1lIGxlbmd0aCBhbmQgc2FtcGxpbmcgcmF0ZS4KKyAqIFxicmllZiBDYWxjdWxhdGUgYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQgZm9yIGdpdmVuIGZyYW1lc2l6ZSwgZnJhbWUgbGVuZ3RoCisgKiBhbmQgc2FtcGxpbmcgcmF0ZS4KICAqCi0gKiBccGFyYW0gYml0c1BlckZyYW1lICAgICAgICAgIEZyYW1lc2l6ZSBpbiBiaXRzIHBlciBmcmFtZS4KKyAqIFxwYXJhbSBiaXRzUGVyRnJhbWUgICAgICAgICAgRnJhbWVzaXplIGluIGJpdHMgcGVyIGZyYW1lCiAgKiBccGFyYW0gZnJhbWVMZW5ndGggICAgICAgICAgIE51bWJlciBvZiBhdWRpbyBzYW1wbGVzIGluIG9uZSBmcmFtZS4KICAqIFxwYXJhbSBzYW1wbGluZ1JhdGUgICAgICAgICAgU2FtcGxpbmcgcmF0ZSBpbiBIei4KICAqCiAgKiBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgIEJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLgotKi8KLUlOVCBGREthYWNFbmNfQ2FsY0JpdHJhdGUoCi0gICAgICAgIGNvbnN0IElOVCBiaXRzUGVyRnJhbWUsCi0gICAgICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZQotICAgICAgICApOworICovCitJTlQgRkRLYWFjRW5jX0NhbGNCaXRyYXRlKGNvbnN0IElOVCBiaXRzUGVyRnJhbWUsIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSk7CiAKIC8qKgogICogXGJyaWVmIExpbWl0IGdpdmVuIGJpdCByYXRlIHRvIGEgdmFsaWQgdmFsdWUKICAqIFxwYXJhbSBoVHBFbmMgdHJhbnNwb3J0IGVuY29kZXIgaGFuZGxlCisgKiBccGFyYW0gYW90IGF1ZGlvIG9iamVjdCB0eXBlCiAgKiBccGFyYW0gY29yZVNhbXBsaW5nUmF0ZSB0aGUgc2FtcGxlIHJhdGUgdG8gYmUgdXNlZCBmb3IgdGhlIEFBQyBlbmNvZGVyCiAgKiBccGFyYW0gZnJhbWVMZW5ndGggdGhlIGZyYW1lTGVuZ3RoIHRvIGJlIHVzZWQgZm9yIHRoZSBBQUMgZW5jb2RlcgogICogXHBhcmFtIG5DaGFubmVscyBudW1iZXIgb2YgdG90YWwgY2hhbm5lbHMKICAqIFxwYXJhbSBuQ2hhbm5lbHNFZmYgbnVtYmVyIG9mIGVmZmVjdGl2ZSBjaGFubmVscwotICogXHBhcmFtIGJpdFJhdGUgdGhlIGluaXRpYWwgYml0IHJhdGUgdmFsdWUgZm9yIHdoaWNoIHRoZSBjbG9zZXN0IHZhbGlkIGJpdCByYXRlIHZhbHVlIGlzIHNlYXJjaGVkIGZvcgotICogXHBhcmFtIGF2ZXJhZ2VCaXRzIGF2ZXJhZ2UgYml0cyBwZXIgZnJhbWUgZm9yIGZpeGVkIGZyYW1pbmcuIFNldCB0byAtMSBpZiBub3QgYXZhaWxhYmxlLgorICogXHBhcmFtIGJpdFJhdGUgdGhlIGluaXRpYWwgYml0IHJhdGUgdmFsdWUgZm9yIHdoaWNoIHRoZSBjbG9zZXN0IHZhbGlkIGJpdAorICogcmF0ZSB2YWx1ZSBpcyBzZWFyY2hlZCBmb3IKKyAqIFxwYXJhbSBhdmVyYWdlQml0cyBhdmVyYWdlIGJpdHMgcGVyIGZyYW1lIGZvciBmaXhlZCBmcmFtaW5nLiBTZXQgdG8gLTEgaWYgbm90CisgKiBhdmFpbGFibGUuCiAgKiBccGFyYW0gb3B0aW9uYWwgcG9pbnRlciB3aGVyZSB0aGUgY3VycmVudCBiaXRzIHBlciBmcmFtZSBhcmUgc3RvcmVkIGludG8uCiAgKiBccGFyYW0gYml0cmF0ZU1vZGUgdGhlIGN1cnJlbnQgYml0IHJhdGUgbW9kZQotICogXHBhcmFtIG5TdWJGcmFtZXMgbnVtYmVyIG9mIHN1YiBmcmFtZXMgZm9yIHN1cGVyIGZyYW1pbmcgKG5vdCB0cmFuc3BvcnQgZnJhbWVzKS4KKyAqIFxwYXJhbSBuU3ViRnJhbWVzIG51bWJlciBvZiBzdWIgZnJhbWVzIGZvciBzdXBlciBmcmFtaW5nIChub3QgdHJhbnNwb3J0CisgKiBmcmFtZXMpLgogICogXHJldHVybiBhIHZhbGlkIGJpdCByYXRlIHZhbHVlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIG9yIGlkZW50aWNhbCB0byBiaXRSYXRlCiAgKi8KLUlOVCBGREthYWNFbmNfTGltaXRCaXRyYXRlKAotICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKLSAgICAgICAgSU5UIGNvcmVTYW1wbGluZ1JhdGUsCi0gICAgICAgIElOVCBmcmFtZUxlbmd0aCwKLSAgICAgICAgSU5UIG5DaGFubmVscywKLSAgICAgICAgSU5UIG5DaGFubmVsc0VmZiwKLSAgICAgICAgSU5UIGJpdFJhdGUsCi0gICAgICAgIElOVCBhdmVyYWdlQml0cywKLSAgICAgICAgSU5UICpwQXZlcmFnZUJpdHNQZXJGcmFtZSwKLSAgICAgICAgSU5UIGJpdHJhdGVNb2RlLAotICAgICAgICBJTlQgblN1YkZyYW1lcwotICAgICAgICApOworSU5UIEZES2FhY0VuY19MaW1pdEJpdHJhdGUoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjb3JlU2FtcGxpbmdSYXRlLCBJTlQgZnJhbWVMZW5ndGgsIElOVCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbkNoYW5uZWxzRWZmLCBJTlQgYml0UmF0ZSwgSU5UIGF2ZXJhZ2VCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwQXZlcmFnZUJpdHNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGUsIElOVCBuU3ViRnJhbWVzKTsKIAotIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qKgorICogXGJyaWVmIEdldCBjdXJyZW50IHN0YXRlIG9mIHRoZSBiaXQgcmVzZXJ2b2lyCisgKiBccGFyYW0gaEFhY0VuY29kZXIgZW5jb2RlciBoYW5kbGUKKyAqIFxyZXR1cm4gYml0IHJlc2Vydm9pciBzdGF0ZSBpbiBiaXRzCisgKi8KK0lOVCBGREthYWNFbmNfR2V0Qml0UmVzZXJ2b2lyU3RhdGUoY29uc3QgSEFORExFX0FBQ19FTkMgaEFhY0VuY29kZXIpOwogCi0gICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0dldFZCUkJpdHJhdGUKLSAgICAgZGVzY3JpcHRpb246ICBHZXQgVkJSIGJpdHJhdGUgZnJvbSB2YnIgcXVhbGl0eQotICAgICBpbnB1dCBwYXJhbXM6IGludCB2YnJRdWFsaXR5IChWQlIwLCBWQlIxLCBWQlIyKQotICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNb2RlCi0gICAgIHJldHVybnM6ICAgICAgdmJyIGJpdHJhdGUKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gSU5UIEZES2FhY0VuY19HZXRWQlJCaXRyYXRlKElOVCBiaXRyYXRlTW9kZSwgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlKTsKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19HZXRWQlJCaXRyYXRlCisgICAgZGVzY3JpcHRpb246ICBHZXQgVkJSIGJpdHJhdGUgZnJvbSB2YnIgcXVhbGl0eQorICAgIGlucHV0IHBhcmFtczogaW50IHZiclF1YWxpdHkgKFZCUjAsIFZCUjEsIFZCUjIpCisgICAgICAgICAgICAgICAgICBjaGFubmVsTW9kZQorICAgIHJldHVybnM6ICAgICAgdmJyIGJpdHJhdGUKIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0lOVCBGREthYWNFbmNfR2V0VkJSQml0cmF0ZShBQUNFTkNfQklUUkFURV9NT0RFIGJpdHJhdGVNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzA1LDI2ICszNDAsMjcgQEAKICAgICAgcmV0dXJuczogICAgICAtLS0KIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZES2FhY0VuY19BYWNJbml0RGVmYXVsdENvbmZpZyhBQUNFTkNfQ09ORklHICAgICAqY29uZmlnKTsKK3ZvaWQgRkRLYWFjRW5jX0FhY0luaXREZWZhdWx0Q29uZmlnKEFBQ0VOQ19DT05GSUcgKmNvbmZpZyk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLQkgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19PcGVuCisgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19PcGVuCiAgICAgZGVzY3JpcHRpb246IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGVuY29kZXIgaW5zdGFuY2UKICAgICByZXR1cm5zOiAgICAgMCBpZiBzdWNjZXNzCiAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19PcGVuKEhBTkRMRV9BQUNfRU5DICAqcGhBYWNFbmMsICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGFuIGVuY29kZXIgaGFuZGxlLCBpbml0aWFsaXplZCBvbiByZXR1cm4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbkVsZW1lbnRzLCAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbWF4aW1hbCBlbGVtZW50cyBpbiBpbnN0YW5jZSB0byBzdXBwb3J0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5DaGFubmVscywgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG1heGltYWwgY2hhbm5lbHMgaW4gaW5zdGFuY2UgdG8gc3VwcG9ydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuU3ViRnJhbWVzKTsgICAgICAgICAgIC8qIHN1cHBvcnQgc3VwZXJmcmFtaW5nIGluIGluc3RhbmNlICovCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfT3BlbigKKyAgICBIQU5ETEVfQUFDX0VOQworICAgICAgICAqcGhBYWNFbmMsIC8qIHBvaW50ZXIgdG8gYW4gZW5jb2RlciBoYW5kbGUsIGluaXRpYWxpemVkIG9uIHJldHVybiAqLworICAgIGNvbnN0IElOVCBuRWxlbWVudHMsIC8qIG51bWJlciBvZiBtYXhpbWFsIGVsZW1lbnRzIGluIGluc3RhbmNlIHRvIHN1cHBvcnQgKi8KKyAgICBjb25zdCBJTlQgbkNoYW5uZWxzLCAvKiBudW1iZXIgb2YgbWF4aW1hbCBjaGFubmVscyBpbiBpbnN0YW5jZSB0byBzdXBwb3J0ICovCisgICAgY29uc3QgSU5UIG5TdWJGcmFtZXMpOyAvKiBzdXBwb3J0IHN1cGVyZnJhbWluZyBpbiBpbnN0YW5jZSAqLwogCi0KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0aWFsaXplKEhBTkRMRV9BQUNfRU5DICAgICBoQWFjRW5jb2RlciwgICAvKiBwb2ludGVyIHRvIGFuIGVuY29kZXIgaGFuZGxlLCBpbml0aWFsaXplZCBvbiByZXR1cm4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0VOQ19DT05GSUcgICAgKmNvbmZpZywgICAgICAgICAvKiBwcmUtaW5pdGlhbGl6ZWQgY29uZmlnIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgICAgICAgICAgICAgIGluaXRGbGFncyk7Ci0KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0aWFsaXplKAorICAgIEhBTkRMRV9BQUNfRU5DCisgICAgICAgIGhBYWNFbmNvZGVyLCAvKiBwb2ludGVyIHRvIGFuIGVuY29kZXIgaGFuZGxlLCBpbml0aWFsaXplZCBvbiByZXR1cm4gKi8KKyAgICBBQUNFTkNfQ09ORklHICpjb25maWcsIC8qIHByZS1pbml0aWFsaXplZCBjb25maWcgc3RydWN0ICovCisgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsIFVMT05HIGluaXRGbGFncyk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTMzNCwxMiArMzcwLDExIEBACiAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0VuY29kZUZyYW1lKCBIQU5ETEVfQUFDX0VOQyAgICAgICBoQWFjRW5jLCAgICAgICAgIC8qIGVuY29kZXIgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSogICAgICAgICAgICAgaW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogICAgICAgICAgICAgICAgIG51bU91dEJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfRVhUX1BBWUxPQUQgICBleHRQYXlsb2FkW01BWF9UT1RBTF9FWFRfUEFZTE9BRFNdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0VuY29kZUZyYW1lKAorICAgIEhBTkRMRV9BQUNfRU5DIGhBYWNFbmMsIC8qIGVuY29kZXIgaGFuZGxlICovCisgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsIElOVF9QQ00gKmlucHV0QnVmZmVyLAorICAgIGNvbnN0IFVJTlQgaW5wdXRCdWZmZXJCdWZTaXplLCBJTlQgKm51bU91dEJ5dGVzLAorICAgIEFBQ0VOQ19FWFRfUEFZTE9BRCBleHRQYXlsb2FkW01BWF9UT1RBTF9FWFRfUEFZTE9BRFNdKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzQ5LDExICszODQsMTAgQEAKIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIEZES2FhY0VuY19DbG9zZSggSEFORExFX0FBQ19FTkMqICBwaEFhY0VuYyk7ICAgLyogZW5jb2RlciBoYW5kbGUgKi8KK3ZvaWQgRkRLYWFjRW5jX0Nsb3NlKEhBTkRMRV9BQUNfRU5DICpwaEFhY0VuYyk7IC8qIGVuY29kZXIgaGFuZGxlICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCiAKLSNlbmRpZiAvKiBfYWFjZW5jX2hfICovCi0KKyNlbmRpZiAvKiBBQUNFTkNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hYWNlbmNfbGliLmNwcCBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX2xpYi5jcHAKaW5kZXggNjQ0NDViOS4uMTFkYjNkYSAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hYWNlbmNfbGliLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2FhY2VuY19saWIuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctNCBIRS1BQUMgRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBMb2h3YXNzZXIKLSAgY29udGVudHMvZGVzY3JpcHRpb246IEZESyBIRS1BQUMgRW5jb2RlciBpbnRlcmZhY2UgbGlicmFyeSBmdW5jdGlvbnMKKyAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBGREsgSEUtQUFDIEVuY29kZXIgaW50ZXJmYWNlIGxpYnJhcnkgZnVuY3Rpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJhYWNlbmNfbGliLmgiCiAjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCkBAIC05Niw5ICsxMDgsOSBAQAogI2luY2x1ZGUgIkZES19jb3JlLmgiIC8qIEZES190b29scyB2ZXJzaW9uaW5nIGluZm8gKi8KIAogLyogRW5jb2RlciBsaWJyYXJ5IGluZm8gKi8KLSNkZWZpbmUgQUFDRU5DT0RFUl9MSUJfVkwwIDMKLSNkZWZpbmUgQUFDRU5DT0RFUl9MSUJfVkwxIDQKLSNkZWZpbmUgQUFDRU5DT0RFUl9MSUJfVkwyIDIyCisjZGVmaW5lIEFBQ0VOQ09ERVJfTElCX1ZMMCA0CisjZGVmaW5lIEFBQ0VOQ09ERVJfTElCX1ZMMSAwCisjZGVmaW5lIEFBQ0VOQ09ERVJfTElCX1ZMMiAwCiAjZGVmaW5lIEFBQ0VOQ09ERVJfTElCX1RJVExFICJBQUMgRW5jb2RlciIKICNpZmRlZiBfX0FORFJPSURfXwogI2RlZmluZSBBQUNFTkNPREVSX0xJQl9CVUlMRF9EQVRFICIiCkBAIC0xMDgsOSArMTIwLDEwIEBACiAjZGVmaW5lIEFBQ0VOQ09ERVJfTElCX0JVSUxEX1RJTUUgX19USU1FX18KICNlbmRpZgogCisjaW5jbHVkZSAicGNtX3V0aWxzLmgiCiAKICNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgotI2luY2x1ZGUgIi4uL3NyYy9zYnJfcmFtLmgiCisjaW5jbHVkZSAiLi4vc3JjL3NicmVuY19yYW0uaCIKICNpbmNsdWRlICJjaGFubmVsX21hcC5oIgogCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCkBAIC0xMTksMjYwICsxMzIsMjk3IEBACiAjaW5jbHVkZSAidHBlbmNfbGliLmgiCiAKICNpbmNsdWRlICJtZXRhZGF0YV9tYWluLmgiCisjaW5jbHVkZSAibXBzX21haW4uaCIKKyNpbmNsdWRlICJzYWNlbmNfbGliLmgiCiAKLSNkZWZpbmUgU0JMKGZsKSAgICAgICAgICAgIChmbC84KSAgICAgICAgICAgICAgICAgLyohPCBTaG9ydCBibG9jayBsZW5ndGggKGhhcmRjb2RlZCB0byA4IHNob3J0IGJsb2NrcyBwZXIgbG9uZyBibG9jaykgKi8KLSNkZWZpbmUgQlNMQShmbCkgICAgICAgICAgICg0KlNCTChmbCkrU0JMKGZsKS8yKSAgLyohPCBBQUMgYmxvY2sgc3dpdGNoaW5nIGxvb2stYWhlYWQgKi8KLSNkZWZpbmUgREVMQVlfQUFDKGZsKSAgICAgIChmbCtCU0xBKGZsKSkgICAgICAgICAgLyohPCBNRENUICsgYmxvY2tzd2l0Y2hpbmcgKi8KLSNkZWZpbmUgREVMQVlfQUFDRUxEKGZsKSAgICgoZmwpLzIpICAgICAgICAgICAgICAgLyohPCBFTEQgRkIgZGVsYXkgKG5vIGZyYW1pbmcgZGVsYXkgaW5jbHVkZWQpICovCisjZGVmaW5lIFNCTChmbCkgXAorICAoZmwgLyAgICAgICAgIFwKKyAgIDgpIC8qITwgU2hvcnQgYmxvY2sgbGVuZ3RoIChoYXJkY29kZWQgdG8gOCBzaG9ydCBibG9ja3MgcGVyIGxvbmcgYmxvY2spICovCisjZGVmaW5lIEJTTEEoZmwpIFwKKyAgKDQgKiBTQkwoZmwpICsgU0JMKGZsKSAvIDIpICAgICAgICAgLyohPCBBQUMgYmxvY2sgc3dpdGNoaW5nIGxvb2stYWhlYWQgKi8KKyNkZWZpbmUgREVMQVlfQUFDKGZsKSAoZmwgKyBCU0xBKGZsKSkgLyohPCBNRENUICsgYmxvY2tzd2l0Y2hpbmcgKi8KKyNkZWZpbmUgREVMQVlfQUFDTEQoZmwpIChmbCkgLyohPCBNRENUIGRlbGF5IChubyBmcmFtaW5nIGRlbGF5IGluY2x1ZGVkKSAqLworI2RlZmluZSBERUxBWV9BQUNFTEQoZmwpIFwKKyAgKChmbCkgLyAyKSAvKiE8IEVMRCBGQiBkZWxheSAobm8gZnJhbWluZyBkZWxheSBpbmNsdWRlZCkgKi8KIAotI2RlZmluZSBJTlBVVEJVRkZFUl9TSVpFICgxNTM3KzEwMCsyMDQ4KQorI2RlZmluZSBNQVhfRFNfREVMQVkgKDEwMCkgLyohPCBNYXhpbXVtIGRvd25zYW1wbGVyIGRlbGF5IGluIFNCUi4gKi8KKyNkZWZpbmUgSU5QVVRCVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgyICogKDEwMjQpICsgTUFYX0RTX0RFTEFZICsgMTUzNykgLyohPCBBdWRpbyBpbnB1dCBzYW1wbGVzICsgZG93bnNhbXBsZXIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5ICsgc2JyL2FhYyBkZWxheSBjb21wZW5zYXRpb24gKi8KIAotI2RlZmluZSBERUZBVUxUX0hFQURFUl9QRVJJT0RfUkVQRVRJVElPTl9SQVRFICAxMCAvKiE8IERlZmF1bHQgaGVhZGVyIHJlcGV0aXRpb24gcmF0ZSB1c2VkIGluIHRyYW5zcG9ydCBsaWJyYXJ5IGFuZCBmb3IgU0JSIGhlYWRlci4gKi8KKyNkZWZpbmUgREVGQVVMVF9IRUFERVJfUEVSSU9EX1JFUEVUSVRJT05fUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDEwIC8qITwgRGVmYXVsdCBoZWFkZXIgcmVwZXRpdGlvbiByYXRlIHVzZWQgaW4gdHJhbnNwb3J0IGxpYnJhcnkgYW5kIGZvciBTQlIgXAorICAgICAgICBoZWFkZXIuICovCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLyoqCiAgKiBGbGFncyB0byBjaGFyYWN0ZXJpemUgZW5jb2RlciBtb2R1bGVzIHRvIGJlIHN1cHBvcnRlZCBpbiBwcmVzZW50IGluc3RhbmNlLgogICovCiBlbnVtIHsKLSAgICBFTkNfTU9ERV9GTEFHX0FBQyAgPSAweDAwMDEsCi0gICAgRU5DX01PREVfRkxBR19TQlIgID0gMHgwMDAyLAotICAgIEVOQ19NT0RFX0ZMQUdfUFMgICA9IDB4MDAwNCwKLSAgICBFTkNfTU9ERV9GTEFHX1NBQyAgPSAweDAwMDgsCi0gICAgRU5DX01PREVfRkxBR19NRVRBID0gMHgwMDEwCisgIEVOQ19NT0RFX0ZMQUdfQUFDID0gMHgwMDAxLAorICBFTkNfTU9ERV9GTEFHX1NCUiA9IDB4MDAwMiwKKyAgRU5DX01PREVfRkxBR19QUyA9IDB4MDAwNCwKKyAgRU5DX01PREVfRkxBR19TQUMgPSAweDAwMDgsCisgIEVOQ19NT0RFX0ZMQUdfTUVUQSA9IDB4MDAxMAogfTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgQVVESU9fT0JKRUNUX1RZUEUgdXNlckFPVDsgICAgICAgICAgICAgICAvKiE8IEF1ZGlvIE9iamVjdCBUeXBlLiAgICAgICAgICAgICAqLwotICAgIFVJTlQgICAgICAgICAgICAgIHVzZXJTYW1wbGVyYXRlOyAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kuICAgICAgICAgICAgKi8KLSAgICBVSU5UICAgICAgICAgICAgICBuQ2hhbm5lbHM7ICAgICAgICAgICAgIC8qITwgd2lsbCBiZSBzZXQgdmlhIGNoYW5uZWxNb2RlLiAgICovCi0gICAgQ0hBTk5FTF9NT0RFICAgICAgdXNlckNoYW5uZWxNb2RlOwotICAgIFVJTlQgICAgICAgICAgICAgIHVzZXJCaXRyYXRlOwotICAgIFVJTlQgICAgICAgICAgICAgIHVzZXJCaXRyYXRlTW9kZTsKLSAgICBVSU5UICAgICAgICAgICAgICB1c2VyQmFuZHdpZHRoOwotICAgIFVJTlQgICAgICAgICAgICAgIHVzZXJBZnRlcmJ1cm5lcjsKLSAgICBVSU5UICAgICAgICAgICAgICB1c2VyRnJhbWVsZW5ndGg7Ci0gICAgVUlOVCAgICAgICAgICAgICAgdXNlckFuY0RhdGFSYXRlOwotICAgIFVJTlQgICAgICAgICAgICAgIHVzZXJQZWFrQml0cmF0ZTsKKyAgQVVESU9fT0JKRUNUX1RZUEUgdXNlckFPVDsgLyohPCBBdWRpbyBPYmplY3QgVHlwZS4gICAgICAgICAgICAgKi8KKyAgVUlOVCB1c2VyU2FtcGxlcmF0ZTsgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kuICAgICAgICAgICAgKi8KKyAgVUlOVCBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyohPCB3aWxsIGJlIHNldCB2aWEgY2hhbm5lbE1vZGUuICAgKi8KKyAgQ0hBTk5FTF9NT0RFIHVzZXJDaGFubmVsTW9kZTsKKyAgVUlOVCB1c2VyQml0cmF0ZTsKKyAgVUlOVCB1c2VyQml0cmF0ZU1vZGU7CisgIFVJTlQgdXNlckJhbmR3aWR0aDsKKyAgVUlOVCB1c2VyQWZ0ZXJidXJuZXI7CisgIFVJTlQgdXNlckZyYW1lbGVuZ3RoOworICBVSU5UIHVzZXJBbmNEYXRhUmF0ZTsKKyAgVUlOVCB1c2VyUGVha0JpdHJhdGU7CiAKLSAgICBVQ0hBUiAgICAgICAgICAgICB1c2VyVG5zOyAgICAgICAgICAgICAgIC8qITwgVXNlIFROUyBjb2RpbmcuICovCi0gICAgVUNIQVIgICAgICAgICAgICAgdXNlclBuczsgICAgICAgICAgICAgICAvKiE8IFVzZSBQTlMgY29kaW5nLiAqLwotICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJJbnRlbnNpdHk7ICAgICAgICAgLyohPCBVc2UgSW50ZW5zaXR5IGNvZGluZy4gKi8KKyAgVUNIQVIgdXNlclRuczsgICAgICAgLyohPCBVc2UgVE5TIGNvZGluZy4gKi8KKyAgVUNIQVIgdXNlclBuczsgICAgICAgLyohPCBVc2UgUE5TIGNvZGluZy4gKi8KKyAgVUNIQVIgdXNlckludGVuc2l0eTsgLyohPCBVc2UgSW50ZW5zaXR5IGNvZGluZy4gKi8KIAotICAgIFRSQU5TUE9SVF9UWVBFICAgIHVzZXJUcFR5cGU7ICAgICAgICAgICAgLyohPCBUcmFuc3BvcnQgdHlwZSAqLwotICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJUcFNpZ25hbGluZzsgICAgICAgLyohPCBFeHRlbnNpb24gQU9UIHNpZ25hbGluZyBtb2RlLiAqLwotICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJUcE5zdWJGcmFtZXM7ICAgICAgLyohPCBOdW1iZXIgb2Ygc3ViIGZyYW1lcyBpbiBhIHRyYW5zcG9ydCBmcmFtZSBmb3IgTE9BUy9MQVRNIG9yIEFEVFMgKGRlZmF1bHQgMSkuICovCi0gICAgVUNIQVIgICAgICAgICAgICAgdXNlclRwQW14djsgICAgICAgICAgICAvKiE8IEF1ZGlvTXV4VmVyc2lvbiB0byBiZSB1c2VkIGZvciBMQVRNIChkZWZhdWx0IDApLiAqLwotICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJUcFByb3RlY3Rpb247Ci0gICAgVUNIQVIgICAgICAgICAgICAgdXNlclRwSGVhZGVyUGVyaW9kOyAgICAvKiE8IFBhcmFtZXRlciB1c2VkIHRvIGNvbmZpZ3VyZSBMQVRNL0xPQVMgU01DIHJhdGUuIE1vcmVvdmVyIHRoaXMgcGFyYW1ldGVycyBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbmZpZ3VyZSByZXBldGl0aW9uIHJhdGUgb2YgUENFIGluIHJhd19kYXRhX2Jsb2NrLiAqLworICBUUkFOU1BPUlRfVFlQRSB1c2VyVHBUeXBlOyAvKiE8IFRyYW5zcG9ydCB0eXBlICovCisgIFVDSEFSIHVzZXJUcFNpZ25hbGluZzsgICAgIC8qITwgRXh0ZW5zaW9uIEFPVCBzaWduYWxpbmcgbW9kZS4gKi8KKyAgVUNIQVIgdXNlclRwTnN1YkZyYW1lczsgICAgLyohPCBOdW1iZXIgb2Ygc3ViIGZyYW1lcyBpbiBhIHRyYW5zcG9ydCBmcmFtZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9BUy9MQVRNIG9yIEFEVFMgKGRlZmF1bHQgMSkuICovCisgIFVDSEFSIHVzZXJUcEFteHY7IC8qITwgQXVkaW9NdXhWZXJzaW9uIHRvIGJlIHVzZWQgZm9yIExBVE0gKGRlZmF1bHQgMCkuICovCisgIFVDSEFSIHVzZXJUcFByb3RlY3Rpb247CisgIFVDSEFSIHVzZXJUcEhlYWRlclBlcmlvZDsgLyohPCBQYXJhbWV0ZXIgdXNlZCB0byBjb25maWd1cmUgTEFUTS9MT0FTIFNNQyByYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vcmVvdmVyIHRoaXMgcGFyYW1ldGVycyBpcyB1c2VkIHRvIGNvbmZpZ3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGV0aXRpb24gcmF0ZSBvZiBQQ0UgaW4gcmF3X2RhdGFfYmxvY2suICovCiAKLSAgICBVQ0hBUiAgICAgICAgICAgICB1c2VyRXJUb29sczsgICAgICAgICAgIC8qITwgVXNlIFZDQjExLCBIQ1IgYW5kL29yIFJWTEMgRVIgdG9vbC4gKi8KLSAgICBVSU5UICAgICAgICAgICAgICB1c2VyUGNlQWRkaXRpb25zOyAgICAgIC8qITwgQ29uZmlndXJlIGFkZGl0aW9uYWwgYml0cyBpbiBQQ0UuICovCisgIFVDSEFSIHVzZXJFclRvb2xzOyAgICAgLyohPCBVc2UgVkNCMTEsIEhDUiBhbmQvb3IgUlZMQyBFUiB0b29sLiAqLworICBVSU5UIHVzZXJQY2VBZGRpdGlvbnM7IC8qITwgQ29uZmlndXJlIGFkZGl0aW9uYWwgYml0cyBpbiBQQ0UuICovCiAKLSAgICBVQ0hBUiAgICAgICAgICAgICB1c2VyTWV0YURhdGFNb2RlOyAgICAgIC8qITwgTWV0YSBkYXRhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4gKi8KKyAgVUNIQVIgdXNlck1ldGFEYXRhTW9kZTsgLyohPCBNZXRhIGRhdGEgbGlicmFyeSBjb25maWd1cmF0aW9uLiAqLwogCi0gICAgVUNIQVIgICAgICAgICAgICAgdXNlclNickVuYWJsZWQ7ICAgICAgICAvKiE8IEVuYWJsZSBTQlIgZm9yIEVMRC4gKi8KLSAgICBVSU5UICAgICAgICAgICAgICB1c2VyU2JyUmF0aW87ICAgICAgICAgIC8qITwgU0JSIHNhbXBsaW5nIHJhdGUgcmF0aW8uIER1YWwtIG9yIHNpbmdsZS1yYXRlLiAqLworICBVQ0hBUiB1c2VyU2JyRW5hYmxlZDsgLyohPCBFbmFibGUgU0JSIGZvciBFTEQuICovCisgIFVJTlQgdXNlclNiclJhdGlvOyAgICAvKiE8IFNCUiBzYW1wbGluZyByYXRlIHJhdGlvLiBEdWFsLSBvciBzaW5nbGUtcmF0ZS4gKi8KKworICBVSU5UIHVzZXJEb3duc2NhbGVGYWN0b3I7CiAKIH0gVVNFUl9QQVJBTTsKIAorLyoqCisgKiAgU0JSIGV4dGVueGlvbiBwYXlsb2FkIHN0cnVjdCBwcm92aWRlcyBidWZmZXJzIHRvIGJlIGZpbGxlZCBpbiBTQlIgZW5jb2RlcgorICogbGlicmFyeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBkYXRhWygxKV1bKDgpXVtNQVhfUEFZTE9BRF9TSVpFXTsgLyohPCBleHRlbnNpb24gcGF5bG9hZCBkYXRhIGJ1ZmZlciAqLworICBVSU5UIGRhdGFTaXplWygxKV1bKDgpXTsgLyohPCBleHRlbnNpb24gcGF5bG9hZCBkYXRhIHNpemUgaW4gYml0cyAqLworfSBTQlJFTkNfRVhUX1BBWUxPQUQ7CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlIERlZmluaXRpb25zCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmIHN0cnVjdCAgQUFDRU5DX0NPTkZJRyAgICAgKkhBTkRMRV9BQUNFTkNfQ09ORklHOwordHlwZWRlZiBzdHJ1Y3QgQUFDRU5DX0NPTkZJRyAqSEFORExFX0FBQ0VOQ19DT05GSUc7CiAKK3N0cnVjdCBBQUNFTkNPREVSIHsKKyAgVVNFUl9QQVJBTSBleHRQYXJhbTsKKyAgQ09ERVJfQ09ORklHIGNvZGVyQ29uZmlnOwogCi1zdHJ1Y3QgQUFDRU5DT0RFUgotewotICAgIFVTRVJfUEFSQU0gICAgICAgICAgICAgICBleHRQYXJhbTsKLSAgICBDT0RFUl9DT05GSUcgICAgICAgICAgICAgY29kZXJDb25maWc7CisgIC8qIEFBQyAqLworICBBQUNFTkNfQ09ORklHIGFhY0NvbmZpZzsKKyAgSEFORExFX0FBQ19FTkMgaEFhY0VuYzsKIAotICAgIC8qIEFBQyAqLwotICAgIEFBQ0VOQ19DT05GSUcgICAgICAgICAgICBhYWNDb25maWc7Ci0gICAgSEFORExFX0FBQ19FTkMgICAgICAgICAgIGhBYWNFbmM7CisgIC8qIFNCUiAqLworICBIQU5ETEVfU0JSX0VOQ09ERVIgaEVudkVuYzsgICAgICAvKiBTQlIgZW5jb2RlciAqLworICBTQlJFTkNfRVhUX1BBWUxPQUQgKnBTYnJQYXlsb2FkOyAvKiBTQlIgZXh0ZW5zaW9uIHBheWxvYWQgKi8KIAotICAgIC8qIFNCUiAqLwotICAgIEhBTkRMRV9TQlJfRU5DT0RFUiAgICAgICBoRW52RW5jOworICAvKiBNZXRhIERhdGEgKi8KKyAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhZGF0YUVuYzsKKyAgSU5UIG1ldGFEYXRhQWxsb3dlZDsgLyogU2lnbmFsIHdoZXRoZXIgY2hvc2VuIGNvbmZpZ3VyYXRpb24gYWxsb3dzIG1ldGFkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgICBOZWNlc3NhcnkgZm9yIGRlbGF5IGNvbXBlbnNhdGlvbi4gTWV0YWRhdGEgbW9kZSBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlIHBhcmFtZXRlci4gKi8KIAotICAgIC8qIE1ldGEgRGF0YSAqLwotICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiAgaE1ldGFkYXRhRW5jOwotICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFBbGxvd2VkOyAvKiBTaWduYWwgd2hldGhlciBjaG9zZW4gY29uZmlndXJhdGlvbiBhbGxvd3MgbWV0YWRhdGEuIE5lY2Vzc2FyeSBmb3IgZGVsYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGVuc2F0aW9uLiBNZXRhZGF0YSBtb2RlIGlzIGEgc2VwYXJhdGUgcGFyYW1ldGVyLiAqLworICBIQU5ETEVfTVBTX0VOQ09ERVIgaE1wc0VuYzsKIAotICAgIC8qIFRyYW5zcG9ydCAqLwotICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgICAgICBoVHBFbmM7CisgIC8qIFRyYW5zcG9ydCAqLworICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYzsKIAotICAgIC8qIE91dHB1dCAqLwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICpvdXRCdWZmZXI7ICAgICAgICAgLyogSW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciAqLwotICAgIElOVCAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXJJbkJ5dGVzOyAgIC8qIFNpemUgb2YgaW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciovCisgIElOVF9QQ00KKyAgKmlucHV0QnVmZmVyOyAgICAgLyogSW50ZXJuYWwgaW5wdXQgYnVmZmVyLiBJbnB1dCBzb3VyY2UgZm9yIEFBQyBlbmNvZGVyICovCisgIFVDSEFSICpvdXRCdWZmZXI7IC8qIEludGVybmFsIGJpdHN0cmVhbSBidWZmZXIgKi8KIAotICAgIC8qIElucHV0ICovCi0gICAgSU5UX1BDTSAgICAgICAgICAgICAgICAgKmlucHV0QnVmZmVyOyAgICAgICAgLyogSW50ZXJuYWwgaW5wdXQgYnVmZmVyLiBJbnB1dCBzb3VyY2UgZm9yIEFBQyBlbmNvZGVyICovCi0gICAgSU5UICAgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyT2Zmc2V0OyAgLyogV2hlcmUgdG8gd3JpdGUgbmV3IGlucHV0IHNhbXBsZXMuICovCisgIElOVCBpbnB1dEJ1ZmZlclNpemU7ICAgICAgICAgICAvKiBTaXplIG9mIGludGVybmFsIGlucHV0IGJ1ZmZlciAqLworICBJTlQgaW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbDsgLyogU2l6ZSBvZiBpbnRlcm5hbCBpbnB1dCBidWZmZXIgcGVyIGNoYW5uZWwgKi8KKyAgSU5UIG91dEJ1ZmZlckluQnl0ZXM7ICAgICAgICAgIC8qIFNpemUgb2YgaW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciovCiAKLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgblNhbXBsZXNUb1JlYWQ7ICAgIC8qIG51bWJlciBvZiBpbnB1dCBzYW1wbGVzIG5lZWVkZWQgZm9yIGVuY29kaW5nIG9uZSBmcmFtZSAqLwotICAgIElOVCAgICAgICAgICAgICAgICAgICAgICBuU2FtcGxlc1JlYWQ7ICAgICAgLyogbnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgYWxyZWFkeSBpbiBpbnB1dCBidWZmZXIgKi8KLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgblplcm9zQXBwZW5kZWQ7ICAgIC8qIGFwcGVuZGVkIHplcm9zIGF0IGVuZCBvZiBmaWxlKi8KLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgbkRlbGF5OyAgICAgICAgICAgIC8qIGVuY29kZXIgZGVsYXkgKi8KKyAgSU5UIGlucHV0QnVmZmVyT2Zmc2V0OyAvKiBXaGVyZSB0byB3cml0ZSBuZXcgaW5wdXQgc2FtcGxlcy4gKi8KIAotICAgIEFBQ0VOQ19FWFRfUEFZTE9BRCAgICAgICBleHRQYXlsb2FkIFtNQVhfVE9UQUxfRVhUX1BBWUxPQURTXTsKLSAgICAvKiBFeHRlbnNpb24gcGF5bG9hZCAqLwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICBleHRQYXlsb2FkRGF0YSBbKDEpXVsoOCldW01BWF9QQVlMT0FEX1NJWkVdOwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICBleHRQYXlsb2FkU2l6ZSBbKDEpXVsoOCldOyAvKiBwYXlsb2FkIHNpemVzIGluIGJpdHMgKi8KKyAgSU5UIG5TYW1wbGVzVG9SZWFkOyAvKiBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcyBuZWVlZGVkIGZvciBlbmNvZGluZyBvbmUgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSU5UIG5TYW1wbGVzUmVhZDsgICAvKiBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcyBhbHJlYWR5IGluIGlucHV0IGJ1ZmZlciAqLworICBJTlQgblplcm9zQXBwZW5kZWQ7IC8qIGFwcGVuZGVkIHplcm9zIGF0IGVuZCBvZiBmaWxlKi8KKyAgSU5UIG5EZWxheTsgICAgICAgICAvKiBjb2RlYyBkZWxheSAqLworICBJTlQgbkRlbGF5Q29yZTsgICAgIC8qIGNvZGVjIGRlbGF5LCB3L28gdGhlIFNCUiBkZWNvZGVyIGRlbGF5ICovCiAKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgSW5pdEZsYWdzOyAgICAgICAgIC8qIGludGVybmFsIHN0YXR1cyB0byB0cmVnZ2llciByZS1pbml0aWFsaXphdGlvbiAqLworICBBQUNFTkNfRVhUX1BBWUxPQUQgZXh0UGF5bG9hZFtNQVhfVE9UQUxfRVhUX1BBWUxPQURTXTsKIAorICBVTE9ORyBJbml0RmxhZ3M7IC8qIGludGVybmFsIHN0YXR1cyB0byB0cmVnZ2llciByZS1pbml0aWFsaXphdGlvbiAqLwogCi0gICAvKiBNZW1vcnkgYWxsb2NhdGlvbiBpbmZvLiAqLwotICAgSU5UICAgICAgICAgICAgICAgICAgICAgICBuTWF4QWFjRWxlbWVudHM7Ci0gICBJTlQgICAgICAgICAgICAgICAgICAgICAgIG5NYXhBYWNDaGFubmVsczsKLSAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgbk1heFNickVsZW1lbnRzOwotICAgSU5UICAgICAgICAgICAgICAgICAgICAgICBuTWF4U2JyQ2hhbm5lbHM7Ci0gICBVSU5UICAgICAgICAgICAgICAgICAgICAgIG5NYXhTdWJGcmFtZXM7CisgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIGluZm8uICovCisgIElOVCBuTWF4QWFjRWxlbWVudHM7CisgIElOVCBuTWF4QWFjQ2hhbm5lbHM7CisgIElOVCBuTWF4U2JyRWxlbWVudHM7CisgIElOVCBuTWF4U2JyQ2hhbm5lbHM7CiAKLSAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlcl9tb2RpczsKKyAgVUlOVCBlbmNvZGVyX21vZGlzOwogCi0gICAvKiBDYXBhYmlsaXR5IGZsYWdzICovCi0gICBVSU5UICAgICAgICAgICAgICAgICAgICAgIENBUEZfdHBFbmM7CisgIC8qIENhcGFiaWxpdHkgZmxhZ3MgKi8KKyAgVUlOVCBDQVBGX3RwRW5jOworfTsKIAotfSA7Cit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIGlucHV0ICovCisgIFVMT05HIG5DaGFubmVsczsgICAgLyohPCBOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuICovCisgIFVMT05HIHNhbXBsaW5nUmF0ZTsgLyohPCBFbmNvZGVyIG91dHB1dCBzYW1wbGluZyByYXRlLiAqLworICBVTE9ORyBiaXRyYXRlUmFuZ2U7IC8qITwgTG93ZXIgYml0cmF0ZSByYW5nZSBmb3IgY29uZmlnIGVudHJ5LiAqLwogCi10eXBlZGVmIHN0cnVjdAotewotICAgIFVMT05HICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlOyAgIC8qITwgRW5jb2RlciBvdXRwdXQgc2FtcGxpbmcgcmF0ZS4gKi8KLSAgICBVTE9ORyAgICAgICAgICAgICAgIGJpdHJhdGVSYW5nZTsgICAvKiE8IExvd2VyIGJpdHJhdGUgcmFuZ2UgZm9yIGNvbmZpZyBlbnRyeS4gKi8KLQotICAgIFVDSEFSICAgICAgICAgICAgICAgbG93RGVsYXlTYnI7ICAgIC8qITwgMDogRUxEIHNiciBvZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBFTEQgc2JyIG9uICovCi0KLSAgICBVQ0hBUiAgICAgICAgICAgICAgIGRvd25zYW1wbGVkU2JyOyAvKiE8IDA6IEVMRCB3aXRoIGR1YWxyYXRlIHNiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IEVMRCB3aXRoIGRvd25zYW1wbGVkIHNiciAqLworICAvKiBvdXRwdXQqLworICBVQ0hBUiBzYnJNb2RlOyAgICAgICAvKiE8IDA6IEVMRCBzYnIgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IEVMRCB3aXRoIGRvd25zYW1wbGVkIHNiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBFTEQgd2l0aCBkdWFscmF0ZSBzYnIuICovCisgIENIQU5ORUxfTU9ERSBjaE1vZGU7IC8qITwgQ2hhbm5lbCBtb2RlLiAqLwogCiB9IEVMRF9TQlJfQ09ORklHVVJBVE9SOwogCiAvKioKICAqIFxicmllZiAgVGhpcyB0YWJsZSBkZWZpbmVzIEVMRC9TQlIgZGVmYXVsdCBjb25maWd1cmF0aW9ucy4KICAqLwotc3RhdGljIGNvbnN0IEVMRF9TQlJfQ09ORklHVVJBVE9SIGVsZFNickF1dG9Db25maWdUYWJbXSA9Ci17Ci0gIHsgNDgwMDAsICAgICAwLCAxLCAwIH0sCi0gIHsgNDgwMDAsIDY0MDAxLCAwLCAwIH0sCitzdGF0aWMgY29uc3QgRUxEX1NCUl9DT05GSUdVUkFUT1IgZWxkU2JyQXV0b0NvbmZpZ1RhYltdID0geworICAgIHsxLCA0ODAwMCwgMCwgMiwgTU9ERV8xfSwgICAgICB7MSwgNDgwMDAsIDY0MDAwLCAwLCBNT0RFXzF9LAogCi0gIHsgNDQxMDAsICAgICAwLCAxLCAwIH0sCi0gIHsgNDQxMDAsIDY0MDAxLCAwLCAwIH0sCisgICAgezEsIDQ0MTAwLCAwLCAyLCBNT0RFXzF9LCAgICAgIHsxLCA0NDEwMCwgNjQwMDAsIDAsIE1PREVfMX0sCiAKLSAgeyAzMjAwMCwgICAgIDAsIDEsIDAgfSwKLSAgeyAzMjAwMCwgMjgwMDAsIDEsIDEgfSwKLSAgeyAzMjAwMCwgNTYwMDAsIDAsIDAgfSwKKyAgICB7MSwgMzIwMDAsIDAsIDIsIE1PREVfMX0sICAgICAgezEsIDMyMDAwLCAyODAwMCwgMSwgTU9ERV8xfSwKKyAgICB7MSwgMzIwMDAsIDU2MDAwLCAwLCBNT0RFXzF9LAogCi0gIHsgMjQwMDAsICAgICAwLCAxLCAxIH0sCi0gIHsgMjQwMDAsIDQwMDAwLCAwLCAwIH0sCisgICAgezEsIDI0MDAwLCAwLCAxLCBNT0RFXzF9LCAgICAgIHsxLCAyNDAwMCwgNDAwMDAsIDAsIE1PREVfMX0sCiAKLSAgeyAxNjAwMCwgICAgIDAsIDEsIDEgfSwKLSAgeyAxNjAwMCwgMjgwMDAsIDAsIDAgfQorICAgIHsxLCAxNjAwMCwgMCwgMSwgTU9ERV8xfSwgICAgICB7MSwgMTYwMDAsIDI4MDAwLCAwLCBNT0RFXzF9LAorCisgICAgezEsIDE1OTk5LCAwLCAwLCBNT0RFXzF9LAorCisgICAgezIsIDQ4MDAwLCAwLCAyLCBNT0RFXzJ9LCAgICAgIHsyLCA0ODAwMCwgNDQwMDAsIDIsIE1PREVfMn0sCisgICAgezIsIDQ4MDAwLCAxMjgwMDAsIDAsIE1PREVfMn0sCisKKyAgICB7MiwgNDQxMDAsIDAsIDIsIE1PREVfMn0sICAgICAgezIsIDQ0MTAwLCA0NDAwMCwgMiwgTU9ERV8yfSwKKyAgICB7MiwgNDQxMDAsIDEyODAwMCwgMCwgTU9ERV8yfSwKKworICAgIHsyLCAzMjAwMCwgMCwgMiwgTU9ERV8yfSwgICAgICB7MiwgMzIwMDAsIDMyMDAwLCAyLCBNT0RFXzJ9LAorICAgIHsyLCAzMjAwMCwgNjgwMDAsIDEsIE1PREVfMn0sICB7MiwgMzIwMDAsIDk2MDAwLCAwLCBNT0RFXzJ9LAorCisgICAgezIsIDI0MDAwLCAwLCAxLCBNT0RFXzJ9LCAgICAgIHsyLCAyNDAwMCwgNDgwMDAsIDEsIE1PREVfMn0sCisgICAgezIsIDI0MDAwLCA4MDAwMCwgMCwgTU9ERV8yfSwKKworICAgIHsyLCAxNjAwMCwgMCwgMSwgTU9ERV8yfSwgICAgICB7MiwgMTYwMDAsIDMyMDAwLCAxLCBNT0RFXzJ9LAorICAgIHsyLCAxNjAwMCwgNjQwMDAsIDAsIE1PREVfMn0sCisKKyAgICB7MiwgMTU5OTksIDAsIDAsIE1PREVfMn0KIAogfTsKIAogLyoKICAqIFxicmllZiAgQ29uZmlndXJlIFNCUiBmb3IgRUxEIGNvbmZpZ3VyYXRpb24uCiAgKgotICogVGhpcyBmdW5jdGlvbiBmaW5kcyBkZWZhdWx0IFNCUiBjb25maWd1cmF0aW9uIGZvciBFTEQgYmFzZWQgb24gc2FtcGxpbmcgcmF0ZSBhbmQgY2hhbm5lbCBiaXRyYXRlLgotICogT3V0cHV0cGFyYW1ldGVycyBhcmUgU0JSIG9uL29mZiwgYW5kIFNCUiByYXRpby4KKyAqIFRoaXMgZnVuY3Rpb24gZmluZHMgZGVmYXVsdCBTQlIgY29uZmlndXJhdGlvbiBmb3IgRUxEIGJhc2VkIG9uIG51bWJlciBvZgorICogY2hhbm5lbHMsIHNhbXBsaW5nIHJhdGUgYW5kIGJpdHJhdGUuCiAgKgorICogXHBhcmFtIG5DaGFubmVscyAgICAgICAgICAgICBOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuCiAgKiBccGFyYW0gc2FtcGxpbmdSYXRlICAgICAgICAgIEF1ZGlvIHNpZ25hbCBzYW1wbGluZyByYXRlLgotICogXHBhcmFtIGNoYW5uZWxNb2RlICAgICAgICAgICBDaGFubmVsIGNvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZC4KLSAqIFxwYXJhbSB0b3RhbEJpdHJhdGUgICAgICAgICAgT3ZlcmFsbCBiaXRyYXRlLgotICogXHBhcmFtIGVsZFNiciAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGVsZFNiciBwYXJhbWV0ZXIsIGZpbGxlZCBvbiByZXR1cm4uCi0gKiBccGFyYW0gZWxkU2JyUmF0aW8gICAgICAgICAgIFBvaW50ZXIgdG8gZWxkU2JyUmF0aW8gcGFyYW1ldGVyLCBmaWxsZWQgb24gcmV0dXJuLgorICogXHBhcmFtIGJpdHJhdGUgICAgICAgICAgICAgICBFbmNvZGVyIGJpdHJhdGUuCiAgKgotICogXHJldHVybiAtIEFBQ0VOQ19PSywgYWxsIGZpbmUuCi0gKiAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfQ09ORklHLCBvbiBmYWlsdXJlLgorICogXHJldHVybiAtIHBvaW50ZXIgdG8gZWxkIHNiciBjb25maWd1cmF0aW9uLgorICogICAgICAgICAtIE5VTEwsIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBBQUNFTkNfRVJST1IgZWxkU2JyQ29uZmlndXJhdG9yKAotICAgICAgICBjb25zdCBVTE9ORyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCi0gICAgICAgIGNvbnN0IENIQU5ORUxfTU9ERSAgICAgICAgICAgICAgIGNoYW5uZWxNb2RlLAotICAgICAgICBjb25zdCBVTE9ORyAgICAgICAgICAgICAgICAgICAgICB0b3RhbEJpdHJhdGUsCi0gICAgICAgIFVJTlQgKiBjb25zdCAgICAgICAgICAgICAgICAgICAgIGVsZFNiciwKLSAgICAgICAgVUlOVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgZWxkU2JyUmF0aW8KLSAgICAgICAgKQotewotICAgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7Ci0gICAgaW50IGksIGNmZ0lkeCA9IC0xOwotICAgIGNvbnN0IFVMT05HIGNoYW5uZWxCaXRyYXRlID0gdG90YWxCaXRyYXRlIC8gRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbihjaGFubmVsTW9kZSktPm5DaGFubmVsc0VmZjsKK3N0YXRpYyBjb25zdCBFTERfU0JSX0NPTkZJR1VSQVRPUiAqZWxkU2JyQ29uZmlndXJhdG9yKGNvbnN0IFVMT05HIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVMT05HIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVMT05HIGJpdHJhdGUpIHsKKyAgaW50IGk7CisgIGNvbnN0IEVMRF9TQlJfQ09ORklHVVJBVE9SICpwU2V0dXAgPSBOVUxMOwogCi0gICAgZm9yIChpPTA7IGk8KGludCkoc2l6ZW9mKGVsZFNickF1dG9Db25maWdUYWIpL3NpemVvZihFTERfU0JSX0NPTkZJR1VSQVRPUikpOyBpKyspIHsKLSAgICAgIGlmICggKHNhbXBsaW5nUmF0ZSA8PSBlbGRTYnJBdXRvQ29uZmlnVGFiW2ldLnNhbXBsaW5nUmF0ZSkKLSAgICAgICAgJiYgKGNoYW5uZWxCaXRyYXRlID49IGVsZFNickF1dG9Db25maWdUYWJbaV0uYml0cmF0ZVJhbmdlKSApCi0gICAgICB7Ci0gICAgICAgIGNmZ0lkeCA9IGk7Ci0gICAgICB9CisgIGZvciAoaSA9IDA7CisgICAgICAgaSA8IChpbnQpKHNpemVvZihlbGRTYnJBdXRvQ29uZmlnVGFiKSAvIHNpemVvZihFTERfU0JSX0NPTkZJR1VSQVRPUikpOworICAgICAgIGkrKykgeworICAgIGlmICgobkNoYW5uZWxzID09IGVsZFNickF1dG9Db25maWdUYWJbaV0ubkNoYW5uZWxzKSAmJgorICAgICAgICAoc2FtcGxpbmdSYXRlIDw9IGVsZFNickF1dG9Db25maWdUYWJbaV0uc2FtcGxpbmdSYXRlKSAmJgorICAgICAgICAoYml0cmF0ZSA+PSBlbGRTYnJBdXRvQ29uZmlnVGFiW2ldLmJpdHJhdGVSYW5nZSkpIHsKKyAgICAgIHBTZXR1cCA9ICZlbGRTYnJBdXRvQ29uZmlnVGFiW2ldOwogICAgIH0KKyAgfQogCi0gICAgaWYgKGNmZ0lkeCAhPSAtMSkgewotICAgICAgKmVsZFNiciAgICAgID0gKGVsZFNickF1dG9Db25maWdUYWJbY2ZnSWR4XS5sb3dEZWxheVNicj09MCkgPyAwIDogMTsKLSAgICAgICplbGRTYnJSYXRpbyA9IChlbGRTYnJBdXRvQ29uZmlnVGFiW2NmZ0lkeF0uZG93bnNhbXBsZWRTYnI9PTApID8gMiA6IDE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOyAvKiBubyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGVsZC1zYnIgYXZhaWxhYmxlLiAqLwotICAgIH0KLQotICAgIHJldHVybiBlcnI7CisgIHJldHVybiBwU2V0dXA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgSU5UIGlzU2JyQWN0aXZlKGNvbnN0IEhBTkRMRV9BQUNFTkNfQ09ORklHIGhBYWNDb25maWcpCi17Ci0gICAgSU5UIHNiclVzZWQgPSAwOworc3RhdGljIGlubGluZSBJTlQgaXNTYnJBY3RpdmUoY29uc3QgSEFORExFX0FBQ0VOQ19DT05GSUcgaEFhY0NvbmZpZykgeworICBJTlQgc2JyVXNlZCA9IDA7CiAKLSAgICBpZiAoIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9TQlIpIHx8IChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9QUykgKQotICAgIHsKLSAgICAgICAgc2JyVXNlZCA9IDE7Ci0gICAgfQotICAgIGlmIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQgJiYgKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfU0JSX1BSRVNFTlQpKQotICAgIHsKLSAgICAgICAgc2JyVXNlZCA9IDE7Ci0gICAgfQorICAvKiBOb3RlOiBFdmVuIGlmIGltcGxpY2l0IHNpZ25hbGxpbmcgd2FzIHNlbGVjdGVkLCBUaGUgQU9UIGl0c2VsZiBoZXJlIGlzIG5vdAorICAgKiBBT1RfQUFDX0xDICovCisgIGlmICgoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9TQlIpIHx8CisgICAgICAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9QUykgfHwKKyAgICAgIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX01QMl9TQlIpKSB7CisgICAgc2JyVXNlZCA9IDE7CisgIH0KKyAgaWYgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCAmJgorICAgICAgKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfU0JSX1BSRVNFTlQpKSB7CisgICAgc2JyVXNlZCA9IDE7CisgIH0KIAotICAgIHJldHVybiAoIHNiclVzZWQgKTsKKyAgcmV0dXJuIChzYnJVc2VkKTsKIH0KIAotc3RhdGljIGlubGluZSBJTlQgaXNQc0FjdGl2ZShjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUpCi17Ci0gICAgSU5UIHBzVXNlZCA9IDA7CitzdGF0aWMgaW5saW5lIElOVCBpc1BzQWN0aXZlKGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSkgeworICBJTlQgcHNVc2VkID0gMDsKIAotICAgIGlmICggKGF1ZGlvT2JqZWN0VHlwZT09QU9UX1BTKSApCi0gICAgewotICAgICAgICBwc1VzZWQgPSAxOwotICAgIH0KKyAgaWYgKGF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsKKyAgICBwc1VzZWQgPSAxOworICB9CiAKLSAgICByZXR1cm4gKCBwc1VzZWQgKTsKKyAgcmV0dXJuIChwc1VzZWQpOworfQorCitzdGF0aWMgQ0hBTk5FTF9NT0RFIEdldENvcmVDaGFubmVsTW9kZSgKKyAgICBjb25zdCBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSkgeworICBDSEFOTkVMX01PREUgbWFwcGVkQ2hhbm5lbE1vZGUgPSBjaGFubmVsTW9kZTsKKyAgaWYgKChpc1BzQWN0aXZlKGF1ZGlvT2JqZWN0VHlwZSkgJiYgKGNoYW5uZWxNb2RlID09IE1PREVfMikpIHx8CisgICAgICAoY2hhbm5lbE1vZGUgPT0gTU9ERV8yMTIpKSB7CisgICAgbWFwcGVkQ2hhbm5lbE1vZGUgPSBNT0RFXzE7CisgIH0KKyAgcmV0dXJuIG1hcHBlZENoYW5uZWxNb2RlOwogfQogCiBzdGF0aWMgU0JSX1BTX1NJR05BTElORyBnZXRTYnJTaWduYWxpbmdNb2RlKAotICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSAgICAgICAgICBhdWRpb09iamVjdFR5cGUsCi0gICAgICAgIGNvbnN0IFRSQU5TUE9SVF9UWVBFICAgICAgICAgICAgIHRyYW5zcG9ydFR5cGUsCi0gICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydFNpZ25hbGluZywKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgc2JyUmF0aW8KLSAgICAgICAgKQorICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSwgY29uc3QgVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0VHlwZSwKKyAgICBjb25zdCBVQ0hBUiB0cmFuc3BvcnRTaWduYWxpbmcsIGNvbnN0IFVJTlQgc2JyUmF0aW8pCiAKIHsKICAgU0JSX1BTX1NJR05BTElORyBzYnJTaWduYWxpbmc7CiAKLSAgaWYgKHRyYW5zcG9ydFR5cGU9PVRUX1VOS05PV04gfHwgc2JyUmF0aW89PTApIHsKKyAgaWYgKHRyYW5zcG9ydFR5cGUgPT0gVFRfVU5LTk9XTiB8fCBzYnJSYXRpbyA9PSAwKSB7CiAgICAgc2JyU2lnbmFsaW5nID0gU0lHX1VOS05PV047IC8qIE5lZWRlZCBwYXJhbWV0ZXJzIGhhdmUgbm90IGJlZW4gc2V0ICovCiAgICAgcmV0dXJuIHNiclNpZ25hbGluZzsKICAgfSBlbHNlIHsKLSAgICBzYnJTaWduYWxpbmcgPSBTSUdfSU1QTElDSVQ7IC8qIGRlZmF1bHQ6IGltcGxpY2l0IHNpZ25hbGluZyAqLworICAgIHNiclNpZ25hbGluZyA9CisgICAgICAgIFNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUw7IC8qIGRlZmF1bHQ6IGV4cGxpY2l0IGhpZXJhcmNoaWNhbCBzaWduYWxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIH0KIAotICBpZiAoIChhdWRpb09iamVjdFR5cGU9PUFPVF9BQUNfTEMpIHx8IChhdWRpb09iamVjdFR5cGU9PUFPVF9TQlIpIHx8IChhdWRpb09iamVjdFR5cGU9PUFPVF9QUykgKSB7CisgIGlmICgoYXVkaW9PYmplY3RUeXBlID09IEFPVF9BQUNfTEMpIHx8IChhdWRpb09iamVjdFR5cGUgPT0gQU9UX1NCUikgfHwKKyAgICAgIChhdWRpb09iamVjdFR5cGUgPT0gQU9UX1BTKSB8fCAoYXVkaW9PYmplY3RUeXBlID09IEFPVF9NUDJfQUFDX0xDKSB8fAorICAgICAgKGF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfTVAyX1NCUikpIHsKICAgICBzd2l0Y2ggKHRyYW5zcG9ydFR5cGUpIHsKICAgICAgIGNhc2UgVFRfTVA0X0FESUY6CiAgICAgICBjYXNlIFRUX01QNF9BRFRTOgotICAgICAgICBzYnJTaWduYWxpbmcgPSBTSUdfSU1QTElDSVQ7IC8qIEZvciBNUEVHLTIgdHJhbnNwb3J0IHR5cGVzLCBvbmx5IGltcGxpY2l0IHNpZ25hbGluZyBpcyBwb3NzaWJsZSAqLworICAgICAgICBzYnJTaWduYWxpbmcgPSBTSUdfSU1QTElDSVQ7IC8qIEZvciBNUEVHLTIgdHJhbnNwb3J0IHR5cGVzLCBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGljaXQgc2lnbmFsaW5nIGlzIHBvc3NpYmxlICovCiAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIFRUX01QNF9SQVc6CkBAIC0zODAsMTYgKzQzMCwxMyBAQAogICAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgogICAgICAgY2FzZSBUVF9NUDRfTE9BUzoKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmICggdHJhbnNwb3J0U2lnbmFsaW5nPT0weEZGICkgeworICAgICAgICBpZiAodHJhbnNwb3J0U2lnbmFsaW5nID09IDB4RkYpIHsKICAgICAgICAgICAvKiBEZWZhdWx0cyAqLwotICAgICAgICAgIGlmICggc2JyUmF0aW89PTEgKSB7Ci0gICAgICAgICAgICBzYnJTaWduYWxpbmcgPSBTSUdfRVhQTElDSVRfSElFUkFSQ0hJQ0FMOyAvKiBGb3IgZG93bnNhbXBsZWQgU0JSLCBleHBsaWNpdCBzaWduYWxpbmcgaXMgbWFuZGF0b3J5ICovCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNiclNpZ25hbGluZyA9IFNJR19JTVBMSUNJVDsgLyogRm9yIGR1YWwtcmF0ZSBTQlIsIGltcGxpY2l0IHNpZ25hbGluZyBpcyBkZWZhdWx0ICovCi0gICAgICAgICAgfQorICAgICAgICAgIHNiclNpZ25hbGluZyA9IFNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUw7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgLyogVXNlciBzZXQgcGFyYW1ldGVycyAqLwotICAgICAgICAgIC8qIEF0dGVudGlvbjogQmFja3dhcmQgY29tcGF0aWJsZSBleHBsaWNpdCBzaWduYWxpbmcgZG9lcyBvbmx5IHdvcmsgd2l0aCBBTVYxIGZvciBMQVRNL0xPQVMgKi8KKyAgICAgICAgICAvKiBBdHRlbnRpb246IEJhY2t3YXJkIGNvbXBhdGlibGUgZXhwbGljaXQgc2lnbmFsaW5nIGRvZXMgb25seSB3b3JrCisgICAgICAgICAgICogd2l0aCBBTVYxIGZvciBMQVRNL0xPQVMgKi8KICAgICAgICAgICBzYnJTaWduYWxpbmcgPSAoU0JSX1BTX1NJR05BTElORyl0cmFuc3BvcnRTaWduYWxpbmc7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC00MDMsNzggKzQ1MCw5MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRlIEVuY29kZXIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUhfQUxMT0NfTUVNIChfQWFjRW5jb2RlciwgQUFDRU5DT0RFUikKLUNfQUxMT0NfTUVNIChfQWFjRW5jb2RlciwgQUFDRU5DT0RFUiwgMSkKLQotCi0KK0hfQUxMT0NfTUVNKF9BYWNFbmNvZGVyLCBBQUNFTkNPREVSKQorQ19BTExPQ19NRU0oX0FhY0VuY29kZXIsIHN0cnVjdCBBQUNFTkNPREVSLCAxKQogCiAvKgogICogTWFwIEVuY29kZXIgc3BlY2lmaWMgY29uZmlnIHN0cnVjdHVyZXMgdG8gQ09ERVJfQ09ORklHLgogICovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfTWFwQ29uZmlnKAotICAgICAgICBDT0RFUl9DT05GSUcgKmNvbnN0ICAgICAgICAgICAgICBjYywKLSAgICAgICAgY29uc3QgVVNFUl9QQVJBTSAqY29uc3QgICAgICAgICAgZXh0Q2ZnLAotICAgICAgICBjb25zdCBTQlJfUFNfU0lHTkFMSU5HICAgICAgICAgICBzYnJTaWduYWxpbmcsCi0gICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNfQ09ORklHICAgICAgIGhBYWNDb25maWcKLSAgICAgICAgKQoteworc3RhdGljIHZvaWQgRkRLYWFjRW5jX01hcENvbmZpZyhDT0RFUl9DT05GSUcgKmNvbnN0IGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVU0VSX1BBUkFNICpjb25zdCBleHRDZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNCUl9QU19TSUdOQUxJTkcgc2JyU2lnbmFsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DX0NPTkZJRyBoQWFjQ29uZmlnKSB7CiAgIEFVRElPX09CSkVDVF9UWVBFIHRyYW5zcG9ydF9BT1QgPSBBT1RfTlVMTF9PQkpFQ1Q7CiAgIEZES21lbWNsZWFyKGNjLCBzaXplb2YoQ09ERVJfQ09ORklHKSk7CiAKICAgY2MtPmZsYWdzID0gMDsKIAotICB0cmFuc3BvcnRfQU9UID0gaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlOworICBjYy0+c2FtcGxlc1BlckZyYW1lID0gaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGg7CisgIGNjLT5zYW1wbGluZ1JhdGUgPSBoQWFjQ29uZmlnLT5zYW1wbGVSYXRlOworICBjYy0+ZXh0U2FtcGxpbmdSYXRlID0gZXh0Q2ZnLT51c2VyU2FtcGxlcmF0ZTsKKworICAvKiBNYXAgdmlydHVhbCBhb3QgdG8gdHJhbnNwb3J0IGFvdC4gKi8KKyAgc3dpdGNoIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUpIHsKKyAgICBjYXNlIEFPVF9NUDJfQUFDX0xDOgorICAgICAgdHJhbnNwb3J0X0FPVCA9IEFPVF9BQUNfTEM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9NUDJfU0JSOgorICAgICAgdHJhbnNwb3J0X0FPVCA9IEFPVF9TQlI7CisgICAgICBjYy0+ZmxhZ3MgfD0gQ0NfU0JSOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRyYW5zcG9ydF9BT1QgPSBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU7CisgIH0KIAogICBpZiAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9BQUNfRUxEKSB7CiAgICAgY2MtPmZsYWdzIHw9IChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX1NCUl9QUkVTRU5UKSA/IENDX1NCUiA6IDA7CisgICAgY2MtPmZsYWdzIHw9IChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0xEX01QUykgPyBDQ19TQUMgOiAwOwogICB9CiAKICAgLyogdHJhbnNwb3J0IHR5cGUgaXMgdXN1YWxseSBBQUMtTEMuICovCi0gIGlmICggKHRyYW5zcG9ydF9BT1QgPT0gQU9UX1NCUikgfHwgKHRyYW5zcG9ydF9BT1QgPT0gQU9UX1BTKSApIHsKLSAgICBjYy0+YW90ICAgICAgICAgICA9IEFPVF9BQUNfTEM7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY2MtPmFvdCAgICAgICAgICAgPSB0cmFuc3BvcnRfQU9UOworICBpZiAoKHRyYW5zcG9ydF9BT1QgPT0gQU9UX1NCUikgfHwgKHRyYW5zcG9ydF9BT1QgPT0gQU9UX1BTKSkgeworICAgIGNjLT5hb3QgPSBBT1RfQUFDX0xDOworICB9IGVsc2UgeworICAgIGNjLT5hb3QgPSB0cmFuc3BvcnRfQU9UOwogICB9CiAKICAgLyogQ29uZmlndXJlIGV4dGVuc2lvbiBhb3QuICovCi0gIGlmIChzYnJTaWduYWxpbmc9PVNJR19JTVBMSUNJVCkgewotICAgIGNjLT5leHRBT1QgPSBBT1RfTlVMTF9PQkpFQ1Q7ICAvKiBpbXBsaWNpdCAqLwotICB9Ci0gIGVsc2UgewotICAgIGlmICggKHNiclNpZ25hbGluZz09U0lHX0VYUExJQ0lUX0JXX0NPTVBBVElCTEUpICYmICggKHRyYW5zcG9ydF9BT1Q9PUFPVF9TQlIpIHx8ICh0cmFuc3BvcnRfQU9UPT1BT1RfUFMpICkgKSB7Ci0gICAgICBjYy0+ZXh0QU9UID0gQU9UX1NCUjsgICAgICAgIC8qIGV4cGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBjYy0+ZXh0QU9UID0gdHJhbnNwb3J0X0FPVDsgIC8qIGV4cGxpY2l0IGhpZXJhcmNoaWNhbCAqLworICBpZiAoc2JyU2lnbmFsaW5nID09IFNJR19JTVBMSUNJVCkgeworICAgIGNjLT5leHRBT1QgPSBBT1RfTlVMTF9PQkpFQ1Q7IC8qIGltcGxpY2l0ICovCisgIH0gZWxzZSB7CisgICAgaWYgKChzYnJTaWduYWxpbmcgPT0gU0lHX0VYUExJQ0lUX0JXX0NPTVBBVElCTEUpICYmCisgICAgICAgICgodHJhbnNwb3J0X0FPVCA9PSBBT1RfU0JSKSB8fCAodHJhbnNwb3J0X0FPVCA9PSBBT1RfUFMpKSkgeworICAgICAgY2MtPmV4dEFPVCA9IEFPVF9TQlI7IC8qIGV4cGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgKi8KKyAgICB9IGVsc2UgeworICAgICAgY2MtPmV4dEFPVCA9IHRyYW5zcG9ydF9BT1Q7IC8qIGV4cGxpY2l0IGhpZXJhcmNoaWNhbCAqLwogICAgIH0KICAgfQogCi0gIGlmICggKHRyYW5zcG9ydF9BT1Q9PUFPVF9TQlIpIHx8ICh0cmFuc3BvcnRfQU9UPT1BT1RfUFMpICkgewotICAgIGNjLT5zYnJQcmVzZW50PTE7Ci0gICAgaWYgKHRyYW5zcG9ydF9BT1Q9PUFPVF9QUykgewotICAgICAgY2MtPnBzUHJlc2VudD0xOworICBpZiAoKHRyYW5zcG9ydF9BT1QgPT0gQU9UX1NCUikgfHwgKHRyYW5zcG9ydF9BT1QgPT0gQU9UX1BTKSkgeworICAgIGNjLT5zYnJQcmVzZW50ID0gMTsKKyAgICBpZiAodHJhbnNwb3J0X0FPVCA9PSBBT1RfUFMpIHsKKyAgICAgIGNjLT5wc1ByZXNlbnQgPSAxOwogICAgIH0KICAgfQotICBjYy0+c2JyU2lnbmFsaW5nICAgID0gc2JyU2lnbmFsaW5nOworICBjYy0+c2JyU2lnbmFsaW5nID0gc2JyU2lnbmFsaW5nOwogCi0gIGNjLT5leHRTYW1wbGluZ1JhdGUgPSBleHRDZmctPnVzZXJTYW1wbGVyYXRlOwotICBjYy0+Yml0UmF0ZSAgICAgICAgID0gaEFhY0NvbmZpZy0+Yml0UmF0ZTsKLSAgY2MtPm5vQ2hhbm5lbHMgICAgICA9IGhBYWNDb25maWctPm5DaGFubmVsczsKLSAgY2MtPmZsYWdzICAgICAgICAgIHw9IENDX0lTX0JBU0VMQVlFUjsKLSAgY2MtPmNoYW5uZWxNb2RlICAgICA9IGhBYWNDb25maWctPmNoYW5uZWxNb2RlOworICBpZiAoaEFhY0NvbmZpZy0+ZG93bnNjYWxlRmFjdG9yID4gMSkgeworICAgIGNjLT5kb3duc2NhbGVTYW1wbGluZ1JhdGUgPSBjYy0+c2FtcGxpbmdSYXRlOworICAgIGNjLT5zYW1wbGluZ1JhdGUgKj0gaEFhY0NvbmZpZy0+ZG93bnNjYWxlRmFjdG9yOworICAgIGNjLT5leHRTYW1wbGluZ1JhdGUgKj0gaEFhY0NvbmZpZy0+ZG93bnNjYWxlRmFjdG9yOworICB9CisKKyAgY2MtPmJpdFJhdGUgPSBoQWFjQ29uZmlnLT5iaXRSYXRlOworICBjYy0+bm9DaGFubmVscyA9IGhBYWNDb25maWctPm5DaGFubmVsczsKKyAgY2MtPmZsYWdzIHw9IENDX0lTX0JBU0VMQVlFUjsKKyAgY2MtPmNoYW5uZWxNb2RlID0gaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGU7CiAKICAgY2MtPm5TdWJGcmFtZXMgPSAoaEFhY0NvbmZpZy0+blN1YkZyYW1lcyA+IDEgJiYgZXh0Q2ZnLT51c2VyVHBOc3ViRnJhbWVzID09IDEpCi0gICAgICAgICAgICAgICAgID8gaEFhY0NvbmZpZy0+blN1YkZyYW1lcwotICAgICAgICAgICAgICAgICA6IGV4dENmZy0+dXNlclRwTnN1YkZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgPyBoQWFjQ29uZmlnLT5uU3ViRnJhbWVzCisgICAgICAgICAgICAgICAgICAgICAgIDogZXh0Q2ZnLT51c2VyVHBOc3ViRnJhbWVzOwogCi0gIGNjLT5mbGFncyAgICAgICAgICB8PSAoZXh0Q2ZnLT51c2VyVHBQcm90ZWN0aW9uKSA/IENDX1BST1RFQ1RJT04gOiAwOworICBjYy0+ZmxhZ3MgfD0gKGV4dENmZy0+dXNlclRwUHJvdGVjdGlvbikgPyBDQ19QUk9URUNUSU9OIDogMDsKIAotICBpZiAoZXh0Q2ZnLT51c2VyVHBIZWFkZXJQZXJpb2QhPTB4RkYpIHsKLSAgICBjYy0+aGVhZGVyUGVyaW9kICAgID0gZXh0Q2ZnLT51c2VyVHBIZWFkZXJQZXJpb2Q7Ci0gIH0KLSAgZWxzZSB7IC8qIGF1dG8tbW9kZSAqLworICBpZiAoZXh0Q2ZnLT51c2VyVHBIZWFkZXJQZXJpb2QgIT0gMHhGRikgeworICAgIGNjLT5oZWFkZXJQZXJpb2QgPSBleHRDZmctPnVzZXJUcEhlYWRlclBlcmlvZDsKKyAgfSBlbHNlIHsgLyogYXV0by1tb2RlICovCiAgICAgc3dpdGNoIChleHRDZmctPnVzZXJUcFR5cGUpIHsKICAgICAgIGNhc2UgVFRfTVA0X0FEVFM6CiAgICAgICBjYXNlIFRUX01QNF9MT0FTOgpAQCAtNDg2LDI3ICs1NDUsNjUgQEAKICAgICB9CiAgIH0KIAotICBjYy0+c2FtcGxlc1BlckZyYW1lID0gaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGg7Ci0gIGNjLT5zYW1wbGluZ1JhdGUgICAgPSBoQWFjQ29uZmlnLT5zYW1wbGVSYXRlOwotCiAgIC8qIE1wZWctNCBzaWduYWxpbmcgZm9yIHRyYW5zcG9ydCBsaWJyYXJ5LiAqLwotICBjYy0+ZmxhZ3MgfD0gQ0NfTVBFR19JRDsKKyAgc3dpdGNoIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUpIHsKKyAgICBjYXNlIEFPVF9NUDJfQUFDX0xDOgorICAgIGNhc2UgQU9UX01QMl9TQlI6CisgICAgICBjYy0+ZmxhZ3MgJj0gfkNDX01QRUdfSUQ7IC8qIFJlcXVpcmVkIGZvciBBRFRTLiAqLworICAgICAgY2MtPmV4dEFPVCA9IEFPVF9OVUxMX09CSkVDVDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjYy0+ZmxhZ3MgfD0gQ0NfTVBFR19JRDsKKyAgfQogCiAgIC8qIEVSLXRvb2xzIHNpZ25hbGluZy4gKi8KLSAgY2MtPmZsYWdzICAgICB8PSAoaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19FUl9WQ0IxMSkgPyBDQ19WQ0IxMSA6IDA7Ci0gIGNjLT5mbGFncyAgICAgfD0gKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfSENSKSAgID8gQ0NfSENSIDogMDsKLSAgY2MtPmZsYWdzICAgICB8PSAoaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19FUl9SVkxDKSAgPyBDQ19SVkxDIDogMDsKKyAgY2MtPmZsYWdzIHw9IChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0VSX1ZDQjExKSA/IENDX1ZDQjExIDogMDsKKyAgY2MtPmZsYWdzIHw9IChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0VSX0hDUikgPyBDQ19IQ1IgOiAwOworICBjYy0+ZmxhZ3MgfD0gKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfUlZMQykgPyBDQ19SVkxDIDogMDsKIAogICAvKiBNYXRyaXggbWl4ZG93biBjb2VmZmljaWVudCBjb25maWd1cmF0aW9uLiAqLwotICBpZiAoIChleHRDZmctPnVzZXJQY2VBZGRpdGlvbnMmMHgxKSAmJiAoaEFhY0NvbmZpZy0+ZXBDb25maWc9PS0xKQotICAgICAgJiYgKChjYy0+Y2hhbm5lbE1vZGU9PU1PREVfMV8yXzIpfHwoY2MtPmNoYW5uZWxNb2RlPT1NT0RFXzFfMl8yXzEpKSApCi0gIHsKLSAgICBjYy0+bWF0cml4TWl4ZG93bkEgICAgICAgPSAoKGV4dENmZy0+dXNlclBjZUFkZGl0aW9ucz4+MSkmMHgzKSsxOwotICAgIGNjLT5mbGFncyB8PSAoZXh0Q2ZnLT51c2VyUGNlQWRkaXRpb25zPj4zKSYweDEgPyBDQ19QU0VVRE9fU1VSUk9VTkQgOiAwOwotICB9Ci0gIGVsc2UgeworICBpZiAoKGV4dENmZy0+dXNlclBjZUFkZGl0aW9ucyAmIDB4MSkgJiYgKGhBYWNDb25maWctPmVwQ29uZmlnID09IC0xKSAmJgorICAgICAgKChjYy0+Y2hhbm5lbE1vZGUgPT0gTU9ERV8xXzJfMikgfHwgKGNjLT5jaGFubmVsTW9kZSA9PSBNT0RFXzFfMl8yXzEpKSkgeworICAgIGNjLT5tYXRyaXhNaXhkb3duQSA9ICgoZXh0Q2ZnLT51c2VyUGNlQWRkaXRpb25zID4+IDEpICYgMHgzKSArIDE7CisgICAgY2MtPmZsYWdzIHw9IChleHRDZmctPnVzZXJQY2VBZGRpdGlvbnMgPj4gMykgJiAweDEgPyBDQ19QU0VVRE9fU1VSUk9VTkQgOiAwOworICB9IGVsc2UgewogICAgIGNjLT5tYXRyaXhNaXhkb3duQSA9IDA7CiAgIH0KKworICBjYy0+Y2hhbm5lbENvbmZpZ1plcm8gPSAwOworfQorCisvKgorICogVmFsaWRhdGUgcHJlZmlsbGVkIHBvaW50ZXJzIHdpdGhpbiBidWZmZXIgZGVzY3JpcHRvci4KKyAqCisgKiBccGFyYW0gcEJ1ZkRlc2MgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYnVmZmVyIGRlc2NyaXB0b3IKKworICogXHJldHVybiAtIEFBQ0VOQ19PSywgYWxsIGZpbmUuCisgKiAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBvbiBtaXNzaW5nIHBvaW50ZXIgaW5pdGlhbGl6aWF0aW9uLgorICogICAgICAgICAtIEFBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVIsIG9uIGluY29ycmVjdCBidWZmZXIgZGVzY3JpcHRvcgorIGluaXRpYWxpemF0aW9uLgorICovCitzdGF0aWMgQUFDRU5DX0VSUk9SIHZhbGlkYXRlQnVmRGVzYyhjb25zdCBBQUNFTkNfQnVmRGVzYyAqcEJ1ZkRlc2MpIHsKKyAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKKworICBpZiAocEJ1ZkRlc2MgIT0gTlVMTCkgeworICAgIGludCBpOworICAgIGlmICgocEJ1ZkRlc2MtPmJ1ZmZlcklkZW50aWZpZXJzID09IE5VTEwpIHx8IChwQnVmRGVzYy0+YnVmU2l6ZXMgPT0gTlVMTCkgfHwKKyAgICAgICAgKHBCdWZEZXNjLT5idWZFbFNpemVzID09IE5VTEwpIHx8IChwQnVmRGVzYy0+YnVmcyA9PSBOVUxMKSkgeworICAgICAgZXJyID0gQUFDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHBCdWZEZXNjLT5udW1CdWZzOyBpKyspIHsKKyAgICAgIGlmIChwQnVmRGVzYy0+YnVmc1tpXSA9PSBOVUxMKSB7CisgICAgICAgIGVyciA9IEFBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVI7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfSEFORExFOworICB9CitiYWlsOgorICByZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtNTE4LDE5NSArNjE1LDE3MiBAQAogICogXHJldHVybiAtIEJ1ZmZlciBkZXNjcmlwdG9yIGluZGV4LgogICogICAgICAgICAtMSwgaWYgdGhlcmUgaXMgbm8gZW50cnkgYXZhaWxhYmxlLgogICovCi1zdGF0aWMgSU5UIGdldEJ1ZkRlc2NJZHgoCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19CdWZEZXNjICAgICAgICAgKnBCdWZEZXNjLAotICAgICAgICBjb25zdCBBQUNFTkNfQnVmZmVySWRlbnRpZmllciBpZGVudGlmaWVyCi0pCi17Ci0gICAgSU5UIGksIGlkeCA9IC0xOworc3RhdGljIElOVCBnZXRCdWZEZXNjSWR4KGNvbnN0IEFBQ0VOQ19CdWZEZXNjICpwQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQUNFTkNfQnVmZmVySWRlbnRpZmllciBpZGVudGlmaWVyKSB7CisgIElOVCBpLCBpZHggPSAtMTsKIAotICAgIGZvciAoaT0wOyBpPHBCdWZEZXNjLT5udW1CdWZzOyBpKyspIHsKLSAgICAgIGlmICggKEFBQ0VOQ19CdWZmZXJJZGVudGlmaWVyKXBCdWZEZXNjLT5idWZmZXJJZGVudGlmaWVyc1tpXSA9PSBpZGVudGlmaWVyICkgeworICBpZiAocEJ1ZkRlc2MgIT0gTlVMTCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBwQnVmRGVzYy0+bnVtQnVmczsgaSsrKSB7CisgICAgICBpZiAoKEFBQ0VOQ19CdWZmZXJJZGVudGlmaWVyKXBCdWZEZXNjLT5idWZmZXJJZGVudGlmaWVyc1tpXSA9PQorICAgICAgICAgIGlkZW50aWZpZXIpIHsKICAgICAgICAgaWR4ID0gaTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBpZHg7CisgIH0KKyAgcmV0dXJuIGlkeDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIEFBQ19FTkNPREVSX0VSUk9SIGFhY0VuY0RlZmF1bHRDb25maWcoSEFORExFX0FBQ0VOQ19DT05GSUcgaEFhY0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFUl9QQVJBTSAqY29uZmlnKQotewotICAgIC8qIG1ha2UgcmVhc29uYWJsZSBkZWZhdWx0IHNldHRpbmdzICovCi0gICAgRkRLYWFjRW5jX0FhY0luaXREZWZhdWx0Q29uZmlnIChoQWFjQ29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFUl9QQVJBTSAqY29uZmlnKSB7CisgIC8qIG1ha2UgcmVhc29uYWJsZSBkZWZhdWx0IHNldHRpbmdzICovCisgIEZES2FhY0VuY19BYWNJbml0RGVmYXVsdENvbmZpZyhoQWFjQ29uZmlnKTsKIAotICAgIC8qIGNsZWFyIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGFuZCBjb3B5IGRlZmF1bHQgc2V0dGluZ3MgKi8KLSAgICBGREttZW1jbGVhcihjb25maWcsIHNpemVvZihVU0VSX1BBUkFNKSk7CisgIC8qIGNsZWFyIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGFuZCBjb3B5IGRlZmF1bHQgc2V0dGluZ3MgKi8KKyAgRkRLbWVtY2xlYXIoY29uZmlnLCBzaXplb2YoVVNFUl9QQVJBTSkpOwogCi0gICAgLyogY29weSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KLSAgICBjb25maWctPm5DaGFubmVscyAgICAgICA9IGhBYWNDb25maWctPm5DaGFubmVsczsKLSAgICBjb25maWctPnVzZXJBT1QgPSBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPSBBT1RfQUFDX0xDOwotICAgIGNvbmZpZy0+dXNlclNhbXBsZXJhdGUgID0gaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZTsKLSAgICBjb25maWctPnVzZXJDaGFubmVsTW9kZSA9IGhBYWNDb25maWctPmNoYW5uZWxNb2RlOwotICAgIGNvbmZpZy0+dXNlckJpdHJhdGUgICAgID0gaEFhY0NvbmZpZy0+Yml0UmF0ZTsKLSAgICBjb25maWctPnVzZXJCaXRyYXRlTW9kZSA9IGhBYWNDb25maWctPmJpdHJhdGVNb2RlOwotICAgIGNvbmZpZy0+dXNlclBlYWtCaXRyYXRlID0gKFVJTlQpLTE7Ci0gICAgY29uZmlnLT51c2VyQmFuZHdpZHRoICAgPSBoQWFjQ29uZmlnLT5iYW5kV2lkdGg7Ci0gICAgY29uZmlnLT51c2VyVG5zICAgICAgICAgPSBoQWFjQ29uZmlnLT51c2VUbnM7Ci0gICAgY29uZmlnLT51c2VyUG5zICAgICAgICAgPSBoQWFjQ29uZmlnLT51c2VQbnM7Ci0gICAgY29uZmlnLT51c2VySW50ZW5zaXR5ICAgPSBoQWFjQ29uZmlnLT51c2VJUzsKLSAgICBjb25maWctPnVzZXJBZnRlcmJ1cm5lciA9IGhBYWNDb25maWctPnVzZVJlcXVhbnQ7Ci0gICAgY29uZmlnLT51c2VyRnJhbWVsZW5ndGggPSAoVUlOVCktMTsKKyAgLyogY29weSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKyAgY29uZmlnLT5uQ2hhbm5lbHMgPSBoQWFjQ29uZmlnLT5uQ2hhbm5lbHM7CisgIGNvbmZpZy0+dXNlckFPVCA9IGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9IEFPVF9BQUNfTEM7CisgIGNvbmZpZy0+dXNlclNhbXBsZXJhdGUgPSBoQWFjQ29uZmlnLT5zYW1wbGVSYXRlOworICBjb25maWctPnVzZXJDaGFubmVsTW9kZSA9IGhBYWNDb25maWctPmNoYW5uZWxNb2RlOworICBjb25maWctPnVzZXJCaXRyYXRlID0gaEFhY0NvbmZpZy0+Yml0UmF0ZTsKKyAgY29uZmlnLT51c2VyQml0cmF0ZU1vZGUgPSBoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZTsKKyAgY29uZmlnLT51c2VyUGVha0JpdHJhdGUgPSAoVUlOVCktMTsKKyAgY29uZmlnLT51c2VyQmFuZHdpZHRoID0gaEFhY0NvbmZpZy0+YmFuZFdpZHRoOworICBjb25maWctPnVzZXJUbnMgPSBoQWFjQ29uZmlnLT51c2VUbnM7CisgIGNvbmZpZy0+dXNlclBucyA9IGhBYWNDb25maWctPnVzZVBuczsKKyAgY29uZmlnLT51c2VySW50ZW5zaXR5ID0gaEFhY0NvbmZpZy0+dXNlSVM7CisgIGNvbmZpZy0+dXNlckFmdGVyYnVybmVyID0gaEFhY0NvbmZpZy0+dXNlUmVxdWFudDsKKyAgY29uZmlnLT51c2VyRnJhbWVsZW5ndGggPSAoVUlOVCktMTsKIAotICAgIGlmIChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0VSX1ZDQjExKSB7Ci0gICAgICBjb25maWctPnVzZXJFclRvb2xzICB8PSAweDAxOwotICAgIH0KLSAgICBpZiAoaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19FUl9IQ1IpIHsKLSAgICAgIGNvbmZpZy0+dXNlckVyVG9vbHMgIHw9IDB4MDI7Ci0gICAgfQorICBjb25maWctPnVzZXJEb3duc2NhbGVGYWN0b3IgPSAxOwogCi0gICAgLyogaW5pdGlhbGl6ZSB0cmFuc3BvcnQgcGFyYW1ldGVycyAqLwotICAgIGNvbmZpZy0+dXNlclRwVHlwZSAgICAgICAgID0gVFRfVU5LTk9XTjsKLSAgICBjb25maWctPnVzZXJUcEFteHYgICAgICAgICA9IDA7Ci0gICAgY29uZmlnLT51c2VyVHBTaWduYWxpbmcgICAgPSAweEZGOyAgICAvKiBjaG9vc2Ugc2lnbmFsaW5nIGF1dG9tYXRpY2FsbHkgKi8KLSAgICBjb25maWctPnVzZXJUcE5zdWJGcmFtZXMgICA9IDE7Ci0gICAgY29uZmlnLT51c2VyVHBQcm90ZWN0aW9uICAgPSAwOyAgICAvKiBub3QgY3JjIHByb3RlY3RlZCovCi0gICAgY29uZmlnLT51c2VyVHBIZWFkZXJQZXJpb2QgPSAweEZGOyAvKiBoZWFkZXIgcGVyaW9kIGluIGF1dG8gbW9kZSAqLwotICAgIGNvbmZpZy0+dXNlclBjZUFkZGl0aW9ucyAgID0gMDsgICAgLyogbm8gbWF0cml4IG1peGRvd24gY29lZmZpY2llbnQgKi8KLSAgICBjb25maWctPnVzZXJNZXRhRGF0YU1vZGUgICA9IDA7ICAgIC8qIGRvIG5vdCBlbWJlZCBhbnkgbWV0YSBkYXRhIGluZm8gKi8KKyAgLyogaW5pdGlhbGl6ZSB0cmFuc3BvcnQgcGFyYW1ldGVycyAqLworICBjb25maWctPnVzZXJUcFR5cGUgPSBUVF9VTktOT1dOOworICBjb25maWctPnVzZXJUcEFteHYgPSAwOworICBjb25maWctPnVzZXJUcFNpZ25hbGluZyA9IDB4RkY7IC8qIGNob29zZSBzaWduYWxpbmcgYXV0b21hdGljYWxseSAqLworICBjb25maWctPnVzZXJUcE5zdWJGcmFtZXMgPSAxOworICBjb25maWctPnVzZXJUcFByb3RlY3Rpb24gPSAwOyAgICAgIC8qIG5vdCBjcmMgcHJvdGVjdGVkKi8KKyAgY29uZmlnLT51c2VyVHBIZWFkZXJQZXJpb2QgPSAweEZGOyAvKiBoZWFkZXIgcGVyaW9kIGluIGF1dG8gbW9kZSAqLworICBjb25maWctPnVzZXJQY2VBZGRpdGlvbnMgPSAwOyAgICAgIC8qIG5vIG1hdHJpeCBtaXhkb3duIGNvZWZmaWNpZW50ICovCisgIGNvbmZpZy0+dXNlck1ldGFEYXRhTW9kZSA9IDA7ICAgICAgLyogZG8gbm90IGVtYmVkIGFueSBtZXRhIGRhdGEgaW5mbyAqLwogCi0gICAgY29uZmlnLT51c2VyQW5jRGF0YVJhdGUgICAgPSAwOworICBjb25maWctPnVzZXJBbmNEYXRhUmF0ZSA9IDA7CiAKLSAgICAvKiBTQlIgcmF0ZSBpcyBzZXQgdG8gMCBoZXJlLCB3aGljaCBtZWFucyBpdCBzaG91bGQgYmUgc2V0IGF1dG9tYXRpY2FsbHkKLSAgICAgICBpbiBGREthYWNFbmNfQWRqdXN0RW5jU2V0dGluZ3MoKSBpZiB0aGUgdXNlciBkaWQgbm90IHNldCBhIHJhdGUKLSAgICAgICBleHBpbGljaXRlbHkuICovCi0gICAgY29uZmlnLT51c2VyU2JyUmF0aW8gPSAwOworICAvKiBTQlIgcmF0ZSBpcyBzZXQgdG8gMCBoZXJlLCB3aGljaCBtZWFucyBpdCBzaG91bGQgYmUgc2V0IGF1dG9tYXRpY2FsbHkKKyAgICAgaW4gRkRLYWFjRW5jX0FkanVzdEVuY1NldHRpbmdzKCkgaWYgdGhlIHVzZXIgZGlkIG5vdCBzZXQgYSByYXRlCisgICAgIGV4cGlsaWNpdGVseS4gKi8KKyAgY29uZmlnLT51c2VyU2JyUmF0aW8gPSAwOwogCi0gICAgLyogU0JSIGVuYWJsZSBzZXQgdG8gLTEgbWVhbnMgdG8gaW5xdWlyZSBFTEQgYXVkaW8gY29uZmlndXJhdG9yIGZvciByZWFzb25hYmxlIGNvbmZpZ3VyYXRpb24uICovCi0gICAgY29uZmlnLT51c2VyU2JyRW5hYmxlZCAgICAgPSAtMTsKKyAgLyogU0JSIGVuYWJsZSBzZXQgdG8gLTEgbWVhbnMgdG8gaW5xdWlyZSBFTEQgYXVkaW8gY29uZmlndXJhdG9yIGZvciByZWFzb25hYmxlCisgICAqIGNvbmZpZ3VyYXRpb24uICovCisgIGNvbmZpZy0+dXNlclNickVuYWJsZWQgPSAoVUNIQVIpLTE7CiAKLSAgICByZXR1cm4gQUFDX0VOQ19PSzsKKyAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKLXN0YXRpYwotdm9pZCBhYWNFbmNEaXN0cmlidXRlU2JyQml0cyhDSEFOTkVMX01BUFBJTkcgKmNoYW5uZWxNYXBwaW5nLCBTQlJfRUxFTUVOVF9JTkZPICpzYnJFbEluZm8sIElOVCBiaXRSYXRlKQoteworc3RhdGljIHZvaWQgYWFjRW5jRGlzdHJpYnV0ZVNickJpdHMoQ0hBTk5FTF9NQVBQSU5HICpjaGFubmVsTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX0lORk8gKnNickVsSW5mbywgSU5UIGJpdFJhdGUpIHsKICAgSU5UIGNvZGViaXRzID0gYml0UmF0ZTsKICAgaW50IGVsOwogCiAgIC8qIENvcHkgRWxlbWVudCBpbmZvICovCi0gIGZvciAoZWw9MDsgZWw8Y2hhbm5lbE1hcHBpbmctPm5FbGVtZW50czsgZWwrKykgewotICAgICAgc2JyRWxJbmZvW2VsXS5DaGFubmVsSW5kZXhbMF0gPSBjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2VsXS5DaGFubmVsSW5kZXhbMF07Ci0gICAgICBzYnJFbEluZm9bZWxdLkNoYW5uZWxJbmRleFsxXSA9IGNoYW5uZWxNYXBwaW5nLT5lbEluZm9bZWxdLkNoYW5uZWxJbmRleFsxXTsKLSAgICAgIHNickVsSW5mb1tlbF0uZWxUeXBlICAgICAgICAgID0gY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tlbF0uZWxUeXBlOwotICAgICAgc2JyRWxJbmZvW2VsXS5iaXRSYXRlICAgICAgICAgPSAoSU5UKShmTXVsdE5vcm0oY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tlbF0ucmVsYXRpdmVCaXRzLCAoRklYUF9EQkwpYml0UmF0ZSkpOwotICAgICAgc2JyRWxJbmZvW2VsXS5pbnN0YW5jZVRhZyAgICAgPSBjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2VsXS5pbnN0YW5jZVRhZzsKLSAgICAgIHNickVsSW5mb1tlbF0ubkNoYW5uZWxzSW5FbCAgID0gY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tlbF0ubkNoYW5uZWxzSW5FbDsKKyAgZm9yIChlbCA9IDA7IGVsIDwgY2hhbm5lbE1hcHBpbmctPm5FbGVtZW50czsgZWwrKykgeworICAgIHNickVsSW5mb1tlbF0uQ2hhbm5lbEluZGV4WzBdID0gY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tlbF0uQ2hhbm5lbEluZGV4WzBdOworICAgIHNickVsSW5mb1tlbF0uQ2hhbm5lbEluZGV4WzFdID0gY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tlbF0uQ2hhbm5lbEluZGV4WzFdOworICAgIHNickVsSW5mb1tlbF0uZWxUeXBlID0gY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tlbF0uZWxUeXBlOworICAgIHNickVsSW5mb1tlbF0uYml0UmF0ZSA9CisgICAgICAgIGZNdWx0SWZsb29yKGNoYW5uZWxNYXBwaW5nLT5lbEluZm9bZWxdLnJlbGF0aXZlQml0cywgYml0UmF0ZSk7CisgICAgc2JyRWxJbmZvW2VsXS5pbnN0YW5jZVRhZyA9IGNoYW5uZWxNYXBwaW5nLT5lbEluZm9bZWxdLmluc3RhbmNlVGFnOworICAgIHNickVsSW5mb1tlbF0ubkNoYW5uZWxzSW5FbCA9IGNoYW5uZWxNYXBwaW5nLT5lbEluZm9bZWxdLm5DaGFubmVsc0luRWw7CisgICAgc2JyRWxJbmZvW2VsXS5mUGFyYW1ldHJpY1N0ZXJlbyA9IDA7CisgICAgc2JyRWxJbmZvW2VsXS5mRHVhbE1vbm8gPSAwOwogCi0gICAgICBjb2RlYml0cyAtPSBzYnJFbEluZm9bZWxdLmJpdFJhdGU7CisgICAgY29kZWJpdHMgLT0gc2JyRWxJbmZvW2VsXS5iaXRSYXRlOwogICB9CiAgIHNickVsSW5mb1swXS5iaXRSYXRlICs9IGNvZGViaXRzOwogfQogCi0KLXN0YXRpYwotSU5UIGFhY0VuY29kZXJfTGltaXRCaXRyYXRlKAotICAgICAgICBjb25zdCBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoLAotICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAotICAgICAgICBjb25zdCBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsCi0gICAgICAgIElOVCBiaXRSYXRlLAotICAgICAgICBjb25zdCBJTlQgblN1YkZyYW1lcywKLSAgICAgICAgY29uc3QgSU5UIHNickFjdGl2ZSwKLSAgICAgICAgY29uc3QgSU5UIHNickRvd25TYW1wbGVSYXRlLAotICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhb3QKLSAgICAgICAgKQoteworc3RhdGljIElOVCBhYWNFbmNvZGVyX0xpbWl0Qml0cmF0ZShjb25zdCBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoLCBjb25zdCBJTlQgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsIElOVCBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblN1YkZyYW1lcywgY29uc3QgSU5UIHNickFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNickRvd25TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhb3QpIHsKICAgSU5UIGNvcmVTYW1wbGluZ1JhdGU7CiAgIENIQU5ORUxfTUFQUElORyBjbTsKIAogICBGREthYWNFbmNfSW5pdENoYW5uZWxNYXBwaW5nKGNoYW5uZWxNb2RlLCBDSF9PUkRFUl9NUEVHLCAmY20pOwogCiAgIGlmIChzYnJBY3RpdmUpIHsKLSAgICBjb3JlU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlID4+ICAoc2JyRW5jb2Rlcl9Jc1NpbmdsZVJhdGVQb3NzaWJsZShhb3QpID8gKHNickRvd25TYW1wbGVSYXRlLTEpOjEpOworICAgIGNvcmVTYW1wbGluZ1JhdGUgPQorICAgICAgICBzYW1wbGluZ1JhdGUgPj4KKyAgICAgICAgKHNickVuY29kZXJfSXNTaW5nbGVSYXRlUG9zc2libGUoYW90KSA/IChzYnJEb3duU2FtcGxlUmF0ZSAtIDEpIDogMSk7CiAgIH0gZWxzZSB7CiAgICAgY29yZVNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKICAgfQogCi0gIC8qIENvbnNpZGVyIGJhbmR3aWR0aCBjaGFubmVsIGJpdCByYXRlIGxpbWl0IChzZWUgYmFuZHdpZHRoLmNwcDogR2V0QmFuZHdpZHRoRW50cnkoKSkgKi8KLSAgaWYgKGFvdCA9PSBBT1RfRVJfQUFDX0xEIHx8IGFvdCA9PSBBT1RfRVJfQUFDX0VMRCkgewotICAgIGJpdFJhdGUgPSBGREttaW4oMzYwMDAwKm5DaGFubmVscywgYml0UmF0ZSk7Ci0gICAgYml0UmF0ZSA9IEZES21heCg4MDAwKm5DaGFubmVscywgYml0UmF0ZSk7Ci0gIH0KLQotICBpZiAoYW90ID09IEFPVF9BQUNfTEMgfHwgYW90ID09IEFPVF9TQlIgfHwgYW90ID09IEFPVF9QUykgIHsKLSAgICBiaXRSYXRlID0gRkRLbWluKDU3NjAwMCpuQ2hhbm5lbHMsIGJpdFJhdGUpOwotICAgIC8qYml0UmF0ZSA9IEZES21heCgwKm5DaGFubmVscywgYml0UmF0ZSk7Ki8KLSAgfQotCi0KICAgLyogTGltaXQgYml0IHJhdGUgaW4gcmVzcGVjdCB0byB0aGUgY29yZSBjb2RlciAqLwotICBiaXRSYXRlID0gRkRLYWFjRW5jX0xpbWl0Qml0cmF0ZSgKLSAgICAgICAgICBoVHBFbmMsCi0gICAgICAgICAgY29yZVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICBmcmFtZUxlbmd0aCwKLSAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgY20ubkNoYW5uZWxzRWZmLAotICAgICAgICAgIGJpdFJhdGUsCi0gICAgICAgICAgLTEsCi0gICAgICAgICAgTlVMTCwKLSAgICAgICAgICAtMSwKLSAgICAgICAgICBuU3ViRnJhbWVzCi0gICAgICAgICAgKTsKKyAgYml0UmF0ZSA9IEZES2FhY0VuY19MaW1pdEJpdHJhdGUoaFRwRW5jLCBhb3QsIGNvcmVTYW1wbGluZ1JhdGUsIGZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIGNtLm5DaGFubmVsc0VmZiwgYml0UmF0ZSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIEFBQ0VOQ19CUl9NT0RFX0lOVkFMSUQsIG5TdWJGcmFtZXMpOwogCiAgIC8qIExpbWl0IGJpdCByYXRlIGluIHJlc3BlY3QgdG8gYXZhaWxhYmxlIFNCUiBtb2RlcyBpZiBhY3RpdmUgKi8KLSAgaWYgKHNickFjdGl2ZSkKLSAgeworICBpZiAoc2JyQWN0aXZlKSB7CiAgICAgaW50IG51bUl0ZXJhdGlvbnMgPSAwOwogICAgIElOVCBpbml0aWFsQml0cmF0ZSwgYWRqdXN0ZWRCaXRyYXRlOwotICAgIGluaXRpYWxCaXRyYXRlID0gYWRqdXN0ZWRCaXRyYXRlID0gYml0UmF0ZTsKKyAgICBhZGp1c3RlZEJpdHJhdGUgPSBiaXRSYXRlOwogCi0gICAgLyogRmluZCB0b3RhbCBiaXRyYXRlIHdoaWNoIHByb3ZpZGVzIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggU0JSIGVsZW1lbnQuICovCisgICAgLyogRmluZCB0b3RhbCBiaXRyYXRlIHdoaWNoIHByb3ZpZGVzIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggU0JSCisgICAgICogZWxlbWVudC4gKi8KICAgICBkbyB7CiAgICAgICBpbnQgZTsKLSAgICAgIFNCUl9FTEVNRU5UX0lORk8gc2JyRWxJbmZvWyg4KV07Ci0gICAgICBGREtfQVNTRVJUKGNtLm5FbGVtZW50cyA8PSAoOCkpOworICAgICAgU0JSX0VMRU1FTlRfSU5GTyBzYnJFbEluZm9bKCg4KSldOworICAgICAgRkRLX0FTU0VSVChjbS5uRWxlbWVudHMgPD0gKCg4KSkpOwogCiAgICAgICBpbml0aWFsQml0cmF0ZSA9IGFkanVzdGVkQml0cmF0ZTsKIAogICAgICAgLyogR2V0IGJpdCByYXRlIGZvciBlYWNoIFNCUiBlbGVtZW50ICovCiAgICAgICBhYWNFbmNEaXN0cmlidXRlU2JyQml0cygmY20sIHNickVsSW5mbywgaW5pdGlhbEJpdHJhdGUpOwogCi0gICAgICBmb3IgKGU9MDsgZTxjbS5uRWxlbWVudHM7IGUrKykKLSAgICAgIHsKKyAgICAgIGZvciAoZSA9IDA7IGUgPCBjbS5uRWxlbWVudHM7IGUrKykgewogICAgICAgICBJTlQgc2JyRWxlbWVudEJpdFJhdGVJbiwgc2JyQml0UmF0ZU91dDsKIAogICAgICAgICBpZiAoY20uZWxJbmZvW2VdLmVsVHlwZSAhPSBJRF9TQ0UgJiYgY20uZWxJbmZvW2VdLmVsVHlwZSAhPSBJRF9DUEUpIHsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBzYnJFbGVtZW50Qml0UmF0ZUluID0gc2JyRWxJbmZvW2VdLmJpdFJhdGU7Ci0gICAgICAgIHNickJpdFJhdGVPdXQgPSBzYnJFbmNvZGVyX0xpbWl0Qml0UmF0ZShzYnJFbGVtZW50Qml0UmF0ZUluICwgY20uZWxJbmZvW2VdLm5DaGFubmVsc0luRWwsIGNvcmVTYW1wbGluZ1JhdGUsIGFvdCk7CisKKyAgICAgICAgc2JyQml0UmF0ZU91dCA9IHNickVuY29kZXJfTGltaXRCaXRSYXRlKHNickVsZW1lbnRCaXRSYXRlSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS5lbEluZm9bZV0ubkNoYW5uZWxzSW5FbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVTYW1wbGluZ1JhdGUsIGFvdCk7CisKICAgICAgICAgaWYgKHNickJpdFJhdGVPdXQgPT0gMCkgewogICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAKLSAgICAgICAgLyogSWYgYml0cmF0ZXMgZG9uJ3QgbWF0Y2gsIGRpc3RyaWJ1dGlvbiBhbmQgbGltaXRpbmcgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBhZ2Fpbi4KLSAgICAgICAgICAgQWJvcnQgZWxlbWVudCBsb29wIGFuZCByZXN0YXJ0IHdpdGggYWRhcHRlZCBiaXRyYXRlLiAqLworICAgICAgICAvKiBJZiBiaXRyYXRlcyBkb24ndCBtYXRjaCwgZGlzdHJpYnV0aW9uIGFuZCBsaW1pdGluZyBuZWVkcyB0byBiZQorICAgICAgICAgICBkZXRlcm1pbmVkIGFnYWluLiBBYm9ydCBlbGVtZW50IGxvb3AgYW5kIHJlc3RhcnQgd2l0aCBhZGFwdGVkCisgICAgICAgICAgIGJpdHJhdGUuICovCiAgICAgICAgIGlmIChzYnJFbGVtZW50Qml0UmF0ZUluICE9IHNickJpdFJhdGVPdXQpIHsKLQogICAgICAgICAgIGlmIChzYnJFbGVtZW50Qml0UmF0ZUluIDwgc2JyQml0UmF0ZU91dCkgewotICAgICAgICAgICAgYWRqdXN0ZWRCaXRyYXRlID0gZk1heChpbml0aWFsQml0cmF0ZSwgKElOVClmRGl2Tm9ybSgoRklYUF9EQkwpKHNickJpdFJhdGVPdXQrOCksIGNtLmVsSW5mb1tlXS5yZWxhdGl2ZUJpdHMpKTsKKyAgICAgICAgICAgIGFkanVzdGVkQml0cmF0ZSA9IGZNYXgoaW5pdGlhbEJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpZkRpdk5vcm0oKEZJWFBfREJMKShzYnJCaXRSYXRlT3V0ICsgOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20uZWxJbmZvW2VdLnJlbGF0aXZlQml0cykpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogCiAgICAgICAgICAgaWYgKHNickVsZW1lbnRCaXRSYXRlSW4gPiBzYnJCaXRSYXRlT3V0KSB7Ci0gICAgICAgICAgICBhZGp1c3RlZEJpdHJhdGUgPSBmTWluKGluaXRpYWxCaXRyYXRlLCAoSU5UKWZEaXZOb3JtKChGSVhQX0RCTCkoc2JyQml0UmF0ZU91dC04KSwgY20uZWxJbmZvW2VdLnJlbGF0aXZlQml0cykpOworICAgICAgICAgICAgYWRqdXN0ZWRCaXRyYXRlID0gZk1pbihpbml0aWFsQml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVClmRGl2Tm9ybSgoRklYUF9EQkwpKHNickJpdFJhdGVPdXQgLSA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS5lbEluZm9bZV0ucmVsYXRpdmVCaXRzKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAKQEAgLTcxNiwyODkgKzc5MCw0MjIgQEAKIAogICAgICAgbnVtSXRlcmF0aW9ucysrOyAvKiByZXN0cmljdCBpdGVyYXRpb24gdG8gd29yc3QgY2FzZSBvZiBudW0gZWxlbWVudHMgKi8KIAotICAgIH0gd2hpbGUgKCAoaW5pdGlhbEJpdHJhdGUhPWFkanVzdGVkQml0cmF0ZSkgJiYgKG51bUl0ZXJhdGlvbnM8PWNtLm5FbGVtZW50cykgKTsKKyAgICB9IHdoaWxlICgoaW5pdGlhbEJpdHJhdGUgIT0gYWRqdXN0ZWRCaXRyYXRlKSAmJgorICAgICAgICAgICAgIChudW1JdGVyYXRpb25zIDw9IGNtLm5FbGVtZW50cykpOwogCiAgICAgLyogVW5lcXVhbCBiaXRyYXRlcyBtZWFuIHRoYXQgbm8gcmVhc29uYWJsZSBiaXRyYXRlIGNvbmZpZ3VyYXRpb24gZm91bmQuICovCi0gICAgYml0UmF0ZSA9IChpbml0aWFsQml0cmF0ZT09YWRqdXN0ZWRCaXRyYXRlKSA/IGFkanVzdGVkQml0cmF0ZSA6IDA7CisgICAgYml0UmF0ZSA9IChpbml0aWFsQml0cmF0ZSA9PSBhZGp1c3RlZEJpdHJhdGUpID8gYWRqdXN0ZWRCaXRyYXRlIDogMDsKICAgfQogCi0gIEZES19BU1NFUlQoYml0UmF0ZSA+IDApOworICAvKiBMaW1pdCBiaXQgcmF0ZSBpbiByZXNwZWN0IHRvIGF2YWlsYWJsZSBNUFMgbW9kZXMgaWYgYWN0aXZlICovCisgIGlmICgoYW90ID09IEFPVF9FUl9BQUNfRUxEKSAmJiAoc3ludGF4RmxhZ3MgJiBBQ19MRF9NUFMpICYmCisgICAgICAoY2hhbm5lbE1vZGUgPT0gTU9ERV8xKSkgeworICAgIGJpdFJhdGUgPSBGREtfTXBlZ3NFbmNfR2V0Q2xvc2VzdEJpdFJhdGUoCisgICAgICAgIGFvdCwgTU9ERV8yMTIsIHNhbXBsaW5nUmF0ZSwgKHNickFjdGl2ZSkgPyBzYnJEb3duU2FtcGxlUmF0ZSA6IDAsCisgICAgICAgIGJpdFJhdGUpOworICB9CiAKICAgcmV0dXJuIGJpdFJhdGU7CiB9CiAKIC8qCisgKiBcYnJpZWYgR2V0IENCUiBiaXRyYXRlCisgKgorICogXGhBYWNDb25maWcgSW50ZXJuYWwgZW5jb2RlciBjb25maWcKKyAqIFxyZXR1cm4gICAgIEJpdHJhdGUKKyAqLworc3RhdGljIElOVCBGREthYWNFbmNfR2V0Q0JSQml0cmF0ZShjb25zdCBIQU5ETEVfQUFDRU5DX0NPTkZJRyBoQWFjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdXNlclNiclJhdGlvKSB7CisgIElOVCBiaXRyYXRlID0gRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbihoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgLT5uQ2hhbm5lbHNFZmYgKgorICAgICAgICAgICAgICAgIGhBYWNDb25maWctPnNhbXBsZVJhdGU7CisKKyAgaWYgKGlzUHNBY3RpdmUoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSkgeworICAgIGJpdHJhdGUgPSAxICogYml0cmF0ZTsgLyogMC41IGJpdCBwZXIgc2FtcGxlICovCisgIH0gZWxzZSBpZiAoaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykpIHsKKyAgICBpZiAoKHVzZXJTYnJSYXRpbyA9PSAyKSB8fAorICAgICAgICAoKHVzZXJTYnJSYXRpbyA9PSAwKSAmJgorICAgICAgICAgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSAhPSBBT1RfRVJfQUFDX0VMRCkpKSB7CisgICAgICBiaXRyYXRlID0gKGJpdHJhdGUgKyAoYml0cmF0ZSA+PiAyKSkgPj4gMTsgLyogMC42MjUgYml0cyBwZXIgc2FtcGxlICovCisgICAgfQorICAgIGlmICgodXNlclNiclJhdGlvID09IDEpIHx8CisgICAgICAgICgodXNlclNiclJhdGlvID09IDApICYmCisgICAgICAgICAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9BQUNfRUxEKSkpIHsKKyAgICAgIGJpdHJhdGUgPSAoYml0cmF0ZSArIChiaXRyYXRlID4+IDMpKTsgLyogMS4xMjUgYml0cyBwZXIgc2FtcGxlICovCisgICAgfQorICB9IGVsc2UgeworICAgIGJpdHJhdGUgPSBiaXRyYXRlICsgKGJpdHJhdGUgPj4gMSk7IC8qIDEuNSBiaXRzIHBlciBzYW1wbGUgKi8KKyAgfQorCisgIHJldHVybiBiaXRyYXRlOworfQorCisvKgogICogXGJyaWVmIENvbnNpc3RlbmN5IGNoZWNrIG9mIGdpdmVuIFVTRVJfUEFSQU0gc3RydWN0IGFuZAogICogICBjb3B5IGJhY2sgY29uZmlndXJhdGlvbiBmcm9tIHB1YmxpYyBzdHJ1Y3QgaW50byBpbnRlcm5hbAogICogICBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gc3RydWN0LgogICoKICAqIFxoQWFjRW5jb2RlciBJbnRlcm5hbCBlbmNvZGVyIGNvbmZpZyB3aGljaCBpcyB0byBiZSB1cGRhdGVkCiAgKiBccGFyYW0gY29uZmlnIFVzZXIgcHJvdmlkZWQgY29uZmlnIChwdWJsaWMgc3RydWN0KQotICogXHJldHVybiC0cmV0dXJucyBhbHdheXMgQUFDX0VOQ19PSworICogXHJldHVybiByZXR1cm5zIGFsd2F5cyBBQUNfRU5DX09LCiAgKi8KLXN0YXRpYwotQUFDRU5DX0VSUk9SIEZES2FhY0VuY19BZGp1c3RFbmNTZXR0aW5ncyhIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFUl9QQVJBTSAqY29uZmlnKQotewotICAgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7CitzdGF0aWMgQUFDRU5DX0VSUk9SIEZES2FhY0VuY19BZGp1c3RFbmNTZXR0aW5ncyhIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfUEFSQU0gKmNvbmZpZykgeworICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOwogCi0gICAgLyogR2V0IHN0cnVjdCBwb2ludGVycy4gKi8KLSAgICBIQU5ETEVfQUFDRU5DX0NPTkZJRyAgICBoQWFjQ29uZmlnID0gJmhBYWNFbmNvZGVyLT5hYWNDb25maWc7CisgIC8qIEdldCBzdHJ1Y3QgcG9pbnRlcnMuICovCisgIEhBTkRMRV9BQUNFTkNfQ09ORklHIGhBYWNDb25maWcgPSAmaEFhY0VuY29kZXItPmFhY0NvbmZpZzsKIAotICAgIGhBYWNDb25maWctPm5DaGFubmVscyAgICAgICA9IGNvbmZpZy0+bkNoYW5uZWxzOworICAvKiBFbmNvZGVyIHNldHRpbmdzIHVwZGF0ZS4gKi8KKyAgaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSA9IGNvbmZpZy0+dXNlclNhbXBsZXJhdGU7CisgIGlmIChjb25maWctPnVzZXJEb3duc2NhbGVGYWN0b3IgPiAxKSB7CisgICAgaEFhY0NvbmZpZy0+dXNlVG5zID0gMDsKKyAgICBoQWFjQ29uZmlnLT51c2VQbnMgPSAwOworICAgIGhBYWNDb25maWctPnVzZUlTID0gMDsKKyAgfSBlbHNlIHsKKyAgICBoQWFjQ29uZmlnLT51c2VUbnMgPSBjb25maWctPnVzZXJUbnM7CisgICAgaEFhY0NvbmZpZy0+dXNlUG5zID0gY29uZmlnLT51c2VyUG5zOworICAgIGhBYWNDb25maWctPnVzZUlTID0gY29uZmlnLT51c2VySW50ZW5zaXR5OworICB9CiAKLSAgICAvKiBFbmNvZGVyIHNldHRpbmdzIHVwZGF0ZS4gKi8KLSAgICBoQWFjQ29uZmlnLT5zYW1wbGVSYXRlICAgICAgPSBjb25maWctPnVzZXJTYW1wbGVyYXRlOwotICAgIGhBYWNDb25maWctPnVzZVRucyAgICAgICAgICA9IGNvbmZpZy0+dXNlclRuczsKLSAgICBoQWFjQ29uZmlnLT51c2VQbnMgICAgICAgICAgPSBjb25maWctPnVzZXJQbnM7Ci0gICAgaEFhY0NvbmZpZy0+dXNlSVMgICAgICAgICAgID0gY29uZmlnLT51c2VySW50ZW5zaXR5OwotICAgIGhBYWNDb25maWctPmJpdFJhdGUgICAgICAgICA9IGNvbmZpZy0+dXNlckJpdHJhdGU7Ci0gICAgaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgICAgID0gY29uZmlnLT51c2VyQ2hhbm5lbE1vZGU7Ci0gICAgaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGUgICAgID0gY29uZmlnLT51c2VyQml0cmF0ZU1vZGU7Ci0gICAgaEFhY0NvbmZpZy0+YmFuZFdpZHRoICAgICAgID0gY29uZmlnLT51c2VyQmFuZHdpZHRoOwotICAgIGhBYWNDb25maWctPnVzZVJlcXVhbnQgICAgICA9IGNvbmZpZy0+dXNlckFmdGVyYnVybmVyOworICBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPSBjb25maWctPnVzZXJBT1Q7CisgIGhBYWNDb25maWctPmNoYW5uZWxNb2RlID0KKyAgICAgIEdldENvcmVDaGFubmVsTW9kZShjb25maWctPnVzZXJDaGFubmVsTW9kZSwgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlKTsKKyAgaEFhY0NvbmZpZy0+bkNoYW5uZWxzID0KKyAgICAgIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUpLT5uQ2hhbm5lbHM7CisgIGhBYWNDb25maWctPmJpdHJhdGVNb2RlID0gKEFBQ0VOQ19CSVRSQVRFX01PREUpY29uZmlnLT51c2VyQml0cmF0ZU1vZGU7CisgIGhBYWNDb25maWctPmJhbmRXaWR0aCA9IGNvbmZpZy0+dXNlckJhbmR3aWR0aDsKKyAgaEFhY0NvbmZpZy0+dXNlUmVxdWFudCA9IGNvbmZpZy0+dXNlckFmdGVyYnVybmVyOwogCi0gICAgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID0gY29uZmlnLT51c2VyQU9UOwotICAgIGhBYWNDb25maWctPmFuY19SYXRlICAgICAgICA9IGNvbmZpZy0+dXNlckFuY0RhdGFSYXRlOwotICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzICAgICA9IDA7Ci0gICAgaEFhY0NvbmZpZy0+ZXBDb25maWcgICAgICAgID0gLTE7CisgIGhBYWNDb25maWctPmFuY19SYXRlID0gY29uZmlnLT51c2VyQW5jRGF0YVJhdGU7CisgIGhBYWNDb25maWctPnN5bnRheEZsYWdzID0gMDsKKyAgaEFhY0NvbmZpZy0+ZXBDb25maWcgPSAtMTsKIAotICAgIGlmIChjb25maWctPnVzZXJUcFR5cGU9PVRUX01QNF9MQVRNX01DUDEgfHwgY29uZmlnLT51c2VyVHBUeXBlPT1UVF9NUDRfTEFUTV9NQ1AwIHx8IGNvbmZpZy0+dXNlclRwVHlwZT09VFRfTVA0X0xPQVMpIHsKLSAgICAgIGhBYWNDb25maWctPmF1ZGlvTXV4VmVyc2lvbiA9IGNvbmZpZy0+dXNlclRwQW14djsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBoQWFjQ29uZmlnLT5hdWRpb011eFZlcnNpb24gPSAtMTsKLSAgICB9CisgIGlmIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgIT0gQU9UX0VSX0FBQ19FTEQgJiYKKyAgICAgIGNvbmZpZy0+dXNlckRvd25zY2FsZUZhY3RvciA+IDEpIHsKKyAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOyAvKiBkb3duc2NhbGluZyBvbmx5IGFsbG93ZWQgZm9yIEFPVF9FUl9BQUNfRUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIH0KKyAgaWYgKGNvbmZpZy0+dXNlckRvd25zY2FsZUZhY3RvciA+IDEgJiYgY29uZmlnLT51c2VyU2JyRW5hYmxlZCA9PSAxKSB7CisgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsgLyogZG93bnNjYWxpbmcgb25seSBhbGxvd2VkIGZvciBBT1RfRVJfQUFDX0VMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcvbyBTQlIgKi8KKyAgfQorICBpZiAoY29uZmlnLT51c2VyRG93bnNjYWxlRmFjdG9yID4gMSAmJiBjb25maWctPnVzZXJDaGFubmVsTW9kZSA9PSAxMjgpIHsKKyAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOyAvKiBkaXNhbGxvdyBkb3duc2NhbGluZyBmb3IgQUFDLUVMRHYyICovCisgIH0KIAotICAgIC8qIEFkYXB0IGludGVybmFsIEFPVCB3aGVuIG5lY2Vzc2FyeS4gKi8KLSAgICBzd2l0Y2ggKCBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgKSB7Ci0gICAgICBjYXNlIEFPVF9BQUNfTEM6Ci0gICAgICBjYXNlIEFPVF9TQlI6Ci0gICAgICBjYXNlIEFPVF9QUzoKLSAgICAgICAgICBjb25maWctPnVzZXJUcFR5cGUgPSAoY29uZmlnLT51c2VyVHBUeXBlIT1UVF9VTktOT1dOKSA/IGNvbmZpZy0+dXNlclRwVHlwZSA6IFRUX01QNF9BRFRTOwotICAgICAgICAgIGhBYWNDb25maWctPmZyYW1lbGVuZ3RoID0gKGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoIT0oVUlOVCktMSkgPyBjb25maWctPnVzZXJGcmFtZWxlbmd0aCA6IDEwMjQ7Ci0gICAgICAgICAgaWYgKGhBYWNDb25maWctPmZyYW1lbGVuZ3RoICE9IDEwMjQpIHsKLSAgICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgotICAgICAgICAgIGhBYWNDb25maWctPmVwQ29uZmlnID0gMDsKLSAgICAgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSBBQ19FUnxBQ19MRDsKLSAgICAgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGNvbmZpZy0+dXNlckVyVG9vbHMgJiAweDEpID8gQUNfRVJfVkNCMTEgOiAwKTsKLSAgICAgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGNvbmZpZy0+dXNlckVyVG9vbHMgJiAweDIpID8gQUNfRVJfSENSIDogMCk7Ci0gICAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChjb25maWctPnVzZXJFclRvb2xzICYgMHg0KSA/IEFDX0VSX1JWTEMgOiAwKTsKLSAgICAgICAgICBjb25maWctPnVzZXJUcFR5cGUgPSAoY29uZmlnLT51c2VyVHBUeXBlIT1UVF9VTktOT1dOKSA/IGNvbmZpZy0+dXNlclRwVHlwZSA6IFRUX01QNF9MT0FTOwotICAgICAgICAgIGhBYWNDb25maWctPmZyYW1lbGVuZ3RoID0gKGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoIT0oVUlOVCktMSkgPyBjb25maWctPnVzZXJGcmFtZWxlbmd0aCA6IDUxMjsKLSAgICAgICAgICBpZiAoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gNTEyICYmIGhBYWNDb25maWctPmZyYW1lbGVuZ3RoICE9IDQ4MCkgewotICAgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgotICAgICAgICAgIGhBYWNDb25maWctPmVwQ29uZmlnID0gMDsKLSAgICAgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSBBQ19FUnxBQ19FTEQ7Ci0gICAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChjb25maWctPnVzZXJFclRvb2xzICYgMHgxKSA/IEFDX0VSX1ZDQjExIDogMCk7Ci0gICAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChjb25maWctPnVzZXJFclRvb2xzICYgMHgyKSA/IEFDX0VSX0hDUiA6IDApOwotICAgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9ICgoY29uZmlnLT51c2VyRXJUb29scyAmIDB4NCkgPyBBQ19FUl9SVkxDIDogMCk7Ci0gICAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChjb25maWctPnVzZXJTYnJFbmFibGVkPT0xKSAgPyBBQ19TQlJfUFJFU0VOVCA6IDApOwotICAgICAgICAgIGNvbmZpZy0+dXNlclRwVHlwZSA9IChjb25maWctPnVzZXJUcFR5cGUhPVRUX1VOS05PV04pID8gY29uZmlnLT51c2VyVHBUeXBlIDogVFRfTVA0X0xPQVM7Ci0gICAgICAgICAgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggPSAoY29uZmlnLT51c2VyRnJhbWVsZW5ndGghPShVSU5UKS0xKSA/IGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoIDogNTEyOwotICAgICAgICAgIGlmIChoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSA1MTIgJiYgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gNDgwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgfQorICBpZiAoY29uZmlnLT51c2VyVHBUeXBlID09IFRUX01QNF9MQVRNX01DUDEgfHwKKyAgICAgIGNvbmZpZy0+dXNlclRwVHlwZSA9PSBUVF9NUDRfTEFUTV9NQ1AwIHx8CisgICAgICBjb25maWctPnVzZXJUcFR5cGUgPT0gVFRfTVA0X0xPQVMpIHsKKyAgICBoQWFjQ29uZmlnLT5hdWRpb011eFZlcnNpb24gPSBjb25maWctPnVzZXJUcEFteHY7CisgIH0gZWxzZSB7CisgICAgaEFhY0NvbmZpZy0+YXVkaW9NdXhWZXJzaW9uID0gLTE7CisgIH0KIAotICAgIHN3aXRjaCAoIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSApIHsKLSAgICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKLSAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6Ci0gICAgICAgIGlmIChjb25maWctPnVzZXJCaXRyYXRlTW9kZT09MCkgewotICAgICAgICAgIC8qIGJpdHJlc2Vydm9pciAgPSAobWF4Qml0UmVzLW1pbkJpdFJlcykvKG1heEJpdFJhdGUtbWluQml0cmF0ZSkqKGJpdFJhdGUtbWluQml0cmF0ZSkrbWluQml0UmVzOyAqLwotICAgICAgICAgIGlmICggaXNMb3dEZWxheShoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUpICkgewotICAgICAgICAgICAgSU5UIGJpdHJlc2Vydm9pcjsKLSAgICAgICAgICAgIElOVCBiclBlckNoYW5uZWwgPSBoQWFjQ29uZmlnLT5iaXRSYXRlL2hBYWNDb25maWctPm5DaGFubmVsczsKLSAgICAgICAgICAgIGJyUGVyQ2hhbm5lbCAgICAgPSBmTWluKEJJVFJBVEVfTUFYX0xELCBmTWF4KEJJVFJBVEVfTUlOX0xELCBiclBlckNoYW5uZWwpKTsKLSAgICAgICAgICAgIEZJWFBfREJMIHNsb3BlICAgPSBmRGl2Tm9ybSgoYnJQZXJDaGFubmVsLUJJVFJBVEVfTUlOX0xEKSwgQklUUkFURV9NQVhfTEQtQklUUkFURV9NSU5fTEQpOyAvKiBjYWxjIHNsb3BlIGZvciBpbnRlcnBvbGF0aW9uICovCi0gICAgICAgICAgICBiaXRyZXNlcnZvaXIgICAgID0gZk11bHRJKHNsb3BlLCAoSU5UKShCSVRSRVNfTUFYX0xELUJJVFJFU19NSU5fTEQpKSArIEJJVFJFU19NSU5fTEQ7IC8qIGludGVycG9sYXRlICovCi0gICAgICAgICAgICBoQWFjQ29uZmlnLT5iaXRyZXNlcnZvaXIgPSBiaXRyZXNlcnZvaXIgJiB+NzsgLyogYWxpZ24gdG8gYnl0ZXMgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhBYWNDb25maWctPmJpdHJhdGVNb2RlIT0wKSB7Ci0gICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGhBYWNDb25maWctPmJpdFJhdGUgPSBjb25maWctPnVzZXJCaXRyYXRlOwotCi0gICAgLyogZ2V0IGJpdHJhdGUgaW4gVkJSIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBpZiAoIChoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZT49MSkgJiYgKGhBYWNDb25maWctPmJpdHJhdGVNb2RlPD01KSApIHsKLSAgICAgICAgLyogSW4gVkJSIG1vZGU7IFNCUi1tb2R1bCBkZXBlbmRzIG9uIGJpdHJhdGUsIGNvcmUgZW5jb2RlciBvbiBiaXRyYXRlTW9kZS4gKi8KLSAgICAgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSA9IEZES2FhY0VuY19HZXRWQlJCaXRyYXRlKGhBYWNDb25maWctPmJpdHJhdGVNb2RlLCBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSk7Ci0gICAgfQotCi0KLQotICAgIC8qIFNldCBkZWZhdWx0IGJpdHJhdGUgaWYgbm8gZXh0ZXJuYWwgYml0cmF0ZSBkZWNsYXJlZC4gKi8KLSAgICBpZiAoIChoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZT09MCkgJiYgKGNvbmZpZy0+dXNlckJpdHJhdGU9PShVSU5UKS0xKSApIHsKLSAgICAgICAgSU5UIGJpdHJhdGUgPSBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGhBYWNDb25maWctPmNoYW5uZWxNb2RlKS0+bkNoYW5uZWxzRWZmICogaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZTsKLQotICAgICAgICBpZiAoIGlzUHNBY3RpdmUoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSApIHsKLSAgICAgICAgICBoQWFjQ29uZmlnLT5iaXRSYXRlID0gKGJpdHJhdGU+PjEpOyAgICAgICAgICAgICAgICAgIC8qIDAuNSBiaXQgcGVyIHNhbXBsZSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBpc1NickFjdGl2ZShoQWFjQ29uZmlnKSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIChjb25maWctPnVzZXJTYnJSYXRpbz09MikgfHwgKChjb25maWctPnVzZXJTYnJSYXRpbz09MCkmJihoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUhPUFPVF9FUl9BQUNfRUxEKSkgKSB7Ci0gICAgICAgICAgICBoQWFjQ29uZmlnLT5iaXRSYXRlID0gKGJpdHJhdGUgKyAoYml0cmF0ZT4+MikpPj4xOyAvKiAwLjYyNSBiaXRzIHBlciBzYW1wbGUgKi8KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCAoY29uZmlnLT51c2VyU2JyUmF0aW89PTEpIHx8ICgoY29uZmlnLT51c2VyU2JyUmF0aW89PTApJiYoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfRVJfQUFDX0VMRCkpICkgewotICAgICAgICAgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSA9IChiaXRyYXRlICsgKGJpdHJhdGU+PjMpKTsgICAgLyogMS4xMjUgYml0cyBwZXIgc2FtcGxlICovCi0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGhBYWNDb25maWctPmJpdFJhdGUgPSBiaXRyYXRlICsgKGJpdHJhdGU+PjEpOyAgICAgICAgLyogMS41IGJpdHMgcGVyIHNhbXBsZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKChoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZSA+PSAwKSAmJiAoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGUgPD0gNSkpIHsKLSAgICAgIGlmICgoSU5UKWNvbmZpZy0+dXNlclBlYWtCaXRyYXRlICE9IC0xKSB7Ci0gICAgICAgIGhBYWNDb25maWctPm1heEJpdHNQZXJGcmFtZSA9IChGREthYWNFbmNfQ2FsY0JpdHNQZXJGcmFtZShmTWF4KGhBYWNDb25maWctPmJpdFJhdGUsIChJTlQpY29uZmlnLT51c2VyUGVha0JpdHJhdGUpLCBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCwgaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSkgKyA3KSZ+NzsKKyAgLyogQWRhcHQgaW50ZXJuYWwgQU9UIHdoZW4gbmVjZXNzYXJ5LiAqLworICBzd2l0Y2ggKGNvbmZpZy0+dXNlckFPVCkgeworICAgIGNhc2UgQU9UX01QMl9BQUNfTEM6CisgICAgY2FzZSBBT1RfTVAyX1NCUjoKKyAgICAgIGhBYWNDb25maWctPnVzZVBucyA9IDA7CisgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgIGNhc2UgQU9UX1NCUjoKKyAgICBjYXNlIEFPVF9QUzoKKyAgICAgIGNvbmZpZy0+dXNlclRwVHlwZSA9CisgICAgICAgICAgKGNvbmZpZy0+dXNlclRwVHlwZSAhPSBUVF9VTktOT1dOKSA/IGNvbmZpZy0+dXNlclRwVHlwZSA6IFRUX01QNF9BRFRTOworICAgICAgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggPSAoY29uZmlnLT51c2VyRnJhbWVsZW5ndGggIT0gKFVJTlQpLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDEwMjQ7CisgICAgICBpZiAoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gMTAyNCAmJiBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSA5NjApIHsKKyAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKICAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgYnJlYWs7CisgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgorICAgICAgaEFhY0NvbmZpZy0+ZXBDb25maWcgPSAwOworICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gQUNfRVIgfCBBQ19MRDsKKyAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9CisgICAgICAgICAgKChjb25maWctPnVzZXJFclRvb2xzICYgMHgxKSA/IEFDX0VSX1ZDQjExIDogMCk7CisgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGNvbmZpZy0+dXNlckVyVG9vbHMgJiAweDIpID8gQUNfRVJfSENSIDogMCk7CisgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGNvbmZpZy0+dXNlckVyVG9vbHMgJiAweDQpID8gQUNfRVJfUlZMQyA6IDApOworICAgICAgY29uZmlnLT51c2VyVHBUeXBlID0KKyAgICAgICAgICAoY29uZmlnLT51c2VyVHBUeXBlICE9IFRUX1VOS05PV04pID8gY29uZmlnLT51c2VyVHBUeXBlIDogVFRfTVA0X0xPQVM7CisgICAgICBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCA9CisgICAgICAgICAgKGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoICE9IChVSU5UKS0xKSA/IGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoIDogNTEyOworICAgICAgaWYgKGhBYWNDb25maWctPmZyYW1lbGVuZ3RoICE9IDUxMiAmJiBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSA0ODApIHsKKyAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgICBoQWFjQ29uZmlnLT5lcENvbmZpZyA9IDA7CisgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSBBQ19FUiB8IEFDX0VMRDsKKyAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9CisgICAgICAgICAgKChjb25maWctPnVzZXJFclRvb2xzICYgMHgxKSA/IEFDX0VSX1ZDQjExIDogMCk7CisgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGNvbmZpZy0+dXNlckVyVG9vbHMgJiAweDIpID8gQUNfRVJfSENSIDogMCk7CisgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGNvbmZpZy0+dXNlckVyVG9vbHMgJiAweDQpID8gQUNfRVJfUlZMQyA6IDApOworICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0KKyAgICAgICAgICAoKGNvbmZpZy0+dXNlclNickVuYWJsZWQgPT0gMSkgPyBBQ19TQlJfUFJFU0VOVCA6IDApOworICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0KKyAgICAgICAgICAoKGNvbmZpZy0+dXNlckNoYW5uZWxNb2RlID09IE1PREVfMjEyKSA/IEFDX0xEX01QUyA6IDApOworICAgICAgY29uZmlnLT51c2VyVHBUeXBlID0KKyAgICAgICAgICAoY29uZmlnLT51c2VyVHBUeXBlICE9IFRUX1VOS05PV04pID8gY29uZmlnLT51c2VyVHBUeXBlIDogVFRfTVA0X0xPQVM7CisgICAgICBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCA9CisgICAgICAgICAgKGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoICE9IChVSU5UKS0xKSA/IGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoIDogNTEyOworCisgICAgICBoQWFjQ29uZmlnLT5kb3duc2NhbGVGYWN0b3IgPSBjb25maWctPnVzZXJEb3duc2NhbGVGYWN0b3I7CisKKyAgICAgIHN3aXRjaCAoY29uZmlnLT51c2VyRG93bnNjYWxlRmFjdG9yKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gQUNfRUxEX0RPV05TQ0FMRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgfQorCisgICAgICBpZiAoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gNTEyICYmIGhBYWNDb25maWctPmZyYW1lbGVuZ3RoICE9IDQ4MCAmJgorICAgICAgICAgIGhBYWNDb25maWctPmZyYW1lbGVuZ3RoICE9IDI1NiAmJiBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSAyNDAgJiYKKyAgICAgICAgICBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSAxMjggJiYgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gMTIwKSB7CisgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBJbml0aWFsaXplIFNCUiBwYXJhbWV0ZXJzICovCisgIGlmICgoY29uZmlnLT51c2VyU2JyUmF0aW8gPT0gMCkgJiYgKGlzU2JyQWN0aXZlKGhBYWNDb25maWcpKSkgeworICAgIC8qIEF1dG9tYXRpYyBTQlIgcmF0aW8gY29uZmlndXJhdGlvbgorICAgICAqIC0gZG93bnNhbXBsZWQgU0JSIGZvciBFTEQKKyAgICAgKiAtIG90aGVyd2lzZSBhbHdheXMgZHVhbHJhdGUgU0JSCisgICAgICovCisgICAgaWYgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgICAgaEFhY0NvbmZpZy0+c2JyUmF0aW8gPSAoKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfTERfTVBTKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhBYWNDb25maWctPnNhbXBsZVJhdGUgPj0gMjc3MTMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGhBYWNDb25maWctPnNiclJhdGlvID0gMjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogU0JSIHJhdGlvIGhhcyBiZWVuIHNldCBieSB0aGUgdXNlciwgc28gdXNlIGl0LiAqLworICAgIGhBYWNDb25maWctPnNiclJhdGlvID0gaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykgPyBjb25maWctPnVzZXJTYnJSYXRpbyA6IDA7CisgIH0KKworICAvKiBTZXQgZGVmYXVsdCBiaXRyYXRlICovCisgIGhBYWNDb25maWctPmJpdFJhdGUgPSBjb25maWctPnVzZXJCaXRyYXRlOworCisgIHN3aXRjaCAoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGUpIHsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0NCUjoKKyAgICAgIC8qIFNldCBkZWZhdWx0IGJpdHJhdGUgaWYgbm8gZXh0ZXJuYWwgYml0cmF0ZSBkZWNsYXJlZC4gKi8KKyAgICAgIGlmIChjb25maWctPnVzZXJCaXRyYXRlID09IChVSU5UKS0xKSB7CisgICAgICAgIGhBYWNDb25maWctPmJpdFJhdGUgPQorICAgICAgICAgICAgRkRLYWFjRW5jX0dldENCUkJpdHJhdGUoaEFhY0NvbmZpZywgY29uZmlnLT51c2VyU2JyUmF0aW8pOworICAgICAgfQorICAgICAgaEFhY0NvbmZpZy0+YXZlcmFnZUJpdHMgPSAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzE6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzQ6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKKyAgICAgIC8qIEdldCBiaXRyYXRlIGluIFZCUiBjb25maWd1cmF0aW9uICovCisgICAgICAvKiBJbiBWQlIgbW9kZTsgU0JSLW1vZHVsIGRlcGVuZHMgb24gYml0cmF0ZSwgY29yZSBlbmNvZGVyIG9uIGJpdHJhdGVNb2RlLgorICAgICAgICovCisgICAgICBoQWFjQ29uZmlnLT5iaXRSYXRlID0gRkRLYWFjRW5jX0dldFZCUkJpdHJhdGUoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgIH0KKworICAvKiBzZXQgYml0cmVzZXJ2b2lyIHNpemUgKi8KKyAgc3dpdGNoIChoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZSkgeworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzE6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzQ6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0NCUjoKKyAgICAgIGlmICgoSU5UKWNvbmZpZy0+dXNlclBlYWtCaXRyYXRlICE9IC0xKSB7CisgICAgICAgIGhBYWNDb25maWctPm1heEJpdHNQZXJGcmFtZSA9CisgICAgICAgICAgICAoRkRLYWFjRW5jX0NhbGNCaXRzUGVyRnJhbWUoCisgICAgICAgICAgICAgICAgIGZNYXgoaEFhY0NvbmZpZy0+Yml0UmF0ZSwgKElOVCljb25maWctPnVzZXJQZWFrQml0cmF0ZSksCisgICAgICAgICAgICAgICAgIGhBYWNDb25maWctPmZyYW1lbGVuZ3RoLCBoQWFjQ29uZmlnLT5zYW1wbGVSYXRlKSArCisgICAgICAgICAgICAgNykgJgorICAgICAgICAgICAgfjc7CisgICAgICB9IGVsc2UgewogICAgICAgICBoQWFjQ29uZmlnLT5tYXhCaXRzUGVyRnJhbWUgPSAtMTsKICAgICAgIH0KLSAgICAgIGlmIChoQWFjQ29uZmlnLT5hdWRpb011eFZlcnNpb249PTIpIHsKLSAgICAgICAgaEFhY0NvbmZpZy0+bWluQml0c1BlckZyYW1lID0gZk1pbigzMio4LCBGREthYWNFbmNfQ2FsY0JpdHNQZXJGcmFtZShoQWFjQ29uZmlnLT5iaXRSYXRlLCBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCwgaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSkpJn43OworICAgICAgaWYgKGhBYWNDb25maWctPmF1ZGlvTXV4VmVyc2lvbiA9PSAyKSB7CisgICAgICAgIGhBYWNDb25maWctPm1pbkJpdHNQZXJGcmFtZSA9CisgICAgICAgICAgICBmTWluKDMyICogOCwgRkRLYWFjRW5jX0NhbGNCaXRzUGVyRnJhbWUoaEFhY0NvbmZpZy0+Yml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5zYW1wbGVSYXRlKSkgJgorICAgICAgICAgICAgfjc7CiAgICAgICB9Ci0gICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgIH0KIAotICAgIC8qIEluaXRpYWxpemUgU0JSIHBhcmFtZXRlcnMgKi8KLSAgICBpZiAoIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9FUl9BQUNfRUxEKQotICAgICAgJiYgKGNvbmZpZy0+dXNlclNickVuYWJsZWQgPT0gKFVDSEFSKS0xKSAmJiAoY29uZmlnLT51c2VyU2JyUmF0aW89PTApICkKLSAgICB7Ci0gICAgICBVSU5UIGVsZFNiciA9IDA7Ci0gICAgICBVSU5UIGVsZFNiclJhdGlvID0gMDsKLQotICAgICAgaWYgKCBBQUNFTkNfT0shPShlcnI9ZWxkU2JyQ29uZmlndXJhdG9yKAotICAgICAgICAgICAgaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGhBYWNDb25maWctPmNoYW5uZWxNb2RlLAotICAgICAgICAgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSwKLSAgICAgICAgICAgJmVsZFNiciwKLSAgICAgICAgICAgJmVsZFNiclJhdGlvKSkgKQotICAgICAgewotICAgICAgICByZXR1cm4gZXJyOwotICAgICAgfQotCi0gICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGVsZFNicikgPyBBQ19TQlJfUFJFU0VOVCA6IDApOwotICAgICAgaEFhY0NvbmZpZy0+c2JyUmF0aW8gPSBlbGRTYnJSYXRpbzsKLSAgICB9Ci0gICAgZWxzZQotICAgIGlmICggKGNvbmZpZy0+dXNlclNiclJhdGlvPT0wKSAmJiAoaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykpICkgewotICAgICAgLyogQXV0b21hdGljIFNCUiByYXRpbyBjb25maWd1cmF0aW9uCi0gICAgICAgKiAtIGRvd25zYW1wbGVkIFNCUiBmb3IgRUxECi0gICAgICAgKiAtIG90aGVyd2lzZSBhbHdheXMgZHVhbHJhdGUgU0JSCi0gICAgICAgKi8KLSAgICAgICAgaEFhY0NvbmZpZy0+c2JyUmF0aW8gPSAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfRVJfQUFDX0VMRCkgPyAxIDogMjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBTQlIgcmF0aW8gaGFzIGJlZW4gc2V0IGJ5IHRoZSB1c2VyLCBzbyB1c2UgaXQuICovCi0gICAgICBoQWFjQ29uZmlnLT5zYnJSYXRpbyA9IGlzU2JyQWN0aXZlKGhBYWNDb25maWcpID8gY29uZmlnLT51c2VyU2JyUmF0aW8gOiAwOwotICAgIH0KLQotICAgIHsKLSAgICAgIFVDSEFSIHRwU2lnbmFsaW5nPWdldFNiclNpZ25hbGluZ01vZGUoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlLCBjb25maWctPnVzZXJUcFR5cGUsIGNvbmZpZy0+dXNlclRwU2lnbmFsaW5nLCBoQWFjQ29uZmlnLT5zYnJSYXRpbyk7Ci0KLSAgICAgIGlmICggKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZT09QU9UX0FBQ19MQyB8fCBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9TQlIgfHwgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfUFMpICYmCi0gICAgICAgICAgIChjb25maWctPnVzZXJUcFR5cGU9PVRUX01QNF9MQVRNX01DUDEgfHwgY29uZmlnLT51c2VyVHBUeXBlPT1UVF9NUDRfTEFUTV9NQ1AwIHx8IGNvbmZpZy0+dXNlclRwVHlwZT09VFRfTVA0X0xPQVMpICYmCi0gICAgICAgICAgICh0cFNpZ25hbGluZz09MSkgJiYgKGNvbmZpZy0+dXNlclRwQW14dj09MCkgKSB7Ci0gICAgICAgICAgICAgLyogRm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgZXhwbGljaXQgc2lnbmFsaW5nLCBBTVYxIGhhcyB0byBiZSBhY3RpdmUgKi8KLSAgICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgfQotCi0gICAgICBpZiAoIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9BQUNfTEMgfHwgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfU0JSIHx8IGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZT09QU9UX1BTKSAmJgotICAgICAgICAgICAodHBTaWduYWxpbmc9PTApICYmIChoQWFjQ29uZmlnLT5zYnJSYXRpbz09MSkpIHsKLSAgICAgICAgICAgICAvKiBEb3duc2FtcGxlZCBTQlIgaGFzIHRvIGJlIHNpZ25hbGVkIGV4cGxpY2l0ZWx5IChmb3IgdHJhbnNtaXNzaW9uIG9mIFNCUiBzYW1wbGluZyBmZXF1ZW5jeSkgKi8KLSAgICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgfQotICAgIH0KLQotCi0KLSAgICAvKiBXZSBuZWVkIHRoZSBmcmFtZSBsZW5ndGggdG8gY2FsbCBhYWNFbmNvZGVyX0xpbWl0Qml0cmF0ZSgpICovCi0gICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSA9IGFhY0VuY29kZXJfTGltaXRCaXRyYXRlKAotICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCwKLSAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+bkNoYW5uZWxzLAotICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSwKLSAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSwKLSAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+blN1YkZyYW1lcywKLSAgICAgICAgICAgICAgaXNTYnJBY3RpdmUoaEFhY0NvbmZpZyksCi0gICAgICAgICAgICAgIGhBYWNDb25maWctPnNiclJhdGlvLAotICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUKLSAgICAgICAgICAgICAgKTsKLQotICAgIC8qIENvbmZpZ3VyZSBQTlMgKi8KLSAgICBpZiAoICgoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGU+PTEpICYmIChoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZTw9NSkpIC8qIFZCUiB3aXRob3V0IFBOUy4gKi8KLSAgICAgICAgfHwgKGhBYWNDb25maWctPnVzZVRucyA9PSAwKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFROUyByZXF1aXJlZC4gKi8KLSAgICB7Ci0gICAgICAgIGhBYWNDb25maWctPnVzZVBucyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKGhBYWNDb25maWctPmVwQ29uZmlnID49IDApIHsKLSAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gQUNfRVI7Ci0gICAgICAgICBpZiAoKChJTlQpaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgPCAxKSB8fCAoKElOVCloQWFjQ29uZmlnLT5jaGFubmVsTW9kZSA+IDcpKSB7Ci0gICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7ICAgICAgICAvKiBDYW5uZWwgY29uZmlnIDAgbm90IHN1cHBvcnRlZC4gKi8KLSAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIEZES2FhY0VuY19EZXRlcm1pbmVFbmNvZGVyTW9kZSgmaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUsIGhBYWNDb25maWctPm5DaGFubmVscykgIT0gQUFDX0VOQ19PSykgewotICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOyAgICAgICAgLyogbkNoYW5uZWxzIGRvZXNuJ3QgbWF0Y2ggY2hNb2RlLCB0aGlzIGlzIGp1c3QgYSBjaGVjay11cCAqLwotICAgIH0KLQotICAgIGlmICggKGhBYWNDb25maWctPm5DaGFubmVscyA+IGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMpCi0gICAgICB8fCAoIChGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGhBYWNDb25maWctPmNoYW5uZWxNb2RlKS0+bkNoYW5uZWxzRWZmID4gaEFhY0VuY29kZXItPm5NYXhTYnJDaGFubmVscykgJiYKLSAgICAgICAgICAgIGlzU2JyQWN0aXZlKGhBYWNDb25maWcpICkKLSAgICAgICAgICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7ICAgICAgLyogbm90IGVub3VnaCBjaGFubmVscyBhbGxvY2F0ZWQgKi8KLSAgICB9Ci0KLSAgICAvKiBNZXRhIGRhdGEgcmVzdHJpY3Rpb24uICovCi0gICAgc3dpdGNoIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUpCi0gICAgewotICAgICAgLyogQWxsb3cgbWV0YWRhdGEgc3VwcG9ydCAqLwotICAgICAgY2FzZSBBT1RfQUFDX0xDOgotICAgICAgY2FzZSBBT1RfU0JSOgotICAgICAgY2FzZSBBT1RfUFM6Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5tZXRhRGF0YUFsbG93ZWQgPSAxOwotICAgICAgICBpZiAoKChJTlQpaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgPCAxKSB8fCAoKElOVCloQWFjQ29uZmlnLT5jaGFubmVsTW9kZSA+IDcpKSB7Ci0gICAgICAgICAgY29uZmlnLT51c2VyTWV0YURhdGFNb2RlID0gMDsKLSAgICAgICAgfQorICAvKiBNYXggYml0cyBwZXIgZnJhbWUgbGltaXRhdGlvbiBkZXBlbmRpbmcgb24gdHJhbnNwb3J0IGZvcm1hdC4gKi8KKyAgaWYgKChjb25maWctPnVzZXJUcE5zdWJGcmFtZXMgPiAxKSkgeworICAgIGludCBtYXhGcmFtZUxlbmd0aCA9IDggKiBoQWFjRW5jb2Rlci0+b3V0QnVmZmVySW5CeXRlczsKKyAgICBzd2l0Y2ggKGNvbmZpZy0+dXNlclRwVHlwZSkgeworICAgICAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgICAgICAgbWF4RnJhbWVMZW5ndGggPQorICAgICAgICAgICAgZk1pbihtYXhGcmFtZUxlbmd0aCwgOCAqICgxIDw8IDEzKSkgLyBjb25maWctPnVzZXJUcE5zdWJGcmFtZXM7CiAgICAgICAgIGJyZWFrOwotICAgICAgLyogUHJvaGliaXQgbWV0YWRhdGEgc3VwcG9ydCAqLworICAgICAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICAgICAgbWF4RnJhbWVMZW5ndGggPSBmTWluKG1heEZyYW1lTGVuZ3RoLCA4ICogKCgxIDw8IDEzKSAtIDEpKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT51c2VyVHBOc3ViRnJhbWVzOworICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5tZXRhRGF0YUFsbG93ZWQgPSAwOworICAgICAgICBtYXhGcmFtZUxlbmd0aCA9IC0xOworICAgIH0KKyAgICBpZiAobWF4RnJhbWVMZW5ndGggIT0gLTEpIHsKKyAgICAgIGlmIChoQWFjQ29uZmlnLT5tYXhCaXRzUGVyRnJhbWUgPiBtYXhGcmFtZUxlbmd0aCkgeworICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgfSBlbHNlIGlmIChoQWFjQ29uZmlnLT5tYXhCaXRzUGVyRnJhbWUgPT0gLTEpIHsKKyAgICAgICAgaEFhY0NvbmZpZy0+bWF4Qml0c1BlckZyYW1lID0gbWF4RnJhbWVMZW5ndGg7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQpICYmCisgICAgICAhKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfRUxEX0RPV05TQ0FMRSkgJiYKKyAgICAgIChjb25maWctPnVzZXJTYnJFbmFibGVkID09IChVQ0hBUiktMSkgJiYgKGNvbmZpZy0+dXNlclNiclJhdGlvID09IDApICYmCisgICAgICAoKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfTERfTVBTKSA9PSAwKSkgeworICAgIGNvbnN0IEVMRF9TQlJfQ09ORklHVVJBVE9SICpwQ29uZmlnID0gTlVMTDsKKworICAgIGlmIChOVUxMICE9CisgICAgICAgIChwQ29uZmlnID0gZWxkU2JyQ29uZmlndXJhdG9yKAorICAgICAgICAgICAgIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUpCisgICAgICAgICAgICAgICAgIC0+bkNoYW5uZWxzLAorICAgICAgICAgICAgIGhBYWNDb25maWctPnNhbXBsZVJhdGUsIGhBYWNDb25maWctPmJpdFJhdGUpKSkgeworICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKHBDb25maWctPnNick1vZGUgPT0gMCkgPyAwIDogQUNfU0JSX1BSRVNFTlQ7CisgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAocENvbmZpZy0+Y2hNb2RlID09IE1PREVfMjEyKSA/IEFDX0xEX01QUyA6IDA7CisgICAgICBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSA9CisgICAgICAgICAgR2V0Q29yZUNoYW5uZWxNb2RlKHBDb25maWctPmNoTW9kZSwgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlKTsKKyAgICAgIGhBYWNDb25maWctPm5DaGFubmVscyA9CisgICAgICAgICAgRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbihoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSkKKyAgICAgICAgICAgICAgLT5uQ2hhbm5lbHM7CisgICAgICBoQWFjQ29uZmlnLT5zYnJSYXRpbyA9CisgICAgICAgICAgKHBDb25maWctPnNick1vZGUgPT0gMCkgPyAwIDogKHBDb25maWctPnNick1vZGUgPT0gMSkgPyAxIDogMjsKKyAgICB9CisgIH0KKworICB7CisgICAgVUNIQVIgdHBTaWduYWxpbmcgPQorICAgICAgICBnZXRTYnJTaWduYWxpbmdNb2RlKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSwgY29uZmlnLT51c2VyVHBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXNlclRwU2lnbmFsaW5nLCBoQWFjQ29uZmlnLT5zYnJSYXRpbyk7CisKKyAgICBpZiAoKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfQUFDX0xDIHx8CisgICAgICAgICBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX1NCUiB8fAorICAgICAgICAgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9QUykgJiYKKyAgICAgICAgKGNvbmZpZy0+dXNlclRwVHlwZSA9PSBUVF9NUDRfTEFUTV9NQ1AxIHx8CisgICAgICAgICBjb25maWctPnVzZXJUcFR5cGUgPT0gVFRfTVA0X0xBVE1fTUNQMCB8fAorICAgICAgICAgY29uZmlnLT51c2VyVHBUeXBlID09IFRUX01QNF9MT0FTKSAmJgorICAgICAgICAodHBTaWduYWxpbmcgPT0gMSkgJiYgKGNvbmZpZy0+dXNlclRwQW14diA9PSAwKSkgeworICAgICAgLyogRm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgZXhwbGljaXQgc2lnbmFsaW5nLCBBTVYxIGhhcyB0byBiZSBhY3RpdmUgKi8KKyAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CiAgICAgfQogCi0gICAgcmV0dXJuIGVycjsKKyAgICBpZiAoKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfQUFDX0xDIHx8CisgICAgICAgICBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX1NCUiB8fAorICAgICAgICAgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9QUykgJiYKKyAgICAgICAgKHRwU2lnbmFsaW5nID09IDApICYmIChoQWFjQ29uZmlnLT5zYnJSYXRpbyA9PSAxKSkgeworICAgICAgLyogRG93bnNhbXBsZWQgU0JSIGhhcyB0byBiZSBzaWduYWxlZCBleHBsaWNpdGVseSAoZm9yIHRyYW5zbWlzc2lvbiBvZiBTQlIKKyAgICAgICAqIHNhbXBsaW5nIGZlcXVlbmN5KSAqLworICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICB9CisgIH0KKworICBzd2l0Y2ggKGhBYWNDb25maWctPmJpdHJhdGVNb2RlKSB7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8yOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzM6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl81OgorICAgICAgLyogV2UgbmVlZCB0aGUgZnJhbWUgbGVuZ3RoIHRvIGNhbGwgYWFjRW5jb2Rlcl9MaW1pdEJpdHJhdGUoKSAqLworICAgICAgaWYgKDAgPj0gKGhBYWNDb25maWctPmJpdFJhdGUgPSBhYWNFbmNvZGVyX0xpbWl0Qml0cmF0ZSgKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwgaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSwgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIGhBYWNDb25maWctPm5DaGFubmVscywgaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUsCisgICAgICAgICAgICAgICAgICAgIGhBYWNDb25maWctPmJpdFJhdGUsIGhBYWNDb25maWctPm5TdWJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgIGlzU2JyQWN0aXZlKGhBYWNDb25maWcpLCBoQWFjQ29uZmlnLT5zYnJSYXRpbywKKyAgICAgICAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MsIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSkpKSB7CisgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBDb25maWd1cmUgUE5TICovCisgIGlmIChBQUNFTkNfQlJfTU9ERV9JU19WQlIoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGUpIC8qIFZCUiB3aXRob3V0IFBOUy4gKi8KKyAgICAgIHx8IChoQWFjQ29uZmlnLT51c2VUbnMgPT0gMCkpICAgICAgICAgICAgICAgICAgLyogVE5TIHJlcXVpcmVkLiAgICAqLworICB7CisgICAgaEFhY0NvbmZpZy0+dXNlUG5zID0gMDsKKyAgfQorCisgIGlmIChoQWFjQ29uZmlnLT5lcENvbmZpZyA+PSAwKSB7CisgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gQUNfRVI7CisgICAgaWYgKCgoSU5UKWhBYWNDb25maWctPmNoYW5uZWxNb2RlIDwgMSkgfHwKKyAgICAgICAgKChJTlQpaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgPiAxNCkpIHsKKyAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7IC8qIENoYW5uZWwgY29uZmlnIDAgbm90IHN1cHBvcnRlZC4gKi8KKyAgICB9CisgIH0KKworICBpZiAoKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfTERfTVBTKSA9PSAwKSB7CisgICAgaWYgKEZES2FhY0VuY19EZXRlcm1pbmVFbmNvZGVyTW9kZSgmaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5uQ2hhbm5lbHMpICE9IEFBQ19FTkNfT0spIHsKKyAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7IC8qIG5DaGFubmVscyBkb2Vzbid0IG1hdGNoIGNoTW9kZSwgdGhpcyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCBhIGNoZWNrLXVwICovCisgICAgfQorICB9CisKKyAgaWYgKChoQWFjQ29uZmlnLT5uQ2hhbm5lbHMgPiBoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzKSB8fAorICAgICAgKChGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGhBYWNDb25maWctPmNoYW5uZWxNb2RlKQorICAgICAgICAgICAgLT5uQ2hhbm5lbHNFZmYgPiBoQWFjRW5jb2Rlci0+bk1heFNickNoYW5uZWxzKSAmJgorICAgICAgIGlzU2JyQWN0aXZlKGhBYWNDb25maWcpKSkgeworICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7IC8qIG5vdCBlbm91Z2ggY2hhbm5lbHMgYWxsb2NhdGVkICovCisgIH0KKworICAvKiBNZXRhIGRhdGEgcmVzdHJpY3Rpb24uICovCisgIHN3aXRjaCAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSB7CisgICAgLyogQWxsb3cgbWV0YWRhdGEgc3VwcG9ydCAqLworICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9TQlI6CisgICAgY2FzZSBBT1RfUFM6CisgICAgY2FzZSBBT1RfTVAyX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9NUDJfU0JSOgorICAgICAgaEFhY0VuY29kZXItPm1ldGFEYXRhQWxsb3dlZCA9IDE7CisgICAgICBpZiAoISgoKChJTlQpaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgPj0gMSkgJiYKKyAgICAgICAgICAgICAoKElOVCloQWFjQ29uZmlnLT5jaGFubmVsTW9kZSA8PSAxNCkpIHx8CisgICAgICAgICAgICAoTU9ERV83XzFfUkVBUl9TVVJST1VORCA9PSBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSkgfHwKKyAgICAgICAgICAgIChNT0RFXzdfMV9GUk9OVF9DRU5URVIgPT0gaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUpKSkgeworICAgICAgICBjb25maWctPnVzZXJNZXRhRGF0YU1vZGUgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgLyogUHJvaGliaXQgbWV0YWRhdGEgc3VwcG9ydCAqLworICAgIGRlZmF1bHQ6CisgICAgICBoQWFjRW5jb2Rlci0+bWV0YURhdGFBbGxvd2VkID0gMDsKKyAgfQorCisgIHJldHVybiBlcnI7CiB9CiAKLXN0YXRpYwotSU5UIGFhY2VuY19TYnJDYWxsYmFjaygKLSAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgaEJzLAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUluLAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZU91dCwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAotICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCAgICBlbGVtZW50SUQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgIGVsZW1lbnRJbmRleAotICAgICAgICApCi17CitzdGF0aWMgSU5UIGFhY2VuY19TYnJDYWxsYmFjayh2b2lkICpzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUluLCBjb25zdCBJTlQgc2FtcGxlUmF0ZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZWxlbWVudEluZGV4LCBjb25zdCBVQ0hBUiBoYXJtb25pY1NiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY29uZmlnTW9kZSwgVUNIQVIgKmNvbmZpZ0NoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZG93bnNjYWxlRmFjdG9yKSB7CiAgIEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyID0gKEhBTkRMRV9BQUNFTkNPREVSKXNlbGY7CiAKICAgc2JyRW5jb2Rlcl9HZXRIZWFkZXIoaEFhY0VuY29kZXItPmhFbnZFbmMsIGhCcywgZWxlbWVudEluZGV4LCAwKTsKQEAgLTEwMDYsNzI1ICsxMjEzLDgzNSBAQAogICByZXR1cm4gMDsKIH0KIAotc3RhdGljIEFBQ0VOQ19FUlJPUiBhYWNFbmNJbml0KEhBTkRMRV9BQUNFTkNPREVSICBoQWFjRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgICAgICAgICAgICAgSW5pdEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfUEFSQU0gICAgICAgICpjb25maWcpCi17Ci0gICAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKK0lOVCBhYWNlbmNfU3NjQ2FsbGJhY2sodm9pZCAqc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUsIGNvbnN0IElOVCBzdGVyZW9Db25maWdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4LCBjb25zdCBJTlQgY29uZmlnQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkKSB7CisgIEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyID0gKEhBTkRMRV9BQUNFTkNPREVSKXNlbGY7CiAKLSAgICBJTlQgYWFjQnVmZmVyT2Zmc2V0ID0gMDsKLSAgICBIQU5ETEVfU0JSX0VOQ09ERVIgICAgICpoU2JyRW5jb2RlciA9ICZoQWFjRW5jb2Rlci0+aEVudkVuYzsKLSAgICBIQU5ETEVfQUFDRU5DX0NPTkZJRyAgICBoQWFjQ29uZmlnICA9ICZoQWFjRW5jb2Rlci0+YWFjQ29uZmlnOwotCi0gICAgaEFhY0VuY29kZXItPm5aZXJvc0FwcGVuZGVkID0gMDsgICAgICAgICAgLyogY291bnQgYXBwZW5kZWQgemVyb3MgKi8KLQotICAgIElOVCBmcmFtZUxlbmd0aCA9IGhBYWNDb25maWctPmZyYW1lbGVuZ3RoOwotCi0gICAgaWYgKCAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfQ09ORklHKSApCi0gICAgewotICAgICAgICBDSEFOTkVMX01PREUgcHJldkNoTW9kZSA9IGhBYWNDb25maWctPmNoYW5uZWxNb2RlOwotCi0gICAgICAgIC8qIFZlcmlmeSBzZXR0aW5ncyBhbmQgdXBkYXRlOiBjb25maWcgLT4gaGVBYWNFbmNvZGVyICovCi0gICAgICAgIGlmICggKGVycj1GREthYWNFbmNfQWRqdXN0RW5jU2V0dGluZ3MoaEFhY0VuY29kZXIsIGNvbmZpZykpICE9IEFBQ0VOQ19PSyApIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZnJhbWVMZW5ndGggPSBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aDsgLyogYWRhcHQgdGVtcG9yYWwgZnJhbWVsZW5ndGggKi8KLQotICAgICAgICAvKiBTZWFtbGVzcyBjaGFubmVsIHJlY29uZmlndXJhdGlvbiBpbiBzYnIgbm90IGZ1bGx5IGltcGxlbWVudGVkICovCi0gICAgICAgIGlmICggKHByZXZDaE1vZGUhPWhBYWNDb25maWctPmNoYW5uZWxNb2RlKSAmJiBpc1NickFjdGl2ZShoQWFjQ29uZmlnKSApIHsKLSAgICAgICAgICAgIEluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9TVEFURVM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDbGVhciBpbnB1dCBidWZmZXIgKi8KLSAgICBpZiAoIEluaXRGbGFncyA9PSBBQUNFTkNfSU5JVF9BTEwgKSB7Ci0gICAgICAgIEZES21lbWNsZWFyKGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciwgc2l6ZW9mKElOVF9QQ00pKmhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMqSU5QVVRCVUZGRVJfU0laRSk7Ci0gICAgfQotCi0gICAgaWYgKCAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfQ09ORklHKSApCi0gICAgewotICAgICAgICBhYWNCdWZmZXJPZmZzZXQgPSAwOwotICAgICAgICBpZiAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9BQUNfRUxEKSB7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+bkRlbGF5ID0gREVMQVlfQUFDRUxEKGhBYWNDb25maWctPmZyYW1lbGVuZ3RoKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uRGVsYXkgPSBERUxBWV9BQUMoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgpOyAvKiBBQUMgZW5jb2RlciBkZWxheSAqLwotICAgICAgICB9Ci0gICAgICAgIGhBYWNDb25maWctPmFuY0RhdGFCaXRSYXRlID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoIGlzU2JyQWN0aXZlKGhBYWNDb25maWcpICYmCi0gICAgICAgICgoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfQ09ORklHKSB8fCAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfU1RBVEVTKSkgKQotICAgIHsKLSAgICAgICAgSU5UIHNickVycm9yOwotICAgICAgICBTQlJfRUxFTUVOVF9JTkZPIHNickVsSW5mb1soOCldOwotICAgICAgICBDSEFOTkVMX01BUFBJTkcgY2hhbm5lbE1hcHBpbmc7Ci0KLSAgICAgICAgaWYgKCBGREthYWNFbmNfSW5pdENoYW5uZWxNYXBwaW5nKGhBYWNDb25maWctPmNoYW5uZWxNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+Y2hhbm5lbE9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbE1hcHBpbmcpICE9IEFBQ19FTkNfT0sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayByZXR1cm4gdmFsdWUgYW5kIGlmIHRoZSBTQlIgZW5jb2RlciBjYW4gaGFuZGxlIGVub3VnaCBlbGVtZW50cyAqLwotICAgICAgICBpZiAoY2hhbm5lbE1hcHBpbmcubkVsZW1lbnRzID4gKDgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBhYWNFbmNEaXN0cmlidXRlU2JyQml0cygmY2hhbm5lbE1hcHBpbmcsIHNickVsSW5mbywgaEFhY0NvbmZpZy0+Yml0UmF0ZSk7Ci0KLSAgICAgICAgVUlOVCBpbml0RmxhZyA9IDA7Ci0gICAgICAgIGluaXRGbGFnICs9IChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9TVEFURVMpID8gMSA6IDA7Ci0KLSAgICAgICAgLyogTGV0IHRoZSBTQlIgZW5jb2RlciB0YWtlIGEgbG9vayBhdCB0aGUgY29uZmlndXJhdGlvbiBhbmQgY2hhbmdlIGlmIHJlcXVpcmVkLiAqLwotICAgICAgICBzYnJFcnJvciA9IHNickVuY29kZXJfSW5pdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhTYnJFbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcubkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEFhY0NvbmZpZy0+YmFuZFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWFjQnVmZmVyT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEFhY0NvbmZpZy0+bkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhBYWNDb25maWctPnNiclJhdGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjRW5jb2Rlci0+bkRlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCkgPyAxIDogVFJBTlNfRkFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+dXNlclRwSGVhZGVyUGVyaW9kIT0weEZGKSA/IGNvbmZpZy0+dXNlclRwSGVhZGVyUGVyaW9kIDogREVGQVVMVF9IRUFERVJfUEVSSU9EX1JFUEVUSVRJT05fUkFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRGbGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgLyogU3VwcHJlc3MgQU9UIHJlY29uZmlndXJhdGlvbiBhbmQgY2hlY2sgZXJyb3Igc3RhdHVzLiAqLwotICAgICAgICBpZiAoc2JyRXJyb3IpIHsKLSAgICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5JVF9TQlJfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaEFhY0NvbmZpZy0+bkNoYW5uZWxzID09IDEpIHsKLSAgICAgICAgICAgIGhBYWNDb25maWctPmNoYW5uZWxNb2RlID0gTU9ERV8xOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogTmV2ZXIgdXNlIFBOUyBpZiBTQlIgaXMgYWN0aXZlICovCi0gICAgICAgIGlmICggaEFhY0NvbmZpZy0+dXNlUG5zICkgewotICAgICAgICAgICBoQWFjQ29uZmlnLT51c2VQbnMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZXN0aW1hdGVkIGJpdHJhdGUgY29uc3VtZWQgYnkgU0JSIG9yIFBTICovCi0gICAgICAgIGhBYWNDb25maWctPmFuY0RhdGFCaXRSYXRlID0gc2JyRW5jb2Rlcl9HZXRFc3RpbWF0ZUJpdHJhdGUoKmhTYnJFbmNvZGVyKSA7Ci0KLSAgICB9IC8qIHNiciBpbml0aWFsaXphdGlvbiAqLwotCi0KLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgVHJhbnNwb3J0IC0gTW9kdWxlLgotICAgICAqLwotICAgIGlmICggKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX1RSQU5TUE9SVCkgKQotICAgIHsKLSAgICAgICAgVUlOVCBmbGFncyA9IDA7Ci0KLSAgICAgICAgRkRLYWFjRW5jX01hcENvbmZpZygKLSAgICAgICAgICAgICAgICAmaEFhY0VuY29kZXItPmNvZGVyQ29uZmlnLAotICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICBnZXRTYnJTaWduYWxpbmdNb2RlKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSwgY29uZmlnLT51c2VyVHBUeXBlLCBjb25maWctPnVzZXJUcFNpZ25hbGluZywgaEFhY0NvbmZpZy0+c2JyUmF0aW8pLAotICAgICAgICAgICAgICAgIGhBYWNDb25maWcpOwotCi0gICAgICAgIC8qIGNyZWF0ZSBmbGFncyBmb3IgdHJhbnNwb3J0IGVuY29kZXIgKi8KLSAgICAgICAgaWYgKGNvbmZpZy0+dXNlclRwQW14diAhPSAwKSB7Ci0gICAgICAgICAgICBmbGFncyB8PSBUUF9GTEFHX0xBVE1fQU1WOwotICAgICAgICB9Ci0gICAgICAgIC8qIENsZWFyIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXItPm91dEJ1ZmZlciwgaEFhY0VuY29kZXItPm91dEJ1ZmZlckluQnl0ZXMqc2l6ZW9mKFVDSEFSKSk7Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSBCaXRzdHJlYW0gZW5jb2RlciAqLwotICAgICAgICBpZiAoIHRyYW5zcG9ydEVuY19Jbml0KGhBYWNFbmNvZGVyLT5oVHBFbmMsIGhBYWNFbmNvZGVyLT5vdXRCdWZmZXIsIGhBYWNFbmNvZGVyLT5vdXRCdWZmZXJJbkJ5dGVzLCBjb25maWctPnVzZXJUcFR5cGUsICZoQWFjRW5jb2Rlci0+Y29kZXJDb25maWcsIGZsYWdzKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfVFBfRVJST1I7Ci0gICAgICAgIH0KLQotICAgIH0gLyogdHJhbnNwb3J0IGluaXRpYWxpemF0aW9uICovCi0KLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgQUFDIC0gQ29yZS4KLSAgICAgKi8KLSAgICBpZiAoIChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9DT05GSUcpIHx8Ci0gICAgICAgICAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfU1RBVEVTKSApCi0gICAgewotICAgICAgICBBQUNfRU5DT0RFUl9FUlJPUiBlcnI7Ci0gICAgICAgIGVyciA9IEZES2FhY0VuY19Jbml0aWFsaXplKGhBYWNFbmNvZGVyLT5oQWFjRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfU1RBVEVTKSA/IDEgOiAwKTsKLQotICAgICAgICBpZiAoZXJyICE9IEFBQ19FTkNfT0spIHsKLSAgICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5JVF9BQUNfRVJST1I7Ci0gICAgICAgIH0KLQotICAgIH0gLyogYWFjIGluaXRpYWxpemF0aW9uICovCi0KLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgTWV0YSBEYXRhIC0gRW5jb2Rlci4KLSAgICAgKi8KLSAgICBpZiAoIGhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMgJiYgKGhBYWNFbmNvZGVyLT5tZXRhRGF0YUFsbG93ZWQhPTApICYmCi0gICAgICAgICgoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfQ09ORklHKSB8fChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9TVEFURVMpKSApCi0gICAgewotICAgICAgICBJTlQgaW5wdXREYXRhRGVsYXkgPSBERUxBWV9BQUMoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgpOwotCi0gICAgICAgIGlmICggaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykgJiYgaFNickVuY29kZXIhPU5VTEwpIHsKLSAgICAgICAgICBpbnB1dERhdGFEZWxheSA9IGhBYWNDb25maWctPnNiclJhdGlvKmlucHV0RGF0YURlbGF5ICsgc2JyRW5jb2Rlcl9HZXRJbnB1dERhdGFEZWxheSgqaFNickVuY29kZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBGREtfTWV0YWRhdGFFbmNfSW5pdChoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJbml0RmxhZ3MmQUFDRU5DX0lOSVRfU1RBVEVTKSA/IDEgOiAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnVzZXJNZXRhRGF0YU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhRGVsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT51c2VyU2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnVzZXJDaGFubmVsTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5jaGFubmVsT3JkZXIpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5JVF9NRVRBX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgaEFhY0VuY29kZXItPm5EZWxheSArPSBGREtfTWV0YWRhdGFFbmNfR2V0RGVsYXkoaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgcG9pbnRlciB0byB3b3JraW5nIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBpZiAoIChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9DT05GSUcpICkKLSAgICB7Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlck9mZnNldCA9IGFhY0J1ZmZlck9mZnNldDsKLQotICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNUb1JlYWQgPSBmcmFtZUxlbmd0aCAqIGNvbmZpZy0+bkNoYW5uZWxzOwotCi0gICAgICAgIC8qIE1ha2UgbkRlbGF5IGNvbXBhcmlzb24gY29tcGF0aWJsZSB3aXRoIGNvbmZpZy0+blNhbXBsZXNSZWFkICovCi0gICAgICAgIGhBYWNFbmNvZGVyLT5uRGVsYXkgKj0gY29uZmlnLT5uQ2hhbm5lbHM7Ci0KLSAgICB9IC8qIHBhcmFtZXRlciBjaGFuZ2VkICovCi0KLSAgICByZXR1cm4gQUFDRU5DX09LOworICByZXR1cm4gKEZES19NcGVnc0VuY19Xcml0ZVNwYXRpYWxTcGVjaWZpY0NvbmZpZyhoQWFjRW5jb2Rlci0+aE1wc0VuYywgaEJzKSk7CiB9CiAKK3N0YXRpYyBBQUNFTkNfRVJST1IgYWFjRW5jSW5pdChIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciwgVUxPTkcgSW5pdEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfUEFSQU0gKmNvbmZpZykgeworICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOwogCi1BQUNFTkNfRVJST1IgYWFjRW5jT3BlbigKLSAgICAgICAgSEFORExFX0FBQ0VOQ09ERVIgICAgICAgICpwaEFhY0VuY29kZXIsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgZW5jTW9kdWxlcywKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICBtYXhDaGFubmVscwotICAgICAgICApCi17Ci0gICAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKLSAgICBIQU5ETEVfQUFDRU5DT0RFUiAgaEFhY0VuY29kZXIgPSBOVUxMOworICBJTlQgYWFjQnVmZmVyT2Zmc2V0ID0gMDsKKyAgSEFORExFX1NCUl9FTkNPREVSICpoU2JyRW5jb2RlciA9ICZoQWFjRW5jb2Rlci0+aEVudkVuYzsKKyAgSEFORExFX0FBQ0VOQ19DT05GSUcgaEFhY0NvbmZpZyA9ICZoQWFjRW5jb2Rlci0+YWFjQ29uZmlnOwogCi0gICAgaWYgKHBoQWFjRW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0hBTkRMRTsKLSAgICAgICAgZ290byBiYWlsOworICBoQWFjRW5jb2Rlci0+blplcm9zQXBwZW5kZWQgPSAwOyAvKiBjb3VudCBhcHBlbmRlZCB6ZXJvcyAqLworCisgIElOVCBmcmFtZUxlbmd0aCA9IGhBYWNDb25maWctPmZyYW1lbGVuZ3RoOworCisgIGlmICgoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfQ09ORklHKSkgeworICAgIENIQU5ORUxfTU9ERSBwcmV2Q2hNb2RlID0gaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGU7CisKKyAgICAvKiBWZXJpZnkgc2V0dGluZ3MgYW5kIHVwZGF0ZTogY29uZmlnIC0+IGhlQWFjRW5jb2RlciAqLworICAgIGlmICgoZXJyID0gRkRLYWFjRW5jX0FkanVzdEVuY1NldHRpbmdzKGhBYWNFbmNvZGVyLCBjb25maWcpKSAhPSBBQUNFTkNfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGZyYW1lTGVuZ3RoID0gaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGg7IC8qIGFkYXB0IHRlbXBvcmFsIGZyYW1lbGVuZ3RoICovCisKKyAgICAvKiBTZWFtbGVzcyBjaGFubmVsIHJlY29uZmlndXJhdGlvbiBpbiBzYnIgbm90IGZ1bGx5IGltcGxlbWVudGVkICovCisgICAgaWYgKChwcmV2Q2hNb2RlICE9IGhBYWNDb25maWctPmNoYW5uZWxNb2RlKSAmJiBpc1NickFjdGl2ZShoQWFjQ29uZmlnKSkgeworICAgICAgSW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1NUQVRFUzsKKyAgICB9CisgIH0KKworICAvKiBDbGVhciBpbnB1dCBidWZmZXIgKi8KKyAgaWYgKEluaXRGbGFncyA9PSBBQUNFTkNfSU5JVF9BTEwpIHsKKyAgICBGREttZW1jbGVhcihoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgc2l6ZW9mKElOVF9QQ00pICogaEFhY0VuY29kZXItPmlucHV0QnVmZmVyU2l6ZSk7CisgIH0KKworICBpZiAoKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX0NPTkZJRykpIHsKKyAgICBhYWNCdWZmZXJPZmZzZXQgPSAwOworICAgIHN3aXRjaCAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSB7CisgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICAgIGhBYWNFbmNvZGVyLT5uRGVsYXkgPSBERUxBWV9BQUNMRChoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICAgICAgaEFhY0VuY29kZXItPm5EZWxheSA9IERFTEFZX0FBQ0VMRChoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaEFhY0VuY29kZXItPm5EZWxheSA9CisgICAgICAgICAgICBERUxBWV9BQUMoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgpOyAvKiBBQUMgZW5jb2RlciBkZWxheSAqLwogICAgIH0KIAotICAgIC8qIGFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGhBYWNFbmNvZGVyID0gR2V0X0FhY0VuY29kZXIoKTsKKyAgICBoQWFjQ29uZmlnLT5hbmNEYXRhQml0UmF0ZSA9IDA7CisgIH0KIAotICAgIGlmIChoQWFjRW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7Ci0gICAgICAgIGdvdG8gYmFpbDsKKyAgaWYgKChOVUxMICE9IGhBYWNFbmNvZGVyLT5oRW52RW5jKSAmJiBpc1NickFjdGl2ZShoQWFjQ29uZmlnKSAmJgorICAgICAgKChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9DT05GSUcpIHx8IChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9TVEFURVMpKSkgeworICAgIElOVCBzYnJFcnJvcjsKKyAgICBVSU5UIGluaXRGbGFnID0gMDsKKyAgICBTQlJfRUxFTUVOVF9JTkZPIHNickVsSW5mb1soOCldOworICAgIENIQU5ORUxfTUFQUElORyBjaGFubmVsTWFwcGluZzsKKyAgICBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUgPSBpc1BzQWN0aXZlKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb25maWctPnVzZXJDaGFubmVsTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGhBYWNDb25maWctPmNoYW5uZWxNb2RlOworICAgIElOVCBudW1DaGFubmVscyA9IGlzUHNBY3RpdmUoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbmZpZy0+bkNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogaEFhY0NvbmZpZy0+bkNoYW5uZWxzOworCisgICAgaWYgKEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoY2hhbm5lbE1vZGUsIGhBYWNDb25maWctPmNoYW5uZWxPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbE1hcHBpbmcpICE9IEFBQ19FTkNfT0spIHsKKyAgICAgIHJldHVybiBBQUNFTkNfSU5JVF9FUlJPUjsKICAgICB9CiAKLSAgICBGREttZW1jbGVhcihoQWFjRW5jb2Rlciwgc2l6ZW9mKEFBQ0VOQ09ERVIpKTsKLQotICAgIC8qIFNwZWNpZnkgZW5jb2RlciBtb2R1bGVzIHRvIGJlIGFsbG9jYXRlZC4gKi8KLSAgICBpZiAoZW5jTW9kdWxlcz09MCkgewotICAgICAgICBoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyA9IEVOQ19NT0RFX0ZMQUdfQUFDOwotICAgICAgICBoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyB8PSBFTkNfTU9ERV9GTEFHX1NCUjsKLSAgICAgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgfD0gRU5DX01PREVfRkxBR19QUzsKLSAgICAgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgfD0gRU5DX01PREVfRkxBR19NRVRBOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAvKiBjb25zaWRlciBTQUMgYW5kIFBTIG1vZHVsZSAqLwotICAgICAgICBoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyA9IGVuY01vZHVsZXM7CisgICAgLyogQ2hlY2sgcmV0dXJuIHZhbHVlIGFuZCBpZiB0aGUgU0JSIGVuY29kZXIgY2FuIGhhbmRsZSBlbm91Z2ggZWxlbWVudHMgKi8KKyAgICBpZiAoY2hhbm5lbE1hcHBpbmcubkVsZW1lbnRzID4gKDgpKSB7CisgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfRVJST1I7CiAgICAgfQogCi0gICAgLyogRGV0ZXJtaW5lIG1heCBjaGFubmVsIGNvbmZpZ3VyYXRpb24uICovCi0gICAgaWYgKG1heENoYW5uZWxzPT0wKSB7Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMgPSAoOCk7Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5uTWF4U2JyQ2hhbm5lbHMgPSAoOCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzID0gKG1heENoYW5uZWxzJjB4MDBGRik7Ci0gICAgICAgIGlmICggKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzJkVOQ19NT0RFX0ZMQUdfU0JSKSApIHsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uTWF4U2JyQ2hhbm5lbHMgPSAobWF4Q2hhbm5lbHMmMHhGRjAwKSA/IChtYXhDaGFubmVscz4+OCkgOiBoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzOwotICAgICAgICB9CisgICAgYWFjRW5jRGlzdHJpYnV0ZVNickJpdHMoJmNoYW5uZWxNYXBwaW5nLCBzYnJFbEluZm8sIGhBYWNDb25maWctPmJpdFJhdGUpOwogCi0gICAgICAgIGlmICggKGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHM+KDgpKSB8fCAoaEFhY0VuY29kZXItPm5NYXhTYnJDaGFubmVscz4oOCkpICkgewotICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9Ci0gICAgfSAvKiBtYXhDaGFubmVscz09MCAqLworICAgIGluaXRGbGFnICs9IChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9TVEFURVMpID8gMSA6IDA7CiAKLSAgICAvKiBNYXggbnVtYmVyIG9mIGVsZW1lbnRzIGNvdWxkIGJlIHR1bmVkIGFueSBtb3JlLiAqLwotICAgIGhBYWNFbmNvZGVyLT5uTWF4QWFjRWxlbWVudHMgPSBmaXhNaW4oKDgpLCBoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzKTsKLSAgICBoQWFjRW5jb2Rlci0+bk1heFNickVsZW1lbnRzID0gZml4TWluKCg4KSwgaEFhY0VuY29kZXItPm5NYXhTYnJDaGFubmVscyk7Ci0gICAgaEFhY0VuY29kZXItPm5NYXhTdWJGcmFtZXMgPSAoMSk7CisgICAgLyogTGV0IHRoZSBTQlIgZW5jb2RlciB0YWtlIGEgbG9vayBhdCB0aGUgY29uZmlndXJhdGlvbiBhbmQgY2hhbmdlIGlmCisgICAgICogcmVxdWlyZWQuICovCisgICAgc2JyRXJyb3IgPSBzYnJFbmNvZGVyX0luaXQoCisgICAgICAgICpoU2JyRW5jb2Rlciwgc2JyRWxJbmZvLCBjaGFubmVsTWFwcGluZy5uRWxlbWVudHMsCisgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciwgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWwsCisgICAgICAgICZoQWFjQ29uZmlnLT5iYW5kV2lkdGgsICZhYWNCdWZmZXJPZmZzZXQsICZudW1DaGFubmVscywKKyAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MsICZoQWFjQ29uZmlnLT5zYW1wbGVSYXRlLCAmaEFhY0NvbmZpZy0+c2JyUmF0aW8sCisgICAgICAgICZmcmFtZUxlbmd0aCwgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlLCAmaEFhY0VuY29kZXItPm5EZWxheSwKKyAgICAgICAgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCkgPyAxIDogVFJBTlNfRkFDLAorICAgICAgICAoY29uZmlnLT51c2VyVHBIZWFkZXJQZXJpb2QgIT0gMHhGRikKKyAgICAgICAgICAgID8gY29uZmlnLT51c2VyVHBIZWFkZXJQZXJpb2QKKyAgICAgICAgICAgIDogREVGQVVMVF9IRUFERVJfUEVSSU9EX1JFUEVUSVRJT05fUkFURSwKKyAgICAgICAgaW5pdEZsYWcpOwogCi0KLSAgICAvKiBJbiBjYXNlIG9mIG1lbW9yeSBvdmVybGF5LCBhbGxvY2F0ZSBtZW1vcnkgb3V0IG9mIGxpYnJhcmllcyAqLwotCi0gICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyID0gKElOVF9QQ00qKUZES2NhbGxvYyhoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzKklOUFVUQlVGRkVSX1NJWkUsIHNpemVvZihJTlRfUENNKSk7Ci0KLSAgICAvKiBPcGVuIFNCUiBFbmNvZGVyICovCi0gICAgaWYgKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzJkVOQ19NT0RFX0ZMQUdfU0JSKSB7Ci0gICAgICAgIGlmICggc2JyRW5jb2Rlcl9PcGVuKCZoQWFjRW5jb2Rlci0+aEVudkVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uTWF4U2JyRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+bk1heFNickNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMmRU5DX01PREVfRkxBR19QUykgPyAxIDogMCApICkKLSAgICAgICAgewotICAgICAgICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7Ci0gICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9Ci0gICAgfSAvKiAoZW5jb2Rlcl9tb2RpcyZFTkNfTU9ERV9GTEFHX1NCUikgKi8KLQotCi0gICAgLyogT3BlbiBBYWMgRW5jb2RlciAqLwotICAgIGlmICggRkRLYWFjRW5jX09wZW4oJmhBYWNFbmNvZGVyLT5oQWFjRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uTWF4QWFjRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAoMSkpICE9IEFBQ19FTkNfT0sgKQotICAgIHsKLSAgICAgICAgZXJyID0gQUFDRU5DX01FTU9SWV9FUlJPUjsKLSAgICAgICAgZ290byBiYWlsOworICAgIC8qIFN1cHByZXNzIEFPVCByZWNvbmZpZ3VyYXRpb24gYW5kIGNoZWNrIGVycm9yIHN0YXR1cy4gKi8KKyAgICBpZiAoKHNickVycm9yKSB8fCAobnVtQ2hhbm5lbHMgIT0gaEFhY0NvbmZpZy0+bkNoYW5uZWxzKSkgeworICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX1NCUl9FUlJPUjsKICAgICB9CiAKLSAgICB7IC8qIEdldCBiaXRzdHJlYW0gb3V0cHV0YnVmZmVyIHNpemUgKi8KLSAgICAgIFVJTlQgbGRfTTsKLSAgICAgIGZvciAobGRfTT0xOyAoVUlOVCkoMTw8bGRfTSkgPCAoaEFhY0VuY29kZXItPm5NYXhTdWJGcmFtZXMqaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscyo2MTQ0KT4+MzsgbGRfTSsrKSA7Ci0gICAgICBoQWFjRW5jb2Rlci0+b3V0QnVmZmVySW5CeXRlcyA9ICgxPDxsZF9NKTsgIC8qIGJ1ZmZlciBoYXMgdG8gYmUgMl5uICovCisgICAgaWYgKG51bUNoYW5uZWxzID09IDEpIHsKKyAgICAgIGhBYWNDb25maWctPmNoYW5uZWxNb2RlID0gTU9ERV8xOwogICAgIH0KLSAgICBoQWFjRW5jb2Rlci0+b3V0QnVmZmVyID0gR2V0UmFtX2JzT3V0YnVmZmVyKCk7Ci0gICAgaWYgKE9VVFBVVEJVRkZFUl9TSVpFIDwgaEFhY0VuY29kZXItPm91dEJ1ZmZlckluQnl0ZXMgKSB7CisKKyAgICAvKiBOZXZlciB1c2UgUE5TIGlmIFNCUiBpcyBhY3RpdmUgKi8KKyAgICBpZiAoaEFhY0NvbmZpZy0+dXNlUG5zKSB7CisgICAgICBoQWFjQ29uZmlnLT51c2VQbnMgPSAwOworICAgIH0KKworICAgIC8qIGVzdGltYXRlZCBiaXRyYXRlIGNvbnN1bWVkIGJ5IFNCUiBvciBQUyAqLworICAgIGhBYWNDb25maWctPmFuY0RhdGFCaXRSYXRlID0gc2JyRW5jb2Rlcl9HZXRFc3RpbWF0ZUJpdHJhdGUoKmhTYnJFbmNvZGVyKTsKKworICB9IC8qIHNiciBpbml0aWFsaXphdGlvbiAqLworCisgIGlmICgoaEFhY0VuY29kZXItPmhNcHNFbmMgIT0gTlVMTCkgJiYgKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfTERfTVBTKSkgeworICAgIGludCBjb3JlQ29kZXJEZWxheSA9IERFTEFZX0FBQ0VMRChoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCk7CisKKyAgICBpZiAoaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykpIHsKKyAgICAgIGNvcmVDb2RlckRlbGF5ID0gaEFhY0NvbmZpZy0+c2JyUmF0aW8gKiBjb3JlQ29kZXJEZWxheSArCisgICAgICAgICAgICAgICAgICAgICAgIHNickVuY29kZXJfR2V0SW5wdXREYXRhRGVsYXkoKmhTYnJFbmNvZGVyKTsKKyAgICB9CisKKyAgICBpZiAoTVBTX0VOQ09ERVJfT0sgIT0KKyAgICAgICAgRkRLX01wZWdzRW5jX0luaXQoaEFhY0VuY29kZXItPmhNcHNFbmMsIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT51c2VyU2FtcGxlcmF0ZSwgaEFhY0NvbmZpZy0+Yml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykgPyBoQWFjQ29uZmlnLT5zYnJSYXRpbyA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoLCAvKiBmb3IgZHVhbCByYXRlIHNiciB0aGlzIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IG11bHRpcGxpZWQgYnkgMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZUNvZGVyRGVsYXkpKSB7CisgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfTVBTX0VSUk9SOworICAgIH0KKyAgfQorICBoQWFjRW5jb2Rlci0+bkRlbGF5ID0KKyAgICAgIGZNYXgoRkRLX01wZWdzRW5jX0dldERlbGF5KGhBYWNFbmNvZGVyLT5oTXBzRW5jKSwgaEFhY0VuY29kZXItPm5EZWxheSk7CisKKyAgLyoKKyAgICogSW5pdGlhbGl6ZSBUcmFuc3BvcnQgLSBNb2R1bGUuCisgICAqLworICBpZiAoKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX1RSQU5TUE9SVCkpIHsKKyAgICBVSU5UIGZsYWdzID0gMDsKKworICAgIEZES2FhY0VuY19NYXBDb25maWcoCisgICAgICAgICZoQWFjRW5jb2Rlci0+Y29kZXJDb25maWcsIGNvbmZpZywKKyAgICAgICAgZ2V0U2JyU2lnbmFsaW5nTW9kZShoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUsIGNvbmZpZy0+dXNlclRwVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnVzZXJUcFNpZ25hbGluZywgaEFhY0NvbmZpZy0+c2JyUmF0aW8pLAorICAgICAgICBoQWFjQ29uZmlnKTsKKworICAgIC8qIGNyZWF0ZSBmbGFncyBmb3IgdHJhbnNwb3J0IGVuY29kZXIgKi8KKyAgICBpZiAoY29uZmlnLT51c2VyVHBBbXh2ICE9IDApIHsKKyAgICAgIGZsYWdzIHw9IFRQX0ZMQUdfTEFUTV9BTVY7CisgICAgfQorICAgIC8qIENsZWFyIG91dHB1dCBidWZmZXIgKi8KKyAgICBGREttZW1jbGVhcihoQWFjRW5jb2Rlci0+b3V0QnVmZmVyLAorICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5vdXRCdWZmZXJJbkJ5dGVzICogc2l6ZW9mKFVDSEFSKSk7CisKKyAgICAvKiBJbml0aWFsaXplIEJpdHN0cmVhbSBlbmNvZGVyICovCisgICAgaWYgKHRyYW5zcG9ydEVuY19Jbml0KGhBYWNFbmNvZGVyLT5oVHBFbmMsIGhBYWNFbmNvZGVyLT5vdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5vdXRCdWZmZXJJbkJ5dGVzLCBjb25maWctPnVzZXJUcFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjRW5jb2Rlci0+Y29kZXJDb25maWcsIGZsYWdzKSAhPSAwKSB7CisgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfVFBfRVJST1I7CisgICAgfQorCisgIH0gLyogdHJhbnNwb3J0IGluaXRpYWxpemF0aW9uICovCisKKyAgLyoKKyAgICogSW5pdGlhbGl6ZSBBQUMgLSBDb3JlLgorICAgKi8KKyAgaWYgKChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9DT05GSUcpIHx8IChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9TVEFURVMpKSB7CisgICAgaWYgKEZES2FhY0VuY19Jbml0aWFsaXplKAorICAgICAgICAgICAgaEFhY0VuY29kZXItPmhBYWNFbmMsIGhBYWNDb25maWcsIGhBYWNFbmNvZGVyLT5oVHBFbmMsCisgICAgICAgICAgICAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfU1RBVEVTKSA/IDEgOiAwKSAhPSBBQUNfRU5DX09LKSB7CisgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfQUFDX0VSUk9SOworICAgIH0KKworICB9IC8qIGFhYyBpbml0aWFsaXphdGlvbiAqLworCisgIC8qCisgICAqIEluaXRpYWxpemUgTWV0YSBEYXRhIC0gRW5jb2Rlci4KKyAgICovCisgIGlmIChoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jICYmIChoQWFjRW5jb2Rlci0+bWV0YURhdGFBbGxvd2VkICE9IDApICYmCisgICAgICAoKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX0NPTkZJRykgfHwgKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX1NUQVRFUykpKSB7CisgICAgSU5UIGlucHV0RGF0YURlbGF5ID0gREVMQVlfQUFDKGhBYWNDb25maWctPmZyYW1lbGVuZ3RoKTsKKworICAgIGlmIChpc1NickFjdGl2ZShoQWFjQ29uZmlnKSAmJiBoU2JyRW5jb2RlciAhPSBOVUxMKSB7CisgICAgICBpbnB1dERhdGFEZWxheSA9IGhBYWNDb25maWctPnNiclJhdGlvICogaW5wdXREYXRhRGVsYXkgKworICAgICAgICAgICAgICAgICAgICAgICBzYnJFbmNvZGVyX0dldElucHV0RGF0YURlbGF5KCpoU2JyRW5jb2Rlcik7CisgICAgfQorCisgICAgaWYgKEZES19NZXRhZGF0YUVuY19Jbml0KGhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfU1RBVEVTKSA/IDEgOiAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT51c2VyTWV0YURhdGFNb2RlLCBpbnB1dERhdGFEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGgsIGNvbmZpZy0+dXNlclNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bkNoYW5uZWxzLCBjb25maWctPnVzZXJDaGFubmVsTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+Y2hhbm5lbE9yZGVyKSAhPSAwKSB7CisgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfTUVUQV9FUlJPUjsKKyAgICB9CisKKyAgICBoQWFjRW5jb2Rlci0+bkRlbGF5ICs9IEZES19NZXRhZGF0YUVuY19HZXREZWxheShoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jKTsKKyAgfQorCisgIC8qIEdldCBjdXN0b20gZGVsYXksIGkuZS4gdGhlIGNvZGVjIGRlbGF5IHcvbyB0aGUgZGVjb2RlcidzIFNCUi0gb3IgTVBTIGRlbGF5CisgICAqLworICBpZiAoKGhBYWNFbmNvZGVyLT5oTXBzRW5jICE9IE5VTEwpICYmIChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0xEX01QUykpIHsKKyAgICBoQWFjRW5jb2Rlci0+bkRlbGF5Q29yZSA9CisgICAgICAgIGhBYWNFbmNvZGVyLT5uRGVsYXkgLQorICAgICAgICBmTWF4KDAsIEZES19NcGVnc0VuY19HZXREZWNEZWxheShoQWFjRW5jb2Rlci0+aE1wc0VuYykpOworICB9IGVsc2UgaWYgKGlzU2JyQWN0aXZlKGhBYWNDb25maWcpICYmIGhTYnJFbmNvZGVyICE9IE5VTEwpIHsKKyAgICBoQWFjRW5jb2Rlci0+bkRlbGF5Q29yZSA9CisgICAgICAgIGhBYWNFbmNvZGVyLT5uRGVsYXkgLQorICAgICAgICBmTWF4KDAsIHNickVuY29kZXJfR2V0U2JyRGVjRGVsYXkoaEFhY0VuY29kZXItPmhFbnZFbmMpKTsKKyAgfSBlbHNlIHsKKyAgICBoQWFjRW5jb2Rlci0+bkRlbGF5Q29yZSA9IGhBYWNFbmNvZGVyLT5uRGVsYXk7CisgIH0KKworICAvKgorICAgKiBVcGRhdGUgcG9pbnRlciB0byB3b3JraW5nIGJ1ZmZlci4KKyAgICovCisgIGlmICgoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfQ09ORklHKSkgeworICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlck9mZnNldCA9IGFhY0J1ZmZlck9mZnNldDsKKworICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZCA9IGZyYW1lTGVuZ3RoICogY29uZmlnLT5uQ2hhbm5lbHM7CisKKyAgfSAvKiBwYXJhbWV0ZXIgY2hhbmdlZCAqLworCisgIHJldHVybiBBQUNFTkNfT0s7Cit9CisKK0FBQ0VOQ19FUlJPUiBhYWNFbmNPcGVuKEhBTkRMRV9BQUNFTkNPREVSICpwaEFhY0VuY29kZXIsIGNvbnN0IFVJTlQgZW5jTW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbWF4Q2hhbm5lbHMpIHsKKyAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKKyAgSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIgPSBOVUxMOworCisgIGlmIChwaEFhY0VuY29kZXIgPT0gTlVMTCkgeworICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgaEFhY0VuY29kZXIgPSBHZXRfQWFjRW5jb2RlcigpOworCisgIGlmIChoQWFjRW5jb2RlciA9PSBOVUxMKSB7CisgICAgZXJyID0gQUFDRU5DX01FTU9SWV9FUlJPUjsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBGREttZW1jbGVhcihoQWFjRW5jb2Rlciwgc2l6ZW9mKEFBQ0VOQ09ERVIpKTsKKworICAvKiBTcGVjaWZ5IGVuY29kZXIgbW9kdWxlcyB0byBiZSBhbGxvY2F0ZWQuICovCisgIGlmIChlbmNNb2R1bGVzID09IDApIHsKKyAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoX3BMaWJJbmZvLCBMSUJfSU5GTywgRkRLX01PRFVMRV9MQVNUKQorICAgIExJQl9JTkZPKCpwTGliSW5mbykKKyAgICBbRkRLX01PRFVMRV9MQVNUXSA9IChMSUJfSU5GTygqKVtGREtfTU9EVUxFX0xBU1RdKV9wTGliSW5mbzsKKyAgICBGREtpbml0TGliSW5mbygqcExpYkluZm8pOworICAgIGFhY0VuY0dldExpYkluZm8oKnBMaWJJbmZvKTsKKworICAgIGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzID0gRU5DX01PREVfRkxBR19BQUM7CisgICAgaWYgKEZES2xpYkluZm9fZ2V0Q2FwYWJpbGl0aWVzKCpwTGliSW5mbywgRkRLX1NCUkVOQykgJiBDQVBGX1NCUl9IUSkgeworICAgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgfD0gRU5DX01PREVfRkxBR19TQlI7CisgICAgfQorICAgIGlmIChGREtsaWJJbmZvX2dldENhcGFiaWxpdGllcygqcExpYkluZm8sIEZES19TQlJFTkMpICYgQ0FQRl9TQlJfUFNfTVBFRykgeworICAgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgfD0gRU5DX01PREVfRkxBR19QUzsKKyAgICB9CisgICAgaWYgKEZES2xpYkluZm9fZ2V0Q2FwYWJpbGl0aWVzKCpwTGliSW5mbywgRkRLX0FBQ0VOQykgJiBDQVBGX0FBQ19EUkMpIHsKKyAgICAgIGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzIHw9IEVOQ19NT0RFX0ZMQUdfTUVUQTsKKyAgICB9CisgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgfD0gRU5DX01PREVfRkxBR19TQUM7CisKKyAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKF9wTGliSW5mbywgTElCX0lORk8sIEZES19NT0RVTEVfTEFTVCkKKyAgfSBlbHNlIHsKKyAgICBoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyA9IGVuY01vZHVsZXM7CisgIH0KKworICAvKiBEZXRlcm1pbmUgbWF4IGNoYW5uZWwgY29uZmlndXJhdGlvbi4gKi8KKyAgaWYgKG1heENoYW5uZWxzID09IDApIHsKKyAgICBoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzID0gKDgpOworICAgIGhBYWNFbmNvZGVyLT5uTWF4U2JyQ2hhbm5lbHMgPSAoOCk7CisgIH0gZWxzZSB7CisgICAgaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscyA9IChtYXhDaGFubmVscyAmIDB4MDBGRik7CisgICAgaWYgKChoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyAmIEVOQ19NT0RFX0ZMQUdfU0JSKSkgeworICAgICAgaEFhY0VuY29kZXItPm5NYXhTYnJDaGFubmVscyA9IChtYXhDaGFubmVscyAmIDB4RkYwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAobWF4Q2hhbm5lbHMgPj4gOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzOworICAgIH0KKworICAgIGlmICgoaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscyA+ICg4KSkgfHwKKyAgICAgICAgKGhBYWNFbmNvZGVyLT5uTWF4U2JyQ2hhbm5lbHMgPiAoOCkpKSB7CisgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9IC8qIG1heENoYW5uZWxzPT0wICovCisKKyAgLyogTWF4IG51bWJlciBvZiBlbGVtZW50cyBjb3VsZCBiZSB0dW5lZCBhbnkgbW9yZS4gKi8KKyAgaEFhY0VuY29kZXItPm5NYXhBYWNFbGVtZW50cyA9IGZpeE1pbigoKDgpKSwgaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscyk7CisgIGhBYWNFbmNvZGVyLT5uTWF4U2JyRWxlbWVudHMgPSBmaXhNaW4oKDgpLCBoQWFjRW5jb2Rlci0+bk1heFNickNoYW5uZWxzKTsKKworICAvKiBJbiBjYXNlIG9mIG1lbW9yeSBvdmVybGF5LCBhbGxvY2F0ZSBtZW1vcnkgb3V0IG9mIGxpYnJhcmllcyAqLworCisgIGlmIChoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyAmIChFTkNfTU9ERV9GTEFHX1NCUiB8IEVOQ19NT0RFX0ZMQUdfUFMpKQorICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsID0gSU5QVVRCVUZGRVJfU0laRTsKKyAgZWxzZQorICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsID0gKDEwMjQpOworCisgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlclNpemUgPQorICAgICAgaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscyAqIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsOworCisgIGlmIChOVUxMID09IChoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIgPSAoSU5UX1BDTSAqKUZES2NhbGxvYygKKyAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplLCBzaXplb2YoSU5UX1BDTSkpKSkgeworICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogT3BlbiBTQlIgRW5jb2RlciAqLworICBpZiAoaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgJiBFTkNfTU9ERV9GTEFHX1NCUikgeworICAgIGlmIChzYnJFbmNvZGVyX09wZW4oCisgICAgICAgICAgICAmaEFhY0VuY29kZXItPmhFbnZFbmMsIGhBYWNFbmNvZGVyLT5uTWF4U2JyRWxlbWVudHMsCisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+bk1heFNickNoYW5uZWxzLAorICAgICAgICAgICAgKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzICYgRU5DX01PREVfRkxBR19QUykgPyAxIDogMCkpIHsKICAgICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7CiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCi0gICAgLyogT3BlbiBNZXRhIERhdGEgRW5jb2RlciAqLwotICAgIGlmIChoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyZFTkNfTU9ERV9GTEFHX01FVEEpIHsKLSAgICAgIGlmICggRkRLX01ldGFkYXRhRW5jX09wZW4oJmhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMpICkKLSAgICAgIHsKLSAgICAgICAgZXJyID0gQUFDRU5DX01FTU9SWV9FUlJPUjsKKyAgICBpZiAoTlVMTCA9PSAoaEFhY0VuY29kZXItPnBTYnJQYXlsb2FkID0gKFNCUkVOQ19FWFRfUEFZTE9BRCAqKUZES2NhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgIDEsIHNpemVvZihTQlJFTkNfRVhUX1BBWUxPQUQpKSkpIHsKKyAgICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9IC8qIChlbmNvZGVyX21vZGlzJkVOQ19NT0RFX0ZMQUdfU0JSKSAqLworCisgIC8qIE9wZW4gQWFjIEVuY29kZXIgKi8KKyAgaWYgKEZES2FhY0VuY19PcGVuKCZoQWFjRW5jb2Rlci0+aEFhY0VuYywgaEFhY0VuY29kZXItPm5NYXhBYWNFbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMsICgxKSkgIT0gQUFDX0VOQ19PSykgeworICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogQml0c3RyZWFtIG91dHB1dCBidWZmZXIgKi8KKyAgaEFhY0VuY29kZXItPm91dEJ1ZmZlckluQnl0ZXMgPQorICAgICAgMSA8PCAoREZSQUNUX0JJVFMgLSBDbnRMZWFkaW5nWmVyb3MoZml4TWF4KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgKCgxKSAqIGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMgKiA2MTQ0KSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpKSk7IC8qIGJ1ZmZlciBoYXMgdG8gYmUgMl5uICovCisgIGlmIChOVUxMID09IChoQWFjRW5jb2Rlci0+b3V0QnVmZmVyID0gKFVDSEFSICopRkRLY2FsbG9jKAorICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5vdXRCdWZmZXJJbkJ5dGVzLCBzaXplb2YoVUNIQVIpKSkpIHsKKyAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIE9wZW4gTWV0YSBEYXRhIEVuY29kZXIgKi8KKyAgaWYgKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzICYgRU5DX01PREVfRkxBR19NRVRBKSB7CisgICAgaWYgKEZES19NZXRhZGF0YUVuY19PcGVuKCZoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVCloQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzKSkgeworICAgICAgZXJyID0gQUFDRU5DX01FTU9SWV9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0gLyogKGVuY29kZXJfbW9kaXMmRU5DX01PREVfRkxBR19NRVRBKSAqLworCisgIC8qIE9wZW4gTVBFRyBTdXJyb3VuZCBFbmNvZGVyICovCisgIGlmIChoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyAmIEVOQ19NT0RFX0ZMQUdfU0FDKSB7CisgICAgaWYgKE1QU19FTkNPREVSX09LICE9IEZES19NcGVnc0VuY19PcGVuKCZoQWFjRW5jb2Rlci0+aE1wc0VuYykpIHsKKyAgICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9IC8qIChoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyZFTkNfTU9ERV9GTEFHX1NBQykgKi8KKworICAvKiBPcGVuIFRyYW5zcG9ydCBFbmNvZGVyICovCisgIGlmICh0cmFuc3BvcnRFbmNfT3BlbigmaEFhY0VuY29kZXItPmhUcEVuYykgIT0gMCkgeworICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7CisgICAgZ290byBiYWlsOworICB9IGVsc2UgeworICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChfcExpYkluZm8sIExJQl9JTkZPLCBGREtfTU9EVUxFX0xBU1QpCisKKyAgICBMSUJfSU5GTygqcExpYkluZm8pCisgICAgW0ZES19NT0RVTEVfTEFTVF0gPSAoTElCX0lORk8oKilbRkRLX01PRFVMRV9MQVNUXSlfcExpYkluZm87CisKKyAgICBGREtpbml0TGliSW5mbygqcExpYkluZm8pOworICAgIHRyYW5zcG9ydEVuY19HZXRMaWJJbmZvKCpwTGliSW5mbyk7CisKKyAgICAvKiBHZXQgY2FwYWJpbHR5IGZsYWcgZm9yIHRyYW5zcG9ydCBlbmNvZGVyLiAqLworICAgIGhBYWNFbmNvZGVyLT5DQVBGX3RwRW5jID0gRkRLbGliSW5mb19nZXRDYXBhYmlsaXRpZXMoKnBMaWJJbmZvLCBGREtfVFBFTkMpOworCisgICAgQ19BTExPQ19TQ1JBVENIX0VORChfcExpYkluZm8sIExJQl9JTkZPLCBGREtfTU9EVUxFX0xBU1QpCisgIH0KKyAgaWYgKHRyYW5zcG9ydEVuY19SZWdpc3RlclNickNhbGxiYWNrKGhBYWNFbmNvZGVyLT5oVHBFbmMsIGFhY2VuY19TYnJDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyKSAhPSAwKSB7CisgICAgZXJyID0gQUFDRU5DX0lOSVRfVFBfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisgIGlmICh0cmFuc3BvcnRFbmNfUmVnaXN0ZXJTc2NDYWxsYmFjayhoQWFjRW5jb2Rlci0+aFRwRW5jLCBhYWNlbmNfU3NjQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2RlcikgIT0gMCkgeworICAgIGVyciA9IEFBQ0VOQ19JTklUX1RQX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycy4gKi8KKyAgYWFjRW5jRGVmYXVsdENvbmZpZygmaEFhY0VuY29kZXItPmFhY0NvbmZpZywgJmhBYWNFbmNvZGVyLT5leHRQYXJhbSk7CisKKyAgLyogSW5pdGlhbGl6ZSBoZWFkZXJQZXJpb2QgaW4gY29kZXJDb25maWcgZm9yIGFhY0VuY29kZXJfR2V0UGFyYW0oKS4gKi8KKyAgaEFhY0VuY29kZXItPmNvZGVyQ29uZmlnLmhlYWRlclBlcmlvZCA9CisgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0udXNlclRwSGVhZGVyUGVyaW9kOworCisgIC8qIEFsbCBlbmNvZGVyIG1vZHVsZXMgaGF2ZSB0byBiZSBpbml0aWFsaXplZCAqLworICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzID0gQUFDRU5DX0lOSVRfQUxMOworCisgIC8qIFJldHVybiBlbmNvZGVyIGluc3RhbmNlICovCisgICpwaEFhY0VuY29kZXIgPSBoQWFjRW5jb2RlcjsKKworICByZXR1cm4gZXJyOworCitiYWlsOgorICBhYWNFbmNDbG9zZSgmaEFhY0VuY29kZXIpOworCisgIHJldHVybiBlcnI7Cit9CisKK0FBQ0VOQ19FUlJPUiBhYWNFbmNDbG9zZShIQU5ETEVfQUFDRU5DT0RFUiAqcGhBYWNFbmNvZGVyKSB7CisgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7CisKKyAgaWYgKHBoQWFjRW5jb2RlciA9PSBOVUxMKSB7CisgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfSEFORExFOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmICgqcGhBYWNFbmNvZGVyICE9IE5VTEwpIHsKKyAgICBIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciA9ICpwaEFhY0VuY29kZXI7CisKKyAgICBpZiAoaEFhY0VuY29kZXItPmlucHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgIEZES2ZyZWUoaEFhY0VuY29kZXItPmlucHV0QnVmZmVyKTsKKyAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgfQorICAgIGlmIChoQWFjRW5jb2Rlci0+b3V0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgIEZES2ZyZWUoaEFhY0VuY29kZXItPm91dEJ1ZmZlcik7CisgICAgICBoQWFjRW5jb2Rlci0+b3V0QnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoaEFhY0VuY29kZXItPmhFbnZFbmMpIHsKKyAgICAgIHNickVuY29kZXJfQ2xvc2UoJmhBYWNFbmNvZGVyLT5oRW52RW5jKTsKKyAgICB9CisgICAgaWYgKGhBYWNFbmNvZGVyLT5wU2JyUGF5bG9hZCAhPSBOVUxMKSB7CisgICAgICBGREtmcmVlKGhBYWNFbmNvZGVyLT5wU2JyUGF5bG9hZCk7CisgICAgICBoQWFjRW5jb2Rlci0+cFNiclBheWxvYWQgPSBOVUxMOworICAgIH0KKyAgICBpZiAoaEFhY0VuY29kZXItPmhBYWNFbmMpIHsKKyAgICAgIEZES2FhY0VuY19DbG9zZSgmaEFhY0VuY29kZXItPmhBYWNFbmMpOworICAgIH0KKworICAgIHRyYW5zcG9ydEVuY19DbG9zZSgmaEFhY0VuY29kZXItPmhUcEVuYyk7CisKKyAgICBpZiAoaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYykgeworICAgICAgRkRLX01ldGFkYXRhRW5jX0Nsb3NlKCZoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jKTsKKyAgICB9CisgICAgaWYgKGhBYWNFbmNvZGVyLT5oTXBzRW5jKSB7CisgICAgICBGREtfTXBlZ3NFbmNfQ2xvc2UoJmhBYWNFbmNvZGVyLT5oTXBzRW5jKTsKKyAgICB9CisKKyAgICBGcmVlX0FhY0VuY29kZXIocGhBYWNFbmNvZGVyKTsKKyAgfQorCitiYWlsOgorICByZXR1cm4gZXJyOworfQorCitBQUNFTkNfRVJST1IgYWFjRW5jRW5jb2RlKGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQUNFTkNfQnVmRGVzYyAqaW5CdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQUNFTkNfQnVmRGVzYyAqb3V0QnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDRU5DX0luQXJncyAqaW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfT3V0QXJncyAqb3V0YXJncykgeworICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOworICBJTlQgaSwgbkJzQnl0ZXMgPSAwOworICBJTlQgb3V0Qnl0ZXNbKDEpXTsKKyAgaW50IG5FeHRlbnNpb25zID0gMDsKKyAgaW50IGFuY0RhdGFFeHRJZHggPSAtMTsKKworICAvKiBkZWFsIHdpdGggdmFsaWQgZW5jb2RlciBoYW5kbGUgKi8KKyAgaWYgKGhBYWNFbmNvZGVyID09IE5VTEwpIHsKKyAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyoKKyAgICogQWRqdXN0IHVzZXIgc2V0dGluZ3MgYW5kIHRyaWdnZXIgcmVpbml0aWFsaXphdGlvbi4KKyAgICovCisgIGlmIChoQWFjRW5jb2Rlci0+SW5pdEZsYWdzICE9IDApIHsKKyAgICBlcnIgPQorICAgICAgICBhYWNFbmNJbml0KGhBYWNFbmNvZGVyLCBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzLCAmaEFhY0VuY29kZXItPmV4dFBhcmFtKTsKKworICAgIGlmIChlcnIgIT0gQUFDRU5DX09LKSB7CisgICAgICAvKiBrZWVwIGluaXQgZmxhZ3MgYWxpdmUhICovCisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgPSBBQUNFTkNfSU5JVF9OT05FOworICB9CisKKyAgaWYgKG91dGFyZ3MgIT0gTlVMTCkgeworICAgIEZES21lbWNsZWFyKG91dGFyZ3MsIHNpemVvZihBQUNFTkNfT3V0QXJncykpOworICB9CisKKyAgaWYgKG91dEJ1ZkRlc2MgIT0gTlVMTCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBvdXRCdWZEZXNjLT5udW1CdWZzOyBpKyspIHsKKyAgICAgIGlmIChvdXRCdWZEZXNjLT5idWZzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgRkRLbWVtY2xlYXIob3V0QnVmRGVzYy0+YnVmc1tpXSwgb3V0QnVmRGVzYy0+YnVmU2l6ZXNbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qCisgICAqIElmIG9ubHkgZW5jb2RlciBoYW5kbGUgZ2l2ZW4sIGluZGVwZW5kZW50IChyZSlpbml0aWFsaXphdGlvbiBjYW4gYmUKKyAgICogdHJpZ2dlcmVkLgorICAgKi8KKyAgaWYgKChpbkJ1ZkRlc2MgPT0gTlVMTCkgJiYgKG91dEJ1ZkRlc2MgPT0gTlVMTCkgJiYgKGluYXJncyA9PSBOVUxMKSAmJgorICAgICAgKG91dGFyZ3MgPT0gTlVMTCkpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBjaGVjayBpZiBidWZmZXIgZGVzY3JpcHRvcnMgYXJlIGZpbGxlZCBvdXQgcHJvcGVybHkuICovCisgIGlmICgoQUFDRU5DX09LICE9IHZhbGlkYXRlQnVmRGVzYyhpbkJ1ZkRlc2MpKSB8fAorICAgICAgKEFBQ0VOQ19PSyAhPSB2YWxpZGF0ZUJ1ZkRlc2Mob3V0QnVmRGVzYykpIHx8IChpbmFyZ3MgPT0gTlVMTCkgfHwKKyAgICAgIChvdXRhcmdzID09IE5VTEwpKSB7CisgICAgZXJyID0gQUFDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUjsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiByZXNldCBidWZmZXIgd2ljaCBzaWduYWxzIG51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBvdXRwdXQgYml0c3RyZWFtIGJ1ZmZlcgorICAgKi8KKyAgRkRLbWVtY2xlYXIob3V0Qnl0ZXMsIGhBYWNFbmNvZGVyLT5hYWNDb25maWcublN1YkZyYW1lcyAqIHNpemVvZihJTlQpKTsKKworICAvKgorICAgKiBNYW5hZ2UgaW5jb21pbmcgYXVkaW8gc2FtcGxlcy4KKyAgICovCisgIGlmICgoaW5CdWZEZXNjICE9IE5VTEwpICYmIChpbmFyZ3MtPm51bUluU2FtcGxlcyA+IDApICYmCisgICAgICAoZ2V0QnVmRGVzY0lkeChpbkJ1ZkRlc2MsIElOX0FVRElPX0RBVEEpICE9IC0xKSkgeworICAgIC8qIEZldGNoIGRhdGEgdW50aWwgblNhbXBsZXNUb1JlYWQgcmVhY2hlZCAqLworICAgIElOVCBpZHggPSBnZXRCdWZEZXNjSWR4KGluQnVmRGVzYywgSU5fQVVESU9fREFUQSk7CisgICAgSU5UIG5ld1NhbXBsZXMgPQorICAgICAgICBmaXhNYXgoMCwgZml4TWluKGluYXJncy0+bnVtSW5TYW1wbGVzLCBoQWFjRW5jb2Rlci0+blNhbXBsZXNUb1JlYWQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCkpOworICAgIElOVF9QQ00gKnBJbiA9CisgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciArCisgICAgICAgIChoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJPZmZzZXQgKyBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkKSAvCisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLm5DaGFubmVsczsKKworICAgIC8qIENvcHkgbmV3IGlucHV0IHNhbXBsZXMgdG8gaW50ZXJuYWwgYnVmZmVyICovCisgICAgaWYgKGluQnVmRGVzYy0+YnVmRWxTaXplc1tpZHhdID09IChJTlQpc2l6ZW9mKElOVF9QQ00pKSB7CisgICAgICBGREtfZGVpbnRlcmxlYXZlKChJTlRfUENNICopaW5CdWZEZXNjLT5idWZzW2lkeF0sIHBJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3U2FtcGxlcyAvIGhBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsKTsKKyAgICB9IGVsc2UgaWYgKGluQnVmRGVzYy0+YnVmRWxTaXplc1tpZHhdID4gKElOVClzaXplb2YoSU5UX1BDTSkpIHsKKyAgICAgIEZES19kZWludGVybGVhdmUoKExPTkcgKilpbkJ1ZkRlc2MtPmJ1ZnNbaWR4XSwgcEluLAorICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0ubkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdTYW1wbGVzIC8gaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWwpOworICAgIH0gZWxzZSB7CisgICAgICBGREtfZGVpbnRlcmxlYXZlKChTSE9SVCAqKWluQnVmRGVzYy0+YnVmc1tpZHhdLCBwSW4sCisgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgIG5ld1NhbXBsZXMgLyBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0ubkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCk7CisgICAgfQorICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgKz0gbmV3U2FtcGxlczsKKworICAgIC8qIE51bWJlciBvZiBmZXRjaGVkIGlucHV0IGJ1ZmZlciBzYW1wbGVzLiAqLworICAgIG91dGFyZ3MtPm51bUluU2FtcGxlcyA9IG5ld1NhbXBsZXM7CisgIH0KKworICAvKiBpbnB1dCBidWZmZXIgY29tcGxldGVseSBmaWxsZWQgPyAqLworICBpZiAoaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCA8IGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZCkgeworICAgIC8qIC0gZW9mIHJlYWNoZWQgYW5kIGZsdXNoaW5nIGVuYWJsZWQsIG9yCisgICAgICAgLSByZXR1cm4gdG8gbWFpbiBhbmQgd2FpdCBmb3IgZnVydGhlciBpbmNvbWluZyBhdWRpbyBzYW1wbGVzICovCisgICAgaWYgKGluYXJncy0+bnVtSW5TYW1wbGVzID09IC0xKSB7CisgICAgICBpZiAoKGhBYWNFbmNvZGVyLT5uWmVyb3NBcHBlbmRlZCA8IGhBYWNFbmNvZGVyLT5uRGVsYXkpKSB7CisgICAgICAgIGludCBuWmVyb3MgPSAoaEFhY0VuY29kZXItPm5TYW1wbGVzVG9SZWFkIC0gaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCkgLworICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVsczsKKworICAgICAgICBGREtfQVNTRVJUKG5aZXJvcyA+PSAwKTsKKworICAgICAgICAvKiBjbGVhciBvdXQgdW50aWwgZW5kLW9mLWJ1ZmZlciAqLworICAgICAgICBpZiAoblplcm9zKSB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBGREttZW1jbGVhcihoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlck9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihJTlRfUENNKSAqIG5aZXJvcyk7CisgICAgICAgICAgfQorICAgICAgICAgIGhBYWNFbmNvZGVyLT5uWmVyb3NBcHBlbmRlZCArPSBuWmVyb3M7CisgICAgICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCA9IGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgLyogZmx1c2hpbmcgY29tcGxldGVkICovCisgICAgICAgIGVyciA9IEFBQ0VOQ19FTkNPREVfRU9GOyAvKiBlb2YgcmVhY2hlZCAqLwogICAgICAgICBnb3RvIGJhaWw7CiAgICAgICB9Ci0gICAgfSAvKiAoZW5jb2Rlcl9tb2RpcyZFTkNfTU9ERV9GTEFHX01FVEEpICovCi0KLSAgICAvKiBPcGVuIFRyYW5zcG9ydCBFbmNvZGVyICovCi0gICAgaWYgKCB0cmFuc3BvcnRFbmNfT3BlbigmaEFhY0VuY29kZXItPmhUcEVuYykgIT0gMCApCi0gICAgewotICAgICAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOwotICAgICAgICBnb3RvIGJhaWw7CisgICAgfSBlbHNlIHsgICAgIC8qIGluYXJncy0+bnVtSW5TYW1wbGVzIT0gLTEgKi8KKyAgICAgIGdvdG8gYmFpbDsgLyogbm90IGVub3VnaCBzYW1wbGVzIGluIGlucHV0IGJ1ZmZlciBhbmQgbm8gZmx1c2hpbmcgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgKi8KICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwTGliSW5mbywgTElCX0lORk8sIEZES19NT0RVTEVfTEFTVCk7CisgIH0KIAotICAgICAgICBGREtpbml0TGliSW5mbyggcExpYkluZm8pOwotICAgICAgICB0cmFuc3BvcnRFbmNfR2V0TGliSW5mbyggcExpYkluZm8gKTsKKyAgLyogaW5pdCBwYXlsb2FkICovCisgIEZES21lbWNsZWFyKGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkLAorICAgICAgICAgICAgICBzaXplb2YoQUFDRU5DX0VYVF9QQVlMT0FEKSAqIE1BWF9UT1RBTF9FWFRfUEFZTE9BRFMpOworICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUzsgaSsrKSB7CisgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbaV0uYXNzb2NpYXRlZENoRWxlbWVudCA9IC0xOworICB9CisgIGlmIChoQWFjRW5jb2Rlci0+cFNiclBheWxvYWQgIT0gTlVMTCkgeworICAgIEZES21lbWNsZWFyKGhBYWNFbmNvZGVyLT5wU2JyUGF5bG9hZCwgc2l6ZW9mKCpoQWFjRW5jb2Rlci0+cFNiclBheWxvYWQpKTsKKyAgfQogCi0gICAgICAgIC8qIEdldCBjYXBhYmlsdHkgZmxhZyBmb3IgdHJhbnNwb3J0IGVuY29kZXIuICovCi0gICAgICAgIGhBYWNFbmNvZGVyLT5DQVBGX3RwRW5jID0gRkRLbGliSW5mb19nZXRDYXBhYmlsaXRpZXMoIHBMaWJJbmZvLCBGREtfVFBFTkMpOworICAvKgorICAgKiBDYWxjdWxhdGUgTWV0YSBEYXRhIGluZm8uCisgICAqLworICBpZiAoKGhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMgIT0gTlVMTCkgJiYKKyAgICAgIChoQWFjRW5jb2Rlci0+bWV0YURhdGFBbGxvd2VkICE9IDApKSB7CisgICAgY29uc3QgQUFDRU5DX01ldGFEYXRhICpwTWV0YURhdGEgPSBOVUxMOworICAgIEFBQ0VOQ19FWFRfUEFZTE9BRCAqcE1ldGFEYXRhRXh0UGF5bG9hZCA9IE5VTEw7CisgICAgVUlOVCBuTWV0YURhdGFFeHRlbnNpb25zID0gMDsKKyAgICBJTlQgbWF0cml4X21peGRvd25faWR4ID0gMDsKIAotICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBMaWJJbmZvLCBMSUJfSU5GTywgRkRLX01PRFVMRV9MQVNUKTsKKyAgICAvKiBOZXcgbWV0YSBkYXRhIGluZm8gYXZhaWxhYmxlID8gKi8KKyAgICBpZiAoZ2V0QnVmRGVzY0lkeChpbkJ1ZkRlc2MsIElOX01FVEFEQVRBX1NFVFVQKSAhPSAtMSkgeworICAgICAgcE1ldGFEYXRhID0KKyAgICAgICAgICAoQUFDRU5DX01ldGFEYXRhICopCisgICAgICAgICAgICAgIGluQnVmRGVzYy0+YnVmc1tnZXRCdWZEZXNjSWR4KGluQnVmRGVzYywgSU5fTUVUQURBVEFfU0VUVVApXTsKICAgICB9Ci0gICAgaWYgKCB0cmFuc3BvcnRFbmNfUmVnaXN0ZXJTYnJDYWxsYmFjayhoQWFjRW5jb2Rlci0+aFRwRW5jLCBhYWNlbmNfU2JyQ2FsbGJhY2ssIGhBYWNFbmNvZGVyKSAhPSAwICkgewotICAgICAgZXJyID0gQUFDRU5DX0lOSVRfVFBfRVJST1I7CisKKyAgICBGREtfTWV0YWRhdGFFbmNfUHJvY2VzcygKKyAgICAgICAgaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYywKKyAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyICsgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyT2Zmc2V0IC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5jb2RlckNvbmZpZy5ub0NoYW5uZWxzLAorICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCwgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCwKKyAgICAgICAgcE1ldGFEYXRhLCAmcE1ldGFEYXRhRXh0UGF5bG9hZCwgJm5NZXRhRGF0YUV4dGVuc2lvbnMsCisgICAgICAgICZtYXRyaXhfbWl4ZG93bl9pZHgpOworCisgICAgZm9yIChpID0gMDsgaSA8IChJTlQpbk1ldGFEYXRhRXh0ZW5zaW9uczsKKyAgICAgICAgIGkrKykgeyAvKiBHZXQgbWV0YSBkYXRhIGV4dGVuc2lvbiBwYXlsb2FkLiAqLworICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnMrK10gPSBwTWV0YURhdGFFeHRQYXlsb2FkW2ldOworICAgIH0KKworICAgIGlmICgobWF0cml4X21peGRvd25faWR4ICE9IC0xKSAmJgorICAgICAgICAoKGhBYWNFbmNvZGVyLT5leHRQYXJhbS51c2VyQ2hhbm5lbE1vZGUgPT0gTU9ERV8xXzJfMikgfHwKKyAgICAgICAgIChoQWFjRW5jb2Rlci0+ZXh0UGFyYW0udXNlckNoYW5uZWxNb2RlID09IE1PREVfMV8yXzJfMSkpKSB7CisgICAgICAvKiBTZXQgbWF0cml4IG1peGRvd24gY29lZmZpY2llbnQuICovCisgICAgICBVSU5UIHBjZVZhbHVlID0gKFVJTlQpKCgwIDw8IDMpIHwgKChtYXRyaXhfbWl4ZG93bl9pZHggJiAweDMpIDw8IDEpIHwgMSk7CisgICAgICBpZiAoaEFhY0VuY29kZXItPmV4dFBhcmFtLnVzZXJQY2VBZGRpdGlvbnMgIT0gcGNlVmFsdWUpIHsKKyAgICAgICAgaEFhY0VuY29kZXItPmV4dFBhcmFtLnVzZXJQY2VBZGRpdGlvbnMgPSBwY2VWYWx1ZTsKKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogRW5jb2RlIE1QUyBkYXRhLgorICAgKi8KKyAgaWYgKChoQWFjRW5jb2Rlci0+aE1wc0VuYyAhPSBOVUxMKSAmJgorICAgICAgKGhBYWNFbmNvZGVyLT5hYWNDb25maWcuc3ludGF4RmxhZ3MgJiBBQ19MRF9NUFMpKSB7CisgICAgQUFDRU5DX0VYVF9QQVlMT0FEIG1wc0V4dGVuc2lvblBheWxvYWQ7CisgICAgRkRLbWVtY2xlYXIoJm1wc0V4dGVuc2lvblBheWxvYWQsIHNpemVvZihBQUNFTkNfRVhUX1BBWUxPQUQpKTsKKworICAgIGlmIChNUFNfRU5DT0RFUl9PSyAhPQorICAgICAgICBGREtfTXBlZ3NFbmNfUHJvY2VzcygKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5oTXBzRW5jLAorICAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyICsgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyT2Zmc2V0IC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+Y29kZXJDb25maWcubm9DaGFubmVscywKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQsICZtcHNFeHRlbnNpb25QYXlsb2FkKSkgeworICAgICAgZXJyID0gQUFDRU5DX0VOQ09ERV9FUlJPUjsKICAgICAgIGdvdG8gYmFpbDsKICAgICB9CiAKLSAgICAvKiBJbml0aWFsaXplIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMuICovCi0gICAgYWFjRW5jRGVmYXVsdENvbmZpZygmaEFhY0VuY29kZXItPmFhY0NvbmZpZywgJmhBYWNFbmNvZGVyLT5leHRQYXJhbSk7Ci0KLSAgICAvKiBJbml0aWFsaXplIGhlYWRlclBlcmlvZCBpbiBjb2RlckNvbmZpZyBmb3IgYWFjRW5jb2Rlcl9HZXRQYXJhbSgpLiAqLwotICAgIGhBYWNFbmNvZGVyLT5jb2RlckNvbmZpZy5oZWFkZXJQZXJpb2QgPSBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0udXNlclRwSGVhZGVyUGVyaW9kOwotCi0gICAgLyogQWxsIGVuY29kZXIgbW9kdWxlcyBoYXZlIHRvIGJlIGluaXRpYWxpemVkICovCi0gICAgaEFhY0VuY29kZXItPkluaXRGbGFncyA9IEFBQ0VOQ19JTklUX0FMTDsKLQotICAgIC8qIFJldHVybiBlbmNvZGVyIGluc3RhbmNlICovCi0gICAgKnBoQWFjRW5jb2RlciA9IGhBYWNFbmNvZGVyOwotCi0gICAgcmV0dXJuIGVycjsKLQotYmFpbDoKLSAgICBhYWNFbmNDbG9zZSgmaEFhY0VuY29kZXIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0KLUFBQ0VOQ19FUlJPUiBhYWNFbmNDbG9zZShIQU5ETEVfQUFDRU5DT0RFUiAqcGhBYWNFbmNvZGVyKQotewotICAgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7Ci0KLSAgICBpZiAocGhBYWNFbmNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfSEFORExFOwotICAgICAgICBnb3RvIGJhaWw7CisgICAgaWYgKChtcHNFeHRlbnNpb25QYXlsb2FkLnBEYXRhICE9IE5VTEwpICYmCisgICAgICAgICgobXBzRXh0ZW5zaW9uUGF5bG9hZC5kYXRhU2l6ZSAhPSAwKSkpIHsKKyAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zKytdID0gbXBzRXh0ZW5zaW9uUGF5bG9hZDsKICAgICB9CisgIH0KIAotICAgIGlmICgqcGhBYWNFbmNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIgPSAqcGhBYWNFbmNvZGVyOwotCi0KLSAgICAgICBpZiAoaEFhY0VuY29kZXItPmlucHV0QnVmZmVyIT1OVUxMKSB7Ci0gICAgICAgICAgIEZES2ZyZWUoaEFhY0VuY29kZXItPmlucHV0QnVmZmVyKTsKLSAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICB9Ci0KLSAgICAgICBpZiAoaEFhY0VuY29kZXItPm91dEJ1ZmZlcikgewotICAgICAgICAgRnJlZVJhbV9ic091dGJ1ZmZlcigmaEFhY0VuY29kZXItPm91dEJ1ZmZlcik7Ci0gICAgICAgfQotCi0gICAgICAgIGlmIChoQWFjRW5jb2Rlci0+aEVudkVuYykgewotICAgICAgICAgICAgc2JyRW5jb2Rlcl9DbG9zZSAoJmhBYWNFbmNvZGVyLT5oRW52RW5jKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaEFhY0VuY29kZXItPmhBYWNFbmMpIHsKLSAgICAgICAgICAgIEZES2FhY0VuY19DbG9zZSAoJmhBYWNFbmNvZGVyLT5oQWFjRW5jKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyYW5zcG9ydEVuY19DbG9zZSgmaEFhY0VuY29kZXItPmhUcEVuYyk7Ci0KLSAgICAgICAgaWYgKGhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMpIHsKLSAgICAgICAgICAgIEZES19NZXRhZGF0YUVuY19DbG9zZSAoJmhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMpOwotICAgICAgICB9Ci0KLSAgICAgICAgRnJlZV9BYWNFbmNvZGVyKHBoQWFjRW5jb2Rlcik7Ci0gICAgfQotCi1iYWlsOgotICAgIHJldHVybiBlcnI7Ci19Ci0KLUFBQ0VOQ19FUlJPUiBhYWNFbmNFbmNvZGUoCi0gICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19CdWZEZXNjICAgICAqaW5CdWZEZXNjLAotICAgICAgICBjb25zdCBBQUNFTkNfQnVmRGVzYyAgICAgKm91dEJ1ZkRlc2MsCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19JbkFyZ3MgICAgICAqaW5hcmdzLAotICAgICAgICBBQUNFTkNfT3V0QXJncyAgICAgICAgICAgKm91dGFyZ3MKLSAgICAgICAgKQotewotICAgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7Ci0gICAgSU5UIGksIG5Cc0J5dGVzID0gMDsKLSAgICBJTlQgIG91dEJ5dGVzWygxKV07Ci0gICAgaW50ICBuRXh0ZW5zaW9ucyA9IDA7Ci0gICAgaW50ICBhbmNEYXRhRXh0SWR4ID0gLTE7Ci0KLSAgICAvKiBkZWFsIHdpdGggdmFsaWQgZW5jb2RlciBoYW5kbGUgKi8KLSAgICBpZiAoaEFhY0VuY29kZXI9PU5VTEwpIHsKLSAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfSEFORExFOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCisgIGlmICgoTlVMTCAhPSBoQWFjRW5jb2Rlci0+aEVudkVuYykgJiYgKE5VTEwgIT0gaEFhY0VuY29kZXItPnBTYnJQYXlsb2FkKSAmJgorICAgICAgaXNTYnJBY3RpdmUoJmhBYWNFbmNvZGVyLT5hYWNDb25maWcpKSB7CisgICAgSU5UIG5QYXlsb2FkID0gMDsKIAogICAgIC8qCi0gICAgICogQWRqdXN0IHVzZXIgc2V0dGluZ3MgYW5kIHRyaWdnZXIgcmVpbml0aWFsaXphdGlvbi4KKyAgICAgKiBFbmNvZGUgU0JSIGRhdGEuCiAgICAgICovCi0gICAgaWYgKGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MhPTApIHsKLQotICAgICAgICBlcnIgPSBhYWNFbmNJbml0KGhBYWNFbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAmaEFhY0VuY29kZXItPmV4dFBhcmFtKTsKLQotICAgICAgICBpZiAoZXJyIT1BQUNFTkNfT0spIHsKLSAgICAgICAgICAgIC8qIGtlZXAgaW5pdCBmbGFncyBhbGl2ZSEgKi8KLSAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICBpZiAoc2JyRW5jb2Rlcl9FbmNvZGVGcmFtZShoQWFjRW5jb2Rlci0+aEVudkVuYywgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5wU2JyUGF5bG9hZC0+ZGF0YVNpemVbblBheWxvYWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5wU2JyUGF5bG9hZC0+ZGF0YVtuUGF5bG9hZF0pKSB7CisgICAgICBlcnIgPSBBQUNFTkNfRU5DT0RFX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0gZWxzZSB7CisgICAgICAvKiBBZGQgU0JSIGV4dGVuc2lvbiBwYXlsb2FkICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgKDgpOyBpKyspIHsKKyAgICAgICAgaWYgKGhBYWNFbmNvZGVyLT5wU2JyUGF5bG9hZC0+ZGF0YVNpemVbblBheWxvYWRdW2ldID4gMCkgeworICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5wRGF0YSA9CisgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5wU2JyUGF5bG9hZC0+ZGF0YVtuUGF5bG9hZF1baV07CisgICAgICAgICAgeworICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnNdLmRhdGFTaXplID0KKyAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+cFNiclBheWxvYWQtPmRhdGFTaXplW25QYXlsb2FkXVtpXTsKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID0gaTsKKyAgICAgICAgICB9CisgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnNdLmRhdGFUeXBlID0KKyAgICAgICAgICAgICAgRVhUX1NCUl9EQVRBOyAvKiBPbmNlIFNCUiBFbmNvZGVyIHN1cHBvcnRzIFNCUiBDUkMgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUX1NCUl9EQVRBX0NSQyAqLworICAgICAgICAgIG5FeHRlbnNpb25zKys7ICAgIC8qIG9yIEVYVF9TQlJfREFUQSBhY2NvcmRpbmcgdG8gY29uZmlndXJhdGlvbi4gKi8KKyAgICAgICAgICBGREtfQVNTRVJUKG5FeHRlbnNpb25zIDw9IE1BWF9UT1RBTF9FWFRfUEFZTE9BRFMpOwogICAgICAgICB9Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgPSBBQUNFTkNfSU5JVF9OT05FOworICAgICAgfQorICAgICAgblBheWxvYWQrKzsKICAgICB9CisgIH0gLyogc2JyRW5hYmxlZCAqLwogCi0gICAgaWYgKG91dGFyZ3MhPU5VTEwpIHsKLSAgICAgICAgRkRLbWVtY2xlYXIob3V0YXJncywgc2l6ZW9mKEFBQ0VOQ19PdXRBcmdzKSk7Ci0gICAgfQorICBpZiAoKGluYXJncy0+bnVtQW5jQnl0ZXMgPiAwKSAmJgorICAgICAgKGdldEJ1ZkRlc2NJZHgoaW5CdWZEZXNjLCBJTl9BTkNJTExSWV9EQVRBKSAhPSAtMSkpIHsKKyAgICBJTlQgaWR4ID0gZ2V0QnVmRGVzY0lkeChpbkJ1ZkRlc2MsIElOX0FOQ0lMTFJZX0RBVEEpOworICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5kYXRhU2l6ZSA9IGluYXJncy0+bnVtQW5jQnl0ZXMgKiA4OworICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5wRGF0YSA9IChVQ0hBUiAqKWluQnVmRGVzYy0+YnVmc1tpZHhdOworICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5kYXRhVHlwZSA9IEVYVF9EQVRBX0VMRU1FTlQ7CisgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnNdLmFzc29jaWF0ZWRDaEVsZW1lbnQgPSAtMTsKKyAgICBhbmNEYXRhRXh0SWR4ID0gbkV4dGVuc2lvbnM7IC8qIHN0b3JlIGluZGV4ICovCisgICAgbkV4dGVuc2lvbnMrKzsKKyAgfQogCi0gICAgaWYgKG91dEJ1ZkRlc2MhPU5VTEwpIHsKLSAgICAgIGZvciAoaT0wOyBpPG91dEJ1ZkRlc2MtPm51bUJ1ZnM7IGkrKykgewotICAgICAgICBpZiAob3V0QnVmRGVzYy0+YnVmc1tpXSE9TlVMTCkgewotICAgICAgICAgIEZES21lbWNsZWFyKG91dEJ1ZkRlc2MtPmJ1ZnNbaV0sIG91dEJ1ZkRlc2MtPmJ1ZlNpemVzW2ldKTsKLSAgICAgICAgfQorICAvKgorICAgKiBFbmNvZGUgQUFDIC0gQ29yZS4KKyAgICovCisgIGlmIChGREthYWNFbmNfRW5jb2RlRnJhbWUoaEFhY0VuY29kZXItPmhBYWNFbmMsIGhBYWNFbmNvZGVyLT5oVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsLCBvdXRCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZCkgIT0gQUFDX0VOQ19PSykgeworICAgIGVyciA9IEFBQ0VOQ19FTkNPREVfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisKKyAgaWYgKGFuY0RhdGFFeHRJZHggPj0gMCkgeworICAgIG91dGFyZ3MtPm51bUFuY0J5dGVzID0KKyAgICAgICAgaW5hcmdzLT5udW1BbmNCeXRlcyAtCisgICAgICAgIChoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFthbmNEYXRhRXh0SWR4XS5kYXRhU2l6ZSA+PiAzKTsKKyAgfQorCisgIC8qIHNhbXBsZXMgZXhoYXVzdGVkICovCisgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgLT0gaEFhY0VuY29kZXItPm5TYW1wbGVzVG9SZWFkOworCisgIC8qCisgICAqIERlbGF5IGJhbGFuY2luZyBidWZmZXIgaGFuZGxpbmcKKyAgICovCisgIGlmIChpc1NickFjdGl2ZSgmaEFhY0VuY29kZXItPmFhY0NvbmZpZykpIHsKKyAgICBzYnJFbmNvZGVyX1VwZGF0ZUJ1ZmZlcnMoaEFhY0VuY29kZXItPmhFbnZFbmMsIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWwpOworICB9CisKKyAgLyoKKyAgICogTWFrZSBiaXRzdHJlYW0gcHVibGljCisgICAqLworICBpZiAoKG91dEJ1ZkRlc2MgIT0gTlVMTCkgJiYgKG91dEJ1ZkRlc2MtPm51bUJ1ZnMgPj0gMSkpIHsKKyAgICBJTlQgYnNJZHggPSBnZXRCdWZEZXNjSWR4KG91dEJ1ZkRlc2MsIE9VVF9CSVRTVFJFQU1fREFUQSk7CisgICAgSU5UIGF1SWR4ID0gZ2V0QnVmRGVzY0lkeChvdXRCdWZEZXNjLCBPVVRfQVVfU0laRVMpOworCisgICAgZm9yIChpID0gMCwgbkJzQnl0ZXMgPSAwOyBpIDwgaEFhY0VuY29kZXItPmFhY0NvbmZpZy5uU3ViRnJhbWVzOyBpKyspIHsKKyAgICAgIG5Cc0J5dGVzICs9IG91dEJ5dGVzW2ldOworCisgICAgICBpZiAoYXVJZHggIT0gLTEpIHsKKyAgICAgICAgKChJTlQgKilvdXRCdWZEZXNjLT5idWZzW2F1SWR4XSlbaV0gPSBvdXRCeXRlc1tpXTsKICAgICAgIH0KICAgICB9CiAKLSAgICAvKgotICAgICAqIElmIG9ubHkgZW5jb2RlciBoYW5kbGUgZ2l2ZW4sIGluZGVwZW5kZW50IChyZSlpbml0aWFsaXphdGlvbiBjYW4gYmUgdHJpZ2dlcmVkLgotICAgICAqLwotICAgIGlmICggKGhBYWNFbmNvZGVyIT1OVUxMKSAmIChpbkJ1ZkRlc2M9PU5VTEwpICYmIChvdXRCdWZEZXNjPT1OVUxMKSAmJiAoaW5hcmdzPT1OVUxMKSAmJiAob3V0YXJncz09TlVMTCkgKSB7Ci0gICAgICAgIGdvdG8gYmFpbDsKKyAgICBpZiAoKGJzSWR4ICE9IC0xKSAmJiAob3V0QnVmRGVzYy0+YnVmU2l6ZXNbYnNJZHhdID49IG5Cc0J5dGVzKSkgeworICAgICAgRkRLbWVtY3B5KG91dEJ1ZkRlc2MtPmJ1ZnNbYnNJZHhdLCBoQWFjRW5jb2Rlci0+b3V0QnVmZmVyLAorICAgICAgICAgICAgICAgIHNpemVvZihVQ0hBUikgKiBuQnNCeXRlcyk7CisgICAgICBvdXRhcmdzLT5udW1PdXRCeXRlcyA9IG5Cc0J5dGVzOworICAgICAgb3V0YXJncy0+Yml0UmVzU3RhdGUgPQorICAgICAgICAgIEZES2FhY0VuY19HZXRCaXRSZXNlcnZvaXJTdGF0ZShoQWFjRW5jb2Rlci0+aEFhY0VuYyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG91dHB1dCBidWZmZXIgdG9vIHNtYWxsLCBjYW4ndCB3cml0ZSB2YWxpZCBiaXRzdHJlYW0gKi8KKyAgICAgIGVyciA9IEFBQ0VOQ19FTkNPREVfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CiAgICAgfQotCi0gICAgLyogcmVzZXQgYnVmZmVyIHdpY2ggc2lnbmFscyBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gb3V0cHV0IGJpdHN0cmVhbSBidWZmZXIgKi8KLSAgICBGREttZW1jbGVhcihvdXRCeXRlcywgaEFhY0VuY29kZXItPmFhY0NvbmZpZy5uU3ViRnJhbWVzKnNpemVvZihJTlQpKTsKLQotICAgIC8qCi0gICAgICogTWFuYWdlIGluY29taW5nIGF1ZGlvIHNhbXBsZXMuCi0gICAgICovCi0gICAgaWYgKCAoaW5hcmdzLT5udW1JblNhbXBsZXMgPiAwKSAmJiAoZ2V0QnVmRGVzY0lkeChpbkJ1ZkRlc2MsSU5fQVVESU9fREFUQSkgIT0gLTEpICkKLSAgICB7Ci0gICAgICAgIC8qIEZldGNoIGRhdGEgdW50aWwgblNhbXBsZXNUb1JlYWQgcmVhY2hlZCAqLwotICAgICAgICBJTlQgaWR4ID0gZ2V0QnVmRGVzY0lkeChpbkJ1ZkRlc2MsSU5fQVVESU9fREFUQSk7Ci0gICAgICAgIElOVCBuZXdTYW1wbGVzID0gZml4TWF4KDAsZml4TWluKGluYXJncy0+bnVtSW5TYW1wbGVzLCBoQWFjRW5jb2Rlci0+blNhbXBsZXNUb1JlYWQtaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCkpOwotICAgICAgICBJTlRfUENNICpwSW4gPSBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIraEFhY0VuY29kZXItPmlucHV0QnVmZmVyT2Zmc2V0K2hBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQ7Ci0KLSAgICAgICAgLyogQ29weSBuZXcgaW5wdXQgc2FtcGxlcyB0byBpbnRlcm5hbCBidWZmZXIgKi8KLSAgICAgICAgaWYgKGluQnVmRGVzYy0+YnVmRWxTaXplc1tpZHhdPT0oSU5UKXNpemVvZihJTlRfUENNKSkgewotICAgICAgICAgICAgRkRLbWVtY3B5KHBJbiwgKElOVF9QQ00qKWluQnVmRGVzYy0+YnVmc1tpZHhdLCBuZXdTYW1wbGVzKnNpemVvZihJTlRfUENNKSk7ICAvKiBGYXN0IGNvcHkuICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaW5CdWZEZXNjLT5idWZFbFNpemVzW2lkeF0+KElOVClzaXplb2YoSU5UX1BDTSkpIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPG5ld1NhbXBsZXM7IGkrKykgewotICAgICAgICAgICAgICAgIHBJbltpXSA9IChJTlRfUENNKSgoKExPTkcqKWluQnVmRGVzYy0+YnVmc1tpZHhdKVtpXT4+MTYpOyAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IDMyIHRvIDE2IGJpdC4gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPG5ld1NhbXBsZXM7IGkrKykgewotICAgICAgICAgICAgICAgIHBJbltpXSA9ICgoSU5UX1BDTSkoKChTSE9SVCopaW5CdWZEZXNjLT5idWZzW2lkeF0pW2ldKSk8PDE2OyAgICAgICAgICAgICAvKiBDb252ZXJ0IDE2IHRvIDMyIGJpdC4gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkICs9IG5ld1NhbXBsZXM7Ci0KLSAgICAgICAgLyogTnVtYmVyIG9mIGZldGNoZWQgaW5wdXQgYnVmZmVyIHNhbXBsZXMuICovCi0gICAgICAgIG91dGFyZ3MtPm51bUluU2FtcGxlcyA9IG5ld1NhbXBsZXM7Ci0gICAgfQotCi0gICAgLyogaW5wdXQgYnVmZmVyIGNvbXBsZXRlbHkgZmlsbGVkID8gKi8KLSAgICBpZiAoaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCA8IGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZCkKLSAgICB7Ci0gICAgICAgIC8qIC0gZW9mIHJlYWNoZWQgYW5kIGZsdXNoaW5nIGVuYWJsZWQsIG9yCi0gICAgICAgICAgIC0gcmV0dXJuIHRvIG1haW4gYW5kIHdhaXQgZm9yIGZ1cnRoZXIgaW5jb21pbmcgYXVkaW8gc2FtcGxlcyAqLwotICAgICAgICBpZiAoaW5hcmdzLT5udW1JblNhbXBsZXM9PS0xKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIChoQWFjRW5jb2Rlci0+blplcm9zQXBwZW5kZWQgPCBoQWFjRW5jb2Rlci0+bkRlbGF5KQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW50IG5aZXJvcyA9IGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZCAtIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQ7Ci0KLSAgICAgICAgICAgICAgRkRLX0FTU0VSVChuWmVyb3MgPj0gMCk7Ci0KLSAgICAgICAgICAgICAgLyogY2xlYXIgb3V0IHVudGlsIGVuZC1vZi1idWZmZXIgKi8KLSAgICAgICAgICAgICAgaWYgKG5aZXJvcykgewotICAgICAgICAgICAgICAgIEZES21lbWNsZWFyKGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlcitoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJPZmZzZXQraEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCwgc2l6ZW9mKElOVF9QQ00pKm5aZXJvcyApOwotICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uWmVyb3NBcHBlbmRlZCArPSBuWmVyb3M7Ci0gICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCA9IGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7IC8qIGZsdXNoaW5nIGNvbXBsZXRlZCAqLwotICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfRU5DT0RFX0VPRjsgLyogZW9mIHJlYWNoZWQgKi8KLSAgICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeyAvKiBpbmFyZ3MtPm51bUluU2FtcGxlcyE9IC0xICovCi0gICAgICAgICAgICBnb3RvIGJhaWw7IC8qIG5vdCBlbm91Z2ggc2FtcGxlcyBpbiBpbnB1dCBidWZmZXIgYW5kIG5vIGZsdXNoaW5nIGVuYWJsZWQgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGluaXQgcGF5bG9hZCAqLwotICAgIEZES21lbWNsZWFyKGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkLCBzaXplb2YoQUFDRU5DX0VYVF9QQVlMT0FEKSAqIE1BWF9UT1RBTF9FWFRfUEFZTE9BRFMpOwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVE9UQUxfRVhUX1BBWUxPQURTOyBpKyspIHsKLSAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW2ldLmFzc29jaWF0ZWRDaEVsZW1lbnQgPSAtMTsKLSAgICB9Ci0gICAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXItPmV4dFBheWxvYWREYXRhLCBzaXplb2YoaEFhY0VuY29kZXItPmV4dFBheWxvYWREYXRhKSk7Ci0gICAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXItPmV4dFBheWxvYWRTaXplLCBzaXplb2YoaEFhY0VuY29kZXItPmV4dFBheWxvYWRTaXplKSk7Ci0KLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIE1ldGEgRGF0YSBpbmZvLgotICAgICAqLwotICAgIGlmICggKGhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMhPU5VTEwpICYmIChoQWFjRW5jb2Rlci0+bWV0YURhdGFBbGxvd2VkIT0wKSApIHsKLQotICAgICAgICBjb25zdCBBQUNFTkNfTWV0YURhdGEgKnBNZXRhRGF0YSA9IE5VTEw7Ci0gICAgICAgIEFBQ0VOQ19FWFRfUEFZTE9BRCAqcE1ldGFEYXRhRXh0UGF5bG9hZCA9IE5VTEw7Ci0gICAgICAgIFVJTlQgbk1ldGFEYXRhRXh0ZW5zaW9ucyA9IDA7Ci0gICAgICAgIElOVCAgbWF0cml4X21peGRvd25faWR4ID0gMDsKLQotICAgICAgICAvKiBOZXcgbWV0YSBkYXRhIGluZm8gYXZhaWxhYmxlID8gKi8KLSAgICAgICAgaWYgKCBnZXRCdWZEZXNjSWR4KGluQnVmRGVzYyxJTl9NRVRBREFUQV9TRVRVUCkgIT0gLTEgKSB7Ci0gICAgICAgICAgcE1ldGFEYXRhID0gKEFBQ0VOQ19NZXRhRGF0YSopaW5CdWZEZXNjLT5idWZzW2dldEJ1ZkRlc2NJZHgoaW5CdWZEZXNjLElOX01FVEFEQVRBX1NFVFVQKV07Ci0gICAgICAgIH0KLQotICAgICAgICBGREtfTWV0YWRhdGFFbmNfUHJvY2VzcyhoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIraEFhY0VuY29kZXItPmlucHV0QnVmZmVyT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWV0YURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBNZXRhRGF0YUV4dFBheWxvYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5NZXRhRGF0YUV4dGVuc2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hdHJpeF9taXhkb3duX2lkeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgIGZvciAoaT0wOyBpPChJTlQpbk1ldGFEYXRhRXh0ZW5zaW9uczsgaSsrKSB7ICAvKiBHZXQgbWV0YSBkYXRhIGV4dGVuc2lvbiBwYXlsb2FkLiAqLwotICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnMrK10gPSBwTWV0YURhdGFFeHRQYXlsb2FkW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAobWF0cml4X21peGRvd25faWR4IT0tMSkKLSAgICAgICAgICAmJiAoKGhBYWNFbmNvZGVyLT5leHRQYXJhbS51c2VyQ2hhbm5lbE1vZGU9PU1PREVfMV8yXzIpfHwoaEFhY0VuY29kZXItPmV4dFBhcmFtLnVzZXJDaGFubmVsTW9kZT09TU9ERV8xXzJfMl8xKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogU2V0IG1hdHJpeCBtaXhkb3duIGNvZWZmaWNpZW50LiAqLwotICAgICAgICAgIFVJTlQgcGNlVmFsdWUgPSAoVUlOVCkoICgwPDwzKSB8ICgobWF0cml4X21peGRvd25faWR4JjB4Myk8PDEpIHwgMSApOwotICAgICAgICAgIGlmIChoQWFjRW5jb2Rlci0+ZXh0UGFyYW0udXNlclBjZUFkZGl0aW9ucyAhPSBwY2VWYWx1ZSkgewotICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBhcmFtLnVzZXJQY2VBZGRpdGlvbnMgPSBwY2VWYWx1ZTsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgaWYgKCBpc1NickFjdGl2ZSgmaEFhY0VuY29kZXItPmFhY0NvbmZpZykgKSB7Ci0KLSAgICAgICAgSU5UIG5QYXlsb2FkID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBFbmNvZGUgU0JSIGRhdGEuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc2JyRW5jb2Rlcl9FbmNvZGVGcmFtZShoQWFjRW5jb2Rlci0+aEVudkVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0ubkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFNpemVbblBheWxvYWRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZERhdGFbblBheWxvYWRdCi0jaWYgZGVmaW5lZChFVkFMX1BBQ0tBR0VfU0lMRU5DRSkgfHwgZGVmaW5lZChFVkFMX1BBQ0tBR0VfU0JSX1NJTEVOQ0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGhBYWNFbmNvZGVyLT5oQWFjRW5jLT5jbGVhck91dHB1dAotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gQUFDRU5DX0VOQ09ERV9FUlJPUjsKLSAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIEFkZCBTQlIgZXh0ZW5zaW9uIHBheWxvYWQgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoOCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFNpemVbblBheWxvYWRdW2ldID4gMCkgewotICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10ucERhdGEgICAgPSBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZERhdGFbblBheWxvYWRdW2ldOwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnNdLmRhdGFTaXplID0gaEFhY0VuY29kZXItPmV4dFBheWxvYWRTaXplW25QYXlsb2FkXVtpXTsKLSAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10uYXNzb2NpYXRlZENoRWxlbWVudCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnNdLmRhdGFUeXBlID0gRVhUX1NCUl9EQVRBOyAgLyogT25jZSBTQlIgRW5jb2RlciBzdXBwb3J0cyBTQlIgQ1JDIHNldCBFWFRfU0JSX0RBVEFfQ1JDICovCi0gICAgICAgICAgICAgICAgICAgIG5FeHRlbnNpb25zKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9yIEVYVF9TQlJfREFUQSBhY2NvcmRpbmcgdG8gY29uZmlndXJhdGlvbi4gKi8KLSAgICAgICAgICAgICAgICAgICAgRkRLX0FTU0VSVChuRXh0ZW5zaW9uczw9TUFYX1RPVEFMX0VYVF9QQVlMT0FEUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgblBheWxvYWQrKzsKLSAgICAgICAgfQotICAgIH0gLyogc2JyRW5hYmxlZCAqLwotCi0gICAgaWYgKCAoaW5hcmdzLT5udW1BbmNCeXRlcyA+IDApICYmICggZ2V0QnVmRGVzY0lkeChpbkJ1ZkRlc2MsSU5fQU5DSUxMUllfREFUQSkhPS0xICkgKSB7Ci0gICAgICAgIElOVCBpZHggPSBnZXRCdWZEZXNjSWR4KGluQnVmRGVzYyxJTl9BTkNJTExSWV9EQVRBKTsKLSAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnNdLmRhdGFTaXplID0gaW5hcmdzLT5udW1BbmNCeXRlcyAqIDg7Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5wRGF0YSAgICA9IChVQ0hBUiopaW5CdWZEZXNjLT5idWZzW2lkeF07Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5kYXRhVHlwZSA9IEVYVF9EQVRBX0VMRU1FTlQ7Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID0gLTE7Ci0gICAgICAgIGFuY0RhdGFFeHRJZHggPSBuRXh0ZW5zaW9uczsgLyogc3RvcmUgaW5kZXggKi8KLSAgICAgICAgbkV4dGVuc2lvbnMrKzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEVuY29kZSBBQUMgLSBDb3JlLgotICAgICAqLwotICAgIGlmICggRkRLYWFjRW5jX0VuY29kZUZyYW1lKCBoQWFjRW5jb2Rlci0+aEFhY0VuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAhPSBBQUNfRU5DX09LICkKLSAgICB7Ci0gICAgICAgIGVyciA9IEFBQ0VOQ19FTkNPREVfRVJST1I7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoYW5jRGF0YUV4dElkeCA+PSAwKSB7Ci0gICAgICBvdXRhcmdzLT5udW1BbmNCeXRlcyA9IGluYXJncy0+bnVtQW5jQnl0ZXMgLSAoaEFhY0VuY29kZXItPmV4dFBheWxvYWRbYW5jRGF0YUV4dElkeF0uZGF0YVNpemU+PjMpOwotICAgIH0KLQotICAgIC8qIHNhbXBsZXMgZXhoYXVzdGVkICovCi0gICAgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCAtPSBoQWFjRW5jb2Rlci0+blNhbXBsZXNUb1JlYWQ7Ci0KLSAgICAvKgotICAgICAqIERlbGF5IGJhbGFuY2luZyBidWZmZXIgaGFuZGxpbmcKLSAgICAgKi8KLSAgICBpZiAoaXNTYnJBY3RpdmUoJmhBYWNFbmNvZGVyLT5hYWNDb25maWcpKSB7Ci0gICAgICAgIHNickVuY29kZXJfVXBkYXRlQnVmZmVycyhoQWFjRW5jb2Rlci0+aEVudkVuYywgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1ha2UgYml0c3RyZWFtIHB1YmxpYwotICAgICAqLwotICAgIGlmIChvdXRCdWZEZXNjLT5udW1CdWZzPj0xKSB7Ci0KLSAgICAgICAgSU5UIGJzSWR4ID0gZ2V0QnVmRGVzY0lkeChvdXRCdWZEZXNjLE9VVF9CSVRTVFJFQU1fREFUQSk7Ci0gICAgICAgIElOVCBhdUlkeCA9IGdldEJ1ZkRlc2NJZHgob3V0QnVmRGVzYyxPVVRfQVVfU0laRVMpOwotCi0gICAgICAgIGZvciAoaT0wLG5Cc0J5dGVzPTA7IGk8aEFhY0VuY29kZXItPmFhY0NvbmZpZy5uU3ViRnJhbWVzOyBpKyspIHsKLSAgICAgICAgICBuQnNCeXRlcyArPSBvdXRCeXRlc1tpXTsKLQotICAgICAgICAgIGlmIChhdUlkeCE9LTEpIHsKLSAgICAgICAgICAgKChJTlQqKW91dEJ1ZkRlc2MtPmJ1ZnNbYXVJZHhdKVtpXSA9IG91dEJ5dGVzW2ldOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKGJzSWR4IT0tMSkgJiYgKG91dEJ1ZkRlc2MtPmJ1ZlNpemVzW2JzSWR4XT49bkJzQnl0ZXMpICkgewotICAgICAgICAgIEZES21lbWNweShvdXRCdWZEZXNjLT5idWZzW2JzSWR4XSwgaEFhY0VuY29kZXItPm91dEJ1ZmZlciwgc2l6ZW9mKFVDSEFSKSpuQnNCeXRlcyk7Ci0gICAgICAgICAgb3V0YXJncy0+bnVtT3V0Qnl0ZXMgPSBuQnNCeXRlczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAvKiBvdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCwgY2FuJ3Qgd3JpdGUgdmFsaWQgYml0c3RyZWFtICovCi0gICAgICAgICAgZXJyID0gQUFDRU5DX0VOQ09ERV9FUlJPUjsKLSAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgIH0KLSAgICB9CisgIH0KIAogYmFpbDoKLSAgICBpZiAoZXJyID09IEFBQ0VOQ19FTkNPREVfRVJST1IpIHsKLSAgICAgICAgLyogQWxsIGVuY29kZXIgbW9kdWxlcyBoYXZlIHRvIGJlIGluaXRpYWxpemVkICovCi0gICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgPSBBQUNFTkNfSU5JVF9BTEw7Ci0gICAgfQorICBpZiAoZXJyID09IEFBQ0VOQ19FTkNPREVfRVJST1IpIHsKKyAgICAvKiBBbGwgZW5jb2RlciBtb2R1bGVzIGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgKi8KKyAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzID0gQUFDRU5DX0lOSVRfQUxMOworICB9CiAKLSAgICByZXR1cm4gZXJyOworICByZXR1cm4gZXJyOwogfQogCi1zdGF0aWMKLUFBQ19FTkNPREVSX0VSUk9SIGFhY0VuY0dldENvbmYoSEFORExFX0FBQ0VOQ09ERVIgIGhBYWNFbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAqc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgKmNvbmZCdWZmZXIpCi17Ci0gICAgRkRLX0JJVFNUUkVBTSB0bXBDb25mOwotICAgIFVJTlQgY29uZlR5cGU7Ci0gICAgVUNIQVIgYnVmWzY0XTsKLSAgICBpbnQgZXJyOworc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIGFhY0VuY0dldENvbmYoSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpzaXplLCBVQ0hBUiAqY29uZkJ1ZmZlcikgeworICBGREtfQklUU1RSRUFNIHRtcENvbmY7CisgIFVJTlQgY29uZlR5cGU7CisgIFVDSEFSIGJ1Zls2NF07CisgIGludCBlcnI7CiAKLSAgICAvKiBJbml0IGJpdCBidWZmZXIgKi8KLSAgICBGREtpbml0Qml0U3RyZWFtKCZ0bXBDb25mLCBidWYsIDY0LCAwLCBCU19XUklURVIpOworICAvKiBJbml0IGJpdCBidWZmZXIgKi8KKyAgRkRLaW5pdEJpdFN0cmVhbSgmdG1wQ29uZiwgYnVmLCA2NCwgMCwgQlNfV1JJVEVSKTsKIAotICAgIC8qIHdyaXRlIGNvbmYgaW4gdG1wIGJ1ZmZlciAqLwotICAgIGVyciA9IHRyYW5zcG9ydEVuY19HZXRDb25mKGhBYWNFbmNvZGVyLT5oVHBFbmMsICZoQWFjRW5jb2Rlci0+Y29kZXJDb25maWcsICZ0bXBDb25mLCAmY29uZlR5cGUpOworICAvKiB3cml0ZSBjb25mIGluIHRtcCBidWZmZXIgKi8KKyAgZXJyID0gdHJhbnNwb3J0RW5jX0dldENvbmYoaEFhY0VuY29kZXItPmhUcEVuYywgJmhBYWNFbmNvZGVyLT5jb2RlckNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcENvbmYsICZjb25mVHlwZSk7CiAKLSAgICAvKiBjb3B5IGRhdGEgdG8gb3V0YnVmZmVyOiBsZW5ndGggaW4gYnl0ZXMgKi8KLSAgICBGREtieXRlQWxpZ24oJnRtcENvbmYsIDApOworICAvKiBjb3B5IGRhdGEgdG8gb3V0YnVmZmVyOiBsZW5ndGggaW4gYnl0ZXMgKi8KKyAgRkRLYnl0ZUFsaWduKCZ0bXBDb25mLCAwKTsKIAotICAgIC8qIENoZWNrIGJ1ZmZlciBzaXplICovCi0gICAgaWYgKEZES2dldFZhbGlkQml0cygmdG1wQ29uZikgPiAoKCpzaXplKTw8MykpCi0gICAgICByZXR1cm4gQUFDX0VOQ19VTktOT1dOOworICAvKiBDaGVjayBidWZmZXIgc2l6ZSAqLworICBpZiAoRkRLZ2V0VmFsaWRCaXRzKCZ0bXBDb25mKSA+ICgoKnNpemUpIDw8IDMpKSByZXR1cm4gQUFDX0VOQ19VTktOT1dOOwogCi0gICAgRkRLZmV0Y2hCdWZmZXIoJnRtcENvbmYsIGNvbmZCdWZmZXIsIHNpemUpOworICBGREtmZXRjaEJ1ZmZlcigmdG1wQ29uZiwgY29uZkJ1ZmZlciwgc2l6ZSk7CiAKLSAgICBpZiAoZXJyICE9IDApCi0gICAgICByZXR1cm4gQUFDX0VOQ19VTktOT1dOOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBBQUNfRU5DX09LOworICBpZiAoZXJyICE9IDApCisgICAgcmV0dXJuIEFBQ19FTkNfVU5LTk9XTjsKKyAgZWxzZQorICAgIHJldHVybiBBQUNfRU5DX09LOwogfQogCi0KLUFBQ0VOQ19FUlJPUiBhYWNFbmNHZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKQoteworQUFDRU5DX0VSUk9SIGFhY0VuY0dldExpYkluZm8oTElCX0lORk8gKmluZm8pIHsKICAgaW50IGkgPSAwOwogCiAgIGlmIChpbmZvID09IE5VTEwpIHsKICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfSEFORExFOwogICB9CiAKLSAgRkRLX3Rvb2xzR2V0TGliSW5mbyggaW5mbyApOwotICB0cmFuc3BvcnRFbmNfR2V0TGliSW5mbyggaW5mbyApOwotCi0gIHNickVuY29kZXJfR2V0TGliSW5mbyggaW5mbyApOworICBGREtfdG9vbHNHZXRMaWJJbmZvKGluZm8pOworICB0cmFuc3BvcnRFbmNfR2V0TGliSW5mbyhpbmZvKTsKKyAgc2JyRW5jb2Rlcl9HZXRMaWJJbmZvKGluZm8pOworICBGREtfTXBlZ3NFbmNfR2V0TGliSW5mbyhpbmZvKTsKIAogICAvKiBzZWFyY2ggZm9yIG5leHQgZnJlZSB0YWIgKi8KICAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CkBAIC0xNzM1LDQwNSArMjA1Miw0NTEgQEAKICAgfQogCiAgIGluZm9baV0ubW9kdWxlX2lkID0gRkRLX0FBQ0VOQzsKLSAgaW5mb1tpXS5idWlsZF9kYXRlID0gKGNoYXIqKUFBQ0VOQ09ERVJfTElCX0JVSUxEX0RBVEU7Ci0gIGluZm9baV0uYnVpbGRfdGltZSA9IChjaGFyKilBQUNFTkNPREVSX0xJQl9CVUlMRF9USU1FOwotICBpbmZvW2ldLnRpdGxlID0gKGNoYXIqKUFBQ0VOQ09ERVJfTElCX1RJVExFOwotICBpbmZvW2ldLnZlcnNpb24gPSBMSUJfVkVSU0lPTihBQUNFTkNPREVSX0xJQl9WTDAsIEFBQ0VOQ09ERVJfTElCX1ZMMSwgQUFDRU5DT0RFUl9MSUJfVkwyKTs7CisgIGluZm9baV0uYnVpbGRfZGF0ZSA9IEFBQ0VOQ09ERVJfTElCX0JVSUxEX0RBVEU7CisgIGluZm9baV0uYnVpbGRfdGltZSA9IEFBQ0VOQ09ERVJfTElCX0JVSUxEX1RJTUU7CisgIGluZm9baV0udGl0bGUgPSBBQUNFTkNPREVSX0xJQl9USVRMRTsKKyAgaW5mb1tpXS52ZXJzaW9uID0KKyAgICAgIExJQl9WRVJTSU9OKEFBQ0VOQ09ERVJfTElCX1ZMMCwgQUFDRU5DT0RFUl9MSUJfVkwxLCBBQUNFTkNPREVSX0xJQl9WTDIpOworICA7CiAgIExJQl9WRVJTSU9OX1NUUklORygmaW5mb1tpXSk7CiAKICAgLyogQ2FwYWJpbGl0eSBmbGFncyAqLwotICBpbmZvW2ldLmZsYWdzID0gMAotICAgIHwgQ0FQRl9BQUNfMTAyNCB8IENBUEZfQUFDX0xDCi0gICAgfCBDQVBGX0FBQ181MTIKLSAgICB8IENBUEZfQUFDXzQ4MAotICAgIHwgQ0FQRl9BQUNfRFJDCi0gICAgICA7CisgIGluZm9baV0uZmxhZ3MgPSAwIHwgQ0FQRl9BQUNfMTAyNCB8IENBUEZfQUFDX0xDIHwgQ0FQRl9BQUNfNTEyIHwKKyAgICAgICAgICAgICAgICAgIENBUEZfQUFDXzQ4MCB8IENBUEZfQUFDX0RSQyB8IENBUEZfQUFDX0VMRF9ET1dOU0NBTEU7CiAgIC8qIEVuZCBvZiBmbGFncyAqLwogCiAgIHJldHVybiBBQUNFTkNfT0s7CiB9CiAKLUFBQ0VOQ19FUlJPUiBhYWNFbmNvZGVyX1NldFBhcmFtKAotICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAotICAgICAgICBjb25zdCBBQUNFTkNfUEFSQU0gICAgICAgIHBhcmFtLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgIHZhbHVlCi0gICAgICAgICkKLXsKLSAgICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOwotICAgIFVTRVJfUEFSQU0gKnNldHRpbmdzID0gJmhBYWNFbmNvZGVyLT5leHRQYXJhbTsKK0FBQ0VOQ19FUlJPUiBhYWNFbmNvZGVyX1NldFBhcmFtKGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDRU5DX1BBUkFNIHBhcmFtLCBjb25zdCBVSU5UIHZhbHVlKSB7CisgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7CisgIFVTRVJfUEFSQU0gKnNldHRpbmdzID0gJmhBYWNFbmNvZGVyLT5leHRQYXJhbTsKIAotICAgIC8qIGNoZWNrIGVuY29kZXIgaGFuZGxlICovCi0gICAgaWYgKGhBYWNFbmNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfSEFORExFOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQorICAvKiBjaGVjayBlbmNvZGVyIGhhbmRsZSAqLworICBpZiAoaEFhY0VuY29kZXIgPT0gTlVMTCkgeworICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICBnb3RvIGJhaWw7CisgIH0KIAotICAgIC8qIGFwcGx5IHBhcmFtIHZhbHVlICovCi0gICAgc3dpdGNoIChwYXJhbSkKLSAgICB7CisgIC8qIGFwcGx5IHBhcmFtIHZhbHVlICovCisgIHN3aXRjaCAocGFyYW0pIHsKICAgICBjYXNlIEFBQ0VOQ19BT1Q6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlckFPVCAhPSAoQVVESU9fT0JKRUNUX1RZUEUpdmFsdWUpIHsKLSAgICAgICAgICAgIC8qIGNoZWNrIGlmIEFPVCBtYXRjaGVzIHRoZSBhbGxvY2F0ZWQgbW9kdWxlcyAqLwotICAgICAgICAgICAgc3dpdGNoICggdmFsdWUgKSB7Ci0gICAgICAgICAgICAgIGNhc2UgQU9UX1BTOgotICAgICAgICAgICAgICAgIGlmICghKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzICYgKEVOQ19NT0RFX0ZMQUdfUFMpKSkgewotICAgICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2FzZSBBT1RfU0JSOgotICAgICAgICAgICAgICAgIGlmICghKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzICYgKEVOQ19NT0RFX0ZMQUdfU0JSKSkpIHsKLSAgICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhc2UgQU9UX0FBQ19MQzoKLSAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgotICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgotICAgICAgICAgICAgICAgIGlmICghKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzICYgKEVOQ19NT0RFX0ZMQUdfQUFDKSkpIHsKLSAgICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgIH0vKiBzd2l0Y2ggdmFsdWUgKi8KLSAgICAgICAgICAgIHNldHRpbmdzLT51c2VyQU9UID0gKEFVRElPX09CSkVDVF9UWVBFKXZhbHVlOwotICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJBT1QgIT0gKEFVRElPX09CSkVDVF9UWVBFKXZhbHVlKSB7CisgICAgICAgIC8qIGNoZWNrIGlmIEFPVCBtYXRjaGVzIHRoZSBhbGxvY2F0ZWQgbW9kdWxlcyAqLworICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgY2FzZSBBT1RfUFM6CisgICAgICAgICAgICBpZiAoIShoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyAmIChFTkNfTU9ERV9GTEFHX1BTKSkpIHsKKyAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBBT1RfU0JSOgorICAgICAgICAgIGNhc2UgQU9UX01QMl9TQlI6CisgICAgICAgICAgICBpZiAoIShoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyAmIChFTkNfTU9ERV9GTEFHX1NCUikpKSB7CisgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICAgICAgICBjYXNlIEFPVF9NUDJfQUFDX0xDOgorICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgICAgICAgaWYgKCEoaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgJiAoRU5DX01PREVfRkxBR19BQUMpKSkgeworICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0gLyogc3dpdGNoIHZhbHVlICovCisgICAgICAgIHNldHRpbmdzLT51c2VyQU9UID0gKEFVRElPX09CSkVDVF9UWVBFKXZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9CisgICAgICAgICAgICBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIEFBQ0VOQ19CSVRSQVRFOgotICAgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJCaXRyYXRlICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBzZXR0aW5ncy0+dXNlckJpdHJhdGUgPSB2YWx1ZTsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyQml0cmF0ZSAhPSB2YWx1ZSkgeworICAgICAgICBzZXR0aW5ncy0+dXNlckJpdHJhdGUgPSB2YWx1ZTsKKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIEFBQ0VOQ19CSVRSQVRFTU9ERToKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyQml0cmF0ZU1vZGUgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIHZhbHVlICkgewotICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6IGNhc2UgNDogY2FzZSA1OgotICAgICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJCaXRyYXRlTW9kZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gLyogc3dpdGNoIHZhbHVlICovCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJCaXRyYXRlTW9kZSAhPSB2YWx1ZSkgeworICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBzZXR0aW5ncy0+dXNlckJpdHJhdGVNb2RlID0gdmFsdWU7CisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9CisgICAgICAgICAgICAgICAgQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IC8qIHN3aXRjaCB2YWx1ZSAqLworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfU0FNUExFUkFURToKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyU2FtcGxlcmF0ZSAhPSB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKCAhKCAodmFsdWU9PTgwMDApIHx8ICh2YWx1ZT09MTEwMjUpIHx8ICh2YWx1ZT09MTIwMDApIHx8ICh2YWx1ZT09MTYwMDApIHx8ICh2YWx1ZT09MjIwNTApIHx8ICh2YWx1ZT09MjQwMDApIHx8Ci0gICAgICAgICAgICAgICAgICAgKHZhbHVlPT0zMjAwMCkgfHwgKHZhbHVlPT00NDEwMCkgfHwgKHZhbHVlPT00ODAwMCkgfHwgKHZhbHVlPT02NDAwMCkgfHwgKHZhbHVlPT04ODIwMCkgfHwgKHZhbHVlPT05NjAwMCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJTYW1wbGVyYXRlID0gdmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkID0gMDsgLyogcmVzZXQgaW50ZXJuYWwgaW5wdXRidWZmZXIgKi8KLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfU1RBVEVTIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyU2FtcGxlcmF0ZSAhPSB2YWx1ZSkgeworICAgICAgICBpZiAoISgodmFsdWUgPT0gODAwMCkgfHwgKHZhbHVlID09IDExMDI1KSB8fCAodmFsdWUgPT0gMTIwMDApIHx8CisgICAgICAgICAgICAgICh2YWx1ZSA9PSAxNjAwMCkgfHwgKHZhbHVlID09IDIyMDUwKSB8fCAodmFsdWUgPT0gMjQwMDApIHx8CisgICAgICAgICAgICAgICh2YWx1ZSA9PSAzMjAwMCkgfHwgKHZhbHVlID09IDQ0MTAwKSB8fCAodmFsdWUgPT0gNDgwMDApIHx8CisgICAgICAgICAgICAgICh2YWx1ZSA9PSA2NDAwMCkgfHwgKHZhbHVlID09IDg4MjAwKSB8fCAodmFsdWUgPT0gOTYwMDApKSkgeworICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJTYW1wbGVyYXRlID0gdmFsdWU7CisgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgPSAwOyAvKiByZXNldCBpbnRlcm5hbCBpbnB1dGJ1ZmZlciAqLworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9CisgICAgICAgICAgICBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIEFBQ0VOQ19DSEFOTkVMTU9ERToKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyQ2hhbm5lbE1vZGUgIT0gKENIQU5ORUxfTU9ERSl2YWx1ZSkgewotICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIqIHBDb25maWcgPSBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKChDSEFOTkVMX01PREUpdmFsdWUpOwotICAgICAgICAgICAgaWYgKHBDb25maWc9PU5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIChwQ29uZmlnLT5uRWxlbWVudHMgPiBoQWFjRW5jb2Rlci0+bk1heEFhY0VsZW1lbnRzKQotICAgICAgICAgICAgICB8fCAocENvbmZpZy0+bkNoYW5uZWxzRWZmID4gaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscykKLSAgICAgICAgICAgICAgfHwgISgoKHZhbHVlPj0xKSAmJiAodmFsdWU8PTcpKXx8KCh2YWx1ZT49MzMpICYmICh2YWx1ZTw9MzQpKSkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXR0aW5ncy0+dXNlckNoYW5uZWxNb2RlID0gKENIQU5ORUxfTU9ERSl2YWx1ZTsKLSAgICAgICAgICAgIHNldHRpbmdzLT5uQ2hhbm5lbHMgPSBwQ29uZmlnLT5uQ2hhbm5lbHM7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkID0gMDsgLyogcmVzZXQgaW50ZXJuYWwgaW5wdXRidWZmZXIgKi8KLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX0JBTkRXSURUSDoKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyQmFuZHdpZHRoICE9IHZhbHVlKSB7Ci0gICAgICAgICAgc2V0dGluZ3MtPnVzZXJCYW5kd2lkdGggPSB2YWx1ZTsKLSAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19DSEFOTkVMT1JERVI6Ci0gICAgICAgIGlmIChoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmNoYW5uZWxPcmRlciAhPSAoQ0hBTk5FTF9PUkRFUil2YWx1ZSkgewotICAgICAgICAgICAgaWYgKCEgKCh2YWx1ZT09MCkgfHwgKHZhbHVlPT0xKSkgKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaEFhY0VuY29kZXItPmFhY0NvbmZpZy5jaGFubmVsT3JkZXIgPSAoQ0hBTk5FTF9PUkRFUil2YWx1ZTsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgPSAwOyAvKiByZXNldCBpbnRlcm5hbCBpbnB1dGJ1ZmZlciAqLwotICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfQUZURVJCVVJORVI6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlckFmdGVyYnVybmVyICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoISAoKHZhbHVlPT0wKSB8fCAodmFsdWU9PTEpKSApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXR0aW5ncy0+dXNlckFmdGVyYnVybmVyID0gdmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19HUkFOVUxFX0xFTkdUSDoKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyRnJhbWVsZW5ndGggIT0gdmFsdWUpIHsKLSAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgICAgICAgICBjYXNlIDEwMjQ6Ci0gICAgICAgICAgICBjYXNlIDUxMjoKLSAgICAgICAgICAgIGNhc2UgNDgwOgotICAgICAgICAgICAgICBzZXR0aW5ncy0+dXNlckZyYW1lbGVuZ3RoID0gdmFsdWU7Ci0gICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJDaGFubmVsTW9kZSAhPSAoQ0hBTk5FTF9NT0RFKXZhbHVlKSB7CisgICAgICAgIGlmICgoKENIQU5ORUxfTU9ERSl2YWx1ZSA9PSBNT0RFXzIxMikgJiYKKyAgICAgICAgICAgIChOVUxMICE9IGhBYWNFbmNvZGVyLT5oTXBzRW5jKSkgeworICAgICAgICAgIHNldHRpbmdzLT51c2VyQ2hhbm5lbE1vZGUgPSAoQ0hBTk5FTF9NT0RFKXZhbHVlOworICAgICAgICAgIHNldHRpbmdzLT5uQ2hhbm5lbHMgPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCICpwQ29uZmlnID0KKyAgICAgICAgICAgICAgRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbigoQ0hBTk5FTF9NT0RFKXZhbHVlKTsKKyAgICAgICAgICBpZiAocENvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CisgICAgICAgICAgaWYgKChwQ29uZmlnLT5uRWxlbWVudHMgPiBoQWFjRW5jb2Rlci0+bk1heEFhY0VsZW1lbnRzKSB8fAorICAgICAgICAgICAgICAocENvbmZpZy0+bkNoYW5uZWxzRWZmID4gaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscykpIHsKKyAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIHNldHRpbmdzLT51c2VyQ2hhbm5lbE1vZGUgPSAoQ0hBTk5FTF9NT0RFKXZhbHVlOworICAgICAgICAgIHNldHRpbmdzLT5uQ2hhbm5lbHMgPSBwQ29uZmlnLT5uQ2hhbm5lbHM7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgPSAwOyAvKiByZXNldCBpbnRlcm5hbCBpbnB1dGJ1ZmZlciAqLworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgICAgaWYgKCEoKHZhbHVlID49IDEpICYmICh2YWx1ZSA8PSA2KSkpIHsKKyAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1NUQVRFUzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQkFORFdJRFRIOgorICAgICAgaWYgKHNldHRpbmdzLT51c2VyQmFuZHdpZHRoICE9IHZhbHVlKSB7CisgICAgICAgIHNldHRpbmdzLT51c2VyQmFuZHdpZHRoID0gdmFsdWU7CisgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQ0hBTk5FTE9SREVSOgorICAgICAgaWYgKGhBYWNFbmNvZGVyLT5hYWNDb25maWcuY2hhbm5lbE9yZGVyICE9IChDSEFOTkVMX09SREVSKXZhbHVlKSB7CisgICAgICAgIGlmICghKCh2YWx1ZSA9PSAwKSB8fCAodmFsdWUgPT0gMSkpKSB7CisgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGhBYWNFbmNvZGVyLT5hYWNDb25maWcuY2hhbm5lbE9yZGVyID0gKENIQU5ORUxfT1JERVIpdmFsdWU7CisgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgPSAwOyAvKiByZXNldCBpbnRlcm5hbCBpbnB1dGJ1ZmZlciAqLworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9CisgICAgICAgICAgICBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19BRlRFUkJVUk5FUjoKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlckFmdGVyYnVybmVyICE9IHZhbHVlKSB7CisgICAgICAgIGlmICghKCh2YWx1ZSA9PSAwKSB8fCAodmFsdWUgPT0gMSkpKSB7CisgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNldHRpbmdzLT51c2VyQWZ0ZXJidXJuZXIgPSB2YWx1ZTsKKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUc7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19HUkFOVUxFX0xFTkdUSDoKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlckZyYW1lbGVuZ3RoICE9IHZhbHVlKSB7CisgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICBjYXNlIDEwMjQ6CisgICAgICAgICAgY2FzZSA1MTI6CisgICAgICAgICAgY2FzZSA0ODA6CisgICAgICAgICAgY2FzZSAyNTY6CisgICAgICAgICAgY2FzZSAyNDA6CisgICAgICAgICAgY2FzZSAxMjg6CisgICAgICAgICAgY2FzZSAxMjA6CisgICAgICAgICAgICBpZiAoKHZhbHVlIDw8IDEpID09IDQ4MCB8fCAodmFsdWUgPDwgMSkgPT0gNTEyKSB7CisgICAgICAgICAgICAgIHNldHRpbmdzLT51c2VyRG93bnNjYWxlRmFjdG9yID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHZhbHVlIDw8IDIpID09IDQ4MCB8fCAodmFsdWUgPDwgMikgPT0gNTEyKSB7CisgICAgICAgICAgICAgIHNldHRpbmdzLT51c2VyRG93bnNjYWxlRmFjdG9yID0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldHRpbmdzLT51c2VyRnJhbWVsZW5ndGggPSB2YWx1ZTsKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0KKyAgICAgICAgICAgICAgICBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX1NCUl9SQVRJTzoKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyU2JyUmF0aW8gIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIGlmICghICgodmFsdWU9PTApIHx8ICh2YWx1ZT09MSkgfHwgKHZhbHVlPT0yKSkgKSB7Ci0gICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXR0aW5ncy0+dXNlclNiclJhdGlvID0gdmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1NUQVRFUyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlclNiclJhdGlvICE9IHZhbHVlKSB7CisgICAgICAgIGlmICghKCh2YWx1ZSA9PSAwKSB8fCAodmFsdWUgPT0gMSkgfHwgKHZhbHVlID09IDIpKSkgeworICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJTYnJSYXRpbyA9IHZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9CisgICAgICAgICAgICBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIEFBQ0VOQ19TQlJfTU9ERToKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyU2JyRW5hYmxlZCAhPSB2YWx1ZSkgewotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJTYnJFbmFibGVkID0gdmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1NUQVRFUyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgIGlmICgoc2V0dGluZ3MtPnVzZXJTYnJFbmFibGVkICE9IHZhbHVlKSAmJgorICAgICAgICAgIChOVUxMICE9IGhBYWNFbmNvZGVyLT5oRW52RW5jKSkgeworICAgICAgICBzZXR0aW5ncy0+dXNlclNickVuYWJsZWQgPSB2YWx1ZTsKKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PQorICAgICAgICAgICAgQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfU1RBVEVTIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfVFJBTlNNVVg6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwVHlwZSAhPSAoVFJBTlNQT1JUX1RZUEUpdmFsdWUpIHsKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwVHlwZSAhPSAoVFJBTlNQT1JUX1RZUEUpdmFsdWUpIHsKKyAgICAgICAgVFJBTlNQT1JUX1RZUEUgdHlwZSA9IChUUkFOU1BPUlRfVFlQRSl2YWx1ZTsKKyAgICAgICAgVUlOVCBmbGFncyA9IGhBYWNFbmNvZGVyLT5DQVBGX3RwRW5jOwogCi0gICAgICAgICAgICBUUkFOU1BPUlRfVFlQRSAgdHlwZSAgPSAoVFJBTlNQT1JUX1RZUEUpdmFsdWU7Ci0gICAgICAgICAgICBVSU5UICAgICAgICAgICAgZmxhZ3MgPSBoQWFjRW5jb2Rlci0+Q0FQRl90cEVuYzsKLQotICAgICAgICAgICAgaWYgKCAhKCAoKHR5cGU9PVRUX01QNF9BRElGKSAgICAgICYmICAoZmxhZ3MmQ0FQRl9BRElGKSkKLSAgICAgICAgICAgICAgICAgfHwgKCh0eXBlPT1UVF9NUDRfQURUUykgICAgICAmJiAgKGZsYWdzJkNBUEZfQURUUykpCi0gICAgICAgICAgICAgICAgIHx8ICgodHlwZT09VFRfTVA0X0xBVE1fTUNQMCkgJiYgKChmbGFncyZDQVBGX0xBVE0pICYmIChmbGFncyZDQVBGX1JBV1BBQ0tFVFMpKSkKLSAgICAgICAgICAgICAgICAgfHwgKCh0eXBlPT1UVF9NUDRfTEFUTV9NQ1AxKSAmJiAoKGZsYWdzJkNBUEZfTEFUTSkgJiYgKGZsYWdzJkNBUEZfUkFXUEFDS0VUUykpKQotICAgICAgICAgICAgICAgICB8fCAoKHR5cGU9PVRUX01QNF9MT0FTKSAgICAgICYmICAoZmxhZ3MmQ0FQRl9MT0FTKSkKLSAgICAgICAgICAgICAgICAgfHwgKCh0eXBlPT1UVF9NUDRfUkFXKSAgICAgICAmJiAgKGZsYWdzJkNBUEZfUkFXUEFDS0VUUykpCi0gICAgICAgICAgICAgICAgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJUcFR5cGUgPSAoVFJBTlNQT1JUX1RZUEUpdmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgICAgaWYgKCEoKCh0eXBlID09IFRUX01QNF9BRElGKSAmJiAoZmxhZ3MgJiBDQVBGX0FESUYpKSB8fAorICAgICAgICAgICAgICAoKHR5cGUgPT0gVFRfTVA0X0FEVFMpICYmIChmbGFncyAmIENBUEZfQURUUykpIHx8CisgICAgICAgICAgICAgICgodHlwZSA9PSBUVF9NUDRfTEFUTV9NQ1AwKSAmJgorICAgICAgICAgICAgICAgKChmbGFncyAmIENBUEZfTEFUTSkgJiYgKGZsYWdzICYgQ0FQRl9SQVdQQUNLRVRTKSkpIHx8CisgICAgICAgICAgICAgICgodHlwZSA9PSBUVF9NUDRfTEFUTV9NQ1AxKSAmJgorICAgICAgICAgICAgICAgKChmbGFncyAmIENBUEZfTEFUTSkgJiYgKGZsYWdzICYgQ0FQRl9SQVdQQUNLRVRTKSkpIHx8CisgICAgICAgICAgICAgICgodHlwZSA9PSBUVF9NUDRfTE9BUykgJiYgKGZsYWdzICYgQ0FQRl9MT0FTKSkgfHwKKyAgICAgICAgICAgICAgKCh0eXBlID09IFRUX01QNF9SQVcpICYmIChmbGFncyAmIENBUEZfUkFXUEFDS0VUUykpKSkgeworICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJUcFR5cGUgPSAoVFJBTlNQT1JUX1RZUEUpdmFsdWU7CisgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfU0lHTkFMSU5HX01PREU6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwU2lnbmFsaW5nICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoICEoKHZhbHVlPT0wKSB8fCAodmFsdWU9PTEpIHx8ICh2YWx1ZT09MikpICkgewotICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldHRpbmdzLT51c2VyVHBTaWduYWxpbmcgPSB2YWx1ZTsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyVHBTaWduYWxpbmcgIT0gdmFsdWUpIHsKKyAgICAgICAgaWYgKCEoKHZhbHVlID09IDApIHx8ICh2YWx1ZSA9PSAxKSB8fCAodmFsdWUgPT0gMikpKSB7CisgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBzZXR0aW5ncy0+dXNlclRwU2lnbmFsaW5nID0gdmFsdWU7CisgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfUFJPVEVDVElPTjoKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyVHBQcm90ZWN0aW9uICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoICEoKHZhbHVlPT0wKSB8fCAodmFsdWU9PTEpKSApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXR0aW5ncy0+dXNlclRwUHJvdGVjdGlvbiA9IHZhbHVlOwotICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJUcFByb3RlY3Rpb24gIT0gdmFsdWUpIHsKKyAgICAgICAgaWYgKCEoKHZhbHVlID09IDApIHx8ICh2YWx1ZSA9PSAxKSkpIHsKKyAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgIHNldHRpbmdzLT51c2VyVHBQcm90ZWN0aW9uID0gdmFsdWU7CisgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfSEVBREVSX1BFUklPRDoKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyVHBIZWFkZXJQZXJpb2QgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHNldHRpbmdzLT51c2VyVHBIZWFkZXJQZXJpb2QgPSB2YWx1ZTsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyVHBIZWFkZXJQZXJpb2QgIT0gdmFsdWUpIHsKKyAgICAgICAgaWYgKCEoKChJTlQpdmFsdWUgPj0gMCkgJiYgKHZhbHVlIDw9IDI1NSkpKSB7CisgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBzZXR0aW5ncy0+dXNlclRwSGVhZGVyUGVyaW9kID0gdmFsdWU7CisgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfQVVESU9NVVhWRVI6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwQW14diAhPSB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKCAhKCh2YWx1ZT09MCkgfHwgKHZhbHVlPT0xKSB8fCAodmFsdWU9PTIpKSApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXR0aW5ncy0+dXNlclRwQW14diA9IHZhbHVlOwotICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJUcEFteHYgIT0gdmFsdWUpIHsKKyAgICAgICAgaWYgKCEoKHZhbHVlID09IDApIHx8ICh2YWx1ZSA9PSAxKSB8fCAodmFsdWUgPT0gMikpKSB7CisgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBzZXR0aW5ncy0+dXNlclRwQW14diA9IHZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX1RQU1VCRlJBTUVTOgotICAgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJUcE5zdWJGcmFtZXMgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIGlmICghICggKHZhbHVlPj0xKSAmJiAodmFsdWU8PTQpICkgKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJUcE5zdWJGcmFtZXMgPSB2YWx1ZTsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyVHBOc3ViRnJhbWVzICE9IHZhbHVlKSB7CisgICAgICAgIGlmICghKCh2YWx1ZSA+PSAxKSAmJiAodmFsdWUgPD0gNCkpKSB7CisgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBzZXR0aW5ncy0+dXNlclRwTnN1YkZyYW1lcyA9IHZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX0FOQ0lMTEFSWV9CSVRSQVRFOgotICAgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJBbmNEYXRhUmF0ZSAhPSB2YWx1ZSkgewotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJBbmNEYXRhUmF0ZSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyQW5jRGF0YVJhdGUgIT0gdmFsdWUpIHsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJBbmNEYXRhUmF0ZSA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfQ09OVFJPTF9TVEFURToKLSAgICAgICAgaWYgKGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSZBQUNFTkNfUkVTRVRfSU5CVUZGRVIpIHsKLSAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgPSB2YWx1ZTsKKyAgICAgIGlmIChoQWFjRW5jb2Rlci0+SW5pdEZsYWdzICE9IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSAmIEFBQ0VOQ19SRVNFVF9JTkJVRkZFUikgeworICAgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgPSAwOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzID0gdmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9NT0RFOgotICAgICAgICBpZiAoKFVJTlQpc2V0dGluZ3MtPnVzZXJNZXRhRGF0YU1vZGUgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIGlmICggISgoKElOVCl2YWx1ZT49MCkgJiYgKChJTlQpdmFsdWU8PTIpKSApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXR0aW5ncy0+dXNlck1ldGFEYXRhTW9kZSA9IHZhbHVlOwotICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUc7CisgICAgICBpZiAoKFVJTlQpc2V0dGluZ3MtPnVzZXJNZXRhRGF0YU1vZGUgIT0gdmFsdWUpIHsKKyAgICAgICAgaWYgKCEoKChJTlQpdmFsdWUgPj0gMCkgJiYgKChJTlQpdmFsdWUgPD0gMykpKSB7CisgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBzZXR0aW5ncy0+dXNlck1ldGFEYXRhTW9kZSA9IHZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX1BFQUtfQklUUkFURToKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyUGVha0JpdHJhdGUgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHNldHRpbmdzLT51c2VyUGVha0JpdHJhdGUgPSB2YWx1ZTsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyUGVha0JpdHJhdGUgIT0gdmFsdWUpIHsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJQZWFrQml0cmF0ZSA9IHZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBlcnIgPSBBQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSOwogICAgICAgYnJlYWs7Ci0gICAgfSAgLyogc3dpdGNoKHBhcmFtKSAqLworICB9IC8qIHN3aXRjaChwYXJhbSkgKi8KIAogYmFpbDoKLSAgICByZXR1cm4gZXJyOworICByZXR1cm4gZXJyOwogfQogCi1VSU5UIGFhY0VuY29kZXJfR2V0UGFyYW0oCi0gICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19QQVJBTSAgICAgICAgcGFyYW0KLSAgICAgICAgKQotewotICAgIFVJTlQgdmFsdWUgPSAwOwotICAgIFVTRVJfUEFSQU0gKnNldHRpbmdzID0gJmhBYWNFbmNvZGVyLT5leHRQYXJhbTsKK1VJTlQgYWFjRW5jb2Rlcl9HZXRQYXJhbShjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQUNFTkNfUEFSQU0gcGFyYW0pIHsKKyAgVUlOVCB2YWx1ZSA9IDA7CisgIFVTRVJfUEFSQU0gKnNldHRpbmdzID0gJmhBYWNFbmNvZGVyLT5leHRQYXJhbTsKIAotICAgIC8qIGNoZWNrIGVuY29kZXIgaGFuZGxlICovCi0gICAgaWYgKGhBYWNFbmNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KKyAgLyogY2hlY2sgZW5jb2RlciBoYW5kbGUgKi8KKyAgaWYgKGhBYWNFbmNvZGVyID09IE5VTEwpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KIAotICAgIC8qIGFwcGx5IHBhcmFtIHZhbHVlICovCi0gICAgc3dpdGNoIChwYXJhbSkKLSAgICB7CisgIC8qIGFwcGx5IHBhcmFtIHZhbHVlICovCisgIHN3aXRjaCAocGFyYW0pIHsKICAgICBjYXNlIEFBQ0VOQ19BT1Q6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5hdWRpb09iamVjdFR5cGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX0JJVFJBVEU6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpKChoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmJpdHJhdGVNb2RlPT1BQUNFTkNfQlJfTU9ERV9DQlIpID8gaEFhY0VuY29kZXItPmFhY0NvbmZpZy5iaXRSYXRlIDogLTEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19CSVRSQVRFTU9ERToKLSAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmJpdHJhdGVNb2RlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19TQU1QTEVSQVRFOgotICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5jb2RlckNvbmZpZy5leHRTYW1wbGluZ1JhdGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX0NIQU5ORUxNT0RFOgotICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuY2hhbm5lbE1vZGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX0JBTkRXSURUSDoKLSAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmJhbmRXaWR0aDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfQ0hBTk5FTE9SREVSOgotICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuY2hhbm5lbE9yZGVyOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19BRlRFUkJVUk5FUjoKLSAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLnVzZVJlcXVhbnQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX0dSQU5VTEVfTEVOR1RIOgotICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuZnJhbWVsZW5ndGg7Ci0gICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfU0JSX1JBVElPOgotICAgICAgICB2YWx1ZSA9IGlzU2JyQWN0aXZlKCZoQWFjRW5jb2Rlci0+YWFjQ29uZmlnKSA/IGhBYWNFbmNvZGVyLT5hYWNDb25maWcuc2JyUmF0aW8gOiAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19TQlJfTU9ERToKLSAgICAgICAgdmFsdWUgPSAoVUlOVCkgKGhBYWNFbmNvZGVyLT5hYWNDb25maWcuc3ludGF4RmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgPyAxIDogMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfVFJBTlNNVVg6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpc2V0dGluZ3MtPnVzZXJUcFR5cGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX1NJR05BTElOR19NT0RFOgotICAgICAgICB2YWx1ZSA9IChVSU5UKWdldFNiclNpZ25hbGluZ01vZGUoaEFhY0VuY29kZXItPmFhY0NvbmZpZy5hdWRpb09iamVjdFR5cGUsIHNldHRpbmdzLT51c2VyVHBUeXBlLCBzZXR0aW5ncy0+dXNlclRwU2lnbmFsaW5nLCBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLnNiclJhdGlvKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfUFJPVEVDVElPTjoKLSAgICAgICAgdmFsdWUgPSAoVUlOVClzZXR0aW5ncy0+dXNlclRwUHJvdGVjdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfSEVBREVSX1BFUklPRDoKLSAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+Y29kZXJDb25maWcuaGVhZGVyUGVyaW9kOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19BVURJT01VWFZFUjoKLSAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmF1ZGlvTXV4VmVyc2lvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfVFBTVUJGUkFNRVM6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpc2V0dGluZ3MtPnVzZXJUcE5zdWJGcmFtZXM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX0FOQ0lMTEFSWV9CSVRSQVRFOgotICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuYW5jX1JhdGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX0NPTlRST0xfU1RBVEU6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPkluaXRGbGFnczsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfTU9ERToKLSAgICAgICAgdmFsdWUgPSAoaEFhY0VuY29kZXItPm1ldGFEYXRhQWxsb3dlZD09MCkgPyAwIDogKFVJTlQpc2V0dGluZ3MtPnVzZXJNZXRhRGF0YU1vZGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX1BFQUtfQklUUkFURToKLSAgICAgICAgdmFsdWUgPSAoVUlOVCktMTsgLyogcGVhayBiaXRyYXRlIHBhcmFtZXRlciBpcyBtZWFuaW5nbGVzcyAqLwotICAgICAgICBpZiAoICgoSU5UKWhBYWNFbmNvZGVyLT5leHRQYXJhbS51c2VyUGVha0JpdHJhdGUhPS0xKSApIHsKLSAgICAgICAgICB2YWx1ZSA9IChVSU5UKShmTWF4KChJTlQpaEFhY0VuY29kZXItPmV4dFBhcmFtLnVzZXJQZWFrQml0cmF0ZSwgaEFhY0VuY29kZXItPmFhY0NvbmZpZy5iaXRSYXRlKSk7IC8qIHBlYWsgYml0cmF0ZSBwYXJhbWV0ZXIgaXMgaW4gdXNlICovCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8vZXJyID0gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmF1ZGlvT2JqZWN0VHlwZTsKICAgICAgIGJyZWFrOwotICAgIH0gIC8qIHN3aXRjaChwYXJhbSkgKi8KKyAgICBjYXNlIEFBQ0VOQ19CSVRSQVRFOgorICAgICAgc3dpdGNoIChoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmJpdHJhdGVNb2RlKSB7CisgICAgICAgIGNhc2UgQUFDRU5DX0JSX01PREVfQ0JSOgorICAgICAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5iaXRSYXRlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHZhbHVlID0gKFVJTlQpLTE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CSVRSQVRFTU9ERToKKyAgICAgIHZhbHVlID0gKFVJTlQpKChoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmJpdHJhdGVNb2RlICE9IEFBQ0VOQ19CUl9NT0RFX0ZGKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gaEFhY0VuY29kZXItPmFhY0NvbmZpZy5iaXRyYXRlTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgIDogQUFDRU5DX0JSX01PREVfQ0JSKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX1NBTVBMRVJBVEU6CisgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5jb2RlckNvbmZpZy5leHRTYW1wbGluZ1JhdGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19DSEFOTkVMTU9ERToKKyAgICAgIGlmICgoTU9ERV8xID09IGhBYWNFbmNvZGVyLT5hYWNDb25maWcuY2hhbm5lbE1vZGUpICYmCisgICAgICAgICAgKGhBYWNFbmNvZGVyLT5hYWNDb25maWcuc3ludGF4RmxhZ3MgJiBBQ19MRF9NUFMpKSB7CisgICAgICAgIHZhbHVlID0gTU9ERV8yMTI7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuY2hhbm5lbE1vZGU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CQU5EV0lEVEg6CisgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuYmFuZFdpZHRoOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQ0hBTk5FTE9SREVSOgorICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmNoYW5uZWxPcmRlcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0FGVEVSQlVSTkVSOgorICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLnVzZVJlcXVhbnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19HUkFOVUxFX0xFTkdUSDoKKyAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5mcmFtZWxlbmd0aDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX1NCUl9SQVRJTzoKKyAgICAgIHZhbHVlID0gaXNTYnJBY3RpdmUoJmhBYWNFbmNvZGVyLT5hYWNDb25maWcpCisgICAgICAgICAgICAgICAgICA/IGhBYWNFbmNvZGVyLT5hYWNDb25maWcuc2JyUmF0aW8KKyAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX1NCUl9NT0RFOgorICAgICAgdmFsdWUgPQorICAgICAgICAgIChVSU5UKShoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLnN5bnRheEZsYWdzICYgQUNfU0JSX1BSRVNFTlQpID8gMSA6IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19UUkFOU01VWDoKKyAgICAgIHZhbHVlID0gKFVJTlQpc2V0dGluZ3MtPnVzZXJUcFR5cGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19TSUdOQUxJTkdfTU9ERToKKyAgICAgIHZhbHVlID0gKFVJTlQpZ2V0U2JyU2lnbmFsaW5nTW9kZSgKKyAgICAgICAgICBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmF1ZGlvT2JqZWN0VHlwZSwgc2V0dGluZ3MtPnVzZXJUcFR5cGUsCisgICAgICAgICAgc2V0dGluZ3MtPnVzZXJUcFNpZ25hbGluZywgaEFhY0VuY29kZXItPmFhY0NvbmZpZy5zYnJSYXRpbyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19QUk9URUNUSU9OOgorICAgICAgdmFsdWUgPSAoVUlOVClzZXR0aW5ncy0+dXNlclRwUHJvdGVjdGlvbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0hFQURFUl9QRVJJT0Q6CisgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5jb2RlckNvbmZpZy5oZWFkZXJQZXJpb2Q7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19BVURJT01VWFZFUjoKKyAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5hdWRpb011eFZlcnNpb247CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19UUFNVQkZSQU1FUzoKKyAgICAgIHZhbHVlID0gKFVJTlQpc2V0dGluZ3MtPnVzZXJUcE5zdWJGcmFtZXM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19BTkNJTExBUllfQklUUkFURToKKyAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5hbmNfUmF0ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0NPTlRST0xfU1RBVEU6CisgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5Jbml0RmxhZ3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9NT0RFOgorICAgICAgdmFsdWUgPSAoaEFhY0VuY29kZXItPm1ldGFEYXRhQWxsb3dlZCA9PSAwKQorICAgICAgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgICAgICA6IChVSU5UKXNldHRpbmdzLT51c2VyTWV0YURhdGFNb2RlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfUEVBS19CSVRSQVRFOgorICAgICAgdmFsdWUgPSAoVUlOVCktMTsgLyogcGVhayBiaXRyYXRlIHBhcmFtZXRlciBpcyBtZWFuaW5nbGVzcyAqLworICAgICAgaWYgKCgoSU5UKWhBYWNFbmNvZGVyLT5leHRQYXJhbS51c2VyUGVha0JpdHJhdGUgIT0gLTEpKSB7CisgICAgICAgIHZhbHVlID0KKyAgICAgICAgICAgIChVSU5UKShmTWF4KChJTlQpaEFhY0VuY29kZXItPmV4dFBhcmFtLnVzZXJQZWFrQml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5hYWNDb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYml0UmF0ZSkpOyAvKiBwZWFrIGJpdHJhdGUgcGFyYW1ldGVyIGlzIGluIHVzZSAqLworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLy8gZXJyID0gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgYnJlYWs7CisgIH0gLyogc3dpdGNoKHBhcmFtKSAqLwogCiBiYWlsOgotICAgIHJldHVybiB2YWx1ZTsKKyAgcmV0dXJuIHZhbHVlOwogfQogCi1BQUNFTkNfRVJST1IgYWFjRW5jSW5mbygKLSAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgICBoQWFjRW5jb2RlciwKLSAgICAgICAgQUFDRU5DX0luZm9TdHJ1Y3QgICAgICAgICpwSW5mbwotICAgICAgICApCi17Ci0gICAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKK0FBQ0VOQ19FUlJPUiBhYWNFbmNJbmZvKGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0luZm9TdHJ1Y3QgKnBJbmZvKSB7CisgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7CiAKLSAgICBGREttZW1jbGVhcihwSW5mbywgc2l6ZW9mKEFBQ0VOQ19JbmZvU3RydWN0KSk7Ci0gICAgcEluZm8tPmNvbmZTaXplID0gNjQ7IC8qIHByZS1pbml0aWFsaXplICovCisgIEZES21lbWNsZWFyKHBJbmZvLCBzaXplb2YoQUFDRU5DX0luZm9TdHJ1Y3QpKTsKKyAgcEluZm8tPmNvbmZTaXplID0gNjQ7IC8qIHByZS1pbml0aWFsaXplICovCiAKLSAgICBwSW5mby0+bWF4T3V0QnVmQnl0ZXMgICAgPSAoKGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMqNjE0NCkrNyk+PjM7Ci0gICAgcEluZm8tPm1heEFuY0J5dGVzICAgICAgID0gaEFhY0VuY29kZXItPmFhY0NvbmZpZy5tYXhBbmNCeXRlc1BlckFVOwotICAgIHBJbmZvLT5pbkJ1ZkZpbGxMZXZlbCAgICA9IGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQvaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVsczsKLSAgICBwSW5mby0+aW5wdXRDaGFubmVscyAgICAgPSBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0ubkNoYW5uZWxzOwotICAgIHBJbmZvLT5mcmFtZUxlbmd0aCAgICAgICA9IGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZC9oQWFjRW5jb2Rlci0+ZXh0UGFyYW0ubkNoYW5uZWxzOwotICAgIHBJbmZvLT5lbmNvZGVyRGVsYXkgICAgICA9IGhBYWNFbmNvZGVyLT5uRGVsYXkvaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVsczsKKyAgcEluZm8tPm1heE91dEJ1ZkJ5dGVzID0gKChoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzICogNjE0NCkgKyA3KSA+PiAzOworICBwSW5mby0+bWF4QW5jQnl0ZXMgPSBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLm1heEFuY0J5dGVzUGVyQVU7CisgIHBJbmZvLT5pbkJ1ZkZpbGxMZXZlbCA9CisgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkIC8gaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVsczsKKyAgcEluZm8tPmlucHV0Q2hhbm5lbHMgPSBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0ubkNoYW5uZWxzOworICBwSW5mby0+ZnJhbWVMZW5ndGggPQorICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzVG9SZWFkIC8gaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVsczsKKyAgcEluZm8tPm5EZWxheSA9IGhBYWNFbmNvZGVyLT5uRGVsYXk7CisgIHBJbmZvLT5uRGVsYXlDb3JlID0gaEFhY0VuY29kZXItPm5EZWxheUNvcmU7CiAKLSAgICAvKiBHZXQgZW5jb2RlciBjb25maWd1cmF0aW9uICovCi0gICAgaWYgKCBhYWNFbmNHZXRDb25mKGhBYWNFbmNvZGVyLCAmcEluZm8tPmNvbmZTaXplLCAmcEluZm8tPmNvbmZCdWZbMF0pICE9IEFBQ19FTkNfT0spIHsKLSAgICAgICAgZXJyID0gQUFDRU5DX0lOSVRfRVJST1I7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9CisgIC8qIEdldCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgaWYgKGFhY0VuY0dldENvbmYoaEFhY0VuY29kZXIsICZwSW5mby0+Y29uZlNpemUsICZwSW5mby0+Y29uZkJ1ZlswXSkgIT0KKyAgICAgIEFBQ19FTkNfT0spIHsKKyAgICBlcnIgPSBBQUNFTkNfSU5JVF9FUlJPUjsKKyAgICBnb3RvIGJhaWw7CisgIH0KIGJhaWw6Ci0gICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIGVycjsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hYWNlbmNfcG5zLmNwcCBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Bucy5jcHAKaW5kZXggYjk2NDBkOS4uZjA1NzFkNiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hYWNlbmNfcG5zLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2FhY2VuY19wbnMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQzICs5MCwzNyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBMb2h3YXNzZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBwbnMuYworICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogcG5zLmMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImFhY2VuY19wbnMuaCIKKwogI2luY2x1ZGUgInBzeV9kYXRhLmgiCiAjaW5jbHVkZSAicG5zcGFyYW0uaCIKICNpbmNsdWRlICJub2lzZWRldC5oIgogI2luY2x1ZGUgImJpdF9jbnQuaCIKICNpbmNsdWRlICJpbnRlcmZhY2UuaCIKIAotCiAvKiBtaW5Db3JyZWxhdGlvbkVuZXJneSA9ICgxLjBlLTEwZileMiB+IDJeLTY3ID0gMl4tNDcgKiAyXi0yMCAqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMIG1pbkNvcnJlbGF0aW9uRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC4wKTsgLyogRkwyRlhDT05TVF9EQkwoKGZsb2F0KUZES3BvdygyLjAsLTQ3KSk7ICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbWluQ29ycmVsYXRpb25FbmVyZ3kgPQorICAgIEZMMkZYQ09OU1RfREJMKDAuMCk7IC8qIEZMMkZYQ09OU1RfREJMKChmbG9hdClGREtwb3coMi4wLC00NykpOyAqLwogLyogbm9pc2VDb3JyZWxhdGlvblRocmVzaCA9IDAuNl4yICovCiBzdGF0aWMgY29uc3QgRklYUF9EQkwgbm9pc2VDb3JyZWxhdGlvblRocmVzaCA9IEZMMkZYQ09OU1RfREJMKDAuMzYpOwogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX25vaXNlRGV0ZWN0aW9uKCBQTlNfQ09ORklHICAqcG5zQ29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgdG5zT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgdG5zUHJlZGljdGlvbkdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgdG5zQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKnNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICAqc2ZidG9uYWxpdHkgKTsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19GREthYWNFbmNfbm9pc2VEZXRlY3Rpb24oCisgICAgUE5TX0NPTkZJRyAqcG5zQ29uZiwgUE5TX0RBVEEgKnBuc0RhdGEsIGNvbnN0IElOVCBzZmJBY3RpdmUsCisgICAgY29uc3QgSU5UICpzZmJPZmZzZXQsIElOVCB0bnNPcmRlciwgSU5UIHRuc1ByZWRpY3Rpb25HYWluLCBJTlQgdG5zQWN0aXZlLAorICAgIEZJWFBfREJMICptZGN0U3BlY3RydW0sIElOVCAqc2ZiTWF4U2NhbGVTcGVjLCBGSVhQX1NHTCAqc2ZidG9uYWxpdHkpOwogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY05vaXNlTnJncyggY29uc3QgSU5UICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKnBuc0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqc2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKm5vaXNlTnJnICk7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY05vaXNlTnJncyhjb25zdCBJTlQgc2ZiQWN0aXZlLCBJTlQgKnBuc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRW5lcmd5TGREYXRhLCBJTlQgKm5vaXNlTnJnKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKQEAgLTEyOSwyOCArMTM0LDE1IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFBuc0NvbmZpZ3VyYXRpb24oUE5TX0NPTkZJRyAqcG5zQ29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgdXNlUG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbnVtQ2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBpc0xDKQoteworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRQbnNDb25maWd1cmF0aW9uKAorICAgIFBOU19DT05GSUcgKnBuc0NvbmYsIElOVCBiaXRSYXRlLCBJTlQgc2FtcGxlUmF0ZSwgSU5UIHVzZVBucywgSU5UIHNmYkNudCwKKyAgICBjb25zdCBJTlQgKnNmYk9mZnNldCwgY29uc3QgSU5UIG51bUNoYW4sIGNvbnN0IElOVCBpc0xDKSB7CiAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwogCiAgIC8qIGluaXQgbm9pc2UgZGV0ZWN0aW9uICovCi0gIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0dldFBuc1BhcmFtKCZwbnNDb25mLT5ucCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VQbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTEMpOwotICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0dldFBuc1BhcmFtKCZwbnNDb25mLT5ucCwgYml0UmF0ZSwgc2FtcGxlUmF0ZSwgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsICZ1c2VQbnMsIG51bUNoYW4sIGlzTEMpOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgcmV0dXJuIEVycm9yU3RhdHVzOwogCiAgIHBuc0NvbmYtPm1pbkNvcnJlbGF0aW9uRW5lcmd5ID0gbWluQ29ycmVsYXRpb25FbmVyZ3k7CiAgIHBuc0NvbmYtPm5vaXNlQ29ycmVsYXRpb25UaHJlc2ggPSBub2lzZUNvcnJlbGF0aW9uVGhyZXNoOwpAQCAtMTYwLDggKzE1Miw2IEBACiAgIHJldHVybiBBQUNfRU5DX09LOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19QbnNEZXRlY3QKQEAgLTE4MCw3MyArMTcwLDU1IEBACiAgICAgb3V0cHV0OiAgICAgICBwbnNGbGFnIGluIHBucyBkYXRhIHN0cnVjdHVyZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRkRLYWFjRW5jX1Buc0RldGVjdChQTlNfQ09ORklHICAqcG5zQ29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgbGFzdFdpbmRvd1NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpzZmJUaHJlc2hvbGRMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgKnNmYnRvbmFsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICB0bnNPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgdG5zUHJlZGljdGlvbkdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgIHRuc0FjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqc2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpub2lzZU5yZyApCit2b2lkIEZES2FhY0VuY19QbnNEZXRlY3QoUE5TX0NPTkZJRyAqcG5zQ29uZiwgUE5TX0RBVEEgKnBuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGxhc3RXaW5kb3dTZXF1ZW5jZSwgY29uc3QgSU5UIHNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWF4U2ZiUGVyR3JvdXAsIEZJWFBfREJMICpzZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpzZmJPZmZzZXQsIEZJWFBfREJMICptZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzZmJNYXhTY2FsZVNwZWMsIEZJWFBfU0dMICpzZmJ0b25hbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdG5zT3JkZXIsIElOVCB0bnNQcmVkaWN0aW9uR2FpbiwgSU5UIHRuc0FjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRW5lcmd5TGREYXRhLCBJTlQgKm5vaXNlTnJnKQogCiB7CiAgIGludCBzZmI7CiAgIGludCBzdGFydE5vaXNlU2ZiOwogCi0gIGlmIChwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIElTX0xPV19DT01MRVhJVFkpIHsKLSAgICBpZiAoICghcG5zQ29uZi0+dXNlUG5zKSB8fCAgICAgICAgICAgICAgLyogcG5zIGVuYWJsZWQ/ICovCi0gICAgICAgICAgIChsYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSApIC8qIGN1cnJlbnRseSBvbmx5IGxvbmcgYmxvY2tzICovCi0gICAgewotICAgICAgRkRLbWVtY2xlYXIocG5zRGF0YS0+cG5zRmxhZywgTUFYX0dST1VQRURfU0ZCKnNpemVvZihJTlQpKTsgLyogY2xlYXIgYWxsIHBuc0ZsYWdzICovCi0gICAgICBmb3IgKHNmYj0wOyBzZmI8TUFYX0dST1VQRURfU0ZCOyBzZmIrKykgewotICAgICAgICAgIG5vaXNlTnJnW3NmYl0gPSBOT19OT0lTRV9QTlM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgbnJnJ3Mgb2YgcHJldmlvdXMgZnJhbWUgKi8KLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9CisgIC8qIFJlc2V0IHBucyBpbmZvLiAqLworICBGREttZW1jbGVhcihwbnNEYXRhLT5wbnNGbGFnLCBzaXplb2YocG5zRGF0YS0+cG5zRmxhZykpOworICBmb3IgKHNmYiA9IDA7IHNmYiA8IE1BWF9HUk9VUEVEX1NGQjsgc2ZiKyspIHsKKyAgICBub2lzZU5yZ1tzZmJdID0gTk9fTk9JU0VfUE5TOwogICB9Ci0gIGVsc2UgewotICAgIGlmKCFwbnNDb25mLT51c2VQbnMpCi0gICAgICByZXR1cm47CiAKLSAgICAvKiBQTlMgb25seSBmb3IgbG9uZyBXaW5kb3dzICovCi0gICAgaWYgKHBuc0NvbmYtPm5wLmRldGVjdGlvbkFsZ29yaXRobUZsYWdzICYgSlVTVF9MT05HX1dJTkRPVykgewotICAgICAgaWYobGFzdFdpbmRvd1NlcXVlbmNlICE9IExPTkdfV0lORE9XKSB7Ci0gICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgewotICAgICAgICAgIHBuc0RhdGEtPnBuc0ZsYWdbc2ZiXSA9IDA7ICAgIC8qIGNsZWFyIGFsbCBwbnNGbGFncyAqLwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KKyAgLyogRGlzYWJsZSBQTlMgYW5kIHNraXAgZGV0ZWN0aW9uIGluIGNlcnRhaW4gY2FzZXMuICovCisgIGlmIChwbnNDb25mLT51c2VQbnMgPT0gMCkgeworICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKyAgICAvKiBBQUMgLSBMQyBjb3JlIGVuY29kZXIgKi8KKyAgICBpZiAoKHBuc0NvbmYtPm5wLmRldGVjdGlvbkFsZ29yaXRobUZsYWdzICYgSVNfTE9XX0NPTVBMRVhJVFkpICYmCisgICAgICAgIChsYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBBQUMgLSAoRSlMRCBjb3JlIGVuY29kZXIgKi8KKyAgICBpZiAoIShwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIElTX0xPV19DT01QTEVYSVRZKSAmJgorICAgICAgICAocG5zQ29uZi0+bnAuZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBKVVNUX0xPTkdfV0lORE9XKSAmJgorICAgICAgICAobGFzdFdpbmRvd1NlcXVlbmNlICE9IExPTkdfV0lORE9XKSkgeworICAgICAgcmV0dXJuOwogICAgIH0KICAgfQorCiAgIC8qCiAgICAgY2FsbCBub2lzZSBkZXRlY3Rpb24KICAgKi8KLSAgRkRLYWFjRW5jX0ZES2FhY0VuY19ub2lzZURldGVjdGlvbiggcG5zQ29uZiwKLSAgICAgICAgICAgICAgICAgIHBuc0RhdGEsCi0gICAgICAgICAgICAgICAgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICB0bnNPcmRlciwKLSAgICAgICAgICAgICAgICAgIHRuc1ByZWRpY3Rpb25HYWluLAotICAgICAgICAgICAgICAgICAgdG5zQWN0aXZlLAotICAgICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICAgICAgICAgICAgc2ZidG9uYWxpdHkgKTsKKyAgRkRLYWFjRW5jX0ZES2FhY0VuY19ub2lzZURldGVjdGlvbigKKyAgICAgIHBuc0NvbmYsIHBuc0RhdGEsIHNmYkFjdGl2ZSwgc2ZiT2Zmc2V0LCB0bnNPcmRlciwgdG5zUHJlZGljdGlvbkdhaW4sCisgICAgICB0bnNBY3RpdmUsIG1kY3RTcGVjdHJ1bSwgc2ZiTWF4U2NhbGVTcGVjLCBzZmJ0b25hbGl0eSk7CiAKICAgLyogc2V0IHN0YXJ0Tm9pc2VTZmIgKGxvbmcpICovCiAgIHN0YXJ0Tm9pc2VTZmIgPSBwbnNDb25mLT5ucC5zdGFydFNmYjsKIAogICAvKiBTZXQgbm9pc2Ugc3Vic3RpdHV0aW9uIHN0YXR1cyAqLwotICBmb3Ioc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgewotCisgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgewogICAgIC8qIE5vIFBOUyBiZWxvdyBzdGFydE5vaXNlU2ZiICovCi0gICAgaWYoc2ZiIDwgc3RhcnROb2lzZVNmYil7CisgICAgaWYgKHNmYiA8IHN0YXJ0Tm9pc2VTZmIpIHsKICAgICAgIHBuc0RhdGEtPnBuc0ZsYWdbc2ZiXSA9IDA7CiAgICAgICBjb250aW51ZTsKICAgICB9CkBAIC0yNTgsMTcgKzIzMCwxNyBAQAogICAgICAgc2lnbmFsIGluIGNvZGVyIGJhbmQgaXMgbm90IG1hc2tlZAogICAgICovCiAKLSAgICBpZigocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmVbc2ZiXSA+IEZMMkZYQ09OU1RfU0dMKDAuNSkpICYmCi0gICAgICAgKCAoc2ZiVGhyZXNob2xkTGREYXRhW3NmYl0gKyBGTDJGWENPTlNUX0RCTCgwLjU4NDk2MjVmLzY0LjBmKSkgIC8qIHRociAqIDEuNSA9IHRockxkICtsZCgxLjUpLzY0ICovCi0gICAgICAgICA8IHNmYkVuZXJneUxkRGF0YVtzZmJdICkgKQotICAgIHsKKyAgICBpZiAoKHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlW3NmYl0gPiBGTDJGWENPTlNUX1NHTCgwLjUpKSAmJgorICAgICAgICAoKHNmYlRocmVzaG9sZExkRGF0YVtzZmJdICsKKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjU4NDk2MjVmIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICA2NC4wZikpIC8qIHRociAqIDEuNSA9IHRockxkICtsZCgxLjUpLzY0ICovCisgICAgICAgICA8IHNmYkVuZXJneUxkRGF0YVtzZmJdKSkgewogICAgICAgLyoKICAgICAgICAgbWFyayBpbiBwc3lvdXQgZmxhZyBhcnJheSB0aGF0IHdlIHdpbGwgY29kZQogICAgICAgICB0aGlzIGJhbmQgd2l0aCBQTlMKICAgICAgICovCiAgICAgICBwbnNEYXRhLT5wbnNGbGFnW3NmYl0gPSAxOyAvKiBQTlNfT04gKi8KLSAgICB9Ci0gICAgZWxzZXsKKyAgICB9IGVsc2UgewogICAgICAgcG5zRGF0YS0+cG5zRmxhZ1tzZmJdID0gMDsgLyogUE5TX09GRiAqLwogICAgIH0KIApAQCAtMjc2LDUwICsyNDgsNDkgQEAKICAgfQogCiAgIC8qIGF2b2lkIFBOUyBob2xlcyAqLwotICBpZigocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmVbMF0+RkwyRlhDT05TVF9TR0woMC41ZikpICYmIChwbnNEYXRhLT5wbnNGbGFnWzFdKSkgeworICBpZiAoKHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlWzBdID4gRkwyRlhDT05TVF9TR0woMC41ZikpICYmCisgICAgICAocG5zRGF0YS0+cG5zRmxhZ1sxXSkpIHsKICAgICBwbnNEYXRhLT5wbnNGbGFnWzBdID0gMTsKICAgfQogCi0gIGZvcihzZmI9MTsgc2ZiPG1heFNmYlBlckdyb3VwLTE7IHNmYisrKSB7Ci0gICAgaWYoKHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlW3NmYl0+cG5zQ29uZi0+bnAuZ2FwRmlsbFRocikgJiYKLSAgICAgICAocG5zRGF0YS0+cG5zRmxhZ1tzZmItMV0pICYmIChwbnNEYXRhLT5wbnNGbGFnW3NmYisxXSkpIHsKKyAgZm9yIChzZmIgPSAxOyBzZmIgPCBtYXhTZmJQZXJHcm91cCAtIDE7IHNmYisrKSB7CisgICAgaWYgKChwbnNEYXRhLT5ub2lzZUZ1enp5TWVhc3VyZVtzZmJdID4gcG5zQ29uZi0+bnAuZ2FwRmlsbFRocikgJiYKKyAgICAgICAgKHBuc0RhdGEtPnBuc0ZsYWdbc2ZiIC0gMV0pICYmIChwbnNEYXRhLT5wbnNGbGFnW3NmYiArIDFdKSkgewogICAgICAgcG5zRGF0YS0+cG5zRmxhZ1tzZmJdID0gMTsKICAgICB9CiAgIH0KIAotICBpZihtYXhTZmJQZXJHcm91cD4wKSB7CisgIGlmIChtYXhTZmJQZXJHcm91cCA+IDApIHsKICAgICAvKiBhdm9pZCBQTlMgaG9sZSAqLwotICAgIGlmKChwbnNEYXRhLT5ub2lzZUZ1enp5TWVhc3VyZVttYXhTZmJQZXJHcm91cC0xXT5wbnNDb25mLT5ucC5nYXBGaWxsVGhyKSAmJiAocG5zRGF0YS0+cG5zRmxhZ1ttYXhTZmJQZXJHcm91cC0yXSkpIHsKLSAgICAgIHBuc0RhdGEtPnBuc0ZsYWdbbWF4U2ZiUGVyR3JvdXAtMV0gPSAxOworICAgIGlmICgocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmVbbWF4U2ZiUGVyR3JvdXAgLSAxXSA+CisgICAgICAgICBwbnNDb25mLT5ucC5nYXBGaWxsVGhyKSAmJgorICAgICAgICAocG5zRGF0YS0+cG5zRmxhZ1ttYXhTZmJQZXJHcm91cCAtIDJdKSkgeworICAgICAgcG5zRGF0YS0+cG5zRmxhZ1ttYXhTZmJQZXJHcm91cCAtIDFdID0gMTsKICAgICB9CiAgICAgLyogYXZvaWQgc2luZ2xlIFBOUyBiYW5kICovCi0gICAgaWYocG5zRGF0YS0+cG5zRmxhZ1ttYXhTZmJQZXJHcm91cC0yXT09MCkgewotICAgICAgcG5zRGF0YS0+cG5zRmxhZ1ttYXhTZmJQZXJHcm91cC0xXSA9IDA7CisgICAgaWYgKHBuc0RhdGEtPnBuc0ZsYWdbbWF4U2ZiUGVyR3JvdXAgLSAyXSA9PSAwKSB7CisgICAgICBwbnNEYXRhLT5wbnNGbGFnW21heFNmYlBlckdyb3VwIC0gMV0gPSAwOwogICAgIH0KICAgfQogCiAgIC8qIGF2b2lkIHNpbmdsZSBQTlMgYmFuZHMgKi8KLSAgaWYocG5zRGF0YS0+cG5zRmxhZ1sxXT09MCkgeworICBpZiAocG5zRGF0YS0+cG5zRmxhZ1sxXSA9PSAwKSB7CiAgICAgcG5zRGF0YS0+cG5zRmxhZ1swXSA9IDA7CiAgIH0KIAotICBmb3Ioc2ZiPTE7IHNmYjxtYXhTZmJQZXJHcm91cC0xOyBzZmIrKykgewotICAgIGlmKChwbnNEYXRhLT5wbnNGbGFnW3NmYi0xXT09MCkmJihwbnNEYXRhLT5wbnNGbGFnW3NmYisxXT09MCkpIHsKKyAgZm9yIChzZmIgPSAxOyBzZmIgPCBtYXhTZmJQZXJHcm91cCAtIDE7IHNmYisrKSB7CisgICAgaWYgKChwbnNEYXRhLT5wbnNGbGFnW3NmYiAtIDFdID09IDApICYmIChwbnNEYXRhLT5wbnNGbGFnW3NmYiArIDFdID09IDApKSB7CiAgICAgICBwbnNEYXRhLT5wbnNGbGFnW3NmYl0gPSAwOwogICAgIH0KICAgfQogCi0KICAgLyoKICAgICBjYWxjdWxhdGUgbm9pc2VOcmcncwogICAqLwotICBGREthYWNFbmNfQ2FsY05vaXNlTnJncyggc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICBwbnNEYXRhLT5wbnNGbGFnLAotICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgIG5vaXNlTnJnICk7CisgIEZES2FhY0VuY19DYWxjTm9pc2VOcmdzKHNmYkFjdGl2ZSwgcG5zRGF0YS0+cG5zRmxhZywgc2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZU5yZyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6RkRLYWFjRW5jX0ZES2FhY0VuY19ub2lzZURldGVjdGlvbgpAQCAtMzM1LDQ5ICszMDYsMzYgQEAKICAgICAgICAgICAgICAgICAgZmxhZ3MgdG9uYWwgLyBub250b25hbAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19GREthYWNFbmNfbm9pc2VEZXRlY3Rpb24oIFBOU19DT05GSUcgICpwbnNDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgICpwbnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIHNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB0bnNPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICB0bnNQcmVkaWN0aW9uR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICB0bnNBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICpzZmJ0b25hbGl0eSApCi17Ci0gICAgSU5UIGNvbmRpdGlvbiA9IFRSVUU7Ci0gICAgaWYgKCAhKHBuc0NvbmYtPm5wLmRldGVjdGlvbkFsZ29yaXRobUZsYWdzICYgSVNfTE9XX0NPTUxFWElUWSkgKSB7Ci0gICAgICBjb25kaXRpb24gPSAodG5zT3JkZXIgPiAzKTsKLSAgICB9Ci0gICAgLyoKLSAgICBubyBQTlMgaWYgaGVhdnkgVE5TIGFjdGl2aXR5Ci0gICAgY2xlYXIgcG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmUKLSAgICAqLwotICAgIGlmKChwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIFVTRV9UTlNfR0FJTl9USFIpICYmCitzdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX25vaXNlRGV0ZWN0aW9uKAorICAgIFBOU19DT05GSUcgKnBuc0NvbmYsIFBOU19EQVRBICpwbnNEYXRhLCBjb25zdCBJTlQgc2ZiQWN0aXZlLAorICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LCBpbnQgdG5zT3JkZXIsIElOVCB0bnNQcmVkaWN0aW9uR2FpbiwgSU5UIHRuc0FjdGl2ZSwKKyAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLCBJTlQgKnNmYk1heFNjYWxlU3BlYywgRklYUF9TR0wgKnNmYnRvbmFsaXR5KSB7CisgIElOVCBjb25kaXRpb24gPSBUUlVFOworICBpZiAoIShwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIElTX0xPV19DT01QTEVYSVRZKSkgeworICAgIGNvbmRpdGlvbiA9ICh0bnNPcmRlciA+IDMpOworICB9CisgIC8qCisgIG5vIFBOUyBpZiBoZWF2eSBUTlMgYWN0aXZpdHkKKyAgY2xlYXIgcG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmUKKyAgKi8KKyAgaWYgKChwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIFVTRV9UTlNfR0FJTl9USFIpICYmCiAgICAgICAodG5zUHJlZGljdGlvbkdhaW4gPj0gcG5zQ29uZi0+bnAudG5zR2FpblRocmVzaG9sZCkgJiYgY29uZGl0aW9uICYmCi0gICAgICAhKChwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIFVTRV9UTlNfUE5TKSAmJiAodG5zUHJlZGljdGlvbkdhaW4gPj0gcG5zQ29uZi0+bnAudG5zUE5TR2FpblRocmVzaG9sZCkgJiYgKHRuc0FjdGl2ZSkpICkKLSAgICB7Ci0gICAgICAgIC8qIGNsZWFyIGFsbCBub2lzZUZ1enp5TWVhc3VyZSAqLwotICAgICAgICBGREttZW1jbGVhcihwbnNEYXRhLT5ub2lzZUZ1enp5TWVhc3VyZSwgc2ZiQWN0aXZlKnNpemVvZihGSVhQX1NHTCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKgotICAgICAgICBjYWxsIG5vaXNlIGRldGVjdGlvbiwgb3V0cHV0IGluIHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlLAotICAgICAgICB1c2UgcmVhbCBtZGN0IHNwZWN0cmFsIGRhdGEKLSAgICAgICAgKi8KLSAgICAgICAgRkRLYWFjRW5jX25vaXNlRGV0ZWN0KCBtZGN0U3BlY3RydW0sCi0gICAgICAgICAgICBzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgICAgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgICAgICBwbnNEYXRhLT5ub2lzZUZ1enp5TWVhc3VyZSwKLSAgICAgICAgICAgICZwbnNDb25mLT5ucCwKLSAgICAgICAgICAgIHNmYnRvbmFsaXR5KTsKLSAgICB9CisgICAgICAhKChwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIFVTRV9UTlNfUE5TKSAmJgorICAgICAgICAodG5zUHJlZGljdGlvbkdhaW4gPj0gcG5zQ29uZi0+bnAudG5zUE5TR2FpblRocmVzaG9sZCkgJiYKKyAgICAgICAgKHRuc0FjdGl2ZSkpKSB7CisgICAgLyogY2xlYXIgYWxsIG5vaXNlRnV6enlNZWFzdXJlICovCisgICAgRkRLbWVtY2xlYXIocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmUsIHNmYkFjdGl2ZSAqIHNpemVvZihGSVhQX1NHTCkpOworICB9IGVsc2UgeworICAgIC8qCisgICAgY2FsbCBub2lzZSBkZXRlY3Rpb24sIG91dHB1dCBpbiBwbnNEYXRhLT5ub2lzZUZ1enp5TWVhc3VyZSwKKyAgICB1c2UgcmVhbCBtZGN0IHNwZWN0cmFsIGRhdGEKKyAgICAqLworICAgIEZES2FhY0VuY19ub2lzZURldGVjdChtZGN0U3BlY3RydW0sIHNmYk1heFNjYWxlU3BlYywgc2ZiQWN0aXZlLCBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlLCAmcG5zQ29uZi0+bnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYnRvbmFsaXR5KTsKKyAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19DYWxjTm9pc2VOcmdzCkBAIC0zOTEsMjMgKzM0OSwyMSBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNOb2lzZU5yZ3MoIGNvbnN0IElOVCAgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqUkVTVFJJQ1QgcG5zRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpSRVNUUklDVCBzZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqUkVTVFJJQ1Qgbm9pc2VOcmcgKQoteworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNOb2lzZU5yZ3MoY29uc3QgSU5UIHNmYkFjdGl2ZSwgSU5UICpSRVNUUklDVCBwbnNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1Qgbm9pc2VOcmcpIHsKICAgaW50IHNmYjsKLSAgSU5UIHRtcCA9ICgtTE9HX05PUk1fUENNKTw8MjsKKyAgSU5UIHRtcCA9ICgtTE9HX05PUk1fUENNKSA8PCAyOwogCi0gIGZvcihzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7Ci0gICAgaWYocG5zRmxhZ1tzZmJdKSB7Ci0gICAgICBJTlQgbnJnID0gKC1zZmJFbmVyZ3lMZERhdGFbc2ZiXStGTDJGWENPTlNUX0RCTCgwLjVmLzY0LjBmKSk+PihERlJBQ1RfQklUUy0xLTcpOworICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKKyAgICBpZiAocG5zRmxhZ1tzZmJdKSB7CisgICAgICBJTlQgbnJnID0gKC1zZmJFbmVyZ3lMZERhdGFbc2ZiXSArIEZMMkZYQ09OU1RfREJMKDAuNWYgLyA2NC4wZikpID4+CisgICAgICAgICAgICAgICAgKERGUkFDVF9CSVRTIC0gMSAtIDcpOwogICAgICAgbm9pc2VOcmdbc2ZiXSA9IHRtcCAtIG5yZzsKICAgICB9CiAgIH0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfQ29kZVBuc0NoYW5uZWwKQEAgLTQyMiwyMCArMzc4LDE4IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIEZES2FhY0VuY19Db2RlUG5zQ2hhbm5lbChjb25zdCBJTlQgICAgIHNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19DT05GSUcgICAgKnBuc0NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpSRVNUUklDVCBwbnNGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAqUkVTVFJJQ1Qgbm9pc2VOcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICpSRVNUUklDVCBzZmJUaHJlc2hvbGRMZERhdGEpCi17Cit2b2lkIEZES2FhY0VuY19Db2RlUG5zQ2hhbm5lbChjb25zdCBJTlQgc2ZiQWN0aXZlLCBQTlNfQ09ORklHICpwbnNDb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBwbnNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1Qgbm9pc2VOcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2ZiVGhyZXNob2xkTGREYXRhKSB7CiAgIElOVCBzZmI7CiAgIElOVCBsYXN0aU5vaXNlRW5lcmd5ID0gMDsKICAgSU5UIGZpcnN0UE5TYmFuZCA9IDE7IC8qIFRSVUUgZm9yIGZpcnN0IFBOUy1jb2RlZCBiYW5kICovCiAKICAgLyogbm8gUE5TICovCi0gIGlmKCFwbnNDb25mLT51c2VQbnMpIHsKLSAgICBmb3Ioc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgeworICBpZiAoIXBuc0NvbmYtPnVzZVBucykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgewogICAgICAgLyogbm8gUE5TIGNvZGluZyAqLwogICAgICAgbm9pc2VOcmdbc2ZiXSA9IE5PX05PSVNFX1BOUzsKICAgICB9CkBAIC00NDMsMzQgKzM5NywzMiBAQAogICB9CiAKICAgLyogY29kZSBQTlMgKi8KLSAgZm9yKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKLSAgICBpZihwbnNGbGFnW3NmYl0pIHsKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CisgICAgaWYgKHBuc0ZsYWdbc2ZiXSkgewogICAgICAgLyogaGlnaCBzZmJUaHJlc2hvbGQgY2F1c2VzIHBlID0gMCAqLwotICAgICAgaWYobm9pc2VOcmdbc2ZiXSAhPSBOT19OT0lTRV9QTlMpCi0gICAgICAgIHNmYlRocmVzaG9sZExkRGF0YVtzZmJdID0gc2ZiRW5lcmd5TGREYXRhW3NmYl0gKyBGTDJGWENPTlNUX0RCTCgxLjBmL0xEX0RBVEFfU0NBTElORyk7CisgICAgICBpZiAobm9pc2VOcmdbc2ZiXSAhPSBOT19OT0lTRV9QTlMpCisgICAgICAgIHNmYlRocmVzaG9sZExkRGF0YVtzZmJdID0KKyAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YVtzZmJdICsgRkwyRlhDT05TVF9EQkwoMS4wZiAvIExEX0RBVEFfU0NBTElORyk7CiAKICAgICAgIC8qIHNldCBub2lzZU5yZyBpbiB2YWxpZCByZWdpb24gKi8KLSAgICAgIGlmKCFmaXJzdFBOU2JhbmQpIHsKKyAgICAgIGlmICghZmlyc3RQTlNiYW5kKSB7CiAgICAgICAgIElOVCBkZWx0YWlOb2lzZUVuZXJneSA9IG5vaXNlTnJnW3NmYl0gLSBsYXN0aU5vaXNlRW5lcmd5OwogCi0gICAgICAgIGlmKGRlbHRhaU5vaXNlRW5lcmd5ID4gQ09ERV9CT09LX1BOU19MQVYpCi0gICAgICAgICAgICBub2lzZU5yZ1tzZmJdIC09IGRlbHRhaU5vaXNlRW5lcmd5IC0gQ09ERV9CT09LX1BOU19MQVY7Ci0gICAgICAgIGVsc2UgaWYoZGVsdGFpTm9pc2VFbmVyZ3kgPCAtQ09ERV9CT09LX1BOU19MQVYpCi0gICAgICAgICAgICBub2lzZU5yZ1tzZmJdIC09IGRlbHRhaU5vaXNlRW5lcmd5ICsgQ09ERV9CT09LX1BOU19MQVY7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgICAgaWYgKGRlbHRhaU5vaXNlRW5lcmd5ID4gQ09ERV9CT09LX1BOU19MQVYpCisgICAgICAgICAgbm9pc2VOcmdbc2ZiXSAtPSBkZWx0YWlOb2lzZUVuZXJneSAtIENPREVfQk9PS19QTlNfTEFWOworICAgICAgICBlbHNlIGlmIChkZWx0YWlOb2lzZUVuZXJneSA8IC1DT0RFX0JPT0tfUE5TX0xBVikKKyAgICAgICAgICBub2lzZU5yZ1tzZmJdIC09IGRlbHRhaU5vaXNlRW5lcmd5ICsgQ09ERV9CT09LX1BOU19MQVY7CisgICAgICB9IGVsc2UgewogICAgICAgICBmaXJzdFBOU2JhbmQgPSAwOwogICAgICAgfQogICAgICAgbGFzdGlOb2lzZUVuZXJneSA9IG5vaXNlTnJnW3NmYl07Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICAvKiBubyBQTlMgY29kaW5nICovCiAgICAgICBub2lzZU5yZ1tzZmJdID0gTk9fTk9JU0VfUE5TOwogICAgIH0KICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19QcmVQcm9jZXNzUG5zQ2hhbm5lbFBhaXIKQEAgLTQ4NiwzNyArNDM4LDQwIEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIEZES2FhY0VuY19QcmVQcm9jZXNzUG5zQ2hhbm5lbFBhaXIoY29uc3QgSU5UICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYkVuZXJneUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqUkVTVFJJQ1Qgc2ZiRW5lcmd5UmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TGVmdExELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYkVuZXJneVJpZ2h0TEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19DT05GSUcgKlJFU1RSSUNUIHBuc0NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5TX0RBVEEgICAqcG5zRGF0YUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5TX0RBVEEgICAqcG5zRGF0YVJpZ2h0KQotewordm9pZCBGREthYWNFbmNfUHJlUHJvY2Vzc1Buc0NoYW5uZWxQYWlyKAorICAgIGNvbnN0IElOVCBzZmJBY3RpdmUsIEZJWFBfREJMICpSRVNUUklDVCBzZmJFbmVyZ3lMZWZ0LAorICAgIEZJWFBfREJMICpSRVNUUklDVCBzZmJFbmVyZ3lSaWdodCwgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkVuZXJneUxlZnRMRCwKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2ZiRW5lcmd5UmlnaHRMRCwgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkVuZXJneU1pZCwKKyAgICBQTlNfQ09ORklHICpSRVNUUklDVCBwbnNDb25mLCBQTlNfREFUQSAqcG5zRGF0YUxlZnQsCisgICAgUE5TX0RBVEEgKnBuc0RhdGFSaWdodCkgewogICBJTlQgc2ZiOwogICBGSVhQX0RCTCBjY2Y7CiAKLSAgaWYoIXBuc0NvbmYtPnVzZVBucykKLSAgICByZXR1cm47CisgIGlmICghcG5zQ29uZi0+dXNlUG5zKSByZXR1cm47CiAKLSAgRklYUF9EQkwgKlJFU1RSSUNUIHBOb2lzZUVuZXJneUNvcnJlbGF0aW9uTCA9IHBuc0RhdGFMZWZ0LT5ub2lzZUVuZXJneUNvcnJlbGF0aW9uOwotICBGSVhQX0RCTCAqUkVTVFJJQ1QgcE5vaXNlRW5lcmd5Q29ycmVsYXRpb25SID0gcG5zRGF0YVJpZ2h0LT5ub2lzZUVuZXJneUNvcnJlbGF0aW9uOworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcE5vaXNlRW5lcmd5Q29ycmVsYXRpb25MID0KKyAgICAgIHBuc0RhdGFMZWZ0LT5ub2lzZUVuZXJneUNvcnJlbGF0aW9uOworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcE5vaXNlRW5lcmd5Q29ycmVsYXRpb25SID0KKyAgICAgIHBuc0RhdGFSaWdodC0+bm9pc2VFbmVyZ3lDb3JyZWxhdGlvbjsKIAotICBmb3Ioc2ZiPTA7c2ZiPCBzZmJBY3RpdmU7c2ZiKyspIHsKLSAgICBGSVhQX0RCTCBxdW90ID0gKHNmYkVuZXJneUxlZnRMRFtzZmJdPj4xKSArIChzZmJFbmVyZ3lSaWdodExEW3NmYl0+PjEpOworICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKKyAgICBGSVhQX0RCTCBxdW90ID0gKHNmYkVuZXJneUxlZnRMRFtzZmJdID4+IDEpICsgKHNmYkVuZXJneVJpZ2h0TERbc2ZiXSA+PiAxKTsKIAotICAgIGlmKHF1b3QgPCBGTDJGWENPTlNUX0RCTCgtMzIuMGYvKGZsb2F0KUxEX0RBVEFfU0NBTElORykpCisgICAgaWYgKHF1b3QgPCBGTDJGWENPTlNUX0RCTCgtMzIuMGYgLyAoZmxvYXQpTERfREFUQV9TQ0FMSU5HKSkKICAgICAgIGNjZiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgIGVsc2UgewotICAgICAgRklYUF9EQkwgYWNjdSA9IHNmYkVuZXJneU1pZFtzZmJdLSAoKChzZmJFbmVyZ3lMZWZ0W3NmYl0+PjEpKyhzZmJFbmVyZ3lSaWdodFtzZmJdPj4xKSk+PjEpOwotICAgICAgSU5UIHNpZ24gPSAoYWNjdSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSA/IDEgOiAwIDsKKyAgICAgIEZJWFBfREJMIGFjY3UgPQorICAgICAgICAgIHNmYkVuZXJneU1pZFtzZmJdIC0KKyAgICAgICAgICAoKChzZmJFbmVyZ3lMZWZ0W3NmYl0gPj4gMSkgKyAoc2ZiRW5lcmd5UmlnaHRbc2ZiXSA+PiAxKSkgPj4gMSk7CisgICAgICBJTlQgc2lnbiA9IChhY2N1IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpID8gMSA6IDA7CiAgICAgICBhY2N1ID0gZml4cF9hYnMoYWNjdSk7CiAKLSAgICAgIGNjZiA9IENhbGNMZERhdGEoYWNjdSkgKyBGTDJGWENPTlNUX0RCTCgoZmxvYXQpMS4wZi8oZmxvYXQpTERfREFUQV9TQ0FMSU5HKSAtIHF1b3Q7ICAgLyogbGQoYWNjdSoyKSA9IGxkKGFjY3UpICsgMSAqLwotICAgICAgY2NmID0gKGNjZj49RkwyRlhDT05TVF9EQkwoMC4wKSkgPyAoKEZJWFBfREJMKU1BWFZBTF9EQkwpIDogKHNpZ24pID8gLUNhbGNJbnZMZERhdGEoY2NmKSA6IENhbGNJbnZMZERhdGEoY2NmKTsKKyAgICAgIGNjZiA9IENhbGNMZERhdGEoYWNjdSkgKworICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoKGZsb2F0KTEuMGYgLyAoZmxvYXQpTERfREFUQV9TQ0FMSU5HKSAtCisgICAgICAgICAgICBxdW90OyAvKiBsZChhY2N1KjIpID0gbGQoYWNjdSkgKyAxICovCisgICAgICBjY2YgPSAoY2NmID49IEZMMkZYQ09OU1RfREJMKDAuMCkpCisgICAgICAgICAgICAgICAgPyAoKEZJWFBfREJMKU1BWFZBTF9EQkwpCisgICAgICAgICAgICAgICAgOiAoc2lnbikgPyAtQ2FsY0ludkxkRGF0YShjY2YpIDogQ2FsY0ludkxkRGF0YShjY2YpOwogICAgIH0KIAogICAgIHBOb2lzZUVuZXJneUNvcnJlbGF0aW9uTFtzZmJdID0gY2NmOwpAQCAtNTI0LDggKzQ3OSw2IEBACiAgIH0KIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19Qb3N0UHJvY2Vzc1Buc0NoYW5uZWxQYWlyCkBAIC01NDIsMzMgKzQ5NSwyOSBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBGREthYWNFbmNfUG9zdFByb2Nlc3NQbnNDaGFubmVsUGFpcihjb25zdCBJTlQgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19DT05GSUcgICpwbnNDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgICpwbnNEYXRhUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpSRVNUUklDVCBtc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICptc0RpZ2VzdCApCi17Cit2b2lkIEZES2FhY0VuY19Qb3N0UHJvY2Vzc1Buc0NoYW5uZWxQYWlyKGNvbnN0IElOVCBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19DT05GSUcgKnBuc0NvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICpwbnNEYXRhTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5TX0RBVEEgKnBuc0RhdGFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBtc01hc2ssIElOVCAqbXNEaWdlc3QpIHsKICAgSU5UIHNmYjsKIAotICBpZighcG5zQ29uZi0+dXNlUG5zKQotICAgIHJldHVybjsKKyAgaWYgKCFwbnNDb25mLT51c2VQbnMpIHJldHVybjsKIAotICBmb3Ioc2ZiPTA7c2ZiPHNmYkFjdGl2ZTtzZmIrKykgeworICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKICAgICAvKgogICAgICAgTVMgcG9zdCBwcm9jZXNzaW5nCiAgICAgKi8KLSAgICBpZiggbXNNYXNrW3NmYl0gKSB7Ci0gICAgICBpZiggKHBuc0RhdGFMZWZ0LT5wbnNGbGFnW3NmYl0pICYmCi0gICAgICAgICAgKHBuc0RhdGFSaWdodC0+cG5zRmxhZ1tzZmJdKSApIHsKKyAgICBpZiAobXNNYXNrW3NmYl0pIHsKKyAgICAgIGlmICgocG5zRGF0YUxlZnQtPnBuc0ZsYWdbc2ZiXSkgJiYgKHBuc0RhdGFSaWdodC0+cG5zRmxhZ1tzZmJdKSkgewogICAgICAgICAvKiBBQUMgb25seTogU3RhbmRhcmQgKi8KICAgICAgICAgLyogZG8gdGhpcyB0byBhdm9pZCBtcyBmbGFncyBpbiBsYXllcnMgdGhhdCBzaG91bGQgbm90IGhhdmUgaXQgKi8KLSAgICAgICAgaWYocG5zRGF0YUxlZnQtPm5vaXNlRW5lcmd5Q29ycmVsYXRpb25bc2ZiXSA8PSBwbnNDb25mLT5ub2lzZUNvcnJlbGF0aW9uVGhyZXNoKXsKKyAgICAgICAgaWYgKHBuc0RhdGFMZWZ0LT5ub2lzZUVuZXJneUNvcnJlbGF0aW9uW3NmYl0gPD0KKyAgICAgICAgICAgIHBuc0NvbmYtPm5vaXNlQ29ycmVsYXRpb25UaHJlc2gpIHsKICAgICAgICAgICBtc01hc2tbc2ZiXSA9IDA7CiAgICAgICAgICAgKm1zRGlnZXN0ID0gTVNfU09NRTsKICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICB9IGVsc2UgewogICAgICAgICAvKgogICAgICAgICAgIE5vIFBOUyBjb2RpbmcKICAgICAgICAgKi8KQEAgLTU4MSw4ICs1MzAsOSBAQAogICAgICAgVXNlIE1TIGZsYWcgdG8gc2lnbmFsIG5vaXNlIGNvcnJlbGF0aW9uIGlmCiAgICAgICBwbnMgaXMgYWN0aXZlIGluIGJvdGggY2hhbm5lbHMKICAgICAqLwotICAgIGlmKCAocG5zRGF0YUxlZnQtPnBuc0ZsYWdbc2ZiXSkgJiYgKHBuc0RhdGFSaWdodC0+cG5zRmxhZ1tzZmJdKSApIHsKLSAgICAgIGlmKHBuc0RhdGFMZWZ0LT5ub2lzZUVuZXJneUNvcnJlbGF0aW9uW3NmYl0gPiBwbnNDb25mLT5ub2lzZUNvcnJlbGF0aW9uVGhyZXNoKSB7CisgICAgaWYgKChwbnNEYXRhTGVmdC0+cG5zRmxhZ1tzZmJdKSAmJiAocG5zRGF0YVJpZ2h0LT5wbnNGbGFnW3NmYl0pKSB7CisgICAgICBpZiAocG5zRGF0YUxlZnQtPm5vaXNlRW5lcmd5Q29ycmVsYXRpb25bc2ZiXSA+CisgICAgICAgICAgcG5zQ29uZi0+bm9pc2VDb3JyZWxhdGlvblRocmVzaCkgewogICAgICAgICBtc01hc2tbc2ZiXSA9IDE7CiAgICAgICAgICptc0RpZ2VzdCA9IE1TX1NPTUU7CiAgICAgICB9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2FhY2VuY19wbnMuaCBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Bucy5oCmluZGV4IDNiZGE5ZGUuLjQ5MzhmY2YgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Bucy5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Bucy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDM1ICs5MCwzNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBMb2h3YXNzZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBwbnMuaAorICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogcG5zLmgKIAotI2lmbmRlZiBfX1BOU19ICi0jZGVmaW5lIF9fUE5TX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQUFDRU5DX1BOU19ICisjZGVmaW5lIEFBQ0VOQ19QTlNfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgotCiAjaW5jbHVkZSAicG5zcGFyYW0uaCIKIAogI2RlZmluZSBOT19OT0lTRV9QTlMgRkRLX0lOVF9NSU4KIAotdHlwZWRlZiBzdHJ1Y3R7Cit0eXBlZGVmIHN0cnVjdCB7CiAgIE5PSVNFUEFSQU1TIG5wOwogICBGSVhQX0RCTCBtaW5Db3JyZWxhdGlvbkVuZXJneTsKICAgRklYUF9EQkwgbm9pc2VDb3JyZWxhdGlvblRocmVzaDsKLSAgSU5UICAgICAgdXNlUG5zOworICBJTlQgdXNlUG5zOwogfSBQTlNfQ09ORklHOwogCi10eXBlZGVmIHN0cnVjdHsKK3R5cGVkZWYgc3RydWN0IHsKICAgRklYUF9TR0wgbm9pc2VGdXp6eU1lYXN1cmVbTUFYX0dST1VQRURfU0ZCXTsKICAgRklYUF9EQkwgbm9pc2VFbmVyZ3lDb3JyZWxhdGlvbltNQVhfR1JPVVBFRF9TRkJdOwotICBJTlQgICAgICBwbnNGbGFnW01BWF9HUk9VUEVEX1NGQl07CisgIElOVCBwbnNGbGFnW01BWF9HUk9VUEVEX1NGQl07CiB9IFBOU19EQVRBOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBBQUNFTkNfUE5TX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Rucy5jcHAgYi9saWJBQUNlbmMvc3JjL2FhY2VuY190bnMuY3BwCmluZGV4IDlhMDdlOGYuLjQ0NjI2MDAgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Rucy5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgQWxleCBHcm9lc2NoZWwsIFRvYmlhcyBDaGFsdXBrYQotICAgY29udGVudHMvZGVzY3JpcHRpb246IFRlbXBvcmFsIG5vaXNlIHNoYXBpbmcKKyAgIEF1dGhvcihzKTogICBBbGV4IEdyb2VzY2hlbCwgVG9iaWFzIENoYWx1cGthCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBUZW1wb3JhbCBub2lzZSBzaGFwaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJhYWNlbmNfdG5zLmgiCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCkBAIC05NCwxOTIgKzEwNiwyMTMgQEAKICNpbmNsdWRlICJ0bnNfZnVuYy5oIgogI2luY2x1ZGUgImFhY0VuY19yb20uaCIKICNpbmNsdWRlICJhYWNlbmNfdG5zLmgiCisjaW5jbHVkZSAiRkRLX2xwYy5oIgogCiAjZGVmaW5lIEZJTFRFUl9ESVJFQ1RJT04gMCAvKiAwID0gdXAsIDEgPSBkb3duICovCiAKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBhY2ZXaW5kb3dMb25nWzEyKzMrMV0gPSB7Ci0gIDB4N2ZmZmZmZmYsMHg3ZmI4MDAwMCwweDdlZTAwMDAwLDB4N2Q3ODAwMDAsMHg3YjgwMDAwMCwweDc4ZjgwMDAwLDB4NzVlMDAwMDAsMHg3MjM4MDAwMCwKLSAgMHg2ZTAwMDAwMCwweDY5MzgwMDAwLDB4NjNlMDAwMDAsMHg1ZGY4MDAwMCwweDU3ODAwMDAwLDB4NTA3ODAwMDAsMHg0OGUwMDAwMCwweDQwYjgwMDAwCi19Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIGFjZldpbmRvd0xvbmdbMTIgKyAzICsgMV0gPSB7CisgICAgMHg3ZmZmZmZmZiwgMHg3ZmI4MDAwMCwgMHg3ZWUwMDAwMCwgMHg3ZDc4MDAwMCwgMHg3YjgwMDAwMCwgMHg3OGY4MDAwMCwKKyAgICAweDc1ZTAwMDAwLCAweDcyMzgwMDAwLCAweDZlMDAwMDAwLCAweDY5MzgwMDAwLCAweDYzZTAwMDAwLCAweDVkZjgwMDAwLAorICAgIDB4NTc4MDAwMDAsIDB4NTA3ODAwMDAsIDB4NDhlMDAwMDAsIDB4NDBiODAwMDB9OwogCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgYWNmV2luZG93U2hvcnRbNCszKzFdID0gewotICAweDdmZmZmZmZmLDB4N2UwMDAwMDAsMHg3ODAwMDAwMCwweDZlMDAwMDAwLDB4NjAwMDAwMDAsMHg0ZTAwMDAwMCwweDM4MDAwMDAwLDB4MWUwMDAwMDAKLX07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgYWNmV2luZG93U2hvcnRbNCArIDMgKyAxXSA9IHsKKyAgICAweDdmZmZmZmZmLCAweDdlMDAwMDAwLCAweDc4MDAwMDAwLCAweDZlMDAwMDAwLAorICAgIDB4NjAwMDAwMDAsIDB4NGUwMDAwMDAsIDB4MzgwMDAwMDAsIDB4MWUwMDAwMDB9OwogCi10eXBlZGVmIHN0cnVjdHsKLSAgSU5UICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGVGcm9tWzJdOyAgLyogbm9uZVNicj0wLCB1c2VTYnI9MSAqLwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZVRvWzJdOyAgICAvKiBub25lU2JyPTAsIHVzZVNicj0xICovCi0gIFROU19QQVJBTUVURVJfVEFCVUxBVEVEICBwYXJhbVRhYlsyXTsgICAgIC8qIG1vbm89MCwgc3RlcmVvPTEgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIGJpdFJhdGVGcm9tWzJdOyAgICAgICAgICAgICAgICAgIC8qIG5vbmVTYnI9MCwgdXNlU2JyPTEgKi8KKyAgSU5UIGJpdFJhdGVUb1syXTsgICAgICAgICAgICAgICAgICAgIC8qIG5vbmVTYnI9MCwgdXNlU2JyPTEgKi8KKyAgVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQgcGFyYW1UYWJbMl07IC8qIG1vbm89MCwgc3RlcmVvPTEgKi8KIAogfSBUTlNfSU5GT19UQUI7CiAKLSNkZWZpbmUgVE5TX1RJTUVSRVNfU0NBTEUgICAgKDEpCi0jZGVmaW5lIEZMMl9USU1FUkVTX0ZJWChhKSAgICggRkwyRlhDT05TVF9EQkwoYS8oZmxvYXQpKDE8PFROU19USU1FUkVTX1NDQUxFKSkgKQorI2RlZmluZSBUTlNfVElNRVJFU19TQ0FMRSAoMSkKKyNkZWZpbmUgRkwyX1RJTUVSRVNfRklYKGEpIChGTDJGWENPTlNUX0RCTChhIC8gKGZsb2F0KSgxIDw8IFROU19USU1FUkVTX1NDQUxFKSkpCiAKLXN0YXRpYyBjb25zdCBUTlNfSU5GT19UQUIgdG5zSW5mb1RhYltdID0KLXsKLSAgewotICAgIHsgIDE2MDAwLCAgMTM1MDB9LAotICAgIHsgIDMyMDAwLCAgMjgwMDB9LAotICAgIHsKLSAgICAgIHsgezEsIDF9LCB7MTQzNywgMTUwMH0sIHsxNDAwLCA2MDB9LCB7MTIsIDEyfSwge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LCB7MywgMX0sIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjJmKX0sIDEgfSwKLSAgICAgIHsgezEsIDF9LCB7MTQzNywgMTUwMH0sIHsxNDAwLCA2MDB9LCB7MTIsIDEyfSwge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LCB7MywgMX0sIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjJmKX0sIDEgfQotICAgIH0KLSAgfSwKLSAgewotICAgIHsgIDMyMDAxLCAgMjgwMDF9LAotICAgIHsgIDYwMDAwLCAgNTIwMDB9LAotICAgIHsKLSAgICAgIHsgezEsIDF9LCB7MTQzNywgMTUwMH0sIHsxNDAwLCA2MDB9LCB7MTIsIDEwfSwge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LCB7MywgMX0sIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjBmKX0sIDEgfSwKLSAgICAgIHsgezEsIDF9LCB7MTQzNywgMTUwMH0sIHsxNDAwLCA2MDB9LCB7MTIsIDEwfSwge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LCB7MywgMX0sIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjBmKX0sIDEgfQotICAgIH0KLSAgfSwKLSAgewotICAgIHsgIDYwMDAxLCAgNTIwMDF9LAotICAgIHsgMzg0MDAwLCAzODQwMDB9LAotICAgIHsKLSAgICAgIHsgezEsIDF9LCB7MTQzNywgMTUwMH0sIHsxNDAwLCA2MDB9LCB7MTIsICA4fSwge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LCB7MywgMX0sIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjBmKX0sIDEgfSwKLSAgICAgIHsgezEsIDF9LCB7MTQzNywgMTUwMH0sIHsxNDAwLCA2MDB9LCB7MTIsICA4fSwge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LCB7MywgMX0sIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjBmKX0sIDEgfQotICAgIH0KLSAgfQotfTsKK3N0YXRpYyBjb25zdCBUTlNfSU5GT19UQUIgdG5zSW5mb1RhYltdID0geworICAgIHt7MTYwMDAsIDEzNTAwfSwKKyAgICAgezMyMDAwLCAyODAwMH0sCisgICAgIHt7ezEsIDF9LAorICAgICAgIHsxNDM3LCAxNTAwfSwKKyAgICAgICB7MTQwMCwgNjAwfSwKKyAgICAgICB7MTIsIDEyfSwKKyAgICAgICB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sCisgICAgICAgezMsIDF9LAorICAgICAgIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjJmKX0sCisgICAgICAgMX0sCisgICAgICB7ezEsIDF9LAorICAgICAgIHsxNDM3LCAxNTAwfSwKKyAgICAgICB7MTQwMCwgNjAwfSwKKyAgICAgICB7MTIsIDEyfSwKKyAgICAgICB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sCisgICAgICAgezMsIDF9LAorICAgICAgIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjJmKX0sCisgICAgICAgMX19fSwKKyAgICB7ezMyMDAxLCAyODAwMX0sCisgICAgIHs2MDAwMCwgNTIwMDB9LAorICAgICB7e3sxLCAxfSwKKyAgICAgICB7MTQzNywgMTUwMH0sCisgICAgICAgezE0MDAsIDYwMH0sCisgICAgICAgezEyLCAxMH0sCisgICAgICAge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LAorICAgICAgIHszLCAxfSwKKyAgICAgICB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4wZil9LAorICAgICAgIDF9LAorICAgICAge3sxLCAxfSwKKyAgICAgICB7MTQzNywgMTUwMH0sCisgICAgICAgezE0MDAsIDYwMH0sCisgICAgICAgezEyLCAxMH0sCisgICAgICAge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LAorICAgICAgIHszLCAxfSwKKyAgICAgICB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4wZil9LAorICAgICAgIDF9fX0sCisgICAge3s2MDAwMSwgNTIwMDF9LAorICAgICB7Mzg0MDAwLCAzODQwMDB9LAorICAgICB7e3sxLCAxfSwKKyAgICAgICB7MTQzNywgMTUwMH0sCisgICAgICAgezE0MDAsIDYwMH0sCisgICAgICAgezEyLCA4fSwKKyAgICAgICB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sCisgICAgICAgezMsIDF9LAorICAgICAgIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjBmKX0sCisgICAgICAgMX0sCisgICAgICB7ezEsIDF9LAorICAgICAgIHsxNDM3LCAxNTAwfSwKKyAgICAgICB7MTQwMCwgNjAwfSwKKyAgICAgICB7MTIsIDh9LAorICAgICAgIHtGSUxURVJfRElSRUNUSU9OLCBGSUxURVJfRElSRUNUSU9OfSwKKyAgICAgICB7MywgMX0sCisgICAgICAge0ZMMl9USU1FUkVTX0ZJWCgwLjRmKSwgRkwyX1RJTUVSRVNfRklYKDEuMGYpfSwKKyAgICAgICAxfX19fTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICBJTlQgICBzYW1wbGluZ1JhdGU7CisgIElOVCBzYW1wbGluZ1JhdGU7CiAgIFNDSEFSIG1heEJhbmRzWzJdOyAvKiBsb25nPTA7IHNob3J0PTEgKi8KIAogfSBUTlNfTUFYX1RBQl9FTlRSWTsKIAotc3RhdGljIGNvbnN0IFROU19NQVhfVEFCX0VOVFJZIHRuc01heEJhbmRzVGFiMTAyNFtdID0KLXsKLSAgeyA5NjAwMCwgeyAzMSwgIDl9fSwKLSAgeyA4ODIwMCwgeyAzMSwgIDl9fSwKLSAgeyA2NDAwMCwgeyAzNCwgMTB9fSwKLSAgeyA0ODAwMCwgeyA0MCwgMTR9fSwKLSAgeyA0NDEwMCwgeyA0MiwgMTR9fSwKLSAgeyAzMjAwMCwgeyA1MSwgMTR9fSwKLSAgeyAyNDAwMCwgeyA0NiwgMTR9fSwKLSAgeyAyMjA1MCwgeyA0NiwgMTR9fSwKLSAgeyAxNjAwMCwgeyA0MiwgMTR9fSwKLSAgeyAxMjAwMCwgeyA0MiwgMTR9fSwKLSAgeyAxMTAyNSwgeyA0MiwgMTR9fSwKLSAgeyA4MDAwLCAgeyAzOSwgMTR9fQorc3RhdGljIGNvbnN0IFROU19NQVhfVEFCX0VOVFJZIHRuc01heEJhbmRzVGFiMTAyNFtdID0geworICAgIHs5NjAwMCwgezMxLCA5fX0sICB7ODgyMDAsIHszMSwgOX19LCAgezY0MDAwLCB7MzQsIDEwfX0sIHs0ODAwMCwgezQwLCAxNH19LAorICAgIHs0NDEwMCwgezQyLCAxNH19LCB7MzIwMDAsIHs1MSwgMTR9fSwgezI0MDAwLCB7NDYsIDE0fX0sIHsyMjA1MCwgezQ2LCAxNH19LAorICAgIHsxNjAwMCwgezQyLCAxNH19LCB7MTIwMDAsIHs0MiwgMTR9fSwgezExMDI1LCB7NDIsIDE0fX0sIHs4MDAwLCB7MzksIDE0fX19OworCitzdGF0aWMgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgdG5zTWF4QmFuZHNUYWIxMjBbXSA9IHsKKyAgICB7NDgwMDAsIHsxMiwgLTF9fSwgLyogNDgwMDAgKi8KKyAgICB7NDQxMDAsIHsxMiwgLTF9fSwgLyogNDQxMDAgKi8KKyAgICB7MzIwMDAsIHsxNSwgLTF9fSwgLyogMzIwMDAgKi8KKyAgICB7MjQwMDAsIHsxNSwgLTF9fSwgLyogMjQwMDAgKi8KKyAgICB7MjIwNTAsIHsxNSwgLTF9fSAgLyogMjIwNTAgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBUTlNfTUFYX1RBQl9FTlRSWSB0bnNNYXhCYW5kc1RhYjQ4MFtdID0KLXsKLSAgeyA0ODAwMCwgeyAzMSwgLTF9fSwKLSAgeyA0NDEwMCwgeyAzMiwgLTF9fSwKLSAgeyAzMjAwMCwgeyAzNywgLTF9fSwKLSAgeyAyNDAwMCwgeyAzMCwgLTF9fSwKLSAgeyAyMjA1MCwgeyAzMCwgLTF9fQorc3RhdGljIGNvbnN0IFROU19NQVhfVEFCX0VOVFJZIHRuc01heEJhbmRzVGFiMTI4W10gPSB7CisgICAgezQ4MDAwLCB7MTIsIC0xfX0sIC8qIDQ4MDAwICovCisgICAgezQ0MTAwLCB7MTIsIC0xfX0sIC8qIDQ0MTAwICovCisgICAgezMyMDAwLCB7MTUsIC0xfX0sIC8qIDMyMDAwICovCisgICAgezI0MDAwLCB7MTUsIC0xfX0sIC8qIDI0MDAwICovCisgICAgezIyMDUwLCB7MTUsIC0xfX0gIC8qIDIyMDUwICovCiB9OwogCi1zdGF0aWMgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgdG5zTWF4QmFuZHNUYWI1MTJbXSA9Ci17Ci0gIHsgNDgwMDAsIHsgMzEsIC0xfX0sCi0gIHsgNDQxMDAsIHsgMzIsIC0xfX0sCi0gIHsgMzIwMDAsIHsgMzcsIC0xfX0sCi0gIHsgMjQwMDAsIHsgMzEsIC0xfX0sCi0gIHsgMjIwNTAsIHsgMzEsIC0xfX0KK3N0YXRpYyBjb25zdCBUTlNfTUFYX1RBQl9FTlRSWSB0bnNNYXhCYW5kc1RhYjI0MFtdID0geworICAgIHs5NjAwMCwgezIyLCAtMX19LCAvKiA5NjAwMCAqLworICAgIHs0ODAwMCwgezIyLCAtMX19LCAvKiA0ODAwMCAqLworICAgIHs0NDEwMCwgezIyLCAtMX19LCAvKiA0NDEwMCAqLworICAgIHszMjAwMCwgezIxLCAtMX19LCAvKiAzMjAwMCAqLworICAgIHsyNDAwMCwgezIxLCAtMX19LCAvKiAyNDAwMCAqLworICAgIHsyMjA1MCwgezIxLCAtMX19ICAvKiAyMjA1MCAqLwogfTsKIAotc3RhdGljIElOVCBGREthYWNFbmNfQXV0b1RvUGFyY29yKAotICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgaW5wdXQsCi0gICAgICAgIEZJWFBfREJMICpSRVNUUklDVCByZWZsQ29lZmYsCi0gICAgICAgIGNvbnN0IElOVCBudW1PZkNvZWZmCi0gICAgICAgICk7CitzdGF0aWMgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgdG5zTWF4QmFuZHNUYWIyNTZbXSA9IHsKKyAgICB7OTYwMDAsIHsyNSwgLTF9fSwgLyogOTYwMDAgKi8KKyAgICB7NDgwMDAsIHsyNSwgLTF9fSwgLyogNDgwMDAgKi8KKyAgICB7NDQxMDAsIHsyNSwgLTF9fSwgLyogNDQxMDAgKi8KKyAgICB7MzIwMDAsIHsyNCwgLTF9fSwgLyogMzIwMDAgKi8KKyAgICB7MjQwMDAsIHsyNCwgLTF9fSwgLyogMjQwMDAgKi8KKyAgICB7MjIwNTAsIHsyNCwgLTF9fSAgLyogMjIwNTAgKi8KK307CitzdGF0aWMgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgdG5zTWF4QmFuZHNUYWI0ODBbXSA9IHt7NDgwMDAsIHszMSwgLTF9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0NDEwMCwgezMyLCAtMX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMyMDAwLCB7MzcsIC0xfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjQwMDAsIHszMCwgLTF9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyMjA1MCwgezMwLCAtMX19fTsKIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX1BhcmNvcjJJbmRleCgKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKnBhcmNvciwKLSAgICAgICAgSU5UICpSRVNUUklDVCBpbmRleCwKLSAgICAgICAgY29uc3QgSU5UIG9yZGVyLAotICAgICAgICBjb25zdCBJTlQgYml0c1BlckNvZWZmCi0gICAgICAgICk7CitzdGF0aWMgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgdG5zTWF4QmFuZHNUYWI1MTJbXSA9IHt7NDgwMDAsIHszMSwgLTF9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0NDEwMCwgezMyLCAtMX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMyMDAwLCB7MzcsIC0xfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjQwMDAsIHszMSwgLTF9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyMjA1MCwgezMxLCAtMX19fTsKIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0luZGV4MlBhcmNvcigKLSAgICAgICAgY29uc3QgSU5UICppbmRleCwKLSAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBhcmNvciwKLSAgICAgICAgY29uc3QgSU5UIG9yZGVyLAotICAgICAgICBjb25zdCBJTlQgYml0c1BlckNvZWZmCi0gICAgICAgICk7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfUGFyY29yMkluZGV4KGNvbnN0IEZJWFBfTFBDICpwYXJjb3IsIElOVCAqUkVTVFJJQ1QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBvcmRlciwgY29uc3QgSU5UIGJpdHNQZXJDb2VmZik7CiAKLXN0YXRpYyBJTlQgRkRLYWFjRW5jX1BhcmNvclRvTHBjKAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqcmVmbENvZWZmLAotICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgTHBjQ29lZmYsCi0gICAgICAgIGNvbnN0IElOVCBudW1PZkNvZWZmLAotICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgd29ya0J1ZmZlcgotICAgICAgICApOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0luZGV4MlBhcmNvcihjb25zdCBJTlQgKmluZGV4LCBGSVhQX0xQQyAqUkVTVFJJQ1QgcGFyY29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgb3JkZXIsIGNvbnN0IElOVCBiaXRzUGVyQ29lZmYpOwogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfQW5hbHlzaXNGaWx0ZXIoCi0gICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBzaWduYWwsCi0gICAgICAgIGNvbnN0IElOVCBudW1PZkxpbmVzLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqcHJlZGljdG9yQ29lZmYsCi0gICAgICAgIGNvbnN0IElOVCBvcmRlciwKLSAgICAgICAgY29uc3QgSU5UIGxwY0dhaW5GYWN0b3IKLSAgICAgICAgKTsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjR2F1c3NXaW5kb3coRklYUF9EQkwgKndpbiwgY29uc3QgaW50IHdpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB0cmFuc2Zvcm1SZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCB0aW1lUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHRpbWVSZXNvbHV0aW9uX2UpOwogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KAotICAgICAgICBGSVhQX0RCTCAqd2luLAotICAgICAgICBjb25zdCBpbnQgd2luU2l6ZSwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgY29uc3QgSU5UIHRyYW5zZm9ybVJlc29sdXRpb24sCi0gICAgICAgIGNvbnN0IEZJWFBfREJMIHRpbWVSZXNvbHV0aW9uLAotICAgICAgICBjb25zdCBJTlQgdGltZVJlc29sdXRpb25fZQotICAgICAgICApOwotCi1zdGF0aWMgY29uc3QgVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQqIEZES2FhY0VuY19HZXRUbnNQYXJhbSgKLSAgICAgICAgY29uc3QgSU5UIGJpdFJhdGUsCi0gICAgICAgIGNvbnN0IElOVCBjaGFubmVscywKLSAgICAgICAgY29uc3QgSU5UIHNickxkCi0gICAgICAgICkKLXsKK3N0YXRpYyBjb25zdCBUTlNfUEFSQU1FVEVSX1RBQlVMQVRFRCAqRkRLYWFjRW5jX0dldFRuc1BhcmFtKGNvbnN0IElOVCBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNickxkKSB7CiAgIGludCBpOwogICBjb25zdCBUTlNfUEFSQU1FVEVSX1RBQlVMQVRFRCAqdG5zQ29uZmlnVGFiID0gTlVMTDsKIAotICBmb3IgKGkgPSAwOyBpIDwgKGludCkgKHNpemVvZih0bnNJbmZvVGFiKS9zaXplb2YoVE5TX0lORk9fVEFCKSk7IGkrKykgewotICAgIGlmICgoYml0UmF0ZSA+PSB0bnNJbmZvVGFiW2ldLmJpdFJhdGVGcm9tW3NickxkPzE6MF0pICYmCi0gICAgICAgICBiaXRSYXRlIDw9IHRuc0luZm9UYWJbaV0uYml0UmF0ZVRvW3NickxkPzE6MF0pCi0gICAgewotICAgICAgdG5zQ29uZmlnVGFiID0gJnRuc0luZm9UYWJbaV0ucGFyYW1UYWJbKGNoYW5uZWxzPT0xKT8wOjFdOworICBmb3IgKGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKHRuc0luZm9UYWIpIC8gc2l6ZW9mKFROU19JTkZPX1RBQikpOyBpKyspIHsKKyAgICBpZiAoKGJpdFJhdGUgPj0gdG5zSW5mb1RhYltpXS5iaXRSYXRlRnJvbVtzYnJMZCA/IDEgOiAwXSkgJiYKKyAgICAgICAgYml0UmF0ZSA8PSB0bnNJbmZvVGFiW2ldLmJpdFJhdGVUb1tzYnJMZCA/IDEgOiAwXSkgeworICAgICAgdG5zQ29uZmlnVGFiID0gJnRuc0luZm9UYWJbaV0ucGFyYW1UYWJbKGNoYW5uZWxzID09IDEpID8gMCA6IDFdOwogICAgIH0KICAgfQogCiAgIHJldHVybiB0bnNDb25maWdUYWI7CiB9CiAKLQotc3RhdGljIElOVCBnZXRUbnNNYXhCYW5kcygKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGUsCi0gICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoLAotICAgICAgICBjb25zdCBJTlQgaXNTaG9ydEJsb2NrCi0gICAgICAgICkKLXsKK3N0YXRpYyBJTlQgZ2V0VG5zTWF4QmFuZHMoY29uc3QgSU5UIHNhbXBsZVJhdGUsIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaXNTaG9ydEJsb2NrKSB7CiAgIGludCBpOwogICBJTlQgbnVtQmFuZHMgPSAtMTsKICAgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgKnBNYXhCYW5kc1RhYiA9IE5VTEw7CiAgIGludCBtYXhCYW5kc1RhYlNpemUgPSAwOwogCiAgIHN3aXRjaCAoZ3JhbnVsZUxlbmd0aCkgeworICAgIGNhc2UgOTYwOgogICAgIGNhc2UgMTAyNDoKICAgICAgIHBNYXhCYW5kc1RhYiA9IHRuc01heEJhbmRzVGFiMTAyNDsKLSAgICAgIG1heEJhbmRzVGFiU2l6ZSA9IHNpemVvZih0bnNNYXhCYW5kc1RhYjEwMjQpL3NpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CisgICAgICBtYXhCYW5kc1RhYlNpemUgPSBzaXplb2YodG5zTWF4QmFuZHNUYWIxMDI0KSAvIHNpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDoKKyAgICAgIHBNYXhCYW5kc1RhYiA9IHRuc01heEJhbmRzVGFiMTIwOworICAgICAgbWF4QmFuZHNUYWJTaXplID0gc2l6ZW9mKHRuc01heEJhbmRzVGFiMTIwKSAvIHNpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyODoKKyAgICAgIHBNYXhCYW5kc1RhYiA9IHRuc01heEJhbmRzVGFiMTI4OworICAgICAgbWF4QmFuZHNUYWJTaXplID0gc2l6ZW9mKHRuc01heEJhbmRzVGFiMTI4KSAvIHNpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0MDoKKyAgICAgIHBNYXhCYW5kc1RhYiA9IHRuc01heEJhbmRzVGFiMjQwOworICAgICAgbWF4QmFuZHNUYWJTaXplID0gc2l6ZW9mKHRuc01heEJhbmRzVGFiMjQwKSAvIHNpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI1NjoKKyAgICAgIHBNYXhCYW5kc1RhYiA9IHRuc01heEJhbmRzVGFiMjU2OworICAgICAgbWF4QmFuZHNUYWJTaXplID0gc2l6ZW9mKHRuc01heEJhbmRzVGFiMjU2KSAvIHNpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIDQ4MDoKICAgICAgIHBNYXhCYW5kc1RhYiA9IHRuc01heEJhbmRzVGFiNDgwOwotICAgICAgbWF4QmFuZHNUYWJTaXplID0gc2l6ZW9mKHRuc01heEJhbmRzVGFiNDgwKS9zaXplb2YoVE5TX01BWF9UQUJfRU5UUlkpOworICAgICAgbWF4QmFuZHNUYWJTaXplID0gc2l6ZW9mKHRuc01heEJhbmRzVGFiNDgwKSAvIHNpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIDUxMjoKICAgICAgIHBNYXhCYW5kc1RhYiA9IHRuc01heEJhbmRzVGFiNTEyOwotICAgICAgbWF4QmFuZHNUYWJTaXplID0gc2l6ZW9mKHRuc01heEJhbmRzVGFiNTEyKS9zaXplb2YoVE5TX01BWF9UQUJfRU5UUlkpOworICAgICAgbWF4QmFuZHNUYWJTaXplID0gc2l6ZW9mKHRuc01heEJhbmRzVGFiNTEyKSAvIHNpemVvZihUTlNfTUFYX1RBQl9FTlRSWSk7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgbnVtQmFuZHMgPSAtMTsKICAgfQogCi0gIGlmIChwTWF4QmFuZHNUYWIhPU5VTEwpIHsKLSAgICBmb3IgKGk9MDsgaTxtYXhCYW5kc1RhYlNpemU7IGkrKykgewotICAgICAgbnVtQmFuZHMgPSBwTWF4QmFuZHNUYWJbaV0ubWF4QmFuZHNbKCFpc1Nob3J0QmxvY2spPzA6MV07CisgIGlmIChwTWF4QmFuZHNUYWIgIT0gTlVMTCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBtYXhCYW5kc1RhYlNpemU7IGkrKykgeworICAgICAgbnVtQmFuZHMgPSBwTWF4QmFuZHNUYWJbaV0ubWF4QmFuZHNbKCFpc1Nob3J0QmxvY2spID8gMCA6IDFdOwogICAgICAgaWYgKHNhbXBsZVJhdGUgPj0gcE1heEJhbmRzVGFiW2ldLnNhbXBsaW5nUmF0ZSkgewogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTI5MSw3ICszMjQsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCi0gIFxicmllZiAgICAgRkRLYWFjRW5jX0ZyZXFUb0JhbmRXaXRoUm91bmRpbmcKKyAgXGJyaWVmICAgICBGREthYWNFbmNfRnJlcVRvQmFuZFdpZHRoUm91bmRpbmcKIAogICBSZXR1cm5zIGluZGV4IG9mIG5lYXJlc3QgYmFuZCBib3JkZXIKIApAQCAtMzAzLDM4ICszMzYsMzEgQEAKICAgXHJldHVybiBiYW5kIGJvcmRlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotSU5UIEZES2FhY0VuY19GcmVxVG9CYW5kV2l0aFJvdW5kaW5nKAotICAgICAgICBjb25zdCBJTlQgZnJlcSwKLSAgICAgICAgY29uc3QgSU5UIGZzLAotICAgICAgICBjb25zdCBJTlQgbnVtT2ZCYW5kcywKLSAgICAgICAgY29uc3QgSU5UICpiYW5kU3RhcnRPZmZzZXQKLSAgICAgICAgKQoteworSU5UIEZES2FhY0VuY19GcmVxVG9CYW5kV2lkdGhSb3VuZGluZyhjb25zdCBJTlQgZnJlcSwgY29uc3QgSU5UIGZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtT2ZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpiYW5kU3RhcnRPZmZzZXQpIHsKICAgSU5UIGxpbmVOdW1iZXIsIGJhbmQ7CiAKICAgLyogIGFzc2VydChmcmVxID49IDApOyAgKi8KLSAgbGluZU51bWJlciA9IChmcmVxKmJhbmRTdGFydE9mZnNldFtudW1PZkJhbmRzXSo0L2ZzKzEpLzI7CisgIGxpbmVOdW1iZXIgPSAoZnJlcSAqIGJhbmRTdGFydE9mZnNldFtudW1PZkJhbmRzXSAqIDQgLyBmcyArIDEpIC8gMjsKIAogICAvKiBmcmVxID4gZnMvMiAqLwotICBpZiAobGluZU51bWJlciA+PSBiYW5kU3RhcnRPZmZzZXRbbnVtT2ZCYW5kc10pCi0gICAgcmV0dXJuIG51bU9mQmFuZHM7CisgIGlmIChsaW5lTnVtYmVyID49IGJhbmRTdGFydE9mZnNldFtudW1PZkJhbmRzXSkgcmV0dXJuIG51bU9mQmFuZHM7CiAKICAgLyogZmluZCBiYW5kIHRoZSBsaW5lIG51bWJlciBsaWVzIGluICovCi0gIGZvciAoYmFuZD0wOyBiYW5kPG51bU9mQmFuZHM7IGJhbmQrKykgewotICAgIGlmIChiYW5kU3RhcnRPZmZzZXRbYmFuZCsxXT5saW5lTnVtYmVyKSBicmVhazsKKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG51bU9mQmFuZHM7IGJhbmQrKykgeworICAgIGlmIChiYW5kU3RhcnRPZmZzZXRbYmFuZCArIDFdID4gbGluZU51bWJlcikgYnJlYWs7CiAgIH0KIAogICAvKiByb3VuZCB0byBuZWFyZXN0IGJhbmQgYm9yZGVyICovCiAgIGlmIChsaW5lTnVtYmVyIC0gYmFuZFN0YXJ0T2Zmc2V0W2JhbmRdID4KLSAgICAgIGJhbmRTdGFydE9mZnNldFtiYW5kKzFdIC0gbGluZU51bWJlciApCi0gICAgewotICAgICAgYmFuZCsrOwotICAgIH0KKyAgICAgIGJhbmRTdGFydE9mZnNldFtiYW5kICsgMV0gLSBsaW5lTnVtYmVyKSB7CisgICAgYmFuZCsrOworICB9CiAKLSAgcmV0dXJuKGJhbmQpOworICByZXR1cm4gKGJhbmQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfSW5pdFRuc0NvbmZpZ3VyYXRpb24KQEAgLTM0OCwxMTMgKzM3NCwxMzIgQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRUbnNDb25maWd1cmF0aW9uKElOVCBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYmxvY2tUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBpc0xvd0RlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZFNiclByZXNlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0NPTkZJRyAqdEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT04gKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHVzZVRuc1BlYWspCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFRuc0NvbmZpZ3VyYXRpb24oCisgICAgSU5UIGJpdFJhdGUsIElOVCBzYW1wbGVSYXRlLCBJTlQgY2hhbm5lbHMsIElOVCBibG9ja1R5cGUsIElOVCBncmFudWxlTGVuZ3RoLAorICAgIElOVCBpc0xvd0RlbGF5LCBJTlQgbGRTYnJQcmVzZW50LCBUTlNfQ09ORklHICp0QywgUFNZX0NPTkZJR1VSQVRJT04gKnBDLAorICAgIElOVCBhY3RpdmUsIElOVCB1c2VUbnNQZWFrKSB7CiAgIGludCBpOwotICAvL2Zsb2F0IGFjZlRpbWVSZXMgICA9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSA/IDAuMTI1ZiA6IDAuMDQ2ODc1ZjsKKyAgLy8gZmxvYXQgYWNmVGltZVJlcyAgID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gMC4xMjVmIDogMC4wNDY4NzVmOwogCi0gIGlmIChjaGFubmVscyA8PSAwKQotICAgIHJldHVybiAoQUFDX0VOQ09ERVJfRVJST1IpMTsKKyAgaWYgKGNoYW5uZWxzIDw9IDApIHJldHVybiAoQUFDX0VOQ09ERVJfRVJST1IpMTsKIAogICB0Qy0+aXNMb3dEZWxheSA9IGlzTG93RGVsYXk7CiAKLSAgLyogaW5pdGlhbGl6ZSBUTlMgZmlsdGVyIGZsYWcsIG9yZGVyLCBhbmQgY29lZmZpY2llbnQgcmVzb2x1dGlvbiAoaW4gYml0cyBwZXIgY29lZmYpICovCi0gIHRDLT50bnNBY3RpdmUgICAgICA9IChhY3RpdmUpID8gVFJVRSA6IEZBTFNFOwotICB0Qy0+bWF4T3JkZXIgICAgICAgPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgPyA1IDogMTI7ICAvKiBtYXhpbXVtOiA3LCAyMCAqLwotICBpZiAoYml0UmF0ZSA8IDE2MDAwKQotICAgIHRDLT5tYXhPcmRlciAtPSAyOwotICB0Qy0+Y29lZlJlcyAgICAgICAgPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgPyAzIDogNDsKKyAgLyogaW5pdGlhbGl6ZSBUTlMgZmlsdGVyIGZsYWcsIG9yZGVyLCBhbmQgY29lZmZpY2llbnQgcmVzb2x1dGlvbiAoaW4gYml0cyBwZXIKKyAgICogY29lZmYpICovCisgIHRDLT50bnNBY3RpdmUgPSAoYWN0aXZlKSA/IFRSVUUgOiBGQUxTRTsKKyAgdEMtPm1heE9yZGVyID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gNSA6IDEyOyAvKiBtYXhpbXVtOiA3LCAyMCAqLworICBpZiAoYml0UmF0ZSA8IDE2MDAwKSB0Qy0+bWF4T3JkZXIgLT0gMjsKKyAgdEMtPmNvZWZSZXMgPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgPyAzIDogNDsKIAotICAvKiBMUEMgc3RvcCBsaW5lOiBoaWdoZXN0IE1EQ1QgbGluZSB0byBiZSBjb2RlZCwgYnV0IGRvIG5vdCBnbyBiZXlvbmQgVE5TX01BWF9CQU5EUyEgKi8KLSAgdEMtPmxwY1N0b3BCYW5kID0gZ2V0VG5zTWF4QmFuZHMoc2FtcGxlUmF0ZSwgZ3JhbnVsZUxlbmd0aCwgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gMSA6IDApOworICAvKiBMUEMgc3RvcCBsaW5lOiBoaWdoZXN0IE1EQ1QgbGluZSB0byBiZSBjb2RlZCwgYnV0IGRvIG5vdCBnbyBiZXlvbmQKKyAgICogVE5TX01BWF9CQU5EUyEgKi8KKyAgdEMtPmxwY1N0b3BCYW5kID0gZ2V0VG5zTWF4QmFuZHMoc2FtcGxlUmF0ZSwgZ3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gMSA6IDApOwogCiAgIGlmICh0Qy0+bHBjU3RvcEJhbmQgPCAwKSB7CiAgICAgcmV0dXJuIChBQUNfRU5DT0RFUl9FUlJPUikxOwogICB9CiAKLSAgdEMtPmxwY1N0b3BCYW5kID0gRkRLbWluKHRDLT5scGNTdG9wQmFuZCwgcEMtPnNmYkFjdGl2ZSk7Ci0gIHRDLT5scGNTdG9wTGluZSAgICA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0b3BCYW5kXTsKKyAgdEMtPmxwY1N0b3BCYW5kID0gZk1pbih0Qy0+bHBjU3RvcEJhbmQsIHBDLT5zZmJBY3RpdmUpOworICB0Qy0+bHBjU3RvcExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdG9wQmFuZF07CiAKICAgc3dpdGNoIChncmFudWxlTGVuZ3RoKSB7CisgICAgY2FzZSA5NjA6CiAgICAgY2FzZSAxMDI0OgotICAgICAgLyogVE5TIHN0YXJ0IGxpbmU6IHNraXAgbG93ZXIgTURDVCBsaW5lcyB0byBwcmV2ZW50IGFydGlmYWN0cyBkdWUgdG8gZmlsdGVyIG1pc21hdGNoICovCi0gICAgICB0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF0gICA9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSA/IDAgOiAoKHNhbXBsZVJhdGUgPCAxODc4MykgPyA0IDogOCk7Ci0gICAgICB0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF0gICA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdXTsKKyAgICAgIC8qIFROUyBzdGFydCBsaW5lOiBza2lwIGxvd2VyIE1EQ1QgbGluZXMgdG8gcHJldmVudCBhcnRpZmFjdHMgZHVlIHRvCisgICAgICAgKiBmaWx0ZXIgbWlzbWF0Y2ggKi8KKyAgICAgIGlmIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSB7CisgICAgICAgIHRDLT5scGNTdGFydEJhbmRbTE9GSUxUXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF0gPQorICAgICAgICAgICAgKHNhbXBsZVJhdGUgPCA5MzkxKSA/IDIgOiAoKHNhbXBsZVJhdGUgPCAxODc4MykgPyA0IDogOCk7CisgICAgICB9CisgICAgICB0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF0gPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRbTE9GSUxUXV07CiAKICAgICAgIGkgPSB0Qy0+bHBjU3RvcEJhbmQ7Ci0gICAgICB3aGlsZSAocEMtPnNmYk9mZnNldFtpXSA+ICh0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF0gKyAodEMtPmxwY1N0b3BMaW5lIC0gdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdKSAvIDQpKSBpLS07Ci0gICAgICB0Qy0+bHBjU3RhcnRCYW5kW0hJRklMVF0gICA9IGk7Ci0gICAgICB0Qy0+bHBjU3RhcnRMaW5lW0hJRklMVF0gICA9IHBDLT5zZmJPZmZzZXRbaV07CisgICAgICB3aGlsZSAocEMtPnNmYk9mZnNldFtpXSA+CisgICAgICAgICAgICAgKHRDLT5scGNTdGFydExpbmVbTE9GSUxUXSArCisgICAgICAgICAgICAgICh0Qy0+bHBjU3RvcExpbmUgLSB0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF0pIC8gNCkpCisgICAgICAgIGktLTsKKyAgICAgIHRDLT5scGNTdGFydEJhbmRbSElGSUxUXSA9IGk7CisgICAgICB0Qy0+bHBjU3RhcnRMaW5lW0hJRklMVF0gPSBwQy0+c2ZiT2Zmc2V0W2ldOwogCiAgICAgICB0Qy0+Y29uZlRhYi50aHJlc2hPbltISUZJTFRdID0gMTQzNzsKICAgICAgIHRDLT5jb25mVGFiLnRocmVzaE9uW0xPRklMVF0gPSAxNTAwOwogCiAgICAgICB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0hJRklMVF0gPSB0Qy0+bWF4T3JkZXI7Ci0gICAgICB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0gPSB0Qy0+bWF4T3JkZXIgLSA3OworICAgICAgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdID0gZk1heCgwLCB0Qy0+bWF4T3JkZXIgLSA3KTsKIAogICAgICAgdEMtPmNvbmZUYWIudG5zRmlsdGVyRGlyZWN0aW9uW0hJRklMVF0gPSBGSUxURVJfRElSRUNUSU9OOwogICAgICAgdEMtPmNvbmZUYWIudG5zRmlsdGVyRGlyZWN0aW9uW0xPRklMVF0gPSBGSUxURVJfRElSRUNUSU9OOwogCi0gICAgICB0Qy0+Y29uZlRhYi5hY2ZTcGxpdFtISUZJTFRdID0gLTE7ICAvKiBzaWduYWwgTWVyZ2VkNHRvMlF1YXJ0ZXJzQXV0b0NvcnJlbGF0aW9uIGluIEZES2FhY0VuY19NZXJnZWRBdXRvQ29ycmVsYXRpb24qLwotICAgICAgdEMtPmNvbmZUYWIuYWNmU3BsaXRbTE9GSUxUXSA9IC0xOyAgLyogc2lnbmFsIE1lcmdlZDR0bzJRdWFydGVyc0F1dG9Db3JyZWxhdGlvbiBpbiBGREthYWNFbmNfTWVyZ2VkQXV0b0NvcnJlbGF0aW9uICovCisgICAgICB0Qy0+Y29uZlRhYi5hY2ZTcGxpdFtISUZJTFRdID0KKyAgICAgICAgICAtMTsgLyogc2lnbmFsIE1lcmdlZDR0bzJRdWFydGVyc0F1dG9Db3JyZWxhdGlvbiBpbgorICAgICAgICAgICAgICAgICBGREthYWNFbmNfTWVyZ2VkQXV0b0NvcnJlbGF0aW9uKi8KKyAgICAgIHRDLT5jb25mVGFiLmFjZlNwbGl0W0xPRklMVF0gPQorICAgICAgICAgIC0xOyAvKiBzaWduYWwgTWVyZ2VkNHRvMlF1YXJ0ZXJzQXV0b0NvcnJlbGF0aW9uIGluCisgICAgICAgICAgICAgICAgIEZES2FhY0VuY19NZXJnZWRBdXRvQ29ycmVsYXRpb24gKi8KIAogICAgICAgdEMtPmNvbmZUYWIuZmlsdGVyRW5hYmxlZFtISUZJTFRdID0gMTsKICAgICAgIHRDLT5jb25mVGFiLmZpbHRlckVuYWJsZWRbTE9GSUxUXSA9IDE7CiAgICAgICB0Qy0+Y29uZlRhYi5zZXBlcmF0ZUZpbHRlcnNBbGxvd2VkID0gMTsKIAotICAgICAgLyogY29tcHV0ZSBhdXRvY29ycmVsYXRpb24gd2luZG93IGJhc2VkIG9uIG1heGltdW0gZmlsdGVyIG9yZGVyIGZvciBnaXZlbiBibG9jayB0eXBlICovCisgICAgICAvKiBjb21wdXRlIGF1dG9jb3JyZWxhdGlvbiB3aW5kb3cgYmFzZWQgb24gbWF4aW11bSBmaWx0ZXIgb3JkZXIgZm9yIGdpdmVuCisgICAgICAgKiBibG9jayB0eXBlICovCiAgICAgICAvKiBmb3IgKGkgPSAwOyBpIDw9IHRDLT5tYXhPcmRlciArIDM7IGkrKykgewogICAgICAgICAgICBmbG9hdCBhY2ZXaW5UZW1wID0gYWNmVGltZVJlcyAqIGk7CiAgICAgICAgICAgIGFjZldpbmRvd1tpXSA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLSBhY2ZXaW5UZW1wICogYWNmV2luVGVtcCk7CiAgICAgICAgICB9CiAgICAgICAqLwogICAgICAgaWYgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpIHsKLSAgICAgICAgRkRLbWVtY3B5KHRDLT5hY2ZXaW5kb3dbSElGSUxUXSwgYWNmV2luZG93U2hvcnQsIEZES21pbihzaXplb2YoYWNmV2luZG93U2hvcnQpLCBzaXplb2YodEMtPmFjZldpbmRvd1tISUZJTFRdKSkpOwotICAgICAgICBGREttZW1jcHkodEMtPmFjZldpbmRvd1tMT0ZJTFRdLCBhY2ZXaW5kb3dTaG9ydCwgRkRLbWluKHNpemVvZihhY2ZXaW5kb3dTaG9ydCksIHNpemVvZih0Qy0+YWNmV2luZG93W0hJRklMVF0pKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgRkRLbWVtY3B5KHRDLT5hY2ZXaW5kb3dbSElGSUxUXSwgYWNmV2luZG93TG9uZywgRkRLbWluKHNpemVvZihhY2ZXaW5kb3dMb25nKSwgc2l6ZW9mKHRDLT5hY2ZXaW5kb3dbSElGSUxUXSkpKTsKLSAgICAgICAgRkRLbWVtY3B5KHRDLT5hY2ZXaW5kb3dbTE9GSUxUXSwgYWNmV2luZG93TG9uZywgRkRLbWluKHNpemVvZihhY2ZXaW5kb3dMb25nKSwgc2l6ZW9mKHRDLT5hY2ZXaW5kb3dbSElGSUxUXSkpKTsKKyAgICAgICAgRkRLbWVtY3B5KHRDLT5hY2ZXaW5kb3dbSElGSUxUXSwgYWNmV2luZG93U2hvcnQsCisgICAgICAgICAgICAgICAgICBmTWluKChMT05HKXNpemVvZihhY2ZXaW5kb3dTaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgIChMT05HKXNpemVvZih0Qy0+YWNmV2luZG93W0hJRklMVF0pKSk7CisgICAgICAgIEZES21lbWNweSh0Qy0+YWNmV2luZG93W0xPRklMVF0sIGFjZldpbmRvd1Nob3J0LAorICAgICAgICAgICAgICAgICAgZk1pbigoTE9ORylzaXplb2YoYWNmV2luZG93U2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAoTE9ORylzaXplb2YodEMtPmFjZldpbmRvd1tISUZJTFRdKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRkRLbWVtY3B5KHRDLT5hY2ZXaW5kb3dbSElGSUxUXSwgYWNmV2luZG93TG9uZywKKyAgICAgICAgICAgICAgICAgIGZNaW4oKExPTkcpc2l6ZW9mKGFjZldpbmRvd0xvbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAoTE9ORylzaXplb2YodEMtPmFjZldpbmRvd1tISUZJTFRdKSkpOworICAgICAgICBGREttZW1jcHkodEMtPmFjZldpbmRvd1tMT0ZJTFRdLCBhY2ZXaW5kb3dMb25nLAorICAgICAgICAgICAgICAgICAgZk1pbigoTE9ORylzaXplb2YoYWNmV2luZG93TG9uZyksCisgICAgICAgICAgICAgICAgICAgICAgIChMT05HKXNpemVvZih0Qy0+YWNmV2luZG93W0hJRklMVF0pKSk7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICBjYXNlIDQ4MDoKLSAgICBjYXNlIDUxMjoKLSAgICAgIHsKLSAgICAgICAgY29uc3QgVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQqIHBDZmcgPSBGREthYWNFbmNfR2V0VG5zUGFyYW0oYml0UmF0ZSwgY2hhbm5lbHMsIGxkU2JyUHJlc2VudCk7CisgICAgY2FzZSA1MTI6IHsKKyAgICAgIGNvbnN0IFROU19QQVJBTUVURVJfVEFCVUxBVEVEICpwQ2ZnID0KKyAgICAgICAgICBGREthYWNFbmNfR2V0VG5zUGFyYW0oYml0UmF0ZSwgY2hhbm5lbHMsIGxkU2JyUHJlc2VudCk7CisgICAgICBpZiAocENmZyAhPSBOVUxMKSB7CisgICAgICAgIEZES21lbWNweSgmKHRDLT5jb25mVGFiKSwgcENmZywgc2l6ZW9mKHRDLT5jb25mVGFiKSk7CiAKLSAgICAgICAgaWYgKCBwQ2ZnICE9IE5VTEwgKSB7CisgICAgICAgIHRDLT5scGNTdGFydEJhbmRbSElGSUxUXSA9IEZES2FhY0VuY19GcmVxVG9CYW5kV2lkdGhSb3VuZGluZygKKyAgICAgICAgICAgIHBDZmctPmZpbHRlclN0YXJ0RnJlcVtISUZJTFRdLCBzYW1wbGVSYXRlLCBwQy0+c2ZiQ250LAorICAgICAgICAgICAgcEMtPnNmYk9mZnNldCk7CisgICAgICAgIHRDLT5scGNTdGFydExpbmVbSElGSUxUXSA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0YXJ0QmFuZFtISUZJTFRdXTsKKyAgICAgICAgdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdID0gRkRLYWFjRW5jX0ZyZXFUb0JhbmRXaWR0aFJvdW5kaW5nKAorICAgICAgICAgICAgcENmZy0+ZmlsdGVyU3RhcnRGcmVxW0xPRklMVF0sIHNhbXBsZVJhdGUsIHBDLT5zZmJDbnQsCisgICAgICAgICAgICBwQy0+c2ZiT2Zmc2V0KTsKKyAgICAgICAgdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF1dOwogCi0gICAgICAgICAgRkRLbWVtY3B5KCYodEMtPmNvbmZUYWIpLCBwQ2ZnLCBzaXplb2YodEMtPmNvbmZUYWIpKTsKLQotICAgICAgICAgIHRDLT5scGNTdGFydEJhbmRbSElGSUxUXSAgICAgICAgID0gRkRLYWFjRW5jX0ZyZXFUb0JhbmRXaXRoUm91bmRpbmcocENmZy0+ZmlsdGVyU3RhcnRGcmVxW0hJRklMVF0sIHNhbXBsZVJhdGUsIHBDLT5zZmJDbnQsIHBDLT5zZmJPZmZzZXQpOwotICAgICAgICAgIHRDLT5scGNTdGFydExpbmVbSElGSUxUXSAgICAgICAgID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RhcnRCYW5kW0hJRklMVF1dOwotICAgICAgICAgIHRDLT5scGNTdGFydEJhbmRbTE9GSUxUXSAgICAgICAgID0gRkRLYWFjRW5jX0ZyZXFUb0JhbmRXaXRoUm91bmRpbmcocENmZy0+ZmlsdGVyU3RhcnRGcmVxW0xPRklMVF0sIHNhbXBsZVJhdGUsIHBDLT5zZmJDbnQsIHBDLT5zZmJPZmZzZXQpOwotICAgICAgICAgIHRDLT5scGNTdGFydExpbmVbTE9GSUxUXSAgICAgICAgID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF1dOwotCi0gICAgICAgICAgRkRLYWFjRW5jX0NhbGNHYXVzc1dpbmRvdyh0Qy0+YWNmV2luZG93W0hJRklMVF0sIHRDLT5tYXhPcmRlcisxLCBzYW1wbGVSYXRlLCBncmFudWxlTGVuZ3RoLCBwQ2ZnLT50bnNUaW1lUmVzb2x1dGlvbltISUZJTFRdLCBUTlNfVElNRVJFU19TQ0FMRSk7Ci0gICAgICAgICAgRkRLYWFjRW5jX0NhbGNHYXVzc1dpbmRvdyh0Qy0+YWNmV2luZG93W0xPRklMVF0sIHRDLT5tYXhPcmRlcisxLCBzYW1wbGVSYXRlLCBncmFudWxlTGVuZ3RoLCBwQ2ZnLT50bnNUaW1lUmVzb2x1dGlvbltMT0ZJTFRdLCBUTlNfVElNRVJFU19TQ0FMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgdEMtPnRuc0FjdGl2ZSA9IEZBTFNFOyAvKiBubyBjb25maWd1cmF0aW9uIGF2YWlsYWJsZSwgZGlzYWJsZSB0bnMgdG9vbCAqLwotICAgICAgICB9CisgICAgICAgIEZES2FhY0VuY19DYWxjR2F1c3NXaW5kb3coCisgICAgICAgICAgICB0Qy0+YWNmV2luZG93W0hJRklMVF0sIHRDLT5tYXhPcmRlciArIDEsIHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICBwQ2ZnLT50bnNUaW1lUmVzb2x1dGlvbltISUZJTFRdLCBUTlNfVElNRVJFU19TQ0FMRSk7CisgICAgICAgIEZES2FhY0VuY19DYWxjR2F1c3NXaW5kb3coCisgICAgICAgICAgICB0Qy0+YWNmV2luZG93W0xPRklMVF0sIHRDLT5tYXhPcmRlciArIDEsIHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICBwQ2ZnLT50bnNUaW1lUmVzb2x1dGlvbltMT0ZJTFRdLCBUTlNfVElNRVJFU19TQ0FMRSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0Qy0+dG5zQWN0aXZlID0KKyAgICAgICAgICAgIEZBTFNFOyAvKiBubyBjb25maWd1cmF0aW9uIGF2YWlsYWJsZSwgZGlzYWJsZSB0bnMgdG9vbCAqLwogICAgICAgfQotICAgICAgYnJlYWs7CisgICAgfSBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgdEMtPnRuc0FjdGl2ZSA9IEZBTFNFOyAvKiBubyBjb25maWd1cmF0aW9uIGF2YWlsYWJsZSwgZGlzYWJsZSB0bnMgdG9vbCAqLwogICB9CiAKICAgcmV0dXJuIEFBQ19FTkNfT0s7Ci0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ3MSwyOSArNTE2LDI1IEBACiAgIFxyZXR1cm4gc2NhbGUgZmFjdG9yCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW5saW5lIElOVCBGREthYWNFbmNfU2NhbGVVcFNwZWN0cnVtKAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgKmRlc3QsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAqc3JjLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHN0YXJ0TGluZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBzdG9wTGluZQotICAgICAgICApCi17Ci0gICAgSU5UIGksIHNjYWxlOworc3RhdGljIGlubGluZSBJTlQgRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bShGSVhQX0RCTCAqZGVzdCwgY29uc3QgRklYUF9EQkwgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN0YXJ0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN0b3BMaW5lKSB7CisgIElOVCBpLCBzY2FsZTsKIAotICAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAKLSAgICAvKiBHZXQgaGlnaGVzdCB2YWx1ZSBpbiBnaXZlbiBzcGVjdHJ1bSAqLwotICAgIGZvciAoaT1zdGFydExpbmU7IGk8c3RvcExpbmU7IGkrKykgewotICAgICAgbWF4VmFsID0gZml4TWF4KG1heFZhbCxmaXhwX2FicyhzcmNbaV0pKTsKLSAgICB9Ci0gICAgc2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKG1heFZhbCk7CisgIC8qIEdldCBoaWdoZXN0IHZhbHVlIGluIGdpdmVuIHNwZWN0cnVtICovCisgIGZvciAoaSA9IHN0YXJ0TGluZTsgaSA8IHN0b3BMaW5lOyBpKyspIHsKKyAgICBtYXhWYWwgPSBmaXhNYXgobWF4VmFsLCBmaXhwX2FicyhzcmNbaV0pKTsKKyAgfQorICBzY2FsZSA9IENvdW50TGVhZGluZ0JpdHMobWF4VmFsKTsKIAotICAgIC8qIFNjYWxlIHNwZWN0cnVtIGFjY29yZGluZyB0byBoaWdoZXN0IHZhbHVlICovCi0gICAgZm9yIChpPXN0YXJ0TGluZTsgaTxzdG9wTGluZTsgaSsrKSB7Ci0gICAgICBkZXN0W2ldID0gc3JjW2ldPDxzY2FsZTsKLSAgICB9CisgIC8qIFNjYWxlIHNwZWN0cnVtIGFjY29yZGluZyB0byBoaWdoZXN0IHZhbHVlICovCisgIGZvciAoaSA9IHN0YXJ0TGluZTsgaSA8IHN0b3BMaW5lOyBpKyspIHsKKyAgICBkZXN0W2ldID0gc3JjW2ldIDw8IHNjYWxlOworICB9CiAKLSAgICByZXR1cm4gc2NhbGU7CisgIHJldHVybiBzY2FsZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTUwOSwyOSArNTUwLDI3IEBACiAgIFxwYXJhbSBzY2FsaW5nIG9mIHRoZSBsYWcKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbmxpbmUgRklYUF9EQkwgRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKAotICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgKnNwZWN0cnVtLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHN0YXJ0TGluZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBzdG9wTGluZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBsYWcsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc2NhbGUKLSAgICAgICAgKQotewotICAgIGludCBpOwotICAgIEZJWFBfREJMIHJlc3VsdCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CitzdGF0aWMgaW5saW5lIEZJWFBfREJMIEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShjb25zdCBGSVhQX0RCTCAqc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RhcnRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN0b3BMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzY2FsZSkgeworICBpbnQgaTsKKyAgRklYUF9EQkwgcmVzdWx0ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKIAotICAgIGlmIChsYWc9PTApIHsKLSAgICAgIGZvciAoaT1zdGFydExpbmU7IGk8c3RvcExpbmU7IGkrKykgewotICAgICAgICByZXN1bHQgKz0gKGZQb3cyKHNwZWN0cnVtW2ldKT4+c2NhbGUpOwotICAgICAgfQorICAvKiBUaGlzIHZlcnNpb25zIGFsbG93cyB0byBzYXZlIG1lbW9yeSBhY2Nlc3Nlcywgd2hlbiBjb21wdXRpbmcgcG93MiAqLworICAvKiBJdCBpcyBvZiBpbnRlcmVzdCBmb3IgQVJNLCBYVEVOU0Egd2l0aG91dCBwYXJhbGxlbCBtZW1vcnkgYWNjZXNzICAqLworICBpZiAobGFnID09IDApIHsKKyAgICBmb3IgKGkgPSBzdGFydExpbmU7IGkgPCBzdG9wTGluZTsgaSsrKSB7CisgICAgICByZXN1bHQgKz0gKGZQb3cyKHNwZWN0cnVtW2ldKSA+PiBzY2FsZSk7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgZm9yIChpPXN0YXJ0TGluZTsgaTwoc3RvcExpbmUtbGFnKTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdCArPSAoZk11bHQoc3BlY3RydW1baV0sIHNwZWN0cnVtW2krbGFnXSk+PnNjYWxlKTsKLSAgICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSBzdGFydExpbmU7IGkgPCAoc3RvcExpbmUgLSBsYWcpOyBpKyspIHsKKyAgICAgIHJlc3VsdCArPSAoZk11bHQoc3BlY3RydW1baV0sIHNwZWN0cnVtW2kgKyBsYWddKSA+PiBzY2FsZSk7CiAgICAgfQorICB9CiAKLSAgICByZXR1cm4gcmVzdWx0OworICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTQ1LDE3MiArNTg0LDE3MyBAQAogICBccGFyYW0gZmlsdGVyIHN0YXJ0IGxpbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbmxpbmUgRklYUF9EQkwgRkRLYWFjRW5jX0F1dG9Db3JyTm9ybUZhYygKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICB2YWx1ZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBzY2FsZSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICpzYwotICAgICAgICApCi17Ci0gICAgI2RlZmluZSBITE1fTUlOX05SRyAwLjAwMDAwMDAwMzcyNTI5MDI5ODQ2MTkxNDA2MjVmIC8qIDJeLTI4ICovCi0gICAgI2RlZmluZSBNQVhfSU5WX05SR0ZBQyAoMS5mL0hMTV9NSU5fTlJHKQorc3RhdGljIGlubGluZSBGSVhQX0RCTCBGREthYWNFbmNfQXV0b0NvcnJOb3JtRmFjKGNvbnN0IEZJWFBfREJMIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzY2FsZSwgSU5UICpzYykgeworI2RlZmluZSBITE1fTUlOX05SRyAwLjAwMDAwMDAwMzcyNTI5MDI5ODQ2MTkxNDA2MjVmIC8qIDJeLTI4ICovCisjZGVmaW5lIE1BWF9JTlZfTlJHRkFDICgxLmYgLyBITE1fTUlOX05SRykKIAotICAgIEZJWFBfREJMIHJldFZhbHVlOwotICAgIEZJWFBfREJMIEEsIEI7CisgIEZJWFBfREJMIHJldFZhbHVlOworICBGSVhQX0RCTCBBLCBCOwogCi0gICAgaWYgKHNjYWxlPj0wKSB7Ci0gICAgICBBID0gdmFsdWU7Ci0gICAgICBCID0gRkwyRlhDT05TVF9EQkwoSExNX01JTl9OUkcpPj5maXhNaW4oREZSQUNUX0JJVFMtMSxzY2FsZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgQSA9IHZhbHVlPj5maXhNaW4oREZSQUNUX0JJVFMtMSwoLXNjYWxlKSk7Ci0gICAgICBCID0gRkwyRlhDT05TVF9EQkwoSExNX01JTl9OUkcpOwotICAgIH0KKyAgaWYgKHNjYWxlID49IDApIHsKKyAgICBBID0gdmFsdWU7CisgICAgQiA9IEZMMkZYQ09OU1RfREJMKEhMTV9NSU5fTlJHKSA+PiBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCBzY2FsZSk7CisgIH0gZWxzZSB7CisgICAgQSA9IHZhbHVlID4+IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsICgtc2NhbGUpKTsKKyAgICBCID0gRkwyRlhDT05TVF9EQkwoSExNX01JTl9OUkcpOworICB9CiAKLSAgICBpZiAoQSA+IEIpIHsKLSAgICAgIGludCBzaGlmdCA9IDA7Ci0gICAgICBGSVhQX0RCTCB0bXAgPSBpbnZTcXJ0Tm9ybTIodmFsdWUsJnNoaWZ0KTsKKyAgaWYgKEEgPiBCKSB7CisgICAgaW50IHNoaWZ0ID0gMDsKKyAgICBGSVhQX0RCTCB0bXAgPSBpbnZTcXJ0Tm9ybTIodmFsdWUsICZzaGlmdCk7CiAKLSAgICAgIHJldFZhbHVlID0gZk11bHQodG1wLHRtcCk7Ci0gICAgICAqc2MgKz0gKDIqc2hpZnQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIE1BWF9JTlZfTlJHRkFDKkZES3BvdygyLC0yOCkgPSAxLzJeLTI4ICogMl4tMjggPSAxLjAgKi8KLSAgICAgIHJldFZhbHVlID0gLypGTDJGWENPTlNUX0RCTChNQVhfSU5WX05SR0ZBQypGREtwb3coMiwtMjgpKSovIChGSVhQX0RCTClNQVhWQUxfREJMOwotICAgICAgKnNjICs9IHNjYWxlKzI4OwotICAgIH0KKyAgICByZXRWYWx1ZSA9IGZNdWx0KHRtcCwgdG1wKTsKKyAgICAqc2MgKz0gKDIgKiBzaGlmdCk7CisgIH0gZWxzZSB7CisgICAgLyogTUFYX0lOVl9OUkdGQUMqRkRLcG93KDIsLTI4KSA9IDEvMl4tMjggKiAyXi0yOCA9IDEuMCAqLworICAgIHJldFZhbHVlID0KKyAgICAgICAgLypGTDJGWENPTlNUX0RCTChNQVhfSU5WX05SR0ZBQypGREtwb3coMiwtMjgpKSovIChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICpzYyArPSBzY2FsZSArIDI4OworICB9CiAKLSAgICByZXR1cm4gcmV0VmFsdWU7CisgIHJldHVybiByZXRWYWx1ZTsKIH0KIAogc3RhdGljIHZvaWQgRkRLYWFjRW5jX01lcmdlZEF1dG9Db3JyZWxhdGlvbigKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICpzcGVjdHJ1bSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBpc0xvd0RlbGF5LAotICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgIGFjZldpbmRvd1tNQVhfTlVNX09GX0ZJTFRFUlNdW1ROU19NQVhfT1JERVIrMysxXSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBscGNTdGFydExpbmVbTUFYX05VTV9PRl9GSUxURVJTXSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBscGNTdG9wTGluZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBtYXhPcmRlciwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBhY2ZTcGxpdFtNQVhfTlVNX09GX0ZJTFRFUlNdLAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgKl9yeHgxLAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgKl9yeHgyCi0gICAgICAgICkKLXsKLSAgICBpbnQgaSwgaWR4MCwgaWR4MSwgaWR4MiwgaWR4MywgaWR4NCwgbGFnOwotICAgIEZJWFBfREJMIHJ4eDFfMCwgcnh4Ml8wLCByeHgzXzAsIHJ4eDRfMDsKKyAgICBjb25zdCBGSVhQX0RCTCAqc3BlY3RydW0sIGNvbnN0IElOVCBpc0xvd0RlbGF5LAorICAgIGNvbnN0IEZJWFBfREJMIGFjZldpbmRvd1tNQVhfTlVNX09GX0ZJTFRFUlNdW1ROU19NQVhfT1JERVIgKyAzICsgMV0sCisgICAgY29uc3QgSU5UIGxwY1N0YXJ0TGluZVtNQVhfTlVNX09GX0ZJTFRFUlNdLCBjb25zdCBJTlQgbHBjU3RvcExpbmUsCisgICAgY29uc3QgSU5UIG1heE9yZGVyLCBjb25zdCBJTlQgYWNmU3BsaXRbTUFYX05VTV9PRl9GSUxURVJTXSwgRklYUF9EQkwgKl9yeHgxLAorICAgIEZJWFBfREJMICpfcnh4MikgeworICBpbnQgaSwgaWR4MCwgaWR4MSwgaWR4MiwgaWR4MywgaWR4NCwgbGFnOworICBGSVhQX0RCTCByeHgxXzAsIHJ4eDJfMCwgcnh4M18wLCByeHg0XzA7CiAKLSAgICAvKiBidWZmZXIgZm9yIHRlbXBvcmFsIHNwZWN0cnVtICovCi0gICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBTcGVjdHJ1bSwgRklYUF9EQkwsICgxMDI0KSk7CisgIC8qIGJ1ZmZlciBmb3IgdGVtcG9yYWwgc3BlY3RydW0gKi8KKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBTcGVjdHJ1bSwgRklYUF9EQkwsICgxMDI0KSkKIAotICAgIC8qIHByZS1pbml0aWFsaXphdGlvbiBvdXRwdXQgKi8KLSAgICBGREttZW1jbGVhcigmX3J4eDFbMF0sIHNpemVvZihGSVhQX0RCTCkqKG1heE9yZGVyKzEpKTsKLSAgICBGREttZW1jbGVhcigmX3J4eDJbMF0sIHNpemVvZihGSVhQX0RCTCkqKG1heE9yZGVyKzEpKTsKKyAgLyogTURDVCBsaW5lIGluZGljZXMgc2VwYXJhdGluZyB0aGUgMXN0LCAybmQsIDNyZCwgYW5kIDR0aCBhbmFseXNpcyBxdWFydGVycworICAgKi8KKyAgaWYgKChhY2ZTcGxpdFtMT0ZJTFRdID09IC0xKSB8fCAoYWNmU3BsaXRbSElGSUxUXSA9PSAtMSkpIHsKKyAgICAvKiBhdXRvY29ycmVsYXRpb24gZnVuY3Rpb24gZm9yIDFzdCwgMm5kLCAzcmQsIGFuZCA0dGggcXVhcnRlciBvZiB0aGUKKyAgICAgKiBzcGVjdHJ1bSAqLworICAgIGlkeDAgPSBscGNTdGFydExpbmVbTE9GSUxUXTsKKyAgICBpID0gbHBjU3RvcExpbmUgLSBscGNTdGFydExpbmVbTE9GSUxUXTsKKyAgICBpZHgxID0gaWR4MCArIGkgLyA0OworICAgIGlkeDIgPSBpZHgwICsgaSAvIDI7CisgICAgaWR4MyA9IGlkeDAgKyBpICogMyAvIDQ7CisgICAgaWR4NCA9IGxwY1N0b3BMaW5lOworICB9IGVsc2UgeworICAgIEZES19BU1NFUlQoYWNmU3BsaXRbTE9GSUxUXSA9PSAxKTsKKyAgICBGREtfQVNTRVJUKGFjZlNwbGl0W0hJRklMVF0gPT0gMyk7CisgICAgaSA9IChscGNTdG9wTGluZSAtIGxwY1N0YXJ0TGluZVtISUZJTFRdKSAvIDM7CisgICAgaWR4MCA9IGxwY1N0YXJ0TGluZVtMT0ZJTFRdOworICAgIGlkeDEgPSBscGNTdGFydExpbmVbSElGSUxUXTsKKyAgICBpZHgyID0gaWR4MSArIGk7CisgICAgaWR4MyA9IGlkeDIgKyBpOworICAgIGlkeDQgPSBscGNTdG9wTGluZTsKKyAgfQogCi0gICAgaWR4MCA9IGlkeDEgPSBpZHgyID0gaWR4MyA9IGlkeDQgPSAwOworICAvKiBjb3B5IHNwZWN0cnVtIHRvIHRlbXBvcmFsIGJ1ZmZlciBhbmQgc2NhbGUgdXAgYXMgbXVjaCBhcyBwb3NzaWJsZSAqLworICBJTlQgc2MxID0gRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bShwU3BlY3RydW0sIHNwZWN0cnVtLCBpZHgwLCBpZHgxKTsKKyAgSU5UIHNjMiA9IEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0ocFNwZWN0cnVtLCBzcGVjdHJ1bSwgaWR4MSwgaWR4Mik7CisgIElOVCBzYzMgPSBGREthYWNFbmNfU2NhbGVVcFNwZWN0cnVtKHBTcGVjdHJ1bSwgc3BlY3RydW0sIGlkeDIsIGlkeDMpOworICBJTlQgc2M0ID0gRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bShwU3BlY3RydW0sIHNwZWN0cnVtLCBpZHgzLCBpZHg0KTsKIAotICAgIC8qIE1EQ1QgbGluZSBpbmRpY2VzIHNlcGFyYXRpbmcgdGhlIDFzdCwgMm5kLCAzcmQsIGFuZCA0dGggYW5hbHlzaXMgcXVhcnRlcnMgKi8KLSAgICBpZiAoIChhY2ZTcGxpdFtMT0ZJTFRdPT0tMSkgfHwgKGFjZlNwbGl0W0hJRklMVF09PS0xKSApIHsKLSAgICAgIC8qIGF1dG9jb3JyZWxhdGlvbiBmdW5jdGlvbiBmb3IgMXN0LCAybmQsIDNyZCwgYW5kIDR0aCBxdWFydGVyIG9mIHRoZSBzcGVjdHJ1bSAqLwotICAgICAgaWR4MCA9IGxwY1N0YXJ0TGluZVtMT0ZJTFRdOwotICAgICAgaSAgICA9IGxwY1N0b3BMaW5lIC0gbHBjU3RhcnRMaW5lW0xPRklMVF07Ci0gICAgICBpZHgxID0gaWR4MCArIGkgLyA0OwotICAgICAgaWR4MiA9IGlkeDAgKyBpIC8gMjsKLSAgICAgIGlkeDMgPSBpZHgwICsgaSAqIDMgLyA0OwotICAgICAgaWR4NCA9IGxwY1N0b3BMaW5lOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIEZES19BU1NFUlQoYWNmU3BsaXRbTE9GSUxUXT09MSk7Ci0gICAgICBGREtfQVNTRVJUKGFjZlNwbGl0W0hJRklMVF09PTMpOwotICAgICAgaSAgICA9IChscGNTdG9wTGluZSAtIGxwY1N0YXJ0TGluZVtISUZJTFRdKSAvIDM7Ci0gICAgICBpZHgwID0gbHBjU3RhcnRMaW5lW0xPRklMVF07Ci0gICAgICBpZHgxID0gbHBjU3RhcnRMaW5lW0hJRklMVF07Ci0gICAgICBpZHgyID0gaWR4MSArIGk7Ci0gICAgICBpZHgzID0gaWR4MiArIGk7Ci0gICAgICBpZHg0ID0gbHBjU3RvcExpbmU7Ci0gICAgfQorICAvKiBnZXQgc2NhbGluZyB2YWx1ZXMgZm9yIHN1bW1hdGlvbiAqLworICBJTlQgbnNjMSwgbnNjMiwgbnNjMywgbnNjNDsKKyAgZm9yIChuc2MxID0gMTsgKDEgPDwgbnNjMSkgPCAoaWR4MSAtIGlkeDApOyBuc2MxKyspCisgICAgOworICBmb3IgKG5zYzIgPSAxOyAoMSA8PCBuc2MyKSA8IChpZHgyIC0gaWR4MSk7IG5zYzIrKykKKyAgICA7CisgIGZvciAobnNjMyA9IDE7ICgxIDw8IG5zYzMpIDwgKGlkeDMgLSBpZHgyKTsgbnNjMysrKQorICAgIDsKKyAgZm9yIChuc2M0ID0gMTsgKDEgPDwgbnNjNCkgPCAoaWR4NCAtIGlkeDMpOyBuc2M0KyspCisgICAgOwogCi0gICAgLyogY29weSBzcGVjdHJ1bSB0byB0ZW1wb3JhbCBidWZmZXIgYW5kIHNjYWxlIHVwIGFzIG11Y2ggYXMgcG9zc2libGUgKi8KLSAgICBJTlQgc2MxID0gRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bShwU3BlY3RydW0sIHNwZWN0cnVtLCBpZHgwLCBpZHgxKTsKLSAgICBJTlQgc2MyID0gRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bShwU3BlY3RydW0sIHNwZWN0cnVtLCBpZHgxLCBpZHgyKTsKLSAgICBJTlQgc2MzID0gRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bShwU3BlY3RydW0sIHNwZWN0cnVtLCBpZHgyLCBpZHgzKTsKLSAgICBJTlQgc2M0ID0gRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bShwU3BlY3RydW0sIHNwZWN0cnVtLCBpZHgzLCBpZHg0KTsKKyAgLyogY29tcHV0ZSBhdXRvY29ycmVsYXRpb24gdmFsdWUgYXQgbGFnIHplcm8sIGkuIGUuIGVuZXJneSwgZm9yIGVhY2ggcXVhcnRlcgorICAgKi8KKyAgcnh4MV8wID0gRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MCwgaWR4MSwgMCwgbnNjMSk7CisgIHJ4eDJfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDEsIGlkeDIsIDAsIG5zYzIpOworICByeHgzXzAgPSBGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgyLCBpZHgzLCAwLCBuc2MzKTsKKyAgcnh4NF8wID0gRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MywgaWR4NCwgMCwgbnNjNCk7CiAKLSAgICAvKiBnZXQgc2NhbGluZyB2YWx1ZXMgZm9yIHN1bW1hdGlvbiAqLwotICAgIElOVCBuc2MxLCBuc2MyLCBuc2MzLCBuc2M0OwotICAgIGZvciAobnNjMT0xOyAoMTw8bnNjMSk8KGlkeDEtaWR4MCk7IG5zYzErKyk7Ci0gICAgZm9yIChuc2MyPTE7ICgxPDxuc2MyKTwoaWR4Mi1pZHgxKTsgbnNjMisrKTsKLSAgICBmb3IgKG5zYzM9MTsgKDE8PG5zYzMpPChpZHgzLWlkeDIpOyBuc2MzKyspOwotICAgIGZvciAobnNjND0xOyAoMTw8bnNjNCk8KGlkeDQtaWR4Myk7IG5zYzQrKyk7CisgIC8qIGNvbXB1dGUgZW5lcmd5IG5vcm1hbGl6YXRpb24gZmFjdG9ycywgaS4gZS4gMS9lbmVyZ3kgKHNhdmVzIHNvbWUgZGl2aXNpb25zKQorICAgKi8KKyAgaWYgKHJ4eDFfMCAhPSBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgSU5UIHNjX2ZhYzEgPSAtMTsKKyAgICBGSVhQX0RCTCBmYWMxID0KKyAgICAgICAgRkRLYWFjRW5jX0F1dG9Db3JyTm9ybUZhYyhyeHgxXzAsICgoLTIgKiBzYzEpICsgbnNjMSksICZzY19mYWMxKTsKKyAgICBfcnh4MVswXSA9IHNjYWxlVmFsdWUoZk11bHQocnh4MV8wLCBmYWMxKSwgc2NfZmFjMSk7CiAKLSAgICAvKiBjb21wdXRlIGF1dG9jb3JyZWxhdGlvbiB2YWx1ZSBhdCBsYWcgemVybywgaS4gZS4gZW5lcmd5LCBmb3IgZWFjaCBxdWFydGVyICovCi0gICAgcnh4MV8wID0gRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MCwgaWR4MSwgMCwgbnNjMSk7Ci0gICAgcnh4Ml8wID0gRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MSwgaWR4MiwgMCwgbnNjMik7Ci0gICAgcnh4M18wID0gRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MiwgaWR4MywgMCwgbnNjMyk7Ci0gICAgcnh4NF8wID0gRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MywgaWR4NCwgMCwgbnNjNCk7Ci0KLSAgICAvKiBjb21wdXRlIGVuZXJneSBub3JtYWxpemF0aW9uIGZhY3RvcnMsIGkuIGUuIDEvZW5lcmd5IChzYXZlcyBzb21lIGRpdmlzaW9ucykgKi8KLSAgICBpZiAocnh4MV8wICE9IEZMMkZYQ09OU1RfREJMKDAuZikpCi0gICAgewotICAgICAgSU5UIHNjX2ZhYzEgPSAtMTsKLSAgICAgIEZJWFBfREJMIGZhYzEgPSBGREthYWNFbmNfQXV0b0NvcnJOb3JtRmFjKHJ4eDFfMCwgKCgtMipzYzEpK25zYzEpLCAmc2NfZmFjMSk7Ci0gICAgICBfcnh4MVswXSA9IHNjYWxlVmFsdWUoZk11bHQocnh4MV8wLGZhYzEpLHNjX2ZhYzEpOwotCi0gICAgICBpZiAoaXNMb3dEZWxheSkKLSAgICAgIHsKLSAgICAgICAgZm9yIChsYWcgPSAxOyBsYWcgPD0gbWF4T3JkZXI7IGxhZysrKSB7Ci0gICAgICAgICAgLyogY29tcHV0ZSBlbmVyZ3ktbm9ybWFsaXplZCBhbmQgd2luZG93ZWQgYXV0b2NvcnJlbGF0aW9uIHZhbHVlcyBhdCB0aGlzIGxhZyAqLwotICAgICAgICAgIEZJWFBfREJMIHgxID0gRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MCwgaWR4MSwgbGFnLCBuc2MxKTsKLSAgICAgICAgICBfcnh4MVtsYWddID0gZk11bHQoc2NhbGVWYWx1ZShmTXVsdCh4MSxmYWMxKSxzY19mYWMxKSwgYWNmV2luZG93W0xPRklMVF1bbGFnXSk7Ci0gICAgICAgIH0KKyAgICBpZiAoaXNMb3dEZWxheSkgeworICAgICAgZm9yIChsYWcgPSAxOyBsYWcgPD0gbWF4T3JkZXI7IGxhZysrKSB7CisgICAgICAgIC8qIGNvbXB1dGUgZW5lcmd5LW5vcm1hbGl6ZWQgYW5kIHdpbmRvd2VkIGF1dG9jb3JyZWxhdGlvbiB2YWx1ZXMgYXQgdGhpcworICAgICAgICAgKiBsYWcgKi8KKyAgICAgICAgRklYUF9EQkwgeDEgPQorICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MCwgaWR4MSwgbGFnLCBuc2MxKTsKKyAgICAgICAgX3J4eDFbbGFnXSA9CisgICAgICAgICAgICBmTXVsdChzY2FsZVZhbHVlKGZNdWx0KHgxLCBmYWMxKSwgc2NfZmFjMSksIGFjZldpbmRvd1tMT0ZJTFRdW2xhZ10pOwogICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmb3IgKGxhZyA9IDE7IGxhZyA8PSBtYXhPcmRlcjsgbGFnKyspIHsKLSAgICAgICAgICBpZiAoKDMgKiBsYWcpIDw9IG1heE9yZGVyICsgMykgewotICAgICAgICAgICAgICBGSVhQX0RCTCB4MSA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDAsIGlkeDEsIGxhZywgbnNjMSk7Ci0gICAgICAgICAgICAgIF9yeHgxW2xhZ10gPSBmTXVsdChzY2FsZVZhbHVlKGZNdWx0KHgxLGZhYzEpLHNjX2ZhYzEpLCBhY2ZXaW5kb3dbTE9GSUxUXVszKmxhZ10pOwotICAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChsYWcgPSAxOyBsYWcgPD0gbWF4T3JkZXI7IGxhZysrKSB7CisgICAgICAgIGlmICgoMyAqIGxhZykgPD0gbWF4T3JkZXIgKyAzKSB7CisgICAgICAgICAgRklYUF9EQkwgeDEgPQorICAgICAgICAgICAgICBGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgwLCBpZHgxLCBsYWcsIG5zYzEpOworICAgICAgICAgIF9yeHgxW2xhZ10gPSBmTXVsdChzY2FsZVZhbHVlKGZNdWx0KHgxLCBmYWMxKSwgc2NfZmFjMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjZldpbmRvd1tMT0ZJTFRdWzMgKiBsYWddKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KKyAgfQogCi0gICAgLyogYXV0byBjb3JyIG92ZXIgdXBwZXIgMy80IG9mIHNwZWN0cnVtICovCi0gICAgaWYgKCAhKChyeHgyXzAgPT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgJiYgKHJ4eDNfMCA9PSBGTDJGWENPTlNUX0RCTCgwLmYpKSAmJiAocnh4NF8wID09IEZMMkZYQ09OU1RfREJMKDAuZikpKSApCi0gICAgewotICAgICAgICBGSVhQX0RCTCBmYWMyLCBmYWMzLCBmYWM0OwotICAgICAgICBmYWMyID0gZmFjMyA9IGZhYzQgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgICAgICBJTlQgc2NfZmFjMiwgc2NfZmFjMywgc2NfZmFjNDsKLSAgICAgICAgc2NfZmFjMiA9IHNjX2ZhYzMgPSBzY19mYWM0ID0gMDsKKyAgLyogYXV0byBjb3JyIG92ZXIgdXBwZXIgMy80IG9mIHNwZWN0cnVtICovCisgIGlmICghKChyeHgyXzAgPT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgJiYgKHJ4eDNfMCA9PSBGTDJGWENPTlNUX0RCTCgwLmYpKSAmJgorICAgICAgICAocnh4NF8wID09IEZMMkZYQ09OU1RfREJMKDAuZikpKSkgeworICAgIEZJWFBfREJMIGZhYzIsIGZhYzMsIGZhYzQ7CisgICAgZmFjMiA9IGZhYzMgPSBmYWM0ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICBJTlQgc2NfZmFjMiwgc2NfZmFjMywgc2NfZmFjNDsKKyAgICBzY19mYWMyID0gc2NfZmFjMyA9IHNjX2ZhYzQgPSAwOwogCi0gICAgICAgIGlmIChyeHgyXzAhPUZMMkZYQ09OU1RfREJMKDAuZikpIHsKLSAgICAgICAgICBmYWMyID0gRkRLYWFjRW5jX0F1dG9Db3JyTm9ybUZhYyhyeHgyXzAsICgoLTIqc2MyKStuc2MyKSwgJnNjX2ZhYzIpOwotICAgICAgICAgIHNjX2ZhYzIgLT0gMjsKLSAgICAgICAgfQotICAgICAgICBpZiAocnh4M18wIT1GTDJGWENPTlNUX0RCTCgwLmYpKSB7Ci0gICAgICAgICAgZmFjMyA9IEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMocnh4M18wLCAoKC0yKnNjMykrbnNjMyksICZzY19mYWMzKTsKLSAgICAgICAgICBzY19mYWMzIC09IDI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ4eDRfMCE9RkwyRlhDT05TVF9EQkwoMC5mKSkgewotICAgICAgICAgIGZhYzQgPSBGREthYWNFbmNfQXV0b0NvcnJOb3JtRmFjKHJ4eDRfMCwgKCgtMipzYzQpK25zYzQpLCAmc2NfZmFjNCk7Ci0gICAgICAgICAgc2NfZmFjNCAtPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgX3J4eDJbMF0gPSBzY2FsZVZhbHVlKGZNdWx0KHJ4eDJfMCxmYWMyKSxzY19mYWMyKSArCi0gICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdChyeHgzXzAsZmFjMyksc2NfZmFjMykgKwotICAgICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUoZk11bHQocnh4NF8wLGZhYzQpLHNjX2ZhYzQpOwotCi0gICAgICAgIGZvciAobGFnID0gMTsgbGFnIDw9IG1heE9yZGVyOyBsYWcrKykgewotICAgICAgICAgIC8qIG1lcmdlIHF1YXJ0ZXJzIDIsIDMsIDQgaW50byBvbmUgYXV0b2NvcnJlbGF0aW9uOyBxdWFydGVyIDEgc3RheXMgc2VwYXJhdGUgKi8KLSAgICAgICAgICBGSVhQX0RCTCB4MiA9IHNjYWxlVmFsdWUoZk11bHQoRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MSwgaWR4MiwgbGFnLCBuc2MyKSwgZmFjMiksc2NfZmFjMikgKwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdChGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgyLCBpZHgzLCBsYWcsIG5zYzMpLCBmYWMzKSxzY19mYWMzKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKGZNdWx0KEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDMsIGlkeDQsIGxhZywgbnNjNCksIGZhYzQpLHNjX2ZhYzQpOwotCi0gICAgICAgICAgX3J4eDJbbGFnXSA9IGZNdWx0KHgyLCBhY2ZXaW5kb3dbSElGSUxUXVtsYWddKTsKLSAgICAgICAgfQorICAgIGlmIChyeHgyXzAgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgZmFjMiA9IEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMocnh4Ml8wLCAoKC0yICogc2MyKSArIG5zYzIpLCAmc2NfZmFjMik7CisgICAgICBzY19mYWMyIC09IDI7CisgICAgfQorICAgIGlmIChyeHgzXzAgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgZmFjMyA9IEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMocnh4M18wLCAoKC0yICogc2MzKSArIG5zYzMpLCAmc2NfZmFjMyk7CisgICAgICBzY19mYWMzIC09IDI7CisgICAgfQorICAgIGlmIChyeHg0XzAgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgZmFjNCA9IEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMocnh4NF8wLCAoKC0yICogc2M0KSArIG5zYzQpLCAmc2NfZmFjNCk7CisgICAgICBzY19mYWM0IC09IDI7CiAgICAgfQogCi0gICAgQ19BTExPQ19TQ1JBVENIX0VORChwU3BlY3RydW0sIEZJWFBfREJMLCAoMTAyNCkpOworICAgIF9yeHgyWzBdID0gc2NhbGVWYWx1ZShmTXVsdChyeHgyXzAsIGZhYzIpLCBzY19mYWMyKSArCisgICAgICAgICAgICAgICBzY2FsZVZhbHVlKGZNdWx0KHJ4eDNfMCwgZmFjMyksIHNjX2ZhYzMpICsKKyAgICAgICAgICAgICAgIHNjYWxlVmFsdWUoZk11bHQocnh4NF8wLCBmYWM0KSwgc2NfZmFjNCk7CisKKyAgICBmb3IgKGxhZyA9IDE7IGxhZyA8PSBtYXhPcmRlcjsgbGFnKyspIHsKKyAgICAgIC8qIG1lcmdlIHF1YXJ0ZXJzIDIsIDMsIDQgaW50byBvbmUgYXV0b2NvcnJlbGF0aW9uOyBxdWFydGVyIDEgc3RheXMKKyAgICAgICAqIHNlcGFyYXRlICovCisgICAgICBGSVhQX0RCTCB4MiA9IHNjYWxlVmFsdWUoZk11bHQoRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BlY3RydW0sIGlkeDEsIGlkeDIsIGxhZywgbnNjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NfZmFjMikgKworICAgICAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKGZNdWx0KEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwZWN0cnVtLCBpZHgyLCBpZHgzLCBsYWcsIG5zYzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhYzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjX2ZhYzMpICsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdChGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGVjdHJ1bSwgaWR4MywgaWR4NCwgbGFnLCBuc2M0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWM0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY19mYWM0KTsKKworICAgICAgX3J4eDJbbGFnXSA9IGZNdWx0KHgyLCBhY2ZXaW5kb3dbSElGSUxUXVtsYWddKTsKKyAgICB9CisgIH0KKworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBTcGVjdHJ1bSwgRklYUF9EQkwsICgxMDI0KSkKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19UbnNEZXRlY3QKICAgICBkZXNjcmlwdGlvbjogIGRvIGRlY2lzaW9uLCBpZiBUTlMgc2hhbGwgYmUgdXNlZCBvciBub3QKQEAgLTcyMyw2OSArNzYzLDcwIEBACiAgICAgICAgICAgICAgICAgICBzZmItd2lzZSBlbmVyZ3kuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UIEZES2FhY0VuY19UbnNEZXRlY3QoCi0gICAgICAgICAgICAgIFROU19EQVRBICp0bnNEYXRhLAotICAgICAgICAgICAgICBjb25zdCBUTlNfQ09ORklHICp0QywKLSAgICAgICAgICAgICAgVE5TX0lORk8qIHRuc0luZm8sCi0gICAgICAgICAgICAgIElOVCBzZmJDbnQsCi0gICAgICAgICAgICAgIEZJWFBfREJMICpzcGVjdHJ1bSwKLSAgICAgICAgICAgICAgSU5UIHN1YkJsb2NrTnVtYmVyLAotICAgICAgICAgICAgICBJTlQgYmxvY2tUeXBlCi0gICAgICAgICAgICAgICkKLXsKLSAgLyogYXV0b2NvcnJlbGF0aW9uIGZ1bmN0aW9uIGZvciAxc3QsIDJuZCwgM3JkLCBhbmQgNHRoIHF1YXJ0ZXIgb2YgdGhlIHNwZWN0cnVtLiAqLwotICBGSVhQX0RCTCByeHgxW1ROU19NQVhfT1JERVIrMV07IC8qIGhpZ2hlciBwYXJ0ICovCi0gIEZJWFBfREJMIHJ4eDJbVE5TX01BWF9PUkRFUisxXTsgLyogbG93ZXIgcGFydCAqLwotICBGSVhQX0RCTCBwYXJjb3JfdG1wW1ROU19NQVhfT1JERVJdOworSU5UIEZES2FhY0VuY19UbnNEZXRlY3QoVE5TX0RBVEEgKnRuc0RhdGEsIGNvbnN0IFROU19DT05GSUcgKnRDLAorICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0lORk8gKnRuc0luZm8sIElOVCBzZmJDbnQsIGNvbnN0IEZJWFBfREJMICpzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdWJCbG9ja051bWJlciwgSU5UIGJsb2NrVHlwZSkgeworICAvKiBhdXRvY29ycmVsYXRpb24gZnVuY3Rpb24gZm9yIDFzdCwgMm5kLCAzcmQsIGFuZCA0dGggcXVhcnRlciBvZiB0aGUKKyAgICogc3BlY3RydW0uICovCisgIEZJWFBfREJMIHJ4eDFbVE5TX01BWF9PUkRFUiArIDFdOyAvKiBoaWdoZXIgcGFydCAqLworICBGSVhQX0RCTCByeHgyW1ROU19NQVhfT1JERVIgKyAxXTsgLyogbG93ZXIgcGFydCAqLworICBGSVhQX0xQQyBwYXJjb3JfdG1wW1ROU19NQVhfT1JERVJdOwogCiAgIGludCBpOwogCi0gIFROU19TVUJCTE9DS19JTkZPICp0c2JpID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpCi0gICAgPyAmdG5zRGF0YS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdCi0gICAgOiAmdG5zRGF0YS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mbzsKKyAgRkRLbWVtY2xlYXIocnh4MSwgc2l6ZW9mKHJ4eDEpKTsKKyAgRkRLbWVtY2xlYXIocnh4Miwgc2l6ZW9mKHJ4eDIpKTsKIAotICB0bnNEYXRhLT5maWx0ZXJzTWVyZ2VkICA9IEZBTFNFOworICBUTlNfU1VCQkxPQ0tfSU5GTyAqdHNiaSA9CisgICAgICAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykKKyAgICAgICAgICA/ICZ0bnNEYXRhLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0KKyAgICAgICAgICA6ICZ0bnNEYXRhLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvOwogCi0gIHRzYmktPnRuc0FjdGl2ZVtISUZJTFRdICAgICAgICAgPSBGQUxTRTsKLSAgdHNiaS0+cHJlZGljdGlvbkdhaW5bSElGSUxUXSAgICA9IDEwMDA7Ci0gIHRzYmktPnRuc0FjdGl2ZVtMT0ZJTFRdICAgICAgICAgPSBGQUxTRTsKLSAgdHNiaS0+cHJlZGljdGlvbkdhaW5bTE9GSUxUXSAgICA9IDEwMDA7CisgIHRuc0RhdGEtPmZpbHRlcnNNZXJnZWQgPSBGQUxTRTsKKworICB0c2JpLT50bnNBY3RpdmVbSElGSUxUXSA9IEZBTFNFOworICB0c2JpLT5wcmVkaWN0aW9uR2FpbltISUZJTFRdID0gMTAwMDsKKyAgdHNiaS0+dG5zQWN0aXZlW0xPRklMVF0gPSBGQUxTRTsKKyAgdHNiaS0+cHJlZGljdGlvbkdhaW5bTE9GSUxUXSA9IDEwMDA7CiAKICAgdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW3N1YkJsb2NrTnVtYmVyXSA9IDA7Ci0gIHRuc0luZm8tPmNvZWZSZXNbc3ViQmxvY2tOdW1iZXJdICAgICAgPSB0Qy0+Y29lZlJlczsKKyAgdG5zSW5mby0+Y29lZlJlc1tzdWJCbG9ja051bWJlcl0gPSB0Qy0+Y29lZlJlczsKICAgZm9yIChpID0gMDsgaSA8IHRDLT5tYXhPcmRlcjsgaSsrKSB7Ci0gICAgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXSA9IHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF1baV0gPSAwOworICAgIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV0gPQorICAgICAgICB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldID0gMDsKICAgfQogCi0gIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl1bSElGSUxUXSA9IHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9IDA7Ci0gIHRuc0luZm8tPm9yZGVyIFtzdWJCbG9ja051bWJlcl1bSElGSUxUXSA9IHRuc0luZm8tPm9yZGVyIFtzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9IDA7CisgIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl1bSElGSUxUXSA9CisgICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF0gPSAwOworICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1bSElGSUxUXSA9CisgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9IDA7CiAKLSAgaWYgKCAodEMtPnRuc0FjdGl2ZSkgJiYgKHRDLT5tYXhPcmRlcj4wKSApCi0gIHsKKyAgaWYgKCh0Qy0+dG5zQWN0aXZlKSAmJiAodEMtPm1heE9yZGVyID4gMCkpIHsKICAgICBpbnQgc3VtU3FyQ29lZjsKIAogICAgIEZES2FhY0VuY19NZXJnZWRBdXRvQ29ycmVsYXRpb24oCi0gICAgICAgICAgc3BlY3RydW0sCi0gICAgICAgICAgdEMtPmlzTG93RGVsYXksCi0gICAgICAgICAgdEMtPmFjZldpbmRvdywKLSAgICAgICAgICB0Qy0+bHBjU3RhcnRMaW5lLAotICAgICAgICAgIHRDLT5scGNTdG9wTGluZSwKLSAgICAgICAgICB0Qy0+bWF4T3JkZXIsCi0gICAgICAgICAgdEMtPmNvbmZUYWIuYWNmU3BsaXQsCi0gICAgICAgICAgcnh4MSwKLSAgICAgICAgICByeHgyKTsKKyAgICAgICAgc3BlY3RydW0sIHRDLT5pc0xvd0RlbGF5LCB0Qy0+YWNmV2luZG93LCB0Qy0+bHBjU3RhcnRMaW5lLAorICAgICAgICB0Qy0+bHBjU3RvcExpbmUsIHRDLT5tYXhPcmRlciwgdEMtPmNvbmZUYWIuYWNmU3BsaXQsIHJ4eDEsIHJ4eDIpOwogCi0gICAgLyogY29tcHV0ZSBoaWdoZXIgVE5TIGZpbHRlciBpbiBsYXR0aWNlIChQYXJDb3IpIGZvcm0gd2l0aCBMZVJvdXgtR3VlZ3VlbiBhbGdvcml0aG0gKi8KLSAgICB0c2JpLT5wcmVkaWN0aW9uR2FpbltISUZJTFRdID0gRkRLYWFjRW5jX0F1dG9Ub1BhcmNvcihyeHgyLCBwYXJjb3JfdG1wLCB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0hJRklMVF0pOworICAgIC8qIGNvbXB1dGUgaGlnaGVyIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzIGluIGxhdHRpY2UgZm9ybSAoUGFyQ29yKSB3aXRoCisgICAgICogTGVSb3V4LUd1ZWd1ZW4vU2NodXIgYWxnb3JpdGhtICovCisgICAgeworICAgICAgRklYUF9EQkwgcHJlZGljdGlvbkdhaW5fbTsKKyAgICAgIElOVCBwcmVkaWN0aW9uR2Fpbl9lOwogCi0gICAgLyogbm9uLWxpbmVhciBxdWFudGl6YXRpb24gb2YgVE5TIGxhdHRpY2UgY29lZmZpY2llbnRzIHdpdGggZ2l2ZW4gcmVzb2x1dGlvbiAqLwotICAgIEZES2FhY0VuY19QYXJjb3IySW5kZXgoCi0gICAgICAgICAgICBwYXJjb3JfdG1wLAotICAgICAgICAgICAgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXSwKLSAgICAgICAgICAgIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbSElGSUxUXSwKLSAgICAgICAgICAgIHRDLT5jb2VmUmVzKTsKKyAgICAgIENMcGNfQXV0b1RvUGFyY29yKHJ4eDIsIDAsIHBhcmNvcl90bXAsIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbSElGSUxUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwcmVkaWN0aW9uR2Fpbl9tLCAmcHJlZGljdGlvbkdhaW5fZSk7CisgICAgICB0c2JpLT5wcmVkaWN0aW9uR2FpbltISUZJTFRdID0KKyAgICAgICAgICAoSU5UKWZNdWx0Tm9ybShwcmVkaWN0aW9uR2Fpbl9tLCBwcmVkaWN0aW9uR2Fpbl9lLCAxMDAwLCAzMSwgMzEpOworICAgIH0KIAotICAgIC8qIHJlZHVjZSBmaWx0ZXIgb3JkZXIgYnkgdHJ1bmNhdGluZyB0cmFpbGluZyB6ZXJvcywgY29tcHV0ZSBzdW0oYWJzKGNvZWZzKSkgKi8KKyAgICAvKiBub24tbGluZWFyIHF1YW50aXphdGlvbiBvZiBUTlMgbGF0dGljZSBjb2VmZmljaWVudHMgd2l0aCBnaXZlbiByZXNvbHV0aW9uCisgICAgICovCisgICAgRkRLYWFjRW5jX1BhcmNvcjJJbmRleChwYXJjb3JfdG1wLCB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdLCB0Qy0+Y29lZlJlcyk7CisKKyAgICAvKiByZWR1Y2UgZmlsdGVyIG9yZGVyIGJ5IHRydW5jYXRpbmcgdHJhaWxpbmcgemVyb3MsIGNvbXB1dGUgc3VtKGFicyhjb2VmcykpCisgICAgICovCiAgICAgZm9yIChpID0gdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgIGlmICh0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldICE9IDApIHsKICAgICAgICAgYnJlYWs7CkBAIC03OTYsMzUgKzgzNyw0OSBAQAogCiAgICAgc3VtU3FyQ29lZiA9IDA7CiAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICBzdW1TcXJDb2VmICs9IHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV0gKiB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldOworICAgICAgc3VtU3FyQ29lZiArPSB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldICoKKyAgICAgICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXTsKICAgICB9CiAKLSAgICB0bnNJbmZvLT5kaXJlY3Rpb25bc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSB0Qy0+Y29uZlRhYi50bnNGaWx0ZXJEaXJlY3Rpb25bSElGSUxUXTsKKyAgICB0bnNJbmZvLT5kaXJlY3Rpb25bc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPQorICAgICAgICB0Qy0+Y29uZlRhYi50bnNGaWx0ZXJEaXJlY3Rpb25bSElGSUxUXTsKICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSBzZmJDbnQgLSB0Qy0+bHBjU3RhcnRCYW5kW0hJRklMVF07CiAKLSAgICAvKiBkaXNhYmxlIFROUyBpZiBwcmVkaWN0aW9uR2FpbiBpcyBsZXNzIHRoYW4gM2RCIG9yIHN1bVNxckNvZWYgaXMgdG9vIHNtYWxsICovCi0gICAgaWYgKCh0c2JpLT5wcmVkaWN0aW9uR2FpbltISUZJTFRdID4gdEMtPmNvbmZUYWIudGhyZXNoT25bSElGSUxUXSkgfHwgKHN1bVNxckNvZWYgPiAodEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdLzIgKyAyKSkpCi0gICAgeworICAgIC8qIGRpc2FibGUgVE5TIGlmIHByZWRpY3Rpb25HYWluIGlzIGxlc3MgdGhhbiAzZEIgb3Igc3VtU3FyQ29lZiBpcyB0b28gc21hbGwKKyAgICAgKi8KKyAgICBpZiAoKHRzYmktPnByZWRpY3Rpb25HYWluW0hJRklMVF0gPiB0Qy0+Y29uZlRhYi50aHJlc2hPbltISUZJTFRdKSB8fAorICAgICAgICAoc3VtU3FyQ29lZiA+ICh0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0hJRklMVF0gLyAyICsgMikpKSB7CiAgICAgICB0c2JpLT50bnNBY3RpdmVbSElGSUxUXSA9IFRSVUU7CiAgICAgICB0bnNJbmZvLT5udW1PZkZpbHRlcnNbc3ViQmxvY2tOdW1iZXJdKys7CiAKLSAgICAgIC8qIGNvbXB1dGUgc2Vjb25kIGZpbHRlciBmb3IgbG93ZXIgcXVhcnRlcjsgb25seSBhbGxvd2VkIGZvciBsb25nIHdpbmRvd3MhICovCi0gICAgICBpZiAoIChibG9ja1R5cGUgIT0gU0hPUlRfV0lORE9XKSAmJgotICAgICAgICAgICAodEMtPmNvbmZUYWIuZmlsdGVyRW5hYmxlZFtMT0ZJTFRdKSAmJiAodEMtPmNvbmZUYWIuc2VwZXJhdGVGaWx0ZXJzQWxsb3dlZCkgKQotICAgICAgeworICAgICAgLyogY29tcHV0ZSBzZWNvbmQgZmlsdGVyIGZvciBsb3dlciBxdWFydGVyOyBvbmx5IGFsbG93ZWQgZm9yIGxvbmcgd2luZG93cyEKKyAgICAgICAqLworICAgICAgaWYgKChibG9ja1R5cGUgIT0gU0hPUlRfV0lORE9XKSAmJiAodEMtPmNvbmZUYWIuZmlsdGVyRW5hYmxlZFtMT0ZJTFRdKSAmJgorICAgICAgICAgICh0Qy0+Y29uZlRhYi5zZXBlcmF0ZUZpbHRlcnNBbGxvd2VkKSkgewogICAgICAgICAvKiBjb21wdXRlIHNlY29uZCBmaWx0ZXIgZm9yIGxvd2VyIGZyZXF1ZW5jaWVzICovCiAKLSAgICAgICAgLyogY29tcHV0ZSBUTlMgZmlsdGVyIGluIGxhdHRpY2UgKFBhckNvcikgZm9ybSB3aXRoIExlUm91eC1HdWVndWVuIGFsZ29yaXRobSAqLwotICAgICAgICBJTlQgcHJlZEdhaW4gPSBGREthYWNFbmNfQXV0b1RvUGFyY29yKHJ4eDEsIHBhcmNvcl90bXAsIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbTE9GSUxUXSk7CisgICAgICAgIC8qIGNvbXB1dGUgVE5TIGZpbHRlciBpbiBsYXR0aWNlIChQYXJDb3IpIGZvcm0gd2l0aCBMZVJvdXgtR3VlZ3VlbgorICAgICAgICAgKiBhbGdvcml0aG0gKi8KKyAgICAgICAgSU5UIHByZWRHYWluOworICAgICAgICB7CisgICAgICAgICAgRklYUF9EQkwgcHJlZGljdGlvbkdhaW5fbTsKKyAgICAgICAgICBJTlQgcHJlZGljdGlvbkdhaW5fZTsKIAotICAgICAgICAvKiBub24tbGluZWFyIHF1YW50aXphdGlvbiBvZiBUTlMgbGF0dGljZSBjb2VmZmljaWVudHMgd2l0aCBnaXZlbiByZXNvbHV0aW9uICovCi0gICAgICAgIEZES2FhY0VuY19QYXJjb3IySW5kZXgoCi0gICAgICAgICAgICAgICAgcGFyY29yX3RtcCwKLSAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdLAotICAgICAgICAgICAgICAgIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbTE9GSUxUXSwKLSAgICAgICAgICAgICAgICB0Qy0+Y29lZlJlcyk7CisgICAgICAgICAgQ0xwY19BdXRvVG9QYXJjb3Iocnh4MSwgMCwgcGFyY29yX3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWRpY3Rpb25HYWluX20sICZwcmVkaWN0aW9uR2Fpbl9lKTsKKyAgICAgICAgICBwcmVkR2FpbiA9CisgICAgICAgICAgICAgIChJTlQpZk11bHROb3JtKHByZWRpY3Rpb25HYWluX20sIHByZWRpY3Rpb25HYWluX2UsIDEwMDAsIDMxLCAzMSk7CisgICAgICAgIH0KIAotICAgICAgICAvKiByZWR1Y2UgZmlsdGVyIG9yZGVyIGJ5IHRydW5jYXRpbmcgdHJhaWxpbmcgemVyb3MsIGNvbXB1dGUgc3VtKGFicyhjb2VmcykpICovCisgICAgICAgIC8qIG5vbi1saW5lYXIgcXVhbnRpemF0aW9uIG9mIFROUyBsYXR0aWNlIGNvZWZmaWNpZW50cyB3aXRoIGdpdmVuCisgICAgICAgICAqIHJlc29sdXRpb24gKi8KKyAgICAgICAgRkRLYWFjRW5jX1BhcmNvcjJJbmRleChwYXJjb3JfdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdLCB0Qy0+Y29lZlJlcyk7CisKKyAgICAgICAgLyogcmVkdWNlIGZpbHRlciBvcmRlciBieSB0cnVuY2F0aW5nIHRyYWlsaW5nIHplcm9zLCBjb21wdXRlCisgICAgICAgICAqIHN1bShhYnMoY29lZnMpKSAqLwogICAgICAgICBmb3IgKGkgPSB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0gLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgIGlmICh0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldICE9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODM0LDI5ICs4ODksMzcgQEAKIAogICAgICAgICBzdW1TcXJDb2VmID0gMDsKICAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgc3VtU3FyQ29lZiArPSB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldICogdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXVtpXTsKKyAgICAgICAgICBzdW1TcXJDb2VmICs9IHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF1baV0gKgorICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXVtpXTsKICAgICAgICAgfQogCi0gICAgICAgIHRuc0luZm8tPmRpcmVjdGlvbltzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9IHRDLT5jb25mVGFiLnRuc0ZpbHRlckRpcmVjdGlvbltMT0ZJTFRdOwotICAgICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF0gPSB0Qy0+bHBjU3RhcnRCYW5kW0hJRklMVF0gLSB0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF07CisgICAgICAgIHRuc0luZm8tPmRpcmVjdGlvbltzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9CisgICAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNGaWx0ZXJEaXJlY3Rpb25bTE9GSUxUXTsKKyAgICAgICAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdID0KKyAgICAgICAgICAgIHRDLT5scGNTdGFydEJhbmRbSElGSUxUXSAtIHRDLT5scGNTdGFydEJhbmRbTE9GSUxUXTsKIAotICAgICAgICAvKiBmaWx0ZXIgbG93ZXIgcXVhcnRlciBpZiBnYWluIGlzIGhpZ2ggZW5vdWdoLCBidXQgbm90IGlmIGl0J3MgdG9vIGhpZ2ggKi8KLSAgICAgICAgaWYgKCAoIChwcmVkR2FpbiA+IHRDLT5jb25mVGFiLnRocmVzaE9uW0xPRklMVF0pICYmIChwcmVkR2FpbiA8ICgxNjAwMCAqIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbTE9GSUxUXSkpICkKLSAgICAgICAgICB8fCAoIChzdW1TcXJDb2VmID4gOSkgICYmIChzdW1TcXJDb2VmIDwgMjIgKiB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0pICkgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogY29tcGFyZSBsb3dlciB0byB1cHBlciBmaWx0ZXI7IGlmIHRoZXkgYXJlIHZlcnkgc2ltaWxhciwgbWVyZ2UgdGhlbSAqLworICAgICAgICAvKiBmaWx0ZXIgbG93ZXIgcXVhcnRlciBpZiBnYWluIGlzIGhpZ2ggZW5vdWdoLCBidXQgbm90IGlmIGl0J3MgdG9vIGhpZ2gKKyAgICAgICAgICovCisgICAgICAgIGlmICgoKHByZWRHYWluID4gdEMtPmNvbmZUYWIudGhyZXNoT25bTE9GSUxUXSkgJiYKKyAgICAgICAgICAgICAocHJlZEdhaW4gPCAoMTYwMDAgKiB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0pKSkgfHwKKyAgICAgICAgICAgICgoc3VtU3FyQ29lZiA+IDkpICYmCisgICAgICAgICAgICAgKHN1bVNxckNvZWYgPCAyMiAqIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbTE9GSUxUXSkpKSB7CisgICAgICAgICAgLyogY29tcGFyZSBsb3dlciB0byB1cHBlciBmaWx0ZXI7IGlmIHRoZXkgYXJlIHZlcnkgc2ltaWxhciwgbWVyZ2UgdGhlbQorICAgICAgICAgICAqLwogICAgICAgICAgIHRzYmktPnRuc0FjdGl2ZVtMT0ZJTFRdID0gVFJVRTsKICAgICAgICAgICBzdW1TcXJDb2VmID0gMDsKICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdOyBpKyspIHsKLSAgICAgICAgICAgIHN1bVNxckNvZWYgKz0gRkRLYWJzKHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV0gLSB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldKTsKKyAgICAgICAgICAgIHN1bVNxckNvZWYgKz0gZkFicyh0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCAoc3VtU3FyQ29lZiA8IDIpICYmCi0gICAgICAgICAgICAgICAodG5zSW5mby0+ZGlyZWN0aW9uW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdID09IHRuc0luZm8tPmRpcmVjdGlvbltzdWJCbG9ja051bWJlcl1bSElGSUxUXSkgKQotICAgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHN1bVNxckNvZWYgPCAyKSAmJgorICAgICAgICAgICAgICAodG5zSW5mby0+ZGlyZWN0aW9uW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdID09CisgICAgICAgICAgICAgICB0bnNJbmZvLT5kaXJlY3Rpb25bc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0pKSB7CiAgICAgICAgICAgICB0bnNEYXRhLT5maWx0ZXJzTWVyZ2VkID0gVFJVRTsKLSAgICAgICAgICAgIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl1bSElGSUxUXSA9IHNmYkNudCAtIHRDLT5scGNTdGFydEJhbmRbTE9GSUxUXTsKKyAgICAgICAgICAgIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl1bSElGSUxUXSA9CisgICAgICAgICAgICAgICAgc2ZiQ250IC0gdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdOwogICAgICAgICAgICAgZm9yICg7IGkgPCB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1bSElGSUxUXTsgaSsrKSB7Ci0gICAgICAgICAgICAgIGlmIChGREthYnModG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXSkgPiAxKSB7CisgICAgICAgICAgICAgIGlmIChmQWJzKHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV0pID4gMSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC04NjgsMjIgKzkzMSwxOSBAQAogICAgICAgICAgICAgaWYgKGkgPCB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1bSElGSUxUXSkgewogICAgICAgICAgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1bSElGSUxUXSA9IGkgKyAxOwogICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW3N1YkJsb2NrTnVtYmVyXSsrOwogICAgICAgICAgIH0KICAgICAgICAgfSAvKiBmaWx0ZXIgbG93ZXIgcGFydCAqLwotICAgICAgICB0c2JpLT5wcmVkaWN0aW9uR2FpbltMT0ZJTFRdPXByZWRHYWluOworICAgICAgICB0c2JpLT5wcmVkaWN0aW9uR2FpbltMT0ZJTFRdID0gcHJlZEdhaW47CiAKICAgICAgIH0gLyogc2Vjb25kIGZpbHRlciBhbGxvd2VkICAqLwotICAgIH0gLyogaWYgcHJlZGljdGlvbkdhaW4gPiAxNDM3IC4uLiAqLwotICB9IC8qIG1heE9yZGVyID4gMCAmJiB0bnNBY3RpdmUgKi8KKyAgICB9ICAgLyogaWYgcHJlZGljdGlvbkdhaW4gPiAxNDM3IC4uLiAqLworICB9ICAgICAvKiBtYXhPcmRlciA+IDAgJiYgdG5zQWN0aXZlICovCiAKICAgcmV0dXJuIDA7Ci0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgRkRLYWFjTGRFbmNfVG5zU3luYwpAQCAtODk4LDc5ICs5NTgsNzcgQEAKIAogICBccmV0dXJuIHZvaWQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEZES2FhY0VuY19UbnNTeW5jKAotICAgICAgICAgICAgIFROU19EQVRBICp0bnNEYXRhRGVzdCwKLSAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSAqdG5zRGF0YVNyYywKLSAgICAgICAgICAgICBUTlNfSU5GTyAqdG5zSW5mb0Rlc3QsCi0gICAgICAgICAgICAgVE5TX0lORk8gKnRuc0luZm9TcmMsCi0gICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZURlc3QsCi0gICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZVNyYywKLSAgICAgICAgICAgICBjb25zdCBUTlNfQ09ORklHICp0QwotICAgICAgICAgICAgICkKLXsKK3ZvaWQgRkRLYWFjRW5jX1Ruc1N5bmMoVE5TX0RBVEEgKnRuc0RhdGFEZXN0LCBjb25zdCBUTlNfREFUQSAqdG5zRGF0YVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgVE5TX0lORk8gKnRuc0luZm9EZXN0LCBUTlNfSU5GTyAqdG5zSW5mb1NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZURlc3QsIGNvbnN0IElOVCBibG9ja1R5cGVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgKnRDKSB7CiAgIGludCBpLCB3LCBhYnNEaWZmLCBuV2luZG93czsKICAgVE5TX1NVQkJMT0NLX0lORk8gKnNiSW5mb0Rlc3Q7CiAgIGNvbnN0IFROU19TVUJCTE9DS19JTkZPICpzYkluZm9TcmM7CiAKLSAgLyogaWYgb25lIGNoYW5uZWwgY29udGFpbnMgc2hvcnQgYmxvY2tzIGFuZCB0aGUgb3RoZXIgbm90LCBkbyBub3Qgc3luY2hyb25pemUgKi8KLSAgaWYgKCAoYmxvY2tUeXBlU3JjID09IFNIT1JUX1dJTkRPVyAmJiBibG9ja1R5cGVEZXN0ICE9IFNIT1JUX1dJTkRPVykgfHwKLSAgICAgICAoYmxvY2tUeXBlRGVzdCA9PSBTSE9SVF9XSU5ET1cgJiYgYmxvY2tUeXBlU3JjICE9IFNIT1JUX1dJTkRPVykgKQotICB7CisgIC8qIGlmIG9uZSBjaGFubmVsIGNvbnRhaW5zIHNob3J0IGJsb2NrcyBhbmQgdGhlIG90aGVyIG5vdCwgZG8gbm90IHN5bmNocm9uaXplCisgICAqLworICBpZiAoKGJsb2NrVHlwZVNyYyA9PSBTSE9SVF9XSU5ET1cgJiYgYmxvY2tUeXBlRGVzdCAhPSBTSE9SVF9XSU5ET1cpIHx8CisgICAgICAoYmxvY2tUeXBlRGVzdCA9PSBTSE9SVF9XSU5ET1cgJiYgYmxvY2tUeXBlU3JjICE9IFNIT1JUX1dJTkRPVykpIHsKICAgICByZXR1cm47CiAgIH0KIAogICBpZiAoYmxvY2tUeXBlRGVzdCAhPSBTSE9SVF9XSU5ET1cpIHsKICAgICBzYkluZm9EZXN0ID0gJnRuc0RhdGFEZXN0LT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvOwotICAgIHNiSW5mb1NyYyAgPSAmdG5zRGF0YVNyYy0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mbzsKLSAgICBuV2luZG93cyAgID0gMTsKKyAgICBzYkluZm9TcmMgPSAmdG5zRGF0YVNyYy0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mbzsKKyAgICBuV2luZG93cyA9IDE7CiAgIH0gZWxzZSB7CiAgICAgc2JJbmZvRGVzdCA9ICZ0bnNEYXRhRGVzdC0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bMF07Ci0gICAgc2JJbmZvU3JjICA9ICZ0bnNEYXRhU3JjLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1swXTsKLSAgICBuV2luZG93cyAgID0gODsKKyAgICBzYkluZm9TcmMgPSAmdG5zRGF0YVNyYy0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bMF07CisgICAgbldpbmRvd3MgPSA4OwogICB9CiAKLSAgZm9yICh3PTA7IHc8bldpbmRvd3M7IHcrKykgewotICAgICAgY29uc3QgVE5TX1NVQkJMT0NLX0lORk8gKnBTYkluZm9TcmNXICA9IHNiSW5mb1NyYyAgKyB3OwotICAgICAgVE5TX1NVQkJMT0NLX0lORk8gICAgICAgKnBTYkluZm9EZXN0VyA9IHNiSW5mb0Rlc3QgKyB3OwotICAgICAgSU5UIGRvU3luYyA9IDEsIGFic0RpZmZTdW0gPSAwOworICBmb3IgKHcgPSAwOyB3IDwgbldpbmRvd3M7IHcrKykgeworICAgIGNvbnN0IFROU19TVUJCTE9DS19JTkZPICpwU2JJbmZvU3JjVyA9IHNiSW5mb1NyYyArIHc7CisgICAgVE5TX1NVQkJMT0NLX0lORk8gKnBTYkluZm9EZXN0VyA9IHNiSW5mb0Rlc3QgKyB3OworICAgIElOVCBkb1N5bmMgPSAxLCBhYnNEaWZmU3VtID0gMDsKIAotICAgICAgLyogaWYgVE5TIGlzIGFjdGl2ZSBpbiBhdCBsZWFzdCBvbmUgY2hhbm5lbCwgY2hlY2sgaWYgUGFyQ29yIGNvZWZmaWNpZW50cyBvZiBoaWdoZXIgZmlsdGVyIGFyZSBzaW1pbGFyICovCi0gICAgICBpZiAocFNiSW5mb0Rlc3RXLT50bnNBY3RpdmVbSElGSUxUXSB8fCBwU2JJbmZvU3JjVy0+dG5zQWN0aXZlW0hJRklMVF0pIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHRDLT5tYXhPcmRlcjsgaSsrKSB7Ci0gICAgICAgICAgYWJzRGlmZiA9IEZES2Ficyh0bnNJbmZvRGVzdC0+Y29lZlt3XVtISUZJTFRdW2ldIC0gdG5zSW5mb1NyYy0+Y29lZlt3XVtISUZJTFRdW2ldKTsKLSAgICAgICAgICBhYnNEaWZmU3VtICs9IGFic0RpZmY7Ci0gICAgICAgICAgLyogaWYgY29lZmZpY2llbnRzIGRpdmVyZ2UgdG9vIG11Y2ggYmV0d2VlbiBjaGFubmVscywgZG8gbm90IHN5bmNocm9uaXplICovCi0gICAgICAgICAgaWYgKChhYnNEaWZmID4gMSkgfHwgKGFic0RpZmZTdW0gPiAyKSkgewotICAgICAgICAgICAgZG9TeW5jID0gMDsKLSAgICAgICAgICAgIGJyZWFrOworICAgIC8qIGlmIFROUyBpcyBhY3RpdmUgaW4gYXQgbGVhc3Qgb25lIGNoYW5uZWwsIGNoZWNrIGlmIFBhckNvciBjb2VmZmljaWVudHMgb2YKKyAgICAgKiBoaWdoZXIgZmlsdGVyIGFyZSBzaW1pbGFyICovCisgICAgaWYgKHBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlW0hJRklMVF0gfHwgcFNiSW5mb1NyY1ctPnRuc0FjdGl2ZVtISUZJTFRdKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgdEMtPm1heE9yZGVyOyBpKyspIHsKKyAgICAgICAgYWJzRGlmZiA9IGZBYnModG5zSW5mb0Rlc3QtPmNvZWZbd11bSElGSUxUXVtpXSAtCisgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm9TcmMtPmNvZWZbd11bSElGSUxUXVtpXSk7CisgICAgICAgIGFic0RpZmZTdW0gKz0gYWJzRGlmZjsKKyAgICAgICAgLyogaWYgY29lZmZpY2llbnRzIGRpdmVyZ2UgdG9vIG11Y2ggYmV0d2VlbiBjaGFubmVscywgZG8gbm90IHN5bmNocm9uaXplCisgICAgICAgICAqLworICAgICAgICBpZiAoKGFic0RpZmYgPiAxKSB8fCAoYWJzRGlmZlN1bSA+IDIpKSB7CisgICAgICAgICAgZG9TeW5jID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZG9TeW5jKSB7CisgICAgICAgIC8qIGlmIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2Ugd2FzIGRldGVjdGVkLCBzeW5jaHJvbml6ZSBjb2VmZmljaWVudAorICAgICAgICAgKiBzZXRzICovCisgICAgICAgIGlmIChwU2JJbmZvU3JjVy0+dG5zQWN0aXZlW0hJRklMVF0pIHsKKyAgICAgICAgICAvKiBubyBkZXN0IGZpbHRlciwgb3IgbW9yZSBkZXN0IHRoYW4gc291cmNlIGZpbHRlcnM6IHVzZSBvbmUgZGVzdAorICAgICAgICAgICAqIGZpbHRlciAqLworICAgICAgICAgIGlmICgoIXBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlW0hJRklMVF0pIHx8CisgICAgICAgICAgICAgICgocFNiSW5mb0Rlc3RXLT50bnNBY3RpdmVbSElGSUxUXSkgJiYKKyAgICAgICAgICAgICAgICh0bnNJbmZvRGVzdC0+bnVtT2ZGaWx0ZXJzW3ddID4gdG5zSW5mb1NyYy0+bnVtT2ZGaWx0ZXJzW3ddKSkpIHsKKyAgICAgICAgICAgIHBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlW0hJRklMVF0gPSB0bnNJbmZvRGVzdC0+bnVtT2ZGaWx0ZXJzW3ddID0gMTsKICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgICB0bnNEYXRhRGVzdC0+ZmlsdGVyc01lcmdlZCA9IHRuc0RhdGFTcmMtPmZpbHRlcnNNZXJnZWQ7CisgICAgICAgICAgdG5zSW5mb0Rlc3QtPm9yZGVyW3ddW0hJRklMVF0gPSB0bnNJbmZvU3JjLT5vcmRlclt3XVtISUZJTFRdOworICAgICAgICAgIHRuc0luZm9EZXN0LT5sZW5ndGhbd11bSElGSUxUXSA9IHRuc0luZm9TcmMtPmxlbmd0aFt3XVtISUZJTFRdOworICAgICAgICAgIHRuc0luZm9EZXN0LT5kaXJlY3Rpb25bd11bSElGSUxUXSA9IHRuc0luZm9TcmMtPmRpcmVjdGlvblt3XVtISUZJTFRdOworICAgICAgICAgIHRuc0luZm9EZXN0LT5jb2VmQ29tcHJlc3Nbd11bSElGSUxUXSA9CisgICAgICAgICAgICAgIHRuc0luZm9TcmMtPmNvZWZDb21wcmVzc1t3XVtISUZJTFRdOwogCi0gICAgICAgIGlmIChkb1N5bmMpIHsKLSAgICAgICAgICAgIC8qIGlmIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2Ugd2FzIGRldGVjdGVkLCBzeW5jaHJvbml6ZSBjb2VmZmljaWVudCBzZXRzICovCi0gICAgICAgICAgICBpZiAocFNiSW5mb1NyY1ctPnRuc0FjdGl2ZVtISUZJTFRdKSB7Ci0gICAgICAgICAgICAgIC8qIG5vIGRlc3QgZmlsdGVyLCBvciBtb3JlIGRlc3QgdGhhbiBzb3VyY2UgZmlsdGVyczogdXNlIG9uZSBkZXN0IGZpbHRlciAqLwotICAgICAgICAgICAgICBpZiAoKCFwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZVtISUZJTFRdKSB8fAotICAgICAgICAgICAgICAgICAgKChwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZVtISUZJTFRdKSAmJiAodG5zSW5mb0Rlc3QtPm51bU9mRmlsdGVyc1t3XSA+IHRuc0luZm9TcmMtPm51bU9mRmlsdGVyc1t3XSkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNiSW5mb0Rlc3RXLT50bnNBY3RpdmVbSElGSUxUXSA9IHRuc0luZm9EZXN0LT5udW1PZkZpbHRlcnNbd10gPSAxOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHRuc0RhdGFEZXN0LT5maWx0ZXJzTWVyZ2VkID0gdG5zRGF0YVNyYy0+ZmlsdGVyc01lcmdlZDsKLSAgICAgICAgICAgICAgdG5zSW5mb0Rlc3QtPm9yZGVyICAgICAgIFt3XVtISUZJTFRdID0gdG5zSW5mb1NyYy0+b3JkZXIgICAgICAgW3ddW0hJRklMVF07Ci0gICAgICAgICAgICAgIHRuc0luZm9EZXN0LT5sZW5ndGggICAgICBbd11bSElGSUxUXSA9IHRuc0luZm9TcmMtPmxlbmd0aCAgICAgIFt3XVtISUZJTFRdOwotICAgICAgICAgICAgICB0bnNJbmZvRGVzdC0+ZGlyZWN0aW9uICAgW3ddW0hJRklMVF0gPSB0bnNJbmZvU3JjLT5kaXJlY3Rpb24gICBbd11bSElGSUxUXTsKLSAgICAgICAgICAgICAgdG5zSW5mb0Rlc3QtPmNvZWZDb21wcmVzc1t3XVtISUZJTFRdID0gdG5zSW5mb1NyYy0+Y29lZkNvbXByZXNzW3ddW0hJRklMVF07Ci0KLSAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRDLT5tYXhPcmRlcjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdG5zSW5mb0Rlc3QtPmNvZWZbd11bSElGSUxUXVtpXSA9IHRuc0luZm9TcmMtPmNvZWZbd11bSElGSUxUXVtpXTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZVtISUZJTFRdID0gdG5zSW5mb0Rlc3QtPm51bU9mRmlsdGVyc1t3XSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0Qy0+bWF4T3JkZXI7IGkrKykgeworICAgICAgICAgICAgdG5zSW5mb0Rlc3QtPmNvZWZbd11bSElGSUxUXVtpXSA9IHRuc0luZm9TcmMtPmNvZWZbd11bSElGSUxUXVtpXTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIHBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlW0hJRklMVF0gPSB0bnNJbmZvRGVzdC0+bnVtT2ZGaWx0ZXJzW3ddID0gMDsKKyAgICAgIH0KICAgICB9CisgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk5MCwyMTggKzEwNDgsMTMwIEBACiAKICAgXHJldHVybiBFUlJPUiBTVEFUVVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQgRkRLYWFjRW5jX1Ruc0VuY29kZSgKLSAgICAgICAgVE5TX0lORk8qIHRuc0luZm8sCi0gICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAotICAgICAgICBjb25zdCBJTlQgbnVtT2ZTZmIsCi0gICAgICAgIGNvbnN0IFROU19DT05GSUcgKnRDLAotICAgICAgICBjb25zdCBJTlQgbG93UGFzc0xpbmUsCi0gICAgICAgIEZJWFBfREJMKiBzcGVjdHJ1bSwKLSAgICAgICAgY29uc3QgSU5UIHN1YkJsb2NrTnVtYmVyLAotICAgICAgICBjb25zdCBJTlQgYmxvY2tUeXBlCi0gICAgICAgICkKLXsKLSAgICBJTlQgaSwgc3RhcnRMaW5lLCBzdG9wTGluZTsKK0lOVCBGREthYWNFbmNfVG5zRW5jb2RlKFROU19JTkZPICp0bnNJbmZvLCBUTlNfREFUQSAqdG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1PZlNmYiwgY29uc3QgVE5TX0NPTkZJRyAqdEMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbG93UGFzc0xpbmUsIEZJWFBfREJMICpzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdWJCbG9ja051bWJlciwgY29uc3QgSU5UIGJsb2NrVHlwZSkgeworICBJTlQgaSwgc3RhcnRMaW5lLCBzdG9wTGluZTsKIAotICAgIGlmICggKCAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgJiYgKCF0bnNEYXRhLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0udG5zQWN0aXZlW0hJRklMVF0pICkKLSAgICAgIHx8ICggKGJsb2NrVHlwZSAhPSBTSE9SVF9XSU5ET1cpICYmICghdG5zRGF0YS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbSElGSUxUXSkgKSApCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQorICBpZiAoKChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSAmJgorICAgICAgICghdG5zRGF0YS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdCisgICAgICAgICAgICAgLnRuc0FjdGl2ZVtISUZJTFRdKSkgfHwKKyAgICAgICgoYmxvY2tUeXBlICE9IFNIT1JUX1dJTkRPVykgJiYKKyAgICAgICAoIXRuc0RhdGEtPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0hJRklMVF0pKSkgeworICAgIHJldHVybiAxOworICB9CiAKLSAgICBzdGFydExpbmUgPSAodG5zRGF0YS0+ZmlsdGVyc01lcmdlZCkgPyB0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF0gOiB0Qy0+bHBjU3RhcnRMaW5lW0hJRklMVF07Ci0gICAgc3RvcExpbmUgID0gdEMtPmxwY1N0b3BMaW5lOworICBzdGFydExpbmUgPSAodG5zRGF0YS0+ZmlsdGVyc01lcmdlZCkgPyB0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdEMtPmxwY1N0YXJ0TGluZVtISUZJTFRdOworICBzdG9wTGluZSA9IHRDLT5scGNTdG9wTGluZTsKIAotICAgIGZvciAoaT0wOyBpPHRuc0luZm8tPm51bU9mRmlsdGVyc1tzdWJCbG9ja051bWJlcl07IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW3N1YkJsb2NrTnVtYmVyXTsgaSsrKSB7CisgICAgSU5UIGxwY0dhaW5GYWN0b3I7CisgICAgRklYUF9MUEMgTHBjQ29lZmZbVE5TX01BWF9PUkRFUl07CisgICAgRklYUF9EQkwgd29ya0J1ZmZlcltUTlNfTUFYX09SREVSXTsKKyAgICBGSVhQX0xQQyBwYXJjb3JfdG1wW1ROU19NQVhfT1JERVJdOwogCi0gICAgICAgIElOVCBscGNHYWluRmFjdG9yOwotICAgICAgICBGSVhQX0RCTCBMcGNDb2VmZltUTlNfTUFYX09SREVSXTsKLSAgICAgICAgRklYUF9EQkwgd29ya0J1ZmZlcltUTlNfTUFYX09SREVSXTsKLSAgICAgICAgRklYUF9EQkwgcGFyY29yX3RtcFtUTlNfTUFYX09SREVSXTsKKyAgICBGREthYWNFbmNfSW5kZXgyUGFyY29yKHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW2ldLCBwYXJjb3JfdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW2ldLCB0Qy0+Y29lZlJlcyk7CiAKLSAgICAgICAgRkRLYWFjRW5jX0luZGV4MlBhcmNvcigKLSAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtpXSwKLSAgICAgICAgICAgICAgICBwYXJjb3JfdG1wLAotICAgICAgICAgICAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXVtpXSwKLSAgICAgICAgICAgICAgICB0Qy0+Y29lZlJlcyk7CisgICAgbHBjR2FpbkZhY3RvciA9IENMcGNfUGFyY29yVG9McGMoCisgICAgICAgIHBhcmNvcl90bXAsIExwY0NvZWZmLCB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1baV0sIHdvcmtCdWZmZXIpOwogCi0gICAgICAgIGxwY0dhaW5GYWN0b3IgPSBGREthYWNFbmNfUGFyY29yVG9McGMoCi0gICAgICAgICAgICAgICAgcGFyY29yX3RtcCwKLSAgICAgICAgICAgICAgICBMcGNDb2VmZiwKLSAgICAgICAgICAgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1baV0sCi0gICAgICAgICAgICAgICAgd29ya0J1ZmZlcik7CisgICAgRkRLbWVtY2xlYXIod29ya0J1ZmZlciwgVE5TX01BWF9PUkRFUiAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIENMcGNfQW5hbHlzaXMoJnNwZWN0cnVtW3N0YXJ0TGluZV0sIHN0b3BMaW5lIC0gc3RhcnRMaW5lLCBMcGNDb2VmZiwKKyAgICAgICAgICAgICAgICAgIGxwY0dhaW5GYWN0b3IsIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXVtpXSwgd29ya0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOwogCi0gICAgICAgIEZES2FhY0VuY19BbmFseXNpc0ZpbHRlcigKLSAgICAgICAgICAgICAgICAmc3BlY3RydW1bc3RhcnRMaW5lXSwKLSAgICAgICAgICAgICAgICBzdG9wTGluZSAtIHN0YXJ0TGluZSwKLSAgICAgICAgICAgICAgICBMcGNDb2VmZiwKLSAgICAgICAgICAgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1baV0sCi0gICAgICAgICAgICAgICAgbHBjR2FpbkZhY3Rvcik7CisgICAgLyogdXBkYXRlIGZvciBzZWNvbmQgZmlsdGVyICovCisgICAgc3RhcnRMaW5lID0gdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdOworICAgIHN0b3BMaW5lID0gdEMtPmxwY1N0YXJ0TGluZVtISUZJTFRdOworICB9CiAKLSAgICAgICAgLyogdXBkYXRlIGZvciBzZWNvbmQgZmlsdGVyICovCi0gICAgICAgIHN0YXJ0TGluZSA9IHRDLT5scGNTdGFydExpbmVbTE9GSUxUXTsKLSAgICAgICAgc3RvcExpbmUgID0gdEMtPmxwY1N0YXJ0TGluZVtISUZJTFRdOwotICAgIH0KLQotICAgIHJldHVybigwKTsKLQorICByZXR1cm4gKDApOwogfQogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KAotICAgICAgICBGSVhQX0RCTCAqd2luLAotICAgICAgICBjb25zdCBpbnQgd2luU2l6ZSwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgY29uc3QgSU5UIHRyYW5zZm9ybVJlc29sdXRpb24sCi0gICAgICAgIGNvbnN0IEZJWFBfREJMIHRpbWVSZXNvbHV0aW9uLAotICAgICAgICBjb25zdCBJTlQgdGltZVJlc29sdXRpb25fZQotICAgICAgICApCi17Ci0gICNkZWZpbmUgUElfRSAgICAgICAgICAgKDIpCi0gICNkZWZpbmUgUElfTSAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMy4xNDE2Zi8oZmxvYXQpKDE8PFBJX0UpKQorc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNHYXVzc1dpbmRvdyhGSVhQX0RCTCAqd2luLCBjb25zdCBpbnQgd2luU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHRyYW5zZm9ybVJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHRpbWVSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdGltZVJlc29sdXRpb25fZSkgeworI2RlZmluZSBQSV9FICgyKQorI2RlZmluZSBQSV9NIEZMMkZYQ09OU1RfREJMKDMuMTQxNmYgLyAoZmxvYXQpKDEgPDwgUElfRSkpCiAKLSAgI2RlZmluZSBFVUxFUl9FICAgICAgICAoMikKLSAgI2RlZmluZSBFVUxFUl9NICAgICAgICBGTDJGWENPTlNUX0RCTCgyLjcxODMvKGZsb2F0KSgxPDxFVUxFUl9FKSkKKyNkZWZpbmUgRVVMRVJfRSAoMikKKyNkZWZpbmUgRVVMRVJfTSBGTDJGWENPTlNUX0RCTCgyLjcxODMgLyAoZmxvYXQpKDEgPDwgRVVMRVJfRSkpCiAKLSAgI2RlZmluZSBDT0VGRl9MT09QX1NDQUxFICg0KQorI2RlZmluZSBDT0VGRl9MT09QX1NDQUxFICg0KQogCiAgIElOVCBpLCBlMSwgZTIsIGdhdXNzRXhwX2U7CiAgIEZJWFBfREJMIGdhdXNzRXhwX207CiAKICAgLyogY2FsYy4gd2luZG93IGV4cG9uZW50IGZyb20gdGltZSByZXNvbHV0aW9uOgogICAgKgotICAgKiAgIGdhdXNzRXhwID0gUEkgKiBzYW1wbGluZ1JhdGUgKiAwLjAwMWYgKiB0aW1lUmVzb2x1dGlvbiAvIHRyYW5zZm9ybVJlc29sdXRpb247Ci0gICAqICAgZ2F1c3NFeHAgPSAtMC41ZiAqIGdhdXNzRXhwICogZ2F1c3NFeHA7CisgICAqICAgZ2F1c3NFeHAgPSBQSSAqIHNhbXBsaW5nUmF0ZSAqIDAuMDAxZiAqIHRpbWVSZXNvbHV0aW9uIC8KKyAgICogdHJhbnNmb3JtUmVzb2x1dGlvbjsgZ2F1c3NFeHAgPSAtMC41ZiAqIGdhdXNzRXhwICogZ2F1c3NFeHA7CiAgICAqLwotICBnYXVzc0V4cF9tID0gZk11bHROb3JtKHRpbWVSZXNvbHV0aW9uLCBmTXVsdChQSV9NLCBmRGl2Tm9ybSggKEZJWFBfREJMKShzYW1wbGluZ1JhdGUpLCAoRklYUF9EQkwpKExPTkcpKHRyYW5zZm9ybVJlc29sdXRpb24qMTAwMC5mKSwgJmUxKSksICZlMik7CisgIGdhdXNzRXhwX20gPSBmTXVsdE5vcm0oCisgICAgICB0aW1lUmVzb2x1dGlvbiwKKyAgICAgIGZNdWx0KFBJX00sCisgICAgICAgICAgICBmRGl2Tm9ybSgoRklYUF9EQkwpKHNhbXBsaW5nUmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKExPTkcpKHRyYW5zZm9ybVJlc29sdXRpb24gKiAxMDAwLmYpLCAmZTEpKSwKKyAgICAgICZlMik7CiAgIGdhdXNzRXhwX20gPSAtZlBvdzJEaXYyKGdhdXNzRXhwX20pOwotICBnYXVzc0V4cF9lID0gMiooZTErZTIrdGltZVJlc29sdXRpb25fZStQSV9FKTsKKyAgZ2F1c3NFeHBfZSA9IDIgKiAoZTEgKyBlMiArIHRpbWVSZXNvbHV0aW9uX2UgKyBQSV9FKTsKIAotICBGREtfQVNTRVJUKCB3aW5TaXplIDwgKDE8PENPRUZGX0xPT1BfU0NBTEUpICk7CisgIEZES19BU1NFUlQod2luU2l6ZSA8ICgxIDw8IENPRUZGX0xPT1BfU0NBTEUpKTsKIAogICAvKiBjYWxjLiB3aW5kb3cgY29lZmZpY2llbnRzCiAgICAqICAgd2luW2ldID0gKGZsb2F0KWV4cCggZ2F1c3NFeHAgKiAoaSswLjUpICogKGkrMC41KSApOwogICAgKi8KLSAgZm9yKCBpPTA7IGk8d2luU2l6ZTsgaSsrKSB7Ci0KKyAgZm9yIChpID0gMDsgaSA8IHdpblNpemU7IGkrKykgewogICAgIHdpbltpXSA9IGZQb3coCi0gICAgICAgICAgICBFVUxFUl9NLAotICAgICAgICAgICAgRVVMRVJfRSwKLSAgICAgICAgICAgIGZNdWx0KGdhdXNzRXhwX20sIGZQb3cyKChpKkZMMkZYQ09OU1RfREJMKDEuZi8oZmxvYXQpKDE8PENPRUZGX0xPT1BfU0NBTEUpKSArIEZMMkZYQ09OU1RfREJMKC41Zi8oZmxvYXQpKDE8PENPRUZGX0xPT1BfU0NBTEUpKSkpKSwKLSAgICAgICAgICAgIGdhdXNzRXhwX2UgKyAyKkNPRUZGX0xPT1BfU0NBTEUsCi0gICAgICAgICAgICZlMSk7CisgICAgICAgIEVVTEVSX00sIEVVTEVSX0UsCisgICAgICAgIGZNdWx0KGdhdXNzRXhwX20sCisgICAgICAgICAgICAgIGZQb3cyKChpICogRkwyRlhDT05TVF9EQkwoMS5mIC8gKGZsb2F0KSgxIDw8IENPRUZGX0xPT1BfU0NBTEUpKSArCisgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCguNWYgLyAoZmxvYXQpKDEgPDwgQ09FRkZfTE9PUF9TQ0FMRSkpKSkpLAorICAgICAgICBnYXVzc0V4cF9lICsgMiAqIENPRUZGX0xPT1BfU0NBTEUsICZlMSk7CiAKICAgICB3aW5baV0gPSBzY2FsZVZhbHVlU2F0dXJhdGUod2luW2ldLCBlMSk7CiAgIH0KIH0KIAorc3RhdGljIElOVCBGREthYWNFbmNfU2VhcmNoMyhGSVhQX0xQQyBwYXJjb3IpIHsKKyAgSU5UIGksIGluZGV4ID0gMDsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIQotICBcYnJpZWYgICAgIEZES2FhY0VuY19BdXRvVG9QYXJjb3IKLQotICBjb252ZXJzaW9uIGF1dG9jb3JyZWxhdGlvbiB0byByZWZsZWN0aW9uIGNvZWZmaWNpZW50cwotCi0gIFxwYXJhbSBwb2ludGVyIHRvIGlucHV0IChhY2YpCi0gIFxwYXJhbSBwb2ludGVyIHRvIG91dHB1dCAocmVmbGVjdGlvbiBjb2VmZmljaWVudHMpCi0gIFxwYXJhbSBudW1iZXIgb2YgY29lZmZpY2llbnRzCi0KLSAgXHJldHVybiBwcmVkaWN0aW9uIGdhaW4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19BdXRvVG9QYXJjb3IoCi0gICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBpbnB1dCwKLSAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHJlZmxDb2VmZiwKLSAgICAgICAgY29uc3QgSU5UIG51bU9mQ29lZmYKLSAgICAgICAgKQotewotICBJTlQgICAgICAgaSwgaiwgc2NhbGU9MDsKLSAgRklYUF9EQkwgIHRtcCwgcGFyY29yV29ya0J1ZmZlcltUTlNfTUFYX09SREVSXTsKLSAgSU5UICAgICAgIHByZWRpY3Rpb25HYWluID0gKElOVCkoVE5TX1BSRURHQUlOX1NDQUxFKTsKLQotICBGSVhQX0RCTCAqUkVTVFJJQ1Qgd29ya0J1ZmZlciA9IHBhcmNvcldvcmtCdWZmZXI7Ci0gIGNvbnN0IEZJWFBfREJMICBhdXRvQ29ycl8wID0gaW5wdXRbMF07Ci0KLSAgRkRLbWVtY2xlYXIocmVmbENvZWZmLG51bU9mQ29lZmYqc2l6ZW9mKEZJWFBfREJMKSk7Ci0KLSAgaWYoKEZJWFBfREJMKWlucHV0WzBdID09IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKLSAgICByZXR1cm4ocHJlZGljdGlvbkdhaW4pOworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgaWYgKHBhcmNvciA+IEZES2FhY0VuY190bnNDb2VmZjNCb3JkZXJzW2ldKSBpbmRleCA9IGk7CiAgIH0KLQotICBGREttZW1jcHkod29ya0J1ZmZlciwmaW5wdXRbMV0sbnVtT2ZDb2VmZipzaXplb2YoRklYUF9EQkwpKTsKLSAgZm9yKGk9MDsgaTxudW1PZkNvZWZmOyBpKyspIHsKLSAgICBMT05HIHNpZ24gPSAoKExPTkcpd29ya0J1ZmZlclswXSA+PiAoREZSQUNUX0JJVFMtMSkpOwotICAgIHRtcCA9IChGSVhQX0RCTCkoKExPTkcpd29ya0J1ZmZlclswXV5zaWduKTsKLQotICAgIGlmKGlucHV0WzBdPHRtcCkKLSAgICAgIGJyZWFrOwotCi0gICAgdG1wID0gKEZJWFBfREJMKSgoTE9ORylzY2h1cl9kaXYodG1wLCBpbnB1dFswXSwgRlJBQ1RfQklUUyleKH5zaWduKSk7Ci0gICAgcmVmbENvZWZmW2ldID0gdG1wOwotCi0gICAgZm9yKGo9bnVtT2ZDb2VmZi1pLTE7IGo+PTA7IGotLSkgewotICAgICAgRklYUF9EQkwgYWNjdTEgPSBmTXVsdCh0bXAsIGlucHV0W2pdKTsKLSAgICAgIEZJWFBfREJMIGFjY3UyID0gZk11bHQodG1wLCB3b3JrQnVmZmVyW2pdKTsKLSAgICAgIHdvcmtCdWZmZXJbal0gKz0gYWNjdTE7Ci0gICAgICBpbnB1dFtqXSArPSBhY2N1MjsKLSAgICB9Ci0KLSAgICB3b3JrQnVmZmVyKys7Ci0gIH0KLQotICB0bXAgPSBmTXVsdCgoRklYUF9EQkwpKChMT05HKVROU19QUkVER0FJTl9TQ0FMRTw8MjEpLCBmRGl2Tm9ybShmQWJzKGF1dG9Db3JyXzApLCBmQWJzKGlucHV0WzBdKSwgJnNjYWxlKSk7Ci0gIGlmICggZk11bHREaXYyKGF1dG9Db3JyXzAsIGlucHV0WzBdKTxGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKLSAgICB0bXAgPSAtdG1wOwotICB9Ci0gIHByZWRpY3Rpb25HYWluID0gKExPTkcpc2NhbGVWYWx1ZSh0bXAsc2NhbGUtMjEpOwotCi0gIHJldHVybiAocHJlZGljdGlvbkdhaW4pOworICByZXR1cm4gKGluZGV4IC0gNCk7CiB9CiAKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX1NlYXJjaDQoRklYUF9MUEMgcGFyY29yKSB7CisgIElOVCBpLCBpbmRleCA9IDA7CiAKLXN0YXRpYyBJTlQgRkRLYWFjRW5jX1NlYXJjaDMoRklYUF9EQkwgcGFyY29yKQotewotICBJTlQgaSwgaW5kZXg9MDsKLQotICBmb3IoaT0wO2k8ODtpKyspewotICAgIGlmKHBhcmNvciA+IEZES2FhY0VuY190bnNDb2VmZjNCb3JkZXJzW2ldKQotICAgICAgaW5kZXg9aTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBpZiAocGFyY29yID4gRkRLYWFjRW5jX3Ruc0NvZWZmNEJvcmRlcnNbaV0pIGluZGV4ID0gaTsKICAgfQotICByZXR1cm4oaW5kZXgtNCk7CisgIHJldHVybiAoaW5kZXggLSA4KTsKIH0KIAotc3RhdGljIElOVCBGREthYWNFbmNfU2VhcmNoNChGSVhQX0RCTCBwYXJjb3IpCi17Ci0gIElOVCBpLCBpbmRleD0wOwotCi0gIGZvcihpPTA7aTwxNjtpKyspewotICAgIGlmKHBhcmNvciA+IEZES2FhY0VuY190bnNDb2VmZjRCb3JkZXJzW2ldKQotICAgICAgaW5kZXg9aTsKLSAgfQotICByZXR1cm4oaW5kZXgtOCk7Ci19Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19QYXJjb3IySW5kZXgKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfUGFyY29yMkluZGV4KAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqcGFyY29yLAotICAgICAgICBJTlQgKlJFU1RSSUNUIGluZGV4LAotICAgICAgICBjb25zdCBJTlQgb3JkZXIsCi0gICAgICAgIGNvbnN0IElOVCBiaXRzUGVyQ29lZmYKLSAgICAgICAgKQoteworc3RhdGljIHZvaWQgRkRLYWFjRW5jX1BhcmNvcjJJbmRleChjb25zdCBGSVhQX0xQQyAqcGFyY29yLCBJTlQgKlJFU1RSSUNUIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgb3JkZXIsIGNvbnN0IElOVCBiaXRzUGVyQ29lZmYpIHsKICAgSU5UIGk7Ci0gIGZvcihpPTA7IGk8b3JkZXI7IGkrKykgewotICAgIGlmKGJpdHNQZXJDb2VmZiA9PSAzKQorICBmb3IgKGkgPSAwOyBpIDwgb3JkZXI7IGkrKykgeworICAgIGlmIChiaXRzUGVyQ29lZmYgPT0gMykKICAgICAgIGluZGV4W2ldID0gRkRLYWFjRW5jX1NlYXJjaDMocGFyY29yW2ldKTsKICAgICBlbHNlCiAgICAgICBpbmRleFtpXSA9IEZES2FhY0VuY19TZWFyY2g0KHBhcmNvcltpXSk7CiAgIH0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0luZGV4MlBhcmNvcgpAQCAtMTIxMiwxMzAgKzExODIsMTAgQEAKICAgICBvdXRwdXQ6ICAgICAgIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0luZGV4MlBhcmNvcigKLSAgICAgICAgY29uc3QgSU5UICppbmRleCwKLSAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBhcmNvciwKLSAgICAgICAgY29uc3QgSU5UIG9yZGVyLAotICAgICAgICBjb25zdCBJTlQgYml0c1BlckNvZWZmCi0gICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19JbmRleDJQYXJjb3IoY29uc3QgSU5UICppbmRleCwgRklYUF9MUEMgKlJFU1RSSUNUIHBhcmNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG9yZGVyLCBjb25zdCBJTlQgYml0c1BlckNvZWZmKSB7CiAgIElOVCBpOwotICBmb3IoaT0wOyBpPG9yZGVyOyBpKyspCi0gICAgcGFyY29yW2ldID0gYml0c1BlckNvZWZmID09IDQgPyBGREthYWNFbmNfdG5zRW5jQ29lZmY0W2luZGV4W2ldKzhdIDogRkRLYWFjRW5jX3Ruc0VuY0NvZWZmM1tpbmRleFtpXSs0XTsKKyAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspCisgICAgcGFyY29yW2ldID0gYml0c1BlckNvZWZmID09IDQgPyBGREthYWNFbmNfdG5zRW5jQ29lZmY0W2luZGV4W2ldICsgOF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZES2FhY0VuY190bnNFbmNDb2VmZjNbaW5kZXhbaV0gKyA0XTsKIH0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1BhcmNvclRvTHBjCi0gICAgZGVzY3JpcHRpb246ICBjb252ZXJzaW9uIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzIHRvIExQQyBjb2VmZmljaWVudHMKLSAgICByZXR1cm5zOiAgICAgIEdhaW4gZmFjdG9yCi0gICAgaW5wdXQ6ICAgICAgICByZWZsZWN0aW9uIGNvZWZmaWNpZW50cywgbm8uIG9mIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzIDxvcmRlcj4sCi0gICAgICAgICAgICAgICAgICBwdHIuIHRvIHdvcmsgYnVmZmVyIChyZXF1aXJlZCBzaXplOiBvcmRlcikKLSAgICBvdXRwdXQ6ICAgICAgIDxvcmRlcj4gTFBDIGNvZWZmaWNpZW50cwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX1BhcmNvclRvTHBjKAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqcmVmbENvZWZmLAotICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgTHBjQ29lZmYsCi0gICAgICAgIGNvbnN0IElOVCBudW1PZkNvZWZmLAotICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgd29ya0J1ZmZlcgotICAgICAgICApCi17Ci0gIElOVCBpLCBqOwotICBJTlQgc2hpZnR2YWwsIHBhcjJMcGNTaGlmdFZhbCA9IDY7ICAvKiA2IHNob3VsZCBiZSBlbm91Z2gsIGJlYy4gbWF4KG51bU9mQ29lZmYpID0gMjAgKi8KLSAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0KLSAgTHBjQ29lZmZbMF0gPSByZWZsQ29lZmZbMF0gPj4gcGFyMkxwY1NoaWZ0VmFsOwotICBmb3IoaT0xOyBpPG51bU9mQ29lZmY7IGkrKykgewotICAgIGZvcihqPTA7IGo8aTsgaisrKSB7Ci0gICAgICAgIHdvcmtCdWZmZXJbal0gPSBMcGNDb2VmZltpLTEtal07Ci0gICAgfQotCi0gICAgZm9yKGo9MDsgajxpOyBqKyspIHsKLSAgICAgICAgTHBjQ29lZmZbal0gKz0gZk11bHQocmVmbENvZWZmW2ldLHdvcmtCdWZmZXJbal0pOwotICAgIH0KLQotICAgIExwY0NvZWZmW2ldID0gcmVmbENvZWZmW2ldID4+IHBhcjJMcGNTaGlmdFZhbDsKLSAgfQotCi0gIC8qIG5vcm1hbGl6ZSBMcGNDb2VmZiBhbmQgY2FsYyBzaGlmdGZhY3RvciAqLwotICBmb3IoaT0wOyBpPG51bU9mQ29lZmY7IGkrKykgewotICAgICAgbWF4VmFsID0gZml4TWF4KG1heFZhbCwoRklYUF9EQkwpZml4cF9hYnMoTHBjQ29lZmZbaV0pKTsKLSAgfQotCi0gIHNoaWZ0dmFsID0gQ291bnRMZWFkaW5nQml0cyhtYXhWYWwpOwotICBzaGlmdHZhbCA9IChzaGlmdHZhbD49cGFyMkxwY1NoaWZ0VmFsKSA/IHBhcjJMcGNTaGlmdFZhbCA6IHNoaWZ0dmFsOwotCi0gIGZvcihpPTA7IGk8bnVtT2ZDb2VmZjsgaSsrKQotICAgICAgTHBjQ29lZmZbaV0gPSBMcGNDb2VmZltpXTw8c2hpZnR2YWw7Ci0KLSAgcmV0dXJuIChwYXIyTHBjU2hpZnRWYWwgLSBzaGlmdHZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiEKLSAgXGJyaWVmICAgICBGREthYWNFbmNfQW5hbHlzaXNGaWx0ZXIKLQotICBUTlMgYW5hbHlzaXMgZmlsdGVyIChhbGwtemVybyBmaWx0ZXIpCi0KLSAgXHBhcmFtIHBvaW50ZXIgdG8gc2lnbmFsIHNwZWN0cnVtCi0gIFxwYXJhbSBudW1iZXIgb2YgbGluZXMKLSAgXHBhcmFtIHBvaW50ZXIgdG8gbHBjIGNvZWZmaWNpZW50cwotICBccGFyYW0gZmlsdGVyIG9yZGVyCi0gIFxwYXJhbSBscGMgZ2FpbiBmYWN0b3IKLQotICBccmV0dXJuIHZvaWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBOb3RlOiBpbi1wbGFjZSBjb21wdXRhdGlvbiBwb3NzaWJsZSAqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0FuYWx5c2lzRmlsdGVyKAotICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2lnbmFsLAotICAgICAgICBjb25zdCBJTlQgbnVtT2ZMaW5lcywKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKnByZWRpY3RvckNvZWZmLAotICAgICAgICBjb25zdCBJTlQgb3JkZXIsCi0gICAgICAgIGNvbnN0IElOVCBscGNHYWluRmFjdG9yCi0gICAgICAgICkKLXsKLSAgRklYUF9EQkwgc3RhdHVzVmFyW1ROU19NQVhfT1JERVJdOwotICBJTlQgaSwgajsKLSAgY29uc3QgSU5UIHNoaWZ0ID0gbHBjR2FpbkZhY3RvciArIDE7ICAgICAgLyogKzEsIGJlY2F1c2UgZk11bHREaXYyICovCi0gIEZJWFBfREJMIHRtcDsKLQotICBpZiAob3JkZXI+MCkgewotCi0gICAgSU5UIGlkeCA9IDA7Ci0KLSAgICAvKiBrZWVwIGZpbHRlciBjb2VmZmljaWVudHMgdHdpY2UgYW5kIHNhdmUgbWVtb3J5IGNvcHkgb3BlcmF0aW9uIGluCi0gICAgICAgbW9kdWxvIHN0YXRlIGJ1ZmZlciAqLwotI2lmIGRlZmluZWQoQVJDSF9QUkVGRVJfTVVMVF8zMngxNikKLSAgICBGSVhQX1NHTCAgY29lZmZbMipUTlNfTUFYX09SREVSXTsKLSAgICBjb25zdCBGSVhQX1NHTCAqcENvZWZmOwotICAgIGZvcihpPTA7aTxvcmRlcjtpKyspIHsKLSAgICAgIGNvZWZmW2ldICAgICAgID0gRlhfREJMMkZYX1NHTChwcmVkaWN0b3JDb2VmZltpXSk7Ci0gICAgfQotICAgIEZES21lbWNweSgmY29lZmZbb3JkZXJdLCBjb2VmZiwgb3JkZXIqc2l6ZW9mKEZJWFBfU0dMKSk7Ci0jZWxzZQotICAgIEZJWFBfREJMICBjb2VmZlsyKlROU19NQVhfT1JERVJdOwotICAgIGNvbnN0IEZJWFBfREJMICpwQ29lZmY7Ci0gICAgRkRLbWVtY3B5KCZjb2VmZlswXSwgICAgIHByZWRpY3RvckNvZWZmLCBvcmRlcipzaXplb2YoRklYUF9EQkwpKTsKLSAgICBGREttZW1jcHkoJmNvZWZmW29yZGVyXSwgcHJlZGljdG9yQ29lZmYsIG9yZGVyKnNpemVvZihGSVhQX0RCTCkpOwotI2VuZGlmCi0gICAgRkRLbWVtY2xlYXIoc3RhdHVzVmFyLCBvcmRlcipzaXplb2YoRklYUF9EQkwpKTsKLQotICAgIGZvcihqPTA7IGo8bnVtT2ZMaW5lczsgaisrKSB7Ci0gICAgICBwQ29lZmYgPSAmY29lZmZbKG9yZGVyLWlkeCldOwotICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMCk7Ci0gICAgICBmb3IoaT0wOyBpPG9yZGVyOyBpKyspIHsKLSAgICAgICAgICB0bXAgPSBmTXVsdEFkZERpdjIodG1wLCBwQ29lZmZbaV0sIHN0YXR1c1ZhcltpXSkgOwotICAgICAgfQotCi0gICAgICBpZigtLWlkeDwwKSB7IGlkeCA9IG9yZGVyLTE7IH0KLSAgICAgIHN0YXR1c1ZhcltpZHhdID0gc2lnbmFsW2pdOwotCi0gICAgICBGREtfQVNTRVJUKGxwY0dhaW5GYWN0b3I+PTApOwotICAgICAgc2lnbmFsW2pdID0gKHRtcDw8c2hpZnQpICsgc2lnbmFsW2pdOwotICAgIH0KLSAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Rucy5oIGIvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmgKaW5kZXggMjgyNGNiYy4uYTM3Zjk3OCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmgKKysrIGIvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjUgKzkwLDI1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIEFsZXggR3JvZXNjaGVsCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogVGVtcG9yYWwgbm9pc2Ugc2hhcGluZworICAgQXV0aG9yKHMpOiAgIEFsZXggR3JvZXNjaGVsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBUZW1wb3JhbCBub2lzZSBzaGFwaW5nCiAKLSNpZm5kZWYgX1ROU19ICi0jZGVmaW5lIF9UTlNfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBQUNFTkNfVE5TX0gKKyNkZWZpbmUgQUFDRU5DX1ROU19ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKICNpbmNsdWRlICJwc3lfY29uc3QuaCIKIAotCiAjaWZuZGVmIFBJCi0jZGVmaW5lIFBJICAgICAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMxZgorI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MzFmCiAjZW5kaWYKIAogLyoqCkBAIC0xMTQsMzIgKzEyNSwzMyBAQAogLyogVE5TIG1heCBmaWx0ZXIgb3JkZXIgZm9yIExvdyBDb21wbGV4aXR5IE1QRUc0IHByb2ZpbGUgKi8KICNkZWZpbmUgVE5TX01BWF9PUkRFUiAxMgogCi0KICNkZWZpbmUgTUFYX05VTV9PRl9GSUxURVJTIDIKIAotI2RlZmluZSBISUZJTFQgMCAgICAgICAgICAgLyogaW5kZXggb2YgaGlnaGVyIGZpbHRlciAgICovCi0jZGVmaW5lIExPRklMVCAxICAgICAgICAgICAvKiBpbmRleCBvZiBsb3dlciBmaWx0ZXIgICAgKi8KKyNkZWZpbmUgSElGSUxUIDAgLyogaW5kZXggb2YgaGlnaGVyIGZpbHRlciAgICovCisjZGVmaW5lIExPRklMVCAxIC8qIGluZGV4IG9mIGxvd2VyIGZpbHRlciAgICAqLwogCi0KLXR5cGVkZWYgc3RydWN0eyAvKiBzdHVmZiB0aGF0IGlzIHRhYnVsYXRlZCBkZXBlbmRlbnQgb24gYml0cmF0ZSBldGMuICovCi0gIElOVCAgICAgIGZpbHRlckVuYWJsZWRbTUFYX05VTV9PRl9GSUxURVJTXTsKLSAgSU5UICAgICAgdGhyZXNoT25bTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAgICAgICAgICAgLyogbWluLiBwcmVkaWN0aW9uIGdhaW4gZm9yIHVzaW5nIHRucyBUQUJVTCovCi0gIElOVCAgICAgIGZpbHRlclN0YXJ0RnJlcVtNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgICAgIC8qIGxvd2VzdCBmcmVxIGZvciBscGMgVEFCVUwqLwotICBJTlQgICAgICB0bnNMaW1pdE9yZGVyW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgICAgICAvKiBMaW1pdCBmb3IgVE5TIG9yZGVyIFRBQlVMKi8KLSAgSU5UICAgICAgdG5zRmlsdGVyRGlyZWN0aW9uW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgLyogRmlsdGVyaW5nIGRpcmVjdGlvbiwgMD11cCwgMT1kb3duIFRBQlVMICovCi0gIElOVCAgICAgIGFjZlNwbGl0W01BWF9OVU1fT0ZfRklMVEVSU107Ci0gIEZJWFBfREJMIHRuc1RpbWVSZXNvbHV0aW9uW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgIC8qIFROUyBtYXguIHRpbWUgcmVzb2x1dGlvbiBUQUJVTC4gU2hvdWxkIGJlIGZyYWN0IGJ1dCBNU1ZDIHdvbid0IGNvbXBpbGUgdGhlbiAqLwotICBJTlQgICAgICBzZXBlcmF0ZUZpbHRlcnNBbGxvd2VkOwordHlwZWRlZiBzdHJ1Y3QgeyAvKiBzdHVmZiB0aGF0IGlzIHRhYnVsYXRlZCBkZXBlbmRlbnQgb24gYml0cmF0ZSBldGMuICovCisgIElOVCBmaWx0ZXJFbmFibGVkW01BWF9OVU1fT0ZfRklMVEVSU107CisgIElOVCB0aHJlc2hPbltNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgICAgLyogbWluLiBwcmVkaWN0aW9uIGdhaW4gZm9yIHVzaW5nIHRucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBQlVMKi8KKyAgSU5UIGZpbHRlclN0YXJ0RnJlcVtNQVhfTlVNX09GX0ZJTFRFUlNdOyAvKiBsb3dlc3QgZnJlcSBmb3IgbHBjIFRBQlVMKi8KKyAgSU5UIHRuc0xpbWl0T3JkZXJbTUFYX05VTV9PRl9GSUxURVJTXTsgICAvKiBMaW1pdCBmb3IgVE5TIG9yZGVyIFRBQlVMKi8KKyAgSU5UIHRuc0ZpbHRlckRpcmVjdGlvbltNQVhfTlVNX09GX0ZJTFRFUlNdOyAvKiBGaWx0ZXJpbmcgZGlyZWN0aW9uLCAwPXVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9ZG93biBUQUJVTCAqLworICBJTlQgYWNmU3BsaXRbTUFYX05VTV9PRl9GSUxURVJTXTsKKyAgRklYUF9EQkwgdG5zVGltZVJlc29sdXRpb25bTUFYX05VTV9PRl9GSUxURVJTXTsgLyogVE5TIG1heC4gdGltZSByZXNvbHV0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBQlVMLiBTaG91bGQgYmUgZnJhY3QgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TVkMgd29uJ3QgY29tcGlsZSB0aGVuICovCisgIElOVCBzZXBlcmF0ZUZpbHRlcnNBbGxvd2VkOwogfSBUTlNfUEFSQU1FVEVSX1RBQlVMQVRFRDsKIAotCi10eXBlZGVmIHN0cnVjdCB7ICAgLyphc3NpZ25lZCBhdCBJbml0VGltZSovCit0eXBlZGVmIHN0cnVjdCB7IC8qYXNzaWduZWQgYXQgSW5pdFRpbWUqLwogICBUTlNfUEFSQU1FVEVSX1RBQlVMQVRFRCBjb25mVGFiOwogICBJTlQgaXNMb3dEZWxheTsKICAgSU5UIHRuc0FjdGl2ZTsKLSAgSU5UIG1heE9yZGVyOyAgICAgICAgICAgICAgICAvKiBtYXguIG9yZGVyIG9mIHRucyBmaWx0ZXIgKi8KKyAgSU5UIG1heE9yZGVyOyAvKiBtYXguIG9yZGVyIG9mIHRucyBmaWx0ZXIgKi8KICAgSU5UIGNvZWZSZXM7Ci0gIEZJWFBfREJMIGFjZldpbmRvd1tNQVhfTlVNX09GX0ZJTFRFUlNdW1ROU19NQVhfT1JERVIrMysxXTsKKyAgRklYUF9EQkwgYWNmV2luZG93W01BWF9OVU1fT0ZfRklMVEVSU11bVE5TX01BWF9PUkRFUiArIDMgKyAxXTsKICAgLyogbm93IHNvbWUgdGhpbmdzIHRoYXQgb25seSBwcm9iYWJseSBjYW4gYmUgZG9uZSBhdCBJbml0IHRpbWU7CiAgICAgIGNvdWxkIGJlIHRoZXkgaGF2ZSB0byBiZSBzcGxpdCB1cCBmb3IgZWFjaCBpbmRpdmlkdWFsIChzaG9ydCkgd2luZG93IG9yCiAgICAgIGV2ZW4gZmlsdGVyLiAgKi8KQEAgLTE0OCw1NSArMTYwLDU0IEBACiAgIElOVCBscGNTdG9wQmFuZDsKICAgSU5UIGxwY1N0b3BMaW5lOwogCi19VE5TX0NPTkZJRzsKLQorfSBUTlNfQ09ORklHOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIElOVCAgIHRuc0FjdGl2ZVtNQVhfTlVNX09GX0ZJTFRFUlNdOwotICBJTlQgICBwcmVkaWN0aW9uR2FpbltNQVhfTlVNX09GX0ZJTFRFUlNdOworICBJTlQgdG5zQWN0aXZlW01BWF9OVU1fT0ZfRklMVEVSU107CisgIElOVCBwcmVkaWN0aW9uR2FpbltNQVhfTlVNX09GX0ZJTFRFUlNdOwogfSBUTlNfU1VCQkxPQ0tfSU5GTzsKIAotdHlwZWRlZiBzdHJ1Y3R7ICAgLypjaGFuZ2VkIGF0IHJ1blRpbWUqLwordHlwZWRlZiBzdHJ1Y3QgeyAvKmNoYW5nZWQgYXQgcnVuVGltZSovCiAgIFROU19TVUJCTE9DS19JTkZPIHN1YkJsb2NrSW5mb1tUUkFOU19GQUNdOwogICBGSVhQX0RCTCByYXRpb011bHRUYWJsZVtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOwogfSBUTlNfREFUQV9TSE9SVDsKIAotdHlwZWRlZiBzdHJ1Y3R7ICAgLypjaGFuZ2VkIGF0IHJ1blRpbWUqLwordHlwZWRlZiBzdHJ1Y3QgeyAvKmNoYW5nZWQgYXQgcnVuVGltZSovCiAgIFROU19TVUJCTE9DS19JTkZPIHN1YkJsb2NrSW5mbzsKICAgRklYUF9EQkwgcmF0aW9NdWx0VGFibGVbTUFYX1NGQl9MT05HXTsKIH0gVE5TX0RBVEFfTE9ORzsKIAogLyogY2FuIGJlIGltcGxlbWVudGVkIGFzIHVuaW9uICovCi10eXBlZGVmIHNob3VsZEJlVW5pb257Cit0eXBlZGVmIHNob3VsZEJlVW5pb24gewogICBUTlNfREFUQV9MT05HIExvbmc7CiAgIFROU19EQVRBX1NIT1JUIFNob3J0OwotfVROU19EQVRBX1JBVzsKK30KK1ROU19EQVRBX1JBVzsKIAotdHlwZWRlZiBzdHJ1Y3R7Cit0eXBlZGVmIHN0cnVjdCB7CiAgIElOVCBudW1PZlN1YmJsb2NrczsKICAgVE5TX0RBVEFfUkFXIGRhdGFSYXc7CiAgIElOVCB0bnNNYXhTY2FsZVNwZWM7CiAgIElOVCBmaWx0ZXJzTWVyZ2VkOwotfVROU19EQVRBOworfSBUTlNfREFUQTsKIAotdHlwZWRlZiBzdHJ1Y3R7Cit0eXBlZGVmIHN0cnVjdCB7CiAgIElOVCBudW1PZkZpbHRlcnNbVFJBTlNfRkFDXTsKICAgSU5UIGNvZWZSZXNbVFJBTlNfRkFDXTsKICAgSU5UIGxlbmd0aFtUUkFOU19GQUNdW01BWF9OVU1fT0ZfRklMVEVSU107CiAgIElOVCBvcmRlcltUUkFOU19GQUNdW01BWF9OVU1fT0ZfRklMVEVSU107CiAgIElOVCBkaXJlY3Rpb25bVFJBTlNfRkFDXVtNQVhfTlVNX09GX0ZJTFRFUlNdOwogICBJTlQgY29lZkNvbXByZXNzW1RSQU5TX0ZBQ11bTUFYX05VTV9PRl9GSUxURVJTXTsKLSAgICAvKiBmb3IgTG9uZzogbGVuZ3RoIFROU19NQVhfT1JERVIgKDEyIGZvciBMQykgaXMgcmVxdWlyZWQgLT4gMTIgKi8KLSAgICAvKiBmb3IgU2hvcnQ6IGxlbmd0aCBUUkFOU19GQUMqVE5TX01BWF9PUkRFUiAob25seSA1IGZvciBzaG9ydCBMQykgaXMgcmVxdWlyZWQgLT4gOCo1PTQwICovCi0gICAgLyogQ3VycmVudGx5IFRSQU5TX0ZBQypUTlNfTUFYX09SREVSID0gOCoxMiA9IDk2IChmb3IgTEMpIGlzIHVzZWQgKHBlciBjaGFubmVsKSEgTWVtb3J5IGNvdWxkIGJlIHNhdmVkIGhlcmUhICovCisgIC8qIGZvciBMb25nOiBsZW5ndGggVE5TX01BWF9PUkRFUiAoMTIgZm9yIExDKSBpcyByZXF1aXJlZCAtPiAxMiAqLworICAvKiBmb3IgU2hvcnQ6IGxlbmd0aCBUUkFOU19GQUMqVE5TX01BWF9PUkRFUiAob25seSA1IGZvciBzaG9ydCBMQykgaXMgcmVxdWlyZWQKKyAgICogLT4gOCo1PTQwICovCisgIC8qIEN1cnJlbnRseSBUUkFOU19GQUMqVE5TX01BWF9PUkRFUiA9IDgqMTIgPSA5NiAoZm9yIExDKSBpcyB1c2VkIChwZXIKKyAgICogY2hhbm5lbCkhIE1lbW9yeSBjb3VsZCBiZSBzYXZlZCBoZXJlISAqLwogICBJTlQgY29lZltUUkFOU19GQUNdW01BWF9OVU1fT0ZfRklMVEVSU11bVE5TX01BWF9PUkRFUl07Ci19VE5TX0lORk87Cit9IFROU19JTkZPOwogCi1JTlQgRkRLYWFjRW5jX0ZyZXFUb0JhbmRXaXRoUm91bmRpbmcoCi0gICAgICAgIGNvbnN0IElOVCBmcmVxLAotICAgICAgICBjb25zdCBJTlQgZnMsCi0gICAgICAgIGNvbnN0IElOVCBudW1PZkJhbmRzLAotICAgICAgICBjb25zdCBJTlQgKmJhbmRTdGFydE9mZnNldAotICAgICAgICApOworSU5UIEZES2FhY0VuY19GcmVxVG9CYW5kV2lkdGhSb3VuZGluZyhjb25zdCBJTlQgZnJlcSwgY29uc3QgSU5UIGZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtT2ZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpiYW5kU3RhcnRPZmZzZXQpOwogCi0jZW5kaWYgLyogX1ROU19IICovCisjZW5kaWYgLyogQUFDRU5DX1ROU19IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2Fkal90aHIuY3BwIGIvbGliQUFDZW5jL3NyYy9hZGpfdGhyLmNwcAppbmRleCAwOTU4NGY0Li42ZTE5NjgwIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2Fkal90aHIuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWRqX3Roci5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksODg5ICs5MCwxMDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgICBjb250ZW50cy9kZXNjcmlwdGlvbjogVGhyZXNob2xkIGNvbXBlbnNhdGlvbgorICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogVGhyZXNob2xkIGNvbXBlbnNhdGlvbgogCi0jaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgImFkal90aHJfZGF0YS5oIgogI2luY2x1ZGUgImFkal90aHIuaCIKLSNpbmNsdWRlICJxY19kYXRhLmgiCiAjaW5jbHVkZSAic2ZfZXN0aW0uaCIKICNpbmNsdWRlICJhYWNFbmNfcmFtLmgiCiAKKyNkZWZpbmUgTlVNX05SR19MRVZTICg4KQorI2RlZmluZSBJTlZfSU5UX1RBQl9TSVpFICg4KQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGludkludFtJTlZfSU5UX1RBQl9TSVpFXSA9IHsKKyAgICAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDQwMDAwMDAwLCAweDJhYWFhYWFhLAorICAgIDB4MjAwMDAwMDAsIDB4MTk5OTk5OTksIDB4MTU1NTU1NTUsIDB4MTI0OTI0OTJ9OwogCi0KLQotI2RlZmluZSBJTlZfSU5UX1RBQl9TSVpFICAoOCkKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZJbnRbSU5WX0lOVF9UQUJfU0laRV0gPQotewotICAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDQwMDAwMDAwLCAweDJhYWFhYWFhLCAweDIwMDAwMDAwLCAweDE5OTk5OTk5LCAweDE1NTU1NTU1LCAweDEyNDkyNDkyCi19OwotCi0KLSNkZWZpbmUgSU5WX1NRUlQ0X1RBQl9TSVpFICAoOCkKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZTcXJ0NFtJTlZfU1FSVDRfVEFCX1NJWkVdID0KLXsKLSAgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZiwgMHg2YmEyN2U2NSwgMHg2MTQyNGJiNSwgMHg1YTgyNzk5OSwgMHg1NTk5NDg0NSwgMHg1MWM4ZTMzYywgMHg0ZWIxNjBkMQotfTsKLQorI2RlZmluZSBJTlZfU1FSVDRfVEFCX1NJWkUgKDgpCitzdGF0aWMgY29uc3QgRklYUF9EQkwgaW52U3FydDRbSU5WX1NRUlQ0X1RBQl9TSVpFXSA9IHsKKyAgICAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDZiYTI3ZTY1LCAweDYxNDI0YmI1LAorICAgIDB4NWE4Mjc5OTksIDB4NTU5OTQ4NDUsIDB4NTFjOGUzM2MsIDB4NGViMTYwZDF9OwogCiAvKnN0YXRpYyBjb25zdCBJTlQgICAgICBpbnZSZWRFeHAgPSA0OyovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkTWluMSA9IChGSVhQX0RCTCkweGZjYWQwZGRmOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjMxNikvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjIgPSAoRklYUF9EQkwpMHgwMzUxZTFhMjsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMy4xNikgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCAgU25yTGRGYWMgID0gKEZJWFBfREJMKTB4ZmY1YjJjM2U7IC8qRkwyRlhDT05TVF9EQkwoRkRLbG9nKDAuOCkgIC9GREtsb2coMi4wKS9MRF9EQVRBX1NDQUxJTkcpOyovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgU25yTGRNaW4xID0KKyAgICAoRklYUF9EQkwpMHhmY2FkMGRkZjsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC4zMTYpL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBTbnJMZE1pbjIgPQorICAgIChGSVhQX0RCTCkweDAzNTFlMWEyOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygzLjE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIFNuckxkRmFjID0KKyAgICAoRklYUF9EQkwpMHhmZjViMmMzZTsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC44KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwogCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkTWluMyA9IChGSVhQX0RCTCkweGZlMDAwMDAwOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjUpICAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjQgPSAoRklYUF9EQkwpMHgwMjAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMi4wKSAgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCAgU25yTGRNaW41ID0gKEZJWFBfREJMKTB4ZmMwMDAwMDA7IC8qRkwyRlhDT05TVF9EQkwoRkRLbG9nKDAuMjUpIC9GREtsb2coMi4wKS9MRF9EQVRBX1NDQUxJTkcpOyovCi0KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBTbnJMZE1pbjMgPQorICAgIChGSVhQX0RCTCkweGZlMDAwMDAwOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9GREtsb2coMi4wKS9MRF9EQVRBX1NDQUxJTkcpOyovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgU25yTGRNaW40ID0KKyAgICAoRklYUF9EQkwpMHgwMjAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMi4wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIFNuckxkTWluNSA9CisgICAgKEZJWFBfREJMKTB4ZmMwMDAwMDA7IC8qRkwyRlhDT05TVF9EQkwoRkRLbG9nKDAuMjUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9GREtsb2coMi4wKS9MRF9EQVRBX1NDQUxJTkcpOyovCiAKIC8qCiBUaGUgYml0czJQZSBmYWN0b3JzIGFyZSBjaG9vc2VuIGZvciB0aGUgY2FzZSB0aGF0IHNvbWUgdGltZXMKIHRoZSBjcmFzaCByZWNvdmVyeSBzdHJhdGVneSB3aWxsIGJlIGFjdGl2YXRlZCBvbmNlLgogKi8KKyNkZWZpbmUgQUZURVJCVVJORVJfU1RBVEkgMgorI2RlZmluZSBNQVhfQUxMT1dFRF9FTF9DSEFOTkVMUyAyCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgSU5UICAgICAgICAgICAgICAgICBiaXRyYXRlOwotICBVTE9ORyAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbW9ubzsKLSAgVUxPTkcgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX21vbm9fc2xvcGU7Ci0gIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW87Ci0gIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW9fc2xvcGU7Ci0gIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tb25vX3NjZk9wdDsKLSAgVUxPTkcgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0X3Nsb3BlOwotICBVTE9ORyAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3Jfc3RlcmVvX3NjZk9wdDsKLSAgVUxPTkcgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX3N0ZXJlb19zY2ZPcHRfc2xvcGU7Ci0KKyAgSU5UIGJpdHJhdGU7CisgIEZJWFBfREJMIGJpdHMyUGVGYWN0b3JbQUZURVJCVVJORVJfU1RBVEldW01BWF9BTExPV0VEX0VMX0NIQU5ORUxTXTsKIH0gQklUX1BFX1NGQUM7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgSU5UICAgICAgICAgICBzYW1wbGVSYXRlOwotICBjb25zdCBCSVRfUEVfU0ZBQyAqIHBQZVRhYjsKLSAgY29uc3QgSU5UICAgICAgICAgICBuRW50cmllczsKKyAgSU5UIHNhbXBsZVJhdGU7CisgIGNvbnN0IEJJVF9QRV9TRkFDICpwUGVUYWI7CisgIElOVCBuRW50cmllczsKIAogfSBCSVRTMlBFX0NGR19UQUI7CiAKKyNkZWZpbmUgRkwyQjJQRSh2YWx1ZSkgRkwyRlhDT05TVF9EQkwoKHZhbHVlKSAvICgxIDw8IDIpKQorCiBzdGF0aWMgY29uc3QgQklUX1BFX1NGQUMgU19CaXRzMlBlVGFiMTYwMDBbXSA9IHsKLSAgeyAxMDAwMCwgMHgyMjhGNUMyOSwgMHgwMkZFRjU1RCwgMHgxRDcwQTNENywgMHgwOUJDOUQ2RCwgMHgyMjhGNUMyOSwgMHgwMkZFRjU1RCwgMHgxQzI4RjVDMywgMHgwQ0JCOTJDQX0sCi0gIHsgMjQwMDAsIDB4MjNENzBBM0QsIDB4MDI5RjE2QjEsIDB4MjE5OTk5OUEsIDB4MDdERDQ0MTMsIDB4MjNENzBBM0QsIDB4MDI5RjE2QjEsIDB4MjE5OTk5OUEsIDB4MDdERDQ0MTN9LAotICB7IDMyMDAwLCAweDI0N0FFMTQ4LCAweDExQjFEOTJCLCAweDIzODUxRUI4LCAweDAxRjc1MTA1LCAweDI0N0FFMTQ4LCAweDExMEExMzdGLCAweDIzODUxRUI4LCAweDAxRjc1MTA1fSwKLSAgeyA0ODAwMCwgMHgyRDFFQjg1MiwgMHg2ODMzQzYwMCwgMHgyNDdBRTE0OCwgMHgwMTRGOEI1OSwgMHgyQ0NDQ0NDRCwgMHg2OERCOEJBQywgMHgyNDdBRTE0OCwgMHgwMUY3NTEwNX0sCi0gIHsgNjQwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjUxRUI4NTIsIDB4MDE0ODAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjU3MEEzRDcsIDB4MDE0ODAwMDB9LAotICB7IDk2MDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI2MDAwMDAwLCAweDAxMDAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI2MDAwMDAwLCAweDAxMDAwMDAwfSwKLSAgezEyODAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNzBhM2Q4MCwgMHgwMTAwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNzBhM2Q4MCwgMHgwMTAwMDAwMH0sCi0gIHsxNDgwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjgwMDAwMDAsIDB4MDAwMDAwMDB9Ci19OworICAgIC8qIGJpdHJhdGV8ICAgYWZ0ZXJidXJuZXIgb2ZmICAgICAgICAgICAgICB8ICAgYWZ0ZXJidXJuZXIgb24gfCB8ICAgbkNoPTEKKyAgICAgICB8ICAgbkNoPTIgICAgICAgfCAgIG5DaD0xICAgICAgIHwgICBuQ2g9MiAgICAgICAgKi8KKyAgICB7MTAwMDAsCisgICAgIHt7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMC4wMGYpfSwge0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDAuMDBmKX19fSwKKyAgICB7MjQwMDAsCisgICAgIHt7RkwyQjJQRSgxLjgwZiksIEZMMkIyUEUoMS40MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuMjBmKX19fSwKKyAgICB7MzIwMDAsCisgICAgIHt7RkwyQjJQRSgxLjgwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNDBmKX19fSwKKyAgICB7NDgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS44MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNjBmKX19fSwKKyAgICB7NjQwMDAsCisgICAgIHt7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDEuNjBmKX19fSwKKyAgICB7OTYwMDAsCisgICAgIHt7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS44MGYpfSwge0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuNjBmKX19fSwKKyAgICB7MTI4MDAwLAorICAgICB7e0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuODBmKX0sIHtGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjgwZil9fX0sCisgICAgezE0ODAwMCwKKyAgICAge3tGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjgwZil9LCB7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS40MGYpfX19fTsKIAogc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjIyMDUwW10gPSB7Ci0gIHsgMTYwMDAsIDB4MWE4ZjVjMjksIDB4MTc5N2NjM2EsIDB4MTI4ZjVjMjksIDB4MThlNzU3OTMsIDB4MTc1YzI4ZjYsIDB4MjIxNDI2ZmUsIDB4MDAwMDAwMDAsIDB4NWE3MDhlZGV9LAotICB7IDI0MDAwLCAweDIwNTFlYjg1LCAweDA5MmNjZjZjLCAweDE4YTNkNzBhLCAweDEzYTkyYTMwLCAweDFmYWUxNDdiLCAweGJjYmU2MWQsICAweDE2MTQ3YWUxLCAweDE4ZTc1NzkzfSwKLSAgeyAzMjAwMCwgMHgyMjhmNWMyOSwgMHgwMjlmMTZiMSwgMHgxZDcwYTNkNywgMHgwODg1MDljMCwgMHgyMjhmNWMyOSwgMHgyOWYxNmIxLCAgMHgxYzI4ZjVjMywgMHgwYjI0MjA3MX0sCi0gIHsgNDgwMDAsIDB4MjNkNzBhM2QsIDB4MDE0ZjhiNTksIDB4MjE5OTk5OWEsIDB4MDNlZWEyMGEsIDB4MjNkNzBhM2QsIDB4MTRmOGI1OSwgIDB4MjE5OTk5OWEsIDB4MDNlZWEyMGF9LAotICB7IDY0MDAwLCAweDI0N2FlMTQ4LCAweDA4ZDhlYzk2LCAweDIzODUxZWI4LCAweDAwZmJhODgyLCAweDI0N2FlMTQ4LCAweDg4NTA5YzAsICAweDIzODUxZWI4LCAweDAwZmJhODgyfSwKLSAgeyA5NjAwMCwgMHgyZDFlYjg1MiwgMHgzNDE5ZTMwMCwgMHgyNDdhZTE0OCwgMHgwMGE3YzVhYywgMHgyY2NjY2NjZCwgMHgzNDZkYzVkNiwgMHgyNDdhZTE0OCwgMHgwMGZiYTg4Mn0sCi0gIHsxMjgwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjUxZWI4NTIsIDB4MDI5ZjE2YjEsIDB4NjAwMDAwMDAsIDB4MjVjMjhmNDAsIDB4MjU3MGEzZDcsIDB4MDA5ZjE2YjF9LAotICB7MTQ4MDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI2Yjg1MWVjLCAweDAwMDAwMDAwLCAweDYwMDAwMDAwLCAweDI1YzI4ZjQwLCAweDI3MGEzZDcxLCAweDAwMDAwMDAwfQotfTsKKyAgICAvKiBiaXRyYXRlfCAgIGFmdGVyYnVybmVyIG9mZiAgICAgICAgICAgICAgfCAgIGFmdGVyYnVybmVyIG9uIHwgfCAgIG5DaD0xCisgICAgICAgfCAgIG5DaD0yICAgICAgIHwgICBuQ2g9MSAgICAgICB8ICAgbkNoPTIgICAgICAgICovCisgICAgezE2MDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNDBmKX0sIHtGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgwLjgwZil9fX0sCisgICAgezI0MDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNDBmKX0sIHtGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjAwZil9fX0sCisgICAgezMyMDAwLAorICAgICB7e0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuNDBmKX0sIHtGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjIwZil9fX0sCisgICAgezQ4MDAwLAorICAgICB7e0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgxLjQwZil9fX0sCisgICAgezY0MDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjQwZil9fX0sCisgICAgezk2MDAwLAorICAgICB7e0ZMMkIyUEUoMS44MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuODBmKSwgRkwyQjJQRSgxLjYwZil9fX0sCisgICAgezEyODAwMCwKKyAgICAge3tGTDJCMlBFKDEuODBmKSwgRkwyQjJQRSgxLjgwZil9LCB7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS42MGYpfX19LAorICAgIHsxNDgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS44MGYpfSwge0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuNjBmKX19fX07CiAKIHN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIyNDAwMFtdID0gewotICB7IDE2MDAwLCAweDE5ZWI4NTFmLCAweDEzYTkyYTMwLCAweDExNDdhZTE0LCAweDE2NDg0MGUxLCAweDE5OTk5OTlhLCAweDEyNTk5ZWQ4LCAweDAwMDAwMDAwLCAweDQ2Yzc2NGFlfSwKLSAgeyAyNDAwMCwgMHgxZWI4NTFlYywgMHgwZDFiNzE3NiwgMHgxNmI4NTFlYywgMHgxOGU3NTc5MywgMHgxZTE0N2FlMSwgMHgwZmJhODgyNywgMHgxMTQ3YWUxNCwgMHgyYzkwODFjM30sCi0gIHsgMzIwMDAsIDB4MjFlYjg1MWYsIDB4MDQ5NjY3YjYsIDB4MWNjY2NjY2QsIDB4MDczNTdlNjcsIDB4MjFlYjg1MWYsIDB4MDNlZWEyMGEsIDB4MWMyOGY1YzMsIDB4MDczNTdlNjd9LAotICB7IDQ4MDAwLCAweDI0MjhmNWMzLCAweDAxNGY4YjU5LCAweDIwNTFlYjg1LCAweDA1M2UyZDYyLCAweDIzZDcwYTNkLCAweDAxZjc1MTA1LCAweDFmYWUxNDdiLCAweDA3MzU3ZTY3fSwKLSAgeyA2NDAwMCwgMHgyNGNjY2NjZCwgMHgwNWU1ZjMwZSwgMHgyMmUxNDdhZSwgMHgwMWEzNmUyZiwgMHgyNGNjY2NjZCwgMHgwNWU1ZjMwZSwgMHgyMzMzMzMzMywgMHgwMTRmOGI1OX0sCi0gIHsgOTYwMDAsIDB4MmE4ZjVjMjksIDB4MjRiMzNkYjAsIDB4MjQ3YWUxNDgsIDB4MDBmYmE4ODIsIDB4MmE4ZjVjMjksIDB4MjZmZTcxOGIsIDB4MjQ3YWUxNDgsIDB4MDBmYmE4ODJ9LAotICB7MTI4MDAwLCAweDRlNjY2NjY2LCAweDFjZDVmOTljLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhLCAweDUwYTNkNzBhLCAweDE5MmE3MzcxLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhfSwKLSAgezE0ODAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNjE0N2FlMSwgMHgwMDAwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNjE0N2FlMSwgMHgwMDAwMDAwMH0KLX07CisgICAgLyogYml0cmF0ZXwgICBhZnRlcmJ1cm5lciBvZmYgICAgICAgICAgICAgIHwgICBhZnRlcmJ1cm5lciBvbiB8IHwgICBuQ2g9MQorICAgICAgIHwgICBuQ2g9MiAgICAgICB8ICAgbkNoPTEgICAgICB8ICAgbkNoPTIgICAgICAgICAqLworICAgIHsxNjAwMCwKKyAgICAge3tGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjQwZil9LCB7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMC44MGYpfX19LAorICAgIHsyNDAwMCwKKyAgICAge3tGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjIwZil9LCB7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS4wMGYpfX19LAorICAgIHszMjAwMCwKKyAgICAge3tGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjIwZil9LCB7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMC44MGYpfX19LAorICAgIHs0ODAwMCwKKyAgICAge3tGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS40MGYpfX19LAorICAgIHs2NDAwMCwKKyAgICAge3tGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS40MGYpfX19LAorICAgIHs5NjAwMCwKKyAgICAge3tGTDJCMlBFKDEuODBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjgwZiksIEZMMkIyUEUoMS42MGYpfX19LAorICAgIHsxMjgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS44MGYpLCBGTDJCMlBFKDEuODBmKX19fSwKKyAgICB7MTQ4MDAwLAorICAgICB7e0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjgwZil9fX19OwogCiBzdGF0aWMgY29uc3QgQklUX1BFX1NGQUMgU19CaXRzMlBlVGFiMzIwMDBbXSA9IHsKLSAgeyAxNjAwMCwgMHgyNDdhZTE0MCwgMHhGRkZGQUMxRSwgMHgyNzBhM2Q4MCwgMHhGRkZFOUI3QywgMHgxNGNjY2NjMCwgMHgwMDAxMTBBMSwgMHgxNWMyOGY2MCwgMHhGRkZFRUY1Rn0sCi0gIHsgMjQwMDAsIDB4MjMzMzMzNDAsIDB4MGZiYTg4MjcsIDB4MjE5OTk5ODAsIDB4MWI4NjZlNDQsIDB4MThmNWMyODAsIDB4MGZiYTg4MjcsIDB4MTE5OTk5YTAsIDB4NGQ1NTFkNjl9LAotICB7IDMyMDAwLCAweDFkNzBhM2Q3LCAweDA3MzU3ZTY3LCAweDE3YWUxNDdiLCAweDA5ZDQ5NTE4LCAweDFiODUxZWI4LCAweDBhN2M1YWM0LCAweDEyZTE0N2FlLCAweDExMGExMzdmfSwKLSAgeyA0ODAwMCwgMHgyMGY1YzI4ZiwgMHgwNDk2NjdiNiwgMHgxYzdhZTE0OCwgMHgwNTNlMmQ2MiwgMHgyMGEzZDcwYSwgMHgwNTNlMmQ2MiwgMHgxYjMzMzMzMywgMHgwNWU1ZjMwZX0sCi0gIHsgNjQwMDAsIDB4MjMzMzMzMzMsIDB4MDI5ZjE2YjEsIDB4MWYwYTNkNzEsIDB4MDJmMmY5ODcsIDB4MjMzMzMzMzMsIDB4MDI5ZjE2YjEsIDB4MWUxNDdhZTEsIDB4MDNlZWEyMGF9LAotICB7IDk2MDAwLCAweDI1YzI4ZjVjLCAweDJjM2M5ZWVkLCAweDIxZWI4NTFmLCAweDAxZjc1MTA1LCAweDI1YzI4ZjVjLCAweDBhN2M1YWM0LCAweDIxZWI4NTFmLCAweDAxYTM2ZTJmfSwKLSAgezEyODAwMCwgMHg1MGY1YzI4ZiwgMHgxOGE0M2JiNCwgMHgyM2Q3MGEzZCwgMHgwMTBjNmY3YSwgMHgzMDAwMDAwMCwgMHgxNjhiNWNjMCwgMHgyMzg1MWViOCwgMHgwMTkyYTczN30sCi0gIHsxNDgwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjQ3YWUxNDgsIDB4MDBkZmIyM2IsIDB4M2RjMjhmNWMsIDB4MzAwZjRhYWYsIDB4MjQ3YWUxNDgsIDB4MDFiZjY0NzZ9LAotICB7MTYwMDAwLCAweDI1YzI4ZjQwLCAweGIxNWI1NzQwLCAweDI0Y2NjY2NkLCAweDA1M2UyZDYyLCAweDRmNWMyOGY2LCAweGJlZmQwMDcyLCAweDI1MWViODUyLCAweDA0ZmIxMTg0fSwKLSAgezIwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyYjMzMzMzMywgMHgwODM2YmU5MSwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyYjMzMzMzMywgMHgwODkwMzkwZn0sCi0gIHszMjAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4NDk0N2FlMTQsIDB4MDAwMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4NGE4ZjVjMjksIDB4MDAwMDAwMDB9Ci19OworICAgIC8qIGJpdHJhdGV8ICAgYWZ0ZXJidXJuZXIgb2ZmICAgICAgICAgICAgICB8ICAgYWZ0ZXJidXJuZXIgb24gfCB8ICAgbkNoPTEKKyAgICAgICB8ICAgbkNoPTIgICAgICAgfCAgIG5DaD0xICAgICAgIHwgICBuQ2g9MiAgICAgICAgKi8KKyAgICB7MTYwMDAsCisgICAgIHt7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMS40MGYpfSwge0ZMMkIyUEUoMC44MGYpLCBGTDJCMlBFKDAuODBmKX19fSwKKyAgICB7MjQwMDAsCisgICAgIHt7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS4yMGYpfSwge0ZMMkIyUEUoMS4wMGYpLCBGTDJCMlBFKDAuNjBmKX19fSwKKyAgICB7MzIwMDAsCisgICAgIHt7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMS4yMGYpfSwge0ZMMkIyUEUoMS4wMGYpLCBGTDJCMlBFKDAuODBmKX19fSwKKyAgICB7NDgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS40MGYpfSwge0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDEuMjBmKX19fSwKKyAgICB7NjQwMDAsCisgICAgIHt7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS40MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuMjBmKX19fSwKKyAgICB7OTYwMDAsCisgICAgIHt7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS40MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNDBmKX19fSwKKyAgICB7MTI4MDAwLAorICAgICB7e0ZMMkIyUEUoMS44MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuODBmKSwgRkwyQjJQRSgxLjYwZil9fX0sCisgICAgezE0ODAwMCwKKyAgICAge3tGTDJCMlBFKDEuODBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjgwZiksIEZMMkIyUEUoMS42MGYpfX19LAorICAgIHsxNjAwMDAsCisgICAgIHt7RkwyQjJQRSgxLjgwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS44MGYpLCBGTDJCMlBFKDEuNjBmKX19fSwKKyAgICB7MjAwMDAwLAorICAgICB7e0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjYwZil9fX0sCisgICAgezMyMDAwMCwKKyAgICAge3tGTDJCMlBFKDMuMjBmKSwgRkwyQjJQRSgxLjgwZil9LCB7RkwyQjJQRSgzLjIwZiksIEZMMkIyUEUoMS44MGYpfX19fTsKIAogc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjQ0MTAwW10gPSB7Ci0gIHsgMTYwMDAsIDB4MTBhM2Q3MGEsIDB4MTc5N2NjM2EsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NTkyMTAzODYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAotICB7IDI0MDAwLCAweDE2NjY2NjY2LCAweDE3OTdjYzNhLCAweDAwMDAwMDAwLCAweDYzOWQ1ZTRhLCAweDE1YzI4ZjVjLCAweDEyNTk5ZWQ4LCAweDAwMDAwMDAwLCAweDViYzAxYTM3fSwKLSAgeyAzMjAwMCwgMHgxYzI4ZjVjMywgMHgwNDk2NjdiNiwgMHgxODUxZWI4NSwgMHgwNDk2NjdiNiwgMHgxYTNkNzBhNCwgMHgwODg1MDljMCwgMHgxNjY2NjY2NiwgMHgwNTNlMmQ2Mn0sCi0gIHsgNDgwMDAsIDB4MWU2NjY2NjYsIDB4MDVlNWYzMGUsIDB4MWE4ZjVjMjksIDB4MDQ5NjY3YjYsIDB4MWU2NjY2NjYsIDB4MDVlNWYzMGUsIDB4MThmNWMyOGYsIDB4MDVlNWYzMGV9LAotICB7IDY0MDAwLCAweDIxNDdhZTE0LCAweDAzNDZkYzVkLCAweDFjY2NjY2NkLCAweDAyZjJmOTg3LCAweDIxNDdhZTE0LCAweDAyZjJmOTg3LCAweDFiZDcwYTNkLCAweDAzOWFiZjM0fSwKLSAgeyA5NjAwMCwgMHgyNDdhZTE0OCwgMHgwNjhkYjhiYiwgMHgxZmFlMTQ3YiwgMHgwMjlmMTZiMSwgMHgyNDI4ZjVjMywgMHgwNjM5ZDVlNSwgMHgxZjVjMjhmNiwgMHgwMjlmMTZiMX0sCi0gIHsxMjgwMDAsIDB4MmFlMTQ3YWUsIDB4MWI0MzUyNjUsIDB4MjIzZDcwYTQsIDB4MDE5MmE3MzcsIDB4MmEzZDcwYTQsIDB4MTA0MGJmZTQsIDB4MjFlYjg1MWYsIDB4MDE5MmE3Mzd9LAotICB7MTQ4MDAwLCAweDNiODUxZWI4LCAweDI4MzIwNjljLCAweDIzMzMzMzMzLCAweDAwZGZiMjNiLCAweDM0MjhmNWMzLCAweDIwNTRjMjg4LCAweDIyZTE0N2FlLCAweDAwZGZiMjNifSwKLSAgezE2MDAwMCwgMHg0YTNkNzBhNCwgMHhjMzJlYmU1YSwgMHgyMzg1MWViOCwgMHgwMWQ1YzMxNiwgMHg0MDAwMDAwMCwgMHhjYjkyM2EyYiwgMHgyMzMzMzMzMywgMHgwMWQ1YzMxNn0sCi0gIHsyMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjVjMjhmNWMsIDB4MDcxM2YwNzgsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjU3MGEzZDcsIDB4MDcyYTRmMTd9LAotICB7MzIwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDNmYWUxNDdiLCAweDAwMDAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDNmYWUxNDdiLCAweDAwMDAwMDAwfQotfTsKKyAgICAvKiBiaXRyYXRlfCAgIGFmdGVyYnVybmVyIG9mZiAgICAgICAgICAgICAgfCAgIGFmdGVyYnVybmVyIG9uIHwgfCAgIG5DaD0xCisgICAgICAgfCAgIG5DaD0yICAgICAgIHwgICBuQ2g9MSAgICAgICB8ICAgbkNoPTIgICAgICAgICovCisgICAgezE2MDAwLAorICAgICB7e0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDAuODBmKSwgRkwyQjJQRSgxLjAwZil9fX0sCisgICAgezI0MDAwLAorICAgICB7e0ZMMkIyUEUoMS4wMGYpLCBGTDJCMlBFKDEuMjBmKX0sIHtGTDJCMlBFKDEuMDBmKSwgRkwyQjJQRSgwLjgwZil9fX0sCisgICAgezMyMDAwLAorICAgICB7e0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDEuMjBmKX0sIHtGTDJCMlBFKDAuODBmKSwgRkwyQjJQRSgwLjYwZil9fX0sCisgICAgezQ4MDAwLAorICAgICB7e0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDEuMjBmKX0sIHtGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgwLjgwZil9fX0sCisgICAgezY0MDAwLAorICAgICB7e0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuMjBmKX0sIHtGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgxLjAwZil9fX0sCisgICAgezk2MDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuMjBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjIwZil9fX0sCisgICAgezEyODAwMCwKKyAgICAge3tGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS40MGYpfX19LAorICAgIHsxNDgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNjBmKX19fSwKKyAgICB7MTYwMDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjYwZil9fX0sCisgICAgezIwMDAwMCwKKyAgICAge3tGTDJCMlBFKDEuODBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS42MGYpfX19LAorICAgIHszMjAwMDAsCisgICAgIHt7RkwyQjJQRSgzLjIwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMy4yMGYpLCBGTDJCMlBFKDEuNjBmKX19fX07CiAKIHN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWI0ODAwMFtdID0gewotICB7IDE2MDAwLCAweDBmNWMyOGY2LCAweDMxY2VhZjI1LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDc0YTc3MWM5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKLSAgeyAyNDAwMCwgMHgxYjg1MWViOCwgMHgwMjlmMTZiMSwgMHgwMDAwMDAwMCwgMHg2NjNjNzRmYiwgMHgxYzdhZTE0OCwgMHhlNDc5OTFiZCwgMHgwMDAwMDAwMCwgMHg0OTY2N2I1Zn0sCi0gIHsgMzIwMDAsIDB4MWMyOGY1YzMsIDB4MDI5ZjE2YjEsIDB4MThmNWMyOGYsIDB4MDczNTdlNjcsIDB4MTVjMjhmNWMsIDB4MGYxMmMyN2EsIDB4MTFlYjg1MWYsIDB4MTMwMTY0ODR9LAotICB7IDQ4MDAwLCAweDFkNzBhM2Q3LCAweDA1M2UyZDYyLCAweDFjN2FlMTQ4LCAweGZlMDhhZWZjLCAweDFkMWViODUyLCAweDA2OGRiOGJiLCAweDFiMzMzMzMzLCAweGZlYjA3NGE4fSwKLSAgeyA2NDAwMCwgMHgyMDAwMDAwMCwgMHgwM2VlYTIwYSwgMHgxYjg1MWViOCwgMHgwMzQ2ZGM1ZCwgMHgyMDUxZWI4NSwgMHgwMzQ2ZGM1ZCwgMHgxYThmNWMyOSwgMHgwMzlhYmYzNH0sCi0gIHsgOTYwMDAsIDB4MjNkNzBhM2QsIDB4MDUzZTJkNjIsIDB4MWViODUxZWMsIDB4MDI5ZjE2YjEsIDB4MjM4NTFlYjgsIDB4MDRlYTRhOGMsIDB4MWUxNDdhZTEsIDB4MDJmMmY5ODd9LAotICB7MTI4MDAwLCAweDI4ZjVjMjhmLCAweDE0NzI3ZGNjLCAweDIxNDdhZTE0LCAweDAyMThkZWY0LCAweDI4NTFlYjg1LCAweDBlMjdlMGYwLCAweDIwZjVjMjhmLCAweDAyMThkZWY0fSwKLSAgezE0ODAwMCwgMHgzNTcwYTNkNywgMHgxY2Q1Zjk5YywgMHgyMjhmNWMyOSwgMHgwMWJmNjQ3NiwgMHgzMGY1YzI4ZiwgMHgxODc3N2U3NSwgMHgyMjNkNzBhNCwgMHgwMWJmNjQ3Nn0sCi0gIHsxNjAwMDAsIDB4NDAwMDAwMDAsIDB4Y2I5MjNhMmIsIDB4MjMzMzMzMzMsIDB4MDE5MmE3MzcsIDB4MzllYjg1MWYsIDB4ZDA4ZDRiYWUsIDB4MjJlMTQ3YWUsIDB4MDE5MmE3Mzd9LAotICB7MjAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI1MWViODUyLCAweDA2Nzc1YTFiLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI0Y2NjY2NkLCAweDA2YTQxNzVhfSwKLSAgezMyMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgzY2NjY2NjZCwgMHgwMDAwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgzZDFlYjg1MiwgMHgwMDAwMDAwMH0KLX07CisgICAgLyogYml0cmF0ZXwgICBhZnRlcmJ1cm5lciBvZmYgICAgICAgICAgICAgIHwgICBhZnRlcmJ1cm5lciBvbiB8IHwgICBuQ2g9MQorICAgICAgIHwgICBuQ2g9MiAgICAgICB8ICAgbkNoPTEgICAgICAgfCAgIG5DaD0yICAgICAgICAqLworICAgIHsxNjAwMCwKKyAgICAge3tGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgwLjAwZil9LCB7RkwyQjJQRSgwLjgwZiksIEZMMkIyUEUoMC4wMGYpfX19LAorICAgIHsyNDAwMCwKKyAgICAge3tGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjIwZil9LCB7RkwyQjJQRSgxLjAwZiksIEZMMkIyUEUoMC44MGYpfX19LAorICAgIHszMjAwMCwKKyAgICAge3tGTDJCMlBFKDEuMDBmKSwgRkwyQjJQRSgxLjIwZil9LCB7RkwyQjJQRSgwLjYwZiksIEZMMkIyUEUoMC44MGYpfX19LAorICAgIHs0ODAwMCwKKyAgICAge3tGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgxLjAwZil9LCB7RkwyQjJQRSgwLjgwZiksIEZMMkIyUEUoMC44MGYpfX19LAorICAgIHs2NDAwMCwKKyAgICAge3tGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgxLjIwZil9LCB7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMS4wMGYpfX19LAorICAgIHs5NjAwMCwKKyAgICAge3tGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjQwZil9LCB7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS4yMGYpfX19LAorICAgIHsxMjgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNDBmKX19fSwKKyAgICB7MTQ4MDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjQwZil9fX0sCisgICAgezE2MDAwMCwKKyAgICAge3tGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS40MGYpfX19LAorICAgIHsyMDAwMDAsCisgICAgIHt7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNDBmKX19fSwKKyAgICB7MzIwMDAwLAorICAgICB7e0ZMMkIyUEUoMy4yMGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDMuMjBmKSwgRkwyQjJQRSgxLjYwZil9fX19OwogCiBzdGF0aWMgY29uc3QgQklUUzJQRV9DRkdfVEFCIGJpdHMyUGVDb25maWdUYWJbXSA9IHsKLSAgeyAxNjAwMCwgU19CaXRzMlBlVGFiMTYwMDAsIHNpemVvZihTX0JpdHMyUGVUYWIxNjAwMCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9LAotICB7IDIyMDUwLCBTX0JpdHMyUGVUYWIyMjA1MCwgc2l6ZW9mKFNfQml0czJQZVRhYjIyMDUwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0sCi0gIHsgMjQwMDAsIFNfQml0czJQZVRhYjI0MDAwLCBzaXplb2YoU19CaXRzMlBlVGFiMjQwMDApL3NpemVvZihCSVRfUEVfU0ZBQykgfSwKLSAgeyAzMjAwMCwgU19CaXRzMlBlVGFiMzIwMDAsIHNpemVvZihTX0JpdHMyUGVUYWIzMjAwMCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9LAotICB7IDQ0MTAwLCBTX0JpdHMyUGVUYWI0NDEwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjQ0MTAwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0sCi0gIHsgNDgwMDAsIFNfQml0czJQZVRhYjQ4MDAwLCBzaXplb2YoU19CaXRzMlBlVGFiNDgwMDApL3NpemVvZihCSVRfUEVfU0ZBQykgfQotfTsKLQotCisgICAgezE2MDAwLCBTX0JpdHMyUGVUYWIxNjAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjE2MDAwKSAvIHNpemVvZihCSVRfUEVfU0ZBQyl9LAorICAgIHsyMjA1MCwgU19CaXRzMlBlVGFiMjIwNTAsIHNpemVvZihTX0JpdHMyUGVUYWIyMjA1MCkgLyBzaXplb2YoQklUX1BFX1NGQUMpfSwKKyAgICB7MjQwMDAsIFNfQml0czJQZVRhYjI0MDAwLCBzaXplb2YoU19CaXRzMlBlVGFiMjQwMDApIC8gc2l6ZW9mKEJJVF9QRV9TRkFDKX0sCisgICAgezMyMDAwLCBTX0JpdHMyUGVUYWIzMjAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjMyMDAwKSAvIHNpemVvZihCSVRfUEVfU0ZBQyl9LAorICAgIHs0NDEwMCwgU19CaXRzMlBlVGFiNDQxMDAsIHNpemVvZihTX0JpdHMyUGVUYWI0NDEwMCkgLyBzaXplb2YoQklUX1BFX1NGQUMpfSwKKyAgICB7NDgwMDAsIFNfQml0czJQZVRhYjQ4MDAwLAorICAgICBzaXplb2YoU19CaXRzMlBlVGFiNDgwMDApIC8gc2l6ZW9mKEJJVF9QRV9TRkFDKX19OwogCiAvKiB2YWx1ZXMgZm9yIGF2b2lkIGhvbGUgZmxhZyAqLwotZW51bSBfYXZvaWRfaG9sZV9zdGF0ZSB7Ci0gICAgTk9fQUggICAgICAgICAgICAgID0wLAotICAgIEFIX0lOQUNUSVZFICAgICAgICA9MSwKLSAgICBBSF9BQ1RJVkUgICAgICAgICAgPTIKLX07Ci0KK2VudW0gX2F2b2lkX2hvbGVfc3RhdGUgeyBOT19BSCA9IDAsIEFIX0lOQUNUSVZFID0gMSwgQUhfQUNUSVZFID0gMiB9OwogCiAvKiAgUSBmb3JtYXQgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgUV9CSVRGQUMgICAgKDI0KSAgIC8qIFEgc2NhbGluZyB1c2VkIGluIEZES2FhY0VuY19iaXRyZXNDYWxjQml0RmFjKCkgY2FsY3VsYXRpb24gKi8KLSNkZWZpbmUgUV9BVkdCSVRTICAgKDE3KSAgIC8qIHNjYWxlIGJpdCB2YWx1ZXMgKi8KLQorI2RlZmluZSBRX0JJVEZBQyBcCisgICgyNCkgLyogUSBzY2FsaW5nIHVzZWQgaW4gRkRLYWFjRW5jX2JpdHJlc0NhbGNCaXRGYWMoKSBjYWxjdWxhdGlvbiAqLworI2RlZmluZSBRX0FWR0JJVFMgKDE3KSAvKiBzY2FsZSBiaXQgdmFsdWVzICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0luaXRCaXRzMlBlRmFjdG9yCiAgICAgZGVzY3JpcHRpb246ICByZXRyaWV2ZSBiaXRzMlBlRmFjdG9yIGZyb20gdGFibGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgRkRLYWFjRW5jX0luaXRCaXRzMlBlRmFjdG9yKAotICAgICAgICBGSVhQX0RCTCAqYml0czJQZUZhY3Rvcl9tLAotICAgICAgICBJTlQgKmJpdHMyUGVGYWN0b3JfZSwKLSAgICAgICAgY29uc3QgSU5UIGJpdFJhdGUsCi0gICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlLAotICAgICAgICBjb25zdCBJTlQgYWR2YW5jZWRCaXRzVG9QZSwKLSAgICAgICAgY29uc3QgSU5UIGRab25lUXVhbnRFbmFibGUsCi0gICAgICAgIGNvbnN0IElOVCBpbnZRdWFudAotICAgICAgICApCi17Ci0gIC8qIGRlZmF1bHQgYml0czJwZSBmYWN0b3IgKi8KLSAgRklYUF9EQkwgYml0MlBFX20gPSBGTDJGWENPTlNUX0RCTCgxLjE4Zi8oMTw8KDEpKSk7Ci0gIElOVCAgICAgIGJpdDJQRV9lID0gMTsKKyAgICBGSVhQX0RCTCAqYml0czJQZUZhY3Rvcl9tLCBJTlQgKmJpdHMyUGVGYWN0b3JfZSwgY29uc3QgSU5UIGJpdFJhdGUsCisgICAgY29uc3QgSU5UIG5DaGFubmVscywgY29uc3QgSU5UIHNhbXBsZVJhdGUsIGNvbnN0IElOVCBhZHZhbmNlZEJpdHNUb1BlLAorICAgIGNvbnN0IElOVCBkWm9uZVF1YW50RW5hYmxlLCBjb25zdCBJTlQgaW52UXVhbnQpIHsKKyAgLyoqKiogMSkgU2V0IGRlZmF1bHQgYml0czJwZSBmYWN0b3IgKioqKi8KKyAgRklYUF9EQkwgYml0MlBFX20gPSBGTDJGWENPTlNUX0RCTCgxLjE4ZiAvICgxIDw8ICgxKSkpOworICBJTlQgYml0MlBFX2UgPSAxOwogCi0gIC8qIG1ha2UgdXNlIG9mIGFkdmFuY2VkIGJpdHMgdG8gcGUgZmFjdG9yIHRhYmxlICovCi0gIGlmIChhZHZhbmNlZEJpdHNUb1BlKSB7Ci0KKyAgLyoqKiogMikgRm9yIEFBQy0oRSlMRCwgbWFrZSB1c2Ugb2YgYWR2YW5jZWQgYml0cyB0byBwZSBmYWN0b3IgdGFibGUgKioqKi8KKyAgaWYgKGFkdmFuY2VkQml0c1RvUGUgJiYgbkNoYW5uZWxzIDw9ICgyKSkgewogICAgIGludCBpOwogICAgIGNvbnN0IEJJVF9QRV9TRkFDICpwZVRhYiA9IE5VTEw7CiAgICAgSU5UIHNpemUgPSAwOwogCi0KLSAgICAvKiBHZXQgY29ycmVjdCB0YWJsZSBlbnRyeSAqLwotICAgIGZvciAoaT0wOyBpPChJTlQpKHNpemVvZihiaXRzMlBlQ29uZmlnVGFiKS9zaXplb2YoQklUUzJQRV9DRkdfVEFCKSk7IGkrKykgeworICAgIC8qKiogMi4xKSBHZXQgY29ycmVjdCB0YWJsZSBlbnRyeSAqKiovCisgICAgZm9yIChpID0gMDsgaSA8IChJTlQpKHNpemVvZihiaXRzMlBlQ29uZmlnVGFiKSAvIHNpemVvZihCSVRTMlBFX0NGR19UQUIpKTsKKyAgICAgICAgIGkrKykgewogICAgICAgaWYgKHNhbXBsZVJhdGUgPj0gYml0czJQZUNvbmZpZ1RhYltpXS5zYW1wbGVSYXRlKSB7CiAgICAgICAgIHBlVGFiID0gYml0czJQZUNvbmZpZ1RhYltpXS5wUGVUYWI7Ci0gICAgICAgIHNpemUgID0gYml0czJQZUNvbmZpZ1RhYltpXS5uRW50cmllczsKKyAgICAgICAgc2l6ZSA9IGJpdHMyUGVDb25maWdUYWJbaV0ubkVudHJpZXM7CiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCAocGVUYWIhPU5VTEwpICYmIChzaXplIT0wKSApIHsKKyAgICBpZiAoKHBlVGFiICE9IE5VTEwpICYmIChzaXplICE9IDApKSB7CisgICAgICBJTlQgc3RhcnRCID0gLTE7IC8qIGJpdHJhdGUgZW50cnkgaW4gdGFibGUgdGhhdCBpcyB0aGUgbmV4dC1sb3dlciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwgYml0cmF0ZSAgKi8KKyAgICAgIElOVCBzdG9wQiA9IC0xOyAgLyogYml0cmF0ZSBlbnRyeSBpbiB0YWJsZSB0aGF0IGlzIHRoZSBuZXh0LWhpZ2hlciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwgYml0cmF0ZSAqLworICAgICAgRklYUF9EQkwgc3RhcnRQRiA9CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wZik7IC8qIGJpdHMyUEUgZmFjdG9yIGVudHJ5IGluIHRhYmxlIHRoYXQgaXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQtbG93ZXIgdG8gYWN0dWFsIGJpdHMyUEUgZmFjdG9yICAqLworICAgICAgRklYUF9EQkwgc3RvcFBGID0gRkwyRlhDT05TVF9EQkwoMC4wZik7IC8qIGJpdHMyUEUgZmFjdG9yIGVudHJ5IGluIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpcyB0aGUgbmV4dC1oaWdoZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwgYml0czJQRSBmYWN0b3IgKi8KKyAgICAgIEZJWFBfREJMIHNsb3BlID0gRkwyRlhDT05TVF9EQkwoCisgICAgICAgICAgMC4wZik7IC8qIHRoZSBzbG9wZSBmcm9tIHRoZSBzdGFydCBiaXRzMlBlIGVudHJ5IHRvIHRoZSBuZXh0IG9uZSAqLworICAgICAgY29uc3QgaW50IHF1YWxpdHlJZHggPSAoaW52UXVhbnQgPT0gMCkgPyAwIDogMTsKIAotICAgICAgSU5UIHN0YXJ0QiAgICAgID0gLTE7Ci0gICAgICBMT05HIHN0YXJ0UEYgICAgPSAwOwotICAgICAgTE9ORyBwZVNsb3BlICAgID0gMDsKLQotICAgICAgLyogc3RlcmVvIG9yIG1vbm8gbW9kZSBhbmQgaW52UXVhbnQgdXNlZCBvciBub3QgKi8KLSAgICAgIGZvciAoaT0wOyBpPHNpemUtMTsgaSsrKQotICAgICAgewotICAgICAgICBpZiAoKHBlVGFiW2ldLmJpdHJhdGU8PWJpdFJhdGUpICYmICgocGVUYWJbaSsxXS5iaXRyYXRlPmJpdFJhdGUpIHx8ICgoaT09c2l6ZS0yKSkgKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChuQ2hhbm5lbHM9PTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3RhcnRQRiA9ICghaW52UXVhbnQpID8gcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9tb25vICAgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0OwotICAgICAgICAgICAgcGVTbG9wZSA9ICghaW52UXVhbnQpID8gcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9tb25vX3Nsb3BlIDogcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9tb25vX3NjZk9wdF9zbG9wZTsKLSAgICAgICAgICAgIC8qZW5kUEYgICA9ICghaW52UXVhbnQpID8gcGVUYWJbaSsxXS5iaXRzMlBlRmFjdG9yX21vbm8gOiBwZVRhYltpKzFdLmJpdHMyUGVGYWN0b3JfbW9ub19zY2ZPcHQ7Ci0gICAgICAgICAgICBlbmRCPXBlVGFiW2krMV0uYml0cmF0ZTsqLwotICAgICAgICAgICAgc3RhcnRCPXBlVGFiW2ldLmJpdHJhdGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN0YXJ0UEYgPSAoIWludlF1YW50KSA/IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3Jfc3RlcmVvICAgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX3N0ZXJlb19zY2ZPcHQ7Ci0gICAgICAgICAgICBwZVNsb3BlID0gKCFpbnZRdWFudCkgPyBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX3N0ZXJlb19zbG9wZSA6IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3Jfc3RlcmVvX3NjZk9wdF9zbG9wZTsKLSAgICAgICAgICAgIC8qZW5kUEYgICA9ICghaW52UXVhbnQpID8gcGVUYWJbaSsxXS5iaXRzMlBlRmFjdG9yX3N0ZXJlbyA6IHBlVGFiW2krMV0uYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0OwotICAgICAgICAgICAgZW5kQj1wZVRhYltpKzFdLmJpdHJhdGU7Ki8KLSAgICAgICAgICAgIHN0YXJ0Qj1wZVRhYltpXS5iaXRyYXRlOworICAgICAgaWYgKGJpdFJhdGUgPj0gcGVUYWJbc2l6ZSAtIDFdLmJpdHJhdGUpIHsKKyAgICAgICAgLyogQ2hvc2VuIGJpdHJhdGUgaXMgaGlnaGVyIHRoYW4gdGhlIGhpZ2hlc3QgYml0cmF0ZSBpbiB0YWJsZS4KKyAgICAgICAgICAgVGhlIHNsb3BlIGZvciBleHRyYXBvbGF0aW5nIHRoZSBiaXRzMlBFIGZhY3RvciBtdXN0IGJlIHplcm8uCisgICAgICAgICAgIFZhbHVlcyBhcmUgc2V0IGFjY29yZGluZ2x5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHN0YXJ0QiA9IHBlVGFiW3NpemUgLSAxXS5iaXRyYXRlOworICAgICAgICBzdG9wQiA9CisgICAgICAgICAgICBiaXRSYXRlICsKKyAgICAgICAgICAgIDE7IC8qIENhbiBiZSBhbiBhcmJpdHJhcnkgdmFsdWUgZ3JlYXRlciB0aGFuIHN0YXJ0QiBhbmQgYml0cmF0ZS4gKi8KKyAgICAgICAgc3RhcnRQRiA9IHBlVGFiW3NpemUgLSAxXS5iaXRzMlBlRmFjdG9yW3F1YWxpdHlJZHhdW25DaGFubmVscyAtIDFdOworICAgICAgICBzdG9wUEYgPSBwZVRhYltzaXplIC0gMV0uYml0czJQZUZhY3RvcltxdWFsaXR5SWR4XVtuQ2hhbm5lbHMgLSAxXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7CisgICAgICAgICAgaWYgKChwZVRhYltpXS5iaXRyYXRlIDw9IGJpdFJhdGUpICYmCisgICAgICAgICAgICAgIChwZVRhYltpICsgMV0uYml0cmF0ZSA+IGJpdFJhdGUpKSB7CisgICAgICAgICAgICBzdGFydEIgPSBwZVRhYltpXS5iaXRyYXRlOworICAgICAgICAgICAgc3RvcEIgPSBwZVRhYltpICsgMV0uYml0cmF0ZTsKKyAgICAgICAgICAgIHN0YXJ0UEYgPSBwZVRhYltpXS5iaXRzMlBlRmFjdG9yW3F1YWxpdHlJZHhdW25DaGFubmVscyAtIDFdOworICAgICAgICAgICAgc3RvcFBGID0gcGVUYWJbaSArIDFdLmJpdHMyUGVGYWN0b3JbcXVhbGl0eUlkeF1bbkNoYW5uZWxzIC0gMV07CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0gLyogZm9yIGkgKi8KKyAgICAgIH0KIAotICAgICAgLyogaWYgYSBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZSAqLwotICAgICAgaWYgKHN0YXJ0QiE9LTEpIHsKLSAgICAgICAgLyogbGluZWFyIGludGVycG9sYXRlIHRvIGFjdHVhbCBQRWZhY3RvciAqLwotICAgICAgICBGSVhQX0RCTCBwZUZhYyA9IGZNdWx0KChGSVhQX0RCTCkoYml0UmF0ZS1zdGFydEIpPDwxNCwgKEZJWFBfREJMKXBlU2xvcGUpIDw8IDI7Ci0gICAgICAgIEZJWFBfREJMIGJpdDJQRSA9IHBlRmFjICsgKEZJWFBfREJMKXN0YXJ0UEY7IC8qIHN0YXJ0UEZfZmxvYXQgPSBzdGFydFBGIDw8IDIgKi8KKyAgICAgIC8qKiogMi4yKSBDb25maWd1cmF0aW9uIGF2YWlsYWJsZT8gKioqLworICAgICAgaWYgKHN0YXJ0QiAhPSAtMSkgeworICAgICAgICAvKiogMi4yLjEpIGxpbmVhciBpbnRlcnBvbGF0ZSB0byBhY3R1YWwgUEVmYWN0b3IgKiovCisgICAgICAgIEZJWFBfREJMIGJpdDJQRSA9IDA7CiAKLSAgICAgICAgLyogc2FuaXR5IGNoZWNrIGlmIGJpdHMycGUgdmFsdWUgaXMgaGlnaCBlbm91Z2ggKi8KLSAgICAgICAgaWYgKCBiaXQyUEUgPj0gKEZMMkZYQ09OU1RfREJMKDAuMzVmKSA+PiAyKSApIHsKKyAgICAgICAgY29uc3QgRklYUF9EQkwgbWF4Qml0MlBFID0gRkwyRlhDT05TVF9EQkwoMy5mIC8gNC5mKTsKKworICAgICAgICAvKiBiaXQyUEUgPSAoKHN0b3BQRi1zdGFydFBGKS8oc3RvcEItc3RhcnRCKSkqKGJpdFJhdGUtc3RhcnRCKStzdGFydFBGOworICAgICAgICAgKi8KKyAgICAgICAgc2xvcGUgPSBmRGl2Tm9ybShiaXRSYXRlIC0gc3RhcnRCLCBzdG9wQiAtIHN0YXJ0Qik7CisgICAgICAgIGJpdDJQRSA9IGZNdWx0KHNsb3BlLCBzdG9wUEYgLSBzdGFydFBGKSArIHN0YXJ0UEY7CisKKyAgICAgICAgYml0MlBFID0gZk1pbihtYXhCaXQyUEUsIGJpdDJQRSk7CisKKyAgICAgICAgLyoqIDIuMi4yKSBzYW5pdHkgY2hlY2sgaWYgYml0czJwZSB2YWx1ZSBpcyBoaWdoIGVub3VnaCAqKi8KKyAgICAgICAgaWYgKGJpdDJQRSA+PSAoRkwyRlhDT05TVF9EQkwoMC4zNWYpID4+IDIpKSB7CiAgICAgICAgICAgYml0MlBFX20gPSBiaXQyUEU7CiAgICAgICAgICAgYml0MlBFX2UgPSAyOyAvKiAgdGFibGUgaXMgZml4ZWQgc2NhbGVkICovCiAgICAgICAgIH0KICAgICAgIH0gLyogYnIgKi8KLSAgICB9IC8qIHNyICovCi0gIH0gLyogYWR2YW5jZWRCaXRzVG9QZSAqLworICAgIH0gICAvKiBzciAqLworICB9ICAgICAvKiBhZHZhbmNlZEJpdHNUb1BlICovCiAKLQotICBpZiAoZFpvbmVRdWFudEVuYWJsZSkKLSAgewotICAgIGlmKGJpdDJQRV9tID49IChGTDJGWENPTlNUX0RCTCgwLjZmKSk+PmJpdDJQRV9lKQotICAgIHsKKyAgaWYgKGRab25lUXVhbnRFbmFibGUpIHsKKyAgICBpZiAoYml0MlBFX20gPj0gKEZMMkZYQ09OU1RfREJMKDAuNmYpKSA+PiBiaXQyUEVfZSkgewogICAgICAgLyogQWRkaXRpb25hbCBoZWFkcm9vbSBmb3IgYWRkaXRpb24gKi8KICAgICAgIGJpdDJQRV9tID4+PSAxOwotICAgICAgYml0MlBFX2UgICs9IDE7CisgICAgICBiaXQyUEVfZSArPSAxOwogICAgIH0KIAotICAgIC8qIHRoZSBxdWFudFRlbmRlbmN5Q29tcGVuc2F0b3IgY29tcGVuc2F0ZXMgYSBsb3dlciBiaXQgY29uc3VtcHRpb24gZHVlIHRvIGluY3JlYXNpbmcgdGhlIHRlbmRlbmN5IHRvIHF1YW50aXplIGxvdyBzcGVjdHJhbCB2YWx1ZXMgdG8gdGhlIGxvd2VyIHF1YW50aXplciBib3JkZXIgZm9yIGJpdHJhdGVzIGJlbG93IGEgY2VydGFpbiBiaXRyYXRlIHRocmVzaG9sZCAtLT4gc2VlIGFsc28gZnVuY3Rpb24gY2FsY1NmYkRpc3RMRCBpbiBxdWFudGl6ZS5jICovCi0gICAgaWYgKChiaXRSYXRlL25DaGFubmVscyA+IDMyMDAwKSAmJiAoYml0UmF0ZS9uQ2hhbm5lbHMgPD0gNDAwMDApKSB7Ci0gICAgICBiaXQyUEVfbSArPSAoRkwyRlhDT05TVF9EQkwoMC40ZikpPj5iaXQyUEVfZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYml0UmF0ZS9uQ2hhbm5lbHMgPiAyMDAwMCkgewotICAgICAgYml0MlBFX20gKz0gKEZMMkZYQ09OU1RfREJMKDAuM2YpKT4+Yml0MlBFX2U7Ci0gICAgfQotICAgIGVsc2UgaWYgKGJpdFJhdGUvbkNoYW5uZWxzID49IDE2MDAwKSB7Ci0gICAgICBiaXQyUEVfbSArPSAoRkwyRlhDT05TVF9EQkwoMC4zZikpPj5iaXQyUEVfZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBiaXQyUEVfbSArPSAoRkwyRlhDT05TVF9EQkwoMC4wZikpPj5iaXQyUEVfZTsKKyAgICAvKiB0aGUgcXVhbnRUZW5kZW5jeUNvbXBlbnNhdG9yIGNvbXBlbnNhdGVzIGEgbG93ZXIgYml0IGNvbnN1bXB0aW9uIGR1ZSB0bworICAgICAqIGluY3JlYXNpbmcgdGhlIHRlbmRlbmN5IHRvIHF1YW50aXplIGxvdyBzcGVjdHJhbCB2YWx1ZXMgdG8gdGhlIGxvd2VyCisgICAgICogcXVhbnRpemVyIGJvcmRlciBmb3IgYml0cmF0ZXMgYmVsb3cgYSBjZXJ0YWluIGJpdHJhdGUgdGhyZXNob2xkIC0tPiBzZWUKKyAgICAgKiBhbHNvIGZ1bmN0aW9uIGNhbGNTZmJEaXN0TEQgaW4gcXVhbnRpemUuYyAqLworICAgIGlmICgoYml0UmF0ZSAvIG5DaGFubmVscyA+IDMyMDAwKSAmJiAoYml0UmF0ZSAvIG5DaGFubmVscyA8PSA0MDAwMCkpIHsKKyAgICAgIGJpdDJQRV9tICs9IChGTDJGWENPTlNUX0RCTCgwLjRmKSkgPj4gYml0MlBFX2U7CisgICAgfSBlbHNlIGlmIChiaXRSYXRlIC8gbkNoYW5uZWxzID4gMjAwMDApIHsKKyAgICAgIGJpdDJQRV9tICs9IChGTDJGWENPTlNUX0RCTCgwLjNmKSkgPj4gYml0MlBFX2U7CisgICAgfSBlbHNlIGlmIChiaXRSYXRlIC8gbkNoYW5uZWxzID49IDE2MDAwKSB7CisgICAgICBiaXQyUEVfbSArPSAoRkwyRlhDT05TVF9EQkwoMC4zZikpID4+IGJpdDJQRV9lOworICAgIH0gZWxzZSB7CisgICAgICBiaXQyUEVfbSArPSAoRkwyRlhDT05TVF9EQkwoMC4wZikpID4+IGJpdDJQRV9lOwogICAgIH0KICAgfQogCi0KICAgLyoqKioqIDMuKSBSZXR1cm4gYml0czJwZSBmYWN0b3IgKioqKiovCiAgICpiaXRzMlBlRmFjdG9yX20gPSBiaXQyUEVfbTsKICAgKmJpdHMyUGVGYWN0b3JfZSA9IGJpdDJQRV9lOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfYml0czJwZTIKIGRlc2NyaXB0aW9uOiAgY29udmVydCBmcm9tIGJpdHMgdG8gcGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCBGREthYWNFbmNfYml0czJwZTIoCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0cywKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICBmYWN0b3JfbSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBmYWN0b3JfZQotICAgICAgICApCi17Ci0gICByZXR1cm4gKElOVCkoZk11bHQoZmFjdG9yX20sIChGSVhQX0RCTCkoYml0czw8UV9BVkdCSVRTKSkgPj4gKFFfQVZHQklUUy1mYWN0b3JfZSkpOworRkRLX0lOTElORSBJTlQgRkRLYWFjRW5jX2JpdHMycGUyKGNvbnN0IElOVCBiaXRzLCBjb25zdCBGSVhQX0RCTCBmYWN0b3JfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZmFjdG9yX2UpIHsKKyAgcmV0dXJuIChJTlQpKGZNdWx0KGZhY3Rvcl9tLCAoRklYUF9EQkwpKGJpdHMgPDwgUV9BVkdCSVRTKSkgPj4KKyAgICAgICAgICAgICAgIChRX0FWR0JJVFMgLSBmYWN0b3JfZSkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNUaHJlc2hFeHAKIGRlc2NyaXB0aW9uOiAgbG91ZG5lc3MgY2FsY3VsYXRpb24gKHRocmVzaG9sZCB0byB0aGUgcG93ZXIgb2YgcmVkRXhwKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfY2FsY1RocmVzaEV4cChGSVhQX0RCTCB0aHJFeHBbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqICBwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMpCi17Ci0gICBJTlQgY2gsIHNmYiwgc2ZiR3JwOwotICAgRklYUF9EQkwgdGhyRXhwTGREYXRhOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NhbGNUaHJlc2hFeHAoCisgICAgRklYUF9EQkwgdGhyRXhwWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKKyAgICBjb25zdCBRQ19PVVRfQ0hBTk5FTCAqY29uc3QgcWNPdXRDaGFubmVsWygyKV0sCisgICAgY29uc3QgUFNZX09VVF9DSEFOTkVMICpjb25zdCBwc3lPdXRDaGFubmVsWygyKV0sIGNvbnN0IElOVCBuQ2hhbm5lbHMpIHsKKyAgSU5UIGNoLCBzZmIsIHNmYkdycDsKKyAgRklYUF9EQkwgdGhyRXhwTGREYXRhOwogCi0gICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewotICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICB0aHJFeHBMZERhdGEgPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdPj4yIDsKLSAgICAgICAgIHRockV4cFtjaF1bc2ZiR3JwK3NmYl0gPSBDYWxjSW52TGREYXRhKHRockV4cExkRGF0YSk7Ci0gICAgICAgfQotICAgICB9Ci0gICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfYWRhcHRNaW5TbnIKLSAgICBkZXNjcmlwdGlvbjogIHJlZHVjZSBtaW5TbnIgcmVxdWlyZW1lbnRzIGZvciBiYW5kcyB3aXRoIHJlbGF0aXZlIGxvdyBlbmVyZ2llcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfYWRhcHRNaW5TbnIoUUNfT1VUX0NIQU5ORUwgICAgICpxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgKnBzeU91dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbkNoYW5uZWxzKQotewotICBJTlQgY2gsIHNmYiwgc2ZiR3JwLCBuU2ZiOwotICBGSVhQX0RCTCBhdmdFbkxENjQsIGRiUmF0aW8sIG1pblNuclJlZDsKLSAgRklYUF9EQkwgbWluU25yTGltaXRMRDY0ID0gRkwyRlhDT05TVF9EQkwoLTAuMDA1MDMwMTI2NDgyNjJmKTsgLyogbGQ2NCgwLjhmKSAqLwotICBGSVhQX0RCTCBuU2ZiTEQ2NDsKLSAgRklYUF9EQkwgYWNjdTsKLQotICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgIC8qIGNhbGMgYXZlcmFnZSBlbmVyZ3kgcGVyIHNjYWxlZmFjdG9yIGJhbmQgKi8KLSAgICBuU2ZiID0gMDsKLSAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0KLSAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewotICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgYWNjdSArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPj42OwotCQkJCSBuU2ZiKys7Ci0JCQkgfQotICAgIH0KLQotICAgIGlmICgoYWNjdSA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgfHwgKG5TZmIgPT0gMCkpIHsKLSAgICAgIGF2Z0VuTEQ2NCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBuU2ZiTEQ2NCAgPSBDYWxjTGRJbnQoblNmYik7Ci0gICAgICBhdmdFbkxENjQgPSBDYWxjTGREYXRhKGFjY3UpOwotICAgICAgYXZnRW5MRDY0ID0gYXZnRW5MRDY0ICsgRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpIC0gblNmYkxENjQ7ICAvKiAwLjA5Mzc1ZjogY29tcGVuc2F0ZSBzaGlmdCB3aXRoIDYgKi8KLSAgICB9Ci0KLSAgICAvKiByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50IGJ5IG1pblNucl5taW5TbnJSZWQgZGVwZW5kZW50IG9uIGF2Z0VuL3NmYkVuICovCi0gICAgZm9yIChzZmJHcnA9MDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKLSAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgIGlmICggKG1zYVBhcmFtLT5zdGFydFJhdGlvICsgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKSA8IGF2Z0VuTEQ2NCApIHsKLSAgICAgICAgICBkYlJhdGlvID0gZk11bHQoKGF2Z0VuTEQ2NCAtIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSksRkwyRlhDT05TVF9EQkwoMC4zMDEwMjk5OTU2ZikpOyAvKiBzY2FsZWQgYnkgKDEuMGYvKDEwLjBmKjY0LjBmKSkgKi8KLSAgICAgICAgICBtaW5TbnJSZWQgPSBtc2FQYXJhbS0+cmVkT2ZmcyArIGZNdWx0KG1zYVBhcmFtLT5yZWRSYXRpb0ZhYyxkYlJhdGlvKTsgLyogc2NhbGVkIGJ5IDEuMGYvNjQuMGYqLwotICAgICAgICAgIG1pblNuclJlZCA9IGZpeE1heChtaW5TbnJSZWQsIG1zYVBhcmFtLT5tYXhSZWQpOyAvKiBzY2FsZWQgYnkgMS4wZi82NC4wZiovCi0gICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gKGZNdWx0KHFjT3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSxtaW5TbnJSZWQpKSA8PCA2OwotICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1pbihtaW5TbnJMaW1pdExENjQsIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSk7Ci0gICAgICAgIH0KKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgeworICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgIHRockV4cExkRGF0YSA9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXSA+PiAyOworICAgICAgICB0aHJFeHBbY2hdW3NmYkdycCArIHNmYl0gPSBDYWxjSW52TGREYXRhKHRockV4cExkRGF0YSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2FkYXB0TWluU25yCisgICAgZGVzY3JpcHRpb246ICByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50cyBmb3IgYmFuZHMgd2l0aCByZWxhdGl2ZSBsb3cKK2VuZXJnaWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19hZGFwdE1pblNucigKKyAgICBRQ19PVVRfQ0hBTk5FTCAqY29uc3QgcWNPdXRDaGFubmVsWygyKV0sCisgICAgY29uc3QgUFNZX09VVF9DSEFOTkVMICpjb25zdCBwc3lPdXRDaGFubmVsWygyKV0sCisgICAgY29uc3QgTUlOU05SX0FEQVBUX1BBUkFNICpjb25zdCBtc2FQYXJhbSwgY29uc3QgSU5UIG5DaGFubmVscykgeworICBJTlQgY2gsIHNmYiwgc2ZiR3JwLCBuU2ZiOworICBGSVhQX0RCTCBhdmdFbkxENjQsIGRiUmF0aW8sIG1pblNuclJlZDsKKyAgRklYUF9EQkwgbWluU25yTGltaXRMRDY0ID0KKyAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjAwNTAzMDEyNjQ4MjYyZik7IC8qIGxkNjQoMC44ZikgKi8KKyAgRklYUF9EQkwgblNmYkxENjQ7CisgIEZJWFBfREJMIGFjY3U7CisKKyAgRklYUF9EQkwgbXNhUGFyYW1fbWF4UmVkID0gbXNhUGFyYW0tPm1heFJlZDsKKyAgRklYUF9EQkwgbXNhUGFyYW1fc3RhcnRSYXRpbyA9IG1zYVBhcmFtLT5zdGFydFJhdGlvOworICBGSVhQX0RCTCBtc2FQYXJhbV9yZWRSYXRpb0ZhYyA9CisgICAgICBmTXVsdChtc2FQYXJhbS0+cmVkUmF0aW9GYWMsIEZMMkZYQ09OU1RfREJMKDAuMzAxMDI5OTk1NmYpKTsKKyAgRklYUF9EQkwgbXNhUGFyYW1fcmVkT2ZmcyA9IG1zYVBhcmFtLT5yZWRPZmZzOworCisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIC8qIGNhbGMgYXZlcmFnZSBlbmVyZ3kgcGVyIHNjYWxlZmFjdG9yIGJhbmQgKi8KKyAgICBuU2ZiID0gMDsKKyAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICBEV09SRF9BTElHTkVEKHBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3kpOworCisgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgeworICAgICAgaW50IG1heFNmYlBlckdyb3VwID0gcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOworICAgICAgblNmYiArPSBtYXhTZmJQZXJHcm91cDsKKyAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgIGFjY3UgKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneVtzZmJHcnAgKyBzZmJdID4+IDY7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKChhY2N1ID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB8fCAoblNmYiA9PSAwKSkgeworICAgICAgYXZnRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICAgIH0gZWxzZSB7CisgICAgICBuU2ZiTEQ2NCA9IENhbGNMZEludChuU2ZiKTsKKyAgICAgIGF2Z0VuTEQ2NCA9IENhbGNMZERhdGEoYWNjdSk7CisgICAgICBhdmdFbkxENjQgPSBhdmdFbkxENjQgKyBGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZikgLQorICAgICAgICAgICAgICAgICAgblNmYkxENjQ7IC8qIDAuMDkzNzVmOiBjb21wZW5zYXRlIHNoaWZ0IHdpdGggNiAqLworICAgIH0KKworICAgIC8qIHJlZHVjZSBtaW5TbnIgcmVxdWlyZW1lbnQgYnkgbWluU25yXm1pblNuclJlZCBkZXBlbmRlbnQgb24gYXZnRW4vc2ZiRW4gKi8KKyAgICBpbnQgbWF4U2ZiUGVyR3JvdXAgPSBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7CisgICAgaW50IHNmYkNudCA9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7CisgICAgaW50IHNmYlBlckdyb3VwID0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOworCisgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBzZmJDbnQ7IHNmYkdycCArPSBzZmJQZXJHcm91cCkgeworICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBzZmJFbmVyZ3lMZERhdGEgPQorICAgICAgICAgICZxY091dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwXTsKKyAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwc2ZiTWluU25yTGREYXRhID0KKyAgICAgICAgICAmcWNPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycF07CisgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBGSVhQX0RCTCBzZmJFbmVyZ3lMZERhdGEgPSAqcHNmYkVuZXJneUxkRGF0YSsrOworICAgICAgICBGSVhQX0RCTCBzZmJNaW5TbnJMZERhdGEgPSAqcHNmYk1pblNuckxkRGF0YTsKKyAgICAgICAgZGJSYXRpbyA9IGF2Z0VuTEQ2NCAtIHNmYkVuZXJneUxkRGF0YTsKKyAgICAgICAgaW50IHVwZGF0ZSA9IChtc2FQYXJhbV9zdGFydFJhdGlvIDwgZGJSYXRpbykgPyAxIDogMDsKKyAgICAgICAgbWluU25yUmVkID0gbXNhUGFyYW1fcmVkT2ZmcyArIGZNdWx0KG1zYVBhcmFtX3JlZFJhdGlvRmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJSYXRpbyk7IC8qIHNjYWxlZCBieSAxLjBmLzY0LjBmKi8KKyAgICAgICAgbWluU25yUmVkID0KKyAgICAgICAgICAgIGZpeE1heChtaW5TbnJSZWQsIG1zYVBhcmFtX21heFJlZCk7IC8qIHNjYWxlZCBieSAxLjBmLzY0LjBmKi8KKyAgICAgICAgbWluU25yUmVkID0gKGZNdWx0KHNmYk1pblNuckxkRGF0YSwgbWluU25yUmVkKSkgPDwgNjsKKyAgICAgICAgbWluU25yUmVkID0gZml4TWluKG1pblNuckxpbWl0TEQ2NCwgbWluU25yUmVkKTsKKyAgICAgICAgKnBzZmJNaW5TbnJMZERhdGErKyA9IHVwZGF0ZSA/IG1pblNuclJlZCA6IHNmYk1pblNuckxkRGF0YTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19pbml0QXZvaWRIb2xlRmxhZwogZGVzY3JpcHRpb246ICBkZXRlcm1pbmUgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBub3QgbmVjZXNzYXJ5IHJlc3AuIHBvc3NpYmxlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19pbml0QXZvaWRIb2xlRmxhZyhRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhaEZsYWdbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBFX0RBVEEgKnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIX1BBUkFNICphaFBhcmFtKQotewotICAgSU5UIGNoLCBzZmIsIHNmYkdycDsKLSAgIEZJWFBfREJMIHNmYkVuLCBzZmJFbm0xOwotICAgRklYUF9EQkwgc2ZiRW5MZERhdGE7Ci0gICBGSVhQX0RCTCBhdmdFbkxkRGF0YTsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19pbml0QXZvaWRIb2xlRmxhZygKKyAgICBRQ19PVVRfQ0hBTk5FTCAqY29uc3QgcWNPdXRDaGFubmVsWygyKV0sCisgICAgY29uc3QgUFNZX09VVF9DSEFOTkVMICpjb25zdCBwc3lPdXRDaGFubmVsWygyKV0sCisgICAgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwgY29uc3Qgc3RydWN0IFRPT0xTSU5GTyAqY29uc3QgdG9vbHNJbmZvLAorICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsIGNvbnN0IEFIX1BBUkFNICpjb25zdCBhaFBhcmFtKSB7CisgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CisgIEZJWFBfREJMIHNmYkVuLCBzZmJFbm0xOworICBGSVhQX0RCTCBzZmJFbkxkRGF0YTsKKyAgRklYUF9EQkwgYXZnRW5MZERhdGE7CiAKLSAgIC8qIGRlY3JlYXNlIHNwcmVhZCBlbmVyZ3kgYnkgM2RCIGZvciBsb25nIGJsb2NrcywgcmVzcC4gMmRCIGZvciBzaG9ydHMKLSAgICAgIChhdm9pZCBtb3JlIGhvbGVzIGluIGxvbmcgYmxvY2tzKSAqLwotICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgIElOVCBzZmJHcnAsIHNmYjsKLSAgICAgIFFDX09VVF9DSEFOTkVMKiAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07CisgIC8qIGRlY3JlYXNlIHNwcmVhZCBlbmVyZ3kgYnkgM2RCIGZvciBsb25nIGJsb2NrcywgcmVzcC4gMmRCIGZvciBzaG9ydHMKKyAgICAgKGF2b2lkIG1vcmUgaG9sZXMgaW4gbG9uZyBibG9ja3MpICovCisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIFFDX09VVF9DSEFOTkVMICpjb25zdCBxY091dENoYW4gPSBxY091dENoYW5uZWxbY2hdOwogCi0gICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKLSAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkKLSAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspCi0gICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdID4+PSAxIDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKQotICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykKLSAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPQotICAgICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNjNmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSkgOwotICAgICAgfQotICAgfQorICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykgeworICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKQorICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspCisgICAgICAgICAgcWNPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA+Pj0gMTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKQorICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspCisgICAgICAgICAgcWNPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA9IGZNdWx0KAorICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjYzZiksIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCArIHNmYl0pOworICAgIH0KKyAgfQogCi0gICAvKiBpbmNyZWFzZSBtaW5TbnIgZm9yIGxvY2FsIHBlYWtzLCBkZWNyZWFzZSBpdCBmb3IgdmFsbGV5cyAqLwotICAgaWYgKGFoUGFyYW0tPm1vZGlmeU1pblNucikgewotICAgICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgICAgICAgUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW4gID0gcWNPdXRDaGFubmVsW2NoXTsKLSAgICAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKXsKLSAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgICAgICBGSVhQX0RCTCBzZmJFbnAxLCBhdmdFbjsKLSAgICAgICAgICAgICAgIGlmIChzZmIgPiAwKQotICAgICAgICAgICAgICAgICAgc2ZiRW5tMSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmItMV07Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzZmJFbm0xID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl07CisgIC8qIGluY3JlYXNlIG1pblNuciBmb3IgbG9jYWwgcGVha3MsIGRlY3JlYXNlIGl0IGZvciB2YWxsZXlzICovCisgIGlmIChhaFBhcmFtLT5tb2RpZnlNaW5TbnIpIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIFFDX09VVF9DSEFOTkVMICpjb25zdCBxY091dENoYW4gPSBxY091dENoYW5uZWxbY2hdOworICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgIEZJWFBfREJMIHNmYkVucDEsIGF2Z0VuOworICAgICAgICAgIGlmIChzZmIgPiAwKQorICAgICAgICAgICAgc2ZiRW5tMSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCArIHNmYiAtIDFdOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNmYkVubTEgPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnAgKyBzZmJdOwogCi0gICAgICAgICAgICAgICBpZiAoc2ZiIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwLTEpCi0gICAgICAgICAgICAgICAgICBzZmJFbnAxID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYisxXTsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNmYkVucDEgPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKKyAgICAgICAgICBpZiAoc2ZiIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwIC0gMSkKKyAgICAgICAgICAgIHNmYkVucDEgPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnAgKyBzZmIgKyAxXTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzZmJFbnAxID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXTsKIAotICAgICAgICAgICAgICAgYXZnRW4gPSAoc2ZiRW5tMT4+MSkgKyAoc2ZiRW5wMT4+MSk7Ci0gICAgICAgICAgICAgICBhdmdFbkxkRGF0YSA9IENhbGNMZERhdGEoYXZnRW4pOwotICAgICAgICAgICAgICAgc2ZiRW4gPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICAgICAgIHNmYkVuTGREYXRhID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgICAgICAvKiBwZWFrID8gKi8KLSAgICAgICAgICAgICAgIGlmIChzZmJFbiA+IGF2Z0VuKSB7Ci0gICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0bXBNaW5TbnJMZERhdGE7Ci0gICAgICAgICAgICAgICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZT09TE9OR19XSU5ET1cpCi0gICAgICAgICAgICAgICAgICAgICB0bXBNaW5TbnJMZERhdGEgPSBmaXhNYXgoIFNuckxkRmFjICsgKEZJWFBfREJMKShhdmdFbkxkRGF0YSAtIHNmYkVuTGREYXRhKSwgKEZJWFBfREJMKVNuckxkTWluMSApIDsKLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHRtcE1pblNuckxkRGF0YSA9IGZpeE1heCggU25yTGRGYWMgKyAoRklYUF9EQkwpKGF2Z0VuTGREYXRhIC0gc2ZiRW5MZERhdGEpLCAoRklYUF9EQkwpU25yTGRNaW4zICkgOworICAgICAgICAgIGF2Z0VuID0gKHNmYkVubTEgPj4gMSkgKyAoc2ZiRW5wMSA+PiAxKTsKKyAgICAgICAgICBhdmdFbkxkRGF0YSA9IENhbGNMZERhdGEoYXZnRW4pOworICAgICAgICAgIHNmYkVuID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXTsKKyAgICAgICAgICBzZmJFbkxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl07CisgICAgICAgICAgLyogcGVhayA/ICovCisgICAgICAgICAgaWYgKHNmYkVuID4gYXZnRW4pIHsKKyAgICAgICAgICAgIEZJWFBfREJMIHRtcE1pblNuckxkRGF0YTsKKyAgICAgICAgICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IExPTkdfV0lORE9XKQorICAgICAgICAgICAgICB0bXBNaW5TbnJMZERhdGEgPQorICAgICAgICAgICAgICAgICAgZml4TWF4KFNuckxkRmFjICsgKEZJWFBfREJMKShhdmdFbkxkRGF0YSAtIHNmYkVuTGREYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpU25yTGRNaW4xKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgdG1wTWluU25yTGREYXRhID0KKyAgICAgICAgICAgICAgICAgIGZpeE1heChTbnJMZEZhYyArIChGSVhQX0RCTCkoYXZnRW5MZERhdGEgLSBzZmJFbkxkRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKVNuckxkTWluMyk7CiAKLSAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0KLSAgICAgICAgICAgICAgICAgICAgIGZpeE1pbihxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSwgdG1wTWluU25yTGREYXRhKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIC8qIHZhbGxleSA/ICovCi0gICAgICAgICAgICAgICBpZiAoICgoc2ZiRW5MZERhdGErKEZJWFBfREJMKVNuckxkTWluNCkgPCAoRklYUF9EQkwpYXZnRW5MZERhdGEpICYmIChzZmJFbiA+IEZMMkZYQ09OU1RfREJMKDAuMCkpICkgewotICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wTWluU25yTGREYXRhID0gYXZnRW5MZERhdGEgLSBzZmJFbkxkRGF0YSAtKEZJWFBfREJMKVNuckxkTWluNCArIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdOwotICAgICAgICAgICAgICAgICAgdG1wTWluU25yTGREYXRhID0gZml4TWluKChGSVhQX0RCTClTbnJMZEZhYywgdG1wTWluU25yTGREYXRhKTsKLSAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWluKHRtcE1pblNuckxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKyBTbnJMZE1pbjIgKSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIHN0ZXJlbzogYWRhcHQgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIHNmYk1pblNuciBvZiBtaWQgYW5kCi0gICAgICBzaWRlIGNoYW5uZWxzIHRvIGF2b2lkIHNwZW5kaW5nIHVubm90aWNhYmxlIGJpdHMgKi8KLSAgIGlmIChuQ2hhbm5lbHMgPT0gMikgewotICAgICAgUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW5NICA9IHFjT3V0Q2hhbm5lbFswXTsKLSAgICAgIFFDX09VVF9DSEFOTkVMKiAgcWNPdXRDaGFuUyAgPSBxY091dENoYW5uZWxbMV07Ci0gICAgICBQU1lfT1VUX0NIQU5ORUwqICBwc3lPdXRDaGFuTSAgPSBwc3lPdXRDaGFubmVsWzBdOwotICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbk0tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuTS0+c2ZiUGVyR3JvdXApewotICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbk0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICAgIGlmICh0b29sc0luZm8tPm1zTWFza1tzZmJHcnArc2ZiXSkgewotICAgICAgICAgICAgIEZJWFBfREJMIG1heFNmYkVuTGQgPSBmaXhNYXgocWNPdXRDaGFuTS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdLHFjT3V0Q2hhblMtPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSk7Ci0gICAgICAgICAgICAgRklYUF9EQkwgbWF4VGhyTGQsIHNmYk1pblNuclRtcExkOwotCi0gICAgICAgICAgICAgaWYgKCAoKFNuckxkTWluNT4+MSkgKyAobWF4U2ZiRW5MZD4+MSkgKyAocWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdPj4xKSkgPD0gRkwyRlhDT05TVF9EQkwoLTAuNWYpKQotICAgICAgICAgICAgICAgbWF4VGhyTGQgPSBGTDJGWENPTlNUX0RCTCgtMS4wZikgOwotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIG1heFRockxkID0gU25yTGRNaW41ICsgbWF4U2ZiRW5MZCArIHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXTsKLQotICAgICAgICAgICAgIGlmIChxY091dENoYW5NLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0gPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkKLSAgICAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gbWF4VGhyTGQgLSBxY091dENoYW5NLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLQotICAgICAgICAgICAgIHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1heChxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sc2ZiTWluU25yVG1wTGQpOwotCi0gICAgICAgICAgICAgaWYgKHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKLSAgICAgICAgICAgICAgICBxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNaW4ocWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLCAoRklYUF9EQkwpU25yTGRGYWMpOwotCi0gICAgICAgICAgICAgaWYgKHFjT3V0Q2hhblMtPnNmYkVuZXJneVtzZmJHcnArc2ZiXSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPSBtYXhUaHJMZCAtIHFjT3V0Q2hhblMtPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBzZmJNaW5TbnJUbXBMZCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotCi0gICAgICAgICAgICAgcWNPdXRDaGFuUy0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWF4KHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSxzZmJNaW5TbnJUbXBMZCk7Ci0KLSAgICAgICAgICAgICBpZiAocWNPdXRDaGFuUy0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdIDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgICAgICAgICAgICAgIHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1pbihxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sKEZJWFBfREJMKVNuckxkRmFjKTsKLQotICAgICAgICAgICAgIGlmIChxY091dENoYW5NLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+cWNPdXRDaGFuTS0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdKQotICAgICAgICAgICAgICAgIHFjT3V0Q2hhblMtPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA9Ci0gICAgICAgICAgICAgICAgICAgZk11bHQocWNPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdLCBGTDJGWENPTlNUX0RCTCgwLjlmKSk7Ci0KLSAgICAgICAgICAgICBpZiAocWNPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPnFjT3V0Q2hhblMtPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSkKLSAgICAgICAgICAgICAgICBxY091dENoYW5NLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPQotICAgICAgICAgICAgICAgICAgIGZNdWx0KHFjT3V0Q2hhbk0tPnNmYkVuZXJneVtzZmJHcnArc2ZiXSwgRkwyRlhDT05TVF9EQkwoMC45ZikpOworICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSA9IGZpeE1pbigKKyAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdLCB0bXBNaW5TbnJMZERhdGEpOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiB2YWxsZXkgPyAqLworICAgICAgICAgIGlmICgoKHNmYkVuTGREYXRhICsgKEZJWFBfREJMKVNuckxkTWluNCkgPCAoRklYUF9EQkwpYXZnRW5MZERhdGEpICYmCisgICAgICAgICAgICAgIChzZmJFbiA+IEZMMkZYQ09OU1RfREJMKDAuMCkpKSB7CisgICAgICAgICAgICBGSVhQX0RCTCB0bXBNaW5TbnJMZERhdGEgPSBhdmdFbkxkRGF0YSAtIHNmYkVuTGREYXRhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTClTbnJMZE1pbjQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXTsKKyAgICAgICAgICAgIHRtcE1pblNuckxkRGF0YSA9IGZpeE1pbigoRklYUF9EQkwpU25yTGRGYWMsIHRtcE1pblNuckxkRGF0YSk7CisgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgICBmaXhNaW4odG1wTWluU25yTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNuckxkTWluMikpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgfQorICAgIH0KKyAgfQogCi0gICAvKiBpbml0IGFoRmxhZyAoMDogbm8gYWggbmVjZXNzYXJ5LCAxOiBhaCBwb3NzaWJsZSwgMjogYWggYWN0aXZlICovCi0gICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICBRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbiAgPSBxY091dENoYW5uZWxbY2hdOwotICAgICAgUFNZX09VVF9DSEFOTkVMICAqcHN5T3V0Q2hhbiAgPSBwc3lPdXRDaGFubmVsW2NoXTsKLSAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0gICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgICBpZiAoKHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdID4gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0pCi0gICAgICAgICAgICAgIHx8IChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgewotICAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBOT19BSDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0lOQUNUSVZFOwotICAgICAgICAgIH0KKyAgLyogc3RlcmVvOiBhZGFwdCB0aGUgbWluaW11bSByZXF1aXJlbWVudHMgc2ZiTWluU25yIG9mIG1pZCBhbmQKKyAgICAgc2lkZSBjaGFubmVscyB0byBhdm9pZCBzcGVuZGluZyB1bm5vdGljYWJsZSBiaXRzICovCisgIGlmIChuQ2hhbm5lbHMgPT0gMikgeworICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW5NID0gcWNPdXRDaGFubmVsWzBdOworICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW5TID0gcWNPdXRDaGFubmVsWzFdOworICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbk0gPSBwc3lPdXRDaGFubmVsWzBdOworICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbk0tPnNmYkNudDsKKyAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFuTS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbk0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBpZiAodG9vbHNJbmZvLT5tc01hc2tbc2ZiR3JwICsgc2ZiXSkgeworICAgICAgICAgIEZJWFBfREJMIG1heFNmYkVuTGQgPQorICAgICAgICAgICAgICBmaXhNYXgocWNPdXRDaGFuTS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl0sCisgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5TLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXSk7CisgICAgICAgICAgRklYUF9EQkwgbWF4VGhyTGQsIHNmYk1pblNuclRtcExkOworCisgICAgICAgICAgaWYgKCgoU25yTGRNaW41ID4+IDEpICsgKG1heFNmYkVuTGQgPj4gMSkgKworICAgICAgICAgICAgICAgKHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdID4+IDEpKSA8PQorICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMC41ZikpCisgICAgICAgICAgICBtYXhUaHJMZCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXhUaHJMZCA9IFNuckxkTWluNSArIG1heFNmYkVuTGQgKworICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXTsKKworICAgICAgICAgIGlmIChxY091dENoYW5NLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPQorICAgICAgICAgICAgICAgIG1heFRockxkIC0gcWNPdXRDaGFuTS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl07CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgICAgICAgIHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgZml4TWF4KHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdLCBzZmJNaW5TbnJUbXBMZCk7CisKKyAgICAgICAgICBpZiAocWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gPD0gRkwyRlhDT05TVF9EQkwoMC4wZikpCisgICAgICAgICAgICBxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSA9IGZpeE1pbigKKyAgICAgICAgICAgICAgICBxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSwgKEZJWFBfREJMKVNuckxkRmFjKTsKKworICAgICAgICAgIGlmIChxY091dENoYW5TLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPQorICAgICAgICAgICAgICAgIG1heFRockxkIC0gcWNPdXRDaGFuUy0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl07CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgICAgICAgIHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgZml4TWF4KHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdLCBzZmJNaW5TbnJUbXBMZCk7CisKKyAgICAgICAgICBpZiAocWNPdXRDaGFuUy0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gPD0gRkwyRlhDT05TVF9EQkwoMC4wZikpCisgICAgICAgICAgICBxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSA9IGZpeE1pbigKKyAgICAgICAgICAgICAgICBxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSwgKEZJWFBfREJMKVNuckxkRmFjKTsKKworICAgICAgICAgIGlmIChxY091dENoYW5NLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA+CisgICAgICAgICAgICAgIHFjT3V0Q2hhbk0tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnAgKyBzZmJdKQorICAgICAgICAgICAgcWNPdXRDaGFuUy0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCArIHNmYl0gPSBmTXVsdCgKKyAgICAgICAgICAgICAgICBxY091dENoYW5TLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXSwgRkwyRlhDT05TVF9EQkwoMC45ZikpOworCisgICAgICAgICAgaWYgKHFjT3V0Q2hhblMtPnNmYkVuZXJneVtzZmJHcnAgKyBzZmJdID4KKyAgICAgICAgICAgICAgcWNPdXRDaGFuUy0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCArIHNmYl0pCisgICAgICAgICAgICBxY091dENoYW5NLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA9IGZNdWx0KAorICAgICAgICAgICAgICAgIHFjT3V0Q2hhbk0tPnNmYkVuZXJneVtzZmJHcnAgKyBzZmJdLCBGTDJGWENPTlNUX0RCTCgwLjlmKSk7CisKKyAgICAgICAgfSAvKiBpZiAodG9vbHNJbmZvLT5tc01hc2tbc2ZiR3JwK3NmYl0pICovCisgICAgICB9ICAgLyogc2ZiICovCisgICAgfSAgICAgLyogc2ZiR3JwICovCisgIH0gICAgICAgLyogbkNoYW5uZWxzPT0yICovCisKKyAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFuID0gcWNPdXRDaGFubmVsW2NoXTsKKyAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW4gPSBwc3lPdXRDaGFubmVsW2NoXTsKKyAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDsKKyAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgeworICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgaWYgKChxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnAgKyBzZmJdID4KKyAgICAgICAgICAgICBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnAgKyBzZmJdKSB8fAorICAgICAgICAgICAgKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKKyAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCArIHNmYl0gPSBOT19BSDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCArIHNmYl0gPSBBSF9JTkFDVElWRTsKICAgICAgICAgfQogICAgICAgfQotICAgfQorICAgIH0KKyAgfQogfQogCi0KLQogLyoqCi0gKiBcYnJpZWYgIENhbGN1bGF0ZSBjb25zdGFudHMgdGhhdCBkbyBub3QgY2hhbmdlIGR1cmluZyBzdWNjZXNzaXZlIHBlIGNhbGN1bGF0aW9ucy4KKyAqIFxicmllZiAgQ2FsY3VsYXRlIGNvbnN0YW50cyB0aGF0IGRvIG5vdCBjaGFuZ2UgZHVyaW5nIHN1Y2Nlc3NpdmUgcGUKKyAqIGNhbGN1bGF0aW9ucy4KICAqCi0gKiBccGFyYW0gcGVEYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgUEUgZGF0YSBvZiBjdXJyZW50IGVsZW1lbnQuCi0gKiBccGFyYW0gcHN5T3V0Q2hhbm5lbCAgICAgICAgIFBvaW50ZXIgdG8gUFNZX09VVF9DSEFOTkVMIHN0cnVjdCBob2xkaW5nIG5DaGFubmVscyBlbGVtZW50cy4KLSAqIFxwYXJhbSBxY091dENoYW5uZWwgICAgICAgICAgUG9pbnRlciB0byBRQ19PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZyBuQ2hhbm5lbHMgZWxlbWVudHMuCisgKiBccGFyYW0gcGVEYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgUEUgZGF0YSBvZgorICogY3VycmVudCBlbGVtZW50LgorICogXHBhcmFtIHBzeU91dENoYW5uZWwgICAgICAgICBQb2ludGVyIHRvIFBTWV9PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZworICogbkNoYW5uZWxzIGVsZW1lbnRzLgorICogXHBhcmFtIHFjT3V0Q2hhbm5lbCAgICAgICAgICBQb2ludGVyIHRvIFFDX09VVF9DSEFOTkVMIHN0cnVjdCBob2xkaW5nCisgKiBuQ2hhbm5lbHMgZWxlbWVudHMuCiAgKiBccGFyYW0gbkNoYW5uZWxzICAgICAgICAgICAgIE51bWJlciBvZiBjaGFubmVscyBpbiBlbGVtZW50LgotICogXHBhcmFtIHBlT2Zmc2V0ICAgICAgICAgICAgICBGaXhlZCBQRSBvZmZzZXQgZGVmaW5lZCB3aGlsZSBGREthYWNFbmNfQWRqVGhySW5pdCgpIGRlcGVuZGluZyBvbiBiaXRyYXRlLgorICogXHBhcmFtIHBlT2Zmc2V0ICAgICAgICAgICAgICBGaXhlZCBQRSBvZmZzZXQgZGVmaW5lZCB3aGlsZQorICogRkRLYWFjRW5jX0FkalRockluaXQoKSBkZXBlbmRpbmcgb24gYml0cmF0ZS4KICAqCiAgKiBccmV0dXJuICB2b2lkCiAgKi8KLXN0YXRpYwotdm9pZCBGREthYWNFbmNfcHJlcGFyZVBlKFBFX0RBVEEgKnBlRGF0YSwKLSAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCBwZU9mZnNldCkKLXsKLSAgICBJTlQgY2g7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfcHJlcGFyZVBlKFBFX0RBVEEgKmNvbnN0IHBlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNZX09VVF9DSEFOTkVMICpjb25zdCBwc3lPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFDX09VVF9DSEFOTkVMICpjb25zdCBxY091dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywgY29uc3QgSU5UIHBlT2Zmc2V0KSB7CisgIElOVCBjaDsKIAotICAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gcHN5T3V0Q2hhbm5lbFtjaF07Ci0gICAgICAgIEZES2FhY0VuY19wcmVwYXJlU2ZiUGUoJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0sCi0gICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGEsCi0gICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJGb3JtRmFjdG9yTGREYXRhLAotICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0cywKLSAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYkNudCwKLSAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYlBlckdyb3VwLAotICAgICAgICAgICAgcHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXApOwotICAgIH0KLSAgICBwZURhdGEtPm9mZnNldCA9IHBlT2Zmc2V0OworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW4gPSBwc3lPdXRDaGFubmVsW2NoXTsKKyAgICBGREthYWNFbmNfcHJlcGFyZVNmYlBlKAorICAgICAgICAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXSwgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhLAorICAgICAgICBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGEsIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkZvcm1GYWN0b3JMZERhdGEsCisgICAgICAgIHBzeU91dENoYW4tPnNmYk9mZnNldHMsIHBzeU91dENoYW4tPnNmYkNudCwgcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXAsCisgICAgICAgIHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwKTsKKyAgfQorICBwZURhdGEtPm9mZnNldCA9IHBlT2Zmc2V0OwogfQogCiAvKioKICAqIFxicmllZiAgQ2FsY3VsYXRlIHdlaWdodGluZyBmYWN0b3IgZm9yIHRocmVzaG9sZCBhZGp1c3RtZW50LgogICoKLSAqIENhbGN1bGF0ZSB3ZWlnaHRpbmcgZmFjdG9yIHRvIGJlIGFwcGxpZWQgYXQgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgaW4gbGQ2NCBmb3JtYXQuCisgKiBDYWxjdWxhdGUgd2VpZ2h0aW5nIGZhY3RvciB0byBiZSBhcHBsaWVkIGF0IGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzIGluIGxkNjQKKyAqIGZvcm1hdC4KICAqCiAgKiBccGFyYW0gcGVEYXRhLCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gUEUgZGF0YSBpbiBjdXJyZW50IGVsZW1lbnQuCi0gKiBccGFyYW0gcHN5T3V0Q2hhbm5lbCAgICAgICAgIFBvaW50ZXIgdG8gUFNZX09VVF9DSEFOTkVMIHN0cnVjdCBob2xkaW5nIG5DaGFubmVscyBlbGVtZW50cy4KLSAqIFxwYXJhbSBxY091dENoYW5uZWwgICAgICAgICAgUG9pbnRlciB0byBRQ19PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZyBuQ2hhbm5lbHMgZWxlbWVudHMuCisgKiBccGFyYW0gcHN5T3V0Q2hhbm5lbCAgICAgICAgIFBvaW50ZXIgdG8gUFNZX09VVF9DSEFOTkVMIHN0cnVjdCBob2xkaW5nCisgKiBuQ2hhbm5lbHMgZWxlbWVudHMuCisgKiBccGFyYW0gcWNPdXRDaGFubmVsICAgICAgICAgIFBvaW50ZXIgdG8gUUNfT1VUX0NIQU5ORUwgc3RydWN0IGhvbGRpbmcKKyAqIG5DaGFubmVscyBlbGVtZW50cy4KICAqIFxwYXJhbSB0b29sc0luZm8gICAgICAgICAgICAgUG9pbnRlciB0byB0b29scyBpbmZvIHN0cnVjdCBvZiBjdXJyZW50IGVsZW1lbnQuCi0gKiBccGFyYW0gYWRqVGhyU3RhdGVFbGVtZW50ICAgIFBvaW50ZXIgdG8gQVRTX0VMRU1FTlQgaG9sZGluZyBlbkZhY1BhdGNoIHN0YXRlcy4KKyAqIFxwYXJhbSBhZGpUaHJTdGF0ZUVsZW1lbnQgICAgUG9pbnRlciB0byBBVFNfRUxFTUVOVCBob2xkaW5nIGVuRmFjUGF0Y2gKKyAqIHN0YXRlcy4KICAqIFxwYXJhbSBuQ2hhbm5lbHMgICAgICAgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzIGluIGVsZW1lbnQuCiAgKiBccGFyYW0gdXNlUGF0Y2hUb29sICAgICAgICAgIEFwcGx5IHRoZSB3ZWlnaHRpbmcgdG9vbCAwIChubykgZWxzZSAoeWVzKS4KICAqCiAgKiBccmV0dXJuICB2b2lkCiAgKi8KLXN0YXRpYwotdm9pZCBGREthYWNFbmNfY2FsY1dlaWdodGluZyhQRV9EQVRBICpwZURhdGEsCi0gICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgIHN0cnVjdCBUT09MU0lORk8gKnRvb2xzSW5mbywKLSAgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBhZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgY29uc3QgSU5UIHVzZVBhdGNoVG9vbCkKLXsKLSAgICBpbnQgY2gsIG5vU2hvcnRXaW5kb3dJbkZyYW1lID0gVFJVRTsKLSAgICBJTlQgZXhlUGF0Y2hNID0gMDsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jYWxjV2VpZ2h0aW5nKAorICAgIGNvbnN0IFBFX0RBVEEgKmNvbnN0IHBlRGF0YSwKKyAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW5uZWxbKDIpXSwKKyAgICBRQ19PVVRfQ0hBTk5FTCAqY29uc3QgcWNPdXRDaGFubmVsWygyKV0sCisgICAgY29uc3Qgc3RydWN0IFRPT0xTSU5GTyAqY29uc3QgdG9vbHNJbmZvLAorICAgIEFUU19FTEVNRU5UICpjb25zdCBhZGpUaHJTdGF0ZUVsZW1lbnQsIGNvbnN0IElOVCBuQ2hhbm5lbHMsCisgICAgY29uc3QgSU5UIHVzZVBhdGNoVG9vbCkgeworICBpbnQgY2gsIG5vU2hvcnRXaW5kb3dJbkZyYW1lID0gVFJVRTsKKyAgSU5UIGV4ZVBhdGNoTSA9IDA7CiAKLSAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKLSAgICAgICAgICAgIG5vU2hvcnRXaW5kb3dJbkZyYW1lID0gRkFMU0U7CisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgeworICAgICAgbm9TaG9ydFdpbmRvd0luRnJhbWUgPSBGQUxTRTsKKyAgICB9CisgICAgRkRLbWVtY2xlYXIocWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZCwKKyAgICAgICAgICAgICAgICBNQVhfR1JPVVBFRF9TRkIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgfQorCisgIGlmICh1c2VQYXRjaFRvb2wgPT0gMCkgeworICAgIHJldHVybjsgLyogdG9vbCBpcyBkaXNhYmxlZCAqLworICB9CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgY29uc3QgUFNZX09VVF9DSEFOTkVMICpjb25zdCBwc3lPdXRDaGFuID0gcHN5T3V0Q2hhbm5lbFtjaF07CisKKyAgICBpZiAobm9TaG9ydFdpbmRvd0luRnJhbWUpIHsgLyogcmV0YWluIGVuZXJneSByYXRpbyBiZXR3ZWVuIGJsb2NrcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgbGVuZ3RoICovCisKKyAgICAgIEZJWFBfREJMIG5yZ1N1bTE0LCBucmdTdW0xMiwgbnJnU3VtMzQsIG5yZ1RvdGFsOworICAgICAgRklYUF9EQkwgbnJnRmFjTGRfMTQsIG5yZ0ZhY0xkXzEyLCBucmdGYWNMZF8zNDsKKyAgICAgIElOVCB1c2VQYXRjaCwgZXhlUGF0Y2g7CisgICAgICBpbnQgc2ZiLCBzZmJHcnAsIG5MaW5lc1N1bSA9IDA7CisKKyAgICAgIG5yZ1N1bTE0ID0gbnJnU3VtMTIgPSBucmdTdW0zNCA9IG5yZ1RvdGFsID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKworICAgICAgLyogY2FsY3VsYXRlIGZsYXRuZXNzIG9mIGF1ZGlibGUgc3BlY3RydW0sIGkuZS4gc3BlY3RydW0gYWJvdmUgbWFza2luZworICAgICAgICogdGhyZXNob2xkLiAqLworICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgIEZJWFBfREJMIG5yZ0ZhYzEyID0gQ2FsY0ludkxkRGF0YSgKKyAgICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl0gPj4gMSk7IC8qIG5yZ14oMS8yKSAqLworICAgICAgICAgIEZJWFBfREJMIG5yZ0ZhYzE0ID0gQ2FsY0ludkxkRGF0YSgKKyAgICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl0gPj4gMik7IC8qIG5yZ14oMS80KSAqLworCisgICAgICAgICAgLyogbWF4aW1hbCBudW1iZXIgb2YgYmFuZHMgaXMgNjQsIHJlc3VsdHMgc2NhbGluZyBmYWN0b3IgNiAqLworICAgICAgICAgIG5MaW5lc1N1bSArPSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2ZiTkxpbmVzW3NmYkdycCArIHNmYl07IC8qIHJlbGV2YW50IGxpbmVzICovCisgICAgICAgICAgbnJnVG90YWwgKz0KKyAgICAgICAgICAgICAgKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnAgKyBzZmJdID4+IDYpOyAvKiBzdW0gdXAgbnJnICovCisgICAgICAgICAgbnJnU3VtMTIgKz0gKG5yZ0ZhYzEyID4+IDYpOyAgICAgICAgICAgICAgICAgICAgLyogc3VtIHVwIG5yZ14oMi80KSAqLworICAgICAgICAgIG5yZ1N1bTE0ICs9IChucmdGYWMxNCA+PiA2KTsgICAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBucmdeKDEvNCkgKi8KKyAgICAgICAgICBucmdTdW0zNCArPSAoZk11bHQobnJnRmFjMTQsIG5yZ0ZhYzEyKSA+PiA2KTsgICAvKiBzdW0gdXAgbnJnXigzLzQpICovCiAgICAgICAgIH0KLSAgICAgICAgRkRLbWVtY2xlYXIocWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZCwgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOwotICAgIH0KKyAgICAgIH0KIAotICAgIGlmICh1c2VQYXRjaFRvb2w9PTApIHsKLSAgICAgICAgcmV0dXJuOyAvKiB0b29sIGlzIGRpc2FibGVkICovCi0gICAgfQorICAgICAgbnJnVG90YWwgPSBDYWxjTGREYXRhKG5yZ1RvdGFsKTsgLyogZ2V0IGxkNjQgb2YgdG90YWwgbnJnICovCiAKLSAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgICAgbnJnRmFjTGRfMTQgPQorICAgICAgICAgIENhbGNMZERhdGEobnJnU3VtMTQpIC0gbnJnVG90YWw7IC8qIGxkNjQobnJnU3VtMTQvbnJnVG90YWwpICovCisgICAgICBucmdGYWNMZF8xMiA9CisgICAgICAgICAgQ2FsY0xkRGF0YShucmdTdW0xMikgLSBucmdUb3RhbDsgLyogbGQ2NChucmdTdW0xMi9ucmdUb3RhbCkgKi8KKyAgICAgIG5yZ0ZhY0xkXzM0ID0KKyAgICAgICAgICBDYWxjTGREYXRhKG5yZ1N1bTM0KSAtIG5yZ1RvdGFsOyAvKiBsZDY0KG5yZ1N1bTM0L25yZ1RvdGFsKSAqLwogCi0gICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9IHBzeU91dENoYW5uZWxbY2hdOworICAgICAgLyogTm90ZTogbkxpbmVzU3VtIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHRvdGFsIGxpbmVzLCB0aGF0cworICAgICAgICogdGFrZW4gY2FyZSBvZiBpbiBsaW5lX3BlLmNwcCBGREthYWNFbmNfcHJlcGFyZVNmYlBlKCkgKi8KKyAgICAgIGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID0KKyAgICAgICAgICBmTWF4KEZMMkZYQ09OU1RfREJMKDAuMTg3NWYpLAorICAgICAgICAgICAgICAgZkRpdk5vcm0obkxpbmVzU3VtLCBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3BzeU91dENoYW4tPnNmYkNudF0pKTsKIAotICAgICAgICBpZiAobm9TaG9ydFdpbmRvd0luRnJhbWUpIHsgLyogcmV0YWluIGVuZXJneSByYXRpbyBiZXR3ZWVuIGJsb2NrcyBvZiBkaWZmZXJlbnQgbGVuZ3RoICovCisgICAgICB1c2VQYXRjaCA9IChhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA+CisgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjc4MTI1ZikpOworICAgICAgZXhlUGF0Y2ggPSAoKHVzZVBhdGNoKSAmJiAoYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0pKTsKIAotICAgICAgICAgICAgRklYUF9EQkwgbnJnU3VtMTQsIG5yZ1N1bTEyLCBucmdTdW0zNCwgbnJnVG90YWw7Ci0gICAgICAgICAgICBGSVhQX0RCTCBucmdGYWNMZF8xNCwgbnJnRmFjTGRfMTIsIG5yZ0ZhY0xkXzM0OwotICAgICAgICAgICAgSU5UIHVzZVBhdGNoLCBleGVQYXRjaDsKLSAgICAgICAgICAgIGludCBzZmIsIHNmYkdycCwgbkxpbmVzU3VtID0gMDsKKyAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgeworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICBJTlQgc2ZiRXhlUGF0Y2g7CisgICAgICAgICAgLyogZm9yIE1TIGNvdXBsZWQgU0ZCcywgYWxzbyBleGVjdXRlIHBhdGNoIGluIHNpZGUgY2hhbm5lbCBpZiBkb25lIGluCisgICAgICAgICAgICogbWlkIGNoYW5uZWwgKi8KKyAgICAgICAgICBpZiAoKGNoID09IDEpICYmICh0b29sc0luZm8tPm1zTWFza1tzZmJHcnAgKyBzZmJdKSkgeworICAgICAgICAgICAgc2ZiRXhlUGF0Y2ggPSBleGVQYXRjaE07CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNmYkV4ZVBhdGNoID0gZXhlUGF0Y2g7CisgICAgICAgICAgfQogCi0gICAgICAgICAgICBucmdTdW0xNCA9IG5yZ1N1bTEyID0gbnJnU3VtMzQgPSBucmdUb3RhbCA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0KLSAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBmbGF0bmVzcyBvZiBhdWRpYmxlIHNwZWN0cnVtLCBpLmUuIHNwZWN0cnVtIGFib3ZlIG1hc2tpbmcgdGhyZXNob2xkLiAqLwotICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7Ci0gICAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgbnJnRmFjMTIgPSBDYWxjSW52TGREYXRhKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXT4+MSk7IC8qIG5yZ14oMS8yKSAqLwotICAgICAgICAgICAgICAgIEZJWFBfREJMIG5yZ0ZhYzE0ID0gQ2FsY0ludkxkRGF0YShwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0+PjIpOyAvKiBucmdeKDEvNCkgKi8KLQotICAgICAgICAgICAgICAgIC8qIG1heGltYWwgbnVtYmVyIG9mIGJhbmRzIGlzIDY0LCByZXN1bHRzIHNjYWxpbmcgZmFjdG9yIDYgKi8KLSAgICAgICAgICAgICAgICBuTGluZXNTdW0gKz0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJOTGluZXNbc2ZiR3JwK3NmYl07ICAgICAgICAgICAgIC8qIHJlbGV2YW50IGxpbmVzICovCi0gICAgICAgICAgICAgICAgbnJnVG90YWwgICs9ICggcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdID4+IDYgKTsgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgbnJnICovCi0gICAgICAgICAgICAgICAgbnJnU3VtMTIgICs9ICggbnJnRmFjMTIgPj4gNiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgbnJnXigyLzQpICovCi0gICAgICAgICAgICAgICAgbnJnU3VtMTQgICs9ICggbnJnRmFjMTQgPj4gNiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgbnJnXigxLzQpICovCi0gICAgICAgICAgICAgICAgbnJnU3VtMzQgICs9ICggZk11bHQobnJnRmFjMTQsIG5yZ0ZhYzEyKSA+PiA2ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgbnJnXigzLzQpICovCi0gICAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKHNmYkV4ZVBhdGNoKSAmJgorICAgICAgICAgICAgICAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCArIHNmYl0gPiBGTDJGWENPTlNUX0RCTCgwLmYpKSkgeworICAgICAgICAgICAgLyogZXhlY3V0ZSBwYXRjaCBiYXNlZCBvbiBzcGVjdHJhbCBmbGF0bmVzcyBjYWxjdWxhdGVkIGFib3ZlICovCisgICAgICAgICAgICBpZiAoYWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVFbkZhY1tjaF0gPgorICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuODEyNWYpKSB7CisgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGRbc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgICAgICAoKG5yZ0ZhY0xkXzE0ICsKKyAgICAgICAgICAgICAgICAgICAgKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdICsKKyAgICAgICAgICAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXSA+PiAxKSkpID4+CisgICAgICAgICAgICAgICAgICAgMSk7IC8qIHNmYkVuZXJneV4oMy80KSAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA+CisgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNzk2ODc1ZikpIHsKKyAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgICAgICgobnJnRmFjTGRfMTIgKyBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXSkgPj4KKyAgICAgICAgICAgICAgICAgICAxKTsgLyogc2ZiRW5lcmd5XigyLzQpICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICAgICAgKChucmdGYWNMZF8zNCArCisgICAgICAgICAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXSA+PiAxKSkgPj4KKyAgICAgICAgICAgICAgICAgICAxKTsgLyogc2ZiRW5lcmd5XigxLzQpICovCiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5yZ1RvdGFsID0gQ2FsY0xkRGF0YShucmdUb3RhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBsZDY0IG9mIHRvdGFsIG5yZyAqLwotCi0gICAgICAgICAgICBucmdGYWNMZF8xNCA9IENhbGNMZERhdGEobnJnU3VtMTQpIC0gbnJnVG90YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZDY0KG5yZ1N1bTE0L25yZ1RvdGFsKSAqLwotICAgICAgICAgICAgbnJnRmFjTGRfMTIgPSBDYWxjTGREYXRhKG5yZ1N1bTEyKSAtIG5yZ1RvdGFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGQ2NChucmdTdW0xMi9ucmdUb3RhbCkgKi8KLSAgICAgICAgICAgIG5yZ0ZhY0xkXzM0ID0gQ2FsY0xkRGF0YShucmdTdW0zNCkgLSBucmdUb3RhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxkNjQobnJnU3VtMzQvbnJnVG90YWwpICovCi0KLSAgICAgICAgICAgIGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID0gRkRLbWF4KCBGTDJGWENPTlNUX0RCTCgwLjE4NzVmKSwgZkRpdk5vcm0obkxpbmVzU3VtLHBzeU91dENoYW4tPnNmYk9mZnNldHNbcHN5T3V0Q2hhbi0+c2ZiQ250XSkgKTsKLQotICAgICAgICAgICAgdXNlUGF0Y2ggPSAoYWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVFbkZhY1tjaF0gPiBGTDJGWENPTlNUX0RCTCgwLjc4MTI1ZikpOwotICAgICAgICAgICAgZXhlUGF0Y2ggPSAoKHVzZVBhdGNoKSAmJiAoYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0pKTsKLQotICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7Ci0gICAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0KLSAgICAgICAgICAgICAgICBJTlQgc2ZiRXhlUGF0Y2g7Ci0KLSAgICAgICAgICAgICAgICAvKiBmb3IgTVMgY291cGxlZCBTRkJzLCBhbHNvIGV4ZWN1dGUgcGF0Y2ggaW4gc2lkZSBjaGFubmVsIGlmIGRvbmUgaW4gbWlkIGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICBpZiAoKGNoID09IDEpICYmICh0b29sc0luZm8tPm1zTWFza1tzZmJHcnArc2ZiXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2ZiRXhlUGF0Y2ggPSBleGVQYXRjaE07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZmJFeGVQYXRjaCA9IGV4ZVBhdGNoOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICggKHNmYkV4ZVBhdGNoKSAmJiAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPkZMMkZYQ09OU1RfREJMKDAuZikpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGV4ZWN1dGUgcGF0Y2ggYmFzZWQgb24gc3BlY3RyYWwgZmxhdG5lc3MgY2FsY3VsYXRlZCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVFbkZhY1tjaF0gPiBGTDJGWENPTlNUX0RCTCgwLjgxMjVmKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSA9ICggKG5yZ0ZhY0xkXzE0ICsgKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSsocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdPj4xKSkpPj4xICk7IC8qIHNmYkVuZXJneV4oMy80KSAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID4gRkwyRlhDT05TVF9EQkwoMC43OTY4NzVmKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSA9ICggKG5yZ0ZhY0xkXzEyICsgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKT4+MSApOyAgICAgICAgICAvKiBzZmJFbmVyZ3leKDIvNCkgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGRbc2ZiR3JwK3NmYl0gPSAoIChucmdGYWNMZF8zNCArIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKT4+MSApOyAgICAgLyogc2ZiRW5lcmd5XigxLzQpICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSA9IGZpeE1pbihxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCtzZmJdLChGSVhQX0RCTCkwKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAvKiBzZmIgbG9vcCAqLwotCi0gICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmxhc3RFbkZhY1BhdGNoW2NoXSA9IHVzZVBhdGNoOwotICAgICAgICAgICAgZXhlUGF0Y2hNID0gZXhlUGF0Y2g7CisgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICAgIGZpeE1pbihxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCArIHNmYl0sIChGSVhQX0RCTCkwKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiAhbm9TaG9ydFdpbmRvd0luRnJhbWUgKi8KLSAgICAgICAgICAgIGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID0gRkwyRlhDT05TVF9EQkwoMC43NWYpOwotICAgICAgICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0gPSBUUlVFOyAvKiBhbGxvdyB1c2Ugb2Ygc2ZiRW5GYWMgcGF0Y2ggaW4gdXBjb21pbmcgZnJhbWUgKi8KLSAgICAgICAgfQorICAgICAgfSAvKiBzZmIgbG9vcCAqLwogCi0gICAgfSAvKiBjaCBsb29wICovCisgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmxhc3RFbkZhY1BhdGNoW2NoXSA9IHVzZVBhdGNoOworICAgICAgZXhlUGF0Y2hNID0gZXhlUGF0Y2g7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qICFub1Nob3J0V2luZG93SW5GcmFtZSAqLworICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVFbkZhY1tjaF0gPSBGTDJGWENPTlNUX0RCTCgwLjc1Zik7CisgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmxhc3RFbkZhY1BhdGNoW2NoXSA9CisgICAgICAgICAgVFJVRTsgLyogYWxsb3cgdXNlIG9mIHNmYkVuRmFjIHBhdGNoIGluIHVwY29taW5nIGZyYW1lICovCisgICAgfQogCisgIH0gLyogY2ggbG9vcCAqLwogfQogCi0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNQZQogZGVzY3JpcHRpb246ICBjYWxjdWxhdGUgcGUgZm9yIGJvdGggY2hhbm5lbHMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi12b2lkIEZES2FhY0VuY19jYWxjUGUoUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICBQRV9EQVRBICpwZURhdGEsCi0gICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKQotewotICAgSU5UIGNoOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NhbGNQZShjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUUNfT1VUX0NIQU5ORUwgKmNvbnN0IHFjT3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRV9EQVRBICpjb25zdCBwZURhdGEsIGNvbnN0IElOVCBuQ2hhbm5lbHMpIHsKKyAgSU5UIGNoOwogCi0gICBwZURhdGEtPnBlID0gcGVEYXRhLT5vZmZzZXQ7Ci0gICBwZURhdGEtPmNvbnN0UGFydCA9IDA7Ci0gICBwZURhdGEtPm5BY3RpdmVMaW5lcyA9IDA7Ci0gICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKLSAgICAgIEZES2FhY0VuY19jYWxjU2ZiUGUoJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0sCi0gICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhLAotICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+aXNCb29rLAotICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5pc1NjYWxlKTsKKyAgcGVEYXRhLT5wZSA9IHBlRGF0YS0+b2Zmc2V0OworICBwZURhdGEtPmNvbnN0UGFydCA9IDA7CisgIHBlRGF0YS0+bkFjdGl2ZUxpbmVzID0gMDsKKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07CiAKLSAgICAgIHBlRGF0YS0+cGUgKz0gcGVDaGFuRGF0YS0+cGU7Ci0gICAgICBwZURhdGEtPmNvbnN0UGFydCArPSBwZUNoYW5EYXRhLT5jb25zdFBhcnQ7Ci0gICAgICBwZURhdGEtPm5BY3RpdmVMaW5lcyArPSBwZUNoYW5EYXRhLT5uQWN0aXZlTGluZXM7Ci0gICB9CisgICAgRkRLYWFjRW5jX2NhbGNTZmJQZSgKKyAgICAgICAgcGVDaGFuRGF0YSwgcWNPdXRDaGFubmVsW2NoXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGEsCisgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YSwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCwKKyAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwLCBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAsCisgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5pc0Jvb2ssIHBzeU91dENoYW5uZWxbY2hdLT5pc1NjYWxlKTsKKworICAgIHBlRGF0YS0+cGUgKz0gcGVDaGFuRGF0YS0+cGU7CisgICAgcGVEYXRhLT5jb25zdFBhcnQgKz0gcGVDaGFuRGF0YS0+Y29uc3RQYXJ0OworICAgIHBlRGF0YS0+bkFjdGl2ZUxpbmVzICs9IHBlQ2hhbkRhdGEtPm5BY3RpdmVMaW5lczsKKyAgfQogfQogCi12b2lkIEZES2FhY0VuY19wZUNhbGN1bGF0aW9uKFBFX0RBVEEgKnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogYWRqVGhyU3RhdGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKQotewordm9pZCBGREthYWNFbmNfcGVDYWxjdWxhdGlvbihQRV9EQVRBICpjb25zdCBwZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAqY29uc3QgcWNPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBUT09MU0lORk8gKmNvbnN0IHRvb2xzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQgKmNvbnN0IGFkalRoclN0YXRlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykgewogICAvKiBjb25zdGFudHMgdGhhdCB3aWxsIG5vdCBjaGFuZ2UgZHVyaW5nIHN1Y2Nlc3NpdmUgcGUgY2FsY3VsYXRpb25zICovCi0gIEZES2FhY0VuY19wcmVwYXJlUGUocGVEYXRhLCBwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIG5DaGFubmVscywgYWRqVGhyU3RhdGVFbGVtZW50LT5wZU9mZnNldCk7CisgIEZES2FhY0VuY19wcmVwYXJlUGUocGVEYXRhLCBwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPnBlT2Zmc2V0KTsKIAogICAvKiBjYWxjdWxhdGUgd2VpZ2h0aW5nIGZhY3RvciBmb3IgdGhyZXNob2xkIGFkanVzdG1lbnQgKi8KLSAgRkRLYWFjRW5jX2NhbGNXZWlnaHRpbmcocGVEYXRhLCBwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHRvb2xzSW5mbywgYWRqVGhyU3RhdGVFbGVtZW50LCBuQ2hhbm5lbHMsIDEpOwoteworICBGREthYWNFbmNfY2FsY1dlaWdodGluZyhwZURhdGEsIHBzeU91dENoYW5uZWwsIHFjT3V0Q2hhbm5lbCwgdG9vbHNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQsIG5DaGFubmVscywgMSk7CisgIHsKICAgICAvKiBubyB3ZWlnaHRpbmcgb2YgdGhyZWhvbGRzIGFuZCBlbmVyZ2llcyBmb3IgbWxvdXQgKi8KICAgICAvKiB3ZWlnaHQgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgKi8KICAgICBpbnQgY2g7Ci0gICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIGludCBzZmIsIHNmYkdycDsKKyAgICAgIFFDX09VVF9DSEFOTkVMICpwUWNPdXRDaCA9IHFjT3V0Q2hhbm5lbFtjaF07CiAKLSAgICAgICAgaW50IHNmYiwgc2ZiR3JwOwotICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcFFjT3V0Q2ggPSBxY091dENoYW5uZWxbY2hdOwotCi0gICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewotICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgICBwUWNPdXRDaC0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiK3NmYkdycF0gPSBwUWNPdXRDaC0+c2ZiRW5lcmd5TGREYXRhW3NmYitzZmJHcnBdIC0gcFFjT3V0Q2gtPnNmYkVuRmFjTGRbc2ZiK3NmYkdycF07Ci0gICAgICAgICAgICBwUWNPdXRDaC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYitzZmJHcnBdICAgICAtPSBwUWNPdXRDaC0+c2ZiRW5GYWNMZFtzZmIrc2ZiR3JwXTsKLSAgICAgICAgICB9CisgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7CisgICAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAgcFFjT3V0Q2gtPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYiArIHNmYkdycF0gPQorICAgICAgICAgICAgICBwUWNPdXRDaC0+c2ZiRW5lcmd5TGREYXRhW3NmYiArIHNmYkdycF0gLQorICAgICAgICAgICAgICBwUWNPdXRDaC0+c2ZiRW5GYWNMZFtzZmIgKyBzZmJHcnBdOworICAgICAgICAgIHBRY091dENoLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiICsgc2ZiR3JwXSAtPQorICAgICAgICAgICAgICBwUWNPdXRDaC0+c2ZiRW5GYWNMZFtzZmIgKyBzZmJHcnBdOwogICAgICAgICB9CisgICAgICB9CiAgICAgfQotfQorICB9CiAKICAgLyogcGUgd2l0aG91dCByZWR1Y3Rpb24gKi8KICAgRkRLYWFjRW5jX2NhbGNQZShwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHBlRGF0YSwgbkNoYW5uZWxzKTsKIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZU5vQUgKIGRlc2NyaXB0aW9uOiAgc3VtIHRoZSBwZSBkYXRhIG9ubHkgZm9yIGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgaW5hY3RpdmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0ZES2FhY0VuY19jYWxjUGVOb0FIKElOVCAqcGUsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3RQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgKm5BY3RpdmVMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAqcGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhaEZsYWdbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKLXsKLSAgICBJTlQgY2gsIHNmYixzZmJHcnA7CisjZGVmaW5lIENPTlNUUEFSVF9IRUFEUk9PTSA0CitzdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZU5vQUgoCisgICAgSU5UICpjb25zdCBwZSwgSU5UICpjb25zdCBjb25zdFBhcnQsIElOVCAqY29uc3QgbkFjdGl2ZUxpbmVzLAorICAgIGNvbnN0IFBFX0RBVEEgKmNvbnN0IHBlRGF0YSwgY29uc3QgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKKyAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW5uZWxbKDIpXSwgY29uc3QgSU5UIG5DaGFubmVscykgeworICBJTlQgY2gsIHNmYiwgc2ZiR3JwOwogCi0gICAgSU5UIHBlX3RtcCA9IHBlRGF0YS0+b2Zmc2V0OwotICAgIElOVCBjb25zdFBhcnRfdG1wID0gMDsKLSAgICBJTlQgbkFjdGl2ZUxpbmVzX3RtcCA9IDA7Ci0gICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgICAgICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKLSAgICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApewotICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgICAgICAgICBpZihhaEZsYWdbY2hdW3NmYkdycCtzZmJdIDwgQUhfQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBlX3RtcCArPSBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3RQYXJ0X3RtcCArPSBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgICAgICAgICAgIG5BY3RpdmVMaW5lc190bXAgKz0gcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgSU5UIHBlX3RtcCA9IHBlRGF0YS0+b2Zmc2V0OworICBJTlQgY29uc3RQYXJ0X3RtcCA9IDA7CisgIElOVCBuQWN0aXZlTGluZXNfdG1wID0gMDsKKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgY29uc3QgUEVfQ0hBTk5FTF9EQVRBICpjb25zdCBwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07CisgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgeworICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgIGlmIChhaEZsYWdbY2hdW3NmYkdycCArIHNmYl0gPCBBSF9BQ1RJVkUpIHsKKyAgICAgICAgICBwZV90bXAgKz0gcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwICsgc2ZiXTsKKyAgICAgICAgICBjb25zdFBhcnRfdG1wICs9CisgICAgICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnAgKyBzZmJdID4+IENPTlNUUEFSVF9IRUFEUk9PTTsKKyAgICAgICAgICBuQWN0aXZlTGluZXNfdG1wICs9IHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnAgKyBzZmJdOwogICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIC8qIGNvcnJlY3Qgc2NhbGVkIHBlIGFuZCBjb25zdFBhcnQgdmFsdWVzICovCi0gICAgKnBlID0gcGVfdG1wID4+IFBFX0NPTlNUUEFSVF9TSElGVDsKLSAgICAqY29uc3RQYXJ0ID0gY29uc3RQYXJ0X3RtcCA+PiBQRV9DT05TVFBBUlRfU0hJRlQ7CisgIH0KKyAgLyogY29ycmVjdCBzY2FsZWQgcGUgYW5kIGNvbnN0UGFydCB2YWx1ZXMgKi8KKyAgKnBlID0gcGVfdG1wID4+IFBFX0NPTlNUUEFSVF9TSElGVDsKKyAgKmNvbnN0UGFydCA9IGNvbnN0UGFydF90bXAgPj4gKFBFX0NPTlNUUEFSVF9TSElGVCAtIENPTlNUUEFSVF9IRUFEUk9PTSk7CiAKLQkqbkFjdGl2ZUxpbmVzID0gbkFjdGl2ZUxpbmVzX3RtcDsKKyAgKm5BY3RpdmVMaW5lcyA9IG5BY3RpdmVMaW5lc190bXA7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzQ0JSCiBkZXNjcmlwdGlvbjogIGFwcGx5IHJlZHVjdGlvbiBmb3JtdWxhCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBsaW1pdFRoclJlZHVjZWRMZERhdGEgPSAoRklYUF9EQkwpMHgwMDAwODAwMDsgLypGTDJGWENPTlNUX0RCTChGREtwb3coMi4wLC1MRF9EQVRBX1NDQUxJTkcvNC4wKSk7Ki8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBsaW1pdFRoclJlZHVjZWRMZERhdGEgPQorICAgIChGSVhQX0RCTCkweDAwMDA4MDAwOyAvKkZMMkZYQ09OU1RfREJMKEZES3BvdygyLjAsLUxEX0RBVEFfU0NBTElORy80LjApKTsqLwogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUihRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdGhyRXhwWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgcmVkVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiByZWRWYWxTY2FsaW5nKQotewotICAgSU5UIGNoLCBzZmIsIHNmYkdycDsKLSAgIEZJWFBfREJMIHNmYkVuTGREYXRhLCBzZmJUaHJMZERhdGEsIHNmYlRoclJlZHVjZWRMZERhdGE7Ci0gICBGSVhQX0RCTCBzZmJUaHJFeHA7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUigKKyAgICBRQ19PVVRfQ0hBTk5FTCAqY29uc3QgcWNPdXRDaGFubmVsWygyKV0sCisgICAgY29uc3QgUFNZX09VVF9DSEFOTkVMICpjb25zdCBwc3lPdXRDaGFubmVsWygyKV0sCisgICAgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKKyAgICBjb25zdCBGSVhQX0RCTCB0aHJFeHBbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLCBjb25zdCBJTlQgbkNoYW5uZWxzLAorICAgIGNvbnN0IEZJWFBfREJMIHJlZFZhbF9tLCBjb25zdCBTQ0hBUiByZWRWYWxfZSkgeworICBJTlQgY2gsIHNmYiwgc2ZiR3JwOworICBGSVhQX0RCTCBzZmJFbkxkRGF0YSwgc2ZiVGhyTGREYXRhLCBzZmJUaHJSZWR1Y2VkTGREYXRhOworICBGSVhQX0RCTCBzZmJUaHJFeHA7CiAKLSAgICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFuID0gcWNPdXRDaGFubmVsW2NoXTsKLSAgICAgIGZvcihzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApewotICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICAgc2ZiRW5MZERhdGEgID0gcWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKLSAgICAgICAgIHNmYlRockxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdOwotICAgICAgICAgc2ZiVGhyRXhwICAgID0gdGhyRXhwW2NoXVtzZmJHcnArc2ZiXTsKLSAgICAgICAgIGlmICgoc2ZiRW5MZERhdGEgPiBzZmJUaHJMZERhdGEpICYmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IEFIX0FDVElWRSkpIHsKKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbiA9IHFjT3V0Q2hhbm5lbFtjaF07CisgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgeworICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgIHNmYkVuTGREYXRhID0gcWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdOworICAgICAgICBzZmJUaHJMZERhdGEgPSBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnAgKyBzZmJdOworICAgICAgICBzZmJUaHJFeHAgPSB0aHJFeHBbY2hdW3NmYkdycCArIHNmYl07CisgICAgICAgIGlmICgoc2ZiRW5MZERhdGEgPiBzZmJUaHJMZERhdGEpICYmCisgICAgICAgICAgICAoYWhGbGFnW2NoXVtzZmJHcnAgKyBzZmJdICE9IEFIX0FDVElWRSkpIHsKKyAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVkdWN0aW9uIGZvcm11bGE6CisgICAgICAgICAgIGZsb2F0IHRtcCA9IHRockV4cFtjaF1bc2ZiXStyZWRWYWw7CisgICAgICAgICAgIHRtcCAqPSB0bXA7CisgICAgICAgICAgIHNmYlRoclJlZHVjZWQgPSB0bXAqdG1wOworICAgICAgICAgICovCisgICAgICAgICAgaW50IG1pblNjYWxlID0gZml4TWluKENvdW50TGVhZGluZ0JpdHMoc2ZiVGhyRXhwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRMZWFkaW5nQml0cyhyZWRWYWxfbSkgLSByZWRWYWxfZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgIDE7CiAKLSAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWR1Y3Rpb24gZm9ybXVsYToKLSAgICAgICAgICAgICBmbG9hdCB0bXAgPSB0aHJFeHBbY2hdW3NmYl0rcmVkVmFsOwotICAgICAgICAgICAgIHRtcCAqPSB0bXA7Ci0gICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IHRtcCp0bXA7Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICAgaW50IG1pblNjYWxlID0gZml4TWluKENvdW50TGVhZGluZ0JpdHMoc2ZiVGhyRXhwKSwgQ291bnRMZWFkaW5nQml0cyhyZWRWYWwpIC0gKERGUkFDVF9CSVRTLTEtcmVkVmFsU2NhbGluZykgKS0xOworICAgICAgICAgIC8qIDQqbG9nKCBzZmJUaHJFeHAgKyByZWRWYWwgKSAqLworICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPQorICAgICAgICAgICAgICBDYWxjTGREYXRhKGZBYnMoc2NhbGVWYWx1ZShzZmJUaHJFeHAsIG1pblNjYWxlKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKHJlZFZhbF9tLCByZWRWYWxfZSArIG1pblNjYWxlKSkpIC0KKyAgICAgICAgICAgICAgKEZJWFBfREJMKShtaW5TY2FsZSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCkpOworICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPDw9IDI7CiAKLSAgICAgICAgICAgIC8qIDQqbG9nKCBzZmJUaHJFeHAgKyByZWRWYWwgKSAqLwotICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IENhbGNMZERhdGEoZkFicyhzY2FsZVZhbHVlKHNmYlRockV4cCwgbWluU2NhbGUpICsgc2NhbGVWYWx1ZShyZWRWYWwsKERGUkFDVF9CSVRTLTEtcmVkVmFsU2NhbGluZykrbWluU2NhbGUpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKEZJWFBfREJMKShtaW5TY2FsZTw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpOwotICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA8PD0gMjsKKyAgICAgICAgICAvKiBhdm9pZCBob2xlcyAqLworICAgICAgICAgIGlmICgoc2ZiVGhyUmVkdWNlZExkRGF0YSA+CisgICAgICAgICAgICAgICAocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSArIHNmYkVuTGREYXRhKSkgJiYKKyAgICAgICAgICAgICAgKGFoRmxhZ1tjaF1bc2ZiR3JwICsgc2ZiXSAhPSBOT19BSCkpIHsKKyAgICAgICAgICAgIGlmIChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdID4KKyAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoLTEuMGYpIC0gc2ZiRW5MZERhdGEpKSB7CisgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBmaXhNYXgoCisgICAgICAgICAgICAgICAgICAocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSArIHNmYkVuTGREYXRhKSwKKyAgICAgICAgICAgICAgICAgIHNmYlRockxkRGF0YSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YTsKKyAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwICsgc2ZiXSA9IEFIX0FDVElWRTsKKyAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8qIGF2b2lkIGhvbGVzICovCi0gICAgICAgICAgICBpZiAoICgoc2ZiVGhyUmVkdWNlZExkRGF0YSAtIHNmYkVuTGREYXRhKSA+IHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICkKLSAgICAgICAgICAgICAgICAgICAgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICA+IChGTDJGWENPTlNUX0RCTCgtMS4wZikgLSBzZmJFbkxkRGF0YSkgKXsKLSAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSArIHNmYkVuTGREYXRhKSwgc2ZiVGhyTGREYXRhKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGE7Ci0gICAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgLyogbWluaW11bSBvZiAyOSBkQiBSYXRpbyBmb3IgVGhyZXNob2xkcyAqLworICAgICAgICAgIGlmICgoc2ZiRW5MZERhdGEgKyAoRklYUF9EQkwpTUFYVkFMX0RCTCkgPgorICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5LjYzMzYyMDYgLyBMRF9EQVRBX1NDQUxJTkcpKSB7CisgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KAorICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEsCisgICAgICAgICAgICAgICAgKHNmYkVuTGREYXRhIC0gRkwyRlhDT05TVF9EQkwoOS42MzM2MjA2IC8gTERfREFUQV9TQ0FMSU5HKSkpOworICAgICAgICAgIH0KIAotICAgICAgICAgICAgLyogbWluaW11bSBvZiAyOSBkQiBSYXRpbyBmb3IgVGhyZXNob2xkcyAqLwotICAgICAgICAgICAgaWYgKChzZmJFbkxkRGF0YSsoRklYUF9EQkwpTUFYVkFMX0RCTCkgPiBGTDJGWENPTlNUX0RCTCg5LjYzMzYyMDYvTERfREFUQV9TQ0FMSU5HKSl7Ci0gICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heChzZmJUaHJSZWR1Y2VkTGREYXRhLCAoc2ZiRW5MZERhdGEgLSBGTDJGWENPTlNUX0RCTCg5LjYzMzYyMDYvTERfREFUQV9TQ0FMSU5HKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IHNmYlRoclJlZHVjZWRMZERhdGE7Ci0gICAgICAgICB9CisgICAgICAgICAgcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXSA9IHNmYlRoclJlZHVjZWRMZERhdGE7CiAgICAgICAgIH0KICAgICAgIH0KLSAgIH0KKyAgICB9CisgIH0KIH0KIAogLyogc2ltaWxhciB0byBwcmVwYXJlU2ZiUGUxKCkgKi8KLXN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY2FsY0NoYW9zTWVhc3VyZShQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgKnNmYkZvcm1GYWN0b3JMZERhdGEpCi17Ci0gICNkZWZpbmUgU0NBTEVfRk9STV9GQUMgICAgICg0KSAgICAvKiAoU0NBTEVfRk9STV9GQUMrRk9STV9GQUNfU0hJRlQpID49IGxkKEZSQU1FX0xFTkdUSCkqLwotICAjZGVmaW5lIFNDQUxFX05SR1MgICAgICAgICAoOCkKLSAgI2RlZmluZSBTQ0FMRV9OTElORVMgICAgICAoMTYpCi0gICNkZWZpbmUgU0NBTEVfTlJHU19TUVJUNCAgICgyKSAgICAvKiAwLjI1ICogU0NBTEVfTlJHUyAqLwotICAjZGVmaW5lIFNDQUxFX05MSU5FU19QMzQgICgxMikgICAgLyogMC43NSAqIFNDQUxFX05MSU5FUyAqLworc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jYWxjQ2hhb3NNZWFzdXJlKAorICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbm5lbCwKKyAgICBjb25zdCBGSVhQX0RCTCAqY29uc3Qgc2ZiRm9ybUZhY3RvckxkRGF0YSkgeworI2RlZmluZSBTQ0FMRV9GT1JNX0ZBQyBcCisgICg0KSAvKiAoU0NBTEVfRk9STV9GQUMrRk9STV9GQUNfU0hJRlQpID49IGxkKEZSQU1FX0xFTkdUSCkqLworI2RlZmluZSBTQ0FMRV9OUkdTICg4KQorI2RlZmluZSBTQ0FMRV9OTElORVMgKDE2KQorI2RlZmluZSBTQ0FMRV9OUkdTX1NRUlQ0ICgyKSAgLyogMC4yNSAqIFNDQUxFX05SR1MgKi8KKyNkZWZpbmUgU0NBTEVfTkxJTkVTX1AzNCAoMTIpIC8qIDAuNzUgKiBTQ0FMRV9OTElORVMgKi8KIAotICBJTlQgICBzZmJHcnAsIHNmYjsKKyAgSU5UIHNmYkdycCwgc2ZiOwogICBGSVhQX0RCTCBjaGFvc01lYXN1cmU7CiAgIElOVCBmcmFtZU5MaW5lcyA9IDA7CiAgIEZJWFBfREJMIGZyYW1lRm9ybUZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgIEZJWFBfREJMIGZyYW1lRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKIAotICBmb3IgKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7Ci0gICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKyl7Ci0gICAgICBpZiAocHN5T3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdID4gcHN5T3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdKSB7Ci0gICAgICAgIGZyYW1lRm9ybUZhY3RvciArPSAoQ2FsY0ludkxkRGF0YShzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCtzZmJdKT4+U0NBTEVfRk9STV9GQUMpOwotICAgICAgICBmcmFtZU5MaW5lcyAgICAgKz0gKHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiR3JwK3NmYisxXSAtIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiR3JwK3NmYl0pOwotICAgICAgICBmcmFtZUVuZXJneSAgICAgKz0gKHBzeU91dENoYW5uZWwtPnNmYkVuZXJneVtzZmJHcnArc2ZiXT4+U0NBTEVfTlJHUyk7CisgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbC0+c2ZiQ250OworICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICBpZiAocHN5T3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl0gPgorICAgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnAgKyBzZmJdKSB7CisgICAgICAgIGZyYW1lRm9ybUZhY3RvciArPSAoQ2FsY0ludkxkRGF0YShzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCArIHNmYl0pID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfRk9STV9GQUMpOworICAgICAgICBmcmFtZU5MaW5lcyArPSAocHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJHcnAgKyBzZmIgKyAxXSAtCisgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYkdycCArIHNmYl0pOworICAgICAgICBmcmFtZUVuZXJneSArPSAocHN5T3V0Q2hhbm5lbC0+c2ZiRW5lcmd5W3NmYkdycCArIHNmYl0gPj4gU0NBTEVfTlJHUyk7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgaWYoZnJhbWVOTGluZXMgPiAwKXsKLQotICAgIC8qICBmcmFtZU5BY3RpdmVMaW5lcyA9IGZyYW1lRm9ybUZhY3RvcioyXkZPUk1fRkFDX1NISUZUICogKChmcmFtZUVuZXJneSAqMl5TQ0FMRV9OUkdTKS9mcmFtZU5MaW5lcyleLTAuMjUKLSAgICAgICAgY2hhb3NNZWFzdXJlICAgICAgPSBmcmFtZU5BY3RpdmVMaW5lcyAvIGZyYW1lTkxpbmVzICovCi0gICAgY2hhb3NNZWFzdXJlID0KLSAgICAgICAgICAgQ2FsY0ludkxkRGF0YSggKCgoQ2FsY0xkRGF0YShmcmFtZUZvcm1GYWN0b3IpPj4xKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKENhbGNMZERhdGEoZnJhbWVFbmVyZ3kpPj4oMisxKSkpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43NWYpLENhbGNMZERhdGEoKEZJWFBfREJMKWZyYW1lTkxpbmVzPDwoREZSQUNUX0JJVFMtMS1TQ0FMRV9OTElORVMpKSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKEZJWFBfREJMKSgtKCgtU0NBTEVfRk9STV9GQUMrU0NBTEVfTlJHU19TUVJUNC1GT1JNX0ZBQ19TSElGVCtTQ0FMRV9OTElORVNfUDM0KSA8PCAoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSkpKT4+MSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICk8PDEgKTsKKyAgaWYgKGZyYW1lTkxpbmVzID4gMCkgeworICAgIC8qICBmcmFtZU5BY3RpdmVMaW5lcyA9IGZyYW1lRm9ybUZhY3RvcioyXkZPUk1fRkFDX1NISUZUICogKChmcmFtZUVuZXJneQorICAgICAgICoyXlNDQUxFX05SR1MpL2ZyYW1lTkxpbmVzKV4tMC4yNSBjaGFvc01lYXN1cmUgICAgICA9IGZyYW1lTkFjdGl2ZUxpbmVzIC8KKyAgICAgICBmcmFtZU5MaW5lcyAqLworICAgIGNoYW9zTWVhc3VyZSA9IENhbGNJbnZMZERhdGEoCisgICAgICAgICgoKENhbGNMZERhdGEoZnJhbWVGb3JtRmFjdG9yKSA+PiAxKSAtCisgICAgICAgICAgKENhbGNMZERhdGEoZnJhbWVFbmVyZ3kpID4+ICgyICsgMSkpKSAtCisgICAgICAgICAoZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzVmKSwKKyAgICAgICAgICAgICAgICAgICAgQ2FsY0xkRGF0YSgoRklYUF9EQkwpZnJhbWVOTGluZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoREZSQUNUX0JJVFMgLSAxIC0gU0NBTEVfTkxJTkVTKSkpIC0KKyAgICAgICAgICAoKChGSVhQX0RCTCkoLSgoLVNDQUxFX0ZPUk1fRkFDICsgU0NBTEVfTlJHU19TUVJUNCAtIEZPUk1fRkFDX1NISUZUICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfTkxJTkVTX1AzNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCkpKSkgPj4KKyAgICAgICAgICAgMSkpKQorICAgICAgICA8PCAxKTsKICAgfSBlbHNlIHsKLQogICAgIC8qIGFzc3VtaW5nIHRvdGFsIGNoYW9zLCBpZiBubyBzZmIgaXMgYWJvdmUgdGhyZXNob2xkcyAqLwogICAgIGNoYW9zTWVhc3VyZSA9IEZMMkZYQ09OU1RfREJMKDEuZik7CiAgIH0KQEAgLTk3MCw0NyArMTEwNyw0NiBAQAogfQogCiAvKiBhcHBseSByZWR1Y3Rpb24gZm9ybXVsYSBmb3IgVkJSLW1vZGUgKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzVkJSKFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRockV4cFsoMildW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICB2YnJRdWFsRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogY2hhb3NNZWFzdXJlT2xkKQoteworc3RhdGljIHZvaWQgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNWQlIoCisgICAgUUNfT1VUX0NIQU5ORUwgKmNvbnN0IHFjT3V0Q2hhbm5lbFsoMildLAorICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbm5lbFsoMildLAorICAgIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCisgICAgY29uc3QgRklYUF9EQkwgdGhyRXhwWygyKV1bTUFYX0dST1VQRURfU0ZCXSwgY29uc3QgSU5UIG5DaGFubmVscywKKyAgICBjb25zdCBGSVhQX0RCTCB2YnJRdWFsRmFjdG9yLCBGSVhQX0RCTCAqY29uc3QgY2hhb3NNZWFzdXJlT2xkKSB7CiAgIElOVCBjaCwgc2ZiR3JwLCBzZmI7Ci0gIEZJWFBfREJMIGNoR3JvdXBFbmVyZ3lbVFJBTlNfRkFDXVsyXTsvKmVuZXJneSBmb3IgZWFjaCBncm91cCBhbmQgY2hhbm5lbCovCisgIEZJWFBfREJMIGNoR3JvdXBFbmVyZ3lbVFJBTlNfRkFDXVsyXTsgLyplbmVyZ3kgZm9yIGVhY2ggZ3JvdXAgYW5kIGNoYW5uZWwqLwogICBGSVhQX0RCTCBjaENoYW9zTWVhc3VyZVsyXTsKICAgRklYUF9EQkwgZnJhbWVFbmVyZ3kgPSBGTDJGWENPTlNUX0RCTCgxZS0xMGYpOwogICBGSVhQX0RCTCBjaGFvc01lYXN1cmUgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICBGSVhQX0RCTCBzZmJFbkxkRGF0YSwgc2ZiVGhyTGREYXRhLCBzZmJUaHJFeHA7CiAgIEZJWFBfREJMIHNmYlRoclJlZHVjZWRMZERhdGE7CiAgIEZJWFBfREJMIGNoYW9zTWVhc3VyZUF2ZzsKLSAgSU5UIGdyb3VwQ250OyAvKiBsb29wIGNvdW50ZXIgKi8KLSAgRklYUF9EQkwgcmVkVmFsW1RSQU5TX0ZBQ107IC8qIHJlZHVjdGlvbiB2YWx1ZXM7IGluIHNob3J0LWJsb2NrIGNhc2Ugb25lIHJlZFZhbCBmb3IgZWFjaCBncm91cCAqLwotICBRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbiAgPSBOVUxMOwotICBQU1lfT1VUX0NIQU5ORUwgICpwc3lPdXRDaGFuICA9IE5VTEw7CisgIElOVCBncm91cENudDsgICAgICAgICAgICAgICAvKiBsb29wIGNvdW50ZXIgKi8KKyAgRklYUF9EQkwgcmVkVmFsW1RSQU5TX0ZBQ107IC8qIHJlZHVjdGlvbiB2YWx1ZXM7IGluIHNob3J0LWJsb2NrIGNhc2Ugb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRWYWwgZm9yIGVhY2ggZ3JvdXAgKi8KKyAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbiA9IE5VTEw7CisgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9IE5VTEw7CiAKLSNkZWZpbmUgU0NBTEVfR1JPVVBfRU5FUkdZICAgKDgpCisjZGVmaW5lIFNDQUxFX0dST1VQX0VORVJHWSAoOCkKIAotI2RlZmluZSBDT05TVF9DSEFPU19NRUFTX0FWR19GQUNfMCAgKEZMMkZYQ09OU1RfREJMKDAuMjVmKSkKLSNkZWZpbmUgQ09OU1RfQ0hBT1NfTUVBU19BVkdfRkFDXzEgIChGTDJGWENPTlNUX0RCTCgxLmYtMC4yNWYpKQorI2RlZmluZSBDT05TVF9DSEFPU19NRUFTX0FWR19GQUNfMCAoRkwyRlhDT05TVF9EQkwoMC4yNWYpKQorI2RlZmluZSBDT05TVF9DSEFPU19NRUFTX0FWR19GQUNfMSAoRkwyRlhDT05TVF9EQkwoMS5mIC0gMC4yNWYpKQogCi0jZGVmaW5lIE1JTl9MRFRIUkVTSCAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoLTAuNTE1NjI1ZikpCisjZGVmaW5lIE1JTl9MRFRIUkVTSCAoRkwyRlhDT05TVF9EQkwoLTAuNTE1NjI1ZikpCiAKLQotICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKXsKLSAgICBxY091dENoYW4gID0gcWNPdXRDaGFubmVsW2NoXTsKLSAgICBwc3lPdXRDaGFuICA9IHBzeU91dENoYW5uZWxbY2hdOworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBwc3lPdXRDaGFuID0gcHN5T3V0Q2hhbm5lbFtjaF07CiAKICAgICAvKiBhZGRpbmcgdXAgZW5lcmd5IGZvciBlYWNoIGNoYW5uZWwgYW5kIGVhY2ggZ3JvdXAgc2VwYXJhdGVseSAqLwogICAgIEZJWFBfREJMIGNoRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICBncm91cENudD0wOworICAgIGdyb3VwQ250ID0gMDsKIAotICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXAsIGdyb3VwQ250KyspIHsKKyAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDsKKyAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCwgZ3JvdXBDbnQrKykgewogICAgICAgY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspewotICAgICAgICBjaEdyb3VwRW5lcmd5W2dyb3VwQ250XVtjaF0gKz0gKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXT4+U0NBTEVfR1JPVVBfRU5FUkdZKTsKKyAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgIGNoR3JvdXBFbmVyZ3lbZ3JvdXBDbnRdW2NoXSArPQorICAgICAgICAgICAgKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnAgKyBzZmJdID4+IFNDQUxFX0dST1VQX0VORVJHWSk7CiAgICAgICB9CiAgICAgICBjaEVuZXJneSArPSBjaEdyb3VwRW5lcmd5W2dyb3VwQ250XVtjaF07CiAgICAgfQpAQCAtMTAxOCwxMTAgKzExNTQsMTMzIEBACiAKICAgICAvKiBjaGFvc01lYXN1cmUgKi8KICAgICBpZiAocHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgewotICAgICAgY2hDaGFvc01lYXN1cmVbY2hdID0gRkwyRlhDT05TVF9EQkwoMC41Zik7IC8qIGFzc3VtZSBhIGNvbnN0YW50IGNoYW9zIG1lYXN1cmUgb2YgMC41ZiBmb3Igc2hvcnQgYmxvY2tzICovCisgICAgICBjaENoYW9zTWVhc3VyZVtjaF0gPSBGTDJGWENPTlNUX0RCTCgKKyAgICAgICAgICAwLjVmKTsgLyogYXNzdW1lIGEgY29uc3RhbnQgY2hhb3MgbWVhc3VyZSBvZiAwLjVmIGZvciBzaG9ydCBibG9ja3MgKi8KICAgICB9IGVsc2UgewotICAgICAgY2hDaGFvc01lYXN1cmVbY2hdID0gRkRLYWFjRW5jX2NhbGNDaGFvc01lYXN1cmUocHN5T3V0Q2hhbm5lbFtjaF0sIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkZvcm1GYWN0b3JMZERhdGEpOworICAgICAgY2hDaGFvc01lYXN1cmVbY2hdID0gRkRLYWFjRW5jX2NhbGNDaGFvc01lYXN1cmUoCisgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0sIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkZvcm1GYWN0b3JMZERhdGEpOwogICAgIH0KICAgICBjaGFvc01lYXN1cmUgKz0gZk11bHQoY2hDaGFvc01lYXN1cmVbY2hdLCBjaEVuZXJneSk7CiAgIH0KIAotICBpZihmcmFtZUVuZXJneSA+IGNoYW9zTWVhc3VyZSkgeworICBpZiAoZnJhbWVFbmVyZ3kgPiBjaGFvc01lYXN1cmUpIHsKICAgICBJTlQgc2NhbGUgPSBDbnRMZWFkaW5nWmVyb3MoZnJhbWVFbmVyZ3kpIC0gMTsKLSAgICBGSVhQX0RCTCBudW0gICA9IGNoYW9zTWVhc3VyZTw8c2NhbGU7Ci0gICAgRklYUF9EQkwgZGVudW0gPSBmcmFtZUVuZXJneTw8c2NhbGU7Ci0gICAgY2hhb3NNZWFzdXJlICAgPSBzY2h1cl9kaXYobnVtLGRlbnVtLDE2KTsKLSAgfQotICBlbHNlIHsKKyAgICBGSVhQX0RCTCBudW0gPSBjaGFvc01lYXN1cmUgPDwgc2NhbGU7CisgICAgRklYUF9EQkwgZGVudW0gPSBmcmFtZUVuZXJneSA8PCBzY2FsZTsKKyAgICBjaGFvc01lYXN1cmUgPSBzY2h1cl9kaXYobnVtLCBkZW51bSwgMTYpOworICB9IGVsc2UgewogICAgIGNoYW9zTWVhc3VyZSA9IEZMMkZYQ09OU1RfREJMKDEuZik7CiAgIH0KIAogICBjaGFvc01lYXN1cmVBdmcgPSBmTXVsdChDT05TVF9DSEFPU19NRUFTX0FWR19GQUNfMCwgY2hhb3NNZWFzdXJlKSArCi0gICAgICAgICAgICAgICAgICAgIGZNdWx0KENPTlNUX0NIQU9TX01FQVNfQVZHX0ZBQ18xLCAqY2hhb3NNZWFzdXJlT2xkKTsgICAgICAvKiBhdmVyYWdpbmcgY2hhb3MgbWVhc3VyZSAqLwotICAqY2hhb3NNZWFzdXJlT2xkID0gY2hhb3NNZWFzdXJlID0gKGZpeE1pbihjaGFvc01lYXN1cmUsIGNoYW9zTWVhc3VyZUF2ZykpOyAgLyogdXNlIG1pbi12YWx1ZSwgc2FmZSBmb3IgbmV4dCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICBmTXVsdChDT05TVF9DSEFPU19NRUFTX0FWR19GQUNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKmNoYW9zTWVhc3VyZU9sZCk7IC8qIGF2ZXJhZ2luZyBjaGFvcyBtZWFzdXJlICovCisgICpjaGFvc01lYXN1cmVPbGQgPSBjaGFvc01lYXN1cmUgPSAoZml4TWluKAorICAgICAgY2hhb3NNZWFzdXJlLCBjaGFvc01lYXN1cmVBdmcpKTsgLyogdXNlIG1pbi12YWx1ZSwgc2FmZSBmb3IgbmV4dCBmcmFtZSAqLwogCiAgIC8qIGNoYXJhY3RlcmlzdGljIGN1cnZlCiAgICAgIGNoYW9zTWVhc3VyZSA9IDAuMmYgKyAwLjdmLzAuM2YgKiAoY2hhb3NNZWFzdXJlIC0gMC4yZik7CiAgICAgIGNoYW9zTWVhc3VyZSA9IGZpeE1pbigxLjBmLCBmaXhNYXgoMC4xZiwgY2hhb3NNZWFzdXJlKSk7CiAgICAgIGNvbnN0YW50cyBzY2FsZWQgYnkgNC5mCiAgICovCi0gIGNoYW9zTWVhc3VyZSA9ICgoRkwyRlhDT05TVF9EQkwoMC4yZik+PjIpICsgZk11bHQoRkwyRlhDT05TVF9EQkwoMC43Zi8oNC5mKjAuM2YpKSwgKGNoYW9zTWVhc3VyZSAtIEZMMkZYQ09OU1RfREJMKDAuMmYpKSkpOwotICBjaGFvc01lYXN1cmUgPSAoZml4TWluKChGSVhQX0RCTCkoRkwyRlhDT05TVF9EQkwoMS4wZik+PjIpLCBmaXhNYXgoKEZJWFBfREJMKShGTDJGWENPTlNUX0RCTCgwLjFmKT4+MiksIGNoYW9zTWVhc3VyZSkpKTw8MjsKKyAgY2hhb3NNZWFzdXJlID0gKChGTDJGWENPTlNUX0RCTCgwLjJmKSA+PiAyKSArCisgICAgICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmIC8gKDQuZiAqIDAuM2YpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaGFvc01lYXN1cmUgLSBGTDJGWENPTlNUX0RCTCgwLjJmKSkpKTsKKyAgY2hhb3NNZWFzdXJlID0KKyAgICAgIChmaXhNaW4oKEZJWFBfREJMKShGTDJGWENPTlNUX0RCTCgxLjBmKSA+PiAyKSwKKyAgICAgICAgICAgICAgZml4TWF4KChGSVhQX0RCTCkoRkwyRlhDT05TVF9EQkwoMC4xZikgPj4gMiksIGNoYW9zTWVhc3VyZSkpKQorICAgICAgPDwgMjsKIAogICAvKiBjYWxjdWxhdGlvbiBvZiByZWR1Y3Rpb24gdmFsdWUgKi8KLSAgaWYgKHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpeyAvKiBzaG9ydC1ibG9ja3MgKi8KLSAgICBGREtfQVNTRVJUKFRSQU5TX0ZBQz09OCk7Ci0gICAgI2RlZmluZSAgIFdJTl9UWVBFX1NDQUxFICAgKDMpCisgIGlmIChwc3lPdXRDaGFubmVsWzBdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7IC8qIHNob3J0LWJsb2NrcyAqLworICAgIEZES19BU1NFUlQoVFJBTlNfRkFDID09IDgpOworI2RlZmluZSBXSU5fVFlQRV9TQ0FMRSAoMykKIAotICAgIElOVCBzZmJHcnAsIGdyb3VwQ250PTA7Ci0gICAgZm9yIChzZmJHcnA9MDsgc2ZiR3JwPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCxncm91cENudCsrKSB7Ci0KKyAgICBncm91cENudCA9IDA7CisgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsWzBdLT5zZmJDbnQ7CisgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbFswXS0+c2ZiUGVyR3JvdXAsIGdyb3VwQ250KyspIHsKICAgICAgIEZJWFBfREJMIGdyb3VwRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKIAotICAgICAgZm9yKGNoPTA7Y2g8bkNoYW5uZWxzO2NoKyspewotICAgICAgICBncm91cEVuZXJneSArPSBjaEdyb3VwRW5lcmd5W2dyb3VwQ250XVtjaF07ICAgLyogYWRkaW5nIHVwIHRoZSBjaGFubmVscyBncm91cEVuZXJneSAqLworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGdyb3VwRW5lcmd5ICs9CisgICAgICAgICAgICBjaEdyb3VwRW5lcmd5W2dyb3VwQ250XQorICAgICAgICAgICAgICAgICAgICAgICAgIFtjaF07IC8qIGFkZGluZyB1cCB0aGUgY2hhbm5lbHMgZ3JvdXBFbmVyZ3kgKi8KICAgICAgIH0KIAotICAgICAgRkRLX0FTU0VSVChwc3lPdXRDaGFubmVsWzBdLT5ncm91cExlbltncm91cENudF08PUlOVl9JTlRfVEFCX1NJWkUpOwotICAgICAgZ3JvdXBFbmVyZ3kgPSBmTXVsdChncm91cEVuZXJneSxpbnZJbnRbcHN5T3V0Q2hhbm5lbFswXS0+Z3JvdXBMZW5bZ3JvdXBDbnRdXSk7ICAvKiBjb3JyZWN0aW9uIG9mIGdyb3VwIGVuZXJneSAqLwotICAgICAgZ3JvdXBFbmVyZ3kgPSBmaXhNaW4oZ3JvdXBFbmVyZ3ksIGZyYW1lRW5lcmd5Pj5XSU5fVFlQRV9TQ0FMRSk7ICAgICAgICAgICAgICAgICAvKiBkbyBub3QgYWxsb3cgYW4gaGlnaGVyIHJlZFZhbCBhcyBjYWxjdWxhdGVkIGZyYW1ld2lzZSAqLworICAgICAgRkRLX0FTU0VSVChwc3lPdXRDaGFubmVsWzBdLT5ncm91cExlbltncm91cENudF0gPD0gSU5WX0lOVF9UQUJfU0laRSk7CisgICAgICBncm91cEVuZXJneSA9IGZNdWx0KAorICAgICAgICAgIGdyb3VwRW5lcmd5LAorICAgICAgICAgIGludkludFtwc3lPdXRDaGFubmVsWzBdLT5ncm91cExlbltncm91cENudF1dKTsgLyogY29ycmVjdGlvbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgZW5lcmd5ICovCisgICAgICBncm91cEVuZXJneSA9IGZpeE1pbihncm91cEVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRW5lcmd5ID4+IFdJTl9UWVBFX1NDQUxFKTsgLyogZG8gbm90IGFsbG93IGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlciByZWRWYWwgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXdpc2UgKi8KIAotICAgICAgZ3JvdXBFbmVyZ3k+Pj0yOyAvKiAyKldJTl9UWVBFX1NDQUxFID0gNiA9PiA2KzIgPSA4ID09PiA4LzQgPSBpbnQgbnVtYmVyICovCisgICAgICBncm91cEVuZXJneSA+Pj0KKyAgICAgICAgICAyOyAvKiAyKldJTl9UWVBFX1NDQUxFID0gNiA9PiA2KzIgPSA4ID09PiA4LzQgPSBpbnQgbnVtYmVyICovCiAKLSAgICAgIHJlZFZhbFtncm91cENudF0gPSBmTXVsdChmTXVsdCh2YnJRdWFsRmFjdG9yLGNoYW9zTWVhc3VyZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsY0ludkxkRGF0YShDYWxjTGREYXRhKGdyb3VwRW5lcmd5KT4+MikgKQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChpbnQpKCAoIDIgKyAoMipXSU5fVFlQRV9TQ0FMRSkgKyBTQ0FMRV9HUk9VUF9FTkVSR1kgKT4+MiApIDsKLQorICAgICAgcmVkVmFsW2dyb3VwQ250XSA9CisgICAgICAgICAgZk11bHQoZk11bHQodmJyUXVhbEZhY3RvciwgY2hhb3NNZWFzdXJlKSwKKyAgICAgICAgICAgICAgICBDYWxjSW52TGREYXRhKENhbGNMZERhdGEoZ3JvdXBFbmVyZ3kpID4+IDIpKQorICAgICAgICAgIDw8IChpbnQpKCgyICsgKDIgKiBXSU5fVFlQRV9TQ0FMRSkgKyBTQ0FMRV9HUk9VUF9FTkVSR1kpID4+IDIpOwogICAgIH0KICAgfSBlbHNlIHsgLyogbG9uZy1ibG9jayAqLwogCi0gICAgcmVkVmFsWzBdID0gZk11bHQoIGZNdWx0KHZiclF1YWxGYWN0b3IsY2hhb3NNZWFzdXJlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ2FsY0ludkxkRGF0YShDYWxjTGREYXRhKGZyYW1lRW5lcmd5KT4+MikgKQotICAgICAgICAgICAgICAgIDw8IChpbnQpKCBTQ0FMRV9HUk9VUF9FTkVSR1k+PjIgKSA7CisgICAgcmVkVmFsWzBdID0gZk11bHQoZk11bHQodmJyUXVhbEZhY3RvciwgY2hhb3NNZWFzdXJlKSwKKyAgICAgICAgICAgICAgICAgICAgICBDYWxjSW52TGREYXRhKENhbGNMZERhdGEoZnJhbWVFbmVyZ3kpID4+IDIpKQorICAgICAgICAgICAgICAgIDw8IChpbnQpKFNDQUxFX0dST1VQX0VORVJHWSA+PiAyKTsKICAgfQogCi0gIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBxY091dENoYW4gID0gcWNPdXRDaGFubmVsW2NoXTsKLSAgICBwc3lPdXRDaGFuICA9IHBzeU91dENoYW5uZWxbY2hdOworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBxY091dENoYW4gPSBxY091dENoYW5uZWxbY2hdOworICAgIHBzeU91dENoYW4gPSBwc3lPdXRDaGFubmVsW2NoXTsKIAotICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKLSAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspeworICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250OworICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7CisgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBzZmJFbkxkRGF0YSA9IChxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl0pOworICAgICAgICBzZmJUaHJMZERhdGEgPSAocWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXSk7CisgICAgICAgIHNmYlRockV4cCA9IHRockV4cFtjaF1bc2ZiR3JwICsgc2ZiXTsKIAotICAgICAgICBzZmJFbkxkRGF0YSAgPSAocWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSk7Ci0gICAgICAgIHNmYlRockxkRGF0YSA9IChxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSk7Ci0gICAgICAgIHNmYlRockV4cCAgICA9IHRockV4cFtjaF1bc2ZiR3JwK3NmYl07Ci0KLSAgICAgICAgaWYgKCAoc2ZiVGhyTGREYXRhPj1NSU5fTERUSFJFU0gpICYmIChzZmJFbkxkRGF0YSA+IHNmYlRockxkRGF0YSkgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gQUhfQUNUSVZFKSkgewotCisgICAgICAgIGlmICgoc2ZiVGhyTGREYXRhID49IE1JTl9MRFRIUkVTSCkgJiYgKHNmYkVuTGREYXRhID4gc2ZiVGhyTGREYXRhKSAmJgorICAgICAgICAgICAgKGFoRmxhZ1tjaF1bc2ZiR3JwICsgc2ZiXSAhPSBBSF9BQ1RJVkUpKSB7CiAgICAgICAgICAgLyogU2hvcnQtV2luZG93ICovCiAgICAgICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXBOdW1iZXIgPSAoaW50KSBzZmIvcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXA7CisgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXBOdW1iZXIgPSAoaW50KXNmYiAvIHBzeU91dENoYW4tPnNmYlBlckdyb3VwOwogCi0gICAgICAgICAgICBGREtfQVNTRVJUKElOVl9TUVJUNF9UQUJfU0laRT5wc3lPdXRDaGFuLT5ncm91cExlbltncm91cE51bWJlcl0pOworICAgICAgICAgICAgRkRLX0FTU0VSVChJTlZfU1FSVDRfVEFCX1NJWkUgPiBwc3lPdXRDaGFuLT5ncm91cExlbltncm91cE51bWJlcl0pOwogCi0gICAgICAgICAgICBzZmJUaHJFeHAgPSBmTXVsdChzZmJUaHJFeHAsIGZNdWx0KCBGTDJGWENPTlNUX0RCTCgyLjgyZi80LmYpLCBpbnZTcXJ0NFtwc3lPdXRDaGFuLT5ncm91cExlbltncm91cE51bWJlcl1dKSk8PDIgOworICAgICAgICAgICAgc2ZiVGhyRXhwID0KKyAgICAgICAgICAgICAgICBmTXVsdChzZmJUaHJFeHAsCisgICAgICAgICAgICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMi44MmYgLyA0LmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludlNxcnQ0W3BzeU91dENoYW4tPmdyb3VwTGVuW2dyb3VwTnVtYmVyXV0pKQorICAgICAgICAgICAgICAgIDw8IDI7CiAKLSAgICAgICAgICAgIGlmICggc2ZiVGhyRXhwIDw9IChsaW1pdFRoclJlZHVjZWRMZERhdGEtcmVkVmFsW2dyb3VwTnVtYmVyXSkgKSB7Ci0gICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgICAgICAgICAgIGlmIChzZmJUaHJFeHAgPD0gKGxpbWl0VGhyUmVkdWNlZExkRGF0YSAtIHJlZFZhbFtncm91cE51bWJlcl0pKSB7CisgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoKEZJWFBfREJMKXJlZFZhbFtncm91cE51bWJlcl0gPj0KKyAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMGYpIC0gc2ZiVGhyRXhwKQorICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlZHVjdGlvbiBmb3JtdWxhICovCisgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIENhbGNMZERhdGEoc2ZiVGhyRXhwICsgcmVkVmFsW2dyb3VwTnVtYmVyXSk7CisgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA8PD0gMjsKKyAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKChGSVhQX0RCTClyZWRWYWxbZ3JvdXBOdW1iZXJdID49IEZMMkZYQ09OU1RfREJMKDEuMGYpLXNmYlRockV4cCkKLSAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVkdWN0aW9uIGZvcm11bGEgKi8KLSAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IENhbGNMZERhdGEoc2ZiVGhyRXhwICsgcmVkVmFsW2dyb3VwTnVtYmVyXSk7Ci0gICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPDw9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSArPSAoIENhbGNMZEludChwc3lPdXRDaGFuLT5ncm91cExlbltncm91cE51bWJlcl0pIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZJWFBfREJMKTY8PChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpKSApOworICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSArPQorICAgICAgICAgICAgICAgIChDYWxjTGRJbnQocHN5T3V0Q2hhbi0+Z3JvdXBMZW5bZ3JvdXBOdW1iZXJdKSAtCisgICAgICAgICAgICAgICAgICgoRklYUF9EQkwpNiA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCkpKTsKICAgICAgICAgICB9CiAKICAgICAgICAgICAvKiBMb25nLVdpbmRvdyAqLwogICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKChGSVhQX0RCTClyZWRWYWxbMF0gPj0gRkwyRlhDT05TVF9EQkwoMS4wZiktc2ZiVGhyRXhwKSB7CisgICAgICAgICAgICBpZiAoKEZJWFBfREJMKXJlZFZhbFswXSA+PSBGTDJGWENPTlNUX0RCTCgxLjBmKSAtIHNmYlRockV4cCkgewogICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWR1Y3Rpb24gZm9ybXVsYSAqLwogICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gQ2FsY0xkRGF0YShzZmJUaHJFeHAgKyByZWRWYWxbMF0pOwogICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhIDw8PSAyOwpAQCAtMTEyOSwyNyArMTI4OCwzMyBAQAogICAgICAgICAgIH0KIAogICAgICAgICAgIC8qIGF2b2lkIGhvbGVzICovCi0gICAgICAgICAgaWYgKCAoKHNmYlRoclJlZHVjZWRMZERhdGEgLSBzZmJFbkxkRGF0YSkgPiBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSApCi0gICAgICAgICAgICAgICAgICAmJiAoYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSAhPSBOT19BSCkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSAgPiAoRkwyRlhDT05TVF9EQkwoLTEuMGYpIC0gc2ZiRW5MZERhdGEpICl7Ci0gICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBmaXhNYXgoKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICsgc2ZiRW5MZERhdGEpLCBzZmJUaHJMZERhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhOwotICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0FDVElWRTsKKyAgICAgICAgICBpZiAoKChzZmJUaHJSZWR1Y2VkTGREYXRhIC0gc2ZiRW5MZERhdGEpID4KKyAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0pICYmCisgICAgICAgICAgICAgIChhaEZsYWdbY2hdW3NmYkdycCArIHNmYl0gIT0gTk9fQUgpKSB7CisgICAgICAgICAgICBpZiAocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSA+CisgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKC0xLjBmKSAtIHNmYkVuTGREYXRhKSkgeworICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KAorICAgICAgICAgICAgICAgICAgKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gKyBzZmJFbkxkRGF0YSksCisgICAgICAgICAgICAgICAgICBzZmJUaHJMZERhdGEpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGE7CisgICAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCArIHNmYl0gPSBBSF9BQ1RJVkU7CiAgICAgICAgICAgfQogCi0gICAgICAgICAgaWYgKHNmYlRoclJlZHVjZWRMZERhdGE8RkwyRlhDT05TVF9EQkwoLTAuNWYpKQotICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0xLmYpOworICAgICAgICAgIGlmIChzZmJUaHJSZWR1Y2VkTGREYXRhIDwgRkwyRlhDT05TVF9EQkwoLTAuNWYpKQorICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0xLmYpOwogCiAgICAgICAgICAgLyogbWluaW11bSBvZiAyOSBkQiBSYXRpbyBmb3IgVGhyZXNob2xkcyAqLwotICAgICAgICAgIGlmICgoc2ZiRW5MZERhdGErRkwyRlhDT05TVF9EQkwoMS4wZikpID4gRkwyRlhDT05TVF9EQkwoOS42MzM2MjA2L0xEX0RBVEFfU0NBTElORykpewotICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heChzZmJUaHJSZWR1Y2VkTGREYXRhLCBzZmJFbkxkRGF0YSAtIEZMMkZYQ09OU1RfREJMKDkuNjMzNjIwNi9MRF9EQVRBX1NDQUxJTkcpKTsKKyAgICAgICAgICBpZiAoKHNmYkVuTGREYXRhICsgRkwyRlhDT05TVF9EQkwoMS4wZikpID4KKyAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoOS42MzM2MjA2IC8gTERfREFUQV9TQ0FMSU5HKSkgeworICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heCgKKyAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhLAorICAgICAgICAgICAgICAgIHNmYkVuTGREYXRhIC0gRkwyRlhDT05TVF9EQkwoOS42MzM2MjA2IC8gTERfREFUQV9TQ0FMSU5HKSk7CiAgICAgICAgICAgfQogCi0gICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heChNSU5fTERUSFJFU0gsc2ZiVGhyUmVkdWNlZExkRGF0YSk7CisgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heChNSU5fTERUSFJFU0gsIHNmYlRoclJlZHVjZWRMZERhdGEpOwogCi0gICAgICAgICAgcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBzZmJUaHJSZWR1Y2VkTGREYXRhOworICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCArIHNmYl0gPSBzZmJUaHJSZWR1Y2VkTGREYXRhOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMTE1OCwxNzQgKzEzMjMsMTk3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY29ycmVjdFRocmVzaAotZGVzY3JpcHRpb246ICBpZiBwZSBkaWZmZXJlbmNlIGRlbHRhUGUgYmV0d2VlbiBkZXNpcmVkIHBlIGFuZCByZWFsIHBlIGlzIHNtYWxsIGVub3VnaCwKLXRoZSBkaWZmZXJlbmNlIGNhbiBiZSBkaXN0cmlidXRlZCBhbW9uZyB0aGUgc2NhbGUgZmFjdG9yIGJhbmRzLgotTmV3IHRocmVzaG9sZHMgY2FuIGJlIGRlcml2ZWQgZnJvbSB0aGlzIHBlLWRpZmZlcmVuY2UKK2Rlc2NyaXB0aW9uOiAgaWYgcGUgZGlmZmVyZW5jZSBkZWx0YVBlIGJldHdlZW4gZGVzaXJlZCBwZSBhbmQgcmVhbCBwZSBpcyBzbWFsbAorZW5vdWdoLCB0aGUgZGlmZmVyZW5jZSBjYW4gYmUgZGlzdHJpYnV0ZWQgYW1vbmcgdGhlIHNjYWxlIGZhY3RvciBiYW5kcy4gTmV3Cit0aHJlc2hvbGRzIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhpcyBwZS1kaWZmZXJlbmNlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKENIQU5ORUxfTUFQUElORyogY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNFbGVtZW50Wyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgIGFoRmxhZ1soOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICB0aHJFeHBbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgRklYUF9EQkwgcmVkVmFsWyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgU0NIQVIgcmVkVmFsU2NhbGluZ1soOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBkZWx0YVBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBwcm9jZXNzRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIGVsZW1lbnRPZmZzZXQpCi17Ci0gICBJTlQgY2gsIHNmYiwgc2ZiR3JwOwotICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbjsKLSAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbjsKLSAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YTsKLSAgIEZJWFBfREJMIHRockZhY3RvckxkRGF0YTsKLSAgIEZJWFBfREJMIHNmYkVuTGREYXRhLCBzZmJUaHJMZERhdGEsIHNmYlRoclJlZHVjZWRMZERhdGE7Ci0gICBGSVhQX0RCTCAqc2ZiUGVGYWN0b3JzTGREYXRhWyg4KV1bKDIpXTsKLSAgIEZJWFBfREJMIHNmYk5BY3RpdmVMaW5lc0xkRGF0YVsoOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKLSAgIElOVCAgICAgIG5vcm1GYWN0b3JJbnQ7Ci0gICBGSVhQX0RCTCBub3JtRmFjdG9yTGREYXRhOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2goCisgICAgY29uc3QgQ0hBTk5FTF9NQVBQSU5HICpjb25zdCBjbSwgUUNfT1VUX0VMRU1FTlQgKmNvbnN0IHFjRWxlbWVudFsoKDgpKV0sCisgICAgY29uc3QgUFNZX09VVF9FTEVNRU5UICpjb25zdCBwc3lPdXRFbGVtZW50WygoOCkpXSwKKyAgICBVQ0hBUiBhaEZsYWdbKCg4KSldWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKKyAgICBjb25zdCBGSVhQX0RCTCB0aHJFeHBbKCg4KSldWygyKV1bTUFYX0dST1VQRURfU0ZCXSwgY29uc3QgRklYUF9EQkwgcmVkVmFsX20sCisgICAgY29uc3QgU0NIQVIgcmVkVmFsX2UsIGNvbnN0IElOVCBkZWx0YVBlLCBjb25zdCBJTlQgcHJvY2Vzc0VsZW1lbnRzLAorICAgIGNvbnN0IElOVCBlbGVtZW50T2Zmc2V0KSB7CisgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CisgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW47CisgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbjsKKyAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhOworICBGSVhQX0RCTCB0aHJGYWN0b3JMZERhdGE7CisgIEZJWFBfREJMIHNmYkVuTGREYXRhLCBzZmJUaHJMZERhdGEsIHNmYlRoclJlZHVjZWRMZERhdGE7CisgIEZJWFBfREJMICpzZmJQZUZhY3RvcnNMZERhdGFbKCg4KSldWygyKV07CisgIEZJWFBfREJMKCpzZmJOQWN0aXZlTGluZXNMZERhdGEpWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKIAotICAgSU5UIG5FbGVtZW50cyA9IGVsZW1lbnRPZmZzZXQrcHJvY2Vzc0VsZW1lbnRzOwotICAgSU5UIGVsZW1lbnRJZDsKKyAgSU5UIG5vcm1GYWN0b3JJbnQ7CisgIEZJWFBfREJMIG5vcm1GYWN0b3JMZERhdGE7CiAKLSAgIC8qIHNjcmF0Y2ggaXMgZW1wdHk7IHVzZSB0ZW1wb3JhbCBtZW1vcnkgZnJvbSBxdWFudFNwZWMgaW4gUUNfT1VUX0NIQU5ORUwgKi8KLSAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7Ci0gICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewotICAgICAgIFNIT1JUKiBwdHIgPSBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXS0+cXVhbnRTcGVjOwotICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXSA9IChGSVhQX0RCTCopcHRyOwotICAgICB9Ci0gICB9CisgIElOVCBuRWxlbWVudHMgPSBlbGVtZW50T2Zmc2V0ICsgcHJvY2Vzc0VsZW1lbnRzOworICBJTlQgZWxlbWVudElkOwogCi0gICAvKiBmb3IgZWFjaCBzZmIgY2FsYyByZWxhdGl2ZSBmYWN0b3JzIGZvciBwZSBjaGFuZ2VzICovCi0gICBub3JtRmFjdG9ySW50ID0gMDsKKyAgLyogc2NyYXRjaCBpcyBlbXB0eTsgdXNlIHRlbXBvcmFsIG1lbW9yeSBmcm9tIHF1YW50U3BlYyBpbiBRQ19PVVRfQ0hBTk5FTCAqLworICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7IGVsZW1lbnRJZCA8IG5FbGVtZW50czsgZWxlbWVudElkKyspIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgLyogVGhlIHJlaW50ZXJwcmV0X2Nhc3QgaXMgdXNlZCB0byBzdXBwcmVzcyBhIGNvbXBpbGVyIHdhcm5pbmcuIFdlIGtub3cKKyAgICAgICAqIHRoYXQgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF0tPnF1YW50U3BlYyBpcyBzdWZmaWNpZW50bHkKKyAgICAgICAqIGFsaWduZWQsIHNvIHRoZSBjYXN0IGlzIHNhZmUgKi8KKyAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXSA9CisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxGSVhQX0RCTCAqPihyZWludGVycHJldF9jYXN0PHZvaWQgKj4oCisgICAgICAgICAgICAgIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdLT5xdWFudFNwZWMpKTsKKyAgICB9CisgIH0KKyAgLyogVGhlIHJlaW50ZXJwcmV0X2Nhc3QgaXMgdXNlZCB0byBzdXBwcmVzcyBhIGNvbXBpbGVyIHdhcm5pbmcuIFdlIGtub3cgdGhhdAorICAgKiBxY0VsZW1lbnRbMF0tPmR5bk1lbV9TZmJOQWN0aXZlTGluZXNMZERhdGEgaXMgc3VmZmljaWVudGx5IGFsaWduZWQsIHNvIHRoZQorICAgKiBjYXN0IGlzIHNhZmUgKi8KKyAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhID0gcmVpbnRlcnByZXRfY2FzdDxGSVhQX0RCTCgqKVsoMildW01BWF9HUk9VUEVEX1NGQl0+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KHFjRWxlbWVudFswXS0+ZHluTWVtX1NmYk5BY3RpdmVMaW5lc0xkRGF0YSkpOwogCi0gICBmb3IoZWxlbWVudElkPWVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewotICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgLyogZm9yIGVhY2ggc2ZiIGNhbGMgcmVsYXRpdmUgZmFjdG9ycyBmb3IgcGUgY2hhbmdlcyAqLworICBub3JtRmFjdG9ySW50ID0gMDsKIAotICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7IGVsZW1lbnRJZCA8IG5FbGVtZW50czsgZWxlbWVudElkKyspIHsKKyAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICAgIHBzeU91dENoYW4gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdOworICAgICAgICBwZUNoYW5EYXRhID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGEucGVDaGFubmVsRGF0YVtjaF07CiAKLSAgICAgICAgICBxY091dENoYW4gPSBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXTsKLSAgICAgICAgICBwc3lPdXRDaGFuID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXTsKLSAgICAgICAgICBwZUNoYW5EYXRhID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGEucGVDaGFubmVsRGF0YVtjaF07CisgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250OworICAgICAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgeworICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAgICBpZiAocGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCArIHNmYl0gPT0gMCkgeworICAgICAgICAgICAgICBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBCb3RoIENhbGNMZEludCBhbmQgQ2FsY0xkRGF0YSBjYW4gYmUgdXNlZCEKKyAgICAgICAgICAgICAgICogTm8gb2Zmc2V0IGhhcyB0byBiZSBzdWJ0cmFjdGVkLCBiZWNhdXNlIHNmYk5BY3RpdmVMaW5lc0xkRGF0YQorICAgICAgICAgICAgICAgKiBpcyBzaG9ydGVkIHdoaWxlIHRockZhY3RvciBjYWxjdWxhdGlvbiAqLworICAgICAgICAgICAgICBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgICAgICBDYWxjTGRJbnQocGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCArIHNmYl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgoYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gPCBBSF9BQ1RJVkUpIHx8CisgICAgICAgICAgICAgICAgIChkZWx0YVBlID4gMCkpICYmCisgICAgICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCArIHNmYl0gIT0gMCkgeworICAgICAgICAgICAgICBpZiAodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gPiAtcmVkVmFsX20pIHsKKyAgICAgICAgICAgICAgICAvKiBzZmJQZUZhY3RvcnNbY2hdW3NmYkdycCtzZmJdID0KKyAgICAgICAgICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aHJFeHBbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gKworICAgICAgICAgICAgICAgICAgIHJlZFZhbFtlbGVtZW50SWRdKTsgKi8KIAotICAgICAgICAgIGZvcihzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKLSAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgbWluU2NhbGUgPQorICAgICAgICAgICAgICAgICAgICBmaXhNaW4oCisgICAgICAgICAgICAgICAgICAgICAgICBDb3VudExlYWRpbmdCaXRzKHRockV4cFtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvdW50TGVhZGluZ0JpdHMocmVkVmFsX20pIC0gcmVkVmFsX2UpIC0KKyAgICAgICAgICAgICAgICAgICAgMTsKIAotICAgICAgICAgICAgIGlmICggcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBCb3RoIENhbGNMZEludCBhbmQgQ2FsY0xkRGF0YSBjYW4gYmUgdXNlZCEKLSAgICAgICAgICAgICAgICAgKiBObyBvZmZzZXQgaGFzIHRvIGJlIHN1YnRyYWN0ZWQsIGJlY2F1c2Ugc2ZiTkFjdGl2ZUxpbmVzTGREYXRhCi0gICAgICAgICAgICAgICAgICogaXMgc2hvcnRlZCB3aGlsZSB0aHJGYWN0b3IgY2FsY3VsYXRpb24gKi8KLSAgICAgICAgICAgICAgICBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBDYWxjTGRJbnQocGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKCAoKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA8IEFIX0FDVElWRSkgfHwgKGRlbHRhUGUgPiAwKSkgJiYKLSAgICAgICAgICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gIT0gMCApCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0aHJFeHBbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPiAtcmVkVmFsW2VsZW1lbnRJZF0pIHsKKyAgICAgICAgICAgICAgICAvKiBzdW1sZCA9IGxkNjQoIHNmYlRockV4cCArIHJlZFZhbCApICovCisgICAgICAgICAgICAgICAgRklYUF9EQkwgc3VtTGQgPQorICAgICAgICAgICAgICAgICAgICBDYWxjTGREYXRhKHNjYWxlVmFsdWUodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TY2FsZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUocmVkVmFsX20sIHJlZFZhbF9lICsgbWluU2NhbGUpKSAtCisgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkobWluU2NhbGUgPDwgKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQpKTsKIAotICAgICAgICAgICAgICAgICAgIC8qIHNmYlBlRmFjdG9yc1tjaF1bc2ZiR3JwK3NmYl0gPSBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aHJFeHBbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gKyByZWRWYWxbZWxlbWVudElkXSk7ICovCi0KLSAgICAgICAgICAgICAgICAgICBpbnQgbWluU2NhbGUgPSBmaXhNaW4oQ291bnRMZWFkaW5nQml0cyh0aHJFeHBbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0pLCBDb3VudExlYWRpbmdCaXRzKHJlZFZhbFtlbGVtZW50SWRdKSAtIChERlJBQ1RfQklUUy0xLXJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSkgKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAvKiBzdW1sZCA9IGxkNjQoIHNmYlRockV4cCArIHJlZFZhbCApICovCi0gICAgICAgICAgICAgICAgICAgRklYUF9EQkwgc3VtTGQgPSBDYWxjTGREYXRhKHNjYWxlVmFsdWUodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdLCBtaW5TY2FsZSkgKyBzY2FsZVZhbHVlKHJlZFZhbFtlbGVtZW50SWRdLCAoREZSQUNUX0JJVFMtMS1yZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0pK21pblNjYWxlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoRklYUF9EQkwpKG1pblNjYWxlPDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSk7Ci0KLSAgICAgICAgICAgICAgICAgICBpZiAoc3VtTGQgPCBGTDJGWENPTlNUX0RCTCgwLmYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdIC0gc3VtTGQ7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgaWYgKCBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPiAoRkwyRlhDT05TVF9EQkwoLTEuZikgKyBzdW1MZCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAtIHN1bUxkOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgIG5vcm1GYWN0b3JJbnQgKz0gKElOVClDYWxjSW52TGREYXRhKHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSk7CisgICAgICAgICAgICAgICAgaWYgKHN1bUxkIDwgRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICAgICAgICAgIHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdIC0KKyAgICAgICAgICAgICAgICAgICAgICBzdW1MZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgaWYgKHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdID4KKyAgICAgICAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoLTEuZikgKyBzdW1MZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgc3VtTGQ7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXTsKKyAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBGTDJGWENPTlNUX0RCTCgxLjBmKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZWxzZSBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBub3JtRmFjdG9ySW50ICs9IChJTlQpQ2FsY0ludkxkRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0pOworICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMGYpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0gICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KIAotICAgLyogbm9ybUZhY3RvckxkRGF0YSA9IGxkNjQoZGVsdGFQZS9ub3JtRmFjdG9ySW50KSAqLwotICAgbm9ybUZhY3RvckxkRGF0YSA9IENhbGNMZERhdGEoKEZJWFBfREJMKSgoZGVsdGFQZTwwKSA/ICgtZGVsdGFQZSkgOiAoZGVsdGFQZSkpKSAtIENhbGNMZERhdGEoKEZJWFBfREJMKW5vcm1GYWN0b3JJbnQpOworICAvKiBub3JtRmFjdG9yTGREYXRhID0gbGQ2NChkZWx0YVBlL25vcm1GYWN0b3JJbnQpICovCisgIG5vcm1GYWN0b3JMZERhdGEgPQorICAgICAgQ2FsY0xkRGF0YSgoRklYUF9EQkwpKChkZWx0YVBlIDwgMCkgPyAoLWRlbHRhUGUpIDogKGRlbHRhUGUpKSkgLQorICAgICAgQ2FsY0xkRGF0YSgoRklYUF9EQkwpbm9ybUZhY3RvckludCk7CiAKLSAgIC8qIGRpc3RyaWJ1dGUgdGhlIHBlIGRpZmZlcmVuY2UgdG8gdGhlIHNjYWxlZmFjdG9ycwotICAgICAgYW5kIGNhbGN1bGF0ZSB0aGUgYWNjb3JkaW5nIHRocmVzaG9sZHMgKi8KLSAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7Ci0gICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgeworICAvKiBkaXN0cmlidXRlIHRoZSBwZSBkaWZmZXJlbmNlIHRvIHRoZSBzY2FsZWZhY3RvcnMKKyAgICAgYW5kIGNhbGN1bGF0ZSB0aGUgYWNjb3JkaW5nIHRocmVzaG9sZHMgKi8KKyAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CisgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICBxY091dENoYW4gPSBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXTsKKyAgICAgICAgcHN5T3V0Q2hhbiA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF07CisgICAgICAgIHBlQ2hhbkRhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YS5wZUNoYW5uZWxEYXRhW2NoXTsKIAotICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewotICAgICAgICAgIHFjT3V0Q2hhbiA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOwotICAgICAgICAgIHBzeU91dENoYW4gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdOwotICAgICAgICAgIHBlQ2hhbkRhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YS5wZUNoYW5uZWxEYXRhW2NoXTsKKyAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7CisgICAgICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7CisgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICAgIGlmIChwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwICsgc2ZiXSA+IDApIHsKKyAgICAgICAgICAgICAgLyogcGUgZGlmZmVyZW5jZSBmb3IgdGhpcyBzZmIgKi8KKyAgICAgICAgICAgICAgaWYgKChzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSA9PQorICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKC0xLjBmKSkgfHwKKyAgICAgICAgICAgICAgICAgIChkZWx0YVBlID09IDApKSB7CisgICAgICAgICAgICAgICAgdGhyRmFjdG9yTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBuZXcgdGhyZXNob2xkICovCisgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wID0gQ2FsY0ludkxkRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gKworICAgICAgICAgICAgICAgICAgICBub3JtRmFjdG9yTGREYXRhIC0KKyAgICAgICAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gLQorICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgoZmxvYXQpTERfREFUQV9TSElGVCAvIExEX0RBVEFfU0NBTElORykpOwogCi0gICAgICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKLSAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLQotICAgICAgICAgICAgICBpZiAocGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID4gMCkgewotCi0gICAgICAgICAgICAgICAgIC8qIHBlIGRpZmZlcmVuY2UgZm9yIHRoaXMgc2ZiICovCi0gICAgICAgICAgICAgICAgIGlmICggKHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXT09RkwyRlhDT05TVF9EQkwoLTEuMGYpKSB8fAotICAgICAgICAgICAgICAgICAgICAgIChkZWx0YVBlPT0wKSApCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICB0aHJGYWN0b3JMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgIC8qIG5ldyB0aHJlc2hvbGQgKi8KLSAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0bXAgPSBDYWxjSW52TGREYXRhKHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSArIG5vcm1GYWN0b3JMZERhdGEgLSBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gLSBGTDJGWENPTlNUX0RCTCgoZmxvYXQpTERfREFUQV9TSElGVC9MRF9EQVRBX1NDQUxJTkcpKTsKLQotICAgICAgICAgICAgICAgICAgIC8qIGxpbWl0IHRockZhY3RvciB0byA2MGRCICovCi0gICAgICAgICAgICAgICAgICAgdG1wID0gKGRlbHRhUGU8MCkgPyB0bXAgOiAoLXRtcCk7Ci0gICAgICAgICAgICAgICAgICAgdGhyRmFjdG9yTGREYXRhID0gRkRLbWluKHRtcCwgRkwyRlhDT05TVF9EQkwoMjAuZi9MRF9EQVRBX1NDQUxJTkcpKTsKLSAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgIC8qIG5ldyB0aHJlc2hvbGQgKi8KLSAgICAgICAgICAgICAgICAgc2ZiVGhyTGREYXRhID0gcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgICAgICAgIHNmYkVuTGREYXRhICA9IHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07Ci0KLSAgICAgICAgICAgICAgICAgaWYgKHRockZhY3RvckxkRGF0YSA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKLSAgICAgICAgICAgICAgICAgICBpZiggc2ZiVGhyTGREYXRhID4gKEZMMkZYQ09OU1RfREJMKC0xLmYpLXRockZhY3RvckxkRGF0YSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhICsgdGhyRmFjdG9yTGREYXRhOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgtMS5mKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YSArIHRockZhY3RvckxkRGF0YTsKLSAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgIC8qIGF2b2lkIGhvbGUgKi8KLSAgICAgICAgICAgICAgICAgaWYgKCAoc2ZiVGhyUmVkdWNlZExkRGF0YSAtIHNmYkVuTGREYXRhID4gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0pICYmCi0gICAgICAgICAgICAgICAgICAgICAgKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9PSBBSF9JTkFDVElWRSkgKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHNmYlRoclJlZHVjZWQgPSBtYXgocHN5T3V0Q2hhbltjaF0tPnNmYk1pblNucltpXSAqIHNmYkVuLCBzZmJUaHIpOyAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoIHNmYkVuTGREYXRhID4gKHNmYlRockxkRGF0YS1xY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKyBzZmJFbkxkRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gQUhfQUNUSVZFOwotICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBzZmJUaHJSZWR1Y2VkTGREYXRhOworICAgICAgICAgICAgICAgIC8qIGxpbWl0IHRockZhY3RvciB0byA2MGRCICovCisgICAgICAgICAgICAgICAgdG1wID0gKGRlbHRhUGUgPCAwKSA/IHRtcCA6ICgtdG1wKTsKKyAgICAgICAgICAgICAgICB0aHJGYWN0b3JMZERhdGEgPQorICAgICAgICAgICAgICAgICAgICBmTWluKHRtcCwgRkwyRlhDT05TVF9EQkwoMjAuZiAvIExEX0RBVEFfU0NBTElORykpOwogICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogbmV3IHRocmVzaG9sZCAqLworICAgICAgICAgICAgICBzZmJUaHJMZERhdGEgPSBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnAgKyBzZmJdOworICAgICAgICAgICAgICBzZmJFbkxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXTsKKworICAgICAgICAgICAgICBpZiAodGhyRmFjdG9yTGREYXRhIDwgRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgICAgICAgICAgIGlmIChzZmJUaHJMZERhdGEgPiAoRkwyRlhDT05TVF9EQkwoLTEuZikgLSB0aHJGYWN0b3JMZERhdGEpKSB7CisgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhICsgdGhyRmFjdG9yTGREYXRhOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoLTEuZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGEgKyB0aHJGYWN0b3JMZERhdGE7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBhdm9pZCBob2xlICovCisgICAgICAgICAgICAgIGlmICgoc2ZiVGhyUmVkdWNlZExkRGF0YSAtIHNmYkVuTGREYXRhID4KKyAgICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdKSAmJgorICAgICAgICAgICAgICAgICAgKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdID09IEFIX0lOQUNUSVZFKSkgeworICAgICAgICAgICAgICAgIC8qIHNmYlRoclJlZHVjZWQgPSBtYXgocHN5T3V0Q2hhbltjaF0tPnNmYk1pblNucltpXSAqIHNmYkVuLAorICAgICAgICAgICAgICAgICAqIHNmYlRocik7ICovCisgICAgICAgICAgICAgICAgaWYgKHNmYkVuTGREYXRhID4KKyAgICAgICAgICAgICAgICAgICAgKHNmYlRockxkRGF0YSAtIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0pKSB7CisgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdICsgc2ZiRW5MZERhdGE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdID0gQUhfQUNUSVZFOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXSA9IHNmYlRoclJlZHVjZWRMZERhdGE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTMzMyw2MjggKzE1MjEsNjg4IEBACiAgICAgZGVzY3JpcHRpb246ICBpZiB0aGUgZGVzaXJlZCBwZSBjYW4gbm90IGJlIHJlYWNoZWQsIHJlZHVjZSBwZSBieQogICAgICAgICAgICAgICAgICAgcmVkdWNpbmcgbWluU25yCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRkRLYWFjRW5jX3JlZHVjZU1pblNucihDSEFOTkVMX01BUFBJTkcqIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNFbGVtZW50Wyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50Wyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICBhaEZsYWdbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBJTlQgZGVzaXJlZFBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogICAgICAgICAgICAgcmVkUGVHbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBJTlQgcHJvY2Vzc0VsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIGVsZW1lbnRPZmZzZXQpCitzdGF0aWMgdm9pZCBGREthYWNFbmNfcmVkdWNlTWluU25yKAorICAgIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY29uc3QgY20sIFFDX09VVF9FTEVNRU5UICpjb25zdCBxY0VsZW1lbnRbKCg4KSldLAorICAgIGNvbnN0IFBTWV9PVVRfRUxFTUVOVCAqY29uc3QgcHN5T3V0RWxlbWVudFsoKDgpKV0sCisgICAgY29uc3QgVUNIQVIgYWhGbGFnWygoOCkpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sIGNvbnN0IElOVCBkZXNpcmVkUGUsCisgICAgSU5UICpjb25zdCByZWRQZUdsb2JhbCwgY29uc3QgSU5UIHByb2Nlc3NFbGVtZW50cywgY29uc3QgSU5UIGVsZW1lbnRPZmZzZXQpCiAKIHsKLSAgIElOVCBlbGVtZW50SWQ7Ci0gICBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCtwcm9jZXNzRWxlbWVudHM7CisgIElOVCBjaCwgZWxlbWVudElkLCBnbG9iYWxNYXhTZmIgPSAwOworICBjb25zdCBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCArIHByb2Nlc3NFbGVtZW50czsKKyAgSU5UIG5ld0dsb2JhbFBlID0gKnJlZFBlR2xvYmFsOwogCi0gICBJTlQgbmV3R2xvYmFsUGUgPSAqcmVkUGVHbG9iYWw7CisgIGlmIChuZXdHbG9iYWxQZSA8PSBkZXNpcmVkUGUpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KIAotICAgZm9yKGVsZW1lbnRJZD1lbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKLSAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7Ci0gICAgICAgSU5UIGNoOwotICAgICAgIElOVCBtYXhTZmJQZXJHcm91cFsyXTsKLSAgICAgICBJTlQgc2ZiQ250WzJdOwotICAgICAgIElOVCBzZmJQZXJHcm91cFsyXTsKKyAgLyogZ2xvYmFsIG1heGltdW0gb2YgbWF4U2ZiUGVyR3JvdXAgKi8KKyAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CisgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICBnbG9iYWxNYXhTZmIgPQorICAgICAgICAgICAgZk1heChnbG9iYWxNYXhTZmIsCisgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewotICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAtMTsKLSAgICAgICAgIHNmYkNudFtjaF0gICAgICAgICA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKLSAgICAgICAgIHNmYlBlckdyb3VwW2NoXSAgICA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOwotICAgICAgIH0KKyAgLyogYXMgbG9uZyBhcyBnbG9iYWxQRSBpcyBhYm92ZSBkZXNpcmVQRSByZWR1Y2UgU05SIHRvIDEuMCBkQiwgc3RhcnRpbmcgYXQKKyAgICogaGlnaGVzdCBTRkIgKi8KKyAgd2hpbGUgKChuZXdHbG9iYWxQZSA+IGRlc2lyZWRQZSkgJiYgKC0tZ2xvYmFsTWF4U2ZiID49IDApKSB7CisgICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CisgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAgICAgUEVfREFUQSAqcGVEYXRhID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGE7CiAKLSAgICAgICBQRV9EQVRBICpwZURhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFuID0gcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF07CisgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0KKyAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXTsKIAotICAgICAgIGRvCi0gICAgICAgewotICAgICAgICAgZm9yKGNoPTA7IGNoPGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICAgICAgLyogdHJ5IHRvIHJlZHVjZSBTTlIgb2YgY2hhbm5lbCdzIHVwcGVybW9zdCBTRkIocykgKi8KKyAgICAgICAgICBpZiAoZ2xvYmFsTWF4U2ZiIDwgcHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXApIHsKKyAgICAgICAgICAgIElOVCBzZmIsIGRlbHRhUGUgPSAwOwogCi0gICAgICAgICAgICBJTlQgc2ZiLCBzZmJHcnA7Ci0gICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbiA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOwotICAgICAgICAgICAgSU5UIG5vUmVkdWN0aW9uID0gMTsKKyAgICAgICAgICAgIGZvciAoc2ZiID0gZ2xvYmFsTWF4U2ZiOyBzZmIgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7CisgICAgICAgICAgICAgICAgIHNmYiArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgeworICAgICAgICAgICAgICBpZiAoYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYl0gIT0gTk9fQUggJiYKKyAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYl0gPCBTbnJMZEZhYyAmJgorICAgICAgICAgICAgICAgICAgKHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiXSA+CisgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiXSAtIFNuckxkRmFjKSkgeworICAgICAgICAgICAgICAgIC8qIGluY3JlYXNlIHRocmVzaG9sZCB0byBuZXcgbWluU25yIG9mIDFkQiAqLworICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYl0gPSBTbnJMZEZhYzsKKyAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJdID0KKyAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJdICsgU25yTGRGYWM7CiAKLSAgICAgICAgICAgIGlmIChtYXhTZmJQZXJHcm91cFtjaF0+PTApIHsgIC8qIHNmYiBpbiBuZXh0IGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgSU5UIGRlbHRhUGUgPSAwOwotICAgICAgICAgICAgICBzZmIgPSBtYXhTZmJQZXJHcm91cFtjaF0tLTsKLSAgICAgICAgICAgICAgbm9SZWR1Y3Rpb24gPSAwOworICAgICAgICAgICAgICAgIC8qIGNhbGMgbmV3IHBlICovCisgICAgICAgICAgICAgICAgLyogQzIgKyBDMypsZCgxLzAuOCkgPSAxLjUgKi8KKyAgICAgICAgICAgICAgICBkZWx0YVBlIC09IHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiXTsKIAotICAgICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHNmYkNudFtjaF07IHNmYkdycCArPSBzZmJQZXJHcm91cFtjaF0pIHsKLQotICAgICAgICAgICAgICAgIGlmIChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUggJiYKLSAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPCBTbnJMZEZhYykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBpbmNyZWFzZSB0aHJlc2hvbGQgdG8gbmV3IG1pblNuciBvZiAxZEIgKi8KLSAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gU25yTGRGYWM7Ci0KLSAgICAgICAgICAgICAgICAgIC8qIHNmYlRoclJlZHVjZWQgPSBtYXgocHN5T3V0Q2hhbltjaF0tPnNmYk1pblNucltpXSAqIHNmYkVuLCBzZmJUaHIpOyAqLwotICAgICAgICAgICAgICAgICAgaWYgKCBxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdID49IHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdIC0gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gcWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSArIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdOwotCi0gICAgICAgICAgICAgICAgICAgICAvKiBjYWxjIG5ldyBwZSAqLwotICAgICAgICAgICAgICAgICAgICAgLyogQzIgKyBDMypsZCgxLzAuOCkgPSAxLjUgKi8KLSAgICAgICAgICAgICAgICAgICAgIGRlbHRhUGUgLT0gKHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiR3JwK3NmYl0+PlBFX0NPTlNUUEFSVF9TSElGVCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgIC8qIHNmYlBlID0gMS41ICogc2ZiTkxpbmVzICovCi0gICAgICAgICAgICAgICAgICAgICBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYkdycCtzZmJdID0gKDMqcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJOTGluZXNbc2ZiR3JwK3NmYl0pIDw8IChQRV9DT05TVFBBUlRfU0hJRlQtMSk7Ci0gICAgICAgICAgICAgICAgICAgICBkZWx0YVBlICs9IChwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYkdycCtzZmJdPj5QRV9DT05TVFBBUlRfU0hJRlQpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgfSAvKiBzZmJHcnAgbG9vcCAqLwotCi0gICAgICAgICAgICAgIHBlRGF0YS0+cGUgKz0gZGVsdGFQZTsKLSAgICAgICAgICAgICAgcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5wZSArPSBkZWx0YVBlOwotICAgICAgICAgICAgICBuZXdHbG9iYWxQZSArPSBkZWx0YVBlOwotCi0gICAgICAgICAgICAgIC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCi0gICAgICAgICAgICAgIGlmIChwZURhdGEtPnBlIDw9IGRlc2lyZWRQZSkgewotICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgICAvKiBzZmJQZSA9IDEuNSAqIHNmYk5MaW5lcyAqLworICAgICAgICAgICAgICAgIHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiXSA9CisgICAgICAgICAgICAgICAgICAgICgzICogcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJOTGluZXNbc2ZiXSkKKyAgICAgICAgICAgICAgICAgICAgPDwgKFBFX0NPTlNUUEFSVF9TSElGVCAtIDEpOworICAgICAgICAgICAgICAgIGRlbHRhUGUgKz0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJdOwogICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIH0gLyogc2ZiID4gMCAqLworICAgICAgICAgICAgfSAvKiBzZmIgbG9vcCAqLwogCi0gICAgICAgICAgICBpZiAoIChjaD09KGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsLTEpKSAmJiBub1JlZHVjdGlvbiApIHsKLSAgICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsdGFQZSA+Pj0gUEVfQ09OU1RQQVJUX1NISUZUOworICAgICAgICAgICAgcGVEYXRhLT5wZSArPSBkZWx0YVBlOworICAgICAgICAgICAgcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5wZSArPSBkZWx0YVBlOworICAgICAgICAgICAgbmV3R2xvYmFsUGUgKz0gZGVsdGFQZTsKIAotICAgICAgICAgfSAvKiBjaCBsb29wICovCisgICAgICAgICAgfSAvKiBpZiBnbG9iYWxNYXhTZmIgPCBtYXhTZmJQZXJHcm91cCAqLwogCi0gICAgICAgfSB3aGlsZSAoIHBlRGF0YS0+cGUgPiBkZXNpcmVkUGUpOworICAgICAgICAgIC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCisgICAgICAgICAgaWYgKG5ld0dsb2JhbFBlIDw9IGRlc2lyZWRQZSkgeworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIH0KIAotICAgICB9IC8qICE9IElEX0RTRSAqLwotICAgfSAvKiBlbGVtZW50IGxvb3AgKi8KLQorICAgICAgICB9IC8qIGNoIGxvb3AgKi8KKyAgICAgIH0gICAvKiAhPSBJRF9EU0UgKi8KKyAgICB9ICAgICAvKiBlbGVtZW50SWQgbG9vcCAqLworICB9ICAgICAgIC8qIHdoaWxlICggbmV3R2xvYmFsUGUgPiBkZXNpcmVkUGUpICYmICgtLWdsb2JhbE1heFNmYiA+PSAwKSApICovCiAKIGJhaWw6Ci0gICAvKiB1cGRhdGUgZ2xvYmFsIFBFICovCi0gICAqcmVkUGVHbG9iYWwgPSBuZXdHbG9iYWxQZTsKKyAgLyogdXBkYXRlIGdsb2JhbCBQRSAqLworICAqcmVkUGVHbG9iYWwgPSBuZXdHbG9iYWxQZTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hbGxvd01vcmVIb2xlcwogICAgIGRlc2NyaXB0aW9uOiAgaWYgdGhlIGRlc2lyZWQgcGUgY2FuIG5vdCBiZSByZWFjaGVkLCBzb21lIG1vcmUgc2NhbGVmYWN0b3IKICAgICAgICAgICAgICAgICAgIGJhbmRzIGhhdmUgdG8gYmUgcXVhbnRpemVkIHRvIHplcm8KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2FsbG93TW9yZUhvbGVzKENIQU5ORUxfTUFQUElORyogY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogIHFjRWxlbWVudFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50Wyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogICAgIEFkalRoclN0YXRlRWxlbWVudFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICBhaEZsYWdbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIGRlc2lyZWRQZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgY3VycmVudFBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICBwcm9jZXNzRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgIGVsZW1lbnRPZmZzZXQpCi17CitzdGF0aWMgdm9pZCBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMoCisgICAgY29uc3QgQ0hBTk5FTF9NQVBQSU5HICpjb25zdCBjbSwgUUNfT1VUX0VMRU1FTlQgKmNvbnN0IHFjRWxlbWVudFsoKDgpKV0sCisgICAgY29uc3QgUFNZX09VVF9FTEVNRU5UICpjb25zdCBwc3lPdXRFbGVtZW50WygoOCkpXSwKKyAgICBjb25zdCBBVFNfRUxFTUVOVCAqY29uc3QgQWRqVGhyU3RhdGVFbGVtZW50WygoOCkpXSwKKyAgICBVQ0hBUiBhaEZsYWdbKCg4KSldWygyKV1bTUFYX0dST1VQRURfU0ZCXSwgY29uc3QgSU5UIGRlc2lyZWRQZSwKKyAgICBjb25zdCBJTlQgY3VycmVudFBlLCBjb25zdCBpbnQgcHJvY2Vzc0VsZW1lbnRzLCBjb25zdCBpbnQgZWxlbWVudE9mZnNldCkgewogICBJTlQgZWxlbWVudElkOwotICBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCtwcm9jZXNzRWxlbWVudHM7CisgIElOVCBuRWxlbWVudHMgPSBlbGVtZW50T2Zmc2V0ICsgcHJvY2Vzc0VsZW1lbnRzOwogICBJTlQgYWN0UGUgPSBjdXJyZW50UGU7CiAKICAgaWYgKGFjdFBlIDw9IGRlc2lyZWRQZSkgewogICAgIHJldHVybjsgLyogbm90aGluZyB0byBkbyAqLwogICB9CiAKLSAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKKyAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CiAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7Ci0KICAgICAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CiAKICAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwogICAgICAgY29uc3QgSU5UIG5DaGFubmVscyA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOwogCi0gICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbm5lbFsoMildID0ge05VTEx9OwotICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0gPSB7TlVMTH07CisgICAgICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFubmVsWygyKV0gPSB7TlVMTH07CisgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbKDIpXSA9IHtOVUxMfTsKIAotICAgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLQorICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgIC8qIGluaXQgcG9pbnRlcnMgKi8KICAgICAgICAgcWNPdXRDaGFubmVsW2NoXSA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOwogICAgICAgICBwc3lPdXRDaGFubmVsW2NoXSA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF07CiAKLSAgICAgICAgZm9yKHNmYkdycD0wOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKLSAgICAgICAgICBmb3IgKHNmYj1wc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgICBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYkdycCtzZmJdID0gMDsKKyAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgICAgICBmb3IgKHNmYiA9IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsKKyAgICAgICAgICAgICAgIHNmYiA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICAgIHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiR3JwICsgc2ZiXSA9IDA7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIC8qIGZvciBNUyBhbGxvdyBob2xlIGluIHRoZSBjaGFubmVsIHdpdGggbGVzcyBlbmVyZ3kgKi8KLSAgICAgIGlmICggbkNoYW5uZWxzPT0yICYmIHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZT09cHN5T3V0Q2hhbm5lbFsxXS0+bGFzdFdpbmRvd1NlcXVlbmNlICkgewotCi0gICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsWzBdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgICBmb3Ioc2ZiR3JwPTA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbMF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsWzBdLT5zZmJQZXJHcm91cCkgewotICAgICAgICAgICAgaWYgKHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+dG9vbHNJbmZvLm1zTWFza1tzZmJHcnArc2ZiXSkgewotICAgICAgICAgICAgICBGSVhQX0RCTCBFbmVyZ3lMZF9MID0gcWNPdXRDaGFubmVsWzBdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICAgICAgRklYUF9EQkwgRW5lcmd5TGRfUiA9IHFjT3V0Q2hhbm5lbFsxXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07CisgICAgICBpZiAobkNoYW5uZWxzID09IDIgJiYgcHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmxhc3RXaW5kb3dTZXF1ZW5jZSkgeworICAgICAgICBmb3IgKHNmYiA9IHBzeU91dENoYW5uZWxbMF0tPm1heFNmYlBlckdyb3VwIC0gMTsgc2ZiID49IDA7IHNmYi0tKSB7CisgICAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsWzBdLT5zZmJDbnQ7CisgICAgICAgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbFswXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgICAgICAgIGlmIChwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnRvb2xzSW5mby5tc01hc2tbc2ZiR3JwICsgc2ZiXSkgeworICAgICAgICAgICAgICBGSVhQX0RCTCBFbmVyZ3lMZF9MID0KKyAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXTsKKyAgICAgICAgICAgICAgRklYUF9EQkwgRW5lcmd5TGRfUiA9CisgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl07CiAKICAgICAgICAgICAgICAgLyogYWxsb3cgaG9sZSBpbiBzaWRlIGNoYW5uZWwgPyAqLwotICAgICAgICAgICAgICBpZiAoIChhaEZsYWdbZWxlbWVudElkXVsxXVtzZmJHcnArc2ZiXSAhPSBOT19BSCkgJiYKLSAgICAgICAgICAgICAgICAgICAoKChGTDJGWENPTlNUX0RCTCgtMC4wMjA2NTUxMjY0OGYpPj4xKSArIChxY091dENoYW5uZWxbMF0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXT4+MSkpCi0gICAgICAgICAgICAgICAgICAgICAgICA+ICgoRW5lcmd5TGRfUj4+MSkgLSAoRW5lcmd5TGRfTD4+MSkpKSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdWzFdW3NmYkdycCtzZmJdID0gTk9fQUg7Ci0gICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKDAuMDE1NjI1ZikgKyBFbmVyZ3lMZF9SOwotICAgICAgICAgICAgICAgICAgYWN0UGUgLT0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhWzFdLnNmYlBlW3NmYkdycCtzZmJdPj5QRV9DT05TVFBBUlRfU0hJRlQ7CisgICAgICAgICAgICAgIGlmICgoYWhGbGFnW2VsZW1lbnRJZF1bMV1bc2ZiR3JwICsgc2ZiXSAhPSBOT19BSCkgJiYKKyAgICAgICAgICAgICAgICAgICgoKEZMMkZYQ09OU1RfREJMKC0wLjAyMDY1NTEyNjQ4ZikgPj4gMSkgKworICAgICAgICAgICAgICAgICAgICAocWNPdXRDaGFubmVsWzBdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSA+PiAxKSkgPgorICAgICAgICAgICAgICAgICAgICgoRW5lcmd5TGRfUiA+PiAxKSAtIChFbmVyZ3lMZF9MID4+IDEpKSkpIHsKKyAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVsxXVtzZmJHcnAgKyBzZmJdID0gTk9fQUg7CisgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzFdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMDE1NjI1ZikgKyBFbmVyZ3lMZF9SOworICAgICAgICAgICAgICAgIGFjdFBlIC09IHBlRGF0YS0+cGVDaGFubmVsRGF0YVsxXS5zZmJQZVtzZmJHcnAgKyBzZmJdID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgUEVfQ09OU1RQQVJUX1NISUZUOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC8qIGFsbG93IGhvbGUgaW4gbWlkIGNoYW5uZWwgPyAqLwotICAgICAgICAgICAgICBlbHNlIGlmICggKGFoRmxhZ1tlbGVtZW50SWRdWzBdW3NmYkdycCtzZmJdICE9IE5PX0FIKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKCgoRkwyRlhDT05TVF9EQkwoLTAuMDIwNjU1MTI2NDhmKT4+MSkgKyAocWNPdXRDaGFubmVsWzFdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+ICgoRW5lcmd5TGRfTD4+MSkgLSAoRW5lcmd5TGRfUj4+MSkpKSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdWzBdW3NmYkdycCtzZmJdID0gTk9fQUg7Ci0gICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKDAuMDE1NjI1ZikgKyBFbmVyZ3lMZF9MOwotICAgICAgICAgICAgICAgICAgYWN0UGUgLT0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhWzBdLnNmYlBlW3NmYkdycCtzZmJdPj5QRV9DT05TVFBBUlRfU0hJRlQ7CisgICAgICAgICAgICAgIGVsc2UgaWYgKChhaEZsYWdbZWxlbWVudElkXVswXVtzZmJHcnAgKyBzZmJdICE9IE5PX0FIKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAoKChGTDJGWENPTlNUX0RCTCgtMC4wMjA2NTUxMjY0OGYpID4+IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAocWNPdXRDaGFubmVsWzFdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAxKSkgPiAoKEVuZXJneUxkX0wgPj4gMSkgLSAoRW5lcmd5TGRfUiA+PiAxKSkpKSB7CisgICAgICAgICAgICAgICAgYWhGbGFnW2VsZW1lbnRJZF1bMF1bc2ZiR3JwICsgc2ZiXSA9IE5PX0FIOworICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpICsgRW5lcmd5TGRfTDsKKyAgICAgICAgICAgICAgICBhY3RQZSAtPSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbMF0uc2ZiUGVbc2ZiR3JwICsgc2ZiXSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0NPTlNUUEFSVF9TSElGVDsKICAgICAgICAgICAgICAgfSAvKiBpZiAoYWhGbGFnKSAqLwotICAgICAgICAgICAgfSAvKiBpZiBNUyAqLwotICAgICAgICAgIH0gLyogc2ZiR3JwICovCisgICAgICAgICAgICB9ICAgLyogaWYgTVMgKi8KKyAgICAgICAgICB9ICAgICAvKiBzZmJHcnAgKi8KICAgICAgICAgICBpZiAoYWN0UGUgPD0gZGVzaXJlZFBlKSB7CiAgICAgICAgICAgICByZXR1cm47IC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCiAgICAgICAgICAgfQogICAgICAgICB9IC8qIHNmYiAqLwotICAgICAgfSAvKiBNUyBwb3NzaWJsZSA/ICovCi0KLSAgICAgIC8qIG1vcmUgaG9sZXMgbmVjZXNzYXJ5PyBzdWJzZXF1ZW50bHkgZXJhc2UgYmFuZHMKLSAgICAgICAgIHN0YXJ0aW5nIHdpdGggbG93IGVuZXJnaWVzICovCi0gICAgICBJTlQgc3RhcnRTZmJbMl07Ci0gICAgICBGSVhQX0RCTCBhdmdFbkxENjQsbWluRW5MRDY0OwotICAgICAgSU5UIGFoQ250OwotICAgICAgRklYUF9EQkwgYWhDbnRMRDY0OwotICAgICAgSU5UIGVuSWR4OwotICAgICAgRklYUF9EQkwgZW5MRDY0WzRdOwotICAgICAgRklYUF9EQkwgYXZnRW47Ci0KLSAgICAgIC8qIGRvIG5vdCBnbyBiZWxvdyBzdGFydFNmYiAqLwotICAgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQotICAgICAgICAgIHN0YXJ0U2ZiW2NoXSA9IEFkalRoclN0YXRlRWxlbWVudFtlbGVtZW50SWRdLT5haFBhcmFtLnN0YXJ0U2ZiTDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHN0YXJ0U2ZiW2NoXSA9IEFkalRoclN0YXRlRWxlbWVudFtlbGVtZW50SWRdLT5haFBhcmFtLnN0YXJ0U2ZiUzsKLSAgICAgIH0KLQotICAgICAgLyogY2FsYyBhdmcgYW5kIG1pbiBlbmVyZ2llcyBvZiBiYW5kcyB0aGF0IGF2b2lkIGhvbGVzICovCi0gICAgICBhdmdFbiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgbWluRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICBhaENudCA9IDA7Ci0KLSAgICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0KLSAgICAgICAgc2ZiR3JwPTA7Ci0gICAgICAgIHNmYj1zdGFydFNmYltjaF07Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgIGZvciAoOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICAgICAgaWYgKChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0hPU5PX0FIKSAmJgotICAgICAgICAgICAgICAgIChxY091dENoYW5uZWxbY2hdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSA+IHFjT3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSkpewotICAgICAgICAgICAgICBtaW5FbkxENjQgPSBmaXhNaW4obWluRW5MRDY0LHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSk7Ci0gICAgICAgICAgICAgIGF2Z0VuICs9IHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneVtzZmJHcnArc2ZiXSA+PiA2OwotICAgICAgICAgICAgICBhaENudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7Ci0gICAgICAgICAgc2ZiPTA7Ci0KLSAgICAgICAgfSB3aGlsZSAoc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggKGF2Z0VuID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB8fCAoYWhDbnQgPT0gMCkgKSB7Ci0gICAgICAgIGF2Z0VuTEQ2NCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGF2Z0VuTEQ2NCA9IENhbGNMZERhdGEoYXZnRW4pOwotICAgICAgICBhaENudExENjQgPSBDYWxjTGRJbnQoYWhDbnQpOwotICAgICAgICBhdmdFbkxENjQgPSBhdmdFbkxENjQgKyBGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZikgLSBhaENudExENjQ7IC8qIGNvbXBlbnNhdGUgc2hpZnQgd2l0aCA2ICovCi0gICAgICB9Ci0KLSAgICAgIC8qIGNhbGMgc29tZSBlbmVyZ3kgYm9yZGVycyBiZXR3ZWVuIG1pbkVuIGFuZCBhdmdFbiAqLwotICAgICAgLyogZm9yIChlbklkeD0wOyBlbklkeDw0OyBlbklkeCsrKSAqLwotICAgICAgICAvKiBlbltlbklkeF0gPSBtaW5FbiAqIChmbG9hdClGREtwb3coYXZnRW4vKG1pbkVuK0ZMVF9NSU4pLCAoMiplbklkeCsxKS83LjBmKTsgKi8KLSAgICAgIGVuTEQ2NFswXSA9IG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQtbWluRW5MRDY0KSxGTDJGWENPTlNUX0RCTCgwLjE0Mjg1NzE0Mjg1ZikpOwotICAgICAgZW5MRDY0WzFdID0gbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NC1taW5FbkxENjQpLEZMMkZYQ09OU1RfREJMKDAuNDI4NTcxNDI4NTdmKSk7Ci0gICAgICBlbkxENjRbMl0gPSBtaW5FbkxENjQgKyBmTXVsdCgoYXZnRW5MRDY0LW1pbkVuTEQ2NCksRkwyRlhDT05TVF9EQkwoMC43MTQyODU3MTQyOGYpKTsKLSAgICAgIGVuTEQ2NFszXSA9IG1pbkVuTEQ2NCArIChhdmdFbkxENjQtbWluRW5MRDY0KTsKLQotICAgICAgZm9yIChlbklkeD0wOyBlbklkeDw0OyBlbklkeCsrKSB7Ci0gICAgICAgIElOVCBub1JlZHVjdGlvbiA9IDE7Ci0KLSAgICAgICAgSU5UIG1heFNmYlBlckdyb3VwWzJdOwotICAgICAgICBJTlQgc2ZiQ250WzJdOwotICAgICAgICBJTlQgc2ZiUGVyR3JvdXBbMl07Ci0KLSAgICAgICAgZm9yKGNoPTA7IGNoPGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7Ci0gICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAtMTsKLSAgICAgICAgICBzZmJDbnRbY2hdICAgICAgICAgPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7Ci0gICAgICAgICAgc2ZiUGVyR3JvdXBbY2hdICAgID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7Ci0gICAgICAgIH0KLQotICAgICAgICBkbyB7Ci0KLSAgICAgICAgICBub1JlZHVjdGlvbiA9IDE7Ci0KLSAgICAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKLQotICAgICAgICAgICAgSU5UIHNmYiwgc2ZiR3JwOwotCi0gICAgICAgICAgICAvKiBzdGFydCB3aXRoIGxvd2VzdCBlbmVyZ3kgYm9yZGVyIGF0IGhpZ2hlc3Qgc2ZiICovCi0gICAgICAgICAgICBpZiAobWF4U2ZiUGVyR3JvdXBbY2hdPj1zdGFydFNmYltjaF0pIHsgIC8qIHNmYiBpbiBuZXh0IGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgc2ZiID0gbWF4U2ZiUGVyR3JvdXBbY2hdLS07Ci0gICAgICAgICAgICAgIG5vUmVkdWN0aW9uID0gMDsKLQotICAgICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHNmYkNudFtjaF07IHNmYkdycCArPSBzZmJQZXJHcm91cFtjaF0pIHsKLSAgICAgICAgICAgICAgICAvKiBzZmIgZW5lcmd5IGJlbG93IGJvcmRlciA/ICovCi0gICAgICAgICAgICAgICAgaWYgKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAhPSBOT19BSCAmJiBxY091dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPCBlbkxENjRbZW5JZHhdKSB7Ci0gICAgICAgICAgICAgICAgICAvKiBhbGxvdyBob2xlICovCi0gICAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBOT19BSDsKLSAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKDAuMDE1NjI1ZikgKyBxY091dENoYW5uZWxbY2hdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICAgICAgICAgIGFjdFBlIC09IHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiR3JwK3NmYl0+PlBFX0NPTlNUUEFSVF9TSElGVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gLyogc2ZiR3JwICAqLwotCi0gICAgICAgICAgICAgIGlmIChhY3RQZSA8PSBkZXNpcmVkUGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47IC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gLyogc2ZiID4gMCAqLwotICAgICAgICAgIH0gLyogY2ggbG9vcCAqLwotCi0gICAgICAgIH0gd2hpbGUoIChub1JlZHVjdGlvbiA9PSAwKSAmJiAoYWN0UGUgPiBkZXNpcmVkUGUpICk7Ci0KLSAgICAgICAgaWYgKGFjdFBlIDw9IGRlc2lyZWRQZSkgewotICAgICAgICAgIHJldHVybjsgLyogc3RvcCBpZiBlbm91Z2ggaGFzIGJlZW4gc2F2ZWQgKi8KLSAgICAgICAgfQotCi0gICAgICB9IC8qIGVuSWR4IGxvb3AgKi8KKyAgICAgIH0gICAvKiBNUyBwb3NzaWJsZSA/ICovCiAKICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KLSAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLworICB9ICAgLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KIAorICBpZiAoYWN0UGUgPiBkZXNpcmVkUGUpIHsKKyAgICAvKiBtb3JlIGhvbGVzIG5lY2Vzc2FyeT8gc3Vic2VxdWVudGx5IGVyYXNlIGJhbmRzIHN0YXJ0aW5nIHdpdGggbG93IGVuZXJnaWVzCisgICAgICovCisgICAgSU5UIGNoLCBzZmIsIHNmYkdycDsKKyAgICBJTlQgbWluU2ZiLCBtYXhTZmI7CisgICAgSU5UIGVuSWR4LCBhaENudCwgZG9uZTsKKyAgICBJTlQgc3RhcnRTZmJbKDgpXTsKKyAgICBJTlQgc2ZiQ250Wyg4KV07CisgICAgSU5UIHNmYlBlckdyb3VwWyg4KV07CisgICAgSU5UIG1heFNmYlBlckdyb3VwWyg4KV07CisgICAgRklYUF9EQkwgYXZnRW47CisgICAgRklYUF9EQkwgbWluRW5MRDY0OworICAgIEZJWFBfREJMIGF2Z0VuTEQ2NDsKKyAgICBGSVhQX0RCTCBlbkxENjRbTlVNX05SR19MRVZTXTsKKyAgICBJTlQgYXZnRW5fZTsKKworICAgIC8qIGdldCB0aGUgc2NhbGluZyBmYWN0b3Igb3ZlciBhbGwgYXVkaW8gZWxlbWVudHMgYW5kIGNoYW5uZWxzICovCisgICAgbWF4U2ZiID0gMDsKKyAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7IGVsZW1lbnRJZCA8IG5FbGVtZW50czsgZWxlbWVudElkKyspIHsKKyAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDsKKyAgICAgICAgICAgICAgIHNmYkdycCA8IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgICAgICAgIHNmYkdycCArPQorICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgICAgICAgIG1heFNmYiArPQorICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBhdmdFbl9lID0KKyAgICAgICAgKERGUkFDVF9CSVRTIC0gZml4bm9ybXpfRCgoTE9ORylmTWF4KDAsIG1heFNmYiAtIDEpKSk7IC8qIGlsb2cyKCkgKi8KKworICAgIGFoQ250ID0gMDsKKyAgICBtYXhTZmIgPSAwOworICAgIG1pblNmYiA9IE1BWF9TRkI7CisgICAgYXZnRW4gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBtaW5FbkxENjQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDsgZWxlbWVudElkIDwgbkVsZW1lbnRzOyBlbGVtZW50SWQrKykgeworICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICAgICAgY29uc3QgSU5UIGNoSWR4ID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLkNoYW5uZWxJbmRleFtjaF07CisgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbCA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOworICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbCA9CisgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF07CisKKyAgICAgICAgICBtYXhTZmJQZXJHcm91cFtjaElkeF0gPSBwc3lPdXRDaGFubmVsLT5tYXhTZmJQZXJHcm91cDsKKyAgICAgICAgICBzZmJDbnRbY2hJZHhdID0gcHN5T3V0Q2hhbm5lbC0+c2ZiQ250OworICAgICAgICAgIHNmYlBlckdyb3VwW2NoSWR4XSA9IHBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwOworCisgICAgICAgICAgbWF4U2ZiID0gZk1heChtYXhTZmIsIHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwKTsKKworICAgICAgICAgIGlmIChwc3lPdXRDaGFubmVsLT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgICAgICAgICBzdGFydFNmYltjaElkeF0gPSBBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+YWhQYXJhbS5zdGFydFNmYkw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0U2ZiW2NoSWR4XSA9IEFkalRoclN0YXRlRWxlbWVudFtlbGVtZW50SWRdLT5haFBhcmFtLnN0YXJ0U2ZiUzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBtaW5TZmIgPSBmTWluKG1pblNmYiwgc3RhcnRTZmJbY2hJZHhdKTsKKworICAgICAgICAgIHNmYkdycCA9IDA7CisgICAgICAgICAgc2ZiID0gc3RhcnRTZmJbY2hJZHhdOworCisgICAgICAgICAgZG8geworICAgICAgICAgICAgZm9yICg7IHNmYiA8IHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgICAgICBpZiAoKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdICE9IE5PX0FIKSAmJgorICAgICAgICAgICAgICAgICAgKHFjT3V0Q2hhbm5lbC0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXSA+CisgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXSkpIHsKKyAgICAgICAgICAgICAgICBtaW5FbkxENjQgPSBmaXhNaW4obWluRW5MRDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdKTsKKyAgICAgICAgICAgICAgICBhdmdFbiArPSBxY091dENoYW5uZWwtPnNmYkVuZXJneVtzZmJHcnAgKyBzZmJdID4+IGF2Z0VuX2U7CisgICAgICAgICAgICAgICAgYWhDbnQrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXA7CisgICAgICAgICAgICBzZmIgPSBzdGFydFNmYltjaElkeF07CisKKyAgICAgICAgICB9IHdoaWxlIChzZmJHcnAgPCBwc3lPdXRDaGFubmVsLT5zZmJDbnQpOworICAgICAgICB9CisgICAgICB9IC8qIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgKi8KKyAgICB9ICAgLyogKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgKi8KKworICAgIGlmICgoYXZnRW4gPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHx8IChhaENudCA9PSAwKSkgeworICAgICAgYXZnRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgfSBlbHNlIHsKKyAgICAgIGF2Z0VuTEQ2NCA9IENhbGNMZERhdGEoYXZnRW4pICsKKyAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoYXZnRW5fZSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCkpIC0KKyAgICAgICAgICAgICAgICAgIENhbGNMZEludChhaENudCk7CisgICAgfQorCisgICAgLyogY2FsYyBzb21lIGVuZXJneSBib3JkZXJzIGJldHdlZW4gbWluRW4gYW5kIGF2Z0VuICovCisKKyAgICAvKiBmb3IgKGVuSWR4ID0gMDsgZW5JZHggPCBOVU1fTlJHX0xFVlM7IGVuSWR4KyspIHsKKyAgICAgICAgIGVuW2VuSWR4XSA9ICgyLjBmKmVuSWR4KzEuMGYpLygyLjBmKk5VTV9OUkdfTEVWUy0xLjBmKTsKKyAgICAgICB9ICovCisgICAgZW5MRDY0WzBdID0KKyAgICAgICAgbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NCAtIG1pbkVuTEQ2NCksIEZMMkZYQ09OU1RfREJMKDAuMDY2NjY2NjdmKSk7CisgICAgZW5MRDY0WzFdID0KKyAgICAgICAgbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NCAtIG1pbkVuTEQ2NCksIEZMMkZYQ09OU1RfREJMKDAuMjAwMDAwMDBmKSk7CisgICAgZW5MRDY0WzJdID0KKyAgICAgICAgbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NCAtIG1pbkVuTEQ2NCksIEZMMkZYQ09OU1RfREJMKDAuMzMzMzMzMzRmKSk7CisgICAgZW5MRDY0WzNdID0KKyAgICAgICAgbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NCAtIG1pbkVuTEQ2NCksIEZMMkZYQ09OU1RfREJMKDAuNDY2NjY2NjdmKSk7CisgICAgZW5MRDY0WzRdID0KKyAgICAgICAgbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NCAtIG1pbkVuTEQ2NCksIEZMMkZYQ09OU1RfREJMKDAuNjAwMDAwMDJmKSk7CisgICAgZW5MRDY0WzVdID0KKyAgICAgICAgbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NCAtIG1pbkVuTEQ2NCksIEZMMkZYQ09OU1RfREJMKDAuNzMzMzMzMzVmKSk7CisgICAgZW5MRDY0WzZdID0KKyAgICAgICAgbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NCAtIG1pbkVuTEQ2NCksIEZMMkZYQ09OU1RfREJMKDAuODY2NjY2NjdmKSk7CisgICAgZW5MRDY0WzddID0gbWluRW5MRDY0ICsgKGF2Z0VuTEQ2NCAtIG1pbkVuTEQ2NCk7CisKKyAgICBkb25lID0gMDsKKyAgICBlbklkeCA9IDA7CisgICAgc2ZiID0gbWF4U2ZiIC0gMTsKKworICAgIHdoaWxlICghZG9uZSkgeworICAgICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CisgICAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgeworICAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOworICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICAgICAgICBjb25zdCBJTlQgY2hJZHggPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uQ2hhbm5lbEluZGV4W2NoXTsKKyAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW5uZWwgPQorICAgICAgICAgICAgICAgIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOworICAgICAgICAgICAgaWYgKHNmYiA+PSBzdGFydFNmYltjaElkeF0gJiYgc2ZiIDwgbWF4U2ZiUGVyR3JvdXBbY2hJZHhdKSB7CisgICAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgc2ZiQ250W2NoSWR4XTsKKyAgICAgICAgICAgICAgICAgICBzZmJHcnAgKz0gc2ZiUGVyR3JvdXBbY2hJZHhdKSB7CisgICAgICAgICAgICAgICAgLyogc2ZiIGVuZXJneSBiZWxvdyBib3JkZXIgPyAqLworICAgICAgICAgICAgICAgIGlmIChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSAhPSBOT19BSCAmJgorICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdIDwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuTEQ2NFtlbklkeF0pIHsKKyAgICAgICAgICAgICAgICAgIC8qIGFsbG93IGhvbGUgKi8KKyAgICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdID0gTk9fQUg7CisgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpICsKKyAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl07CisgICAgICAgICAgICAgICAgICBhY3RQZSAtPSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYkdycCArIHNmYl0gPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0NPTlNUUEFSVF9TSElGVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFjdFBlIDw9IGRlc2lyZWRQZSkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSAvKiBzZmJHcnAgKi8KKyAgICAgICAgICAgIH0gICAvKiBzZmIgKi8KKyAgICAgICAgICB9ICAgICAvKiBuQ2hhbm5lbHNJbkVsICovCisgICAgICAgIH0gICAgICAgLyogSURfRFNFICovCisgICAgICB9ICAgICAgICAgLyogZWxlbWVudElEICovCisKKyAgICAgIHNmYi0tOworICAgICAgaWYgKHNmYiA8IG1pblNmYikgeworICAgICAgICAvKiByZXN0YXJ0IHdpdGggbmV4dCBlbmVyZ3kgYm9yZGVyICovCisgICAgICAgIHNmYiA9IG1heFNmYjsKKyAgICAgICAgZW5JZHgrKzsKKyAgICAgICAgaWYgKGVuSWR4ID49IE5VTV9OUkdfTEVWUykgeworICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfSAvKiBkb25lICovCisgIH0gICAvKiAoYWN0UGUgPD0gZGVzaXJlZFBlKSAqLwogfQogCiAvKiByZXNldCBhdm9pZCBob2xlIGZsYWdzIGZyb20gQUhfQUNUSVZFIHRvIEFIX0lOQUNUSVZFICAqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX3Jlc2V0QUhGbGFncyggVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAqcHN5T3V0Q2hhbm5lbFsoMildKQoteworc3RhdGljIHZvaWQgRkRLYWFjRW5jX3Jlc2V0QUhGbGFncygKKyAgICBVQ0hBUiBhaEZsYWdbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLCBjb25zdCBJTlQgbkNoYW5uZWxzLAorICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbm5lbFsoMildKSB7CiAgIGludCBjaCwgc2ZiLCBzZmJHcnA7CiAKLSAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICBpZiAoIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPT0gQUhfQUNUSVZFKSB7Ci0gICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0lOQUNUSVZFOworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7CisgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CisgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgaWYgKGFoRmxhZ1tjaF1bc2ZiR3JwICsgc2ZiXSA9PSBBSF9BQ1RJVkUpIHsKKyAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCArIHNmYl0gPSBBSF9JTkFDVElWRTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQogCitzdGF0aWMgRklYUF9EQkwgQ2FsY1JlZFZhbFBvd2VyKEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVudW0sIElOVCAqc2NhbGluZykgeworICBGSVhQX0RCTCB2YWx1ZSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAKLXN0YXRpYyBGSVhQX0RCTCBDYWxjUmVkVmFsUG93ZXIoRklYUF9EQkwgbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBkZW51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiAgICAgc2NhbGluZyApCi17Ci0gICAgRklYUF9EQkwgdmFsdWUgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICBpZiAobnVtID49IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICB2YWx1ZSA9IGZEaXZOb3JtKG51bSwgZGVudW0sIHNjYWxpbmcpOworICB9IGVsc2UgeworICAgIHZhbHVlID0gLWZEaXZOb3JtKC1udW0sIGRlbnVtLCBzY2FsaW5nKTsKKyAgfQorICB2YWx1ZSA9IGYyUG93KHZhbHVlLCAqc2NhbGluZywgc2NhbGluZyk7CiAKLSAgICBpZiAobnVtPj1GTDJGWENPTlNUX0RCTCgwLmYpKSB7Ci0gICAgICB2YWx1ZSA9IGZEaXZOb3JtKCBudW0sIGRlbnVtLCBzY2FsaW5nKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB2YWx1ZSA9IC1mRGl2Tm9ybSggLW51bSwgZGVudW0sIHNjYWxpbmcpOwotICAgIH0KLSAgICB2YWx1ZSA9IGYyUG93KHZhbHVlLCAqc2NhbGluZywgc2NhbGluZyk7Ci0gICAgKnNjYWxpbmcgPSBERlJBQ1RfQklUUy0xLSpzY2FsaW5nOwotCi0gICAgcmV0dXJuIHZhbHVlOworICByZXR1cm4gdmFsdWU7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlCi1kZXNjcmlwdGlvbjogIHR3byBndWVzc2VzIGZvciB0aGUgcmVkdWN0aW9uIHZhbHVlIGFuZCBvbmUgZmluYWwgY29ycmVjdGlvbiBvZiB0aGUgdGhyZXNob2xkcworZGVzY3JpcHRpb246ICB0d28gZ3Vlc3NlcyBmb3IgdGhlIHJlZHVjdGlvbiB2YWx1ZSBhbmQgb25lIGZpbmFsIGNvcnJlY3Rpb24gb2YKK3RoZSB0aHJlc2hvbGRzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKENIQU5ORUxfTUFQUElORyogIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogICAgICBBZGpUaHJTdGF0ZUVsZW1lbnRbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICAgcWNFbGVtZW50Wyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogIHBzeU91dEVsZW1lbnRbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgZGVzaXJlZFBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICBtYXhJdGVyMm5kR3Vlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIHByb2Nlc3NFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgZWxlbWVudE9mZnNldCkKLXsKLSAgIEZJWFBfREJMIHJlZFZhbHVlWyg4KV07Ci0gICBTQ0hBUiAgICByZWRWYWxTY2FsaW5nWyg4KV07Ci0gICBVQ0hBUiAgICBwQWhGbGFnWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdOwotICAgRklYUF9EQkwgcFRockV4cFsoOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKLSAgIGludCBpdGVyOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX2FkYXB0VGhyZXNob2xkc1RvUGUoCisgICAgY29uc3QgQ0hBTk5FTF9NQVBQSU5HICpjb25zdCBjbSwKKyAgICBBVFNfRUxFTUVOVCAqY29uc3QgQWRqVGhyU3RhdGVFbGVtZW50WygoOCkpXSwKKyAgICBRQ19PVVRfRUxFTUVOVCAqY29uc3QgcWNFbGVtZW50WygoOCkpXSwKKyAgICBjb25zdCBQU1lfT1VUX0VMRU1FTlQgKmNvbnN0IHBzeU91dEVsZW1lbnRbKCg4KSldLCBjb25zdCBJTlQgZGVzaXJlZFBlLAorICAgIGNvbnN0IElOVCBtYXhJdGVyMm5kR3Vlc3MsIGNvbnN0IElOVCBwcm9jZXNzRWxlbWVudHMsCisgICAgY29uc3QgSU5UIGVsZW1lbnRPZmZzZXQpIHsKKyAgRklYUF9EQkwgcmVkdWN0aW9uVmFsdWVfbTsKKyAgU0NIQVIgcmVkdWN0aW9uVmFsdWVfZTsKKyAgVUNIQVIoKnBBaEZsYWcpWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwoKnBUaHJFeHApWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKKyAgaW50IGl0ZXI7CiAKLSAgIElOVCBjb25zdFBhcnRHbG9iYWwsIG5vUmVkUGVHbG9iYWwsIG5BY3RpdmVMaW5lc0dsb2JhbCwgcmVkUGVHbG9iYWw7Ci0gICBjb25zdFBhcnRHbG9iYWwgPSBub1JlZFBlR2xvYmFsID0gbkFjdGl2ZUxpbmVzR2xvYmFsID0gcmVkUGVHbG9iYWwgPSAwOworICBJTlQgY29uc3RQYXJ0R2xvYmFsLCBub1JlZFBlR2xvYmFsLCBuQWN0aXZlTGluZXNHbG9iYWwsIHJlZFBlR2xvYmFsOworICBjb25zdFBhcnRHbG9iYWwgPSBub1JlZFBlR2xvYmFsID0gbkFjdGl2ZUxpbmVzR2xvYmFsID0gcmVkUGVHbG9iYWwgPSAwOwogCi0gICBpbnQgZWxlbWVudElkOworICBpbnQgZWxlbWVudElkOwogCi0gICBpbnQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCtwcm9jZXNzRWxlbWVudHM7Ci0gICBpZihuRWxlbWVudHMgPiBjbS0+bkVsZW1lbnRzKSB7Ci0gICAgIG5FbGVtZW50cyA9IGNtLT5uRWxlbWVudHM7Ci0gICB9CisgIGludCBuRWxlbWVudHMgPSBlbGVtZW50T2Zmc2V0ICsgcHJvY2Vzc0VsZW1lbnRzOworICBpZiAobkVsZW1lbnRzID4gY20tPm5FbGVtZW50cykgeworICAgIG5FbGVtZW50cyA9IGNtLT5uRWxlbWVudHM7CisgIH0KIAotICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgLyogUGFydCBJOiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcyBhbmQgdmFyaWFibGVzLi4uICovCi0gICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewotICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgLyogVGhlIHJlaW50ZXJwcmV0X2Nhc3QgaXMgdXNlZCB0byBzdXBwcmVzcyBhIGNvbXBpbGVyIHdhcm5pbmcuIFdlIGtub3cgdGhhdAorICAgKiBxY0VsZW1lbnRbMF0tPmR5bk1lbV9BaF9GbGFnIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLCBzbyB0aGUgY2FzdCBpcyBzYWZlCisgICAqLworICBwQWhGbGFnID0gcmVpbnRlcnByZXRfY2FzdDxVQ0hBUigqKVsoMildW01BWF9HUk9VUEVEX1NGQl0+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KHFjRWxlbWVudFswXS0+ZHluTWVtX0FoX0ZsYWcpKTsKKyAgLyogVGhlIHJlaW50ZXJwcmV0X2Nhc3QgaXMgdXNlZCB0byBzdXBwcmVzcyBhIGNvbXBpbGVyIHdhcm5pbmcuIFdlIGtub3cgdGhhdAorICAgKiBxY0VsZW1lbnRbMF0tPmR5bk1lbV9UaHJfRXhwIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLCBzbyB0aGUgY2FzdCBpcyBzYWZlCisgICAqLworICBwVGhyRXhwID0gcmVpbnRlcnByZXRfY2FzdDxGSVhQX0RCTCgqKVsoMildW01BWF9HUk9VUEVEX1NGQl0+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KHFjRWxlbWVudFswXS0+ZHluTWVtX1Rocl9FeHApKTsKIAotICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKLSAgICAgICBQRV9EQVRBICpwZURhdGEgICAgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiBQYXJ0IEk6IEluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB2YXJpYWJsZXMuLi4gKi8KKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7IGVsZW1lbnRJZCA8IG5FbGVtZW50czsgZWxlbWVudElkKyspIHsKKyAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKKyAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwogCi0gICAgICAgLyogdGhyZXNob2xkcyB0byB0aGUgcG93ZXIgb2YgcmVkRXhwICovCi0gICAgICAgRkRLYWFjRW5jX2NhbGNUaHJlc2hFeHAocFRockV4cFtlbGVtZW50SWRdLCBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7CisgICAgICAvKiB0aHJlc2hvbGRzIHRvIHRoZSBwb3dlciBvZiByZWRFeHAgKi8KKyAgICAgIEZES2FhY0VuY19jYWxjVGhyZXNoRXhwKAorICAgICAgICAgIHBUaHJFeHBbZWxlbWVudElkXSwgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwKKyAgICAgICAgICBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7CiAKLSAgICAgICAvKiBsb3dlciB0aGUgbWluU25yIHJlcXVpcmVtZW50cyBmb3IgbG93IGVuZXJnaWVzIGNvbXBhcmVkIHRvIHRoZSBhdmVyYWdlCi0gICAgICAgICAgZW5lcmd5IGluIHRoaXMgZnJhbWUgKi8KLSAgICAgICBGREthYWNFbmNfYWRhcHRNaW5TbnIocWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCAmQWRqVGhyU3RhdGVFbGVtZW50W2VsZW1lbnRJZF0tPm1pblNuckFkYXB0UGFyYW0sIG5DaGFubmVscyk7CisgICAgICAvKiBsb3dlciB0aGUgbWluU25yIHJlcXVpcmVtZW50cyBmb3IgbG93IGVuZXJnaWVzIGNvbXBhcmVkIHRvIHRoZSBhdmVyYWdlCisgICAgICAgICBlbmVyZ3kgaW4gdGhpcyBmcmFtZSAqLworICAgICAgRkRLYWFjRW5jX2FkYXB0TWluU25yKHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+bWluU25yQWRhcHRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMpOwogCi0gICAgICAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLwotICAgICAgIEZES2FhY0VuY19pbml0QXZvaWRIb2xlRmxhZyhxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHBBaEZsYWdbZWxlbWVudElkXSwgJnBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+dG9vbHNJbmZvLCBuQ2hhbm5lbHMsIHBlRGF0YSwgJkFkalRoclN0YXRlRWxlbWVudFtlbGVtZW50SWRdLT5haFBhcmFtKTsKKyAgICAgIC8qIGluaXQgYWhGbGFnICgwOiBubyBhaCBuZWNlc3NhcnksIDE6IGFoIHBvc3NpYmxlLCAyOiBhaCBhY3RpdmUgKi8KKyAgICAgIEZES2FhY0VuY19pbml0QXZvaWRIb2xlRmxhZygKKyAgICAgICAgICBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLAorICAgICAgICAgIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcEFoRmxhZ1tlbGVtZW50SWRdLAorICAgICAgICAgICZwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnRvb2xzSW5mbywgbkNoYW5uZWxzLAorICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+YWhQYXJhbSk7CiAKLSAgICAgICAvKiBzdW0gdXAgKi8KLSAgICAgICBjb25zdFBhcnRHbG9iYWwgICAgKz0gcGVEYXRhLT5jb25zdFBhcnQ7Ci0gICAgICAgbm9SZWRQZUdsb2JhbCAgICAgICs9IHBlRGF0YS0+cGU7Ci0gICAgICAgbkFjdGl2ZUxpbmVzR2xvYmFsICs9IGZpeE1heCgoSU5UKXBlRGF0YS0+bkFjdGl2ZUxpbmVzLCAxKTsKKyAgICAgIC8qIHN1bSB1cCAqLworICAgICAgY29uc3RQYXJ0R2xvYmFsICs9IHBlRGF0YS0+Y29uc3RQYXJ0OworICAgICAgbm9SZWRQZUdsb2JhbCArPSBwZURhdGEtPnBlOworICAgICAgbkFjdGl2ZUxpbmVzR2xvYmFsICs9IGZpeE1heCgoSU5UKXBlRGF0YS0+bkFjdGl2ZUxpbmVzLCAxKTsKIAotICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KLSAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KKyAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KKyAgfSAgIC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCiAKLSAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAvKiBQYXJ0IElJOiBDYWxjdWxhdGUgYml0IGNvbnN1bXB0aW9uIG9mIGluaXRpYWwgYml0IGNvbnN0cmFpbnRzIHNldHVwICovCi0gICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKLSAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7Ci0gICAgICAgLyoKLSAgICAgICByZWRWYWwgPSAoIDIgXiAoIChjb25zdFBhcnRHbG9iYWwtZGVzaXJlZFBlKSAvIChpbnZSZWRFeHAqbkFjdGl2ZUxpbmVzR2xvYmFsKSApCi0gICAgICAgICAgICAgICAgLSAyIF4gKCAoY29uc3RQYXJ0R2xvYmFsLW5vUmVkUGVHbG9iYWwpIC8gKGludlJlZEV4cCpuQWN0aXZlTGluZXNHbG9iYWwpICkgKQotICAgICAgICovCisgIC8qCisgICAgIEZpcnN0IGd1ZXNzIG9mIHJlZHVjdGlvbiB2YWx1ZToKKyAgICAgYXZnVGhyRXhwID0gKGZsb2F0KXBvdygyLjBmLCAoY29uc3RQYXJ0R2xvYmFsIC0gbm9SZWRQZUdsb2JhbCkvKDQuMGYgKgorICAgICBuQWN0aXZlTGluZXNHbG9iYWwpKTsgcmVkVmFsICAgID0gKGZsb2F0KXBvdygyLjBmLCAoY29uc3RQYXJ0R2xvYmFsIC0KKyAgICAgZGVzaXJlZFBlKS8oNC4wZiAqIG5BY3RpdmVMaW5lc0dsb2JhbCkpIC0gYXZnVGhyRXhwOyByZWRWYWwgICAgPSBtYXgoMC5mLAorICAgICByZWRWYWwpOworICAqLworICBpbnQgcmVkVmFsX2UsIGF2Z1RockV4cF9lLCByZXN1bHRfZTsKKyAgRklYUF9EQkwgcmVkVmFsX20sIGF2Z1RockV4cF9tOwogCisgIHJlZFZhbF9tID0gQ2FsY1JlZFZhbFBvd2VyKGNvbnN0UGFydEdsb2JhbCAtIGRlc2lyZWRQZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAqIG5BY3RpdmVMaW5lc0dsb2JhbCwgJnJlZFZhbF9lKTsKKyAgYXZnVGhyRXhwX20gPSBDYWxjUmVkVmFsUG93ZXIoY29uc3RQYXJ0R2xvYmFsIC0gbm9SZWRQZUdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAqIG5BY3RpdmVMaW5lc0dsb2JhbCwgJmF2Z1RockV4cF9lKTsKKyAgcmVzdWx0X2UgPSBmTWF4KHJlZFZhbF9lLCBhdmdUaHJFeHBfZSkgKyAxOwogCi0gICAgICAgSU5UIG5DaGFubmVscyA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOwotICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOworICByZWR1Y3Rpb25WYWx1ZV9tID0gZk1heChGTDJGWENPTlNUX0RCTCgwLmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKHJlZFZhbF9tLCByZWRWYWxfZSAtIHJlc3VsdF9lKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKGF2Z1RockV4cF9tLCBhdmdUaHJFeHBfZSAtIHJlc3VsdF9lKSk7CisgIHJlZHVjdGlvblZhbHVlX2UgPSByZXN1bHRfZTsKIAotICAgICAgIC8qIGZpcnN0IGd1ZXNzIG9mIHJlZHVjdGlvbiB2YWx1ZSAqLwotICAgICAgIGludCBzY2FsZTA9MCwgc2NhbGUxPTA7Ci0gICAgICAgRklYUF9EQkwgdG1wMCA9IENhbGNSZWRWYWxQb3dlciggY29uc3RQYXJ0R2xvYmFsLWRlc2lyZWRQZSwgNCpuQWN0aXZlTGluZXNHbG9iYWwsICZzY2FsZTAgKTsKLSAgICAgICBGSVhQX0RCTCB0bXAxID0gQ2FsY1JlZFZhbFBvd2VyKCBjb25zdFBhcnRHbG9iYWwtbm9SZWRQZUdsb2JhbCwgNCpuQWN0aXZlTGluZXNHbG9iYWwsICZzY2FsZTEgKTsKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgLyogUGFydCBJSTogQ2FsY3VsYXRlIGJpdCBjb25zdW1wdGlvbiBvZiBpbml0aWFsIGJpdCBjb25zdHJhaW50cyBzZXR1cCAqLworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7IGVsZW1lbnRJZCA8IG5FbGVtZW50czsgZWxlbWVudElkKyspIHsKKyAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKKyAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwogCi0gICAgICAgaW50IHNjYWxNaW4gPSBGREttaW4oc2NhbGUwLCBzY2FsZTEpLTE7CisgICAgICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLworICAgICAgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNDQlIoCisgICAgICAgICAgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwKKyAgICAgICAgICBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHBBaEZsYWdbZWxlbWVudElkXSwKKyAgICAgICAgICBwVGhyRXhwW2VsZW1lbnRJZF0sIG5DaGFubmVscywgcmVkdWN0aW9uVmFsdWVfbSwgcmVkdWN0aW9uVmFsdWVfZSk7CiAKLSAgICAgICByZWRWYWx1ZVtlbGVtZW50SWRdICA9IHNjYWxlVmFsdWUodG1wMCwoc2NhbE1pbi1zY2FsZTApKSAtIHNjYWxlVmFsdWUodG1wMSwoc2NhbE1pbi1zY2FsZTEpKTsKLSAgICAgICByZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0gPSBzY2FsTWluOworICAgICAgLyogcGUgYWZ0ZXIgZmlyc3QgZ3Vlc3MgKi8KKyAgICAgIEZES2FhY0VuY19jYWxjUGUocHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwZURhdGEsIG5DaGFubmVscyk7CiAKLSAgICAgICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLwotICAgICAgIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzQ0JSKHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcEFoRmxhZ1tlbGVtZW50SWRdLCBwVGhyRXhwW2VsZW1lbnRJZF0sIG5DaGFubmVscywgcmVkVmFsdWVbZWxlbWVudElkXSwgcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdKTsKKyAgICAgIHJlZFBlR2xvYmFsICs9IHBlRGF0YS0+cGU7CisgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCisgIH0gICAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwogCi0gICAgICAgLyogcGUgYWZ0ZXIgZmlyc3QgZ3Vlc3MgKi8KLSAgICAgICBGREthYWNFbmNfY2FsY1BlKHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcGVEYXRhLCBuQ2hhbm5lbHMpOworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiBQYXJ0IElJSTogSXRlcmF0ZSB1bnRpbCBiaXQgY29uc3RyYWludHMgYXJlIG1ldCAqLworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBpdGVyID0gMDsKKyAgd2hpbGUgKChmaXhwX2FicyhyZWRQZUdsb2JhbCAtIGRlc2lyZWRQZSkgPgorICAgICAgICAgIGZNdWx0SShGTDJGWENPTlNUX0RCTCgwLjA1ZiksIGRlc2lyZWRQZSkpICYmCisgICAgICAgICAoaXRlciA8IG1heEl0ZXIybmRHdWVzcykpIHsKKyAgICBJTlQgZGVzaXJlZFBlTm9BSEdsb2JhbDsKKyAgICBJTlQgcmVkUGVOb0FIR2xvYmFsID0gMDsKKyAgICBJTlQgY29uc3RQYXJ0Tm9BSEdsb2JhbCA9IDA7CisgICAgSU5UIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgPSAwOwogCi0gICAgICAgcmVkUGVHbG9iYWwgKz0gcGVEYXRhLT5wZTsKLSAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCi0gICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCisgICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CisgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAgICAgSU5UIHJlZFBlTm9BSCwgY29uc3RQYXJ0Tm9BSCwgbkFjdGl2ZUxpbmVzTm9BSDsKKyAgICAgICAgSU5UIG5DaGFubmVscyA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOworICAgICAgICBQRV9EQVRBICpwZURhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKIAotICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgIC8qIFBhcnQgSUlJOiBJdGVyYXRlIHVudGlsIGJpdCBjb25zdHJhaW50cyBhcmUgbWV0ICovCi0gICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgaXRlciA9IDA7Ci0gICB3aGlsZSAoKGZpeHBfYWJzKHJlZFBlR2xvYmFsIC0gZGVzaXJlZFBlKSA+IGZNdWx0SShGTDJGWENPTlNUX0RCTCgwLjA1ZiksZGVzaXJlZFBlKSkgJiYgKGl0ZXIgPCBtYXhJdGVyMm5kR3Vlc3MpKSB7CisgICAgICAgIC8qIHBlIGZvciBiYW5kcyB3aGVyZSBhdm9pZCBob2xlIGlzIGluYWN0aXZlICovCisgICAgICAgIEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlTm9BSCgKKyAgICAgICAgICAgICZyZWRQZU5vQUgsICZjb25zdFBhcnROb0FILCAmbkFjdGl2ZUxpbmVzTm9BSCwgcGVEYXRhLAorICAgICAgICAgICAgcEFoRmxhZ1tlbGVtZW50SWRdLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsCisgICAgICAgICAgICBuQ2hhbm5lbHMpOwogCi0gICAgIElOVCBkZXNpcmVkUGVOb0FIR2xvYmFsOwotICAgICBJTlQgcmVkUGVOb0FIR2xvYmFsID0gMDsKLSAgICAgSU5UIGNvbnN0UGFydE5vQUhHbG9iYWwgPSAwOwotICAgICBJTlQgbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCA9IDA7CisgICAgICAgIHJlZFBlTm9BSEdsb2JhbCArPSByZWRQZU5vQUg7CisgICAgICAgIGNvbnN0UGFydE5vQUhHbG9iYWwgKz0gY29uc3RQYXJ0Tm9BSDsKKyAgICAgICAgbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCArPSBuQWN0aXZlTGluZXNOb0FIOworICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCisgICAgfSAgIC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCiAKLSAgICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKLSAgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAvKiBDYWxjdWxhdGUgbmV3IHJlZFZhbCAuLi4gKi8KKyAgICBpZiAoZGVzaXJlZFBlIDwgcmVkUGVHbG9iYWwpIHsKKyAgICAgIC8qIG5ldyBkZXNpcmVkIHBlIHdpdGhvdXQgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBhY3RpdmUgKi8KKyAgICAgIGRlc2lyZWRQZU5vQUhHbG9iYWwgPSBkZXNpcmVkUGUgLSAocmVkUGVHbG9iYWwgLSByZWRQZU5vQUhHbG9iYWwpOwogCi0gICAgICAgICBJTlQgcmVkUGVOb0FILCBjb25zdFBhcnROb0FILCBuQWN0aXZlTGluZXNOb0FIOwotICAgICAgICAgSU5UIG5DaGFubmVscyA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOwotICAgICAgICAgUEVfREFUQSAqcGVEYXRhICAgID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGE7CisgICAgICAvKiBsaW1pdCBkZXNpcmVkUGVOb0FIIHRvIHBvc2l0aXZlIHZhbHVlcywgYXMgdGhlIFBFIGNhbiBub3QgYmVjb21lCisgICAgICAgKiBuZWdhdGl2ZSAqLworICAgICAgZGVzaXJlZFBlTm9BSEdsb2JhbCA9IGZNYXgoMCwgZGVzaXJlZFBlTm9BSEdsb2JhbCk7CiAKLSAgICAgICAgIC8qIHBlIGZvciBiYW5kcyB3aGVyZSBhdm9pZCBob2xlIGlzIGluYWN0aXZlICovCi0gICAgICAgICBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZU5vQUgoJnJlZFBlTm9BSCwgJmNvbnN0UGFydE5vQUgsICZuQWN0aXZlTGluZXNOb0FILAotICAgICAgICAgICAgICAgICAgICBwZURhdGEsIHBBaEZsYWdbZWxlbWVudElkXSwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOworICAgICAgLyogc2Vjb25kIGd1ZXNzIChvbmx5IGlmIHRoZXJlIGFyZSBiYW5kcyBsZWZ0IHdoZXJlIGF2b2lkIGhvbGUgaXMKKyAgICAgICAqIGluYWN0aXZlKSovCisgICAgICBpZiAobkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCA+IDApIHsKKyAgICAgICAgLyoKKyAgICAgICAgICBhdmdUaHJFeHAgPSAoZmxvYXQpcG93KDIuMGYsIChjb25zdFBhcnROb0FIR2xvYmFsIC0gcmVkUGVOb0FIR2xvYmFsKSAvCisgICAgICAgICAgKDQuMGYgKiBuQWN0aXZlTGluZXNOb0FIR2xvYmFsKSk7IHJlZFZhbCAgICs9IChmbG9hdClwb3coMi4wZiwKKyAgICAgICAgICAoY29uc3RQYXJ0Tm9BSEdsb2JhbCAtIGRlc2lyZWRQZU5vQUhHbG9iYWwpIC8gKDQuMGYgKgorICAgICAgICAgIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwpKSAtIGF2Z1RockV4cDsgcmVkVmFsICAgID0gbWF4KDAuMGYsIHJlZFZhbCk7CisgICAgICAgICovCiAKLSAgICAgICAgIHJlZFBlTm9BSEdsb2JhbCArPSByZWRQZU5vQUg7Ci0gICAgICAgICBjb25zdFBhcnROb0FIR2xvYmFsICs9IGNvbnN0UGFydE5vQUg7Ci0gICAgICAgICBuQWN0aXZlTGluZXNOb0FIR2xvYmFsICs9IG5BY3RpdmVMaW5lc05vQUg7Ci0gICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCi0gICAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KKyAgICAgICAgcmVkVmFsX20gPSBDYWxjUmVkVmFsUG93ZXIoY29uc3RQYXJ0Tm9BSEdsb2JhbCAtIGRlc2lyZWRQZU5vQUhHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKiBuQWN0aXZlTGluZXNOb0FIR2xvYmFsLCAmcmVkVmFsX2UpOworICAgICAgICBhdmdUaHJFeHBfbSA9IENhbGNSZWRWYWxQb3dlcihjb25zdFBhcnROb0FIR2xvYmFsIC0gcmVkUGVOb0FIR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICogbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCwgJmF2Z1RockV4cF9lKTsKKyAgICAgICAgcmVzdWx0X2UgPSBmTWF4KHJlZHVjdGlvblZhbHVlX2UsIGZNYXgocmVkVmFsX2UsIGF2Z1RockV4cF9lKSArIDEpICsgMTsKIAotICAgICAvKiBDYWxjdWxhdGUgbmV3IHJlZFZhbCAuLi4gKi8KLSAgICAgaWYoZGVzaXJlZFBlIDwgcmVkUGVHbG9iYWwpIHsKKyAgICAgICAgcmVkdWN0aW9uVmFsdWVfbSA9CisgICAgICAgICAgICBmTWF4KEZMMkZYQ09OU1RfREJMKDAuZiksCisgICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUocmVkdWN0aW9uVmFsdWVfbSwgcmVkdWN0aW9uVmFsdWVfZSAtIHJlc3VsdF9lKSArCisgICAgICAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKHJlZFZhbF9tLCByZWRWYWxfZSAtIHJlc3VsdF9lKSAtCisgICAgICAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKGF2Z1RockV4cF9tLCBhdmdUaHJFeHBfZSAtIHJlc3VsdF9lKSk7CisgICAgICAgIHJlZHVjdGlvblZhbHVlX2UgPSByZXN1bHRfZTsKIAotICAgICAgIC8qIG5ldyBkZXNpcmVkIHBlIHdpdGhvdXQgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBhY3RpdmUgKi8KLSAgICAgICBkZXNpcmVkUGVOb0FIR2xvYmFsID0gZGVzaXJlZFBlIC0gKHJlZFBlR2xvYmFsIC0gcmVkUGVOb0FIR2xvYmFsKTsKKyAgICAgIH0gLyogbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCA+IDAgKi8KKyAgICB9IGVsc2UgeworICAgICAgLyogcmVkVmFsICo9IHJlZFBlR2xvYmFsL2Rlc2lyZWRQZTsgKi8KKyAgICAgIGludCBzYzAsIHNjMTsKKyAgICAgIHJlZHVjdGlvblZhbHVlX20gPSBmTXVsdE5vcm0oCisgICAgICAgICAgcmVkdWN0aW9uVmFsdWVfbSwKKyAgICAgICAgICBmRGl2Tm9ybSgoRklYUF9EQkwpcmVkUGVHbG9iYWwsIChGSVhQX0RCTClkZXNpcmVkUGUsICZzYzApLCAmc2MxKTsKKyAgICAgIHJlZHVjdGlvblZhbHVlX2UgKz0gc2MwICsgc2MxOwogCi0gICAgICAgLyogbGltaXQgZGVzaXJlZFBlTm9BSCB0byBwb3NpdGl2ZSB2YWx1ZXMsIGFzIHRoZSBQRSBjYW4gbm90IGJlY29tZSBuZWdhdGl2ZSAqLwotICAgICAgIGRlc2lyZWRQZU5vQUhHbG9iYWwgPSBGREttYXgoMCxkZXNpcmVkUGVOb0FIR2xvYmFsKTsKKyAgICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDsgZWxlbWVudElkIDwgbkVsZW1lbnRzOyBlbGVtZW50SWQrKykgeworICAgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAgICAgICBGREthYWNFbmNfcmVzZXRBSEZsYWdzKHBBaEZsYWdbZWxlbWVudElkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsKTsKKyAgICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCisgICAgICB9ICAgLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KKyAgICB9CiAKLSAgICAgICAvKiBzZWNvbmQgZ3Vlc3MgKG9ubHkgaWYgdGhlcmUgYXJlIGJhbmRzIGxlZnQgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZSkqLwotICAgICAgIGlmIChuQWN0aXZlTGluZXNOb0FIR2xvYmFsID4gMCkgewotICAgICAgICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKLSAgICAgICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7Ci0gICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICByZWRWYWwgKz0gKCAyIF4gKCAoY29uc3RQYXJ0Tm9BSEdsb2JhbC1kZXNpcmVkUGVOb0FIR2xvYmFsKSAvIChpbnZSZWRFeHAqbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCkgKQotICAgICAgICAgICAgICAgICAgICAgICAtIDIgXiAoIChjb25zdFBhcnROb0FIR2xvYmFsLXJlZFBlTm9BSEdsb2JhbCkgLyAoaW52UmVkRXhwKm5BY3RpdmVMaW5lc05vQUhHbG9iYWwpICkgKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgaW50IHNjYWxlMCA9IDA7Ci0gICAgICAgICAgICAgaW50IHNjYWxlMSA9IDA7CisgICAgcmVkUGVHbG9iYWwgPSAwOworICAgIC8qIENhbGN1bGF0ZSBuZXcgcmVkVmFsJ3MgUEUuLi4gKi8KKyAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7IGVsZW1lbnRJZCA8IG5FbGVtZW50czsgZWxlbWVudElkKyspIHsKKyAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgeworICAgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CisgICAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwogCi0gICAgICAgICAgICAgRklYUF9EQkwgdG1wMCA9IENhbGNSZWRWYWxQb3dlciggY29uc3RQYXJ0Tm9BSEdsb2JhbC1kZXNpcmVkUGVOb0FIR2xvYmFsLCA0Km5BY3RpdmVMaW5lc05vQUhHbG9iYWwsICZzY2FsZTAgKTsKLSAgICAgICAgICAgICBGSVhQX0RCTCB0bXAxID0gQ2FsY1JlZFZhbFBvd2VyKCBjb25zdFBhcnROb0FIR2xvYmFsLXJlZFBlTm9BSEdsb2JhbCwgNCpuQWN0aXZlTGluZXNOb0FIR2xvYmFsLCAmc2NhbGUxICk7CisgICAgICAgIC8qIHJlZHVjZSB0aHJlc2hvbGRzICovCisgICAgICAgIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzQ0JSKAorICAgICAgICAgICAgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwKKyAgICAgICAgICAgIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcEFoRmxhZ1tlbGVtZW50SWRdLAorICAgICAgICAgICAgcFRockV4cFtlbGVtZW50SWRdLCBuQ2hhbm5lbHMsIHJlZHVjdGlvblZhbHVlX20sIHJlZHVjdGlvblZhbHVlX2UpOwogCi0gICAgICAgICAgICAgaW50IHNjYWxNaW4gPSBGREttaW4oc2NhbGUwLCBzY2FsZTEpLTE7CisgICAgICAgIC8qIHBlIGFmdGVyIHNlY29uZCBndWVzcyAqLworICAgICAgICBGREthYWNFbmNfY2FsY1BlKHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwZURhdGEsIG5DaGFubmVscyk7CisgICAgICAgIHJlZFBlR2xvYmFsICs9IHBlRGF0YS0+cGU7CiAKLSAgICAgICAgICAgICB0bXAwID0gc2NhbGVWYWx1ZSh0bXAwLChzY2FsTWluLXNjYWxlMCkpIC0gc2NhbGVWYWx1ZSh0bXAxLChzY2FsTWluLXNjYWxlMSkpOwotICAgICAgICAgICAgIHNjYWxlMCA9IHNjYWxNaW47CisgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KKyAgICB9ICAgLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KIAotICAgICAgICAgICAgIC8qIG9sZCByZWR1Y3Rpb24gdmFsdWUgKi8KLSAgICAgICAgICAgICB0bXAxID0gcmVkVmFsdWVbZWxlbWVudElkXTsKLSAgICAgICAgICAgICBzY2FsZTEgPSByZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF07CisgICAgaXRlcisrOworICB9IC8qIEVPRiB3aGlsZSAqLwogCi0gICAgICAgICAgICAgc2NhbE1pbiA9IGZpeE1pbihzY2FsZTAsc2NhbGUxKS0xOwotCi0gICAgICAgICAgICAgLyogc3VtIHVwIG9sZCBhbmQgbmV3IHJlZHVjdGlvbiB2YWx1ZSAqLwotICAgICAgICAgICAgIHJlZFZhbHVlW2VsZW1lbnRJZF0gPSBzY2FsZVZhbHVlKHRtcDAsKHNjYWxNaW4tc2NhbGUwKSkgKyBzY2FsZVZhbHVlKHRtcDEsKHNjYWxNaW4tc2NhbGUxKSk7Ci0gICAgICAgICAgICAgcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdID0gc2NhbE1pbjsKLQotICAgICAgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KLSAgICAgICAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KLSAgICAgICB9IC8qIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgPiAwICovCi0gICAgIH0KLSAgICAgZWxzZSB7Ci0gICAgICAgIC8qIGRlc2lyZWRQZSA+PSByZWRQZUdsb2JhbCAqLwotICAgICAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewotICAgICAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewotCi0gICAgICAgICAgICBJTlQgcmVkVmFsX3NjYWxlID0gMDsKLSAgICAgICAgICAgIEZJWFBfREJMIHRtcCA9IGZEaXZOb3JtKChGSVhQX0RCTClyZWRQZUdsb2JhbCwgKEZJWFBfREJMKWRlc2lyZWRQZSwgJnJlZFZhbF9zY2FsZSk7Ci0KLSAgICAgICAgICAgIC8qIHJlZFZhbCAqPSByZWRQZUdsb2JhbC9kZXNpcmVkUGU7ICovCi0gICAgICAgICAgICByZWRWYWx1ZVtlbGVtZW50SWRdID0gZk11bHQocmVkVmFsdWVbZWxlbWVudElkXSwgdG1wKTsKLSAgICAgICAgICAgIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSAtPSByZWRWYWxfc2NhbGU7Ci0KLSAgICAgICAgICAgIEZES2FhY0VuY19yZXNldEFIRmxhZ3MocEFoRmxhZ1tlbGVtZW50SWRdLCBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsKTsKLSAgICAgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KLSAgICAgICAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwotICAgICB9Ci0KLSAgICAgcmVkUGVHbG9iYWwgPSAwOwotICAgICAvKiBDYWxjdWxhdGUgbmV3IHJlZFZhbCdzIFBFLi4uICovCi0gICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7Ci0gICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7Ci0KLSAgICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKLSAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwotCi0gICAgICAgICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLwotICAgICAgICAgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNDQlIocWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBwQWhGbGFnW2VsZW1lbnRJZF0sIHBUaHJFeHBbZWxlbWVudElkXSwgbkNoYW5uZWxzLCByZWRWYWx1ZVtlbGVtZW50SWRdLCByZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0pOwotCi0gICAgICAgICAvKiBwZSBhZnRlciBzZWNvbmQgZ3Vlc3MgKi8KLSAgICAgICAgIEZES2FhY0VuY19jYWxjUGUocHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwZURhdGEsIG5DaGFubmVscyk7Ci0gICAgICAgICByZWRQZUdsb2JhbCArPSBwZURhdGEtPnBlOwotCi0gICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCi0gICAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KLQotICAgICBpdGVyKys7Ci0gICB9IC8qIEVPRiB3aGlsZSAqLwotCi0KLSAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgIC8qIFBhcnQgSVY6IGlmIHN0aWxsIHJlcXVpcmVkLCBmdXJ0aGVyIHJlZHVjZSBjb25zdHJhaW50cyAgKi8KLSAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgIC8qICAgICAgICAgICAgICAgICAgMS4wKiAgICAgICAgMS4xNSogICAgICAgMS4yMCoKLSAgICAqICAgICAgICAgICAgICAgZGVzaXJlZFBlICAgZGVzaXJlZFBlICAgZGVzaXJlZFBlCi0gICAgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8Ci0gICAgKiAuLi5YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh8ICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8WFhYWFhYWFhYWFguLi4KLSAgICAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHxYWFhYWFhYWFhYWHwKLSAgICAqICAgICAgICAgICAgLS0tIEEgLS0tICAgICAgICAgIHwgLS0tIEIgLS0tIHwgLS0tIEMgLS0tCi0gICAgKgotICAgICogKFgpOiByZWRQZUdsb2JhbAotICAgICogKEEpOiBGREthYWNFbmNfY29ycmVjdFRocmVzaCgpCi0gICAgKiAoQik6IEZES2FhY0VuY19hbGxvd01vcmVIb2xlcygpCi0gICAgKiAoQyk6IEZES2FhY0VuY19yZWR1Y2VNaW5TbnIoKQorICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIFBhcnQgSVY6IGlmIHN0aWxsIHJlcXVpcmVkLCBmdXJ0aGVyIHJlZHVjZSBjb25zdHJhaW50cyAgKi8KKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiAgICAgICAgICAgICAgICAgIDEuMCogICAgICAgIDEuMTUqICAgICAgIDEuMjAqCisgICAqICAgICAgICAgICAgICAgZGVzaXJlZFBlICAgZGVzaXJlZFBlICAgZGVzaXJlZFBlCisgICAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAgICogLi4uWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYfCAgICAgICAgICAgfAorICAgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8WFhYWFhYWFhYWFguLi4KKyAgICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfFhYWFhYWFhYWFhYfAorICAgKiAgICAgICAgICAgIC0tLSBBIC0tLSAgICAgICAgICB8IC0tLSBCIC0tLSB8IC0tLSBDIC0tLQorICAgKgorICAgKiAoWCk6IHJlZFBlR2xvYmFsCisgICAqIChBKTogRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2goKQorICAgKiAoQik6IEZES2FhY0VuY19hbGxvd01vcmVIb2xlcygpCisgICAqIChDKTogRkRLYWFjRW5jX3JlZHVjZU1pblNucigpCiAgICAqLwogCi0gICAvKiBjb3JyZWN0IHRocmVzaG9sZHMgdG8gZ2V0IGNsb3NlciB0byB0aGUgZGVzaXJlZCBwZSAqLwotICAgaWYgKCByZWRQZUdsb2JhbCA+IGRlc2lyZWRQZSApIHsKLSAgICAgRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2goY20sIHFjRWxlbWVudCwgcHN5T3V0RWxlbWVudCwgcEFoRmxhZywgcFRockV4cCwgcmVkVmFsdWUsIHJlZFZhbFNjYWxpbmcsCi0gICAgICAgICAgICAgICAgICAgZGVzaXJlZFBlIC0gcmVkUGVHbG9iYWwsIHByb2Nlc3NFbGVtZW50cywgZWxlbWVudE9mZnNldCk7CisgIC8qIGNvcnJlY3QgdGhyZXNob2xkcyB0byBnZXQgY2xvc2VyIHRvIHRoZSBkZXNpcmVkIHBlICovCisgIGlmIChyZWRQZUdsb2JhbCA+IGRlc2lyZWRQZSkgeworICAgIEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKGNtLCBxY0VsZW1lbnQsIHBzeU91dEVsZW1lbnQsIHBBaEZsYWcsIHBUaHJFeHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uVmFsdWVfbSwgcmVkdWN0aW9uVmFsdWVfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkUGUgLSByZWRQZUdsb2JhbCwgcHJvY2Vzc0VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRPZmZzZXQpOwogCi0gICAgIC8qIHVwZGF0ZSBQRSAqLwotICAgICByZWRQZUdsb2JhbCA9IDA7Ci0gICAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7Ci0gICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgLyogdXBkYXRlIFBFICovCisgICAgcmVkUGVHbG9iYWwgPSAwOworICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDsgZWxlbWVudElkIDwgbkVsZW1lbnRzOyBlbGVtZW50SWQrKykgeworICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKKyAgICAgICAgUEVfREFUQSAqcGVEYXRhID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGE7CiAKLSAgICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKLSAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOworICAgICAgICAvKiBwZSBhZnRlciBjb3JyZWN0VGhyZXNoICovCisgICAgICAgIEZES2FhY0VuY19jYWxjUGUocHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBlRGF0YSwgbkNoYW5uZWxzKTsKKyAgICAgICAgcmVkUGVHbG9iYWwgKz0gcGVEYXRhLT5wZTsKIAotICAgICAgICAgLyogcGUgYWZ0ZXIgY29ycmVjdFRocmVzaCAqLwotICAgICAgICAgRkRLYWFjRW5jX2NhbGNQZShwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBlRGF0YSwgbkNoYW5uZWxzKTsKLSAgICAgICAgIHJlZFBlR2xvYmFsICs9IHBlRGF0YS0+cGU7CisgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KKyAgICB9ICAgLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KKyAgfQogCi0gICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCi0gICAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KLSAgIH0KKyAgaWYgKHJlZFBlR2xvYmFsID4gZGVzaXJlZFBlKSB7CisgICAgLyogcmVkdWNlIHBlIGJ5IHJlZHVjaW5nIG1pblNuciByZXF1aXJlbWVudHMgKi8KKyAgICBGREthYWNFbmNfcmVkdWNlTWluU25yKAorICAgICAgICBjbSwgcWNFbGVtZW50LCBwc3lPdXRFbGVtZW50LCBwQWhGbGFnLAorICAgICAgICAoZk11bHRJKEZMMkZYQ09OU1RfREJMKDAuMTVmKSwgZGVzaXJlZFBlKSArIGRlc2lyZWRQZSksICZyZWRQZUdsb2JhbCwKKyAgICAgICAgcHJvY2Vzc0VsZW1lbnRzLCBlbGVtZW50T2Zmc2V0KTsKIAotICAgaWYgKCByZWRQZUdsb2JhbCA+IGRlc2lyZWRQZSApIHsKLSAgICAgLyogcmVkdWNlIHBlIGJ5IHJlZHVjaW5nIG1pblNuciByZXF1aXJlbWVudHMgKi8KLSAgICAgRkRLYWFjRW5jX3JlZHVjZU1pblNucihjbSwgcWNFbGVtZW50LCBwc3lPdXRFbGVtZW50LCBwQWhGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4xNWYpLGRlc2lyZWRQZSkgKyBkZXNpcmVkUGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWRQZUdsb2JhbCwgcHJvY2Vzc0VsZW1lbnRzLCBlbGVtZW50T2Zmc2V0KTsKLQotICAgICAvKiByZWR1Y2UgcGUgYnkgYWxsb3dpbmcgYWRkaXRpb25hbCBzcGVjdHJhbCBob2xlcyAqLwotICAgICBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMoY20sIHFjRWxlbWVudCwgcHN5T3V0RWxlbWVudCwgQWRqVGhyU3RhdGVFbGVtZW50LCBwQWhGbGFnLAotICAgICAgICAgICAgICAgICAgICBkZXNpcmVkUGUsIHJlZFBlR2xvYmFsLCBwcm9jZXNzRWxlbWVudHMsIGVsZW1lbnRPZmZzZXQpOwotICAgfQotCisgICAgLyogcmVkdWNlIHBlIGJ5IGFsbG93aW5nIGFkZGl0aW9uYWwgc3BlY3RyYWwgaG9sZXMgKi8KKyAgICBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMoY20sIHFjRWxlbWVudCwgcHN5T3V0RWxlbWVudCwgQWRqVGhyU3RhdGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWhGbGFnLCBkZXNpcmVkUGUsIHJlZFBlR2xvYmFsLCBwcm9jZXNzRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRPZmZzZXQpOworICB9CiB9CiAKIC8qIHNpbWlsYXIgdG8gRkRLYWFjRW5jX2FkYXB0VGhyZXNob2xkc1RvUGUoKSwgZm9yICBWQlItbW9kZSAqLwotdm9pZCBGREthYWNFbmNfQWRhcHRUaHJlc2hvbGRzVkJSKFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogQWRqVGhyU3RhdGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUT09MU0lORk8gKnRvb2xzSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRV9EQVRBICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKLXsKLSAgIFVDSEFSICAgICgqcEFoRmxhZylbTUFYX0dST1VQRURfU0ZCXTsKLSAgIEZJWFBfREJMICgqcFRockV4cClbTUFYX0dST1VQRURfU0ZCXTsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19BZGFwdFRocmVzaG9sZHNWQlIoCisgICAgUUNfT1VUX0NIQU5ORUwgKmNvbnN0IHFjT3V0Q2hhbm5lbFsoMildLAorICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbm5lbFsoMildLAorICAgIEFUU19FTEVNRU5UICpjb25zdCBBZGpUaHJTdGF0ZUVsZW1lbnQsCisgICAgY29uc3Qgc3RydWN0IFRPT0xTSU5GTyAqY29uc3QgdG9vbHNJbmZvLCBjb25zdCBJTlQgbkNoYW5uZWxzKSB7CisgIFVDSEFSKCpwQWhGbGFnKVtNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX0RCTCgqcFRockV4cClbTUFYX0dST1VQRURfU0ZCXTsKIAotICAgLyogYWxsb2NhdGUgc2NyYXRjaCBtZW1vcnkgKi8KLSAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChfcEFoRmxhZywgVUNIQVIsICgyKSpNQVhfR1JPVVBFRF9TRkIpCi0gICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoX3BUaHJFeHAsIEZJWFBfREJMLCAoMikqTUFYX0dST1VQRURfU0ZCKQotICAgcEFoRmxhZyA9IChVQ0hBUigqKVtNQVhfR1JPVVBFRF9TRkJdKV9wQWhGbGFnOwotICAgcFRockV4cCA9IChGSVhQX0RCTCgqKVtNQVhfR1JPVVBFRF9TRkJdKV9wVGhyRXhwOworICAvKiBhbGxvY2F0ZSBzY3JhdGNoIG1lbW9yeSAqLworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoX3BBaEZsYWcsIFVDSEFSLCAoMikgKiBNQVhfR1JPVVBFRF9TRkIpCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChfcFRockV4cCwgRklYUF9EQkwsICgyKSAqIE1BWF9HUk9VUEVEX1NGQikKKyAgcEFoRmxhZyA9IChVQ0hBUigqKVtNQVhfR1JPVVBFRF9TRkJdKV9wQWhGbGFnOworICBwVGhyRXhwID0gKEZJWFBfREJMKCopW01BWF9HUk9VUEVEX1NGQl0pX3BUaHJFeHA7CiAKLSAgIC8qIHRocmVzaG9sZHMgdG8gdGhlIHBvd2VyIG9mIHJlZEV4cCAqLwotICAgRkRLYWFjRW5jX2NhbGNUaHJlc2hFeHAocFRockV4cCwgcWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOworICAvKiB0aHJlc2hvbGRzIHRvIHRoZSBwb3dlciBvZiByZWRFeHAgKi8KKyAgRkRLYWFjRW5jX2NhbGNUaHJlc2hFeHAocFRockV4cCwgcWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOwogCi0gICAvKiBsb3dlciB0aGUgbWluU25yIHJlcXVpcmVtZW50cyBmb3IgbG93IGVuZXJnaWVzIGNvbXBhcmVkIHRvIHRoZSBhdmVyYWdlCi0gICAgICBlbmVyZ3kgaW4gdGhpcyBmcmFtZSAqLwotICAgRkRLYWFjRW5jX2FkYXB0TWluU25yKHFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgJkFkalRoclN0YXRlRWxlbWVudC0+bWluU25yQWRhcHRQYXJhbSwgbkNoYW5uZWxzKTsKKyAgLyogbG93ZXIgdGhlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGxvdyBlbmVyZ2llcyBjb21wYXJlZCB0byB0aGUgYXZlcmFnZQorICAgICBlbmVyZ3kgaW4gdGhpcyBmcmFtZSAqLworICBGREthYWNFbmNfYWRhcHRNaW5TbnIocWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+bWluU25yQWRhcHRQYXJhbSwgbkNoYW5uZWxzKTsKIAotICAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLwotICAgRkRLYWFjRW5jX2luaXRBdm9pZEhvbGVGbGFnKHFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgcEFoRmxhZywgdG9vbHNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCBwZURhdGEsICZBZGpUaHJTdGF0ZUVsZW1lbnQtPmFoUGFyYW0pOworICAvKiBpbml0IGFoRmxhZyAoMDogbm8gYWggbmVjZXNzYXJ5LCAxOiBhaCBwb3NzaWJsZSwgMjogYWggYWN0aXZlICovCisgIEZES2FhY0VuY19pbml0QXZvaWRIb2xlRmxhZyhxY091dENoYW5uZWwsIHBzeU91dENoYW5uZWwsIHBBaEZsYWcsIHRvb2xzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgJkFkalRoclN0YXRlRWxlbWVudC0+YWhQYXJhbSk7CiAKLSAgIC8qIHJlZHVjZSB0aHJlc2hvbGRzICovCi0gICBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc1ZCUihxY091dENoYW5uZWwsIHBzeU91dENoYW5uZWwsIHBBaEZsYWcsIHBUaHJFeHAsIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT52YnJRdWFsRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVPbGQpOworICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLworICBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc1ZCUihxY091dENoYW5uZWwsIHBzeU91dENoYW5uZWwsIHBBaEZsYWcsIHBUaHJFeHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgQWRqVGhyU3RhdGVFbGVtZW50LT52YnJRdWFsRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVPbGQpOwogCi0gICAvKiBmcmVlIHNjcmF0Y2ggbWVtb3J5ICovCi0gICBDX0FMTE9DX1NDUkFUQ0hfRU5EKF9wVGhyRXhwLCBGSVhQX0RCTCwgKDIpKk1BWF9HUk9VUEVEX1NGQikKLSAgIENfQUxMT0NfU0NSQVRDSF9FTkQoX3BBaEZsYWcsIFVDSEFSLCAoMikqTUFYX0dST1VQRURfU0ZCKQorICAvKiBmcmVlIHNjcmF0Y2ggbWVtb3J5ICovCisgIENfQUxMT0NfU0NSQVRDSF9FTkQoX3BUaHJFeHAsIEZJWFBfREJMLCAoMikgKiBNQVhfR1JPVVBFRF9TRkIpCisgIENfQUxMT0NfU0NSQVRDSF9FTkQoX3BBaEZsYWcsIFVDSEFSLCAoMikgKiBNQVhfR1JPVVBFRF9TRkIpCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY0JpdFNhdmUKQEAgLTE5NzgsMjAgKzIyMjYsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBIaWdoICAgICAgbWF4Qml0cmVzCiAqLwogc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jYWxjQml0U2F2ZShGSVhQX0RCTCBmaWxsTGV2ZWwsCi0gICAgY29uc3QgRklYUF9EQkwgY2xpcExvdywKLSAgICBjb25zdCBGSVhQX0RCTCBjbGlwSGlnaCwKLSAgICBjb25zdCBGSVhQX0RCTCBtaW5CaXRTYXZlLAotICAgIGNvbnN0IEZJWFBfREJMIG1heEJpdFNhdmUsCi0gICAgY29uc3QgRklYUF9EQkwgYml0c2F2ZV9zbG9wZSkKLXsKLSAgICBGSVhQX0RCTCBiaXRzYXZlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBjbGlwTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBjbGlwSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgbWluQml0U2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgbWF4Qml0U2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYml0c2F2ZV9zbG9wZSkgeworICBGSVhQX0RCTCBiaXRzYXZlOwogCi0gICAgZmlsbExldmVsID0gZml4TWF4KGZpbGxMZXZlbCwgY2xpcExvdyk7Ci0gICAgZmlsbExldmVsID0gZml4TWluKGZpbGxMZXZlbCwgY2xpcEhpZ2gpOworICBmaWxsTGV2ZWwgPSBmaXhNYXgoZmlsbExldmVsLCBjbGlwTG93KTsKKyAgZmlsbExldmVsID0gZml4TWluKGZpbGxMZXZlbCwgY2xpcEhpZ2gpOwogCi0gICAgYml0c2F2ZSA9IG1heEJpdFNhdmUgLSBmTXVsdCgoZmlsbExldmVsLWNsaXBMb3cpLCBiaXRzYXZlX3Nsb3BlKTsKKyAgYml0c2F2ZSA9IG1heEJpdFNhdmUgLSBmTXVsdCgoZmlsbExldmVsIC0gY2xpcExvdyksIGJpdHNhdmVfc2xvcGUpOwogCi0gICAgcmV0dXJuIChiaXRzYXZlKTsKKyAgcmV0dXJuIChiaXRzYXZlKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMDE3LDIzICsyMjY0LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBMb3cKICovCiBzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NhbGNCaXRTcGVuZChGSVhQX0RCTCBmaWxsTGV2ZWwsCi0gICAgY29uc3QgRklYUF9EQkwgY2xpcExvdywKLSAgICBjb25zdCBGSVhQX0RCTCBjbGlwSGlnaCwKLSAgICBjb25zdCBGSVhQX0RCTCBtaW5CaXRTcGVuZCwKLSAgICBjb25zdCBGSVhQX0RCTCBtYXhCaXRTcGVuZCwKLSAgICBjb25zdCBGSVhQX0RCTCBiaXRzcGVuZF9zbG9wZSkKLXsKLSAgICBGSVhQX0RCTCBiaXRzcGVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGNsaXBMb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBjbGlwSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIG1pbkJpdFNwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgbWF4Qml0U3BlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBiaXRzcGVuZF9zbG9wZSkgeworICBGSVhQX0RCTCBiaXRzcGVuZDsKIAotICAgIGZpbGxMZXZlbCA9IGZpeE1heChmaWxsTGV2ZWwsIGNsaXBMb3cpOwotICAgIGZpbGxMZXZlbCA9IGZpeE1pbihmaWxsTGV2ZWwsIGNsaXBIaWdoKTsKKyAgZmlsbExldmVsID0gZml4TWF4KGZpbGxMZXZlbCwgY2xpcExvdyk7CisgIGZpbGxMZXZlbCA9IGZpeE1pbihmaWxsTGV2ZWwsIGNsaXBIaWdoKTsKIAotICAgIGJpdHNwZW5kID0gbWluQml0U3BlbmQgKyBmTXVsdChmaWxsTGV2ZWwtY2xpcExvdywgYml0c3BlbmRfc2xvcGUpOworICBiaXRzcGVuZCA9IG1pbkJpdFNwZW5kICsgZk11bHQoZmlsbExldmVsIC0gY2xpcExvdywgYml0c3BlbmRfc2xvcGUpOwogCi0gICAgcmV0dXJuIChiaXRzcGVuZCk7CisgIHJldHVybiAoYml0c3BlbmQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2FkanVzdFBlTWluTWF4KCkKQEAgLTIwNDMsNTIgKzIyODgsNDYgQEAKICAgb3V0cHV0OiAgICAgICBhZGp1c3RlZCBwZU1pbi9wZU1heAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19hZGp1c3RQZU1pbk1heChjb25zdCBJTlQgY3VyclBlLAotICAgIElOVCAgICAgICpwZU1pbiwKLSAgICBJTlQgICAgICAqcGVNYXgpCi17Ci0gIEZJWFBfREJMIG1pbkZhY0hpID0gRkwyRlhDT05TVF9EQkwoMC4zZiksIG1heEZhY0hpID0gKEZJWFBfREJMKU1BWFZBTF9EQkwsIG1pbkZhY0xvID0gRkwyRlhDT05TVF9EQkwoMC4xNGYpLCBtYXhGYWNMbyA9IEZMMkZYQ09OU1RfREJMKDAuMDdmKTsKLSAgICBJTlQgZGlmZjsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19hZGp1c3RQZU1pbk1heChjb25zdCBJTlQgY3VyclBlLCBJTlQgKnBlTWluLCBJTlQgKnBlTWF4KSB7CisgIEZJWFBfREJMIG1pbkZhY0hpID0gRkwyRlhDT05TVF9EQkwoMC4zZiksIG1heEZhY0hpID0gKEZJWFBfREJMKU1BWFZBTF9EQkwsCisgICAgICAgICAgIG1pbkZhY0xvID0gRkwyRlhDT05TVF9EQkwoMC4xNGYpLCBtYXhGYWNMbyA9IEZMMkZYQ09OU1RfREJMKDAuMDdmKTsKKyAgSU5UIGRpZmY7CiAKLSAgICBJTlQgbWluRGlmZl9maXggPSBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4xNjY2NjY2NjY3ZiksIGN1cnJQZSk7CisgIElOVCBtaW5EaWZmX2ZpeCA9IGZNdWx0SShGTDJGWENPTlNUX0RCTCgwLjE2NjY2NjY2NjdmKSwgY3VyclBlKTsKIAotICAgIGlmIChjdXJyUGUgPiAqcGVNYXgpCi0gICAgewotICAgICAgICBkaWZmID0gKGN1cnJQZS0qcGVNYXgpIDsKLSAgICAgICAgKnBlTWluICs9IGZNdWx0SShtaW5GYWNIaSxkaWZmKTsKLSAgICAgICAgKnBlTWF4ICs9IGZNdWx0SShtYXhGYWNIaSxkaWZmKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY3VyclBlIDwgKnBlTWluKQotICAgIHsKLSAgICAgICAgZGlmZiA9ICgqcGVNaW4tY3VyclBlKSA7Ci0gICAgICAgICpwZU1pbiAtPSBmTXVsdEkobWluRmFjTG8sZGlmZik7Ci0gICAgICAgICpwZU1heCAtPSBmTXVsdEkobWF4RmFjTG8sZGlmZik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwZU1pbiArPSBmTXVsdEkobWluRmFjSGksIChjdXJyUGUgLSAqcGVNaW4pKTsKLSAgICAgICAgKnBlTWF4IC09IGZNdWx0SShtYXhGYWNMbywgKCpwZU1heCAtIGN1cnJQZSkpOwotICAgIH0KKyAgaWYgKGN1cnJQZSA+ICpwZU1heCkgeworICAgIGRpZmYgPSAoY3VyclBlIC0gKnBlTWF4KTsKKyAgICAqcGVNaW4gKz0gZk11bHRJKG1pbkZhY0hpLCBkaWZmKTsKKyAgICAqcGVNYXggKz0gZk11bHRJKG1heEZhY0hpLCBkaWZmKTsKKyAgfSBlbHNlIGlmIChjdXJyUGUgPCAqcGVNaW4pIHsKKyAgICBkaWZmID0gKCpwZU1pbiAtIGN1cnJQZSk7CisgICAgKnBlTWluIC09IGZNdWx0SShtaW5GYWNMbywgZGlmZik7CisgICAgKnBlTWF4IC09IGZNdWx0SShtYXhGYWNMbywgZGlmZik7CisgIH0gZWxzZSB7CisgICAgKnBlTWluICs9IGZNdWx0SShtaW5GYWNIaSwgKGN1cnJQZSAtICpwZU1pbikpOworICAgICpwZU1heCAtPSBmTXVsdEkobWF4RmFjTG8sICgqcGVNYXggLSBjdXJyUGUpKTsKKyAgfQogCi0gICAgaWYgKCgqcGVNYXggLSAqcGVNaW4pIDwgbWluRGlmZl9maXgpCi0gICAgewotICAgICAgICBJTlQgcGVNYXhfZml4ID0gKnBlTWF4LCBwZU1pbl9maXggPSAqcGVNaW47Ci0gICAgICAgIEZJWFBfREJMIHBhcnRMb19maXgsIHBhcnRIaV9maXg7CisgIGlmICgoKnBlTWF4IC0gKnBlTWluKSA8IG1pbkRpZmZfZml4KSB7CisgICAgSU5UIHBlTWF4X2ZpeCA9ICpwZU1heCwgcGVNaW5fZml4ID0gKnBlTWluOworICAgIEZJWFBfREJMIHBhcnRMb19maXgsIHBhcnRIaV9maXg7CiAKLSAgICAgICAgcGFydExvX2ZpeCA9IChGSVhQX0RCTClmaXhNYXgoMCwgY3VyclBlIC0gcGVNaW5fZml4KTsKLSAgICAgICAgcGFydEhpX2ZpeCA9IChGSVhQX0RCTClmaXhNYXgoMCwgcGVNYXhfZml4IC0gY3VyclBlKTsKKyAgICBwYXJ0TG9fZml4ID0gKEZJWFBfREJMKWZpeE1heCgwLCBjdXJyUGUgLSBwZU1pbl9maXgpOworICAgIHBhcnRIaV9maXggPSAoRklYUF9EQkwpZml4TWF4KDAsIHBlTWF4X2ZpeCAtIGN1cnJQZSk7CiAKLSAgICAgICAgcGVNYXhfZml4ID0gKElOVCkoY3VyclBlICsgZk11bHRJKGZEaXZOb3JtKHBhcnRIaV9maXgsIChwYXJ0TG9fZml4K3BhcnRIaV9maXgpKSwgbWluRGlmZl9maXgpKTsKLSAgICAgICAgcGVNaW5fZml4ID0gKElOVCkoY3VyclBlIC0gZk11bHRJKGZEaXZOb3JtKHBhcnRMb19maXgsIChwYXJ0TG9fZml4K3BhcnRIaV9maXgpKSwgbWluRGlmZl9maXgpKTsKLSAgICAgICAgcGVNaW5fZml4ID0gZml4TWF4KDAsIHBlTWluX2ZpeCk7CisgICAgcGVNYXhfZml4ID0KKyAgICAgICAgKElOVCkoY3VyclBlICsgZk11bHRJKGZEaXZOb3JtKHBhcnRIaV9maXgsIChwYXJ0TG9fZml4ICsgcGFydEhpX2ZpeCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRGlmZl9maXgpKTsKKyAgICBwZU1pbl9maXggPQorICAgICAgICAoSU5UKShjdXJyUGUgLSBmTXVsdEkoZkRpdk5vcm0ocGFydExvX2ZpeCwgKHBhcnRMb19maXggKyBwYXJ0SGlfZml4KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EaWZmX2ZpeCkpOworICAgIHBlTWluX2ZpeCA9IGZpeE1heCgwLCBwZU1pbl9maXgpOwogCi0gICAgICAgICpwZU1heCA9IHBlTWF4X2ZpeDsKLSAgICAgICAgKnBlTWluID0gcGVNaW5fZml4OwotICAgIH0KKyAgICAqcGVNYXggPSBwZU1heF9maXg7CisgICAgKnBlTWluID0gcGVNaW5fZml4OworICB9CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBmdW5jdGlvbm5hbWU6IEJpdHJlc0NhbGNCaXRGYWMKQEAgLTIxMTUsMjA2ICsyMzU0LDIyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVtaW4KICovCiAKLXN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfYml0cmVzQ2FsY0JpdEZhYyhjb25zdCBJTlQgICAgICAgYml0cmVzQml0cywKLSAgICBjb25zdCBJTlQgICAgICAgIG1heEJpdHJlc0JpdHMsCi0gICAgY29uc3QgSU5UICAgICAgICBwZSwKLSAgICBjb25zdCBJTlQgICAgICAgIGxhc3RXaW5kb3dTZXF1ZW5jZSwKLSAgICBjb25zdCBJTlQgICAgICAgIGF2Z0JpdHMsCi0gICAgY29uc3QgRklYUF9EQkwgICBtYXhCaXRGYWMsCi0gICAgQURKX1RIUl9TVEFURSAgICpBZGpUaHIsCi0gICAgQVRTX0VMRU1FTlQgICAgICphZGpUaHJDaGFuKQotewotICAgIEJSRVNfUEFSQU0gKmJyZXNQYXJhbTsKLSAgICBJTlQgcGV4Owordm9pZCBGREthYWNFbmNfYml0cmVzQ2FsY0JpdEZhYyhjb25zdCBJTlQgYml0cmVzQml0cywgY29uc3QgSU5UIG1heEJpdHJlc0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBwZSwgY29uc3QgSU5UIGxhc3RXaW5kb3dTZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGF2Z0JpdHMsIGNvbnN0IEZJWFBfREJMIG1heEJpdEZhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQURKX1RIUl9TVEFURSAqY29uc3QgQWRqVGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCAqY29uc3QgYWRqVGhyQ2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBCaXRyZXNGYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3QgcEJpdHJlc0ZhY19lKSB7CisgIGNvbnN0IEJSRVNfUEFSQU0gKmJyZXNQYXJhbTsKKyAgSU5UIHBleDsKKyAgRklYUF9EQkwgZmlsbExldmVsOworICBJTlQgZmlsbExldmVsX2UgPSAwOwogCi0gICAgSU5UIHFtaW4sIHFiciwgcWJyZXMsIHFtYnI7Ci0gICAgRklYUF9EQkwgYml0U2F2ZSwgYml0U3BlbmQ7CisgIEZJWFBfREJMIGJpdHJlc0ZhYzsKKyAgSU5UIGJpdHJlc0ZhY19lOwogCi0gICAgRklYUF9EQkwgYml0cmVzRmFjX2ZpeCwgdG1wX2NzdCwgdG1wX2ZpeDsKLSAgICBGSVhQX0RCTCBwZV9wZXJzLCBiaXRzX3JhdGlvLCBtYXhCclZhbDsKLSAgICBGSVhQX0RCTCBiaXRzYXZlX3Nsb3BlLCBiaXRzcGVuZF9zbG9wZSwgbWF4Qml0RmFjX3RtcDsKLSAgICBGSVhQX0RCTCBmaWxsTGV2ZWxfZml4ID0gKEZJWFBfREJMKTB4N2ZmZmZmZmY7Ci0gICAgRklYUF9EQkwgVU5JVFkgPSAoRklYUF9EQkwpMHg3ZmZmZmZmZjsKLSAgICBGSVhQX0RCTCBQT0lOVDcgPSAoRklYUF9EQkwpMHg1OTk5OTk5QTsKKyAgRklYUF9EQkwgYml0U2F2ZSwgYml0U3BlbmQ7CisgIEZJWFBfREJMIGJpdHNhdmVfc2xvcGUsIGJpdHNwZW5kX3Nsb3BlOworICBGSVhQX0RCTCBmaWxsTGV2ZWxfZml4ID0gTUFYVkFMX0RCTDsKIAotICAgIGlmIChtYXhCaXRyZXNCaXRzID4gYml0cmVzQml0cykgewotICAgICAgZmlsbExldmVsX2ZpeCA9IGZEaXZOb3JtKGJpdHJlc0JpdHMsIG1heEJpdHJlc0JpdHMpOwotICAgIH0KKyAgRklYUF9EQkwgc2xvcGUgPSBNQVhWQUxfREJMOwogCi0gICAgaWYgKGxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCi0gICAgewotICAgICAgICBicmVzUGFyYW0gPSAmKEFkalRoci0+YnJlc1BhcmFtTG9uZyk7Ci0gICAgICAgIGJpdHNhdmVfc2xvcGUgPSAoRklYUF9EQkwpMHgzQkJCQkJCQzsKLSAgICAgICAgYml0c3BlbmRfc2xvcGUgPSAoRklYUF9EQkwpMHg1NTU1NTU1NTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYnJlc1BhcmFtID0gJihBZGpUaHItPmJyZXNQYXJhbVNob3J0KTsKLSAgICAgICAgYml0c2F2ZV9zbG9wZSA9IChGSVhQX0RCTCkweDJFOEJBMkU5OwotICAgICAgICBiaXRzcGVuZF9zbG9wZSA9IChGSVhQX0RCTCkweDdmZmZmZmZmOwotICAgIH0KKyAgaWYgKGxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKKyAgICBicmVzUGFyYW0gPSAmKEFkalRoci0+YnJlc1BhcmFtTG9uZyk7CisgICAgYml0c2F2ZV9zbG9wZSA9IEZMMkZYQ09OU1RfREJMKDAuNDY2NjY2NjY2KTsKKyAgICBiaXRzcGVuZF9zbG9wZSA9IEZMMkZYQ09OU1RfREJMKDAuNjY2NjY2NjY2KTsKKyAgfSBlbHNlIHsKKyAgICBicmVzUGFyYW0gPSAmKEFkalRoci0+YnJlc1BhcmFtU2hvcnQpOworICAgIGJpdHNhdmVfc2xvcGUgPSAoRklYUF9EQkwpMHgyRThCQTJFOTsKKyAgICBiaXRzcGVuZF9zbG9wZSA9IChGSVhQX0RCTCkweDdmZmZmZmZmOworICB9CiAKLSAgICBwZXggPSBmaXhNYXgocGUsIGFkalRockNoYW4tPnBlTWluKTsKLSAgICBwZXggPSBmaXhNaW4ocGV4LCBhZGpUaHJDaGFuLT5wZU1heCk7CisgIC8vIGZpbGxMZXZlbCA9IChmbG9hdCkoYml0cmVzQml0cythdmdCaXRzKSAvIChmbG9hdCkobWF4Qml0cmVzQml0cyArIGF2Z0JpdHMpOworICBpZiAoYml0cmVzQml0cyA8IG1heEJpdHJlc0JpdHMpIHsKKyAgICBmaWxsTGV2ZWxfZml4ID0gZkRpdk5vcm0oYml0cmVzQml0cywgbWF4Qml0cmVzQml0cyk7CisgIH0KIAotICAgIGJpdFNhdmUgPSBGREthYWNFbmNfY2FsY0JpdFNhdmUoZmlsbExldmVsX2ZpeCwKLSAgICAgICAgYnJlc1BhcmFtLT5jbGlwU2F2ZUxvdywgYnJlc1BhcmFtLT5jbGlwU2F2ZUhpZ2gsCi0gICAgICAgIGJyZXNQYXJhbS0+bWluQml0U2F2ZSwgYnJlc1BhcmFtLT5tYXhCaXRTYXZlLCBiaXRzYXZlX3Nsb3BlKTsKKyAgcGV4ID0gZk1heChwZSwgYWRqVGhyQ2hhbi0+cGVNaW4pOworICBwZXggPSBmTWluKHBleCwgYWRqVGhyQ2hhbi0+cGVNYXgpOwogCi0gICAgYml0U3BlbmQgPSBGREthYWNFbmNfY2FsY0JpdFNwZW5kKGZpbGxMZXZlbF9maXgsCi0gICAgICAgIGJyZXNQYXJhbS0+Y2xpcFNwZW5kTG93LCBicmVzUGFyYW0tPmNsaXBTcGVuZEhpZ2gsCi0gICAgICAgIGJyZXNQYXJhbS0+bWluQml0U3BlbmQsIGJyZXNQYXJhbS0+bWF4Qml0U3BlbmQsIGJpdHNwZW5kX3Nsb3BlKTsKKyAgYml0U2F2ZSA9IEZES2FhY0VuY19jYWxjQml0U2F2ZSgKKyAgICAgIGZpbGxMZXZlbF9maXgsIGJyZXNQYXJhbS0+Y2xpcFNhdmVMb3csIGJyZXNQYXJhbS0+Y2xpcFNhdmVIaWdoLAorICAgICAgYnJlc1BhcmFtLT5taW5CaXRTYXZlLCBicmVzUGFyYW0tPm1heEJpdFNhdmUsIGJpdHNhdmVfc2xvcGUpOwogCi0gICAgcGVfcGVycyA9IChwZXggPiBhZGpUaHJDaGFuLT5wZU1pbikgPyBmRGl2Tm9ybShwZXggLSBhZGpUaHJDaGFuLT5wZU1pbiwgYWRqVGhyQ2hhbi0+cGVNYXggLSBhZGpUaHJDaGFuLT5wZU1pbikgOiAwOwotICAgIHRtcF9maXggPSBmTXVsdCgoKEZJWFBfREJMKWJpdFNwZW5kICsgKEZJWFBfREJMKWJpdFNhdmUpLCBwZV9wZXJzKTsKLSAgICBiaXRyZXNGYWNfZml4ID0gKFVOSVRZPj4xKSAtICgoRklYUF9EQkwpYml0U2F2ZT4+MSkgKyAodG1wX2ZpeD4+MSk7IHFicmVzID0gKERGUkFDVF9CSVRTLTIpOworICBiaXRTcGVuZCA9IEZES2FhY0VuY19jYWxjQml0U3BlbmQoCisgICAgICBmaWxsTGV2ZWxfZml4LCBicmVzUGFyYW0tPmNsaXBTcGVuZExvdywgYnJlc1BhcmFtLT5jbGlwU3BlbmRIaWdoLAorICAgICAgYnJlc1BhcmFtLT5taW5CaXRTcGVuZCwgYnJlc1BhcmFtLT5tYXhCaXRTcGVuZCwgYml0c3BlbmRfc2xvcGUpOwogCi0gICAgLyogKGZsb2F0KWJpdHJlc0JpdHMvKGZsb2F0KWF2Z0JpdHMgKi8KLSAgICBiaXRzX3JhdGlvID0gZkRpdk5vcm0oYml0cmVzQml0cywgYXZnQml0cywgJnFicik7Ci0gICAgcWJyID0gREZSQUNUX0JJVFMtMS1xYnI7CisgIHNsb3BlID0gc2NodXJfZGl2KChwZXggLSBhZGpUaHJDaGFuLT5wZU1pbiksCisgICAgICAgICAgICAgICAgICAgIChhZGpUaHJDaGFuLT5wZU1heCAtIGFkalRockNoYW4tPnBlTWluKSwgMzEpOwogCi0gICAgLyogQWRkIDAuNyBpbiBxMzEgdG8gYml0c19yYXRpbyBpbiBxYnIgKi8KLSAgICAvKiAwLjdmICsgKGZsb2F0KWJpdHJlc0JpdHMvKGZsb2F0KWF2Z0JpdHMgKi8KLSAgICBxbWluID0gZml4TWluKHFiciwgKERGUkFDVF9CSVRTLTEpKTsKLSAgICBiaXRzX3JhdGlvID0gYml0c19yYXRpbyA+PiAocWJyIC0gcW1pbik7Ci0gICAgdG1wX2NzdCA9IFBPSU5UNyA+PiAoKERGUkFDVF9CSVRTLTEpIC0gcW1pbik7Ci0gICAgbWF4QnJWYWwgPSAoYml0c19yYXRpbz4+MSkgKyAodG1wX2NzdD4+MSk7IHFtYnIgPSBxbWluIC0gMTsKKyAgLyogc2NhbGUgZG93biBieSAxIGJpdCBiZWNhdXNlIHRoZSByZXN1bHQgb2YgdGhlIGZvbGxvd2luZyBhZGRpdGlvbiBjYW4gYmUKKyAgICogYmlnZ2VyIHRoYW4gMSAodGhvdWdoIHNtYWxsZXIgdGhhbiAyKSAqLworICBiaXRyZXNGYWMgPSAoKEZJWFBfREJMKShNQVhWQUxfREJMID4+IDEpIC0gKGJpdFNhdmUgPj4gMSkpOworICBiaXRyZXNGYWNfZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhwPTEgKi8KKyAgYml0cmVzRmFjID0gZk11bHRBZGREaXYyKGJpdHJlc0ZhYywgc2xvcGUsIGJpdFNwZW5kICsgYml0U2F2ZSk7IC8qIGV4cD0xICovCiAKLSAgICAvKiBiaXRyZXNGYWNfZml4ID0gZml4TWluKGJpdHJlc0ZhY19maXgsIDAuNyArIGJpdHJlc0JpdHMvYXZnQml0cyk7ICovCi0gICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPj4gKHFicmVzIC0gcW1icik7IHFicmVzID0gcW1icjsKLSAgICBiaXRyZXNGYWNfZml4ID0gZml4TWluKGJpdHJlc0ZhY19maXgsIG1heEJyVmFsKTsKKyAgLyoqKiBsaW1pdCBiaXRyZXNGYWMgZm9yIHNtYWxsIGJpdHJlc2Vydm9pciAqKiovCisgIGZpbGxMZXZlbCA9IGZEaXZOb3JtKGJpdHJlc0JpdHMsIGF2Z0JpdHMsICZmaWxsTGV2ZWxfZSk7CisgIGlmIChmaWxsTGV2ZWxfZSA8IDApIHsKKyAgICBmaWxsTGV2ZWwgPSBzY2FsZVZhbHVlKGZpbGxMZXZlbCwgZmlsbExldmVsX2UpOworICAgIGZpbGxMZXZlbF9lID0gMDsKKyAgfQorICAvKiBzaGlmdCBkb3duIHZhbHVlIGJ5IDEgYmVjYXVzZSBvZiBzdW1tYXRpb24sIC4uLiAqLworICBmaWxsTGV2ZWwgPj49IDE7CisgIGZpbGxMZXZlbF9lICs9IDE7CisgIC8qIC4uLiwgdGhpcyBzdW1tYXRpb246ICovCisgIGZpbGxMZXZlbCArPSBzY2FsZVZhbHVlKEZMMkZYQ09OU1RfREJMKDAuN2YpLCAtZmlsbExldmVsX2UpOworICAvKiBzZXQgYml0cmVzZmFjdG9yIHRvIHNhbWUgZXhwb25lbnQgYXMgZmlsbExldmVsICovCisgIGlmIChzY2FsZVZhbHVlKGJpdHJlc0ZhYywgLWZpbGxMZXZlbF9lICsgMSkgPiBmaWxsTGV2ZWwpIHsKKyAgICBiaXRyZXNGYWMgPSBmaWxsTGV2ZWw7CisgICAgYml0cmVzRmFjX2UgPSBmaWxsTGV2ZWxfZTsKKyAgfQogCi0gICAgLyogQ29tcGFyZSB3aXRoIG1heEJpdEZhYyAqLwotICAgIHFtaW4gPSBmaXhNaW4oUV9CSVRGQUMsIHFicmVzKTsKLSAgICBiaXRyZXNGYWNfZml4ID0gYml0cmVzRmFjX2ZpeCA+PiAocWJyZXMgLSBxbWluKTsKLSAgICBtYXhCaXRGYWNfdG1wID0gbWF4Qml0RmFjID4+IChRX0JJVEZBQyAtIHFtaW4pOwotICAgIGlmKG1heEJpdEZhY190bXAgPCBiaXRyZXNGYWNfZml4KQotICAgIHsKLSAgICAgICAgYml0cmVzRmFjX2ZpeCA9IG1heEJpdEZhYzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYocW1pbiA8IFFfQklURkFDKQotICAgICAgICB7Ci0gICAgICAgICAgICBiaXRyZXNGYWNfZml4ID0gYml0cmVzRmFjX2ZpeCA8PCAoUV9CSVRGQUMtcW1pbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiaXRyZXNGYWNfZml4ID0gYml0cmVzRmFjX2ZpeCA+PiAocW1pbi1RX0JJVEZBQyk7Ci0gICAgICAgIH0KLSAgICB9CisgIC8qIGxpbWl0IGJpdHJlc0ZhYyBmb3IgaGlnaCBiaXRyYXRlcyAqLworICBpZiAoc2NhbGVWYWx1ZShiaXRyZXNGYWMsIGJpdHJlc0ZhY19lIC0gKERGUkFDVF9CSVRTIC0gMSAtIDI0KSkgPiBtYXhCaXRGYWMpIHsKKyAgICBiaXRyZXNGYWMgPSBtYXhCaXRGYWM7CisgICAgYml0cmVzRmFjX2UgPSAoREZSQUNUX0JJVFMgLSAxIC0gMjQpOworICB9CiAKLSAgICBGREthYWNFbmNfYWRqdXN0UGVNaW5NYXgocGUsICZhZGpUaHJDaGFuLT5wZU1pbiwgJmFkalRockNoYW4tPnBlTWF4KTsKKyAgRkRLYWFjRW5jX2FkanVzdFBlTWluTWF4KHBlLCAmYWRqVGhyQ2hhbi0+cGVNaW4sICZhZGpUaHJDaGFuLT5wZU1heCk7CiAKLSAgICByZXR1cm4gYml0cmVzRmFjX2ZpeDsKKyAgLyogb3V0cHV0IHZhbHVlcyAqLworICAqcEJpdHJlc0ZhYyA9IGJpdHJlc0ZhYzsKKyAgKnBCaXRyZXNGYWNfZSA9IGJpdHJlc0ZhY19lOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQWRqVGhyTmV3CiBkZXNjcmlwdGlvbjogIGFsbG9jYXRlIEFESl9USFJfU1RBVEUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UIEZES2FhY0VuY19BZGpUaHJOZXcoQURKX1RIUl9TVEFURSoqIHBoQWRqVGhyLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgIG5FbGVtZW50cykKLXsKLSAgICBJTlQgZXJyID0gMDsKLSAgICBJTlQgaTsKLSAgICBBREpfVEhSX1NUQVRFKiBoQWRqVGhyID0gR2V0UmFtX2FhY0VuY19BZGp1c3RUaHJlc2hvbGQoKTsKLSAgICBpZiAoaEFkalRocj09TlVMTCkgewotICAgICAgICBlcnIgPSAxOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQorSU5UIEZES2FhY0VuY19BZGpUaHJOZXcoQURKX1RIUl9TVEFURSAqKnBoQWRqVGhyLCBJTlQgbkVsZW1lbnRzKSB7CisgIElOVCBlcnIgPSAwOworICBJTlQgaTsKKyAgQURKX1RIUl9TVEFURSAqaEFkalRociA9IEdldFJhbV9hYWNFbmNfQWRqdXN0VGhyZXNob2xkKCk7CisgIGlmIChoQWRqVGhyID09IE5VTEwpIHsKKyAgICBlcnIgPSAxOworICAgIGdvdG8gYmFpbDsKKyAgfQogCi0gICAgZm9yIChpPTA7IGk8bkVsZW1lbnRzOyBpKyspIHsKLSAgICAgICAgaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldID0gIEdldFJhbV9hYWNFbmNfQWRqVGhyU3RhdGVFbGVtZW50KGkpOwotICAgICAgICBpZiAoaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldPT1OVUxMKSB7Ci0gICAgICAgICAgZXJyID0gMTsKLSAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgIH0KKyAgZm9yIChpID0gMDsgaSA8IG5FbGVtZW50czsgaSsrKSB7CisgICAgaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldID0gR2V0UmFtX2FhY0VuY19BZGpUaHJTdGF0ZUVsZW1lbnQoaSk7CisgICAgaWYgKGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSA9PSBOVUxMKSB7CisgICAgICBlcnIgPSAxOworICAgICAgZ290byBiYWlsOwogICAgIH0KKyAgfQogCiBiYWlsOgotICAgICpwaEFkalRociA9IGhBZGpUaHI7Ci0gICAgcmV0dXJuIGVycjsKKyAgKnBoQWRqVGhyID0gaEFkalRocjsKKyAgcmV0dXJuIGVycjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkalRockluaXQKIGRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZSBBREpfVEhSX1NUQVRFCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgRkRLYWFjRW5jX0FkalRockluaXQoCi0gICAgICAgIEFESl9USFJfU1RBVEUgICAqaEFkalRociwKLSAgICAgICAgY29uc3QgSU5UICAgICAgIG1lYW5QZSwKLSAgICAgICAgRUxFTUVOVF9CSVRTICAgICplbEJpdHNbKDgpXSwKLSAgICAgICAgSU5UICAgICAgICAgICAgIGludlF1YW50LAotICAgICAgICBJTlQgICAgICAgICAgICAgbkVsZW1lbnRzLAotICAgICAgICBJTlQgICAgICAgICAgICAgbkNoYW5uZWxzRWZmLAotICAgICAgICBJTlQgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgSU5UICAgICAgICAgICAgIGFkdmFuY2VkQml0c1RvUGUsCi0gICAgICAgIEZJWFBfREJMICAgICAgICB2YnJRdWFsRmFjdG9yLAotICAgICAgICBjb25zdCBJTlQgICAgICAgZFpvbmVRdWFudEVuYWJsZQotICAgICAgICApCi17CisgICAgQURKX1RIUl9TVEFURSAqY29uc3QgaEFkalRociwgY29uc3QgSU5UIG1lYW5QZSwgY29uc3QgSU5UIGludlF1YW50LAorICAgIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY29uc3QgY2hhbm5lbE1hcHBpbmcsIGNvbnN0IElOVCBzYW1wbGVSYXRlLAorICAgIGNvbnN0IElOVCB0b3RhbEJpdHJhdGUsIGNvbnN0IElOVCBpc0xvd0RlbGF5LAorICAgIGNvbnN0IEFBQ0VOQ19CSVRSRVNfTU9ERSBiaXRSZXNNb2RlLCBjb25zdCBJTlQgZFpvbmVRdWFudEVuYWJsZSwKKyAgICBjb25zdCBJTlQgYml0RGlzdHJpYnV0aW9uTW9kZSwgY29uc3QgRklYUF9EQkwgdmJyUXVhbEZhY3RvcikgewogICBJTlQgaTsKIAogICBGSVhQX0RCTCBQT0lOVDggPSBGTDJGWENPTlNUX0RCTCgwLjhmKTsKICAgRklYUF9EQkwgUE9JTlQ2ID0gRkwyRlhDT05TVF9EQkwoMC42Zik7CiAKLSAgLyogTWF4IG51bWJlciBvZiBpdGVyYXRpb25zIGluIHNlY29uZCBndWVzcyBpcyAzIGZvciBsb3dkZWxheSBhb3QgYW5kIGZvciBjb25maWd1cmF0aW9ucyB3aXRoCi0gICAgIG11bHRpcGxlIGF1ZGlvIGVsZW1lbnRzIGluIGdlbmVyYWwsIG90aGVyd2lzZSBpdGVyYXRpb24gdmFsdWUgaXMgYWx3YXlzIDEuICovCi0gIGhBZGpUaHItPm1heEl0ZXIybmRHdWVzcyA9IChhZHZhbmNlZEJpdHNUb1BlIT0wIHx8IG5FbGVtZW50cz4xKSA/IDMgOiAxOworICBpZiAoYml0RGlzdHJpYnV0aW9uTW9kZSA9PSAxKSB7CisgICAgaEFkalRoci0+Yml0RGlzdHJpYnV0aW9uTW9kZSA9IEFBQ0VOQ19CRF9NT0RFX0lOVFJBX0VMRU1FTlQ7CisgIH0gZWxzZSB7CisgICAgaEFkalRoci0+Yml0RGlzdHJpYnV0aW9uTW9kZSA9IEFBQ0VOQ19CRF9NT0RFX0lOVEVSX0VMRU1FTlQ7CisgIH0KKworICAvKiBNYXggbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaW4gc2Vjb25kIGd1ZXNzIGlzIDMgZm9yIGxvd2RlbGF5IGFvdCBhbmQgZm9yCisgICAgIGNvbmZpZ3VyYXRpb25zIHdpdGggbXVsdGlwbGUgYXVkaW8gZWxlbWVudHMgaW4gZ2VuZXJhbCwgb3RoZXJ3aXNlIGl0ZXJhdGlvbgorICAgICB2YWx1ZSBpcyBhbHdheXMgMS4gKi8KKyAgaEFkalRoci0+bWF4SXRlcjJuZEd1ZXNzID0KKyAgICAgIChpc0xvd0RlbGF5ICE9IDAgfHwgY2hhbm5lbE1hcHBpbmctPm5FbGVtZW50cyA+IDEpID8gMyA6IDE7CiAKICAgLyogY29tbW9uIGZvciBhbGwgZWxlbWVudHM6ICovCiAgIC8qIHBhcmFtZXRlcnMgZm9yIGJpdHJlcyBjb250cm9sICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNhdmVMb3cgICA9IChGSVhQX0RCTCkweDE5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU2F2ZUhpZ2ggID0gKEZJWFBfREJMKTB4Nzk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuOTVmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5taW5CaXRTYXZlICAgID0gKEZJWFBfREJMKTB4Zjk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKC0wLjA1Zik7ICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWF4Qml0U2F2ZSAgICA9IChGSVhQX0RCTCkweDI2NjY2NjY2OyAvKiBGTDJGWENPTlNUX0RCTCgwLjNmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRMb3cgID0gKEZJWFBfREJMKTB4MTk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTcGVuZEhpZ2ggPSAoRklYUF9EQkwpMHg3OTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoMC45NWYpOyAqLwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1pbkJpdFNwZW5kICAgPSAoRklYUF9EQkwpMHhmMzMzMzMzMzsgLyogRkwyRlhDT05TVF9EQkwoLTAuMTBmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5tYXhCaXRTcGVuZCAgID0gKEZJWFBfREJMKTB4MzMzMzMzMzM7IC8qIEZMMkZYQ09OU1RfREJMKDAuNGYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTYXZlTG93ID0KKyAgICAgIChGSVhQX0RCTCkweDE5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU2F2ZUhpZ2ggPQorICAgICAgKEZJWFBfREJMKTB4Nzk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuOTVmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5taW5CaXRTYXZlID0KKyAgICAgIChGSVhQX0RCTCkweGY5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgtMC4wNWYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNhdmUgPQorICAgICAgKEZJWFBfREJMKTB4MjY2NjY2NjY7IC8qIEZMMkZYQ09OU1RfREJMKDAuM2YpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTcGVuZExvdyA9CisgICAgICAoRklYUF9EQkwpMHgxOTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoMC4yZik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNwZW5kSGlnaCA9CisgICAgICAoRklYUF9EQkwpMHg3OTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoMC45NWYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1pbkJpdFNwZW5kID0KKyAgICAgIChGSVhQX0RCTCkweGYzMzMzMzMzOyAvKiBGTDJGWENPTlNUX0RCTCgtMC4xMGYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNwZW5kID0KKyAgICAgIChGSVhQX0RCTCkweDMzMzMzMzMzOyAvKiBGTDJGWENPTlNUX0RCTCgwLjRmKTsgKi8KIAotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUxvdyAgID0gKEZJWFBfREJMKTB4MTk5OTk5YTA7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUhpZ2ggID0gKEZJWFBfREJMKTB4NWZmZmZmZmY7IC8qIEZMMkZYQ09OU1RfREJMKDAuNzVmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWluQml0U2F2ZSAgICA9IChGSVhQX0RCTCkweDAwMDAwMDAwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjBmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U2F2ZSAgICA9IChGSVhQX0RCTCkweDE5OTk5OWEwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNwZW5kTG93ICA9IChGSVhQX0RCTCkweDE5OTk5OWEwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNwZW5kSGlnaCA9IChGSVhQX0RCTCkweDVmZmZmZmZmOyAvKiBGTDJGWENPTlNUX0RCTCgwLjc1Zik7ICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNwZW5kICAgPSAoRklYUF9EQkwpMHhmOTk5OTk5ODsgLyogRkwyRlhDT05TVF9EQkwoLTAuMDVmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U3BlbmQgICA9IChGSVhQX0RCTCkweDQwMDAwMDAwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjVmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNhdmVMb3cgPQorICAgICAgKEZJWFBfREJMKTB4MTk5OTk5YTA7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUhpZ2ggPQorICAgICAgKEZJWFBfREJMKTB4NWZmZmZmZmY7IC8qIEZMMkZYQ09OU1RfREJMKDAuNzVmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWluQml0U2F2ZSA9CisgICAgICAoRklYUF9EQkwpMHgwMDAwMDAwMDsgLyogRkwyRlhDT05TVF9EQkwoMC4wZik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1heEJpdFNhdmUgPQorICAgICAgKEZJWFBfREJMKTB4MTk5OTk5YTA7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU3BlbmRMb3cgPQorICAgICAgKEZJWFBfREJMKTB4MTk5OTk5YTA7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU3BlbmRIaWdoID0KKyAgICAgIChGSVhQX0RCTCkweDVmZmZmZmZmOyAvKiBGTDJGWENPTlNUX0RCTCgwLjc1Zik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNwZW5kID0KKyAgICAgIChGSVhQX0RCTCkweGY5OTk5OTk4OyAvKiBGTDJGWENPTlNUX0RCTCgtMC4wNWYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5tYXhCaXRTcGVuZCA9CisgICAgICAoRklYUF9EQkwpMHg0MDAwMDAwMDsgLyogRkwyRlhDT05TVF9EQkwoMC41Zik7ICovCiAKICAgLyogc3BlY2lmaWMgZm9yIGVhY2ggZWxlbWVudDogKi8KLSAgZm9yIChpPTA7IGk8bkVsZW1lbnRzOyBpKyspIHsKLSAgICBBVFNfRUxFTUVOVCogYXRzRWxlbSA9IGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXTsKKyAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHM7IGkrKykgeworICAgIGNvbnN0IEZJWFBfREJMIHJlbGF0aXZlQml0cyA9IGNoYW5uZWxNYXBwaW5nLT5lbEluZm9baV0ucmVsYXRpdmVCaXRzOworICAgIGNvbnN0IElOVCBuQ2hhbm5lbHNJbkVsZW1lbnQgPSBjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWw7CisgICAgY29uc3QgSU5UIGJpdHJhdGVJbkVsZW1lbnQgPQorICAgICAgICAocmVsYXRpdmVCaXRzICE9IChGSVhQX0RCTClNQVhWQUxfREJMKQorICAgICAgICAgICAgPyAoSU5UKWZNdWx0Tm9ybShyZWxhdGl2ZUJpdHMsIChGSVhQX0RCTCl0b3RhbEJpdHJhdGUpCisgICAgICAgICAgICA6IHRvdGFsQml0cmF0ZTsKKyAgICBjb25zdCBJTlQgY2hCaXRyYXRlID0gYml0cmF0ZUluRWxlbWVudCA+PiAobkNoYW5uZWxzSW5FbGVtZW50ID09IDEgPyAwIDogMSk7CisKKyAgICBBVFNfRUxFTUVOVCAqYXRzRWxlbSA9IGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXTsKICAgICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtID0gJmF0c0VsZW0tPm1pblNuckFkYXB0UGFyYW07Ci0gICAgSU5UIGNoQml0cmF0ZSA9IGVsQml0c1tpXS0+Y2hCaXRyYXRlRWw7CiAKICAgICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXMgY29udHJvbCAqLwotICAgIGF0c0VsZW0tPnBlTWluID0gZk11bHRJKFBPSU5UOCwgbWVhblBlKSA+PiAxOwotICAgIGF0c0VsZW0tPnBlTWF4ID0gZk11bHRJKFBPSU5UNiwgbWVhblBlKTsKKyAgICBpZiAoaXNMb3dEZWxheSkgeworICAgICAgYXRzRWxlbS0+cGVNaW4gPSBmTXVsdEkoUE9JTlQ4LCBtZWFuUGUpOworICAgICAgYXRzRWxlbS0+cGVNYXggPSBmTXVsdEkoUE9JTlQ2LCBtZWFuUGUpIDw8IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGF0c0VsZW0tPnBlTWluID0gZk11bHRJKFBPSU5UOCwgbWVhblBlKSA+PiAxOworICAgICAgYXRzRWxlbS0+cGVNYXggPSBmTXVsdEkoUE9JTlQ2LCBtZWFuUGUpOworICAgIH0KIAogICAgIC8qIGZvciB1c2UgaW4gRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNWQlIgKi8KICAgICBhdHNFbGVtLT5jaGFvc01lYXN1cmVPbGQgPSBGTDJGWENPTlNUX0RCTCgwLjNmKTsKIAogICAgIC8qIGFkZGl0aW9uYWwgcGUgb2Zmc2V0IHRvIGNvcnJlY3QgcGUyYml0cyBmb3IgbG93IGJpdHJhdGVzICovCisgICAgLyogLS0tLSBubyBsb25nZXIgbmVjZXNzYXJ5LCBzZXQgYnkgdGFibGUgLS0tLS0gKi8KICAgICBhdHNFbGVtLT5wZU9mZnNldCA9IDA7CiAKICAgICAvKiB2YnIgaW5pdGlhbGlzYXRpb24gKi8KICAgICBhdHNFbGVtLT52YnJRdWFsRmFjdG9yID0gdmJyUXVhbEZhY3RvcjsKLSAgICBpZiAoY2hCaXRyYXRlIDwgMzIwMDApCi0gICAgewotICAgICAgYXRzRWxlbS0+cGVPZmZzZXQgPSBmaXhNYXgoNTAsIDEwMC1mTXVsdEkoKEZJWFBfREJMKTB4NjY2NjY3LCBjaEJpdHJhdGUpKTsKKyAgICBpZiAoY2hCaXRyYXRlIDwgMzIwMDApIHsKKyAgICAgIGF0c0VsZW0tPnBlT2Zmc2V0ID0KKyAgICAgICAgICBmaXhNYXgoNTAsIDEwMCAtIGZNdWx0SSgoRklYUF9EQkwpMHg2NjY2NjcsIGNoQml0cmF0ZSkpOwogICAgIH0KIAogICAgIC8qIGF2b2lkIGhvbGUgcGFyYW1ldGVycyAqLwotICAgIGlmIChjaEJpdHJhdGUgPiAyMDAwMCkgeworICAgIGlmIChjaEJpdHJhdGUgPj0gMjAwMDApIHsKICAgICAgIGF0c0VsZW0tPmFoUGFyYW0ubW9kaWZ5TWluU25yID0gVFJVRTsKICAgICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJMID0gMTU7CiAgICAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiUyA9IDM7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBhdHNFbGVtLT5haFBhcmFtLm1vZGlmeU1pblNuciA9IEZBTFNFOwogICAgICAgYXRzRWxlbS0+YWhQYXJhbS5zdGFydFNmYkwgPSAwOwogICAgICAgYXRzRWxlbS0+YWhQYXJhbS5zdGFydFNmYlMgPSAwOwpAQCAtMjMyNyw5ICsyNTgzLDExIEBACiAgICAgLyogbWF4aW11bSBtaW5TbnIgcmVkdWN0aW9uIHRvIG1pblNucl5tYXhSZWQgaXMgcmVhY2hlZCBmb3IKICAgICAgICBhdmdFbi9zZmJFbiA+PSBtYXhSYXRpbyAqLwogICAgIC8qIG1zYVBhcmFtLT5tYXhSYXRpbyA9IDEwMDAuMGY7ICovCi0gICAgLyptc2FQYXJhbS0+cmVkUmF0aW9GYWMgPSAoKGZsb2F0KTEuMGYgLSBtc2FQYXJhbS0+bWF4UmVkKSAvICgoZmxvYXQpMTAuMGYqbG9nMTAobXNhUGFyYW0tPnN0YXJ0UmF0aW8vbXNhUGFyYW0tPm1heFJhdGlvKS9sb2cxMCgyLjBmKSooZmxvYXQpMC4zMDEwMjk5OTU2Zik7Ki8KKyAgICAvKm1zYVBhcmFtLT5yZWRSYXRpb0ZhYyA9ICgoZmxvYXQpMS4wZiAtIG1zYVBhcmFtLT5tYXhSZWQpIC8KKyAgICAgKiAoKGZsb2F0KTEwLjBmKmxvZzEwKG1zYVBhcmFtLT5zdGFydFJhdGlvL21zYVBhcmFtLT5tYXhSYXRpbykvbG9nMTAoMi4wZikqKGZsb2F0KTAuMzAxMDI5OTk1NmYpOyovCiAgICAgbXNhUGFyYW0tPnJlZFJhdGlvRmFjID0gRkwyRlhDT05TVF9EQkwoLTAuMzc1Zik7IC8qIC0wLjAzNzVmICogMTAuMGYgKi8KLSAgICAvKm1zYVBhcmFtLT5yZWRPZmZzID0gKGZsb2F0KTEuMGYgLSBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgKiAoZmxvYXQpMTAuMGYgKiBsb2cxMChtc2FQYXJhbS0+c3RhcnRSYXRpbykvbG9nMTAoMi4wZikgKiAoZmxvYXQpMC4zMDEwMjk5OTU2ZjsqLworICAgIC8qbXNhUGFyYW0tPnJlZE9mZnMgPSAoZmxvYXQpMS4wZiAtIG1zYVBhcmFtLT5yZWRSYXRpb0ZhYyAqIChmbG9hdCkxMC4wZiAqCisgICAgICogbG9nMTAobXNhUGFyYW0tPnN0YXJ0UmF0aW8pL2xvZzEwKDIuMGYpICogKGZsb2F0KTAuMzAxMDI5OTk1NmY7Ki8KICAgICBtc2FQYXJhbS0+cmVkT2ZmcyA9IEZMMkZYQ09OU1RfREJMKDAuMDIxNDg0Mzc1KTsgLyogMS4zNzVmLzY0LjBmICovCiAKICAgICAvKiBpbml0IHBlIGNvcnJlY3Rpb24gKi8KQEAgLTIzNDMsMzI0ICsyNjAxLDMyNCBAQAogCiAgICAgLyogaW5pdCBiaXRzMlBlRmFjdG9yICovCiAgICAgRkRLYWFjRW5jX0luaXRCaXRzMlBlRmFjdG9yKAotICAgICAgICAgICAgICAmYXRzRWxlbS0+Yml0czJQZUZhY3Rvcl9tLAotICAgICAgICAgICAgICAmYXRzRWxlbS0+Yml0czJQZUZhY3Rvcl9lLAotICAgICAgICAgICAgICBjaEJpdHJhdGUqbkNoYW5uZWxzRWZmLCAvKiBvdmVyYWxsIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgbkNoYW5uZWxzRWZmLCAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgYWR2YW5jZWRCaXRzVG9QZSwKLSAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSwKLSAgICAgICAgICAgICAgaW52UXVhbnQKLSAgICAgICAgICAgICAgKTsKKyAgICAgICAgJmF0c0VsZW0tPmJpdHMyUGVGYWN0b3JfbSwgJmF0c0VsZW0tPmJpdHMyUGVGYWN0b3JfZSwgYml0cmF0ZUluRWxlbWVudCwKKyAgICAgICAgbkNoYW5uZWxzSW5FbGVtZW50LCBzYW1wbGVSYXRlLCBpc0xvd0RlbGF5LCBkWm9uZVF1YW50RW5hYmxlLCBpbnZRdWFudCk7CiAKICAgfSAvKiBmb3IgbkVsZW1lbnRzICovCi0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlQ29ycmVjdGlvbgogICAgIGRlc2NyaXB0aW9uOiAgY2FsYyBkZXNpcmVkIHBlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlQ29ycmVjdGlvbigKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICBjb3JyZWN0aW9uRmFjX20sCi0gICAgICAgIElOVCAqY29uc3QgICAgICAgICAgICAgICAgY29ycmVjdGlvbkZhY19lLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHBlQWN0LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHBlTGFzdCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRzTGFzdCwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX20sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9lCi0gICAgICAgICkKLXsKLSAgaWYgKCAoYml0c0xhc3QgPiAwKSAmJiAocGVBY3QgPCAxLjVmKnBlTGFzdCkgJiYgKHBlQWN0ID4gMC43ZipwZUxhc3QpICYmCi0gICAgICAgKEZES2FhY0VuY19iaXRzMnBlMihiaXRzTGFzdCwgZk11bHQoRkwyRlhDT05TVF9EQkwoMS4yZi8yLmYpLCBiaXRzMlBlRmFjdG9yX20pLCBiaXRzMlBlRmFjdG9yX2UrMSkgPiBwZUxhc3QpICYmCi0gICAgICAgKEZES2FhY0VuY19iaXRzMnBlMihiaXRzTGFzdCwgZk11bHQoRkwyRlhDT05TVF9EQkwoMC42NWYpLCAgICBiaXRzMlBlRmFjdG9yX20pLCBiaXRzMlBlRmFjdG9yX2UgICkgPCBwZUxhc3QpICkKLSAgeworICAgIEZJWFBfREJMICpjb25zdCBjb3JyZWN0aW9uRmFjX20sIElOVCAqY29uc3QgY29ycmVjdGlvbkZhY19lLAorICAgIGNvbnN0IElOVCBwZUFjdCwgY29uc3QgSU5UIHBlTGFzdCwgY29uc3QgSU5UIGJpdHNMYXN0LAorICAgIGNvbnN0IEZJWFBfREJMIGJpdHMyUGVGYWN0b3JfbSwgY29uc3QgSU5UIGJpdHMyUGVGYWN0b3JfZSkgeworICBpZiAoKGJpdHNMYXN0ID4gMCkgJiYgKHBlQWN0IDwgMS41ZiAqIHBlTGFzdCkgJiYgKHBlQWN0ID4gMC43ZiAqIHBlTGFzdCkgJiYKKyAgICAgIChGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMmYgLyAyLmYpLCBiaXRzMlBlRmFjdG9yX20pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX2UgKyAxKSA+IHBlTGFzdCkgJiYKKyAgICAgIChGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNjVmKSwgYml0czJQZUZhY3Rvcl9tKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9lKSA8IHBlTGFzdCkpIHsKICAgICBGSVhQX0RCTCBjb3JyRmFjID0gKmNvcnJlY3Rpb25GYWNfbTsKIAogICAgIGludCBzY2FsaW5nID0gMDsKLSAgICBGSVhQX0RCTCBkZW51bSA9IChGSVhQX0RCTClGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsIGJpdHMyUGVGYWN0b3JfbSwgYml0czJQZUZhY3Rvcl9lKTsKKyAgICBGSVhQX0RCTCBkZW51bSA9IChGSVhQX0RCTClGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsIGJpdHMyUGVGYWN0b3JfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9lKTsKICAgICBGSVhQX0RCTCBuZXdGYWMgPSBmRGl2Tm9ybSgoRklYUF9EQkwpcGVMYXN0LCBkZW51bSwgJnNjYWxpbmcpOwogCiAgICAgLyogZGVhZCB6b25lLCBuZXdGYWMgYW5kIGNvcnJGYWMgYXJlIHNjYWxlZCBieSAwLjUgKi8KICAgICBpZiAoKEZJWFBfREJMKXBlTGFzdCA8PSBkZW51bSkgeyAvKiByYXRpbyA8PSAxLmYgKi8KLSAgICAgIG5ld0ZhYyA9IGZpeE1heChzY2FsZVZhbHVlKGZpeE1pbiggZk11bHQoRkwyRlhDT05TVF9EQkwoMS4xZi8yLmYpLCBuZXdGYWMpLCBzY2FsZVZhbHVlKEZMMkZYQ09OU1RfREJMKCAgMS5mLzIuZiksIC1zY2FsaW5nKSksIHNjYWxpbmcpLCBGTDJGWENPTlNUX0RCTCgwLjg1Zi8yLmYpICk7Ci0gICAgfQotICAgIGVsc2UgeyAvKiByYXRpbyA8IDEuZiAqLwotICAgICBuZXdGYWMgPSBmaXhNYXgoIGZpeE1pbiggc2NhbGVWYWx1ZShmTXVsdChGTDJGWENPTlNUX0RCTCgwLjlmLzIuZiksIG5ld0ZhYyksIHNjYWxpbmcpLCBGTDJGWENPTlNUX0RCTCgxLjE1Zi8yLmYpICksIEZMMkZYQ09OU1RfREJMKCAgIDEuZi8yLmYpICk7CisgICAgICBuZXdGYWMgPSBmaXhNYXgoCisgICAgICAgICAgc2NhbGVWYWx1ZShmaXhNaW4oZk11bHQoRkwyRlhDT05TVF9EQkwoMS4xZiAvIDIuZiksIG5ld0ZhYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShGTDJGWENPTlNUX0RCTCgxLmYgLyAyLmYpLCAtc2NhbGluZykpLAorICAgICAgICAgICAgICAgICAgICAgc2NhbGluZyksCisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC44NWYgLyAyLmYpKTsKKyAgICB9IGVsc2UgeyAvKiByYXRpbyA8IDEuZiAqLworICAgICAgbmV3RmFjID0gZml4TWF4KAorICAgICAgICAgIGZpeE1pbihzY2FsZVZhbHVlKGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuOWYgLyAyLmYpLCBuZXdGYWMpLCBzY2FsaW5nKSwKKyAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMS4xNWYgLyAyLmYpKSwKKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxLmYgLyAyLmYpKTsKICAgICB9CiAKLSAgICBpZiAoICAgKChuZXdGYWMgPiBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKSkgJiYgKGNvcnJGYWMgPCBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKSkpCi0gICAgICAgIHx8ICgobmV3RmFjIDwgRkwyRlhDT05TVF9EQkwoMS5mLzIuZikpICYmIChjb3JyRmFjID4gRkwyRlhDT05TVF9EQkwoMS5mLzIuZikpKSkKLSAgICB7Ci0gICAgICBjb3JyRmFjID0gRkwyRlhDT05TVF9EQkwoMS5mLzIuZik7CisgICAgaWYgKCgobmV3RmFjID4gRkwyRlhDT05TVF9EQkwoMS5mIC8gMi5mKSkgJiYKKyAgICAgICAgIChjb3JyRmFjIDwgRkwyRlhDT05TVF9EQkwoMS5mIC8gMi5mKSkpIHx8CisgICAgICAgICgobmV3RmFjIDwgRkwyRlhDT05TVF9EQkwoMS5mIC8gMi5mKSkgJiYKKyAgICAgICAgIChjb3JyRmFjID4gRkwyRlhDT05TVF9EQkwoMS5mIC8gMi5mKSkpKSB7CisgICAgICBjb3JyRmFjID0gRkwyRlhDT05TVF9EQkwoMS5mIC8gMi5mKTsKICAgICB9CiAKICAgICAvKiBmYXN0ZXIgYWRhcHRhdGlvbiB0b3dhcmRzIDEuMCwgc2xvd2VyIGluIHRoZSBvdGhlciBkaXJlY3Rpb24gKi8KLSAgICBpZiAoIChjb3JyRmFjIDwgRkwyRlhDT05TVF9EQkwoMS5mLzIuZikgJiYgbmV3RmFjIDwgY29yckZhYykKLSAgICAgIHx8IChjb3JyRmFjID4gRkwyRlhDT05TVF9EQkwoMS5mLzIuZikgJiYgbmV3RmFjID4gY29yckZhYykgKQotICAgIHsKLSAgICAgIGNvcnJGYWMgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjg1ZiksIGNvcnJGYWMpICsgZk11bHQoRkwyRlhDT05TVF9EQkwoMC4xNWYpLCBuZXdGYWMpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGNvcnJGYWMgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwgY29yckZhYykgKyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjNmKSwgbmV3RmFjKTsKKyAgICBpZiAoKGNvcnJGYWMgPCBGTDJGWENPTlNUX0RCTCgxLmYgLyAyLmYpICYmIG5ld0ZhYyA8IGNvcnJGYWMpIHx8CisgICAgICAgIChjb3JyRmFjID4gRkwyRlhDT05TVF9EQkwoMS5mIC8gMi5mKSAmJiBuZXdGYWMgPiBjb3JyRmFjKSkgeworICAgICAgY29yckZhYyA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuODVmKSwgY29yckZhYykgKworICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMTVmKSwgbmV3RmFjKTsKKyAgICB9IGVsc2UgeworICAgICAgY29yckZhYyA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLCBjb3JyRmFjKSArCisgICAgICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMC4zZiksIG5ld0ZhYyk7CiAgICAgfQogCi0gICAgY29yckZhYyA9IGZpeE1heCggZml4TWluKCBjb3JyRmFjLCBGTDJGWENPTlNUX0RCTCgxLjE1Zi8yLmYpICksIEZMMkZYQ09OU1RfREJMKDAuODUvMi5mKSApOworICAgIGNvcnJGYWMgPSBmaXhNYXgoZml4TWluKGNvcnJGYWMsIEZMMkZYQ09OU1RfREJMKDEuMTVmIC8gMi5mKSksCisgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjg1IC8gMi5mKSk7CiAKICAgICAqY29ycmVjdGlvbkZhY19tID0gY29yckZhYzsKICAgICAqY29ycmVjdGlvbkZhY19lID0gMTsKLSAgfQotICBlbHNlIHsKLSAgICAqY29ycmVjdGlvbkZhY19tID0gRkwyRlhDT05TVF9EQkwoMS5mLzIuZik7CisgIH0gZWxzZSB7CisgICAgKmNvcnJlY3Rpb25GYWNfbSA9IEZMMkZYQ09OU1RfREJMKDEuZiAvIDIuZik7CiAgICAgKmNvcnJlY3Rpb25GYWNfZSA9IDE7CiAgIH0KIH0KIAotCiBzdGF0aWMgdm9pZCBGREthYWNFbmNfY2FsY1BlQ29ycmVjdGlvbkxvd0JpdFJlcygKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICBjb3JyZWN0aW9uRmFjX20sCi0gICAgICAgIElOVCAqY29uc3QgICAgICAgICAgICAgICAgY29ycmVjdGlvbkZhY19lLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHBlTGFzdCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRzTGFzdCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRyZXNMZXZlbCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZQotICAgICAgICApCi17CisgICAgRklYUF9EQkwgKmNvbnN0IGNvcnJlY3Rpb25GYWNfbSwgSU5UICpjb25zdCBjb3JyZWN0aW9uRmFjX2UsCisgICAgY29uc3QgSU5UIHBlTGFzdCwgY29uc3QgSU5UIGJpdHNMYXN0LCBjb25zdCBJTlQgYml0cmVzTGV2ZWwsCisgICAgY29uc3QgSU5UIG5DaGFubmVscywgY29uc3QgRklYUF9EQkwgYml0czJQZUZhY3Rvcl9tLAorICAgIGNvbnN0IElOVCBiaXRzMlBlRmFjdG9yX2UpIHsKICAgLyogdHVuaW5nIHBhcmFtcyAqLwotICBjb25zdCBGSVhQX0RCTCBhbXAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4wMDUpOworICBjb25zdCBGSVhQX0RCTCBhbXAgPSBGTDJGWENPTlNUX0RCTCgwLjAwNSk7CiAgIGNvbnN0IEZJWFBfREJMIG1heERpZmYgPSBGTDJGWENPTlNUX0RCTCgwLjI1Zik7CiAKICAgaWYgKGJpdHNMYXN0ID4gMCkgewotCi0gICAgLyogRXN0aW1hdGUgZGV2aWF0aW9uIG9mIGdyYW50ZWQgYW5kIHVzZWQgZHluYW1pYyBiaXRzIGluIHByZXZpb3VzIGZyYW1lLCBpbiBQRSB1bml0cyAqLwotICAgIGNvbnN0IGludCBiaXRzQmFsTGFzdCA9IHBlTGFzdCAtIEZES2FhY0VuY19iaXRzMnBlMigKLSAgICAgICAgICBiaXRzTGFzdCwKLSAgICAgICAgICBiaXRzMlBlRmFjdG9yX20sCi0gICAgICAgICAgYml0czJQZUZhY3Rvcl9lKTsKKyAgICAvKiBFc3RpbWF0ZSBkZXZpYXRpb24gb2YgZ3JhbnRlZCBhbmQgdXNlZCBkeW5hbWljIGJpdHMgaW4gcHJldmlvdXMgZnJhbWUsIGluCisgICAgICogUEUgdW5pdHMgKi8KKyAgICBjb25zdCBpbnQgYml0c0JhbExhc3QgPQorICAgICAgICBwZUxhc3QgLSBGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsIGJpdHMyUGVGYWN0b3JfbSwgYml0czJQZUZhY3Rvcl9lKTsKIAogICAgIC8qIHJlc2VydmUgbiBiaXRzIHBlciBjaGFubmVsICovCi0gICAgaW50IGhlYWRyb29tID0gKGJpdHJlc0xldmVsPj01MCpuQ2hhbm5lbHMpID8gMCA6ICgxMDAqbkNoYW5uZWxzKTsKKyAgICBpbnQgaGVhZHJvb20gPSAoYml0cmVzTGV2ZWwgPj0gNTAgKiBuQ2hhbm5lbHMpID8gMCA6ICgxMDAgKiBuQ2hhbm5lbHMpOwogCiAgICAgLyogaW4gUEUgdW5pdHMgKi8KLSAgICBoZWFkcm9vbSA9IEZES2FhY0VuY19iaXRzMnBlMigKLSAgICAgICAgICBoZWFkcm9vbSwKLSAgICAgICAgICBiaXRzMlBlRmFjdG9yX20sCi0gICAgICAgICAgYml0czJQZUZhY3Rvcl9lKTsKKyAgICBoZWFkcm9vbSA9IEZES2FhY0VuY19iaXRzMnBlMihoZWFkcm9vbSwgYml0czJQZUZhY3Rvcl9tLCBiaXRzMlBlRmFjdG9yX2UpOwogCiAgICAgLyoKICAgICAgKiBkaWZmID0gYW1wICogKChiaXRzQmFsTGFzdCAtIGhlYWRyb29tKSAvIChiaXRyZXNMZXZlbCArIGhlYWRyb29tKQogICAgICAqIGRpZmYgPSBtYXggKCBtaW4gKCBkaWZmLCBtYXhEaWZmLCAtbWF4RGlmZikpIC8gMgogICAgICAqLwotICAgIEZJWFBfREJMIGRlbm9taW5hdG9yID0gKEZJWFBfREJMKUZES2FhY0VuY19iaXRzMnBlMihiaXRyZXNMZXZlbCwgYml0czJQZUZhY3Rvcl9tLCBiaXRzMlBlRmFjdG9yX2UpICsgKEZJWFBfREJMKWhlYWRyb29tOworICAgIEZJWFBfREJMIGRlbm9taW5hdG9yID0gKEZJWFBfREJMKUZES2FhY0VuY19iaXRzMnBlMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyZXNMZXZlbCwgYml0czJQZUZhY3Rvcl9tLCBiaXRzMlBlRmFjdG9yX2UpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCloZWFkcm9vbTsKIAogICAgIGludCBzY2FsaW5nID0gMDsKLSAgICBGSVhQX0RCTCBkaWZmID0gKGJpdHNCYWxMYXN0Pj1oZWFkcm9vbSkKLSAgICAgICAgID8gIGZNdWx0KGFtcCwgZkRpdk5vcm0oIChGSVhQX0RCTCkoYml0c0JhbExhc3QgLSBoZWFkcm9vbSksIGRlbm9taW5hdG9yLCAmc2NhbGluZykpCi0gICAgICAgICA6IC1mTXVsdChhbXAsIGZEaXZOb3JtKC0oRklYUF9EQkwpKGJpdHNCYWxMYXN0IC0gaGVhZHJvb20pLCBkZW5vbWluYXRvciwgJnNjYWxpbmcpKSA7CisgICAgRklYUF9EQkwgZGlmZiA9CisgICAgICAgIChiaXRzQmFsTGFzdCA+PSBoZWFkcm9vbSkKKyAgICAgICAgICAgID8gZk11bHQoYW1wLCBmRGl2Tm9ybSgoRklYUF9EQkwpKGJpdHNCYWxMYXN0IC0gaGVhZHJvb20pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yLCAmc2NhbGluZykpCisgICAgICAgICAgICA6IC1mTXVsdChhbXAsIGZEaXZOb3JtKC0oRklYUF9EQkwpKGJpdHNCYWxMYXN0IC0gaGVhZHJvb20pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciwgJnNjYWxpbmcpKTsKIAogICAgIHNjYWxpbmcgLT0gMTsgLyogZGl2aWRlIGJ5IDIgKi8KIAotICAgIGRpZmYgPSAoc2NhbGluZzw9MCkgPyBGREttYXgoIEZES21pbiAoZGlmZj4+KC1zY2FsaW5nKSwgbWF4RGlmZj4+MSksIC1tYXhEaWZmPj4xKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBGREttYXgoIEZES21pbiAoZGlmZiwgbWF4RGlmZj4+KDErc2NhbGluZykpLCAtbWF4RGlmZj4+KDErc2NhbGluZykpIDw8IHNjYWxpbmc7CisgICAgZGlmZiA9IChzY2FsaW5nIDw9IDApCisgICAgICAgICAgICAgICA/IGZNYXgoZk1pbihkaWZmID4+ICgtc2NhbGluZyksIG1heERpZmYgPj4gMSksIC1tYXhEaWZmID4+IDEpCisgICAgICAgICAgICAgICA6IGZNYXgoZk1pbihkaWZmLCBtYXhEaWZmID4+ICgxICsgc2NhbGluZykpLAorICAgICAgICAgICAgICAgICAgICAgIC1tYXhEaWZmID4+ICgxICsgc2NhbGluZykpCisgICAgICAgICAgICAgICAgICAgICA8PCBzY2FsaW5nOwogCiAgICAgLyoKICAgICAgKiBjb3JyRmFjICs9IGRpZmYKICAgICAgKiBjb3JyRmFjID0gbWF4ICggbWluICggY29yckZhYy8yLmYsIDEuZi8yLmYsIDAuNzVmLzIuZiApICkKICAgICAgKi8KLSAgICAqY29ycmVjdGlvbkZhY19tID0gRkRLbWF4KEZES21pbigoKmNvcnJlY3Rpb25GYWNfbSkrZGlmZiwgRkwyRlhDT05TVF9EQkwoMS4wZi8yLmYpKSwgRkwyRlhDT05TVF9EQkwoMC43NWYvMi5mKSkgOworICAgICpjb3JyZWN0aW9uRmFjX20gPQorICAgICAgICBmTWF4KGZNaW4oKCpjb3JyZWN0aW9uRmFjX20pICsgZGlmZiwgRkwyRlhDT05TVF9EQkwoMS4wZiAvIDIuZikpLAorICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNzVmIC8gMi5mKSk7CiAgICAgKmNvcnJlY3Rpb25GYWNfZSA9IDE7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgKmNvcnJlY3Rpb25GYWNfbSA9IEZMMkZYQ09OU1RfREJMKDAuNzUvMi5mKTsKKyAgfSBlbHNlIHsKKyAgICAqY29ycmVjdGlvbkZhY19tID0gRkwyRlhDT05TVF9EQkwoMC43NSAvIDIuZik7CiAgICAgKmNvcnJlY3Rpb25GYWNfZSA9IDE7CiAgIH0KIH0KIAotdm9pZCBGREthYWNFbmNfRGlzdHJpYnV0ZUJpdHMoQURKX1RIUl9TVEFURSAqYWRqVGhyU3RhdGUsCi0gICAgQVRTX0VMRU1FTlQgICAgICAgKkFkalRoclN0YXRlRWxlbWVudCwKLSAgICBQU1lfT1VUX0NIQU5ORUwgICAqcHN5T3V0Q2hhbm5lbFsoMildLAotICAgIFBFX0RBVEEgICAgICAgICAgICpwZURhdGEsCi0gICAgSU5UICAgICAgICAgICAgICAgKmdyYW50ZWRQZSwKLSAgICBJTlQgICAgICAgICAgICAgICAqZ3JhbnRlZFBlQ29yciwKLSAgICBjb25zdCBJTlQgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgY29uc3QgSU5UICAgICAgICAgY29tbW9uV2luZG93LAotICAgIGNvbnN0IElOVCAgICAgICAgIGdyYW50ZWREeW5CaXRzLAotICAgIGNvbnN0IElOVCAgICAgICAgIGJpdHJlc0JpdHMsCi0gICAgY29uc3QgSU5UICAgICAgICAgbWF4Qml0cmVzQml0cywKLSAgICBjb25zdCBGSVhQX0RCTCAgICBtYXhCaXRGYWMsCi0gICAgY29uc3QgSU5UICAgICAgICAgYml0RGlzdHJpYnV0aW9uTW9kZSkKLXsKK3ZvaWQgRkRLYWFjRW5jX0Rpc3RyaWJ1dGVCaXRzKAorICAgIEFESl9USFJfU1RBVEUgKmFkalRoclN0YXRlLCBBVFNfRUxFTUVOVCAqQWRqVGhyU3RhdGVFbGVtZW50LAorICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFsoMildLCBQRV9EQVRBICpwZURhdGEsIElOVCAqZ3JhbnRlZFBlLAorICAgIElOVCAqZ3JhbnRlZFBlQ29yciwgY29uc3QgSU5UIG5DaGFubmVscywgY29uc3QgSU5UIGNvbW1vbldpbmRvdywKKyAgICBjb25zdCBJTlQgZ3JhbnRlZER5bkJpdHMsIGNvbnN0IElOVCBiaXRyZXNCaXRzLCBjb25zdCBJTlQgbWF4Qml0cmVzQml0cywKKyAgICBjb25zdCBGSVhQX0RCTCBtYXhCaXRGYWMsIGNvbnN0IEFBQ0VOQ19CSVRSRVNfTU9ERSBiaXRSZXNNb2RlKSB7CiAgIEZJWFBfREJMIGJpdEZhY3RvcjsKKyAgSU5UIGJpdEZhY3Rvcl9lOwogICBJTlQgbm9SZWRQZSA9IHBlRGF0YS0+cGU7CiAKICAgLyogcHJlZmVyIHNob3J0IHdpbmRvd3MgZm9yIGNhbGN1bGF0aW9uIG9mIGJpdEZhY3RvciAqLwogICBJTlQgY3VyV2luZG93U2VxdWVuY2UgPSBMT05HX1dJTkRPVzsKLSAgaWYgKG5DaGFubmVscz09MikgeworICBpZiAobkNoYW5uZWxzID09IDIpIHsKICAgICBpZiAoKHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHx8CiAgICAgICAgIChwc3lPdXRDaGFubmVsWzFdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSkgewotICAgICAgICBjdXJXaW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsKKyAgICAgIGN1cldpbmRvd1NlcXVlbmNlID0gU0hPUlRfV0lORE9XOwogICAgIH0KLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBjdXJXaW5kb3dTZXF1ZW5jZSA9IHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZTsKICAgfQogCiAgIGlmIChncmFudGVkRHluQml0cyA+PSAxKSB7Ci0gICAgaWYgKGJpdERpc3RyaWJ1dGlvbk1vZGUhPTApIHsKLSAgICAgICpncmFudGVkUGUgPSBGREthYWNFbmNfYml0czJwZTIoZ3JhbnRlZER5bkJpdHMsIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9tLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgLyogZmFjdG9yIGRlcGVuZGVuZCBvbiBjdXJyZW50IGZpbGwgbGV2ZWwgYW5kIHBlICovCi0gICAgYml0RmFjdG9yID0gRkRLYWFjRW5jX2JpdHJlc0NhbGNCaXRGYWMoYml0cmVzQml0cywgbWF4Qml0cmVzQml0cywgbm9SZWRQZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cldpbmRvd1NlcXVlbmNlLCBncmFudGVkRHluQml0cywgbWF4Qml0RmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqVGhyU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgaWYgKGJpdFJlc01vZGUgIT0gQUFDRU5DX0JSX01PREVfRlVMTCkgeworICAgICAgLyogc21hbGwgb3IgZGlzYWJsZWQgYml0cmVzZXJ2b2lyICovCisgICAgICAqZ3JhbnRlZFBlID0gRkRLYWFjRW5jX2JpdHMycGUyKGdyYW50ZWREeW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX2UpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBmYWN0b3IgZGVwZW5kZW5kIG9uIGN1cnJlbnQgZmlsbCBsZXZlbCBhbmQgcGUgKi8KKyAgICAgIEZES2FhY0VuY19iaXRyZXNDYWxjQml0RmFjKAorICAgICAgICAgIGJpdHJlc0JpdHMsIG1heEJpdHJlc0JpdHMsIG5vUmVkUGUsIGN1cldpbmRvd1NlcXVlbmNlLCBncmFudGVkRHluQml0cywKKyAgICAgICAgICBtYXhCaXRGYWMsIGFkalRoclN0YXRlLCBBZGpUaHJTdGF0ZUVsZW1lbnQsICZiaXRGYWN0b3IsICZiaXRGYWN0b3JfZSk7CiAKLSAgICAvKiBkZXNpcmVkIHBlIGZvciBhY3R1YWwgZnJhbWUgKi8KLSAgICAvKiBXb3JzdCBjYXNlIG1heCBvZiBncmFudGVkRHluQml0cyBpcyA9IDEwMjQgKiA1LjI3ICogMiAqLwotICAgICpncmFudGVkUGUgPSBGREthYWNFbmNfYml0czJwZTIoZ3JhbnRlZER5bkJpdHMsCi0gICAgICAgICAgICAgICAgICAgICBmTXVsdChiaXRGYWN0b3IsIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9tKSwgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX2UrKERGUkFDVF9CSVRTLTEtUV9CSVRGQUMpCi0gICAgICAgICAgICAgICAgICAgICApOworICAgICAgLyogZGVzaXJlZCBwZSBmb3IgYWN0dWFsIGZyYW1lICovCisgICAgICAvKiBXb3JzdCBjYXNlIG1heCBvZiBncmFudGVkRHluQml0cyBpcyA9IDEwMjQgKiA1LjI3ICogMiAqLworICAgICAgKmdyYW50ZWRQZSA9IEZES2FhY0VuY19iaXRzMnBlMigKKyAgICAgICAgICBncmFudGVkRHluQml0cywgZk11bHQoYml0RmFjdG9yLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSksCisgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX2UgKyBiaXRGYWN0b3JfZSk7CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgICpncmFudGVkUGUgPSAwOyAvKiBwcmV2ZW50IGRpdnNpb24gYnkgMCAqLwogICB9CiAKICAgLyogY29ycmVjdGlvbiBvZiBwZSB2YWx1ZSAqLwotICBzd2l0Y2ggKGJpdERpc3RyaWJ1dGlvbk1vZGUpIHsKLSAgY2FzZSAyOgotICBjYXNlIDE6Ci0gICAgRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb25Mb3dCaXRSZXMoCi0gICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9tLAotICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfZSwKLSAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0LAotICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCwKLSAgICAgICAgICAgIGJpdHJlc0JpdHMsCi0gICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSwKLSAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lCi0gICAgICAgICk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgMDoKLSAgZGVmYXVsdDoKKyAgc3dpdGNoIChiaXRSZXNNb2RlKSB7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9ESVNBQkxFRDoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1JFRFVDRUQ6CisgICAgICAvKiBjb3JyZWN0aW9uIG9mIHBlIHZhbHVlIGZvciBsb3cgYml0cmVzICovCisgICAgICBGREthYWNFbmNfY2FsY1BlQ29ycmVjdGlvbkxvd0JpdFJlcygKKyAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfbSwKKyAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfZSwgQWRqVGhyU3RhdGVFbGVtZW50LT5wZUxhc3QsCisgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCwgYml0cmVzQml0cywgbkNoYW5uZWxzLAorICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9tLAorICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfRlVMTDoKKyAgICBkZWZhdWx0OgorICAgICAgLyogY29ycmVjdGlvbiBvZiBwZSB2YWx1ZSBmb3IgaGlnaCBiaXRyZXMgKi8KICAgICAgIEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlQ29ycmVjdGlvbigKLSAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX20sCi0gICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9lLAotICAgICAgICAgICAgZml4TWluKCpncmFudGVkUGUsIG5vUmVkUGUpLAotICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5wZUxhc3QsCi0gICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmR5bkJpdHNMYXN0LAotICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX20sCi0gICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfZQotICAgICAgICAgICAgKTsKLSAgICBicmVhazsKKyAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfbSwKKyAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfZSwKKyAgICAgICAgICBmaXhNaW4oKmdyYW50ZWRQZSwgbm9SZWRQZSksIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0LAorICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+ZHluQml0c0xhc3QsIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9tLAorICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lKTsKKyAgICAgIGJyZWFrOwogICB9CiAKLSAgKmdyYW50ZWRQZUNvcnIgPSAoSU5UKShmTXVsdCgoRklYUF9EQkwpKCpncmFudGVkUGU8PFFfQVZHQklUUyksIEFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX20pID4+IChRX0FWR0JJVFMtQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfZSkpOworICAqZ3JhbnRlZFBlQ29yciA9CisgICAgICAoSU5UKShmTXVsdCgoRklYUF9EQkwpKCpncmFudGVkUGUgPDwgUV9BVkdCSVRTKSwKKyAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX20pID4+CisgICAgICAgICAgICAoUV9BVkdCSVRTIC0gQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfZSkpOwogCiAgIC8qIHVwZGF0ZSBsYXN0IHBlICovCiAgIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0ID0gKmdyYW50ZWRQZTsKICAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCA9IC0xOwotCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcwogZGVzY3JpcHRpb246ICBhZGp1c3QgdGhyZXNob2xkcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEZES2FhY0VuY19BZGp1c3RUaHJlc2hvbGRzKEFUU19FTEVNRU5UKiAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50Wyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgICAgcWNFbGVtZW50Wyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogICAgICAgICAgICAgcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogICAgcHN5T3V0RWxlbWVudFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgIENCUmJpdHJhdGVNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1heEl0ZXIybmRHdWVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgICBjbSkKLXsKLSAgICBpbnQgaTsKLSAgICBpZiAoQ0JSYml0cmF0ZU1vZGUpCi0gICAgewotICAgICAgICAvKiBJbiBjYXNlLCBubyBiaXRzIG11c3QgYmUgc2hpZnRlZCBiZXR3ZWVuIGRpZmZlcmVudCBlbGVtZW50cywgKi8KLSAgICAgICAgLyogYW4gZWxlbWVudC13aXNlIGV4ZWN1dGlvbiBvZiB0aGUgcGUtZGVwZW5kZW50IHRocmVzaG9sZC0gKi8KLSAgICAgICAgLyogYWRhcHRpb24gYmVjb21lcyBuZWNlc3NhcnkuLi4gKi8KLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKK3ZvaWQgRkRLYWFjRW5jX0FkanVzdFRocmVzaG9sZHMoCisgICAgQURKX1RIUl9TVEFURSAqY29uc3QgaEFkalRociwgUUNfT1VUX0VMRU1FTlQgKmNvbnN0IHFjRWxlbWVudFsoKDgpKV0sCisgICAgUUNfT1VUICpjb25zdCBxY091dCwgY29uc3QgUFNZX09VVF9FTEVNRU5UICpjb25zdCBwc3lPdXRFbGVtZW50WygoOCkpXSwKKyAgICBjb25zdCBJTlQgQ0JSYml0cmF0ZU1vZGUsIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY29uc3QgY20pIHsKKyAgaW50IGk7CiAKLSAgICAgICAgICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBxY0VsZW1lbnRbaV0tPmdyYW50ZWRQZSA9IDIwMDA7ICovICAvKiBVc2UgdGhpcyBvbmx5IGZvciBkZWJ1Z2dpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgLy9pZiAodG90YWxHcmFudGVkUGVDb3JyIDwgdG90YWxOb1JlZFBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxY0VsZW1lbnRbaV0tPmdyYW50ZWRQZSA8IHFjRWxlbWVudFtpXS0+cGVEYXRhLnBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjIHRocmVzaG9sZCBuZWNlc3NhcnkgZm9yIGRlc2lyZWQgcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2ldLT5ncmFudGVkUGVDb3JyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhJdGVyMm5kR3Vlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgLyogUHJvY2VzcyBvbmx5IDEgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsgICAgICAgIC8qIFByb2Nlc3MgZXhhY3RseSBUSElTIGVsZW1lbnQgKi8KKyAgaWYgKENCUmJpdHJhdGVNb2RlKSB7CisgICAgLyogSW4gY2FzZSwgbm8gYml0cyBtdXN0IGJlIHNoaWZ0ZWQgYmV0d2VlbiBkaWZmZXJlbnQgZWxlbWVudHMsICovCisgICAgLyogYW4gZWxlbWVudC13aXNlIGV4ZWN1dGlvbiBvZiB0aGUgcGUtZGVwZW5kZW50IHRocmVzaG9sZC0gKi8KKyAgICAvKiBhZGFwdGlvbiBiZWNvbWVzIG5lY2Vzc2FyeS4uLiAqLworICAgIGlmIChoQWRqVGhyLT5iaXREaXN0cmlidXRpb25Nb2RlID09IEFBQ0VOQ19CRF9NT0RFX0lOVFJBX0VMRU1FTlQpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CiAKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKSB7CisgICAgICAgICAgLyogcWNFbGVtZW50W2ldLT5ncmFudGVkUGUgPSAyMDAwOyAqLyAvKiBVc2UgdGhpcyBvbmx5IGZvciBkZWJ1Z2dpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIC8vIGlmICh0b3RhbEdyYW50ZWRQZUNvcnIgPCB0b3RhbE5vUmVkUGUpIHsKKyAgICAgICAgICBpZiAocWNFbGVtZW50W2ldLT5ncmFudGVkUGVDb3JyIDwgcWNFbGVtZW50W2ldLT5wZURhdGEucGUpIHsKKyAgICAgICAgICAgIC8qIGNhbGMgdGhyZXNob2xkIG5lY2Vzc2FyeSBmb3IgZGVzaXJlZCBwZSAqLworICAgICAgICAgICAgRkRLYWFjRW5jX2FkYXB0VGhyZXNob2xkc1RvUGUoCisgICAgICAgICAgICAgICAgY20sIGhBZGpUaHItPmFkalRoclN0YXRlRWxlbSwgcWNFbGVtZW50LCBwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgIHFjRWxlbWVudFtpXS0+Z3JhbnRlZFBlQ29yciwgaEFkalRoci0+bWF4SXRlcjJuZEd1ZXNzLAorICAgICAgICAgICAgICAgIDEsIC8qIFByb2Nlc3Mgb25seSAxIGVsZW1lbnQgKi8KKyAgICAgICAgICAgICAgICBpICAvKiBQcm9jZXNzIGV4YWN0bHkgVEhJUyBlbGVtZW50ICovCisgICAgICAgICAgICApOworICAgICAgICAgIH0KKyAgICAgICAgfSAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCisgICAgICB9ICAgLyogLWVuZC0gZWxlbWVudCBsb29wICovCisgICAgfSAgICAgLyogQUFDRU5DX0JEX01PREVfSU5UUkFfRUxFTUVOVCAqLworICAgIGVsc2UgaWYgKGhBZGpUaHItPmJpdERpc3RyaWJ1dGlvbk1vZGUgPT0gQUFDRU5DX0JEX01PREVfSU5URVJfRUxFTUVOVCkgeworICAgICAgLyogVXNlIGdsb2JhbCBQZSB0byBvYnRhaW4gdGhlIHRocmVzaG9sZHM/ICovCisgICAgICBpZiAocWNPdXQtPnRvdGFsR3JhbnRlZFBlQ29yciA8IHFjT3V0LT50b3RhbE5vUmVkUGUpIHsKKyAgICAgICAgLyogYWRkIGVxdWFsIGxvYWRuZXNzIHF1YW50aXphdGlvbiBub2lzZSB0byBtYXRjaCB0aGUgKi8KKyAgICAgICAgLyogZGVzaXJlZCBwZSBjYWxjIHRocmVzaG9sZCBuZWNlc3NhcnkgZm9yIGRlc2lyZWQgcGUgKi8KKyAgICAgICAgLyogTm93IGNhcnJpZWQgb3V0IGdsb2JhbGx5IHRvIGNvdmVyIGFsbCghKSBjaGFubmVscy4gKi8KKyAgICAgICAgRkRLYWFjRW5jX2FkYXB0VGhyZXNob2xkc1RvUGUoY20sIGhBZGpUaHItPmFkalRoclN0YXRlRWxlbSwgcWNFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LCBxY091dC0+dG90YWxHcmFudGVkUGVDb3JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWRqVGhyLT5tYXhJdGVyMm5kR3Vlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5uRWxlbWVudHMsIC8qIFByb2Nlc3MgYWxsIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKiBQcm9jZXNzIGV4YWN0bHkgVEhJUyBlbGVtZW50ICovCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBJbiBjYXNlIGdsb2JhbCBwZSBkb2Vzbid0IG5lZWQgdG8gYmUgcmVkdWNlZCBjaGVjayBlYWNoIGVsZW1lbnQgdG8KKyAgICAgICAgICAgaG9sZCBlc3RpbWF0ZWQgYml0cmF0ZSBiZWxvdyBtYXhpbXVtIGVsZW1lbnQgYml0cmF0ZS4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgICAgICAgIGlmICgoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfU0NFKSB8fAorICAgICAgICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfTEZFKSkgeworICAgICAgICAgICAgLyogRWxlbWVudCBwZSBhcHBsaWVzIHRvIGR5bmFtaWMgYml0cyBvZiBtYXhpbXVtIGVsZW1lbnQgYml0cmF0ZS4gKi8KKyAgICAgICAgICAgIGNvbnN0IGludCBtYXhFbGVtZW50UGUgPSBGREthYWNFbmNfYml0czJwZTIoCisgICAgICAgICAgICAgICAgKGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbCAqIE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTikgLQorICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbaV0tPnN0YXRpY0JpdHNVc2VkIC0gcWNFbGVtZW50W2ldLT5leHRCaXRzVXNlZCwKKyAgICAgICAgICAgICAgICBoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0tPmJpdHMyUGVGYWN0b3JfbSwKKyAgICAgICAgICAgICAgICBoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0tPmJpdHMyUGVGYWN0b3JfZSk7CiAKLSAgICAgICAgICAgICAgICB9ICAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCi0KLSAgICAgICAgICAgIH0gIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKLQotICAgICAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAotICAgICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBmb3IgVkJSLW1vZGUgKi8KLSAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19BZGFwdFRocmVzaG9sZHNWQlIocWNFbGVtZW50W2ldLT5xY091dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnRbaV0tPnRvb2xzSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjRWxlbWVudFtpXS0+cGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWwpOwotICAgICAgICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwotCi0gICAgICAgIH0gIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLwotCi0gICAgfQotICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgewotICAgICAgICBpbnQgY2gsc2ZiLHNmYkdycDsKLSAgICAgICAgLyogbm8gd2VpZ2h0aW5nIG9mIHRocmVob2xkcyBhbmQgZW5lcmdpZXMgZm9yIG1sb3V0ICovCi0gICAgICAgIC8qIHdlaWdodCBlbmVyZ2llcyBhbmQgdGhyZXNob2xkcyAqLwotICAgICAgICBmb3IgKGNoPTA7IGNoPGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgewotICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHBRY091dENoID0gcWNFbGVtZW50W2ldLT5xY091dENoYW5uZWxbY2hdOwotICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcFFjT3V0Q2gtPnNmYlRocmVzaG9sZExkRGF0YVtzZmIrc2ZiR3JwXSArPSBwUWNPdXRDaC0+c2ZiRW5GYWNMZFtzZmIrc2ZiR3JwXTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF4RWxlbWVudFBlIDwgcWNFbGVtZW50W2ldLT5wZURhdGEucGUpIHsKKyAgICAgICAgICAgICAgRkRLYWFjRW5jX2FkYXB0VGhyZXNob2xkc1RvUGUoCisgICAgICAgICAgICAgICAgICBjbSwgaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtLCBxY0VsZW1lbnQsIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICBtYXhFbGVtZW50UGUsIGhBZGpUaHItPm1heEl0ZXIybmRHdWVzcywgMSwgaSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CisgICAgICAgICAgfSAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCisgICAgICAgIH0gICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KKyAgICAgIH0gICAgIC8qIChxY091dC0+dG90YWxHcmFudGVkUGVDb3JyIDwgcWNPdXQtPnRvdGFsTm9SZWRQZSkgKi8KKyAgICB9ICAgICAgIC8qIEFBQ0VOQ19CRF9NT0RFX0lOVEVSX0VMRU1FTlQgKi8KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY20tPm5FbGVtZW50czsgaSsrKSB7CisgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKIAotdm9pZCBGREthYWNFbmNfQWRqVGhyQ2xvc2UoQURKX1RIUl9TVEFURSoqIHBoQWRqVGhyKQotewotICAgIElOVCBpOwotICAgIEFESl9USFJfU1RBVEUqIGhBZGpUaHIgPSAqcGhBZGpUaHI7CisgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkgeworICAgICAgICAvKiBmb3IgVkJSLW1vZGUgKi8KKyAgICAgICAgRkRLYWFjRW5jX0FkYXB0VGhyZXNob2xkc1ZCUigKKyAgICAgICAgICAgIHFjRWxlbWVudFtpXS0+cWNPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldLCAmcHN5T3V0RWxlbWVudFtpXS0+dG9vbHNJbmZvLAorICAgICAgICAgICAgY20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsKTsKKyAgICAgIH0gLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwogCi0gICAgaWYgKGhBZGpUaHIhPU5VTEwpIHsKLSAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7Ci0gICAgICAgIGlmIChoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0hPU5VTEwpIHsKLSAgICAgICAgICBGcmVlUmFtX2FhY0VuY19BZGpUaHJTdGF0ZUVsZW1lbnQoJmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSk7CisgICAgfSAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgY20tPm5FbGVtZW50czsgaSsrKSB7CisgICAgaW50IGNoLCBzZmIsIHNmYkdycDsKKyAgICAvKiBubyB3ZWlnaHRpbmcgb2YgdGhyZWhvbGRzIGFuZCBlbmVyZ2llcyBmb3IgbWxvdXQgKi8KKyAgICAvKiB3ZWlnaHQgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgICAgIFFDX09VVF9DSEFOTkVMICpwUWNPdXRDaCA9IHFjRWxlbWVudFtpXS0+cWNPdXRDaGFubmVsW2NoXTsKKyAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgICAgc2ZiR3JwICs9IHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgeworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsKKyAgICAgICAgICAgICBzZmIrKykgeworICAgICAgICAgIHBRY091dENoLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiICsgc2ZiR3JwXSArPQorICAgICAgICAgICAgICBwUWNPdXRDaC0+c2ZiRW5GYWNMZFtzZmIgKyBzZmJHcnBdOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBGcmVlUmFtX2FhY0VuY19BZGp1c3RUaHJlc2hvbGQocGhBZGpUaHIpOwogICAgIH0KKyAgfQogfQogCit2b2lkIEZES2FhY0VuY19BZGpUaHJDbG9zZShBREpfVEhSX1NUQVRFICoqcGhBZGpUaHIpIHsKKyAgSU5UIGk7CisgIEFESl9USFJfU1RBVEUgKmhBZGpUaHIgPSAqcGhBZGpUaHI7CisKKyAgaWYgKGhBZGpUaHIgIT0gTlVMTCkgeworICAgIGZvciAoaSA9IDA7IGkgPCAoKDgpKTsgaSsrKSB7CisgICAgICBpZiAoaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldICE9IE5VTEwpIHsKKyAgICAgICAgRnJlZVJhbV9hYWNFbmNfQWRqVGhyU3RhdGVFbGVtZW50KCZoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0pOworICAgICAgfQorICAgIH0KKyAgICBGcmVlUmFtX2FhY0VuY19BZGp1c3RUaHJlc2hvbGQocGhBZGpUaHIpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2Fkal90aHIuaCBiL2xpYkFBQ2VuYy9zcmMvYWRqX3Roci5oCmluZGV4IGJlNjhjNmUuLjFmNWY5OTggMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWRqX3Roci5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWRqX3Roci5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDcxICs5MCw3NyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBUaHJlc2hvbGQgY29tcGVuc2F0aW9uCisgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBUaHJlc2hvbGQgY29tcGVuc2F0aW9uCiAKLSNpZm5kZWYgX19BREpfVEhSX0gKLSNkZWZpbmUgX19BREpfVEhSX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgQURKX1RIUl9ICisjZGVmaW5lIEFESl9USFJfSAogCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogI2luY2x1ZGUgImFkal90aHJfZGF0YS5oIgogI2luY2x1ZGUgInFjX2RhdGEuaCIKICNpbmNsdWRlICJsaW5lX3BlLmgiCiAjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX3BlQ2FsY3VsYXRpb24KKyAgICBkZXNjcmlwdGlvbjoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGREthYWNFbmNfcGVDYWxjdWxhdGlvbihQRV9EQVRBICpjb25zdCBwZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAqY29uc3QgcWNPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBUT09MU0lORk8gKmNvbnN0IHRvb2xzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQgKmNvbnN0IGFkalRoclN0YXRlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscyk7CiAKLXZvaWQgRkRLYWFjRW5jX3BlQ2FsY3VsYXRpb24oCi0gICAgICAgIFBFX0RBVEEgKnBlRGF0YSwKLSAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvLAotICAgICAgICBBVFNfRUxFTUVOVCogYWRqVGhyU3RhdGVFbGVtZW50LAotICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzCi0gICAgICAgICk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2Z1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkalRock5ldworZGVzY3JpcHRpb246ICBhbGxvY2F0ZSBBREpfVEhSX1NUQVRFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVCBGREthYWNFbmNfQWRqVGhyTmV3KEFESl9USFJfU1RBVEUgKipwaEFkalRociwgSU5UIG5FbGVtZW50cyk7CiAKLUlOVCAgRkRLYWFjRW5jX0FkalRock5ldyhBREpfVEhSX1NUQVRFKiogcGhBZGpUaHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgIG5FbGVtZW50cyk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2Z1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkalRockluaXQKK2Rlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZSBBREpfVEhSX1NUQVRFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRkRLYWFjRW5jX0FkalRockluaXQoCisgICAgQURKX1RIUl9TVEFURSAqY29uc3QgaEFkalRociwgY29uc3QgSU5UIG1lYW5QZSwgY29uc3QgSU5UIGludlF1YW50LAorICAgIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY29uc3QgY2hhbm5lbE1hcHBpbmcsIGNvbnN0IElOVCBzYW1wbGVSYXRlLAorICAgIGNvbnN0IElOVCB0b3RhbEJpdHJhdGUsIGNvbnN0IElOVCBpc0xvd0RlbGF5LAorICAgIGNvbnN0IEFBQ0VOQ19CSVRSRVNfTU9ERSBiaXRSZXNNb2RlLCBjb25zdCBJTlQgZFpvbmVRdWFudEVuYWJsZSwKKyAgICBjb25zdCBJTlQgYml0RGlzdHJpYnV0aW9uTW9kZSwgY29uc3QgRklYUF9EQkwgdmJyUXVhbEZhY3Rvcik7CiAKLXZvaWQgRkRLYWFjRW5jX0FkalRockluaXQoQURKX1RIUl9TVEFURSAqaEFkalRociwKLSAgICAgICAgICAgICAgICBjb25zdCBJTlQgcGVNZWFuLAotICAgICAgICAgICAgICAgIEVMRU1FTlRfQklUUyogZWxCaXRzWyg4KV0sCi0gICAgICAgICAgICAgICAgSU5UIGludlF1YW50LAotICAgICAgICAgICAgICAgIElOVCBuRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgSU5UIG5DaGFubmVsc0VmZiwKLSAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBJTlQgYWR2YW5jZWRCaXRzVG9QZSwKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCB2YnJRdWFsRmFjdG9yLAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkWm9uZVF1YW50RW5hYmxlKTsKLSAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRGlzdHJpYnV0ZUJpdHMKK2Rlc2NyaXB0aW9uOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEZES2FhY0VuY19EaXN0cmlidXRlQml0cygKKyAgICBBREpfVEhSX1NUQVRFICphZGpUaHJTdGF0ZSwgQVRTX0VMRU1FTlQgKkFkalRoclN0YXRlRWxlbWVudCwKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbKDIpXSwgUEVfREFUQSAqcGVEYXRhLCBJTlQgKmdyYW50ZWRQZSwKKyAgICBJTlQgKmdyYW50ZWRQZUNvcnIsIGNvbnN0IElOVCBuQ2hhbm5lbHMsIGNvbnN0IElOVCBjb21tb25XaW5kb3csCisgICAgY29uc3QgSU5UIGF2Z0JpdHMsIGNvbnN0IElOVCBiaXRyZXNCaXRzLCBjb25zdCBJTlQgbWF4Qml0cmVzQml0cywKKyAgICBjb25zdCBGSVhQX0RCTCBtYXhCaXRGYWMsIGNvbnN0IEFBQ0VOQ19CSVRSRVNfTU9ERSBiaXRSZXNNb2RlKTsKIAotdm9pZCBGREthYWNFbmNfRGlzdHJpYnV0ZUJpdHMoQURKX1RIUl9TVEFURSAqYWRqVGhyU3RhdGUsCi0gICAgQVRTX0VMRU1FTlQgICAgICAgKkFkalRoclN0YXRlRWxlbWVudCwKLSAgICBQU1lfT1VUX0NIQU5ORUwgICAqcHN5T3V0Q2hhbm5lbFsoMildLAotICAgIFBFX0RBVEEgICAgICAgICAgICpwZURhdGEsCi0gICAgSU5UICAgICAgICAgICAgICAgKmdyYW50ZWRQZSwKLSAgICBJTlQgICAgICAgICAgICAgICAqZ3JhbnRlZFBlQ29yciwKLSAgICBjb25zdCBJTlQgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgY29uc3QgSU5UICAgICAgICAgY29tbW9uV2luZG93LAotICAgIGNvbnN0IElOVCAgICAgICAgIGF2Z0JpdHMsCi0gICAgY29uc3QgSU5UICAgICAgICAgYml0cmVzQml0cywKLSAgICBjb25zdCBJTlQgICAgICAgICBtYXhCaXRyZXNCaXRzLAotICAgIGNvbnN0IEZJWFBfREJMICAgIG1heEJpdEZhYywKLSAgICBjb25zdCBJTlQgICAgICAgICBiaXREaXN0cmlidXRpb25Nb2RlKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcworZGVzY3JpcHRpb246ICBhZGp1c3QgdGhyZXNob2xkcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEZES2FhY0VuY19BZGp1c3RUaHJlc2hvbGRzKAorICAgIEFESl9USFJfU1RBVEUgKmNvbnN0IGhBZGpUaHIsIFFDX09VVF9FTEVNRU5UICpjb25zdCBxY0VsZW1lbnRbKCg4KSldLAorICAgIFFDX09VVCAqY29uc3QgcWNPdXQsIGNvbnN0IFBTWV9PVVRfRUxFTUVOVCAqY29uc3QgcHN5T3V0RWxlbWVudFsoKDgpKV0sCisgICAgY29uc3QgSU5UIENCUmJpdHJhdGVNb2RlLCBjb25zdCBDSEFOTkVMX01BUFBJTkcgKmNvbnN0IGNtKTsKIAotdm9pZCBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcyhBVFNfRUxFTUVOVCogQWRqVGhyU3RhdGVFbGVtZW50Wyg4KV0sCi0gICAgUUNfT1VUX0VMRU1FTlQqICAgcWNFbGVtZW50Wyg4KV0sCi0gICAgUUNfT1VUKiAgICAgICAgICAgcWNPdXQsCi0gICAgUFNZX09VVF9FTEVNRU5UKiAgcHN5T3V0RWxlbWVudFsoOCldLAotICAgIElOVCAgICAgICAgICAgICAgIENCUmJpdHJhdGVNb2RlLAotICAgIElOVCAgICAgICAgICAgICAgIG1heEl0ZXIybmRHdWVzcywKLSAgICBDSEFOTkVMX01BUFBJTkcqICBjbSk7Ci0KLXZvaWQgRkRLYWFjRW5jX0FkalRockNsb3NlKEFESl9USFJfU1RBVEUqKiBoQWRqVGhyKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQWRqVGhyQ2xvc2UKK2Rlc2NyaXB0aW9uOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEZES2FhY0VuY19BZGpUaHJDbG9zZShBREpfVEhSX1NUQVRFICoqaEFkalRocik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hZGpfdGhyX2RhdGEuaCBiL2xpYkFBQ2VuYy9zcmMvYWRqX3Rocl9kYXRhLmgKaW5kZXggN2MzYTE5MS4uNGNkMTI5OSAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hZGpfdGhyX2RhdGEuaAorKysgYi9saWJBQUNlbmMvc3JjL2Fkal90aHJfZGF0YS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDMxICs5MCw0MiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqICBGYXN0IE1QRUcgQUFDIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAotICAgY29udGVudHMvZGVzY3JpcHRpb246IHRocmVzaG9sZCBjYWxjdWxhdGlvbnMKKyAgIEF1dGhvcihzKTogICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogdGhyZXNob2xkIGNhbGN1bGF0aW9ucwogCi0jaWZuZGVmIF9fQURKX1RIUl9EQVRBX0gKLSNkZWZpbmUgX19BREpfVEhSX0RBVEFfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBBREpfVEhSX0RBVEFfSAorI2RlZmluZSBBREpfVEhSX0RBVEFfSAogCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAKK3R5cGVkZWYgZW51bSB7CisgIEFBQ0VOQ19CRF9NT0RFX0lOVEVSX0VMRU1FTlQgPSAwLAorICBBQUNFTkNfQkRfTU9ERV9JTlRSQV9FTEVNRU5UID0gMQorfSBBQUNFTkNfQklUX0RJU1RSSUJVVElPTl9NT0RFOworCit0eXBlZGVmIGVudW0geworICBBQUNFTkNfQlJfTU9ERV9GVUxMID0gMCwKKyAgQUFDRU5DX0JSX01PREVfUkVEVUNFRCA9IDEsCisgIEFBQ0VOQ19CUl9NT0RFX0RJU0FCTEVEID0gMgorfSBBQUNFTkNfQklUUkVTX01PREU7CisKIHR5cGVkZWYgc3RydWN0IHsKLSAgIEZJWFBfREJMIGNsaXBTYXZlTG93LCBjbGlwU2F2ZUhpZ2g7Ci0gICBGSVhQX0RCTCBtaW5CaXRTYXZlLCBtYXhCaXRTYXZlOwotICAgRklYUF9EQkwgY2xpcFNwZW5kTG93LCBjbGlwU3BlbmRIaWdoOwotICAgRklYUF9EQkwgbWluQml0U3BlbmQsIG1heEJpdFNwZW5kOworICBGSVhQX0RCTCBjbGlwU2F2ZUxvdywgY2xpcFNhdmVIaWdoOworICBGSVhQX0RCTCBtaW5CaXRTYXZlLCBtYXhCaXRTYXZlOworICBGSVhQX0RCTCBjbGlwU3BlbmRMb3csIGNsaXBTcGVuZEhpZ2g7CisgIEZJWFBfREJMIG1pbkJpdFNwZW5kLCBtYXhCaXRTcGVuZDsKIH0gQlJFU19QQVJBTTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgSU5UIG1vZGlmeU1pblNucjsKLSAgIElOVCBzdGFydFNmYkwsIHN0YXJ0U2ZiUzsKKyAgSU5UIG1vZGlmeU1pblNucjsKKyAgSU5UIHN0YXJ0U2ZiTCwgc3RhcnRTZmJTOwogfSBBSF9QQVJBTTsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMTE4LDE5ICsxNDAsMjAgQEAKICAgLyogcGFyYW1ldGVycyBmb3IgYml0cmVzZXJ2b2lyIGNvbnRyb2wgKi8KICAgSU5UIHBlTWluLCBwZU1heDsKICAgLyogY29uc3RhbnQgb2Zmc2V0IHRvIHBlICAgICAgICAgICAgICAgKi8KLSAgSU5UICAgIHBlT2Zmc2V0OworICBJTlQgcGVPZmZzZXQ7CiAgIC8qIGNvbnN0YW50IFBlRmFjdG9yICovCiAgIEZJWFBfREJMIGJpdHMyUGVGYWN0b3JfbTsKLSAgSU5UICAgICAgYml0czJQZUZhY3Rvcl9lOworICBJTlQgYml0czJQZUZhY3Rvcl9lOwogICAvKiBhdm9pZCBob2xlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAqLwogICBBSF9QQVJBTSBhaFBhcmFtOwotICAvKiB2YWx1ZXMgZm9yIGNvcnJlY3Rpb24gb2YgcGUgKi8KLSAgLyogcGFyYW10ZXJzIGZvciBhZGFwdGF0aW9uIG9mIG1pblNuciAqLworICAvKiBwYXJhbWV0ZXJzIGZvciBhZGFwdGF0aW9uIG9mIG1pblNuciAqLwogICBNSU5TTlJfQURBUFRfUEFSQU0gbWluU25yQWRhcHRQYXJhbTsKKworICAvKiB2YWx1ZXMgZm9yIGNvcnJlY3Rpb24gb2YgcGUgKi8KICAgSU5UIHBlTGFzdDsKICAgSU5UIGR5bkJpdHNMYXN0OwogICBGSVhQX0RCTCBwZUNvcnJlY3Rpb25GYWN0b3JfbTsKLSAgSU5UICAgICAgcGVDb3JyZWN0aW9uRmFjdG9yX2U7CisgIElOVCBwZUNvcnJlY3Rpb25GYWN0b3JfZTsKIAogICAvKiB2YnIgZW5jb2RpbmcgKi8KICAgRklYUF9EQkwgdmJyUXVhbEZhY3RvcjsKQEAgLTEzOCwxMyArMTYxLDE0IEBACiAKICAgLyogdGhyZXNob2xkIHdlaWdodGluZyAqLwogICBGSVhQX0RCTCBjaGFvc01lYXN1cmVFbkZhY1soMildOwotICBJTlQgICAgICBsYXN0RW5GYWNQYXRjaFsoMildOworICBJTlQgbGFzdEVuRmFjUGF0Y2hbKDIpXTsKIAogfSBBVFNfRUxFTUVOVDsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICBCUkVTX1BBUkFNIGJyZXNQYXJhbUxvbmcsIGJyZXNQYXJhbVNob3J0OwotICBBVFNfRUxFTUVOVCogYWRqVGhyU3RhdGVFbGVtWyg4KV07CisgIEFUU19FTEVNRU5UKiBhZGpUaHJTdGF0ZUVsZW1bKCg4KSldOworICBBQUNFTkNfQklUX0RJU1RSSUJVVElPTl9NT0RFIGJpdERpc3RyaWJ1dGlvbk1vZGU7CiAgIElOVCBtYXhJdGVyMm5kR3Vlc3M7CiB9IEFESl9USFJfU1RBVEU7CiAKZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYmFuZF9ucmcuY3BwIGIvbGliQUFDZW5jL3NyYy9iYW5kX25yZy5jcHAKaW5kZXggODYxZjdhOC4uZmIyMmRiYiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9iYW5kX25yZy5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9iYW5kX25yZy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDEgKzkwLDQ0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogQmFuZC9MaW5lIGVuZXJneSBjYWxjdWxhdGlvbnMKKyAgIEF1dGhvcihzKTogICBNLiBXZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IEJhbmQvTGluZSBlbmVyZ3kgY2FsY3VsYXRpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJiYW5kX25yZy5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19DYWxjU2ZiTWF4U2NhbGVTcGVjCiAgIGRlc2NyaXB0aW9uOgogICBpbnB1dDoKICAgb3V0cHV0OgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1GREthYWNFbmNfQ2FsY1NmYk1heFNjYWxlU3BlYyhjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKlJFU1RSSUNUIGJhbmRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG51bUJhbmRzKQotewotICBJTlQgaSxqOwordm9pZCBGREthYWNFbmNfQ2FsY1NmYk1heFNjYWxlU3BlYyhjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKlJFU1RSSUNUIGJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtQmFuZHMpIHsKKyAgSU5UIGksIGo7CiAgIEZJWFBfREJMIG1heFNwYywgdG1wOwogCi0gIGZvcihpPTA7IGk8bnVtQmFuZHM7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewogICAgIG1heFNwYyA9IChGSVhQX0RCTCkwOwotICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldOyBqPGJhbmRPZmZzZXRbaSsxXTsgaisrKSB7CisKKyAgICBEV09SRF9BTElHTkVEKG1kY3RTcGVjdHJ1bSk7CisKKyAgICBmb3IgKGogPSBiYW5kT2Zmc2V0W2ldOyBqIDwgYmFuZE9mZnNldFtpICsgMV07IGorKykgewogICAgICAgdG1wID0gZml4cF9hYnMobWRjdFNwZWN0cnVtW2pdKTsKICAgICAgIG1heFNwYyA9IGZpeE1heChtYXhTcGMsIHRtcCk7CiAgICAgfQotICAgIHNmYk1heFNjYWxlU3BlY1tpXSA9IChtYXhTcGM9PShGSVhQX0RCTCkwKSA/IChERlJBQ1RfQklUUy0yKSA6IENudExlYWRpbmdaZXJvcyhtYXhTcGMpLTE7Ci0gICAgLyogQ291bnRMZWFkaW5nQml0cygpIGlzIG5vdCBuZWNlc3NhcnkgaGVyZSBzaW5jZSB0ZXN0IHZhbHVlIGlzIGFsd2F5cyA+IDAgKi8KKyAgICBqID0gQ250TGVhZGluZ1plcm9zKG1heFNwYykgLSAxOworICAgIHNmYk1heFNjYWxlU3BlY1tpXSA9IGZpeE1pbigoREZSQUNUX0JJVFMgLSAyKSwgaik7CisgICAgLyogQ291bnRMZWFkaW5nQml0cygpIGlzIG5vdCBuZWNlc3NhcnkgaGVyZSBzaW5jZSB0ZXN0IHZhbHVlIGlzIGFsd2F5cyA+IDAKKyAgICAgKi8KICAgfQogfQogCkBAIC0xMjQsNDMgKzEzOCw0NSBAQAogICBvdXRwdXQ6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEZJWFBfREJMCi1GREthYWNFbmNfQ2hlY2tCYW5kRW5lcmd5T3B0aW0oY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpSRVNUUklDVCBiYW5kT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBudW1CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgbWluU3BlY1NoaWZ0KQoteworRkRLYWFjRW5jX0NoZWNrQmFuZEVuZXJneU9wdGltKGNvbnN0IEZJWFBfREJMICpjb25zdCBSRVNUUklDVCBtZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpjb25zdCBSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpjb25zdCBSRVNUUklDVCBiYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWluU3BlY1NoaWZ0KSB7CiAgIElOVCBpLCBqLCBzY2FsZSwgbnIgPSAwOwogICBGSVhQX0RCTCBtYXhOcmdMZCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgRklYUF9EQkwgbWF4TnJnID0gMDsKICAgRklYUF9EQkwgc3BlYzsKIAotICBmb3IoaT0wOyBpPG51bUJhbmRzOyBpKyspIHsKLSAgICBzY2FsZSA9IGZpeE1heCgwLCBzZmJNYXhTY2FsZVNwZWNbaV0tNCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgc2NhbGUgPSBmaXhNYXgoMCwgc2ZiTWF4U2NhbGVTcGVjW2ldIC0gNCk7CiAgICAgRklYUF9EQkwgdG1wID0gMDsKLSAgICBmb3IgKGo9YmFuZE9mZnNldFtpXTsgajxiYW5kT2Zmc2V0W2krMV07IGorKyl7Ci0gICAgICAgc3BlYyA9IG1kY3RTcGVjdHJ1bVtqXTw8c2NhbGU7Ci0gICAgICAgdG1wID0gZlBvdzJBZGREaXYyKHRtcCwgc3BlYyk7CisKKyAgICBEV09SRF9BTElHTkVEKG1kY3RTcGVjdHJ1bSk7CisKKyAgICBmb3IgKGogPSBiYW5kT2Zmc2V0W2ldOyBqIDwgYmFuZE9mZnNldFtpICsgMV07IGorKykgeworICAgICAgc3BlYyA9IG1kY3RTcGVjdHJ1bVtqXSA8PCBzY2FsZTsKKyAgICAgIHRtcCA9IGZQb3cyQWRkRGl2Mih0bXAsIHNwZWMpOwogICAgIH0KLSAgICBiYW5kRW5lcmd5W2ldID0gdG1wPDwxOworICAgIGJhbmRFbmVyZ3lbaV0gPSB0bXAgPDwgMTsKIAogICAgIC8qIGNhbGN1bGF0ZSBsZCBvZiBiYW5kTnJnLCBzdWJ0cmFjdCBzY2FsaW5nICovCiAgICAgYmFuZEVuZXJneUxkRGF0YVtpXSA9IENhbGNMZERhdGEoYmFuZEVuZXJneVtpXSk7CiAgICAgaWYgKGJhbmRFbmVyZ3lMZERhdGFbaV0gIT0gRkwyRlhDT05TVF9EQkwoLTEuMGYpKSB7Ci0gICAgICBiYW5kRW5lcmd5TGREYXRhW2ldIC09IHNjYWxlKkZMMkZYQ09OU1RfREJMKDIuMC82NCk7CisgICAgICBiYW5kRW5lcmd5TGREYXRhW2ldIC09IHNjYWxlICogRkwyRlhDT05TVF9EQkwoMi4wIC8gNjQpOwogICAgIH0KICAgICAvKiBmaW5kIGluZGV4IG9mIG1heE5yZyAqLwogICAgIGlmIChiYW5kRW5lcmd5TGREYXRhW2ldID4gbWF4TnJnTGQpIHsKLSAgICAgICAgbWF4TnJnTGQgPSBiYW5kRW5lcmd5TGREYXRhW2ldOwotICAgICAgICBuciA9IGk7CisgICAgICBtYXhOcmdMZCA9IGJhbmRFbmVyZ3lMZERhdGFbaV07CisgICAgICBuciA9IGk7CiAgICAgfQogICB9CiAKICAgLyogcmV0dXJuIHVuc2NhbGVkIG1heE5yZyovCi0gIHNjYWxlID0gZml4TWF4KDAsc2ZiTWF4U2NhbGVTcGVjW25yXS00KTsKLSAgc2NhbGUgPSBmaXhNYXgoMioobWluU3BlY1NoaWZ0LXNjYWxlKSwtKERGUkFDVF9CSVRTLTEpKTsKKyAgc2NhbGUgPSBmaXhNYXgoMCwgc2ZiTWF4U2NhbGVTcGVjW25yXSAtIDQpOworICBzY2FsZSA9IGZpeE1heCgyICogKG1pblNwZWNTaGlmdCAtIHNjYWxlKSwgLShERlJBQ1RfQklUUyAtIDEpKTsKIAogICBtYXhOcmcgPSBzY2FsZVZhbHVlKGJhbmRFbmVyZ3lbbnJdLCBzY2FsZSk7CiAKQEAgLTE3MywxODcgKzE4OSwxNzMgQEAKICAgaW5wdXQ6CiAgIG91dHB1dDoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbUxvbmcoY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpSRVNUUklDVCBiYW5kT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBudW1CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneUxkRGF0YSkKLXsKK0lOVCBGREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbUxvbmcoY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqUkVTVFJJQ1QgYmFuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGJhbmRFbmVyZ3lMZERhdGEpIHsKICAgSU5UIGksIGosIHNoaWZ0Qml0cyA9IDA7CiAgIEZJWFBfREJMIG1heE5yZ0xkID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKICAgRklYUF9EQkwgc3BlYzsKIAotICBmb3IoaT0wOyBpPG51bUJhbmRzOyBpKyspIHsKLSAgICAgSU5UIGxlYWRpbmdCaXRzID0gc2ZiTWF4U2NhbGVTcGVjW2ldLTQ7ICAgICAgICAgICAgLyogbWF4IHNmYldpZHRoID0gOTYgOyAyXjc9MTI4ID0+IDcvMiA9IDQgKHNwYypzcGMpICovCi0gICAgIEZJWFBfREJMIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuMCk7Ci0gICAgIC8qIGRvbid0IHVzZSBzY2FsZVZhbHVlKCkgaGVyZSwgaXQgaW5jcmVhc2VzIHdvcmtsb2FkIHF1aXRlIHN1ZmZpY2llbnRseS4uLiAqLwotICAgICBpZiAobGVhZGluZ0JpdHM+PTApIHsKLSAgICAgICAgZm9yIChqPWJhbmRPZmZzZXRbaV07ajxiYW5kT2Zmc2V0W2krMV07aisrKSB7Ci0gICAgICAgICAgIHNwZWMgPSBtZGN0U3BlY3RydW1bal08PGxlYWRpbmdCaXRzOwotICAgICAgICAgICB0bXAgPSBmUG93MkFkZERpdjIodG1wLCBzcGVjKTsKLSAgICAgICAgfQotICAgICB9IGVsc2UgewotICAgICAgICBJTlQgc2hpZnQgPSAtbGVhZGluZ0JpdHM7Ci0gICAgICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldO2o8YmFuZE9mZnNldFtpKzFdO2orKyl7Ci0gICAgICAgICAgIHNwZWMgPSBtZGN0U3BlY3RydW1bal0+PnNoaWZ0OwotICAgICAgICAgICB0bXAgPSBmUG93MkFkZERpdjIodG1wLCBzcGVjKTsKLSAgICAgICAgfQotICAgICB9Ci0gICAgIGJhbmRFbmVyZ3lbaV0gPSB0bXA8PDE7CisgIGZvciAoaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgSU5UIGxlYWRpbmdCaXRzID0gc2ZiTWF4U2NhbGVTcGVjW2ldIC0KKyAgICAgICAgICAgICAgICAgICAgICA0OyAvKiBtYXggc2ZiV2lkdGggPSA5NiA7IDJeNz0xMjggPT4gNy8yID0gNCAoc3BjKnNwYykgKi8KKyAgICBGSVhQX0RCTCB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLjApOworICAgIC8qIGRvbid0IHVzZSBzY2FsZVZhbHVlKCkgaGVyZSwgaXQgaW5jcmVhc2VzIHdvcmtsb2FkIHF1aXRlIHN1ZmZpY2llbnRseS4uLgorICAgICAqLworICAgIGlmIChsZWFkaW5nQml0cyA+PSAwKSB7CisgICAgICBmb3IgKGogPSBiYW5kT2Zmc2V0W2ldOyBqIDwgYmFuZE9mZnNldFtpICsgMV07IGorKykgeworICAgICAgICBzcGVjID0gbWRjdFNwZWN0cnVtW2pdIDw8IGxlYWRpbmdCaXRzOworICAgICAgICB0bXAgPSBmUG93MkFkZERpdjIodG1wLCBzcGVjKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgSU5UIHNoaWZ0ID0gLWxlYWRpbmdCaXRzOworICAgICAgZm9yIChqID0gYmFuZE9mZnNldFtpXTsgaiA8IGJhbmRPZmZzZXRbaSArIDFdOyBqKyspIHsKKyAgICAgICAgc3BlYyA9IG1kY3RTcGVjdHJ1bVtqXSA+PiBzaGlmdDsKKyAgICAgICAgdG1wID0gZlBvdzJBZGREaXYyKHRtcCwgc3BlYyk7CisgICAgICB9CisgICAgfQorICAgIGJhbmRFbmVyZ3lbaV0gPSB0bXAgPDwgMTsKICAgfQogCiAgIC8qIGNhbGN1bGF0ZSBsZCBvZiBiYW5kTnJnLCBzdWJ0cmFjdCBzY2FsaW5nICovCiAgIExkRGF0YVZlY3RvcihiYW5kRW5lcmd5LCBiYW5kRW5lcmd5TGREYXRhLCBudW1CYW5kcyk7Ci0gIGZvcihpPW51bUJhbmRzOyBpLS0hPTA7ICkgewotICAgICAgRklYUF9EQkwgc2NhbGVEaWZmID0gKHNmYk1heFNjYWxlU3BlY1tpXS00KSpGTDJGWENPTlNUX0RCTCgyLjAvNjQpOworICBmb3IgKGkgPSBudW1CYW5kczsgaS0tICE9IDA7KSB7CisgICAgRklYUF9EQkwgc2NhbGVEaWZmID0gKHNmYk1heFNjYWxlU3BlY1tpXSAtIDQpICogRkwyRlhDT05TVF9EQkwoMi4wIC8gNjQpOwogCi0gICAgICBiYW5kRW5lcmd5TGREYXRhW2ldID0gKGJhbmRFbmVyZ3lMZERhdGFbaV0gPj0gKChGTDJGWENPTlNUX0RCTCgtMS5mKT4+MSkgKyAoc2NhbGVEaWZmPj4xKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gYmFuZEVuZXJneUxkRGF0YVtpXS1zY2FsZURpZmYgOiBGTDJGWENPTlNUX0RCTCgtMS5mKTsKLSAgICAgIC8qIGZpbmQgbWF4TnJnTGQgKi8KLSAgICAgIG1heE5yZ0xkID0gZml4TWF4KG1heE5yZ0xkLCBiYW5kRW5lcmd5TGREYXRhW2ldKTsKKyAgICBiYW5kRW5lcmd5TGREYXRhW2ldID0gKGJhbmRFbmVyZ3lMZERhdGFbaV0gPj0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkwyRlhDT05TVF9EQkwoLTEuZikgPj4gMSkgKyAoc2NhbGVEaWZmID4+IDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmFuZEVuZXJneUxkRGF0YVtpXSAtIHNjYWxlRGlmZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGTDJGWENPTlNUX0RCTCgtMS5mKTsKKyAgICAvKiBmaW5kIG1heE5yZ0xkICovCisgICAgbWF4TnJnTGQgPSBmaXhNYXgobWF4TnJnTGQsIGJhbmRFbmVyZ3lMZERhdGFbaV0pOwogICB9CiAKLSAgaWYgKG1heE5yZ0xkPD0oRklYUF9EQkwpMCkKLSAgewotICAgICBmb3IoaT1udW1CYW5kczsgaS0tIT0wOyApCi0gICAgIHsKLSAgICAgICAgIElOVCBzY2FsZSA9IGZpeE1pbigoc2ZiTWF4U2NhbGVTcGVjW2ldLTQpPDwxLChERlJBQ1RfQklUUy0xKSk7Ci0gICAgICAgICBiYW5kRW5lcmd5W2ldID0gc2NhbGVWYWx1ZShiYW5kRW5lcmd5W2ldLCAtc2NhbGUpOwotICAgICB9Ci0gICAgIHJldHVybiAwOwotICB9Ci0gIGVsc2UKLSAgeyAgLyogc2NhbGUgZG93biBOUkdzICovCi0gICAgIHdoaWxlIChtYXhOcmdMZD5GTDJGWENPTlNUX0RCTCgwLjBmKSkKLSAgICAgewotICAgICAgICBtYXhOcmdMZCAtPSAgRkwyRlhDT05TVF9EQkwoMi4wLzY0KTsKLSAgICAgICAgc2hpZnRCaXRzKys7Ci0gICAgIH0KLSAgICAgZm9yKGk9bnVtQmFuZHM7IGktLSE9MDsgKQotICAgICB7Ci0gICAgICAgICBJTlQgc2NhbGUgPSBmaXhNaW4oICgoc2ZiTWF4U2NhbGVTcGVjW2ldLTQpK3NoaWZ0Qml0cyk8PDEsIChERlJBQ1RfQklUUy0xKSk7Ci0gICAgICAgICBiYW5kRW5lcmd5TGREYXRhW2ldIC09IHNoaWZ0Qml0cypGTDJGWENPTlNUX0RCTCgyLjAvNjQpOwotICAgICAgICAgYmFuZEVuZXJneVtpXSA9IHNjYWxlVmFsdWUoYmFuZEVuZXJneVtpXSwgLXNjYWxlKTsKLSAgICAgfQotICAgICByZXR1cm4gc2hpZnRCaXRzOworICBpZiAobWF4TnJnTGQgPD0gKEZJWFBfREJMKTApIHsKKyAgICBmb3IgKGkgPSBudW1CYW5kczsgaS0tICE9IDA7KSB7CisgICAgICBJTlQgc2NhbGUgPSBmaXhNaW4oKHNmYk1heFNjYWxlU3BlY1tpXSAtIDQpIDw8IDEsIChERlJBQ1RfQklUUyAtIDEpKTsKKyAgICAgIGJhbmRFbmVyZ3lbaV0gPSBzY2FsZVZhbHVlKGJhbmRFbmVyZ3lbaV0sIC1zY2FsZSk7CisgICAgfQorICAgIHJldHVybiAwOworICB9IGVsc2UgeyAvKiBzY2FsZSBkb3duIE5SR3MgKi8KKyAgICB3aGlsZSAobWF4TnJnTGQgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgbWF4TnJnTGQgLT0gRkwyRlhDT05TVF9EQkwoMi4wIC8gNjQpOworICAgICAgc2hpZnRCaXRzKys7CisgICAgfQorICAgIGZvciAoaSA9IG51bUJhbmRzOyBpLS0gIT0gMDspIHsKKyAgICAgIElOVCBzY2FsZSA9IGZpeE1pbigoKHNmYk1heFNjYWxlU3BlY1tpXSAtIDQpICsgc2hpZnRCaXRzKSA8PCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIChERlJBQ1RfQklUUyAtIDEpKTsKKyAgICAgIGJhbmRFbmVyZ3lMZERhdGFbaV0gLT0gc2hpZnRCaXRzICogRkwyRlhDT05TVF9EQkwoMi4wIC8gNjQpOworICAgICAgYmFuZEVuZXJneVtpXSA9IHNjYWxlVmFsdWUoYmFuZEVuZXJneVtpXSwgLXNjYWxlKTsKKyAgICB9CisgICAgcmV0dXJuIHNoaWZ0Qml0czsKICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltU2hvcnQKICAgZGVzY3JpcHRpb246CiAgIGlucHV0OgogICBvdXRwdXQ6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLUZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltU2hvcnQoY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKlJFU1RSSUNUIGJhbmRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBudW1CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3kpCi17Cit2b2lkIEZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltU2hvcnQoY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKlJFU1RSSUNUIGJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBiYW5kRW5lcmd5KSB7CiAgIElOVCBpLCBqOwogCi0gIGZvcihpPTA7IGk8bnVtQmFuZHM7IGkrKykKLSAgewotICAgIGludCBsZWFkaW5nQml0cyA9IHNmYk1heFNjYWxlU3BlY1tpXS0zOyAgICAgICAgICAgIC8qIG1heCBzZmJXaWR0aCA9IDM2IDsgMl42PTY0ID0+IDYvMiA9IDMgKHNwYypzcGMpICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgaW50IGxlYWRpbmdCaXRzID0gc2ZiTWF4U2NhbGVTcGVjW2ldIC0KKyAgICAgICAgICAgICAgICAgICAgICAzOyAvKiBtYXggc2ZiV2lkdGggPSAzNiA7IDJeNj02NCA9PiA2LzIgPSAzIChzcGMqc3BjKSAqLwogICAgIEZJWFBfREJMIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuMCk7Ci0gICAgZm9yIChqPWJhbmRPZmZzZXRbaV07ajxiYW5kT2Zmc2V0W2krMV07aisrKQotICAgIHsKLSAgICAgICBGSVhQX0RCTCBzcGVjID0gc2NhbGVWYWx1ZShtZGN0U3BlY3RydW1bal0sbGVhZGluZ0JpdHMpOwotICAgICAgIHRtcCA9IGZQb3cyQWRkRGl2Mih0bXAsIHNwZWMpOworICAgIGZvciAoaiA9IGJhbmRPZmZzZXRbaV07IGogPCBiYW5kT2Zmc2V0W2kgKyAxXTsgaisrKSB7CisgICAgICBGSVhQX0RCTCBzcGVjID0gc2NhbGVWYWx1ZShtZGN0U3BlY3RydW1bal0sIGxlYWRpbmdCaXRzKTsKKyAgICAgIHRtcCA9IGZQb3cyQWRkRGl2Mih0bXAsIHNwZWMpOwogICAgIH0KICAgICBiYW5kRW5lcmd5W2ldID0gdG1wOwogICB9CiAKLSAgZm9yKGk9MDsgaTxudW1CYW5kczsgaSsrKQotICB7Ci0gICAgICBJTlQgc2NhbGUgPSAoMiooc2ZiTWF4U2NhbGVTcGVjW2ldLTMpKS0xOyAgICAgICAgIC8qIG1heCBzZmJXaWR0aCA9IDM2IDsgMl42PTY0ID0+IDYvMiA9IDMgKHNwYypzcGMpICovCi0gICAgICBzY2FsZSA9IGZpeE1heChmaXhNaW4oc2NhbGUsKERGUkFDVF9CSVRTLTEpKSwtKERGUkFDVF9CSVRTLTEpKTsKLSAgICAgIGJhbmRFbmVyZ3lbaV0gPSBzY2FsZVZhbHVlU2F0dXJhdGUoYmFuZEVuZXJneVtpXSwgLXNjYWxlKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICBJTlQgc2NhbGUgPSAoMiAqIChzZmJNYXhTY2FsZVNwZWNbaV0gLSAzKSkgLQorICAgICAgICAgICAgICAgIDE7IC8qIG1heCBzZmJXaWR0aCA9IDM2IDsgMl42PTY0ID0+IDYvMiA9IDMgKHNwYypzcGMpICovCisgICAgc2NhbGUgPSBmaXhNYXgoZml4TWluKHNjYWxlLCAoREZSQUNUX0JJVFMgLSAxKSksIC0oREZSQUNUX0JJVFMgLSAxKSk7CisgICAgYmFuZEVuZXJneVtpXSA9IHNjYWxlVmFsdWVTYXR1cmF0ZShiYW5kRW5lcmd5W2ldLCAtc2NhbGUpOwogICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0NhbGNCYW5kTnJnTVNPcHQKICAgZGVzY3JpcHRpb246CiAgIGlucHV0OgogICBvdXRwdXQ6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRkRLYWFjRW5jX0NhbGNCYW5kTnJnTVNPcHQoY29uc3QgRklYUF9EQkwgICAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlY0xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlY1JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICpSRVNUUklDVCBiYW5kT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICBudW1CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneVNpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIGNhbGNMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lNaWRMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lTaWRlTGREYXRhKQotewordm9pZCBGREthYWNFbmNfQ2FsY0JhbmROcmdNU09wdCgKKyAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtTGVmdCwKKyAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtUmlnaHQsCisgICAgSU5UICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWNMZWZ0LCBJTlQgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlY1JpZ2h0LAorICAgIGNvbnN0IElOVCAqUkVTVFJJQ1QgYmFuZE9mZnNldCwgY29uc3QgSU5UIG51bUJhbmRzLAorICAgIEZJWFBfREJMICpSRVNUUklDVCBiYW5kRW5lcmd5TWlkLCBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneVNpZGUsCisgICAgSU5UIGNhbGNMZERhdGEsIEZJWFBfREJMICpSRVNUUklDVCBiYW5kRW5lcmd5TWlkTGREYXRhLAorICAgIEZJWFBfREJMICpSRVNUUklDVCBiYW5kRW5lcmd5U2lkZUxkRGF0YSkgewogICBJTlQgaSwgaiwgbWluU2NhbGU7CiAgIEZJWFBfREJMIE5yZ01pZCwgTnJnU2lkZSwgc3BlY20sIHNwZWNzOwogCi0gIGZvciAoaT0wOyBpPG51bUJhbmRzOyBpKyspIHsKLQorICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewogICAgIE5yZ01pZCA9IE5yZ1NpZGUgPSBGTDJGWENPTlNUX0RCTCgwLjApOwotICAgIG1pblNjYWxlID0gZml4TWluKHNmYk1heFNjYWxlU3BlY0xlZnRbaV0sIHNmYk1heFNjYWxlU3BlY1JpZ2h0W2ldKS00OworICAgIG1pblNjYWxlID0gZml4TWluKHNmYk1heFNjYWxlU3BlY0xlZnRbaV0sIHNmYk1heFNjYWxlU3BlY1JpZ2h0W2ldKSAtIDQ7CiAgICAgbWluU2NhbGUgPSBmaXhNYXgoMCwgbWluU2NhbGUpOwogCiAgICAgaWYgKG1pblNjYWxlID4gMCkgewotICAgICAgZm9yIChqPWJhbmRPZmZzZXRbaV07ajxiYW5kT2Zmc2V0W2krMV07aisrKSB7Ci0gICAgICAgICAgRklYUF9EQkwgc3BlY0wgPSBtZGN0U3BlY3RydW1MZWZ0W2pdPDwobWluU2NhbGUtMSk7Ci0gICAgICAgICAgRklYUF9EQkwgc3BlY1IgPSBtZGN0U3BlY3RydW1SaWdodFtqXTw8KG1pblNjYWxlLTEpOwotICAgICAgICAgIHNwZWNtID0gc3BlY0wgKyBzcGVjUjsKLSAgICAgICAgICBzcGVjcyA9IHNwZWNMIC0gc3BlY1I7Ci0gICAgICAgICAgTnJnTWlkID0gZlBvdzJBZGREaXYyKE5yZ01pZCwgc3BlY20pOwotICAgICAgICAgIE5yZ1NpZGUgPSBmUG93MkFkZERpdjIoTnJnU2lkZSwgc3BlY3MpOworICAgICAgZm9yIChqID0gYmFuZE9mZnNldFtpXTsgaiA8IGJhbmRPZmZzZXRbaSArIDFdOyBqKyspIHsKKyAgICAgICAgRklYUF9EQkwgc3BlY0wgPSBtZGN0U3BlY3RydW1MZWZ0W2pdIDw8IChtaW5TY2FsZSAtIDEpOworICAgICAgICBGSVhQX0RCTCBzcGVjUiA9IG1kY3RTcGVjdHJ1bVJpZ2h0W2pdIDw8IChtaW5TY2FsZSAtIDEpOworICAgICAgICBzcGVjbSA9IHNwZWNMICsgc3BlY1I7CisgICAgICAgIHNwZWNzID0gc3BlY0wgLSBzcGVjUjsKKyAgICAgICAgTnJnTWlkID0gZlBvdzJBZGREaXYyKE5yZ01pZCwgc3BlY20pOworICAgICAgICBOcmdTaWRlID0gZlBvdzJBZGREaXYyKE5yZ1NpZGUsIHNwZWNzKTsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgZm9yIChqPWJhbmRPZmZzZXRbaV07ajxiYW5kT2Zmc2V0W2krMV07aisrKSB7Ci0gICAgICAgICAgRklYUF9EQkwgc3BlY0wgPSBtZGN0U3BlY3RydW1MZWZ0W2pdPj4xOwotICAgICAgICAgIEZJWFBfREJMIHNwZWNSID0gbWRjdFNwZWN0cnVtUmlnaHRbal0+PjE7Ci0gICAgICAgICAgc3BlY20gPSBzcGVjTCArIHNwZWNSOwotICAgICAgICAgIHNwZWNzID0gc3BlY0wgLSBzcGVjUjsKLSAgICAgICAgICBOcmdNaWQgPSBmUG93MkFkZERpdjIoTnJnTWlkLCBzcGVjbSk7Ci0gICAgICAgICAgTnJnU2lkZSA9IGZQb3cyQWRkRGl2MihOcmdTaWRlLCBzcGVjcyk7CisgICAgICBmb3IgKGogPSBiYW5kT2Zmc2V0W2ldOyBqIDwgYmFuZE9mZnNldFtpICsgMV07IGorKykgeworICAgICAgICBGSVhQX0RCTCBzcGVjTCA9IG1kY3RTcGVjdHJ1bUxlZnRbal0gPj4gMTsKKyAgICAgICAgRklYUF9EQkwgc3BlY1IgPSBtZGN0U3BlY3RydW1SaWdodFtqXSA+PiAxOworICAgICAgICBzcGVjbSA9IHNwZWNMICsgc3BlY1I7CisgICAgICAgIHNwZWNzID0gc3BlY0wgLSBzcGVjUjsKKyAgICAgICAgTnJnTWlkID0gZlBvdzJBZGREaXYyKE5yZ01pZCwgc3BlY20pOworICAgICAgICBOcmdTaWRlID0gZlBvdzJBZGREaXYyKE5yZ1NpZGUsIHNwZWNzKTsKICAgICAgIH0KICAgICB9Ci0gICAgYmFuZEVuZXJneU1pZFtpXSA9IE5yZ01pZDw8MTsKLSAgICBiYW5kRW5lcmd5U2lkZVtpXSA9IE5yZ1NpZGU8PDE7CisgICAgYmFuZEVuZXJneU1pZFtpXSA9IGZNaW4oTnJnTWlkLCAoRklYUF9EQkwpTUFYVkFMX0RCTCA+PiAxKSA8PCAxOworICAgIGJhbmRFbmVyZ3lTaWRlW2ldID0gZk1pbihOcmdTaWRlLCAoRklYUF9EQkwpTUFYVkFMX0RCTCA+PiAxKSA8PCAxOwogICB9CiAKLSAgaWYoY2FsY0xkRGF0YSkgeworICBpZiAoY2FsY0xkRGF0YSkgewogICAgIExkRGF0YVZlY3RvcihiYW5kRW5lcmd5TWlkLCBiYW5kRW5lcmd5TWlkTGREYXRhLCBudW1CYW5kcyk7CiAgICAgTGREYXRhVmVjdG9yKGJhbmRFbmVyZ3lTaWRlLCBiYW5kRW5lcmd5U2lkZUxkRGF0YSwgbnVtQmFuZHMpOwogICB9CiAKLSAgZm9yIChpPTA7IGk8bnVtQmFuZHM7IGkrKykKLSAgewotICAgIElOVCBtaW5TY2FsZSA9IGZpeE1pbihzZmJNYXhTY2FsZVNwZWNMZWZ0W2ldLCBzZmJNYXhTY2FsZVNwZWNSaWdodFtpXSk7Ci0gICAgSU5UIHNjYWxlID0gZml4TWF4KDAsIDIqKG1pblNjYWxlLTQpKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICBtaW5TY2FsZSA9IGZpeE1pbihzZmJNYXhTY2FsZVNwZWNMZWZ0W2ldLCBzZmJNYXhTY2FsZVNwZWNSaWdodFtpXSk7CisgICAgSU5UIHNjYWxlID0gZml4TWF4KDAsIDIgKiAobWluU2NhbGUgLSA0KSk7CiAKLSAgICBpZiAoY2FsY0xkRGF0YSkKLSAgICB7Ci0gICAgICAgLyogdXNpbmcgdGhlIG1pbmltYWwgc2NhbGluZyBvZiBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGNhbiBjYXVzZSB2ZXJ5IHNtYWxsIGVuZXJnaWVzOwotICAgICAgIGNoZWNrIGxkTnJnIGJlZm9yZSBzdWJ0cmFjdCBzY2FsaW5nIG11bHRpcGxpY2F0aW9uOiBmcmFjdCpJTlQgd2UgZG9uJ3QgbmVlZCBmTXVsdCAqLworICAgIGlmIChjYWxjTGREYXRhKSB7CisgICAgICAvKiB1c2luZyB0aGUgbWluaW1hbCBzY2FsaW5nIG9mIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgY2FuIGNhdXNlIHZlcnkKKyAgICAgIHNtYWxsIGVuZXJnaWVzOyBjaGVjayBsZE5yZyBiZWZvcmUgc3VidHJhY3Qgc2NhbGluZyBtdWx0aXBsaWNhdGlvbjoKKyAgICAgIGZyYWN0KklOVCB3ZSBkb24ndCBuZWVkIGZNdWx0ICovCiAKLSAgICAgICBpbnQgbWludXMgPSBzY2FsZSpGTDJGWENPTlNUX0RCTCgxLjAvNjQpOworICAgICAgaW50IG1pbnVzID0gc2NhbGUgKiBGTDJGWENPTlNUX0RCTCgxLjAgLyA2NCk7CiAKLSAgICAgICBpZiAoYmFuZEVuZXJneU1pZExkRGF0YVtpXSAhPSBGTDJGWENPTlNUX0RCTCgtMS4wZikpCi0gICAgICAgICBiYW5kRW5lcmd5TWlkTGREYXRhW2ldIC09IG1pbnVzOworICAgICAgaWYgKGJhbmRFbmVyZ3lNaWRMZERhdGFbaV0gIT0gRkwyRlhDT05TVF9EQkwoLTEuMGYpKQorICAgICAgICBiYW5kRW5lcmd5TWlkTGREYXRhW2ldIC09IG1pbnVzOwogCi0gICAgICAgaWYgKGJhbmRFbmVyZ3lTaWRlTGREYXRhW2ldICE9IEZMMkZYQ09OU1RfREJMKC0xLjBmKSkKLSAgICAgICAgIGJhbmRFbmVyZ3lTaWRlTGREYXRhW2ldIC09IG1pbnVzOworICAgICAgaWYgKGJhbmRFbmVyZ3lTaWRlTGREYXRhW2ldICE9IEZMMkZYQ09OU1RfREJMKC0xLjBmKSkKKyAgICAgICAgYmFuZEVuZXJneVNpZGVMZERhdGFbaV0gLT0gbWludXM7CiAgICAgfQotICAgIHNjYWxlID0gZml4TWluKHNjYWxlLCAoREZSQUNUX0JJVFMtMSkpOwotICAgIGJhbmRFbmVyZ3lNaWRbaV0gID4+PSBzY2FsZTsKKyAgICBzY2FsZSA9IGZpeE1pbihzY2FsZSwgKERGUkFDVF9CSVRTIC0gMSkpOworICAgIGJhbmRFbmVyZ3lNaWRbaV0gPj49IHNjYWxlOwogICAgIGJhbmRFbmVyZ3lTaWRlW2ldID4+PSBzY2FsZTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9iYW5kX25yZy5oIGIvbGliQUFDZW5jL3NyYy9iYW5kX25yZy5oCmluZGV4IDU0MGE4ZWYuLjQxMzc1NjUgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYmFuZF9ucmcuaAorKysgYi9saWJBQUNlbmMvc3JjL2JhbmRfbnJnLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNzEgKzkwLDUzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgorCiAgICBEZXNjcmlwdGlvbjogQmFuZC9MaW5lIGVuZXJneSBjYWxjdWxhdGlvbgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9CQU5EX05SR19ICi0jZGVmaW5lIF9CQU5EX05SR19ICisjaWZuZGVmIEJBTkRfTlJHX0gKKyNkZWZpbmUgQkFORF9OUkdfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCi0KLXZvaWQKLUZES2FhY0VuY19DYWxjU2ZiTWF4U2NhbGVTcGVjKAotICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICpiYW5kT2Zmc2V0LAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgKnNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBudW1CYW5kcwotICAgICAgICApOwordm9pZCBGREthYWNFbmNfQ2FsY1NmYk1heFNjYWxlU3BlYyhjb25zdCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmJhbmRPZmZzZXQsIElOVCAqc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtQmFuZHMpOwogCiBGSVhQX0RCTAotRkRLYWFjRW5jX0NoZWNrQmFuZEVuZXJneU9wdGltKAotICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICpzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAqYmFuZE9mZnNldCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBudW1CYW5kcywKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICpiYW5kRW5lcmd5LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgKmJhbmRFbmVyZ3lMZERhdGEsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWluU3BlY1NoaWZ0Ci0gICAgICAgICk7CitGREthYWNFbmNfQ2hlY2tCYW5kRW5lcmd5T3B0aW0oY29uc3QgRklYUF9EQkwgKmNvbnN0IFJFU1RSSUNUIG1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmNvbnN0IFJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmNvbnN0IFJFU1RSSUNUIGJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBiYW5kRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBiYW5kRW5lcmd5TGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBtaW5TcGVjU2hpZnQpOwogCi1JTlQKLUZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltTG9uZygKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICptZGN0U3BlY3RydW0sCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAqc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgKmJhbmRPZmZzZXQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbnVtQmFuZHMsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAqYmFuZEVuZXJneSwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICpiYW5kRW5lcmd5TGREYXRhCi0gICAgICAgICk7CitJTlQgRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1Mb25nKGNvbnN0IEZJWFBfREJMICptZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmJhbmRPZmZzZXQsIGNvbnN0IElOVCBudW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmJhbmRFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpiYW5kRW5lcmd5TGREYXRhKTsKIAotdm9pZAotRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1TaG9ydCgKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICptZGN0U3BlY3RydW0sCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAqc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgKmJhbmRPZmZzZXQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbnVtQmFuZHMsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAqYmFuZEVuZXJneQotICAgICAgICApOwotCit2b2lkIEZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltU2hvcnQoY29uc3QgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpiYW5kRW5lcmd5KTsKIAogdm9pZCBGREthYWNFbmNfQ2FsY0JhbmROcmdNU09wdCgKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtTGVmdCwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtUmlnaHQsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlY0xlZnQsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlY1JpZ2h0LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICpSRVNUUklDVCBiYW5kT2Zmc2V0LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICBudW1CYW5kcywKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneU1pZCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAqUkVTVFJJQ1QgYmFuZEVuZXJneVNpZGUsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgIGNhbGNMZERhdGEsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lNaWRMZERhdGEsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lTaWRlTGREYXRhKTsKKyAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtTGVmdCwKKyAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtUmlnaHQsCisgICAgSU5UICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWNMZWZ0LCBJTlQgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlY1JpZ2h0LAorICAgIGNvbnN0IElOVCAqUkVTVFJJQ1QgYmFuZE9mZnNldCwgY29uc3QgSU5UIG51bUJhbmRzLAorICAgIEZJWFBfREJMICpSRVNUUklDVCBiYW5kRW5lcmd5TWlkLCBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneVNpZGUsCisgICAgSU5UIGNhbGNMZERhdGEsIEZJWFBfREJMICpSRVNUUklDVCBiYW5kRW5lcmd5TWlkTGREYXRhLAorICAgIEZJWFBfREJMICpSRVNUUklDVCBiYW5kRW5lcmd5U2lkZUxkRGF0YSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9iYW5kd2lkdGguY3BwIGIvbGliQUFDZW5jL3NyYy9iYW5kd2lkdGguY3BwCmluZGV4IDY5MzczNjIuLjM2Y2Q2NGQgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYmFuZHdpZHRoLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2JhbmR3aWR0aC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjAgKzkwLDIxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKiogIEZhc3QgTVBFRyBBQUMgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFNjaHVnIC8gQS4gR3JvZXNjaGVsCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogYmFuZHdpZHRoIGV4cGVydAorICAgQXV0aG9yKHMpOiAgIE0uIFNjaHVnIC8gQS4gR3JvZXNjaGVsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBiYW5kd2lkdGggZXhwZXJ0CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJjaGFubmVsX21hcC5oIgogI2luY2x1ZGUgImJhbmR3aWR0aC5oIgogI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKIAotdHlwZWRlZiBzdHJ1Y3R7Cit0eXBlZGVmIHN0cnVjdCB7CiAgIElOVCBjaGFuQml0UmF0ZTsKICAgSU5UIGJhbmRXaWR0aE1vbm87CiAgIElOVCBiYW5kV2lkdGgyQW5kTW9yZUNoYW47CkBAIC0xMDAsMTE0ICsxMTIsNzEgQEAKIH0gQkFORFdJRFRIX1RBQjsKIAogc3RhdGljIGNvbnN0IEJBTkRXSURUSF9UQUIgYmFuZFdpZHRoVGFibGVbXSA9IHsKLSAgezAsICAgICAgMzcwMCwgIDUwMDB9LAotICB7MTIwMDAsICA1MDAwLCAgNjQwMH0sCi0gIHsyMDAwMCwgIDY5MDAsICA5NjQwfSwKLSAgezI4MDAwLCAgOTYwMCwgMTMwNTB9LAotICB7NDAwMDAsIDEyMDYwLCAxNDI2MH0sCi0gIHs1NjAwMCwgMTM5NTAsIDE1NTAwfSwKLSAgezcyMDAwLCAxNDIwMCwgMTYxMjB9LAotICB7OTYwMDAsIDE3MDAwLCAxNzAwMH0sCi0gIHs1NzYwMDEsMTcwMDAsIDE3MDAwfQotfTsKLQorICAgIHswLCAzNzAwLCA1MDAwfSwgICAgICAgezEyMDAwLCA1MDAwLCA2NDAwfSwgICB7MjAwMDAsIDY5MDAsIDk2NDB9LAorICAgIHsyODAwMCwgOTYwMCwgMTMwNTB9LCAgezQwMDAwLCAxMjA2MCwgMTQyNjB9LCB7NTYwMDAsIDEzOTUwLCAxNTUwMH0sCisgICAgezcyMDAwLCAxNDIwMCwgMTYxMjB9LCB7OTYwMDAsIDE3MDAwLCAxNzAwMH0sIHs1NzYwMDEsIDE3MDAwLCAxNzAwMH19OwogCiBzdGF0aWMgY29uc3QgQkFORFdJRFRIX1RBQiBiYW5kV2lkdGhUYWJsZV9MRF8yMjA1MFtdID0gewotICB7IDgwMDAsICAyMDAwLCAgMjQwMH0sCi0gIHsxMjAwMCwgIDI1MDAsICAyNzAwfSwKLSAgezE2MDAwLCAgMzMwMCwgIDMxMDB9LAotICB7MjQwMDAsICA2MjUwLCAgNzIwMH0sCi0gIHszMjAwMCwgIDkyMDAsICAxMDUwMH0sCi0gIHs0MDAwMCwgIDE2MDAwLCAxNjAwMH0sCi0gIHs0ODAwMCwgIDE2MDAwLCAxNjAwMH0sCi0gIHszNjAwMDEsIDE2MDAwLCAxNjAwMH0KLX07CisgICAgezgwMDAsIDIwMDAsIDI0MDB9LCAgICB7MTIwMDAsIDI1MDAsIDI3MDB9LCAgIHsxNjAwMCwgMzMwMCwgMzEwMH0sCisgICAgezI0MDAwLCA2MjUwLCA3MjAwfSwgICB7MzIwMDAsIDkyMDAsIDEwNTAwfSwgIHs0MDAwMCwgMTYwMDAsIDE2MDAwfSwKKyAgICB7NDgwMDAsIDE2MDAwLCAxNjAwMH0sIHsyODIyNDEsIDE2MDAwLCAxNjAwMH19OwogCiBzdGF0aWMgY29uc3QgQkFORFdJRFRIX1RBQiBiYW5kV2lkdGhUYWJsZV9MRF8yNDAwMFtdID0gewotICB7IDgwMDAsICAyMDAwLCAgMjAwMH0sCi0gIHsxMjAwMCwgIDIwMDAsICAyMzAwfSwKLSAgezE2MDAwLCAgMjIwMCwgIDI1MDB9LAotICB7MjQwMDAsICA1NjUwLCAgNzIwMH0sCi0gIHszMjAwMCwgIDExNjAwLCAxMjAwMH0sCi0gIHs0MDAwMCwgIDEyMDAwLCAxNjAwMH0sCi0gIHs0ODAwMCwgIDE2MDAwLCAxNjAwMH0sCi0gIHs2NDAwMCwgIDE2MDAwLCAxNjAwMH0sCi0gIHszNjAwMDEsIDE2MDAwLCAxNjAwMH0KLX07CisgICAgezgwMDAsIDIwMDAsIDIwMDB9LCAgICB7MTIwMDAsIDIwMDAsIDIzMDB9LCAgIHsxNjAwMCwgMjIwMCwgMjUwMH0sCisgICAgezI0MDAwLCA1NjUwLCA3MjAwfSwgICB7MzIwMDAsIDExNjAwLCAxMjAwMH0sIHs0MDAwMCwgMTIwMDAsIDE2MDAwfSwKKyAgICB7NDgwMDAsIDE2MDAwLCAxNjAwMH0sIHs2NDAwMCwgMTYwMDAsIDE2MDAwfSwgezMwNzIwMSwgMTYwMDAsIDE2MDAwfX07CiAKIHN0YXRpYyBjb25zdCBCQU5EV0lEVEhfVEFCIGJhbmRXaWR0aFRhYmxlX0xEXzMyMDAwW10gPSB7Ci0gIHsgODAwMCwgIDIwMDAsICAyMDAwfSwKLSAgezEyMDAwLCAgMjAwMCwgIDIwMDB9LAotICB7MjQwMDAsICA0MjUwLCAgNzIwMH0sCi0gIHszMjAwMCwgIDg0MDAsICA5MDAwfSwKLSAgezQwMDAwLCAgOTQwMCwgIDExMzAwfSwKLSAgezQ4MDAwLCAgMTE5MDAsIDE0NzAwfSwKLSAgezY0MDAwLCAgMTQ4MDAsIDE2MDAwfSwKLSAgezc2MDAwLCAgMTYwMDAsIDE2MDAwfSwKLSAgezM2MDAwMSwgMTYwMDAsIDE2MDAwfQotfTsKKyAgICB7ODAwMCwgMjAwMCwgMjAwMH0sICAgIHsxMjAwMCwgMjAwMCwgMjAwMH0sICAgezI0MDAwLCA0MjUwLCA3MjAwfSwKKyAgICB7MzIwMDAsIDg0MDAsIDkwMDB9LCAgIHs0MDAwMCwgOTQwMCwgMTEzMDB9LCAgezQ4MDAwLCAxMTkwMCwgMTQ3MDB9LAorICAgIHs2NDAwMCwgMTQ4MDAsIDE2MDAwfSwgezc2MDAwLCAxNjAwMCwgMTYwMDB9LCB7NDA5NjAxLCAxNjAwMCwgMTYwMDB9fTsKIAogc3RhdGljIGNvbnN0IEJBTkRXSURUSF9UQUIgYmFuZFdpZHRoVGFibGVfTERfNDQxMDBbXSA9IHsKLSAgeyA4MDAwLCAgMjAwMCwgIDIwMDB9LAotICB7MjQwMDAsICAyMDAwLCAgMjAwMH0sCi0gIHszMjAwMCwgIDQ0MDAsICA1NzAwfSwKLSAgezQwMDAwLCAgNzQwMCwgIDg4MDB9LAotICB7NDgwMDAsICA5MDAwLCAgMTA3MDB9LAotICB7NTYwMDAsICAxMTAwMCwgMTI5MDB9LAotICB7NjQwMDAsICAxNDQwMCwgMTU1MDB9LAotICB7ODAwMDAsICAxNjAwMCwgMTYyMDB9LAotICB7OTYwMDAsICAxNjUwMCwgMTYwMDB9LAotICB7MTI4MDAwLCAxNjAwMCwgMTYwMDB9LAotICB7MzYwMDAxLCAxNjAwMCwgMTYwMDB9Ci19OworICAgIHs4MDAwLCAyMDAwLCAyMDAwfSwgICAgIHsyNDAwMCwgMjAwMCwgMjAwMH0sICAgezMyMDAwLCA0NDAwLCA1NzAwfSwKKyAgICB7NDAwMDAsIDc0MDAsIDg4MDB9LCAgICB7NDgwMDAsIDkwMDAsIDEwNzAwfSwgIHs1NjAwMCwgMTEwMDAsIDEyOTAwfSwKKyAgICB7NjQwMDAsIDE0NDAwLCAxNTUwMH0sICB7ODAwMDAsIDE2MDAwLCAxNjIwMH0sIHs5NjAwMCwgMTY1MDAsIDE2MDAwfSwKKyAgICB7MTI4MDAwLCAxNjAwMCwgMTYwMDB9LCB7NTY0NDgxLCAxNjAwMCwgMTYwMDB9fTsKIAogc3RhdGljIGNvbnN0IEJBTkRXSURUSF9UQUIgYmFuZFdpZHRoVGFibGVfTERfNDgwMDBbXSA9IHsKLSAgeyA4MDAwLCAgMjAwMCwgIDIwMDB9LAotICB7MjQwMDAsICAyMDAwLCAgMjAwMH0sCi0gIHszMjAwMCwgIDQ0MDAsICA1NzAwfSwKLSAgezQwMDAwLCAgNzQwMCwgIDg4MDB9LAotICB7NDgwMDAsICA5MDAwLCAgMTA3MDB9LAotICB7NTYwMDAsICAxMTAwMCwgMTI4MDB9LAotICB7NjQwMDAsICAxNDMwMCwgMTU0MDB9LAotICB7ODAwMDAsICAxNjAwMCwgMTYyMDB9LAotICB7OTYwMDAsICAxNjUwMCwgMTYwMDB9LAotICB7MTI4MDAwLCAxNjAwMCwgMTYwMDB9LAotICB7MzYwMDAxLCAxNjAwMCwgMTYwMDB9Ci19OworICAgIHs4MDAwLCAyMDAwLCAyMDAwfSwgICAgIHsyNDAwMCwgMjAwMCwgMjAwMH0sICAgezMyMDAwLCA0NDAwLCA1NzAwfSwKKyAgICB7NDAwMDAsIDc0MDAsIDg4MDB9LCAgICB7NDgwMDAsIDkwMDAsIDEwNzAwfSwgIHs1NjAwMCwgMTEwMDAsIDEyODAwfSwKKyAgICB7NjQwMDAsIDE0MzAwLCAxNTQwMH0sICB7ODAwMDAsIDE2MDAwLCAxNjIwMH0sIHs5NjAwMCwgMTY1MDAsIDE2MDAwfSwKKyAgICB7MTI4MDAwLCAxNjAwMCwgMTYwMDB9LCB7NjE0NDAxLCAxNjAwMCwgMTYwMDB9fTsKIAotdHlwZWRlZiBzdHJ1Y3R7Cit0eXBlZGVmIHN0cnVjdCB7CiAgIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGU7CiAgIGludCBiYW5kV2lkdGhNb25vOwogICBpbnQgYmFuZFdpZHRoMkFuZE1vcmVDaGFuOwogfSBCQU5EV0lEVEhfVEFCX1ZCUjsKIAotc3RhdGljIGNvbnN0IEJBTkRXSURUSF9UQUJfVkJSIGJhbmRXaWR0aFRhYmxlVkJSW109IHsKLSAge0FBQ0VOQ19CUl9NT0RFX0NCUiwgICAgICAgIDAsICAgICAwfSwKLSAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8xLCAgMTMwNTAsIDEzMDUwfSwKLSAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8yLCAgMTMwNTAsIDEzMDUwfSwKLSAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8zLCAgMTQyNjAsIDE0MjYwfSwKLSAge0FBQ0VOQ19CUl9NT0RFX1ZCUl80LCAgMTU1MDAsIDE1NTAwfSwKLSAge0FBQ0VOQ19CUl9NT0RFX1ZCUl81LCAgNDgwMDAsIDQ4MDAwfSwKLSAge0FBQ0VOQ19CUl9NT0RFX1NGUiwgICAgICAgIDAsICAgICAwfSwKLSAge0FBQ0VOQ19CUl9NT0RFX0ZGLCAgICAgICAgIDAsICAgICAwfQorc3RhdGljIGNvbnN0IEJBTkRXSURUSF9UQUJfVkJSIGJhbmRXaWR0aFRhYmxlVkJSW10gPSB7CisgICAge0FBQ0VOQ19CUl9NT0RFX0NCUiwgMCwgMH0sCisgICAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8xLCAxMzA1MCwgMTMwNTB9LAorICAgIHtBQUNFTkNfQlJfTU9ERV9WQlJfMiwgMTMwNTAsIDEzMDUwfSwKKyAgICB7QUFDRU5DX0JSX01PREVfVkJSXzMsIDE0MjYwLCAxNDI2MH0sCisgICAge0FBQ0VOQ19CUl9NT0RFX1ZCUl80LCAxNTUwMCwgMTU1MDB9LAorICAgIHtBQUNFTkNfQlJfTU9ERV9WQlJfNSwgNDgwMDAsIDQ4MDAwfSwKKyAgICB7QUFDRU5DX0JSX01PREVfU0ZSLCAwLCAwfSwKKyAgICB7QUFDRU5DX0JSX01PREVfRkYsIDAsIDB9CiAKIH07CiAKLXN0YXRpYyBJTlQgR2V0QmFuZHdpZHRoRW50cnkoCi0gICAgICAgICAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCi0gICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGNvbnN0IElOVCBjaGFuQml0UmF0ZSwKLSAgICAgICAgICAgIGNvbnN0IElOVCBlbnRyeU5vKQoteworc3RhdGljIElOVCBHZXRCYW5kd2lkdGhFbnRyeShjb25zdCBJTlQgZnJhbWVMZW5ndGgsIGNvbnN0IElOVCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY2hhbkJpdFJhdGUsIGNvbnN0IElOVCBlbnRyeU5vKSB7CiAgIElOVCBiYW5kd2lkdGggPSAtMTsKICAgY29uc3QgQkFORFdJRFRIX1RBQiAqcEJ3VGFiID0gTlVMTDsKICAgSU5UIGJ3VGFiU2l6ZSA9IDA7CiAKICAgc3dpdGNoIChmcmFtZUxlbmd0aCkgeworICAgIGNhc2UgOTYwOgogICAgIGNhc2UgMTAyNDoKICAgICAgIHBCd1RhYiA9IGJhbmRXaWR0aFRhYmxlOwotICAgICAgYndUYWJTaXplID0gc2l6ZW9mKGJhbmRXaWR0aFRhYmxlKS9zaXplb2YoQkFORFdJRFRIX1RBQik7CisgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGUpIC8gc2l6ZW9mKEJBTkRXSURUSF9UQUIpOwogICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjA6CisgICAgY2FzZSAxMjg6CisgICAgY2FzZSAyNDA6CisgICAgY2FzZSAyNTY6CiAgICAgY2FzZSA0ODA6CiAgICAgY2FzZSA1MTI6CiAgICAgICBzd2l0Y2ggKHNhbXBsZVJhdGUpIHsKQEAgLTIxNywyNiArMTg2LDI2IEBACiAgICAgICAgIGNhc2UgMTYwMDA6CiAgICAgICAgIGNhc2UgMjIwNTA6CiAgICAgICAgICAgcEJ3VGFiID0gYmFuZFdpZHRoVGFibGVfTERfMjIwNTA7Ci0gICAgICAgICAgYndUYWJTaXplID0gc2l6ZW9mKGJhbmRXaWR0aFRhYmxlX0xEXzIyMDUwKS9zaXplb2YoQkFORFdJRFRIX1RBQik7CisgICAgICAgICAgYndUYWJTaXplID0gc2l6ZW9mKGJhbmRXaWR0aFRhYmxlX0xEXzIyMDUwKSAvIHNpemVvZihCQU5EV0lEVEhfVEFCKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyNDAwMDoKICAgICAgICAgICBwQndUYWIgPSBiYW5kV2lkdGhUYWJsZV9MRF8yNDAwMDsKLSAgICAgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGVfTERfMjQwMDApL3NpemVvZihCQU5EV0lEVEhfVEFCKTsKKyAgICAgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGVfTERfMjQwMDApIC8gc2l6ZW9mKEJBTkRXSURUSF9UQUIpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDMyMDAwOgogICAgICAgICAgIHBCd1RhYiA9IGJhbmRXaWR0aFRhYmxlX0xEXzMyMDAwOwotICAgICAgICAgIGJ3VGFiU2l6ZSA9IHNpemVvZihiYW5kV2lkdGhUYWJsZV9MRF8zMjAwMCkvc2l6ZW9mKEJBTkRXSURUSF9UQUIpOworICAgICAgICAgIGJ3VGFiU2l6ZSA9IHNpemVvZihiYW5kV2lkdGhUYWJsZV9MRF8zMjAwMCkgLyBzaXplb2YoQkFORFdJRFRIX1RBQik7CiAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgKDQ0MTAwKToKKyAgICAgICAgY2FzZSA0NDEwMDoKICAgICAgICAgICBwQndUYWIgPSBiYW5kV2lkdGhUYWJsZV9MRF80NDEwMDsKLSAgICAgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGVfTERfNDQxMDApL3NpemVvZihCQU5EV0lEVEhfVEFCKTsKKyAgICAgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGVfTERfNDQxMDApIC8gc2l6ZW9mKEJBTkRXSURUSF9UQUIpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ4MDAwOgogICAgICAgICBjYXNlIDY0MDAwOgogICAgICAgICBjYXNlIDg4MjAwOgogICAgICAgICBjYXNlIDk2MDAwOgogICAgICAgICAgIHBCd1RhYiA9IGJhbmRXaWR0aFRhYmxlX0xEXzQ4MDAwOwotICAgICAgICAgIGJ3VGFiU2l6ZSA9IHNpemVvZihiYW5kV2lkdGhUYWJsZV9MRF80ODAwMCkvc2l6ZW9mKEJBTkRXSURUSF9UQUIpOworICAgICAgICAgIGJ3VGFiU2l6ZSA9IHNpemVvZihiYW5kV2lkdGhUYWJsZV9MRF80ODAwMCkgLyBzaXplb2YoQkFORFdJRFRIX1RBQik7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBicmVhazsKQEAgLTI0NSwzMSArMjE0LDM4IEBACiAgICAgICBid1RhYlNpemUgPSAwOwogICB9CiAKLSAgaWYgKHBCd1RhYiE9TlVMTCkgeworICBpZiAocEJ3VGFiICE9IE5VTEwpIHsKICAgICBpbnQgaTsKLSAgICBmb3IgKGk9MDsgaTxid1RhYlNpemUtMTsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGJ3VGFiU2l6ZSAtIDE7IGkrKykgewogICAgICAgaWYgKGNoYW5CaXRSYXRlID49IHBCd1RhYltpXS5jaGFuQml0UmF0ZSAmJgotICAgICAgICAgIGNoYW5CaXRSYXRlIDwgcEJ3VGFiW2krMV0uY2hhbkJpdFJhdGUpCi0gICAgICB7CisgICAgICAgICAgY2hhbkJpdFJhdGUgPCBwQndUYWJbaSArIDFdLmNoYW5CaXRSYXRlKSB7CiAgICAgICAgIHN3aXRjaCAoZnJhbWVMZW5ndGgpIHsKKyAgICAgICAgICBjYXNlIDk2MDoKICAgICAgICAgICBjYXNlIDEwMjQ6Ci0gICAgICAgICAgICBiYW5kd2lkdGggPSAoZW50cnlObz09MCkKLSAgICAgICAgICAgICAgPyBwQndUYWJbaV0uYmFuZFdpZHRoTW9ubwotICAgICAgICAgICAgICA6IHBCd1RhYltpXS5iYW5kV2lkdGgyQW5kTW9yZUNoYW47CisgICAgICAgICAgICBiYW5kd2lkdGggPSAoZW50cnlObyA9PSAwKSA/IHBCd1RhYltpXS5iYW5kV2lkdGhNb25vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBCd1RhYltpXS5iYW5kV2lkdGgyQW5kTW9yZUNoYW47CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDEyMDoKKyAgICAgICAgICBjYXNlIDEyODoKKyAgICAgICAgICBjYXNlIDI0MDoKKyAgICAgICAgICBjYXNlIDI1NjoKICAgICAgICAgICBjYXNlIDQ4MDoKLSAgICAgICAgICBjYXNlIDUxMjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSU5UIHFfcmVzID0gMDsKLSAgICAgICAgICAgICAgSU5UIHN0YXJ0QncgPSAoZW50cnlObz09MCkgPyAgcEJ3VGFiW2kgIF0uYmFuZFdpZHRoTW9ubyA6IHBCd1RhYltpICBdLmJhbmRXaWR0aDJBbmRNb3JlQ2hhbjsKLSAgICAgICAgICAgICAgSU5UIGVuZEJ3ID0gICAoZW50cnlObz09MCkgPyAgcEJ3VGFiW2krMV0uYmFuZFdpZHRoTW9ubyA6IHBCd1RhYltpKzFdLmJhbmRXaWR0aDJBbmRNb3JlQ2hhbjsKLSAgICAgICAgICAgICAgSU5UIHN0YXJ0QnIgPSBwQndUYWJbaV0uY2hhbkJpdFJhdGU7Ci0gICAgICAgICAgICAgIElOVCBlbmRCciA9IHBCd1RhYltpKzFdLmNoYW5CaXRSYXRlOworICAgICAgICAgIGNhc2UgNTEyOiB7CisgICAgICAgICAgICBJTlQgcV9yZXMgPSAwOworICAgICAgICAgICAgSU5UIHN0YXJ0QncgPSAoZW50cnlObyA9PSAwKSA/IHBCd1RhYltpXS5iYW5kV2lkdGhNb25vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcEJ3VGFiW2ldLmJhbmRXaWR0aDJBbmRNb3JlQ2hhbjsKKyAgICAgICAgICAgIElOVCBlbmRCdyA9IChlbnRyeU5vID09IDApID8gcEJ3VGFiW2kgKyAxXS5iYW5kV2lkdGhNb25vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBCd1RhYltpICsgMV0uYmFuZFdpZHRoMkFuZE1vcmVDaGFuOworICAgICAgICAgICAgSU5UIHN0YXJ0QnIgPSBwQndUYWJbaV0uY2hhbkJpdFJhdGU7CisgICAgICAgICAgICBJTlQgZW5kQnIgPSBwQndUYWJbaSArIDFdLmNoYW5CaXRSYXRlOwogCi0gICAgICAgICAgICAgIEZJWFBfREJMIGJ3RmFjX2ZpeCA9IGZEaXZOb3JtKGNoYW5CaXRSYXRlLXN0YXJ0QnIsIGVuZEJyLXN0YXJ0QnIsICZxX3Jlcyk7Ci0gICAgICAgICAgICAgIGJhbmR3aWR0aCA9IChJTlQpc2NhbGVWYWx1ZShmTXVsdChid0ZhY19maXgsIChGSVhQX0RCTCkoZW5kQnctc3RhcnRCdykpLHFfcmVzKSArIHN0YXJ0Qnc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEZJWFBfREJMIGJ3RmFjX2ZpeCA9CisgICAgICAgICAgICAgICAgZkRpdk5vcm0oY2hhbkJpdFJhdGUgLSBzdGFydEJyLCBlbmRCciAtIHN0YXJ0QnIsICZxX3Jlcyk7CisgICAgICAgICAgICBiYW5kd2lkdGggPQorICAgICAgICAgICAgICAgIChJTlQpc2NhbGVWYWx1ZShmTXVsdChid0ZhY19maXgsIChGSVhQX0RCTCkoZW5kQncgLSBzdGFydEJ3KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfcmVzKSArCisgICAgICAgICAgICAgICAgc3RhcnRCdzsKKyAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBiYW5kd2lkdGggPSAtMTsKICAgICAgICAgfQpAQCAtMjgxLDk5ICsyNTcsMTA0IEBACiAgIHJldHVybiBiYW5kd2lkdGg7CiB9CiAKLQotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0RldGVybWluZUJhbmRXaWR0aChJTlQqIGJhbmRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHByb3Bvc2VkQmFuZFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0JJVFJBVEVfTU9ERSBiaXRyYXRlTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmFtZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NT0RFIGVuY29kZXJNb2RlKQoteworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0RldGVybWluZUJhbmRXaWR0aCgKKyAgICBjb25zdCBJTlQgcHJvcG9zZWRCYW5kV2lkdGgsIGNvbnN0IElOVCBiaXRyYXRlLAorICAgIGNvbnN0IEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGUsIGNvbnN0IElOVCBzYW1wbGVSYXRlLAorICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwgY29uc3QgQ0hBTk5FTF9NQVBQSU5HICpjb25zdCBjbSwKKyAgICBjb25zdCBDSEFOTkVMX01PREUgZW5jb2Rlck1vZGUsIElOVCAqY29uc3QgYmFuZFdpZHRoKSB7CiAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0VOQ19PSzsKLSAgSU5UIGNoYW5CaXRSYXRlID0gYml0cmF0ZS9jbS0+bkNoYW5uZWxzOworICBJTlQgY2hhbkJpdFJhdGUgPSBiaXRyYXRlIC8gY20tPm5DaGFubmVsc0VmZjsKIAotICAvKiB2YnIgKi8KLSAgc3dpdGNoKGJpdHJhdGVNb2RlKXsKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKLSAgICBpZiAocHJvcG9zZWRCYW5kV2lkdGggIT0gMCl7Ci0gICAgICAvKiB1c2UgZ2l2ZW4gYncgKi8KLSAgICAgICpiYW5kV2lkdGggPSBwcm9wb3NlZEJhbmRXaWR0aDsKLSAgICB9IGVsc2UgewotICAgICAgLyogdGFrZSBidyBmcm9tIHRhYmxlICovCi0gICAgICBzd2l0Y2goZW5jb2Rlck1vZGUpewotICAgICAgY2FzZSBNT0RFXzE6Ci0gICAgICAgICpiYW5kV2lkdGggPSBiYW5kV2lkdGhUYWJsZVZCUltiaXRyYXRlTW9kZV0uYmFuZFdpZHRoTW9ubzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1PREVfMjoKLSAgICAgIGNhc2UgTU9ERV8xXzI6Ci0gICAgICBjYXNlIE1PREVfMV8yXzE6Ci0gICAgICBjYXNlIE1PREVfMV8yXzI6Ci0gICAgICBjYXNlIE1PREVfMV8yXzJfMToKLSAgICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6Ci0gICAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6Ci0gICAgICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKLSAgICAgICAgKmJhbmRXaWR0aCA9IGJhbmRXaWR0aFRhYmxlVkJSW2JpdHJhdGVNb2RlXS5iYW5kV2lkdGgyQW5kTW9yZUNoYW47Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgc3dpdGNoIChiaXRyYXRlTW9kZSkgeworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzE6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzQ6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKKyAgICAgIGlmIChwcm9wb3NlZEJhbmRXaWR0aCAhPSAwKSB7CisgICAgICAgIC8qIHVzZSBnaXZlbiBidyAqLworICAgICAgICAqYmFuZFdpZHRoID0gcHJvcG9zZWRCYW5kV2lkdGg7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiB0YWtlIGJ3IGZyb20gdGFibGUgKi8KKyAgICAgICAgc3dpdGNoIChlbmNvZGVyTW9kZSkgeworICAgICAgICAgIGNhc2UgTU9ERV8xOgorICAgICAgICAgICAgKmJhbmRXaWR0aCA9IGJhbmRXaWR0aFRhYmxlVkJSW2JpdHJhdGVNb2RlXS5iYW5kV2lkdGhNb25vOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBNT0RFXzI6CisgICAgICAgICAgY2FzZSBNT0RFXzFfMjoKKyAgICAgICAgICBjYXNlIE1PREVfMV8yXzE6CisgICAgICAgICAgY2FzZSBNT0RFXzFfMl8yOgorICAgICAgICAgIGNhc2UgTU9ERV8xXzJfMl8xOgorICAgICAgICAgIGNhc2UgTU9ERV82XzE6CisgICAgICAgICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgICAgICAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgICAgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgICAgICAgY2FzZSBNT0RFXzdfMV9CQUNLOgorICAgICAgICAgIGNhc2UgTU9ERV83XzFfVE9QX0ZST05UOgorICAgICAgICAgICAgKmJhbmRXaWR0aCA9IGJhbmRXaWR0aFRhYmxlVkJSW2JpdHJhdGVNb2RlXS5iYW5kV2lkdGgyQW5kTW9yZUNoYW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgICAgICAgfQogICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfU0ZSOgotICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0ZGOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9TRlI6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9GRjoKIAotICAgIC8qIGJhbmR3aWR0aCBsaW1pdGluZyAqLwotICAgIGlmIChwcm9wb3NlZEJhbmRXaWR0aCAhPSAwKSB7Ci0gICAgICAqYmFuZFdpZHRoID0gRkRLbWluKHByb3Bvc2VkQmFuZFdpZHRoLCBGREttaW4oMjAwMDAsIHNhbXBsZVJhdGU+PjEpKTsKLSAgICB9Ci0gICAgZWxzZSB7IC8qIHNlYXJjaCByZWFzb25hYmxlIGJhbmR3aWR0aCAqLworICAgICAgLyogYmFuZHdpZHRoIGxpbWl0aW5nICovCisgICAgICBpZiAocHJvcG9zZWRCYW5kV2lkdGggIT0gMCkgeworICAgICAgICAqYmFuZFdpZHRoID0gZk1pbihwcm9wb3NlZEJhbmRXaWR0aCwgZk1pbigyMDAwMCwgc2FtcGxlUmF0ZSA+PiAxKSk7CisgICAgICB9IGVsc2UgeyAvKiBzZWFyY2ggcmVhc29uYWJsZSBiYW5kd2lkdGggKi8KIAotICAgICAgaW50IGVudHJ5Tm8gPSAwOworICAgICAgICBpbnQgZW50cnlObyA9IDA7CiAKLSAgICAgIHN3aXRjaChlbmNvZGVyTW9kZSl7Ci0gICAgICBjYXNlIE1PREVfMTogICAgICAgIC8qIG1vbm8gICAgICAqLwotICAgICAgICBlbnRyeU5vID0gMDsgICAgICAvKiB1c2UgbW9ubyBiYW5kd2l0aCBzZXR0aW5ncyAqLwotICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoIChlbmNvZGVyTW9kZSkgeworICAgICAgICAgIGNhc2UgTU9ERV8xOiAgIC8qIG1vbm8gICAgICAqLworICAgICAgICAgICAgZW50cnlObyA9IDA7IC8qIHVzZSBtb25vIGJhbmR3aWR0aCBzZXR0aW5ncyAqLworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgTU9ERV8yOiAgICAgICAgLyogc3RlcmVvICAgICovCi0gICAgICBjYXNlIE1PREVfMV8yOiAgICAgIC8qIHNjZSArIGNwZSAqLwotICAgICAgY2FzZSBNT0RFXzFfMl8xOiAgICAvKiBzY2UgKyBjcGUgKyBzY2UgKi8KLSAgICAgIGNhc2UgTU9ERV8xXzJfMjogICAgLyogc2NlICsgY3BlICsgY3BlICovCi0gICAgICBjYXNlIE1PREVfMV8yXzJfMTogIC8qICg1LjEpIHNjZSArIGNwZSArIGNwZSArIGxmZSAqLwotICAgICAgY2FzZSBNT0RFXzFfMl8yXzJfMTogLyogKDcuMSkgc2NlICsgY3BlICsgY3BlICsgY3BlICsgbGZlICovCi0gICAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6Ci0gICAgICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKLSAgICAgICAgZW50cnlObyA9IDE7ICAgICAgLyogdXNlIHN0ZXJlbyBiYW5kd2l0aCBzZXR0aW5ncyAqLwotICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIE1PREVfMjogICAgICAgLyogc3RlcmVvICAgICovCisgICAgICAgICAgY2FzZSBNT0RFXzFfMjogICAgIC8qIHNjZSArIGNwZSAqLworICAgICAgICAgIGNhc2UgTU9ERV8xXzJfMTogICAvKiBzY2UgKyBjcGUgKyBzY2UgKi8KKyAgICAgICAgICBjYXNlIE1PREVfMV8yXzI6ICAgLyogc2NlICsgY3BlICsgY3BlICovCisgICAgICAgICAgY2FzZSBNT0RFXzFfMl8yXzE6IC8qICg1LjEpIHNjZSArIGNwZSArIGNwZSArIGxmZSAqLworICAgICAgICAgIGNhc2UgTU9ERV82XzE6CisgICAgICAgICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgICAgICAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgICAgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgICAgICAgY2FzZSBNT0RFXzdfMV9CQUNLOgorICAgICAgICAgIGNhc2UgTU9ERV83XzFfVE9QX0ZST05UOgorICAgICAgICAgICAgZW50cnlObyA9IDE7IC8qIHVzZSBzdGVyZW8gYmFuZHdpZHRoIHNldHRpbmdzICovCisgICAgICAgICAgICBicmVhazsKIAotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgICAgICAgfQorCisgICAgICAgICpiYW5kV2lkdGggPQorICAgICAgICAgICAgR2V0QmFuZHdpZHRoRW50cnkoZnJhbWVMZW5ndGgsIHNhbXBsZVJhdGUsIGNoYW5CaXRSYXRlLCBlbnRyeU5vKTsKKworICAgICAgICBpZiAoKmJhbmRXaWR0aCA9PSAtMSkgeworICAgICAgICAgIHN3aXRjaCAoZnJhbWVMZW5ndGgpIHsKKyAgICAgICAgICAgIGNhc2UgMTIwOgorICAgICAgICAgICAgY2FzZSAxMjg6CisgICAgICAgICAgICBjYXNlIDI0MDoKKyAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgICAqYmFuZFdpZHRoID0gMTYwMDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX0lOVkFMSURfQ0hBTk5FTF9CSVRSQVRFOworICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfQotCi0gICAgICAqYmFuZFdpZHRoID0gR2V0QmFuZHdpZHRoRW50cnkoCi0gICAgICAgICAgICBmcmFtZUxlbmd0aCwKLSAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICBjaGFuQml0UmF0ZSwKLSAgICAgICAgICAgIGVudHJ5Tm8pOwotCi0gICAgICBpZiAoKmJhbmRXaWR0aD09LTEpIHsKLSAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX0lOVkFMSURfQ0hBTk5FTF9CSVRSQVRFOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICAqYmFuZFdpZHRoID0gMDsKLSAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9CSVRSQVRFX01PREU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKmJhbmRXaWR0aCA9IDA7CisgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9CSVRSQVRFX01PREU7CiAgIH0KIAotICAqYmFuZFdpZHRoID0gRkRLbWluKCpiYW5kV2lkdGgsIHNhbXBsZVJhdGUvMik7CisgICpiYW5kV2lkdGggPSBmTWluKCpiYW5kV2lkdGgsIHNhbXBsZVJhdGUgLyAyKTsKIAotICByZXR1cm4gRXJyb3JTdGF0dXM7OworICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2JhbmR3aWR0aC5oIGIvbGliQUFDZW5jL3NyYy9iYW5kd2lkdGguaAppbmRleCAyZTkyNDUzLi4wODhlODI5IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2JhbmR3aWR0aC5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvYmFuZHdpZHRoLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjggKzkwLDI1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKiogIEZhc3QgTVBFRyBBQUMgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFNjaHVnIC8gQS4gR3JvZXNjaGVsCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogYmFuZHdpZHRoIGV4cGVydAorICAgQXV0aG9yKHMpOiAgIE0uIFNjaHVnIC8gQS4gR3JvZXNjaGVsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBiYW5kd2lkdGggZXhwZXJ0CiAKLSNpZm5kZWYgX0JBTkRXSURUSF9ICi0jZGVmaW5lIF9CQU5EV0lEVEhfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBCQU5EV0lEVEhfSAorI2RlZmluZSBCQU5EV0lEVEhfSAogCiAjaW5jbHVkZSAicWNfZGF0YS5oIgogCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfRGV0ZXJtaW5lQmFuZFdpZHRoKElOVCogYmFuZFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcHJvcG9zZWRCYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfQklUUkFURV9NT0RFIGJpdHJhdGVNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZyYW1lTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01PREUgZW5jb2Rlck1vZGUpOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0RldGVybWluZUJhbmRXaWR0aCgKKyAgICBjb25zdCBJTlQgcHJvcG9zZWRCYW5kV2lkdGgsIGNvbnN0IElOVCBiaXRyYXRlLAorICAgIGNvbnN0IEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGUsIGNvbnN0IElOVCBzYW1wbGVSYXRlLAorICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwgY29uc3QgQ0hBTk5FTF9NQVBQSU5HICpjb25zdCBjbSwKKyAgICBjb25zdCBDSEFOTkVMX01PREUgZW5jb2Rlck1vZGUsIElOVCAqY29uc3QgYmFuZFdpZHRoKTsKIAogI2VuZGlmIC8qIEJBTkRXSURUSF9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2JpdF9jbnQuY3BwIGIvbGliQUFDZW5jL3NyYy9iaXRfY250LmNwcAppbmRleCA5MjZlZTQ5Li41NzlkZjhjIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2JpdF9jbnQuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvYml0X2NudC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjAgKzkwLDIxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogSHVmZm1hbiBCaXRjb3VudGVyICYgY29kZXIKKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogSHVmZm1hbiBCaXRjb3VudGVyICYgY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImJpdF9jbnQuaCIKIAogI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKIAotI2RlZmluZSBISV9MVEFCKGEpIChhPj4xNikKKyNkZWZpbmUgSElfTFRBQihhKSAoYSA+PiAxNikKICNkZWZpbmUgTE9fTFRBQihhKSAoYSAmIDB4ZmZmZikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDYsNzIgKzExOCw2MiBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50MV8yXzNfNF81XzZfN184XzlfMTBfMTEoY29uc3QgU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpiaXRDb3VudCkKLXsKLQorc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50MV8yXzNfNF81XzZfN184XzlfMTBfMTEoY29uc3QgU0hPUlQgKmNvbnN0IHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1QgYml0Q291bnQpIHsKICAgSU5UIGk7Ci0gIElOVCBiYzFfMixiYzNfNCxiYzVfNixiYzdfOCxiYzlfMTAsYmMxMSxzYzsKLSAgSU5UIHQwLHQxLHQyLHQzOwotICBiYzFfMj0wOwotICBiYzNfND0wOwotICBiYzVfNj0wOwotICBiYzdfOD0wOwotICBiYzlfMTA9MDsKLSAgYmMxMT0wOwotICBzYz0wOworICBJTlQgYmMxXzIsIGJjM180LCBiYzVfNiwgYmM3XzgsIGJjOV8xMCwgYmMxMSwgc2M7CisgIElOVCB0MCwgdDEsIHQyLCB0MzsKKyAgYmMxXzIgPSAwOworICBiYzNfNCA9IDA7CisgIGJjNV82ID0gMDsKKyAgYmM3XzggPSAwOworICBiYzlfMTAgPSAwOworICBiYzExID0gMDsKKyAgc2MgPSAwOwogCi0gIGZvcihpPTA7aTx3aWR0aDtpKz00KXsKKyAgRFdPUkRfQUxJR05FRCh2YWx1ZXMpOwogCi0gICAgdDA9IHZhbHVlc1tpKzBdOwotICAgIHQxPSB2YWx1ZXNbaSsxXTsKLSAgICB0Mj0gdmFsdWVzW2krMl07Ci0gICAgdDM9IHZhbHVlc1tpKzNdOworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgIHQwID0gdmFsdWVzW2kgKyAwXTsKKyAgICB0MSA9IHZhbHVlc1tpICsgMV07CisgICAgdDIgPSB2YWx1ZXNbaSArIDJdOworICAgIHQzID0gdmFsdWVzW2kgKyAzXTsKIAotICAgIC8qIDEsMiAqLworICAgIGJjMV8yICs9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlt0MCArIDFdW3QxICsgMV1bdDIgKyAxXVt0MyArIDFdOworICAgIGJjNV82ICs9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCArIDRdW3QxICsgNF0gKworICAgICAgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MiArIDRdW3QzICsgNF07CiAKLSAgICBiYzFfMis9RkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXTsKKyAgICB0MCA9IGZpeHBfYWJzKHQwKTsKKyAgICBzYyArPSAodDAgPiAwKTsKKyAgICB0MSA9IGZpeHBfYWJzKHQxKTsKKyAgICBzYyArPSAodDEgPiAwKTsKKyAgICB0MiA9IGZpeHBfYWJzKHQyKTsKKyAgICBzYyArPSAodDIgPiAwKTsKKyAgICB0MyA9IGZpeHBfYWJzKHQzKTsKKyAgICBzYyArPSAodDMgPiAwKTsKIAotICAgIC8qIDUsNiAqLwotICAgIGJjNV82Kz1GREthYWNFbmNfaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdOwotICAgIGJjNV82Kz1GREthYWNFbmNfaHVmZl9sdGFiNV82W3QyKzRdW3QzKzRdOwotCi0gICAgdDA9Zml4cF9hYnModDApOwotICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICB0Mj1maXhwX2Ficyh0Mik7Ci0gICAgdDM9Zml4cF9hYnModDMpOwotCi0KLSAgICBiYzNfNCs9IEZES2FhY0VuY19odWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdOwotCi0gICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXTsKLSAgICBiYzdfOCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0Ml1bdDNdOwotCi0gICAgYmM5XzEwKz1GREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdOwotICAgIGJjOV8xMCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDJdW3QzXTsKLQotICAgIGJjMTErPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDBdW3QxXTsKLSAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QyXVt0M107Ci0KLSAgICBzYys9KHQwPjApKyh0MT4wKSsodDI+MCkrKHQzPjApOworICAgIGJjM180ICs9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M107CisgICAgYmM3XzggKz0gKElOVClGREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV0gKworICAgICAgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0Ml1bdDNdOworICAgIGJjOV8xMCArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV0gKworICAgICAgICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QyXVt0M107CisgICAgYmMxMSArPQorICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIxMVt0MF1bdDFdICsgKElOVClGREthYWNFbmNfaHVmZl9sdGFiMTFbdDJdW3QzXTsKICAgfQotCi0gIGJpdENvdW50WzFdPUhJX0xUQUIoYmMxXzIpOwotICBiaXRDb3VudFsyXT1MT19MVEFCKGJjMV8yKTsKLSAgYml0Q291bnRbM109SElfTFRBQihiYzNfNCkrc2M7Ci0gIGJpdENvdW50WzRdPUxPX0xUQUIoYmMzXzQpK3NjOwotICBiaXRDb3VudFs1XT1ISV9MVEFCKGJjNV82KTsKLSAgYml0Q291bnRbNl09TE9fTFRBQihiYzVfNik7Ci0gIGJpdENvdW50WzddPUhJX0xUQUIoYmM3XzgpK3NjOwotICBiaXRDb3VudFs4XT1MT19MVEFCKGJjN184KStzYzsKLSAgYml0Q291bnRbOV09SElfTFRBQihiYzlfMTApK3NjOwotICBiaXRDb3VudFsxMF09TE9fTFRBQihiYzlfMTApK3NjOwotICBiaXRDb3VudFsxMV09YmMxMStzYzsKLQorICBiaXRDb3VudFsxXSA9IEhJX0xUQUIoYmMxXzIpOworICBiaXRDb3VudFsyXSA9IExPX0xUQUIoYmMxXzIpOworICBiaXRDb3VudFszXSA9IEhJX0xUQUIoYmMzXzQpICsgc2M7CisgIGJpdENvdW50WzRdID0gTE9fTFRBQihiYzNfNCkgKyBzYzsKKyAgYml0Q291bnRbNV0gPSBISV9MVEFCKGJjNV82KTsKKyAgYml0Q291bnRbNl0gPSBMT19MVEFCKGJjNV82KTsKKyAgYml0Q291bnRbN10gPSBISV9MVEFCKGJjN184KSArIHNjOworICBiaXRDb3VudFs4XSA9IExPX0xUQUIoYmM3XzgpICsgc2M7CisgIGJpdENvdW50WzldID0gSElfTFRBQihiYzlfMTApICsgc2M7CisgIGJpdENvdW50WzEwXSA9IExPX0xUQUIoYmM5XzEwKSArIHNjOworICBiaXRDb3VudFsxMV0gPSBiYzExICsgc2M7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jb3VudDNfNF81XzZfN184XzlfMTBfMTEKQEAgLTE4Miw2NiArMTg0LDYyIEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnQzXzRfNV82XzdfOF85XzEwXzExKGNvbnN0IFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKmJpdENvdW50KQotewotCitzdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnQzXzRfNV82XzdfOF85XzEwXzExKGNvbnN0IFNIT1JUICpjb25zdCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBiaXRDb3VudCkgewogICBJTlQgaTsKLSAgSU5UIGJjM180LGJjNV82LGJjN184LGJjOV8xMCxiYzExLHNjOwotICBJTlQgdDAsdDEsdDIsdDM7CisgIElOVCBiYzNfNCwgYmM1XzYsIGJjN184LCBiYzlfMTAsIGJjMTEsIHNjOworICBJTlQgdDAsIHQxLCB0MiwgdDM7CiAKLSAgYmMzXzQ9MDsKLSAgYmM1XzY9MDsKLSAgYmM3Xzg9MDsKLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKKyAgYmMzXzQgPSAwOworICBiYzVfNiA9IDA7CisgIGJjN184ID0gMDsKKyAgYmM5XzEwID0gMDsKKyAgYmMxMSA9IDA7CisgIHNjID0gMDsKIAotICBmb3IoaT0wO2k8d2lkdGg7aSs9NCl7CisgIERXT1JEX0FMSUdORUQodmFsdWVzKTsKIAotICAgIHQwPSB2YWx1ZXNbaSswXTsKLSAgICB0MT0gdmFsdWVzW2krMV07Ci0gICAgdDI9IHZhbHVlc1tpKzJdOwotICAgIHQzPSB2YWx1ZXNbaSszXTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICB0MCA9IHZhbHVlc1tpICsgMF07CisgICAgdDEgPSB2YWx1ZXNbaSArIDFdOworICAgIHQyID0gdmFsdWVzW2kgKyAyXTsKKyAgICB0MyA9IHZhbHVlc1tpICsgM107CiAKLSAgICBiYzVfNis9RkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XTsKLSAgICBiYzVfNis9RkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0Mis0XVt0Mys0XTsKKyAgICBiYzVfNiArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI1XzZbdDAgKyA0XVt0MSArIDRdICsKKyAgICAgICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI1XzZbdDIgKyA0XVt0MyArIDRdOwogCi0gICAgdDA9Zml4cF9hYnModDApOwotICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICB0Mj1maXhwX2Ficyh0Mik7Ci0gICAgdDM9Zml4cF9hYnModDMpOworICAgIHQwID0gZml4cF9hYnModDApOworICAgIHNjICs9ICh0MCA+IDApOworICAgIHQxID0gZml4cF9hYnModDEpOworICAgIHNjICs9ICh0MSA+IDApOworICAgIHQyID0gZml4cF9hYnModDIpOworICAgIHNjICs9ICh0MiA+IDApOworICAgIHQzID0gZml4cF9hYnModDMpOworICAgIHNjICs9ICh0MyA+IDApOwogCi0gICAgYmMzXzQrPSBGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXTsKLQotICAgIGJjN184Kz1GREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV07Ci0gICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDJdW3QzXTsKLQotICAgIGJjOV8xMCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXTsKLSAgICBiYzlfMTArPUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QyXVt0M107Ci0KLSAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV07Ci0gICAgYmMxMSs9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0Ml1bdDNdOwotCi0gICAgc2MrPSh0MD4wKSsodDE+MCkrKHQyPjApKyh0Mz4wKTsKKyAgICBiYzNfNCArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdOworICAgIGJjN184ICs9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdICsKKyAgICAgICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDJdW3QzXTsKKyAgICBiYzlfMTAgKz0gKElOVClGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdICsKKyAgICAgICAgICAgICAgKElOVClGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0Ml1bdDNdOworICAgIGJjMTEgKz0KKyAgICAgICAgKElOVClGREthYWNFbmNfaHVmZl9sdGFiMTFbdDBdW3QxXSArIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QyXVt0M107CiAgIH0KIAotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1ISV9MVEFCKGJjM180KStzYzsKLSAgYml0Q291bnRbNF09TE9fTFRBQihiYzNfNCkrc2M7Ci0gIGJpdENvdW50WzVdPUhJX0xUQUIoYmM1XzYpOwotICBiaXRDb3VudFs2XT1MT19MVEFCKGJjNV82KTsKLSAgYml0Q291bnRbN109SElfTFRBQihiYzdfOCkrc2M7Ci0gIGJpdENvdW50WzhdPUxPX0xUQUIoYmM3XzgpK3NjOwotICBiaXRDb3VudFs5XT1ISV9MVEFCKGJjOV8xMCkrc2M7Ci0gIGJpdENvdW50WzEwXT1MT19MVEFCKGJjOV8xMCkrc2M7Ci0gIGJpdENvdW50WzExXT1iYzExK3NjOworICBiaXRDb3VudFsxXSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzJdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbM10gPSBISV9MVEFCKGJjM180KSArIHNjOworICBiaXRDb3VudFs0XSA9IExPX0xUQUIoYmMzXzQpICsgc2M7CisgIGJpdENvdW50WzVdID0gSElfTFRBQihiYzVfNik7CisgIGJpdENvdW50WzZdID0gTE9fTFRBQihiYzVfNik7CisgIGJpdENvdW50WzddID0gSElfTFRBQihiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOF0gPSBMT19MVEFCKGJjN184KSArIHNjOworICBiaXRDb3VudFs5XSA9IEhJX0xUQUIoYmM5XzEwKSArIHNjOworICBiaXRDb3VudFsxMF0gPSBMT19MVEFCKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTFdID0gYmMxMSArIHNjOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jb3VudDVfNl83XzhfOV8xMF8xMQpAQCAtMjUyLDUyICsyNTAsNTggQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50NV82XzdfOF85XzEwXzExKGNvbnN0IFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpiaXRDb3VudCkKLXsKLQorc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50NV82XzdfOF85XzEwXzExKGNvbnN0IFNIT1JUICpjb25zdCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1QgYml0Q291bnQpIHsKICAgSU5UIGk7Ci0gIElOVCBiYzVfNixiYzdfOCxiYzlfMTAsYmMxMSxzYzsKLSAgSU5UIHQwLHQxOwotICBiYzVfNj0wOwotICBiYzdfOD0wOwotICBiYzlfMTA9MDsKLSAgYmMxMT0wOwotICBzYz0wOworICBJTlQgYmM1XzYsIGJjN184LCBiYzlfMTAsIGJjMTEsIHNjOworICBJTlQgdDAsIHQxLCB0MiwgdDM7CisgIGJjNV82ID0gMDsKKyAgYmM3XzggPSAwOworICBiYzlfMTAgPSAwOworICBiYzExID0gMDsKKyAgc2MgPSAwOwogCi0gIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKKyAgRFdPUkRfQUxJR05FRCh2YWx1ZXMpOwogCi0gICAgdDAgPSB2YWx1ZXNbaSswXTsKLSAgICB0MSA9IHZhbHVlc1tpKzFdOworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgIHQwID0gdmFsdWVzW2kgKyAwXTsKKyAgICB0MSA9IHZhbHVlc1tpICsgMV07CisgICAgdDIgPSB2YWx1ZXNbaSArIDJdOworICAgIHQzID0gdmFsdWVzW2kgKyAzXTsKIAotICAgIGJjNV82Kz1GREthYWNFbmNfaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdOworICAgIGJjNV82ICs9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCArIDRdW3QxICsgNF0gKworICAgICAgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MiArIDRdW3QzICsgNF07CiAKLSAgICB0MD1maXhwX2Ficyh0MCk7Ci0gICAgdDE9Zml4cF9hYnModDEpOworICAgIHQwID0gZml4cF9hYnModDApOworICAgIHNjICs9ICh0MCA+IDApOworICAgIHQxID0gZml4cF9hYnModDEpOworICAgIHNjICs9ICh0MSA+IDApOworICAgIHQyID0gZml4cF9hYnModDIpOworICAgIHNjICs9ICh0MiA+IDApOworICAgIHQzID0gZml4cF9hYnModDMpOworICAgIHNjICs9ICh0MyA+IDApOwogCi0gICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXTsKLSAgICBiYzlfMTArPUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV07Ci0gICAgYmMxMSs9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0MF1bdDFdOwotCi0gICAgc2MrPSh0MD4wKSsodDE+MCk7CisgICAgYmM3XzggKz0gKElOVClGREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV0gKworICAgICAgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0Ml1bdDNdOworICAgIGJjOV8xMCArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV0gKworICAgICAgICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QyXVt0M107CisgICAgYmMxMSArPQorICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIxMVt0MF1bdDFdICsgKElOVClGREthYWNFbmNfaHVmZl9sdGFiMTFbdDJdW3QzXTsKICAgfQotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs1XT1ISV9MVEFCKGJjNV82KTsKLSAgYml0Q291bnRbNl09TE9fTFRBQihiYzVfNik7Ci0gIGJpdENvdW50WzddPUhJX0xUQUIoYmM3XzgpK3NjOwotICBiaXRDb3VudFs4XT1MT19MVEFCKGJjN184KStzYzsKLSAgYml0Q291bnRbOV09SElfTFRBQihiYzlfMTApK3NjOwotICBiaXRDb3VudFsxMF09TE9fTFRBQihiYzlfMTApK3NjOwotICBiaXRDb3VudFsxMV09YmMxMStzYzsKLQorICBiaXRDb3VudFsxXSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzJdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbM10gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs0XSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzVdID0gSElfTFRBQihiYzVfNik7CisgIGJpdENvdW50WzZdID0gTE9fTFRBQihiYzVfNik7CisgIGJpdENvdW50WzddID0gSElfTFRBQihiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOF0gPSBMT19MVEFCKGJjN184KSArIHNjOworICBiaXRDb3VudFs5XSA9IEhJX0xUQUIoYmM5XzEwKSArIHNjOworICBiaXRDb3VudFsxMF0gPSBMT19MVEFCKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTFdID0gYmMxMSArIHNjOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMQpAQCAtMzA4LDQyICszMTIsNTQgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDdfOF85XzEwXzExKGNvbnN0IFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqYml0Q291bnQpCi17Ci0KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDdfOF85XzEwXzExKGNvbnN0IFNIT1JUICpjb25zdCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIGJpdENvdW50KSB7CiAgIElOVCBpOwotICBJTlQgYmM3XzgsYmM5XzEwLGJjMTEsc2M7Ci0gIElOVCB0MCx0MTsKKyAgSU5UIGJjN184LCBiYzlfMTAsIGJjMTEsIHNjOworICBJTlQgdDAsIHQxLCB0MiwgdDM7CiAKLSAgYmM3Xzg9MDsKLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKKyAgYmM3XzggPSAwOworICBiYzlfMTAgPSAwOworICBiYzExID0gMDsKKyAgc2MgPSAwOwogCi0gIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKLSAgICB0MD1maXhwX2Ficyh2YWx1ZXNbaSswXSk7Ci0gICAgdDE9Zml4cF9hYnModmFsdWVzW2krMV0pOworICBEV09SRF9BTElHTkVEKHZhbHVlcyk7CiAKLSAgICBiYzdfOCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdOwotICAgIGJjOV8xMCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXTsKLSAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV07Ci0gICAgc2MrPSh0MD4wKSsodDE+MCk7CisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSA0KSB7CisgICAgdDAgPSB2YWx1ZXNbaSArIDBdOworICAgIHQxID0gdmFsdWVzW2kgKyAxXTsKKyAgICB0MiA9IHZhbHVlc1tpICsgMl07CisgICAgdDMgPSB2YWx1ZXNbaSArIDNdOworCisgICAgdDAgPSBmaXhwX2Ficyh0MCk7CisgICAgc2MgKz0gKHQwID4gMCk7CisgICAgdDEgPSBmaXhwX2Ficyh0MSk7CisgICAgc2MgKz0gKHQxID4gMCk7CisgICAgdDIgPSBmaXhwX2Ficyh0Mik7CisgICAgc2MgKz0gKHQyID4gMCk7CisgICAgdDMgPSBmaXhwX2Ficyh0Myk7CisgICAgc2MgKz0gKHQzID4gMCk7CisKKyAgICBiYzdfOCArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXSArCisgICAgICAgICAgICAgKElOVClGREthYWNFbmNfaHVmZl9sdGFiN184W3QyXVt0M107CisgICAgYmM5XzEwICs9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSArCisgICAgICAgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDJdW3QzXTsKKyAgICBiYzExICs9CisgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV0gKyAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIxMVt0Ml1bdDNdOwogICB9CiAKLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbN109SElfTFRBQihiYzdfOCkrc2M7Ci0gIGJpdENvdW50WzhdPUxPX0xUQUIoYmM3XzgpK3NjOwotICBiaXRDb3VudFs5XT1ISV9MVEFCKGJjOV8xMCkrc2M7Ci0gIGJpdENvdW50WzEwXT1MT19MVEFCKGJjOV8xMCkrc2M7Ci0gIGJpdENvdW50WzExXT1iYzExK3NjOwotCisgIGJpdENvdW50WzFdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMl0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFszXSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzRdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNV0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs2XSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzddID0gSElfTFRBQihiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOF0gPSBMT19MVEFCKGJjN184KSArIHNjOworICBiaXRDb3VudFs5XSA9IEhJX0xUQUIoYmM5XzEwKSArIHNjOworICBiaXRDb3VudFsxMF0gPSBMT19MVEFCKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTFdID0gYmMxMSArIHNjOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM1Niw0MyArMzcyLDUwIEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KLQotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50OV8xMF8xMShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpiaXRDb3VudCkKLXsKLQorc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50OV8xMF8xMShjb25zdCBTSE9SVCAqY29uc3QgdmFsdWVzLCBjb25zdCBJTlQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1QgYml0Q291bnQpIHsKICAgSU5UIGk7Ci0gIElOVCBiYzlfMTAsYmMxMSxzYzsKLSAgSU5UIHQwLHQxOworICBJTlQgYmM5XzEwLCBiYzExLCBzYzsKKyAgSU5UIHQwLCB0MSwgdDIsIHQzOwogCi0gIGJjOV8xMD0wOwotICBiYzExPTA7Ci0gIHNjPTA7CisgIGJjOV8xMCA9IDA7CisgIGJjMTEgPSAwOworICBzYyA9IDA7CiAKLSAgZm9yKGk9MDtpPHdpZHRoO2krPTIpewotICAgIHQwPWZpeHBfYWJzKHZhbHVlc1tpKzBdKTsKLSAgICB0MT1maXhwX2Ficyh2YWx1ZXNbaSsxXSk7CisgIERXT1JEX0FMSUdORUQodmFsdWVzKTsKIAotICAgIGJjOV8xMCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXTsKLSAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV07CisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSA0KSB7CisgICAgdDAgPSB2YWx1ZXNbaSArIDBdOworICAgIHQxID0gdmFsdWVzW2kgKyAxXTsKKyAgICB0MiA9IHZhbHVlc1tpICsgMl07CisgICAgdDMgPSB2YWx1ZXNbaSArIDNdOwogCi0gICAgc2MrPSh0MD4wKSsodDE+MCk7CisgICAgdDAgPSBmaXhwX2Ficyh0MCk7CisgICAgc2MgKz0gKHQwID4gMCk7CisgICAgdDEgPSBmaXhwX2Ficyh0MSk7CisgICAgc2MgKz0gKHQxID4gMCk7CisgICAgdDIgPSBmaXhwX2Ficyh0Mik7CisgICAgc2MgKz0gKHQyID4gMCk7CisgICAgdDMgPSBmaXhwX2Ficyh0Myk7CisgICAgc2MgKz0gKHQzID4gMCk7CisKKyAgICBiYzlfMTAgKz0gKElOVClGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdICsKKyAgICAgICAgICAgICAgKElOVClGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0Ml1bdDNdOworICAgIGJjMTEgKz0KKyAgICAgICAgKElOVClGREthYWNFbmNfaHVmZl9sdGFiMTFbdDBdW3QxXSArIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QyXVt0M107CiAgIH0KIAotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs1XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs2XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs4XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs5XT1ISV9MVEFCKGJjOV8xMCkrc2M7Ci0gIGJpdENvdW50WzEwXT1MT19MVEFCKGJjOV8xMCkrc2M7Ci0gIGJpdENvdW50WzExXT1iYzExK3NjOwotCisgIGJpdENvdW50WzFdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMl0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFszXSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzRdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNV0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs2XSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzddID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbOF0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs5XSA9IEhJX0xUQUIoYmM5XzEwKSArIHNjOworICBiaXRDb3VudFsxMF0gPSBMT19MVEFCKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTFdID0gYmMxMSArIHNjOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQwNSwzNSArNDI4LDQ3IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnQxMShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICpiaXRDb3VudCkKLXsKLQorc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50MTEoY29uc3QgU0hPUlQgKmNvbnN0IHZhbHVlcywgY29uc3QgSU5UIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBiaXRDb3VudCkgewogICBJTlQgaTsKLSAgSU5UIGJjMTEsc2M7Ci0gIElOVCB0MCx0MTsKKyAgSU5UIGJjMTEsIHNjOworICBJTlQgdDAsIHQxLCB0MiwgdDM7CiAKLSAgYmMxMT0wOwotICBzYz0wOwotICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7Ci0gICAgdDA9Zml4cF9hYnModmFsdWVzW2krMF0pOwotICAgIHQxPWZpeHBfYWJzKHZhbHVlc1tpKzFdKTsKLSAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV07Ci0gICAgc2MrPSh0MD4wKSsodDE+MCk7CisgIGJjMTEgPSAwOworICBzYyA9IDA7CisKKyAgRFdPUkRfQUxJR05FRCh2YWx1ZXMpOworCisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSA0KSB7CisgICAgdDAgPSB2YWx1ZXNbaSArIDBdOworICAgIHQxID0gdmFsdWVzW2kgKyAxXTsKKyAgICB0MiA9IHZhbHVlc1tpICsgMl07CisgICAgdDMgPSB2YWx1ZXNbaSArIDNdOworCisgICAgdDAgPSBmaXhwX2Ficyh0MCk7CisgICAgc2MgKz0gKHQwID4gMCk7CisgICAgdDEgPSBmaXhwX2Ficyh0MSk7CisgICAgc2MgKz0gKHQxID4gMCk7CisgICAgdDIgPSBmaXhwX2Ficyh0Mik7CisgICAgc2MgKz0gKHQyID4gMCk7CisgICAgdDMgPSBmaXhwX2Ficyh0Myk7CisgICAgc2MgKz0gKHQzID4gMCk7CisKKyAgICBiYzExICs9CisgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV0gKyAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIxMVt0Ml1bdDNdOwogICB9CiAKLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbN109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbOF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbOV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMTBdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzExXT1iYzExK3NjOworICBiaXRDb3VudFsxXSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzJdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbM10gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs0XSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzVdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNl0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs3XSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzhdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbOV0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFsxMF0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFsxMV0gPSBiYzExICsgc2M7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDQ2LDY3NyArNDgxLDQ3MCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50RXNjKGNvbnN0IFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpSRVNUUklDVCBiaXRDb3VudCkKLXsKLQorc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50RXNjKGNvbnN0IFNIT1JUICpjb25zdCB2YWx1ZXMsIGNvbnN0IElOVCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIGJpdENvdW50KSB7CiAgIElOVCBpOwotICBJTlQgYmMxMSxlYyxzYzsKLSAgSU5UIHQwLHQxLHQwMCx0MDE7CisgIElOVCBiYzExLCBlYywgc2M7CisgIElOVCB0MCwgdDEsIHQwMCwgdDAxOwogCi0gIGJjMTE9MDsKLSAgc2M9MDsKLSAgZWM9MDsKLSAgZm9yKGk9MDtpPHdpZHRoO2krPTIpewotICAgIHQwPWZpeHBfYWJzKHZhbHVlc1tpKzBdKTsKLSAgICB0MT1maXhwX2Ficyh2YWx1ZXNbaSsxXSk7CisgIGJjMTEgPSAwOworICBzYyA9IDA7CisgIGVjID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDIpIHsKKyAgICB0MCA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMF0pOworICAgIHQxID0gZml4cF9hYnModmFsdWVzW2kgKyAxXSk7CiAKLSAgICBzYys9KHQwPjApKyh0MT4wKTsKKyAgICBzYyArPSAodDAgPiAwKSArICh0MSA+IDApOwogCi0gICAgdDAwID0gZml4TWluKHQwLDE2KTsKLSAgICB0MDEgPSBmaXhNaW4odDEsMTYpOwotICAgIGJjMTErPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDAwXVt0MDFdOworICAgIHQwMCA9IGZpeE1pbih0MCwgMTYpOworICAgIHQwMSA9IGZpeE1pbih0MSwgMTYpOworICAgIGJjMTEgKz0gKElOVClGREthYWNFbmNfaHVmZl9sdGFiMTFbdDAwXVt0MDFdOwogCi0gICAgaWYodDA+PTE2KXsKLSAgICAgIGVjKz01OwotICAgICAgd2hpbGUoKHQwPj49MSkgPj0gMTYpCi0gICAgICAgIGVjKz0yOworICAgIGlmICh0MCA+PSAxNikgeworICAgICAgZWMgKz0gNTsKKyAgICAgIHdoaWxlICgodDAgPj49IDEpID49IDE2KSBlYyArPSAyOwogICAgIH0KIAotICAgIGlmKHQxPj0xNil7Ci0gICAgICBlYys9NTsKLSAgICAgIHdoaWxlKCh0MT4+PTEpID49IDE2KQotICAgICAgICBlYys9MjsKKyAgICBpZiAodDEgPj0gMTYpIHsKKyAgICAgIGVjICs9IDU7CisgICAgICB3aGlsZSAoKHQxID4+PSAxKSA+PSAxNikgZWMgKz0gMjsKICAgICB9CiAgIH0KIAotICBmb3IgKGk9MDsgaTwxMTsgaSsrKQotICAgIGJpdENvdW50W2ldPUlOVkFMSURfQklUQ09VTlQ7CisgIGZvciAoaSA9IDA7IGkgPCAxMTsgaSsrKSBiaXRDb3VudFtpXSA9IElOVkFMSURfQklUQ09VTlQ7CiAKLSAgYml0Q291bnRbMTFdPWJjMTErc2MrZWM7CisgIGJpdENvdW50WzExXSA9IGJjMTEgKyBzYyArIGVjOwogfQogCit0eXBlZGVmIHZvaWQgKCpDT1VOVF9GVU5DVElPTikoY29uc3QgU0hPUlQgKmNvbnN0IHZhbHVlcywgY29uc3QgSU5UIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1QgYml0Q291bnQpOwogCi10eXBlZGVmIHZvaWQgKCpDT1VOVF9GVU5DVElPTikoY29uc3QgU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqUkVTVFJJQ1QgYml0Q291bnQpOworc3RhdGljIGNvbnN0IENPVU5UX0ZVTkNUSU9OIGNvdW50RnVuY1RhYmxlW0NPREVfQk9PS19FU0NfTEFWICsgMV0gPSB7CiAKLXN0YXRpYyBjb25zdCBDT1VOVF9GVU5DVElPTiBjb3VudEZ1bmNUYWJsZVtDT0RFX0JPT0tfRVNDX0xBVisxXSA9Ci17Ci0KLSBGREthYWNFbmNfY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMSwgIC8qIDAgICovCi0gRkRLYWFjRW5jX2NvdW50MV8yXzNfNF81XzZfN184XzlfMTBfMTEsICAvKiAxICAqLwotIEZES2FhY0VuY19jb3VudDNfNF81XzZfN184XzlfMTBfMTEsICAgICAgLyogMiAgKi8KLSBGREthYWNFbmNfY291bnQ1XzZfN184XzlfMTBfMTEsICAgICAgICAgIC8qIDMgICovCi0gRkRLYWFjRW5jX2NvdW50NV82XzdfOF85XzEwXzExLCAgICAgICAgICAvKiA0ICAqLwotIEZES2FhY0VuY19jb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNSAgKi8KLSBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMSwgICAgICAgICAgICAgIC8qIDYgICovCi0gRkRLYWFjRW5jX2NvdW50N184XzlfMTBfMTEsICAgICAgICAgICAgICAvKiA3ICAqLwotIEZES2FhY0VuY19jb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogOCAgKi8KLSBGREthYWNFbmNfY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgIC8qIDkgICovCi0gRkRLYWFjRW5jX2NvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiAxMCAqLwotIEZES2FhY0VuY19jb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTEgKi8KLSBGREthYWNFbmNfY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgIC8qIDEyICovCi0gRkRLYWFjRW5jX2NvdW50MTEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxMyAqLwotIEZES2FhY0VuY19jb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTQgKi8KLSBGREthYWNFbmNfY291bnQxMSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDE1ICovCi0gRkRLYWFjRW5jX2NvdW50RXNjICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiAqLworICAgIEZES2FhY0VuY19jb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExLCAvKiAwICAqLworICAgIEZES2FhY0VuY19jb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExLCAvKiAxICAqLworICAgIEZES2FhY0VuY19jb3VudDNfNF81XzZfN184XzlfMTBfMTEsICAgICAvKiAyICAqLworICAgIEZES2FhY0VuY19jb3VudDVfNl83XzhfOV8xMF8xMSwgICAgICAgICAvKiAzICAqLworICAgIEZES2FhY0VuY19jb3VudDVfNl83XzhfOV8xMF8xMSwgICAgICAgICAvKiA0ICAqLworICAgIEZES2FhY0VuY19jb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAvKiA1ICAqLworICAgIEZES2FhY0VuY19jb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAvKiA2ICAqLworICAgIEZES2FhY0VuY19jb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAvKiA3ICAqLworICAgIEZES2FhY0VuY19jb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAvKiA4ICAqLworICAgIEZES2FhY0VuY19jb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAvKiA5ICAqLworICAgIEZES2FhY0VuY19jb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAvKiAxMCAqLworICAgIEZES2FhY0VuY19jb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAvKiAxMSAqLworICAgIEZES2FhY0VuY19jb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAvKiAxMiAqLworICAgIEZES2FhY0VuY19jb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAvKiAxMyAqLworICAgIEZES2FhY0VuY19jb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAvKiAxNCAqLworICAgIEZES2FhY0VuY19jb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAvKiAxNSAqLworICAgIEZES2FhY0VuY19jb3VudEVzYyAgICAgICAgICAgICAgICAgICAgICAvKiAxNiAqLwogfTsKIAotCi0KLUlOVCAgICBGREthYWNFbmNfYml0Q291bnQoY29uc3QgU0hPUlQgKnZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG1heFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqYml0Q291bnQpCi17Ci0KK0lOVCBGREthYWNFbmNfYml0Q291bnQoY29uc3QgU0hPUlQgKmNvbnN0IHZhbHVlcywgY29uc3QgSU5UIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWF4VmFsLCBJTlQgKmNvbnN0IFJFU1RSSUNUIGJpdENvdW50KSB7CiAgIC8qCiAgICAgY2hlY2sgaWYgd2UgY2FuIHVzZSBjb2RlYm9vayAwCiAgICovCiAKLSAgaWYobWF4VmFsID09IDApCi0gICAgYml0Q291bnRbMF0gPSAwOwotICBlbHNlCi0gICAgYml0Q291bnRbMF0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFswXSA9IChtYXhWYWwgPT0gMCkgPyAwIDogSU5WQUxJRF9CSVRDT1VOVDsKIAotICBtYXhWYWwgPSBmaXhNaW4obWF4VmFsLChJTlQpQ09ERV9CT09LX0VTQ19MQVYpOwotICBjb3VudEZ1bmNUYWJsZVttYXhWYWxdKHZhbHVlcyx3aWR0aCxiaXRDb3VudCk7Ci0gIHJldHVybigwKTsKKyAgY291bnRGdW5jVGFibGVbZml4TWluKG1heFZhbCwgKElOVClDT0RFX0JPT0tfRVNDX0xBVildKHZhbHVlcywgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRDb3VudCk7CisKKyAgcmV0dXJuICgwKTsKIH0KIAotCi0KLQogLyoKICAgY291bnQgZGlmZmVyZW5jZSBiZXR3ZWVuIGFjdHVhbCBhbmQgemVyb2VkIGxpbmVzCiAqLwotSU5UIEZES2FhY0VuY19jb3VudFZhbHVlcyhTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLCBJTlQgd2lkdGgsIElOVCBjb2RlQm9vaykKLXsKK0lOVCBGREthYWNFbmNfY291bnRWYWx1ZXMoU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywgSU5UIHdpZHRoLCBJTlQgY29kZUJvb2spIHsKKyAgSU5UIGksIHQwLCB0MSwgdDIsIHQzOworICBJTlQgYml0Q250ID0gMDsKIAotICBJTlQgaSx0MCx0MSx0Mix0Myx0MDAsdDAxOwotICBJTlQgY29kZUxlbmd0aDsKLSAgSU5UIHNpZ25MZW5ndGg7Ci0gIElOVCBiaXRDbnQ9MDsKKyAgc3dpdGNoIChjb2RlQm9vaykgeworICAgIGNhc2UgQ09ERV9CT09LX1pFUk9fTk86CisgICAgICBicmVhazsKIAotICBzd2l0Y2goY29kZUJvb2spewotICBjYXNlIENPREVfQk9PS19aRVJPX05POgotICAgIGJyZWFrOworICAgIGNhc2UgQ09ERV9CT09LXzFfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgICAgICB0MCA9IHZhbHVlc1tpICsgMF07CisgICAgICAgIHQxID0gdmFsdWVzW2kgKyAxXTsKKyAgICAgICAgdDIgPSB2YWx1ZXNbaSArIDJdOworICAgICAgICB0MyA9IHZhbHVlc1tpICsgM107CisgICAgICAgIGJpdENudCArPQorICAgICAgICAgICAgSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiMV8yW3QwICsgMV1bdDEgKyAxXVt0MiArIDFdW3QzICsgMV0pOworICAgICAgfQorICAgICAgYnJlYWs7CiAKLSAgY2FzZSBDT0RFX0JPT0tfMV9OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7Ci0gICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07Ci0gICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07Ci0gICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl07Ci0gICAgICB0MyAgICAgICAgID0gdmFsdWVzW2krM107Ci0gICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiMV8yW3QwKzFdW3QxKzFdW3QyKzFdW3QzKzFdKTsKLSAgICAgIGJpdENudCs9IGNvZGVMZW5ndGg7Ci0gICAgfQotICAgIGJyZWFrOworICAgIGNhc2UgQ09ERV9CT09LXzJfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgICAgICB0MCA9IHZhbHVlc1tpICsgMF07CisgICAgICAgIHQxID0gdmFsdWVzW2kgKyAxXTsKKyAgICAgICAgdDIgPSB2YWx1ZXNbaSArIDJdOworICAgICAgICB0MyA9IHZhbHVlc1tpICsgM107CisgICAgICAgIGJpdENudCArPQorICAgICAgICAgICAgTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiMV8yW3QwICsgMV1bdDEgKyAxXVt0MiArIDFdW3QzICsgMV0pOworICAgICAgfQorICAgICAgYnJlYWs7CiAKLSAgY2FzZSBDT0RFX0JPT0tfMl9OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7Ci0gICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07Ci0gICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07Ci0gICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl07Ci0gICAgICB0MyAgICAgICAgID0gdmFsdWVzW2krM107Ci0gICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiMV8yW3QwKzFdW3QxKzFdW3QyKzFdW3QzKzFdKTsKLSAgICAgIGJpdENudCs9IGNvZGVMZW5ndGg7Ci0gICAgfQotICAgIGJyZWFrOworICAgIGNhc2UgQ09ERV9CT09LXzNfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgICAgICB0MCA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMF0pOworICAgICAgICBiaXRDbnQgKz0gKHQwID4gMCk7CisgICAgICAgIHQxID0gZml4cF9hYnModmFsdWVzW2kgKyAxXSk7CisgICAgICAgIGJpdENudCArPSAodDEgPiAwKTsKKyAgICAgICAgdDIgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDJdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MiA+IDApOworICAgICAgICB0MyA9IGZpeHBfYWJzKHZhbHVlc1tpICsgM10pOworICAgICAgICBiaXRDbnQgKz0gKHQzID4gMCk7CisgICAgICAgIGJpdENudCArPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgQ09ERV9CT09LXzNfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLSAgICAgIGlmKHQwICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKKyAgICBjYXNlIENPREVfQk9PS180X05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDBdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MCA+IDApOworICAgICAgICB0MSA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMV0pOworICAgICAgICBiaXRDbnQgKz0gKHQxID4gMCk7CisgICAgICAgIHQyID0gZml4cF9hYnModmFsdWVzW2kgKyAyXSk7CisgICAgICAgIGJpdENudCArPSAodDIgPiAwKTsKKyAgICAgICAgdDMgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDNdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MyA+IDApOworICAgICAgICBiaXRDbnQgKz0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7CiAgICAgICB9Ci0gICAgICB0MSA9IHZhbHVlc1tpKzFdOwotICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDE9Zml4cF9hYnModDEpOwotICAgICAgfQotICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKLSAgICAgIGlmKHQyICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHQyPWZpeHBfYWJzKHQyKTsKLSAgICAgIH0KLSAgICAgIHQzID0gdmFsdWVzW2krM107Ci0gICAgICBpZih0MyAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0Mz1maXhwX2Ficyh0Myk7Ci0gICAgICB9CisgICAgICBicmVhazsKIAotICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOwotICAgICAgYml0Q250Kz1jb2RlTGVuZ3RoK3NpZ25MZW5ndGg7Ci0gICAgfQotICAgIGJyZWFrOworICAgIGNhc2UgQ09ERV9CT09LXzVfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgICAgICB0MCA9IHZhbHVlc1tpICsgMF07CisgICAgICAgIHQxID0gdmFsdWVzW2kgKyAxXTsKKyAgICAgICAgdDIgPSB2YWx1ZXNbaSArIDJdOworICAgICAgICB0MyA9IHZhbHVlc1tpICsgM107CisgICAgICAgIGJpdENudCArPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDAgKyA0XVt0MSArIDRdKSArCisgICAgICAgICAgICAgICAgICBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDIgKyA0XVt0MyArIDRdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgQ09ERV9CT09LXzRfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLSAgICAgIGlmKHQwICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKKyAgICBjYXNlIENPREVfQk9PS182X05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSB2YWx1ZXNbaSArIDBdOworICAgICAgICB0MSA9IHZhbHVlc1tpICsgMV07CisgICAgICAgIHQyID0gdmFsdWVzW2kgKyAyXTsKKyAgICAgICAgdDMgPSB2YWx1ZXNbaSArIDNdOworICAgICAgICBiaXRDbnQgKz0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiNV82W3QwICsgNF1bdDEgKyA0XSkgKworICAgICAgICAgICAgICAgICAgTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiNV82W3QyICsgNF1bdDMgKyA0XSk7CiAgICAgICB9Ci0gICAgICB0MSA9IHZhbHVlc1tpKzFdOwotICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDE9Zml4cF9hYnModDEpOwotICAgICAgfQotICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKLSAgICAgIGlmKHQyICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHQyPWZpeHBfYWJzKHQyKTsKLSAgICAgIH0KLSAgICAgIHQzID0gdmFsdWVzW2krM107Ci0gICAgICBpZih0MyAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0Mz1maXhwX2Ficyh0Myk7Ci0gICAgICB9Ci0gICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7Ci0gICAgICBiaXRDbnQrPWNvZGVMZW5ndGgrc2lnbkxlbmd0aDsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgICBicmVhazsKIAotICBjYXNlIENPREVfQk9PS181X05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKLSAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDArNF1bdDErNF0pOwotICAgICAgYml0Q250Kz1jb2RlTGVuZ3RoOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIENPREVfQk9PS182X05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKLSAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDArNF1bdDErNF0pOwotICAgICAgYml0Q250Kz1jb2RlTGVuZ3RoOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIENPREVfQk9PS183X05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpewotICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLSAgICAgIGlmKHQwICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKKyAgICBjYXNlIENPREVfQk9PS183X05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDBdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MCA+IDApOworICAgICAgICB0MSA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMV0pOworICAgICAgICBiaXRDbnQgKz0gKHQxID4gMCk7CisgICAgICAgIHQyID0gZml4cF9hYnModmFsdWVzW2kgKyAyXSk7CisgICAgICAgIGJpdENudCArPSAodDIgPiAwKTsKKyAgICAgICAgdDMgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDNdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MyA+IDApOworICAgICAgICBiaXRDbnQgKz0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV0pICsKKyAgICAgICAgICAgICAgICAgIEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0Ml1bdDNdKTsKICAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gICAgICB0MSA9IHZhbHVlc1tpKzFdOwotICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDE9Zml4cF9hYnModDEpOworICAgIGNhc2UgQ09ERV9CT09LXzhfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgICAgICB0MCA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMF0pOworICAgICAgICBiaXRDbnQgKz0gKHQwID4gMCk7CisgICAgICAgIHQxID0gZml4cF9hYnModmFsdWVzW2kgKyAxXSk7CisgICAgICAgIGJpdENudCArPSAodDEgPiAwKTsKKyAgICAgICAgdDIgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDJdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MiA+IDApOworICAgICAgICB0MyA9IGZpeHBfYWJzKHZhbHVlc1tpICsgM10pOworICAgICAgICBiaXRDbnQgKz0gKHQzID4gMCk7CisgICAgICAgIGJpdENudCArPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXSkgKworICAgICAgICAgICAgICAgICAgTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiN184W3QyXVt0M10pOwogICAgICAgfQotICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKLSAgICAgIGJpdENudCs9Y29kZUxlbmd0aCArc2lnbkxlbmd0aDsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgICBicmVhazsKIAotICBjYXNlIENPREVfQk9PS184X05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0MD1maXhwX2Ficyh0MCk7CisgICAgY2FzZSBDT0RFX0JPT0tfOV9OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSA0KSB7CisgICAgICAgIHQwID0gZml4cF9hYnModmFsdWVzW2kgKyAwXSk7CisgICAgICAgIGJpdENudCArPSAodDAgPiAwKTsKKyAgICAgICAgdDEgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDFdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MSA+IDApOworICAgICAgICB0MiA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMl0pOworICAgICAgICBiaXRDbnQgKz0gKHQyID4gMCk7CisgICAgICAgIHQzID0gZml4cF9hYnModmFsdWVzW2kgKyAzXSk7CisgICAgICAgIGJpdENudCArPSAodDMgPiAwKTsKKyAgICAgICAgYml0Q250ICs9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSkgKworICAgICAgICAgICAgICAgICAgSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0Ml1bdDNdKTsKICAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gICAgICB0MSA9IHZhbHVlc1tpKzFdOwotICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDE9Zml4cF9hYnModDEpOworICAgIGNhc2UgQ09ERV9CT09LXzEwX05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDBdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MCA+IDApOworICAgICAgICB0MSA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMV0pOworICAgICAgICBiaXRDbnQgKz0gKHQxID4gMCk7CisgICAgICAgIHQyID0gZml4cF9hYnModmFsdWVzW2kgKyAyXSk7CisgICAgICAgIGJpdENudCArPSAodDIgPiAwKTsKKyAgICAgICAgdDMgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDNdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MyA+IDApOworICAgICAgICBiaXRDbnQgKz0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdKSArCisgICAgICAgICAgICAgICAgICBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QyXVt0M10pOwogICAgICAgfQotICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKLSAgICAgIGJpdENudCs9Y29kZUxlbmd0aCArc2lnbkxlbmd0aDsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgICBicmVhazsKIAotICBjYXNlIENPREVfQk9PS185X05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0MD1maXhwX2Ficyh0MCk7Ci0gICAgICB9Ci0gICAgICB0MSA9IHZhbHVlc1tpKzFdOwotICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDE9Zml4cF9hYnModDEpOwotICAgICAgfQotICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgICBiaXRDbnQrPWNvZGVMZW5ndGggK3NpZ25MZW5ndGg7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQ09ERV9CT09LXzEwX05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0MD1maXhwX2Ficyh0MCk7Ci0gICAgICB9Ci0KLSAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0gICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0MT1maXhwX2Ficyh0MSk7Ci0gICAgICB9Ci0gICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKLSAgICAgIGJpdENudCs9Y29kZUxlbmd0aCArc2lnbkxlbmd0aDsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBDT0RFX0JPT0tfRVNDX05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0MD1maXhwX2Ficyh0MCk7Ci0gICAgICB9Ci0gICAgICB0MSA9IHZhbHVlc1tpKzFdOwotICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDE9Zml4cF9hYnModDEpOwotICAgICAgfQotICAgICAgdDAwID0gZml4TWluKHQwLDE2KTsKLSAgICAgIHQwMSA9IGZpeE1pbih0MSwxNik7Ci0KLSAgICAgIGNvZGVMZW5ndGggPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDAwXVt0MDFdOwotICAgICAgYml0Q250Kz1jb2RlTGVuZ3RoICtzaWduTGVuZ3RoOwotICAgICAgaWYodDAgPj0xNil7Ci0gICAgICAgIElOVCBuLHA7Ci0gICAgICAgIG49MDsKLSAgICAgICAgcD10MDsKLSAgICAgICAgd2hpbGUoKHA+Pj0xKSA+PTE2KXsKLSAgICAgICAgICBiaXRDbnQrKzsKLSAgICAgICAgICBuKys7CisgICAgY2FzZSBDT0RFX0JPT0tfRVNDX05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDIpIHsKKyAgICAgICAgdDAgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDBdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MCA+IDApOworICAgICAgICB0MSA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMV0pOworICAgICAgICBiaXRDbnQgKz0gKHQxID4gMCk7CisgICAgICAgIGJpdENudCArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIxMVtmaXhNaW4odDAsIDE2KV1bZml4TWluKHQxLCAxNildOworICAgICAgICBpZiAodDAgPj0gMTYpIHsKKyAgICAgICAgICBiaXRDbnQgKz0gNTsKKyAgICAgICAgICB3aGlsZSAoKHQwID4+PSAxKSA+PSAxNikgYml0Q250ICs9IDI7CiAgICAgICAgIH0KLSAgICAgICAgYml0Q250Kz0obis1KTsKLSAgICAgIH0KLSAgICAgIGlmKHQxID49MTYpewotICAgICAgICBJTlQgbixwOwotICAgICAgICBuPTA7Ci0gICAgICAgIHA9dDE7Ci0gICAgICAgIHdoaWxlKChwPj49MSkgPj0xNil7Ci0gICAgICAgICAgYml0Q250Kys7Ci0gICAgICAgICAgbisrOworICAgICAgICBpZiAodDEgPj0gMTYpIHsKKyAgICAgICAgICBiaXRDbnQgKz0gNTsKKyAgICAgICAgICB3aGlsZSAoKHQxID4+PSAxKSA+PSAxNikgYml0Q250ICs9IDI7CiAgICAgICAgIH0KLSAgICAgICAgYml0Q250Kz0obis1KTsKICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7CisgICAgICBicmVhazsKIAotICBkZWZhdWx0OgotICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgfQogCi0gIHJldHVybihiaXRDbnQpOworICByZXR1cm4gKGJpdENudCk7CiB9CiAKK0lOVCBGREthYWNFbmNfY29kZVZhbHVlcyhTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLCBJTlQgd2lkdGgsIElOVCBjb2RlQm9vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKSB7CisgIElOVCBpLCB0MCwgdDEsIHQyLCB0MywgdDAwLCB0MDE7CisgIElOVCBjb2RlV29yZCwgY29kZUxlbmd0aDsKKyAgSU5UIHNpZ24sIHNpZ25MZW5ndGg7CiAKKyAgRFdPUkRfQUxJR05FRCh2YWx1ZXMpOwogCi1JTlQgRkRLYWFjRW5jX2NvZGVWYWx1ZXMoU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywgSU5UIHdpZHRoLCBJTlQgY29kZUJvb2ssICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKQoteworICBzd2l0Y2ggKGNvZGVCb29rKSB7CisgICAgY2FzZSBDT0RFX0JPT0tfWkVST19OTzoKKyAgICAgIGJyZWFrOwogCi0gIElOVCBpLHQwLHQxLHQyLHQzLHQwMCx0MDE7Ci0gIElOVCBjb2RlV29yZCxjb2RlTGVuZ3RoOwotICBJTlQgc2lnbixzaWduTGVuZ3RoOworICAgIGNhc2UgQ09ERV9CT09LXzFfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgICAgICB0MCA9IHZhbHVlc1tpICsgMF0gKyAxOworICAgICAgICB0MSA9IHZhbHVlc1tpICsgMV0gKyAxOworICAgICAgICB0MiA9IHZhbHVlc1tpICsgMl0gKyAxOworICAgICAgICB0MyA9IHZhbHVlc1tpICsgM10gKyAxOworICAgICAgICBjb2RlV29yZCA9IEZES2FhY0VuY19odWZmX2N0YWIxW3QwXVt0MV1bdDJdW3QzXTsKKyAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlt0MF1bdDFdW3QyXVt0M10pOworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwgY29kZVdvcmQsIGNvZGVMZW5ndGgpOworICAgICAgfQorICAgICAgYnJlYWs7CiAKLSAgc3dpdGNoKGNvZGVCb29rKXsKLSAgY2FzZSBDT0RFX0JPT0tfWkVST19OTzoKLSAgICBicmVhazsKKyAgICBjYXNlIENPREVfQk9PS18yX05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSB2YWx1ZXNbaSArIDBdICsgMTsKKyAgICAgICAgdDEgPSB2YWx1ZXNbaSArIDFdICsgMTsKKyAgICAgICAgdDIgPSB2YWx1ZXNbaSArIDJdICsgMTsKKyAgICAgICAgdDMgPSB2YWx1ZXNbaSArIDNdICsgMTsKKyAgICAgICAgY29kZVdvcmQgPSBGREthYWNFbmNfaHVmZl9jdGFiMlt0MF1bdDFdW3QyXVt0M107CisgICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWIxXzJbdDBdW3QxXVt0Ml1bdDNdKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIGNvZGVXb3JkLCBjb2RlTGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgQ09ERV9CT09LXzFfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdKzE7Ci0gICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV0rMTsKLSAgICAgIHQyICAgICAgICAgPSB2YWx1ZXNbaSsyXSsxOwotICAgICAgdDMgICAgICAgICA9IHZhbHVlc1tpKzNdKzE7Ci0gICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjFbdDBdW3QxXVt0Ml1bdDNdOwotICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlt0MF1bdDFdW3QyXVt0M10pOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgfQotICAgIGJyZWFrOworICAgIGNhc2UgQ09ERV9CT09LXzNfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKHdpZHRoID4+IDIpOyBpKyspIHsKKyAgICAgICAgc2lnbiA9IDA7CisgICAgICAgIHNpZ25MZW5ndGggPSAwOworICAgICAgICBpbnQgaW5kZXhbNF07CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgaW50IHRpID0gKnZhbHVlcysrOworICAgICAgICAgIGludCB6ZXJvID0gKHRpID09IDApID8gMCA6IDE7CisgICAgICAgICAgc2lnbkxlbmd0aCArPSB6ZXJvOworICAgICAgICAgIHNpZ24gPSAoc2lnbiA8PCB6ZXJvKSArICgoVUlOVCl0aSA+PiAzMSk7CisgICAgICAgICAgaW5kZXhbal0gPSBmaXhwX2Ficyh0aSk7CisgICAgICAgIH0KKyAgICAgICAgY29kZVdvcmQgPSBGREthYWNFbmNfaHVmZl9jdGFiM1tpbmRleFswXV1baW5kZXhbMV1dW2luZGV4WzJdXVtpbmRleFszXV07CisgICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKAorICAgICAgICAgICAgRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFtpbmRleFswXV1baW5kZXhbMV1dW2luZGV4WzJdXVtpbmRleFszXV0pOworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwgKGNvZGVXb3JkIDw8IHNpZ25MZW5ndGgpIHwgc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvZGVMZW5ndGggKyBzaWduTGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgQ09ERV9CT09LXzJfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdKzE7Ci0gICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV0rMTsKLSAgICAgIHQyICAgICAgICAgPSB2YWx1ZXNbaSsyXSsxOwotICAgICAgdDMgICAgICAgICA9IHZhbHVlc1tpKzNdKzE7Ci0gICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjJbdDBdW3QxXVt0Ml1bdDNdOwotICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlt0MF1bdDFdW3QyXVt0M10pOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgfQotICAgIGJyZWFrOworICAgIGNhc2UgQ09ERV9CT09LXzRfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgICAgICBzaWduID0gMDsKKyAgICAgICAgc2lnbkxlbmd0aCA9IDA7CisgICAgICAgIGludCBpbmRleFs0XTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICBpbnQgdGkgPSAqdmFsdWVzKys7CisgICAgICAgICAgaW50IHplcm8gPSAodGkgPT0gMCkgPyAwIDogMTsKKyAgICAgICAgICBzaWduTGVuZ3RoICs9IHplcm87CisgICAgICAgICAgc2lnbiA9IChzaWduIDw8IHplcm8pICsgKChVSU5UKXRpID4+IDMxKTsKKyAgICAgICAgICBpbmRleFtqXSA9IGZpeHBfYWJzKHRpKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlV29yZCA9IEZES2FhY0VuY19odWZmX2N0YWI0W2luZGV4WzBdXVtpbmRleFsxXV1baW5kZXhbMl1dW2luZGV4WzNdXTsKKyAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoCisgICAgICAgICAgICBGREthYWNFbmNfaHVmZl9sdGFiM180W2luZGV4WzBdXVtpbmRleFsxXV1baW5kZXhbMl1dW2luZGV4WzNdXSk7CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCAoY29kZVdvcmQgPDwgc2lnbkxlbmd0aCkgfCBzaWduLAorICAgICAgICAgICAgICAgICAgICAgY29kZUxlbmd0aCArIHNpZ25MZW5ndGgpOworICAgICAgfQorICAgICAgYnJlYWs7CiAKLSAgY2FzZSBDT0RFX0JPT0tfM19OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7Ci0gICAgICBzaWduPTA7Ci0gICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgc2lnbjw8PTE7Ci0gICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICB0MD1maXhwX2Ficyh0MCk7CisgICAgY2FzZSBDT0RFX0JPT0tfNV9OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAod2lkdGggPj4gMik7IGkrKykgeworICAgICAgICB0MCA9ICp2YWx1ZXMrKyArIDQ7CisgICAgICAgIHQxID0gKnZhbHVlcysrICsgNDsKKyAgICAgICAgdDIgPSAqdmFsdWVzKysgKyA0OworICAgICAgICB0MyA9ICp2YWx1ZXMrKyArIDQ7CisgICAgICAgIGNvZGVXb3JkID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjVbdDBdW3QxXTsKKyAgICAgICAgY29kZUxlbmd0aCA9CisgICAgICAgICAgICBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDJdW3QzXSk7IC8qIGxlbmd0aCBvZiAybmQgY3cgKi8KKyAgICAgICAgY29kZVdvcmQgPSAoY29kZVdvcmQgPDwgY29kZUxlbmd0aCkgKyBGREthYWNFbmNfaHVmZl9jdGFiNVt0Ml1bdDNdOworICAgICAgICBjb2RlTGVuZ3RoICs9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MF1bdDFdKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIGNvZGVXb3JkLCBjb2RlTGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDT0RFX0JPT0tfNl9OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAod2lkdGggPj4gMik7IGkrKykgeworICAgICAgICB0MCA9ICp2YWx1ZXMrKyArIDQ7CisgICAgICAgIHQxID0gKnZhbHVlcysrICsgNDsKKyAgICAgICAgdDIgPSAqdmFsdWVzKysgKyA0OworICAgICAgICB0MyA9ICp2YWx1ZXMrKyArIDQ7CisgICAgICAgIGNvZGVXb3JkID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjZbdDBdW3QxXTsKKyAgICAgICAgY29kZUxlbmd0aCA9CisgICAgICAgICAgICBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDJdW3QzXSk7IC8qIGxlbmd0aCBvZiAybmQgY3cgKi8KKyAgICAgICAgY29kZVdvcmQgPSAoY29kZVdvcmQgPDwgY29kZUxlbmd0aCkgKyBGREthYWNFbmNfaHVmZl9jdGFiNlt0Ml1bdDNdOworICAgICAgICBjb2RlTGVuZ3RoICs9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MF1bdDFdKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIGNvZGVXb3JkLCBjb2RlTGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDT0RFX0JPT0tfN19OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAod2lkdGggPj4gMSk7IGkrKykgeworICAgICAgICB0MCA9ICp2YWx1ZXMrKzsKKyAgICAgICAgc2lnbiA9ICgoVUlOVCl0MCA+PiAzMSk7CisgICAgICAgIHQwID0gZml4cF9hYnModDApOworICAgICAgICBzaWduTGVuZ3RoID0gKHQwID09IDApID8gMCA6IDE7CisgICAgICAgIHQxID0gKnZhbHVlcysrOworICAgICAgICBJTlQgemVybyA9ICh0MSA9PSAwKSA/IDAgOiAxOworICAgICAgICBzaWduTGVuZ3RoICs9IHplcm87CisgICAgICAgIHNpZ24gPSAoc2lnbiA8PCB6ZXJvKSArICgoVUlOVCl0MSA+PiAzMSk7CisgICAgICAgIHQxID0gZml4cF9hYnModDEpOworICAgICAgICBjb2RlV29yZCA9IEZES2FhY0VuY19odWZmX2N0YWI3W3QwXVt0MV07CisgICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXSk7CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCAoY29kZVdvcmQgPDwgc2lnbkxlbmd0aCkgfCBzaWduLAorICAgICAgICAgICAgICAgICAgICAgY29kZUxlbmd0aCArIHNpZ25MZW5ndGgpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENPREVfQk9PS184X05POgorICAgICAgZm9yIChpID0gMDsgaSA8ICh3aWR0aCA+PiAxKTsgaSsrKSB7CisgICAgICAgIHQwID0gKnZhbHVlcysrOworICAgICAgICBzaWduID0gKChVSU5UKXQwID4+IDMxKTsKKyAgICAgICAgdDAgPSBmaXhwX2Ficyh0MCk7CisgICAgICAgIHNpZ25MZW5ndGggPSAodDAgPT0gMCkgPyAwIDogMTsKKyAgICAgICAgdDEgPSAqdmFsdWVzKys7CisgICAgICAgIElOVCB6ZXJvID0gKHQxID09IDApID8gMCA6IDE7CisgICAgICAgIHNpZ25MZW5ndGggKz0gemVybzsKKyAgICAgICAgc2lnbiA9IChzaWduIDw8IHplcm8pICsgKChVSU5UKXQxID4+IDMxKTsKKyAgICAgICAgdDEgPSBmaXhwX2Ficyh0MSk7CisgICAgICAgIGNvZGVXb3JkID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjhbdDBdW3QxXTsKKyAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIChjb2RlV29yZCA8PCBzaWduTGVuZ3RoKSB8IHNpZ24sCisgICAgICAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoICsgc2lnbkxlbmd0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ09ERV9CT09LXzlfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKHdpZHRoID4+IDEpOyBpKyspIHsKKyAgICAgICAgdDAgPSAqdmFsdWVzKys7CisgICAgICAgIHNpZ24gPSAoKFVJTlQpdDAgPj4gMzEpOworICAgICAgICB0MCA9IGZpeHBfYWJzKHQwKTsKKyAgICAgICAgc2lnbkxlbmd0aCA9ICh0MCA9PSAwKSA/IDAgOiAxOworICAgICAgICB0MSA9ICp2YWx1ZXMrKzsKKyAgICAgICAgSU5UIHplcm8gPSAodDEgPT0gMCkgPyAwIDogMTsKKyAgICAgICAgc2lnbkxlbmd0aCArPSB6ZXJvOworICAgICAgICBzaWduID0gKHNpZ24gPDwgemVybykgKyAoKFVJTlQpdDEgPj4gMzEpOworICAgICAgICB0MSA9IGZpeHBfYWJzKHQxKTsKKyAgICAgICAgY29kZVdvcmQgPSBGREthYWNFbmNfaHVmZl9jdGFiOVt0MF1bdDFdOworICAgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIChjb2RlV29yZCA8PCBzaWduTGVuZ3RoKSB8IHNpZ24sCisgICAgICAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoICsgc2lnbkxlbmd0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ09ERV9CT09LXzEwX05POgorICAgICAgZm9yIChpID0gMDsgaSA8ICh3aWR0aCA+PiAxKTsgaSsrKSB7CisgICAgICAgIHQwID0gKnZhbHVlcysrOworICAgICAgICBzaWduID0gKChVSU5UKXQwID4+IDMxKTsKKyAgICAgICAgdDAgPSBmaXhwX2Ficyh0MCk7CisgICAgICAgIHNpZ25MZW5ndGggPSAodDAgPT0gMCkgPyAwIDogMTsKKyAgICAgICAgdDEgPSAqdmFsdWVzKys7CisgICAgICAgIElOVCB6ZXJvID0gKHQxID09IDApID8gMCA6IDE7CisgICAgICAgIHNpZ25MZW5ndGggKz0gemVybzsKKyAgICAgICAgc2lnbiA9IChzaWduIDw8IHplcm8pICsgKChVSU5UKXQxID4+IDMxKTsKKyAgICAgICAgdDEgPSBmaXhwX2Ficyh0MSk7CisgICAgICAgIGNvZGVXb3JkID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjEwW3QwXVt0MV07CisgICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV0pOworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwgKGNvZGVXb3JkIDw8IHNpZ25MZW5ndGgpIHwgc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvZGVMZW5ndGggKyBzaWduTGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDT0RFX0JPT0tfRVNDX05POgorICAgICAgZm9yIChpID0gMDsgaSA8ICh3aWR0aCA+PiAxKTsgaSsrKSB7CisgICAgICAgIHQwID0gKnZhbHVlcysrOworICAgICAgICBzaWduID0gKChVSU5UKXQwID4+IDMxKTsKKyAgICAgICAgdDAgPSBmaXhwX2Ficyh0MCk7CisgICAgICAgIHNpZ25MZW5ndGggPSAodDAgPT0gMCkgPyAwIDogMTsKKyAgICAgICAgdDEgPSAqdmFsdWVzKys7CisgICAgICAgIElOVCB6ZXJvID0gKHQxID09IDApID8gMCA6IDE7CisgICAgICAgIHNpZ25MZW5ndGggKz0gemVybzsKKyAgICAgICAgc2lnbiA9IChzaWduIDw8IHplcm8pICsgKChVSU5UKXQxID4+IDMxKTsKKyAgICAgICAgdDEgPSBmaXhwX2Ficyh0MSk7CisKKyAgICAgICAgdDAwID0gZml4TWluKHQwLCAxNik7CisgICAgICAgIHQwMSA9IGZpeE1pbih0MSwgMTYpOworCisgICAgICAgIGNvZGVXb3JkID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjExW3QwMF1bdDAxXTsKKyAgICAgICAgY29kZUxlbmd0aCA9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwMF1bdDAxXTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIChjb2RlV29yZCA8PCBzaWduTGVuZ3RoKSB8IHNpZ24sCisgICAgICAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoICsgc2lnbkxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgaWYgKHQwID49IDE2KSB7CisgICAgICAgICAgICBJTlQgbiA9IDQsIHAgPSB0MDsKKyAgICAgICAgICAgIGZvciAoOyAocCA+Pj0gMSkgPj0gMTY7KSBuKys7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCgxIDw8IChuIC0gMykpIC0gMikgPDwgbikgfCAodDAgLSAoMSA8PCBuKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbiArIG4gLSAzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdDAgPSB0MTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDE9Zml4cF9hYnModDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0MiA9IHZhbHVlc1tpKzJdOwotICAgICAgaWYodDIgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgc2lnbjw8PTE7Ci0gICAgICAgIGlmKHQyIDwgMCl7Ci0gICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICB0Mj1maXhwX2Ficyh0Mik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHQzID0gdmFsdWVzW2krM107Ci0gICAgICBpZih0MyAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDMgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQzPWZpeHBfYWJzKHQzKTsKLSAgICAgICAgfQotICAgICAgfQorICAgICAgYnJlYWs7CiAKLSAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiM1t0MF1bdDFdW3QyXVt0M107Ci0gICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQ09ERV9CT09LXzRfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgc2lnbj0wOwotICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLSAgICAgIGlmKHQwICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDA9Zml4cF9hYnModDApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0MSA9IHZhbHVlc1tpKzFdOwotICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgc2lnbjw8PTE7Ci0gICAgICAgIGlmKHQxIDwgMCl7Ci0gICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICB0MT1maXhwX2Ficyh0MSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHQyID0gdmFsdWVzW2krMl07Ci0gICAgICBpZih0MiAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDIgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQyPWZpeHBfYWJzKHQyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdDMgPSB2YWx1ZXNbaSszXTsKLSAgICAgIGlmKHQzICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MyA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDM9Zml4cF9hYnModDMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjRbdDBdW3QxXVt0Ml1bdDNdOwotICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIENPREVfQk9PS181X05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXSs0OwotICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdKzQ7Ci0gICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjVbdDBdW3QxXTsKLSAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDBdW3QxXSk7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBDT0RFX0JPT0tfNl9OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF0rNDsKLSAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXSs0OwotICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWI2W3QwXVt0MV07Ci0gICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiNV82W3QwXVt0MV0pOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQ09ERV9CT09LXzdfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9Mil7Ci0gICAgICBzaWduPTA7Ci0gICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgc2lnbjw8PTE7Ci0gICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICB0MD1maXhwX2Ficyh0MCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDE9Zml4cF9hYnModDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjdbdDBdW3QxXTsKLSAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXSk7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQ09ERV9CT09LXzhfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgc2lnbj0wOwotICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLSAgICAgIGlmKHQwICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDA9Zml4cF9hYnModDApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0gICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWI4W3QwXVt0MV07Ci0gICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV0pOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIENPREVfQk9PS185X05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgIHNpZ249MDsKLSAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDE9Zml4cF9hYnModDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjlbdDBdW3QxXTsKLSAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV0pOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIENPREVfQk9PS18xMF9OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICBzaWduPTA7Ci0gICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgc2lnbjw8PTE7Ci0gICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICB0MD1maXhwX2Ficyh0MCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDE9Zml4cF9hYnModDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjEwW3QwXVt0MV07Ci0gICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBDT0RFX0JPT0tfRVNDX05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgIHNpZ249MDsKLSAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDE9Zml4cF9hYnModDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0MDAgPSBmaXhNaW4odDAsMTYpOwotICAgICAgdDAxID0gZml4TWluKHQxLDE2KTsKLQotICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWIxMVt0MDBdW3QwMV07Ci0gICAgICBjb2RlTGVuZ3RoID0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwMF1bdDAxXTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLSAgICAgIGlmKHQwID49MTYpewotICAgICAgICBJTlQgbixwOwotICAgICAgICBuPTA7Ci0gICAgICAgIHA9dDA7Ci0gICAgICAgIHdoaWxlKChwPj49MSkgPj0xNil7Ci0gICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sMSwxKTsKLSAgICAgICAgICBuKys7Ci0gICAgICAgIH0KLSAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sMCwxKTsKLSAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sdDAtKDE8PChuKzQpKSxuKzQpOwotICAgICAgfQotICAgICAgaWYodDEgPj0xNil7Ci0gICAgICAgIElOVCBuLHA7Ci0gICAgICAgIG49MDsKLSAgICAgICAgcD10MTsKLSAgICAgICAgd2hpbGUoKHA+Pj0xKSA+PTE2KXsKLSAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwxLDEpOwotICAgICAgICAgIG4rKzsKLSAgICAgICAgfQotICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwwLDEpOwotICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSx0MS0oMTw8KG4rNCkpLG4rNCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOwogICB9Ci0gIHJldHVybigwKTsKKyAgcmV0dXJuICgwKTsKIH0KIAotSU5UIEZES2FhY0VuY19jb2RlU2NhbGVmYWN0b3JEZWx0YShJTlQgZGVsdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pCi17Ci0gIElOVCBjb2RlV29yZCxjb2RlTGVuZ3RoOworSU5UIEZES2FhY0VuY19jb2RlU2NhbGVmYWN0b3JEZWx0YShJTlQgZGVsdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pIHsKKyAgSU5UIGNvZGVXb3JkLCBjb2RlTGVuZ3RoOwogCi0gIGlmKGZpeHBfYWJzKGRlbHRhKSA+Q09ERV9CT09LX1NDRl9MQVYpCi0gICAgcmV0dXJuKDEpOworICBpZiAoZml4cF9hYnMoZGVsdGEpID4gQ09ERV9CT09LX1NDRl9MQVYpIHJldHVybiAoMSk7CiAKLSAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWJzY2ZbZGVsdGErQ09ERV9CT09LX1NDRl9MQVZdOwotICBjb2RlTGVuZ3RoID0gKElOVClGREthYWNFbmNfaHVmZl9sdGFic2NmW2RlbHRhK0NPREVfQk9PS19TQ0ZfTEFWXTsKLSAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gIHJldHVybigwKTsKKyAgY29kZVdvcmQgPSBGREthYWNFbmNfaHVmZl9jdGFic2NmW2RlbHRhICsgQ09ERV9CT09LX1NDRl9MQVZdOworICBjb2RlTGVuZ3RoID0gKElOVClGREthYWNFbmNfaHVmZl9sdGFic2NmW2RlbHRhICsgQ09ERV9CT09LX1NDRl9MQVZdOworICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwgY29kZVdvcmQsIGNvZGVMZW5ndGgpOworICByZXR1cm4gKDApOwogfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9iaXRfY250LmggYi9saWJBQUNlbmMvc3JjL2JpdF9jbnQuaAppbmRleCA3YzRiNTllLi43ZjRjNDUwIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2JpdF9jbnQuaAorKysgYi9saWJBQUNlbmMvc3JjL2JpdF9jbnQuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0NiArOTAsNDYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBIdWZmbWFuIEJpdGNvdW50ZXIgJiBjb2RlcgorICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBIdWZmbWFuIEJpdGNvdW50ZXIgJiBjb2RlcgogCi0jaWZuZGVmIF9fQklUQ09VTlRfSAotI2RlZmluZSBfX0JJVENPVU5UX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgQklUX0NOVF9ICisjZGVmaW5lIEJJVF9DTlRfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKICNpbmNsdWRlICJhYWNFbmNfcm9tLmgiCiAKLSNkZWZpbmUgSU5WQUxJRF9CSVRDT1VOVCAoRkRLX0lOVF9NQVgvNCkKKyNkZWZpbmUgSU5WQUxJRF9CSVRDT1VOVCAoRkRLX0lOVF9NQVggLyA0KQogCiAvKgogICBjb2RlIGJvb2sgbnVtYmVyIHRhYmxlCiAqLwogCi1lbnVtIGNvZGVCb29rTm97Ci0gQ09ERV9CT09LX1pFUk9fTk89ICAgICAgICAgICAgICAgMCwKLSBDT0RFX0JPT0tfMV9OTz0gICAgICAgICAgICAgICAgICAxLAotIENPREVfQk9PS18yX05PPSAgICAgICAgICAgICAgICAgIDIsCi0gQ09ERV9CT09LXzNfTk89ICAgICAgICAgICAgICAgICAgMywKLSBDT0RFX0JPT0tfNF9OTz0gICAgICAgICAgICAgICAgICA0LAotIENPREVfQk9PS181X05PPSAgICAgICAgICAgICAgICAgIDUsCi0gQ09ERV9CT09LXzZfTk89ICAgICAgICAgICAgICAgICAgNiwKLSBDT0RFX0JPT0tfN19OTz0gICAgICAgICAgICAgICAgICA3LAotIENPREVfQk9PS184X05PPSAgICAgICAgICAgICAgICAgIDgsCi0gQ09ERV9CT09LXzlfTk89ICAgICAgICAgICAgICAgICAgOSwKLSBDT0RFX0JPT0tfMTBfTk89ICAgICAgICAgICAgICAgIDEwLAotIENPREVfQk9PS19FU0NfTk89ICAgICAgICAgICAgICAgMTEsCi0gQ09ERV9CT09LX1JFU19OTz0gICAgICAgICAgICAgICAxMiwKLSBDT0RFX0JPT0tfUE5TX05PPSAgICAgICAgICAgICAgIDEzLAotIENPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTk89ICAgMTQsCi0gQ09ERV9CT09LX0lTX0lOX1BIQVNFX05PPSAgICAgICAxNQorZW51bSBjb2RlQm9va05vIHsKKyAgQ09ERV9CT09LX1pFUk9fTk8gPSAwLAorICBDT0RFX0JPT0tfMV9OTyA9IDEsCisgIENPREVfQk9PS18yX05PID0gMiwKKyAgQ09ERV9CT09LXzNfTk8gPSAzLAorICBDT0RFX0JPT0tfNF9OTyA9IDQsCisgIENPREVfQk9PS181X05PID0gNSwKKyAgQ09ERV9CT09LXzZfTk8gPSA2LAorICBDT0RFX0JPT0tfN19OTyA9IDcsCisgIENPREVfQk9PS184X05PID0gOCwKKyAgQ09ERV9CT09LXzlfTk8gPSA5LAorICBDT0RFX0JPT0tfMTBfTk8gPSAxMCwKKyAgQ09ERV9CT09LX0VTQ19OTyA9IDExLAorICBDT0RFX0JPT0tfUkVTX05PID0gMTIsCisgIENPREVfQk9PS19QTlNfTk8gPSAxMywKKyAgQ09ERV9CT09LX0lTX09VVF9PRl9QSEFTRV9OTyA9IDE0LAorICBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk8gPSAxNQogCiB9OwogCkBAIC0xMjYsNjIgKzEzNyw2NCBAQAogICBjb2RlIGJvb2sgaW5kZXggdGFibGUKICovCiAKLWVudW0gY29kZUJvb2tOZHh7Ci0gQ09ERV9CT09LX1pFUk9fTkRYLAotIENPREVfQk9PS18xX05EWCwKLSBDT0RFX0JPT0tfMl9ORFgsCi0gQ09ERV9CT09LXzNfTkRYLAotIENPREVfQk9PS180X05EWCwKLSBDT0RFX0JPT0tfNV9ORFgsCi0gQ09ERV9CT09LXzZfTkRYLAotIENPREVfQk9PS183X05EWCwKLSBDT0RFX0JPT0tfOF9ORFgsCi0gQ09ERV9CT09LXzlfTkRYLAotIENPREVfQk9PS18xMF9ORFgsCi0gQ09ERV9CT09LX0VTQ19ORFgsCi0gQ09ERV9CT09LX1JFU19ORFgsCi0gQ09ERV9CT09LX1BOU19ORFgsCi0gQ09ERV9CT09LX0lTX09VVF9PRl9QSEFTRV9ORFgsCi0gQ09ERV9CT09LX0lTX0lOX1BIQVNFX05EWCwKLSBOVU1CRVJfT0ZfQ09ERV9CT09LUworZW51bSBjb2RlQm9va05keCB7CisgIENPREVfQk9PS19aRVJPX05EWCwKKyAgQ09ERV9CT09LXzFfTkRYLAorICBDT0RFX0JPT0tfMl9ORFgsCisgIENPREVfQk9PS18zX05EWCwKKyAgQ09ERV9CT09LXzRfTkRYLAorICBDT0RFX0JPT0tfNV9ORFgsCisgIENPREVfQk9PS182X05EWCwKKyAgQ09ERV9CT09LXzdfTkRYLAorICBDT0RFX0JPT0tfOF9ORFgsCisgIENPREVfQk9PS185X05EWCwKKyAgQ09ERV9CT09LXzEwX05EWCwKKyAgQ09ERV9CT09LX0VTQ19ORFgsCisgIENPREVfQk9PS19SRVNfTkRYLAorICBDT0RFX0JPT0tfUE5TX05EWCwKKyAgQ09ERV9CT09LX0lTX09VVF9PRl9QSEFTRV9ORFgsCisgIENPREVfQk9PS19JU19JTl9QSEFTRV9ORFgsCisgIE5VTUJFUl9PRl9DT0RFX0JPT0tTCiB9OwogCiAvKgogICBjb2RlIGJvb2sgbGF2IHRhYmxlCiAqLwogCi1lbnVtIGNvZGVCb29rTGF2ewotIENPREVfQk9PS19aRVJPX0xBVj0wLAotIENPREVfQk9PS18xX0xBVj0xLAotIENPREVfQk9PS18yX0xBVj0xLAotIENPREVfQk9PS18zX0xBVj0yLAotIENPREVfQk9PS180X0xBVj0yLAotIENPREVfQk9PS181X0xBVj00LAotIENPREVfQk9PS182X0xBVj00LAotIENPREVfQk9PS183X0xBVj03LAotIENPREVfQk9PS184X0xBVj03LAotIENPREVfQk9PS185X0xBVj0xMiwKLSBDT0RFX0JPT0tfMTBfTEFWPTEyLAotIENPREVfQk9PS19FU0NfTEFWPTE2LAotIENPREVfQk9PS19TQ0ZfTEFWPTYwLAotIENPREVfQk9PS19QTlNfTEFWPTYwCi0gfTsKK2VudW0gY29kZUJvb2tMYXYgeworICBDT0RFX0JPT0tfWkVST19MQVYgPSAwLAorICBDT0RFX0JPT0tfMV9MQVYgPSAxLAorICBDT0RFX0JPT0tfMl9MQVYgPSAxLAorICBDT0RFX0JPT0tfM19MQVYgPSAyLAorICBDT0RFX0JPT0tfNF9MQVYgPSAyLAorICBDT0RFX0JPT0tfNV9MQVYgPSA0LAorICBDT0RFX0JPT0tfNl9MQVYgPSA0LAorICBDT0RFX0JPT0tfN19MQVYgPSA3LAorICBDT0RFX0JPT0tfOF9MQVYgPSA3LAorICBDT0RFX0JPT0tfOV9MQVYgPSAxMiwKKyAgQ09ERV9CT09LXzEwX0xBViA9IDEyLAorICBDT0RFX0JPT0tfRVNDX0xBViA9IDE2LAorICBDT0RFX0JPT0tfU0NGX0xBViA9IDYwLAorICBDT0RFX0JPT0tfUE5TX0xBViA9IDYwCit9OwogCi1JTlQgICAgRkRLYWFjRW5jX2JpdENvdW50KGNvbnN0IFNIT1JUICphUXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbm9PZlNwZWNMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbWF4VmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICpiaXRDb3VudEx1dCk7CitJTlQgRkRLYWFjRW5jX2JpdENvdW50KGNvbnN0IFNIT1JUICphUXVhbnRTcGVjdHJ1bSwgY29uc3QgSU5UIG5vT2ZTcGVjTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCBtYXhWYWwsIElOVCAqYml0Q291bnRMdXQpOwogCi1JTlQgICAgRkRLYWFjRW5jX2NvdW50VmFsdWVzKFNIT1JUICp2YWx1ZXMsIElOVCB3aWR0aCwgSU5UIGNvZGVCb29rKTsKK0lOVCBGREthYWNFbmNfY291bnRWYWx1ZXMoU0hPUlQgKnZhbHVlcywgSU5UIHdpZHRoLCBJTlQgY29kZUJvb2spOwogCi1JTlQgICAgRkRLYWFjRW5jX2NvZGVWYWx1ZXMoU0hPUlQgKnZhbHVlcywgSU5UIHdpZHRoLCBJTlQgY29kZUJvb2ssIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pOworSU5UIEZES2FhY0VuY19jb2RlVmFsdWVzKFNIT1JUICp2YWx1ZXMsIElOVCB3aWR0aCwgSU5UIGNvZGVCb29rLAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pOwogCi1JTlQgICAgRkRLYWFjRW5jX2NvZGVTY2FsZWZhY3RvckRlbHRhKElOVCBzY2FsZWZhY3RvciwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSk7CitJTlQgRkRLYWFjRW5jX2NvZGVTY2FsZWZhY3RvckRlbHRhKElOVCBzY2FsZWZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSk7CiAKLWlubGluZSBJTlQgRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShjb25zdCBJTlQgZGVsdGEpCi17Ci0gIEZES19BU1NFUlQoICgwIDw9IChkZWx0YStDT0RFX0JPT0tfU0NGX0xBVikpICYmICAoKGRlbHRhK0NPREVfQk9PS19TQ0ZfTEFWKTwoaW50KShzaXplb2YoRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZikvc2l6ZW9mKChGREthYWNFbmNfaHVmZl9sdGFic2NmWzBdKSkpKSApOwotICByZXR1cm4oKElOVClGREthYWNFbmNfaHVmZl9sdGFic2NmW2RlbHRhK0NPREVfQk9PS19TQ0ZfTEFWXSk7CitpbmxpbmUgSU5UIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoY29uc3QgSU5UIGRlbHRhKSB7CisgIEZES19BU1NFUlQoKDAgPD0gKGRlbHRhICsgQ09ERV9CT09LX1NDRl9MQVYpKSAmJgorICAgICAgICAgICAgICgoZGVsdGEgKyBDT0RFX0JPT0tfU0NGX0xBVikgPAorICAgICAgICAgICAgICAoaW50KShzaXplb2YoRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZikgLworICAgICAgICAgICAgICAgICAgICBzaXplb2YoKEZES2FhY0VuY19odWZmX2x0YWJzY2ZbMF0pKSkpKTsKKyAgcmV0dXJuICgoSU5UKUZES2FhY0VuY19odWZmX2x0YWJzY2ZbZGVsdGEgKyBDT0RFX0JPT0tfU0NGX0xBVl0pOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYml0ZW5jLmNwcCBiL2xpYkFBQ2VuYy9zcmMvYml0ZW5jLmNwcAppbmRleCA4ZTQ3N2FhLi42NTJkMWZkIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2JpdGVuYy5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9iaXRlbmMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogQml0c3RyZWFtIGVuY29kZXIKKyAgIEF1dGhvcihzKTogICBNLiBXZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IEJpdHN0cmVhbSBlbmNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJiaXRlbmMuaCIKICNpbmNsdWRlICJiaXRfY250LmgiCkBAIC05NSwxNCArMTA3LDEzIEBACiAjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgogCi0KICNpbmNsdWRlICJ0cGVuY19saWIuaCIKIAotI2luY2x1ZGUgIkZES190b29sc19yb20uaCIgIC8qIG5lZWRlZCBmb3IgdGhlIGJpdHN0cmVhbSBzeW50YXggdGFibGVzICovCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIiAvKiBuZWVkZWQgZm9yIHRoZSBiaXRzdHJlYW0gc3ludGF4IHRhYmxlcyAqLwogCiBzdGF0aWMgY29uc3QgaW50IGdsb2JhbEdhaW5PZmZzZXQgPSAxMDA7Ci1zdGF0aWMgY29uc3QgaW50IGljc1Jlc2VydmVkQml0ICAgPSAwOwotc3RhdGljIGNvbnN0IGludCBub2lzZU9mZnNldCAgICAgID0gOTA7CitzdGF0aWMgY29uc3QgaW50IGljc1Jlc2VydmVkQml0ID0gMDsKK3N0YXRpYyBjb25zdCBpbnQgbm9pc2VPZmZzZXQgPSA5MDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKQEAgLTExMywzMCArMTI0LDI2IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZVNwZWN0cmFsRGF0YShJTlQgICAgICAgICAgICAgICAgICAgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBICAgICAgICAgICAqc2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgICAgICAgICAgICAgICAgICAqcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBoQml0U3RyZWFtKQotewotICBJTlQgaSxzZmI7CitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVTcGVjdHJhbERhdGEoSU5UICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBICpzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKSB7CisgIElOVCBpLCBzZmI7CiAgIElOVCBkYmdWYWwgPSBGREtnZXRWYWxpZEJpdHMoaEJpdFN0cmVhbSk7CiAKLSAgZm9yKGk9MDtpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7aSsrKQotICB7Ci0gICAgaWYoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rICE9IENPREVfQk9PS19QTlNfTk8pCi0gICAgeworICBmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsgaSsrKSB7CisgICAgaWYgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKSB7CiAgICAgICAvKiBodWZmZW5jb2RlIHNwZWN0cmFsIGRhdGEgZm9yIHRoaXMgaHVmZnNlY3Rpb24gKi8KLSAgICAgIElOVCB0bXAgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQrc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKLSAgICAgIGZvcihzZmI9c2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0OyBzZmI8dG1wOyBzZmIrKykKLSAgICAgIHsKLSAgICAgICAgRkRLYWFjRW5jX2NvZGVWYWx1ZXMocXVhbnRTcGVjdHJ1bStzZmJPZmZzZXRbc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0W3NmYisxXS1zZmJPZmZzZXRbc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKKyAgICAgIElOVCB0bXAgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQgKworICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7CisgICAgICBmb3IgKHNmYiA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydDsgc2ZiIDwgdG1wOyBzZmIrKykgeworICAgICAgICBGREthYWNFbmNfY29kZVZhbHVlcyhxdWFudFNwZWN0cnVtICsgc2ZiT2Zmc2V0W3NmYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFtzZmIgKyAxXSAtIHNmYk9mZnNldFtzZmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2ssIGhCaXRTdHJlYW0pOwogICAgICAgfQogICAgIH0KICAgfQotICByZXR1cm4oRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7CisgIHJldHVybiAoRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pIC0gZGJnVmFsKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDgsMTggKzE1NSwxOCBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVHbG9iYWxHYWluKElOVCBnbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWMsCitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVHbG9iYWxHYWluKElOVCBnbG9iYWxHYWluLCBJTlQgc2NhbGVmYWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtZGN0U2NhbGUpCi17CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtZGN0U2NhbGUpIHsKICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewotICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLGdsb2JhbEdhaW4gLSBzY2FsZWZhYyArIGdsb2JhbEdhaW5PZmZzZXQtNCooTE9HX05PUk1fUENNLW1kY3RTY2FsZSksOCk7CisgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgIGdsb2JhbEdhaW4gLSBzY2FsZWZhYyArIGdsb2JhbEdhaW5PZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgNCAqIChMT0dfTk9STV9QQ00gLSBtZGN0U2NhbGUpLAorICAgICAgICAgICAgICAgICA4KTsKICAgfQogICByZXR1cm4gKDgpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19lbmNvZGVJY3NJbmZvCkBAIC0xNzAsMTMgKzE3NywxMCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlSWNzSW5mbyhJTlQgYmxvY2tUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgd2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncm91cGluZ01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc3ludGF4RmxhZ3MpCi17CitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVJY3NJbmZvKElOVCBibG9ja1R5cGUsIElOVCB3aW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyb3VwaW5nTWFzaywgSU5UIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHN5bnRheEZsYWdzKSB7CiAgIElOVCBzdGF0Qml0czsKIAogICBpZiAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgewpAQCAtMTg0LDM4ICsxODgsMzggQEAKICAgfSBlbHNlIHsKICAgICBpZiAoc3ludGF4RmxhZ3MgJiBBQ19FTEQpIHsKICAgICAgIHN0YXRCaXRzID0gNjsKLSAgICB9IGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgIHN0YXRCaXRzID0gKCEoc3ludGF4RmxhZ3MgJiBBQ19TQ0FMQUJMRSkpID8gMTEgOiAxMDsKICAgICB9CiAgIH0KIAogICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7Ci0KLSAgICBpZiAoIShzeW50YXhGbGFncyAmIEFDX0VMRCkpewotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0saWNzUmVzZXJ2ZWRCaXQsMSk7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSxibG9ja1R5cGUsMik7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgKHdpbmRvd1NoYXBlID09IExPTF9XSU5ET1cpID8gS0JEX1dJTkRPVyA6IHdpbmRvd1NoYXBlLDEpOworICAgIGlmICghKHN5bnRheEZsYWdzICYgQUNfRUxEKSkgeworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGljc1Jlc2VydmVkQml0LCAxKTsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBibG9ja1R5cGUsIDIpOworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgKHdpbmRvd1NoYXBlID09IExPTF9XSU5ET1cpID8gS0JEX1dJTkRPVyA6IHdpbmRvd1NoYXBlLCAxKTsKICAgICB9CiAKLSAgICBzd2l0Y2goYmxvY2tUeXBlKXsKLSAgICBjYXNlIExPTkdfV0lORE9XOgotICAgIGNhc2UgU1RBUlRfV0lORE9XOgotICAgIGNhc2UgU1RPUF9XSU5ET1c6Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSxtYXhTZmJQZXJHcm91cCw2KTsKKyAgICBzd2l0Y2ggKGJsb2NrVHlwZSkgeworICAgICAgY2FzZSBMT05HX1dJTkRPVzoKKyAgICAgIGNhc2UgU1RBUlRfV0lORE9XOgorICAgICAgY2FzZSBTVE9QX1dJTkRPVzoKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIG1heFNmYlBlckdyb3VwLCA2KTsKIAotICAgICAgaWYgKCEoc3ludGF4RmxhZ3MgJiAoQUNfU0NBTEFCTEV8QUNfRUxEKSkgKSB7IC8qIElmIG5vdCBzY2FsYWJsZSBzeW50YXggdGhlbiAuLi4gKi8KLSAgICAgICAgLyogTm8gcHJlZGljdG9yIGRhdGEgcHJlc2VudCAqLwotICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKyAgICAgICAgaWYgKCEoc3ludGF4RmxhZ3MgJgorICAgICAgICAgICAgICAoQUNfU0NBTEFCTEUgfCBBQ19FTEQpKSkgeyAvKiBJZiBub3Qgc2NhbGFibGUgc3ludGF4IHRoZW4gLi4uICovCisgICAgICAgICAgLyogTm8gcHJlZGljdG9yIGRhdGEgcHJlc2VudCAqLworICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgIGNhc2UgU0hPUlRfV0lORE9XOgotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sbWF4U2ZiUGVyR3JvdXAsNCk7CisgICAgICBjYXNlIFNIT1JUX1dJTkRPVzoKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIG1heFNmYlBlckdyb3VwLCA0KTsKIAotICAgICAgLyogV3JpdGUgZ3JvdXBpbmcgYml0cyAqLwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sZ3JvdXBpbmdNYXNrLFRSQU5TX0ZBQy0xKTsKLSAgICAgIGJyZWFrOworICAgICAgICAvKiBXcml0ZSBncm91cGluZyBiaXRzICovCisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBncm91cGluZ01hc2ssIFRSQU5TX0ZBQyAtIDEpOworICAgICAgICBicmVhazsKICAgICB9CiAgIH0KIApAQCAtMjM0LDQ4ICsyMzgsNDQgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlU2VjdGlvbkRhdGEoU0VDVElPTl9EQVRBICpzZWN0aW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHVzZVZDQjExKQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB1c2VWQ0IxMSkgewogICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgSU5UIHNlY3RFc2NhcGVWYWw9MCxzZWN0TGVuQml0cz0wOworICAgIElOVCBzZWN0RXNjYXBlVmFsID0gMCwgc2VjdExlbkJpdHMgPSAwOwogICAgIElOVCBzZWN0TGVuOwogICAgIElOVCBpOwotICAgIElOVCBkYmdWYWw9RkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pOworICAgIElOVCBkYmdWYWwgPSBGREtnZXRWYWxpZEJpdHMoaEJpdFN0cmVhbSk7CiAgICAgSU5UIHNlY3RDYkJpdHMgPSA0OwogCi0gICAgc3dpdGNoKHNlY3Rpb25EYXRhLT5ibG9ja1R5cGUpCi0gICAgewotICAgIGNhc2UgTE9OR19XSU5ET1c6Ci0gICAgY2FzZSBTVEFSVF9XSU5ET1c6Ci0gICAgY2FzZSBTVE9QX1dJTkRPVzoKLSAgICAgIHNlY3RFc2NhcGVWYWwgPSBTRUNUX0VTQ19WQUxfTE9ORzsKLSAgICAgIHNlY3RMZW5CaXRzICAgPSBTRUNUX0JJVFNfTE9ORzsKLSAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSkgeworICAgICAgY2FzZSBMT05HX1dJTkRPVzoKKyAgICAgIGNhc2UgU1RBUlRfV0lORE9XOgorICAgICAgY2FzZSBTVE9QX1dJTkRPVzoKKyAgICAgICAgc2VjdEVzY2FwZVZhbCA9IFNFQ1RfRVNDX1ZBTF9MT05HOworICAgICAgICBzZWN0TGVuQml0cyA9IFNFQ1RfQklUU19MT05HOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgU0hPUlRfV0lORE9XOgotICAgICAgc2VjdEVzY2FwZVZhbCA9IFNFQ1RfRVNDX1ZBTF9TSE9SVDsKLSAgICAgIHNlY3RMZW5CaXRzICAgPSBTRUNUX0JJVFNfU0hPUlQ7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgU0hPUlRfV0lORE9XOgorICAgICAgICBzZWN0RXNjYXBlVmFsID0gU0VDVF9FU0NfVkFMX1NIT1JUOworICAgICAgICBzZWN0TGVuQml0cyA9IFNFQ1RfQklUU19TSE9SVDsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgZm9yKGk9MDtpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7aSsrKQotICAgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsgaSsrKSB7CiAgICAgICBJTlQgY29kZUJvb2sgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2s7CiAKLSAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLGNvZGVCb29rLHNlY3RDYkJpdHMpOworICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGNvZGVCb29rLCBzZWN0Q2JCaXRzKTsKIAogICAgICAgewogICAgICAgICBzZWN0TGVuID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKIAotICAgICAgICB3aGlsZShzZWN0TGVuID49IHNlY3RFc2NhcGVWYWwpCi0gICAgICAgIHsKLSAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0RXNjYXBlVmFsLHNlY3RMZW5CaXRzKTsKLSAgICAgICAgICBzZWN0TGVuLT1zZWN0RXNjYXBlVmFsOworICAgICAgICB3aGlsZSAoc2VjdExlbiA+PSBzZWN0RXNjYXBlVmFsKSB7CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNlY3RFc2NhcGVWYWwsIHNlY3RMZW5CaXRzKTsKKyAgICAgICAgICBzZWN0TGVuIC09IHNlY3RFc2NhcGVWYWw7CiAgICAgICAgIH0KLSAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sc2VjdExlbixzZWN0TGVuQml0cyk7CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzZWN0TGVuLCBzZWN0TGVuQml0cyk7CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybihGREtnZXRWYWxpZEJpdHMoaEJpdFN0cmVhbSktZGJnVmFsKTsKKyAgICByZXR1cm4gKEZES2dldFZhbGlkQml0cyhoQml0U3RyZWFtKSAtIGRiZ1ZhbCk7CiAgIH0KICAgcmV0dXJuICgwKTsKIH0KQEAgLTI4OSwxNiArMjg5LDE0IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZVNjYWxlRmFjdG9yRGF0YShVSU5UICAgICAgICAgICAgICAgICAgKm1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBICAgICAgICAgICpzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgKnNjYWxlZmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgKlJFU1RSSUNUIG5vaXNlTnJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAqaXNTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgIGdsb2JhbEdhaW4pCi17CitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVTY2FsZUZhY3RvckRhdGEoVUlOVCAqbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgKnNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NhbGVmYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIG5vaXNlTnJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqaXNTY2FsZSwgSU5UIGdsb2JhbEdhaW4pIHsKICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewotICAgIElOVCBpLGosbGFzdFZhbFNjZixkZWx0YVNjZjsKKyAgICBJTlQgaSwgaiwgbGFzdFZhbFNjZiwgZGVsdGFTY2Y7CiAgICAgSU5UIGRlbHRhUG5zOwogICAgIElOVCBsYXN0VmFsUG5zID0gMDsKICAgICBJTlQgbm9pc2VQQ01GbGFnID0gVFJVRTsKQEAgLTMwNiw2NSArMzA0LDY1IEBACiAKICAgICBJTlQgZGJnVmFsID0gRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pOwogCi0gICAgbGFzdFZhbFNjZj1zY2FsZWZhY1tzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdOwotICAgIGxhc3RWYWxQbnMgPSBnbG9iYWxHYWluLXNjYWxlZmFjW3NlY3Rpb25EYXRhLT5maXJzdFNjZl0rZ2xvYmFsR2Fpbk9mZnNldC00KkxPR19OT1JNX1BDTS1ub2lzZU9mZnNldDsKLSAgICBsYXN0VmFsSXMgID0gMDsKKyAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNbc2VjdGlvbkRhdGEtPmZpcnN0U2NmXTsKKyAgICBsYXN0VmFsUG5zID0gZ2xvYmFsR2FpbiAtIHNjYWxlZmFjW3NlY3Rpb25EYXRhLT5maXJzdFNjZl0gKworICAgICAgICAgICAgICAgICBnbG9iYWxHYWluT2Zmc2V0IC0gNCAqIExPR19OT1JNX1BDTSAtIG5vaXNlT2Zmc2V0OworICAgIGxhc3RWYWxJcyA9IDA7CiAKLSAgICBmb3IoaT0wOyBpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKyl7CisgICAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykgewogICAgICAgaWYgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykgewotCi0gICAgICAgIGlmICgoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTk8pIHx8Ci0gICAgICAgICAgICAoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19JU19JTl9QSEFTRV9OTykpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgPT0KKyAgICAgICAgICAgICBDT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05PKSB8fAorICAgICAgICAgICAgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PQorICAgICAgICAgICAgIENPREVfQk9PS19JU19JTl9QSEFTRV9OTykpIHsKICAgICAgICAgICBJTlQgc2ZiU3RhcnQgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7CiAgICAgICAgICAgSU5UIHRtcCA9IHNmYlN0YXJ0ICsgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKLSAgICAgICAgICBmb3Ioaj1zZmJTdGFydDsgajx0bXA7IGorKykgewotICAgICAgICAgICAgSU5UIGRlbHRhSXMgICA9IGlzU2NhbGVbal0tbGFzdFZhbElzOworICAgICAgICAgIGZvciAoaiA9IHNmYlN0YXJ0OyBqIDwgdG1wOyBqKyspIHsKKyAgICAgICAgICAgIElOVCBkZWx0YUlzID0gaXNTY2FsZVtqXSAtIGxhc3RWYWxJczsKICAgICAgICAgICAgIGxhc3RWYWxJcyA9IGlzU2NhbGVbal07Ci0gICAgICAgICAgICBpZihGREthYWNFbmNfY29kZVNjYWxlZmFjdG9yRGVsdGEoZGVsdGFJcyxoQml0U3RyZWFtKSkgewotICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIGlmIChGREthYWNFbmNfY29kZVNjYWxlZmFjdG9yRGVsdGEoZGVsdGFJcywgaEJpdFN0cmVhbSkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuICgxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9IC8qIHNmYiAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19QTlNfTk8pIHsKKyAgICAgICAgfSBlbHNlIGlmIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgPT0gQ09ERV9CT09LX1BOU19OTykgewogICAgICAgICAgIElOVCBzZmJTdGFydCA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydDsKICAgICAgICAgICBJTlQgdG1wID0gc2ZiU3RhcnQgKyBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiQ250OwotICAgICAgICAgIGZvcihqPXNmYlN0YXJ0OyBqPHRtcDsgaisrKSB7Ci0gICAgICAgICAgICBkZWx0YVBucyAgID0gbm9pc2VOcmdbal0tbGFzdFZhbFBuczsKKyAgICAgICAgICBmb3IgKGogPSBzZmJTdGFydDsgaiA8IHRtcDsgaisrKSB7CisgICAgICAgICAgICBkZWx0YVBucyA9IG5vaXNlTnJnW2pdIC0gbGFzdFZhbFBuczsKICAgICAgICAgICAgIGxhc3RWYWxQbnMgPSBub2lzZU5yZ1tqXTsKIAotICAgICAgICAgICAgaWYobm9pc2VQQ01GbGFnKXsKLSAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sZGVsdGFQbnMrKDE8PChQTlNfUENNX0JJVFMtMSkpLFBOU19QQ01fQklUUyk7CisgICAgICAgICAgICBpZiAobm9pc2VQQ01GbGFnKSB7CisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBkZWx0YVBucyArICgxIDw8IChQTlNfUENNX0JJVFMgLSAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfUENNX0JJVFMpOwogICAgICAgICAgICAgICBub2lzZVBDTUZsYWcgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICBpZihGREthYWNFbmNfY29kZVNjYWxlZmFjdG9yRGVsdGEoZGVsdGFQbnMsaEJpdFN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoRkRLYWFjRW5jX2NvZGVTY2FsZWZhY3RvckRlbHRhKGRlbHRhUG5zLCBoQml0U3RyZWFtKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoMSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9IC8qIHNmYiAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIElOVCB0bXAgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQrc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKLSAgICAgICAgICBmb3Ioaj1zZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7IGo8dG1wOyBqKyspeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIElOVCB0bXAgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQgKworICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiQ250OworICAgICAgICAgIGZvciAoaiA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydDsgaiA8IHRtcDsgaisrKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICBjaGVjayBpZiB3ZSBjYW4gcmVwZWF0IHRoZSBsYXN0IHZhbHVlIHRvIHNhdmUgYml0cwogICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKG1heFZhbHVlSW5TZmJbal0gPT0gMCkKKyAgICAgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW2pdID09IDApCiAgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsKLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgIGRlbHRhU2NmID0gLShzY2FsZWZhY1tqXS1sYXN0VmFsU2NmKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBkZWx0YVNjZiA9IC0oc2NhbGVmYWNbal0gLSBsYXN0VmFsU2NmKTsKICAgICAgICAgICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjW2pdOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoRkRLYWFjRW5jX2NvZGVTY2FsZWZhY3RvckRlbHRhKGRlbHRhU2NmLGhCaXRTdHJlYW0pKXsKLSAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgaWYgKEZES2FhY0VuY19jb2RlU2NhbGVmYWN0b3JEZWx0YShkZWx0YVNjZiwgaEJpdFN0cmVhbSkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuICgxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9IC8qIHNmYiAqLwotICAgICAgICB9IC8qIGNvZGUgc2NhbGVmYWN0b3IgKi8KLSAgICAgIH0gLyogc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PICovCi0gICAgfSAvKiBzZWN0aW9uIGxvb3AgKi8KKyAgICAgICAgfSAgIC8qIGNvZGUgc2NhbGVmYWN0b3IgKi8KKyAgICAgIH0gICAgIC8qIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTyAqLworICAgIH0gICAgICAgLyogc2VjdGlvbiBsb29wICovCiAKLSAgICByZXR1cm4oRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7CisgICAgcmV0dXJuIChGREtnZXRWYWxpZEJpdHMoaEJpdFN0cmVhbSkgLSBkYmdWYWwpOwogICB9IC8qIGlmIChoQml0U3RyZWFtICE9IE5VTEwpICovCiAKICAgcmV0dXJuICgwKTsKQEAgLTM3OSw1MyArMzc3LDQzIEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZU1TSW5mbyhJTlQgICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgZ3JwU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgIG1heFNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICBtc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpqc0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17CitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVNU0luZm8oSU5UIHNmYkNudCwgSU5UIGdycFNmYiwgSU5UIG1heFNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbXNEaWdlc3QsIElOVCAqanNGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKSB7CiAgIElOVCBzZmIsIHNmYk9mZiwgbXNCaXRzID0gMDsKIAotICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKQotICB7Ci0gICAgc3dpdGNoKG1zRGlnZXN0KQotICAgIHsKLSAgICBjYXNlIE1TX05PTkU6Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSxTSV9NU19NQVNLX05PTkUsMik7Ci0gICAgICBtc0JpdHMgKz0gMjsKLSAgICAgIGJyZWFrOworICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgc3dpdGNoIChtc0RpZ2VzdCkgeworICAgICAgY2FzZSBNU19OT05FOgorICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgU0lfTVNfTUFTS19OT05FLCAyKTsKKyAgICAgICAgbXNCaXRzICs9IDI7CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBNU19BTEw6Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSxTSV9NU19NQVNLX0FMTCwyKTsKLSAgICAgIG1zQml0cyArPSAyOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1TX0FMTDoKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIFNJX01TX01BU0tfQUxMLCAyKTsKKyAgICAgICAgbXNCaXRzICs9IDI7CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBNU19TT01FOgotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19TT01FLDIpOwotICAgICAgbXNCaXRzICs9IDI7Ci0gICAgICBmb3Ioc2ZiT2ZmID0gMDsgc2ZiT2ZmIDwgc2ZiQ250OyBzZmJPZmYrPWdycFNmYikKLSAgICAgIHsKLSAgICAgICAgZm9yKHNmYj0wOyBzZmI8bWF4U2ZiOyBzZmIrKykKLSAgICAgICAgewotICAgICAgICAgIGlmKGpzRmxhZ3Nbc2ZiT2ZmK3NmYl0gJiBNU19PTil7Ci0gICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwxLDEpOworICAgICAgY2FzZSBNU19TT01FOgorICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgU0lfTVNfTUFTS19TT01FLCAyKTsKKyAgICAgICAgbXNCaXRzICs9IDI7CisgICAgICAgIGZvciAoc2ZiT2ZmID0gMDsgc2ZiT2ZmIDwgc2ZiQ250OyBzZmJPZmYgKz0gZ3JwU2ZiKSB7CisgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmI7IHNmYisrKSB7CisgICAgICAgICAgICBpZiAoanNGbGFnc1tzZmJPZmYgKyBzZmJdICYgTVNfT04pIHsKKyAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDEsIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNCaXRzICs9IDE7CiAgICAgICAgICAgfQotICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwwLDEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtc0JpdHMgKz0gMTsKICAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7CisgICAgICAgIGJyZWFrOwogICAgIH0KLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBtc0JpdHMgKz0gMjsKICAgICBpZiAobXNEaWdlc3QgPT0gTVNfU09NRSkgewotICAgICAgZm9yKHNmYk9mZiA9IDA7IHNmYk9mZiA8IHNmYkNudDsgc2ZiT2ZmKz1ncnBTZmIpIHsKLSAgICAgICAgZm9yKHNmYj0wOyBzZmI8bWF4U2ZiOyBzZmIrKykgeworICAgICAgZm9yIChzZmJPZmYgPSAwOyBzZmJPZmYgPCBzZmJDbnQ7IHNmYk9mZiArPSBncnBTZmIpIHsKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmI7IHNmYisrKSB7CiAgICAgICAgICAgbXNCaXRzICs9IDE7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTQ0MywyNiArNDMxLDIzIEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZVRuc0RhdGFQcmVzZW50KFROU19JTkZPICp0bnNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17Ci0gIGlmICggKGhCaXRTdHJlYW0hPU5VTEwpICYmICh0bnNJbmZvIT1OVUxMKSApCi0gIHsKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZVRuc0RhdGFQcmVzZW50KFROU19JTkZPICp0bnNJbmZvLCBJTlQgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgeworICBpZiAoKGhCaXRTdHJlYW0gIT0gTlVMTCkgJiYgKHRuc0luZm8gIT0gTlVMTCkpIHsKICAgICBJTlQgaSwgdG5zUHJlc2VudCA9IDA7Ci0gICAgSU5UIG51bU9mV2luZG93cyA9IChibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz9UUkFOU19GQUM6MSk7CisgICAgSU5UIG51bU9mV2luZG93cyA9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XID8gVFJBTlNfRkFDIDogMSk7CiAKLSAgICBmb3IgKGk9MDsgaTxudW1PZldpbmRvd3M7IGkrKykgewotICAgICAgaWYgKHRuc0luZm8tPm51bU9mRmlsdGVyc1tpXSE9MCkgewotICAgICAgICB0bnNQcmVzZW50PTE7CisgICAgZm9yIChpID0gMDsgaSA8IG51bU9mV2luZG93czsgaSsrKSB7CisgICAgICBpZiAodG5zSW5mby0+bnVtT2ZGaWx0ZXJzW2ldICE9IDApIHsKKyAgICAgICAgdG5zUHJlc2VudCA9IDE7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KIAotICAgIGlmICh0bnNQcmVzZW50PT0wKSB7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwwLDEpOworICAgIGlmICh0bnNQcmVzZW50ID09IDApIHsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsKICAgICB9IGVsc2UgewotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sMSwxKTsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAxLCAxKTsKICAgICB9CiAgIH0KICAgcmV0dXJuICgxKTsKQEAgLTQ3NywxMDYgKzQ2MiwxMDggQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlVG5zRGF0YShUTlNfSU5GTyAqdG5zSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKLXsKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZVRuc0RhdGEoVE5TX0lORk8gKnRuc0luZm8sIElOVCBibG9ja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKICAgSU5UIHRuc0JpdHMgPSAwOwogCi0gIGlmICh0bnNJbmZvIT1OVUxMKSB7Ci0KLSAgICBJTlQgaSxqLGs7CisgIGlmICh0bnNJbmZvICE9IE5VTEwpIHsKKyAgICBJTlQgaSwgaiwgazsKICAgICBJTlQgdG5zUHJlc2VudCA9IDA7CiAgICAgSU5UIGNvZWZCaXRzOwotICAgIElOVCBudW1PZldpbmRvd3M9KGJsb2NrVHlwZT09U0hPUlRfV0lORE9XP1RSQU5TX0ZBQzoxKTsKKyAgICBJTlQgbnVtT2ZXaW5kb3dzID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cgPyBUUkFOU19GQUMgOiAxKTsKIAotICAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7Ci0gICAgICBpZiAodG5zSW5mby0+bnVtT2ZGaWx0ZXJzW2ldIT0wKSB7Ci0gICAgICAgIHRuc1ByZXNlbnQ9MTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT2ZXaW5kb3dzOyBpKyspIHsKKyAgICAgIGlmICh0bnNJbmZvLT5udW1PZkZpbHRlcnNbaV0gIT0gMCkgeworICAgICAgICB0bnNQcmVzZW50ID0gMTsKICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh0bnNQcmVzZW50PT0xKSB7IC8qIHRoZXJlIGlzIGRhdGEgdG8gYmUgd3JpdHRlbiovCi0gICAgICAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7Ci0gICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW2ldLChibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz8xOjIpKTsKLSAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz8xOjIpOworICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgIGlmICh0bnNQcmVzZW50ID09IDEpIHsgLyogdGhlcmUgaXMgZGF0YSB0byBiZSB3cml0dGVuKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bU9mV2luZG93czsgaSsrKSB7CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHRuc0luZm8tPm51bU9mRmlsdGVyc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cgPyAxIDogMikpOworICAgICAgICAgIHRuc0JpdHMgKz0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cgPyAxIDogMik7CiAgICAgICAgICAgaWYgKHRuc0luZm8tPm51bU9mRmlsdGVyc1tpXSkgewotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sKHRuc0luZm8tPmNvZWZSZXNbaV09PTQ/MTowKSwxKTsKKyAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAodG5zSW5mby0+Y29lZlJlc1tpXSA9PSA0ID8gMSA6IDApLCAxKTsKICAgICAgICAgICAgIHRuc0JpdHMgKz0gMTsKICAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChqPTA7IGo8dG5zSW5mby0+bnVtT2ZGaWx0ZXJzW2ldOyBqKyspIHsKLSAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8tPmxlbmd0aFtpXVtqXSwoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/NDo2KSk7Ci0gICAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz80OjYpOworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0bnNJbmZvLT5udW1PZkZpbHRlcnNbaV07IGorKykgeworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHRuc0luZm8tPmxlbmd0aFtpXVtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVyA/IDQgOiA2KSk7CisgICAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XID8gNCA6IDYpOwogICAgICAgICAgICAgRkRLX0FTU0VSVCh0bnNJbmZvLT5vcmRlcltpXVtqXSA8PSAxMik7Ci0gICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSx0bnNJbmZvLT5vcmRlcltpXVtqXSwoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/Mzo1KSk7Ci0gICAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz8zOjUpOwotICAgICAgICAgICAgaWYgKHRuc0luZm8tPm9yZGVyW2ldW2pdKXsKLSAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby0+ZGlyZWN0aW9uW2ldW2pdLDEpOwotICAgICAgICAgICAgICB0bnNCaXRzICs9MTsgLypkaXJlY3Rpb24qLwotICAgICAgICAgICAgICBpZih0bnNJbmZvLT5jb2VmUmVzW2ldID09IDQpIHsKKyAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB0bnNJbmZvLT5vcmRlcltpXVtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVyA/IDMgOiA1KSk7CisgICAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XID8gMyA6IDUpOworICAgICAgICAgICAgaWYgKHRuc0luZm8tPm9yZGVyW2ldW2pdKSB7CisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB0bnNJbmZvLT5kaXJlY3Rpb25baV1bal0sIDEpOworICAgICAgICAgICAgICB0bnNCaXRzICs9IDE7IC8qZGlyZWN0aW9uKi8KKyAgICAgICAgICAgICAgaWYgKHRuc0luZm8tPmNvZWZSZXNbaV0gPT0gNCkgewogICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gMzsKLSAgICAgICAgICAgICAgICBmb3Ioaz0wOyBrPHRuc0luZm8tPm9yZGVyW2ldW2pdOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgIGlmICh0bnNJbmZvLT5jb2VmW2ldW2pdW2tdPiAzIHx8Ci0gICAgICAgICAgICAgICAgICAgIHRuc0luZm8tPmNvZWZbaV1bal1ba108IC00KSB7CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHRuc0luZm8tPm9yZGVyW2ldW2pdOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0bnNJbmZvLT5jb2VmW2ldW2pdW2tdID4gMyB8fAorICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm8tPmNvZWZbaV1bal1ba10gPCAtNCkgewogICAgICAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDI7Ci0gICAgICAgICAgICAgICAgZm9yKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXVtqXTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoIHRuc0luZm8tPmNvZWZbaV1bal1ba10+IDEKLSAgICAgICAgICAgICAgICAgICAgfHwgdG5zSW5mby0+Y29lZltpXVtqXVtrXTwgLTIpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdG5zSW5mby0+b3JkZXJbaV1bal07IGsrKykgeworICAgICAgICAgICAgICAgICAgaWYgKHRuc0luZm8tPmNvZWZbaV1bal1ba10gPiAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZltpXVtqXVtrXSA8IC0yKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gMzsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLC0oY29lZkJpdHMgLSB0bnNJbmZvLT5jb2VmUmVzW2ldKSwxKTsgLypjb2VmX2NvbXByZXMqLwotICAgICAgICAgICAgICB0bnNCaXRzICs9MTsgLypjb2VmX2NvbXByZXNzaW9uICovCi0gICAgICAgICAgICAgIGZvciAoaz0wOyBrPHRuc0luZm8tPm9yZGVyW2ldW2pdOyBrKysgKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IElOVCBybWFza1tdID0gezAsMSwzLDcsMTV9OwotICAgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8tPmNvZWZbaV1bal1ba10gJiBybWFza1tjb2VmQml0c10sY29lZkJpdHMpOworICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgLShjb2VmQml0cyAtIHRuc0luZm8tPmNvZWZSZXNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qY29lZl9jb21wcmVzKi8KKyAgICAgICAgICAgICAgdG5zQml0cyArPSAxOyAgICAvKmNvZWZfY29tcHJlc3Npb24gKi8KKyAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHRuc0luZm8tPm9yZGVyW2ldW2pdOyBrKyspIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgSU5UIHJtYXNrW10gPSB7MCwgMSwgMywgNywgMTV9OworICAgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmW2ldW2pdW2tdICYgcm1hc2tbY29lZkJpdHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmQml0cyk7CiAgICAgICAgICAgICAgICAgdG5zQml0cyArPSBjb2VmQml0czsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgaWYgKHRuc1ByZXNlbnQgIT0gMCkgewotICAgICAgICBmb3IgKGk9MDsgaTxudW1PZldpbmRvd3M7IGkrKykgewotICAgICAgICAgIHRuc0JpdHMgKz0gKGJsb2NrVHlwZT09U0hPUlRfV0lORE9XPzE6Mik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1PZldpbmRvd3M7IGkrKykgeworICAgICAgICAgIHRuc0JpdHMgKz0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cgPyAxIDogMik7CiAgICAgICAgICAgaWYgKHRuc0luZm8tPm51bU9mRmlsdGVyc1tpXSkgewogICAgICAgICAgICAgdG5zQml0cyArPSAxOwotICAgICAgICAgICAgZm9yIChqPTA7IGo8dG5zSW5mby0+bnVtT2ZGaWx0ZXJzW2ldOyBqKyspIHsKLSAgICAgICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/NDo2KTsKLSAgICAgICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/Mzo1KTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0bnNJbmZvLT5udW1PZkZpbHRlcnNbaV07IGorKykgeworICAgICAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XID8gNCA6IDYpOworICAgICAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XID8gMyA6IDUpOwogICAgICAgICAgICAgICBpZiAodG5zSW5mby0+b3JkZXJbaV1bal0pIHsKLSAgICAgICAgICAgICAgICB0bnNCaXRzICs9MTsgLypkaXJlY3Rpb24qLwotICAgICAgICAgICAgICAgIHRuc0JpdHMgKz0xOyAvKmNvZWZfY29tcHJlc3Npb24gKi8KKyAgICAgICAgICAgICAgICB0bnNCaXRzICs9IDE7IC8qZGlyZWN0aW9uKi8KKyAgICAgICAgICAgICAgICB0bnNCaXRzICs9IDE7IC8qY29lZl9jb21wcmVzc2lvbiAqLwogICAgICAgICAgICAgICAgIGlmICh0bnNJbmZvLT5jb2VmUmVzW2ldID09IDQpIHsKLSAgICAgICAgICAgICAgICAgIGNvZWZCaXRzPTM7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXVtqXTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bnNJbmZvLT5jb2VmW2ldW2pdW2tdPiAzIHx8IHRuc0luZm8tPmNvZWZbaV1bal1ba108IC00KSB7CisgICAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDM7CisgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdG5zSW5mby0+b3JkZXJbaV1bal07IGsrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZltpXVtqXVtrXSA+IDMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm8tPmNvZWZbaV1bal1ba10gPCAtNCkgewogICAgICAgICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gNDsKICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgY29lZkJpdHMgPSAyOwotICAgICAgICAgICAgICAgICAgZm9yIChrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV1bal07IGsrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZltpXVtqXVtrXT4gMSB8fCB0bnNJbmZvLT5jb2VmW2ldW2pdW2tdPCAtMikgeworICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHRuc0luZm8tPm9yZGVyW2ldW2pdOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuc0luZm8tPmNvZWZbaV1bal1ba10gPiAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmW2ldW2pdW2tdIDwgLTIpIHsKICAgICAgICAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV1bal07IGsrKykgeworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCB0bnNJbmZvLT5vcmRlcltpXVtqXTsgaysrKSB7CiAgICAgICAgICAgICAgICAgICB0bnNCaXRzICs9IGNvZWZCaXRzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQpAQCAtNTk5LDEwICs1ODYsOSBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVHYWluQ29udHJvbERhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKLXsKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZUdhaW5Db250cm9sRGF0YShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKSB7CiAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKLSAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwwLDEpOworICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsKICAgfQogICByZXR1cm4gKDEpOwogfQpAQCAtNjE2LDE1ICs2MDIsMTMgQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlUHVsc2VEYXRhKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17CitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVQdWxzZURhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgewogICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKKyAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7CiAgIH0KICAgcmV0dXJuICgxKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uUGF5bG9hZApAQCAtNjM0LDIxICs2MTgsMTggQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25QYXlsb2FkKCBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUX1BBWUxPQURfVFlQRSAgICAgIGV4dFBheWxvYWRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAqZXh0UGF5bG9hZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICBleHRQYXlsb2FkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAjZGVmaW5lIEVYVF9UWVBFX0JJVFMgICAgICAgICAoIDQgKQotICAjZGVmaW5lIERBVEFfRUxfVkVSU0lPTl9CSVRTICAoIDQgKQotICAjZGVmaW5lIEZJTExfTklCQkxFX0JJVFMgICAgICAoIDQgKQorc3RhdGljIElOVCBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25QYXlsb2FkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUX1BBWUxPQURfVFlQRSBleHRQYXlsb2FkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqZXh0UGF5bG9hZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGV4dFBheWxvYWRCaXRzKSB7CisjZGVmaW5lIEVYVF9UWVBFX0JJVFMgKDQpCisjZGVmaW5lIERBVEFfRUxfVkVSU0lPTl9CSVRTICg0KQorI2RlZmluZSBGSUxMX05JQkJMRV9CSVRTICg0KQogCi0gIElOVCAgZXh0Qml0c1VzZWQgPSAwOworICBJTlQgZXh0Qml0c1VzZWQgPSAwOwogCi0gIGlmIChleHRQYXlsb2FkQml0cyA+PSBFWFRfVFlQRV9CSVRTKQotICB7Ci0gICAgVUNIQVIgIGZpbGxCeXRlID0gMHgwMDsgIC8qIGZvciBFWFRfRklMIGFuZCBFWFRfRklMTF9EQVRBICovCisgIGlmIChleHRQYXlsb2FkQml0cyA+PSBFWFRfVFlQRV9CSVRTKSB7CisgICAgVUNIQVIgZmlsbEJ5dGUgPSAweDAwOyAvKiBmb3IgRVhUX0ZJTCBhbmQgRVhUX0ZJTExfREFUQSAqLwogCiAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewogICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGV4dFBheWxvYWRUeXBlLCBFWFRfVFlQRV9CSVRTKTsKQEAgLTY1Niw1MCArNjM3LDU2IEBACiAgICAgZXh0Qml0c1VzZWQgKz0gRVhUX1RZUEVfQklUUzsKIAogICAgIHN3aXRjaCAoZXh0UGF5bG9hZFR5cGUpIHsKLSAgICAgIGNhc2UgRVhUX0RZTkFNSUNfUkFOR0U6CiAgICAgICAvKiBjYXNlIEVYVF9TQUNfREFUQTogKi8KKyAgICAgIGNhc2UgRVhUX0xEU0FDX0RBVEE6CisgICAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgKmV4dFBheWxvYWREYXRhKyssIDQpOyAvKiBuaWJibGUgKi8KKyAgICAgICAgfQorICAgICAgICBleHRCaXRzVXNlZCArPSA0OworICAgICAgY2FzZSBFWFRfRFlOQU1JQ19SQU5HRToKICAgICAgIGNhc2UgRVhUX1NCUl9EQVRBOgogICAgICAgY2FzZSBFWFRfU0JSX0RBVEFfQ1JDOgogICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CiAgICAgICAgICAgaW50IGksIHdyaXRlQml0cyA9IGV4dFBheWxvYWRCaXRzOwotICAgICAgICAgIGZvciAoaT0wOyB3cml0ZUJpdHMgPj0gODsgaSsrKSB7Ci0gICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXh0UGF5bG9hZERhdGFbaV0sIDgpOworICAgICAgICAgIGZvciAoaSA9IDA7IHdyaXRlQml0cyA+PSA4OyBpKyspIHsKKyAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAqZXh0UGF5bG9hZERhdGErKywgOCk7CiAgICAgICAgICAgICB3cml0ZUJpdHMgLT0gODsKICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKHdyaXRlQml0cyA+IDApIHsKLSAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBleHRQYXlsb2FkRGF0YVtpXT4+KDgtd3JpdGVCaXRzKSwgd3JpdGVCaXRzKTsKKyAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAoKmV4dFBheWxvYWREYXRhKSA+PiAoOCAtIHdyaXRlQml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVCaXRzKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZXh0Qml0c1VzZWQgKz0gZXh0UGF5bG9hZEJpdHM7CiAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIEVYVF9EQVRBX0VMRU1FTlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBJTlQgZGF0YUVsZW1lbnRMZW5ndGggPSAoZXh0UGF5bG9hZEJpdHMrNyk+PjM7Ci0gICAgICAgICAgSU5UIGNudCA9IGRhdGFFbGVtZW50TGVuZ3RoOwotICAgICAgICAgIGludCBsb29wQ291bnRlciA9IDE7CisgICAgICBjYXNlIEVYVF9EQVRBX0VMRU1FTlQ6IHsKKyAgICAgICAgSU5UIGRhdGFFbGVtZW50TGVuZ3RoID0gKGV4dFBheWxvYWRCaXRzICsgNykgPj4gMzsKKyAgICAgICAgSU5UIGNudCA9IGRhdGFFbGVtZW50TGVuZ3RoOworICAgICAgICBpbnQgbG9vcENvdW50ZXIgPSAxOwogCi0gICAgICAgICAgd2hpbGUgKGRhdGFFbGVtZW50TGVuZ3RoID49IDI1NSkgewotICAgICAgICAgICAgbG9vcENvdW50ZXIrKzsKLSAgICAgICAgICAgIGRhdGFFbGVtZW50TGVuZ3RoIC09IDI1NTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAweDAwLCBEQVRBX0VMX1ZFUlNJT05fQklUUyk7ICAvKiBkYXRhX2VsZW1lbnRfdmVyc2lvbiA9IEFOQ19EQVRBICovCi0KLSAgICAgICAgICAgIGZvciAoaT0xOyBpPGxvb3BDb3VudGVyOyBpKyspIHsKLSAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDI1NSwgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZGF0YUVsZW1lbnRMZW5ndGgsIDgpOwotCi0gICAgICAgICAgICBmb3IgKGk9MDsgaTxjbnQ7IGkrKykgewotICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXh0UGF5bG9hZERhdGFbaV0sIDgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBleHRCaXRzVXNlZCArPSBEQVRBX0VMX1ZFUlNJT05fQklUUyArIChsb29wQ291bnRlcio4KSArIChjbnQqOCk7CisgICAgICAgIHdoaWxlIChkYXRhRWxlbWVudExlbmd0aCA+PSAyNTUpIHsKKyAgICAgICAgICBsb29wQ291bnRlcisrOworICAgICAgICAgIGRhdGFFbGVtZW50TGVuZ3RoIC09IDI1NTsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgRkRLd3JpdGVCaXRzKAorICAgICAgICAgICAgICBoQml0U3RyZWFtLCAweDAwLAorICAgICAgICAgICAgICBEQVRBX0VMX1ZFUlNJT05fQklUUyk7IC8qIGRhdGFfZWxlbWVudF92ZXJzaW9uID0gQU5DX0RBVEEgKi8KKworICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBsb29wQ291bnRlcjsgaSsrKSB7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMjU1LCA4KTsKKyAgICAgICAgICB9CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGRhdGFFbGVtZW50TGVuZ3RoLCA4KTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGV4dFBheWxvYWREYXRhW2ldLCA4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZXh0Qml0c1VzZWQgKz0gREFUQV9FTF9WRVJTSU9OX0JJVFMgKyAobG9vcENvdW50ZXIgKiA4KSArIChjbnQgKiA4KTsKKyAgICAgIH0gYnJlYWs7CiAKICAgICAgIGNhc2UgRVhUX0ZJTExfREFUQToKICAgICAgICAgZmlsbEJ5dGUgPSAweEE1OwpAQCAtNzA4LDcgKzY5NSw4IEBACiAgICAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKICAgICAgICAgICBpbnQgd3JpdGVCaXRzID0gZXh0UGF5bG9hZEJpdHM7CiAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDB4MDAsIEZJTExfTklCQkxFX0JJVFMpOwotICAgICAgICAgIHdyaXRlQml0cyAtPSA4OyAgLyogYWNvdW50IGZvciB0aGUgZXh0ZW5zaW9uIHR5cGUgYW5kIHRoZSBmaWxsIG5pYmJsZSAqLworICAgICAgICAgIHdyaXRlQml0cyAtPQorICAgICAgICAgICAgICA4OyAvKiBhY291bnQgZm9yIHRoZSBleHRlbnNpb24gdHlwZSBhbmQgdGhlIGZpbGwgbmliYmxlICovCiAgICAgICAgICAgd2hpbGUgKHdyaXRlQml0cyA+PSA4KSB7CiAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZmlsbEJ5dGUsIDgpOwogICAgICAgICAgICAgd3JpdGVCaXRzIC09IDg7CkBAIC03MjIsNyArNzEwLDYgQEAKICAgcmV0dXJuIChleHRCaXRzVXNlZCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY193cml0ZURhdGFTdHJlYW1FbGVtZW50CkBAIC03MzIsMzkgKzcxOSwzNyBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCBGREthYWNFbmNfd3JpdGVEYXRhU3RyZWFtRWxlbWVudCggSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgIGVsZW1lbnRJbnN0YW5jZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICBkYXRhUGF5bG9hZEJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmRhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgYWxpZ25BbmNob3IgKQotewotICAjZGVmaW5lIERBVEFfQllURV9BTElHTl9GTEFHICAgICAgKCAwICkKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX3dyaXRlRGF0YVN0cmVhbUVsZW1lbnQoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBlbGVtZW50SW5zdGFuY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkYXRhUGF5bG9hZEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhbGlnbkFuY2hvcikgeworI2RlZmluZSBEQVRBX0JZVEVfQUxJR05fRkxBRyAoMCkKIAotICAjZGVmaW5lIEVMX0lOU1RBTkNFX1RBR19CSVRTICAgICAgKCA0ICkKLSAgI2RlZmluZSBEQVRBX0JZVEVfQUxJR05fRkxBR19CSVRTICggMSApCi0gICNkZWZpbmUgREFUQV9MRU5fQ09VTlRfQklUUyAgICAgICAoIDggKQotICAjZGVmaW5lIERBVEFfTEVOX0VTQ19DT1VOVF9CSVRTICAgKCA4ICkKKyNkZWZpbmUgRUxfSU5TVEFOQ0VfVEFHX0JJVFMgKDQpCisjZGVmaW5lIERBVEFfQllURV9BTElHTl9GTEFHX0JJVFMgKDEpCisjZGVmaW5lIERBVEFfTEVOX0NPVU5UX0JJVFMgKDgpCisjZGVmaW5lIERBVEFfTEVOX0VTQ19DT1VOVF9CSVRTICg4KQogCi0gICNkZWZpbmUgTUFYX0RBVEFfQUxJR05fQklUUyAgICAgICAoIDcgKQotICAjZGVmaW5lIE1BWF9EU0VfREFUQV9CWVRFUyAgICAgICAgKCA1MTAgKQorI2RlZmluZSBNQVhfREFUQV9BTElHTl9CSVRTICg3KQorI2RlZmluZSBNQVhfRFNFX0RBVEFfQllURVMgKDUxMCkKIAotICBJTlQgIGRzZUJpdHNVc2VkID0gMDsKKyAgSU5UIGRzZUJpdHNVc2VkID0gMDsKIAotICB3aGlsZSAoZGF0YVBheWxvYWRCeXRlcyA+IDApCi0gIHsKKyAgd2hpbGUgKGRhdGFQYXlsb2FkQnl0ZXMgPiAwKSB7CiAgICAgaW50IGVzY19jb3VudCA9IC0xOwogICAgIGludCBjbnQgPSAwOwogICAgIElOVCBjcmNSZWcgPSAtMTsKIAotICAgIGRzZUJpdHNVc2VkICs9IEVMX0lEX0JJVFMgKyBFTF9JTlNUQU5DRV9UQUdfQklUUwotICAgICAgICAgICAgICAgICsgIERBVEFfQllURV9BTElHTl9GTEFHX0JJVFMgKyBEQVRBX0xFTl9DT1VOVF9CSVRTOworICAgIGRzZUJpdHNVc2VkICs9IEVMX0lEX0JJVFMgKyBFTF9JTlNUQU5DRV9UQUdfQklUUyArCisgICAgICAgICAgICAgICAgICAgREFUQV9CWVRFX0FMSUdOX0ZMQUdfQklUUyArIERBVEFfTEVOX0NPVU5UX0JJVFM7CiAKICAgICBpZiAoREFUQV9CWVRFX0FMSUdOX0ZMQUcpIHsKICAgICAgIGRzZUJpdHNVc2VkICs9IE1BWF9EQVRBX0FMSUdOX0JJVFM7CiAgICAgfQogCiAgICAgY250ID0gZml4TWluKE1BWF9EU0VfREFUQV9CWVRFUywgZGF0YVBheWxvYWRCeXRlcyk7Ci0gICAgaWYgKCBjbnQgPj0gMjU1ICkgeworICAgIGlmIChjbnQgPj0gMjU1KSB7CiAgICAgICBlc2NfY291bnQgPSBjbnQgLSAyNTU7CiAgICAgICBkc2VCaXRzVXNlZCArPSBEQVRBX0xFTl9FU0NfQ09VTlRfQklUUzsKICAgICB9CkBAIC03ODQsNyArNzY5LDcgQEAKICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBEQVRBX0JZVEVfQUxJR05fRkxBRywgREFUQV9CWVRFX0FMSUdOX0ZMQUdfQklUUyk7CiAKICAgICAgIC8qIHdyaXRlIGxlbmd0aCBmaWVsZChzKSAqLwotICAgICAgaWYgKCBlc2NfY291bnQgPj0gMCApIHsKKyAgICAgIGlmIChlc2NfY291bnQgPj0gMCkgewogICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMjU1LCBEQVRBX0xFTl9DT1VOVF9CSVRTKTsKICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGVzY19jb3VudCwgREFUQV9MRU5fRVNDX0NPVU5UX0JJVFMpOwogICAgICAgfSBlbHNlIHsKQEAgLTc5NSwxMSArNzgwLDEyIEBACiAgICAgICAgIElOVCB0bXAgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQml0U3RyZWFtKTsKICAgICAgICAgRkRLYnl0ZUFsaWduKGhCaXRTdHJlYW0sIGFsaWduQW5jaG9yKTsKICAgICAgICAgLyogY291bnQgYWN0dWFsIGJpdHMgKi8KLSAgICAgICAgZHNlQml0c1VzZWQgKz0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJpdFN0cmVhbSkgLSB0bXAgLSBNQVhfREFUQV9BTElHTl9CSVRTOworICAgICAgICBkc2VCaXRzVXNlZCArPQorICAgICAgICAgICAgKElOVClGREtnZXRWYWxpZEJpdHMoaEJpdFN0cmVhbSkgLSB0bXAgLSBNQVhfREFUQV9BTElHTl9CSVRTOwogICAgICAgfQogCiAgICAgICAvKiB3cml0ZSBwYXlsb2FkICovCi0gICAgICBmb3IgKGk9MDsgaTxjbnQ7IGkrKykgeworICAgICAgZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CiAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBkYXRhQnVmZmVyW2ldLCA4KTsKICAgICAgIH0KICAgICAgIHRyYW5zcG9ydEVuY19DcmNFbmRSZWcoaFRwRW5jLCBjcmNSZWcpOwpAQCAtODA5LDcgKzc5NSw2IEBACiAgIHJldHVybiAoZHNlQml0c1VzZWQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhCkBAIC04MTksMTggKzgwNCwxNSBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YSggSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FWFRFTlNJT04gICAgKnBFeHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgZWxJbnN0YW5jZVRhZywgLyogZm9yIERTRSBvbmx5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IsICAgLyogZm9yIERTRSBvbmx5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgIGVwQ29uZmlnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgI2RlZmluZSBGSUxMX0VMX0NPVU5UX0JJVFMgICAgICAoIDQgKQotICAjZGVmaW5lIEZJTExfRUxfRVNDX0NPVU5UX0JJVFMgICggOCApCi0gICNkZWZpbmUgTUFYX0ZJTExfREFUQV9CWVRFUyAgICAgKCAyNjkgKQorSU5UIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRVhURU5TSU9OICpwRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGVsSW5zdGFuY2VUYWcsIC8qIGZvciBEU0Ugb25seSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhbGlnbkFuY2hvciwgIC8qIGZvciBEU0Ugb25seSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzeW50YXhGbGFncywgQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgZXBDb25maWcpIHsKKyNkZWZpbmUgRklMTF9FTF9DT1VOVF9CSVRTICg0KQorI2RlZmluZSBGSUxMX0VMX0VTQ19DT1VOVF9CSVRTICg4KQorI2RlZmluZSBNQVhfRklMTF9EQVRBX0JZVEVTICgyNjkpCiAKICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSA9IE5VTEw7CiAgIElOVCBwYXlsb2FkQml0cyA9IHBFeHRlbnNpb24tPm5QYXlsb2FkQml0czsKQEAgLTg0MCwxMDYgKzgyMiw1MyBAQAogICAgIGhCaXRTdHJlYW0gPSB0cmFuc3BvcnRFbmNfR2V0Qml0c3RyZWFtKGhUcEVuYyk7CiAgIH0KIAotICBpZiAoc3ludGF4RmxhZ3MgJiAoQUNfU0NBTEFCTEV8QUNfRVIpKQotICB7Ci0gICAgaWYgKCBzeW50YXhGbGFncyAmIEFDX0RSTSApCi0gICAgeyAvKiBDQVVUSU9OOiBUaGUgY2FsbGVyIGhhcyB0byBhc3N1cmUgdGhhdCBmaWxsCi0gICAgICAgICAgICAgICAgICBkYXRhIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBTQlIgcGF5bG9hZC4gKi8KLSAgICAgIFVDSEFSICpleHRQYXlsb2FkRGF0YSA9IHBFeHRlbnNpb24tPnBQYXlsb2FkOwotCi0gICAgICBzd2l0Y2ggKHBFeHRlbnNpb24tPnR5cGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgRVhUX1NCUl9EQVRBOgotICAgICAgICBjYXNlIEVYVF9TQlJfREFUQV9DUkM6Ci0gICAgICAgICAgLyogU0JSIHBheWxvYWQgaXMgd3JpdHRlbiBpbiByZXZlcnNlICovCi0gICAgICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewotICAgICAgICAgICAgaW50ICAgaSwgd3JpdGVCaXRzID0gcGF5bG9hZEJpdHM7Ci0KLSAgICAgICAgICAgIEZES3B1c2hGb3IoaEJpdFN0cmVhbSwgcGF5bG9hZEJpdHMtMSk7ICAvKiBEb2VzIGEgY2FjaGUgc3luYyBpbnRlcm5hbGx5ICovCi0KLSAgICAgICAgICAgIGZvciAoaT0wOyB3cml0ZUJpdHMgPj0gODsgaSsrKSB7Ci0gICAgICAgICAgICAgIEZES3dyaXRlQml0c0J3ZChoQml0U3RyZWFtLCBleHRQYXlsb2FkRGF0YVtpXSwgOCk7Ci0gICAgICAgICAgICAgIHdyaXRlQml0cyAtPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHdyaXRlQml0cyA+IDApIHsKLSAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzQndkKGhCaXRTdHJlYW0sIGV4dFBheWxvYWREYXRhW2ldPj4oOC13cml0ZUJpdHMpLCB3cml0ZUJpdHMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGREtzeW5jQ2FjaGVCd2QgKGhCaXRTdHJlYW0pOwotICAgICAgICAgICAgRkRLcHVzaEZvciAoaEJpdFN0cmVhbSwgcGF5bG9hZEJpdHMrMSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGV4dEJpdHNVc2VkICs9IHBheWxvYWRCaXRzOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRVhUX0ZJTExfREFUQToKLSAgICAgICAgY2FzZSBFWFRfRklMOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGludCB3cml0ZUJpdHMgPSBwYXlsb2FkQml0czsKLSAgICAgICAgICAgIHdoaWxlICh3cml0ZUJpdHMgPj0gOCkgewotICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMHgwMCwgOCk7Ci0gICAgICAgICAgICAgIHdyaXRlQml0cyAtPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDB4MDAsIHdyaXRlQml0cyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGV4dEJpdHNVc2VkICs9IHBheWxvYWRCaXRzOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmICggKHN5bnRheEZsYWdzICYgQUNfRUxEKSAmJiAoKHBFeHRlbnNpb24tPnR5cGU9PUVYVF9TQlJfREFUQSkgfHwgKHBFeHRlbnNpb24tPnR5cGU9PUVYVF9TQlJfREFUQV9DUkMpKSApIHsKLQorICBpZiAoc3ludGF4RmxhZ3MgJiAoQUNfU0NBTEFCTEUgfCBBQ19FUikpIHsKKyAgICB7CisgICAgICBpZiAoKHN5bnRheEZsYWdzICYgQUNfRUxEKSAmJiAoKHBFeHRlbnNpb24tPnR5cGUgPT0gRVhUX1NCUl9EQVRBKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwRXh0ZW5zaW9uLT50eXBlID09IEVYVF9TQlJfREFUQV9DUkMpKSkgewogICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CiAgICAgICAgICAgaW50IGksIHdyaXRlQml0cyA9IHBheWxvYWRCaXRzOwogICAgICAgICAgIFVDSEFSICpleHRQYXlsb2FkRGF0YSA9IHBFeHRlbnNpb24tPnBQYXlsb2FkOwogCi0gICAgICAgICAgZm9yIChpPTA7IHdyaXRlQml0cyA+PSA4OyBpKyspIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyB3cml0ZUJpdHMgPj0gODsgaSsrKSB7CiAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXh0UGF5bG9hZERhdGFbaV0sIDgpOwogICAgICAgICAgICAgd3JpdGVCaXRzIC09IDg7CiAgICAgICAgICAgfQogICAgICAgICAgIGlmICh3cml0ZUJpdHMgPiAwKSB7Ci0gICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXh0UGF5bG9hZERhdGFbaV0+Pig4LXdyaXRlQml0cyksIHdyaXRlQml0cyk7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXh0UGF5bG9hZERhdGFbaV0gPj4gKDggLSB3cml0ZUJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQml0cyk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGV4dEJpdHNVc2VkICs9IHBheWxvYWRCaXRzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogRVIgb3Igc2NhbGFibGUgc3ludGF4IC0+IHdyaXRlIGV4dGVuc2lvbiBlbiBibG9jICovCi0gICAgICAgIGV4dEJpdHNVc2VkICs9IEZES2FhY0VuY193cml0ZUV4dGVuc2lvblBheWxvYWQoIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRlbnNpb24tPnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRlbnNpb24tPnBQYXlsb2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkQml0cyApOworICAgICAgICBleHRCaXRzVXNlZCArPSBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25QYXlsb2FkKAorICAgICAgICAgICAgaEJpdFN0cmVhbSwgcEV4dGVuc2lvbi0+dHlwZSwgcEV4dGVuc2lvbi0+cFBheWxvYWQsIHBheWxvYWRCaXRzKTsKICAgICAgIH0KICAgICB9Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgLyogV2UgaGF2ZSBub3JtYWwgR0EgYml0c3RyZWFtIHBheWxvYWQgKEFPVCAyLDUsMjkpIHNvIHBhY2sKICAgICAgICB0aGUgZGF0YSBpbnRvIGEgZmlsbCBlbGVtZW50cyBvciBEU0VzICovCiAKLSAgICBpZiAoIHBFeHRlbnNpb24tPnR5cGUgPT0gRVhUX0RBVEFfRUxFTUVOVCApCi0gICAgewotICAgICAgZXh0Qml0c1VzZWQgKz0gRkRLYWFjRW5jX3dyaXRlRGF0YVN0cmVhbUVsZW1lbnQoIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbEluc3RhbmNlVGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRlbnNpb24tPm5QYXlsb2FkQml0cz4+MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0ZW5zaW9uLT5wUGF5bG9hZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkFuY2hvciApOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICBpZiAocEV4dGVuc2lvbi0+dHlwZSA9PSBFWFRfREFUQV9FTEVNRU5UKSB7CisgICAgICBleHRCaXRzVXNlZCArPSBGREthYWNFbmNfd3JpdGVEYXRhU3RyZWFtRWxlbWVudCgKKyAgICAgICAgICBoVHBFbmMsIGVsSW5zdGFuY2VUYWcsIHBFeHRlbnNpb24tPm5QYXlsb2FkQml0cyA+PiAzLAorICAgICAgICAgIHBFeHRlbnNpb24tPnBQYXlsb2FkLCBhbGlnbkFuY2hvcik7CisgICAgfSBlbHNlIHsKICAgICAgIHdoaWxlIChwYXlsb2FkQml0cyA+PSAoRUxfSURfQklUUyArIEZJTExfRUxfQ09VTlRfQklUUykpIHsKLSAgICAgICAgSU5UIGNudCwgZXNjX2NvdW50PS0xLCBhbGlnbkJpdHM9NzsKKyAgICAgICAgSU5UIGNudCwgZXNjX2NvdW50ID0gLTEsIGFsaWduQml0cyA9IDc7CiAKLSAgICAgICAgaWYgKCAocEV4dGVuc2lvbi0+dHlwZSA9PSBFWFRfRklMTF9EQVRBKSB8fCAocEV4dGVuc2lvbi0+dHlwZSA9PSBFWFRfRklMKSApCi0gICAgICAgIHsKKyAgICAgICAgaWYgKChwRXh0ZW5zaW9uLT50eXBlID09IEVYVF9GSUxMX0RBVEEpIHx8CisgICAgICAgICAgICAocEV4dGVuc2lvbi0+dHlwZSA9PSBFWFRfRklMKSkgewogICAgICAgICAgIHBheWxvYWRCaXRzIC09IEVMX0lEX0JJVFMgKyBGSUxMX0VMX0NPVU5UX0JJVFM7Ci0gICAgICAgICAgaWYgKHBheWxvYWRCaXRzID49IDE1KjgpIHsKKyAgICAgICAgICBpZiAocGF5bG9hZEJpdHMgPj0gMTUgKiA4KSB7CiAgICAgICAgICAgICBwYXlsb2FkQml0cyAtPSBGSUxMX0VMX0VTQ19DT1VOVF9CSVRTOwotICAgICAgICAgICAgZXNjX2NvdW50ID0gMDsgIC8qIHdyaXRlIGVzY19jb3VudCBldmVuIGlmIGNudCBiZWNvbWVzIHNtYWxsZXIgMTUgKi8KKyAgICAgICAgICAgIGVzY19jb3VudCA9IDA7IC8qIHdyaXRlIGVzY19jb3VudCBldmVuIGlmIGNudCBiZWNvbWVzIHNtYWxsZXIgMTUgKi8KICAgICAgICAgICB9CiAgICAgICAgICAgYWxpZ25CaXRzID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIGNudCA9IGZpeE1pbihNQVhfRklMTF9EQVRBX0JZVEVTLCAocGF5bG9hZEJpdHMrYWxpZ25CaXRzKT4+Myk7CisgICAgICAgIGNudCA9IGZpeE1pbihNQVhfRklMTF9EQVRBX0JZVEVTLCAocGF5bG9hZEJpdHMgKyBhbGlnbkJpdHMpID4+IDMpOwogCiAgICAgICAgIGlmIChjbnQgPj0gMTUpIHsKICAgICAgICAgICBlc2NfY291bnQgPSBjbnQgLSAxNSArIDE7CkBAIC05NTYsMTMgKzg4NSwxMiBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGV4dEJpdHNVc2VkICs9IEVMX0lEX0JJVFMgKyBGSUxMX0VMX0NPVU5UX0JJVFMgKyAoKGVzY19jb3VudD49MCkgPyBGSUxMX0VMX0VTQ19DT1VOVF9CSVRTIDogMCk7CisgICAgICAgIGV4dEJpdHNVc2VkICs9IEVMX0lEX0JJVFMgKyBGSUxMX0VMX0NPVU5UX0JJVFMgKworICAgICAgICAgICAgICAgICAgICAgICAoKGVzY19jb3VudCA+PSAwKSA/IEZJTExfRUxfRVNDX0NPVU5UX0JJVFMgOiAwKTsKIAotICAgICAgICBjbnQgPSBmaXhNaW4oY250KjgsIHBheWxvYWRCaXRzKTsgIC8qIGNvbnZlcnQgYmFjayB0byBiaXRzICovCi0gICAgICAgIGV4dEJpdHNVc2VkICs9IEZES2FhY0VuY193cml0ZUV4dGVuc2lvblBheWxvYWQoIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRlbnNpb24tPnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRlbnNpb24tPnBQYXlsb2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnQgKTsKKyAgICAgICAgY250ID0gZml4TWluKGNudCAqIDgsIHBheWxvYWRCaXRzKTsgLyogY29udmVydCBiYWNrIHRvIGJpdHMgKi8KKyAgICAgICAgZXh0Qml0c1VzZWQgKz0gRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uUGF5bG9hZCgKKyAgICAgICAgICAgIGhCaXRTdHJlYW0sIHBFeHRlbnNpb24tPnR5cGUsIHBFeHRlbnNpb24tPnBQYXlsb2FkLCBjbnQpOwogICAgICAgICBwYXlsb2FkQml0cyAtPSBjbnQ7CiAgICAgICB9CiAgICAgfQpAQCAtOTcxLDcgKzg5OSw2IEBACiAgIHJldHVybiAoZXh0Qml0c1VzZWQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQnl0ZUFsaWdubWVudApAQCAtOTgxLDUwICs5MDgsNDMgQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0J5dGVBbGlnbm1lbnQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgaW50IGFsaWduQml0cykKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19CeXRlQWxpZ25tZW50KEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxpZ25CaXRzKSB7CiAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLCBhbGlnbkJpdHMpOwogfQogCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfQ2hhbm5lbEVsZW1lbnRXcml0ZSggSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyAgICAgICAgKnBFbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgICAgICAqcWNPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICAgICAqcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICpwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgIGVwQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgKnBCaXREZW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgbWluQ250Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKAorICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBFTEVNRU5UX0lORk8gKnBFbEluZm8sCisgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbFsoMildLCBQU1lfT1VUX0VMRU1FTlQgKnBzeU91dEVsZW1lbnQsCisgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsWygyKV0sIFVJTlQgc3ludGF4RmxhZ3MsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LCBTQ0hBUiBlcENvbmZpZywgSU5UICpwQml0RGVtYW5kLCBVQ0hBUiBtaW5DbnQpIHsKICAgQUFDX0VOQ09ERVJfRVJST1IgZXJyb3IgPSBBQUNfRU5DX09LOwogICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtID0gTlVMTDsKLSAgSU5UICAgIGJpdERlbWFuZCA9IDA7Ci0gIGNvbnN0ICBlbGVtZW50X2xpc3RfdCAqbGlzdDsKLSAgaW50ICAgIGksIGNoLCBkZWNpc2lvbl9iaXQ7Ci0gIElOVCAgICBjcmNSZWcxID0gLTEsIGNyY1JlZzIgPSAtMTsKLSAgVUNIQVIgIG51bWJlck9mQ2hhbm5lbHM7CisgIElOVCBiaXREZW1hbmQgPSAwOworICBjb25zdCBlbGVtZW50X2xpc3RfdCAqbGlzdDsKKyAgaW50IGksIGNoLCBkZWNpc2lvbl9iaXQ7CisgIElOVCBjcmNSZWcxID0gLTEsIGNyY1JlZzIgPSAtMTsKKyAgVUNIQVIgbnVtYmVyT2ZDaGFubmVsczsKIAogICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKICAgICAvKiBHZXQgYml0c3RyZWFtIGhhbmRsZSAqLwogICAgIGhCaXRTdHJlYW0gPSB0cmFuc3BvcnRFbmNfR2V0Qml0c3RyZWFtKGhUcEVuYyk7CiAgIH0KIAotICBpZiAoIChwRWxJbmZvLT5lbFR5cGU9PUlEX1NDRSkgfHwgKHBFbEluZm8tPmVsVHlwZT09SURfTEZFKSApIHsKKyAgaWYgKChwRWxJbmZvLT5lbFR5cGUgPT0gSURfU0NFKSB8fCAocEVsSW5mby0+ZWxUeXBlID09IElEX0xGRSkpIHsKICAgICBudW1iZXJPZkNoYW5uZWxzID0gMTsKICAgfSBlbHNlIHsKICAgICBudW1iZXJPZkNoYW5uZWxzID0gMjsKICAgfQogCiAgIC8qIEdldCBjaGFubmVsIGVsZW1lbnQgc2VxdWVuY2UgdGFibGUgKi8KLSAgbGlzdCA9IGdldEJpdHN0cmVhbUVsZW1lbnRMaXN0KGFvdCwgZXBDb25maWcsIG51bWJlck9mQ2hhbm5lbHMsIDApOworICBsaXN0ID0gZ2V0Qml0c3RyZWFtRWxlbWVudExpc3QoYW90LCBlcENvbmZpZywgbnVtYmVyT2ZDaGFubmVscywgMCwgMCk7CiAgIGlmIChsaXN0ID09IE5VTEwpIHsKICAgICBlcnJvciA9IEFBQ19FTkNfVU5TVVBQT1JURURfQU9UOwogICAgIGdvdG8gYmFpbDsKICAgfQogCi0gIGlmICghKHN5bnRheEZsYWdzICYgKEFDX1NDQUxBQkxFfEFDX0VSKSkpIHsKKyAgaWYgKCEoc3ludGF4RmxhZ3MgJiAoQUNfU0NBTEFCTEUgfCBBQ19FUikpKSB7CiAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewogICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHBFbEluZm8tPmVsVHlwZSwgRUxfSURfQklUUyk7CiAgICAgfQpAQCAtMTAzOCwyMjUgKzk1OCwyMDUgQEAKICAgZG8gewogICAgIC8qIHNvbWUgdG1wIHZhbHVlcyAqLwogICAgIFNFQ1RJT05fREFUQSAqcENoU2VjdGlvbkRhdGEgPSBOVUxMOwotICAgIElOVCAgKnBDaFNjZiAgICAgICAgICAgPSBOVUxMOworICAgIElOVCAqcENoU2NmID0gTlVMTDsKICAgICBVSU5UICpwQ2hNYXhWYWx1ZUluU2ZiID0gTlVMTDsKLSAgICBUTlNfSU5GTyAqcFRuc0luZm8gICAgID0gTlVMTDsKLSAgICBJTlQgICBjaEdsb2JhbEdhaW4gICAgID0gMDsKLSAgICBJTlQgICBjaEJsb2NrVHlwZSAgICAgID0gMDsKLSAgICBJTlQgICBjaE1heFNmYlBlckdycCAgID0gMDsKLSAgICBJTlQgICBjaFNmYlBlckdycCAgICAgID0gMDsKLSAgICBJTlQgICBjaFNmYkNudCAgICAgICAgID0gMDsKLSAgICBJTlQgICBjaEZpcnN0U2NmICAgICAgID0gMDsKKyAgICBUTlNfSU5GTyAqcFRuc0luZm8gPSBOVUxMOworICAgIElOVCBjaEdsb2JhbEdhaW4gPSAwOworICAgIElOVCBjaEJsb2NrVHlwZSA9IDA7CisgICAgSU5UIGNoTWF4U2ZiUGVyR3JwID0gMDsKKyAgICBJTlQgY2hTZmJQZXJHcnAgPSAwOworICAgIElOVCBjaFNmYkNudCA9IDA7CisgICAgSU5UIGNoRmlyc3RTY2YgPSAwOwogCi0gICAgaWYgKG1pbkNudD09MCkgewotICAgICAgaWYgKCBxY091dENoYW5uZWwhPU5VTEwgKSB7Ci0gICAgICAgIHBDaFNlY3Rpb25EYXRhICAgPSAmKHFjT3V0Q2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhKTsKLSAgICAgICAgcENoU2NmICAgICAgICAgICA9ICBxY091dENoYW5uZWxbY2hdLT5zY2Y7Ci0gICAgICAgIGNoR2xvYmFsR2FpbiAgICAgPSAgcWNPdXRDaGFubmVsW2NoXS0+Z2xvYmFsR2FpbjsKLSAgICAgICAgcENoTWF4VmFsdWVJblNmYiA9ICBxY091dENoYW5uZWxbY2hdLT5tYXhWYWx1ZUluU2ZiOwotICAgICAgICBjaEJsb2NrVHlwZSAgICAgID0gIHBDaFNlY3Rpb25EYXRhLT5ibG9ja1R5cGU7Ci0gICAgICAgIGNoTWF4U2ZiUGVyR3JwICAgPSAgcENoU2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwOwotICAgICAgICBjaFNmYlBlckdycCAgICAgID0gIHBDaFNlY3Rpb25EYXRhLT5zZmJQZXJHcm91cDsKLSAgICAgICAgY2hTZmJDbnQgICAgICAgICA9ICBwQ2hTZWN0aW9uRGF0YS0+c2ZiQ250OwotICAgICAgICBjaEZpcnN0U2NmICAgICAgID0gIHBDaFNjZltwQ2hTZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdOwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgaWYgKG1pbkNudCA9PSAwKSB7CisgICAgICBpZiAocWNPdXRDaGFubmVsICE9IE5VTEwpIHsKKyAgICAgICAgcENoU2VjdGlvbkRhdGEgPSAmKHFjT3V0Q2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhKTsKKyAgICAgICAgcENoU2NmID0gcWNPdXRDaGFubmVsW2NoXS0+c2NmOworICAgICAgICBjaEdsb2JhbEdhaW4gPSBxY091dENoYW5uZWxbY2hdLT5nbG9iYWxHYWluOworICAgICAgICBwQ2hNYXhWYWx1ZUluU2ZiID0gcWNPdXRDaGFubmVsW2NoXS0+bWF4VmFsdWVJblNmYjsKKyAgICAgICAgY2hCbG9ja1R5cGUgPSBwQ2hTZWN0aW9uRGF0YS0+YmxvY2tUeXBlOworICAgICAgICBjaE1heFNmYlBlckdycCA9IHBDaFNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cDsKKyAgICAgICAgY2hTZmJQZXJHcnAgPSBwQ2hTZWN0aW9uRGF0YS0+c2ZiUGVyR3JvdXA7CisgICAgICAgIGNoU2ZiQ250ID0gcENoU2VjdGlvbkRhdGEtPnNmYkNudDsKKyAgICAgICAgY2hGaXJzdFNjZiA9IHBDaFNjZltwQ2hTZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdOworICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogZ2V0IHZhbHVlcyBmcm9tIFBTWSAqLwotICAgICAgICBjaFNmYkNudCAgICAgICA9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7Ci0gICAgICAgIGNoU2ZiUGVyR3JwICAgID0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOworICAgICAgICBjaFNmYkNudCA9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7CisgICAgICAgIGNoU2ZiUGVyR3JwID0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOwogICAgICAgICBjaE1heFNmYlBlckdycCA9IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsKICAgICAgIH0KICAgICAgIHBUbnNJbmZvID0gJnBzeU91dENoYW5uZWxbY2hdLT50bnNJbmZvOwogICAgIH0gLyogbWluQ250PT0wICovCiAKLSAgICBpZiAoIHFjT3V0Q2hhbm5lbD09TlVMTCApIHsKLSAgICAgIGNoQmxvY2tUeXBlICAgID0gcHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZTsKKyAgICBpZiAocWNPdXRDaGFubmVsID09IE5VTEwpIHsKKyAgICAgIGNoQmxvY2tUeXBlID0gcHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZTsKICAgICB9CiAKLSAgICBzd2l0Y2ggKGxpc3QtPmlkW2ldKQotICAgIHsKLSAgICBjYXNlIGVsZW1lbnRfaW5zdGFuY2VfdGFnOgotICAgICAgLyogV3JpdGUgZWxlbWVudCBpbnN0YW5jZSB0YWcgKi8KLSAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHBFbEluZm8tPmluc3RhbmNlVGFnLCA0KTsKLSAgICAgIH0KLSAgICAgIGJpdERlbWFuZCArPSA0OwotICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChsaXN0LT5pZFtpXSkgeworICAgICAgY2FzZSBlbGVtZW50X2luc3RhbmNlX3RhZzoKKyAgICAgICAgLyogV3JpdGUgZWxlbWVudCBpbnN0YW5jZSB0YWcgKi8KKyAgICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBwRWxJbmZvLT5pbnN0YW5jZVRhZywgNCk7CisgICAgICAgIH0KKyAgICAgICAgYml0RGVtYW5kICs9IDQ7CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBjb21tb25fd2luZG93OgotICAgICAgLyogV3JpdGUgY29tbW9uIHdpbmRvdyBmbGFnICovCi0gICAgICBkZWNpc2lvbl9iaXQgPSBwc3lPdXRFbGVtZW50LT5jb21tb25XaW5kb3c7Ci0gICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBwc3lPdXRFbGVtZW50LT5jb21tb25XaW5kb3csIDEpOwotICAgICAgfQotICAgICAgYml0RGVtYW5kICs9IDE7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgY29tbW9uX3dpbmRvdzoKKyAgICAgICAgLyogV3JpdGUgY29tbW9uIHdpbmRvdyBmbGFnICovCisgICAgICAgIGRlY2lzaW9uX2JpdCA9IHBzeU91dEVsZW1lbnQtPmNvbW1vbldpbmRvdzsKKyAgICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBwc3lPdXRFbGVtZW50LT5jb21tb25XaW5kb3csIDEpOworICAgICAgICB9CisgICAgICAgIGJpdERlbWFuZCArPSAxOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgaWNzX2luZm86Ci0gICAgICAvKiBXcml0ZSBpbmRpdmlkdWFsIGNoYW5uZWwgaW5mbyAqLwotICAgICAgYml0RGVtYW5kICs9IEZES2FhY0VuY19lbmNvZGVJY3NJbmZvKCBjaEJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPndpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+Z3JvdXBpbmdNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaE1heFNmYlBlckdycCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MpOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIGljc19pbmZvOgorICAgICAgICAvKiBXcml0ZSBpbmRpdmlkdWFsIGNoYW5uZWwgaW5mbyAqLworICAgICAgICBiaXREZW1hbmQgKz0KKyAgICAgICAgICAgIEZES2FhY0VuY19lbmNvZGVJY3NJbmZvKGNoQmxvY2tUeXBlLCBwc3lPdXRDaGFubmVsW2NoXS0+d2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+Z3JvdXBpbmdNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hNYXhTZmJQZXJHcnAsIGhCaXRTdHJlYW0sIHN5bnRheEZsYWdzKTsKKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIGx0cF9kYXRhX3ByZXNlbnQ6Ci0gICAgICAvKiBXcml0ZSBMVFAgZGF0YSBwcmVzZW50IGZsYWcgKi8KLSAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOwotICAgICAgfQotICAgICAgYml0RGVtYW5kICs9IDE7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgbHRwX2RhdGFfcHJlc2VudDoKKyAgICAgICAgLyogV3JpdGUgTFRQIGRhdGEgcHJlc2VudCBmbGFnICovCisgICAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgYml0RGVtYW5kICs9IDE7CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBsdHBfZGF0YToKLSAgICAgIC8qIFByZWRpY3RvciBkYXRhIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAgICBOb3RoaW5nIHRvIGRvIGhlcmUuICovCi0gICAgICBicmVhazsKKyAgICAgIGNhc2UgbHRwX2RhdGE6CisgICAgICAgIC8qIFByZWRpY3RvciBkYXRhIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgIE5vdGhpbmcgdG8gZG8gaGVyZS4gKi8KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIG1zOgotICAgICAgLyogV3JpdGUgTVMgaW5mbyAqLwotICAgICAgYml0RGVtYW5kICs9IEZES2FhY0VuY19lbmNvZGVNU0luZm8oIGNoU2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoU2ZiUGVyR3JwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoTWF4U2ZiUGVyR3JwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DbnQ9PTApID8gcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0IDogTVNfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIG1zOgorICAgICAgICAvKiBXcml0ZSBNUyBpbmZvICovCisgICAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlTVNJbmZvKAorICAgICAgICAgICAgY2hTZmJDbnQsIGNoU2ZiUGVyR3JwLCBjaE1heFNmYlBlckdycCwKKyAgICAgICAgICAgIChtaW5DbnQgPT0gMCkgPyBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QgOiBNU19OT05FLAorICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywgaEJpdFN0cmVhbSk7CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBnbG9iYWxfZ2FpbjoKLSAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlR2xvYmFsR2FpbiggY2hHbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEZpcnN0U2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bWRjdFNjYWxlICk7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgZ2xvYmFsX2dhaW46CisgICAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlR2xvYmFsR2FpbigKKyAgICAgICAgICAgIGNoR2xvYmFsR2FpbiwgY2hGaXJzdFNjZiwgaEJpdFN0cmVhbSwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1kY3RTY2FsZSk7CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBzZWN0aW9uX2RhdGE6Ci0gICAgICB7Ci0gICAgICAgIElOVCBzaUJpdHMgPSBGREthYWNFbmNfZW5jb2RlU2VjdGlvbkRhdGEocENoU2VjdGlvbkRhdGEsIGhCaXRTdHJlYW0sIChzeW50YXhGbGFncyAmIEFDX0VSX1ZDQjExKT8xOjApOworICAgICAgY2FzZSBzZWN0aW9uX2RhdGE6IHsKKyAgICAgICAgSU5UIHNpQml0cyA9IEZES2FhY0VuY19lbmNvZGVTZWN0aW9uRGF0YSgKKyAgICAgICAgICAgIHBDaFNlY3Rpb25EYXRhLCBoQml0U3RyZWFtLCAoc3ludGF4RmxhZ3MgJiBBQ19FUl9WQ0IxMSkgPyAxIDogMCk7CiAgICAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKICAgICAgICAgICBpZiAoc2lCaXRzICE9IHFjT3V0Q2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLnNpZGVJbmZvQml0cykgewogICAgICAgICAgICAgZXJyb3IgPSBBQUNfRU5DX1dSSVRFX1NFQ19FUlJPUjsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYml0RGVtYW5kICs9IHNpQml0czsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworICAgICAgfSBicmVhazsKIAotICAgIGNhc2Ugc2NhbGVfZmFjdG9yX2RhdGE6Ci0gICAgICB7Ci0gICAgICAgIElOVCBzZkRhdGFCaXRzID0gRkRLYWFjRW5jX2VuY29kZVNjYWxlRmFjdG9yRGF0YSggcENoTWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hTZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hTY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bm9pc2VOcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmlzU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hHbG9iYWxHYWluICk7Ci0gICAgICAgIGlmICggKGhCaXRTdHJlYW0gIT0gTlVMTCkKLSAgICAgICAgICAmJiAoc2ZEYXRhQml0cyAhPSAocWNPdXRDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuc2NhbGVmYWNCaXRzICsgcWNPdXRDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubm9pc2VOcmdCaXRzKSkgKSB7Ci0gICAgICAgICAgIGVycm9yID0gQUFDX0VOQ19XUklURV9TQ0FMX0VSUk9SOworICAgICAgY2FzZSBzY2FsZV9mYWN0b3JfZGF0YTogeworICAgICAgICBJTlQgc2ZEYXRhQml0cyA9IEZES2FhY0VuY19lbmNvZGVTY2FsZUZhY3RvckRhdGEoCisgICAgICAgICAgICBwQ2hNYXhWYWx1ZUluU2ZiLCBwQ2hTZWN0aW9uRGF0YSwgcENoU2NmLCBoQml0U3RyZWFtLAorICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm5vaXNlTnJnLCBwc3lPdXRDaGFubmVsW2NoXS0+aXNTY2FsZSwKKyAgICAgICAgICAgIGNoR2xvYmFsR2Fpbik7CisgICAgICAgIGlmICgoaEJpdFN0cmVhbSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgKHNmRGF0YUJpdHMgIT0gKHFjT3V0Q2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLnNjYWxlZmFjQml0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubm9pc2VOcmdCaXRzKSkpIHsKKyAgICAgICAgICBlcnJvciA9IEFBQ19FTkNfV1JJVEVfU0NBTF9FUlJPUjsKICAgICAgICAgfQogICAgICAgICBiaXREZW1hbmQgKz0gc2ZEYXRhQml0czsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworICAgICAgfSBicmVhazsKIAotICAgIGNhc2UgZXNjMl9ydmxjOgotICAgICAgaWYgKHN5bnRheEZsYWdzICYgQUNfRVJfUlZMQykgewotICAgICAgICAvKiB3cml0ZSBSVkxDIGRhdGEgaW50byBiaXRzdHJlYW0gKGVycm9yIHNlbnMuIGNhdC4gMikgKi8KLSAgICAgICAgZXJyb3IgPSBBQUNfRU5DX1VOU1VQUE9SVEVEX0FPVDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBwdWxzZToKLSAgICAgIC8qIFdyaXRlIHB1bHNlIGRhdGEgKi8KLSAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlUHVsc2VEYXRhKGhCaXRTdHJlYW0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHRuc19kYXRhX3ByZXNlbnQ6Ci0gICAgICAvKiBXcml0ZSBUTlMgZGF0YSBwcmVzZW50IGZsYWcgKi8KLSAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlVG5zRGF0YVByZXNlbnQocFRuc0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQmxvY2tUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdG5zX2RhdGE6Ci0gICAgICAvKiBXcml0ZSBUTlMgZGF0YSAqLwotICAgICAgYml0RGVtYW5kICs9IEZES2FhY0VuY19lbmNvZGVUbnNEYXRhKHBUbnNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQmxvY2tUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGdhaW5fY29udHJvbF9kYXRhOgotICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudDoKLSAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlR2FpbkNvbnRyb2xEYXRhKGhCaXRTdHJlYW0pOwotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgZXNjMV9oY3I6Ci0gICAgICBpZiAoc3ludGF4RmxhZ3MgJiBBQ19FUl9IQ1IpCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gQUFDX0VOQ19VTktOT1dOOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHNwZWN0cmFsX2RhdGE6Ci0gICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKQotICAgICAgewotICAgICAgICBJTlQgc3BlY3RyYWxCaXRzID0gMDsKLQotICAgICAgICAgIHNwZWN0cmFsQml0cyA9IEZES2FhY0VuY19lbmNvZGVTcGVjdHJhbERhdGEoIHBzeU91dENoYW5uZWxbY2hdLT5zZmJPZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaFNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtICk7Ci0KLSAgICAgICAgaWYgKHNwZWN0cmFsQml0cyAhPSBxY091dENoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmbWFuQml0cykgewotICAgICAgICAgIHJldHVybiBBQUNfRU5DX1dSSVRFX1NQRUNfRVJST1I7CisgICAgICBjYXNlIGVzYzJfcnZsYzoKKyAgICAgICAgaWYgKHN5bnRheEZsYWdzICYgQUNfRVJfUlZMQykgeworICAgICAgICAgIC8qIHdyaXRlIFJWTEMgZGF0YSBpbnRvIGJpdHN0cmVhbSAoZXJyb3Igc2Vucy4gY2F0LiAyKSAqLworICAgICAgICAgIGVycm9yID0gQUFDX0VOQ19VTlNVUFBPUlRFRF9BT1Q7CiAgICAgICAgIH0KLSAgICAgICAgYml0RGVtYW5kICs9IHNwZWN0cmFsQml0czsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworICAgICAgICBicmVhazsKIAotICAgICAgLyogTm9uIGRhdGEgY2FzZXMgKi8KLSAgICBjYXNlIGFkdHNjcmNfc3RhcnRfcmVnMToKLSAgICAgIGlmIChoVHBFbmMgIT0gTlVMTCkgewotICAgICAgICBjcmNSZWcxID0gdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKGhUcEVuYywgMTkyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYWR0c2NyY19zdGFydF9yZWcyOgotICAgICAgaWYgKGhUcEVuYyAhPSBOVUxMKSB7Ci0gICAgICAgIGNyY1JlZzIgPSB0cmFuc3BvcnRFbmNfQ3JjU3RhcnRSZWcoaFRwRW5jLCAxMjgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBhZHRzY3JjX2VuZF9yZWcxOgotICAgIGNhc2UgZHJtY3JjX2VuZF9yZWc6Ci0gICAgICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKLSAgICAgICAgdHJhbnNwb3J0RW5jX0NyY0VuZFJlZyhoVHBFbmMsIGNyY1JlZzEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBhZHRzY3JjX2VuZF9yZWcyOgotICAgICAgaWYgKGhUcEVuYyAhPSBOVUxMKSB7Ci0gICAgICAgIHRyYW5zcG9ydEVuY19DcmNFbmRSZWcoaFRwRW5jLCBjcmNSZWcyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZHJtY3JjX3N0YXJ0X3JlZzoKLSAgICAgIGlmIChoVHBFbmMgIT0gTlVMTCkgewotICAgICAgICBjcmNSZWcxID0gdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKGhUcEVuYywgMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG5leHRfY2hhbm5lbDoKLSAgICAgIGNoID0gKGNoICsgMSkgJSBudW1iZXJPZkNoYW5uZWxzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsaW5rX3NlcXVlbmNlOgotICAgICAgbGlzdCA9IGxpc3QtPm5leHRbZGVjaXNpb25fYml0XTsKLSAgICAgIGk9LTE7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgcHVsc2U6CisgICAgICAgIC8qIFdyaXRlIHB1bHNlIGRhdGEgKi8KKyAgICAgICAgYml0RGVtYW5kICs9IEZES2FhY0VuY19lbmNvZGVQdWxzZURhdGEoaEJpdFN0cmVhbSk7CisgICAgICAgIGJyZWFrOwogCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gQUFDX0VOQ19VTktOT1dOOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRuc19kYXRhX3ByZXNlbnQ6CisgICAgICAgIC8qIFdyaXRlIFROUyBkYXRhIHByZXNlbnQgZmxhZyAqLworICAgICAgICBiaXREZW1hbmQgKz0KKyAgICAgICAgICAgIEZES2FhY0VuY19lbmNvZGVUbnNEYXRhUHJlc2VudChwVG5zSW5mbywgY2hCbG9ja1R5cGUsIGhCaXRTdHJlYW0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdG5zX2RhdGE6CisgICAgICAgIC8qIFdyaXRlIFROUyBkYXRhICovCisgICAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlVG5zRGF0YShwVG5zSW5mbywgY2hCbG9ja1R5cGUsIGhCaXRTdHJlYW0pOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBnYWluX2NvbnRyb2xfZGF0YToKKyAgICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQ6CisgICAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlR2FpbkNvbnRyb2xEYXRhKGhCaXRTdHJlYW0pOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBlc2MxX2hjcjoKKyAgICAgICAgaWYgKHN5bnRheEZsYWdzICYgQUNfRVJfSENSKSB7CisgICAgICAgICAgZXJyb3IgPSBBQUNfRU5DX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Ugc3BlY3RyYWxfZGF0YToKKyAgICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgIElOVCBzcGVjdHJhbEJpdHMgPSAwOworCisgICAgICAgICAgc3BlY3RyYWxCaXRzID0gRkRLYWFjRW5jX2VuY29kZVNwZWN0cmFsRGF0YSgKKyAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk9mZnNldHMsIHBDaFNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5xdWFudFNwZWMsIGhCaXRTdHJlYW0pOworCisgICAgICAgICAgaWYgKHNwZWN0cmFsQml0cyAhPSBxY091dENoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmbWFuQml0cykgeworICAgICAgICAgICAgcmV0dXJuIEFBQ19FTkNfV1JJVEVfU1BFQ19FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgICAgYml0RGVtYW5kICs9IHNwZWN0cmFsQml0czsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICAvKiBOb24gZGF0YSBjYXNlcyAqLworICAgICAgY2FzZSBhZHRzY3JjX3N0YXJ0X3JlZzE6CisgICAgICAgIGlmIChoVHBFbmMgIT0gTlVMTCkgeworICAgICAgICAgIGNyY1JlZzEgPSB0cmFuc3BvcnRFbmNfQ3JjU3RhcnRSZWcoaFRwRW5jLCAxOTIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBhZHRzY3JjX3N0YXJ0X3JlZzI6CisgICAgICAgIGlmIChoVHBFbmMgIT0gTlVMTCkgeworICAgICAgICAgIGNyY1JlZzIgPSB0cmFuc3BvcnRFbmNfQ3JjU3RhcnRSZWcoaFRwRW5jLCAxMjgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBhZHRzY3JjX2VuZF9yZWcxOgorICAgICAgY2FzZSBkcm1jcmNfZW5kX3JlZzoKKyAgICAgICAgaWYgKGhUcEVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgdHJhbnNwb3J0RW5jX0NyY0VuZFJlZyhoVHBFbmMsIGNyY1JlZzEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBhZHRzY3JjX2VuZF9yZWcyOgorICAgICAgICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKKyAgICAgICAgICB0cmFuc3BvcnRFbmNfQ3JjRW5kUmVnKGhUcEVuYywgY3JjUmVnMik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGRybWNyY19zdGFydF9yZWc6CisgICAgICAgIGlmIChoVHBFbmMgIT0gTlVMTCkgeworICAgICAgICAgIGNyY1JlZzEgPSB0cmFuc3BvcnRFbmNfQ3JjU3RhcnRSZWcoaFRwRW5jLCAwKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbmV4dF9jaGFubmVsOgorICAgICAgICBjaCA9IChjaCArIDEpICUgbnVtYmVyT2ZDaGFubmVsczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGxpbmtfc2VxdWVuY2U6CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0W2RlY2lzaW9uX2JpdF07CisgICAgICAgIGkgPSAtMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGVycm9yID0gQUFDX0VOQ19VTktOT1dOOworICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBpZiAoZXJyb3IgIT0gQUFDX0VOQ19PSykgewpAQCAtMTI3NSwyNCArMTE3NSwxOSBAQAogICByZXR1cm4gZXJyb3I7CiB9CiAKLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfV3JpdGVCaXRzdHJlYW0oSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjaGFubmVsTWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKnFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQqIHBzeU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKnFjT3V0LCBQU1lfT1VUICpwc3lPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfU1RBVEUgKnFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgIGVwQ29uZmlnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc3ludGF4RmxhZ3MsIFNDSEFSIGVwQ29uZmlnKSB7CiAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9IHRyYW5zcG9ydEVuY19HZXRCaXRzdHJlYW0oaFRwRW5jKTsKICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX09LOwotICBpbnQgICBpLCBuLCBkb0J5dGVBbGlnbiA9IDE7Ci0gIElOVCAgIGJpdE1hcmtVcDsKLSAgSU5UICAgZnJhbWVCaXRzOworICBpbnQgaSwgbiwgZG9CeXRlQWxpZ24gPSAxOworICBJTlQgYml0TWFya1VwOworICBJTlQgZnJhbWVCaXRzOwogICAvKiBHZXQgZmlyc3QgYml0IG9mIHJhdyBkYXRhIGJsb2NrLgogICAgICBJbiBjYXNlIG9mIEFEVFMrUENFLCBBVSB3b3VsZCBzdGFydCBhdCBQQ0UuCiAgICAgIFRoaXMgaXMgb2theSBiZWNhdXNlIFBDRSBhc3N1cmVzIGFsaWdubWVudC4gKi8KQEAgLTEzMDAsMTYwICsxMTk1LDExMiBAQAogCiAgIGZyYW1lQml0cyA9IGJpdE1hcmtVcCA9IGFsaWduQW5jaG9yOwogCi0KICAgLyogQ2hhbm5lbCBlbGVtZW50IGxvb3AgKi8KLSAgZm9yIChpPTA7IGk8Y2hhbm5lbE1hcHBpbmctPm5FbGVtZW50czsgaSsrKSB7Ci0KKyAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHM7IGkrKykgewogICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2ldOwogICAgIElOVCBlbGVtZW50VXNlZEJpdHMgPSAwOwogCi0gICAgc3dpdGNoIChlbEluZm8uZWxUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBJRF9TQ0U6ICAgICAgLyogc2luZ2xlIGNoYW5uZWwgKi8KLSAgICAgICAgY2FzZSBJRF9DUEU6ICAgICAgLyogY2hhbm5lbCBwYWlyICovCi0gICAgICAgIGNhc2UgSURfTEZFOiAgICAgIC8qIGxvdyBmcmVxIGVmZmVjdHMgY2hhbm5lbCAqLwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBBQUNfRU5DX09LICE9IChFcnJvclN0YXR1cyA9IEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKCBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbaV0tPnFjT3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXQtPnBzeU91dEVsZW1lbnRbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLCAgIC8qIHN5bnRheEZsYWdzIChFUiB0b29scyAuLi4pICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LCAgICAgICAgICAgLyogYW90OiBBT1RfQUFDX0xDLCBBT1RfU0JSLCBBT1RfUFMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZywgICAgICAvKiBlcENvbmZpZyAtMSwgMCwgMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwotICAgICAgICAgIH0KKyAgICBzd2l0Y2ggKGVsSW5mby5lbFR5cGUpIHsKKyAgICAgIGNhc2UgSURfU0NFOiAvKiBzaW5nbGUgY2hhbm5lbCAqLworICAgICAgY2FzZSBJRF9DUEU6IC8qIGNoYW5uZWwgcGFpciAqLworICAgICAgY2FzZSBJRF9MRkU6IC8qIGxvdyBmcmVxIGVmZmVjdHMgY2hhbm5lbCAqLworICAgICAgeworICAgICAgICBpZiAoQUFDX0VOQ19PSyAhPQorICAgICAgICAgICAgKEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0NoYW5uZWxFbGVtZW50V3JpdGUoCisgICAgICAgICAgICAgICAgIGhUcEVuYywgJmVsSW5mbywgcWNPdXQtPnFjRWxlbWVudFtpXS0+cWNPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICBwc3lPdXQtPnBzeU91dEVsZW1lbnRbaV0sCisgICAgICAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsIC8qIHN5bnRheEZsYWdzIChFUiB0b29scyAuLi4pICovCisgICAgICAgICAgICAgICAgIGFvdCwgICAgICAgICAvKiBhb3Q6IEFPVF9BQUNfTEMsIEFPVF9TQlIsIEFPVF9QUyAqLworICAgICAgICAgICAgICAgICBlcENvbmZpZywgICAgLyogZXBDb25maWcgLTEsIDAsIDEgKi8KKyAgICAgICAgICAgICAgICAgTlVMTCwgMCkpKSB7CisgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworICAgICAgICB9CiAKLSAgICAgICAgICBpZiAoICEoc3ludGF4RmxhZ3MgJiBBQ19FUikgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdyaXRlIGFzc29jaWF0ZWQgZXh0ZW5zaW9uIHBheWxvYWQgKi8KLSAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBxY091dC0+cWNFbGVtZW50W2ldLT5uRXh0ZW5zaW9uczsgbisrKSB7Ci0gICAgICAgICAgICAgIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXQtPnFjRWxlbWVudFtpXS0+ZXh0ZW5zaW9uW25dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkFuY2hvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcgKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCEoc3ludGF4RmxhZ3MgJiBBQ19FUikpIHsKKyAgICAgICAgICAvKiBXcml0ZSBhc3NvY2lhdGVkIGV4dGVuc2lvbiBwYXlsb2FkICovCisgICAgICAgICAgZm9yIChuID0gMDsgbiA8IHFjT3V0LT5xY0VsZW1lbnRbaV0tPm5FeHRlbnNpb25zOyBuKyspIHsKKyAgICAgICAgICAgIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoCisgICAgICAgICAgICAgICAgaFRwRW5jLCAmcWNPdXQtPnFjRWxlbWVudFtpXS0+ZXh0ZW5zaW9uW25dLCAwLCBhbGlnbkFuY2hvciwKKyAgICAgICAgICAgICAgICBzeW50YXhGbGFncywgYW90LCBlcENvbmZpZyk7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgfSBicmVhazsKIAotICAgICAgICAvKiBJbiBGREssIERTRSBzaWduYWxsaW5nIGV4cGxpY2l0IGRvbmUgaW4gZWxEU0UuIFNlZSBjaGFubmVsX21hcC5jcHAgKi8KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gQUFDX0VOQ19JTlZBTElEX0VMRU1FTlRJTkZPX1RZUEU7CisgICAgICAvKiBJbiBGREssIERTRSBzaWduYWxsaW5nIGV4cGxpY2l0IGRvbmUgaW4gZWxEU0UuIFNlZSBjaGFubmVsX21hcC5jcHAgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfRUxFTUVOVElORk9fVFlQRTsKIAotICAgIH0gICAvKiBzd2l0Y2ggKi8KKyAgICB9IC8qIHN3aXRjaCAqLwogCi0gICAgaWYoZWxJbmZvLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICBpZiAoZWxJbmZvLmVsVHlwZSAhPSBJRF9EU0UpIHsKICAgICAgIGVsZW1lbnRVc2VkQml0cyAtPSBiaXRNYXJrVXA7Ci0gICAgICBiaXRNYXJrVXAgICAgICAgID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgICAgICBiaXRNYXJrVXAgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKICAgICAgIGVsZW1lbnRVc2VkQml0cyArPSBiaXRNYXJrVXA7Ci0gICAgICBmcmFtZUJpdHMgICAgICAgKz0gZWxlbWVudFVzZWRCaXRzOworICAgICAgZnJhbWVCaXRzICs9IGVsZW1lbnRVc2VkQml0czsKICAgICB9CiAKICAgfSAvKiBmb3IgKGk9MDsgaTxjaGFubmVsTWFwcGluZy5uRWxlbWVudHM7IGkrKykgKi8KIAotICBpZiAoIChzeW50YXhGbGFncyAmIEFDX0VSKSAmJiAhKHN5bnRheEZsYWdzICYgQUNfRFJNKSApCi0gIHsKLSAgICBVQ0hBUiBjaGFubmVsRWxlbWVudEV4dGVuc2lvbldyaXR0ZW5bKDgpXVsoMSldOyAvKiAwOiBleHRlbnNpb24gbm90IHRvdWNoZWQsIDE6IGV4dGVuc2lvbiBhbHJlYWR5IHdyaXR0ZW4gKi8KKyAgaWYgKChzeW50YXhGbGFncyAmIEFDX0VSKSAmJiAhKHN5bnRheEZsYWdzICYgQUNfRFJNKSkgeworICAgIFVDSEFSIGNoYW5uZWxFbGVtZW50RXh0ZW5zaW9uV3JpdHRlblsoKDgpKV1bKAorICAgICAgICAxKV07IC8qIDA6IGV4dGVuc2lvbiBub3QgdG91Y2hlZCwgMTogZXh0ZW5zaW9uIGFscmVhZHkgd3JpdHRlbiAqLwogCi0gICAgRkRLbWVtY2xlYXIoY2hhbm5lbEVsZW1lbnRFeHRlbnNpb25Xcml0dGVuLCBzaXplb2YoY2hhbm5lbEVsZW1lbnRFeHRlbnNpb25Xcml0dGVuKSk7CisgICAgRkRLbWVtY2xlYXIoY2hhbm5lbEVsZW1lbnRFeHRlbnNpb25Xcml0dGVuLAorICAgICAgICAgICAgICAgIHNpemVvZihjaGFubmVsRWxlbWVudEV4dGVuc2lvbldyaXR0ZW4pKTsKIAotICAgIGlmICggc3ludGF4RmxhZ3MgJiBBQ19FTEQgKSB7Ci0KLSAgICAgIGZvciAoaT0wOyBpPGNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHM7IGkrKykgeworICAgIGlmIChzeW50YXhGbGFncyAmIEFDX0VMRCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHM7IGkrKykgewogICAgICAgICBmb3IgKG4gPSAwOyBuIDwgcWNPdXQtPnFjRWxlbWVudFtpXS0+bkV4dGVuc2lvbnM7IG4rKykgewotCi0gICAgICAgICAgaWYgKCAocWNPdXQtPnFjRWxlbWVudFtpXS0+ZXh0ZW5zaW9uW25dLnR5cGU9PUVYVF9TQlJfREFUQSkKLSAgICAgICAgICAgIHx8IChxY091dC0+cWNFbGVtZW50W2ldLT5leHRlbnNpb25bbl0udHlwZT09RVhUX1NCUl9EQVRBX0NSQykgKQotICAgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHFjT3V0LT5xY0VsZW1lbnRbaV0tPmV4dGVuc2lvbltuXS50eXBlID09IEVYVF9TQlJfREFUQSkgfHwKKyAgICAgICAgICAgICAgKHFjT3V0LT5xY0VsZW1lbnRbaV0tPmV4dGVuc2lvbltuXS50eXBlID09IEVYVF9TQlJfREFUQV9DUkMpKSB7CiAgICAgICAgICAgICAvKiBXcml0ZSBzYnIgZXh0ZW5zaW9uIHBheWxvYWQgKi8KLSAgICAgICAgICAgIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0LT5xY0VsZW1lbnRbaV0tPmV4dGVuc2lvbltuXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkFuY2hvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcgKTsKKyAgICAgICAgICAgIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoCisgICAgICAgICAgICAgICAgaFRwRW5jLCAmcWNPdXQtPnFjRWxlbWVudFtpXS0+ZXh0ZW5zaW9uW25dLCAwLCBhbGlnbkFuY2hvciwKKyAgICAgICAgICAgICAgICBzeW50YXhGbGFncywgYW90LCBlcENvbmZpZyk7CiAKICAgICAgICAgICAgIGNoYW5uZWxFbGVtZW50RXh0ZW5zaW9uV3JpdHRlbltpXVtuXSA9IDE7CiAgICAgICAgICAgfSAvKiBTQlIgKi8KLSAgICAgICAgfSAvKiBuICovCi0gICAgICB9IC8qIGkgKi8KLSAgICB9IC8qIEFDX0VMRCAqLworICAgICAgICB9ICAgLyogbiAqLworICAgICAgfSAgICAgLyogaSAqLworICAgIH0gICAgICAgLyogQUNfRUxEICovCiAKLSAgICBmb3IgKGk9MDsgaTxjaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbE1hcHBpbmctPm5FbGVtZW50czsgaSsrKSB7CiAgICAgICBmb3IgKG4gPSAwOyBuIDwgcWNPdXQtPnFjRWxlbWVudFtpXS0+bkV4dGVuc2lvbnM7IG4rKykgewotCi0gICAgICAgIGlmIChjaGFubmVsRWxlbWVudEV4dGVuc2lvbldyaXR0ZW5baV1bbl09PTApCi0gICAgICAgIHsKKyAgICAgICAgaWYgKGNoYW5uZWxFbGVtZW50RXh0ZW5zaW9uV3JpdHRlbltpXVtuXSA9PSAwKSB7CiAgICAgICAgICAgLyogV3JpdGUgYWxsIHJhbWFpbmluZyBleHRlbnNpb24gcGF5bG9hZHMgaW4gZWxlbWVudCAqLwotICAgICAgICAgIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+cWNFbGVtZW50W2ldLT5leHRlbnNpb25bbl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkFuY2hvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcgKTsKKyAgICAgICAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+cWNFbGVtZW50W2ldLT5leHRlbnNpb25bbl0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkFuY2hvciwgc3ludGF4RmxhZ3MsIGFvdCwgZXBDb25maWcpOwogICAgICAgICB9CiAgICAgICB9IC8qIG4gKi8KLSAgICB9IC8qIGkgKi8KLSAgfSAvKiBpZiBBQ19FUiAqLworICAgIH0gICAvKiBpICovCisgIH0gICAgIC8qIGlmIEFDX0VSICovCiAKICAgLyogRXh0ZW5kIGdsb2JhbCBleHRlbnNpb24gcGF5bG9hZCB0YWJsZSB3aXRoIGZpbGwgYml0cyAqLwotICBpZiAoIHN5bnRheEZsYWdzICYgQUNfRFJNICkKLSAgewotICAgIC8qIEV4Y2VwdGlvbiBmb3IgRHJtICovCi0gICAgZm9yIChuID0gMDsgbiA8IHFjT3V0LT5uRXh0ZW5zaW9uczsgbisrKSB7Ci0gICAgICBpZiAoIChxY091dC0+ZXh0ZW5zaW9uW25dLnR5cGUgPT0gRVhUX1NCUl9EQVRBKQotICAgICAgICB8fCAocWNPdXQtPmV4dGVuc2lvbltuXS50eXBlID09IEVYVF9TQlJfREFUQV9DUkMpICkgewotICAgICAgICAvKiBTQlIgZGF0YSBtdXN0IGJlIHRoZSBsYXN0IGV4dGVuc2lvbiEgKi8KLSAgICAgICAgRkRLbWVtY3B5KCZxY091dC0+ZXh0ZW5zaW9uW3FjT3V0LT5uRXh0ZW5zaW9uc10sICZxY091dC0+ZXh0ZW5zaW9uW25dLCBzaXplb2YoUUNfT1VUX0VYVEVOU0lPTikpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogRG8gYnl0ZSBhbGlnbm1lbnQgYWZ0ZXIgQUFDICgrIE1QUykgcGF5bG9hZC4KLSAgICAgICBBc3N1cmUgdGhhdCBNUFMgaGFzIGJlZW4gd3JpdHRlbiBhcyBjaGFubmVsIGFzc2lnbmVkIGV4dGVuc2lvbiBwYXlsb2FkISAqLwotICAgIGlmICgoKEZES2dldFZhbGlkQml0cyhoQnMpLWFsaWduQW5jaG9yKyhVSU5UKXFjT3V0LT50b3RGaWxsQml0cykmMHg3KSE9KFVJTlQpcWNPdXQtPmFsaWduQml0cykgewotICAgICAgcmV0dXJuIEFBQ19FTkNfV1JJVFRFTl9CSVRTX0VSUk9SOwotICAgIH0KLSAgICBGREthYWNFbmNfQnl0ZUFsaWdubWVudChoQnMsIHFjT3V0LT5hbGlnbkJpdHMpOwotICAgIGRvQnl0ZUFsaWduID0gMDsKLQotICB9IC8qIEFDX0RSTSAqLworICBuID0gcWNPdXQtPm5FeHRlbnNpb25zOwogCiAgIC8qIEFkZCBmaWxsIGRhdGEgLyBzdHVmZmluZyBiaXRzICovCi0gIG4gPSBxY091dC0+bkV4dGVuc2lvbnM7CiAgIHFjT3V0LT5leHRlbnNpb25bbl0udHlwZSA9IEVYVF9GSUxMX0RBVEE7CiAgIHFjT3V0LT5leHRlbnNpb25bbl0ublBheWxvYWRCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzOwogICBxY091dC0+bkV4dGVuc2lvbnMrKzsKIAogICAvKiBXcml0ZSBnbG9iYWwgZXh0ZW5zaW9uIHBheWxvYWQgYW5kIGZpbGwgZGF0YSAqLwotICBmb3IgKG4gPSAwOyAobiA8IHFjT3V0LT5uRXh0ZW5zaW9ucykgJiYgKG4gPCAoMisyKSk7IG4rKykKLSAgewotICAgIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+ZXh0ZW5zaW9uW25dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnICk7CisgIGZvciAobiA9IDA7IChuIDwgcWNPdXQtPm5FeHRlbnNpb25zKSAmJiAobiA8ICgyICsgMikpOyBuKyspIHsKKyAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKGhUcEVuYywgJnFjT3V0LT5leHRlbnNpb25bbl0sIDAsIGFsaWduQW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsIGFvdCwgZXBDb25maWcpOwogCi0gICAgLyogRm9yIEVYVF9GSUwgb3IgRVhUX0ZJTExfREFUQSB3ZSBjb3VsZCBkbyBhbiBhZGRpdGlvbmFsIHNhbml0eSBjaGVjayBoZXJlICovCisgICAgLyogRm9yIEVYVF9GSUwgb3IgRVhUX0ZJTExfREFUQSB3ZSBjb3VsZCBkbyBhbiBhZGRpdGlvbmFsIHNhbml0eSBjaGVjayBoZXJlCisgICAgICovCiAgIH0KIAotICBpZiAoIShzeW50YXhGbGFncyAmIChBQ19TQ0FMQUJMRXxBQ19FUikpKSB7CisgIGlmICghKHN5bnRheEZsYWdzICYgKEFDX1NDQUxBQkxFIHwgQUNfRVIpKSkgewogICAgIEZES3dyaXRlQml0cyhoQnMsIElEX0VORCwgRUxfSURfQklUUyk7CiAgIH0KIAogICBpZiAoZG9CeXRlQWxpZ24pIHsKICAgICAvKiBBc3N1cmUgYnl0ZSBhbGlnbm1lbnQqLwotICAgIGlmICgoKGFsaWduQW5jaG9yLUZES2dldFZhbGlkQml0cyhoQnMpKSYweDcpIT0oVUlOVClxY091dC0+YWxpZ25CaXRzKSB7CisgICAgaWYgKCgoRkRLZ2V0VmFsaWRCaXRzKGhCcykgLSBhbGlnbkFuY2hvciArIHFjT3V0LT5hbGlnbkJpdHMpICYgMHg3KSAhPSAwKSB7CiAgICAgICByZXR1cm4gQUFDX0VOQ19XUklUVEVOX0JJVFNfRVJST1I7CiAgICAgfQogCkBAIC0xNDY1LDEwICsxMzEyLDkgQEAKIAogICB0cmFuc3BvcnRFbmNfRW5kQWNjZXNzVW5pdChoVHBFbmMsICZmcmFtZUJpdHMpOwogCi0gIGlmIChmcmFtZUJpdHMgIT0gcWNPdXQtPnRvdGFsQml0cyArIHFjS2VybmVsLT5nbG9iSGRyQml0cyl7CisgIGlmIChmcmFtZUJpdHMgIT0gcWNPdXQtPnRvdGFsQml0cyArIHFjS2VybmVsLT5nbG9iSGRyQml0cykgewogICAgIHJldHVybiBBQUNfRU5DX1dSSVRURU5fQklUU19FUlJPUjsKICAgfQogCiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9iaXRlbmMuaCBiL2xpYkFBQ2VuYy9zcmMvYml0ZW5jLmgKaW5kZXggNDk4YmU3Yy4uNzVkYzA2OCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9iaXRlbmMuaAorKysgYi9saWJBQUNlbmMvc3JjL2JpdGVuYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDc0ICs5MCw3MCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBCaXRzdHJlYW0gZW5jb2RlcgorICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogQml0c3RyZWFtIGVuY29kZXIKIAotI2lmbmRlZiBfQklURU5DX0gKLSNkZWZpbmUgX0JJVEVOQ19ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIEJJVEVOQ19ICisjZGVmaW5lIEJJVEVOQ19ICiAKICNpbmNsdWRlICJxY19kYXRhLmgiCiAjaW5jbHVkZSAiYWFjZW5jX3Rucy5oIgogI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiICAgIC8qIG9ic29sZXRlLCB3aGVuIFBTWV9PVVQgaXMgdGhyb3duIG91dCBvZiB0aGUgV3JpdEJTLWNhbGwhICovCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiIC8qIG9ic29sZXRlLCB3aGVuIFBTWV9PVVQgaXMgdGhyb3duIG91dCBvZiB0aGUgV3JpdEJTLWNhbGwhICovCiAjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCiAjaW5jbHVkZSAiYWFjZW5jLmgiCiAKICNpbmNsdWRlICJ0cGVuY19saWIuaCIKIAotdHlwZWRlZiBlbnVtewotICBNQVhfRU5DT0RFUl9DSEFOTkVMUyAgPSA5LAotICBNQVhfQkxPQ0tfVFlQRVMgICAgICAgPSA0LAotICBNQVhfQUFDX0xBWUVSUyAgICAgICAgPSA5LAotICBNQVhfTEFZRVJTICAgICAgICAgICAgPSBNQVhfQUFDX0xBWUVSUyAgLCAvKiBvbmx5IG9uZSBjb3JlIGxheWVyIGlmIHByZXNlbnQgKi8KLSAgRklSU1RfTEFZICAgICAgICAgICAgID0gMSAgIC8qIGRlZmF1bHQgbGF5ZXIgbnVtYmVyIGZvciBBQUMgbm9uc2NhbGFibGUgKi8KK3R5cGVkZWYgZW51bSB7CisgIE1BWF9FTkNPREVSX0NIQU5ORUxTID0gOSwKKyAgTUFYX0JMT0NLX1RZUEVTID0gNCwKKyAgTUFYX0FBQ19MQVlFUlMgPSA5LAorICBNQVhfTEFZRVJTID0gTUFYX0FBQ19MQVlFUlMsIC8qIG9ubHkgb25lIGNvcmUgbGF5ZXIgaWYgcHJlc2VudCAqLworICBGSVJTVF9MQVkgPSAxICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgbGF5ZXIgbnVtYmVyIGZvciBBQUMgbm9uc2NhbGFibGUgKi8KIH0gX01BWF9DT05TVDsKIAotI2RlZmluZSBCVUZGRVJfTVhfSFVGRkNCX1NJWkUgKDMyKnNpemVvZihJTlQpKSAgLyogb3VyIEZES19iaXRidWZmZXIgbmVlZHMgc2l6ZSBvZiBwb3dlciAyICovCisjZGVmaW5lIEJVRkZFUl9NWF9IVUZGQ0JfU0laRSBcCisgICgzMiAqIHNpemVvZihJTlQpKSAvKiBvdXIgRkRLX2JpdGJ1ZmZlciBuZWVkcyBzaXplIG9mIHBvd2VyIDIgKi8KIAotI2RlZmluZSBFTF9JRF9CSVRTICAoIDMgKQotCisjZGVmaW5lIEVMX0lEX0JJVFMgKDMpCiAKIC8qKgotICogXGJyaWVmIEFyYml0cmFyeSBvcmRlciBiaXRzdHJlYW0gd3JpdGVyLiBUaGlzIGZ1bmN0aW9uIGNhbiBlaXRoZXIgYXNzZW1ibGUgYSBiaXQgc3RyZWFtCi0gKiAgICAgICAgYW5kIHdyaXRlIGludG8gdGhlIGJpdCBidWZmZXIgb2YgaFRwRW5jIG9yIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHN0YXRpYyBiaXRzIChzaWduYWwgaW5kZXBlbmRlbnQpCi0gKiAgICAgICAgVHBFbmMgaGFuZGxlIG11c3QgYmUgTlVMTCBpbiB0aGlzIGNhc2UuIE9yIGFsc28gQ2FsY3VsYXRlIHRoZSBtaW5pbXVtIHBvc3NpYmxlIG51bWJlciBvZgotICogICAgICAgIHN0YXRpYyBiaXRzIHdoaWNoIGJ5IGRpc2FibGluZyBhbGwgdG9vbHMgZS5nLiBNUywgVE5TIGFuZCBzYmZDbnQ9MC4gVGhlIG1pbkNudCBwYXJhbWV0ZXIKLSAqICAgICAgICBoYXMgdG8gYmUgMSBpbiB0aGlzIGxhdHRlciBjYXNlLgotICogXHBhcmFtIGhUcEVuYyBUcmFuc3BvcnQgZW5jb2RlciBoYW5kbGUuIElmIE5VTEwsIHRoZSBudW1iZXIgb2Ygc3RhdGljIGJpdHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvCi0gKiAgICAgICAgKnBCaXREZW1hbmQuCisgKiBcYnJpZWYgQXJiaXRyYXJ5IG9yZGVyIGJpdHN0cmVhbSB3cml0ZXIuIFRoaXMgZnVuY3Rpb24gY2FuIGVpdGhlciBhc3NlbWJsZSBhCisgKiBiaXQgc3RyZWFtIGFuZCB3cml0ZSBpbnRvIHRoZSBiaXQgYnVmZmVyIG9mIGhUcEVuYyBvciBjYWxjdWxhdGUgdGhlIG51bWJlciBvZgorICogc3RhdGljIGJpdHMgKHNpZ25hbCBpbmRlcGVuZGVudCkgVHBFbmMgaGFuZGxlIG11c3QgYmUgTlVMTCBpbiB0aGlzCisgKiBjYXNlLiBPciBhbHNvIENhbGN1bGF0ZSB0aGUgbWluaW11bSBwb3NzaWJsZSBudW1iZXIgb2Ygc3RhdGljIGJpdHMKKyAqIHdoaWNoIGJ5IGRpc2FibGluZyBhbGwgdG9vbHMgZS5nLiBNUywgVE5TIGFuZCBzYmZDbnQ9MC4gVGhlIG1pbkNudAorICogcGFyYW1ldGVyIGhhcyB0byBiZSAxIGluIHRoaXMgbGF0dGVyIGNhc2UuCisgKiBccGFyYW0gaFRwRW5jIFRyYW5zcG9ydCBlbmNvZGVyIGhhbmRsZS4gSWYgTlVMTCwgdGhlIG51bWJlciBvZiBzdGF0aWMgYml0cworICogd2lsbCBiZSByZXR1cm5lZCBpbnRvICpwQml0RGVtYW5kLgogICogXHBhcmFtIHBFbEluZm8KICAqIFxwYXJhbSBxY091dENoYW5uZWwKICAqIFxwYXJhbSBoUmVvcmRlckluZm8KICAqIFxwYXJhbSBwc3lPdXRFbGVtZW50CiAgKiBccGFyYW0gcHN5T3V0Q2hhbm5lbAotICogXHBhcmFtIHN5bnRheEZsYWdzIEJpdCBzdHJlYW0gc3ludGF4IGZsYWdzIGFzIGRlZmluZWQgaW4gRkRLX2F1ZGlvLmggKEF1ZGlvIENvZGVjIGZsYWdzKS4KKyAqIFxwYXJhbSBzeW50YXhGbGFncyBCaXQgc3RyZWFtIHN5bnRheCBmbGFncyBhcyBkZWZpbmVkIGluIEZES19hdWRpby5oIChBdWRpbworICogQ29kZWMgZmxhZ3MpLgogICogXHBhcmFtIGFvdAogICogXHBhcmFtIGVwQ29uZmlnCi0gKiBccGFyYW0gcEJpdERlbWFuZCBQb2ludGVyIHRvIGFuIGludCB3aGVyZSB0aGUgYW1vdW50IG9mIGJpdHMgaXMgcmV0dXJuZWQgaW50by4gVGhlIHJldHVybmVkIHZhbHVlCi0gKiAgICAgICAgZGVwZW5kcyBvbiBpZiBoVHBFbmMgaXMgTlVMTCBhbmQgbWluQ250LgotICogXHBhcmFtIG1pbkNudCBJZiBub24temVybyB0aGUgdmFsdWUgcmV0dXJuZWQgaW50byAqcEJpdERlbWFuZCBpcyB0aGUgYWJzb2x1dGUgbWluaW11bSByZXF1aXJlZCBhbW91bnQgb2YKLSAqICAgICAgICBzdGF0aWMgYml0cyBpbiBvcmRlciB0byB3cml0ZSBhIHZhbGlkIGJpdCBzdHJlYW0uCisgKiBccGFyYW0gcEJpdERlbWFuZCBQb2ludGVyIHRvIGFuIGludCB3aGVyZSB0aGUgYW1vdW50IG9mIGJpdHMgaXMgcmV0dXJuZWQKKyAqIGludG8uIFRoZSByZXR1cm5lZCB2YWx1ZSBkZXBlbmRzIG9uIGlmIGhUcEVuYyBpcyBOVUxMIGFuZCBtaW5DbnQuCisgKiBccGFyYW0gbWluQ250IElmIG5vbi16ZXJvIHRoZSB2YWx1ZSByZXR1cm5lZCBpbnRvICpwQml0RGVtYW5kIGlzIHRoZSBhYnNvbHV0ZQorICogbWluaW11bSByZXF1aXJlZCBhbW91bnQgb2Ygc3RhdGljIGJpdHMgaW4gb3JkZXIgdG8gd3JpdGUgYSB2YWxpZCBiaXQgc3RyZWFtLgogICogXHJldHVybiBBQUNfRU5DT0RFUl9FUlJPUiBlcnJvciBjb2RlCiAgKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKCBIQU5ETEVfVFJBTlNQT1JURU5DICBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPICAgICAgICAqcEVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgICAgICpxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgICAgICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgICAgKnBzeU91dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgZXBDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqcEJpdERlbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICBtaW5DbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKAorICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBFTEVNRU5UX0lORk8gKnBFbEluZm8sCisgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbFsoMildLCBQU1lfT1VUX0VMRU1FTlQgKnBzeU91dEVsZW1lbnQsCisgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsWygyKV0sIFVJTlQgc3ludGF4RmxhZ3MsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LCBTQ0hBUiBlcENvbmZpZywgSU5UICpwQml0RGVtYW5kLCBVQ0hBUiBtaW5DbnQpOwogLyoqCiAgKiBcYnJpZWYgV3JpdGUgYml0IHN0cmVhbSBvciBhY2NvdW50IHN0YXRpYyBiaXRzCiAgKiBccGFyYW0gaFRwRW5jIHRyYW5zcG9ydCBlbmNvZGVyIGhhbmRsZS4gSWYgTlVMTCwgdGhlIGZ1bmN0aW9uIHdpbGwKQEAgLTE2MSwyMyArMTY4LDE3IEBACiAgKiBccGFyYW0gc3ludGF4RmxhZ3MgRmxhZ3MgaW5kaWNhdGluZyBmb3JtYXQgc3BlY2lmaWMgZGV0YWlsCiAgKiBccGFyYW0gZXBDb25maWcgRXJyb3IgcHJvdGVjdGlvbiBjb25maWcKICAqLwotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1dyaXRlQml0c3RyZWFtIChIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjaGFubmVsTWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiBxY091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCogcHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSogcWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgZXBDb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1dyaXRlQml0c3RyZWFtKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY2hhbm5lbE1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUICpxY091dCwgUFNZX09VVCAqcHN5T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX1NUQVRFICpxY0tlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzeW50YXhGbGFncywgU0NIQVIgZXBDb25maWcpOwogCi1JTlQgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YSggSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FWFRFTlNJT04gICAgKnBFeHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgZWxJbnN0YW5jZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICBhbGlnbkFuY2hvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgZXBDb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0lOVCBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VYVEVOU0lPTiAqcEV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBlbEluc3RhbmNlVGFnLCBVSU5UIGFsaWduQW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzeW50YXhGbGFncywgQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgZXBDb25maWcpOwogCi0jZW5kaWYgLyogX0JJVEVOQ19IICovCisjZW5kaWYgLyogQklURU5DX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYmxvY2tfc3dpdGNoLmNwcCBiL2xpYkFBQ2VuYy9zcmMvYmxvY2tfc3dpdGNoLmNwcAppbmRleCA3YjNlMjc1Li5jMTMyMjUzIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9ibG9ja19zd2l0Y2guY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQ2MCArOTAsNDg4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyLCBUb2JpYXMgQ2hhbHVwa2EKKwogICAgRGVzY3JpcHRpb246IEJsb2NrIHN3aXRjaGluZwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqKioqKioqKioqKioqKioqIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYmxvY2tfc3dpdGNoLmgiCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAotCiAjZGVmaW5lIExPV09WX1dJTkRPVyBfTE9XT1ZfV0lORE9XCiAKIC8qKioqKioqKioqKioqKioqIGludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKiovCiAKLXN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfR2V0V2luZG93RW5lcmd5KGNvbnN0IEZJWFBfREJMIGluW10sIGNvbnN0IElOVCBibFN3V25kSWR4KTsKK3N0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfR2V0V2luZG93RW5lcmd5KGNvbnN0IEZJWFBfREJMIGluW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmxTd1duZElkeCk7CiAKIHN0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjV2luZG93RW5lcmd5KAotICAgICAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqUkVTVFJJQ1QgYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgd2luZG93TGVuLAotICAgICAgICBjb25zdCBJTlRfUENNICAgICAgICAgICAqcFRpbWVTaWduYWwKLSAgICAgICAgKTsKKyAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqUkVTVFJJQ1QgYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBJTlQgd2luZG93TGVuLAorICAgIGNvbnN0IElOVF9QQ00gKnBUaW1lU2lnbmFsKTsKIAogLyoqKioqKioqKioqKioqKioqKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcgICAgICAgICBTVEFSVCAgICAgICAgU0hPUlQgICAgICAgICBTVE9QICAgICAgICAgTE9XT1YgICAgICAgICAgICAgICAgICAqLwotc3RhdGljIGNvbnN0IElOVCBibG9ja1R5cGUyd2luZG93U2hhcGVbMl1bNV0gPSB7IHtTSU5FX1dJTkRPVywgS0JEX1dJTkRPVywgIFdST05HX1dJTkRPVywgU0lORV9XSU5ET1csIEtCRF9XSU5ET1d9LCAgICAgLyogTEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7S0JEX1dJTkRPVywgIFNJTkVfV0lORE9XLCBTSU5FX1dJTkRPVywgIEtCRF9XSU5ET1csICBXUk9OR19XSU5ET1d9IH07IC8qIExDICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcgICAgICAgICBTVEFSVAorICogU0hPUlQgICAgICAgICBTVE9QICAgICAgICAgTE9XT1YgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGNvbnN0IElOVCBibG9ja1R5cGUyd2luZG93U2hhcGVbMl1bNV0gPSB7CisgICAge1NJTkVfV0lORE9XLCBLQkRfV0lORE9XLCBXUk9OR19XSU5ET1csIFNJTkVfV0lORE9XLCBLQkRfV0lORE9XfSwgIC8qIExEICovCisgICAge0tCRF9XSU5ET1csIFNJTkVfV0lORE9XLCBTSU5FX1dJTkRPVywgS0JEX1dJTkRPVywgV1JPTkdfV0lORE9XfX07IC8qIExDICovCiAKIC8qIElJUiBoaWdoIHBhc3MgY29lZmZzICovCiAKICNpZm5kZWYgU0lORVRBQkxFXzE2QklUCiAKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBoaVBhc3NDb2VmZltCTE9DS19TV0lUQ0hJTkdfSUlSX0xFTl09Ci17Ci0gIEZMMkZYQ09OU1RfREJMKC0wLjUwOTUpLEZMMkZYQ09OU1RfREJMKDAuNzU0OCkKLX07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgaGlQYXNzQ29lZmZbQkxPQ0tfU1dJVENISU5HX0lJUl9MRU5dID0geworICAgIEZMMkZYQ09OU1RfREJMKC0wLjUwOTUpLCBGTDJGWENPTlNUX0RCTCgwLjc1NDgpfTsKIAotc3RhdGljIGNvbnN0IEZJWFBfREJMIGFjY1dpbmRvd05yZ0ZhYyA9IEZMMkZYQ09OU1RfREJMKDAuM2YpOyAgICAgICAgICAgICAgICAgICAvKiBmYWN0b3IgZm9yIGFjY3VtdWxhdGluZyBmaWx0ZXJlZCB3aW5kb3cgZW5lcmdpZXMgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBhY2NXaW5kb3dOcmdGYWMgPQorICAgIEZMMkZYQ09OU1RfREJMKDAuM2YpOyAvKiBmYWN0b3IgZm9yIGFjY3VtdWxhdGluZyBmaWx0ZXJlZCB3aW5kb3cgZW5lcmdpZXMgKi8KIHN0YXRpYyBjb25zdCBGSVhQX0RCTCBvbmVNaW51c0FjY1dpbmRvd05yZ0ZhYyA9IEZMMkZYQ09OU1RfREJMKDAuN2YpOwotLyogc3RhdGljIGNvbnN0IGZsb2F0IGF0dGFja1JhdGlvID0gMTAuMDsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb3dlciByYXRpbyBsaW1pdCBmb3IgYXR0YWNrcyAqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMIGludkF0dGFja1JhdGlvID0gRkwyRlhDT05TVF9EQkwoMC4xZik7ICAgICAgICAgICAgICAgICAgICAvKiBpbnZlcnRlZCBsb3dlciByYXRpbyBsaW1pdCBmb3IgYXR0YWNrcyAqLworLyogc3RhdGljIGNvbnN0IGZsb2F0IGF0dGFja1JhdGlvID0gMTAuMDsgKi8gLyogbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZBdHRhY2tSYXRpbyA9CisgICAgRkwyRlhDT05TVF9EQkwoMC4xZik7IC8qIGludmVydGVkIGxvd2VyIHJhdGlvIGxpbWl0IGZvciBhdHRhY2tzICovCiAKLS8qIFRoZSBuZXh0IGNvbnN0YW50cyBhcmUgc2NhbGVkLCBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgZm9yIGNvbXBhcmlzb24gd2l0aCBzY2FsZWQgdmFsdWVzKi8KKy8qIFRoZSBuZXh0IGNvbnN0YW50cyBhcmUgc2NhbGVkLCBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgZm9yIGNvbXBhcmlzb24gd2l0aAorICogc2NhbGVkIHZhbHVlcyovCiAvKiBtaW5pbXVtIGVuZXJneSBmb3IgYXR0YWNrcyAqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMIG1pbkF0dGFja05yZyA9IChGTDJGWENPTlNUX0RCTCgxZSs2ZipOT1JNX1BDTV9FTkVSR1kpPj5CTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUKTsgLyogbWluaW11bSBlbmVyZ3kgZm9yIGF0dGFja3MgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBtaW5BdHRhY2tOcmcgPQorICAgIChGTDJGWENPTlNUX0RCTCgxZSs2ZiAqIE5PUk1fUENNX0VORVJHWSkgPj4KKyAgICAgQkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCk7IC8qIG1pbmltdW0gZW5lcmd5IGZvciBhdHRhY2tzICovCiAKICNlbHNlCiAKLXN0YXRpYyBjb25zdCBGSVhQX1NHTCBoaVBhc3NDb2VmZltCTE9DS19TV0lUQ0hJTkdfSUlSX0xFTl09Ci17Ci0gIEZMMkZYQ09OU1RfU0dMKC0wLjUwOTUpLEZMMkZYQ09OU1RfU0dMKDAuNzU0OCkKLX07CitzdGF0aWMgY29uc3QgRklYUF9TR0wgaGlQYXNzQ29lZmZbQkxPQ0tfU1dJVENISU5HX0lJUl9MRU5dID0geworICAgIEZMMkZYQ09OU1RfU0dMKC0wLjUwOTUpLCBGTDJGWENPTlNUX1NHTCgwLjc1NDgpfTsKIAotc3RhdGljIGNvbnN0IEZJWFBfREJMIGFjY1dpbmRvd05yZ0ZhYyA9IEZMMkZYQ09OU1RfREJMKDAuM2YpOyAgICAgICAgICAgICAgICAgICAvKiBmYWN0b3IgZm9yIGFjY3VtdWxhdGluZyBmaWx0ZXJlZCB3aW5kb3cgZW5lcmdpZXMgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBhY2NXaW5kb3dOcmdGYWMgPQorICAgIEZMMkZYQ09OU1RfREJMKDAuM2YpOyAvKiBmYWN0b3IgZm9yIGFjY3VtdWxhdGluZyBmaWx0ZXJlZCB3aW5kb3cgZW5lcmdpZXMgKi8KIHN0YXRpYyBjb25zdCBGSVhQX1NHTCBvbmVNaW51c0FjY1dpbmRvd05yZ0ZhYyA9IEZMMkZYQ09OU1RfU0dMKDAuN2YpOwotLyogc3RhdGljIGNvbnN0IGZsb2F0IGF0dGFja1JhdGlvID0gMTAuMDsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb3dlciByYXRpbyBsaW1pdCBmb3IgYXR0YWNrcyAqLwotc3RhdGljIGNvbnN0IEZJWFBfU0dMIGludkF0dGFja1JhdGlvID0gRkwyRlhDT05TVF9TR0woMC4xZik7ICAgICAgICAgICAgICAgICAgICAvKiBpbnZlcnRlZCBsb3dlciByYXRpbyBsaW1pdCBmb3IgYXR0YWNrcyAqLworLyogc3RhdGljIGNvbnN0IGZsb2F0IGF0dGFja1JhdGlvID0gMTAuMDsgKi8gLyogbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8KK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBpbnZBdHRhY2tSYXRpbyA9CisgICAgRkwyRlhDT05TVF9TR0woMC4xZik7IC8qIGludmVydGVkIGxvd2VyIHJhdGlvIGxpbWl0IGZvciBhdHRhY2tzICovCiAvKiBtaW5pbXVtIGVuZXJneSBmb3IgYXR0YWNrcyAqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMIG1pbkF0dGFja05yZyA9IChGTDJGWENPTlNUX0RCTCgxZSs2ZipOT1JNX1BDTV9FTkVSR1kpPj5CTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUKTsgLyogbWluaW11bSBlbmVyZ3kgZm9yIGF0dGFja3MgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBtaW5BdHRhY2tOcmcgPQorICAgIChGTDJGWENPTlNUX0RCTCgxZSs2ZiAqIE5PUk1fUENNX0VORVJHWSkgPj4KKyAgICAgQkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCk7IC8qIG1pbmltdW0gZW5lcmd5IGZvciBhdHRhY2tzICovCiAKICNlbmRpZgogCiAvKioqKioqKioqKioqKioqKiBpbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqLwogCiAvKioqKioqKioqKioqKioqKioqIFJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEZES2FhY0VuY19Jbml0QmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwgSU5UIGlzTG93RGVsYXkpCi17Ci0gIEZES21lbWNsZWFyIChibG9ja1N3aXRjaGluZ0NvbnRyb2wsIHNpemVvZihCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCkpOwordm9pZCBGREthYWNFbmNfSW5pdEJsb2NrU3dpdGNoaW5nKAorICAgIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsIElOVCBpc0xvd0RlbGF5KSB7CisgIEZES21lbWNsZWFyKGJsb2NrU3dpdGNoaW5nQ29udHJvbCwgc2l6ZW9mKEJMT0NLX1NXSVRDSElOR19DT05UUk9MKSk7CiAKLSAgaWYgKGlzTG93RGVsYXkpCi0gIHsKKyAgaWYgKGlzTG93RGVsYXkpIHsKICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5CbG9ja1N3aXRjaFdpbmRvd3MgPSA0OwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lcyAgICA9IDA7Ci0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd0xvb2tBaGVhZCAgICAgID0gMDsKLSAgfQotICBlbHNlCi0gIHsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93U2hvcnRGcmFtZXMgPSAwOworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dMb29rQWhlYWQgPSAwOworICB9IGVsc2UgewogICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bkJsb2NrU3dpdGNoV2luZG93cyA9IDg7Ci0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd1Nob3J0RnJhbWVzICAgID0gMTsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93TG9va0FoZWFkICAgICAgPSAxOworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lcyA9IDE7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd0xvb2tBaGVhZCA9IDE7CiAgIH0KIAotICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5vT2ZHcm91cHMgICAgICAgICAgICA9IE1BWF9OT19PRl9HUk9VUFM7CisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bm9PZkdyb3VwcyA9IE1BWF9OT19PRl9HUk9VUFM7CiAKICAgLyogSW5pdGlhbGl6ZSBzdGFydHZhbHVlIGZvciBibG9ja3R5cGUgKi8KLSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2UgICAgPSBMT05HX1dJTkRPVzsKLSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTaGFwZSAgICAgICAgICAgPSBibG9ja1R5cGUyd2luZG93U2hhcGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd1Nob3J0RnJhbWVzXVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZV07Ci0KKyAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2UgPSBMT05HX1dJTkRPVzsKKyAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTaGFwZSA9CisgICAgICBibG9ja1R5cGUyd2luZG93U2hhcGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd1Nob3J0RnJhbWVzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKIH0KIAotc3RhdGljIGNvbnN0IElOVCBzdWdnZXN0ZWRHcm91cGluZ1RhYmxlW1RSQU5TX0ZBQ11bTUFYX05PX09GX0dST1VQU10gPQotewotICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgMCAqLyB7MSwgIDMsICAzLCAgMX0sCi0gICAgLyogQXR0YWNrIGluIFdpbmRvdyAxICovIHsxLCAgMSwgIDMsICAzfSwKLSAgICAvKiBBdHRhY2sgaW4gV2luZG93IDIgKi8gezIsICAxLCAgMywgIDJ9LAotICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgMyAqLyB7MywgIDEsICAzLCAgMX0sCi0gICAgLyogQXR0YWNrIGluIFdpbmRvdyA0ICovIHszLCAgMSwgIDEsICAzfSwKLSAgICAvKiBBdHRhY2sgaW4gV2luZG93IDUgKi8gezMsICAyLCAgMSwgIDJ9LAotICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgNiAqLyB7MywgIDMsICAxLCAgMX0sCi0gICAgLyogQXR0YWNrIGluIFdpbmRvdyA3ICovIHszLCAgMywgIDEsICAxfQotfTsKK3N0YXRpYyBjb25zdCBJTlQgc3VnZ2VzdGVkR3JvdXBpbmdUYWJsZVtUUkFOU19GQUNdW01BWF9OT19PRl9HUk9VUFNdID0geworICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgMCAqLyB7MSwgMywgMywgMX0sCisgICAgLyogQXR0YWNrIGluIFdpbmRvdyAxICovIHsxLCAxLCAzLCAzfSwKKyAgICAvKiBBdHRhY2sgaW4gV2luZG93IDIgKi8gezIsIDEsIDMsIDJ9LAorICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgMyAqLyB7MywgMSwgMywgMX0sCisgICAgLyogQXR0YWNrIGluIFdpbmRvdyA0ICovIHszLCAxLCAxLCAzfSwKKyAgICAvKiBBdHRhY2sgaW4gV2luZG93IDUgKi8gezMsIDIsIDEsIDJ9LAorICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgNiAqLyB7MywgMywgMSwgMX0sCisgICAgLyogQXR0YWNrIGluIFdpbmRvdyA3ICovIHszLCAzLCAxLCAxfX07CiAKLS8qIGNoYW5nZSBibG9jayB0eXBlIGRlcGVuZGluZyBvbiBjdXJyZW50IGJsb2NrdHlwZSBhbmQgd2hldGhlciB0aGVyZSdzIGFuIGF0dGFjayAqLworLyogY2hhbmdlIGJsb2NrIHR5cGUgZGVwZW5kaW5nIG9uIGN1cnJlbnQgYmxvY2t0eXBlIGFuZCB3aGV0aGVyIHRoZXJlJ3MgYW4KKyAqIGF0dGFjayAqLwogLyogYXNzdW1lIG5vIGxvb2stYWhlYWQgKi8KLXN0YXRpYyBjb25zdCBJTlQgY2hnV25kU3FbMl1bTl9CTE9DS1RZUEVTXSA9Ci17Ci0gIC8qICAgICAgICAgICAgIExPTkcgV0lORE9XICAgU1RBUlRfV0lORE9XICBTSE9SVF9XSU5ET1cgIFNUT1BfV0lORE9XLCAgTE9XT1ZfV0lORE9XLCBXUk9OR19XSU5ET1cgKi8KLSAgLypubyBhdHRhY2sqLyB7TE9OR19XSU5ET1csICBTVE9QX1dJTkRPVywgIFdST05HX1dJTkRPVywgTE9OR19XSU5ET1csICBTVE9QX1dJTkRPVyAsIFdST05HX1dJTkRPVyB9LAotICAvKmF0dGFjayAgICovIHtTVEFSVF9XSU5ET1csIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XLCBTVEFSVF9XSU5ET1csIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XIH0KLX07CitzdGF0aWMgY29uc3QgSU5UIGNoZ1duZFNxWzJdW05fQkxPQ0tUWVBFU10gPSB7CisgICAgLyogICAgICAgICAgICAgTE9ORyBXSU5ET1cgICBTVEFSVF9XSU5ET1cgIFNIT1JUX1dJTkRPVyAgU1RPUF9XSU5ET1csCisgICAgICAgTE9XT1ZfV0lORE9XLCBXUk9OR19XSU5ET1cgKi8KKyAgICAvKm5vIGF0dGFjayovIHtMT05HX1dJTkRPVywgU1RPUF9XSU5ET1csIFdST05HX1dJTkRPVywgTE9OR19XSU5ET1csCisgICAgICAgICAgICAgICAgICAgU1RPUF9XSU5ET1csIFdST05HX1dJTkRPV30sCisgICAgLyphdHRhY2sgICAqLyB7U1RBUlRfV0lORE9XLCBMT1dPVl9XSU5ET1csIFdST05HX1dJTkRPVywgU1RBUlRfV0lORE9XLAorICAgICAgICAgICAgICAgICAgIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XfX07CiAKLS8qIGNoYW5nZSBibG9jayB0eXBlIGRlcGVuZGluZyBvbiBjdXJyZW50IGJsb2NrdHlwZSBhbmQgd2hldGhlciB0aGVyZSdzIGFuIGF0dGFjayAqLworLyogY2hhbmdlIGJsb2NrIHR5cGUgZGVwZW5kaW5nIG9uIGN1cnJlbnQgYmxvY2t0eXBlIGFuZCB3aGV0aGVyIHRoZXJlJ3MgYW4KKyAqIGF0dGFjayAqLwogLyogYXNzdW1lIGxvb2stYWhlYWQgKi8KLXN0YXRpYyBjb25zdCBJTlQgY2hnV25kU3FMa0FoZFsyXVsyXVtOX0JMT0NLVFlQRVNdID0KLXsKLSAgLyphdHRhY2sgICAgICAgICBMT05HIFdJTkRPVyAgICBTVEFSVF9XSU5ET1cgICBTSE9SVF9XSU5ET1cgICBTVE9QX1dJTkRPVyAgIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XICovICAvKiBsYXN0IGF0dGFjayAqLwotICAvKm5vIGF0dGFjayovIHsge0xPTkdfV0lORE9XLCAgIFNIT1JUX1dJTkRPVywgIFNUT1BfV0lORE9XLCAgIExPTkdfV0lORE9XLCAgV1JPTkdfV0lORE9XLCBXUk9OR19XSU5ET1d9LCAgIC8qIG5vIGF0dGFjayAgICovCi0gIC8qYXR0YWNrICAgKi8gICB7U1RBUlRfV0lORE9XLCAgU0hPUlRfV0lORE9XLCAgU0hPUlRfV0lORE9XLCAgU1RBUlRfV0lORE9XLCBXUk9OR19XSU5ET1csIFdST05HX1dJTkRPV30gfSwgLyogbm8gYXR0YWNrICAgKi8KLSAgLypubyBhdHRhY2sqLyB7IHtMT05HX1dJTkRPVywgICBTSE9SVF9XSU5ET1csICBTSE9SVF9XSU5ET1csICBMT05HX1dJTkRPVywgIFdST05HX1dJTkRPVywgV1JPTkdfV0lORE9XfSwgICAvKiBhdHRhY2sgICAgICAqLwotICAvKmF0dGFjayAgICovICAge1NUQVJUX1dJTkRPVywgIFNIT1JUX1dJTkRPVywgIFNIT1JUX1dJTkRPVywgIFNUQVJUX1dJTkRPVywgV1JPTkdfV0lORE9XLCBXUk9OR19XSU5ET1d9IH0gIC8qIGF0dGFjayAgICAgICovCitzdGF0aWMgY29uc3QgSU5UIGNoZ1duZFNxTGtBaGRbMl1bMl1bTl9CTE9DS1RZUEVTXSA9IHsKKyAgICAvKmF0dGFjayAgICAgICAgIExPTkcgV0lORE9XICAgIFNUQVJUX1dJTkRPVyAgIFNIT1JUX1dJTkRPVyAgIFNUT1BfV0lORE9XICAgTE9XT1ZfV0lORE9XLCBXUk9OR19XSU5ET1cgKi8gLyogbGFzdCBhdHRhY2sgKi8KKyAgICAvKm5vIGF0dGFjayovIHsKKyAgICAgICAge0xPTkdfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNUT1BfV0lORE9XLCBMT05HX1dJTkRPVywgV1JPTkdfV0lORE9XLAorICAgICAgICAgV1JPTkdfV0lORE9XfSwgLyogbm8gYXR0YWNrICAgKi8KKyAgICAgICAgLyphdHRhY2sgICAqLyB7U1RBUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RBUlRfV0lORE9XLAorICAgICAgICAgICAgICAgICAgICAgICBXUk9OR19XSU5ET1csIFdST05HX1dJTkRPV319LCAvKiBubyBhdHRhY2sgICAqLworICAgIC8qbm8gYXR0YWNrKi8ge3tMT05HX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIExPTkdfV0lORE9XLAorICAgICAgICAgICAgICAgICAgICBXUk9OR19XSU5ET1csIFdST05HX1dJTkRPV30sIC8qIGF0dGFjayAgICAgICovCisgICAgICAgICAgICAgICAgICAgLyphdHRhY2sgICAqLyB7U1RBUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFSVF9XSU5ET1csIFdST05HX1dJTkRPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUk9OR19XSU5ET1d9fSAvKiBhdHRhY2sgICAgICAqLwogfTsKIAotaW50IEZES2FhY0VuY19CbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwgY29uc3QgaW50IGlzTEZFLCBjb25zdCBJTlRfUENNICpwVGltZVNpZ25hbCkKLXsKLSAgICBVSU5UIGk7Ci0gICAgRklYUF9EQkwgZW5NMSwgZW5NYXg7CitpbnQgRkRLYWFjRW5jX0Jsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoLCBjb25zdCBpbnQgaXNMRkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00gKnBUaW1lU2lnbmFsKSB7CisgIFVJTlQgaTsKKyAgRklYUF9EQkwgZW5NMSwgZW5NYXg7CiAKLSAgICBVSU5UIG5CbG9ja1N3aXRjaFdpbmRvd3MgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5CbG9ja1N3aXRjaFdpbmRvd3M7CisgIFVJTlQgbkJsb2NrU3dpdGNoV2luZG93cyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bkJsb2NrU3dpdGNoV2luZG93czsKIAotICAgIC8qIGZvciBMRkUgOiBvbmx5IExPTkcgd2luZG93IGFsbG93ZWQgKi8KLSAgICBpZiAoaXNMRkUpIHsKKyAgLyogZm9yIExGRSA6IG9ubHkgTE9ORyB3aW5kb3cgYWxsb3dlZCAqLworICBpZiAoaXNMRkUpIHsKKyAgICAvKiBjYXNlIExGRTogKi8KKyAgICAvKiBvbmx5IGxvbmcgYmxvY2tzLCBhbHdheXMgdXNlIHNpbmUgd2luZG93cyAoTVBFRzIgQUFDLCBNUEVHNCBBQUMpICovCisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2UgPSBMT05HX1dJTkRPVzsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NoYXBlID0gU0lORV9XSU5ET1c7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzID0gMTsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuWzBdID0gMTsKIAotICAgICAgLyogY2FzZSBMRkU6ICovCi0gICAgICAvKiBvbmx5IGxvbmcgYmxvY2tzLCBhbHdheXMgdXNlIHNpbmUgd2luZG93cyAoTVBFRzIgQUFDLCBNUEVHNCBBQUMpICovCi0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTaGFwZSAgICA9IFNJTkVfV0lORE9XOwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzICAgICA9IDE7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuWzBdICAgID0gMTsKKyAgICByZXR1cm4gKDApOworICB9OwogCi0gICAgICByZXR1cm4oMCk7Ci0gICAgfTsKKyAgLyogU2F2ZSBjdXJyZW50IGF0dGFjayBpbmRleCBhcyBsYXN0IGF0dGFjayBpbmRleCAqLworICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjazsKKyAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXggPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4OwogCi0gICAgLyogU2F2ZSBjdXJyZW50IGF0dGFjayBpbmRleCBhcyBsYXN0IGF0dGFjayBpbmRleCAqLwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFjayA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrOwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdEF0dGFja0luZGV4ID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleDsKKyAgLyogU2F2ZSBjdXJyZW50IHdpbmRvdyBlbmVyZ3kgYXMgbGFzdCB3aW5kb3cgZW5lcmd5ICovCisgIEZES21lbWNweShibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1swXSwKKyAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzFdLAorICAgICAgICAgICAgc2l6ZW9mKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzBdKSk7CisgIEZES21lbWNweShibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF0sCisgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV0sCisgICAgICAgICAgICBzaXplb2YoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdKSk7CiAKLSAgICAvKiBTYXZlIGN1cnJlbnQgd2luZG93IGVuZXJneSBhcyBsYXN0IHdpbmRvdyBlbmVyZ3kgKi8KLSAgICBGREttZW1jcHkoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMF0sIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzFdLCBzaXplb2YoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMF0pKTsKLSAgICBGREttZW1jcHkoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdLCBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV0sIHNpemVvZihibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF0pKTsKKyAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lcykgeworICAgIC8qIENhbGN1bGF0ZSBzdWdnZXN0ZWQgZ3JvdXBpbmcgaW5mbyBmb3IgdGhlIGxhc3QgZnJhbWUgKi8KIAotICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93U2hvcnRGcmFtZXMpCi0gICAgewotICAgICAgLyogQ2FsY3VsYXRlIHN1Z2dlc3RlZCBncm91cGluZyBpbmZvIGZvciB0aGUgbGFzdCBmcmFtZSAqLworICAgIC8qIFJlc2V0IGdyb3VwaW5nIGluZm8gKi8KKyAgICBGREttZW1jbGVhcihibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuLAorICAgICAgICAgICAgICAgIHNpemVvZihibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuKSk7CiAKLSAgICAgIC8qIFJlc2V0IGdyb3VwaW5nIGluZm8gKi8KLSAgICAgIEZES21lbWNsZWFyIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuLCBzaXplb2YoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbikpOworICAgIC8qIFNldCBncm91cGluZyBpbmZvICovCisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzID0gTUFYX05PX09GX0dST1VQUzsKIAotICAgICAgLyogU2V0IGdyb3VwaW5nIGluZm8gKi8KLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bm9PZkdyb3VwcyA9IE1BWF9OT19PRl9HUk9VUFM7CisgICAgRkRLbWVtY3B5KGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW4sCisgICAgICAgICAgICAgIHN1Z2dlc3RlZEdyb3VwaW5nVGFibGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXhdLAorICAgICAgICAgICAgICBzaXplb2YoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbikpOwogCi0gICAgICBGREttZW1jcHkoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbiwgc3VnZ2VzdGVkR3JvdXBpbmdUYWJsZVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RBdHRhY2tJbmRleF0sIHNpemVvZihibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuKSk7Ci0KLSAgICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9PSBUUlVFKQotICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bWF4V2luZG93TnJnID0gRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneShibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1swXSwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXgpOwotICAgICAgZWxzZQotICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bWF4V2luZG93TnJnID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKLQotICAgIH0KLQotCi0gICAgLyogQ2FsY3VsYXRlIHVuZmlsdGVyZWQgYW5kIGZpbHRlcmVkIGVuZXJnaWVzIGluIHN1YndpbmRvd3MgYW5kIGNvbWJpbmUgdG8gc2VnbWVudHMgKi8KLSAgICBGREthYWNFbmNfQ2FsY1dpbmRvd0VuZXJneShibG9ja1N3aXRjaGluZ0NvbnRyb2wsIGdyYW51bGVMZW5ndGg+PihuQmxvY2tTd2l0Y2hXaW5kb3dzPT00PyAyOjMgKSwgcFRpbWVTaWduYWwpOwotCi0gICAgLyogbm93IGNhbGN1bGF0ZSBpZiB0aGVyZSBpcyBhbiBhdHRhY2sgKi8KLQotICAgIC8qIHJlc2V0IGF0dGFjayAqLwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gRkFMU0U7Ci0KLSAgICAvKiBsb29rIGZvciBhdHRhY2sgKi8KLSAgICBlbk1heCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgIGVuTTEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF1bbkJsb2NrU3dpdGNoV2luZG93cy0xXTsKLQotICAgIGZvciAoaT0wOyBpPG5CbG9ja1N3aXRjaFdpbmRvd3M7IGkrKykgewotICAgICAgICBGSVhQX0RCTCB0bXAgPSBmTXVsdERpdjIob25lTWludXNBY2NXaW5kb3dOcmdGYWMsIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnKTsKLSAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgPSBmTXVsdEFkZCh0bXAsIGFjY1dpbmRvd05yZ0ZhYywgZW5NMSkgOwotCi0gICAgICAgIGlmIChmTXVsdChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1baV0saW52QXR0YWNrUmF0aW8pID4gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgKSB7Ci0gICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IFRSVUU7Ci0gICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4ID0gaTsKLSAgICAgICAgfQotICAgICAgICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW2ldOwotICAgICAgICBlbk1heCA9IGZpeE1heChlbk1heCwgZW5NMSk7Ci0gICAgfQotCi0KLSAgICBpZiAoZW5NYXggPCBtaW5BdHRhY2tOcmcpIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gRkFMU0U7Ci0KLSAgICAvKiBDaGVjayBpZiBhdHRhY2sgc3ByZWFkcyBvdmVyIGZyYW1lIGJvcmRlciAqLwotICAgIGlmKChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9PSBGQUxTRSkgJiYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFjayA9PSBUUlVFKSkgewotICAgICAgICAvKiBpZiBhdHRhY2sgaXMgaW4gbGFzdCB3aW5kb3cgcmVwZWF0IFNIT1JUX1dJTkRPVyAqLwotICAgICAgICBpZiAoICgoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdW25CbG9ja1N3aXRjaFdpbmRvd3MtMV0+PjQpID4gZk11bHQoKEZJWFBfREJMKSgxMDw8KERGUkFDVF9CSVRTLTEtNCkpLCBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bMV0pKQotICAgICAgICAgICAmJiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXggPT0gKElOVCluQmxvY2tTd2l0Y2hXaW5kb3dzLTEpCi0gICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBUUlVFOwotICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIGlmKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dMb29rQWhlYWQpCi0gICAgewotCi0KLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlID0KLSAgICAgICAgY2hnV25kU3FMa0FoZFtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2tdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrXVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZV07Ci0gICAgfQorICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9PSBUUlVFKQorICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5tYXhXaW5kb3dOcmcgPQorICAgICAgICAgIEZES2FhY0VuY19HZXRXaW5kb3dFbmVyZ3koYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RBdHRhY2tJbmRleCk7CiAgICAgZWxzZQotICAgIHsKLSAgICAgIC8qIExvdyBEZWxheSAqLwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2UgPQotICAgICAgICBjaGdXbmRTcVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja11bYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2VdOworICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5tYXhXaW5kb3dOcmcgPSBGTDJGWENPTlNUX0RCTCgwLjApOworICB9CisKKyAgLyogQ2FsY3VsYXRlIHVuZmlsdGVyZWQgYW5kIGZpbHRlcmVkIGVuZXJnaWVzIGluIHN1YndpbmRvd3MgYW5kIGNvbWJpbmUgdG8KKyAgICogc2VnbWVudHMgKi8KKyAgRkRLYWFjRW5jX0NhbGNXaW5kb3dFbmVyZ3koCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICBncmFudWxlTGVuZ3RoID4+IChuQmxvY2tTd2l0Y2hXaW5kb3dzID09IDQgPyAyIDogMyksIHBUaW1lU2lnbmFsKTsKKworICAvKiBub3cgY2FsY3VsYXRlIGlmIHRoZXJlIGlzIGFuIGF0dGFjayAqLworCisgIC8qIHJlc2V0IGF0dGFjayAqLworICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IEZBTFNFOworCisgIC8qIGxvb2sgZm9yIGF0dGFjayAqLworICBlbk1heCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdW25CbG9ja1N3aXRjaFdpbmRvd3MgLSAxXTsKKworICBmb3IgKGkgPSAwOyBpIDwgbkJsb2NrU3dpdGNoV2luZG93czsgaSsrKSB7CisgICAgRklYUF9EQkwgdG1wID0KKyAgICAgICAgZk11bHREaXYyKG9uZU1pbnVzQWNjV2luZG93TnJnRmFjLCBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFjY1dpbmRvd05yZyk7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgPSBmTXVsdEFkZCh0bXAsIGFjY1dpbmRvd05yZ0ZhYywgZW5NMSk7CisKKyAgICBpZiAoZk11bHQoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW2ldLCBpbnZBdHRhY2tSYXRpbykgPgorICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFjY1dpbmRvd05yZykgeworICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBUUlVFOworICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleCA9IGk7CiAgICAgfQorICAgIGVuTTEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1baV07CisgICAgZW5NYXggPSBmaXhNYXgoZW5NYXgsIGVuTTEpOworICB9CiAKKyAgaWYgKGVuTWF4IDwgbWluQXR0YWNrTnJnKSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IEZBTFNFOwogCi0gICAgLyogdXBkYXRlIHdpbmRvdyBzaGFwZSAqLwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2hhcGUgPSBibG9ja1R5cGUyd2luZG93U2hhcGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd1Nob3J0RnJhbWVzXVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CisgIC8qIENoZWNrIGlmIGF0dGFjayBzcHJlYWRzIG92ZXIgZnJhbWUgYm9yZGVyICovCisgIGlmICgoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPT0gRkFMU0UpICYmCisgICAgICAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0YXR0YWNrID09IFRSVUUpKSB7CisgICAgLyogaWYgYXR0YWNrIGlzIGluIGxhc3Qgd2luZG93IHJlcGVhdCBTSE9SVF9XSU5ET1cgKi8KKyAgICBpZiAoKChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF1bbkJsb2NrU3dpdGNoV2luZG93cyAtIDFdID4+IDQpID4KKyAgICAgICAgIGZNdWx0KChGSVhQX0RCTCkoMTAgPDwgKERGUkFDVF9CSVRTIC0gMSAtIDQpKSwKKyAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVsxXSkpICYmCisgICAgICAgIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RBdHRhY2tJbmRleCA9PQorICAgICAgICAgKElOVCluQmxvY2tTd2l0Y2hXaW5kb3dzIC0gMSkpIHsKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gVFJVRTsKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXggPSAwOworICAgIH0KKyAgfQogCi0gICAgcmV0dXJuKDApOworICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd0xvb2tBaGVhZCkgeworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlID0KKyAgICAgICAgY2hnV25kU3FMa0FoZFtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2tdCisgICAgICAgICAgICAgICAgICAgICBbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tdCisgICAgICAgICAgICAgICAgICAgICBbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2VdOworICB9IGVsc2UgeworICAgIC8qIExvdyBEZWxheSAqLworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlID0KKyAgICAgICAgY2hnV25kU3FbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tdCisgICAgICAgICAgICAgICAgW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKKyAgfQorCisgIC8qIHVwZGF0ZSB3aW5kb3cgc2hhcGUgKi8KKyAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTaGFwZSA9CisgICAgICBibG9ja1R5cGUyd2luZG93U2hhcGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd1Nob3J0RnJhbWVzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKKworICByZXR1cm4gKDApOwogfQogCi0KLQotc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19HZXRXaW5kb3dFbmVyZ3koY29uc3QgRklYUF9EQkwgaW5bXSwgY29uc3QgSU5UIGJsU3dXbmRJZHgpCi17Ci0vKiBGb3IgY29oZXJlbmN5LCBjaGFuZ2UgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneSgpIHRvIGNhbGNsdWF0ZSB0aGUgZW5lcmd5IGZvciBhIGJsb2NrIHN3aXRjaGluZyBhbmFseXNpcyB3aW5kb3dzLAotICAgbm90IGZvciBhIHNob3J0IGJsb2NrLiBUaGUgc2FtZSBpcyBkb25lIEZES2FhY0VuY19DYWxjV2luZG93RW5lcmd5KCkuIFRoZSByZXN1bHQgb2YgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneSgpCi0gICBpcyB1c2VkIGZvciBhIGNvbXBhcmlzaW9uIG9mIHRoZSBtYXggZW5lcmd5IG9mIGxlZnQvcmlnaHQgY2hhbm5lbC4gKi8KK3N0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfR2V0V2luZG93RW5lcmd5KGNvbnN0IEZJWFBfREJMIGluW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmxTd1duZElkeCkgeworICAvKiBGb3IgY29oZXJlbmN5LCBjaGFuZ2UgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneSgpIHRvIGNhbGNsdWF0ZSB0aGUgZW5lcmd5CisgICAgIGZvciBhIGJsb2NrIHN3aXRjaGluZyBhbmFseXNpcyB3aW5kb3dzLCBub3QgZm9yIGEgc2hvcnQgYmxvY2suIFRoZSBzYW1lIGlzCisgICAgIGRvbmUgRkRLYWFjRW5jX0NhbGNXaW5kb3dFbmVyZ3koKS4gVGhlIHJlc3VsdCBvZgorICAgICBGREthYWNFbmNfR2V0V2luZG93RW5lcmd5KCkgaXMgdXNlZCBmb3IgYSBjb21wYXJpc2lvbiBvZiB0aGUgbWF4IGVuZXJneSBvZgorICAgICBsZWZ0L3JpZ2h0IGNoYW5uZWwuICovCiAKICAgcmV0dXJuIGluW2JsU3dXbmRJZHhdOwotCiB9CiAKLXN0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjV2luZG93RW5lcmd5KEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpSRVNUUklDVCBibG9ja1N3aXRjaGluZ0NvbnRyb2wsIElOVCB3aW5kb3dMZW4sIGNvbnN0IElOVF9QQ00gKnBUaW1lU2lnbmFsKQotewotICAgIElOVCAgaTsKLSAgICBVSU5UIHc7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY1dpbmRvd0VuZXJneSgKKyAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqUkVTVFJJQ1QgYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBJTlQgd2luZG93TGVuLAorICAgIGNvbnN0IElOVF9QQ00gKnBUaW1lU2lnbmFsKSB7CisgIElOVCBpOworICBVSU5UIHc7CiAKLSAgICBGSVhQX1NHTCBoaVBhc3NDb2VmZjAgPSBoaVBhc3NDb2VmZlswXTsKLSAgICBGSVhQX1NHTCBoaVBhc3NDb2VmZjEgPSBoaVBhc3NDb2VmZlsxXTsKLQotICAgIC8qIHN1bSB1cCBzY2FsYXJwcm9kdWN0IG9mIHRpbWVzaWduYWwgYXMgd2luZG93ZWQgRW5lcmdpZXMgKi8KLSAgICBmb3IgKHc9MDsgdyA8IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bkJsb2NrU3dpdGNoV2luZG93czsgdysrKSB7Ci0KLSAgICAgICAgRklYUF9EQkwgdGVtcF93aW5kb3dOcmcgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICAgIEZJWFBfREJMIHRlbXBfd2luZG93TnJnRiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgICBGSVhQX0RCTCB0ZW1wX2lpclN0YXRlMCAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1swXTsKLSAgICAgICAgRklYUF9EQkwgdGVtcF9paXJTdGF0ZTEgID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMV07Ci0KLSAgICAgICAgLyogd2luZG93TnJnID0gc3VtKHRpbWVzYW1wbGVeMikgKi8KLSAgICAgICAgZm9yKGk9MDtpPHdpbmRvd0xlbjtpKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgRklYUF9EQkwgdGVtcFVuZmlsdGVyZWQsIHRlbXBGaWx0cmVkLCB0MSwgdDI7Ci0gICAgICAgICAgICAvKiB0ZW1wVW5maWx0ZXJlZCBpcyBzY2FsZWQgd2l0aCAxIHRvIHByZXZlbnQgb3ZlcmZsb3dzIGR1cmluZyBjYWxjdWxhdGlvbiBvZiB0ZW1wRmlsdHJlZCAqLwotI2lmIFNBTVBMRV9CSVRTID09IERGUkFDVF9CSVRTCi0gICAgICAgICAgICB0ZW1wVW5maWx0ZXJlZCA9IChGSVhQX0RCTCkgKnBUaW1lU2lnbmFsKysgPj4gMTsKKyNpZm5kZWYgU0lORVRBQkxFXzE2QklUCisgIGNvbnN0IEZJWFBfREJMIGhpUGFzc0NvZWZmMCA9IGhpUGFzc0NvZWZmWzBdOworICBjb25zdCBGSVhQX0RCTCBoaVBhc3NDb2VmZjEgPSBoaVBhc3NDb2VmZlsxXTsKICNlbHNlCi0gICAgICAgICAgICB0ZW1wVW5maWx0ZXJlZCA9IChGSVhQX0RCTCkgKnBUaW1lU2lnbmFsKysgPDwgKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLTEpOworICBjb25zdCBGSVhQX1NHTCBoaVBhc3NDb2VmZjAgPSBoaVBhc3NDb2VmZlswXTsKKyAgY29uc3QgRklYUF9TR0wgaGlQYXNzQ29lZmYxID0gaGlQYXNzQ29lZmZbMV07CiAjZW5kaWYKLSAgICAgICAgICAgIHQxID0gZk11bHREaXYyKGhpUGFzc0NvZWZmMSwgdGVtcFVuZmlsdGVyZWQtdGVtcF9paXJTdGF0ZTApOwotICAgICAgICAgICAgdDIgPSBmTXVsdERpdjIoaGlQYXNzQ29lZmYwLCB0ZW1wX2lpclN0YXRlMSk7Ci0gICAgICAgICAgICB0ZW1wRmlsdHJlZCA9ICh0MSAtIHQyKSA8PCAxOwogCi0gICAgICAgICAgICB0ZW1wX2lpclN0YXRlMCA9IHRlbXBVbmZpbHRlcmVkOwotICAgICAgICAgICAgdGVtcF9paXJTdGF0ZTEgPSB0ZW1wRmlsdHJlZDsKKyAgRklYUF9EQkwgdGVtcF9paXJTdGF0ZTAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1swXTsKKyAgRklYUF9EQkwgdGVtcF9paXJTdGF0ZTEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1sxXTsKIAotICAgICAgICAgICAgLyogc3VidHJhY3QgMiBmcm9tIG92ZXJhbGxzY2FsaW5nIChCTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUKQotICAgICAgICAgICAgICogYmVjYXVzZSB0ZW1wVW5maWx0ZXJlZCB3YXMgYWxyZWFkeSBzY2FsZWQgd2l0aCAxIChpcyAyIGFmdGVyIHNxdWFyaW5nKQotICAgICAgICAgICAgICogc3VidHJhY3QgMSBmcm9tIG92ZXJhbGxzY2FsaW5nIChCTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUKQotICAgICAgICAgICAgICogYmVjYXVzZSBvZiBmTXVsdERpdjIgaXMgZG9pbmcgYSBzY2FsaW5nIGJ5IG9uZSAqLwotICAgICAgICAgICAgdGVtcF93aW5kb3dOcmcgKz0gZlBvdzJEaXYyKHRlbXBVbmZpbHRlcmVkKSA+PiAoQkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCAtIDEgLSAyKTsKLSAgICAgICAgICAgIHRlbXBfd2luZG93TnJnRiArPSBmUG93MkRpdjIodGVtcEZpbHRyZWQpID4+IChCTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUIC0gMSAtIDIpOwotICAgICAgICB9Ci0gICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzFdW3ddICA9IHRlbXBfd2luZG93TnJnOwotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd10gPSB0ZW1wX3dpbmRvd05yZ0Y7Ci0gICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdICAgICA9IHRlbXBfaWlyU3RhdGUwOwotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1sxXSAgICAgPSB0ZW1wX2lpclN0YXRlMTsKKyAgLyogc3VtIHVwIHNjYWxhcnByb2R1Y3Qgb2YgdGltZXNpZ25hbCBhcyB3aW5kb3dlZCBFbmVyZ2llcyAqLworICBmb3IgKHcgPSAwOyB3IDwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uQmxvY2tTd2l0Y2hXaW5kb3dzOyB3KyspIHsKKyAgICBVTE9ORyB0ZW1wX3dpbmRvd05yZyA9IDB4MDsKKyAgICBVTE9ORyB0ZW1wX3dpbmRvd05yZ0YgPSAweDA7CisKKyAgICAvKiB3aW5kb3dOcmcgPSBzdW0odGltZXNhbXBsZV4yKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCB3aW5kb3dMZW47IGkrKykgeworICAgICAgRklYUF9EQkwgdGVtcFVuZmlsdGVyZWQsIHQxLCB0MjsKKyAgICAgIC8qIHRlbXBVbmZpbHRlcmVkIGlzIHNjYWxlZCB3aXRoIDEgdG8gcHJldmVudCBvdmVyZmxvd3MgZHVyaW5nIGNhbGN1bGF0aW9uCisgICAgICAgKiBvZiB0ZW1wRmlsdHJlZCAqLworI2lmIFNBTVBMRV9CSVRTID09IERGUkFDVF9CSVRTCisgICAgICB0ZW1wVW5maWx0ZXJlZCA9IChGSVhQX0RCTCkqcFRpbWVTaWduYWwrKyA+PiAxOworI2Vsc2UKKyAgICAgIHRlbXBVbmZpbHRlcmVkID0gKEZJWFBfREJMKSpwVGltZVNpZ25hbCsrCisgICAgICAgICAgICAgICAgICAgICAgIDw8IChERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTIC0gMSk7CisjZW5kaWYKKyAgICAgIHQxID0gZk11bHREaXYyKGhpUGFzc0NvZWZmMSwgdGVtcFVuZmlsdGVyZWQgLSB0ZW1wX2lpclN0YXRlMCk7CisgICAgICB0MiA9IGZNdWx0RGl2MihoaVBhc3NDb2VmZjAsIHRlbXBfaWlyU3RhdGUxKTsKKyAgICAgIHRlbXBfaWlyU3RhdGUwID0gdGVtcFVuZmlsdGVyZWQ7CisgICAgICB0ZW1wX2lpclN0YXRlMSA9ICh0MSAtIHQyKSA8PCAxOworCisgICAgICB0ZW1wX3dpbmRvd05yZyArPSAoTE9ORylmUG93MkRpdjIodGVtcF9paXJTdGF0ZTApID4+CisgICAgICAgICAgICAgICAgICAgICAgICAoQkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCAtIDEgLSAyKTsKKyAgICAgIHRlbXBfd2luZG93TnJnRiArPSAoTE9ORylmUG93MkRpdjIodGVtcF9paXJTdGF0ZTEpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgKEJMT0NLX1NXSVRDSF9FTkVSR1lfU0hJRlQgLSAxIC0gMik7CiAgICAgfQorICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzFdW3ddID0KKyAgICAgICAgKExPTkcpZk1pbih0ZW1wX3dpbmRvd05yZywgKFVJTlQpTUFYVkFMX0RCTCk7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddID0KKyAgICAgICAgKExPTkcpZk1pbih0ZW1wX3dpbmRvd05yZ0YsIChVSU5UKU1BWFZBTF9EQkwpOworICB9CisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdID0gdGVtcF9paXJTdGF0ZTA7CisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzFdID0gdGVtcF9paXJTdGF0ZTE7CiB9CiAKLQotc3RhdGljIGNvbnN0IFVDSEFSIHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlWzVdWzVdID0KLXsKLSAgLyogICAgICAgICAgICAgICAgICBMT05HX1dJTkRPVyAgIFNUQVJUX1dJTkRPVyAgU0hPUlRfV0lORE9XICBTVE9QX1dJTkRPVyAgIExPV09WX1dJTkRPVyovCi0gIC8qIExPTkdfV0lORE9XICAqLyB7TE9OR19XSU5ET1csICBTVEFSVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1csICBMT1dPVl9XSU5ET1d9LAotICAvKiBTVEFSVF9XSU5ET1cgKi8ge1NUQVJUX1dJTkRPVywgU1RBUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgTE9XT1ZfV0lORE9XfSwKLSAgLyogU0hPUlRfV0lORE9XICovIHtTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFdST05HX1dJTkRPV30sCi0gIC8qIFNUT1BfV0lORE9XICAqLyB7U1RPUF9XSU5ET1csICBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1csICBMT1dPVl9XSU5ET1d9LAotICAvKiBMT1dPVl9XSU5ET1cgKi8ge0xPV09WX1dJTkRPVywgTE9XT1ZfV0lORE9XLCBXUk9OR19XSU5ET1csIExPV09WX1dJTkRPVywgTE9XT1ZfV0lORE9XfSwKK3N0YXRpYyBjb25zdCBVQ0hBUiBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVs1XVs1XSA9IHsKKyAgICAvKiAgICAgICAgICAgICAgICAgIExPTkdfV0lORE9XICAgU1RBUlRfV0lORE9XICBTSE9SVF9XSU5ET1cgIFNUT1BfV0lORE9XCisgICAgICAgTE9XT1ZfV0lORE9XKi8KKyAgICAvKiBMT05HX1dJTkRPVyAgKi8ge0xPTkdfV0lORE9XLCBTVEFSVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1csCisgICAgICAgICAgICAgICAgICAgICAgICBMT1dPVl9XSU5ET1d9LAorICAgIC8qIFNUQVJUX1dJTkRPVyAqLworICAgIHtTVEFSVF9XSU5ET1csIFNUQVJUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIExPV09WX1dJTkRPV30sCisgICAgLyogU0hPUlRfV0lORE9XICovCisgICAge1NIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgV1JPTkdfV0lORE9XfSwKKyAgICAvKiBTVE9QX1dJTkRPVyAgKi8KKyAgICB7U1RPUF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTVE9QX1dJTkRPVywgTE9XT1ZfV0lORE9XfSwKKyAgICAvKiBMT1dPVl9XSU5ET1cgKi8KKyAgICB7TE9XT1ZfV0lORE9XLCBMT1dPVl9XSU5ET1csIFdST05HX1dJTkRPVywgTE9XT1ZfV0lORE9XLCBMT1dPVl9XSU5ET1d9LAogfTsKIAotaW50IEZES2FhY0VuY19TeW5jQmxvY2tTd2l0Y2hpbmcgKAotICAgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQsCi0gICAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQsCi0gICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAotICAgICAgY29uc3QgSU5UIGNvbW1vbldpbmRvdyApCi17CitpbnQgRkRLYWFjRW5jX1N5bmNCbG9ja1N3aXRjaGluZygKKyAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdCwKKyAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQsIGNvbnN0IElOVCBuQ2hhbm5lbHMsCisgICAgY29uc3QgSU5UIGNvbW1vbldpbmRvdykgewogICBVQ0hBUiBwYXRjaFR5cGUgPSBMT05HX1dJTkRPVzsKIAotICBpZiggbkNoYW5uZWxzID09IDIgJiYgY29tbW9uV2luZG93ID09IFRSVUUpCi0gIHsKKyAgaWYgKG5DaGFubmVscyA9PSAyICYmIGNvbW1vbldpbmRvdyA9PSBUUlVFKSB7CiAgICAgLyogY291bGQgYmUgYmV0dGVyIHdpdGggYSBjaGFubmVsIGxvb3AgKG5lZWQgYSBoYW5kbGUgdG8gcHN5X2RhdGEpICovCiAgICAgLyogZ2V0IHN1Z2dlc3RlZCBCbG9jayBUeXBlcyBhbmQgc3luY2hyb25pemUgKi8KLSAgICBwYXRjaFR5cGUgPSBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVtwYXRjaFR5cGVdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZV07Ci0gICAgcGF0Y2hUeXBlID0gc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbcGF0Y2hUeXBlXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKKyAgICBwYXRjaFR5cGUgPSBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVtwYXRjaFR5cGVdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CisgICAgcGF0Y2hUeXBlID0gc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbcGF0Y2hUeXBlXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKIAotICAgIC8qIHNhbml0eSBjaGVjayAobm8gY2hhbmdlIGZyb20gbG93IG92ZXJsYXAgd2luZG93IHRvIHNob3J0IHdpbm93IGFuZCB2aWNlIHZlcnNhKSAqLwotICAgIGlmIChwYXRjaFR5cGUgPT0gV1JPTkdfV0lORE9XKQotICAgICAgcmV0dXJuIC0xOyAvKiBtaXhlZCB1cCBBQUMtTEMgYW5kIEFBQy1MRCAqLworICAgIC8qIHNhbml0eSBjaGVjayAobm8gY2hhbmdlIGZyb20gbG93IG92ZXJsYXAgd2luZG93IHRvIHNob3J0IHdpbm93IGFuZCB2aWNlCisgICAgICogdmVyc2EpICovCisgICAgaWYgKHBhdGNoVHlwZSA9PSBXUk9OR19XSU5ET1cpIHJldHVybiAtMTsgLyogbWl4ZWQgdXAgQUFDLUxDIGFuZCBBQUMtTEQgKi8KIAogICAgIC8qIFNldCBzeW5jaHJvbml6ZWQgQmxvY2t0eXBlICovCi0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlICA9IHBhdGNoVHlwZTsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2UgPSBwYXRjaFR5cGU7CiAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZSA9IHBhdGNoVHlwZTsKIAogICAgIC8qIHVwZGF0ZSB3aW5kb3cgc2hhcGUgKi8KLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT53aW5kb3dTaGFwZSAgPSBibG9ja1R5cGUyd2luZG93U2hhcGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+YWxsb3dTaG9ydEZyYW1lc11bYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+d2luZG93U2hhcGUgPSBibG9ja1R5cGUyd2luZG93U2hhcGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+YWxsb3dTaG9ydEZyYW1lc11bYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+d2luZG93U2hhcGUgPQorICAgICAgICBibG9ja1R5cGUyd2luZG93U2hhcGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+YWxsb3dTaG9ydEZyYW1lc10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Jsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPndpbmRvd1NoYXBlID0KKyAgICAgICAgYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmFsbG93U2hvcnRGcmFtZXNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKICAgfQogCi0gIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5hbGxvd1Nob3J0RnJhbWVzKQotICB7CisgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5hbGxvd1Nob3J0RnJhbWVzKSB7CiAgICAgaW50IGk7CiAKLSAgICBpZiggbkNoYW5uZWxzID09IDIgKQotICAgIHsKLSAgICAgIGlmIChjb21tb25XaW5kb3cgPT0gVFJVRSkKLSAgICAgIHsKKyAgICBpZiAobkNoYW5uZWxzID09IDIpIHsKKyAgICAgIGlmIChjb21tb25XaW5kb3cgPT0gVFJVRSkgewogICAgICAgICAvKiBTeW5jaHJvbml6ZSBncm91cGluZyBpbmZvICovCi0gICAgICAgIGludCB3aW5kb3dTZXF1ZW5jZUxlZnRPbGQgID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlOwotICAgICAgICBpbnQgd2luZG93U2VxdWVuY2VSaWdodE9sZCA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2U7CisgICAgICAgIGludCB3aW5kb3dTZXF1ZW5jZUxlZnRPbGQgPQorICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlOworICAgICAgICBpbnQgd2luZG93U2VxdWVuY2VSaWdodE9sZCA9CisgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlOwogCiAgICAgICAgIC8qIExvbmcgQmxvY2tzICovCi0gICAgICAgIGlmKHBhdGNoVHlwZSAhPSBTSE9SVF9XSU5ET1cpIHsKKyAgICAgICAgaWYgKHBhdGNoVHlwZSAhPSBTSE9SVF9XSU5ET1cpIHsKICAgICAgICAgICAvKiBTZXQgZ3JvdXBpbmcgaW5mbyAqLwotICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgICA9IDE7Ci0gICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgID0gMTsKLSAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSAgPSAxOworICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgPSAxOworICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzID0gMTsKKyAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSA9IDE7CiAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuWzBdID0gMTsKIAotICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gID0gMDsKKyAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKSB7CisgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSA9IDA7CiAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSAwOwogICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qIFNob3J0IEJsb2NrcyAqLwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAvKiBpbiBjYXNlIGFsbCB0d28gY2hhbm5lbHMgd2VyZSBkZXRlY3RlZCBhcyBzaG9ydC1ibG9ja3MgYmVmb3JlIHN5bmNpbmcsIHVzZSB0aGUgZ3JvdXBpbmcgb2YgY2hhbm5lbCB3aXRoIGhpZ2hlciBtYXhXaW5kb3dOcmcgKi8KLSAgICAgICAgICBpZiggKHdpbmRvd1NlcXVlbmNlTGVmdE9sZCAgPT0gU0hPUlRfV0lORE9XKSAmJgotCSAgICAgICAgICAgICh3aW5kb3dTZXF1ZW5jZVJpZ2h0T2xkID09IFNIT1JUX1dJTkRPVykgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm1heFdpbmRvd05yZyA+IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5tYXhXaW5kb3dOcmcpIHsKLQkgICAgICAgICAgICAvKiBMZWZ0IENoYW5uZWwgd2lucyAqLwotCSAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwczsKLQkgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKXsKLQkgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldOwotCSAgICAgICAgICAgIH0KKyAgICAgICAgICAvKiBpbiBjYXNlIGFsbCB0d28gY2hhbm5lbHMgd2VyZSBkZXRlY3RlZCBhcyBzaG9ydC1ibG9ja3MgYmVmb3JlCisgICAgICAgICAgICogc3luY2luZywgdXNlIHRoZSBncm91cGluZyBvZiBjaGFubmVsIHdpdGggaGlnaGVyIG1heFdpbmRvd05yZyAqLworICAgICAgICAgIGlmICgod2luZG93U2VxdWVuY2VMZWZ0T2xkID09IFNIT1JUX1dJTkRPVykgJiYKKyAgICAgICAgICAgICAgKHdpbmRvd1NlcXVlbmNlUmlnaHRPbGQgPT0gU0hPUlRfV0lORE9XKSkgeworICAgICAgICAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm1heFdpbmRvd05yZyA+CisgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm1heFdpbmRvd05yZykgeworICAgICAgICAgICAgICAvKiBMZWZ0IENoYW5uZWwgd2lucyAqLworICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9CisgICAgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0KKyAgICAgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIFJpZ2h0IENoYW5uZWwgd2lucyAqLworICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0KKyAgICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPQorICAgICAgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV07CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotCSAgICAgICAgICAgIC8qIFJpZ2h0IENoYW5uZWwgd2lucyAqLwotCSAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwczsKLQkgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKXsKLQkgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldOwotCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoICh3aW5kb3dTZXF1ZW5jZUxlZnRPbGQgID09IFNIT1JUX1dJTkRPVykgJiYKLSAgICAgICAgICAgICAgICAgICAgKHdpbmRvd1NlcXVlbmNlUmlnaHRPbGQgIT0gU0hPUlRfV0lORE9XKSApCi0gICAgICAgICAgeworICAgICAgICAgIH0gZWxzZSBpZiAoKHdpbmRvd1NlcXVlbmNlTGVmdE9sZCA9PSBTSE9SVF9XSU5ET1cpICYmCisgICAgICAgICAgICAgICAgICAgICAod2luZG93U2VxdWVuY2VSaWdodE9sZCAhPSBTSE9SVF9XSU5ET1cpKSB7CiAgICAgICAgICAgICAvKiBlbHNlIHVzZSBncm91cGluZyBvZiBzaG9ydC1ibG9jayBjaGFubmVsICovCi0gICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKXsKLSAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV07CisgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9CisgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwczsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspIHsKKyAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0KKyAgICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldOwogICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICggKHdpbmRvd1NlcXVlbmNlUmlnaHRPbGQgPT0gU0hPUlRfV0lORE9XKSAmJgotCQkgICAgICAgICAgICAgICAgKHdpbmRvd1NlcXVlbmNlTGVmdE9sZCAgIT0gU0hPUlRfV0lORE9XKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKyl7Ci0gICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldOworICAgICAgICAgIH0gZWxzZSBpZiAoKHdpbmRvd1NlcXVlbmNlUmlnaHRPbGQgPT0gU0hPUlRfV0lORE9XKSAmJgorICAgICAgICAgICAgICAgICAgICAgKHdpbmRvd1NlcXVlbmNlTGVmdE9sZCAhPSBTSE9SVF9XSU5ET1cpKSB7CisgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0KKyAgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwczsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspIHsKKyAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPQorICAgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBzeW5jaW5nIGEgc3RhcnQgYW5kIHN0b3Agd2luZG93IC4uLiAqLwotICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyAgPSAyOwotICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMF0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5bMF0gPSA0OwotICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5bMV0gPSA0OworICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9CisgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgPSAyOworICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMF0gPQorICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlblswXSA9IDQ7CisgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblsxXSA9CisgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuWzFdID0gNDsKICAgICAgICAgICB9CiAgICAgICAgIH0gLyogU2hvcnQgQmxvY2tzICovCi0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIHN0ZXJlbywgbm8gY29tbW9uIHdpbmRvdyAqLwotICAgICAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlIT1TSE9SVF9XSU5ET1cpewotICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgID0gMTsKKyAgICAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKKyAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gMTsKICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSA9IDE7Ci0gICAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKykKLSAgICAgICAgICB7CisgICAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKykgewogICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSAwOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZSE9U0hPUlRfV0lORE9XKXsKLSAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyAgPSAxOworICAgICAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKKyAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9IDE7CiAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuWzBdID0gMTsKLSAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKQotICAgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKSB7CiAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSAwOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfSAvKiBjb21tb24gd2luZG93ICovCiAgICAgfSBlbHNlIHsKICAgICAgIC8qIE1vbm8gKi8KLSAgICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2UhPVNIT1JUX1dJTkRPVyl7Ci0gICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgID0gMTsKKyAgICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgPSAxOwogICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSA9IDE7CiAKLSAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKSB7CiAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSAwOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9IC8qIGFsbG93U2hvcnRGcmFtZXMgKi8KIAotCiAgIC8qIFRyYW5zbGF0ZSBMT1dPVl9XSU5ET1cgYmxvY2sgdHlwZSB0byBhIG1lYW5pbmdmdWwgd2luZG93IHNoYXBlLiAqLwotICBpZiAoICEgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+YWxsb3dTaG9ydEZyYW1lcyApIHsKLSAgICBpZiAoIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBMT05HX1dJTkRPVwotICAgICAgJiYgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IFNUT1BfV0lORE9XICkKLSAgICB7CisgIGlmICghYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+YWxsb3dTaG9ydEZyYW1lcykgeworICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2UgIT0gTE9OR19XSU5ET1cgJiYKKyAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IFNUT1BfV0lORE9XKSB7CiAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2UgPSBMT05HX1dJTkRPVzsKICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPndpbmRvd1NoYXBlID0gTE9MX1dJTkRPVzsKICAgICB9CiAgIH0KICAgaWYgKG5DaGFubmVscyA9PSAyKSB7Ci0gICAgaWYgKCAhIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5hbGxvd1Nob3J0RnJhbWVzICkgewotICAgICAgaWYgKCBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IExPTkdfV0lORE9XCi0gICAgICAgICYmIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU1RPUF9XSU5ET1cgKQotICAgICAgeworICAgIGlmICghYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmFsbG93U2hvcnRGcmFtZXMpIHsKKyAgICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IExPTkdfV0lORE9XICYmCisgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTVE9QX1dJTkRPVykgewogICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlID0gTE9OR19XSU5ET1c7CiAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT53aW5kb3dTaGFwZSA9IExPTF9XSU5ET1c7CiAgICAgICB9CkBAIC01NDEsNSArNTgwLDMgQEAKIAogICByZXR1cm4gMDsKIH0KLQotCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5oIGIvbGliQUFDZW5jL3NyYy9ibG9ja19zd2l0Y2guaAppbmRleCBlOTRiNmY1Li5mZjIwZjg0IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvYmxvY2tfc3dpdGNoLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNjggKzkwLDczIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyCisKICAgIERlc2NyaXB0aW9uOiBCbG9jayBzd2l0Y2hpbmcKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfQkxPQ0tfU1dJVENIX0gKLSNkZWZpbmUgX0JMT0NLX1NXSVRDSF9ICisjaWZuZGVmIEJMT0NLX1NXSVRDSF9ICisjZGVmaW5lIEJMT0NLX1NXSVRDSF9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKICNpbmNsdWRlICJwc3lfY29uc3QuaCIKIAogLyoqKioqKioqKioqKioqKioqKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgI2RlZmluZSBCTE9DS19TV0lUQ0hfV0lORE9XUyAgICA4ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB3aW5kb3dzIGZvciBlbmVyZ3kgY2FsY3VsYXRpb24gKi8KKyNkZWZpbmUgQkxPQ0tfU1dJVENIX1dJTkRPV1MgOCAvKiBudW1iZXIgb2Ygd2luZG93cyBmb3IgZW5lcmd5IGNhbGN1bGF0aW9uICovCiAKLSNkZWZpbmUgQkxPQ0tfU1dJVENISU5HX0lJUl9MRU4gICAgMiAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBIaWdoUGFzcy1JSVItRmlsdGVyIGZvciBBdHRhY2stRGV0ZWN0aW9uICovCi0jZGVmaW5lIEJMT0NLX1NXSVRDSF9FTkVSR1lfU0hJRlQgIDcgICAgICAgICAgICAgICAgICAvKiBzaG91bGQgYmUgbG9nRHVhbGlzKEJMT0NLX1NXSVRDSF9XSU5ET1dfTEVOKSB0byBhdm9pZCBvdmVyZmxvdyBpbiB3aW5kb3dOcmdzLiAqLworI2RlZmluZSBCTE9DS19TV0lUQ0hJTkdfSUlSX0xFTiBcCisgIDIgLyogTGVuZ3RoIG9mIEhpZ2hQYXNzLUlJUi1GaWx0ZXIgZm9yIEF0dGFjay1EZXRlY3Rpb24gKi8KKyNkZWZpbmUgQkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDcgLyogc2hvdWxkIGJlIGxvZ0R1YWxpcyhCTE9DS19TV0lUQ0hfV0lORE9XX0xFTikgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gXAorICAgICAgIHdpbmRvd05yZ3MuICovCiAKICNkZWZpbmUgTEFTVF9XSU5ET1cgMAogI2RlZmluZSBUSElTX1dJTkRPVyAxCiAKLQogLyoqKioqKioqKioqKioqKioqKiBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0ewotICBJTlQgICBsYXN0V2luZG93U2VxdWVuY2U7Ci0gIElOVCAgIHdpbmRvd1NoYXBlOwotICBJTlQgICBsYXN0V2luZG93U2hhcGU7Ci0gIFVJTlQgIG5CbG9ja1N3aXRjaFdpbmRvd3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygd2luZG93cyBmb3IgZW5lcmd5IGNhbGN1bGF0aW9uICovCi0gIElOVCAgIGF0dGFjazsKLSAgSU5UICAgbGFzdGF0dGFjazsKLSAgSU5UICAgYXR0YWNrSW5kZXg7Ci0gIElOVCAgIGxhc3RBdHRhY2tJbmRleDsKLSAgSU5UICAgYWxsb3dTaG9ydEZyYW1lczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBMb3cgRGVsYXksIGRvbid0IGFsbG93IHNob3J0IGZyYW1lcyAqLwotICBJTlQgICBhbGxvd0xvb2tBaGVhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIExvdyBEZWxheSwgZG9uJ3QgZG8gbG9vay1haGVhZCAqLwotICBJTlQgICBub09mR3JvdXBzOwotICBJTlQgICBncm91cExlbltNQVhfTk9fT0ZfR1JPVVBTXTsKLSAgRklYUF9EQkwgbWF4V2luZG93TnJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heCBlbmVyZ3kgaW4gc3Vid2luZG93cyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgbGFzdFdpbmRvd1NlcXVlbmNlOworICBJTlQgd2luZG93U2hhcGU7CisgIElOVCBsYXN0V2luZG93U2hhcGU7CisgIFVJTlQgbkJsb2NrU3dpdGNoV2luZG93czsgLyogbnVtYmVyIG9mIHdpbmRvd3MgZm9yIGVuZXJneSBjYWxjdWxhdGlvbiAqLworICBJTlQgYXR0YWNrOworICBJTlQgbGFzdGF0dGFjazsKKyAgSU5UIGF0dGFja0luZGV4OworICBJTlQgbGFzdEF0dGFja0luZGV4OworICBJTlQgYWxsb3dTaG9ydEZyYW1lczsgLyogZm9yIExvdyBEZWxheSwgZG9uJ3QgYWxsb3cgc2hvcnQgZnJhbWVzICovCisgIElOVCBhbGxvd0xvb2tBaGVhZDsgICAvKiBmb3IgTG93IERlbGF5LCBkb24ndCBkbyBsb29rLWFoZWFkICovCisgIElOVCBub09mR3JvdXBzOworICBJTlQgZ3JvdXBMZW5bTUFYX05PX09GX0dST1VQU107CisgIEZJWFBfREJMIG1heFdpbmRvd05yZzsgLyogbWF4IGVuZXJneSBpbiBzdWJ3aW5kb3dzICovCiAKLSAgRklYUF9EQkwgd2luZG93TnJnWzJdW0JMT0NLX1NXSVRDSF9XSU5ET1dTXTsgICAgIC8qIHRpbWUgc2lnbmFsIGVuZXJneSBpbiBTdWJ3aW5kb3dzIChsYXN0IGFuZCBjdXJyZW50KSAqLwotICBGSVhQX0RCTCB3aW5kb3dOcmdGWzJdW0JMT0NLX1NXSVRDSF9XSU5ET1dTXTsgICAgLyogZmlsdGVyZWQgdGltZSBzaWduYWwgZW5lcmd5IGluIHNlZ21lbnRzIChsYXN0IGFuZCBjdXJyZW50KSAqLwotICBGSVhQX0RCTCBhY2NXaW5kb3dOcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVjdXJzaXZlbHkgYWNjdW11bGF0ZWQgd2luZG93TnJnRiAqLworICBGSVhQX0RCTAorICB3aW5kb3dOcmdbMl1bQkxPQ0tfU1dJVENIX1dJTkRPV1NdOyAvKiB0aW1lIHNpZ25hbCBlbmVyZ3kgaW4gU3Vid2luZG93cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdCBhbmQgY3VycmVudCkgKi8KKyAgRklYUF9EQkwgd2luZG93TnJnRlsyXVtCTE9DS19TV0lUQ0hfV0lORE9XU107IC8qIGZpbHRlcmVkIHRpbWUgc2lnbmFsIGVuZXJneQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc2VnbWVudHMgKGxhc3QgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KSAqLworICBGSVhQX0RCTCBhY2NXaW5kb3dOcmc7IC8qIHJlY3Vyc2l2ZWx5IGFjY3VtdWxhdGVkIHdpbmRvd05yZ0YgKi8KIAotICBGSVhQX0RCTCBpaXJTdGF0ZXNbQkxPQ0tfU1dJVENISU5HX0lJUl9MRU5dOyAgICAgLyogZmlsdGVyIGRlbGF5LWxpbmUgKi8KKyAgRklYUF9EQkwgaWlyU3RhdGVzW0JMT0NLX1NXSVRDSElOR19JSVJfTEVOXTsgLyogZmlsdGVyIGRlbGF5LWxpbmUgKi8KIAogfSBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTDsKIAordm9pZCBGREthYWNFbmNfSW5pdEJsb2NrU3dpdGNoaW5nKAorICAgIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsIElOVCBpc0xvd0RlbGF5KTsKIAotCi0KLQotdm9pZCBGREthYWNFbmNfSW5pdEJsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsIElOVCBpc0xvd0RlbGF5KTsKLQotaW50IEZES2FhY0VuY19CbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwgY29uc3QgaW50IGlzTEZFLCBjb25zdCBJTlRfUENNICpwVGltZVNpZ25hbCk7CitpbnQgRkRLYWFjRW5jX0Jsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoLCBjb25zdCBpbnQgaXNMRkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00gKnBUaW1lU2lnbmFsKTsKIAogaW50IEZES2FhY0VuY19TeW5jQmxvY2tTd2l0Y2hpbmcoCi0gICAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdCwKLSAgICAgIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodCwKLSAgICAgIGNvbnN0IElOVCBub09mQ2hhbm5lbHMsCi0gICAgICBjb25zdCBJTlQgY29tbW9uV2luZG93KTsKKyAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdCwKKyAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQsIGNvbnN0IElOVCBub09mQ2hhbm5lbHMsCisgICAgY29uc3QgSU5UIGNvbW1vbldpbmRvdyk7CiAKLSNlbmRpZiAgLyogI2lmbmRlZiBfQkxPQ0tfU1dJVENIX0ggKi8KKyNlbmRpZiAvKiAjaWZuZGVmIEJMT0NLX1NXSVRDSF9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2NoYW5uZWxfbWFwLmNwcCBiL2xpYkFBQ2VuYy9zcmMvY2hhbm5lbF9tYXAuY3BwCmluZGV4IDU1OWE0Y2UuLjZlZTkxZDUgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvY2hhbm5lbF9tYXAuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvY2hhbm5lbF9tYXAuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIxICs5MCwyMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqICBGYXN0IE1QRUcgQUFDIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBLiBHcm9lc2NoZWwKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBjaGFubmVsIG1hcHBpbmcgZnVuY3Rpb25hbGl0eQorICAgQXV0aG9yKHMpOiAgIEEuIEdyb2VzY2hlbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogY2hhbm5lbCBtYXBwaW5nIGZ1bmN0aW9uYWxpdHkKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCiAjaW5jbHVkZSAiYml0ZW5jLmgiCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAjaW5jbHVkZSAicWNfZGF0YS5oIgogI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKLQorI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKIAogLyogY2hhbm5lbF9hc3NpZ25tZW50IHRyZWF0cyB0aGUgcmVsYXRpb25zaGlwIG9mIElucHV0IGZpbGUgY2hhbm5lbHMKICAgIHRvIHRoZSBlbmNvZGVyIGNoYW5uZWxzLgpAQCAtMTIxLDM2OSArMTMzLDQ2NCBAQAogICAgTEZFICAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgNSAoTEZFKQogKi8KIAotdHlwZWRlZiBzdHJ1Y3QgewotCi0gIENIQU5ORUxfTU9ERSAgZW5jb2Rlck1vZGU7Ci0gIElOVCAgICAgICAgICAgY2hhbm5lbF9hc3NpZ25tZW50Wy8qKDgpKi8xMl07Ci0KLX0gQ0hBTk5FTF9BU1NJR05NRU5UX0lORk9fVEFCOwotCi0KLXN0YXRpYyBjb25zdCBDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUIgYXNzaWdubWVudEluZm9UYWJNcGVnW10gPQotewotICAgICB7IE1PREVfSU5WQUxJRCwgICAgICAgICAgICAgICAgIHstMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBpbnZhbGlkICAgKi8KLSAgICAgeyBNT0RFXzEsICAgICAgICAgICAgICAgICAgICAgICB7IDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgbW9ubyAgICAgICovCi0gICAgIHsgTU9ERV8yLCAgICAgICAgICAgICAgICAgICAgICAgeyAwLCAxLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIHN0ZXJlbyAgICAqLwotICAgICB7IE1PREVfMV8yLCAgICAgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICAzY2ggICAgICAgKi8KLSAgICAgeyBNT0RFXzFfMl8xLCAgICAgICAgICAgICAgICAgICB7IDAsIDEsIDIsIDMsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgNGNoICAgICAgICovCi0gICAgIHsgTU9ERV8xXzJfMiwgICAgICAgICAgICAgICAgICAgeyAwLCAxLCAyLCAzLCA0LC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIDVjaCAgICAgICAqLwotICAgICB7IE1PREVfMV8yXzJfMSwgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1LjFjaCAgICAgKi8KLSAgICAgeyBNT0RFXzFfMl8yXzJfMSwgICAgICAgICAgICAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsLTEsLTEsLTEsLTF9IH0sICAvKiAgNy4xY2ggICAgICovCi0gICAgIHsgTU9ERV83XzFfUkVBUl9TVVJST1VORCwgICAgICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LC0xLC0xLC0xLC0xfSB9LCAgLyogIDcuMWNoICAgICAqLwotICAgICB7IE1PREVfN18xX0ZST05UX0NFTlRFUiwgICAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywtMSwtMSwtMSwtMX0gfSAgIC8qICA3LjFjaCAgICAgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUIgYXNzaWdubWVudEluZm9UYWJXYXZbXSA9Ci17Ci0gICAgIHsgTU9ERV9JTlZBTElELCAgICAgICAgICAgICAgICAgey0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIGludmFsaWQgICAqLwotICAgICB7IE1PREVfMSwgICAgICAgICAgICAgICAgICAgICAgIHsgMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBtb25vICAgICAgKi8KLSAgICAgeyBNT0RFXzIsICAgICAgICAgICAgICAgICAgICAgICB7IDAsIDEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgc3RlcmVvICAgICovCi0gICAgIHsgTU9ERV8xXzIsICAgICAgICAgICAgICAgICAgICAgeyAyLCAwLCAxLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIDNjaCAgICAgICAqLwotICAgICB7IE1PREVfMV8yXzEsICAgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwgMywtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA0Y2ggICAgICAgKi8KLSAgICAgeyBNT0RFXzFfMl8yLCAgICAgICAgICAgICAgICAgICB7IDIsIDAsIDEsIDMsIDQsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgNWNoICAgICAgICovCi0gICAgIHsgTU9ERV8xXzJfMl8xLCAgICAgICAgICAgICAgICAgeyAyLCAwLCAxLCA0LCA1LCAzLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIDUuMWNoICAgICAqLwotICAgICB7IE1PREVfMV8yXzJfMl8xLCAgICAgICAgICAgICAgIHsgMiwgNiwgNywgMCwgMSwgNCwgNSwgMywtMSwtMSwtMSwtMX0gfSwgIC8qICA3LjFjaCAgICAgKi8KLSAgICAgeyBNT0RFXzdfMV9SRUFSX1NVUlJPVU5ELCAgICAgICB7IDIsIDAsIDEsIDYsIDcsIDQsIDUsIDMsLTEsLTEsLTEsLTF9IH0sICAvKiAgNy4xY2ggICAgICovCi0gICAgIHsgTU9ERV83XzFfRlJPTlRfQ0VOVEVSLCAgICAgICAgeyAyLCA2LCA3LCAwLCAxLCA0LCA1LCAzLC0xLC0xLC0xLC0xfSB9LCAgLyogIDcuMWNoICAgICAqLwotfTsKLQogLyogQ2hhbm5lbCBtb2RlIGNvbmZpZ3VyYXRpb24gdGFiIHByb3ZpZGVzLAogICAgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGVsZW1lbnRzCiAqLwotc3RhdGljIGNvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCIGNoYW5uZWxNb2RlQ29uZmlnW10gPQotewotICAgeyBNT0RFXzEsICAgICAgICAgICAgICAgICAgICAgICAgMSwgIDEsICAxIH0sICAgLyogU0NFICAgICAgICAgICAgICAgICAqLwotICAgeyBNT0RFXzIsICAgICAgICAgICAgICAgICAgICAgICAgMiwgIDIsICAxIH0sICAgLyogQ1BFICAgICAgICAgICAgICAgICAqLwotICAgeyBNT0RFXzFfMiwgICAgICAgICAgICAgICAgICAgICAgMywgIDMsICAyIH0sICAgLyogU0NFLENQRSAgICAgICAgICAgICAqLwotICAgeyBNT0RFXzFfMl8xLCAgICAgICAgICAgICAgICAgICAgNCwgIDQsICAzIH0sICAgLyogU0NFLENQRSxTQ0UgICAgICAgICAqLwotICAgeyBNT0RFXzFfMl8yLCAgICAgICAgICAgICAgICAgICAgNSwgIDUsICAzIH0sICAgLyogU0NFLENQRSxDUEUgICAgICAgICAqLwotICAgeyBNT0RFXzFfMl8yXzEsICAgICAgICAgICAgICAgICAgNiwgIDUsICA0IH0sICAgLyogU0NFLENQRSxDUEUsTEZFICAgICAqLwotICAgeyBNT0RFXzFfMl8yXzJfMSwgICAgICAgICAgICAgICAgOCwgIDcsICA1IH0sICAgLyogU0NFLENQRSxDUEUsQ1BFLExGRSAqLwotICAgeyBNT0RFXzdfMV9SRUFSX1NVUlJPVU5ELCAgICAgICAgOCwgIDcsICA1IH0sCi0gICB7IE1PREVfN18xX0ZST05UX0NFTlRFUiwgICAgICAgICA4LCAgNywgIDUgfSwKK3N0YXRpYyBjb25zdCBDSEFOTkVMX01PREVfQ09ORklHX1RBQiBjaGFubmVsTW9kZUNvbmZpZ1tdID0geworICAgIHtNT0RFXzEsIDEsIDEsIDF9LCAgICAgICAgICAgICAvKiBjaENmZyAgMSwgU0NFICAgICAgICAgICAgICAgICAqLworICAgIHtNT0RFXzIsIDIsIDIsIDF9LCAgICAgICAgICAgICAvKiBjaENmZyAgMiwgQ1BFICAgICAgICAgICAgICAgICAqLworICAgIHtNT0RFXzFfMiwgMywgMywgMn0sICAgICAgICAgICAvKiBjaENmZyAgMywgU0NFLENQRSAgICAgICAgICAgICAqLworICAgIHtNT0RFXzFfMl8xLCA0LCA0LCAzfSwgICAgICAgICAvKiBjaENmZyAgNCwgU0NFLENQRSxTQ0UgICAgICAgICAqLworICAgIHtNT0RFXzFfMl8yLCA1LCA1LCAzfSwgICAgICAgICAvKiBjaENmZyAgNSwgU0NFLENQRSxDUEUgICAgICAgICAqLworICAgIHtNT0RFXzFfMl8yXzEsIDYsIDUsIDR9LCAgICAgICAvKiBjaENmZyAgNiwgU0NFLENQRSxDUEUsTEZFICAgICAqLworICAgIHtNT0RFXzFfMl8yXzJfMSwgOCwgNywgNX0sICAgICAvKiBjaENmZyAgNywgU0NFLENQRSxDUEUsQ1BFLExGRSAqLworICAgIHtNT0RFXzZfMSwgNywgNiwgNX0sICAgICAgICAgICAvKiBjaENmZyAxMSwgU0NFLENQRSxDUEUsU0NFLExGRSAqLworICAgIHtNT0RFXzdfMV9CQUNLLCA4LCA3LCA1fSwgICAgICAvKiBjaENmZyAxMiwgU0NFLENQRSxDUEUsQ1BFLExGRSAqLworICAgIHtNT0RFXzdfMV9UT1BfRlJPTlQsIDgsIDcsIDV9LCAvKiBjaENmZyAxNCwgU0NFLENQRSxDUEUsTEZFLENQRSAqLworICAgIHtNT0RFXzdfMV9SRUFSX1NVUlJPVU5ELCA4LCA3LAorICAgICA1fSwgLyogc2FtZSBhcyBNT0RFXzdfMV9CQUNLLCAgU0NFLENQRSxDUEUsQ1BFLExGRSAqLworICAgIHtNT0RFXzdfMV9GUk9OVF9DRU5URVIsIDgsIDcsCisgICAgIDV9LCAvKiBzYW1lIGFzIE1PREVfMV8yXzJfMl8xLCBTQ0UsQ1BFLENQRSxDUEUsTEZFICovCisKIH07CiAKLSNkZWZpbmUgTUFYX01PREVTIChzaXplb2YoYXNzaWdubWVudEluZm9UYWJXYXYpL3NpemVvZihDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUIpKQotCi1jb25zdCBJTlQqIEZES2FhY0VuY19nZXRDaGFubmVsQXNzaWdubWVudChDSEFOTkVMX01PREUgZW5jTW9kZSwgQ0hBTk5FTF9PUkRFUiBjbykKLXsKLSAgY29uc3QgQ0hBTk5FTF9BU1NJR05NRU5UX0lORk9fVEFCICpwVGFiOwotICBpbnQgaTsKLQotICBpZiAoY28gPT0gQ0hfT1JERVJfTVBFRykKLSAgICBwVGFiID0gYXNzaWdubWVudEluZm9UYWJNcGVnOwotICBlbHNlCi0gICAgcFRhYiA9IGFzc2lnbm1lbnRJbmZvVGFiV2F2OwotCi0gIGZvcihpPU1BWF9NT0RFUy0xOyBpPjA7IGktLSkgewotICAgIGlmIChlbmNNb2RlPT0gcFRhYltpXS5lbmNvZGVyTW9kZSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiAocFRhYltpXS5jaGFubmVsX2Fzc2lnbm1lbnQpOwotfQotCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfRGV0ZXJtaW5lRW5jb2Rlck1vZGUoQ0hBTk5FTF9NT0RFKiBtb2RlLCBJTlQgbkNoYW5uZWxzKQoteworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0RldGVybWluZUVuY29kZXJNb2RlKENIQU5ORUxfTU9ERSogbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbkNoYW5uZWxzKSB7CiAgIElOVCBpOwogICBDSEFOTkVMX01PREUgZW5jTW9kZSA9IE1PREVfSU5WQUxJRDsKIAotICBpZiAoKm1vZGU9PU1PREVfVU5LTk9XTikgewotICAgIGZvciAoaT0wOyBpPChJTlQpc2l6ZW9mKGNoYW5uZWxNb2RlQ29uZmlnKS8oSU5UKXNpemVvZihDSEFOTkVMX01PREVfQ09ORklHX1RBQik7IGkrKykgewotICAgICAgaWYgKGNoYW5uZWxNb2RlQ29uZmlnW2ldLm5DaGFubmVscz09bkNoYW5uZWxzKSB7Ci0gICAgICAgICAgZW5jTW9kZSA9IGNoYW5uZWxNb2RlQ29uZmlnW2ldLmVuY01vZGU7Ci0gICAgICAgICAgYnJlYWs7CisgIGlmICgqbW9kZSA9PSBNT0RFX1VOS05PV04pIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKElOVClzaXplb2YoY2hhbm5lbE1vZGVDb25maWcpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpc2l6ZW9mKENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKTsKKyAgICAgICAgIGkrKykgeworICAgICAgaWYgKGNoYW5uZWxNb2RlQ29uZmlnW2ldLm5DaGFubmVscyA9PSBuQ2hhbm5lbHMpIHsKKyAgICAgICAgZW5jTW9kZSA9IGNoYW5uZWxNb2RlQ29uZmlnW2ldLmVuY01vZGU7CisgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KICAgICAqbW9kZSA9IGVuY01vZGU7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgLyogY2hlY2sgaWYgdmFsaWQgY2hhbm5lbCBjb25maWd1cmF0aW9uICovCi0gICAgaWYgKEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oKm1vZGUpLT5uQ2hhbm5lbHM9PW5DaGFubmVscykgewotICAgICAgICBlbmNNb2RlID0gKm1vZGU7CisgICAgaWYgKEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oKm1vZGUpLT5uQ2hhbm5lbHMgPT0gbkNoYW5uZWxzKSB7CisgICAgICBlbmNNb2RlID0gKm1vZGU7CiAgICAgfQogICB9CiAKLSAgaWYgKGVuY01vZGU9PU1PREVfSU5WQUxJRCkgeworICBpZiAoZW5jTW9kZSA9PSBNT0RFX0lOVkFMSUQpIHsKICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOwogICB9CiAKICAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2luaXRFbGVtZW50IChFTEVNRU5UX0lORk8qIGVsSW5mbywgTVA0X0VMRU1FTlRfSUQgZWxUeXBlLCBJTlQqIGNudCwgQ0hBTk5FTF9NT0RFIG1vZGUsIENIQU5ORUxfT1JERVIgY28sIElOVCogaXRfY250LCBjb25zdCBGSVhQX0RCTCByZWxCaXRzKSB7CitzdGF0aWMgSU5UIEZES2FhY0VuY19pbml0RWxlbWVudChFTEVNRU5UX0lORk8qIGVsSW5mbywgTVA0X0VMRU1FTlRfSUQgZWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiBjbnQsIEZES19jaGFubmVsTWFwRGVzY3IqIG1hcERlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBtYXBJZHgsIElOVCogaXRfY250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgcmVsQml0cykgeworICBJTlQgZXJyb3IgPSAwOworICBJTlQgY291bnRlciA9ICpjbnQ7CiAKLSAgSU5UIGVycm9yPTA7Ci0gIElOVCBjb3VudGVyID0qY250OwotCi0gIGNvbnN0IElOVCAqYXNzaWduID0gRkRLYWFjRW5jX2dldENoYW5uZWxBc3NpZ25tZW50KG1vZGUsIGNvKTsKLQotICBlbEluZm8tPmVsVHlwZT1lbFR5cGU7CisgIGVsSW5mby0+ZWxUeXBlID0gZWxUeXBlOwogICBlbEluZm8tPnJlbGF0aXZlQml0cyA9IHJlbEJpdHM7CiAKLSAgc3dpdGNoKGVsSW5mby0+ZWxUeXBlKSB7Ci0gIGNhc2UgSURfU0NFOiBjYXNlIElEX0xGRTogY2FzZSBJRF9DQ0U6Ci0gICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsPTE7Ci0gICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMF09YXNzaWduW2NvdW50ZXIrK107Ci0gICAgZWxJbmZvLT5pbnN0YW5jZVRhZz1pdF9jbnRbZWxUeXBlXSsrOwotCi0gICAgYnJlYWs7Ci0gIGNhc2UgSURfQ1BFOgotICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0yOwotICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPWFzc2lnbltjb3VudGVyKytdOwotICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzFdPWFzc2lnbltjb3VudGVyKytdOwotICAgIGVsSW5mby0+aW5zdGFuY2VUYWc9aXRfY250W2VsVHlwZV0rKzsKLSAgICBicmVhazsKLSAgY2FzZSBJRF9EU0U6Ci0gICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsPTA7Ci0gICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMF09MDsKLSAgICBlbEluZm8tPkNoYW5uZWxJbmRleFsxXT0wOwotICAgIGVsSW5mby0+aW5zdGFuY2VUYWc9aXRfY250W2VsVHlwZV0rKzsKLSAgICBicmVhazsKLSAgZGVmYXVsdDogZXJyb3I9MTsKKyAgc3dpdGNoIChlbEluZm8tPmVsVHlwZSkgeworICAgIGNhc2UgSURfU0NFOgorICAgIGNhc2UgSURfTEZFOgorICAgIGNhc2UgSURfQ0NFOgorICAgICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsID0gMTsKKyAgICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdID0KKyAgICAgICAgICBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZShtYXBEZXNjciwgY291bnRlcisrLCBtYXBJZHgpOworICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZyA9IGl0X2NudFtlbFR5cGVdKys7CisgICAgICBicmVhazsKKyAgICBjYXNlIElEX0NQRToKKyAgICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbCA9IDI7CisgICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFswXSA9CisgICAgICAgICAgRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUobWFwRGVzY3IsIGNvdW50ZXIrKywgbWFwSWR4KTsKKyAgICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzFdID0KKyAgICAgICAgICBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZShtYXBEZXNjciwgY291bnRlcisrLCBtYXBJZHgpOworICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZyA9IGl0X2NudFtlbFR5cGVdKys7CisgICAgICBicmVhazsKKyAgICBjYXNlIElEX0RTRToKKyAgICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbCA9IDA7CisgICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFswXSA9IDA7CisgICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFsxXSA9IDA7CisgICAgICBlbEluZm8tPmluc3RhbmNlVGFnID0gaXRfY250W2VsVHlwZV0rKzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciA9IDE7CiAgIH07CiAgICpjbnQgPSBjb3VudGVyOwogICByZXR1cm4gZXJyb3I7Ci0KIH0KIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRDaGFubmVsTWFwcGluZyhDSEFOTkVMX01PREUgbW9kZSwgQ0hBTk5FTF9PUkRFUiBjbywgQ0hBTk5FTF9NQVBQSU5HKiBjbSkKLXsKLSAgSU5UIGNvdW50PTA7IC8qIGNvdW50IHRocm91Z2ggY29kZXIgY2hhbm5lbHMgKi8KLSAgSU5UIGl0X2NudFtJRF9FTkQrMV07CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdENoYW5uZWxNYXBwaW5nKENIQU5ORUxfTU9ERSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX09SREVSIGNvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqIGNtKSB7CisgIElOVCBjb3VudCA9IDA7IC8qIGNvdW50IHRocm91Z2ggY29kZXIgY2hhbm5lbHMgKi8KKyAgSU5UIGl0X2NudFtJRF9FTkQgKyAxXTsKICAgSU5UIGk7CisgIFVJTlQgbWFwSWR4OworICBGREtfY2hhbm5lbE1hcERlc2NyIG1hcERlc2NyOwogCi0gIGZvciAoaT0wOyBpPElEX0VORDsgaSsrKQotICAgIGl0X2NudFtpXT0wOworICBmb3IgKGkgPSAwOyBpIDwgSURfRU5EOyBpKyspIGl0X2NudFtpXSA9IDA7CiAKICAgRkRLbWVtY2xlYXIoY20sIHNpemVvZihDSEFOTkVMX01BUFBJTkcpKTsKIAogICAvKiBpbml0IGNoYW5uZWwgbWFwcGluZyovCi0gIGZvciAoaT0wOyBpPChJTlQpc2l6ZW9mKGNoYW5uZWxNb2RlQ29uZmlnKS8oSU5UKXNpemVvZihDSEFOTkVMX01PREVfQ09ORklHX1RBQik7IGkrKykgewotICAgIGlmIChjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlPT1tb2RlKQotICAgIHsKLSAgICAgICAgY20tPmVuY01vZGUgICAgICA9IGNoYW5uZWxNb2RlQ29uZmlnW2ldLmVuY01vZGU7Ci0gICAgICAgIGNtLT5uQ2hhbm5lbHMgICAgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5uQ2hhbm5lbHM7Ci0gICAgICAgIGNtLT5uQ2hhbm5lbHNFZmYgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5uQ2hhbm5lbHNFZmY7Ci0gICAgICAgIGNtLT5uRWxlbWVudHMgICAgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5uRWxlbWVudHM7CisgIGZvciAoaSA9IDA7IGkgPCAoSU5UKXNpemVvZihjaGFubmVsTW9kZUNvbmZpZykgLworICAgICAgICAgICAgICAgICAgICAgIChJTlQpc2l6ZW9mKENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKTsKKyAgICAgICBpKyspIHsKKyAgICBpZiAoY2hhbm5lbE1vZGVDb25maWdbaV0uZW5jTW9kZSA9PSBtb2RlKSB7CisgICAgICBjbS0+ZW5jTW9kZSA9IGNoYW5uZWxNb2RlQ29uZmlnW2ldLmVuY01vZGU7CisgICAgICBjbS0+bkNoYW5uZWxzID0gY2hhbm5lbE1vZGVDb25maWdbaV0ubkNoYW5uZWxzOworICAgICAgY20tPm5DaGFubmVsc0VmZiA9IGNoYW5uZWxNb2RlQ29uZmlnW2ldLm5DaGFubmVsc0VmZjsKKyAgICAgIGNtLT5uRWxlbWVudHMgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5uRWxlbWVudHM7CiAKLSAgICAgICAgYnJlYWs7CisgICAgICBicmVhazsKICAgICB9CiAgIH0KIAorICAvKiBpbml0IG1hcCBkZXNjcmlwdG9yICovCisgIEZES19jaE1hcERlc2NyX2luaXQoJm1hcERlc2NyLCBOVUxMLCAwLCAoY28gPT0gQ0hfT1JERVJfTVBFRykgPyAxIDogMCk7CisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgTU9ERV83XzFfUkVBUl9TVVJST1VORDogLyogTU9ERV83XzFfUkVBUl9TVVJST1VORCBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RFXzdfMV9CQUNLICovCisgICAgICBtYXBJZHggPSAoSU5UKU1PREVfN18xX0JBQ0s7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjogLyogTU9ERV83XzFfRlJPTlRfQ0VOVEVSIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ERV8xXzJfMl8yXzEgKi8KKyAgICAgIG1hcElkeCA9IChJTlQpTU9ERV8xXzJfMl8yXzE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbWFwSWR4ID0KKyAgICAgICAgICAoSU5UKW1vZGUgPiAxNAorICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgOiAoSU5UKQorICAgICAgICAgICAgICAgICAgICBtb2RlOyAvKiBpZiBjaGFubmVsIGNvbmZpZyA+IDE0IE1QRUcgbWFwcGluZyB3aWxsIGJlIHVzZWQgKi8KKyAgfQorCiAgIC8qIGluaXQgZWxlbWVudCBpbmZvIHN0cnVjdCAqLwotICBzd2l0Y2gobW9kZSkgeworICBzd2l0Y2ggKG1vZGUpIHsKICAgICBjYXNlIE1PREVfMToKICAgICAgIC8qIChtb25vKSBzY2UgICovCi0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX1NDRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCAoRklYUF9EQkwpTUFYVkFMX0RCTCk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX1NDRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIChGSVhQX0RCTClNQVhWQUxfREJMKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgTU9ERV8yOgogICAgICAgLyogKHN0ZXJlbykgY3BlICovCi0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCAoRklYUF9EQkwpTUFYVkFMX0RCTCk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX0NQRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIChGSVhQX0RCTClNQVhWQUxfREJMKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBNT0RFXzFfMjoKICAgICAgIC8qIHNjZSArIGNwZSAqLwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC40ZikpOwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzFdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC42ZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjRmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuNmYpKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBNT0RFXzFfMl8xOgogICAgICAgLyogc2NlICsgY3BlICsgc2NlICovCi0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX1NDRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjNmKSk7Ci0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjRmKSk7Ci0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX1NDRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjNmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX1NDRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuM2YpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC40ZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzJdLCBJRF9TQ0UsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjNmKSk7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgTU9ERV8xXzJfMjoKICAgICAgIC8qIHNjZSArIGNwZSArIGNwZSAqLwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKLSAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMzdmKSk7Ci0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjM3ZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjI2ZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzFdLCBJRF9DUEUsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjM3ZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzJdLCBJRF9DUEUsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjM3ZikpOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIE1PREVfMV8yXzJfMToKICAgICAgIC8qICg1LjEpIHNjZSArIGNwZSArIGNwZSArIGxmZSAqLwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNGYpKTsKLSAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMzVmKSk7Ci0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjM1ZikpOwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzNdLCBJRF9MRkUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4wNmYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNGYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zNWYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1syXSwgSURfQ1BFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zNWYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1szXSwgSURfTEZFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4wNmYpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNT0RFXzZfMToKKyAgICAgIC8qICg2LjEpIHNjZSArIGNwZSArIGNwZSArIHNjZSArIGxmZSAqLworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjJmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjc1ZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzJdLCBJRF9DUEUsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjI3NWYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1szXSwgSURfU0NFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzRdLCBJRF9MRkUsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjA1ZikpOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIE1PREVfMV8yXzJfMl8xOgorICAgIGNhc2UgTU9ERV83XzFfQkFDSzoKKyAgICBjYXNlIE1PREVfN18xX1RPUF9GUk9OVDoKICAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6Ci0gICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6IHsKICAgICAgIC8qICg3LjEpIHNjZSArIGNwZSArIGNwZSArIGNwZSArIGxmZSAqLwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4xOGYpKTsKLSAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjZmKSk7Ci0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjI2ZikpOwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzNdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKLSAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1s0XSwgSURfTEZFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMDRmKSk7CisgICAgICAvKiAoNy4xIHRvcCkgc2NlICsgY3BlICsgY3BlICsgbGZlICsgY3BlICovCisKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4xOGYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1syXSwgSURfQ1BFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKKyAgICAgIGlmIChtb2RlICE9IE1PREVfN18xX1RPUF9GUk9OVCkgeworICAgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bM10sIElEX0NQRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKKyAgICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzRdLCBJRF9MRkUsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMDRmKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bM10sIElEX0xGRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4wNGYpKTsKKyAgICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzRdLCBJRF9DUEUsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjZmKSk7CisgICAgICB9CiAgICAgICBicmVhazsKKyAgICB9CisKICAgICBkZWZhdWx0OgogICAgICAgLy8qY2hNYXA9MDsKICAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CiAgIH07CiAKLQotICBGREtfQVNTRVJUKGNtLT5uRWxlbWVudHM8PSg4KSk7Ci0KKyAgRkRLX0FTU0VSVChjbS0+bkVsZW1lbnRzIDw9ICgoOCkpKTsKIAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRFbGVtZW50Qml0cyhRQ19TVEFURSAqaFFDLAotICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKmNtLAotICAgICAgICAgICAgICAgICAgICBJTlQgYml0cmF0ZVRvdCwKLSAgICAgICAgICAgICAgICAgICAgSU5UIGF2ZXJhZ2VCaXRzVG90LAotICAgICAgICAgICAgICAgICAgICBJTlQgbWF4Q2hhbm5lbEJpdHMpCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdEVsZW1lbnRCaXRzKFFDX1NUQVRFKiBoUUMsIENIQU5ORUxfTUFQUElORyogY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBiaXRyYXRlVG90LCBJTlQgYXZlcmFnZUJpdHNUb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtYXhDaGFubmVsQml0cykgewogICBpbnQgc2NfYnJUb3QgPSBDb3VudExlYWRpbmdCaXRzKGJpdHJhdGVUb3QpOwogCi0gIHN3aXRjaChjbS0+ZW5jTW9kZSkgewotICBjYXNlIE1PREVfMToKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCAgICAgID0gYml0cmF0ZVRvdDsKKyAgc3dpdGNoIChjbS0+ZW5jTW9kZSkgeworICAgIGNhc2UgTU9ERV8xOgorICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgPSBiaXRyYXRlVG90OwogCi0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsICAgICAgICA9IG1heENoYW5uZWxCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsID0gbWF4Q2hhbm5lbEJpdHM7CiAKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5yZWxhdGl2ZUJpdHNFbCAgID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7Ci0gICAgYnJlYWs7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOworICAgICAgYnJlYWs7CiAKLSAgY2FzZSBNT0RFXzI6Ci0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgICAgICA9IGJpdHJhdGVUb3Q+PjE7CisgICAgY2FzZSBNT0RFXzI6CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCA9IGJpdHJhdGVUb3QgPj4gMTsKIAotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsID0gMiAqIG1heENoYW5uZWxCaXRzOwogCi0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgICA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwotICAgIGJyZWFrOwotICBjYXNlIE1PREVfMV8yOiB7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwotICAgIEZJWFBfREJMIHNjZVJhdGUgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBjcGVSYXRlID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzFfMjogeworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBzY2VSYXRlID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBjcGVSYXRlID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CiAKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoc2NlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoY3BlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoc2NlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gc2NfYnJUb3Q7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoY3BlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gKHNjX2JyVG90ICsgMSk7CiAKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgICAgICAgID0gbWF4Q2hhbm5lbEJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+bWF4Qml0c0VsICAgICAgICA9IDIqbWF4Q2hhbm5lbEJpdHM7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBNT0RFXzFfMl8xOiB7Ci0gICAgLyogc2NlICsgY3BlICsgc2NlICovCi0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7Ci0gICAgRklYUF9EQkwgc2NlMVJhdGUgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBjcGVSYXRlICA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwotICAgIEZJWFBfREJMIHNjZTJSYXRlID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgPSBtYXhDaGFubmVsQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCA9IDIgKiBtYXhDaGFubmVsQml0czsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE1PREVfMV8yXzE6IHsKKyAgICAgIC8qIHNjZSArIGNwZSArIHNjZSAqLworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgc2NlMVJhdGUgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIGNwZVJhdGUgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIHNjZTJSYXRlID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CiAKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoc2NlMVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+c2NfYnJUb3Q7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGNwZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PihzY19iclRvdCsxKTsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoc2NlMlJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+c2NfYnJUb3Q7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoc2NlMVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IHNjX2JyVG90OworICAgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGNwZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IChzY19iclRvdCArIDEpOworICAgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KHNjZTJSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiBzY19iclRvdDsKIAotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgICAgICAgID0gMiptYXhDaGFubmVsQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgICAgICAgID0gbWF4Q2hhbm5lbEJpdHM7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBNT0RFXzFfMl8yOiB7Ci0gICAgLyogc2NlICsgY3BlICsgY3BlICovCi0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7Ci0gICAgRklYUF9EQkwgc2NlUmF0ZSAgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBjcGUxUmF0ZSA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwotICAgIEZJWFBfREJMIGNwZTJSYXRlID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgPSBtYXhDaGFubmVsQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCA9IDIgKiBtYXhDaGFubmVsQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPm1heEJpdHNFbCA9IG1heENoYW5uZWxCaXRzOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTU9ERV8xXzJfMjogeworICAgICAgLyogc2NlICsgY3BlICsgY3BlICovCisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBzY2VSYXRlID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBjcGUxUmF0ZSA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgY3BlMlJhdGUgPSBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKIAotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChzY2VSYXRlLCAgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoY3BlMVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChjcGUyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoc2NlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gc2NfYnJUb3Q7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoY3BlMVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IChzY19iclRvdCArIDEpOworICAgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGNwZTJSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiAoc2NfYnJUb3QgKyAxKTsKIAotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgICAgICAgID0gMiptYXhDaGFubmVsQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgICAgICAgID0gMiptYXhDaGFubmVsQml0czsKLSAgICBicmVhazsKLSAgfQorICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsID0gbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgPSAyICogbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgPSAyICogbWF4Q2hhbm5lbEJpdHM7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBNT0RFXzFfMl8yXzE6IHsKKyAgICAgIC8qICg1LjEpIHNjZSArIGNwZSArIGNwZSArIGxmZSAqLworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1szXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzNdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIHNjZVJhdGUgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIGNwZTFSYXRlID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBjcGUyUmF0ZSA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgbGZlUmF0ZSA9IGNtLT5lbEluZm9bM10ucmVsYXRpdmVCaXRzOwogCi0gIGNhc2UgTU9ERV8xXzJfMl8xOiB7Ci0gICAgLyogKDUuMSkgc2NlICsgY3BlICsgY3BlICsgbGZlICovCi0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1szXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzNdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBzY2VSYXRlICA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwotICAgIEZJWFBfREJMIGNwZTFSYXRlID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7Ci0gICAgRklYUF9EQkwgY3BlMlJhdGUgPSBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBsZmVSYXRlICA9IGNtLT5lbEluZm9bM10ucmVsYXRpdmVCaXRzOworICAgICAgaW50IG1heEJpdHNUb3QgPQorICAgICAgICAgIG1heENoYW5uZWxCaXRzICogNTsgLyogTEZFIGRvZXMgbm90IGFkZCB0byBiaXQgcmVzZXJ2b2lyICovCisgICAgICBpbnQgc2MgPSBDb3VudExlYWRpbmdCaXRzKGZpeE1heChtYXhDaGFubmVsQml0cywgYXZlcmFnZUJpdHNUb3QpKTsKKyAgICAgIGludCBtYXhMZmVCaXRzID0gKGludClmTWF4KAorICAgICAgICAgIChJTlQpKChmTXVsdChsZmVSYXRlLCAoRklYUF9EQkwpKG1heENoYW5uZWxCaXRzIDw8IHNjKSkgPj4gc2MpIDw8IDEpLAorICAgICAgICAgIChJTlQpKChmTXVsdChGTDJGWENPTlNUX0RCTCgxLjFmIC8gMi5mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZk11bHQobGZlUmF0ZSwgKEZJWFBfREJMKShhdmVyYWdlQml0c1RvdCA8PCBzYykpKQorICAgICAgICAgICAgICAgICA8PCAxKSA+PgorICAgICAgICAgICAgICAgIHNjKSk7CiAKLSAgICBpbnQgbWF4Qml0c1RvdCA9IG1heENoYW5uZWxCaXRzICogNTsgLyogTEZFIGRvZXMgbm90IGFkZCB0byBiaXQgcmVzZXJ2b2lyICovCi0gICAgaW50IHNjID0gQ291bnRMZWFkaW5nQml0cyhmaXhNYXgobWF4Q2hhbm5lbEJpdHMsYXZlcmFnZUJpdHNUb3QpKTsKLSAgICBpbnQgbWF4TGZlQml0cyA9IChpbnQpIEZES21heCAoIChJTlQpKChmTXVsdChsZmVSYXRlLChGSVhQX0RCTCkobWF4Q2hhbm5lbEJpdHM8PHNjKSk+PnNjKTw8MSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKSgoZk11bHQoRkwyRlhDT05TVF9EQkwoMS4xZi8yLmYpLGZNdWx0KGxmZVJhdGUsKEZJWFBfREJMKShhdmVyYWdlQml0c1RvdDw8c2MpKSk8PDEpPj5zYykgKTsKKyAgICAgIG1heENoYW5uZWxCaXRzID0gKG1heEJpdHNUb3QgLSBtYXhMZmVCaXRzKTsKKyAgICAgIHNjID0gQ291bnRMZWFkaW5nQml0cyhtYXhDaGFubmVsQml0cyk7CiAKLSAgICBtYXhDaGFubmVsQml0cyA9IChtYXhCaXRzVG90IC0gbWF4TGZlQml0cyk7Ci0gICAgc2MgPSBDb3VudExlYWRpbmdCaXRzKG1heENoYW5uZWxCaXRzKTsKKyAgICAgIG1heENoYW5uZWxCaXRzID0KKyAgICAgICAgICBmTXVsdCgoRklYUF9EQkwpbWF4Q2hhbm5lbEJpdHMgPDwgc2MsIEdldEludkludCg1KSkgPj4gc2M7CiAKLSAgICBtYXhDaGFubmVsQml0cyA9IGZNdWx0KChGSVhQX0RCTCltYXhDaGFubmVsQml0czw8c2MsR2V0SW52SW50KDUpKT4+c2M7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoc2NlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gc2NfYnJUb3Q7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoY3BlMVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IChzY19iclRvdCArIDEpOworICAgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGNwZTJSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiAoc2NfYnJUb3QgKyAxKTsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbM10tPmNoQml0cmF0ZUVsID0KKyAgICAgICAgICBmTXVsdChsZmVSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiBzY19iclRvdDsKIAotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChzY2VSYXRlLCAgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoY3BlMVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChjcGUyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1szXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGxmZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsID0gbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgPSAyICogbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgPSAyICogbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzNdLT5tYXhCaXRzRWwgPSBtYXhMZmVCaXRzOwogCi0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsICAgICAgICA9IG1heENoYW5uZWxCaXRzOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbM10tPm1heEJpdHNFbCAgICAgICAgPSBtYXhMZmVCaXRzOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTU9ERV82XzE6IHsKKyAgICAgIC8qICg2LjEpIHNjZSArIGNwZSArIGNwZSArIHNjZSArIGxmZSAqLworICAgICAgRklYUF9EQkwgc2NlUmF0ZSA9IGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0KKyAgICAgICAgICBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIGNwZTFSYXRlID0gaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPQorICAgICAgICAgIGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgY3BlMlJhdGUgPSBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9CisgICAgICAgICAgY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBzY2UyUmF0ZSA9IGhRQy0+ZWxlbWVudEJpdHNbM10tPnJlbGF0aXZlQml0c0VsID0KKyAgICAgICAgICBjbS0+ZWxJbmZvWzNdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIGxmZVJhdGUgPSBoUUMtPmVsZW1lbnRCaXRzWzRdLT5yZWxhdGl2ZUJpdHNFbCA9CisgICAgICAgICAgY20tPmVsSW5mb1s0XS5yZWxhdGl2ZUJpdHM7CiAKLSAgICBicmVhazsKLSAgfQotICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6Ci0gIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgotICBjYXNlIE1PREVfMV8yXzJfMl8xOiB7Ci0gICAgaW50IGNwZTNJZHggPSAzOwotICAgIGludCBsZmVJZHggID0gNDsKKyAgICAgIGludCBtYXhCaXRzVG90ID0KKyAgICAgICAgICBtYXhDaGFubmVsQml0cyAqIDY7IC8qIExGRSBkb2VzIG5vdCBhZGQgdG8gYml0IHJlc2Vydm9pciAqLworICAgICAgaW50IHNjID0gQ291bnRMZWFkaW5nQml0cyhmaXhNYXgobWF4Q2hhbm5lbEJpdHMsIGF2ZXJhZ2VCaXRzVG90KSk7CisgICAgICBpbnQgbWF4TGZlQml0cyA9IChpbnQpZk1heCgKKyAgICAgICAgICAoSU5UKSgoZk11bHQobGZlUmF0ZSwgKEZJWFBfREJMKShtYXhDaGFubmVsQml0cyA8PCBzYykpID4+IHNjKSA8PCAxKSwKKyAgICAgICAgICAoSU5UKSgoZk11bHQoRkwyRlhDT05TVF9EQkwoMS4xZiAvIDIuZiksCisgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGxmZVJhdGUsIChGSVhQX0RCTCkoYXZlcmFnZUJpdHNUb3QgPDwgc2MpKSkKKyAgICAgICAgICAgICAgICAgPDwgMSkgPj4KKyAgICAgICAgICAgICAgICBzYykpOwogCi0gICAgLyogKDcuMSkgc2NlICsgY3BlICsgY3BlICsgY3BlICsgbGZlICovCi0gICAgRklYUF9EQkwgc2NlUmF0ZSAgPSBoUUMtPmVsZW1lbnRCaXRzWzBdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwotICAgIEZJWFBfREJMIGNwZTFSYXRlID0gaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBjcGUyUmF0ZSA9IGhRQy0+ZWxlbWVudEJpdHNbMl0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7Ci0gICAgRklYUF9EQkwgY3BlM1JhdGUgPSBoUUMtPmVsZW1lbnRCaXRzW2NwZTNJZHhdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bY3BlM0lkeF0ucmVsYXRpdmVCaXRzOwotICAgIEZJWFBfREJMIGxmZVJhdGUgID0gaFFDLT5lbGVtZW50Qml0c1tsZmVJZHhdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bbGZlSWR4XS5yZWxhdGl2ZUJpdHM7CisgICAgICBtYXhDaGFubmVsQml0cyA9IChtYXhCaXRzVG90IC0gbWF4TGZlQml0cykgLyA2OwogCi0gICAgaW50IG1heEJpdHNUb3QgPSBtYXhDaGFubmVsQml0cyAqIDc7IC8qIExGRSBkb2VzIG5vdCBhZGQgdG8gYml0IHJlc2Vydm9pciAqLwotICAgIGludCBzYyA9IENvdW50TGVhZGluZ0JpdHMoZml4TWF4KG1heENoYW5uZWxCaXRzLGF2ZXJhZ2VCaXRzVG90KSk7Ci0gICAgaW50IG1heExmZUJpdHMgPSAoaW50KSBGREttYXggKCAoSU5UKSgoZk11bHQobGZlUmF0ZSwoRklYUF9EQkwpKG1heENoYW5uZWxCaXRzPDxzYykpPj5zYyk8PDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCkoKGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMWYvMi5mKSxmTXVsdChsZmVSYXRlLChGSVhQX0RCTCkoYXZlcmFnZUJpdHNUb3Q8PHNjKSkpPDwxKT4+c2MpICk7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoc2NlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gc2NfYnJUb3Q7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoY3BlMVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IChzY19iclRvdCArIDEpOworICAgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGNwZTJSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiAoc2NfYnJUb3QgKyAxKTsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbM10tPmNoQml0cmF0ZUVsID0KKyAgICAgICAgICBmTXVsdChzY2UyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gKHNjX2JyVG90ICsgMSk7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzRdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQobGZlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gc2NfYnJUb3Q7CiAKLSAgICBtYXhDaGFubmVsQml0cyA9IChtYXhCaXRzVG90IC0gbWF4TGZlQml0cykgLyA3OworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsID0gbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgPSAyICogbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgPSAyICogbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzNdLT5tYXhCaXRzRWwgPSBtYXhDaGFubmVsQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbNF0tPm1heEJpdHNFbCA9IG1heExmZUJpdHM7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBNT0RFXzdfMV9UT1BfRlJPTlQ6CisgICAgY2FzZSBNT0RFXzdfMV9CQUNLOgorICAgIGNhc2UgTU9ERV83XzFfUkVBUl9TVVJST1VORDoKKyAgICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKKyAgICBjYXNlIE1PREVfMV8yXzJfMl8xOiB7CisgICAgICBpbnQgY3BlM0lkeCA9IChjbS0+ZW5jTW9kZSAhPSBNT0RFXzdfMV9UT1BfRlJPTlQpID8gMyA6IDQ7CisgICAgICBpbnQgbGZlSWR4ID0gKGNtLT5lbmNNb2RlICE9IE1PREVfN18xX1RPUF9GUk9OVCkgPyA0IDogMzsKIAotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsID0gZk11bHQoc2NlUmF0ZSwgIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+c2NfYnJUb3Q7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgPSBmTXVsdChjcGUxUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1syXS0+Y2hCaXRyYXRlRWwgPSBmTXVsdChjcGUyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1tjcGUzSWR4XS0+Y2hCaXRyYXRlRWwgPSBmTXVsdChjcGUzUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1tsZmVJZHhdLT5jaEJpdHJhdGVFbCA9IGZNdWx0KGxmZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OworICAgICAgLyogKDcuMSkgc2NlICsgY3BlICsgY3BlICsgY3BlICsgbGZlICovCisgICAgICBGSVhQX0RCTCBzY2VSYXRlID0gaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPQorICAgICAgICAgIGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgY3BlMVJhdGUgPSBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9CisgICAgICAgICAgY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBjcGUyUmF0ZSA9IGhRQy0+ZWxlbWVudEJpdHNbMl0tPnJlbGF0aXZlQml0c0VsID0KKyAgICAgICAgICBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIGNwZTNSYXRlID0gaFFDLT5lbGVtZW50Qml0c1tjcGUzSWR4XS0+cmVsYXRpdmVCaXRzRWwgPQorICAgICAgICAgIGNtLT5lbEluZm9bY3BlM0lkeF0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgbGZlUmF0ZSA9IGhRQy0+ZWxlbWVudEJpdHNbbGZlSWR4XS0+cmVsYXRpdmVCaXRzRWwgPQorICAgICAgICAgIGNtLT5lbEluZm9bbGZlSWR4XS5yZWxhdGl2ZUJpdHM7CiAKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgPSBtYXhDaGFubmVsQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgPSAyKm1heENoYW5uZWxCaXRzOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPm1heEJpdHNFbCA9IDIqbWF4Q2hhbm5lbEJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1tjcGUzSWR4XS0+bWF4Qml0c0VsID0gMiptYXhDaGFubmVsQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzW2xmZUlkeF0tPm1heEJpdHNFbCA9IG1heExmZUJpdHM7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICAgICAgaW50IG1heEJpdHNUb3QgPQorICAgICAgICAgIG1heENoYW5uZWxCaXRzICogNzsgLyogTEZFIGRvZXMgbm90IGFkZCB0byBiaXQgcmVzZXJ2b2lyICovCisgICAgICBpbnQgc2MgPSBDb3VudExlYWRpbmdCaXRzKGZpeE1heChtYXhDaGFubmVsQml0cywgYXZlcmFnZUJpdHNUb3QpKTsKKyAgICAgIGludCBtYXhMZmVCaXRzID0gKGludClmTWF4KAorICAgICAgICAgIChJTlQpKChmTXVsdChsZmVSYXRlLCAoRklYUF9EQkwpKG1heENoYW5uZWxCaXRzIDw8IHNjKSkgPj4gc2MpIDw8IDEpLAorICAgICAgICAgIChJTlQpKChmTXVsdChGTDJGWENPTlNUX0RCTCgxLjFmIC8gMi5mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZk11bHQobGZlUmF0ZSwgKEZJWFBfREJMKShhdmVyYWdlQml0c1RvdCA8PCBzYykpKQorICAgICAgICAgICAgICAgICA8PCAxKSA+PgorICAgICAgICAgICAgICAgIHNjKSk7CisKKyAgICAgIG1heENoYW5uZWxCaXRzID0gKG1heEJpdHNUb3QgLSBtYXhMZmVCaXRzKSAvIDc7CisKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsID0KKyAgICAgICAgICBmTXVsdChzY2VSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiBzY19iclRvdDsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPmNoQml0cmF0ZUVsID0KKyAgICAgICAgICBmTXVsdChjcGUxUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gKHNjX2JyVG90ICsgMSk7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoY3BlMlJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IChzY19iclRvdCArIDEpOworICAgICAgaFFDLT5lbGVtZW50Qml0c1tjcGUzSWR4XS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGNwZTNSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiAoc2NfYnJUb3QgKyAxKTsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbbGZlSWR4XS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGxmZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IHNjX2JyVG90OworCisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgPSBtYXhDaGFubmVsQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCA9IDIgKiBtYXhDaGFubmVsQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPm1heEJpdHNFbCA9IDIgKiBtYXhDaGFubmVsQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbY3BlM0lkeF0tPm1heEJpdHNFbCA9IDIgKiBtYXhDaGFubmVsQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbbGZlSWR4XS0+bWF4Qml0c0VsID0gbWF4TGZlQml0czsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOwogICB9CiAKICAgcmV0dXJuIEFBQ19FTkNfT0s7CkBAIC00OTEsNjEgKzU5OCw2NiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBmdW5jdGlvbjogICAgR2V0TW9ub1N0ZXJlb01PREUoY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmdW5jdGlvbjogICAgR2V0TW9ub1N0ZXJlb01PREUoY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBkZXNjcmlwdGlvbjogRGV0ZXJtaW5lcyBlbmNvZGVyIHNldHRpbmcgZnJvbSBjaGFubmVsIG1vZGUuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgTXVsdGljaGFubmVsIG1vZGVzIGFyZSBtYXBwZWQgdG8gbW9ubyBvciBzdGVyZW8gbW9kZXMgICAgICAgICAgICovCisvKiBkZXNjcmlwdGlvbjogRGV0ZXJtaW5lcyBlbmNvZGVyIHNldHRpbmcgZnJvbSBjaGFubmVsIG1vZGUuICovCisvKiAgICAgICAgICAgICAgTXVsdGljaGFubmVsIG1vZGVzIGFyZSBtYXBwZWQgdG8gbW9ubyBvciBzdGVyZW8gbW9kZXMgKi8KIC8qICAgICAgICAgICAgICByZXR1cm5zIE1PREVfTU9OTyBpbiBjYXNlIG9mIG1vbm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgIE1PREVfU1RFUkVPIGluIGNhc2Ugb2Ygc3RlcmVvICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgIE1PREVfSU5WQUxJRCBpbiBjYXNlIG9mIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGlucHV0OiAgICAgICBDSEFOTkVMX01PREUgbW9kZTogRW5jb2RlciBtb2RlIChzZWUgcWNfZGF0YS5oKS4gICAgICAgICAgICAgICAgKi8KLS8qIG91dHB1dDogICAgICByZXR1cm46IENNX1NURVJFT19NT0RFIG1vbm9TdGVyZW9TZXR0aW5nICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGlucHV0OiAgICAgICBDSEFOTkVMX01PREUgbW9kZTogRW5jb2RlciBtb2RlIChzZWUgcWNfZGF0YS5oKS4gKi8KKy8qIG91dHB1dDogICAgICByZXR1cm46IENNX1NURVJFT19NT0RFIG1vbm9TdGVyZW9TZXR0aW5nICovCiAvKiAgICAgICAgICAgICAgKE1PREVfSU5WQUxJRDogZXJyb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgIE1PREVfTU9OTzogICAgbW9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgIE1PREVfU1RFUkVPOiAgc3RlcmVvKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBtaXNjOiAgICAgICAgTm8gbWVtb3J5IGlzIGFsbG9jYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBtaXNjOiAgICAgICAgTm8gbWVtb3J5IGlzIGFsbG9jYXRlZC4gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotRUxFTUVOVF9NT0RFIEZES2FhY0VuY19HZXRNb25vU3RlcmVvTW9kZShjb25zdCBDSEFOTkVMX01PREUgbW9kZSl7Ci0KK0VMRU1FTlRfTU9ERSBGREthYWNFbmNfR2V0TW9ub1N0ZXJlb01vZGUoY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpIHsKICAgRUxFTUVOVF9NT0RFIG1vbm9TdGVyZW9TZXR0aW5nID0gRUxfTU9ERV9JTlZBTElEOwogCi0gIHN3aXRjaChtb2RlKXsKLSAgY2FzZSBNT0RFXzE6ICAgICAgICAvKiBtb25vIHNldHVwcyAqLwotICAgIG1vbm9TdGVyZW9TZXR0aW5nID0gRUxfTU9ERV9NT05POwotICAgIGJyZWFrOwotICBjYXNlIE1PREVfMjogICAgICAgIC8qIHN0ZXJlbyBzZXR1cHMgKi8KLSAgY2FzZSBNT0RFXzFfMjoKLSAgY2FzZSBNT0RFXzFfMl8xOgotICBjYXNlIE1PREVfMV8yXzI6Ci0gIGNhc2UgTU9ERV8xXzJfMl8xOgotICBjYXNlIE1PREVfMV8yXzJfMl8xOgotICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6Ci0gIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgotICAgIG1vbm9TdGVyZW9TZXR0aW5nID0gRUxfTU9ERV9TVEVSRU87Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6ICAgICAgICAgICAgLyogZXJyb3IgKi8KLSAgICBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfSU5WQUxJRDsKLSAgICBicmVhazsKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBNT0RFXzE6IC8qIG1vbm8gc2V0dXBzICovCisgICAgICBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfTU9OTzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNT0RFXzI6IC8qIHN0ZXJlbyBzZXR1cHMgKi8KKyAgICBjYXNlIE1PREVfMV8yOgorICAgIGNhc2UgTU9ERV8xXzJfMToKKyAgICBjYXNlIE1PREVfMV8yXzI6CisgICAgY2FzZSBNT0RFXzFfMl8yXzE6CisgICAgY2FzZSBNT0RFXzZfMToKKyAgICBjYXNlIE1PREVfMV8yXzJfMl8xOgorICAgIGNhc2UgTU9ERV83XzFfUkVBUl9TVVJST1VORDoKKyAgICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKKyAgICBjYXNlIE1PREVfN18xX0JBQ0s6CisgICAgY2FzZSBNT0RFXzdfMV9UT1BfRlJPTlQ6CisgICAgICBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfU1RFUkVPOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiAvKiBlcnJvciAqLworICAgICAgbW9ub1N0ZXJlb1NldHRpbmcgPSBFTF9NT0RFX0lOVkFMSUQ7CisgICAgICBicmVhazsKICAgfQogCiAgIHJldHVybiBtb25vU3RlcmVvU2V0dGluZzsKIH0KIAotY29uc3QgQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIqIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpCi17Citjb25zdCBDSEFOTkVMX01PREVfQ09ORklHX1RBQiogRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbigKKyAgICBjb25zdCBDSEFOTkVMX01PREUgbW9kZSkgewogICBJTlQgaTsKLSAgY29uc3QgQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIgKmNtX2NvbmZpZyA9IE5VTEw7CisgIGNvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKiBjbV9jb25maWcgPSBOVUxMOwogCiAgIC8qIGdldCBjaGFubmVsIG1vZGUgY29uZmlnICovCi0gIGZvciAoaT0wOyBpPChJTlQpc2l6ZW9mKGNoYW5uZWxNb2RlQ29uZmlnKS8oSU5UKXNpemVvZihDSEFOTkVMX01PREVfQ09ORklHX1RBQik7IGkrKykgewotICAgIGlmIChjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlPT1tb2RlKQotICAgIHsKLSAgICAgICAgY21fY29uZmlnID0gJmNoYW5uZWxNb2RlQ29uZmlnW2ldOwotICAgICAgICBicmVhazsKKyAgZm9yIChpID0gMDsgaSA8IChJTlQpc2l6ZW9mKGNoYW5uZWxNb2RlQ29uZmlnKSAvCisgICAgICAgICAgICAgICAgICAgICAgKElOVClzaXplb2YoQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIpOworICAgICAgIGkrKykgeworICAgIGlmIChjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlID09IG1vZGUpIHsKKyAgICAgIGNtX2NvbmZpZyA9ICZjaGFubmVsTW9kZUNvbmZpZ1tpXTsKKyAgICAgIGJyZWFrOwogICAgIH0KICAgfQogICByZXR1cm4gY21fY29uZmlnOwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9jaGFubmVsX21hcC5oIGIvbGliQUFDZW5jL3NyYy9jaGFubmVsX21hcC5oCmluZGV4IDJjZmI0ODYuLmY5MTU0Y2QgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvY2hhbm5lbF9tYXAuaAorKysgYi9saWJBQUNlbmMvc3JjL2NoYW5uZWxfbWFwLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTggKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKiogIEZhc3QgTVBFRyBBQUMgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIEEuIEdyb2VzY2hlbAotICAgY29udGVudHMvZGVzY3JpcHRpb246IGNoYW5uZWwgbWFwcGluZyBmdW5jdGlvbmFsaXR5CisgICBBdXRob3Iocyk6ICAgQS4gR3JvZXNjaGVsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBjaGFubmVsIG1hcHBpbmcgZnVuY3Rpb25hbGl0eQogCi0jaWZuZGVmIF9DSEFOTkVMX01BUF9ICi0jZGVmaW5lIF9DSEFOTkVMX01BUF9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIENIQU5ORUxfTUFQX0gKKyNkZWZpbmUgQ0hBTk5FTF9NQVBfSAogCiAjaW5jbHVkZSAiYWFjZW5jLmgiCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCkBAIC0xMDMsMTQgKzExNCw4IEBACiAgIElOVCBuRWxlbWVudHM7CiB9IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCOwogCi0KIC8qIEVsZW1lbnQgbW9kZSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgRUxfTU9ERV9JTlZBTElEID0gMCwKLSAgRUxfTU9ERV9NT05PLAotICBFTF9NT0RFX1NURVJFTwotfSBFTEVNRU5UX01PREU7Ci0KK3R5cGVkZWYgZW51bSB7IEVMX01PREVfSU5WQUxJRCA9IDAsIEVMX01PREVfTU9OTywgRUxfTU9ERV9TVEVSRU8gfSBFTEVNRU5UX01PREU7CiAKIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19EZXRlcm1pbmVFbmNvZGVyTW9kZShDSEFOTkVMX01PREUqIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5DaGFubmVscyk7CkBAIC0xMTksMTQgKzEyNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX09SREVSIGNvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqIGNoTWFwKTsKIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRFbGVtZW50Qml0cyhRQ19TVEFURSAqaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKmNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYml0cmF0ZVRvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGF2ZXJhZ2VCaXRzVG90LAorQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRFbGVtZW50Qml0cyhRQ19TVEFURSogaFFDLCBDSEFOTkVMX01BUFBJTkcqIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYml0cmF0ZVRvdCwgSU5UIGF2ZXJhZ2VCaXRzVG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWF4Q2hhbm5lbEJpdHMpOwogCiBFTEVNRU5UX01PREUgRkRLYWFjRW5jX0dldE1vbm9TdGVyZW9Nb2RlKGNvbnN0IENIQU5ORUxfTU9ERSBtb2RlKTsKIAotY29uc3QgQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIqIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpOworY29uc3QgQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIqIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oCisgICAgY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpOwogCiAjZW5kaWYgLyogQ0hBTk5FTF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9jaGFvc21lYXN1cmUuY3BwIGIvbGliQUFDZW5jL3NyYy9jaGFvc21lYXN1cmUuY3BwCmluZGV4IDRlNTZlOWUuLjY2NDI4NGIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvY2hhb3NtZWFzdXJlLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2NoYW9zbWVhc3VyZS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IENoYW9zIG1lYXN1cmUgY2FsY3VsYXRpb24KKyAgIEF1dGhvcihzKTogICBNLiBXZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IENoYW9zIG1lYXN1cmUgY2FsY3VsYXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImNoYW9zbWVhc3VyZS5oIgogCkBAIC05NCw0MCArMTA2LDYzIEBACiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZVBlYWtGYXN0CiAgICAgZGVzY3JpcHRpb246ICBFYmVybGVpbiBtZXRob2Qgb2YgY2hhb3MgbWVhc3VyZSBjYWxjdWxhdGlvbiBieSBoaWdoLXBhc3MKICAgICAgICAgICAgICAgICAgIGZpbHRlcmluZyBhbXBsaXR1ZGUgc3BlY3RydW0KLSAgICAgICAgICAgICAgICAgIEEgc3BlY2lhbCBjYXNlIG9mIEZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmVUb25hbEdlbmVyaWMgLS0KLSAgICAgICAgICAgICAgICAgIGhpZ2hseSBvcHRpbWl6ZWQKKyAgICAgICAgICAgICAgICAgIEEgc3BlY2lhbCBjYXNlIG9mIEZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmVUb25hbEdlbmVyaWMKKy0tIGhpZ2hseSBvcHRpbWl6ZWQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLUZES2FhY0VuY19GREthYWNFbmNfQ2FsY3VsYXRlQ2hhb3NNZWFzdXJlUGVha0Zhc3QoIEZJWFBfREJMICAqUkVTVFJJQ1QgcGFNRENURGF0YU5NMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIG51bWJlck9mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpSRVNUUklDVCBjaGFvc01lYXN1cmUgKQoteworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0ZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmVQZWFrRmFzdCgKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcGFNRENURGF0YU5NMCwgSU5UIG51bWJlck9mTGluZXMsCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIGNoYW9zTWVhc3VyZSkgewogICBJTlQgaSwgajsKIAogICAvKiBjYWxjdWxhdGUgY2hhb3MgbWVhc3VyZSBieSAicGVhayBmaWx0ZXIiICovCi0gIGZvciAoaT0wOyBpPDI7IGkrKykgewotICAgIC8qIG1ha2UgZXZlbiBhbmQgb2RkIHBhc3MgdGhyb3VnaCBkYXRhICovCi0gICAgRklYUF9EQkwgbGVmdCxjZW50ZXI7IC8qIGxlZnQsIGNlbnRlciB0YXAgb2YgZmlsdGVyICovCisgIC8qIG1ha2UgZXZlbiBhbmQgb2RkIHBhc3MgdGhyb3VnaCBkYXRhICovCisgIEZJWFBfREJMIGxlZnRfMF9kaXYyLAorICAgICAgY2VudGVyXzA7IC8qIGxlZnQsIGNlbnRlciB0YXAgb2YgZmlsdGVyLCBldmVuIG51bWJlcmVkICovCisgIEZJWFBfREJMIGxlZnRfMV9kaXYyLCBjZW50ZXJfMTsgLyogbGVmdCwgY2VudGVyIHRhcCBvZiBmaWx0ZXIsIG9kZCBudW1iZXJlZCAqLwogCi0gICAgbGVmdCAgID0gKEZJWFBfREJMKSgoTE9ORylwYU1EQ1REYXRhTk0wW2ldXigoTE9ORylwYU1EQ1REYXRhTk0wW2ldPj4oREZSQUNUX0JJVFMtMSkpKTsKLSAgICBjZW50ZXIgPSAoRklYUF9EQkwpKChMT05HKXBhTURDVERhdGFOTTBbaSsyXV4oKExPTkcpcGFNRENURGF0YU5NMFtpKzJdPj4oREZSQUNUX0JJVFMtMSkpKTsKKyAgbGVmdF8wX2RpdjIgPSAoRklYUF9EQkwpKCgoTE9ORylwYU1EQ1REYXRhTk0wWzBdIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExPTkcpcGFNRENURGF0YU5NMFswXSA+PiAoREZSQUNUX0JJVFMgLSAxKSkpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgbGVmdF8xX2RpdjIgPSAoRklYUF9EQkwpKCgoTE9ORylwYU1EQ1REYXRhTk0wWzFdIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExPTkcpcGFNRENURGF0YU5NMFsxXSA+PiAoREZSQUNUX0JJVFMgLSAxKSkpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgY2VudGVyXzAgPSAoRklYUF9EQkwpKChMT05HKXBhTURDVERhdGFOTTBbMl0gXgorICAgICAgICAgICAgICAgICAgICAgICAgKChMT05HKXBhTURDVERhdGFOTTBbMl0gPj4gKERGUkFDVF9CSVRTIC0gMSkpKTsKKyAgY2VudGVyXzEgPSAoRklYUF9EQkwpKChMT05HKXBhTURDVERhdGFOTTBbM10gXgorICAgICAgICAgICAgICAgICAgICAgICAgKChMT05HKXBhTURDVERhdGFOTTBbM10gPj4gKERGUkFDVF9CSVRTIC0gMSkpKTsKIAotICAgIGZvciAoaiA9IGkrMjsgaiA8IG51bWJlck9mTGluZXMgLSAyOyBqKz0yKSB7Ci0gICAgICBGSVhQX0RCTCByaWdodCA9IChGSVhQX0RCTCkoKExPTkcpcGFNRENURGF0YU5NMFtqKzJdXigoTE9ORylwYU1EQ1REYXRhTk0wW2orMl0+PihERlJBQ1RfQklUUy0xKSkpOwotICAgICAgRklYUF9EQkwgdG1wID0gKGxlZnQ+PjEpKyhyaWdodD4+MSk7CisgIGZvciAoaiA9IDI7IGogPCBudW1iZXJPZkxpbmVzIC0gMjsgaiArPSAyKSB7CisgICAgRklYUF9EQkwgcmlnaHRfMCA9CisgICAgICAgIChGSVhQX0RCTCkoKExPTkcpcGFNRENURGF0YU5NMFtqICsgMl0gXgorICAgICAgICAgICAgICAgICAgICgoTE9ORylwYU1EQ1REYXRhTk0wW2ogKyAyXSA+PiAoREZSQUNUX0JJVFMgLSAxKSkpOworICAgIEZJWFBfREJMIHRtcF8wID0gbGVmdF8wX2RpdjIgKyAocmlnaHRfMCA+PiAxKTsKKyAgICBGSVhQX0RCTCByaWdodF8xID0KKyAgICAgICAgKEZJWFBfREJMKSgoTE9ORylwYU1EQ1REYXRhTk0wW2ogKyAzXSBeCisgICAgICAgICAgICAgICAgICAgKChMT05HKXBhTURDVERhdGFOTTBbaiArIDNdID4+IChERlJBQ1RfQklUUyAtIDEpKSk7CisgICAgRklYUF9EQkwgdG1wXzEgPSBsZWZ0XzFfZGl2MiArIChyaWdodF8xID4+IDEpOwogCi0gICAgICBpZiAodG1wIDwgY2VudGVyICkgewotICAgICAgICAgSU5UIGxlYWRpbmdCaXRzID0gQ250TGVhZGluZ1plcm9zKGNlbnRlciktMTsKLSAgICAgICAgIHRtcCA9IHNjaHVyX2Rpdih0bXA8PGxlYWRpbmdCaXRzLCBjZW50ZXI8PGxlYWRpbmdCaXRzLCA4KTsKLSAgICAgICAgIGNoYW9zTWVhc3VyZVtqXSA9IGZNdWx0KHRtcCx0bXApOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgICBjaGFvc01lYXN1cmVbal0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKLSAgICAgIH0KLQotICAgICAgbGVmdCAgID0gY2VudGVyOwotICAgICAgY2VudGVyID0gcmlnaHQ7CisgICAgaWYgKHRtcF8wIDwgY2VudGVyXzApIHsKKyAgICAgIElOVCBsZWFkaW5nQml0cyA9IENudExlYWRpbmdaZXJvcyhjZW50ZXJfMCkgLSAxOworICAgICAgdG1wXzAgPSBzY2h1cl9kaXYodG1wXzAgPDwgbGVhZGluZ0JpdHMsIGNlbnRlcl8wIDw8IGxlYWRpbmdCaXRzLCA4KTsKKyAgICAgIHRtcF8wID0gZk11bHQodG1wXzAsIHRtcF8wKTsKKyAgICB9IGVsc2UgeworICAgICAgdG1wXzAgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICB9CisgICAgY2hhb3NNZWFzdXJlW2ogKyAwXSA9IHRtcF8wOworICAgIGxlZnRfMF9kaXYyID0gY2VudGVyXzAgPj4gMTsKKyAgICBjZW50ZXJfMCA9IHJpZ2h0XzA7CisKKyAgICBpZiAodG1wXzEgPCBjZW50ZXJfMSkgeworICAgICAgSU5UIGxlYWRpbmdCaXRzID0gQ250TGVhZGluZ1plcm9zKGNlbnRlcl8xKSAtIDE7CisgICAgICB0bXBfMSA9IHNjaHVyX2Rpdih0bXBfMSA8PCBsZWFkaW5nQml0cywgY2VudGVyXzEgPDwgbGVhZGluZ0JpdHMsIDgpOworICAgICAgdG1wXzEgPSBmTXVsdCh0bXBfMSwgdG1wXzEpOworICAgIH0gZWxzZSB7CisgICAgICB0bXBfMSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgIH0KKworICAgIGxlZnRfMV9kaXYyID0gY2VudGVyXzEgPj4gMTsKKyAgICBjZW50ZXJfMSA9IHJpZ2h0XzE7CisgICAgY2hhb3NNZWFzdXJlW2ogKyAxXSA9IHRtcF8xOwogICB9CiAKICAgLyogcHJvdmlkZSBjaGFvcyBtZWFzdXJlIGZvciBmaXJzdCBmZXcgbGluZXMgKi8KQEAgLTEzNSwxMSArMTcwLDEwIEBACiAgIGNoYW9zTWVhc3VyZVsxXSA9IGNoYW9zTWVhc3VyZVsyXTsKIAogICAvKiBwcm92aWRlIGNoYW9zIG1lYXN1cmUgZm9yIGxhc3QgZmV3IGxpbmVzICovCi0gIGZvciAoaSA9IChudW1iZXJPZkxpbmVzLTMpOyBpIDwgbnVtYmVyT2ZMaW5lczsgaSsrKQorICBmb3IgKGkgPSAobnVtYmVyT2ZMaW5lcyAtIDMpOyBpIDwgbnVtYmVyT2ZMaW5lczsgaSsrKQogICAgIGNoYW9zTWVhc3VyZVtpXSA9IEZMMkZYQ09OU1RfREJMKDAuNSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQ2FsY3VsYXRlQ2hhb3NNZWFzdXJlCiAgICAgZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIGEgY2hhb3NtZWFzdXJlIGZvciBldmVyeSBsaW5lLCBkaWZmZXJlbnQgbWV0aG9kcwpAQCAtMTQ4LDE0ICsxODIsMTAgQEAKICAgICBpbnB1dDogICAgICAgIE1EQ1QgZGF0YSwgbnVtYmVyIG9mIGxpbmVzCiAgICAgb3V0cHV0OiAgICAgICBjaGFvc01lYXN1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZSggRklYUF9EQkwgICAgKnBhTURDVERhdGFOTTAsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICBudW1iZXJPZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqY2hhb3NNZWFzdXJlICkKK3ZvaWQgRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZShGSVhQX0RCTCAqcGFNRENURGF0YU5NMCwgSU5UIG51bWJlck9mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNoYW9zTWVhc3VyZSkKIAogewotICAgIEZES2FhY0VuY19GREthYWNFbmNfQ2FsY3VsYXRlQ2hhb3NNZWFzdXJlUGVha0Zhc3QoIHBhTURDVERhdGFOTTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW9zTWVhc3VyZSApOworICBGREthYWNFbmNfRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZVBlYWtGYXN0KAorICAgICAgcGFNRENURGF0YU5NMCwgbnVtYmVyT2ZMaW5lcywgY2hhb3NNZWFzdXJlKTsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9jaGFvc21lYXN1cmUuaCBiL2xpYkFBQ2VuYy9zcmMvY2hhb3NtZWFzdXJlLmgKaW5kZXggNDQzMDFjNS4uNjBkNDEzNyAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9jaGFvc21lYXN1cmUuaAorKysgYi9saWJBQUNlbmMvc3JjL2NoYW9zbWVhc3VyZS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI1ICs5MCwyMyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBDaGFvcyBtZWFzdXJlIGNhbGN1bGF0aW9uCisgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBDaGFvcyBtZWFzdXJlIGNhbGN1bGF0aW9uCiAKLSNpZm5kZWYgX19DSEFPU01FQVNVUkVfSAotI2RlZmluZSBfX0NIQU9TTUVBU1VSRV9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENIQU9TTUVBU1VSRV9ICisjZGVmaW5lIENIQU9TTUVBU1VSRV9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCi0KICNpbmNsdWRlICJwc3lfY29uc3QuaCIKIAotdm9pZAotRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZSggRklYUF9EQkwgICAgKnBhTURDVERhdGFOTTAsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG51bWJlck9mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpjaGFvc01lYXN1cmUgKTsKK3ZvaWQgRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZShGSVhQX0RCTCAqcGFNRENURGF0YU5NMCwgSU5UIG51bWJlck9mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNoYW9zTWVhc3VyZSk7CiAKLSNlbmRpZgorI2VuZGlmIC8qIENIQU9TTUVBU1VSRV9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2R5bl9iaXRzLmNwcCBiL2xpYkFBQ2VuYy9zcmMvZHluX2JpdHMuY3BwCmluZGV4IDBjMDcxMDkuLjc0YmFlYjggMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvZHluX2JpdHMuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvZHluX2JpdHMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IE5vaXNlbGVzcyBjb2RlciBtb2R1bGUKKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogTm9pc2VsZXNzIGNvZGVyIG1vZHVsZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiZHluX2JpdHMuaCIKICNpbmNsdWRlICJiaXRfY250LmgiCkBAIC05NywxOCArMTA5LDE1IEBACiAKIHR5cGVkZWYgSU5UICgqbG9va1VwVGFibGUpW0NPREVfQk9PS19FU0NfTkRYICsgMV07CiAKLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2dldFNpZGVJbmZvQml0cygKLSAgICAgICAgY29uc3QgU0VDVElPTl9JTkZPKiBjb25zdCBodWZmc2VjdGlvbiwKLSAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0ICAgICAgICBzaWRlSW5mb1RhYiwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICB1c2VIQ1IKLSAgICAgICAgKQoteworc3RhdGljIElOVCBGREthYWNFbmNfZ2V0U2lkZUluZm9CaXRzKGNvbnN0IFNFQ1RJT05fSU5GTyogY29uc3QgaHVmZnNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0IHNpZGVJbmZvVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB1c2VIQ1IpIHsKICAgSU5UIHNpZGVJbmZvQml0czsKIAotICBpZiAoIHVzZUhDUiAmJiAoKGh1ZmZzZWN0aW9uLT5jb2RlQm9vayA9PSAxMSkgfHwgKGh1ZmZzZWN0aW9uLT5jb2RlQm9vayA+PSAxNikpICkgeworICBpZiAodXNlSENSICYmCisgICAgICAoKGh1ZmZzZWN0aW9uLT5jb2RlQm9vayA9PSAxMSkgfHwgKGh1ZmZzZWN0aW9uLT5jb2RlQm9vayA+PSAxNikpKSB7CiAgICAgc2lkZUluZm9CaXRzID0gNTsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBzaWRlSW5mb0JpdHMgPSBzaWRlSW5mb1RhYltodWZmc2VjdGlvbi0+c2ZiQ250XTsKICAgfQogCkBAIC0xMTcsNDMgKzEyNiwzMiBAQAogCiAvKiBjb3VudCBiaXRzIHVzaW5nIGFsbCBwb3NzaWJsZSB0YWJsZXMgKi8KIHN0YXRpYyB2b2lkIEZES2FhY0VuY19idWlsZEJpdExvb2tVcCgKLSAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0ICAgICAgICBxdWFudFNwZWN0cnVtLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG1heFNmYiwKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgIGNvbnN0IFVJTlQqIGNvbnN0ICAgICAgICAgc2ZiTWF4LAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgIFNFQ1RJT05fSU5GTyogY29uc3QgICAgICAgaHVmZnNlY3Rpb24KLSAgICAgICAgKQoteworICAgIGNvbnN0IFNIT1JUKiBjb25zdCBxdWFudFNwZWN0cnVtLCBjb25zdCBJTlQgbWF4U2ZiLAorICAgIGNvbnN0IElOVCogY29uc3Qgc2ZiT2Zmc2V0LCBjb25zdCBVSU5UKiBjb25zdCBzZmJNYXgsCisgICAgSU5UIGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCisgICAgU0VDVElPTl9JTkZPKiBjb25zdCBodWZmc2VjdGlvbikgewogICBJTlQgaSwgc2ZiV2lkdGg7CiAKLSAgZm9yIChpID0gMDsgaSA8IG1heFNmYjsgaSsrKQotICB7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhTZmI7IGkrKykgewogICAgIGh1ZmZzZWN0aW9uW2ldLnNmYkNudCA9IDE7CiAgICAgaHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQgPSBpOwogICAgIGh1ZmZzZWN0aW9uW2ldLnNlY3Rpb25CaXRzID0gSU5WQUxJRF9CSVRDT1VOVDsKICAgICBodWZmc2VjdGlvbltpXS5jb2RlQm9vayA9IC0xOwogICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W2kgKyAxXSAtIHNmYk9mZnNldFtpXTsKLSAgICBGREthYWNFbmNfYml0Q291bnQocXVhbnRTcGVjdHJ1bSArIHNmYk9mZnNldFtpXSwgc2ZiV2lkdGgsIHNmYk1heFtpXSwgYml0TG9va1VwW2ldKTsKKyAgICBGREthYWNFbmNfYml0Q291bnQocXVhbnRTcGVjdHJ1bSArIHNmYk9mZnNldFtpXSwgc2ZiV2lkdGgsIHNmYk1heFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwW2ldKTsKICAgfQogfQogCiAvKiBlc3NlbnRpYWwgaGVscGVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIElOVCBGREthYWNFbmNfZmluZEJlc3RCb29rKAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgIGJjLAotICAgICAgICBJTlQqIGNvbnN0ICAgICAgICAgICAgICAgIGJvb2ssCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgdXNlVkNCMTEKLSAgICAgICAgKQoteworc3RhdGljIGlubGluZSBJTlQgRkRLYWFjRW5jX2ZpbmRCZXN0Qm9vayhjb25zdCBJTlQqIGNvbnN0IGJjLCBJTlQqIGNvbnN0IGJvb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB1c2VWQ0IxMSkgewogICBJTlQgbWluQml0cyA9IElOVkFMSURfQklUQ09VTlQsIGo7CiAKICAgaW50IGVuZCA9IENPREVfQk9PS19FU0NfTkRYOwogCi0KLSAgZm9yIChqID0gMDsgaiA8PSBlbmQ7IGorKykKLSAgewotICAgIGlmIChiY1tqXSA8IG1pbkJpdHMpCi0gICAgeworICBmb3IgKGogPSAwOyBqIDw9IGVuZDsgaisrKSB7CisgICAgaWYgKGJjW2pdIDwgbWluQml0cykgewogICAgICAgbWluQml0cyA9IGJjW2pdOwogICAgICAgKmJvb2sgPSBqOwogICAgIH0KQEAgLTE2MSwxMTQgKzE1OSw5NCBAQAogICByZXR1cm4gKG1pbkJpdHMpOwogfQogCi1zdGF0aWMgSU5UIEZES2FhY0VuY19maW5kTWluTWVyZ2VCaXRzKAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgIGJjMSwKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICBiYzIsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgdXNlVkNCMTEKLSAgICAgICAgKQoteworc3RhdGljIGlubGluZSBJTlQgRkRLYWFjRW5jX2ZpbmRNaW5NZXJnZUJpdHMoY29uc3QgSU5UKiBjb25zdCBiYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQqIGNvbnN0IGJjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB1c2VWQ0IxMSkgewogICBJTlQgbWluQml0cyA9IElOVkFMSURfQklUQ09VTlQsIGo7CiAKLSAgaW50IGVuZCA9IENPREVfQk9PS19FU0NfTkRYOworICBEV09SRF9BTElHTkVEKGJjMSk7CisgIERXT1JEX0FMSUdORUQoYmMyKTsKIAotCi0gIGZvciAoaiA9IDA7IGogPD0gZW5kOyBqKyspCi0gIHsKLSAgICBpZiAoYmMxW2pdICsgYmMyW2pdIDwgbWluQml0cykKLSAgICB7Ci0gICAgICBtaW5CaXRzID0gYmMxW2pdICsgYmMyW2pdOwotICAgIH0KKyAgZm9yIChqID0gMDsgaiA8PSBDT0RFX0JPT0tfRVNDX05EWDsgaisrKSB7CisgICAgbWluQml0cyA9IGZpeE1pbihtaW5CaXRzLCBiYzFbal0gKyBiYzJbal0pOwogICB9CiAgIHJldHVybiAobWluQml0cyk7CiB9CiAKLXN0YXRpYyB2b2lkIEZES2FhY0VuY19tZXJnZUJpdExvb2tVcCgKLSAgICAgICAgSU5UKiBjb25zdCAgICAgICAgICAgICAgICBiYzEsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgYmMyCi0gICAgICAgICkKLXsKK3N0YXRpYyBpbmxpbmUgdm9pZCBGREthYWNFbmNfbWVyZ2VCaXRMb29rVXAoSU5UKiBjb25zdCBSRVNUUklDVCBiYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCogY29uc3QgUkVTVFJJQ1QgYmMyKSB7CiAgIGludCBqOwogCi0gIGZvciAoaiA9IDA7IGogPD0gQ09ERV9CT09LX0VTQ19ORFg7IGorKykKLSAgeworICBmb3IgKGogPSAwOyBqIDw9IENPREVfQk9PS19FU0NfTkRYOyBqKyspIHsKKyAgICBGREtfQVNTRVJUKElOVkFMSURfQklUQ09VTlQgPT0gMHgxRkZGRkZGRik7CiAgICAgYmMxW2pdID0gZml4TWluKGJjMVtqXSArIGJjMltqXSwgSU5WQUxJRF9CSVRDT1VOVCk7CiAgIH0KIH0KIAotc3RhdGljIElOVCBGREthYWNFbmNfZmluZE1heE1lcmdlKAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgIG1lcmdlR2Fpbkxvb2tVcCwKLSAgICAgICAgY29uc3QgU0VDVElPTl9JTkZPKiBjb25zdCAgaHVmZnNlY3Rpb24sCi0gICAgICAgIGNvbnN0IElOVCBtYXhTZmIsCi0gICAgICAgIElOVCogY29uc3QgICAgICAgICAgICAgICAgbWF4TmR4Ci0gICAgICAgICkKLXsKK3N0YXRpYyBpbmxpbmUgSU5UIEZES2FhY0VuY19maW5kTWF4TWVyZ2UoY29uc3QgSU5UKiBjb25zdCBtZXJnZUdhaW5Mb29rVXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNFQ1RJT05fSU5GTyogY29uc3QgaHVmZnNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBtYXhTZmIsIElOVCogY29uc3QgbWF4TmR4KSB7CiAgIElOVCBpLCBtYXhNZXJnZUdhaW4gPSAwOworICBpbnQgbGFzdE1heE5keCA9IDA7CiAKLSAgZm9yIChpID0gMDsgaSArIGh1ZmZzZWN0aW9uW2ldLnNmYkNudCA8IG1heFNmYjsgaSArPSBodWZmc2VjdGlvbltpXS5zZmJDbnQpCi0gIHsKLSAgICBpZiAobWVyZ2VHYWluTG9va1VwW2ldID4gbWF4TWVyZ2VHYWluKQotICAgIHsKKyAgZm9yIChpID0gMDsgaSArIGh1ZmZzZWN0aW9uW2ldLnNmYkNudCA8IG1heFNmYjsgaSArPSBodWZmc2VjdGlvbltpXS5zZmJDbnQpIHsKKyAgICBpZiAobWVyZ2VHYWluTG9va1VwW2ldID4gbWF4TWVyZ2VHYWluKSB7CiAgICAgICBtYXhNZXJnZUdhaW4gPSBtZXJnZUdhaW5Mb29rVXBbaV07Ci0gICAgICAqbWF4TmR4ID0gaTsKKyAgICAgIGxhc3RNYXhOZHggPSBpOwogICAgIH0KICAgfQorICAqbWF4TmR4ID0gbGFzdE1heE5keDsKICAgcmV0dXJuIChtYXhNZXJnZUdhaW4pOwogfQogCi1zdGF0aWMgSU5UIEZES2FhY0VuY19DYWxjTWVyZ2VHYWluKAotICAgICAgICBjb25zdCBTRUNUSU9OX0lORk8qIGNvbnN0IGh1ZmZzZWN0aW9uLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgIGNvbnN0IFNIT1JUKiBjb25zdCAgICAgICAgc2lkZUluZm9UYWIsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbmR4MSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBuZHgyLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHVzZVZDQjExCi0gICAgICAgICkKLXsKK3N0YXRpYyBpbmxpbmUgSU5UIEZES2FhY0VuY19DYWxjTWVyZ2VHYWluKAorICAgIGNvbnN0IFNFQ1RJT05fSU5GTyogY29uc3QgaHVmZnNlY3Rpb24sCisgICAgY29uc3QgSU5UIGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCisgICAgY29uc3QgU0hPUlQqIGNvbnN0IHNpZGVJbmZvVGFiLCBjb25zdCBJTlQgbmR4MSwgY29uc3QgSU5UIG5keDIsCisgICAgY29uc3QgSU5UIHVzZVZDQjExKSB7CiAgIElOVCBNZXJnZUdhaW4sIE1lcmdlQml0cywgU3BsaXRCaXRzOwogCi0gIE1lcmdlQml0cyA9IHNpZGVJbmZvVGFiW2h1ZmZzZWN0aW9uW25keDFdLnNmYkNudCArIGh1ZmZzZWN0aW9uW25keDJdLnNmYkNudF0gKyBGREthYWNFbmNfZmluZE1pbk1lcmdlQml0cyhiaXRMb29rVXBbbmR4MV0sIGJpdExvb2tVcFtuZHgyXSwgdXNlVkNCMTEpOwotICBTcGxpdEJpdHMgPSBodWZmc2VjdGlvbltuZHgxXS5zZWN0aW9uQml0cyArIGh1ZmZzZWN0aW9uW25keDJdLnNlY3Rpb25CaXRzOyAvKiBCaXQgYW1vdW50IGZvciBzcGxpdHRlZCBodWZmc2VjdGlvbnMgKi8KKyAgTWVyZ2VCaXRzID0KKyAgICAgIHNpZGVJbmZvVGFiW2h1ZmZzZWN0aW9uW25keDFdLnNmYkNudCArIGh1ZmZzZWN0aW9uW25keDJdLnNmYkNudF0gKworICAgICAgRkRLYWFjRW5jX2ZpbmRNaW5NZXJnZUJpdHMoYml0TG9va1VwW25keDFdLCBiaXRMb29rVXBbbmR4Ml0sIHVzZVZDQjExKTsKKyAgU3BsaXRCaXRzID0KKyAgICAgIGh1ZmZzZWN0aW9uW25keDFdLnNlY3Rpb25CaXRzICsKKyAgICAgIGh1ZmZzZWN0aW9uW25keDJdLnNlY3Rpb25CaXRzOyAvKiBCaXQgYW1vdW50IGZvciBzcGxpdHRlZCBodWZmc2VjdGlvbnMgKi8KICAgTWVyZ2VHYWluID0gU3BsaXRCaXRzIC0gTWVyZ2VCaXRzOwogCi0gIGlmICggKGh1ZmZzZWN0aW9uW25keDFdLmNvZGVCb29rPT1DT0RFX0JPT0tfUE5TX05PKXx8KGh1ZmZzZWN0aW9uW25keDJdLmNvZGVCb29rPT1DT0RFX0JPT0tfUE5TX05PKQotICAgIHx8IChodWZmc2VjdGlvbltuZHgxXS5jb2RlQm9vaz09Q09ERV9CT09LX0lTX09VVF9PRl9QSEFTRV9OTyl8fChodWZmc2VjdGlvbltuZHgyXS5jb2RlQm9vaz09Q09ERV9CT09LX0lTX09VVF9PRl9QSEFTRV9OTykKLSAgICB8fCAoaHVmZnNlY3Rpb25bbmR4MV0uY29kZUJvb2s9PUNPREVfQk9PS19JU19JTl9QSEFTRV9OTyl8fChodWZmc2VjdGlvbltuZHgyXS5jb2RlQm9vaz09Q09ERV9CT09LX0lTX0lOX1BIQVNFX05PKQotICAgICkKLSAgeworICBpZiAoKGh1ZmZzZWN0aW9uW25keDFdLmNvZGVCb29rID09IENPREVfQk9PS19QTlNfTk8pIHx8CisgICAgICAoaHVmZnNlY3Rpb25bbmR4Ml0uY29kZUJvb2sgPT0gQ09ERV9CT09LX1BOU19OTykgfHwKKyAgICAgIChodWZmc2VjdGlvbltuZHgxXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05PKSB8fAorICAgICAgKGh1ZmZzZWN0aW9uW25keDJdLmNvZGVCb29rID09IENPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTk8pIHx8CisgICAgICAoaHVmZnNlY3Rpb25bbmR4MV0uY29kZUJvb2sgPT0gQ09ERV9CT09LX0lTX0lOX1BIQVNFX05PKSB8fAorICAgICAgKGh1ZmZzZWN0aW9uW25keDJdLmNvZGVCb29rID09IENPREVfQk9PS19JU19JTl9QSEFTRV9OTykpIHsKICAgICBNZXJnZUdhaW4gPSAtMTsKICAgfQogCiAgIHJldHVybiAoTWVyZ2VHYWluKTsKIH0KIAotCiAvKiBzZWN0aW9uaW5nIFN0YWdlIDA6ZmluZCBtaW5pbXVtIGNvZGJvb2tzICovCiBzdGF0aWMgdm9pZCBGREthYWNFbmNfZ21TdGFnZTAoCi0gICAgICAgIFNFQ1RJT05fSU5GTyogY29uc3QgUkVTVFJJQ1QgaHVmZnNlY3Rpb24sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBtYXhTZmIsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgbm9pc2VOcmcsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgaXNCb29rCi0gICAgICAgICkKLXsKKyAgICBTRUNUSU9OX0lORk8qIGNvbnN0IFJFU1RSSUNUIGh1ZmZzZWN0aW9uLAorICAgIGNvbnN0IElOVCBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLCBjb25zdCBJTlQgbWF4U2ZiLAorICAgIGNvbnN0IElOVCogY29uc3Qgbm9pc2VOcmcsIGNvbnN0IElOVCogY29uc3QgaXNCb29rKSB7CiAgIElOVCBpOwogCi0gIGZvciAoaSA9IDA7IGkgPCBtYXhTZmI7IGkrKykKLSAgeworICBmb3IgKGkgPSAwOyBpIDwgbWF4U2ZiOyBpKyspIHsKICAgICAvKiBTaWRlLUluZm8gYml0cyB3aWxsIGJlIGNhbGN1bGF0ZWQgaW4gU3RhZ2UgMSEgKi8KLSAgICBpZiAoaHVmZnNlY3Rpb25baV0uc2VjdGlvbkJpdHMgPT0gSU5WQUxJRF9CSVRDT1VOVCkKLSAgICB7CisgICAgaWYgKGh1ZmZzZWN0aW9uW2ldLnNlY3Rpb25CaXRzID09IElOVkFMSURfQklUQ09VTlQpIHsKICAgICAgIC8qIGludGVuc2l0eSBhbmQgcG5zIGNvZGVib29rcyBhcmUgYWxyZWFkeSBhbGxvY2F0ZWQgaW4gYml0Y291bnQuYyAqLwotICAgICAgaWYobm9pc2VOcmdbaV0gIT0gTk9fTk9JU0VfUE5TKXsKLSAgICAgICAgaHVmZnNlY3Rpb25baV0uY29kZUJvb2s9Q09ERV9CT09LX1BOU19OTzsKKyAgICAgIGlmIChub2lzZU5yZ1tpXSAhPSBOT19OT0lTRV9QTlMpIHsKKyAgICAgICAgaHVmZnNlY3Rpb25baV0uY29kZUJvb2sgPSBDT0RFX0JPT0tfUE5TX05POwogICAgICAgICBodWZmc2VjdGlvbltpXS5zZWN0aW9uQml0cyA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKCBpc0Jvb2tbaV0gKSB7Ci0gICAgICAgIGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rPWlzQm9va1tpXTsKKyAgICAgIH0gZWxzZSBpZiAoaXNCb29rW2ldKSB7CisgICAgICAgIGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID0gaXNCb29rW2ldOwogICAgICAgICBodWZmc2VjdGlvbltpXS5zZWN0aW9uQml0cyA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaHVmZnNlY3Rpb25baV0uc2VjdGlvbkJpdHMgPSBGREthYWNFbmNfZmluZEJlc3RCb29rKGJpdExvb2tVcFtpXSwgJihodWZmc2VjdGlvbltpXS5jb2RlQm9vayksIDApOyAvKiB1c2VWQ0IxMSBtdXN0IGJlIDAhISEgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGh1ZmZzZWN0aW9uW2ldLnNlY3Rpb25CaXRzID0KKyAgICAgICAgICAgIEZES2FhY0VuY19maW5kQmVzdEJvb2soYml0TG9va1VwW2ldLCAmKGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qIHVzZVZDQjExIG11c3QgYmUgMCEhISAqLwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMjc5LDI0ICsyNTcsMTggQEAKICAgIGNhbGN1bGF0ZSBzaWRlIGluZm8KICAqLwogc3RhdGljIHZvaWQgRkRLYWFjRW5jX2dtU3RhZ2UxKAotICAgICAgICBTRUNUSU9OX0lORk8qIGNvbnN0IFJFU1RSSUNUIGh1ZmZzZWN0aW9uLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgbWF4U2ZiLAotICAgICAgICBjb25zdCBTSE9SVCogY29uc3QgICAgICAgICAgIHNpZGVJbmZvVGFiLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIHVzZVZDQjExCi0gICAgICAgICkKLXsKKyAgICBTRUNUSU9OX0lORk8qIGNvbnN0IFJFU1RSSUNUIGh1ZmZzZWN0aW9uLAorICAgIElOVCBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLCBjb25zdCBJTlQgbWF4U2ZiLAorICAgIGNvbnN0IFNIT1JUKiBjb25zdCBzaWRlSW5mb1RhYiwgY29uc3QgSU5UIHVzZVZDQjExKSB7CiAgIElOVCBtZXJnZVN0YXJ0ID0gMCwgbWVyZ2VFbmQ7CiAKLSAgZG8KLSAgewotICAgIGZvciAobWVyZ2VFbmQgPSBtZXJnZVN0YXJ0ICsgMTsgbWVyZ2VFbmQgPCBtYXhTZmI7IG1lcmdlRW5kKyspCi0gICAgeworICBkbyB7CisgICAgZm9yIChtZXJnZUVuZCA9IG1lcmdlU3RhcnQgKyAxOyBtZXJnZUVuZCA8IG1heFNmYjsgbWVyZ2VFbmQrKykgewogICAgICAgaWYgKGh1ZmZzZWN0aW9uW21lcmdlU3RhcnRdLmNvZGVCb29rICE9IGh1ZmZzZWN0aW9uW21lcmdlRW5kXS5jb2RlQm9vaykKICAgICAgICAgYnJlYWs7CiAKLQotICAgICAgLyogd2UgY2FuIG1lcmdlLiB1cGRhdGUgdGFibGVzLCBzaWRlIGluZm8gYml0cyB3aWxsIGJlIHVwZGF0ZWQgb3V0c2lkZSBvZiB0aGlzIGxvb3AgKi8KKyAgICAgIC8qIHdlIGNhbiBtZXJnZS4gdXBkYXRlIHRhYmxlcywgc2lkZSBpbmZvIGJpdHMgd2lsbCBiZSB1cGRhdGVkIG91dHNpZGUgb2YKKyAgICAgICAqIHRoaXMgbG9vcCAqLwogICAgICAgaHVmZnNlY3Rpb25bbWVyZ2VTdGFydF0uc2ZiQ250Kys7CiAgICAgICBodWZmc2VjdGlvblttZXJnZVN0YXJ0XS5zZWN0aW9uQml0cyArPSBodWZmc2VjdGlvblttZXJnZUVuZF0uc2VjdGlvbkJpdHM7CiAKQEAgLTMwNSw4ICsyNzcsMTAgQEAKICAgICB9CiAKICAgICAvKiBhZGQgc2lkZSBpbmZvIGluZm8gYml0cyAqLwotICAgIGh1ZmZzZWN0aW9uW21lcmdlU3RhcnRdLnNlY3Rpb25CaXRzICs9IEZES2FhY0VuY19nZXRTaWRlSW5mb0JpdHMoJmh1ZmZzZWN0aW9uW21lcmdlU3RhcnRdLCBzaWRlSW5mb1RhYiwgdXNlVkNCMTEpOwotICAgIGh1ZmZzZWN0aW9uW21lcmdlRW5kIC0gMV0uc2ZiU3RhcnQgPSBodWZmc2VjdGlvblttZXJnZVN0YXJ0XS5zZmJTdGFydDsgICAgICAvKiBzcGVlZCB1cCBwcmV2IHNlYXJjaCAqLworICAgIGh1ZmZzZWN0aW9uW21lcmdlU3RhcnRdLnNlY3Rpb25CaXRzICs9IEZES2FhY0VuY19nZXRTaWRlSW5mb0JpdHMoCisgICAgICAgICZodWZmc2VjdGlvblttZXJnZVN0YXJ0XSwgc2lkZUluZm9UYWIsIHVzZVZDQjExKTsKKyAgICBodWZmc2VjdGlvblttZXJnZUVuZCAtIDFdLnNmYlN0YXJ0ID0KKyAgICAgICAgaHVmZnNlY3Rpb25bbWVyZ2VTdGFydF0uc2ZiU3RhcnQ7IC8qIHNwZWVkIHVwIHByZXYgc2VhcmNoICovCiAKICAgICBtZXJnZVN0YXJ0ID0gbWVyZ2VFbmQ7CiAKQEAgLTMxNywxMzIgKzI5MSwxMDEgQEAKICAgIHNlY3Rpb25pbmcgU3RhZ2UgMjpncmVlZHkgbWVyZ2UgYWxnb3JpdGhtLCBtZXJnZSBjb25uZWN0ZWQgc2VjdGlvbnMgd2l0aAogICAgbWF4aW11bSBiaXQgZ2FpbiB1bnRpbCBubyBtb3JlIGdhaW4gaXMgcG9zc2libGUKICAqLwotc3RhdGljIHZvaWQKLUZES2FhY0VuY19nbVN0YWdlMigKLSAgICAgICAgU0VDVElPTl9JTkZPKiBjb25zdCBSRVNUUklDVCBodWZmc2VjdGlvbiwKLSAgICAgICAgSU5UKiBjb25zdCBSRVNUUklDVCAgICAgICAgICBtZXJnZUdhaW5Mb29rVXAsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBtYXhTZmIsCi0gICAgICAgIGNvbnN0IFNIT1JUKiBjb25zdCAgICAgICAgICAgc2lkZUluZm9UYWIsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgdXNlVkNCMTEKLSAgICAgICAgKQoteworc3RhdGljIGlubGluZSB2b2lkIEZES2FhY0VuY19nbVN0YWdlMigKKyAgICBTRUNUSU9OX0lORk8qIGNvbnN0IFJFU1RSSUNUIGh1ZmZzZWN0aW9uLAorICAgIElOVCogY29uc3QgUkVTVFJJQ1QgbWVyZ2VHYWluTG9va1VwLAorICAgIElOVCBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLCBjb25zdCBJTlQgbWF4U2ZiLAorICAgIGNvbnN0IFNIT1JUKiBjb25zdCBzaWRlSW5mb1RhYiwgY29uc3QgSU5UIHVzZVZDQjExKSB7CiAgIElOVCBpOwogCi0gIGZvciAoaSA9IDA7IGkgKyBodWZmc2VjdGlvbltpXS5zZmJDbnQgPCBtYXhTZmI7IGkgKz0gaHVmZnNlY3Rpb25baV0uc2ZiQ250KQotICB7Ci0gICAgbWVyZ2VHYWluTG9va1VwW2ldID0gRkRLYWFjRW5jX0NhbGNNZXJnZUdhaW4oaHVmZnNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlSW5mb1RhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgaHVmZnNlY3Rpb25baV0uc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVkNCMTEpOworICBmb3IgKGkgPSAwOyBpICsgaHVmZnNlY3Rpb25baV0uc2ZiQ250IDwgbWF4U2ZiOyBpICs9IGh1ZmZzZWN0aW9uW2ldLnNmYkNudCkgeworICAgIG1lcmdlR2Fpbkxvb2tVcFtpXSA9CisgICAgICAgIEZES2FhY0VuY19DYWxjTWVyZ2VHYWluKGh1ZmZzZWN0aW9uLCBiaXRMb29rVXAsIHNpZGVJbmZvVGFiLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgaHVmZnNlY3Rpb25baV0uc2ZiQ250LCB1c2VWQ0IxMSk7CiAgIH0KIAotICB3aGlsZSAoVFJVRSkKLSAgewotICAgIElOVCBtYXhNZXJnZUdhaW4sIG1heE5keCA9IDAsIG1heE5keE5leHQsIG1heE5keExhc3Q7CisgIHdoaWxlIChUUlVFKSB7CisgICAgSU5UIG1heE1lcmdlR2FpbiwgbWF4TmR4LCBtYXhOZHhOZXh0LCBtYXhOZHhMYXN0OwogCi0gICAgbWF4TWVyZ2VHYWluID0gRkRLYWFjRW5jX2ZpbmRNYXhNZXJnZShtZXJnZUdhaW5Mb29rVXAsIGh1ZmZzZWN0aW9uLCBtYXhTZmIsICZtYXhOZHgpOworICAgIG1heE1lcmdlR2FpbiA9CisgICAgICAgIEZES2FhY0VuY19maW5kTWF4TWVyZ2UobWVyZ2VHYWluTG9va1VwLCBodWZmc2VjdGlvbiwgbWF4U2ZiLCAmbWF4TmR4KTsKIAogICAgIC8qIGV4aXQgd2hpbGUgbG9vcCBpZiBubyBtb3JlIGdhaW4gaXMgcG9zc2libGUgKi8KLSAgICBpZiAobWF4TWVyZ2VHYWluIDw9IDApCi0gICAgICBicmVhazsKKyAgICBpZiAobWF4TWVyZ2VHYWluIDw9IDApIGJyZWFrOwogCiAgICAgbWF4TmR4TmV4dCA9IG1heE5keCArIGh1ZmZzZWN0aW9uW21heE5keF0uc2ZiQ250OwogCiAgICAgLyogbWVyZ2Ugc2VjdGlvbnMgd2l0aCBtYXhpbXVtIGJpdCBnYWluICovCiAgICAgaHVmZnNlY3Rpb25bbWF4TmR4XS5zZmJDbnQgKz0gaHVmZnNlY3Rpb25bbWF4TmR4TmV4dF0uc2ZiQ250OwotICAgIGh1ZmZzZWN0aW9uW21heE5keF0uc2VjdGlvbkJpdHMgKz0gaHVmZnNlY3Rpb25bbWF4TmR4TmV4dF0uc2VjdGlvbkJpdHMgLSBtYXhNZXJnZUdhaW47CisgICAgaHVmZnNlY3Rpb25bbWF4TmR4XS5zZWN0aW9uQml0cyArPQorICAgICAgICBodWZmc2VjdGlvblttYXhOZHhOZXh0XS5zZWN0aW9uQml0cyAtIG1heE1lcmdlR2FpbjsKIAogICAgIC8qIHVwZGF0ZSBiaXQgbG9vayB1cCB0YWJsZSBmb3IgbWVyZ2VkIGh1ZmZzZWN0aW9uICAqLwogICAgIEZES2FhY0VuY19tZXJnZUJpdExvb2tVcChiaXRMb29rVXBbbWF4TmR4XSwgYml0TG9va1VwW21heE5keE5leHRdKTsKIAogICAgIC8qIHVwZGF0ZSBtZXJnZUxvb2tVcFRhYmxlICovCi0gICAgaWYgKG1heE5keCAhPSAwKQotICAgIHsKKyAgICBpZiAobWF4TmR4ICE9IDApIHsKICAgICAgIG1heE5keExhc3QgPSBodWZmc2VjdGlvblttYXhOZHggLSAxXS5zZmJTdGFydDsKLSAgICAgIG1lcmdlR2Fpbkxvb2tVcFttYXhOZHhMYXN0XSA9IEZES2FhY0VuY19DYWxjTWVyZ2VHYWluKGh1ZmZzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGVJbmZvVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOZHhMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZDQjExKTsKLQorICAgICAgbWVyZ2VHYWluTG9va1VwW21heE5keExhc3RdID0gRkRLYWFjRW5jX0NhbGNNZXJnZUdhaW4oCisgICAgICAgICAgaHVmZnNlY3Rpb24sIGJpdExvb2tVcCwgc2lkZUluZm9UYWIsIG1heE5keExhc3QsIG1heE5keCwgdXNlVkNCMTEpOwogICAgIH0KICAgICBtYXhOZHhOZXh0ID0gbWF4TmR4ICsgaHVmZnNlY3Rpb25bbWF4TmR4XS5zZmJDbnQ7CiAKICAgICBodWZmc2VjdGlvblttYXhOZHhOZXh0IC0gMV0uc2ZiU3RhcnQgPSBodWZmc2VjdGlvblttYXhOZHhdLnNmYlN0YXJ0OwogCiAgICAgaWYgKG1heE5keE5leHQgPCBtYXhTZmIpCi0gICAgICBtZXJnZUdhaW5Mb29rVXBbbWF4TmR4XSA9IEZES2FhY0VuY19DYWxjTWVyZ2VHYWluKGh1ZmZzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlSW5mb1RhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4TmV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VWQ0IxMSk7Ci0KKyAgICAgIG1lcmdlR2Fpbkxvb2tVcFttYXhOZHhdID0gRkRLYWFjRW5jX0NhbGNNZXJnZUdhaW4oCisgICAgICAgICAgaHVmZnNlY3Rpb24sIGJpdExvb2tVcCwgc2lkZUluZm9UYWIsIG1heE5keCwgbWF4TmR4TmV4dCwgdXNlVkNCMTEpOwogICB9CiB9CiAKIC8qIGNvdW50IGJpdHMgdXNlZCBieSB0aGUgbm9pc2VsZXNzIGNvZGVyICovCiBzdGF0aWMgdm9pZCBGREthYWNFbmNfbm9pc2VsZXNzQ291bnRlcigKLSAgICAgICAgU0VDVElPTl9EQVRBKiBjb25zdCBSRVNUUklDVCBzZWN0aW9uRGF0YSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZUdhaW5Mb29rVXBbTUFYX1NGQl9MT05HXSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAotICAgICAgICBjb25zdCBTSE9SVCogY29uc3QgICAgICAgICAgIHF1YW50U3BlY3RydW0sCi0gICAgICAgIGNvbnN0IFVJTlQqIGNvbnN0ICAgICAgICAgICAgbWF4VmFsdWVJblNmYiwKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIG5vaXNlTnJnLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIGlzQm9vaywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICB1c2VWQ0IxMQotICAgICAgICApCi17CisgICAgU0VDVElPTl9EQVRBKiBjb25zdCBSRVNUUklDVCBzZWN0aW9uRGF0YSwgSU5UIG1lcmdlR2Fpbkxvb2tVcFtNQVhfU0ZCX0xPTkddLAorICAgIElOVCBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAorICAgIGNvbnN0IFNIT1JUKiBjb25zdCBxdWFudFNwZWN0cnVtLCBjb25zdCBVSU5UKiBjb25zdCBtYXhWYWx1ZUluU2ZiLAorICAgIGNvbnN0IElOVCogY29uc3Qgc2ZiT2Zmc2V0LCBjb25zdCBJTlQgYmxvY2tUeXBlLCBjb25zdCBJTlQqIGNvbnN0IG5vaXNlTnJnLAorICAgIGNvbnN0IElOVCogY29uc3QgaXNCb29rLCBjb25zdCBJTlQgdXNlVkNCMTEpIHsKICAgSU5UIGdycE5keCwgaTsKLSAgY29uc3QgU0hPUlQgKnNpZGVJbmZvVGFiID0gTlVMTDsKLSAgU0VDVElPTl9JTkZPICpodWZmc2VjdGlvbjsKKyAgY29uc3QgU0hPUlQqIHNpZGVJbmZvVGFiID0gTlVMTDsKKyAgU0VDVElPTl9JTkZPKiBodWZmc2VjdGlvbjsKIAogICAvKiB1c2UgYXBwcm9wcmlhdGUgc2lkZSBpbmZvIHRhYmxlICovCi0gIHN3aXRjaCAoYmxvY2tUeXBlKQotICB7Ci0gIGNhc2UgTE9OR19XSU5ET1c6Ci0gIGNhc2UgU1RBUlRfV0lORE9XOgotICBjYXNlIFNUT1BfV0lORE9XOgotICAgIHNpZGVJbmZvVGFiID0gRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZzsKLSAgICBicmVhazsKLSAgY2FzZSBTSE9SVF9XSU5ET1c6Ci0gICAgc2lkZUluZm9UYWIgPSBGREthYWNFbmNfc2lkZUluZm9UYWJTaG9ydDsKLSAgICBicmVhazsKKyAgc3dpdGNoIChibG9ja1R5cGUpIHsKKyAgICBjYXNlIExPTkdfV0lORE9XOgorICAgIGNhc2UgU1RBUlRfV0lORE9XOgorICAgIGNhc2UgU1RPUF9XSU5ET1c6CisgICAgZGVmYXVsdDoKKyAgICAgIHNpZGVJbmZvVGFiID0gRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0hPUlRfV0lORE9XOgorICAgICAgc2lkZUluZm9UYWIgPSBGREthYWNFbmNfc2lkZUluZm9UYWJTaG9ydDsKKyAgICAgIGJyZWFrOwogICB9CiAKICAgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucyA9IDA7CiAgIHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyA9IDA7CiAgIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgPSAwOwogCi0KLSAgaWYgKHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCA9PSAwKQotICAgIHJldHVybjsKKyAgaWYgKHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCA9PSAwKSByZXR1cm47CiAKICAgLyogbG9vcCB0cm91Z2ggZ3JvdXBzICovCi0gIGZvciAoZ3JwTmR4ID0gMDsgZ3JwTmR4IDwgc2VjdGlvbkRhdGEtPnNmYkNudDsgZ3JwTmR4ICs9IHNlY3Rpb25EYXRhLT5zZmJQZXJHcm91cCkKLSAgeworICBmb3IgKGdycE5keCA9IDA7IGdycE5keCA8IHNlY3Rpb25EYXRhLT5zZmJDbnQ7CisgICAgICAgZ3JwTmR4ICs9IHNlY3Rpb25EYXRhLT5zZmJQZXJHcm91cCkgewogICAgIGh1ZmZzZWN0aW9uID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uICsgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsKIAogICAgIC8qIGNvdW50IGJpdHMgaW4gdGhpcyBncm91cCAqLwotICAgIEZES2FhY0VuY19idWlsZEJpdExvb2tVcChxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQgKyBncnBOZHgsCi0gICAgICAgICAgICAgICAgICAgbWF4VmFsdWVJblNmYiArIGdycE5keCwKLSAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgaHVmZnNlY3Rpb24pOworICAgIEZES2FhY0VuY19idWlsZEJpdExvb2tVcChxdWFudFNwZWN0cnVtLCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCArIGdycE5keCwgbWF4VmFsdWVJblNmYiArIGdycE5keCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwLCBodWZmc2VjdGlvbik7CiAKICAgICAvKiAwLlN0YWdlIDpGaW5kIG1pbmltdW0gQ29kZWJvb2tzICovCi0gICAgRkRLYWFjRW5jX2dtU3RhZ2UwKGh1ZmZzZWN0aW9uLCBiaXRMb29rVXAsIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwgbm9pc2VOcmcrZ3JwTmR4LCBpc0Jvb2srZ3JwTmR4KTsKKyAgICBGREthYWNFbmNfZ21TdGFnZTAoaHVmZnNlY3Rpb24sIGJpdExvb2tVcCwgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICBub2lzZU5yZyArIGdycE5keCwgaXNCb29rICsgZ3JwTmR4KTsKIAogICAgIC8qIDEuU3RhZ2UgOk1lcmdlIGFsbCBjb25uZWN0ZWQgcmVnaW9ucyB3aXRoIHRoZSBzYW1lIGNvZGUgYm9vayAqLwotICAgIEZES2FhY0VuY19nbVN0YWdlMShodWZmc2VjdGlvbiwgYml0TG9va1VwLCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsIHNpZGVJbmZvVGFiLCB1c2VWQ0IxMSk7Ci0KKyAgICBGREthYWNFbmNfZ21TdGFnZTEoaHVmZnNlY3Rpb24sIGJpdExvb2tVcCwgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICBzaWRlSW5mb1RhYiwgdXNlVkNCMTEpOwogCiAgICAgLyoKICAgICAgICAyLlN0YWdlCkBAIC00NTAsMTQgKzM5Myw4IEBACiAgICAgICAgZ2FpbiB1bnRpbCBubyBtb3JlIGdhaW4gaXMgcG9zc2libGUKICAgICAgKi8KIAotICAgIEZES2FhY0VuY19nbVN0YWdlMihodWZmc2VjdGlvbiwKLSAgICAgICAgICAgICBtZXJnZUdhaW5Mb29rVXAsCi0gICAgICAgICAgICAgYml0TG9va1VwLAotICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICBzaWRlSW5mb1RhYiwKLSAgICAgICAgICAgICB1c2VWQ0IxMSk7Ci0KLQorICAgIEZES2FhY0VuY19nbVN0YWdlMihodWZmc2VjdGlvbiwgbWVyZ2VHYWluTG9va1VwLCBiaXRMb29rVXAsCisgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwgc2lkZUluZm9UYWIsIHVzZVZDQjExKTsKIAogICAgIC8qCiAgICAgICAgY29tcHJlc3Mgb3V0cHV0LCBjYWxjdWxhdGUgdG90YWwgaHVmZiBhbmQgc2lkZSBiaXRzCkBAIC00NjUsMzEgKzQwMiwzMyBAQAogICAgICAgIHRvIHNhdmUgdGltZSwgd2UgbXVzdCBzZXQgaXQgaGVyZSBmb3IgbGF0ZXIgdXNlIGluIGJpdGVuYwogICAgICAqLwogCi0gICAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cDsgaSArPSBodWZmc2VjdGlvbltpXS5zZmJDbnQpCi0gICAgewotICAgICAgaWYgKChodWZmc2VjdGlvbltpXS5jb2RlQm9vaz09Q09ERV9CT09LX1BOU19OTykgfHwKLSAgICAgICAgICAoaHVmZnNlY3Rpb25baV0uY29kZUJvb2s9PUNPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTk8pIHx8Ci0gICAgICAgICAgKGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rPT1DT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk8pKQotICAgICAgewotICAgICAgICBodWZmc2VjdGlvbltpXS5zZWN0aW9uQml0cz0wOworICAgIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXA7IGkgKz0gaHVmZnNlY3Rpb25baV0uc2ZiQ250KSB7CisgICAgICBpZiAoKGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19QTlNfTk8pIHx8CisgICAgICAgICAgKGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTk8pIHx8CisgICAgICAgICAgKGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19JU19JTl9QSEFTRV9OTykpIHsKKyAgICAgICAgaHVmZnNlY3Rpb25baV0uc2VjdGlvbkJpdHMgPSAwOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogdGhlIHNlY3Rpb25zIGluIHRoZSBzZWN0aW9uRGF0YSBhcmUgbm93IG1hcmtlZCB3aXRoIHRoZSBvcHRpbWFsIGNvZGUgYm9vayAqLworICAgICAgICAvKiB0aGUgc2VjdGlvbnMgaW4gdGhlIHNlY3Rpb25EYXRhIGFyZSBub3cgbWFya2VkIHdpdGggdGhlIG9wdGltYWwgY29kZQorICAgICAgICAgKiBib29rICovCiAKLSAgICAgICAgICBGREthYWNFbmNfZmluZEJlc3RCb29rKGJpdExvb2tVcFtpXSwgJihodWZmc2VjdGlvbltpXS5jb2RlQm9vayksIHVzZVZDQjExKTsKKyAgICAgICAgRkRLYWFjRW5jX2ZpbmRCZXN0Qm9vayhiaXRMb29rVXBbaV0sICYoaHVmZnNlY3Rpb25baV0uY29kZUJvb2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZDQjExKTsKIAotICAgICAgICBzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgKz0gaHVmZnNlY3Rpb25baV0uc2VjdGlvbkJpdHMgLSBGREthYWNFbmNfZ2V0U2lkZUluZm9CaXRzKCZodWZmc2VjdGlvbltpXSwgc2lkZUluZm9UYWIsIHVzZVZDQjExKTsKKyAgICAgICAgc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzICs9CisgICAgICAgICAgICBodWZmc2VjdGlvbltpXS5zZWN0aW9uQml0cyAtCisgICAgICAgICAgICBGREthYWNFbmNfZ2V0U2lkZUluZm9CaXRzKCZodWZmc2VjdGlvbltpXSwgc2lkZUluZm9UYWIsIHVzZVZDQjExKTsKICAgICAgIH0KIAogICAgICAgaHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQgKz0gZ3JwTmR4OwogCiAgICAgICAvKiBzdW0gdXAgc2lkZSBpbmZvIGJpdHMgKHNlY3Rpb24gZGF0YSBiaXRzKSAqLwotICAgICAgc2VjdGlvbkRhdGEtPnNpZGVJbmZvQml0cyArPSBGREthYWNFbmNfZ2V0U2lkZUluZm9CaXRzKCZodWZmc2VjdGlvbltpXSwgc2lkZUluZm9UYWIsIHVzZVZDQjExKTsKKyAgICAgIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgKz0KKyAgICAgICAgICBGREthYWNFbmNfZ2V0U2lkZUluZm9CaXRzKCZodWZmc2VjdGlvbltpXSwgc2lkZUluZm9UYWIsIHVzZVZDQjExKTsKICAgICAgIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zKytdID0gaHVmZnNlY3Rpb25baV07CiAgICAgfQogICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19zY2ZDb3VudApAQCAtNTI1LDgwICs0NjQsNjggQEAKICAgICAgICAgICAgICAgICAgIHNjYWxmYWNHYWluICg3NSkgYW5kIHRoZSBmdXR1cmUgc2NhbGVmYWNHYWluICg1KSBpcyA3MC4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfc2NmQ291bnQoCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgc2NhbGVmYWNHYWluLAotICAgICAgICBjb25zdCBVSU5UKiBjb25zdCAgICAgICAgICAgIG1heFZhbHVlSW5TZmIsCi0gICAgICAgIFNFQ1RJT05fREFUQSogY29uc3QgUkVTVFJJQ1Qgc2VjdGlvbkRhdGEsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgaXNTY2FsZQotICAgICAgICApCi17CitzdGF0aWMgdm9pZCBGREthYWNFbmNfc2NmQ291bnQoY29uc3QgSU5UKiBjb25zdCBzY2FsZWZhY0dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCogY29uc3QgbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEqIGNvbnN0IFJFU1RSSUNUIHNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCogY29uc3QgaXNTY2FsZSkgewogICBJTlQgaSwgaiwgaywgbSwgbjsKIAotICBJTlQgbGFzdFZhbFNjZiAgICAgPSAwOwotICBJTlQgZGVsdGFTY2YgICAgICAgPSAwOwotICBJTlQgZm91bmQgICAgICAgICAgPSAwOworICBJTlQgbGFzdFZhbFNjZiA9IDA7CisgIElOVCBkZWx0YVNjZiA9IDA7CisgIElOVCBmb3VuZCA9IDA7CiAgIElOVCBzY2ZTa2lwQ291bnRlciA9IDA7Ci0gIElOVCBsYXN0VmFsSXMgICAgICA9IDA7CisgIElOVCBsYXN0VmFsSXMgPSAwOwogCiAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMgPSAwOwogCi0gIGlmIChzY2FsZWZhY0dhaW4gPT0gTlVMTCkKLSAgICByZXR1cm47CisgIGlmIChzY2FsZWZhY0dhaW4gPT0gTlVMTCkgcmV0dXJuOwogCiAgIHNlY3Rpb25EYXRhLT5maXJzdFNjZiA9IDA7CiAKLSAgZm9yIChpPTA7IGk8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsgaSsrKQotICB7Ci0gICAgaWYgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykKLSAgICB7CisgIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspIHsKKyAgICBpZiAoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PKSB7CiAgICAgICBzZWN0aW9uRGF0YS0+Zmlyc3RTY2YgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7CiAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW3NlY3Rpb25EYXRhLT5maXJzdFNjZl07CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KIAotICBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspCi0gIHsKLSAgICBpZiAoKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05PKSB8fAotICAgICAgICAoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19JU19JTl9QSEFTRV9OTykpCi0gICAgeworICBmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsgaSsrKSB7CisgICAgaWYgKChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgPT0KKyAgICAgICAgIENPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTk8pIHx8CisgICAgICAgIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgPT0gQ09ERV9CT09LX0lTX0lOX1BIQVNFX05PKSkgewogICAgICAgZm9yIChqID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0OwotICAgICAgICAgICBqIDwgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0ICsgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKLSAgICAgICAgICAgaisrKQotICAgICAgewotICAgICAgICBJTlQgZGVsdGFJcyA9IGlzU2NhbGVbal0tbGFzdFZhbElzOwotICAgICAgICBsYXN0VmFsSXMgICA9IGlzU2NhbGVbal07Ci0gICAgICAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMrPUZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoZGVsdGFJcyk7CisgICAgICAgICAgIGogPCBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQgKworICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7CisgICAgICAgICAgIGorKykgeworICAgICAgICBJTlQgZGVsdGFJcyA9IGlzU2NhbGVbal0gLSBsYXN0VmFsSXM7CisgICAgICAgIGxhc3RWYWxJcyA9IGlzU2NhbGVbal07CisgICAgICAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMgKz0KKyAgICAgICAgICAgIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoZGVsdGFJcyk7CiAgICAgICB9CiAgICAgfSAvKiBJbnRlbnNpdHkgKi8KICAgICBlbHNlIGlmICgoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PKSAmJgotICAgICAgICAgICAgIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykpCi0gICAgewotICAgICAgSU5UIHRtcCA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydCArIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7Ci0gICAgICBmb3IgKGogPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7IGo8dG1wOyBqKyspCi0gICAgICB7CisgICAgICAgICAgICAgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKSkgeworICAgICAgSU5UIHRtcCA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydCArCisgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKKyAgICAgIGZvciAoaiA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydDsgaiA8IHRtcDsgaisrKSB7CiAgICAgICAgIC8qIGNoZWNrIGlmIHdlIGNhbiByZXBlYXQgdGhlIGxhc3QgdmFsdWUgdG8gc2F2ZSBiaXRzICovCi0gICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW2pdID09IDApCi0gICAgICAgIHsKKyAgICAgICAgaWYgKG1heFZhbHVlSW5TZmJbal0gPT0gMCkgewogICAgICAgICAgIGZvdW5kID0gMDsKICAgICAgICAgICAvKiBhcmUgc2NhbGVmYWN0b3JzIHNraXBwZWQ/ICovCi0gICAgICAgICAgaWYgKHNjZlNraXBDb3VudGVyID09IDApCi0gICAgICAgICAgeworICAgICAgICAgIGlmIChzY2ZTa2lwQ291bnRlciA9PSAwKSB7CiAgICAgICAgICAgICAvKiBlbmQgb2Ygc2VjdGlvbiAqLwotICAgICAgICAgICAgaWYgKGogPT0gKHRtcCAtIDEpICkKLSAgICAgICAgICAgICAgZm91bmQgPSAwOyAgLyogc2VhcmNoIGluIG90aGVyIHNlY3Rpb25zIGZvciBtYXhWYWx1ZUluU2ZiICE9IDAgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqID09ICh0bXAgLSAxKSkKKyAgICAgICAgICAgICAgZm91bmQgPSAwOyAvKiBzZWFyY2ggaW4gb3RoZXIgc2VjdGlvbnMgZm9yIG1heFZhbHVlSW5TZmIgIT0gMCAqLworICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgIC8qIHNlYXJjaCBpbiB0aGlzIHNlY3Rpb24gZm9yIHRoZSBuZXh0IG1heFZhbHVlSW5TZmJbXSAhPSAwICovCi0gICAgICAgICAgICAgIGZvciAoayA9IChqKzEpOyBrIDwgdG1wOyBrKyspCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobWF4VmFsdWVJblNmYltrXSAhPSAwKQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm9yIChrID0gKGogKyAxKTsgayA8IHRtcDsgaysrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1heFZhbHVlSW5TZmJba10gIT0gMCkgewogICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOwotICAgICAgICAgICAgICAgICAgaWYgKCAoZml4cF9hYnMoc2NhbGVmYWNHYWluW2tdIC0gbGFzdFZhbFNjZikpIDw9IENPREVfQk9PS19TQ0ZfTEFWKQotICAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOyAvKiBzYXZlIGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoZml4cF9hYnMoc2NhbGVmYWNHYWluW2tdIC0gbGFzdFZhbFNjZikpIDw9CisgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYpCisgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsgLyogc2F2ZSBiaXRzICovCisgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLyogZG8gbm90IHNhdmUgYml0cyAqLwogICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IGxhc3RWYWxTY2YgLSBzY2FsZWZhY0dhaW5bal07CiAgICAgICAgICAgICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07CkBAIC02MTIsMjAgKzUzOSwxOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiBzZWFyY2ggZm9yIHRoZSBuZXh0IG1heFZhbHVlSW5TZmJbXSAhPSAwIGluIGFsbCBvdGhlciBzZWN0aW9ucyAqLwotICAgICAgICAgICAgZm9yIChtPShpKzEpOyAobSA8IHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMpICYmIChmb3VuZCA9PSAwKTsgbSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvblttXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykgJiYgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvblttXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElOVCBlbmQgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25bbV0uc2ZiU3RhcnQgKyBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25bbV0uc2ZiQ250OwotICAgICAgICAgICAgICAgIGZvciAobiA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvblttXS5zZmJTdGFydDsgbjxlbmQ7IG4rKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAobWF4VmFsdWVJblNmYltuXSAhPSAwKQotICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgZm9yIChtID0gKGkgKyAxKTsgKG0gPCBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zKSAmJiAoZm91bmQgPT0gMCk7CisgICAgICAgICAgICAgICAgIG0rKykgeworICAgICAgICAgICAgICBpZiAoKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvblttXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykgJiYKKyAgICAgICAgICAgICAgICAgIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25bbV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykpIHsKKyAgICAgICAgICAgICAgICBJTlQgZW5kID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW21dLnNmYlN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW21dLnNmYkNudDsKKyAgICAgICAgICAgICAgICBmb3IgKG4gPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25bbV0uc2ZiU3RhcnQ7IG4gPCBlbmQ7IG4rKykgeworICAgICAgICAgICAgICAgICAgaWYgKG1heFZhbHVlSW5TZmJbbl0gIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaXhwX2FicyhzY2FsZWZhY0dhaW5bbl0gLSBsYXN0VmFsU2NmKSA8PSBDT0RFX0JPT0tfU0NGX0xBVikKLSAgICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IDA7ICAvKiBzYXZlIGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXhwX2FicyhzY2FsZWZhY0dhaW5bbl0gLSBsYXN0VmFsU2NmKSA8PQorICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYpCisgICAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOyAvKiBzYXZlIGJpdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gbm90IHNhdmUgYml0cyAqLwogICAgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gbGFzdFZhbFNjZiAtIHNjYWxlZmFjR2FpbltqXTsKICAgICAgICAgICAgICAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOwpAQCAtNjM5LDY0ICs1NjUsMjkgQEAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogbm8gbWF4VmFsdWVJblNmYltdICE9IDAgZm91bmQgKi8KLSAgICAgICAgICAgIGlmIChmb3VuZCA9PSAwKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsKICAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOwogICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgeworICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBjb25zaWRlciBza2lwcGVkIHNjYWxlZmFjdG9ycyAqLwogICAgICAgICAgICAgZGVsdGFTY2YgPSAwOwogICAgICAgICAgICAgc2NmU2tpcENvdW50ZXItLTsKICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgZGVsdGFTY2YgPSBsYXN0VmFsU2NmIC0gc2NhbGVmYWNHYWluW2pdOwogICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07CiAgICAgICAgIH0KLSAgICAgICAgc2VjdGlvbkRhdGEtPnNjYWxlZmFjQml0cyArPSBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGRlbHRhU2NmKTsKKyAgICAgICAgc2VjdGlvbkRhdGEtPnNjYWxlZmFjQml0cyArPQorICAgICAgICAgICAgRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShkZWx0YVNjZik7CiAgICAgICB9CiAgICAgfQogICB9IC8qIGZvciAoaT0wOyBpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykgKi8KIH0KIAotI2lmZGVmIFBOU19QUkVDT1VOVF9FTkFCTEUKLS8qCi0gIHByZUNvdW50IGJpdHMgdXNlZCBwbnMKLSovCi0vKiBlc3RpbWF0ZSBiaXRzIHVzZWQgYnkgcG5zIGZvciBjb3JyZWN0aW9uIG9mIHN0YXRpYyBiaXRzICovCi0vKiBubyBjb2RlYm9vayBzd2l0Y2ggZXN0aW1hdGlvbiwgc2VlIEFBQyBMRCBGQVNURU5DICovCi1JTlQgbm9pc2VQcmVDb3VudChjb25zdCBJTlQgKm5vaXNlTnJnLCBJTlQgbWF4U2ZiKQotewotICBJTlQgICBub2lzZVBDTUZsYWcgPSBUUlVFOwotICBJTlQgICBsYXN0VmFsUG5zID0gMCwgZGVsdGFQbnM7Ci0gIGludCAgIGksIGJpdHM9MDsKLQotIGZvciAoaSA9IDA7IGkgPCBtYXhTZmI7IGkrKykgewotICAgaWYgKG5vaXNlTnJnW2ldICE9IE5PX05PSVNFX1BOUykgewotCi0gICAgIGlmIChub2lzZVBDTUZsYWcpIHsKLSAgICAgICBiaXRzKz1QTlNfUENNX0JJVFM7Ci0gICAgICAgbGFzdFZhbFBucyAgID0gbm9pc2VOcmdbaV07Ci0gICAgICAgbm9pc2VQQ01GbGFnID0gRkFMU0U7Ci0gICAgIH1lbHNlIHsKLSAgICAgICBkZWx0YVBucyAgICAgPSBub2lzZU5yZ1tpXS1sYXN0VmFsUG5zOwotICAgICAgIGxhc3RWYWxQbnMgICA9IG5vaXNlTnJnW2ldOwotICAgICAgIGJpdHMrPUZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoZGVsdGFQbnMpOwotICAgICB9Ci0gICB9Ci0gfQotIHJldHVybiAoIGJpdHMgKTsKLX0KLSNlbmRpZiAvKiBQTlNfUFJFQ09VTlRfRU5BQkxFICovCi0KIC8qIGNvdW50IGJpdHMgdXNlZCBieSBwbnMgKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19ub2lzZUNvdW50KAotICAgICAgICBTRUNUSU9OX0RBVEEqIGNvbnN0IFJFU1RSSUNUIHNlY3Rpb25EYXRhLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIG5vaXNlTnJnCi0gICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19ub2lzZUNvdW50KFNFQ1RJT05fREFUQSogY29uc3QgUkVTVFJJQ1Qgc2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQqIGNvbnN0IG5vaXNlTnJnKSB7CiAgIElOVCBub2lzZVBDTUZsYWcgPSBUUlVFOwogICBJTlQgbGFzdFZhbFBucyA9IDAsIGRlbHRhUG5zOwogICBpbnQgaSwgajsKQEAgLTcwNyw5OSArNTk4LDY2IEBACiAgICAgaWYgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfUE5TX05PKSB7CiAgICAgICBpbnQgc2ZiU3RhcnQgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7CiAgICAgICBpbnQgc2ZiRW5kID0gc2ZiU3RhcnQgKyBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiQ250OwotICAgICAgZm9yIChqPXNmYlN0YXJ0OyBqPHNmYkVuZDsgaisrKSB7Ci0KKyAgICAgIGZvciAoaiA9IHNmYlN0YXJ0OyBqIDwgc2ZiRW5kOyBqKyspIHsKICAgICAgICAgaWYgKG5vaXNlUENNRmxhZykgewotICAgICAgICAgIHNlY3Rpb25EYXRhLT5ub2lzZU5yZ0JpdHMrPVBOU19QQ01fQklUUzsKLSAgICAgICAgICBsYXN0VmFsUG5zICAgPSBub2lzZU5yZ1tqXTsKKyAgICAgICAgICBzZWN0aW9uRGF0YS0+bm9pc2VOcmdCaXRzICs9IFBOU19QQ01fQklUUzsKKyAgICAgICAgICBsYXN0VmFsUG5zID0gbm9pc2VOcmdbal07CiAgICAgICAgICAgbm9pc2VQQ01GbGFnID0gRkFMU0U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZGVsdGFQbnMgICAgID0gbm9pc2VOcmdbal0tbGFzdFZhbFBuczsKLSAgICAgICAgICBsYXN0VmFsUG5zICAgPSBub2lzZU5yZ1tqXTsKLSAgICAgICAgICBzZWN0aW9uRGF0YS0+bm9pc2VOcmdCaXRzKz1GREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGRlbHRhUG5zKTsKKyAgICAgICAgICBkZWx0YVBucyA9IG5vaXNlTnJnW2pdIC0gbGFzdFZhbFBuczsKKyAgICAgICAgICBsYXN0VmFsUG5zID0gbm9pc2VOcmdbal07CisgICAgICAgICAgc2VjdGlvbkRhdGEtPm5vaXNlTnJnQml0cyArPQorICAgICAgICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGRlbHRhUG5zKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQogCi1JTlQgRkRLYWFjRW5jX2R5bkJpdENvdW50KAotICAgICAgICBCSVRDTlRSX1NUQVRFKiBjb25zdCAgICAgICAgIGhCQywKLSAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0ICAgICAgICAgICBxdWFudFNwZWN0cnVtLAotICAgICAgICBjb25zdCBVSU5UKiBjb25zdCAgICAgICAgICAgIG1heFZhbHVlSW5TZmIsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgc2NhbGVmYWMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIHNmYkNudCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBzZmJQZXJHcm91cCwKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgIFNFQ1RJT05fREFUQSogY29uc3QgUkVTVFJJQ1Qgc2VjdGlvbkRhdGEsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgbm9pc2VOcmcsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgaXNCb29rLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIGlzU2NhbGUsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MKLSAgICAgICAgKQotewotICBzZWN0aW9uRGF0YS0+YmxvY2tUeXBlICAgICAgPSBibG9ja1R5cGU7Ci0gIHNlY3Rpb25EYXRhLT5zZmJDbnQgICAgICAgICA9IHNmYkNudDsKLSAgc2VjdGlvbkRhdGEtPnNmYlBlckdyb3VwICAgID0gc2ZiUGVyR3JvdXA7Ci0gIHNlY3Rpb25EYXRhLT5ub09mR3JvdXBzICAgICA9IHNmYkNudCAvIHNmYlBlckdyb3VwOworSU5UIEZES2FhY0VuY19keW5CaXRDb3VudChCSVRDTlRSX1NUQVRFKiBjb25zdCBoQkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUKiBjb25zdCBxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UKiBjb25zdCBtYXhWYWx1ZUluU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQqIGNvbnN0IHNjYWxlZmFjLCBjb25zdCBJTlQgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiQ250LCBjb25zdCBJTlQgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZmJQZXJHcm91cCwgY29uc3QgSU5UKiBjb25zdCBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSogY29uc3QgUkVTVFJJQ1Qgc2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCogY29uc3Qgbm9pc2VOcmcsIGNvbnN0IElOVCogY29uc3QgaXNCb29rLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQqIGNvbnN0IGlzU2NhbGUsIGNvbnN0IFVJTlQgc3ludGF4RmxhZ3MpIHsKKyAgc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSA9IGJsb2NrVHlwZTsKKyAgc2VjdGlvbkRhdGEtPnNmYkNudCA9IHNmYkNudDsKKyAgc2VjdGlvbkRhdGEtPnNmYlBlckdyb3VwID0gc2ZiUGVyR3JvdXA7CisgIHNlY3Rpb25EYXRhLT5ub09mR3JvdXBzID0gc2ZiQ250IC8gc2ZiUGVyR3JvdXA7CiAgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCA9IG1heFNmYlBlckdyb3VwOwogCi0gIEZES2FhY0VuY19ub2lzZWxlc3NDb3VudGVyKAotICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgIGhCQy0+bWVyZ2VHYWluTG9va1VwLAotICAgICAgICAgICAgICAgICAgIChsb29rVXBUYWJsZSloQkMtPmJpdExvb2tVcCwKLSAgICAgICAgICAgICAgICAgICBxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgIG1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICBub2lzZU5yZywKLSAgICAgICAgICAgICAgICAgICBpc0Jvb2ssCi0gICAgICAgICAgICAgICAgICAgKHN5bnRheEZsYWdzICYgQUNfRVJfVkNCMTEpPzE6MCk7CisgIEZES2FhY0VuY19ub2lzZWxlc3NDb3VudGVyKHNlY3Rpb25EYXRhLCBoQkMtPm1lcmdlR2Fpbkxvb2tVcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb2tVcFRhYmxlKWhCQy0+Yml0TG9va1VwLCBxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZUluU2ZiLCBzZmJPZmZzZXQsIGJsb2NrVHlwZSwgbm9pc2VOcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQm9vaywgKHN5bnRheEZsYWdzICYgQUNfRVJfVkNCMTEpID8gMSA6IDApOwogCi0gIEZES2FhY0VuY19zY2ZDb3VudCgKLSAgICAgICAgICAgc2NhbGVmYWMsCi0gICAgICAgICAgIG1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgIHNlY3Rpb25EYXRhLAotICAgICAgICAgICBpc1NjYWxlKTsKKyAgRkRLYWFjRW5jX3NjZkNvdW50KHNjYWxlZmFjLCBtYXhWYWx1ZUluU2ZiLCBzZWN0aW9uRGF0YSwgaXNTY2FsZSk7CiAKLSAgRkRLYWFjRW5jX25vaXNlQ291bnQoc2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgbm9pc2VOcmcpOworICBGREthYWNFbmNfbm9pc2VDb3VudChzZWN0aW9uRGF0YSwgbm9pc2VOcmcpOwogCi0gIHJldHVybiAoc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzICsKLSAgICAgICAgICBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzICsKLSAgICAgICAgICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzICsKLSAgICAgICAgICBzZWN0aW9uRGF0YS0+bm9pc2VOcmdCaXRzKTsKKyAgcmV0dXJuIChzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgKyBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzICsKKyAgICAgICAgICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzICsgc2VjdGlvbkRhdGEtPm5vaXNlTnJnQml0cyk7CiB9CiAKLUlOVCBGREthYWNFbmNfQkNOZXcoQklUQ05UUl9TVEFURSAqKnBoQkMKLSAgICAgICAgICxVQ0hBUiogZHluYW1pY19SQU0KLSAgICAgICAgICkKLXsKLSAgQklUQ05UUl9TVEFURSAqaEJDID0gIEdldFJhbV9hYWNFbmNfQml0Q250clN0YXRlKCk7CitJTlQgRkRLYWFjRW5jX0JDTmV3KEJJVENOVFJfU1RBVEUqKiBwaEJDLCBVQ0hBUiogZHluYW1pY19SQU0pIHsKKyAgQklUQ05UUl9TVEFURSogaEJDID0gR2V0UmFtX2FhY0VuY19CaXRDbnRyU3RhdGUoKTsKIAotICBpZiAoaEJDKQotICB7CisgIGlmIChoQkMpIHsKICAgICAqcGhCQyA9IGhCQzsKLSAgICBoQkMtPmJpdExvb2tVcCAgICAgICA9IEdldFJhbV9hYWNFbmNfQml0TG9va1VwKDAsZHluYW1pY19SQU0pOwotICAgIGhCQy0+bWVyZ2VHYWluTG9va1VwID0gR2V0UmFtX2FhY0VuY19NZXJnZUdhaW5Mb29rVXAoMCxkeW5hbWljX1JBTSk7Ci0gICAgaWYgKGhCQy0+Yml0TG9va1VwICAgICAgID09IDAgfHwKLSAgICAgICAgaEJDLT5tZXJnZUdhaW5Mb29rVXAgPT0gMCkKLSAgICB7CisgICAgaEJDLT5iaXRMb29rVXAgPSBHZXRSYW1fYWFjRW5jX0JpdExvb2tVcCgwLCBkeW5hbWljX1JBTSk7CisgICAgaEJDLT5tZXJnZUdhaW5Mb29rVXAgPSBHZXRSYW1fYWFjRW5jX01lcmdlR2Fpbkxvb2tVcCgwLCBkeW5hbWljX1JBTSk7CisgICAgaWYgKGhCQy0+Yml0TG9va1VwID09IDAgfHwgaEJDLT5tZXJnZUdhaW5Mb29rVXAgPT0gMCkgewogICAgICAgcmV0dXJuIDE7CiAgICAgfQogICB9CiAgIHJldHVybiAoaEJDID09IDApID8gMSA6IDA7CiB9CiAKLXZvaWQgRkRLYWFjRW5jX0JDQ2xvc2UoQklUQ05UUl9TVEFURSAqKnBoQkMpCi17Ci0gIGlmICgqcGhCQyE9TlVMTCkgewotCit2b2lkIEZES2FhY0VuY19CQ0Nsb3NlKEJJVENOVFJfU1RBVEUqKiBwaEJDKSB7CisgIGlmICgqcGhCQyAhPSBOVUxMKSB7CiAgICAgRnJlZVJhbV9hYWNFbmNfQml0Q250clN0YXRlKHBoQkMpOwogICB9CiB9Ci0KLQotCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2R5bl9iaXRzLmggYi9saWJBQUNlbmMvc3JjL2R5bl9iaXRzLmgKaW5kZXggYWU3OGE0Yy4uYTcyN2EzMCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9keW5fYml0cy5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvZHluX2JpdHMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0MiArOTAsNDAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBOb2lzZWxlc3MgY29kZXIgbW9kdWxlCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IE5vaXNlbGVzcyBjb2RlciBtb2R1bGUKIAotI2lmbmRlZiBfX0RZTl9CSVRTX0gKLSNkZWZpbmUgX19EWU5fQklUU19ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERZTl9CSVRTX0gKKyNkZWZpbmUgRFlOX0JJVFNfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAjaW5jbHVkZSAiYWFjZW5jX3Rucy5oIgogCi0jZGVmaW5lIE1BWF9TRUNUSU9OUyAgICAgICAgICBNQVhfR1JPVVBFRF9TRkIKLSNkZWZpbmUgU0VDVF9FU0NfVkFMX0xPTkcgICAgMzEKLSNkZWZpbmUgU0VDVF9FU0NfVkFMX1NIT1JUICAgIDcKLSNkZWZpbmUgQ09ERV9CT09LX0JJVFMgICAgICAgIDQKLSNkZWZpbmUgU0VDVF9CSVRTX0xPTkcgICAgICAgIDUKLSNkZWZpbmUgU0VDVF9CSVRTX1NIT1JUICAgICAgIDMKLSNkZWZpbmUgUE5TX1BDTV9CSVRTICAgICAgICAgIDkKKyNkZWZpbmUgTUFYX1NFQ1RJT05TIE1BWF9HUk9VUEVEX1NGQgorI2RlZmluZSBTRUNUX0VTQ19WQUxfTE9ORyAzMQorI2RlZmluZSBTRUNUX0VTQ19WQUxfU0hPUlQgNworI2RlZmluZSBDT0RFX0JPT0tfQklUUyA0CisjZGVmaW5lIFNFQ1RfQklUU19MT05HIDUKKyNkZWZpbmUgU0VDVF9CSVRTX1NIT1JUIDMKKyNkZWZpbmUgUE5TX1BDTV9CSVRTIDkKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgSU5UIGNvZGVCb29rOwogICBJTlQgc2ZiU3RhcnQ7CiAgIElOVCBzZmJDbnQ7Ci0gIElOVCBzZWN0aW9uQml0czsgICAgICAgICAgICAgIC8qIGh1ZmYgKyBzaSAhICovCisgIElOVCBzZWN0aW9uQml0czsgLyogaHVmZiArIHNpICEgKi8KIH0gU0VDVElPTl9JTkZPOwogCi0KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIElOVCBibG9ja1R5cGU7CiAgIElOVCBub09mR3JvdXBzOwogICBJTlQgc2ZiQ250OwpAQCAtMTIyLDQ2ICsxMzEsMzAgQEAKICAgSU5UIHNmYlBlckdyb3VwOwogICBJTlQgbm9PZlNlY3Rpb25zOwogICBTRUNUSU9OX0lORk8gaHVmZnNlY3Rpb25bTUFYX1NFQ1RJT05TXTsKLSAgSU5UIHNpZGVJbmZvQml0czsgICAgICAgICAgICAgLyogc2VjdGlvbmluZyBiaXRzICAgICAgICovCi0gIElOVCBodWZmbWFuQml0czsgICAgICAgICAgICAgIC8qIGh1ZmZtYW4gICAgY29kZWQgYml0cyAqLwotICBJTlQgc2NhbGVmYWNCaXRzOyAgICAgICAgICAgICAvKiBzY2FsZWZhYyAgIGNvZGVkIGJpdHMgKi8KLSAgSU5UIG5vaXNlTnJnQml0czsgICAgICAgICAgICAgLyogbm9pc2VFbmVyZ3kgY29kZWQgYml0cyAqLwotICBJTlQgZmlyc3RTY2Y7ICAgICAgICAgICAgICAgICAvKiBmaXJzdCBzY2YgdG8gYmUgY29kZWQgKi8KKyAgSU5UIHNpZGVJbmZvQml0czsgLyogc2VjdGlvbmluZyBiaXRzICAgICAgICovCisgIElOVCBodWZmbWFuQml0czsgIC8qIGh1ZmZtYW4gICAgY29kZWQgYml0cyAqLworICBJTlQgc2NhbGVmYWNCaXRzOyAvKiBzY2FsZWZhYyAgIGNvZGVkIGJpdHMgKi8KKyAgSU5UIG5vaXNlTnJnQml0czsgLyogbm9pc2VFbmVyZ3kgY29kZWQgYml0cyAqLworICBJTlQgZmlyc3RTY2Y7ICAgICAvKiBmaXJzdCBzY2YgdG8gYmUgY29kZWQgKi8KIH0gU0VDVElPTl9EQVRBOwogCi0KLXN0cnVjdCBCSVRDTlRSX1NUQVRFCi17Ci0gIElOVCAqYml0TG9va1VwOwotICBJTlQgKm1lcmdlR2Fpbkxvb2tVcDsKK3N0cnVjdCBCSVRDTlRSX1NUQVRFIHsKKyAgSU5UKiBiaXRMb29rVXA7CisgIElOVCogbWVyZ2VHYWluTG9va1VwOwogfTsKIAorSU5UIEZES2FhY0VuY19CQ05ldyhCSVRDTlRSX1NUQVRFKiogcGhCQywgVUNIQVIqIGR5bmFtaWNfUkFNKTsKIAotSU5UICBGREthYWNFbmNfQkNOZXcoQklUQ05UUl9TVEFURSAqKnBoQkMKLSAgICAgICAgICAsVUNIQVIqIGR5bmFtaWNfUkFNCi0gICAgICAgICAgKTsKK3ZvaWQgRkRLYWFjRW5jX0JDQ2xvc2UoQklUQ05UUl9TVEFURSoqIHBoQkMpOwogCi12b2lkIEZES2FhY0VuY19CQ0Nsb3NlKEJJVENOVFJfU1RBVEUgKipwaEJDKTsKLQotI2lmIGRlZmluZWQoUE5TX1BSRUNPVU5UX0VOQUJMRSkKLUlOVCAgbm9pc2VQcmVDb3VudChjb25zdCBJTlQgKm5vaXNlTnJnLCBJTlQgbWF4U2ZiKTsKLSNlbmRpZgotCi1JTlQgRkRLYWFjRW5jX2R5bkJpdENvdW50KAotICAgICAgICBCSVRDTlRSX1NUQVRFKiBjb25zdCAgICAgICAgIGhCQywKLSAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0ICAgICAgICAgICBxdWFudFNwZWN0cnVtLAotICAgICAgICBjb25zdCBVSU5UKiBjb25zdCAgICAgICAgICAgIG1heFZhbHVlSW5TZmIsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgc2NhbGVmYWMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIHNmYkNudCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBzZmJQZXJHcm91cCwKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgIFNFQ1RJT05fREFUQSogY29uc3QgUkVTVFJJQ1Qgc2VjdGlvbkRhdGEsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgbm9pc2VOcmcsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgaXNCb29rLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIGlzU2NhbGUsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MKLSAgICAgICAgKTsKK0lOVCBGREthYWNFbmNfZHluQml0Q291bnQoQklUQ05UUl9TVEFURSogY29uc3QgaEJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCogY29uc3QgcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCogY29uc3QgbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UKiBjb25zdCBzY2FsZWZhYywgY29uc3QgSU5UIGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNmYkNudCwgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiUGVyR3JvdXAsIGNvbnN0IElOVCogY29uc3Qgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEqIGNvbnN0IFJFU1RSSUNUIHNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQqIGNvbnN0IG5vaXNlTnJnLCBjb25zdCBJTlQqIGNvbnN0IGlzQm9vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UKiBjb25zdCBpc1NjYWxlLCBjb25zdCBVSU5UIHN5bnRheEZsYWdzKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2dycF9kYXRhLmNwcCBiL2xpYkFBQ2VuYy9zcmMvZ3JwX2RhdGEuY3BwCmluZGV4IDQ2NTg2NWYuLmJjOWQ4NWYgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvZ3JwX2RhdGEuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvZ3JwX2RhdGEuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE5NCArOTAsMTc1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogU2hvcnQgYmxvY2sgZ3JvdXBpbmcKKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogU2hvcnQgYmxvY2sgZ3JvdXBpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogI2luY2x1ZGUgImludGVyZmFjZS5oIgogCiAvKgotKiB0aGlzIHJvdXRpbmUgZG9lcyBub3Qgd29yayBpbi1wbGFjZQotKi8KKyAqIHRoaXMgcm91dGluZSBkb2VzIG5vdCB3b3JrIGluLXBsYWNlCisgKi8KIAorLyoKKyAqIERvbid0IHVzZSBmQWRkU2F0dXJhdGUyKCkgYmVjYXVzZSBpdCBsb29zZXMgb25lIGJpdCBhY2N1cmFjeSB3aGljaCBpcworICogdXNlZnVsbCBmb3IgcXVhbGl0eS4KKyAqLwogc3RhdGljIGlubGluZSBGSVhQX0RCTCBucmdBZGRTYXR1cmF0ZShjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7Ci0gIHJldHVybiAoIChhPj0oRklYUF9EQkwpTUFYVkFMX0RCTC1iKSA/IChGSVhQX0RCTClNQVhWQUxfREJMIDogKGEgKyBiKSApOworICByZXR1cm4gKChhID49IChGSVhQX0RCTClNQVhWQUxfREJMIC0gYikgPyAoRklYUF9EQkwpTUFYVkFMX0RCTCA6IChhICsgYikpOwogfQogCi12b2lkCi1GREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoRklYUF9EQkwgICAgICAqbWRjdFNwZWN0cnVtLCAgICAgLyogaW4tb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgKnNmYlRocmVzaG9sZCwgICAgIC8qIGluLW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJFbmVyZ3ksICAgICAgICAvKiBpbi1vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5TVMsICAgICAgLyogaW4tb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYlNwcmVhZEVuZXJneSwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIHNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpzZmJNaW5TbnJMZERhdGEsCi0gICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpncm91cGVkU2ZiT2Zmc2V0LCAgICAgICAvKiBvdXQgKi8KLSAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgKm1heFNmYlBlckdyb3VwLCAgICAgICAgIC8qIG91dCAqLwotICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqZ3JvdXBlZFNmYk1pblNuckxkRGF0YSwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIG5vT2ZHcm91cHMsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICpncm91cExlbiwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIGdyYW51bGVMZW5ndGgpCi17Ci0gIElOVCBpLGo7Ci0gIElOVCBsaW5lOyAgICAgICAvKiBjb3VudHMgdGhyb3VnaCBsaW5lcyAgICAgICAgICAgICAgKi8KLSAgSU5UIHNmYjsgICAgICAgIC8qIGNvdW50cyB0aHJvdWdoIHNjYWxlZmFjdG9yIGJhbmRzICAqLwotICBJTlQgZ3JwOyAgICAgICAgLyogY291bnRzIHRocm91Z2ggZ3JvdXBzICAgICAgICAgICAgICovCi0gIElOVCB3bmQ7ICAgICAgICAvKiBjb3VudHMgdGhyb3VnaCB3aW5kb3dzIGluIGEgZ3JvdXAgKi8KLSAgSU5UIG9mZnNldDsgICAgIC8qIG5lZWRlZCBpbiBzZmJPZmZzZXQgZ3JvdXBpbmcgICAgICAqLwordm9pZCBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwgICAgICAvKiBpbi1vdXQgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ZCX1RIUkVTSE9MRCAqc2ZiVGhyZXNob2xkLCAvKiBpbi1vdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgKnNmYkVuZXJneSwgICAgICAgLyogaW4tb3V0ICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRkJfRU5FUkdZICpzZmJFbmVyZ3lNUywgICAgIC8qIGluLW91dCAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgKnNmYlNwcmVhZEVuZXJneSwgY29uc3QgSU5UIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZmJBY3RpdmUsIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnNmYk1pblNuckxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqZ3JvdXBlZFNmYk9mZnNldCwgLyogb3V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1heFNmYlBlckdyb3VwLCAgIC8qIG91dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmdyb3VwZWRTZmJNaW5TbnJMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbm9PZkdyb3VwcywgY29uc3QgSU5UICpncm91cExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoKSB7CisgIElOVCBpLCBqOworICBJTlQgbGluZTsgICAvKiBjb3VudHMgdGhyb3VnaCBsaW5lcyAgICAgICAgICAgICAgKi8KKyAgSU5UIHNmYjsgICAgLyogY291bnRzIHRocm91Z2ggc2NhbGVmYWN0b3IgYmFuZHMgICovCisgIElOVCBncnA7ICAgIC8qIGNvdW50cyB0aHJvdWdoIGdyb3VwcyAgICAgICAgICAgICAqLworICBJTlQgd25kOyAgICAvKiBjb3VudHMgdGhyb3VnaCB3aW5kb3dzIGluIGEgZ3JvdXAgKi8KKyAgSU5UIG9mZnNldDsgLyogbmVlZGVkIGluIHNmYk9mZnNldCBncm91cGluZyAgICAgICovCiAgIElOVCBoaWdoZXN0U2ZiOworICBJTlQgZ3JhbnVsZUxlbmd0aF9zaG9ydCA9IGdyYW51bGVMZW5ndGggLyBUUkFOU19GQUM7CiAKLSAgSU5UIGdyYW51bGVMZW5ndGhfc2hvcnQgPSBncmFudWxlTGVuZ3RoL1RSQU5TX0ZBQzsKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcFNwZWN0cnVtLCBGSVhQX0RCTCwgKDEwMjQpKQogCiAgIC8qIGZvciBzaG9ydCBibG9ja3M6IHJlZ3JvdXAgc3BlY3RydW0gYW5kICovCiAgIC8qIGdyb3VwIGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzIGFjY29yZGluZyB0byBncm91cGluZyAqLwotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodG1wU3BlY3RydW0sIEZJWFBfREJMLCAoMTAyNCkpOwogCiAgIC8qIGNhbGN1bGF0ZSBtYXhTZmJQZXJHcm91cCAqLwogICBoaWdoZXN0U2ZiID0gMDsKLSAgZm9yICh3bmQgPSAwOyB3bmQgPCBUUkFOU19GQUM7IHduZCsrKQotICB7Ci0gICAgZm9yIChzZmIgPSBzZmJBY3RpdmUtMTsgc2ZiID49IGhpZ2hlc3RTZmI7IHNmYi0tKQotICAgIHsKLSAgICAgIGZvciAobGluZSA9IHNmYk9mZnNldFtzZmIrMV0tMTsgbGluZSA+PSBzZmJPZmZzZXRbc2ZiXTsgbGluZS0tKQotICAgICAgewotICAgICAgICBpZiAoIG1kY3RTcGVjdHJ1bVt3bmQqZ3JhbnVsZUxlbmd0aF9zaG9ydCtsaW5lXSAhPSBGTDJGWENPTlNUX1NQQygwLjApICkgYnJlYWs7IC8qIHRoaXMgYmFuZCBpcyBub3QgY29tcGxldGVseSB6ZXJvICovCisgIGZvciAod25kID0gMDsgd25kIDwgVFJBTlNfRkFDOyB3bmQrKykgeworICAgIGZvciAoc2ZiID0gc2ZiQWN0aXZlIC0gMTsgc2ZiID49IGhpZ2hlc3RTZmI7IHNmYi0tKSB7CisgICAgICBmb3IgKGxpbmUgPSBzZmJPZmZzZXRbc2ZiICsgMV0gLSAxOyBsaW5lID49IHNmYk9mZnNldFtzZmJdOyBsaW5lLS0pIHsKKyAgICAgICAgaWYgKG1kY3RTcGVjdHJ1bVt3bmQgKiBncmFudWxlTGVuZ3RoX3Nob3J0ICsgbGluZV0gIT0KKyAgICAgICAgICAgIEZMMkZYQ09OU1RfU1BDKDAuMCkpCisgICAgICAgICAgYnJlYWs7IC8qIHRoaXMgYmFuZCBpcyBub3QgY29tcGxldGVseSB6ZXJvICovCiAgICAgICB9Ci0gICAgICBpZiAobGluZSA+PSBzZmJPZmZzZXRbc2ZiXSkgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGJhbmQgd2FzIG5vdCBjb21wbGV0ZWx5IHplcm8gKi8KKyAgICAgIGlmIChsaW5lID49IHNmYk9mZnNldFtzZmJdKSBicmVhazsgLyogdGhpcyBiYW5kIHdhcyBub3QgY29tcGxldGVseSB6ZXJvICovCiAgICAgfQogICAgIGhpZ2hlc3RTZmIgPSBmaXhNYXgoaGlnaGVzdFNmYiwgc2ZiKTsKICAgfQogICBoaWdoZXN0U2ZiID0gaGlnaGVzdFNmYiA+IDAgPyBoaWdoZXN0U2ZiIDogMDsKLSAgKm1heFNmYlBlckdyb3VwID0gaGlnaGVzdFNmYisxOworICAqbWF4U2ZiUGVyR3JvdXAgPSBoaWdoZXN0U2ZiICsgMTsKIAogICAvKiBjYWxjdWxhdGUgZ3JvdXBlZFNmYk9mZnNldCAqLwogICBpID0gMDsKICAgb2Zmc2V0ID0gMDsKLSAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykKLSAgewotICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmUrMTsgc2ZiKyspCi0gICAgICB7Ci0gICAgICAgICAgZ3JvdXBlZFNmYk9mZnNldFtpKytdID0gb2Zmc2V0ICsgc2ZiT2Zmc2V0W3NmYl0gKiBncm91cExlbltncnBdOwotICAgICAgfQotICAgICAgaSArPSAgc2ZiQ250LXNmYjsKLSAgICAgIG9mZnNldCArPSBncm91cExlbltncnBdICogZ3JhbnVsZUxlbmd0aF9zaG9ydDsKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlICsgMTsgc2ZiKyspIHsKKyAgICAgIGdyb3VwZWRTZmJPZmZzZXRbaSsrXSA9IG9mZnNldCArIHNmYk9mZnNldFtzZmJdICogZ3JvdXBMZW5bZ3JwXTsKKyAgICB9CisgICAgaSArPSBzZmJDbnQgLSBzZmI7CisgICAgb2Zmc2V0ICs9IGdyb3VwTGVuW2dycF0gKiBncmFudWxlTGVuZ3RoX3Nob3J0OwogICB9CiAgIGdyb3VwZWRTZmJPZmZzZXRbaSsrXSA9IGdyYW51bGVMZW5ndGg7CiAKICAgLyogY2FsY3VsYXRlIGdyb3VwZWRTZmJNaW5TbnIgKi8KICAgaSA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspCi0gIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspCi0gICAgeworICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CiAgICAgICBncm91cGVkU2ZiTWluU25yTGREYXRhW2krK10gPSBzZmJNaW5TbnJMZERhdGFbc2ZiXTsKICAgICB9Ci0gICAgaSArPSAgc2ZiQ250LXNmYjsKKyAgICBpICs9IHNmYkNudCAtIHNmYjsKICAgfQogCiAgIC8qIHN1bSB1cCBzZmJUaHJlc2hvbGRzICovCiAgIHduZCA9IDA7CiAgIGkgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKQotICB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKQotICAgIHsKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgewogICAgICAgRklYUF9EQkwgdGhyZXNoID0gc2ZiVGhyZXNob2xkLT5TaG9ydFt3bmRdW3NmYl07Ci0gICAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspCi0gICAgICB7Ci0gICAgICAgIHRocmVzaCA9IG5yZ0FkZFNhdHVyYXRlKHRocmVzaCwgc2ZiVGhyZXNob2xkLT5TaG9ydFt3bmQral1bc2ZiXSk7CisgICAgICBmb3IgKGogPSAxOyBqIDwgZ3JvdXBMZW5bZ3JwXTsgaisrKSB7CisgICAgICAgIHRocmVzaCA9IG5yZ0FkZFNhdHVyYXRlKHRocmVzaCwgc2ZiVGhyZXNob2xkLT5TaG9ydFt3bmQgKyBqXVtzZmJdKTsKICAgICAgIH0KICAgICAgIHNmYlRocmVzaG9sZC0+TG9uZ1tpKytdID0gdGhyZXNoOwogICAgIH0KLSAgICBpICs9ICBzZmJDbnQtc2ZiOworICAgIGkgKz0gc2ZiQ250IC0gc2ZiOwogICAgIHduZCArPSBncm91cExlbltncnBdOwogICB9CiAKICAgLyogc3VtIHVwIHNmYkVuZXJnaWVzIGxlZnQvcmlnaHQgKi8KICAgd25kID0gMDsKICAgaSA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspCi0gIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspCi0gICAgeworICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CiAgICAgICBGSVhQX0RCTCBlbmVyZ3kgPSBzZmJFbmVyZ3ktPlNob3J0W3duZF1bc2ZiXTsKLSAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykKLSAgICAgIHsKLSAgICAgICAgZW5lcmd5ID0gbnJnQWRkU2F0dXJhdGUoZW5lcmd5LCBzZmJFbmVyZ3ktPlNob3J0W3duZCtqXVtzZmJdKTsKKyAgICAgIGZvciAoaiA9IDE7IGogPCBncm91cExlbltncnBdOyBqKyspIHsKKyAgICAgICAgZW5lcmd5ID0gbnJnQWRkU2F0dXJhdGUoZW5lcmd5LCBzZmJFbmVyZ3ktPlNob3J0W3duZCArIGpdW3NmYl0pOwogICAgICAgfQogICAgICAgc2ZiRW5lcmd5LT5Mb25nW2krK10gPSBlbmVyZ3k7CiAgICAgfQotICAgIGkgKz0gIHNmYkNudC1zZmI7CisgICAgaSArPSBzZmJDbnQgLSBzZmI7CiAgICAgd25kICs9IGdyb3VwTGVuW2dycF07CiAgIH0KIAogICAvKiBzdW0gdXAgc2ZiRW5lcmdpZXMgbWlkL3NpZGUgKi8KICAgd25kID0gMDsKICAgaSA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspCi0gIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspCi0gICAgeworICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CiAgICAgICBGSVhQX0RCTCBlbmVyZ3kgPSBzZmJFbmVyZ3lNUy0+U2hvcnRbd25kXVtzZmJdOwotICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKQotICAgICAgewotICAgICAgICBlbmVyZ3kgPSBucmdBZGRTYXR1cmF0ZShlbmVyZ3ksIHNmYkVuZXJneU1TLT5TaG9ydFt3bmQral1bc2ZiXSk7CisgICAgICBmb3IgKGogPSAxOyBqIDwgZ3JvdXBMZW5bZ3JwXTsgaisrKSB7CisgICAgICAgIGVuZXJneSA9IG5yZ0FkZFNhdHVyYXRlKGVuZXJneSwgc2ZiRW5lcmd5TVMtPlNob3J0W3duZCArIGpdW3NmYl0pOwogICAgICAgfQogICAgICAgc2ZiRW5lcmd5TVMtPkxvbmdbaSsrXSA9IGVuZXJneTsKICAgICB9Ci0gICAgaSArPSAgc2ZiQ250LXNmYjsKKyAgICBpICs9IHNmYkNudCAtIHNmYjsKICAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKICAgfQogCiAgIC8qIHN1bSB1cCBzZmJTcHJlYWRFbmVyZ2llcyAqLwogICB3bmQgPSAwOwogICBpID0gMDsKLSAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykKLSAgewotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykKLSAgICB7CisgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKICAgICAgIEZJWFBfREJMIGVuZXJneSA9IHNmYlNwcmVhZEVuZXJneS0+U2hvcnRbd25kXVtzZmJdOwotICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKQotICAgICAgewotICAgICAgICAgZW5lcmd5ID0gbnJnQWRkU2F0dXJhdGUoZW5lcmd5LCBzZmJTcHJlYWRFbmVyZ3ktPlNob3J0W3duZCtqXVtzZmJdKTsKKyAgICAgIGZvciAoaiA9IDE7IGogPCBncm91cExlbltncnBdOyBqKyspIHsKKyAgICAgICAgZW5lcmd5ID0gbnJnQWRkU2F0dXJhdGUoZW5lcmd5LCBzZmJTcHJlYWRFbmVyZ3ktPlNob3J0W3duZCArIGpdW3NmYl0pOwogICAgICAgfQogICAgICAgc2ZiU3ByZWFkRW5lcmd5LT5Mb25nW2krK10gPSBlbmVyZ3k7CiAgICAgfQotICAgIGkgKz0gIHNmYkNudC1zZmI7CisgICAgaSArPSBzZmJDbnQgLSBzZmI7CiAgICAgd25kICs9IGdyb3VwTGVuW2dycF07CiAgIH0KIAogICAvKiByZS1ncm91cCBzcGVjdHJ1bSAqLwogICB3bmQgPSAwOwogICBpID0gMDsKLSAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykKLSAgewotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykKLSAgICB7Ci0gICAgICBpbnQgd2lkdGggPSBzZmJPZmZzZXRbc2ZiKzFdLXNmYk9mZnNldFtzZmJdOwotICAgICAgRklYUF9EQkwgKnBNZGN0U3BlY3RydW0gPSAmbWRjdFNwZWN0cnVtW3NmYk9mZnNldFtzZmJdXSArIHduZCpncmFudWxlTGVuZ3RoX3Nob3J0OwotICAgICAgZm9yIChqID0gMDsgaiA8IGdyb3VwTGVuW2dycF07IGorKykKLSAgICAgIHsKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgeworICAgICAgaW50IHdpZHRoID0gc2ZiT2Zmc2V0W3NmYiArIDFdIC0gc2ZiT2Zmc2V0W3NmYl07CisgICAgICBGSVhQX0RCTCAqcE1kY3RTcGVjdHJ1bSA9CisgICAgICAgICAgJm1kY3RTcGVjdHJ1bVtzZmJPZmZzZXRbc2ZiXV0gKyB3bmQgKiBncmFudWxlTGVuZ3RoX3Nob3J0OworICAgICAgZm9yIChqID0gMDsgaiA8IGdyb3VwTGVuW2dycF07IGorKykgewogICAgICAgICBGSVhQX0RCTCAqcFRtcCA9IHBNZGN0U3BlY3RydW07Ci0gICAgICAgIGZvciAobGluZSA9IHdpZHRoOyBsaW5lID4gMDsgbGluZS0tKQotICAgICAgICB7CisgICAgICAgIGZvciAobGluZSA9IHdpZHRoOyBsaW5lID4gMDsgbGluZS0tKSB7CiAgICAgICAgICAgdG1wU3BlY3RydW1baSsrXSA9ICpwVG1wKys7CiAgICAgICAgIH0KICAgICAgICAgcE1kY3RTcGVjdHJ1bSArPSBncmFudWxlTGVuZ3RoX3Nob3J0OwogICAgICAgfQogICAgIH0KLSAgICBpICs9ICAoZ3JvdXBMZW5bZ3JwXSooc2ZiT2Zmc2V0W3NmYkNudF0tc2ZiT2Zmc2V0W3NmYl0pKTsKKyAgICBpICs9IChncm91cExlbltncnBdICogKHNmYk9mZnNldFtzZmJDbnRdIC0gc2ZiT2Zmc2V0W3NmYl0pKTsKICAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKICAgfQogCi0gIEZES21lbWNweShtZGN0U3BlY3RydW0sIHRtcFNwZWN0cnVtLCBncmFudWxlTGVuZ3RoKnNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jcHkobWRjdFNwZWN0cnVtLCB0bXBTcGVjdHJ1bSwgZ3JhbnVsZUxlbmd0aCAqIHNpemVvZihGSVhQX0RCTCkpOwogCiAgIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wU3BlY3RydW0sIEZJWFBfREJMLCAoMTAyNCkpCiB9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2dycF9kYXRhLmggYi9saWJBQUNlbmMvc3JjL2dycF9kYXRhLmgKaW5kZXggZjA2MTg1NS4uM2UxYTcwOCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9ncnBfZGF0YS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvZ3JwX2RhdGEuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzNyArOTAsMzQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBTaG9ydCBibG9jayBncm91cGluZworICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19HUlBfREFUQV9IX18KLSNkZWZpbmUgX19HUlBfREFUQV9IX18KKyAgIERlc2NyaXB0aW9uOiBTaG9ydCBibG9jayBncm91cGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEdSUF9EQVRBX0gKKyNkZWZpbmUgR1JQX0RBVEFfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiAjaW5jbHVkZSAicHN5X2RhdGEuaCIKIAotCi12b2lkCi1GREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoRklYUF9EQkwgICAgICAqbWRjdFNwZWN0cnVtLCAgICAgICAgIC8qIGluLW91dCAqLwotICAgICAgICAgICAgICAgU0ZCX1RIUkVTSE9MRCAqc2ZiVGhyZXNob2xkLCAgICAgICAgIC8qIGluLW91dCAqLwotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5LCAgICAgICAgICAgIC8qIGluLW91dCAqLwotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5TVMsICAgICAgICAgIC8qIGluLW91dCAqLwotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiU3ByZWFkRW5lcmd5LAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnNmYk1pblNuckxkRGF0YSwKLSAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgKmdyb3VwZWRTZmJPZmZzZXQsICAgICAvKiBvdXQgKi8KLSAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgKm1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqZ3JvdXBlZFNmYk1pblNuckxkRGF0YSwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIG5vT2ZHcm91cHMsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICpncm91cExlbiwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIGdyYW51bGVMZW5ndGgpOwordm9pZCBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwgICAgICAvKiBpbi1vdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgKnNmYlRocmVzaG9sZCwgLyogaW4tb3V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRkJfRU5FUkdZICpzZmJFbmVyZ3ksICAgICAgIC8qIGluLW91dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAqc2ZiRW5lcmd5TVMsICAgICAvKiBpbi1vdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgKnNmYlNwcmVhZEVuZXJneSwgY29uc3QgSU5UIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZmJBY3RpdmUsIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnNmYk1pblNuckxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqZ3JvdXBlZFNmYk9mZnNldCwgLyogb3V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmdyb3VwZWRTZmJNaW5TbnJMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbm9PZkdyb3VwcywgY29uc3QgSU5UICpncm91cExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoKTsKIAogI2VuZGlmIC8qIF9JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9pbnRlbnNpdHkuY3BwIGIvbGliQUFDZW5jL3NyYy9pbnRlbnNpdHkuY3BwCmluZGV4IGI0NWIyN2IuLmExNjBhNGYgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvaW50ZW5zaXR5LmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2ludGVuc2l0eS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksODIgKzkwLDk0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIEEuIEhvcm5kYXNjaCAoY29kZSBvcmlnaW5hbGx5IGZyb20gbHdyKSAvIEpvc2VmIEhvZXBmbCAoRkRLKQotICAgY29udGVudHMvZGVzY3JpcHRpb246IGludGVuc2l0eSBzdGVyZW8gcHJvY2Vzc2luZworICAgQXV0aG9yKHMpOiAgIEEuIEhvcm5kYXNjaCAoY29kZSBvcmlnaW5hbGx5IGZyb20gbHdyKSAvIEpvc2VmIEhvZXBmbCAoRkRLKQogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogaW50ZW5zaXR5IHN0ZXJlbyBwcm9jZXNzaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJpbnRlbnNpdHkuaCIKKwogI2luY2x1ZGUgImludGVyZmFjZS5oIgogI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAjaW5jbHVkZSAicWNfbWFpbi5oIgogI2luY2x1ZGUgImJpdF9jbnQuaCIKIAotLyogb25seSBzZXQgYW4gSVMgc2VlZCBpdCBsZWZ0L3JpZ2h0IGNoYW5uZWwgY29ycmVsYXRpb24gaXMgYWJvdmUgSVNfQ09SUl9USFJFU0ggKi8KLSNkZWZpbmUgSVNfQ09SUl9USFJFU0ggICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC45NWYpCisvKiBvbmx5IHNldCBhbiBJUyBzZWVkIGl0IGxlZnQvcmlnaHQgY2hhbm5lbCBjb3JyZWxhdGlvbiBpcyBhYm92ZSBJU19DT1JSX1RIUkVTSAorICovCisjZGVmaW5lIElTX0NPUlJfVEhSRVNIIEZMMkZYQ09OU1RfREJMKDAuOTVmKQogCiAvKiB3aGVuIGV4cGFuZGluZyB0aGUgSVMgcmVnaW9uIHRvIG1vcmUgU0ZCcyBvbmx5IGFjY2VwdCBhbiBlcnJvciB0aGF0IGlzCiAgKiBub3QgbW9yZSB0aGFuIElTX1RPVEFMX0VSUk9SX1RIUkVTSCBvdmVyYWxsIGFuZAogICogbm90IG1vcmUgdGhhbiBJU19MT0NBTF9FUlJPUl9USFJFU0ggZm9yIHRoZSBjdXJyZW50IFNGQiAqLwotI2RlZmluZSBJU19UT1RBTF9FUlJPUl9USFJFU0ggICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjA0ZikKLSNkZWZpbmUgSVNfTE9DQUxfRVJST1JfVEhSRVNIICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wMWYpCisjZGVmaW5lIElTX1RPVEFMX0VSUk9SX1RIUkVTSCBGTDJGWENPTlNUX0RCTCgwLjA0ZikKKyNkZWZpbmUgSVNfTE9DQUxfRVJST1JfVEhSRVNIIEZMMkZYQ09OU1RfREJMKDAuMDFmKQogCi0vKiB0aGUgbWF4aW11bSBhbGxvd2VkIGNoYW5nZSBvZiB0aGUgaW50ZW5zaXR5IGRpcmVjdGlvbiAodW5pdDogSVMgc2NhbGUpIC0gc2NhbGVkIHdpdGggZmFjdG9yIDAuMjUgLSAqLworLyogdGhlIG1heGltdW0gYWxsb3dlZCBjaGFuZ2Ugb2YgdGhlIGludGVuc2l0eSBkaXJlY3Rpb24gKHVuaXQ6IElTIHNjYWxlKSAtCisgKiBzY2FsZWQgd2l0aCBmYWN0b3IgMC4yNSAtICovCiAjZGVmaW5lIElTX0RJUkVDVElPTl9ERVZJQVRJT05fVEhSRVNIX1NGIDIKLSNkZWZpbmUgSVNfRElSRUNUSU9OX0RFVklBVElPTl9USFJFU0ggRkwyRlhDT05TVF9EQkwoMi4wZi8oMTw8SVNfRElSRUNUSU9OX0RFVklBVElPTl9USFJFU0hfU0YpKQorI2RlZmluZSBJU19ESVJFQ1RJT05fREVWSUFUSU9OX1RIUkVTSCBcCisgIEZMMkZYQ09OU1RfREJMKDIuMGYgLyAoMSA8PCBJU19ESVJFQ1RJT05fREVWSUFUSU9OX1RIUkVTSF9TRikpCiAKLS8qIElTIHJlZ2lvbnMgbmVlZCB0byBoYXZlIGEgbWluaW1hbCBwZXJjZW50YWdlIG9mIHRoZSBvdmVyYWxsIGxvdWRuZXNzLCBlLmcuIDAuMDYgPT0gNiUgKi8KLSNkZWZpbmUgSVNfUkVHSU9OX01JTl9MT1VETkVTUyAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4xZikKKy8qIElTIHJlZ2lvbnMgbmVlZCB0byBoYXZlIGEgbWluaW1hbCBwZXJjZW50YWdlIG9mIHRoZSBvdmVyYWxsIGxvdWRuZXNzLCBlLmcuCisgKiAwLjA2ID09IDYlICovCisjZGVmaW5lIElTX1JFR0lPTl9NSU5fTE9VRE5FU1MgRkwyRlhDT05TVF9EQkwoMC4xZikKIAogLyogb25seSBwZXJmb3JtIElTIGlmIElTX01JTl9TRkJTIG5laWdoYm9yaW5nIFNGQnMgY2FuIGJlIHByb2Nlc3NlZCAqLwotI2RlZmluZSBJU19NSU5fU0ZCUyAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIElTX01JTl9TRkJTIDYKIAogLyogb25seSBkbyBJUyBpZgotICogaWYgSVNfTEVGVF9SSUdIVF9SQVRJT19USFJFU0ggPCBzZmJFbmVyZ3lMZWZ0W3NmYl0vc2ZiRW5lcmd5UmlnaHRbc2ZiXSA8IDEgLyBJU19MRUZUX1JJR0hUX1JBVElPX1RIUkVTSAorICogaWYgSVNfTEVGVF9SSUdIVF9SQVRJT19USFJFU0ggPCBzZmJFbmVyZ3lMZWZ0W3NmYl0vc2ZiRW5lcmd5UmlnaHRbc2ZiXSA8IDEgLworICogSVNfTEVGVF9SSUdIVF9SQVRJT19USFJFU0gKICAqIC0+IG5vIElTIGlmIHRoZSBwYW5uaW5nIGFuZ2xlIGlzIG5vdCBmYXIgZnJvbSB0aGUgbWlkZGxlLCBNUyB3aWxsIGRvICovCiAvKiB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBzY2FsZSBvZiArLy0xLjAyOTE0NjM0NTY2ICovCi0jZGVmaW5lIElTX0xFRlRfUklHSFRfUkFUSU9fVEhSRVNIICAgIEZMMkZYQ09OU1RfREJMKDAuN2YpCisjZGVmaW5lIElTX0xFRlRfUklHSFRfUkFUSU9fVEhSRVNIIEZMMkZYQ09OU1RfREJMKDAuN2YpCiAKIC8qIHNjYWxlZmFjdG9yIG9mIHJlYWxTY2FsZSAqLwotI2RlZmluZSBSRUFMX1NDQUxFX1NGICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJFQUxfU0NBTEVfU0YgMQogCiAvKiBzY2FsZWZhY3RvciBvdmVyYWxsTG91ZG5lc3MgKi8KLSNkZWZpbmUgT1ZFUkFMTF9MT1VETkVTU19TRiAgICAgICAgICAgICAgNgorI2RlZmluZSBPVkVSQUxMX0xPVURORVNTX1NGIDYKIAogLyogc2NhbGVmYWN0b3IgZm9yIHN1bSBvdmVyIG1heCBzYW1wbGVzIHBlciBnb3VwICovCi0jZGVmaW5lIE1BWF9TRkJfUEVSX0dST1VQX1NGICAgICAgICAgICAgIDYKKyNkZWZpbmUgTUFYX1NGQl9QRVJfR1JPVVBfU0YgNgogCiAvKiBzY2FsZWZhY3RvciBmb3Igc3VtIG9mIG1kY3Qgc3BlY3RydW0gKi8KLSNkZWZpbmUgTURDVF9TUEVDX1NGICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBNRENUX1NQRUNfU0YgNgogCit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfREJMIGNvcnJfdGhyZXNoOyAvKiE8IE9ubHkgc2V0IGFuIElTIHNlZWQgaXQgbGVmdC9yaWdodCBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiBpcyBhYm92ZSBjb3JyX3RocmVzaCAqLwogCi10eXBlZGVmIHN0cnVjdAoteworICBGSVhQX0RCTCB0b3RhbF9lcnJvcl90aHJlc2g7IC8qITwgV2hlbiBleHBhbmRpbmcgdGhlIElTIHJlZ2lvbiB0byBtb3JlIFNGQnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGFjY2VwdCBhbiBlcnJvciB0aGF0IGlzIG5vdCBtb3JlIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG90YWxfZXJyb3JfdGhyZXNoJyBvdmVyYWxsLiAqLwogCi0gIEZJWFBfREJMIGNvcnJfdGhyZXNoOyAgICAgICAgICAgICAgICAgLyohPCBPbmx5IHNldCBhbiBJUyBzZWVkIGl0IGxlZnQvcmlnaHQgY2hhbm5lbCBjb3JyZWxhdGlvbiBpcyBhYm92ZSBjb3JyX3RocmVzaCAqLworICBGSVhQX0RCTCBsb2NhbF9lcnJvcl90aHJlc2g7IC8qITwgV2hlbiBleHBhbmRpbmcgdGhlIElTIHJlZ2lvbiB0byBtb3JlIFNGQnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGFjY2VwdCBhbiBlcnJvciB0aGF0IGlzIG5vdCBtb3JlIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9jYWxfZXJyb3JfdGhyZXNoJyBmb3IgdGhlIGN1cnJlbnQgU0ZCLiAqLwogCi0gIEZJWFBfREJMIHRvdGFsX2Vycm9yX3RocmVzaDsgICAgICAgICAgLyohPCBXaGVuIGV4cGFuZGluZyB0aGUgSVMgcmVnaW9uIHRvIG1vcmUgU0ZCcyBvbmx5IGFjY2VwdCBhbiBlcnJvciB0aGF0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgbW9yZSB0aGFuICd0b3RhbF9lcnJvcl90aHJlc2gnIG92ZXJhbGwuICovCisgIEZJWFBfREJMIGRpcmVjdGlvbl9kZXZpYXRpb25fdGhyZXNoOyAvKiE8IFRoZSBtYXhpbXVtIGFsbG93ZWQgY2hhbmdlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW5zaXR5IGRpcmVjdGlvbiAodW5pdDogSVMgc2NhbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotICBGSVhQX0RCTCBsb2NhbF9lcnJvcl90aHJlc2g7ICAgICAgICAgIC8qITwgV2hlbiBleHBhbmRpbmcgdGhlIElTIHJlZ2lvbiB0byBtb3JlIFNGQnMgb25seSBhY2NlcHQgYW4gZXJyb3IgdGhhdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1vcmUgdGhhbiAnbG9jYWxfZXJyb3JfdGhyZXNoJyBmb3IgdGhlIGN1cnJlbnQgU0ZCLiAqLworICBGSVhQX0RCTCBpc19yZWdpb25fbWluX2xvdWRuZXNzOyAvKiE8IElTIHJlZ2lvbnMgbmVlZCB0byBoYXZlIGEgbWluaW1hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlIG9mIHRoZSBvdmVyYWxsIGxvdWRuZXNzLCBlLmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDYgPT0gNiUgKi8KIAotICBGSVhQX0RCTCBkaXJlY3Rpb25fZGV2aWF0aW9uX3RocmVzaDsgIC8qITwgVGhlIG1heGltdW0gYWxsb3dlZCBjaGFuZ2Ugb2YgdGhlIGludGVuc2l0eSBkaXJlY3Rpb24gKHVuaXQ6IElTIHNjYWxlKSAqLworICBJTlQgbWluX2lzX3NmYnM7IC8qITwgT25seSBwZXJmb3JtIElTIGlmICdtaW5faXNfc2ZicycgbmVpZ2hib3JpbmcgU0ZCcyBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgKi8KIAotICBGSVhQX0RCTCBpc19yZWdpb25fbWluX2xvdWRuZXNzOyAgICAgIC8qITwgSVMgcmVnaW9ucyBuZWVkIHRvIGhhdmUgYSBtaW5pbWFsIHBlcmNlbnRhZ2Ugb2YgdGhlIG92ZXJhbGwgbG91ZG5lc3MsIGUuZy4gMC4wNiA9PSA2JSAqLwotCi0gIElOVCAgICAgIG1pbl9pc19zZmJzOyAgICAgICAgICAgICAgICAgLyohPCBPbmx5IHBlcmZvcm0gSVMgaWYgJ21pbl9pc19zZmJzJyBuZWlnaGJvcmluZyBTRkJzIGNhbiBiZSBwcm9jZXNzZWQgKi8KLQotICBGSVhQX0RCTCBsZWZ0X3JpZ2h0X3JhdGlvX3RocmVzaG9sZDsgIC8qITwgTm8gSVMgaWYgdGhlIHBhbm5pbmcgYW5nbGUgaXMgbm90IGZhciBmcm9tIHRoZSBtaWRkbGUsIE1TIHdpbGwgZG8gKi8KKyAgRklYUF9EQkwgbGVmdF9yaWdodF9yYXRpb190aHJlc2hvbGQ7IC8qITwgTm8gSVMgaWYgdGhlIHBhbm5pbmcgYW5nbGUgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXIgZnJvbSB0aGUgbWlkZGxlLCBNUyB3aWxsIGRvICovCiAKIH0gSU5URU5TSVRZX1BBUkFNRVRFUlM7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IGNhbGNTZmJNYXhTY2FsZQpAQCAtMTcwLDI1ICsxOTMsMjIgQEAKICAgICByZXR1cm5zOiAgICAgIHNjYWxlZmFjdG9yCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVAotY2FsY1NmYk1heFNjYWxlKGNvbnN0IEZJWFBfREJMICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIGwxLAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBsMikKLXsKK3N0YXRpYyBJTlQgY2FsY1NmYk1heFNjYWxlKGNvbnN0IEZJWFBfREJMICptZGN0U3BlY3RydW0sIGNvbnN0IElOVCBsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBsMikgewogICBJTlQgaTsKICAgSU5UIHNmYk1heFNjYWxlOwogICBGSVhQX0RCTCBtYXhTcGM7CiAKICAgbWF4U3BjID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKLSAgZm9yIChpPWwxOyBpPGwyOyBpKyspIHsKKyAgZm9yIChpID0gbDE7IGkgPCBsMjsgaSsrKSB7CiAgICAgRklYUF9EQkwgdG1wID0gZml4cF9hYnMoKEZJWFBfREJMKW1kY3RTcGVjdHJ1bVtpXSk7CiAgICAgbWF4U3BjID0gZml4TWF4KG1heFNwYywgdG1wKTsKICAgfQotICBzZmJNYXhTY2FsZSA9IChtYXhTcGM9PUZMMkZYQ09OU1RfREJMKDAuMCkpID8gKERGUkFDVF9CSVRTLTIpIDogQ250TGVhZGluZ1plcm9zKG1heFNwYyktMTsKKyAgc2ZiTWF4U2NhbGUgPSAobWF4U3BjID09IEZMMkZYQ09OU1RfREJMKDAuMCkpID8gKERGUkFDVF9CSVRTIC0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ250TGVhZGluZ1plcm9zKG1heFNwYykgLSAxOwogCiAgIHJldHVybiBzZmJNYXhTY2FsZTsKLSB9Ci0KK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKQEAgLTIwMywxOSArMjIzLDE2IEBACiAgICAgcmV0dXJuczogICAgICBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLUZES2FhY0VuY19pbml0SXNQYXJhbXMoSU5URU5TSVRZX1BBUkFNRVRFUlMgKmlzUGFyYW1zKQotewotICBpc1BhcmFtcy0+Y29ycl90aHJlc2ggICAgICAgICAgICAgICAgPSBJU19DT1JSX1RIUkVTSDsKLSAgaXNQYXJhbXMtPnRvdGFsX2Vycm9yX3RocmVzaCAgICAgICAgID0gSVNfVE9UQUxfRVJST1JfVEhSRVNIOwotICBpc1BhcmFtcy0+bG9jYWxfZXJyb3JfdGhyZXNoICAgICAgICAgPSBJU19MT0NBTF9FUlJPUl9USFJFU0g7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfaW5pdElzUGFyYW1zKElOVEVOU0lUWV9QQVJBTUVURVJTICppc1BhcmFtcykgeworICBpc1BhcmFtcy0+Y29ycl90aHJlc2ggPSBJU19DT1JSX1RIUkVTSDsKKyAgaXNQYXJhbXMtPnRvdGFsX2Vycm9yX3RocmVzaCA9IElTX1RPVEFMX0VSUk9SX1RIUkVTSDsKKyAgaXNQYXJhbXMtPmxvY2FsX2Vycm9yX3RocmVzaCA9IElTX0xPQ0FMX0VSUk9SX1RIUkVTSDsKICAgaXNQYXJhbXMtPmRpcmVjdGlvbl9kZXZpYXRpb25fdGhyZXNoID0gSVNfRElSRUNUSU9OX0RFVklBVElPTl9USFJFU0g7Ci0gIGlzUGFyYW1zLT5pc19yZWdpb25fbWluX2xvdWRuZXNzICAgICA9IElTX1JFR0lPTl9NSU5fTE9VRE5FU1M7Ci0gIGlzUGFyYW1zLT5taW5faXNfc2ZicyAgICAgICAgICAgICAgICA9IElTX01JTl9TRkJTOworICBpc1BhcmFtcy0+aXNfcmVnaW9uX21pbl9sb3VkbmVzcyA9IElTX1JFR0lPTl9NSU5fTE9VRE5FU1M7CisgIGlzUGFyYW1zLT5taW5faXNfc2ZicyA9IElTX01JTl9TRkJTOwogICBpc1BhcmFtcy0+bGVmdF9yaWdodF9yYXRpb190aHJlc2hvbGQgPSBJU19MRUZUX1JJR0hUX1JBVElPX1RIUkVTSDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX3ByZXBhcmVJbnRlbnNpdHlEZWNpc2lvbgpAQCAtMjM4LDI0ICsyNTUsMTQgQEAKICAgICByZXR1cm5zOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotRkRLYWFjRW5jX3ByZXBhcmVJbnRlbnNpdHlEZWNpc2lvbihjb25zdCBGSVhQX0RCTCAgICAqc2ZiRW5lcmd5TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKnNmYkVuZXJneVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqc2ZiRW5lcmd5TGREYXRhTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKnNmYkVuZXJneUxkRGF0YVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqbWRjdFNwZWN0cnVtTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKm1kY3RTcGVjdHJ1bVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlRFTlNJVFlfUEFSQU1FVEVSUyAqaXNQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpocnJFcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICppc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpyZWFsU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpub3JtU2ZiTG91ZG5lc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAqc2ZiT2Zmc2V0KQotewotICBJTlQgaixzZmIsc2Zib2ZmczsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19wcmVwYXJlSW50ZW5zaXR5RGVjaXNpb24oCisgICAgY29uc3QgRklYUF9EQkwgKnNmYkVuZXJneUxlZnQsIGNvbnN0IEZJWFBfREJMICpzZmJFbmVyZ3lSaWdodCwKKyAgICBjb25zdCBGSVhQX0RCTCAqc2ZiRW5lcmd5TGREYXRhTGVmdCwgY29uc3QgRklYUF9EQkwgKnNmYkVuZXJneUxkRGF0YVJpZ2h0LAorICAgIGNvbnN0IEZJWFBfREJMICptZGN0U3BlY3RydW1MZWZ0LCBjb25zdCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtUmlnaHQsCisgICAgY29uc3QgSU5URU5TSVRZX1BBUkFNRVRFUlMgKmlzUGFyYW1zLCBGSVhQX0RCTCAqaHJyRXJyLCBJTlQgKmlzTWFzaywKKyAgICBGSVhQX0RCTCAqcmVhbFNjYWxlLCBGSVhQX0RCTCAqbm9ybVNmYkxvdWRuZXNzLCBjb25zdCBJTlQgc2ZiQ250LAorICAgIGNvbnN0IElOVCBzZmJQZXJHcm91cCwgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLCBjb25zdCBJTlQgKnNmYk9mZnNldCkgeworICBJTlQgaiwgc2ZiLCBzZmJvZmZzOwogICBJTlQgZ3JwQ291bnRlcjsKIAogICAvKiB0ZW1wb3JhcnkgdmFyaWFibGVzIHRvIGNvbXB1dGUgbG91ZG5lc3MgKi8KQEAgLTI2OSwxNDkgKzI3NiwxOTIgQEAKICAgRklYUF9EQkwgdG1wX2wsIHRtcF9yOwogICBGSVhQX0RCTCBpbnZfbjsKIAotICBGREttZW1jbGVhcihjaGFubmVsQ29yciwgICAgIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtY2xlYXIobm9ybVNmYkxvdWRuZXNzLCBNQVhfR1JPVVBFRF9TRkIqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbWNsZWFyKG92ZXJhbGxMb3VkbmVzcywgTUFYX05PX09GX0dST1VQUypzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtY2xlYXIocmVhbFNjYWxlLCAgICAgICBNQVhfR1JPVVBFRF9TRkIqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKGNoYW5uZWxDb3JyLCBNQVhfR1JPVVBFRF9TRkIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIobm9ybVNmYkxvdWRuZXNzLCBNQVhfR1JPVVBFRF9TRkIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIob3ZlcmFsbExvdWRuZXNzLCBNQVhfTk9fT0ZfR1JPVVBTICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKHJlYWxTY2FsZSwgTUFYX0dST1VQRURfU0ZCICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgZm9yIChncnBDb3VudGVyID0gMCwgc2Zib2ZmcyA9IDA7IHNmYm9mZnMgPCBzZmJDbnQ7IHNmYm9mZnMgKz0gc2ZiUGVyR3JvdXAsIGdycENvdW50ZXIrKykgeworICBmb3IgKGdycENvdW50ZXIgPSAwLCBzZmJvZmZzID0gMDsgc2Zib2ZmcyA8IHNmYkNudDsKKyAgICAgICBzZmJvZmZzICs9IHNmYlBlckdyb3VwLCBncnBDb3VudGVyKyspIHsKICAgICBvdmVyYWxsTG91ZG5lc3NbZ3JwQ291bnRlcl0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgSU5UIHNMLHNSLHM7Ci0gICAgICBGSVhQX0RCTCBpc1ZhbHVlID0gc2ZiRW5lcmd5TGREYXRhTGVmdFtzZmIrc2Zib2Zmc10tc2ZiRW5lcmd5TGREYXRhUmlnaHRbc2ZiK3NmYm9mZnNdOworICAgICAgSU5UIHNMLCBzUiwgczsKKyAgICAgIEZJWFBfREJMIGlzVmFsdWUgPSBzZmJFbmVyZ3lMZERhdGFMZWZ0W3NmYiArIHNmYm9mZnNdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lMZERhdGFSaWdodFtzZmIgKyBzZmJvZmZzXTsKIAogICAgICAgLyogZGVsaW1pdGF0ZSBpbnRlbnNpdHkgc2NhbGUgdmFsdWUgdG8gcmVwcmVzZW50YWJsZSByYW5nZSAqLwotICAgICAgcmVhbFNjYWxlW3NmYiArIHNmYm9mZnNdID0gZml4TWluKEZMMkZYQ09OU1RfREJMKDYwLmYvKDE8PChSRUFMX1NDQUxFX1NGK0xEX0RBVEFfU0hJRlQpKSksIGZpeE1heChGTDJGWENPTlNUX0RCTCgtNjAuZi8oMTw8KFJFQUxfU0NBTEVfU0YrTERfREFUQV9TSElGVCkpKSwgaXNWYWx1ZSkpOworICAgICAgcmVhbFNjYWxlW3NmYiArIHNmYm9mZnNdID0gZml4TWluKAorICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDYwLmYgLyAoMSA8PCAoUkVBTF9TQ0FMRV9TRiArIExEX0RBVEFfU0hJRlQpKSksCisgICAgICAgICAgZml4TWF4KEZMMkZYQ09OU1RfREJMKC02MC5mIC8gKDEgPDwgKFJFQUxfU0NBTEVfU0YgKyBMRF9EQVRBX1NISUZUKSkpLAorICAgICAgICAgICAgICAgICBpc1ZhbHVlKSk7CiAKLSAgICAgIHNMID0gZml4TWF4KDAsKENudExlYWRpbmdaZXJvcyhzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdKS0xKSk7Ci0gICAgICBzUiA9IGZpeE1heCgwLChDbnRMZWFkaW5nWmVyb3Moc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc10pLTEpKTsKLSAgICAgIHMgID0gKGZpeE1pbihzTCxzUik+PjIpPDwyOwotICAgICAgbm9ybVNmYkxvdWRuZXNzW3NmYiArIHNmYm9mZnNdID0gc3FydEZpeHAoc3FydEZpeHAoKChzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdPDxzKSA+PiAxKSArICgoc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc108PHMpID4+IDEpKSkgPj4gKHM+PjIpOworICAgICAgc0wgPSBmaXhNYXgoMCwgKENudExlYWRpbmdaZXJvcyhzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdKSAtIDEpKTsKKyAgICAgIHNSID0gZml4TWF4KDAsIChDbnRMZWFkaW5nWmVyb3Moc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc10pIC0gMSkpOworICAgICAgcyA9IChmaXhNaW4oc0wsIHNSKSA+PiAyKSA8PCAyOworICAgICAgbm9ybVNmYkxvdWRuZXNzW3NmYiArIHNmYm9mZnNdID0KKyAgICAgICAgICBzcXJ0Rml4cChzcXJ0Rml4cCgoKHNmYkVuZXJneUxlZnRbc2ZiICsgc2Zib2Zmc10gPDwgcykgPj4gMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc10gPDwgcykgPj4gMSkpKSA+PgorICAgICAgICAgIChzID4+IDIpOwogCi0gICAgICBvdmVyYWxsTG91ZG5lc3NbZ3JwQ291bnRlcl0gKz0gbm9ybVNmYkxvdWRuZXNzW3NmYiArIHNmYm9mZnNdID4+IE9WRVJBTExfTE9VRE5FU1NfU0Y7CisgICAgICBvdmVyYWxsTG91ZG5lc3NbZ3JwQ291bnRlcl0gKz0KKyAgICAgICAgICBub3JtU2ZiTG91ZG5lc3Nbc2ZiICsgc2Zib2Zmc10gPj4gT1ZFUkFMTF9MT1VETkVTU19TRjsKICAgICAgIC8qIGRvbid0IGRvIGludGVuc2l0eSBpZgogICAgICAgICogLSBwYW5uaW5nIGFuZ2xlIGlzIHRvbyBjbG9zZSB0byB0aGUgbWlkZGxlIG9yCiAgICAgICAgKiAtIG9uZSBjaGFubmVsIGlzIG5vbi1leGlzdGVudCBvcgogICAgICAgICogLSBpZiBpdCBpcyBkdWFsIG1vbm8gKi8KLSAgICAgIGlmKCAgIChzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdID49IGZNdWx0KGlzUGFyYW1zLT5sZWZ0X3JpZ2h0X3JhdGlvX3RocmVzaG9sZCxzZmJFbmVyZ3lSaWdodFtzZmIgKyBzZmJvZmZzXSkpCi0gICAgICAgICAmJiAoZk11bHQoaXNQYXJhbXMtPmxlZnRfcmlnaHRfcmF0aW9fdGhyZXNob2xkLHNmYkVuZXJneUxlZnRbc2ZiICsgc2Zib2Zmc10pIDw9IHNmYkVuZXJneVJpZ2h0W3NmYiArIHNmYm9mZnNdKSApIHsKLQotICAgICAgICAvKiB0aGlzIHdpbGwgcHJldmVudCBwb3N0IHByb2Nlc3NpbmcgZnJvbSBjb25zaWRlcmluZyB0aGlzIFNGQiBmb3IgbWVyZ2luZyAqLwotICAgICAgICBocnJFcnJbc2ZiICsgc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgxLjAvOC4wKTsKKyAgICAgIGlmICgoc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXSA+PQorICAgICAgICAgICBmTXVsdChpc1BhcmFtcy0+bGVmdF9yaWdodF9yYXRpb190aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgIHNmYkVuZXJneVJpZ2h0W3NmYiArIHNmYm9mZnNdKSkgJiYKKyAgICAgICAgICAoZk11bHQoaXNQYXJhbXMtPmxlZnRfcmlnaHRfcmF0aW9fdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdKSA8PQorICAgICAgICAgICBzZmJFbmVyZ3lSaWdodFtzZmIgKyBzZmJvZmZzXSkpIHsKKyAgICAgICAgLyogdGhpcyB3aWxsIHByZXZlbnQgcG9zdCBwcm9jZXNzaW5nIGZyb20gY29uc2lkZXJpbmcgdGhpcyBTRkIgZm9yCisgICAgICAgICAqIG1lcmdpbmcgKi8KKyAgICAgICAgaHJyRXJyW3NmYiArIHNmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMS4wIC8gOC4wKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBmb3IgKGdycENvdW50ZXIgPSAwLCBzZmJvZmZzID0gMDsgc2Zib2ZmcyA8IHNmYkNudDsgc2Zib2ZmcyArPSBzZmJQZXJHcm91cCwgZ3JwQ291bnRlcisrKSB7CisgIGZvciAoZ3JwQ291bnRlciA9IDAsIHNmYm9mZnMgPSAwOyBzZmJvZmZzIDwgc2ZiQ250OworICAgICAgIHNmYm9mZnMgKz0gc2ZiUGVyR3JvdXAsIGdycENvdW50ZXIrKykgewogICAgIElOVCBpbnZPdmVyYWxsTG91ZG5lc3NTRjsKICAgICBGSVhQX0RCTCBpbnZPdmVyYWxsTG91ZG5lc3M7CiAKICAgICBpZiAob3ZlcmFsbExvdWRuZXNzW2dycENvdW50ZXJdID09IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKICAgICAgIGludk92ZXJhbGxMb3VkbmVzcyA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CiAgICAgICBpbnZPdmVyYWxsTG91ZG5lc3NTRiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGludk92ZXJhbGxMb3VkbmVzcyA9CisgICAgICAgICAgZkRpdk5vcm0oKEZJWFBfREJMKU1BWFZBTF9EQkwsIG92ZXJhbGxMb3VkbmVzc1tncnBDb3VudGVyXSwKKyAgICAgICAgICAgICAgICAgICAmaW52T3ZlcmFsbExvdWRuZXNzU0YpOworICAgICAgaW52T3ZlcmFsbExvdWRuZXNzU0YgPQorICAgICAgICAgIGludk92ZXJhbGxMb3VkbmVzc1NGIC0gT1ZFUkFMTF9MT1VETkVTU19TRiArCisgICAgICAgICAgMTsgLyogKzE6IGNvbXBlbnNhdGUgZk11bHREaXYyKCkgaW4gc3Vic2VxdWVudCBsb29wICovCiAgICAgfQotICAgIGVsc2UgewotICAgICAgaW52T3ZlcmFsbExvdWRuZXNzID0gZkRpdk5vcm0oKEZJWFBfREJMKU1BWFZBTF9EQkwsIG92ZXJhbGxMb3VkbmVzc1tncnBDb3VudGVyXSwmaW52T3ZlcmFsbExvdWRuZXNzU0YpOwotICAgICAgaW52T3ZlcmFsbExvdWRuZXNzU0YgPSBpbnZPdmVyYWxsTG91ZG5lc3NTRiAtIE9WRVJBTExfTE9VRE5FU1NfU0YgKyAxOyAvKiArMTogY29tcGVuc2F0ZSBmTXVsdERpdjIoKSBpbiBzdWJzZXF1ZW50IGxvb3AgKi8KLSAgICB9Ci0gICAgaW52T3ZlcmFsbExvdWRuZXNzU0YgPSBmaXhNaW4oZml4TWF4KGludk92ZXJhbGxMb3VkbmVzc1NGLC0oREZSQUNUX0JJVFMtMSkpLERGUkFDVF9CSVRTLTEpOworICAgIGludk92ZXJhbGxMb3VkbmVzc1NGID0gZml4TWluKAorICAgICAgICBmaXhNYXgoaW52T3ZlcmFsbExvdWRuZXNzU0YsIC0oREZSQUNUX0JJVFMgLSAxKSksIERGUkFDVF9CSVRTIC0gMSk7CiAKICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgRklYUF9EQkwgdG1wOwogCi0gICAgICB0bXAgPSBmTXVsdERpdjIoKG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXT4+T1ZFUkFMTF9MT1VETkVTU19TRik8PE9WRVJBTExfTE9VRE5FU1NfU0YsaW52T3ZlcmFsbExvdWRuZXNzKTsKKyAgICAgIHRtcCA9IGZNdWx0RGl2Migobm9ybVNmYkxvdWRuZXNzW3NmYiArIHNmYm9mZnNdID4+IE9WRVJBTExfTE9VRE5FU1NfU0YpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE9WRVJBTExfTE9VRE5FU1NfU0YsCisgICAgICAgICAgICAgICAgICAgICAgaW52T3ZlcmFsbExvdWRuZXNzKTsKIAogICAgICAgbm9ybVNmYkxvdWRuZXNzW3NmYiArIHNmYm9mZnNdID0gc2NhbGVWYWx1ZSh0bXAsIGludk92ZXJhbGxMb3VkbmVzc1NGKTsKIAogICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAogICAgICAgLyogbWF4IHdpZHRoIG9mIHNjYWxlZmFjdG9yYmFuZCBpcyA5Njsgd2lkdGgncyBhcmUgYWx3YXlzIGV2ZW4gKi8KLSAgICAgIC8qIGludl9uIGlzIHNjYWxlZCB3aXRoIGZhY3RvciAyIHRvIGNvbXBlbnNhdGUgZk11bHREaXYyKCkgaW4gc3Vic2VxdWVudCBsb29wcyAqLwotICAgICAgaW52X24gPSBHZXRJbnZJbnQoKHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV0gLSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc10pPj4xKTsKKyAgICAgIC8qIGludl9uIGlzIHNjYWxlZCB3aXRoIGZhY3RvciAyIHRvIGNvbXBlbnNhdGUgZk11bHREaXYyKCkgaW4gc3Vic2VxdWVudAorICAgICAgICogbG9vcHMgKi8KKyAgICAgIGludl9uID0gR2V0SW52SW50KAorICAgICAgICAgIChzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdIC0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdKSA+PiAxKTsKIAogICAgICAgaWYgKGludl9uID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKLSAgICAgICAgSU5UIHMsc0wsc1I7CisgICAgICAgIElOVCBzLCBzTCwgc1I7CiAKICAgICAgICAgLyogY29ycmVsYXRpb24gOj0gUGVhcnNvbidzIHByb2R1Y3QtbW9tZW50IGNvZWZmaWNpZW50ICovCi0gICAgICAgIC8qIGNvbXB1dGUgY29ycmVsYXRpb24gYmV0d2VlbiBjaGFubmVscyBhbmQgY2hlY2sgaWYgaXQgaXMgb3ZlciB0aHJlc2hvbGQgKi8KLSAgICAgICAgbWwgICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgICAgbXIgICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgICAgcHJvZF9sciAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgLyogY29tcHV0ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGNoYW5uZWxzIGFuZCBjaGVjayBpZiBpdCBpcyBvdmVyCisgICAgICAgICAqIHRocmVzaG9sZCAqLworICAgICAgICBtbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICBtciA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICBwcm9kX2xyID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgIHNxdWFyZV9sID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgIHNxdWFyZV9yID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgICAgICAgc0wgPSBjYWxjU2ZiTWF4U2NhbGUobWRjdFNwZWN0cnVtTGVmdCxzZmJPZmZzZXRbc2ZiK3NmYm9mZnNdLHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXSk7Ci0gICAgICAgIHNSID0gY2FsY1NmYk1heFNjYWxlKG1kY3RTcGVjdHJ1bVJpZ2h0LHNmYk9mZnNldFtzZmIrc2Zib2Zmc10sc2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdKTsKLSAgICAgICAgcyA9IGZpeE1pbihzTCxzUik7CisgICAgICAgIHNMID0gY2FsY1NmYk1heFNjYWxlKG1kY3RTcGVjdHJ1bUxlZnQsIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXSk7CisgICAgICAgIHNSID0gY2FsY1NmYk1heFNjYWxlKG1kY3RTcGVjdHJ1bVJpZ2h0LCBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV0pOworICAgICAgICBzID0gZml4TWluKHNMLCBzUik7CiAKLSAgICAgICAgZm9yIChqID0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdOyBqIDwgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgbWwgKz0gZk11bHREaXYyKChtZGN0U3BlY3RydW1MZWZ0W2pdICA8PCBzKSxpbnZfbik7ICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgotICAgICAgICAgIG1yICs9IGZNdWx0RGl2MigobWRjdFNwZWN0cnVtUmlnaHRbal0gPDwgcyksaW52X24pOyAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KKyAgICAgICAgZm9yIChqID0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdOyBqIDwgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXTsKKyAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICBtbCArPSBmTXVsdERpdjIoKG1kY3RTcGVjdHJ1bUxlZnRbal0gPDwgcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludl9uKTsgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgorICAgICAgICAgIG1yICs9IGZNdWx0RGl2MigobWRjdFNwZWN0cnVtUmlnaHRbal0gPDwgcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludl9uKTsgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgogICAgICAgICB9Ci0gICAgICAgIG1sID0gZk11bHREaXYyKG1sLGludl9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgotICAgICAgICBtciA9IGZNdWx0RGl2MihtcixpbnZfbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KKyAgICAgICAgbWwgPSBmTXVsdERpdjIobWwsIGludl9uKTsgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgorICAgICAgICBtciA9IGZNdWx0RGl2MihtciwgaW52X24pOyAgLy8gc2NhbGVkIHdpdGggbWRjdFNjYWxlIC0gcyArIGludl9uCiAKLSAgICAgICAgZm9yIChqID0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdOyBqIDwgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgdG1wX2wgPSBmTXVsdERpdjIoKG1kY3RTcGVjdHJ1bUxlZnRbal0gIDw8IHMpLGludl9uKSAtIG1sOyAgICAgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgotICAgICAgICAgIHRtcF9yID0gZk11bHREaXYyKChtZGN0U3BlY3RydW1SaWdodFtqXSA8PCBzKSxpbnZfbikgLSBtcjsgICAgICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KKyAgICAgICAgZm9yIChqID0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdOyBqIDwgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXTsKKyAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICB0bXBfbCA9IGZNdWx0RGl2MigobWRjdFNwZWN0cnVtTGVmdFtqXSA8PCBzKSwgaW52X24pIC0KKyAgICAgICAgICAgICAgICAgIG1sOyAgLy8gc2NhbGVkIHdpdGggbWRjdFNjYWxlIC0gcyArIGludl9uCisgICAgICAgICAgdG1wX3IgPSBmTXVsdERpdjIoKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdIDw8IHMpLCBpbnZfbikgLQorICAgICAgICAgICAgICAgICAgbXI7ICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KIAotICAgICAgICAgIHByb2RfbHIgICs9IGZNdWx0RGl2Mih0bXBfbCx0bXBfcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCAyKihtZGN0U2NhbGUgLSBzICsgaW52X24pICsgMQotICAgICAgICAgIHNxdWFyZV9sICs9IGZQb3cyRGl2Mih0bXBfbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCAyKihtZGN0U2NhbGUgLSBzICsgaW52X24pICsgMQotICAgICAgICAgIHNxdWFyZV9yICs9IGZQb3cyRGl2Mih0bXBfcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCAyKihtZGN0U2NhbGUgLSBzICsgaW52X24pICsgMQorICAgICAgICAgIHByb2RfbHIgKz0gZk11bHREaXYyKAorICAgICAgICAgICAgICB0bXBfbCwgdG1wX3IpOyAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKSArIDEKKyAgICAgICAgICBzcXVhcmVfbCArPQorICAgICAgICAgICAgICBmUG93MkRpdjIodG1wX2wpOyAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKSArIDEKKyAgICAgICAgICBzcXVhcmVfciArPQorICAgICAgICAgICAgICBmUG93MkRpdjIodG1wX3IpOyAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKSArIDEKICAgICAgICAgfQotICAgICAgICBwcm9kX2xyICA9IHByb2RfbHIgIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCAyKihtZGN0U2NhbGUgLSBzICsgaW52X24pCi0gICAgICAgIHNxdWFyZV9sID0gc3F1YXJlX2wgPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikKLSAgICAgICAgc3F1YXJlX3IgPSBzcXVhcmVfciA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKQorICAgICAgICBwcm9kX2xyID0gcHJvZF9sciA8PCAxOyAgICAvLyBzY2FsZWQgd2l0aCAyKihtZGN0U2NhbGUgLSBzICsgaW52X24pCisgICAgICAgIHNxdWFyZV9sID0gc3F1YXJlX2wgPDwgMTsgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikKKyAgICAgICAgc3F1YXJlX3IgPSBzcXVhcmVfciA8PCAxOyAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKQogCi0gICAgICAgIGlmIChzcXVhcmVfbCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpICYmIHNxdWFyZV9yID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgICAgaWYgKHNxdWFyZV9sID4gRkwyRlhDT05TVF9EQkwoMC4wZikgJiYKKyAgICAgICAgICAgIHNxdWFyZV9yID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgICAgICBJTlQgY2hhbm5lbENvcnJTRiA9IDA7CiAKLSAgICAgICAgICAvKiBsb2NhbCBzY2FsaW5nIG9mIHNxdWFyZV9sIGFuZCBzcXVhcmVfciBpcyBjb21wZW5zYXRlZCBhZnRlciBzcXJ0IGNhbGN1bGF0aW9uICovCi0gICAgICAgICAgc0wgID0gZml4TWF4KDAsKENudExlYWRpbmdaZXJvcyhzcXVhcmVfbCktMSkpOwotICAgICAgICAgIHNSICA9IGZpeE1heCgwLChDbnRMZWFkaW5nWmVyb3Moc3F1YXJlX3IpLTEpKTsKLSAgICAgICAgICBzICAgPSAoKHNMICsgc1IpPj4xKTw8MTsKLSAgICAgICAgICBzTCAgPSBmaXhNaW4oc0wscyk7Ci0gICAgICAgICAgc1IgID0gcy1zTDsKLSAgICAgICAgICB0bXAgPSBmTXVsdChzcXVhcmVfbDw8c0wsc3F1YXJlX3I8PHNSKTsKKyAgICAgICAgICAvKiBsb2NhbCBzY2FsaW5nIG9mIHNxdWFyZV9sIGFuZCBzcXVhcmVfciBpcyBjb21wZW5zYXRlZCBhZnRlciBzcXJ0CisgICAgICAgICAgICogY2FsY3VsYXRpb24gKi8KKyAgICAgICAgICBzTCA9IGZpeE1heCgwLCAoQ250TGVhZGluZ1plcm9zKHNxdWFyZV9sKSAtIDEpKTsKKyAgICAgICAgICBzUiA9IGZpeE1heCgwLCAoQ250TGVhZGluZ1plcm9zKHNxdWFyZV9yKSAtIDEpKTsKKyAgICAgICAgICBzID0gKChzTCArIHNSKSA+PiAxKSA8PCAxOworICAgICAgICAgIHNMID0gZml4TWluKHNMLCBzKTsKKyAgICAgICAgICBzUiA9IHMgLSBzTDsKKyAgICAgICAgICB0bXAgPSBmTXVsdChzcXVhcmVfbCA8PCBzTCwgc3F1YXJlX3IgPDwgc1IpOwogICAgICAgICAgIHRtcCA9IHNxcnRGaXhwKHRtcCk7CiAKICAgICAgICAgICBGREtfQVNTRVJUKHRtcCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKTsKIAogICAgICAgICAgIC8qIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgaGF2ZSB0aGUgc2FtZSBzY2FsaW5nICovCi0gICAgICAgICAgaWYgKHByb2RfbHIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKLSAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gLShmRGl2Tm9ybSgtcHJvZF9scix0bXAsJmNoYW5uZWxDb3JyU0YpKTsKKyAgICAgICAgICBpZiAocHJvZF9sciA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAgICAgLShmRGl2Tm9ybSgtcHJvZF9sciwgdG1wLCAmY2hhbm5lbENvcnJTRikpOwogCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0KKyAgICAgICAgICAgICAgICAoZkRpdk5vcm0ocHJvZF9sciwgdG1wLCAmY2hhbm5lbENvcnJTRikpOwogICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gIChmRGl2Tm9ybSggcHJvZF9scix0bXAsJmNoYW5uZWxDb3JyU0YpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2hhbm5lbENvcnJTRiA9IGZpeE1pbihmaXhNYXgoKCBjaGFubmVsQ29yclNGICsgKChzTCtzUik+PjEpKSwtKERGUkFDVF9CSVRTLTEpKSxERlJBQ1RfQklUUy0xKTsKKyAgICAgICAgICBjaGFubmVsQ29yclNGID0gZml4TWluKAorICAgICAgICAgICAgICBmaXhNYXgoKGNoYW5uZWxDb3JyU0YgKyAoKHNMICsgc1IpID4+IDEpKSwgLShERlJBQ1RfQklUUyAtIDEpKSwKKyAgICAgICAgICAgICAgREZSQUNUX0JJVFMgLSAxKTsKIAogICAgICAgICAgIGlmIChjaGFubmVsQ29yclNGIDwgMCkgewotICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPSBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA+PiAoLWNoYW5uZWxDb3JyU0YpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0KKyAgICAgICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA+PiAoLWNoYW5uZWxDb3JyU0YpOworICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBhdm9pZCBvdmVyZmxvd3MgZHVlIHRvIGxpbWl0ZWQgY29tcHV0YXRpb25hbCBhY2N1cmFjeSAqLwotICAgICAgICAgICAgaWYgKCBmQWJzKGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdKSA+ICgoKEZJWFBfREJMKU1BWFZBTF9EQkwpPj5jaGFubmVsQ29yclNGKSApIHsKKyAgICAgICAgICAgIGlmIChmQWJzKGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdKSA+CisgICAgICAgICAgICAgICAgKCgoRklYUF9EQkwpTUFYVkFMX0RCTCkgPj4gY2hhbm5lbENvcnJTRikpIHsKICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdIDwgRkwyRlhDT05TVF9EQkwoMC4wZikpCi0gICAgICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPSAtKEZJWFBfREJMKSBNQVhWQUxfREJMOworICAgICAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gLShGSVhQX0RCTClNQVhWQUxfREJMOwogICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPSAgKEZJWFBfREJMKSBNQVhWQUxfREJMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPDwgY2hhbm5lbENvcnJTRjsKKyAgICAgICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPSBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGNoYW5uZWxDb3JyU0Y7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIC8qIGZvciBwb3N0IHByb2Nlc3Npbmc6IGhyckVyciBpcyB0aGUgZXJyb3IgaW4gdGVybXMgb2YgKHRvbyBsaXR0bGUpIGNvcnJlbGF0aW9uCi0gICAgICAgKiB3ZWlnaHRlZCB3aXRoIHRoZSBsb3VkbmVzcyBvZiB0aGUgU0ZCOyBTRkJzIHdpdGggc21hbGwgaHJyRXJyIGNhbiBiZSBtZXJnZWQgKi8KLSAgICAgIGlmIChocnJFcnJbc2ZiICsgc2Zib2Zmc10gPT0gRkwyRlhDT05TVF9EQkwoMS4wLzguMCkpIHsKKyAgICAgIC8qIGZvciBwb3N0IHByb2Nlc3Npbmc6IGhyckVyciBpcyB0aGUgZXJyb3IgaW4gdGVybXMgb2YgKHRvbyBsaXR0bGUpCisgICAgICAgKiBjb3JyZWxhdGlvbiB3ZWlnaHRlZCB3aXRoIHRoZSBsb3VkbmVzcyBvZiB0aGUgU0ZCOyBTRkJzIHdpdGggc21hbGwKKyAgICAgICAqIGhyckVyciBjYW4gYmUgbWVyZ2VkICovCisgICAgICBpZiAoaHJyRXJyW3NmYiArIHNmYm9mZnNdID09IEZMMkZYQ09OU1RfREJMKDEuMCAvIDguMCkpIHsKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAKLSAgICAgIGhyckVycltzZmIgKyBzZmJvZmZzXSA9IGZNdWx0RGl2MigoRkwyRlhDT05TVF9EQkwoMC4yNWYpLShjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXT4+MikpLG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXSk7CisgICAgICBocnJFcnJbc2ZiICsgc2Zib2Zmc10gPQorICAgICAgICAgIGZNdWx0RGl2MigoRkwyRlhDT05TVF9EQkwoMC4yNWYpIC0gKGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID4+IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgbm9ybVNmYkxvdWRuZXNzW3NmYiArIHNmYm9mZnNdKTsKIAogICAgICAgLyogc2V0IElTIG1hc2svdmVjdG9yIHRvIDEsIGlmIGNvcnJlbGF0aW9uIGlzIGhpZ2ggZW5vdWdoICovCiAgICAgICBpZiAoZkFicyhjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSkgPj0gaXNQYXJhbXMtPmNvcnJfdGhyZXNoKSB7CkBAIC00MjEsNyArNDcxLDYgQEAKICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfZmluYWxpemVJbnRlbnNpdHlEZWNpc2lvbgpAQCAtNDM4LDE3ICs0ODcsMTEgQEAKICAgICByZXR1cm5zOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotRkRLYWFjRW5jX2ZpbmFsaXplSW50ZW5zaXR5RGVjaXNpb24oY29uc3QgRklYUF9EQkwgKmhyckVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICppc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqcmVhbElzU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqbm9ybVNmYkxvdWRuZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5URU5TSVRZX1BBUkFNRVRFUlMgKmlzUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBtYXhTZmJQZXJHcm91cCkKLXsKLSAgSU5UIHNmYixzZmJvZmZzLCBqOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX2ZpbmFsaXplSW50ZW5zaXR5RGVjaXNpb24oCisgICAgY29uc3QgRklYUF9EQkwgKmhyckVyciwgSU5UICppc01hc2ssIGNvbnN0IEZJWFBfREJMICpyZWFsSXNTY2FsZSwKKyAgICBjb25zdCBGSVhQX0RCTCAqbm9ybVNmYkxvdWRuZXNzLCBjb25zdCBJTlRFTlNJVFlfUEFSQU1FVEVSUyAqaXNQYXJhbXMsCisgICAgY29uc3QgSU5UIHNmYkNudCwgY29uc3QgSU5UIHNmYlBlckdyb3VwLCBjb25zdCBJTlQgbWF4U2ZiUGVyR3JvdXApIHsKKyAgSU5UIHNmYiwgc2Zib2ZmcywgajsKICAgRklYUF9EQkwgaXNTY2FsZUxhc3QgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgSU5UIGlzU3RhcnRWYWx1ZUZvdW5kID0gMDsKIApAQCAtNDY0LDI2ICs1MDcsMzAgQEAKICAgICAgICAgaWYgKGN1cnJlbnRJc1NmYkNvdW50ID09IDApIHsKICAgICAgICAgICBzdGFydElzU2ZiID0gc2Zib2ZmcyArIHNmYjsKICAgICAgICAgfQotICAgICAgICBpZiAoaXNTdGFydFZhbHVlRm91bmQ9PTApIHsKKyAgICAgICAgaWYgKGlzU3RhcnRWYWx1ZUZvdW5kID09IDApIHsKICAgICAgICAgICBpc1NjYWxlTGFzdCA9IHJlYWxJc1NjYWxlW3NmYm9mZnMgKyBzZmJdOwogICAgICAgICAgIGlzU3RhcnRWYWx1ZUZvdW5kID0gMTsKICAgICAgICAgfQogICAgICAgICBpbklzQmxvY2sgPSAxOwogICAgICAgICBjdXJyZW50SXNTZmJDb3VudCsrOwotICAgICAgICBvdmVyYWxsSHJyRXJyb3IgICs9IGhyckVycltzZmJvZmZzICsgc2ZiXSA+PiAoTUFYX1NGQl9QRVJfR1JPVVBfU0YtMyk7Ci0gICAgICAgIGlzUmVnaW9uTG91ZG5lc3MgKz0gbm9ybVNmYkxvdWRuZXNzW3NmYm9mZnMgKyBzZmJdID4+IE1BWF9TRkJfUEVSX0dST1VQX1NGOwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICAgIG92ZXJhbGxIcnJFcnJvciArPSBocnJFcnJbc2Zib2ZmcyArIHNmYl0gPj4gKE1BWF9TRkJfUEVSX0dST1VQX1NGIC0gMyk7CisgICAgICAgIGlzUmVnaW9uTG91ZG5lc3MgKz0KKyAgICAgICAgICAgIG5vcm1TZmJMb3VkbmVzc1tzZmJvZmZzICsgc2ZiXSA+PiBNQVhfU0ZCX1BFUl9HUk9VUF9TRjsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIGJhc2VkIG9uIGNvcnJlbGF0aW9uLCBJUyBzaG91bGQgbm90IGJlIHVzZWQKICAgICAgICAgICogLT4gdXNlIGl0IGFueXdheSwgaWYgb3ZlcmFsbCBlcnJvciBpcyBiZWxvdyB0aHJlc2hvbGQKICAgICAgICAgICogICAgYW5kIGlmIGxvY2FsIGVycm9yIGRvZXMgbm90IGV4Y2VlZCB0aHJlc2hvbGQKICAgICAgICAgICogb3RoZXJ3aXNlOiBjaGVjayBpZiB0aGVyZSBhcmUgZW5vdWdoIElTIFNGQnMKICAgICAgICAgICovCiAgICAgICAgIGlmIChpbklzQmxvY2spIHsKLSAgICAgICAgICBvdmVyYWxsSHJyRXJyb3IgICs9IGhyckVycltzZmJvZmZzICsgc2ZiXSA+PiAoTUFYX1NGQl9QRVJfR1JPVVBfU0YtMyk7Ci0gICAgICAgICAgaXNSZWdpb25Mb3VkbmVzcyArPSBub3JtU2ZiTG91ZG5lc3Nbc2Zib2ZmcyArIHNmYl0gPj4gTUFYX1NGQl9QRVJfR1JPVVBfU0Y7CisgICAgICAgICAgb3ZlcmFsbEhyckVycm9yICs9CisgICAgICAgICAgICAgIGhyckVycltzZmJvZmZzICsgc2ZiXSA+PiAoTUFYX1NGQl9QRVJfR1JPVVBfU0YgLSAzKTsKKyAgICAgICAgICBpc1JlZ2lvbkxvdWRuZXNzICs9CisgICAgICAgICAgICAgIG5vcm1TZmJMb3VkbmVzc1tzZmJvZmZzICsgc2ZiXSA+PiBNQVhfU0ZCX1BFUl9HUk9VUF9TRjsKIAotICAgICAgICAgIGlmICggKGhyckVycltzZmJvZmZzICsgc2ZiXSA8IChpc1BhcmFtcy0+bG9jYWxfZXJyb3JfdGhyZXNoPj4zKSkgJiYgKG92ZXJhbGxIcnJFcnJvciA8IChpc1BhcmFtcy0+dG90YWxfZXJyb3JfdGhyZXNoPj5NQVhfU0ZCX1BFUl9HUk9VUF9TRikpICkgeworICAgICAgICAgIGlmICgoaHJyRXJyW3NmYm9mZnMgKyBzZmJdIDwgKGlzUGFyYW1zLT5sb2NhbF9lcnJvcl90aHJlc2ggPj4gMykpICYmCisgICAgICAgICAgICAgIChvdmVyYWxsSHJyRXJyb3IgPAorICAgICAgICAgICAgICAgKGlzUGFyYW1zLT50b3RhbF9lcnJvcl90aHJlc2ggPj4gTUFYX1NGQl9QRVJfR1JPVVBfU0YpKSkgewogICAgICAgICAgICAgY3VycmVudElzU2ZiQ291bnQrKzsKICAgICAgICAgICAgIC8qIG92ZXJ3cml0ZSBjb3JyZWxhdGlvbiBiYXNlZCBkZWNpc2lvbiAqLwogICAgICAgICAgICAgaXNNYXNrW3NmYm9mZnMgKyBzZmJdID0gMTsKQEAgLTQ5NCwxMCArNTQxLDEyIEBACiAgICAgICB9CiAgICAgICAvKiBjaGVjayBmb3IgbGFyZ2UgZGlyZWN0aW9uIGRldmlhdGlvbiAqLwogICAgICAgaWYgKGluSXNCbG9jaykgewotICAgICAgICBpZiggZkFicyhpc1NjYWxlTGFzdC1yZWFsSXNTY2FsZVtzZmJvZmZzICsgc2ZiXSkgPCAoaXNQYXJhbXMtPmRpcmVjdGlvbl9kZXZpYXRpb25fdGhyZXNoPj4oUkVBTF9TQ0FMRV9TRitMRF9EQVRBX1NISUZULUlTX0RJUkVDVElPTl9ERVZJQVRJT05fVEhSRVNIX1NGKSkgKSB7CisgICAgICAgIGlmIChmQWJzKGlzU2NhbGVMYXN0IC0gcmVhbElzU2NhbGVbc2Zib2ZmcyArIHNmYl0pIDwKKyAgICAgICAgICAgIChpc1BhcmFtcy0+ZGlyZWN0aW9uX2RldmlhdGlvbl90aHJlc2ggPj4KKyAgICAgICAgICAgICAoUkVBTF9TQ0FMRV9TRiArIExEX0RBVEFfU0hJRlQgLQorICAgICAgICAgICAgICBJU19ESVJFQ1RJT05fREVWSUFUSU9OX1RIUkVTSF9TRikpKSB7CiAgICAgICAgICAgaXNTY2FsZUxhc3QgPSByZWFsSXNTY2FsZVtzZmJvZmZzICsgc2ZiXTsKLSAgICAgICAgfQotICAgICAgICBlbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGlzTWFza1tzZmJvZmZzICsgc2ZiXSA9IDA7CiAgICAgICAgICAgaW5Jc0Jsb2NrID0gMDsKICAgICAgICAgICBjdXJyZW50SXNTZmJDb3VudC0tOwpAQCAtNTA2LDE0ICs1NTUsMTYgQEAKIAogICAgICAgaWYgKGN1cnJlbnRJc1NmYkNvdW50ID4gMCAmJiAoIWluSXNCbG9jayB8fCBzZmIgPT0gbWF4U2ZiUGVyR3JvdXAgLSAxKSkgewogICAgICAgICAvKiBub3QgZW5vdWdoIFNGQnMgLT4gZG8gbm90IHVzZSBJUyAqLwotICAgICAgICBpZiAoY3VycmVudElzU2ZiQ291bnQgPCBpc1BhcmFtcy0+bWluX2lzX3NmYnMgfHwgKGlzUmVnaW9uTG91ZG5lc3MgPCBpc1BhcmFtcy0+aXNfcmVnaW9uX21pbl9sb3VkbmVzcz4+TUFYX1NGQl9QRVJfR1JPVVBfU0YpKSB7Ci0gICAgICAgICAgZm9yKGogPSBzdGFydElzU2ZiOyBqIDw9IHNmYm9mZnMgKyBzZmI7IGorKykgeworICAgICAgICBpZiAoY3VycmVudElzU2ZiQ291bnQgPCBpc1BhcmFtcy0+bWluX2lzX3NmYnMgfHwKKyAgICAgICAgICAgIChpc1JlZ2lvbkxvdWRuZXNzPGlzUGFyYW1zLT5pc19yZWdpb25fbWluX2xvdWRuZXNzPj4KKyAgICAgICAgICAgICBNQVhfU0ZCX1BFUl9HUk9VUF9TRikpIHsKKyAgICAgICAgICBmb3IgKGogPSBzdGFydElzU2ZiOyBqIDw9IHNmYm9mZnMgKyBzZmI7IGorKykgewogICAgICAgICAgICAgaXNNYXNrW2pdID0gMDsKICAgICAgICAgICB9CiAgICAgICAgICAgaXNTY2FsZUxhc3QgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICAgICBpc1N0YXJ0VmFsdWVGb3VuZCA9IDA7Ci0gICAgICAgICAgZm9yIChqPTA7IGogPCBzdGFydElzU2ZiOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChpc01hc2tbal0hPTApIHsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3RhcnRJc1NmYjsgaisrKSB7CisgICAgICAgICAgICBpZiAoaXNNYXNrW2pdICE9IDApIHsKICAgICAgICAgICAgICAgaXNTY2FsZUxhc3QgPSByZWFsSXNTY2FsZVtqXTsKICAgICAgICAgICAgICAgaXNTdGFydFZhbHVlRm91bmQgPSAxOwogICAgICAgICAgICAgfQpAQCAtNTI3LDcgKzU3OCw2IEBACiAgIH0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0ludGVuc2l0eVN0ZXJlb1Byb2Nlc3NpbmcKQEAgLTU1NSwzNiArNjA1LDIzIEBACiAgICAgICAgICAgICAgICAgICBzZmJTcHJlYWRFblJpZ2h0ICAgICAgIHplcm9lZCB3aGVyZSBpc0Jvb2shPTAKICAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0ICAgICAgICB6ZXJvZWQgd2hlcmUgaXNCb29rIT0wCiAgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lMZERhdGFSaWdodCAgICAgRkwyRlhDT05TVF9EQkwoLTEuMCkgd2hlcmUgaXNCb29rIT0wCi0gICAgICAgICAgICAgICAgICBzZmJUaHJlc2hvbGRMZERhdGFSaWdodCAgRkwyRlhDT05TVF9EQkwoLTAuNTE1NjI1Zikgd2hlcmUgaXNCb29rIT0wCisgICAgICAgICAgICAgICAgICBzZmJUaHJlc2hvbGRMZERhdGFSaWdodCAgRkwyRlhDT05TVF9EQkwoLTAuNTE1NjI1Zikgd2hlcmUKK2lzQm9vayE9MAogCiAgICAgcmV0dXJuczogICAgICBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBGREthYWNFbmNfSW50ZW5zaXR5U3RlcmVvUHJvY2Vzc2luZygKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiRW5lcmd5TGVmdCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiRW5lcmd5UmlnaHQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKm1kY3RTcGVjdHJ1bUxlZnQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKm1kY3RTcGVjdHJ1bVJpZ2h0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJUaHJlc2hvbGRMZWZ0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJUaHJlc2hvbGRSaWdodCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiVGhyZXNob2xkTGREYXRhUmlnaHQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlNwcmVhZEVuTGVmdCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiU3ByZWFkRW5SaWdodCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiRW5lcmd5TGREYXRhTGVmdCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiRW5lcmd5TGREYXRhUmlnaHQsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgKm1zRGlnZXN0LAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICptc01hc2ssCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHNmYkNudCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICpzZmJPZmZzZXQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGFsbG93SVMsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgKmlzQm9vaywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAqaXNTY2FsZSwKLSAgICAgICAgUE5TX0RBVEEgICAgICAgICAqUkVTVFJJQ1QgcG5zRGF0YVsyXQotICAgICAgICApCi17Ci0gIElOVCBzZmIsc2Zib2ZmcywgajsKKyAgICBGSVhQX0RCTCAqc2ZiRW5lcmd5TGVmdCwgRklYUF9EQkwgKnNmYkVuZXJneVJpZ2h0LAorICAgIEZJWFBfREJMICptZGN0U3BlY3RydW1MZWZ0LCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtUmlnaHQsCisgICAgRklYUF9EQkwgKnNmYlRocmVzaG9sZExlZnQsIEZJWFBfREJMICpzZmJUaHJlc2hvbGRSaWdodCwKKyAgICBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkTGREYXRhUmlnaHQsIEZJWFBfREJMICpzZmJTcHJlYWRFbkxlZnQsCisgICAgRklYUF9EQkwgKnNmYlNwcmVhZEVuUmlnaHQsIEZJWFBfREJMICpzZmJFbmVyZ3lMZERhdGFMZWZ0LAorICAgIEZJWFBfREJMICpzZmJFbmVyZ3lMZERhdGFSaWdodCwgSU5UICptc0RpZ2VzdCwgSU5UICptc01hc2ssCisgICAgY29uc3QgSU5UIHNmYkNudCwgY29uc3QgSU5UIHNmYlBlckdyb3VwLCBjb25zdCBJTlQgbWF4U2ZiUGVyR3JvdXAsCisgICAgY29uc3QgSU5UICpzZmJPZmZzZXQsIGNvbnN0IElOVCBhbGxvd0lTLCBJTlQgKmlzQm9vaywgSU5UICppc1NjYWxlLAorICAgIFBOU19EQVRBICpSRVNUUklDVCBwbnNEYXRhWzJdKSB7CisgIElOVCBzZmIsIHNmYm9mZnMsIGo7CiAgIEZJWFBfREJMIHNjYWxlOwogICBGSVhQX0RCTCBscjsKICAgRklYUF9EQkwgaHJyRXJyW01BWF9HUk9VUEVEX1NGQl07CkBAIC01OTMsMTQgKzYzMCwxMyBAQAogICBJTlRFTlNJVFlfUEFSQU1FVEVSUyBpc1BhcmFtczsKICAgSU5UIGlzTWFza1tNQVhfR1JPVVBFRF9TRkJdOwogCi0gIEZES21lbWNsZWFyKCh2b2lkKilpc0Jvb2ssc2ZiQ250KnNpemVvZihJTlQpKTsKLSAgRkRLbWVtY2xlYXIoKHZvaWQqKWlzTWFzayxzZmJDbnQqc2l6ZW9mKElOVCkpOwotICBGREttZW1jbGVhcigodm9pZCopcmVhbElzU2NhbGUsc2ZiQ250KnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1jbGVhcigodm9pZCopaXNTY2FsZSxzZmJDbnQqc2l6ZW9mKElOVCkpOwotICBGREttZW1jbGVhcigodm9pZCopaHJyRXJyLHNmYkNudCpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIoKHZvaWQgKilpc0Jvb2ssIHNmYkNudCAqIHNpemVvZihJTlQpKTsKKyAgRkRLbWVtY2xlYXIoKHZvaWQgKilpc01hc2ssIHNmYkNudCAqIHNpemVvZihJTlQpKTsKKyAgRkRLbWVtY2xlYXIoKHZvaWQgKilyZWFsSXNTY2FsZSwgc2ZiQ250ICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKCh2b2lkICopaXNTY2FsZSwgc2ZiQ250ICogc2l6ZW9mKElOVCkpOworICBGREttZW1jbGVhcigodm9pZCAqKWhyckVyciwgc2ZiQ250ICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgaWYgKCFhbGxvd0lTKQotICAgIHJldHVybjsKKyAgaWYgKCFhbGxvd0lTKSByZXR1cm47CiAKICAgRkRLYWFjRW5jX2luaXRJc1BhcmFtcygmaXNQYXJhbXMpOwogCkBAIC02MTEsMTUwICs2NDcsMTY0IEBACiAgICAqICAgKyBub3JtYWxpemF0aW9uOiBkaXZpc2lvbiBieSBzdW0gb2YgYWxsIFNGQiBsb3VkbmVzc2VzCiAgICAqIC0gaXNNYXNrIChpcyBzZXQgdG8gMCBpZiBjaGFubmVscyBhcmUgdGhlIHNhbWUgb3Igb25lIGlzIDApCiAgICAqLwotICAgRkRLYWFjRW5jX3ByZXBhcmVJbnRlbnNpdHlEZWNpc2lvbihzZmJFbmVyZ3lMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TGREYXRhTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TGREYXRhUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyckVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsSXNTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybVNmYkxvdWRuZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0KTsKKyAgRkRLYWFjRW5jX3ByZXBhcmVJbnRlbnNpdHlEZWNpc2lvbigKKyAgICAgIHNmYkVuZXJneUxlZnQsIHNmYkVuZXJneVJpZ2h0LCBzZmJFbmVyZ3lMZERhdGFMZWZ0LCBzZmJFbmVyZ3lMZERhdGFSaWdodCwKKyAgICAgIG1kY3RTcGVjdHJ1bUxlZnQsIG1kY3RTcGVjdHJ1bVJpZ2h0LCAmaXNQYXJhbXMsIGhyckVyciwgaXNNYXNrLAorICAgICAgcmVhbElzU2NhbGUsIG5vcm1TZmJMb3VkbmVzcywgc2ZiQ250LCBzZmJQZXJHcm91cCwgbWF4U2ZiUGVyR3JvdXAsCisgICAgICBzZmJPZmZzZXQpOwogCi0gIEZES2FhY0VuY19maW5hbGl6ZUludGVuc2l0eURlY2lzaW9uKGhyckVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsSXNTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybVNmYkxvdWRuZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwKTsKKyAgRkRLYWFjRW5jX2ZpbmFsaXplSW50ZW5zaXR5RGVjaXNpb24oaHJyRXJyLCBpc01hc2ssIHJlYWxJc1NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtU2ZiTG91ZG5lc3MsICZpc1BhcmFtcywgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJQZXJHcm91cCwgbWF4U2ZiUGVyR3JvdXApOwogCi0gIGZvciAoc2ZiPTA7IHNmYjxzZmJDbnQ7IHNmYis9c2ZiUGVyR3JvdXApIHsKLSAgICBmb3IgKHNmYm9mZnM9MDsgc2Zib2ZmczxtYXhTZmJQZXJHcm91cDsgc2Zib2ZmcysrKSB7CisgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIgKz0gc2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYm9mZnMgPSAwOyBzZmJvZmZzIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYm9mZnMrKykgewogICAgICAgSU5UIHNMLCBzUjsKICAgICAgIEZJWFBfREJMIGludl9uOwogCi0gICAgICBtc01hc2tbc2ZiK3NmYm9mZnNdID0gMDsKLSAgICAgIGlmIChpc01hc2tbc2ZiK3NmYm9mZnNdID09IDApIHsKKyAgICAgIG1zTWFza1tzZmIgKyBzZmJvZmZzXSA9IDA7CisgICAgICBpZiAoaXNNYXNrW3NmYiArIHNmYm9mZnNdID09IDApIHsKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAKLSAgICAgIGlmICggICAoc2ZiRW5lcmd5TGVmdFtzZmIrc2Zib2Zmc10gPCBzZmJUaHJlc2hvbGRMZWZ0W3NmYitzZmJvZmZzXSkKLSAgICAgICAgICAmJihmTXVsdChGTDJGWENPTlNUX0RCTCgxLjBmLzEuNWYpLHNmYkVuZXJneVJpZ2h0W3NmYitzZmJvZmZzXSkgPiBzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10pICkgeworICAgICAgaWYgKChzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdIDwgc2ZiVGhyZXNob2xkTGVmdFtzZmIgKyBzZmJvZmZzXSkgJiYKKyAgICAgICAgICAoZk11bHQoRkwyRlhDT05TVF9EQkwoMS4wZiAvIDEuNWYpLCBzZmJFbmVyZ3lSaWdodFtzZmIgKyBzZmJvZmZzXSkgPgorICAgICAgICAgICBzZmJUaHJlc2hvbGRSaWdodFtzZmIgKyBzZmJvZmZzXSkpIHsKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAgICAgICAvKiBORVc6IGlmIHRoZXJlIGlzIGEgYmlnLWVub3VnaCBJUyByZWdpb24sIHN3aXRjaCBvZmYgUE5TICovCiAgICAgICBpZiAocG5zRGF0YVswXSkgewotICAgICAgICBpZihwbnNEYXRhWzBdLT5wbnNGbGFnW3NmYitzZmJvZmZzXSkgewotICAgICAgICAgIHBuc0RhdGFbMF0tPnBuc0ZsYWdbc2ZiK3NmYm9mZnNdID0gMDsKKyAgICAgICAgaWYgKHBuc0RhdGFbMF0tPnBuc0ZsYWdbc2ZiICsgc2Zib2Zmc10pIHsKKyAgICAgICAgICBwbnNEYXRhWzBdLT5wbnNGbGFnW3NmYiArIHNmYm9mZnNdID0gMDsKICAgICAgICAgfQotICAgICAgICBpZihwbnNEYXRhWzFdLT5wbnNGbGFnW3NmYitzZmJvZmZzXSkgewotICAgICAgICAgIHBuc0RhdGFbMV0tPnBuc0ZsYWdbc2ZiK3NmYm9mZnNdID0gMDsKKyAgICAgICAgaWYgKHBuc0RhdGFbMV0tPnBuc0ZsYWdbc2ZiICsgc2Zib2Zmc10pIHsKKyAgICAgICAgICBwbnNEYXRhWzFdLT5wbnNGbGFnW3NmYiArIHNmYm9mZnNdID0gMDsKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICBpbnZfbiA9IEdldEludkludCgoc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXSAtIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXSk+PjEpOyAgLy8gc2NhbGVkIHdpdGggMiB0byBjb21wZW5zYXRlIGZNdWx0RGl2MigpIGluIHN1YnNlcXVlbnQgbG9vcAotICAgICAgc0wgPSBjYWxjU2ZiTWF4U2NhbGUobWRjdFNwZWN0cnVtTGVmdCxzZmJPZmZzZXRbc2ZiK3NmYm9mZnNdLHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXSk7Ci0gICAgICBzUiA9IGNhbGNTZmJNYXhTY2FsZShtZGN0U3BlY3RydW1SaWdodCxzZmJPZmZzZXRbc2ZiK3NmYm9mZnNdLHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXSk7CisgICAgICBpbnZfbiA9IEdldEludkludCgKKyAgICAgICAgICAoc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXSAtIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXSkgPj4KKyAgICAgICAgICAxKTsgIC8vIHNjYWxlZCB3aXRoIDIgdG8gY29tcGVuc2F0ZSBmTXVsdERpdjIoKSBpbiBzdWJzZXF1ZW50IGxvb3AKKyAgICAgIHNMID0gY2FsY1NmYk1heFNjYWxlKG1kY3RTcGVjdHJ1bUxlZnQsIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV0pOworICAgICAgc1IgPSBjYWxjU2ZiTWF4U2NhbGUobWRjdFNwZWN0cnVtUmlnaHQsIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV0pOwogCiAgICAgICBsciA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgZm9yIChqPXNmYk9mZnNldFtzZmIrc2Zib2Zmc107IGo8c2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdOyBqKyspCi0gICAgICAgIGxyICs9IGZNdWx0RGl2MihmTXVsdERpdjIobWRjdFNwZWN0cnVtTGVmdFtqXTw8c0wsbWRjdFNwZWN0cnVtUmlnaHRbal08PHNSKSxpbnZfbik7Ci0gICAgICBsciA9IGxyPDwxOworICAgICAgZm9yIChqID0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdOyBqIDwgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXTsgaisrKQorICAgICAgICBsciArPSBmTXVsdERpdjIoCisgICAgICAgICAgICBmTXVsdERpdjIobWRjdFNwZWN0cnVtTGVmdFtqXSA8PCBzTCwgbWRjdFNwZWN0cnVtUmlnaHRbal0gPDwgc1IpLAorICAgICAgICAgICAgaW52X24pOworICAgICAgbHIgPSBsciA8PCAxOwogCiAgICAgICBpZiAobHIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewogICAgICAgICAvKiBUaGlzIG1lYW5zIE9VVCBPRiBwaGFzZSBpbnRlbnNpdHkgc3RlcmVvLCBjZi4gc3RhbmRhcmQgKi8KICAgICAgICAgSU5UIHMwLCBzMSwgczI7CiAgICAgICAgIEZJWFBfREJMIHRtcCwgZCwgZWQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAotICAgICAgICBzMCA9IGZpeE1pbihzTCxzUik7Ci0gICAgICAgIGZvciAoaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7Ci0gICAgICAgICAgZCA9ICgobWRjdFNwZWN0cnVtTGVmdFtqXTw8czApPj4xKSAtICgobWRjdFNwZWN0cnVtUmlnaHRbal08PHMwKT4+MSk7Ci0gICAgICAgICAgZWQgKz0gZk11bHREaXYyKGQsZCk+PihNRENUX1NQRUNfU0YtMSk7CisgICAgICAgIHMwID0gZml4TWluKHNMLCBzUik7CisgICAgICAgIGZvciAoaiA9IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXTsgaiA8IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV07CisgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgZCA9ICgobWRjdFNwZWN0cnVtTGVmdFtqXSA8PCBzMCkgPj4gMSkgLQorICAgICAgICAgICAgICAoKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdIDw8IHMwKSA+PiAxKTsKKyAgICAgICAgICBlZCArPSBmTXVsdERpdjIoZCwgZCkgPj4gKE1EQ1RfU1BFQ19TRiAtIDEpOwogICAgICAgICB9Ci0gICAgICAgIG1zTWFza1tzZmIrc2Zib2Zmc10gPSAxOwotICAgICAgICB0bXAgPSBmRGl2Tm9ybShzZmJFbmVyZ3lMZWZ0W3NmYitzZmJvZmZzXSxlZCwmczEpOwotICAgICAgICBzMiA9IChzMSkgKyAoMipzMCkgLSAyIC0gTURDVF9TUEVDX1NGOworICAgICAgICBtc01hc2tbc2ZiICsgc2Zib2Zmc10gPSAxOworICAgICAgICB0bXAgPSBmRGl2Tm9ybShzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdLCBlZCwgJnMxKTsKKyAgICAgICAgczIgPSAoczEpICsgKDIgKiBzMCkgLSAyIC0gTURDVF9TUEVDX1NGOwogICAgICAgICBpZiAoczIgJiAxKSB7Ci0gICAgICAgICAgdG1wID0gdG1wPj4xOwotICAgICAgICAgIHMyID0gczIrMTsKLSAgICAgICAgfQotICAgICAgICBzMiA9IChzMj4+MSkgKyAxOyAgLy8gKzEgY29tcGVuc2F0ZSBmTXVsdERpdjIoKSBpbiBzdWJzZXF1ZW50IGxvb3AKLSAgICAgICAgczIgPSBmaXhNaW4oZml4TWF4KHMyLC0oREZSQUNUX0JJVFMtMSkpLChERlJBQ1RfQklUUy0xKSk7Ci0gICAgICAgIHNjYWxlID0gc3FydEZpeHAodG1wKTsKLSAgICAgICAgaWYgKHMyIDwgMCkgewotICAgICAgICAgIHMyID0gLXMyOwotICAgICAgICAgIGZvciAoaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7Ci0gICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0W2pdID0gKGZNdWx0RGl2MihtZGN0U3BlY3RydW1MZWZ0W2pdLHNjYWxlKSAtIGZNdWx0RGl2MihtZGN0U3BlY3RydW1SaWdodFtqXSxzY2FsZSkpID4+IHMyOwotICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgZm9yIChqPXNmYk9mZnNldFtzZmIrc2Zib2Zmc107IGo8c2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdOyBqKyspIHsKLSAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAoZk11bHREaXYyKG1kY3RTcGVjdHJ1bUxlZnRbal0sc2NhbGUpIC0gZk11bHREaXYyKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdLHNjYWxlKSkgPDwgczI7Ci0gICAgICAgICAgICBtZGN0U3BlY3RydW1SaWdodFtqXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIC8qIFRoaXMgbWVhbnMgSU4gcGhhc2UgaW50ZW5zaXR5IHN0ZXJlbywgY2YuIHN0YW5kYXJkICovCi0gICAgICAgIElOVCBzMCxzMSxzMjsKLSAgICAgICAgRklYUF9EQkwgdG1wLCBzLCBlcyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotCi0gICAgICAgIHMwID0gZml4TWluKHNMLHNSKTsKLSAgICAgICAgZm9yIChqPXNmYk9mZnNldFtzZmIrc2Zib2Zmc107IGo8c2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdOyBqKyspIHsKLSAgICAgICAgICBzICAgPSAoKG1kY3RTcGVjdHJ1bUxlZnRbal08PHMwKT4+MSkgKyAoKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdPDxzMCk+PjEpOwotICAgICAgICAgIGVzICs9IGZNdWx0RGl2MihzLHMpPj4oTURDVF9TUEVDX1NGLTEpOyAgICAgLy8gc2NhbGVkIDIqKG1kY3RTY2FsZSAtIHMwICsgMSkgKyBNRENUX1NQRUNfU0YKLSAgICAgICAgfQotICAgICAgICBtc01hc2tbc2ZiK3NmYm9mZnNdID0gMDsKLSAgICAgICAgdG1wID0gZkRpdk5vcm0oc2ZiRW5lcmd5TGVmdFtzZmIrc2Zib2Zmc10sZXMsJnMxKTsKLSAgICAgICAgczIgPSAoczEpICsgKDIqczApIC0gMiAtIE1EQ1RfU1BFQ19TRjsKLSAgICAgICAgaWYgKHMyICYgMSkgewotICAgICAgICAgIHRtcCA9IHRtcD4+MTsKKyAgICAgICAgICB0bXAgPSB0bXAgPj4gMTsKICAgICAgICAgICBzMiA9IHMyICsgMTsKICAgICAgICAgfQotICAgICAgICBzMiA9IChzMj4+MSkgKyAxOyAvLyArMSBjb21wZW5zYXRlIGZNdWx0RGl2MigpIGluIHN1YnNlcXVlbnQgbG9vcAotICAgICAgICBzMiA9IGZpeE1pbihmaXhNYXgoczIsLShERlJBQ1RfQklUUy0xKSksKERGUkFDVF9CSVRTLTEpKTsKKyAgICAgICAgczIgPSAoczIgPj4gMSkgKyAxOyAgLy8gKzEgY29tcGVuc2F0ZSBmTXVsdERpdjIoKSBpbiBzdWJzZXF1ZW50IGxvb3AKKyAgICAgICAgczIgPSBmaXhNaW4oZml4TWF4KHMyLCAtKERGUkFDVF9CSVRTIC0gMSkpLCAoREZSQUNUX0JJVFMgLSAxKSk7CiAgICAgICAgIHNjYWxlID0gc3FydEZpeHAodG1wKTsKICAgICAgICAgaWYgKHMyIDwgMCkgewogICAgICAgICAgIHMyID0gLXMyOwotICAgICAgICAgIGZvciAoaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7Ci0gICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0W2pdID0gKGZNdWx0RGl2MihtZGN0U3BlY3RydW1MZWZ0W2pdLHNjYWxlKSArIGZNdWx0RGl2MihtZGN0U3BlY3RydW1SaWdodFtqXSxzY2FsZSkpID4+IHMyOworICAgICAgICAgIGZvciAoaiA9IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXTsgaiA8IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV07CisgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAoZk11bHREaXYyKG1kY3RTcGVjdHJ1bUxlZnRbal0sIHNjYWxlKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihtZGN0U3BlY3RydW1SaWdodFtqXSwgc2NhbGUpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMyOworICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChqID0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdOyBqIDwgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXTsKKyAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9IChmTXVsdERpdjIobWRjdFNwZWN0cnVtTGVmdFtqXSwgc2NhbGUpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdLCBzY2FsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgczI7CiAgICAgICAgICAgICBtZGN0U3BlY3RydW1SaWdodFtqXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBmb3IgKGo9c2ZiT2Zmc2V0W3NmYitzZmJvZmZzXTsgajxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV07IGorKykgewotICAgICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9IChmTXVsdERpdjIobWRjdFNwZWN0cnVtTGVmdFtqXSxzY2FsZSkgKyBmTXVsdERpdjIobWRjdFNwZWN0cnVtUmlnaHRbal0sc2NhbGUpKSA8PCBzMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoaXMgbWVhbnMgSU4gcGhhc2UgaW50ZW5zaXR5IHN0ZXJlbywgY2YuIHN0YW5kYXJkICovCisgICAgICAgIElOVCBzMCwgczEsIHMyOworICAgICAgICBGSVhQX0RCTCB0bXAsIHMsIGVzID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICAgICAgczAgPSBmaXhNaW4oc0wsIHNSKTsKKyAgICAgICAgZm9yIChqID0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdOyBqIDwgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXTsKKyAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICBzID0gKChtZGN0U3BlY3RydW1MZWZ0W2pdIDw8IHMwKSA+PiAxKSArCisgICAgICAgICAgICAgICgobWRjdFNwZWN0cnVtUmlnaHRbal0gPDwgczApID4+IDEpOworICAgICAgICAgIGVzICs9IGZNdWx0RGl2MihzLCBzKSA+PgorICAgICAgICAgICAgICAgIChNRENUX1NQRUNfU0YgLQorICAgICAgICAgICAgICAgICAxKTsgIC8vIHNjYWxlZCAyKihtZGN0U2NhbGUgLSBzMCArIDEpICsgTURDVF9TUEVDX1NGCisgICAgICAgIH0KKyAgICAgICAgbXNNYXNrW3NmYiArIHNmYm9mZnNdID0gMDsKKyAgICAgICAgdG1wID0gZkRpdk5vcm0oc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXSwgZXMsICZzMSk7CisgICAgICAgIHMyID0gKHMxKSArICgyICogczApIC0gMiAtIE1EQ1RfU1BFQ19TRjsKKyAgICAgICAgaWYgKHMyICYgMSkgeworICAgICAgICAgIHRtcCA9IHRtcCA+PiAxOworICAgICAgICAgIHMyID0gczIgKyAxOworICAgICAgICB9CisgICAgICAgIHMyID0gKHMyID4+IDEpICsgMTsgIC8vICsxIGNvbXBlbnNhdGUgZk11bHREaXYyKCkgaW4gc3Vic2VxdWVudCBsb29wCisgICAgICAgIHMyID0gZml4TWluKGZpeE1heChzMiwgLShERlJBQ1RfQklUUyAtIDEpKSwgKERGUkFDVF9CSVRTIC0gMSkpOworICAgICAgICBzY2FsZSA9IHNxcnRGaXhwKHRtcCk7CisgICAgICAgIGlmIChzMiA8IDApIHsKKyAgICAgICAgICBzMiA9IC1zMjsKKyAgICAgICAgICBmb3IgKGogPSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc107IGogPCBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0W2pdID0gKGZNdWx0RGl2MihtZGN0U3BlY3RydW1MZWZ0W2pdLCBzY2FsZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIobWRjdFNwZWN0cnVtUmlnaHRbal0sIHNjYWxlKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMjsKKyAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaiA9IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXTsgaiA8IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV07CisgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAoZk11bHREaXYyKG1kY3RTcGVjdHJ1bUxlZnRbal0sIHNjYWxlKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihtZGN0U3BlY3RydW1SaWdodFtqXSwgc2NhbGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMyOwogICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgaXNCb29rW3NmYitzZmJvZmZzXSA9IENPREVfQk9PS19JU19JTl9QSEFTRV9OTzsKKyAgICAgIGlzQm9va1tzZmIgKyBzZmJvZmZzXSA9IENPREVfQk9PS19JU19JTl9QSEFTRV9OTzsKIAotICAgICAgaWYgKCByZWFsSXNTY2FsZVtzZmIrc2Zib2Zmc10gPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKLSAgICAgICAgaXNTY2FsZVtzZmIrc2Zib2Zmc10gPSAoSU5UKSgoKHJlYWxJc1NjYWxlW3NmYitzZmJvZmZzXT4+MSktRkwyRlhDT05TVF9EQkwoMC41Zi8oMTw8KFJFQUxfU0NBTEVfU0YrTERfREFUQV9TSElGVCsxKSkpKT4+KERGUkFDVF9CSVRTLTEtUkVBTF9TQ0FMRV9TRi1MRF9EQVRBX1NISUZULTEpKSArIDE7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaXNTY2FsZVtzZmIrc2Zib2Zmc10gPSAoSU5UKSgoKHJlYWxJc1NjYWxlW3NmYitzZmJvZmZzXT4+MSkrRkwyRlhDT05TVF9EQkwoMC41Zi8oMTw8KFJFQUxfU0NBTEVfU0YrTERfREFUQV9TSElGVCsxKSkpKT4+KERGUkFDVF9CSVRTLTEtUkVBTF9TQ0FMRV9TRi1MRF9EQVRBX1NISUZULTEpKTsKKyAgICAgIGlmIChyZWFsSXNTY2FsZVtzZmIgKyBzZmJvZmZzXSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgIGlzU2NhbGVbc2ZiICsgc2Zib2Zmc10gPQorICAgICAgICAgICAgKElOVCkoKChyZWFsSXNTY2FsZVtzZmIgKyBzZmJvZmZzXSA+PiAxKSAtCisgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoCisgICAgICAgICAgICAgICAgICAgICAgIDAuNWYgLyAoMSA8PCAoUkVBTF9TQ0FMRV9TRiArIExEX0RBVEFfU0hJRlQgKyAxKSkpKSA+PgorICAgICAgICAgICAgICAgICAgKERGUkFDVF9CSVRTIC0gMSAtIFJFQUxfU0NBTEVfU0YgLSBMRF9EQVRBX1NISUZUIC0gMSkpICsKKyAgICAgICAgICAgIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBpc1NjYWxlW3NmYiArIHNmYm9mZnNdID0KKyAgICAgICAgICAgIChJTlQpKCgocmVhbElzU2NhbGVbc2ZiICsgc2Zib2Zmc10gPj4gMSkgKworICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKAorICAgICAgICAgICAgICAgICAgICAgICAwLjVmIC8gKDEgPDwgKFJFQUxfU0NBTEVfU0YgKyBMRF9EQVRBX1NISUZUICsgMSkpKSkgPj4KKyAgICAgICAgICAgICAgICAgIChERlJBQ1RfQklUUyAtIDEgLSBSRUFMX1NDQUxFX1NGIC0gTERfREFUQV9TSElGVCAtIDEpKTsKICAgICAgIH0KIAotICAgICAgc2ZiRW5lcmd5UmlnaHRbc2ZiK3NmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICBzZmJFbmVyZ3lMZERhdGFSaWdodFtzZmIrc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7Ci0gICAgICBzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgIHNmYlRocmVzaG9sZExkRGF0YVJpZ2h0W3NmYitzZmJvZmZzXSA9IEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpOwotICAgICAgc2ZiU3ByZWFkRW5SaWdodFtzZmIrc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIHNmYkVuZXJneVJpZ2h0W3NmYiArIHNmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBzZmJFbmVyZ3lMZERhdGFSaWdodFtzZmIgKyBzZmJvZmZzXSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgICAgIHNmYlRocmVzaG9sZFJpZ2h0W3NmYiArIHNmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBzZmJUaHJlc2hvbGRMZERhdGFSaWdodFtzZmIgKyBzZmJvZmZzXSA9IEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpOworICAgICAgc2ZiU3ByZWFkRW5SaWdodFtzZmIgKyBzZmJvZmZzXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCiAgICAgICAqbXNEaWdlc3QgPSBNU19TT01FOwogICAgIH0KICAgfQogfQotCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2ludGVuc2l0eS5oIGIvbGliQUFDZW5jL3NyYy9pbnRlbnNpdHkuaAppbmRleCAyYWNjMjkyLi43MGYyM2Q1IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2ludGVuc2l0eS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvaW50ZW5zaXR5LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDQgKzkwLDMyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIEEuIEhvcm5kYXNjaCAoY29kZSBvcmlnaW5hbGx5IGZyb20gbHdyIGFuZCBydGIpIC8gSm9zZWYgSPZwZmwgKEZESykKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBpbnRlbnNpdHkgc3RlcmVvIHByb3RvdHlwZQorICAgQXV0aG9yKHMpOiAgIEEuIEhvcm5kYXNjaCAoY29kZSBvcmlnaW5hbGx5IGZyb20gbHdyIGFuZCBydGIpIC8gSm9zZWYgSG9lcGZsCisoRkRLKQogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogaW50ZW5zaXR5IHN0ZXJlbyBwcm90b3R5cGUKIAotI2lmbmRlZiBfSU5URU5TSVRZX0gKLSNkZWZpbmUgX0lOVEVOU0lUWV9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElOVEVOU0lUWV9ICisjZGVmaW5lIElOVEVOU0lUWV9ICiAKICNpbmNsdWRlICJhYWNlbmNfcG5zLmgiCi0KKyNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKIHZvaWQgRkRLYWFjRW5jX0ludGVuc2l0eVN0ZXJlb1Byb2Nlc3NpbmcoCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneUxlZnQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneVJpZ2h0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICptZGN0U3BlY3RydW1MZWZ0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICptZGN0U3BlY3RydW1SaWdodCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiVGhyZXNob2xkTGVmdCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiVGhyZXNob2xkUmlnaHQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlRocmVzaG9sZExkRGF0YVJpZ2h0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJTcHJlYWRFbkxlZnQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlNwcmVhZEVuUmlnaHQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneUxkRGF0YUxlZnQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneUxkRGF0YVJpZ2h0LAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICptc0RpZ2VzdCwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAqbXNNYXNrLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHNmYlBlckdyb3VwLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAqc2ZiT2Zmc2V0LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBhbGxvd0lTLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICppc0Jvb2ssCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgKmlzU2NhbGUsCi0gICAgICAgIFBOU19EQVRBICAgICAgICAgKlJFU1RSSUNUIHBuc0RhdGFbMl0KLSAgICAgICAgKTsKKyAgICBGSVhQX0RCTCAqc2ZiRW5lcmd5TGVmdCwgRklYUF9EQkwgKnNmYkVuZXJneVJpZ2h0LAorICAgIEZJWFBfREJMICptZGN0U3BlY3RydW1MZWZ0LCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtUmlnaHQsCisgICAgRklYUF9EQkwgKnNmYlRocmVzaG9sZExlZnQsIEZJWFBfREJMICpzZmJUaHJlc2hvbGRSaWdodCwKKyAgICBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkTGREYXRhUmlnaHQsIEZJWFBfREJMICpzZmJTcHJlYWRFbkxlZnQsCisgICAgRklYUF9EQkwgKnNmYlNwcmVhZEVuUmlnaHQsIEZJWFBfREJMICpzZmJFbmVyZ3lMZERhdGFMZWZ0LAorICAgIEZJWFBfREJMICpzZmJFbmVyZ3lMZERhdGFSaWdodCwgSU5UICptc0RpZ2VzdCwgSU5UICptc01hc2ssCisgICAgY29uc3QgSU5UIHNmYkNudCwgY29uc3QgSU5UIHNmYlBlckdyb3VwLCBjb25zdCBJTlQgbWF4U2ZiUGVyR3JvdXAsCisgICAgY29uc3QgSU5UICpzZmJPZmZzZXQsIGNvbnN0IElOVCBhbGxvd0lTLCBJTlQgKmlzQm9vaywgSU5UICppc1NjYWxlLAorICAgIFBOU19EQVRBICpSRVNUUklDVCBwbnNEYXRhWzJdKTsKIAotI2VuZGlmIC8qIF9JTlRFTlNJVFlfSCAqLwotCisjZW5kaWYgLyogSU5URU5TSVRZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvaW50ZXJmYWNlLmggYi9saWJBQUNlbmMvc3JjL2ludGVyZmFjZS5oCmluZGV4IDUxZmI3MmEuLmIxYTMxZWYgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvaW50ZXJmYWNlLmgKKysrIGIvbGliQUFDZW5jL3NyYy9pbnRlcmZhY2UuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNyArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBJbnRlcmZhY2UgcHN5Y2hvYWNjb3VzdGljL3F1YW50aXplcgorICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBJbnRlcmZhY2UgcHN5Y2hvYWNjb3VzdGljL3F1YW50aXplcgogCi0jaWZuZGVmIF9JTlRFUkZBQ0VfSAotI2RlZmluZSBfSU5URVJGQUNFX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSU5URVJGQUNFX0gKKyNkZWZpbmUgSU5URVJGQUNFX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKICNpbmNsdWRlICJGREtfYXVkaW8uaCIKQEAgLTk3LDczICsxMDksNjAgQEAKICNpbmNsdWRlICJwc3lfZGF0YS5oIgogI2luY2x1ZGUgImFhY2VuY190bnMuaCIKIAotZW51bQotewotICBNU19OT05FID0gMCwKLSAgTVNfU09NRSA9IDEsCi0gIE1TX0FMTCAgPSAyCi19OworZW51bSB7IE1TX05PTkUgPSAwLCBNU19TT01FID0gMSwgTVNfQUxMID0gMiB9OwogCi1lbnVtCi17Ci0gIE1TX09OID0gMQotfTsKK2VudW0geyBNU19PTiA9IDEgfTsKIAogc3RydWN0IFRPT0xTSU5GTyB7Ci0gIElOVCBtc0RpZ2VzdDsgICAgIC8qIDAgPSBubyBNUzsgMSA9IHNvbWUgTVMsIDIgPSBhbGwgTVMgKi8KKyAgSU5UIG1zRGlnZXN0OyAvKiAwID0gbm8gTVM7IDEgPSBzb21lIE1TLCAyID0gYWxsIE1TICovCiAgIElOVCBtc01hc2tbTUFYX0dST1VQRURfU0ZCXTsKIH07CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIHNmYkNudDsKKyAgSU5UIHNmYlBlckdyb3VwOworICBJTlQgbWF4U2ZiUGVyR3JvdXA7CisgIElOVCBsYXN0V2luZG93U2VxdWVuY2U7CisgIElOVCB3aW5kb3dTaGFwZTsKKyAgSU5UIGdyb3VwaW5nTWFzazsKKyAgSU5UIHNmYk9mZnNldHNbTUFYX0dST1VQRURfU0ZCICsgMV07CiAKLXR5cGVkZWYgc3RydWN0ICB7Ci0gIElOVCAgICAgICBzZmJDbnQ7Ci0gIElOVCAgICAgICBzZmJQZXJHcm91cDsKLSAgSU5UICAgICAgIG1heFNmYlBlckdyb3VwOwotICBJTlQgICAgICAgbGFzdFdpbmRvd1NlcXVlbmNlOwotICBJTlQgICAgICAgd2luZG93U2hhcGU7Ci0gIElOVCAgICAgICBncm91cGluZ01hc2s7Ci0gIElOVCAgICAgICBzZmJPZmZzZXRzW01BWF9HUk9VUEVEX1NGQisxXTsKKyAgSU5UIG1kY3RTY2FsZTsgLyogbnVtYmVyIG9mIHRyYW5zZm9ybSBzaGlmdHMgKi8KKyAgSU5UIGdyb3VwTGVuW01BWF9OT19PRl9HUk9VUFNdOwogCi0gIElOVCAgICAgICBtZGN0U2NhbGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB0cmFuc2Zvcm0gc2hpZnRzICovCi0gIElOVCAgICAgICBncm91cExlbltNQVhfTk9fT0ZfR1JPVVBTXTsKLQotICBUTlNfSU5GTyAgdG5zSW5mbzsKLSAgSU5UICAgICAgIG5vaXNlTnJnW01BWF9HUk9VUEVEX1NGQl07Ci0gIElOVCAgICAgICBpc0Jvb2tbTUFYX0dST1VQRURfU0ZCXTsKLSAgSU5UICAgICAgIGlzU2NhbGVbTUFYX0dST1VQRURfU0ZCXTsKKyAgVE5TX0lORk8gdG5zSW5mbzsKKyAgSU5UIG5vaXNlTnJnW01BWF9HUk9VUEVEX1NGQl07CisgIElOVCBpc0Jvb2tbTUFYX0dST1VQRURfU0ZCXTsKKyAgSU5UIGlzU2NhbGVbTUFYX0dST1VQRURfU0ZCXTsKIAogICAvKiBtZW1vcnkgbG9jYXRlZCBpbiBRQ19PVVRfQ0hBTk5FTCAqLwotICBGSVhQX0RCTCAgKm1kY3RTcGVjdHJ1bTsKLSAgRklYUF9EQkwgICpzZmJFbmVyZ3k7Ci0gIEZJWFBfREJMICAqc2ZiU3ByZWFkRW5lcmd5OwotICBGSVhQX0RCTCAgKnNmYlRocmVzaG9sZExkRGF0YTsKLSAgRklYUF9EQkwgICpzZmJNaW5TbnJMZERhdGE7Ci0gIEZJWFBfREJMICAqc2ZiRW5lcmd5TGREYXRhOworICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtOworICBGSVhQX0RCTCAqc2ZiRW5lcmd5OworICBGSVhQX0RCTCAqc2ZiU3ByZWFkRW5lcmd5OworICBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkTGREYXRhOworICBGSVhQX0RCTCAqc2ZiTWluU25yTGREYXRhOworICBGSVhQX0RCTCAqc2ZiRW5lcmd5TGREYXRhOwogCi0KLSB9UFNZX09VVF9DSEFOTkVMOworfSBQU1lfT1VUX0NIQU5ORUw7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQogICAvKiBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBlYWNoIGNoYW5uZWwgKi8KLSAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV07CisgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFsoMildOwogCiAgIC8qIGluZm9ybWF0aW9uIHNoYXJlZCBieSBib3RoIGNoYW5uZWxzICAqLwotICBJTlQgICAgICAgY29tbW9uV2luZG93OworICBJTlQgY29tbW9uV2luZG93OwogICBzdHJ1Y3QgVE9PTFNJTkZPIHRvb2xzSW5mbzsKIAogfSBQU1lfT1VUX0VMRU1FTlQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKKyAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50WygoOCkpXTsKKyAgUFNZX09VVF9DSEFOTkVMICpwUHN5T3V0Q2hhbm5lbHNbKDgpXTsKIAotICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnRbKDgpXTsKLSAgUFNZX09VVF9DSEFOTkVMKiBwUHN5T3V0Q2hhbm5lbHNbKDgpXTsKK30gUFNZX09VVDsKIAotfVBTWV9PVVQ7Ci0KLWlubGluZSBpbnQgaXNMb3dEZWxheSggQVVESU9fT0JKRUNUX1RZUEUgYW90ICkKLXsKLSAgcmV0dXJuIChhb3Q9PUFPVF9FUl9BQUNfTEQgfHwgYW90PT1BT1RfRVJfQUFDX0VMRCk7CitpbmxpbmUgaW50IGlzTG93RGVsYXkoQVVESU9fT0JKRUNUX1RZUEUgYW90KSB7CisgIHJldHVybiAoYW90ID09IEFPVF9FUl9BQUNfTEQgfHwgYW90ID09IEFPVF9FUl9BQUNfRUxEKTsKIH0KIAotI2VuZGlmIC8qIF9JTlRFUkZBQ0VfSCAqLworI2VuZGlmIC8qIElOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2xpbmVfcGUuY3BwIGIvbGliQUFDZW5jL3NyYy9saW5lX3BlLmNwcAppbmRleCBmM2MwZGFiLi40NzczNGU1IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2xpbmVfcGUuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvbGluZV9wZS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFBlcmNlcHR1YWwgZW50cm9waWUgbW9kdWxlCisgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBQZXJjZXB0dWFsIGVudHJvcGllIG1vZHVsZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAibGluZV9wZS5oIgogI2luY2x1ZGUgInNmX2VzdGltLmgiCkBAIC05NCw0MiArMTA2LDQ3IEBACiAKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgQzFMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgzLjAvTERfREFUQV9TQ0FMSU5HKTsgICAgICAgIC8qIEMxID0gMy4wID0gbG9nKDguMCkvbG9nKDIpICovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgQzJMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgxLjMyMTkyODEvTERfREFUQV9TQ0FMSU5HKTsgIC8qIEMyID0gMS4zMjE5MjgxID0gbG9nKDIuNSkvbG9nKDIpICovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgQzNMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLjU1OTM1NzMpOyAgICAgICAgICAgICAgICAgIC8qIDEtQzIvQzEgKi8KLQorc3RhdGljIGNvbnN0IEZJWFBfREJMIEMxTGREYXRhID0KKyAgICBGTDJGWENPTlNUX0RCTCgzLjAgLyBMRF9EQVRBX1NDQUxJTkcpOyAvKiBDMSA9IDMuMCA9IGxvZyg4LjApL2xvZygyKSAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIEMyTGREYXRhID0gRkwyRlhDT05TVF9EQkwoCisgICAgMS4zMjE5MjgxIC8gTERfREFUQV9TQ0FMSU5HKTsgLyogQzIgPSAxLjMyMTkyODEgPSBsb2coMi41KS9sb2coMikgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBDM0xkRGF0YSA9IEZMMkZYQ09OU1RfREJMKDAuNTU5MzU3Myk7IC8qIDEtQzIvQzEgKi8KIAogLyogY29uc3RhbnRzIHRoYXQgZG8gbm90IGNoYW5nZSBkdXJpbmcgc3VjY2Vzc2l2ZSBwZSBjYWxjdWxhdGlvbnMgKi8KLXZvaWQgRkRLYWFjRW5jX3ByZXBhcmVTZmJQZShQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgKnNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAqc2ZiVGhyZXNob2xkTGREYXRhLAotICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICpzZmJGb3JtRmFjdG9yTGREYXRhLAotICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG1heFNmYlBlckdyb3VwKQotewotICAgSU5UIHNmYkdycCxzZmI7Ci0gICBJTlQgc2ZiV2lkdGg7Ci0gICBGSVhQX0RCTCBhdmdGb3JtRmFjdG9yTGREYXRhOwotICAgY29uc3QgRklYUF9EQkwgZm9ybUZhY1NjYWxpbmcgPSBGTDJGWENPTlNUX0RCTCgoZmxvYXQpRk9STV9GQUNfU0hJRlQvTERfREFUQV9TQ0FMSU5HKTsKK3ZvaWQgRkRLYWFjRW5jX3ByZXBhcmVTZmJQZShQRV9DSEFOTkVMX0RBVEEgKlJFU1RSSUNUIGNvbnN0IHBlQ2hhbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIGNvbnN0IHNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgY29uc3Qgc2ZiVGhyZXNob2xkTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBjb25zdCBzZmJGb3JtRmFjdG9yTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqUkVTVFJJQ1QgY29uc3Qgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZmJDbnQsIGNvbnN0IElOVCBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWF4U2ZiUGVyR3JvdXApIHsKKyAgSU5UIHNmYkdycCwgc2ZiOworICBJTlQgc2ZiV2lkdGg7CisgIEZJWFBfREJMIGF2Z0Zvcm1GYWN0b3JMZERhdGE7CisgIGNvbnN0IEZJWFBfREJMIGZvcm1GYWNTY2FsaW5nID0KKyAgICAgIEZMMkZYQ09OU1RfREJMKChmbG9hdClGT1JNX0ZBQ19TSElGVCAvIExEX0RBVEFfU0NBTElORyk7CiAKLSAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBzZmJDbnQ7c2ZiR3JwKz1zZmJQZXJHcm91cCkgewotICAgIGZvciAoc2ZiPTA7IHNmYjxtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgIGlmICgoRklYUF9EQkwpc2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdID4gKEZJWFBfREJMKXNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSkgewotICAgICAgICAgc2ZiV2lkdGggPSBzZmJPZmZzZXRbc2ZiR3JwK3NmYisxXSAtIHNmYk9mZnNldFtzZmJHcnArc2ZiXTsKLSAgICAgICAgIC8qIGVzdGltYXRlIG51bWJlciBvZiBhY3RpdmUgbGluZXMgKi8KLSAgICAgICAgIGF2Z0Zvcm1GYWN0b3JMZERhdGEgPSAoKC1zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0+PjEpICsgKENhbGNMZEludChzZmJXaWR0aCk+PjEpKT4+MTsKLSAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYk5MaW5lc1tzZmJHcnArc2ZiXSA9Ci0gICAgICAgICAgIChJTlQpQ2FsY0ludkxkRGF0YSggKHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiR3JwK3NmYl0gKyBmb3JtRmFjU2NhbGluZykgKyBhdmdGb3JtRmFjdG9yTGREYXRhKTsKLSAgICAgICAgIC8qIE1ha2Ugc3VyZSBzZmJOTGluZXMgaXMgbmV2ZXIgZ3JlYXRlciB0aGFuIHNmYldpZHRoIGR1ZSB0byB1bmFjY3VyYWNpZXMgKGUuZy4gc2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdID0gMHg4MDAwMDAwMCkgKi8KLSAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYk5MaW5lc1tzZmJHcnArc2ZiXSA9IGZNaW4oc2ZiV2lkdGgsIHBlQ2hhbkRhdGEtPnNmYk5MaW5lc1tzZmJHcnArc2ZiXSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYk5MaW5lc1tzZmJHcnArc2ZiXSA9IDA7CisgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgc2ZiQ250OyBzZmJHcnAgKz0gc2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgaWYgKChGSVhQX0RCTClzZmJFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXSA+CisgICAgICAgICAgKEZJWFBfREJMKXNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnAgKyBzZmJdKSB7CisgICAgICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W3NmYkdycCArIHNmYiArIDFdIC0gc2ZiT2Zmc2V0W3NmYkdycCArIHNmYl07CisgICAgICAgIC8qIGVzdGltYXRlIG51bWJlciBvZiBhY3RpdmUgbGluZXMgKi8KKyAgICAgICAgYXZnRm9ybUZhY3RvckxkRGF0YSA9ICgoLXNmYkVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdID4+IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2FsY0xkSW50KHNmYldpZHRoKSA+PiAxKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgIHBlQ2hhbkRhdGEtPnNmYk5MaW5lc1tzZmJHcnAgKyBzZmJdID0gKElOVClDYWxjSW52TGREYXRhKAorICAgICAgICAgICAgKHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiR3JwICsgc2ZiXSArIGZvcm1GYWNTY2FsaW5nKSArCisgICAgICAgICAgICBhdmdGb3JtRmFjdG9yTGREYXRhKTsKKyAgICAgICAgLyogTWFrZSBzdXJlIHNmYk5MaW5lcyBpcyBuZXZlciBncmVhdGVyIHRoYW4gc2ZiV2lkdGggZHVlIHRvCisgICAgICAgICAqIHVuYWNjdXJhY2llcyAoZS5nLiBzZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPSAweDgwMDAwMDAwKSAqLworICAgICAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICBmTWluKHNmYldpZHRoLCBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwICsgc2ZiXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwICsgc2ZiXSA9IDA7CiAgICAgICB9CiAgICAgfQotICAgfQorICB9CiB9CiAKIC8qCkBAIC0xNDEsNjkgKzE1OCw3NyBAQAogCiAgICBjb25zdFBhcnQgaXMgc2ZiUGUgd2l0aG91dCB0aGUgdGhyZXNob2xkIHBhcnQgbipsZCh0aHIpIG9yIG4qQzMqbGQodGhyKQogKi8KLXZvaWQgRkRLYWFjRW5jX2NhbGNTZmJQZShQRV9DSEFOTkVMX0RBVEEgICpSRVNUUklDVCBwZUNoYW5EYXRhLAotICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAqUkVTVFJJQ1Qgc2ZiVGhyZXNob2xkTGREYXRhLAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAqaXNCb29rLAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICppc1NjYWxlKQotewotICAgSU5UIHNmYkdycCxzZmI7Ci0gICBJTlQgbkxpbmVzOwotICAgRklYUF9EQkwgbG9nRGF0YVJhdGlvOwotICAgSU5UIGxhc3RWYWxJcyA9IDA7Cit2b2lkIEZES2FhY0VuY19jYWxjU2ZiUGUoUEVfQ0hBTk5FTF9EQVRBICpSRVNUUklDVCBjb25zdCBwZUNoYW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBjb25zdCBzZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIGNvbnN0IHNmYlRocmVzaG9sZExkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiQ250LCBjb25zdCBJTlQgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqUkVTVFJJQ1QgY29uc3QgaXNCb29rLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqUkVTVFJJQ1QgY29uc3QgaXNTY2FsZSkgeworICBJTlQgc2ZiR3JwLCBzZmIsIHRoaXNTZmI7CisgIElOVCBuTGluZXM7CisgIEZJWFBfREJMIGxvZ0RhdGFSYXRpbzsKKyAgRklYUF9EQkwgc2NhbGVMZCA9IChGSVhQX0RCTCkwOworICBJTlQgbGFzdFZhbElzID0gMDsKIAotICAgcGVDaGFuRGF0YS0+cGUgPSAwOwotICAgcGVDaGFuRGF0YS0+Y29uc3RQYXJ0ID0gMDsKLSAgIHBlQ2hhbkRhdGEtPm5BY3RpdmVMaW5lcyA9IDA7CisgIEZJWFBfREJMIHBlID0gMDsKKyAgRklYUF9EQkwgY29uc3RQYXJ0ID0gMDsKKyAgRklYUF9EQkwgbkFjdGl2ZUxpbmVzID0gMDsKIAotICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgc2ZiQ250O3NmYkdycCs9c2ZiUGVyR3JvdXApewotICAgIGZvciAoc2ZiPTA7IHNmYjxtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgIGlmICgoRklYUF9EQkwpc2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdID4gKEZJWFBfREJMKXNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSkgewotICAgICAgICAgbG9nRGF0YVJhdGlvID0gKEZJWFBfREJMKShzZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gLSBzZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pOwotICAgICAgICAgbkxpbmVzID0gcGVDaGFuRGF0YS0+c2ZiTkxpbmVzW3NmYkdycCtzZmJdOwotICAgICAgICAgaWYgKGxvZ0RhdGFSYXRpbyA+PSBDMUxkRGF0YSkgewotICAgICAgICAgICAgLyogc2NhbGUgc2ZiUGUgYW5kIHNmYkNvbnN0UGFydCB3aXRoIFBFX0NPTlNUUEFSVF9TSElGVCAqLwotICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl0gPSBmTXVsdERpdjIobG9nRGF0YVJhdGlvLCAoRklYUF9EQkwpKG5MaW5lczw8KExEX0RBVEFfU0hJRlQrUEVfQ09OU1RQQVJUX1NISUZUKzEpKSk7Ci0gICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl0gPQotICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoc2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdLCAoRklYUF9EQkwpKG5MaW5lczw8KExEX0RBVEFfU0hJRlQrUEVfQ09OU1RQQVJUX1NISUZUKzEpKSk7IDsKKyAgRklYUF9EQkwgdG1wUGUsIHRtcENvbnN0UGFydCwgdG1wTkFjdGl2ZUxpbmVzOwogCi0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIHNjYWxlIHNmYlBlIGFuZCBzZmJDb25zdFBhcnQgd2l0aCBQRV9DT05TVFBBUlRfU0hJRlQgKi8KLSAgICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdID0KLSAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MigoKEZJWFBfREJMKUMyTGREYXRhICsgZk11bHQoQzNMZERhdGEsbG9nRGF0YVJhdGlvKSksIChGSVhQX0RCTCkobkxpbmVzPDwoTERfREFUQV9TSElGVCtQRV9DT05TVFBBUlRfU0hJRlQrMSkpKTsKKyAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBzZmJDbnQ7IHNmYkdycCArPSBzZmJQZXJHcm91cCkgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICB0bXBQZSA9IChGSVhQX0RCTCkwOworICAgICAgdG1wQ29uc3RQYXJ0ID0gKEZJWFBfREJMKTA7CisgICAgICB0bXBOQWN0aXZlTGluZXMgPSAoRklYUF9EQkwpMDsKIAotICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdID0KLSAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MigoKEZJWFBfREJMKUMyTGREYXRhICsgZk11bHQoQzNMZERhdGEsc2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKG5MaW5lczw8KExEX0RBVEFfU0hJRlQrUEVfQ09OU1RQQVJUX1NISUZUKzEpKSkgOworICAgICAgdGhpc1NmYiA9IHNmYkdycCArIHNmYjsKIAotICAgICAgICAgICAgbkxpbmVzID0gZk11bHRJKEMzTGREYXRhLCBuTGluZXMpOwotICAgICAgICAgfQotICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID0gbkxpbmVzOwotICAgICAgfQotICAgICAgZWxzZSBpZiggaXNCb29rW3NmYkdycCtzZmJdICkgeworICAgICAgaWYgKHNmYkVuZXJneUxkRGF0YVt0aGlzU2ZiXSA+IHNmYlRocmVzaG9sZExkRGF0YVt0aGlzU2ZiXSkgeworICAgICAgICBsb2dEYXRhUmF0aW8gPSBzZmJFbmVyZ3lMZERhdGFbdGhpc1NmYl0gLSBzZmJUaHJlc2hvbGRMZERhdGFbdGhpc1NmYl07CisgICAgICAgIG5MaW5lcyA9IHBlQ2hhbkRhdGEtPnNmYk5MaW5lc1t0aGlzU2ZiXTsKKworICAgICAgICBGSVhQX0RCTCBmYWN0b3IgPSBuTGluZXMgPDwgKExEX0RBVEFfU0hJRlQgKyBQRV9DT05TVFBBUlRfU0hJRlQgKyAxKTsKKyAgICAgICAgaWYgKGxvZ0RhdGFSYXRpbyA+PSBDMUxkRGF0YSkgeworICAgICAgICAgIC8qIHNjYWxlIHNmYlBlIGFuZCBzZmJDb25zdFBhcnQgd2l0aCBQRV9DT05TVFBBUlRfU0hJRlQgKi8KKyAgICAgICAgICB0bXBQZSA9IGZNdWx0RGl2Mihsb2dEYXRhUmF0aW8sIGZhY3Rvcik7CisgICAgICAgICAgdG1wQ29uc3RQYXJ0ID0gZk11bHREaXYyKHNmYkVuZXJneUxkRGF0YVt0aGlzU2ZiXSArIHNjYWxlTGQsIGZhY3Rvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogc2NhbGUgc2ZiUGUgYW5kIHNmYkNvbnN0UGFydCB3aXRoIFBFX0NPTlNUUEFSVF9TSElGVCAqLworICAgICAgICAgIHRtcFBlID0gZk11bHREaXYyKAorICAgICAgICAgICAgICAoKEZJWFBfREJMKUMyTGREYXRhICsgZk11bHQoQzNMZERhdGEsIGxvZ0RhdGFSYXRpbykpLCBmYWN0b3IpOworICAgICAgICAgIHRtcENvbnN0UGFydCA9CisgICAgICAgICAgICAgIGZNdWx0RGl2MigoKEZJWFBfREJMKUMyTGREYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChDM0xkRGF0YSwgc2ZiRW5lcmd5TGREYXRhW3RoaXNTZmJdICsgc2NhbGVMZCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yKTsKKworICAgICAgICAgIG5MaW5lcyA9IGZNdWx0SShDM0xkRGF0YSwgbkxpbmVzKTsKKyAgICAgICAgfQorICAgICAgICB0bXBOQWN0aXZlTGluZXMgPSAoRklYUF9EQkwpbkxpbmVzOworICAgICAgfSBlbHNlIGlmIChpc0Jvb2tbdGhpc1NmYl0pIHsKICAgICAgICAgLyogcHJvdmlkZSBmb3IgY29zdCBvZiBzY2FsZSBmYWN0b3IgZm9yIEludGVuc2l0eSAqLwotICAgICAgICBJTlQgZGVsdGEgPSBpc1NjYWxlW3NmYkdycCtzZmJdIC0gbGFzdFZhbElzOwotICAgICAgICBsYXN0VmFsSXMgPSBpc1NjYWxlW3NmYkdycCtzZmJdOwotICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXSA9IEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoZGVsdGEpPDxQRV9DT05TVFBBUlRfU0hJRlQ7Ci0gICAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXSA9IDA7Ci0gICAgICAgIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSA9IDA7CisgICAgICAgIElOVCBkZWx0YSA9IGlzU2NhbGVbdGhpc1NmYl0gLSBsYXN0VmFsSXM7CisgICAgICAgIGxhc3RWYWxJcyA9IGlzU2NhbGVbdGhpc1NmYl07CisgICAgICAgIHBlQ2hhbkRhdGEtPnNmYlBlW3RoaXNTZmJdID0gRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShkZWx0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBQRV9DT05TVFBBUlRfU0hJRlQ7CisgICAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFt0aGlzU2ZiXSA9IDA7CisgICAgICAgIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1t0aGlzU2ZiXSA9IDA7CiAgICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdID0gMDsKLSAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXSA9IDA7Ci0gICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gPSAwOwotICAgICAgfQorICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbdGhpc1NmYl0gPSB0bXBQZTsKKyAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFt0aGlzU2ZiXSA9IHRtcENvbnN0UGFydDsKKyAgICAgIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1t0aGlzU2ZiXSA9IHRtcE5BY3RpdmVMaW5lczsKKwogICAgICAgLyogc3VtIHVwIHBlQ2hhbkRhdGEgdmFsdWVzICovCi0gICAgICBwZUNoYW5EYXRhLT5wZSArPSBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXTsKLSAgICAgIHBlQ2hhbkRhdGEtPmNvbnN0UGFydCArPSBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl07Ci0gICAgICBwZUNoYW5EYXRhLT5uQWN0aXZlTGluZXMgKz0gcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdOworICAgICAgcGUgKz0gdG1wUGU7CisgICAgICBjb25zdFBhcnQgKz0gdG1wQ29uc3RQYXJ0OworICAgICAgbkFjdGl2ZUxpbmVzICs9IHRtcE5BY3RpdmVMaW5lczsKICAgICB9Ci0gICB9Ci0gICAvKiBjb3JyZWN0IHNjYWxlZCBwZSBhbmQgY29uc3RQYXJ0IHZhbHVlcyAqLwotICAgcGVDaGFuRGF0YS0+cGU+Pj1QRV9DT05TVFBBUlRfU0hJRlQ7Ci0gICBwZUNoYW5EYXRhLT5jb25zdFBhcnQ+Pj1QRV9DT05TVFBBUlRfU0hJRlQ7CisgIH0KKworICAvKiBjb3JyZWN0IHNjYWxlZCBwZSBhbmQgY29uc3RQYXJ0IHZhbHVlcyAqLworICBwZUNoYW5EYXRhLT5wZSA9IHBlID4+IFBFX0NPTlNUUEFSVF9TSElGVDsKKyAgcGVDaGFuRGF0YS0+Y29uc3RQYXJ0ID0gY29uc3RQYXJ0ID4+IFBFX0NPTlNUUEFSVF9TSElGVDsKKworICBwZUNoYW5EYXRhLT5uQWN0aXZlTGluZXMgPSBuQWN0aXZlTGluZXM7CiB9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2xpbmVfcGUuaCBiL2xpYkFBQ2VuYy9zcmMvbGluZV9wZS5oCmluZGV4IDNkNWNmZDUuLmVjYzIzODggMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvbGluZV9wZS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvbGluZV9wZS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDYxICs5MCw1OSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQZXJjZXB0dWFsIGVudHJvcGllIG1vZHVsZQorICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fTElORV9QRV9ICi0jZGVmaW5lIF9fTElORV9QRV9ICisgICBEZXNjcmlwdGlvbjogUGVyY2VwdHVhbCBlbnRyb3BpZSBtb2R1bGUKIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBMSU5FX1BFX0gKKyNkZWZpbmUgTElORV9QRV9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKICNpbmNsdWRlICJwc3lfY29uc3QuaCIKIAotI2RlZmluZSBQRV9DT05TVFBBUlRfU0hJRlQgIEZSQUNUX0JJVFMKKyNkZWZpbmUgUEVfQ09OU1RQQVJUX1NISUZUIEZSQUNUX0JJVFMKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgLyogY2FsY3VsYXRlZCBieSBGREthYWNFbmNfcHJlcGFyZVNmYlBlICovCi0gICBJTlQgICAgICBzZmJOTGluZXNbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJlbGV2YW50IGxpbmVzIGluIHNmYiAqLwotICAgLyogdGhlIHJlc3QgaXMgY2FsY3VsYXRlZCBieSBGREthYWNFbmNfY2FsY1NmYlBlICovCi0gICBJTlQgICAgICBzZmJQZVtNQVhfR1JPVVBFRF9TRkJdOyAgICAgICAgICAgICAgICAgLyogcGUgZm9yIGVhY2ggc2ZiICovCi0gICBJTlQgICAgICBzZmJDb25zdFBhcnRbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgLyogY29uc3RhbnQgcGFydCBmb3IgZWFjaCBzZmIgKi8KLSAgIElOVCAgICAgIHNmYk5BY3RpdmVMaW5lc1tNQVhfR1JPVVBFRF9TRkJdOyAgICAgICAvKiBudW1iZXIgb2YgYWN0aXZlIGxpbmVzIGluIHNmYiAqLwotICAgSU5UICAgICAgcGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSBvZiBzZmJQZSAqLwotICAgSU5UICAgICAgY29uc3RQYXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSBvZiBzZmJDb25zdFBhcnQgKi8KLSAgIElOVCAgICAgIG5BY3RpdmVMaW5lczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiTkFjdGl2ZUxpbmVzICovCisgIC8qIGNhbGN1bGF0ZWQgYnkgRkRLYWFjRW5jX3ByZXBhcmVTZmJQZSAqLworICBJTlQgc2ZiTkxpbmVzW01BWF9HUk9VUEVEX1NGQl07IC8qIG51bWJlciBvZiByZWxldmFudCBsaW5lcyBpbiBzZmIgKi8KKyAgLyogdGhlIHJlc3QgaXMgY2FsY3VsYXRlZCBieSBGREthYWNFbmNfY2FsY1NmYlBlICovCisgIElOVCBzZmJQZVtNQVhfR1JPVVBFRF9TRkJdOyAgICAgICAgICAgLyogcGUgZm9yIGVhY2ggc2ZiICovCisgIElOVCBzZmJDb25zdFBhcnRbTUFYX0dST1VQRURfU0ZCXTsgICAgLyogY29uc3RhbnQgcGFydCBmb3IgZWFjaCBzZmIgKi8KKyAgSU5UIHNmYk5BY3RpdmVMaW5lc1tNQVhfR1JPVVBFRF9TRkJdOyAvKiBudW1iZXIgb2YgYWN0aXZlIGxpbmVzIGluIHNmYiAqLworICBJTlQgcGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSBvZiBzZmJQZSAqLworICBJTlQgY29uc3RQYXJ0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSBvZiBzZmJDb25zdFBhcnQgKi8KKyAgSU5UIG5BY3RpdmVMaW5lczsgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiTkFjdGl2ZUxpbmVzICovCiB9IFBFX0NIQU5ORUxfREFUQTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFBFX0NIQU5ORUxfREFUQSBwZUNoYW5uZWxEYXRhWygyKV07Ci0gICAgSU5UICAgIHBlOwotICAgIElOVCAgICBjb25zdFBhcnQ7Ci0gICAgSU5UICAgIG5BY3RpdmVMaW5lczsKLSAgICBJTlQgICAgb2Zmc2V0OworICBQRV9DSEFOTkVMX0RBVEEgcGVDaGFubmVsRGF0YVsoMildOworICBJTlQgcGU7CisgIElOVCBjb25zdFBhcnQ7CisgIElOVCBuQWN0aXZlTGluZXM7CisgIElOVCBvZmZzZXQ7CiB9IFBFX0RBVEE7CiAKK3ZvaWQgRkRLYWFjRW5jX3ByZXBhcmVTZmJQZShQRV9DSEFOTkVMX0RBVEEgKlJFU1RSSUNUIGNvbnN0IHBlQ2hhbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIGNvbnN0IHNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgY29uc3Qgc2ZiVGhyZXNob2xkTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBjb25zdCBzZmJGb3JtRmFjdG9yTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqUkVTVFJJQ1QgY29uc3Qgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZmJDbnQsIGNvbnN0IElOVCBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWF4U2ZiUGVyR3JvdXApOwogCi12b2lkIEZES2FhY0VuY19wcmVwYXJlU2ZiUGUoUEVfQ0hBTk5FTF9EQVRBICAgKnBlQ2hhbkRhdGEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqc2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKnNmYlRocmVzaG9sZExkRGF0YSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICpzZmJGb3JtRmFjdG9yTGREYXRhLAotICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgbWF4U2ZiUGVyR3JvdXApOwotCi12b2lkIEZES2FhY0VuY19jYWxjU2ZiUGUoUEVfQ0hBTk5FTF9EQVRBICAqUkVTVFJJQ1QgcGVDaGFuRGF0YSwKLSAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYlRocmVzaG9sZExkRGF0YSwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgKmlzQm9vaywKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAqaXNTY2FsZSk7Cit2b2lkIEZES2FhY0VuY19jYWxjU2ZiUGUoUEVfQ0hBTk5FTF9EQVRBICpSRVNUUklDVCBjb25zdCBwZUNoYW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBjb25zdCBzZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIGNvbnN0IHNmYlRocmVzaG9sZExkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiQ250LCBjb25zdCBJTlQgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqUkVTVFJJQ1QgY29uc3QgaXNCb29rLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqUkVTVFJJQ1QgY29uc3QgaXNTY2FsZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9jb21wcmVzc29yLmNwcCBiL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfY29tcHJlc3Nvci5jcHAKaW5kZXggNjhhNjRhZS4uYmRhYzgwYSAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9jb21wcmVzc29yLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL21ldGFkYXRhX2NvbXByZXNzb3IuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDUwICs5MCwzOSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgQUFDIEVuY29kZXIgbGliICAqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogTS4gTmV1c2luZ2VyCisgICBBdXRob3Iocyk6ICAgTS4gTmV1c2luZ2VyCisKICAgIERlc2NyaXB0aW9uOiBDb21wcmVzc29yIGZvciBBQUMgTWV0YWRhdGEgR2VuZXJhdG9yCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgIm1ldGFkYXRhX2NvbXByZXNzb3IuaCIKICNpbmNsdWRlICJjaGFubmVsX21hcC5oIgogCi0KLSNkZWZpbmUgTE9HMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjkzMTQ3MTgwNTZmICAvKiBuYXR1cmFsIGxvZ2FyaXRobSBvZiAyICovCi0jZGVmaW5lIElMT0cyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ0MjY5NTA0MWYgICAgLyogMS9MT0cyICovCi0jZGVmaW5lIEZJWFBfSUxPRzJfRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoSUxPRzIvMikpCisjZGVmaW5lIExPRzIgMC42OTMxNDcxODA1NmYgLyogbmF0dXJhbCBsb2dhcml0aG0gb2YgMiAqLworI2RlZmluZSBJTE9HMiAxLjQ0MjY5NTA0MWYgIC8qIDEvTE9HMiAqLworI2RlZmluZSBGSVhQX0lMT0cyX0RJVjIgKEZMMkZYQ09OU1RfREJMKElMT0cyIC8gMikpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2RlZmluZSBNQVhfRFJDX0NIQU5ORUxTICAgICAgICAoOCkgICAgICAgICAgLyohPCBNYXggbnVtYmVyIG9mIGF1ZGlvIGlucHV0IGNoYW5uZWxzLiAqLwotI2RlZmluZSBET1dOTUlYX1NISUZUICAgICAgICAgICAoMykgICAgICAgICAgLyohPCBNYXggOCBjaGFubmVsLiAqLwotI2RlZmluZSBXRUlHSFRJTkdfRklMVEVSX1NISUZUICAoMikgICAgICAgICAgLyohPCBTY2FsaW5nIHVzZWQgaW4gd2VpZ2h0aW5nIGZpbHRlci4gKi8KKyNkZWZpbmUgTUFYX0RSQ19DSEFOTkVMUyAoOCkgICAgICAgLyohPCBNYXggbnVtYmVyIG9mIGF1ZGlvIGlucHV0IGNoYW5uZWxzLiAqLworI2RlZmluZSBET1dOTUlYX1NISUZUICgzKSAgICAgICAgICAvKiE8IE1heCA4IGNoYW5uZWwuICovCisjZGVmaW5lIFdFSUdIVElOR19GSUxURVJfU0hJRlQgKDIpIC8qITwgU2NhbGluZyB1c2VkIGluIHdlaWdodGluZyBmaWx0ZXIuICovCiAKLSNkZWZpbmUgTUVUQURBVEFfSU5UX0JJVFMgICAgICAxMAotI2RlZmluZSBNRVRBREFUQV9MSU5UX0JJVFMgICAgIDIwCi0jZGVmaW5lIE1FVEFEQVRBX0lOVF9TQ0FMRSAgICAgKElOVDY0KDEpPDwoTUVUQURBVEFfSU5UX0JJVFMpKQotI2RlZmluZSBNRVRBREFUQV9GUkFDVF9CSVRTICAgIChERlJBQ1RfQklUUy0xLU1FVEFEQVRBX0lOVF9CSVRTKQotI2RlZmluZSBNRVRBREFUQV9GUkFDVF9TQ0FMRSAgIChJTlQ2NCgxKTw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMpKQorI2RlZmluZSBNRVRBREFUQV9JTlRfQklUUyAxMAorI2RlZmluZSBNRVRBREFUQV9MSU5UX0JJVFMgMjAKKyNkZWZpbmUgTUVUQURBVEFfSU5UX1NDQUxFIChJTlQ2NCgxKSA8PCAoTUVUQURBVEFfSU5UX0JJVFMpKQorI2RlZmluZSBNRVRBREFUQV9GUkFDVF9CSVRTIChERlJBQ1RfQklUUyAtIDEgLSBNRVRBREFUQV9JTlRfQklUUykKKyNkZWZpbmUgTUVUQURBVEFfRlJBQ1RfU0NBTEUgKElOVDY0KDEpIDw8IChNRVRBREFUQV9GUkFDVF9CSVRTKSkKIAogLyoqCiAgKiAgRW51bSBmb3IgY2hhbm5lbCBhc3NpZ25tZW50LgogICovCi1lbnVtIHsKLSAgICBMICAgPSAwLAotICAgIFIgICA9IDEsCi0gICAgQyAgID0gMiwKLSAgICBMRkUgPSAzLAotICAgIExTICA9IDQsCi0gICAgUlMgID0gNSwKLSAgICBTICAgPSA2LAotICAgIExTMiA9IDcsCi0gICAgUlMyID0gOAotfTsKK2VudW0geyBMID0gMCwgUiA9IDEsIEMgPSAyLCBMRkUgPSAzLCBMUyA9IDQsIFJTID0gNSwgUyA9IDYsIExTMiA9IDcsIFJTMiA9IDggfTsKIAogLyotLS0tLS0tLS0tLS0tLS0gc3RydWN0dXJlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMTMwLDYxICsxMzAsNjIgQEAKICAqICBTdHJ1Y3R1cmUgaG9sZHMgd2VpZ2h0aW5nIGZpbHRlciBmaWx0ZXIgc3RhdGVzLgogICovCiBzdHJ1Y3QgV0VJR0hUSU5HX1NUQVRFUyB7Ci0gICAgRklYUF9EQkwgeDE7Ci0gICAgRklYUF9EQkwgeDI7Ci0gICAgRklYUF9EQkwgeTE7Ci0gICAgRklYUF9EQkwgeTI7CisgIEZJWFBfREJMIHgxOworICBGSVhQX0RCTCB4MjsKKyAgRklYUF9EQkwgeTE7CisgIEZJWFBfREJMIHkyOwogfTsKIAogLyoqCiAgKiAgRHluYW1pYyBSYW5nZSBDb250cm9sIGNvbXByZXNzb3Igc3RydWN0dXJlLgogICovCiBzdHJ1Y3QgRFJDX0NPTVAgeworICBGSVhQX0RCTCBtYXhCb29zdFRoclsyXTsgLyohPCBNYXggYm9vc3QgdGhyZXNob2xkLiAqLworICBGSVhQX0RCTCBib29zdFRoclsyXTsgICAgLyohPCBCb29zdCB0aHJlc2hvbGQuICovCisgIEZJWFBfREJMIGVhcmx5Q3V0VGhyWzJdOyAvKiE8IEVhcmx5IGN1dCB0aHJlc2hvbGQuICovCisgIEZJWFBfREJMIGN1dFRoclsyXTsgICAgICAvKiE8IEN1dCB0aHJlc2hvbGQuICovCisgIEZJWFBfREJMIG1heEN1dFRoclsyXTsgICAvKiE8IE1heCBjdXQgdGhyZXNob2xkLiAqLwogCi0gICAgRklYUF9EQkwgICAgIG1heEJvb3N0VGhyWzJdOyAgICAgICAgICAgICAvKiE8IE1heCBib29zdCB0aHJlc2hvbGQuICovCi0gICAgRklYUF9EQkwgICAgIGJvb3N0VGhyWzJdOyAgICAgICAgICAgICAgICAvKiE8IEJvb3N0IHRocmVzaG9sZC4gKi8KLSAgICBGSVhQX0RCTCAgICAgZWFybHlDdXRUaHJbMl07ICAgICAgICAgICAgIC8qITwgRWFybHkgY3V0IHRocmVzaG9sZC4gKi8KLSAgICBGSVhQX0RCTCAgICAgY3V0VGhyWzJdOyAgICAgICAgICAgICAgICAgIC8qITwgQ3V0IHRocmVzaG9sZC4gKi8KLSAgICBGSVhQX0RCTCAgICAgbWF4Q3V0VGhyWzJdOyAgICAgICAgICAgICAgIC8qITwgTWF4IGN1dCB0aHJlc2hvbGQuICovCisgIEZJWFBfREJMIGJvb3N0RmFjWzJdOyAvKiE8IFByZWNhbGN1bGF0ZWQgZmFjdG9yIGZvciBib29zdCBjb21wcmVzc2lvbi4gKi8KKyAgRklYUF9EQkwKKyAgZWFybHlDdXRGYWNbMl07ICAgICAvKiE8IFByZWNhbGN1bGF0ZWQgZmFjdG9yIGZvciBlYXJseSBjdXQgY29tcHJlc3Npb24uICovCisgIEZJWFBfREJMIGN1dEZhY1syXTsgLyohPCBQcmVjYWxjdWxhdGVkIGZhY3RvciBmb3IgY3V0IGNvbXByZXNzaW9uLiAqLwogCi0gICAgRklYUF9EQkwgICAgIGJvb3N0RmFjWzJdOyAgICAgICAgICAgICAgICAvKiE8IFByZWNhbGN1bGF0ZWQgZmFjdG9yIGZvciBib29zdCBjb21wcmVzc2lvbi4gKi8KLSAgICBGSVhQX0RCTCAgICAgZWFybHlDdXRGYWNbMl07ICAgICAgICAgICAgIC8qITwgUHJlY2FsY3VsYXRlZCBmYWN0b3IgZm9yIGVhcmx5IGN1dCBjb21wcmVzc2lvbi4gKi8KLSAgICBGSVhQX0RCTCAgICAgY3V0RmFjWzJdOyAgICAgICAgICAgICAgICAgIC8qITwgUHJlY2FsY3VsYXRlZCBmYWN0b3IgZm9yIGN1dCBjb21wcmVzc2lvbi4gKi8KKyAgRklYUF9EQkwgbWF4Qm9vc3RbMl07ICAgIC8qITwgTWF4aW11bSBib29zdC4gKi8KKyAgRklYUF9EQkwgbWF4Q3V0WzJdOyAgICAgIC8qITwgTWF4aW11bSBjdXQuICovCisgIEZJWFBfREJMIG1heEVhcmx5Q3V0WzJdOyAvKiE8IE1heGltdW0gZWFybHkgY3V0LiAqLwogCi0gICAgRklYUF9EQkwgICAgIG1heEJvb3N0WzJdOyAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gYm9vc3QuICovCi0gICAgRklYUF9EQkwgICAgIG1heEN1dFsyXTsgICAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gY3V0LiAqLwotICAgIEZJWFBfREJMICAgICBtYXhFYXJseUN1dFsyXTsgICAgICAgICAgICAgLyohPCBNYXhpbXVtIGVhcmx5IGN1dC4gKi8KKyAgRklYUF9EQkwgZmFzdEF0dGFja1syXTsgLyohPCBGYXN0IGF0dGFjayBjb2VmZmljaWVudC4gKi8KKyAgRklYUF9EQkwgZmFzdERlY2F5WzJdOyAgLyohPCBGYXN0IHJlbGVhc2UgY29lZmZpY2llbnQuICovCisgIEZJWFBfREJMIHNsb3dBdHRhY2tbMl07IC8qITwgU2xvdyBhdHRhY2sgY29lZmZpY2llbnQuICovCisgIEZJWFBfREJMIHNsb3dEZWNheVsyXTsgIC8qITwgU2xvdyByZWxlYXNlIGNvZWZmaWNpZW50LiAqLworICBVSU5UIGhvbGRPZmZbMl07ICAgICAgICAvKiE8IEhvbGQgdGltZSBpbiBibG9ja3MuICovCiAKLSAgICBGSVhQX0RCTCAgICAgZmFzdEF0dGFja1syXTsgICAgICAgICAgICAgIC8qITwgRmFzdCBhdHRhY2sgY29lZmZpY2llbnQuICovCi0gICAgRklYUF9EQkwgICAgIGZhc3REZWNheVsyXTsgICAgICAgICAgICAgICAvKiE8IEZhc3QgcmVsZWFzZSBjb2VmZmljaWVudC4gKi8KLSAgICBGSVhQX0RCTCAgICAgc2xvd0F0dGFja1syXTsgICAgICAgICAgICAgIC8qITwgU2xvdyBhdHRhY2sgY29lZmZpY2llbnQuICovCi0gICAgRklYUF9EQkwgICAgIHNsb3dEZWNheVsyXTsgICAgICAgICAgICAgICAvKiE8IFNsb3cgcmVsZWFzZSBjb2VmZmljaWVudC4gKi8KLSAgICBVSU5UICAgICAgICAgaG9sZE9mZlsyXTsgICAgICAgICAgICAgICAgIC8qITwgSG9sZCB0aW1lIGluIGJsb2Nrcy4gKi8KKyAgRklYUF9EQkwgYXR0YWNrVGhyWzJdOyAvKiE8IFNsb3cvZmFzdCBhdHRhY2sgdGhyZXNob2xkLiAqLworICBGSVhQX0RCTCBkZWNheVRoclsyXTsgIC8qITwgU2xvdy9mYXN0IHJlbGVhc2UgdGhyZXNob2xkLiAqLwogCi0gICAgRklYUF9EQkwgICAgIGF0dGFja1RoclsyXTsgICAgICAgICAgICAgICAvKiE8IFNsb3cvZmFzdCBhdHRhY2sgdGhyZXNob2xkLiAqLwotICAgIEZJWFBfREJMICAgICBkZWNheVRoclsyXTsgICAgICAgICAgICAgICAgLyohPCBTbG93L2Zhc3QgcmVsZWFzZSB0aHJlc2hvbGQuICovCisgIERSQ19QUk9GSUxFIHByb2ZpbGVbMl07ICAvKiE8IERSQyBwcm9maWxlLiAqLworICBJTlQgYmxvY2tMZW5ndGg7ICAgICAgICAgLyohPCBCbG9jayBsZW5ndGggaW4gc2FtcGxlcy4gKi8KKyAgVUlOVCBzYW1wbGVSYXRlOyAgICAgICAgIC8qITwgU2FtcGxlIHJhdGUuICovCisgIENIQU5ORUxfTU9ERSBjaGFuQ29uZmlnOyAvKiE8IENoYW5uZWwgY29uZmlndXJhdGlvbi4gKi8KIAotICAgIERSQ19QUk9GSUxFICBwcm9maWxlWzJdOyAgICAgICAgICAgICAgICAgLyohPCBEUkMgcHJvZmlsZS4gKi8KLSAgICBJTlQgICAgICAgICAgYmxvY2tMZW5ndGg7ICAgICAgICAgICAgICAgIC8qITwgQmxvY2sgbGVuZ3RoIGluIHNhbXBsZXMuICovCi0gICAgVUlOVCAgICAgICAgIHNhbXBsZVJhdGU7ICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsZSByYXRlLiAqLwotICAgIENIQU5ORUxfTU9ERSBjaGFuQ29uZmlnOyAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24uICovCisgIFVDSEFSIHVzZVdlaWdodGluZzsgLyohPCBVc2Ugd2VpZ2h0aW5nIGZpbHRlci4gKi8KIAotICAgIFVDSEFSICAgICAgICB1c2VXZWlnaHRpbmc7ICAgICAgICAgICAgICAgLyohPCBVc2Ugd2VpZ2h0aW5nIGZpbHRlci4gKi8KKyAgVUlOVCBjaGFubmVsczsgICAgIC8qITwgTnVtYmVyIG9mIGNoYW5uZWxzLiAqLworICBVSU5UIGZ1bGxDaGFubmVsczsgLyohPCBOdW1iZXIgb2YgZnVsbCByYW5nZSBjaGFubmVscy4gKi8KKyAgSU5UIGNoYW5uZWxJZHhbOV07IC8qITwgT2Zmc2V0cyBvZiBpbnRlcmxlYXZlZCBjaGFubmVsIHNhbXBsZXMgKEwsIFIsIEMsIExGRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExzLCBScywgUywgTHMyLCBSczIpLiAqLwogCi0gICAgVUlOVCAgICAgICAgIGNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjaGFubmVscy4gKi8KLSAgICBVSU5UICAgICAgICAgZnVsbENoYW5uZWxzOyAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGZ1bGwgcmFuZ2UgY2hhbm5lbHMuICovCi0gICAgSU5UICAgICAgICAgIGNoYW5uZWxJZHhbOV07ICAgICAgICAgICAgICAvKiE8IE9mZnNldHMgb2YgaW50ZXJsZWF2ZWQgY2hhbm5lbCBzYW1wbGVzIChMLCBSLCBDLCBMRkUsIExzLCBScywgUywgTHMyLCBSczIpLiAqLworICBGSVhQX0RCTCBzbW9vdGhMZXZlbFsyXTsgLyohPCBsZXZlbCBzbW9vdGhpbmcgc3RhdGVzICovCisgIEZJWFBfREJMIHNtb290aEdhaW5bMl07ICAvKiE8IGdhaW4gc21vb3RoaW5nIHN0YXRlcyAqLworICBVSU5UIGhvbGRDbnRbMl07ICAgICAgICAgLyohPCBob2xkIGNvdW50ZXIgKi8KIAotICAgIEZJWFBfREJMICAgICBzbW9vdGhMZXZlbFsyXTsgICAgICAgICAgICAgLyohPCBsZXZlbCBzbW9vdGhpbmcgc3RhdGVzICovCi0gICAgRklYUF9EQkwgICAgIHNtb290aEdhaW5bMl07ICAgICAgICAgICAgICAvKiE8IGdhaW4gc21vb3RoaW5nIHN0YXRlcyAqLwotICAgIFVJTlQgICAgICAgICBob2xkQ250WzJdOyAgICAgICAgICAgICAgICAgLyohPCBob2xkIGNvdW50ZXIgKi8KKyAgRklYUF9EQkwgbGltR2FpblsyXTsgIC8qITwgbGltaXRlciBnYWluICovCisgIEZJWFBfREJMIGxpbURlY2F5OyAgICAvKiE8IGxpbWl0ZXIgZGVjYXkgKGxpbmVhcikgKi8KKyAgRklYUF9EQkwgcHJldlBlYWtbMl07IC8qITwgbWF4IHBlYWsgb2YgcHJldmlvdXMgYmxvY2sgKHN0ZXJlby9tb25vKSovCiAKLSAgICBGSVhQX0RCTCAgICAgbGltR2FpblsyXTsgICAgICAgICAgICAgICAgIC8qITwgbGltaXRlciBnYWluICovCi0gICAgRklYUF9EQkwgICAgIGxpbURlY2F5OyAgICAgICAgICAgICAgICAgICAvKiE8IGxpbWl0ZXIgZGVjYXkgKGxpbmVhcikgKi8KLSAgICBGSVhQX0RCTCAgICAgcHJldlBlYWtbMl07ICAgICAgICAgICAgICAgIC8qITwgbWF4IHBlYWsgb2YgcHJldmlvdXMgYmxvY2sgKHN0ZXJlby9tb25vKSovCi0KLSAgICBXRUlHSFRJTkdfU1RBVEVTIGZpbHRlcltNQVhfRFJDX0NIQU5ORUxTXTsgLyohPCBhcnJheSBob2xkcyB3ZWlnaHRpbmcgZmlsdGVyIHN0YXRlcyAqLwotCisgIFdFSUdIVElOR19TVEFURVMKKyAgZmlsdGVyW01BWF9EUkNfQ0hBTk5FTFNdOyAvKiE8IGFycmF5IGhvbGRzIHdlaWdodGluZyBmaWx0ZXIgc3RhdGVzICovCiB9OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0gY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE5MywxNDMgKzE5NCwxMTAgQEAKICAqICBQcm9maWxlIHRhYmxlcy4KICAqLwogc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEJvb3N0VGhyW10gPSB7Ci0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktNDM8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTUzPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS01NTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktNjU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTUwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS00MDw8TUVUQURBVEFfRlJBQ1RfQklUUykKLX07CisgICAgKEZJWFBfREJMKSgtKDQzIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAoRklYUF9EQkwpKC0oNTMgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgIChGSVhQX0RCTCkoLSg1NSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgKEZJWFBfREJMKSgtKDY1IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAoRklYUF9EQkwpKC0oNTAgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgIChGSVhQX0RCTCkoLSg0MCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSl9Owogc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkJvb3N0VGhyW10gPSB7Ci0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMzE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTQxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktNDE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTMxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUykKLX07CisgICAgKEZJWFBfREJMKSgtKDMxIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAoRklYUF9EQkwpKC0oNDEgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgIChGSVhQX0RCTCkoLSgzMSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgKEZJWFBfREJMKSgtKDQxIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAoRklYUF9EQkwpKC0oMzEgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgIChGSVhQX0RCTCkoLSgzMSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSl9Owogc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkVhcmx5Q3V0VGhyW10gPSB7Ci0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMjY8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTIxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0yNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMjE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTI2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0yMDw8TUVUQURBVEFfRlJBQ1RfQklUUykKLX07Ci1zdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiQ3V0VGhyW10gICAgICA9IHsKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0xNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMTE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTE2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0yMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMTY8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTEwPDxNRVRBREFUQV9GUkFDVF9CSVRTKQotfTsKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJNYXhDdXRUaHJbXSAgID0gewotICAgIChGSVhQX0RCTCkoNDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSg5PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoOTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSg0PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCi19OworICAgIChGSVhQX0RCTCkoLSgyNiA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgKEZJWFBfREJMKSgtKDIxIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAoRklYUF9EQkwpKC0oMjYgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgIChGSVhQX0RCTCkoLSgyMSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgKEZJWFBfREJMKSgtKDI2IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAoRklYUF9EQkwpKC0oMjAgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpfTsKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJDdXRUaHJbXSA9IHsoRklYUF9EQkwpKC0oMTYgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoLSgxMSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgtKDE2IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKC0oMjEgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoLSgxNiA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgtKDEwIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKX07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiTWF4Q3V0VGhyW10gPSB7CisgICAgKEZJWFBfREJMKSg0IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLCAoRklYUF9EQkwpKDkgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKSg0IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLCAoRklYUF9EQkwpKDkgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgKEZJWFBfREJMKSg0IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLCAoRklYUF9EQkwpKDQgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyl9Owogc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkJvb3N0UmF0aW9bXSA9IHsKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvNS5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvNS5mKSAtIDEuZikgKQotfTsKKyAgICBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDIuZikgLSAxLmYpKSwgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAyLmYpIC0gMS5mKSksCisgICAgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAyLmYpIC0gMS5mKSksIEZMMkZYQ09OU1RfREJMKCgoMS5mIC8gMi5mKSAtIDEuZikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgoMS5mIC8gNS5mKSAtIDEuZikpLCBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDUuZikgLSAxLmYpKX07CiBzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiRWFybHlDdXRSYXRpb1tdID0gewotICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAotICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAotICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAotICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8xLmYpIC0gMS5mKSApLAotICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApLAotICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yLmYpIC0gMS5mKSApCi19Owotc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkN1dFJhdGlvW10gICAgICA9IHsKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICksCi0gICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIwLmYpIC0gMS5mKSApLAotICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yMC5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvIDIuZikgLSAxLmYpICksCi0gICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIwLmYpIC0gMS5mKSApLAotICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yMC5mKSAtIDEuZikgKQotfTsKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJNYXhCb29zdFtdID0gewotICAgIChGSVhQX0RCTCkoIDY8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoIDY8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMTI8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMTI8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCi19Owotc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEN1dFtdICAgPSB7Ci0gICAgKEZJWFBfREJMKSgyNDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSgyNDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSgyNDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSgxNTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSgyNDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSgyNDw8TUVUQURBVEFfRlJBQ1RfQklUUykKLX07CisgICAgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAyLmYpIC0gMS5mKSksIEZMMkZYQ09OU1RfREJMKCgoMS5mIC8gMi5mKSAtIDEuZikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgoMS5mIC8gMi5mKSAtIDEuZikpLCBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDEuZikgLSAxLmYpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDIuZikgLSAxLmYpKSwgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAyLmYpIC0gMS5mKSl9Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkN1dFJhdGlvW10gPSB7CisgICAgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAyMC5mKSAtIDEuZikpLCBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDIwLmYpIC0gMS5mKSksCisgICAgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAyMC5mKSAtIDEuZikpLCBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDIuZikgLSAxLmYpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDIwLmYpIC0gMS5mKSksIEZMMkZYQ09OU1RfREJMKCgoMS5mIC8gMjAuZikgLSAxLmYpKX07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiTWF4Qm9vc3RbXSA9IHsoRklYUF9EQkwpKDYgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDYgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDEyIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgxMiA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMTUgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDE1IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpfTsKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJNYXhDdXRbXSA9IHsoRklYUF9EQkwpKDI0IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMjQgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgyNCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDE1IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMjQgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgyNCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKX07CiBzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiRmFzdEF0dGFja1tdID0gewotICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCgoMTAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoKDEwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAotICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCgoMTAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoICgwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpCi19Owotc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkZhc3REZWNheVtdICA9IHsKLSAgICBGTDJGWENPTlNUX0RCTCgoMTAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCgoMTAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCgoMTAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCgoMTAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKDIwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCggICAoMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKQotfTsKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mIC8gMTAwMC5mKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mIC8gMTAwMC5mKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpfTsKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJGYXN0RGVjYXlbXSA9IHsKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAwMC5mIC8gMTAwMC5mKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMDAwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAwMC5mIC8gMTAwMC5mKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDIwMC5mIC8gMTAwMC5mKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpfTsKIHN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJTbG93QXR0YWNrW10gPSB7Ci0gICAgRkwyRlhDT05TVF9EQkwoKDEwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAotICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoKDEwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAotICAgIEZMMkZYQ09OU1RfREJMKCAgKDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSkKLX07Ci1zdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiU2xvd0RlY2F5W10gID0gewotICAgIEZMMkZYQ09OU1RfREJMKCAoMzAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKDMwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoKDEwMDAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAotICAgIEZMMkZYQ09OU1RfREJMKCAoMzAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoICAgICgwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpCi19OworICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKX07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiU2xvd0RlY2F5W10gPSB7CisgICAgRkwyRlhDT05TVF9EQkwoKDMwMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgzMDAwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAwMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgzMDAwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAwMC5mIC8gMTAwMC5mKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpfTsKIAotc3RhdGljIGNvbnN0IElOVCB0YWJIb2xkT2ZmW10gICAgPSB7IDEwLCAxMCwgMTAsIDEwLCAxMCwgMCB9Oworc3RhdGljIGNvbnN0IElOVCB0YWJIb2xkT2ZmW10gPSB7MTAsIDEwLCAxMCwgMTAsIDEwLCAwfTsKIAotc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkF0dGFja1RocltdID0gewotICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMTA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMDw8TUVUQURBVEFfRlJBQ1RfQklUUykKLX07Ci1zdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiRGVjYXlUaHJbXSAgPSB7Ci0gICAgKEZJWFBfREJMKSgyMDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSgyMDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSgyMDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSgyMDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSgxMDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSggMDw8TUVUQURBVEFfRlJBQ1RfQklUUykKLX07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiQXR0YWNrVGhyW10gPSB7KEZJWFBfREJMKSgxNSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDE1IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMTUgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgxNSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDEwIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKX07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiRGVjYXlUaHJbXSA9IHsoRklYUF9EQkwpKDIwIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgyMCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMjAgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDIwIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgxMCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKX07CiAKIC8qKgogICogIFdlaWdodGluZyBmaWx0ZXIgY29lZmZpY2llbnRzIChiaXF1YWQgYmFuZHBhc3MpLgogICovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgYjAgPSBGTDJGWENPTlNUX0RCTCgwLjUzMDUwNjYyZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiMSA9IDAsIGIyID0gLWIwICovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgYTEgPSBGTDJGWENPTlNUX0RCTCgtMC45NTIzNzk4M2YpLCBhMiA9IEZMMkZYQ09OU1RfREJMKC0wLjAyMjQ4ODM2Zik7ICAvKiBhMCA9IDEgKi8KLQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGIwID0gRkwyRlhDT05TVF9EQkwoMC41MzA1MDY2MmYpOyAvKiBiMSA9IDAsIGIyID0gLWIwICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgYTEgPSBGTDJGWENPTlNUX0RCTCgtMC45NTIzNzk4M2YpLAorICAgICAgICAgICAgICAgICAgICAgIGEyID0gRkwyRlhDT05TVF9EQkwoLTAuMDIyNDg4MzZmKTsgLyogYTAgPSAxICovCiAKIC8qLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMzQwLDE0ICszMDgsMTIgQEAKICAqCiAgKiBccmV0dXJuICAgIHNoaWZ0RmFjdG9yCiAgKi8KLXN0YXRpYyBVSU5UIGdldFNoaWZ0RmFjdG9yKAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgIGxlbmd0aAotICAgICAgICApCi17Ci0gICAgVUlOVCBsZE47Ci0gICAgZm9yKGxkTj0xOygoKFVJTlQpMSk8PGxkTikgPCBsZW5ndGg7bGROKyspOworc3RhdGljIFVJTlQgZ2V0U2hpZnRGYWN0b3IoY29uc3QgVUlOVCBsZW5ndGgpIHsKKyAgVUlOVCBsZE47CisgIGZvciAobGROID0gMTsgKCgoVUlOVCkxKSA8PCBsZE4pIDwgbGVuZ3RoOyBsZE4rKykKKyAgICA7CiAKLSAgICByZXR1cm4gbGROOworICByZXR1cm4gbGROOwogfQogCiAvKioKQEAgLTM1NSwyOCArMzIxLDI2IEBACiAgKgogICogXHBhcmFtIHZhbHVlMSAgICAgICAgRmlyc3QgaW5wdXQgdmFsdWUuCiAgKiBccGFyYW0gcTEgICAgICAgICAgICBTY2FsaW5nIGZhY3RvciBvZiBmaXJzdCBpbnB1dCB2YWx1ZS4KLSAqIFxwYXJhbSBwVmFsdWUyICAgICAgIFBvaW50ZXIgdG8gc2Vjb25kIGlucHV0IHZhbHVlLCB3aWxsIGJlIG1vZGlmaWVkIG9uIHJldHVybi4KLSAqIFxwYXJhbSBwUTIgICAgICAgICAgIFBvaW50ZXIgdG8gc2Vjb25kIHNjYWxpbmcgZmFjdG9yLCB3aWxsIGJlIG1vZGlmaWVkIG9uIHJldHVybi4KKyAqIFxwYXJhbSBwVmFsdWUyICAgICAgIFBvaW50ZXIgdG8gc2Vjb25kIGlucHV0IHZhbHVlLCB3aWxsIGJlIG1vZGlmaWVkIG9uCisgKiByZXR1cm4uCisgKiBccGFyYW0gcFEyICAgICAgICAgICBQb2ludGVyIHRvIHNlY29uZCBzY2FsaW5nIGZhY3Rvciwgd2lsbCBiZSBtb2RpZmllZCBvbgorICogcmV0dXJuLgogICoKICAqIFxyZXR1cm4gICAgdm9pZAogICovCi1zdGF0aWMgdm9pZCBmaXhwQWRkKAotICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgICAgICAgIHZhbHVlMSwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgICAgICBxMSwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgICAgICBwVmFsdWUyLAotICAgICAgICBpbnQgKmNvbnN0ICAgICAgICAgICAgICAgICAgICAgIHBRMgotICAgICAgICApCi17Ci0gIGNvbnN0IGludCBoZWFkcm9vbTEgPSBmTm9ybXooZml4cF9hYnModmFsdWUxKSktMTsKLSAgY29uc3QgaW50IGhlYWRyb29tMiA9IGZOb3JteihmaXhwX2FicygqcFZhbHVlMikpLTE7Ci0gIGludCByZXN1bHRTY2FsZSA9IGZpeE1heChxMS1oZWFkcm9vbTEsICgqcFEyKS1oZWFkcm9vbTIpOworc3RhdGljIHZvaWQgZml4cEFkZChjb25zdCBGSVhQX0RCTCB2YWx1ZTEsIGNvbnN0IGludCBxMSwKKyAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIGNvbnN0IHBWYWx1ZTIsIGludCogY29uc3QgcFEyKSB7CisgIGNvbnN0IGludCBoZWFkcm9vbTEgPSBmTm9ybXooZml4cF9hYnModmFsdWUxKSkgLSAxOworICBjb25zdCBpbnQgaGVhZHJvb20yID0gZk5vcm16KGZpeHBfYWJzKCpwVmFsdWUyKSkgLSAxOworICBpbnQgcmVzdWx0U2NhbGUgPSBmaXhNYXgocTEgLSBoZWFkcm9vbTEsICgqcFEyKSAtIGhlYWRyb29tMik7CiAKLSAgaWYgKCAodmFsdWUxIT1GTDJGWENPTlNUX0RCTCgwLmYpKSAmJiAoKnBWYWx1ZTIhPUZMMkZYQ09OU1RfREJMKDAuZikpICkgeworICBpZiAoKHZhbHVlMSAhPSBGTDJGWENPTlNUX0RCTCgwLmYpKSAmJiAoKnBWYWx1ZTIgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkpIHsKICAgICByZXN1bHRTY2FsZSsrOwogICB9CiAKLSAgKnBWYWx1ZTIgPSBzY2FsZVZhbHVlKHZhbHVlMSwgcTEtcmVzdWx0U2NhbGUpICsgc2NhbGVWYWx1ZSgqcFZhbHVlMiwgKCpwUTIpLXJlc3VsdFNjYWxlKTsKLSAgKnBRMiA9ICgqcFZhbHVlMiE9KEZJWFBfREJMKTApID8gcmVzdWx0U2NhbGUgOiBERlJBQ1RfQklUUy0xOworICAqcFZhbHVlMiA9IHNjYWxlVmFsdWUodmFsdWUxLCBxMSAtIHJlc3VsdFNjYWxlKSArCisgICAgICAgICAgICAgc2NhbGVWYWx1ZSgqcFZhbHVlMiwgKCpwUTIpIC0gcmVzdWx0U2NhbGUpOworICAqcFEyID0gKCpwVmFsdWUyICE9IChGSVhQX0RCTCkwKSA/IHJlc3VsdFNjYWxlIDogREZSQUNUX0JJVFMgLSAxOwogfQogCiAvKioKQEAgLTM4OCw2NTEgKzM1MiwxMjI4IEBACiAgKgogICogXHJldHVybiAgICByZXN1bHQgPSAxLjAgLSBleHAoLTEuMC8oKHQpICogKGYpKSkKICAqLwotc3RhdGljIEZJWFBfREJMIHRjMkNvZWZmKAotICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgIHQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBibG9ja0xlbmd0aAotICAgICAgICApCi17Ci0gICBGSVhQX0RCTCBzYW1wbGVSYXRlRnJhY3Q7Ci0gICBGSVhQX0RCTCBibG9ja0xlbmd0aEZyYWN0OwotICAgRklYUF9EQkwgZiwgcHJvZHVjdDsKLSAgIEZJWFBfREJMIGV4cG9uZW50LCByZXN1bHQ7Ci0gICBJTlQgZV9yZXM7CitzdGF0aWMgRklYUF9EQkwgdGMyQ29lZmYoY29uc3QgRklYUF9EQkwgdCwgY29uc3QgSU5UIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrTGVuZ3RoKSB7CisgIEZJWFBfREJMIHNhbXBsZVJhdGVGcmFjdDsKKyAgRklYUF9EQkwgYmxvY2tMZW5ndGhGcmFjdDsKKyAgRklYUF9EQkwgZiwgcHJvZHVjdDsKKyAgRklYUF9EQkwgZXhwb25lbnQsIHJlc3VsdDsKKyAgSU5UIGVfcmVzOwogCi0gICAvKiBmID0gc2FtcGxlUmF0ZS9ibG9ja0xlbmd0aCAqLwotICAgc2FtcGxlUmF0ZUZyYWN0ID0gKEZJWFBfREJMKShzYW1wbGVSYXRlPDwoREZSQUNUX0JJVFMtMS1NRVRBREFUQV9MSU5UX0JJVFMpKTsKLSAgIGJsb2NrTGVuZ3RoRnJhY3QgPSAoRklYUF9EQkwpKGJsb2NrTGVuZ3RoPDwoREZSQUNUX0JJVFMtMS1NRVRBREFUQV9MSU5UX0JJVFMpKTsKLSAgIGYgPSBmRGl2Tm9ybShzYW1wbGVSYXRlRnJhY3QsIGJsb2NrTGVuZ3RoRnJhY3QsICZlX3Jlcyk7Ci0gICBmID0gc2NhbGVWYWx1ZShmLCBlX3Jlcy1NRVRBREFUQV9JTlRfQklUUyk7IC8qIGNvbnZlcnQgdG8gTUVUQURBVEFfRlJBQ1QgKi8KKyAgLyogZiA9IHNhbXBsZVJhdGUvYmxvY2tMZW5ndGggKi8KKyAgc2FtcGxlUmF0ZUZyYWN0ID0KKyAgICAgIChGSVhQX0RCTCkoc2FtcGxlUmF0ZSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTUVUQURBVEFfTElOVF9CSVRTKSk7CisgIGJsb2NrTGVuZ3RoRnJhY3QgPQorICAgICAgKEZJWFBfREJMKShibG9ja0xlbmd0aCA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTUVUQURBVEFfTElOVF9CSVRTKSk7CisgIGYgPSBmRGl2Tm9ybShzYW1wbGVSYXRlRnJhY3QsIGJsb2NrTGVuZ3RoRnJhY3QsICZlX3Jlcyk7CisgIGYgPSBzY2FsZVZhbHVlKGYsIGVfcmVzIC0gTUVUQURBVEFfSU5UX0JJVFMpOyAvKiBjb252ZXJ0IHRvIE1FVEFEQVRBX0ZSQUNUICovCiAKLSAgIC8qIHByb2R1Y3QgPSB0KmYgKi8KLSAgIHByb2R1Y3QgPSBmTXVsdE5vcm0odCwgZiwgJmVfcmVzKTsKLSAgIHByb2R1Y3QgPSBzY2FsZVZhbHVlKHByb2R1Y3QsIGVfcmVzK01FVEFEQVRBX0lOVF9CSVRTKTsgLyogY29udmVydCB0byBNRVRBREFUQV9GUkFDVCAqLworICAvKiBwcm9kdWN0ID0gdCpmICovCisgIHByb2R1Y3QgPSBmTXVsdE5vcm0odCwgZiwgJmVfcmVzKTsKKyAgcHJvZHVjdCA9IHNjYWxlVmFsdWUoCisgICAgICBwcm9kdWN0LCBlX3JlcyArIE1FVEFEQVRBX0lOVF9CSVRTKTsgLyogY29udmVydCB0byBNRVRBREFUQV9GUkFDVCAqLwogCi0gICAvKiBleHBvbmVudCA9ICgtMS4wLygodCkgKiAoZikpKSAqLwotICAgZXhwb25lbnQgPSBmRGl2Tm9ybShNRVRBREFUQV9GUkFDVF9TQ0FMRSwgcHJvZHVjdCwgJmVfcmVzKTsKLSAgIGV4cG9uZW50ID0gc2NhbGVWYWx1ZShleHBvbmVudCwgZV9yZXMtTUVUQURBVEFfSU5UX0JJVFMpOyAvKiBjb252ZXJ0IHRvIE1FVEFEQVRBX0ZSQUNUICovCisgIC8qIGV4cG9uZW50ID0gKC0xLjAvKCh0KSAqIChmKSkpICovCisgIGV4cG9uZW50ID0gZkRpdk5vcm0oTUVUQURBVEFfRlJBQ1RfU0NBTEUsIHByb2R1Y3QsICZlX3Jlcyk7CisgIGV4cG9uZW50ID0gc2NhbGVWYWx1ZSgKKyAgICAgIGV4cG9uZW50LCBlX3JlcyAtIE1FVEFEQVRBX0lOVF9CSVRTKTsgLyogY29udmVydCB0byBNRVRBREFUQV9GUkFDVCAqLwogCi0gICAvKiBleHBvbmVudCAqIGxkKGUpICovCi0gICBleHBvbmVudCA9IGZNdWx0KGV4cG9uZW50LEZJWFBfSUxPRzJfRElWMik8PDE7IC8qIGVeKHgpID0gMl4oeCpsZChlKSkgKi8KKyAgLyogZXhwb25lbnQgKiBsZChlKSAqLworICBleHBvbmVudCA9IGZNdWx0KGV4cG9uZW50LCBGSVhQX0lMT0cyX0RJVjIpIDw8IDE7IC8qIGVeKHgpID0gMl4oeCpsZChlKSkgKi8KIAotICAgLyogZXhwKC0xLjAvKCh0KSAqIChmKSkpICovCi0gICByZXN1bHQgPSBmMlBvdygtZXhwb25lbnQsIERGUkFDVF9CSVRTLTEtTUVUQURBVEFfRlJBQ1RfQklUUywgJmVfcmVzKTsKKyAgLyogZXhwKC0xLjAvKCh0KSAqIChmKSkpICovCisgIHJlc3VsdCA9IGYyUG93KC1leHBvbmVudCwgREZSQUNUX0JJVFMgLSAxIC0gTUVUQURBVEFfRlJBQ1RfQklUUywgJmVfcmVzKTsKIAotICAgLyogcmVzdWx0ID0gMS4wIC0gZXhwKC0xLjAvKCh0KSAqIChmKSkpICovCi0gICByZXN1bHQgPSAoRklYUF9EQkwpTUFYVkFMX0RCTCAtIHNjYWxlVmFsdWUocmVzdWx0LCBlX3Jlcyk7CisgIC8qIHJlc3VsdCA9IDEuMCAtIGV4cCgtMS4wLygodCkgKiAoZikpKSAqLworICByZXN1bHQgPSAoRklYUF9EQkwpTUFYVkFMX0RCTCAtIHNjYWxlVmFsdWUocmVzdWx0LCBlX3Jlcyk7CiAKLSAgIHJldHVybiByZXN1bHQ7CisgIHJldHVybiByZXN1bHQ7CiB9CiAKLUlOVCBGREtfRFJDX0dlbmVyYXRvcl9PcGVuKAotICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgKnBoRHJjQ29tcAotICAgICAgICApCi17Ci0gICAgSU5UIGVyciA9IDA7Ci0gICAgSERSQ19DT01QIGhEY0NvbXAgPSBOVUxMOworc3RhdGljIHZvaWQgZmluZFBlYWtMZXZlbHMoSERSQ19DT01QIGRyY0NvbXAsIGNvbnN0IElOVF9QQ00qIGNvbnN0IGluU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGNsZXYsIGNvbnN0IEZJWFBfREJMIHNsZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBleHRfbGV2YSwgY29uc3QgRklYUF9EQkwgZXh0X2xldmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBsZmVfbGV2LCBjb25zdCBGSVhQX0RCTCBkbXhHYWluNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGRteEdhaW4yLCBGSVhQX0RCTCBwZWFrWzJdKSB7CisgIGludCBpLCBjOworICBGSVhQX0RCTCB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICBJTlRfUENNIG1heFNhbXBsZSA9IDA7CiAKLSAgICBpZiAocGhEcmNDb21wID09IE5VTEwpIHsKLSAgICAgIGVyciA9IC0xOwotICAgICAgZ290byBiYWlsOworICAvKiBmaW5kIHBlYWsgbGV2ZWwgKi8KKyAgcGVha1swXSA9IHBlYWtbMV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICBmb3IgKGkgPSAwOyBpIDwgZHJjQ29tcC0+YmxvY2tMZW5ndGg7IGkrKykgeworICAgIGNvbnN0IElOVF9QQ00qIHBTYW1wbGVzID0gJmluU2FtcGxlc1tpICogZHJjQ29tcC0+Y2hhbm5lbHNdOworCisgICAgLyogc2luZ2xlIGNoYW5uZWxzICovCisgICAgZm9yIChjID0gMDsgYyA8IChpbnQpZHJjQ29tcC0+Y2hhbm5lbHM7IGMrKykgeworICAgICAgbWF4U2FtcGxlID0gZk1heChtYXhTYW1wbGUsIChJTlRfUENNKWZBYnMocFNhbXBsZXNbY10pKTsKKyAgICB9CisgIH0KKyAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBGWF9QQ00yRlhfREJMKG1heFNhbXBsZSkgPj4gRE9XTk1JWF9TSElGVCk7CisKKyAgLyogNy4xLzYuMSB0byA1LjEgZG93bm1peGVzICovCisgIGlmIChkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPiA1KSB7CisgICAgZm9yIChpID0gMDsgaSA8IGRyY0NvbXAtPmJsb2NrTGVuZ3RoOyBpKyspIHsKKyAgICAgIGNvbnN0IElOVF9QQ00qIHBTYW1wbGVzID0gJmluU2FtcGxlc1tpICogZHJjQ29tcC0+Y2hhbm5lbHNdOworCisgICAgICAvKiBjaGFubmVsIDEgKEwsIExzLC4uLikgKi8KKyAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICBzd2l0Y2ggKGRyY0NvbXAtPmNoYW5Db25maWcpIHsKKyAgICAgICAgY2FzZSBNT0RFXzZfMToKKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZhLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs0XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNl1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDcyAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfN18xX0JBQ0s6CisgICAgICAgIGNhc2UgTU9ERV83XzFfUkVBUl9TVVJST1VORDoKKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZhLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs0XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbN11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMcnMgLyBMc3MgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzBdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBMICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbN11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMYyAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfN18xX1RPUF9GUk9OVDoKKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZhLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFswXV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEwgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZiLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs3XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEx2aCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBmaXhwX2Ficyh0bXApKTsKKworICAgICAgLyogY2hhbm5lbCAyIChSLCBScywuLi4pICovCisgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgICAgc3dpdGNoIChkcmNDb21wLT5jaGFuQ29uZmlnKSB7CisgICAgICAgIGNhc2UgTU9ERV82XzE6CisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNV1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBScyAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzZdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQ3MgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9CQUNLOgorICAgICAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNV1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBScyAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzhdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnJzIC8gUnNzICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6CisgICAgICAgIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgorICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsxXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogUiAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzhdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUmMgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9UT1BfRlJPTlQ6CisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMV1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBSICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbOF1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBSdmggKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgZml4cF9hYnModG1wKSk7CisKKyAgICAgIC8qIGNoYW5uZWwgMyAoQykgKi8KKyAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICBzd2l0Y2ggKGRyY0NvbXAtPmNoYW5Db25maWcpIHsKKyAgICAgICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzJdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBDICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbN11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMYyAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmEsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzhdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUmMgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgZml4cF9hYnModG1wKSk7CisKKyAgICB9IC8qIGZvciAoYmxvY2tsZW5ndGgpICovCisKKyAgICAvKiB0YWtlIGRvd25taXggZ2FpbiBpbnRvIGFjY291dCAqLworICAgIHBlYWtbMF0gPSBmTXVsdChkbXhHYWluNSwgcGVha1swXSkKKyAgICAgICAgICAgICAgPDwgKERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0ZSQUNUX0JJVFMpOworICB9CisKKyAgLyogNy4xIC8gNS4xIHRvIHN0ZXJlbyBkb3dubWl4ZXMgKi8KKyAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDIpIHsKKyAgICAvKiBMdC9SdCBkb3dubWl4ICovCisgICAgZm9yIChpID0gMDsgaSA8IGRyY0NvbXAtPmJsb2NrTGVuZ3RoOyBpKyspIHsKKyAgICAgIGNvbnN0IElOVF9QQ00qIHBTYW1wbGVzID0gJmluU2FtcGxlc1tpICogZHJjQ29tcC0+Y2hhbm5lbHNdOworCisgICAgICAvKiBMdCAqLworICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKQorICAgICAgICB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFNdXSkgPj4KKyAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzICovCisgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApCisgICAgICAgIHRtcCAtPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdXSkgPj4KKyAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzMiAqLworICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApCisgICAgICAgIHRtcCAtPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSU11dKSA+PgorICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkKKyAgICAgICAgdG1wIC09IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTMl1dKSA+PgorICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMyICovCisgICAgICBpZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkpCisgICAgICAgIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7IC8qIDcuMWNoICovCisgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA+PSAwKQorICAgICAgICB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKSA+PgorICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUyAqLworICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPj0gMCkKKyAgICAgICAgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSkgPj4KKyAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEMgKi8KKyAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMXV0pID4+CisgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBMICovCisKKyAgICAgIC8qIGFwcGx5IHNjYWxpbmcgb2YgZG93bm1peCBnYWlucyAqLworICAgICAgLyogb25seSBmb3IgcG9zaXRpdmUgdmFsdWVzIG9ubHksIGFzIGxlZ2FjeSBkZWNvZGVycyBtaWdodCBub3Qga25vdyB0aGlzCisgICAgICAgKiBwYXJhbWV0ZXIgKi8KKyAgICAgIGlmIChkbXhHYWluMiA+IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgICAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDUpIHsKKyAgICAgICAgICB0bXAgPSBmTXVsdChkbXhHYWluNSwgdG1wKSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTUVUQURBVEFfRlJBQ1RfQklUUyk7CisgICAgICAgIH0KKyAgICAgICAgdG1wID0gZk11bHQoZG14R2FpbjIsIHRtcCkgPDwgKERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0ZSQUNUX0JJVFMpOworICAgICAgfQorICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBmaXhwX2Ficyh0bXApKTsKKworICAgICAgLyogUnQgKi8KKyAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkKKyAgICAgICAgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTXV0pID4+CisgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMcyAqLworICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKQorICAgICAgICB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXV0pID4+CisgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMczIgKi8KKyAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKQorICAgICAgICB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlNdXSkgPj4KKyAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzICovCisgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApCisgICAgICAgIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdXSkgPj4KKyAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzMiAqLworICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApKQorICAgICAgICB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAvKiA3LjFjaCAqLworICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkKKyAgICAgICAgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSkgPj4KKyAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFMgKi8KKyAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0NdID49IDApCisgICAgICAgIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pID4+CisgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICovCisgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUl1dKSA+PgorICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogUiAqLworCisgICAgICAvKiBhcHBseSBzY2FsaW5nIG9mIGRvd25taXggZ2FpbnMgKi8KKyAgICAgIC8qIG9ubHkgZm9yIHBvc2l0aXZlIHZhbHVlcyBvbmx5LCBhcyBsZWdhY3kgZGVjb2RlcnMgbWlnaHQgbm90IGtub3cgdGhpcworICAgICAgICogcGFyYW1ldGVyICovCisgICAgICBpZiAoZG14R2FpbjIgPiBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgICAgIGlmIChkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPiA1KSB7CisgICAgICAgICAgdG1wID0gZk11bHQoZG14R2FpbjUsIHRtcCkgPDwgKERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0ZSQUNUX0JJVFMpOworICAgICAgICB9CisgICAgICAgIHRtcCA9IGZNdWx0KGRteEdhaW4yLCB0bXApIDw8IChERlJBQ1RfQklUUyAtIDEgLSBNRVRBREFUQV9GUkFDVF9CSVRTKTsKKyAgICAgIH0KKyAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgZml4cF9hYnModG1wKSk7CiAgICAgfQogCi0gICAgLyogYWxsb2NhdGUgbWVtb3J5ICovCi0gICAgaERjQ29tcCA9IChIRFJDX0NPTVApRkRLY2FsbG9jKDEsIHNpemVvZihEUkNfQ09NUCkpOworICAgIC8qIExvL1JvIGRvd25taXggKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZHJjQ29tcC0+YmxvY2tMZW5ndGg7IGkrKykgeworICAgICAgY29uc3QgSU5UX1BDTSogcFNhbXBsZXMgPSAmaW5TYW1wbGVzW2kgKiBkcmNDb21wLT5jaGFubmVsc107CiAKLSAgICBpZiAoaERjQ29tcCA9PSBOVUxMKSB7Ci0gICAgICBlcnIgPSAtMTsKLSAgICAgIGdvdG8gYmFpbDsKKyAgICAgIC8qIExvICovCisgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgICAgc3dpdGNoIChkcmNDb21wLT5jaGFuQ29uZmlnKSB7CisgICAgICAgIGNhc2UgTU9ERV82XzE6CisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChzbGV2LCBleHRfbGV2YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs0XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChzbGV2LCBleHRfbGV2YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs2XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIENzICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsyXV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEMgKi8KKyAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMF1dKSA+PgorICAgICAgICAgICAgICAgICAgRE9XTk1JWF9TSElGVCk7IC8qIEwgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGxmZV9sZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxIC0gTEZFX0xFVl9TQ0FMRSk7IC8qIExGRSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfN18xX0JBQ0s6CisgICAgICAgIGNhc2UgTU9ERV83XzFfUkVBUl9TVVJST1VORDoKKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzRdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzddXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHJzIC8gTHNzKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzJdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQyAqLworICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFswXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogTCAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIobGZlX2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbM11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEgLSBMRkVfTEVWX1NDQUxFKTsgLyogTEZFICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6CisgICAgICAgIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgorICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFswXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogTCAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzddXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTGMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KGV4dF9sZXZhLCBjbGV2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzddXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTGMgLSBzZWNvbmQgcGF0aCovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsyXV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzRdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHMgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGxmZV9sZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxIC0gTEZFX0xFVl9TQ0FMRSk7IC8qIExGRSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfN18xX1RPUF9GUk9OVDoKKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZhLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFswXV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEwgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZiLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs3XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEx2aCAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMl1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs0XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihsZmVfbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFszXV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSAtIExGRV9MRVZfU0NBTEUpOyAvKiBMRkUgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICAgIGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMU11dKSA+PgorICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzICovCisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKQorICAgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgICAgZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTMl1dKSA+PgorICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzMiAqLworICAgICAgICAgIGlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSkKKyAgICAgICAgICAgIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7IC8qIDcuMWNoICovCisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICAgIGZNdWx0RGl2MihzbGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKSkgPj4KKyAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBTICovCisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICAgIGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pID4+CisgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQyAqLworICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4WzNdID49IDApCisgICAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGxmZV9sZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEgLSBMRkVfTEVWX1NDQUxFKTsgLyogTEZFICovCisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBMICovCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIGFwcGx5IHNjYWxpbmcgb2YgZG93bm1peCBnYWlucyAqLworICAgICAgLyogb25seSBmb3IgcG9zaXRpdmUgdmFsdWVzIG9ubHksIGFzIGxlZ2FjeSBkZWNvZGVycyBtaWdodCBub3Qga25vdyB0aGlzCisgICAgICAgKiBwYXJhbWV0ZXIgKi8KKyAgICAgIGlmIChkbXhHYWluMiA+IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgICAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDUpIHsKKyAgICAgICAgICB0bXAgPSBmTXVsdChkbXhHYWluNSwgdG1wKSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTUVUQURBVEFfRlJBQ1RfQklUUyk7CisgICAgICAgIH0KKyAgICAgICAgdG1wID0gZk11bHQoZG14R2FpbjIsIHRtcCkgPDwgKERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0ZSQUNUX0JJVFMpOworICAgICAgfQorICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBmaXhwX2Ficyh0bXApKTsKKworICAgICAgLyogUm8gKi8KKyAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICBzd2l0Y2ggKGRyY0NvbXAtPmNoYW5Db25maWcpIHsKKyAgICAgICAgY2FzZSBNT0RFXzZfMToKKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzVdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzZdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQ3MgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzJdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQyAqLworICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsxXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogUiAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIobGZlX2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbM11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEgLSBMRkVfTEVWX1NDQUxFKTsgLyogTEZFICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV83XzFfQkFDSzoKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgorICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoZk11bHQoc2xldiwgZXh0X2xldmEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNV1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBScyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoZk11bHQoc2xldiwgZXh0X2xldmIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbOF1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBScnMgLyBSc3MqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMl1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICovCisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzFdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBSICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihsZmVfbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFszXV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSAtIExGRV9MRVZfU0NBTEUpOyAvKiBMRkUgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzFdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBSICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbOF1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBSYyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoZk11bHQoZXh0X2xldmEsIGNsZXYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbOF1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBSYyAtIHNlY29uZCBwYXRoKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzJdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNV1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBScyAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIobGZlX2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbM11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEgLSBMRkVfTEVWX1NDQUxFKTsgLyogTEZFICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV83XzFfVE9QX0ZST05UOgorICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmEsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzFdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUiAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzhdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnZoICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsyXV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzVdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGxmZV9sZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxIC0gTEZFX0xFVl9TQ0FMRSk7IC8qIExGRSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKQorICAgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgICAgZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTXV0pID4+CisgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApCisgICAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgICBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXV0pID4+CisgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMyICovCisgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApKQorICAgICAgICAgICAgdG1wID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgdG1wKTsgLyogNy4xY2ggKi8KKyAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA+PSAwKQorICAgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgICAgZk11bHREaXYyKHNsZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtTXV0pKSA+PgorICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFMgKi8KKyAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKQorICAgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgICAgZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSkgPj4KKyAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICovCisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbM10gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIobGZlX2xldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbM11dKSA+PgorICAgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSAtIExGRV9MRVZfU0NBTEUpOyAvKiBMRkUgKi8KKyAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUl1dKSA+PgorICAgICAgICAgICAgICAgICAgRE9XTk1JWF9TSElGVCk7IC8qIFIgKi8KKyAgICAgIH0KKworICAgICAgLyogYXBwbHkgc2NhbGluZyBvZiBkb3dubWl4IGdhaW5zICovCisgICAgICAvKiBvbmx5IGZvciBwb3NpdGl2ZSB2YWx1ZXMgb25seSwgYXMgbGVnYWN5IGRlY29kZXJzIG1pZ2h0IG5vdCBrbm93IHRoaXMKKyAgICAgICAqIHBhcmFtZXRlciAqLworICAgICAgaWYgKGRteEdhaW4yID4gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgICBpZiAoZHJjQ29tcC0+ZnVsbENoYW5uZWxzID4gNSkgeworICAgICAgICAgIHRtcCA9IGZNdWx0KGRteEdhaW41LCB0bXApIDw8IChERlJBQ1RfQklUUyAtIDEgLSBNRVRBREFUQV9GUkFDVF9CSVRTKTsKKyAgICAgICAgfQorICAgICAgICB0bXAgPSBmTXVsdChkbXhHYWluMiwgdG1wKSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTUVUQURBVEFfRlJBQ1RfQklUUyk7CisgICAgICB9CisgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOwogICAgIH0KKyAgfQogCi0gICAgRkRLbWVtY2xlYXIoaERjQ29tcCwgc2l6ZW9mKERSQ19DT01QKSk7CisgIHBlYWtbMV0gPSBmaXhNYXgocGVha1swXSwgcGVha1sxXSk7CiAKLSAgICAvKiBSZXR1cm4gZHJjIGNvbXByZXNzb3IgaW5zdGFuY2UgKi8KLSAgICAqcGhEcmNDb21wID0gaERjQ29tcDsKLSAgICByZXR1cm4gZXJyOworICAvKiBNb25vIERvd25taXggLSBmb3IgY29tcF92YWwgb25seSAqLworICBpZiAoZHJjQ29tcC0+ZnVsbENoYW5uZWxzID4gMSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBkcmNDb21wLT5ibG9ja0xlbmd0aDsgaSsrKSB7CisgICAgICBjb25zdCBJTlRfUENNKiBwU2FtcGxlcyA9ICZpblNhbXBsZXNbaSAqIGRyY0NvbXAtPmNoYW5uZWxzXTsKKworICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgIHN3aXRjaCAoZHJjQ29tcC0+Y2hhbkNvbmZpZykgeworICAgICAgICBjYXNlIE1PREVfNl8xOgorICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoZk11bHQoc2xldiwgZXh0X2xldmEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNF1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMcyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoZk11bHQoc2xldiwgZXh0X2xldmEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNV1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBScyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdChmTXVsdChzbGV2LCBleHRfbGV2YiksCisgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzZdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQ3MgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHQoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMl1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICovCisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzBdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBMICovCisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzFdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBSICovCisgICAgICAgICAgdG1wICs9IGZNdWx0KGxmZV9sZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxIC0gTEZFX0xFVl9TQ0FMRSk7IC8qIExGRSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfN18xX0JBQ0s6CisgICAgICAgIGNhc2UgTU9ERV83XzFfUkVBUl9TVVJST1VORDoKKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzRdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzVdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzddXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHJzIC8gTHNzKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzhdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnJzIC8gUnNzKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHQoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMl1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICovCisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzBdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBMICovCisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzFdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBSICovCisgICAgICAgICAgdG1wICs9IGZNdWx0KGxmZV9sZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxIC0gTEZFX0xFVl9TQ0FMRSk7IC8qIExGRSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfMV8yXzJfMl8xOgorICAgICAgICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKKyAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMF1dKSA+PgorICAgICAgICAgICAgICAgICAgRE9XTk1JWF9TSElGVCk7IC8qIEwgKi8KKyAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMV1dKSA+PgorICAgICAgICAgICAgICAgICAgRE9XTk1JWF9TSElGVCk7IC8qIFIgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZiLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs3XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExjICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbOF1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBSYyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoZk11bHQoZXh0X2xldmEsIGNsZXYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbN11dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMYyAtIHNlY29uZCBwYXRoKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KGV4dF9sZXZhLCBjbGV2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzhdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUmMgLSBzZWNvbmQgcGF0aCovCisgICAgICAgICAgdG1wICs9IGZNdWx0KGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzJdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNF1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMcyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNV1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBScyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdChsZmVfbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFszXV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSAtIExGRV9MRVZfU0NBTEUpOyAvKiBMRkUgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9UT1BfRlJPTlQ6CisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMF1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMV1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBSICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbN11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMdmggKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZiLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs4XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJ2aCAqLworICAgICAgICAgIHRtcCArPSBmTXVsdChjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsyXV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzRdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzVdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHQobGZlX2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbM11dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEgLSBMRkVfTEVWX1NDQUxFKTsgLyogTEZFICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApCisgICAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgICBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFNdXSkgPj4KKyAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMcyAqLworICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICAgIGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdXSkgPj4KKyAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMczIgKi8KKyAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICAgIGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSU11dKSA+PgorICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzICovCisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKQorICAgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgICAgZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTMl1dKSA+PgorICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzMiAqLworICAgICAgICAgIGlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSkKKyAgICAgICAgICAgIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7IC8qIDcuMWNoICovCisgICAgICAgICAgLyppZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkpIHRtcCAqPTAuNzA3ZjsqLyAvKiA3LjFjaCAqLworICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApCisgICAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgICBmTXVsdERpdjIoc2xldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSkpID4+CisgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUyAqLworICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0NdID49IDApCisgICAgICAgICAgICB0bXAgKz0gZk11bHQoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbQ11dKSA+PgorICAgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEMgKDIqY2xldikgKi8KKyAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFszXSA+PSAwKQorICAgICAgICAgICAgdG1wICs9IGZNdWx0KGxmZV9sZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEgLSBMRkVfTEVWX1NDQUxFKTsgLyogTEZFICovCisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBMICovCisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBSICovCisgICAgICB9CisKKyAgICAgIC8qIGFwcGx5IHNjYWxpbmcgb2YgZG93bm1peCBnYWlucyAqLworICAgICAgLyogb25seSBmb3IgcG9zaXRpdmUgdmFsdWVzIG9ubHksIGFzIGxlZ2FjeSBkZWNvZGVycyBtaWdodCBub3Qga25vdyB0aGlzCisgICAgICAgKiBwYXJhbWV0ZXIgKi8KKyAgICAgIGlmIChkbXhHYWluMiA+IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgICAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDUpIHsKKyAgICAgICAgICB0bXAgPSBmTXVsdChkbXhHYWluNSwgdG1wKSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTUVUQURBVEFfRlJBQ1RfQklUUyk7CisgICAgICAgIH0KKyAgICAgICAgdG1wID0gZk11bHQoZG14R2FpbjIsIHRtcCkgPDwgKERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0ZSQUNUX0JJVFMpOworICAgICAgfQorICAgICAgcGVha1sxXSA9IGZpeE1heChwZWFrWzFdLCBmaXhwX2Ficyh0bXApKTsKKyAgICB9CisgIH0KK30KKworSU5UIEZES19EUkNfR2VuZXJhdG9yX09wZW4oSERSQ19DT01QKiBwaERyY0NvbXApIHsKKyAgSU5UIGVyciA9IDA7CisgIEhEUkNfQ09NUCBoRGNDb21wID0gTlVMTDsKKworICBpZiAocGhEcmNDb21wID09IE5VTEwpIHsKKyAgICBlcnIgPSAtMTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgaERjQ29tcCA9IChIRFJDX0NPTVApRkRLY2FsbG9jKDEsIHNpemVvZihEUkNfQ09NUCkpOworCisgIGlmIChoRGNDb21wID09IE5VTEwpIHsKKyAgICBlcnIgPSAtMTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBGREttZW1jbGVhcihoRGNDb21wLCBzaXplb2YoRFJDX0NPTVApKTsKKworICAvKiBSZXR1cm4gZHJjIGNvbXByZXNzb3IgaW5zdGFuY2UgKi8KKyAgKnBoRHJjQ29tcCA9IGhEY0NvbXA7CisgIHJldHVybiBlcnI7CiBiYWlsOgotICAgIEZES19EUkNfR2VuZXJhdG9yX0Nsb3NlKCZoRGNDb21wKTsKLSAgICByZXR1cm4gZXJyOworICBGREtfRFJDX0dlbmVyYXRvcl9DbG9zZSgmaERjQ29tcCk7CisgIHJldHVybiBlcnI7CiB9CiAKLUlOVCBGREtfRFJDX0dlbmVyYXRvcl9DbG9zZSgKLSAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICpwaERyY0NvbXAKLSAgICAgICAgKQotewotICAgIGlmIChwaERyY0NvbXAgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoKnBoRHJjQ29tcCAhPSBOVUxMKSB7Ci0gICAgICBGREtmcmVlKCpwaERyY0NvbXApOwotICAgICAgKnBoRHJjQ29tcCA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiAwOworSU5UIEZES19EUkNfR2VuZXJhdG9yX0Nsb3NlKEhEUkNfQ09NUCogcGhEcmNDb21wKSB7CisgIGlmIChwaERyY0NvbXAgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoKnBoRHJjQ29tcCAhPSBOVUxMKSB7CisgICAgRkRLZnJlZSgqcGhEcmNDb21wKTsKKyAgICAqcGhEcmNDb21wID0gTlVMTDsKKyAgfQorICByZXR1cm4gMDsKIH0KIAorSU5UIEZES19EUkNfR2VuZXJhdG9yX0luaXRpYWxpemUoSERSQ19DT01QIGRyY0NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEUkNfUFJPRklMRSBwcm9maWxlTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19QUk9GSUxFIHByb2ZpbGVSRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja0xlbmd0aCwgY29uc3QgVUlOVCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9PUkRFUiBjaGFubmVsT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiB1c2VXZWlnaHRpbmcpIHsKKyAgaW50IGk7CisgIENIQU5ORUxfTUFQUElORyBjaGFubmVsTWFwcGluZzsKIAotSU5UIEZES19EUkNfR2VuZXJhdG9yX0luaXRpYWxpemUoCi0gICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgZHJjQ29tcCwKLSAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlTGluZSwKLSAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlUkYsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tMZW5ndGgsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFICAgICAgICAgICAgICBjaGFubmVsTW9kZSwKLSAgICAgICAgY29uc3QgQ0hBTk5FTF9PUkRFUiAgICAgICAgICAgICBjaGFubmVsT3JkZXIsCi0gICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgICAgICAgICAgdXNlV2VpZ2h0aW5nCi0gICAgICAgICkKLXsKLSAgICBpbnQgaTsKLSAgICBDSEFOTkVMX01BUFBJTkcgY2hhbm5lbE1hcHBpbmc7CisgIGRyY0NvbXAtPmxpbURlY2F5ID0KKyAgICAgIEZMMkZYQ09OU1RfREJMKCgoMC4wMDZmIC8gMjU2KSAqIGJsb2NrTGVuZ3RoKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSk7CiAKLSAgICBkcmNDb21wLT5saW1EZWNheSA9IEZMMkZYQ09OU1RfREJMKCAoKDAuMDA2ZiAvIDI1NikgKiBibG9ja0xlbmd0aCkgLyBNRVRBREFUQV9JTlRfU0NBTEUgKTsKKyAgLyogU2F2ZSBwYXJhbWV0ZXJzLiAqLworICBkcmNDb21wLT5ibG9ja0xlbmd0aCA9IGJsb2NrTGVuZ3RoOworICBkcmNDb21wLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgZHJjQ29tcC0+Y2hhbkNvbmZpZyA9IGNoYW5uZWxNb2RlOworICBkcmNDb21wLT51c2VXZWlnaHRpbmcgPSB1c2VXZWlnaHRpbmc7CiAKLSAgICAvKiBTYXZlIHBhcmFtZXRlcnMuICovCi0gICAgZHJjQ29tcC0+YmxvY2tMZW5ndGggPSBibG9ja0xlbmd0aDsKLSAgICBkcmNDb21wLT5zYW1wbGVSYXRlICA9IHNhbXBsZVJhdGU7Ci0gICAgZHJjQ29tcC0+Y2hhbkNvbmZpZyA9IGNoYW5uZWxNb2RlOwotICAgIGRyY0NvbXAtPnVzZVdlaWdodGluZyA9IHVzZVdlaWdodGluZzsKKyAgaWYgKEZES19EUkNfR2VuZXJhdG9yX3NldERyY1Byb2ZpbGUoZHJjQ29tcCwgcHJvZmlsZUxpbmUsIHByb2ZpbGVSRikgIT0KKyAgICAgIDApIHsgLyogZXhwZWN0cyBpbml0aWFsaXplZCBibG9ja0xlbmd0aCBhbmQgc2FtcGxlUmF0ZSAqLworICAgIHJldHVybiAoLTEpOworICB9CiAKLSAgICBpZiAoRkRLX0RSQ19HZW5lcmF0b3Jfc2V0RHJjUHJvZmlsZShkcmNDb21wLCBwcm9maWxlTGluZSwgcHJvZmlsZVJGKSE9MCkgeyAvKiBleHBlY3RzIGluaXRpYWxpemVkIGJsb2NrTGVuZ3RoIGFuZCBzYW1wbGVSYXRlICovCi0gICAgICByZXR1cm4gKC0xKTsKLSAgICB9CisgIC8qIFNldCBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGNoYW5uZWwgb2Zmc2V0cy4gKi8KKyAgaWYgKEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoY2hhbm5lbE1vZGUsIGNoYW5uZWxPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxNYXBwaW5nKSAhPSBBQUNfRU5DX09LKSB7CisgICAgcmV0dXJuICgtMik7CisgIH0KIAotICAgIC8qIFNldCBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGNoYW5uZWwgb2Zmc2V0cy4gKi8KLSAgICBpZiAoRkRLYWFjRW5jX0luaXRDaGFubmVsTWFwcGluZyhjaGFubmVsTW9kZSwgY2hhbm5lbE9yZGVyLCAmY2hhbm5lbE1hcHBpbmcpIT1BQUNfRU5DX09LKSB7Ci0gICAgICByZXR1cm4gKC0yKTsKLSAgICB9CisgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIGRyY0NvbXAtPmNoYW5uZWxJZHhbaV0gPSAtMTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIGRyY0NvbXAtPmNoYW5uZWxJZHhbaV0gPSAtMTsKLQotICAgIHN3aXRjaCAoY2hhbm5lbE1vZGUpIHsKKyAgc3dpdGNoIChjaGFubmVsTW9kZSkgewogICAgIGNhc2UgTU9ERV8xOiAvKiBtb25vICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07Ci0gICAgICAgIGJyZWFrOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07CisgICAgICBicmVhazsKICAgICBjYXNlIE1PREVfMjogLyogc3RlcmVvICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07Ci0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMV07Ci0gICAgICAgIGJyZWFrOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFsxXTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgTU9ERV8xXzI6IC8qIDNjaCAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBicmVhazsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgTU9ERV8xXzJfMTogLyogNGNoICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMF07Ci0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07Ci0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07Ci0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07Ci0gICAgICAgIGJyZWFrOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMF07CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07CisgICAgICBicmVhazsKICAgICBjYXNlIE1PREVfMV8yXzI6IC8qIDVjaCAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1PREVfMV8yXzJfMTogIC8qIDUuMSBjaCAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOwotICAgICAgICBicmVhazsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV8xXzJfMl8xOiAvKiA1LjEgY2ggKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTEZFXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1szXS5DaGFubmVsSW5kZXhbMF07CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMV07CisgICAgICBicmVhazsKICAgICBjYXNlIE1PREVfMV8yXzJfMl8xOiAvKiA3LjEgY2ggKi8KICAgICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsgLyogbCAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOyAvKiByICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07IC8qIGMgKi8KLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzRdLkNoYW5uZWxJbmRleFswXTsgLyogbGZlICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1szXS5DaGFubmVsSW5kZXhbMF07IC8qIGxzICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1szXS5DaGFubmVsSW5kZXhbMV07IC8qIHJzICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMF07IC8qIGxjICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07IC8qIHJjICovCi0gICAgICAgIGJyZWFrOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07IC8qIGwgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOyAvKiByICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsgLyogYyAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bNF0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsZmUgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzBdOyAvKiBscyAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPQorICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLmVsSW5mb1szXS5DaGFubmVsSW5kZXhbMV07IC8qIHJzICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPQorICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMF07IC8qIGxjICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPQorICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07IC8qIHJjICovCisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfN18xX0JBQ0s6CiAgICAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07IC8qIHIgKi8KLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsgLyogYyAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bNF0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsZmUgKi8KLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzNdLkNoYW5uZWxJbmRleFswXTsgLyogbHJlYXIgKi8KLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzNdLkNoYW5uZWxJbmRleFsxXTsgLyogcnJlYXIgKi8KLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsgLyogbHMgKi8KLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsgLyogcnMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFXzFfMToKLSAgICBjYXNlIE1PREVfMV8xXzFfMToKLSAgICBjYXNlIE1PREVfMV8xXzFfMV8xXzE6Ci0gICAgY2FzZSBNT0RFXzFfMV8xXzFfMV8xXzFfMToKLSAgICBjYXNlIE1PREVfMV8xXzFfMV8xXzFfMV8xXzFfMV8xXzE6Ci0gICAgY2FzZSBNT0RFXzJfMjoKLSAgICBjYXNlIE1PREVfMl8yXzI6Ci0gICAgY2FzZSBNT0RFXzJfMl8yXzI6Ci0gICAgY2FzZSBNT0RFXzJfMl8yXzJfMl8yOgorICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMF07IC8qIGwgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOyAvKiByICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsgLyogYyAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bNF0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsZmUgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzBdOyAvKiBscmVhciAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPQorICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLmVsSW5mb1szXS5DaGFubmVsSW5kZXhbMV07IC8qIHJyZWFyICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPQorICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07IC8qIGxzICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPQorICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMV07IC8qIHJzICovCisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfNl8xOgorICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMF07IC8qIGwgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOyAvKiByICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsgLyogYyAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bNF0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsZmUgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzBdOyAvKiBscyAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPQorICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMV07IC8qIHJzICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1NdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzNdLkNoYW5uZWxJbmRleFswXTsgLyogcyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzdfMV9UT1BfRlJPTlQ6CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsgLyogbCAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07IC8qIHIgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOyAvKiBjICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0gPQorICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLmVsSW5mb1szXS5DaGFubmVsSW5kZXhbMF07IC8qIGxmZSAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPQorICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07IC8qIGxzICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA9CisgICAgICAgICAgY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsgLyogcnMgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA9CisgICAgICAgICAgY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzRdLkNoYW5uZWxJbmRleFswXTsgLyogbHZoMiAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bNF0uQ2hhbm5lbEluZGV4WzFdOyAvKiBydmgyICovCisgICAgICBicmVhazsKICAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICgtMSk7CisgIH0KKworICBkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPSBjaGFubmVsTWFwcGluZy5uQ2hhbm5lbHNFZmY7CisgIGRyY0NvbXAtPmNoYW5uZWxzID0gY2hhbm5lbE1hcHBpbmcubkNoYW5uZWxzOworCisgIC8qIEluaXQgc3RhdGVzLiAqLworICBkcmNDb21wLT5zbW9vdGhMZXZlbFswXSA9IGRyY0NvbXAtPnNtb290aExldmVsWzFdID0KKyAgICAgIChGSVhQX0RCTCkoLSgxMzUgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpOworCisgIEZES21lbWNsZWFyKGRyY0NvbXAtPnNtb290aEdhaW4sIHNpemVvZihkcmNDb21wLT5zbW9vdGhHYWluKSk7CisgIEZES21lbWNsZWFyKGRyY0NvbXAtPmhvbGRDbnQsIHNpemVvZihkcmNDb21wLT5ob2xkQ250KSk7CisgIEZES21lbWNsZWFyKGRyY0NvbXAtPmxpbUdhaW4sIHNpemVvZihkcmNDb21wLT5saW1HYWluKSk7CisgIEZES21lbWNsZWFyKGRyY0NvbXAtPnByZXZQZWFrLCBzaXplb2YoZHJjQ29tcC0+cHJldlBlYWspKTsKKyAgRkRLbWVtY2xlYXIoZHJjQ29tcC0+ZmlsdGVyLCBzaXplb2YoZHJjQ29tcC0+ZmlsdGVyKSk7CisKKyAgcmV0dXJuICgwKTsKK30KKworSU5UIEZES19EUkNfR2VuZXJhdG9yX3NldERyY1Byb2ZpbGUoSERSQ19DT01QIGRyY0NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEUkNfUFJPRklMRSBwcm9maWxlTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19QUk9GSUxFIHByb2ZpbGVSRikgeworICBpbnQgcHJvZmlsZUlkeCwgaTsKKworICBkcmNDb21wLT5wcm9maWxlWzBdID0gcHJvZmlsZUxpbmU7CisgIGRyY0NvbXAtPnByb2ZpbGVbMV0gPSBwcm9maWxlUkY7CisKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIC8qIGdldCBwcm9maWxlIGluZGV4ICovCisgICAgc3dpdGNoIChkcmNDb21wLT5wcm9maWxlW2ldKSB7CisgICAgICBjYXNlIERSQ19OT05FOgorICAgICAgY2FzZSBEUkNfTk9UX1BSRVNFTlQ6CisgICAgICBjYXNlIERSQ19GSUxNU1RBTkRBUkQ6CisgICAgICAgIHByb2ZpbGVJZHggPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRFJDX0ZJTE1MSUdIVDoKKyAgICAgICAgcHJvZmlsZUlkeCA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEUkNfTVVTSUNTVEFOREFSRDoKKyAgICAgICAgcHJvZmlsZUlkeCA9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEUkNfTVVTSUNMSUdIVDoKKyAgICAgICAgcHJvZmlsZUlkeCA9IDM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEUkNfU1BFRUNIOgorICAgICAgICBwcm9maWxlSWR4ID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERSQ19ERUxBWV9URVNUOgorICAgICAgICBwcm9maWxlSWR4ID0gNTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gKC0xKTsKICAgICB9CiAKLSAgICBkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPSBjaGFubmVsTWFwcGluZy5uQ2hhbm5lbHNFZmY7Ci0gICAgZHJjQ29tcC0+Y2hhbm5lbHMgICAgID0gY2hhbm5lbE1hcHBpbmcubkNoYW5uZWxzOworICAgIC8qIGdldCBwYXJhbWV0ZXJzIGZvciBzZWxlY3RlZCBwcm9maWxlICovCisgICAgaWYgKHByb2ZpbGVJZHggPj0gMCkgeworICAgICAgZHJjQ29tcC0+bWF4Qm9vc3RUaHJbaV0gPSB0YWJNYXhCb29zdFRocltwcm9maWxlSWR4XTsKKyAgICAgIGRyY0NvbXAtPmJvb3N0VGhyW2ldID0gdGFiQm9vc3RUaHJbcHJvZmlsZUlkeF07CisgICAgICBkcmNDb21wLT5lYXJseUN1dFRocltpXSA9IHRhYkVhcmx5Q3V0VGhyW3Byb2ZpbGVJZHhdOworICAgICAgZHJjQ29tcC0+Y3V0VGhyW2ldID0gdGFiQ3V0VGhyW3Byb2ZpbGVJZHhdOworICAgICAgZHJjQ29tcC0+bWF4Q3V0VGhyW2ldID0gdGFiTWF4Q3V0VGhyW3Byb2ZpbGVJZHhdOwogCi0gICAgLyogSW5pdCBzdGF0ZXMuICovCi0gICAgZHJjQ29tcC0+c21vb3RoTGV2ZWxbMF0gPSBkcmNDb21wLT5zbW9vdGhMZXZlbFsxXSA9IChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTEzNTw8TUVUQURBVEFfRlJBQ1RfQklUUyk7CisgICAgICBkcmNDb21wLT5ib29zdEZhY1tpXSA9IHRhYkJvb3N0UmF0aW9bcHJvZmlsZUlkeF07CisgICAgICBkcmNDb21wLT5lYXJseUN1dEZhY1tpXSA9IHRhYkVhcmx5Q3V0UmF0aW9bcHJvZmlsZUlkeF07CisgICAgICBkcmNDb21wLT5jdXRGYWNbaV0gPSB0YWJDdXRSYXRpb1twcm9maWxlSWR4XTsKIAotICAgIEZES21lbWNsZWFyKGRyY0NvbXAtPnNtb290aEdhaW4sIHNpemVvZihkcmNDb21wLT5zbW9vdGhHYWluKSk7Ci0gICAgRkRLbWVtY2xlYXIoZHJjQ29tcC0+aG9sZENudCwgc2l6ZW9mKGRyY0NvbXAtPmhvbGRDbnQpKTsKLSAgICBGREttZW1jbGVhcihkcmNDb21wLT5saW1HYWluLCBzaXplb2YoZHJjQ29tcC0+bGltR2FpbikpOwotICAgIEZES21lbWNsZWFyKGRyY0NvbXAtPnByZXZQZWFrLCBzaXplb2YoZHJjQ29tcC0+cHJldlBlYWspKTsKLSAgICBGREttZW1jbGVhcihkcmNDb21wLT5maWx0ZXIsIHNpemVvZihkcmNDb21wLT5maWx0ZXIpKTsKKyAgICAgIGRyY0NvbXAtPm1heEJvb3N0W2ldID0gdGFiTWF4Qm9vc3RbcHJvZmlsZUlkeF07CisgICAgICBkcmNDb21wLT5tYXhDdXRbaV0gPSB0YWJNYXhDdXRbcHJvZmlsZUlkeF07CisgICAgICBkcmNDb21wLT5tYXhFYXJseUN1dFtpXSA9CisgICAgICAgICAgLWZNdWx0KChkcmNDb21wLT5jdXRUaHJbaV0gLSBkcmNDb21wLT5lYXJseUN1dFRocltpXSksCisgICAgICAgICAgICAgICAgIGRyY0NvbXAtPmVhcmx5Q3V0RmFjW2ldKTsgLyogbm8gc2NhbGluZyBhZnRlciBtdWx0IG5lZWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXJseUN1dEZhYyBpcyBpbiBGSVhQX0RCTCAqLwogCi0gICAgcmV0dXJuICgwKTsKKyAgICAgIGRyY0NvbXAtPmZhc3RBdHRhY2tbaV0gPSB0YzJDb2VmZigKKyAgICAgICAgICB0YWJGYXN0QXR0YWNrW3Byb2ZpbGVJZHhdLCBkcmNDb21wLT5zYW1wbGVSYXRlLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7CisgICAgICBkcmNDb21wLT5mYXN0RGVjYXlbaV0gPSB0YzJDb2VmZigKKyAgICAgICAgICB0YWJGYXN0RGVjYXlbcHJvZmlsZUlkeF0sIGRyY0NvbXAtPnNhbXBsZVJhdGUsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKKyAgICAgIGRyY0NvbXAtPnNsb3dBdHRhY2tbaV0gPSB0YzJDb2VmZigKKyAgICAgICAgICB0YWJTbG93QXR0YWNrW3Byb2ZpbGVJZHhdLCBkcmNDb21wLT5zYW1wbGVSYXRlLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7CisgICAgICBkcmNDb21wLT5zbG93RGVjYXlbaV0gPSB0YzJDb2VmZigKKyAgICAgICAgICB0YWJTbG93RGVjYXlbcHJvZmlsZUlkeF0sIGRyY0NvbXAtPnNhbXBsZVJhdGUsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKKyAgICAgIGRyY0NvbXAtPmhvbGRPZmZbaV0gPSB0YWJIb2xkT2ZmW3Byb2ZpbGVJZHhdICogMjU2IC8gZHJjQ29tcC0+YmxvY2tMZW5ndGg7CisKKyAgICAgIGRyY0NvbXAtPmF0dGFja1RocltpXSA9IHRhYkF0dGFja1Rocltwcm9maWxlSWR4XTsKKyAgICAgIGRyY0NvbXAtPmRlY2F5VGhyW2ldID0gdGFiRGVjYXlUaHJbcHJvZmlsZUlkeF07CisgICAgfQorCisgICAgZHJjQ29tcC0+c21vb3RoR2FpbltpXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgIH0KKyAgcmV0dXJuICgwKTsKIH0KIAorSU5UIEZES19EUkNfR2VuZXJhdG9yX0NhbGMoSERSQ19DT01QIGRyY0NvbXAsIGNvbnN0IElOVF9QQ00qIGNvbnN0IGluU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgaW5TYW1wbGVzQnVmU2l6ZSwgY29uc3QgSU5UIGRpYWxub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRyY19UYXJnZXRSZWZMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjb21wX1RhcmdldFJlZkxldmVsLCBjb25zdCBGSVhQX0RCTCBjbGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgc2xldiwgY29uc3QgRklYUF9EQkwgZXh0X2xldmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBleHRfbGV2YiwgY29uc3QgRklYUF9EQkwgbGZlX2xldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkbXhHYWluNSwgY29uc3QgSU5UIGRteEdhaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiBjb25zdCBwRHlucm5nLCBJTlQqIGNvbnN0IHBDb21wcikgeworICBpbnQgaSwgYzsKKyAgRklYUF9EQkwgcGVha1syXTsKIAotSU5UIEZES19EUkNfR2VuZXJhdG9yX3NldERyY1Byb2ZpbGUoCi0gICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgZHJjQ29tcCwKLSAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlTGluZSwKLSAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlUkYKLSAgICAgICAgKQotewotICAgIGludCBwcm9maWxlSWR4LCBpOworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogY29tcHJlc3NvcgorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmICgoZHJjQ29tcC0+cHJvZmlsZVswXSAhPSBEUkNfTk9ORSkgfHwgKGRyY0NvbXAtPnByb2ZpbGVbMV0gIT0gRFJDX05PTkUpKSB7CisgICAgLyogQ2FsYyBsb3VkbmVzcyBsZXZlbCAqLworICAgIEZJWFBfREJMIGxldmVsX2IgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgIGludCBsZXZlbF9lID0gREZSQUNUX0JJVFMgLSAxOwogCi0gICAgZHJjQ29tcC0+cHJvZmlsZVswXSA9IHByb2ZpbGVMaW5lOwotICAgIGRyY0NvbXAtPnByb2ZpbGVbMV0gPSBwcm9maWxlUkY7CisgICAgLyogSW5jcmVhc2UgZW5lcmd5IHRpbWUgcmVzb2x1dGlvbiB3aXRoIHNob3J0ZXIgcHJvY2Vzc2luZyBibG9ja3MuIDE2IGlzIGFuCisgICAgICogZW1waXJpYyB2YWx1ZS4gKi8KKyAgICBjb25zdCBpbnQgZ3JhbnVsZUxlbmd0aCA9IGZpeE1pbigxNiwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOworCisgICAgaWYgKGRyY0NvbXAtPnVzZVdlaWdodGluZykgeworICAgICAgRklYUF9EQkwgeDEsIHgyLCB5LCB5MSwgeTI7CisgICAgICAvKiBzdW0gb2YgZmlsdGVyIGNvZWZmaWNpZW50cyBhYm91dCAyLjUgLT4gc3F1YXJlZCB2YWx1ZSBpcyA2LjI1CisgICAgICAgICBXRUlHSFRJTkdfRklMVEVSX1NISUZUIGlzIDIgLT4gc2NhbGluZyBhYm91dCAxNiwgdGhlcmVmb3JlIHJlZHVjZQorICAgICAgICAgZ3JhbnVsZVNoaWZ0IGJ5IDEuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IGludCBncmFudWxlU2hpZnQgPSBnZXRTaGlmdEZhY3RvcihncmFudWxlTGVuZ3RoKSAtIDE7CisKKyAgICAgIGZvciAoYyA9IDA7IGMgPCAoaW50KWRyY0NvbXAtPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgY29uc3QgSU5UX1BDTSogcFNhbXBsZXMgPSBpblNhbXBsZXMgKyBjICogaW5TYW1wbGVzQnVmU2l6ZTsKKworICAgICAgICBpZiAoYyA9PSBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0pIHsKKyAgICAgICAgICBjb250aW51ZTsgLyogc2tpcCBMRkUgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIGdldCBmaWx0ZXIgc3RhdGVzICovCisgICAgICAgIHgxID0gZHJjQ29tcC0+ZmlsdGVyW2NdLngxOworICAgICAgICB4MiA9IGRyY0NvbXAtPmZpbHRlcltjXS54MjsKKyAgICAgICAgeTEgPSBkcmNDb21wLT5maWx0ZXJbY10ueTE7CisgICAgICAgIHkyID0gZHJjQ29tcC0+ZmlsdGVyW2NdLnkyOworCisgICAgICAgIGkgPSAwOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICBpbnQgb2Zmc2V0ID0gaTsKKyAgICAgICAgICBGSVhQX0RCTCBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKworICAgICAgICAgIGZvciAoaSA9IG9mZnNldDsKKyAgICAgICAgICAgICAgIGkgPCBmaXhNaW4ob2Zmc2V0ICsgZ3JhbnVsZUxlbmd0aCwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOyBpKyspIHsKKyAgICAgICAgICAgIC8qIGFwcGx5IHdlaWdodGluZyBmaWx0ZXIgKi8KKyAgICAgICAgICAgIEZJWFBfREJMIHggPQorICAgICAgICAgICAgICAgIEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2ldKSA+PiBXRUlHSFRJTkdfRklMVEVSX1NISUZUOworCisgICAgICAgICAgICAvKiB5ID0gYjAgKiAoeCAtIHgyKSAtIGExICogeTEgLSBhMiAqIHkyOyAqLworICAgICAgICAgICAgeSA9IGZNdWx0KGIwLCB4IC0geDIpIC0gZk11bHQoYTEsIHkxKSAtIGZNdWx0KGEyLCB5Mik7CisKKyAgICAgICAgICAgIHgyID0geDE7CisgICAgICAgICAgICB4MSA9IHg7CisgICAgICAgICAgICB5MiA9IHkxOworICAgICAgICAgICAgeTEgPSB5OworCisgICAgICAgICAgICBhY2N1ICs9IGZQb3cyRGl2Mih5KSA+PiAoZ3JhbnVsZVNoaWZ0IC0gMSk7IC8qIHBhcnRpYWwgZW5lcmd5ICovCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgKi8KKworICAgICAgICAgIGZpeHBBZGQoYWNjdSwgZ3JhbnVsZVNoaWZ0ICsgMiAqIFdFSUdIVElOR19GSUxURVJfU0hJRlQsICZsZXZlbF9iLAorICAgICAgICAgICAgICAgICAgJmxldmVsX2UpOyAvKiBzdXAgdXAgcGFydGlhbCBlbmVyZ2llcyAqLworCisgICAgICAgIH0gd2hpbGUgKGkgPCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7CisKKyAgICAgICAgLyogc2F2ZSBmaWx0ZXIgc3RhdGVzICovCisgICAgICAgIGRyY0NvbXAtPmZpbHRlcltjXS54MSA9IHgxOworICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueDIgPSB4MjsKKyAgICAgICAgZHJjQ29tcC0+ZmlsdGVyW2NdLnkxID0geTE7CisgICAgICAgIGRyY0NvbXAtPmZpbHRlcltjXS55MiA9IHkyOworICAgICAgfSAvKiBjICovCisgICAgfSAgIC8qIHdlaWdodGluZyAqLworICAgIGVsc2UgeworICAgICAgY29uc3QgaW50IGdyYW51bGVTaGlmdCA9IGdldFNoaWZ0RmFjdG9yKGdyYW51bGVMZW5ndGgpOworCisgICAgICBmb3IgKGMgPSAwOyBjIDwgKGludClkcmNDb21wLT5jaGFubmVsczsgYysrKSB7CisgICAgICAgIGNvbnN0IElOVF9QQ00qIHBTYW1wbGVzID0gaW5TYW1wbGVzICsgYyAqIGluU2FtcGxlc0J1ZlNpemU7CisKKyAgICAgICAgaWYgKChpbnQpYyA9PSBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0pIHsKKyAgICAgICAgICBjb250aW51ZTsgLyogc2tpcCBMRkUgKi8KKyAgICAgICAgfQorCisgICAgICAgIGkgPSAwOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICBpbnQgb2Zmc2V0ID0gaTsKKyAgICAgICAgICBGSVhQX0RCTCBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKworICAgICAgICAgIGZvciAoaSA9IG9mZnNldDsKKyAgICAgICAgICAgICAgIGkgPCBmaXhNaW4ob2Zmc2V0ICsgZ3JhbnVsZUxlbmd0aCwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOyBpKyspIHsKKyAgICAgICAgICAgIC8qIHBhcnRpYWwgZW5lcmd5ICovCisgICAgICAgICAgICBhY2N1ICs9IGZQb3cyRGl2MigoRklYUF9QQ00pcFNhbXBsZXNbaV0pID4+IChncmFudWxlU2hpZnQgLSAxKTsKKyAgICAgICAgICB9IC8qIGkgKi8KKworICAgICAgICAgIGZpeHBBZGQoYWNjdSwgZ3JhbnVsZVNoaWZ0LCAmbGV2ZWxfYiwKKyAgICAgICAgICAgICAgICAgICZsZXZlbF9lKTsgLyogc3VwIHVwIHBhcnRpYWwgZW5lcmdpZXMgKi8KKworICAgICAgICB9IHdoaWxlIChpIDwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOworICAgICAgfQorICAgIH0gLyogd2VpZ2h0aW5nICovCisKKyAgICAvKgorICAgICAqIENvbnZlcnQgdG8gZEJGUywgYXBwbHkgZGlhbG5vcm0KKyAgICAgKi8KKyAgICAvKiBsZXZlbCBzY2FsaW5nICovCisKKyAgICAvKiBkZXNjYWxlZCBsZXZlbCBpbiBsZDY0IHJlcHJlc2VudGF0aW9uICovCisgICAgRklYUF9EQkwgbGRMZXZlbCA9CisgICAgICAgIENhbGNMZERhdGEobGV2ZWxfYikgKworICAgICAgICAoRklYUF9EQkwpKChsZXZlbF9lIC0gMTIpIDw8IChERlJBQ1RfQklUUyAtIDEgLSBMRF9EQVRBX1NISUZUKSkgLQorICAgICAgICBDYWxjTGREYXRhKChGSVhQX0RCTCkoZHJjQ29tcC0+YmxvY2tMZW5ndGggPDwgKERGUkFDVF9CSVRTIC0gMSAtIDEyKSkpOworCisgICAgLyogaWYgKGxldmVsIDwgMWUtMTApIGxldmVsID0gMWUtMTBmOyAqLworICAgIGxkTGV2ZWwgPQorICAgICAgICBmTWF4KGxkTGV2ZWwsIEZMMkZYQ09OU1RfREJMKC0wLjUxOTA1MTI2NDgyNjE1MDM2Njg1NDczNzQxMDg1NzcyZikpOworCisgICAgLyogbGV2ZWwgPSAxMCAqIGxvZyhsZXZlbCkvbG9nKDEwKSArIDM7CisgICAgICogICAgICAgPSAxMCpsb2coMikvbG9nKDEwKSAqIGxkKGxldmVsKSArIDM7CisgICAgICogICAgICAgPSAxMCAqIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZChsZXZlbCkgKyAzCisgICAgICogICAgICAgPSAxMCAqICgwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQobGV2ZWwpICsgMC4zKQorICAgICAqICAgICAgID0gMTAgKiAoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQobGV2ZWwpICsgMC4zLzY0KQorICAgICAqICogNjQKKyAgICAgKgorICAgICAqICAgIGFkZGl0aW9uYWwgc2NhbGluZyB3aXRoIE1FVEFEQVRBX0ZSQUNUX0JJVFM6CisgICAgICogICAgICAgPSAxMCAqICgwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChsZXZlbCkgKyAwLjMvNjQpCisgICAgICogKiA2NCAqIDJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMpID0gMTAgKiAoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OQorICAgICAqICogbGQ2NChsZXZlbCkgKyAwLjMvNjQpICogMl4oTUVUQURBVEFfRlJBQ1RfQklUUytMRF9EQVRBX1NISUZUKSA9CisgICAgICogMTAqMl4oTUVUQURBVEFfRlJBQ1RfQklUUytMRF9EQVRBX1NISUZUKSAqICgKKyAgICAgKiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChsZXZlbCkgKyAwLjMvNjQgKQorICAgICAqICovCisgICAgRklYUF9EQkwgbGV2ZWwgPSBmTXVsdCgKKyAgICAgICAgKEZJWFBfREJMKSgxMCA8PCAoTUVUQURBVEFfRlJBQ1RfQklUUyArIExEX0RBVEFfU0hJRlQpKSwKKyAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OWYpLCBsZExldmVsKSArCisgICAgICAgICAgICAoRklYUF9EQkwpKEZMMkZYQ09OU1RfREJMKDAuM2YpID4+IExEX0RBVEFfU0hJRlQpKTsKKworICAgIC8qIGxldmVsIC09IGRpYWxub3JtICsgMzEgKi8gLyogdGhpcyBpcyBmaXhlZCB0byBEb2xieS1SZWZlcmVuY2VMZXZlbCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NvciBwcm9maWxlcyBhcmUgZGVmaW5lZCByZWxhdGl2ZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyAqLworICAgIGxldmVsIC09ICgoRklYUF9EQkwpKGRpYWxub3JtIDw8IChNRVRBREFUQV9GUkFDVF9CSVRTIC0gMTYpKSArCisgICAgICAgICAgICAgIChGSVhQX0RCTCkoMzEgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAvKiBnZXQgcHJvZmlsZSBpbmRleCAqLwotICAgICAgICBzd2l0Y2ggKGRyY0NvbXAtPnByb2ZpbGVbaV0pIHsKLSAgICAgICAgICAgIGNhc2UgRFJDX05PTkU6Ci0gICAgICAgICAgICBjYXNlIERSQ19GSUxNU1RBTkRBUkQ6ICBwcm9maWxlSWR4ID0gMDsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERSQ19GSUxNTElHSFQ6ICAgICBwcm9maWxlSWR4ID0gMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERSQ19NVVNJQ1NUQU5EQVJEOiBwcm9maWxlSWR4ID0gMjsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERSQ19NVVNJQ0xJR0hUOiAgICBwcm9maWxlSWR4ID0gMzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERSQ19TUEVFQ0g6ICAgICAgICBwcm9maWxlSWR4ID0gNDsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERSQ19ERUxBWV9URVNUOiAgICBwcm9maWxlSWR4ID0gNTsgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gKC0xKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGdldCBwYXJhbWV0ZXJzIGZvciBzZWxlY3RlZCBwcm9maWxlICovCi0gICAgICAgIGlmIChwcm9maWxlSWR4ID49IDApIHsKLSAgICAgICAgICAgIGRyY0NvbXAtPm1heEJvb3N0VGhyW2ldID0gdGFiTWF4Qm9vc3RUaHJbcHJvZmlsZUlkeF07Ci0gICAgICAgICAgICBkcmNDb21wLT5ib29zdFRocltpXSAgICA9IHRhYkJvb3N0VGhyW3Byb2ZpbGVJZHhdOwotICAgICAgICAgICAgZHJjQ29tcC0+ZWFybHlDdXRUaHJbaV0gPSB0YWJFYXJseUN1dFRocltwcm9maWxlSWR4XTsKLSAgICAgICAgICAgIGRyY0NvbXAtPmN1dFRocltpXSAgICAgID0gdGFiQ3V0VGhyW3Byb2ZpbGVJZHhdOwotICAgICAgICAgICAgZHJjQ29tcC0+bWF4Q3V0VGhyW2ldICAgPSB0YWJNYXhDdXRUaHJbcHJvZmlsZUlkeF07Ci0KLSAgICAgICAgICAgIGRyY0NvbXAtPmJvb3N0RmFjW2ldICAgID0gdGFiQm9vc3RSYXRpb1twcm9maWxlSWR4XTsKLSAgICAgICAgICAgIGRyY0NvbXAtPmVhcmx5Q3V0RmFjW2ldID0gdGFiRWFybHlDdXRSYXRpb1twcm9maWxlSWR4XTsKLSAgICAgICAgICAgIGRyY0NvbXAtPmN1dEZhY1tpXSAgICAgID0gdGFiQ3V0UmF0aW9bcHJvZmlsZUlkeF07Ci0KLSAgICAgICAgICAgIGRyY0NvbXAtPm1heEJvb3N0W2ldICAgID0gdGFiTWF4Qm9vc3RbcHJvZmlsZUlkeF07Ci0gICAgICAgICAgICBkcmNDb21wLT5tYXhDdXRbaV0gICAgICA9IHRhYk1heEN1dFtwcm9maWxlSWR4XTsKLSAgICAgICAgICAgIGRyY0NvbXAtPm1heEVhcmx5Q3V0W2ldID0gLSBmTXVsdCgoZHJjQ29tcC0+Y3V0VGhyW2ldIC0gZHJjQ29tcC0+ZWFybHlDdXRUaHJbaV0pLCBkcmNDb21wLT5lYXJseUN1dEZhY1tpXSk7IC8qIG5vIHNjYWxpbmcgYWZ0ZXIgbXVsdCBuZWVkZWQsIGVhcmx5Q3V0RmFjIGlzIGluIEZJWFBfREJMICovCi0KLSAgICAgICAgICAgIGRyY0NvbXAtPmZhc3RBdHRhY2tbaV0gID0gdGMyQ29lZmYodGFiRmFzdEF0dGFja1twcm9maWxlSWR4XSwgZHJjQ29tcC0+c2FtcGxlUmF0ZSwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOwotICAgICAgICAgICAgZHJjQ29tcC0+ZmFzdERlY2F5W2ldICAgPSB0YzJDb2VmZih0YWJGYXN0RGVjYXlbcHJvZmlsZUlkeF0sIGRyY0NvbXAtPnNhbXBsZVJhdGUsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKLSAgICAgICAgICAgIGRyY0NvbXAtPnNsb3dBdHRhY2tbaV0gID0gdGMyQ29lZmYodGFiU2xvd0F0dGFja1twcm9maWxlSWR4XSwgZHJjQ29tcC0+c2FtcGxlUmF0ZSwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOwotICAgICAgICAgICAgZHJjQ29tcC0+c2xvd0RlY2F5W2ldICAgPSB0YzJDb2VmZih0YWJTbG93RGVjYXlbcHJvZmlsZUlkeF0sIGRyY0NvbXAtPnNhbXBsZVJhdGUsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKLSAgICAgICAgICAgIGRyY0NvbXAtPmhvbGRPZmZbaV0gICAgID0gdGFiSG9sZE9mZltwcm9maWxlSWR4XSAqIDI1NiAvIGRyY0NvbXAtPmJsb2NrTGVuZ3RoOwotCi0gICAgICAgICAgICBkcmNDb21wLT5hdHRhY2tUaHJbaV0gICA9IHRhYkF0dGFja1Rocltwcm9maWxlSWR4XTsKLSAgICAgICAgICAgIGRyY0NvbXAtPmRlY2F5VGhyW2ldICAgID0gdGFiRGVjYXlUaHJbcHJvZmlsZUlkeF07Ci0gICAgICAgIH0KLQotICAgICAgICBkcmNDb21wLT5zbW9vdGhHYWluW2ldID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICB9Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotCi1JTlQgRkRLX0RSQ19HZW5lcmF0b3JfQ2FsYygKLSAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICBkcmNDb21wLAotICAgICAgICBjb25zdCBJTlRfUENNICogY29uc3QgICAgICAgICAgIGluU2FtcGxlcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBkaWFsbm9ybSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBkcmNfVGFyZ2V0UmVmTGV2ZWwsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgY29tcF9UYXJnZXRSZWZMZXZlbCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAgICAgICBjbGV2LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgICAgIHNsZXYsCi0gICAgICAgIElOVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgcER5bnJuZywKLSAgICAgICAgSU5UICogY29uc3QgICAgICAgICAgICAgICAgICAgICBwQ29tcHIKLSAgICAgICAgKQotewotICAgIGludCBpLCBjOwotICAgIEZJWFBfREJMIHBlYWtbMl07Ci0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogY29tcHJlc3NvcgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgaWYgKChkcmNDb21wLT5wcm9maWxlWzBdICE9IERSQ19OT05FKSB8fCAoZHJjQ29tcC0+cHJvZmlsZVsxXSAhPSBEUkNfTk9ORSkpIHsKLSAgICAgICAgLyogQ2FsYyBsb3VkbmVzcyBsZXZlbCAqLwotICAgICAgICBGSVhQX0RCTCBsZXZlbF9iID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgICAgaW50ICAgICAgbGV2ZWxfZSA9IERGUkFDVF9CSVRTLTE7Ci0KLSAgICAgICAgLyogSW5jcmVhc2UgZW5lcmd5IHRpbWUgcmVzb2x1dGlvbiB3aXRoIHNob3J0ZXIgcHJvY2Vzc2luZyBibG9ja3MuIDMyIGlzIGFuIGVtcGlyaWMgdmFsdWUuICovCi0gICAgICAgIGNvbnN0IGludCBncmFudWxlTGVuZ3RoID0gZml4TWluKDMyLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7Ci0KLSAgICAgICAgaWYgKGRyY0NvbXAtPnVzZVdlaWdodGluZykgewotICAgICAgICAgICAgRklYUF9EQkwgeDEsIHgyLCB5LCB5MSwgeTI7Ci0gICAgICAgICAgICAvKiBzdW0gb2YgZmlsdGVyIGNvZWZmaWNpZW50cyBhYm91dCAyLjUgLT4gc3F1YXJlZCB2YWx1ZSBpcyA2LjI1Ci0gICAgICAgICAgICAgICBXRUlHSFRJTkdfRklMVEVSX1NISUZUIGlzIDIgLT4gc2NhbGluZyBhYm91dCAxNiwgdGhlcmVmb3JlIHJlZHVjZSBncmFudWxlU2hpZnQgYnkgMS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY29uc3QgaW50IGdyYW51bGVTaGlmdCA9IGdldFNoaWZ0RmFjdG9yKGdyYW51bGVMZW5ndGgpLTE7Ci0KLSAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAoaW50KWRyY0NvbXAtPmNoYW5uZWxzOyBjKyspIHsKLSAgICAgICAgICAgICAgICBjb25zdCBJTlRfUENNKiBwU2FtcGxlcyA9ICZpblNhbXBsZXNbY107Ci0KLSAgICAgICAgICAgICAgICBpZiAoYyA9PSBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0pIHsKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgLyogc2tpcCBMRkUgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBnZXQgZmlsdGVyIHN0YXRlcyAqLwotICAgICAgICAgICAgICAgIHgxID0gZHJjQ29tcC0+ZmlsdGVyW2NdLngxOwotICAgICAgICAgICAgICAgIHgyID0gZHJjQ29tcC0+ZmlsdGVyW2NdLngyOwotICAgICAgICAgICAgICAgIHkxID0gZHJjQ29tcC0+ZmlsdGVyW2NdLnkxOwotICAgICAgICAgICAgICAgIHkyID0gZHJjQ29tcC0+ZmlsdGVyW2NdLnkyOwotCi0gICAgICAgICAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgICAgICAgICBkbyB7Ci0KLSAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBpOwotICAgICAgICAgICAgICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0KLSAgICAgICAgICAgICAgICAgIGZvciAoaT1vZmZzZXQ7IGkgPCBmaXhNaW4ob2Zmc2V0K2dyYW51bGVMZW5ndGgsZHJjQ29tcC0+YmxvY2tMZW5ndGgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgLyogYXBwbHkgd2VpZ2h0aW5nIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB4ID0gRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbaSpkcmNDb21wLT5jaGFubmVsc10pID4+IFdFSUdIVElOR19GSUxURVJfU0hJRlQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogeSA9IGIwICogKHggLSB4MikgLSBhMSAqIHkxIC0gYTIgKiB5MjsgKi8KLSAgICAgICAgICAgICAgICAgICAgeSA9IGZNdWx0KGIwLHgteDIpIC0gZk11bHQoYTEseTEpIC0gZk11bHQoYTIseTIpOwotCi0gICAgICAgICAgICAgICAgICAgIHgyID0geDE7Ci0gICAgICAgICAgICAgICAgICAgIHgxID0geDsKLSAgICAgICAgICAgICAgICAgICAgeTIgPSB5MTsKLSAgICAgICAgICAgICAgICAgICAgeTEgPSB5OwotCi0gICAgICAgICAgICAgICAgICAgIGFjY3UgKz0gZlBvdzJEaXYyKHkpPj4oZ3JhbnVsZVNoaWZ0LTEpOyAgICAgLyogcGFydGlhbCBlbmVyZ3kgKi8KLSAgICAgICAgICAgICAgICAgIH0gLyogaSAqLwotCi0gICAgICAgICAgICAgICAgICBmaXhwQWRkKGFjY3UsIGdyYW51bGVTaGlmdCsyKldFSUdIVElOR19GSUxURVJfU0hJRlQsICZsZXZlbF9iLCAmbGV2ZWxfZSk7IC8qIHN1cCB1cCBwYXJ0aWFsIGVuZXJnaWVzICovCi0KLSAgICAgICAgICAgICAgICB9IHdoaWxlICggaSA8IGRyY0NvbXAtPmJsb2NrTGVuZ3RoICk7Ci0KLQotICAgICAgICAgICAgICAgIC8qIHNhdmUgZmlsdGVyIHN0YXRlcyAqLwotICAgICAgICAgICAgICAgIGRyY0NvbXAtPmZpbHRlcltjXS54MSA9IHgxOwotICAgICAgICAgICAgICAgIGRyY0NvbXAtPmZpbHRlcltjXS54MiA9IHgyOwotICAgICAgICAgICAgICAgIGRyY0NvbXAtPmZpbHRlcltjXS55MSA9IHkxOwotICAgICAgICAgICAgICAgIGRyY0NvbXAtPmZpbHRlcltjXS55MiA9IHkyOwotICAgICAgICAgICAgfSAvKiBjICovCi0gICAgICAgIH0gLyogd2VpZ2h0aW5nICovCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29uc3QgaW50IGdyYW51bGVTaGlmdCA9IGdldFNoaWZ0RmFjdG9yKGdyYW51bGVMZW5ndGgpOwotCi0gICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgKGludClkcmNDb21wLT5jaGFubmVsczsgYysrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSogcFNhbXBsZXMgPSAmaW5TYW1wbGVzW2NdOwotCi0gICAgICAgICAgICAgICAgaWYgKChpbnQpYyA9PSBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0pIHsKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgLyogc2tpcCBMRkUgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpID0gMDsKLQotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBpOwotICAgICAgICAgICAgICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0KLSAgICAgICAgICAgICAgICAgIGZvciAoaT1vZmZzZXQ7IGkgPCBmaXhNaW4ob2Zmc2V0K2dyYW51bGVMZW5ndGgsZHJjQ29tcC0+YmxvY2tMZW5ndGgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgLyogcGFydGlhbCBlbmVyZ3kgKi8KLSAgICAgICAgICAgICAgICAgICAgYWNjdSArPSBmUG93MkRpdjIoKEZJWFBfUENNKXBTYW1wbGVzW2kqZHJjQ29tcC0+Y2hhbm5lbHNdKT4+KGdyYW51bGVTaGlmdC0xKTsKLSAgICAgICAgICAgICAgICAgIH0gLyogaSAqLwotCi0gICAgICAgICAgICAgICAgICBmaXhwQWRkKGFjY3UsIGdyYW51bGVTaGlmdCwgJmxldmVsX2IsICZsZXZlbF9lKTsgLyogc3VwIHVwIHBhcnRpYWwgZW5lcmdpZXMgKi8KLQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKCBpIDwgZHJjQ29tcC0+YmxvY2tMZW5ndGggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvKiB3ZWlnaHRpbmcgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IHRvIGRCRlMsIGFwcGx5IGRpYWxub3JtCi0gICAgICAgICAqLwotICAgICAgICAvKiBsZXZlbCBzY2FsaW5nICovCi0KLSAgICAgICAgLyogZGVzY2FsZWQgbGV2ZWwgaW4gbGQ2NCByZXByZXNlbnRhdGlvbiAqLwotICAgICAgICBGSVhQX0RCTCBsZExldmVsID0gQ2FsY0xkRGF0YShsZXZlbF9iKSArIChGSVhQX0RCTCkoKGxldmVsX2UtMTIpPDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSkgLSBDYWxjTGREYXRhKChGSVhQX0RCTCkoZHJjQ29tcC0+YmxvY2tMZW5ndGg8PChERlJBQ1RfQklUUy0xLTEyKSkpOwotCi0gICAgICAgIC8qIGlmIChsZXZlbCA8IDFlLTEwKSBsZXZlbCA9IDFlLTEwZjsgKi8KLSAgICAgICAgbGRMZXZlbCA9IEZES21heChsZExldmVsLCBGTDJGWENPTlNUX0RCTCgtMC41MTkwNTEyNjQ4MjYxNTAzNjY4NTQ3Mzc0MTA4NTc3MmYpKTsKLQotICAgICAgICAvKiBsZXZlbCA9IDEwICogbG9nKGxldmVsKS9sb2coMTApICsgMzsKLSAgICAgICAgICogICAgICAgPSAxMCpsb2coMikvbG9nKDEwKSAqIGxkKGxldmVsKSArIDM7Ci0gICAgICAgICAqICAgICAgID0gMTAgKiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQobGV2ZWwpICsgMwotICAgICAgICAgKiAgICAgICA9IDEwICogKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZChsZXZlbCkgKyAwLjMpCi0gICAgICAgICAqICAgICAgID0gMTAgKiAoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQobGV2ZWwpICsgMC4zLzY0KSAqIDY0Ci0gICAgICAgICAqCi0gICAgICAgICAqICAgIGFkZGl0aW9uYWwgc2NhbGluZyB3aXRoIE1FVEFEQVRBX0ZSQUNUX0JJVFM6Ci0gICAgICAgICAqICAgICAgID0gMTAgKiAoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQobGV2ZWwpICsgMC4zLzY0KSAqIDY0ICogMl4oTUVUQURBVEFfRlJBQ1RfQklUUykKLSAgICAgICAgICogICAgICAgPSAxMCAqICgwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChsZXZlbCkgKyAwLjMvNjQpICogMl4oTUVUQURBVEFfRlJBQ1RfQklUUytMRF9EQVRBX1NISUZUKQotICAgICAgICAgKiAgICAgICA9IDEwKjJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkgKiAoIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KGxldmVsKSArIDAuMy82NCApCi0gICAgICAgICAqICovCi0gICAgICAgIEZJWFBfREJMIGxldmVsID0gZk11bHQoKEZJWFBfREJMKSgxMDw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkpLCBmTXVsdCggRkwyRlhDT05TVF9EQkwoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OWYpLCBsZExldmVsKSArIChGSVhQX0RCTCkoRkwyRlhDT05TVF9EQkwoMC4zZik+PkxEX0RBVEFfU0hJRlQpICk7Ci0KLSAgICAgICAgLyogbGV2ZWwgLT0gZGlhbG5vcm0gKyAzMSAqLyAgIC8qIHRoaXMgaXMgZml4ZWQgdG8gRG9sYnktUmVmZXJlbmNlTGV2ZWwgYXMgY29tcHJlc3NvciBwcm9maWxlcyBhcmUgZGVmaW5lZCByZWxhdGl2ZSB0byB0aGlzICovCi0gICAgICAgIGxldmVsIC09ICgoRklYUF9EQkwpKGRpYWxub3JtPDwoTUVUQURBVEFfRlJBQ1RfQklUUy0xNikpICArIChGSVhQX0RCTCkoMzE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+cHJvZmlsZVtpXSA9PSBEUkNfTk9ORSkgewotICAgICAgICAgICAgICAgIC8qIG5vIGNvbXByZXNzaW9uICovCi0gICAgICAgICAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpbltpXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCBnYWluLCBhbHBoYSwgbHZsMnNtdGhsdmw7Ci0KLSAgICAgICAgICAgICAgICAvKiBjYWxjIHN0YXRpYyBnYWluICovCi0gICAgICAgICAgICAgICAgaWYgKGxldmVsIDw9IGRyY0NvbXAtPm1heEJvb3N0VGhyW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIG1heCBib29zdCAqLwotICAgICAgICAgICAgICAgICAgICBnYWluID0gZHJjQ29tcC0+bWF4Qm9vc3RbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDwgZHJjQ29tcC0+Ym9vc3RUaHJbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgLyogYm9vc3QgcmFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGZNdWx0KChsZXZlbCAtIGRyY0NvbXAtPmJvb3N0VGhyW2ldKSxkcmNDb21wLT5ib29zdEZhY1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDw9IGRyY0NvbXAtPmVhcmx5Q3V0VGhyW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIG51bGwgYmFuZCAqLwotICAgICAgICAgICAgICAgICAgICBnYWluID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPD0gZHJjQ29tcC0+Y3V0VGhyW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGVhcmx5IGN1dCByYW5nZSAqLwotICAgICAgICAgICAgICAgICAgICBnYWluID0gZk11bHQoKGxldmVsIC0gZHJjQ29tcC0+ZWFybHlDdXRUaHJbaV0pLCBkcmNDb21wLT5lYXJseUN1dEZhY1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDwgZHJjQ29tcC0+bWF4Q3V0VGhyW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGN1dCByYW5nZSAqLwotICAgICAgICAgICAgICAgICAgICBnYWluID0gZk11bHQoKGxldmVsIC0gZHJjQ29tcC0+Y3V0VGhyW2ldKSwgZHJjQ29tcC0+Y3V0RmFjW2ldKSAtIGRyY0NvbXAtPm1heEVhcmx5Q3V0W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogbWF4IGN1dCAqLwotICAgICAgICAgICAgICAgICAgICBnYWluID0gLWRyY0NvbXAtPm1heEN1dFtpXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBjaG9vc2UgdGltZSBjb25zdGFudCAqLwotICAgICAgICAgICAgICAgIGx2bDJzbXRobHZsID0gbGV2ZWwgLSBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXTsKLSAgICAgICAgICAgICAgICBpZiAoZ2FpbiA8IGRyY0NvbXAtPnNtb290aEdhaW5baV0pIHsKLSAgICAgICAgICAgICAgICAgICAgLyogYXR0YWNrICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChsdmwyc210aGx2bCA+IGRyY0NvbXAtPmF0dGFja1RocltpXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFzdCBhdHRhY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gZHJjQ29tcC0+ZmFzdEF0dGFja1tpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsb3cgYXR0YWNrICovCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPnNsb3dBdHRhY2tbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlbGVhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGx2bDJzbXRobHZsIDwgLWRyY0NvbXAtPmRlY2F5VGhyW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBmYXN0IHJlbGVhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gZHJjQ29tcC0+ZmFzdERlY2F5W2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogc2xvdyByZWxlYXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPnNsb3dEZWNheVtpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHNtb290aCBnYWluICYgbGV2ZWwgKi8KLSAgICAgICAgICAgICAgICBpZiAoKGdhaW4gPCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKSB8fCAoZHJjQ29tcC0+aG9sZENudFtpXSA9PSAwKSkgeyAvKiBob2xkIGdhaW4gdW5sZXNzIHdlIGhhdmUgYW4gYXR0YWNrIG9yIGhvbGQgcGVyaW9kIGlzIG92ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgYWNjdTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXSA9ICgxLWFscGhhKSAqIGRyY0NvbXAtPnNtb290aExldmVsW2ldICsgYWxwaGEgKiBsZXZlbDsgKi8KLSAgICAgICAgICAgICAgICAgICAgYWNjdSA9ICBmTXVsdCgoKEZJWFBfREJMKU1BWFZBTF9EQkwtYWxwaGEpLCBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGFjY3UgKz0gZk11bHQoYWxwaGEsbGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXSA9IGFjY3U7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogZHJjQ29tcC0+c21vb3RoR2FpbltpXSAgPSAoMS1hbHBoYSkgKiBkcmNDb21wLT5zbW9vdGhHYWluW2ldICsgYWxwaGEgKiBnYWluOyAqLwotICAgICAgICAgICAgICAgICAgICBhY2N1ID0gIGZNdWx0KCgoRklYUF9EQkwpTUFYVkFMX0RCTC1hbHBoYSksIGRyY0NvbXAtPnNtb290aEdhaW5baV0pOwotICAgICAgICAgICAgICAgICAgICBhY2N1ICs9IGZNdWx0KGFscGhhLGdhaW4pOwotICAgICAgICAgICAgICAgICAgICBkcmNDb21wLT5zbW9vdGhHYWluW2ldID0gYWNjdTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBob2xkIGNvdW50ZXIgKi8KLSAgICAgICAgICAgICAgICBpZiAoZHJjQ29tcC0+aG9sZENudFtpXSkgewotICAgICAgICAgICAgICAgICAgZHJjQ29tcC0+aG9sZENudFtpXS0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZ2FpbiA8IGRyY0NvbXAtPnNtb290aEdhaW5baV0pIHsKLSAgICAgICAgICAgICAgICAgIGRyY0NvbXAtPmhvbGRDbnRbaV0gPSBkcmNDb21wLT5ob2xkT2ZmW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gLyogcHJvZmlsZSAhPSBEUkNfTk9ORSAqLwotICAgICAgICB9IC8qIGZvciBpPTEuLjIgKi8KLSAgICAgIH0gZWxzZSB7CisgICAgICBpZiAoZHJjQ29tcC0+cHJvZmlsZVtpXSA9PSBEUkNfTk9ORSkgewogICAgICAgICAvKiBubyBjb21wcmVzc2lvbiAqLwotICAgICAgICBkcmNDb21wLT5zbW9vdGhHYWluWzBdID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpblsxXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgICB9CisgICAgICAgIGRyY0NvbXAtPnNtb290aEdhaW5baV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRklYUF9EQkwgZ2FpbiwgYWxwaGEsIGx2bDJzbXRobHZsOwogCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiBsaW1pdGVyCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBmaW5kIHBlYWsgbGV2ZWwgKi8KLSAgICBwZWFrWzBdID0gcGVha1sxXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgZm9yIChpID0gMDsgaSA8IGRyY0NvbXAtPmJsb2NrTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgRklYUF9EQkwgdG1wOwotICAgICAgICBjb25zdCBJTlRfUENNKiBwU2FtcGxlcyA9ICZpblNhbXBsZXNbaSpkcmNDb21wLT5jaGFubmVsc107Ci0gICAgICAgIElOVF9QQ00gbWF4U2FtcGxlID0gMDsKLQotICAgICAgICAvKiBzaW5nbGUgY2hhbm5lbHMgKi8KLSAgICAgICAgZm9yIChjID0gMDsgYyA8IChpbnQpZHJjQ29tcC0+Y2hhbm5lbHM7IGMrKykgewotICAgICAgICAgICAgbWF4U2FtcGxlID0gRkRLbWF4KG1heFNhbXBsZSwgZkFicyhwU2FtcGxlc1tjXSkpOwotICAgICAgICB9Ci0gICAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgRlhfUENNMkZYX0RCTChtYXhTYW1wbGUpPj5ET1dOTUlYX1NISUZUKTsKLQotICAgICAgICAvKiBMdC9SdCBkb3dubWl4ICovCi0gICAgICAgIGlmIChkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPiAyKSB7Ci0gICAgICAgICAgICAvKiBMdCAqLwotICAgICAgICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLQotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApIHRtcCAtPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAvKiBMcyAqLwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAvKiBMczIgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgLyogUnMgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkgdG1wIC09IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgLyogUnMyICovCi0gICAgICAgICAgICBpZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkpIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcuMWNoICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA+PSAwKSB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgIC8qIFMgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0NdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbQ11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgLyogQyAqLwotICAgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xdXSk+PkRPV05NSVhfU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMICovCi0KLSAgICAgICAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgZml4cF9hYnModG1wKSk7Ci0KLSAgICAgICAgICAgIC8qIFJ0ICovCi0gICAgICAgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAvKiBMcyAqLwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAvKiBMczIgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgLyogUnMgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgLyogUnMyICovCi0gICAgICAgICAgICBpZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkpIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcuMWNoICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgIC8qIFMgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0NdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbQ11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgLyogQyAqLwotICAgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JdXSk+PkRPV05NSVhfU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSICovCi0KLSAgICAgICAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgZml4cF9hYnModG1wKSk7CisgICAgICAgIC8qIGNhbGMgc3RhdGljIGdhaW4gKi8KKyAgICAgICAgaWYgKGxldmVsIDw9IGRyY0NvbXAtPm1heEJvb3N0VGhyW2ldKSB7CisgICAgICAgICAgLyogbWF4IGJvb3N0ICovCisgICAgICAgICAgZ2FpbiA9IGRyY0NvbXAtPm1heEJvb3N0W2ldOworICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDwgZHJjQ29tcC0+Ym9vc3RUaHJbaV0pIHsKKyAgICAgICAgICAvKiBib29zdCByYW5nZSAqLworICAgICAgICAgIGdhaW4gPSBmTXVsdCgobGV2ZWwgLSBkcmNDb21wLT5ib29zdFRocltpXSksIGRyY0NvbXAtPmJvb3N0RmFjW2ldKTsKKyAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA8PSBkcmNDb21wLT5lYXJseUN1dFRocltpXSkgeworICAgICAgICAgIC8qIG51bGwgYmFuZCAqLworICAgICAgICAgIGdhaW4gPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDw9IGRyY0NvbXAtPmN1dFRocltpXSkgeworICAgICAgICAgIC8qIGVhcmx5IGN1dCByYW5nZSAqLworICAgICAgICAgIGdhaW4gPQorICAgICAgICAgICAgICBmTXVsdCgobGV2ZWwgLSBkcmNDb21wLT5lYXJseUN1dFRocltpXSksIGRyY0NvbXAtPmVhcmx5Q3V0RmFjW2ldKTsKKyAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA8IGRyY0NvbXAtPm1heEN1dFRocltpXSkgeworICAgICAgICAgIC8qIGN1dCByYW5nZSAqLworICAgICAgICAgIGdhaW4gPSBmTXVsdCgobGV2ZWwgLSBkcmNDb21wLT5jdXRUaHJbaV0pLCBkcmNDb21wLT5jdXRGYWNbaV0pIC0KKyAgICAgICAgICAgICAgICAgZHJjQ29tcC0+bWF4RWFybHlDdXRbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogbWF4IGN1dCAqLworICAgICAgICAgIGdhaW4gPSAtZHJjQ29tcC0+bWF4Q3V0W2ldOwogICAgICAgICB9CiAKLSAgICAgICAgLyogTG8vUm8gZG93bm1peCAqLwotICAgICAgICBpZiAoZHJjQ29tcC0+ZnVsbENoYW5uZWxzID4gMikgewotICAgICAgICAgICAgLyogTG8gKi8KLSAgICAgICAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExzICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExzMiAqLwotICAgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApKSB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKSk+PihET1dOTUlYX1NISUZULTEpOyAvKiBTICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEMgKi8KLSAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTCAqLwotCi0gICAgICAgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOwotCi0gICAgICAgICAgICAvKiBSbyAqLwotICAgICAgICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUnMgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUnMyICovCi0gICAgICAgICAgICBpZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkpIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcuMWNoICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtTXV0pKT4+KERPV05NSVhfU0hJRlQtMSk7IC8qIFMgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0NdID49IDApIHRtcCArPSBmTXVsdERpdjIoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbQ11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQyAqLwotICAgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JdXSk+PkRPV05NSVhfU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSICovCi0KLSAgICAgICAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgZml4cF9hYnModG1wKSk7CisgICAgICAgIC8qIGNob29zZSB0aW1lIGNvbnN0YW50ICovCisgICAgICAgIGx2bDJzbXRobHZsID0gbGV2ZWwgLSBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXTsKKyAgICAgICAgaWYgKGdhaW4gPCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKSB7CisgICAgICAgICAgLyogYXR0YWNrICovCisgICAgICAgICAgaWYgKGx2bDJzbXRobHZsID4gZHJjQ29tcC0+YXR0YWNrVGhyW2ldKSB7CisgICAgICAgICAgICAvKiBmYXN0IGF0dGFjayAqLworICAgICAgICAgICAgYWxwaGEgPSBkcmNDb21wLT5mYXN0QXR0YWNrW2ldOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBzbG93IGF0dGFjayAqLworICAgICAgICAgICAgYWxwaGEgPSBkcmNDb21wLT5zbG93QXR0YWNrW2ldOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiByZWxlYXNlICovCisgICAgICAgICAgaWYgKGx2bDJzbXRobHZsIDwgLWRyY0NvbXAtPmRlY2F5VGhyW2ldKSB7CisgICAgICAgICAgICAvKiBmYXN0IHJlbGVhc2UgKi8KKyAgICAgICAgICAgIGFscGhhID0gZHJjQ29tcC0+ZmFzdERlY2F5W2ldOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBzbG93IHJlbGVhc2UgKi8KKyAgICAgICAgICAgIGFscGhhID0gZHJjQ29tcC0+c2xvd0RlY2F5W2ldOworICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHBlYWtbMV0gPSBmaXhNYXgocGVha1swXSwgcGVha1sxXSk7CisgICAgICAgIC8qIHNtb290aCBnYWluICYgbGV2ZWwgKi8KKyAgICAgICAgaWYgKChnYWluIDwgZHJjQ29tcC0+c21vb3RoR2FpbltpXSkgfHwKKyAgICAgICAgICAgIChkcmNDb21wLT5ob2xkQ250W2ldID09CisgICAgICAgICAgICAgMCkpIHsgLyogaG9sZCBnYWluIHVubGVzcyB3ZSBoYXZlIGFuIGF0dGFjayBvciBob2xkCisgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kIGlzIG92ZXIgKi8KKyAgICAgICAgICBGSVhQX0RCTCBhY2N1OwogCi0gICAgICAgIC8qIE1vbm8gRG93bm1peCAtIGZvciBjb21wX3ZhbCBvbmx5ICovCi0gICAgICAgIGlmIChkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPiAxKSB7Ci0gICAgICAgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMcyAqLwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMczIgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUnMgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUnMyICovCi0gICAgICAgICAgICBpZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkpIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcuMWNoICovCi0gICAgICAgICAgICAvKmlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKSkgdG1wICo9MC43MDdmOyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcuMWNoICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtTXV0pKT4+KERPV05NSVhfU0hJRlQtMSk7IC8qIFMgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0NdID49IDApIHRtcCArPSBmTXVsdChjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQyAoMipjbGV2KSAqLwotICAgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xdXSk+PkRPV05NSVhfU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMICovCi0gICAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUl1dKT4+RE9XTk1JWF9TSElGVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAvKiBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXSA9ICgxLWFscGhhKSAqIGRyY0NvbXAtPnNtb290aExldmVsW2ldICsKKyAgICAgICAgICAgKiBhbHBoYSAqIGxldmVsOyAqLworICAgICAgICAgIGFjY3UgPSBmTXVsdCgoKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBhbHBoYSksIGRyY0NvbXAtPnNtb290aExldmVsW2ldKTsKKyAgICAgICAgICBhY2N1ICs9IGZNdWx0KGFscGhhLCBsZXZlbCk7CisgICAgICAgICAgZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0gPSBhY2N1OwogCi0gICAgICAgICAgICBwZWFrWzFdID0gZml4TWF4KHBlYWtbMV0sIGZpeHBfYWJzKHRtcCkpOworICAgICAgICAgIC8qIGRyY0NvbXAtPnNtb290aEdhaW5baV0gID0gKDEtYWxwaGEpICogZHJjQ29tcC0+c21vb3RoR2FpbltpXSArCisgICAgICAgICAgICogYWxwaGEgKiBnYWluOyAqLworICAgICAgICAgIGFjY3UgPSBmTXVsdCgoKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBhbHBoYSksIGRyY0NvbXAtPnNtb290aEdhaW5baV0pOworICAgICAgICAgIGFjY3UgKz0gZk11bHQoYWxwaGEsIGdhaW4pOworICAgICAgICAgIGRyY0NvbXAtPnNtb290aEdhaW5baV0gPSBhY2N1OwogICAgICAgICB9CisKKyAgICAgICAgLyogaG9sZCBjb3VudGVyICovCisgICAgICAgIGlmIChkcmNDb21wLT5ob2xkQ250W2ldKSB7CisgICAgICAgICAgZHJjQ29tcC0+aG9sZENudFtpXS0tOworICAgICAgICB9CisgICAgICAgIGlmIChnYWluIDwgZHJjQ29tcC0+c21vb3RoR2FpbltpXSkgeworICAgICAgICAgIGRyY0NvbXAtPmhvbGRDbnRbaV0gPSBkcmNDb21wLT5ob2xkT2ZmW2ldOworICAgICAgICB9CisgICAgICB9IC8qIHByb2ZpbGUgIT0gRFJDX05PTkUgKi8KKyAgICB9ICAgLyogZm9yIGk9MS4uMiAqLworICB9IGVsc2UgeworICAgIC8qIG5vIGNvbXByZXNzaW9uICovCisgICAgZHJjQ29tcC0+c21vb3RoR2FpblswXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgZHJjQ29tcC0+c21vb3RoR2FpblsxXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgIH0KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogbGltaXRlcgorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgZmluZFBlYWtMZXZlbHMoZHJjQ29tcCwgaW5TYW1wbGVzLCBjbGV2LCBzbGV2LCBleHRfbGV2YSwgZXh0X2xldmIsIGxmZV9sZXYsCisgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoKExPTkcpKGRteEdhaW41KSA8PCAoTUVUQURBVEFfRlJBQ1RfQklUUyAtIDE2KSksCisgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoKExPTkcpKGRteEdhaW4yKSA8PCAoTUVUQURBVEFfRlJBQ1RfQklUUyAtIDE2KSksCisgICAgICAgICAgICAgICAgIHBlYWspOworCisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICBGSVhQX0RCTCB0bXAgPSBkcmNDb21wLT5wcmV2UGVha1tpXTsKKyAgICBkcmNDb21wLT5wcmV2UGVha1tpXSA9IHBlYWtbaV07CisgICAgcGVha1tpXSA9IGZpeE1heChwZWFrW2ldLCB0bXApOworCisgICAgLyoKKyAgICAgKiBDb252ZXJ0IHRvIGRCRlMsIGFwcGx5IGRpYWxub3JtCisgICAgICovCisgICAgLyogZGVzY2FsZWQgcGVhayBpbiBsZDY0IHJlcHJlc2VudGF0aW9uICovCisgICAgRklYUF9EQkwgbGRfcGVhayA9CisgICAgICAgIENhbGNMZERhdGEocGVha1tpXSkgKworICAgICAgICAoRklYUF9EQkwpKChMT05HKURPV05NSVhfU0hJRlQgPDwgKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQpKTsKKworICAgIC8qIGlmIChwZWFrIDwgMWUtNikgbGV2ZWwgPSAxZS02ZjsgKi8KKyAgICBsZF9wZWFrID0KKyAgICAgICAgZk1heChsZF9wZWFrLCBGTDJGWENPTlNUX0RCTCgtMC4zMTE0MzA3NTg4OTU2OTAyMjAxMTI4NDI0NDY1MTQ2M2YpKTsKKworICAgIC8qIHBlYWtbaV0gPSAyMCAqIGxvZyhwZWFrW2ldKS9sb2coMTApICsgMC4yZiArCisgICAgICogKGRyY0NvbXAtPnNtb290aEdhaW5baV0qMl5NRVRBREFUQV9GUkFDVF9CSVRTKSBwZWFrW2ldID0gMjAgKgorICAgICAqIGxvZygyKS9sb2coMTApICogbGQocGVha1tpXSkgKyAwLjJmICsKKyAgICAgKiAoZHJjQ29tcC0+c21vb3RoR2FpbltpXSoyXk1FVEFEQVRBX0ZSQUNUX0JJVFMpIHBlYWtbaV0gPSAxMCAqCisgICAgICogMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQocGVha1tpXSkgKyAwLjJmICsKKyAgICAgKiAoZHJjQ29tcC0+c21vb3RoR2FpbltpXSoyXk1FVEFEQVRBX0ZSQUNUX0JJVFMpCisgICAgICoKKyAgICAgKiAgICBhZGRpdGlvbmFsIHNjYWxpbmcgd2l0aCBNRVRBREFUQV9GUkFDVF9CSVRTOgorICAgICAqIHBlYWtbaV0gPSAoMTAgKiAyKjAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KHBlYWtbaV0pICogNjQKKyAgICAgKiArIDAuMmYgKworICAgICAqIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykpKjJeKC1NRVRBREFUQV9GUkFDVF9CSVRTKQorICAgICAqIHBlYWtbaV0gPSAxMCoyXihNRVRBREFUQV9GUkFDVF9CSVRTK0xEX0RBVEFfU0hJRlQpICoKKyAgICAgKiAyKjAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KHBlYWtbaV0pCisgICAgICogICAgICAgICArIDAuMmYqMl4oLU1FVEFEQVRBX0ZSQUNUX0JJVFMpICsgZHJjQ29tcC0+c21vb3RoR2FpbltpXQorICAgICAqLworICAgIHBlYWtbaV0gPSBmTXVsdCgKKyAgICAgICAgKEZJWFBfREJMKSgxMCA8PCAoTUVUQURBVEFfRlJBQ1RfQklUUyArIExEX0RBVEFfU0hJRlQpKSwKKyAgICAgICAgZk11bHQoRkwyRlhfREJMKDIgKiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ZiksIGxkX3BlYWspKTsKKyAgICBwZWFrW2ldICs9CisgICAgICAgIChGTDJGWF9EQkwoMC41ZikgPj4gTUVUQURBVEFfSU5UX0JJVFMpOyAvKiBhZGQgYSBsaXR0bGUgYml0IGhlYWRyb29tICovCisgICAgcGVha1tpXSArPSBkcmNDb21wLT5zbW9vdGhHYWluW2ldOworICB9CisKKyAgLyogcGVhayAtPSBkaWFsbm9ybSArIDMxOyAqLyAvKiB0aGlzIGlzIERvbGJ5IHN0eWxlIG9ubHkgKi8KKyAgcGVha1swXSAtPSAoRklYUF9EQkwpKChkaWFsbm9ybSAtIGRyY19UYXJnZXRSZWZMZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IChNRVRBREFUQV9GUkFDVF9CSVRTIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNikpOyAvKiBwZWFrWzBdIC09IGRpYWxub3JtIC0gZHJjX1RhcmdldFJlZkxldmVsICovCisKKyAgLyogcGVhayArPSAxMTsgKi8KKyAgLyogdGhpcyBpcyBEb2xieSBzdHlsZSBvbmx5ICovIC8qIFJGIG1vZGUgb3V0cHV0IGlzIDExZEIgaGlnaGVyICovCisgIC8qcGVhayArPSBjb21wX1RhcmdldFJlZkxldmVsIC0gZHJjX1RhcmdldFJlZkxldmVsOyovCisgIHBlYWtbMV0gLT0KKyAgICAgIChGSVhQX0RCTCkoKGRpYWxub3JtIC0gY29tcF9UYXJnZXRSZWZMZXZlbCkKKyAgICAgICAgICAgICAgICAgPDwgKE1FVEFEQVRBX0ZSQUNUX0JJVFMgLQorICAgICAgICAgICAgICAgICAgICAgMTYpKTsgLyogcGVha1sxXSAtPSBkaWFsbm9ybSAtIGNvbXBfVGFyZ2V0UmVmTGV2ZWwgKi8KKworICAvKiBsaW1pdGVyIGdhaW4gKi8KKyAgZHJjQ29tcC0+bGltR2FpblswXSArPSBkcmNDb21wLT5saW1EZWNheTsgLyogbGluZWFyIGxpbWl0ZXIgcmVsZWFzZSAqLworICBkcmNDb21wLT5saW1HYWluWzBdID0gZml4TWluKGRyY0NvbXAtPmxpbUdhaW5bMF0sIC1wZWFrWzBdKTsKKworICBkcmNDb21wLT5saW1HYWluWzFdICs9IDIgKiBkcmNDb21wLT5saW1EZWNheTsgLyogbGluZWFyIGxpbWl0ZXIgcmVsZWFzZSAqLworICBkcmNDb21wLT5saW1HYWluWzFdID0gZml4TWluKGRyY0NvbXAtPmxpbUdhaW5bMV0sIC1wZWFrWzFdKTsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKiBhcHBseSBsaW1pdGluZywgcmV0dXJuIERSQyBnYWlucyovCisgIHsKKyAgICBGSVhQX0RCTCB0bXA7CisKKyAgICB0bXAgPSBkcmNDb21wLT5zbW9vdGhHYWluWzBdOworICAgIGlmIChkcmNDb21wLT5saW1HYWluWzBdIDwgRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgdG1wICs9IGRyY0NvbXAtPmxpbUdhaW5bMF07CiAgICAgfQorICAgICpwRHlucm5nID0gKExPTkcpc2NhbGVWYWx1ZSh0bXAsIC0oTUVUQURBVEFfRlJBQ1RfQklUUyAtIDE2KSk7CiAKLSAgICBmb3IgKGk9MDsgaTwyOyBpKyspIHsKLSAgICAgIEZJWFBfREJMIHRtcCA9IGRyY0NvbXAtPnByZXZQZWFrW2ldOwotICAgICAgZHJjQ29tcC0+cHJldlBlYWtbaV0gPSBwZWFrW2ldOwotICAgICAgcGVha1tpXSA9IGZpeE1heChwZWFrW2ldLCB0bXApOwotCi0gICAgICAvKgotICAgICAgICogQ29udmVydCB0byBkQkZTLCBhcHBseSBkaWFsbm9ybQotICAgICAgICovCi0gICAgICAvKiBkZXNjYWxlZCBwZWFrIGluIGxkNjQgcmVwcmVzZW50YXRpb24gKi8KLSAgICAgIEZJWFBfREJMIGxkX3BlYWsgPSBDYWxjTGREYXRhKHBlYWtbaV0pICsgKEZJWFBfREJMKSgoTE9ORylET1dOTUlYX1NISUZUPDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSk7Ci0KLSAgICAgIC8qIGlmIChwZWFrIDwgMWUtNikgbGV2ZWwgPSAxZS02ZjsgKi8KLSAgICAgIGxkX3BlYWsgPSBGREttYXgobGRfcGVhaywgRkwyRlhDT05TVF9EQkwoLTAuMzExNDMwNzU4ODk1NjkwMjIwMTEyODQyNDQ2NTE0NjNmKSk7Ci0KLSAgICAgIC8qIHBlYWtbaV0gPSAyMCAqIGxvZyhwZWFrW2ldKS9sb2coMTApICsgMC4yZiArIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykKLSAgICAgICAqIHBlYWtbaV0gPSAyMCAqIGxvZygyKS9sb2coMTApICogbGQocGVha1tpXSkgKyAwLjJmICsgKGRyY0NvbXAtPnNtb290aEdhaW5baV0qMl5NRVRBREFUQV9GUkFDVF9CSVRTKQotICAgICAgICogcGVha1tpXSA9IDEwICogMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQocGVha1tpXSkgKyAwLjJmICsgKGRyY0NvbXAtPnNtb290aEdhaW5baV0qMl5NRVRBREFUQV9GUkFDVF9CSVRTKQotICAgICAgICoKLSAgICAgICAqICAgIGFkZGl0aW9uYWwgc2NhbGluZyB3aXRoIE1FVEFEQVRBX0ZSQUNUX0JJVFM6Ci0gICAgICAgKiBwZWFrW2ldID0gKDEwICogMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChwZWFrW2ldKSAqIDY0ICsgMC4yZiArIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykpKjJeKC1NRVRBREFUQV9GUkFDVF9CSVRTKQotICAgICAgICogcGVha1tpXSA9IDEwKjJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkgKiAyKjAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KHBlYWtbaV0pCi0gICAgICAgKiAgICAgICAgICsgMC4yZioyXigtTUVUQURBVEFfRlJBQ1RfQklUUykgKyBkcmNDb21wLT5zbW9vdGhHYWluW2ldCi0gICAgICAgKi8KLSAgICAgIHBlYWtbaV0gPSBmTXVsdCgoRklYUF9EQkwpKDEwPDwoTUVUQURBVEFfRlJBQ1RfQklUUytMRF9EQVRBX1NISUZUKSksIGZNdWx0KCBGTDJGWF9EQkwoMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ZiksIGxkX3BlYWspKTsKLSAgICAgIHBlYWtbaV0gKz0gKEZMMkZYX0RCTCgwLjVmKT4+TUVUQURBVEFfSU5UX0JJVFMpOyAgICAgICAgICAgLyogYWRkIGEgbGl0dGxlIGJpdCBoZWFkcm9vbSAqLwotICAgICAgcGVha1tpXSArPSAgZHJjQ29tcC0+c21vb3RoR2FpbltpXTsKKyAgICB0bXAgPSBkcmNDb21wLT5zbW9vdGhHYWluWzFdOworICAgIGlmIChkcmNDb21wLT5saW1HYWluWzFdIDwgRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgdG1wICs9IGRyY0NvbXAtPmxpbUdhaW5bMV07CiAgICAgfQorICAgICpwQ29tcHIgPSAoTE9ORylzY2FsZVZhbHVlKHRtcCwgLShNRVRBREFUQV9GUkFDVF9CSVRTIC0gMTYpKTsKKyAgfQogCi0gICAgLyogcGVhayAtPSBkaWFsbm9ybSArIDMxOyAqLyAgLyogdGhpcyBpcyBEb2xieSBzdHlsZSBvbmx5ICovCi0gICAgcGVha1swXSAtPSAoRklYUF9EQkwpKChkaWFsbm9ybS1kcmNfVGFyZ2V0UmVmTGV2ZWwpPDwoTUVUQURBVEFfRlJBQ1RfQklUUy0xNikpOyAvKiBwZWFrWzBdIC09IGRpYWxub3JtIC0gZHJjX1RhcmdldFJlZkxldmVsICovCi0KLSAgICAvKiBwZWFrICs9IDExOyAqLyAgIC8qIHRoaXMgaXMgRG9sYnkgc3R5bGUgb25seSAqLyAgICAgIC8qIFJGIG1vZGUgb3V0cHV0IGlzIDExZEIgaGlnaGVyICovCi0gICAgLypwZWFrICs9IGNvbXBfVGFyZ2V0UmVmTGV2ZWwgLSBkcmNfVGFyZ2V0UmVmTGV2ZWw7Ki8KLSAgICBwZWFrWzFdIC09IChGSVhQX0RCTCkoKGRpYWxub3JtLWNvbXBfVGFyZ2V0UmVmTGV2ZWwpPDwoTUVUQURBVEFfRlJBQ1RfQklUUy0xNikpOyAvKiBwZWFrWzFdIC09IGRpYWxub3JtIC0gY29tcF9UYXJnZXRSZWZMZXZlbCAqLwotCi0gICAgLyogbGltaXRlciBnYWluICovCi0gICAgZHJjQ29tcC0+bGltR2FpblswXSArPSBkcmNDb21wLT5saW1EZWNheTsgICAgICAgICAgICAgICAvKiBsaW5lYXIgbGltaXRlciByZWxlYXNlICovCi0gICAgZHJjQ29tcC0+bGltR2FpblswXSA9IGZpeE1pbihkcmNDb21wLT5saW1HYWluWzBdLCAtcGVha1swXSk7Ci0KLSAgICBkcmNDb21wLT5saW1HYWluWzFdICs9IDIqZHJjQ29tcC0+bGltRGVjYXk7ICAgICAgICAgICAgIC8qIGxpbmVhciBsaW1pdGVyIHJlbGVhc2UgKi8KLSAgICBkcmNDb21wLT5saW1HYWluWzFdID0gZml4TWluKGRyY0NvbXAtPmxpbUdhaW5bMV0sIC1wZWFrWzFdKTsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogYXBwbHkgbGltaXRpbmcsIHJldHVybiBEUkMgZ2FpbnMqLwotICAgIHsKLSAgICAgICAgRklYUF9EQkwgdG1wOwotCi0gICAgICAgIHRtcCA9IGRyY0NvbXAtPnNtb290aEdhaW5bMF07Ci0gICAgICAgIGlmIChkcmNDb21wLT5saW1HYWluWzBdIDwgRkwyRlhDT05TVF9EQkwoMC5mKSkgewotICAgICAgICAgIHRtcCArPSBkcmNDb21wLT5saW1HYWluWzBdOwotICAgICAgICB9Ci0gICAgICAgICpwRHlucm5nID0gKExPTkcpIHNjYWxlVmFsdWUodG1wLCAtKE1FVEFEQVRBX0ZSQUNUX0JJVFMtMTYpKTsKLQotICAgICAgICB0bXAgPSBkcmNDb21wLT5zbW9vdGhHYWluWzFdOwotICAgICAgICBpZiAoZHJjQ29tcC0+bGltR2FpblsxXSA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKLSAgICAgICAgICB0bXAgKz0gZHJjQ29tcC0+bGltR2FpblsxXTsKLSAgICAgICAgfQotICAgICAgICAqcENvbXByICA9IChMT05HKSBzY2FsZVZhbHVlKHRtcCwgLShNRVRBREFUQV9GUkFDVF9CSVRTLTE2KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7CisgIHJldHVybiAwOwogfQogCi0KLURSQ19QUk9GSUxFIEZES19EUkNfR2VuZXJhdG9yX2dldERyY1Byb2ZpbGUoY29uc3QgSERSQ19DT01QIGRyY0NvbXApCi17Ci0gICAgcmV0dXJuIGRyY0NvbXAtPnByb2ZpbGVbMF07CitEUkNfUFJPRklMRSBGREtfRFJDX0dlbmVyYXRvcl9nZXREcmNQcm9maWxlKGNvbnN0IEhEUkNfQ09NUCBkcmNDb21wKSB7CisgIHJldHVybiBkcmNDb21wLT5wcm9maWxlWzBdOwogfQogCi1EUkNfUFJPRklMRSBGREtfRFJDX0dlbmVyYXRvcl9nZXRDb21wUHJvZmlsZShjb25zdCBIRFJDX0NPTVAgZHJjQ29tcCkKLXsKLSAgICByZXR1cm4gZHJjQ29tcC0+cHJvZmlsZVsxXTsKK0RSQ19QUk9GSUxFIEZES19EUkNfR2VuZXJhdG9yX2dldENvbXBQcm9maWxlKGNvbnN0IEhEUkNfQ09NUCBkcmNDb21wKSB7CisgIHJldHVybiBkcmNDb21wLT5wcm9maWxlWzFdOwogfQotCi0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfY29tcHJlc3Nvci5oIGIvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9jb21wcmVzc29yLmgKaW5kZXggZmY2MzliNS4uMWQwYWE0MiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9jb21wcmVzc29yLmgKKysrIGIvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9jb21wcmVzc29yLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNzUgKzkwLDczIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBBQUMgRW5jb2RlciBsaWIgICoqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgQXV0aG9yKHMpOiBNLiBOZXVzaW5nZXIKKyAgIEF1dGhvcihzKTogICBNLiBOZXVzaW5nZXIKKwogICAgRGVzY3JpcHRpb246IENvbXByZXNzb3IgZm9yIEFBQyBNZXRhZGF0YSBHZW5lcmF0b3IKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfTUVUQURBVEFfQ09NUFJFU1NPUl9ICi0jZGVmaW5lIF9NRVRBREFUQV9DT01QUkVTU09SX0gKLQorI2lmbmRlZiBNRVRBREFUQV9DT01QUkVTU09SX0gKKyNkZWZpbmUgTUVUQURBVEFfQ09NUFJFU1NPUl9ICiAKICNpbmNsdWRlICJGREtfYXVkaW8uaCIKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKICNpbmNsdWRlICJhYWNlbmMuaCIKIAorI2RlZmluZSBMRkVfTEVWX1NDQUxFIDIKIAogLyoqCiAgKiAgRFJDIGNvbXByZXNzaW9uIHByb2ZpbGVzLgogICovCiB0eXBlZGVmIGVudW0gRFJDX1BST0ZJTEUgewotICBEUkNfTk9ORSAgICAgICAgICA9IDAsCi0gIERSQ19GSUxNU1RBTkRBUkQgID0gMSwKLSAgRFJDX0ZJTE1MSUdIVCAgICAgPSAyLAorICBEUkNfTk9ORSA9IDAsCisgIERSQ19GSUxNU1RBTkRBUkQgPSAxLAorICBEUkNfRklMTUxJR0hUID0gMiwKICAgRFJDX01VU0lDU1RBTkRBUkQgPSAzLAotICBEUkNfTVVTSUNMSUdIVCAgICA9IDQsCi0gIERSQ19TUEVFQ0ggICAgICAgID0gNSwKLSAgRFJDX0RFTEFZX1RFU1QgICAgPSA2CisgIERSQ19NVVNJQ0xJR0hUID0gNCwKKyAgRFJDX1NQRUVDSCA9IDUsCisgIERSQ19ERUxBWV9URVNUID0gNiwKKyAgRFJDX05PVF9QUkVTRU5UID0gLTIKIAogfSBEUkNfUFJPRklMRTsKIAotCiAvKioKICAqICBEUkMgQ29tcHJlc3NvciBoYW5kbGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IERSQ19DT01QICBEUkNfQ09NUCwgKkhEUkNfQ09NUDsKK3R5cGVkZWYgc3RydWN0IERSQ19DT01QIERSQ19DT01QLCAqSERSQ19DT01QOwogCiAvKioKICAqIFxicmllZiAgT3BlbiBhIERSQyBDb21wcmVzc29yIGluc3RhbmNlLgogICoKICAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBjb21wcmVzc29yIGluc3RhbmNlLgogICoKLSAqIFxwYXJhbSBwaERyY0NvbXAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIGEgY29tcHJlc3NvciBoYW5kbGUuIEluaXRpYWxpemVkIG9uIHJldHVybi4KKyAqIFxwYXJhbSBwaERyY0NvbXAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIGEgY29tcHJlc3NvciBoYW5kbGUuIEluaXRpYWxpemVkIG9uCisgKiByZXR1cm4uCiAgKgogICogXHJldHVybgogICogICAgICAgICAgLSAwLCBvbiBzdWNjZXMuCiAgKiAgICAgICAgICAtIHVuZXF1YWwgMCwgb24gZmFpbHVyZS4KICAqLwotSU5UIEZES19EUkNfR2VuZXJhdG9yX09wZW4oCi0gICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAqcGhEcmNDb21wCi0gICAgICAgICk7Ci0KK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9PcGVuKEhEUkNfQ09NUCAqcGhEcmNDb21wKTsKIAogLyoqCiAgKiBcYnJpZWYgIENsb3NlIHRoZSBEUkMgQ29tcHJlc3NvciBpbnN0YW5jZS4KICAqCiAgKiBEZWFsbG9jYXRlIGluc3RhbmNlIGFuZCBmcmVlIHdob2xlIG1lbW9yeS4KICAqCi0gKiBccGFyYW0gcGhEcmNDb21wICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvbXByZXNzb3IgaGFuZGxlIHRvIGJlIGRlYWxsb2NhdGVkLgorICogXHBhcmFtIHBoRHJjQ29tcCAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb21wcmVzc29yIGhhbmRsZSB0byBiZQorICogZGVhbGxvY2F0ZWQuCiAgKgogICogXHJldHVybgogICogICAgICAgICAgLSAwLCBvbiBzdWNjZXMuCiAgKiAgICAgICAgICAtIHVuZXF1YWwgMCwgb24gZmFpbHVyZS4KICAqLwotSU5UIEZES19EUkNfR2VuZXJhdG9yX0Nsb3NlKAotICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgKnBoRHJjQ29tcAotICAgICAgICApOworSU5UIEZES19EUkNfR2VuZXJhdG9yX0Nsb3NlKEhEUkNfQ09NUCAqcGhEcmNDb21wKTsKIAogLyoqCiAgKiBcYnJpZWYgIENvbmZpZ3VyZSBEUkMgQ29tcHJlc3Nvci4KQEAgLTE1NSw3ICsxNjQsOCBAQAogICogXHBhcmFtIGRyY0NvbXAgICAgICAgICAgICAgICBDb21wcmVzc29yIGhhbmRsZS4KICAqIFxwYXJhbSBwcm9maWxlTGluZSAgICAgICAgICAgRFJDIHByb2ZpbGUgZm9yIGxpbmUgbW9kZS4KICAqIFxwYXJhbSBwcm9maWxlUkYgICAgICAgICAgICAgRFJDIHByb2ZpbGUgZm9yIFJGIG1vZGUuCi0gKiBccGFyYW0gYmxvY2tMZW5ndGggICAgICAgICAgIExlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrIGluIHNhbXBsZXMgcGVyIGNoYW5uZWwuCisgKiBccGFyYW0gYmxvY2tMZW5ndGggICAgICAgICAgIExlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrIGluIHNhbXBsZXMgcGVyCisgKiBjaGFubmVsLgogICogXHBhcmFtIHNhbXBsZVJhdGUgICAgICAgICAgICBTYW1wbGluZyByYXRlIGluIEh6LgogICogXHBhcmFtIGNoYW5uZWxNb2RlICAgICAgICAgICBDaGFubmVsIGNvbmZpZ3VyYXRpb24uCiAgKiBccGFyYW0gY2hhbm5lbE9yZGVyICAgICAgICAgIENoYW5uZWwgb3JkZXIsIE1QRUcgb3IgV0FWLgpAQCAtMTY1LDQ2ICsxNzUsNDkgQEAKICAqICAgICAgICAgIC0gMCwgb24gc3VjY2VzcywKICAqICAgICAgICAgIC0gdW5lcXVhbCAwLCBvbiBmYWlsdXJlCiAgKi8KLUlOVCBGREtfRFJDX0dlbmVyYXRvcl9Jbml0aWFsaXplKAotICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgIGRyY0NvbXAsCi0gICAgICAgIGNvbnN0IERSQ19QUk9GSUxFICAgICAgICAgICAgICAgcHJvZmlsZUxpbmUsCi0gICAgICAgIGNvbnN0IERSQ19QUk9GSUxFICAgICAgICAgICAgICAgcHJvZmlsZVJGLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrTGVuZ3RoLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgIGNvbnN0IENIQU5ORUxfTU9ERSAgICAgICAgICAgICAgY2hhbm5lbE1vZGUsCi0gICAgICAgIGNvbnN0IENIQU5ORUxfT1JERVIgICAgICAgICAgICAgY2hhbm5lbE9yZGVyLAotICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgICAgIHVzZVdlaWdodGluZwotICAgICAgICApOworSU5UIEZES19EUkNfR2VuZXJhdG9yX0luaXRpYWxpemUoSERSQ19DT01QIGRyY0NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEUkNfUFJPRklMRSBwcm9maWxlTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19QUk9GSUxFIHByb2ZpbGVSRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja0xlbmd0aCwgY29uc3QgVUlOVCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9PUkRFUiBjaGFubmVsT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiB1c2VXZWlnaHRpbmcpOwogCiAvKioKICAqIFxicmllZiAgQ2FsY3VsYXRlIERSQyBDb21wcmVzc29yIEdhaW4uCiAgKgogICogXHBhcmFtIGRyY0NvbXAgICAgICAgICAgICAgICBDb21wcmVzc29yIGhhbmRsZS4KICAqIFxwYXJhbSBpblNhbXBsZXMgICAgICAgICAgICAgUG9pbnRlciB0byBpbnRlcmxlYXZlZCBpbnB1dCBhdWRpbyBzYW1wbGVzLgorICogXHBhcmFtIGluU2FtcGxlc0J1ZlNpemUgICAgICBTaXplIG9mIGluU2FtcGxlcyBmb3Igb25lIGNoYW5uZWwuCiAgKiBccGFyYW0gZGlhbG5vcm0gICAgICAgICAgICAgIERpYWxvZyBMZXZlbCBpbiBkQiAodHlwaWNhbGx5IC0zMS4uLi0xKS4KICAqIFxwYXJhbSBkcmNfVGFyZ2V0UmVmTGV2ZWwKICAqIFxwYXJhbSBjb21wX1RhcmdldFJlZkxldmVsCi0gKiBccGFyYW0gY2xldiAgICAgICAgICAgICAgICAgIERvd25taXggY2VudGVyIG1peCBmYWN0b3IgKHR5cGljYWxseSAwLjcwNywgMC41OTUgb3IgMC41KQotICogXHBhcmFtIHNsZXYgICAgICAgICAgICAgICAgICBEb3dubWl4IHN1cnJvdW5kIG1peCBmYWN0b3IgKHR5cGljYWxseSAwLjcwNywgMC41LCBvciAwKQotICogXHBhcmFtIGR5bnJuZyAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHZhcmlhYmxlIHJlY2VpdmluZyBsaW5lIG1vZGUgRFJDIGdhaW4gaW4gZEIKLSAqIFxwYXJhbSBjb21wciAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB2YXJpYWJsZSByZWNlaXZpbmcgUkYgbW9kZSBEUkMgZ2FpbiBpbiBkQgorICogXHBhcmFtIGNsZXYgICAgICAgICAgICAgICAgICBEb3dubWl4IGNlbnRlciBtaXggZmFjdG9yICh0eXBpY2FsbHkgMC43MDcsCisgKiAwLjU5NSBvciAwLjUpCisgKiBccGFyYW0gc2xldiAgICAgICAgICAgICAgICAgIERvd25taXggc3Vycm91bmQgbWl4IGZhY3RvciAodHlwaWNhbGx5IDAuNzA3LAorICogMC41LCBvciAwKQorICogXHBhcmFtIGV4dF9sZXZhICAgICAgICAgICAgICBEb3dubWl4IGdhaW4gZmFjdG9yIEEKKyAqIFxwYXJhbSBleHRfbGV2YiAgICAgICAgICAgICAgRG93bm1peCBnYWluIGZhY3RvciBCCisgKiBccGFyYW0gbGZlX2xldiAgICAgICAgICAgICAgIExGRSBnYWluIGZhY3RvcgorICogXHBhcmFtIGRteEdhaW41ICAgICAgICAgICAgICBHYWluIGZhY3RvciBmb3IgZG93bm1peCB0byA1IGNoYW5uZWxzCisgKiBccGFyYW0gZG14R2FpbjIgICAgICAgICAgICAgIEdhaW4gZmFjdG9yIGZvciBkb3dubWl4IHRvIDIgY2hhbm5lbHMKKyAqIFxwYXJhbSBkeW5ybmcgICAgICAgICAgICAgICAgUG9pbnRlciB0byB2YXJpYWJsZSByZWNlaXZpbmcgbGluZSBtb2RlIERSQyBnYWluCisgKiBpbiBkQgorICogXHBhcmFtIGNvbXByICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHZhcmlhYmxlIHJlY2VpdmluZyBSRiBtb2RlIERSQyBnYWluCisgKiBpbiBkQgogICoKICAqIFxyZXR1cm4KICAqICAgICAgICAgIC0gMCwgb24gc3VjY2VzcywKICAqICAgICAgICAgIC0gdW5lcXVhbCAwLCBvbiBmYWlsdXJlCiAgKi8KLUlOVCBGREtfRFJDX0dlbmVyYXRvcl9DYWxjKAotICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgIGRyY0NvbXAsCi0gICAgICAgIGNvbnN0IElOVF9QQ00gKiBjb25zdCAgICAgICAgICAgaW5TYW1wbGVzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIGRpYWxub3JtLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIGRyY19UYXJnZXRSZWZMZXZlbCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBjb21wX1RhcmdldFJlZkxldmVsLAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgICAgIGNsZXYsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgICAgICAgc2xldiwKLSAgICAgICAgSU5UICogY29uc3QgICAgICAgICAgICAgICAgICAgICBkeW5ybmcsCi0gICAgICAgIElOVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgY29tcHIKLSAgICAgICAgKTsKLQorSU5UIEZES19EUkNfR2VuZXJhdG9yX0NhbGMoSERSQ19DT01QIGRyY0NvbXAsIGNvbnN0IElOVF9QQ00gKmNvbnN0IGluU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgaW5TYW1wbGVzQnVmU2l6ZSwgY29uc3QgSU5UIGRpYWxub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRyY19UYXJnZXRSZWZMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjb21wX1RhcmdldFJlZkxldmVsLCBjb25zdCBGSVhQX0RCTCBjbGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgc2xldiwgY29uc3QgRklYUF9EQkwgZXh0X2xldmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBleHRfbGV2YiwgY29uc3QgRklYUF9EQkwgbGZlX2xldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkbXhHYWluNSwgY29uc3QgSU5UIGRteEdhaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdCBkeW5ybmcsIElOVCAqY29uc3QgY29tcHIpOwogCiAvKioKICAqIFxicmllZiAgQ29uZmlndXJlIERSQyBDb21wcmVzc29yIFByb2ZpbGUuCkBAIC0yMTcsMTIgKzIzMCw5IEBACiAgKiAgICAgICAgICAtIDAsIG9uIHN1Y2Nlc3MsCiAgKiAgICAgICAgICAtIHVuZXF1YWwgMCwgb24gZmFpbHVyZQogICovCi1JTlQgRkRLX0RSQ19HZW5lcmF0b3Jfc2V0RHJjUHJvZmlsZSgKLSAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICBkcmNDb21wLAotICAgICAgICBjb25zdCBEUkNfUFJPRklMRSAgICAgICAgICAgICAgIHByb2ZpbGVMaW5lLAotICAgICAgICBjb25zdCBEUkNfUFJPRklMRSAgICAgICAgICAgICAgIHByb2ZpbGVSRgotICAgICAgICApOwotCitJTlQgRkRLX0RSQ19HZW5lcmF0b3Jfc2V0RHJjUHJvZmlsZShIRFJDX0NPTVAgZHJjQ29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19QUk9GSUxFIHByb2ZpbGVMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgcHJvZmlsZVJGKTsKIAogLyoqCiAgKiBcYnJpZWYgIEdldCBEUkMgcHJvZmlsZSBmb3IgbGluZSBtb2RlLgpAQCAtMjMxLDEwICsyNDEsNyBAQAogICoKICAqIFxyZXR1cm4gIEN1cnJlbnQgUHJvZmlsZS4KICAqLwotRFJDX1BST0ZJTEUgRkRLX0RSQ19HZW5lcmF0b3JfZ2V0RHJjUHJvZmlsZSgKLSAgICAgICAgY29uc3QgSERSQ19DT01QICAgICAgICAgICAgICAgICBkcmNDb21wCi0gICAgICAgICk7Ci0KK0RSQ19QUk9GSUxFIEZES19EUkNfR2VuZXJhdG9yX2dldERyY1Byb2ZpbGUoY29uc3QgSERSQ19DT01QIGRyY0NvbXApOwogCiAvKioKICAqIFxicmllZiAgR2V0IERSQyBwcm9maWxlIGZvciBSRiBtb2RlLgpAQCAtMjQzLDEwICsyNTAsNiBAQAogICoKICAqIFxyZXR1cm4gIEN1cnJlbnQgUHJvZmlsZS4KICAqLwotRFJDX1BST0ZJTEUgRkRLX0RSQ19HZW5lcmF0b3JfZ2V0Q29tcFByb2ZpbGUoCi0gICAgICAgIGNvbnN0IEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgZHJjQ29tcAotICAgICAgICApOworRFJDX1BST0ZJTEUgRkRLX0RSQ19HZW5lcmF0b3JfZ2V0Q29tcFByb2ZpbGUoY29uc3QgSERSQ19DT01QIGRyY0NvbXApOwogCi0KLSNlbmRpZiAvKiBfTUVUQURBVEFfQ09NUFJFU1NPUl9IICovCi0KKyNlbmRpZiAvKiBNRVRBREFUQV9DT01QUkVTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfbWFpbi5jcHAgYi9saWJBQUNlbmMvc3JjL21ldGFkYXRhX21haW4uY3BwCmluZGV4IDkwZjhmNGUuLmVkZDM4MzEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfbWFpbi5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9tYWluLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNSArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIEFBQyBFbmNvZGVyIGxpYiAgKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6IFYuIEJhY2lnYWx1cG8KKyAgIEF1dGhvcihzKTogICBWLiBCYWNpZ2FsdXBvCisKICAgIERlc2NyaXB0aW9uOiBNZXRhZGF0YSBFbmNvZGVyIGxpYnJhcnkgaW50ZXJmYWNlIGZ1bmN0aW9ucwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJtZXRhZGF0YV9tYWluLmgiCiAjaW5jbHVkZSAibWV0YWRhdGFfY29tcHJlc3Nvci5oIgpAQCAtOTYsNTUxICsxMDcsNjk3IEBACiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAogLyotLS0tLS0tLS0tLS0tLS0tLSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBNQVhfRFJDX0JBTkRTICAgICAgICAoMTw8NCkKLSNkZWZpbmUgTUFYX0RSQ19DSEFOTkVMUyAgICAgICAgKDgpCi0jZGVmaW5lIE1BWF9EUkNfRlJBTUVMRU4gICAoMioxMDI0KQorI2RlZmluZSBNQVhfRFJDX0JBTkRTICgxIDw8IDQpCisjZGVmaW5lIE1BWF9EUkNfRlJBTUVMRU4gKDIgKiAxMDI0KQorI2RlZmluZSBNQVhfREVMQVlfRlJBTUVTICgzKQogCiAvKi0tLS0tLS0tLS0tLS0tLSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi10eXBlZGVmIHN0cnVjdCBBQUNfTUVUQURBVEEKLXsKK3R5cGVkZWYgc3RydWN0IEFBQ19NRVRBREFUQSB7CiAgIC8qIE1QRUc6IER5bmFtaWMgUmFuZ2UgQ29udHJvbCAqLwogICBzdHJ1Y3QgewotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dfcmVmX2xldmVsX3ByZXNlbnQ7Ci0gICAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ19yZWZfbGV2ZWw7CisgICAgVUNIQVIgcHJvZ19yZWZfbGV2ZWxfcHJlc2VudDsKKyAgICBTQ0hBUiBwcm9nX3JlZl9sZXZlbDsKIAotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGR5bl9ybmdfc2duW01BWF9EUkNfQkFORFNdOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGR5bl9ybmdfY3RsW01BWF9EUkNfQkFORFNdOworICAgIFVDSEFSIGR5bl9ybmdfc2duW01BWF9EUkNfQkFORFNdOworICAgIFVDSEFSIGR5bl9ybmdfY3RsW01BWF9EUkNfQkFORFNdOwogCi0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgZHJjX2JhbmRzX3ByZXNlbnQ7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgZHJjX2JhbmRfaW5jcjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBkcmNfYmFuZF90b3BbTUFYX0RSQ19CQU5EU107Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgZHJjX2ludGVycG9sYXRpb25fc2NoZW1lOwotICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRSAgIGRyY19wcm9maWxlOwotICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyY19UYXJnZXRSZWZMZXZlbDsgICAgLyogdXNlZCBmb3IgTGltaXRlciAqLworICAgIFVDSEFSIGRyY19iYW5kc19wcmVzZW50OworICAgIFVDSEFSIGRyY19iYW5kX2luY3I7CisgICAgVUNIQVIgZHJjX2JhbmRfdG9wW01BWF9EUkNfQkFORFNdOworICAgIFVDSEFSIGRyY19pbnRlcnBvbGF0aW9uX3NjaGVtZTsKKyAgICBBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgZHJjX3Byb2ZpbGU7CisgICAgSU5UIGRyY19UYXJnZXRSZWZMZXZlbDsgLyogdXNlZCBmb3IgTGltaXRlciAqLwogCiAgICAgLyogZXhjbHVkZWQgY2hhbm5lbHMgKi8KLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZF9jaG5zX3ByZXNlbnQ7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZV9tYXNrWzJdOyAgICAgICAvKiBNQVhfTlVNQkVSX0NIQU5ORUxTLzggKi8KKyAgICBVQ0hBUiBleGNsdWRlZF9jaG5zX3ByZXNlbnQ7CisgICAgVUNIQVIgZXhjbHVkZV9tYXNrWzJdOyAvKiBNQVhfTlVNQkVSX0NIQU5ORUxTLzggKi8KICAgfSBtcGVnRHJjOwogCiAgIC8qIEVUU0k6IGFkZHRsIGFuY2lsbGFyeSBkYXRhICovCiAgIHN0cnVjdCB7CiAgICAgLyogSGVhdnkgQ29tcHJlc3Npb24gKi8KLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbl9vbjsgICAgICAgIC8qIGZsYWcsIGlmIGNvbXByZXNzaW9uIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuICovCi0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25fdmFsdWU7ICAgICAvKiBjb21wcmVzc2lvbiB2YWx1ZSAqLwotICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRSAgIGNvbXBfcHJvZmlsZTsKLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wX1RhcmdldFJlZkxldmVsOyAgIC8qIHVzZWQgZm9yIExpbWl0ZXIgKi8KLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lY29kZV9jb2Fyc2Vfc3RhdHVzOwotICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVjb2RlX2ZpbmVfc3RhdHVzOworICAgIFVDSEFSIGNvbXByZXNzaW9uX29uOyAgICAvKiBmbGFnLCBpZiBjb21wcmVzc2lvbiB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiAqLworICAgIFVDSEFSIGNvbXByZXNzaW9uX3ZhbHVlOyAvKiBjb21wcmVzc2lvbiB2YWx1ZSAqLworICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRSBjb21wX3Byb2ZpbGU7CisgICAgSU5UIGNvbXBfVGFyZ2V0UmVmTGV2ZWw7IC8qIHVzZWQgZm9yIExpbWl0ZXIgKi8KKyAgICBJTlQgdGltZWNvZGVfY29hcnNlX3N0YXR1czsKKyAgICBJTlQgdGltZWNvZGVfZmluZV9zdGF0dXM7CisKKyAgICBVQ0hBUiBleHRBbmNEYXRhU3RhdHVzOworCisgICAgc3RydWN0IHsKKyAgICAgIFVDSEFSIGV4dF9kb3dubWl4X2x2bF9zdGF0dXM7CisgICAgICBVQ0hBUiBleHRfZG93bm1peF9nYWluX3N0YXR1czsKKyAgICAgIFVDSEFSIGV4dF9sZmVfZG93bm1peF9zdGF0dXM7CisgICAgICBVQ0hBUgorICAgICAgZXh0X2RtaXhfYV9pZHg7IC8qIGV4dGVuZGVkIGRvd25taXggbGV2ZWwgKDAuLjcsIGFjY29yZGluZyB0byB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIFVDSEFSCisgICAgICBleHRfZG1peF9iX2lkeDsgLyogZXh0ZW5kZWQgZG93bm1peCBsZXZlbCAoMC4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgVUNIQVIgZG14X2dhaW5fNV9zZ247CisgICAgICBVQ0hBUiBkbXhfZ2Fpbl81X2lkeDsKKyAgICAgIFVDSEFSIGRteF9nYWluXzJfc2duOworICAgICAgVUNIQVIgZG14X2dhaW5fMl9pZHg7CisgICAgICBVQ0hBUiBleHRfZG1peF9sZmVfaWR4OyAvKiBleHRlbmRlZCBkb3dubWl4IGxldmVsIGZvciBsZmUgKDAuLjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLworCisgICAgfSBleHRBbmNEYXRhOworCiAgIH0gZXRzaUFuY0RhdGE7CiAKLSAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyTWl4TGV2ZWw7ICAgICAgICAgIC8qIGNlbnRlciBkb3dubWl4IGxldmVsICgwLi4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLwotICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBzdXJyb3VuZE1peExldmVsOyAgICAgICAgLyogc3Vycm91bmQgZG93bm1peCBsZXZlbCAoMC4uLjcsIGFjY29yZGluZyB0byB0YWJsZSkgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVQQ0VNaXhEd25JZHg7ICAgICAgIC8qIGZsYWcgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgRG14THZsX09uOyAgICAgICAgICAgICAgIC8qIGZsYWcgKi8KKyAgU0NIQVIgY2VudGVyTWl4TGV2ZWw7IC8qIGNlbnRlciBkb3dubWl4IGxldmVsICgwLi4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLworICBTQ0hBUgorICBzdXJyb3VuZE1peExldmVsOyAvKiBzdXJyb3VuZCBkb3dubWl4IGxldmVsICgwLi4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLworICBVQ0hBUiBXcml0ZVBDRU1peER3bklkeDsgLyogZmxhZyAqLworICBVQ0hBUiBEbXhMdmxfT247ICAgICAgICAgLyogZmxhZyAqLwogCi0gIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGRvbGJ5U3Vycm91bmRNb2RlOworICBVQ0hBUiBkb2xieVN1cnJvdW5kTW9kZTsKKyAgVUNIQVIgZHJjUHJlc2VudGF0aW9uTW9kZTsKIAotICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgbWV0YSBkYXRhIG1vZGUgaW4gY3VycmVudCBmcmFtZSAoZGVsYXkgbGluZSkgKi8KKyAgVUNIQVIKKyAgbWV0YWRhdGFNb2RlOyAvKiBpbmRpY2F0ZSBtZXRhIGRhdGEgbW9kZSBpbiBjdXJyZW50IGZyYW1lIChkZWxheSBsaW5lKSAqLwogCiB9IEFBQ19NRVRBREFUQTsKIAotc3RydWN0IEZES19NRVRBREFUQV9FTkNPREVSCi17Ci0gIElOVCAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGU7Ci0gIEhEUkNfQ09NUCAgICAgICAgICBoRHJjQ29tcDsKLSAgQUFDRU5DX01ldGFEYXRhICAgIHN1Ym1pdHRlZE1ldGFEYXRhOwordHlwZWRlZiBzdHJ1Y3QgRkRLX01FVEFEQVRBX0VOQ09ERVIgeworICBJTlQgbWV0YWRhdGFNb2RlOworICBIRFJDX0NPTVAgaERyY0NvbXA7CisgIEFBQ0VOQ19NZXRhRGF0YSBzdWJtaXR0ZWRNZXRhRGF0YTsKIAotICBJTlQgICAgICAgICAgICAgICAgbkF1ZGlvRGF0YURlbGF5OwotICBJTlQgICAgICAgICAgICAgICAgbk1ldGFEYXRhRGVsYXk7Ci0gIElOVCAgICAgICAgICAgICAgICBuQ2hhbm5lbHM7CisgIElOVCBuQXVkaW9EYXRhRGVsYXk7IC8qIEFkZGl0aW9uYWwgZGVsYXkgdG8gcm91bmQgdXAgdG8gbmV4dCBmcmFtZSBib3JkZXIgKGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMpICovCisgIElOVCBuTWV0YURhdGFEZWxheTsgIC8qIE1ldGEgZGF0YSBkZWxheSAoaW4gZnJhbWVzKSAqLworICBJTlQgbkNoYW5uZWxzOworICBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGU7CiAKLSAgSU5UX1BDTSAgICAgICAgICAgIGF1ZGlvRGVsYXlCdWZmZXJbTUFYX0RSQ19DSEFOTkVMUypNQVhfRFJDX0ZSQU1FTEVOXTsKLSAgaW50ICAgICAgICAgICAgICAgIGF1ZGlvRGVsYXlJZHg7CisgIElOVF9QQ00qIHBBdWRpb0RlbGF5QnVmZmVyOwogCi0gIEFBQ19NRVRBREFUQSAgICAgICBtZXRhRGF0YUJ1ZmZlclszXTsKLSAgaW50ICAgICAgICAgICAgICAgIG1ldGFEYXRhRGVsYXlJZHg7CisgIEFBQ19NRVRBREFUQSBtZXRhRGF0YUJ1ZmZlcltNQVhfREVMQVlfRlJBTUVTXTsKKyAgSU5UIG1ldGFEYXRhRGVsYXlJZHg7CiAKLSAgVUNIQVIgICAgICAgICAgICAgIGRyY0luZm9QYXlsb2FkWzEyXTsKLSAgVUNIQVIgICAgICAgICAgICAgIGRyY0RzZVBheWxvYWRbOF07CisgIFVDSEFSIGRyY0luZm9QYXlsb2FkWzEyXTsKKyAgVUNIQVIgZHJjRHNlUGF5bG9hZFs4XTsKIAotICBJTlQgICAgICAgICAgICAgICAgbWF0cml4X21peGRvd25faWR4OworICBJTlQgbWF0cml4X21peGRvd25faWR4OworCiAgIEFBQ0VOQ19FWFRfUEFZTE9BRCBleFBheWxvYWRbMl07Ci0gIElOVCAgICAgICAgICAgICAgICBuRXh0ZW5zaW9uczsKKyAgSU5UIG5FeHRlbnNpb25zOwogCi0gIElOVCAgICAgICAgICAgICAgICBmaW5hbGl6ZU1ldGFEYXRhOyAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBzd2l0Y2ggb2ZmIGJ5IG9uZSBmcmFtZSBhbmQgd3JpdGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSB0aGUgbWV0YWRhdGEgc2V0dXAuICovCi19OworICBVSU5UIG1heENoYW5uZWxzOyAvKiBNYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0byBiZSBzdXBwb3J0ZWQuICovCiAKKyAgSU5UIGZpbmFsaXplTWV0YURhdGE7ICAgLyogRGVsYXkgc3dpdGNoIG9mZiBieSBvbmUgZnJhbWUgYW5kIHdyaXRlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiB0byAgIGZpbmFsaXplIHRoZSBtZXRhZGF0YSBzZXR1cC4gKi8KKyAgSU5UIGluaXRpYWxpemVNZXRhRGF0YTsgLyogRmlsbCB1cCBkZWxheSBsaW5lIHdpdGggZmlyc3QgbWV0YSBkYXRhIGluZm8uIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG8gaGF2ZSBtZXRhIGRhdGEgYWxyZWFkeSBpbiBmaXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS4gKi8KK30gRkRLX01FVEFEQVRBX0VOQ09ERVI7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSBkZWZhdWx0TWV0YURhdGFTZXR1cCA9IHsKLSAgICBBQUNFTkNfTUVUQURBVEFfRFJDX05PTkUsCi0gICAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT05FLAotICAgIC0oMzE8PDE2KSwKLSAgICAtKDMxPDwxNiksCi0gICAgMCwKLSAgICAtKDMxPDwxNiksCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwCisgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT05FLCAgICAgICAgLyogZHJjX3Byb2ZpbGUgKi8KKyAgICBBQUNFTkNfTUVUQURBVEFfRFJDX05PVF9QUkVTRU5ULCAvKiBjb21wX3Byb2ZpbGUgKi8KKyAgICAtKDMxIDw8IDE2KSwgICAgICAgICAgICAgICAgICAgICAvKiBkcmNfVGFyZ2V0UmVmTGV2ZWwgKi8KKyAgICAtKDIzIDw8IDE2KSwgICAgICAgICAgICAgICAgICAgICAvKiBjb21wX1RhcmdldFJlZkxldmVsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvZ19yZWZfbGV2ZWxfcHJlc2VudCAqLworICAgIC0oMjMgPDwgMTYpLCAgICAgICAgICAgICAgICAgICAgIC8qIHByb2dfcmVmX2xldmVsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUENFX21peGRvd25faWR4X3ByZXNlbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFVFNJX0RteEx2bF9wcmVzZW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2VudGVyTWl4TGV2ZWwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdXJyb3VuZE1peExldmVsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9sYnlTdXJyb3VuZE1vZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcmNQcmVzZW50YXRpb25Nb2RlICovCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9ICAgICAgLyogRXh0TWV0YURhdGEgKi8KIH07CiAKIHN0YXRpYyBjb25zdCBGSVhQX0RCTCBkbXhUYWJsZVs4XSA9IHsKLSAgICAoKEZJWFBfREJMKU1BWFZBTF9EQkwpLCBGTDJGWENPTlNUX0RCTCgwLjg0MWYpLCBGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCBGTDJGWENPTlNUX0RCTCgwLjU5NmYpLAotICAgIEZMMkZYQ09OU1RfREJMKDAuNTAwZiksIEZMMkZYQ09OU1RfREJMKDAuNDIyZiksIEZMMkZYQ09OU1RfREJMKDAuMzU1ZiksIEZMMkZYQ09OU1RfREJMKDAuMDAwZikKLX07CisgICAgKChGSVhQX0RCTClNQVhWQUxfREJMKSwgRkwyRlhDT05TVF9EQkwoMC44NDFmKSwgRkwyRlhDT05TVF9EQkwoMC43MDdmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU5NmYpLCBGTDJGWENPTlNUX0RCTCgwLjUwMGYpLCBGTDJGWENPTlNUX0RCTCgwLjQyMmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMzU1ZiksIEZMMkZYQ09OU1RfREJMKDAuMDAwZil9OwogCi1zdGF0aWMgY29uc3QgVUNIQVIgc3VybWl4Mm1hdHJpeF9taXhkb3duX2lkeFs4XSA9IHsKLSAgICAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzCi19OworI2RlZmluZSBGTDJETVhMRkUoYSkgRkwyRlhDT05TVF9EQkwoKGEpIC8gKDEgPDwgTEZFX0xFVl9TQ0FMRSkpCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZG14TGZlVGFibGVbMTZdID0geworICAgIEZMMkRNWExGRSgzLjE2MmYpLCBGTDJETVhMRkUoMi4wMDBmKSwgRkwyRE1YTEZFKDEuNjc5ZiksIEZMMkRNWExGRSgxLjQxM2YpLAorICAgIEZMMkRNWExGRSgxLjE4OWYpLCBGTDJETVhMRkUoMS4wMDBmKSwgRkwyRE1YTEZFKDAuODQxZiksIEZMMkRNWExGRSgwLjcwN2YpLAorICAgIEZMMkRNWExGRSgwLjU5NmYpLCBGTDJETVhMRkUoMC41MDBmKSwgRkwyRE1YTEZFKDAuMzE2ZiksIEZMMkRNWExGRSgwLjE3OGYpLAorICAgIEZMMkRNWExGRSgwLjEwMGYpLCBGTDJETVhMRkUoMC4wMzJmKSwgRkwyRE1YTEZFKDAuMDEwZiksIEZMMkRNWExGRSgwLjAwMGYpfTsKIAorc3RhdGljIGNvbnN0IFVDSEFSIHN1cm1peDJtYXRyaXhfbWl4ZG93bl9pZHhbOF0gPSB7MCwgMCwgMCwgMSwgMSwgMiwgMiwgM307CiAKIC8qLS0tLS0tLS0tLS0tLS0tIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIFdyaXRlTWV0YWRhdGFQYXlsb2FkKAotICAgICAgICBjb25zdCBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgaE1ldGFEYXRhLAotICAgICAgICBjb25zdCBBQUNfTUVUQURBVEEgKiBjb25zdCAgcE1ldGFkYXRhCi0gICAgICAgICk7CisgICAgY29uc3QgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YSwKKyAgICBjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSk7CiAKLXN0YXRpYyBJTlQgV3JpdGVEeW5hbWljUmFuZ2VJbmZvUGF5bG9hZCgKLSAgICAgICAgY29uc3QgQUFDX01FVEFEQVRBKiBjb25zdCBwTWV0YWRhdGEsCi0gICAgICAgIFVDSEFSKiBjb25zdCAgICAgICAgICAgICAgcEV4dGVuc2lvblBheWxvYWQKLSAgICAgICAgKTsKK3N0YXRpYyBJTlQgV3JpdGVEeW5hbWljUmFuZ2VJbmZvUGF5bG9hZChjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiogY29uc3QgcEV4dGVuc2lvblBheWxvYWQpOwogCi1zdGF0aWMgSU5UIFdyaXRlRXRzaUFuY2lsbGFyeURhdGFQYXlsb2FkKAotICAgICAgICBjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSwKLSAgICAgICAgVUNIQVIqIGNvbnN0ICAgICAgICAgICAgICBwRXh0ZW5zaW9uUGF5bG9hZAotICAgICAgICApOworc3RhdGljIElOVCBXcml0ZUV0c2lBbmNpbGxhcnlEYXRhUGF5bG9hZChjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIGNvbnN0IHBFeHRlbnNpb25QYXlsb2FkKTsKIAogc3RhdGljIEZES19NRVRBREFUQV9FUlJPUiBDb21wZW5zYXRlQXVkaW9EZWxheSgKLSAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YUVuYywKLSAgICAgICAgSU5UX1BDTSAqIGNvbnN0ICAgICAgICAgICAgIHBBdWRpb1NhbXBsZXMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICBuQXVkaW9TYW1wbGVzCi0gICAgICAgICk7CisgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YUVuYywgSU5UX1BDTSogY29uc3QgcEF1ZGlvU2FtcGxlcywKKyAgICBjb25zdCBVSU5UIGF1ZGlvU2FtcGxlc0J1ZlNpemUsIGNvbnN0IElOVCBuQXVkaW9TYW1wbGVzKTsKIAogc3RhdGljIEZES19NRVRBREFUQV9FUlJPUiBMb2FkU3VibWl0dGVkTWV0YWRhdGEoCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSAqICAgY29uc3QgaE1ldGFkYXRhLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGUsCi0gICAgICAgIEFBQ19NRVRBREFUQSAqIGNvbnN0ICAgICAgICAgICAgcEFhY01ldGFEYXRhCi0gICAgICAgICk7CisgICAgY29uc3QgQUFDRU5DX01ldGFEYXRhKiBjb25zdCBoTWV0YWRhdGEsIGNvbnN0IElOVCBuQ2hhbm5lbHMsCisgICAgY29uc3QgSU5UIG1ldGFkYXRhTW9kZSwgQUFDX01FVEFEQVRBKiBjb25zdCBwQWFjTWV0YURhdGEpOwogCi1zdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIFByb2Nlc3NDb21wcmVzc29yKAotICAgICAgICBBQUNfTUVUQURBVEEgICAgICAgICAgICAgICAgICAgICpwTWV0YWRhdGEsCi0gICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgIGhEcmNDb21wLAotICAgICAgICBjb25zdCBJTlRfUENNICogY29uc3QgICAgICAgICAgICBwU2FtcGxlcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgblNhbXBsZXMKLSAgICAgICAgKTsKK3N0YXRpYyBGREtfTUVUQURBVEFfRVJST1IgUHJvY2Vzc0NvbXByZXNzb3IoQUFDX01FVEFEQVRBKiBwTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhEUkNfQ09NUCBoRHJjQ29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSogY29uc3QgcFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgc2FtcGxlc0J1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuU2FtcGxlcyk7CiAKIC8qLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIERSQ19QUk9GSUxFIGNvbnZlcnRQcm9maWxlKEFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRSBhYWNQcm9maWxlKQotewotICAgIERSQ19QUk9GSUxFIGRyY1Byb2ZpbGUgPSBEUkNfTk9ORTsKK3N0YXRpYyBEUkNfUFJPRklMRSBjb252ZXJ0UHJvZmlsZShBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgYWFjUHJvZmlsZSkgeworICBEUkNfUFJPRklMRSBkcmNQcm9maWxlID0gRFJDX05PTkU7CiAKLSAgICBzd2l0Y2goYWFjUHJvZmlsZSkgewotICAgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfRFJDX05PTkU6ICAgICAgICAgIGRyY1Byb2ZpbGUgPSBEUkNfTk9ORTsgICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfRklMTVNUQU5EQVJEOiAgZHJjUHJvZmlsZSA9IERSQ19GSUxNU1RBTkRBUkQ7ICBicmVhazsKLSAgICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX0RSQ19GSUxNTElHSFQ6ICAgICBkcmNQcm9maWxlID0gRFJDX0ZJTE1MSUdIVDsgICAgIGJyZWFrOwotICAgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfRFJDX01VU0lDU1RBTkRBUkQ6IGRyY1Byb2ZpbGUgPSBEUkNfTVVTSUNTVEFOREFSRDsgYnJlYWs7Ci0gICAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfTVVTSUNMSUdIVDogICAgZHJjUHJvZmlsZSA9IERSQ19NVVNJQ0xJR0hUOyAgICBicmVhazsKLSAgICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX0RSQ19TUEVFQ0g6ICAgICAgICBkcmNQcm9maWxlID0gRFJDX1NQRUVDSDsgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyY1Byb2ZpbGUgPSBEUkNfTk9ORTsgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBkcmNQcm9maWxlOworICBzd2l0Y2ggKGFhY1Byb2ZpbGUpIHsKKyAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfTk9ORToKKyAgICAgIGRyY1Byb2ZpbGUgPSBEUkNfTk9ORTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX0RSQ19GSUxNU1RBTkRBUkQ6CisgICAgICBkcmNQcm9maWxlID0gRFJDX0ZJTE1TVEFOREFSRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX0RSQ19GSUxNTElHSFQ6CisgICAgICBkcmNQcm9maWxlID0gRFJDX0ZJTE1MSUdIVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX0RSQ19NVVNJQ1NUQU5EQVJEOgorICAgICAgZHJjUHJvZmlsZSA9IERSQ19NVVNJQ1NUQU5EQVJEOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfRFJDX01VU0lDTElHSFQ6CisgICAgICBkcmNQcm9maWxlID0gRFJDX01VU0lDTElHSFQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfU1BFRUNIOgorICAgICAgZHJjUHJvZmlsZSA9IERSQ19TUEVFQ0g7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfTk9UX1BSRVNFTlQ6CisgICAgICBkcmNQcm9maWxlID0gRFJDX05PVF9QUkVTRU5UOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGRyY1Byb2ZpbGUgPSBEUkNfTk9ORTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBkcmNQcm9maWxlOwogfQogCi0KIC8qIGNvbnZlcnQgZGlhbG9nIG5vcm1hbGl6YXRpb24gdG8gcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgKi8KLS8qIE5PVEU6IHRoaXMgb25seSBpcyBjb3JyZWN0LCBpZiB0aGUgZGVjb2RlciB0YXJnZXQgbGV2ZWwgaXMgc2V0IHRvIC0zMWRCIGZvciBsaW5lIG1vZGUgLyAtMjBkQiBmb3IgUkYgbW9kZSAqLwotc3RhdGljIFVDSEFSIGRpYWxub3JtMnByb2dyZWZsdmwoY29uc3QgSU5UIGQpCi17Ci0gICAgcmV0dXJuICgoVUNIQVIpRkRLbWF4KDAsIEZES21pbigoLWQgKyAoMTw8MTMpKSA+PiAxNCwgMTI3KSkpOworLyogTk9URTogdGhpcyBvbmx5IGlzIGNvcnJlY3QsIGlmIHRoZSBkZWNvZGVyIHRhcmdldCBsZXZlbCBpcyBzZXQgdG8gLTMxZEIgZm9yCisgKiBsaW5lIG1vZGUgLyAtMjBkQiBmb3IgUkYgbW9kZSAqLworc3RhdGljIFVDSEFSIGRpYWxub3JtMnByb2dyZWZsdmwoY29uc3QgSU5UIGQpIHsKKyAgcmV0dXJuICgoVUNIQVIpZk1heCgwLCBmTWluKCgtZCArICgxIDw8IDEzKSkgPj4gMTQsIDEyNykpKTsKIH0KIAogLyogY29udmVydCBwcm9ncmFtIHJlZmVyZW5jZSBsZXZlbCB0byBkaWFsb2cgbm9ybWFsaXphdGlvbiAqLwotc3RhdGljIElOVCBwcm9ncmVmbHZsMmRpYWxub3JtKGNvbnN0IFVDSEFSIHApCi17Ci0gICAgcmV0dXJuIC0oKElOVCkocDw8KDE2LTIpKSk7CitzdGF0aWMgSU5UIHByb2dyZWZsdmwyZGlhbG5vcm0oY29uc3QgVUNIQVIgcCkgeworICByZXR1cm4gLSgoSU5UKShwIDw8ICgxNiAtIDIpKSk7CiB9CiAKIC8qIGVuY29kZSBkb3dubWl4IGxldmVscyB0byBEb3dubWl4aW5nX2xldmVsc19NUEVHNCAqLwotc3RhdGljIFNDSEFSIGVuY29kZURteEx2bHMoY29uc3QgU0NIQVIgY21peGxldiwgY29uc3QgU0NIQVIgc3VybWl4bGV2KQotewotICAgIFNDSEFSIGRteEx2bHMgPSAwOwotICAgIGRteEx2bHMgfD0gMHg4MCB8IChjbWl4bGV2IDw8IDQpOyAvKiBjZW50ZXJfbWl4X2xldmVsX29uICovCi0gICAgZG14THZscyB8PSAweDA4IHwgc3VybWl4bGV2OyAgICAgIC8qIHN1cnJvdW5kX21peF9sZXZlbF9vbiAqLworc3RhdGljIFNDSEFSIGVuY29kZURteEx2bHMoY29uc3QgU0NIQVIgY21peGxldiwgY29uc3QgU0NIQVIgc3VybWl4bGV2KSB7CisgIFNDSEFSIGRteEx2bHMgPSAwOworICBkbXhMdmxzIHw9IDB4ODAgfCAoY21peGxldiA8PCA0KTsgLyogY2VudGVyX21peF9sZXZlbF9vbiAqLworICBkbXhMdmxzIHw9IDB4MDggfCBzdXJtaXhsZXY7ICAgICAgLyogc3Vycm91bmRfbWl4X2xldmVsX29uICovCiAKLSAgICByZXR1cm4gZG14THZsczsKKyAgcmV0dXJuIGRteEx2bHM7CiB9CiAKIC8qIGVuY29kZSBBQUMgRFJDIGdhaW4gKElTTy9JRUMgMTQ0OTYtMzoyMDA1ICA0LjUuMi43KSAqLwotc3RhdGljIHZvaWQgZW5jb2RlRHlucm5nKElOVCBnYWluLCBVQ0hBUiogY29uc3QgZHluX3JuZ19jdGwsIFVDSEFSKiBjb25zdCBkeW5fcm5nX3NnbiApCi17Ci0gICAgaWYoZ2FpbiA8IDApCi0gICAgewotICAgICAgKmR5bl9ybmdfc2duID0gMTsKLSAgICAgIGdhaW4gPSAtZ2FpbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICpkeW5fcm5nX3NnbiA9IDA7Ci0gICAgfQotICAgIGdhaW4gPSBGREttaW4oZ2FpbiwoMTI3PDwxNCkpOworc3RhdGljIHZvaWQgZW5jb2RlRHlucm5nKElOVCBnYWluLCBVQ0hBUiogY29uc3QgZHluX3JuZ19jdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIGNvbnN0IGR5bl9ybmdfc2duKSB7CisgIGlmIChnYWluIDwgMCkgeworICAgICpkeW5fcm5nX3NnbiA9IDE7CisgICAgZ2FpbiA9IC1nYWluOworICB9IGVsc2UgeworICAgICpkeW5fcm5nX3NnbiA9IDA7CisgIH0KKyAgZ2FpbiA9IGZNaW4oZ2FpbiwgKDEyNyA8PCAxNCkpOwogCi0gICAgKmR5bl9ybmdfY3RsID0gKFVDSEFSKSgoZ2FpbiArICgxPDwxMykpID4+IDE0KTsKKyAgKmR5bl9ybmdfY3RsID0gKFVDSEFSKSgoZ2FpbiArICgxIDw8IDEzKSkgPj4gMTQpOwogfQogCiAvKiBkZWNvZGUgQUFDIERSQyBnYWluIChJU08vSUVDIDE0NDk2LTM6MjAwNSAgNC41LjIuNykgKi8KLXN0YXRpYyBJTlQgZGVjb2RlRHlucm5nKGNvbnN0IFVDSEFSIGR5bl9ybmdfY3RsLCBjb25zdCBVQ0hBUiBkeW5fcm5nX3NnbikKLXsKLSAgICBJTlQgdG1wID0gKChJTlQpZHluX3JuZ19jdGwgPDwgKDE2LTIpKTsKLSAgICBpZiAoZHluX3JuZ19zZ24pIHRtcCA9IC10bXA7CitzdGF0aWMgSU5UIGRlY29kZUR5bnJuZyhjb25zdCBVQ0hBUiBkeW5fcm5nX2N0bCwgY29uc3QgVUNIQVIgZHluX3JuZ19zZ24pIHsKKyAgSU5UIHRtcCA9ICgoSU5UKWR5bl9ybmdfY3RsIDw8ICgxNiAtIDIpKTsKKyAgaWYgKGR5bl9ybmdfc2duKSB0bXAgPSAtdG1wOwogCi0gICAgcmV0dXJuIHRtcDsKKyAgcmV0dXJuIHRtcDsKIH0KIAogLyogZW5jb2RlIEFBQyBjb21wcmVzc2lvbiB2YWx1ZSAoRVRTSSBUUyAxMDEgMTU0IHBhZ2UgOTkpICovCi1zdGF0aWMgVUNIQVIgZW5jb2RlQ29tcHIoSU5UIGdhaW4pCi17Ci0gICAgVUNIQVIgeCwgeTsKLSAgICBJTlQgdG1wOworc3RhdGljIFVDSEFSIGVuY29kZUNvbXByKElOVCBnYWluKSB7CisgIFVDSEFSIHgsIHk7CisgIElOVCB0bXA7CiAKLSAgICAvKiB0bXAgPSAoaW50KSgoNDguMTY0ZiAtIGdhaW4pIC8gNi4wMjA2ZiAqIDE1ICsgMC41Zik7ICovCi0gICAgdG1wID0gKCgzMTU2NDc2IC0gZ2FpbikgKiAxNSArIDE5NzI4MykgLyAzOTQ1NjY7CisgIC8qIHRtcCA9IChpbnQpKCg0OC4xNjRmIC0gZ2FpbikgLyA2LjAyMDZmICogMTUgKyAwLjVmKTsgKi8KKyAgdG1wID0gKCgzMTU2NDc2IC0gZ2FpbikgKiAxNSArIDE5NzI4MykgLyAzOTQ1NjY7CiAKLSAgICBpZiAodG1wID49IDI0MCkgewotICAgICAgICByZXR1cm4gMHhGRjsKLSAgICB9Ci0gICAgZWxzZSBpZiAodG1wIDwgMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHggPSB0bXAgLyAxNTsKLSAgICAgICAgeSA9IHRtcCAlIDE1OwotICAgIH0KKyAgaWYgKHRtcCA+PSAyNDApIHsKKyAgICByZXR1cm4gMHhGRjsKKyAgfSBlbHNlIGlmICh0bXAgPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgeCA9IHRtcCAvIDE1OworICAgIHkgPSB0bXAgJSAxNTsKKyAgfQogCi0gICAgcmV0dXJuICh4IDw8IDQpIHwgeTsKKyAgcmV0dXJuICh4IDw8IDQpIHwgeTsKIH0KIAogLyogZGVjb2RlIEFBQyBjb21wcmVzc2lvbiB2YWx1ZSAoRVRTSSBUUyAxMDEgMTU0IHBhZ2UgOTkpICovCi1zdGF0aWMgSU5UIGRlY29kZUNvbXByKGNvbnN0IFVDSEFSIGNvbXByKQotewotICAgIElOVCBnYWluOwotICAgIFNDSEFSIHggPSBjb21wciA+PiA0OyAgICAgLyogNCBNU0Igb2YgY29tcHIgKi8KLSAgICBVQ0hBUiB5ID0gKGNvbXByICYgMHgwRik7IC8qIDQgTFNCIG9mIGNvbXByICovCitzdGF0aWMgSU5UIGRlY29kZUNvbXByKGNvbnN0IFVDSEFSIGNvbXByKSB7CisgIElOVCBnYWluOworICBTQ0hBUiB4ID0gY29tcHIgPj4gNDsgICAgIC8qIDQgTVNCIG9mIGNvbXByICovCisgIFVDSEFSIHkgPSAoY29tcHIgJiAweDBGKTsgLyogNCBMU0Igb2YgY29tcHIgKi8KIAotICAgIC8qIGdhaW4gPSAoSU5UKSgoNDguMTY0ZiAtIDYuMDIwNmYgKiB4IC0gMC40MDE0ZiAqIHkpICk7ICovCi0gICAgZ2FpbiA9IChJTlQpKCBzY2FsZVZhbHVlKCgoTE9ORylGTDJGWENPTlNUX0RCTCg2LjAyMDZmLzEyOC5mKSooOC14KSAtIChMT05HKUZMMkZYQ09OU1RfREJMKDAuNDAxNGYvMTI4LmYpKnkpLCAtKERGUkFDVF9CSVRTLTEtNy0xNikpICk7CisgIC8qIGdhaW4gPSAoSU5UKSgoNDguMTY0ZiAtIDYuMDIwNmYgKiB4IC0gMC40MDE0ZiAqIHkpICk7ICovCisgIGdhaW4gPSAoSU5UKSgKKyAgICAgIHNjYWxlVmFsdWUoKEZJWFBfREJMKSgoKExPTkcpRkwyRlhDT05TVF9EQkwoNi4wMjA2ZiAvIDEyOC5mKSAqICg4IC0geCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTE9ORylGTDJGWENPTlNUX0RCTCgwLjQwMTRmIC8gMTI4LmYpICogeSkpLAorICAgICAgICAgICAgICAgICAtKERGUkFDVF9CSVRTIC0gMSAtIDcgLSAxNikpKTsKIAotICAgIHJldHVybiBnYWluOworICByZXR1cm4gZ2FpbjsKIH0KIAorRkRLX01FVEFEQVRBX0VSUk9SIEZES19NZXRhZGF0YUVuY19PcGVuKEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiogcGhNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG1heENoYW5uZWxzKSB7CisgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKKyAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YSA9IE5VTEw7CiAKLUZES19NRVRBREFUQV9FUlJPUiBGREtfTWV0YWRhdGFFbmNfT3BlbigKLSAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSICpwaE1ldGFEYXRhCi0gICAgICAgICkKLXsKLSAgICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7Ci0gICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YSA9IE5VTEw7CisgIGlmIChwaE1ldGFEYXRhID09IE5VTEwpIHsKKyAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKKyAgICBnb3RvIGJhaWw7CisgIH0KIAotICAgIGlmIChwaE1ldGFEYXRhID09IE5VTEwpIHsKLSAgICAgIGVyciA9IE1FVEFEQVRBX0lOVkFMSURfSEFORExFOwotICAgICAgZ290byBiYWlsOwotICAgIH0KKyAgLyogYWxsb2NhdGUgbWVtb3J5ICovCisgIGlmIChOVUxMID09IChoTWV0YURhdGEgPSAoSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSKUZES2NhbGxvYygKKyAgICAgICAgICAgICAgICAgICAxLCBzaXplb2YoRkRLX01FVEFEQVRBX0VOQ09ERVIpKSkpIHsKKyAgICBlcnIgPSBNRVRBREFUQV9NRU1PUllfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisgIEZES21lbWNsZWFyKGhNZXRhRGF0YSwgc2l6ZW9mKEZES19NRVRBREFUQV9FTkNPREVSKSk7CiAKLSAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICBoTWV0YURhdGEgPSAoSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSKSBGREtjYWxsb2MoMSwgc2l6ZW9mKEZES19NRVRBREFUQV9FTkNPREVSKSApOworICBpZiAoTlVMTCA9PSAoaE1ldGFEYXRhLT5wQXVkaW9EZWxheUJ1ZmZlciA9IChJTlRfUENNKilGREtjYWxsb2MoCisgICAgICAgICAgICAgICAgICAgbWF4Q2hhbm5lbHMgKiBNQVhfRFJDX0ZSQU1FTEVOLCBzaXplb2YoSU5UX1BDTSkpKSkgeworICAgIGVyciA9IE1FVEFEQVRBX01FTU9SWV9FUlJPUjsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgRkRLbWVtY2xlYXIoaE1ldGFEYXRhLT5wQXVkaW9EZWxheUJ1ZmZlciwKKyAgICAgICAgICAgICAgbWF4Q2hhbm5lbHMgKiBNQVhfRFJDX0ZSQU1FTEVOICogc2l6ZW9mKElOVF9QQ00pKTsKKyAgaE1ldGFEYXRhLT5tYXhDaGFubmVscyA9IG1heENoYW5uZWxzOwogCi0gICAgaWYgKGhNZXRhRGF0YSA9PSBOVUxMKSB7Ci0gICAgICBlcnIgPSBNRVRBREFUQV9NRU1PUllfRVJST1I7Ci0gICAgICBnb3RvIGJhaWw7Ci0gICAgfQorICAvKiBBbGxvY2F0ZSBEUkMgQ29tcHJlc3Nvci4gKi8KKyAgaWYgKEZES19EUkNfR2VuZXJhdG9yX09wZW4oJmhNZXRhRGF0YS0+aERyY0NvbXApICE9IDApIHsKKyAgICBlcnIgPSBNRVRBREFUQV9NRU1PUllfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisgIGhNZXRhRGF0YS0+Y2hhbm5lbE1vZGUgPSBNT0RFX1VOS05PV047CiAKLSAgICBGREttZW1jbGVhcihoTWV0YURhdGEsIHNpemVvZihGREtfTUVUQURBVEFfRU5DT0RFUikpOworICAvKiBSZXR1cm4gbWV0YWRhdGEgaW5zdGFuY2UgKi8KKyAgKnBoTWV0YURhdGEgPSBoTWV0YURhdGE7CiAKLSAgICAvKiBBbGxvY2F0ZSBEUkMgQ29tcHJlc3Nvci4gKi8KLSAgICBpZiAoRkRLX0RSQ19HZW5lcmF0b3JfT3BlbigmaE1ldGFEYXRhLT5oRHJjQ29tcCkhPTApIHsKLSAgICAgIGVyciA9IE1FVEFEQVRBX01FTU9SWV9FUlJPUjsKLSAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICAvKiBSZXR1cm4gbWV0YWRhdGEgaW5zdGFuY2UgKi8KLSAgICAqcGhNZXRhRGF0YSA9IGhNZXRhRGF0YTsKLQotICAgIHJldHVybiBlcnI7CisgIHJldHVybiBlcnI7CiAKIGJhaWw6Ci0gICAgRkRLX01ldGFkYXRhRW5jX0Nsb3NlKCZoTWV0YURhdGEpOwotICAgIHJldHVybiBlcnI7CisgIEZES19NZXRhZGF0YUVuY19DbG9zZSgmaE1ldGFEYXRhKTsKKyAgcmV0dXJuIGVycjsKIH0KIAogRkRLX01FVEFEQVRBX0VSUk9SIEZES19NZXRhZGF0YUVuY19DbG9zZSgKLSAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSICpwaE1ldGFEYXRhCi0gICAgICAgICkKLXsKLSAgICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CisgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSKiBwaE1ldGFEYXRhKSB7CisgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKIAotICAgIGlmIChwaE1ldGFEYXRhID09IE5VTEwpIHsKLSAgICAgIGVyciA9IE1FVEFEQVRBX0lOVkFMSURfSEFORExFOwotICAgICAgZ290byBiYWlsOwotICAgIH0KKyAgaWYgKHBoTWV0YURhdGEgPT0gTlVMTCkgeworICAgIGVyciA9IE1FVEFEQVRBX0lOVkFMSURfSEFORExFOworICAgIGdvdG8gYmFpbDsKKyAgfQogCi0gICAgaWYgKCpwaE1ldGFEYXRhICE9IE5VTEwpIHsKLSAgICAgIEZES19EUkNfR2VuZXJhdG9yX0Nsb3NlKCYoKnBoTWV0YURhdGEpLT5oRHJjQ29tcCk7Ci0gICAgICBGREtmcmVlKCpwaE1ldGFEYXRhKTsKLSAgICAgICpwaE1ldGFEYXRhID0gTlVMTDsKLSAgICB9CisgIGlmICgqcGhNZXRhRGF0YSAhPSBOVUxMKSB7CisgICAgRkRLX0RSQ19HZW5lcmF0b3JfQ2xvc2UoJigqcGhNZXRhRGF0YSktPmhEcmNDb21wKTsKKyAgICBGREtmcmVlKCgqcGhNZXRhRGF0YSktPnBBdWRpb0RlbGF5QnVmZmVyKTsKKyAgICBGREtmcmVlKCpwaE1ldGFEYXRhKTsKKyAgICAqcGhNZXRhRGF0YSA9IE5VTEw7CisgIH0KIGJhaWw6Ci0gICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIGVycjsKIH0KIAogRkRLX01FVEFEQVRBX0VSUk9SIEZES19NZXRhZGF0YUVuY19Jbml0KAotICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgaE1ldGFEYXRhLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgcmVzZXRTdGF0ZXMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICBhdWRpb0RlbGF5LAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGgsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICBjb25zdCBDSEFOTkVMX01PREUgICAgICAgICAgY2hhbm5lbE1vZGUsCi0gICAgICAgIGNvbnN0IENIQU5ORUxfT1JERVIgICAgICAgICBjaGFubmVsT3JkZXIKLSAgICAgICAgKQotewotICAgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKLSAgICBpbnQgaSwgbkZyYW1lcywgZGVsYXk7CisgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YSwgY29uc3QgSU5UIHJlc2V0U3RhdGVzLAorICAgIGNvbnN0IElOVCBtZXRhZGF0YU1vZGUsIGNvbnN0IElOVCBhdWRpb0RlbGF5LCBjb25zdCBVSU5UIGZyYW1lTGVuZ3RoLAorICAgIGNvbnN0IFVJTlQgc2FtcGxlUmF0ZSwgY29uc3QgVUlOVCBuQ2hhbm5lbHMsIGNvbnN0IENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSwKKyAgICBjb25zdCBDSEFOTkVMX09SREVSIGNoYW5uZWxPcmRlcikgeworICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CisgIGludCBpLCBuRnJhbWVzLCBkZWxheTsKIAotICAgIGlmIChoTWV0YURhdGE9PU5VTEwpIHsKLSAgICAgIGVyciA9IE1FVEFEQVRBX0lOVkFMSURfSEFORExFOwotICAgICAgZ290byBiYWlsOworICBpZiAoaE1ldGFEYXRhID09IE5VTEwpIHsKKyAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBEZXRlcm1pbmUgdmFsdWVzIGZvciBkZWxheSBjb21wZW5zYXRpb24uICovCisgIGZvciAobkZyYW1lcyA9IDAsIGRlbGF5ID0gYXVkaW9EZWxheSAtIChJTlQpZnJhbWVMZW5ndGg7IGRlbGF5ID4gMDsKKyAgICAgICBkZWxheSAtPSAoSU5UKWZyYW1lTGVuZ3RoLCBuRnJhbWVzKyspCisgICAgOworCisgIGlmICgobkNoYW5uZWxzID4gKDgpKSB8fCAobkNoYW5uZWxzID4gaE1ldGFEYXRhLT5tYXhDaGFubmVscykgfHwKKyAgICAgICgoLWRlbGF5KSA+IE1BWF9EUkNfRlJBTUVMRU4pIHx8IG5GcmFtZXMgPj0gTUFYX0RFTEFZX0ZSQU1FUykgeworICAgIGVyciA9IE1FVEFEQVRBX0lOSVRfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgc2V0dXAuICovCisgIEZES21lbWNweSgmaE1ldGFEYXRhLT5zdWJtaXR0ZWRNZXRhRGF0YSwgJmRlZmF1bHRNZXRhRGF0YVNldHVwLAorICAgICAgICAgICAgc2l6ZW9mKEFBQ0VOQ19NZXRhRGF0YSkpOworCisgIGhNZXRhRGF0YS0+ZmluYWxpemVNZXRhRGF0YSA9CisgICAgICAwOyAvKiBmaW5hbGl6ZSBtZXRhIGRhdGEgb25seSB3aGlsZSBvbi9vZmYgc3dpdGNoaW5nLCBlbHNlIGRpc2FibGVkICovCisgIGhNZXRhRGF0YS0+aW5pdGlhbGl6ZU1ldGFEYXRhID0KKyAgICAgIDA7IC8qIGZpbGwgdXAgbWV0YSBkYXRhIGRlbGF5IGxpbmUgb25seSBhdCBhIHJlc2V0IG90aGVyd2lzZSBkaXNhYmxlZCAqLworCisgIC8qIFJlc2V0IGRlbGF5IGxpbmVzLiAqLworICBpZiAocmVzZXRTdGF0ZXMgfHwgKGhNZXRhRGF0YS0+bkF1ZGlvRGF0YURlbGF5ICE9IC1kZWxheSkgfHwKKyAgICAgIChoTWV0YURhdGEtPmNoYW5uZWxNb2RlICE9IGNoYW5uZWxNb2RlKSkgeworICAgIGlmIChyZXNldFN0YXRlcyB8fCAoaE1ldGFEYXRhLT5jaGFubmVsTW9kZSA9PSBNT0RFX1VOS05PV04pKSB7CisgICAgICAvKiBjbGVhciBkZWxheSBidWZmZXIgKi8KKyAgICAgIEZES21lbWNsZWFyKGhNZXRhRGF0YS0+cEF1ZGlvRGVsYXlCdWZmZXIsCisgICAgICAgICAgICAgICAgICBoTWV0YURhdGEtPm1heENoYW5uZWxzICogTUFYX0RSQ19GUkFNRUxFTiAqIHNpemVvZihJTlRfUENNKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGlmIHBvc3NpYmxlLCBrZWVwIHN0YXRpYyBhdWRpbyBjaGFubmVscyBmb3Igc2VhbWxlc3MgY2hhbm5lbAorICAgICAgICogcmVjb25maWd1cmF0aW9uICovCisgICAgICBGREtfY2hhbm5lbE1hcERlc2NyIG1hcERlc2NyUHJldiwgbWFwRGVzY3I7CisgICAgICBpbnQgYywgc3JjWzJdID0gey0xLCAtMX0sIGRzdFsyXSA9IHstMSwgLTF9OworCisgICAgICBGREtfY2hNYXBEZXNjcl9pbml0KCZtYXBEZXNjclByZXYsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFubmVsT3JkZXIgPT0gQ0hfT1JERVJfTVBFRykgPyAxIDogMCk7CisgICAgICBGREtfY2hNYXBEZXNjcl9pbml0KCZtYXBEZXNjciwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxPcmRlciA9PSBDSF9PUkRFUl9NUEVHKSA/IDEgOiAwKTsKKworICAgICAgc3dpdGNoIChjaGFubmVsTW9kZSkgeworICAgICAgICBjYXNlIE1PREVfMToKKyAgICAgICAgICBpZiAoKElOVCluQ2hhbm5lbHMgIT0gMikgeworICAgICAgICAgICAgLyogcHJlc2VydmUgY2VudGVyIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIHNyY1swXSA9IEZES19jaE1hcERlc2NyX2dldE1hcFZhbHVlKCZtYXBEZXNjclByZXYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTWV0YURhdGEtPmNoYW5uZWxNb2RlKTsKKyAgICAgICAgICAgIGRzdFswXSA9IEZES19jaE1hcERlc2NyX2dldE1hcFZhbHVlKCZtYXBEZXNjciwgMCwgY2hhbm5lbE1vZGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzI6CisgICAgICAgIGNhc2UgTU9ERV8xXzI6CisgICAgICAgIGNhc2UgTU9ERV8xXzJfMToKKyAgICAgICAgY2FzZSBNT0RFXzFfMl8yOgorICAgICAgICBjYXNlIE1PREVfMV8yXzJfMToKKyAgICAgICAgICBpZiAoaE1ldGFEYXRhLT5uQ2hhbm5lbHMgPj0gMikgeworICAgICAgICAgICAgLyogcHJlc2VydmUgbGVmdC9yaWdodCBjaGFubmVsICovCisgICAgICAgICAgICBzcmNbMF0gPSBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZSgKKyAgICAgICAgICAgICAgICAmbWFwRGVzY3JQcmV2LCAoKGhNZXRhRGF0YS0+Y2hhbm5lbE1vZGUgPT0gMikgPyAwIDogMSksCisgICAgICAgICAgICAgICAgaE1ldGFEYXRhLT5jaGFubmVsTW9kZSk7CisgICAgICAgICAgICBzcmNbMV0gPSBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZSgKKyAgICAgICAgICAgICAgICAmbWFwRGVzY3JQcmV2LCAoKGhNZXRhRGF0YS0+Y2hhbm5lbE1vZGUgPT0gMikgPyAxIDogMiksCisgICAgICAgICAgICAgICAgaE1ldGFEYXRhLT5jaGFubmVsTW9kZSk7CisgICAgICAgICAgICBkc3RbMF0gPSBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZSgKKyAgICAgICAgICAgICAgICAmbWFwRGVzY3IsICgoY2hhbm5lbE1vZGUgPT0gMikgPyAwIDogMSksIGNoYW5uZWxNb2RlKTsKKyAgICAgICAgICAgIGRzdFsxXSA9IEZES19jaE1hcERlc2NyX2dldE1hcFZhbHVlKAorICAgICAgICAgICAgICAgICZtYXBEZXNjciwgKChjaGFubmVsTW9kZSA9PSAyKSA/IDEgOiAyKSwgY2hhbm5lbE1vZGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDo7CisgICAgICB9CisgICAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoc2NyYXRjaF9hdWRpb0RlbGF5QnVmZmVyLCBJTlRfUENNLCAoOCkpOworICAgICAgRkRLbWVtY2xlYXIoc2NyYXRjaF9hdWRpb0RlbGF5QnVmZmVyLCAoOCkgKiBzaXplb2YoSU5UX1BDTSkpOworCisgICAgICBpID0gKGhNZXRhRGF0YS0+bkNoYW5uZWxzID4gKElOVCluQ2hhbm5lbHMpCisgICAgICAgICAgICAgID8gMAorICAgICAgICAgICAgICA6IGhNZXRhRGF0YS0+bkF1ZGlvRGF0YURlbGF5IC0gMTsKKyAgICAgIGRvIHsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IDI7IGMrKykgeworICAgICAgICAgIGlmIChzcmNbY10gIT0gLTEgJiYgZHN0W2NdICE9IC0xKSB7CisgICAgICAgICAgICBzY3JhdGNoX2F1ZGlvRGVsYXlCdWZmZXJbZHN0W2NdXSA9CisgICAgICAgICAgICAgICAgaE1ldGFEYXRhLT5wQXVkaW9EZWxheUJ1ZmZlcltpICogaE1ldGFEYXRhLT5uQ2hhbm5lbHMgKyBzcmNbY11dOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGREttZW1jcHkoJmhNZXRhRGF0YS0+cEF1ZGlvRGVsYXlCdWZmZXJbaSAqIG5DaGFubmVsc10sCisgICAgICAgICAgICAgICAgICBzY3JhdGNoX2F1ZGlvRGVsYXlCdWZmZXIsIG5DaGFubmVscyAqIHNpemVvZihJTlRfUENNKSk7CisgICAgICAgIGkgKz0gKGhNZXRhRGF0YS0+bkNoYW5uZWxzID4gKElOVCluQ2hhbm5lbHMpID8gMSA6IC0xOworICAgICAgfSB3aGlsZSAoKGkgPCBoTWV0YURhdGEtPm5BdWRpb0RhdGFEZWxheSkgJiYgKGkgPj0gMCkpOworCisgICAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHNjcmF0Y2hfYXVkaW9EZWxheUJ1ZmZlciwgSU5UX1BDTSwgKDgpKTsKKyAgICB9CisgICAgRkRLbWVtY2xlYXIoaE1ldGFEYXRhLT5tZXRhRGF0YUJ1ZmZlciwgc2l6ZW9mKGhNZXRhRGF0YS0+bWV0YURhdGFCdWZmZXIpKTsKKyAgICBoTWV0YURhdGEtPm1ldGFEYXRhRGVsYXlJZHggPSAwOworICAgIGhNZXRhRGF0YS0+aW5pdGlhbGl6ZU1ldGFEYXRhID0KKyAgICAgICAgMTsgLyogZmlsbCB1cCBkZWxheSBsaW5lIHdpdGggZmlyc3QgbWV0YSBkYXRhIGluZm8gKi8KKyAgfSBlbHNlIHsKKyAgICAvKiBFbmFibGUgbWV0YSBkYXRhLiAqLworICAgIGlmICgoaE1ldGFEYXRhLT5tZXRhZGF0YU1vZGUgPT0gMCkgJiYgKG1ldGFkYXRhTW9kZSAhPSAwKSkgeworICAgICAgLyogZGlzYWJsZSBtZXRhIGRhdGEgaW4gYWxsIGRlbGF5IGxpbmVzICovCisgICAgICBmb3IgKGkgPSAwOworICAgICAgICAgICBpIDwgKGludCkoc2l6ZW9mKGhNZXRhRGF0YS0+bWV0YURhdGFCdWZmZXIpIC8gc2l6ZW9mKEFBQ19NRVRBREFUQSkpOworICAgICAgICAgICBpKyspIHsKKyAgICAgICAgTG9hZFN1Ym1pdHRlZE1ldGFkYXRhKCZoTWV0YURhdGEtPnN1Ym1pdHRlZE1ldGFEYXRhLCBuQ2hhbm5lbHMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhLT5tZXRhRGF0YUJ1ZmZlcltpXSk7CisgICAgICB9CiAgICAgfQogCi0gICAgLyogRGV0ZXJtaW5lIHZhbHVlcyBmb3IgZGVsYXkgY29tcGVuc2F0aW9uLiAqLwotICAgIGZvciAobkZyYW1lcz0wLCBkZWxheT1hdWRpb0RlbGF5LWZyYW1lTGVuZ3RoOyBkZWxheT4wOyBkZWxheS09ZnJhbWVMZW5ndGgsIG5GcmFtZXMrKyk7CisgICAgLyogRGlzYWJsZSBtZXRhIGRhdGEuKi8KKyAgICBpZiAoKGhNZXRhRGF0YS0+bWV0YWRhdGFNb2RlICE9IDApICYmIChtZXRhZGF0YU1vZGUgPT0gMCkpIHsKKyAgICAgIGhNZXRhRGF0YS0+ZmluYWxpemVNZXRhRGF0YSA9IGhNZXRhRGF0YS0+bWV0YWRhdGFNb2RlOworICAgIH0KKyAgfQogCi0gICAgaWYgKCAoaE1ldGFEYXRhLT5uQ2hhbm5lbHM+TUFYX0RSQ19DSEFOTkVMUykgfHwgKCgtZGVsYXkpPk1BWF9EUkNfRlJBTUVMRU4pICkgeworICAvKiBJbml0aWFsaXplIGRlbGF5LiAqLworICBoTWV0YURhdGEtPm5BdWRpb0RhdGFEZWxheSA9IC1kZWxheTsKKyAgaE1ldGFEYXRhLT5uTWV0YURhdGFEZWxheSA9IG5GcmFtZXM7CisgIGhNZXRhRGF0YS0+bkNoYW5uZWxzID0gbkNoYW5uZWxzOworICBoTWV0YURhdGEtPmNoYW5uZWxNb2RlID0gY2hhbm5lbE1vZGU7CisgIGhNZXRhRGF0YS0+bWV0YWRhdGFNb2RlID0gbWV0YWRhdGFNb2RlOworCisgIC8qIEluaXRpYWxpemUgY29tcHJlc3Nvci4gKi8KKyAgaWYgKChtZXRhZGF0YU1vZGUgPT0gMSkgfHwgKG1ldGFkYXRhTW9kZSA9PSAyKSkgeworICAgIGlmIChGREtfRFJDX0dlbmVyYXRvcl9Jbml0aWFsaXplKGhNZXRhRGF0YS0+aERyY0NvbXAsIERSQ19OT05FLCBEUkNfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aCwgc2FtcGxlUmF0ZSwgY2hhbm5lbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE9yZGVyLCAxKSAhPSAwKSB7CiAgICAgICBlcnIgPSBNRVRBREFUQV9JTklUX0VSUk9SOwotICAgICAgZ290byBiYWlsOwogICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgd2l0aCBkZWZhdWx0IHNldHVwLiAqLwotICAgIEZES21lbWNweSgmaE1ldGFEYXRhLT5zdWJtaXR0ZWRNZXRhRGF0YSwgJmRlZmF1bHRNZXRhRGF0YVNldHVwLCAgc2l6ZW9mKEFBQ0VOQ19NZXRhRGF0YSkpOwotCi0gICAgaE1ldGFEYXRhLT5maW5hbGl6ZU1ldGFEYXRhID0gMDsgLyogZmluYWxpemUgbWV0YSBkYXRhIG9ubHkgd2hpbGUgb24vb2ZmIHN3aXRjaGluZywgZWxzZSBkaXNhYmxlZCAqLwotCi0gICAgLyogUmVzZXQgZGVsYXkgbGluZXMuICovCi0gICAgaWYgKCByZXNldFN0YXRlcyB8fCAoaE1ldGFEYXRhLT5uQXVkaW9EYXRhRGVsYXkhPS1kZWxheSkgfHwgKGhNZXRhRGF0YS0+bkNoYW5uZWxzIT0oSU5UKW5DaGFubmVscykgKQotICAgIHsKLSAgICAgIEZES21lbWNsZWFyKGhNZXRhRGF0YS0+YXVkaW9EZWxheUJ1ZmZlciwgc2l6ZW9mKGhNZXRhRGF0YS0+YXVkaW9EZWxheUJ1ZmZlcikpOwotICAgICAgRkRLbWVtY2xlYXIoaE1ldGFEYXRhLT5tZXRhRGF0YUJ1ZmZlciwgc2l6ZW9mKGhNZXRhRGF0YS0+bWV0YURhdGFCdWZmZXIpKTsKLSAgICAgIGhNZXRhRGF0YS0+YXVkaW9EZWxheUlkeCA9IDA7Ci0gICAgICBoTWV0YURhdGEtPm1ldGFEYXRhRGVsYXlJZHggPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIEVuYWJsZSBtZXRhIGRhdGEuICovCi0gICAgICBpZiAoIChoTWV0YURhdGEtPm1ldGFkYXRhTW9kZT09MCkgJiYgKG1ldGFkYXRhTW9kZSE9MCkgKSB7Ci0gICAgICAgIC8qIGRpc2FibGUgbWV0YSBkYXRhIGluIGFsbCBkZWxheSBsaW5lcyAqLwotICAgICAgICBmb3IgKGk9MDsgaTwoaW50KShzaXplb2YoaE1ldGFEYXRhLT5tZXRhRGF0YUJ1ZmZlcikvc2l6ZW9mKEFBQ19NRVRBREFUQSkpOyBpKyspIHsKLSAgICAgICAgICBMb2FkU3VibWl0dGVkTWV0YWRhdGEoJmhNZXRhRGF0YS0+c3VibWl0dGVkTWV0YURhdGEsIG5DaGFubmVscywgMCwgJmhNZXRhRGF0YS0+bWV0YURhdGFCdWZmZXJbaV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIERpc2FibGUgbWV0YSBkYXRhLiovCi0gICAgICBpZiAoIChoTWV0YURhdGEtPm1ldGFkYXRhTW9kZSE9MCkgJiYgKG1ldGFkYXRhTW9kZT09MCkgKSB7Ci0gICAgICAgIGhNZXRhRGF0YS0+ZmluYWxpemVNZXRhRGF0YSA9IGhNZXRhRGF0YS0+bWV0YWRhdGFNb2RlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgZGVsYXkuICovCi0gICAgaE1ldGFEYXRhLT5uQXVkaW9EYXRhRGVsYXkgPSAtZGVsYXk7Ci0gICAgaE1ldGFEYXRhLT5uTWV0YURhdGFEZWxheSAgPSBuRnJhbWVzOwotICAgIGhNZXRhRGF0YS0+bkNoYW5uZWxzICAgICAgID0gbkNoYW5uZWxzOwotICAgIGhNZXRhRGF0YS0+bWV0YWRhdGFNb2RlICAgID0gbWV0YWRhdGFNb2RlOwotCi0gICAgLyogSW5pdGlhbGl6ZSBjb21wcmVzc29yLiAqLwotICAgIGlmIChtZXRhZGF0YU1vZGUgIT0gMCkgewotICAgICAgICBpZiAoIEZES19EUkNfR2VuZXJhdG9yX0luaXRpYWxpemUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgaE1ldGFEYXRhLT5oRHJjQ29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBEUkNfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBEUkNfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyID0gTUVUQURBVEFfSU5JVF9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KKyAgfQogYmFpbDoKLSAgICByZXR1cm4gZXJyOworICByZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIFByb2Nlc3NDb21wcmVzc29yKAotICAgICAgICBBQUNfTUVUQURBVEEgICAgICAgICAgICAgICAgICAgICpwTWV0YWRhdGEsCi0gICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgIGhEcmNDb21wLAotICAgICAgICBjb25zdCBJTlRfUENNICogY29uc3QgICAgICAgICAgICBwU2FtcGxlcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgblNhbXBsZXMKLSAgICAgICAgKQotewotICAgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKK3N0YXRpYyBGREtfTUVUQURBVEFfRVJST1IgUHJvY2Vzc0NvbXByZXNzb3IoQUFDX01FVEFEQVRBKiBwTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhEUkNfQ09NUCBoRHJjQ29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSogY29uc3QgcFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgc2FtcGxlc0J1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuU2FtcGxlcykgeworICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CiAKLSAgICBpZiAoIChwTWV0YWRhdGE9PU5VTEwpIHx8IChoRHJjQ29tcD09TlVMTCkgKSB7Ci0gICAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKLSAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIERSQ19QUk9GSUxFIHByb2ZpbGVEcmMgID0gY29udmVydFByb2ZpbGUocE1ldGFkYXRhLT5tcGVnRHJjLmRyY19wcm9maWxlKTsKLSAgICBEUkNfUFJPRklMRSBwcm9maWxlQ29tcCA9IGNvbnZlcnRQcm9maWxlKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9wcm9maWxlKTsKKyAgSU5UIGR5bnJuZywgY29tcHI7CisgIElOVCBkbXhHYWluNSwgZG14R2FpbjI7CisgIERSQ19QUk9GSUxFIHByb2ZpbGVEcmM7CisgIERSQ19QUk9GSUxFIHByb2ZpbGVDb21wOwogCi0gICAgLyogZmlyc3QsIGNoZWNrIGlmIHByb2ZpbGUgaXMgc2FtZSBhcyBsYXN0IGZyYW1lCi0gICAgICogb3RoZXJ3aXNlLCB1cGRhdGUgc2V0dXAgKi8KLSAgICBpZiAoIChwcm9maWxlRHJjICE9IEZES19EUkNfR2VuZXJhdG9yX2dldERyY1Byb2ZpbGUoaERyY0NvbXApKQotICAgICAgfHwgKHByb2ZpbGVDb21wICE9IEZES19EUkNfR2VuZXJhdG9yX2dldENvbXBQcm9maWxlKGhEcmNDb21wKSkgKQotICAgIHsKLSAgICAgIEZES19EUkNfR2VuZXJhdG9yX3NldERyY1Byb2ZpbGUoaERyY0NvbXAsIHByb2ZpbGVEcmMsIHByb2ZpbGVDb21wKTsKLSAgICB9CisgIGlmICgocE1ldGFkYXRhID09IE5VTEwpIHx8IChoRHJjQ29tcCA9PSBOVUxMKSkgeworICAgIGVyciA9IE1FVEFEQVRBX0lOVkFMSURfSEFORExFOworICAgIHJldHVybiBlcnI7CisgIH0KIAotICAgIC8qIFNhbml0eSBjaGVjayAqLwotICAgIGlmIChwcm9maWxlQ29tcCA9PSBEUkNfTk9ORSkgewotICAgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wcmVzc2lvbl92YWx1ZSA9IDB4ODA7ICAvKiB0byBlbnN1cmUgbm8gZXh0ZXJuYWwgdmFsdWVzIHdpbGwgYmUgd3JpdHRlbiBpZiBub3QgY29uZmlndXJlZCAqLwotICAgIH0KKyAgcHJvZmlsZURyYyA9IGNvbnZlcnRQcm9maWxlKHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfcHJvZmlsZSk7CisgIHByb2ZpbGVDb21wID0gY29udmVydFByb2ZpbGUocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wX3Byb2ZpbGUpOwogCi0gICAgLyogaW4gY2FzZSBvZiBlbWJlZGRpbmcgZXh0ZXJuYWwgdmFsdWVzLCBjb3B5IHRoaXMgbm93IChsaW1pdGVyIG1heSBvdmVyd3JpdGUgdGhlbSkgKi8KLSAgICBJTlQgZHlucm5nID0gZGVjb2RlRHlucm5nKHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX2N0bFswXSwgcE1ldGFkYXRhLT5tcGVnRHJjLmR5bl9ybmdfc2duWzBdKTsKLSAgICBJTlQgY29tcHIgID0gZGVjb2RlQ29tcHIocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wcmVzc2lvbl92YWx1ZSk7CisgIC8qIGZpcnN0LCBjaGVjayBpZiBwcm9maWxlIGlzIHNhbWUgYXMgbGFzdCBmcmFtZQorICAgKiBvdGhlcndpc2UsIHVwZGF0ZSBzZXR1cCAqLworICBpZiAoKHByb2ZpbGVEcmMgIT0gRkRLX0RSQ19HZW5lcmF0b3JfZ2V0RHJjUHJvZmlsZShoRHJjQ29tcCkpIHx8CisgICAgICAocHJvZmlsZUNvbXAgIT0gRkRLX0RSQ19HZW5lcmF0b3JfZ2V0Q29tcFByb2ZpbGUoaERyY0NvbXApKSkgeworICAgIEZES19EUkNfR2VuZXJhdG9yX3NldERyY1Byb2ZpbGUoaERyY0NvbXAsIHByb2ZpbGVEcmMsIHByb2ZpbGVDb21wKTsKKyAgfQogCi0gICAgLyogQ2FsbCBjb21wcmVzc29yICovCi0gICAgaWYgKEZES19EUkNfR2VuZXJhdG9yX0NhbGMoaERyY0NvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZWZsdmwyZGlhbG5vcm0ocE1ldGFkYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfVGFyZ2V0UmVmTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmNvbXBfVGFyZ2V0UmVmTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkbXhUYWJsZVtwTWV0YWRhdGEtPmNlbnRlck1peExldmVsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRteFRhYmxlW3BNZXRhZGF0YS0+c3Vycm91bmRNaXhMZXZlbF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmZHlucm5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByKSAhPSAwKQotICAgIHsKLSAgICAgIGVyciA9IE1FVEFEQVRBX0VOQ09ERV9FUlJPUjsKLSAgICAgIGdvdG8gYmFpbDsKLSAgICB9CisgIC8qIFNhbml0eSBjaGVjayAqLworICBpZiAocHJvZmlsZUNvbXAgPT0gRFJDX05PTkUpIHsKKyAgICBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmNvbXByZXNzaW9uX3ZhbHVlID0gMHg4MDsgLyogdG8gZW5zdXJlIG5vIGV4dGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyB3aWxsIGJlIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNvbmZpZ3VyZWQgKi8KKyAgfQogCi0gICAgLyogV3JpdGUgRFJDIHZhbHVlcyAqLwotICAgIHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfYmFuZF9pbmNyID0gMDsKLSAgICBlbmNvZGVEeW5ybmcoZHlucm5nLCBwTWV0YWRhdGEtPm1wZWdEcmMuZHluX3JuZ19jdGwsIHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX3Nnbik7Ci0gICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wcmVzc2lvbl92YWx1ZSA9IGVuY29kZUNvbXByKGNvbXByKTsKKyAgLyogaW4gY2FzZSBvZiBlbWJlZGRpbmcgZXh0ZXJuYWwgdmFsdWVzLCBjb3B5IHRoaXMgbm93IChsaW1pdGVyIG1heSBvdmVyd3JpdGUKKyAgICogdGhlbSkgKi8KKyAgZHlucm5nID0gZGVjb2RlRHlucm5nKHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX2N0bFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX3NnblswXSk7CisgIGNvbXByID0gZGVjb2RlQ29tcHIocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wcmVzc2lvbl92YWx1ZSk7CisKKyAgZG14R2FpbjUgPSBkZWNvZGVEeW5ybmcocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fNV9zZ24pOworICBkbXhHYWluMiA9IGRlY29kZUR5bnJuZyhwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fMl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl8yX3Nnbik7CisKKyAgLyogQ2FsbCBjb21wcmVzc29yICovCisgIGlmIChGREtfRFJDX0dlbmVyYXRvcl9DYWxjKAorICAgICAgICAgIGhEcmNDb21wLCBwU2FtcGxlcywgc2FtcGxlc0J1ZlNpemUsCisgICAgICAgICAgcHJvZ3JlZmx2bDJkaWFsbm9ybShwTWV0YWRhdGEtPm1wZWdEcmMucHJvZ19yZWZfbGV2ZWwpLAorICAgICAgICAgIHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfVGFyZ2V0UmVmTGV2ZWwsCisgICAgICAgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wX1RhcmdldFJlZkxldmVsLAorICAgICAgICAgIGRteFRhYmxlW3BNZXRhZGF0YS0+Y2VudGVyTWl4TGV2ZWxdLAorICAgICAgICAgIGRteFRhYmxlW3BNZXRhZGF0YS0+c3Vycm91bmRNaXhMZXZlbF0sCisgICAgICAgICAgZG14VGFibGVbcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kbWl4X2FfaWR4XSwKKyAgICAgICAgICBkbXhUYWJsZVtwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2RtaXhfYl9pZHhdLAorICAgICAgICAgIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfbGZlX2Rvd25taXhfc3RhdHVzCisgICAgICAgICAgICAgID8gZG14TGZlVGFibGVbcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kbWl4X2xmZV9pZHhdCisgICAgICAgICAgICAgIDogKEZJWFBfREJMKTAsCisgICAgICAgICAgZG14R2FpbjUsIGRteEdhaW4yLCAmZHlucm5nLCAmY29tcHIpICE9IDApIHsKKyAgICBlcnIgPSBNRVRBREFUQV9FTkNPREVfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogV3JpdGUgRFJDIHZhbHVlcyAqLworICBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2JhbmRfaW5jciA9IDA7CisgIGVuY29kZUR5bnJuZyhkeW5ybmcsIHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX2N0bCwKKyAgICAgICAgICAgICAgIHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX3Nnbik7CisgIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fdmFsdWUgPSBlbmNvZGVDb21wcihjb21wcik7CiAKIGJhaWw6Ci0gICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIGVycjsKIH0KIAogRkRLX01FVEFEQVRBX0VSUk9SIEZES19NZXRhZGF0YUVuY19Qcm9jZXNzKAotICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgICAgICBoTWV0YURhdGFFbmMsCi0gICAgICAgIElOVF9QQ00gKiBjb25zdCAgICAgICAgICAgICAgICAgIHBBdWRpb1NhbXBsZXMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgIG5BdWRpb1NhbXBsZXMsCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSAqIGNvbnN0ICAgIHBNZXRhZGF0YSwKLSAgICAgICAgQUFDRU5DX0VYVF9QQVlMT0FEICoqICAgICAgICAgICAgcHBNZXRhRGF0YUV4dFBheWxvYWQsCi0gICAgICAgIFVJTlQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5NZXRhRGF0YUV4dGVuc2lvbnMsCi0gICAgICAgIElOVCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeF9taXhkb3duX2lkeAotICAgICAgICApCi17Ci0gICAgRkRLX01FVEFEQVRBX0VSUk9SIGVyciA9IE1FVEFEQVRBX09LOwotICAgIGludCBtZXRhRGF0YURlbGF5V3JpdGVJZHgsIG1ldGFEYXRhRGVsYXlSZWFkSWR4LCBtZXRhZGF0YU1vZGU7CisgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YUVuYywgSU5UX1BDTSogY29uc3QgcEF1ZGlvU2FtcGxlcywKKyAgICBjb25zdCBVSU5UIGF1ZGlvU2FtcGxlc0J1ZlNpemUsIGNvbnN0IElOVCBuQXVkaW9TYW1wbGVzLAorICAgIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSogY29uc3QgcE1ldGFkYXRhLAorICAgIEFBQ0VOQ19FWFRfUEFZTE9BRCoqIHBwTWV0YURhdGFFeHRQYXlsb2FkLCBVSU5UKiBuTWV0YURhdGFFeHRlbnNpb25zLAorICAgIElOVCogbWF0cml4X21peGRvd25faWR4KSB7CisgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKKyAgaW50IG1ldGFEYXRhRGVsYXlXcml0ZUlkeCwgbWV0YURhdGFEZWxheVJlYWRJZHgsIG1ldGFkYXRhTW9kZTsKIAotICAgIC8qIFdoZXJlIHRvIHdyaXRlIG5ldyBtZXRhIGRhdGEgaW5mbyAqLwotICAgIG1ldGFEYXRhRGVsYXlXcml0ZUlkeCA9IGhNZXRhRGF0YUVuYy0+bWV0YURhdGFEZWxheUlkeDsKKyAgLyogV2hlcmUgdG8gd3JpdGUgbmV3IG1ldGEgZGF0YSBpbmZvICovCisgIG1ldGFEYXRhRGVsYXlXcml0ZUlkeCA9IGhNZXRhRGF0YUVuYy0+bWV0YURhdGFEZWxheUlkeDsKIAotICAgIC8qIEhvdyB0byB3cml0ZSB0aGUgZGF0YSAqLwotICAgIG1ldGFkYXRhTW9kZSA9IGhNZXRhRGF0YUVuYy0+bWV0YWRhdGFNb2RlOworICAvKiBIb3cgdG8gd3JpdGUgdGhlIGRhdGEgKi8KKyAgbWV0YWRhdGFNb2RlID0gaE1ldGFEYXRhRW5jLT5tZXRhZGF0YU1vZGU7CiAKLSAgICAvKiBDb21wZW5zYXRlIG1ldGEgZGF0YSBkZWxheS4gKi8KLSAgICBoTWV0YURhdGFFbmMtPm1ldGFEYXRhRGVsYXlJZHgrKzsKLSAgICBpZiAoaE1ldGFEYXRhRW5jLT5tZXRhRGF0YURlbGF5SWR4ID4gaE1ldGFEYXRhRW5jLT5uTWV0YURhdGFEZWxheSkgaE1ldGFEYXRhRW5jLT5tZXRhRGF0YURlbGF5SWR4ID0gMDsKKyAgLyogQ29tcGVuc2F0ZSBtZXRhIGRhdGEgZGVsYXkuICovCisgIGhNZXRhRGF0YUVuYy0+bWV0YURhdGFEZWxheUlkeCsrOworICBpZiAoaE1ldGFEYXRhRW5jLT5tZXRhRGF0YURlbGF5SWR4ID4gaE1ldGFEYXRhRW5jLT5uTWV0YURhdGFEZWxheSkKKyAgICBoTWV0YURhdGFFbmMtPm1ldGFEYXRhRGVsYXlJZHggPSAwOwogCi0gICAgLyogV2hlcmUgdG8gcmVhZCBwZW5kaW5nIG1ldGEgZGF0YSBpbmZvIGZyb20uICovCi0gICAgbWV0YURhdGFEZWxheVJlYWRJZHggPSBoTWV0YURhdGFFbmMtPm1ldGFEYXRhRGVsYXlJZHg7CisgIC8qIFdoZXJlIHRvIHJlYWQgcGVuZGluZyBtZXRhIGRhdGEgaW5mbyBmcm9tLiAqLworICBtZXRhRGF0YURlbGF5UmVhZElkeCA9IGhNZXRhRGF0YUVuYy0+bWV0YURhdGFEZWxheUlkeDsKIAotICAgIC8qIFN1Ym1pdCBuZXcgZGF0YSBpZiBhdmFpbGFibGUuICovCi0gICAgaWYgKHBNZXRhZGF0YSE9TlVMTCkgewotICAgICAgICBGREttZW1jcHkoJmhNZXRhRGF0YUVuYy0+c3VibWl0dGVkTWV0YURhdGEsIHBNZXRhZGF0YSwgc2l6ZW9mKEFBQ0VOQ19NZXRhRGF0YSkpOworICAvKiBTdWJtaXQgbmV3IGRhdGEgaWYgYXZhaWxhYmxlLiAqLworICBpZiAocE1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICBGREttZW1jcHkoJmhNZXRhRGF0YUVuYy0+c3VibWl0dGVkTWV0YURhdGEsIHBNZXRhZGF0YSwKKyAgICAgICAgICAgICAgc2l6ZW9mKEFBQ0VOQ19NZXRhRGF0YSkpOworICB9CisKKyAgLyogV3JpdGUgb25lIGFkZGl0aW9uYWwgZnJhbWUgd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgbWV0YSBkYXRhLiBFbnN1cmUKKyAgICogZGVmaW5lZCBiZWhhdmlvdXIgb24gZGVjb2RlciBzaWRlLiAqLworICBpZiAoKGhNZXRhRGF0YUVuYy0+ZmluYWxpemVNZXRhRGF0YSAhPSAwKSAmJgorICAgICAgKGhNZXRhRGF0YUVuYy0+bWV0YWRhdGFNb2RlID09IDApKSB7CisgICAgRkRLbWVtY3B5KCZoTWV0YURhdGFFbmMtPnN1Ym1pdHRlZE1ldGFEYXRhLCAmZGVmYXVsdE1ldGFEYXRhU2V0dXAsCisgICAgICAgICAgICAgIHNpemVvZihBQUNFTkNfTWV0YURhdGEpKTsKKyAgICBtZXRhZGF0YU1vZGUgPSBoTWV0YURhdGFFbmMtPmZpbmFsaXplTWV0YURhdGE7CisgICAgaE1ldGFEYXRhRW5jLT5maW5hbGl6ZU1ldGFEYXRhID0gMDsKKyAgfQorCisgIC8qIEdldCBsYXN0IHN1Ym1pdHRlZCBkYXRhLiAqLworICBpZiAoKGVyciA9IExvYWRTdWJtaXR0ZWRNZXRhZGF0YSgKKyAgICAgICAgICAgJmhNZXRhRGF0YUVuYy0+c3VibWl0dGVkTWV0YURhdGEsIGhNZXRhRGF0YUVuYy0+bkNoYW5uZWxzLAorICAgICAgICAgICBtZXRhZGF0YU1vZGUsCisgICAgICAgICAgICZoTWV0YURhdGFFbmMtPm1ldGFEYXRhQnVmZmVyW21ldGFEYXRhRGVsYXlXcml0ZUlkeF0pKSAhPQorICAgICAgTUVUQURBVEFfT0spIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBDYWxjdWxhdGUgY29tcHJlc3NvciBpZiBuZWNlc3NhcnkgYW5kIHVwZGF0YSBtZXRhIGRhdGEgaW5mbyAqLworICBpZiAoKGhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbbWV0YURhdGFEZWxheVdyaXRlSWR4XS5tZXRhZGF0YU1vZGUgPT0gMSkgfHwKKyAgICAgIChoTWV0YURhdGFFbmMtPm1ldGFEYXRhQnVmZmVyW21ldGFEYXRhRGVsYXlXcml0ZUlkeF0ubWV0YWRhdGFNb2RlID09IDIpKSB7CisgICAgaWYgKChlcnIgPSBQcm9jZXNzQ29tcHJlc3NvcigKKyAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdLAorICAgICAgICAgICAgIGhNZXRhRGF0YUVuYy0+aERyY0NvbXAsIHBBdWRpb1NhbXBsZXMsIGF1ZGlvU2FtcGxlc0J1ZlNpemUsCisgICAgICAgICAgICAgbkF1ZGlvU2FtcGxlcykpICE9IE1FVEFEQVRBX09LKSB7CisgICAgICAvKiBHZXQgbGFzdCBzdWJtaXR0ZWQgZGF0YSBhZ2Fpbi4gKi8KKyAgICAgIExvYWRTdWJtaXR0ZWRNZXRhZGF0YSgKKyAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5zdWJtaXR0ZWRNZXRhRGF0YSwgaE1ldGFEYXRhRW5jLT5uQ2hhbm5lbHMsCisgICAgICAgICAgbWV0YWRhdGFNb2RlLCAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdKTsKICAgICB9CisgIH0KIAotICAgIC8qIFdyaXRlIG9uZSBhZGRpdGlvbmFsIGZyYW1lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIG1ldGEgZGF0YS4gRW5zdXJlIGRlZmluZWQgYmVoYXZpb3VyIG9uIGRlY29kZXIgc2lkZS4gKi8KLSAgICBpZiAoIChoTWV0YURhdGFFbmMtPmZpbmFsaXplTWV0YURhdGEhPTApICYmIChoTWV0YURhdGFFbmMtPm1ldGFkYXRhTW9kZT09MCkpIHsKLSAgICAgIEZES21lbWNweSgmaE1ldGFEYXRhRW5jLT5zdWJtaXR0ZWRNZXRhRGF0YSwgJmRlZmF1bHRNZXRhRGF0YVNldHVwLCAgc2l6ZW9mKEFBQ0VOQ19NZXRhRGF0YSkpOwotICAgICAgbWV0YWRhdGFNb2RlID0gaE1ldGFEYXRhRW5jLT5maW5hbGl6ZU1ldGFEYXRhOwotICAgICAgaE1ldGFEYXRhRW5jLT5maW5hbGl6ZU1ldGFEYXRhID0gMDsKLSAgICB9Ci0KLSAgICAvKiBHZXQgbGFzdCBzdWJtaXR0ZWQgZGF0YS4gKi8KLSAgICBpZiAoIChlcnIgPSBMb2FkU3VibWl0dGVkTWV0YWRhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5zdWJtaXR0ZWRNZXRhRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoTWV0YURhdGFFbmMtPm5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdKSkgIT0gTUVUQURBVEFfT0sgKQotICAgIHsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLQotICAgIC8qIENhbGN1bGF0ZSBjb21wcmVzc29yIGlmIG5lY2Vzc2FyeSBhbmQgdXBkYXRhIG1ldGEgZGF0YSBpbmZvICovCi0gICAgaWYgKGhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbbWV0YURhdGFEZWxheVdyaXRlSWR4XS5tZXRhZGF0YU1vZGUgIT0gMCkgewotICAgICAgaWYgKCAoZXJyID0gUHJvY2Vzc0NvbXByZXNzb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhNZXRhRGF0YUVuYy0+aERyY0NvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBuQXVkaW9TYW1wbGVzKSkgIT0gTUVUQURBVEFfT0spCi0gICAgICB7Ci0gICAgICAgIC8qIEdldCBsYXN0IHN1Ym1pdHRlZCBkYXRhIGFnYWluLiAqLwotICAgICAgICBMb2FkU3VibWl0dGVkTWV0YWRhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5zdWJtaXR0ZWRNZXRhRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoTWV0YURhdGFFbmMtPm5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdKTsKKyAgLyogRmlsbCB1cCBkZWxheSBsaW5lIHdpdGggaW5pdGlhbCBtZXRhIGRhdGEgaW5mby4qLworICBpZiAoKGhNZXRhRGF0YUVuYy0+aW5pdGlhbGl6ZU1ldGFEYXRhICE9IDApICYmCisgICAgICAoaE1ldGFEYXRhRW5jLT5tZXRhZGF0YU1vZGUgIT0gMCkpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOworICAgICAgICAgaSA8IChpbnQpKHNpemVvZihoTWV0YURhdGFFbmMtPm1ldGFEYXRhQnVmZmVyKSAvIHNpemVvZihBQUNfTUVUQURBVEEpKTsKKyAgICAgICAgIGkrKykgeworICAgICAgaWYgKGkgIT0gbWV0YURhdGFEZWxheVdyaXRlSWR4KSB7CisgICAgICAgIEZES21lbWNweSgmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlcltpXSwKKyAgICAgICAgICAgICAgICAgICZoTWV0YURhdGFFbmMtPm1ldGFEYXRhQnVmZmVyW21ldGFEYXRhRGVsYXlXcml0ZUlkeF0sCisgICAgICAgICAgICAgICAgICBzaXplb2YoaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdKSk7CiAgICAgICB9CiAgICAgfQorICAgIGhNZXRhRGF0YUVuYy0+aW5pdGlhbGl6ZU1ldGFEYXRhID0gMDsKKyAgfQogCi0gICAgLyogQ29udmVydCBNZXRhIERhdGEgc2lkZSBpbmZvIHRvIGJpdHN0cmVhbSBkYXRhLiAqLwotICAgIGlmICggKGVyciA9IFdyaXRlTWV0YWRhdGFQYXlsb2FkKGhNZXRhRGF0YUVuYywgJmhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbbWV0YURhdGFEZWxheVJlYWRJZHhdKSkgIT0gTUVUQURBVEFfT0sgKSB7Ci0gICAgICBnb3RvIGJhaWw7Ci0gICAgfQorICAvKiBDb252ZXJ0IE1ldGEgRGF0YSBzaWRlIGluZm8gdG8gYml0c3RyZWFtIGRhdGEuICovCisgIEZES19BU1NFUlQobWV0YURhdGFEZWxheVJlYWRJZHggPCBNQVhfREVMQVlfRlJBTUVTKTsKKyAgaWYgKChlcnIgPSBXcml0ZU1ldGFkYXRhUGF5bG9hZCgKKyAgICAgICAgICAgaE1ldGFEYXRhRW5jLAorICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5UmVhZElkeF0pKSAhPQorICAgICAgTUVUQURBVEFfT0spIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KIAotICAgIC8qIEFzc2lnbiBtZXRhIGRhdGEgdG8gb3V0cHV0ICovCi0gICAgKnBwTWV0YURhdGFFeHRQYXlsb2FkID0gaE1ldGFEYXRhRW5jLT5leFBheWxvYWQ7Ci0gICAgKm5NZXRhRGF0YUV4dGVuc2lvbnMgID0gaE1ldGFEYXRhRW5jLT5uRXh0ZW5zaW9uczsKLSAgICAqbWF0cml4X21peGRvd25faWR4ICAgPSBoTWV0YURhdGFFbmMtPm1hdHJpeF9taXhkb3duX2lkeDsKKyAgLyogQXNzaWduIG1ldGEgZGF0YSB0byBvdXRwdXQgKi8KKyAgKnBwTWV0YURhdGFFeHRQYXlsb2FkID0gaE1ldGFEYXRhRW5jLT5leFBheWxvYWQ7CisgICpuTWV0YURhdGFFeHRlbnNpb25zID0gaE1ldGFEYXRhRW5jLT5uRXh0ZW5zaW9uczsKKyAgKm1hdHJpeF9taXhkb3duX2lkeCA9IGhNZXRhRGF0YUVuYy0+bWF0cml4X21peGRvd25faWR4OwogCiBiYWlsOgotICAgIC8qIENvbXBlbnNhdGUgYXVkaW8gZGVsYXksIHJlc2V0IGVyciBzdGF0dXMuICovCi0gICAgZXJyID0gQ29tcGVuc2F0ZUF1ZGlvRGVsYXkoaE1ldGFEYXRhRW5jLCBwQXVkaW9TYW1wbGVzLCBuQXVkaW9TYW1wbGVzKTsKKyAgLyogQ29tcGVuc2F0ZSBhdWRpbyBkZWxheSwgcmVzZXQgZXJyIHN0YXR1cy4gKi8KKyAgZXJyID0gQ29tcGVuc2F0ZUF1ZGlvRGVsYXkoaE1ldGFEYXRhRW5jLCBwQXVkaW9TYW1wbGVzLCBhdWRpb1NhbXBsZXNCdWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQXVkaW9TYW1wbGVzIC8gaE1ldGFEYXRhRW5jLT5uQ2hhbm5lbHMpOwogCi0gICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIGVycjsKIH0KIAotCiBzdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIENvbXBlbnNhdGVBdWRpb0RlbGF5KAotICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgaE1ldGFEYXRhRW5jLAotICAgICAgICBJTlRfUENNICogY29uc3QgICAgICAgICAgICAgcEF1ZGlvU2FtcGxlcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgIG5BdWRpb1NhbXBsZXMKLSAgICAgICAgKQotewotICAgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKKyAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgaE1ldGFEYXRhRW5jLCBJTlRfUENNKiBjb25zdCBwQXVkaW9TYW1wbGVzLAorICAgIGNvbnN0IFVJTlQgYXVkaW9TYW1wbGVzQnVmU2l6ZSwgY29uc3QgSU5UIG5BdWRpb1NhbXBsZXMpIHsKKyAgRkRLX01FVEFEQVRBX0VSUk9SIGVyciA9IE1FVEFEQVRBX09LOwogCi0gICAgaWYgKGhNZXRhRGF0YUVuYy0+bkF1ZGlvRGF0YURlbGF5KSB7Ci0gICAgICBpbnQgaSwgZGVsYXlTYW1wbGVzID0gaE1ldGFEYXRhRW5jLT5uQXVkaW9EYXRhRGVsYXkqaE1ldGFEYXRhRW5jLT5uQ2hhbm5lbHM7CisgIGlmIChoTWV0YURhdGFFbmMtPm5BdWRpb0RhdGFEZWxheSkgeworICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChzY3JhdGNoX2F1ZGlvRGVsYXlCdWZmZXIsIElOVF9QQ00sIDEwMjQpOwogCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbkF1ZGlvU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIElOVF9QQ00gdG1wID0gcEF1ZGlvU2FtcGxlc1tpXTsKLSAgICAgICAgcEF1ZGlvU2FtcGxlc1tpXSA9IGhNZXRhRGF0YUVuYy0+YXVkaW9EZWxheUJ1ZmZlcltoTWV0YURhdGFFbmMtPmF1ZGlvRGVsYXlJZHhdOwotICAgICAgICBoTWV0YURhdGFFbmMtPmF1ZGlvRGVsYXlCdWZmZXJbaE1ldGFEYXRhRW5jLT5hdWRpb0RlbGF5SWR4XSA9IHRtcDsKKyAgICBmb3IgKGludCBjID0gMDsgYyA8IGhNZXRhRGF0YUVuYy0+bkNoYW5uZWxzOyBjKyspIHsKKyAgICAgIGludCBNID0gMTAyNDsKKyAgICAgIElOVF9QQ00qIHBBdWRpb1NhbXBsZXMyID0gcEF1ZGlvU2FtcGxlcyArIGMgKiBhdWRpb1NhbXBsZXNCdWZTaXplOworICAgICAgaW50IGRlbGF5SWR4ID0gaE1ldGFEYXRhRW5jLT5uQXVkaW9EYXRhRGVsYXk7CiAKLSAgICAgICAgaE1ldGFEYXRhRW5jLT5hdWRpb0RlbGF5SWR4Kys7Ci0gICAgICAgIGlmIChoTWV0YURhdGFFbmMtPmF1ZGlvRGVsYXlJZHggPj0gZGVsYXlTYW1wbGVzKSBoTWV0YURhdGFFbmMtPmF1ZGlvRGVsYXlJZHggPSAwOwotICAgICAgfQorICAgICAgZG8geworICAgICAgICBNID0gZk1pbihNLCBkZWxheUlkeCk7CisgICAgICAgIGRlbGF5SWR4IC09IE07CisKKyAgICAgICAgRkRLbWVtY3B5KCZzY3JhdGNoX2F1ZGlvRGVsYXlCdWZmZXJbMF0sCisgICAgICAgICAgICAgICAgICAmcEF1ZGlvU2FtcGxlczJbKG5BdWRpb1NhbXBsZXMgLSBNKV0sIHNpemVvZihJTlRfUENNKSAqIE0pOworICAgICAgICBGREttZW1tb3ZlKCZwQXVkaW9TYW1wbGVzMltNXSwgJnBBdWRpb1NhbXBsZXMyWzBdLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihJTlRfUENNKSAqIChuQXVkaW9TYW1wbGVzIC0gTSkpOworICAgICAgICBGREttZW1jcHkoCisgICAgICAgICAgICAmcEF1ZGlvU2FtcGxlczJbMF0sCisgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5wQXVkaW9EZWxheUJ1ZmZlcltkZWxheUlkeCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICogaE1ldGFEYXRhRW5jLT5uQXVkaW9EYXRhRGVsYXldLAorICAgICAgICAgICAgc2l6ZW9mKElOVF9QQ00pICogTSk7CisgICAgICAgIEZES21lbWNweSgKKyAgICAgICAgICAgICZoTWV0YURhdGFFbmMtPnBBdWRpb0RlbGF5QnVmZmVyW2RlbGF5SWR4ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgKiBoTWV0YURhdGFFbmMtPm5BdWRpb0RhdGFEZWxheV0sCisgICAgICAgICAgICAmc2NyYXRjaF9hdWRpb0RlbGF5QnVmZmVyWzBdLCBzaXplb2YoSU5UX1BDTSkgKiBNKTsKKworICAgICAgfSB3aGlsZSAoZGVsYXlJZHggPiAwKTsKICAgICB9CiAKLSAgICByZXR1cm4gZXJyOworICAgIENfQUxMT0NfU0NSQVRDSF9FTkQoc2NyYXRjaF9hdWRpb0RlbGF5QnVmZmVyLCBJTlRfUENNLCAxMDI0KTsKKyAgfQorCisgIHJldHVybiBlcnI7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY1MSwyMTkgKzgwOCwzNzcgQEAKIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIFdyaXRlTWV0YWRhdGFQYXlsb2FkKAotICAgICAgICBjb25zdCBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgaE1ldGFEYXRhLAotICAgICAgICBjb25zdCBBQUNfTUVUQURBVEEgKiBjb25zdCAgICAgICAgcE1ldGFkYXRhCi0gICAgICAgICkKLXsKLSAgICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CisgICAgY29uc3QgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YSwKKyAgICBjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSkgeworICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CiAKLSAgICBpZiAoIChoTWV0YURhdGE9PU5VTEwpIHx8IChwTWV0YWRhdGE9PU5VTEwpICkgewotICAgICAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKLSAgICAgICAgZ290byBiYWlsOworICBpZiAoKGhNZXRhRGF0YSA9PSBOVUxMKSB8fCAocE1ldGFkYXRhID09IE5VTEwpKSB7CisgICAgZXJyID0gTUVUQURBVEFfSU5WQUxJRF9IQU5ETEU7CisgICAgZ290byBiYWlsOworICB9CisKKyAgaE1ldGFEYXRhLT5uRXh0ZW5zaW9ucyA9IDA7CisgIGhNZXRhRGF0YS0+bWF0cml4X21peGRvd25faWR4ID0gLTE7CisKKyAgaWYgKHBNZXRhZGF0YS0+bWV0YWRhdGFNb2RlICE9IDApIHsKKyAgICAvKiBBQUMtRFJDICovCisgICAgaWYgKChwTWV0YWRhdGEtPm1ldGFkYXRhTW9kZSA9PSAxKSB8fCAocE1ldGFkYXRhLT5tZXRhZGF0YU1vZGUgPT0gMikpIHsKKyAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLnBEYXRhID0KKyAgICAgICAgICBoTWV0YURhdGEtPmRyY0luZm9QYXlsb2FkOworICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uZGF0YVR5cGUgPSBFWFRfRFlOQU1JQ19SQU5HRTsKKyAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLmFzc29jaWF0ZWRDaEVsZW1lbnQgPSAtMTsKKworICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uZGF0YVNpemUgPQorICAgICAgICAgIFdyaXRlRHluYW1pY1JhbmdlSW5mb1BheWxvYWQoCisgICAgICAgICAgICAgIHBNZXRhZGF0YSwgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10ucERhdGEpOworCisgICAgICBoTWV0YURhdGEtPm5FeHRlbnNpb25zKys7CisgICAgfSAvKiBwTWV0YWRhdGEtPm1ldGFkYXRhTW9kZT09MSB8fCBwTWV0YWRhdGEtPm1ldGFkYXRhTW9kZT09MiAqLworCisgICAgLyogTWF0cml4IE1peGRvd24gQ29lZmZpY2llbnQgaW4gUENFICovCisgICAgaWYgKHBNZXRhZGF0YS0+V3JpdGVQQ0VNaXhEd25JZHgpIHsKKyAgICAgIGhNZXRhRGF0YS0+bWF0cml4X21peGRvd25faWR4ID0KKyAgICAgICAgICBzdXJtaXgybWF0cml4X21peGRvd25faWR4W3BNZXRhZGF0YS0+c3Vycm91bmRNaXhMZXZlbF07CiAgICAgfQogCi0gICAgaE1ldGFEYXRhLT5uRXh0ZW5zaW9ucyA9IDA7Ci0gICAgaE1ldGFEYXRhLT5tYXRyaXhfbWl4ZG93bl9pZHggPSAtMTsKLQotICAgIC8qIEFBQy1EUkMgKi8KLSAgICBpZiAocE1ldGFkYXRhLT5tZXRhZGF0YU1vZGUgIT0gMCkKKyAgICAvKiBFVFNJIFRTIDEwMSAxNTQgKERWQikgLSBNUEVHNCBhbmNpbGxhcnlfZGF0YSgpICovCisgICAgaWYgKChwTWV0YWRhdGEtPm1ldGFkYXRhTW9kZSA9PSAyKSB8fAorICAgICAgICAocE1ldGFkYXRhLT5tZXRhZGF0YU1vZGUgPT0gMykpIC8qIE1QNF9NRVRBREFUQV9NUEVHX0VUU0kgKi8KICAgICB7Ci0gICAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLnBEYXRhICAgICAgICAgICAgICAgPSBoTWV0YURhdGEtPmRyY0luZm9QYXlsb2FkOwotICAgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5kYXRhVHlwZSAgICAgICAgICAgID0gRVhUX0RZTkFNSUNfUkFOR0U7Ci0gICAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLmFzc29jaWF0ZWRDaEVsZW1lbnQgPSAtMTsKKyAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLnBEYXRhID0KKyAgICAgICAgICBoTWV0YURhdGEtPmRyY0RzZVBheWxvYWQ7CisgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5kYXRhVHlwZSA9IEVYVF9EQVRBX0VMRU1FTlQ7CisgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID0gLTE7CiAKLSAgICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uZGF0YVNpemUgPQotICAgICAgICAgICAgICBXcml0ZUR5bmFtaWNSYW5nZUluZm9QYXlsb2FkKHBNZXRhZGF0YSwgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10ucERhdGEpOworICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uZGF0YVNpemUgPQorICAgICAgICAgIFdyaXRlRXRzaUFuY2lsbGFyeURhdGFQYXlsb2FkKAorICAgICAgICAgICAgICBwTWV0YWRhdGEsIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLnBEYXRhKTsKIAotICAgICAgICBoTWV0YURhdGEtPm5FeHRlbnNpb25zKys7CisgICAgICBoTWV0YURhdGEtPm5FeHRlbnNpb25zKys7CisgICAgfSAvKiBtZXRhZGF0YU1vZGU9PTIgfHwgbWV0YWRhdGFNb2RlPT0zICovCiAKLSAgICAgICAgLyogTWF0cml4IE1peGRvd24gQ29lZmZpY2llbnQgaW4gUENFICovCi0gICAgICAgIGlmIChwTWV0YWRhdGEtPldyaXRlUENFTWl4RHduSWR4KSB7Ci0gICAgICAgICAgICBoTWV0YURhdGEtPm1hdHJpeF9taXhkb3duX2lkeCA9IHN1cm1peDJtYXRyaXhfbWl4ZG93bl9pZHhbcE1ldGFkYXRhLT5zdXJyb3VuZE1peExldmVsXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEVUU0kgVFMgMTAxIDE1NCAoRFZCKSAtIE1QRUc0IGFuY2lsbGFyeV9kYXRhKCkgKi8KLSAgICAgICAgaWYgKHBNZXRhZGF0YS0+bWV0YWRhdGFNb2RlID09IDIpIC8qIE1QNF9NRVRBREFUQV9NUEVHX0VUU0kgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10ucERhdGEgICAgICAgICAgICAgICA9IGhNZXRhRGF0YS0+ZHJjRHNlUGF5bG9hZDsKLSAgICAgICAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLmRhdGFUeXBlICAgICAgICAgICAgPSBFWFRfREFUQV9FTEVNRU5UOwotICAgICAgICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uYXNzb2NpYXRlZENoRWxlbWVudCA9IC0xOwotCi0gICAgICAgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5kYXRhU2l6ZSA9Ci0gICAgICAgICAgICAgICAgIFdyaXRlRXRzaUFuY2lsbGFyeURhdGFQYXlsb2FkKHBNZXRhZGF0YSxoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5wRGF0YSk7Ci0KLSAgICAgICAgICAgIGhNZXRhRGF0YS0+bkV4dGVuc2lvbnMrKzsKLSAgICAgICAgfSAvKiBtZXRhZGF0YU1vZGUgPT0gMiAqLwotCi0gICAgfSAvKiBtZXRhZGF0YU1vZGUgIT0gMCAqLworICB9IC8qIG1ldGFkYXRhTW9kZSAhPSAwICovCiAKIGJhaWw6Ci0gICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIElOVCBXcml0ZUR5bmFtaWNSYW5nZUluZm9QYXlsb2FkKAotICAgICAgICBjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSwKLSAgICAgICAgVUNIQVIqIGNvbnN0ICAgICAgICAgICAgICBwRXh0ZW5zaW9uUGF5bG9hZAotICAgICAgICApCi17Ci0gICAgY29uc3QgSU5UIHBjZV90YWdfcHJlc2VudCA9IDA7ICAgICAgICAvKiB5ZXQgZml4ZWQgc2V0dGluZyEgKi8KLSAgICBjb25zdCBJTlQgcHJvZ19yZWZfbGV2X3Jlc19iaXRzID0gMDsKLSAgICBJTlQgaSwgZHJjX251bV9iYW5kcyA9IDE7CitzdGF0aWMgSU5UIFdyaXRlRHluYW1pY1JhbmdlSW5mb1BheWxvYWQoY29uc3QgQUFDX01FVEFEQVRBKiBjb25zdCBwTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIGNvbnN0IHBFeHRlbnNpb25QYXlsb2FkKSB7CisgIGNvbnN0IElOVCBwY2VfdGFnX3ByZXNlbnQgPSAwOyAvKiB5ZXQgZml4ZWQgc2V0dGluZyEgKi8KKyAgY29uc3QgSU5UIHByb2dfcmVmX2xldl9yZXNfYml0cyA9IDA7CisgIElOVCBpLCBkcmNfbnVtX2JhbmRzID0gMTsKIAotICAgIEZES19CSVRTVFJFQU0gYnNXcml0ZXI7Ci0gICAgRkRLaW5pdEJpdFN0cmVhbSgmYnNXcml0ZXIsIHBFeHRlbnNpb25QYXlsb2FkLCAxNiwgMCwgQlNfV1JJVEVSKTsKKyAgRkRLX0JJVFNUUkVBTSBic1dyaXRlcjsKKyAgRkRLaW5pdEJpdFN0cmVhbSgmYnNXcml0ZXIsIHBFeHRlbnNpb25QYXlsb2FkLCAxNiwgMCwgQlNfV1JJVEVSKTsKIAotICAgIC8qIGR5bmFtaWNfcmFuZ2VfaW5mbygpICovCi0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcGNlX3RhZ19wcmVzZW50LCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBjZV90YWdfcHJlc2VudCAqLwotICAgIGlmIChwY2VfdGFnX3ByZXNlbnQpIHsKLSAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGNlX2luc3RhbmNlX3RhZyAqLwotICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgwLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcmNfdGFnX3Jlc2VydmVkX2JpdHMgKi8KLSAgIH0KKyAgLyogZHluYW1pY19yYW5nZV9pbmZvKCkgKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcGNlX3RhZ19wcmVzZW50LCAxKTsgLyogcGNlX3RhZ19wcmVzZW50ICovCisgIGlmIChwY2VfdGFnX3ByZXNlbnQpIHsKKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAweDAsIDQpOyAvKiBwY2VfaW5zdGFuY2VfdGFnICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgwLCA0KTsgLyogZHJjX3RhZ19yZXNlcnZlZF9iaXRzICovCisgIH0KIAotICAgIC8qIEV4Y2x1ZGUgY2hhbm5lbHMgKi8KLSAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAocE1ldGFkYXRhLT5tcGVnRHJjLmV4Y2x1ZGVkX2NobnNfcHJlc2VudCkgPyAxIDogMCwgMSk7ICAgICAgLyogZXhjbHVkZWRfY2huc19wcmVzZW50Ki8KKyAgLyogRXhjbHVkZSBjaGFubmVscyAqLworICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAocE1ldGFkYXRhLT5tcGVnRHJjLmV4Y2x1ZGVkX2NobnNfcHJlc2VudCkgPyAxIDogMCwKKyAgICAgICAgICAgICAgIDEpOyAvKiBleGNsdWRlZF9jaG5zX3ByZXNlbnQqLwogCi0gICAgLyogTXVsdGliYW5kIERSQyAqLwotICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIChwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2JhbmRzX3ByZXNlbnQpID8gMSA6IDAsIDEpOyAgICAgICAgICAvKiBkcmNfYmFuZHNfcHJlc2VudCAqLwotICAgIGlmIChwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2JhbmRzX3ByZXNlbnQpCi0gICAgewotICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLmRyY19iYW5kX2luY3IsIDQpOyAgICAgICAgICAgICAgICAgICAgICAvKiBkcmNfYmFuZF9pbmNyICovCi0gICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2ludGVycG9sYXRpb25fc2NoZW1lLCA0KTsgICAgICAgICAgIC8qIGRyY19pbnRlcnBvbGF0aW9uX3NjaGVtZSAqLwotICAgICAgZHJjX251bV9iYW5kcyArPSBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2JhbmRfaW5jcjsKLSAgICAgIGZvciAoaT0wOyBpPGRyY19udW1fYmFuZHM7IGkrKykgewotICAgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2JhbmRfdG9wW2ldLCA4KTsgICAgICAgICAgICAgICAgICAvKiBkcmNfYmFuZF90b3AgKi8KLSAgICAgIH0KKyAgLyogTXVsdGliYW5kIERSQyAqLworICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAocE1ldGFkYXRhLT5tcGVnRHJjLmRyY19iYW5kc19wcmVzZW50KSA/IDEgOiAwLAorICAgICAgICAgICAgICAgMSk7IC8qIGRyY19iYW5kc19wcmVzZW50ICovCisgIGlmIChwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2JhbmRzX3ByZXNlbnQpIHsKKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2JhbmRfaW5jciwKKyAgICAgICAgICAgICAgICAgNCk7IC8qIGRyY19iYW5kX2luY3IgKi8KKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2ludGVycG9sYXRpb25fc2NoZW1lLAorICAgICAgICAgICAgICAgICA0KTsgLyogZHJjX2ludGVycG9sYXRpb25fc2NoZW1lICovCisgICAgZHJjX251bV9iYW5kcyArPSBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2JhbmRfaW5jcjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHJjX251bV9iYW5kczsgaSsrKSB7CisgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2JhbmRfdG9wW2ldLAorICAgICAgICAgICAgICAgICAgIDgpOyAvKiBkcmNfYmFuZF90b3AgKi8KICAgICB9CisgIH0KIAotICAgIC8qIFByb2dyYW0gUmVmZXJlbmNlIExldmVsICovCi0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsX3ByZXNlbnQsIDEpOyAgICAgICAgICAgICAgIC8qIHByb2dfcmVmX2xldmVsX3ByZXNlbnQgKi8KLSAgICBpZiAocE1ldGFkYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsX3ByZXNlbnQpCi0gICAgewotICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsLCA3KTsgICAgICAgICAgICAgICAgICAgICAvKiBwcm9nX3JlZl9sZXZlbCAqLwotICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcHJvZ19yZWZfbGV2X3Jlc19iaXRzLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9nX3JlZl9sZXZlbF9yZXNlcnZlZF9iaXRzICovCi0gICAgfQorICAvKiBQcm9ncmFtIFJlZmVyZW5jZSBMZXZlbCAqLworICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPm1wZWdEcmMucHJvZ19yZWZfbGV2ZWxfcHJlc2VudCwKKyAgICAgICAgICAgICAgIDEpOyAvKiBwcm9nX3JlZl9sZXZlbF9wcmVzZW50ICovCisgIGlmIChwTWV0YWRhdGEtPm1wZWdEcmMucHJvZ19yZWZfbGV2ZWxfcHJlc2VudCkgeworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+bXBlZ0RyYy5wcm9nX3JlZl9sZXZlbCwKKyAgICAgICAgICAgICAgICAgNyk7IC8qIHByb2dfcmVmX2xldmVsICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcHJvZ19yZWZfbGV2X3Jlc19iaXRzLAorICAgICAgICAgICAgICAgICAxKTsgLyogcHJvZ19yZWZfbGV2ZWxfcmVzZXJ2ZWRfYml0cyAqLworICB9CiAKLSAgICAvKiBEUkMgVmFsdWVzICovCi0gICAgZm9yIChpPTA7IGk8ZHJjX251bV9iYW5kczsgaSsrKSB7Ci0gICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAocE1ldGFkYXRhLT5tcGVnRHJjLmR5bl9ybmdfc2duW2ldKSA/IDEgOiAwLCAxKTsgICAgICAgICAgIC8qIGR5bl9ybmdfc2duWyAqLwotICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLmR5bl9ybmdfY3RsW2ldLCA3KTsgICAgICAgICAgICAgICAgICAgICAvKiBkeW5fcm5nX2N0bCAqLwotICAgIH0KKyAgLyogRFJDIFZhbHVlcyAqLworICBmb3IgKGkgPSAwOyBpIDwgZHJjX251bV9iYW5kczsgaSsrKSB7CisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX3NnbltpXSkgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgMSk7IC8qIGR5bl9ybmdfc2duWyAqLworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX2N0bFtpXSwKKyAgICAgICAgICAgICAgICAgNyk7IC8qIGR5bl9ybmdfY3RsICovCisgIH0KIAotICAgIC8qIHJldHVybiBudW1iZXIgb2YgdmFsaWQgYml0cyBpbiBleHRlbnNpb24gcGF5bG9hZC4gKi8KLSAgICByZXR1cm4gRkRLZ2V0VmFsaWRCaXRzKCZic1dyaXRlcik7CisgIC8qIHJldHVybiBudW1iZXIgb2YgdmFsaWQgYml0cyBpbiBleHRlbnNpb24gcGF5bG9hZC4gKi8KKyAgcmV0dXJuIEZES2dldFZhbGlkQml0cygmYnNXcml0ZXIpOwogfQogCi1zdGF0aWMgSU5UIFdyaXRlRXRzaUFuY2lsbGFyeURhdGFQYXlsb2FkKAotICAgICAgICBjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSwKLSAgICAgICAgVUNIQVIqIGNvbnN0ICAgICAgICAgICAgICBwRXh0ZW5zaW9uUGF5bG9hZAotICAgICAgICApCi17Ci0gICAgRkRLX0JJVFNUUkVBTSBic1dyaXRlcjsKLSAgICBGREtpbml0Qml0U3RyZWFtKCZic1dyaXRlciwgcEV4dGVuc2lvblBheWxvYWQsIDE2LCAwLCBCU19XUklURVIpOworc3RhdGljIElOVCBXcml0ZUV0c2lBbmNpbGxhcnlEYXRhUGF5bG9hZChjb25zdCBBQUNfTUVUQURBVEEqIGNvbnN0IHBNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIGNvbnN0IHBFeHRlbnNpb25QYXlsb2FkKSB7CisgIEZES19CSVRTVFJFQU0gYnNXcml0ZXI7CisgIEZES2luaXRCaXRTdHJlYW0oJmJzV3JpdGVyLCBwRXh0ZW5zaW9uUGF5bG9hZCwgMTYsIDAsIEJTX1dSSVRFUik7CiAKLSAgICAvKiBhbmNpbGxhcnlfZGF0YV9zeW5jICovCi0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHhCQywgOCk7CisgIC8qIGFuY2lsbGFyeV9kYXRhX3N5bmMgKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHhCQywgOCk7CiAKLSAgICAvKiBic19pbmZvICovCi0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgzLCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1wZWdfYXVkaW9fdHlwZSAqLwotICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+ZG9sYnlTdXJyb3VuZE1vZGUsIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb2xieV9zdXJyb3VuZF9tb2RlICovCi0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgwLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkICovCisgIC8qIGJzX2luZm8gKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgzLCAyKTsgLyogbXBlZ19hdWRpb190eXBlICovCisgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+ZG9sYnlTdXJyb3VuZE1vZGUsCisgICAgICAgICAgICAgICAyKTsgLyogZG9sYnlfc3Vycm91bmRfbW9kZSAqLworICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPmRyY1ByZXNlbnRhdGlvbk1vZGUsCisgICAgICAgICAgICAgICAyKTsgICAgICAgICAgICAgICAgIC8qIERSQyBwcmVzZW50YXRpb24gbW9kZSAqLworICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAweDAsIDEpOyAvKiBzdGVyZW9fZG93bm1peF9tb2RlICovCisgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MCwgMSk7IC8qIHJlc2VydmVkICovCiAKLSAgICAvKiBhbmNpbGxhcnlfZGF0YV9zdGF0dXMgKi8KLSAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAwLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMyBiaXQgUmVzZXJ2ZWQsIHNldCB0byAiMCIgKi8KLSAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAocE1ldGFkYXRhLT5EbXhMdmxfT24pID8gMSA6IDAsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzRfc3RhdHVzICovCi0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2VydmVkLCBzZXQgdG8gIjAiICovCi0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fb24pID8gMSA6IDAsIDEpOyAgICAgICAgIC8qIGF1ZGlvX2NvZGluZ19tb2RlX2FuZF9jb21wcmVzc2lvbiBzdGF0dXMgKi8KLSAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9jb2Fyc2Vfc3RhdHVzKSA/IDEgOiAwLCAxKTsgLyogY29hcnNlX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLwotICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLnRpbWVjb2RlX2ZpbmVfc3RhdHVzKSA/IDEgOiAwLCAxKTsgICAvKiBmaW5lX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLworICAvKiBhbmNpbGxhcnlfZGF0YV9zdGF0dXMgKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMCwgMyk7IC8qIDMgYml0IFJlc2VydmVkLCBzZXQgdG8gIjAiICovCisgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIChwTWV0YWRhdGEtPkRteEx2bF9PbikgPyAxIDogMCwKKyAgICAgICAgICAgICAgIDEpOyAvKiBkb3dubWl4aW5nX2xldmVsc19NUEVHNF9zdGF0dXMgKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhU3RhdHVzLAorICAgICAgICAgICAgICAgMSk7IC8qIGV4dF9hbmNfZGF0YV9zdGF0dXMgKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fb24pID8gMSA6IDAsCisgICAgICAgICAgICAgICAxKTsgLyogYXVkaW9fY29kaW5nX21vZGVfYW5kX2NvbXByZXNzaW9uIHN0YXR1cyAqLworICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLAorICAgICAgICAgICAgICAgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEudGltZWNvZGVfY29hcnNlX3N0YXR1cykgPyAxIDogMCwKKyAgICAgICAgICAgICAgIDEpOyAvKiBjb2Fyc2VfZ3JhaW5fdGltZWNvZGVfc3RhdHVzICovCisgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLnRpbWVjb2RlX2ZpbmVfc3RhdHVzKSA/IDEgOiAwLAorICAgICAgICAgICAgICAgMSk7IC8qIGZpbmVfZ3JhaW5fdGltZWNvZGVfc3RhdHVzICovCiAKLSAgICAvKiBkb3dubWl4aW5nX2xldmVsc19NUEVHNF9zdGF0dXMgKi8KLSAgICBpZiAocE1ldGFkYXRhLT5EbXhMdmxfT24pIHsKLSAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIGVuY29kZURteEx2bHMocE1ldGFkYXRhLT5jZW50ZXJNaXhMZXZlbCwgcE1ldGFkYXRhLT5zdXJyb3VuZE1peExldmVsKSwgOCk7CisgIC8qIGRvd25taXhpbmdfbGV2ZWxzX01QRUc0X3N0YXR1cyAqLworICBpZiAocE1ldGFkYXRhLT5EbXhMdmxfT24pIHsKKyAgICBGREt3cml0ZUJpdHMoCisgICAgICAgICZic1dyaXRlciwKKyAgICAgICAgZW5jb2RlRG14THZscyhwTWV0YWRhdGEtPmNlbnRlck1peExldmVsLCBwTWV0YWRhdGEtPnN1cnJvdW5kTWl4TGV2ZWwpLAorICAgICAgICA4KTsKKyAgfQorCisgIC8qIGF1ZGlvX2NvZGluZ19tb2RlX2FuZF9jb21wcmVzc2lvbl9zdGF0dXMgKi8KKyAgaWYgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fb24pIHsKKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAweDAxLCA4KTsgLyogYXVkaW8gY29kaW5nIG1vZGUgKi8KKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmNvbXByZXNzaW9uX3ZhbHVlLAorICAgICAgICAgICAgICAgICA4KTsgLyogY29tcHJlc3Npb24gdmFsdWUgKi8KKyAgfQorCisgIC8qIGdyYWluLXRpbWVjb2RlIGNvYXJzZS9maW5lICovCisgIGlmIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLnRpbWVjb2RlX2NvYXJzZV9zdGF0dXMpIHsKKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAweDAsIDE2KTsgLyogbm90IHlldCBzdXBwb3J0ZWQgKi8KKyAgfQorCisgIGlmIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLnRpbWVjb2RlX2ZpbmVfc3RhdHVzKSB7CisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgwLCAxNik7IC8qIG5vdCB5ZXQgc3VwcG9ydGVkICovCisgIH0KKworICAvKiBleHRlbmRlZCBhbmNpbGxhcnkgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgaWYgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YVN0YXR1cykgeworICAgIC8qIGV4dF9hbmNpbGxhcnlfZGF0YV9zdGF0dXMgKi8KKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAwLCAxKTsgLyogUmVzZXJ2ZWQsIHNldCB0byAiMCIgKi8KKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLAorICAgICAgICAgICAgICAgICBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2Rvd25taXhfbHZsX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgMSk7IC8qIGV4dF9kb3dubWl4aW5nX2xldmVsc19zdGF0dXMgKi8KKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLAorICAgICAgICAgICAgICAgICBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2Rvd25taXhfZ2Fpbl9zdGF0dXMsCisgICAgICAgICAgICAgICAgIDEpOyAvKiBleHRfZG93bm1peGluZ19nbG9iYWxfZ2FpbnNfc3RhdHVzICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwKKyAgICAgICAgICAgICAgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9sZmVfZG93bm1peF9zdGF0dXMsCisgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgIC8qIGV4dF9kb3dubWl4aW5nX2xmZV9sZXZlbF9zdGF0dXMiICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMCwgNCk7IC8qIFJlc2VydmVkLCBzZXQgdG8gIjAiICovCisKKyAgICAvKiBleHRfZG93bm1peGluZ19sZXZlbHMgKi8KKyAgICBpZiAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kb3dubWl4X2x2bF9zdGF0dXMpIHsKKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9hX2lkeCwKKyAgICAgICAgICAgICAgICAgICAzKTsgLyogZG1peF9hX2lkeCAqLworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kbWl4X2JfaWR4LAorICAgICAgICAgICAgICAgICAgIDMpOyAgICAgICAgICAgICAgIC8qIGRtaXhfYl9pZHggKi8KKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDAsIDIpOyAvKiBSZXNlcnZlZCwgc2V0IHRvICIwIiAqLwogICAgIH0KIAotICAgIC8qIGF1ZGlvX2NvZGluZ19tb2RlX2FuZF9jb21wcmVzc2lvbl9zdGF0dXMgKi8KLSAgICBpZiAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wcmVzc2lvbl9vbikgewotICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgwMSwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdWRpbyBjb2RpbmcgbW9kZSAqLwotICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wcmVzc2lvbl92YWx1ZSwgOCk7ICAgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiB2YWx1ZSAqLworICAgIC8qIGV4dF9kb3dubWl4aW5nX2dhaW5zICovCisgICAgaWYgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG93bm1peF9nYWluX3N0YXR1cykgeworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzVfc2duLAorICAgICAgICAgICAgICAgICAgIDEpOyAvKiBkbXhfZ2Fpbl81X3NpZ24gKi8KKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl81X2lkeCwKKyAgICAgICAgICAgICAgICAgICA2KTsgICAgICAgICAgICAgICAvKiBkbXhfZ2Fpbl81X2lkeCAqLworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMCwgMSk7IC8qIFJlc2VydmVkLCBzZXQgdG8gIjAiICovCisgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fMl9zZ24sCisgICAgICAgICAgICAgICAgICAgMSk7IC8qIGRteF9nYWluXzJfc2lnbiAqLworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzJfaWR4LAorICAgICAgICAgICAgICAgICAgIDYpOyAgICAgICAgICAgICAgIC8qIGRteF9nYWluXzJfaWR4ICovCisgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAwLCAxKTsgLyogUmVzZXJ2ZWQsIHNldCB0byAiMCIgKi8KICAgICB9CiAKLSAgICAvKiBncmFpbi10aW1lY29kZSBjb2Fyc2UvZmluZSAqLwotICAgIGlmIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLnRpbWVjb2RlX2NvYXJzZV9zdGF0dXMpIHsKLSAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MCwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IHlldCBzdXBwb3J0ZWQgKi8KKyAgICBpZiAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9sZmVfZG93bm1peF9zdGF0dXMpIHsKKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsCisgICAgICAgICAgICAgICAgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kbWl4X2xmZV9pZHgsCisgICAgICAgICAgICAgICAgICAgNCk7ICAgICAgICAgICAgICAgLyogZG1peF9sZmVfaWR4ICovCisgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAwLCA0KTsgLyogUmVzZXJ2ZWQsIHNldCB0byAiMCIgKi8KICAgICB9CisgIH0KIAotICAgIGlmIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLnRpbWVjb2RlX2ZpbmVfc3RhdHVzKSB7Ci0gICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAweDAsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCB5ZXQgc3VwcG9ydGVkICovCi0gICAgfQotCi0gICAgcmV0dXJuIEZES2dldFZhbGlkQml0cygmYnNXcml0ZXIpOworICByZXR1cm4gRkRLZ2V0VmFsaWRCaXRzKCZic1dyaXRlcik7CiB9CiAKLQogc3RhdGljIEZES19NRVRBREFUQV9FUlJPUiBMb2FkU3VibWl0dGVkTWV0YWRhdGEoCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSAqIGNvbnN0ICAgaE1ldGFkYXRhLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGUsCi0gICAgICAgIEFBQ19NRVRBREFUQSAqIGNvbnN0ICAgICAgICAgICAgcEFhY01ldGFEYXRhCi0gICAgICAgICkKLXsKLSAgICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CisgICAgY29uc3QgQUFDRU5DX01ldGFEYXRhKiBjb25zdCBoTWV0YWRhdGEsIGNvbnN0IElOVCBuQ2hhbm5lbHMsCisgICAgY29uc3QgSU5UIG1ldGFkYXRhTW9kZSwgQUFDX01FVEFEQVRBKiBjb25zdCBwQWFjTWV0YURhdGEpIHsKKyAgRkRLX01FVEFEQVRBX0VSUk9SIGVyciA9IE1FVEFEQVRBX09LOwogCi0gICAgaWYgKHBBYWNNZXRhRGF0YT09TlVMTCkgewotICAgICAgZXJyID0gTUVUQURBVEFfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLyogaW5pdCBzdHJ1Y3QgKi8KLSAgICAgIEZES21lbWNsZWFyKHBBYWNNZXRhRGF0YSwgc2l6ZW9mKEFBQ19NRVRBREFUQSkpOworICBpZiAocEFhY01ldGFEYXRhID09IE5VTEwpIHsKKyAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICAvKiBpbml0IHN0cnVjdCAqLworICAgIEZES21lbWNsZWFyKHBBYWNNZXRhRGF0YSwgc2l6ZW9mKEFBQ19NRVRBREFUQSkpOwogCi0gICAgICBpZiAoaE1ldGFkYXRhIT1OVUxMKSB7Ci0gICAgICAgIC8qIGNvbnZlcnQgZGF0YSAqLwotICAgICAgICBwQWFjTWV0YURhdGEtPm1wZWdEcmMuZHJjX3Byb2ZpbGUgICAgICAgICAgICA9IGhNZXRhZGF0YS0+ZHJjX3Byb2ZpbGU7Ci0gICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9wcm9maWxlICAgICAgID0gaE1ldGFkYXRhLT5jb21wX3Byb2ZpbGU7Ci0gICAgICAgIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5kcmNfVGFyZ2V0UmVmTGV2ZWwgICAgID0gaE1ldGFkYXRhLT5kcmNfVGFyZ2V0UmVmTGV2ZWw7Ci0gICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9UYXJnZXRSZWZMZXZlbD0gaE1ldGFkYXRhLT5jb21wX1RhcmdldFJlZkxldmVsOwotICAgICAgICBwQWFjTWV0YURhdGEtPm1wZWdEcmMucHJvZ19yZWZfbGV2ZWxfcHJlc2VudCA9IGhNZXRhZGF0YS0+cHJvZ19yZWZfbGV2ZWxfcHJlc2VudDsKLSAgICAgICAgcEFhY01ldGFEYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsICAgICAgICAgPSBkaWFsbm9ybTJwcm9ncmVmbHZsKGhNZXRhZGF0YS0+cHJvZ19yZWZfbGV2ZWwpOworICAgIGlmIChoTWV0YWRhdGEgIT0gTlVMTCkgeworICAgICAgLyogY29udmVydCBkYXRhICovCisgICAgICBwQWFjTWV0YURhdGEtPm1wZWdEcmMuZHJjX3Byb2ZpbGUgPSBoTWV0YWRhdGEtPmRyY19wcm9maWxlOworICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5jb21wX3Byb2ZpbGUgPSBoTWV0YWRhdGEtPmNvbXBfcHJvZmlsZTsKKyAgICAgIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5kcmNfVGFyZ2V0UmVmTGV2ZWwgPSBoTWV0YWRhdGEtPmRyY19UYXJnZXRSZWZMZXZlbDsKKyAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9UYXJnZXRSZWZMZXZlbCA9CisgICAgICAgICAgaE1ldGFkYXRhLT5jb21wX1RhcmdldFJlZkxldmVsOworICAgICAgcEFhY01ldGFEYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsX3ByZXNlbnQgPQorICAgICAgICAgIGhNZXRhZGF0YS0+cHJvZ19yZWZfbGV2ZWxfcHJlc2VudDsKKyAgICAgIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5wcm9nX3JlZl9sZXZlbCA9CisgICAgICAgICAgZGlhbG5vcm0ycHJvZ3JlZmx2bChoTWV0YWRhdGEtPnByb2dfcmVmX2xldmVsKTsKIAotICAgICAgICBwQWFjTWV0YURhdGEtPmNlbnRlck1peExldmVsICAgICAgICAgICAgICAgICA9IGhNZXRhZGF0YS0+Y2VudGVyTWl4TGV2ZWw7Ci0gICAgICAgIHBBYWNNZXRhRGF0YS0+c3Vycm91bmRNaXhMZXZlbCAgICAgICAgICAgICAgID0gaE1ldGFkYXRhLT5zdXJyb3VuZE1peExldmVsOwotICAgICAgICBwQWFjTWV0YURhdGEtPldyaXRlUENFTWl4RHduSWR4ICAgICAgICAgICAgICA9IGhNZXRhZGF0YS0+UENFX21peGRvd25faWR4X3ByZXNlbnQ7Ci0gICAgICAgIHBBYWNNZXRhRGF0YS0+RG14THZsX09uICAgICAgICAgICAgICAgICAgICAgID0gaE1ldGFkYXRhLT5FVFNJX0RteEx2bF9wcmVzZW50OworICAgICAgcEFhY01ldGFEYXRhLT5jZW50ZXJNaXhMZXZlbCA9IGhNZXRhZGF0YS0+Y2VudGVyTWl4TGV2ZWw7CisgICAgICBwQWFjTWV0YURhdGEtPnN1cnJvdW5kTWl4TGV2ZWwgPSBoTWV0YWRhdGEtPnN1cnJvdW5kTWl4TGV2ZWw7CisgICAgICBwQWFjTWV0YURhdGEtPldyaXRlUENFTWl4RHduSWR4ID0gaE1ldGFkYXRhLT5QQ0VfbWl4ZG93bl9pZHhfcHJlc2VudDsKKyAgICAgIHBBYWNNZXRhRGF0YS0+RG14THZsX09uID0gaE1ldGFkYXRhLT5FVFNJX0RteEx2bF9wcmVzZW50OwogCi0gICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fb24gPSAxOworICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5jb21wcmVzc2lvbl9vbiA9CisgICAgICAgICAgKGhNZXRhZGF0YS0+Y29tcF9wcm9maWxlID09IEFBQ0VOQ19NRVRBREFUQV9EUkNfTk9UX1BSRVNFTlQgPyAwIDogMSk7CiAKKyAgICAgIGlmIChwQWFjTWV0YURhdGEtPm1wZWdEcmMuZHJjX3Byb2ZpbGUgPT0KKyAgICAgICAgICBBQUNFTkNfTUVUQURBVEFfRFJDX05PVF9QUkVTRU5UKSB7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5kcmNfcHJvZmlsZSA9CisgICAgICAgICAgICBBQUNFTkNfTUVUQURBVEFfRFJDX05PTkU7IC8qIE1QRUcgRFJDIGdhaW5zIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHdheXMgcHJlc2VudCBpbiBCUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXggKi8KKyAgICAgICAgLyogd2Ugc2hvdWxkIGdpdmUgYSB3YXJuaW5nLCBidXQgRXJyb3JIYW5kbGVyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyAqLworICAgICAgfQogCi0gICAgICAgIGlmIChuQ2hhbm5lbHMgPT0gMikgewotICAgICAgICAgIHBBYWNNZXRhRGF0YS0+ZG9sYnlTdXJyb3VuZE1vZGUgPSBoTWV0YWRhdGEtPmRvbGJ5U3Vycm91bmRNb2RlOyAgICAgLyogZG9sYnlfc3Vycm91bmRfbW9kZSAqLworICAgICAgaWYgKG5DaGFubmVscyA9PSAyKSB7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZG9sYnlTdXJyb3VuZE1vZGUgPQorICAgICAgICAgICAgaE1ldGFkYXRhLT5kb2xieVN1cnJvdW5kTW9kZTsgLyogZG9sYnlfc3Vycm91bmRfbW9kZSAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcEFhY01ldGFEYXRhLT5kb2xieVN1cnJvdW5kTW9kZSA9IDA7CisgICAgICB9CisKKyAgICAgIHBBYWNNZXRhRGF0YS0+ZHJjUHJlc2VudGF0aW9uTW9kZSA9IGhNZXRhZGF0YS0+ZHJjUHJlc2VudGF0aW9uTW9kZTsKKyAgICAgIC8qIG92ZXJyaWRlIGV4dGVybmFsIHZhbHVlcyBpZiBEVkIgRFJDIHByZXNlbnRhdGlvbiBtb2RlIGlzIGdpdmVuICovCisgICAgICBpZiAocEFhY01ldGFEYXRhLT5kcmNQcmVzZW50YXRpb25Nb2RlID09IDEpIHsKKyAgICAgICAgcEFhY01ldGFEYXRhLT5tcGVnRHJjLmRyY19UYXJnZXRSZWZMZXZlbCA9CisgICAgICAgICAgICBmTWF4KC0oMzEgPDwgMTYpLCBwQWFjTWV0YURhdGEtPm1wZWdEcmMuZHJjX1RhcmdldFJlZkxldmVsKTsKKyAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5jb21wX1RhcmdldFJlZkxldmVsID0gZk1heCgKKyAgICAgICAgICAgIC0oMjAgPDwgMTYpLAorICAgICAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5jb21wX1RhcmdldFJlZkxldmVsKTsgLyogaW1wbGllcyAtMjNkQiAqLworICAgICAgfQorICAgICAgaWYgKHBBYWNNZXRhRGF0YS0+ZHJjUHJlc2VudGF0aW9uTW9kZSA9PSAyKSB7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5kcmNfVGFyZ2V0UmVmTGV2ZWwgPQorICAgICAgICAgICAgZk1heCgtKDIzIDw8IDE2KSwgcEFhY01ldGFEYXRhLT5tcGVnRHJjLmRyY19UYXJnZXRSZWZMZXZlbCk7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9UYXJnZXRSZWZMZXZlbCA9CisgICAgICAgICAgICBmTWF4KC0oMjMgPDwgMTYpLCBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmNvbXBfVGFyZ2V0UmVmTGV2ZWwpOworICAgICAgfQorICAgICAgaWYgKHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9wcm9maWxlID09CisgICAgICAgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT1RfUFJFU0VOVCkgeworICAgICAgICAvKiBEVkIgZGVmaW5lcyB0byByZXZlcnQgdG8gTGlnaHQgRFJDIGlmIGhlYXZ5IGlzIG5vdCBwcmVzZW50ICovCisgICAgICAgIGlmIChwQWFjTWV0YURhdGEtPmRyY1ByZXNlbnRhdGlvbk1vZGUgIT0gMCkgeworICAgICAgICAgIC8qIHdlIGV4Y2x1ZGUgdGhlICJub3QgaW5kaWNhdGVkIiBtb2RlIGFzIHRoaXMgcmVxdWlyZXMgdGhlIHVzZXIgdG8KKyAgICAgICAgICAgKiBkZWZpbmUgZGVzaXJlZCBsZXZlbHMgYW55d2F5ICovCisgICAgICAgICAgcEFhY01ldGFEYXRhLT5tcGVnRHJjLmRyY19UYXJnZXRSZWZMZXZlbCA9CisgICAgICAgICAgICAgIGZNYXgocEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5jb21wX1RhcmdldFJlZkxldmVsLAorICAgICAgICAgICAgICAgICAgIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5kcmNfVGFyZ2V0UmVmTGV2ZWwpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEudGltZWNvZGVfY29hcnNlX3N0YXR1cyA9CisgICAgICAgICAgMDsgLyogbm90IHlldCBzdXBwb3J0ZWQgLSBhdHRlbnRpb246IFVwZGF0ZQorICAgICAgICAgICAgICAgIEdldEVzdE1ldGFkYXRhQnl0ZXNQZXJGcmFtZSgpIGlmIGVuYWJsZSB0aGlzISAqLworICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9maW5lX3N0YXR1cyA9CisgICAgICAgICAgMDsgLyogbm90IHlldCBzdXBwb3J0ZWQgLSBhdHRlbnRpb246IFVwZGF0ZQorICAgICAgICAgICAgICAgIEdldEVzdE1ldGFkYXRhQnl0ZXNQZXJGcmFtZSgpIGlmIGVuYWJsZSB0aGlzISAqLworCisgICAgICAvKiBleHRlbmRlZCBhbmNpbGxhcnkgZGF0YSAqLworICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhU3RhdHVzID0KKyAgICAgICAgICAoKGhNZXRhZGF0YS0+RXh0TWV0YURhdGEuZXh0QW5jRGF0YUVuYWJsZSA9PSAxKSA/IDEgOiAwKTsKKworICAgICAgaWYgKHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YVN0YXR1cykgeworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2Rvd25taXhfbHZsX3N0YXR1cyA9CisgICAgICAgICAgICAoaE1ldGFkYXRhLT5FeHRNZXRhRGF0YS5leHREb3dubWl4TGV2ZWxFbmFibGUgPyAxIDogMCk7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG93bm1peF9nYWluX3N0YXR1cyA9CisgICAgICAgICAgICAoaE1ldGFkYXRhLT5FeHRNZXRhRGF0YS5kbXhHYWluRW5hYmxlID8gMSA6IDApOworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2xmZV9kb3dubWl4X3N0YXR1cyA9CisgICAgICAgICAgICAoaE1ldGFkYXRhLT5FeHRNZXRhRGF0YS5sZmVEbXhFbmFibGUgPyAxIDogMCk7CisKKyAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kbWl4X2FfaWR4ID0KKyAgICAgICAgICAgIGhNZXRhZGF0YS0+RXh0TWV0YURhdGEuZXh0RG93bm1peExldmVsX0E7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9iX2lkeCA9CisgICAgICAgICAgICBoTWV0YWRhdGEtPkV4dE1ldGFEYXRhLmV4dERvd25taXhMZXZlbF9COworCisgICAgICAgIGlmIChwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2Rvd25taXhfZ2Fpbl9zdGF0dXMpIHsKKyAgICAgICAgICBlbmNvZGVEeW5ybmcoaE1ldGFkYXRhLT5FeHRNZXRhRGF0YS5kbXhHYWluNSwKKyAgICAgICAgICAgICAgICAgICAgICAgJihwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fNV9pZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAmKHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl81X3NnbikpOworICAgICAgICAgIGVuY29kZUR5bnJuZyhoTWV0YWRhdGEtPkV4dE1ldGFEYXRhLmRteEdhaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAmKHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl8yX2lkeCksCisgICAgICAgICAgICAgICAgICAgICAgICYocEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzJfc2duKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcEFhY01ldGFEYXRhLT5kb2xieVN1cnJvdW5kTW9kZSA9IDA7CisgICAgICAgICAgZW5jb2RlRHlucm5nKDEgPDwgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICYocEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzVfaWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgJihwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fNV9zZ24pKTsKKyAgICAgICAgICBlbmNvZGVEeW5ybmcoMSA8PCAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgJihwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fMl9pZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAmKHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl8yX3NnbikpOwogICAgICAgICB9CiAKLSAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9jb2Fyc2Vfc3RhdHVzID0gMDsgLyogbm90IHlldCBzdXBwb3J0ZWQgLSBhdHRlbnRpb246IFVwZGF0ZSBHZXRFc3RNZXRhZGF0YUJ5dGVzUGVyRnJhbWUoKSBpZiBlbmFibGUgdGhpcyEgKi8KLSAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9maW5lX3N0YXR1cyAgID0gMDsgLyogbm90IHlldCBzdXBwb3J0ZWQgLSBhdHRlbnRpb246IFVwZGF0ZSBHZXRFc3RNZXRhZGF0YUJ5dGVzUGVyRnJhbWUoKSBpZiBlbmFibGUgdGhpcyEgKi8KKyAgICAgICAgaWYgKHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfbGZlX2Rvd25taXhfc3RhdHVzKSB7CisgICAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kbWl4X2xmZV9pZHggPQorICAgICAgICAgICAgICBoTWV0YWRhdGEtPkV4dE1ldGFEYXRhLmxmZURteExldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9sZmVfaWR4ID0KKyAgICAgICAgICAgICAgMTU7IC8qIC1pbmYgZEIgKi8KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kb3dubWl4X2x2bF9zdGF0dXMgPSAwOworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2Rvd25taXhfZ2Fpbl9zdGF0dXMgPSAwOworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2xmZV9kb3dubWl4X3N0YXR1cyA9IDA7CiAKLSAgICAgICAgcEFhY01ldGFEYXRhLT5tZXRhZGF0YU1vZGUgPSBtZXRhZGF0YU1vZGU7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9hX2lkeCA9IDc7IC8qIC1pbmYgZEIgKi8KKyAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kbWl4X2JfaWR4ID0gNzsgLyogLWluZiBkQiAqLworCisgICAgICAgIGVuY29kZUR5bnJuZygxIDw8IDE2LAorICAgICAgICAgICAgICAgICAgICAgJihwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fNV9pZHgpLAorICAgICAgICAgICAgICAgICAgICAgJihwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fNV9zZ24pKTsKKyAgICAgICAgZW5jb2RlRHlucm5nKDEgPDwgMTYsCisgICAgICAgICAgICAgICAgICAgICAmKHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl8yX2lkeCksCisgICAgICAgICAgICAgICAgICAgICAmKHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl8yX3NnbikpOworCisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9sZmVfaWR4ID0KKyAgICAgICAgICAgIDE1OyAvKiAtaW5mIGRCICovCiAgICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgcEFhY01ldGFEYXRhLT5tZXRhZGF0YU1vZGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVyZSBpcyBubyBjb25maWd1cmF0aW9uIGF2YWlsYWJsZSAqLwotICAgICAgfQorCisgICAgICBwQWFjTWV0YURhdGEtPm1ldGFkYXRhTW9kZSA9IG1ldGFkYXRhTW9kZTsKKyAgICB9IGVsc2UgeworICAgICAgcEFhY01ldGFEYXRhLT5tZXRhZGF0YU1vZGUgPSAwOyAvKiB0aGVyZSBpcyBubyBjb25maWd1cmF0aW9uIGF2YWlsYWJsZSAqLwogICAgIH0KKyAgfQogCi0gICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIGVycjsKIH0KIAotSU5UIEZES19NZXRhZGF0YUVuY19HZXREZWxheSgKLSAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhZGF0YUVuYwotICAgICAgICApCi17Ci0gICAgSU5UIGRlbGF5ID0gMDsKK0lOVCBGREtfTWV0YWRhdGFFbmNfR2V0RGVsYXkoSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhZGF0YUVuYykgeworICBJTlQgZGVsYXkgPSAwOwogCi0gICAgaWYgKGhNZXRhZGF0YUVuYyE9TlVMTCkgewotICAgICAgICBkZWxheSA9IGhNZXRhZGF0YUVuYy0+bkF1ZGlvRGF0YURlbGF5OwotICAgIH0KKyAgaWYgKGhNZXRhZGF0YUVuYyAhPSBOVUxMKSB7CisgICAgZGVsYXkgPSBoTWV0YWRhdGFFbmMtPm5BdWRpb0RhdGFEZWxheTsKKyAgfQogCi0gICAgcmV0dXJuIGRlbGF5OworICByZXR1cm4gZGVsYXk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9tYWluLmggYi9saWJBQUNlbmMvc3JjL21ldGFkYXRhX21haW4uaAppbmRleCBiZmM4YWUxLi5kODcyYzc3IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL21ldGFkYXRhX21haW4uaAorKysgYi9saWJBQUNlbmMvc3JjL21ldGFkYXRhX21haW4uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzNCArOTAsMzYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIEFBQyBFbmNvZGVyIGxpYiAgKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6IFYuIEJhY2lnYWx1cG8KKyAgIEF1dGhvcihzKTogICBWLiBCYWNpZ2FsdXBvCisKICAgIERlc2NyaXB0aW9uOiBNZXRhZGF0YSBFbmNvZGVyIGxpYnJhcnkgaW50ZXJmYWNlIGZ1bmN0aW9ucwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9NRVRBREFUQV9NQUlOX0gKLSNkZWZpbmUgX01FVEFEQVRBX01BSU5fSAotCisjaWZuZGVmIE1FVEFEQVRBX01BSU5fSAorI2RlZmluZSBNRVRBREFUQV9NQUlOX0gKIAogLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgImFhY2VuY19saWIuaCIKICNpbmNsdWRlICJhYWNlbmMuaCIKIAotCiAvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBlbnVtIHsKLSAgICBNRVRBREFUQV9PSyAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAsICAgLyohPCBObyBlcnJvciBoYXBwZW5lZC4gQWxsIGZpbmUuICovCi0gICAgTUVUQURBVEFfSU5WQUxJRF9IQU5ETEUgICAgICAgID0gMHgwMDIwLCAgIC8qITwgSGFuZGxlIHBhc3NlZCB0byBmdW5jdGlvbiBjYWxsIHdhcyBpbnZhbGlkLiAqLwotICAgIE1FVEFEQVRBX01FTU9SWV9FUlJPUiAgICAgICAgICA9IDB4MDAyMSwgICAvKiE8IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KLSAgICBNRVRBREFUQV9JTklUX0VSUk9SICAgICAgICAgICAgPSAweDAwNDAsICAgLyohPCBHZW5lcmFsIGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwotICAgIE1FVEFEQVRBX0VOQ09ERV9FUlJPUiAgICAgICAgICA9IDB4MDA2MCAgICAvKiE8IFRoZSBlbmNvZGluZyBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBieSBhbiB1bmV4cGVjdGVkIGVycm9yLiAqLworICBNRVRBREFUQV9PSyA9IDB4MDAwMCwgLyohPCBObyBlcnJvciBoYXBwZW5lZC4gQWxsIGZpbmUuICovCisgIE1FVEFEQVRBX0lOVkFMSURfSEFORExFID0KKyAgICAgIDB4MDAyMCwgLyohPCBIYW5kbGUgcGFzc2VkIHRvIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQuICovCisgIE1FVEFEQVRBX01FTU9SWV9FUlJPUiA9IDB4MDAyMSwgLyohPCBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCisgIE1FVEFEQVRBX0lOSVRfRVJST1IgPSAweDAwNDAsICAgLyohPCBHZW5lcmFsIGluaXRpYWxpemF0aW9uIGVycm9yLiAqLworICBNRVRBREFUQV9FTkNPREVfRVJST1IgPQorICAgICAgMHgwMDYwIC8qITwgVGhlIGVuY29kaW5nIHByb2Nlc3Mgd2FzIGludGVycnVwdGVkIGJ5IGFuIHVuZXhwZWN0ZWQgZXJyb3IuCisgICAgICAgICAgICAgICovCiAKIH0gRkRLX01FVEFEQVRBX0VSUk9SOwogCkBAIC0xMTUsMzIgKzEyOCwzMyBAQAogICovCiB0eXBlZGVmIHN0cnVjdCBGREtfTUVUQURBVEFfRU5DT0RFUiAqSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSOwogCi0KIC8qKgogICogXGJyaWVmICBPcGVuIGEgTWV0YSBEYXRhIGluc3RhbmNlLgogICoKLSAqIFxwYXJhbSBwaE1ldGFkYXRhRW5jICAgICAgICAgQSBwb2ludGVyIHRvIGEgTWV0YSBEYXRhIGhhbmRsZSB0byBiZSBhbGxvY2F0ZWQuIEluaXRpYWxpemVkIG9uIHJldHVybi4KKyAqIFxwYXJhbSBwaE1ldGFkYXRhRW5jICAgICAgICAgQSBwb2ludGVyIHRvIGEgTWV0YSBEYXRhIGhhbmRsZSB0byBiZSBhbGxvY2F0ZWQuCisgKiBJbml0aWFsaXplZCBvbiByZXR1cm4uCisgKiBccGFyYW0gbWF4Q2hhbm5lbHMgICAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBhdWRpbyBjaGFubmVscy4KICAqCiAgKiBccmV0dXJuCiAgKiAgICAgICAgICAtIE1FVEFEQVRBX09LLCBvbiBzdWNjZXMuCiAgKiAgICAgICAgICAtIE1FVEFEQVRBX0lOVkFMSURfSEFORExFLCBNRVRBREFUQV9NRU1PUllfRVJST1IsIG9uIGZhaWx1cmUuCiAgKi8KIEZES19NRVRBREFUQV9FUlJPUiBGREtfTWV0YWRhdGFFbmNfT3BlbigKLSAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSICAgICAqcGhNZXRhZGF0YUVuYwotICAgICAgICApOwotCisgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSICpwaE1ldGFkYXRhRW5jLCBjb25zdCBVSU5UIG1heENoYW5uZWxzKTsKIAogLyoqCiAgKiBcYnJpZWYgIEluaXRpYWxpemUgYSBNZXRhIERhdGEgaW5zdGFuY2UuCiAgKgogICogXHBhcmFtIGhNZXRhZGF0YUVuYyAgICAgICAgICBNZXRhIERhdGEgaGFuZGxlLgogICogXHBhcmFtIHJlc2V0U3RhdGVzICAgICAgICAgICBJbmRpY2F0aW9uIGZvciBmdWxsIHJlc2V0IG9mIGFsbCBzdGF0ZXMuCi0gKiBccGFyYW0gbWV0YWRhdGFNb2RlICAgICAgICAgIENvbmZpZ3VyZXMgbWV0YXQgZGF0YSBvdXRwdXQgZm9ybWF0ICgwLDEsMikuCisgKiBccGFyYW0gbWV0YWRhdGFNb2RlICAgICAgICAgIENvbmZpZ3VyZXMgbWV0YSBkYXRhIG91dHB1dCBmb3JtYXQgKDAsMSwyLDMpLgogICogXHBhcmFtIGF1ZGlvRGVsYXkgICAgICAgICAgICBEZWxheSBjYXVzZSBieSB0aGUgYXVkaW8gZW5jb2Rlci4KLSAqIFxwYXJhbSBmcmFtZUxlbmd0aCAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VzIHdpdGhpbiBvbmUgZnJhbWUuCisgKiBccGFyYW0gZnJhbWVMZW5ndGggICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlcyB3aXRoaW4gb25lCisgKiBmcmFtZS4KICAqIFxwYXJhbSBzYW1wbGVSYXRlICAgICAgICAgICAgU2FtcGxpbmcgcmF0IGluIEh6IG9mIGF1ZGlvIGlucHV0IHNpZ25hbC4KICAqIFxwYXJhbSBuQ2hhbm5lbHMgICAgICAgICAgICAgTnVtYmVyIG9mIGF1ZGlvIGlucHV0IGNoYW5uZWxzLgotICogXHBhcmFtIGNoYW5uZWxNb2RlICAgICAgICAgICBDaGFubmVsIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgdXNlZCBieSB0aGUgZW5jb2Rlci4KKyAqIFxwYXJhbSBjaGFubmVsTW9kZSAgICAgICAgICAgQ2hhbm5lbCBjb25maWd1cmF0aW9uIHdoaWNoIGlzIHVzZWQgYnkgdGhlCisgKiBlbmNvZGVyLgogICogXHBhcmFtIGNoYW5uZWxPcmRlciAgICAgICAgICBDaGFubmVsIG9yZGVyIG9mIHRoZSBpbnB1dCBkYXRhLiAoV0FWLCBNUEVHKQogICoKICAqIFxyZXR1cm4KQEAgLTE0OCwxNyArMTYyLDEwIEBACiAgKiAgICAgICAgICAtIE1FVEFEQVRBX0lOVkFMSURfSEFORExFLCBNRVRBREFUQV9JTklUX0VSUk9SLCBvbiBmYWlsdXJlLgogICovCiBGREtfTUVUQURBVEFfRVJST1IgRkRLX01ldGFkYXRhRW5jX0luaXQoCi0gICAgICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiAgICAgIGhNZXRhZGF0YUVuYywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRTdGF0ZXMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhTW9kZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EZWxheSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGgsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFICAgICAgICAgICAgICAgY2hhbm5lbE1vZGUsCi0gICAgICAgIGNvbnN0IENIQU5ORUxfT1JERVIgICAgICAgICAgICAgIGNoYW5uZWxPcmRlcgotICAgICAgICApOwotCisgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhZGF0YUVuYywgY29uc3QgSU5UIHJlc2V0U3RhdGVzLAorICAgIGNvbnN0IElOVCBtZXRhZGF0YU1vZGUsIGNvbnN0IElOVCBhdWRpb0RlbGF5LCBjb25zdCBVSU5UIGZyYW1lTGVuZ3RoLAorICAgIGNvbnN0IFVJTlQgc2FtcGxlUmF0ZSwgY29uc3QgVUlOVCBuQ2hhbm5lbHMsIGNvbnN0IENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSwKKyAgICBjb25zdCBDSEFOTkVMX09SREVSIGNoYW5uZWxPcmRlcik7CiAKIC8qKgogICogXGJyaWVmICBDYWxjdWxhdGUgTWV0YSBEYXRhIHByb2Nlc3NpbmcuCkBAIC0xNzAsNDMgKzE3Nyw0MiBAQAogICogLSBBcHBseSBhdWRpbyBkYXRhIGFuZCBtZXRhIGRhdGEgZGVsYXkgY29tcGVuc2F0aW9uLgogICoKICAqIFxwYXJhbSBoTWV0YWRhdGFFbmMgICAgICAgICAgTWV0YSBEYXRhIGhhbmRsZS4KLSAqIFxwYXJhbSBwQXVkaW9TYW1wbGVzICAgICAgICAgUG9pbnRlciB0byBhdWRpbyBpbnB1dCBkYXRhLiBFeGlzdGluZyBmdW5jdGlvbiBvdmVyd3JpdGVzIGF1ZGlvIGRhdGEgd2l0aCBkZWxheWVkIGF1ZGlvIHNhbXBsZXMuCisgKiBccGFyYW0gcEF1ZGlvU2FtcGxlcyAgICAgICAgIFBvaW50ZXIgdG8gYXVkaW8gaW5wdXQgZGF0YS4gRXhpc3RpbmcgZnVuY3Rpb24KKyAqIG92ZXJ3cml0ZXMgYXVkaW8gZGF0YSB3aXRoIGRlbGF5ZWQgYXVkaW8gc2FtcGxlcy4KICAqIFxwYXJhbSBuQXVkaW9TYW1wbGVzICAgICAgICAgTnVtYmVyIG9mIGlucHV0IGF1ZGlvIHNhbXBsZXMgdG8gYmUgcHJjZXNzZWQuCiAgKiBccGFyYW0gcE1ldGFkYXRhICAgICAgICAgICAgIFBvaW50ZXIgdG8gTWV0YXQgRGF0YSBpbnB1dC4KLSAqIFxwYXJhbSBwcE1ldGFEYXRhRXh0UGF5bG9hZCAgUG9pbnRlciB0byBleHRlbnNpb24gcGF5bG9hZCBhcnJheS4gRmlsbGVkIG9uIHJldHVybi4KLSAqIFxwYXJhbSBuTWV0YURhdGFFeHRlbnNpb25zICAgUG9pbnRlciB0byB2YXJpYWJsZSB0byBkZXNjcmliZSBudW1iZXIgb2YgYXZhaWxhYmxlIGV4dGVuc2lvbiBwYXlsb2Fkcy4gRmlsbGVkIG9uIHJldHVybi4KLSAqIFxwYXJhbSBtYXRyaXhfbWl4ZG93bl9pZHggICAgUG9pbnRlciB0byB2YXJpYWJsZSBmb3IgbWF0cml4IG1peGRvd24gY29lZmZpY2llbnQuIEZpbGxlZCBvbiByZXR1cm4uCisgKiBccGFyYW0gcHBNZXRhRGF0YUV4dFBheWxvYWQgIFBvaW50ZXIgdG8gZXh0ZW5zaW9uIHBheWxvYWQgYXJyYXkuIEZpbGxlZCBvbgorICogcmV0dXJuLgorICogXHBhcmFtIG5NZXRhRGF0YUV4dGVuc2lvbnMgICBQb2ludGVyIHRvIHZhcmlhYmxlIHRvIGRlc2NyaWJlIG51bWJlciBvZgorICogYXZhaWxhYmxlIGV4dGVuc2lvbiBwYXlsb2Fkcy4gRmlsbGVkIG9uIHJldHVybi4KKyAqIFxwYXJhbSBtYXRyaXhfbWl4ZG93bl9pZHggICAgUG9pbnRlciB0byB2YXJpYWJsZSBmb3IgbWF0cml4IG1peGRvd24KKyAqIGNvZWZmaWNpZW50LiBGaWxsZWQgb24gcmV0dXJuLgogICoKICAqIFxyZXR1cm4KICAqICAgICAgICAgIC0gTUVUQURBVEFfT0ssIG9uIHN1Y2Nlcy4KICAqICAgICAgICAgIC0gTUVUQURBVEFfSU5WQUxJRF9IQU5ETEUsIE1FVEFEQVRBX0VOQ09ERV9FUlJPUiwgb24gZmFpbHVyZS4KICAqLwogRkRLX01FVEFEQVRBX0VSUk9SIEZES19NZXRhZGF0YUVuY19Qcm9jZXNzKAotICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgICAgICBoTWV0YWRhdGFFbmMsCi0gICAgICAgIElOVF9QQ00gKiBjb25zdCAgICAgICAgICAgICAgICAgIHBBdWRpb1NhbXBsZXMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgIG5BdWRpb1NhbXBsZXMsCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSAqIGNvbnN0ICAgIHBNZXRhZGF0YSwKLSAgICAgICAgQUFDRU5DX0VYVF9QQVlMT0FEICoqICAgICAgICAgICAgcHBNZXRhRGF0YUV4dFBheWxvYWQsCi0gICAgICAgIFVJTlQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5NZXRhRGF0YUV4dGVuc2lvbnMsCi0gICAgICAgIElOVCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeF9taXhkb3duX2lkeAotICAgICAgICApOwotCisgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhZGF0YUVuYywgSU5UX1BDTSAqY29uc3QgcEF1ZGlvU2FtcGxlcywKKyAgICBjb25zdCBVSU5UIGF1ZGlvU2FtcGxlc0J1ZlNpemUsIGNvbnN0IElOVCBuQXVkaW9TYW1wbGVzLAorICAgIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSAqY29uc3QgcE1ldGFkYXRhLAorICAgIEFBQ0VOQ19FWFRfUEFZTE9BRCAqKnBwTWV0YURhdGFFeHRQYXlsb2FkLCBVSU5UICpuTWV0YURhdGFFeHRlbnNpb25zLAorICAgIElOVCAqbWF0cml4X21peGRvd25faWR4KTsKIAogLyoqCiAgKiBcYnJpZWYgIENsb3NlIHRoZSBNZXRhIERhdGEgaW5zdGFuY2UuCiAgKgogICogRGVhbGxvY2F0ZSBpbnN0YW5jZSBhbmQgZnJlZSB3aG9sZSBtZW1vcnkuCiAgKgotICogXHBhcmFtIHBoTWV0YURhdGEgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBNZXRhIERhdGEgaGFuZGxlIHRvIGJlIGRlYWxsb2NhdGVkLgorICogXHBhcmFtIHBoTWV0YURhdGEgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBNZXRhIERhdGEgaGFuZGxlIHRvIGJlCisgKiBkZWFsbG9jYXRlZC4KICAqCiAgKiBccmV0dXJuCiAgKiAgICAgICAgICAtIE1FVEFEQVRBX09LLCBvbiBzdWNjZXMuCiAgKiAgICAgICAgICAtIE1FVEFEQVRBX0lOVkFMSURfSEFORExFLCBvbiBmYWlsdXJlLgogICovCiBGREtfTUVUQURBVEFfRVJST1IgRkRLX01ldGFkYXRhRW5jX0Nsb3NlKAotICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgICAgICpwaE1ldGFEYXRhCi0gICAgICAgICk7Ci0KKyAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgKnBoTWV0YURhdGEpOwogCiAvKioKICAqIFxicmllZiAgR2V0IE1ldGEgRGF0YSBFbmNvZGVyIGRlbGF5LgpAQCAtMjE1LDEwICsyMjEsNiBAQAogICoKICAqIFxyZXR1cm4gIERlbGF5IGNhdXNlZCBieSBNZXRhIERhdGEgbW9kdWxlLgogICovCi1JTlQgRkRLX01ldGFkYXRhRW5jX0dldERlbGF5KAotICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgICAgICBoTWV0YWRhdGFFbmMKLSAgICAgICAgKTsKK0lOVCBGREtfTWV0YWRhdGFFbmNfR2V0RGVsYXkoSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhZGF0YUVuYyk7CiAKLQotI2VuZGlmIC8qIF9NRVRBREFUQV9NQUlOX0ggKi8KLQorI2VuZGlmIC8qIE1FVEFEQVRBX01BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9tcHNfbWFpbi5jcHAgYi9saWJBQUNlbmMvc3JjL21wc19tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ4MjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZW5jL3NyYy9tcHNfbWFpbi5jcHAKQEAgLTAsMCArMSw1MjkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hcmt1cyBMb2h3YXNzZXIKKworICAgRGVzY3JpcHRpb246IE1wZWcgU3Vycm91bmQgbGlicmFyeSBpbnRlcmZhY2UgZnVuY3Rpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJtcHNfbWFpbi5oIgorI2luY2x1ZGUgInNhY2VuY19saWIuaCIKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IE1QU19FTkNPREVSIHsKKyAgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaFNhY0VuY29kZXI7CisKKyAgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlOworCisgIEZES19idWZEZXNjciBpbkJ1ZkRlc2M7CisgIEZES19idWZEZXNjciBvdXRCdWZEZXNjOworICBTQUNFTkNfSW5BcmdzIGluYXJnczsKKyAgU0FDRU5DX091dEFyZ3Mgb3V0YXJnczsKKworICB2b2lkICpwSW5CdWZmZXJbMV07CisgIFVJTlQgcEluQnVmZmVyU2l6ZVsxXTsKKyAgVUlOVCBwSW5CdWZmZXJFbFNpemVbMV07CisgIFVJTlQgcEluQnVmZmVyVHlwZVsxXTsKKworICB2b2lkICpwT3V0QnVmZmVyWzJdOworICBVSU5UIHBPdXRCdWZmZXJTaXplWzJdOworICBVSU5UIHBPdXRCdWZmZXJFbFNpemVbMl07CisgIFVJTlQgcE91dEJ1ZmZlclR5cGVbMl07CisKKyAgVUNIQVIgc2FjT3V0QnVmZmVyWzEwMjRdOyAvKiBXb3JzdCBjYXNlIG1lbW9yeSBjb25zdW1wdGlvbiBmb3IgRUxEdjI6IDc2OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0+IDYxNDQgYml0cyAoQ29yZSArIFNCUiArIE1QUykgKi8KK307CisKK3N0cnVjdCBNUFNfQ09ORklHX1RBQiB7CisgIEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvX29iamVjdF90eXBlOworICBDSEFOTkVMX01PREUgY2hhbm5lbF9tb2RlOworICBVTE9ORyBzYnJfcmF0aW87CisgIFVMT05HIHNhbXBsaW5nX3JhdGU7CisgIFVMT05HIGJpdHJhdGVfbWluOworICBVTE9ORyBiaXRyYXRlX21heDsKK307CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBjb25zdCBNUFNfQ09ORklHX1RBQiBtcHNDb25maWdUYWJbXSA9IHsKKyAgICB7QU9UX0VSX0FBQ19FTEQsIE1PREVfMjEyLCAwLCAxNjAwMCwgMTYwMDAsIDM5OTk5fSwKKyAgICB7QU9UX0VSX0FBQ19FTEQsIE1PREVfMjEyLCAwLCAyMjA1MCwgMTYwMDAsIDQ5OTk5fSwKKyAgICB7QU9UX0VSX0FBQ19FTEQsIE1PREVfMjEyLCAwLCAyNDAwMCwgMTYwMDAsIDYxOTk5fSwKKyAgICB7QU9UX0VSX0FBQ19FTEQsIE1PREVfMjEyLCAwLCAzMjAwMCwgMjAwMDAsIDg0OTk5fSwKKyAgICB7QU9UX0VSX0FBQ19FTEQsIE1PREVfMjEyLCAwLCA0NDEwMCwgNTAwMDAsIDE5MjAwMH0sCisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMCwgNDgwMDAsIDYyMDAwLCAxOTIwMDB9LAorCisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMSwgMTYwMDAsIDE4MDAwLCAzMTk5OX0sCisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMSwgMjIwNTAsIDE4MDAwLCAzMTk5OX0sCisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMSwgMjQwMDAsIDIwMDAwLCA2NDAwMH0sCisKKyAgICB7QU9UX0VSX0FBQ19FTEQsIE1PREVfMjEyLCAyLCAzMjAwMCwgMTgwMDAsIDY0MDAwfSwKKyAgICB7QU9UX0VSX0FBQ19FTEQsIE1PREVfMjEyLCAyLCA0NDEwMCwgMjEwMDAsIDY0MDAwfSwKKyAgICB7QU9UX0VSX0FBQ19FTEQsIE1PREVfMjEyLCAyLCA0ODAwMCwgMjYwMDAsIDY0MDAwfQorCit9OworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQgRkRLX01wZWdzRW5jX1dyaXRlRnJhbWVIZWFkZXIoSEFORExFX01QU19FTkNPREVSIGhNcHNFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpjb25zdCBwT3V0cHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3V0cHV0QnVmZmVyU2l6ZSk7CisKK01QU19FTkNPREVSX0VSUk9SIEZES19NcGVnc0VuY19PcGVuKEhBTkRMRV9NUFNfRU5DT0RFUiAqcGhNcHNFbmMpIHsKKyAgTVBTX0VOQ09ERVJfRVJST1IgZXJyb3IgPSBNUFNfRU5DT0RFUl9PSzsKKyAgSEFORExFX01QU19FTkNPREVSIGhNcHNFbmMgPSBOVUxMOworCisgIGlmIChwaE1wc0VuYyA9PSBOVUxMKSB7CisgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9JTlZBTElEX0hBTkRMRTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoTlVMTCA9PQorICAgICAgKGhNcHNFbmMgPSAoSEFORExFX01QU19FTkNPREVSKUZES2NhbGxvYygxLCBzaXplb2YoTVBTX0VOQ09ERVIpKSkpIHsKKyAgICBlcnJvciA9IE1QU19FTkNPREVSX01FTU9SWV9FUlJPUjsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgRkRLbWVtY2xlYXIoaE1wc0VuYywgc2l6ZW9mKE1QU19FTkNPREVSKSk7CisKKyAgaWYgKFNBQ0VOQ19PSyAhPSBGREtfc2FjZW5jX29wZW4oJmhNcHNFbmMtPmhTYWNFbmNvZGVyKSkgeworICAgIGVycm9yID0gTVBTX0VOQ09ERVJfTUVNT1JZX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIFJldHVybiBtcHMgZW5jb2RlciBpbnN0YW5jZSAqLworICAqcGhNcHNFbmMgPSBoTXBzRW5jOworCitiYWlsOgorICBpZiAoZXJyb3IgIT0gTVBTX0VOQ09ERVJfT0spIHsKKyAgICBGREtfTXBlZ3NFbmNfQ2xvc2UoJmhNcHNFbmMpOworICB9CisgIHJldHVybiBlcnJvcjsKK30KKworTVBTX0VOQ09ERVJfRVJST1IgRkRLX01wZWdzRW5jX0Nsb3NlKEhBTkRMRV9NUFNfRU5DT0RFUiAqcGhNcHNFbmMpIHsKKyAgTVBTX0VOQ09ERVJfRVJST1IgZXJyb3IgPSBNUFNfRU5DT0RFUl9PSzsKKworICBpZiAocGhNcHNFbmMgPT0gTlVMTCkgeworICAgIGVycm9yID0gTVBTX0VOQ09ERVJfSU5WQUxJRF9IQU5ETEU7CisgICAgZ290byBiYWlsOworICB9CisKKyAgaWYgKCpwaE1wc0VuYyAhPSBOVUxMKSB7CisgICAgRkRLX3NhY2VuY19jbG9zZSgmKCpwaE1wc0VuYyktPmhTYWNFbmNvZGVyKTsKKyAgICBGREtmcmVlKCpwaE1wc0VuYyk7CisgICAgKnBoTXBzRW5jID0gTlVMTDsKKyAgfQorYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitNUFNfRU5DT0RFUl9FUlJPUiBGREtfTXBlZ3NFbmNfSW5pdChIQU5ETEVfTVBTX0VOQ09ERVIgaE1wc0VuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgc2FtcGxpbmdyYXRlLCBjb25zdCBVSU5UIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHNiclJhdGlvLCBjb25zdCBVSU5UIGZyYW1lbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBpbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBjb3JlQ29kZXJEZWxheSkgeworICBNUFNfRU5DT0RFUl9FUlJPUiBlcnJvciA9IE1QU19FTkNPREVSX09LOworICBjb25zdCBVSU5UIGZzX2xvdyA9IDI3NzEzOyAgLyogbG93IE1QUyBzYW1wbGluZyBmcmVxdWVuY2llcyAqLworICBjb25zdCBVSU5UIGZzX2hpZ2ggPSA1NTQyNjsgLyogaGlnaCBNUFMgc2FtcGxpbmcgZnJlcXVlbmNpZXMgKi8KKyAgVUlOVCBuVGltZVNsb3RzID0gMCwgblFtZkJhbmRzTGQgPSAwOworCisgIGlmIChoTXBzRW5jID09IE5VTEwpIHsKKyAgICBlcnJvciA9IE1QU19FTkNPREVSX0lOVkFMSURfSEFORExFOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIENvbWJpbmUgTVBTIHdpdGggU0JSIG9ubHkgaWYgdGhlIG51bWJlciBvZiBRTUYgYmFuZCBmaXRzIHRvZ2V0aGVyLiovCisgIHN3aXRjaCAoc2JyUmF0aW8pIHsKKyAgICBjYXNlIDE6IC8qIGRvd25zYW1wbGVkIHNiciAtIDMyIFFNRiBiYW5kcyByZXF1aXJlZCAqLworICAgICAgaWYgKCEoc2FtcGxpbmdyYXRlIDwgZnNfbG93KSkgeworICAgICAgICBlcnJvciA9IE1QU19FTkNPREVSX0lOSVRfRVJST1I7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjogLyogZHVhbHJhdGUgLSA2NCBRTUYgYmFuZHMgcmVxdWlyZWQgKi8KKyAgICAgIGlmICghKChzYW1wbGluZ3JhdGUgPj0gZnNfbG93KSAmJiAoc2FtcGxpbmdyYXRlIDwgZnNfaGlnaCkpKSB7CisgICAgICAgIGVycm9yID0gTVBTX0VOQ09ERVJfSU5JVF9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAwOgorICAgIGRlZmF1bHQ6OyAvKiB0aW1lIGludGVyZmFjZSAtIG5vIHNhbXBsaW5ncmF0ZSByZXN0cmljdGlvbiAqLworICB9CisKKyAgLyogMzIgIFFNRi1CYW5kcyAgKCBmcyA8IDI3NzEzICkKKyAgICogNjQgIFFNRi1CYW5kcyAgKCAyNzcxMyA+PSBmcyA8PSA1NTQyNiApCisgICAqIDEyOCBRTUYtQmFuZHMgICggZnMgPiA1NTQyNiApCisgICAqLworICBuUW1mQmFuZHNMZCA9CisgICAgICAoc2FtcGxpbmdyYXRlIDwgZnNfbG93KSA/IDUgOiAoKHNhbXBsaW5ncmF0ZSA+IGZzX2hpZ2gpID8gNyA6IDYpOworICBuVGltZVNsb3RzID0gZnJhbWVsZW5ndGggPj4gblFtZkJhbmRzTGQ7CisKKyAgLyogY2hlY2sgaWYgbnVtYmVyIG9mIHFtZiBiYW5kcyBpcyB1c2FibGUgZm9yIGdpdmVuIGZyYW1lbGVuZ3RoICovCisgIGlmIChmcmFtZWxlbmd0aCAhPSAoblRpbWVTbG90cyA8PCBuUW1mQmFuZHNMZCkpIHsKKyAgICBlcnJvciA9IE1QU19FTkNPREVSX0lOSVRfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogaXMgZ2l2ZW4gYml0cmF0ZSBpbnRlbmRlZCB0byBiZSBzdXBwb3J0ZWQgKi8KKyAgaWYgKChJTlQpYml0cmF0ZSAhPSBGREtfTXBlZ3NFbmNfR2V0Q2xvc2VzdEJpdFJhdGUoYXVkaW9PYmplY3RUeXBlLCBNT0RFXzIxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdyYXRlLCBzYnJSYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZSkpIHsKKyAgICBlcnJvciA9IE1QU19FTkNPREVSX0lOSVRfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogaW5pdCBTQUMgbGlicmFyeSAqLworICBzd2l0Y2ggKGF1ZGlvT2JqZWN0VHlwZSkgeworICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6IHsKKyAgICAgIGNvbnN0IFVJTlQgbm9JbnRlckZyYW1lQ29kaW5nID0gMDsKKworICAgICAgaWYgKChTQUNFTkNfT0sgIT0KKyAgICAgICAgICAgRkRLX3NhY2VuY19zZXRQYXJhbShoTXBzRW5jLT5oU2FjRW5jb2RlciwgU0FDRU5DX0xPV0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub0ludGVyRnJhbWVDb2RpbmcgPT0gMSkgPyAxIDogMikpIHx8CisgICAgICAgICAgKFNBQ0VOQ19PSyAhPSBGREtfc2FjZW5jX3NldFBhcmFtKGhNcHNFbmMtPmhTYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUNFTkNfRU5DX01PREUsIFNBQ0VOQ18yMTIpKSB8fAorICAgICAgICAgIChTQUNFTkNfT0sgIT0gRkRLX3NhY2VuY19zZXRQYXJhbShoTXBzRW5jLT5oU2FjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDRU5DX1NBTVBMRVJBVEUsIHNhbXBsaW5ncmF0ZSkpIHx8CisgICAgICAgICAgKFNBQ0VOQ19PSyAhPSBGREtfc2FjZW5jX3NldFBhcmFtKGhNcHNFbmMtPmhTYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUNFTkNfRlJBTUVfVElNRV9TTE9UUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblRpbWVTbG90cykpIHx8CisgICAgICAgICAgKFNBQ0VOQ19PSyAhPSBGREtfc2FjZW5jX3NldFBhcmFtKGhNcHNFbmMtPmhTYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUNFTkNfUEFSQU1fQkFORFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ0VOQ19CQU5EU18xNSkpIHx8CisgICAgICAgICAgKFNBQ0VOQ19PSyAhPQorICAgICAgICAgICBGREtfc2FjZW5jX3NldFBhcmFtKGhNcHNFbmMtPmhTYWNFbmNvZGVyLCBTQUNFTkNfVElNRV9ET01fRE1YLCAyKSkgfHwKKyAgICAgICAgICAoU0FDRU5DX09LICE9CisgICAgICAgICAgIEZES19zYWNlbmNfc2V0UGFyYW0oaE1wc0VuYy0+aFNhY0VuY29kZXIsIFNBQ0VOQ19DT0FSU0VfUVVBTlQsIDApKSB8fAorICAgICAgICAgIChTQUNFTkNfT0sgIT0gRkRLX3NhY2VuY19zZXRQYXJhbShoTXBzRW5jLT5oU2FjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDRU5DX1FVQU5UX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ0VOQ19RVUFOVE1PREVfRklORSkpIHx8CisgICAgICAgICAgKFNBQ0VOQ19PSyAhPSBGREtfc2FjZW5jX3NldFBhcmFtKGhNcHNFbmMtPmhTYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUNFTkNfVElNRV9BTElHTk1FTlQsIDApKSB8fAorICAgICAgICAgIChTQUNFTkNfT0sgIT0gRkRLX3NhY2VuY19zZXRQYXJhbShoTXBzRW5jLT5oU2FjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDRU5DX0lOREVQRU5ERU5DWV9GQUNUT1IsIDIwKSkpIHsKKyAgICAgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9JTklUX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yID0gTVBTX0VOQ09ERVJfSU5JVF9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmIChTQUNFTkNfT0sgIT0gRkRLX3NhY2VuY19pbml0KGhNcHNFbmMtPmhTYWNFbmNvZGVyLCBjb3JlQ29kZXJEZWxheSkpIHsKKyAgICBlcnJvciA9IE1QU19FTkNPREVSX0lOSVRfRVJST1I7CisgIH0KKworICBoTXBzRW5jLT5hdWRpb09iamVjdFR5cGUgPSBhdWRpb09iamVjdFR5cGU7CisKKyAgaE1wc0VuYy0+aW5CdWZEZXNjLnBwQmFzZSA9ICh2b2lkICoqKSZoTXBzRW5jLT5wSW5CdWZmZXI7CisgIGhNcHNFbmMtPmluQnVmRGVzYy5wQnVmU2l6ZSA9IGhNcHNFbmMtPnBJbkJ1ZmZlclNpemU7CisgIGhNcHNFbmMtPmluQnVmRGVzYy5wRWxlU2l6ZSA9IGhNcHNFbmMtPnBJbkJ1ZmZlckVsU2l6ZTsKKyAgaE1wc0VuYy0+aW5CdWZEZXNjLnBCdWZUeXBlID0gaE1wc0VuYy0+cEluQnVmZmVyVHlwZTsKKyAgaE1wc0VuYy0+aW5CdWZEZXNjLm51bUJ1ZnMgPSAxOworCisgIGhNcHNFbmMtPm91dEJ1ZkRlc2MucHBCYXNlID0gKHZvaWQgKiopJmhNcHNFbmMtPnBPdXRCdWZmZXI7CisgIGhNcHNFbmMtPm91dEJ1ZkRlc2MucEJ1ZlNpemUgPSBoTXBzRW5jLT5wT3V0QnVmZmVyU2l6ZTsKKyAgaE1wc0VuYy0+b3V0QnVmRGVzYy5wRWxlU2l6ZSA9IGhNcHNFbmMtPnBPdXRCdWZmZXJFbFNpemU7CisgIGhNcHNFbmMtPm91dEJ1ZkRlc2MucEJ1ZlR5cGUgPSBoTXBzRW5jLT5wT3V0QnVmZmVyVHlwZTsKKyAgaE1wc0VuYy0+b3V0QnVmRGVzYy5udW1CdWZzID0gMjsKKworICBoTXBzRW5jLT5wSW5CdWZmZXJbMF0gPSBOVUxMOworICBoTXBzRW5jLT5wSW5CdWZmZXJTaXplWzBdID0gMDsKKyAgaE1wc0VuYy0+cEluQnVmZmVyRWxTaXplWzBdID0gc2l6ZW9mKElOVF9QQ00pOworICBoTXBzRW5jLT5wSW5CdWZmZXJUeXBlWzBdID0gKEZES19CVUZfVFlQRV9JTlBVVCB8IEZES19CVUZfVFlQRV9QQ01fREFUQSk7CisKKyAgaE1wc0VuYy0+cE91dEJ1ZmZlclswXSA9IE5VTEw7CisgIGhNcHNFbmMtPnBPdXRCdWZmZXJTaXplWzBdID0gMDsKKyAgaE1wc0VuYy0+cE91dEJ1ZmZlckVsU2l6ZVswXSA9IHNpemVvZihJTlRfUENNKTsKKyAgaE1wc0VuYy0+cE91dEJ1ZmZlclR5cGVbMF0gPSAoRkRLX0JVRl9UWVBFX09VVFBVVCB8IEZES19CVUZfVFlQRV9QQ01fREFUQSk7CisKKyAgaE1wc0VuYy0+cE91dEJ1ZmZlclsxXSA9IE5VTEw7CisgIGhNcHNFbmMtPnBPdXRCdWZmZXJTaXplWzFdID0gMDsKKyAgaE1wc0VuYy0+cE91dEJ1ZmZlckVsU2l6ZVsxXSA9IHNpemVvZihVQ0hBUik7CisgIGhNcHNFbmMtPnBPdXRCdWZmZXJUeXBlWzFdID0gKEZES19CVUZfVFlQRV9PVVRQVVQgfCBGREtfQlVGX1RZUEVfQlNfREFUQSk7CisKKyAgaE1wc0VuYy0+aW5hcmdzLmlzSW5wdXRJbnRlcmxlYXZlZCA9IDA7CisgIGhNcHNFbmMtPmluYXJncy5pbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsID0gaW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbDsKKworYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitNUFNfRU5DT0RFUl9FUlJPUiBGREtfTXBlZ3NFbmNfUHJvY2VzcyhIQU5ETEVfTVBTX0VOQ09ERVIgaE1wc0VuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKmNvbnN0IHBBdWRpb1NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkF1ZGlvU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0VOQ19FWFRfUEFZTE9BRCAqcE1wc0V4dFBheWxvYWQpIHsKKyAgTVBTX0VOQ09ERVJfRVJST1IgZXJyb3IgPSBNUFNfRU5DT0RFUl9PSzsKKworICBpZiAoaE1wc0VuYyA9PSBOVUxMKSB7CisgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgc2FjSGVhZGVyRmxhZyA9IDE7CisgICAgaW50IHNhY091dEJ1ZmZlck9mZnNldCA9IDA7CisKKyAgICAvKiBJbiBjYXNlIG9mIGVsZCB0aGUgc3NjIGlzIGV4cGxpY2l0IGFuZCBkb2Vzbid0IG5lZWQgdG8gYmUgaW5iYW5kICovCisgICAgaWYgKGhNcHNFbmMtPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgICAgc2FjSGVhZGVyRmxhZyA9IDA7CisgICAgfQorCisgICAgLyogNCBiaXRzIG5pYmJsZSBhZnRlciBleHRlbnNpb24gdHlwZSAqLworICAgIGhNcHNFbmMtPnNhY091dEJ1ZmZlclswXSA9IChzYWNIZWFkZXJGbGFnID09IDApID8gMHgzIDogMHg3OworICAgIHNhY091dEJ1ZmZlck9mZnNldCArPSAxOworCisgICAgaWYgKHNhY0hlYWRlckZsYWcpIHsKKyAgICAgIHNhY091dEJ1ZmZlck9mZnNldCArPSBGREtfTXBlZ3NFbmNfV3JpdGVGcmFtZUhlYWRlcigKKyAgICAgICAgICBoTXBzRW5jLCAmaE1wc0VuYy0+c2FjT3V0QnVmZmVyW3NhY091dEJ1ZmZlck9mZnNldF0sCisgICAgICAgICAgc2l6ZW9mKGhNcHNFbmMtPnNhY091dEJ1ZmZlcikgLSBzYWNPdXRCdWZmZXJPZmZzZXQpOworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyLiAqLworICAgIGhNcHNFbmMtPnBJbkJ1ZmZlclswXSA9ICh2b2lkICopcEF1ZGlvU2FtcGxlczsKKyAgICBoTXBzRW5jLT5pbmFyZ3MubklucHV0U2FtcGxlcyA9IG5BdWRpb1NhbXBsZXM7CisKKyAgICBoTXBzRW5jLT5wT3V0QnVmZmVyWzBdID0gKHZvaWQgKilwQXVkaW9TYW1wbGVzOworICAgIGhNcHNFbmMtPnBPdXRCdWZmZXJTaXplWzBdID0gc2l6ZW9mKElOVF9QQ00pICogbkF1ZGlvU2FtcGxlcyAvIDI7CisKKyAgICBoTXBzRW5jLT5wT3V0QnVmZmVyWzFdID0gKHZvaWQgKikmaE1wc0VuYy0+c2FjT3V0QnVmZmVyW3NhY091dEJ1ZmZlck9mZnNldF07CisgICAgaE1wc0VuYy0+cE91dEJ1ZmZlclNpemVbMV0gPQorICAgICAgICBzaXplb2YoaE1wc0VuYy0+c2FjT3V0QnVmZmVyKSAtIHNhY091dEJ1ZmZlck9mZnNldDsKKworICAgIC8qIGVuY29kZSBTQUMgZnJhbWUgKi8KKyAgICBpZiAoU0FDRU5DX09LICE9IEZES19zYWNlbmNfZW5jb2RlKGhNcHNFbmMtPmhTYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhNcHNFbmMtPmluQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoTXBzRW5jLT5vdXRCdWZEZXNjLCAmaE1wc0VuYy0+aW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhNcHNFbmMtPm91dGFyZ3MpKSB7CisgICAgICBlcnJvciA9IE1QU19FTkNPREVSX0VOQ09ERV9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBleHBvcnQgTVBTIHBheWxvYWQgKi8KKyAgICBwTXBzRXh0UGF5bG9hZC0+cERhdGEgPSAoVUNIQVIgKiloTXBzRW5jLT5zYWNPdXRCdWZmZXI7CisgICAgcE1wc0V4dFBheWxvYWQtPmRhdGFTaXplID0KKyAgICAgICAgaE1wc0VuYy0+b3V0YXJncy5uT3V0cHV0Qml0cyArIDggKiAoc2FjT3V0QnVmZmVyT2Zmc2V0IC0gMSk7CisgICAgcE1wc0V4dFBheWxvYWQtPmRhdGFUeXBlID0gRVhUX0xEU0FDX0RBVEE7CisgICAgcE1wc0V4dFBheWxvYWQtPmFzc29jaWF0ZWRDaEVsZW1lbnQgPSAtMTsKKyAgfQorCitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CisKK0lOVCBGREtfTXBlZ3NFbmNfV3JpdGVTcGF0aWFsU3BlY2lmaWNDb25maWcoSEFORExFX01QU19FTkNPREVSIGhNcHNFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcykgeworICBJTlQgc3NjQml0cyA9IDA7CisKKyAgaWYgKE5VTEwgIT0gaE1wc0VuYykgeworICAgIE1QNFNQQUNFRU5DX0lORk8gbXA0U3BhY2VFbmNvZGVySW5mbzsKKyAgICBGREtfc2FjZW5jX2dldEluZm8oaE1wc0VuYy0+aFNhY0VuY29kZXIsICZtcDRTcGFjZUVuY29kZXJJbmZvKTsKKworICAgIGlmIChoQnMgIT0gTlVMTCkgeworICAgICAgaW50IGk7CisgICAgICBpbnQgd3JpdHRlbkJpdHMgPSAwOworICAgICAgZm9yIChpID0gMDsgaTxtcDRTcGFjZUVuY29kZXJJbmZvLnBTc2NCdWYtPm5Tc2NTaXplQml0cz4+IDM7IGkrKykgeworICAgICAgICBGREt3cml0ZUJpdHMoaEJzLCBtcDRTcGFjZUVuY29kZXJJbmZvLnBTc2NCdWYtPnBTc2NbaV0sIDgpOworICAgICAgICB3cml0dGVuQml0cyArPSA4OworICAgICAgfQorICAgICAgRkRLd3JpdGVCaXRzKGhCcywgbXA0U3BhY2VFbmNvZGVySW5mby5wU3NjQnVmLT5wU3NjW2ldLAorICAgICAgICAgICAgICAgICAgIG1wNFNwYWNlRW5jb2RlckluZm8ucFNzY0J1Zi0+blNzY1NpemVCaXRzIC0gd3JpdHRlbkJpdHMpOworICAgIH0gLyogaEJTICovCisKKyAgICBzc2NCaXRzID0gbXA0U3BhY2VFbmNvZGVySW5mby5wU3NjQnVmLT5uU3NjU2l6ZUJpdHM7CisKKyAgfSAvKiB2YWxpZCBoTXBzRW5jICovCisKKyAgcmV0dXJuIHNzY0JpdHM7Cit9CisKK3N0YXRpYyBJTlQgRkRLX01wZWdzRW5jX1dyaXRlRnJhbWVIZWFkZXIoSEFORExFX01QU19FTkNPREVSIGhNcHNFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpjb25zdCBwT3V0cHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3V0cHV0QnVmZmVyU2l6ZSkgeworICBjb25zdCBpbnQgc2FjVGltZUFsaWduRmxhZyA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKyAgaW50IG51bUJpdHMgPSAwOworCisgIGlmICgoTlVMTCAhPSBoTXBzRW5jKSAmJiAoTlVMTCAhPSBwT3V0cHV0QnVmZmVyKSkgeworICAgIFVJTlQgYWxpZ25BbmNob3IsIGNudDsKKyAgICBGREtfQklUU1RSRUFNIEJzOworICAgIEZES2luaXRCaXRTdHJlYW0oJkJzLCBwT3V0cHV0QnVmZmVyLCBvdXRwdXRCdWZmZXJTaXplLCAwLCBCU19XUklURVIpOworCisgICAgLyogQ2FsY3VsYXRlIFNTQyBsZW5ndGggaW5mb3JtYXRpb24gKi8KKyAgICBjbnQgPSAoRkRLX01wZWdzRW5jX1dyaXRlU3BhdGlhbFNwZWNpZmljQ29uZmlnKGhNcHNFbmMsIE5VTEwpICsgNykgPj4gMzsKKworICAgIC8qIFdyaXRlIFNTQyAqLworICAgIEZES3dyaXRlQml0cygmQnMsIHNhY1RpbWVBbGlnbkZsYWcsIDEpOworCisgICAgaWYgKGNudCA8IDEyNykgeworICAgICAgRkRLd3JpdGVCaXRzKCZCcywgY250LCA3KTsKKyAgICB9IGVsc2UgeworICAgICAgRkRLd3JpdGVCaXRzKCZCcywgMTI3LCA3KTsKKyAgICAgIEZES3dyaXRlQml0cygmQnMsIGNudCAtIDEyNywgMTYpOworICAgIH0KKworICAgIGFsaWduQW5jaG9yID0gRkRLZ2V0VmFsaWRCaXRzKCZCcyk7CisgICAgRkRLX01wZWdzRW5jX1dyaXRlU3BhdGlhbFNwZWNpZmljQ29uZmlnKGhNcHNFbmMsICZCcyk7CisgICAgRkRLYnl0ZUFsaWduKCZCcywgYWxpZ25BbmNob3IpOyAvKiBic0ZpbGxCaXRzICovCisKKyAgICBpZiAoc2FjVGltZUFsaWduRmxhZykgeworICAgICAgRkRLX0FTU0VSVCgxKTsgLyogdGltZSBhbGlnbm1lbnQgbm90IHN1cHBvcnRlZCAqLworICAgIH0KKworICAgIG51bUJpdHMgPSBGREtnZXRWYWxpZEJpdHMoJkJzKTsKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworICByZXR1cm4gKChudW1CaXRzICsgNykgPj4gMyk7Cit9CisKK0lOVCBGREtfTXBlZ3NFbmNfR2V0Q2xvc2VzdEJpdFJhdGUoY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgc2FtcGxpbmdyYXRlLCBjb25zdCBVSU5UIHNiclJhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGJpdHJhdGUpIHsKKyAgdW5zaWduZWQgaW50IGk7CisgIGludCB0YXJnZXRCaXRyYXRlID0gLTE7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihtcHNDb25maWdUYWIpIC8gc2l6ZW9mKE1QU19DT05GSUdfVEFCKTsgaSsrKSB7CisgICAgaWYgKChtcHNDb25maWdUYWJbaV0uYXVkaW9fb2JqZWN0X3R5cGUgPT0gYXVkaW9PYmplY3RUeXBlKSAmJgorICAgICAgICAobXBzQ29uZmlnVGFiW2ldLmNoYW5uZWxfbW9kZSA9PSBjaGFubmVsTW9kZSkgJiYKKyAgICAgICAgKG1wc0NvbmZpZ1RhYltpXS5zYnJfcmF0aW8gPT0gc2JyUmF0aW8pICYmCisgICAgICAgIChtcHNDb25maWdUYWJbaV0uc2FtcGxpbmdfcmF0ZSA9PSBzYW1wbGluZ3JhdGUpKSB7CisgICAgICB0YXJnZXRCaXRyYXRlID0gZk1pbihmTWF4KGJpdHJhdGUsIG1wc0NvbmZpZ1RhYltpXS5iaXRyYXRlX21pbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHNDb25maWdUYWJbaV0uYml0cmF0ZV9tYXgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0YXJnZXRCaXRyYXRlOworfQorCitJTlQgRkRLX01wZWdzRW5jX0dldERlbGF5KEhBTkRMRV9NUFNfRU5DT0RFUiBoTXBzRW5jKSB7CisgIElOVCBkZWxheSA9IDA7CisKKyAgaWYgKE5VTEwgIT0gaE1wc0VuYykgeworICAgIE1QNFNQQUNFRU5DX0lORk8gbXA0U3BhY2VFbmNvZGVySW5mbzsKKyAgICBGREtfc2FjZW5jX2dldEluZm8oaE1wc0VuYy0+aFNhY0VuY29kZXIsICZtcDRTcGFjZUVuY29kZXJJbmZvKTsKKyAgICBkZWxheSA9IG1wNFNwYWNlRW5jb2RlckluZm8ubkNvZGVjRGVsYXk7CisgIH0KKworICByZXR1cm4gZGVsYXk7Cit9CisKK0lOVCBGREtfTXBlZ3NFbmNfR2V0RGVjRGVsYXkoSEFORExFX01QU19FTkNPREVSIGhNcHNFbmMpIHsKKyAgSU5UIGRlbGF5ID0gMDsKKworICBpZiAoTlVMTCAhPSBoTXBzRW5jKSB7CisgICAgTVA0U1BBQ0VFTkNfSU5GTyBtcDRTcGFjZUVuY29kZXJJbmZvOworICAgIEZES19zYWNlbmNfZ2V0SW5mbyhoTXBzRW5jLT5oU2FjRW5jb2RlciwgJm1wNFNwYWNlRW5jb2RlckluZm8pOworICAgIGRlbGF5ID0gbXA0U3BhY2VFbmNvZGVySW5mby5uRGVjb2RlckRlbGF5OworICB9CisKKyAgcmV0dXJuIGRlbGF5OworfQorCitNUFNfRU5DT0RFUl9FUlJPUiBGREtfTXBlZ3NFbmNfR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykgeworICBNUFNfRU5DT0RFUl9FUlJPUiBlcnJvciA9IE1QU19FTkNPREVSX09LOworCisgIGlmIChOVUxMID09IGluZm8pIHsKKyAgICBlcnJvciA9IE1QU19FTkNPREVSX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgaWYgKFNBQ0VOQ19PSyAhPSBGREtfc2FjZW5jX2dldExpYkluZm8oaW5mbykpIHsKKyAgICBlcnJvciA9IE1QU19FTkNPREVSX0lOSVRfRVJST1I7CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL21wc19tYWluLmggYi9saWJBQUNlbmMvc3JjL21wc19tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2Njc4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2VuYy9zcmMvbXBzX21haW4uaApAQCAtMCwwICsxLDI3MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFya3VzIExvaHdhc3NlcgorCisgICBEZXNjcmlwdGlvbjogTXBlZyBTdXJyb3VuZCBsaWJyYXJ5IGludGVyZmFjZSBmdW5jdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBNUFNfTUFJTl9ICisjZGVmaW5lIE1QU19NQUlOX0gKKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImFhY2VuYy5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworICBNUFNfRU5DT0RFUl9PSyA9IDB4MDAwMCwgLyohPCBObyBlcnJvciBoYXBwZW5lZC4gQWxsIGZpbmUuICovCisgIE1QU19FTkNPREVSX0lOVkFMSURfSEFORExFID0KKyAgICAgIDB4MDAyMCwgLyohPCBIYW5kbGUgcGFzc2VkIHRvIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQuICovCisgIE1QU19FTkNPREVSX01FTU9SWV9FUlJPUiA9IDB4MDAyMSwgLyohPCBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCisgIE1QU19FTkNPREVSX0lOSVRfRVJST1IgPSAweDAwNDAsICAgLyohPCBHZW5lcmFsIGluaXRpYWxpemF0aW9uIGVycm9yLiAqLworICBNUFNfRU5DT0RFUl9FTkNPREVfRVJST1IgPQorICAgICAgMHgwMDYwIC8qITwgVGhlIGVuY29kaW5nIHByb2Nlc3Mgd2FzIGludGVycnVwdGVkIGJ5IGFuIHVuZXhwZWN0ZWQgZXJyb3IuCisgICAgICAgICAgICAgICovCisKK30gTVBTX0VOQ09ERVJfRVJST1I7CisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiAgTVBFRyBTdXJyb3VuZCBFbmNvZGVyIGludGVyZmFjZSBoYW5kbGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IE1QU19FTkNPREVSIE1QU19FTkNPREVSLCAqSEFORExFX01QU19FTkNPREVSOworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogXGJyaWVmICBPcGVuIGEgTXBlZyBTdXJyb3VuZCBFbmNvZGVyIGluc3RhbmNlLgorICoKKyAqIFxwaE1wc0VuYyAgICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIGEgTVBTIGhhbmRsZSB0byBiZSBhbGxvY2F0ZWQuCisgKiBJbml0aWFsaXplZCBvbiByZXR1cm4uCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBNUFNfRU5DT0RFUl9PSywgb24gc3VjY2VzLgorICogICAgICAgICAgLSBNUFNfRU5DT0RFUl9JTlZBTElEX0hBTkRMRSwgTVBTX0VOQ09ERVJfTUVNT1JZX0VSUk9SLCBvbiBmYWlsdXJlLgorICovCitNUFNfRU5DT0RFUl9FUlJPUiBGREtfTXBlZ3NFbmNfT3BlbihIQU5ETEVfTVBTX0VOQ09ERVIgKnBoTXBzRW5jKTsKKworLyoqCisgKiBcYnJpZWYgIENsb3NlIHRoZSBNcGVnIFN1cnJvdW5kIEVuY29kZXIgaW5zdGFuY2UuCisgKgorICogRGVhbGxvY2F0ZSBpbnN0YW5jZSBhbmQgZnJlZSB3aG9sZSBtZW1vcnkuCisgKgorICogXHBhcmFtIHBoTXBzRW5jICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBNUFMgaGFuZGxlIHRvIGJlIGRlYWxsb2NhdGVkLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gTVBTX0VOQ09ERVJfT0ssIG9uIHN1Y2Nlcy4KKyAqICAgICAgICAgIC0gTVBTX0VOQ09ERVJfSU5WQUxJRF9IQU5ETEUsIG9uIGZhaWx1cmUuCisgKi8KK01QU19FTkNPREVSX0VSUk9SIEZES19NcGVnc0VuY19DbG9zZShIQU5ETEVfTVBTX0VOQ09ERVIgKnBoTXBzRW5jKTsKKworLyoqCisgKiBcYnJpZWYgIEluaXRpYWxpemUgYSBNcGVnIFN1cnJvdW5kIEVuY29kZXIgaW5zdGFuY2UuCisgKgorICogXHBhcmFtIGhNcHNFbmMgICAgICAgICAgICAgICAgICAgTVBTIEVuY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGF1ZGlvT2JqZWN0VHlwZSAgICAgICAgICAgQXVkaW8gb2JqZWN0IHR5cGUuCisgKiBccGFyYW0gc2FtcGxpbmdyYXRlICAgICAgICAgICAgICBTYW1wbGluZyByYXRlIGluIEh6IG9mIGF1ZGlvIGlucHV0IHNpZ25hbC4KKyAqIFxwYXJhbSBiaXRyYXRlICAgICAgICAgICAgICAgICAgIEVuY2RlciB0YXJnZXQgYml0cmF0ZS4KKyAqIFxwYXJhbSBzYnJSYXRpbyAgICAgICAgICAgICAgICAgIFNCUiBzYW1wbGluZyByYXRlIHJhdGlvLgorICogXHBhcmFtIGZyYW1lbGVuZ3RoICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VzIHdpdGhpbiBvbmUKKyAqIGZyYW1lLgorICogXHBhcmFtIGlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWwgU2l6ZSBvZiBpbnB1dCBidWZmZXIgcGVyIGNoYW5uZWwuCisgKiBccGFyYW0gY29yZUNvZGVyRGVsYXkgICAgICAgICAgICBDb3JlIGNvZGVyIGRlbGF5LgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gTVBTX0VOQ09ERVJfT0ssIG9uIHN1Y2Nlcy4KKyAqICAgICAgICAgIC0gTVBTX0VOQ09ERVJfSU5WQUxJRF9IQU5ETEUsIE1QU19FTkNPREVSX0VOQ09ERV9FUlJPUiwgb24gZmFpbHVyZS4KKyAqLworTVBTX0VOQ09ERVJfRVJST1IgRkRLX01wZWdzRW5jX0luaXQoSEFORExFX01QU19FTkNPREVSIGhNcHNFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHNhbXBsaW5ncmF0ZSwgY29uc3QgVUlOVCBiaXRyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBzYnJSYXRpbywgY29uc3QgVUlOVCBmcmFtZWxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgaW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY29yZUNvZGVyRGVsYXkpOworCisvKioKKyAqIFxicmllZiAgQ2FsY3VsYXRlIE1wZWcgU3Vycm91bmQgcHJvY2Vzc2luZy4KKyAqCisgKiBUaGlzIGZ1Y3Rpb24gYXBwbGllcyB0aGUgTVBTIHByb2Nlc3NpbmcuIFRoZSBNUFMgc2lkZSBpbmZvIHdpbGwgYmUgd3JpdHRlbiB0bworICogZXh0ZW5zaW9uIHBheWxvYWQuIFRoZSBpbnB1dCBhdWRpbyBkYXRhIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNhbGN1bGF0ZWQKKyAqIGRvd25taXguCisgKgorICogXHBhcmFtIGhNcHNFbmMgICAgICAgICAgICAgICBNUFMgRW5jb2RlciBoYW5kbGUuCisgKiBccGFyYW0gcEF1ZGlvU2FtcGxlcyAgICAgICAgIFBvaW50ZXIgdG8gYXVkaW8gaW5wdXQvb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gbkF1ZGlvU2FtcGxlcyAgICAgICAgIE51bWJlciBvZiBpbnB1dCBhdWRpbyBzYW1wbGVzIHRvIGJlIHByY2Vzc2VkLgorICogXHBhcmFtIHBNcHNFeHRQYXlsb2FkICAgICAgICBQb2ludGVyIHRvIGV4dGVuc2lvbiBwYXlsb2FkIHRvIGJlIGZpbGxlZCBvbgorICogcmV0dXJuLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gTVBTX0VOQ09ERVJfT0ssIG9uIHN1Y2Nlcy4KKyAqICAgICAgICAgIC0gTVBTX0VOQ09ERVJfSU5WQUxJRF9IQU5ETEUsIE1QU19FTkNPREVSX0VOQ09ERV9FUlJPUiwgb24gZmFpbHVyZS4KKyAqLworTVBTX0VOQ09ERVJfRVJST1IgRkRLX01wZWdzRW5jX1Byb2Nlc3MoSEFORExFX01QU19FTkNPREVSIGhNcHNFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICpjb25zdCBwQXVkaW9TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5BdWRpb1NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfRVhUX1BBWUxPQUQgKnBNcHNFeHRQYXlsb2FkKTsKKworLyoqCisgKiBcYnJpZWYgIFdyaXRlIFNwYXRpYWwgU3BlY2lmaWMgQ29uZmlnLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB2aWEgY2FsbCBiYWNrIGZyb20gdGhlIHRyYW5zcG9ydCBsaWJyYXJ5IHRvIHdyaXRlCisgKiB0aGUgU3BhdGlhbCBTcGVjaWZpYyBDb25maWcgdG8gZ2l2ZW4gYml0c3RyZWFtIGJ1ZmZlci4KKyAqCisgKiBccGFyYW0gaE1wc0VuYyAgICAgICAgICAgICAgIE1QUyBFbmNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtIGJ1ZmZlciBoYW5kbGUuCisgKgorICogXHJldHVybiAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygd3JpdHRlbiBiaXRzLgorICovCitJTlQgRkRLX01wZWdzRW5jX1dyaXRlU3BhdGlhbFNwZWNpZmljQ29uZmlnKEhBTkRMRV9NUFNfRU5DT0RFUiBoTXBzRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpOworCisvKioKKyAqIFxicmllZiAgR2V0IGNsb3Nlc3QgdmFsaWQgYml0cmF0ZSBzdXBwb3J0ZWQgYnkgZ2l2ZW4gY29uZmlnLgorICoKKyAqIFxwYXJhbSBhdWRpb09iamVjdFR5cGUgICAgICAgQXVkaW8gb2JqZWN0IHR5cGUuCisgKiBccGFyYW0gY2hhbm5lbE1vZGUgICAgICAgICAgIEVuY29kZXIgY2hhbm5lbCBtb2RlLgorICogXHBhcmFtIHNhbXBsaW5ncmF0ZSAgICAgICAgICBTYW1wbGluZyByYXRlIGluIEh6IG9mIGF1ZGlvIGlucHV0IHNpZ25hbC4KKyAqIFxwYXJhbSBzYnJSYXRpbyAgICAgICAgICAgICAgU0JSIHNhbXBsaW5nIHJhdGUgcmF0aW8uCisgKiBccGFyYW0gYml0cmF0ZSAgICAgICAgICAgICAgIFRoZSBkZXNpcmVkIHRhcmdldCBiaXRyYXRlLgorICoKKyAqIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICAgQ2xvc2VzdCB2YWxpZCBiaXRyYXRlIHRvIGdpdmVuIGJpdHJhdGUuLgorICovCitJTlQgRkRLX01wZWdzRW5jX0dldENsb3Nlc3RCaXRSYXRlKGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHNhbXBsaW5ncmF0ZSwgY29uc3QgVUlOVCBzYnJSYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBiaXRyYXRlKTsKKworLyoqCisgKiBcYnJpZWYgIEdldCBjb2RlYyBkZWxheS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZGVsYXkgb2YgdGhlIHdob2xlIGVuLS9kZWNvZGVkIHNpZ25hbCwgaW5jbHVkaW5nCisgKiBjb3JlY29kZXIgZGVsYXkuCisgKgorICogXHBhcmFtIGhNcHNFbmMgICAgICAgICAgICAgICBNUFMgRW5jb2RlciBoYW5kbGUuCisgKgorICogXHJldHVybiAgICAgICAgICAgICAgICAgICAgICBDb2RlYyBkZWxheSBpbiBzYW1wbGVzLgorICovCitJTlQgRkRLX01wZWdzRW5jX0dldERlbGF5KEhBTkRMRV9NUFNfRU5DT0RFUiBoTXBzRW5jKTsKKworLyoqCisgKiBcYnJpZWYgIEdldCBNcGVnIFN1cnJvdW5kIERlY29kZXIgZGVsYXkuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGRlbGF5IG9mIHRoZSBNcGVnIFN1cnJvdW5kIGRlY29kZXIuCisgKgorICogXHBhcmFtIGhNcHNFbmMgICAgICAgICAgICAgICBNUFMgRW5jb2RlciBoYW5kbGUuCisgKgorICogXHJldHVybiAgICAgICAgICAgICAgICAgICAgICBNcGVnIFN1cnJvdW5kIERlY29kZXIgZGVsYXkgaW4gc2FtcGxlcy4KKyAqLworSU5UIEZES19NcGVnc0VuY19HZXREZWNEZWxheShIQU5ETEVfTVBTX0VOQ09ERVIgaE1wc0VuYyk7CisKKy8qKgorICogXGJyaWVmICBHZXQgaW5mb3JtYXRpb24gYWJvdXQgZW5jb2RlciBsaWJyYXJ5IGJ1aWxkLgorICoKKyAqIEZpbGwgYSBnaXZlbiBMSUJfSU5GTyBzdHJ1Y3R1cmUgd2l0aCBsaWJyYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24uCisgKgorICogXHBhcmFtIGluZm8gIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdC4KKyAqCisgKiBccmV0dXJuCisgKiAgICAgICAgICAtIE1QU19FTkNPREVSX09LLCBvbiBzdWNjZXMuCisgKiAgICAgICAgICAtIE1QU19FTkNPREVSX0lOVkFMSURfSEFORExFLCBNUFNfRU5DT0RFUl9JTklUX0VSUk9SLCBvbiBmYWlsdXJlLgorICovCitNUFNfRU5DT0RFUl9FUlJPUiBGREtfTXBlZ3NFbmNfR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbyk7CisKKyNlbmRpZiAvKiBNUFNfTUFJTl9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL21zX3N0ZXJlby5jcHAgYi9saWJBQUNlbmMvc3JjL21zX3N0ZXJlby5jcHAKaW5kZXggMzA2ZDQ5MC4uNmExMjFiMiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9tc19zdGVyZW8uY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvbXNfc3RlcmVvLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNzMgKzkwLDIwNiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IE1TIHN0ZXJlbyBwcm9jZXNzaW5nCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IE1TIHN0ZXJlbyBwcm9jZXNzaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpbmNsdWRlICJtc19zdGVyZW8uaCIKIAogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogCiAvKiBzdGF0aWMgY29uc3QgZmxvYXQgc2NhbGVNaW5UaHJlcyA9IDEuMGY7ICovIC8qIDAuNzVmIGZvciAzZGIgYm9vc3QgKi8KIAotdm9pZCBGREthYWNFbmNfTXNTdGVyZW9Qcm9jZXNzaW5nKFBTWV9EQVRBICAgKlJFU1RSSUNUIHBzeURhdGFbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgKmlzQm9vaywKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgKm1zRGlnZXN0LCAgICAgICAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgKm1zTWFzaywgICAgICAgICAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICpzZmJPZmZzZXQpCi17Ci0gICAgRklYUF9EQkwgICAgICAgICpzZmJFbmVyZ3lMZWZ0ID0gcHN5RGF0YVswXS0+c2ZiRW5lcmd5Lkxvbmc7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KLSAgICBGSVhQX0RCTCAgICAgICAgKnNmYkVuZXJneVJpZ2h0ID0gcHN5RGF0YVsxXS0+c2ZiRW5lcmd5Lkxvbmc7ICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLwotICAgIGNvbnN0IEZJWFBfREJMICAqc2ZiRW5lcmd5TWlkID0gcHN5RGF0YVswXS0+c2ZiRW5lcmd5TVMuTG9uZzsKLSAgICBjb25zdCBGSVhQX0RCTCAgKnNmYkVuZXJneVNpZGUgPSBwc3lEYXRhWzFdLT5zZmJFbmVyZ3lNUy5Mb25nOwotICAgIEZJWFBfREJMICAgICAgICAqc2ZiVGhyZXNob2xkTGVmdCA9IHBzeURhdGFbMF0tPnNmYlRocmVzaG9sZC5Mb25nOyAgICAgICAgICAgICAgICAgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCi0gICAgRklYUF9EQkwgICAgICAgICpzZmJUaHJlc2hvbGRSaWdodCA9IHBzeURhdGFbMV0tPnNmYlRocmVzaG9sZC5Mb25nOyAgICAgICAgICAgICAgICAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KK3ZvaWQgRkRLYWFjRW5jX01zU3RlcmVvUHJvY2Vzc2luZyhQU1lfREFUQSAqUkVTVFJJQ1QgcHN5RGF0YVsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmlzQm9vaywgSU5UICptc0RpZ2VzdCwgLyogb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptc01hc2ssICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBhbGxvd01TLCBjb25zdCBJTlQgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpzZmJPZmZzZXQpIHsKKyAgRklYUF9EQkwgKnNmYkVuZXJneUxlZnQgPQorICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5Lkxvbmc7IC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLworICBGSVhQX0RCTCAqc2ZiRW5lcmd5UmlnaHQgPQorICAgICAgcHN5RGF0YVsxXS0+c2ZiRW5lcmd5Lkxvbmc7IC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLworICBjb25zdCBGSVhQX0RCTCAqc2ZiRW5lcmd5TWlkID0gcHN5RGF0YVswXS0+c2ZiRW5lcmd5TVMuTG9uZzsKKyAgY29uc3QgRklYUF9EQkwgKnNmYkVuZXJneVNpZGUgPSBwc3lEYXRhWzFdLT5zZmJFbmVyZ3lNUy5Mb25nOworICBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkTGVmdCA9CisgICAgICBwc3lEYXRhWzBdLT5zZmJUaHJlc2hvbGQuTG9uZzsgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCisgIEZJWFBfREJMICpzZmJUaHJlc2hvbGRSaWdodCA9CisgICAgICBwc3lEYXRhWzFdLT5zZmJUaHJlc2hvbGQuTG9uZzsgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCiAKLSAgICBGSVhQX0RCTCAgICAgICAgKnNmYlNwcmVhZEVuTGVmdCA9IHBzeURhdGFbMF0tPnNmYlNwcmVhZEVuZXJneS5Mb25nOwotICAgIEZJWFBfREJMICAgICAgICAqc2ZiU3ByZWFkRW5SaWdodCA9IHBzeURhdGFbMV0tPnNmYlNwcmVhZEVuZXJneS5Mb25nOworICBGSVhQX0RCTCAqc2ZiU3ByZWFkRW5MZWZ0ID0gcHN5RGF0YVswXS0+c2ZiU3ByZWFkRW5lcmd5Lkxvbmc7CisgIEZJWFBfREJMICpzZmJTcHJlYWRFblJpZ2h0ID0gcHN5RGF0YVsxXS0+c2ZiU3ByZWFkRW5lcmd5Lkxvbmc7CiAKLSAgICBGSVhQX0RCTCAgICAgICAgKnNmYkVuZXJneUxlZnRMZERhdGEgPSBwc3lPdXRDaGFubmVsWzBdLT5zZmJFbmVyZ3lMZERhdGE7ICAgICAgICAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KLSAgICBGSVhQX0RCTCAgICAgICAgKnNmYkVuZXJneVJpZ2h0TGREYXRhID0gcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiRW5lcmd5TGREYXRhOyAgICAgICAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KLSAgICBGSVhQX0RCTCAgICAgICAgKnNmYkVuZXJneU1pZExkRGF0YSA9IHBzeURhdGFbMF0tPnNmYkVuZXJneU1TTGREYXRhOwotICAgIEZJWFBfREJMICAgICAgICAqc2ZiRW5lcmd5U2lkZUxkRGF0YSA9IHBzeURhdGFbMV0tPnNmYkVuZXJneU1TTGREYXRhOwotICAgIEZJWFBfREJMICAgICAgICAqc2ZiVGhyZXNob2xkTGVmdExkRGF0YSA9IHBzeU91dENoYW5uZWxbMF0tPnNmYlRocmVzaG9sZExkRGF0YTsgIC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLwotICAgIEZJWFBfREJMICAgICAgICAqc2ZiVGhyZXNob2xkUmlnaHRMZERhdGEgPSBwc3lPdXRDaGFubmVsWzFdLT5zZmJUaHJlc2hvbGRMZERhdGE7IC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLworICBGSVhQX0RCTCAqc2ZiRW5lcmd5TGVmdExkRGF0YSA9CisgICAgICBwc3lPdXRDaGFubmVsWzBdLT5zZmJFbmVyZ3lMZERhdGE7IC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLworICBGSVhQX0RCTCAqc2ZiRW5lcmd5UmlnaHRMZERhdGEgPQorICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiRW5lcmd5TGREYXRhOyAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KKyAgRklYUF9EQkwgKnNmYkVuZXJneU1pZExkRGF0YSA9IHBzeURhdGFbMF0tPnNmYkVuZXJneU1TTGREYXRhOworICBGSVhQX0RCTCAqc2ZiRW5lcmd5U2lkZUxkRGF0YSA9IHBzeURhdGFbMV0tPnNmYkVuZXJneU1TTGREYXRhOworICBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkTGVmdExkRGF0YSA9CisgICAgICBwc3lPdXRDaGFubmVsWzBdLT5zZmJUaHJlc2hvbGRMZERhdGE7IC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLworICBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkUmlnaHRMZERhdGEgPQorICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiVGhyZXNob2xkTGREYXRhOyAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KIAotICAgIEZJWFBfREJMICAgICAgICAqbWRjdFNwZWN0cnVtTGVmdCA9IHBzeURhdGFbMF0tPm1kY3RTcGVjdHJ1bTsgICAgICAgICAgICAgICAgICAgICAgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCi0gICAgRklYUF9EQkwgICAgICAgICptZGN0U3BlY3RydW1SaWdodCA9IHBzeURhdGFbMV0tPm1kY3RTcGVjdHJ1bTsgICAgICAgICAgICAgICAgICAgICAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KKyAgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bUxlZnQgPQorICAgICAgcHN5RGF0YVswXS0+bWRjdFNwZWN0cnVtOyAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KKyAgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bVJpZ2h0ID0KKyAgICAgIHBzeURhdGFbMV0tPm1kY3RTcGVjdHJ1bTsgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCiAKLSAgICBJTlQgICAgICAgICAgICAgc2ZiLHNmYm9mZnMsIGo7ICAgICAgICAgICAvKiBsb29wIGNvdW50ZXJzICAgICAgICAgKi8KLSAgICBGSVhQX0RCTCAgICAgICAgcG5sckxkRGF0YSwgcG5tc0xkRGF0YTsKLSAgICBGSVhQX0RCTCAgICAgICAgbWluVGhyZXNob2xkTGREYXRhOwotICAgIEZJWFBfREJMICAgICAgICBtaW5UaHJlc2hvbGQ7Ci0gICAgSU5UICAgICAgICAgICAgIHVzZU1TOworICBJTlQgc2ZiLCBzZmJvZmZzLCBqOyAvKiBsb29wIGNvdW50ZXJzICAgICAgICAgKi8KKyAgRklYUF9EQkwgcG5sckxkRGF0YSwgcG5tc0xkRGF0YTsKKyAgRklYUF9EQkwgbWluVGhyZXNob2xkTGREYXRhOworICBGSVhQX0RCTCBtaW5UaHJlc2hvbGQ7CisgIElOVCB1c2VNUzsKIAotICAgIElOVCAgICAgICAgICAgICBtc01hc2tUcnVlU29tZXdoZXJlID0gMDsgIC8qIHRvIGRldGVybWluZSBtc0RpZ2VzdCAqLwotICAgIElOVCAgICAgICAgICAgICBudW1Nc01hc2tGYWxzZSA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBub24taW50ZW5zaXR5IGJhbmRzIHdoZXJlIEwvUiBjb2RpbmcgaXMgdXNlZCAqLworICBJTlQgbXNNYXNrVHJ1ZVNvbWV3aGVyZSA9IDA7IC8qIHRvIGRldGVybWluZSBtc0RpZ2VzdCAqLworICBJTlQgbnVtTXNNYXNrRmFsc2UgPQorICAgICAgMDsgLyogbnVtYmVyIG9mIG5vbi1pbnRlbnNpdHkgYmFuZHMgd2hlcmUgTC9SIGNvZGluZyBpcyB1c2VkICovCiAKLSAgICBmb3Ioc2ZiPTA7IHNmYjxzZmJDbnQ7IHNmYis9c2ZiUGVyR3JvdXApIHsKLSAgICAgIGZvcihzZmJvZmZzPTA7c2Zib2ZmczxtYXhTZmJQZXJHcm91cDtzZmJvZmZzKyspIHsKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYiArPSBzZmJQZXJHcm91cCkgeworICAgIGZvciAoc2Zib2ZmcyA9IDA7IHNmYm9mZnMgPCBtYXhTZmJQZXJHcm91cDsgc2Zib2ZmcysrKSB7CisgICAgICBpZiAoKGlzQm9vayA9PSBOVUxMKSA/IDEgOiAoaXNCb29rW3NmYiArIHNmYm9mZnNdID09IDApKSB7CisgICAgICAgIEZJWFBfREJMIHRtcDsKIAotICAgICAgICBpZiAoIChpc0Jvb2s9PU5VTEwpID8gMSA6IChpc0Jvb2tbc2ZiK3NmYm9mZnNdID09IDApICkgewotICAgICAgICAgIEZJWFBfREJMIHRtcDsKKyAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgIG1pblRocmVzaG9sZD1taW4oc2ZiVGhyZXNob2xkTGVmdFtzZmIrc2Zib2Zmc10sCisgICAgICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0W3NmYitzZmJvZmZzXSkqc2NhbGVNaW5UaHJlczsgcG5sciA9CisgICAgICAgICAgIChzZmJUaHJlc2hvbGRMZWZ0W3NmYitzZmJvZmZzXS8KKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoc2ZiRW5lcmd5TGVmdFtzZmIrc2Zib2Zmc10sc2ZiVGhyZXNob2xkTGVmdFtzZmIrc2Zib2Zmc10pKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdLworICAgICAgICAgICAgICAgICAgICAgICAgIG1heChzZmJFbmVyZ3lSaWdodFtzZmIrc2Zib2Zmc10sc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdKSk7CisgICAgICAgICAgICAgICAgICBwbm1zID0KKyAgICAgICAgICAgKG1pblRocmVzaG9sZC9tYXgoc2ZiRW5lcmd5TWlkW3NmYitzZmJvZmZzXSxtaW5UaHJlc2hvbGQpKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWluVGhyZXNob2xkL21heChzZmJFbmVyZ3lTaWRlW3NmYitzZmJvZmZzXSxtaW5UaHJlc2hvbGQpKTsKKyAgICAgICAgICAgICAgICAgIHVzZU1TID0gKHBubXMgPiBwbmxyKTsKKyAgICAgICAgKi8KIAotLyoKLSAgICAgICAgICBtaW5UaHJlc2hvbGQ9bWluKHNmYlRocmVzaG9sZExlZnRbc2ZiK3NmYm9mZnNdLCBzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10pKnNjYWxlTWluVGhyZXM7Ci0gICAgICAgICAgcG5sciA9IChzZmJUaHJlc2hvbGRMZWZ0W3NmYitzZmJvZmZzXS8KLSAgICAgICAgICAgICAgICAgbWF4KHNmYkVuZXJneUxlZnRbc2ZiK3NmYm9mZnNdLHNmYlRocmVzaG9sZExlZnRbc2ZiK3NmYm9mZnNdKSkqCi0gICAgICAgICAgICAgICAgIChzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10vCi0gICAgICAgICAgICAgICAgIG1heChzZmJFbmVyZ3lSaWdodFtzZmIrc2Zib2Zmc10sc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdKSk7Ci0gICAgICAgICAgcG5tcyA9IChtaW5UaHJlc2hvbGQvbWF4KHNmYkVuZXJneU1pZFtzZmIrc2Zib2Zmc10sbWluVGhyZXNob2xkKSkqCi0gICAgICAgICAgICAgICAgIChtaW5UaHJlc2hvbGQvbWF4KHNmYkVuZXJneVNpZGVbc2ZiK3NmYm9mZnNdLG1pblRocmVzaG9sZCkpOwotICAgICAgICAgIHVzZU1TID0gKHBubXMgPiBwbmxyKTsKLSovCisgICAgICAgIC8qIHdlIGFzc3VtZSB0aGF0IHNjYWxlTWluVGhyZXMgPT0gMS4wZiBhbmQgd2UgY2FuIGRyb3AgaXQgKi8KKyAgICAgICAgbWluVGhyZXNob2xkTGREYXRhID0gZml4TWluKHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiICsgc2Zib2Zmc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIgKyBzZmJvZmZzXSk7CiAKLSAgICAgICAgICAvKiB3ZSBhc3N1bWUgdGhhdCBzY2FsZU1pblRocmVzID09IDEuMGYgYW5kIHdlIGNhbiBkcm9wIGl0ICovCi0gICAgICAgICAgbWluVGhyZXNob2xkTGREYXRhID0gZml4TWluKHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiK3NmYm9mZnNdLCBzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10pOworICAgICAgICAvKiBwbmxyTGREYXRhID0gc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIrc2Zib2Zmc10gLQorICAgICAgICAgICAgICAgICAgICAgIG1heChzZmJFbmVyZ3lMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSwKKyAgICAgICAgICAgc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIrc2Zib2Zmc10pICsKKyAgICAgICAgICAgICAgICAgICAgICBzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10gLQorICAgICAgICAgICAgICAgICAgICAgIG1heChzZmJFbmVyZ3lSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10sCisgICAgICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSk7ICovCisgICAgICAgIHRtcCA9IGZpeE1heChzZmJFbmVyZ3lMZWZ0TGREYXRhW3NmYiArIHNmYm9mZnNdLAorICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIgKyBzZmJvZmZzXSk7CisgICAgICAgIHBubHJMZERhdGEgPSAoc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIgKyBzZmJvZmZzXSA+PiAxKSAtICh0bXAgPj4gMSk7CisgICAgICAgIHBubHJMZERhdGEgPSBwbmxyTGREYXRhICsgKHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYiArIHNmYm9mZnNdID4+IDEpOworICAgICAgICB0bXAgPSBmaXhNYXgoc2ZiRW5lcmd5UmlnaHRMZERhdGFbc2ZiICsgc2Zib2Zmc10sCisgICAgICAgICAgICAgICAgICAgICBzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIgKyBzZmJvZmZzXSk7CisgICAgICAgIHBubHJMZERhdGEgPSBwbmxyTGREYXRhIC0gKHRtcCA+PiAxKTsKIAotICAgICAgICAgIC8qIHBubHJMZERhdGEgPSBzZmJUaHJlc2hvbGRMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSAtCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXgoc2ZiRW5lcmd5TGVmdExkRGF0YVtzZmIrc2Zib2Zmc10sIHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiK3NmYm9mZnNdKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10gLQotICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHNmYkVuZXJneVJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSwgc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdKTsgKi8KLSAgICAgICAgICB0bXAgPSBmaXhNYXgoc2ZiRW5lcmd5TGVmdExkRGF0YVtzZmIrc2Zib2Zmc10sIHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiK3NmYm9mZnNdKTsKLSAgICAgICAgICBwbmxyTGREYXRhID0gKHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiK3NmYm9mZnNdPj4xKSAtICh0bXA+PjEpOwotICAgICAgICAgIHBubHJMZERhdGEgPSBwbmxyTGREYXRhICsgKHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXT4+MSk7Ci0gICAgICAgICAgdG1wID0gZml4TWF4KHNmYkVuZXJneVJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSwgc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdKTsKLSAgICAgICAgICBwbmxyTGREYXRhID0gcG5sckxkRGF0YSAtICh0bXA+PjEpOworICAgICAgICAvKiBwbm1zTGREYXRhID0gbWluVGhyZXNob2xkTGREYXRhIC0KKyAgICAgICAgICAgbWF4KHNmYkVuZXJneU1pZExkRGF0YVtzZmIrc2Zib2Zmc10sIG1pblRocmVzaG9sZExkRGF0YSkgKworICAgICAgICAgICAgICAgICAgICAgIG1pblRocmVzaG9sZExkRGF0YSAtIG1heChzZmJFbmVyZ3lTaWRlTGREYXRhW3NmYitzZmJvZmZzXSwKKyAgICAgICAgICAgbWluVGhyZXNob2xkTGREYXRhKTsgKi8KKyAgICAgICAgdG1wID0gZml4TWF4KHNmYkVuZXJneU1pZExkRGF0YVtzZmIgKyBzZmJvZmZzXSwgbWluVGhyZXNob2xkTGREYXRhKTsKKyAgICAgICAgcG5tc0xkRGF0YSA9IG1pblRocmVzaG9sZExkRGF0YSAtICh0bXAgPj4gMSk7CisgICAgICAgIHRtcCA9IGZpeE1heChzZmJFbmVyZ3lTaWRlTGREYXRhW3NmYiArIHNmYm9mZnNdLCBtaW5UaHJlc2hvbGRMZERhdGEpOworICAgICAgICBwbm1zTGREYXRhID0gcG5tc0xkRGF0YSAtICh0bXAgPj4gMSk7CisgICAgICAgIHVzZU1TID0gKChhbGxvd01TICE9IDApICYmIChwbm1zTGREYXRhID4gcG5sckxkRGF0YSkpID8gMSA6IDA7CiAKLSAgICAgICAgICAvKiBwbm1zTGREYXRhID0gbWluVGhyZXNob2xkTGREYXRhIC0gbWF4KHNmYkVuZXJneU1pZExkRGF0YVtzZmIrc2Zib2Zmc10sIG1pblRocmVzaG9sZExkRGF0YSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgbWluVGhyZXNob2xkTGREYXRhIC0gbWF4KHNmYkVuZXJneVNpZGVMZERhdGFbc2ZiK3NmYm9mZnNdLCBtaW5UaHJlc2hvbGRMZERhdGEpOyAqLwotICAgICAgICAgIHRtcCA9IGZpeE1heChzZmJFbmVyZ3lNaWRMZERhdGFbc2ZiK3NmYm9mZnNdLCBtaW5UaHJlc2hvbGRMZERhdGEpOwotICAgICAgICAgIHBubXNMZERhdGEgPSBtaW5UaHJlc2hvbGRMZERhdGEgLSAodG1wPj4xKTsKLSAgICAgICAgICB0bXAgPSBmaXhNYXgoc2ZiRW5lcmd5U2lkZUxkRGF0YVtzZmIrc2Zib2Zmc10sIG1pblRocmVzaG9sZExkRGF0YSk7Ci0gICAgICAgICAgcG5tc0xkRGF0YSA9IHBubXNMZERhdGEgLSAodG1wPj4xKTsKLSAgICAgICAgICB1c2VNUyA9IChwbm1zTGREYXRhID4gKHBubHJMZERhdGEpKTsKKyAgICAgICAgaWYgKHVzZU1TKSB7CisgICAgICAgICAgbXNNYXNrW3NmYiArIHNmYm9mZnNdID0gMTsKKyAgICAgICAgICBtc01hc2tUcnVlU29tZXdoZXJlID0gMTsKKyAgICAgICAgICBmb3IgKGogPSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc107IGogPCBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBGSVhQX0RCTCBzcGVjTCwgc3BlY1I7CisgICAgICAgICAgICBzcGVjTCA9IG1kY3RTcGVjdHJ1bUxlZnRbal0gPj4gMTsKKyAgICAgICAgICAgIHNwZWNSID0gbWRjdFNwZWN0cnVtUmlnaHRbal0gPj4gMTsKKyAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSBzcGVjTCArIHNwZWNSOworICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSBzcGVjTCAtIHNwZWNSOworICAgICAgICAgIH0KKyAgICAgICAgICBtaW5UaHJlc2hvbGQgPSBmaXhNaW4oc2ZiVGhyZXNob2xkTGVmdFtzZmIgKyBzZmJvZmZzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRbc2ZiICsgc2Zib2Zmc10pOworICAgICAgICAgIHNmYlRocmVzaG9sZExlZnRbc2ZiICsgc2Zib2Zmc10gPSBzZmJUaHJlc2hvbGRSaWdodFtzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAgIG1pblRocmVzaG9sZDsKKyAgICAgICAgICBzZmJUaHJlc2hvbGRMZWZ0TGREYXRhW3NmYiArIHNmYm9mZnNdID0KKyAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiICsgc2Zib2Zmc10gPSBtaW5UaHJlc2hvbGRMZERhdGE7CisgICAgICAgICAgc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXSA9IHNmYkVuZXJneU1pZFtzZmIgKyBzZmJvZmZzXTsKKyAgICAgICAgICBzZmJFbmVyZ3lSaWdodFtzZmIgKyBzZmJvZmZzXSA9IHNmYkVuZXJneVNpZGVbc2ZiICsgc2Zib2Zmc107CisgICAgICAgICAgc2ZiRW5lcmd5TGVmdExkRGF0YVtzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAgIHNmYkVuZXJneU1pZExkRGF0YVtzZmIgKyBzZmJvZmZzXTsKKyAgICAgICAgICBzZmJFbmVyZ3lSaWdodExkRGF0YVtzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAgIHNmYkVuZXJneVNpZGVMZERhdGFbc2ZiICsgc2Zib2Zmc107CiAKKyAgICAgICAgICBzZmJTcHJlYWRFbkxlZnRbc2ZiICsgc2Zib2Zmc10gPSBzZmJTcHJlYWRFblJpZ2h0W3NmYiArIHNmYm9mZnNdID0KKyAgICAgICAgICAgICAgZml4TWluKHNmYlNwcmVhZEVuTGVmdFtzZmIgKyBzZmJvZmZzXSwKKyAgICAgICAgICAgICAgICAgICAgIHNmYlNwcmVhZEVuUmlnaHRbc2ZiICsgc2Zib2Zmc10pID4+CisgICAgICAgICAgICAgIDE7CiAKLSAgICAgICAgICBpZiAodXNlTVMpIHsKLSAgICAgICAgICAgIG1zTWFza1tzZmIrc2Zib2Zmc10gPSAxOwotICAgICAgICAgICAgbXNNYXNrVHJ1ZVNvbWV3aGVyZSA9IDE7Ci0gICAgICAgICAgICBmb3Ioaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbXNNYXNrW3NmYiArIHNmYm9mZnNdID0gMDsKKyAgICAgICAgICBudW1Nc01hc2tGYWxzZSsrOworICAgICAgICB9IC8qIHVzZU1TICovCisgICAgICB9ICAgLyogaXNCb29rICovCisgICAgICBlbHNlIHsKKyAgICAgICAgLyoga2VlcCBtRGlnZXN0IGZyb20gSVMgbW9kdWxlICovCisgICAgICAgIGlmIChtc01hc2tbc2ZiICsgc2Zib2Zmc10pIHsKKyAgICAgICAgICBtc01hc2tUcnVlU29tZXdoZXJlID0gMTsKKyAgICAgICAgfQorICAgICAgICAvKiBwcm9oaWJpdCBNU19NQVNLX0FMTCBpbiBjb21iaW5hdGlvbiB3aXRoIElTICovCisgICAgICAgIG51bU1zTWFza0ZhbHNlID0gOTsKKyAgICAgIH0gLyogaXNCb29rICovCisgICAgfSAgIC8qIHNmYm9mZnMgKi8KKyAgfSAgICAgLyogc2ZiICovCisKKyAgaWYgKG1zTWFza1RydWVTb21ld2hlcmUgPT0gMSkgeworICAgIGlmICgobnVtTXNNYXNrRmFsc2UgPT0gMCkgfHwKKyAgICAgICAgKChudW1Nc01hc2tGYWxzZSA8IG1heFNmYlBlckdyb3VwKSAmJiAobnVtTXNNYXNrRmFsc2UgPCA5KSkpIHsKKyAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfQUxMOworICAgICAgLyogbG9vcCB0aHJvdWdoIE0vUyBiYW5kczsgaWYgbXNNYXNrPT0wLCBzZXQgaXQgdG8gMSBhbmQgYXBwbHkgTS9TICovCisgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiICs9IHNmYlBlckdyb3VwKSB7CisgICAgICAgIGZvciAoc2Zib2ZmcyA9IDA7IHNmYm9mZnMgPCBtYXhTZmJQZXJHcm91cDsgc2Zib2ZmcysrKSB7CisgICAgICAgICAgaWYgKCgoaXNCb29rID09IE5VTEwpID8gMSA6IChpc0Jvb2tbc2ZiICsgc2Zib2Zmc10gPT0gMCkpICYmCisgICAgICAgICAgICAgIChtc01hc2tbc2ZiICsgc2Zib2Zmc10gPT0gMCkpIHsKKyAgICAgICAgICAgIG1zTWFza1tzZmIgKyBzZmJvZmZzXSA9IDE7CisgICAgICAgICAgICAvKiBhcHBseSBNL1MgY29kaW5nICovCisgICAgICAgICAgICBmb3IgKGogPSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc107IGogPCBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdOworICAgICAgICAgICAgICAgICBqKyspIHsKICAgICAgICAgICAgICAgRklYUF9EQkwgc3BlY0wsIHNwZWNSOwotICAgICAgICAgICAgICBzcGVjTCA9IG1kY3RTcGVjdHJ1bUxlZnRbal0+PjE7Ci0gICAgICAgICAgICAgIHNwZWNSID0gbWRjdFNwZWN0cnVtUmlnaHRbal0+PjE7CisgICAgICAgICAgICAgIHNwZWNMID0gbWRjdFNwZWN0cnVtTGVmdFtqXSA+PiAxOworICAgICAgICAgICAgICBzcGVjUiA9IG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID4+IDE7CiAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSBzcGVjTCArIHNwZWNSOwogICAgICAgICAgICAgICBtZGN0U3BlY3RydW1SaWdodFtqXSA9IHNwZWNMIC0gc3BlY1I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtaW5UaHJlc2hvbGQgPSBmaXhNaW4oc2ZiVGhyZXNob2xkTGVmdFtzZmIrc2Zib2Zmc10sIHNmYlRocmVzaG9sZFJpZ2h0W3NmYitzZmJvZmZzXSk7Ci0gICAgICAgICAgICBzZmJUaHJlc2hvbGRMZWZ0W3NmYitzZmJvZmZzXSA9IHNmYlRocmVzaG9sZFJpZ2h0W3NmYitzZmJvZmZzXSA9IG1pblRocmVzaG9sZDsKLSAgICAgICAgICAgIHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiK3NmYm9mZnNdID0gc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdID0gbWluVGhyZXNob2xkTGREYXRhOwotICAgICAgICAgICAgc2ZiRW5lcmd5TGVmdFtzZmIrc2Zib2Zmc10gPSBzZmJFbmVyZ3lNaWRbc2ZiK3NmYm9mZnNdOwotICAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHRbc2ZiK3NmYm9mZnNdID0gc2ZiRW5lcmd5U2lkZVtzZmIrc2Zib2Zmc107Ci0gICAgICAgICAgICBzZmJFbmVyZ3lMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneU1pZExkRGF0YVtzZmIrc2Zib2Zmc107Ci0gICAgICAgICAgICBzZmJFbmVyZ3lSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10gPSBzZmJFbmVyZ3lTaWRlTGREYXRhW3NmYitzZmJvZmZzXTsKKyAgICAgICAgICAgIG1pblRocmVzaG9sZCA9IGZpeE1pbihzZmJUaHJlc2hvbGRMZWZ0W3NmYiArIHNmYm9mZnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0W3NmYiArIHNmYm9mZnNdKTsKKyAgICAgICAgICAgIHNmYlRocmVzaG9sZExlZnRbc2ZiICsgc2Zib2Zmc10gPSBzZmJUaHJlc2hvbGRSaWdodFtzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAgICAgbWluVGhyZXNob2xkOworICAgICAgICAgICAgbWluVGhyZXNob2xkTGREYXRhID0gZml4TWluKHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiICsgc2Zib2Zmc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiICsgc2Zib2Zmc10pOworICAgICAgICAgICAgc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiICsgc2Zib2Zmc10gPSBtaW5UaHJlc2hvbGRMZERhdGE7CisgICAgICAgICAgICBzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdID0gc2ZiRW5lcmd5TWlkW3NmYiArIHNmYm9mZnNdOworICAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc10gPSBzZmJFbmVyZ3lTaWRlW3NmYiArIHNmYm9mZnNdOworICAgICAgICAgICAgc2ZiRW5lcmd5TGVmdExkRGF0YVtzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TWlkTGREYXRhW3NmYiArIHNmYm9mZnNdOworICAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHRMZERhdGFbc2ZiICsgc2Zib2Zmc10gPQorICAgICAgICAgICAgICAgIHNmYkVuZXJneVNpZGVMZERhdGFbc2ZiICsgc2Zib2Zmc107CiAKLSAgICAgICAgICAgIHNmYlNwcmVhZEVuTGVmdFtzZmIrc2Zib2Zmc10gPSBzZmJTcHJlYWRFblJpZ2h0W3NmYitzZmJvZmZzXSA9Ci0gICAgICAgICAgICAgICAgICAgICBmaXhNaW4oIHNmYlNwcmVhZEVuTGVmdFtzZmIrc2Zib2Zmc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYlNwcmVhZEVuUmlnaHRbc2ZiK3NmYm9mZnNdICkgPj4gMTsKLQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG1zTWFza1tzZmIrc2Zib2Zmc10gPSAwOwotICAgICAgICAgICAgbnVtTXNNYXNrRmFsc2UrKzsKLSAgICAgICAgICB9IC8qIHVzZU1TICovCi0gICAgICAgIH0gLyogaXNCb29rICovCi0gICAgICAgIGVsc2UgewotICAgICAgICAgIC8qIGtlZXAgbURpZ2VzdCBmcm9tIElTIG1vZHVsZSAqLwotICAgICAgICAgIGlmIChtc01hc2tbc2ZiK3NmYm9mZnNdKSB7Ci0gICAgICAgICAgICBtc01hc2tUcnVlU29tZXdoZXJlID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLyogcHJvaGliaXQgTVNfTUFTS19BTEwgaW4gY29tYmluYXRpb24gd2l0aCBJUyAqLwotICAgICAgICAgIG51bU1zTWFza0ZhbHNlID0gOTsKLSAgICAgICAgfSAvKiBpc0Jvb2sgKi8KLSAgICAgIH0gLyogc2Zib2ZmcyAqLwotICAgIH0gLyogc2ZiICovCi0KLQotICAgIGlmKG1zTWFza1RydWVTb21ld2hlcmUgPT0gMSkgewotICAgICAgaWYgKChudW1Nc01hc2tGYWxzZSA9PSAwKSB8fCAoKG51bU1zTWFza0ZhbHNlIDwgbWF4U2ZiUGVyR3JvdXApICYmIChudW1Nc01hc2tGYWxzZSA8IDkpKSkgewotICAgICAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX0FMTDsKLSAgICAgICAgLyogbG9vcCB0aHJvdWdoIE0vUyBiYW5kczsgaWYgbXNNYXNrPT0wLCBzZXQgaXQgdG8gMSBhbmQgYXBwbHkgTS9TICovCi0gICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIgKz0gc2ZiUGVyR3JvdXApIHsKLSAgICAgICAgICBmb3IgKHNmYm9mZnMgPSAwOyBzZmJvZmZzIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYm9mZnMrKykgewotICAgICAgICAgICAgaWYgKCggKGlzQm9vayA9PSBOVUxMKSA/IDEgOiAoaXNCb29rW3NmYitzZmJvZmZzXSA9PSAwKSApICYmIChtc01hc2tbc2ZiK3NmYm9mZnNdID09IDApKSB7Ci0gICAgICAgICAgICAgIG1zTWFza1tzZmIrc2Zib2Zmc10gPSAxOwotICAgICAgICAgICAgICAvKiBhcHBseSBNL1MgY29kaW5nICovCi0gICAgICAgICAgICAgIGZvcihqPXNmYk9mZnNldFtzZmIrc2Zib2Zmc107IGo8c2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCBzcGVjTCwgc3BlY1I7Ci0gICAgICAgICAgICAgICAgc3BlY0wgPSBtZGN0U3BlY3RydW1MZWZ0W2pdPj4xOwotICAgICAgICAgICAgICAgIHNwZWNSID0gbWRjdFNwZWN0cnVtUmlnaHRbal0+PjE7Ci0gICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9IHNwZWNMICsgc3BlY1I7Ci0gICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSBzcGVjTCAtIHNwZWNSOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1pblRocmVzaG9sZCA9IGZpeE1pbihzZmJUaHJlc2hvbGRMZWZ0W3NmYitzZmJvZmZzXSwgc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdKTsKLSAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkTGVmdFtzZmIrc2Zib2Zmc10gPSBzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10gPSBtaW5UaHJlc2hvbGQ7Ci0gICAgICAgICAgICAgIG1pblRocmVzaG9sZExkRGF0YSA9IGZpeE1pbihzZmJUaHJlc2hvbGRMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSwgc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdKTsKLSAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIrc2Zib2Zmc10gPSBzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10gPSBtaW5UaHJlc2hvbGRMZERhdGE7Ci0gICAgICAgICAgICAgIHNmYkVuZXJneUxlZnRbc2ZiK3NmYm9mZnNdID0gc2ZiRW5lcmd5TWlkW3NmYitzZmJvZmZzXTsKLSAgICAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHRbc2ZiK3NmYm9mZnNdID0gc2ZiRW5lcmd5U2lkZVtzZmIrc2Zib2Zmc107Ci0gICAgICAgICAgICAgIHNmYkVuZXJneUxlZnRMZERhdGFbc2ZiK3NmYm9mZnNdID0gc2ZiRW5lcmd5TWlkTGREYXRhW3NmYitzZmJvZmZzXTsKLSAgICAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdID0gc2ZiRW5lcmd5U2lkZUxkRGF0YVtzZmIrc2Zib2Zmc107Ci0KLSAgICAgICAgICAgICAgc2ZiU3ByZWFkRW5MZWZ0W3NmYitzZmJvZmZzXSA9IHNmYlNwcmVhZEVuUmlnaHRbc2ZiK3NmYm9mZnNdID0KLSAgICAgICAgICAgICAgICAgICAgICAgZml4TWluKCBzZmJTcHJlYWRFbkxlZnRbc2ZiK3NmYm9mZnNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYlNwcmVhZEVuUmlnaHRbc2ZiK3NmYm9mZnNdICkgPj4gMTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNmYlNwcmVhZEVuTGVmdFtzZmIgKyBzZmJvZmZzXSA9IHNmYlNwcmVhZEVuUmlnaHRbc2ZiICsgc2Zib2Zmc10gPQorICAgICAgICAgICAgICAgIGZpeE1pbihzZmJTcHJlYWRFbkxlZnRbc2ZiICsgc2Zib2Zmc10sCisgICAgICAgICAgICAgICAgICAgICAgIHNmYlNwcmVhZEVuUmlnaHRbc2ZiICsgc2Zib2Zmc10pID4+CisgICAgICAgICAgICAgICAgMTsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfU09NRTsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19OT05FOworICAgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19TT01FOwogICAgIH0KKyAgfSBlbHNlIHsKKyAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX05PTkU7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvbXNfc3RlcmVvLmggYi9saWJBQUNlbmMvc3JjL21zX3N0ZXJlby5oCmluZGV4IDJmM2FkZGIuLmEyMDIzMDcgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvbXNfc3RlcmVvLmgKKysrIGIvbGliQUFDZW5jL3NyYy9tc19zdGVyZW8uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyOSArOTAsMjggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBNUyBzdGVyZW8gcHJvY2Vzc2luZworICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBNUyBzdGVyZW8gcHJvY2Vzc2luZwogCi0jaWZuZGVmIF9fTVNfU1RFUkVPX0hfXwotI2RlZmluZSBfX01TX1NURVJFT19IX18KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgTVNfU1RFUkVPX0gKKyNkZWZpbmUgTVNfU1RFUkVPX0gKIAogI2luY2x1ZGUgImludGVyZmFjZS5oIgogCi12b2lkIEZES2FhY0VuY19Nc1N0ZXJlb1Byb2Nlc3NpbmcoUFNZX0RBVEEgICAqUkVTVFJJQ1QgcHN5RGF0YVsoMildLAotICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAqaXNCb29rLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqbXNEaWdlc3QsICAgICAgIC8qIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqbXNNYXNrLCAgICAgICAgIC8qIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgKnNmYk9mZnNldCk7Cit2b2lkIEZES2FhY0VuY19Nc1N0ZXJlb1Byb2Nlc3NpbmcoUFNZX0RBVEEgKlJFU1RSSUNUIHBzeURhdGFbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICppc0Jvb2ssIElOVCAqbXNEaWdlc3QsIC8qIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbXNNYXNrLCAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYWxsb3dNUywgY29uc3QgSU5UIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0KTsKIAotI2VuZGlmCisjZW5kaWYgLyogTVNfU1RFUkVPX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvbm9pc2VkZXQuY3BwIGIvbGliQUFDZW5jL3NyYy9ub2lzZWRldC5jcHAKaW5kZXggZjNjNTFkZS4uYzk4NDMwNCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9ub2lzZWRldC5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9ub2lzZWRldC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjIgKzkwLDIyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIExvaHdhc3NlcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IG5vaXNlZGV0LmMKLSAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0aW5lcyBmb3IgTm9pc2UgRGV0ZWN0aW9uCisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBub2lzZWRldC5jCisgICAgICAgICAgICAgICAgUm91dGluZXMgZm9yIE5vaXNlIERldGVjdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAibm9pc2VkZXQuaCIKIAogI2luY2x1ZGUgImFhY2VuY19wbnMuaCIKICNpbmNsdWRlICJwbnNwYXJhbS5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfZnV6enlJc1NtYWxsZXIKQEAgLTEwNSwyMCArMTE2LDE2IEBACiAgICAgb3V0cHV0OiAgICAgICByZXR1cm4gZnV6enkgdmFsdWUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgRklYUF9TR0wgRkRLYWFjRW5jX2Z1enp5SXNTbWFsbGVyKCBGSVhQX0RCTCB0ZXN0VmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCByZWZWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGxvTGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBoaUxpbSApCi17CitzdGF0aWMgRklYUF9TR0wgRkRLYWFjRW5jX2Z1enp5SXNTbWFsbGVyKEZJWFBfREJMIHRlc3RWYWwsIEZJWFBfREJMIHJlZlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbG9MaW0sIEZJWFBfREJMIGhpTGltKSB7CiAgIGlmIChyZWZWYWwgPD0gRkwyRlhDT05TVF9EQkwoMC4wKSkKLSAgICAgICAgcmV0dXJuKCBGTDJGWENPTlNUX1NHTCgwLjBmKSApOwotICBlbHNlIGlmICh0ZXN0VmFsID49IGZNdWx0KChoaUxpbT4+MSkrKGxvTGltPj4xKSwgcmVmVmFsKSkKLSAgICAgICAgcmV0dXJuKCBGTDJGWENPTlNUX1NHTCgwLjBmKSApOwotICBlbHNlICByZXR1cm4oIChGSVhQX1NHTClNQVhWQUxfU0dMICk7CisgICAgcmV0dXJuIChGTDJGWENPTlNUX1NHTCgwLjBmKSk7CisgIGVsc2UgaWYgKHRlc3RWYWwgPj0gZk11bHQoKGhpTGltID4+IDEpICsgKGxvTGltID4+IDEpLCByZWZWYWwpKQorICAgIHJldHVybiAoRkwyRlhDT05TVF9TR0woMC4wZikpOworICBlbHNlCisgICAgcmV0dXJuICgoRklYUF9TR0wpTUFYVkFMX1NHTCk7CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX25vaXNlRGV0ZWN0CkBAIC0xNDAsNDUgKzE0Nyw0NSBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBGREthYWNFbmNfbm9pc2VEZXRlY3QoRklYUF9EQkwgICAgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgIHNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKlJFU1RSSUNUIHNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgKlJFU1RSSUNUIG5vaXNlRnV6enlNZWFzdXJlLAotICAgICAgICAgICAgICAgICBOT0lTRVBBUkFNUyAqbnAsCi0gICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICpSRVNUUklDVCBzZmJ0b25hbGl0eSApCit2b2lkIEZES2FhY0VuY19ub2lzZURldGVjdChGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsIElOVCBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKlJFU1RSSUNUIHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICpSRVNUUklDVCBub2lzZUZ1enp5TWVhc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PSVNFUEFSQU1TICpucCwgRklYUF9TR0wgKlJFU1RSSUNUIHNmYnRvbmFsaXR5KQogCiB7Ci0gIGludCAgICBpLCBrLCBzZmIsIHNmYldpZHRoOworICBpbnQgaSwgaywgc2ZiLCBzZmJXaWR0aDsKICAgRklYUF9TR0wgZnV6enksIGZ1enp5VG90YWw7CiAgIEZJWFBfREJMIHJlZlZhbCwgdGVzdFZhbDsKIAogICAvKioqKiogU3RhcnQgZGV0ZWN0aW9uIHBoYXNlICoqKioqLwogICAvKiBTdGFydCBub2lzZSBkZXRlY3Rpb24gZm9yIGVhY2ggYmFuZCBiYXNlZCBvbiBhIG51bWJlciBvZiBjaGVja3MgKi8KLSAgZm9yIChzZmI9MDsgc2ZiPHNmYkFjdGl2ZTsgc2ZiKyspIHsKLQorICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKICAgICBmdXp6eVRvdGFsID0gKEZJWFBfU0dMKU1BWFZBTF9TR0w7Ci0gICAgc2ZiV2lkdGggPSBzZmJPZmZzZXRbc2ZiKzFdIC0gc2ZiT2Zmc2V0W3NmYl07CisgICAgc2ZiV2lkdGggPSBzZmJPZmZzZXRbc2ZiICsgMV0gLSBzZmJPZmZzZXRbc2ZiXTsKIAogICAgIC8qIFJlc2V0IG91dHB1dCBmb3IgbG93ZXIgYmFuZHMgb3IgdG9vIHNtYWxsIGJhbmRzICovCi0gICAgaWYgKHNmYiA8IG5wLT5zdGFydFNmYiAgfHwgIHNmYldpZHRoIDwgbnAtPm1pblNmYldpZHRoKSB7CisgICAgaWYgKHNmYiA8IG5wLT5zdGFydFNmYiB8fCBzZmJXaWR0aCA8IG5wLT5taW5TZmJXaWR0aCkgewogICAgICAgbm9pc2VGdXp6eU1lYXN1cmVbc2ZiXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogICAgICAgY29udGludWU7CiAgICAgfQogCi0gICAgaWYgKCAobnAtPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzICYgVVNFX1BPV0VSX0RJU1RSSUJVVElPTikgJiYgKGZ1enp5VG90YWwgPiBGTDJGWENPTlNUX1NHTCgwLjVmKSkgKSB7CisgICAgaWYgKChucC0+ZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBVU0VfUE9XRVJfRElTVFJJQlVUSU9OKSAmJgorICAgICAgICAoZnV6enlUb3RhbCA+IEZMMkZYQ09OU1RfU0dMKDAuNWYpKSkgewogICAgICAgRklYUF9EQkwgZmhlbHAxLCBmaGVscDIsIGZoZWxwMywgZmhlbHA0LCBtYXhWYWwsIG1pblZhbDsKLSAgICAgIElOVCBsZWFkaW5nQml0cyA9IGZpeE1heCgwLChzZmJNYXhTY2FsZVNwZWNbc2ZiXSAtIDMpKTsgICAgICAgICAvKiBtYXggc2ZiV2lkdGggPSA5Ni80IDsgMl41PTMyID0+IDUvMiA9IDMgKHNwYypzcGMpICovCisgICAgICBJTlQgbGVhZGluZ0JpdHMgPSBmaXhNYXgoCisgICAgICAgICAgMCwgKHNmYk1heFNjYWxlU3BlY1tzZmJdIC0KKyAgICAgICAgICAgICAgMykpOyAvKiBtYXggc2ZiV2lkdGggPSA5Ni80IDsgMl41PTMyID0+IDUvMiA9IDMgKHNwYypzcGMpICovCiAKICAgICAgIC8qICBjaGVjayBwb3dlciBkaXN0cmlidXRpb24gaW4gZm91ciByZWdpb25zICovCiAgICAgICBmaGVscDEgPSBmaGVscDIgPSBmaGVscDMgPSBmaGVscDQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgIGsgPSBzZmJXaWR0aCA+PjI7ICAvKiBXaWR0aCBvZiBhIHF1YXJ0ZXIgYmFuZCAqLworICAgICAgayA9IHNmYldpZHRoID4+IDI7IC8qIFdpZHRoIG9mIGEgcXVhcnRlciBiYW5kICovCiAKLSAgICAgIGZvciAoaT1zZmJPZmZzZXRbc2ZiXTsgaTxzZmJPZmZzZXRbc2ZiXStrOyBpKyspIHsKLSAgICAgICAgZmhlbHAxID0gZlBvdzJBZGREaXYyKGZoZWxwMSwgbWRjdFNwZWN0cnVtW2ldPDxsZWFkaW5nQml0cyk7Ci0gICAgICAgIGZoZWxwMiA9IGZQb3cyQWRkRGl2MihmaGVscDIsIG1kY3RTcGVjdHJ1bVtpK2tdPDxsZWFkaW5nQml0cyk7Ci0gICAgICAgIGZoZWxwMyA9IGZQb3cyQWRkRGl2MihmaGVscDMsIG1kY3RTcGVjdHJ1bVtpKzIqa108PGxlYWRpbmdCaXRzKTsKLSAgICAgICAgZmhlbHA0ID0gZlBvdzJBZGREaXYyKGZoZWxwNCwgbWRjdFNwZWN0cnVtW2krMyprXTw8bGVhZGluZ0JpdHMpOworICAgICAgZm9yIChpID0gc2ZiT2Zmc2V0W3NmYl07IGkgPCBzZmJPZmZzZXRbc2ZiXSArIGs7IGkrKykgeworICAgICAgICBmaGVscDEgPSBmUG93MkFkZERpdjIoZmhlbHAxLCBtZGN0U3BlY3RydW1baV0gPDwgbGVhZGluZ0JpdHMpOworICAgICAgICBmaGVscDIgPSBmUG93MkFkZERpdjIoZmhlbHAyLCBtZGN0U3BlY3RydW1baSArIGtdIDw8IGxlYWRpbmdCaXRzKTsKKyAgICAgICAgZmhlbHAzID0gZlBvdzJBZGREaXYyKGZoZWxwMywgbWRjdFNwZWN0cnVtW2kgKyAyICoga10gPDwgbGVhZGluZ0JpdHMpOworICAgICAgICBmaGVscDQgPSBmUG93MkFkZERpdjIoZmhlbHA0LCBtZGN0U3BlY3RydW1baSArIDMgKiBrXSA8PCBsZWFkaW5nQml0cyk7CiAgICAgICB9CiAKICAgICAgIC8qIGdldCBtYXggaW50byBmaGVscDogKi8KQEAgLTE5NCwzNCArMjAxLDM0IEBACiAgICAgICAvKiBOb3JtYWxpemUgbWluIGFuZCBtYXggVmFsICovCiAgICAgICBsZWFkaW5nQml0cyA9IENvdW50TGVhZGluZ0JpdHMobWF4VmFsKTsKICAgICAgIHRlc3RWYWwgPSBtYXhWYWwgPDwgbGVhZGluZ0JpdHM7Ci0gICAgICByZWZWYWwgID0gbWluVmFsIDw8IGxlYWRpbmdCaXRzOworICAgICAgcmVmVmFsID0gbWluVmFsIDw8IGxlYWRpbmdCaXRzOwogCiAgICAgICAvKiBjYWxjdWxhdGUgZnV6enkgdmFsdWUgZm9yIHBvd2VyIGRpc3RyaWJ1dGlvbiAqLwogICAgICAgdGVzdFZhbCA9IGZNdWx0RGl2Mih0ZXN0VmFsLCBucC0+cG93RGlzdFBTRGN1cnZlW3NmYl0pOwogCi0gICAgICBmdXp6eSA9IEZES2FhY0VuY19mdXp6eUlzU21hbGxlcih0ZXN0VmFsLCAgICAgICAgICAgLyogMS8yICogbWF4VmFsdWUgKiBQU0RjdXJ2ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZWYWwsICAgICAgICAgICAgLyogMSAgICogbWluVmFsdWUgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjQ5NSksICAvKiAxLzIgKiBsb0xpbSAgKDAuOTlmLzIpICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNTA1KSk7IC8qIDEvMiAqIGhpTGltICAoMS4wMWYvMikgICAgKi8KKyAgICAgIGZ1enp5ID0gRkRLYWFjRW5jX2Z1enp5SXNTbWFsbGVyKAorICAgICAgICAgIHRlc3RWYWwsICAgICAgICAgICAgICAgIC8qIDEvMiAqIG1heFZhbHVlICogUFNEY3VydmUgKi8KKyAgICAgICAgICByZWZWYWwsICAgICAgICAgICAgICAgICAvKiAxICAgKiBtaW5WYWx1ZSAgICAgICAgICAgICovCisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC40OTUpLCAgLyogMS8yICogbG9MaW0gICgwLjk5Zi8yKSAgICAqLworICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNTA1KSk7IC8qIDEvMiAqIGhpTGltICAoMS4wMWYvMikgICAgKi8KIAogICAgICAgZnV6enlUb3RhbCA9IGZpeE1pbihmdXp6eVRvdGFsLCBmdXp6eSk7CiAgICAgfQogCi0gICAgaWYgKCAobnAtPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzICYgVVNFX1BTWUNIX1RPTkFMSVRZKSAmJiAoZnV6enlUb3RhbCA+IEZMMkZYQ09OU1RfU0dMKDAuNWYpKSApIHsKKyAgICBpZiAoKG5wLT5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIFVTRV9QU1lDSF9UT05BTElUWSkgJiYKKyAgICAgICAgKGZ1enp5VG90YWwgPiBGTDJGWENPTlNUX1NHTCgwLjVmKSkpIHsKICAgICAgIC8qIERldGVjdGlvbiB3aXRoIHRvbmFsaXR5LXZhbHVlIG9mIHBzeWNoLiBhY291c3RpYyAoaGVyZTogMSBpcyB0b25hbCEpKi8KIAotICAgICAgdGVzdFZhbCA9IEZYX1NHTDJGWF9EQkwoc2ZidG9uYWxpdHlbc2ZiXSk+PjE7ICAgICAgICAgIC8qIDEvMiAqIHNmYlRvbmFsaXR5ICAgICAgICAgKi8KLSAgICAgIHJlZlZhbCAgPSBucC0+cmVmVG9uYWxpdHk7CisgICAgICB0ZXN0VmFsID0gRlhfU0dMMkZYX0RCTChzZmJ0b25hbGl0eVtzZmJdKSA+PiAxOyAvKiAxLzIgKiBzZmJUb25hbGl0eSAqLworICAgICAgcmVmVmFsID0gbnAtPnJlZlRvbmFsaXR5OwogCi0gICAgICBmdXp6eSAgID0gRkRLYWFjRW5jX2Z1enp5SXNTbWFsbGVyKHRlc3RWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNDVmKSwgICAgLyogMS8yICogbG9MaW0gICgwLjlmLzIpICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNTVmKSk7ICAgLyogMS8yICogaGlMaW0gICgxLjFmLzIpICAgICAqLworICAgICAgZnV6enkgPSBGREthYWNFbmNfZnV6enlJc1NtYWxsZXIoCisgICAgICAgICAgdGVzdFZhbCwgcmVmVmFsLCBGTDJGWENPTlNUX0RCTCgwLjQ1ZiksIC8qIDEvMiAqIGxvTGltICAoMC45Zi8yKSAqLworICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNTVmKSk7IC8qIDEvMiAqIGhpTGltICAoMS4xZi8yKSAgICAgKi8KIAogICAgICAgZnV6enlUb3RhbCA9IGZpeE1pbihmdXp6eVRvdGFsLCBmdXp6eSk7CiAgICAgfQogCi0KICAgICAvKiBPdXRwdXQgb2YgZmluYWwgcmVzdWx0ICovCiAgICAgbm9pc2VGdXp6eU1lYXN1cmVbc2ZiXSA9IGZ1enp5VG90YWw7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvbm9pc2VkZXQuaCBiL2xpYkFBQ2VuYy9zcmMvbm9pc2VkZXQuaAppbmRleCA4ZDVlMzY1Li40Nzg3MDFmIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL25vaXNlZGV0LmgKKysrIGIvbGliQUFDZW5jL3NyYy9ub2lzZWRldC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDMwICs5MCwyNyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBMb2h3YXNzZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBub2lzZWRldC5oCisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBub2lzZWRldC5oCiAKLSNpZm5kZWYgX19OT0lTRURFVF9ICi0jZGVmaW5lIF9fTk9JU0VERVRfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBOT0lTRURFVF9ICisjZGVmaW5lIE5PSVNFREVUX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogI2luY2x1ZGUgInBuc3BhcmFtLmgiCiAjaW5jbHVkZSAicHN5X2RhdGEuaCIKIAordm9pZCBGREthYWNFbmNfbm9pc2VEZXRlY3QoRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwgSU5UICpzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2ZiQWN0aXZlLCBjb25zdCBJTlQgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMIG5vaXNlRnV6enlNZWFzdXJlW10sIE5PSVNFUEFSQU1TICpucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICpzZmJ0b25hbGl0eSk7CiAKLXZvaWQgRkRLYWFjRW5jX25vaXNlRGV0ZWN0KCBGSVhQX0RCTCAgICAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKnNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgIG5vaXNlRnV6enlNZWFzdXJlW10sCi0gICAgICAgICAgICAgICAgICBOT0lTRVBBUkFNUyAqbnAsCi0gICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICAqc2ZidG9uYWxpdHkgKTsKLQotI2VuZGlmCisjZW5kaWYgLyogTk9JU0VERVRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9wbnNfZnVuYy5oIGIvbGliQUFDZW5jL3NyYy9wbnNfZnVuYy5oCmluZGV4IGVmYTQ0ZWYuLjg4ZjQ1ODYgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcG5zX2Z1bmMuaAorKysgYi9saWJBQUNlbmMvc3JjL3Buc19mdW5jLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNzIgKzkwLDQ5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIExvaHdhc3NlcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IHBuc19mdW5jLmgKKyAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IHBuc19mdW5jLmgKIAotI2lmbmRlZiBfUE5TX0ZVTkNfSAotI2RlZmluZSBfUE5TX0ZVTkNfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBQTlNfRlVOQ19ICisjZGVmaW5lIFBOU19GVU5DX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKLQogI2luY2x1ZGUgImFhY2VuY19wbnMuaCIKICNpbmNsdWRlICJwc3lfZGF0YS5oIgogCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFBuc0NvbmZpZ3VyYXRpb24oCisgICAgUE5TX0NPTkZJRyAqcG5zQ29uZiwgSU5UIGJpdFJhdGUsIElOVCBzYW1wbGVSYXRlLCBJTlQgdXNlUG5zLCBJTlQgc2ZiQ250LAorICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LCBjb25zdCBJTlQgbnVtQ2hhbiwgY29uc3QgSU5UIGlzTEMpOwogCit2b2lkIEZES2FhY0VuY19QbnNEZXRlY3QoUE5TX0NPTkZJRyAqcG5zQ29uZiwgUE5TX0RBVEEgKnBuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGxhc3RXaW5kb3dTZXF1ZW5jZSwgY29uc3QgSU5UIHNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWF4U2ZiUGVyR3JvdXAsIEZJWFBfREJMICpzZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpzZmJPZmZzZXQsIEZJWFBfREJMICptZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzZmJNYXhTY2FsZVNwZWMsIEZJWFBfU0dMICpzZmJ0b25hbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG5zT3JkZXIsIElOVCB0bnNQcmVkaWN0aW9uR2FpbiwgSU5UIHRuc0FjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRW5lcmd5TGREYXRhLCBJTlQgKm5vaXNlTnJnKTsKIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRQbnNDb25maWd1cmF0aW9uKFBOU19DT05GSUcgKnBuc0NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIHVzZVBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICBudW1DaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgaXNMQyApOwordm9pZCBGREthYWNFbmNfQ29kZVBuc0NoYW5uZWwoY29uc3QgSU5UIHNmYkFjdGl2ZSwgUE5TX0NPTkZJRyAqcG5zQ29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcG5zRmxhZywgRklYUF9EQkwgKnNmYkVuZXJneSwgSU5UICpub2lzZU5yZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJUaHJlc2hvbGQpOwogCi12b2lkIEZES2FhY0VuY19QbnNEZXRlY3QoIFBOU19DT05GSUcgICpwbnNDb25mLAotICAgICAgICAgICAgICAgIFBOU19EQVRBICAgICpwbnNEYXRhLAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIGxhc3RXaW5kb3dTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnNmYlRocmVzaG9sZExkRGF0YSwKLSAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgSU5UICAgICAgICAgKnNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICAqc2ZidG9uYWxpdHksCi0gICAgICAgICAgICAgICAgaW50ICAgICAgICAgdG5zT3JkZXIsCi0gICAgICAgICAgICAgICAgSU5UICAgICAgICAgdG5zUHJlZGljdGlvbkdhaW4sCi0gICAgICAgICAgICAgICAgSU5UICAgICAgICAgdG5zQWN0aXZlLAotICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpzZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgSU5UICAgICAgICAgKm5vaXNlTnJnICk7Cit2b2lkIEZES2FhY0VuY19QcmVQcm9jZXNzUG5zQ2hhbm5lbFBhaXIoCisgICAgY29uc3QgSU5UIHNmYkFjdGl2ZSwgRklYUF9EQkwgKnNmYkVuZXJneUxlZnQsIEZJWFBfREJMICpzZmJFbmVyZ3lSaWdodCwKKyAgICBGSVhQX0RCTCAqc2ZiRW5lcmd5TGVmdExELCBGSVhQX0RCTCAqc2ZiRW5lcmd5UmlnaHRMRCwKKyAgICBGSVhQX0RCTCAqc2ZiRW5lcmd5TWlkLCBQTlNfQ09ORklHICpwbnNDb25mTGVmdCwgUE5TX0RBVEEgKnBuc0RhdGFMZWZ0LAorICAgIFBOU19EQVRBICpwbnNEYXRhUmlnaHQpOwogCi12b2lkIEZES2FhY0VuY19Db2RlUG5zQ2hhbm5lbCggY29uc3QgSU5UICAgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICBQTlNfQ09ORklHICAgICpwbnNDb25mLAotICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAqcG5zRmxhZywKLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKnNmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgKm5vaXNlTnJnLAotICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqc2ZiVGhyZXNob2xkICk7Cit2b2lkIEZES2FhY0VuY19Qb3N0UHJvY2Vzc1Buc0NoYW5uZWxQYWlyKGNvbnN0IElOVCBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19DT05GSUcgKnBuc0NvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICpwbnNEYXRhTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5TX0RBVEEgKnBuc0RhdGFSaWdodCwgSU5UICptc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbXNEaWdlc3QpOwogCi12b2lkIEZES2FhY0VuY19QcmVQcm9jZXNzUG5zQ2hhbm5lbFBhaXIoIGNvbnN0IElOVCAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKnNmYkVuZXJneUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqc2ZiRW5lcmd5UmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqc2ZiRW5lcmd5TGVmdExELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKnNmYkVuZXJneVJpZ2h0TEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqc2ZiRW5lcmd5TWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19DT05GSUcgKnBuc0NvbmZMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgKnBuc0RhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgKnBuc0RhdGFSaWdodCApOwotCi12b2lkIEZES2FhY0VuY19Qb3N0UHJvY2Vzc1Buc0NoYW5uZWxQYWlyKCBjb25zdCBJTlQgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19DT05GSUcgICpwbnNDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgICpwbnNEYXRhUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICptc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICptc0RpZ2VzdCApOwotCi0jZW5kaWYgLyogX1BOU19GVU5DX0ggKi8KKyNlbmRpZiAvKiBQTlNfRlVOQ19IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmNwcCBiL2xpYkFBQ2VuYy9zcmMvcG5zcGFyYW0uY3BwCmluZGV4IDlkNTlkZGMuLmE2YWFiMDYgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcG5zcGFyYW0uY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvcG5zcGFyYW0uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDMxICs5MCwzMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLkxvaHdhc3NlcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFBOUyBwYXJhbWV0ZXJzIGRlcGVuZGluZyBvbiBiaXRyYXRlIGFuZCBiYW5kd2lkdGgKKyAgIEF1dGhvcihzKTogICBNLkxvaHdhc3NlcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUE5TIHBhcmFtZXRlcnMgZGVwZW5kaW5nIG9uIGJpdHJhdGUgYW5kIGJhbmR3aWR0aAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAicG5zcGFyYW0uaCIKKwogI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgU0hPUlQgICAgIHN0YXJ0RnJlcTsKKyAgU0hPUlQgc3RhcnRGcmVxOwogICAvKiBQYXJhbWV0ZXJzIGZvciBkZXRlY3Rpb24gKi8KLSAgRklYUF9TR0wgIHJlZlBvd2VyOwotICBGSVhQX1NHTCAgcmVmVG9uYWxpdHk7Ci0gIFNIT1JUICAgICB0bnNHYWluVGhyZXNob2xkOyAgICAgLyogc2NhbGVkIGJ5IFROU19QUkVER0FJTl9TQ0FMRSAoPTEwMDApICovCi0gIFNIT1JUICAgICB0bnNQTlNHYWluVGhyZXNob2xkOyAgLyogc2NhbGVkIGJ5IFROU19QUkVER0FJTl9TQ0FMRSAoPTEwMDApICovCi0gIEZJWFBfU0dMICBnYXBGaWxsVGhyOwotICBTSE9SVCAgICAgbWluU2ZiV2lkdGg7Ci0gIFVTSE9SVCAgICBkZXRlY3Rpb25BbGdvcml0aG1GbGFnczsKKyAgRklYUF9TR0wgcmVmUG93ZXI7CisgIEZJWFBfU0dMIHJlZlRvbmFsaXR5OworICBTSE9SVCB0bnNHYWluVGhyZXNob2xkOyAgICAvKiBzY2FsZWQgYnkgVE5TX1BSRURHQUlOX1NDQUxFICg9MTAwMCkgKi8KKyAgU0hPUlQgdG5zUE5TR2FpblRocmVzaG9sZDsgLyogc2NhbGVkIGJ5IFROU19QUkVER0FJTl9TQ0FMRSAoPTEwMDApICovCisgIEZJWFBfU0dMIGdhcEZpbGxUaHI7CisgIFNIT1JUIG1pblNmYldpZHRoOworICBVU0hPUlQgZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3M7CiB9IFBOU19JTkZPX1RBQjsKIAotCiB0eXBlZGVmIHN0cnVjdCB7CiAgIFVMT05HIGJyRnJvbTsKICAgVUxPTkcgYnJUbzsKQEAgLTExNSwxOTcgKzEyNyw0NDggQEAKICAgVUNIQVIgUzQ4MDAwOwogfSBBVVRPX1BOU19UQUI7CiAKLXN0YXRpYyBjb25zdCBBVVRPX1BOU19UQUIgbGV2ZWxUYWJsZV9tb25vW109IHsKLSAgezAsICAgICAgMTE5OTksIDAsIDEsIDEsIDEsIDEsIDEsfSwKLSAgezEyMDAwLCAgMTk5OTksIDAsIDEsIDEsIDEsIDEsIDEsfSwKLSAgezIwMDAwLCAgMjg5OTksIDAsIDIsIDEsIDEsIDEsIDEsfSwKLSAgezI5MDAwLCAgNDA5OTksIDAsIDQsIDQsIDQsIDIsIDIsfSwKLSAgezQxMDAwLCAgNTU5OTksIDAsIDksIDksIDcsIDcsIDcsfSwKLSAgezU2MDAwLCAgNjE5OTksIDAsIDAsIDAsIDAsIDksIDksfSwKLSAgezYyMDAwLCAgNzU5OTksIDAsIDAsIDAsIDAsIDAsIDAsfSwKLSAgezc2MDAwLCAgOTI5OTksIDAsIDAsIDAsIDAsIDAsIDAsfSwKLSAgezkzMDAwLCA5OTk5OTksIDAsIDAsIDAsIDAsIDAsIDAsfSwKK3N0YXRpYyBjb25zdCBBVVRPX1BOU19UQUIgbGV2ZWxUYWJsZV9tb25vW10gPSB7CisgICAgeworICAgICAgICAwLAorICAgICAgICAxMTk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTIwMDAsCisgICAgICAgIDE5OTk5LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgIH0sCisgICAgeworICAgICAgICAyMDAwMCwKKyAgICAgICAgMjg5OTksCisgICAgICAgIDAsCisgICAgICAgIDIsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgfSwKKyAgICB7CisgICAgICAgIDI5MDAwLAorICAgICAgICA0MDk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgNCwKKyAgICAgICAgNCwKKyAgICAgICAgNCwKKyAgICAgICAgMiwKKyAgICAgICAgMiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgNDEwMDAsCisgICAgICAgIDU1OTk5LAorICAgICAgICAwLAorICAgICAgICA5LAorICAgICAgICA5LAorICAgICAgICA3LAorICAgICAgICA3LAorICAgICAgICA3LAorICAgIH0sCisgICAgeworICAgICAgICA1NjAwMCwKKyAgICAgICAgNjE5OTksCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDksCisgICAgICAgIDksCisgICAgfSwKKyAgICB7CisgICAgICAgIDYyMDAwLAorICAgICAgICA3NTk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgNzYwMDAsCisgICAgICAgIDkyOTk5LAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgIH0sCisgICAgeworICAgICAgICA5MzAwMCwKKyAgICAgICAgOTk5OTk5LAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgIH0sCiB9OwogCi1zdGF0aWMgY29uc3QgQVVUT19QTlNfVEFCIGxldmVsVGFibGVfc3RlcmVvW109IHsKLSAgezAsICAgICAgMTE5OTksIDAsIDEsIDEsIDEsIDEsIDEsfSwKLSAgezEyMDAwLCAgMTk5OTksIDAsIDMsIDEsIDEsIDEsIDEsfSwKLSAgezIwMDAwLCAgMjg5OTksIDAsIDMsIDMsIDMsIDIsIDIsfSwKLSAgezI5MDAwLCAgNDA5OTksIDAsIDcsIDYsIDYsIDUsIDUsfSwKLSAgezQxMDAwLCAgNTU5OTksIDAsIDksIDksIDcsIDcsIDcsfSwKLSAgezU2MDAwLCAgNzk5OTksIDAsIDAsIDAsIDAsIDAsIDAsfSwKLSAgezgwMDAwLCAgOTk5OTksIDAsIDAsIDAsIDAsIDAsIDAsfSwKLSAgezEwMDAwMCw5OTk5OTksIDAsIDAsIDAsIDAsIDAsIDAsfSwKK3N0YXRpYyBjb25zdCBBVVRPX1BOU19UQUIgbGV2ZWxUYWJsZV9zdGVyZW9bXSA9IHsKKyAgICB7CisgICAgICAgIDAsCisgICAgICAgIDExOTk5LAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgIH0sCisgICAgeworICAgICAgICAxMjAwMCwKKyAgICAgICAgMTk5OTksCisgICAgICAgIDAsCisgICAgICAgIDMsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgfSwKKyAgICB7CisgICAgICAgIDIwMDAwLAorICAgICAgICAyODk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMywKKyAgICAgICAgMywKKyAgICAgICAgMywKKyAgICAgICAgMiwKKyAgICAgICAgMiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgMjkwMDAsCisgICAgICAgIDQwOTk5LAorICAgICAgICAwLAorICAgICAgICA3LAorICAgICAgICA2LAorICAgICAgICA2LAorICAgICAgICA1LAorICAgICAgICA1LAorICAgIH0sCisgICAgeworICAgICAgICA0MTAwMCwKKyAgICAgICAgNTU5OTksCisgICAgICAgIDAsCisgICAgICAgIDksCisgICAgICAgIDksCisgICAgICAgIDcsCisgICAgICAgIDcsCisgICAgICAgIDcsCisgICAgfSwKKyAgICB7CisgICAgICAgIDU2MDAwLAorICAgICAgICA3OTk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgODAwMDAsCisgICAgICAgIDk5OTk5LAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgIH0sCisgICAgeworICAgICAgICAxMDAwMDAsCisgICAgICAgIDk5OTk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICB9LAogfTsKIAotCiBzdGF0aWMgY29uc3QgUE5TX0lORk9fVEFCIHBuc0luZm9UYWJbXSA9IHsKLS8qMCAgIHBucyBvZmYgKi8KLS8qMSovIHsgNDAwMCwgRkwyRlhDT05TVF9TR0woMC4wNCksIEZMMkZYQ09OU1RfU0dMKDAuMDYpLCAxMTUwLCAxMjAwLCBGTDJGWENPTlNUX1NHTCgwLjAyKSwgOCwKLSAgICAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfCBVU0VfVE5TX1BOUyAvKnwgSlVTVF9MT05HX1dJTkRPVyovIH0sCi0vKjIqLyB7IDQwMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDQpLCBGTDJGWENPTlNUX1NHTCgwLjA3KSwgMTEzMCwgMTMwMCwgRkwyRlhDT05TVF9TR0woMC4wNSksIDgsCi0gICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgLyp8IEpVU1RfTE9OR19XSU5ET1cqLyB9LAotLyozKi8geyA0MTAwLCBGTDJGWENPTlNUX1NHTCgwLjA0KSwgRkwyRlhDT05TVF9TR0woMC4wNyksIDExMDAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuMTApLCA4LAotICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIC8qfCBKVVNUX0xPTkdfV0lORE9XKi8gfSwKLS8qNCovIHsgNDEwMCwgRkwyRlhDT05TVF9TR0woMC4wMyksIEZMMkZYQ09OU1RfU0dMKDAuMTApLCAxMTAwLCAxNDAwLCBGTDJGWENPTlNUX1NHTCgwLjE1KSwgOCwKLSAgICAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfCBVU0VfVE5TX1BOUyAvKnwgSlVTVF9MT05HX1dJTkRPVyovIH0sCi0vKjUqLyB7IDQzMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDMpLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgMTEwMCwgMTQwMCwgRkwyRlhDT05TVF9TR0woMC4xNSksIDgsCi0gICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XIH0sCi0vKjYqLyB7IDUwMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDMpLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgMTEwMCwgMTQwMCwgRkwyRlhDT05TVF9TR0woMC4yNSksIDgsCi0gICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XIH0sCi0vKjcqLyB7IDU1MDAsIEZMMkZYQ09OU1RfU0dMKDAuMDMpLCBGTDJGWENPTlNUX1NHTCgwLjEyKSwgMTEwMCwgMTQwMCwgRkwyRlhDT05TVF9TR0woMC4zNSksIDgsCi0gICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XIH0sCi0vKjgqLyB7IDYwMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDMpLCBGTDJGWENPTlNUX1NHTCgwLjEyKSwgMTA4MCwgMTQwMCwgRkwyRlhDT05TVF9TR0woMC40MCksIDgsCi0gICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XIH0sCi0vKjkqLyB7IDYwMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDMpLCBGTDJGWENPTlNUX1NHTCgwLjE0KSwgMTA3MCwgMTQwMCwgRkwyRlhDT05TVF9TR0woMC40NSksIDgsCi0gICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XIH0sCisgICAgLyowICAgcG5zIG9mZiAqLworICAgIC8qMSovIHs0MDAwLCBGTDJGWENPTlNUX1NHTCgwLjA0KSwgRkwyRlhDT05TVF9TR0woMC4wNiksIDExNTAsIDEyMDAsCisgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDIpLCA4LAorICAgICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8CisgICAgICAgICAgICAgICBVU0VfVE5TX1BOUyAvKnwgSlVTVF9MT05HX1dJTkRPVyovfSwKKyAgICAvKjIqLworICAgIHs0MDAwLCBGTDJGWENPTlNUX1NHTCgwLjA0KSwgRkwyRlhDT05TVF9TR0woMC4wNyksIDExMzAsIDEzMDAsCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDUpLCA4LAorICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8CisgICAgICAgICBVU0VfVE5TX1BOUyAvKnwgSlVTVF9MT05HX1dJTkRPVyovfSwKKyAgICAvKjMqLworICAgIHs0MTAwLCBGTDJGWENPTlNUX1NHTCgwLjA0KSwgRkwyRlhDT05TVF9TR0woMC4wNyksIDExMDAsIDE0MDAsCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMTApLCA4LAorICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8CisgICAgICAgICBVU0VfVE5TX1BOUyAvKnwgSlVTVF9MT05HX1dJTkRPVyovfSwKKyAgICAvKjQqLworICAgIHs0MTAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDExMDAsIDE0MDAsCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMTUpLCA4LAorICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8CisgICAgICAgICBVU0VfVE5TX1BOUyAvKnwgSlVTVF9MT05HX1dJTkRPVyovfSwKKyAgICAvKjUqLworICAgIHs0MzAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDExMDAsIDE0MDAsCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMTUpLCA4LAorICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8CisgICAgICAgICBVU0VfVE5TX1BOUyB8IEpVU1RfTE9OR19XSU5ET1d9LAorICAgIC8qNiovCisgICAgezUwMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDMpLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgMTEwMCwgMTQwMCwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yNSksIDgsCisgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwKKyAgICAgICAgIFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPV30sCisgICAgLyo3Ki8KKyAgICB7NTUwMCwgRkwyRlhDT05TVF9TR0woMC4wMyksIEZMMkZYQ09OU1RfU0dMKDAuMTIpLCAxMTAwLCAxNDAwLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM1KSwgOCwKKyAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfAorICAgICAgICAgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XfSwKKyAgICAvKjgqLworICAgIHs2MDAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMiksIDEwODAsIDE0MDAsCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDApLCA4LAorICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8CisgICAgICAgICBVU0VfVE5TX1BOUyB8IEpVU1RfTE9OR19XSU5ET1d9LAorICAgIC8qOSovCisgICAgezYwMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDMpLCBGTDJGWENPTlNUX1NHTCgwLjE0KSwgMTA3MCwgMTQwMCwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40NSksIDgsCisgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwKKyAgICAgICAgIFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPV30sCiB9OwogCi1zdGF0aWMgY29uc3QgQVVUT19QTlNfVEFCIGxldmVsVGFibGVfbG93Q29tcGxleGl0eVtdPSB7Ci0gIHswLCAgICAgIDI3OTk5LCAwLCAwLCAwLCAwLCAwLCAwLH0sCi0gIHsyODAwMCwgIDMxOTk5LCAwLCAyLCAyLCAyLCAyLCAyLH0sCi0gIHszMjAwMCwgIDQ3OTk5LCAwLCAzLCAzLCAzLCAzLCAzLH0sCi0gIHs0ODAwMCwgIDQ4MDAwLCAwLCA0LCA0LCA0LCA0LCA0LH0sCi0gIHs0ODAwMSwgOTk5OTk5LCAwLCAwLCAwLCAwLCAwLCAwLH0sCitzdGF0aWMgY29uc3QgQVVUT19QTlNfVEFCIGxldmVsVGFibGVfbG93Q29tcGxleGl0eVtdID0geworICAgIHsKKyAgICAgICAgMCwKKyAgICAgICAgMjc5OTksCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgfSwKKyAgICB7CisgICAgICAgIDI4MDAwLAorICAgICAgICAzMTk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMiwKKyAgICAgICAgMiwKKyAgICAgICAgMiwKKyAgICAgICAgMiwKKyAgICAgICAgMiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgMzIwMDAsCisgICAgICAgIDQ3OTk5LAorICAgICAgICAwLAorICAgICAgICAzLAorICAgICAgICAzLAorICAgICAgICAzLAorICAgICAgICAzLAorICAgICAgICAzLAorICAgIH0sCisgICAgeworICAgICAgICA0ODAwMCwKKyAgICAgICAgNDgwMDAsCisgICAgICAgIDAsCisgICAgICAgIDQsCisgICAgICAgIDQsCisgICAgICAgIDQsCisgICAgICAgIDQsCisgICAgICAgIDQsCisgICAgfSwKKyAgICB7CisgICAgICAgIDQ4MDAxLAorICAgICAgICA5OTk5OTksCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgfSwKIH07Ci0KLS8qIGNvbnZlcnNpb24gb2Ygb2xkIExDIHR1bmluZyB0YWJsZXMgdG8gbmV3IChMRCBlbmMpIHN0cnVjdHVyZSAob25seSBlbnRyaWVzIHdoaWNoIGFyZSBhY3R1YWxseSB1c2VkIHdlcmUgY29udmVydGVkKSAqLworLyogY29udmVyc2lvbiBvZiBvbGQgTEMgdHVuaW5nIHRhYmxlcyB0byBuZXcgKExEIGVuYykgc3RydWN0dXJlIChvbmx5IGVudHJpZXMKKyAqIHdoaWNoIGFyZSBhY3R1YWxseSB1c2VkIHdlcmUgY29udmVydGVkKSAqLwogc3RhdGljIGNvbnN0IFBOU19JTkZPX1RBQiBwbnNJbmZvVGFiX2xvd0NvbXBsZXhpdHlbXSA9IHsKLS8qMCAgIHBucyBvZmYgKi8KLSAgICAgIC8qIERFRkFVTFQgcGFyYW1ldGVyIHNldCAqLwotLyoxKi8geyA0MTAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xNiksIDExMDAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuNSksIDE2LAotICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAotLyoyKi8geyA0MTAwLCBGTDJGWENPTlNUX1NHTCgwLjA1KSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDE0MTAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuNSksIDE2LAotICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAotLyozKi8geyA0MTAwLCBGTDJGWENPTlNUX1NHTCgwLjA1KSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDExMDAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuNSksIDE2LAotICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAotICAgICAgLyogTE9XU1VCU1QgLT4gUE5TIGlzIHVzZWQgbGVzcyBvZnRlbiB0aGFuIHdpdGggREVGQVVMVCBwYXJhbWV0ZXIgc2V0IChmb3IgYnI6IDQ4MDAwIC0gNzk5OTkpICovCi0vKjQqLyB7IDQxMDAsIEZMMkZYQ09OU1RfU0dMKDAuMjApLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgMTQxMCwgMTQwMCwgRkwyRlhDT05TVF9TR0woMC41KSwgMTYsCi0gICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XIH0sCisgICAgLyowICAgcG5zIG9mZiAqLworICAgIC8qIERFRkFVTFQgcGFyYW1ldGVyIHNldCAqLworICAgIC8qMSovIHs0MTAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xNiksIDExMDAsIDE0MDAsCisgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKDAuNSksIDE2LAorICAgICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8CisgICAgICAgICAgICAgICBVU0VfVE5TX1BOUyB8IEpVU1RfTE9OR19XSU5ET1d9LAorICAgIC8qMiovCisgICAgezQxMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDUpLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgMTQxMCwgMTQwMCwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41KSwgMTYsCisgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwKKyAgICAgICAgIFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPV30sCisgICAgLyozKi8KKyAgICB7NDEwMCwgRkwyRlhDT05TVF9TR0woMC4wNSksIEZMMkZYQ09OU1RfU0dMKDAuMTApLCAxMTAwLCAxNDAwLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjUpLCAxNiwKKyAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfAorICAgICAgICAgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XfSwKKyAgICAvKiBMT1dTVUJTVCAtPiBQTlMgaXMgdXNlZCBsZXNzIG9mdGVuIHRoYW4gd2l0aCBERUZBVUxUIHBhcmFtZXRlciBzZXQgKGZvcgorICAgICAgIGJyOiA0ODAwMCAtIDc5OTk5KSAqLworICAgIC8qNCovCisgICAgezQxMDAsIEZMMkZYQ09OU1RfU0dMKDAuMjApLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgMTQxMCwgMTQwMCwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41KSwgMTYsCisgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwKKyAgICAgICAgIFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPV30sCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICBmdW5jdGlvbiB0byBsb29rIHVwIHVzZWQgcG5zIGxldmVsCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IEZES2FhY0VuY19sb29rVXBQbnNVc2UgKGludCBiaXRSYXRlLCBpbnQgc2FtcGxlUmF0ZSwgaW50IG51bUNoYW4sIGNvbnN0IGludCBpc0xDKSB7Ci0KLSAgaW50IGhVc2VQbnM9MCwgc2l6ZSwgaTsKK2ludCBGREthYWNFbmNfbG9va1VwUG5zVXNlKGludCBiaXRSYXRlLCBpbnQgc2FtcGxlUmF0ZSwgaW50IG51bUNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXNMQykgeworICBpbnQgaFVzZVBucyA9IDAsIHNpemUsIGk7CiAgIGNvbnN0IEFVVE9fUE5TX1RBQiAqbGV2ZWxUYWJsZTsKIAogICBpZiAoaXNMQykgewogICAgIGxldmVsVGFibGUgPSAmbGV2ZWxUYWJsZV9sb3dDb21wbGV4aXR5WzBdOwogICAgIHNpemUgPSBzaXplb2YobGV2ZWxUYWJsZV9sb3dDb21wbGV4aXR5KTsKLSAgfSBlbHNlCi0gIHsgLyogKEUpTEQgKi8KKyAgfSBlbHNlIHsgLyogKEUpTEQgKi8KICAgICBsZXZlbFRhYmxlID0gKG51bUNoYW4gPiAxKSA/ICZsZXZlbFRhYmxlX3N0ZXJlb1swXSA6ICZsZXZlbFRhYmxlX21vbm9bMF07CiAgICAgc2l6ZSA9IChudW1DaGFuID4gMSkgPyBzaXplb2YobGV2ZWxUYWJsZV9zdGVyZW8pIDogc2l6ZW9mKGxldmVsVGFibGVfbW9ubyk7CiAgIH0KIAotICBmb3IoaSA9IDA7IGkgPCAoaW50KSAoc2l6ZS9zaXplb2YoQVVUT19QTlNfVEFCKSk7IGkrKykgewotICAgIGlmKCgoVUxPTkcpYml0UmF0ZSA+PSBsZXZlbFRhYmxlW2ldLmJyRnJvbSkgJiYKLSAgICAgICAoKFVMT05HKWJpdFJhdGUgPD0gbGV2ZWxUYWJsZVtpXS5iclRvKSApCisgIGZvciAoaSA9IDA7IGkgPCAoaW50KShzaXplIC8gc2l6ZW9mKEFVVE9fUE5TX1RBQikpOyBpKyspIHsKKyAgICBpZiAoKChVTE9ORyliaXRSYXRlID49IGxldmVsVGFibGVbaV0uYnJGcm9tKSAmJgorICAgICAgICAoKFVMT05HKWJpdFJhdGUgPD0gbGV2ZWxUYWJsZVtpXS5iclRvKSkKICAgICAgIGJyZWFrOwogICB9CiAKICAgLyogc2FuaXR5IGNoZWNrICovCi0gIGlmICgoaW50KShzaXplb2YocG5zSW5mb1RhYikvc2l6ZW9mKFBOU19JTkZPX1RBQikpIDwgaSApIHsKKyAgaWYgKChpbnQpKHNpemVvZihwbnNJbmZvVGFiKSAvIHNpemVvZihQTlNfSU5GT19UQUIpKSA8IGkpIHsKICAgICByZXR1cm4gKFBOU19UQUJMRV9FUlJPUik7CiAgIH0KIAogICBzd2l0Y2ggKHNhbXBsZVJhdGUpIHsKLSAgY2FzZSAxNjAwMDogaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzE2MDAwOyBicmVhazsKLSAgY2FzZSAyMjA1MDogaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzIyMDUwOyBicmVhazsKLSAgY2FzZSAyNDAwMDogaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzI0MDAwOyBicmVhazsKLSAgY2FzZSAzMjAwMDogaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzMyMDAwOyBicmVhazsKLSAgY2FzZSA0NDEwMDogaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzQ0MTAwOyBicmVhazsKLSAgY2FzZSA0ODAwMDogaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzQ4MDAwOyBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBpZiAoaXNMQykgeworICAgIGNhc2UgMTYwMDA6CisgICAgICBoVXNlUG5zID0gbGV2ZWxUYWJsZVtpXS5TMTYwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDIyMDUwOgorICAgICAgaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzIyMDUwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIGhVc2VQbnMgPSBsZXZlbFRhYmxlW2ldLlMyNDAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzIwMDA6CisgICAgICBoVXNlUG5zID0gbGV2ZWxUYWJsZVtpXS5TMzIwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ0MTAwOgorICAgICAgaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzQ0MTAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMDoKICAgICAgIGhVc2VQbnMgPSBsZXZlbFRhYmxlW2ldLlM0ODAwMDsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGlzTEMpIHsKKyAgICAgICAgaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzQ4MDAwOworICAgICAgfQorICAgICAgYnJlYWs7CiAgIH0KIAogICByZXR1cm4gKGhVc2VQbnMpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfR2V0UG5zUGFyYW0KLSAgICBkZXNjcmlwdGlvbjogIEdldHMgUE5TIHBhcmFtZXRlcnMgZGVwZW5kaW5nIG9uIGJpdHJhdGUgYW5kIGJhbmR3aWR0aAorICAgIGRlc2NyaXB0aW9uOiAgR2V0cyBQTlMgcGFyYW1ldGVycyBkZXBlbmRpbmcgb24gYml0cmF0ZSBhbmQgYmFuZHdpZHRoIG9yCisgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJMaW5lCiAgICAgcmV0dXJuczogICAgICBlcnJvciBzdGF0dXMKICAgICBpbnB1dDogICAgICAgIE5vaXNlcGFyYW1zIHN0cnVjdCwgYml0cmF0ZSwgc2FtcGxpbmcgcmF0ZSwKICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBzZmIncywgcG9pbnRlciB0byBzZmIgb2Zmc2V0CiAgICAgb3V0cHV0OiAgICAgICBQTlMgcGFyYW1ldGVycwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19HZXRQbnNQYXJhbShOT0lTRVBBUkFNUyAqbnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICp1c2VQbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbnVtQ2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICBpc0xDKQorQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0dldFBuc1BhcmFtKE5PSVNFUEFSQU1TICpucCwgSU5UIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsIElOVCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpzZmJPZmZzZXQsIElOVCAqdXNlUG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1DaGFuLCBjb25zdCBJTlQgaXNMQykgeworICBpbnQgaSwgaFVzZVBuczsKKyAgY29uc3QgUE5TX0lORk9fVEFCICpwbnNJbmZvOwogCi17Ci0gICAgaW50IGksIGhVc2VQbnM7Ci0gICAgY29uc3QgUE5TX0lORk9fVEFCICpwbnNJbmZvOworICBpZiAoKnVzZVBucyA8PSAwKSByZXR1cm4gQUFDX0VOQ19PSzsKIAotICAgIGlmIChpc0xDKSB7Ci0gICAgICBucC0+ZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgPSBJU19MT1dfQ09NTEVYSVRZOwotICAgICAgcG5zSW5mbyA9IHBuc0luZm9UYWJfbG93Q29tcGxleGl0eTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG5wLT5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyA9IDA7Ci0gICAgICBwbnNJbmZvID0gcG5zSW5mb1RhYjsKLSAgICB9CisgIGlmIChpc0xDKSB7CisgICAgbnAtPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzID0gSVNfTE9XX0NPTVBMRVhJVFk7CiAKLSAgICBpZiAoKnVzZVBuczw9MCkKLSAgICAgICAgcmV0dXJuIEFBQ19FTkNfT0s7CisgICAgcG5zSW5mbyA9IHBuc0luZm9UYWJfbG93Q29tcGxleGl0eTsKIAogICAgIC8qIG5ldyBwbnMgcGFyYW1zICovCi0gICAgaFVzZVBucyA9IEZES2FhY0VuY19sb29rVXBQbnNVc2UgKGJpdFJhdGUsIHNhbXBsZVJhdGUsIG51bUNoYW4sIGlzTEMpOworICAgIGhVc2VQbnMgPSBGREthYWNFbmNfbG9va1VwUG5zVXNlKGJpdFJhdGUsIHNhbXBsZVJhdGUsIG51bUNoYW4sIGlzTEMpOwogICAgIGlmIChoVXNlUG5zID09IDApIHsKICAgICAgICp1c2VQbnMgPSAwOwotICAgICAgICByZXR1cm4gQUFDX0VOQ19PSzsKLSAgICAgICAgfQotICAgIGlmIChoVXNlUG5zID09IFBOU19UQUJMRV9FUlJPUikKKyAgICAgIHJldHVybiBBQUNfRU5DX09LOworICAgIH0KKworICAgIGlmIChoVXNlUG5zID09IFBOU19UQUJMRV9FUlJPUikgewogICAgICAgcmV0dXJuIEFBQ19FTkNfUE5TX1RBQkxFX0VSUk9SOworICAgIH0KIAogICAgIC8qIHNlbGVjdCBjb3JyZWN0IHJvdyBvZiB0dW5pbmcgdGFibGUgKi8KLSAgICBwbnNJbmZvICs9IGhVc2VQbnMtMTsKKyAgICBwbnNJbmZvICs9IGhVc2VQbnMgLSAxOwogCi0gICAgbnAtPnN0YXJ0U2ZiID0gRkRLYWFjRW5jX0ZyZXFUb0JhbmRXaXRoUm91bmRpbmcoIHBuc0luZm8tPnN0YXJ0RnJlcSwKLSAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgc2ZiQ250LAotICAgICAgICBzZmJPZmZzZXQgKTsKKyAgfSBlbHNlIHsKKyAgICBucC0+ZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgPSAwOworICAgIHBuc0luZm8gPSBwbnNJbmZvVGFiOwogCi0gICAgbnAtPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzIHw9IHBuc0luZm8tPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzOwotCi0gICAgbnAtPnJlZlBvd2VyICAgICAgICAgICAgID0gRlhfU0dMMkZYX0RCTChwbnNJbmZvLT5yZWZQb3dlcik7Ci0gICAgbnAtPnJlZlRvbmFsaXR5ICAgICAgICAgID0gRlhfU0dMMkZYX0RCTChwbnNJbmZvLT5yZWZUb25hbGl0eSk7Ci0gICAgbnAtPnRuc0dhaW5UaHJlc2hvbGQgICAgID0gcG5zSW5mby0+dG5zR2FpblRocmVzaG9sZDsKLSAgICBucC0+dG5zUE5TR2FpblRocmVzaG9sZCAgPSBwbnNJbmZvLT50bnNQTlNHYWluVGhyZXNob2xkOwotICAgIG5wLT5taW5TZmJXaWR0aCAgICAgICAgICA9IHBuc0luZm8tPm1pblNmYldpZHRoOwotCi0gICAgbnAtPmdhcEZpbGxUaHIgICAgICAgICAgID0gKEZJWFBfU0dMKXBuc0luZm8tPmdhcEZpbGxUaHI7Ci0KLSAgICAvKiBhc3N1bWluZyBhIGNvbnN0YW50IGRCL0h6IHNsb3BlIGluIHRoZSBzaWduYWwncyBQU0QgY3VydmUsCi0gICAgdGhlIGRldGVjdGlvbiB0aHJlc2hvbGQgbmVlZHMgdG8gYmUgY29ycmVjdGVkIGZvciB0aGUgd2lkdGggb2YgdGhlIGJhbmQgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IChzZmJDbnQtMSk7IGkrKykKLSAgICB7Ci0gICAgICAgIElOVCBxdG1wLCBzZmJXaWR0aDsKLSAgICAgICAgRklYUF9EQkwgdG1wOwotCi0gICAgICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W2krMV0tc2ZiT2Zmc2V0W2ldOwotCi0gICAgICAgIHRtcCA9IGZQb3cobnAtPnJlZlBvd2VyLCAwLCBzZmJXaWR0aCwgREZSQUNUX0JJVFMtMS01LCAmcXRtcCk7Ci0gICAgICAgIG5wLT5wb3dEaXN0UFNEY3VydmVbaV0gPSAoRklYUF9TR0wpKChMT05HKShzY2FsZVZhbHVlKHRtcCwgcXRtcCkgPj4gMTYpKTsKKyAgICAvKiBuZXcgcG5zIHBhcmFtcyAqLworICAgIGhVc2VQbnMgPSBGREthYWNFbmNfbG9va1VwUG5zVXNlKGJpdFJhdGUsIHNhbXBsZVJhdGUsIG51bUNoYW4sIGlzTEMpOworICAgIGlmIChoVXNlUG5zID09IDApIHsKKyAgICAgICp1c2VQbnMgPSAwOworICAgICAgcmV0dXJuIEFBQ19FTkNfT0s7CiAgICAgfQotICAgIG5wLT5wb3dEaXN0UFNEY3VydmVbc2ZiQ250XSA9IG5wLT5wb3dEaXN0UFNEY3VydmVbc2ZiQ250LTFdOworICAgIGlmIChoVXNlUG5zID09IFBOU19UQUJMRV9FUlJPUikgcmV0dXJuIEFBQ19FTkNfUE5TX1RBQkxFX0VSUk9SOworCisgICAgLyogc2VsZWN0IGNvcnJlY3Qgcm93IG9mIHR1bmluZyB0YWJsZSAqLworICAgIHBuc0luZm8gKz0gaFVzZVBucyAtIDE7CisgIH0KKworICBucC0+c3RhcnRTZmIgPSBGREthYWNFbmNfRnJlcVRvQmFuZFdpZHRoUm91bmRpbmcoCisgICAgICBwbnNJbmZvLT5zdGFydEZyZXEsIHNhbXBsZVJhdGUsIHNmYkNudCwgc2ZiT2Zmc2V0KTsKKworICBucC0+ZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgfD0gcG5zSW5mby0+ZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3M7CisKKyAgbnAtPnJlZlBvd2VyID0gRlhfU0dMMkZYX0RCTChwbnNJbmZvLT5yZWZQb3dlcik7CisgIG5wLT5yZWZUb25hbGl0eSA9IEZYX1NHTDJGWF9EQkwocG5zSW5mby0+cmVmVG9uYWxpdHkpOworICBucC0+dG5zR2FpblRocmVzaG9sZCA9IHBuc0luZm8tPnRuc0dhaW5UaHJlc2hvbGQ7CisgIG5wLT50bnNQTlNHYWluVGhyZXNob2xkID0gcG5zSW5mby0+dG5zUE5TR2FpblRocmVzaG9sZDsKKyAgbnAtPm1pblNmYldpZHRoID0gcG5zSW5mby0+bWluU2ZiV2lkdGg7CisKKyAgbnAtPmdhcEZpbGxUaHIgPQorICAgICAgcG5zSW5mby0+Z2FwRmlsbFRocjsgLyogZm9yIExDIGl0IGlzIGFsd2F5cyBGTDJGWENPTlNUX1NHTCgwLjUpICovCisKKyAgLyogYXNzdW1pbmcgYSBjb25zdGFudCBkQi9IeiBzbG9wZSBpbiB0aGUgc2lnbmFsJ3MgUFNEIGN1cnZlLAorICAgIHRoZSBkZXRlY3Rpb24gdGhyZXNob2xkIG5lZWRzIHRvIGJlIGNvcnJlY3RlZCBmb3IgdGhlIHdpZHRoIG9mIHRoZSBiYW5kICovCisKKyAgZm9yIChpID0gMDsgaSA8IChzZmJDbnQgLSAxKTsgaSsrKSB7CisgICAgSU5UIHF0bXAsIHNmYldpZHRoOworICAgIEZJWFBfREJMIHRtcDsKKworICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W2kgKyAxXSAtIHNmYk9mZnNldFtpXTsKKworICAgIHRtcCA9IGZQb3cobnAtPnJlZlBvd2VyLCAwLCBzZmJXaWR0aCwgREZSQUNUX0JJVFMgLSAxIC0gNSwgJnF0bXApOworICAgIG5wLT5wb3dEaXN0UFNEY3VydmVbaV0gPSAoRklYUF9TR0wpKChMT05HKShzY2FsZVZhbHVlKHRtcCwgcXRtcCkgPj4gMTYpKTsKKyAgfQorICBucC0+cG93RGlzdFBTRGN1cnZlW3NmYkNudF0gPSBucC0+cG93RGlzdFBTRGN1cnZlW3NmYkNudCAtIDFdOwogCiAgIHJldHVybiBBQUNfRU5DX09LOwogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9wbnNwYXJhbS5oIGIvbGliQUFDZW5jL3NyYy9wbnNwYXJhbS5oCmluZGV4IDA4YmI4M2UuLmMzNzczOGEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcG5zcGFyYW0uaAorKysgYi9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzYgKzkwLDM2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIExvaHdhc3NlcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFBOUyBwYXJhbWV0ZXJzIGRlcGVuZGluZyBvbiBiaXRyYXRlIGFuZCBiYW5kd2lkdGgKKyAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBOUyBwYXJhbWV0ZXJzIGRlcGVuZGluZyBvbiBiaXRyYXRlIGFuZCBiYW5kd2lkdGgKIAotI2lmbmRlZiBfX1BOU1BBUkFNX0gKLSNkZWZpbmUgX19QTlNQQVJBTV9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBOU1BBUkFNX0gKKyNkZWZpbmUgUE5TUEFSQU1fSAogCiAjaW5jbHVkZSAiYWFjZW5jLmgiCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogCi0jZGVmaW5lIE5VTV9QTlNJTkZPVEFCICAgIDQKLSNkZWZpbmUgUE5TX1RBQkxFX0VSUk9SICAgLTEKKyNkZWZpbmUgTlVNX1BOU0lORk9UQUIgNAorI2RlZmluZSBQTlNfVEFCTEVfRVJST1IgLTEKIAogLyogZGV0ZWN0aW9uIGFsZ29yaXRobSBmbGFncyAqLwotI2RlZmluZSBVU0VfUE9XRVJfRElTVFJJQlVUSU9OICAgICAgICAgICAoMTw8MCkKLSNkZWZpbmUgVVNFX1BTWUNIX1RPTkFMSVRZICAgICAgICAgICAgICAgKDE8PDEpCi0jZGVmaW5lIFVTRV9UTlNfR0FJTl9USFIgICAgICAgICAgICAgICAgICgxPDwyKQotI2RlZmluZSBVU0VfVE5TX1BOUyAgICAgICAgICAgICAgICAgICAgICAoMTw8MykKLSNkZWZpbmUgSlVTVF9MT05HX1dJTkRPVyAgICAgICAgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gKDEgPDwgMCkKKyNkZWZpbmUgVVNFX1BTWUNIX1RPTkFMSVRZICgxIDw8IDEpCisjZGVmaW5lIFVTRV9UTlNfR0FJTl9USFIgKDEgPDwgMikKKyNkZWZpbmUgVVNFX1ROU19QTlMgKDEgPDwgMykKKyNkZWZpbmUgSlVTVF9MT05HX1dJTkRPVyAoMSA8PCA0KQogLyogYWRkaXRpb25hbCBhbGdvcml0aG0gZmxhZ3MgKi8KLSNkZWZpbmUgSVNfTE9XX0NPTUxFWElUWSAgICAgICAgICAgICAgICAgKDE8PDUpCisjZGVmaW5lIElTX0xPV19DT01QTEVYSVRZICgxIDw8IDUpCiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIC8qIFBOUyBzdGFydCBiYW5kICovCiAgIHNob3J0IHN0YXJ0U2ZiOwogCkBAIC0xMTYsMjYgKzEyNywyMyBAQAogICBVU0hPUlQgZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3M7CiAKICAgLyogUGFyYW1ldGVycyBmb3IgZGV0ZWN0aW9uICovCi0gIEZJWFBfREJMICByZWZQb3dlcjsKLSAgRklYUF9EQkwgIHJlZlRvbmFsaXR5OwotICBJTlQgICAgICAgdG5zR2FpblRocmVzaG9sZDsKLSAgSU5UICAgICAgIHRuc1BOU0dhaW5UaHJlc2hvbGQ7Ci0gIElOVCAgICAgICBtaW5TZmJXaWR0aDsKLSAgRklYUF9TR0wgIHBvd0Rpc3RQU0RjdXJ2ZVtNQVhfR1JPVVBFRF9TRkJdOwotICBGSVhQX1NHTCAgZ2FwRmlsbFRocjsKKyAgRklYUF9EQkwgcmVmUG93ZXI7CisgIEZJWFBfREJMIHJlZlRvbmFsaXR5OworICBJTlQgdG5zR2FpblRocmVzaG9sZDsKKyAgSU5UIHRuc1BOU0dhaW5UaHJlc2hvbGQ7CisgIElOVCBtaW5TZmJXaWR0aDsKKyAgRklYUF9TR0wgcG93RGlzdFBTRGN1cnZlW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfU0dMIGdhcEZpbGxUaHI7CiB9IE5PSVNFUEFSQU1TOwogCi1pbnQgRkRLYWFjRW5jX2xvb2tVcFBuc1VzZSAoaW50IGJpdFJhdGUsIGludCBzYW1wbGVSYXRlLCBpbnQgbnVtQ2hhbiwgY29uc3QgaW50IGlzTEMpOworaW50IEZES2FhY0VuY19sb29rVXBQbnNVc2UoaW50IGJpdFJhdGUsIGludCBzYW1wbGVSYXRlLCBpbnQgbnVtQ2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpc0xDKTsKIAogLyoqKioqKiBEZWZpbml0aW9uIG9mIHByb3RvdHlwZXMgKioqKioqLwogCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfR2V0UG5zUGFyYW0oTk9JU0VQQVJBTVMgKm5wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqdXNlUG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG51bUNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgaXNMQyk7CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfR2V0UG5zUGFyYW0oTk9JU0VQQVJBTVMgKm5wLCBJTlQgYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwgSU5UIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKnNmYk9mZnNldCwgSU5UICp1c2VQbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bUNoYW4sIGNvbnN0IElOVCBpc0xDKTsKIAotI2VuZGlmCisjZW5kaWYgLyogUE5TUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9wcmVfZWNob19jb250cm9sLmNwcCBiL2xpYkFBQ2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jcHAKaW5kZXggM2RmZDhlZC4uM2Q1ZDE1MyAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9wcmVfZWNob19jb250cm9sLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDkyICs5MCw4NyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFByZSBlY2hvIGNvbnRyb2wKKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUHJlIGVjaG8gY29udHJvbAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAicHJlX2VjaG9fY29udHJvbC5oIgogI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCiAKLXZvaWQgRkRLYWFjRW5jX0luaXRQcmVFY2hvQ29udHJvbChGSVhQX0RCTCAgICAqUkVTVFJJQ1QgcGJUaHJlc2hvbGRObTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKmNhbGNQcmVFY2hvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqUkVTVFJJQ1Qgc2ZiUGNtUXVhbnRUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKm1kY3RTY2FsZW5tMSkKLXsKLSAgKm1kY3RTY2FsZW5tMSA9IFBDTV9RVUFOVF9USFJfU0NBTEU+PjE7Cit2b2lkIEZES2FhY0VuY19Jbml0UHJlRWNob0NvbnRyb2woRklYUF9EQkwgKlJFU1RSSUNUIHBiVGhyZXNob2xkTm0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY2FsY1ByZUVjaG8sIElOVCBudW1QYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2ZiUGNtUXVhbnRUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptZGN0U2NhbGVubTEpIHsKKyAgKm1kY3RTY2FsZW5tMSA9IFBDTV9RVUFOVF9USFJfU0NBTEUgPj4gMTsKIAotICBGREttZW1jcHkocGJUaHJlc2hvbGRObTEsIHNmYlBjbVF1YW50VGhyZXNob2xkLCBudW1QYipzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY3B5KHBiVGhyZXNob2xkTm0xLCBzZmJQY21RdWFudFRocmVzaG9sZCwgbnVtUGIgKiBzaXplb2YoRklYUF9EQkwpKTsKIAogICAqY2FsY1ByZUVjaG8gPSAxOwogfQogCit2b2lkIEZES2FhY0VuY19QcmVFY2hvQ29udHJvbChGSVhQX0RCTCAqUkVTVFJJQ1QgcGJUaHJlc2hvbGRObTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2FsY1ByZUVjaG8sIElOVCBudW1QYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcGJUaHJlc2hvbGQsIElOVCBtZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1kY3RTY2FsZW5tMSkgeworICBpbnQgaTsKKyAgRklYUF9EQkwgdG1wVGhyZXNob2xkMSwgdG1wVGhyZXNob2xkMjsKKyAgaW50IHNjYWxpbmc7CiAKLXZvaWQgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sKEZJWFBfREJMICAgKlJFU1RSSUNUIHBiVGhyZXNob2xkTm0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgY2FsY1ByZUVjaG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHBiVGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqbWRjdFNjYWxlbm0xKQotewotICAgIGludCBpOwotICAgIEZJWFBfREJMIHRtcFRocmVzaG9sZDEsIHRtcFRocmVzaG9sZDI7Ci0gICAgaW50IHNjYWxpbmc7Ci0KLQkvKiBJZiBsYXN0V2luZG93U2VxdWVuY2UgaW4gcHJldmlvdXMgZnJhbWUgd2FzIHN0YXJ0LSBvciBzdG9wLXdpbmRvdywKLQkgICBza2lwIHByZWVjaG9jb250cm9sIGNhbGN1bGF0aW9uICovCi0gICAgaWYgKGNhbGNQcmVFY2hvPT0wKSB7Ci0gICAgICAvKiBjb3B5IHRocmVzaG9sZHMgdG8gaW50ZXJuYWwgbWVtb3J5ICovCi0gICAgICBGREttZW1jcHkocGJUaHJlc2hvbGRObTEsIHBiVGhyZXNob2xkLCBudW1QYipzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgICptZGN0U2NhbGVubTEgPSBtZGN0U2NhbGU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCBtZGN0U2NhbGUgPiAqbWRjdFNjYWxlbm0xICkgewotICAgICAgICAvKiBpZiBjdXJyZW50IHRocmVzaG9sZHMgYXJlIGRvd25zY2FsZWQgbW9yZSB0aGFuIHRoZSBvbmVzIGZyb20gdGhlIGxhc3QgYmxvY2sgKi8KLSAgICAgICAgc2NhbGluZyA9IDIqKG1kY3RTY2FsZS0qbWRjdFNjYWxlbm0xKTsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgbnVtUGI7IGkrKykgewotCi0gICAgICAgICAgICAvKiBtdWx0aXBsaWNhdGlvbiB3aXRoIHJldHVybiBkYXRhIHR5cGUgZnJhY3QgaXN0IGVxdWl2YWxlbnQgdG8gaW50IG11bHRpcGxpY2F0aW9uICovCi0gICAgICAgICAgICBGREtfQVNTRVJUKHNjYWxpbmc+PTApOwotICAgICAgICAgICAgdG1wVGhyZXNob2xkMSA9IG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciAqIChwYlRocmVzaG9sZE5tMVtpXT4+c2NhbGluZyk7Ci0gICAgICAgICAgICB0bXBUaHJlc2hvbGQyID0gZk11bHQobWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLCBwYlRocmVzaG9sZFtpXSk7Ci0KLQkJCUZJWFBfREJMIHRtcCA9IHBiVGhyZXNob2xkW2ldOwotCi0gICAgICAgICAgICAvKiBjb3B5IHRocmVzaG9sZHMgdG8gaW50ZXJuYWwgbWVtb3J5ICovCi0gICAgICAgICAgICBwYlRocmVzaG9sZE5tMVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgdG1wID0gZml4TWluKHRtcCwgdG1wVGhyZXNob2xkMSk7Ci0gICAgICAgICAgICBwYlRocmVzaG9sZFtpXSA9IGZpeE1heCh0bXAsIHRtcFRocmVzaG9sZDIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKiBpZiB0aHJlc2hvbGRzIG9mIGxhc3QgYmxvY2sgYXJlIG1vcmUgZG93bnNjYWxlZCB0aGFuIHRoZSBjdXJyZW50IG9uZXMgKi8KLSAgICAgICAgc2NhbGluZyA9IDIqKCptZGN0U2NhbGVubTEtbWRjdFNjYWxlKTsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgbnVtUGI7IGkrKykgewotCi0gICAgICAgICAgICAvKiBtdWx0aXBsaWNhdGlvbiB3aXRoIHJldHVybiBkYXRhIHR5cGUgZnJhY3QgaXN0IGVxdWl2YWxlbnQgdG8gaW50IG11bHRpcGxpY2F0aW9uICovCi0gICAgICAgICAgICB0bXBUaHJlc2hvbGQxID0gKG1heEFsbG93ZWRJbmNyZWFzZUZhY3Rvcj4+MSkgKiBwYlRocmVzaG9sZE5tMVtpXTsKLSAgICAgICAgICAgIHRtcFRocmVzaG9sZDIgPSBmTXVsdChtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IsIHBiVGhyZXNob2xkW2ldKTsKLQotICAgICAgICAgICAgLyogY29weSB0aHJlc2hvbGRzIHRvIGludGVybmFsIG1lbW9yeSAqLwotICAgICAgICAgICAgcGJUaHJlc2hvbGRObTFbaV0gPSBwYlRocmVzaG9sZFtpXTsKLQotICAgICAgICAgICAgRkRLX0FTU0VSVChzY2FsaW5nPj0wKTsKLSAgICAgICAgICAgIGlmKChwYlRocmVzaG9sZFtpXT4+KHNjYWxpbmcrMSkpID4gdG1wVGhyZXNob2xkMSkgewotICAgICAgICAgICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMTw8KHNjYWxpbmcrMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYlRocmVzaG9sZFtpXSA9IGZpeE1heChwYlRocmVzaG9sZFtpXSwgdG1wVGhyZXNob2xkMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KKyAgLyogSWYgbGFzdFdpbmRvd1NlcXVlbmNlIGluIHByZXZpb3VzIGZyYW1lIHdhcyBzdGFydC0gb3Igc3RvcC13aW5kb3csCisgICAgIHNraXAgcHJlZWNob2NvbnRyb2wgY2FsY3VsYXRpb24gKi8KKyAgaWYgKGNhbGNQcmVFY2hvID09IDApIHsKKyAgICAvKiBjb3B5IHRocmVzaG9sZHMgdG8gaW50ZXJuYWwgbWVtb3J5ICovCisgICAgRkRLbWVtY3B5KHBiVGhyZXNob2xkTm0xLCBwYlRocmVzaG9sZCwgbnVtUGIgKiBzaXplb2YoRklYUF9EQkwpKTsKICAgICAqbWRjdFNjYWxlbm0xID0gbWRjdFNjYWxlOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChtZGN0U2NhbGUgPiAqbWRjdFNjYWxlbm0xKSB7CisgICAgLyogaWYgY3VycmVudCB0aHJlc2hvbGRzIGFyZSBkb3duc2NhbGVkIG1vcmUgdGhhbiB0aGUgb25lcyBmcm9tIHRoZSBsYXN0CisgICAgICogYmxvY2sgKi8KKyAgICBzY2FsaW5nID0gMiAqIChtZGN0U2NhbGUgLSAqbWRjdFNjYWxlbm0xKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGI7IGkrKykgeworICAgICAgLyogbXVsdGlwbGljYXRpb24gd2l0aCByZXR1cm4gZGF0YSB0eXBlIGZyYWN0IGlzdCBlcXVpdmFsZW50IHRvIGludAorICAgICAgICogbXVsdGlwbGljYXRpb24gKi8KKyAgICAgIEZES19BU1NFUlQoc2NhbGluZyA+PSAwKTsKKyAgICAgIHRtcFRocmVzaG9sZDEgPSBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IgKiAocGJUaHJlc2hvbGRObTFbaV0gPj4gc2NhbGluZyk7CisgICAgICB0bXBUaHJlc2hvbGQyID0gZk11bHQobWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLCBwYlRocmVzaG9sZFtpXSk7CisKKyAgICAgIEZJWFBfREJMIHRtcCA9IHBiVGhyZXNob2xkW2ldOworCisgICAgICAvKiBjb3B5IHRocmVzaG9sZHMgdG8gaW50ZXJuYWwgbWVtb3J5ICovCisgICAgICBwYlRocmVzaG9sZE5tMVtpXSA9IHRtcDsKKworICAgICAgdG1wID0gZml4TWluKHRtcCwgdG1wVGhyZXNob2xkMSk7CisgICAgICBwYlRocmVzaG9sZFtpXSA9IGZpeE1heCh0bXAsIHRtcFRocmVzaG9sZDIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBpZiB0aHJlc2hvbGRzIG9mIGxhc3QgYmxvY2sgYXJlIG1vcmUgZG93bnNjYWxlZCB0aGFuIHRoZSBjdXJyZW50IG9uZXMgKi8KKyAgICBzY2FsaW5nID0gMiAqICgqbWRjdFNjYWxlbm0xIC0gbWRjdFNjYWxlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGI7IGkrKykgeworICAgICAgLyogbXVsdGlwbGljYXRpb24gd2l0aCByZXR1cm4gZGF0YSB0eXBlIGZyYWN0IGlzdCBlcXVpdmFsZW50IHRvIGludAorICAgICAgICogbXVsdGlwbGljYXRpb24gKi8KKyAgICAgIHRtcFRocmVzaG9sZDEgPSAobWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yID4+IDEpICogcGJUaHJlc2hvbGRObTFbaV07CisgICAgICB0bXBUaHJlc2hvbGQyID0gZk11bHQobWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLCBwYlRocmVzaG9sZFtpXSk7CisKKyAgICAgIC8qIGNvcHkgdGhyZXNob2xkcyB0byBpbnRlcm5hbCBtZW1vcnkgKi8KKyAgICAgIHBiVGhyZXNob2xkTm0xW2ldID0gcGJUaHJlc2hvbGRbaV07CisKKyAgICAgIEZES19BU1NFUlQoc2NhbGluZyA+PSAwKTsKKyAgICAgIGlmICgocGJUaHJlc2hvbGRbaV0gPj4gKHNjYWxpbmcgKyAxKSkgPiB0bXBUaHJlc2hvbGQxKSB7CisgICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMSA8PCAoc2NhbGluZyArIDEpOworICAgICAgfQorICAgICAgcGJUaHJlc2hvbGRbaV0gPSBmaXhNYXgocGJUaHJlc2hvbGRbaV0sIHRtcFRocmVzaG9sZDIpOworICAgIH0KKyAgfQorCisgICptZGN0U2NhbGVubTEgPSBtZGN0U2NhbGU7CiB9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuaCBiL2xpYkFBQ2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5oCmluZGV4IDkyMjRkYjAuLjY4OGVmZGIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDM2ICs5MCwyOSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFByZSBlY2hvIGNvbnRyb2wKKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUHJlIGVjaG8gY29udHJvbAogCi0jaWZuZGVmIF9fUFJFX0VDSE9fQ09OVFJPTF9ICi0jZGVmaW5lIF9fUFJFX0VDSE9fQ09OVFJPTF9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBSRV9FQ0hPX0NPTlRST0xfSAorI2RlZmluZSBQUkVfRUNIT19DT05UUk9MX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAordm9pZCBGREthYWNFbmNfSW5pdFByZUVjaG9Db250cm9sKEZJWFBfREJMICpwYlRocmVzaG9sZG5tMSwgSU5UICpjYWxjUHJlRWNobywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtUGIsIEZJWFBfREJMICpzZmJQY21RdWFudFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1kY3RTY2FsZW5tMSk7CiAKLXZvaWQgRkRLYWFjRW5jX0luaXRQcmVFY2hvQ29udHJvbChGSVhQX0RCTCAgICAqcGJUaHJlc2hvbGRubTEsCi0JCQkJCQlJTlQgICAgICAgICAqY2FsY1ByZUVjaG8sCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpzZmJQY21RdWFudFRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICptZGN0U2NhbGVubTEpOwotCi0KLXZvaWQgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sKEZJWFBfREJMICAgICpwYlRocmVzaG9sZE5tMSwKLQkJCQkJSU5UICAgICAgICAgY2FsY1ByZUVjaG8sCi0gICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG51bVBiLAotICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnBiVGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBtZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICptZGN0U2NhbGVubTEpOwordm9pZCBGREthYWNFbmNfUHJlRWNob0NvbnRyb2woRklYUF9EQkwgKnBiVGhyZXNob2xkTm0xLCBJTlQgY2FsY1ByZUVjaG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtUGIsIElOVCBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcGJUaHJlc2hvbGQsIElOVCBtZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1kY3RTY2FsZW5tMSk7CiAKICNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmNwcCBiL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uY3BwCmluZGV4IDlhNzJjNjguLmVlZjkwYmMgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBjb25maWd1cmF0aW9uCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBjb25maWd1cmF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgImFkal90aHIuaCIKQEAgLTk2LDE1ICsxMDgsMTQgQEAKIAogI2luY2x1ZGUgIkZES190cmlnRmN0cy5oIgogCi10eXBlZGVmIHN0cnVjdHsKLSAgICBMT05HICBzYW1wbGVSYXRlOwotICAgIGNvbnN0IFNGQl9QQVJBTV9MT05HICAqcGFyYW1Mb25nOwotICAgIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCAqcGFyYW1TaG9ydDsKLX1TRkJfSU5GT19UQUI7Ci0KK3R5cGVkZWYgc3RydWN0IHsKKyAgTE9ORyBzYW1wbGVSYXRlOworICBjb25zdCBTRkJfUEFSQU1fTE9ORyAqcGFyYW1Mb25nOworICBjb25zdCBTRkJfUEFSQU1fU0hPUlQgKnBhcmFtU2hvcnQ7Cit9IFNGQl9JTkZPX1RBQjsKIAogc3RhdGljIGNvbnN0IFNGQl9JTkZPX1RBQiBzZmJJbmZvVGFiW10gPSB7Ci0gICAgezgwMDAsICAmcF9GREthYWNFbmNfODAwMF9sb25nXzEwMjQsICAmcF9GREthYWNFbmNfODAwMF9zaG9ydF8xMjh9LAorICAgIHs4MDAwLCAmcF9GREthYWNFbmNfODAwMF9sb25nXzEwMjQsICZwX0ZES2FhY0VuY184MDAwX3Nob3J0XzEyOH0sCiAgICAgezExMDI1LCAmcF9GREthYWNFbmNfMTEwMjVfbG9uZ18xMDI0LCAmcF9GREthYWNFbmNfMTEwMjVfc2hvcnRfMTI4fSwKICAgICB7MTIwMDAsICZwX0ZES2FhY0VuY18xMjAwMF9sb25nXzEwMjQsICZwX0ZES2FhY0VuY18xMjAwMF9zaG9ydF8xMjh9LAogICAgIHsxNjAwMCwgJnBfRkRLYWFjRW5jXzE2MDAwX2xvbmdfMTAyNCwgJnBfRkRLYWFjRW5jXzE2MDAwX3Nob3J0XzEyOH0sCkBAIC0xMjEsMTA4ICsxMzIsODEgQEAKIAogLyogMjIwNTAgYW5kIDI0MDAwIEh6ICovCiBzdGF0aWMgY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF8yMjA1MF9sb25nXzUxMiA9IHsKLSAgICAzMSwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAotICAgICAgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDE2LCAyMCwgMjQsCi0gICAgICAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKLSAgICAgIDMyfQotfTsKKyAgICAzMSwgezQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgMTIsIDEyLAorICAgICAgICAgMTIsIDE2LCAyMCwgMjQsIDI4LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMn19OwogCiAvKiAzMjAwMCBIeiAqLwogc3RhdGljIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfMzIwMDBfbG9uZ181MTIgPSB7CiAgICAgMzcsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKLSAgICAgICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsIDEyLAotICAgICAgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMjAsIDI0LCAyNCwgMjgsCi0gICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMn0KLX07CisgICAgezQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgOCwKKyAgICAgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYsIDIwLCAyNCwgMjQsIDI4LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMn19OwogCiAvKiA0NDEwMCBIeiAqLwogc3RhdGljIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfNDQxMDBfbG9uZ181MTIgPSB7Ci0gICAgMzYsCi0gICAgezQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCi0gICAgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsCi0gICAgMTIsIDEyLCAxMiwgMTIsIDE2LCAyMCwgMjQsIDI4LCAzMiwgMzIsCi0gICAgMzIsIDMyLCAzMiwgMzIsIDMyLCA1Mn0KLX07CisgICAgMzYsIHs0LCA0LCA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LAorICAgICAgICAgOCwgOCwgMTIsIDEyLCAxMiwgMTIsIDE2LCAyMCwgMjQsIDI4LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgNTJ9fTsKIAogc3RhdGljIGNvbnN0IFNGQl9JTkZPX1RBQiBzZmJJbmZvVGFiTEQ1MTJbXSA9IHsKLSAgICB7IDgwMDAsICZwXzIyMDUwX2xvbmdfNTEyLCBOVUxMfSwKLSAgICB7MTEwMjUsICZwXzIyMDUwX2xvbmdfNTEyLCBOVUxMfSwKLSAgICB7MTIwMDAsICZwXzIyMDUwX2xvbmdfNTEyLCBOVUxMfSwKLSAgICB7MTYwMDAsICZwXzIyMDUwX2xvbmdfNTEyLCBOVUxMfSwKLSAgICB7MjIwNTAsICZwXzIyMDUwX2xvbmdfNTEyLCBOVUxMfSwKLSAgICB7MjQwMDAsICZwXzIyMDUwX2xvbmdfNTEyLCBOVUxMfSwKLSAgICB7MzIwMDAsICZwXzMyMDAwX2xvbmdfNTEyLCBOVUxMfSwKLSAgICB7NDQxMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKLSAgICB7NDgwMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKLSAgICB7NjQwMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKLSAgICB7ODgyMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKLSAgICB7OTYwMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKLQorICAgIHs4MDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sICAgezExMDI1LCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCisgICAgezEyMDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sICB7MTYwMDAsICZwXzIyMDUwX2xvbmdfNTEyLCBOVUxMfSwKKyAgICB7MjIwNTAsICZwXzIyMDUwX2xvbmdfNTEyLCBOVUxMfSwgIHsyNDAwMCwgJnBfMjIwNTBfbG9uZ181MTIsIE5VTEx9LAorICAgIHszMjAwMCwgJnBfMzIwMDBfbG9uZ181MTIsIE5VTEx9LCAgezQ0MTAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCisgICAgezQ4MDAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sICB7NjQwMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKKyAgICB7ODgyMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwgIHs5NjAwMCwgJnBfNDQxMDBfbG9uZ181MTIsIE5VTEx9LAorICAgIHsxMjgwMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwgezE3NjQwMCwgJnBfNDQxMDBfbG9uZ181MTIsIE5VTEx9LAorICAgIHsxOTIwMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwgezI1NjAwMCwgJnBfNDQxMDBfbG9uZ181MTIsIE5VTEx9LAorICAgIHszNTI4MDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwgezM4NDAwMCwgJnBfNDQxMDBfbG9uZ181MTIsIE5VTEx9LAogfTsKIAotCiAvKiAyMjA1MCBhbmQgMjQwMDAgSHogKi8KIHN0YXRpYyBjb25zdCBTRkJfUEFSQU1fTE9ORyBwXzIyMDUwX2xvbmdfNDgwID0gewotICAgIDMwLAotICAgIHsgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKLSAgICAgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDE2LCAyMCwgMjQsCi0gICAgIDI4LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyfQotfTsKKyAgICAzMCwgezQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgMTIsCisgICAgICAgICAxMiwgMTIsIDE2LCAyMCwgMjQsIDI4LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyfX07CiAKIC8qIDMyMDAwIEh6ICovCiBzdGF0aWMgY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF8zMjAwMF9sb25nXzQ4MCA9IHsKLSAgICAzNywKLSAgICB7IDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCi0gICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LAotICAgICAgOCwgIDgsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMjAsIDI0LCAzMiwKLSAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzJ9Ci19OworICAgIDM3LCB7NCwgNCwgNCwgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCA4LAorICAgICAgICAgOCwgOCwgOCwgMTIsIDEyLCAxMiwgMTYsIDE2LCAyMCwgMjQsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMn19OwogCiAvKiA0NDEwMCBIeiAqLwogc3RhdGljIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfNDQxMDBfbG9uZ180ODAgPSB7Ci0gICAgMzUsCi0gICAgeyA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAotICAgICAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwKLSAgICAgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMjQsIDI4LCAzMiwgMzIsCi0gICAgIDMyLCAzMiwgMzIsIDMyLCA0OH0KLX07CisgICAgMzUsIHs0LCA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCA4LAorICAgICAgICAgOCwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDI0LCAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgNDh9fTsKIAogc3RhdGljIGNvbnN0IFNGQl9JTkZPX1RBQiBzZmJJbmZvVGFiTEQ0ODBbXSA9IHsKLSAgICB7IDgwMDAsICZwXzIyMDUwX2xvbmdfNDgwLCBOVUxMfSwKLSAgICB7MTEwMjUsICZwXzIyMDUwX2xvbmdfNDgwLCBOVUxMfSwKLSAgICB7MTIwMDAsICZwXzIyMDUwX2xvbmdfNDgwLCBOVUxMfSwKLSAgICB7MTYwMDAsICZwXzIyMDUwX2xvbmdfNDgwLCBOVUxMfSwKLSAgICB7MjIwNTAsICZwXzIyMDUwX2xvbmdfNDgwLCBOVUxMfSwKLSAgICB7MjQwMDAsICZwXzIyMDUwX2xvbmdfNDgwLCBOVUxMfSwKLSAgICB7MzIwMDAsICZwXzMyMDAwX2xvbmdfNDgwLCBOVUxMfSwKLSAgICB7NDQxMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwKLSAgICB7NDgwMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwKLSAgICB7NjQwMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwKLSAgICB7ODgyMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwKLSAgICB7OTYwMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwKLQorICAgIHs4MDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sICAgezExMDI1LCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezEyMDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sICB7MTYwMDAsICZwXzIyMDUwX2xvbmdfNDgwLCBOVUxMfSwKKyAgICB7MjIwNTAsICZwXzIyMDUwX2xvbmdfNDgwLCBOVUxMfSwgIHsyNDAwMCwgJnBfMjIwNTBfbG9uZ180ODAsIE5VTEx9LAorICAgIHszMjAwMCwgJnBfMzIwMDBfbG9uZ180ODAsIE5VTEx9LCAgezQ0MTAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezQ4MDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sICB7NjQwMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwKKyAgICB7ODgyMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwgIHs5NjAwMCwgJnBfNDQxMDBfbG9uZ180ODAsIE5VTEx9LAorICAgIHsxMjgwMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwgezE3NjQwMCwgJnBfNDQxMDBfbG9uZ180ODAsIE5VTEx9LAorICAgIHsxOTIwMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwgezI1NjAwMCwgJnBfNDQxMDBfbG9uZ180ODAsIE5VTEx9LAorICAgIHszNTI4MDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwgezM4NDAwMCwgJnBfNDQxMDBfbG9uZ180ODAsIE5VTEx9LAogfTsKIAogLyogRml4ZWQgcG9pbnQgcHJlY2lzaW9uIGRlZmluaXRpb25zICovCi0jZGVmaW5lIFFfQkFSQ1ZBTCAgICAgICAgKDI1KQorI2RlZmluZSBRX0JBUkNWQUwgKDI1KQogCi1zdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX2luaXRTZmJUYWJsZShMT05HIHNhbXBsZVJhdGUsIElOVCBibG9ja1R5cGUsIElOVCBncmFudWxlTGVuZ3RoLCBJTlQgKnNmYk9mZnNldCwgSU5UICpzZmJDbnQpCi17Ci0gIElOVCAgaSwgc3BlY1N0YXJ0T2Zmc2V0ID0gMDsKLSAgY29uc3QgVUNIQVIqIHNmYldpZHRoID0gTlVMTDsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19pbml0U2ZiVGFibGUoY29uc3QgTE9ORyBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdCBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3Qgc2ZiQ250KSB7CisgIElOVCBpLCBzcGVjU3RhcnRPZmZzZXQgPSAwOworICBJTlQgZ3JhbnVsZUxlbmd0aFdpbmRvdyA9IGdyYW51bGVMZW5ndGg7CisgIGNvbnN0IFVDSEFSICpzZmJXaWR0aCA9IE5VTEw7CiAgIGNvbnN0IFNGQl9JTkZPX1RBQiAqc2ZiSW5mbyA9IE5VTEw7CiAgIGludCBzaXplOwogCiAgIC8qCiAgICAgc2VsZWN0IHRhYmxlCiAgICovCi0gIHN3aXRjaChncmFudWxlTGVuZ3RoKSB7CisgIHN3aXRjaCAoZ3JhbnVsZUxlbmd0aCkgewogICAgIGNhc2UgMTAyNDoKLSAgICBjYXNlICA5NjA6CisgICAgY2FzZSA5NjA6CiAgICAgICBzZmJJbmZvID0gc2ZiSW5mb1RhYjsKLSAgICAgIHNpemUgPSAoSU5UKShzaXplb2Yoc2ZiSW5mb1RhYikvc2l6ZW9mKFNGQl9JTkZPX1RBQikpOworICAgICAgc2l6ZSA9IChJTlQpKHNpemVvZihzZmJJbmZvVGFiKSAvIHNpemVvZihTRkJfSU5GT19UQUIpKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgNTEyOgogICAgICAgc2ZiSW5mbyA9IHNmYkluZm9UYWJMRDUxMjsKQEAgLTIzNiwyMCArMjIwLDIwIEBACiAgICAgICByZXR1cm4gQUFDX0VOQ19JTlZBTElEX0ZSQU1FX0xFTkdUSDsKICAgfQogCi0gIGZvcihpID0gMDsgaSA8IHNpemU7IGkrKyl7Ci0gICAgaWYoc2ZiSW5mb1tpXS5zYW1wbGVSYXRlID09IHNhbXBsZVJhdGUpewotICAgICAgc3dpdGNoKGJsb2NrVHlwZSl7Ci0gICAgICBjYXNlIExPTkdfV0lORE9XOgotICAgICAgY2FzZSBTVEFSVF9XSU5ET1c6Ci0gICAgICBjYXNlIFNUT1BfV0lORE9XOgotICAgICAgICBzZmJXaWR0aCA9IHNmYkluZm9baV0ucGFyYW1Mb25nLT5zZmJXaWR0aDsKLSAgICAgICAgKnNmYkNudCAgPSBzZmJJbmZvW2ldLnBhcmFtTG9uZy0+c2ZiQ250OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0hPUlRfV0lORE9XOgotICAgICAgICBzZmJXaWR0aCA9IHNmYkluZm9baV0ucGFyYW1TaG9ydC0+c2ZiV2lkdGg7Ci0gICAgICAgICpzZmJDbnQgID0gc2ZiSW5mb1tpXS5wYXJhbVNob3J0LT5zZmJDbnQ7Ci0gICAgICAgIGdyYW51bGVMZW5ndGggLz0gVFJBTlNfRkFDOwotICAgICAgICBicmVhazsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGlmIChzZmJJbmZvW2ldLnNhbXBsZVJhdGUgPT0gc2FtcGxlUmF0ZSkgeworICAgICAgc3dpdGNoIChibG9ja1R5cGUpIHsKKyAgICAgICAgY2FzZSBMT05HX1dJTkRPVzoKKyAgICAgICAgY2FzZSBTVEFSVF9XSU5ET1c6CisgICAgICAgIGNhc2UgU1RPUF9XSU5ET1c6CisgICAgICAgICAgc2ZiV2lkdGggPSBzZmJJbmZvW2ldLnBhcmFtTG9uZy0+c2ZiV2lkdGg7CisgICAgICAgICAgKnNmYkNudCA9IHNmYkluZm9baV0ucGFyYW1Mb25nLT5zZmJDbnQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0hPUlRfV0lORE9XOgorICAgICAgICAgIHNmYldpZHRoID0gc2ZiSW5mb1tpXS5wYXJhbVNob3J0LT5zZmJXaWR0aDsKKyAgICAgICAgICAqc2ZiQ250ID0gc2ZiSW5mb1tpXS5wYXJhbVNob3J0LT5zZmJDbnQ7CisgICAgICAgICAgZ3JhbnVsZUxlbmd0aFdpbmRvdyAvPSBUUkFOU19GQUM7CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICB9CkBAIC0yNjEsMjEgKzI0NSwxOSBAQAogICAvKgogICAgIGNhbGMgc2ZiIG9mZnNldHMKICAgKi8KLSAgZm9yKGkgPSAwOyBpIDwgKnNmYkNudDsgaSsrKXsKLSAgICAgIHNmYk9mZnNldFtpXSA9IHNwZWNTdGFydE9mZnNldDsKLSAgICAgIHNwZWNTdGFydE9mZnNldCArPSBzZmJXaWR0aFtpXTsKLSAgICAgIGlmIChzcGVjU3RhcnRPZmZzZXQgPj0gZ3JhbnVsZUxlbmd0aCkgewotICAgICAgICAgIGkrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KKyAgZm9yIChpID0gMDsgaSA8ICpzZmJDbnQ7IGkrKykgeworICAgIHNmYk9mZnNldFtpXSA9IHNwZWNTdGFydE9mZnNldDsKKyAgICBzcGVjU3RhcnRPZmZzZXQgKz0gc2ZiV2lkdGhbaV07CisgICAgaWYgKHNwZWNTdGFydE9mZnNldCA+PSBncmFudWxlTGVuZ3RoV2luZG93KSB7CisgICAgICBpKys7CisgICAgICBicmVhazsKKyAgICB9CiAgIH0KLSAgKnNmYkNudCA9IGZpeE1pbihpLCpzZmJDbnQpOwotICBzZmJPZmZzZXRbKnNmYkNudF0gPSBmaXhNaW4oc3BlY1N0YXJ0T2Zmc2V0LGdyYW51bGVMZW5ndGgpOwotCisgICpzZmJDbnQgPSBmaXhNaW4oaSwgKnNmYkNudCk7CisgIHNmYk9mZnNldFsqc2ZiQ250XSA9IGZpeE1pbihzcGVjU3RhcnRPZmZzZXQsIGdyYW51bGVMZW5ndGhXaW5kb3cpOwogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUKQEAgLTI4NSw1MSArMjY3LDUzIEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfQmFyY0xpbmVWYWx1ZShJTlQgbm9PZkxpbmVzLCBJTlQgZmZ0TGluZSwgTE9ORyBzYW1wbGluZ0ZyZXEpCi17CitzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUoSU5UIG5vT2ZMaW5lcywgSU5UIGZmdExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyBzYW1wbGluZ0ZyZXEpIHsKKyAgRklYUF9EQkwgRk9VUkJZM0VNNCA9IChGSVhQX0RCTCkweDQ1ZTdiMjczOyAvKiA0LjAvMyAqIDAuMDAwMSBpbiBxNDMgKi8KKyAgRklYUF9EQkwgUFpaWjc2ID0gKEZJWFBfREJMKTB4NjM5ZDVlNGE7ICAgICAvKiAwLjAwMDc2IGluIHE0MSAqLworICBGSVhQX0RCTCBPTkUzUDMgPSAoRklYUF9EQkwpMHgzNTMzMzMzMzsgICAgIC8qIDEzLjMgaW4gcTI2ICovCisgIEZJWFBfREJMIFRIUkVFUDUgPSAoRklYUF9EQkwpMHgxYzAwMDAwMDsgICAgLyogMy41IGluIHEyNyAqLworICBGSVhQX0RCTCBJTlY0ODAgPSAoRklYUF9EQkwpMHg0NDQ0NDQ0NDsgICAgIC8vIDEvNDgwIGluIHEzOQogCi0gICAgRklYUF9EQkwgRk9VUkJZM0VNNCAgICAgPSAoRklYUF9EQkwpMHg0NWU3YjI3MzsgLyogNC4wLzMgKiAwLjAwMDEgaW4gcTQzICovCi0gICAgRklYUF9EQkwgUFpaWjc2ICAgICAgICAgPSAoRklYUF9EQkwpMHg2MzlkNWU0YTsgLyogMC4wMDA3NiBpbiBxNDEgKi8KLSAgICBGSVhQX0RCTCBPTkUzUDMgICAgICAgICA9IChGSVhQX0RCTCkweDM1MzMzMzMzOyAvKiAxMy4zIGluIHEyNiAqLwotICAgIEZJWFBfREJMIFRIUkVFUDUgICAgICAgID0gKEZJWFBfREJMKTB4MWMwMDAwMDA7IC8qIDMuNSBpbiBxMjcgKi8KLSAgICBGSVhQX0RCTCBJTlY0ODAgICAgICAgICA9IChGSVhQX0RCTCkweDQ0NDQ0NDQ0OyAvLyAxLzQ4MCBpbiBxMzkKKyAgRklYUF9EQkwgY2VudGVyX2ZyZXEsIHgxLCB4MjsKKyAgRklYUF9EQkwgYnZhbEZGVExpbmUsIGF0YW4xLCBhdGFuMjsKIAotICAgIEZJWFBfREJMIGNlbnRlcl9mcmVxLCB4MSwgeDI7Ci0gICAgRklYUF9EQkwgYnZhbEZGVExpbmUsIGF0YW4xLCBhdGFuMjsKKyAgLyogVGhlb3JpdGljYWwgbWF4aW11bSBvZiBjZW50ZXJfZnJlcSAoc2FtcF9mcmVxKjAuNSkgaXMgOTZraHogKiAwLjUgPSA0ODAwMAorICAgKi8KKyAgLyogVGhlb3JpdGljYWwgbWF4aW11bSBvZiB4MSBpcyAxLjMzMzMzMzNlLTRmICogY2VudGVyX2ZyZXEgPSA2LjQsIGNhbiBrZWVwIGluCisgICAqIHEyOCAgKi8KKyAgLyogVGhlb3JpdGljYWwgbWF4aW11bSBvZiB4MiBpcyAwLjAwMDc2ZiAqIGNlbnRlcl9mcmVxID0gMzYuNDgsIGNhbiBrZWVwIGluCisgICAqIHEyNSAgICAgKi8KIAotICAgIC8qIFRoZW9yaXRpY2FsIG1heGltdW0gb2YgY2VudGVyX2ZyZXEgKHNhbXBfZnJlcSowLjUpIGlzIDk2a2h6ICogMC41ID0gNDgwMDAgICAgICAgICovCi0gICAgLyogVGhlb3JpdGljYWwgbWF4aW11bSBvZiB4MSBpcyAxLjMzMzMzMzNlLTRmICogY2VudGVyX2ZyZXEgPSA2LjQsIGNhbiBrZWVwIGluIHEyOCAgKi8KLSAgICAvKiBUaGVvcml0aWNhbCBtYXhpbXVtIG9mIHgyIGlzIDAuMDAwNzZmICogY2VudGVyX2ZyZXEgPSAzNi40OCwgY2FuIGtlZXAgaW4gcTI1ICAgICAqLworICBjZW50ZXJfZnJlcSA9IGZmdExpbmUgKiBzYW1wbGluZ0ZyZXE7IC8qIHExMSBvciBxOCAqLwogCi0gICAgY2VudGVyX2ZyZXEgPSBmZnRMaW5lICogc2FtcGxpbmdGcmVxOyAgICAgICAvKiBxMTEgb3IgcTggKi8KKyAgc3dpdGNoIChub09mTGluZXMpIHsKKyAgICBjYXNlIDEwMjQ6CisgICAgICBjZW50ZXJfZnJlcSA9IGNlbnRlcl9mcmVxIDw8IDI7IC8qIHExMyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjg6CisgICAgICBjZW50ZXJfZnJlcSA9IGNlbnRlcl9mcmVxIDw8IDU7IC8qIHExMyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSA1MTI6CisgICAgICBjZW50ZXJfZnJlcSA9IChmZnRMaW5lICogc2FtcGxpbmdGcmVxKSA8PCAzOyAgLy8gcTEzCisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDoKKyAgICAgIGNlbnRlcl9mcmVxID0gZk11bHQoY2VudGVyX2ZyZXEsIElOVjQ4MCkgPDwgNDsgIC8vIHExMworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGNlbnRlcl9mcmVxID0gKEZJWFBfREJMKTA7CisgIH0KIAotICAgIHN3aXRjaCAobm9PZkxpbmVzKSB7Ci0gICAgICBjYXNlIDEwMjQ6Ci0gICAgICAgIGNlbnRlcl9mcmVxID0gY2VudGVyX2ZyZXEgPDwgMjsgLyogcTEzICovCi0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMjg6Ci0gICAgICAgIGNlbnRlcl9mcmVxID0gY2VudGVyX2ZyZXEgPDwgNTsgLyogcTEzICovCi0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA1MTI6Ci0gICAgICAgIGNlbnRlcl9mcmVxID0gKGZmdExpbmUgKiBzYW1wbGluZ0ZyZXEpIDw8IDM7ICAgLy8gcTEzCi0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0ODA6Ci0gICAgICAgIGNlbnRlcl9mcmVxID0gZk11bHQoY2VudGVyX2ZyZXEsIElOVjQ4MCkgPDwgNDsgLy8gcTEzCi0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2VudGVyX2ZyZXEgPSAoRklYUF9EQkwpMDsKLSAgICB9CisgIHgxID0gZk11bHQoY2VudGVyX2ZyZXEsIEZPVVJCWTNFTTQpOyAvKiBxMTMgKiBxNDMgLSAoREZSQUNUX0JJVFMtMSkgPSBxMjUgKi8KKyAgeDIgPSBmTXVsdChjZW50ZXJfZnJlcSwgUFpaWjc2KQorICAgICAgIDw8IDI7IC8qIHExMyAqIHE0MSAtIChERlJBQ1RfQklUUy0xKSArIDIgPSBxMjUgKi8KIAotICAgIHgxID0gZk11bHQoY2VudGVyX2ZyZXEsIEZPVVJCWTNFTTQpOyAgICAgICAgLyogcTEzICogcTQzIC0gKERGUkFDVF9CSVRTLTEpID0gcTI1ICovCi0gICAgeDIgPSBmTXVsdChjZW50ZXJfZnJlcSwgUFpaWjc2KSA8PCAyOyAgICAgICAvKiBxMTMgKiBxNDEgLSAoREZSQUNUX0JJVFMtMSkgKyAyID0gcTI1ICovCisgIGF0YW4xID0gZml4cF9hdGFuKHgxKTsKKyAgYXRhbjIgPSBmaXhwX2F0YW4oeDIpOwogCi0gICAgYXRhbjEgPSBmaXhwX2F0YW4oeDEpOwotICAgIGF0YW4yID0gZml4cF9hdGFuKHgyKTsKLQotICAgIC8qIHEyNSAocTI2ICogcTMwIC0gKERGUkFDVF9CSVRTLTEpKSArIHEyNSAocTI3ICogcTMwICogcTMwKSAqLwotICAgIGJ2YWxGRlRMaW5lID0gZk11bHQoT05FM1AzLCBhdGFuMikgKyBmTXVsdChUSFJFRVA1LCBmTXVsdChhdGFuMSwgYXRhbjEpKTsKLSAgICByZXR1cm4oYnZhbEZGVExpbmUpOwotCisgIC8qIHEyNSAocTI2ICogcTMwIC0gKERGUkFDVF9CSVRTLTEpKSArIHEyNSAocTI3ICogcTMwICogcTMwKSAqLworICBidmFsRkZUTGluZSA9IGZNdWx0KE9ORTNQMywgYXRhbjIpICsgZk11bHQoVEhSRUVQNSwgZk11bHQoYXRhbjEsIGF0YW4xKSk7CisgIHJldHVybiAoYnZhbEZGVExpbmUpOwogfQogCiAvKgpAQCAtMzM4LDMyMCArMzIyLDMwNiBAQAogICAgbWlnaHQgbmVlZCB0byBiZSBjb25maWd1cmFibGUgdG8gZS5nLiAyNCBiaXQgUENNIElucHV0IG9yIGEgbG93ZXIKICAgIHJlc29sdXRpb24gZm9yIGxvdyBiaXQgcmF0ZXMKICovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfSW5pdE1pblBDTVJlc29sdXRpb24oaW50ICAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAqcGJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiUENNcXVhbnRUaHJlc2hvbGQpCi17Ci0gIC8qIFBDTV9RVUFOVF9OT0lTRSA9IEZES3BvdygxMC4wZiwgLSAyMC5mIC8gMTAuMGYpICogQUJTX0xPVyAqIE5PUk1fUENNX0VORVJHWSAqIEZES3BvdygyLFBDTV9RVUFOVF9USFJfU0NBTEUpICovCi0gICNkZWZpbmUgUENNX1FVQU5UX05PSVNFICAoKEZJWFBfREJMKTB4MDA1NDcwNjIpCitzdGF0aWMgdm9pZCBGREthYWNFbmNfSW5pdE1pblBDTVJlc29sdXRpb24oaW50IG51bVBiLCBpbnQgKnBiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJQQ01xdWFudFRocmVzaG9sZCkgeworLyogUENNX1FVQU5UX05PSVNFID0gRkRLcG93KDEwLjBmLCAtIDIwLmYgLyAxMC4wZikgKiBBQlNfTE9XICogTk9STV9QQ01fRU5FUkdZICoKKyAqIEZES3BvdygyLFBDTV9RVUFOVF9USFJfU0NBTEUpICovCisjZGVmaW5lIFBDTV9RVUFOVF9OT0lTRSAoKEZJWFBfREJMKTB4MDA1NDcwNjIpCiAKLSAgZm9yKCBpbnQgaSA9IDA7IGkgPCBudW1QYjsgaSsrICkgewotICAgIHNmYlBDTXF1YW50VGhyZXNob2xkW2ldID0gKHBiT2Zmc2V0W2krMV0gLSBwYk9mZnNldFtpXSkgKiBQQ01fUVVBTlRfTk9JU0U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUGI7IGkrKykgeworICAgIHNmYlBDTXF1YW50VGhyZXNob2xkW2ldID0gKHBiT2Zmc2V0W2kgKyAxXSAtIHBiT2Zmc2V0W2ldKSAqIFBDTV9RVUFOVF9OT0lTRTsKICAgfQogfQogCi1zdGF0aWMgRklYUF9EQkwgZ2V0TWFza0ZhY3RvcigKLSAgICAgICAgY29uc3QgRklYUF9EQkwgZGJWYWxfZml4LAotICAgICAgICBjb25zdCBJTlQgICAgICBkYlZhbF9lLAotICAgICAgICBjb25zdCBGSVhQX0RCTCB0ZW5fZml4LAotICAgICAgICBjb25zdCBJTlQgICAgICB0ZW5fZQotICAgICAgICApCi17Ci0gICAgSU5UIHFfbXNrOwotICAgIEZJWFBfREJMIG1hc2tfZmFjdG9yOworc3RhdGljIEZJWFBfREJMIGdldE1hc2tGYWN0b3IoY29uc3QgRklYUF9EQkwgZGJWYWxfZml4LCBjb25zdCBJTlQgZGJWYWxfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHRlbl9maXgsIGNvbnN0IElOVCB0ZW5fZSkgeworICBJTlQgcV9tc2s7CisgIEZJWFBfREJMIG1hc2tfZmFjdG9yOwogCi0gICAgbWFza19mYWN0b3IgPSBmUG93KHRlbl9maXgsIERGUkFDVF9CSVRTLTEtdGVuX2UsIC1kYlZhbF9maXgsIERGUkFDVF9CSVRTLTEtZGJWYWxfZSwgJnFfbXNrKTsKLSAgICBxX21zayA9IGZpeE1pbihERlJBQ1RfQklUUy0xLGZpeE1heCgtKERGUkFDVF9CSVRTLTEpLHFfbXNrKSk7CisgIG1hc2tfZmFjdG9yID0gZlBvdyh0ZW5fZml4LCBERlJBQ1RfQklUUyAtIDEgLSB0ZW5fZSwgLWRiVmFsX2ZpeCwKKyAgICAgICAgICAgICAgICAgICAgIERGUkFDVF9CSVRTIC0gMSAtIGRiVmFsX2UsICZxX21zayk7CisgIHFfbXNrID0gZml4TWluKERGUkFDVF9CSVRTIC0gMSwgZml4TWF4KC0oREZSQUNUX0JJVFMgLSAxKSwgcV9tc2spKTsKIAotICAgIGlmICggKHFfbXNrPjApICYmIChtYXNrX2ZhY3Rvcj4oRklYUF9EQkwpTUFYVkFMX0RCTD4+cV9tc2spICkgewotICAgICAgbWFza19mYWN0b3IgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBtYXNrX2ZhY3RvciA9IHNjYWxlVmFsdWUobWFza19mYWN0b3IsIHFfbXNrKTsKLSAgICB9CisgIGlmICgocV9tc2sgPiAwKSAmJiAobWFza19mYWN0b3IgPiAoRklYUF9EQkwpTUFYVkFMX0RCTCA+PiBxX21zaykpIHsKKyAgICBtYXNrX2ZhY3RvciA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICB9IGVsc2UgeworICAgIG1hc2tfZmFjdG9yID0gc2NhbGVWYWx1ZShtYXNrX2ZhY3RvciwgcV9tc2spOworICB9CiAKLSAgICByZXR1cm4gKG1hc2tfZmFjdG9yKTsKKyAgcmV0dXJuIChtYXNrX2ZhY3Rvcik7CiB9CiAKLXN0YXRpYyB2b2lkIEZES2FhY0VuY19pbml0U3ByZWFkaW5nKElOVCBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBiQmFyY1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcGJNYXNrTG9GYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYk1hc2tIaUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBiTWFza0xvRmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYk1hc2tIaUZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMT05HIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGUpCitzdGF0aWMgdm9pZCBGREthYWNFbmNfaW5pdFNwcmVhZGluZyhJTlQgbnVtUGIsIEZJWFBfREJMICpwYkJhcmNWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYk1hc2tMb0ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYk1hc2tIaUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYk1hc2tMb0ZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBiTWFza0hpRmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMT05HIGJpdHJhdGUsIGNvbnN0IElOVCBibG9ja1R5cGUpCiAKIHsKLSAgICBJTlQgaTsKLSAgICBGSVhQX0RCTCBNQVNLTE9XU1BSRU4sIE1BU0tISUdIU1BSRU47CisgIElOVCBpOworICBGSVhQX0RCTCBNQVNLTE9XU1BSRU4sIE1BU0tISUdIU1BSRU47CiAKLSAgICBGSVhQX0RCTCBNQVNLSElHSCAgICAgICAgICAgICAgID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7IC8qIDEuNSBpbiBxMjkgKi8KLSAgICBGSVhQX0RCTCBNQVNLTE9XICAgICAgICAgICAgICAgID0gKEZJWFBfREJMKTB4NjAwMDAwMDA7IC8qIDMuMCBpbiBxMjkgKi8KLSAgICBGSVhQX0RCTCBNQVNLTE9XU1BSRU5MT05HICAgICAgID0gKEZJWFBfREJMKTB4NjAwMDAwMDA7IC8qIDMuMCBpbiBxMjkgKi8KLSAgICBGSVhQX0RCTCBNQVNLSElHSFNQUkVOTE9ORyAgICAgID0gKEZJWFBfREJMKTB4NDAwMDAwMDA7IC8qIDIuMCBpbiBxMjkgKi8KLSAgICBGSVhQX0RCTCBNQVNLSElHSFNQUkVOTE9OR0xPV0JSID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7IC8qIDEuNSBpbiBxMjkgKi8KLSAgICBGSVhQX0RCTCBNQVNLTE9XU1BSRU5TSE9SVCAgICAgID0gKEZJWFBfREJMKTB4NDAwMDAwMDA7IC8qIDIuMCBpbiBxMjkgKi8KLSAgICBGSVhQX0RCTCBNQVNLSElHSFNQUkVOU0hPUlQgICAgID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7IC8qIDEuNSBpbiBxMjkgKi8KLSAgICBGSVhQX0RCTCBURU4gICAgICAgICAgICAgICAgICAgID0gKEZJWFBfREJMKTB4NTAwMDAwMDA7IC8qIDEwLjAgaW4gcTI3ICovCisgIEZJWFBfREJMIE1BU0tISUdIID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7ICAgICAgICAgICAgICAgLyogMS41IGluIHEyOSAqLworICBGSVhQX0RCTCBNQVNLTE9XID0gKEZJWFBfREJMKTB4NjAwMDAwMDA7ICAgICAgICAgICAgICAgIC8qIDMuMCBpbiBxMjkgKi8KKyAgRklYUF9EQkwgTUFTS0xPV1NQUkVOTE9ORyA9IChGSVhQX0RCTCkweDYwMDAwMDAwOyAgICAgICAvKiAzLjAgaW4gcTI5ICovCisgIEZJWFBfREJMIE1BU0tISUdIU1BSRU5MT05HID0gKEZJWFBfREJMKTB4NDAwMDAwMDA7ICAgICAgLyogMi4wIGluIHEyOSAqLworICBGSVhQX0RCTCBNQVNLSElHSFNQUkVOTE9OR0xPV0JSID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7IC8qIDEuNSBpbiBxMjkgKi8KKyAgRklYUF9EQkwgTUFTS0xPV1NQUkVOU0hPUlQgPSAoRklYUF9EQkwpMHg0MDAwMDAwMDsgICAgICAvKiAyLjAgaW4gcTI5ICovCisgIEZJWFBfREJMIE1BU0tISUdIU1BSRU5TSE9SVCA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAgICAgLyogMS41IGluIHEyOSAqLworICBGSVhQX0RCTCBURU4gPSAoRklYUF9EQkwpMHg1MDAwMDAwMDsgICAgICAgICAgICAgICAgICAgIC8qIDEwLjAgaW4gcTI3ICovCiAKLSAgICBpZiAoYmxvY2tUeXBlICE9IFNIT1JUX1dJTkRPVykKLSAgICB7Ci0gICAgICAgIE1BU0tMT1dTUFJFTiA9IE1BU0tMT1dTUFJFTkxPTkc7Ci0gICAgICAgIE1BU0tISUdIU1BSRU4gPSAoYml0cmF0ZT4yMDAwMCk/TUFTS0hJR0hTUFJFTkxPTkc6TUFTS0hJR0hTUFJFTkxPTkdMT1dCUjsKKyAgaWYgKGJsb2NrVHlwZSAhPSBTSE9SVF9XSU5ET1cpIHsKKyAgICBNQVNLTE9XU1BSRU4gPSBNQVNLTE9XU1BSRU5MT05HOworICAgIE1BU0tISUdIU1BSRU4gPQorICAgICAgICAoYml0cmF0ZSA+IDIwMDAwKSA/IE1BU0tISUdIU1BSRU5MT05HIDogTUFTS0hJR0hTUFJFTkxPTkdMT1dCUjsKKyAgfSBlbHNlIHsKKyAgICBNQVNLTE9XU1BSRU4gPSBNQVNLTE9XU1BSRU5TSE9SVDsKKyAgICBNQVNLSElHSFNQUkVOID0gTUFTS0hJR0hTUFJFTlNIT1JUOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG51bVBiOyBpKyspIHsKKyAgICBpZiAoaSA+IDApIHsKKyAgICAgIHBiTWFza0hpRmFjdG9yW2ldID0gZ2V0TWFza0ZhY3RvcigKKyAgICAgICAgICBmTXVsdChNQVNLSElHSCwgKHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaSAtIDFdKSksIDIzLCBURU4sIDI3KTsKKworICAgICAgcGJNYXNrTG9GYWN0b3JbaSAtIDFdID0gZ2V0TWFza0ZhY3RvcigKKyAgICAgICAgICBmTXVsdChNQVNLTE9XLCAocGJCYXJjVmFsdWVbaV0gLSBwYkJhcmNWYWx1ZVtpIC0gMV0pKSwgMjMsIFRFTiwgMjcpOworCisgICAgICBwYk1hc2tIaUZhY3RvclNwckVuW2ldID0gZ2V0TWFza0ZhY3RvcigKKyAgICAgICAgICBmTXVsdChNQVNLSElHSFNQUkVOLCAocGJCYXJjVmFsdWVbaV0gLSBwYkJhcmNWYWx1ZVtpIC0gMV0pKSwgMjMsIFRFTiwKKyAgICAgICAgICAyNyk7CisKKyAgICAgIHBiTWFza0xvRmFjdG9yU3ByRW5baSAtIDFdID0gZ2V0TWFza0ZhY3RvcigKKyAgICAgICAgICBmTXVsdChNQVNLTE9XU1BSRU4sIChwYkJhcmNWYWx1ZVtpXSAtIHBiQmFyY1ZhbHVlW2kgLSAxXSkpLCAyMywgVEVOLAorICAgICAgICAgIDI3KTsKKyAgICB9IGVsc2UgeworICAgICAgcGJNYXNrSGlGYWN0b3JbaV0gPSAoRklYUF9EQkwpMDsKKyAgICAgIHBiTWFza0xvRmFjdG9yW251bVBiIC0gMV0gPSAoRklYUF9EQkwpMDsKKyAgICAgIHBiTWFza0hpRmFjdG9yU3ByRW5baV0gPSAoRklYUF9EQkwpMDsKKyAgICAgIHBiTWFza0xvRmFjdG9yU3ByRW5bbnVtUGIgLSAxXSA9IChGSVhQX0RCTCkwOwogICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBGREthYWNFbmNfaW5pdEJhcmNWYWx1ZXMoSU5UIG51bVBiLCBJTlQgKnBiT2Zmc2V0LCBJTlQgbnVtTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsaW5nRnJlcXVlbmN5LCBGSVhQX0RCTCAqcGJCdmFsKSB7CisgIElOVCBpOworICBGSVhQX0RCTCBNQVhfQkFSQyA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAvKiAyNC4wIGluIHEyNSAqLworCisgIGZvciAoaSA9IDA7IGkgPCBudW1QYjsgaSsrKSB7CisgICAgRklYUF9EQkwgdjEsIHYyLCBjdXJfYmFyazsKKyAgICB2MSA9IEZES2FhY0VuY19CYXJjTGluZVZhbHVlKG51bUxpbmVzLCBwYk9mZnNldFtpXSwgc2FtcGxpbmdGcmVxdWVuY3kpOworICAgIHYyID0gRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUobnVtTGluZXMsIHBiT2Zmc2V0W2kgKyAxXSwgc2FtcGxpbmdGcmVxdWVuY3kpOworICAgIGN1cl9iYXJrID0gKHYxID4+IDEpICsgKHYyID4+IDEpOworICAgIHBiQnZhbFtpXSA9IGZpeE1pbihjdXJfYmFyaywgTUFYX0JBUkMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19pbml0TWluU25yKGNvbnN0IExPTkcgYml0cmF0ZSwgY29uc3QgTE9ORyBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bUxpbmVzLCBjb25zdCBJTlQgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZmJBY3RpdmUsIGNvbnN0IElOVCBibG9ja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiTWluU25yTGREYXRhKSB7CisgIElOVCBzZmI7CisKKyAgLyogRml4IGNvbnZlcnNpb24gdmFyaWFibGVzICovCisgIElOVCBxYmZhYywgcXBlcndpbiwgcWRpdiwgcXBlcHJ0X2NvbnN0LCBxcGVwcnQ7CisgIElOVCBxdG1wLCBxc25yLCBzZmJXaWR0aDsKKworICBGSVhQX0RCTCBNQVhfQkFSQyA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAgIC8qIDI0LjAgaW4gcTI1ICovCisgIEZJWFBfREJMIE1BWF9CQVJDUDEgPSAoRklYUF9EQkwpMHgzMjAwMDAwMDsgLyogMjUuMCBpbiBxMjUgKi8KKyAgRklYUF9EQkwgQklUUzJQRUZBQyA9IChGSVhQX0RCTCkweDRiODUxZWI4OyAvKiAxLjE4IGluIHEzMCAqLworICBGSVhQX0RCTCBQRVJTMlA0ID0gKEZJWFBfREJMKTB4NjI0ZGQyZjI7ICAgIC8qIDAuMDI0IGluIHEzNiAqLworICBGSVhQX0RCTCBPTkVQNSA9IChGSVhQX0RCTCkweDYwMDAwMDAwOyAgICAgIC8qIDEuNSBpbiBxMzAgKi8KKyAgRklYUF9EQkwgTUFYX1NOUiA9IChGSVhQX0RCTCkweDMzMzMzMzMzOyAgICAvKiAwLjggaW4gcTMwICovCisgIEZJWFBfREJMIE1JTl9TTlIgPSAoRklYUF9EQkwpMHgwMDMxMjZlOTsgICAgLyogMC4wMDMgaW4gcTMwICovCisKKyAgRklYUF9EQkwgYmFyY0ZhY3RvciwgcGVQZXJXaW5kb3csIHBlUGFydCwgYmFyY1dpZHRoOworICBGSVhQX0RCTCBwZVBhcnRfY29uc3QsIHRtcCwgc25yLCBvbmVfcXNuciwgb25lX3BvaW50NTsKKworICAvKiByZWxhdGl2ZSBudW1iZXIgb2YgYWN0aXZlIGJhcmtzICovCisgIGJhcmNGYWN0b3IgPSBmRGl2Tm9ybShmaXhNaW4oRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUxpbmVzLCBzZmJPZmZzZXRbc2ZiQWN0aXZlXSwgc2FtcGxlcmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0JBUkMpLAorICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0JBUkNQMSwgJnFiZmFjKTsKKworICBxYmZhYyA9IERGUkFDVF9CSVRTIC0gMSAtIHFiZmFjOworCisgIHBlUGVyV2luZG93ID0gZkRpdk5vcm0oYml0cmF0ZSwgc2FtcGxlcmF0ZSwgJnFwZXJ3aW4pOworICBxcGVyd2luID0gREZSQUNUX0JJVFMgLSAxIC0gcXBlcndpbjsKKyAgcGVQZXJXaW5kb3cgPSBmTXVsdChwZVBlcldpbmRvdywgQklUUzJQRUZBQyk7CisgIHFwZXJ3aW4gPSBxcGVyd2luICsgMzAgLSAoREZSQUNUX0JJVFMgLSAxKTsKKyAgcGVQZXJXaW5kb3cgPSBmTXVsdChwZVBlcldpbmRvdywgUEVSUzJQNCk7CisgIHFwZXJ3aW4gPSBxcGVyd2luICsgMzYgLSAoREZSQUNUX0JJVFMgLSAxKTsKKworICBzd2l0Y2ggKG51bUxpbmVzKSB7CisgICAgY2FzZSAxMDI0OgorICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gLSAxMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI4OgorICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gLSA3OworICAgICAgYnJlYWs7CisgICAgY2FzZSA1MTI6CisgICAgICBxcGVyd2luID0gcXBlcndpbiAtIDk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDoKKyAgICAgIHFwZXJ3aW4gPSBxcGVyd2luIC0gOTsKKyAgICAgIHBlUGVyV2luZG93ID0gZk11bHQocGVQZXJXaW5kb3csIEZMMkZYQ09OU1RfREJMKDQ4MC5mIC8gNTEyLmYpKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogZm9yIHNob3J0IGJsb2NrcyBpdCBpcyBhc3N1bWVkIHRoYXQgbW9yZSBiaXRzIGFyZSBhdmFpbGFibGUgKi8KKyAgaWYgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpIHsKKyAgICBwZVBlcldpbmRvdyA9IGZNdWx0KHBlUGVyV2luZG93LCBPTkVQNSk7CisgICAgcXBlcndpbiA9IHFwZXJ3aW4gKyAzMCAtIChERlJBQ1RfQklUUyAtIDEpOworICB9CisgIHBlUGFydF9jb25zdCA9IGZEaXZOb3JtKHBlUGVyV2luZG93LCBiYXJjRmFjdG9yLCAmcWRpdik7CisgIHFwZXBydF9jb25zdCA9IHFwZXJ3aW4gLSBxYmZhYyArIERGUkFDVF9CSVRTIC0gMSAtIHFkaXY7CisKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CisgICAgYmFyY1dpZHRoID0KKyAgICAgICAgRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUobnVtTGluZXMsIHNmYk9mZnNldFtzZmIgKyAxXSwgc2FtcGxlcmF0ZSkgLQorICAgICAgICBGREthYWNFbmNfQmFyY0xpbmVWYWx1ZShudW1MaW5lcywgc2ZiT2Zmc2V0W3NmYl0sIHNhbXBsZXJhdGUpOworCisgICAgLyogYWRhcHQgdG8gc2ZiIGJhbmRzICovCisgICAgcGVQYXJ0ID0gZk11bHQocGVQYXJ0X2NvbnN0LCBiYXJjV2lkdGgpOworICAgIHFwZXBydCA9IHFwZXBydF9jb25zdCArIDI1IC0gKERGUkFDVF9CSVRTIC0gMSk7CisKKyAgICAvKiBwZSAtPiBzbnIgY2FsY3VsYXRpb24gKi8KKyAgICBzZmJXaWR0aCA9IChzZmJPZmZzZXRbc2ZiICsgMV0gLSBzZmJPZmZzZXRbc2ZiXSk7CisgICAgcGVQYXJ0ID0gZkRpdk5vcm0ocGVQYXJ0LCBzZmJXaWR0aCwgJnFkaXYpOworICAgIHFwZXBydCArPSBERlJBQ1RfQklUUyAtIDEgLSBxZGl2OworCisgICAgdG1wID0gZjJQb3cocGVQYXJ0LCBERlJBQ1RfQklUUyAtIDEgLSBxcGVwcnQsICZxdG1wKTsKKyAgICBxdG1wID0gREZSQUNUX0JJVFMgLSAxIC0gcXRtcDsKKworICAgIC8qIFN1YnRyYWN0IDEuNSAqLworICAgIHFzbnIgPSBmaXhNaW4ocXRtcCwgMzApOworICAgIHRtcCA9IHRtcCA+PiAocXRtcCAtIHFzbnIpOworCisgICAgaWYgKCgzMCArIDEgLSBxc25yKSA+IChERlJBQ1RfQklUUyAtIDEpKQorICAgICAgb25lX3BvaW50NSA9IChGSVhQX0RCTCkwOwogICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE1BU0tMT1dTUFJFTiA9IE1BU0tMT1dTUFJFTlNIT1JUOwotICAgICAgICBNQVNLSElHSFNQUkVOID0gTUFTS0hJR0hTUFJFTlNIT1JUOwotICAgIH0KKyAgICAgIG9uZV9wb2ludDUgPSAoRklYUF9EQkwpKE9ORVA1ID4+ICgzMCArIDEgLSBxc25yKSk7CiAKLSAgICBmb3IoaT0wOyBpPG51bVBiOyBpKyspCi0gICAgewotICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBiTWFza0hpRmFjdG9yW2ldID0gZ2V0TWFza0ZhY3RvcigKLSAgICAgICAgICAgICAgICAgICAgZk11bHQoTUFTS0hJR0gsIChwYkJhcmNWYWx1ZVtpXSAtIHBiQmFyY1ZhbHVlW2ktMV0pKSwgMjMsCi0gICAgICAgICAgICAgICAgICAgIFRFTiwgMjcpOworICAgIHNuciA9ICh0bXAgPj4gMSkgLSAob25lX3BvaW50NSk7CisgICAgcXNuciAtPSAxOwogCi0gICAgICAgICAgICBwYk1hc2tMb0ZhY3RvcltpLTFdID0gZ2V0TWFza0ZhY3RvcigKLSAgICAgICAgICAgICAgICAgICAgZk11bHQoTUFTS0xPVywgKHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaS0xXSkpLCAyMywKLSAgICAgICAgICAgICAgICAgICAgVEVOLCAyNyk7CisgICAgLyogbWF4KHNuciwgMS4wKSAqLworICAgIGlmIChxc25yID4gMCkKKyAgICAgIG9uZV9xc25yID0gKEZJWFBfREJMKSgxIDw8IHFzbnIpOworICAgIGVsc2UKKyAgICAgIG9uZV9xc25yID0gKEZJWFBfREJMKTA7CiAKLSAgICAgICAgICAgIHBiTWFza0hpRmFjdG9yU3ByRW5baV0gPSBnZXRNYXNrRmFjdG9yKAotICAgICAgICAgICAgICAgICAgICBmTXVsdChNQVNLSElHSFNQUkVOLCAocGJCYXJjVmFsdWVbaV0gLSBwYkJhcmNWYWx1ZVtpLTFdKSksIDIzLAotICAgICAgICAgICAgICAgICAgICBURU4sIDI3KTsKKyAgICBzbnIgPSBmaXhNYXgob25lX3FzbnIsIHNucik7CiAKLSAgICAgICAgICAgIHBiTWFza0xvRmFjdG9yU3ByRW5baS0xXSA9IGdldE1hc2tGYWN0b3IoCi0gICAgICAgICAgICAgICAgICAgIGZNdWx0KE1BU0tMT1dTUFJFTiwgKHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaS0xXSkpLCAyMywKLSAgICAgICAgICAgICAgICAgICAgVEVOLCAyNyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwYk1hc2tIaUZhY3RvcltpXSAgICAgICAgICAgID0gKEZJWFBfREJMKTA7Ci0gICAgICAgICAgICBwYk1hc2tMb0ZhY3RvcltudW1QYi0xXSAgICAgID0gKEZJWFBfREJMKTA7Ci0gICAgICAgICAgICBwYk1hc2tIaUZhY3RvclNwckVuW2ldICAgICAgID0gKEZJWFBfREJMKTA7Ci0gICAgICAgICAgICBwYk1hc2tMb0ZhY3RvclNwckVuW251bVBiLTFdID0gKEZJWFBfREJMKTA7Ci0gICAgICAgIH0KLSAgICB9CisgICAgLyogMS9zbnIgKi8KKyAgICBzbnIgPSBmRGl2Tm9ybShvbmVfcXNuciwgc25yLCAmcXNucik7CisgICAgcXNuciA9IERGUkFDVF9CSVRTIC0gMSAtIHFzbnI7CisgICAgc25yID0gKHFzbnIgPiAzMCkgPyAoc25yID4+IChxc25yIC0gMzApKSA6IHNucjsKKworICAgIC8qIHVwcGVyIGxpbWl0IGlzIC0xIGRCICovCisgICAgc25yID0gKHNuciA+IE1BWF9TTlIpID8gTUFYX1NOUiA6IHNucjsKKworICAgIC8qIGxvd2VyIGxpbWl0IGlzIC0yNSBkQiAqLworICAgIHNuciA9IChzbnIgPCBNSU5fU05SKSA/IE1JTl9TTlIgOiBzbnI7CisgICAgc25yID0gc25yIDw8IDE7CisKKyAgICBzZmJNaW5TbnJMZERhdGFbc2ZiXSA9IENhbGNMZERhdGEoc25yKTsKKyAgfQogfQogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfaW5pdEJhcmNWYWx1ZXMoSU5UIG51bVBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1MaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGluZ0ZyZXF1ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYkJ2YWwpCi17Ci0gICAgSU5UIGk7Ci0gICAgRklYUF9EQkwgTUFYX0JBUkMgPSAoRklYUF9EQkwpMHgzMDAwMDAwMDsgLyogMjQuMCBpbiBxMjUgKi8KLQotICAgIGZvcihpPTA7IGk8bnVtUGI7IGkrKykKLSAgICB7Ci0gICAgICAgIEZJWFBfREJMIHYxLCB2MiwgY3VyX2Jhcms7Ci0gICAgICAgIHYxID0gRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUobnVtTGluZXMsIHBiT2Zmc2V0W2ldLCBzYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgIHYyID0gRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUobnVtTGluZXMsIHBiT2Zmc2V0W2krMV0sIHNhbXBsaW5nRnJlcXVlbmN5KTsKLSAgICAgICAgY3VyX2JhcmsgPSAodjEgPj4gMSkgKyAodjIgPj4gMSk7Ci0gICAgICAgIHBiQnZhbFtpXSA9IGZpeE1pbihjdXJfYmFyaywgTUFYX0JBUkMpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2luaXRNaW5TbnIoY29uc3QgTE9ORyAgIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgTE9ORyAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG51bUxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIHNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgYmxvY2tUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpzZmJNaW5TbnJMZERhdGEpCi17Ci0gICAgSU5UIHNmYjsKLQotICAgIC8qIEZpeCBjb252ZXJzaW9uIHZhcmlhYmxlcyAqLwotICAgIElOVCBxYmZhYywgcXBlcndpbiwgcWRpdiwgcXBlcHJ0X2NvbnN0LCBxcGVwcnQ7Ci0gICAgSU5UIHF0bXAsIHFzbnIsIHNmYldpZHRoOwotCi0gICAgRklYUF9EQkwgTUFYX0JBUkMgICAgICAgPSAoRklYUF9EQkwpMHgzMDAwMDAwMDsgLyogMjQuMCBpbiBxMjUgKi8KLSAgICBGSVhQX0RCTCBNQVhfQkFSQ1AxICAgICA9IChGSVhQX0RCTCkweDMyMDAwMDAwOyAvKiAyNS4wIGluIHEyNSAqLwotICAgIEZJWFBfREJMIEJJVFMyUEVGQUMgICAgID0gKEZJWFBfREJMKTB4NGI4NTFlYjg7IC8qIDEuMTggaW4gcTMwICovCi0gICAgRklYUF9EQkwgUEVSUzJQNCAgICAgICAgPSAoRklYUF9EQkwpMHg2MjRkZDJmMjsgLyogMC4wMjQgaW4gcTM2ICovCi0gICAgRklYUF9EQkwgT05FUDUgICAgICAgICAgPSAoRklYUF9EQkwpMHg2MDAwMDAwMDsgLyogMS41IGluIHEzMCAqLwotICAgIEZJWFBfREJMIE1BWF9TTlIgICAgICAgID0gKEZJWFBfREJMKTB4MzMzMzMzMzM7IC8qIDAuOCBpbiBxMzAgKi8KLSAgICBGSVhQX0RCTCBNSU5fU05SICAgICAgICA9IChGSVhQX0RCTCkweDAwMzEyNmU5OyAvKiAwLjAwMyBpbiBxMzAgKi8KLQotICAgIEZJWFBfREJMIGJhcmNGYWN0b3IsIHBlUGVyV2luZG93LCBwZVBhcnQsIGJhcmNXaWR0aDsKLSAgICBGSVhQX0RCTCBwZVBhcnRfY29uc3QsIHRtcCwgc25yLCBvbmVfcXNuciwgb25lX3BvaW50NTsKLQotICAgIC8qIHJlbGF0aXZlIG51bWJlciBvZiBhY3RpdmUgYmFya3MgKi8KLSAgICBiYXJjRmFjdG9yID0gZkRpdk5vcm0oZml4TWluKEZES2FhY0VuY19CYXJjTGluZVZhbHVlKG51bUxpbmVzLCBzZmJPZmZzZXRbc2ZiQWN0aXZlXSwgc2FtcGxlcmF0ZSksIE1BWF9CQVJDKSwKLSAgICAgICAgTUFYX0JBUkNQMSwgJnFiZmFjKTsKLQotICAgIHFiZmFjID0gREZSQUNUX0JJVFMtMS1xYmZhYzsKLQotICAgIHBlUGVyV2luZG93ID0gZkRpdk5vcm0oYml0cmF0ZSwgc2FtcGxlcmF0ZSwgJnFwZXJ3aW4pOwotICAgIHFwZXJ3aW4gPSBERlJBQ1RfQklUUy0xLXFwZXJ3aW47Ci0gICAgcGVQZXJXaW5kb3cgPSBmTXVsdChwZVBlcldpbmRvdywgQklUUzJQRUZBQyk7ICAgICAgICAgICAgICAgICAgIHFwZXJ3aW4gPSBxcGVyd2luICsgMzAgLSAoREZSQUNUX0JJVFMtMSk7Ci0gICAgcGVQZXJXaW5kb3cgPSBmTXVsdChwZVBlcldpbmRvdywgUEVSUzJQNCk7ICAgICAgICAgICAgICAgICAgICAgIHFwZXJ3aW4gPSBxcGVyd2luICsgMzYgLSAoREZSQUNUX0JJVFMtMSk7Ci0KLSAgICBzd2l0Y2ggKG51bUxpbmVzKSB7Ci0gICAgICBjYXNlIDEwMjQ6Ci0gICAgICAgIHFwZXJ3aW4gPSBxcGVyd2luIC0gMTA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMjg6Ci0gICAgICAgIHFwZXJ3aW4gPSBxcGVyd2luIC0gNzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDUxMjoKLSAgICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gLSA5OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDgwOgotICAgICAgICBxcGVyd2luID0gcXBlcndpbiAtIDk7Ci0gICAgICAgIHBlUGVyV2luZG93ID0gZk11bHQocGVQZXJXaW5kb3csIEZMMkZYQ09OU1RfREJMKDQ4MC5mLzUxMi5mKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGZvciBzaG9ydCBibG9ja3MgaXQgaXMgYXNzdW1lZCB0aGF0IG1vcmUgYml0cyBhcmUgYXZhaWxhYmxlICovCi0gICAgaWYgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpCi0gICAgewotICAgICAgICBwZVBlcldpbmRvdyA9IGZNdWx0KHBlUGVyV2luZG93LCBPTkVQNSk7Ci0gICAgICAgIHFwZXJ3aW4gPSBxcGVyd2luICsgMzAgLSAoREZSQUNUX0JJVFMtMSk7Ci0gICAgfQotICAgIHBlUGFydF9jb25zdCA9IGZEaXZOb3JtKHBlUGVyV2luZG93LCBiYXJjRmFjdG9yLCAmcWRpdik7ICAgICAgcXBlcHJ0X2NvbnN0ID0gcXBlcndpbiAtIHFiZmFjICsgREZSQUNUX0JJVFMtMS1xZGl2OwotCi0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKQotICAgIHsKLSAgICAgICAgYmFyY1dpZHRoID0gRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUobnVtTGluZXMsIHNmYk9mZnNldFtzZmIrMV0sIHNhbXBsZXJhdGUpIC0KLSAgICAgICAgICAgIEZES2FhY0VuY19CYXJjTGluZVZhbHVlKG51bUxpbmVzLCBzZmJPZmZzZXRbc2ZiXSwgc2FtcGxlcmF0ZSk7Ci0KLSAgICAgICAgLyogYWRhcHQgdG8gc2ZiIGJhbmRzICovCi0gICAgICAgIHBlUGFydCA9IGZNdWx0KHBlUGFydF9jb25zdCwgYmFyY1dpZHRoKTsgcXBlcHJ0ID0gcXBlcHJ0X2NvbnN0ICsgMjUgLSAoREZSQUNUX0JJVFMtMSk7Ci0KLSAgICAgICAgLyogcGUgLT4gc25yIGNhbGN1bGF0aW9uICovCi0gICAgICAgIHNmYldpZHRoID0gKHNmYk9mZnNldFtzZmIrMV0gLSBzZmJPZmZzZXRbc2ZiXSk7Ci0gICAgICAgIHBlUGFydCA9IGZEaXZOb3JtKHBlUGFydCwgc2ZiV2lkdGgsICZxZGl2KTsgcXBlcHJ0ICs9IERGUkFDVF9CSVRTLTEtcWRpdjsKLQotICAgICAgICB0bXAgPSBmMlBvdyhwZVBhcnQsIERGUkFDVF9CSVRTLTEtcXBlcHJ0LCAmcXRtcCk7Ci0gICAgICAgIHF0bXAgPSBERlJBQ1RfQklUUy0xLXF0bXA7Ci0KLSAgICAgICAgLyogU3VidHJhY3QgMS41ICovCi0gICAgICAgIHFzbnIgPSBmaXhNaW4ocXRtcCwgMzApOwotICAgICAgICB0bXAgPSB0bXAgPj4gKHF0bXAgLSBxc25yKTsKLQotICAgICAgICBpZigoMzArMS1xc25yKSA+IChERlJBQ1RfQklUUy0xKSkKLSAgICAgICAgICAgIG9uZV9wb2ludDUgPSAoRklYUF9EQkwpMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb25lX3BvaW50NSA9IChGSVhQX0RCTCkoT05FUDUgPj4gKDMwKzEtcXNucikpOwotCi0gICAgICAgIHNuciA9ICh0bXA+PjEpIC0gKG9uZV9wb2ludDUpOyBxc25yIC09IDE7Ci0KLSAgICAgICAgLyogbWF4KHNuciwgMS4wKSAqLwotICAgICAgICBpZihxc25yID4gMCkKLSAgICAgICAgICAgIG9uZV9xc25yID0gKEZJWFBfREJMKSgxIDw8IHFzbnIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvbmVfcXNuciA9IChGSVhQX0RCTCkwOwotCi0gICAgICAgIHNuciA9IGZpeE1heChvbmVfcXNuciwgc25yKTsKLQotICAgICAgICAvKiAxL3NuciAqLwotICAgICAgICBzbnIgPSBmRGl2Tm9ybShvbmVfcXNuciwgc25yLCAmcXNucik7Ci0gICAgICAgIHFzbnIgPSBERlJBQ1RfQklUUy0xLXFzbnI7Ci0gICAgICAgIHNuciA9IChxc25yID4gMzApPyAoc25yPj4ocXNuci0zMCkpOnNucjsKLQotICAgICAgICAvKiB1cHBlciBsaW1pdCBpcyAtMSBkQiAqLwotICAgICAgICBzbnIgPSAoc25yID4gTUFYX1NOUikgPyBNQVhfU05SIDogc25yOwotCi0gICAgICAgIC8qIGxvd2VyIGxpbWl0IGlzIC0yNSBkQiAqLwotICAgICAgICBzbnIgPSAoc25yIDwgTUlOX1NOUikgPyBNSU5fU05SIDogc25yOwotICAgICAgICBzbnIgPSBzbnIgPDwgMTsKLQotICAgICAgICBzZmJNaW5TbnJMZERhdGFbc2ZiXSA9IENhbGNMZERhdGEoc25yKTsKLSAgICB9Ci19Ci0KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0UHN5Q29uZmlndXJhdGlvbihJTlQgICBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIGJsb2NrdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHVzZUlTLAorQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRQc3lDb25maWd1cmF0aW9uKElOVCBiaXRyYXRlLCBJTlQgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYmFuZHdpZHRoLCBJTlQgYmxvY2t0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoLCBJTlQgdXNlSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHVzZU1TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OICpwc3lDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCX1RZUEUgZmlsdGVyYmFuaykKLXsKLSAgICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKLSAgICBJTlQgICAgICBzZmI7Ci0gICAgRklYUF9EQkwgc2ZiQmFyY1ZhbFtNQVhfU0ZCXTsKLSAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGhMb25nID0gZ3JhbnVsZUxlbmd0aDsKLSAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGhTaG9ydCA9IGdyYW51bGVMZW5ndGgvVFJBTlNfRkFDOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCX1RZUEUgZmlsdGVyYmFuaykgeworICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKKyAgSU5UIHNmYjsKKyAgRklYUF9EQkwgc2ZiQmFyY1ZhbFtNQVhfU0ZCXTsKKyAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoTG9uZyA9IGdyYW51bGVMZW5ndGg7CisgIGNvbnN0IElOVCBmcmFtZUxlbmd0aFNob3J0ID0gZ3JhbnVsZUxlbmd0aCAvIFRSQU5TX0ZBQzsKKyAgSU5UIGRvd25zY2FsZUZhY3RvciA9IDE7CiAKLSAgICBGREttZW1jbGVhcihwc3lDb25mLCBzaXplb2YoUFNZX0NPTkZJR1VSQVRJT04pKTsKLSAgICBwc3lDb25mLT5ncmFudWxlTGVuZ3RoID0gZ3JhbnVsZUxlbmd0aDsKLSAgICBwc3lDb25mLT5maWx0ZXJiYW5rID0gZmlsdGVyYmFuazsKKyAgc3dpdGNoIChncmFudWxlTGVuZ3RoKSB7CisgICAgY2FzZSAyNTY6CisgICAgY2FzZSAyNDA6CisgICAgICBkb3duc2NhbGVGYWN0b3IgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjg6CisgICAgY2FzZSAxMjA6CisgICAgICBkb3duc2NhbGVGYWN0b3IgPSA0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGRvd25zY2FsZUZhY3RvciA9IDE7CisgICAgICBicmVhazsKKyAgfQogCi0gICAgcHN5Q29uZi0+YWxsb3dJUyAgICAgICA9ICh1c2VJUykgJiYgKCAoYml0cmF0ZS9iYW5kd2lkdGgpIDwgNSApOworICBGREttZW1jbGVhcihwc3lDb25mLCBzaXplb2YoUFNZX0NPTkZJR1VSQVRJT04pKTsKKyAgcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCA9IGdyYW51bGVMZW5ndGg7CisgIHBzeUNvbmYtPmZpbHRlcmJhbmsgPSBmaWx0ZXJiYW5rOwogCi0gICAgLyogaW5pdCBzZmIgdGFibGUgKi8KLSAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19pbml0U2ZiVGFibGUoc2FtcGxlcmF0ZSxibG9ja3R5cGUsZ3JhbnVsZUxlbmd0aCxwc3lDb25mLT5zZmJPZmZzZXQsJnBzeUNvbmYtPnNmYkNudCk7Ci0gICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgIHBzeUNvbmYtPmFsbG93SVMgPSAodXNlSVMpICYmICgoYml0cmF0ZSAvIGJhbmR3aWR0aCkgPCA1KTsKKyAgcHN5Q29uZi0+YWxsb3dNUyA9IHVzZU1TOwogCi0gICAgLyogY2FsY3VsYXRlIGJhcmMgdmFsdWVzIGZvciBlYWNoIHBiICovCi0gICAgRkRLYWFjRW5jX2luaXRCYXJjVmFsdWVzKHBzeUNvbmYtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCi0gICAgICAgICAgICAgICAgICAgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICBzZmJCYXJjVmFsKTsKKyAgLyogaW5pdCBzZmIgdGFibGUgKi8KKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfaW5pdFNmYlRhYmxlKHNhbXBsZXJhdGUgKiBkb3duc2NhbGVGYWN0b3IsIGJsb2NrdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW51bGVMZW5ndGggKiBkb3duc2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsICZwc3lDb25mLT5zZmJDbnQpOwogCi0gICAgRkRLYWFjRW5jX0luaXRNaW5QQ01SZXNvbHV0aW9uKHBzeUNvbmYtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiUGNtUXVhbnRUaHJlc2hvbGQpOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgcmV0dXJuIEVycm9yU3RhdHVzOwogCi0gICAgLyogY2FsY3VsYXRlIHNwcmVhZGluZyBmdW5jdGlvbiAqLwotICAgIEZES2FhY0VuY19pbml0U3ByZWFkaW5nKHBzeUNvbmYtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgIHNmYkJhcmNWYWwsCi0gICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrTG93RmFjdG9yLAotICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0hpZ2hGYWN0b3IsCi0gICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrTG93RmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrSGlnaEZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICAgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgIGJsb2NrdHlwZSk7CisgIC8qIGNhbGN1bGF0ZSBiYXJjIHZhbHVlcyBmb3IgZWFjaCBwYiAqLworICBGREthYWNFbmNfaW5pdEJhcmNWYWx1ZXMocHN5Q29uZi0+c2ZiQ250LCBwc3lDb25mLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXRbcHN5Q29uZi0+c2ZiQ250XSwgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkJhcmNWYWwpOwogCi0gICAgLyogaW5pdCByYXRpbyAqLworICBGREthYWNFbmNfSW5pdE1pblBDTVJlc29sdXRpb24ocHN5Q29uZi0+c2ZiQ250LCBwc3lDb25mLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJQY21RdWFudFRocmVzaG9sZCk7CiAKLSAgICBwc3lDb25mLT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlZ2VyICovCi0gICAgcHN5Q29uZi0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yID0gKEZJWFBfU0dMKTB4MDE0ODsgLyogRkwyRlhDT05TVF9TR0woMC4wMWYpOyAqLyAgLyogZnJhY3QgICAqLworICAvKiBjYWxjdWxhdGUgc3ByZWFkaW5nIGZ1bmN0aW9uICovCisgIEZES2FhY0VuY19pbml0U3ByZWFkaW5nKHBzeUNvbmYtPnNmYkNudCwgc2ZiQmFyY1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0xvd0ZhY3RvciwgcHN5Q29uZi0+c2ZiTWFza0hpZ2hGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0hpZ2hGYWN0b3JTcHJFbiwgYml0cmF0ZSwgYmxvY2t0eXBlKTsKIAotICAgIHBzeUNvbmYtPmNsaXBFbmVyZ3kgPSAoRklYUF9EQkwpMHg3NzM1OTNmZjsgLyogRkwyRlhDT05TVF9EQkwoMS4wZTkqTk9STV9QQ01fRU5FUkdZKTsgKi8KKyAgLyogaW5pdCByYXRpbyAqLwogCi0gICAgaWYgKGJsb2NrdHlwZSE9U0hPUlRfV0lORE9XKSB7Ci0gICAgICAgIHBzeUNvbmYtPmxvd3Bhc3NMaW5lID0gKElOVCkoKDIqYmFuZHdpZHRoKmZyYW1lTGVuZ3RoTG9uZykvc2FtcGxlcmF0ZSk7Ci0gICAgICAgIHBzeUNvbmYtPmxvd3Bhc3NMaW5lTEZFID0gTEZFX0xPV1BBU1NfTElORTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHBzeUNvbmYtPmxvd3Bhc3NMaW5lID0gKElOVCkoKDIqYmFuZHdpZHRoKmZyYW1lTGVuZ3RoU2hvcnQpL3NhbXBsZXJhdGUpOwotICAgICAgICBwc3lDb25mLT5sb3dwYXNzTGluZUxGRSA9IDA7IC8qIExGRSBvbmx5IGluIGxvbmYgYmxvY2tzICovCi0gICAgICAgIC8qIHBzeUNvbmYtPmNsaXBFbmVyZ3kgLz0gKFRSQU5TX0ZBQyAqIFRSQU5TX0ZBQyk7ICovCi0gICAgICAgIHBzeUNvbmYtPmNsaXBFbmVyZ3kgPj49IDY7Ci0gICAgfQorICBwc3lDb25mLT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IgPSAyOyAvKiBpbnRlZ2VyICovCisgIHBzeUNvbmYtPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciA9IChGSVhQX1NHTCkweDAxNDg7CisgIC8qIEZMMkZYQ09OU1RfU0dMKDAuMDFmKTsgKi8gLyogZnJhY3QgICAqLwogCi0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lDb25mLT5zZmJDbnQ7IHNmYisrKXsKLSAgICAgICAgaWYgKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdID49IHBzeUNvbmYtPmxvd3Bhc3NMaW5lKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHBzeUNvbmYtPnNmYkFjdGl2ZSA9IEZES21heChzZmIsIDEpOworICBwc3lDb25mLT5jbGlwRW5lcmd5ID0KKyAgICAgIChGSVhQX0RCTCkweDc3MzU5M2ZmOyAvKiBGTDJGWENPTlNUX0RCTCgxLjBlOSpOT1JNX1BDTV9FTkVSR1kpOyAqLwogCi0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lDb25mLT5zZmJDbnQ7IHNmYisrKXsKLSAgICAgICAgaWYgKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdID49IHBzeUNvbmYtPmxvd3Bhc3NMaW5lTEZFKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHBzeUNvbmYtPnNmYkFjdGl2ZUxGRSA9IHNmYjsKLSAgICBwc3lDb25mLT5zZmJBY3RpdmUgPSBGREttYXgocHN5Q29uZi0+c2ZiQWN0aXZlLCBwc3lDb25mLT5zZmJBY3RpdmVMRkUpOworICBpZiAoYmxvY2t0eXBlICE9IFNIT1JUX1dJTkRPVykgeworICAgIHBzeUNvbmYtPmxvd3Bhc3NMaW5lID0KKyAgICAgICAgKElOVCkoKDIgKiBiYW5kd2lkdGggKiBmcmFtZUxlbmd0aExvbmcpIC8gc2FtcGxlcmF0ZSk7CisgICAgcHN5Q29uZi0+bG93cGFzc0xpbmVMRkUgPSBMRkVfTE9XUEFTU19MSU5FOworICB9IGVsc2UgeworICAgIHBzeUNvbmYtPmxvd3Bhc3NMaW5lID0KKyAgICAgICAgKElOVCkoKDIgKiBiYW5kd2lkdGggKiBmcmFtZUxlbmd0aFNob3J0KSAvIHNhbXBsZXJhdGUpOworICAgIHBzeUNvbmYtPmxvd3Bhc3NMaW5lTEZFID0gMDsgLyogTEZFIG9ubHkgaW4gbG9uZiBibG9ja3MgKi8KKyAgICAvKiBwc3lDb25mLT5jbGlwRW5lcmd5IC89IChUUkFOU19GQUMgKiBUUkFOU19GQUMpOyAqLworICAgIHBzeUNvbmYtPmNsaXBFbmVyZ3kgPj49IDY7CisgIH0KIAotICAgIC8qIGNhbGN1bGF0ZSBtaW5TbnIgKi8KLSAgICBGREthYWNFbmNfaW5pdE1pblNucihiaXRyYXRlLAotICAgICAgICAgICAgICAgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldFtwc3lDb25mLT5zZmJDbnRdLAotICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgYmxvY2t0eXBlLAotICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWluU25yTGREYXRhKTsKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lDb25mLT5zZmJDbnQ7IHNmYisrKSB7CisgICAgaWYgKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdID49IHBzeUNvbmYtPmxvd3Bhc3NMaW5lKSBicmVhazsKKyAgfQorICBwc3lDb25mLT5zZmJBY3RpdmUgPSBmTWF4KHNmYiwgMSk7CiAKLSAgICByZXR1cm4gQUFDX0VOQ19PSzsKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lDb25mLT5zZmJDbnQ7IHNmYisrKSB7CisgICAgaWYgKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdID49IHBzeUNvbmYtPmxvd3Bhc3NMaW5lTEZFKSBicmVhazsKKyAgfQorICBwc3lDb25mLT5zZmJBY3RpdmVMRkUgPSBzZmI7CisgIHBzeUNvbmYtPnNmYkFjdGl2ZSA9IGZNYXgocHN5Q29uZi0+c2ZiQWN0aXZlLCBwc3lDb25mLT5zZmJBY3RpdmVMRkUpOworCisgIC8qIGNhbGN1bGF0ZSBtaW5TbnIgKi8KKyAgRkRLYWFjRW5jX2luaXRNaW5TbnIoYml0cmF0ZSwgc2FtcGxlcmF0ZSAqIGRvd25zY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sIHBzeUNvbmYtPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiQWN0aXZlLCBibG9ja3R5cGUsIHBzeUNvbmYtPnNmYk1pblNuckxkRGF0YSk7CisKKyAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uaCBiL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uaAppbmRleCAzNjI5MjQ2Li41MmIyODg3IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmgKKysrIGIvbGliQUFDZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE4ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBjb25maWd1cmF0aW9uCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBjb25maWd1cmF0aW9uCiAKLSNpZm5kZWYgX1BTWV9DT05GSUdVUkFUSU9OX0gKLSNkZWZpbmUgX1BTWV9DT05GSUdVUkFUSU9OX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgUFNZX0NPTkZJR1VSQVRJT05fSAorI2RlZmluZSBQU1lfQ09ORklHVVJBVElPTl9ICiAKICNpbmNsdWRlICJhYWNlbmMuaCIKICNpbmNsdWRlICJjb21tb25fZml4LmgiCkBAIC05OSw2NyArMTEwLDYyIEBACiAjaW5jbHVkZSAiYWFjZW5jX3Rucy5oIgogI2luY2x1ZGUgImFhY2VuY19wbnMuaCIKIAotI2RlZmluZSBUSFJfU0hJRlRCSVRTICAgICAgICAgNAotI2RlZmluZSBQQ01fUVVBTlRfVEhSX1NDQUxFICAxNgorI2RlZmluZSBUSFJfU0hJRlRCSVRTIDQKKyNkZWZpbmUgUENNX1FVQU5UX1RIUl9TQ0FMRSAxNgorI2RlZmluZSBCSVRTX1BFUl9MSU5FX1NISUZUIDMKIAotI2RlZmluZSBDX1JBVElPIChGSVhQX0RCTCkweDAyOTQwYTEwIC8qIEZMMkZYQ09OU1RfREJMKDAuMDAxMjU4OTI1ZikgPDwgVEhSX1NISUZUQklUUzsgKi8gLyogcG93KDEwLjBmLCAtKDI5LjBmLzEwLjBmKSkgKi8KKyNkZWZpbmUgQ19SQVRJTyBcCisgIChGSVhQX0RCTCkweDAyOTQwYTEwIC8qIEZMMkZYQ09OU1RfREJMKDAuMDAxMjU4OTI1ZikgPDwgVEhSX1NISUZUQklUUzsgKi8gLyogcG93KDEwLjBmLCAtKDI5LjBmLzEwLjBmKSkgKi8KIAotdHlwZWRlZiBzdHJ1Y3R7Ci0KLSAgSU5UIHNmYkNudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4aXN0aW5nIHNmIGJhbmRzICovCi0gIElOVCBzZmJBY3RpdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzZiBiYW5kcyBjb250YWluaW5nIGVuZXJneSBhZnRlciBsb3dwYXNzICovCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBzZmJDbnQ7ICAgIC8qIG51bWJlciBvZiBleGlzdGluZyBzZiBiYW5kcyAqLworICBJTlQgc2ZiQWN0aXZlOyAvKiBudW1iZXIgb2Ygc2YgYmFuZHMgY29udGFpbmluZyBlbmVyZ3kgYWZ0ZXIgbG93cGFzcyAqLwogICBJTlQgc2ZiQWN0aXZlTEZFOwotICBJTlQgc2ZiT2Zmc2V0W01BWF9TRkIrMV07CisgIElOVCBzZmJPZmZzZXRbTUFYX1NGQiArIDFdOwogCi0gIElOVCAgICAgICBmaWx0ZXJiYW5rOyAgICAgICAgICAgICAgICAgICAgIC8qIExDLCBMRCBvciBFTEQgKi8KKyAgSU5UIGZpbHRlcmJhbms7IC8qIExDLCBMRCBvciBFTEQgKi8KIAotICBGSVhQX0RCTCAgc2ZiUGNtUXVhbnRUaHJlc2hvbGRbTUFYX1NGQl07CisgIEZJWFBfREJMIHNmYlBjbVF1YW50VGhyZXNob2xkW01BWF9TRkJdOwogCi0gIElOVCAgICAgICBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3I7ICAgICAgICAgIC8qIHByZWVjaG8gY29udHJvbCAqLwotICBGSVhQX1NHTCAgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yOworICBJTlQgbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yOyAvKiBwcmVlY2hvIGNvbnRyb2wgKi8KKyAgRklYUF9TR0wgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yOwogCi0gIElOVCAgICAgICBsb3dwYXNzTGluZTsKLSAgSU5UICAgICAgIGxvd3Bhc3NMaW5lTEZFOwotICBGSVhQX0RCTCAgY2xpcEVuZXJneTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgbGV2ZWwgZGVwZW5kZW5kIHRtbiAqLworICBJTlQgbG93cGFzc0xpbmU7CisgIElOVCBsb3dwYXNzTGluZUxGRTsKKyAgRklYUF9EQkwgY2xpcEVuZXJneTsgLyogZm9yIGxldmVsIGRlcGVuZGVuZCB0bW4gKi8KIAotICBGSVhQX0RCTCAgc2ZiTWFza0xvd0ZhY3RvcltNQVhfU0ZCXTsKLSAgRklYUF9EQkwgIHNmYk1hc2tIaWdoRmFjdG9yW01BWF9TRkJdOworICBGSVhQX0RCTCBzZmJNYXNrTG93RmFjdG9yW01BWF9TRkJdOworICBGSVhQX0RCTCBzZmJNYXNrSGlnaEZhY3RvcltNQVhfU0ZCXTsKIAotICBGSVhQX0RCTCAgc2ZiTWFza0xvd0ZhY3RvclNwckVuW01BWF9TRkJdOwotICBGSVhQX0RCTCAgc2ZiTWFza0hpZ2hGYWN0b3JTcHJFbltNQVhfU0ZCXTsKKyAgRklYUF9EQkwgc2ZiTWFza0xvd0ZhY3RvclNwckVuW01BWF9TRkJdOworICBGSVhQX0RCTCBzZmJNYXNrSGlnaEZhY3RvclNwckVuW01BWF9TRkJdOwogCi0gIEZJWFBfREJMICBzZmJNaW5TbnJMZERhdGFbTUFYX1NGQl07ICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gc25yIChmb3JtZXJseSBrbm93biBhcyBibWF4KSAqLworICBGSVhQX0RCTCBzZmJNaW5TbnJMZERhdGFbTUFYX1NGQl07IC8qIG1pbmltdW0gc25yIChmb3JtZXJseSBrbm93biBhcyBibWF4KSAqLwogCiAgIFROU19DT05GSUcgdG5zQ29uZjsKICAgUE5TX0NPTkZJRyBwbnNDb25mOwogCi0gIElOVCAgICAgICAgZ3JhbnVsZUxlbmd0aDsKLSAgSU5UICAgICAgICBhbGxvd0lTOworICBJTlQgZ3JhbnVsZUxlbmd0aDsKKyAgSU5UIGFsbG93SVM7CisgIElOVCBhbGxvd01TOworfSBQU1lfQ09ORklHVVJBVElPTjsKIAotfVBTWV9DT05GSUdVUkFUSU9OOwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBzZmJDbnQ7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgKi8KKyAgVUNIQVIgc2ZiV2lkdGhbTUFYX1NGQl9MT05HXTsgLyogV2lkdGggb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIGxvbmcgYmxvY2tzICovCit9IFNGQl9QQVJBTV9MT05HOwogCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIHNmYkNudDsgLyogTnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmRzICovCisgIFVDSEFSCisgIHNmYldpZHRoW01BWF9TRkJfU0hPUlRdOyAvKiBXaWR0aCBvZiBzY2FsZWZhY3RvciBiYW5kcyBmb3Igc2hvcnQgYmxvY2tzICovCit9IFNGQl9QQVJBTV9TSE9SVDsKIAotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgVUNIQVIgc2ZiQ250OyAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzY2FsZWZhY3RvciBiYW5kcyAqLwotICAgIFVDSEFSIHNmYldpZHRoW01BWF9TRkJfTE9OR107ICAgICAvKiBXaWR0aCBvZiBzY2FsZWZhY3RvciBiYW5kcyBmb3IgbG9uZyBibG9ja3MgKi8KLX1TRkJfUEFSQU1fTE9ORzsKLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgVUNIQVIgc2ZiQ250OyAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzY2FsZWZhY3RvciBiYW5kcyAqLwotICAgIFVDSEFSIHNmYldpZHRoW01BWF9TRkJfU0hPUlRdOyAgICAvKiBXaWR0aCBvZiBzY2FsZWZhY3RvciBiYW5kcyBmb3Igc2hvcnQgYmxvY2tzICovCi19U0ZCX1BBUkFNX1NIT1JUOwotCi0KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0UHN5Q29uZmlndXJhdGlvbihJTlQgIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICBzYW1wbGVyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgYmxvY2t0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgZ3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgIHVzZUlTLAorQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRQc3lDb25maWd1cmF0aW9uKElOVCBiaXRyYXRlLCBJTlQgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYmFuZHdpZHRoLCBJTlQgYmxvY2t0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoLCBJTlQgdXNlSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHVzZU1TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OICpwc3lDb25mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCX1RZUEUgZmlsdGVyYmFuayk7CiAKLSNlbmRpZiAvKiBfUFNZX0NPTkZJR1VSQVRJT05fSCAqLwotCi0KLQorI2VuZGlmIC8qIFBTWV9DT05GSUdVUkFUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbnN0LmggYi9saWJBQUNlbmMvc3JjL3BzeV9jb25zdC5oCmluZGV4IGQ5YzlmNDMuLmMyZDUzMDQgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbnN0LmgKKysrIGIvbGliQUFDZW5jL3NyYy9wc3lfY29uc3QuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzNyArOTAsMzQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBHbG9iYWwgcHN5Y2hvYWNjb3VzdGljIGNvbnN0YW50cworICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX1BTWUNPTlNUX0gKLSNkZWZpbmUgX1BTWUNPTlNUX0gKKyAgIERlc2NyaXB0aW9uOiBHbG9iYWwgcHN5Y2hvYWNjb3VzdGljIGNvbnN0YW50cwogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIFRSVUUgIDEKKyNpZm5kZWYgUFNZX0NPTlNUX0gKKyNkZWZpbmUgUFNZX0NPTlNUX0gKKworI2RlZmluZSBUUlVFIDEKICNkZWZpbmUgRkFMU0UgMAogCi0gICNkZWZpbmUgVFJBTlNfRkFDICAgICAgICAgOCAgLyogZW5jb2RlciBzaG9ydCBsb25nIHJhdGlvICovCisjZGVmaW5lIFRSQU5TX0ZBQyA4IC8qIGVuY29kZXIgc2hvcnQgbG9uZyByYXRpbyAqLwogCi0jZGVmaW5lIEZSQU1FX01BWExFTl9TSE9SVCAgICAoKDEwMjQpL1RSQU5TX0ZBQykKLSNkZWZpbmUgRlJBTUVfTEVOX1NIT1JUXzEyOCAgICgoMTAyNCkvVFJBTlNfRkFDKQorI2RlZmluZSBGUkFNRV9NQVhMRU5fU0hPUlQgKCgxMDI0KSAvIFRSQU5TX0ZBQykKKyNkZWZpbmUgRlJBTUVfTEVOX1NIT1JUXzEyOCAoKDEwMjQpIC8gVFJBTlNfRkFDKQorI2RlZmluZSBGUkFNRV9MRU5fU0hPUlRfMTIwIChGUkFNRV9MRU5fTE9OR185NjAgLyBUUkFOU19GQUMpCiAKIC8qIEZpbHRlcmJhbmsgdHlwZSovCi1lbnVtIEZCX1RZUEUgewotICBGQl9MQyAgPSAwLAotICBGQl9MRCAgPSAxLAotICBGQl9FTEQgPSAyCi19OworZW51bSBGQl9UWVBFIHsgRkJfTEMgPSAwLCBGQl9MRCA9IDEsIEZCX0VMRCA9IDIgfTsKIAogLyogQmxvY2sgdHlwZXMgKi8KICNkZWZpbmUgTl9CTE9DS1RZUEVTIDYKLWVudW0KLXsKK2VudW0gewogICBMT05HX1dJTkRPVyA9IDAsCiAgIFNUQVJUX1dJTkRPVywKICAgU0hPUlRfV0lORE9XLApAQCAtMTE5LDQyICsxMjcsNDIgQEAKIH07CiAKIC8qIFdpbmRvdyBzaGFwZXMgKi8KLWVudW0KLXsKK2VudW0gewogICBTSU5FX1dJTkRPVyA9IDAsCi0gIEtCRF9XSU5ET1cgID0gMSwKKyAgS0JEX1dJTkRPVyA9IDEsCiAgIExPTF9XSU5ET1cgPSAyIC8qIExvdyBPdmVyTGFwIHdpbmRvdyBzaGFwZSBmb3IgQUFDLUxEICovCiB9OwogCiAvKgogICBNUyBzdHVmZgogKi8KLWVudW0KLXsKLSAgU0lfTVNfTUFTS19OT05FID0gMCwKLSAgU0lfTVNfTUFTS19TT01FID0gMSwKLSAgU0lfTVNfTUFTS19BTEwgID0gMgotfTsKK2VudW0geyBTSV9NU19NQVNLX05PTkUgPSAwLCBTSV9NU19NQVNLX1NPTUUgPSAxLCBTSV9NU19NQVNLX0FMTCA9IDIgfTsKIAorI2RlZmluZSBNQVhfTk9fT0ZfR1JPVVBTIDQKKyNkZWZpbmUgTUFYX1NGQl9MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA1MSAvKiA1MSBmb3IgYSBtZW1vcnkgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLCBtYXliZSA2NCBmb3IgY29udmVuaWVudCBcCisgICAgICAgIGRlYnVnZ2luZyAqLworI2RlZmluZSBNQVhfU0ZCX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDE1IC8qIDE1IGZvciBhIG1lbW9yeSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24sIG1heWJlIDE2IGZvciBjb252ZW5pZW50IFwKKyAgICAgICAgZGVidWdnaW5nICovCiAKLSAgI2RlZmluZSBNQVhfTk9fT0ZfR1JPVVBTICAgNAotICAjZGVmaW5lIE1BWF9TRkJfTE9ORyAgICAgICA1MSAgLyogNTEgZm9yIGEgbWVtb3J5IG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiwgbWF5YmUgNjQgZm9yIGNvbnZlbmllbnQgZGVidWdnaW5nICovCi0gICNkZWZpbmUgTUFYX1NGQl9TSE9SVCAgICAgIDE1ICAvKiAxNSBmb3IgYSBtZW1vcnkgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLCBtYXliZSAxNiBmb3IgY29udmVuaWVudCBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgTUFYX1NGQiBcCisgIChNQVhfU0ZCX1NIT1JUID4gTUFYX1NGQl9MT05HID8gTUFYX1NGQl9TSE9SVCA6IE1BWF9TRkJfTE9ORykgLyogPSA1MSAqLworI2RlZmluZSBNQVhfR1JPVVBFRF9TRkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTUFYX05PX09GX0dST1VQUyAqIE1BWF9TRkJfU0hPUlQgPiBNQVhfU0ZCX0xPTkcgXAorICAgICAgID8gTUFYX05PX09GX0dST1VQUyAqIE1BWF9TRkJfU0hPUlQgICAgICAgICAgXAorICAgICAgIDogTUFYX1NGQl9MT05HKSAvKiA9IDYwICovCiAKLSNkZWZpbmUgTUFYX1NGQiAgICAgICAgIChNQVhfU0ZCX1NIT1JUID4gTUFYX1NGQl9MT05HID8gTUFYX1NGQl9TSE9SVCA6IE1BWF9TRkJfTE9ORykgICAvKiA9IDUxICovCi0jZGVmaW5lIE1BWF9HUk9VUEVEX1NGQiAoTUFYX05PX09GX0dST1VQUypNQVhfU0ZCX1NIT1JUID4gTUFYX1NGQl9MT05HID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9OT19PRl9HUk9VUFMqTUFYX1NGQl9TSE9SVCA6IE1BWF9TRkJfTE9ORykgLyogPSA2MCAqLworI2RlZmluZSBNQVhfSU5QVVRfQlVGRkVSX1NJWkUgKDIgKiAoMTAyNCkpIC8qIDIwNDggKi8KIAotI2RlZmluZSBNQVhfSU5QVVRfQlVGRkVSX1NJWkUgICgyKigxMDI0KSkgICAvKiAyMDQ4ICovCisjZGVmaW5lIFBDTV9MRVZFTCAxLjBmCisjZGVmaW5lIE5PUk1fUENNIChQQ01fTEVWRUwgLyAzMjc2OC4wZikKKyNkZWZpbmUgTk9STV9QQ01fRU5FUkdZIChOT1JNX1BDTSAqIE5PUk1fUENNKQorI2RlZmluZSBMT0dfTk9STV9QQ00gLTE1CiAKKyNkZWZpbmUgVE5TX1BSRURHQUlOX1NDQUxFICgxMDAwKQogCi0jZGVmaW5lIFBDTV9MRVZFTCAgICAgICAgICAgICAxLjBmCi0jZGVmaW5lIE5PUk1fUENNICAgICAgICAgICAgICAoUENNX0xFVkVMLzMyNzY4LjBmKQotI2RlZmluZSBOT1JNX1BDTV9FTkVSR1kgICAgICAgKE5PUk1fUENNKk5PUk1fUENNKQotI2RlZmluZSBMT0dfTk9STV9QQ00gICAgICAgICAgLTE1CisjZGVmaW5lIExGRV9MT1dQQVNTX0xJTkUgMTIKKyNkZWZpbmUgTEZFX0xPV1BBU1NfTElORV9NSU4gNAogCi0jZGVmaW5lIFROU19QUkVER0FJTl9TQ0FMRSAgICAoMTAwMCkKLQotI2RlZmluZSBMRkVfTE9XUEFTU19MSU5FICAgICAgMTIKLQotI2VuZGlmIC8qIF9QU1lDT05TVF9IICovCisjZW5kaWYgLyogUFNZX0NPTlNUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcHN5X2RhdGEuaCBiL2xpYkFBQ2VuYy9zcmMvcHN5X2RhdGEuaAppbmRleCA3MTgzOTU1Li5mYzA0NzM0IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3BzeV9kYXRhLmgKKysrIGIvbGliQUFDZW5jL3NyYy9wc3lfZGF0YS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDc0ICs5MCw4MCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBkYXRhCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBkYXRhCiAKLSNpZm5kZWYgX1BTWV9EQVRBX0gKLSNkZWZpbmUgX1BTWV9EQVRBX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgUFNZX0RBVEFfSAorI2RlZmluZSBQU1lfREFUQV9ICiAKICNpbmNsdWRlICJibG9ja19zd2l0Y2guaCIKKyNpbmNsdWRlICJtZGN0LmgiCiAKIC8qIEJlIGNhcmVmdWwgd2l0aCBNQVhfU0ZCX0xPTkcgYXMgbGVuZ3RoIG9mIHRoZSAuTG9uZyBhcnJheXMuCi0gKiBzZmJFbmVyZ3kuTG9uZyBhbmQgc2ZiRW5lcmd5TVMuTG9uZyBhbmQgc2ZiVGhyZXNob2xkLkxvbmcgYXJlIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgdGhlIHJlZ3JvdXBlZAotICogc2hvcnQgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgYmV0d2VlbiBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoKSBhbmQgQnVpbGRJbnRlcmZhY2UoKSBpbiBGREthYWNFbmNfcHN5TWFpbigpLgotICogVGhlIHNwYWNlIHJlcXVpcmVkIGZvciB0aGlzIGlzIE1BWF9HUk9VUEVEX1NGQiAoID0gTUFYX05PX09GX0dST1VQUypNQVhfU0ZCX1NIT1JUICkuCi0gKiBIb3dldmVyLCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgaWYgdW5pb25zIGFyZSB1c2VkICh3aGljaCBpcyBub3QgcG9zc2libGUgd2l0aCBwZmxvYXQpLiAqLworICogc2ZiRW5lcmd5LkxvbmcgYW5kIHNmYkVuZXJneU1TLkxvbmcgYW5kIHNmYlRocmVzaG9sZC5Mb25nIGFyZSB1c2VkIGFzIGEKKyAqIHRlbXBvcmFyeSBzdG9yYWdlIGZvciB0aGUgcmVncm91cGVkIHNob3J0IGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzIGJldHdlZW4KKyAqIEZES2FhY0VuY19ncm91cFNob3J0RGF0YSgpIGFuZCBCdWlsZEludGVyZmFjZSgpIGluIEZES2FhY0VuY19wc3lNYWluKCkuIFRoZQorICogc3BhY2UgcmVxdWlyZWQgZm9yIHRoaXMgaXMgTUFYX0dST1VQRURfU0ZCICggPSBNQVhfTk9fT0ZfR1JPVVBTKk1BWF9TRkJfU0hPUlQKKyAqICkuIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGltcG9ydGFudCBpZiB1bmlvbnMgYXJlIHVzZWQgKHdoaWNoIGlzIG5vdCBwb3NzaWJsZQorICogd2l0aCBwZmxvYXQpLiAqLwogCi10eXBlZGVmIHNob3VsZEJlVW5pb257Ci0gIEZJWFBfREJMICBMb25nW01BWF9HUk9VUEVEX1NGQl07Ci0gIEZJWFBfREJMICBTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOwotfVNGQl9USFJFU0hPTEQ7Cit0eXBlZGVmIHNob3VsZEJlVW5pb24geworICBGSVhQX0RCTCBMb25nW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIFNob3J0W1RSQU5TX0ZBQ11bTUFYX1NGQl9TSE9SVF07Cit9CitTRkJfVEhSRVNIT0xEOwogCi10eXBlZGVmIHNob3VsZEJlVW5pb257Ci0gIEZJWFBfREJMICBMb25nW01BWF9HUk9VUEVEX1NGQl07Ci0gIEZJWFBfREJMICBTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOwotfVNGQl9FTkVSR1k7Cit0eXBlZGVmIHNob3VsZEJlVW5pb24geworICBGSVhQX0RCTCBMb25nW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIFNob3J0W1RSQU5TX0ZBQ11bTUFYX1NGQl9TSE9SVF07Cit9CitTRkJfRU5FUkdZOwogCi10eXBlZGVmIHNob3VsZEJlVW5pb257Ci0gIEZJWFBfREJMICBMb25nW01BWF9HUk9VUEVEX1NGQl07Ci0gIEZJWFBfREJMICBTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOwotfVNGQl9MRF9FTkVSR1k7Cit0eXBlZGVmIHNob3VsZEJlVW5pb24geworICBGSVhQX0RCTCBMb25nW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIFNob3J0W1RSQU5TX0ZBQ11bTUFYX1NGQl9TSE9SVF07Cit9CitTRkJfTERfRU5FUkdZOwogCi10eXBlZGVmIHNob3VsZEJlVW5pb257Ci0gIElOVCAgTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOwotICBJTlQgIFNob3J0W1RSQU5TX0ZBQ11bTUFYX1NGQl9TSE9SVF07Ci19U0ZCX01BWF9TQ0FMRTsKK3R5cGVkZWYgc2hvdWxkQmVVbmlvbiB7CisgIElOVCBMb25nW01BWF9HUk9VUEVEX1NGQl07CisgIElOVCBTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOworfQorU0ZCX01BWF9TQ0FMRTsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBJTlRfUENNKiBwc3lJbnB1dEJ1ZmZlcjsKKyAgRklYUF9EQkwgb3ZlcmxhcEFkZEJ1ZmZlclszICogNTEyIC8gMl07CiAKLXR5cGVkZWYgc3RydWN0ewotICBJTlRfUENNKiAgICAgICAgICAgICAgICAgIHBzeUlucHV0QnVmZmVyOwotICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgIG92ZXJsYXBBZGRCdWZmZXJbMTAyNF07CisgIG1kY3RfdCBtZGN0UGVyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTURDVCBwZXJzaXN0ZW50IGRhdGEgKi8KKyAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgYmxvY2tTd2l0Y2hpbmdDb250cm9sOyAvKiBibG9jayBzd2l0Y2hpbmcgKi8KKyAgRklYUF9EQkwgc2ZiVGhyZXNob2xkbm0xW01BWF9TRkJdOyAgICAgICAgICAgICAvKiBGREthYWNFbmNfUHJlRWNob0NvbnRyb2wgKi8KKyAgSU5UIG1kY3RTY2FsZW5tMTsgLyogc2NhbGUgb2YgbGFzdCBibG9jaydzIG1kY3QgKEZES2FhY0VuY19QcmVFY2hvQ29udHJvbCkgKi8KKyAgSU5UIGNhbGNQcmVFY2hvOworICBJTlQgaXNMRkU7Cit9IFBTWV9TVEFUSUM7CiAKLSAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgICBibG9ja1N3aXRjaGluZ0NvbnRyb2w7ICAgICAgICAgICAgICAvKiBibG9jayBzd2l0Y2hpbmcgKi8KLSAgRklYUF9EQkwgICAgICAgICAgICAgICAgICBzZmJUaHJlc2hvbGRubTFbTUFYX1NGQl07ICAgICAgICAgICAvKiBGREthYWNFbmNfUHJlRWNob0NvbnRyb2wgKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgICAgICBtZGN0U2NhbGVubTE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBvZiBsYXN0IGJsb2NrJ3MgbWRjdCAoRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sKSAqLwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgIGNhbGNQcmVFY2hvOwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgIGlzTEZFOwotfVBTWV9TVEFUSUM7Cit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfREJMKiBtZGN0U3BlY3RydW07CisgIFNGQl9USFJFU0hPTEQgc2ZiVGhyZXNob2xkOyAgICAvKiBhZGFwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTRkJfRU5FUkdZIHNmYkVuZXJneTsgICAgICAgICAgLyogc2ZiIGVuZXJnaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0ZCX0xEX0VORVJHWSBzZmJFbmVyZ3lMZERhdGE7IC8qIHNmYiBlbmVyZ2llcyBpbiBsZERhdGEgZm9ybWF0ICAgICAgICAgICovCisgIFNGQl9NQVhfU0NBTEUgc2ZiTWF4U2NhbGVTcGVjOworICBTRkJfRU5FUkdZIHNmYkVuZXJneU1TOyAvKiBtaWQvc2lkZSBzZmIgZW5lcmdpZXMgICAgICAgICAgICAgICAgICAqLworICBGSVhQX0RCTCBzZmJFbmVyZ3lNU0xkRGF0YVtNQVhfR1JPVVBFRF9TRkJdOyAvKiBtaWQvc2lkZSBzZmIgZW5lcmdpZXMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGREYXRhIGZvcm1hdCAqLworICBTRkJfRU5FUkdZIHNmYlNwcmVhZEVuZXJneTsKKyAgSU5UIG1kY3RTY2FsZTsgLyogZXhwb25lbnQgb2YgZGF0YSBpbiBtZGN0U3BlY3RydW0gICAgICAgKi8KKyAgSU5UIGdyb3VwZWRTZmJPZmZzZXRbTUFYX0dST1VQRURfU0ZCICsgMV07CisgIElOVCBzZmJBY3RpdmU7CisgIElOVCBsb3dwYXNzTGluZTsKK30gUFNZX0RBVEE7CiAKLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIEZJWFBfREJMICAgICAgICAgICAgICAgICAqbWRjdFNwZWN0cnVtOwotICBTRkJfVEhSRVNIT0xEICAgICAgICAgICAgIHNmYlRocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkYXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFNGQl9FTkVSR1kgICAgICAgICAgICAgICAgc2ZiRW5lcmd5OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2ZiIGVuZXJnaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgU0ZCX0xEX0VORVJHWSAgICAgICAgICAgICBzZmJFbmVyZ3lMZERhdGE7ICAgICAgICAgICAgICAgICAgICAvKiBzZmIgZW5lcmdpZXMgaW4gbGREYXRhIGZvcm1hdCAgICAgICAgICAqLwotICBTRkJfTUFYX1NDQUxFICAgICAgICAgICAgIHNmYk1heFNjYWxlU3BlYzsKLSAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgICBzZmJFbmVyZ3lNUzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaWQvc2lkZSBzZmIgZW5lcmdpZXMgICAgICAgICAgICAgICAgICAqLwotICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgIHNmYkVuZXJneU1TTGREYXRhW01BWF9HUk9VUEVEX1NGQl07IC8qIG1pZC9zaWRlIHNmYiBlbmVyZ2llcyBpbiBsZERhdGEgZm9ybWF0ICovCi0gIFNGQl9FTkVSR1kgICAgICAgICAgICAgICAgc2ZiU3ByZWFkRW5lcmd5OwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgIG1kY3RTY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4cG9uZW50IG9mIGRhdGEgaW4gbWRjdFNwZWN0cnVtICAgICAgICovCi0gIElOVCAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFNmYk9mZnNldFtNQVhfR1JPVVBFRF9TRkIrMV07Ci0gIElOVCAgICAgICAgICAgICAgICAgICAgICAgc2ZiQWN0aXZlOwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgIGxvd3Bhc3NMaW5lOwotfVBTWV9EQVRBOwotCi0KLSNlbmRpZiAvKiBfUFNZX0RBVEFfSCAqLworI2VuZGlmIC8qIFBTWV9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcHN5X21haW4uY3BwIGIvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5jcHAKaW5kZXggNDQ2Yzg5NC4uZjYzNDVlNCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogUHN5Y2hvYWNjb3VzdGljIG1ham9yIGZ1bmN0aW9uIGJsb2NrCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBtYWpvciBmdW5jdGlvbiBibG9jaworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAKQEAgLTEwNywxNSArMTE5LDEzIEBACiAjaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgogI2luY2x1ZGUgImludGVuc2l0eS5oIgogCi0KLQogLyogYmxlbmRpbmcgdG8gcmVkdWNlIGdpYmJzIGFydGlmYWN0cyAqLwogI2RlZmluZSBGQURFX09VVF9MRU4gNgotc3RhdGljIGNvbnN0IEZJWFBfREJMIGZhZGVPdXRGYWN0b3JbRkFERV9PVVRfTEVOXSA9IHsxODQwNjQ0MDk2LCAxNTMzODcwMDgwLCAxMjI3MDk2MDY0LCA5MjAzMjIwNDgsIDYxMzU0ODAzMiwgMzA2Nzc0MDE2fTsKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBmYWRlT3V0RmFjdG9yW0ZBREVfT1VUX0xFTl0gPSB7CisgICAgMTg0MDY0NDA5NiwgMTUzMzg3MDA4MCwgMTIyNzA5NjA2NCwgOTIwMzIyMDQ4LCA2MTM1NDgwMzIsIDMwNjc3NDAxNn07CiAKIC8qIGZvcndhcmQgZGVmaW5pdGlvbnMgKi8KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1BzeU5ldwpAQCAtMTI0LDU2ICsxMzQsNTIgQEAKICAgICBpbnB1dDogICAgICAgIHBvaW50ZXIgdG8gYSBwc3ljaCBoYW5kbGUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUHN5TmV3KFBTWV9JTlRFUk5BTCAgKipwaHBzeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5FbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5DaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAgICAgICAqZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7Ci0gICAgUFNZX0lOVEVSTkFMICpoUHN5OwotICAgIElOVCBpOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1BzeU5ldyhQU1lfSU5URVJOQUwgKipwaHBzeSwgY29uc3QgSU5UIG5FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywgVUNIQVIgKmR5bmFtaWNfUkFNKSB7CisgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOworICBQU1lfSU5URVJOQUwgKmhQc3k7CisgIElOVCBpOwogCi0gICAgaFBzeSA9IEdldFJhbV9hYWNFbmNfUHN5SW50ZXJuYWwoKTsKLSAgICAqcGhwc3kgPSBoUHN5OwotICAgIGlmIChoUHN5ID09IE5VTEwpIHsKKyAgaFBzeSA9IEdldFJhbV9hYWNFbmNfUHN5SW50ZXJuYWwoKTsKKyAgKnBocHN5ID0gaFBzeTsKKyAgaWYgKGhQc3kgPT0gTlVMTCkgeworICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgZ290byBiYWlsOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG5FbGVtZW50czsgaSsrKSB7CisgICAgLyogUFNZX0VMRU1FTlQgKi8KKyAgICBoUHN5LT5wc3lFbGVtZW50W2ldID0gR2V0UmFtX2FhY0VuY19Qc3lFbGVtZW50KGkpOworICAgIGlmIChoUHN5LT5wc3lFbGVtZW50W2ldID09IE5VTEwpIHsKICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQorICB9CiAKLSAgICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgewotICAgICAgICAvKiBQU1lfRUxFTUVOVCAqLwotICAgICAgICBoUHN5LT5wc3lFbGVtZW50W2ldID0gR2V0UmFtX2FhY0VuY19Qc3lFbGVtZW50KGkpOwotICAgICAgICBpZiAoaFBzeS0+cHN5RWxlbWVudFtpXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKLSAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgIH0KKyAgZm9yIChpID0gMDsgaSA8IG5DaGFubmVsczsgaSsrKSB7CisgICAgLyogUFNZX1NUQVRJQyAqLworICAgIGhQc3ktPnBTdGF0aWNDaGFubmVsc1tpXSA9IEdldFJhbV9hYWNFbmNfUHN5U3RhdGljKGkpOworICAgIGlmIChoUHN5LT5wU3RhdGljQ2hhbm5lbHNbaV0gPT0gTlVMTCkgeworICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKKyAgICAgIGdvdG8gYmFpbDsKICAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxuQ2hhbm5lbHM7IGkrKykgewotICAgICAgICAvKiBQU1lfU1RBVElDICovCi0gICAgICAgIGhQc3ktPnBTdGF0aWNDaGFubmVsc1tpXSA9IEdldFJhbV9hYWNFbmNfUHN5U3RhdGljKGkpOwotICAgICAgICBpZiAoaFBzeS0+cFN0YXRpY0NoYW5uZWxzW2ldPT1OVUxMKSB7Ci0gICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKLSAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgLyogQVVESU8gSU5QVVQgQlVGRkVSICovCi0gICAgICAgIGhQc3ktPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIgPSBHZXRSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyKGkpOwotICAgICAgICBpZiAoaFBzeS0+cFN0YXRpY0NoYW5uZWxzW2ldLT5wc3lJbnB1dEJ1ZmZlcj09TlVMTCkgewotICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7Ci0gICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9CisgICAgLyogQVVESU8gSU5QVVQgQlVGRkVSICovCisgICAgaFBzeS0+cFN0YXRpY0NoYW5uZWxzW2ldLT5wc3lJbnB1dEJ1ZmZlciA9IEdldFJhbV9hYWNFbmNfUHN5SW5wdXRCdWZmZXIoaSk7CisgICAgaWYgKGhQc3ktPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIgPT0gTlVMTCkgeworICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKKyAgICAgIGdvdG8gYmFpbDsKICAgICB9CisgIH0KIAotICAgIC8qIHJldXNhYmxlIHBzeWNoIG1lbW9yeSAqLwotICAgIGhQc3ktPnBzeUR5bmFtaWMgPSBHZXRSYW1fYWFjRW5jX1BzeUR5bmFtaWMoMCwgZHluYW1pY19SQU0pOworICAvKiByZXVzYWJsZSBwc3ljaCBtZW1vcnkgKi8KKyAgaFBzeS0+cHN5RHluYW1pYyA9IEdldFJhbV9hYWNFbmNfUHN5RHluYW1pYygwLCBkeW5hbWljX1JBTSk7CiAKLSAgICByZXR1cm4gQUFDX0VOQ19PSzsKKyAgcmV0dXJuIEFBQ19FTkNfT0s7CiAKIGJhaWw6Ci0gICBGREthYWNFbmNfUHN5Q2xvc2UocGhwc3ksIE5VTEwpOworICBGREthYWNFbmNfUHN5Q2xvc2UocGhwc3ksIE5VTEwpOwogCi0gICByZXR1cm4gRXJyb3JTdGF0dXM7CisgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xODQsMTggKzE5MCwxNCBAQAogICAgIGlucHV0OiAgICAgICAgcG9pbnRlciB0byBhIHBzeWNoIGhhbmRsZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Qc3lPdXROZXcoUFNZX09VVCAgICoqcGhwc3lPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5FbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBuU3ViRnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSICAgICAgKmR5bmFtaWNfUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1BzeU91dE5ldyhQU1lfT1VUICoqcGhwc3lPdXQsIGNvbnN0IElOVCBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsIGNvbnN0IElOVCBuU3ViRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZHluYW1pY19SQU0pIHsKICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CiAgIGludCBuLCBpOwogICBpbnQgZWxJbmMgPSAwLCBjaEluYyA9IDA7CiAKLSAgZm9yIChuPTA7IG48blN1YkZyYW1lczsgbisrKSB7CisgIGZvciAobiA9IDA7IG4gPCBuU3ViRnJhbWVzOyBuKyspIHsKICAgICBwaHBzeU91dFtuXSA9IEdldFJhbV9hYWNFbmNfUHN5T3V0KG4pOwogCiAgICAgaWYgKHBocHN5T3V0W25dID09IE5VTEwpIHsKQEAgLTIwMywxMSArMjA1LDE1IEBACiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCi0gICAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkNoYW5uZWxzOyBpKyspIHsKICAgICAgIHBocHN5T3V0W25dLT5wUHN5T3V0Q2hhbm5lbHNbaV0gPSBHZXRSYW1fYWFjRW5jX1BzeU91dENoYW5uZWwoY2hJbmMrKyk7CisgICAgICBpZiAoTlVMTCA9PSBwaHBzeU91dFtuXS0+cFBzeU91dENoYW5uZWxzW2ldKSB7CisgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBuRWxlbWVudHM7IGkrKykgewogICAgICAgcGhwc3lPdXRbbl0tPnBzeU91dEVsZW1lbnRbaV0gPSBHZXRSYW1fYWFjRW5jX1BzeU91dEVsZW1lbnRzKGVsSW5jKyspOwogICAgICAgaWYgKHBocHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldID09IE5VTEwpIHsKICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKQEAgLTIyMyw2MyArMjI5LDU5IEBACiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAotCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5SW5pdFN0YXRlcyhQU1lfSU5URVJOQUwgICAgKmhQc3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfU1RBVElDKiBwc3lTdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUpCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5SW5pdFN0YXRlcyhQU1lfSU5URVJOQUwgKmhQc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfU1RBVElDICpwc3lTdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUpIHsKICAgLyogaW5pdCBpbnB1dCBidWZmZXIgKi8KLSAgRkRLbWVtY2xlYXIocHN5U3RhdGljLT5wc3lJbnB1dEJ1ZmZlciwgTUFYX0lOUFVUX0JVRkZFUl9TSVpFKnNpemVvZihJTlRfUENNKSk7CisgIEZES21lbWNsZWFyKHBzeVN0YXRpYy0+cHN5SW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgIE1BWF9JTlBVVF9CVUZGRVJfU0laRSAqIHNpemVvZihJTlRfUENNKSk7CiAKICAgRkRLYWFjRW5jX0luaXRCbG9ja1N3aXRjaGluZygmcHN5U3RhdGljLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTG93RGVsYXkoYXVkaW9PYmplY3RUeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb3dEZWxheShhdWRpb09iamVjdFR5cGUpKTsKIAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAotCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5SW5pdChQU1lfSU5URVJOQUwgICAgKmhQc3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUICAgICAgICAqKnBocHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuU3ViRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuTWF4Q2hhbm5lbHMsCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5SW5pdChQU1lfSU5URVJOQUwgKmhQc3ksIFBTWV9PVVQgKipwaHBzeU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuU3ViRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5NYXhDaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY20pCi17CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKmNtKSB7CiAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0VOQ19PSzsKICAgaW50IGksIGNoLCBuLCBjaEluYyA9IDAsIHJlc2V0Q2hhbm5lbHMgPSAzOwogCi0gIGlmICggKG5NYXhDaGFubmVscz4yKSAmJiAoY20tPm5DaGFubmVscz09MikgKSB7CisgIGlmICgobk1heENoYW5uZWxzID4gMikgJiYgKGNtLT5uQ2hhbm5lbHMgPT0gMikpIHsKICAgICBjaEluYyA9IDE7CiAgICAgRkRLYWFjRW5jX3BzeUluaXRTdGF0ZXMoaFBzeSwgaFBzeS0+cFN0YXRpY0NoYW5uZWxzWzBdLCBhdWRpb09iamVjdFR5cGUpOwogICB9CiAKLSAgaWYgKCAobk1heENoYW5uZWxzPT0yKSApIHsKKyAgaWYgKChuTWF4Q2hhbm5lbHMgPT0gMikpIHsKICAgICByZXNldENoYW5uZWxzID0gMDsKICAgfQogCi0gIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgewotICAgIGZvciAoY2g9MDsgY2g8Y20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7Ci0gICAgICBpZiAoY20tPmVsSW5mb1tpXS5lbFR5cGUhPUlEX0xGRSkgewotICAgICAgICBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdID0gaFBzeS0+cFN0YXRpY0NoYW5uZWxzW2NoSW5jXTsKLSAgICAgICAgaWYgKGNoSW5jPj1yZXNldENoYW5uZWxzKSB7Ci0gICAgICAgICAgICBGREthYWNFbmNfcHN5SW5pdFN0YXRlcyhoUHN5LCBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLCBhdWRpb09iamVjdFR5cGUpOworICBmb3IgKGkgPSAwOyBpIDwgY20tPm5FbGVtZW50czsgaSsrKSB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgY20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdID0gaFBzeS0+cFN0YXRpY0NoYW5uZWxzW2NoSW5jXTsKKyAgICAgIGlmIChjbS0+ZWxJbmZvW2ldLmVsVHlwZSAhPSBJRF9MRkUpIHsKKyAgICAgICAgaWYgKGNoSW5jID49IHJlc2V0Q2hhbm5lbHMpIHsKKyAgICAgICAgICBGREthYWNFbmNfcHN5SW5pdFN0YXRlcyhoUHN5LCBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvT2JqZWN0VHlwZSk7CiAgICAgICAgIH0KKyAgICAgICAgbWRjdF9pbml0KCYoaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+bWRjdFBlcnMpLCBOVUxMLCAwKTsKICAgICAgICAgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+aXNMRkUgPSAwOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0gPSBoUHN5LT5wU3RhdGljQ2hhbm5lbHNbbk1heENoYW5uZWxzLTFdOworICAgICAgfSBlbHNlIHsKICAgICAgICAgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+aXNMRkUgPSAxOwogICAgICAgfQogICAgICAgY2hJbmMrKzsKICAgICB9CiAgIH0KIAotICBmb3IgKG49MDsgbjxuU3ViRnJhbWVzOyBuKyspIHsKKyAgZm9yIChuID0gMDsgbiA8IG5TdWJGcmFtZXM7IG4rKykgewogICAgIGNoSW5jID0gMDsKLSAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspIHsKLSAgICAgIGZvciAoY2g9MDsgY2g8Y20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7Ci0gICAgICAgIHBocHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXSA9IHBocHN5T3V0W25dLT5wUHN5T3V0Q2hhbm5lbHNbY2hJbmMrK107CisgICAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICAgIHBocHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXSA9CisgICAgICAgICAgICBwaHBzeU91dFtuXS0+cFBzeU91dENoYW5uZWxzW2NoSW5jKytdOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMjg3LDcgKzI4OSw2IEBACiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX3BzeU1haW5Jbml0CkBAIC0yOTYsMTM5ICsyOTcsMTA0IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5TWFpbkluaXQoUFNZX0lOVEVSTkFMICpoUHN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKmNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0bnNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBiYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHVzZVBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdXNlSVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBpbml0RmxhZ3MpCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5TWFpbkluaXQoCisgICAgUFNZX0lOVEVSTkFMICpoUHN5LCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsIENIQU5ORUxfTUFQUElORyAqY20sCisgICAgSU5UIHNhbXBsZVJhdGUsIElOVCBncmFudWxlTGVuZ3RoLCBJTlQgYml0UmF0ZSwgSU5UIHRuc01hc2ssIElOVCBiYW5kd2lkdGgsCisgICAgSU5UIHVzZVBucywgSU5UIHVzZUlTLCBJTlQgdXNlTVMsIFVJTlQgc3ludGF4RmxhZ3MsIFVMT05HIGluaXRGbGFncykgewogICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKICAgaW50IGksIGNoOwogICBpbnQgY2hhbm5lbHNFZmYgPSBjbS0+bkNoYW5uZWxzRWZmOwogICBpbnQgdG5zQ2hhbm5lbHMgPSAwOwogICBGQl9UWVBFIGZpbHRlckJhbms7CiAKLQotICBzd2l0Y2goRkRLYWFjRW5jX0dldE1vbm9TdGVyZW9Nb2RlKGNtLT5lbmNNb2RlKSkgeworICBzd2l0Y2ggKEZES2FhY0VuY19HZXRNb25vU3RlcmVvTW9kZShjbS0+ZW5jTW9kZSkpIHsKICAgICAvKiAuLi4gYW5kIG1hcCB0byB0bnNDaGFubmVscyAqLwotICAgIGNhc2UgRUxfTU9ERV9NT05POiAgIHRuc0NoYW5uZWxzID0gMTsgYnJlYWs7Ci0gICAgY2FzZSBFTF9NT0RFX1NURVJFTzogdG5zQ2hhbm5lbHMgPSAyOyBicmVhazsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICB0bnNDaGFubmVscyA9IDA7CisgICAgY2FzZSBFTF9NT0RFX01PTk86CisgICAgICB0bnNDaGFubmVscyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVMX01PREVfU1RFUkVPOgorICAgICAgdG5zQ2hhbm5lbHMgPSAyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRuc0NoYW5uZWxzID0gMDsKICAgfQogCi0gIHN3aXRjaCAoYXVkaW9PYmplY3RUeXBlKQotICB7Ci0gICAgZGVmYXVsdDogZmlsdGVyQmFuayA9IEZCX0xDOyAgYnJlYWs7Ci0gICAgY2FzZSBBT1RfRVJfQUFDX0xEOiAgZmlsdGVyQmFuayA9IEZCX0xEOyAgYnJlYWs7Ci0gICAgY2FzZSBBT1RfRVJfQUFDX0VMRDogZmlsdGVyQmFuayA9IEZCX0VMRDsgYnJlYWs7CisgIHN3aXRjaCAoYXVkaW9PYmplY3RUeXBlKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGZpbHRlckJhbmsgPSBGQl9MQzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICAgIGZpbHRlckJhbmsgPSBGQl9MRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgICBmaWx0ZXJCYW5rID0gRkJfRUxEOworICAgICAgYnJlYWs7CiAgIH0KIAogICBoUHN5LT5ncmFudWxlTGVuZ3RoID0gZ3JhbnVsZUxlbmd0aDsKIAotICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0UHN5Q29uZmlndXJhdGlvbihiaXRSYXRlL2NoYW5uZWxzRWZmLCBzYW1wbGVSYXRlLCBiYW5kd2lkdGgsIExPTkdfV0lORE9XLCBoUHN5LT5ncmFudWxlTGVuZ3RoLCB1c2VJUywgJihoUHN5LT5wc3lDb25mWzBdKSwgZmlsdGVyQmFuayk7Ci0gIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdFBzeUNvbmZpZ3VyYXRpb24oCisgICAgICBiaXRSYXRlIC8gY2hhbm5lbHNFZmYsIHNhbXBsZVJhdGUsIGJhbmR3aWR0aCwgTE9OR19XSU5ET1csCisgICAgICBoUHN5LT5ncmFudWxlTGVuZ3RoLCB1c2VJUywgdXNlTVMsICYoaFBzeS0+cHN5Q29uZlswXSksIGZpbHRlckJhbmspOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgcmV0dXJuIEVycm9yU3RhdHVzOwogCiAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRUbnNDb25maWd1cmF0aW9uKAotICAgICAgICAoYml0UmF0ZSp0bnNDaGFubmVscykvY2hhbm5lbHNFZmYsCi0gICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgIHRuc0NoYW5uZWxzLAotICAgICAgICBMT05HX1dJTkRPVywKLSAgICAgICAgaFBzeS0+Z3JhbnVsZUxlbmd0aCwKLSAgICAgICAgaXNMb3dEZWxheShhdWRpb09iamVjdFR5cGUpLAotICAgICAgICAoc3ludGF4RmxhZ3MmQUNfU0JSX1BSRVNFTlQpPzE6MCwKLSAgICAgICAmKGhQc3ktPnBzeUNvbmZbMF0udG5zQ29uZiksCi0gICAgICAgJmhQc3ktPnBzeUNvbmZbMF0sCi0gICAgICAgIChJTlQpKHRuc01hc2smMiksCi0gICAgICAgIChJTlQpKHRuc01hc2smOCkgKTsKKyAgICAgIChiaXRSYXRlICogdG5zQ2hhbm5lbHMpIC8gY2hhbm5lbHNFZmYsIHNhbXBsZVJhdGUsIHRuc0NoYW5uZWxzLAorICAgICAgTE9OR19XSU5ET1csIGhQc3ktPmdyYW51bGVMZW5ndGgsIGlzTG93RGVsYXkoYXVkaW9PYmplY3RUeXBlKSwKKyAgICAgIChzeW50YXhGbGFncyAmIEFDX1NCUl9QUkVTRU5UKSA/IDEgOiAwLCAmKGhQc3ktPnBzeUNvbmZbMF0udG5zQ29uZiksCisgICAgICAmaFBzeS0+cHN5Q29uZlswXSwgKElOVCkodG5zTWFzayAmIDIpLCAoSU5UKSh0bnNNYXNrICYgOCkpOwogCi0gIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKIAogICBpZiAoZ3JhbnVsZUxlbmd0aCA+IDUxMikgewotICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRQc3lDb25maWd1cmF0aW9uKGJpdFJhdGUvY2hhbm5lbHNFZmYsIHNhbXBsZVJhdGUsIGJhbmR3aWR0aCwgU0hPUlRfV0lORE9XLCBoUHN5LT5ncmFudWxlTGVuZ3RoLCB1c2VJUywgJmhQc3ktPnBzeUNvbmZbMV0sIGZpbHRlckJhbmspOwotICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRQc3lDb25maWd1cmF0aW9uKAorICAgICAgICBiaXRSYXRlIC8gY2hhbm5lbHNFZmYsIHNhbXBsZVJhdGUsIGJhbmR3aWR0aCwgU0hPUlRfV0lORE9XLAorICAgICAgICBoUHN5LT5ncmFudWxlTGVuZ3RoLCB1c2VJUywgdXNlTVMsICZoUHN5LT5wc3lDb25mWzFdLCBmaWx0ZXJCYW5rKTsKKworICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSByZXR1cm4gRXJyb3JTdGF0dXM7CiAKICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0VG5zQ29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIChiaXRSYXRlKnRuc0NoYW5uZWxzKS9jaGFubmVsc0VmZiwKLSAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICB0bnNDaGFubmVscywKLSAgICAgICAgICAgIFNIT1JUX1dJTkRPVywKLSAgICAgICAgICAgIGhQc3ktPmdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICBpc0xvd0RlbGF5KGF1ZGlvT2JqZWN0VHlwZSksCi0gICAgICAgICAgICAoc3ludGF4RmxhZ3MmQUNfU0JSX1BSRVNFTlQpPzE6MCwKLSAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZbMV0udG5zQ29uZiwKLSAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZbMV0sCi0gICAgICAgICAgICAoSU5UKSh0bnNNYXNrJjEpLAotICAgICAgICAgICAgKElOVCkodG5zTWFzayY0KSApOworICAgICAgICAoYml0UmF0ZSAqIHRuc0NoYW5uZWxzKSAvIGNoYW5uZWxzRWZmLCBzYW1wbGVSYXRlLCB0bnNDaGFubmVscywKKyAgICAgICAgU0hPUlRfV0lORE9XLCBoUHN5LT5ncmFudWxlTGVuZ3RoLCBpc0xvd0RlbGF5KGF1ZGlvT2JqZWN0VHlwZSksCisgICAgICAgIChzeW50YXhGbGFncyAmIEFDX1NCUl9QUkVTRU5UKSA/IDEgOiAwLCAmaFBzeS0+cHN5Q29uZlsxXS50bnNDb25mLAorICAgICAgICAmaFBzeS0+cHN5Q29uZlsxXSwgKElOVCkodG5zTWFzayAmIDEpLCAoSU5UKSh0bnNNYXNrICYgNCkpOwogCi0gICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgcmV0dXJuIEVycm9yU3RhdHVzOwotCisgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKICAgfQogCi0KLSAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKSB7Ci0gICAgZm9yIChjaD0wOyBjaDxjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgewogICAgICAgaWYgKGluaXRGbGFncykgewogICAgICAgICAvKiByZXNldCBzdGF0ZXMgKi8KLSAgICAgICAgRkRLYWFjRW5jX3BzeUluaXRTdGF0ZXMoaFBzeSwgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXSwgYXVkaW9PYmplY3RUeXBlKTsKKyAgICAgICAgRkRLYWFjRW5jX3BzeUluaXRTdGF0ZXMoaFBzeSwgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9PYmplY3RUeXBlKTsKICAgICAgIH0KIAotICAgICAgRkRLYWFjRW5jX0luaXRQcmVFY2hvQ29udHJvbChoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLT5zZmJUaHJlc2hvbGRubTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mWzBdLnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZlswXS5zZmJQY21RdWFudFRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xKTsKKyAgICAgIEZES2FhY0VuY19Jbml0UHJlRWNob0NvbnRyb2woCisgICAgICAgICAgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+c2ZiVGhyZXNob2xkbm0xLAorICAgICAgICAgICZoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLT5jYWxjUHJlRWNobywKKyAgICAgICAgICBoUHN5LT5wc3lDb25mWzBdLnNmYkNudCwgaFBzeS0+cHN5Q29uZlswXS5zZmJQY21RdWFudFRocmVzaG9sZCwKKyAgICAgICAgICAmaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xKTsKICAgICB9CiAgIH0KIAotICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0UG5zQ29uZmlndXJhdGlvbigmaFBzeS0+cHN5Q29uZlswXS5wbnNDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlL2NoYW5uZWxzRWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZbMF0uc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mWzBdLnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmVsSW5mb1swXS5uQ2hhbm5lbHNJbkVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaFBzeS0+cHN5Q29uZlswXS5maWx0ZXJiYW5rID09IEZCX0xDKSk7Ci0gIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdFBuc0NvbmZpZ3VyYXRpb24oCisgICAgICAmaFBzeS0+cHN5Q29uZlswXS5wbnNDb25mLCBiaXRSYXRlIC8gY2hhbm5lbHNFZmYsIHNhbXBsZVJhdGUsIHVzZVBucywKKyAgICAgIGhQc3ktPnBzeUNvbmZbMF0uc2ZiQ250LCBoUHN5LT5wc3lDb25mWzBdLnNmYk9mZnNldCwKKyAgICAgIGNtLT5lbEluZm9bMF0ubkNoYW5uZWxzSW5FbCwgKGhQc3ktPnBzeUNvbmZbMF0uZmlsdGVyYmFuayA9PSBGQl9MQykpOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgcmV0dXJuIEVycm9yU3RhdHVzOwogCi0gIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRQbnNDb25maWd1cmF0aW9uKCZoUHN5LT5wc3lDb25mWzFdLnBuc0NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUvY2hhbm5lbHNFZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZlsxXS5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZbMV0uc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+ZWxJbmZvWzFdLm5DaGFubmVsc0luRWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoUHN5LT5wc3lDb25mWzFdLmZpbHRlcmJhbmsgPT0gRkJfTEMpKTsKKyAgaWYgKGdyYW51bGVMZW5ndGggPiA1MTIpIHsKKyAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0UG5zQ29uZmlndXJhdGlvbigKKyAgICAgICAgJmhQc3ktPnBzeUNvbmZbMV0ucG5zQ29uZiwgYml0UmF0ZSAvIGNoYW5uZWxzRWZmLCBzYW1wbGVSYXRlLCB1c2VQbnMsCisgICAgICAgIGhQc3ktPnBzeUNvbmZbMV0uc2ZiQ250LCBoUHN5LT5wc3lDb25mWzFdLnNmYk9mZnNldCwKKyAgICAgICAgY20tPmVsSW5mb1sxXS5uQ2hhbm5lbHNJbkVsLCAoaFBzeS0+cHN5Q29uZlsxXS5maWx0ZXJiYW5rID09IEZCX0xDKSk7CisgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKKyAgfQorCiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAotCi1zdGF0aWMKLXZvaWQgRkRLYWFjRW5jX2RlaW50ZXJsZWF2ZUlucHV0QnVmZmVyKElOVF9QQ00gKnBPdXRwdXRTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqcElucHV0U2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuQ2hhbm5lbHMpCi17Ci0gICAgSU5UIGs7Ci0gICAgLyogZGVpbnRlcmxhdmUgaW5wdXQgc2FtcGxlcyBhbmQgd3JpdGUgdG8gb3V0cHV0IGJ1ZmZlciAqLwotICAgIGZvciAoaz0wOyBrPG5TYW1wbGVzOyBrKyspIHsKLSAgICAgICAgcE91dHB1dFNhbXBsZXNba10gPSBwSW5wdXRTYW1wbGVzW2sqbkNoYW5uZWxzXTsKLSAgICB9Ci19Ci0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX3BzeU1haW4KQEAgLTQzOCw5NTAgKzQwNCw5NDUgQEAKICAgICAgICAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgZW5vdWdoIGlucHV0IGRhdGEgaXMgaW4gdGhlIG1vZHVsbyBidWZmZXIuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeU1haW4oSU5UIGNoYW5uZWxzLCBQU1lfRUxFTUVOVCAqcHN5RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9EWU5BTUlDICpwc3lEeW5hbWljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT04gKnBzeUNvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgKlJFU1RSSUNUIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICpwSW5wdXQsIGNvbnN0IFVJTlQgaW5wdXRCdWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjaElkeCwgSU5UIHRvdGFsQ2hhbm5lbHMpIHsKKyAgY29uc3QgSU5UIGNvbW1vbldpbmRvdyA9IDE7CisgIElOVCBtYXhTZmJQZXJHcm91cFsoMildOworICBJTlQgbWRjdFNwZWN0cnVtX2U7CisgIElOVCBjaDsgICAvKiBjb3VudHMgdGhyb3VnaCBjaGFubmVscyAgICAgICAgICAqLworICBJTlQgdzsgICAgLyogY291bnRzIHRocm91Z2ggd2luZG93cyAgICAgICAgICAgKi8KKyAgSU5UIHNmYjsgIC8qIGNvdW50cyB0aHJvdWdoIHNjYWxlZmFjdG9yIGJhbmRzICovCisgIElOVCBsaW5lOyAvKiBjb3VudHMgdGhyb3VnaCBsaW5lcyAgICAgICAgICAgICAqLwogCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5TWFpbihJTlQgICAgICAgICAgICAgICAgIGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0VMRU1FTlQgICAgICAgICpwc3lFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0RZTkFNSUMgICAgICAgICpwc3lEeW5hbWljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT04gICpwc3lDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICAgICpSRVNUUklDVCBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqcElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqY2hJZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICB0b3RhbENoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBjb25zdCBJTlQgY29tbW9uV2luZG93ID0gMTsKLSAgICBJTlQgbWF4U2ZiUGVyR3JvdXBbKDIpXTsKLSAgICBJTlQgbWRjdFNwZWN0cnVtX2U7Ci0gICAgSU5UIGNoOyAgIC8qIGNvdW50cyB0aHJvdWdoIGNoYW5uZWxzICAgICAgICAgICovCi0gICAgSU5UIHc7ICAgIC8qIGNvdW50cyB0aHJvdWdoIHdpbmRvd3MgICAgICAgICAgICovCi0gICAgSU5UIHNmYjsgIC8qIGNvdW50cyB0aHJvdWdoIHNjYWxlZmFjdG9yIGJhbmRzICovCi0gICAgSU5UIGxpbmU7IC8qIGNvdW50cyB0aHJvdWdoIGxpbmVzICAgICAgICAgICAgICovCisgIFBTWV9DT05GSUdVUkFUSU9OICpSRVNUUklDVCBoUHN5Q29uZkxvbmcgPSAmcHN5Q29uZlswXTsKKyAgUFNZX0NPTkZJR1VSQVRJT04gKlJFU1RSSUNUIGhQc3lDb25mU2hvcnQgPSAmcHN5Q29uZlsxXTsKKyAgUFNZX09VVF9DSEFOTkVMICoqUkVTVFJJQ1QgcHN5T3V0Q2hhbm5lbCA9IHBzeU91dEVsZW1lbnQtPnBzeU91dENoYW5uZWw7CisgIEZJWFBfU0dMIHNmYlRvbmFsaXR5WygyKV1bTUFYX1NGQl9MT05HXTsKIAotICAgIFBTWV9DT05GSUdVUkFUSU9OICpSRVNUUklDVCBoUHN5Q29uZkxvbmcgID0gJnBzeUNvbmZbMF07Ci0gICAgUFNZX0NPTkZJR1VSQVRJT04gKlJFU1RSSUNUIGhQc3lDb25mU2hvcnQgPSAmcHN5Q29uZlsxXTsKLSAgICBQU1lfT1VUX0NIQU5ORUwgICoqUkVTVFJJQ1QgcHN5T3V0Q2hhbm5lbCA9IHBzeU91dEVsZW1lbnQtPnBzeU91dENoYW5uZWw7Ci0gICAgRklYUF9TR0wgc2ZiVG9uYWxpdHlbKDIpXVtNQVhfU0ZCX0xPTkddOworICBQU1lfU1RBVElDICoqUkVTVFJJQ1QgcHN5U3RhdGljID0gcHN5RWxlbWVudC0+cHN5U3RhdGljOwogCi0gICAgUFNZX1NUQVRJQyAgICAgICAgKipSRVNUUklDVCBwc3lTdGF0aWMgPSBwc3lFbGVtZW50LT5wc3lTdGF0aWM7CisgIFBTWV9EQVRBICpSRVNUUklDVCBwc3lEYXRhWygyKV07CisgIFROU19EQVRBICpSRVNUUklDVCB0bnNEYXRhWygyKV07CisgIFBOU19EQVRBICpSRVNUUklDVCBwbnNEYXRhWygyKV07CiAKLSAgICBQU1lfREFUQSAgICAgICAgICAgKlJFU1RSSUNUIHBzeURhdGFbKDIpXTsKLSAgICBUTlNfREFUQSAgICAgICAgICAgKlJFU1RSSUNUIHRuc0RhdGFbKDIpXTsKLSAgICBQTlNfREFUQSAgICAgICAgICAgKlJFU1RSSUNUIHBuc0RhdGFbKDIpXTsKKyAgSU5UIHplcm9TcGVjID0gVFJVRTsgLyogbWVhbnMgYWxsIHNwZWN0cmFsIGxpbmVzIGFyZSB6ZXJvICovCiAKLSAgICBJTlQgemVyb1NwZWMgPSBUUlVFOyAvKiBtZWFucyBhbGwgc3BlY3RyYWwgbGluZXMgYXJlIHplcm8gKi8KKyAgSU5UIGJsb2NrU3dpdGNoaW5nT2Zmc2V0OwogCi0gICAgSU5UIGJsb2NrU3dpdGNoaW5nT2Zmc2V0OworICBQU1lfQ09ORklHVVJBVElPTiAqUkVTVFJJQ1QgaFRoaXNQc3lDb25mWygyKV07CisgIElOVCB3aW5kb3dMZW5ndGhbKDIpXTsKKyAgSU5UIG5XaW5kb3dzWygyKV07CisgIElOVCB3T2Zmc2V0OwogCi0gICAgUFNZX0NPTkZJR1VSQVRJT04gKlJFU1RSSUNUIGhUaGlzUHN5Q29uZlsoMildOwotICAgIElOVCB3aW5kb3dMZW5ndGhbKDIpXTsKLSAgICBJTlQgbldpbmRvd3NbKDIpXTsKLSAgICBJTlQgd09mZnNldDsKKyAgSU5UIG1heFNmYlsoMildOworICBJTlQgKnBTZmJNYXhTY2FsZVNwZWNbKDIpXTsKKyAgRklYUF9EQkwgKnBTZmJFbmVyZ3lbKDIpXTsKKyAgRklYUF9EQkwgKnBTZmJTcHJlYWRFbmVyZ3lbKDIpXTsKKyAgRklYUF9EQkwgKnBTZmJFbmVyZ3lMZERhdGFbKDIpXTsKKyAgRklYUF9EQkwgKnBTZmJFbmVyZ3lNU1soMildOworICBGSVhQX0RCTCAqcFNmYlRocmVzaG9sZFsoMildOwogCi0gICAgSU5UICAgICAgIG1heFNmYlsoMildOwotICAgIElOVCAgICAgICpwU2ZiTWF4U2NhbGVTcGVjWygyKV07Ci0gICAgRklYUF9EQkwgKnBTZmJFbmVyZ3lbKDIpXTsKLSAgICBGSVhQX0RCTCAqcFNmYlNwcmVhZEVuZXJneVsoMildOwotICAgIEZJWFBfREJMICpwU2ZiRW5lcmd5TGREYXRhWygyKV07Ci0gICAgRklYUF9EQkwgKnBTZmJFbmVyZ3lNU1soMildOwotICAgIEZJWFBfREJMICpwU2ZiVGhyZXNob2xkWygyKV07CisgIElOVCBpc1Nob3J0V2luZG93WygyKV07CiAKLSAgICBJTlQgaXNTaG9ydFdpbmRvd1soMildOworICAvKiBudW1iZXIgb2YgaW5jb21pbmcgdGltZSBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCAqLworICBjb25zdCBJTlQgblRpbWVTYW1wbGVzID0gcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aDsKIAorICBzd2l0Y2ggKGhQc3lDb25mTG9uZy0+ZmlsdGVyYmFuaykgeworICAgIGNhc2UgRkJfTEM6CisgICAgICBibG9ja1N3aXRjaGluZ09mZnNldCA9CisgICAgICAgICAgblRpbWVTYW1wbGVzICsgKDkgKiBuVGltZVNhbXBsZXMgLyAoMiAqIFRSQU5TX0ZBQykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGQl9MRDoKKyAgICBjYXNlIEZCX0VMRDoKKyAgICAgIGJsb2NrU3dpdGNoaW5nT2Zmc2V0ID0gblRpbWVTYW1wbGVzOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0ZJTFRFUkJBTks7CisgIH0KIAotICAgIGlmIChoUHN5Q29uZkxvbmctPmZpbHRlcmJhbmsgPT0gRkJfTEMpIHsKLSAgICAgIGJsb2NrU3dpdGNoaW5nT2Zmc2V0ID0gcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCArICg5KnBzeUNvbmYtPmdyYW51bGVMZW5ndGgvKDIqVFJBTlNfRkFDKSk7CisgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgcHN5RGF0YVtjaF0gPSAmcHN5RHluYW1pYy0+cHN5RGF0YVtjaF07CisgICAgdG5zRGF0YVtjaF0gPSAmcHN5RHluYW1pYy0+dG5zRGF0YVtjaF07CisgICAgcG5zRGF0YVtjaF0gPSAmcHN5RHluYW1pYy0+cG5zRGF0YVtjaF07CisKKyAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtID0gcHN5T3V0Q2hhbm5lbFtjaF0tPm1kY3RTcGVjdHJ1bTsKKyAgfQorCisgIC8qIGJsb2NrIHN3aXRjaGluZyAqLworICBpZiAoaFBzeUNvbmZMb25nLT5maWx0ZXJiYW5rICE9IEZCX0VMRCkgeworICAgIGludCBlcnI7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBUaW1lU2lnbmFsLCBJTlRfUENNLCAoMTAyNCkpCisKKyAgICAgIC8qIGNvcHkgaW5wdXQgZGF0YSBhbmQgdXNlIGZvciBibG9jayBzd2l0Y2hpbmcgKi8KKyAgICAgIEZES21lbWNweShwVGltZVNpZ25hbCwgcElucHV0ICsgY2hJZHhbY2hdICogaW5wdXRCdWZTaXplLAorICAgICAgICAgICAgICAgIG5UaW1lU2FtcGxlcyAqIHNpemVvZihJTlRfUENNKSk7CisKKyAgICAgIEZES2FhY0VuY19CbG9ja1N3aXRjaGluZygmcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5UaW1lU2FtcGxlcywgcHN5U3RhdGljW2NoXS0+aXNMRkUsIHBUaW1lU2lnbmFsKTsKKworICAgICAgLyogZmlsbCB1cCBpbnRlcm5hbCBpbnB1dCBidWZmZXIsIHRvIDJ4ZnJhbWVsZW5ndGggc2FtcGxlcyAqLworICAgICAgRkRLbWVtY3B5KHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyICsgYmxvY2tTd2l0Y2hpbmdPZmZzZXQsCisgICAgICAgICAgICAgICAgcFRpbWVTaWduYWwsCisgICAgICAgICAgICAgICAgKDIgKiBuVGltZVNhbXBsZXMgLSBibG9ja1N3aXRjaGluZ09mZnNldCkgKiBzaXplb2YoSU5UX1BDTSkpOworCisgICAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBUaW1lU2lnbmFsLCBJTlRfUENNLCAoMTAyNCkpCisgICAgfQorCisgICAgLyogc3luY2ggbGVmdCBhbmQgcmlnaHQgYmxvY2sgdHlwZSAqLworICAgIGVyciA9IEZES2FhY0VuY19TeW5jQmxvY2tTd2l0Y2hpbmcoCisgICAgICAgICZwc3lTdGF0aWNbMF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKKyAgICAgICAgKGNoYW5uZWxzID4gMSkgPyAmcHN5U3RhdGljWzFdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wgOiBOVUxMLCBjaGFubmVscywKKyAgICAgICAgY29tbW9uV2luZG93KTsKKworICAgIGlmIChlcnIpIHsKKyAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0FPVDsgLyogbWl4ZWQgdXAgTEMgYW5kIExEICovCisgICAgfQorCisgIH0gZWxzZSB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIC8qIGNvcHkgaW5wdXQgZGF0YSBhbmQgdXNlIGZvciBibG9jayBzd2l0Y2hpbmcgKi8KKyAgICAgIEZES21lbWNweShwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlciArIGJsb2NrU3dpdGNoaW5nT2Zmc2V0LAorICAgICAgICAgICAgICAgIHBJbnB1dCArIGNoSWR4W2NoXSAqIGlucHV0QnVmU2l6ZSwKKyAgICAgICAgICAgICAgICBuVGltZVNhbXBsZXMgKiBzaXplb2YoSU5UX1BDTSkpOworICAgIH0KKyAgfQorCisgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgIGlzU2hvcnRXaW5kb3dbY2hdID0KKyAgICAgICAgKHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgPT0KKyAgICAgICAgIFNIT1JUX1dJTkRPVyk7CisKKyAgLyogc2V0IHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHdpbmRvdyBsZW5ndGggKi8KKyAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICBpZiAoaXNTaG9ydFdpbmRvd1tjaF0pIHsKKyAgICAgIGhUaGlzUHN5Q29uZltjaF0gPSBoUHN5Q29uZlNob3J0OworICAgICAgd2luZG93TGVuZ3RoW2NoXSA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGggLyBUUkFOU19GQUM7CisgICAgICBuV2luZG93c1tjaF0gPSBUUkFOU19GQUM7CisgICAgICBtYXhTZmJbY2hdID0gTUFYX1NGQl9TSE9SVDsKKworICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0gPSBwc3lEYXRhW2NoXS0+c2ZiTWF4U2NhbGVTcGVjLlNob3J0WzBdOworICAgICAgcFNmYkVuZXJneVtjaF0gPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5LlNob3J0WzBdOworICAgICAgcFNmYlNwcmVhZEVuZXJneVtjaF0gPSBwc3lEYXRhW2NoXS0+c2ZiU3ByZWFkRW5lcmd5LlNob3J0WzBdOworICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF0gPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLlNob3J0WzBdOworICAgICAgcFNmYkVuZXJneU1TW2NoXSA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNUy5TaG9ydFswXTsKKyAgICAgIHBTZmJUaHJlc2hvbGRbY2hdID0gcHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZC5TaG9ydFswXTsKKwogICAgIH0gZWxzZSB7Ci0gICAgICBibG9ja1N3aXRjaGluZ09mZnNldCA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGg7CisgICAgICBoVGhpc1BzeUNvbmZbY2hdID0gaFBzeUNvbmZMb25nOworICAgICAgd2luZG93TGVuZ3RoW2NoXSA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGg7CisgICAgICBuV2luZG93c1tjaF0gPSAxOworICAgICAgbWF4U2ZiW2NoXSA9IE1BWF9HUk9VUEVEX1NGQjsKKworICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0gPSBwc3lEYXRhW2NoXS0+c2ZiTWF4U2NhbGVTcGVjLkxvbmc7CisgICAgICBwU2ZiRW5lcmd5W2NoXSA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3kuTG9uZzsKKyAgICAgIHBTZmJTcHJlYWRFbmVyZ3lbY2hdID0gcHN5RGF0YVtjaF0tPnNmYlNwcmVhZEVuZXJneS5Mb25nOworICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF0gPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLkxvbmc7CisgICAgICBwU2ZiRW5lcmd5TVNbY2hdID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLkxvbmc7CisgICAgICBwU2ZiVGhyZXNob2xkW2NoXSA9IHBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQuTG9uZzsKKyAgICB9CisgIH0KKworICAvKiBUcmFuc2Zvcm0gYW5kIGdldCBtZGN0U2NhbGluZyBmb3IgYWxsIGNoYW5uZWxzIGFuZCB3aW5kb3dzLiAqLworICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgIC8qIHVwZGF0ZSBudW1iZXIgb2YgYWN0aXZlIGJhbmRzICovCisgICAgaWYgKHBzeVN0YXRpY1tjaF0tPmlzTEZFKSB7CisgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlID0gaFRoaXNQc3lDb25mW2NoXS0+c2ZiQWN0aXZlTEZFOworICAgICAgcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lID0gaFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmVMRkU7CisgICAgfSBlbHNlIHsKKyAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUgPSBoVGhpc1BzeUNvbmZbY2hdLT5zZmJBY3RpdmU7CisgICAgICBwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUgPSBoVGhpc1BzeUNvbmZbY2hdLT5sb3dwYXNzTGluZTsKICAgICB9CiAKLSAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQotICAgIHsKLSAgICAgICAgcHN5RGF0YVtjaF0gPSAmcHN5RHluYW1pYy0+cHN5RGF0YVtjaF07Ci0gICAgICAgIHRuc0RhdGFbY2hdID0gJnBzeUR5bmFtaWMtPnRuc0RhdGFbY2hdOwotICAgICAgICBwbnNEYXRhW2NoXSA9ICZwc3lEeW5hbWljLT5wbnNEYXRhW2NoXTsKLQotICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtID0gcHN5T3V0Q2hhbm5lbFtjaF0tPm1kY3RTcGVjdHJ1bTsKLSAgICB9Ci0KLSAgICAvKiBibG9jayBzd2l0Y2hpbmcgKi8KLSAgICBpZiAoaFBzeUNvbmZMb25nLT5maWx0ZXJiYW5rICE9IEZCX0VMRCkKLSAgICB7Ci0gICAgICBpbnQgZXJyOwotCi0gICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQotICAgICAgewotICAgICAgICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwVGltZVNpZ25hbCwgSU5UX1BDTSwgKDEwMjQpKQotCi0gICAgICAgICAgLyogZGVpbnRlcmxlYXZlIGlucHV0IGRhdGEgYW5kIHVzZSBmb3IgYmxvY2sgc3dpdGNoaW5nICovCi0gICAgICAgICAgRkRLYWFjRW5jX2RlaW50ZXJsZWF2ZUlucHV0QnVmZmVyKCBwVGltZVNpZ25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnB1dFtjaElkeFtjaF1dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ2hhbm5lbHMpOwotCi0KLSAgICAgICAgICBGREthYWNFbmNfQmxvY2tTd2l0Y2hpbmcgKCZwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5pc0xGRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZVNpZ25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0KLSAgICAgICAgICAgIC8qIGZpbGwgdXAgaW50ZXJuYWwgaW5wdXQgYnVmZmVyLCB0byAyeGZyYW1lbGVuZ3RoIHNhbXBsZXMgKi8KLSAgICAgICAgICAgIEZES21lbWNweShwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlcitibG9ja1N3aXRjaGluZ09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBwVGltZVNpZ25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAoMipwc3lDb25mLT5ncmFudWxlTGVuZ3RoLWJsb2NrU3dpdGNoaW5nT2Zmc2V0KSpzaXplb2YoSU5UX1BDTSkpOwotCi0gICAgICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBUaW1lU2lnbmFsLCBJTlRfUENNLCAoMTAyNCkpCisgICAgaWYgKGhUaGlzUHN5Q29uZltjaF0tPmZpbHRlcmJhbmsgPT0gRkJfRUxEKSB7CisgICAgICBpZiAoRkRLYWFjRW5jX1RyYW5zZm9ybV9SZWFsX0VsZCgKKyAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIsIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UsCisgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgJnBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2hhcGUsCisgICAgICAgICAgICAgIG5UaW1lU2FtcGxlcywgJm1kY3RTcGVjdHJ1bV9lLCBoVGhpc1BzeUNvbmZbY2hdLT5maWx0ZXJiYW5rLAorICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5vdmVybGFwQWRkQnVmZmVyKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0ZJTFRFUkJBTks7CiAgICAgICB9Ci0KLSAgICAgIC8qIHN5bmNoIGxlZnQgYW5kIHJpZ2h0IGJsb2NrIHR5cGUgKi8KLSAgICAgIGVyciA9IEZES2FhY0VuY19TeW5jQmxvY2tTd2l0Y2hpbmcoJnBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5U3RhdGljWzFdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbldpbmRvdyk7Ci0KLSAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9BT1Q7IC8qIG1peGVkIHVwIExDIGFuZCBMRCAqLwotICAgICAgfQotCi0gICAgfQotICAgIGVsc2UgewotICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKLSAgICAgIHsKLSAgICAgICAgLyogZGVpbnRlcmxlYXZlIGlucHV0IGRhdGEgYW5kIHVzZSBmb3IgYmxvY2sgc3dpdGNoaW5nICovCi0gICAgICAgIEZES2FhY0VuY19kZWludGVybGVhdmVJbnB1dEJ1ZmZlciggcHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIgKyBibG9ja1N3aXRjaGluZ09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5wdXRbY2hJZHhbY2hdXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5ncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ2hhbm5lbHMpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoRkRLYWFjRW5jX1RyYW5zZm9ybV9SZWFsKAorICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlciwgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKKyAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAmcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgJnBzeVN0YXRpY1tjaF0tPm1kY3RQZXJzLCBuVGltZVNhbXBsZXMsICZtZGN0U3BlY3RydW1fZSwKKyAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+ZmlsdGVyYmFuaykgIT0gMCkgeworICAgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9GSUxURVJCQU5LOwogICAgICAgfQogICAgIH0KIAotICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCi0gICAgICBpc1Nob3J0V2luZG93W2NoXT0ocHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpOworICAgIGZvciAodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgeworICAgICAgd09mZnNldCA9IHcgKiB3aW5kb3dMZW5ndGhbY2hdOwogCi0gICAgLyogc2V0IHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHdpbmRvdyBsZW5ndGggKi8KLSAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQotICAgIHsKLSAgICAgICAgaWYoaXNTaG9ydFdpbmRvd1tjaF0pIHsKLSAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0gICAgICAgPSBoUHN5Q29uZlNob3J0OwotICAgICAgICAgICAgd2luZG93TGVuZ3RoW2NoXSAgICAgICA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGgvVFJBTlNfRkFDOwotICAgICAgICAgICAgbldpbmRvd3NbY2hdICAgICAgICAgICA9IFRSQU5TX0ZBQzsKLSAgICAgICAgICAgIG1heFNmYltjaF0gICAgICAgICAgICAgPSBNQVhfU0ZCX1NIT1JUOworICAgICAgLyogTG93IHBhc3MgLyBoaWdoZXN0IHNmYiAqLworICAgICAgRkRLbWVtY2xlYXIoCisgICAgICAgICAgJnBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lICsgd09mZnNldF0sCisgICAgICAgICAgKHdpbmRvd0xlbmd0aFtjaF0gLSBwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUpICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiTWF4U2NhbGVTcGVjLlNob3J0WzBdOwotICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0gICAgICAgICA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3kuU2hvcnRbMF07Ci0gICAgICAgICAgICBwU2ZiU3ByZWFkRW5lcmd5W2NoXSAgID0gcHN5RGF0YVtjaF0tPnNmYlNwcmVhZEVuZXJneS5TaG9ydFswXTsKLSAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLlNob3J0WzBdOwotICAgICAgICAgICAgcFNmYkVuZXJneU1TW2NoXSAgICAgICA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNUy5TaG9ydFswXTsKLSAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdICAgICAgPSBwc3lEYXRhW2NoXS0+c2ZiVGhyZXNob2xkLlNob3J0WzBdOwotCi0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdICAgICAgID0gaFBzeUNvbmZMb25nOwotICAgICAgICAgICAgd2luZG93TGVuZ3RoW2NoXSAgICAgICA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGg7Ci0gICAgICAgICAgICBuV2luZG93c1tjaF0gICAgICAgICAgID0gMTsKLSAgICAgICAgICAgIG1heFNmYltjaF0gICAgICAgICAgICAgPSBNQVhfR1JPVVBFRF9TRkI7Ci0KLSAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiTWF4U2NhbGVTcGVjLkxvbmc7Ci0gICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXSAgICAgICAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneS5Mb25nOwotICAgICAgICAgICAgcFNmYlNwcmVhZEVuZXJneVtjaF0gICA9IHBzeURhdGFbY2hdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZzsKLSAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLkxvbmc7Ci0gICAgICAgICAgICBwU2ZiRW5lcmd5TVNbY2hdICAgICAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLkxvbmc7Ci0gICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXSAgICAgID0gcHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZC5Mb25nOworICAgICAgaWYgKChoUHN5Q29uZkxvbmctPmZpbHRlcmJhbmsgIT0gRkJfTEMpICYmCisgICAgICAgICAgKHBzeURhdGFbY2hdLT5sb3dwYXNzTGluZSA+PSBGQURFX09VVF9MRU4pKSB7CisgICAgICAgIC8qIERvIGJsZW5kaW5nIHRvIHJlZHVjZSBnaWJicyBhcnRpZmFjdHMgKi8KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGQURFX09VVF9MRU47IGkrKykgeworICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lICsgd09mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQURFX09VVF9MRU4gKyBpXSA9CisgICAgICAgICAgICAgIGZNdWx0KHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0IC0gRkFERV9PVVRfTEVOICsgaV0sCisgICAgICAgICAgICAgICAgICAgIGZhZGVPdXRGYWN0b3JbaV0pOwogICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGZvciB6ZXJvIHNwZWN0cnVtLiBUaGVzZSBsb29wcyB3aWxsIHVzdWFsbHkgdGVybWluYXRlIHZlcnksIHZlcnkKKyAgICAgICAqIGVhcmx5LiAqLworICAgICAgZm9yIChsaW5lID0gMDsgKGxpbmUgPCBwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUpICYmICh6ZXJvU3BlYyA9PSBUUlVFKTsKKyAgICAgICAgICAgbGluZSsrKSB7CisgICAgICAgIGlmIChwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW2xpbmUgKyB3T2Zmc2V0XSAhPSAoRklYUF9EQkwpMCkgeworICAgICAgICAgIHplcm9TcGVjID0gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0gLyogdyBsb29wICovCisKKyAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlID0gbWRjdFNwZWN0cnVtX2U7CisKKyAgICAvKiByb3RhdGUgaW50ZXJuYWwgdGltZSBzYW1wbGVzICovCisgICAgRkRLbWVtbW92ZShwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyICsgblRpbWVTYW1wbGVzLAorICAgICAgICAgICAgICAgblRpbWVTYW1wbGVzICogc2l6ZW9mKElOVF9QQ00pKTsKKworICAgIC8qIC4uLiBhbmQgZ2V0IHJlbWFpbmluZyBzYW1wbGVzIGZyb20gaW5wdXQgYnVmZmVyICovCisgICAgRkRLbWVtY3B5KHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyICsgblRpbWVTYW1wbGVzLAorICAgICAgICAgICAgICBwSW5wdXQgKyAoMiAqIG5UaW1lU2FtcGxlcyAtIGJsb2NrU3dpdGNoaW5nT2Zmc2V0KSArCisgICAgICAgICAgICAgICAgICBjaElkeFtjaF0gKiBpbnB1dEJ1ZlNpemUsCisgICAgICAgICAgICAgIChibG9ja1N3aXRjaGluZ09mZnNldCAtIG5UaW1lU2FtcGxlcykgKiBzaXplb2YoSU5UX1BDTSkpOworCisgIH0gLyogY2ggKi8KKworICAvKiBEbyBzb21lIHJlc2NhbGluZyB0byBnZXQgbWF4aW11bSBwb3NzaWJsZSBhY2N1cmFjeSBmb3IgZW5lcmdpZXMgKi8KKyAgaWYgKHplcm9TcGVjID09IEZBTFNFKSB7CisgICAgLyogQ2FsYyBwb3NzaWJsZSBzcGVjdHJ1bSBsZWZ0c2hpZnQgZm9yIGVhY2ggc2ZiICgxIG1lYW5zOiAxIGJpdCBsZWZ0IHNoaWZ0CisgICAgICogaXMgcG9zc2libGUgd2l0aG91dCBvdmVyZmxvdykgKi8KKyAgICBJTlQgbWluU3BlY1NoaWZ0ID0gTUFYX1NISUZUX0RCTDsKKyAgICBJTlQgbnJnU2hpZnQgPSBNQVhfU0hJRlRfREJMOworICAgIElOVCBmaW5hbFNoaWZ0ID0gTUFYX1NISUZUX0RCTDsKKyAgICBGSVhQX0RCTCBjdXJyTnJnID0gMDsKKyAgICBGSVhQX0RCTCBtYXhOcmcgPSAwOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIGZvciAodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgeworICAgICAgICB3T2Zmc2V0ID0gdyAqIHdpbmRvd0xlbmd0aFtjaF07CisgICAgICAgIEZES2FhY0VuY19DYWxjU2ZiTWF4U2NhbGVTcGVjKAorICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSArIHdPZmZzZXQsIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwKKyAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdICsgdyAqIG1heFNmYltjaF0sIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOworCisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspCisgICAgICAgICAgbWluU3BlY1NoaWZ0ID0gZml4TWluKG1pblNwZWNTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBTZmJNYXhTY2FsZVNwZWNbY2hdICsgdyAqIG1heFNmYltjaF0pW3NmYl0pOworICAgICAgfQogICAgIH0KIAotICAgIC8qIFRyYW5zZm9ybSBhbmQgZ2V0IG1kY3RTY2FsaW5nIGZvciBhbGwgY2hhbm5lbHMgYW5kIHdpbmRvd3MuICovCi0gICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSBudW1iZXIgb2YgYWN0aXZlIGJhbmRzICovCi0gICAgICAgIGlmIChwc3lTdGF0aWNbY2hdLT5pc0xGRSkgewotICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSA9IGhUaGlzUHN5Q29uZltjaF0tPnNmYkFjdGl2ZUxGRTsKLSAgICAgICAgICAgIHBzeURhdGFbY2hdLT5sb3dwYXNzTGluZSA9IGhUaGlzUHN5Q29uZltjaF0tPmxvd3Bhc3NMaW5lTEZFOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSA9IGhUaGlzUHN5Q29uZltjaF0tPnNmYkFjdGl2ZTsKLSAgICAgICAgICAgIHBzeURhdGFbY2hdLT5sb3dwYXNzTGluZSA9IGhUaGlzUHN5Q29uZltjaF0tPmxvd3Bhc3NMaW5lOworICAgIC8qIENhbGMgcG9zc2libGUgZW5lcmd5IGxlZnRzaGlmdCBmb3IgZWFjaCBzZmIgKDEgbWVhbnM6IDEgYml0IGxlZnQgc2hpZnQgaXMKKyAgICAgKiBwb3NzaWJsZSB3aXRob3V0IG92ZXJmbG93KSAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICBmb3IgKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKKyAgICAgICAgd09mZnNldCA9IHcgKiB3aW5kb3dMZW5ndGhbY2hdOworICAgICAgICBjdXJyTnJnID0gRkRLYWFjRW5jX0NoZWNrQmFuZEVuZXJneU9wdGltKAorICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSArIHdPZmZzZXQsCisgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSArIHcgKiBtYXhTZmJbY2hdLCBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCisgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLCBwU2ZiRW5lcmd5W2NoXSArIHcgKiBtYXhTZmJbY2hdLAorICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF0gKyB3ICogbWF4U2ZiW2NoXSwgbWluU3BlY1NoaWZ0IC0gNCk7CisKKyAgICAgICAgbWF4TnJnID0gZml4TWF4KG1heE5yZywgY3Vyck5yZyk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG1heE5yZyAhPSAoRklYUF9EQkwpMCkgeworICAgICAgbnJnU2hpZnQgPSAoQ291bnRMZWFkaW5nQml0cyhtYXhOcmcpID4+IDEpICsgKG1pblNwZWNTaGlmdCAtIDQpOworICAgIH0KKworICAgIC8qIDJjaGVjazogSGFzbid0IHRoaXMgZGVjaXNpb24gdG8gYmUgbWFkZSBmb3IgYm90aCBjaGFubmVscz8gKi8KKyAgICAvKiBGb3Igc2hvcnQgd2luZG93cyAxIGFkZGl0aW9uYWwgYml0IGhlYWRyb29tIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50CisgICAgICogb3ZlcmZsb3dzIHdoZW4gc3VtbWluZyB1cCBlbmVyZ2llcyBpbiBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoKSAqLworICAgIGlmIChpc1Nob3J0V2luZG93WzBdKSBucmdTaGlmdC0tOworCisgICAgLyogYm90aCBzcGVjdHJ1bSBhbmQgZW5lcmdpZXMgbXVzdG4ndCBvdmVyZmxvdyAqLworICAgIGZpbmFsU2hpZnQgPSBmaXhNaW4obWluU3BlY1NoaWZ0LCBucmdTaGlmdCk7CisKKyAgICAvKiBkbyBub3Qgc2hpZnQgbW9yZSB0aGFuIDMgYml0cyBtb3JlIHRvIHRoZSBsZWZ0IHRoYW4gc2lnbmFsIHdpdGhvdXQKKyAgICAgKiBibG9ja2Zsb2F0aW5nIHBvaW50IHdvdWxkIGJlIHRvIGF2b2lkIG92ZXJmbG93IG9mIHNjYWxlZCBQQ00gcXVhbnRpemF0aW9uCisgICAgICogdGhyZXNob2xkcyAqLworICAgIGlmIChmaW5hbFNoaWZ0ID4gcHN5RGF0YVswXS0+bWRjdFNjYWxlICsgMykKKyAgICAgIGZpbmFsU2hpZnQgPSBwc3lEYXRhWzBdLT5tZGN0U2NhbGUgKyAzOworCisgICAgRkRLX0FTU0VSVChmaW5hbFNoaWZ0ID49IDApOyAvKiByaWdodCBzaGlmdCBpcyBub3QgYWxsb3dlZCAqLworCisgICAgLyogY29ycmVjdCBzZmJFbmVyZ3kgYW5kIHNmYkVuZXJneUxkRGF0YSB3aXRoIG5ldyBmaW5hbFNoaWZ0ICovCisgICAgRklYUF9EQkwgbGRTaGlmdCA9IGZpbmFsU2hpZnQgKiBGTDJGWENPTlNUX0RCTCgyLjAgLyA2NCk7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIElOVCBtYXhTZmJfY2ggPSBtYXhTZmJbY2hdOworICAgICAgSU5UIHdfbWF4U2ZiX2NoID0gMDsKKyAgICAgIGZvciAodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgeworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7CisgICAgICAgICAgSU5UIHNjYWxlID0gZml4TWF4KDAsIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSArIHdfbWF4U2ZiX2NoKVtzZmJdIC0gNCk7CisgICAgICAgICAgc2NhbGUgPSBmaXhNaW4oKHNjYWxlIC0gZmluYWxTaGlmdCkgPDwgMSwgREZSQUNUX0JJVFMgLSAxKTsKKyAgICAgICAgICBpZiAoc2NhbGUgPj0gMCkKKyAgICAgICAgICAgIChwU2ZiRW5lcmd5W2NoXSArIHdfbWF4U2ZiX2NoKVtzZmJdID4+PSAoc2NhbGUpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIChwU2ZiRW5lcmd5W2NoXSArIHdfbWF4U2ZiX2NoKVtzZmJdIDw8PSAoLXNjYWxlKTsKKyAgICAgICAgICAocFNmYlRocmVzaG9sZFtjaF0gKyB3X21heFNmYl9jaClbc2ZiXSA9CisgICAgICAgICAgICAgIGZNdWx0KChwU2ZiRW5lcmd5W2NoXSArIHdfbWF4U2ZiX2NoKVtzZmJdLCBDX1JBVElPKTsKKyAgICAgICAgICAocFNmYkVuZXJneUxkRGF0YVtjaF0gKyB3X21heFNmYl9jaClbc2ZiXSArPSBsZFNoaWZ0OwogICAgICAgICB9CisgICAgICAgIHdfbWF4U2ZiX2NoICs9IG1heFNmYl9jaDsKKyAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKLQotICAgICAgICAgIHdPZmZzZXQgPSB3KndpbmRvd0xlbmd0aFtjaF07Ci0KLSAgICAgICAgICBGREthYWNFbmNfVHJhbnNmb3JtX1JlYWwoIHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyICsgd09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1kY3RTcGVjdHJ1bV9lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+ZmlsdGVyYmFuawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAscHN5U3RhdGljW2NoXS0+b3ZlcmxhcEFkZEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgLyogTG93IHBhc3MgLyBoaWdoZXN0IHNmYiAqLwotICAgICAgICAgIEZES21lbWNsZWFyKCZwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3BzeURhdGFbY2hdLT5sb3dwYXNzTGluZSt3T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAod2luZG93TGVuZ3RoW2NoXS1wc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUpKnNpemVvZihGSVhQX0RCTCkpOwotCi0gICAgICAgICAgaWYgKCAoaFBzeUNvbmZMb25nLT5maWx0ZXJiYW5rICE9IEZCX0xDKSAmJiAocHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lID49IEZBREVfT1VUX0xFTikgKSB7Ci0gICAgICAgICAgICAvKiBEbyBibGVuZGluZyB0byByZWR1Y2UgZ2liYnMgYXJ0aWZhY3RzICovCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8RkFERV9PVVRfTEVOOyBpKyspIHsKLSAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUrd09mZnNldCAtIEZBREVfT1VUX0xFTiArIGldID0gZk11bHQocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUrd09mZnNldCAtIEZBREVfT1VUX0xFTiArIGldLCBmYWRlT3V0RmFjdG9yW2ldKTsKLSAgICAgICAgICAgIH0KKyAgICBpZiAoZmluYWxTaGlmdCAhPSAwKSB7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICBJTlQgd0xlbiA9IHdpbmRvd0xlbmd0aFtjaF07CisgICAgICAgIElOVCBsb3dwYXNzTGluZSA9IHBzeURhdGFbY2hdLT5sb3dwYXNzTGluZTsKKyAgICAgICAgd09mZnNldCA9IDA7CisgICAgICAgIEZJWFBfREJMICptZGN0U3BlY3RydW0gPSAmcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVswXTsKKyAgICAgICAgZm9yICh3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7CisgICAgICAgICAgRklYUF9EQkwgKnNwZWN0cnVtID0gJm1kY3RTcGVjdHJ1bVt3T2Zmc2V0XTsKKyAgICAgICAgICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgbG93cGFzc0xpbmU7IGxpbmUrKykgeworICAgICAgICAgICAgc3BlY3RydW1bbGluZV0gPDw9IGZpbmFsU2hpZnQ7CiAgICAgICAgICAgfQorICAgICAgICAgIHdPZmZzZXQgKz0gd0xlbjsKIAorICAgICAgICAgIC8qIHVwZGF0ZSBzZmJNYXhTY2FsZVNwZWMgKi8KKyAgICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKQorICAgICAgICAgICAgKHBTZmJNYXhTY2FsZVNwZWNbY2hdICsgdyAqIG1heFNmYltjaF0pW3NmYl0gLT0gZmluYWxTaGlmdDsKKyAgICAgICAgfQorICAgICAgICAvKiB1cGRhdGUgbWRjdFNjYWxlICovCisgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgLT0gZmluYWxTaGlmdDsKKyAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAvKiBDaGVjayBmb3IgemVybyBzcGVjdHJ1bS4gVGhlc2UgbG9vcHMgd2lsbCB1c3VhbGx5IHRlcm1pbmF0ZSB2ZXJ5LCB2ZXJ5IGVhcmx5LiAqLwotICAgICAgICAgIGZvcihsaW5lPTA7IChsaW5lPHBzeURhdGFbY2hdLT5sb3dwYXNzTGluZSkgJiYgKHplcm9TcGVjPT1UUlVFKTsgbGluZSsrKSB7Ci0gICAgICAgICAgICAgIGlmIChwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW2xpbmUrd09mZnNldF0gIT0gKEZJWFBfREJMKTApIHsKLSAgICAgICAgICAgICAgICAgIHplcm9TcGVjID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBhbGwgc3BlY3RyYWwgbGluZXMgYXJlIHplcm8gKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSA9CisgICAgICAgICAgMDsgLyogb3RoZXJ3aXNlIG1kY3RTY2FsZSB3b3VsZCBiZSBmb3IgZXhhbXBsZSA3IGFuZCBQQ00gcXVhbnRpemF0aW9uCisgICAgICAgICAgICAgICogdGhyZXNob2xkcyB3b3VsZCBiZSBzaGlmdGVkIDE0IGJpdHMgdG8gdGhlIHJpZ2h0IGNhdXNpbmcgc29tZSBvZgorICAgICAgICAgICAgICAqIHRoZW0gdG8gYmVjb21lIDAgKHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBsYXRlcikgKi8KKyAgICAgIC8qIGNsZWFyIHNmYk1heFNjYWxlU3BlYyAqLworICAgICAgZm9yICh3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7CisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKKyAgICAgICAgICAocFNmYk1heFNjYWxlU3BlY1tjaF0gKyB3ICogbWF4U2ZiW2NoXSlbc2ZiXSA9IDA7CisgICAgICAgICAgKHBTZmJFbmVyZ3lbY2hdICsgdyAqIG1heFNmYltjaF0pW3NmYl0gPSAoRklYUF9EQkwpMDsKKyAgICAgICAgICAocFNmYkVuZXJneUxkRGF0YVtjaF0gKyB3ICogbWF4U2ZiW2NoXSlbc2ZiXSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgICAgICAgICAocFNmYlRocmVzaG9sZFtjaF0gKyB3ICogbWF4U2ZiW2NoXSlbc2ZiXSA9IChGSVhQX0RCTCkwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiAKLSAgICAgICAgfSAvKiB3IGxvb3AgKi8KLQotICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlID0gbWRjdFNwZWN0cnVtX2U7Ci0KLSAgICAgICAgLyogcm90YXRlIGludGVybmFsIHRpbWUgc2FtcGxlcyAqLwotICAgICAgICBGREttZW1tb3ZlKHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyK3BzeUNvbmYtPmdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCpzaXplb2YoSU5UX1BDTSkpOwotCi0KLSAgICAgICAgLyogLi4uIGFuZCBnZXQgcmVtYWluaW5nIHNhbXBsZXMgZnJvbSBpbnB1dCBidWZmZXIgKi8KLSAgICAgICAgRkRLYWFjRW5jX2RlaW50ZXJsZWF2ZUlucHV0QnVmZmVyKCBwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlcitwc3lDb25mLT5ncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnB1dFsgKDIqcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aC1ibG9ja1N3aXRjaGluZ09mZnNldCkqdG90YWxDaGFubmVscyArIGNoSWR4W2NoXSBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nT2Zmc2V0LXBzeUNvbmYtPmdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDaGFubmVscyk7Ci0KKyAgLyogQWR2YW5jZSBwc3ljaG9hY291c3RpY3M6IFRvbmFsaXR5IGFuZCBUTlMgKi8KKyAgaWYgKChjaGFubmVscyA+PSAxKSAmJiAocHN5U3RhdGljWzBdLT5pc0xGRSkpIHsKKyAgICB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtISUZJTFRdID0gMDsKKyAgICB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtMT0ZJTFRdID0gMDsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgaWYgKCFpc1Nob3J0V2luZG93W2NoXSkgeworICAgICAgICAvKiB0b25hbGl0eSAqLworICAgICAgICBGREthYWNFbmNfQ2FsY3VsYXRlRnVsbFRvbmFsaXR5KAorICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwgcFNmYk1heFNjYWxlU3BlY1tjaF0sCisgICAgICAgICAgICBwU2ZiRW5lcmd5TGREYXRhW2NoXSwgc2ZiVG9uYWxpdHlbY2hdLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LCBoVGhpc1BzeUNvbmZbY2hdLT5wbnNDb25mLnVzZVBucyk7CisgICAgICB9CiAgICAgfSAvKiBjaCAqLwogCi0gICAgLyogRG8gc29tZSByZXNjYWxpbmcgdG8gZ2V0IG1heGltdW0gcG9zc2libGUgYWNjdXJhY3kgZm9yIGVuZXJnaWVzICovCi0gICAgaWYgKCB6ZXJvU3BlYyA9PSBGQUxTRSkgeworICAgIGlmIChoUHN5Q29uZkxvbmctPnRuc0NvbmYudG5zQWN0aXZlIHx8IGhQc3lDb25mU2hvcnQtPnRuc0NvbmYudG5zQWN0aXZlKSB7CisgICAgICBJTlQgdG5zQWN0aXZlW1RSQU5TX0ZBQ10gPSB7MH07CisgICAgICBJTlQgbnJnU2NhbGluZ1syXSA9IHswLCAwfTsKKyAgICAgIElOVCB0bnNTcGVjU2hpZnQgPSAwOwogCi0gICAgICAgIC8qIENhbGMgcG9zc2libGUgc3BlY3RydW0gbGVmdHNoaWZ0IGZvciBlYWNoIHNmYiAoMSBtZWFuczogMSBiaXQgbGVmdCBzaGlmdCBpcyBwb3NzaWJsZSB3aXRob3V0IG92ZXJmbG93KSAqLwotICAgICAgICBJTlQgbWluU3BlY1NoaWZ0ID0gTUFYX1NISUZUX0RCTDsKLSAgICAgICAgSU5UIG5yZ1NoaWZ0ICAgICA9IE1BWF9TSElGVF9EQkw7Ci0gICAgICAgIElOVCBmaW5hbFNoaWZ0ICAgPSBNQVhfU0hJRlRfREJMOwotICAgICAgICBGSVhQX0RCTCBjdXJyTnJnID0gMDsKLSAgICAgICAgRklYUF9EQkwgbWF4TnJnICA9IDA7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICBmb3IgKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKKyAgICAgICAgICB3T2Zmc2V0ID0gdyAqIHdpbmRvd0xlbmd0aFtjaF07CisgICAgICAgICAgLyogVE5TICovCisgICAgICAgICAgRkRLYWFjRW5jX1Ruc0RldGVjdCgKKyAgICAgICAgICAgICAgdG5zRGF0YVtjaF0sICZoVGhpc1BzeUNvbmZbY2hdLT50bnNDb25mLAorICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFtjaF0tPnRuc0luZm8sIGhUaGlzUHN5Q29uZltjaF0tPnNmYkNudCwKKyAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSArIHdPZmZzZXQsIHcsCisgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UpOworICAgICAgICB9CisgICAgICB9CiAKLSAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKLSAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOwotICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjU2ZiTWF4U2NhbGVTcGVjKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0rdyptYXhTZmJbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOworICAgICAgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgRkRLYWFjRW5jX1Ruc1N5bmMoCisgICAgICAgICAgICB0bnNEYXRhWzFdLCB0bnNEYXRhWzBdLCAmcHN5T3V0Q2hhbm5lbFsxXS0+dG5zSW5mbywKKyAgICAgICAgICAgICZwc3lPdXRDaGFubmVsWzBdLT50bnNJbmZvLAogCi0gICAgICAgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspCi0gICAgICAgICAgICAgICAgICAgIG1pblNwZWNTaGlmdCA9IGZpeE1pbihtaW5TcGVjU2hpZnQsIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0pOworICAgICAgICAgICAgcHN5U3RhdGljWzFdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgcHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgJmhUaGlzUHN5Q29uZlsxXS0+dG5zQ29uZik7CisgICAgICB9CisKKyAgICAgIGlmIChjaGFubmVscyA+PSAxKSB7CisgICAgICAgIEZES19BU1NFUlQoMSA9PSBjb21tb25XaW5kb3cpOyAvKiBhbGwgY2hlY2tzIGZvciBUTlMgZG8gb25seSB3b3JrIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uIHdpbmRvd3MgKHdoaWNoIGlzIGFsd2F5cyBzZXQpKi8KKyAgICAgICAgZm9yICh3ID0gMDsgdyA8IG5XaW5kb3dzWzBdOyB3KyspIHsKKyAgICAgICAgICBpZiAoaXNTaG9ydFdpbmRvd1swXSkKKyAgICAgICAgICAgIHRuc0FjdGl2ZVt3XSA9CisgICAgICAgICAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlW0hJRklMVF0gfHwKKyAgICAgICAgICAgICAgICB0bnNEYXRhWzBdLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmVbTE9GSUxUXSB8fAorICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hhbm5lbHMgLSAxXQorICAgICAgICAgICAgICAgICAgICAtPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvW3ddCisgICAgICAgICAgICAgICAgICAgIC50bnNBY3RpdmVbSElGSUxUXSB8fAorICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hhbm5lbHMgLSAxXQorICAgICAgICAgICAgICAgICAgICAtPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvW3ddCisgICAgICAgICAgICAgICAgICAgIC50bnNBY3RpdmVbTE9GSUxUXTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0bnNBY3RpdmVbd10gPQorICAgICAgICAgICAgICAgIHRuc0RhdGFbMF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0hJRklMVF0gfHwKKyAgICAgICAgICAgICAgICB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtMT0ZJTFRdIHx8CisgICAgICAgICAgICAgICAgdG5zRGF0YVtjaGFubmVscyAtIDFdCisgICAgICAgICAgICAgICAgICAgIC0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbSElGSUxUXSB8fAorICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hhbm5lbHMgLSAxXQorICAgICAgICAgICAgICAgICAgICAtPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0xPRklMVF07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKHRuc0FjdGl2ZVswXSAmJiAhaXNTaG9ydFdpbmRvd1tjaF0pIHsKKyAgICAgICAgICAvKiBTY2FsZSBkb3duIHNwZWN0cnVtIGlmIHRucyBpcyBhY3RpdmUgaW4gb25lIG9mIHRoZSB0d28gY2hhbm5lbHMKKyAgICAgICAgICAgKiB3aXRoIHNhbWUgbGFzdFdpbmRvd1NlcXVlbmNlICovCisgICAgICAgICAgLyogZmlyc3QgcGFydCBvZiB0aHJlc2hvbGQgY2FsY3VsYXRpb247IGl0J3Mgbm90IG5lY2Vzc2FyeSB0byB1cGRhdGUKKyAgICAgICAgICAgKiBzZmJNYXhTY2FsZVNwZWMgKi8KKyAgICAgICAgICBJTlQgc2hpZnQgPSAxOworICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgaFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmU7IHNmYisrKSB7CisgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3NmYl0gPQorICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bc2ZiXSA+PiBzaGlmdDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiB1cGRhdGUgdGhyZXNob2xkcyAqLworICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKKyAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdW3NmYl0gPj49ICgyICogc2hpZnQpOworICAgICAgICAgIH0KKworICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgKz0gc2hpZnQ7IC8qIHVwZGF0ZSBtZGN0U2NhbGUgKi8KKworICAgICAgICAgIC8qIGNhbGMgc2ZiRW5lcmdpZXMgYWZ0ZXIgdG5zRW5jb2RlIGFnYWluICEgKi8KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICBmb3IgKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKKyAgICAgICAgICB3T2Zmc2V0ID0gdyAqIHdpbmRvd0xlbmd0aFtjaF07CisgICAgICAgICAgRkRLYWFjRW5jX1Ruc0VuY29kZSgKKyAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLT50bnNJbmZvLCB0bnNEYXRhW2NoXSwKKyAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiQ250LCAmaFRoaXNQc3lDb25mW2NoXS0+dG5zQ29uZiwKKyAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0W3BzeURhdGFbY2hdLT5zZmJBY3RpdmVdLAorICAgICAgICAgICAgICAvKmhUaGlzUHN5Q29uZltjaF0tPmxvd3Bhc3NMaW5lKi8gLyogZmlsdGVyIHN0b3BzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSAhICovCisgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtICsKKyAgICAgICAgICAgICAgICAgIHdPZmZzZXQsCisgICAgICAgICAgICAgIHcsIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UpOworCisgICAgICAgICAgaWYgKHRuc0FjdGl2ZVt3XSkgeworICAgICAgICAgICAgLyogQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhZ2FpbiwKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogaWYgdG5zIGFjdGl2ZSBpbiBjdXJyZW50IGNoYW5uZWwgb3IgaW4gb25lIGNoYW5uZWwgd2l0aCBzYW1lCisgICAgICAgICAgICAgKiBsYXN0V2luZG93U2VxdWVuY2UgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgICAgIEZES2FhY0VuY19DYWxjU2ZiTWF4U2NhbGVTcGVjKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0gKyB3T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0gKyB3ICogbWF4U2ZiW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICBmb3IgKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKKyAgICAgICAgICBpZiAodG5zQWN0aXZlW3ddKSB7CisgICAgICAgICAgICBpZiAoaXNTaG9ydFdpbmRvd1tjaF0pIHsKKyAgICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1TaG9ydCgKKyAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0gKyB3ICogd2luZG93TGVuZ3RoW2NoXSwKKyAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdICsgdyAqIG1heFNmYltjaF0sCisgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXSArIHcgKiBtYXhTZmJbY2hdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG5yZ1NjYWxpbmdbY2hdID0gLyogd2l0aCB0bnMsIGVuZXJneSBjYWxjdWxhdGlvbiBjYW4gb3ZlcmZsb3c7IC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGluZyAqLworICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1Mb25nKAorICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sIHBTZmJNYXhTY2FsZVNwZWNbY2hdLAorICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXSwgcFNmYkVuZXJneUxkRGF0YVtjaF0pOworICAgICAgICAgICAgICB0bnNTcGVjU2hpZnQgPQorICAgICAgICAgICAgICAgICAgZml4TWF4KHRuc1NwZWNTaGlmdCwgbnJnU2NhbGluZ1tjaF0pOyAvKiBucmdTY2FsaW5nIGlzIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGlmIG5yZyB3b3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGFuIG92ZXJmbG93ICovCiAgICAgICAgICAgICB9CisgICAgICAgICAgfSAvKiBpZiB0bnNBY3RpdmUgKi8KKyAgICAgICAgfQorICAgICAgfSAvKiBlbmQgY2hhbm5lbCBsb29wICovCiAKKyAgICAgIC8qIGFkYXB0IHNjYWxpbmcgdG8gcHJldmVudCBucmcgb3ZlcmZsb3csIG9ubHkgZm9yIGxvbmcgYmxvY2tzICovCisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAoKHRuc1NwZWNTaGlmdCAhPSAwKSAmJiAhaXNTaG9ydFdpbmRvd1tjaF0pIHsKKyAgICAgICAgICAvKiBzY2FsZSBkb3duIHNwZWN0cnVtLCBucmcncyBhbmQgdGhyZXNob2xkcywgaWYgdGhlcmUgd2FzIGFuIG92ZXJmbG93CisgICAgICAgICAgICogaW4gc2ZiTnJnIGNhbGN1bGF0aW9uIGFmdGVyIHRucyAqLworICAgICAgICAgIGZvciAobGluZSA9IDA7IGxpbmUgPCBoVGhpc1BzeUNvbmZbY2hdLT5sb3dwYXNzTGluZTsgbGluZSsrKSB7CisgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW2xpbmVdID4+PSB0bnNTcGVjU2hpZnQ7CisgICAgICAgICAgfQorICAgICAgICAgIElOVCBzY2FsZSA9ICh0bnNTcGVjU2hpZnQgLSBucmdTY2FsaW5nW2NoXSkgPDwgMTsKKyAgICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7CisgICAgICAgICAgICBwU2ZiRW5lcmd5TGREYXRhW2NoXVtzZmJdIC09CisgICAgICAgICAgICAgICAgc2NhbGUgKiBGTDJGWENPTlNUX0RCTCgxLjAgLyBMRF9EQVRBX1NDQUxJTkcpOworICAgICAgICAgICAgcFNmYkVuZXJneVtjaF1bc2ZiXSA+Pj0gc2NhbGU7CisgICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXVtzZmJdID4+PSAodG5zU3BlY1NoaWZ0IDw8IDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlICs9IHRuc1NwZWNTaGlmdDsgLyogdXBkYXRlIG1kY3RTY2FsZTsgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyeSB0byB1cGRhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiTWF4U2NhbGVTcGVjICovCisgICAgICAgIH0KKyAgICAgIH0gLyogZW5kIGNoYW5uZWwgbG9vcCAqLworCisgICAgfSAvKiBUTlMgYWN0aXZlICovCisgICAgZWxzZSB7CisgICAgICAvKiBJbiBjYXNlIG9mIGRpc2FibGUgVE5TLCByZXNldCBpdHMgZHluYW1pYyBkYXRhLiBTb21lIG9mIGl0cyBlbGVtZW50cyBpcworICAgICAgICogcmVxdWlyZWQgaW4gUE5TIGRldGVjdGlvbiBiZWxvdy4gKi8KKyAgICAgIEZES21lbWNsZWFyKHBzeUR5bmFtaWMtPnRuc0RhdGEsIHNpemVvZihwc3lEeW5hbWljLT50bnNEYXRhKSk7CisgICAgfQorICB9IC8qICFpc0xGRSAqLworCisgIC8qIEFkdmFuY2UgdGhyZXNob2xkcyAqLworICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgIElOVCBoZWFkcm9vbTsKKworICAgIEZJWFBfREJMIGNsaXBFbmVyZ3k7CisgICAgSU5UIGVuZXJneVNoaWZ0ID0gcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSAqIDI7CisgICAgSU5UIGNsaXBOcmdTaGlmdCA9IGVuZXJneVNoaWZ0IC0gVEhSX1NISUZUQklUUzsKKyAgICBpZiAoaXNTaG9ydFdpbmRvd1tjaF0pCisgICAgICBoZWFkcm9vbSA9IDY7CisgICAgZWxzZQorICAgICAgaGVhZHJvb20gPSAwOworCisgICAgaWYgKGNsaXBOcmdTaGlmdCA+PSAwKQorICAgICAgY2xpcEVuZXJneSA9IGhUaGlzUHN5Q29uZltjaF0tPmNsaXBFbmVyZ3kgPj4gY2xpcE5yZ1NoaWZ0OworICAgIGVsc2UgaWYgKGNsaXBOcmdTaGlmdCA+PSAtaGVhZHJvb20pCisgICAgICBjbGlwRW5lcmd5ID0gaFRoaXNQc3lDb25mW2NoXS0+Y2xpcEVuZXJneSA8PCAtY2xpcE5yZ1NoaWZ0OworICAgIGVsc2UKKyAgICAgIGNsaXBFbmVyZ3kgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKworICAgIGZvciAodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgeworICAgICAgSU5UIGk7CisgICAgICAvKiBsaW1pdCB0aHJlc2hvbGQgdG8gYXZvaWQgY2xpcHBpbmcgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBpKyspIHsKKyAgICAgICAgKihwU2ZiVGhyZXNob2xkW2NoXSArIHcgKiBtYXhTZmJbY2hdICsgaSkgPQorICAgICAgICAgICAgZml4TWluKCoocFNmYlRocmVzaG9sZFtjaF0gKyB3ICogbWF4U2ZiW2NoXSArIGkpLCBjbGlwRW5lcmd5KTsKKyAgICAgIH0KKworICAgICAgLyogc3ByZWFkaW5nICovCisgICAgICBGREthYWNFbmNfU3ByZWFkaW5nTWF4KHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tMb3dGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tIaWdoRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXSArIHcgKiBtYXhTZmJbY2hdKTsKKworICAgICAgLyogUENNIHF1YW50aXphdGlvbiB0aHJlc2hvbGQgKi8KKyAgICAgIGVuZXJneVNoaWZ0ICs9IFBDTV9RVUFOVF9USFJfU0NBTEU7CisgICAgICBpZiAoZW5lcmd5U2hpZnQgPj0gMCkgeworICAgICAgICBlbmVyZ3lTaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIGVuZXJneVNoaWZ0KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IGkrKykgeworICAgICAgICAgICoocFNmYlRocmVzaG9sZFtjaF0gKyB3ICogbWF4U2ZiW2NoXSArIGkpID0gZml4TWF4KAorICAgICAgICAgICAgICAqKHBTZmJUaHJlc2hvbGRbY2hdICsgdyAqIG1heFNmYltjaF0gKyBpKSA+PiBUSFJfU0hJRlRCSVRTLAorICAgICAgICAgICAgICAoaFRoaXNQc3lDb25mW2NoXS0+c2ZiUGNtUXVhbnRUaHJlc2hvbGRbaV0gPj4gZW5lcmd5U2hpZnQpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW5lcmd5U2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCAtZW5lcmd5U2hpZnQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgaSsrKSB7CisgICAgICAgICAgKihwU2ZiVGhyZXNob2xkW2NoXSArIHcgKiBtYXhTZmJbY2hdICsgaSkgPSBmaXhNYXgoCisgICAgICAgICAgICAgICoocFNmYlRocmVzaG9sZFtjaF0gKyB3ICogbWF4U2ZiW2NoXSArIGkpID4+IFRIUl9TSElGVEJJVFMsCisgICAgICAgICAgICAgIChoVGhpc1BzeUNvbmZbY2hdLT5zZmJQY21RdWFudFRocmVzaG9sZFtpXSA8PCBlbmVyZ3lTaGlmdCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghcHN5U3RhdGljW2NoXS0+aXNMRkUpIHsKKyAgICAgICAgLyogcHJlZWNobyBjb250cm9sICovCisgICAgICAgIGlmIChwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlID09CisgICAgICAgICAgICBTVE9QX1dJTkRPVykgeworICAgICAgICAgIC8qIHByZXZlbnQgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sIGZyb20gY29tcGFyaW5nIHN0b3AKKyAgICAgICAgICAgICB0aHJlc2hvbGRzIHdpdGggc2hvcnQgdGhyZXNob2xkcyAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBpKyspIHsKKyAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMVtpXSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgICAgIH0KKworICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPm1kY3RTY2FsZW5tMSA9IDA7CisgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8gPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgLyogQ2FsYyBwb3NzaWJsZSBlbmVyZ3kgbGVmdHNoaWZ0IGZvciBlYWNoIHNmYiAoMSBtZWFuczogMSBiaXQgbGVmdCBzaGlmdCBpcyBwb3NzaWJsZSB3aXRob3V0IG92ZXJmbG93KSAqLwotICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgewotICAgICAgICAgICAgICAgIHdPZmZzZXQgPSB3KndpbmRvd0xlbmd0aFtjaF07Ci0gICAgICAgICAgICAgICAgY3Vyck5yZyA9IEZES2FhY0VuY19DaGVja0JhbmRFbmVyZ3lPcHRpbShwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdK3cqbWF4U2ZiW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXSt3Km1heFNmYltjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdK3cqbWF4U2ZiW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluU3BlY1NoaWZ0LTQpOworICAgICAgICBGREthYWNFbmNfUHJlRWNob0NvbnRyb2woCisgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5zZmJUaHJlc2hvbGRubTEsIHBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvLAorICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwgaFRoaXNQc3lDb25mW2NoXS0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAorICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLAorICAgICAgICAgICAgcFNmYlRocmVzaG9sZFtjaF0gKyB3ICogbWF4U2ZiW2NoXSwgcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSwKKyAgICAgICAgICAgICZwc3lTdGF0aWNbY2hdLT5tZGN0U2NhbGVubTEpOwogCi0gICAgICAgICAgICAgICAgbWF4TnJnID0gZml4TWF4KG1heE5yZywgY3Vyck5yZyk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvID0gMTsKKworICAgICAgICBpZiAocHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSA9PQorICAgICAgICAgICAgU1RBUlRfV0lORE9XKSB7CisgICAgICAgICAgLyogcHJldmVudCBGREthYWNFbmNfUHJlRWNob0NvbnRyb2wgaW4gbmV4dCBmcmFtZSB0byBjb21wYXJlIHN0YXJ0CisgICAgICAgICAgICAgdGhyZXNob2xkcyB3aXRoIHNob3J0IHRocmVzaG9sZHMgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgaSsrKSB7CisgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5zZmJUaHJlc2hvbGRubTFbaV0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5tZGN0U2NhbGVubTEgPSAwOworICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvID0gMDsKICAgICAgICAgfQorICAgICAgfQogCi0gICAgICAgIGlmICggbWF4TnJnICE9IChGSVhQX0RCTCkwICkgewotICAgICAgICAgICAgbnJnU2hpZnQgPSAoQ291bnRMZWFkaW5nQml0cyhtYXhOcmcpPj4xKSArIChtaW5TcGVjU2hpZnQtNCk7CisgICAgICAvKiBzcHJlYWQgZW5lcmd5IHRvIGF2b2lkIGhvbGUgZGV0ZWN0aW9uICovCisgICAgICBGREttZW1jcHkocFNmYlNwcmVhZEVuZXJneVtjaF0gKyB3ICogbWF4U2ZiW2NoXSwKKyAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXSArIHcgKiBtYXhTZmJbY2hdLAorICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICAgICAgRkRLYWFjRW5jX1NwcmVhZGluZ01heChwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJNYXNrTG93RmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJTcHJlYWRFbmVyZ3lbY2hdICsgdyAqIG1heFNmYltjaF0pOworICAgIH0KKyAgfQorCisgIC8qIENhbGMgYmFuZHdpc2UgZW5lcmdpZXMgZm9yIG1pZCBhbmQgc2lkZSBjaGFubmVsLiBEbyBpdCBvbmx5IGlmIDIgY2hhbm5lbHMKKyAgICogZXhpc3QgKi8KKyAgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICBmb3IgKHcgPSAwOyB3IDwgbldpbmRvd3NbMV07IHcrKykgeworICAgICAgd09mZnNldCA9IHcgKiB3aW5kb3dMZW5ndGhbMV07CisgICAgICBGREthYWNFbmNfQ2FsY0JhbmROcmdNU09wdCgKKyAgICAgICAgICBwc3lEYXRhWzBdLT5tZGN0U3BlY3RydW0gKyB3T2Zmc2V0LAorICAgICAgICAgIHBzeURhdGFbMV0tPm1kY3RTcGVjdHJ1bSArIHdPZmZzZXQsCisgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1swXSArIHcgKiBtYXhTZmJbMF0sCisgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1sxXSArIHcgKiBtYXhTZmJbMV0sIGhUaGlzUHN5Q29uZlsxXS0+c2ZiT2Zmc2V0LAorICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwgcFNmYkVuZXJneU1TWzBdICsgdyAqIG1heFNmYlswXSwKKyAgICAgICAgICBwU2ZiRW5lcmd5TVNbMV0gKyB3ICogbWF4U2ZiWzFdLAorICAgICAgICAgIChwc3lTdGF0aWNbMV0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgIT0KKyAgICAgICAgICAgU0hPUlRfV0lORE9XKSwKKyAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJFbmVyZ3lNU0xkRGF0YSwgcHN5RGF0YVsxXS0+c2ZiRW5lcmd5TVNMZERhdGEpOworICAgIH0KKyAgfQorCisgIC8qIGdyb3VwIHNob3J0IGRhdGEgKG1heFNmYltjaF0gZm9yIHNob3J0IGJsb2NrcyBpcyBkZXRlcm1pbmVkIGhlcmUpICovCisgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgaWYgKGlzU2hvcnRXaW5kb3dbY2hdKSB7CisgICAgICBpbnQgc2ZiR3JwOworICAgICAgaW50IG5vU2ZiID0gcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMgKgorICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250OworICAgICAgLyogQXQgdGhpcyBwb2ludCwgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgYXJlIGNvcGllZC9yZWdyb3VwZWQgZnJvbSB0aGUKKyAgICAgICAqICIuU2hvcnQiIHRvIHRoZSAiLkxvbmciIGFycmF5cyAqLworICAgICAgRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKAorICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sICZwc3lEYXRhW2NoXS0+c2ZiVGhyZXNob2xkLAorICAgICAgICAgICZwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5LCAmcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLAorICAgICAgICAgICZwc3lEYXRhW2NoXS0+c2ZiU3ByZWFkRW5lcmd5LCBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCisgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwgaFBzeUNvbmZTaG9ydC0+c2ZiT2Zmc2V0LAorICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk1pblNuckxkRGF0YSwgcHN5RGF0YVtjaF0tPmdyb3VwZWRTZmJPZmZzZXQsCisgICAgICAgICAgJm1heFNmYlBlckdyb3VwW2NoXSwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YSwKKyAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcywKKyAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW4sCisgICAgICAgICAgcHN5Q29uZlsxXS5ncmFudWxlTGVuZ3RoKTsKKworICAgICAgLyogY2FsY3VsYXRlIGxkRGF0YSBhcnJheXMgKHNob3J0IHZhbHVlcyBhcmUgaW4gLkxvbmctYXJyYXlzIGFmdGVyCisgICAgICAgKiBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEpICovCisgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IG5vU2ZiOyBzZmJHcnAgKz0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250KSB7CisgICAgICAgIExkRGF0YVZlY3RvcigmcHN5RGF0YVtjaF0tPnNmYkVuZXJneS5Mb25nW3NmYkdycF0sCisgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnBdLAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSk7CisgICAgICB9CisKKyAgICAgIC8qIGNhbGMgc2ZiVGhybGQgYW5kIHNldCBWYWx1ZXMgc21hbGxlciAyXi0zMSB0byAyXi0zMyovCisgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IG5vU2ZiOyBzZmJHcnAgKz0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250KSB7CisgICAgICAgIExkRGF0YVZlY3RvcigmcHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZC5Mb25nW3NmYkdycF0sCisgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnBdLAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSk7CisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKKyAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICBmaXhNYXgocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnAgKyBzZmJdLAorICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoLTAuNTE1NjI1ZikpOwogICAgICAgICB9CisgICAgICB9CiAKLSAgICAgICAgLyogMmNoZWNrOiBIYXNuJ3QgdGhpcyBkZWNpc2lvbiB0byBiZSBtYWRlIGZvciBib3RoIGNoYW5uZWxzPyAqLwotICAgICAgICAvKiBGb3Igc2hvcnQgd2luZG93cyAxIGFkZGl0aW9uYWwgYml0IGhlYWRyb29tIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IG92ZXJmbG93cyB3aGVuIHN1bW1pbmcgdXAgZW5lcmdpZXMgaW4gRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKCkgKi8KLSAgICAgICAgaWYoaXNTaG9ydFdpbmRvd1swXSkgbnJnU2hpZnQtLTsKLQotICAgICAgICAvKiBib3RoIHNwZWN0cnVtIGFuZCBlbmVyZ2llcyBtdXN0bid0IG92ZXJmbG93ICovCi0gICAgICAgIGZpbmFsU2hpZnQgPSBmaXhNaW4obWluU3BlY1NoaWZ0LCBucmdTaGlmdCk7Ci0KLSAgICAgICAgLyogZG8gbm90IHNoaWZ0IG1vcmUgdGhhbiAzIGJpdHMgbW9yZSB0byB0aGUgbGVmdCB0aGFuIHNpZ25hbCB3aXRob3V0IGJsb2NrZmxvYXRpbmcgcG9pbnQKLSAgICAgICAgICogd291bGQgYmUgdG8gYXZvaWQgb3ZlcmZsb3cgb2Ygc2NhbGVkIFBDTSBxdWFudGl6YXRpb24gdGhyZXNob2xkcyAqLwotICAgICAgICBpZiAoZmluYWxTaGlmdCA+IHBzeURhdGFbMF0tPm1kY3RTY2FsZSArIDMgKQotICAgICAgICAgICAgZmluYWxTaGlmdCA9IHBzeURhdGFbMF0tPm1kY3RTY2FsZSArIDM7Ci0KLSAgICAgICAgRkRLX0FTU0VSVChmaW5hbFNoaWZ0ID49IDApOyAgICAvKiByaWdodCBzaGlmdCBpcyBub3QgYWxsb3dlZCAqLwotCi0gICAgICAgIC8qIGNvcnJlY3Qgc2ZiRW5lcmd5IGFuZCBzZmJFbmVyZ3lMZERhdGEgd2l0aCBuZXcgZmluYWxTaGlmdCAqLwotICAgICAgICBGSVhQX0RCTCBsZFNoaWZ0ID0gZmluYWxTaGlmdCAqIEZMMkZYQ09OU1RfREJMKDIuMC82NCk7Ci0gICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7Ci0gICAgICAgICAgICAgICAgZm9yKHNmYj0wOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKLSAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlID0gZml4TWF4KDAsIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0tNCk7Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlICAgICA9IGZpeE1pbigoc2NhbGUtZmluYWxTaGlmdCk8PDEsIERGUkFDVF9CSVRTLTEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGUgPj0gMCkgKHBTZmJFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSA+Pj0gKHNjYWxlKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIChwU2ZiRW5lcmd5W2NoXSt3Km1heFNmYltjaF0pW3NmYl0gPDw9ICgtc2NhbGUpOwotICAgICAgICAgICAgICAgICAgICAocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdKVtzZmJdID0gZk11bHQoKHBTZmJFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSwgQ19SQVRJTyk7Ci0gICAgICAgICAgICAgICAgICAgIChwU2ZiRW5lcmd5TGREYXRhW2NoXSt3Km1heFNmYltjaF0pW3NmYl0gKz0gbGRTaGlmdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICBpZiAoY2hhbm5lbHMgPT0gMikgeworICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IG5vU2ZiOyBzZmJHcnAgKz0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250KSB7CisgICAgICAgICAgTGREYXRhVmVjdG9yKCZwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TVMuTG9uZ1tzZmJHcnBdLAorICAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TTGREYXRhW3NmYkdycF0sCisgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOwogICAgICAgICB9CisgICAgICB9CiAKLSAgICAgICAgaWYgKCBmaW5hbFNoaWZ0ICE9IDAgKSB7Ci0gICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdPZmZzZXQgPSB3KndpbmRvd0xlbmd0aFtjaF07Ci0gICAgICAgICAgICAgICAgICAgIGZvcihsaW5lPTA7IGxpbmU8cHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lOyBsaW5lKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bbGluZSt3T2Zmc2V0XSA8PD0gZmluYWxTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgc2ZiTWF4U2NhbGVTcGVjICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKQotICAgICAgICAgICAgICAgICAgICAgICAgKHBTZmJNYXhTY2FsZVNwZWNbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSAtPSBmaW5hbFNoaWZ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiB1cGRhdGUgbWRjdFNjYWxlICovCi0gICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSAtPSBmaW5hbFNoaWZ0OwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk9mZnNldHMsIHBzeURhdGFbY2hdLT5ncm91cGVkU2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgIChNQVhfR1JPVVBFRF9TRkIgKyAxKSAqIHNpemVvZihJTlQpKTsKIAogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGFsbCBzcGVjdHJhbCBsaW5lcyBhcmUgemVybyAqLwotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSA9IDA7ICAgICAvKiBvdGhlcndpc2UgbWRjdFNjYWxlIHdvdWxkIGJlIGZvciBleGFtcGxlIDcgYW5kIFBDTSBxdWFudGl6YXRpb24gdGhyZXNob2xkcyB3b3VsZCBiZSBzaGlmdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDE0IGJpdHMgdG8gdGhlIHJpZ2h0IGNhdXNpbmcgc29tZSBvZiB0aGVtIHRvIGJlY29tZSAwICh3aGljaCBjYXVzZXMgcHJvYmxlbXMgbGF0ZXIpICovCi0gICAgICAgICAgICAvKiBjbGVhciBzZmJNYXhTY2FsZVNwZWMgKi8KLSAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKHBTZmJNYXhTY2FsZVNwZWNbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIChwU2ZiRW5lcmd5W2NoXSt3Km1heFNmYltjaF0pW3NmYl0gICAgICAgPSAoRklYUF9EQkwpMDsKLSAgICAgICAgICAgICAgICAgICAgKHBTZmJFbmVyZ3lMZERhdGFbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgKHBTZmJUaHJlc2hvbGRbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSAgICA9IChGSVhQX0RCTCkwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgIGludCBpOworICAgICAgLyogbWF4U2ZiW2NoXSBmb3IgbG9uZyBibG9ja3MgKi8KKyAgICAgIGZvciAoc2ZiID0gcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSAtIDE7IHNmYiA+PSAwOyBzZmItLSkgeworICAgICAgICBmb3IgKGxpbmUgPSBoUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmIgKyAxXSAtIDE7CisgICAgICAgICAgICAgbGluZSA+PSBoUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmJdOyBsaW5lLS0pIHsKKyAgICAgICAgICBpZiAocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtsaW5lXSAhPSBGTDJGWENPTlNUX1NHTCgwLjBmKSkgYnJlYWs7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGxpbmUgPiBoUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmJdKSBicmVhazsKKyAgICAgIH0KKyAgICAgIG1heFNmYlBlckdyb3VwW2NoXSA9IHNmYiArIDE7CisgICAgICBtYXhTZmJQZXJHcm91cFtjaF0gPQorICAgICAgICAgIGZpeE1heChmaXhNaW4oNSwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSksIG1heFNmYlBlckdyb3VwW2NoXSk7CisKKyAgICAgIC8qIHNmYk5yZ0xkRGF0YSBpcyBjYWxjdWxhdGVkIGluIEZES2FhY0VuY19hZHZhbmNlUHN5Y2hMb25nLCBjb3B5IGluCisgICAgICAgKiBwc3lPdXQgc3RydWN0dXJlICovCisgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLkxvbmcsCisgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSAqIHNpemVvZihGSVhQX0RCTCkpOworCisgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk9mZnNldHMsIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgIChNQVhfR1JPVVBFRF9TRkIgKyAxKSAqIHNpemVvZihJTlQpKTsKKworICAgICAgLyogc2ZiTWluU25yTGREYXRhIG1vZGlmaWVkIGluIGFkanVzdCB0aHJlc2hvbGQsIGNvcHkgbmVjZXNzYXJ5ICovCisgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YSwKKyAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1pblNuckxkRGF0YSwKKyAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICAgIC8qIHNmYkVuZXJneU1TTGREYXRhIGlzdCBhbHJlYWR5IGNhbGN1bGF0ZWQgaW4gRkRLYWFjRW5jX0NhbGNCYW5kTnJnTVNPcHQ7CisgICAgICAgKiBvbmx5IGluIGxvbmcgY2FzZSAqLworCisgICAgICAvKiBjYWxjIHNmYlRocmxkIGFuZCBzZXQgVmFsdWVzIHNtYWxsZXIgMl4tMzEgdG8gMl4tMzMqLworICAgICAgTGREYXRhVmVjdG9yKHBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQuTG9uZywKKyAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhLAorICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOworICAgICAgZm9yIChpID0gMDsgaSA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IGkrKykgeworICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW2ldID0KKyAgICAgICAgICAgIGZpeE1heChwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW2ldLAorICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpKTsKKyAgICAgIH0KICAgICB9CisgIH0KIAotICAgIC8qIEFkdmFuY2UgcHN5Y2hvYWNvdXN0aWNzOiBUb25hbGl0eSBhbmQgVE5TICovCi0gICAgaWYgKHBzeVN0YXRpY1swXS0+aXNMRkUpIHsKLSAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbSElGSUxUXSA9IDA7Ci0gICAgICAgIHRuc0RhdGFbMF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0xPRklMVF0gPSAwOworICAvKgorICAgICAgSW50ZW5zaXR5IHBhcmFtZXRlciBpbnRpYWxpemF0aW9uLgorICAgKi8KKyAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICBGREttZW1jbGVhcihwc3lPdXRDaGFubmVsW2NoXS0+aXNCb29rLCBNQVhfR1JPVVBFRF9TRkIgKiBzaXplb2YoSU5UKSk7CisgICAgRkRLbWVtY2xlYXIocHN5T3V0Q2hhbm5lbFtjaF0tPmlzU2NhbGUsIE1BWF9HUk9VUEVEX1NGQiAqIHNpemVvZihJTlQpKTsKKyAgfQorCisgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgSU5UIHdpbiA9IChpc1Nob3J0V2luZG93W2NoXSA/IDEgOiAwKTsKKyAgICBpZiAoIXBzeVN0YXRpY1tjaF0tPmlzTEZFKSB7CisgICAgICAvKiBQTlMgRGVjaXNpb24gKi8KKyAgICAgIEZES2FhY0VuY19QbnNEZXRlY3QoCisgICAgICAgICAgJihwc3lDb25mWzBdLnBuc0NvbmYpLCBwbnNEYXRhW2NoXSwKKyAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlLAorICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCisgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdLCAvKiBjb3VudCBvZiBTZmIgd2hpY2ggYXJlIG5vdCB6ZXJvLiAqLworICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGEsIHBzeUNvbmZbd2luXS5zZmJPZmZzZXQsCisgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwgcHN5RGF0YVtjaF0tPnNmYk1heFNjYWxlU3BlYy5Mb25nLAorICAgICAgICAgIHNmYlRvbmFsaXR5W2NoXSwgcHN5T3V0Q2hhbm5lbFtjaF0tPnRuc0luZm8ub3JkZXJbMF1bMF0sCisgICAgICAgICAgdG5zRGF0YVtjaF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8ucHJlZGljdGlvbkdhaW5bSElGSUxUXSwKKyAgICAgICAgICB0bnNEYXRhW2NoXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbSElGSUxUXSwKKyAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhLCBwc3lPdXRDaGFubmVsW2NoXS0+bm9pc2VOcmcpOworICAgIH0gLyogIWlzTEZFICovCisgIH0gICAvKiBjaCAqLworCisgIC8qCisgICAgICBzdGVyZW8gUHJvY2Vzc2luZworICAqLworICBpZiAoY2hhbm5lbHMgPT0gMikgeworICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCA9IE1TX05PTkU7CisgICAgcHN5T3V0RWxlbWVudC0+Y29tbW9uV2luZG93ID0gY29tbW9uV2luZG93OworICAgIGlmIChwc3lPdXRFbGVtZW50LT5jb21tb25XaW5kb3cpCisgICAgICBtYXhTZmJQZXJHcm91cFswXSA9IG1heFNmYlBlckdyb3VwWzFdID0KKyAgICAgICAgICBmaXhNYXgobWF4U2ZiUGVyR3JvdXBbMF0sIG1heFNmYlBlckdyb3VwWzFdKTsKKyAgICBpZiAocHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlICE9CisgICAgICAgIFNIT1JUX1dJTkRPVykgeworICAgICAgLyogUE5TIHByZXByb2Nlc3NpbmcgZGVwZW5kaW5nIG9uIG1zIHByb2Nlc3Npbmc6IFBOUyBub3QgaW4gU2hvcnQgV2luZG93IQorICAgICAgICovCisgICAgICBGREthYWNFbmNfUHJlUHJvY2Vzc1Buc0NoYW5uZWxQYWlyKAorICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwgKCZwc3lEYXRhWzBdLT5zZmJFbmVyZ3kpLT5Mb25nLAorICAgICAgICAgICgmcHN5RGF0YVsxXS0+c2ZiRW5lcmd5KS0+TG9uZywgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYkVuZXJneUxkRGF0YSwgcHN5RGF0YVswXS0+c2ZiRW5lcmd5TVMuTG9uZywKKyAgICAgICAgICAmKHBzeUNvbmZbMF0ucG5zQ29uZiksIHBuc0RhdGFbMF0sIHBuc0RhdGFbMV0pOworCisgICAgICBGREthYWNFbmNfSW50ZW5zaXR5U3RlcmVvUHJvY2Vzc2luZygKKyAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJFbmVyZ3kuTG9uZywgcHN5RGF0YVsxXS0+c2ZiRW5lcmd5LkxvbmcsCisgICAgICAgICAgcHN5RGF0YVswXS0+bWRjdFNwZWN0cnVtLCBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiVGhyZXNob2xkLkxvbmcsIHBzeURhdGFbMV0tPnNmYlRocmVzaG9sZC5Mb25nLAorICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYlRocmVzaG9sZExkRGF0YSwKKyAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZywgcHN5RGF0YVsxXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsCisgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiRW5lcmd5TGREYXRhLCBwc3lPdXRDaGFubmVsWzFdLT5zZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKKyAgICAgICAgICBwc3lDb25mWzBdLnNmYkNudCwgcHN5Q29uZlswXS5zZmJDbnQsIG1heFNmYlBlckdyb3VwWzBdLAorICAgICAgICAgIHBzeUNvbmZbMF0uc2ZiT2Zmc2V0LAorICAgICAgICAgIHBzeUNvbmZbMF0uYWxsb3dJUyAmJiBwc3lPdXRFbGVtZW50LT5jb21tb25XaW5kb3csCisgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+aXNCb29rLCBwc3lPdXRDaGFubmVsWzFdLT5pc1NjYWxlLCBwbnNEYXRhKTsKKworICAgICAgRkRLYWFjRW5jX01zU3RlcmVvUHJvY2Vzc2luZygKKyAgICAgICAgICBwc3lEYXRhLCBwc3lPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsWzFdLT5pc0Jvb2ssCisgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKKyAgICAgICAgICBwc3lDb25mWzBdLmFsbG93TVMsIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwgcHN5RGF0YVswXS0+c2ZiQWN0aXZlLAorICAgICAgICAgIG1heFNmYlBlckdyb3VwWzBdLCBwc3lPdXRDaGFubmVsWzBdLT5zZmJPZmZzZXRzKTsKKworICAgICAgLyogUE5TIHBvc3Rwcm9jZXNzaW5nICovCisgICAgICBGREthYWNFbmNfUG9zdFByb2Nlc3NQbnNDaGFubmVsUGFpcigKKyAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJBY3RpdmUsICYocHN5Q29uZlswXS5wbnNDb25mKSwgcG5zRGF0YVswXSwgcG5zRGF0YVsxXSwKKyAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLCAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0KTsKKworICAgIH0gZWxzZSB7CisgICAgICBGREthYWNFbmNfSW50ZW5zaXR5U3RlcmVvUHJvY2Vzc2luZygKKyAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJFbmVyZ3kuTG9uZywgcHN5RGF0YVsxXS0+c2ZiRW5lcmd5LkxvbmcsCisgICAgICAgICAgcHN5RGF0YVswXS0+bWRjdFNwZWN0cnVtLCBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiVGhyZXNob2xkLkxvbmcsIHBzeURhdGFbMV0tPnNmYlRocmVzaG9sZC5Mb25nLAorICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYlRocmVzaG9sZExkRGF0YSwKKyAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZywgcHN5RGF0YVsxXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsCisgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiRW5lcmd5TGREYXRhLCBwc3lPdXRDaGFubmVsWzFdLT5zZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKKyAgICAgICAgICBwc3lTdGF0aWNbMF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzICoKKyAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAorICAgICAgICAgIHBzeUNvbmZbMV0uc2ZiQ250LCBtYXhTZmJQZXJHcm91cFswXSwgcHN5RGF0YVswXS0+Z3JvdXBlZFNmYk9mZnNldCwKKyAgICAgICAgICBwc3lDb25mWzBdLmFsbG93SVMgJiYgcHN5T3V0RWxlbWVudC0+Y29tbW9uV2luZG93LAorICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzQm9vaywgcHN5T3V0Q2hhbm5lbFsxXS0+aXNTY2FsZSwgcG5zRGF0YSk7CisKKyAgICAgIC8qIGl0J3MgT0sgdG8gcGFzcyB0aGUgIi5Mb25nIiBhcnJheXMgaGVyZS4gVGhleSBjb250YWluIGdyb3VwZWQgc2hvcnQKKyAgICAgICAqIGRhdGEgc2luY2UgRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKCkgKi8KKyAgICAgIEZES2FhY0VuY19Nc1N0ZXJlb1Byb2Nlc3NpbmcoCisgICAgICAgICAgcHN5RGF0YSwgcHN5T3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbFsxXS0+aXNCb29rLAorICAgICAgICAgICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCisgICAgICAgICAgcHN5Q29uZlsxXS5hbGxvd01TLAorICAgICAgICAgIHBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMgKgorICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCisgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LCBtYXhTZmJQZXJHcm91cFswXSwKKyAgICAgICAgICBwc3lPdXRDaGFubmVsWzBdLT5zZmJPZmZzZXRzKTsKICAgICB9Ci0gICAgZWxzZQotICAgIHsKLQotICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICBpZiAoIWlzU2hvcnRXaW5kb3dbY2hdKSB7Ci0gICAgICAgICAgICAgICAgLyogdG9uYWxpdHkgKi8KLSAgICAgICAgICAgICAgICBGREthYWNFbmNfQ2FsY3VsYXRlRnVsbFRvbmFsaXR5KCBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5TGREYXRhW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYlRvbmFsaXR5W2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5wbnNDb25mLnVzZVBucyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaFBzeUNvbmZMb25nLT50bnNDb25mLnRuc0FjdGl2ZSB8fCBoUHN5Q29uZlNob3J0LT50bnNDb25mLnRuc0FjdGl2ZSkgewotICAgICAgICAgICAgSU5UIHRuc0FjdGl2ZVtUUkFOU19GQUNdOwotICAgICAgICAgICAgSU5UIG5yZ1NjYWxpbmdbMl0gPSB7MCwwfTsKLSAgICAgICAgICAgIElOVCB0bnNTcGVjU2hpZnQgPSAwOwotCi0gICAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKLQotICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOwotICAgICAgICAgICAgICAgICAgICAvKiBUTlMgKi8KLSAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX1Ruc0RldGVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVGhpc1BzeUNvbmZbY2hdLT50bnNDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFtjaF0tPnRuc0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMikgewotICAgICAgICAgICAgICBGREthYWNFbmNfVG5zU3luYygKLSAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhWzFdLAotICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbMV0tPnRuc0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbMF0tPnRuc0luZm8sCi0KLSAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbMV0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICZoVGhpc1BzeUNvbmZbMV0tPnRuc0NvbmYpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGREtfQVNTRVJUKDE9PWNvbW1vbldpbmRvdyk7IC8qIGFsbCBjaGVja3MgZm9yIFROUyBkbyBvbmx5IHdvcmsgZm9yIGNvbW1vbiB3aW5kb3dzICh3aGljaCBpcyBhbHdheXMgc2V0KSovCi0gICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1swXTsgdysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpc1Nob3J0V2luZG93WzBdKQotICAgICAgICAgICAgICAgICAgICB0bnNBY3RpdmVbd10gPSB0bnNEYXRhWzBdLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmVbSElGSUxUXSB8fAotICAgICAgICAgICAgICAgICAgICB0bnNEYXRhWzBdLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmVbTE9GSUxUXSB8fAotICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoYW5uZWxzLTFdLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmVbSElGSUxUXSB8fAotICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoYW5uZWxzLTFdLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmVbTE9GSUxUXTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRuc0FjdGl2ZVt3XSA9IHRuc0RhdGFbMF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0hJRklMVF0gfHwKLSAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbTE9GSUxUXSB8fAotICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoYW5uZWxzLTFdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtISUZJTFRdIHx8Ci0gICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hhbm5lbHMtMV0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0xPRklMVF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgICAgICAgICBpZiAodG5zQWN0aXZlWzBdICYmICFpc1Nob3J0V2luZG93W2NoXSkgewotICAgICAgICAgICAgICAgICAgICAvKiBTY2FsZSBkb3duIHNwZWN0cnVtIGlmIHRucyBpcyBhY3RpdmUgaW4gb25lIG9mIHRoZSB0d28gY2hhbm5lbHMgd2l0aCBzYW1lIGxhc3RXaW5kb3dTZXF1ZW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwYXJ0IG9mIHRocmVzaG9sZCBjYWxjdWxhdGlvbjsgaXQncyBub3QgbmVjZXNzYXJ5IHRvIHVwZGF0ZSBzZmJNYXhTY2FsZVNwZWMgKi8KLSAgICAgICAgICAgICAgICAgICAgSU5UIHNoaWZ0ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgZm9yKHNmYj0wOyBzZmI8aFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmU7IHNmYisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3NmYl0gPSBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3NmYl0gPj4gc2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdGhyZXNob2xkcyAqLwotICAgICAgICAgICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdW3NmYl0gPj49ICgyKnNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgKz0gc2hpZnQ7IC8qIHVwZGF0ZSBtZGN0U2NhbGUgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBjYWxjIHNmYkVuZXJnaWVzIGFmdGVyIHRuc0VuY29kZSBhZ2FpbiAhICovCi0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOwotICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfVG5zRW5jb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFtjaF0tPnRuc0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVGhpc1BzeUNvbmZbY2hdLT50bnNDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXRbcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZV0sLypoVGhpc1BzeUNvbmZbY2hdLT5sb3dwYXNzTGluZSovIC8qIGZpbHRlciBzdG9wcyBiZWZvcmUgdGhhdCBsaW5lICEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZih0bnNBY3RpdmVbd10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGFnYWluLCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRucyBhY3RpdmUgaW4gY3VycmVudCBjaGFubmVsIG9yIGluIG9uZSBjaGFubmVsIHdpdGggc2FtZSBsYXN0V2luZG93U2VxdWVuY2UgbGVmdCBhbmQgcmlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfQ2FsY1NmYk1heFNjYWxlU3BlYyhwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgewotCi0gICAgICAgICAgICAgICAgaWYgKHRuc0FjdGl2ZVt3XSkgewotCi0gICAgICAgICAgICAgICAgICBpZiAoaXNTaG9ydFdpbmRvd1tjaF0pIHsKLSAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1TaG9ydChwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtK3cqd2luZG93TGVuZ3RoW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdK3cqbWF4U2ZiW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXSt3Km1heFNmYltjaF0pOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5yZ1NjYWxpbmdbY2hdID0gICAgICAgIC8qIHdpdGggdG5zLCBlbmVyZ3kgY2FsY3VsYXRpb24gY2FuIG92ZXJmbG93OyAtPiBzY2FsaW5nICovCi0gICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltTG9uZyhwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdKTsKLSAgICAgICAgICAgICAgICAgICAgdG5zU3BlY1NoaWZ0ID0gZml4TWF4KHRuc1NwZWNTaGlmdCwgbnJnU2NhbGluZ1tjaF0pOyAgICAgICAvKiBucmdTY2FsaW5nIGlzIHNldCBvbmx5IGlmIG5yZyB3b3VsZCBoYXZlIGFuIG92ZXJmbG93ICovCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAvKiBpZiB0bnNBY3RpdmUgKi8KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAvKiBlbmQgY2hhbm5lbCBsb29wICovCi0KLSAgICAgICAgICAgIC8qIGFkYXB0IHNjYWxpbmcgdG8gcHJldmVudCBucmcgb3ZlcmZsb3csIG9ubHkgZm9yIGxvbmcgYmxvY2tzICovCi0gICAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICAgIGlmICggKHRuc1NwZWNTaGlmdCE9MCkgJiYgIWlzU2hvcnRXaW5kb3dbY2hdICkgewotICAgICAgICAgICAgICAgIC8qIHNjYWxlIGRvd24gc3BlY3RydW0sIG5yZydzIGFuZCB0aHJlc2hvbGRzLCBpZiB0aGVyZSB3YXMgYW4gb3ZlcmZsb3cgaW4gc2ZiTnJnIGNhbGN1bGF0aW9uIGFmdGVyIHRucyAqLwotICAgICAgICAgICAgICAgIGZvcihsaW5lPTA7IGxpbmU8aFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmU7IGxpbmUrKykgewotICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtsaW5lXSA+Pj0gdG5zU3BlY1NoaWZ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJTlQgc2NhbGUgPSAodG5zU3BlY1NoaWZ0LW5yZ1NjYWxpbmdbY2hdKTw8MTsKLSAgICAgICAgICAgICAgICBmb3Ioc2ZiPTA7IHNmYjxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykgewotICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF1bc2ZiXSAgIC09IHNjYWxlKkZMMkZYQ09OU1RfREJMKDEuMC9MRF9EQVRBX1NDQUxJTkcpOwotICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF1bc2ZiXSAgICAgICAgPj49IHNjYWxlOwotICAgICAgICAgICAgICAgICAgcFNmYlRocmVzaG9sZFtjaF1bc2ZiXSAgICAgPj49ICh0bnNTcGVjU2hpZnQ8PDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlICs9IHRuc1NwZWNTaGlmdDsgIC8qIHVwZGF0ZSBtZGN0U2NhbGU7IG5vdCBuZWNlc3NhcnkgdG8gdXBkYXRlIHNmYk1heFNjYWxlU3BlYyAqLwotCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gLyogZW5kIGNoYW5uZWwgbG9vcCAqLwotCi0gICAgICAgIH0gLyogVE5TIGFjdGl2ZSAqLwotICAgIH0gIC8qICFpc0xGRSAqLwotCi0KLQotCi0KLQotICAgIC8qIEFkdmFuY2UgdGhyZXNob2xkcyAqLwotICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgSU5UIGhlYWRyb29tOwotCi0gICAgICAgIEZJWFBfREJMIGNsaXBFbmVyZ3k7Ci0gICAgICAgIElOVCBlbmVyZ3lTaGlmdCAgPSBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlKjIgOwotICAgICAgICBJTlQgY2xpcE5yZ1NoaWZ0ID0gZW5lcmd5U2hpZnQgLSBUSFJfU0hJRlRCSVRTIDsKLQotICAgICAgICBpZihpc1Nob3J0V2luZG93W2NoXSkKLSAgICAgICAgICAgIGhlYWRyb29tID0gNjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGVhZHJvb20gPSAwOwotCi0gICAgICAgIGlmIChjbGlwTnJnU2hpZnQgPj0gMCkKLSAgICAgICAgICAgIGNsaXBFbmVyZ3kgPSBoVGhpc1BzeUNvbmZbY2hdLT5jbGlwRW5lcmd5ID4+ICBjbGlwTnJnU2hpZnQgOwotICAgICAgICBlbHNlIGlmIChjbGlwTnJnU2hpZnQ+PS1oZWFkcm9vbSkKLSAgICAgICAgICAgIGNsaXBFbmVyZ3kgPSBoVGhpc1BzeUNvbmZbY2hdLT5jbGlwRW5lcmd5IDw8IC1jbGlwTnJnU2hpZnQgOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjbGlwRW5lcmd5ID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgOwotCi0gICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJTlQgaTsKLSAgICAgICAgICAgIC8qIGxpbWl0IHRocmVzaG9sZCB0byBhdm9pZCBjbGlwcGluZyAqLwotICAgICAgICAgICAgZm9yIChpPTA7IGk8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPSBmaXhNaW4oKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSksIGNsaXBFbmVyZ3kpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBzcHJlYWRpbmcgKi8KLSAgICAgICAgICAgIEZES2FhY0VuY19TcHJlYWRpbmdNYXgocHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJNYXNrTG93RmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tIaWdoRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdK3cqbWF4U2ZiW2NoXSk7Ci0KLQotICAgICAgICAgICAgLyogUENNIHF1YW50aXphdGlvbiB0aHJlc2hvbGQgKi8KLSAgICAgICAgICAgIGVuZXJneVNoaWZ0ICs9IFBDTV9RVUFOVF9USFJfU0NBTEU7Ci0gICAgICAgICAgICBpZiAoZW5lcmd5U2hpZnQ+PTApIHsKLSAgICAgICAgICAgICAgIGVuZXJneVNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsZW5lcmd5U2hpZnQpOwotICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtpKyspIHsKLSAgICAgICAgICAgICAgICAgICAqKHBTZmJUaHJlc2hvbGRbY2hdK3cqbWF4U2ZiW2NoXStpKSA9IGZpeE1heCgqKHBTZmJUaHJlc2hvbGRbY2hdK3cqbWF4U2ZiW2NoXStpKSA+PiBUSFJfU0hJRlRCSVRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoVGhpc1BzeUNvbmZbY2hdLT5zZmJQY21RdWFudFRocmVzaG9sZFtpXSA+PiBlbmVyZ3lTaGlmdCkpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIGVuZXJneVNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLWVuZXJneVNoaWZ0KTsKLSAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7aSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPSBmaXhNYXgoKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPj4gVEhSX1NISUZUQklUUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaFRoaXNQc3lDb25mW2NoXS0+c2ZiUGNtUXVhbnRUaHJlc2hvbGRbaV0gPDwgZW5lcmd5U2hpZnQpKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFwc3lTdGF0aWNbY2hdLT5pc0xGRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBwcmVlY2hvIGNvbnRyb2wgKi8KLSAgICAgICAgICAgICAgICBpZihwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlID09IFNUT1BfV0lORE9XKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sIGZyb20gY29tcGFyaW5nIHN0b3AKLSAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkcyB3aXRoIHNob3J0IHRocmVzaG9sZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMVtpXSA9IChGSVhQX0RCTClNQVhWQUxfREJMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8gID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBGREthYWNFbmNfUHJlRWNob0NvbnRyb2woIHBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lTdGF0aWNbY2hdLT5tZGN0U2NhbGVubTEpOwotCi0gICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8gPSAxOwotCi0gICAgICAgICAgICAgICAgaWYocHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTVEFSVF9XSU5ET1cpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IEZES2FhY0VuY19QcmVFY2hvQ29udHJvbCBpbiBuZXh0IGZyYW1lIHRvIGNvbXBhcmUgc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkcyB3aXRoIHNob3J0IHRocmVzaG9sZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMVtpXSA9IChGSVhQX0RCTClNQVhWQUxfREJMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8gID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogc3ByZWFkIGVuZXJneSB0byBhdm9pZCBob2xlIGRldGVjdGlvbiAqLwotICAgICAgICAgICAgRkRLbWVtY3B5KHBTZmJTcHJlYWRFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSwgcFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKnNpemVvZihGSVhQX0RCTCkpOwotCi0gICAgICAgICAgICBGREthYWNFbmNfU3ByZWFkaW5nTWF4KHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNmYlNwcmVhZEVuZXJneVtjaF0rdyptYXhTZmJbY2hdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENhbGMgYmFuZHdpc2UgZW5lcmdpZXMgZm9yIG1pZCBhbmQgc2lkZSBjaGFubmVsLiBEbyBpdCBvbmx5IGlmIDIgY2hhbm5lbHMgZXhpc3QgKi8KLSAgICBpZiAoY2hhbm5lbHM9PTIpIHsKLSAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbMV07IHcrKykgewotICAgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoWzFdOwotICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNCYW5kTnJnTVNPcHQocHN5RGF0YVswXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjWzBdK3cqbWF4U2ZiWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjWzFdK3cqbWF4U2ZiWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbMV0tPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5TVNbMF0rdyptYXhTZmJbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lNU1sxXSt3Km1heFNmYlsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBzeVN0YXRpY1sxXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJFbmVyZ3lNU0xkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiRW5lcmd5TVNMZERhdGEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogZ3JvdXAgc2hvcnQgZGF0YSAobWF4U2ZiW2NoXSBmb3Igc2hvcnQgYmxvY2tzIGlzIGRldGVybWluZWQgaGVyZSkgKi8KLSAgICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKQotICAgIHsKLSAgICAgICAgSU5UIG5vU2ZiLCBpOwotICAgICAgICBpZihpc1Nob3J0V2luZG93W2NoXSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHNmYkdycDsKLSAgICAgICAgICAgIG5vU2ZiID0gcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMgKiBoUHN5Q29uZlNob3J0LT5zZmJDbnQ7Ci0gICAgICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBlbmVyZ2llcyBhbmQgdGhyZXNob2xkcyBhcmUgY29waWVkL3JlZ3JvdXBlZCBmcm9tIHRoZSAiLlNob3J0IiB0byB0aGUgIi5Mb25nIiBhcnJheXMgKi8KLSAgICAgICAgICAgIEZES2FhY0VuY19ncm91cFNob3J0RGF0YSggcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS0+c2ZiU3ByZWFkRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNaW5TbnJMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPmdyb3VwZWRTZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNmYlBlckdyb3VwW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mWzFdLmdyYW51bGVMZW5ndGgpOwotCi0KLSAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBsZERhdGEgYXJyYXlzIChzaG9ydCB2YWx1ZXMgYXJlIGluIC5Mb25nLWFycmF5cyBhZnRlciBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEpICovCi0gICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IG5vU2ZiOyBzZmJHcnAgKz0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250KSB7Ci0gICAgICAgICAgICAgIExkRGF0YVZlY3RvcigmcHN5RGF0YVtjaF0tPnNmYkVuZXJneS5Mb25nW3NmYkdycF0sICZwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycF0sIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBjYWxjIHNmYlRocmxkIGFuZCBzZXQgVmFsdWVzIHNtYWxsZXIgMl4tMzEgdG8gMl4tMzMqLwotICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBub1NmYjsgc2ZiR3JwICs9IGhQc3lDb25mU2hvcnQtPnNmYkNudCkgewotICAgICAgICAgICAgICBMZERhdGFWZWN0b3IoJnBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQuTG9uZ1tzZmJHcnBdLCAmcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnBdLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKLSAgICAgICAgICAgICAgZm9yIChzZmI9MDtzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtzZmIrKykgewotICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4TWF4KHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0sIEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGNoYW5uZWxzPT0yICkgewotICAgICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IG5vU2ZiOyBzZmJHcnAgKz0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250KSB7Ci0gICAgICAgICAgICAgICAgTGREYXRhVmVjdG9yKCZwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TVMuTG9uZ1tzZmJHcnBdLCAmcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TTGREYXRhW3NmYkdycF0sIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+c2ZiT2Zmc2V0cywgcHN5RGF0YVtjaF0tPmdyb3VwZWRTZmJPZmZzZXQsIChNQVhfR1JPVVBFRF9TRkIrMSkqc2l6ZW9mKElOVCkpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBtYXhTZmJbY2hdIGZvciBsb25nIGJsb2NrcyAqLwotICAgICAgICAgICAgZm9yIChzZmIgPSBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLTE7IHNmYiA+PSAwOyBzZmItLSkgewotICAgICAgICAgICAgICAgIGZvciAobGluZSA9IGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0W3NmYisxXS0xOyBsaW5lID49IGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0W3NmYl07IGxpbmUtLSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtsaW5lXSAhPSBGTDJGWENPTlNUX1NHTCgwLjBmKSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsaW5lID4gaFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiXSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXhTZmJQZXJHcm91cFtjaF0gPSBzZmIgKyAxOwotICAgICAgICAgICAgLyogZW5zdXJlIGF0IGxlYXN0IG9uZSBzZWN0aW9uIGluIElDUzsgd29ya2Fyb3VuZCBmb3IgZXhpc3RpbmcgZGVjb2RlciBjcmMgaW1wbGVtZW50YXRpb24gKi8KLSAgICAgICAgICAgIG1heFNmYlBlckdyb3VwW2NoXSA9IGZpeE1heChmaXhNaW4oNSxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKSxtYXhTZmJQZXJHcm91cFtjaF0pOwotCi0gICAgICAgICAgICAvKiBzZmJOcmdMZERhdGEgaXMgY2FsY3VsYXRlZCBpbiBGREthYWNFbmNfYWR2YW5jZVBzeWNoTG9uZywgY29weSBpbiBwc3lPdXQgc3RydWN0dXJlICovCi0gICAgICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YSwgcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5Mb25nLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKnNpemVvZihGSVhQX0RCTCkpOwotCi0gICAgICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk9mZnNldHMsIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0LCAoTUFYX0dST1VQRURfU0ZCKzEpKnNpemVvZihJTlQpKTsKLQotICAgICAgICAgICAgLyogc2ZiTWluU25yTGREYXRhIG1vZGlmaWVkIGluIGFkanVzdCB0aHJlc2hvbGQsIGNvcHkgbmVjZXNzYXJ5ICovCi0gICAgICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YSwgaFBzeUNvbmZMb25nLT5zZmJNaW5TbnJMZERhdGEsIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUqc2l6ZW9mKEZJWFBfREJMKSk7Ci0KLSAgICAgICAgICAgIC8qIHNmYkVuZXJneU1TTGREYXRhIGlzdCBhbHJlYWR5IGNhbGN1bGF0ZWQgaW4gRkRLYWFjRW5jX0NhbGNCYW5kTnJnTVNPcHQ7IG9ubHkgaW4gbG9uZyBjYXNlICovCi0KLSAgICAgICAgICAgIC8qIGNhbGMgc2ZiVGhybGQgYW5kIHNldCBWYWx1ZXMgc21hbGxlciAyXi0zMSB0byAyXi0zMyovCi0gICAgICAgICAgICBMZERhdGFWZWN0b3IocHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZC5Mb25nLCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKLSAgICAgICAgICAgIGZvciAoaT0wO2k8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtpKyspIHsKLSAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhNYXgocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtpXSwgRkwyRlhDT05TVF9EQkwoLTAuNTE1NjI1ZikpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICAgIEludGVuc2l0eSBwYXJhbWV0ZXIgaW50aWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKSB7Ci0gICAgICAgIEZES21lbWNsZWFyKHBzeU91dENoYW5uZWxbY2hdLT5pc0Jvb2ssICBNQVhfR1JPVVBFRF9TRkIqc2l6ZW9mKElOVCkpOwotICAgICAgICBGREttZW1jbGVhcihwc3lPdXRDaGFubmVsW2NoXS0+aXNTY2FsZSwgTUFYX0dST1VQRURfU0ZCKnNpemVvZihJTlQpKTsKLSAgICB9Ci0KLSAgICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKSB7Ci0gICAgICAgIElOVCB3aW4gPSAoaXNTaG9ydFdpbmRvd1tjaF0/MTowKTsKLSAgICAgICAgaWYgKCFwc3lTdGF0aWNbY2hdLT5pc0xGRSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogUE5TIERlY2lzaW9uICovCi0gICAgICAgICAgICBGREthYWNFbmNfUG5zRGV0ZWN0KCAmKHBzeUNvbmZbMF0ucG5zQ29uZiksCi0gICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGFbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFtjaF0sIC8qIGNvdW50IG9mIFNmYiB3aGljaCBhcmUgbm90IHplcm8uICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbd2luXS5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJNYXhTY2FsZVNwZWMuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgc2ZiVG9uYWxpdHlbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+dG5zSW5mby5vcmRlclswXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8ucHJlZGljdGlvbkdhaW5bSElGSUxUXSwKLSAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0hJRklMVF0sCi0gICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5ub2lzZU5yZyApOwotICAgICAgICB9IC8qICFpc0xGRSAqLwotICAgIH0KLQotICAgIC8qCi0gICAgICAgIHN0ZXJlbyBQcm9jZXNzaW5nCi0gICAgKi8KLSAgICBpZihjaGFubmVscyA9PSAyKQotICAgIHsKLSAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0ID0gTVNfTk9ORTsKLSAgICAgICAgcHN5T3V0RWxlbWVudC0+Y29tbW9uV2luZG93ICAgICAgID0gY29tbW9uV2luZG93OwotICAgICAgICBpZiAocHN5T3V0RWxlbWVudC0+Y29tbW9uV2luZG93KQotICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0gPSBtYXhTZmJQZXJHcm91cFsxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhNYXgobWF4U2ZiUGVyR3JvdXBbMF0sIG1heFNmYlBlckdyb3VwWzFdKTsKLQotICAgICAgICBpZihwc3lTdGF0aWNbMF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQTlMgcHJlcHJvY2Vzc2luZyBkZXBlbmRpbmcgb24gbXMgcHJvY2Vzc2luZzogUE5TIG5vdCBpbiBTaG9ydCBXaW5kb3chICovCi0gICAgICAgICAgICBGREthYWNFbmNfUHJlUHJvY2Vzc1Buc0NoYW5uZWxQYWlyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmcHN5RGF0YVswXS0+c2ZiRW5lcmd5KS0+TG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCZwc3lEYXRhWzFdLT5zZmJFbmVyZ3kpLT5Mb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzBdLT5zZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5TVMuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwc3lDb25mWzBdLnBuc0NvbmYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhWzFdKTsKLQotICAgICAgICAgICAgRkRLYWFjRW5jX0ludGVuc2l0eVN0ZXJlb1Byb2Nlc3NpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkVuZXJneS5Mb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5zZmJFbmVyZ3kuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+bWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYlRocmVzaG9sZC5Mb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5zZmJUaHJlc2hvbGQuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiVGhyZXNob2xkTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0tPnNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mWzBdLnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZlswXS5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mWzBdLnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZlswXS5hbGxvd0lTICYmIGNvbW1vbldpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+aXNCb29rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc1NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhKTsKLQotICAgICAgICAgICAgRkRLYWFjRW5jX01zU3RlcmVvUHJvY2Vzc2luZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+aXNCb29rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0tPnNmYk9mZnNldHMpOwotCi0gICAgICAgICAgICAvKiBQTlMgcG9zdHByb2Nlc3NpbmcgKi8KLSAgICAgICAgICAgIEZES2FhY0VuY19Qb3N0UHJvY2Vzc1Buc0NoYW5uZWxQYWlyKHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwc3lDb25mWzBdLnBuc0NvbmYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0KTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRkRLYWFjRW5jX0ludGVuc2l0eVN0ZXJlb1Byb2Nlc3NpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkVuZXJneS5Mb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5zZmJFbmVyZ3kuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+bWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYlRocmVzaG9sZC5Mb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5zZmJUaHJlc2hvbGQuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiVGhyZXNob2xkTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0tPnNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbMF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzKmhQc3lDb25mU2hvcnQtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZlsxXS5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5ncm91cGVkU2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mWzBdLmFsbG93SVMgJiYgY29tbW9uV2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc0Jvb2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGEpOwotCi0gICAgICAgICAgICAvKiBpdCdzIE9LIHRvIHBhc3MgdGhlICIuTG9uZyIgYXJyYXlzIGhlcmUuIFRoZXkgY29udGFpbiBncm91cGVkIHNob3J0IGRhdGEgc2luY2UgRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKCkgKi8KLSAgICAgICAgICAgIEZES2FhY0VuY19Nc1N0ZXJlb1Byb2Nlc3NpbmcoIHBzeURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzQm9vaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcypoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0tPnNmYk9mZnNldHMpOwotICAgICAgICB9Ci0gICAgfQorICB9IC8qIChjaGFubmVscyA9PSAyKSAqLwogCiAgIC8qCiAgICAgUE5TIENvZGluZwogICAqLwotICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKSB7Ci0gICAgICBpZiAocHN5U3RhdGljW2NoXS0+aXNMRkUpIHsKLSAgICAgICAgICAvKiBubyBQTlMgY29kaW5nICovCi0gICAgICAgICAgZm9yKHNmYiA9IDA7IHNmYiA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7Ci0gICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bm9pc2VOcmdbc2ZiXSA9IE5PX05PSVNFX1BOUzsKLSAgICAgICAgICB9Ci0gICAgICB9IGVsc2UKLSAgICAgIHsKLSAgICAgICAgICBGREthYWNFbmNfQ29kZVBuc0NoYW5uZWwocHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmKHBzeUNvbmZbY2hdLnBuc0NvbmYpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGFbY2hdLT5wbnNGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJFbmVyZ3lMZERhdGEuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bm9pc2VOcmcsIC8qIHRoaXMgaXMgdGhlIGVuZXJneSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgYml0c3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YSk7CisgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgaWYgKHBzeVN0YXRpY1tjaF0tPmlzTEZFKSB7CisgICAgICAvKiBubyBQTlMgY29kaW5nICovCisgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7CisgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5ub2lzZU5yZ1tzZmJdID0gTk9fTk9JU0VfUE5TOwogICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBGREthYWNFbmNfQ29kZVBuc0NoYW5uZWwoCisgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwgJihoVGhpc1BzeUNvbmZbY2hdLT5wbnNDb25mKSwKKyAgICAgICAgICBwbnNEYXRhW2NoXS0+cG5zRmxhZywgcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5Mb25nLAorICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5ub2lzZU5yZywgLyogdGhpcyBpcyB0aGUgZW5lcmd5IHRoYXQgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiB0byB0aGUgYml0c3RyZWFtICovCisgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YSk7CisgICAgfQogICB9CiAKLSAgICAvKgotICAgICAgICBidWlsZCBvdXRwdXQKLSAgICAqLwotICAgIGZvcihjaD0wO2NoPGNoYW5uZWxzO2NoKyspCi0gICAgewotICAgICAgICBJTlQgaiwgZ3JwLCBtYXNrOworICAvKgorICAgICAgYnVpbGQgb3V0cHV0CisgICovCisgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgSU5UIG1hc2s7CisgICAgaW50IGdycDsKKyAgICBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAgPSBtYXhTZmJQZXJHcm91cFtjaF07CisgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm1kY3RTY2FsZSA9IHBzeURhdGFbY2hdLT5tZGN0U2NhbGU7CisgICAgaWYgKGlzU2hvcnRXaW5kb3dbY2hdID09IDApIHsKKyAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQgPSBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZTsKKyAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCA9IGhQc3lDb25mTG9uZy0+c2ZiQWN0aXZlOworICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9CisgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZTsKKyAgICAgIHBzeU91dENoYW5uZWxbY2hdLT53aW5kb3dTaGFwZSA9CisgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NoYXBlOworICAgIH0gZWxzZSB7CisgICAgICBJTlQgc2ZiQ250ID0gcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMgKgorICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkNudDsKIAotICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAgICAgPSBtYXhTZmJQZXJHcm91cFtjaF07Ci0gICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5tZGN0U2NhbGUgICAgICAgICA9IHBzeURhdGFbY2hdLT5tZGN0U2NhbGU7Ci0KLSAgICAgICAgaWYoaXNTaG9ydFdpbmRvd1tjaF09PTApIHsKLQotICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCAgICAgICAgID0gaFBzeUNvbmZMb25nLT5zZmJBY3RpdmU7Ci0gICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXAgICAgPSBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZTsKLSAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPSBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlOwotICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPndpbmRvd1NoYXBlICAgID0gcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NoYXBlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgSU5UIHNmYkNudCA9IHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzKmhQc3lDb25mU2hvcnQtPnNmYkNudDsKLQotICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCAgICAgICAgID0gc2ZiQ250OwotICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwICAgID0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250OwotICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsKLSAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT53aW5kb3dTaGFwZSAgICA9IFNJTkVfV0lORE9XOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZ2VuZXJhdGUgZ3JvdXBpbmcgbWFzayAqLwotICAgICAgICBtYXNrID0gMDsKLSAgICAgICAgZm9yIChncnAgPSAwOyBncnAgPCBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwczsgZ3JwKyspCi0gICAgICAgIHsKLSAgICAgICAgICBtYXNrIDw8PSAxOwotICAgICAgICAgIGZvciAoaj0xOyBqPHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbltncnBdOyBqKyspIHsKLSAgICAgICAgICAgICAgbWFzayA9IChtYXNrPDwxKSB8IDEgOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+Z3JvdXBpbmdNYXNrID0gbWFzazsKLQotICAgICAgICAvKiBidWlsZCBpbnRlcmZhY2UgKi8KLSAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5ncm91cExlbixwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW4sTUFYX05PX09GX0dST1VQUypzaXplb2YoSU5UKSk7Ci0gICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5LCgmcHN5RGF0YVtjaF0tPnNmYkVuZXJneSktPkxvbmcsIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJTcHJlYWRFbmVyZ3ksKCZwc3lEYXRhW2NoXS0+c2ZiU3ByZWFkRW5lcmd5KS0+TG9uZywgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOwotLy8gICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+bWRjdFNwZWN0cnVtLCBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLCAoMTAyNCkqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250ID0gc2ZiQ250OworICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwID0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250OworICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsKKyAgICAgIHBzeU91dENoYW5uZWxbY2hdLT53aW5kb3dTaGFwZSA9IFNJTkVfV0lORE9XOwogICAgIH0KKyAgICAvKiBnZW5lcmF0ZSBncm91cGluZyBtYXNrICovCisgICAgbWFzayA9IDA7CisgICAgZm9yIChncnAgPSAwOyBncnAgPCBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwczsKKyAgICAgICAgIGdycCsrKSB7CisgICAgICBpbnQgajsKKyAgICAgIG1hc2sgPDw9IDE7CisgICAgICBmb3IgKGogPSAxOyBqIDwgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmdyb3VwTGVuW2dycF07IGorKykgeworICAgICAgICBtYXNrID0gKG1hc2sgPDwgMSkgfCAxOworICAgICAgfQorICAgIH0KKyAgICBwc3lPdXRDaGFubmVsW2NoXS0+Z3JvdXBpbmdNYXNrID0gbWFzazsKIAotICAgIHJldHVybiBBQUNfRU5DX09LOworICAgIC8qIGJ1aWxkIGludGVyZmFjZSAqLworICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+Z3JvdXBMZW4sCisgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbiwKKyAgICAgICAgICAgICAgTUFYX05PX09GX0dST1VQUyAqIHNpemVvZihJTlQpKTsKKyAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneSwgKCZwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5KS0+TG9uZywKKyAgICAgICAgICAgICAgTUFYX0dST1VQRURfU0ZCICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJTcHJlYWRFbmVyZ3ksCisgICAgICAgICAgICAgICgmcHN5RGF0YVtjaF0tPnNmYlNwcmVhZEVuZXJneSktPkxvbmcsCisgICAgICAgICAgICAgIE1BWF9HUk9VUEVEX1NGQiAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIC8vICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPm1kY3RTcGVjdHJ1bSwKKyAgICAvLyAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwgKDEwMjQpKnNpemVvZihGSVhQX0RCTCkpOworICB9CisKKyAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKK3ZvaWQgRkRLYWFjRW5jX1BzeUNsb3NlKFBTWV9JTlRFUk5BTCAqKnBoUHN5SW50ZXJuYWwsIFBTWV9PVVQgKipwaFBzeU91dCkgeworICBpbnQgbiwgaTsKIAotdm9pZCBGREthYWNFbmNfUHN5Q2xvc2UoUFNZX0lOVEVSTkFMICAgKipwaFBzeUludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCAgICAgICAgKipwaFBzeU91dCkKLXsKLSAgICBpbnQgbiwgaTsKKyAgaWYgKHBoUHN5SW50ZXJuYWwgIT0gTlVMTCkgeworICAgIFBTWV9JTlRFUk5BTCAqaFBzeUludGVybmFsID0gKnBoUHN5SW50ZXJuYWw7CiAKKyAgICBpZiAoaFBzeUludGVybmFsKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKDgpOyBpKyspIHsKKyAgICAgICAgaWYgKGhQc3lJbnRlcm5hbC0+cFN0YXRpY0NoYW5uZWxzW2ldKSB7CisgICAgICAgICAgaWYgKGhQc3lJbnRlcm5hbC0+cFN0YXRpY0NoYW5uZWxzW2ldLT5wc3lJbnB1dEJ1ZmZlcikKKyAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgICZoUHN5SW50ZXJuYWwtPnBTdGF0aWNDaGFubmVsc1tpXQorICAgICAgICAgICAgICAgICAgICAgLT5wc3lJbnB1dEJ1ZmZlcik7IC8qIEFVRElPIElOUFVUIEJVRkZFUiAqLwogCi0gICAgaWYocGhQc3lJbnRlcm5hbCE9TlVMTCkgewotICAgICAgUFNZX0lOVEVSTkFMICpoUHN5SW50ZXJuYWwgPSAqcGhQc3lJbnRlcm5hbDsKLQotICAgICAgaWYgKGhQc3lJbnRlcm5hbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKLSAgICAgICAgICBpZiAoaFBzeUludGVybmFsLT5wU3RhdGljQ2hhbm5lbHNbaV0pIHsKLSAgICAgICAgICAgIGlmIChoUHN5SW50ZXJuYWwtPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIpCi0gICAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyKCZoUHN5SW50ZXJuYWwtPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIpOyAgLyogQVVESU8gSU5QVVQgQlVGRkVSICovCi0KLSAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeVN0YXRpYygmaFBzeUludGVybmFsLT5wU3RhdGljQ2hhbm5lbHNbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQU1lfU1RBVElDICovCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKLSAgICAgICAgICBpZiAoaFBzeUludGVybmFsLT5wc3lFbGVtZW50W2ldKQotICAgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5RWxlbWVudCgmaFBzeUludGVybmFsLT5wc3lFbGVtZW50W2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBTWV9FTEVNRU5UICovCi0gICAgICAgIH0KLQotCi0gICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUludGVybmFsKHBoUHN5SW50ZXJuYWwpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChwaFBzeU91dCE9TlVMTCkgewotICAgICAgZm9yIChuPTA7IG48KDEpOyBuKyspIHsKLSAgICAgICAgaWYgKHBoUHN5T3V0W25dKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwaFBzeU91dFtuXS0+cFBzeU91dENoYW5uZWxzW2ldKQotICAgICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lPdXRDaGFubmVsKCZwaFBzeU91dFtuXS0+cFBzeU91dENoYW5uZWxzW2ldKTsgICAgICAgICAgICAgICAgICAvKiBQU1lfT1VUX0NIQU5ORUwgKi8KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBmb3IgKGk9MDsgaTwoOCk7IGkrKykgewotICAgICAgICAgICAgaWYgKHBoUHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldKQotICAgICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lPdXRFbGVtZW50cygmcGhQc3lPdXRbbl0tPnBzeU91dEVsZW1lbnRbaV0pOyAgICAgICAgICAgICAgICAgICAvKiBQU1lfT1VUX0VMRU1FTlRTICovCi0gICAgICAgICAgfQotCi0gICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5T3V0KCZwaFBzeU91dFtuXSk7CisgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5U3RhdGljKAorICAgICAgICAgICAgICAmaFBzeUludGVybmFsLT5wU3RhdGljQ2hhbm5lbHNbaV0pOyAvKiBQU1lfU1RBVElDICovCiAgICAgICAgIH0KICAgICAgIH0KKworICAgICAgZm9yIChpID0gMDsgaSA8ICgoOCkpOyBpKyspIHsKKyAgICAgICAgaWYgKGhQc3lJbnRlcm5hbC0+cHN5RWxlbWVudFtpXSkKKyAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lFbGVtZW50KAorICAgICAgICAgICAgICAmaFBzeUludGVybmFsLT5wc3lFbGVtZW50W2ldKTsgLyogUFNZX0VMRU1FTlQgKi8KKyAgICAgIH0KKworICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5SW50ZXJuYWwocGhQc3lJbnRlcm5hbCk7CiAgICAgfQorICB9CisKKyAgaWYgKHBoUHN5T3V0ICE9IE5VTEwpIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgKDEpOyBuKyspIHsKKyAgICAgIGlmIChwaFBzeU91dFtuXSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKDgpOyBpKyspIHsKKyAgICAgICAgICBpZiAocGhQc3lPdXRbbl0tPnBQc3lPdXRDaGFubmVsc1tpXSkKKyAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeU91dENoYW5uZWwoCisgICAgICAgICAgICAgICAgJnBoUHN5T3V0W25dLT5wUHN5T3V0Q2hhbm5lbHNbaV0pOyAvKiBQU1lfT1VUX0NIQU5ORUwgKi8KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoKDgpKTsgaSsrKSB7CisgICAgICAgICAgaWYgKHBoUHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldKQorICAgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5T3V0RWxlbWVudHMoCisgICAgICAgICAgICAgICAgJnBoUHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldKTsgLyogUFNZX09VVF9FTEVNRU5UUyAqLworICAgICAgICB9CisKKyAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5T3V0KCZwaFBzeU91dFtuXSk7CisgICAgICB9CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3BzeV9tYWluLmggYi9saWJBQUNlbmMvc3JjL3BzeV9tYWluLmgKaW5kZXggN2JkY2MzOC4uN2NjMDFhMyAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvcHN5X21haW4uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxOCArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQc3ljaG9hY2NvdXN0aWMgbWFqb3IgZnVuY3Rpb24gYmxvY2sKKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUHN5Y2hvYWNjb3VzdGljIG1ham9yIGZ1bmN0aW9uIGJsb2NrCiAKLSNpZm5kZWYgX1BTWU1BSU5fSAotI2RlZmluZSBfUFNZTUFJTl9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIFBTWV9NQUlOX0gKKyNkZWZpbmUgUFNZX01BSU5fSAogCiAjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJxY19kYXRhLmgiCkBAIC05OSw3NiArMTEwLDUyIEBACiAvKgogICBwc3ljaCBpbnRlcm5hbAogKi8KLXR5cGVkZWYgc3RydWN0ICB7Cit0eXBlZGVmIHN0cnVjdCB7CisgIFBTWV9TVEFUSUMgKnBzeVN0YXRpY1soMildOwogCi0gIFBTWV9TVEFUSUMqICAgICAgICBwc3lTdGF0aWNbKDIpXTsKK30gUFNZX0VMRU1FTlQ7CiAKLX1QU1lfRUxFTUVOVDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgUFNZX0RBVEEgcHN5RGF0YVsoMildOworICBUTlNfREFUQSB0bnNEYXRhWygyKV07CisgIFBOU19EQVRBIHBuc0RhdGFbKDIpXTsKIAotdHlwZWRlZiBzdHJ1Y3QgIHsKK30gUFNZX0RZTkFNSUM7CiAKLSAgUFNZX0RBVEEgICAgICAgICAgIHBzeURhdGFbKDIpXTsKLSAgVE5TX0RBVEEgICAgICAgICAgIHRuc0RhdGFbKDIpXTsKLSAgUE5TX0RBVEEgICAgICAgICAgIHBuc0RhdGFbKDIpXTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgUFNZX0NPTkZJR1VSQVRJT04gcHN5Q29uZlsyXTsgLyogTE9ORyAvIFNIT1JUICovCisgIFBTWV9FTEVNRU5UICpwc3lFbGVtZW50WygoOCkpXTsKKyAgUFNZX1NUQVRJQyAqcFN0YXRpY0NoYW5uZWxzWyg4KV07CisgIFBTWV9EWU5BTUlDICpwc3lEeW5hbWljOworICBJTlQgZ3JhbnVsZUxlbmd0aDsKIAotfVBTWV9EWU5BTUlDOworfSBQU1lfSU5URVJOQUw7CiAKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Qc3lOZXcoUFNZX0lOVEVSTkFMICoqcGhwc3ksIGNvbnN0IElOVCBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsIFVDSEFSICpkeW5hbWljX1JBTSk7CiAKLXR5cGVkZWYgc3RydWN0ICB7CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUHN5T3V0TmV3KFBTWV9PVVQgKipwaHBzeU91dCwgY29uc3QgSU5UIG5FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywgY29uc3QgSU5UIG5TdWJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpkeW5hbWljX1JBTSk7CiAKLSAgUFNZX0NPTkZJR1VSQVRJT04gIHBzeUNvbmZbMl07IC8qIExPTkcgLyBTSE9SVCAqLwotICBQU1lfRUxFTUVOVCogICAgICAgcHN5RWxlbWVudFsoOCldOwotICBQU1lfU1RBVElDKiAgICAgICAgcFN0YXRpY0NoYW5uZWxzWyg4KV07Ci0gIFBTWV9EWU5BTUlDKiAgICAgICBwc3lEeW5hbWljOwotICBJTlQgICAgICAgICAgICAgICAgZ3JhbnVsZUxlbmd0aDsKLQotfVBTWV9JTlRFUk5BTDsKLQotCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUHN5TmV3KFBTWV9JTlRFUk5BTCAgKipwaHBzeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5FbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5DaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAgICAgICAqZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUHN5T3V0TmV3KFBTWV9PVVQgICAgKipwaHBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG5FbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG5TdWJGcmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIgICAgICAgKmR5bmFtaWNfUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeUluaXQoUFNZX0lOVEVSTkFMICAgICpoUHN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCAgICAgICAgKipwaHBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgblN1YkZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbk1heENoYW5uZWxzLAorQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeUluaXQoUFNZX0lOVEVSTkFMICpoUHN5LCBQU1lfT1VUICoqcGhwc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblN1YkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuTWF4Q2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKmNtKTsKIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeU1haW5Jbml0KFBTWV9JTlRFUk5BTCAqaFBzeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdG5zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2VQbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHVzZUlTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgaW5pdEZsYWdzKTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lNYWluSW5pdCgKKyAgICBQU1lfSU5URVJOQUwgKmhQc3ksIEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSwgQ0hBTk5FTF9NQVBQSU5HICpjbSwKKyAgICBJTlQgc2FtcGxlUmF0ZSwgSU5UIGdyYW51bGVMZW5ndGgsIElOVCBiaXRSYXRlLCBJTlQgdG5zTWFzaywgSU5UIGJhbmR3aWR0aCwKKyAgICBJTlQgdXNlUG5zLCBJTlQgdXNlSVMsIElOVCB1c2VNUywgVUlOVCBzeW50YXhGbGFncywgVUxPTkcgaW5pdEZsYWdzKTsKIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeU1haW4oSU5UICAgICAgICAgICAgICAgICBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9FTEVNRU5UICAgICAgICAgKnBzeUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfRFlOQU1JQyAgICAgICAgICpwc3lEeW5hbWljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT04gICAqcHN5Q29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAgICAgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAgICpwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpjaElkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIHRvdGFsQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lNYWluKElOVCBjaGFubmVscywgUFNZX0VMRU1FTlQgKnBzeUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfRFlOQU1JQyAqcHN5RHluYW1pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OICpwc3lDb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqcElucHV0LCBjb25zdCBVSU5UIGlucHV0QnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY2hJZHgsIElOVCB0b3RhbENoYW5uZWxzKTsKIAotdm9pZCBGREthYWNFbmNfUHN5Q2xvc2UoUFNZX0lOVEVSTkFMICAgKipwaFBzeUludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCAgICAgICAgKipwaFBzeU91dCk7Cit2b2lkIEZES2FhY0VuY19Qc3lDbG9zZShQU1lfSU5URVJOQUwgKipwaFBzeUludGVybmFsLCBQU1lfT1VUICoqcGhQc3lPdXQpOwogCi0jZW5kaWYgLyogX1BTWU1BSU5fSCAqLworI2VuZGlmIC8qIFBTWV9NQUlOX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcWNfZGF0YS5oIGIvbGliQUFDZW5jL3NyYy9xY19kYXRhLmgKaW5kZXggMDBkNjA5MC4uNmU2NzFlZCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9xY19kYXRhLmgKKysrIGIvbGliQUFDZW5jL3NyYy9xY19kYXRhLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTkgKzkwLDIwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFF1YW50aXppbmcgJiBjb2RpbmcgZGF0YQorICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUXVhbnRpemluZyAmIGNvZGluZyBkYXRhCiAKLSNpZm5kZWYgX1FDX0RBVEFfSAotI2RlZmluZSBfUUNfREFUQV9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIFFDX0RBVEFfSAorI2RlZmluZSBRQ19EQVRBX0gKIAorI2luY2x1ZGUgImFhY2VuYy5oIgogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogI2luY2x1ZGUgImR5bl9iaXRzLmgiCiAjaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCkBAIC05OSwxOCArMTExLDE2IEBACiAjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCiAjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCiAKLQogdHlwZWRlZiBlbnVtIHsKICAgUUNEQVRBX0JSX01PREVfSU5WQUxJRCA9IC0xLAotICBRQ0RBVEFfQlJfTU9ERV9DQlIgICAgID0gIDAsCi0gIFFDREFUQV9CUl9NT0RFX1ZCUl8xICAgPSAgMSwgLyogMzIga2Jwcy9jaGFubmVsICovCi0gIFFDREFUQV9CUl9NT0RFX1ZCUl8yICAgPSAgMiwgLyogNDAga2Jwcy9jaGFubmVsICovCi0gIFFDREFUQV9CUl9NT0RFX1ZCUl8zICAgPSAgMywgLyogNDgga2Jwcy9jaGFubmVsICovCi0gIFFDREFUQV9CUl9NT0RFX1ZCUl80ICAgPSAgNCwgLyogNjQga2Jwcy9jaGFubmVsICovCi0gIFFDREFUQV9CUl9NT0RFX1ZCUl81ICAgPSAgNSwgLyogOTYga2Jwcy9jaGFubmVsICovCi0gIFFDREFUQV9CUl9NT0RFX0ZGICAgICAgPSAgNiwgIC8qIEZpeGVkIGZyYW1lIG1vZGUuICovCi0gIFFDREFUQV9CUl9NT0RFX1NGUiAgICAgPSAgNyAgLyogU3VwZXJmcmFtZSBtb2RlLiAqLwotCisgIFFDREFUQV9CUl9NT0RFX0NCUiA9IDAsICAgLyogQ29uc3RhbnQgYml0IHJhdGUsIGdpdmVuIGF2ZXJhZ2UgYml0cmF0ZSAqLworICBRQ0RBVEFfQlJfTU9ERV9WQlJfMSA9IDEsIC8qIFZhcmlhYmxlIGJpdCByYXRlLCB2ZXJ5IGxvdyAqLworICBRQ0RBVEFfQlJfTU9ERV9WQlJfMiA9IDIsIC8qIFZhcmlhYmxlIGJpdCByYXRlLCBsb3cgKi8KKyAgUUNEQVRBX0JSX01PREVfVkJSXzMgPSAzLCAvKiBWYXJpYWJsZSBiaXQgcmF0ZSwgbWVkaXVtICovCisgIFFDREFUQV9CUl9NT0RFX1ZCUl80ID0gNCwgLyogVmFyaWFibGUgYml0IHJhdGUsIGhpZ2ggKi8KKyAgUUNEQVRBX0JSX01PREVfVkJSXzUgPSA1LCAvKiBWYXJpYWJsZSBiaXQgcmF0ZSwgdmVyeSBoaWdoICovCisgIFFDREFUQV9CUl9NT0RFX0ZGID0gNiwgICAgLyogRml4ZWQgZnJhbWUgbW9kZS4gKi8KKyAgUUNEQVRBX0JSX01PREVfU0ZSID0gNyAgICAvKiBTdXBlcmZyYW1lIG1vZGUuICovCiAKIH0gUUNEQVRBX0JSX01PREU7CiAKQEAgLTEyNywxMzcgKzEzNywxNTAgQEAKICAgSU5UIG5DaGFubmVsczsKICAgSU5UIG5DaGFubmVsc0VmZjsKICAgSU5UIG5FbGVtZW50czsKLSAgRUxFTUVOVF9JTkZPIGVsSW5mb1soOCldOworICBFTEVNRU5UX0lORk8gZWxJbmZvWygoOCkpXTsKIH0gQ0hBTk5FTF9NQVBQSU5HOwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgIElOVCBwYWRkaW5nUmVzdDsKIH0gUEFERElORzsKIAotCiAvKiBRdWFudGl6aW5nICYgY29kaW5nIHN0YWdlICovCiAKLXN0cnVjdCBRQ19JTklUewotICBDSEFOTkVMX01BUFBJTkcqIGNoYW5uZWxNYXBwaW5nOworc3RydWN0IFFDX0lOSVQgeworICBDSEFOTkVMX01BUFBJTkcgKmNoYW5uZWxNYXBwaW5nOwogICBJTlQgc2NlQ3BlOyAgICAgIC8qIG5vdCB1c2VkIHlldCAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBJTlQgbWF4Qml0czsgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgaW4gcmVzZXJ2b2lyICAqLwogICBJTlQgYXZlcmFnZUJpdHM7IC8qIGF2ZXJhZ2UgbnVtYmVyIG9mIGJpdHMgd2Ugc2hvdWxkIHVzZSAqLwogICBJTlQgYml0UmVzOwotICBJTlQgc2FtcGxlUmF0ZTsgICAgICAgLyogb3V0cHV0IHNhbXBsZSByYXRlICAgICAgICAgICAgICAgICAgICovCi0gIElOVCBhZHZhbmNlZEJpdHNUb1BlOyAvKiBpZiBzZXQsIGNhbGMgYml0czJQRSBmYWN0b3IgZGVwZW5kaW5nIG9uIHNhbXBsZXJhdGUgKi8KLSAgSU5UIHN0YXRpY0JpdHM7ICAvKiBCaXRzIHBlciBmcmFtZSBjb25zdW1lZCBieSB0cmFuc3BvcnQgbGF5ZXJzLiAqLworICBJTlQgc2FtcGxlUmF0ZTsgLyogb3V0cHV0IHNhbXBsZSByYXRlICAgICAgICAgICAgICAgICAgICovCisgIElOVCBpc0xvd0RlbGF5OyAvKiBpZiBzZXQsIGNhbGMgYml0czJQRSBmYWN0b3IgZGVwZW5kaW5nIG9uIHNhbXBsZXJhdGUgKi8KKyAgSU5UIHN0YXRpY0JpdHM7IC8qIEJpdHMgcGVyIGZyYW1lIGNvbnN1bWVkIGJ5IHRyYW5zcG9ydCBsYXllcnMuICovCiAgIFFDREFUQV9CUl9NT0RFIGJpdHJhdGVNb2RlOwogICBJTlQgbWVhblBlOwotICBJTlQgY2hCaXRyYXRlOworICBJTlQgY2hCaXRyYXRlOyAvKiBCaXRyYXRlL2NoYW5uZWwgKi8KICAgSU5UIGludlF1YW50OwotICBJTlQgbWF4SXRlcmF0aW9uczsgLyogTWF4aW11bSBudW1iZXIgb2YgYWxsb3dlZCBpdGVyYXRpb25zIGJlZm9yZSBGREthYWNFbmNfY3Jhc2hSZWNvdmVyeSgpIGlzIGFwcGxpZWQuICovCisgIElOVCBtYXhJdGVyYXRpb25zOyAvKiBNYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGl0ZXJhdGlvbnMgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfY3Jhc2hSZWNvdmVyeSgpIGlzIGFwcGxpZWQuICovCiAgIEZJWFBfREJMIG1heEJpdEZhYzsKICAgSU5UIGJpdHJhdGU7Ci0gIElOVCBuU3ViRnJhbWVzOyAvKiBoZWxwZXIgdmFyaWFibGUgKi8KLSAgSU5UIG1pbkJpdHM7ICAgIC8qIG1pbmltYWwgbnVtYmVyIG9mIGJpdHMgaW4gb25lIGZyYW1lKi8KKyAgSU5UIG5TdWJGcmFtZXM7ICAgICAgICAgICAgICAgIC8qIGhlbHBlciB2YXJpYWJsZSAqLworICBJTlQgbWluQml0czsgICAgICAgICAgICAgICAgICAgLyogbWluaW1hbCBudW1iZXIgb2YgYml0cyBpbiBvbmUgZnJhbWUqLworICBBQUNFTkNfQklUUkVTX01PREUgYml0UmVzTW9kZTsgLyogMDogZnVsbCBiaXRyZXNlcnZvaXIsIDE6IHJlZHVjZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJlc2Vydm9pciwgMjogZGlzYWJsZWQgYml0cmVzZXJ2b2lyICovCisgIElOVCBiaXREaXN0cmlidXRpb25Nb2RlOyAvKiBDb25maWd1cmUgZWxlbWVudC13aXNlIGV4ZWN1dGlvbiBvciBleGVjdXRpb24gb3ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGVsZW1lbnRzIGZvciB0aGUgcGUtZGVwZW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQtYWRhcHRpb24gKi8KIAogICBQQURESU5HIHBhZGRpbmc7CiB9OwogCi10eXBlZGVmIHN0cnVjdAotewotICBGSVhQX0RCTCAgICAgIG1kY3RTcGVjdHJ1bVsoMTAyNCldOwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCBtZGN0U3BlY3RydW1bKDEwMjQpXTsKIAotICBTSE9SVCAgICAgICAgIHF1YW50U3BlY1soMTAyNCldOworICBTSE9SVCBxdWFudFNwZWNbKDEwMjQpXTsKIAotICBVSU5UICAgICAgICAgIG1heFZhbHVlSW5TZmJbTUFYX0dST1VQRURfU0ZCXTsKLSAgSU5UICAgICAgICAgICBzY2ZbTUFYX0dST1VQRURfU0ZCXTsKLSAgSU5UICAgICAgICAgICBnbG9iYWxHYWluOwotICBTRUNUSU9OX0RBVEEgIHNlY3Rpb25EYXRhOworICBVSU5UIG1heFZhbHVlSW5TZmJbTUFYX0dST1VQRURfU0ZCXTsKKyAgSU5UIHNjZltNQVhfR1JPVVBFRF9TRkJdOworICBJTlQgZ2xvYmFsR2FpbjsKKyAgU0VDVElPTl9EQVRBIHNlY3Rpb25EYXRhOwogCi0gIEZJWFBfREJMICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YVtNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX0RCTCBzZmJGb3JtRmFjdG9yTGREYXRhW01BWF9HUk9VUEVEX1NGQl07CiAKLSAgRklYUF9EQkwgICAgICBzZmJUaHJlc2hvbGRMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKLSAgRklYUF9EQkwgICAgICBzZmJNaW5TbnJMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKLSAgRklYUF9EQkwgICAgICBzZmJFbmVyZ3lMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKLSAgRklYUF9EQkwgICAgICBzZmJFbmVyZ3lbTUFYX0dST1VQRURfU0ZCXTsKLSAgRklYUF9EQkwgICAgICBzZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX0RCTCBzZmJUaHJlc2hvbGRMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgc2ZiTWluU25yTGREYXRhW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIHNmYkVuZXJneUxkRGF0YVtNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX0RCTCBzZmJFbmVyZ3lbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgc2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKIAotICBGSVhQX0RCTCAgICAgIHNmYkVuRmFjTGRbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgc2ZiRW5GYWNMZFtNQVhfR1JPVVBFRF9TRkJdOwogCi0gIEZJWFBfREJMICAgICAgc2ZiU3ByZWFkRW5lcmd5W01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIHNmYlNwcmVhZEVuZXJneVtNQVhfR1JPVVBFRF9TRkJdOwogCiB9IFFDX09VVF9DSEFOTkVMOwogCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEVYVF9QQVlMT0FEX1RZUEUgIHR5cGU7ICAvKiB0eXBlIG9mIHRoZSBleHRlbnNpb24gcGF5bG9hZCAqLwotICBJTlQgICAgblBheWxvYWRCaXRzOyAgICAgLyogc2l6ZSBvZiB0aGUgcGF5bG9hZCAqLwotICBVQ0hBUiAqcFBheWxvYWQ7ICAgICAgICAgLyogcG9pbnRlciB0byBwYXlsb2FkICovCit0eXBlZGVmIHN0cnVjdCB7CisgIEVYVF9QQVlMT0FEX1RZUEUgdHlwZTsgLyogdHlwZSBvZiB0aGUgZXh0ZW5zaW9uIHBheWxvYWQgKi8KKyAgSU5UIG5QYXlsb2FkQml0czsgICAgICAvKiBzaXplIG9mIHRoZSBwYXlsb2FkICovCisgIFVDSEFSICpwUGF5bG9hZDsgICAgICAgLyogcG9pbnRlciB0byBwYXlsb2FkICovCiAKIH0gUUNfT1VUX0VYVEVOU0lPTjsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgc3RhdGljQml0c1VzZWQ7IC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KKyAgSU5UIGR5bkJpdHNVc2VkOyAgICAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIElOVCAgICAgICAgICBzdGF0aWNCaXRzVXNlZDsgLyogZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyAqLwotICBJTlQgICAgICAgICAgZHluQml0c1VzZWQ7ICAgIC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KKyAgSU5UIGV4dEJpdHNVc2VkOyAvKiBiaXQgY29uc3VtcHRpb24gb2YgZXh0ZW5kZWQgZmlsbCBlbGVtZW50cyAqLworICBJTlQgbkV4dGVuc2lvbnM7IC8qIG51bWJlciBvZiBleHRlbnNpb24gcGF5bG9hZHMgZm9yIHRoaXMgZWxlbWVudCAqLworICBRQ19PVVRfRVhURU5TSU9OIGV4dGVuc2lvblsoMSldOyAvKiByZWZmZXJpbmcgZXh0ZW5zaW9uIHBheWxvYWQgKi8KIAotICBJTlQgICAgICAgICAgZXh0Qml0c1VzZWQ7ICAgIC8qIGJpdCBjb25zdW1wdGlvbiBvZiBleHRlbmRlZCBmaWxsIGVsZW1lbnRzICovCi0gIElOVCAgICAgICAgICBuRXh0ZW5zaW9uczsgICAgLyogbnVtYmVyIG9mIGV4dGVuc2lvbiBwYXlsb2FkcyBmb3IgdGhpcyBlbGVtZW50ICovCi0gIFFDX09VVF9FWFRFTlNJT04gZXh0ZW5zaW9uWygxKV07ICAvKiByZWZmZXJpbmcgZXh0ZW5zaW9uIHBheWxvYWQgKi8KKyAgSU5UIGdyYW50ZWREeW5CaXRzOwogCi0gIElOVCAgICAgICAgICBncmFudGVkRHluQml0czsKKyAgSU5UIGdyYW50ZWRQZTsKKyAgSU5UIGdyYW50ZWRQZUNvcnI7CiAKLSAgSU5UICAgICAgICAgIGdyYW50ZWRQZTsKLSAgSU5UICAgICAgICAgIGdyYW50ZWRQZUNvcnI7Ci0KLSAgUEVfREFUQSAgICAgIHBlRGF0YTsKKyAgUEVfREFUQSBwZURhdGE7CiAKICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbFsoMildOwogCisgIFVDSEFSCisgICpkeW5NZW1fQWhfRmxhZzsgLyogcG9pbnRlciB0byBkeW5hbWljIGJ1ZmZlciB1c2VkIGJ5IEFoRmxhZyBpbiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKCkgKi8KKyAgVUNIQVIKKyAgKmR5bk1lbV9UaHJfRXhwOyAvKiBwb2ludGVyIHRvIGR5bmFtaWMgYnVmZmVyIHVzZWQgYnkgVGhyRXhwIGluIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX2FkYXB0VGhyZXNob2xkc1RvUGUoKSAqLworICBVQ0hBUiAqZHluTWVtX1NmYk5BY3RpdmVMaW5lc0xkRGF0YTsgLyogcG9pbnRlciB0byBkeW5hbWljIGJ1ZmZlciB1c2VkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJOQWN0aXZlTGluZXNMZERhdGEgaW4gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKCkgKi8KIAogfSBRQ19PVVRfRUxFTUVOVDsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgUUNfT1VUX0VMRU1FTlQgICAgKnFjRWxlbWVudFsoOCldOwotICBRQ19PVVRfQ0hBTk5FTCAgICAqcFFjT3V0Q2hhbm5lbHNbKDgpXTsKLSAgUUNfT1VUX0VYVEVOU0lPTiAgIGV4dGVuc2lvblsoMisyKV07ICAvKiBnbG9iYWwgZXh0ZW5zaW9uIHBheWxvYWQgKi8KLSAgSU5UICAgICAgICAgIG5FeHRlbnNpb25zOyAgICAgICAvKiBudW1iZXIgb2YgZXh0ZW5zaW9uIHBheWxvYWRzIGZvciB0aGlzIEFVICovCi0gIElOVCAgICAgICAgICBtYXhEeW5CaXRzOyAgICAgICAgLyogbWF4aW1hbCBhbGxvd2VkIGR5bmFtaWMgYml0cyBpbiBmcmFtZSAqLwotICBJTlQgICAgICAgICAgZ3JhbnRlZER5bkJpdHM7ICAgIC8qIGdyYW50ZWQgZHluYW1pYyBiaXRzIGluIGZyYW1lICovCi0gIElOVCAgICAgICAgICB0b3RGaWxsQml0czsgICAgICAgLyogZmlsbCBiaXRzICovCi0gIElOVCAgICAgICAgICBlbGVtZW50RXh0Qml0czsgICAgLyogZWxlbWVudCBhc3NvY2lhdGVkIGV4dGVuc2lvbiBwYXlsb2FkIGJpdHMsIGUuZy4gc2JyLCBkcmMgLi4uICovCi0gIElOVCAgICAgICAgICBnbG9iYWxFeHRCaXRzOyAgICAgLyogZnJhbWUvYXUgYXNzb2NpYXRlZCBleHRlbnNpb24gcGF5bG9hZCBiaXRzIChhbmMgZGF0YSAuLi4pICovCi0gIElOVCAgICAgICAgICBzdGF0aWNCaXRzOyAgICAgICAgLyogYWFjIHNpZGUgaW5mbyBiaXRzICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFFDX09VVF9FTEVNRU5UICpxY0VsZW1lbnRbKCg4KSldOworICBRQ19PVVRfQ0hBTk5FTCAqcFFjT3V0Q2hhbm5lbHNbKDgpXTsKKyAgUUNfT1VUX0VYVEVOU0lPTiBleHRlbnNpb25bKDIgKyAyKV07IC8qIGdsb2JhbCBleHRlbnNpb24gcGF5bG9hZCAqLworICBJTlQgbkV4dGVuc2lvbnM7ICAgIC8qIG51bWJlciBvZiBleHRlbnNpb24gcGF5bG9hZHMgZm9yIHRoaXMgQVUgKi8KKyAgSU5UIG1heER5bkJpdHM7ICAgICAvKiBtYXhpbWFsIGFsbG93ZWQgZHluYW1pYyBiaXRzIGluIGZyYW1lICovCisgIElOVCBncmFudGVkRHluQml0czsgLyogZ3JhbnRlZCBkeW5hbWljIGJpdHMgaW4gZnJhbWUgKi8KKyAgSU5UIHRvdEZpbGxCaXRzOyAgICAvKiBmaWxsIGJpdHMgKi8KKyAgSU5UIGVsZW1lbnRFeHRCaXRzOyAvKiBlbGVtZW50IGFzc29jaWF0ZWQgZXh0ZW5zaW9uIHBheWxvYWQgYml0cywgZS5nLiBzYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHJjIC4uLiAqLworICBJTlQgZ2xvYmFsRXh0Qml0czsgIC8qIGZyYW1lL2F1IGFzc29jaWF0ZWQgZXh0ZW5zaW9uIHBheWxvYWQgYml0cyAoYW5jIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pICovCisgIElOVCBzdGF0aWNCaXRzOyAgICAgLyogYWFjIHNpZGUgaW5mbyBiaXRzICovCiAKLSAgSU5UICAgICAgICAgIHRvdGFsTm9SZWRQZTsKLSAgSU5UICAgICAgICAgIHRvdGFsR3JhbnRlZFBlQ29ycjsKKyAgSU5UIHRvdGFsTm9SZWRQZTsKKyAgSU5UIHRvdGFsR3JhbnRlZFBlQ29ycjsKIAotICBJTlQgICAgICAgICAgdXNlZER5bkJpdHM7ICAgICAgIC8qIG51bWJlciBvZiBkeW5hbWljIGJpdHMgaW4gdXNlICovCi0gIElOVCAgICAgICAgICBhbGlnbkJpdHM7ICAgICAgICAgLyogQVUgYWxpZ25tZW50IGJpdHMgKi8KLSAgSU5UICAgICAgICAgIHRvdGFsQml0czsgICAgICAgICAvKiBzdW0gb2Ygc3RhdGljLCBkeW4sIHNiciwgZmlsbCwgYWxpZ24gYW5kIGRzZSBiaXRzICovCisgIElOVCB1c2VkRHluQml0czsgLyogbnVtYmVyIG9mIGR5bmFtaWMgYml0cyBpbiB1c2UgKi8KKyAgSU5UIGFsaWduQml0czsgICAvKiBBVSBhbGlnbm1lbnQgYml0cyAqLworICBJTlQgdG90YWxCaXRzOyAgIC8qIHN1bSBvZiBzdGF0aWMsIGR5biwgc2JyLCBmaWxsLCBhbGlnbiBhbmQgZHNlIGJpdHMgKi8KIAogfSBRQ19PVVQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgSU5UIGNoQml0cmF0ZUVsOyAgICAgICAgICAgICAgICAgICAgLyogY2hhbm5lbCBiaXRyYXRlIGluIGVsZW1lbnQgKHRvdGFsYml0cmF0ZSplbF9yZWxhdGl2ZUJpdHMvZWxfY2hhbm5lbHMpICovCi0gIElOVCBtYXhCaXRzRWw7ICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZWQgaW4gY3Jhc2ggcmVjb3ZlcnkgKi8KLSAgSU5UIGJpdFJlc0xldmVsRWw7ICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIGJpdHJlc2Vydm9pciBsZXZlbCBpbiBlYWNoIGNhbGwgb2YgRkRLYWFjRW5jX1FDTWFpbiAqLwotICBJTlQgbWF4Qml0UmVzQml0c0VsOyAgICAgICAgICAgICAgICAvKiBuRWZmQ2hhbm5lbHMqNjE0NCAtIGF2ZXJhZ2VCaXRzSW5GcmFtZSAqLwotICBGSVhQX0RCTCByZWxhdGl2ZUJpdHNFbDsgICAgICAgICAgICAvKiBCaXRzIHJlbGF0aXZlIHRvIHRvdGFsIEJpdHMqLworICBJTlQgY2hCaXRyYXRlRWw7ICAgICAgICAgLyogY2hhbm5lbCBiaXRyYXRlIGluIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b3RhbGJpdHJhdGUqZWxfcmVsYXRpdmVCaXRzL2VsX2NoYW5uZWxzKSAqLworICBJTlQgbWF4Qml0c0VsOyAgICAgICAgICAgLyogdXNlZCBpbiBjcmFzaCByZWNvdmVyeSAqLworICBJTlQgYml0UmVzTGV2ZWxFbDsgICAgICAgLyogdXBkYXRlIGJpdHJlc2Vydm9pciBsZXZlbCBpbiBlYWNoIGNhbGwgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19RQ01haW4gKi8KKyAgSU5UIG1heEJpdFJlc0JpdHNFbDsgICAgIC8qIG5FZmZDaGFubmVscyo2MTQ0IC0gYXZlcmFnZUJpdHNJbkZyYW1lICovCisgIEZJWFBfREJMIHJlbGF0aXZlQml0c0VsOyAvKiBCaXRzIHJlbGF0aXZlIHRvIHRvdGFsIEJpdHMqLwogfSBFTEVNRU5UX0JJVFM7CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIC8qIHRoaXMgaXMgYmFzaWNhbGx5IHN0cnVjdCBRQ19JTklUICovCiAKICAgSU5UIGdsb2JIZHJCaXRzOwotICBJTlQgbWF4Qml0c1BlckZyYW1lOyAgIC8qIG1heGltYWwgYWxsb3dlZCBiaXRzIHBlciBmcmFtZSwgNjE0NCpuQ2hhbm5lbHNFZmYgKi8KLSAgSU5UIG1pbkJpdHNQZXJGcmFtZTsgICAvKiBtaW5pbWFsIGFsbG93ZCBiaXRzIHBlciBmcmFtLCBzdXBlcmZyYW1pbmcgLSBEUk0gKi8KKyAgSU5UIG1heEJpdHNQZXJGcmFtZTsgLyogbWF4aW1hbCBhbGxvd2VkIGJpdHMgcGVyIGZyYW1lLCA2MTQ0Km5DaGFubmVsc0VmZiAqLworICBJTlQgbWluQml0c1BlckZyYW1lOyAvKiBtaW5pbWFsIGFsbG93ZCBiaXRzIHBlciBmcmFtLCBzdXBlcmZyYW1pbmcgLSBEUk0gKi8KICAgSU5UIG5FbGVtZW50czsKICAgUUNEQVRBX0JSX01PREUgYml0cmF0ZU1vZGU7Ci0gIElOVCBiaXREaXN0cmlidXRpb25Nb2RlOyAvKiAwOiBmdWxsIGJpdHJlc2Vydm9pciwgMTogcmVkdWNlZCBiaXRyZXNlcnZvaXIsIDI6IGRpc2FibGVkIGJpdHJlc2Vydm9pciAqLworICBBQUNFTkNfQklUUkVTX01PREUgYml0UmVzTW9kZTsgLyogMDogZnVsbCBiaXRyZXNlcnZvaXIsIDE6IHJlZHVjZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJlc2Vydm9pciwgMjogZGlzYWJsZWQgYml0cmVzZXJ2b2lyICovCiAgIElOVCBiaXRSZXNUb3Q7CiAgIElOVCBiaXRSZXNUb3RNYXg7Ci0gIElOVCBtYXhJdGVyYXRpb25zOyAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgaXRlcmF0aW9ucyBiZWZvcmUgRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkoKSBpcyBhcHBsaWVkLiAqLworICBJTlQgbWF4SXRlcmF0aW9uczsgLyogTWF4aW11bSBudW1iZXIgb2YgYWxsb3dlZCBpdGVyYXRpb25zIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkoKSBpcyBhcHBsaWVkLiAqLwogICBJTlQgaW52UXVhbnQ7CiAKICAgRklYUF9EQkwgdmJyUXVhbEZhY3RvcjsKQEAgLTI2NSwxNiArMjg4LDEyIEBACiAKICAgUEFERElORyBwYWRkaW5nOwogCi0gIEVMRU1FTlRfQklUUyAgKmVsZW1lbnRCaXRzWyg4KV07CisgIEVMRU1FTlRfQklUUyAqZWxlbWVudEJpdHNbKCg4KSldOwogICBCSVRDTlRSX1NUQVRFICpoQml0Q291bnRlcjsKICAgQURKX1RIUl9TVEFURSAqaEFkalRocjsKIAotICBJTlQgZFpvbmVRdWFudEVuYWJsZTsgICAvKiBlbmFibGUgZGVhZCB6b25lIHF1YW50aXplciAqLworICBJTlQgZFpvbmVRdWFudEVuYWJsZTsgLyogZW5hYmxlIGRlYWQgem9uZSBxdWFudGl6ZXIgKi8KIAogfSBRQ19TVEFURTsKIAotI2VuZGlmIC8qIF9RQ19EQVRBX0ggKi8KLQotCi0KLQorI2VuZGlmIC8qIFFDX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9xY19tYWluLmNwcCBiL2xpYkFBQ2VuYy9zcmMvcWNfbWFpbi5jcHAKaW5kZXggOWNkNzNmNi4uYmEzYmM3ZSAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9xY19tYWluLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL3FjX21haW4uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBRdWFudGl6aW5nICYgY29kaW5nCisgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBRdWFudGl6aW5nICYgY29kaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJxY19tYWluLmgiCiAjaW5jbHVkZSAicXVhbnRpemUuaCIKQEAgLTEwMCw2ICsxMTIsNyBAQAogCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAorI2RlZmluZSBBQUNFTkNfRFpRX0JSX1RIUiAzMjAwMCAvKiBEZWFkIHpvbmUgcXVhbnRpemVyIGJpdHJhdGUgdGhyZXNob2xkICovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgUUNEQVRBX0JSX01PREUgYml0cmF0ZU1vZGU7CkBAIC0xMDcsNjIgKzEyMCw1NyBAQAogfSBUQUJfVkJSX1FVQUxfRkFDVE9SOwogCiBzdGF0aWMgY29uc3QgVEFCX1ZCUl9RVUFMX0ZBQ1RPUiB0YWJsZVZiclF1YWxGYWN0b3JbXSA9IHsKLSAge1FDREFUQV9CUl9NT0RFX1ZCUl8xLCBGTDJGWENPTlNUX0RCTCgwLjE2MGYpfSwgLyogMzIga2JwcyBtb25vICAgQUFDLUxDICsgU0JSICsgUFMgKi8KLSAge1FDREFUQV9CUl9NT0RFX1ZCUl8yLCBGTDJGWENPTlNUX0RCTCgwLjE0OGYpfSwgLyogNjQga2JwcyBzdGVyZW8gQUFDLUxDICsgU0JSICAgICAgKi8KLSAge1FDREFUQV9CUl9NT0RFX1ZCUl8zLCBGTDJGWENPTlNUX0RCTCgwLjEzNWYpfSwgLyogODAgLSA5NiBrYnBzIHN0ZXJlbyBBQUMtTEMgICAgICAgKi8KLSAge1FDREFUQV9CUl9NT0RFX1ZCUl80LCBGTDJGWENPTlNUX0RCTCgwLjExMWYpfSwgLyogMTI4IGticHMgc3RlcmVvIEFBQy1MQyAgICAgICAgICAgKi8KLSAge1FDREFUQV9CUl9NT0RFX1ZCUl81LCBGTDJGWENPTlNUX0RCTCgwLjA3MGYpfSAgLyogMTkyIGticHMgc3RlcmVvIEFBQy1MQyAgICAgICAgICAgKi8KKyAgICB7UUNEQVRBX0JSX01PREVfVkJSXzEsCisgICAgIEZMMkZYQ09OU1RfREJMKDAuMTYwZil9LCAvKiBBcHByb3guIDMyIC0gIDQ4IChBQy1MQyksICAzMiAtICA1NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFBQy1MRC9FTEQpIGticHMvY2hhbm5lbCAqLworICAgIHtRQ0RBVEFfQlJfTU9ERV9WQlJfMiwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC4xNDhmKX0sIC8qIEFwcHJveC4gNDAgLSAgNTYgKEFDLUxDKSwgIDQwIC0gIDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUFDLUxEL0VMRCkga2Jwcy9jaGFubmVsICovCisgICAge1FDREFUQV9CUl9NT0RFX1ZCUl8zLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjEzNWYpfSwgLyogQXBwcm94LiA0OCAtICA2NCAoQUMtTEMpLCAgNDggLSAgNzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBQUMtTEQvRUxEKSBrYnBzL2NoYW5uZWwgKi8KKyAgICB7UUNEQVRBX0JSX01PREVfVkJSXzQsCisgICAgIEZMMkZYQ09OU1RfREJMKDAuMTExZil9LCAvKiBBcHByb3guIDY0IC0gIDgwIChBQy1MQyksICA2NCAtICA4OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFBQy1MRC9FTEQpIGticHMvY2hhbm5lbCAqLworICAgIHtRQ0RBVEFfQlJfTU9ERV9WQlJfNSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC4wNzBmKX0gLyogQXBwcm94LiA5NiAtIDEyMCAoQUMtTEMpLCAxMTIgLSAxNDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFBQy1MRC9FTEQpIGticHMvY2hhbm5lbCAqLwogfTsKIAotc3RhdGljIElOVCBpc0NvbnN0YW50Qml0cmF0ZU1vZGUoCi0gICAgICAgIGNvbnN0IFFDREFUQV9CUl9NT0RFIGJpdHJhdGVNb2RlCi0gICAgICAgICkKLXsKLSAgcmV0dXJuICggKChiaXRyYXRlTW9kZT09UUNEQVRBX0JSX01PREVfQ0JSKSB8fCAoYml0cmF0ZU1vZGU9PVFDREFUQV9CUl9NT0RFX1NGUikgfHwgKGJpdHJhdGVNb2RlPT1RQ0RBVEFfQlJfTU9ERV9GRikpID8gMSA6IDAgKTsKK3N0YXRpYyBJTlQgaXNDb25zdGFudEJpdHJhdGVNb2RlKGNvbnN0IFFDREFUQV9CUl9NT0RFIGJpdHJhdGVNb2RlKSB7CisgIHJldHVybiAoKChiaXRyYXRlTW9kZSA9PSBRQ0RBVEFfQlJfTU9ERV9DQlIpIHx8CisgICAgICAgICAgIChiaXRyYXRlTW9kZSA9PSBRQ0RBVEFfQlJfTU9ERV9TRlIpIHx8CisgICAgICAgICAgIChiaXRyYXRlTW9kZSA9PSBRQ0RBVEFfQlJfTU9ERV9GRikpCisgICAgICAgICAgICAgID8gMQorICAgICAgICAgICAgICA6IDApOwogfQogCi0KLQotdHlwZWRlZiBlbnVtewotICAgIEZSQU1FX0xFTl9CWVRFU19NT0RVTE8gPSAgMSwKLSAgICBGUkFNRV9MRU5fQllURVNfSU5UICAgID0gIDIKLX1GUkFNRV9MRU5fUkVTVUxUX01PREU7Cit0eXBlZGVmIGVudW0geworICBGUkFNRV9MRU5fQllURVNfTU9EVUxPID0gMSwKKyAgRlJBTUVfTEVOX0JZVEVTX0lOVCA9IDIKK30gRlJBTUVfTEVOX1JFU1VMVF9NT0RFOwogCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwogCi1zdGF0aWMgSU5UIEZES2FhY0VuY19jYWxjTWF4VmFsdWVJblNmYihJTlQgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAqUkVTVFJJQ1Qgc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqUkVTVFJJQ1QgcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqUkVTVFJJQ1QgbWF4VmFsdWUpOworc3RhdGljIElOVCBGREthYWNFbmNfY2FsY01heFZhbHVlSW5TZmIoSU5UIHNmYkNudCwgSU5UIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNmYlBlckdyb3VwLCBJTlQqIFJFU1RSSUNUIHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUKiBSRVNUUklDVCBxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCogUkVTVFJJQ1QgbWF4VmFsdWUpOwogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfY3Jhc2hSZWNvdmVyeShJTlQgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogICAgICAgICAgIHFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCAgICpxY0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIGJpdHNUb1NhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgIGVwQ29uZmlnKTsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jcmFzaFJlY292ZXJ5KElOVCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqIHFjT3V0LCBRQ19PVVRfRUxFTUVOVCogcWNFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHNUb1NhdmUsIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc3ludGF4RmxhZ3MsIFNDSEFSIGVwQ29uZmlnKTsKIAotc3RhdGljCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcmVkdWNlQml0Q29uc3VtcHRpb24oaW50KiAgICAgICAgICAgICBpdGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICBtYXhJdGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBnYWluQWRqdXN0bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICAgY2FsY3VsYXRlUXVhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogICAgICAgICAgcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogIHFjT3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfQklUUyogICAgZWxCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgIGVwQ29uZmlnKTsKK3N0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcmVkdWNlQml0Q29uc3VtcHRpb24oCisgICAgaW50KiBpdGVyYXRpb25zLCBjb25zdCBpbnQgbWF4SXRlcmF0aW9ucywgaW50IGdhaW5BZGp1c3RtZW50LAorICAgIGludCogY2hDb25zdHJhaW50c0Z1bGZpbGxlZCwgaW50KiBjYWxjdWxhdGVRdWFudCwgaW50IG5DaGFubmVscywKKyAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsIFFDX09VVCogcWNPdXQsIFFDX09VVF9FTEVNRU5UKiBxY091dEVsZW1lbnQsCisgICAgRUxFTUVOVF9CSVRTKiBlbEJpdHMsIEFVRElPX09CSkVDVF9UWVBFIGFvdCwgVUlOVCBzeW50YXhGbGFncywKKyAgICBTQ0hBUiBlcENvbmZpZyk7CiAKLQotdm9pZCAgRkRLYWFjRW5jX1FDQ2xvc2UgKFFDX1NUQVRFICAqKnBoUUNzdGF0ZSwgUUNfT1VUICoqcGhRQyk7Cit2b2lkIEZES2FhY0VuY19RQ0Nsb3NlKFFDX1NUQVRFKiogcGhRQ3N0YXRlLCBRQ19PVVQqKiBwaFFDKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKQEAgLTE3MywyNSArMTgxLDIyIEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2NhbGNGcmFtZUxlbihJTlQgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5fUkVTVUxUX01PREUgbW9kZSkKLXsKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2NhbGNGcmFtZUxlbihJTlQgYml0UmF0ZSwgSU5UIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOX1JFU1VMVF9NT0RFIG1vZGUpIHsKKyAgSU5UIHJlc3VsdDsKIAotICAgSU5UIHJlc3VsdDsKKyAgcmVzdWx0ID0gKChncmFudWxlTGVuZ3RoKSA+PiAzKSAqIChiaXRSYXRlKTsKIAotICAgcmVzdWx0ID0gKChncmFudWxlTGVuZ3RoKT4+MykqKGJpdFJhdGUpOwotCi0gICBzd2l0Y2gobW9kZSkgewotICAgICBjYXNlIEZSQU1FX0xFTl9CWVRFU19NT0RVTE86Ci0gICAgICAgICByZXN1bHQgJT0gc2FtcGxlUmF0ZTsKLSAgICAgYnJlYWs7Ci0gICAgIGNhc2UgRlJBTUVfTEVOX0JZVEVTX0lOVDoKLSAgICAgICAgIHJlc3VsdCAvPSBzYW1wbGVSYXRlOwotICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybihyZXN1bHQpOworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEZSQU1FX0xFTl9CWVRFU19NT0RVTE86CisgICAgICByZXN1bHQgJT0gc2FtcGxlUmF0ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlJBTUVfTEVOX0JZVEVTX0lOVDoKKyAgICAgIHJlc3VsdCAvPSBzYW1wbGVSYXRlOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIChyZXN1bHQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIwMywzMSArMjA4LDI1IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2ZyYW1lUGFkZGluZyhJTlQgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBhZGRpbmdSZXN0KQoteworc3RhdGljIElOVCBGREthYWNFbmNfZnJhbWVQYWRkaW5nKElOVCBiaXRSYXRlLCBJTlQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCwgSU5UKiBwYWRkaW5nUmVzdCkgewogICBJTlQgcGFkZGluZ09uOwogICBJTlQgZGlmZmVyZW5jZTsKIAogICBwYWRkaW5nT24gPSAwOwogCi0gIGRpZmZlcmVuY2UgPSBGREthYWNFbmNfY2FsY0ZyYW1lTGVuKCBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5fQllURVNfTU9EVUxPICk7Ci0gICpwYWRkaW5nUmVzdC09ZGlmZmVyZW5jZTsKKyAgZGlmZmVyZW5jZSA9IEZES2FhY0VuY19jYWxjRnJhbWVMZW4oYml0UmF0ZSwgc2FtcGxlUmF0ZSwgZ3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOX0JZVEVTX01PRFVMTyk7CisgICpwYWRkaW5nUmVzdCAtPSBkaWZmZXJlbmNlOwogCi0gIGlmICgqcGFkZGluZ1Jlc3QgPD0gMCApIHsKKyAgaWYgKCpwYWRkaW5nUmVzdCA8PSAwKSB7CiAgICAgcGFkZGluZ09uID0gMTsKICAgICAqcGFkZGluZ1Jlc3QgKz0gc2FtcGxlUmF0ZTsKICAgfQogCi0gIHJldHVybiggcGFkZGluZ09uICk7CisgIHJldHVybiAocGFkZGluZ09uKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1FDT3V0TmV3CkBAIC0yMzUsNDggKzIzNCw1MCBAQAogICAgICAgICAgcmV0dXJuOgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDT3V0TmV3KFFDX09VVCAgICAqKnBoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBuU3ViRnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIgICAgICAqZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ091dE5ldyhRQ19PVVQqKiBwaFFDLCBjb25zdCBJTlQgbkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsIGNvbnN0IElOVCBuU3ViRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBkeW5hbWljX1JBTSkgewogICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKICAgaW50IG4sIGk7CiAgIGludCBlbEluYyA9IDAsIGNoSW5jID0gMDsKIAotICBmb3IgKG49MDsgbjxuU3ViRnJhbWVzOyBuKyspIHsKKyAgZm9yIChuID0gMDsgbiA8IG5TdWJGcmFtZXM7IG4rKykgewogICAgIHBoUUNbbl0gPSBHZXRSYW1fYWFjRW5jX1FDb3V0KG4pOwogICAgIGlmIChwaFFDW25dID09IE5VTEwpIHsKICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CiAgICAgICBnb3RvIFFDT3V0TmV3X2JhaWw7CiAgICAgfQogCi0gICAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkNoYW5uZWxzOyBpKyspIHsKICAgICAgIHBoUUNbbl0tPnBRY091dENoYW5uZWxzW2ldID0gR2V0UmFtX2FhY0VuY19RQ2NoYW5uZWwoY2hJbmMsIGR5bmFtaWNfUkFNKTsKLSAgICAgIGlmICggcGhRQ1tuXS0+cFFjT3V0Q2hhbm5lbHNbaV0gPT0gTlVMTAotICAgICAgICAgKQotICAgICAgewotICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKLSAgICAgICAgIGdvdG8gUUNPdXROZXdfYmFpbDsKKyAgICAgIGlmIChwaFFDW25dLT5wUWNPdXRDaGFubmVsc1tpXSA9PSBOVUxMKSB7CisgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgICAgIGdvdG8gUUNPdXROZXdfYmFpbDsKICAgICAgIH0KKwogICAgICAgY2hJbmMrKzsKICAgICB9IC8qIG5DaGFubmVscyAqLwogCi0gICAgZm9yIChpPTA7IGk8bkVsZW1lbnRzOyBpKyspIHsKLSAgICAgIHBoUUNbbl0tPnFjRWxlbWVudFtpXSAgICAgID0gR2V0UmFtX2FhY0VuY19RQ2VsZW1lbnQoZWxJbmMpOwotICAgICAgaWYgKHBoUUNbbl0tPnFjRWxlbWVudFtpXSA9PSBOVUxMKQotICAgICAgeworICAgIGZvciAoaSA9IDA7IGkgPCBuRWxlbWVudHM7IGkrKykgeworICAgICAgcGhRQ1tuXS0+cWNFbGVtZW50W2ldID0gR2V0UmFtX2FhY0VuY19RQ2VsZW1lbnQoZWxJbmMpOworICAgICAgaWYgKHBoUUNbbl0tPnFjRWxlbWVudFtpXSA9PSBOVUxMKSB7CiAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CiAgICAgICAgIGdvdG8gUUNPdXROZXdfYmFpbDsKICAgICAgIH0KICAgICAgIGVsSW5jKys7CisKKyAgICAgIC8qIGluaXRpYWxpemUgcG9pbnRlciB0byBkeW5hbWljIGJ1ZmZlciB3aGljaCBhcmUgdXNlZCBpbiBhZGp1c3QKKyAgICAgICAqIHRocmVzaG9sZHMgKi8KKyAgICAgIHBoUUNbbl0tPnFjRWxlbWVudFtpXS0+ZHluTWVtX0FoX0ZsYWcgPSBkeW5hbWljX1JBTSArIChQX0JVRl8xKTsKKyAgICAgIHBoUUNbbl0tPnFjRWxlbWVudFtpXS0+ZHluTWVtX1Rocl9FeHAgPQorICAgICAgICAgIGR5bmFtaWNfUkFNICsgKFBfQlVGXzEpICsgQURKX1RIUl9BSF9GTEFHX1NJWkU7CisgICAgICBwaFFDW25dLT5xY0VsZW1lbnRbaV0tPmR5bk1lbV9TZmJOQWN0aXZlTGluZXNMZERhdGEgPQorICAgICAgICAgIGR5bmFtaWNfUkFNICsgKFBfQlVGXzEpICsgQURKX1RIUl9BSF9GTEFHX1NJWkUgKyBBREpfVEhSX1RIUl9FWFBfU0laRTsKKwogICAgIH0gLyogbkVsZW1lbnRzICovCiAKICAgfSAvKiBuU3ViRnJhbWVzICovCiAKLQogICByZXR1cm4gQUFDX0VOQ19PSzsKIAogUUNPdXROZXdfYmFpbDoKQEAgLTI5MCwyMSArMjkxLDIwIEBACiAgICAgICAgICByZXR1cm46CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNPdXRJbml0KFFDX09VVCAgICAgICAgICAqcGhRQ1soMSldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5TdWJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY20pCi17Ci0gIElOVCBuLGksY2g7CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNPdXRJbml0KFFDX09VVCogcGhRQ1soMSldLCBjb25zdCBJTlQgblN1YkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9NQVBQSU5HKiBjbSkgeworICBJTlQgbiwgaSwgY2g7CiAKLSAgZm9yIChuPTA7IG48blN1YkZyYW1lczsgbisrKSB7CisgIGZvciAobiA9IDA7IG4gPCBuU3ViRnJhbWVzOyBuKyspIHsKICAgICBJTlQgY2hJbmMgPSAwOwotICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgewotICAgICAgZm9yIChjaD0wOyBjaDxjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWw7IGNoKyspIHsKLSAgICAgICAgcGhRQ1tuXS0+cWNFbGVtZW50W2ldLT5xY091dENoYW5uZWxbY2hdID0gcGhRQ1tuXS0+cFFjT3V0Q2hhbm5lbHNbY2hJbmNdOworICAgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICBwaFFDW25dLT5xY0VsZW1lbnRbaV0tPnFjT3V0Q2hhbm5lbFtjaF0gPQorICAgICAgICAgICAgcGhRQ1tuXS0+cFFjT3V0Q2hhbm5lbHNbY2hJbmNdOwogICAgICAgICBjaEluYysrOwogICAgICAgfSAvKiBjaEluRWwgKi8KLSAgICB9IC8qIG5FbGVtZW50cyAqLwotICB9IC8qIG5TdWJGcmFtZXMgKi8KKyAgICB9ICAgLyogbkVsZW1lbnRzICovCisgIH0gICAgIC8qIG5TdWJGcmFtZXMgKi8KIAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KQEAgLTMxNiwxMSArMzE2LDggQEAKICAgICAgICAgIHJldHVybjoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ05ldyhRQ19TVEFURSAgKipwaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG5FbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSKiAgICAgIGR5bmFtaWNfUkFNCi0gICAgICAgICAgICkKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ05ldyhRQ19TVEFURSoqIHBoUUMsIElOVCBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIGR5bmFtaWNfUkFNKSB7CiAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwogICBpbnQgaTsKIApAQCAtMzQxLDcgKzMzOCw3IEBACiAgICAgZ290byBRQ05ld19iYWlsOwogICB9CiAKLSAgZm9yIChpPTA7IGk8bkVsZW1lbnRzOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IG5FbGVtZW50czsgaSsrKSB7CiAgICAgaFFDLT5lbGVtZW50Qml0c1tpXSA9IEdldFJhbV9hYWNFbmNfRWxlbWVudEJpdHMoaSk7CiAgICAgaWYgKGhRQy0+ZWxlbWVudEJpdHNbaV0gPT0gTlVMTCkgewogICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKQEAgLTM2Myw1MiArMzYwLDYwIEBACiAgICAgICAgICByZXR1cm46CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNJbml0KFFDX1NUQVRFICpoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBRQ19JTklUICppbml0KQoteworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDSW5pdChRQ19TVEFURSogaFFDLCBzdHJ1Y3QgUUNfSU5JVCogaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUxPTkcgaW5pdEZsYWdzKSB7CisgIEFBQ19FTkNPREVSX0VSUk9SIGVyciA9IEFBQ19FTkNfT0s7CisKICAgaW50IGk7CiAgIGhRQy0+bWF4Qml0c1BlckZyYW1lID0gaW5pdC0+bWF4Qml0czsKICAgaFFDLT5taW5CaXRzUGVyRnJhbWUgPSBpbml0LT5taW5CaXRzOwotICBoUUMtPm5FbGVtZW50cyAgICAgICA9IGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHM7Ci0gIGhRQy0+Yml0UmVzVG90TWF4ICAgID0gaW5pdC0+Yml0UmVzOwotICBoUUMtPmJpdFJlc1RvdCAgICAgICA9IGluaXQtPmJpdFJlczsKLSAgaFFDLT5tYXhCaXRGYWMgICAgICAgPSBpbml0LT5tYXhCaXRGYWM7Ci0gIGhRQy0+Yml0cmF0ZU1vZGUgICAgID0gaW5pdC0+Yml0cmF0ZU1vZGU7Ci0gIGhRQy0+aW52UXVhbnQgICAgICAgID0gaW5pdC0+aW52UXVhbnQ7Ci0gIGhRQy0+bWF4SXRlcmF0aW9ucyAgID0gaW5pdC0+bWF4SXRlcmF0aW9uczsKLQotICBpZiAoIGlzQ29uc3RhbnRCaXRyYXRlTW9kZShoUUMtPmJpdHJhdGVNb2RlKSApIHsKLSAgICBJTlQgYml0cmVzUGVyQ2hhbm5lbCA9IChoUUMtPmJpdFJlc1RvdE1heCAvIGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYpOwotICAgIC8qIDA6IGZ1bGwgYml0cmVzZXJ2b2lyLCAxOiByZWR1Y2VkIGJpdHJlc2Vydm9pciwgMjogZGlzYWJsZWQgYml0cmVzZXJ2b2lyICovCi0gICAgaFFDLT5iaXREaXN0cmlidXRpb25Nb2RlID0gKGJpdHJlc1BlckNoYW5uZWw+QklUUkVTX01JTl9MRCkgPyAwIDogKGJpdHJlc1BlckNoYW5uZWw+MCkgPyAxIDogMjsKKyAgaFFDLT5uRWxlbWVudHMgPSBpbml0LT5jaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzOworICBpZiAoKGluaXRGbGFncyAhPSAwKSB8fCAoKGluaXQtPmJpdHJhdGVNb2RlICE9IFFDREFUQV9CUl9NT0RFX0ZGKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhRQy0+Yml0UmVzVG90TWF4ICE9IGluaXQtPmJpdFJlcykpKSB7CisgICAgaFFDLT5iaXRSZXNUb3QgPSBpbml0LT5iaXRSZXM7CiAgIH0KLSAgZWxzZSB7Ci0gICAgaFFDLT5iaXREaXN0cmlidXRpb25Nb2RlID0gMDsgLyogZnVsbCBiaXRyZXNlcnZvaXIgKi8KLSAgfQorICBoUUMtPmJpdFJlc1RvdE1heCA9IGluaXQtPmJpdFJlczsKKyAgaFFDLT5tYXhCaXRGYWMgPSBpbml0LT5tYXhCaXRGYWM7CisgIGhRQy0+Yml0cmF0ZU1vZGUgPSBpbml0LT5iaXRyYXRlTW9kZTsKKyAgaFFDLT5pbnZRdWFudCA9IGluaXQtPmludlF1YW50OworICBoUUMtPm1heEl0ZXJhdGlvbnMgPSBpbml0LT5tYXhJdGVyYXRpb25zOwogCisgIGlmIChpc0NvbnN0YW50Qml0cmF0ZU1vZGUoaFFDLT5iaXRyYXRlTW9kZSkpIHsKKyAgICAvKiAwOiBmdWxsIGJpdHJlc2Vydm9pciwgMTogcmVkdWNlZCBiaXRyZXNlcnZvaXIsIDI6IGRpc2FibGVkIGJpdHJlc2Vydm9pcgorICAgICAqLworICAgIGhRQy0+Yml0UmVzTW9kZSA9IGluaXQtPmJpdFJlc01vZGU7CisgIH0gZWxzZSB7CisgICAgaFFDLT5iaXRSZXNNb2RlID0gQUFDRU5DX0JSX01PREVfRlVMTDsgLyogZnVsbCBiaXRyZXNlcnZvaXIgKi8KKyAgfQogCiAgIGhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCA9IGluaXQtPnBhZGRpbmcucGFkZGluZ1Jlc3Q7CiAKICAgaFFDLT5nbG9iSGRyQml0cyA9IGluaXQtPnN0YXRpY0JpdHM7IC8qIEJpdCBvdmVyaGVhZCBkdWUgdG8gdHJhbnNwb3J0ICovCiAKLSAgRkRLYWFjRW5jX0luaXRFbGVtZW50Qml0cyhoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC0+Y2hhbm5lbE1hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC0+Yml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5pdC0+YXZlcmFnZUJpdHMvaW5pdC0+blN1YkZyYW1lcykgLSBoUUMtPmdsb2JIZHJCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+bWF4Qml0c1BlckZyYW1lL2luaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYpOworICBlcnIgPSBGREthYWNFbmNfSW5pdEVsZW1lbnRCaXRzKAorICAgICAgaFFDLCBpbml0LT5jaGFubmVsTWFwcGluZywgaW5pdC0+Yml0cmF0ZSwKKyAgICAgIChpbml0LT5hdmVyYWdlQml0cyAvIGluaXQtPm5TdWJGcmFtZXMpIC0gaFFDLT5nbG9iSGRyQml0cywKKyAgICAgIGhRQy0+bWF4Qml0c1BlckZyYW1lIC8gaW5pdC0+Y2hhbm5lbE1hcHBpbmctPm5DaGFubmVsc0VmZik7CisgIGlmIChlcnIgIT0gQUFDX0VOQ19PSykgZ290byBiYWlsOwogCiAgIGhRQy0+dmJyUXVhbEZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gIGZvciAoaT0wOyBpPChpbnQpKHNpemVvZih0YWJsZVZiclF1YWxGYWN0b3IpL3NpemVvZihUQUJfVkJSX1FVQUxfRkFDVE9SKSk7IGkrKykgewotICAgIGlmIChoUUMtPmJpdHJhdGVNb2RlPT10YWJsZVZiclF1YWxGYWN0b3JbaV0uYml0cmF0ZU1vZGUpIHsKKyAgZm9yIChpID0gMDsKKyAgICAgICBpIDwgKGludCkoc2l6ZW9mKHRhYmxlVmJyUXVhbEZhY3RvcikgLyBzaXplb2YoVEFCX1ZCUl9RVUFMX0ZBQ1RPUikpOworICAgICAgIGkrKykgeworICAgIGlmIChoUUMtPmJpdHJhdGVNb2RlID09IHRhYmxlVmJyUXVhbEZhY3RvcltpXS5iaXRyYXRlTW9kZSkgewogICAgICAgaFFDLT52YnJRdWFsRmFjdG9yID0gKEZJWFBfREJMKXRhYmxlVmJyUXVhbEZhY3RvcltpXS52YnJRdWFsRmFjdG9yOwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKICAgaWYgKGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYgPT0gMSAmJgotICAgICAoaW5pdC0+Yml0cmF0ZSAvIGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYpIDwgMzIwMDAgJiYKLSAgICAgaW5pdC0+YWR2YW5jZWRCaXRzVG9QZSAhPSAwCi0gICAgICkKKyAgICAgIChpbml0LT5iaXRyYXRlIC8gaW5pdC0+Y2hhbm5lbE1hcHBpbmctPm5DaGFubmVsc0VmZikgPAorICAgICAgICAgIEFBQ0VOQ19EWlFfQlJfVEhSICYmCisgICAgICBpbml0LT5pc0xvd0RlbGF5ICE9CisgICAgICAgICAgMCkgLyogd2F0Y2ggb3V0IGhlcmU6IGluaXQtPmJpdHJhdGUgaXMgdGhlIGJpdHJhdGUgIm1pbnVzIiB0aGUKKyAgICAgICAgICAgICAgICBzdGFuZGFyZCBTQlIgYml0cmF0ZSAoPTI1MDBrYnBzKSAtLT4gZm9yIHRoZSBGREsgdGhlIE9GRlNURQorICAgICAgICAgICAgICAgIHR1bmluZyBzaG91bGQgc3RhcnQgc29tZXdoZXJlIGJlbG93IDMyMDAwa2Jwcy0yNTAwa2JwcyAuLi4gc28KKyAgICAgICAgICAgICAgICBldmVyeXRoaW5nIGlzIGZpbmUgaGVyZSAqLwogICB7CiAgICAgaFFDLT5kWm9uZVF1YW50RW5hYmxlID0gMTsKICAgfSBlbHNlIHsKQEAgLTQxNiwyMyArNDIxLDIwIEBACiAgIH0KIAogICBGREthYWNFbmNfQWRqVGhySW5pdCgKLSAgICAgICAgaFFDLT5oQWRqVGhyLAotICAgICAgICBpbml0LT5tZWFuUGUsCi0gICAgICAgIGhRQy0+ZWxlbWVudEJpdHMsICAgICAgICAgICAgICAgICAvKiBvciBjaGFubmVsQml0cmF0ZXMsIHdhczogY2hhbm5lbEJpdHJhdGUgKi8KLSAgICAgICAgaFFDLT5pbnZRdWFudCwKLSAgICAgICAgaW5pdC0+Y2hhbm5lbE1hcHBpbmctPm5FbGVtZW50cywKLSAgICAgICAgaW5pdC0+Y2hhbm5lbE1hcHBpbmctPm5DaGFubmVsc0VmZiwKLSAgICAgICAgaW5pdC0+c2FtcGxlUmF0ZSwgICAgICAgICAgICAgICAgIC8qIG91dHB1dCBzYW1wbGUgcmF0ZSAqLwotICAgICAgICBpbml0LT5hZHZhbmNlZEJpdHNUb1BlLCAgICAgICAgICAgLyogaWYgc2V0LCBjYWxjIGJpdHMyUEUgZmFjdG9yIGRlcGVuZGluZyBvbiBzYW1wbGVyYXRlICovCi0gICAgICAgIGhRQy0+dmJyUXVhbEZhY3RvciwKLSAgICAgICAgaFFDLT5kWm9uZVF1YW50RW5hYmxlCi0gICAgICAgICk7CisgICAgICBoUUMtPmhBZGpUaHIsIGluaXQtPm1lYW5QZSwgaFFDLT5pbnZRdWFudCwgaW5pdC0+Y2hhbm5lbE1hcHBpbmcsCisgICAgICBpbml0LT5zYW1wbGVSYXRlLCAvKiBvdXRwdXQgc2FtcGxlIHJhdGUgKi8KKyAgICAgIGluaXQtPmJpdHJhdGUsICAgIC8qIHRvdGFsIGJpdHJhdGUgKi8KKyAgICAgIGluaXQtPmlzTG93RGVsYXksIC8qIGlmIHNldCwgY2FsYyBiaXRzMlBFIGZhY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHNhbXBsZXJhdGUgKi8KKyAgICAgIGluaXQtPmJpdFJlc01vZGUgIC8qIGZvciBhIHNtYWxsIGJpdHJlc2Vydm9pciwgdGhlIHBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0aW9uIGlzIGNhbGMnZCBkaWZmZXJlbnRseSAqLworICAgICAgLAorICAgICAgaFFDLT5kWm9uZVF1YW50RW5hYmxlLCBpbml0LT5iaXREaXN0cmlidXRpb25Nb2RlLCBoUUMtPnZiclF1YWxGYWN0b3IpOwogCi0gIHJldHVybiBBQUNfRU5DX09LOworYmFpbDoKKyAgcmV0dXJuIGVycjsKIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUUNNYWluUHJlcGFyZQpAQCAtNDQwLDMzICs0NDIsMjggQEAKICAgICAgICAgIHJldHVybjoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ01haW5QcmVwYXJlKEVMRU1FTlRfSU5GTyAgICAgICAgICAgICAgKmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBSRVNUUklDVCAgICAgIGFkalRoclN0YXRlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogUkVTVFJJQ1QgIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogUkVTVFJJQ1QgICBxY091dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICAgICAgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ01haW5QcmVwYXJlKAorICAgIEVMRU1FTlRfSU5GTyogZWxJbmZvLCBBVFNfRUxFTUVOVCogUkVTVFJJQ1QgYWRqVGhyU3RhdGVFbGVtZW50LAorICAgIFBTWV9PVVRfRUxFTUVOVCogUkVTVFJJQ1QgcHN5T3V0RWxlbWVudCwKKyAgICBRQ19PVVRfRUxFTUVOVCogUkVTVFJJQ1QgcWNPdXRFbGVtZW50LCBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCisgICAgVUlOVCBzeW50YXhGbGFncywgU0NIQVIgZXBDb25maWcpIHsKICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX09LOwotICBJTlQgIG5DaGFubmVscyA9IGVsSW5mby0+bkNoYW5uZWxzSW5FbDsKKyAgSU5UIG5DaGFubmVscyA9IGVsSW5mby0+bkNoYW5uZWxzSW5FbDsKIAotICBQU1lfT1VUX0NIQU5ORUwqKiBSRVNUUklDVCBwc3lPdXRDaGFubmVsID0gcHN5T3V0RWxlbWVudC0+cHN5T3V0Q2hhbm5lbDsgICAgLyogbWF5IGJlIG1vZGlmaWVkIGluLXBsYWNlICovCisgIFBTWV9PVVRfQ0hBTk5FTCoqIFJFU1RSSUNUIHBzeU91dENoYW5uZWwgPQorICAgICAgcHN5T3V0RWxlbWVudC0+cHN5T3V0Q2hhbm5lbDsgLyogbWF5IGJlIG1vZGlmaWVkIGluLXBsYWNlICovCiAKLSAgRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yKHFjT3V0RWxlbWVudC0+cWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOworICBGREthYWNFbmNfQ2FsY0Zvcm1GYWN0b3IocWNPdXRFbGVtZW50LT5xY091dENoYW5uZWwsIHBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMpOwogCiAgIC8qIHByZXBhcmUgYW5kIGNhbGN1bGF0ZSBQRSB3aXRob3V0IHJlZHVjdGlvbiAqLwotICBGREthYWNFbmNfcGVDYWxjdWxhdGlvbigmcWNPdXRFbGVtZW50LT5wZURhdGEsIHBzeU91dENoYW5uZWwsIHFjT3V0RWxlbWVudC0+cWNPdXRDaGFubmVsLCAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLCBhZGpUaHJTdGF0ZUVsZW1lbnQsIG5DaGFubmVscyk7CisgIEZES2FhY0VuY19wZUNhbGN1bGF0aW9uKCZxY091dEVsZW1lbnQtPnBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRFbGVtZW50LT5xY091dENoYW5uZWwsICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFkalRoclN0YXRlRWxlbWVudCwgbkNoYW5uZWxzKTsKIAotICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKCBOVUxMLCBlbEluZm8sIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPnBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7CisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0NoYW5uZWxFbGVtZW50V3JpdGUoCisgICAgICBOVUxMLCBlbEluZm8sIE5VTEwsIHBzeU91dEVsZW1lbnQsIHBzeU91dEVsZW1lbnQtPnBzeU91dENoYW5uZWwsCisgICAgICBzeW50YXhGbGFncywgYW90LCBlcENvbmZpZywgJnFjT3V0RWxlbWVudC0+c3RhdGljQml0c1VzZWQsIDApOwogCiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KQEAgLTQ3NCw1NyArNDcxLDkwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkanVzdEJpdHJhdGUKLSAgICAgICAgIGRlc2NyaXB0aW9uOiAgYWRqdXN0cyBmcmFtZWxlbmd0aCB2aWEgcGFkZGluZyBvbiBhIGZyYW1lIHRvIGZyYW1lIGJhc2lzLAotICAgICAgICAgICAgICAgICAgICAgICB0byBhY2hpZXZlIGEgYml0cmF0ZSB0aGF0IGRlbWFuZHMgYSBub24gYnl0ZSBhbGlnbmVkCi0gICAgICAgICAgICAgICAgICAgICAgIGZyYW1lbGVuZ3RoCi0gICAgICAgICByZXR1cm46ICAgICAgIGVycm9yY29kZQorICAgICAgICAgZGVzY3JpcHRpb246ICBhZGp1c3RzIGZyYW1lbGVuZ3RoIHZpYSBwYWRkaW5nIG9uIGEgZnJhbWUgdG8gZnJhbWUKK2Jhc2lzLCB0byBhY2hpZXZlIGEgYml0cmF0ZSB0aGF0IGRlbWFuZHMgYSBub24gYnl0ZSBhbGlnbmVkIGZyYW1lbGVuZ3RoIHJldHVybjoKK2Vycm9yY29kZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0FkanVzdEJpdHJhdGUoUUNfU1RBVEUgICAgICAgICpSRVNUUklDVCBoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKlJFU1RSSUNUIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICphdmdUb3RhbEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgIGJpdFJhdGUsICAgICAgIC8qIHRvdGFsIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgICAgLyogb3V0cHV0IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgZ3JhbnVsZUxlbmd0aCkgLyogZnJhbWUgbGVuZ3RoICovCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfQWRqdXN0Qml0cmF0ZSgKKyAgICBRQ19TVEFURSogUkVTVFJJQ1QgaFFDLCBDSEFOTkVMX01BUFBJTkcqIFJFU1RSSUNUIGNtLCBJTlQqIGF2Z1RvdGFsQml0cywKKyAgICBJTlQgYml0UmF0ZSwgICAgICAgLyogdG90YWwgYml0cmF0ZSAqLworICAgIElOVCBzYW1wbGVSYXRlLCAgICAvKiBvdXRwdXQgc2FtcGxpbmcgcmF0ZSAqLworICAgIElOVCBncmFudWxlTGVuZ3RoKSAvKiBmcmFtZSBsZW5ndGggKi8KIHsKICAgSU5UIHBhZGRpbmdPbjsKICAgSU5UIGZyYW1lTGVuOwogCiAgIC8qIERvIHdlIG5lZWQgYW4gZXh0cmEgcGFkZGluZyBieXRlPyAqLwotICBwYWRkaW5nT24gPSBGREthYWNFbmNfZnJhbWVQYWRkaW5nKGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCk7CisgIHBhZGRpbmdPbiA9IEZES2FhY0VuY19mcmFtZVBhZGRpbmcoYml0UmF0ZSwgc2FtcGxlUmF0ZSwgZ3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFFDLT5wYWRkaW5nLnBhZGRpbmdSZXN0KTsKIAotICBmcmFtZUxlbiA9IHBhZGRpbmdPbiArIEZES2FhY0VuY19jYWxjRnJhbWVMZW4oYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOX0JZVEVTX0lOVCk7CisgIGZyYW1lTGVuID0KKyAgICAgIHBhZGRpbmdPbiArIEZES2FhY0VuY19jYWxjRnJhbWVMZW4oYml0UmF0ZSwgc2FtcGxlUmF0ZSwgZ3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOX0JZVEVTX0lOVCk7CiAKLSAgKmF2Z1RvdGFsQml0cyA9IGZyYW1lTGVuPDwzOworICAqYXZnVG90YWxCaXRzID0gZnJhbWVMZW4gPDwgMzsKIAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAotc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19kaXN0cmlidXRlRWxlbWVudER5bkJpdHMoUUNfU1RBVEUqICAgICAgICAgaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICBxY0VsZW1lbnRbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIGNvZGVCaXRzKQoteworI2RlZmluZSBpc0F1ZGlvRWxlbWVudChlbFR5cGUpIFwKKyAgKChlbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxUeXBlID09IElEX0NQRSkgfHwgKGVsVHlwZSA9PSBJRF9MRkUpKQogCi0gIElOVCBpLCBmaXJzdEVsID0gY20tPm5FbGVtZW50cy0xOwotICBJTlQgdG90YWxCaXRzID0gMDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICBmb3IgKGk9KGNtLT5uRWxlbWVudHMtMSk7IGk+PTA7IGktLSkgewotICAgIGlmICgoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfU0NFKSB8fCAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfQ1BFKSB8fAotICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfTEZFKSkKLSAgICB7Ci0gICAgICBxY0VsZW1lbnRbaV0tPmdyYW50ZWREeW5CaXRzID0gIChJTlQpZk11bHQoaFFDLT5lbGVtZW50Qml0c1tpXS0+cmVsYXRpdmVCaXRzRWwsIChGSVhQX0RCTCljb2RlQml0cyk7CisgICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19kaXN0cmlidXRlRWxlbWVudER5bkJpdHMKKyAgICAgICAgIGRlc2NyaXB0aW9uOiAgZGlzdHJpYnV0ZXMgYWxsIGJpdHMgb3ZlciBhbGwgZWxlbWVudHMuIFRoZSByZWxhdGl2ZSBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgZGlzdGlidXRpb24gaXMgZGVzY3JpYmVkIGluIHRoZSBFTEVNRU5UX0lORk8gb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGVsZW1lbnQuIFRoZSBiaXQgZGlzdHJpYnV0aW9uIHRhYmxlIGlzCisgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGluIEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoKS4KKyAgICAgICAgIHJldHVybjogICAgICAgZXJyb3Jjb2RlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX2Rpc3RyaWJ1dGVFbGVtZW50RHluQml0cygKKyAgICBRQ19TVEFURSogaFFDLCBRQ19PVVRfRUxFTUVOVCogcWNFbGVtZW50WygoOCkpXSwgQ0hBTk5FTF9NQVBQSU5HKiBjbSwKKyAgICBJTlQgY29kZUJpdHMpIHsKKyAgSU5UIGk7ICAgICAgICAgICAgIC8qIGNvdW50ZXIgdmFyaWFibGUgKi8KKyAgSU5UIHRvdGFsQml0cyA9IDA7IC8qIHN1bSBvZiBiaXRzIG92ZXIgYWxsIGVsZW1lbnRzICovCisKKyAgZm9yIChpID0gKGNtLT5uRWxlbWVudHMgLSAxKTsgaSA+PSAwOyBpLS0pIHsKKyAgICBpZiAoaXNBdWRpb0VsZW1lbnQoY20tPmVsSW5mb1tpXS5lbFR5cGUpKSB7CisgICAgICBxY0VsZW1lbnRbaV0tPmdyYW50ZWREeW5CaXRzID0KKyAgICAgICAgICBmTWF4KDAsIGZNdWx0SShoUUMtPmVsZW1lbnRCaXRzW2ldLT5yZWxhdGl2ZUJpdHNFbCwgY29kZUJpdHMpKTsKICAgICAgIHRvdGFsQml0cyArPSBxY0VsZW1lbnRbaV0tPmdyYW50ZWREeW5CaXRzOwotICAgICAgZmlyc3RFbCA9IGk7CiAgICAgfQogICB9Ci0gIHFjRWxlbWVudFtmaXJzdEVsXS0+Z3JhbnRlZER5bkJpdHMgKz0gY29kZUJpdHMgLSB0b3RhbEJpdHM7CisKKyAgLyogRHVlIHRvIGluYWNjdXJhY2llcyB3aXRoIHRoZSBtdWx0aXBsaWNhdGlvbiwgY29kZUJpdHMgbWF5IGRpZmZlciBmcm9tCisgICAgIHRvdGFsQml0cy4gRm9yIHRoYXQgY2FzZSwgdGhlIGRpZmZlcmVuY2UgbXVzdCBiZSBhZGRlZC9zdWJzdHJhY3RlZCBhZ2FpbgorICAgICB0by9mcm9tIG9uZSBlbGVtZW50LCBpLmU6CisgICAgIE5lZ2F0aXZlIGRpZmZlcmVuY2VzIGFyZSBzdWJzdHJhY3RlZCBmcm9tIHRoZSBlbGVtZW50IHdpdGggdGhlIG1vc3QgYml0cy4KKyAgICAgUG9zaXRpdmUgZGlmZmVyZW5jZXMgYXJlIGFkZGVkIHRvIHRoZSBlbGVtZW50IHdpdGggdGhlIGxlYXN0IGJpdHMuCisgICovCisgIGlmIChjb2RlQml0cyAhPSB0b3RhbEJpdHMpIHsKKyAgICBJTlQgZWxNYXhCaXRzID0gY20tPm5FbGVtZW50cyAtIDE7IC8qIGVsZW1lbnQgd2l0aCB0aGUgbW9zdCBiaXRzICovCisgICAgSU5UIGVsTWluQml0cyA9IGNtLT5uRWxlbWVudHMgLSAxOyAvKiBlbGVtZW50IHdpdGggdGhlIGxlYXN0IGJpdHMgKi8KKworICAgIC8qIFNlYXJjaCBmb3IgYmlnZ2VzdCBhbmQgc21hbGxlc3QgYXVkaW8gZWxlbWVudCAqLworICAgIGZvciAoaSA9IChjbS0+bkVsZW1lbnRzIC0gMSk7IGkgPj0gMDsgaS0tKSB7CisgICAgICBpZiAoaXNBdWRpb0VsZW1lbnQoY20tPmVsSW5mb1tpXS5lbFR5cGUpKSB7CisgICAgICAgIGlmIChxY0VsZW1lbnRbaV0tPmdyYW50ZWREeW5CaXRzID4KKyAgICAgICAgICAgIHFjRWxlbWVudFtlbE1heEJpdHNdLT5ncmFudGVkRHluQml0cykgeworICAgICAgICAgIGVsTWF4Qml0cyA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHFjRWxlbWVudFtpXS0+Z3JhbnRlZER5bkJpdHMgPAorICAgICAgICAgICAgcWNFbGVtZW50W2VsTWluQml0c10tPmdyYW50ZWREeW5CaXRzKSB7CisgICAgICAgICAgZWxNaW5CaXRzID0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wZW5zYXRlIGZvciBiaXQgZGlzdGlidXRpb24gZGlmZmVyZW5jZSAqLworICAgIGlmIChjb2RlQml0cyAtIHRvdGFsQml0cyA+IDApIHsKKyAgICAgIHFjRWxlbWVudFtlbE1pbkJpdHNdLT5ncmFudGVkRHluQml0cyArPSBjb2RlQml0cyAtIHRvdGFsQml0czsKKyAgICB9IGVsc2UgeworICAgICAgcWNFbGVtZW50W2VsTWF4Qml0c10tPmdyYW50ZWREeW5CaXRzICs9IGNvZGVCaXRzIC0gdG90YWxCaXRzOworICAgIH0KKyAgfQogCiAgIHJldHVybiBBQUNfRU5DX09LOwogfQpAQCAtNTMyLDEyICs1NjIsMTMgQEAKIC8qKgogICogXGJyaWVmICBWZXJpZnkgd2hldGhlciBtaW5CaXRzUGVyRnJhbWUgY3JpdGVyaW9uIGNhbiBiZSBzYXRpc2ZpZWQuCiAgKgotICogVGhpcyBmdW5jdGlvbiBldmFsdWF0ZXMgdGhlIGJpdCBjb25zdW1wdGlvbiBvbmx5IGlmIG1pbkJpdHNQZXJGcmFtZSBwYXJhbWV0ZXIgaXMgbm90IDAuCi0gKiBJbiBoeXBlcmZyYW1pbmcgbW9kZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGdyYW50ZWREeW5CaXRzIGFuZCB1c2VkRHluQml0cyBvZiBhbGwgc3ViIGZyYW1lcwotICogcmVzdWx0cyB0aGUgbnVtYmVyIG9mIGZpbGxiaXRzIHRvIGJlIHdyaXR0ZW4uCi0gKiBUaGlzIGJpdHMgY2FuIGJlIGRpc3RydWJpdHVlZCBpbiBzdXBlcmZyYW1lIHRvIHJlYWNoIG1pbkJpdHNQZXJGcmFtZSBiaXQgY29uc3VtcHRpb24gaW4gc2luZ2xlIEFVJ3MuCi0gKiBUaGUgcmV0dXJuIHZhbHVlIGRlbm90ZXMgaWYgZW5vdWdoIGRlc2lyZWQgZmlsbCBiaXRzIGFyZSBhdmFpbGFibGUgdG8gYWNoaWV2ZSBtaW5CaXRzUGVyRnJhbWUgaW4gYWxsIGZyYW1lcy4KLSAqIFRoaXMgY2hlY2sgY2FuIG9ubHkgYmUgdXNlZCB3aXRoaW4gc3VwZXJmcmFtZXMuCisgKiBUaGlzIGZ1bmN0aW9uIGV2YWx1YXRlcyB0aGUgYml0IGNvbnN1bXB0aW9uIG9ubHkgaWYgbWluQml0c1BlckZyYW1lIHBhcmFtZXRlcgorICogaXMgbm90IDAuIEluIGh5cGVyZnJhbWluZyBtb2RlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZ3JhbnRlZER5bkJpdHMgYW5kCisgKiB1c2VkRHluQml0cyBvZiBhbGwgc3ViIGZyYW1lcyByZXN1bHRzIHRoZSBudW1iZXIgb2YgZmlsbGJpdHMgdG8gYmUgd3JpdHRlbi4KKyAqIFRoaXMgYml0cyBjYW4gYmUgZGlzdHJ1Yml0dWVkIGluIHN1cGVyZnJhbWUgdG8gcmVhY2ggbWluQml0c1BlckZyYW1lIGJpdAorICogY29uc3VtcHRpb24gaW4gc2luZ2xlIEFVJ3MuIFRoZSByZXR1cm4gdmFsdWUgZGVub3RlcyBpZiBlbm91Z2ggZGVzaXJlZCBmaWxsCisgKiBiaXRzIGFyZSBhdmFpbGFibGUgdG8gYWNoaWV2ZSBtaW5CaXRzUGVyRnJhbWUgaW4gYWxsIGZyYW1lcy4gVGhpcyBjaGVjayBjYW4KKyAqIG9ubHkgYmUgdXNlZCB3aXRoaW4gc3VwZXJmcmFtZXMuCiAgKgogICogXHBhcmFtIHFjT3V0ICAgICAgICAgICAgUG9pbnRlciB0byBjb2RpbmcgZGF0YSBzdHJ1Y3QuCiAgKiBccGFyYW0gbWluQml0c1BlckZyYW1lICBNaW5pbWFsIG51bWJlciBvZiBiaXRzIHRvIGJlIGNvbnN1bWVkIGluIGVhY2ggZnJhbWUuCkBAIC01NDcsMTIgKzU3OCw4IEBACiAgKiAgICAgICAgICAtIDE6IGFsbCBmaW5lCiAgKiAgICAgICAgICAtIDA6IGNyaXRlcmlvbiBub3QgZnVsZmlsbGVkCiAgKi8KLXN0YXRpYyBpbnQgY2hlY2tNaW5GcmFtZUJpdHNEZW1hbmQoCi0gICAgICAgIFFDX09VVCoqICAgICAgICAgICAgICAgICAgcWNPdXQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbWluQml0c1BlckZyYW1lLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG5TdWJGcmFtZXMKLSAgICAgICAgKQoteworc3RhdGljIGludCBjaGVja01pbkZyYW1lQml0c0RlbWFuZChRQ19PVVQqKiBxY091dCwgY29uc3QgSU5UIG1pbkJpdHNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5TdWJGcmFtZXMpIHsKICAgaW50IHJlc3VsdCA9IDE7IC8qIGFsbCBmaW5lKi8KICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTU2OCwzMyArNTk1LDI2IEBACiAgICAgICAgICByZXR1cm46ICAgICAgIG51bWJlciBvZiBzdGF0aWMgYml0cwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBGREthYWNFbmNfZ2V0TWluaW1hbFN0YXRpY0JpdGRlbWFuZChDSEFOTkVMX01BUFBJTkcqICAgICBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCoqICAgICAgICAgICAgcHN5T3V0KQoteworc3RhdGljIGludCBGREthYWNFbmNfZ2V0TWluaW1hbFN0YXRpY0JpdGRlbWFuZChDSEFOTkVMX01BUFBJTkcqIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUKiogcHN5T3V0KSB7CiAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCA9IEFPVF9BQUNfTEM7Ci0gIFVJTlQgIHN5bnRheEZsYWdzID0gMDsKKyAgVUlOVCBzeW50YXhGbGFncyA9IDA7CiAgIFNDSEFSIGVwQ29uZmlnID0gLTE7CiAgIGludCBpLCBiaXRjb3VudCA9IDA7CiAKLSAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKSB7Ci0gICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKKyAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwogCi0gICAgICBpZiAoIChlbEluZm8uZWxUeXBlID09IElEX1NDRSkKLSAgICAgICAgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKQotICAgICAgICB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpICkKLSAgICAgIHsKLSAgICAgICAgSU5UIG1pbkVsQml0cyA9IDA7CisgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKSB7CisgICAgICBJTlQgbWluRWxCaXRzID0gMDsKIAotICAgICAgICBGREthYWNFbmNfQ2hhbm5lbEVsZW1lbnRXcml0ZSggTlVMTCwgJmVsSW5mbywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dFswXS0+cHN5T3V0RWxlbWVudFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dFswXS0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5FbEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICk7Ci0gICAgICAgIGJpdGNvdW50ICs9IG1pbkVsQml0czsKLSAgICAgIH0KKyAgICAgIEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKE5VTEwsICZlbEluZm8sIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywgYW90LCBlcENvbmZpZywgJm1pbkVsQml0cywgMSk7CisgICAgICBiaXRjb3VudCArPSBtaW5FbEJpdHM7CisgICAgfQogICB9CiAKICAgcmV0dXJuIGJpdGNvdW50OwpAQCAtNjAyLDIwMSArNjIyLDE4NCBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3ByZXBhcmVCaXREaXN0cmlidXRpb24oUUNfU1RBVEUqICAgICAgICAgICAgaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCoqICAgICAgICAgICAgcHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiogICAgICAgICAgICAgcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqICAgICBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgICAgIHFjRWxlbWVudFsoMSldWyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBhdmdUb3RhbEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICp0b3RhbEF2YWlsYWJsZUJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICphdmdUb3RhbER5bkJpdHMpCi17Ci0gICAgaW50IGk7Ci0gICAgICAvKiBnZXQgbWF4aW1hbCBhbGxvd2VkIGR5bmFtaWMgYml0cyAqLwotICAgICAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzID0gIChmaXhNaW4oaFFDLT5tYXhCaXRzUGVyRnJhbWUsIGF2Z1RvdGFsQml0cykgLSBoUUMtPmdsb2JIZHJCaXRzKSZ+NzsKLSAgICAgIHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyAtPSAocWNPdXRbMF0tPmdsb2JhbEV4dEJpdHMgKyBxY091dFswXS0+c3RhdGljQml0cyArIHFjT3V0WzBdLT5lbGVtZW50RXh0Qml0cyk7Ci0gICAgICBxY091dFswXS0+bWF4RHluQml0cyA9ICgoaFFDLT5tYXhCaXRzUGVyRnJhbWUpJn43KSAtIChxY091dFswXS0+Z2xvYmFsRXh0Qml0cyArIHFjT3V0WzBdLT5zdGF0aWNCaXRzICsgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzKTsKLSAgICAgIC8qIGFzc3VyZSB0aGF0IGVub3VnaCBiaXRzIGFyZSBhdmFpbGFibGUgKi8KLSAgICAgIGlmICgocWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzK2hRQy0+Yml0UmVzVG90KSA8IDApIHsKLSAgICAgICAgLyogY3Jhc2ggcmVjb3ZlcnkgYWxsb3dzIHRvIHJlZHVjZSBzdGF0aWMgYml0cyB0byBhIG1pbmltdW0gKi8KLSAgICAgICAgaWYgKCAocWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzK2hRQy0+Yml0UmVzVG90KSA8IChGREthYWNFbmNfZ2V0TWluaW1hbFN0YXRpY0JpdGRlbWFuZChjbSwgcHN5T3V0KS1xY091dFswXS0+c3RhdGljQml0cykgKQotICAgICAgICAgIHJldHVybiBBQUNfRU5DX0JJVFJFU19UT09fTE9XOwotICAgICAgfQorc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wcmVwYXJlQml0RGlzdHJpYnV0aW9uKAorICAgIFFDX1NUQVRFKiBoUUMsIFBTWV9PVVQqKiBwc3lPdXQsIFFDX09VVCoqIHFjT3V0LCBDSEFOTkVMX01BUFBJTkcqIGNtLAorICAgIFFDX09VVF9FTEVNRU5UKiBxY0VsZW1lbnRbKDEpXVsoKDgpKV0sIElOVCBhdmdUb3RhbEJpdHMsCisgICAgSU5UKiB0b3RhbEF2YWlsYWJsZUJpdHMsIElOVCogYXZnVG90YWxEeW5CaXRzKSB7CisgIGludCBpOworICAvKiBnZXQgbWF4aW1hbCBhbGxvd2VkIGR5bmFtaWMgYml0cyAqLworICBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgPQorICAgICAgKGZpeE1pbihoUUMtPm1heEJpdHNQZXJGcmFtZSwgYXZnVG90YWxCaXRzKSAtIGhRQy0+Z2xvYkhkckJpdHMpICYgfjc7CisgIHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyAtPSAocWNPdXRbMF0tPmdsb2JhbEV4dEJpdHMgKyBxY091dFswXS0+c3RhdGljQml0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzKTsKKyAgcWNPdXRbMF0tPm1heER5bkJpdHMgPSAoKGhRQy0+bWF4Qml0c1BlckZyYW1lKSAmIH43KSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgKHFjT3V0WzBdLT5nbG9iYWxFeHRCaXRzICsgcWNPdXRbMF0tPnN0YXRpY0JpdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dFswXS0+ZWxlbWVudEV4dEJpdHMpOworICAvKiBhc3N1cmUgdGhhdCBlbm91Z2ggYml0cyBhcmUgYXZhaWxhYmxlICovCisgIGlmICgocWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzICsgaFFDLT5iaXRSZXNUb3QpIDwgMCkgeworICAgIC8qIGNyYXNoIHJlY292ZXJ5IGFsbG93cyB0byByZWR1Y2Ugc3RhdGljIGJpdHMgdG8gYSBtaW5pbXVtICovCisgICAgaWYgKChxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgKyBoUUMtPmJpdFJlc1RvdCkgPAorICAgICAgICAoRkRLYWFjRW5jX2dldE1pbmltYWxTdGF0aWNCaXRkZW1hbmQoY20sIHBzeU91dCkgLQorICAgICAgICAgcWNPdXRbMF0tPnN0YXRpY0JpdHMpKQorICAgICAgcmV0dXJuIEFBQ19FTkNfQklUUkVTX1RPT19MT1c7CisgIH0KIAotICAgICAgLyogZGlzdHJpYnV0ZSBkeW5hbWljIGJpdHMgdG8gZWFjaCBlbGVtZW50ICovCi0gICAgICBGREthYWNFbmNfZGlzdHJpYnV0ZUVsZW1lbnREeW5CaXRzKGhRQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzKTsKKyAgLyogZGlzdHJpYnV0ZSBkeW5hbWljIGJpdHMgdG8gZWFjaCBlbGVtZW50ICovCisgIEZES2FhY0VuY19kaXN0cmlidXRlRWxlbWVudER5bkJpdHMoaFFDLCBxY0VsZW1lbnRbMF0sIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyk7CiAKLSAgICAgICphdmdUb3RhbER5bkJpdHMgPSAwOyAvKmZyYW1lRHluQml0czsqLworICAqYXZnVG90YWxEeW5CaXRzID0gMDsgLypmcmFtZUR5bkJpdHM7Ki8KIAotICAgICp0b3RhbEF2YWlsYWJsZUJpdHMgPSBhdmdUb3RhbEJpdHM7CisgICp0b3RhbEF2YWlsYWJsZUJpdHMgPSBhdmdUb3RhbEJpdHM7CiAKLSAgICAvKiBzdW0gdXAgY29ycmVjdGVkIGdyYW50ZWQgUEUgKi8KLSAgICBxY091dFswXS0+dG90YWxHcmFudGVkUGVDb3JyID0gMDsKKyAgLyogc3VtIHVwIGNvcnJlY3RlZCBncmFudGVkIFBFICovCisgIHFjT3V0WzBdLT50b3RhbEdyYW50ZWRQZUNvcnIgPSAwOwogCi0gICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQotICAgIHsKLSAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07Ci0gICAgICAgIGludCBuQ2hhbm5lbHMgPSBlbEluZm8ubkNoYW5uZWxzSW5FbDsKKyAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOworICAgIGludCBuQ2hhbm5lbHMgPSBlbEluZm8ubkNoYW5uZWxzSW5FbDsKIAotICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8Ci0gICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KLSAgICAgICAgICAgICAgICBGREthYWNFbmNfRGlzdHJpYnV0ZUJpdHMoaFFDLT5oQWRqVGhyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0WzBdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY0VsZW1lbnRbMF1baV0tPnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkUGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjRWxlbWVudFswXVtpXS0+Z3JhbnRlZFBlQ29yciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0tPmNvbW1vbldpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkRHluQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5lbGVtZW50Qml0c1tpXS0+Yml0UmVzTGV2ZWxFbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5lbGVtZW50Qml0c1tpXS0+bWF4Qml0UmVzQml0c0VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPm1heEJpdEZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5iaXREaXN0cmlidXRpb25Nb2RlKTsKKyAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpIHsKKyAgICAgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCisgICAgICBGREthYWNFbmNfRGlzdHJpYnV0ZUJpdHMoCisgICAgICAgICAgaFFDLT5oQWRqVGhyLCBoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSwKKyAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsICZxY0VsZW1lbnRbMF1baV0tPnBlRGF0YSwKKyAgICAgICAgICAmcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkUGUsICZxY0VsZW1lbnRbMF1baV0tPmdyYW50ZWRQZUNvcnIsCisgICAgICAgICAgbkNoYW5uZWxzLCBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0tPmNvbW1vbldpbmRvdywKKyAgICAgICAgICBxY0VsZW1lbnRbMF1baV0tPmdyYW50ZWREeW5CaXRzLCBoUUMtPmVsZW1lbnRCaXRzW2ldLT5iaXRSZXNMZXZlbEVsLAorICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPm1heEJpdFJlc0JpdHNFbCwgaFFDLT5tYXhCaXRGYWMsCisgICAgICAgICAgaFFDLT5iaXRSZXNNb2RlKTsKIAotICAgICAgICAgICAgICAgICp0b3RhbEF2YWlsYWJsZUJpdHMgKz0gaFFDLT5lbGVtZW50Qml0c1tpXS0+Yml0UmVzTGV2ZWxFbDsKLSAgICAgICAgLyogZ2V0IHRvdGFsIGNvcnJlY3RlZCBncmFudGVkIFBFICovCi0gICAgICAgIHFjT3V0WzBdLT50b3RhbEdyYW50ZWRQZUNvcnIgKz0gcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkUGVDb3JyOwotICAgICAgICB9ICAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCisgICAgICAqdG90YWxBdmFpbGFibGVCaXRzICs9IGhRQy0+ZWxlbWVudEJpdHNbaV0tPmJpdFJlc0xldmVsRWw7CisgICAgICAvKiBnZXQgdG90YWwgY29ycmVjdGVkIGdyYW50ZWQgUEUgKi8KKyAgICAgIHFjT3V0WzBdLT50b3RhbEdyYW50ZWRQZUNvcnIgKz0gcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkUGVDb3JyOworICAgIH0gLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwogCi0gICAgfSAgLyogLWVuZC0gZWxlbWVudCBsb29wICovCisgIH0gLyogLWVuZC0gZWxlbWVudCBsb29wICovCiAKLSAgICAqdG90YWxBdmFpbGFibGVCaXRzID0gRkRLbWluKGhRQy0+bWF4Qml0c1BlckZyYW1lLCAoKnRvdGFsQXZhaWxhYmxlQml0cykpOwotCi0gICAgcmV0dXJuIEFBQ19FTkNfT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1zdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3VwZGF0ZVVzZWREeW5CaXRzKElOVCogICAgICAgICAgICAgICBzdW1EeW5CaXRzQ29uc3VtZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgICBxY0VsZW1lbnRbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgIGNtKQotewotICBJTlQgaTsKLQotICAqc3VtRHluQml0c0NvbnN1bWVkID0gMDsKLQotICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspCi0gIHsKLSAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwotCi0gICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8Ci0gICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKLSAgICAgIHsKLSAgICAgICAgICAvKiBzdW0gdXAgYml0cyBjb25zdW1lZCAqLwotICAgICAgICAgICpzdW1EeW5CaXRzQ29uc3VtZWQgICs9IHFjRWxlbWVudFtpXS0+ZHluQml0c1VzZWQ7Ci0gICAgICB9ICAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCi0KLSAgfSAgLyogLWVuZC0gZWxlbWVudCBsb29wICovCisgICp0b3RhbEF2YWlsYWJsZUJpdHMgPSBmTWluKGhRQy0+bWF4Qml0c1BlckZyYW1lLCAoKnRvdGFsQXZhaWxhYmxlQml0cykpOwogCiAgIHJldHVybiBBQUNfRU5DX09LOwogfQogCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY191cGRhdGVVc2VkRHluQml0cygKKyAgICBJTlQqIHN1bUR5bkJpdHNDb25zdW1lZCwgUUNfT1VUX0VMRU1FTlQqIHFjRWxlbWVudFsoKDgpKV0sCisgICAgQ0hBTk5FTF9NQVBQSU5HKiBjbSkgeworICBJTlQgaTsKIAotc3RhdGljIElOVCBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZER5bkJpdHMoUUNfT1VUKiogcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU3ViRnJhbWVzKQotewotICAgIElOVCBjLCB0b3RhbEJpdHM9MDsKKyAgKnN1bUR5bkJpdHNDb25zdW1lZCA9IDA7CiAKLSAgICAvKiBzdW0gdXAgYml0IGNvbnN1bXB0aW9uIGZvciBhbGwgc3ViIGZyYW1lcyAqLwotICAgIGZvciAoYz0wOyBjPG5TdWJGcmFtZXM7IGMrKykKLSAgICB7Ci0gICAgICAgIC8qIGJpdCBjb25zdW1wdGlvbiBub3QgdmFsaWQgaWYgZHluYW1pYyBiaXRzCi0gICAgICAgICAgIG5vdCBhdmFpbGFibGUgaW4gb25lIHN1YiBmcmFtZSAqLwotICAgICAgICBpZiAocWNPdXRbY10tPnVzZWREeW5CaXRzPT0tMSkgcmV0dXJuIC0xOwotICAgICAgICB0b3RhbEJpdHMgKz0gcWNPdXRbY10tPnVzZWREeW5CaXRzOwotICAgIH0KKyAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwogCi0gICAgcmV0dXJuIHRvdGFsQml0czsKKyAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpIHsKKyAgICAgIC8qIHN1bSB1cCBiaXRzIGNvbnN1bWVkICovCisgICAgICAqc3VtRHluQml0c0NvbnN1bWVkICs9IHFjRWxlbWVudFtpXS0+ZHluQml0c1VzZWQ7CisgICAgfSAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCiAKKyAgfSAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KKworICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAotc3RhdGljIElOVCBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZEJpdHMoUUNfT1VUKiogICAgICAgICAgcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgIHFjRWxlbWVudFsoMSldWyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICBnbG9iSGRyQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgblN1YkZyYW1lcykKLXsKLSAgICBpbnQgYywgaTsKLSAgICBpbnQgdG90YWxVc2VkQml0cyA9IDA7CitzdGF0aWMgSU5UIEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkRHluQml0cyhRQ19PVVQqKiBxY091dCwgSU5UIG5TdWJGcmFtZXMpIHsKKyAgSU5UIGMsIHRvdGFsQml0cyA9IDA7CiAKLSAgICBmb3IgKGMgPSAwIDsgYyA8IG5TdWJGcmFtZXMgOyBjKysgKQotICAgIHsKLSAgICAgICAgaW50IGRhdGFCaXRzID0gMDsKLSAgICAgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX1NDRSkgfHwgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0NQRSkgfHwKLSAgICAgICAgICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfTEZFKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBkYXRhQml0cyArPSBxY0VsZW1lbnRbY11baV0tPmR5bkJpdHNVc2VkICsgcWNFbGVtZW50W2NdW2ldLT5zdGF0aWNCaXRzVXNlZCArIHFjRWxlbWVudFtjXVtpXS0+ZXh0Qml0c1VzZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YUJpdHMgKz0gcWNPdXRbY10tPmdsb2JhbEV4dEJpdHM7CisgIC8qIHN1bSB1cCBiaXQgY29uc3VtcHRpb24gZm9yIGFsbCBzdWIgZnJhbWVzICovCisgIGZvciAoYyA9IDA7IGMgPCBuU3ViRnJhbWVzOyBjKyspIHsKKyAgICAvKiBiaXQgY29uc3VtcHRpb24gbm90IHZhbGlkIGlmIGR5bmFtaWMgYml0cworICAgICAgIG5vdCBhdmFpbGFibGUgaW4gb25lIHN1YiBmcmFtZSAqLworICAgIGlmIChxY091dFtjXS0+dXNlZER5bkJpdHMgPT0gLTEpIHJldHVybiAtMTsKKyAgICB0b3RhbEJpdHMgKz0gcWNPdXRbY10tPnVzZWREeW5CaXRzOworICB9CiAKLSAgICAgICAgdG90YWxVc2VkQml0cyArPSAoOCAtIChkYXRhQml0cykgJSA4KSAlIDg7Ci0gICAgICAgIHRvdGFsVXNlZEJpdHMgKz0gZGF0YUJpdHMgKyBnbG9iSGRyQml0czsgIC8qIGhlYWRlciBiaXRzIGZvciBldmVyeSBmcmFtZSAqLworICByZXR1cm4gdG90YWxCaXRzOworfQorCitzdGF0aWMgSU5UIEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkQml0cyhRQ19PVVQqKiBxY091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiBxY0VsZW1lbnRbKDEpXVsoKDgpKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqIGNtLCBJTlQgZ2xvYkhkckJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblN1YkZyYW1lcykgeworICBpbnQgYywgaTsKKyAgaW50IHRvdGFsVXNlZEJpdHMgPSAwOworCisgIGZvciAoYyA9IDA7IGMgPCBuU3ViRnJhbWVzOyBjKyspIHsKKyAgICBpbnQgZGF0YUJpdHMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgIGlmICgoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfU0NFKSB8fAorICAgICAgICAgIChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0xGRSkpIHsKKyAgICAgICAgZGF0YUJpdHMgKz0gcWNFbGVtZW50W2NdW2ldLT5keW5CaXRzVXNlZCArCisgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+c3RhdGljQml0c1VzZWQgKworICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbY11baV0tPmV4dEJpdHNVc2VkOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdG90YWxVc2VkQml0czsKKyAgICBkYXRhQml0cyArPSBxY091dFtjXS0+Z2xvYmFsRXh0Qml0czsKKworICAgIHRvdGFsVXNlZEJpdHMgKz0gKDggLSAoZGF0YUJpdHMpICUgOCkgJSA4OworICAgIHRvdGFsVXNlZEJpdHMgKz0gZGF0YUJpdHMgKyBnbG9iSGRyQml0czsgLyogaGVhZGVyIGJpdHMgZm9yIGV2ZXJ5IGZyYW1lICovCisgIH0KKyAgcmV0dXJuIHRvdGFsVXNlZEJpdHM7CiB9CiAKIHN0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfQml0UmVzUmVkaXN0cmlidXRpb24oCi0gICAgICAgIFFDX1NUQVRFICpjb25zdCAgICAgICAgICAgICAgaFFDLAotICAgICAgICBjb25zdCBDSEFOTkVMX01BUFBJTkcgKmNvbnN0IGNtLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cwotICAgICAgICApCi17Ci0gICAgLyogY2hlY2sgYml0cmVzZXJ2b2lyIGZpbGwgbGV2ZWwgKi8KLSAgICBpZiAoaFFDLT5iaXRSZXNUb3QgPCAwKSB7Ci0gICAgICByZXR1cm4gQUFDX0VOQ19CSVRSRVNfVE9PX0xPVzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaFFDLT5iaXRSZXNUb3QgPiBoUUMtPmJpdFJlc1RvdE1heCkgewotICAgICAgcmV0dXJuIEFBQ19FTkNfQklUUkVTX1RPT19ISUdIOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIElOVCBpLCBmaXJzdEVsID0gY20tPm5FbGVtZW50cy0xOwotICAgICAgSU5UIHRvdGFsQml0cyA9IDAsIHRvdGFsQml0c19tYXggPSAwOworICAgIFFDX1NUQVRFKiBjb25zdCBoUUMsIGNvbnN0IENIQU5ORUxfTUFQUElORyogY29uc3QgY20sCisgICAgY29uc3QgSU5UIGF2Z1RvdGFsQml0cykgeworICAvKiBjaGVjayBiaXRyZXNlcnZvaXIgZmlsbCBsZXZlbCAqLworICBpZiAoaFFDLT5iaXRSZXNUb3QgPCAwKSB7CisgICAgcmV0dXJuIEFBQ19FTkNfQklUUkVTX1RPT19MT1c7CisgIH0gZWxzZSBpZiAoaFFDLT5iaXRSZXNUb3QgPiBoUUMtPmJpdFJlc1RvdE1heCkgeworICAgIHJldHVybiBBQUNfRU5DX0JJVFJFU19UT09fSElHSDsKKyAgfSBlbHNlIHsKKyAgICBJTlQgaTsKKyAgICBJTlQgdG90YWxCaXRzID0gMCwgdG90YWxCaXRzX21heCA9IDA7CiAKLSAgICAgIGludCB0b3RhbEJpdHJlc2Vydm9pciAgICA9IEZES21pbihoUUMtPmJpdFJlc1RvdCwgKGhRQy0+bWF4Qml0c1BlckZyYW1lLWF2Z1RvdGFsQml0cykpOwotICAgICAgaW50IHRvdGFsQml0cmVzZXJ2b2lyTWF4ID0gRkRLbWluKGhRQy0+Yml0UmVzVG90TWF4LCAoaFFDLT5tYXhCaXRzUGVyRnJhbWUtYXZnVG90YWxCaXRzKSk7CisgICAgY29uc3QgaW50IHRvdGFsQml0cmVzZXJ2b2lyID0KKyAgICAgICAgZk1pbihoUUMtPmJpdFJlc1RvdCwgKGhRQy0+bWF4Qml0c1BlckZyYW1lIC0gYXZnVG90YWxCaXRzKSk7CisgICAgY29uc3QgaW50IHRvdGFsQml0cmVzZXJ2b2lyTWF4ID0KKyAgICAgICAgZk1pbihoUUMtPmJpdFJlc1RvdE1heCwgKGhRQy0+bWF4Qml0c1BlckZyYW1lIC0gYXZnVG90YWxCaXRzKSk7CiAKLSAgICAgIGludCBzY19iaXRSZXNUb3QgPSBDb3VudExlYWRpbmdCaXRzKHRvdGFsQml0cmVzZXJ2b2lyKTsKLSAgICAgIGludCBzY19iaXRSZXNUb3RNYXggPSBDb3VudExlYWRpbmdCaXRzKHRvdGFsQml0cmVzZXJ2b2lyTWF4KTsKKyAgICBmb3IgKGkgPSAoY20tPm5FbGVtZW50cyAtIDEpOyBpID49IDA7IGktLSkgeworICAgICAgaWYgKChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9TQ0UpIHx8CisgICAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0NQRSkgfHwKKyAgICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfTEZFKSkgeworICAgICAgICBoUUMtPmVsZW1lbnRCaXRzW2ldLT5iaXRSZXNMZXZlbEVsID0KKyAgICAgICAgICAgIGZNdWx0SShoUUMtPmVsZW1lbnRCaXRzW2ldLT5yZWxhdGl2ZUJpdHNFbCwgdG90YWxCaXRyZXNlcnZvaXIpOworICAgICAgICB0b3RhbEJpdHMgKz0gaFFDLT5lbGVtZW50Qml0c1tpXS0+Yml0UmVzTGV2ZWxFbDsKIAotICAgICAgZm9yIChpPShjbS0+bkVsZW1lbnRzLTEpOyBpPj0wOyBpLS0pIHsKLSAgICAgICAgaWYgKChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9DUEUpIHx8Ci0gICAgICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfTEZFKSkKLSAgICAgICAgewotICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPmJpdFJlc0xldmVsRWwgPSAoSU5UKWZNdWx0KGhRQy0+ZWxlbWVudEJpdHNbaV0tPnJlbGF0aXZlQml0c0VsLCAoRklYUF9EQkwpKHRvdGFsQml0cmVzZXJ2b2lyPDxzY19iaXRSZXNUb3QpKT4+c2NfYml0UmVzVG90OwotICAgICAgICAgIHRvdGFsQml0cyArPSBoUUMtPmVsZW1lbnRCaXRzW2ldLT5iaXRSZXNMZXZlbEVsOwotCi0gICAgICAgICAgaFFDLT5lbGVtZW50Qml0c1tpXS0+bWF4Qml0UmVzQml0c0VsID0gKElOVClmTXVsdChoUUMtPmVsZW1lbnRCaXRzW2ldLT5yZWxhdGl2ZUJpdHNFbCwgKEZJWFBfREJMKSh0b3RhbEJpdHJlc2Vydm9pck1heDw8c2NfYml0UmVzVG90TWF4KSk+PnNjX2JpdFJlc1RvdE1heDsKLSAgICAgICAgICB0b3RhbEJpdHNfbWF4ICs9IGhRQy0+ZWxlbWVudEJpdHNbaV0tPm1heEJpdFJlc0JpdHNFbDsKLQotICAgICAgICAgIGZpcnN0RWwgPSBpOwotICAgICAgICB9CisgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPm1heEJpdFJlc0JpdHNFbCA9CisgICAgICAgICAgICBmTXVsdEkoaFFDLT5lbGVtZW50Qml0c1tpXS0+cmVsYXRpdmVCaXRzRWwsIHRvdGFsQml0cmVzZXJ2b2lyTWF4KTsKKyAgICAgICAgdG90YWxCaXRzX21heCArPSBoUUMtPmVsZW1lbnRCaXRzW2ldLT5tYXhCaXRSZXNCaXRzRWw7CiAgICAgICB9Ci0gICAgICBoUUMtPmVsZW1lbnRCaXRzW2ZpcnN0RWxdLT5iaXRSZXNMZXZlbEVsICAgKz0gdG90YWxCaXRyZXNlcnZvaXIgLSB0b3RhbEJpdHM7Ci0gICAgICBoUUMtPmVsZW1lbnRCaXRzW2ZpcnN0RWxdLT5tYXhCaXRSZXNCaXRzRWwgKz0gdG90YWxCaXRyZXNlcnZvaXJNYXggLSB0b3RhbEJpdHNfbWF4OwogICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgY20tPm5FbGVtZW50czsgaSsrKSB7CisgICAgICBpZiAoKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX1NDRSkgfHwKKyAgICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAgIChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9MRkUpKSB7CisgICAgICAgIGludCBkZWx0YUJpdHMgPSBmTWF4KHRvdGFsQml0cmVzZXJ2b2lyIC0gdG90YWxCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtaFFDLT5lbGVtZW50Qml0c1tpXS0+Yml0UmVzTGV2ZWxFbCk7CisgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPmJpdFJlc0xldmVsRWwgKz0gZGVsdGFCaXRzOworICAgICAgICB0b3RhbEJpdHMgKz0gZGVsdGFCaXRzOwogCi0gICAgcmV0dXJuIEFBQ19FTkNfT0s7CisgICAgICAgIGRlbHRhQml0cyA9IGZNYXgodG90YWxCaXRyZXNlcnZvaXJNYXggLSB0b3RhbEJpdHNfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgIC1oUUMtPmVsZW1lbnRCaXRzW2ldLT5tYXhCaXRSZXNCaXRzRWwpOworICAgICAgICBoUUMtPmVsZW1lbnRCaXRzW2ldLT5tYXhCaXRSZXNCaXRzRWwgKz0gZGVsdGFCaXRzOworICAgICAgICB0b3RhbEJpdHNfbWF4ICs9IGRlbHRhQml0czsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAotCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNNYWluKFFDX1NUQVRFKiBSRVNUUklDVCAgICAgICAgIGhRQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCoqICAgICAgICAgICAgICAgICAgcHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqKiAgICAgICAgICAgICAgICAgICBxY091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgYXZnVG90YWxCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqICAgICAgICAgICBjbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxBVURJT19PQkpFQ1RfVFlQRSAgICAgICAgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ01haW4oUUNfU1RBVEUqIFJFU1RSSUNUIGhRQywgUFNZX09VVCoqIHBzeU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiogcWNPdXQsIElOVCBhdmdUb3RhbEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzeW50YXhGbGFncywgU0NIQVIgZXBDb25maWcpIHsKICAgaW50IGksIGM7CiAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0VOQ19PSzsKICAgSU5UIGF2Z1RvdGFsRHluQml0cyA9IDA7IC8qIG1heGltYWwgYWxsb3dlZCBkeW5hbWljIGJpdHMgZm9yIGFsbCBmcmFtZXMgKi8KQEAgLTgxNCwzNjMgKzgxNywzMTQgQEAKICAgLyogZmFzdGVuYyBuZWVkcyBvbmUgdGltZSB0aHJlc2hvbGQgc2ltdWxhdGlvbiwKICAgICAgaW4gY2FzZSBvZiBtdWx0aXBsZSBmcmFtZXMsIG9uZSBtb3JlIGd1ZXNzIGhhcyB0byBiZSBjYWxjdWxhdGVkICovCiAKLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgIC8qIGhlbHBlciBwb2ludGVyICovCi0gICAgICBRQ19PVVRfRUxFTUVOVCogIHFjRWxlbWVudFsoMSldWyg4KV07CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgLyogaGVscGVyIHBvaW50ZXIgKi8KKyAgUUNfT1VUX0VMRU1FTlQqIHFjRWxlbWVudFsoMSldWygoOCkpXTsKIAotICAgICAgLyogd29yayBvbiBhIGNvcHkgb2YgcWNDaGFubmVsIGFuZCBxY0VsZW1lbnQgKi8KLSAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKKyAgLyogd29yayBvbiBhIGNvcHkgb2YgcWNDaGFubmVsIGFuZCBxY0VsZW1lbnQgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwogCi0gICAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAotICAgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KLSAgICAgICAgICAgICAgZm9yIChjID0gMCA7IGMgPCBuU3ViRnJhbWVzIDsgYysrICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXSA9IHFjT3V0W2NdLT5xY0VsZW1lbnRbaV07Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9CisgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKSB7CisgICAgICAvKiBmb3IgKCBhbGwgc3ViIGZyYW1lcyApIC4uLiAqLworICAgICAgZm9yIChjID0gMDsgYyA8IG5TdWJGcmFtZXM7IGMrKykgeworICAgICAgICB7IHFjRWxlbWVudFtjXVtpXSA9IHFjT3V0W2NdLT5xY0VsZW1lbnRbaV07IH0KICAgICAgIH0KKyAgICB9CisgIH0KIAotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgaWYgKCBpc0NvbnN0YW50Qml0cmF0ZU1vZGUoaFFDLT5iaXRyYXRlTW9kZSkgKQotICAgICAgewotICAgICAgICAgIC8qIGNhbGMgZ3JhbnRlZCBkeW5hbWljIGJpdHMgZm9yIHN1YiBmcmFtZSBhbmQKLSAgICAgICAgICAgICBkaXN0cmlidXRlIGl0IHRvIGVhY2ggZWxlbWVudCAqLwotICAgICAgICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX3ByZXBhcmVCaXREaXN0cmlidXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnVG90YWxCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxBdmFpbGFibGVCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZnVG90YWxEeW5CaXRzKTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIGlmIChpc0NvbnN0YW50Qml0cmF0ZU1vZGUoaFFDLT5iaXRyYXRlTW9kZSkpIHsKKyAgICAvKiBjYWxjIGdyYW50ZWQgZHluYW1pYyBiaXRzIGZvciBzdWIgZnJhbWUgYW5kCisgICAgICAgZGlzdHJpYnV0ZSBpdCB0byBlYWNoIGVsZW1lbnQgKi8KKyAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19wcmVwYXJlQml0RGlzdHJpYnV0aW9uKAorICAgICAgICBoUUMsIHBzeU91dCwgcWNPdXQsIGNtLCBxY0VsZW1lbnQsIGF2Z1RvdGFsQml0cywgJnRvdGFsQXZhaWxhYmxlQml0cywKKyAgICAgICAgJmF2Z1RvdGFsRHluQml0cyk7CiAKLSAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgewotICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgIHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyA9ICgoaFFDLT5tYXhCaXRzUGVyRnJhbWUgLSAoaFFDLT5nbG9iSGRyQml0cykpJn43KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChxY091dFswXS0+Z2xvYmFsRXh0Qml0cyArIHFjT3V0WzBdLT5zdGF0aWNCaXRzICsgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzKTsKLSAgICAgICAgICBxY091dFswXS0+bWF4RHluQml0cyAgICAgPSBxY091dFswXS0+Z3JhbnRlZER5bkJpdHM7CisgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHsKKyAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzID0KKyAgICAgICAgKChoUUMtPm1heEJpdHNQZXJGcmFtZSAtIChoUUMtPmdsb2JIZHJCaXRzKSkgJiB+NykgLQorICAgICAgICAocWNPdXRbMF0tPmdsb2JhbEV4dEJpdHMgKyBxY091dFswXS0+c3RhdGljQml0cyArCisgICAgICAgICBxY091dFswXS0+ZWxlbWVudEV4dEJpdHMpOworICAgIHFjT3V0WzBdLT5tYXhEeW5CaXRzID0gcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzOwogCi0gICAgICAgICAgdG90YWxBdmFpbGFibGVCaXRzID0gaFFDLT5tYXhCaXRzUGVyRnJhbWU7Ci0gICAgICAgICAgYXZnVG90YWxEeW5CaXRzID0gMDsKLSAgICAgIH0KKyAgICB0b3RhbEF2YWlsYWJsZUJpdHMgPSBoUUMtPm1heEJpdHNQZXJGcmFtZTsKKyAgICBhdmdUb3RhbER5bkJpdHMgPSAwOworICB9CiAKLSNpZmRlZiBQTlNfUFJFQ09VTlRfRU5BQkxFCi0gICAgICAvKiBDYWxjdWxhdGUgZXN0aW1hdGVkIHBucyBiaXRzIGFuZCBzdWJzdHJhY3QgdGhlbSBmcm9tIGdyYW50ZWREeW5CaXRzIHRvIGdldCBhIG1vcmUgYWNjdXJhdGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBiaXRzLiAqLwotICAgICAgaWYgKHN5bnRheEZsYWdzICYgKEFDX0xEfEFDX0VMRCkpCi0gICAgICB7Ci0gICAgICAgIGludCBlc3RpbWF0ZWRQbnNCaXRzID0gMCwgY2g7CisgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCisgIGZvciAoYyA9IDA7IGMgPCBuU3ViRnJhbWVzOyBjKyspIHsKKyAgICAvKiBmb3IgQ0JSIGFuZCBWQlIgbW9kZSAqLworICAgIEZES2FhY0VuY19BZGp1c3RUaHJlc2hvbGRzKGhRQy0+aEFkalRociwgcWNFbGVtZW50W2NdLCBxY091dFtjXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbY10tPnBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25zdGFudEJpdHJhdGVNb2RlKGhRQy0+Yml0cmF0ZU1vZGUpLCBjbSk7CiAKLSAgICAgICAgZm9yIChjaD0wOyBjaDxjbS0+bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgcWNPdXRbMF0tPnBRY091dENoYW5uZWxzW2NoXS0+c2VjdGlvbkRhdGEubm9pc2VOcmdCaXRzID0gbm9pc2VQcmVDb3VudChwc3lPdXRbMF0tPnBQc3lPdXRDaGFubmVsc1tjaF0tPm5vaXNlTnJnLCBwc3lPdXRbMF0tPnBQc3lPdXRDaGFubmVsc1tjaF0tPm1heFNmYlBlckdyb3VwKTsKLSAgICAgICAgICBlc3RpbWF0ZWRQbnNCaXRzICs9IHFjT3V0WzBdLT5wUWNPdXRDaGFubmVsc1tjaF0tPnNlY3Rpb25EYXRhLm5vaXNlTnJnQml0czsKKyAgfSAvKiAtZW5kLSBzdWIgZnJhbWUgY291bnRlciAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgSU5UIGl0ZXJhdGlvbnNbKDEpXVsoKDgpKV07CisgIElOVCBjaENvbnN0cmFpbnRzRnVsZmlsbGVkWygxKV1bKCg4KSldWygyKV07CisgIElOVCBjYWxjdWxhdGVRdWFudFsoMSldWygoOCkpXVsoMildOworICBJTlQgY29uc3RyYWludHNGdWxmaWxsZWRbKDEpXVsoKDgpKV07CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAvKiBmb3IgKCBhbGwgc3ViIGZyYW1lcyApIC4uLiAqLworICBmb3IgKGMgPSAwOyBjIDwgblN1YkZyYW1lczsgYysrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CisgICAgICBJTlQgY2gsIG5DaGFubmVscyA9IGVsSW5mby5uQ2hhbm5lbHNJbkVsOworCisgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkgeworICAgICAgICAvKiBUdXJuIHRocmVzaG9sZHMgaW50byBzY2FsZWZhY3RvcnMsIG9wdGltaXplIGJpdCBjb25zdW1wdGlvbiBhbmQKKyAgICAgICAgICogdmVyaWZ5IGNvbmZvcm1hbmNlICovCisgICAgICAgIEZES2FhY0VuY19Fc3RpbWF0ZVNjYWxlRmFjdG9ycygKKyAgICAgICAgICAgIHBzeU91dFtjXS0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+cWNPdXRDaGFubmVsLCBoUUMtPmludlF1YW50LCBoUUMtPmRab25lUXVhbnRFbmFibGUsCisgICAgICAgICAgICBjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWwpOworCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0gPSAxOworICAgICAgICBpdGVyYXRpb25zW2NdW2ldID0gMDsKKworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICBjaENvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldW2NoXSA9IDE7CisgICAgICAgICAgY2FsY3VsYXRlUXVhbnRbY11baV1bY2hdID0gMTsKICAgICAgICAgfQotICAgICAgICBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgLT0gZXN0aW1hdGVkUG5zQml0czsKLSAgICAgIH0KLSNlbmRpZgogCi0gICAgICAvKiBmb3IgKCBhbGwgc3ViIGZyYW1lcyApIC4uLiAqLwotICAgICAgZm9yIChjID0gMCA7IGMgPCBuU3ViRnJhbWVzIDsgYysrICkKLSAgICAgIHsKLSAgICAgICAgICAvKiBmb3IgQ0JSIGFuZCBWQlIgbW9kZSAqLwotICAgICAgICAgIEZES2FhY0VuY19BZGp1c3RUaHJlc2hvbGRzKGhRQy0+aEFkalRoci0+YWRqVGhyU3RhdGVFbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dFtjXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbY10tPnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25zdGFudEJpdHJhdGVNb2RlKGhRQy0+Yml0cmF0ZU1vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+aEFkalRoci0+bWF4SXRlcjJuZEd1ZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtKTsKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0gICAgICB9IC8qIC1lbmQtIHN1YiBmcmFtZSBjb3VudGVyICovCisgICAgICB9IC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KIAotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgSU5UIGl0ZXJhdGlvbnNbKDEpXVsoOCldOwotICAgICAgSU5UIGNoQ29uc3RyYWludHNGdWxmaWxsZWRbKDEpXVsoOCldWygyKV07Ci0gICAgICBJTlQgY2FsY3VsYXRlUXVhbnRbKDEpXVsoOCldWygyKV07Ci0gICAgICBJTlQgY29uc3RyYWludHNGdWxmaWxsZWRbKDEpXVsoOCldOwotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIH0gLyogLWVuZC0gZWxlbWVudCBsb29wICovCiAKKyAgICBxY091dFtjXS0+dXNlZER5bkJpdHMgPSAtMTsKIAotICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KLSAgICAgIGZvciAoYyA9IDAgOyBjIDwgblN1YkZyYW1lcyA7IGMrKyApCi0gICAgICB7Ci0gICAgICAgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQorICB9IC8qIC1lbmQtIHN1YiBmcmFtZSBjb3VudGVyICovCisKKyAgSU5UIHF1YW50aXphdGlvbkRvbmUgPSAwOworICBJTlQgc3VtRHluQml0c0NvbnN1bWVkVG90YWwgPSAwOworICBJTlQgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IC0xOyAvKiBubyBkaXJlY3Rpb24geWV0ISAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgLyogLXN0YXJ0LSBRdWFudGl6YXRpb24gbG9vcCAuLi4gICAgICAgICAgICAgICAqLworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIGRvIC8qIHVudGlsIG1heCBhbGxvd2VkIGJpdHMgcGVyIGZyYW1lIGFuZCBtYXhEeW5CaXRzIT0tMSovCisgIHsKKyAgICBxdWFudGl6YXRpb25Eb25lID0gMDsKKworICAgIGMgPSAwOyAvKiBnZXQgZnJhbWUgdG8gcHJvY2VzcyAqLworCisgICAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CisgICAgICBJTlQgY2gsIG5DaGFubmVscyA9IGVsSW5mby5uQ2hhbm5lbHNJbkVsOworCisgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkgeworICAgICAgICBkbyAvKiB1bnRpbCBlbGVtZW50IGJpdHMgPCBuQ2hhbm5lbHMqTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOICovCisgICAgICAgIHsKKyAgICAgICAgICBkbyAvKiB1bnRpbCBzcGVjdHJhbCB2YWx1ZXMgPCBNQVhfUVVBTlQgKi8KICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwotICAgICAgICAgICAgICBJTlQgY2gsIG5DaGFubmVscyA9IGVsSW5mby5uQ2hhbm5lbHNJbkVsOwotCi0gICAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKLSAgICAgICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAvKiBUdXJuIHRocmVzaG9sZHMgaW50byBzY2FsZWZhY3RvcnMsIG9wdGltaXplIGJpdCBjb25zdW1wdGlvbiBhbmQgdmVyaWZ5IGNvbmZvcm1hbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX0VzdGltYXRlU2NhbGVGYWN0b3JzKHBzeU91dFtjXS0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLT5xY091dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+aW52UXVhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+ZFpvbmVRdWFudEVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsKTsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb25zW2NdW2ldID0gMCA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBjaENvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldW2NoXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVF1YW50W2NdW2ldW2NoXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgICAgICAgICAgIH0gIC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KLQotICAgICAgICAgIH0gIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLwotCi0gICAgICAgICAgcWNPdXRbY10tPnVzZWREeW5CaXRzID0gLTE7Ci0KLSAgICAgIH0gLyogLWVuZC0gc3ViIGZyYW1lIGNvdW50ZXIgKi8KLQotCi0KLSAgICAgIElOVCBxdWFudGl6YXRpb25Eb25lID0gMDsKLSAgICAgIElOVCBzdW1EeW5CaXRzQ29uc3VtZWRUb3RhbCAgPSAwOwotICAgICAgSU5UIGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPSAtMTsgLyogbm8gZGlyZWN0aW9uIHlldCEgKi8KLQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgLyogLXN0YXJ0LSBRdWFudGl6YXRpb24gbG9vcCAuLi4gICAgICAgICAgICAgICAqLwotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgZG8gLyogdW50aWwgbWF4IGFsbG93ZWQgYml0cyBwZXIgZnJhbWUgYW5kIG1heER5bkJpdHMhPS0xKi8KLSAgICAgIHsKLSAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsKLQotICAgICAgICAgICAgICBjID0gMDsgICAgICAgICAgICAgIC8qIGdldCBmcmFtZSB0byBwcm9jZXNzICovCi0KLSAgICAgICAgICAgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKLSAgICAgICAgICAgICAgICAgIElOVCBjaCwgbkNoYW5uZWxzID0gZWxJbmZvLm5DaGFubmVsc0luRWw7Ci0KLSAgICAgICAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGRvIC8qIHVudGlsIHNwZWN0cmFsIHZhbHVlcyA8IE1BWF9RVUFOVCAqLwotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfcmVkdWNlQml0Q29uc3VtcHRpb24oJml0ZXJhdGlvbnNbY11baV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5tYXhJdGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWNyZWFzZUJpdENvbnN1bXB0aW9uKSA/IDEgOiAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVF1YW50W2NdW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbY10tPnBzeU91dEVsZW1lbnRbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbY10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSA9IDEgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemUgc3BlY3RydW0gKHBlciBlYWNoIGNoYW5uZWwpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXVtjaF0gPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxjdWxhdGVRdWFudFtjXVtpXVtjaF0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2ggPSBxY0VsZW1lbnRbY11baV0tPnFjT3V0Q2hhbm5lbFtjaF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaCA9IHBzeU91dFtjXS0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbFtjaF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVRdWFudFtjXVtpXVtjaF0gPSAwOyAvKiBjYWxjdWxhdGUgcXVhbnRpemF0aW9uIG9ubHkgaWYgbmVjZXNzYXJ5ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX1F1YW50aXplU3BlY3RydW0ocHN5T3V0Q2gtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJPZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5nbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5xdWFudFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5kWm9uZVF1YW50RW5hYmxlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRkRLYWFjRW5jX2NhbGNNYXhWYWx1ZUluU2ZiKHBzeU91dENoLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiT2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+cXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5tYXhWYWx1ZUluU2ZiKSA+IE1BWF9RVUFOVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldW2NoXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSA9IDAgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgcXVhbml6dGVkIHZhbHVlIG91dCBvZiByYW5nZTsgaW5jcmVhc2UgZ2xvYmFsIGdhaW4hICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyZWFzZUJpdENvbnN1bXB0aW9uID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogaWYgY2FsY3VsYXRlUXVhbnRbY11baV1bY2hdICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBjaGFubmVsIGxvb3AgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXplIHNwZWN0cnVtIChwZXIgZWFjaCBjaGFubmVsKSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSkgOyAvKiBkb2VzIG5vdCByZWdhcmQgYml0IGNvbnN1bXB0aW9uICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLT5keW5CaXRzVXNlZCA9IDAgOyAvKiByZXNldCBkeW5hbWljIGJpdHMgKi8KLQotICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiB2YWxpZCBpbiBjdXJyZW50IGNoYW5uZWwhICovCi0gICAgICAgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2ggPSBxY0VsZW1lbnRbY11baV0tPnFjT3V0Q2hhbm5lbFtjaF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2ggPSBwc3lPdXRbY10tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvdW50IGR5bmFtaWMgYml0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2hEeW5CaXRzID0gRkRLYWFjRW5jX2R5bkJpdENvdW50KGhRQy0+aEJpdENvdW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+cXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPm1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+c2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5sYXN0V2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJPZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dENoLT5zZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+bm9pc2VOcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPmlzQm9vaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+aXNTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncykgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBkeW5hbWljIGNoYW5uZWwgYml0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbY11baV0tPmR5bkJpdHNVc2VkICs9IGNoRHluQml0czsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGR5bkJpdHNVc2VkIGZvciBjb3JyZWN0aW9uIG9mIGJpdHMycGUgcmVsYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICBpZihoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXS0+ZHluQml0c0xhc3Q9PS0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+aEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldLT5keW5CaXRzTGFzdCA9IHFjRWxlbWVudFtjXVtpXS0+ZHluQml0c1VzZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwotCi0gICAgICAgICAgICAgIH0gIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLwotCi0gICAgICAgICAgICAgIC8qIHVwZGF0ZSBkeW5CaXRzIG9mIGN1cnJlbnQgc3ViRnJhbWUgKi8KLSAgICAgICAgICAgICAgRkRLYWFjRW5jX3VwZGF0ZVVzZWREeW5CaXRzKCZxY091dFtjXS0+dXNlZER5bkJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbY10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSk7Ci0KLSAgICAgICAgICAgICAgLyogZ2V0IHRvdGFsIGNvbnN1bWVkIGJpdHMsIGR5biBiaXRzIGluIGFsbCBzdWIgZnJhbWVzIGhhdmUgdG8gYmUgdmFsaWQgKi8KLSAgICAgICAgICAgICAgc3VtRHluQml0c0NvbnN1bWVkVG90YWwgPSBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZER5bkJpdHMocWNPdXQsIG5TdWJGcmFtZXMpOwotCi0gICAgICAgICAgICAgIGlmIChzdW1EeW5CaXRzQ29uc3VtZWRUb3RhbD09LTEpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAwOyAvKiBiaXQgY29uc3VtcHRpb24gbm90IHZhbGlkIGluIGFsbCBzdWIgZnJhbWVzICovCisgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICBpZiAoIWNvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldKSB7CisgICAgICAgICAgICAgIGlmICgoRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfcmVkdWNlQml0Q29uc3VtcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICZpdGVyYXRpb25zW2NdW2ldLCBoUUMtPm1heEl0ZXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIChkZWNyZWFzZUJpdENvbnN1bXB0aW9uKSA/IDEgOiAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSwgY2FsY3VsYXRlUXVhbnRbY11baV0sCisgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50W2ldLCBxY091dFtjXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLCBoUUMtPmVsZW1lbnRCaXRzW2ldLCBhb3QsIHN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZykpICE9IEFBQ19FTkNfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHN1bUJpdHNDb25zdW1lZFRvdGFsID0gRkRLYWFjRW5jX2dldFRvdGFsQ29uc3VtZWRCaXRzKHFjT3V0LCBxY0VsZW1lbnQsIGNtLCBoUUMtPmdsb2JIZHJCaXRzLCBuU3ViRnJhbWVzKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIC8qIGluIGFsbCBmcmFtZXMgYXJlIHZhbGlkIGR5bmFtaWMgYml0cyAqLwotICAgICAgICAgICAgICAgIGlmICggKChzdW1CaXRzQ29uc3VtZWRUb3RhbCA8IHRvdGFsQXZhaWxhYmxlQml0cykgfHwgcWNPdXRbY10tPnVzZWREeW5CaXRzPT0wKSAmJiAoZGVjcmVhc2VCaXRDb25zdW1wdGlvbj09MSkgJiYgY2hlY2tNaW5GcmFtZUJpdHNEZW1hbmQocWNPdXQsaFFDLT5taW5CaXRzUGVyRnJhbWUsblN1YkZyYW1lcykKLSAgICAgICAgICAgICAgICAgICAgICAvKigpKi8gICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAxOyAvKiBleGl0IGJpdCBhZGp1c3RtZW50ICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdW1CaXRzQ29uc3VtZWRUb3RhbCA+IHRvdGFsQXZhaWxhYmxlQml0cyAmJiAoZGVjcmVhc2VCaXRDb25zdW1wdGlvbj09MCkgKQotLy8gICAgICAgICAgICAgICAgICAgICAgLyooKSovICApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsgLyogcmVzZXQhICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0gPSAxOwogCisgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICAvKiBxdWFudGl6ZSBzcGVjdHJ1bSAocGVyIGVhY2ggY2hhbm5lbCkgKi8KKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICAgIGNoQ29uc3RyYWludHNGdWxmaWxsZWRbY11baV1bY2hdID0gMTsKKworICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAgICAgICAgICAgaWYgKGNhbGN1bGF0ZVF1YW50W2NdW2ldW2NoXSkgeworICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoID0gcWNFbGVtZW50W2NdW2ldLT5xY091dENoYW5uZWxbY2hdOworICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2ggPQorICAgICAgICAgICAgICAgICAgICBwc3lPdXRbY10tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdOworCisgICAgICAgICAgICAgICAgY2FsY3VsYXRlUXVhbnRbY11baV1bY2hdID0KKyAgICAgICAgICAgICAgICAgICAgMDsgLyogY2FsY3VsYXRlIHF1YW50aXphdGlvbiBvbmx5IGlmIG5lY2Vzc2FyeSAqLworCisgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgICAgIEZES2FhY0VuY19RdWFudGl6ZVNwZWN0cnVtKAorICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiQ250LCBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJQZXJHcm91cCwgcHN5T3V0Q2gtPnNmYk9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPm1kY3RTcGVjdHJ1bSwgcWNPdXRDaC0+Z2xvYmFsR2FpbiwgcWNPdXRDaC0+c2NmLAorICAgICAgICAgICAgICAgICAgICBxY091dENoLT5xdWFudFNwZWMsIGhRQy0+ZFpvbmVRdWFudEVuYWJsZSk7CisKKyAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICAgICAgaWYgKEZES2FhY0VuY19jYWxjTWF4VmFsdWVJblNmYigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJDbnQsIHBzeU91dENoLT5tYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJQZXJHcm91cCwgcHN5T3V0Q2gtPnNmYk9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5xdWFudFNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5tYXhWYWx1ZUluU2ZiKSA+IE1BWF9RVUFOVCkgeworICAgICAgICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXVtjaF0gPSAwOworICAgICAgICAgICAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0gPSAwOworICAgICAgICAgICAgICAgICAgLyogaWYgcXVhbml6dGVkIHZhbHVlIG91dCBvZiByYW5nZTsgaW5jcmVhc2UgZ2xvYmFsIGdhaW4hICovCisgICAgICAgICAgICAgICAgICBkZWNyZWFzZUJpdENvbnN1bXB0aW9uID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAgICAgICAgICAgfSAvKiBpZiBjYWxjdWxhdGVRdWFudFtjXVtpXVtjaF0gKi8KKworICAgICAgICAgICAgfSAvKiBjaGFubmVsIGxvb3AgKi8KKworICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgLyogcXVhbnRpemUgc3BlY3RydW0gKHBlciBlYWNoIGNoYW5uZWwpICovCisKKyAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgICAgICAgIH0gd2hpbGUgKCFjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSk7IC8qIGRvZXMgbm90IHJlZ2FyZCBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1wdGlvbiAqLwogCiAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICBxY0VsZW1lbnRbY11baV0tPmR5bkJpdHNVc2VkID0gMDsgLyogcmVzZXQgZHluYW1pYyBiaXRzICovCiAKLSAgICAgICAgICAgICAgaW50IGVtZXJnZW5jeUl0ZXJhdGlvbnMgPSAxOwotICAgICAgICAgICAgICBpbnQgZHluQml0c092ZXJzaG9vdCAgICA9IDA7CisgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHZhbGlkIGluIGN1cnJlbnQgY2hhbm5lbCEgKi8KKyAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoID0gcWNFbGVtZW50W2NdW2ldLT5xY091dENoYW5uZWxbY2hdOworICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaCA9CisgICAgICAgICAgICAgICAgcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXTsKIAotICAgICAgICAgICAgICBmb3IgKGMgPSAwIDsgYyA8IG5TdWJGcmFtZXMgOyBjKysgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CisgICAgICAgICAgICAvKiBjb3VudCBkeW5hbWljIGJpdHMgKi8KKyAgICAgICAgICAgIElOVCBjaER5bkJpdHMgPSBGREthYWNFbmNfZHluQml0Q291bnQoCisgICAgICAgICAgICAgICAgaFFDLT5oQml0Q291bnRlciwgcWNPdXRDaC0+cXVhbnRTcGVjLCBxY091dENoLT5tYXhWYWx1ZUluU2ZiLAorICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnNjZiwgcHN5T3V0Q2gtPmxhc3RXaW5kb3dTZXF1ZW5jZSwgcHN5T3V0Q2gtPnNmYkNudCwKKyAgICAgICAgICAgICAgICBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAsIHBzeU91dENoLT5zZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiT2Zmc2V0cywgJnFjT3V0Q2gtPnNlY3Rpb25EYXRhLCBwc3lPdXRDaC0+bm9pc2VOcmcsCisgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPmlzQm9vaywgcHN5T3V0Q2gtPmlzU2NhbGUsIHN5bnRheEZsYWdzKTsKIAotICAgICAgICAgICAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRpb24gbGltaXRhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZW1lcmdlbmN5SXRlcmF0aW9ucyAmPSAoKGl0ZXJhdGlvbnNbY11baV0gPCBoUUMtPm1heEl0ZXJhdGlvbnMpID8gMCA6IDEpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIC8qIGRldGVjdGlvbiBpZiB1c2VkIGR5biBiaXRzIGV4Y2VlZHMgdGhlIG1heGltYWwgYWxsb3dlZCBjcml0ZXJpb24gKi8KLSAgICAgICAgICAgICAgICAgIGR5bkJpdHNPdmVyc2hvb3QgfD0gKChxY091dFtjXS0+dXNlZER5bkJpdHMgPiBxY091dFtjXS0+bWF4RHluQml0cykgPyAxIDogMCk7Ci0gICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHN1bSB1cCBkeW5hbWljIGNoYW5uZWwgYml0cyAqLworICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLT5keW5CaXRzVXNlZCArPSBjaER5bkJpdHM7CisgICAgICAgICAgfQogCi0gICAgICAgICAgICAgIGlmIChxdWFudGl6YXRpb25Eb25lPT0wIHx8IGR5bkJpdHNPdmVyc2hvb3QpCi0gICAgICAgICAgICAgIHsKKyAgICAgICAgICAvKiBzYXZlIGR5bkJpdHNVc2VkIGZvciBjb3JyZWN0aW9uIG9mIGJpdHMycGUgcmVsYXRpb24gKi8KKyAgICAgICAgICBpZiAoaFFDLT5oQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0tPmR5bkJpdHNMYXN0ID09IC0xKSB7CisgICAgICAgICAgICBoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXS0+ZHluQml0c0xhc3QgPQorICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+ZHluQml0c1VzZWQ7CisgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICBpbnQgc3VtQml0c0NvbnN1bWVkVG90YWwgPSBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZEJpdHMocWNPdXQsIHFjRWxlbWVudCwgY20sIGhRQy0+Z2xvYkhkckJpdHMsIG5TdWJGcmFtZXMpOworICAgICAgICAgIC8qIGhvbGQgdG90YWwgYml0IGNvbnN1bXB0aW9uIGluIHByZXNlbnQgZWxlbWVudCBiZWxvdyBtYXhpbXVtIGFsbG93ZWQKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocWNFbGVtZW50W2NdW2ldLT5keW5CaXRzVXNlZCA+CisgICAgICAgICAgICAgICgobkNoYW5uZWxzICogTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOKSAtCisgICAgICAgICAgICAgICBxY0VsZW1lbnRbY11baV0tPnN0YXRpY0JpdHNVc2VkIC0KKyAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+ZXh0Qml0c1VzZWQpKSB7CisgICAgICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSA9IDA7CisgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICBpZiAoIChzdW1EeW5CaXRzQ29uc3VtZWRUb3RhbCA+PSBhdmdUb3RhbER5bkJpdHMpIHx8IChzdW1EeW5CaXRzQ29uc3VtZWRUb3RhbD09MCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDE7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAoZW1lcmdlbmN5SXRlcmF0aW9ucyAmJiAoc3VtQml0c0NvbnN1bWVkVG90YWwgPCB0b3RhbEF2YWlsYWJsZUJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDE7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAoKHN1bUJpdHNDb25zdW1lZFRvdGFsID4gdG90YWxBdmFpbGFibGVCaXRzKSB8fCAhY2hlY2tNaW5GcmFtZUJpdHNEZW1hbmQocWNPdXQsaFFDLT5taW5CaXRzUGVyRnJhbWUsblN1YkZyYW1lcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmICgoc3VtQml0c0NvbnN1bWVkVG90YWwgPCB0b3RhbEF2YWlsYWJsZUJpdHMpICYmIGNoZWNrTWluRnJhbWVCaXRzRGVtYW5kKHFjT3V0LGhRQy0+bWluQml0c1BlckZyYW1lLG5TdWJGcmFtZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICBkZWNyZWFzZUJpdENvbnN1bXB0aW9uID0gMTsKLSAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoIWNvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldKTsKIAotICAgICAgICAgICAgICAgICAgaWYgKGR5bkJpdHNPdmVyc2hvb3QpIHsKLSAgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IDE7Ci0gICAgICAgICAgICAgICAgICB9CisgICAgICB9IC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KIAotICAgICAgICAgICAgICAgICAgLyogcmVzZXQgY29uc3RyYWludHMgZnVsbGZpbGxlZCBmbGFncyAqLwotICAgICAgICAgICAgICAgICAgRkRLbWVtY2xlYXIoY29uc3RyYWludHNGdWxmaWxsZWQsIHNpemVvZihjb25zdHJhaW50c0Z1bGZpbGxlZCkpOwotICAgICAgICAgICAgICAgICAgRkRLbWVtY2xlYXIoY2hDb25zdHJhaW50c0Z1bGZpbGxlZCwgc2l6ZW9mKGNoQ29uc3RyYWludHNGdWxmaWxsZWQpKTsKKyAgICB9IC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLwogCisgICAgLyogdXBkYXRlIGR5bkJpdHMgb2YgY3VycmVudCBzdWJGcmFtZSAqLworICAgIEZES2FhY0VuY191cGRhdGVVc2VkRHluQml0cygmcWNPdXRbY10tPnVzZWREeW5CaXRzLCBxY0VsZW1lbnRbY10sIGNtKTsKIAotICAgICAgICAgICAgICB9LyogcXVhbnRpemF0aW9uRG9uZSAqLworICAgIC8qIGdldCB0b3RhbCBjb25zdW1lZCBiaXRzLCBkeW4gYml0cyBpbiBhbGwgc3ViIGZyYW1lcyBoYXZlIHRvIGJlIHZhbGlkICovCisgICAgc3VtRHluQml0c0NvbnN1bWVkVG90YWwgPQorICAgICAgICBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZER5bkJpdHMocWNPdXQsIG5TdWJGcmFtZXMpOwogCi0gICAgICB9IHdoaWxlICghcXVhbnRpemF0aW9uRG9uZSkgOworICAgIGlmIChzdW1EeW5CaXRzQ29uc3VtZWRUb3RhbCA9PSAtMSkgeworICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDA7IC8qIGJpdCBjb25zdW1wdGlvbiBub3QgdmFsaWQgaW4gYWxsIHN1YiBmcmFtZXMgKi8KKyAgICB9IGVsc2UgeworICAgICAgaW50IHN1bUJpdHNDb25zdW1lZFRvdGFsID0gRkRLYWFjRW5jX2dldFRvdGFsQ29uc3VtZWRCaXRzKAorICAgICAgICAgIHFjT3V0LCBxY0VsZW1lbnQsIGNtLCBoUUMtPmdsb2JIZHJCaXRzLCBuU3ViRnJhbWVzKTsKIAotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgLyogLi4uIC1lbmQtIFF1YW50aXphdGlvbiBsb29wICAgICAgICAgICAgICAgICAqLwotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgLyogaW4gYWxsIGZyYW1lcyBhcmUgdmFsaWQgZHluYW1pYyBiaXRzICovCisgICAgICBpZiAoKChzdW1CaXRzQ29uc3VtZWRUb3RhbCA8IHRvdGFsQXZhaWxhYmxlQml0cykgfHwKKyAgICAgICAgICAgc3VtRHluQml0c0NvbnN1bWVkVG90YWwgPT0gMCkgJiYKKyAgICAgICAgICAoZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9PSAxKSAmJgorICAgICAgICAgIGNoZWNrTWluRnJhbWVCaXRzRGVtYW5kKHFjT3V0LCBoUUMtPm1pbkJpdHNQZXJGcmFtZSwgblN1YkZyYW1lcykKKyAgICAgICAgICAvKigpKi8pIHsKKyAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDE7IC8qIGV4aXQgYml0IGFkanVzdG1lbnQgKi8KKyAgICAgIH0KKyAgICAgIGlmIChzdW1CaXRzQ29uc3VtZWRUb3RhbCA+IHRvdGFsQXZhaWxhYmxlQml0cyAmJgorICAgICAgICAgIChkZWNyZWFzZUJpdENvbnN1bXB0aW9uID09IDApKSB7CisgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAwOyAvKiByZXNldCEgKi8KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBpbnQgZW1lcmdlbmN5SXRlcmF0aW9ucyA9IDE7CisgICAgaW50IGR5bkJpdHNPdmVyc2hvb3QgPSAwOworCisgICAgZm9yIChjID0gMDsgYyA8IG5TdWJGcmFtZXM7IGMrKykgeworICAgICAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKKworICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKSB7CisgICAgICAgICAgLyogaXRlcmF0aW9uIGxpbWl0YXRpb24gKi8KKyAgICAgICAgICBlbWVyZ2VuY3lJdGVyYXRpb25zICY9CisgICAgICAgICAgICAgICgoaXRlcmF0aW9uc1tjXVtpXSA8IGhRQy0+bWF4SXRlcmF0aW9ucykgPyAwIDogMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIGRldGVjdGlvbiBpZiB1c2VkIGR5biBiaXRzIGV4Y2VlZHMgdGhlIG1heGltYWwgYWxsb3dlZCBjcml0ZXJpb24gKi8KKyAgICAgIGR5bkJpdHNPdmVyc2hvb3QgfD0KKyAgICAgICAgICAoKHFjT3V0W2NdLT51c2VkRHluQml0cyA+IHFjT3V0W2NdLT5tYXhEeW5CaXRzKSA/IDEgOiAwKTsKKyAgICB9CisKKyAgICBpZiAocXVhbnRpemF0aW9uRG9uZSA9PSAwIHx8IGR5bkJpdHNPdmVyc2hvb3QpIHsKKyAgICAgIGludCBzdW1CaXRzQ29uc3VtZWRUb3RhbCA9IEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkQml0cygKKyAgICAgICAgICBxY091dCwgcWNFbGVtZW50LCBjbSwgaFFDLT5nbG9iSGRyQml0cywgblN1YkZyYW1lcyk7CisKKyAgICAgIGlmICgoc3VtRHluQml0c0NvbnN1bWVkVG90YWwgPj0gYXZnVG90YWxEeW5CaXRzKSB8fAorICAgICAgICAgIChzdW1EeW5CaXRzQ29uc3VtZWRUb3RhbCA9PSAwKSkgeworICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMTsKKyAgICAgIH0KKyAgICAgIGlmIChlbWVyZ2VuY3lJdGVyYXRpb25zICYmIChzdW1CaXRzQ29uc3VtZWRUb3RhbCA8IHRvdGFsQXZhaWxhYmxlQml0cykpIHsKKyAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDE7CisgICAgICB9CisgICAgICBpZiAoKHN1bUJpdHNDb25zdW1lZFRvdGFsID4gdG90YWxBdmFpbGFibGVCaXRzKSB8fAorICAgICAgICAgICFjaGVja01pbkZyYW1lQml0c0RlbWFuZChxY091dCwgaFFDLT5taW5CaXRzUGVyRnJhbWUsIG5TdWJGcmFtZXMpKSB7CisgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAwOworICAgICAgfQorICAgICAgaWYgKChzdW1CaXRzQ29uc3VtZWRUb3RhbCA8IHRvdGFsQXZhaWxhYmxlQml0cykgJiYKKyAgICAgICAgICBjaGVja01pbkZyYW1lQml0c0RlbWFuZChxY091dCwgaFFDLT5taW5CaXRzUGVyRnJhbWUsIG5TdWJGcmFtZXMpKSB7CisgICAgICAgIGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IDE7CisgICAgICB9CisKKyAgICAgIGlmIChkeW5CaXRzT3ZlcnNob290KSB7CisgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAwOworICAgICAgICBkZWNyZWFzZUJpdENvbnN1bXB0aW9uID0gMTsKKyAgICAgIH0KKworICAgICAgLyogcmVzZXQgY29uc3RyYWludHMgZnVsbGZpbGxlZCBmbGFncyAqLworICAgICAgRkRLbWVtY2xlYXIoY29uc3RyYWludHNGdWxmaWxsZWQsIHNpemVvZihjb25zdHJhaW50c0Z1bGZpbGxlZCkpOworICAgICAgRkRLbWVtY2xlYXIoY2hDb25zdHJhaW50c0Z1bGZpbGxlZCwgc2l6ZW9mKGNoQ29uc3RyYWludHNGdWxmaWxsZWQpKTsKKworICAgIH0gLyogcXVhbnRpemF0aW9uRG9uZSAqLworCisgIH0gd2hpbGUgKCFxdWFudGl6YXRpb25Eb25lKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIC4uLiAtZW5kLSBRdWFudGl6YXRpb24gbG9vcCAgICAgICAgICAgICAgICAgKi8KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTE3OCwxMTIgKzExMzIsOTggQEAKICAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKLQotc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19yZWR1Y2VCaXRDb25zdW1wdGlvbihpbnQqICAgICAgICAgICAgIGl0ZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICBtYXhJdGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZ2FpbkFkanVzdG1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgICBjaENvbnN0cmFpbnRzRnVsZmlsbGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICAgY2FsY3VsYXRlUXVhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogICAgICAgICAgcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICBxY091dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiAgICBlbEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICBlcENvbmZpZykKLXsKK3N0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcmVkdWNlQml0Q29uc3VtcHRpb24oCisgICAgaW50KiBpdGVyYXRpb25zLCBjb25zdCBpbnQgbWF4SXRlcmF0aW9ucywgaW50IGdhaW5BZGp1c3RtZW50LAorICAgIGludCogY2hDb25zdHJhaW50c0Z1bGZpbGxlZCwgaW50KiBjYWxjdWxhdGVRdWFudCwgaW50IG5DaGFubmVscywKKyAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsIFFDX09VVCogcWNPdXQsIFFDX09VVF9FTEVNRU5UKiBxY091dEVsZW1lbnQsCisgICAgRUxFTUVOVF9CSVRTKiBlbEJpdHMsIEFVRElPX09CSkVDVF9UWVBFIGFvdCwgVUlOVCBzeW50YXhGbGFncywKKyAgICBTQ0hBUiBlcENvbmZpZykgewogICBpbnQgY2g7CiAKICAgLyoqIFNPTFZJTkcgUFJPQkxFTSAqKi8KLSAgaWYgKCgqaXRlcmF0aW9ucykrKyA+PSBtYXhJdGVyYXRpb25zKQotICB7Ci0gICAgaWYgKHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQ9PTApIHsKLSAgICB9Ci0gICAgLyogY3Jhc2ggcmVjb3ZlcnkgKi8KLSAgICBlbHNlIHsKLSAgICAgIElOVCBiaXRzVG9TYXZlID0gMDsKLSAgICAgIGlmICggKGJpdHNUb1NhdmUgPSBmaXhNYXgoKHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgKyA4KSAtIChlbEJpdHMtPmJpdFJlc0xldmVsRWwgKyBxY091dEVsZW1lbnQtPmdyYW50ZWREeW5CaXRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgKyBxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkICsgOCkgLSAoZWxCaXRzLT5tYXhCaXRzRWwpKSkgPiAwICkKLSAgICAgIHsKLSAgICAgICAgRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkobkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgcWNPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgIGJpdHNUb1NhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnKSA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCi0gICAgICB7Ci0gICAgICAgICAgcWNPdXRFbGVtZW50LT5xY091dENoYW5uZWxbY2hdLT5nbG9iYWxHYWluICs9IDE7Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKLSAgICB7Ci0gICAgICBjYWxjdWxhdGVRdWFudFtjaF0gPSAxOwotICAgIH0KLSAgfQotICB9Ci0gIGVsc2UgLyogaXRlcmF0aW9ucyA+PSBtYXhJdGVyYXRpb25zICovCi0gIHsKKyAgaWYgKCgqaXRlcmF0aW9ucykgPCBtYXhJdGVyYXRpb25zKSB7CiAgICAgLyogaW5jcmVhc2UgZ2FpbiAoKyBuZXh0IGl0ZXJhdGlvbikgKi8KLSAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCi0gICAgewotICAgICAgaWYoIWNoQ29uc3RyYWludHNGdWxmaWxsZWRbY2hdKQotICAgICAgewotICAgICAgICAgIHFjT3V0RWxlbWVudC0+cWNPdXRDaGFubmVsW2NoXS0+Z2xvYmFsR2FpbiArPSBnYWluQWRqdXN0bWVudCA7Ci0gICAgICAgICAgY2FsY3VsYXRlUXVhbnRbY2hdID0gMTsgLyogZ2xvYmFsIGdhaW4gaGFzIGNoYW5nZWQsIHJlY2FsY3VsYXRlIHF1YW50aXphdGlvbiBpbiBuZXh0IGl0ZXJhdGlvbiEgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIGlmICghY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjaF0pIHsKKyAgICAgICAgcWNPdXRFbGVtZW50LT5xY091dENoYW5uZWxbY2hdLT5nbG9iYWxHYWluICs9IGdhaW5BZGp1c3RtZW50OworICAgICAgICBjYWxjdWxhdGVRdWFudFtjaF0gPSAxOyAvKiBnbG9iYWwgZ2FpbiBoYXMgY2hhbmdlZCwgcmVjYWxjdWxhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIGluIG5leHQgaXRlcmF0aW9uISAqLwogICAgICAgfQogICAgIH0KKyAgfSBlbHNlIGlmICgoKml0ZXJhdGlvbnMpID09IG1heEl0ZXJhdGlvbnMpIHsKKyAgICBpZiAocWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCA9PSAwKSB7CisgICAgICByZXR1cm4gQUFDX0VOQ19RVUFOVF9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgLyogY3Jhc2ggcmVjb3ZlcnkgKi8KKyAgICAgIElOVCBiaXRzVG9TYXZlID0gMDsKKyAgICAgIGlmICgoYml0c1RvU2F2ZSA9IGZpeE1heCgKKyAgICAgICAgICAgICAgIChxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkICsgOCkgLQorICAgICAgICAgICAgICAgICAgIChlbEJpdHMtPmJpdFJlc0xldmVsRWwgKyBxY091dEVsZW1lbnQtPmdyYW50ZWREeW5CaXRzKSwKKyAgICAgICAgICAgICAgIChxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkICsgcWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCArIDgpIC0KKyAgICAgICAgICAgICAgICAgICAoZWxCaXRzLT5tYXhCaXRzRWwpKSkgPiAwKSB7CisgICAgICAgIEZES2FhY0VuY19jcmFzaFJlY292ZXJ5KG5DaGFubmVscywgcHN5T3V0RWxlbWVudCwgcWNPdXQsIHFjT3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c1RvU2F2ZSwgYW90LCBzeW50YXhGbGFncywgZXBDb25maWcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgcWNPdXRFbGVtZW50LT5xY091dENoYW5uZWxbY2hdLT5nbG9iYWxHYWluICs9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgICAgICBjYWxjdWxhdGVRdWFudFtjaF0gPSAxOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiAoKml0ZXJhdGlvbnMpID4gbWF4SXRlcmF0aW9ucyAqLworICAgIHJldHVybiBBQUNfRU5DX1FVQU5UX0VSUk9SOwogICB9CisgICgqaXRlcmF0aW9ucykrKzsKIAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3VwZGF0ZUZpbGxCaXRzKENIQU5ORUxfTUFQUElORyogICAgICAgICAgY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfU1RBVEUqICAgICAgICAgICAgICAgICBxY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0JJVFMqIFJFU1RSSUNUICAgIGVsQml0c1soOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCoqICAgICAgICAgICAgICAgICAgcWNPdXQpCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfdXBkYXRlRmlsbEJpdHMoQ0hBTk5FTF9NQVBQSU5HKiBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSogcWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBSRVNUUklDVCBlbEJpdHNbKCg4KSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCoqIHFjT3V0KSB7CiAgIHN3aXRjaCAocWNLZXJuZWwtPmJpdHJhdGVNb2RlKSB7CiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9TRlI6CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfRkY6Ci0gICAgICAgYnJlYWs7Ci0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzE6CiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMjoKICAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8zOgogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzQ6CiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfNToKLSAgICAgIHFjT3V0WzBdLT50b3RGaWxsQml0cyA9IChxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgLSBxY091dFswXS0+dXNlZER5bkJpdHMpJjc7IC8qIHByZWNhbGN1bGF0ZSBhbGlnbm1lbnQgYml0cyAqLwotICAgICAgcWNPdXRbMF0tPnRvdGFsQml0cyA9IHFjT3V0WzBdLT5zdGF0aWNCaXRzICsgcWNPdXRbMF0tPnVzZWREeW5CaXRzICsgcWNPdXRbMF0tPnRvdEZpbGxCaXRzICsgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzICsgcWNPdXRbMF0tPmdsb2JhbEV4dEJpdHM7Ci0gICAgICBxY091dFswXS0+dG90RmlsbEJpdHMgKz0gKCBmaXhNYXgoMCwgcWNLZXJuZWwtPm1pbkJpdHNQZXJGcmFtZSAtIHFjT3V0WzBdLT50b3RhbEJpdHMpICsgNykgJiB+NzsKKyAgICAgIHFjT3V0WzBdLT50b3RGaWxsQml0cyA9CisgICAgICAgICAgKHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyAtIHFjT3V0WzBdLT51c2VkRHluQml0cykgJgorICAgICAgICAgIDc7IC8qIHByZWNhbGN1bGF0ZSBhbGlnbm1lbnQgYml0cyAqLworICAgICAgcWNPdXRbMF0tPnRvdGFsQml0cyA9IHFjT3V0WzBdLT5zdGF0aWNCaXRzICsgcWNPdXRbMF0tPnVzZWREeW5CaXRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dFswXS0+dG90RmlsbEJpdHMgKyBxY091dFswXS0+ZWxlbWVudEV4dEJpdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0WzBdLT5nbG9iYWxFeHRCaXRzOworICAgICAgcWNPdXRbMF0tPnRvdEZpbGxCaXRzICs9CisgICAgICAgICAgKGZpeE1heCgwLCBxY0tlcm5lbC0+bWluQml0c1BlckZyYW1lIC0gcWNPdXRbMF0tPnRvdGFsQml0cykgKyA3KSAmIH43OwogICAgICAgYnJlYWs7Ci0KICAgICBjYXNlIFFDREFUQV9CUl9NT0RFX0NCUjoKICAgICBjYXNlIFFDREFUQV9CUl9NT0RFX0lOVkFMSUQ6CiAgICAgZGVmYXVsdDoKLSAgICAgIElOVCBiaXRSZXNTcGFjZSA9IHFjS2VybmVsLT5iaXRSZXNUb3RNYXggLSBxY0tlcm5lbC0+Yml0UmVzVG90IDsKKyAgICAgIElOVCBiaXRSZXNTcGFjZSA9IHFjS2VybmVsLT5iaXRSZXNUb3RNYXggLSBxY0tlcm5lbC0+Yml0UmVzVG90OwogICAgICAgLyogcHJvY2Vzc2luZyBmaWxsLWJpdHMgKi8KLSAgICAgIElOVCBkZWx0YUJpdFJlcyA9IHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyAtIHFjT3V0WzBdLT51c2VkRHluQml0cyA7Ci0gICAgICBxY091dFswXS0+dG90RmlsbEJpdHMgPSBmaXhNYXgoKGRlbHRhQml0UmVzJjcpLCAoZGVsdGFCaXRSZXMgLSAoZml4TWF4KDAsYml0UmVzU3BhY2UtNykmfjcpKSk7Ci0gICAgICBxY091dFswXS0+dG90YWxCaXRzID0gcWNPdXRbMF0tPnN0YXRpY0JpdHMgKyBxY091dFswXS0+dXNlZER5bkJpdHMgKyBxY091dFswXS0+dG90RmlsbEJpdHMgKyBxY091dFswXS0+ZWxlbWVudEV4dEJpdHMgKyBxY091dFswXS0+Z2xvYmFsRXh0Qml0czsKLSAgICAgIHFjT3V0WzBdLT50b3RGaWxsQml0cyArPSAoIGZpeE1heCgwLCBxY0tlcm5lbC0+bWluQml0c1BlckZyYW1lIC0gcWNPdXRbMF0tPnRvdGFsQml0cykgKyA3KSAmIH43OworICAgICAgSU5UIGRlbHRhQml0UmVzID0gcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzIC0gcWNPdXRbMF0tPnVzZWREeW5CaXRzOworICAgICAgcWNPdXRbMF0tPnRvdEZpbGxCaXRzID0gZml4TWF4KAorICAgICAgICAgIChkZWx0YUJpdFJlcyAmIDcpLCAoZGVsdGFCaXRSZXMgLSAoZml4TWF4KDAsIGJpdFJlc1NwYWNlIC0gNykgJiB+NykpKTsKKyAgICAgIHFjT3V0WzBdLT50b3RhbEJpdHMgPSBxY091dFswXS0+c3RhdGljQml0cyArIHFjT3V0WzBdLT51c2VkRHluQml0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbMF0tPnRvdEZpbGxCaXRzICsgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dFswXS0+Z2xvYmFsRXh0Qml0czsKKyAgICAgIHFjT3V0WzBdLT50b3RGaWxsQml0cyArPQorICAgICAgICAgIChmaXhNYXgoMCwgcWNLZXJuZWwtPm1pbkJpdHNQZXJGcmFtZSAtIHFjT3V0WzBdLT50b3RhbEJpdHMpICsgNykgJiB+NzsKICAgICAgIGJyZWFrOwogICB9IC8qIHN3aXRjaCAocWNLZXJuZWwtPmJpdHJhdGVNb2RlKSAqLwogCiAgIHJldHVybiBBQUNfRU5DX09LOwogfQogCi0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNNYXhWYWx1ZUluU2ZiCkBAIC0xMjkyLDM0ICsxMjMyLDI5IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2NhbGNNYXhWYWx1ZUluU2ZiKElOVCAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICpSRVNUUklDVCBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpSRVNUUklDVCBxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpSRVNUUklDVCBtYXhWYWx1ZSkKLXsKLSAgSU5UIHNmYk9mZnMsc2ZiOworc3RhdGljIElOVCBGREthYWNFbmNfY2FsY01heFZhbHVlSW5TZmIoSU5UIHNmYkNudCwgSU5UIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNmYlBlckdyb3VwLCBJTlQqIFJFU1RSSUNUIHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUKiBSRVNUUklDVCBxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCogUkVTVFJJQ1QgbWF4VmFsdWUpIHsKKyAgSU5UIHNmYk9mZnMsIHNmYjsKICAgSU5UIG1heFZhbHVlQWxsID0gMDsKIAotICBmb3IgKHNmYk9mZnM9MDtzZmJPZmZzPHNmYkNudDtzZmJPZmZzKz1zZmJQZXJHcm91cCkKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykKLSAgICB7CisgIGZvciAoc2ZiT2ZmcyA9IDA7IHNmYk9mZnMgPCBzZmJDbnQ7IHNmYk9mZnMgKz0gc2ZiUGVyR3JvdXApCisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgIElOVCBsaW5lOwogICAgICAgSU5UIG1heFRoaXNTZmIgPSAwOwotICAgICAgZm9yIChsaW5lID0gc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiXTsgbGluZSA8IHNmYk9mZnNldFtzZmJPZmZzK3NmYisxXTsgbGluZSsrKQotICAgICAgeworICAgICAgZm9yIChsaW5lID0gc2ZiT2Zmc2V0W3NmYk9mZnMgKyBzZmJdOyBsaW5lIDwgc2ZiT2Zmc2V0W3NmYk9mZnMgKyBzZmIgKyAxXTsKKyAgICAgICAgICAgbGluZSsrKSB7CiAgICAgICAgIElOVCB0bXAgPSBmaXhwX2FicyhxdWFudFNwZWN0cnVtW2xpbmVdKTsKICAgICAgICAgbWF4VGhpc1NmYiA9IGZpeE1heCh0bXAsIG1heFRoaXNTZmIpOwogICAgICAgfQogCi0gICAgICBtYXhWYWx1ZVtzZmJPZmZzK3NmYl0gPSBtYXhUaGlzU2ZiOworICAgICAgbWF4VmFsdWVbc2ZiT2ZmcyArIHNmYl0gPSBtYXhUaGlzU2ZiOwogICAgICAgbWF4VmFsdWVBbGwgPSBmaXhNYXgobWF4VGhpc1NmYiwgbWF4VmFsdWVBbGwpOwogICAgIH0KICAgcmV0dXJuIG1heFZhbHVlQWxsOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfdXBkYXRlQml0cmVzCkBAIC0xMzI3LDIxICsxMjYyLDE4IEBACiAgICAgICAgICByZXR1cm46CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEZES2FhY0VuY191cGRhdGVCaXRyZXMoQ0hBTk5FTF9NQVBQSU5HICpjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSogcWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiogcWNPdXQpCi17Cit2b2lkIEZES2FhY0VuY191cGRhdGVCaXRyZXMoQ0hBTk5FTF9NQVBQSU5HKiBjbSwgUUNfU1RBVEUqIHFjS2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCoqIHFjT3V0KSB7CiAgIHN3aXRjaCAocWNLZXJuZWwtPmJpdHJhdGVNb2RlKSB7Ci0gICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9GRjoKICAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8xOgogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzI6CiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMzoKICAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl80OgogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzU6CiAgICAgICAvKiB2YXJpYWJsZSBiaXRyYXRlICovCi0gICAgICBxY0tlcm5lbC0+Yml0UmVzVG90ID0gRkRLbWluKHFjS2VybmVsLT5tYXhCaXRzUGVyRnJhbWUsIHFjS2VybmVsLT5iaXRSZXNUb3RNYXgpOworICAgICAgcWNLZXJuZWwtPmJpdFJlc1RvdCA9CisgICAgICAgICAgZk1pbihxY0tlcm5lbC0+bWF4Qml0c1BlckZyYW1lLCBxY0tlcm5lbC0+Yml0UmVzVG90TWF4KTsKICAgICAgIGJyZWFrOwotCiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9DQlI6CiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9TRlI6CiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9JTlZBTElEOgpAQCAtMTM0OSw3ICsxMjgxLDkgQEAKICAgICAgIGludCBjID0gMDsKICAgICAgIC8qIGNvbnN0YW50IGJpdHJhdGUgKi8KICAgICAgIHsKLSAgICAgICAgcWNLZXJuZWwtPmJpdFJlc1RvdCArPSBxY091dFtjXS0+Z3JhbnRlZER5bkJpdHMgLSAocWNPdXRbY10tPnVzZWREeW5CaXRzICsgcWNPdXRbY10tPnRvdEZpbGxCaXRzICsgcWNPdXRbY10tPmFsaWduQml0cyk7CisgICAgICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgKz0gcWNPdXRbY10tPmdyYW50ZWREeW5CaXRzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocWNPdXRbY10tPnVzZWREeW5CaXRzICsgcWNPdXRbY10tPnRvdEZpbGxCaXRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbY10tPmFsaWduQml0cyk7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgfQpAQCAtMTM2Miw1NyArMTI5Niw1OSBAQAogICAgICAgICAgcmV0dXJuOgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0ZpbmFsaXplQml0Q29uc3VtcHRpb24oQ0hBTk5FTF9NQVBQSU5HICpjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX1NUQVRFICpxY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCAqcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCoqIHFjRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICBlcENvbmZpZykKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19GaW5hbGl6ZUJpdENvbnN1bXB0aW9uKAorICAgIENIQU5ORUxfTUFQUElORyogY20sIFFDX1NUQVRFKiBxY0tlcm5lbCwgUUNfT1VUKiBxY091dCwKKyAgICBRQ19PVVRfRUxFTUVOVCoqIHFjRWxlbWVudCwgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LCBVSU5UIHN5bnRheEZsYWdzLCBTQ0hBUiBlcENvbmZpZykgewogICBRQ19PVVRfRVhURU5TSU9OIGZpbGxFeHRQYXlsb2FkOwogICBJTlQgdG90RmlsbEJpdHMsIGFsaWduQml0czsKIAogICAvKiBHZXQgdG90YWwgY29uc3VtZWQgYml0cyBpbiBBVSAqLwotICBxY091dC0+dG90YWxCaXRzID0gcWNPdXQtPnN0YXRpY0JpdHMgKyBxY091dC0+dXNlZER5bkJpdHMgICsgcWNPdXQtPnRvdEZpbGxCaXRzICsKLSAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT5lbGVtZW50RXh0Qml0cyArIHFjT3V0LT5nbG9iYWxFeHRCaXRzOworICBxY091dC0+dG90YWxCaXRzID0gcWNPdXQtPnN0YXRpY0JpdHMgKyBxY091dC0+dXNlZER5bkJpdHMgKworICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzICsgcWNPdXQtPmVsZW1lbnRFeHRCaXRzICsKKyAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT5nbG9iYWxFeHRCaXRzOwogCi0gIGlmIChxY0tlcm5lbC0+Yml0cmF0ZU1vZGU9PVFDREFUQV9CUl9NT0RFX0NCUikgewotCi0gICAgLyogTm93IHdlIGNhbiBnZXQgdGhlIGV4YWN0IHRyYW5zcG9ydCBiaXQgYW1vdW50LCBhbmQgaG9wZWZ1bGx5IGl0IGlzIGVxdWFsIHRvIHRoZSBlc3RpbWF0ZWQgdmFsdWUgKi8KKyAgaWYgKHFjS2VybmVsLT5iaXRyYXRlTW9kZSA9PSBRQ0RBVEFfQlJfTU9ERV9DQlIpIHsKKyAgICAvKiBOb3cgd2UgY2FuIGdldCB0aGUgZXhhY3QgdHJhbnNwb3J0IGJpdCBhbW91bnQsIGFuZCBob3BlZnVsbHkgaXQgaXMgZXF1YWwKKyAgICAgKiB0byB0aGUgZXN0aW1hdGVkIHZhbHVlICovCiAgICAgSU5UIGV4YWN0VHBCaXRzID0gdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoaFRwRW5jLCBxY091dC0+dG90YWxCaXRzKTsKIAogICAgIGlmIChleGFjdFRwQml0cyAhPSBxY0tlcm5lbC0+Z2xvYkhkckJpdHMpIHsKICAgICAgIElOVCBkaWZmRmlsbEJpdHMgPSAwOwogCi0gICAgICAvKiBIb3cgbWFueSBiaXRzIGNhbiBiZSB0YWtlbiBieSBiaXRyZXNlcnZvaXIgKi8KLSAgICAgIGNvbnN0IElOVCBiaXRyZXNTcGFjZSA9IHFjS2VybmVsLT5iaXRSZXNUb3RNYXggLSAocWNLZXJuZWwtPmJpdFJlc1RvdCArIChxY091dC0+Z3JhbnRlZER5bkJpdHMgLSAocWNPdXQtPnVzZWREeW5CaXRzICsgcWNPdXQtPnRvdEZpbGxCaXRzKSApICk7CisgICAgICAvKiBIb3cgbWFueSBiaXRzIGNhbiBiZSB0YWtlIGJ5IGJpdHJlc2Vydm9pciAqLworICAgICAgY29uc3QgSU5UIGJpdHJlc1NwYWNlID0KKyAgICAgICAgICBxY0tlcm5lbC0+Yml0UmVzVG90TWF4IC0KKyAgICAgICAgICAocWNLZXJuZWwtPmJpdFJlc1RvdCArCisgICAgICAgICAgIChxY091dC0+Z3JhbnRlZER5bkJpdHMgLSAocWNPdXQtPnVzZWREeW5CaXRzICsgcWNPdXQtPnRvdEZpbGxCaXRzKSkpOwogCiAgICAgICAvKiBOdW1iZXIgb2YgYml0cyB3aGljaCBjYW4gYmUgbW92ZWQgdG8gYml0cmVzZXJ2b2lyLiAqLwogICAgICAgY29uc3QgSU5UIGJpdHNUb0JpdHJlcyA9IHFjS2VybmVsLT5nbG9iSGRyQml0cyAtIGV4YWN0VHBCaXRzOwotICAgICAgRkRLX0FTU0VSVChiaXRzVG9CaXRyZXM+PTApOyAvKiBpcyBhbHdheXMgcG9zaXRpdmUgKi8KKyAgICAgIEZES19BU1NFUlQoYml0c1RvQml0cmVzID49IDApOyAvKiBpcyBhbHdheXMgcG9zaXRpdmUgKi8KIAotICAgICAgLyogSWYgYml0cmVzZXJ2b2lyIGNhbiBub3QgdGFrZSBhbGwgYml0cywgbW92ZSByYW1haW5pbmcgYml0cyB0byBmaWxsYml0cyAqLwotICAgICAgZGlmZkZpbGxCaXRzID0gRkRLbWF4KDAsIGJpdHNUb0JpdHJlcyAtIGJpdHJlc1NwYWNlKTsKKyAgICAgIC8qIElmIGJpdHJlc2Vydm9pciBjYW4gbm90IHRha2UgYWxsIGJpdHMsIG1vdmUgcmFtYWluaW5nIGJpdHMgdG8gZmlsbGJpdHMKKyAgICAgICAqLworICAgICAgZGlmZkZpbGxCaXRzID0gZk1heCgwLCBiaXRzVG9CaXRyZXMgLSBiaXRyZXNTcGFjZSk7CiAKICAgICAgIC8qIEFzc3VyZSBwcmV2aW91cyBhbGlnbm1lbnQgKi8KLSAgICAgIGRpZmZGaWxsQml0cyA9IChkaWZmRmlsbEJpdHMrNykmfjc7CisgICAgICBkaWZmRmlsbEJpdHMgPSAoZGlmZkZpbGxCaXRzICsgNykgJiB+NzsKIAogICAgICAgLyogTW92ZSBhcyBtYW55IGJpdHMgYXMgcG9zc2libGUgdG8gYml0cmVzZXJ2b2lyICovCi0gICAgICBxY0tlcm5lbC0+Yml0UmVzVG90ICAgICs9IChiaXRzVG9CaXRyZXMtZGlmZkZpbGxCaXRzKTsKKyAgICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgKz0gKGJpdHNUb0JpdHJlcyAtIGRpZmZGaWxsQml0cyk7CiAKICAgICAgIC8qIFdyaXRlIHJlbWFpbmcgYml0cyBhcyBmaWxsIGJpdHMgKi8KLSAgICAgIHFjT3V0LT50b3RGaWxsQml0cyAgICAgKz0gZGlmZkZpbGxCaXRzOwotICAgICAgcWNPdXQtPnRvdGFsQml0cyAgICAgICArPSBkaWZmRmlsbEJpdHM7Ci0gICAgICBxY091dC0+Z3JhbnRlZER5bkJpdHMgICs9IGRpZmZGaWxsQml0czsKKyAgICAgIHFjT3V0LT50b3RGaWxsQml0cyArPSBkaWZmRmlsbEJpdHM7CisgICAgICBxY091dC0+dG90YWxCaXRzICs9IGRpZmZGaWxsQml0czsKKyAgICAgIHFjT3V0LT5ncmFudGVkRHluQml0cyArPSBkaWZmRmlsbEJpdHM7CiAKICAgICAgIC8qIEdldCBuZXcgaGVhZGVyIGJpdHMgKi8KLSAgICAgIHFjS2VybmVsLT5nbG9iSGRyQml0cyA9IHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgcWNPdXQtPnRvdGFsQml0cyk7CisgICAgICBxY0tlcm5lbC0+Z2xvYkhkckJpdHMgPQorICAgICAgICAgIHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgcWNPdXQtPnRvdGFsQml0cyk7CiAKICAgICAgIGlmIChxY0tlcm5lbC0+Z2xvYkhkckJpdHMgIT0gZXhhY3RUcEJpdHMpIHsKLSAgICAgICAgLyogSW4gcHJldmlvdXMgc3RlcCwgZmlsbCBiaXRzIGFuZCBjb3JyZXNwb25kaW5nIHRvdGFsIGJpdHMgd2VyZSBjaGFuZ2VkIHdoZW4gYml0cmVzZXJ2b2lyIHdhcyBjb21wbGV0ZWx5IGZpbGxlZC4KLSAgICAgICAgICAgTm93IHdlIGNhbiB0YWtlIHRoZSB0b28gbXVjaCB0YWtlbiBiaXRzIGNhdXNlZCBieSBoZWFkZXIgb3ZlcmhlYWQgZnJvbSBiaXRyZXNlcnZvaXIuCisgICAgICAgIC8qIEluIHByZXZpb3VzIHN0ZXAsIGZpbGwgYml0cyBhbmQgY29ycmVzcG9uZGluZyB0b3RhbCBiaXRzIHdlcmUgY2hhbmdlZAorICAgICAgICAgICB3aGVuIGJpdHJlc2Vydm9pciB3YXMgY29tcGxldGVseSBmaWxsZWQuIE5vdyB3ZSBjYW4gdGFrZSB0aGUgdG9vIG11Y2gKKyAgICAgICAgICAgdGFrZW4gYml0cyBjYXVzZWQgYnkgaGVhZGVyIG92ZXJoZWFkIGZyb20gYml0cmVzZXJ2b2lyLgogICAgICAgICAgKi8KICAgICAgICAgcWNLZXJuZWwtPmJpdFJlc1RvdCAtPSAocWNLZXJuZWwtPmdsb2JIZHJCaXRzIC0gZXhhY3RUcEJpdHMpOwogICAgICAgfQpAQCAtMTQzMiwyNiArMTM2OCwyOCBAQAogICBmaWxsRXh0UGF5bG9hZC50eXBlID0gRVhUX0ZJTExfREFUQTsKICAgZmlsbEV4dFBheWxvYWQublBheWxvYWRCaXRzID0gdG90RmlsbEJpdHM7CiAKLSAgLyogYXNrIGJpdHN0cmVhbSBlbmNvZGVyIGhvdyBtYW55IG9mIHRoYXQgYml0cyBjYW4gYmUgd3JpdHRlbiBpbiBhIGZpbGwgZXh0ZW5zaW9uIGRhdGEgZW50aXR5ICovCi0gIHFjT3V0LT50b3RGaWxsQml0cyA9IEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGxFeHRQYXlsb2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZyApOworICAvKiBhc2sgYml0c3RyZWFtIGVuY29kZXIgaG93IG1hbnkgb2YgdGhhdCBiaXRzIGNhbiBiZSB3cml0dGVuIGluIGEgZmlsbAorICAgKiBleHRlbnNpb24gZGF0YSBlbnRpdHkgKi8KKyAgcWNPdXQtPnRvdEZpbGxCaXRzID0gRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YShOVUxMLCAmZmlsbEV4dFBheWxvYWQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsIGFvdCwgZXBDb25maWcpOwogCiAgIC8qIG5vdyBkaXN0cmlidXRlIGV4dHJhIGZpbGxiaXRzIGFuZCBhbGlnbmJpdHMgKi8KLSAgYWxpZ25CaXRzID0gNyAtIChxY091dC0+c3RhdGljQml0cyArIHFjT3V0LT51c2VkRHluQml0cyArIHFjT3V0LT5lbGVtZW50RXh0Qml0cwotICAgICAgICAgICAgICAgICAgICsgcWNPdXQtPnRvdEZpbGxCaXRzICsgcWNPdXQtPmdsb2JhbEV4dEJpdHMgLTEpJTg7CisgIGFsaWduQml0cyA9CisgICAgICA3IC0gKHFjT3V0LT5zdGF0aWNCaXRzICsgcWNPdXQtPnVzZWREeW5CaXRzICsgcWNPdXQtPmVsZW1lbnRFeHRCaXRzICsKKyAgICAgICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzICsgcWNPdXQtPmdsb2JhbEV4dEJpdHMgLSAxKSAlCisgICAgICAgICAgICAgIDg7CiAKICAgLyogTWF5YmUgd2UgY291bGQgcmVtb3ZlIHRoaXMgKi8KLSAgaWYoICgoYWxpZ25CaXRzICsgcWNPdXQtPnRvdEZpbGxCaXRzIC0gdG90RmlsbEJpdHMpPT04KSAmJiAocWNPdXQtPnRvdEZpbGxCaXRzPjgpICkKLSAgICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzIC09IDg7CisgIGlmICgoKGFsaWduQml0cyArIHFjT3V0LT50b3RGaWxsQml0cyAtIHRvdEZpbGxCaXRzKSA9PSA4KSAmJgorICAgICAgKHFjT3V0LT50b3RGaWxsQml0cyA+IDgpKQorICAgIHFjT3V0LT50b3RGaWxsQml0cyAtPSA4OwogCi0gIHFjT3V0LT50b3RhbEJpdHMgPSBxY091dC0+c3RhdGljQml0cyArIHFjT3V0LT51c2VkRHluQml0cyArIHFjT3V0LT50b3RGaWxsQml0cyArCi0gICAgICAgICAgICAgICAgICAgICBhbGlnbkJpdHMgKyBxY091dC0+ZWxlbWVudEV4dEJpdHMgKyBxY091dC0+Z2xvYmFsRXh0Qml0czsKKyAgcWNPdXQtPnRvdGFsQml0cyA9IHFjT3V0LT5zdGF0aWNCaXRzICsgcWNPdXQtPnVzZWREeW5CaXRzICsKKyAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RGaWxsQml0cyArIGFsaWduQml0cyArIHFjT3V0LT5lbGVtZW50RXh0Qml0cyArCisgICAgICAgICAgICAgICAgICAgICBxY091dC0+Z2xvYmFsRXh0Qml0czsKIAotICBpZiAoIChxY091dC0+dG90YWxCaXRzPnFjS2VybmVsLT5tYXhCaXRzUGVyRnJhbWUpIHx8IChxY091dC0+dG90YWxCaXRzPHFjS2VybmVsLT5taW5CaXRzUGVyRnJhbWUpICkgeworICBpZiAoKHFjT3V0LT50b3RhbEJpdHMgPiBxY0tlcm5lbC0+bWF4Qml0c1BlckZyYW1lKSB8fAorICAgICAgKHFjT3V0LT50b3RhbEJpdHMgPCBxY0tlcm5lbC0+bWluQml0c1BlckZyYW1lKSkgewogICAgIHJldHVybiBBQUNfRU5DX1FVQU5UX0VSUk9SOwogICB9CiAKQEAgLTE0NjAsOCArMTM5OCw2IEBACiAgIHJldHVybiBBQUNfRU5DX09LOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jcmFzaFJlY292ZXJ5CkBAIC0xNDcyLDkzICsxNDA4LDgyIEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIEZES2FhY0VuY19jcmFzaFJlY292ZXJ5KElOVCAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiAgcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgICAgICAgICAgcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UICAgKnFjRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgYml0c1RvU2F2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgZXBDb25maWcpCi17Ci0gIElOVCBjaCA7Ci0gIElOVCBzYXZlZEJpdHMgPSAwIDsKLSAgSU5UIHNmYiwgc2ZiR3JwIDsKLSAgSU5UIGJpdHNQZXJTY2ZbKDIpXVtNQVhfR1JPVVBFRF9TRkJdIDsKLSAgSU5UIHNlY3Rpb25Ub1NjZlsoMildW01BWF9HUk9VUEVEX1NGQl0gOwotICBJTlQgKnNmYk9mZnNldCA7Ci0gIElOVCBzZWN0LCBzdGF0Qml0c05ldyA7Ci0gIFFDX09VVF9DSEFOTkVMICoqcWNDaGFubmVsID0gcWNFbGVtZW50LT5xY091dENoYW5uZWw7Ci0gIFBTWV9PVVRfQ0hBTk5FTCAqKnBzeUNoYW5uZWwgPSBwc3lPdXRFbGVtZW50LT5wc3lPdXRDaGFubmVsOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkoSU5UIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogcWNPdXQsIFFDX09VVF9FTEVNRU5UKiBxY0VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYml0c1RvU2F2ZSwgQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzeW50YXhGbGFncywgU0NIQVIgZXBDb25maWcpIHsKKyAgSU5UIGNoOworICBJTlQgc2F2ZWRCaXRzID0gMDsKKyAgSU5UIHNmYiwgc2ZiR3JwOworICBJTlQgYml0c1BlclNjZlsoMildW01BWF9HUk9VUEVEX1NGQl07CisgIElOVCBzZWN0aW9uVG9TY2ZbKDIpXVtNQVhfR1JPVVBFRF9TRkJdOworICBJTlQqIHNmYk9mZnNldDsKKyAgSU5UIHNlY3QsIHN0YXRCaXRzTmV3OworICBRQ19PVVRfQ0hBTk5FTCoqIHFjQ2hhbm5lbCA9IHFjRWxlbWVudC0+cWNPdXRDaGFubmVsOworICBQU1lfT1VUX0NIQU5ORUwqKiBwc3lDaGFubmVsID0gcHN5T3V0RWxlbWVudC0+cHN5T3V0Q2hhbm5lbDsKIAogICAvKiBjcmVhdGUgYSB0YWJsZSB3aGljaCBjb252ZXJ0cyBmcnEtYmlucyB0byBiaXQtZGVtYW5kLi4uICAgIFtiaXRzUGVyU2NmXSAqLwogICAvKiAuLi5hbmQgYW5vdGhlciBvbmUgd2hpY2ggaG9sZHMgdGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbnMgW3NlY3Rpb25Ub1NjZl0gKi8KLSAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQotICB7Ci0gICAgc2ZiT2Zmc2V0ID0gcHN5Q2hhbm5lbFtjaF0tPnNmYk9mZnNldHMgOworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBzZmJPZmZzZXQgPSBwc3lDaGFubmVsW2NoXS0+c2ZiT2Zmc2V0czsKIAotICAgIGZvciAoc2VjdCA9IDA7IHNlY3QgPCBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5ub09mU2VjdGlvbnM7IHNlY3QrKykKLSAgICB7Ci0gICAgICBJTlQgc2ZiIDsKLSAgICAgIElOVCBjb2RlQm9vayA9IHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLmNvZGVCb29rIDsKKyAgICBmb3IgKHNlY3QgPSAwOyBzZWN0IDwgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubm9PZlNlY3Rpb25zOyBzZWN0KyspIHsKKyAgICAgIElOVCBjb2RlQm9vayA9IHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLmNvZGVCb29rOwogCiAgICAgICBmb3IgKHNmYiA9IHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLnNmYlN0YXJ0OwogICAgICAgICAgICBzZmIgPCBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5zZmJTdGFydCArCi0gICAgICAgICAgICAgICAgIHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLnNmYkNudDsKLSAgICAgICAgICAgc2ZiKyspCi0gICAgICB7CisgICAgICAgICAgICAgICAgICAgICBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5zZmJDbnQ7CisgICAgICAgICAgIHNmYisrKSB7CiAgICAgICAgIGJpdHNQZXJTY2ZbY2hdW3NmYl0gPSAwOwotICAgICAgICBpZiAoIChjb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKSAvKiYmCi0gICAgICAgICAgICAgKHNmYiA8IChxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5ub09mR3JvdXBzKnFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLm1heFNmYlBlckdyb3VwKSkqLyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElOVCBzZmJTdGFydExpbmUgPSBzZmJPZmZzZXRbc2ZiXSA7Ci0gICAgICAgICAgICBJTlQgbm9PZkxpbmVzICAgID0gc2ZiT2Zmc2V0W3NmYisxXSAtIHNmYlN0YXJ0TGluZSA7Ci0gICAgICAgICAgICBiaXRzUGVyU2NmW2NoXVtzZmJdID0gRkRLYWFjRW5jX2NvdW50VmFsdWVzKCYocWNDaGFubmVsW2NoXS0+cXVhbnRTcGVjW3NmYlN0YXJ0TGluZV0pLCBub09mTGluZXMsIGNvZGVCb29rKSA7CisgICAgICAgIGlmICgoY29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykgLyomJgorICAgICAgICAgICAgIChzZmIgPCAocWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubm9PZkdyb3VwcypxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5tYXhTZmJQZXJHcm91cCkpKi8pIHsKKyAgICAgICAgICBJTlQgc2ZiU3RhcnRMaW5lID0gc2ZiT2Zmc2V0W3NmYl07CisgICAgICAgICAgSU5UIG5vT2ZMaW5lcyA9IHNmYk9mZnNldFtzZmIgKyAxXSAtIHNmYlN0YXJ0TGluZTsKKyAgICAgICAgICBiaXRzUGVyU2NmW2NoXVtzZmJdID0gRkRLYWFjRW5jX2NvdW50VmFsdWVzKAorICAgICAgICAgICAgICAmKHFjQ2hhbm5lbFtjaF0tPnF1YW50U3BlY1tzZmJTdGFydExpbmVdKSwgbm9PZkxpbmVzLCBjb2RlQm9vayk7CiAgICAgICAgIH0KLSAgICAgICAgc2VjdGlvblRvU2NmW2NoXVtzZmJdID0gc2VjdCA7CisgICAgICAgIHNlY3Rpb25Ub1NjZltjaF1bc2ZiXSA9IHNlY3Q7CiAgICAgICB9Ci0KICAgICB9CiAgIH0KIAogICAvKiBMT1dFUiBbbWF4U2ZiXSBJTiBCT1RIIENIQU5ORUxTISEgKi8KLSAgLyogQXR0ZW50aW9uOiBpbiBjYXNlIG9mIHN0ZXJlbzogbWF4U2ZiTCA9PSBtYXhTZmJSLCBHcm91cGluZ0wgPT0gR3JvdXBpbmdSIDsgKi8KKyAgLyogQXR0ZW50aW9uOiBpbiBjYXNlIG9mIHN0ZXJlbzogbWF4U2ZiTCA9PSBtYXhTZmJSLCBHcm91cGluZ0wgPT0gR3JvdXBpbmdSIDsKKyAgICovCiAKLSAgZm9yIChzZmIgPSBxY0NoYW5uZWxbMF0tPnNlY3Rpb25EYXRhLm1heFNmYlBlckdyb3VwLTE7IHNmYiA+PSAwOyBzZmItLSkKLSAgewotICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5Q2hhbm5lbFswXS0+c2ZiQ250OyBzZmJHcnAgKz0gcHN5Q2hhbm5lbFswXS0+c2ZiUGVyR3JvdXApCi0gICAgewotICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQotICAgICAgewotICAgICAgICBpbnQgc2VjdCA9IHNlY3Rpb25Ub1NjZltjaF1bc2ZiR3JwK3NmYl07Ci0gICAgICAgIHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLnNmYkNudC0tIDsKLSAgICAgICAgc2F2ZWRCaXRzICs9IGJpdHNQZXJTY2ZbY2hdW3NmYkdycCtzZmJdIDsKKyAgZm9yIChzZmIgPSBxY0NoYW5uZWxbMF0tPnNlY3Rpb25EYXRhLm1heFNmYlBlckdyb3VwIC0gMTsgc2ZiID49IDA7IHNmYi0tKSB7CisgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lDaGFubmVsWzBdLT5zZmJDbnQ7CisgICAgICAgICBzZmJHcnAgKz0gcHN5Q2hhbm5lbFswXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgICAgICBzZWN0ID0gc2VjdGlvblRvU2NmW2NoXVtzZmJHcnAgKyBzZmJdOworICAgICAgICBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5zZmJDbnQtLTsKKyAgICAgICAgc2F2ZWRCaXRzICs9IGJpdHNQZXJTY2ZbY2hdW3NmYkdycCArIHNmYl07CiAKICAgICAgICAgaWYgKHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLmh1ZmZzZWN0aW9uW3NlY3RdLnNmYkNudCA9PSAwKSB7Ci0gICAgICAgICAgc2F2ZWRCaXRzICs9IChwc3lDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlIT1TSE9SVF9XSU5ET1cpID8gRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZ1swXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRLYWFjRW5jX3NpZGVJbmZvVGFiU2hvcnRbMF07CisgICAgICAgICAgc2F2ZWRCaXRzICs9IChwc3lDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZ1swXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGREthYWNFbmNfc2lkZUluZm9UYWJTaG9ydFswXTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KIAogICAgIC8qIC4uLmhhdmUgZW5vdWdoIGJpdHMgYmVlbiBzYXZlZD8gKi8KLSAgICBpZiAoc2F2ZWRCaXRzID49IGJpdHNUb1NhdmUpCi0gICAgICBicmVhayA7CisgICAgaWYgKHNhdmVkQml0cyA+PSBiaXRzVG9TYXZlKSBicmVhazsKIAogICB9IC8qIHNmYiBsb29wICovCiAKICAgLyogaWYgbm90IGVub3VnaCBiaXRzIHNhdmVkLAogICAgICBjbGVhbiB3aG9sZSBzcGVjdHJ1bSBhbmQgcmVtb3ZlIHNpZGUgaW5mbyBvdmVyaGVhZCAqLwogICBpZiAoc2ZiID09IC0xKSB7Ci0gICAgc2ZiID0gMCA7CisgICAgc2ZiID0gMDsKICAgfQogCi0gIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKLSAgewotICAgIHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLm1heFNmYlBlckdyb3VwID0gc2ZiIDsKLSAgICBwc3lDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAgPSBzZmIgOworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5tYXhTZmJQZXJHcm91cCA9IHNmYjsKKyAgICBwc3lDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAgPSBzZmI7CiAgICAgLyogd2hlbiBubyBzcGVjdHJ1bSBpcyBjb2RlZCBzYXZlIHRvb2xzIGluZm8gaW4gYml0c3RyZWFtICovCi0gICAgaWYoc2ZiPT0wKSB7CisgICAgaWYgKHNmYiA9PSAwKSB7CiAgICAgICBGREttZW1jbGVhcigmcHN5Q2hhbm5lbFtjaF0tPnRuc0luZm8sIHNpemVvZihUTlNfSU5GTykpOwogICAgICAgRkRLbWVtY2xlYXIoJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mbywgc2l6ZW9mKFRPT0xTSU5GTykpOwogICAgIH0KQEAgLTE1NzIsMTQgKzE0OTcsOSBAQAogICAgIGVsSW5mby5uQ2hhbm5lbHNJbkVsID0gbkNoYW5uZWxzOwogICAgIGVsSW5mby5lbFR5cGUgPSAobkNoYW5uZWxzID09IDIpID8gSURfQ1BFIDogSURfU0NFOwogCi0gICAgRkRLYWFjRW5jX0NoYW5uZWxFbGVtZW50V3JpdGUoIE5VTEwsICZlbEluZm8sIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0Qml0c05ldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOworICAgIEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKE5VTEwsICZlbEluZm8sIE5VTEwsIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q2hhbm5lbCwgc3ludGF4RmxhZ3MsIGFvdCwgZXBDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRCaXRzTmV3LCAwKTsKICAgfQogCiAgIHNhdmVkQml0cyA9IHFjRWxlbWVudC0+c3RhdGljQml0c1VzZWQgLSBzdGF0Qml0c05ldzsKQEAgLTE1ODgsMzAgKzE1MDgsMjMgQEAKICAgcWNFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCAtPSBzYXZlZEJpdHM7CiAgIHFjRWxlbWVudC0+Z3JhbnRlZER5bkJpdHMgKz0gc2F2ZWRCaXRzOwogCi0gIHFjT3V0LT5zdGF0aWNCaXRzICAgICAtPSBzYXZlZEJpdHM7CisgIHFjT3V0LT5zdGF0aWNCaXRzIC09IHNhdmVkQml0czsKICAgcWNPdXQtPmdyYW50ZWREeW5CaXRzICs9IHNhdmVkQml0czsKLSAgcWNPdXQtPm1heER5bkJpdHMgICAgICs9IHNhdmVkQml0czsKLQotCisgIHFjT3V0LT5tYXhEeW5CaXRzICs9IHNhdmVkQml0czsKIH0KIAotCi0KLXZvaWQgIEZES2FhY0VuY19RQ0Nsb3NlIChRQ19TVEFURSAgKipwaFFDc3RhdGUsIFFDX09VVCAqKnBoUUMpCi17Cit2b2lkIEZES2FhY0VuY19RQ0Nsb3NlKFFDX1NUQVRFKiogcGhRQ3N0YXRlLCBRQ19PVVQqKiBwaFFDKSB7CiAgIGludCBuLCBpOwogCi0gIGlmIChwaFFDIT1OVUxMKSB7Ci0KLSAgICBmb3IgKG49MDtuPCgxKTtuKyspIHsKKyAgaWYgKHBoUUMgIT0gTlVMTCkgeworICAgIGZvciAobiA9IDA7IG4gPCAoMSk7IG4rKykgewogICAgICAgaWYgKHBoUUNbbl0gIT0gTlVMTCkgewotICAgICAgICBRQ19PVVQgICAgKmhRQyAgICAgID0gcGhRQ1tuXTsKLSAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKKyAgICAgICAgUUNfT1VUKiBoUUMgPSBwaFFDW25dOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKDgpOyBpKyspIHsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7Ci0gICAgICAgICAgaWYgKGhRQy0+cWNFbGVtZW50W2ldKQotICAgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUUNlbGVtZW50KCZoUUMtPnFjRWxlbWVudFtpXSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoKDgpKTsgaSsrKSB7CisgICAgICAgICAgaWYgKGhRQy0+cWNFbGVtZW50W2ldKSBGcmVlUmFtX2FhY0VuY19RQ2VsZW1lbnQoJmhRQy0+cWNFbGVtZW50W2ldKTsKICAgICAgICAgfQogCiAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1FDb3V0KCZwaFFDW25dKTsKQEAgLTE2MTksMTggKzE1MzIsMTcgQEAKICAgICB9CiAgIH0KIAotICBpZiAocGhRQ3N0YXRlIT1OVUxMKSB7CisgIGlmIChwaFFDc3RhdGUgIT0gTlVMTCkgewogICAgIGlmICgqcGhRQ3N0YXRlICE9IE5VTEwpIHsKLSAgICAgIFFDX1NUQVRFICAqaFFDc3RhdGUgPSAqcGhRQ3N0YXRlOworICAgICAgUUNfU1RBVEUqIGhRQ3N0YXRlID0gKnBoUUNzdGF0ZTsKIAotICAgICAgaWYgKGhRQ3N0YXRlLT5oQWRqVGhyICE9IE5VTEwpCi0gICAgICAgIEZES2FhY0VuY19BZGpUaHJDbG9zZSgmaFFDc3RhdGUtPmhBZGpUaHIpOworICAgICAgaWYgKGhRQ3N0YXRlLT5oQWRqVGhyICE9IE5VTEwpIEZES2FhY0VuY19BZGpUaHJDbG9zZSgmaFFDc3RhdGUtPmhBZGpUaHIpOwogCiAgICAgICBpZiAoaFFDc3RhdGUtPmhCaXRDb3VudGVyICE9IE5VTEwpCiAgICAgICAgIEZES2FhY0VuY19CQ0Nsb3NlKCZoUUNzdGF0ZS0+aEJpdENvdW50ZXIpOwogCi0gICAgICBmb3IgKGk9MDsgaTwoOCk7IGkrKykgewotICAgICAgICBpZiAoaFFDc3RhdGUtPmVsZW1lbnRCaXRzW2ldIT1OVUxMKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKCg4KSk7IGkrKykgeworICAgICAgICBpZiAoaFFDc3RhdGUtPmVsZW1lbnRCaXRzW2ldICE9IE5VTEwpIHsKICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19FbGVtZW50Qml0cygmaFFDc3RhdGUtPmVsZW1lbnRCaXRzW2ldKTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMTYzOCw0ICsxNTUwLDMgQEAKICAgICB9CiAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9xY19tYWluLmggYi9saWJBQUNlbmMvc3JjL3FjX21haW4uaAppbmRleCA0ZThjMDQyLi5iOWU4ZTJkIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3FjX21haW4uaAorKysgYi9saWJBQUNlbmMvc3JjL3FjX21haW4uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNyArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogUXVhbnRpemluZyAmIGNvZGluZworICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9RQ19NQUlOX0gKLSNkZWZpbmUgX1FDX01BSU5fSAorICAgRGVzY3JpcHRpb246IFF1YW50aXppbmcgJiBjb2RpbmcKIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBRQ19NQUlOX0gKKyNkZWZpbmUgUUNfTUFJTl9ICiAKICNpbmNsdWRlICJhYWNlbmMuaCIKICNpbmNsdWRlICJxY19kYXRhLmgiCkBAIC05OSw3MiArMTExLDQ4IEBACiAKIC8qIFF1YW50aXppbmcgJiBjb2Rpbmcgc3RhZ2UgKi8KIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDT3V0TmV3KFFDX09VVCAgICAqKnBoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBuU3ViRnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIgICAqZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDT3V0TmV3KFFDX09VVCAqKnBoUUMsIGNvbnN0IElOVCBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywgY29uc3QgSU5UIG5TdWJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmR5bmFtaWNfUkFNKTsKIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDT3V0SW5pdChRQ19PVVQgICAgICAgICAgKnBoUUNbKDEpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuU3ViRnJhbWVzLAorQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDT3V0SW5pdChRQ19PVVQgKnBoUUNbKDEpXSwgY29uc3QgSU5UIG5TdWJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY20pOwogCi1BQUNfRU5DT0RFUl9FUlJPUiAgRkRLYWFjRW5jX1FDTmV3KFFDX1NUQVRFICAqKnBoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG5FbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiogZHluYW1pY19SQU0KLSAgICAgICAgICAgKTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ05ldyhRQ19TVEFURSAqKnBoUUMsIElOVCBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmR5bmFtaWNfUkFNKTsKIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDSW5pdChRQ19TVEFURSAqaFFDLCBzdHJ1Y3QgUUNfSU5JVCAqaW5pdCk7CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNJbml0KFFDX1NUQVRFICpoUUMsIHN0cnVjdCBRQ19JTklUICppbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVTE9ORyBpbml0RmxhZ3MpOwogCiBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNNYWluUHJlcGFyZSgKLSAgICAgICAgICAgRUxFTUVOVF9JTkZPICAgICAgICAgICAgICAqZWxJbmZvLAotICAgICAgICAgICBBVFNfRUxFTUVOVCogIFJFU1RSSUNUICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogUkVTVFJJQ1QgIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiBSRVNUUklDVCAgIHFjT3V0RWxlbWVudCwgICAvKiByZXR1cm5zIGVycm9yIGNvZGUgICAgICAgKi8KLSAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgICAgICAgYW90LAotICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcKLSAgICAgICAgICAgKTsKKyAgICBFTEVNRU5UX0lORk8gKmVsSW5mbywgQVRTX0VMRU1FTlQgKlJFU1RSSUNUIGFkalRoclN0YXRlRWxlbWVudCwKKyAgICBQU1lfT1VUX0VMRU1FTlQgKlJFU1RSSUNUIHBzeU91dEVsZW1lbnQsCisgICAgUUNfT1VUX0VMRU1FTlQgKlJFU1RSSUNUIHFjT3V0RWxlbWVudCwgLyogcmV0dXJucyBlcnJvciBjb2RlICAgICAgICovCisgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LCBVSU5UIHN5bnRheEZsYWdzLCBTQ0hBUiBlcENvbmZpZyk7CiAKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ01haW4oUUNfU1RBVEUgKlJFU1RSSUNUIGhRQywgUFNZX09VVCAqKnBzeU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUICoqcWNPdXQsIElOVCBhdmdUb3RhbEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY20sIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzeW50YXhGbGFncywgU0NIQVIgZXBDb25maWcpOwogCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNNYWluKFFDX1NUQVRFKiBSRVNUUklDVCAgICAgICAgIGhRQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCoqICAgICAgICAgICAgICAgICAgcHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqKiAgICAgICAgICAgICAgICAgICBxY091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgYXZnVG90YWxCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqICAgICAgICAgICBjbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxBVURJT19PQkpFQ1RfVFlQRSAgICAgICAgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3VwZGF0ZUZpbGxCaXRzKENIQU5ORUxfTUFQUElORyAqY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfU1RBVEUgKnFjS2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfQklUUyAqUkVTVFJJQ1QgZWxCaXRzWygoOCkpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKipxY091dCk7CiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY191cGRhdGVGaWxsQml0cyhDSEFOTkVMX01BUFBJTkcqICAgICAgICAgIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX1NUQVRFKiAgICAgICAgICAgICAgICAgcWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBSRVNUUklDVCAgICBlbEJpdHNbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqKiAgICAgICAgICAgICAgICAgIHFjT3V0KTsKK3ZvaWQgRkRLYWFjRW5jX3VwZGF0ZUJpdHJlcyhDSEFOTkVMX01BUFBJTkcgKmNtLCBRQ19TVEFURSAqcWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUICoqcWNPdXQpOwogCi0KLXZvaWQgRkRLYWFjRW5jX3VwZGF0ZUJpdHJlcyggIENIQU5ORUxfTUFQUElORyAqY20sCi0gICAgICAgICAgICAgICAgICAgIFFDX1NUQVRFICpxY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgUUNfT1VUICoqcWNPdXQpOwotCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfRmluYWxpemVCaXRDb25zdW1wdGlvbiggQ0hBTk5FTF9NQVBQSU5HICpjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSAqaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCAqcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqKiBxY0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgIGVwQ29uZmlnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfRmluYWxpemVCaXRDb25zdW1wdGlvbigKKyAgICBDSEFOTkVMX01BUFBJTkcgKmNtLCBRQ19TVEFURSAqaFFDLCBRQ19PVVQgKnFjT3V0LAorICAgIFFDX09VVF9FTEVNRU5UICoqcWNFbGVtZW50LCBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICBBVURJT19PQkpFQ1RfVFlQRSBhb3QsIFVJTlQgc3ludGF4RmxhZ3MsIFNDSEFSIGVwQ29uZmlnKTsKIAogQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0FkanVzdEJpdHJhdGUoUUNfU1RBVEUgKlJFU1RSSUNUIGhRQywKLSAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqUkVTVFJJQ1QgY20sCi0gICAgICAgICAgICAgICAgICBJTlQgKmF2Z1RvdGFsQml0cywKLSAgICAgICAgICAgICAgICAgIElOVCBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKlJFU1RSSUNUIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICphdmdUb3RhbEJpdHMsIElOVCBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsIElOVCBncmFudWxlTGVuZ3RoKTsKIAotdm9pZCAgRkRLYWFjRW5jX1FDQ2xvc2UgKFFDX1NUQVRFICAqKnBoUUNzdGF0ZSwgUUNfT1VUICoqcGhRQyk7Cit2b2lkIEZES2FhY0VuY19RQ0Nsb3NlKFFDX1NUQVRFICoqcGhRQ3N0YXRlLCBRQ19PVVQgKipwaFFDKTsKIAotI2VuZGlmIC8qIF9RQ19NQUlOX0ggKi8KKyNlbmRpZiAvKiBRQ19NQUlOX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcXVhbnRpemUuY3BwIGIvbGliQUFDZW5jL3NyYy9xdWFudGl6ZS5jcHAKaW5kZXggYTc0ZGEwZS4uNGQyNTI2MyAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9xdWFudGl6ZS5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9xdWFudGl6ZS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogUXVhbnRpemF0aW9uCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFF1YW50aXphdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAicXVhbnRpemUuaCIKIApAQCAtMTAxLDYwICsxMTMsNjEgQEAKICAgICBvdXRwdXQ6IHF1YW50aXplZCBzcGVjdHJ1bQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19xdWFudGl6ZUxpbmVzKElOVCAgICAgIGdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgIG5vT2ZMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgICAgKnF1YVNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICBkWm9uZVF1YW50RW5hYmxlKQotewotICBpbnQgICBsaW5lOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX3F1YW50aXplTGluZXMoSU5UIGdhaW4sIElOVCBub09mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YVNwZWN0cnVtLCBJTlQgZFpvbmVRdWFudEVuYWJsZSkgeworICBpbnQgbGluZTsKICAgRklYUF9EQkwgayA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICBGSVhQX1FURCBxdWFudGl6ZXIgPSBGREthYWNFbmNfcXVhbnRUYWJsZVFbKC1nYWluKSYzXTsKLSAgSU5UICAgICAgcXVhbnRpemVyc2hpZnQgPSAoKC1nYWluKT4+MikrMTsKLSAgY29uc3QgSU5UIGtTaGlmdD0xNjsKKyAgRklYUF9RVEQgcXVhbnRpemVyID0gRkRLYWFjRW5jX3F1YW50VGFibGVRWygtZ2FpbikgJiAzXTsKKyAgSU5UIHF1YW50aXplcnNoaWZ0ID0gKCgtZ2FpbikgPj4gMikgKyAxOworICBjb25zdCBJTlQga1NoaWZ0ID0gMTY7CiAKICAgaWYgKGRab25lUXVhbnRFbmFibGUpCi0gICAgayA9IEZMMkZYQ09OU1RfREJMKDAuMjNmKT4+a1NoaWZ0OworICAgIGsgPSBGTDJGWENPTlNUX0RCTCgwLjIzZikgPj4ga1NoaWZ0OwogICBlbHNlCi0gICAgayA9IEZMMkZYQ09OU1RfREJMKC0wLjA5NDZmICsgMC41Zik+PmtTaGlmdDsKKyAgICBrID0gRkwyRlhDT05TVF9EQkwoLTAuMDk0NmYgKyAwLjVmKSA+PiBrU2hpZnQ7CiAKLSAgZm9yIChsaW5lID0gMDsgbGluZSA8IG5vT2ZMaW5lczsgbGluZSsrKQotICB7Ci0gICAgRklYUF9EQkwgYWNjdSA9IGZNdWx0RGl2MihtZGN0U3BlY3RydW1bbGluZV0scXVhbnRpemVyKTsKKyAgZm9yIChsaW5lID0gMDsgbGluZSA8IG5vT2ZMaW5lczsgbGluZSsrKSB7CisgICAgRklYUF9EQkwgYWNjdSA9IGZNdWx0RGl2MihtZGN0U3BlY3RydW1bbGluZV0sIHF1YW50aXplcik7CiAKLSAgICBpZiAoYWNjdSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgIHsKLSAgICAgIGFjY3U9LWFjY3U7CisgICAgaWYgKGFjY3UgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgYWNjdSA9IC1hY2N1OwogICAgICAgLyogbm9ybWFsaXplICovCi0gICAgICBJTlQgICBhY2N1U2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MoYWNjdSkgLSAxOyAgLyogQ291bnRMZWFkaW5nQml0cygpIGlzIG5vdCBuZWNlc3NhcnkgaGVyZSBzaW5jZSB0ZXN0IHZhbHVlIGlzIGFsd2F5cyA+IDAgKi8KKyAgICAgIElOVCBhY2N1U2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MoYWNjdSkgLSAxOyAvKiBDb3VudExlYWRpbmdCaXRzKCkgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJ5IGhlcmUgc2luY2UgdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIGFsd2F5cyA+IDAgKi8KICAgICAgIGFjY3UgPDw9IGFjY3VTaGlmdDsKLSAgICAgIElOVCB0YWJJbmRleCA9IChJTlQpKGFjY3U+PihERlJBQ1RfQklUUy0yLU1BTlRfRElHSVRTKSkmKH5NQU5UX1NJWkUpOwotICAgICAgSU5UIHRvdGFsU2hpZnQgPSBxdWFudGl6ZXJzaGlmdC1hY2N1U2hpZnQrMTsKLSAgICAgIGFjY3UgPSBmTXVsdERpdjIoRkRLYWFjRW5jX21UYWJfM180W3RhYkluZGV4XSxGREthYWNFbmNfcXVhbnRUYWJsZUVbdG90YWxTaGlmdCYzXSk7Ci0gICAgICB0b3RhbFNoaWZ0ID0gKDE2LTQpLSgzKih0b3RhbFNoaWZ0Pj4yKSk7Ci0gICAgICBGREtfQVNTRVJUKHRvdGFsU2hpZnQgPj0wKTsgLyogTUFYX1FVQU5UX1ZJT0xBVElPTiAqLwotICAgICAgYWNjdSA+Pj0gZml4TWluKHRvdGFsU2hpZnQsREZSQUNUX0JJVFMtMSk7Ci0gICAgICBxdWFTcGVjdHJ1bVtsaW5lXSA9IChTSE9SVCkoLSgoTE9ORykoayArIGFjY3UpID4+IChERlJBQ1RfQklUUy0xLTE2KSkpOwotICAgIH0KLSAgICBlbHNlIGlmKGFjY3UgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkKLSAgICB7CisgICAgICBJTlQgdGFiSW5kZXggPQorICAgICAgICAgIChJTlQpKGFjY3UgPj4gKERGUkFDVF9CSVRTIC0gMiAtIE1BTlRfRElHSVRTKSkgJiAofk1BTlRfU0laRSk7CisgICAgICBJTlQgdG90YWxTaGlmdCA9IHF1YW50aXplcnNoaWZ0IC0gYWNjdVNoaWZ0ICsgMTsKKyAgICAgIGFjY3UgPSBmTXVsdERpdjIoRkRLYWFjRW5jX21UYWJfM180W3RhYkluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX3F1YW50VGFibGVFW3RvdGFsU2hpZnQgJiAzXSk7CisgICAgICB0b3RhbFNoaWZ0ID0gKDE2IC0gNCkgLSAoMyAqICh0b3RhbFNoaWZ0ID4+IDIpKTsKKyAgICAgIEZES19BU1NFUlQodG90YWxTaGlmdCA+PSAwKTsgLyogTUFYX1FVQU5UX1ZJT0xBVElPTiAqLworICAgICAgYWNjdSA+Pj0gZml4TWluKHRvdGFsU2hpZnQsIERGUkFDVF9CSVRTIC0gMSk7CisgICAgICBxdWFTcGVjdHJ1bVtsaW5lXSA9CisgICAgICAgICAgKFNIT1JUKSgtKChMT05HKShrICsgYWNjdSkgPj4gKERGUkFDVF9CSVRTIC0gMSAtIDE2KSkpOworICAgIH0gZWxzZSBpZiAoYWNjdSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAvKiBub3JtYWxpemUgKi8KLSAgICAgIElOVCAgIGFjY3VTaGlmdCA9IENudExlYWRpbmdaZXJvcyhhY2N1KSAtIDE7ICAvKiBDb3VudExlYWRpbmdCaXRzKCkgaXMgbm90IG5lY2Vzc2FyeSBoZXJlIHNpbmNlIHRlc3QgdmFsdWUgaXMgYWx3YXlzID4gMCAqLworICAgICAgSU5UIGFjY3VTaGlmdCA9IENudExlYWRpbmdaZXJvcyhhY2N1KSAtIDE7IC8qIENvdW50TGVhZGluZ0JpdHMoKSBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcnkgaGVyZSBzaW5jZSB0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgYWx3YXlzID4gMCAqLwogICAgICAgYWNjdSA8PD0gYWNjdVNoaWZ0OwotICAgICAgSU5UIHRhYkluZGV4ID0gKElOVCkoYWNjdT4+KERGUkFDVF9CSVRTLTItTUFOVF9ESUdJVFMpKSYofk1BTlRfU0laRSk7Ci0gICAgICBJTlQgdG90YWxTaGlmdCA9IHF1YW50aXplcnNoaWZ0LWFjY3VTaGlmdCsxOwotICAgICAgYWNjdSA9IGZNdWx0RGl2MihGREthYWNFbmNfbVRhYl8zXzRbdGFiSW5kZXhdLEZES2FhY0VuY19xdWFudFRhYmxlRVt0b3RhbFNoaWZ0JjNdKTsKLSAgICAgIHRvdGFsU2hpZnQgPSAoMTYtNCktKDMqKHRvdGFsU2hpZnQ+PjIpKTsKLSAgICAgIEZES19BU1NFUlQodG90YWxTaGlmdCA+PTApOyAvKiBNQVhfUVVBTlRfVklPTEFUSU9OICovCi0gICAgICBhY2N1ID4+PSBmaXhNaW4odG90YWxTaGlmdCxERlJBQ1RfQklUUy0xKTsKLSAgICAgIHF1YVNwZWN0cnVtW2xpbmVdID0gKFNIT1JUKSgoTE9ORykoayArIGFjY3UpID4+IChERlJBQ1RfQklUUy0xLTE2KSk7CisgICAgICBJTlQgdGFiSW5kZXggPQorICAgICAgICAgIChJTlQpKGFjY3UgPj4gKERGUkFDVF9CSVRTIC0gMiAtIE1BTlRfRElHSVRTKSkgJiAofk1BTlRfU0laRSk7CisgICAgICBJTlQgdG90YWxTaGlmdCA9IHF1YW50aXplcnNoaWZ0IC0gYWNjdVNoaWZ0ICsgMTsKKyAgICAgIGFjY3UgPSBmTXVsdERpdjIoRkRLYWFjRW5jX21UYWJfM180W3RhYkluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX3F1YW50VGFibGVFW3RvdGFsU2hpZnQgJiAzXSk7CisgICAgICB0b3RhbFNoaWZ0ID0gKDE2IC0gNCkgLSAoMyAqICh0b3RhbFNoaWZ0ID4+IDIpKTsKKyAgICAgIEZES19BU1NFUlQodG90YWxTaGlmdCA+PSAwKTsgLyogTUFYX1FVQU5UX1ZJT0xBVElPTiAqLworICAgICAgYWNjdSA+Pj0gZml4TWluKHRvdGFsU2hpZnQsIERGUkFDVF9CSVRTIC0gMSk7CisgICAgICBxdWFTcGVjdHJ1bVtsaW5lXSA9IChTSE9SVCkoKExPTkcpKGsgKyBhY2N1KSA+PiAoREZSQUNUX0JJVFMgLSAxIC0gMTYpKTsKKyAgICB9IGVsc2UgeworICAgICAgcXVhU3BlY3RydW1bbGluZV0gPSAwOwogICAgIH0KLSAgICBlbHNlCi0gICAgICBxdWFTcGVjdHJ1bVtsaW5lXT0wOwogICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6aUZES2FhY0VuY19xdWFudGl6ZUxpbmVzCkBAIC0xNjQsOTAgKzE3Nyw5MCBAQAogICAgIG91dHB1dDogc3BlY3RyYWwgZGF0YQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19pbnZRdWFudGl6ZUxpbmVzKElOVCAgZ2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICBub09mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtKQorc3RhdGljIHZvaWQgRkRLYWFjRW5jX2ludlF1YW50aXplTGluZXMoSU5UIGdhaW4sIElOVCBub09mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICptZGN0U3BlY3RydW0pCiAKIHsKICAgSU5UIGlxdWFudGl6ZXJtb2Q7CiAgIElOVCBpcXVhbnRpemVyc2hpZnQ7CiAgIElOVCBsaW5lOwogCi0gIGlxdWFudGl6ZXJtb2QgPSBnYWluJjM7Ci0gIGlxdWFudGl6ZXJzaGlmdCA9IGdhaW4+PjI7CisgIGlxdWFudGl6ZXJtb2QgPSBnYWluICYgMzsKKyAgaXF1YW50aXplcnNoaWZ0ID0gZ2FpbiA+PiAyOwogCiAgIGZvciAobGluZSA9IDA7IGxpbmUgPCBub09mTGluZXM7IGxpbmUrKykgewotCi0gICAgaWYocXVhbnRTcGVjdHJ1bVtsaW5lXSA8IDApIHsKKyAgICBpZiAocXVhbnRTcGVjdHJ1bVtsaW5lXSA8IDApIHsKICAgICAgIEZJWFBfREJMIGFjY3U7Ci0gICAgICBJTlQgZXgsc3BlY0V4cCx0YWJJbmRleDsKLSAgICAgIEZJWFBfREJMIHMsdDsKKyAgICAgIElOVCBleCwgc3BlY0V4cCwgdGFiSW5kZXg7CisgICAgICBGSVhQX0RCTCBzLCB0OwogCi0gICAgICBhY2N1ID0gKEZJWFBfREJMKSAtcXVhbnRTcGVjdHJ1bVtsaW5lXTsKKyAgICAgIGFjY3UgPSAoRklYUF9EQkwpLXF1YW50U3BlY3RydW1bbGluZV07CiAKICAgICAgIGV4ID0gQ291bnRMZWFkaW5nQml0cyhhY2N1KTsKICAgICAgIGFjY3UgPDw9IGV4OwotICAgICAgc3BlY0V4cCA9IChERlJBQ1RfQklUUy0xKSAtIGV4OworICAgICAgc3BlY0V4cCA9IChERlJBQ1RfQklUUyAtIDEpIC0gZXg7CiAKLSAgICAgIEZES19BU1NFUlQoc3BlY0V4cCA8IDE0KTsgICAgICAgLyogdGhpcyBmYWlscyBpZiBhYnModmFsdWUpID4gODE5MSAqLworICAgICAgRkRLX0FTU0VSVChzcGVjRXhwIDwgMTQpOyAvKiB0aGlzIGZhaWxzIGlmIGFicyh2YWx1ZSkgPiA4MTkxICovCiAKLSAgICAgIHRhYkluZGV4ID0gKElOVCkoYWNjdT4+KERGUkFDVF9CSVRTLTItTUFOVF9ESUdJVFMpKSYofk1BTlRfU0laRSk7CisgICAgICB0YWJJbmRleCA9IChJTlQpKGFjY3UgPj4gKERGUkFDVF9CSVRTIC0gMiAtIE1BTlRfRElHSVRTKSkgJiAofk1BTlRfU0laRSk7CiAKICAgICAgIC8qIGNhbGN1bGF0ZSAibWFudGlzc2EiIF40LzMgKi8KICAgICAgIHMgPSBGREthYWNFbmNfbVRhYl80XzNFbGNbdGFiSW5kZXhdOwogCi0gICAgICAvKiBnZXQgYXBwcm9wZXJpYXRlIGV4cG9uZW50IG11bHRpcGxpZXIgZm9yIHNwZWNFeHBeMy80IGNvbWJpbmVkIHdpdGggc2NmTW9kICovCisgICAgICAvKiBnZXQgYXBwcm9wZXJpYXRlIGV4cG9uZW50IG11bHRpcGxpZXIgZm9yIHNwZWNFeHBeMy80IGNvbWJpbmVkIHdpdGgKKyAgICAgICAqIHNjZk1vZCAqLwogICAgICAgdCA9IEZES2FhY0VuY19zcGVjRXhwTWFudFRhYmxlQ29tYkVsY1tpcXVhbnRpemVybW9kXVtzcGVjRXhwXTsKIAogICAgICAgLyogbXVsdGlwbHkgIm1hbnRpc3NhIiBeNC8zIHdpdGggZXhwb25lbnQgbXVsdGlwbGllciAqLwotICAgICAgYWNjdSA9IGZNdWx0KHMsdCk7CisgICAgICBhY2N1ID0gZk11bHQocywgdCk7CiAKICAgICAgIC8qIGdldCBhcHByb3BlcmlhdGUgZXhwb25lbnQgc2hpZnRlciAqLwotICAgICAgc3BlY0V4cCA9IEZES2FhY0VuY19zcGVjRXhwVGFibGVDb21iW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdLTE7IC8qIC0xIHRvIGF2b2lkIG92ZXJmbG93cyBpbiBhY2N1ICovCisgICAgICBzcGVjRXhwID0gRkRLYWFjRW5jX3NwZWNFeHBUYWJsZUNvbWJbaXF1YW50aXplcm1vZF1bc3BlY0V4cF0gLQorICAgICAgICAgICAgICAgIDE7IC8qIC0xIHRvIGF2b2lkIG92ZXJmbG93cyBpbiBhY2N1ICovCiAKLSAgICAgIGlmICgoLWlxdWFudGl6ZXJzaGlmdC1zcGVjRXhwKSA8IDApCi0gICAgICAgIGFjY3UgPDw9IC0oLWlxdWFudGl6ZXJzaGlmdC1zcGVjRXhwKTsKKyAgICAgIGlmICgoLWlxdWFudGl6ZXJzaGlmdCAtIHNwZWNFeHApIDwgMCkKKyAgICAgICAgYWNjdSA8PD0gLSgtaXF1YW50aXplcnNoaWZ0IC0gc3BlY0V4cCk7CiAgICAgICBlbHNlCi0gICAgICAgIGFjY3UgPj49IC1pcXVhbnRpemVyc2hpZnQtc3BlY0V4cDsKKyAgICAgICAgYWNjdSA+Pj0gLWlxdWFudGl6ZXJzaGlmdCAtIHNwZWNFeHA7CiAKICAgICAgIG1kY3RTcGVjdHJ1bVtsaW5lXSA9IC1hY2N1OwotICAgIH0KLSAgICBlbHNlIGlmIChxdWFudFNwZWN0cnVtW2xpbmVdID4gMCkgeworICAgIH0gZWxzZSBpZiAocXVhbnRTcGVjdHJ1bVtsaW5lXSA+IDApIHsKICAgICAgIEZJWFBfREJMIGFjY3U7Ci0gICAgICBJTlQgZXgsc3BlY0V4cCx0YWJJbmRleDsKLSAgICAgIEZJWFBfREJMIHMsdDsKKyAgICAgIElOVCBleCwgc3BlY0V4cCwgdGFiSW5kZXg7CisgICAgICBGSVhQX0RCTCBzLCB0OwogCiAgICAgICBhY2N1ID0gKEZJWFBfREJMKShJTlQpcXVhbnRTcGVjdHJ1bVtsaW5lXTsKIAogICAgICAgZXggPSBDb3VudExlYWRpbmdCaXRzKGFjY3UpOwogICAgICAgYWNjdSA8PD0gZXg7Ci0gICAgICBzcGVjRXhwID0gKERGUkFDVF9CSVRTLTEpIC0gZXg7CisgICAgICBzcGVjRXhwID0gKERGUkFDVF9CSVRTIC0gMSkgLSBleDsKIAotICAgICAgRkRLX0FTU0VSVChzcGVjRXhwIDwgMTQpOyAgICAgICAvKiB0aGlzIGZhaWxzIGlmIGFicyh2YWx1ZSkgPiA4MTkxICovCisgICAgICBGREtfQVNTRVJUKHNwZWNFeHAgPCAxNCk7IC8qIHRoaXMgZmFpbHMgaWYgYWJzKHZhbHVlKSA+IDgxOTEgKi8KIAotICAgICAgdGFiSW5kZXggPSAoSU5UKShhY2N1Pj4oREZSQUNUX0JJVFMtMi1NQU5UX0RJR0lUUykpJih+TUFOVF9TSVpFKTsKKyAgICAgIHRhYkluZGV4ID0gKElOVCkoYWNjdSA+PiAoREZSQUNUX0JJVFMgLSAyIC0gTUFOVF9ESUdJVFMpKSAmICh+TUFOVF9TSVpFKTsKIAogICAgICAgLyogY2FsY3VsYXRlICJtYW50aXNzYSIgXjQvMyAqLwogICAgICAgcyA9IEZES2FhY0VuY19tVGFiXzRfM0VsY1t0YWJJbmRleF07CiAKLSAgICAgIC8qIGdldCBhcHByb3BlcmlhdGUgZXhwb25lbnQgbXVsdGlwbGllciBmb3Igc3BlY0V4cF4zLzQgY29tYmluZWQgd2l0aCBzY2ZNb2QgKi8KKyAgICAgIC8qIGdldCBhcHByb3BlcmlhdGUgZXhwb25lbnQgbXVsdGlwbGllciBmb3Igc3BlY0V4cF4zLzQgY29tYmluZWQgd2l0aAorICAgICAgICogc2NmTW9kICovCiAgICAgICB0ID0gRkRLYWFjRW5jX3NwZWNFeHBNYW50VGFibGVDb21iRWxjW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdOwogCiAgICAgICAvKiBtdWx0aXBseSAibWFudGlzc2EiIF40LzMgd2l0aCBleHBvbmVudCBtdWx0aXBsaWVyICovCi0gICAgICBhY2N1ID0gZk11bHQocyx0KTsKKyAgICAgIGFjY3UgPSBmTXVsdChzLCB0KTsKIAogICAgICAgLyogZ2V0IGFwcHJvcGVyaWF0ZSBleHBvbmVudCBzaGlmdGVyICovCi0gICAgICBzcGVjRXhwID0gRkRLYWFjRW5jX3NwZWNFeHBUYWJsZUNvbWJbaXF1YW50aXplcm1vZF1bc3BlY0V4cF0tMTsgLyogLTEgdG8gYXZvaWQgb3ZlcmZsb3dzIGluIGFjY3UgKi8KKyAgICAgIHNwZWNFeHAgPSBGREthYWNFbmNfc3BlY0V4cFRhYmxlQ29tYltpcXVhbnRpemVybW9kXVtzcGVjRXhwXSAtCisgICAgICAgICAgICAgICAgMTsgLyogLTEgdG8gYXZvaWQgb3ZlcmZsb3dzIGluIGFjY3UgKi8KIAotICAgICAgaWYgKCggLWlxdWFudGl6ZXJzaGlmdC1zcGVjRXhwKSA8IDApCi0gICAgICAgIGFjY3UgPDw9IC0oLWlxdWFudGl6ZXJzaGlmdC1zcGVjRXhwKTsKKyAgICAgIGlmICgoLWlxdWFudGl6ZXJzaGlmdCAtIHNwZWNFeHApIDwgMCkKKyAgICAgICAgYWNjdSA8PD0gLSgtaXF1YW50aXplcnNoaWZ0IC0gc3BlY0V4cCk7CiAgICAgICBlbHNlCi0gICAgICAgIGFjY3UgPj49IC1pcXVhbnRpemVyc2hpZnQtc3BlY0V4cDsKKyAgICAgICAgYWNjdSA+Pj0gLWlxdWFudGl6ZXJzaGlmdCAtIHNwZWNFeHA7CiAKICAgICAgIG1kY3RTcGVjdHJ1bVtsaW5lXSA9IGFjY3U7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBtZGN0U3BlY3RydW1bbGluZV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICB9CiAgIH0KQEAgLTI2MiwzNCArMjc1LDI5IEBACiAgICAgb3V0cHV0OiBxdWFudGl6ZWQgc3BlY3RydW0KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEZES2FhY0VuY19RdWFudGl6ZVNwZWN0cnVtKElOVCBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgIElOVCBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgIElOVCBnbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NhbGVmYWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudGl6ZWRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSkKLXsKLSAgSU5UIHNmYk9mZnMsc2ZiOwordm9pZCBGREthYWNFbmNfUXVhbnRpemVTcGVjdHJ1bShJTlQgc2ZiQ250LCBJTlQgbWF4U2ZiUGVyR3JvdXAsIElOVCBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICptZGN0U3BlY3RydW0sIElOVCBnbG9iYWxHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKnNjYWxlZmFjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50aXplZFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSkgeworICBJTlQgc2ZiT2Zmcywgc2ZiOwogCiAgIC8qIGluIEZES2FhY0VuY19xdWFudGl6ZUxpbmVzIHF1YVNwZWN0cnVtIGlzIGNhbGN1bGF0ZWQgd2l0aDoKICAgICAgICAgc3BlY14oMy80KSAqIDJeKC0zLzE2KlFTUykgKiAyXigzLzQqc2NhbGUpICsgawogICAgICBzaW1wbGlmeSBzY2FsaW5nIGNhbGN1bGF0aW9uIGFuZCByZWR1Y2UgUVNTIGJlZm9yZToKICAgICAgICAgc3BlY14oMy80KSAqIDJeKC0zLzE2KihRU1MgLSA0KnNjYWxlKSkgKi8KIAotICBmb3Ioc2ZiT2Zmcz0wO3NmYk9mZnM8c2ZiQ250O3NmYk9mZnMrPXNmYlBlckdyb3VwKQotICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykKLSAgewotICAgIElOVCBzY2FsZWZhY3RvciA9IHNjYWxlZmFjdG9yc1tzZmJPZmZzK3NmYl0gOworICBmb3IgKHNmYk9mZnMgPSAwOyBzZmJPZmZzIDwgc2ZiQ250OyBzZmJPZmZzICs9IHNmYlBlckdyb3VwKQorICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICBJTlQgc2NhbGVmYWN0b3IgPSBzY2FsZWZhY3RvcnNbc2ZiT2ZmcyArIHNmYl07CiAKLSAgICBGREthYWNFbmNfcXVhbnRpemVMaW5lcyhnbG9iYWxHYWluIC0gc2NhbGVmYWN0b3IsIC8qIFFTUyAqLwotICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiKzFdIC0gc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiXSwKLSAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bSArIHNmYk9mZnNldFtzZmJPZmZzK3NmYl0sCi0gICAgICAgICAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJ1bSArIHNmYk9mZnNldFtzZmJPZmZzK3NmYl0sCi0gICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlKTsKLSAgfQorICAgICAgRkRLYWFjRW5jX3F1YW50aXplTGluZXMoCisgICAgICAgICAgZ2xvYmFsR2FpbiAtIHNjYWxlZmFjdG9yLCAvKiBRU1MgKi8KKyAgICAgICAgICBzZmJPZmZzZXRbc2ZiT2ZmcyArIHNmYiArIDFdIC0gc2ZiT2Zmc2V0W3NmYk9mZnMgKyBzZmJdLAorICAgICAgICAgIG1kY3RTcGVjdHJ1bSArIHNmYk9mZnNldFtzZmJPZmZzICsgc2ZiXSwKKyAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJ1bSArIHNmYk9mZnNldFtzZmJPZmZzICsgc2ZiXSwgZFpvbmVRdWFudEVuYWJsZSk7CisgICAgfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMwMSw0MSArMzA5LDM0IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUZJWFBfREJMIEZES2FhY0VuY19jYWxjU2ZiRGlzdChGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICBJTlQgbm9PZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgSU5UIGdhaW4sCi0gICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZQotICAgICAgICAgICAgICAgICAgICAgKQotewotICBJTlQgaSxzY2FsZTsKK0ZJWFBfREJMIEZES2FhY0VuY19jYWxjU2ZiRGlzdChjb25zdCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWN0cnVtLCBJTlQgbm9PZkxpbmVzLCBJTlQgZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSkgeworICBJTlQgaSwgc2NhbGU7CiAgIEZJWFBfREJMIHhmc2Y7CiAgIEZJWFBfREJMIGRpZmY7CiAgIEZJWFBfREJMIGludlF1YW50U3BlYzsKIAogICB4ZnNmID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgZm9yIChpPTA7IGk8bm9PZkxpbmVzOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IG5vT2ZMaW5lczsgaSsrKSB7CiAgICAgLyogcXVhbnRpemF0aW9uICovCi0gICAgRkRLYWFjRW5jX3F1YW50aXplTGluZXMoZ2FpbiwKLSAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICZtZGN0U3BlY3RydW1baV0sCi0gICAgICAgICAgICAgICAgICZxdWFudFNwZWN0cnVtW2ldLAotICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CisgICAgRkRLYWFjRW5jX3F1YW50aXplTGluZXMoZ2FpbiwgMSwgJm1kY3RTcGVjdHJ1bVtpXSwgJnF1YW50U3BlY3RydW1baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CiAKLSAgICBpZiAoZkFicyhxdWFudFNwZWN0cnVtW2ldKT5NQVhfUVVBTlQpIHsKKyAgICBpZiAoZkFicyhxdWFudFNwZWN0cnVtW2ldKSA+IE1BWF9RVUFOVCkgewogICAgICAgcmV0dXJuIEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgIH0KICAgICAvKiBpbnZlcnNlIHF1YW50aXphdGlvbiAqLwotICAgIEZES2FhY0VuY19pbnZRdWFudGl6ZUxpbmVzKGdhaW4sMSwmcXVhbnRTcGVjdHJ1bVtpXSwmaW52UXVhbnRTcGVjKTsKKyAgICBGREthYWNFbmNfaW52UXVhbnRpemVMaW5lcyhnYWluLCAxLCAmcXVhbnRTcGVjdHJ1bVtpXSwgJmludlF1YW50U3BlYyk7CiAKICAgICAvKiBkaXN0ICovCi0gICAgZGlmZiA9IGZpeHBfYWJzKGZpeHBfYWJzKGludlF1YW50U3BlYykgLSBmaXhwX2FicyhtZGN0U3BlY3RydW1baV0+PjEpKTsKKyAgICBkaWZmID0gZml4cF9hYnMoZml4cF9hYnMoaW52UXVhbnRTcGVjKSAtIGZpeHBfYWJzKG1kY3RTcGVjdHJ1bVtpXSA+PiAxKSk7CiAKICAgICBzY2FsZSA9IENvdW50TGVhZGluZ0JpdHMoZGlmZik7CiAgICAgZGlmZiA9IHNjYWxlVmFsdWUoZGlmZiwgc2NhbGUpOwogICAgIGRpZmYgPSBmUG93MihkaWZmKTsKLSAgICBzY2FsZSA9IGZpeE1pbigyKihzY2FsZS0xKSwgREZSQUNUX0JJVFMtMSk7CisgICAgc2NhbGUgPSBmaXhNaW4oMiAqIChzY2FsZSAtIDEpLCBERlJBQ1RfQklUUyAtIDEpOwogCiAgICAgZGlmZiA9IHNjYWxlVmFsdWUoZGlmZiwgLXNjYWxlKTsKIApAQCAtMzU4LDQ4ICszNTksNDMgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEZES2FhY0VuY19jYWxjU2ZiUXVhbnRFbmVyZ3lBbmREaXN0KEZJWFBfREJMICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vT2ZMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRpc3QpCi17Ci0gIElOVCBpLHNjYWxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjdHJ1bSwgSU5UIG5vT2ZMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdhaW4sIEZJWFBfREJMICplbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRpc3QpIHsKKyAgSU5UIGksIHNjYWxlOwogICBGSVhQX0RCTCBpbnZRdWFudFNwZWM7CiAgIEZJWFBfREJMIGRpZmY7CiAKICAgRklYUF9EQkwgZW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgIEZJWFBfREJMIGRpc3RvcnRpb24gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAotICBmb3IgKGk9MDsgaTxub09mTGluZXM7IGkrKykgewotCi0gICAgaWYgKGZBYnMocXVhbnRTcGVjdHJ1bVtpXSk+TUFYX1FVQU5UKSB7Ci0gICAgICAqZW4gICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBmb3IgKGkgPSAwOyBpIDwgbm9PZkxpbmVzOyBpKyspIHsKKyAgICBpZiAoZkFicyhxdWFudFNwZWN0cnVtW2ldKSA+IE1BWF9RVUFOVCkgeworICAgICAgKmVuID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAqZGlzdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIC8qIGludmVyc2UgcXVhbnRpemF0aW9uICovCi0gICAgRkRLYWFjRW5jX2ludlF1YW50aXplTGluZXMoZ2FpbiwxLCZxdWFudFNwZWN0cnVtW2ldLCZpbnZRdWFudFNwZWMpOworICAgIEZES2FhY0VuY19pbnZRdWFudGl6ZUxpbmVzKGdhaW4sIDEsICZxdWFudFNwZWN0cnVtW2ldLCAmaW52UXVhbnRTcGVjKTsKIAogICAgIC8qIGVuZXJneSAqLwogICAgIGVuZXJneSArPSBmUG93MihpbnZRdWFudFNwZWMpOwogCiAgICAgLyogZGlzdCAqLwotICAgIGRpZmYgPSBmaXhwX2FicyhmaXhwX2FicyhpbnZRdWFudFNwZWMpIC0gZml4cF9hYnMobWRjdFNwZWN0cnVtW2ldPj4xKSk7CisgICAgZGlmZiA9IGZpeHBfYWJzKGZpeHBfYWJzKGludlF1YW50U3BlYykgLSBmaXhwX2FicyhtZGN0U3BlY3RydW1baV0gPj4gMSkpOwogCiAgICAgc2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKGRpZmYpOwogICAgIGRpZmYgPSBzY2FsZVZhbHVlKGRpZmYsIHNjYWxlKTsKICAgICBkaWZmID0gZlBvdzIoZGlmZik7CiAKLSAgICBzY2FsZSA9IGZpeE1pbigyKihzY2FsZS0xKSwgREZSQUNUX0JJVFMtMSk7CisgICAgc2NhbGUgPSBmaXhNaW4oMiAqIChzY2FsZSAtIDEpLCBERlJBQ1RfQklUUyAtIDEpOwogCiAgICAgZGlmZiA9IHNjYWxlVmFsdWUoZGlmZiwgLXNjYWxlKTsKIAogICAgIGRpc3RvcnRpb24gKz0gZGlmZjsKICAgfQogCi0gICplbiAgID0gQ2FsY0xkRGF0YShlbmVyZ3kpK0ZMMkZYQ09OU1RfREJMKDAuMDMxMjVmKTsKKyAgKmVuID0gQ2FsY0xkRGF0YShlbmVyZ3kpICsgRkwyRlhDT05TVF9EQkwoMC4wMzEyNWYpOwogICAqZGlzdCA9IENhbGNMZERhdGEoZGlzdG9ydGlvbik7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcXVhbnRpemUuaCBiL2xpYkFBQ2VuYy9zcmMvcXVhbnRpemUuaAppbmRleCAxNmQzZDRlLi5kZmMyMjA2IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3F1YW50aXplLmgKKysrIGIvbGliQUFDZW5jL3NyYy9xdWFudGl6ZS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE3ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFF1YW50aXphdGlvbgorICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBRdWFudGl6YXRpb24KIAotI2lmbmRlZiBfUVVBTlRJWkVfSF8KLSNkZWZpbmUgX1FVQU5USVpFX0hfCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFFVQU5USVpFX0gKKyNkZWZpbmUgUVVBTlRJWkVfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCkBAIC05NywyNSArMTA5LDE5IEBACiAKICNkZWZpbmUgTUFYX1FVQU5UIDgxOTEKIAotdm9pZCBGREthYWNFbmNfUXVhbnRpemVTcGVjdHJ1bShJTlQgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgIElOVCBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgSU5UICpzZmJPZmZzZXQsIEZJWFBfREJMICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIGdsb2JhbEdhaW4sIElOVCAqc2NhbGVmYWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudGl6ZWRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSk7Cit2b2lkIEZES2FhY0VuY19RdWFudGl6ZVNwZWN0cnVtKElOVCBzZmJDbnQsIElOVCBtYXhTZmJQZXJHcm91cCwgSU5UIHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwgSU5UIGdsb2JhbEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqc2NhbGVmYWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRpemVkU3BlY3RydW0sIElOVCBkWm9uZVF1YW50RW5hYmxlKTsKIAotRklYUF9EQkwgRkRLYWFjRW5jX2NhbGNTZmJEaXN0KEZJWFBfREJMICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgIElOVCBub09mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICBJTlQgZ2FpbiwKLSAgICAgICAgICAgICAgICAgICAgIElOVCBkWm9uZVF1YW50RW5hYmxlKTsKK0ZJWFBfREJMIEZES2FhY0VuY19jYWxjU2ZiRGlzdChjb25zdCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWN0cnVtLCBJTlQgbm9PZkxpbmVzLCBJTlQgZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSk7CiAKIHZvaWQgRkRLYWFjRW5jX2NhbGNTZmJRdWFudEVuZXJneUFuZERpc3QoRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAgICpxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICBub09mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgIGdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY3RydW0sIElOVCBub09mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBnYWluLCBGSVhQX0RCTCAqZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkaXN0KTsKIAotI2VuZGlmIC8qIF9RVUFOVElaRV9IXyAqLworI2VuZGlmIC8qIFFVQU5USVpFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvc2ZfZXN0aW0uY3BwIGIvbGliQUFDZW5jL3NyYy9zZl9lc3RpbS5jcHAKaW5kZXggMWNiMjQzYi4uMTdhOGFlMiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9zZl9lc3RpbS5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9zZl9lc3RpbS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzMgKzkwLDM1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFNjYWxlIGZhY3RvciBlc3RpbWF0aW9uCisgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAic2ZfZXN0aW0uaCIKICNpbmNsdWRlICJhYWNFbmNfcm9tLmgiCiAjaW5jbHVkZSAicXVhbnRpemUuaCIKICNpbmNsdWRlICJiaXRfY250LmgiCiAKKyNpZmRlZiBfX2FybV9fCisjZW5kaWYKIAotCi0KKyNkZWZpbmUgVVBDT1VOVF9MSU1JVCAxCiAjZGVmaW5lIEFTX1BFX0ZBQ19TSElGVCA3Ci0jZGVmaW5lIERJU1RfRkFDX1NISUZUICAzCisjZGVmaW5lIERJU1RfRkFDX1NISUZUIDMKICNkZWZpbmUgQVNfUEVfRkFDX0ZMT0FUIChmbG9hdCkoMSA8PCBBU19QRV9GQUNfU0hJRlQpCiBzdGF0aWMgY29uc3QgSU5UIE1BWF9TQ0ZfREVMVEEgPSA2MDsKIAotCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgUEVfQzEgPSBGTDJGWENPTlNUX0RCTCgzLjBmL0FTX1BFX0ZBQ19GTE9BVCk7ICAgICAgICAgIC8qIChsb2coOC4wKS9sb2coMikpID4+IEFTX1BFX0ZBQ19TSElGVCAqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMIFBFX0MyID0gRkwyRlhDT05TVF9EQkwoMS4zMjE5MjgxZi9BU19QRV9GQUNfRkxPQVQpOyAgICAvKiAobG9nKDIuNSkvbG9nKDIpKSA+PiBBU19QRV9GQUNfU0hJRlQgKi8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBQRV9DMyA9IEZMMkZYQ09OU1RfREJMKDAuNTU5MzU3M2YpOyAgICAgICAgICAgICAgICAgICAgLyogMS1DMi9DMSAqLwotCitzdGF0aWMgY29uc3QgRklYUF9EQkwgUEVfQzEgPSBGTDJGWENPTlNUX0RCTCgKKyAgICAzLjBmIC8gQVNfUEVfRkFDX0ZMT0FUKTsgLyogKGxvZyg4LjApL2xvZygyKSkgPj4gQVNfUEVfRkFDX1NISUZUICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgUEVfQzIgPSBGTDJGWENPTlNUX0RCTCgKKyAgICAxLjMyMTkyODFmIC8gQVNfUEVfRkFDX0ZMT0FUKTsgLyogKGxvZygyLjUpL2xvZygyKSkgPj4gQVNfUEVfRkFDX1NISUZUICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgUEVfQzMgPSBGTDJGWENPTlNUX0RCTCgwLjU1OTM1NzNmKTsgLyogMS1DMi9DMSAqLwogCiAvKgogICBGdW5jdGlvbjsgRkRLYWFjRW5jX0ZES2FhY0VuY19DYWxjRm9ybUZhY3RvckNoYW5uZWwKQEAgLTExMywzMCArMTI2LDMyIEBACiAgIERlc2NyaXB0aW9uOiBDYWxjdWxhdGVzIHRoZSBmb3JtZmFjdG9yCiAKICAgc2Y6IHNjYWxlIGZhY3RvciBvZiB0aGUgbWRjdCBzcGVjdHJ1bQotICBzZmJGb3JtRmFjdG9yTGREYXRhIGlzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IgMS8oKCgyXnNmKV4wLjUpICogKDJeRk9STV9GQUNfU0hJRlQpKQorICBzZmJGb3JtRmFjdG9yTGREYXRhIGlzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IgMS8oKCgyXnNmKV4wLjUpICoKKyAgKDJeRk9STV9GQUNfU0hJRlQpKQogKi8KLXN0YXRpYyB2b2lkCi1GREthYWNFbmNfRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yQ2hhbm5lbChGSVhQX0RCTCAqUkVTVFJJQ1Qgc2ZiRm9ybUZhY3RvckxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKlJFU1RSSUNUIHBzeU91dENoYW4pCi17CitzdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yQ2hhbm5lbCgKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2ZiRm9ybUZhY3RvckxkRGF0YSwKKyAgICBQU1lfT1VUX0NIQU5ORUwgKlJFU1RSSUNUIHBzeU91dENoYW4pIHsKICAgSU5UIGosIHNmYiwgc2ZiR3JwOwogICBGSVhQX0RCTCBmb3JtRmFjdG9yOwogCiAgIGludCB0bXAwID0gcHN5T3V0Q2hhbi0+c2ZiQ250OwogICBpbnQgdG1wMSA9IHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOwogICBpbnQgc3RlcCA9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwOwotICBmb3Ioc2ZiR3JwID0gMDsgc2ZiR3JwIDwgdG1wMDsgc2ZiR3JwICs9IHN0ZXApIHsKKyAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCB0bXAwOyBzZmJHcnAgKz0gc3RlcCkgewogICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgdG1wMTsgc2ZiKyspIHsKICAgICAgIGZvcm1GYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgIC8qIGNhbGMgc3VtIG9mIHNxcnQoc3BlYykgKi8KLSAgICAgIGZvcihqPXBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiR3JwK3NmYl07IGo8cHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJHcnArc2ZiKzFdOyBqKysgKSB7Ci0gICAgICAgICBmb3JtRmFjdG9yICs9IHNxcnRGaXhwKGZpeHBfYWJzKHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bVtqXSkpPj5GT1JNX0ZBQ19TSElGVDsKKyAgICAgIGZvciAoaiA9IHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiR3JwICsgc2ZiXTsKKyAgICAgICAgICAgaiA8IHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiR3JwICsgc2ZiICsgMV07IGorKykgeworICAgICAgICBmb3JtRmFjdG9yICs9CisgICAgICAgICAgICBzcXJ0Rml4cChmaXhwX2Ficyhwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW1bal0pKSA+PiBGT1JNX0ZBQ19TSElGVDsKICAgICAgIH0KLSAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiR3JwK3NmYl0gPSBDYWxjTGREYXRhKGZvcm1GYWN0b3IpOworICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJHcnAgKyBzZmJdID0gQ2FsY0xkRGF0YShmb3JtRmFjdG9yKTsKICAgICB9CiAgICAgLyogc2V0IHNmYkZvcm1GYWN0b3IgZm9yIHNmYnMgd2l0aCB6ZXJvIHNwZWMgdG8gemVyby4gSnVzdCBmb3IgZGVidWdnaW5nLiAqLwotICAgIGZvciAoIDsgc2ZiIDwgcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICBzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICAgIGZvciAoOyBzZmIgPCBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiR3JwICsgc2ZiXSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgICB9CiAgIH0KIH0KQEAgLTE0NCwxNyArMTU5LDE3IEBACiAvKgogICBGdW5jdGlvbjogRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yCiAKLSAgRGVzY3JpcHRpb246IENhbGxzIEZES2FhY0VuY19GREthYWNFbmNfQ2FsY0Zvcm1GYWN0b3JDaGFubmVsKCkgZm9yIGVhY2ggY2hhbm5lbAorICBEZXNjcmlwdGlvbjogQ2FsbHMgRkRLYWFjRW5jX0ZES2FhY0VuY19DYWxjRm9ybUZhY3RvckNoYW5uZWwoKSBmb3IgZWFjaAorICBjaGFubmVsCiAqLwogCi12b2lkCi1GREthYWNFbmNfQ2FsY0Zvcm1GYWN0b3IoUUNfT1VUX0NIQU5ORUwgICAqcWNPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICpwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5DaGFubmVscykKLXsKK3ZvaWQgRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yKFFDX09VVF9DSEFOTkVMICpxY091dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykgewogICBJTlQgajsKLSAgZm9yIChqPTA7IGo8bkNoYW5uZWxzOyBqKyspIHsKLSAgICBGREthYWNFbmNfRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yQ2hhbm5lbChxY091dENoYW5uZWxbal0tPnNmYkZvcm1GYWN0b3JMZERhdGEsIHBzeU91dENoYW5uZWxbal0pOworICBmb3IgKGogPSAwOyBqIDwgbkNoYW5uZWxzOyBqKyspIHsKKyAgICBGREthYWNFbmNfRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yQ2hhbm5lbCgKKyAgICAgICAgcWNPdXRDaGFubmVsW2pdLT5zZmJGb3JtRmFjdG9yTGREYXRhLCBwc3lPdXRDaGFubmVsW2pdKTsKICAgfQogfQogCkBAIC0xNjUsNDAgKzE4MCw0NCBAQAogCiAgIHNmYk5SZWxldmFudExpbmVzIGlzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IgMS8oKDJeRk9STV9GQUNfU0hJRlQpICogMi4wKQogKi8KLXN0YXRpYyB2b2lkCi1GREthYWNFbmNfY2FsY1NmYlJlbGV2YW50TGluZXMoIGNvbnN0IEZJWFBfREJMICpjb25zdCBzZmJGb3JtRmFjdG9yTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBzZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHNmYlRocmVzaG9sZExkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmNvbnN0IHNmYk9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJOUmVsZXZhbnRMaW5lcykKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jYWxjU2ZiUmVsZXZhbnRMaW5lcygKKyAgICBjb25zdCBGSVhQX0RCTCAqY29uc3Qgc2ZiRm9ybUZhY3RvckxkRGF0YSwKKyAgICBjb25zdCBGSVhQX0RCTCAqY29uc3Qgc2ZiRW5lcmd5TGREYXRhLAorICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBzZmJUaHJlc2hvbGRMZERhdGEsIGNvbnN0IElOVCAqY29uc3Qgc2ZiT2Zmc2V0cywKKyAgICBjb25zdCBJTlQgc2ZiQ250LCBjb25zdCBJTlQgc2ZiUGVyR3JvdXAsIGNvbnN0IElOVCBtYXhTZmJQZXJHcm91cCwKKyAgICBGSVhQX0RCTCAqc2ZiTlJlbGV2YW50TGluZXMpIHsKICAgSU5UIHNmYk9mZnMsIHNmYjsKICAgRklYUF9EQkwgc2ZiV2lkdGhMZERhdGE7Ci0gIEZJWFBfREJMIGFzUGVGYWNMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NSk7ICAgLyogQVNfUEVfRkFDX1NISUZUKmxkNjQoMikgKi8KKyAgRklYUF9EQkwgYXNQZUZhY0xkRGF0YSA9CisgICAgICBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NSk7IC8qIEFTX1BFX0ZBQ19TSElGVCpsZDY0KDIpICovCiAgIEZJWFBfREJMIGFjY3U7CiAKLSAgLyogc2ZiTlJlbGV2YW50TGluZXNbaV0gPSAyXiggKHNmYkZvcm1GYWN0b3JMZERhdGFbaV0gLSAwLjI1ICogKHNmYkVuZXJneUxkRGF0YVtpXSAtIGxkNjQoc2ZiV2lkdGhbaV0vKDJeNykpIC0gQVNfUEVfRkFDX1NISUZUKmxkNjQoMikpICogNjQpOyAqLworICAvKiBzZmJOUmVsZXZhbnRMaW5lc1tpXSA9IDJeKCAoc2ZiRm9ybUZhY3RvckxkRGF0YVtpXSAtIDAuMjUgKgorICAgKiAoc2ZiRW5lcmd5TGREYXRhW2ldIC0gbGQ2NChzZmJXaWR0aFtpXS8oMl43KSkgLSBBU19QRV9GQUNfU0hJRlQqbGQ2NCgyKSkgKgorICAgKiA2NCk7ICovCiAKICAgRkRLbWVtY2xlYXIoc2ZiTlJlbGV2YW50TGluZXMsIHNmYkNudCAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gIGZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHNmYkNudDsgc2ZiT2Zmcys9c2ZiUGVyR3JvdXApIHsKLSAgICBmb3Ioc2ZiPTA7IHNmYjxtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgZm9yIChzZmJPZmZzID0gMDsgc2ZiT2ZmcyA8IHNmYkNudDsgc2ZiT2ZmcyArPSBzZmJQZXJHcm91cCkgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAvKiBjYWxjIHN1bSBvZiBzcXJ0KHNwZWMpICovCi0gICAgICBpZigoRklYUF9EQkwpc2ZiRW5lcmd5TGREYXRhW3NmYk9mZnMrc2ZiXSA+IChGSVhQX0RCTClzZmJUaHJlc2hvbGRMZERhdGFbc2ZiT2ZmcytzZmJdKSB7Ci0gICAgICAgIElOVCBzZmJXaWR0aCA9IHNmYk9mZnNldHNbc2ZiT2ZmcytzZmIrMV0gLSBzZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXTsKKyAgICAgIGlmICgoRklYUF9EQkwpc2ZiRW5lcmd5TGREYXRhW3NmYk9mZnMgKyBzZmJdID4KKyAgICAgICAgICAoRklYUF9EQkwpc2ZiVGhyZXNob2xkTGREYXRhW3NmYk9mZnMgKyBzZmJdKSB7CisgICAgICAgIElOVCBzZmJXaWR0aCA9CisgICAgICAgICAgICBzZmJPZmZzZXRzW3NmYk9mZnMgKyBzZmIgKyAxXSAtIHNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYl07CiAKLSAgICAgICAgLyogYXZnRm9ybUZhY3RvckxkRGF0YSA9IHNxcnRGaXhwKHNxcnRGaXhwKHNmYkVuZXJneUxkRGF0YVtzZmJPZmZzK3NmYl0vc2ZiV2lkdGgpKTsgKi8KLSAgICAgICAgLyogc2ZiTlJlbGV2YW50TGluZXNbc2ZiT2ZmcytzZmJdID0gc2ZiRm9ybUZhY3RvcltzZmJPZmZzK3NmYl0gLyBhdmdGb3JtRmFjdG9yTGREYXRhOyAqLwotICAgICAgICBzZmJXaWR0aExkRGF0YSA9IChGSVhQX0RCTCkoc2ZiV2lkdGggPDwgKERGUkFDVF9CSVRTLTEtQVNfUEVfRkFDX1NISUZUKSk7CisgICAgICAgIC8qIGF2Z0Zvcm1GYWN0b3JMZERhdGEgPQorICAgICAgICAgKiBzcXJ0Rml4cChzcXJ0Rml4cChzZmJFbmVyZ3lMZERhdGFbc2ZiT2ZmcytzZmJdL3NmYldpZHRoKSk7ICovCisgICAgICAgIC8qIHNmYk5SZWxldmFudExpbmVzW3NmYk9mZnMrc2ZiXSA9IHNmYkZvcm1GYWN0b3Jbc2ZiT2ZmcytzZmJdIC8KKyAgICAgICAgICogYXZnRm9ybUZhY3RvckxkRGF0YTsgKi8KKyAgICAgICAgc2ZiV2lkdGhMZERhdGEgPQorICAgICAgICAgICAgKEZJWFBfREJMKShzZmJXaWR0aCA8PCAoREZSQUNUX0JJVFMgLSAxIC0gQVNfUEVfRkFDX1NISUZUKSk7CiAgICAgICAgIHNmYldpZHRoTGREYXRhID0gQ2FsY0xkRGF0YShzZmJXaWR0aExkRGF0YSk7CiAKLSAgICAgICAgYWNjdSA9IHNmYkVuZXJneUxkRGF0YVtzZmJPZmZzK3NmYl0gLSBzZmJXaWR0aExkRGF0YSAtIGFzUGVGYWNMZERhdGE7Ci0gICAgICAgIGFjY3UgPSBzZmJGb3JtRmFjdG9yTGREYXRhW3NmYk9mZnMrc2ZiXSAtIChhY2N1ID4+IDIpOworICAgICAgICBhY2N1ID0gc2ZiRW5lcmd5TGREYXRhW3NmYk9mZnMgKyBzZmJdIC0gc2ZiV2lkdGhMZERhdGEgLSBhc1BlRmFjTGREYXRhOworICAgICAgICBhY2N1ID0gc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJPZmZzICsgc2ZiXSAtIChhY2N1ID4+IDIpOwogCi0gICAgICAgIHNmYk5SZWxldmFudExpbmVzW3NmYk9mZnMrc2ZiXSA9IENhbGNJbnZMZERhdGEoYWNjdSkgPj4gMTsKKyAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbc2ZiT2ZmcyArIHNmYl0gPSBDYWxjSW52TGREYXRhKGFjY3UpID4+IDE7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0yMTEsMTQgKzIzMCwxNCBAQAogCiAgIHNjZkJpdHNGcmFjdCBpcyBzY2FsZWQgYnkgMS8oMl4oMipBU19QRV9GQUNfU0hJRlQpKQogKi8KLXN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY291bnRTaW5nbGVTY2ZCaXRzKElOVCBzY2YsIElOVCBzY2ZMZWZ0LCBJTlQgc2NmUmlnaHQpCi17CitzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NvdW50U2luZ2xlU2NmQml0cyhJTlQgc2NmLCBJTlQgc2NmTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2ZSaWdodCkgewogICBGSVhQX0RCTCBzY2ZCaXRzRnJhY3Q7CiAKLSAgc2NmQml0c0ZyYWN0ID0gKEZJWFBfREJMKSAoICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZkxlZnQtc2NmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmLXNjZlJpZ2h0KSApOworICBzY2ZCaXRzRnJhY3QgPSAoRklYUF9EQkwpKEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTGVmdCAtIHNjZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmIC0gc2NmUmlnaHQpKTsKIAotICBzY2ZCaXRzRnJhY3QgPSBzY2ZCaXRzRnJhY3QgPDwgKERGUkFDVF9CSVRTLTEtKDIqQVNfUEVfRkFDX1NISUZUKSk7CisgIHNjZkJpdHNGcmFjdCA9IHNjZkJpdHNGcmFjdCA8PCAoREZSQUNUX0JJVFMgLSAxIC0gKDIgKiBBU19QRV9GQUNfU0hJRlQpKTsKIAogICByZXR1cm4gc2NmQml0c0ZyYWN0OyAvKiBvdXRwdXQgc2NhbGVkIGJ5IDEvKDJeKDIqQVNfUEVfRkFDKSkgKi8KIH0KQEAgLTIyOCwyMSArMjQ3LDIxIEBACiAKICAgc3BlY1BlIGlzIHNjYWxlZCBieSAxLygyXigyKkFTX1BFX0ZBQ19TSElGVCkpCiAqLwotc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jYWxjU2luZ2xlU3BlY1BlKElOVCBzY2YsIEZJWFBfREJMIHNmYkNvbnN0UGVQYXJ0LCBGSVhQX0RCTCBuTGluZXMpCi17CitzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NhbGNTaW5nbGVTcGVjUGUoSU5UIHNjZiwgRklYUF9EQkwgc2ZiQ29uc3RQZVBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbkxpbmVzKSB7CiAgIEZJWFBfREJMIHNwZWNQZSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBGSVhQX0RCTCBsZFJhdGlvOwogICBGSVhQX0RCTCBzY2ZGcmFjdDsKIAotICBzY2ZGcmFjdCA9IChGSVhQX0RCTCkoc2NmIDw8IChERlJBQ1RfQklUUy0xLUFTX1BFX0ZBQ19TSElGVCkpOworICBzY2ZGcmFjdCA9IChGSVhQX0RCTCkoc2NmIDw8IChERlJBQ1RfQklUUyAtIDEgLSBBU19QRV9GQUNfU0hJRlQpKTsKIAotICBsZFJhdGlvID0gc2ZiQ29uc3RQZVBhcnQgLSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjM3NWYpLHNjZkZyYWN0KTsKKyAgbGRSYXRpbyA9IHNmYkNvbnN0UGVQYXJ0IC0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC4zNzVmKSwgc2NmRnJhY3QpOwogCiAgIGlmIChsZFJhdGlvID49IFBFX0MxKSB7Ci0gICAgc3BlY1BlID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksZk11bHQobkxpbmVzLGxkUmF0aW8pKTsKLSAgfQotICBlbHNlIHsKLSAgICBzcGVjUGUgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSxmTXVsdChuTGluZXMsKFBFX0MyICsgZk11bHQoUEVfQzMsbGRSYXRpbykpKSk7CisgICAgc3BlY1BlID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksIGZNdWx0KG5MaW5lcywgbGRSYXRpbykpOworICB9IGVsc2UgeworICAgIHNwZWNQZSA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLAorICAgICAgICAgICAgICAgICAgIGZNdWx0KG5MaW5lcywgKFBFX0MyICsgZk11bHQoUEVfQzMsIGxkUmF0aW8pKSkpOwogICB9CiAKICAgcmV0dXJuIHNwZWNQZTsgLyogb3V0cHV0IHNjYWxlZCBieSAxLygyXigyKkFTX1BFX0ZBQykpICovCkBAIC0yNTMsMTIgKzI3Miw4IEBACiAKICAgc2NmQml0c0RpZmYgaXMgc2NhbGVkIGJ5IDEvKDJeKDIqQVNfUEVfRkFDX1NISUZUKSkKICovCi1zdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NvdW50U2NmQml0c0RpZmYoSU5UICpzY2ZPbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjZk5ldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnRTZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcFNmYikKLXsKK3N0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY291bnRTY2ZCaXRzRGlmZihJTlQgKnNjZk9sZCwgSU5UICpzY2ZOZXcsIElOVCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0U2ZiLCBJTlQgc3RvcFNmYikgewogICBGSVhQX0RCTCBzY2ZCaXRzRnJhY3Q7CiAgIElOVCBzY2ZCaXRzRGlmZiA9IDA7CiAgIElOVCBzZmIgPSAwLCBzZmJMYXN0OwpAQCAtMjY2LDMyICsyODEsMzMgQEAKIAogICAvKiBzZWFyY2ggZm9yIGZpcnN0IHJlbGV2YW50IHNmYiAqLwogICBzZmJMYXN0ID0gc3RhcnRTZmI7Ci0gIHdoaWxlICgoc2ZiTGFzdDxzdG9wU2ZiKSAmJiAoc2NmT2xkW3NmYkxhc3RdPT1GREtfSU5UX01JTikpCi0gICAgc2ZiTGFzdCsrOworICB3aGlsZSAoKHNmYkxhc3QgPCBzdG9wU2ZiKSAmJiAoc2NmT2xkW3NmYkxhc3RdID09IEZES19JTlRfTUlOKSkgc2ZiTGFzdCsrOwogICAvKiBzZWFyY2ggZm9yIHByZXZpb3VzIHJlbGV2YW50IHNmYiBhbmQgY291bnQgZGlmZiAqLwogICBzZmJQcmV2ID0gc3RhcnRTZmIgLSAxOwotICB3aGlsZSAoKHNmYlByZXY+PTApICYmIChzY2ZPbGRbc2ZiUHJldl09PUZES19JTlRfTUlOKSkKLSAgICBzZmJQcmV2LS07Ci0gIGlmIChzZmJQcmV2Pj0wKQotICAgIHNjZkJpdHNEaWZmICs9IEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTmV3W3NmYlByZXZdLXNjZk5ld1tzZmJMYXN0XSkgLQotICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYlByZXZdLXNjZk9sZFtzZmJMYXN0XSk7CisgIHdoaWxlICgoc2ZiUHJldiA+PSAwKSAmJiAoc2NmT2xkW3NmYlByZXZdID09IEZES19JTlRfTUlOKSkgc2ZiUHJldi0tOworICBpZiAoc2ZiUHJldiA+PSAwKQorICAgIHNjZkJpdHNEaWZmICs9CisgICAgICAgIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTmV3W3NmYlByZXZdIC0gc2NmTmV3W3NmYkxhc3RdKSAtCisgICAgICAgIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYlByZXZdIC0gc2NmT2xkW3NmYkxhc3RdKTsKICAgLyogbm93IGxvb3AgdGhyb3VnaCBhbGwgc2ZicyBhbmQgY291bnQgZGlmZnMgb2YgcmVsZXZhbnQgc2ZicyAqLwotICBmb3IgKHNmYj1zZmJMYXN0KzE7IHNmYjxzdG9wU2ZiOyBzZmIrKykgewotICAgIGlmIChzY2ZPbGRbc2ZiXSE9RkRLX0lOVF9NSU4pIHsKLSAgICAgIHNjZkJpdHNEaWZmICs9IEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTmV3W3NmYkxhc3RdLXNjZk5ld1tzZmJdKSAtCi0gICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJMYXN0XS1zY2ZPbGRbc2ZiXSk7CisgIGZvciAoc2ZiID0gc2ZiTGFzdCArIDE7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CisgICAgaWYgKHNjZk9sZFtzZmJdICE9IEZES19JTlRfTUlOKSB7CisgICAgICBzY2ZCaXRzRGlmZiArPQorICAgICAgICAgIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTmV3W3NmYkxhc3RdIC0gc2NmTmV3W3NmYl0pIC0KKyAgICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJMYXN0XSAtIHNjZk9sZFtzZmJdKTsKICAgICAgIHNmYkxhc3QgPSBzZmI7CiAgICAgfQogICB9CiAgIC8qIHNlYXJjaCBmb3IgbmV4dCByZWxldmFudCBzZmIgYW5kIGNvdW50IGRpZmYgKi8KICAgc2ZiTmV4dCA9IHN0b3BTZmI7Ci0gIHdoaWxlICgoc2ZiTmV4dDxzZmJDbnQpICYmIChzY2ZPbGRbc2ZiTmV4dF09PUZES19JTlRfTUlOKSkKLSAgICBzZmJOZXh0Kys7Ci0gIGlmIChzZmJOZXh0PHNmYkNudCkKLSAgICBzY2ZCaXRzRGlmZiArPSBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJMYXN0XS1zY2ZOZXdbc2ZiTmV4dF0pIC0KLSAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJMYXN0XS1zY2ZPbGRbc2ZiTmV4dF0pOworICB3aGlsZSAoKHNmYk5leHQgPCBzZmJDbnQpICYmIChzY2ZPbGRbc2ZiTmV4dF0gPT0gRkRLX0lOVF9NSU4pKSBzZmJOZXh0Kys7CisgIGlmIChzZmJOZXh0IDwgc2ZiQ250KQorICAgIHNjZkJpdHNEaWZmICs9CisgICAgICAgIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTmV3W3NmYkxhc3RdIC0gc2NmTmV3W3NmYk5leHRdKSAtCisgICAgICAgIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYkxhc3RdIC0gc2NmT2xkW3NmYk5leHRdKTsKIAotICBzY2ZCaXRzRnJhY3QgPSAoRklYUF9EQkwpIChzY2ZCaXRzRGlmZiA8PCAoREZSQUNUX0JJVFMtMS0oMipBU19QRV9GQUNfU0hJRlQpKSk7CisgIHNjZkJpdHNGcmFjdCA9CisgICAgICAoRklYUF9EQkwpKHNjZkJpdHNEaWZmIDw8IChERlJBQ1RfQklUUyAtIDEgLSAoMiAqIEFTX1BFX0ZBQ19TSElGVCkpKTsKIAogICByZXR1cm4gc2NmQml0c0ZyYWN0OwogfQpAQCAtMzAxLDQ4ICszMTcsNTEgQEAKIAogICBzcGVjUGVEaWZmIGlzIHNjYWxlZCBieSAxLygyXigyKkFTX1BFX0ZBQ19TSElGVCkpCiAqLwotc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jYWxjU3BlY1BlRGlmZihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2ZPbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2ZOZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJGb3JtRmFjdG9yTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJOUmVsZXZhbnRMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnRTZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0b3BTZmIpCi17CitzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NhbGNTcGVjUGVEaWZmKAorICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbCwgSU5UICpzY2ZPbGQsCisgICAgSU5UICpzY2ZOZXcsIEZJWFBfREJMICpzZmJDb25zdFBlUGFydCwgRklYUF9EQkwgKnNmYkZvcm1GYWN0b3JMZERhdGEsCisgICAgRklYUF9EQkwgKnNmYk5SZWxldmFudExpbmVzLCBJTlQgc3RhcnRTZmIsIElOVCBzdG9wU2ZiKSB7CiAgIEZJWFBfREJMIHNwZWNQZURpZmYgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgRklYUF9EQkwgc2NmRnJhY3QgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgSU5UIHNmYjsKIAogICAvKiBsb29wIHRocm91Z2ggYWxsIHNmYnMgYW5kIGNvdW50IHBlIGRpZmZlcmVuY2UgKi8KLSAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgewotICAgIGlmIChzY2ZPbGRbc2ZiXSE9RkRLX0lOVF9NSU4pIHsKKyAgZm9yIChzZmIgPSBzdGFydFNmYjsgc2ZiIDwgc3RvcFNmYjsgc2ZiKyspIHsKKyAgICBpZiAoc2NmT2xkW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKICAgICAgIEZJWFBfREJMIGxkUmF0aW9PbGQsIGxkUmF0aW9OZXcsIHBPbGQsIHBOZXc7CiAKLSAgICAgIC8qIHNmYkNvbnN0UGVQYXJ0W3NmYl0gPSAoZmxvYXQpbG9nKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdICogNi43NWYgLyBzZmJGb3JtRmFjdG9yW3NmYl0pICogTE9HMl8xOyAqLwotICAgICAgLyogMC4wMjE1MjI1NTg2MWYgPSBsb2coNi43NSkvbG9nKDIpL0FTX1BFX0ZBQ19GTE9BVDsgTE9HMl8xIGlzIDEuMCBmb3IgbG9nMiAqLworICAgICAgLyogc2ZiQ29uc3RQZVBhcnRbc2ZiXSA9IChmbG9hdClsb2cocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0gKiA2Ljc1ZiAvCisgICAgICAgKiBzZmJGb3JtRmFjdG9yW3NmYl0pICogTE9HMl8xOyAqLworICAgICAgLyogMC4wMjE1MjI1NTg2MWYgPSBsb2coNi43NSkvbG9nKDIpL0FTX1BFX0ZBQ19GTE9BVDsgTE9HMl8xIGlzIDEuMCBmb3IKKyAgICAgICAqIGxvZzIgKi8KICAgICAgIC8qIDAuMDkzNzVmID0gbG9nKDY0LjApL2xvZygyLjApLzY0LjAgPSBzY2FsZSBvZiBzZmJGb3JtRmFjdG9yTGREYXRhICovCiAgICAgICBpZiAoc2ZiQ29uc3RQZVBhcnRbc2ZiXSA9PSAoRklYUF9EQkwpRkRLX0lOVF9NSU4pCi0gICAgICAgIHNmYkNvbnN0UGVQYXJ0W3NmYl0gPSAoKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJdIC0gc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJdIC0gRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpKSA+PiAxKSArIEZMMkZYQ09OU1RfREJMKDAuMDIxNTIyNTU4NjFmKTsKKyAgICAgICAgc2ZiQ29uc3RQZVBhcnRbc2ZiXSA9CisgICAgICAgICAgICAoKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJdIC0gc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJdIC0KKyAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpKSA+PgorICAgICAgICAgICAgIDEpICsKKyAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMDIxNTIyNTU4NjFmKTsKIAotICAgICAgc2NmRnJhY3QgPSAoRklYUF9EQkwpIChzY2ZPbGRbc2ZiXSA8PCAoREZSQUNUX0JJVFMtMS1BU19QRV9GQUNfU0hJRlQpKTsKLSAgICAgIGxkUmF0aW9PbGQgPSBzZmJDb25zdFBlUGFydFtzZmJdIC0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC4zNzVmKSxzY2ZGcmFjdCk7CisgICAgICBzY2ZGcmFjdCA9IChGSVhQX0RCTCkoc2NmT2xkW3NmYl0gPDwgKERGUkFDVF9CSVRTIC0gMSAtIEFTX1BFX0ZBQ19TSElGVCkpOworICAgICAgbGRSYXRpb09sZCA9CisgICAgICAgICAgc2ZiQ29uc3RQZVBhcnRbc2ZiXSAtIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMzc1ZiksIHNjZkZyYWN0KTsKIAotICAgICAgc2NmRnJhY3QgPSAoRklYUF9EQkwpIChzY2ZOZXdbc2ZiXSA8PCAoREZSQUNUX0JJVFMtMS1BU19QRV9GQUNfU0hJRlQpKTsKLSAgICAgIGxkUmF0aW9OZXcgPSBzZmJDb25zdFBlUGFydFtzZmJdIC0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC4zNzVmKSxzY2ZGcmFjdCk7CisgICAgICBzY2ZGcmFjdCA9IChGSVhQX0RCTCkoc2NmTmV3W3NmYl0gPDwgKERGUkFDVF9CSVRTIC0gMSAtIEFTX1BFX0ZBQ19TSElGVCkpOworICAgICAgbGRSYXRpb05ldyA9CisgICAgICAgICAgc2ZiQ29uc3RQZVBhcnRbc2ZiXSAtIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMzc1ZiksIHNjZkZyYWN0KTsKIAogICAgICAgaWYgKGxkUmF0aW9PbGQgPj0gUEVfQzEpCiAgICAgICAgIHBPbGQgPSBsZFJhdGlvT2xkOwogICAgICAgZWxzZQotICAgICAgICBwT2xkID0gUEVfQzIgKyBmTXVsdChQRV9DMyxsZFJhdGlvT2xkKTsKKyAgICAgICAgcE9sZCA9IFBFX0MyICsgZk11bHQoUEVfQzMsIGxkUmF0aW9PbGQpOwogCiAgICAgICBpZiAobGRSYXRpb05ldyA+PSBQRV9DMSkKICAgICAgICAgcE5ldyA9IGxkUmF0aW9OZXc7CiAgICAgICBlbHNlCi0gICAgICAgIHBOZXcgPSBQRV9DMiArIGZNdWx0KFBFX0MzLGxkUmF0aW9OZXcpOworICAgICAgICBwTmV3ID0gUEVfQzIgKyBmTXVsdChQRV9DMywgbGRSYXRpb05ldyk7CiAKLSAgICAgIHNwZWNQZURpZmYgKz0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksZk11bHQoc2ZiTlJlbGV2YW50TGluZXNbc2ZiXSwocE5ldyAtIHBPbGQpKSk7CisgICAgICBzcGVjUGVEaWZmICs9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChzZmJOUmVsZXZhbnRMaW5lc1tzZmJdLCAocE5ldyAtIHBPbGQpKSk7CiAgICAgfQogICB9CiAKQEAgLTM1MiwxMjMgKzM3MSw5NiBAQAogLyoKICAgRnVuY3Rpb246IEZES2FhY0VuY19pbXByb3ZlU2NmCiAKLSAgRGVzY3JpcHRpb246IENhbGN1bGF0ZSB0aGUgZGlzdG9ydGlvbiBieSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgcXVhbnRpemF0aW9uIG9mIHRoZSBzcGVjdHJ1bSB3aXRoCi0gICAgICAgICAgICAgICB2YXJpb3VzIHNjYWxlZmFjdG9ycy4gVGhlIHNjYWxlZmFjdG9yIHdoaWNoIHByb3ZpZGVzIHRoZSBiZXN0IHJlc3VsdHMgd2lsbCBiZSB1c2VkLgorICBEZXNjcmlwdGlvbjogQ2FsY3VsYXRlIHRoZSBkaXN0b3J0aW9uIGJ5IHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBxdWFudGl6YXRpb24KKyAgb2YgdGhlIHNwZWN0cnVtIHdpdGggdmFyaW91cyBzY2FsZWZhY3RvcnMuIFRoZSBzY2FsZWZhY3RvciB3aGljaCBwcm92aWRlcyB0aGUKKyAgYmVzdCByZXN1bHRzIHdpbGwgYmUgdXNlZC4KICovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19pbXByb3ZlU2NmKEZJWFBfREJMICpzcGVjLAotICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY1RtcCwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIHRocmVzaExkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NmLAotICAgICAgICAgICAgICAgICAgICAgIElOVCBtaW5TY2YsCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpkaXN0TGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgIElOVCAqbWluU2NmQ2FsY3VsYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZQotICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgIEZJWFBfREJMIHNmYkRpc3RMZERhdGE7Ci0gICBJTlQgc2NmQmVzdCA9IHNjZjsKLSAgIElOVCBrOwotICAgRklYUF9EQkwgZGlzdEZhY3RvckxkRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0wLjAwNTAzMDEyNjUpOyAgIC8qIGxkNjQoMS8xLjI1KSAqLworc3RhdGljIElOVCBGREthYWNFbmNfaW1wcm92ZVNjZihjb25zdCBGSVhQX0RCTCAqc3BlYywgU0hPUlQgKnF1YW50U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY1RtcCwgSU5UIHNmYldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0aHJlc2hMZERhdGEsIElOVCBzY2YsIElOVCBtaW5TY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkaXN0TGREYXRhLCBJTlQgKm1pblNjZkNhbGN1bGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkWm9uZVF1YW50RW5hYmxlKSB7CisgIEZJWFBfREJMIHNmYkRpc3RMZERhdGE7CisgIElOVCBzY2ZCZXN0ID0gc2NmOworICBJTlQgazsKKyAgRklYUF9EQkwgZGlzdEZhY3RvckxkRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0wLjAwNTAzMDEyNjUpOyAvKiBsZDY0KDEvMS4yNSkgKi8KIAotICAgLyogY2FsYyByZWFsIGRpc3RvcnRpb24gKi8KLSAgIHNmYkRpc3RMZERhdGEgPSBGREthYWNFbmNfY2FsY1NmYkRpc3Qoc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlKTsKLSAgICptaW5TY2ZDYWxjdWxhdGVkID0gc2NmOwotICAgLyogbm1yID4gMS4yNSAtPiB0cnkgdG8gaW1wcm92ZSBubXIgKi8KLSAgIGlmIChzZmJEaXN0TGREYXRhID4gKHRocmVzaExkRGF0YS1kaXN0RmFjdG9yTGREYXRhKSkgewotICAgICAgSU5UIHNjZkVzdGltYXRlZCA9IHNjZjsKLSAgICAgIEZJWFBfREJMIHNmYkRpc3RCZXN0TGREYXRhID0gc2ZiRGlzdExkRGF0YTsKLSAgICAgIElOVCBjbnQ7Ci0gICAgICAvKiBpbXByb3ZlIGJ5IGJpZ2dlciBzY2YgPyAqLwotICAgICAgY250ID0gMDsKKyAgLyogY2FsYyByZWFsIGRpc3RvcnRpb24gKi8KKyAgc2ZiRGlzdExkRGF0YSA9CisgICAgICBGREthYWNFbmNfY2FsY1NmYkRpc3Qoc3BlYywgcXVhbnRTcGVjLCBzZmJXaWR0aCwgc2NmLCBkWm9uZVF1YW50RW5hYmxlKTsKKyAgKm1pblNjZkNhbGN1bGF0ZWQgPSBzY2Y7CisgIC8qIG5tciA+IDEuMjUgLT4gdHJ5IHRvIGltcHJvdmUgbm1yICovCisgIGlmIChzZmJEaXN0TGREYXRhID4gKHRocmVzaExkRGF0YSAtIGRpc3RGYWN0b3JMZERhdGEpKSB7CisgICAgSU5UIHNjZkVzdGltYXRlZCA9IHNjZjsKKyAgICBGSVhQX0RCTCBzZmJEaXN0QmVzdExkRGF0YSA9IHNmYkRpc3RMZERhdGE7CisgICAgSU5UIGNudDsKKyAgICAvKiBpbXByb3ZlIGJ5IGJpZ2dlciBzY2YgPyAqLworICAgIGNudCA9IDA7CiAKLSAgICAgIHdoaWxlICgoc2ZiRGlzdExkRGF0YSA+ICh0aHJlc2hMZERhdGEtZGlzdEZhY3RvckxkRGF0YSkpICYmIChjbnQrKyA8IDMpKSB7Ci0gICAgICAgICBzY2YrKzsKLSAgICAgICAgIHNmYkRpc3RMZERhdGEgPSBGREthYWNFbmNfY2FsY1NmYkRpc3Qoc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlKTsKKyAgICB3aGlsZSAoKHNmYkRpc3RMZERhdGEgPiAodGhyZXNoTGREYXRhIC0gZGlzdEZhY3RvckxkRGF0YSkpICYmCisgICAgICAgICAgIChjbnQrKyA8IFVQQ09VTlRfTElNSVQpKSB7CisgICAgICBzY2YrKzsKKyAgICAgIHNmYkRpc3RMZERhdGEgPSBGREthYWNFbmNfY2FsY1NmYkRpc3Qoc3BlYywgcXVhbnRTcGVjVG1wLCBzZmJXaWR0aCwgc2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlKTsKIAotICAgICAgICAgaWYgKHNmYkRpc3RMZERhdGEgPCBzZmJEaXN0QmVzdExkRGF0YSkgewotICAgICAgICAgICAgc2NmQmVzdCA9IHNjZjsKLSAgICAgICAgICAgIHNmYkRpc3RCZXN0TGREYXRhID0gc2ZiRGlzdExkRGF0YTsKLSAgICAgICAgICAgIGZvciAoaz0wOyBrPHNmYldpZHRoOyBrKyspCi0JICAgICAgICAgICAgIHF1YW50U3BlY1trXSA9IHF1YW50U3BlY1RtcFtrXTsKLSAgICAgICAgIH0KKyAgICAgIGlmIChzZmJEaXN0TGREYXRhIDwgc2ZiRGlzdEJlc3RMZERhdGEpIHsKKyAgICAgICAgc2NmQmVzdCA9IHNjZjsKKyAgICAgICAgc2ZiRGlzdEJlc3RMZERhdGEgPSBzZmJEaXN0TGREYXRhOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc2ZiV2lkdGg7IGsrKykgcXVhbnRTcGVjW2tdID0gcXVhbnRTcGVjVG1wW2tdOwogICAgICAgfQotICAgICAgLyogaW1wcm92ZSBieSBzbWFsbGVyIHNjZiA/ICovCi0gICAgICBjbnQgPSAwOwotICAgICAgc2NmID0gc2NmRXN0aW1hdGVkOwotICAgICAgc2ZiRGlzdExkRGF0YSA9IHNmYkRpc3RCZXN0TGREYXRhOwotICAgICAgd2hpbGUgKChzZmJEaXN0TGREYXRhID4gKHRocmVzaExkRGF0YS1kaXN0RmFjdG9yTGREYXRhKSkgJiYgKGNudCsrIDwgMSkgJiYgKHNjZiA+IG1pblNjZikpIHsKLSAgICAgICAgIHNjZi0tOwotICAgICAgICAgc2ZiRGlzdExkRGF0YSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChzcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUpOworICAgIH0KKyAgICAvKiBpbXByb3ZlIGJ5IHNtYWxsZXIgc2NmID8gKi8KKyAgICBjbnQgPSAwOworICAgIHNjZiA9IHNjZkVzdGltYXRlZDsKKyAgICBzZmJEaXN0TGREYXRhID0gc2ZiRGlzdEJlc3RMZERhdGE7CisgICAgd2hpbGUgKChzZmJEaXN0TGREYXRhID4gKHRocmVzaExkRGF0YSAtIGRpc3RGYWN0b3JMZERhdGEpKSAmJiAoY250KysgPCAxKSAmJgorICAgICAgICAgICAoc2NmID4gbWluU2NmKSkgeworICAgICAgc2NmLS07CisgICAgICBzZmJEaXN0TGREYXRhID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHNwZWMsIHF1YW50U3BlY1RtcCwgc2ZiV2lkdGgsIHNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CiAKLSAgICAgICAgIGlmIChzZmJEaXN0TGREYXRhIDwgc2ZiRGlzdEJlc3RMZERhdGEpIHsKLSAgICAgICAgICAgIHNjZkJlc3QgPSBzY2Y7Ci0gICAgICAgICAgICBzZmJEaXN0QmVzdExkRGF0YSA9IHNmYkRpc3RMZERhdGE7Ci0gICAgICAgICAgICBmb3IgKGs9MDsgazxzZmJXaWR0aDsgaysrKQotCSAgICAgICAgICAgICBxdWFudFNwZWNba10gPSBxdWFudFNwZWNUbXBba107Ci0gICAgICAgICB9Ci0gICAgICAgICAqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZjsKKyAgICAgIGlmIChzZmJEaXN0TGREYXRhIDwgc2ZiRGlzdEJlc3RMZERhdGEpIHsKKyAgICAgICAgc2NmQmVzdCA9IHNjZjsKKyAgICAgICAgc2ZiRGlzdEJlc3RMZERhdGEgPSBzZmJEaXN0TGREYXRhOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc2ZiV2lkdGg7IGsrKykgcXVhbnRTcGVjW2tdID0gcXVhbnRTcGVjVG1wW2tdOwogICAgICAgfQotICAgICAgKmRpc3RMZERhdGEgPSBzZmJEaXN0QmVzdExkRGF0YTsKLSAgIH0KLSAgIGVsc2UgeyAvKiBubXIgPD0gMS4yNSAtPiB0cnkgdG8gZmluZCBiaWdnZXIgc2NmIHRvIHVzZSBsZXNzIGJpdHMgKi8KLSAgICAgIEZJWFBfREJMIHNmYkRpc3RCZXN0TGREYXRhID0gc2ZiRGlzdExkRGF0YTsKLSAgICAgIEZJWFBfREJMIHNmYkRpc3RBbGxvd2VkTGREYXRhID0gZml4TWluKHNmYkRpc3RMZERhdGEtZGlzdEZhY3RvckxkRGF0YSx0aHJlc2hMZERhdGEpOwotICAgICAgaW50IGNudDsKLSAgICAgIGZvciAoY250PTA7IGNudDwzOyBjbnQrKykgewotICAgICAgICAgc2NmKys7Ci0gICAgICAgICBzZmJEaXN0TGREYXRhID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CisgICAgICAqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZjsKKyAgICB9CisgICAgKmRpc3RMZERhdGEgPSBzZmJEaXN0QmVzdExkRGF0YTsKKyAgfSBlbHNlIHsgLyogbm1yIDw9IDEuMjUgLT4gdHJ5IHRvIGZpbmQgYmlnZ2VyIHNjZiB0byB1c2UgbGVzcyBiaXRzICovCisgICAgRklYUF9EQkwgc2ZiRGlzdEJlc3RMZERhdGEgPSBzZmJEaXN0TGREYXRhOworICAgIEZJWFBfREJMIHNmYkRpc3RBbGxvd2VkTGREYXRhID0KKyAgICAgICAgZml4TWluKHNmYkRpc3RMZERhdGEgLSBkaXN0RmFjdG9yTGREYXRhLCB0aHJlc2hMZERhdGEpOworICAgIGludCBjbnQ7CisgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBVUENPVU5UX0xJTUlUOyBjbnQrKykgeworICAgICAgc2NmKys7CisgICAgICBzZmJEaXN0TGREYXRhID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHNwZWMsIHF1YW50U3BlY1RtcCwgc2ZiV2lkdGgsIHNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CiAKLSAgICAgICAgIGlmIChzZmJEaXN0TGREYXRhIDwgc2ZiRGlzdEFsbG93ZWRMZERhdGEpIHsKLSAgICAgICAgICAgKm1pblNjZkNhbGN1bGF0ZWQgPSBzY2ZCZXN0KzE7Ci0gICAgICAgICAgIHNjZkJlc3QgPSBzY2Y7Ci0gICAgICAgICAgIHNmYkRpc3RCZXN0TGREYXRhID0gc2ZiRGlzdExkRGF0YTsKLSAgICAgICAgICAgZm9yIChrPTA7IGs8c2ZiV2lkdGg7IGsrKykKLSAgICAgICAgICAgICBxdWFudFNwZWNba10gPSBxdWFudFNwZWNUbXBba107Ci0gICAgICAgICB9CisgICAgICBpZiAoc2ZiRGlzdExkRGF0YSA8IHNmYkRpc3RBbGxvd2VkTGREYXRhKSB7CisgICAgICAgICptaW5TY2ZDYWxjdWxhdGVkID0gc2NmQmVzdCArIDE7CisgICAgICAgIHNjZkJlc3QgPSBzY2Y7CisgICAgICAgIHNmYkRpc3RCZXN0TGREYXRhID0gc2ZiRGlzdExkRGF0YTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHNmYldpZHRoOyBrKyspIHF1YW50U3BlY1trXSA9IHF1YW50U3BlY1RtcFtrXTsKICAgICAgIH0KLSAgICAgICpkaXN0TGREYXRhID0gc2ZiRGlzdEJlc3RMZERhdGE7Ci0gICB9CisgICAgfQorICAgICpkaXN0TGREYXRhID0gc2ZiRGlzdEJlc3RMZERhdGE7CisgIH0KIAotICAgLyogcmV0dXJuIGJlc3Qgc2NhbGVmYWN0b3IgKi8KLSAgIHJldHVybiBzY2ZCZXN0OworICAvKiByZXR1cm4gYmVzdCBzY2FsZWZhY3RvciAqLworICByZXR1cm4gc2NmQmVzdDsKIH0KIAogLyoKICAgRnVuY3Rpb246IEZES2FhY0VuY19hc3NpbWlsYXRlU2luZ2xlU2NmCiAKICovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfYXNzaW1pbGF0ZVNpbmdsZVNjZihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICAgKnFjT3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY1RtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRab25lUXVhbnRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1pblNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJDb25zdFBlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkZvcm1GYWN0b3JMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJOUmVsZXZhbnRMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptaW5TY2ZDYWxjdWxhdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcmVzdGFydE9uU3VjY2VzcykKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19hc3NpbWlsYXRlU2luZ2xlU2NmKAorICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwgY29uc3QgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbCwKKyAgICBTSE9SVCAqcXVhbnRTcGVjLCBTSE9SVCAqcXVhbnRTcGVjVG1wLCBJTlQgZFpvbmVRdWFudEVuYWJsZSwgSU5UICpzY2YsCisgICAgY29uc3QgSU5UICptaW5TY2YsIEZJWFBfREJMICpzZmJEaXN0LCBGSVhQX0RCTCAqc2ZiQ29uc3RQZVBhcnQsCisgICAgY29uc3QgRklYUF9EQkwgKnNmYkZvcm1GYWN0b3JMZERhdGEsIGNvbnN0IEZJWFBfREJMICpzZmJOUmVsZXZhbnRMaW5lcywKKyAgICBJTlQgKm1pblNjZkNhbGN1bGF0ZWQsIElOVCByZXN0YXJ0T25TdWNjZXNzKSB7CiAgIElOVCBzZmJMYXN0LCBzZmJBY3QsIHNmYk5leHQ7CiAgIElOVCBzY2ZBY3QsICpzY2ZMYXN0LCAqc2NmTmV4dCwgc2NmTWluLCBzY2ZNYXg7CiAgIElOVCBzZmJXaWR0aCwgc2ZiT2ZmczsKQEAgLTQ4Myw3NyArNDc1LDgyIEBACiAgIEZJWFBfREJMIGRlbHRhUGVMYXN0W01BWF9HUk9VUEVEX1NGQl07CiAgIElOVCB1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkOwogCi0gIGZvciAoaT0wOyBpPHBzeU91dENoYW4tPnNmYkNudDsgaSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7IGkrKykgewogICAgIHByZXZTY2ZMYXN0W2ldID0gRkRLX0lOVF9NQVg7CiAgICAgcHJldlNjZk5leHRbaV0gPSBGREtfSU5UX01BWDsKICAgICBkZWx0YVBlTGFzdFtpXSA9IChGSVhQX0RCTClGREtfSU5UX01BWDsKICAgfQogCiAgIHNmYkxhc3QgPSAtMTsKLSAgc2ZiQWN0ICA9IC0xOworICBzZmJBY3QgPSAtMTsKICAgc2ZiTmV4dCA9IC0xOwogICBzY2ZMYXN0ID0gMDsKICAgc2NmTmV4dCA9IDA7Ci0gIHNjZk1pbiAgPSBGREtfSU5UX01BWDsKLSAgc2NmTWF4ICA9IEZES19JTlRfTUFYOworICBzY2ZNaW4gPSBGREtfSU5UX01BWDsKKyAgc2NmTWF4ID0gRkRLX0lOVF9NQVg7CiAgIGRvIHsKICAgICAvKiBzZWFyY2ggZm9yIG5ldyByZWxldmFudCBzZmIgKi8KICAgICBzZmJOZXh0Kys7CiAgICAgd2hpbGUgKChzZmJOZXh0IDwgcHN5T3V0Q2hhbi0+c2ZiQ250KSAmJiAoc2NmW3NmYk5leHRdID09IEZES19JTlRfTUlOKSkKICAgICAgIHNmYk5leHQrKzsKLSAgICBpZiAoKHNmYkxhc3Q+PTApICYmIChzZmJBY3Q+PTApICYmIChzZmJOZXh0PHBzeU91dENoYW4tPnNmYkNudCkpIHsKKyAgICBpZiAoKHNmYkxhc3QgPj0gMCkgJiYgKHNmYkFjdCA+PSAwKSAmJiAoc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCkpIHsKICAgICAgIC8qIHJlbGV2YW50IHNjZnMgdG8gdGhlIGxlZnQgYW5kIHRvIHRoZSByaWdodCAqLwotICAgICAgc2NmQWN0ICA9IHNjZltzZmJBY3RdOworICAgICAgc2NmQWN0ID0gc2NmW3NmYkFjdF07CiAgICAgICBzY2ZMYXN0ID0gc2NmICsgc2ZiTGFzdDsKICAgICAgIHNjZk5leHQgPSBzY2YgKyBzZmJOZXh0OwotICAgICAgc2NmTWluICA9IGZpeE1pbigqc2NmTGFzdCwgKnNjZk5leHQpOwotICAgICAgc2NmTWF4ICA9IGZpeE1heCgqc2NmTGFzdCwgKnNjZk5leHQpOwotICAgIH0KLSAgICBlbHNlIGlmICgoc2ZiTGFzdD09LTEpICYmIChzZmJBY3Q+PTApICYmIChzZmJOZXh0PHBzeU91dENoYW4tPnNmYkNudCkpIHsKKyAgICAgIHNjZk1pbiA9IGZpeE1pbigqc2NmTGFzdCwgKnNjZk5leHQpOworICAgICAgc2NmTWF4ID0gZml4TWF4KCpzY2ZMYXN0LCAqc2NmTmV4dCk7CisgICAgfSBlbHNlIGlmICgoc2ZiTGFzdCA9PSAtMSkgJiYgKHNmYkFjdCA+PSAwKSAmJgorICAgICAgICAgICAgICAgKHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpKSB7CiAgICAgICAvKiBmaXJzdCByZWxldmFudCBzY2YgKi8KLSAgICAgIHNjZkFjdCAgPSBzY2Zbc2ZiQWN0XTsKKyAgICAgIHNjZkFjdCA9IHNjZltzZmJBY3RdOwogICAgICAgc2NmTGFzdCA9ICZzY2ZBY3Q7CiAgICAgICBzY2ZOZXh0ID0gc2NmICsgc2ZiTmV4dDsKLSAgICAgIHNjZk1pbiAgPSAqc2NmTmV4dDsKLSAgICAgIHNjZk1heCAgPSAqc2NmTmV4dDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHNmYkxhc3Q+PTApICYmIChzZmJBY3Q+PTApICYmIChzZmJOZXh0PT1wc3lPdXRDaGFuLT5zZmJDbnQpKSB7CisgICAgICBzY2ZNaW4gPSAqc2NmTmV4dDsKKyAgICAgIHNjZk1heCA9ICpzY2ZOZXh0OworICAgIH0gZWxzZSBpZiAoKHNmYkxhc3QgPj0gMCkgJiYgKHNmYkFjdCA+PSAwKSAmJgorICAgICAgICAgICAgICAgKHNmYk5leHQgPT0gcHN5T3V0Q2hhbi0+c2ZiQ250KSkgewogICAgICAgLyogbGFzdCByZWxldmFudCBzY2YgKi8KLSAgICAgIHNjZkFjdCAgPSBzY2Zbc2ZiQWN0XTsKKyAgICAgIHNjZkFjdCA9IHNjZltzZmJBY3RdOwogICAgICAgc2NmTGFzdCA9IHNjZiArIHNmYkxhc3Q7CiAgICAgICBzY2ZOZXh0ID0gJnNjZkFjdDsKLSAgICAgIHNjZk1pbiAgPSAqc2NmTGFzdDsKLSAgICAgIHNjZk1heCAgPSAqc2NmTGFzdDsKKyAgICAgIHNjZk1pbiA9ICpzY2ZMYXN0OworICAgICAgc2NmTWF4ID0gKnNjZkxhc3Q7CiAgICAgfQotICAgIGlmIChzZmJBY3Q+PTApCi0gICAgICBzY2ZNaW4gPSBmaXhNYXgoc2NmTWluLCBtaW5TY2Zbc2ZiQWN0XSk7CisgICAgaWYgKHNmYkFjdCA+PSAwKSBzY2ZNaW4gPSBmaXhNYXgoc2NmTWluLCBtaW5TY2Zbc2ZiQWN0XSk7CiAKLSAgICBpZiAoKHNmYkFjdCA+PSAwKSAmJgotICAgICAgICAoc2ZiTGFzdD49MCB8fCBzZmJOZXh0PHBzeU91dENoYW4tPnNmYkNudCkgJiYKLSAgICAgICAgKHNjZkFjdCA+IHNjZk1pbikgJiYKLSAgICAgICAgKHNjZkFjdCA8PSBzY2ZNaW4rTUFYX1NDRl9ERUxUQSkgJiYKLSAgICAgICAgKHNjZkFjdCA+PSBzY2ZNYXgtTUFYX1NDRl9ERUxUQSkgJiYKLSAgICAgICAgKCpzY2ZMYXN0ICE9IHByZXZTY2ZMYXN0W3NmYkFjdF0gfHwKLSAgICAgICAgICpzY2ZOZXh0ICE9IHByZXZTY2ZOZXh0W3NmYkFjdF0gfHwKKyAgICBpZiAoKHNmYkFjdCA+PSAwKSAmJiAoc2ZiTGFzdCA+PSAwIHx8IHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpICYmCisgICAgICAgIChzY2ZBY3QgPiBzY2ZNaW4pICYmIChzY2ZBY3QgPD0gc2NmTWluICsgTUFYX1NDRl9ERUxUQSkgJiYKKyAgICAgICAgKHNjZkFjdCA+PSBzY2ZNYXggLSBNQVhfU0NGX0RFTFRBKSAmJgorICAgICAgICAoc2NmQWN0IDw9CisgICAgICAgICBmaXhNaW4oc2NmTWluLCBmaXhNaW4oKnNjZkxhc3QsICpzY2ZOZXh0KSkgKyBNQVhfU0NGX0RFTFRBKSAmJgorICAgICAgICAoKnNjZkxhc3QgIT0gcHJldlNjZkxhc3Rbc2ZiQWN0XSB8fCAqc2NmTmV4dCAhPSBwcmV2U2NmTmV4dFtzZmJBY3RdIHx8CiAgICAgICAgICBkZWx0YVBlIDwgZGVsdGFQZUxhc3Rbc2ZiQWN0XSkpIHsKICAgICAgIC8qIGJpZ2dlciB0aGFuIG5laWdoYm91cmluZyBzY2YgZm91bmQsIHRyeSB0byB1c2Ugc21hbGxlciBzY2YgKi8KICAgICAgIHN1Y2Nlc3MgPSAwOwogCi0gICAgICBzZmJXaWR0aCA9IHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiQWN0KzFdIC0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJBY3RdOworICAgICAgc2ZiV2lkdGggPQorICAgICAgICAgIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiQWN0ICsgMV0gLSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkFjdF07CiAgICAgICBzZmJPZmZzID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJBY3RdOwogCiAgICAgICAvKiBlc3RpbWF0ZSByZXF1aXJlZCBiaXRzIGZvciBhY3R1YWwgc2NmICovCiAgICAgICBlbkxkRGF0YSA9IHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhW3NmYkFjdF07CiAKLSAgICAgIC8qIHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPSAoZmxvYXQpbG9nKDYuNzVmKmVuL3NmYkZvcm1GYWN0b3Jbc2ZiQWN0XSkgKiBMT0cyXzE7ICovCi0gICAgICAvKiAwLjAyMTUyMjU1ODYxZiA9IGxvZyg2Ljc1KS9sb2coMikvQVNfUEVfRkFDX0ZMT0FUOyBMT0cyXzEgaXMgMS4wIGZvciBsb2cyICovCisgICAgICAvKiBzZmJDb25zdFBlUGFydFtzZmJBY3RdID0gKGZsb2F0KWxvZyg2Ljc1Ziplbi9zZmJGb3JtRmFjdG9yW3NmYkFjdF0pICoKKyAgICAgICAqIExPRzJfMTsgKi8KKyAgICAgIC8qIDAuMDIxNTIyNTU4NjFmID0gbG9nKDYuNzUpL2xvZygyKS9BU19QRV9GQUNfRkxPQVQ7IExPRzJfMSBpcyAxLjAgZm9yCisgICAgICAgKiBsb2cyICovCiAgICAgICAvKiAwLjA5Mzc1ZiA9IGxvZyg2NC4wKS9sb2coMi4wKS82NC4wID0gc2NhbGUgb2Ygc2ZiRm9ybUZhY3RvckxkRGF0YSAqLwogICAgICAgaWYgKHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPT0gKEZJWFBfREJMKUZES19JTlRfTUlOKSB7Ci0gICAgICAgIHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPSAoKGVuTGREYXRhIC0gc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJBY3RdIC0gRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpKSA+PiAxKSArIEZMMkZYQ09OU1RfREJMKDAuMDIxNTIyNTU4NjFmKTsKKyAgICAgICAgc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9ICgoZW5MZERhdGEgLSBzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkFjdF0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZikpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wMjE1MjI1NTg2MWYpOwogICAgICAgfQogCi0gICAgICBzZmJQZU9sZCA9IEZES2FhY0VuY19jYWxjU2luZ2xlU3BlY1BlKHNjZkFjdCxzZmJDb25zdFBlUGFydFtzZmJBY3RdLHNmYk5SZWxldmFudExpbmVzW3NmYkFjdF0pCi0gICAgICAgICAgICAgICAgK0ZES2FhY0VuY19jb3VudFNpbmdsZVNjZkJpdHMoc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQpOworICAgICAgc2ZiUGVPbGQgPSBGREthYWNFbmNfY2FsY1NpbmdsZVNwZWNQZShzY2ZBY3QsIHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk5SZWxldmFudExpbmVzW3NmYkFjdF0pICsKKyAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX2NvdW50U2luZ2xlU2NmQml0cyhzY2ZBY3QsICpzY2ZMYXN0LCAqc2NmTmV4dCk7CiAKICAgICAgIGRlbHRhUGVOZXcgPSBkZWx0YVBlOwogICAgICAgdXBkYXRlTWluU2NmQ2FsY3VsYXRlZCA9IDE7CkBAIC01NjIsMTAgKzU1OSwxMiBAQAogICAgICAgICAvKiBlc3RpbWF0ZSByZXF1aXJlZCBiaXRzIGZvciBzbWFsbGVyIHNjZiAqLwogICAgICAgICBzY2ZBY3QtLTsKICAgICAgICAgLyogY2hlY2sgb25seSBpZiB0aGUgc2FtZSBjaGVjayB3YXMgbm90IGRvbmUgYmVmb3JlICovCi0gICAgICAgIGlmIChzY2ZBY3QgPCBtaW5TY2ZDYWxjdWxhdGVkW3NmYkFjdF0gJiYgc2NmQWN0Pj1zY2ZNYXgtTUFYX1NDRl9ERUxUQSl7CisgICAgICAgIGlmIChzY2ZBY3QgPCBtaW5TY2ZDYWxjdWxhdGVkW3NmYkFjdF0gJiYKKyAgICAgICAgICAgIHNjZkFjdCA+PSBzY2ZNYXggLSBNQVhfU0NGX0RFTFRBKSB7CiAgICAgICAgICAgLyogZXN0aW1hdGUgcmVxdWlyZWQgYml0cyBmb3IgbmV3IHNjZiAqLwotICAgICAgICAgIHNmYlBlTmV3ID0gIEZES2FhY0VuY19jYWxjU2luZ2xlU3BlY1BlKHNjZkFjdCxzZmJDb25zdFBlUGFydFtzZmJBY3RdLHNmYk5SZWxldmFudExpbmVzW3NmYkFjdF0pCi0gICAgICAgICAgICAgICAgICAgICArRkRLYWFjRW5jX2NvdW50U2luZ2xlU2NmQml0cyhzY2ZBY3QsKnNjZkxhc3QsICpzY2ZOZXh0KTsKKyAgICAgICAgICBzZmJQZU5ldyA9IEZES2FhY0VuY19jYWxjU2luZ2xlU3BlY1BlKHNjZkFjdCwgc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk5SZWxldmFudExpbmVzW3NmYkFjdF0pICsKKyAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19jb3VudFNpbmdsZVNjZkJpdHMoc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQpOwogCiAgICAgICAgICAgLyogdXNlIG5ldyBzY2YgaWYgbm8gaW5jcmVhc2UgaW4gcGUgYW5kCiAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIGVycm9yIGlzIHNtYWxsZXIgKi8KQEAgLTU3MywyOCArNTcyLDI0IEBACiAgICAgICAgICAgLyogMC4wMDA2MTAzNTE1NjI1ZiA9IDEwLjBmLygyXigyKkFTX1BFX0ZBQ19TSElGVCkpICovCiAgICAgICAgICAgaWYgKGRlbHRhUGVUbXAgPCBGTDJGWENPTlNUX0RCTCgwLjAwMDYxMDM1MTU2MjVmKSkgewogICAgICAgICAgICAgLyogZGlzdG9ydGlvbiBvZiBuZXcgc2NmICovCi0gICAgICAgICAgICBzZmJEaXN0TmV3ID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3NmYk9mZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCtzZmJPZmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmQWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlKTsKKyAgICAgICAgICAgIHNmYkRpc3ROZXcgPSBGREthYWNFbmNfY2FsY1NmYkRpc3QoCisgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW0gKyBzZmJPZmZzLCBxdWFudFNwZWNUbXAgKyBzZmJPZmZzLAorICAgICAgICAgICAgICAgIHNmYldpZHRoLCBzY2ZBY3QsIGRab25lUXVhbnRFbmFibGUpOwogCiAgICAgICAgICAgICBpZiAoc2ZiRGlzdE5ldyA8IHNmYkRpc3Rbc2ZiQWN0XSkgewogICAgICAgICAgICAgICAvKiBzdWNjZXNzLCByZXBsYWNlIHNjZiBieSBuZXcgb25lICovCiAgICAgICAgICAgICAgIHNjZltzZmJBY3RdID0gc2NmQWN0OwogICAgICAgICAgICAgICBzZmJEaXN0W3NmYkFjdF0gPSBzZmJEaXN0TmV3OwogCi0gICAgICAgICAgICAgIGZvciAoaz0wOyBrPHNmYldpZHRoOyBrKyspCi0gICAgICAgICAgICAgICAgcXVhbnRTcGVjW3NmYk9mZnMra10gPSBxdWFudFNwZWNUbXBbc2ZiT2ZmcytrXTsKKyAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNmYldpZHRoOyBrKyspCisgICAgICAgICAgICAgICAgcXVhbnRTcGVjW3NmYk9mZnMgKyBrXSA9IHF1YW50U3BlY1RtcFtzZmJPZmZzICsga107CiAKICAgICAgICAgICAgICAgZGVsdGFQZU5ldyA9IGRlbHRhUGVUbXA7CiAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogbWFyayBhcyBhbHJlYWR5IGNoZWNrZWQgKi8KLSAgICAgICAgICAgIGlmICh1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkKQotICAgICAgICAgICAgICBtaW5TY2ZDYWxjdWxhdGVkW3NmYkFjdF0gPSBzY2ZBY3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQpIG1pblNjZkNhbGN1bGF0ZWRbc2ZiQWN0XSA9IHNjZkFjdDsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogZnJvbSB0aGlzIHNjZiB2YWx1ZSBvbiBub3QgYWxsIG5ldyB2YWx1ZXMgaGF2ZSBiZWVuIGNoZWNrZWQgKi8KICAgICAgICAgICAgIHVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQgPSAwOwogICAgICAgICAgIH0KQEAgLTYxMiwxOCArNjA3LDE3IEBACiAgICAgaWYgKHN1Y2Nlc3MgJiYgcmVzdGFydE9uU3VjY2VzcykgewogICAgICAgLyogc3RhcnQgYWdhaW4gYXQgZmlyc3Qgc2ZiICovCiAgICAgICBzZmJMYXN0ID0gLTE7Ci0gICAgICBzZmJBY3QgID0gLTE7CisgICAgICBzZmJBY3QgPSAtMTsKICAgICAgIHNmYk5leHQgPSAtMTsKICAgICAgIHNjZkxhc3QgPSAwOwogICAgICAgc2NmTmV4dCA9IDA7Ci0gICAgICBzY2ZNaW4gID0gRkRLX0lOVF9NQVg7Ci0gICAgICBzY2ZNYXggID0gRkRLX0lOVF9NQVg7CisgICAgICBzY2ZNaW4gPSBGREtfSU5UX01BWDsKKyAgICAgIHNjZk1heCA9IEZES19JTlRfTUFYOwogICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICAvKiBzaGlmdCBzZmJzIGZvciBuZXh0IGJhbmQgKi8KICAgICAgIHNmYkxhc3QgPSBzZmJBY3Q7Ci0gICAgICBzZmJBY3QgID0gc2ZiTmV4dDsKKyAgICAgIHNmYkFjdCA9IHNmYk5leHQ7CiAgICAgfQogICB9IHdoaWxlIChzZmJOZXh0IDwgcHN5T3V0Q2hhbi0+c2ZiQ250KTsKIH0KQEAgLTYzMiwxOCArNjI2LDExIEBACiAgIEZ1bmN0aW9uOiBGREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmCiAKICovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWNUbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRab25lUXVhbnRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptaW5TY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJGb3JtRmFjdG9yTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJOUmVsZXZhbnRMaW5lcykKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19hc3NpbWlsYXRlTXVsdGlwbGVTY2YoCisgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuLCBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFubmVsLCBTSE9SVCAqcXVhbnRTcGVjLAorICAgIFNIT1JUICpxdWFudFNwZWNUbXAsIElOVCBkWm9uZVF1YW50RW5hYmxlLCBJTlQgKnNjZiwgY29uc3QgSU5UICptaW5TY2YsCisgICAgRklYUF9EQkwgKnNmYkRpc3QsIEZJWFBfREJMICpzZmJDb25zdFBlUGFydCwgRklYUF9EQkwgKnNmYkZvcm1GYWN0b3JMZERhdGEsCisgICAgRklYUF9EQkwgKnNmYk5SZWxldmFudExpbmVzKSB7CiAgIElOVCBzZmIsIHN0YXJ0U2ZiLCBzdG9wU2ZiOwogICBJTlQgc2NmVG1wW01BWF9HUk9VUEVEX1NGQl0sIHNjZk1pbiwgc2NmTWF4LCBzY2ZBY3Q7CiAgIElOVCBwb3NzaWJsZVJlZ2lvbkZvdW5kOwpAQCAtNjU4LDMxICs2NDUsMjkgQEAKICAgLyogY2FsYyBtaW4gYW5kIG1heCBzY2FsZmFjdG9ycyAqLwogICBzY2ZNaW4gPSBGREtfSU5UX01BWDsKICAgc2NmTWF4ID0gRkRLX0lOVF9NSU47Ci0gIGZvciAoc2ZiPTA7IHNmYjxzZmJDbnQ7IHNmYisrKSB7Ci0gICAgaWYgKHNjZltzZmJdIT1GREtfSU5UX01JTikgeworICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKKyAgICBpZiAoc2NmW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKICAgICAgIHNjZk1pbiA9IGZpeE1pbihzY2ZNaW4sIHNjZltzZmJdKTsKICAgICAgIHNjZk1heCA9IGZpeE1heChzY2ZNYXgsIHNjZltzZmJdKTsKICAgICB9CiAgIH0KIAotICBpZiAoc2NmTWF4ICE9IEZES19JTlRfTUlOICYmIHNjZk1heCA8PSBzY2ZNaW4rTUFYX1NDRl9ERUxUQSkgewotCisgIGlmIChzY2ZNYXggIT0gRkRLX0lOVF9NSU4gJiYgc2NmTWF4IDw9IHNjZk1pbiArIE1BWF9TQ0ZfREVMVEEpIHsKICAgICBzY2ZBY3QgPSBzY2ZNYXg7CiAKICAgICBkbyB7CiAgICAgICAvKiB0cnkgc21hbGxlciBzY2YgKi8KICAgICAgIHNjZkFjdC0tOwotICAgICAgZm9yIChpPTA7IGk8TUFYX0dST1VQRURfU0ZCOyBpKyspCi0gICAgICAgIHNjZlRtcFtpXSA9IHNjZltpXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfR1JPVVBFRF9TRkI7IGkrKykgc2NmVG1wW2ldID0gc2NmW2ldOwogICAgICAgc3RvcFNmYiA9IDA7CiAgICAgICBkbyB7CiAgICAgICAgIC8qIHNlYXJjaCBmb3IgcmVnaW9uIHdoZXJlIGFsbCBzY2ZzIGFyZSBiaWdnZXIgdGhhbiBzY2ZBY3QgKi8KICAgICAgICAgc2ZiID0gc3RvcFNmYjsKLSAgICAgICAgd2hpbGUgKHNmYjxzZmJDbnQgJiYgKHNjZltzZmJdPT1GREtfSU5UX01JTiB8fCBzY2Zbc2ZiXSA8PSBzY2ZBY3QpKQorICAgICAgICB3aGlsZSAoc2ZiIDwgc2ZiQ250ICYmIChzY2Zbc2ZiXSA9PSBGREtfSU5UX01JTiB8fCBzY2Zbc2ZiXSA8PSBzY2ZBY3QpKQogICAgICAgICAgIHNmYisrOwogICAgICAgICBzdGFydFNmYiA9IHNmYjsKICAgICAgICAgc2ZiKys7Ci0gICAgICAgIHdoaWxlIChzZmI8c2ZiQ250ICYmIChzY2Zbc2ZiXT09RkRLX0lOVF9NSU4gfHwgc2NmW3NmYl0gPiBzY2ZBY3QpKQorICAgICAgICB3aGlsZSAoc2ZiIDwgc2ZiQ250ICYmIChzY2Zbc2ZiXSA9PSBGREtfSU5UX01JTiB8fCBzY2Zbc2ZiXSA+IHNjZkFjdCkpCiAgICAgICAgICAgc2ZiKys7CiAgICAgICAgIHN0b3BTZmIgPSBzZmI7CiAKQEAgLTY5MCw3ICs2NzUsNyBAQAogICAgICAgICBwb3NzaWJsZVJlZ2lvbkZvdW5kID0gMDsKICAgICAgICAgaWYgKHN0YXJ0U2ZiIDwgc2ZiQ250KSB7CiAgICAgICAgICAgcG9zc2libGVSZWdpb25Gb3VuZCA9IDE7Ci0gICAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CiAgICAgICAgICAgICBpZiAoc2NmW3NmYl0gIT0gRkRLX0lOVF9NSU4pCiAgICAgICAgICAgICAgIGlmIChzY2ZBY3QgPCBtaW5TY2Zbc2ZiXSkgewogICAgICAgICAgICAgICAgIHBvc3NpYmxlUmVnaW9uRm91bmQgPSAwOwpAQCAtNzAyLDQwICs2ODcsMzggQEAKICAgICAgICAgaWYgKHBvc3NpYmxlUmVnaW9uRm91bmQpIHsgLyogcmVnaW9uIGZvdW5kICovCiAKICAgICAgICAgICAvKiByZXBsYWNlIHNjZnMgaW4gcmVnaW9uIGJ5IHNjZkFjdCAqLwotICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLSAgICAgICAgICAgIGlmIChzY2ZUbXBbc2ZiXSAhPSBGREtfSU5UX01JTikKLSAgICAgICAgICAgICAgc2NmVG1wW3NmYl0gPSBzY2ZBY3Q7CisgICAgICAgICAgZm9yIChzZmIgPSBzdGFydFNmYjsgc2ZiIDwgc3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgIGlmIChzY2ZUbXBbc2ZiXSAhPSBGREtfSU5UX01JTikgc2NmVG1wW3NmYl0gPSBzY2ZBY3Q7CiAgICAgICAgICAgfQogCiAgICAgICAgICAgLyogZXN0aW1hdGUgY2hhbmdlIGluIGJpdCBkZW1hbmQgZm9yIG5ldyBzY2ZzICovCi0gICAgICAgICAgZGVsdGFTY2ZCaXRzID0gRkRLYWFjRW5jX2NvdW50U2NmQml0c0RpZmYoc2NmLHNjZlRtcCxzZmJDbnQsc3RhcnRTZmIsc3RvcFNmYik7CisgICAgICAgICAgZGVsdGFTY2ZCaXRzID0gRkRLYWFjRW5jX2NvdW50U2NmQml0c0RpZmYoc2NmLCBzY2ZUbXAsIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNmYiwgc3RvcFNmYik7CiAKLSAgICAgICAgICBkZWx0YVNwZWNQZSA9IEZES2FhY0VuY19jYWxjU3BlY1BlRGlmZihwc3lPdXRDaGFuLCBxY091dENoYW5uZWwsIHNjZiwgc2NmVG1wLCBzZmJDb25zdFBlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZmIsIHN0b3BTZmIpOworICAgICAgICAgIGRlbHRhU3BlY1BlID0gRkRLYWFjRW5jX2NhbGNTcGVjUGVEaWZmKAorICAgICAgICAgICAgICBwc3lPdXRDaGFuLCBxY091dENoYW5uZWwsIHNjZiwgc2NmVG1wLCBzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YSwgc2ZiTlJlbGV2YW50TGluZXMsIHN0YXJ0U2ZiLCBzdG9wU2ZiKTsKIAogICAgICAgICAgIGRlbHRhUGVOZXcgPSBkZWx0YVBlICsgKEZJWFBfREJMKWRlbHRhU2NmQml0cyArIGRlbHRhU3BlY1BlOwogCiAgICAgICAgICAgLyogbmV3IGJpdCBkZW1hbmQgc21hbGwgZW5vdWdoID8gKi8KICAgICAgICAgICAvKiAwLjAwMDYxMDM1MTU2MjVmID0gMTAuMGYvKDJeKDIqQVNfUEVfRkFDX1NISUZUKSkgKi8KICAgICAgICAgICBpZiAoZGVsdGFQZU5ldyA8IEZMMkZYQ09OU1RfREJMKDAuMDAwNjEwMzUxNTYyNWYpKSB7Ci0KICAgICAgICAgICAgIC8qIHF1YW50aXplIGFuZCBjYWxjIHN1bSBvZiBuZXcgZGlzdG9ydGlvbiAqLwogICAgICAgICAgICAgZGlzdE9sZFN1bSA9IGRpc3ROZXdTdW0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CiAgICAgICAgICAgICAgIGlmIChzY2ZUbXBbc2ZiXSAhPSBGREtfSU5UX01JTikgewogICAgICAgICAgICAgICAgIGRpc3RPbGRTdW0gKz0gQ2FsY0ludkxkRGF0YShzZmJEaXN0W3NmYl0pID4+IERJU1RfRkFDX1NISUZUOwogCi0gICAgICAgICAgICAgICAgc2ZiV2lkdGggPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYisxXSAtIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiXTsKKyAgICAgICAgICAgICAgICBzZmJXaWR0aCA9IHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiICsgMV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJdOwogICAgICAgICAgICAgICAgIHNmYk9mZnMgPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYl07CiAKLSAgICAgICAgICAgICAgICBzZmJEaXN0TmV3W3NmYl0gPSBGREthYWNFbmNfY2FsY1NmYkRpc3QocWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW0rc2ZiT2ZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXArc2ZiT2ZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2ZBY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CisgICAgICAgICAgICAgICAgc2ZiRGlzdE5ld1tzZmJdID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KAorICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bSArIHNmYk9mZnMsCisgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCArIHNmYk9mZnMsIHNmYldpZHRoLCBzY2ZBY3QsIGRab25lUXVhbnRFbmFibGUpOwogCi0gICAgICAgICAgICAgICAgaWYgKHNmYkRpc3ROZXdbc2ZiXSA+cWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiXSkgeworICAgICAgICAgICAgICAgIGlmIChzZmJEaXN0TmV3W3NmYl0gPiBxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJdKSB7CiAgICAgICAgICAgICAgICAgICAvKiBubyBpbXByb3ZlbWVudCwgc2tpcCBmdXJ0aGVyIGRpc3QuIGNhbGN1bGF0aW9ucyAqLwogICAgICAgICAgICAgICAgICAgZGlzdE5ld1N1bSA9IGRpc3RPbGRTdW0gPDwgMTsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzQ2LDIwICs3MjksMTkgQEAKICAgICAgICAgICAgIC8qIGRpc3RvcnRpb24gc21hbGxlciA/IC0+IHVzZSBuZXcgc2NhbGVmYWN0b3JzICovCiAgICAgICAgICAgICBpZiAoZGlzdE5ld1N1bSA8IGRpc3RPbGRTdW0pIHsKICAgICAgICAgICAgICAgZGVsdGFQZSA9IGRlbHRhUGVOZXc7Ci0gICAgICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgZm9yIChzZmIgPSBzdGFydFNmYjsgc2ZiIDwgc3RvcFNmYjsgc2ZiKyspIHsKICAgICAgICAgICAgICAgICBpZiAoc2NmW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKLSAgICAgICAgICAgICAgICAgIHNmYldpZHRoID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmIrMV0gLQorICAgICAgICAgICAgICAgICAgc2ZiV2lkdGggPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYiArIDFdIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJdOwogICAgICAgICAgICAgICAgICAgc2ZiT2ZmcyA9IHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiXTsKICAgICAgICAgICAgICAgICAgIHNjZltzZmJdID0gc2NmQWN0OwogICAgICAgICAgICAgICAgICAgc2ZiRGlzdFtzZmJdID0gc2ZiRGlzdE5ld1tzZmJdOwogCi0gICAgICAgICAgICAgICAgICBmb3IgKGs9MDsgazxzZmJXaWR0aDsgaysrKQotICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNbc2ZiT2ZmcytrXSA9IHF1YW50U3BlY1RtcFtzZmJPZmZzK2tdOworICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNmYldpZHRoOyBrKyspCisgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1tzZmJPZmZzICsga10gPSBxdWFudFNwZWNUbXBbc2ZiT2ZmcyArIGtdOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCiAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTc3MywxOCArNzU1LDExIEBACiAgIEZ1bmN0aW9uOiBGREthYWNFbmNfRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZjIKIAogKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19GREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmMihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICAqcWNPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjVG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbWluU2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRm9ybUZhY3RvckxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYk5SZWxldmFudExpbmVzKQoteworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0ZES2FhY0VuY19hc3NpbWlsYXRlTXVsdGlwbGVTY2YyKAorICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbCwgU0hPUlQgKnF1YW50U3BlYywKKyAgICBTSE9SVCAqcXVhbnRTcGVjVG1wLCBJTlQgZFpvbmVRdWFudEVuYWJsZSwgSU5UICpzY2YsIGNvbnN0IElOVCAqbWluU2NmLAorICAgIEZJWFBfREJMICpzZmJEaXN0LCBGSVhQX0RCTCAqc2ZiQ29uc3RQZVBhcnQsIEZJWFBfREJMICpzZmJGb3JtRmFjdG9yTGREYXRhLAorICAgIEZJWFBfREJMICpzZmJOUmVsZXZhbnRMaW5lcykgewogICBJTlQgc2ZiLCBzdGFydFNmYiwgc3RvcFNmYjsKICAgSU5UIHNjZlRtcFtNQVhfR1JPVVBFRF9TRkJdLCBzY2ZBY3QsIHNjZk5ldzsKICAgSU5UIHNjZlByZXYsIHNjZk5leHQsIHNjZlByZXZOZXh0TWluLCBzY2ZQcmV2TmV4dE1heCwgc2NmTG8sIHNjZkhpOwpAQCAtNzk4LDEzICs3NzMsMTMgQEAKICAgRklYUF9EQkwgZGVsdGFQZU5ldyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBJTlQgc2ZiQ250ID0gcHN5T3V0Q2hhbi0+c2ZiQ250OwogICBJTlQgYlN1Y2Nlc3MsIGJDaGVja1NjZjsKLSAgSU5UIGksazsKKyAgSU5UIGksIGs7CiAKICAgLyogY2FsYyBtaW4gYW5kIG1heCBzY2FsZmFjdG9ycyAqLwogICBzY2ZNaW4gPSBGREtfSU5UX01BWDsKICAgc2NmTWF4ID0gRkRLX0lOVF9NSU47Ci0gIGZvciAoc2ZiPTA7IHNmYjxzZmJDbnQ7IHNmYisrKSB7Ci0gICAgaWYgKHNjZltzZmJdIT1GREtfSU5UX01JTikgeworICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKKyAgICBpZiAoc2NmW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKICAgICAgIHNjZk1pbiA9IGZpeE1pbihzY2ZNaW4sIHNjZltzZmJdKTsKICAgICAgIHNjZk1heCA9IGZpeE1heChzY2ZNYXgsIHNjZltzZmJdKTsKICAgICB9CkBAIC04MTcsMTIgKzc5MiwxMiBAQAogICAgIHNjZlByZXYgPSBzY2ZBY3Q7CiAKICAgICBzZmIgPSBzdG9wU2ZiOwotICAgIHdoaWxlIChzZmI8c2ZiQ250ICYmIChzY2Zbc2ZiXT09RkRLX0lOVF9NSU4pKQotICAgICAgc2ZiKys7CisgICAgd2hpbGUgKHNmYiA8IHNmYkNudCAmJiAoc2NmW3NmYl0gPT0gRkRLX0lOVF9NSU4pKSBzZmIrKzsKICAgICBzdGFydFNmYiA9IHNmYjsKICAgICBzY2ZBY3QgPSBzY2Zbc3RhcnRTZmJdOwogICAgIHNmYisrOwotICAgIHdoaWxlIChzZmI8c2ZiQ250ICYmICgoc2NmW3NmYl09PUZES19JTlRfTUlOKSB8fCAoc2NmW3NmYl09PXNjZltzdGFydFNmYl0pKSkKKyAgICB3aGlsZSAoc2ZiIDwgc2ZiQ250ICYmCisgICAgICAgICAgICgoc2NmW3NmYl0gPT0gRkRLX0lOVF9NSU4pIHx8IChzY2Zbc2ZiXSA9PSBzY2Zbc3RhcnRTZmJdKSkpCiAgICAgICBzZmIrKzsKICAgICBzdG9wU2ZiID0gc2ZiOwogCkBAIC04MzEsOCArODA2LDcgQEAKICAgICBlbHNlCiAgICAgICBzY2ZOZXh0ID0gc2NmQWN0OwogCi0gICAgaWYgKHNjZlByZXYgPT0gRkRLX0lOVF9NSU4pCi0gICAgICBzY2ZQcmV2ID0gc2NmQWN0OworICAgIGlmIChzY2ZQcmV2ID09IEZES19JTlRfTUlOKSBzY2ZQcmV2ID0gc2NmQWN0OwogCiAgICAgc2NmUHJldk5leHRNYXggPSBmaXhNYXgoc2NmUHJldiwgc2NmTmV4dCk7CiAgICAgc2NmUHJldk5leHRNaW4gPSBmaXhNaW4oc2NmUHJldiwgc2NmTmV4dCk7CkBAIC04NDcsMzkgKzgyMSw0OSBAQAogICAgIGVsc2UKICAgICAgIHNjZkxvID0gc2NmUHJldk5leHRNYXg7CiAKLSAgICBpZiAoc3RhcnRTZmIgPCBzZmJDbnQgJiYgc2NmSGktc2NmTG8gPD0gTUFYX1NDRl9ERUxUQSkgeyAvKiByZWdpb24gZm91bmQgKi8KKyAgICBpZiAoc3RhcnRTZmIgPCBzZmJDbnQgJiYKKyAgICAgICAgc2NmSGkgLSBzY2ZMbyA8PSBNQVhfU0NGX0RFTFRBKSB7IC8qIHJlZ2lvbiBmb3VuZCAqLwogICAgICAgLyogMS4gdHJ5IHRvIHNhdmUgYml0cyBieSBjb2Fyc2VyIHF1YW50aXphdGlvbiAqLwogICAgICAgaWYgKHNjZkhpID4gc2NmW3N0YXJ0U2ZiXSkgewogICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGFsbG93ZWQgZGlzdG9ydGlvbiAqLwotICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CiAgICAgICAgICAgaWYgKHNjZltzZmJdICE9IEZES19JTlRfTUlOKSB7Ci0gICAgICAgICAgICAvKiBzZmJEaXN0TWF4W3NmYl0gPSAoZmxvYXQpcG93KHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkW3NmYl0qc2ZiRGlzdFtzZmJdKnNmYkRpc3Rbc2ZiXSwxLjBmLzMuMGYpOyAqLwotICAgICAgICAgICAgLyogc2ZiRGlzdE1heFtzZmJdID0gZml4TWF4KHNmYkRpc3RNYXhbc2ZiXSxxY091dENoYW5uZWwtPnNmYkVuZXJneVtzZmJdKkZMMkZYQ09OU1RfREJMKDEuZS0zZikpOyAqLworICAgICAgICAgICAgLyogc2ZiRGlzdE1heFtzZmJdID0KKyAgICAgICAgICAgICAqIChmbG9hdClwb3cocWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRbc2ZiXSpzZmJEaXN0W3NmYl0qc2ZiRGlzdFtzZmJdLDEuMGYvMy4wZik7CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIHNmYkRpc3RNYXhbc2ZiXSA9CisgICAgICAgICAgICAgKiBmaXhNYXgoc2ZiRGlzdE1heFtzZmJdLHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5W3NmYl0qRkwyRlhDT05TVF9EQkwoMS5lLTNmKSk7CisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIC8qIC0wLjE1NTcxNTM3OTQ0ID0gbGQ2NCgxLmUtM2YpKi8KLSAgICAgICAgICAgIHNmYkRpc3RNYXhbc2ZiXSA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYvMy4wZikscWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiXSkrZk11bHQoRkwyRlhDT05TVF9EQkwoMS4wZi8zLjBmKSxzZmJEaXN0W3NmYl0pK2ZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYvMy4wZiksc2ZiRGlzdFtzZmJdKTsKLSAgICAgICAgICAgIHNmYkRpc3RNYXhbc2ZiXSA9IGZpeE1heChzZmJEaXN0TWF4W3NmYl0scWNPdXRDaGFubmVsLT5zZmJFbmVyZ3lMZERhdGFbc2ZiXS1GTDJGWENPTlNUX0RCTCgwLjE1NTcxNTM3OTQ0KSk7Ci0gICAgICAgICAgICBzZmJEaXN0TWF4W3NmYl0gPSBmaXhNaW4oc2ZiRGlzdE1heFtzZmJdLHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYl0pOworICAgICAgICAgICAgc2ZiRGlzdE1heFtzZmJdID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMS4wZiAvIDMuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMS4wZiAvIDMuMGYpLCBzZmJEaXN0W3NmYl0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYgLyAzLjBmKSwgc2ZiRGlzdFtzZmJdKTsKKyAgICAgICAgICAgIHNmYkRpc3RNYXhbc2ZiXSA9CisgICAgICAgICAgICAgICAgZml4TWF4KHNmYkRpc3RNYXhbc2ZiXSwgcWNPdXRDaGFubmVsLT5zZmJFbmVyZ3lMZERhdGFbc2ZiXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMTU1NzE1Mzc5NDQpKTsKKyAgICAgICAgICAgIHNmYkRpc3RNYXhbc2ZiXSA9CisgICAgICAgICAgICAgICAgZml4TWluKHNmYkRpc3RNYXhbc2ZiXSwgcWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiXSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLyogbG9vcCBvdmVyIGFsbCBwb3NzaWJsZSBzY2YgdmFsdWVzIGZvciB0aGlzIHJlZ2lvbiAqLwogICAgICAgICBiQ2hlY2tTY2YgPSAxOwotICAgICAgICBmb3IgKHNjZk5ldz1zY2Zbc3RhcnRTZmJdKzE7IHNjZk5ldzw9c2NmSGk7IHNjZk5ldysrKSB7Ci0JICAgICAgICAgZm9yIChrPTA7IGs8TUFYX0dST1VQRURfU0ZCOyBrKyspCi0gICAgICAgICAgICBzY2ZUbXBba10gPSBzY2Zba107CisgICAgICAgIGZvciAoc2NmTmV3ID0gc2NmW3N0YXJ0U2ZiXSArIDE7IHNjZk5ldyA8PSBzY2ZIaTsgc2NmTmV3KyspIHsKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTUFYX0dST1VQRURfU0ZCOyBrKyspIHNjZlRtcFtrXSA9IHNjZltrXTsKIAogICAgICAgICAgIC8qIHJlcGxhY2Ugc2NmcyBpbiByZWdpb24gYnkgc2NmTmV3ICovCi0gICAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgewotICAgICAgICAgICAgaWYgKHNjZlRtcFtzZmJdICE9IEZES19JTlRfTUlOKQotICAgICAgICAgICAgICBzY2ZUbXBbc2ZiXSA9IHNjZk5ldzsKKyAgICAgICAgICBmb3IgKHNmYiA9IHN0YXJ0U2ZiOyBzZmIgPCBzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICAgICAgaWYgKHNjZlRtcFtzZmJdICE9IEZES19JTlRfTUlOKSBzY2ZUbXBbc2ZiXSA9IHNjZk5ldzsKICAgICAgICAgICB9CiAKICAgICAgICAgICAvKiBlc3RpbWF0ZSBjaGFuZ2UgaW4gYml0IGRlbWFuZCBmb3IgbmV3IHNjZnMgKi8KLSAgICAgICAgICBkZWx0YVNjZkJpdHMgPSBGREthYWNFbmNfY291bnRTY2ZCaXRzRGlmZihzY2Ysc2NmVG1wLHNmYkNudCxzdGFydFNmYixzdG9wU2ZiKTsKKyAgICAgICAgICBkZWx0YVNjZkJpdHMgPSBGREthYWNFbmNfY291bnRTY2ZCaXRzRGlmZihzY2YsIHNjZlRtcCwgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2ZiLCBzdG9wU2ZiKTsKIAotICAgICAgICAgIGRlbHRhU3BlY1BlID0gRkRLYWFjRW5jX2NhbGNTcGVjUGVEaWZmKHBzeU91dENoYW4sIHFjT3V0Q2hhbm5lbCwgc2NmLCBzY2ZUbXAsIHNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YSwgc2ZiTlJlbGV2YW50TGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNmYiwgc3RvcFNmYik7CisgICAgICAgICAgZGVsdGFTcGVjUGUgPSBGREthYWNFbmNfY2FsY1NwZWNQZURpZmYoCisgICAgICAgICAgICAgIHBzeU91dENoYW4sIHFjT3V0Q2hhbm5lbCwgc2NmLCBzY2ZUbXAsIHNmYkNvbnN0UGVQYXJ0LAorICAgICAgICAgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhLCBzZmJOUmVsZXZhbnRMaW5lcywgc3RhcnRTZmIsIHN0b3BTZmIpOwogCiAgICAgICAgICAgZGVsdGFQZU5ldyA9IGRlbHRhUGUgKyAoRklYUF9EQkwpZGVsdGFTY2ZCaXRzICsgZGVsdGFTcGVjUGU7CiAKQEAgLTg4OCwxMyArODcyLDEyIEBACiAgICAgICAgICAgICBiU3VjY2VzcyA9IDE7CiAKICAgICAgICAgICAgIC8qIHF1YW50aXplIGFuZCBjYWxjIHN1bSBvZiBuZXcgZGlzdG9ydGlvbiAqLwotICAgICAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICAgICAgZm9yIChzZmIgPSBzdGFydFNmYjsgc2ZiIDwgc3RvcFNmYjsgc2ZiKyspIHsKICAgICAgICAgICAgICAgaWYgKHNjZlRtcFtzZmJdICE9IEZES19JTlRfTUlOKSB7Ci0gICAgICAgICAgICAgICAgc2ZiRGlzdE5ld1tzZmJdID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3NmYk9mZnNbc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXArc2ZiT2Zmc1tzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNbc2ZiKzFdLXNmYk9mZnNbc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2ZOZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CisgICAgICAgICAgICAgICAgc2ZiRGlzdE5ld1tzZmJdID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KAorICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bSArIHNmYk9mZnNbc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wICsgc2ZiT2Zmc1tzZmJdLAorICAgICAgICAgICAgICAgICAgICBzZmJPZmZzW3NmYiArIDFdIC0gc2ZiT2Zmc1tzZmJdLCBzY2ZOZXcsIGRab25lUXVhbnRFbmFibGUpOwogCiAgICAgICAgICAgICAgICAgaWYgKHNmYkRpc3ROZXdbc2ZiXSA+IHNmYkRpc3RNYXhbc2ZiXSkgewogICAgICAgICAgICAgICAgICAgLyogbm8gaW1wcm92ZW1lbnQsIHNraXAgZnVydGhlciBkaXN0LiBjYWxjdWxhdGlvbnMgKi8KQEAgLTkwOCwxOCArODkxLDE5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYkNoZWNrU2NmPT0wKSAvKiBmdXJ0aGVyIGNhbGN1bGF0aW9ucyB1c2VsZXNzID8gKi8KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChiQ2hlY2tTY2YgPT0gMCkgLyogZnVydGhlciBjYWxjdWxhdGlvbnMgdXNlbGVzcyA/ICovCisgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgLyogZGlzdG9ydGlvbiBzbWFsbCBlbm91Z2ggPyAtPiB1c2UgbmV3IHNjYWxlZmFjdG9ycyAqLwogICAgICAgICAgICAgaWYgKGJTdWNjZXNzKSB7CiAgICAgICAgICAgICAgIGRlbHRhUGUgPSBkZWx0YVBlTmV3OwotICAgICAgICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNjZltzZmJdICE9IEZES19JTlRfTUlOKSB7CiAgICAgICAgICAgICAgICAgICBzY2Zbc2ZiXSA9IHNjZk5ldzsKICAgICAgICAgICAgICAgICAgIHNmYkRpc3Rbc2ZiXSA9IHNmYkRpc3ROZXdbc2ZiXTsKIAotICAgICAgICAgICAgICAgICAgZm9yIChrPTA7IGs8c2ZiT2Zmc1tzZmIrMV0tc2ZiT2Zmc1tzZmJdOyBrKyspCi0gICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1tzZmJPZmZzW3NmYl0ra10gPSBxdWFudFNwZWNUbXBbc2ZiT2Zmc1tzZmJdK2tdOworICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNmYk9mZnNbc2ZiICsgMV0gLSBzZmJPZmZzW3NmYl07IGsrKykKKyAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjW3NmYk9mZnNbc2ZiXSArIGtdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcFtzZmJPZmZzW3NmYl0gKyBrXTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTkzMCw1MiArOTE0LDQ3IEBACiAgICAgICAvKiAyLiBvbmx5IGlmIGNvYXJzZXIgcXVhbnRpemF0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bCwgdHJ5IHRvIGZpbmQKICAgICAgICAgIGEgYmV0dGVyIHNvbHV0aW9uIGJ5IGZpbmVyIHF1YW50aXphdGlvbiBhbmQgcmVkdWNpbmcgYml0cyBmb3IKICAgICAgICAgIHNjYWxlZmFjdG9yIGNvZGluZyAqLwotICAgICAgaWYgKHNjZkFjdD09c2NmW3N0YXJ0U2ZiXSAmJgotICAgICAgICAgIHNjZkxvIDwgc2NmQWN0ICYmCi0gICAgICAgICAgc2NmTWF4LXNjZk1pbiA8PSBNQVhfU0NGX0RFTFRBKSB7Ci0KKyAgICAgIGlmIChzY2ZBY3QgPT0gc2NmW3N0YXJ0U2ZiXSAmJiBzY2ZMbyA8IHNjZkFjdCAmJgorICAgICAgICAgIHNjZk1heCAtIHNjZk1pbiA8PSBNQVhfU0NGX0RFTFRBKSB7CiAgICAgICAgIGludCBibWluU2NmVmlvbGF0aW9uID0gMDsKIAotICAgICAgICBmb3IgKGs9MDsgazxNQVhfR1JPVVBFRF9TRkI7IGsrKykKLSAgICAgICAgICBzY2ZUbXBba10gPSBzY2Zba107CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBNQVhfR1JPVVBFRF9TRkI7IGsrKykgc2NmVG1wW2tdID0gc2NmW2tdOwogCiAgICAgICAgIHNjZk5ldyA9IHNjZkxvOwogCiAgICAgICAgIC8qIHJlcGxhY2Ugc2NmcyBpbiByZWdpb24gYnkgc2NmTmV3IGFuZAogICAgICAgICAgICBjaGVjayBpZiBpbiBhbGwgc2ZiIHNjZk5ldyA+PSBtaW5TY2Zbc2ZiXSAqLwotICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CiAgICAgICAgICAgaWYgKHNjZlRtcFtzZmJdICE9IEZES19JTlRfTUlOKSB7CiAgICAgICAgICAgICBzY2ZUbXBbc2ZiXSA9IHNjZk5ldzsKLSAgICAgICAgICAgIGlmIChzY2ZOZXcgPCBtaW5TY2Zbc2ZiXSkKLSAgICAgICAgICAgICAgYm1pblNjZlZpb2xhdGlvbiA9IDE7CisgICAgICAgICAgICBpZiAoc2NmTmV3IDwgbWluU2NmW3NmYl0pIGJtaW5TY2ZWaW9sYXRpb24gPSAxOwogICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmICghYm1pblNjZlZpb2xhdGlvbikgewogICAgICAgICAgIC8qIGVzdGltYXRlIGNoYW5nZSBpbiBiaXQgZGVtYW5kIGZvciBuZXcgc2NmcyAqLwotICAgICAgICAgIGRlbHRhU2NmQml0cyA9IEZES2FhY0VuY19jb3VudFNjZkJpdHNEaWZmKHNjZixzY2ZUbXAsc2ZiQ250LHN0YXJ0U2ZiLHN0b3BTZmIpOworICAgICAgICAgIGRlbHRhU2NmQml0cyA9IEZES2FhY0VuY19jb3VudFNjZkJpdHNEaWZmKHNjZiwgc2NmVG1wLCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZmIsIHN0b3BTZmIpOwogCi0gICAgICAgICAgZGVsdGFTcGVjUGUgPSBGREthYWNFbmNfY2FsY1NwZWNQZURpZmYocHN5T3V0Q2hhbiwgcWNPdXRDaGFubmVsLCBzY2YsIHNjZlRtcCwgc2ZiQ29uc3RQZVBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhLCBzZmJOUmVsZXZhbnRMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2ZiLCBzdG9wU2ZiKTsKKyAgICAgICAgICBkZWx0YVNwZWNQZSA9IEZES2FhY0VuY19jYWxjU3BlY1BlRGlmZigKKyAgICAgICAgICAgICAgcHN5T3V0Q2hhbiwgcWNPdXRDaGFubmVsLCBzY2YsIHNjZlRtcCwgc2ZiQ29uc3RQZVBhcnQsCisgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzLCBzdGFydFNmYiwgc3RvcFNmYik7CiAKICAgICAgICAgICBkZWx0YVBlTmV3ID0gZGVsdGFQZSArIChGSVhQX0RCTClkZWx0YVNjZkJpdHMgKyBkZWx0YVNwZWNQZTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIG5ldyBiaXQgZGVtYW5kIHNtYWxsIGVub3VnaCA/ICovCiAgICAgICAgIGlmICghYm1pblNjZlZpb2xhdGlvbiAmJiBkZWx0YVBlTmV3IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKLQogICAgICAgICAgIC8qIHF1YW50aXplIGFuZCBjYWxjIHN1bSBvZiBuZXcgZGlzdG9ydGlvbiAqLwogICAgICAgICAgIGRpc3RPbGRTdW0gPSBkaXN0TmV3U3VtID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CiAgICAgICAgICAgICBpZiAoc2NmVG1wW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKICAgICAgICAgICAgICAgZGlzdE9sZFN1bSArPSBDYWxjSW52TGREYXRhKHNmYkRpc3Rbc2ZiXSkgPj4gRElTVF9GQUNfU0hJRlQ7CiAKLSAgICAgICAgICAgICAgc2ZiRGlzdE5ld1tzZmJdID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3NmYk9mZnNbc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCtzZmJPZmZzW3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzW3NmYisxXS1zZmJPZmZzW3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2ZOZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlKTsKKyAgICAgICAgICAgICAgc2ZiRGlzdE5ld1tzZmJdID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KAorICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW0gKyBzZmJPZmZzW3NmYl0sCisgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXAgKyBzZmJPZmZzW3NmYl0sIHNmYk9mZnNbc2ZiICsgMV0gLSBzZmJPZmZzW3NmYl0sCisgICAgICAgICAgICAgICAgICBzY2ZOZXcsIGRab25lUXVhbnRFbmFibGUpOwogCiAgICAgICAgICAgICAgIGlmIChzZmJEaXN0TmV3W3NmYl0gPiBxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJdKSB7CiAgICAgICAgICAgICAgICAgLyogbm8gaW1wcm92ZW1lbnQsIHNraXAgZnVydGhlciBkaXN0LiBjYWxjdWxhdGlvbnMgKi8KQEAgLTk4NiwxNSArOTY1LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIC8qIGRpc3RvcnRpb24gc21hbGxlciA/IC0+IHVzZSBuZXcgc2NhbGVmYWN0b3JzICovCi0gICAgICAgICAgaWYgKGRpc3ROZXdTdW0gPCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjhmKSxkaXN0T2xkU3VtKSkgeworICAgICAgICAgIGlmIChkaXN0TmV3U3VtIDwgZk11bHQoRkwyRlhDT05TVF9EQkwoMC44ZiksIGRpc3RPbGRTdW0pKSB7CiAgICAgICAgICAgICBkZWx0YVBlID0gZGVsdGFQZU5ldzsKLSAgICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CiAgICAgICAgICAgICAgIGlmIChzY2Zbc2ZiXSAhPSBGREtfSU5UX01JTikgewogICAgICAgICAgICAgICAgIHNjZltzZmJdID0gc2NmTmV3OwogICAgICAgICAgICAgICAgIHNmYkRpc3Rbc2ZiXSA9IHNmYkRpc3ROZXdbc2ZiXTsKIAotICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrPHNmYk9mZnNbc2ZiKzFdLXNmYk9mZnNbc2ZiXTsgaysrKQotICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjW3NmYk9mZnNbc2ZiXStrXSA9IHF1YW50U3BlY1RtcFtzZmJPZmZzW3NmYl0ra107CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNmYk9mZnNbc2ZiICsgMV0gLSBzZmJPZmZzW3NmYl07IGsrKykKKyAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1tzZmJPZmZzW3NmYl0gKyBrXSA9IHF1YW50U3BlY1RtcFtzZmJPZmZzW3NmYl0gKyBrXTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgIH0KQEAgLTEwMDMsNDMgKzk4Miw0NSBAQAogCiAgICAgICAvKiAzLiB0cnkgdG8gZmluZCBhIGJldHRlciBzb2x1dGlvbiAoc2F2ZSBiaXRzKSBieSBvbmx5IHJlZHVjaW5nIHRoZQogICAgICAgICAgc2NhbGVmYWN0b3Igd2l0aG91dCBuZXcgcXVhbnRpemF0aW9uICovCi0gICAgICBpZiAoc2NmTWF4LXNjZk1pbiA8PSBNQVhfU0NGX0RFTFRBLTMpIHsgLyogMyBiZWMuIHNjZiBpcyByZWR1Y2VkIDMgdGltZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlIGZvciBsb29wIGJlbG93ICovCisgICAgICBpZiAoc2NmTWF4IC0gc2NmTWluIDw9CisgICAgICAgICAgTUFYX1NDRl9ERUxUQSAtIDMpIHsgLyogMyBiZWMuIHNjZiBpcyByZWR1Y2VkIDMgdGltZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlIGZvciBsb29wIGJlbG93ICovCiAKLSAgICAgICAgZm9yIChrPTA7IGs8c2ZiQ250OyBrKyspCi0gICAgICAgICAgc2NmVG1wW2tdID0gc2NmW2tdOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc2ZiQ250OyBrKyspIHNjZlRtcFtrXSA9IHNjZltrXTsKIAotICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICBzY2ZOZXcgPSBzY2ZUbXBbc3RhcnRTZmJdLTE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICBzY2ZOZXcgPSBzY2ZUbXBbc3RhcnRTZmJdIC0gMTsKICAgICAgICAgICAvKiByZXBsYWNlIHNjZnMgaW4gcmVnaW9uIGJ5IHNjZk5ldyAqLwotICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLSAgICAgICAgICAgIGlmIChzY2ZUbXBbc2ZiXSAhPSBGREtfSU5UX01JTikKLSAgICAgICAgICAgICAgc2NmVG1wW3NmYl0gPSBzY2ZOZXc7CisgICAgICAgICAgZm9yIChzZmIgPSBzdGFydFNmYjsgc2ZiIDwgc3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgIGlmIChzY2ZUbXBbc2ZiXSAhPSBGREtfSU5UX01JTikgc2NmVG1wW3NmYl0gPSBzY2ZOZXc7CiAgICAgICAgICAgfQogICAgICAgICAgIC8qIGVzdGltYXRlIGNoYW5nZSBpbiBiaXQgZGVtYW5kIGZvciBuZXcgc2NmcyAqLwotICAgICAgICAgIGRlbHRhU2NmQml0cyA9IEZES2FhY0VuY19jb3VudFNjZkJpdHNEaWZmKHNjZixzY2ZUbXAsc2ZiQ250LHN0YXJ0U2ZiLHN0b3BTZmIpOworICAgICAgICAgIGRlbHRhU2NmQml0cyA9IEZES2FhY0VuY19jb3VudFNjZkJpdHNEaWZmKHNjZiwgc2NmVG1wLCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZmIsIHN0b3BTZmIpOwogICAgICAgICAgIGRlbHRhUGVOZXcgPSBkZWx0YVBlICsgKEZJWFBfREJMKWRlbHRhU2NmQml0czsKICAgICAgICAgICAvKiBuZXcgYml0IGRlbWFuZCBzbWFsbCBlbm91Z2ggPyAqLwogICAgICAgICAgIGlmIChkZWx0YVBlTmV3IDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7Ci0KICAgICAgICAgICAgIGJTdWNjZXNzID0gMTsKICAgICAgICAgICAgIGRpc3RPbGRTdW0gPSBkaXN0TmV3U3VtID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgICBmb3IgKHNmYiA9IHN0YXJ0U2ZiOyBzZmIgPCBzdG9wU2ZiOyBzZmIrKykgewogICAgICAgICAgICAgICBpZiAoc2NmVG1wW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKICAgICAgICAgICAgICAgICBGSVhQX0RCTCBzZmJFblE7CiAgICAgICAgICAgICAgICAgLyogY2FsYyB0aGUgZW5lcmd5IGFuZCBkaXN0b3J0aW9uIG9mIHRoZSBxdWFudGl6ZWQgc3BlY3RydW0gZm9yCiAgICAgICAgICAgICAgICAgICAgYSBzbWFsbGVyIHNjZiAqLwotICAgICAgICAgICAgICAgIEZES2FhY0VuY19jYWxjU2ZiUXVhbnRFbmVyZ3lBbmREaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3NmYk9mZnNbc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYytzZmJPZmZzW3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzW3NmYisxXS1zZmJPZmZzW3NmYl0sIHNjZk5ldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZmJFblEsICZzZmJEaXN0TmV3W3NmYl0pOworICAgICAgICAgICAgICAgIEZES2FhY0VuY19jYWxjU2ZiUXVhbnRFbmVyZ3lBbmREaXN0KAorICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bSArIHNmYk9mZnNbc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjICsgc2ZiT2Zmc1tzZmJdLCBzZmJPZmZzW3NmYiArIDFdIC0gc2ZiT2Zmc1tzZmJdLAorICAgICAgICAgICAgICAgICAgICBzY2ZOZXcsICZzZmJFblEsICZzZmJEaXN0TmV3W3NmYl0pOwogCiAgICAgICAgICAgICAgICAgZGlzdE9sZFN1bSArPSBDYWxjSW52TGREYXRhKHNmYkRpc3Rbc2ZiXSkgPj4gRElTVF9GQUNfU0hJRlQ7CiAgICAgICAgICAgICAgICAgZGlzdE5ld1N1bSArPSBDYWxjSW52TGREYXRhKHNmYkRpc3ROZXdbc2ZiXSkgPj4gRElTVF9GQUNfU0hJRlQ7CiAKICAgICAgICAgICAgICAgICAvKiAgMC4wMDI1OTQ4ODU1NjE2NyA9IGxkNjQoMS4xMjJmKSAqLwogICAgICAgICAgICAgICAgIC8qIC0wLjAwNzc4NzIyNjg2NjUyID0gbGQ2NCgwLjcwNzlmKSAqLwotICAgICAgICAgICAgICAgIGlmICgoc2ZiRGlzdE5ld1tzZmJdID4gKHNmYkRpc3Rbc2ZiXStGTDJGWENPTlNUX0RCTCgwLjAwMjU5NDg4NTU2MTY3ZikpKSB8fCAoc2ZiRW5RIDwgKHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhW3NmYl0gLSBGTDJGWENPTlNUX0RCTCgwLjAwNzc4NzIyNjg2NjUyZikpKSl7CisgICAgICAgICAgICAgICAgaWYgKChzZmJEaXN0TmV3W3NmYl0gPgorICAgICAgICAgICAgICAgICAgICAgKHNmYkRpc3Rbc2ZiXSArIEZMMkZYQ09OU1RfREJMKDAuMDAyNTk0ODg1NTYxNjdmKSkpIHx8CisgICAgICAgICAgICAgICAgICAgIChzZmJFblEgPCAocWNPdXRDaGFubmVsLT5zZmJFbmVyZ3lMZERhdGFbc2ZiXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wMDc3ODcyMjY4NjY1MmYpKSkpIHsKICAgICAgICAgICAgICAgICAgIGJTdWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwNDgsNyArMTAyOSw3IEBACiAgICAgICAgICAgICAvKiBkaXN0b3J0aW9uIHNtYWxsZXIgPyAtPiB1c2UgbmV3IHNjYWxlZmFjdG9ycyAqLwogICAgICAgICAgICAgaWYgKGRpc3ROZXdTdW0gPCBkaXN0T2xkU3VtICYmIGJTdWNjZXNzKSB7CiAgICAgICAgICAgICAgIGRlbHRhUGUgPSBkZWx0YVBlTmV3OwotICAgICAgICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNjZltzZmJdICE9IEZES19JTlRfTUlOKSB7CiAgICAgICAgICAgICAgICAgICBzY2Zbc2ZiXSA9IHNjZk5ldzsKICAgICAgICAgICAgICAgICAgIHNmYkRpc3Rbc2ZiXSA9IHNmYkRpc3ROZXdbc2ZiXTsKQEAgLTEwNjAsMjAgKzEwNDEsMTMgQEAKICAgICAgIH0KICAgICB9CiAgIH0gd2hpbGUgKHN0b3BTZmIgPD0gc2ZiQ250KTsKLQogfQogCi1zdGF0aWMgdm9pZAotRkRLYWFjRW5jX0ZES2FhY0VuY19Fc3RpbWF0ZVNjYWxlRmFjdG9yc0NoYW5uZWwoUUNfT1VUX0NIQU5ORUwgICAqcWNPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBzY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBnbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBzZmJGb3JtRmFjdG9yTGREYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLGNvbnN0IElOVCBpbnZRdWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqUkVTVFJJQ1QgcXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkWm9uZVF1YW50RW5hYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0VzdGltYXRlU2NhbGVGYWN0b3JzQ2hhbm5lbCgKKyAgICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFubmVsLCBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWwsCisgICAgSU5UICpSRVNUUklDVCBzY2YsIElOVCAqUkVTVFJJQ1QgZ2xvYmFsR2FpbiwKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2ZiRm9ybUZhY3RvckxkRGF0YSwgY29uc3QgSU5UIGludlF1YW50LAorICAgIFNIT1JUICpSRVNUUklDVCBxdWFudFNwZWMsIGNvbnN0IElOVCBkWm9uZVF1YW50RW5hYmxlKSB7CiAgIElOVCBpLCBqLCBzZmIsIHNmYk9mZnM7CiAgIElOVCBzY2ZJbnQ7CiAgIElOVCBtYXhTZjsKQEAgLTEwODQsNDYgKzEwNTgsNDUgQEAKICAgRklYUF9EQkwgdGhyZXNob2xkUGFydExkRGF0YTsKICAgRklYUF9EQkwgc2NmRnJhY3Q7CiAgIEZJWFBfREJMIG1heFNwZWM7Ci0gIEZJWFBfREJMIGFic1NwZWM7CiAgIElOVCBtaW5TY2ZDYWxjdWxhdGVkW01BWF9HUk9VUEVEX1NGQl07CiAgIEZJWFBfREJMIHNmYkRpc3RMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHF1YW50U3BlY1RtcCwgU0hPUlQsICgxMDI0KSk7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChxdWFudFNwZWNUbXAsIFNIT1JULCAoMTAyNCkpCiAgIElOVCBtaW5TZk1heFF1YW50W01BWF9HUk9VUEVEX1NGQl07CiAKLSAgRklYUF9EQkwgdGhyZXNoQ29uc3RMZERhdGE9RkwyRlhDT05TVF9EQkwoMC4wNDMwNDUxMTcyMmYpOyAvKiBsb2cxMCg2Ljc1KS9sb2cxMCgyLjApLzY0LjAgKi8KLSAgRklYUF9EQkwgY29udkNvbnN0PUZMMkZYQ09OU1RfREJMKDAuMzAxMDI5OTk1NjZmKTsgLyogbG9nMTAoMi4wKSAqLwotICBGSVhQX0RCTCBjMUNvbnN0PUZMMkZYQ09OU1RfREJMKC0wLjI3MDgzMTgzNTk0Zik7IC8qIEMxID0gLTY5LjMzMjk1ID0+IEMxLzJeOCAqLworICBGSVhQX0RCTCB0aHJlc2hDb25zdExkRGF0YSA9CisgICAgICBGTDJGWENPTlNUX0RCTCgwLjA0MzA0NTExNzIyZik7IC8qIGxvZzEwKDYuNzUpL2xvZzEwKDIuMCkvNjQuMCAqLworICBGSVhQX0RCTCBjb252Q29uc3QgPSBGTDJGWENPTlNUX0RCTCgwLjMwMTAyOTk5NTY2Zik7IC8qIGxvZzEwKDIuMCkgKi8KKyAgRklYUF9EQkwgYzFDb25zdCA9CisgICAgICBGTDJGWENPTlNUX0RCTCgtMC4yNzA4MzE4MzU5NGYpOyAvKiBDMSA9IC02OS4zMzI5NSA9PiBDMS8yXjggKi8KIAotCi0KLSAgaWYgKGludlF1YW50PjApIHsKLSAgICBGREttZW1jbGVhcihxdWFudFNwZWMsICgxMDI0KSpzaXplb2YoU0hPUlQpKTsKKyAgaWYgKGludlF1YW50ID4gMCkgeworICAgIEZES21lbWNsZWFyKHF1YW50U3BlYywgKDEwMjQpICogc2l6ZW9mKFNIT1JUKSk7CiAgIH0KIAogICAvKiBzY2ZzIHdpdGhvdXQgZW5lcmd5IG9yIHdpdGggdGhyZXNoPmVuZXJneSBhcmUgbWFya2VkIHdpdGggRkRLX0lOVF9NSU4gKi8KLSAgZm9yKGk9MDsgaTxwc3lPdXRDaGFubmVsLT5zZmJDbnQ7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgcHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBpKyspIHsKICAgICBzY2ZbaV0gPSBGREtfSU5UX01JTjsKICAgfQogCi0gIGZvciAoaT0wOyBpPE1BWF9HUk9VUEVEX1NGQjsgaSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfR1JPVVBFRF9TRkI7IGkrKykgewogICAgIG1pblNmTWF4UXVhbnRbaV0gPSBGREtfSU5UX01JTjsKICAgfQogCi0gIGZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHBzeU91dENoYW5uZWwtPnNmYkNudDsgc2ZiT2Zmcys9cHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKLSAgICBmb3Ioc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgZm9yIChzZmJPZmZzID0gMDsgc2ZiT2ZmcyA8IHBzeU91dENoYW5uZWwtPnNmYkNudDsKKyAgICAgICBzZmJPZmZzICs9IHBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgIHRocmVzaExkRGF0YSA9IHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYk9mZnMgKyBzZmJdOworICAgICAgZW5lcmd5TGREYXRhID0gcWNPdXRDaGFubmVsLT5zZmJFbmVyZ3lMZERhdGFbc2ZiT2ZmcyArIHNmYl07CiAKLSAgICAgIHRocmVzaExkRGF0YSA9IHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYk9mZnMrc2ZiXTsKLSAgICAgIGVuZXJneUxkRGF0YSA9IHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhW3NmYk9mZnMrc2ZiXTsKLQotICAgICAgc2ZiRGlzdExkRGF0YVtzZmJPZmZzK3NmYl0gPSBlbmVyZ3lMZERhdGE7Ci0KKyAgICAgIHNmYkRpc3RMZERhdGFbc2ZiT2ZmcyArIHNmYl0gPSBlbmVyZ3lMZERhdGE7CiAKICAgICAgIGlmIChlbmVyZ3lMZERhdGEgPiB0aHJlc2hMZERhdGEpIHsKICAgICAgICAgRklYUF9EQkwgdG1wOwogCiAgICAgICAgIC8qIGVuZXJneVBhcnQgPSAoZmxvYXQpbG9nMTAoc2ZiRm9ybUZhY3RvcltzZmJPZmZzK3NmYl0pOyAqLwogICAgICAgICAvKiAwLjA5Mzc1ZiA9IGxvZyg2NC4wKS9sb2coMi4wKS82NC4wID0gc2NhbGUgb2Ygc2ZiRm9ybUZhY3RvckxkRGF0YSAqLwotICAgICAgICBlbmVyZ3lQYXJ0TGREYXRhID0gc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJPZmZzK3NmYl0gKyBGTDJGWENPTlNUX0RCTCgwLjA5Mzc1Zik7CisgICAgICAgIGVuZXJneVBhcnRMZERhdGEgPQorICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJPZmZzICsgc2ZiXSArIEZMMkZYQ09OU1RfREJMKDAuMDkzNzVmKTsKIAogICAgICAgICAvKiBpbmZsdWVuY2Ugb2YgYWxsb3dlZCBkaXN0b3J0aW9uICovCiAgICAgICAgIC8qIHRocmVzaG9sZFBhcnQgPSAoZmxvYXQpbG9nMTAoNi43NSp0aHJlc2grRkxUX01JTik7ICovCkBAIC0xMTMzLDE2NSArMTEwNiwxNjYgQEAKICAgICAgICAgLyogc2NmRmxvYXQgPSA4Ljg1ODVmICogKHRocmVzaG9sZFBhcnQgLSBlbmVyZ3lQYXJ0KTsgKi8KICAgICAgICAgc2NmRnJhY3QgPSB0aHJlc2hvbGRQYXJ0TGREYXRhIC0gZW5lcmd5UGFydExkRGF0YTsKICAgICAgICAgLyogY29udmVyc2lvbiBmcm9tIGxvZzIgdG8gbG9nMTAgKi8KLSAgICAgICAgc2NmRnJhY3QgPSBmTXVsdChjb252Q29uc3Qsc2NmRnJhY3QpOworICAgICAgICBzY2ZGcmFjdCA9IGZNdWx0KGNvbnZDb25zdCwgc2NmRnJhY3QpOwogICAgICAgICAvKiAoOC44NTg1ZiAqIHNjZkZyYWN0KS84ID0gOC84ICogc2NmRnJhY3QgKyAwLjg1ODUgKiBzY2ZGcmFjdC84ICovCi0gICAgICAgIHNjZkZyYWN0ID0gc2NmRnJhY3QgKyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjg1ODVmKSxzY2ZGcmFjdCA+PiAzKTsKKyAgICAgICAgc2NmRnJhY3QgPSBzY2ZGcmFjdCArIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuODU4NWYpLCBzY2ZGcmFjdCA+PiAzKTsKIAogICAgICAgICAvKiBpbnRlZ2VyIHNjYWxlZmFjdG9yICovCiAgICAgICAgIC8qIHNjZkludCA9IChpbnQpZmxvb3Ioc2NmRmxvYXQpOyAqLwotICAgICAgICBzY2ZJbnQgPSAoSU5UKShzY2ZGcmFjdD4+KChERlJBQ1RfQklUUy0xKS0zLUxEX0RBVEFfU0hJRlQpKTsgLyogMyBiaXRzID0+IHNjZkZyYWN0LzguMDsgNiBiaXRzID0+IGxkNjQgKi8KKyAgICAgICAgc2NmSW50ID0KKyAgICAgICAgICAgIChJTlQpKHNjZkZyYWN0ID4+CisgICAgICAgICAgICAgICAgICAoKERGUkFDVF9CSVRTIC0gMSkgLSAzIC0KKyAgICAgICAgICAgICAgICAgICBMRF9EQVRBX1NISUZUKSk7IC8qIDMgYml0cyA9PiBzY2ZGcmFjdC84LjA7IDYgYml0cyA9PiBsZDY0ICovCiAKICAgICAgICAgLyogbWF4aW11bSBvZiBzcGVjdHJ1bSAqLwogICAgICAgICBtYXhTcGVjID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgICAgICAgZm9yKGo9cHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYl07IGo8cHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYisxXTsgaisrICl7Ci0gICAgICAgICAgYWJzU3BlYyA9IGZpeHBfYWJzKHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtW2pdKTsKLSAgICAgICAgICBtYXhTcGVjID0gKGFic1NwZWMgPiBtYXhTcGVjKSA/IGFic1NwZWMgOiBtYXhTcGVjOworICAgICAgICAvKiBVbnJvbGwgYnkgNCwgYWxsb3cgZHVhbCBtZW1vcnkgYWNjZXNzICovCisgICAgICAgIERXT1JEX0FMSUdORUQocWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW0pOworICAgICAgICBmb3IgKGogPSBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMgKyBzZmJdOworICAgICAgICAgICAgIGogPCBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMgKyBzZmIgKyAxXTsgaiArPSA0KSB7CisgICAgICAgICAgbWF4U3BlYyA9IGZNYXgobWF4U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmTWF4KGZNYXgoZkFicyhxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bVtqICsgMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQWJzKHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtW2ogKyAxXSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk1heChmQWJzKHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtW2ogKyAyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZBYnMocWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW1baiArIDNdKSkpKTsKICAgICAgICAgfQotCiAgICAgICAgIC8qIGxvd2VyIHNjZiBsaW1pdCB0byBhdm9pZCBxdWFudGl6ZWQgdmFsdWVzIGJpZ2dlciB0aGFuIE1BWF9RVUFOVCAqLwogICAgICAgICAvKiBDMSA9IC02OS4zMzI5NWYsIEMyID0gNS43NzA3OGYgPSA0L2xvZygyKSAqLwogICAgICAgICAvKiBtaW5TZk1heFF1YW50W3NmYk9mZnMrc2ZiXSA9IChpbnQpY2VpbChDMSArIEMyKmxvZyhtYXhTcGVjKSk7ICovCi0gICAgICAgIC8qIEMxLzJeOCArIDQvbG9nKDIuMCkqbG9nKG1heFNwZWMpLzJeOCAgPT4gQzEvMl44ICsgbG9nKG1heFNwZWMpL2xvZygyLjApKjQvMl44ID0+IEMxLzJeOCArIGxvZyhtYXhTcGVjKS9sb2coMi4wKS82NC4wICovCisgICAgICAgIC8qIEMxLzJeOCArIDQvbG9nKDIuMCkqbG9nKG1heFNwZWMpLzJeOCAgPT4gQzEvMl44ICsKKyAgICAgICAgICogbG9nKG1heFNwZWMpL2xvZygyLjApKjQvMl44ID0+IEMxLzJeOCArIGxvZyhtYXhTcGVjKS9sb2coMi4wKS82NC4wICovCiAKLSAgICAgICAgLy9taW5TZk1heFF1YW50W3NmYk9mZnMrc2ZiXSA9ICgoSU5UKSAoKGMxQ29uc3QgKyBDYWxjTGREYXRhKG1heFNwZWMpKSA+PiAoKERGUkFDVF9CSVRTLTEpLTgpKSkgKyAxOworICAgICAgICAvLyBtaW5TZk1heFF1YW50W3NmYk9mZnMrc2ZiXSA9ICgoSU5UKSAoKGMxQ29uc3QgKyBDYWxjTGREYXRhKG1heFNwZWMpKQorICAgICAgICAvLyA+PiAoKERGUkFDVF9CSVRTLTEpLTgpKSkgKyAxOwogICAgICAgICB0bXAgPSBDYWxjTGREYXRhKG1heFNwZWMpOwotICAgICAgICBpZiAoYzFDb25zdD5GTDJGWENPTlNUX0RCTCgtMS5mKS10bXApIHsKLSAgICAgICAgICBtaW5TZk1heFF1YW50W3NmYk9mZnMrc2ZiXSA9ICgoSU5UKSAoKGMxQ29uc3QgKyB0bXApID4+ICgoREZSQUNUX0JJVFMtMSktOCkpKSArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgbWluU2ZNYXhRdWFudFtzZmJPZmZzK3NmYl0gPSAoKElOVCkgKEZMMkZYQ09OU1RfREJMKC0xLmYpID4+ICgoREZSQUNUX0JJVFMtMSktOCkpKSArIDE7CisgICAgICAgIGlmIChjMUNvbnN0ID4gRkwyRlhDT05TVF9EQkwoLTEuZikgLSB0bXApIHsKKyAgICAgICAgICBtaW5TZk1heFF1YW50W3NmYk9mZnMgKyBzZmJdID0KKyAgICAgICAgICAgICAgKChJTlQpKChjMUNvbnN0ICsgdG1wKSA+PiAoKERGUkFDVF9CSVRTIC0gMSkgLSA4KSkpICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtaW5TZk1heFF1YW50W3NmYk9mZnMgKyBzZmJdID0KKyAgICAgICAgICAgICAgKChJTlQpKEZMMkZYQ09OU1RfREJMKC0xLmYpID4+ICgoREZSQUNUX0JJVFMgLSAxKSAtIDgpKSkgKyAxOwogICAgICAgICB9CiAKLSAgICAgICAgc2NmSW50ID0gZml4TWF4KHNjZkludCwgbWluU2ZNYXhRdWFudFtzZmJPZmZzK3NmYl0pOwotCisgICAgICAgIHNjZkludCA9IGZpeE1heChzY2ZJbnQsIG1pblNmTWF4UXVhbnRbc2ZiT2ZmcyArIHNmYl0pOwogCiAgICAgICAgIC8qIGZpbmQgYmV0dGVyIHNjYWxlZmFjdG9yIHdpdGggYW5hbHlzaXMgYnkgc3ludGhlc2lzICovCi0gICAgICAgIGlmIChpbnZRdWFudD4wKSB7Ci0gICAgICAgICAgc2NmSW50ID0gRkRLYWFjRW5jX2ltcHJvdmVTY2YocWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW0rcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWMrcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXArcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiKzFdLXBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoTGREYXRhLCBzY2ZJbnQsIG1pblNmTWF4UXVhbnRbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNmYkRpc3RMZERhdGFbc2ZiT2ZmcytzZmJdLCAmbWluU2NmQ2FsY3VsYXRlZFtzZmJPZmZzK3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBpZiAoaW52UXVhbnQgPiAwKSB7CisgICAgICAgICAgc2NmSW50ID0gRkRLYWFjRW5jX2ltcHJvdmVTY2YoCisgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtICsKKyAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYl0sCisgICAgICAgICAgICAgIHF1YW50U3BlYyArIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYl0sCisgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCArIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYl0sCisgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYiArIDFdIC0KKyAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYl0sCisgICAgICAgICAgICAgIHRocmVzaExkRGF0YSwgc2NmSW50LCBtaW5TZk1heFF1YW50W3NmYk9mZnMgKyBzZmJdLAorICAgICAgICAgICAgICAmc2ZiRGlzdExkRGF0YVtzZmJPZmZzICsgc2ZiXSwgJm1pblNjZkNhbGN1bGF0ZWRbc2ZiT2ZmcyArIHNmYl0sCisgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUpOwogICAgICAgICB9Ci0gICAgICAgIHNjZltzZmJPZmZzK3NmYl0gPSBzY2ZJbnQ7CisgICAgICAgIHNjZltzZmJPZmZzICsgc2ZiXSA9IHNjZkludDsKICAgICAgIH0KICAgICB9CiAgIH0KIAotCi0gIGlmIChpbnZRdWFudD4xKSB7CisgIGlmIChpbnZRdWFudCA+IDApIHsKICAgICAvKiB0cnkgdG8gZGVjcmVhc2Ugc2NmIGRpZmZlcmVuY2VzICovCiAgICAgRklYUF9EQkwgc2ZiQ29uc3RQZVBhcnRbTUFYX0dST1VQRURfU0ZCXTsKICAgICBGSVhQX0RCTCBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfR1JPVVBFRF9TRkJdOwogCi0gICAgZm9yIChpPTA7IGk8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBpKyspCisgICAgZm9yIChpID0gMDsgaSA8IHBzeU91dENoYW5uZWwtPnNmYkNudDsgaSsrKQogICAgICAgc2ZiQ29uc3RQZVBhcnRbaV0gPSAoRklYUF9EQkwpRkRLX0lOVF9NSU47CiAKLSAgICBGREthYWNFbmNfY2FsY1NmYlJlbGV2YW50TGluZXMoIHNmYkZvcm1GYWN0b3JMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbC0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk5SZWxldmFudExpbmVzKTsKKyAgICBGREthYWNFbmNfY2FsY1NmYlJlbGV2YW50TGluZXMoCisgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhLAorICAgICAgICBxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YSwgcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0cywKKyAgICAgICAgcHN5T3V0Q2hhbm5lbC0+c2ZiQ250LCBwc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCwKKyAgICAgICAgcHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXAsIHNmYk5SZWxldmFudExpbmVzKTsKIAorICAgIEZES2FhY0VuY19hc3NpbWlsYXRlU2luZ2xlU2NmKAorICAgICAgICBwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHF1YW50U3BlYywgcXVhbnRTcGVjVG1wLCBkWm9uZVF1YW50RW5hYmxlLAorICAgICAgICBzY2YsIG1pblNmTWF4UXVhbnQsIHNmYkRpc3RMZERhdGEsIHNmYkNvbnN0UGVQYXJ0LCBzZmJGb3JtRmFjdG9yTGREYXRhLAorICAgICAgICBzZmJOUmVsZXZhbnRMaW5lcywgbWluU2NmQ2FsY3VsYXRlZCwgMSk7CiAKLSAgICBGREthYWNFbmNfYXNzaW1pbGF0ZVNpbmdsZVNjZihwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHF1YW50U3BlYywgcXVhbnRTcGVjVG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pblNmTWF4UXVhbnQsIHNmYkRpc3RMZERhdGEsIHNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YSwgc2ZiTlJlbGV2YW50TGluZXMsIG1pblNjZkNhbGN1bGF0ZWQsIDEpOworICAgIGlmIChpbnZRdWFudCA+IDEpIHsKKyAgICAgIEZES2FhY0VuY19hc3NpbWlsYXRlTXVsdGlwbGVTY2YoCisgICAgICAgICAgcHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBxdWFudFNwZWMsIHF1YW50U3BlY1RtcCwKKyAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlLCBzY2YsIG1pblNmTWF4UXVhbnQsIHNmYkRpc3RMZERhdGEsIHNmYkNvbnN0UGVQYXJ0LAorICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzKTsKIAotICAgIGlmKGludlF1YW50ID4gMSkgewotICAgICAgRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZihwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHF1YW50U3BlYywgcXVhbnRTcGVjVG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pblNmTWF4UXVhbnQsIHNmYkRpc3RMZERhdGEsIHNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YSwgc2ZiTlJlbGV2YW50TGluZXMpOwotCi0gICAgICBGREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmKHBzeU91dENoYW5uZWwsIHFjT3V0Q2hhbm5lbCwgcXVhbnRTcGVjLCBxdWFudFNwZWNUbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgbWluU2ZNYXhRdWFudCwgc2ZiRGlzdExkRGF0YSwgc2ZiQ29uc3RQZVBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhLCBzZmJOUmVsZXZhbnRMaW5lcyk7Ci0KLQotICAgICAgRkRLYWFjRW5jX0ZES2FhY0VuY19hc3NpbWlsYXRlTXVsdGlwbGVTY2YyKHBzeU91dENoYW5uZWwsIHFjT3V0Q2hhbm5lbCwgcXVhbnRTcGVjLCBxdWFudFNwZWNUbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgbWluU2ZNYXhRdWFudCwgc2ZiRGlzdExkRGF0YSwgc2ZiQ29uc3RQZVBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhLCBzZmJOUmVsZXZhbnRMaW5lcyk7CisgICAgICBGREthYWNFbmNfRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZjIoCisgICAgICAgICAgcHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBxdWFudFNwZWMsIHF1YW50U3BlY1RtcCwKKyAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlLCBzY2YsIG1pblNmTWF4UXVhbnQsIHNmYkRpc3RMZERhdGEsIHNmYkNvbnN0UGVQYXJ0LAorICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzKTsKICAgICB9CiAgIH0KIAotCiAgIC8qIGdldCBtaW4gc2NhbGVmYWMgKi8KICAgbWluU2YgPSBGREtfSU5UX01BWDsKLSAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgeworICBmb3IgKHNmYk9mZnMgPSAwOyBzZmJPZmZzIDwgcHN5T3V0Q2hhbm5lbC0+c2ZiQ250OworICAgICAgIHNmYk9mZnMgKz0gcHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgaWYgKHNjZltzZmJPZmZzK3NmYl0hPUZES19JTlRfTUlOKQotICAgICAgICBtaW5TZiA9IGZpeE1pbihtaW5TZixzY2Zbc2ZiT2ZmcytzZmJdKTsKKyAgICAgIGlmIChzY2Zbc2ZiT2ZmcyArIHNmYl0gIT0gRkRLX0lOVF9NSU4pCisgICAgICAgIG1pblNmID0gZml4TWluKG1pblNmLCBzY2Zbc2ZiT2ZmcyArIHNmYl0pOwogICAgIH0KICAgfQogCiAgIC8qIGxpbWl0IHNjZiBkZWx0YSAqLwotICBmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFubmVsLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7CisgIGZvciAoc2ZiT2ZmcyA9IDA7IHNmYk9mZnMgPCBwc3lPdXRDaGFubmVsLT5zZmJDbnQ7CisgICAgICAgc2ZiT2ZmcyArPSBwc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgewogICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICBpZiAoKHNjZltzZmJPZmZzK3NmYl0gIT0gRkRLX0lOVF9NSU4pICYmIChtaW5TZitNQVhfU0NGX0RFTFRBKSA8IHNjZltzZmJPZmZzK3NmYl0pIHsKLSAgICAgICAgc2NmW3NmYk9mZnMrc2ZiXSA9IG1pblNmICsgTUFYX1NDRl9ERUxUQTsKKyAgICAgIGlmICgoc2NmW3NmYk9mZnMgKyBzZmJdICE9IEZES19JTlRfTUlOKSAmJgorICAgICAgICAgIChtaW5TZiArIE1BWF9TQ0ZfREVMVEEpIDwgc2NmW3NmYk9mZnMgKyBzZmJdKSB7CisgICAgICAgIHNjZltzZmJPZmZzICsgc2ZiXSA9IG1pblNmICsgTUFYX1NDRl9ERUxUQTsKICAgICAgICAgaWYgKGludlF1YW50ID4gMCkgeyAvKiBjaGFuZ2VkIGJhbmRzIG5lZWQgdG8gYmUgcXVhbnRpemVkIGFnYWluICovCi0gICAgICAgICAgc2ZiRGlzdExkRGF0YVtzZmJPZmZzK3NmYl0gPQotICAgICAgICAgICAgICAgRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3BzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYytwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiKzFdLXBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZltzZmJPZmZzK3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgc2ZiRGlzdExkRGF0YVtzZmJPZmZzICsgc2ZiXSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdCgKKyAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW0gKworICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzICsgc2ZiXSwKKyAgICAgICAgICAgICAgcXVhbnRTcGVjICsgcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzICsgc2ZiXSwKKyAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzICsgc2ZiICsgMV0gLQorICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzICsgc2ZiXSwKKyAgICAgICAgICAgICAgc2NmW3NmYk9mZnMgKyBzZmJdLCBkWm9uZVF1YW50RW5hYmxlKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCi0KICAgLyogZ2V0IG1heCBzY2FsZWZhYyBmb3IgZ2xvYmFsIGdhaW4gKi8KICAgbWF4U2YgPSBGREtfSU5UX01JTjsKLSAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgeworICBmb3IgKHNmYk9mZnMgPSAwOyBzZmJPZmZzIDwgcHN5T3V0Q2hhbm5lbC0+c2ZiQ250OworICAgICAgIHNmYk9mZnMgKz0gcHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgbWF4U2YgPSBmaXhNYXgobWF4U2Ysc2NmW3NmYk9mZnMrc2ZiXSk7CisgICAgICBtYXhTZiA9IGZpeE1heChtYXhTZiwgc2NmW3NmYk9mZnMgKyBzZmJdKTsKICAgICB9CiAgIH0KIAogICAvKiBjYWxjIGxvb3Agc2NhbGVmYWN0b3JzLCBpZiBzcGVjIGlzIG5vdCBhbGwgemVybyAoaS5lLiBtYXhTZiA9PSAtOTkpICovCi0gIGlmKCBtYXhTZiA+IEZES19JTlRfTUlOICkgeworICBpZiAobWF4U2YgPiBGREtfSU5UX01JTikgewogICAgICpnbG9iYWxHYWluID0gbWF4U2Y7Ci0gICAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgeworICAgIGZvciAoc2ZiT2ZmcyA9IDA7IHNmYk9mZnMgPCBwc3lPdXRDaGFubmVsLT5zZmJDbnQ7CisgICAgICAgICBzZmJPZmZzICs9IHBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7CiAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICBpZiggc2NmW3NmYk9mZnMrc2ZiXSA9PSBGREtfSU5UX01JTiApIHsKLSAgICAgICAgICBzY2Zbc2ZiT2ZmcytzZmJdID0gMDsKKyAgICAgICAgaWYgKHNjZltzZmJPZmZzICsgc2ZiXSA9PSBGREtfSU5UX01JTikgeworICAgICAgICAgIHNjZltzZmJPZmZzICsgc2ZiXSA9IDA7CiAgICAgICAgICAgLyogc2V0IGJhbmQgZXhwbGljaXRlbHkgdG8gemVybyAqLwotICAgICAgICAgIGZvcihqPXBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdOyBqPHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmIrMV07IGorKyApIHsKKyAgICAgICAgICBmb3IgKGogPSBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMgKyBzZmJdOworICAgICAgICAgICAgICAgaiA8IHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYiArIDFdOyBqKyspIHsKICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtW2pdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHNjZltzZmJPZmZzK3NmYl0gPSBtYXhTZiAtIHNjZltzZmJPZmZzK3NmYl07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2NmW3NmYk9mZnMgKyBzZmJdID0gbWF4U2YgLSBzY2Zbc2ZiT2ZmcyArIHNmYl07CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gIH0KLSAgZWxzZXsKKyAgfSBlbHNlIHsKICAgICAqZ2xvYmFsR2FpbiA9IDA7CiAgICAgLyogc2V0IHNwZWN0cnVtIGV4cGxpY2l0ZWx5IHRvIHplcm8gKi8KLSAgICBmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFubmVsLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7CisgICAgZm9yIChzZmJPZmZzID0gMDsgc2ZiT2ZmcyA8IHBzeU91dENoYW5uZWwtPnNmYkNudDsKKyAgICAgICAgIHNmYk9mZnMgKz0gcHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgIHNjZltzZmJPZmZzK3NmYl0gPSAwOworICAgICAgICBzY2Zbc2ZiT2ZmcyArIHNmYl0gPSAwOwogICAgICAgICAvKiBzZXQgYmFuZCBleHBsaWNpdGVseSB0byB6ZXJvICovCi0gICAgICAgIGZvcihqPXBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdOyBqPHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmIrMV07IGorKyApIHsKKyAgICAgICAgZm9yIChqID0gcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzICsgc2ZiXTsKKyAgICAgICAgICAgICBqIDwgcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzICsgc2ZiICsgMV07IGorKykgewogICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtW2pdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTEyOTksMzIgKzEyNzMsMjAgQEAKICAgfQogCiAgIC8qIGZyZWUgcXVhbnRTcGVjVG1wIGZyb20gc2NyYXRjaCAqLwotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHF1YW50U3BlY1RtcCwgU0hPUlQsICgxMDI0KSk7Ci0KLQorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHF1YW50U3BlY1RtcCwgU0hPUlQsICgxMDI0KSkKIH0KIAotdm9pZAotRkRLYWFjRW5jX0VzdGltYXRlU2NhbGVGYWN0b3JzKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFtdLAotICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbFtdLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGludlF1YW50LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRab25lUXVhbnRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkNoYW5uZWxzKQotewordm9pZCBGREthYWNFbmNfRXN0aW1hdGVTY2FsZUZhY3RvcnMoUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFubmVsW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaW52UXVhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZFpvbmVRdWFudEVuYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMpIHsKICAgaW50IGNoOwogCi0gIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKLSAgewotICAgICAgRkRLYWFjRW5jX0ZES2FhY0VuY19Fc3RpbWF0ZVNjYWxlRmFjdG9yc0NoYW5uZWwocWNPdXRDaGFubmVsW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0Q2hhbm5lbFtjaF0tPmdsb2JhbEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRm9ybUZhY3RvckxkRGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxpbnZRdWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5xdWFudFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIEZES2FhY0VuY19Fc3RpbWF0ZVNjYWxlRmFjdG9yc0NoYW5uZWwoCisgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0sIHBzeU91dENoYW5uZWxbY2hdLCBxY091dENoYW5uZWxbY2hdLT5zY2YsCisgICAgICAgICZxY091dENoYW5uZWxbY2hdLT5nbG9iYWxHYWluLCBxY091dENoYW5uZWxbY2hdLT5zZmJGb3JtRmFjdG9yTGREYXRhLAorICAgICAgICBpbnZRdWFudCwgcWNPdXRDaGFubmVsW2NoXS0+cXVhbnRTcGVjLCBkWm9uZVF1YW50RW5hYmxlKTsKICAgfQotCiB9Ci0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvc2ZfZXN0aW0uaCBiL2xpYkFBQ2VuYy9zcmMvc2ZfZXN0aW0uaAppbmRleCBlZjhkMzY2Li5hYjJkM2MyIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3NmX2VzdGltLmgKKysrIGIvbGliQUFDZW5jL3NyYy9zZl9lc3RpbS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQwICs5MCwzNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbgorICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogU2NhbGUgZmFjdG9yIGVzdGltYXRpb24KIAotI2lmbmRlZiBfU0ZfRVNUSU1fSAotI2RlZmluZSBfU0ZfRVNUSU1fSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTRl9FU1RJTV9ICisjZGVmaW5lIFNGX0VTVElNX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAotCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAjaW5jbHVkZSAicWNfZGF0YS5oIgogI2luY2x1ZGUgImludGVyZmFjZS5oIgogCi0jZGVmaW5lIEZPUk1fRkFDX1NISUZUICA2CisjZGVmaW5lIEZPUk1fRkFDX1NISUZUIDYKIAordm9pZCBGREthYWNFbmNfQ2FsY0Zvcm1GYWN0b3IoUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKTsKIAotdm9pZAotRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yKFFDX09VVF9DSEFOTkVMICAgKnFjT3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAqcHN5T3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuQ2hhbm5lbHMpOwotCi12b2lkCi1GREthYWNFbmNfRXN0aW1hdGVTY2FsZUZhY3RvcnMoUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsW10sCi0gICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsW10sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW52UXVhbnQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZFpvbmVRdWFudEVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuQ2hhbm5lbHMpOwotCi0KK3ZvaWQgRkRLYWFjRW5jX0VzdGltYXRlU2NhbGVGYWN0b3JzKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGludlF1YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRab25lUXVhbnRFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3NwcmVhZGluZy5jcHAgYi9saWJBQUNlbmMvc3JjL3NwcmVhZGluZy5jcHAKaW5kZXggODUyZGExZS4uMGZiNDNiYiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9zcHJlYWRpbmcuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvc3ByZWFkaW5nLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzNiArOTAsMzYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBTcHJlYWRpbmcgb2YgZW5lcmd5CisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFNwcmVhZGluZyBvZiBlbmVyZ3kKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInNwcmVhZGluZy5oIgogCi12b2lkIEZES2FhY0VuY19TcHJlYWRpbmdNYXgoY29uc3QgSU5UICAgICAgIHBiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAqUkVTVFJJQ1QgbWFza0xvd0ZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgKlJFU1RSSUNUIG1hc2tIaWdoRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAqUkVTVFJJQ1QgcGJTcHJlYWRFbmVyZ3kpCi17Ci0gICBpbnQgaTsKLSAgIEZJWFBfREJMIGRlbGF5Owordm9pZCBGREthYWNFbmNfU3ByZWFkaW5nTWF4KGNvbnN0IElOVCBwYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgbWFza0xvd0ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgbWFza0hpZ2hGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBiU3ByZWFkRW5lcmd5KSB7CisgIGludCBpOworICBGSVhQX0RCTCBkZWxheTsKIAotICAgLyogc2xvcGUgdG8gaGlnaGVyIGZyZXF1ZW5jaWVzICovCi0gICBkZWxheSA9IHBiU3ByZWFkRW5lcmd5WzBdOwotICAgZm9yIChpPTE7IGk8cGJDbnQ7IGkrKykgewotICAgICAgZGVsYXkgPSBmaXhNYXgocGJTcHJlYWRFbmVyZ3lbaV0sIGZNdWx0KG1hc2tIaWdoRmFjdG9yW2ldLCBkZWxheSkpOwotICAgICAgcGJTcHJlYWRFbmVyZ3lbaV0gPSBkZWxheTsKLSAgIH0KKyAgLyogc2xvcGUgdG8gaGlnaGVyIGZyZXF1ZW5jaWVzICovCisgIGRlbGF5ID0gcGJTcHJlYWRFbmVyZ3lbMF07CisgIGZvciAoaSA9IDE7IGkgPCBwYkNudDsgaSsrKSB7CisgICAgZGVsYXkgPSBmaXhNYXgocGJTcHJlYWRFbmVyZ3lbaV0sIGZNdWx0KG1hc2tIaWdoRmFjdG9yW2ldLCBkZWxheSkpOworICAgIHBiU3ByZWFkRW5lcmd5W2ldID0gZGVsYXk7CisgIH0KIAotICAgLyogc2xvcGUgdG8gbG93ZXIgZnJlcXVlbmNpZXMgKi8KLSAgIGRlbGF5ID0gcGJTcHJlYWRFbmVyZ3lbcGJDbnQtMV07Ci0gICBmb3IgKGk9cGJDbnQtMjsgaT49MDsgaS0tKSB7Ci0gICAgICBkZWxheSA9IGZpeE1heChwYlNwcmVhZEVuZXJneVtpXSwgZk11bHQobWFza0xvd0ZhY3RvcltpXSxkZWxheSkpOwotICAgICAgcGJTcHJlYWRFbmVyZ3lbaV0gPSBkZWxheTsKLSAgIH0KKyAgLyogc2xvcGUgdG8gbG93ZXIgZnJlcXVlbmNpZXMgKi8KKyAgZGVsYXkgPSBwYlNwcmVhZEVuZXJneVtwYkNudCAtIDFdOworICBmb3IgKGkgPSBwYkNudCAtIDI7IGkgPj0gMDsgaS0tKSB7CisgICAgZGVsYXkgPSBmaXhNYXgocGJTcHJlYWRFbmVyZ3lbaV0sIGZNdWx0KG1hc2tMb3dGYWN0b3JbaV0sIGRlbGF5KSk7CisgICAgcGJTcHJlYWRFbmVyZ3lbaV0gPSBkZWxheTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9zcHJlYWRpbmcuaCBiL2xpYkFBQ2VuYy9zcmMvc3ByZWFkaW5nLmgKaW5kZXggZTFiNTA2Yy4uZTY5MzAzMSAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9zcHJlYWRpbmcuaAorKysgYi9saWJBQUNlbmMvc3JjL3NwcmVhZGluZy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI0ICs5MCwyNCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFNwcmVhZGluZyBvZiBlbmVyZ3kgYW5kIHdlaWdodGVkIHRvbmFsaXR5CisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFNwcmVhZGluZyBvZiBlbmVyZ3kgYW5kIHdlaWdodGVkIHRvbmFsaXR5CiAKLSNpZm5kZWYgX1NQUkVBRElOR19ICi0jZGVmaW5lIF9TUFJFQURJTkdfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTUFJFQURJTkdfSAorI2RlZmluZSBTUFJFQURJTkdfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCit2b2lkIEZES2FhY0VuY19TcHJlYWRpbmdNYXgoY29uc3QgSU5UIHBiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBtYXNrTG93RmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBtYXNrSGlnaEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcGJTcHJlYWRFbmVyZ3kpOwogCi12b2lkIEZES2FhY0VuY19TcHJlYWRpbmdNYXgoY29uc3QgSU5UICAgICAgICAgcGJDbnQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqUkVTVFJJQ1QgbWFza0xvd0ZhY3RvciwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICpSRVNUUklDVCBtYXNrSGlnaEZhY3RvciwKLSAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgICpSRVNUUklDVCBwYlNwcmVhZEVuZXJneSk7Ci0KLSNlbmRpZiAvKiAjaWZuZGVmIF9TUFJFQURJTkdfSCAqLworI2VuZGlmIC8qICNpZm5kZWYgU1BSRUFESU5HX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvdG5zX2Z1bmMuaCBiL2xpYkFBQ2VuYy9zcmMvdG5zX2Z1bmMuaAppbmRleCA1ZTUyNjVkLi42MDk5YmM3IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3Ruc19mdW5jLmgKKysrIGIvbGliQUFDZW5jL3NyYy90bnNfZnVuYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDY3ICs5MCw0MCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBbGV4IEdvZXNjaGVsCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogVGVtcG9yYWwgbm9pc2Ugc2hhcGluZworICAgQXV0aG9yKHMpOiAgIEFsZXggR29lc2NoZWwKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFRlbXBvcmFsIG5vaXNlIHNoYXBpbmcKIAotI2lmbmRlZiBfVE5TX0ZVTkNfSAotI2RlZmluZSBfVE5TX0ZVTkNfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUTlNfRlVOQ19ICisjZGVmaW5lIFROU19GVU5DX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0VG5zQ29uZmlndXJhdGlvbihJTlQgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJsb2NrdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaXNMb3dEZWxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGRTYnJQcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRuc0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTiAqcHN5Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHVzZVRuc1BlYWsgKTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0VG5zQ29uZmlndXJhdGlvbigKKyAgICBJTlQgYml0cmF0ZSwgSU5UIHNhbXBsZXJhdGUsIElOVCBjaGFubmVscywgSU5UIGJsb2NrdHlwZSwgSU5UIGdyYW51bGVMZW5ndGgsCisgICAgSU5UIGlzTG93RGVsYXksIElOVCBsZFNiclByZXNlbnQsIFROU19DT05GSUcgKnRuc0NvbmZpZywKKyAgICBQU1lfQ09ORklHVVJBVElPTiAqcHN5Q29uZmlnLCBJTlQgYWN0aXZlLCBJTlQgdXNlVG5zUGVhayk7CiAKLUlOVCBGREthYWNFbmNfVG5zRGV0ZWN0KAotICAgICAgICAgICAgICBUTlNfREFUQSAqdG5zRGF0YSwKLSAgICAgICAgICAgICAgY29uc3QgVE5TX0NPTkZJRyAqdEMsCi0gICAgICAgICAgICAgIFROU19JTkZPKiB0bnNJbmZvLAotICAgICAgICAgICAgICBJTlQgc2ZiQ250LAotICAgICAgICAgICAgICBGSVhQX0RCTCAqc3BlY3RydW0sCi0gICAgICAgICAgICAgIElOVCBzdWJCbG9ja051bWJlciwKLSAgICAgICAgICAgICAgSU5UIGJsb2NrVHlwZQotICAgICAgICAgICAgICApOworSU5UIEZES2FhY0VuY19UbnNEZXRlY3QoVE5TX0RBVEEgKnRuc0RhdGEsIGNvbnN0IFROU19DT05GSUcgKnRDLAorICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0lORk8gKnRuc0luZm8sIElOVCBzZmJDbnQsIGNvbnN0IEZJWFBfREJMICpzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdWJCbG9ja051bWJlciwgSU5UIGJsb2NrVHlwZSk7CiAKK3ZvaWQgRkRLYWFjRW5jX1Ruc1N5bmMoVE5TX0RBVEEgKnRuc0RhdGFEZXN0LCBjb25zdCBUTlNfREFUQSAqdG5zRGF0YVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgVE5TX0lORk8gKnRuc0luZm9EZXN0LCBUTlNfSU5GTyAqdG5zSW5mb1NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZURlc3QsIGNvbnN0IElOVCBibG9ja1R5cGVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgKnRDKTsKIAorSU5UIEZES2FhY0VuY19UbnNFbmNvZGUoVE5TX0lORk8gKnRuc0luZm8sIFROU19EQVRBICp0bnNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bU9mU2ZiLCBjb25zdCBUTlNfQ09ORklHICp0QywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBsb3dQYXNzTGluZSwgRklYUF9EQkwgKnNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN1YkJsb2NrTnVtYmVyLCBjb25zdCBJTlQgYmxvY2tUeXBlKTsKIAotdm9pZCBGREthYWNFbmNfVG5zU3luYygKLSAgICAgICAgICAgICBUTlNfREFUQSAqdG5zRGF0YURlc3QsCi0gICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGFTcmMsCi0gICAgICAgICAgICAgVE5TX0lORk8gKnRuc0luZm9EZXN0LAotICAgICAgICAgICAgIFROU19JTkZPICp0bnNJbmZvU3JjLAotICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGVEZXN0LAotICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGVTcmMsCi0gICAgICAgICAgICAgY29uc3QgVE5TX0NPTkZJRyAqdEMKLSAgICAgICAgICAgICApOwotCi1JTlQgRkRLYWFjRW5jX1Ruc0VuY29kZSgKLSAgICAgICAgICAgICAgVE5TX0lORk8qIHRuc0luZm8sCi0gICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAotICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtT2ZTZmIsCi0gICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgKnRDLAotICAgICAgICAgICAgICBjb25zdCBJTlQgbG93UGFzc0xpbmUsCi0gICAgICAgICAgICAgIEZJWFBfREJMKiBzcGVjdHJ1bSwKLSAgICAgICAgICAgICAgY29uc3QgSU5UIHN1YkJsb2NrTnVtYmVyLAotICAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tUeXBlCi0gICAgICAgICAgICAgICk7Ci0KLQotCi0jZW5kaWYgLyogX1ROU19GVU5DX0ggKi8KKyNlbmRpZiAvKiBUTlNfRlVOQ19IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3RvbmFsaXR5LmNwcCBiL2xpYkFBQ2VuYy9zcmMvdG9uYWxpdHkuY3BwCmluZGV4IDcyNDZhMzQuLjMzNGUwZjEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvdG9uYWxpdHkuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvdG9uYWxpdHkuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDc0ICs5MCw3NyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIGF1dGhvcjogICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBDb252ZXJ0IGNoYW9zIG1lYXN1cmUgdG8gdGhlIHRvbmFsaXR5IGluZGV4CisgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBDb252ZXJ0IGNoYW9zIG1lYXN1cmUgdG8gdGhlIHRvbmFsaXR5IGluZGV4CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0b25hbGl0eS5oIgorCiAjaW5jbHVkZSAiY2hhb3NtZWFzdXJlLmgiCiAKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBub3JtbG9nID0gKEZJWFBfREJMKTB4ZDk3N2Q5NDk7IC8qRkwyRlhDT05TVF9EQkwoLTAuNDM0Mjk0NDgxOWYgKiBGREtsb2coMi4wKS9GREtsb2coMi43MTgyODE4KSk7ICovCi0KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjU2ZiVG9uYWxpdHkoRklYUF9EQkwgICAgICAqUkVTVFJJQ1Qgc3BlY3RydW0sCi0JCQkJCQkJSU5UICAgICAgICAgICAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKlJFU1RSSUNUIGNoYW9zTWVhc3VyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICAgICpSRVNUUklDVCBzZmJUb25hbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICpSRVNUUklDVCBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TEQ2NCApOwotCi0KLXZvaWQgRkRLYWFjRW5jX0NhbGN1bGF0ZUZ1bGxUb25hbGl0eShGSVhQX0RCTCAgICAgICpSRVNUUklDVCBzcGVjdHJ1bSwKLQkJCQkJCSAgICAgICAgICAgICBJTlQgICAgICAgICAgICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TEQ2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICAgICpSRVNUUklDVCBzZmJUb25hbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgIHVzZVBucykKLXsKLSAgSU5UIGo7Ci0jaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQotICBGSVhQX1NHTCBhbHBoYV8wID0gRkwyRlhDT05TVF9TR0woMC4yNWYpOyAgICAgICAvKiB1c2VkIGluIHNtb290aCBDaGFvc01lYXN1cmUgKi8KLSAgRklYUF9TR0wgYWxwaGFfMSA9IEZMMkZYQ09OU1RfU0dMKDEuMGYtMC4yNWYpOyAgLyogdXNlZCBpbiBzbW9vdGggQ2hhb3NNZWFzdXJlICovCi0jZWxzZQotICBGSVhQX0RCTCBhbHBoYV8wID0gRkwyRlhDT05TVF9EQkwoMC4yNWYpOyAgICAgICAvKiB1c2VkIGluIHNtb290aCBDaGFvc01lYXN1cmUgKi8KLSAgRklYUF9EQkwgYWxwaGFfMSA9IEZMMkZYQ09OU1RfREJMKDEuMGYtMC4yNWYpOyAgLyogdXNlZCBpbiBzbW9vdGggQ2hhb3NNZWFzdXJlICovCisjaWYgZGVmaW5lZChfX2FybV9fKQogI2VuZGlmCisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBub3JtbG9nID0KKyAgICAoRklYUF9EQkwpMHhkOTc3ZDk0OTsgLypGTDJGWENPTlNUX0RCTCgtMC40MzQyOTQ0ODE5ZiAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES2xvZygyLjApL0ZES2xvZygyLjcxODI4MTgpKTsgKi8KKworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNTZmJUb25hbGl0eShGSVhQX0RCTCAqUkVTVFJJQ1Qgc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgY2hhb3NNZWFzdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAqUkVTVFJJQ1Qgc2ZiVG9uYWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzZmJDbnQsIGNvbnN0IElOVCAqUkVTVFJJQ1Qgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TEQ2NCk7CisKK3ZvaWQgRkRLYWFjRW5jX0NhbGN1bGF0ZUZ1bGxUb25hbGl0eShGSVhQX0RCTCAqUkVTVFJJQ1Qgc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkVuZXJneUxENjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgKlJFU1RSSUNUIHNmYlRvbmFsaXR5LCBJTlQgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LCBJTlQgdXNlUG5zKSB7CisgIElOVCBqOwogICBJTlQgbnVtYmVyT2ZMaW5lcyA9IHNmYk9mZnNldFtzZmJDbnRdOwogCi0gIGlmICghdXNlUG5zKQotICAgIHJldHVybjsKKyAgaWYgKHVzZVBucykgeworICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChjaGFvc01lYXN1cmVQZXJMaW5lLCBGSVhQX0RCTCwgKDEwMjQpKQogCi0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChjaGFvc01lYXN1cmVQZXJMaW5lLCBGSVhQX0RCTCwgKDEwMjQpKTsKLSAgLyogY2FsY3VsYXRlIGNoYW9zIG1lYXN1cmUgKi8KLSAgRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZShzcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFvc01lYXN1cmVQZXJMaW5lKTsKKyAgICAvKiBjYWxjdWxhdGUgY2hhb3MgbWVhc3VyZSAqLworICAgIEZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmUoc3BlY3RydW0sIG51bWJlck9mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFvc01lYXN1cmVQZXJMaW5lKTsKIAotICAvKiBzbW9vdGggQ2hhb3NNZWFzdXJlICovCi0gIGZvciAoaj0xO2o8bnVtYmVyT2ZMaW5lcztqKyspIHsKLSAgICBGSVhQX0RCTCB0bXAgPSBmTXVsdERpdjIoYWxwaGFfMSwgY2hhb3NNZWFzdXJlUGVyTGluZVtqXSk7Ci0gICAgY2hhb3NNZWFzdXJlUGVyTGluZVtqXSA9IGZNdWx0QWRkKHRtcCwgYWxwaGFfMCwgY2hhb3NNZWFzdXJlUGVyTGluZVtqLTFdKTsKKyAgICAvKiBzbW9vdGggQ2hhb3NNZWFzdXJlICovCisgICAgRklYUF9EQkwgbGVmdCA9IGNoYW9zTWVhc3VyZVBlckxpbmVbMF07CisgICAgRklYUF9EQkwgcmlnaHQ7CisgICAgZm9yIChqID0gMTsgaiA8IChudW1iZXJPZkxpbmVzIC0gMSk7IGogKz0gMikgeworICAgICAgcmlnaHQgPSBjaGFvc01lYXN1cmVQZXJMaW5lW2pdOworICAgICAgcmlnaHQgPSByaWdodCAtIChyaWdodCA+PiAyKTsKKyAgICAgIGxlZnQgPSByaWdodCArIChsZWZ0ID4+IDIpOworICAgICAgY2hhb3NNZWFzdXJlUGVyTGluZVtqXSA9IGxlZnQ7IC8qIDAuMjUgbGVmdCArIDAuNzUgcmlnaHQgKi8KKworICAgICAgcmlnaHQgPSBjaGFvc01lYXN1cmVQZXJMaW5lW2ogKyAxXTsKKyAgICAgIHJpZ2h0ID0gcmlnaHQgLSAocmlnaHQgPj4gMik7CisgICAgICBsZWZ0ID0gcmlnaHQgKyAobGVmdCA+PiAyKTsKKyAgICAgIGNoYW9zTWVhc3VyZVBlckxpbmVbaiArIDFdID0gbGVmdDsKKyAgICB9CisgICAgaWYgKGogPT0gKG51bWJlck9mTGluZXMgLSAxKSkgeworICAgICAgcmlnaHQgPSBjaGFvc01lYXN1cmVQZXJMaW5lW2pdOworICAgICAgcmlnaHQgPSByaWdodCAtIChyaWdodCA+PiAyKTsKKyAgICAgIGxlZnQgPSByaWdodCArIChsZWZ0ID4+IDIpOworICAgICAgY2hhb3NNZWFzdXJlUGVyTGluZVtqXSA9IGxlZnQ7CisgICAgfQorCisgICAgRkRLYWFjRW5jX0NhbGNTZmJUb25hbGl0eShzcGVjdHJ1bSwgc2ZiTWF4U2NhbGVTcGVjLCBjaGFvc01lYXN1cmVQZXJMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiVG9uYWxpdHksIHNmYkNudCwgc2ZiT2Zmc2V0LCBzZmJFbmVyZ3lMRDY0KTsKKworICAgIENfQUxMT0NfU0NSQVRDSF9FTkQoY2hhb3NNZWFzdXJlUGVyTGluZSwgRklYUF9EQkwsICgxMDI0KSkKICAgfQotCi0gIEZES2FhY0VuY19DYWxjU2ZiVG9uYWxpdHkoc3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICBzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgICAgICAgICAgICBjaGFvc01lYXN1cmVQZXJMaW5lLAotICAgICAgICAgICAgICAgICAgc2ZiVG9uYWxpdHksCi0gICAgICAgICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lMRDY0KTsKLQotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGNoYW9zTWVhc3VyZVBlckxpbmUsIEZJWFBfREJMLCAoMTAyNCkpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBDYWxjdWxhdGVUb25hbGl0eUluZGV4CkBAIC0xNTgsNDcgKzE3Miw0OCBAQAogICAgIG91dHB1dDogICAgICAgc2ZiIHdpc2UgdG9uYWxpdHkgdmFsdWVzCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNTZmJUb25hbGl0eShGSVhQX0RCTCAgICAgICpSRVNUUklDVCBzcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqUkVTVFJJQ1QgY2hhb3NNZWFzdXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICAgKlJFU1RSSUNUIHNmYlRvbmFsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgKlJFU1RSSUNUIHNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICpSRVNUUklDVCBzZmJFbmVyZ3lMRDY0ICkKLXsKLSAgICBJTlQgaSwgajsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjU2ZiVG9uYWxpdHkoRklYUF9EQkwgKlJFU1RSSUNUIHNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGNoYW9zTWVhc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgKlJFU1RSSUNUIHNmYlRvbmFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2ZiQ250LCBjb25zdCBJTlQgKlJFU1RSSUNUIHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkVuZXJneUxENjQpIHsKKyAgSU5UIGk7CiAKLSAgICBmb3IgKGk9MDsgaTxzZmJDbnQ7IGkrKykgewotICAgICAgRklYUF9EQkwgY2hhb3NNZWFzdXJlU2ZiTEQ2NDsKLSAgICAgIElOVCBzaGlmdEJpdHMgPSBmaXhNYXgoMCxzZmJNYXhTY2FsZVNwZWNbaV0gLSA0KTsgIC8qIG1heCBzZmJXaWR0aCA9IDk2IDsgMl43PTEyOCA9PiA3LzIgPSA0IChzcGMqc3BjKSAqLworICBmb3IgKGkgPSAwOyBpIDwgc2ZiQ250OyBpKyspIHsKKyAgICBGSVhQX0RCTCBjaGFvc01lYXN1cmVTZmJMRDY0OworICAgIElOVCBzaGlmdEJpdHMgPQorICAgICAgICBmaXhNYXgoMCwgc2ZiTWF4U2NhbGVTcGVjW2ldIC0KKyAgICAgICAgICAgICAgICAgICAgICA0KTsgLyogbWF4IHNmYldpZHRoID0gOTYgOyAyXjc9MTI4ID0+IDcvMiA9IDQgKHNwYypzcGMpICovCiAKLSAgICAgIEZJWFBfREJMIGNoYW9zTWVhc3VyZVNmYiA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisgICAgSU5UIGo7CisgICAgRklYUF9EQkwgY2hhb3NNZWFzdXJlU2ZiID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKIAotICAgICAgLyogY2FsYyBjaGFvc01lYXN1cmVQZXJTZmIgKi8KLSAgICAgIGZvciAoaj0oc2ZiT2Zmc2V0W2krMV0tc2ZiT2Zmc2V0W2ldKS0xOyBqPj0wOyBqLS0pIHsKLSAgICAgICAgRklYUF9EQkwgdG1wID0gKCpzcGVjdHJ1bSsrKTw8c2hpZnRCaXRzOwotICAgICAgICBGSVhQX0RCTCBsaW5lTnJnID0gZk11bHREaXYyKHRtcCwgdG1wKTsKLSAgICAgICAgY2hhb3NNZWFzdXJlU2ZiID0gZk11bHRBZGREaXYyKGNoYW9zTWVhc3VyZVNmYiwgbGluZU5yZywgKmNoYW9zTWVhc3VyZSsrKTsKLSAgICAgIH0KLQotICAgICAgLyogY2FsYyB0b25hbGl0eVBlclNmYiAqLwotICAgICAgaWYgKGNoYW9zTWVhc3VyZVNmYiAhPSBGTDJGWENPTlNUX0RCTCgwLjApKQotICAgICAgewotICAgICAgICAvKiBhZGQgbGQoY29udnRvbmUpLzY0IGFuZCAyLzY0IGJlYy5mTXVsdERpdjIgKi8KLSAgICAgICAgY2hhb3NNZWFzdXJlU2ZiTEQ2NCA9IENhbGNMZERhdGEoKGNoYW9zTWVhc3VyZVNmYikpIC0gc2ZiRW5lcmd5TEQ2NFtpXTsKLSAgICAgICAgY2hhb3NNZWFzdXJlU2ZiTEQ2NCArPSBGTDJGWENPTlNUX0RCTCgzLjBmLzY0KSAtICgoRklYUF9EQkwpKHNoaWZ0Qml0cyk8PChERlJBQ1RfQklUUy02KSk7Ci0KLSAgICAgICAgaWYgKGNoYW9zTWVhc3VyZVNmYkxENjQgPiBGTDJGWENPTlNUX0RCTCgtMC4wNTE5MDUxKSApICAgICAvKiA+IGxkKDAuMDUpK2xkKDIpICovCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hhb3NNZWFzdXJlU2ZiTEQ2NCA8PSBGTDJGWENPTlNUX0RCTCgwLjApICkKLQkJICAgIHNmYlRvbmFsaXR5W2ldID0gRlhfREJMMkZYX1NHTChmTXVsdERpdjIoIGNoYW9zTWVhc3VyZVNmYkxENjQgLCBub3JtbG9nICkgPDwgNyk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2ZiVG9uYWxpdHlbaV0gPSBGTDJGWENPTlNUX1NHTCgwLjApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBzZmJUb25hbGl0eVtpXSA9IChGSVhQX1NHTClNQVhWQUxfU0dMOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBzZmJUb25hbGl0eVtpXSA9IChGSVhQX1NHTClNQVhWQUxfU0dMOworICAgIC8qIGNhbGMgY2hhb3NNZWFzdXJlUGVyU2ZiICovCisgICAgZm9yIChqID0gKHNmYk9mZnNldFtpICsgMV0gLSBzZmJPZmZzZXRbaV0pIC0gMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgIEZJWFBfREJMIHRtcCA9ICgqc3BlY3RydW0rKykgPDwgc2hpZnRCaXRzOworICAgICAgRklYUF9EQkwgbGluZU5yZyA9IGZNdWx0RGl2Mih0bXAsIHRtcCk7CisgICAgICBjaGFvc01lYXN1cmVTZmIgPSBmTXVsdEFkZERpdjIoY2hhb3NNZWFzdXJlU2ZiLCBsaW5lTnJnLCAqY2hhb3NNZWFzdXJlKyspOwogICAgIH0KKworICAgIC8qIGNhbGMgdG9uYWxpdHlQZXJTZmIgKi8KKyAgICBpZiAoY2hhb3NNZWFzdXJlU2ZiICE9IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKKyAgICAgIC8qIGFkZCBsZChjb252dG9uZSkvNjQgYW5kIDIvNjQgYmVjLmZNdWx0RGl2MiAqLworICAgICAgY2hhb3NNZWFzdXJlU2ZiTEQ2NCA9IENhbGNMZERhdGEoKGNoYW9zTWVhc3VyZVNmYikpIC0gc2ZiRW5lcmd5TEQ2NFtpXTsKKyAgICAgIGNoYW9zTWVhc3VyZVNmYkxENjQgKz0gRkwyRlhDT05TVF9EQkwoMy4wZiAvIDY0KSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRklYUF9EQkwpKHNoaWZ0Qml0cykgPDwgKERGUkFDVF9CSVRTIC0gNikpOworCisgICAgICBpZiAoY2hhb3NNZWFzdXJlU2ZiTEQ2NCA+CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoLTAuMDUxOTA1MSkpIC8qID4gbGQoMC4wNSkrbGQoMikgKi8KKyAgICAgIHsKKyAgICAgICAgaWYgKGNoYW9zTWVhc3VyZVNmYkxENjQgPD0gRkwyRlhDT05TVF9EQkwoMC4wKSkKKyAgICAgICAgICBzZmJUb25hbGl0eVtpXSA9CisgICAgICAgICAgICAgIEZYX0RCTDJGWF9TR0woZk11bHREaXYyKGNoYW9zTWVhc3VyZVNmYkxENjQsIG5vcm1sb2cpIDw8IDcpOworICAgICAgICBlbHNlCisgICAgICAgICAgc2ZiVG9uYWxpdHlbaV0gPSBGTDJGWENPTlNUX1NHTCgwLjApOworICAgICAgfSBlbHNlCisgICAgICAgIHNmYlRvbmFsaXR5W2ldID0gKEZJWFBfU0dMKU1BWFZBTF9TR0w7CisgICAgfSBlbHNlCisgICAgICBzZmJUb25hbGl0eVtpXSA9IChGSVhQX1NHTClNQVhWQUxfU0dMOworICB9CiB9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3RvbmFsaXR5LmggYi9saWJBQUNlbmMvc3JjL3RvbmFsaXR5LmgKaW5kZXggZmJlNzhlZS4uYzVjZjRjNSAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy90b25hbGl0eS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvdG9uYWxpdHkuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMCArOTAsMjYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBhdXRob3I6ICAgTS4gTG9od2Fzc2VyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogQ2FsY3VsYXRlIHRvbmFsaXR5IGluZGV4CisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBDYWxjdWxhdGUgdG9uYWxpdHkgaW5kZXgKIAotI2lmbmRlZiBfX1RPTkFMSVRZX0gKLSNkZWZpbmUgX19UT05BTElUWV9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRPTkFMSVRZX0gKKyNkZWZpbmUgVE9OQUxJVFlfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgotCi0KICNpbmNsdWRlICJjaGFvc21lYXN1cmUuaCIKIAordm9pZCBGREthYWNFbmNfQ2FsY3VsYXRlRnVsbFRvbmFsaXR5KEZJWFBfREJMICpSRVNUUklDVCBzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TEQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAqUkVTVFJJQ1Qgc2ZiVG9uYWxpdHksIElOVCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpzZmJPZmZzZXQsIElOVCB1c2VQbnMpOwogCi12b2lkIEZES2FhY0VuY19DYWxjdWxhdGVGdWxsVG9uYWxpdHkoIEZJWFBfREJMICAgICAgKlJFU1RSSUNUIHNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICpSRVNUUklDVCBzZmJFbmVyZ3lMRDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICAgKlJFU1RSSUNUIHNmYlRvbmFsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgIHVzZVBucyk7Ci0KLSNlbmRpZgorI2VuZGlmIC8qIFRPTkFMSVRZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvdHJhbnNmb3JtLmNwcCBiL2xpYkFBQ2VuYy9zcmMvdHJhbnNmb3JtLmNwcAppbmRleCA2OTBiODJlLi4wOGIxYzJmIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3RyYW5zZm9ybS5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy90cmFuc2Zvcm0uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDkgKzkwLDExIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgVG9iaWFzIENoYWx1cGthCiAKICAgIERlc2NyaXB0aW9uOiBGREthYWNMZEVuY19NZGN0VHJhbnNmb3JtNDgwOgogICAgICAgICAgICAgICAgIFRoZSBtb2R1bGUgRkRLYWFjTGRFbmNfTWRjdFRyYW5zZm9ybSB3aWxsIHBlcmZvcm0gdGhlIE1EQ1QuCkBAIC05MCwxNzUgKzEwMywxOTIgQEAKICAgICAgICAgICAgICAgICBjYW4gYmUgZGl2aWRlZCBpbiAgV2luZG93aW5nLCBQcmVNb2R1bGF0aW9uLCBGZnQgYW5kCiAgICAgICAgICAgICAgICAgUG9zdE1vZHVsYXRpb24uCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0cmFuc2Zvcm0uaCIKLQogI2luY2x1ZGUgImRjdC5oIgogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogI2luY2x1ZGUgImFhY0VuY19yb20uaCIKICNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCiAKLUlOVCBGREthYWNFbmNfVHJhbnNmb3JtX1JlYWwgKGNvbnN0IElOVF9QQ00gKiBwVGltZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHdpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwcmV2V2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1kY3REYXRhX2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZmlsdGVyVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsRklYUF9EQkwgKiBSRVNUUklDVCBvdmVybGFwQWRkQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgY29uc3QgSU5UX1BDTSAqIFJFU1RSSUNUIHRpbWVEYXRhOworI2lmIGRlZmluZWQoX19hcm1fXykKKyNlbmRpZgorCitJTlQgRkRLYWFjRW5jX1RyYW5zZm9ybV9SZWFsKGNvbnN0IElOVF9QQ00gKnBUaW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3REYXRhLCBjb25zdCBJTlQgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgd2luZG93U2hhcGUsIElOVCAqcHJldldpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIX01EQ1QgbWRjdFBlcnMsIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwTWRjdERhdGFfZSwgSU5UIGZpbHRlclR5cGUpIHsKKyAgY29uc3QgSU5UX1BDTSAqUkVTVFJJQ1QgdGltZURhdGE7CisKKyAgVUlOVCBudW1TcGVjOworICBVSU5UIG51bU1kY3RMaW5lczsKKyAgVUlOVCBvZmZzZXQ7CisgIGludCBmcjsgLyogZnI6IHJpZ2h0IHdpbmRvdyBzbG9wZSBsZW5ndGggKi8KKyAgU0hPUlQgbWRjdERhdGFfZVs4XTsKKworICB0aW1lRGF0YSA9IHBUaW1lRGF0YTsKKworICBpZiAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgeworICAgIG51bVNwZWMgPSA4OworICAgIG51bU1kY3RMaW5lcyA9IGZyYW1lTGVuZ3RoID4+IDM7CisgIH0gZWxzZSB7CisgICAgbnVtU3BlYyA9IDE7CisgICAgbnVtTWRjdExpbmVzID0gZnJhbWVMZW5ndGg7CisgIH0KKworICBvZmZzZXQgPSAod2luZG93U2hhcGUgPT0gTE9MX1dJTkRPVykgPyAoKGZyYW1lTGVuZ3RoICogMykgPj4gMikgOiAwOworICBzd2l0Y2ggKGJsb2NrVHlwZSkgeworICAgIGNhc2UgTE9OR19XSU5ET1c6CisgICAgY2FzZSBTVE9QX1dJTkRPVzoKKyAgICAgIGZyID0gZnJhbWVMZW5ndGggLSBvZmZzZXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUQVJUX1dJTkRPVzogLyogb3IgU3RvcFN0YXJ0U2VxdWVuY2UgKi8KKyAgICBjYXNlIFNIT1JUX1dJTkRPVzoKKyAgICAgIGZyID0gZnJhbWVMZW5ndGggPj4gMzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOworICAgICAgcmV0dXJuIC0xOworICB9CisKKyAgbWRjdF9ibG9jayhtZGN0UGVycywgdGltZURhdGEsIGZyYW1lTGVuZ3RoLCBtZGN0RGF0YSwgbnVtU3BlYywgbnVtTWRjdExpbmVzLAorICAgICAgICAgICAgIEZES2dldFdpbmRvd1Nsb3BlKGZyLCB3aW5kb3dTaGFwZSksIGZyLCBtZGN0RGF0YV9lKTsKKworICBpZiAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgeworICAgIGlmICghKG1kY3REYXRhX2VbMF0gPT0gbWRjdERhdGFfZVsxXSAmJiBtZGN0RGF0YV9lWzFdID09IG1kY3REYXRhX2VbMl0gJiYKKyAgICAgICAgICBtZGN0RGF0YV9lWzJdID09IG1kY3REYXRhX2VbM10gJiYgbWRjdERhdGFfZVszXSA9PSBtZGN0RGF0YV9lWzRdICYmCisgICAgICAgICAgbWRjdERhdGFfZVs0XSA9PSBtZGN0RGF0YV9lWzVdICYmIG1kY3REYXRhX2VbNV0gPT0gbWRjdERhdGFfZVs2XSAmJgorICAgICAgICAgIG1kY3REYXRhX2VbNl0gPT0gbWRjdERhdGFfZVs3XSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgKnByZXZXaW5kb3dTaGFwZSA9IHdpbmRvd1NoYXBlOworICAqcE1kY3REYXRhX2UgPSBtZGN0RGF0YV9lWzBdOworCisgIHJldHVybiAwOworfQorCitJTlQgRkRLYWFjRW5jX1RyYW5zZm9ybV9SZWFsX0VsZChjb25zdCBJTlRfUENNICpwVGltZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tUeXBlLCBjb25zdCBJTlQgd2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnByZXZXaW5kb3dTaGFwZSwgY29uc3QgSU5UIGZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptZGN0RGF0YV9lLCBJTlQgZmlsdGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBvdmVybGFwQWRkQnVmZmVyKSB7CisgIGNvbnN0IElOVF9QQ00gKlJFU1RSSUNUIHRpbWVEYXRhOwogCiAgIElOVCBpOworCiAgIC8qIHRsOiB0cmFuc2Zvcm0gbGVuZ3RoCiAgICAgIGZsOiBsZWZ0IHdpbmRvdyBzbG9wZSBsZW5ndGgKICAgICAgbmw6IGxlZnQgd2luZG93IHNsb3BlIG9mZnNldAogICAgICBmcjogcmlnaHQgd2luZG93IHNsb3BlIGxlbmd0aAotICAgICBucjogcmlnaHQgd2luZG93IHNsb3BlIG9mZnNldAotICAgICBTZWUgRkRLX3Rvb2xzL2RvYy9pbnRlcm4vbWRjdC50ZXggZm9yIG1vcmUgZGV0YWlsLiAqLwotICBpbnQgdGwsIGZsLCBubCwgZnIsIG5yOworICAgICBucjogcmlnaHQgd2luZG93IHNsb3BlIG9mZnNldCAqLworICBjb25zdCBGSVhQX1dUQiAqcFdpbmRvd0VMRCA9IE5VTEw7CisgIGludCBOID0gZnJhbWVMZW5ndGg7CisgIGludCBMID0gZnJhbWVMZW5ndGg7CiAKLSAgY29uc3QgRklYUF9XVFAgKiBSRVNUUklDVCBwTGVmdFdpbmRvd1BhcnQ7Ci0gIGNvbnN0IEZJWFBfV1RQICogUkVTVFJJQ1QgcFJpZ2h0V2luZG93UGFydDsKKyAgdGltZURhdGEgPSBwVGltZURhdGE7CisKKyAgaWYgKGJsb2NrVHlwZSAhPSBMT05HX1dJTkRPVykgeworICAgIHJldHVybiAtMTsKKyAgfQogCiAgIC8qCiAgICAqIE1EQ1Qgc2NhbGU6CiAgICAqICsgMTogZk11bHREaXYyKCkgaW4gd2luZG93aW5nLgogICAgKiArIDE6IEJlY2F1c2Ugb2YgZmFjdG9yIDEvMiBpbiBQcmluY2VuLUJyYWRsZXkgY29tcGxpYW50IHdpbmRvd2VkIFREQUMuCiAgICAqLwotICAqbWRjdERhdGFfZSA9IDErMTsKKyAgKm1kY3REYXRhX2UgPSAxICsgMTsKIAotICB0bCA9IGZyYW1lTGVuZ3RoOwotICB0aW1lRGF0YSA9IHBUaW1lRGF0YTsKLQotICBzd2l0Y2goIGJsb2NrVHlwZSApIHsKLSAgICBjYXNlIExPTkdfV0lORE9XOgotICAgICAgewotICAgICAgICBpbnQgb2Zmc2V0ID0gKHdpbmRvd1NoYXBlID09IExPTF9XSU5ET1cpID8gKChmcmFtZUxlbmd0aCAqIDMpPj4yKSA6IDA7Ci0gICAgICAgIGZsID0gZnJhbWVMZW5ndGggLSBvZmZzZXQ7Ci0gICAgICAgIGZyID0gZnJhbWVMZW5ndGggLSBvZmZzZXQ7Ci0gICAgICB9CisgIHN3aXRjaCAoZnJhbWVMZW5ndGgpIHsKKyAgICBjYXNlIDUxMjoKKyAgICAgIHBXaW5kb3dFTEQgPSBFTERBbmFseXNpczUxMjsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgU1RPUF9XSU5ET1c6Ci0gICAgICBmbCA9IGZyYW1lTGVuZ3RoID4+IDM7Ci0gICAgICBmciA9IGZyYW1lTGVuZ3RoOworICAgIGNhc2UgNDgwOgorICAgICAgcFdpbmRvd0VMRCA9IEVMREFuYWx5c2lzNDgwOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVEFSVF9XSU5ET1c6IC8qIG9yIFN0b3BTdGFydFNlcXVlbmNlICovCi0gICAgICBmbCA9IGZyYW1lTGVuZ3RoOwotICAgICAgZnIgPSBmcmFtZUxlbmd0aCA+PiAzOworICAgIGNhc2UgMjU2OgorICAgICAgcFdpbmRvd0VMRCA9IEVMREFuYWx5c2lzMjU2OworICAgICAgKm1kY3REYXRhX2UgKz0gMTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hPUlRfV0lORE9XOgotICAgICAgZmwgPSBmciA9IGZyYW1lTGVuZ3RoID4+IDM7Ci0gICAgICB0bCA+Pj0gMzsKLSAgICAgIHRpbWVEYXRhID0gcFRpbWVEYXRhICsgMypmbCArIChmbC8yKTsKKyAgICBjYXNlIDI0MDoKKyAgICAgIHBXaW5kb3dFTEQgPSBFTERBbmFseXNpczI0MDsKKyAgICAgICptZGN0RGF0YV9lICs9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyODoKKyAgICAgIHBXaW5kb3dFTEQgPSBFTERBbmFseXNpczEyODsKKyAgICAgICptZGN0RGF0YV9lICs9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDoKKyAgICAgIHBXaW5kb3dFTEQgPSBFTERBbmFseXNpczEyMDsKKyAgICAgICptZGN0RGF0YV9lICs9IDI7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgRkRLX0FTU0VSVCgwKTsKICAgICAgIHJldHVybiAtMTsKLSAgICAgIGJyZWFrOwogICB9CiAKLSAgLyogVGFrZW4gZnJvbSBGREtfdG9vbHMvc3JjL21kY3QuY3BwIERlcml2ZSBOUiBhbmQgTkwgKi8KLSAgbnIgPSAodGwgLSBmcik+PjE7Ci0gIG5sID0gKHRsIC0gZmwpPj4xOworICBmb3IgKGkgPSAwOyBpIDwgTiAvIDQ7IGkrKykgeworICAgIEZJWFBfREJMIHowLCBvdXR2YWw7CiAKLSAgcExlZnRXaW5kb3dQYXJ0ID0gRkRLZ2V0V2luZG93U2xvcGUoZmwsICpwcmV2V2luZG93U2hhcGUpOwotICBwUmlnaHRXaW5kb3dQYXJ0ID0gRkRLZ2V0V2luZG93U2xvcGUoZnIsIHdpbmRvd1NoYXBlKTsKKyAgICB6MCA9IChmTXVsdCgoRklYUF9QQ00pdGltZURhdGFbTCArIE4gKiAzIC8gNCAtIDEgLSBpXSwKKyAgICAgICAgICAgICAgICBwV2luZG93RUxEW04gLyAyIC0gMSAtIGldKQorICAgICAgICAgIDw8IChXVFMwIC0gMSkpICsKKyAgICAgICAgIChmTXVsdCgoRklYUF9QQ00pdGltZURhdGFbTCArIE4gKiAzIC8gNCArIGldLCBwV2luZG93RUxEW04gLyAyICsgaV0pCisgICAgICAgICAgPDwgKFdUUzAgLSAxKSk7CiAKLSAgLyogd2luZG93aW5nICovCi0gIGlmIChmaWx0ZXJUeXBlICE9IEZCX0VMRCkKLSAgewotICAgIC8qIExlZnQgd2luZG93IHNsb3BlIG9mZnNldCAqLwotICAgIGZvciAoaT0wOyBpPG5sIDsgaSsrKQotICAgIHsKLSNpZiBTQU1QTEVfQklUUyA9PSBERlJBQ1RfQklUUyAgIC8qIFNQQ19CSVRTIGFuZCBERlJBQ1RfQklUUyBzaG91bGQgYmUgZXF1YWwuICovCi0gICAgICBtZGN0RGF0YVsodGwvMikraV0gPSAtIChGSVhQX0RCTCkgdGltZURhdGFbdGwtaS0xXSA+PiAoIDEgKTsKLSNlbHNlCi0gICAgICBtZGN0RGF0YVsodGwvMikraV0gPSAtIChGSVhQX0RCTCkgdGltZURhdGFbdGwtaS0xXSA8PCAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyAtIDEpOwotI2VuZGlmCi0gICAgfQotICAgIC8qIExlZnQgd2luZG93IHNsb3BlICovCi0gICAgZm9yIChpPTA7IGk8ZmwvMjsgaSsrKQotICAgIHsKLSAgICAgIEZJWFBfREJMIHRtcDA7Ci0gICAgICB0bXAwID0gZk11bHREaXYyKChGSVhQX1BDTSl0aW1lRGF0YVtpK25sXSwgcExlZnRXaW5kb3dQYXJ0W2ldLnYuaW0pOwotICAgICAgbWRjdERhdGFbKHRsLzIpK2krbmxdID0gZk11bHRTdWJEaXYyKHRtcDAsIChGSVhQX1BDTSl0aW1lRGF0YVt0bC1ubC1pLTFdLCBwTGVmdFdpbmRvd1BhcnRbaV0udi5yZSk7Ci0gICAgfQorICAgIG91dHZhbCA9IChmTXVsdERpdjIoKEZJWFBfUENNKXRpbWVEYXRhW0wgKyBOICogMyAvIDQgLSAxIC0gaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBwV2luZG93RUxEW04gKyBOIC8gMiAtIDEgLSBpXSkgPj4KKyAgICAgICAgICAgICAgKC1XVFMxKSk7CisgICAgb3V0dmFsICs9IChmTXVsdERpdjIoKEZJWFBfUENNKXRpbWVEYXRhW0wgKyBOICogMyAvIDQgKyBpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwV2luZG93RUxEW04gKyBOIC8gMiArIGldKSA+PgorICAgICAgICAgICAgICAgKC1XVFMxKSk7CisgICAgb3V0dmFsICs9IChmTXVsdERpdjIob3ZlcmxhcEFkZEJ1ZmZlcltOIC8gMiArIGldLCBwV2luZG93RUxEWzIgKiBOICsgaV0pID4+CisgICAgICAgICAgICAgICAoLVdUUzIgLSAxKSk7CiAKLSAgICAvKiBSaWdodCB3aW5kb3cgc2xvcGUgb2Zmc2V0ICovCi0gICAgZm9yKGk9MDsgaTxucjsgaSsrKQotICAgIHsKLSNpZiBTQU1QTEVfQklUUyA9PSBERlJBQ1RfQklUUyAgICAvKiBUaGlzIHNob3VsZCBiZSBTUENfQklUUyBpbnN0ZWFkIG9mIERGUkFDVF9CSVRTLiAqLwotICAgICAgbWRjdERhdGFbKHRsLzIpLTEtaV0gPSAtIChGSVhQX0RCTCkgdGltZURhdGFbdGwraV0gPj4gKDEpOwotI2Vsc2UKLSAgICAgIG1kY3REYXRhWyh0bC8yKS0xLWldID0gLSAoRklYUF9EQkwpIHRpbWVEYXRhW3RsK2ldIDw8IChERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTIC0gMSk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgLyogUmlnaHQgd2luZG93IHNsb3BlICovCi0gICAgZm9yIChpPTA7IGk8ZnIvMjsgaSsrKQotICAgIHsKLSAgICAgIEZJWFBfREJMIHRtcDE7Ci0gICAgICB0bXAxID0gZk11bHREaXYyKChGSVhQX1BDTSl0aW1lRGF0YVt0bCtucitpXSwgcFJpZ2h0V2luZG93UGFydFtpXS52LnJlKTsKLSAgICAgIG1kY3REYXRhWyh0bC8yKS1uci1pLTFdID0gLWZNdWx0QWRkRGl2Mih0bXAxLCAoRklYUF9QQ00pdGltZURhdGFbKHRsKjIpLW5yLWktMV0sIHBSaWdodFdpbmRvd1BhcnRbaV0udi5pbSk7Ci0gICAgfQorICAgIG92ZXJsYXBBZGRCdWZmZXJbTiAvIDIgKyBpXSA9IG92ZXJsYXBBZGRCdWZmZXJbaV07CisKKyAgICBvdmVybGFwQWRkQnVmZmVyW2ldID0gejA7CisgICAgbWRjdERhdGFbaV0gPSBvdmVybGFwQWRkQnVmZmVyW04gLyAyICsgaV0gKworICAgICAgICAgICAgICAgICAgKGZNdWx0RGl2MihvdmVybGFwQWRkQnVmZmVyW04gKyBOIC8gMiAtIDEgLSBpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdpbmRvd0VMRFsyICogTiArIE4gLyAyICsgaV0pID4+CisgICAgICAgICAgICAgICAgICAgKC1XVFMyIC0gMSkpOworCisgICAgbWRjdERhdGFbTiAtIDEgLSBpXSA9IG91dHZhbDsKKyAgICBvdmVybGFwQWRkQnVmZmVyW04gKyBOIC8gMiAtIDEgLSBpXSA9IG91dHZhbDsKICAgfQogCi0gIGlmIChmaWx0ZXJUeXBlID09IEZCX0VMRCkKLSAgewotICAgIGNvbnN0IEZJWFBfV1RCICpwV2luZG93RUxEPU5VTEw7Ci0gICAgaW50IGksIE4gPSBmcmFtZUxlbmd0aCwgTCA9IGZyYW1lTGVuZ3RoOworICBmb3IgKGkgPSBOIC8gNDsgaSA8IE4gLyAyOyBpKyspIHsKKyAgICBGSVhQX0RCTCB6MCwgb3V0dmFsOwogCi0gICAgaWYgKGZyYW1lTGVuZ3RoID09IDUxMikgewotICAgICAgcFdpbmRvd0VMRCA9IEVMREFuYWx5c2lzNTEyOwotICAgIH0gZWxzZSB7Ci0gICAgICBwV2luZG93RUxEID0gRUxEQW5hbHlzaXM0ODA7Ci0gICAgfQorICAgIHowID0gZk11bHQoKEZJWFBfUENNKXRpbWVEYXRhW0wgKyBOICogMyAvIDQgLSAxIC0gaV0sCisgICAgICAgICAgICAgICBwV2luZG93RUxEW04gLyAyIC0gMSAtIGldKQorICAgICAgICAgPDwgKFdUUzAgLSAxKTsKIAotICAgIGZvcihpPTA7aTxOLzQ7aSsrKQotICAgIHsKLSAgICAgIEZJWFBfREJMIHowLCBvdXR2YWw7CisgICAgb3V0dmFsID0gKGZNdWx0RGl2MigoRklYUF9QQ00pdGltZURhdGFbTCArIE4gKiAzIC8gNCAtIDEgLSBpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBXaW5kb3dFTERbTiArIE4gLyAyIC0gMSAtIGldKSA+PgorICAgICAgICAgICAgICAoLVdUUzEpKTsKKyAgICBvdXR2YWwgKz0gKGZNdWx0RGl2MihvdmVybGFwQWRkQnVmZmVyW04gLyAyICsgaV0sIHBXaW5kb3dFTERbMiAqIE4gKyBpXSkgPj4KKyAgICAgICAgICAgICAgICgtV1RTMiAtIDEpKTsKIAotICAgICAgejAgPSAoZk11bHQoKEZJWFBfUENNKXRpbWVEYXRhW0wrTiozLzQtMS1pXSwgcFdpbmRvd0VMRFtOLzItMS1pXSk8PCAoV1RTMC0xKSkgKyAoZk11bHQoKEZJWFBfUENNKXRpbWVEYXRhW0wrTiozLzQraV0sIHBXaW5kb3dFTERbTi8yK2ldKTw8IChXVFMwLTEpKTsKKyAgICBvdmVybGFwQWRkQnVmZmVyW04gLyAyICsgaV0gPQorICAgICAgICBvdmVybGFwQWRkQnVmZmVyW2ldICsKKyAgICAgICAgKGZNdWx0KChGSVhQX1BDTSl0aW1lRGF0YVtMIC0gTiAvIDQgKyBpXSwgcFdpbmRvd0VMRFtOIC8gMiArIGldKQorICAgICAgICAgPDwgKFdUUzAgLSAxKSk7CiAKLSAgICAgIG91dHZhbCAgPSAoZk11bHREaXYyKChGSVhQX1BDTSl0aW1lRGF0YVtMK04qMy80LTEtaV0sIHBXaW5kb3dFTERbTitOLzItMS1pXSkgPj4gKC1XVFMxKSk7Ci0gICAgICBvdXR2YWwgKz0gKGZNdWx0RGl2MigoRklYUF9QQ00pdGltZURhdGFbTCtOKjMvNCtpXSwgcFdpbmRvd0VMRFtOK04vMitpXSkgPj4gKC1XVFMxKSApOwotICAgICAgb3V0dmFsICs9IChmTXVsdERpdjIob3ZlcmxhcEFkZEJ1ZmZlcltOLzIraV0sIHBXaW5kb3dFTERbMipOK2ldKT4+ICgtV1RTMi0xKSk7CisgICAgb3ZlcmxhcEFkZEJ1ZmZlcltpXSA9IHowOworICAgIG1kY3REYXRhW2ldID0gb3ZlcmxhcEFkZEJ1ZmZlcltOIC8gMiArIGldICsKKyAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIob3ZlcmxhcEFkZEJ1ZmZlcltOICsgTiAvIDIgLSAxIC0gaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaW5kb3dFTERbMiAqIE4gKyBOIC8gMiArIGldKSA+PgorICAgICAgICAgICAgICAgICAgICgtV1RTMiAtIDEpKTsKIAotICAgICAgb3ZlcmxhcEFkZEJ1ZmZlcltOLzIraV0gPSBvdmVybGFwQWRkQnVmZmVyW2ldOwotCi0gICAgICBvdmVybGFwQWRkQnVmZmVyW2ldID0gejA7Ci0gICAgICBtZGN0RGF0YVtpXSA9IG92ZXJsYXBBZGRCdWZmZXJbTi8yK2ldICsgKGZNdWx0RGl2MihvdmVybGFwQWRkQnVmZmVyW04rTi8yLTEtaV0sIHBXaW5kb3dFTERbMipOK04vMitpXSkgPj4gKC1XVFMyLTEpKTsKLQotICAgICAgbWRjdERhdGFbTi0xLWldID0gb3V0dmFsOwotICAgICAgb3ZlcmxhcEFkZEJ1ZmZlcltOK04vMi0xLWldID0gb3V0dmFsOwotICAgIH0KLQotICAgIGZvcihpPU4vNDtpPE4vMjtpKyspCi0gICAgewotICAgICAgRklYUF9EQkwgejAsIG91dHZhbDsKLQotICAgICAgejAgPSBmTXVsdCgoRklYUF9QQ00pdGltZURhdGFbTCtOKjMvNC0xLWldLCBwV2luZG93RUxEW04vMi0xLWldKSA8PCAoV1RTMC0xKTsKLQotICAgICAgb3V0dmFsICA9IChmTXVsdERpdjIoKEZJWFBfUENNKXRpbWVEYXRhW0wrTiozLzQtMS1pXSwgcFdpbmRvd0VMRFtOK04vMi0xLWldKSA+PiAoLVdUUzEpKSA7Ci0gICAgICBvdXR2YWwgKz0gKGZNdWx0RGl2MihvdmVybGFwQWRkQnVmZmVyW04vMitpXSwgcFdpbmRvd0VMRFsyKk4raV0pID4+ICgtV1RTMi0xKSk7Ci0KLSAgICAgIG92ZXJsYXBBZGRCdWZmZXJbTi8yK2ldID0gb3ZlcmxhcEFkZEJ1ZmZlcltpXSArIChmTXVsdCgoRklYUF9QQ00pdGltZURhdGFbTC1OLzQraV0sIHBXaW5kb3dFTERbTi8yK2ldKTw8IChXVFMwLTEpICk7Ci0KLSAgICAgIG92ZXJsYXBBZGRCdWZmZXJbaV0gPSB6MDsKLSAgICAgIG1kY3REYXRhW2ldID0gb3ZlcmxhcEFkZEJ1ZmZlcltOLzIraV0gKyAoZk11bHREaXYyKG92ZXJsYXBBZGRCdWZmZXJbTitOLzItMS1pXSwgcFdpbmRvd0VMRFsyKk4rTi8yK2ldKSA+PiAoLVdUUzItMSkpOwotCi0gICAgICBtZGN0RGF0YVtOLTEtaV0gPSBvdXR2YWw7Ci0gICAgICBvdmVybGFwQWRkQnVmZmVyW04rTi8yLTEtaV0gPSBvdXR2YWw7Ci0gICAgfQorICAgIG1kY3REYXRhW04gLSAxIC0gaV0gPSBvdXR2YWw7CisgICAgb3ZlcmxhcEFkZEJ1ZmZlcltOICsgTiAvIDIgLSAxIC0gaV0gPSBvdXR2YWw7CiAgIH0KLQotICBkY3RfSVYobWRjdERhdGEsIHRsLCBtZGN0RGF0YV9lKTsKKyAgZGN0X0lWKG1kY3REYXRhLCBmcmFtZUxlbmd0aCwgbWRjdERhdGFfZSk7CiAKICAgKnByZXZXaW5kb3dTaGFwZSA9IHdpbmRvd1NoYXBlOwogCiAgIHJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3RyYW5zZm9ybS5oIGIvbGliQUFDZW5jL3NyYy90cmFuc2Zvcm0uaAppbmRleCA1MDUzMTc0Li44ZjVmZjQ2IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3RyYW5zZm9ybS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvdHJhbnNmb3JtLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTggKzkwLDIwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IE1EQ1QgVHJhbnNmb3JtCisgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBNRENUIFRyYW5zZm9ybQogCi0jaWZuZGVmIF9UUkFOU0ZPUk1fSAotI2RlZmluZSBfVFJBTlNGT1JNX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgVFJBTlNGT1JNX0gKKyNkZWZpbmUgVFJBTlNGT1JNX0gKKworI2luY2x1ZGUgIm1kY3QuaCIKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKICNkZWZpbmUgV1RTMCAxCkBAIC0xMDUsMTkgKzExOCw0NiBAQAogICogICAgICAgIExPTkdfV0lORE9XLCBTVEFSVF9XSU5ET1csIFNIT1JUX1dJTkRPVyBvciBTVE9QX1dJTkRPVy4KICAqIFxwYXJhbSB3aW5kb3dTaGFwZSBpbmRleCBpbmRpY2F0aW5nIHRoZSB3aW5kb3cgc2xvcGUgdHlwZSB0byBiZSB1c2VkLgogICogICAgICAgIFZhbHVlcyBhbGxvd2VkIGFyZSBlaXRoZXIgU0lORV9XSU5ET1cgb3IgS0JEX1dJTkRPVy4KLSAqIFxwYXJhbSBmcmFtZUxlbmd0aCBsZW5ndGggb2YgdGhlIGJsb2NrLgorICogXHBhcmFtIHByZXZpbmRvd1NoYXBlIGluZGV4IGluZGljYXRpbmcgdGhlIHdpbmRvdyBzbG9wZSB0eXBlIHVzZWQKKyAqICAgICAgICBpbiB0aGUgbGFzdCBmcmFtZS4KKyAqICAgICAgICBWYWx1ZXMgYWxsb3dlZCBhcmUgZWl0aGVyIFNJTkVfV0lORE9XIG9yIEtCRF9XSU5ET1cuCisgKiBccGFyYW0gZnJhbWVMZW5ndGggbGVuZ3RoIG9mIHRoZSBibG9jay4gRWl0aGVyIDEwMjQgb3IgOTYwLgogICogXHBhcmFtIG1kY3REYXRhX2UgcG9pbnRlciB0byBhbiBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSBmcmVxdWVuY3kKICAqICAgICAgICBkb21haW4gb3V0cHV0IGRhdGEgaXMgc3RvcmVkIGludG8uCi0gKiBccmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBub24temVybyBpbiBjYXNlIG9mIGVycm9yIChpbmNvbnNpc3RlbnQgcGFyYW1ldGVycykuCisgKiBccGFyYW0gZmlsdGVyVHlwZSB4eHgKKyAqIFxyZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIGluIGNhc2Ugb2YgZXJyb3IgKGluY29uc2lzdGVudAorICogcGFyYW1ldGVycykuCiAgKi8KLUlOVCBGREthYWNFbmNfVHJhbnNmb3JtX1JlYWwgKGNvbnN0IElOVF9QQ00gKnRpbWVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3REYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB3aW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcHJldldpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptZGN0RGF0YV9lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZpbHRlclR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEZJWFBfREJMICogUkVTVFJJQ1Qgb3ZlcmxhcEFkZEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotI2VuZGlmCitJTlQgRkRLYWFjRW5jX1RyYW5zZm9ybV9SZWFsKGNvbnN0IElOVF9QQ00qIHBUaW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIFJFU1RSSUNUIG1kY3REYXRhLCBjb25zdCBJTlQgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgd2luZG93U2hhcGUsIElOVCogcHJldldpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIX01EQ1QgbWRjdFBlcnMsIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiBwTWRjdERhdGFfZSwgSU5UIGZpbHRlclR5cGUpOworCisvKioKKyAqIFxicmllZjogUGVyZm9ybWUgRUxEIGZpbHRlcmJuYW5rIHRyYW5zZm9ybSBvZiB0aW1lIGRvbWFpbiBkYXRhLgorICogXHBhcmFtIHRpbWVEYXRhIHBvaW50ZXIgdG8gdGltZSBkb21haW4gaW5wdXQgc2lnbmFsLgorICogXHBhcmFtIG1kY3REYXRhIHBvaW50ZXIgdG8gc3RvcmUgZnJlcXVlbmN5IGRvbWFpbiBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSBibG9ja1R5cGUgaW5kZXggaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBibG9jay4gRWl0aGVyCisgKiAgICAgICAgTE9OR19XSU5ET1csIFNUQVJUX1dJTkRPVywgU0hPUlRfV0lORE9XIG9yIFNUT1BfV0lORE9XLgorICogXHBhcmFtIHdpbmRvd1NoYXBlIGluZGV4IGluZGljYXRpbmcgdGhlIHdpbmRvdyBzbG9wZSB0eXBlIHRvIGJlIHVzZWQuCisgKiAgICAgICAgVmFsdWVzIGFsbG93ZWQgYXJlIGVpdGhlciBTSU5FX1dJTkRPVyBvciBLQkRfV0lORE9XLgorICogXHBhcmFtIHByZXZpbmRvd1NoYXBlIGluZGV4IGluZGljYXRpbmcgdGhlIHdpbmRvdyBzbG9wZSB0eXBlIHVzZWQKKyAqICAgICAgICBpbiB0aGUgbGFzdCBmcmFtZS4KKyAqICAgICAgICBWYWx1ZXMgYWxsb3dlZCBhcmUgZWl0aGVyIFNJTkVfV0lORE9XIG9yIEtCRF9XSU5ET1cuCisgKiBccGFyYW0gZnJhbWVMZW5ndGggbGVuZ3RoIG9mIHRoZSBibG9jay4gRWl0aGVyIDEwMjQgb3IgOTYwLgorICogXHBhcmFtIG1kY3REYXRhX2UgcG9pbnRlciB0byBhbiBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSBmcmVxdWVuY3kKKyAqICAgICAgICBkb21haW4gb3V0cHV0IGRhdGEgaXMgc3RvcmVkIGludG8uCisgKiBccGFyYW0gZmlsdGVyVHlwZSB4eHgKKyAqIFxwYXJhbSBvdmVybGFwQWRkQnVmZmVyIG92ZXJsYXAgYWRkIGJ1ZmZlciBmb3Igb3ZlcmxhcCBvZiBFTEQgZmlsdGVyYmFuaworICogXHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gaW4gY2FzZSBvZiBlcnJvciAoaW5jb25zaXN0ZW50CisgKiBwYXJhbWV0ZXJzKS4KKyAqLworSU5UIEZES2FhY0VuY19UcmFuc2Zvcm1fUmVhbF9FbGQoY29uc3QgSU5UX1BDTSogcFRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIFJFU1RSSUNUIG1kY3REYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZSwgY29uc3QgSU5UIHdpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiBwcmV2V2luZG93U2hhcGUsIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogbWRjdERhdGFfZSwgSU5UIGZpbHRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogUkVTVFJJQ1Qgb3ZlcmxhcEFkZEJ1ZmZlcik7CisKKyNlbmRpZiAvKiAjIWRlZmluZWQgKFRSQU5TRk9STV9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliQXJpdGhDb2RpbmcvaW5jbHVkZS9hY19hcml0aF9jb2Rlci5oIGIvbGliQXJpdGhDb2RpbmcvaW5jbHVkZS9hY19hcml0aF9jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMGMxODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBcml0aENvZGluZy9pbmNsdWRlL2FjX2FyaXRoX2NvZGVyLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEFyaXRobWV0aWMgY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE9saXZlciBXZWlzcworCisgICBEZXNjcmlwdGlvbjogSW50ZXJmYWNlIGZvciBTcGVjdHJhbCBOb2lzZWxlc3MgQ29kaW5nIFNjaGVtZSBiYXNlZCBvbiBhbgorICAgICAgICAgICAgICAgIEFyaXRobWV0aWMgQ29kZXIgaW4gQ29uanVuY3Rpb24gd2l0aCBhbiBBZGFwdGl2ZSBDb250ZXh0CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQUNfQVJJVEhfQ09ERVJfSAorI2RlZmluZSBBQ19BUklUSF9DT0RFUl9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCisKK3R5cGVkZWYgZW51bSB7IEFSSVRIX0NPREVSX09LID0gMCwgQVJJVEhfQ09ERVJfRVJST1IgPSA1IH0gQVJJVEhfQ09ESU5HX0VSUk9SOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNIT1JUIG1fbnVtYmVyTGluZXNQcmV2OworICBVQ0hBUiBjX3ByZXZbKDEwMjQgLyAyKSArIDRdOyAvKiAyLXR1cGxlIGNvbnRleHQgb2YgcHJldmlvdXMgZnJhbWUsIDQgYml0ICovCit9IENBcmNvRGF0YTsKKworLyogcHJvdG90eXBlcyAqLworCitDQXJjb0RhdGEgKkNBcmNvX0NyZWF0ZSh2b2lkKTsKKwordm9pZCBDQXJjb19EZXN0cm95KENBcmNvRGF0YSAqcEFyY29EYXRhKTsKKworLyoqCisgKiBcYnJpZWYgZGVjb2RlIGEgc3BlY3RyYWwgZGF0YSBlbGVtZW50IGJ5IHVzaW5nIGFuIGFkYXB0aXZlIGNvbnRleHQgZGVwZW5kZW50CisgKiBhcml0aG1ldGljIGNvZGluZyBzY2hlbWUKKyAqIFxwYXJhbSBoQnMgYml0IHN0cmVhbSBoYW5kbGUKKyAqIFxwYXJhbSBzcGVjdHJ1bSBwb2ludGVyIHRvIHF1YW50aXplZCBkYXRhIG91dHB1dC4KKyAqIFxwYXJhbSBsZyBudW1iZXIgb2YgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyAob3V0cHV0IGJ5IHRoZSBhcml0aG1ldGljCisgKiBkZWNvZGVyKS4KKyAqIFxwYXJhbSBsZ19tYXggbWF4IG51bWJlciBvZiBxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzLgorICogXHBhcmFtIGFyaXRoX3Jlc2V0X2ZsYWcgZmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgdGhlIHNwZWN0cmFsIG5vaXNlbGVzcworICogY29udGV4dCBtdXN0IGJlIHJlc2V0CisgKiBccmV0dXJuIHZvaWQKKyAqLworQVJJVEhfQ09ESU5HX0VSUk9SIENBcmNvX0RlY29kZUFyaXRoRGF0YShDQXJjb0RhdGEgKnBBcmNvRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc3BlY3RydW0sIGludCBsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxnX21heCwgaW50IGFyaXRoX3Jlc2V0X2ZsYWcpOworCisjZW5kaWYgLyogQUNfQVJJVEhfQ09ERVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQXJpdGhDb2Rpbmcvc3JjL2FjX2FyaXRoX2NvZGVyLmNwcCBiL2xpYkFyaXRoQ29kaW5nL3NyYy9hY19hcml0aF9jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5MWYzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFyaXRoQ29kaW5nL3NyYy9hY19hcml0aF9jb2Rlci5jcHAKQEAgLTAsMCArMSw3NzcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEFyaXRobWV0aWMgY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIFlvdWxpeSBOaW5vdiwgT2xpdmVyIFdlaXNzCisKKyAgIERlc2NyaXB0aW9uOiBEZWZpbml0aW9uIG9mIFNwZWN0cmFsIE5vaXNlbGVzcyBDb2RpbmcgU2NoZW1lIGJhc2VkIG9uIGFuCisgICAgICAgICAgICAgICAgQXJpdGhtZXRpYyBDb2RlciBpbiBDb25qdW5jdGlvbiB3aXRoIGFuIEFkYXB0aXZlIENvbnRleHQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImFjX2FyaXRoX2NvZGVyLmgiCisKKyNkZWZpbmUgY2JpdHNuZXcgMTYKKyNkZWZpbmUgc3RhdF9iaXRzbmV3IDE0CisjZGVmaW5lIGFyaV9xNG5ldyAoKChsb25nKTEgPDwgY2JpdHNuZXcpIC0gMSkgLyogMHhGRkZGICovCisjZGVmaW5lIGFyaV9xMW5ldyAoYXJpX3E0bmV3IC8gNCArIDEpICAgICAgICAgLyogMHg0MDAwICovCisjZGVmaW5lIGFyaV9xMm5ldyAoMiAqIGFyaV9xMW5ldykgICAgICAgICAgICAgLyogMHg4MDAwICovCisjZGVmaW5lIGFyaV9xM25ldyAoMyAqIGFyaV9xMW5ldykgICAgICAgICAgICAgLyogMHhDMDAwICovCisKKyNkZWZpbmUgVkFMX0VTQyAxNgorCisvKiBBcml0aG1ldGljIGNvZGVyIGxpYnJhcnkgaW5mbyAqLworI2RlZmluZSBBQ19MSUJfVkwwIDIKKyNkZWZpbmUgQUNfTElCX1ZMMSAwCisjZGVmaW5lIEFDX0xJQl9WTDIgMAorI2RlZmluZSBBQ19MSUJfVElUTEUgIkFyaXRobWV0aWMgQ29kZXIgTGliIgorI2lmZGVmIF9fQU5EUk9JRF9fCisjZGVmaW5lIEFDX0xJQl9CVUlMRF9EQVRFICIiCisjZGVmaW5lIEFDX0xJQl9CVUlMRF9USU1FICIiCisjZWxzZQorI2RlZmluZSBBQ19MSUJfQlVJTERfREFURSBfX0RBVEVfXworI2RlZmluZSBBQ19MSUJfQlVJTERfVElNRSBfX1RJTUVfXworI2VuZGlmCisKK2NvbnN0IFNIT1JUIGFyaV9sc2IyWzNdWzRdID0geworICAgIHsxMjU3MSwgMTA1NjksIDM2OTYsIDB9LCB7MTI2NjEsIDU3MDAsIDM3NTEsIDB9LCB7MTA4MjcsIDY4ODQsIDI5MjksIDB9fTsKKworSF9BTExPQ19NRU0oQXJjb0RhdGEsIENBcmNvRGF0YSkKKy8qISBUaGUgc3RydWN0dXJlIEFyY29EYXRhIGNvbnRhaW5zIDItdHVwbGUgY29udGV4dCBvZiBwcmV2aW91cyBmcmFtZS4gPGJyPgorICAgIERpbWVuc2lvbjogMSAqLworQ19BTExPQ19NRU0oQXJjb0RhdGEsIENBcmNvRGF0YSwgMSkKKworLyoKKyAgIFRoaXMgZGVmaW5lIHRyaWdnZXJzIHRoZSB1c2Ugb2YgdGhlIHByZS1rbm93biByZXR1cm4gdmFsdWVzIG9mIGZ1bmN0aW9uCisgICBnZXRfcGtfdjIoKSBmb3IgdGhlIGNhc2VzLCB3aGVyZSBwYXJhbWV0ZXIgcyBpcyBpbiByYW5nZQorICAgMHgwMDAwMDAwMC4uMHgwMDAwMDAwRi4gTm90ZTogVGhlc2UgMTYgYnl0ZXMgaGF2ZSBiZWVuIG1vdmVkIGludG8gdGhlIGZpcnN0IDQKKyAgIGVudHJpZXMgb2YgYXJpX21lcmdlZF9oYXNoX3BzIHRoYXQgYXJlIG5vIG1vcmUgcmVmZXJlbmNlZC4KKyovCisKK3N0YXRpYyBjb25zdCBVTE9ORyBhcmlfbWVyZ2VkX2hhc2hfcHNbNzQyXSA9IHsKKyAgICAweDAwMDAxMDQ0VUwsIDB4MDAwMDNEMEFVTCwgMHgwMDAwNTM1MFVMLCAweDAwMDA3NEQ2VUwsIDB4MDAwMEE0OUZVTCwKKyAgICAweDAwMDBGOTZFVUwsIDB4MDAxMTEwMDBVTCwgMHgwMTExMUU4M1VMLCAweDAxMTEzMTQ2VUwsIDB4MDExMTQwMzZVTCwKKyAgICAweDAxMTE2ODYzVUwsIDB4MDExMTk0RTlVTCwgMHgwMTExRjdFRVVMLCAweDAxMTIyNjlCVUwsIDB4MDExMjQ3NzVVTCwKKyAgICAweDAxMTI2REExVUwsIDB4MDExMkQ5MTJVTCwgMHgwMTEzMUFGMFVMLCAweDAxMTMzNkREVUwsIDB4MDExMzVDRjVVTCwKKyAgICAweDAxMTM5REY4VUwsIDB4MDExNDFBNUJVTCwgMHgwMTE0NDc3M1VMLCAweDAxMTQ2Q0Y1VUwsIDB4MDExNEZERTlVTCwKKyAgICAweDAxMTY2Q0Y1VUwsIDB4MDExNkZERTRVTCwgMHgwMTE3NENGM1VMLCAweDAxMUZGRENGVUwsIDB4MDEyMTFDQzJVTCwKKyAgICAweDAxMjEzQjJEVUwsIDB4MDEyMTQwMzZVTCwgMHgwMTIxNjg2M1VMLCAweDAxMjE5NEQyVUwsIDB4MDEyMjE5N0ZVTCwKKyAgICAweDAxMjIzQUFEVUwsIDB4MDEyMjQwMzZVTCwgMHgwMTIyNjg3OFVMLCAweDAxMjJBOTI5VUwsIDB4MDEyMkY0QUJVTCwKKyAgICAweDAxMjMyQjJEVUwsIDB4MDEyMzQ3QjZVTCwgMHgwMTIzN0RGOFVMLCAweDAxMjNCOTI5VUwsIDB4MDEyNDE3RERVTCwKKyAgICAweDAxMjQ1RDc2VUwsIDB4MDEyNDlERjhVTCwgMHgwMTI0RjkxMlVMLCAweDAxMjU1RDc1VUwsIDB4MDEyNUZERTlVTCwKKyAgICAweDAxMjY1RDc1VUwsIDB4MDEyQjhERjdVTCwgMHgwMTMxMUUyQVVMLCAweDAxMzEzQjVFVUwsIDB4MDEzMTY4N0JVTCwKKyAgICAweDAxMzIxQTZEVUwsIDB4MDEzMjM3QkNVTCwgMHgwMTMyNjg2M1VMLCAweDAxMzJGNEVFVUwsIDB4MDEzMzJCNUVVTCwKKyAgICAweDAxMzM1REExVUwsIDB4MDEzMzhFMjRVTCwgMHgwMTM0MUE1RVVMLCAweDAxMzQzREI2VUwsIDB4MDEzNDhERjhVTCwKKyAgICAweDAxMzUxOTM1VUwsIDB4MDEzNTVEQjdVTCwgMHgwMTM1RkUxMlVMLCAweDAxMzc2REY3VUwsIDB4MDEzRkZFMjlVTCwKKyAgICAweDAxNDAwMDI0VUwsIDB4MDE0MjM4MjFVTCwgMHgwMTQzMThGNlVMLCAweDAxNDMzODIxVUwsIDB4MDE0M0Y4RTVVTCwKKyAgICAweDAxNDQzREExVUwsIDB4MDE0ODZFMzhVTCwgMHgwMTRGRjkyOVVMLCAweDAxNTQzRUUzVUwsIDB4MDE1RkY5MTJVTCwKKyAgICAweDAxNkYyOThDVUwsIDB4MDE4QTVBNjlVTCwgMHgwMjEwMDdGMVVMLCAweDAyMTEyQzJDVUwsIDB4MDIxMTRCNDhVTCwKKyAgICAweDAyMTE3MzUzVUwsIDB4MDIxMUY0QUVVTCwgMHgwMjEyMkZFQVVMLCAweDAyMTI0QjQ4VUwsIDB4MDIxMjc4NTBVTCwKKyAgICAweDAyMTJGNzJFVUwsIDB4MDIxMzNBOUVVTCwgMHgwMjEzNDAzNlVMLCAweDAyMTM4ODY0VUwsIDB4MDIxNDE0QURVTCwKKyAgICAweDAyMTQzNzlFVUwsIDB4MDIxNDVEQjZVTCwgMHgwMjE0RkUxRlVMLCAweDAyMTY2REI3VUwsIDB4MDIyMDBEQzRVTCwKKyAgICAweDAyMjEyRkVBVUwsIDB4MDIyMTQ3QTBVTCwgMHgwMjIxODM2OVVMLCAweDAyMjFGN0VFVUwsIDB4MDIyMjJBQURVTCwKKyAgICAweDAyMjI0Nzg4VUwsIDB4MDIyMjY4NjNVTCwgMHgwMjIyOTkyOVVMLCAweDAyMjJGNEFCVUwsIDB4MDIyMzJBOUVVTCwKKyAgICAweDAyMjM0RjA4VUwsIDB4MDIyMzc4NjRVTCwgMHgwMjIzQTkyOVVMLCAweDAyMjQxN0RFVUwsIDB4MDIyNDRGMzZVTCwKKyAgICAweDAyMjQ4ODYzVUwsIDB4MDIyNTFBNzRVTCwgMHgwMjI1NkRBMVVMLCAweDAyMjVGRTEyVUwsIDB4MDIyNjNEQjZVTCwKKyAgICAweDAyMjc2REY3VUwsIDB4MDIyRkZFMjlVTCwgMHgwMjMxMTg2RFVMLCAweDAyMzEzN0JDVUwsIDB4MDIzMTQwMjBVTCwKKyAgICAweDAyMzE5RUQ2VUwsIDB4MDIzMjE5NkRVTCwgMHgwMjMyMzdCQ1VMLCAweDAyMzI1ODA5VUwsIDB4MDIzMjk0MjlVTCwKKyAgICAweDAyMzMxN0VEVUwsIDB4MDIzMzNGMDhVTCwgMHgwMjMzNTgwOVVMLCAweDAyMzM3OEU0VUwsIDB4MDIzNDFBN0NVTCwKKyAgICAweDAyMzQ0MjIxVUwsIDB4MDIzNEE4RDNVTCwgMHgwMjM1MTRCQ1VMLCAweDAyMzU0MjIxVUwsIDB4MDIzNUY4REZVTCwKKyAgICAweDAyMzY0ODYxVUwsIDB4MDIzRkZFMjlVTCwgMHgwMjQwMDAyNFVMLCAweDAyNDE1ODNCVUwsIDB4MDI0MjE0QzhVTCwKKyAgICAweDAyNDI0ODA5VUwsIDB4MDI0MjdFRTZVTCwgMHgwMjQzMTcwOFVMLCAweDAyNDM0ODA5VUwsIDB4MDI0MzZFRDBVTCwKKyAgICAweDAyNDQxQTc2VUwsIDB4MDI0NDM4MjFVTCwgMHgwMjQ0NThFM1VMLCAweDAyNDRGOTFGVUwsIDB4MDI0NTQ4NjNVTCwKKyAgICAweDAyNDYxOTBBVUwsIDB4MDI0NjQ4NjNVTCwgMHgwMjRGRjkyOVVMLCAweDAyNTI1RUQwVUwsIDB4MDI1MzE0RTFVTCwKKyAgICAweDAyNTM0OEZCVUwsIDB4MDI1NDE5QTFVTCwgMHgwMjU0NThEMFVMLCAweDAyNTRGNEU1VUwsIDB4MDI1NTI4NjFVTCwKKyAgICAweDAyNUZGOTEyVUwsIDB4MDI2NjU5OTNVTCwgMHgwMjdGNUE2OVVMLCAweDAyOUYxNDgxVUwsIDB4MDJDRjI4QTRVTCwKKyAgICAweDAzMTAwQUYwVUwsIDB4MDMxMTIwQUFVTCwgMHgwMzExNDdBMFVMLCAweDAzMTE4MzU2VUwsIDB4MDMxMjE3RUNVTCwKKyAgICAweDAzMTIzQjVFVUwsIDB4MDMxMjQwMDhVTCwgMHgwMzEyNzM1MFVMLCAweDAzMTMxNEFBVUwsIDB4MDMxMzIwMUVVTCwKKyAgICAweDAzMTM0RjA4VUwsIDB4MDMxMzY4NjNVTCwgMHgwMzE0MUE1RVVMLCAweDAzMTQzRjNDVUwsIDB4MDMyMDA4NDdVTCwKKyAgICAweDAzMjEyQUFEVUwsIDB4MDMyMTRGMjBVTCwgMHgwMzIxOEVENlVMLCAweDAzMjIxOEFEVUwsIDB4MDMyMjM3QkNVTCwKKyAgICAweDAzMjI1ODA5VUwsIDB4MDMyMjk0MTZVTCwgMHgwMzIzMTdFRFVMLCAweDAzMjM0RjIwVUwsIDB4MDMyMzczNTBVTCwKKyAgICAweDAzMjNGQTZCVUwsIDB4MDMyNDNGMDhVTCwgMHgwMzI0Njg2M1VMLCAweDAzMjRGOTI1VUwsIDB4MDMyNTQyMjFVTCwKKyAgICAweDAzMjVGOERGVUwsIDB4MDMyNjQ4MjFVTCwgMHgwMzJGRkUyOVVMLCAweDAzMzExRTQ3VUwsIDB4MDMzMTNGMDhVTCwKKyAgICAweDAzMzE1ODBEVUwsIDB4MDMzMjE0REVVTCwgMHgwMzMyM0YwOFVMLCAweDAzMzI0MDIwVUwsIDB4MDMzMjYzNTBVTCwKKyAgICAweDAzMzI5NEU5VUwsIDB4MDMzMzE3REVVTCwgMHgwMzMzM0YwOFVMLCAweDAzMzM2MjdCVUwsIDB4MDMzM0E5QTlVTCwKKyAgICAweDAzMzQxN0ZDVUwsIDB4MDMzNDMyMjBVTCwgMHgwMzM0NjI3QlVMLCAweDAzMzRBOUE5VUwsIDB4MDMzNTE0OEFVTCwKKyAgICAweDAzMzUzMjIwVUwsIDB4MDMzNTg4RTRVTCwgMHgwMzM2MUE0QVVMLCAweDAzMzYzODIxVUwsIDB4MDMzNkY4RDJVTCwKKyAgICAweDAzMzc2ODYzVUwsIDB4MDM0MTE5MzlVTCwgMHgwMzQxNTgzQlVMLCAweDAzNDIxNEM4VUwsIDB4MDM0MjQ4MDlVTCwKKyAgICAweDAzNDI2RUQwVUwsIDB4MDM0MzE1ODhVTCwgMHgwMzQzNDgwOVVMLCAweDAzNDM2RUQwVUwsIDB4MDM0NDFBNDhVTCwKKyAgICAweDAzNDQ0ODBEVUwsIDB4MDM0NDZFRDBVTCwgMHgwMzQ1MUE0QVVMLCAweDAzNDUzODA5VUwsIDB4MDM0NTVFRkJVTCwKKyAgICAweDAzNDYxNENBVUwsIDB4MDM0NjM4NDlVTCwgMHgwMzRGODkyNFVMLCAweDAzNTAwQTY5VUwsIDB4MDM1MjUyRDBVTCwKKyAgICAweDAzNTMxNEUwVUwsIDB4MDM1MzMyNERVTCwgMHgwMzUzNUVEMFVMLCAweDAzNTQxNEUwVUwsIDB4MDM1NDMyNERVTCwKKyAgICAweDAzNTQ1RUQwVUwsIDB4MDM1NEY0RThVTCwgMHgwMzU1Mzg0RFVMLCAweDAzNTU1RUQwVUwsIDB4MDM1NUY0REZVTCwKKyAgICAweDAzNTY0MzUwVUwsIDB4MDM1OTY5QTZVTCwgMHgwMzVGRkE1MlVMLCAweDAzNjY0OUE2VUwsIDB4MDM2RkZBNTJVTCwKKyAgICAweDAzN0Y0RjY2VUwsIDB4MDM5RDc0OTJVTCwgMHgwM0JGNjg5MlVMLCAweDAzREY4QTFGVUwsIDB4MDQxMDBCODRVTCwKKyAgICAweDA0MTEyMTA3VUwsIDB4MDQxMTUyMERVTCwgMHgwNDEyMTRFQVVMLCAweDA0MTI0RjIwVUwsIDB4MDQxMzFFREVVTCwKKyAgICAweDA0MTMzRjA4VUwsIDB4MDQxMzU4MDlVTCwgMHgwNDEzRjQyQlVMLCAweDA0MTQyRjA4VUwsIDB4MDQyMDA4NDdVTCwKKyAgICAweDA0MjEyMUZDVUwsIDB4MDQyMTQyMDlVTCwgMHgwNDIyMTQwN1VMLCAweDA0MjIyMDNDVUwsIDB4MDQyMjQyMDlVTCwKKyAgICAweDA0MjI2MzUwVUwsIDB4MDQyMzFBN0NVTCwgMHgwNDIzNDIwOVVMLCAweDA0MjM2MzdCVUwsIDB4MDQyNDFBN0NVTCwKKyAgICAweDA0MjQzMjIwVUwsIDB4MDQyNDYyN0JVTCwgMHgwNDI1MTRDOFVMLCAweDA0MjU0ODA5VUwsIDB4MDQyRkY4RTlVTCwKKyAgICAweDA0MzExRTQ3VUwsIDB4MDQzMTMyMjBVTCwgMHgwNDMxNTI3QlVMLCAweDA0MzIxNEZDVUwsIDB4MDQzMjMyMjBVTCwKKyAgICAweDA0MzI2MjUwVUwsIDB4MDQzMzE1QkNVTCwgMHgwNDMzMzIyMFVMLCAweDA0MzM1MjdCVUwsIDB4MDQzMzg0MTNVTCwKKyAgICAweDA0MzQxNDg4VUwsIDB4MDQzNDQ4MDlVTCwgMHgwNDM0NkVEMFVMLCAweDA0MzUxRjQ4VUwsIDB4MDQzNTUyN0JVTCwKKyAgICAweDA0MzVGOUE1VUwsIDB4MDQzNjM4MDlVTCwgMHgwNDM3NUVGQlVMLCAweDA0M0ZGOTI5VUwsIDB4MDQ0MTJFNzlVTCwKKyAgICAweDA0NDE0MjdCVUwsIDB4MDQ0MjE5QjlVTCwgMHgwNDQyMzgwOVVMLCAweDA0NDI1MzdCVUwsIDB4MDQ0MzE0QzhVTCwKKyAgICAweDA0NDMyMDIwVUwsIDB4MDQ0MzUyN0JVTCwgMHgwNDQ0MTRDQVVMLCAweDA0NDQzODA5VUwsIDB4MDQ0NDUzN0JVTCwKKyAgICAweDA0NDQ4OTkzVUwsIDB4MDQ0NTE0OEFVTCwgMHgwNDQ1MzgwOVVMLCAweDA0NDU1RUQwVUwsIDB4MDQ0NUY0RTVVTCwKKyAgICAweDA0NDYzODREVUwsIDB4MDQ1MDA5QTZVTCwgMHgwNDUyNzJEM1VMLCAweDA0NTMxNEEwVUwsIDB4MDQ1MzMyNERVTCwKKyAgICAweDA0NTM1RUQwVUwsIDB4MDQ1NDE1QTBVTCwgMHgwNDU0MzI0RFVMLCAweDA0NTQ1RUQwVUwsIDB4MDQ1NTFGNjBVTCwKKyAgICAweDA0NTUzMjREVUwsIDB4MDQ1NjI5ODlVTCwgMHgwNDU2NDM1MFVMLCAweDA0NUZGNEQyVUwsIDB4MDQ2NjU5OTNVTCwKKyAgICAweDA0N0ZGRjYyVUwsIDB4MDQ4RkY3MjVVTCwgMHgwNDlGNDRCRFVMLCAweDA0QkZCN0U1VUwsIDB4MDRFRjhBMjVVTCwKKyAgICAweDA0RkZGQjk4VUwsIDB4MDUxMTMxRjlVTCwgMHgwNTEyMTJDN1VMLCAweDA1MTM0MjA5VUwsIDB4MDUyMDAyNDdVTCwKKyAgICAweDA1MjExMDA3VUwsIDB4MDUyMTNFNjBVTCwgMHgwNTIyMTJDN1VMLCAweDA1MjI0MjA5VUwsIDB4MDUyMzE5QkNVTCwKKyAgICAweDA1MjMzMjIwVUwsIDB4MDUyMzUyN0JVTCwgMHgwNTI0MTRDOFVMLCAweDA1MjQzODIwVUwsIDB4MDUzMTEyRjlVTCwKKyAgICAweDA1MzEzRTQ5VUwsIDB4MDUzMjE0MzlVTCwgMHgwNTMyM0U0OVVMLCAweDA1MzI1MzdCVUwsIDB4MDUzMzE0QzhVTCwKKyAgICAweDA1MzM0ODBEVUwsIDB4MDUzMzc0MTNVTCwgMHgwNTM0MTQ4OFVMLCAweDA1MzQ1MjdCVUwsIDB4MDUzNEY0RUJVTCwKKyAgICAweDA1MzUzODA5VUwsIDB4MDUzNTZFRDBVTCwgMHgwNTM1RjRFNVVMLCAweDA1MzY0MjdCVUwsIDB4MDU0MTE5QjlVTCwKKyAgICAweDA1NDIxMkY5VUwsIDB4MDU0MjMyNDlVTCwgMHgwNTQyNkVEM1VMLCAweDA1NDMxNzM5VUwsIDB4MDU0MzMyNDlVTCwKKyAgICAweDA1NDM1RUQwVUwsIDB4MDU0M0Y0RUJVTCwgMHgwNTQ0MzgwOVVMLCAweDA1NDQ1RUQwVUwsIDB4MDU0NEY0RThVTCwKKyAgICAweDA1NDUzMjREVUwsIDB4MDU0RkY5OTJVTCwgMHgwNTUzNjJEM1VMLCAweDA1NTNGNUFCVUwsIDB4MDU1NDQzNTBVTCwKKyAgICAweDA1NTUxNENBVUwsIDB4MDU1NTQyN0JVTCwgMHgwNTU1RjRFNVVMLCAweDA1NTYzMjdCVUwsIDB4MDU1RkY0RDJVTCwKKyAgICAweDA1NjY1OTkzVUwsIDB4MDU3NzRGNTNVTCwgMHgwNTlGRjcyOFVMLCAweDA1Q0MzN0ZEVUwsIDB4MDVFRkJBMjhVTCwKKyAgICAweDA1RkZGQjk4VUwsIDB4MDYxMTMxRjlVTCwgMHgwNjEyMTQwN1VMLCAweDA2MTMzRTYwVUwsIDB4MDYxQTcyRTRVTCwKKyAgICAweDA2MjExRTQ3VUwsIDB4MDYyMTRFNEJVTCwgMHgwNjIyMTRDN1VMLCAweDA2MjIzRTYwVUwsIDB4MDYyMzEyRjlVTCwKKyAgICAweDA2MjMzRTYwVUwsIDB4MDYzMTEyRjlVTCwgMHgwNjMxM0U0Q1VMLCAweDA2MzIxOUI5VUwsIDB4MDYzMjNFNDlVTCwKKyAgICAweDA2MzMxNDM5VUwsIDB4MDYzMzM4MDlVTCwgMHgwNjMzNkVFNlVMLCAweDA2MzNGNUFCVUwsIDB4MDYzNDM4MDlVTCwKKyAgICAweDA2MzRGNDJCVUwsIDB4MDYzNTQyN0JVTCwgMHgwNjNGRjk5MlVMLCAweDA2NDM0MkZCVUwsIDB4MDY0M0Y0RUJVTCwKKyAgICAweDA2NDQ0MjdCVUwsIDB4MDY0NTI0QzlVTCwgMHgwNjY1NTk5M1VMLCAweDA2NjYxNzBBVUwsIDB4MDY2NjUyRTZVTCwKKyAgICAweDA2N0E2RjU2VUwsIDB4MDY5ODQ3M0RVTCwgMHgwNkNGNjdEMlVMLCAweDA2RUYzQTI2VUwsIDB4MDZGRkZBRDhVTCwKKyAgICAweDA3MTEzMUNDVUwsIDB4MDcyMTEzMDdVTCwgMHgwNzIyMkU3OVVMLCAweDA3MjI5MkRDVUwsIDB4MDcyMzRFNEJVTCwKKyAgICAweDA3MzExMkY5VUwsIDB4MDczMjIzMzlVTCwgMHgwNzM2MzJDQlVMLCAweDA3M0ZGOTkyVUwsIDB4MDc0NDMyQ0JVTCwKKyAgICAweDA3NTU0OUE2VUwsIDB4MDc3NkZGNjhVTCwgMHgwNzc3NDM1MFVMLCAweDA3ODg0NzNEVUwsIDB4MDdDRjQ1MTZVTCwKKyAgICAweDA3RUYzQTI2VUwsIDB4MDdGRkZBRDhVTCwgMHgwODIyMkU3OVVMLCAweDA4MzExMkY5VUwsIDB4MDgzNDMzMEJVTCwKKyAgICAweDA4NDUzMzhCVUwsIDB4MDg3NTZGNUNVTCwgMHgwODg3RjcyNVVMLCAweDA4ODg0MzY2VUwsIDB4MDhBRjY0OUNVTCwKKyAgICAweDA4RjAwODk4VUwsIDB4MDhGRkZBRDhVTCwgMHgwOTExMTFDN1VMLCAweDA5MzIzMzBCVUwsIDB4MDk0NTMzOEJVTCwKKyAgICAweDA5Nzc0RjdEVUwsIDB4MDk5OEM3MjVVTCwgMHgwOTk5NjQxNlVMLCAweDA5RUY4N0U1VUwsIDB4MDlGRkZBRDhVTCwKKyAgICAweDBBMzQzMzBCVUwsIDB4MEE0NTMzOEJVTCwgMHgwQTc3NDY3RFVMLCAweDBBQTlGNTJCVUwsIDB4MEFBQTY0MTZVTCwKKyAgICAweDBBQkQ2N0RGVUwsIDB4MEFGRkZBMThVTCwgMHgwQjMzMzMwQlVMLCAweDBCNDQ0M0E2VUwsIDB4MEI3NjQ2N0RVTCwKKyAgICAweDBCQjk3NTFGVUwsIDB4MEJCQjU5QkRVTCwgMHgwQkVGNTg5MlVMLCAweDBCRkZGQUQ4VUwsIDB4MEMyMjEzMzlVTCwKKyAgICAweDBDNTMzMzhFVUwsIDB4MEM3NjM2N0RVTCwgMHgwQ0NBRjUyRVVMLCAweDBDQ0M2OTk2VUwsIDB4MENGRkZBMThVTCwKKyAgICAweDBENDQ0MzhFVUwsIDB4MEQ2NDI2NEVVTCwgMHgwRERDRjUyRVVMLCAweDBEREQ1OTk2VUwsIDB4MERGRkZBMThVTCwKKyAgICAweDBFNDMzMzhFVUwsIDB4MEU2ODQ2NUNVTCwgMHgwRUVFNjUxQ1VMLCAweDBFRkZGQTE4VUwsIDB4MEYzMzIzOEVVTCwKKyAgICAweDBGNTUzNjU5VUwsIDB4MEY4RjQ1MUNVTCwgMHgwRkFGRjhBRVVMLCAweDBGRjAwQTJFVUwsIDB4MEZGRjFBQ0NVTCwKKyAgICAweDBGRkYzM0JEVUwsIDB4MEZGRjc1MjJVTCwgMHgwRkZGRkFEOFVMLCAweDEwMDAyQzcyVUwsIDB4MTExMTEwM0VVTCwKKyAgICAweDExMTIxRTgzVUwsIDB4MTExMzFFOUFVTCwgMHgxMTIxMTE1QVVMLCAweDExMjIxMTcwVUwsIDB4MTEyMzE2RjBVTCwKKyAgICAweDExMjQxNzVEVUwsIDB4MTEzMTFDQzJVTCwgMHgxMTMyMTE4MlVMLCAweDExMzMxRDQyVUwsIDB4MTE0MTFENDhVTCwKKyAgICAweDExNDIxODM2VUwsIDB4MTE0MzE4NzZVTCwgMHgxMTQ0MURGNVVMLCAweDExNTIyODdCVUwsIDB4MTIxMTE5MDNVTCwKKyAgICAweDEyMTIxMTVBVUwsIDB4MTIxMzE2RjBVTCwgMHgxMjIxMUIzMFVMLCAweDEyMjIxQjMwVUwsIDB4MTIyMzFCMDJVTCwKKyAgICAweDEyMzExMTg0VUwsIDB4MTIzMjFEMDRVTCwgMHgxMjMzMTc4NFVMLCAweDEyNDExRDM5VUwsIDB4MTI0MTIwMjBVTCwKKyAgICAweDEyNDIyMjIwVUwsIDB4MTI1MTFEODlVTCwgMHgxMjUyMjI3QlVMLCAweDEyNTgxODRBVUwsIDB4MTI4MzI5OTJVTCwKKyAgICAweDEzMTExNzFBVUwsIDB4MTMxMjFCMzBVTCwgMHgxMzEyMjAyQ1VMLCAweDEzMTMyMEFBVUwsIDB4MTMyMTIwQUFVTCwKKyAgICAweDEzMjIyMEFEVUwsIDB4MTMyMzJGRURVTCwgMHgxMzMxMjEwN1VMLCAweDEzMzIyMTM0VUwsIDB4MTMzMzIxMzRVTCwKKyAgICAweDEzNDExRDM5VUwsIDB4MTM0MzFFNzRVTCwgMHgxMzQ0MTgzNFVMLCAweDEzNDgxMkI0VUwsIDB4MTM1MjIzMEJVTCwKKyAgICAweDEzNjExRTRCVUwsIDB4MTM2NTIyRTRVTCwgMHgxNDExMTNDMlVMLCAweDE0MTIxMUM0VUwsIDB4MTQzMTIxRjlVTCwKKyAgICAweDE0MzIyMUY5VUwsIDB4MTQzMzIxQ0FVTCwgMHgxNDM1MUQzNFVMLCAweDE0NDMxRTQ3VUwsIDB4MTQ0NDFFNzRVTCwKKyAgICAweDE0NDYxMkI0VUwsIDB4MTQ1MjIzMEVVTCwgMHgxNDU1MUU3NFVMLCAweDE0NzExMzBFVUwsIDB4MTUxMTEzQzJVTCwKKyAgICAweDE1MjEyMUY5VUwsIDB4MTUzMTIxRjlVTCwgMHgxNTMyMjFGOVVMLCAweDE1MzMxMDA3VUwsIDB4MTU1MjJFNEVVTCwKKyAgICAweDE1NTUxRTc0VUwsIDB4MTU3MTEzMEVVTCwgMHgxNjExMTNDN1VMLCAweDE2MjEyMUY5VUwsIDB4MTYzMTIxRjlVTCwKKyAgICAweDE2NjExRTc5VUwsIDB4MTY2NjEzMzRVTCwgMHgxNzExMTNDN1VMLCAweDE3MjEyMUY5VUwsIDB4MTc0NTFFNDdVTCwKKyAgICAweDE3NzExMzBDVUwsIDB4MTgxMTEzQzdVTCwgMHgxODIxMUU0N1VMLCAweDE4NTExRTRDVUwsIDB4MTg4MjEzMENVTCwKKyAgICAweDE5MTExM0M3VUwsIDB4MTkzMzFFNzlVTCwgMHgxQTExMTMwN1VMLCAweDFBMzExRTc5VUwsIDB4MUY1MjIzMEVVTCwKKyAgICAweDIwMDAwM0MxVUwsIDB4MjAwMDEwMjdVTCwgMHgyMDAwNDQ2N1VMLCAweDIwMDA3OUU3VUwsIDB4MjAwMEU1RUZVTCwKKyAgICAweDIxMTAwQkMwVUwsIDB4MjExMTI5QzBVTCwgMHgyMTExNDAxMVVMLCAweDIxMTE4OUU3VUwsIDB4MjExMUY1RUZVTCwKKyAgICAweDIxMTI0MDExVUwsIDB4MjExMjc0NTVVTCwgMHgyMTEzMjVDMFVMLCAweDIxMTM0MDExVUwsIDB4MjExMzc0NTVVTCwKKyAgICAweDIxMTQyNUMwVUwsIDB4MjEyMTI0NDBVTCwgMHgyMTIxMzAwMVVMLCAweDIxMjFGOUVGVUwsIDB4MjEyMjI1NDBVTCwKKyAgICAweDIxMjI2NDU1VUwsIDB4MjEyMkY1RUZVTCwgMHgyMTIzMzA1MVVMLCAweDIxMjNGNTZGVUwsIDB4MjEyNDQ0NTFVTCwKKyAgICAweDIxMzEyNTUxVUwsIDB4MjEzMjM0NTFVTCwgMHgyMTMzMjU1MVVMLCAweDIxODQ0NTU1VUwsIDB4MjIxMTI1QzBVTCwKKyAgICAweDIyMTEzMDExVUwsIDB4MjIxMUY5RUZVTCwgMHgyMjEyMzA1MVVMLCAweDIyMTJGOUVGVUwsIDB4MjIxMzI5RDFVTCwKKyAgICAweDIyMjEyNTQxVUwsIDB4MjIyMTMwMTFVTCwgMHgyMjIxRjlFRlVMLCAweDIyMjIzNDUxVUwsIDB4MjIyMkY5RUZVTCwKKyAgICAweDIyMjMyNTUxVUwsIDB4MjIyM0Y1NkZVTCwgMHgyMjMxMjU1MVVMLCAweDIyMzIyOUQxVUwsIDB4MjIzMkY1NkZVTCwKKyAgICAweDIyMzMyNTUxVUwsIDB4MjIzM0Y1NkZVTCwgMHgyMjg3NTU1NVVMLCAweDIyREFCNUQ3VUwsIDB4MjMxMTJCRDFVTCwKKyAgICAweDIzMTE1NDY3VUwsIDB4MjMxMjI1RDFVTCwgMHgyMzIxMjlEMVVMLCAweDIzMjIyOUQxVUwsIDB4MjMyMkY5RUZVTCwKKyAgICAweDIzMjMzNDUxVUwsIDB4MjMyM0Y5RUZVTCwgMHgyMzMxMjU1MVVMLCAweDIzMzIyOUQxVUwsIDB4MjMzMkY5RUZVTCwKKyAgICAweDIzMzNGNTZGVUwsIDB4MjM3RkY1NTdVTCwgMHgyMzg1NjlENVVMLCAweDIzRDk1NUQ3VUwsIDB4MjQxMDBCRTdVTCwKKyAgICAweDI0ODc4OUU3VUwsIDB4MjRFMzE1RDdVTCwgMHgyNEZGRkJFRlVMLCAweDI1OTg2OUU3VUwsIDB4MjVERkY1RUZVTCwKKyAgICAweDI1RkZGQkVGVUwsIDB4MjY4Nzg5RTdVTCwgMHgyNkRGQTVEN1VMLCAweDI2RkZGQkVGVUwsIDB4Mjc5NjQ5RTdVTCwKKyAgICAweDI3RTQyNUQ3VUwsIDB4MjdGRkZCRUZVTCwgMHgyODg4NzlFN1VMLCAweDI4RUZGNUVGVUwsIDB4MjhGRkZCRUZVTCwKKyAgICAweDI5ODQzOUU3VUwsIDB4MjlGMTE1RUZVTCwgMHgyOUZGRkJFRlVMLCAweDJBNzY1OUU3VUwsIDB4MkFFRjc1RDdVTCwKKyAgICAweDJBRkZGQkVGVUwsIDB4MkI3Qzg5RTdVTCwgMHgyQkVGOTVEN1VMLCAweDJCRkZGQkVGVUwsIDB4MkM2NjU5RTdVTCwKKyAgICAweDJDRDU1NUQ3VUwsIDB4MkNGRkZCRUZVTCwgMHgyRDYzMjlFN1VMLCAweDJEREQ1NUU3VUwsIDB4MkRGRkZCRUJVTCwKKyAgICAweDJFODQ3OUQ3VUwsIDB4MkVFRTM1RTdVTCwgMHgyRUZGRkJFRlVMLCAweDJGNTQ1OUU3VUwsIDB4MkZDRjg1RDdVTCwKKyAgICAweDJGRkVGQkVCVUwsIDB4MkZGRkE1RUZVTCwgMHgyRkZGRUJFRlVMLCAweDMwMDAxQUU3VUwsIDB4MzAwMDIwMDFVTCwKKyAgICAweDMxMTEyOUMwVUwsIDB4MzEyMjEwMTVVTCwgMHgzMTIzMjAwMFVMLCAweDMxMzMyNDUxVUwsIDB4MzIxMTI1NDBVTCwKKyAgICAweDMyMTMxMDI3VUwsIDB4MzIyMTI0NDBVTCwgMHgzMzQ1MjQ1NVVMLCAweDQwMDBGOUQ3VUwsIDB4NDEyMkY5RDdVTCwKKyAgICAweDQzRjY1NTU1VUwsIDB4NDNGRkY1RDdVTCwgMHg0NEY1NTU2N1VMLCAweDQ0RkZGNUQ3VUwsIDB4NDVGMDA1NTdVTCwKKyAgICAweDQ1RkZGNUQ3VUwsIDB4NDZGNjU5RDdVTCwgMHg0NzEwMDVFN1VMLCAweDQ3RjQ0OUU3VUwsIDB4NDgxMDA1RTdVTCwKKyAgICAweDQ4RUZBOUQ1VUwsIDB4NDhGRkY1RUZVTCwgMHg0OUY0NDlFN1VMLCAweDQ5RkZGNUVGVUwsIDB4NEFFQTc5RTdVTCwKKyAgICAweDRBRkZGNUVGVUwsIDB4NEJFOUM5RDVVTCwgMHg0QkZGRjVFRlVMLCAweDRDRTU0OUU3VUwsIDB4NENGRkY1RUZVTCwKKyAgICAweDRERTM1OUU3VUwsIDB4NERGRkY1RDdVTCwgMHg0RUU0NjlFN1VMLCAweDRFRkZGNUQ3VUwsIDB4NEZFRjM5RTdVTCwKKyAgICAweDRGRkZGNUVGVUwsIDB4NjAwMEY5RTdVTCwgMHg2OUZGRjU1N1VMLCAweDZGRkZGOUQ3VUwsIDB4ODExMDA5RDdVTCwKKyAgICAweDhFRkZGNTU1VUwsIDB4RkZGRkY5RTdVTH07CisKK3N0YXRpYyBjb25zdCBTSE9SVCBhcmlfcGtbNjRdWzE3XSA9IHsKKyAgICB7NzA4LCA3MDYsIDU3OSwgNTY5LCA1NjgsIDU2NywgNDc5LCA0NjksIDI5NywgMTM4LCA5NywgOTEsIDcyLCA1MiwgMzgsIDM0LAorICAgICAwfSwKKyAgICB7NzYxOSwgNjkxNywgNjUxOSwgNjQxMiwgNTUxNCwgNTAwMywgNDY4MywgNDU2MywgMzkwNywgMzI5NywgMzEyNSwgMzA2MCwKKyAgICAgMjkwNCwgMjcxOCwgMjYzMSwgMjU5MCwgMH0sCisgICAgezcyNjMsIDQ4ODgsIDQ4MTAsIDQ4MDMsIDE4ODksIDQxNSwgMzM1LCAzMjcsIDE5NSwgNzIsIDUyLCA0OSwgMzYsIDIwLCAxNSwKKyAgICAgMTQsIDB9LAorICAgIHszNjI2LCAyMTk3LCAyMTg4LCAyMTg3LCA1ODIsIDU3LCA0NywgNDYsIDMwLCAxMiwgOSwgOCwgNiwgNCwgMywgMiwgMH0sCisgICAgezc4MDYsIDU1NDEsIDU0NTEsIDU0NDEsIDI3MjAsIDgzNCwgNjkxLCA2NzQsIDQ4NywgMjQzLCAxNzksIDE2NywgMTM5LCA5OCwKKyAgICAgNzcsIDcwLCAwfSwKKyAgICB7NjY4NCwgNDEwMSwgNDA1OCwgNDA1NSwgMTc0OCwgNDI2LCAzNjgsIDM2NCwgMzIyLCAyNTcsIDIzNSwgMjMyLCAyMjgsIDIyMiwKKyAgICAgMjE3LCAyMTUsIDB9LAorICAgIHs5MTYyLCA1OTY0LCA1ODMxLCA1ODE5LCAzMjY5LCA4NjYsIDY1OCwgNjM4LCA1MzUsIDM0OCwgMjU4LCAyNDQsIDIzNCwgMjE0LAorICAgICAxOTUsIDE4NiwgMH0sCisgICAgezEwNjM4LCA4NDkxLCA4MzY1LCA4MzUxLCA0NDE4LCAyMDY3LCAxODU5LCAxODM0LCAxMTkwLCA2MDEsIDQ5NSwgNDc4LCAzNTYsCisgICAgIDIxNywgMTc0LCAxNjQsIDB9LAorICAgIHsxMzM4OSwgMTA1MTQsIDEwMDMyLCA5OTYxLCA3MTY2LCAzNDg4LCAyNjU1LCAyNTI0LCAyMDE1LCAxMTQwLCA3NjAsIDY3MiwKKyAgICAgNTg1LCA0MjYsIDMyNSwgMjgzLCAwfSwKKyAgICB7MTQ4NjEsIDEyNzg4LCAxMjExNSwgMTE5NTIsIDk5ODcsIDY2NTcsIDUzMjMsIDQ5ODQsIDQzMjQsIDMwMDEsIDIyMDUsIDE5NDMsCisgICAgIDE3NjQsIDEzOTQsIDExMTUsIDk3OCwgMH0sCisgICAgezEyODc2LCAxMDAwNCwgOTY2MSwgOTYxMCwgNzEwNywgMzQzNSwgMjcxMSwgMjU5NSwgMjI1NywgMTUwOCwgMTA1OSwgOTUyLAorICAgICA4OTMsIDc1MywgNjA5LCA1MzgsIDB9LAorICAgIHsxNTEyNSwgMTM1OTEsIDEzMDQ5LCAxMjg3NCwgMTExOTIsIDg1NDMsIDc0MDYsIDcwMjMsIDYyOTEsIDQ5MjIsIDQxMDQsCisgICAgIDM3NjksIDM0NjUsIDI4OTAsIDI0ODYsIDIyNzUsIDB9LAorICAgIHsxNDU3NCwgMTMxMDYsIDEyNzMxLCAxMjYzOCwgMTA0NTMsIDc5NDcsIDcyMzMsIDcwMzcsIDYwMzEsIDQ2MTgsIDQwODEsCisgICAgIDM5MDYsIDM0NjUsIDI4MDIsIDI0NzYsIDIzNDksIDB9LAorICAgIHsxNTA3MCwgMTMxNzksIDEyNTE3LCAxMjM1MSwgMTA3NDIsIDc2NTcsIDYyMDAsIDU4MjUsIDUyNjQsIDM5OTgsIDMwMTQsCisgICAgIDI2NjIsIDI1MTAsIDIxNTMsIDE3OTksIDE1NjQsIDB9LAorICAgIHsxNTU0MiwgMTQ0NjYsIDE0MDA3LCAxMzg0NCwgMTI0ODksIDEwNDA5LCA5NDgxLCA5MTMyLCA4MzA1LCA2OTQwLCA2MTkzLAorICAgICA1ODY3LCA1NDU4LCA0NzQzLCA0MjkxLCA0MDQ3LCAwfSwKKyAgICB7MTUxNjUsIDE0Mzg0LCAxNDA4NCwgMTM5MzQsIDEyOTExLCAxMTQ4NSwgMTA4NDQsIDEwNTEzLCAxMDAwMiwgODk5MywgODM4MCwKKyAgICAgODA1MSwgNzcxMSwgNzAzNiwgNjUxNCwgNjIzMywgMH0sCisgICAgezE1NjQyLCAxNDI3OSwgMTM2MjUsIDEzMzkzLCAxMjM0OCwgOTk3MSwgODQwNSwgNzg1OCwgNzMzNSwgNjExOSwgNDkxOCwKKyAgICAgNDM3NiwgNDE4NSwgMzcxOSwgMzIzMSwgMjg2MCwgMH0sCisgICAgezEzNDA4LCAxMzQwNywgMTE0NzEsIDExMjE4LCAxMTIxNywgMTEyMTYsIDk0NzMsIDkyMTYsIDY0ODAsIDM2ODksIDI4NTcsCisgICAgIDI2OTAsIDIyNTYsIDE3MzIsIDE0MDUsIDEzMDIsIDB9LAorICAgIHsxNjA5OCwgMTU1ODQsIDE1MTkxLCAxNDkzMSwgMTQ1MTQsIDEzNTc4LCAxMjcwMywgMTIxMDMsIDExODMwLCAxMTE3MiwKKyAgICAgMTA0NzUsIDk4NjcsIDk2OTUsIDkyODEsIDg4MjUsIDgzODksIDB9LAorICAgIHsxNTg0NCwgMTQ4NzMsIDE0Mjc3LCAxMzk5NiwgMTMyMzAsIDExNTM1LCAxMDIwNSwgOTU0MywgOTEwNywgODA4NiwgNzA4NSwKKyAgICAgNjQxOSwgNjIxNCwgNTcxMywgNTE5NSwgNDczMSwgMH0sCisgICAgezE2MTMxLCAxNTcyMCwgMTU0NDMsIDE1Mjc2LCAxNDg0OCwgMTM5NzEsIDEzMzE0LCAxMjkxMCwgMTI1OTEsIDExODc0LAorICAgICAxMTIyNSwgMTA3ODgsIDEwNTczLCAxMDA3NywgOTU4NSwgOTIwOSwgMH0sCisgICAgezE2MzMxLCAxNjMzMCwgMTIyODMsIDExNDM1LCAxMTQzNCwgMTE0MzMsIDg3MjUsIDgwNDksIDYwNjUsIDQxMzgsIDMxODcsCisgICAgIDI4NDIsIDI1MjksIDIxNzEsIDE5MDcsIDE3NDUsIDB9LAorICAgIHsxNjAxMSwgMTUyOTIsIDE0NzgyLCAxNDUyOCwgMTQwMDgsIDEyNzY3LCAxMTU1NiwgMTA5MjEsIDEwNTkxLCA5NzU5LCA4ODEzLAorICAgICA4MDQzLCA3ODU1LCA3MzgzLCA2ODYzLCA2MjgyLCAwfSwKKyAgICB7MTYzODAsIDE2Mzc5LCAxNTE1OSwgMTQ2MTAsIDE0NjA5LCAxNDYwOCwgMTI4NTksIDEyMTExLCAxMTA0NiwgOTUzNiwgODM0OCwKKyAgICAgNzcxMywgNzIxNiwgNjUzMywgNTk2NCwgNTU0NiwgMH0sCisgICAgezE2MzY3LCAxNjMzMywgMTYyOTQsIDE2MjUzLCAxNjIyMiwgMTYxNDMsIDE2MDQ4LCAxNTk0NywgMTU5MTUsIDE1ODMyLAorICAgICAxNTczMSwgMTU2MTksIDE1NTg5LCAxNTUxMiwgMTU0MTYsIDE1MzEwLCAwfSwKKyAgICB7MTU5NjcsIDE1MzE5LCAxNDkzNywgMTQ3NTMsIDE0MDEwLCAxMjYzOCwgMTE3ODcsIDExMzYwLCAxMDgwNSwgOTcwNiwgODkzNCwKKyAgICAgODUxNSwgODE2NiwgNzQ1NiwgNjkxMSwgNjU3NSwgMH0sCisgICAgezQ5MDYsIDMwMDUsIDI5ODUsIDI5ODQsIDg3NSwgMTAyLCA4MywgODEsIDQ3LCAxNywgMTIsIDExLCA4LCA1LCA0LCAzLCAwfSwKKyAgICB7NzIxNywgNDM0NiwgNDI2OSwgNDI2NCwgMTkyNCwgNDI4LCAzNDAsIDMzMiwgMjgwLCAyMDMsIDE3OSwgMTc1LCAxNzEsIDE2NCwKKyAgICAgMTU5LCAxNTcsIDB9LAorICAgIHsxNjAxMCwgMTU0MTUsIDE1MDMyLCAxNDgwNSwgMTQyMjgsIDEzMDQzLCAxMjE2OCwgMTE2MzQsIDExMjY1LCAxMDQxOSwgOTY0NSwKKyAgICAgOTExMCwgODg5MiwgODM3OCwgNzg1MCwgNzQzNywgMH0sCisgICAgezg1NzMsIDUyMTgsIDUwNDYsIDUwMzIsIDI3ODcsIDc3MSwgNTU1LCA1MzMsIDQ0MywgMjg2LCAyMTgsIDIwNSwgMTk3LCAxODEsCisgICAgIDE2OCwgMTYyLCAwfSwKKyAgICB7MTE0NzQsIDgwOTUsIDc4MjIsIDc3OTYsIDQ2MzIsIDE0NDMsIDEwNDYsIDEwMDQsIDc0OCwgMzUxLCAyMTgsIDE5NCwgMTY3LAorICAgICAxMjEsIDkzLCA4MywgMH0sCisgICAgezE2MTUyLCAxNTc2NCwgMTU0NjMsIDE1MjY0LCAxNDkyNSwgMTQxODksIDEzNTM2LCAxMzA3MCwgMTI4NDYsIDEyMzE0LAorICAgICAxMTc2MywgMTEyNzcsIDExMTMxLCAxMDc3NywgMTAzODMsIDEwMDExLCAwfSwKKyAgICB7MTQxODcsIDExNjU0LCAxMTA0MywgMTA5MTksIDg0OTgsIDQ4ODUsIDM3NzgsIDM1NTIsIDI5NDcsIDE4MzUsIDEyODMsIDExMzQsCisgICAgIDk5OCwgNzQ5LCA1ODUsIDUxNCwgMH0sCisgICAgezE0MTYyLCAxMTUyNywgMTA3NTksIDEwNTU3LCA4NjAxLCA1NDE3LCA0MTA1LCAzNzUzLCAzMjg2LCAyMzUzLCAxNzA4LCAxNDczLAorICAgICAxMzcwLCAxMTQ4LCA5NTksIDg0MCwgMH0sCisgICAgezE2MjA1LCAxNTkwMiwgMTU2NjksIDE1NDk4LCAxNTIxMywgMTQ2MDEsIDE0MDY4LCAxMzY3NCwgMTM0NjMsIDEyOTcwLAorICAgICAxMjQ3MSwgMTIwNjEsIDExOTE2LCAxMTU2NCwgMTExODMsIDEwODQxLCAwfSwKKyAgICB7MTUwNDMsIDEyOTcyLCAxMjA5MiwgMTE3OTIsIDEwMjY1LCA3NDQ2LCA1OTM0LCA1Mzc5LCA0ODgzLCAzODI1LCAzMDM2LAorICAgICAyNjQ3LCAyNTA3LCAyMTg1LCAxOTAxLCAxNjk5LCAwfSwKKyAgICB7MTUzMjAsIDEzNjk0LCAxMjc4MiwgMTIzNTIsIDExMTkxLCA4OTM2LCA3NDMzLCA2NjcxLCA2MjU1LCA1MzY2LCA0NjIyLAorICAgICA0MTU4LCA0MDIwLCAzNzEyLCAzNDIwLCAzMTk4LCAwfSwKKyAgICB7MTYyNTUsIDE2MDIwLCAxNTc2OCwgMTU2MDAsIDE1NDE2LCAxNDk2MywgMTQ0NDAsIDE0MDA2LCAxMzg3NSwgMTM1MzQsCisgICAgIDEzMTM3LCAxMjY5NywgMTI2MDIsIDEyMzY0LCAxMjA4NCwgMTE3ODEsIDB9LAorICAgIHsxNTYyNywgMTQ1MDMsIDEzOTA2LCAxMzYyMiwgMTI1NTcsIDEwNTI3LCA5MjY5LCA4NjYxLCA4MTE3LCA2OTMzLCA1OTk0LAorICAgICA1NDc0LCA1MjIyLCA0NjY0LCA0MTY2LCAzODQxLCAwfSwKKyAgICB7MTYzNjYsIDE2MzY1LCAxNDU0NywgMTQxNjAsIDE0MTU5LCAxNDE1OCwgMTE5NjksIDExNDczLCA4NzM1LCA2MTQ3LCA0OTExLAorICAgICA0NTMwLCAzODY1LCAzMTgwLCAyNzEwLCAyNDczLCAwfSwKKyAgICB7MTYyNTcsIDE2MDM4LCAxNTg3MSwgMTU3NTQsIDE1NTM2LCAxNTA3MSwgMTQ2NzMsIDE0MzkwLCAxNDIzMCwgMTM4NDIsCisgICAgIDEzNDUyLCAxMzEzNiwgMTMwMjEsIDEyNzQ1LCAxMjQzNCwgMTIxNTQsIDB9LAorICAgIHsxNTg1NSwgMTQ5NzEsIDE0MzM4LCAxMzkzOSwgMTMyMzksIDExNzgyLCAxMDU4NSwgOTgwNSwgOTQ0NCwgODYyMywgNzg0NiwKKyAgICAgNzI1NCwgNzA3OSwgNjY3MywgNjI2MiwgNTkyMywgMH0sCisgICAgezk0OTIsIDYzMTgsIDYxOTcsIDYxODksIDMwMDQsIDY1MiwgNDg5LCA0NzcsIDMzMywgMTQzLCA5NiwgOTAsIDc4LCA2MCwgNTAsCisgICAgIDQ3LCAwfSwKKyAgICB7MTYzMTMsIDE2MTkxLCAxNjA2MywgMTU5NjgsIDE1ODUxLCAxNTU5MCwgMTUzMDMsIDE1MDgyLCAxNDk2OCwgMTQ3MDQsCisgICAgIDE0NDI3LCAxNDE3NywgMTQwOTUsIDEzODk5LCAxMzY3NCwgMTM0NTcsIDB9LAorICAgIHs4NDg1LCA1NDczLCA1Mzg5LCA1MzgzLCAyNDExLCA0OTQsIDM4NiwgMzc3LCAyNzgsIDE1MCwgMTE3LCAxMTIsIDEwMywgODksCisgICAgIDgxLCA3OCwgMH0sCisgICAgezEwNDk3LCA3MTU0LCA2OTU5LCA2OTQzLCAzNzg4LCAxMDA0LCA3MzQsIDcwOSwgNTE3LCAyMzgsIDE1MiwgMTM4LCAxMjAsIDkwLAorICAgICA3MiwgNjYsIDB9LAorICAgIHsxNjMxNywgMTYyMjYsIDE2MTI3LCAxNjA0MCwgMTU5NTUsIDE1NzYyLCAxNTU0NywgMTUzNDUsIDE1Mjc3LCAxNTExMSwKKyAgICAgMTQ5MjIsIDE0NzIzLCAxNDY3MSwgMTQ1NDYsIDE0Mzk2LCAxNDIzOSwgMH0sCisgICAgezE2MzgyLCAxNjM4MSwgMTU4NTgsIDE1NTQwLCAxNTUzOSwgMTU1MzgsIDE0NzA0LCAxNDE2OCwgMTM3NjgsIDEzMDkyLAorICAgICAxMjQ1MiwgMTE5MjUsIDExNjgzLCAxMTI2OCwgMTA4NDEsIDEwNDYwLCAwfSwKKyAgICB7NTk3NCwgMzc5OCwgMzc1OCwgMzc1NSwgMTI3NSwgMjA1LCAxNjYsIDE2MiwgOTUsIDM1LCAyNiwgMjQsIDE4LCAxMSwgOCwgNywKKyAgICAgMH0sCisgICAgezM1MzIsIDIyNTgsIDIyNDYsIDIyNDQsIDczMSwgMTM1LCAxMTgsIDExNSwgODcsIDQ1LCAzNiwgMzQsIDI5LCAyMSwgMTcsIDE2LAorICAgICAwfSwKKyAgICB7NzQ2NiwgNDg4MiwgNDgyMSwgNDgxMSwgMjQ3NiwgODg2LCA3ODgsIDc3MSwgNjg4LCA1MzEsIDQ2OSwgNDU3LCA0MzcsIDQwMCwKKyAgICAgMzY5LCAzNjEsIDB9LAorICAgIHs5NTgwLCA1NzcyLCA1MjkxLCA1MjE2LCAzNDQ0LCAxNDk2LCAxMDI1LCA5MjgsIDgwNiwgNTc4LCA0MzMsIDM4NCwgMzY2LAorICAgICAzMzEsIDI5NiwgMjczLCAwfSwKKyAgICB7MTA2OTIsIDc3MzAsIDc1NDMsIDc1MjEsIDQ2NzksIDE3NDYsIDEzOTEsIDEzNDYsIDExMjgsIDY5MiwgNDk1LCA0NTgsIDQyNCwKKyAgICAgMzUzLCAyOTEsIDI2OCwgMH0sCisgICAgezExMDQwLCA3MTMyLCA2NTQ5LCA2NDUyLCA0Mzc3LCAxODc1LCAxMjUzLCAxMTMwLCA5NTgsIDYzMSwgNDMxLCAzNzAsIDM0NiwKKyAgICAgMjk2LCAyNTMsIDIyNywgMH0sCisgICAgezEyNjg3LCA5MzMyLCA4NzAxLCA4NTg1LCA2MjY2LCAzMDkzLCAyMTgyLCAyMDA0LCAxNjgzLCAxMDcyLCA3MTIsIDYwOCwgNTU5LAorICAgICA0NTgsIDM3MywgMzIzLCAwfSwKKyAgICB7MTM0MjksIDk4NTMsIDg4NjAsIDg1ODQsIDY4MDYsIDQwMzksIDI4NjIsIDI0NzgsIDIyMzksIDE3NjQsIDE0MDksIDEyMjQsCisgICAgIDExNzgsIDEwNzcsIDk3OSwgOTAzLCAwfSwKKyAgICB7MTQ2ODUsIDEyMTYzLCAxMTA2MSwgMTA2NjgsIDkxMDEsIDYzNDUsIDQ4NzEsIDQyNjMsIDM5MDgsIDMyMDAsIDI2NjgsIDIzNjgsCisgICAgIDIyODUsIDIxMDYsIDE5NDIsIDE4MTksIDB9LAorICAgIHsxMzI5NSwgMTEzMDIsIDEwOTk5LCAxMDk0NSwgNzk0NywgNTAzNiwgNDQ5MCwgNDM4NSwgMzM5MSwgMjE4NSwgMTgzNiwgMTc1NywKKyAgICAgMTQyNCwgOTk4LCA4MzMsIDc4NSwgMH0sCisgICAgezQ5OTIsIDI5OTMsIDI5NzIsIDI5NzAsIDEyNjksIDU3NSwgNTUyLCA1NDksIDUzMCwgNTA1LCA0OTcsIDQ5NSwgNDkzLCA0ODksCisgICAgIDQ4NiwgNDg1LCAwfSwKKyAgICB7MTU0MTksIDEzODYyLCAxMzEwNCwgMTI4MTksIDExNDI5LCA4NzUzLCA3MjIwLCA2NjUxLCA2MDIwLCA0NjY3LCAzNjYzLAorICAgICAzMjIwLCAyOTk1LCAyNTExLCAyMTA3LCAxODcxLCAwfSwKKyAgICB7MTI0NjgsIDkyNjMsIDg5MTIsIDg4NzMsIDU3NTgsIDIxOTMsIDE2MjUsIDE1NTYsIDExODcsIDU4OSwgMzcxLCAzMzAsIDI4MywKKyAgICAgMjAwLCAxNDksIDEzMSwgMH0sCisgICAgezE1ODcwLCAxNTA3NiwgMTQ2MTUsIDE0MzY5LCAxMzU4NiwgMTIwMzQsIDEwOTkwLCAxMDQyMywgOTk1MywgODkwOCwgODAzMSwKKyAgICAgNzQ4OCwgNzIzMywgNjY0OCwgNjEwMSwgNTcxMiwgMH0sCisgICAgezE2OTMsIDk3OCwgOTc2LCA5NzUsIDE5NCwgMTgsIDE2LCAxNSwgMTEsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDB9LAorICAgIHs3OTkyLCA1MjE4LCA1MTQ3LCA1MTQzLCAyMTUyLCAzNjYsIDI4MiwgMjc2LCAxNzMsIDU5LCAzOCwgMzUsIDI3LCAxNiwgMTEsCisgICAgIDEwLCAwfX07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGxvdzsKKyAgaW50IGhpZ2g7CisgIGludCB2b2JmOworfSBUYXN0YXQ7CisKK3N0YXRpYyBpbmxpbmUgSU5UIG11bF9zYmNfMTRiaXRzKElOVCByLCBJTlQgYykgeworICByZXR1cm4gKCgoSU5UKXIpICogKChJTlQpYykpID4+IHN0YXRfYml0c25ldzsKK30KKworc3RhdGljIGlubGluZSBJTlQgYXJpX2RlY29kZV8xNGJpdHMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBUYXN0YXQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAqUkVTVFJJQ1QgY19mcmVxLCBpbnQgY2ZsKSB7CisgIElOVCBzeW1ib2w7CisgIElOVCBsb3csIGhpZ2gsIHJhbmdlLCB2YWx1ZTsKKyAgSU5UIGM7CisgIGNvbnN0IFNIT1JUICpwOworCisgIGxvdyA9IHMtPmxvdzsKKyAgaGlnaCA9IHMtPmhpZ2g7CisgIHZhbHVlID0gcy0+dm9iZjsKKworICByYW5nZSA9IGhpZ2ggLSBsb3cgKyAxOworICBjID0gKCgoaW50KSh2YWx1ZSAtIGxvdyArIDEpKSA8PCBzdGF0X2JpdHNuZXcpIC0gKChpbnQpMSk7CisgIHAgPSAoY29uc3QgU0hPUlQgKikoY19mcmVxIC0gMSk7CisKKyAgaWYgKGNmbCA9PSAoVkFMX0VTQyArIDEpKSB7CisgICAgLyogSW4gNTAlIG9mIGFsbCBjYXNlcywgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSByaWdodCBvbmUsIHNvIHdlIGNoZWNrIGl0CisgICAgICogcHJpb3IgdG8gYWxsIG90aGVycyAqLworICAgIGlmICgocFsxXSAqIHJhbmdlKSA+IGMpIHsKKyAgICAgIHAgKz0gMTsKKyAgICAgIGlmICgocFs4XSAqIHJhbmdlKSA+IGMpIHsKKyAgICAgICAgcCArPSA4OworICAgICAgfQorICAgICAgaWYgKChwWzRdICogcmFuZ2UpID4gYykgeworICAgICAgICBwICs9IDQ7CisgICAgICB9CisgICAgICBpZiAoKHBbMl0gKiByYW5nZSkgPiBjKSB7CisgICAgICAgIHAgKz0gMjsKKyAgICAgIH0KKyAgICAgIGlmICgocFsxXSAqIHJhbmdlKSA+IGMpIHsKKyAgICAgICAgcCArPSAxOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChjZmwgPT0gNCkgeworICAgIGlmICgocFsyXSAqIHJhbmdlKSA+IGMpIHsKKyAgICAgIHAgKz0gMjsKKyAgICB9CisgICAgaWYgKChwWzFdICogcmFuZ2UpID4gYykgeworICAgICAgcCArPSAxOworICAgIH0KKyAgfSBlbHNlIGlmIChjZmwgPT0gMikgeworICAgIGlmICgocFsxXSAqIHJhbmdlKSA+IGMpIHsKKyAgICAgIHAgKz0gMTsKKyAgICB9CisgIH0gZWxzZSBpZiAoY2ZsID09IDI3KSB7CisgICAgY29uc3QgU0hPUlQgKnBfMjQgPSBwICsgMjQ7CisKKyAgICBpZiAoKHBbMTZdICogcmFuZ2UpID4gYykgeworICAgICAgcCArPSAxNjsKKyAgICB9CisgICAgaWYgKChwWzhdICogcmFuZ2UpID4gYykgeworICAgICAgcCArPSA4OworICAgIH0KKyAgICBpZiAocCAhPSBwXzI0KSB7CisgICAgICBpZiAoKHBbNF0gKiByYW5nZSkgPiBjKSB7CisgICAgICAgIHAgKz0gNDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKChwWzJdICogcmFuZ2UpID4gYykgeworICAgICAgcCArPSAyOworICAgIH0KKworICAgIGlmIChwICE9ICZwXzI0WzJdKSB7CisgICAgICBpZiAoKHBbMV0gKiByYW5nZSkgPiBjKSB7CisgICAgICAgIHAgKz0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzeW1ib2wgPSAoSU5UKShwIC0gKGNvbnN0IFNIT1JUICopKGNfZnJlcSAtIDEpKTsKKworICBpZiAoc3ltYm9sKSB7CisgICAgaGlnaCA9IGxvdyArIG11bF9zYmNfMTRiaXRzKHJhbmdlLCBjX2ZyZXFbc3ltYm9sIC0gMV0pIC0gMTsKKyAgfQorCisgIGxvdyArPSBtdWxfc2JjXzE0Yml0cyhyYW5nZSwgY19mcmVxW3N5bWJvbF0pOworCisgIFVTSE9SVCB1c19oaWdoID0gKFVTSE9SVCloaWdoOworICBVU0hPUlQgdXNfbG93ID0gKFVTSE9SVClsb3c7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKHVzX2hpZ2ggJiAweDgwMDApIHsKKyAgICAgIGlmICghKHVzX2xvdyAmIDB4ODAwMCkpIHsKKyAgICAgICAgaWYgKHVzX2xvdyAmIDB4NDAwMCAmJiAhKHVzX2hpZ2ggJiAweDQwMDApKSB7CisgICAgICAgICAgdXNfbG93IC09IDB4NDAwMDsKKyAgICAgICAgICB1c19oaWdoIC09IDB4NDAwMDsKKyAgICAgICAgICB2YWx1ZSAtPSAweDQwMDA7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICB1c19sb3cgPSB1c19sb3cgPDwgMTsKKyAgICB1c19oaWdoID0gKHVzX2hpZ2ggPDwgMSkgfCAxOworICAgIHZhbHVlID0gKHZhbHVlIDw8IDEpIHwgRkRLcmVhZEJpdChoQnMpOworICB9CisgIHMtPmxvdyA9IChpbnQpdXNfbG93OworICBzLT5oaWdoID0gKGludCl1c19oaWdoOworICBzLT52b2JmID0gdmFsdWUgJiAweEZGRkY7CisKKyAgcmV0dXJuIHN5bWJvbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvcHlUYWJsZUFtcndiQXJpdGgyKFVDSEFSIHRhYltdLCBpbnQgc2l6ZUluLCBpbnQgc2l6ZU91dCkgeworICBpbnQgaTsKKyAgaW50IGo7CisgIGludCBrID0gMjsKKworICB0YWIgKz0gMjsKKworICBpZiAoc2l6ZUluIDwgc2l6ZU91dCkgeworICAgIHRhYltzaXplT3V0ICsgMF0gPSB0YWJbc2l6ZUluICsgMF07CisgICAgdGFiW3NpemVPdXQgKyAxXSA9IHRhYltzaXplSW4gKyAxXTsKKyAgICBpZiAoc2l6ZUluIDwgKHNpemVPdXQgPj4gMikpIHsKKyAgICAgIGsgPSA4OworICAgIH0gZWxzZSBpZiAoc2l6ZUluID09IChzaXplT3V0ID4+IDIpKSB7CisgICAgICBrID0gNDsKKyAgICB9CisKKyAgICBpID0gc2l6ZU91dCAtIDE7CisgICAgaiA9IHNpemVJbiAtIDE7CisKKyAgICBmb3IgKDsgaSA+PSAwOyBqLS0pIHsKKyAgICAgIFVDSEFSIHRxX2RhdGEwID0gdGFiW2pdOworCisgICAgICBmb3IgKGludCBsID0gKGsgPj4gMSk7IGwgPiAwOyBsLS0pIHsKKyAgICAgICAgdGFiW2ktLV0gPSB0cV9kYXRhMDsKKyAgICAgICAgdGFiW2ktLV0gPSB0cV9kYXRhMDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHNpemVPdXQgPCAoc2l6ZUluID4+IDIpKSB7CisgICAgICBrID0gODsKKyAgICB9IGVsc2UgaWYgKHNpemVPdXQgPT0gKHNpemVJbiA+PiAyKSkgeworICAgICAgayA9IDQ7CisgICAgfQorCisgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBzaXplT3V0OyBqICs9IGspIHsKKyAgICAgIFVDSEFSIHRxX2RhdGEwID0gdGFiW2pdOworCisgICAgICB0YWJbaSsrXSA9IHRxX2RhdGEwOworICAgIH0KKyAgICB0YWJbc2l6ZU91dCArIDBdID0gdGFiW3NpemVJbiArIDBdOworICAgIHRhYltzaXplT3V0ICsgMV0gPSB0YWJbc2l6ZUluICsgMV07CisgIH0KK30KKworc3RhdGljIGlubGluZSBVTE9ORyBnZXRfcGtfdjIoVUxPTkcgcykgeworICBjb25zdCBVTE9ORyAqcCA9IGFyaV9tZXJnZWRfaGFzaF9wczsKKyAgVUxPTkcgczEyID0gKGZNYXgoKFVJTlQpcywgKFVJTlQpMSkgPDwgMTIpIC0gMTsKKyAgaWYgKHMxMiA+IHBbNDg1XSkgeworICAgIHAgKz0gNDg2OyAvKiA3NDIgLSAyNTYgPSA0ODYgKi8KKyAgfSBlbHNlIHsKKyAgICBpZiAoczEyID4gcFsyNTVdKSBwICs9IDI1NjsKKyAgfQorCisgIGlmIChzMTIgPiBwWzEyN10pIHsKKyAgICBwICs9IDEyODsKKyAgfQorICBpZiAoczEyID4gcFs2M10pIHsKKyAgICBwICs9IDY0OworICB9CisgIGlmIChzMTIgPiBwWzMxXSkgeworICAgIHAgKz0gMzI7CisgIH0KKyAgaWYgKHMxMiA+IHBbMTVdKSB7CisgICAgcCArPSAxNjsKKyAgfQorICBpZiAoczEyID4gcFs3XSkgeworICAgIHAgKz0gODsKKyAgfQorICBpZiAoczEyID4gcFszXSkgeworICAgIHAgKz0gNDsKKyAgfQorICBpZiAoczEyID4gcFsxXSkgeworICAgIHAgKz0gMjsKKyAgfQorICBVTE9ORyBqID0gcFswXTsKKyAgaWYgKHMxMiA+IGopIGogPSBwWzFdOworICBpZiAocyAhPSAoaiA+PiAxMikpIGogPj49IDY7CisgIHJldHVybiAoaiAmIDB4M0YpOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGUyKEhBTkRMRV9GREtfQklUU1RSRUFNIGJidWYsIFVDSEFSICpSRVNUUklDVCBjX3ByZXYsCisgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwU3BlY3RyYWxDb2VmZmljaWVudCwgSU5UIG4sIElOVCBudCkgeworICBUYXN0YXQgYXM7CisgIGludCBpLCBsLCByOworICBJTlQgbGV2LCBlc2NfbmIsIHBraTsKKyAgVVNIT1JUIHN0YXRlX2luYzsKKyAgVUlOVCBzOworCisgIGludCBjXzMgPSAwOyAvKiBjb250ZXh0IG9mIGN1cnJlbnQgZnJhbWUgMyB0aW1lIHN0ZXBzIGFnbyAqLworICBpbnQgY18yID0gMDsgLyogY29udGV4dCBvZiBjdXJyZW50IGZyYW1lIDIgdGltZSBzdGVwcyBhZ28gKi8KKyAgaW50IGNfMSA9IDA7IC8qIGNvbnRleHQgb2YgY3VycmVudCBmcmFtZSAxIHRpbWUgc3RlcHMgYWdvICovCisgIGludCBjXzAgPSAxOyAvKiBjb250ZXh0IG9mIGN1cnJlbnQgZnJhbWUgdG8gYmUgY2FsY3VsYXRlZCAqLworCisgIC8qIGFyaV9zdGFydF9kZWNvZGluZ18xNGJpdHMgKi8KKyAgYXMubG93ID0gMDsKKyAgYXMuaGlnaCA9IGFyaV9xNG5ldzsKKyAgYXMudm9iZiA9IEZES3JlYWRCaXRzKGJidWYsIGNiaXRzbmV3KTsKKworICAvKiBhcml0aF9tYXBfY29udGV4dCAqLworICBzdGF0ZV9pbmMgPSBjX3ByZXZbMF0gPDwgMTI7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIGFyaXRoX2dldF9jb250ZXh0ICovCisgICAgcyA9IHN0YXRlX2luYyA+PiA4OworICAgIHMgPSBzICsgKGNfcHJldltpICsgMV0gPDwgOCk7CisgICAgcyA9IChzIDw8IDQpICsgY18xOworCisgICAgc3RhdGVfaW5jID0gczsKKworICAgIGlmIChpID4gMykgeworICAgICAgLyogQ3VtdWxhdGl2ZSBhbXBsaXR1ZGUgYmVsb3cgMiAqLworICAgICAgaWYgKChjXzEgKyBjXzIgKyBjXzMpIDwgNSkgeworICAgICAgICBzICs9IDB4MTAwMDA7CisgICAgICB9CisgICAgfQorCisgICAgLyogTVNCcyBkZWNvZGluZyAqLworICAgIGZvciAobGV2ID0gZXNjX25iID0gMDs7KSB7CisgICAgICBwa2kgPSBnZXRfcGtfdjIocyArIChlc2NfbmIgPDwgKFZBTF9FU0MgKyAxKSkpOworICAgICAgciA9IGFyaV9kZWNvZGVfMTRiaXRzKGJidWYsICZhcywgYXJpX3BrW3BraV0sIFZBTF9FU0MgKyAxKTsKKyAgICAgIGlmIChyIDwgVkFMX0VTQykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbGV2Kys7CisKKyAgICAgIGlmIChlc2NfbmIgPCA3KSB7CisgICAgICAgIGVzY19uYisrOworICAgICAgfQorICAgIH0KKworICAgIC8qIFN0b3Agc3ltYm9sICovCisgICAgaWYgKHIgPT0gMCkgeworICAgICAgaWYgKGVzY19uYiA+IDApIHsKKyAgICAgICAgYnJlYWs7IC8qIFN0b3Agc3ltYm9sICovCisgICAgICB9CisgICAgICBjXzAgPSAxOworICAgIH0gZWxzZSAvKiBpZiAocj09MCkgKi8KKyAgICB7CisgICAgICBJTlQgYiA9IHIgPj4gMjsKKyAgICAgIElOVCBhID0gciAmIDB4MzsKKworICAgICAgLyogTFNCcyBkZWNvZGluZyAqLworICAgICAgZm9yIChsID0gMDsgbCA8IGxldjsgbCsrKSB7CisgICAgICAgIHsKKyAgICAgICAgICBpbnQgcGlkeCA9IChhID09IDApID8gMSA6ICgoYiA9PSAwKSA/IDAgOiAyKTsKKyAgICAgICAgICByID0gYXJpX2RlY29kZV8xNGJpdHMoYmJ1ZiwgJmFzLCBhcmlfbHNiMltwaWR4XSwgNCk7CisgICAgICAgIH0KKyAgICAgICAgYSA9IChhIDw8IDEpIHwgKHIgJiAxKTsKKyAgICAgICAgYiA9IChiIDw8IDEpIHwgKHIgPj4gMSk7CisgICAgICB9CisKKyAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50WzIgKiBpXSA9IChGSVhQX0RCTClhOworICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnRbMiAqIGkgKyAxXSA9IChGSVhQX0RCTCliOworCisgICAgICBjXzAgPSBhICsgYiArIDE7CisgICAgICBpZiAoY18wID4gMHhGKSB7CisgICAgICAgIGNfMCA9IDB4RjsKKyAgICAgIH0KKworICAgIH0gLyogZW5kaWYgKHI9PTApICovCisKKyAgICAvKiBhcml0aF91cGRhdGVfY29udGV4dCAqLworICAgIGNfMyA9IGNfMjsKKyAgICBjXzIgPSBjXzE7CisgICAgY18xID0gY18wOworICAgIGNfcHJldltpXSA9IChVQ0hBUiljXzA7CisKKyAgfSAvKiBmb3IgKGk9MDsgaTxuOyBpKyspICovCisKKyAgRkRLcHVzaEJhY2soYmJ1ZiwgY2JpdHNuZXcgLSAyKTsKKworICAvKiBXZSBuZWVkIHRvIHJ1biBvbmx5IGZyb20gMCB0byBpLTEgc2luY2UgYWxsIG90aGVyIHFbaV1bMV0uYSxiIHdpbGwgYmUKKyAgICogY2xlYXJlZCBsYXRlciAqLworICBpbnQgaiA9IGk7CisgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICBpbnQgYml0cyA9IDA7CisgICAgaWYgKHBTcGVjdHJhbENvZWZmaWNpZW50WzIgKiBpXSAhPSAoRklYUF9EQkwpMCkgYml0cysrOworICAgIGlmIChwU3BlY3RyYWxDb2VmZmljaWVudFsyICogaSArIDFdICE9IChGSVhQX0RCTCkwKSBiaXRzKys7CisKKyAgICBpZiAoYml0cykgeworICAgICAgciA9IEZES3JlYWRCaXRzKGJidWYsIGJpdHMpOworICAgICAgaWYgKHBTcGVjdHJhbENvZWZmaWNpZW50WzIgKiBpXSAhPSAoRklYUF9EQkwpMCAmJiAhKHIgPj4gKGJpdHMgLSAxKSkpIHsKKyAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnRbMiAqIGldID0gLXBTcGVjdHJhbENvZWZmaWNpZW50WzIgKiBpXTsKKyAgICAgIH0KKyAgICAgIGlmIChwU3BlY3RyYWxDb2VmZmljaWVudFsyICogaSArIDFdICE9IChGSVhQX0RCTCkwICYmICEociAmIDEpKSB7CisgICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50WzIgKiBpICsgMV0gPSAtcFNwZWN0cmFsQ29lZmZpY2llbnRbMiAqIGkgKyAxXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBGREttZW1zZXQoJmNfcHJldltpXSwgMSwgc2l6ZW9mKGNfcHJldlswXSkgKiAobnQgLSBpKSk7Cit9CisKK0NBcmNvRGF0YSAqQ0FyY29fQ3JlYXRlKHZvaWQpIHsgcmV0dXJuIEdldEFyY29EYXRhKCk7IH0KKwordm9pZCBDQXJjb19EZXN0cm95KENBcmNvRGF0YSAqcEFyY29EYXRhKSB7IEZyZWVBcmNvRGF0YSgmcEFyY29EYXRhKTsgfQorCitBUklUSF9DT0RJTkdfRVJST1IgQ0FyY29fRGVjb2RlQXJpdGhEYXRhKENBcmNvRGF0YSAqcEFyY29EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBtZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZywgaW50IGxnX21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyaXRoX3Jlc2V0X2ZsYWcpIHsKKyAgQVJJVEhfQ09ESU5HX0VSUk9SIEVycm9yU3RhdHVzID0gQVJJVEhfQ09ERVJfT0s7CisKKyAgLyogQ2hlY2sgbGcgYW5kIGxnX21heCBjb25zaXN0ZW5jeS4gKi8KKyAgaWYgKGxnX21heCA8IGxnKSB7CisgICAgcmV0dXJuIEFSSVRIX0NPREVSX0VSUk9SOworICB9CisKKyAgRkRLbWVtY2xlYXIobWRjdFNwZWN0cnVtLCBsZ19tYXggKiBzaXplb2YoRklYUF9EQkwpKTsKKworICAvKiBhcml0aF9tYXBfY29udGV4dCAqLworICBpZiAoYXJpdGhfcmVzZXRfZmxhZykgeworICAgIEZES21lbWNsZWFyKHBBcmNvRGF0YS0+Y19wcmV2LAorICAgICAgICAgICAgICAgIHNpemVvZihwQXJjb0RhdGEtPmNfcHJldlswXSkgKiAoKGxnX21heCAvIDIpICsgNCkpOworICB9IGVsc2UgeworICAgIGlmIChsZ19tYXggIT0gcEFyY29EYXRhLT5tX251bWJlckxpbmVzUHJldikgeworICAgICAgaWYgKHBBcmNvRGF0YS0+bV9udW1iZXJMaW5lc1ByZXYgPT0gMCkgeworICAgICAgICAvKiBDYW5ub3QgZGVjb2RlIHdpdGhvdXQgYSB2YWxpZCBBQyBjb250ZXh0ICovCisgICAgICAgIHJldHVybiBBUklUSF9DT0RFUl9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogc2hvcnQtdG8tbG9uZyBvciBsb25nLXRvLXNob3J0IGJsb2NrIHRyYW5zaXRpb24gKi8KKyAgICAgIC8qIEN1cnJlbnQgbGVuZ3RoIGRpZmZlcnMgY29tcGFyZWQgdG8gcHJldmlvdXMgLSBwZXJmb3JtIHVwL2Rvd25taXggb2YKKyAgICAgICAqIG1fcWJ1ZiAqLworICAgICAgY29weVRhYmxlQW1yd2JBcml0aDIocEFyY29EYXRhLT5jX3ByZXYsIHBBcmNvRGF0YS0+bV9udW1iZXJMaW5lc1ByZXYgPj4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxnX21heCA+PiAxKTsKKyAgICB9CisgIH0KKworICBwQXJjb0RhdGEtPm1fbnVtYmVyTGluZXNQcmV2ID0gbGdfbWF4OworCisgIGlmIChsZyA+IDApIHsKKyAgICBkZWNvZGUyKGhCcywgcEFyY29EYXRhLT5jX3ByZXYgKyAyLCBtZGN0U3BlY3RydW0sIGxnID4+IDEsIGxnX21heCA+PiAxKTsKKyAgfSBlbHNlIHsKKyAgICBGREttZW1zZXQoJnBBcmNvRGF0YS0+Y19wcmV2WzJdLCAxLAorICAgICAgICAgICAgICBzaXplb2YocEFyY29EYXRhLT5jX3ByZXZbMl0pICogKGxnX21heCA+PiAxKSk7CisgIH0KKworICBpZiAoKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSA8IDApIHsKKyAgICByZXR1cm4gQVJJVEhfQ09ERVJfRVJST1I7CisgIH0KKworICByZXR1cm4gRXJyb3JTdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9saWJEUkNkZWMvaW5jbHVkZS9GREtfZHJjRGVjTGliLmggYi9saWJEUkNkZWMvaW5jbHVkZS9GREtfZHJjRGVjTGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4N2UxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9pbmNsdWRlL0ZES19kcmNEZWNMaWIuaApAQCAtMCwwICsxLDMxMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgQmVybmhhcmQgTmV1Z2ViYXVlcgorCisgICBEZXNjcmlwdGlvbjogTVBFRy1EIERSQyBEZWNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRkRLX0RSQ0RFQ0xJQl9ICisjZGVmaW5lIEZES19EUkNERUNMSUJfSAorCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworLyogRFJDIGRlY29kZXIgYWNjb3JkaW5nIHRvIElTTy9JRUMgMjMwMDMtNCAoTVBFRy1EIERSQykgKi8KKy8qIGluY2x1ZGluZyBJU08vSUVDIDIzMDAzLTQvQU1EMSAoQW1lbmRtZW50IDEpICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc19kcmNfZGVjb2RlciogSEFORExFX0RSQ19ERUNPREVSOwordHlwZWRlZiBzdHJ1Y3Qgc191bmlfZHJjX2ludGVyZmFjZSogSEFORExFX1VOSV9EUkNfSU5URVJGQUNFOwordHlwZWRlZiBzdHJ1Y3Qgc19zZWxlY3Rpb25fcHJvY2Vzc19vdXRwdXQqIEhBTkRMRV9TRUxfUFJPQ19PVVRQVVQ7CisKK3R5cGVkZWYgZW51bSB7CisgIERSQ19ERUNfU0VMRUNUSU9OID0gMHgxLCAvKiBEUkMgZGVjb2RlciBpbnN0YW5jZSBmb3IgRFJDIHNldCBzZWxlY3Rpb24gb25seSAqLworICBEUkNfREVDX0dBSU4gPSAweDIsICAgICAgLyogRFJDIGRlY29kZXIgaW5zdGFuY2UgZm9yIGFwcGx5aW5nIERSQyBvbmx5ICovCisgIERSQ19ERUNfQUxMID0gMHgzICAgICAgICAvKiBEUkMgZGVjb2RlciB3aXRoIGZ1bGwgZnVuY3Rpb25hbGl0eSAqLworfSBEUkNfREVDX0ZVTkNUSU9OQUxfUkFOR0U7CisKK3R5cGVkZWYgZW51bSB7CisgIC8qIGdldCBhbmQgc2V0IHVzZXJwYXJhbXMgKi8KKyAgRFJDX0RFQ19CT09TVCwKKyAgRFJDX0RFQ19DT01QUkVTUywKKyAgLyogc2V0IG9ubHkgdXNlcnBhcmFtcyAqLworICBEUkNfREVDX0xPVURORVNTX05PUk1BTElaQVRJT05fT04sCisgIERSQ19ERUNfVEFSR0VUX0xPVURORVNTLCAvKio8IHRhcmdldCBsb3VkbmVzcyBpbiBkQiwgd2l0aCBleHBvbmVudCBlID0gNyAqLworICBEUkNfREVDX0VGRkVDVF9UWVBFLAorICBEUkNfREVDX0VGRkVDVF9UWVBFX0ZBTExCQUNLX0NPREUsCisgIERSQ19ERUNfTE9VRE5FU1NfTUVBU1VSRU1FTlRfTUVUSE9ELAorICAvKiBzZXQgb25seSBzeXN0ZW0gKG5vdCB1c2VyKSBwYXJhbWV0ZXJzICovCisgIERSQ19ERUNfRE9XTk1JWF9JRCwKKyAgRFJDX0RFQ19UQVJHRVRfQ0hBTk5FTF9DT1VOVF9SRVFVRVNURUQsIC8qKjwgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWQgdG8gRkRLX2RyY0RlY0xpYiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zaW5nIGFuIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5zdHJ1Y3Rpb24gKi8KKyAgRFJDX0RFQ19CQVNFX0NIQU5ORUxfQ09VTlQsCisgIC8qIGdldCBvbmx5IHN5c3RlbSBwYXJhbWV0ZXJzICovCisgIERSQ19ERUNfSVNfTVVMVElCQU5EX0RSQ18xLAorICBEUkNfREVDX0lTX01VTFRJQkFORF9EUkNfMiwKKyAgRFJDX0RFQ19JU19BQ1RJVkUsIC8qKjwgTVBFRy1EIERSQyBwYXlsb2FkIGlzIHByZXNlbnQgYW5kIGF0IGxlYXN0IG9uZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pYyBSYW5nZSBDb250cm9sIChEUkMpIG9yIExvdWRuZXNzIE5vcm1hbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIChMTikgaXMgYWN0aXZhdGVkICovCisgIERSQ19ERUNfVEFSR0VUX0NIQU5ORUxfQ09VTlRfU0VMRUNURUQgLyoqPCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZG93bm1peEluc3RydWN0aW9uIGV4aXN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBEUkNfREVDX1VTRVJQQVJBTTsKKwordHlwZWRlZiBlbnVtIHsKKyAgRFJDX0RFQ19PSyA9IDAsCisKKyAgRFJDX0RFQ19OT1RfT0sgPSAtMTAwMDAsCisgIERSQ19ERUNfT1VUX09GX01FTU9SWSwKKyAgRFJDX0RFQ19OT1RfT1BFTkVELAorICBEUkNfREVDX05PVF9SRUFEWSwKKyAgRFJDX0RFQ19QQVJBTV9PVVRfT0ZfUkFOR0UsCisgIERSQ19ERUNfSU5WQUxJRF9QQVJBTSwKKyAgRFJDX0RFQ19VTlNVUFBPUlRFRF9GVU5DVElPTgorfSBEUkNfREVDX0VSUk9SOworCit0eXBlZGVmIGVudW0geworICBEUkNfREVDX1RFU1RfVElNRV9ET01BSU4gPSAtMTAwLAorICBEUkNfREVDX1RFU1RfUU1GX0RPTUFJTiwKKyAgRFJDX0RFQ19URVNUX1NURlRfRE9NQUlOLAorICBEUkNfREVDX0NPREVDX01PREVfVU5ERUZJTkVEID0gLTEsCisgIERSQ19ERUNfTVBFR180X0FBQywKKyAgRFJDX0RFQ19NUEVHX0RfVVNBQywKKyAgRFJDX0RFQ19NUEVHX0hfM0RBCit9IERSQ19ERUNfQ09ERUNfTU9ERTsKKworLyogQXBwbHkgb25seSBEUkMgc2V0cyBkZWRpY2F0ZWQgdG8gcHJvY2Vzc2luZyBsb2NhdGlvbi4KKyAgIERSQzE6IGJlZm9yZSBkb3dubWl4CisgICBEUkMyOiBiZWZvcmUgb3IgYWZ0ZXIgZG93bm1peCAoQU1EMTogb25seSBhZnRlciBkb3dubWl4KQorICAgRFJDMzogYWZ0ZXIgZG93bm1peCAqLwordHlwZWRlZiBlbnVtIHsKKyAgRFJDX0RFQ19EUkMxLAorICBEUkNfREVDX0RSQzFfRFJDMiwKKyAgRFJDX0RFQ19EUkMyLAorICBEUkNfREVDX0RSQzMsCisgIERSQ19ERUNfRFJDMl9EUkMzCit9IERSQ19ERUNfTE9DQVRJT047CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfT3BlbihIQU5ETEVfRFJDX0RFQ09ERVIqIHBoRHJjRGVjLAorICAgICAgICAgICAgICAgIGNvbnN0IERSQ19ERUNfRlVOQ1RJT05BTF9SQU5HRSBmdW5jdGlvbmFsUmFuZ2UpOworCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1NldENvZGVjTW9kZShIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19ERUNfQ09ERUNfTU9ERSBjb2RlY01vZGUpOworCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX0luaXQoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIGNvbnN0IGludCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZVJhdGUsIGNvbnN0IGludCBiYXNlQ2hhbm5lbENvdW50KTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19DbG9zZShIQU5ETEVfRFJDX0RFQ09ERVIqIHBoRHJjRGVjKTsKKworLyogc2V0IHNpbmdsZSB1c2VyIHJlcXVlc3QgKi8KK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfU2V0UGFyYW0oSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19ERUNfVVNFUlBBUkFNIHJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCByZXF1ZXN0VmFsdWUpOworCitMT05HIEZES19kcmNEZWNfR2V0UGFyYW0oSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX0RFQ19VU0VSUEFSQU0gcmVxdWVzdFR5cGUpOworCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1NldEludGVyZmFjZVBhcmFtZXRlcnMoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfSU5URVJGQUNFIHVuaURyY0ludGVyZmFjZSk7CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfU2V0U2VsZWN0aW9uUHJvY2Vzc01wZWdoUGFyYW1ldGVyc19zaW1wbGUoCisgICAgSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIGNvbnN0IGludCBncm91cFByZXNldElkUmVxdWVzdGVkLAorICAgIGNvbnN0IGludCBudW1Hcm91cElkc1JlcXVlc3RlZCwgY29uc3QgaW50KiBncm91cElkc1JlcXVlc3RlZCk7CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfU2V0RG93bm1peEluc3RydWN0aW9ucyhIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtRG93bWl4SWQsIGNvbnN0IGludCogZG93bm1peElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogdGFyZ2V0TGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogdGFyZ2V0Q2hhbm5lbENvdW50KTsKKwordm9pZCBGREtfZHJjRGVjX1NldFNlbGVjdGlvblByb2Nlc3NPdXRwdXQoCisgICAgSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIEhBTkRMRV9TRUxfUFJPQ19PVVRQVVQgaFNlbFByb2NPdXRwdXQpOworCitIQU5ETEVfU0VMX1BST0NfT1VUUFVUCitGREtfZHJjRGVjX0dldFNlbGVjdGlvblByb2Nlc3NPdXRwdXQoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMpOworCitMT05HIC8qIEZJWFBfREJMLCBlID0gNyAqLworRkRLX2RyY0RlY19HZXRHcm91cExvdWRuZXNzKEhBTkRMRV9TRUxfUFJPQ19PVVRQVVQgaFNlbFByb2NPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwSUQsIGludCogZ3JvdXBMb3VkbmVzc0F2YWlsYWJsZSk7CisKK3ZvaWQgRkRLX2RyY0RlY19TZXRDaGFubmVsR2FpbnMoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1DaGFubmVscywgY29uc3QgaW50IGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIGNoYW5uZWxHYWluRGIsIEZJWFBfREJMKiBhdWRpb0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGF1ZGlvQnVmZmVyQ2hhbm5lbE9mZnNldCk7CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUmVhZFVuaURyY0NvbmZpZyhIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkTG91ZG5lc3NJbmZvU2V0KEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pOworCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1JlYWRMb3VkbmVzc0JveChIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pOworCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1JlYWREb3dubWl4SW5zdHJ1Y3Rpb25zX0JveChIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pOworCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1JlYWRVbmlEcmNJbnN0cnVjdGlvbnNfQm94KEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkVW5pRHJjQ29lZmZpY2llbnRzX0JveChIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSk7CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUmVhZFVuaURyY0dhaW4oSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pOworCisvKiBlaXRoZXIgY2FsbCBGREtfZHJjRGVjX1JlYWRVbmlEcmNDb25maWcsIEZES19kcmNEZWNfUmVhZExvdWRuZXNzSW5mb1NldCBhbmQKKyAgIEZES19kcmNEZWNfUmVhZFVuaURyY0dhaW4gc2VwYXJhdGVseSwgb3IgY2FsbCBGREtfZHJjRGVjX1JlYWRVbmlEcmMgKi8KK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUmVhZFVuaURyYyhIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKTsKKworLyogY2FsbGluZyBzZXF1ZW5jZToKKyAgIEZES19kcmNEZWNfUmVhZC4uLigpCisgICBGREtfZHJjRGVjX1NldENoYW5uZWxHYWlucygpCisgICBGREtfZHJjRGVjX1ByZXByb2Nlc3MoKQorICAgRkRLX2RyY0RlY19Qcm9jZXNzLi4uKCkgKi8KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19QcmVwcm9jZXNzKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjKTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19Qcm9jZXNzVGltZShIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywgY29uc3QgaW50IGRlbGF5U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX0RFQ19MT0NBVElPTiBkcmNMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW5uZWxPZmZzZXQsIGNvbnN0IGludCBkcmNDaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsIEZJWFBfREJMKiByZWFsQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGltZURhdGFDaGFubmVsT2Zmc2V0KTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19Qcm9jZXNzRnJlcShIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywgY29uc3QgaW50IGRlbGF5U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX0RFQ19MT0NBVElPTiBkcmNMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW5uZWxPZmZzZXQsIGNvbnN0IGludCBkcmNDaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwcm9jZXNzU2luZ2xlVGltZXNsb3QsIEZJWFBfREJMKiogcmVhbEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqKiBpbWFnQnVmZmVyKTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19BcHBseURvd25taXgoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIGludCogcmV2ZXJzZUluQ2hhbm5lbE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogcmV2ZXJzZU91dENoYW5uZWxNYXAsIEZJWFBfREJMKiByZWFsQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwTkNoYW5uZWxzKTsKKworLyogR2V0IGxpYnJhcnkgaW5mbyBmb3IgdGhpcyBtb2R1bGUuICovCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX0dldExpYkluZm8oTElCX0lORk8qIGluZm8pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJEUkNkZWMvc3JjL0ZES19kcmNEZWNMaWIuY3BwIGIvbGliRFJDZGVjL3NyYy9GREtfZHJjRGVjTGliLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjliNzlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9GREtfZHJjRGVjTGliLmNwcApAQCAtMCwwICsxLDg5MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgQmVybmhhcmQgTmV1Z2ViYXVlcgorCisgICBEZXNjcmlwdGlvbjogTVBFRy1EIERSQyBEZWNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkcmNEZWNfcmVhZGVyLmgiCisjaW5jbHVkZSAiZHJjRGVjX2dhaW5EZWNvZGVyLmgiCisjaW5jbHVkZSAiRkRLX2RyY0RlY0xpYi5oIgorCisjaW5jbHVkZSAiZHJjRGVjX3NlbGVjdGlvblByb2Nlc3MuaCIKKyNpbmNsdWRlICJkcmNEZWNfdG9vbHMuaCIKKworLyogRGVjb2RlciBsaWJyYXJ5IGluZm8gKi8KKyNkZWZpbmUgRFJDREVDX0xJQl9WTDAgMgorI2RlZmluZSBEUkNERUNfTElCX1ZMMSAxCisjZGVmaW5lIERSQ0RFQ19MSUJfVkwyIDAKKyNkZWZpbmUgRFJDREVDX0xJQl9USVRMRSAiTVBFRy1EIERSQyBEZWNvZGVyIExpYiIKKyNpZmRlZiBfX0FORFJPSURfXworI2RlZmluZSBEUkNERUNfTElCX0JVSUxEX0RBVEUgIiIKKyNkZWZpbmUgRFJDREVDX0xJQl9CVUlMRF9USU1FICIiCisjZWxzZQorI2RlZmluZSBEUkNERUNfTElCX0JVSUxEX0RBVEUgX19EQVRFX18KKyNkZWZpbmUgRFJDREVDX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKyAgRFJDX0RFQ19OT1RfSU5JVElBTElaRUQgPSAwLAorICBEUkNfREVDX0lOSVRJQUxJWkVELAorICBEUkNfREVDX05FV19HQUlOX1BBWUxPQUQsCisgIERSQ19ERUNfSU5URVJQT0xBVElPTl9QUkVQQVJFRAorfSBEUkNfREVDX1NUQVRVUzsKKworc3RydWN0IHNfZHJjX2RlY29kZXIgeworICBEUkNfREVDX0NPREVDX01PREUgY29kZWNNb2RlOworICBEUkNfREVDX0ZVTkNUSU9OQUxfUkFOR0UgZnVuY3Rpb25hbFJhbmdlOworICBEUkNfREVDX1NUQVRVUyBzdGF0dXM7CisKKyAgLyogaGFuZGxlcyBvZiBzdWJtb2R1bGVzICovCisgIEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjOworICBIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTIGhTZWxlY3Rpb25Qcm9jOworICBpbnQgc2VsUHJvY0lucHV0RGlmZjsKKworICAvKiBkYXRhIHN0cnVjdHMgKi8KKyAgVU5JX0RSQ19DT05GSUcgdW5pRHJjQ29uZmlnOworICBMT1VETkVTU19JTkZPX1NFVCBsb3VkbmVzc0luZm9TZXQ7CisgIFVOSV9EUkNfR0FJTiB1bmlEcmNHYWluOworCisgIFNFTF9QUk9DX09VVFBVVCBzZWxQcm9jT3V0cHV0OworfSBEUkNfREVDT0RFUjsKKworc3RhdGljIGludCBpc1Jlc2V0TmVlZGVkKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNFTF9QUk9DX09VVFBVVCBvbGRTZWxQcm9jT3V0cHV0KSB7CisgIGludCBpLCByZXNldE5lZWRlZCA9IDA7CisKKyAgaWYgKGhEcmNEZWMtPnNlbFByb2NPdXRwdXQubnVtU2VsZWN0ZWREcmNTZXRzICE9CisgICAgICBvbGRTZWxQcm9jT3V0cHV0Lm51bVNlbGVjdGVkRHJjU2V0cykgeworICAgIHJlc2V0TmVlZGVkID0gMTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaERyY0RlYy0+c2VsUHJvY091dHB1dC5udW1TZWxlY3RlZERyY1NldHM7IGkrKykgeworICAgICAgaWYgKGhEcmNEZWMtPnNlbFByb2NPdXRwdXQuc2VsZWN0ZWREcmNTZXRJZHNbaV0gIT0KKyAgICAgICAgICBvbGRTZWxQcm9jT3V0cHV0LnNlbGVjdGVkRHJjU2V0SWRzW2ldKQorICAgICAgICByZXNldE5lZWRlZCA9IDE7CisgICAgICBpZiAoaERyY0RlYy0+c2VsUHJvY091dHB1dC5zZWxlY3RlZERvd25taXhJZHNbaV0gIT0KKyAgICAgICAgICBvbGRTZWxQcm9jT3V0cHV0LnNlbGVjdGVkRG93bm1peElkc1tpXSkKKyAgICAgICAgcmVzZXROZWVkZWQgPSAxOworICAgIH0KKyAgfQorCisgIGlmIChoRHJjRGVjLT5zZWxQcm9jT3V0cHV0LmJvb3N0ICE9IG9sZFNlbFByb2NPdXRwdXQuYm9vc3QpIHJlc2V0TmVlZGVkID0gMTsKKyAgaWYgKGhEcmNEZWMtPnNlbFByb2NPdXRwdXQuY29tcHJlc3MgIT0gb2xkU2VsUHJvY091dHB1dC5jb21wcmVzcykKKyAgICByZXNldE5lZWRlZCA9IDE7CisKKyAgLyogTm90ZTogQ2hhbmdlcyBpbiBkb3dubWl4IG1hdHJpeCBhcmUgbm90IGNhdWdodCwgYXMgdGhleSBkb24ndCBhZmZlY3QgdGhlCisgICAqIERSQyBnYWluIGRlY29kZXIgKi8KKworICByZXR1cm4gcmVzZXROZWVkZWQ7Cit9CisKK3N0YXRpYyBEUkNfREVDX0VSUk9SIHN0YXJ0U2VsZWN0aW9uUHJvY2VzcyhIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYykgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHNFcnIgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgIGludCB1bmlEcmNDb25maWdIYXNDaGFuZ2VkID0gMDsKKyAgU0VMX1BST0NfT1VUUFVUIG9sZFNlbFByb2NPdXRwdXQgPSBoRHJjRGVjLT5zZWxQcm9jT3V0cHV0OworCisgIGlmICghaERyY0RlYy0+c3RhdHVzKSByZXR1cm4gRFJDX0RFQ19OT1RfUkVBRFk7CisKKyAgaWYgKGhEcmNEZWMtPmZ1bmN0aW9uYWxSYW5nZSAmIERSQ19ERUNfU0VMRUNUSU9OKSB7CisgICAgdW5pRHJjQ29uZmlnSGFzQ2hhbmdlZCA9IGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kaWZmOworICAgIGlmIChoRHJjRGVjLT51bmlEcmNDb25maWcuZGlmZiB8fCBoRHJjRGVjLT5sb3VkbmVzc0luZm9TZXQuZGlmZiB8fAorICAgICAgICBoRHJjRGVjLT5zZWxQcm9jSW5wdXREaWZmKSB7CisgICAgICAvKiBpbiBjYXNlIG9mIGFuIGVycm9yLCBzaWduYWwgdGhhdCBzZWxlY3Rpb24gcHJvY2VzcyB3YXMgbm90IHN1Y2Nlc3NmdWwKKyAgICAgICAqLworICAgICAgaERyY0RlYy0+c2VsUHJvY091dHB1dC5udW1TZWxlY3RlZERyY1NldHMgPSAwOworCisgICAgICBzRXJyID0gZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfUHJvY2VzcygKKyAgICAgICAgICBoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywgJihoRHJjRGVjLT51bmlEcmNDb25maWcpLAorICAgICAgICAgICYoaERyY0RlYy0+bG91ZG5lc3NJbmZvU2V0KSwgJihoRHJjRGVjLT5zZWxQcm9jT3V0cHV0KSk7CisgICAgICBpZiAoc0VycikgcmV0dXJuIERSQ19ERUNfT0s7CisKKyAgICAgIGhEcmNEZWMtPnNlbFByb2NJbnB1dERpZmYgPSAwOworICAgICAgaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRpZmYgPSAwOworICAgICAgaERyY0RlYy0+bG91ZG5lc3NJbmZvU2V0LmRpZmYgPSAwOworICAgIH0KKyAgfQorCisgIGlmIChoRHJjRGVjLT5mdW5jdGlvbmFsUmFuZ2UgJiBEUkNfREVDX0dBSU4pIHsKKyAgICBpZiAoaXNSZXNldE5lZWRlZChoRHJjRGVjLCBvbGRTZWxQcm9jT3V0cHV0KSB8fCB1bmlEcmNDb25maWdIYXNDaGFuZ2VkKSB7CisgICAgICBkRXJyID0KKyAgICAgICAgICBkcmNEZWNfR2FpbkRlY29kZXJfQ29uZmlnKGhEcmNEZWMtPmhHYWluRGVjLCAmKGhEcmNEZWMtPnVuaURyY0NvbmZpZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRHJjRGVjLT5zZWxQcm9jT3V0cHV0Lm51bVNlbGVjdGVkRHJjU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhEcmNEZWMtPnNlbFByb2NPdXRwdXQuc2VsZWN0ZWREcmNTZXRJZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRHJjRGVjLT5zZWxQcm9jT3V0cHV0LnNlbGVjdGVkRG93bm1peElkcyk7CisgICAgICBpZiAoZEVycikgcmV0dXJuIERSQ19ERUNfT0s7CisgICAgfQorICB9CisgIHJldHVybiBEUkNfREVDX09LOworfQorCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX09wZW4oSEFORExFX0RSQ19ERUNPREVSKiBwaERyY0RlYywKKyAgICAgICAgICAgICAgICBjb25zdCBEUkNfREVDX0ZVTkNUSU9OQUxfUkFOR0UgZnVuY3Rpb25hbFJhbmdlKSB7CisgIERSQ19FUlJPUiBkRXJyID0gREVfT0s7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gc0VyciA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWM7CisKKyAgKnBoRHJjRGVjID0gKEhBTkRMRV9EUkNfREVDT0RFUilGREtjYWxsb2MoMSwgc2l6ZW9mKERSQ19ERUNPREVSKSk7CisgIGlmICghKnBoRHJjRGVjKSByZXR1cm4gRFJDX0RFQ19PVVRfT0ZfTUVNT1JZOworICBoRHJjRGVjID0gKnBoRHJjRGVjOworCisgIGhEcmNEZWMtPmZ1bmN0aW9uYWxSYW5nZSA9IGZ1bmN0aW9uYWxSYW5nZTsKKworICBoRHJjRGVjLT5zdGF0dXMgPSBEUkNfREVDX05PVF9JTklUSUFMSVpFRDsKKyAgaERyY0RlYy0+Y29kZWNNb2RlID0gRFJDX0RFQ19DT0RFQ19NT0RFX1VOREVGSU5FRDsKKworICBpZiAoaERyY0RlYy0+ZnVuY3Rpb25hbFJhbmdlICYgRFJDX0RFQ19TRUxFQ1RJT04pIHsKKyAgICBzRXJyID0gZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfQ3JlYXRlKCYoaERyY0RlYy0+aFNlbGVjdGlvblByb2MpKTsKKyAgICBpZiAoc0VycikgcmV0dXJuIERSQ19ERUNfT1VUX09GX01FTU9SWTsKKyAgICBzRXJyID0gZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfSW5pdChoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYyk7CisgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKyAgICBoRHJjRGVjLT5zZWxQcm9jSW5wdXREaWZmID0gMTsKKyAgfQorCisgIGlmIChoRHJjRGVjLT5mdW5jdGlvbmFsUmFuZ2UgJiBEUkNfREVDX0dBSU4pIHsKKyAgICBkRXJyID0gZHJjRGVjX0dhaW5EZWNvZGVyX09wZW4oJihoRHJjRGVjLT5oR2FpbkRlYykpOworICAgIGlmIChkRXJyKSByZXR1cm4gRFJDX0RFQ19PVVRfT0ZfTUVNT1JZOworICB9CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfU2V0Q29kZWNNb2RlKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX0RFQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSkgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHNFcnIgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKworICBpZiAoaERyY0RlYy0+Y29kZWNNb2RlID09CisgICAgICBEUkNfREVDX0NPREVDX01PREVfVU5ERUZJTkVEKSB7IC8qIFNldCBjb2RlYyBtb2RlLCBpZiBpdCBpcyBzZXQgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCB0aW1lICovCisgICAgaERyY0RlYy0+Y29kZWNNb2RlID0gY29kZWNNb2RlOworCisgICAgaWYgKGhEcmNEZWMtPmZ1bmN0aW9uYWxSYW5nZSAmIERSQ19ERUNfU0VMRUNUSU9OKSB7CisgICAgICBzRXJyID0gZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfU2V0Q29kZWNNb2RlKAorICAgICAgICAgIGhEcmNEZWMtPmhTZWxlY3Rpb25Qcm9jLCAoU0VMX1BST0NfQ09ERUNfTU9ERSljb2RlY01vZGUpOworICAgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKyAgICAgIGhEcmNEZWMtPnNlbFByb2NJbnB1dERpZmYgPSAxOworICAgIH0KKworICAgIGlmIChoRHJjRGVjLT5mdW5jdGlvbmFsUmFuZ2UgJiBEUkNfREVDX0dBSU4pIHsKKyAgICAgIERFTEFZX01PREUgZGVsYXlNb2RlOworICAgICAgaW50IHRpbWVEb21haW5TdXBwb3J0ZWQ7CisgICAgICBTVUJCQU5EX0RPTUFJTl9NT0RFIHN1YmJhbmREb21haW5TdXBwb3J0ZWQ7CisKKyAgICAgIHN3aXRjaCAoaERyY0RlYy0+Y29kZWNNb2RlKSB7CisgICAgICAgIGNhc2UgRFJDX0RFQ19NUEVHXzRfQUFDOgorICAgICAgICBjYXNlIERSQ19ERUNfTVBFR19EX1VTQUM6CisgICAgICAgIGNhc2UgRFJDX0RFQ19NUEVHX0hfM0RBOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGRlbGF5TW9kZSA9IERNX1JFR1VMQVJfREVMQVk7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoaERyY0RlYy0+Y29kZWNNb2RlKSB7CisgICAgICAgIGNhc2UgRFJDX0RFQ19NUEVHXzRfQUFDOgorICAgICAgICBjYXNlIERSQ19ERUNfTVBFR19EX1VTQUM6CisgICAgICAgICAgdGltZURvbWFpblN1cHBvcnRlZCA9IDE7CisgICAgICAgICAgc3ViYmFuZERvbWFpblN1cHBvcnRlZCA9IFNETV9PRkY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFJDX0RFQ19NUEVHX0hfM0RBOgorICAgICAgICAgIHRpbWVEb21haW5TdXBwb3J0ZWQgPSAxOworICAgICAgICAgIHN1YmJhbmREb21haW5TdXBwb3J0ZWQgPSBTRE1fU1RGVDI1NjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERSQ19ERUNfVEVTVF9USU1FX0RPTUFJTjoKKyAgICAgICAgICB0aW1lRG9tYWluU3VwcG9ydGVkID0gMTsKKyAgICAgICAgICBzdWJiYW5kRG9tYWluU3VwcG9ydGVkID0gU0RNX09GRjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEUkNfREVDX1RFU1RfUU1GX0RPTUFJTjoKKyAgICAgICAgICB0aW1lRG9tYWluU3VwcG9ydGVkID0gMDsKKyAgICAgICAgICBzdWJiYW5kRG9tYWluU3VwcG9ydGVkID0gU0RNX1FNRjY0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERSQ19ERUNfVEVTVF9TVEZUX0RPTUFJTjoKKyAgICAgICAgICB0aW1lRG9tYWluU3VwcG9ydGVkID0gMDsKKyAgICAgICAgICBzdWJiYW5kRG9tYWluU3VwcG9ydGVkID0gU0RNX1NURlQyNTY7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aW1lRG9tYWluU3VwcG9ydGVkID0gMDsKKyAgICAgICAgICBzdWJiYW5kRG9tYWluU3VwcG9ydGVkID0gU0RNX09GRjsKKyAgICAgIH0KKworICAgICAgZEVyciA9IGRyY0RlY19HYWluRGVjb2Rlcl9TZXRDb2RlY0RlcGVuZGVudFBhcmFtZXRlcnMoCisgICAgICAgICAgaERyY0RlYy0+aEdhaW5EZWMsIGRlbGF5TW9kZSwgdGltZURvbWFpblN1cHBvcnRlZCwKKyAgICAgICAgICBzdWJiYW5kRG9tYWluU3VwcG9ydGVkKTsKKyAgICAgIGlmIChkRXJyKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisgICAgfQorICB9CisKKyAgLyogRG9uJ3QgYWxsb3cgY2hhbmdpbmcgY29kZWNNb2RlIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gc2V0LiAqLworICBpZiAoaERyY0RlYy0+Y29kZWNNb2RlICE9IGNvZGVjTW9kZSkgcmV0dXJuIERSQ19ERUNfTk9UX09LOworCisgIHJldHVybiBEUkNfREVDX09LOworfQorCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX0luaXQoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIGNvbnN0IGludCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZVJhdGUsIGNvbnN0IGludCBiYXNlQ2hhbm5lbENvdW50KSB7CisgIERSQ19FUlJPUiBkRXJyID0gREVfT0s7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gc0VyciA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKworICBpZiAoaERyY0RlYyA9PSBOVUxMIHx8IGZyYW1lU2l6ZSA9PSAwIHx8IHNhbXBsZVJhdGUgPT0gMCB8fAorICAgICAgYmFzZUNoYW5uZWxDb3VudCA9PSAwKQorICAgIHJldHVybiBEUkNfREVDX09LOyAvKiByZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZyAqLworCisgIGlmIChoRHJjRGVjLT5mdW5jdGlvbmFsUmFuZ2UgJiBEUkNfREVDX1NFTEVDVElPTikgeworICAgIHNFcnIgPSBkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRQYXJhbSgKKyAgICAgICAgaERyY0RlYy0+aFNlbGVjdGlvblByb2MsIFNFTF9QUk9DX0JBU0VfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgKEZJWFBfREJMKWJhc2VDaGFubmVsQ291bnQsICYoaERyY0RlYy0+c2VsUHJvY0lucHV0RGlmZikpOworICAgIGlmIChzRXJyKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisgICAgc0VyciA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldFBhcmFtKAorICAgICAgICBoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywgU0VMX1BST0NfU0FNUExFX1JBVEUsIChGSVhQX0RCTClzYW1wbGVSYXRlLAorICAgICAgICAmKGhEcmNEZWMtPnNlbFByb2NJbnB1dERpZmYpKTsKKyAgICBpZiAoc0VycikgcmV0dXJuIERSQ19ERUNfTk9UX09LOworICB9CisKKyAgaWYgKGhEcmNEZWMtPmZ1bmN0aW9uYWxSYW5nZSAmIERSQ19ERUNfR0FJTikgeworICAgIGRFcnIgPSBkcmNEZWNfR2FpbkRlY29kZXJfSW5pdChoRHJjRGVjLT5oR2FpbkRlYywgZnJhbWVTaXplLCBzYW1wbGVSYXRlKTsKKyAgICBpZiAoZEVycikgcmV0dXJuIERSQ19ERUNfTk9UX09LOworICB9CisKKyAgaERyY0RlYy0+c3RhdHVzID0gRFJDX0RFQ19JTklUSUFMSVpFRDsKKworICBzdGFydFNlbGVjdGlvblByb2Nlc3MoaERyY0RlYyk7CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfQ2xvc2UoSEFORExFX0RSQ19ERUNPREVSKiBwaERyY0RlYykgeworICBIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYzsKKworICBpZiAocGhEcmNEZWMgPT0gTlVMTCkgeworICAgIHJldHVybiBEUkNfREVDX09LOworICB9CisKKyAgaERyY0RlYyA9ICpwaERyY0RlYzsKKworICBpZiAoaERyY0RlYyA9PSBOVUxMKSByZXR1cm4gRFJDX0RFQ19OT1RfT1BFTkVEOworCisgIGlmIChoRHJjRGVjLT5mdW5jdGlvbmFsUmFuZ2UgJiBEUkNfREVDX0dBSU4pIHsKKyAgICBkcmNEZWNfR2FpbkRlY29kZXJfQ2xvc2UoJihoRHJjRGVjLT5oR2FpbkRlYykpOworICB9CisKKyAgaWYgKGhEcmNEZWMtPmZ1bmN0aW9uYWxSYW5nZSAmIERSQ19ERUNfU0VMRUNUSU9OKSB7CisgICAgZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfRGVsZXRlKCYoaERyY0RlYy0+aFNlbGVjdGlvblByb2MpKTsKKyAgfQorCisgIEZES2ZyZWUoKnBoRHJjRGVjKTsKKyAgKnBoRHJjRGVjID0gTlVMTDsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19TZXRQYXJhbShIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX0RFQ19VU0VSUEFSQU0gcmVxdWVzdFR5cGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHJlcXVlc3RWYWx1ZSkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHNFcnIgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKworICBpZiAoaERyY0RlYy0+ZnVuY3Rpb25hbFJhbmdlID09IERSQ19ERUNfR0FJTikKKyAgICByZXR1cm4gRFJDX0RFQ19OT1RfT0s7IC8qIG5vdCBzdXBwb3J0ZWQgZm9yIERSQ19ERUNfR0FJTi4gQWxsIHBhcmFtZXRlcnMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kZWQgb3ZlciB0byBzZWxlY3Rpb24gcHJvY2VzcyBsaWIuICovCisKKyAgc3dpdGNoIChyZXF1ZXN0VHlwZSkgeworICAgIGNhc2UgRFJDX0RFQ19CT09TVDoKKyAgICAgIHNFcnIgPSBkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRQYXJhbShoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxfUFJPQ19CT09TVCwgcmVxdWVzdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaERyY0RlYy0+c2VsUHJvY0lucHV0RGlmZikpOworICAgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX0RFQ19DT01QUkVTUzoKKyAgICAgIHNFcnIgPSBkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRQYXJhbShoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxfUFJPQ19DT01QUkVTUywgcmVxdWVzdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaERyY0RlYy0+c2VsUHJvY0lucHV0RGlmZikpOworICAgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX0RFQ19MT1VETkVTU19OT1JNQUxJWkFUSU9OX09OOgorICAgICAgc0VyciA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldFBhcmFtKAorICAgICAgICAgIGhEcmNEZWMtPmhTZWxlY3Rpb25Qcm9jLCBTRUxfUFJPQ19MT1VETkVTU19OT1JNQUxJWkFUSU9OX09OLAorICAgICAgICAgIHJlcXVlc3RWYWx1ZSwgJihoRHJjRGVjLT5zZWxQcm9jSW5wdXREaWZmKSk7CisgICAgICBpZiAoc0VycikgcmV0dXJuIERSQ19ERUNfUEFSQU1fT1VUX09GX1JBTkdFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfREVDX1RBUkdFVF9MT1VETkVTUzoKKyAgICAgIHNFcnIgPSBkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRQYXJhbSgKKyAgICAgICAgICBoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywgU0VMX1BST0NfVEFSR0VUX0xPVURORVNTLCByZXF1ZXN0VmFsdWUsCisgICAgICAgICAgJihoRHJjRGVjLT5zZWxQcm9jSW5wdXREaWZmKSk7CisgICAgICBpZiAoc0VycikgcmV0dXJuIERSQ19ERUNfUEFSQU1fT1VUX09GX1JBTkdFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfREVDX0VGRkVDVF9UWVBFOgorICAgICAgc0VyciA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldFBhcmFtKAorICAgICAgICAgIGhEcmNEZWMtPmhTZWxlY3Rpb25Qcm9jLCBTRUxfUFJPQ19FRkZFQ1RfVFlQRSwgcmVxdWVzdFZhbHVlLAorICAgICAgICAgICYoaERyY0RlYy0+c2VsUHJvY0lucHV0RGlmZikpOworICAgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX0RFQ19ET1dOTUlYX0lEOgorICAgICAgc0VyciA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldFBhcmFtKGhEcmNEZWMtPmhTZWxlY3Rpb25Qcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTF9QUk9DX0RPV05NSVhfSUQsIHJlcXVlc3RWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhEcmNEZWMtPnNlbFByb2NJbnB1dERpZmYpKTsKKyAgICAgIGlmIChzRXJyKSByZXR1cm4gRFJDX0RFQ19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19ERUNfVEFSR0VUX0NIQU5ORUxfQ09VTlRfUkVRVUVTVEVEOgorICAgICAgc0VyciA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldFBhcmFtKAorICAgICAgICAgIGhEcmNEZWMtPmhTZWxlY3Rpb25Qcm9jLCBTRUxfUFJPQ19UQVJHRVRfQ0hBTk5FTF9DT1VOVCwgcmVxdWVzdFZhbHVlLAorICAgICAgICAgICYoaERyY0RlYy0+c2VsUHJvY0lucHV0RGlmZikpOworICAgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX0RFQ19CQVNFX0NIQU5ORUxfQ09VTlQ6CisgICAgICBzRXJyID0gZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfU2V0UGFyYW0oCisgICAgICAgICAgaERyY0RlYy0+aFNlbGVjdGlvblByb2MsIFNFTF9QUk9DX0JBU0VfQ0hBTk5FTF9DT1VOVCwgcmVxdWVzdFZhbHVlLAorICAgICAgICAgICYoaERyY0RlYy0+c2VsUHJvY0lucHV0RGlmZikpOworICAgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX0RFQ19MT1VETkVTU19NRUFTVVJFTUVOVF9NRVRIT0Q6CisgICAgICBzRXJyID0gZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfU2V0UGFyYW0oCisgICAgICAgICAgaERyY0RlYy0+aFNlbGVjdGlvblByb2MsIFNFTF9QUk9DX0xPVURORVNTX01FQVNVUkVNRU5UX01FVEhPRCwKKyAgICAgICAgICByZXF1ZXN0VmFsdWUsICYoaERyY0RlYy0+c2VsUHJvY0lucHV0RGlmZikpOworICAgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRFJDX0RFQ19JTlZBTElEX1BBUkFNOworICB9CisKKyAgLyogQWxsIHBhcmFtZXRlcnMgbmVlZCBhIG5ldyBzdGFydCBvZiB0aGUgc2VsZWN0aW9uIHByb2Nlc3MgKi8KKyAgc3RhcnRTZWxlY3Rpb25Qcm9jZXNzKGhEcmNEZWMpOworCisgIHJldHVybiBEUkNfREVDX09LOworfQorCitMT05HIEZES19kcmNEZWNfR2V0UGFyYW0oSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX0RFQ19VU0VSUEFSQU0gcmVxdWVzdFR5cGUpIHsKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKworICBzd2l0Y2ggKHJlcXVlc3RUeXBlKSB7CisgICAgY2FzZSBEUkNfREVDX0JPT1NUOgorICAgICAgcmV0dXJuIChMT05HKWhEcmNEZWMtPnNlbFByb2NPdXRwdXQuYm9vc3Q7CisgICAgY2FzZSBEUkNfREVDX0NPTVBSRVNTOgorICAgICAgcmV0dXJuIChMT05HKWhEcmNEZWMtPnNlbFByb2NPdXRwdXQuY29tcHJlc3M7CisgICAgY2FzZSBEUkNfREVDX0lTX01VTFRJQkFORF9EUkNfMToKKyAgICAgIHJldHVybiAoTE9ORyliaXRzdHJlYW1Db250YWluc011bHRpYmFuZERyYygmaERyY0RlYy0+dW5pRHJjQ29uZmlnLCAwKTsKKyAgICBjYXNlIERSQ19ERUNfSVNfTVVMVElCQU5EX0RSQ18yOgorICAgICAgcmV0dXJuIChMT05HKWJpdHN0cmVhbUNvbnRhaW5zTXVsdGliYW5kRHJjKCZoRHJjRGVjLT51bmlEcmNDb25maWcsIDB4N0YpOworICAgIGNhc2UgRFJDX0RFQ19JU19BQ1RJVkU6IHsKKyAgICAgIC8qIE1QRUctRCBEUkMgaXMgY29uc2lkZXJlZCBhY3RpdmUgKGFuZCBvdmVycmlkZXMgTVBFRy00IERSQyksIGlmCisgICAgICAgKiB1bmlEcmMgcGF5bG9hZCBpcyBwcmVzZW50IChsb3VkbmVzc0luZm9TZXQgYW5kL29yIHVuaURyY0NvbmZpZykKKyAgICAgICAqIGF0IGxlYXN0IG9uZSBvZiBEUkMgYW5kIExvdWRuZXNzIENvbnRyb2wgaXMgc3dpdGNoZWQgb24gKi8KKyAgICAgIGludCBkcmNPbiA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX0dldFBhcmFtKAorICAgICAgICAgIGhEcmNEZWMtPmhTZWxlY3Rpb25Qcm9jLCBTRUxfUFJPQ19EWU5BTUlDX1JBTkdFX0NPTlRST0xfT04pOworICAgICAgaW50IGxuT24gPSBkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19HZXRQYXJhbSgKKyAgICAgICAgICBoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywgU0VMX1BST0NfTE9VRE5FU1NfTk9STUFMSVpBVElPTl9PTik7CisgICAgICBpbnQgdW5pRHJjUGF5bG9hZFByZXNlbnQgPQorICAgICAgICAgIChoRHJjRGVjLT5sb3VkbmVzc0luZm9TZXQubG91ZG5lc3NJbmZvQ291bnQgPiAwKTsKKyAgICAgIHVuaURyY1BheWxvYWRQcmVzZW50IHw9CisgICAgICAgICAgKGhEcmNEZWMtPmxvdWRuZXNzSW5mb1NldC5sb3VkbmVzc0luZm9BbGJ1bUNvdW50ID4gMCk7CisgICAgICB1bmlEcmNQYXlsb2FkUHJlc2VudCB8PQorICAgICAgICAgIChoRHJjRGVjLT51bmlEcmNDb25maWcuZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQgPiAwKTsKKyAgICAgIHVuaURyY1BheWxvYWRQcmVzZW50IHw9CisgICAgICAgICAgKGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnQgPiAwKTsKKyAgICAgIHJldHVybiAoTE9ORykodW5pRHJjUGF5bG9hZFByZXNlbnQgJiYgKGRyY09uIHx8IGxuT24pKTsKKyAgICB9CisgICAgY2FzZSBEUkNfREVDX1RBUkdFVF9DSEFOTkVMX0NPVU5UX1NFTEVDVEVEOgorICAgICAgcmV0dXJuIChMT05HKWhEcmNEZWMtPnNlbFByb2NPdXRwdXQudGFyZ2V0Q2hhbm5lbENvdW50OworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorfQorCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1NldEludGVyZmFjZVBhcmFtZXRlcnMoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfSU5URVJGQUNFIGhVbmlEcmNJbnRlcmZhY2UpIHsKKyAgcmV0dXJuIERSQ19ERUNfVU5TVVBQT1JURURfRlVOQ1RJT047Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfU2V0U2VsZWN0aW9uUHJvY2Vzc01wZWdoUGFyYW1ldGVyc19zaW1wbGUoCisgICAgSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIGNvbnN0IGludCBncm91cFByZXNldElkUmVxdWVzdGVkLAorICAgIGNvbnN0IGludCBudW1Hcm91cElkc1JlcXVlc3RlZCwgY29uc3QgaW50KiBncm91cElkc1JlcXVlc3RlZCkgeworICByZXR1cm4gRFJDX0RFQ19VTlNVUFBPUlRFRF9GVU5DVElPTjsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19TZXREb3dubWl4SW5zdHJ1Y3Rpb25zKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1Eb3dubWl4SWQsIGNvbnN0IGludCogZG93bm1peElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogdGFyZ2V0TGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogdGFyZ2V0Q2hhbm5lbENvdW50KSB7CisgIHJldHVybiBEUkNfREVDX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOworfQorCit2b2lkIEZES19kcmNEZWNfU2V0U2VsZWN0aW9uUHJvY2Vzc091dHB1dCgKKyAgICBIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywgSEFORExFX1NFTF9QUk9DX09VVFBVVCBoU2VsUHJvY091dHB1dCkge30KKworSEFORExFX1NFTF9QUk9DX09VVFBVVAorRkRLX2RyY0RlY19HZXRTZWxlY3Rpb25Qcm9jZXNzT3V0cHV0KEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjKSB7CisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIHJldHVybiAmKGhEcmNEZWMtPnNlbFByb2NPdXRwdXQpOworfQorCitMT05HIC8qIEZJWFBfREJMLCBlID0gNyAqLworRkRLX2RyY0RlY19HZXRHcm91cExvdWRuZXNzKEhBTkRMRV9TRUxfUFJPQ19PVVRQVVQgaFNlbFByb2NPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwSUQsIGludCogZ3JvdXBMb3VkbmVzc0F2YWlsYWJsZSkgeworICByZXR1cm4gKExPTkcpMDsKK30KKwordm9pZCBGREtfZHJjRGVjX1NldENoYW5uZWxHYWlucyhIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUNoYW5uZWxzLCBjb25zdCBpbnQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogY2hhbm5lbEdhaW5EYiwgRklYUF9EQkwqIGF1ZGlvQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYXVkaW9CdWZmZXJDaGFubmVsT2Zmc2V0KSB7CisgIGludCBlcnI7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuOworCisgIGVyciA9IGRyY0RlY19HYWluRGVjb2Rlcl9TZXRMb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIoCisgICAgICBoRHJjRGVjLT5oR2FpbkRlYywgaERyY0RlYy0+c2VsUHJvY091dHB1dC5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIpOworICBpZiAoZXJyKSByZXR1cm47CisKKyAgZHJjRGVjX0dhaW5EZWNvZGVyX1NldENoYW5uZWxHYWlucyhoRHJjRGVjLT5oR2FpbkRlYywgbnVtQ2hhbm5lbHMsIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsR2FpbkRiLCBhdWRpb0J1ZmZlckNoYW5uZWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXIpOworfQorCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1JlYWRVbmlEcmNDb25maWcoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSkgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisKKyAgaWYgKGhEcmNEZWMtPmNvZGVjTW9kZSA9PSBEUkNfREVDX01QRUdfRF9VU0FDKSB7CisgICAgZEVyciA9IGRyY0RlY19yZWFkVW5pRHJjQ29uZmlnKGhCaXRzdHJlYW0sICYoaERyY0RlYy0+dW5pRHJjQ29uZmlnKSk7CisgIH0gZWxzZQorICAgIHJldHVybiBEUkNfREVDX05PVF9PSzsKKworICBpZiAoZEVycikgeworICAgIC8qIGNsZWFyIGNvbmZpZywgaWYgcGFyc2luZyBlcnJvciBvY2N1cmVkICovCisgICAgRkRLbWVtY2xlYXIoJmhEcmNEZWMtPnVuaURyY0NvbmZpZywgc2l6ZW9mKGhEcmNEZWMtPnVuaURyY0NvbmZpZykpOworICAgIGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kaWZmID0gMTsKKyAgfQorCisgIHN0YXJ0U2VsZWN0aW9uUHJvY2VzcyhoRHJjRGVjKTsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkRG93bm1peEluc3RydWN0aW9uc19Cb3goSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKSB7CisgIERSQ19FUlJPUiBkRXJyID0gREVfT0s7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKworICByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisKKyAgaWYgKGRFcnIpIHsKKyAgICAvKiBjbGVhciBjb25maWcsIGlmIHBhcnNpbmcgZXJyb3Igb2NjdXJyZWQgKi8KKyAgICBGREttZW1jbGVhcigmaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRvd25taXhJbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kb3dubWl4SW5zdHJ1Y3Rpb25zKSk7CisgICAgaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRvd25taXhJbnN0cnVjdGlvbnNDb3VudCA9IDA7CisgICAgaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRvd25taXhJbnN0cnVjdGlvbnNDb3VudFYwID0gMDsKKyAgICBoRHJjRGVjLT51bmlEcmNDb25maWcuZG93bm1peEluc3RydWN0aW9uc0NvdW50VjEgPSAwOworICAgIGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kaWZmID0gMTsKKyAgfQorCisgIHN0YXJ0U2VsZWN0aW9uUHJvY2VzcyhoRHJjRGVjKTsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkVW5pRHJjSW5zdHJ1Y3Rpb25zX0JveChIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSkgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisKKyAgcmV0dXJuIERSQ19ERUNfTk9UX09LOworCisgIGlmIChkRXJyKSB7CisgICAgLyogY2xlYXIgY29uZmlnLCBpZiBwYXJzaW5nIGVycm9yIG9jY3VycmVkICovCisgICAgRkRLbWVtY2xlYXIoJmhEcmNEZWMtPnVuaURyY0NvbmZpZy5kcmNJbnN0cnVjdGlvbnNVbmlEcmMsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kcmNJbnN0cnVjdGlvbnNVbmlEcmMpKTsKKyAgICBoRHJjRGVjLT51bmlEcmNDb25maWcuZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQgPSAwOworICAgIGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudFYwID0gMDsKKyAgICBoRHJjRGVjLT51bmlEcmNDb25maWcuZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnRWMSA9IDA7CisgICAgaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRpZmYgPSAxOworICB9CisKKyAgc3RhcnRTZWxlY3Rpb25Qcm9jZXNzKGhEcmNEZWMpOworCisgIHJldHVybiBEUkNfREVDX09LOworfQorCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1JlYWRVbmlEcmNDb2VmZmljaWVudHNfQm94KEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKSB7CisgIERSQ19FUlJPUiBkRXJyID0gREVfT0s7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKworICByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisKKyAgaWYgKGRFcnIpIHsKKyAgICAvKiBjbGVhciBjb25maWcsIGlmIHBhcnNpbmcgZXJyb3Igb2NjdXJyZWQgKi8KKyAgICBGREttZW1jbGVhcigmaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRyY0NvZWZmaWNpZW50c1VuaURyYywKKyAgICAgICAgICAgICAgICBzaXplb2YoaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRyY0NvZWZmaWNpZW50c1VuaURyYykpOworICAgIGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudCA9IDA7CisgICAgaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50VjAgPSAwOworICAgIGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudFYxID0gMDsKKyAgICBoRHJjRGVjLT51bmlEcmNDb25maWcuZGlmZiA9IDE7CisgIH0KKworICBzdGFydFNlbGVjdGlvblByb2Nlc3MoaERyY0RlYyk7CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUmVhZExvdWRuZXNzSW5mb1NldChIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKSB7CisgIERSQ19FUlJPUiBkRXJyID0gREVfT0s7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKworICBpZiAoaERyY0RlYy0+Y29kZWNNb2RlID09IERSQ19ERUNfTVBFR19EX1VTQUMpIHsKKyAgICBkRXJyID0gZHJjRGVjX3JlYWRMb3VkbmVzc0luZm9TZXQoaEJpdHN0cmVhbSwgJihoRHJjRGVjLT5sb3VkbmVzc0luZm9TZXQpKTsKKyAgfSBlbHNlCisgICAgcmV0dXJuIERSQ19ERUNfTk9UX09LOworCisgIGlmIChkRXJyKSB7CisgICAgLyogY2xlYXIgY29uZmlnLCBpZiBwYXJzaW5nIGVycm9yIG9jY3VycmVkICovCisgICAgRkRLbWVtY2xlYXIoJmhEcmNEZWMtPmxvdWRuZXNzSW5mb1NldCwgc2l6ZW9mKGhEcmNEZWMtPmxvdWRuZXNzSW5mb1NldCkpOworICAgIGhEcmNEZWMtPmxvdWRuZXNzSW5mb1NldC5kaWZmID0gMTsKKyAgfQorCisgIHN0YXJ0U2VsZWN0aW9uUHJvY2VzcyhoRHJjRGVjKTsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkTG91ZG5lc3NCb3goSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKSB7CisgIERSQ19FUlJPUiBkRXJyID0gREVfT0s7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKworICByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisKKyAgaWYgKGRFcnIpIHsKKyAgICAvKiBjbGVhciBjb25maWcsIGlmIHBhcnNpbmcgZXJyb3Igb2NjdXJyZWQgKi8KKyAgICBGREttZW1jbGVhcigmaERyY0RlYy0+bG91ZG5lc3NJbmZvU2V0LCBzaXplb2YoaERyY0RlYy0+bG91ZG5lc3NJbmZvU2V0KSk7CisgICAgaERyY0RlYy0+bG91ZG5lc3NJbmZvU2V0LmRpZmYgPSAxOworICB9CisKKyAgc3RhcnRTZWxlY3Rpb25Qcm9jZXNzKGhEcmNEZWMpOworCisgIHJldHVybiBEUkNfREVDX09LOworfQorCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1JlYWRVbmlEcmNHYWluKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKSB7CisgIERSQ19FUlJPUiBkRXJyID0gREVfT0s7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKyAgaWYgKCFoRHJjRGVjLT5zdGF0dXMpIHsKKyAgICByZXR1cm4gRFJDX0RFQ19PSzsKKyAgfQorCisgIGRFcnIgPSBkcmNEZWNfcmVhZFVuaURyY0dhaW4oCisgICAgICBoQml0c3RyZWFtLCAmKGhEcmNEZWMtPnVuaURyY0NvbmZpZyksCisgICAgICBkcmNEZWNfR2FpbkRlY29kZXJfR2V0RnJhbWVTaXplKGhEcmNEZWMtPmhHYWluRGVjKSwKKyAgICAgIGRyY0RlY19HYWluRGVjb2Rlcl9HZXREZWx0YVRtaW5EZWZhdWx0KGhEcmNEZWMtPmhHYWluRGVjKSwKKyAgICAgICYoaERyY0RlYy0+dW5pRHJjR2FpbikpOworICBpZiAoZEVycikgcmV0dXJuIERSQ19ERUNfTk9UX09LOworCisgIGhEcmNEZWMtPnN0YXR1cyA9IERSQ19ERUNfTkVXX0dBSU5fUEFZTE9BRDsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkVW5pRHJjKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pIHsKKyAgRFJDX0VSUk9SIGRFcnIgPSBERV9PSzsKKworICBpZiAoaERyY0RlYyA9PSBOVUxMKSByZXR1cm4gRFJDX0RFQ19OT1RfT1BFTkVEOworICBpZiAoIWhEcmNEZWMtPnN0YXR1cykgcmV0dXJuIERSQ19ERUNfTk9UX1JFQURZOworCisgIGRFcnIgPSBkcmNEZWNfcmVhZFVuaURyYygKKyAgICAgIGhCaXRzdHJlYW0sICYoaERyY0RlYy0+dW5pRHJjQ29uZmlnKSwgJihoRHJjRGVjLT5sb3VkbmVzc0luZm9TZXQpLAorICAgICAgZHJjRGVjX0dhaW5EZWNvZGVyX0dldEZyYW1lU2l6ZShoRHJjRGVjLT5oR2FpbkRlYyksCisgICAgICBkcmNEZWNfR2FpbkRlY29kZXJfR2V0RGVsdGFUbWluRGVmYXVsdChoRHJjRGVjLT5oR2FpbkRlYyksCisgICAgICAmKGhEcmNEZWMtPnVuaURyY0dhaW4pKTsKKyAgaWYgKGRFcnIpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKworICBzdGFydFNlbGVjdGlvblByb2Nlc3MoaERyY0RlYyk7CisKKyAgaERyY0RlYy0+c3RhdHVzID0gRFJDX0RFQ19ORVdfR0FJTl9QQVlMT0FEOworCisgIHJldHVybiBEUkNfREVDX09LOworfQorCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1ByZXByb2Nlc3MoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMpIHsKKyAgRFJDX0VSUk9SIGRFcnIgPSBERV9PSzsKKworICBpZiAoaERyY0RlYyA9PSBOVUxMKSByZXR1cm4gRFJDX0RFQ19OT1RfT1BFTkVEOworICBpZiAoIWhEcmNEZWMtPnN0YXR1cykgcmV0dXJuIERSQ19ERUNfTk9UX1JFQURZOworICBpZiAoIShoRHJjRGVjLT5mdW5jdGlvbmFsUmFuZ2UgJiBEUkNfREVDX0dBSU4pKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisKKyAgaWYgKGhEcmNEZWMtPnN0YXR1cyAhPSBEUkNfREVDX05FV19HQUlOX1BBWUxPQUQpIHsKKyAgICAvKiBubyBuZXcgZ2FpbiBwYXlsb2FkIHdhcyByZWFkLCBlLmcuIGR1cmluZyBjb25jYWxtZW50IG9yIGZsdXNoaW5nLgorICAgICAgIEdlbmVyYXRlIERSQyBnYWlucyBiYXNlZCBvbiB0aGUgc3RvcmVkIERSQyBnYWlucyBvZiBsYXN0IGZyYW1lcyAqLworICAgIGRyY0RlY19HYWluRGVjb2Rlcl9Db25jZWFsKGhEcmNEZWMtPmhHYWluRGVjLCAmKGhEcmNEZWMtPnVuaURyY0NvbmZpZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihoRHJjRGVjLT51bmlEcmNHYWluKSk7CisgIH0KKworICBkRXJyID0gZHJjRGVjX0dhaW5EZWNvZGVyX1ByZXByb2Nlc3MoCisgICAgICBoRHJjRGVjLT5oR2FpbkRlYywgJihoRHJjRGVjLT51bmlEcmNHYWluKSwKKyAgICAgIGhEcmNEZWMtPnNlbFByb2NPdXRwdXQubG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiLAorICAgICAgaERyY0RlYy0+c2VsUHJvY091dHB1dC5ib29zdCwgaERyY0RlYy0+c2VsUHJvY091dHB1dC5jb21wcmVzcyk7CisgIGlmIChkRXJyKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisgIGhEcmNEZWMtPnN0YXR1cyA9IERSQ19ERUNfSU5URVJQT0xBVElPTl9QUkVQQVJFRDsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19Qcm9jZXNzVGltZShIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywgY29uc3QgaW50IGRlbGF5U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX0RFQ19MT0NBVElPTiBkcmNMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW5uZWxPZmZzZXQsIGNvbnN0IGludCBkcmNDaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsIEZJWFBfREJMKiByZWFsQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGltZURhdGFDaGFubmVsT2Zmc2V0KSB7CisgIERSQ19FUlJPUiBkRXJyID0gREVfT0s7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKyAgaWYgKCEoaERyY0RlYy0+ZnVuY3Rpb25hbFJhbmdlICYgRFJDX0RFQ19HQUlOKSkgcmV0dXJuIERSQ19ERUNfTk9UX09LOworICBpZiAoaERyY0RlYy0+c3RhdHVzICE9IERSQ19ERUNfSU5URVJQT0xBVElPTl9QUkVQQVJFRCkKKyAgICByZXR1cm4gRFJDX0RFQ19OT1RfUkVBRFk7CisKKyAgZEVyciA9IGRyY0RlY19HYWluRGVjb2Rlcl9Qcm9jZXNzVGltZURvbWFpbigKKyAgICAgIGhEcmNEZWMtPmhHYWluRGVjLCBkZWxheVNhbXBsZXMsIChHQUlOX0RFQ19MT0NBVElPTilkcmNMb2NhdGlvbiwKKyAgICAgIGNoYW5uZWxPZmZzZXQsIGRyY0NoYW5uZWxPZmZzZXQsIG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgICAgdGltZURhdGFDaGFubmVsT2Zmc2V0LCByZWFsQnVmZmVyKTsKKyAgaWYgKGRFcnIpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19Qcm9jZXNzRnJlcShIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywgY29uc3QgaW50IGRlbGF5U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX0RFQ19MT0NBVElPTiBkcmNMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW5uZWxPZmZzZXQsIGNvbnN0IGludCBkcmNDaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwcm9jZXNzU2luZ2xlVGltZXNsb3QsIEZJWFBfREJMKiogcmVhbEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqKiBpbWFnQnVmZmVyKSB7CisgIERSQ19FUlJPUiBkRXJyID0gREVfT0s7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKyAgaWYgKCEoaERyY0RlYy0+ZnVuY3Rpb25hbFJhbmdlICYgRFJDX0RFQ19HQUlOKSkgcmV0dXJuIERSQ19ERUNfTk9UX09LOworICBpZiAoaERyY0RlYy0+c3RhdHVzICE9IERSQ19ERUNfSU5URVJQT0xBVElPTl9QUkVQQVJFRCkKKyAgICByZXR1cm4gRFJDX0RFQ19OT1RfUkVBRFk7CisKKyAgZEVyciA9IGRyY0RlY19HYWluRGVjb2Rlcl9Qcm9jZXNzU3ViYmFuZERvbWFpbigKKyAgICAgIGhEcmNEZWMtPmhHYWluRGVjLCBkZWxheVNhbXBsZXMsIChHQUlOX0RFQ19MT0NBVElPTilkcmNMb2NhdGlvbiwKKyAgICAgIGNoYW5uZWxPZmZzZXQsIGRyY0NoYW5uZWxPZmZzZXQsIG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgICAgcHJvY2Vzc1NpbmdsZVRpbWVzbG90LCByZWFsQnVmZmVyLCBpbWFnQnVmZmVyKTsKKyAgaWYgKGRFcnIpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19BcHBseURvd25taXgoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIGludCogcmV2ZXJzZUluQ2hhbm5lbE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogcmV2ZXJzZU91dENoYW5uZWxNYXAsIEZJWFBfREJMKiByZWFsQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwTkNoYW5uZWxzKSB7CisgIFNFTF9QUk9DX09VVFBVVCogcFNlbFByb2NPdXRwdXQgPSAmKGhEcmNEZWMtPnNlbFByb2NPdXRwdXQpOworICBpbnQgYmFzZUNoQ250ID0gcFNlbFByb2NPdXRwdXQtPmJhc2VDaGFubmVsQ291bnQ7CisgIGludCB0YXJnZXRDaENudCA9IHBTZWxQcm9jT3V0cHV0LT50YXJnZXRDaGFubmVsQ291bnQ7CisgIGludCBmcmFtZVNpemUsIG4sIGljLCBvYzsKKyAgRklYUF9EQkwgdG1wX291dFs4XTsKKyAgRklYUF9EQkwqIGF1ZGlvQ2hhbm5lbHNbOF07CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKyAgaWYgKCEoaERyY0RlYy0+ZnVuY3Rpb25hbFJhbmdlICYgRFJDX0RFQ19HQUlOKSkgcmV0dXJuIERSQ19ERUNfTk9UX09LOworCisgIC8qIG9ubHkgZG93bm1peCBpcyBwZXJmb3JtZWQgaGVyZSwgbm8gdXBtaXguCisgICAgIERvd25taXggaXMgb25seSBwZXJmb3JtZWQgaWYgZG93bm1peCBjb2VmZmljaWVudHMgYXJlIHByb3ZpZGVkLgorICAgICBBbGwgb3RoZXIgY2FzZXMgb2YgZG93bm1peCBhbmQgdXBtaXggYXJlIHRyZWF0ZWQgYnkgcGNtRG14IGxpYnJhcnkuICovCisgIGlmIChwU2VsUHJvY091dHB1dC0+ZG93bm1peE1hdHJpeFByZXNlbnQgPT0gMCkKKyAgICByZXR1cm4gRFJDX0RFQ19PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGRvd25taXggKi8KKyAgaWYgKHRhcmdldENoQ250ID49IGJhc2VDaENudCkgcmV0dXJuIERSQ19ERUNfT0s7IC8qIGRvd25taXggb25seSAqLworCisgIC8qIHNhbml0eSBjaGVja3MgKi8KKyAgaWYgKHJlYWxCdWZmZXIgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09LOworICBpZiAocmV2ZXJzZUluQ2hhbm5lbE1hcCA9PSBOVUxMKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisgIGlmIChyZXZlcnNlT3V0Q2hhbm5lbE1hcCA9PSBOVUxMKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisgIGlmIChiYXNlQ2hDbnQgPiA4KSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisgIGlmIChiYXNlQ2hDbnQgIT0gKnBOQ2hhbm5lbHMpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKyAgaWYgKHRhcmdldENoQ250ID4gOCkgcmV0dXJuIERSQ19ERUNfTk9UX09LOworCisgIGZyYW1lU2l6ZSA9IGRyY0RlY19HYWluRGVjb2Rlcl9HZXRGcmFtZVNpemUoaERyY0RlYy0+aEdhaW5EZWMpOworCisgIGZvciAoaWMgPSAwOyBpYyA8IGJhc2VDaENudDsgaWMrKykgeworICAgIGF1ZGlvQ2hhbm5lbHNbaWNdID0gJihyZWFsQnVmZmVyW2ljICogZnJhbWVTaXplXSk7CisgIH0KKworICAvKiBpbi1wbGFjZSBkb3dubWl4ICovCisgIGZvciAobiA9IDA7IG4gPCBmcmFtZVNpemU7IG4rKykgeworICAgIGZvciAob2MgPSAwOyBvYyA8IHRhcmdldENoQ250OyBvYysrKSB7CisgICAgICB0bXBfb3V0W29jXSA9IChGSVhQX0RCTCkwOworICAgICAgZm9yIChpYyA9IDA7IGljIDwgYmFzZUNoQ250OyBpYysrKSB7CisgICAgICAgIHRtcF9vdXRbb2NdICs9CisgICAgICAgICAgICBmTXVsdERpdjIoYXVkaW9DaGFubmVsc1tpY11bbl0sCisgICAgICAgICAgICAgICAgICAgICAgcFNlbFByb2NPdXRwdXQtPmRvd25taXhNYXRyaXhbcmV2ZXJzZUluQ2hhbm5lbE1hcFtpY11dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmV2ZXJzZU91dENoYW5uZWxNYXBbb2NdXSkKKyAgICAgICAgICAgIDw8IDM7CisgICAgICB9CisgICAgfQorICAgIGZvciAob2MgPSAwOyBvYyA8IHRhcmdldENoQ250OyBvYysrKSB7CisgICAgICBpZiAob2MgPj0gYmFzZUNoQ250KSBicmVhazsKKyAgICAgIGF1ZGlvQ2hhbm5lbHNbb2NdW25dID0gdG1wX291dFtvY107CisgICAgfQorICB9CisKKyAgZm9yIChvYyA9IHRhcmdldENoQ250OyBvYyA8IGJhc2VDaENudDsgb2MrKykgeworICAgIEZES21lbXNldChhdWRpb0NoYW5uZWxzW29jXSwgMCwgZnJhbWVTaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIH0KKworICAqcE5DaGFubmVscyA9IHRhcmdldENoQ250OworCisgIHJldHVybiBEUkNfREVDX09LOworfQorCisvKiBHZXQgbGlicmFyeSBpbmZvIGZvciB0aGlzIG1vZHVsZS4gKi8KK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfR2V0TGliSW5mbyhMSUJfSU5GTyogaW5mbykgeworICBpbnQgaTsKKworICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIERSQ19ERUNfSU5WQUxJRF9QQVJBTTsKKyAgfQorCisgIC8qIFNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLworICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKKyAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpIGJyZWFrOworICB9CisgIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgeworICAgIHJldHVybiBEUkNfREVDX05PVF9PSzsKKyAgfQorCisgIC8qIEFkZCB0aGUgbGlicmFyeSBpbmZvICovCisgIGluZm9baV0ubW9kdWxlX2lkID0gRkRLX1VOSURSQ0RFQzsKKyAgaW5mb1tpXS52ZXJzaW9uID0gTElCX1ZFUlNJT04oRFJDREVDX0xJQl9WTDAsIERSQ0RFQ19MSUJfVkwxLCBEUkNERUNfTElCX1ZMMik7CisgIExJQl9WRVJTSU9OX1NUUklORyhpbmZvICsgaSk7CisgIGluZm9baV0uYnVpbGRfZGF0ZSA9IERSQ0RFQ19MSUJfQlVJTERfREFURTsKKyAgaW5mb1tpXS5idWlsZF90aW1lID0gRFJDREVDX0xJQl9CVUlMRF9USU1FOworICBpbmZvW2ldLnRpdGxlID0gRFJDREVDX0xJQl9USVRMRTsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX2dhaW5EZWNvZGVyLmNwcCBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX2dhaW5EZWNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTgxZmFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfZ2FpbkRlY29kZXIuY3BwCkBAIC0wLDAgKzEsNDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkcmNEZWNfdHlwZXMuaCIKKyNpbmNsdWRlICJkcmNEZWNfZ2FpbkRlY29kZXIuaCIKKyNpbmNsdWRlICJkcmNHYWluRGVjX3ByZXByb2Nlc3MuaCIKKyNpbmNsdWRlICJkcmNHYWluRGVjX2luaXQuaCIKKyNpbmNsdWRlICJkcmNHYWluRGVjX3Byb2Nlc3MuaCIKKyNpbmNsdWRlICJkcmNEZWNfdG9vbHMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzdGF0aWMgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9maXRzTG9jYXRpb24oRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHQUlOX0RFQ19MT0NBVElPTiBkcmNMb2NhdGlvbikgeworICBpbnQgZG93bm1peElkID0gcEluc3QtPmRyY0FwcGx5VG9Eb3dubWl4ID8gcEluc3QtPmRvd25taXhJZFswXSA6IDA7CisgIHN3aXRjaCAoZHJjTG9jYXRpb24pIHsKKyAgICBjYXNlIEdBSU5fREVDX0RSQzE6CisgICAgICByZXR1cm4gKGRvd25taXhJZCA9PSAwKTsKKyAgICBjYXNlIEdBSU5fREVDX0RSQzFfRFJDMjoKKyAgICAgIHJldHVybiAoKGRvd25taXhJZCA9PSAwKSB8fCAoZG93bm1peElkID09IERPV05NSVhfSURfQU5ZX0RPV05NSVgpKTsKKyAgICBjYXNlIEdBSU5fREVDX0RSQzI6CisgICAgICByZXR1cm4gKGRvd25taXhJZCA9PSBET1dOTUlYX0lEX0FOWV9ET1dOTUlYKTsKKyAgICBjYXNlIEdBSU5fREVDX0RSQzM6CisgICAgICByZXR1cm4gKChkb3dubWl4SWQgIT0gMCkgJiYgKGRvd25taXhJZCAhPSBET1dOTUlYX0lEX0FOWV9ET1dOTUlYKSk7CisgICAgY2FzZSBHQUlOX0RFQ19EUkMyX0RSQzM6CisgICAgICByZXR1cm4gKGRvd25taXhJZCAhPSAwKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX3NldENoYW5uZWxHYWlucyhIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUNoYW5uZWxHYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwqIGNoYW5uZWxHYWluRGIpIHsKKyAgaW50IGksIGNoYW5uZWxHYWluX2U7CisgIEZJWFBfREJMIGNoYW5uZWxHYWluOworICBGREtfQVNTRVJUKG51bUNoYW5uZWxHYWlucyA8PSA4KTsKKyAgZm9yIChpID0gMDsgaSA8IG51bUNoYW5uZWxHYWluczsgaSsrKSB7CisgICAgaWYgKGNoYW5uZWxHYWluRGJbaV0gPT0gKEZJWFBfREJMKU1JTlZBTF9EQkwpIHsKKyAgICAgIGhHYWluRGVjLT5jaGFubmVsR2FpbltpXSA9IChGSVhQX0RCTCkwOworICAgIH0gZWxzZSB7CisgICAgICAvKiBhZGQgbG91ZG5lc3Mgbm9ybWFsaXNhdGlvbiBnYWluIChkQikgdG8gY2hhbm5lbCBnYWluIChkQikgKi8KKyAgICAgIEZJWFBfREJMIHRtcF9jaGFubmVsR2FpbkRiID0gKGNoYW5uZWxHYWluRGJbaV0gPj4gMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaEdhaW5EZWMtPmxvdWRuZXNzTm9ybWFsaXNhdGlvbkdhaW5EYiA+PiAyKTsKKyAgICAgIHRtcF9jaGFubmVsR2FpbkRiID0KKyAgICAgICAgICBTQVRVUkFURV9MRUZUX1NISUZUKHRtcF9jaGFubmVsR2FpbkRiLCAxLCBERlJBQ1RfQklUUyk7CisgICAgICBjaGFubmVsR2FpbiA9IGRCMmxpbih0bXBfY2hhbm5lbEdhaW5EYiwgOCwgJmNoYW5uZWxHYWluX2UpOworICAgICAgaEdhaW5EZWMtPmNoYW5uZWxHYWluW2ldID0gc2NhbGVWYWx1ZShjaGFubmVsR2FpbiwgY2hhbm5lbEdhaW5fZSAtIDgpOworICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHB1YmxpYyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX09wZW4oSEFORExFX0RSQ19HQUlOX0RFQ09ERVIqIHBoR2FpbkRlYykgeworICBEUkNfR0FJTl9ERUNPREVSKiBoR2FpbkRlYyA9IE5VTEw7CisKKyAgaEdhaW5EZWMgPSAoRFJDX0dBSU5fREVDT0RFUiopRkRLY2FsbG9jKDEsIHNpemVvZihEUkNfR0FJTl9ERUNPREVSKSk7CisgIGlmIChoR2FpbkRlYyA9PSBOVUxMKSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworCisgIGhHYWluRGVjLT5tdWx0aUJhbmRBY3RpdmVEcmNJbmRleCA9IC0xOworICBoR2FpbkRlYy0+Y2hhbm5lbEdhaW5BY3RpdmVEcmNJbmRleCA9IC0xOworCisgICpwaEdhaW5EZWMgPSBoR2FpbkRlYzsKKworICByZXR1cm4gREVfT0s7Cit9CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX0luaXQoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIGNvbnN0IGludCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2FtcGxlUmF0ZSkgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisKKyAgZXJyID0gaW5pdEdhaW5EZWMoaEdhaW5EZWMsIGZyYW1lU2l6ZSwgc2FtcGxlUmF0ZSk7CisgIGlmIChlcnIpIHJldHVybiBlcnI7CisKKyAgaW5pdERyY0dhaW5CdWZmZXJzKGhHYWluRGVjLT5mcmFtZVNpemUsICZoR2FpbkRlYy0+ZHJjR2FpbkJ1ZmZlcnMpOworCisgIHJldHVybiBlcnI7Cit9CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX1NldENvZGVjRGVwZW5kZW50UGFyYW1ldGVycygKKyAgICBIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywgY29uc3QgREVMQVlfTU9ERSBkZWxheU1vZGUsCisgICAgY29uc3QgaW50IHRpbWVEb21haW5TdXBwb3J0ZWQsCisgICAgY29uc3QgU1VCQkFORF9ET01BSU5fTU9ERSBzdWJiYW5kRG9tYWluU3VwcG9ydGVkKSB7CisgIGlmICgoZGVsYXlNb2RlICE9IERNX1JFR1VMQVJfREVMQVkpICYmIChkZWxheU1vZGUgIT0gRE1fTE9XX0RFTEFZKSkgeworICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKyAgaEdhaW5EZWMtPmRlbGF5TW9kZSA9IGRlbGF5TW9kZTsKKyAgaEdhaW5EZWMtPnRpbWVEb21haW5TdXBwb3J0ZWQgPSB0aW1lRG9tYWluU3VwcG9ydGVkOworICBoR2FpbkRlYy0+c3ViYmFuZERvbWFpblN1cHBvcnRlZCA9IHN1YmJhbmREb21haW5TdXBwb3J0ZWQ7CisKKyAgcmV0dXJuIERFX09LOworfQorCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9Db25maWcoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBudW1TZWxlY3RlZERyY1NldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSKiBzZWxlY3RlZERyY1NldElkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIqIHNlbGVjdGVkRG93bm1peElkcykgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBhOworCisgIGhHYWluRGVjLT5uQWN0aXZlRHJjcyA9IDA7CisgIGhHYWluRGVjLT5tdWx0aUJhbmRBY3RpdmVEcmNJbmRleCA9IC0xOworICBoR2FpbkRlYy0+Y2hhbm5lbEdhaW5BY3RpdmVEcmNJbmRleCA9IC0xOworICBmb3IgKGEgPSAwOyBhIDwgbnVtU2VsZWN0ZWREcmNTZXRzOyBhKyspIHsKKyAgICBlcnIgPSBpbml0QWN0aXZlRHJjKGhHYWluRGVjLCBoVW5pRHJjQ29uZmlnLCBzZWxlY3RlZERyY1NldElkc1thXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRG93bm1peElkc1thXSk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgfQorCisgIGVyciA9IGluaXRBY3RpdmVEcmNPZmZzZXQoaEdhaW5EZWMpOworICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgIHJldHVybiBlcnI7Cit9CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX0Nsb3NlKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSKiBwaEdhaW5EZWMpIHsKKyAgaWYgKCpwaEdhaW5EZWMgIT0gTlVMTCkgeworICAgIEZES2ZyZWUoKnBoR2FpbkRlYyk7CisgICAgKnBoR2FpbkRlYyA9IE5VTEw7CisgIH0KKworICByZXR1cm4gREVfT0s7Cit9CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX1ByZXByb2Nlc3MoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVU5JX0RSQ19HQUlOIGhVbmlEcmNHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYm9vc3QsIGNvbnN0IEZJWFBfU0dMIGNvbXByZXNzKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGEsIGM7CisKKyAgLyogbG5iUG9pbnRlciBpcyB0aGUgaW5kZXggb24gdGhlIG1vc3QgcmVjZW50IG5vZGUgYnVmZmVyICovCisgIGhHYWluRGVjLT5kcmNHYWluQnVmZmVycy5sbmJQb2ludGVyKys7CisgIGlmIChoR2FpbkRlYy0+ZHJjR2FpbkJ1ZmZlcnMubG5iUG9pbnRlciA+PSBOVU1fTE5CX0ZSQU1FUykKKyAgICBoR2FpbkRlYy0+ZHJjR2FpbkJ1ZmZlcnMubG5iUG9pbnRlciA9IDA7CisKKyAgZm9yIChhID0gMDsgYSA8IGhHYWluRGVjLT5uQWN0aXZlRHJjczsgYSsrKSB7CisgICAgLyogcHJlcGFyZSBnYWluIGludGVycG9sYXRpb24gb2Ygc2VxdWVuY2VzIHVzZWQgYnkgY29weWluZyBhbmQgbW9kaWZ5aW5nCisgICAgICogbm9kZXMgaW4gbm9kZSBidWZmZXJzICovCisgICAgZXJyID0gcHJlcGFyZURyY0dhaW4oaEdhaW5EZWMsIGhVbmlEcmNHYWluLCBjb21wcmVzcywgYm9vc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiLCBhKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICB9CisKKyAgZm9yIChhID0gMDsgYSA8IE1BWF9BQ1RJVkVfRFJDUzsgYSsrKSB7CisgICAgZm9yIChjID0gMDsgYyA8IDg7IGMrKykgeworICAgICAgaEdhaW5EZWMtPmFjdGl2ZURyY1thXQorICAgICAgICAgIC5sbmJJbmRleEZvckNoYW5uZWxbY11baEdhaW5EZWMtPmRyY0dhaW5CdWZmZXJzLmxuYlBvaW50ZXJdID0KKyAgICAgICAgICAtMTsgLyogIm5vIERSQyBwcm9jZXNzaW5nIiAqLworICAgIH0KKyAgICBoR2FpbkRlYy0+YWN0aXZlRHJjW2FdLnN1YmJhbmRHYWluc1JlYWR5ID0gMDsKKyAgfQorCisgIGZvciAoYyA9IDA7IGMgPCA4OyBjKyspIHsKKyAgICBoR2FpbkRlYy0+ZHJjR2FpbkJ1ZmZlcnMKKyAgICAgICAgLmNoYW5uZWxHYWluW2NdW2hHYWluRGVjLT5kcmNHYWluQnVmZmVycy5sbmJQb2ludGVyXSA9CisgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgOCkpOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogY3JlYXRlIGdhaW4gc2VxdWVuY2Ugb3V0IG9mIGdhaW4gc2VxdWVuY2VzIG9mIGxhc3QgZnJhbWUgZm9yIGNvbmNlYWxtZW50IGFuZAorICogZmx1c2hpbmcgKi8KK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX0NvbmNlYWwoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0dBSU4gaFVuaURyY0dhaW4pIHsKKyAgaW50IHNlcSwgZ2FpblNlcXVlbmNlQ291bnQ7CisgIERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQyogcENvZWYgPQorICAgICAgc2VsZWN0RHJjQ29lZmZpY2llbnRzKGhVbmlEcmNDb25maWcsIExPQ0FUSU9OX1NFTEVDVEVEKTsKKyAgaWYgKHBDb2VmID09IE5VTEwpIHJldHVybiBERV9PSzsKKworICBnYWluU2VxdWVuY2VDb3VudCA9IGZNaW4ocENvZWYtPmdhaW5TZXF1ZW5jZUNvdW50LCAoVUNIQVIpMTIpOworCisgIGZvciAoc2VxID0gMDsgc2VxIDwgZ2FpblNlcXVlbmNlQ291bnQ7IHNlcSsrKSB7CisgICAgaW50IGxhc3ROb2RlSW5kZXggPSAwOworICAgIEZJWFBfU0dMIGxhc3RHYWluRGIgPSAoRklYUF9TR0wpMDsKKworICAgIGxhc3ROb2RlSW5kZXggPSBoVW5pRHJjR2Fpbi0+bk5vZGVzW3NlcV0gLSAxOworICAgIGlmICgobGFzdE5vZGVJbmRleCA+PSAwKSAmJiAobGFzdE5vZGVJbmRleCA8IDE2KSkgeworICAgICAgbGFzdEdhaW5EYiA9IGhVbmlEcmNHYWluLT5nYWluTm9kZVtzZXFdW2xhc3ROb2RlSW5kZXhdLmdhaW5EYjsKKyAgICB9CisKKyAgICBoVW5pRHJjR2Fpbi0+bk5vZGVzW3NlcV0gPSAxOworICAgIGlmIChsYXN0R2FpbkRiID4gKEZJWFBfU0dMKTApIHsKKyAgICAgIGhVbmlEcmNHYWluLT5nYWluTm9kZVtzZXFdWzBdLmdhaW5EYiA9CisgICAgICAgICAgRlhfREJMMkZYX1NHTChmTXVsdChGTDJGWENPTlNUX1NHTCgwLjlmKSwgbGFzdEdhaW5EYikpOworICAgIH0gZWxzZSB7CisgICAgICBoVW5pRHJjR2Fpbi0+Z2Fpbk5vZGVbc2VxXVswXS5nYWluRGIgPQorICAgICAgICAgIEZYX0RCTDJGWF9TR0woZk11bHQoRkwyRlhDT05TVF9TR0woMC45OGYpLCBsYXN0R2FpbkRiKSk7CisgICAgfQorICAgIGhVbmlEcmNHYWluLT5nYWluTm9kZVtzZXFdWzBdLnRpbWUgPSBoR2FpbkRlYy0+ZnJhbWVTaXplIC0gMTsKKyAgfQorICByZXR1cm4gREVfT0s7Cit9CisKK3ZvaWQgZHJjRGVjX0dhaW5EZWNvZGVyX1NldENoYW5uZWxHYWlucyhIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCogY2hhbm5lbEdhaW5EYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYXVkaW9CdWZmZXJDaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBhdWRpb0J1ZmZlcikgeworICBpbnQgYywgaTsKKworICBpZiAoaEdhaW5EZWMtPmNoYW5uZWxHYWluQWN0aXZlRHJjSW5kZXggPj0gMCkgeworICAgIC8qIGNoYW5uZWwgZ2FpbnMgd2lsbCBiZSBhcHBsaWVkIGluIGRyY0RlY19HYWluRGVjb2Rlcl9Qcm9jZXNzVGltZURvbWFpbiBvcgorICAgICAqIGRyY0RlY19HYWluRGVjb2Rlcl9Qcm9jZXNzU3ViYmFuZERvbWFpbiwgcmVzcGVjdGl2ZWx5LiAqLworICAgIF9zZXRDaGFubmVsR2FpbnMoaEdhaW5EZWMsIG51bUNoYW5uZWxzLCBjaGFubmVsR2FpbkRiKTsKKworICAgIGlmICghaEdhaW5EZWMtPnN0YXR1cykgeyAvKiBvdmVyd3JpdGUgcHJldmlvdXMgY2hhbm5lbCBnYWlucyBhdCBzdGFydHVwICovCisgICAgICBEUkNfR0FJTl9CVUZGRVJTKiBwRHJjR2FpbkJ1ZmZlcnMgPSAmaEdhaW5EZWMtPmRyY0dhaW5CdWZmZXJzOworICAgICAgZm9yIChjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9MTkJfRlJBTUVTOyBpKyspIHsKKyAgICAgICAgICBwRHJjR2FpbkJ1ZmZlcnMtPmNoYW5uZWxHYWluW2NdW2ldID0gaEdhaW5EZWMtPmNoYW5uZWxHYWluW2NdOworICAgICAgICB9CisgICAgICB9CisgICAgICBoR2FpbkRlYy0+c3RhdHVzID0gMTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogc21vb3RoIGFuZCBhcHBseSBjaGFubmVsIGdhaW5zICovCisgICAgRklYUF9EQkwgcHJldkNoYW5uZWxHYWluWzhdOworICAgIGZvciAoYyA9IDA7IGMgPCBudW1DaGFubmVsczsgYysrKSB7CisgICAgICBwcmV2Q2hhbm5lbEdhaW5bY10gPSBoR2FpbkRlYy0+Y2hhbm5lbEdhaW5bY107CisgICAgfQorCisgICAgX3NldENoYW5uZWxHYWlucyhoR2FpbkRlYywgbnVtQ2hhbm5lbHMsIGNoYW5uZWxHYWluRGIpOworCisgICAgaWYgKCFoR2FpbkRlYy0+c3RhdHVzKSB7IC8qIG92ZXJ3cml0ZSBwcmV2aW91cyBjaGFubmVsIGdhaW5zIGF0IHN0YXJ0dXAgKi8KKyAgICAgIGZvciAoYyA9IDA7IGMgPCBudW1DaGFubmVsczsgYysrKQorICAgICAgICBwcmV2Q2hhbm5lbEdhaW5bY10gPSBoR2FpbkRlYy0+Y2hhbm5lbEdhaW5bY107CisgICAgICBoR2FpbkRlYy0+c3RhdHVzID0gMTsKKyAgICB9CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgbnVtQ2hhbm5lbHM7IGMrKykgeworICAgICAgSU5UIG5fbWluID0gZk1pbihmTWluKENudExlYWRpbmdaZXJvcyhwcmV2Q2hhbm5lbEdhaW5bY10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENudExlYWRpbmdaZXJvcyhoR2FpbkRlYy0+Y2hhbm5lbEdhaW5bY10pKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICA5KTsKKyAgICAgIEZJWFBfREJMIGdhaW4gPSBwcmV2Q2hhbm5lbEdhaW5bY10gPDwgbl9taW47CisgICAgICBGSVhQX0RCTCBzdGVwc2l6ZSA9ICgoaEdhaW5EZWMtPmNoYW5uZWxHYWluW2NdIDw8IG5fbWluKSAtIGdhaW4pOworICAgICAgaWYgKHN0ZXBzaXplICE9IChGSVhQX0RCTCkwKSB7CisgICAgICAgIGlmIChmcmFtZVNpemUgPT0gMTAyNCkKKyAgICAgICAgICBzdGVwc2l6ZSA9IHN0ZXBzaXplID4+IDEwOworICAgICAgICBlbHNlCisgICAgICAgICAgc3RlcHNpemUgPSAoTE9ORylzdGVwc2l6ZSAvIGZyYW1lU2l6ZTsKKyAgICAgIH0KKyAgICAgIG5fbWluID0gOSAtIG5fbWluOworI2lmZGVmIEZVTkNUSU9OX2RyY0RlY19HYWluRGVjb2Rlcl9TZXRDaGFubmVsR2FpbnNfZnVuYzEKKyAgICAgIGRyY0RlY19HYWluRGVjb2Rlcl9TZXRDaGFubmVsR2FpbnNfZnVuYzEoYXVkaW9CdWZmZXIsIGdhaW4sIHN0ZXBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX21pbiwgZnJhbWVTaXplKTsKKyNlbHNlCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVTaXplOyBpKyspIHsKKyAgICAgICAgYXVkaW9CdWZmZXJbaV0gPSBmTXVsdERpdjIoYXVkaW9CdWZmZXJbaV0sIGdhaW4pIDw8IG5fbWluOworICAgICAgICBnYWluICs9IHN0ZXBzaXplOworICAgICAgfQorI2VuZGlmCisgICAgICBhdWRpb0J1ZmZlciArPSBhdWRpb0J1ZmZlckNoYW5uZWxPZmZzZXQ7CisgICAgfQorICB9Cit9CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX1Byb2Nlc3NUaW1lRG9tYWluKAorICAgIEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLCBjb25zdCBpbnQgZGVsYXlTYW1wbGVzLAorICAgIGNvbnN0IEdBSU5fREVDX0xPQ0FUSU9OIGRyY0xvY2F0aW9uLCBjb25zdCBpbnQgY2hhbm5lbE9mZnNldCwKKyAgICBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwgY29uc3QgaW50IG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgIGNvbnN0IGludCB0aW1lRGF0YUNoYW5uZWxPZmZzZXQsIEZJWFBfREJMKiBhdWRpb0lPQnVmZmVyKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGE7CisKKyAgaWYgKCFoR2FpbkRlYy0+dGltZURvbWFpblN1cHBvcnRlZCkgeworICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKworICBmb3IgKGEgPSAwOyBhIDwgaEdhaW5EZWMtPm5BY3RpdmVEcmNzOyBhKyspIHsKKyAgICBpZiAoIV9maXRzTG9jYXRpb24oaEdhaW5EZWMtPmFjdGl2ZURyY1thXS5wSW5zdCwgZHJjTG9jYXRpb24pKSBjb250aW51ZTsKKworICAgIC8qIEFwcGx5IERSQyAqLworICAgIGVyciA9IHByb2Nlc3NEcmNUaW1lKGhHYWluRGVjLCBhLCBkZWxheVNhbXBsZXMsIGNoYW5uZWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHJjQ2hhbm5lbE9mZnNldCwgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZURhdGFDaGFubmVsT2Zmc2V0LCBhdWRpb0lPQnVmZmVyKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworRFJDX0VSUk9SCitkcmNEZWNfR2FpbkRlY29kZXJfUHJvY2Vzc1N1YmJhbmREb21haW4oCisgICAgSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIGNvbnN0IGludCBkZWxheVNhbXBsZXMsCisgICAgY29uc3QgR0FJTl9ERUNfTE9DQVRJT04gZHJjTG9jYXRpb24sIGNvbnN0IGludCBjaGFubmVsT2Zmc2V0LAorICAgIGNvbnN0IGludCBkcmNDaGFubmVsT2Zmc2V0LCBjb25zdCBpbnQgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsCisgICAgY29uc3QgaW50IHByb2Nlc3NTaW5nbGVUaW1lc2xvdCwgRklYUF9EQkwqIGF1ZGlvSU9CdWZmZXJSZWFsW10sCisgICAgRklYUF9EQkwqIGF1ZGlvSU9CdWZmZXJJbWFnW10pIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBpbnQgYTsKKworICBpZiAoaEdhaW5EZWMtPnN1YmJhbmREb21haW5TdXBwb3J0ZWQgPT0gU0RNX09GRikgeworICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKworICBmb3IgKGEgPSAwOyBhIDwgaEdhaW5EZWMtPm5BY3RpdmVEcmNzOyBhKyspIHsKKyAgICBpZiAoIV9maXRzTG9jYXRpb24oaEdhaW5EZWMtPmFjdGl2ZURyY1thXS5wSW5zdCwgZHJjTG9jYXRpb24pKSBjb250aW51ZTsKKworICAgIC8qIEFwcGx5IERSQyAqLworICAgIGVyciA9IHByb2Nlc3NEcmNTdWJiYW5kKGhHYWluRGVjLCBhLCBkZWxheVNhbXBsZXMsIGNoYW5uZWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJjQ2hhbm5lbE9mZnNldCwgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbmdsZVRpbWVzbG90LCBhdWRpb0lPQnVmZmVyUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0lPQnVmZmVySW1hZyk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX1NldExvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYigKKyAgICBIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywgRklYUF9EQkwgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiKSB7CisgIGhHYWluRGVjLT5sb3VkbmVzc05vcm1hbGlzYXRpb25HYWluRGIgPSBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGI7CisKKyAgcmV0dXJuIERFX09LOworfQorCitpbnQgZHJjRGVjX0dhaW5EZWNvZGVyX0dldEZyYW1lU2l6ZShIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYykgeworICBpZiAoaEdhaW5EZWMgPT0gTlVMTCkgcmV0dXJuIC0xOworCisgIHJldHVybiBoR2FpbkRlYy0+ZnJhbWVTaXplOworfQorCitpbnQgZHJjRGVjX0dhaW5EZWNvZGVyX0dldERlbHRhVG1pbkRlZmF1bHQoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMpIHsKKyAgaWYgKGhHYWluRGVjID09IE5VTEwpIHJldHVybiAtMTsKKworICByZXR1cm4gaEdhaW5EZWMtPmRlbHRhVG1pbkRlZmF1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJEUkNkZWMvc3JjL2RyY0RlY19nYWluRGVjb2Rlci5oIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfZ2FpbkRlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjRkZjRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfZ2FpbkRlY29kZXIuaApAQCAtMCwwICsxLDI2NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERSQ0RFQ19HQUlOREVDT0RFUl9ICisjZGVmaW5lIERSQ0RFQ19HQUlOREVDT0RFUl9ICisKKyNpbmNsdWRlICJkcmNEZWNvZGVyLmgiCisKKy8qIERlZmluaXRpb25zIGNvbW1vbiB0byBnYWluRGVjb2RlciBzdWJtb2R1bGUgKi8KKworI2RlZmluZSBOVU1fTE5CX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgNSAvKiBwcmV2aW91cyBmcmFtZSArIHRoaXMgZnJhbWUgKyBvbmUgZnJhbWUgZm9yIERNX1JFR1VMQVJfREVMQVkgKyAobWF4aW11bSBcCisgICAgICAgZGVsYXlTYW1wbGVzKS9mcmFtZVNpemUgKi8KKworLyogUU1GNjQgKi8KKyNkZWZpbmUgU1VCQkFORF9OVU1fQkFORFNfUU1GNjQgNjQKKyNkZWZpbmUgU1VCQkFORF9ET1dOU0FNUExJTkdfRkFDVE9SX1FNRjY0IDY0CisjZGVmaW5lIFNVQkJBTkRfQU5BTFlTSVNfREVMQVlfUU1GNjQgMzIwCisKKy8qIFFNRjcxIChhY2NvcmRpbmcgdG8gSVNPL0lFQyAyMzAwMy0xOjIwMDcpICovCisjZGVmaW5lIFNVQkJBTkRfTlVNX0JBTkRTX1FNRjcxIDcxCisjZGVmaW5lIFNVQkJBTkRfRE9XTlNBTVBMSU5HX0ZBQ1RPUl9RTUY3MSA2NAorI2RlZmluZSBTVUJCQU5EX0FOQUxZU0lTX0RFTEFZX1FNRjcxIDMyMCArIDM4NAorCisvKiBTVEZUMjU2IChhY2NvcmRpbmcgdG8gSVNPL0lFQyAyMzAwOC0zOjIwMTUvQU1EMykgKi8KKyNkZWZpbmUgU1VCQkFORF9OVU1fQkFORFNfU1RGVDI1NiAyNTYKKyNkZWZpbmUgU1VCQkFORF9ET1dOU0FNUExJTkdfRkFDVE9SX1NURlQyNTYgMjU2CisjZGVmaW5lIFNVQkJBTkRfQU5BTFlTSVNfREVMQVlfU1RGVDI1NiAyNTYKKwordHlwZWRlZiBlbnVtIHsKKyAgR0FJTl9ERUNfRFJDMSwKKyAgR0FJTl9ERUNfRFJDMV9EUkMyLAorICBHQUlOX0RFQ19EUkMyLAorICBHQUlOX0RFQ19EUkMzLAorICBHQUlOX0RFQ19EUkMyX0RSQzMKK30gR0FJTl9ERUNfTE9DQVRJT047CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9EQkwgZ2FpbkxpbjsgLyogZSA9IDcgKi8KKyAgU0hPUlQgdGltZTsKK30gTk9ERV9MSU47CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgR0FJTl9JTlRFUlBPTEFUSU9OX1RZUEUgZ2FpbkludGVycG9sYXRpb25UeXBlOworICBpbnQgbk5vZGVzW05VTV9MTkJfRlJBTUVTXTsgLyogbnVtYmVyIG9mIG5vZGVzLCBzYXR1cmF0ZWQgdG8gMTYgKi8KKyAgTk9ERV9MSU4gbGluZWFyTm9kZVtOVU1fTE5CX0ZSQU1FU11bMTZdOworfSBMSU5FQVJfTk9ERV9CVUZGRVI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGxuYlBvaW50ZXI7CisgIExJTkVBUl9OT0RFX0JVRkZFUiBsaW5lYXJOb2RlQnVmZmVyWzEyXTsKKyAgTElORUFSX05PREVfQlVGRkVSIGR1bW15TG5iOworICBGSVhQX0RCTCBjaGFubmVsR2Fpbls4XVtOVU1fTE5CX0ZSQU1FU107IC8qIGUgPSA4ICovCit9IERSQ19HQUlOX0JVRkZFUlM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGFjdGl2ZURyY09mZnNldDsKKyAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdDsKKyAgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKiBwQ29lZjsKKworICBEVUNLSU5HX01PRElGSUNBVElPTiBkdWNraW5nTW9kaWZpY2F0aW9uRm9yQ2hhbm5lbEdyb3VwWzhdOworICBTQ0hBUiBjaGFubmVsR3JvdXBGb3JDaGFubmVsWzhdOworCisgIFVDSEFSIGJhbmRDb3VudEZvckNoYW5uZWxHcm91cFs4XTsKKyAgVUNIQVIgZ2FpbkVsZW1lbnRGb3JHcm91cFs4XTsKKyAgVUNIQVIgY2hhbm5lbEdyb3VwSXNQYXJhbWV0cmljRHJjWzhdOworICBVQ0hBUiBnYWluRWxlbWVudENvdW50OyAvKiBudW1iZXIgb2YgZGlmZmVyZW50IERSQyBnYWlucyBpbmx1ZGluZyBhbGwgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRzICovCisgIGludCBsbmJJbmRleEZvckNoYW5uZWxbOF1bTlVNX0xOQl9GUkFNRVNdOworICBpbnQgc3ViYmFuZEdhaW5zUmVhZHk7Cit9IEFDVElWRV9EUkM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGRlbHRhVG1pbkRlZmF1bHQ7CisgIElOVCBmcmFtZVNpemU7CisgIEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXNhdGlvbkdhaW5EYjsKKyAgREVMQVlfTU9ERSBkZWxheU1vZGU7CisKKyAgaW50IG5BY3RpdmVEcmNzOworICBBQ1RJVkVfRFJDIGFjdGl2ZURyY1tNQVhfQUNUSVZFX0RSQ1NdOworICBpbnQgbXVsdGlCYW5kQWN0aXZlRHJjSW5kZXg7CisgIGludCBjaGFubmVsR2FpbkFjdGl2ZURyY0luZGV4OworICBGSVhQX0RCTCBjaGFubmVsR2Fpbls4XTsgLyogZSA9IDggKi8KKworICBEUkNfR0FJTl9CVUZGRVJTIGRyY0dhaW5CdWZmZXJzOworICBGSVhQX0RCTCBzdWJiYW5kR2FpbnNbMTJdWzQgKiAxMDI0IC8gMjU2XTsKKyAgRklYUF9EQkwgZHVtbXlTdWJiYW5kR2FpbnNbNCAqIDEwMjQgLyAyNTZdOworCisgIGludCBzdGF0dXM7CisgIGludCB0aW1lRG9tYWluU3VwcG9ydGVkOworICBTVUJCQU5EX0RPTUFJTl9NT0RFIHN1YmJhbmREb21haW5TdXBwb3J0ZWQ7Cit9IERSQ19HQUlOX0RFQ09ERVIsICpIQU5ETEVfRFJDX0dBSU5fREVDT0RFUjsKKworLyogaW5pdCBmdW5jdGlvbnMgKi8KK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX09wZW4oSEFORExFX0RSQ19HQUlOX0RFQ09ERVIqIHBoR2FpbkRlYyk7CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX0luaXQoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIGNvbnN0IGludCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2FtcGxlUmF0ZSk7CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX1NldENvZGVjRGVwZW5kZW50UGFyYW1ldGVycygKKyAgICBIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywgY29uc3QgREVMQVlfTU9ERSBkZWxheU1vZGUsCisgICAgY29uc3QgaW50IHRpbWVEb21haW5TdXBwb3J0ZWQsCisgICAgY29uc3QgU1VCQkFORF9ET01BSU5fTU9ERSBzdWJiYW5kRG9tYWluU3VwcG9ydGVkKTsKKworRFJDX0VSUk9SCitkcmNEZWNfR2FpbkRlY29kZXJfQ29uZmlnKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgbnVtU2VsZWN0ZWREcmNTZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiogc2VsZWN0ZWREcmNTZXRJZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSKiBzZWxlY3RlZERvd25taXhJZHMpOworCisvKiBjbG9zZSBmdW5jdGlvbnMgKi8KK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX0Nsb3NlKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSKiBwaEdhaW5EZWMpOworCisvKiBwcm9jZXNzIGZ1bmN0aW9ucyAqLworCisvKiBjYWxsIGRyY0RlY19HYWluRGVjb2Rlcl9QcmVwcm9jZXNzIGZpcnN0ICovCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9QcmVwcm9jZXNzKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfR0FJTiBoVW5pRHJjR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJvb3N0LCBjb25zdCBGSVhQX1NHTCBjb21wcmVzcyk7CisKKy8qIFRoZW4gY2FsbCBvbmUgb2YgZHJjRGVjX0dhaW5EZWNvZGVyX1Byb2Nlc3NUaW1lRG9tYWluIG9yCisgKiBkcmNEZWNfR2FpbkRlY29kZXJfUHJvY2Vzc1N1YmJhbmREb21haW4gKi8KK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX1Byb2Nlc3NUaW1lRG9tYWluKAorICAgIEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLCBjb25zdCBpbnQgZGVsYXlTYW1wbGVzLAorICAgIGNvbnN0IEdBSU5fREVDX0xPQ0FUSU9OIGRyY0xvY2F0aW9uLCBjb25zdCBpbnQgY2hhbm5lbE9mZnNldCwKKyAgICBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwgY29uc3QgaW50IG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgIGNvbnN0IGludCB0aW1lRGF0YUNoYW5uZWxPZmZzZXQsIEZJWFBfREJMKiBhdWRpb0lPQnVmZmVyKTsKKworRFJDX0VSUk9SCitkcmNEZWNfR2FpbkRlY29kZXJfUHJvY2Vzc1N1YmJhbmREb21haW4oCisgICAgSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIGNvbnN0IGludCBkZWxheVNhbXBsZXMsCisgICAgR0FJTl9ERUNfTE9DQVRJT04gZHJjTG9jYXRpb24sIGNvbnN0IGludCBjaGFubmVsT2Zmc2V0LAorICAgIGNvbnN0IGludCBkcmNDaGFubmVsT2Zmc2V0LCBjb25zdCBpbnQgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsCisgICAgY29uc3QgaW50IHByb2Nlc3NTaW5nbGVUaW1lc2xvdCwgRklYUF9EQkwqIGF1ZGlvSU9CdWZmZXJSZWFsW10sCisgICAgRklYUF9EQkwqIGF1ZGlvSU9CdWZmZXJJbWFnW10pOworCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9Db25jZWFsKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVU5JX0RSQ19HQUlOIGhVbmlEcmNHYWluKTsKKworRFJDX0VSUk9SCitkcmNEZWNfR2FpbkRlY29kZXJfU2V0TG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiKAorICAgIEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLCBGSVhQX0RCTCBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIpOworCitpbnQgZHJjRGVjX0dhaW5EZWNvZGVyX0dldEZyYW1lU2l6ZShIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYyk7CisKK2ludCBkcmNEZWNfR2FpbkRlY29kZXJfR2V0RGVsdGFUbWluRGVmYXVsdChIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYyk7CisKK3ZvaWQgZHJjRGVjX0dhaW5EZWNvZGVyX1NldENoYW5uZWxHYWlucyhIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCogY2hhbm5lbEdhaW5EYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYXVkaW9CdWZmZXJDaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBhdWRpb0J1ZmZlcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL3NyYy9kcmNEZWNfcmVhZGVyLmNwcCBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3JlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlN2EwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3JlYWRlci5jcHAKQEAgLTAsMCArMSwyMDI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmaXhwb2ludF9tYXRoLmgiCisjaW5jbHVkZSAiZHJjRGVjX3JlYWRlci5oIgorI2luY2x1ZGUgImRyY0RlY190b29scy5oIgorI2luY2x1ZGUgImRyY0RlY19yb20uaCIKKyNpbmNsdWRlICJkcmNEZWNvZGVyLmgiCisKKy8qIE1QRUctRCBEUkMgQU1EIDEgKi8KKworI2RlZmluZSBVTklEUkNDT05GRVhUX1BBUkFNX0RSQyAweDEKKyNkZWZpbmUgVU5JRFJDQ09ORkVYVF9WMSAweDIKKyNkZWZpbmUgVU5JRFJDTE9VREVYVF9FUSAweDEKKworI2RlZmluZSBVTklEUkNHQUlORVhUX1RFUk0gMHgwCisjZGVmaW5lIFVOSURSQ0xPVURFWFRfVEVSTSAweDAKKyNkZWZpbmUgVU5JRFJDQ09ORkVYVF9URVJNIDB4MAorCitzdGF0aWMgaW50IF9nZXRaKGNvbnN0IGludCBuTm9kZXNNYXgpIHsKKyAgLyogWiBpcyB0aGUgbWluaW11bSBjb2Rld29yZCBsZW5ndGggdGhhdCBpcyBuZWVkZWQgdG8gZW5jb2RlIGFsbCBwb3NzaWJsZQorICAgKiB0aW1lRGVsdGEgdmFsdWVzICovCisgIC8qIFogPSBjZWlsKGxvZzIoMipuTm9kZXNNYXgpKSAqLworICBpbnQgWiA9IDE7CisgIHdoaWxlICgoMSA8PCBaKSA8ICgyICogbk5vZGVzTWF4KSkgeworICAgIForKzsKKyAgfQorICByZXR1cm4gWjsKK30KKworc3RhdGljIGludCBfZ2V0VGltZURlbHRhTWluKGNvbnN0IEdBSU5fU0VUKiBwR3NldCwgY29uc3QgaW50IGRlbHRhVG1pbkRlZmF1bHQpIHsKKyAgaWYgKHBHc2V0LT50aW1lRGVsdGFNaW5QcmVzZW50KSB7CisgICAgcmV0dXJuIHBHc2V0LT50aW1lRGVsdGFNaW47CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGRlbHRhVG1pbkRlZmF1bHQ7CisgIH0KK30KKworLyogY29tcGFyZSBhbmQgYXNzaWduICovCitzdGF0aWMgaW5saW5lIGludCBfY29tcEFzc2lnbihVQ0hBUiogZGVzdCwgY29uc3QgVUNIQVIgc3JjKSB7CisgIGludCBkaWZmID0gMDsKKyAgaWYgKCpkZXN0ICE9IHNyYykgZGlmZiA9IDE7CisgICpkZXN0ID0gc3JjOworICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgX2NvbXBBc3NpZ24oVUxPTkcqIGRlc3QsIGNvbnN0IFVMT05HIHNyYykgeworICBpbnQgZGlmZiA9IDA7CisgIGlmICgqZGVzdCAhPSBzcmMpIGRpZmYgPSAxOworICAqZGVzdCA9IHNyYzsKKyAgcmV0dXJuIGRpZmY7Cit9CisKK3R5cGVkZWYgY29uc3QgU0NIQVIgKCpIdWZmbWFuKVsyXTsKKworaW50IF9kZWNvZGVIdWZmbWFuQ1coSHVmZm1hbiBoLCAvKiE8IHBvaW50ZXIgdG8gaHVmZm1hbiBjb2RlYm9vayB0YWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKSAvKiE8IEhhbmRsZSB0byBiaXRidWZmZXIgKi8KK3sKKyAgU0NIQVIgaW5kZXggPSAwOworICBpbnQgdmFsdWUsIGJpdDsKKworICB3aGlsZSAoaW5kZXggPj0gMCkgeworICAgIGJpdCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaW5kZXggPSBoW2luZGV4XVtiaXRdOworICB9CisKKyAgdmFsdWUgPSBpbmRleCArIDY0OyAvKiBBZGQgb2Zmc2V0ICovCisKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioqKioqKioqKi8KKy8qIHVuaURyYyAqLworLyoqKioqKioqKiovCisKK0RSQ19FUlJPUgorZHJjRGVjX3JlYWRVbmlEcmMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lU2l6ZSwgY29uc3QgaW50IGRlbHRhVG1pbkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICBIQU5ETEVfVU5JX0RSQ19HQUlOIGhVbmlEcmNHYWluKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGxvdWRuZXNzSW5mb1NldFByZXNlbnQsIHVuaURyY0NvbmZpZ1ByZXNlbnQ7CisKKyAgbG91ZG5lc3NJbmZvU2V0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChsb3VkbmVzc0luZm9TZXRQcmVzZW50KSB7CisgICAgdW5pRHJjQ29uZmlnUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKHVuaURyY0NvbmZpZ1ByZXNlbnQpIHsKKyAgICAgIGVyciA9IGRyY0RlY19yZWFkVW5pRHJjQ29uZmlnKGhCcywgaFVuaURyY0NvbmZpZyk7CisgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgIH0KKyAgICBlcnIgPSBkcmNEZWNfcmVhZExvdWRuZXNzSW5mb1NldChoQnMsIGhMb3VkbmVzc0luZm9TZXQpOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgIH0KKworICBpZiAoaFVuaURyY0dhaW4gIT0gTlVMTCkgeworICAgIGVyciA9IGRyY0RlY19yZWFkVW5pRHJjR2FpbihoQnMsIGhVbmlEcmNDb25maWcsIGZyYW1lU2l6ZSwgZGVsdGFUbWluRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFVuaURyY0dhaW4pOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKiovCisvKiB1bmlEcmNHYWluICovCisvKioqKioqKioqKioqKiovCisKK3N0YXRpYyBGSVhQX1NHTCBfZGVjb2RlR2FpbkluaXRpYWwoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBjb25zdCBHQUlOX0NPRElOR19QUk9GSUxFIGdhaW5Db2RpbmdQcm9maWxlKSB7CisgIGludCBzaWduLCBtYWduOworICBGSVhQX1NHTCBnYWluSW5pdGlhbCA9IChGSVhQX1NHTCkwOworICBzd2l0Y2ggKGdhaW5Db2RpbmdQcm9maWxlKSB7CisgICAgY2FzZSBHQ1BfUkVHVUxBUjoKKyAgICAgIHNpZ24gPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgbWFnbiA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisKKyAgICAgIGdhaW5Jbml0aWFsID0KKyAgICAgICAgICAoRklYUF9TR0wpKG1hZ24gPDwgKEZSQUNUX0JJVFMgLSAxIC0gMyAtIDcpKTsgLyogbWFnbiAqIDAuMTI1OyAqLworICAgICAgaWYgKHNpZ24pIGdhaW5Jbml0aWFsID0gLWdhaW5Jbml0aWFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHQ1BfRkFESU5HOgorICAgICAgc2lnbiA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICBpZiAoc2lnbiA9PSAwKQorICAgICAgICBnYWluSW5pdGlhbCA9IChGSVhQX1NHTCkwOworICAgICAgZWxzZSB7CisgICAgICAgIG1hZ24gPSBGREtyZWFkQml0cyhoQnMsIDEwKTsKKyAgICAgICAgZ2FpbkluaXRpYWwgPSAtKEZJWFBfU0dMKSgKKyAgICAgICAgICAgIChtYWduICsgMSkgPDwgKEZSQUNUX0JJVFMgLSAxIC0gMyAtIDcpKTsgLyogLSAobWFnbiArIDEpICogMC4xMjU7ICovCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdDUF9DTElQUElOR19EVUNLSU5HOgorICAgICAgc2lnbiA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICBpZiAoc2lnbiA9PSAwKQorICAgICAgICBnYWluSW5pdGlhbCA9IChGSVhQX1NHTCkwOworICAgICAgZWxzZSB7CisgICAgICAgIG1hZ24gPSBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgICBnYWluSW5pdGlhbCA9IC0oRklYUF9TR0wpKAorICAgICAgICAgICAgKG1hZ24gKyAxKSA8PCAoRlJBQ1RfQklUUyAtIDEgLSAzIC0gNykpOyAvKiAtIChtYWduICsgMSkgKiAwLjEyNTsgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0NQX0NPTlNUQU5UOgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGdhaW5Jbml0aWFsOworfQorCitzdGF0aWMgaW50IF9kZWNvZGVOTm9kZXMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKSB7CisgIGludCBuTm9kZXMgPSAwLCBlbmRNYXJrZXIgPSAwOworCisgIC8qIGRlY29kZSBudW1iZXIgb2Ygbm9kZXMgKi8KKyAgd2hpbGUgKGVuZE1hcmtlciAhPSAxKSB7CisgICAgbk5vZGVzKys7CisgICAgaWYgKG5Ob2RlcyA+PSAxMjgpIGJyZWFrOworICAgIGVuZE1hcmtlciA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIH0KKyAgcmV0dXJuIG5Ob2RlczsKK30KKworc3RhdGljIHZvaWQgX2RlY29kZUdhaW5zKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHQUlOX0NPRElOR19QUk9GSUxFIGdhaW5Db2RpbmdQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuTm9kZXMsIEdBSU5fTk9ERSogcE5vZGVzKSB7CisgIGludCBrLCBkZWx0YUdhaW47CisgIEh1ZmZtYW4gZGVsdGFHYWluQ29kZWJvb2s7CisKKyAgcE5vZGVzWzBdLmdhaW5EYiA9IF9kZWNvZGVHYWluSW5pdGlhbChoQnMsIGdhaW5Db2RpbmdQcm9maWxlKTsKKworICBpZiAoZ2FpbkNvZGluZ1Byb2ZpbGUgPT0gR0NQX0NMSVBQSU5HX0RVQ0tJTkcpIHsKKyAgICBkZWx0YUdhaW5Db2RlYm9vayA9IChIdWZmbWFuKSZkZWx0YUdhaW5fY29kaW5nUHJvZmlsZV8yX2h1ZmZtYW47CisgIH0gZWxzZSB7CisgICAgZGVsdGFHYWluQ29kZWJvb2sgPSAoSHVmZm1hbikmZGVsdGFHYWluX2NvZGluZ1Byb2ZpbGVfMF8xX2h1ZmZtYW47CisgIH0KKworICBmb3IgKGsgPSAxOyBrIDwgbk5vZGVzOyBrKyspIHsKKyAgICBkZWx0YUdhaW4gPSBfZGVjb2RlSHVmZm1hbkNXKGRlbHRhR2FpbkNvZGVib29rLCBoQnMpOworICAgIGlmIChrID49IDE2KSBjb250aW51ZTsKKyAgICAvKiBnYWluX2RCX2UgPSA3ICovCisgICAgcE5vZGVzW2tdLmdhaW5EYiA9CisgICAgICAgIHBOb2Rlc1trIC0gMV0uZ2FpbkRiICsKKyAgICAgICAgKEZJWFBfU0dMKShkZWx0YUdhaW4gPDwgKEZSQUNUX0JJVFMgLSAxIC0gNyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKSk7IC8qIHBOb2Rlc1trLTFdLmdhaW5EYiArIDAuMTI1KmRlbHRhR2FpbiAqLworICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kZWNvZGVTbG9wZXMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHQUlOX0lOVEVSUE9MQVRJT05fVFlQRSBnYWluSW50ZXJwb2xhdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuTm9kZXMsIEdBSU5fTk9ERSogcE5vZGVzKSB7CisgIGludCBrID0gMDsKKworICBpZiAoZ2FpbkludGVycG9sYXRpb25UeXBlID09IEdJVF9TUExJTkUpIHsKKyAgICAvKiBkZWNvZGUgc2xvcGUgc3RlZXBuZXNzICovCisgICAgZm9yIChrID0gMDsgayA8IG5Ob2RlczsgaysrKSB7CisgICAgICBfZGVjb2RlSHVmZm1hbkNXKChIdWZmbWFuKSZzbG9wZVN0ZWVwbmVzc19odWZmbWFuLCBoQnMpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IF9kZWNvZGVUaW1lRGVsdGEoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBjb25zdCBpbnQgWikgeworICBpbnQgcHJlZml4LCBtdTsKKworICBwcmVmaXggPSBGREtyZWFkQml0cyhoQnMsIDIpOworICBzd2l0Y2ggKHByZWZpeCkgeworICAgIGNhc2UgMHgwOgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAweDE6CisgICAgICBtdSA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgICAgICByZXR1cm4gbXUgKyAyOworICAgIGNhc2UgMHgyOgorICAgICAgbXUgPSBGREtyZWFkQml0cyhoQnMsIDMpOworICAgICAgcmV0dXJuIG11ICsgNjsKKyAgICBjYXNlIDB4MzoKKyAgICAgIG11ID0gRkRLcmVhZEJpdHMoaEJzLCBaKTsKKyAgICAgIHJldHVybiBtdSArIDE0OworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBfZGVjb2RlVGltZXMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBjb25zdCBpbnQgZGVsdGFUbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZVNpemUsIGNvbnN0IGludCBmdWxsRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVPZmZzZXQsIGNvbnN0IGludCBaLCBjb25zdCBpbnQgbk5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdBSU5fTk9ERSogcE5vZGVzKSB7CisgIGludCB0aW1lRGVsdGEsIGs7CisgIGludCB0aW1lT2ZmcyA9IHRpbWVPZmZzZXQ7CisgIGludCBmcmFtZUVuZEZsYWcsIG5vZGVUaW1lVG1wLCBub2RlUmVzRmxhZzsKKworICBpZiAoZnVsbEZyYW1lID09IDApIHsKKyAgICBmcmFtZUVuZEZsYWcgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICB9IGVsc2UgeworICAgIGZyYW1lRW5kRmxhZyA9IDE7CisgIH0KKworICBpZiAoZnJhbWVFbmRGbGFnID09CisgICAgICAxKSB7IC8qIGZyYW1lRW5kRmxhZyA9PSAxIHNpZ25hbHMgdGhhdCB0aGUgbGFzdCBub2RlIGlzIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAgICAgIERSQyBmcmFtZSAqLworICAgIG5vZGVSZXNGbGFnID0gMDsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbk5vZGVzIC0gMTsgaysrKSB7CisgICAgICAvKiBkZWNvZGUgYSBkZWx0YSB0aW1lIHZhbHVlICovCisgICAgICB0aW1lRGVsdGEgPSBfZGVjb2RlVGltZURlbHRhKGhCcywgWik7CisgICAgICBpZiAoayA+PSAoMTYgLSAxKSkgY29udGludWU7CisgICAgICAvKiBmcmFtZUVuZEZsYWcgPT0gMSBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nIGZvciBsYXN0IG5vZGUgd2l0aCBub2RlCisgICAgICAgKiByZXNlcnZvaXIgKi8KKyAgICAgIG5vZGVUaW1lVG1wID0gdGltZU9mZnMgKyB0aW1lRGVsdGEgKiBkZWx0YVRtaW47CisgICAgICBpZiAobm9kZVRpbWVUbXAgPiBmcmFtZVNpemUgKyB0aW1lT2Zmc2V0KSB7CisgICAgICAgIGlmIChub2RlUmVzRmxhZyA9PSAwKSB7CisgICAgICAgICAgcE5vZGVzW2tdLnRpbWUgPSBmcmFtZVNpemUgKyB0aW1lT2Zmc2V0OworICAgICAgICAgIG5vZGVSZXNGbGFnID0gMTsKKyAgICAgICAgfQorICAgICAgICBwTm9kZXNbayArIDFdLnRpbWUgPSBub2RlVGltZVRtcDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBOb2Rlc1trXS50aW1lID0gbm9kZVRpbWVUbXA7CisgICAgICB9CisgICAgICB0aW1lT2ZmcyA9IG5vZGVUaW1lVG1wOworICAgIH0KKyAgICBpZiAobm9kZVJlc0ZsYWcgPT0gMCkgeworICAgICAgayA9IGZNaW4oaywgMTYgLSAxKTsKKyAgICAgIHBOb2Rlc1trXS50aW1lID0gZnJhbWVTaXplICsgdGltZU9mZnNldDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChrID0gMDsgayA8IG5Ob2RlczsgaysrKSB7CisgICAgICAvKiBkZWNvZGUgYSBkZWx0YSB0aW1lIHZhbHVlICovCisgICAgICB0aW1lRGVsdGEgPSBfZGVjb2RlVGltZURlbHRhKGhCcywgWik7CisgICAgICBpZiAoayA+PSAxNikgY29udGludWU7CisgICAgICBwTm9kZXNba10udGltZSA9IHRpbWVPZmZzICsgdGltZURlbHRhICogZGVsdGFUbWluOworICAgICAgdGltZU9mZnMgPSBwTm9kZXNba10udGltZTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgX3JlYWROb2RlcyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIEdBSU5fU0VUKiBnYWluU2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVTaXplLCBjb25zdCBpbnQgdGltZURlbHRhTWluLAorICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiogcE5Ob2RlcywgR0FJTl9OT0RFKiBwTm9kZXMpIHsKKyAgaW50IHRpbWVPZmZzZXQsIGRyY0dhaW5Db2RpbmdNb2RlLCBuTm9kZXM7CisgIGludCBaID0gX2dldFooZnJhbWVTaXplIC8gdGltZURlbHRhTWluKTsKKyAgaWYgKGdhaW5TZXQtPnRpbWVBbGlnbm1lbnQgPT0gMCkgeworICAgIHRpbWVPZmZzZXQgPSAtMTsKKyAgfSBlbHNlIHsKKyAgICB0aW1lT2Zmc2V0ID0gLXRpbWVEZWx0YU1pbiArCisgICAgICAgICAgICAgICAgICh0aW1lRGVsdGFNaW4gLSAxKSAvCisgICAgICAgICAgICAgICAgICAgICAyOyAvKiB0aW1lT2Zmc2V0ID0gLSBkZWx0YVRtaW4gKyBmbG9vcigoZGVsdGFUbWluLTEpLzIpOyAqLworICB9CisKKyAgZHJjR2FpbkNvZGluZ01vZGUgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoZHJjR2FpbkNvZGluZ01vZGUgPT0gMCkgeworICAgIC8qICJzaW1wbGUiIG1vZGU6IG9ubHkgb25lIG5vZGUgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUgd2l0aCBzbG9wZSA9IDAgKi8KKyAgICBuTm9kZXMgPSAxOworICAgIHBOb2Rlc1swXS5nYWluRGIgPSBfZGVjb2RlR2FpbkluaXRpYWwoCisgICAgICAgIGhCcywgKEdBSU5fQ09ESU5HX1BST0ZJTEUpZ2FpblNldC0+Z2FpbkNvZGluZ1Byb2ZpbGUpOworICAgIHBOb2Rlc1swXS50aW1lID0gZnJhbWVTaXplICsgdGltZU9mZnNldDsKKyAgfSBlbHNlIHsKKyAgICBuTm9kZXMgPSBfZGVjb2RlTk5vZGVzKGhCcyk7CisKKyAgICBfZGVjb2RlU2xvcGVzKGhCcywgKEdBSU5fSU5URVJQT0xBVElPTl9UWVBFKWdhaW5TZXQtPmdhaW5JbnRlcnBvbGF0aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgIG5Ob2RlcywgcE5vZGVzKTsKKworICAgIF9kZWNvZGVUaW1lcyhoQnMsIHRpbWVEZWx0YU1pbiwgZnJhbWVTaXplLCBnYWluU2V0LT5mdWxsRnJhbWUsIHRpbWVPZmZzZXQsCisgICAgICAgICAgICAgICAgIFosIG5Ob2RlcywgcE5vZGVzKTsKKworICAgIF9kZWNvZGVHYWlucyhoQnMsIChHQUlOX0NPRElOR19QUk9GSUxFKWdhaW5TZXQtPmdhaW5Db2RpbmdQcm9maWxlLCBuTm9kZXMsCisgICAgICAgICAgICAgICAgIHBOb2Rlcyk7CisgIH0KKyAgKnBOTm9kZXMgPSAoVUNIQVIpbk5vZGVzOworfQorCitzdGF0aWMgdm9pZCBfcmVhZERyY0dhaW5TZXF1ZW5jZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIEdBSU5fU0VUKiBnYWluU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lU2l6ZSwgY29uc3QgaW50IHRpbWVEZWx0YU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBwTk5vZGVzLCBHQUlOX05PREUgcE5vZGVzWzE2XSkgeworICBTSE9SVCB0aW1lQnVmUHJldkZyYW1lWzE2XSwgdGltZUJ1ZkN1ckZyYW1lWzE2XTsKKyAgaW50IG5Ob2Rlc05vZGVSZXMsIG5Ob2Rlc0N1ciwgaywgbTsKKworICBpZiAoZ2FpblNldC0+Z2FpbkNvZGluZ1Byb2ZpbGUgPT0gR0NQX0NPTlNUQU5UKSB7CisgICAgKnBOTm9kZXMgPSAxOworICAgIHBOb2Rlc1swXS50aW1lID0gZnJhbWVTaXplIC0gMTsKKyAgICBwTm9kZXNbMF0uZ2FpbkRiID0gKEZJWFBfU0dMKTA7CisgIH0gZWxzZSB7CisgICAgX3JlYWROb2RlcyhoQnMsIGdhaW5TZXQsIGZyYW1lU2l6ZSwgdGltZURlbHRhTWluLCBwTk5vZGVzLCBwTm9kZXMpOworCisgICAgLyogY291bnQgbnVtYmVyIG9mIG5vZGVzIGluIG5vZGUgcmVzZXJ2b2lyICovCisgICAgbk5vZGVzTm9kZVJlcyA9IDA7CisgICAgbk5vZGVzQ3VyID0gMDsKKyAgICAvKiBjb3VudCBhbmQgYnVmZmVyIG5vZGVzIGZyb20gbm9kZSByZXNlcnZvaXIgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgKnBOTm9kZXM7IGsrKykgeworICAgICAgaWYgKGsgPj0gMTYpIGNvbnRpbnVlOworICAgICAgaWYgKHBOb2Rlc1trXS50aW1lID49IGZyYW1lU2l6ZSkgeworICAgICAgICAvKiB3cml0ZSBub2RlIHJlc2Vydm9pciB0aW1lcyBpbnRvIGJ1ZmZlciAqLworICAgICAgICB0aW1lQnVmUHJldkZyYW1lW25Ob2Rlc05vZGVSZXNdID0gcE5vZGVzW2tdLnRpbWU7CisgICAgICAgIG5Ob2Rlc05vZGVSZXMrKzsKKyAgICAgIH0gZWxzZSB7IC8qIHRpbWVzIGZyb20gY3VycmVudCBmcmFtZSAqLworICAgICAgICB0aW1lQnVmQ3VyRnJhbWVbbk5vZGVzQ3VyXSA9IHBOb2Rlc1trXS50aW1lOworICAgICAgICBuTm9kZXNDdXIrKzsKKyAgICAgIH0KKyAgICB9CisgICAgLyogY29tcG9zZSByaWdodCB0aW1lIG9yZGVyIChiaXQgcmVzZXJ2b2lyIGZpcnN0KSAqLworICAgIGZvciAoayA9IDA7IGsgPCBuTm9kZXNOb2RlUmVzOyBrKyspIHsKKyAgICAgIC8qIHN1YnRyYWN0IHR3byB0aW1lIGZyYW1lU2l6ZTogb25lIHRvIHJlbW92ZSBub2RlIHJlc2Vydm9pciBvZmZzZXQgYW5kCisgICAgICAgKiBvbmUgdG8gZ2V0IHRoZSBuZWdhdGl2ZSBpbmRleCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBmcmFtZQorICAgICAgICovCisgICAgICBwTm9kZXNba10udGltZSA9IHRpbWVCdWZQcmV2RnJhbWVba10gLSAyICogZnJhbWVTaXplOworICAgIH0KKyAgICAvKiAuLi5hbmQgdGltZXMgZnJvbSBjdXJyZW50IGZyYW1lICovCisgICAgZm9yIChtID0gMDsgbSA8IG5Ob2Rlc0N1cjsgbSsrLCBrKyspIHsKKyAgICAgIHBOb2Rlc1trXS50aW1lID0gdGltZUJ1ZkN1ckZyYW1lW21dOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgRFJDX0VSUk9SIF9yZWFkVW5pRHJjR2FpbkV4dGVuc2lvbihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklfRFJDX0dBSU5fRVhURU5TSU9OKiBwRXh0KSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGssIGJpdFNpemVMZW4sIGV4dFNpemVCaXRzLCBiaXRTaXplOworCisgIGsgPSAwOworICBwRXh0LT51bmlEcmNHYWluRXh0VHlwZVtrXSA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgIHdoaWxlIChwRXh0LT51bmlEcmNHYWluRXh0VHlwZVtrXSAhPSBVTklEUkNHQUlORVhUX1RFUk0pIHsKKyAgICBpZiAoayA+PSAoOCAtIDEpKSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgIGJpdFNpemVMZW4gPSBGREtyZWFkQml0cyhoQnMsIDMpOworICAgIGV4dFNpemVCaXRzID0gYml0U2l6ZUxlbiArIDQ7CisKKyAgICBiaXRTaXplID0gRkRLcmVhZEJpdHMoaEJzLCBleHRTaXplQml0cyk7CisgICAgcEV4dC0+ZXh0Qml0U2l6ZVtrXSA9IGJpdFNpemUgKyAxOworCisgICAgc3dpdGNoIChwRXh0LT51bmlEcmNHYWluRXh0VHlwZVtrXSkgeworICAgICAgLyogYWRkIGZ1dHVyZSBleHRlbnNpb25zIGhlcmUgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEZES3B1c2hGb3IoaEJzLCBwRXh0LT5leHRCaXRTaXplW2tdKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGsrKzsKKyAgICBwRXh0LT51bmlEcmNHYWluRXh0VHlwZVtrXSA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitEUkNfRVJST1IKK2RyY0RlY19yZWFkVW5pRHJjR2FpbihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsIGNvbnN0IGludCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRlbHRhVG1pbkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfR0FJTiBoVW5pRHJjR2FpbikgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBzZXEsIGdhaW5TZXF1ZW5jZUNvdW50OworICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMqIHBDb2VmID0KKyAgICAgIHNlbGVjdERyY0NvZWZmaWNpZW50cyhoVW5pRHJjQ29uZmlnLCBMT0NBVElPTl9TRUxFQ1RFRCk7CisgIGlmIChwQ29lZiA9PSBOVUxMKSByZXR1cm4gREVfT0s7CisgIGlmIChoVW5pRHJjR2FpbiA9PSBOVUxMKSByZXR1cm4gREVfT0s7IC8qIGhVbmlEcmNHYWluIG5vdCBpbml0aWFsaXplZCB5ZXQgKi8KKworICBnYWluU2VxdWVuY2VDb3VudCA9IGZNaW4ocENvZWYtPmdhaW5TZXF1ZW5jZUNvdW50LCAoVUNIQVIpMTIpOworCisgIGZvciAoc2VxID0gMDsgc2VxIDwgZ2FpblNlcXVlbmNlQ291bnQ7IHNlcSsrKSB7CisgICAgVUNIQVIgaW5kZXggPSBwQ29lZi0+Z2FpblNldEluZGV4Rm9yR2FpblNlcXVlbmNlW3NlcV07CisgICAgR0FJTl9TRVQqIGdhaW5TZXQ7CisgICAgaW50IHRpbWVEZWx0YU1pbjsKKyAgICBVQ0hBUiB0bXBOTm9kZXMgPSAwOworICAgIEdBSU5fTk9ERSB0bXBOb2Rlc1sxNl07CisKKyAgICBpZiAoKGluZGV4ID49IHBDb2VmLT5nYWluU2V0Q291bnQpIHx8IChpbmRleCA+PSAxMikpIHJldHVybiBERV9OT1RfT0s7CisgICAgZ2FpblNldCA9ICYocENvZWYtPmdhaW5TZXRbaW5kZXhdKTsKKworICAgIHRpbWVEZWx0YU1pbiA9IF9nZXRUaW1lRGVsdGFNaW4oZ2FpblNldCwgZGVsdGFUbWluRGVmYXVsdCk7CisKKyAgICBfcmVhZERyY0dhaW5TZXF1ZW5jZShoQnMsIGdhaW5TZXQsIGZyYW1lU2l6ZSwgdGltZURlbHRhTWluLCAmdG1wTk5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE5vZGVzKTsKKworICAgIGhVbmlEcmNHYWluLT5uTm9kZXNbc2VxXSA9IHRtcE5Ob2RlczsKKyAgICBGREttZW1jcHkoaFVuaURyY0dhaW4tPmdhaW5Ob2RlW3NlcV0sIHRtcE5vZGVzLAorICAgICAgICAgICAgICBmTWluKHRtcE5Ob2RlcywgKFVDSEFSKTE2KSAqIHNpemVvZihHQUlOX05PREUpKTsKKyAgfQorCisgIGhVbmlEcmNHYWluLT51bmlEcmNHYWluRXh0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChoVW5pRHJjR2Fpbi0+dW5pRHJjR2FpbkV4dFByZXNlbnQgPT0gMSkgeworICAgIGVyciA9IF9yZWFkVW5pRHJjR2FpbkV4dGVuc2lvbihoQnMsICYoaFVuaURyY0dhaW4tPnVuaURyY0dhaW5FeHRlbnNpb24pKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKiovCisvKiB1bmlEcmNDb25maWcgKi8KKy8qKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBfZGVjb2RlRHVja2luZ01vZGlmaWNhdGlvbihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVUNLSU5HX01PRElGSUNBVElPTiogcERNb2QsIGludCBpc0JveCkgeworICBpbnQgYnNEdWNraW5nU2NhbGluZywgc2lnbWEsIG11OworCisgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDcpOyAvKiByZXNlcnZlZCAqLworICBwRE1vZC0+ZHVja2luZ1NjYWxpbmdQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKworICBpZiAocERNb2QtPmR1Y2tpbmdTY2FsaW5nUHJlc2VudCkgeworICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDQpOyAvKiByZXNlcnZlZCAqLworICAgIGJzRHVja2luZ1NjYWxpbmcgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgIHNpZ21hID0gYnNEdWNraW5nU2NhbGluZyA+PiAzOworICAgIG11ID0gYnNEdWNraW5nU2NhbGluZyAmIDB4NzsKKworICAgIGlmIChzaWdtYSkgeworICAgICAgcERNb2QtPmR1Y2tpbmdTY2FsaW5nID0gKEZJWFBfU0dMKSgKKyAgICAgICAgICAoNyAtIG11KSA8PCAoRlJBQ1RfQklUUyAtIDEgLSAzIC0gMikpOyAvKiAxLjAgLSAwLjEyNSAqICgxICsgbXUpOyAqLworICAgIH0gZWxzZSB7CisgICAgICBwRE1vZC0+ZHVja2luZ1NjYWxpbmcgPSAoRklYUF9TR0wpKAorICAgICAgICAgICg5ICsgbXUpIDw8IChGUkFDVF9CSVRTIC0gMSAtIDMgLSAyKSk7IC8qIDEuMCArIDAuMTI1ICogKDEgKyBtdSk7ICovCisgICAgfQorICB9IGVsc2UgeworICAgIHBETW9kLT5kdWNraW5nU2NhbGluZyA9IChGSVhQX1NHTCkoMSA8PCAoRlJBQ1RfQklUUyAtIDEgLSAyKSk7IC8qIDEuMCAqLworICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kZWNvZGVHYWluTW9kaWZpY2F0aW9uKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgY29uc3QgaW50IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFuZENvdW50LCBHQUlOX01PRElGSUNBVElPTiogcEdNb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNCb3gpIHsKKyAgaW50IHNpZ24sIGJzR2Fpbk9mZnNldCwgYnNBdHRlbnVhdGlvblNjYWxpbmcsIGJzQW1wbGlmaWNhdGlvblNjYWxpbmc7CisKKyAgaWYgKHZlcnNpb24gPiAwKSB7CisgICAgaW50IGIsIHNoYXBlRmlsdGVyUHJlc2VudDsKKworICAgIGlmIChpc0JveCkgeworICAgICAgRkRLcHVzaEZvcihoQnMsIDQpOyAvKiByZXNlcnZlZCAqLworICAgICAgYmFuZENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICB9CisKKyAgICBmb3IgKGIgPSAwOyBiIDwgYmFuZENvdW50OyBiKyspIHsKKyAgICAgIGlmIChpc0JveCkgeworICAgICAgICBGREtwdXNoRm9yKGhCcywgNCk7IC8qIHJlc2VydmVkICovCisgICAgICAgIHBHTW9kW2JdLnRhcmdldENoYXJhY3RlcmlzdGljTGVmdFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICBwR01vZFtiXS50YXJnZXRDaGFyYWN0ZXJpc3RpY1JpZ2h0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICAgIHBHTW9kW2JdLmdhaW5TY2FsaW5nUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICAgIHBHTW9kW2JdLmdhaW5PZmZzZXRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFpc0JveCkKKyAgICAgICAgcEdNb2RbYl0udGFyZ2V0Q2hhcmFjdGVyaXN0aWNMZWZ0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICBpZiAocEdNb2RbYl0udGFyZ2V0Q2hhcmFjdGVyaXN0aWNMZWZ0UHJlc2VudCkgeworICAgICAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCA0KTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgcEdNb2RbYl0udGFyZ2V0Q2hhcmFjdGVyaXN0aWNMZWZ0SW5kZXggPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgfQorICAgICAgaWYgKCFpc0JveCkKKyAgICAgICAgcEdNb2RbYl0udGFyZ2V0Q2hhcmFjdGVyaXN0aWNSaWdodFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgaWYgKHBHTW9kW2JdLnRhcmdldENoYXJhY3RlcmlzdGljUmlnaHRQcmVzZW50KSB7CisgICAgICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDQpOyAvKiByZXNlcnZlZCAqLworICAgICAgICBwR01vZFtiXS50YXJnZXRDaGFyYWN0ZXJpc3RpY1JpZ2h0SW5kZXggPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgfQorICAgICAgaWYgKCFpc0JveCkgcEdNb2RbYl0uZ2FpblNjYWxpbmdQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgIGlmIChwR01vZFtiXS5nYWluU2NhbGluZ1ByZXNlbnQpIHsKKyAgICAgICAgYnNBdHRlbnVhdGlvblNjYWxpbmcgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgICBwR01vZFtiXS5hdHRlbnVhdGlvblNjYWxpbmcgPSAoRklYUF9TR0wpKAorICAgICAgICAgICAgYnNBdHRlbnVhdGlvblNjYWxpbmcKKyAgICAgICAgICAgIDw8IChGUkFDVF9CSVRTIC0gMSAtIDMgLSAyKSk7IC8qIGJzQXR0ZW51YXRpb25TY2FsaW5nICogMC4xMjU7ICovCisgICAgICAgIGJzQW1wbGlmaWNhdGlvblNjYWxpbmcgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgICBwR01vZFtiXS5hbXBsaWZpY2F0aW9uU2NhbGluZyA9IChGSVhQX1NHTCkoCisgICAgICAgICAgICBic0FtcGxpZmljYXRpb25TY2FsaW5nCisgICAgICAgICAgICA8PCAoRlJBQ1RfQklUUyAtIDEgLSAzIC0gMikpOyAvKiBic0FtcGxpZmljYXRpb25TY2FsaW5nICogMC4xMjU7ICovCisgICAgICB9CisgICAgICBpZiAoIWlzQm94KSBwR01vZFtiXS5nYWluT2Zmc2V0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICBpZiAocEdNb2RbYl0uZ2Fpbk9mZnNldFByZXNlbnQpIHsKKyAgICAgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgMik7IC8qIHJlc2VydmVkICovCisgICAgICAgIHNpZ24gPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICBic0dhaW5PZmZzZXQgPSBGREtyZWFkQml0cyhoQnMsIDUpOworICAgICAgICBwR01vZFtiXS5nYWluT2Zmc2V0ID0gKEZJWFBfU0dMKSgKKyAgICAgICAgICAgICgxICsgYnNHYWluT2Zmc2V0KQorICAgICAgICAgICAgPDwgKEZSQUNUX0JJVFMgLSAxIC0gMiAtIDQpKTsgLyogKDErYnNHYWluT2Zmc2V0KSAqIDAuMjU7ICovCisgICAgICAgIGlmIChzaWduKSB7CisgICAgICAgICAgcEdNb2RbYl0uZ2Fpbk9mZnNldCA9IC1wR01vZFtiXS5nYWluT2Zmc2V0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChiYW5kQ291bnQgPT0gMSkgeworICAgICAgc2hhcGVGaWx0ZXJQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgIGlmIChzaGFwZUZpbHRlclByZXNlbnQpIHsKKyAgICAgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgMyk7IC8qIHJlc2VydmVkICovCisgICAgICAgIEZES3B1c2hGb3IoaEJzLCA0KTsgICAgICAgICAgICAvKiBwR01vZC0+c2hhcGVGaWx0ZXJJbmRleCAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgNyk7IC8qIHJlc2VydmVkICovCisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGludCBiLCBnYWluU2NhbGluZ1ByZXNlbnQsIGdhaW5PZmZzZXRQcmVzZW50OworICAgIEZJWFBfU0dMIGF0dGVudWF0aW9uU2NhbGluZyA9IEZMMkZYQ09OU1RfU0dMKDEuMGYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgIGFtcGxpZmljYXRpb25TY2FsaW5nID0gRkwyRlhDT05TVF9TR0woMS4wZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgICAgICAgICAgZ2Fpbk9mZnNldCA9IChGSVhQX1NHTCkwOworICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDcpOyAvKiByZXNlcnZlZCAqLworICAgIGdhaW5TY2FsaW5nUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGdhaW5TY2FsaW5nUHJlc2VudCkgeworICAgICAgYnNBdHRlbnVhdGlvblNjYWxpbmcgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgYXR0ZW51YXRpb25TY2FsaW5nID0gKEZJWFBfU0dMKSgKKyAgICAgICAgICBic0F0dGVudWF0aW9uU2NhbGluZworICAgICAgICAgIDw8IChGUkFDVF9CSVRTIC0gMSAtIDMgLSAyKSk7IC8qIGJzQXR0ZW51YXRpb25TY2FsaW5nICogMC4xMjU7ICovCisgICAgICBic0FtcGxpZmljYXRpb25TY2FsaW5nID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgIGFtcGxpZmljYXRpb25TY2FsaW5nID0gKEZJWFBfU0dMKSgKKyAgICAgICAgICBic0FtcGxpZmljYXRpb25TY2FsaW5nCisgICAgICAgICAgPDwgKEZSQUNUX0JJVFMgLSAxIC0gMyAtIDIpKTsgLyogYnNBbXBsaWZpY2F0aW9uU2NhbGluZyAqIDAuMTI1OyAqLworICAgIH0KKyAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCA3KTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBnYWluT2Zmc2V0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGdhaW5PZmZzZXRQcmVzZW50KSB7CisgICAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCAyKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAgIHNpZ24gPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgYnNHYWluT2Zmc2V0ID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgIGdhaW5PZmZzZXQgPQorICAgICAgICAgIChGSVhQX1NHTCkoKDEgKyBic0dhaW5PZmZzZXQpIDw8IChGUkFDVF9CSVRTIC0gMSAtIDIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KSk7IC8qICgxK2JzR2Fpbk9mZnNldCkgKiAwLjI1OyAqLworICAgICAgaWYgKHNpZ24pIHsKKyAgICAgICAgZ2Fpbk9mZnNldCA9IC1nYWluT2Zmc2V0OworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGIgPSAwOyBiIDwgNDsgYisrKSB7CisgICAgICBwR01vZFtiXS50YXJnZXRDaGFyYWN0ZXJpc3RpY0xlZnRQcmVzZW50ID0gMDsKKyAgICAgIHBHTW9kW2JdLnRhcmdldENoYXJhY3RlcmlzdGljUmlnaHRQcmVzZW50ID0gMDsKKyAgICAgIHBHTW9kW2JdLmdhaW5TY2FsaW5nUHJlc2VudCA9IGdhaW5TY2FsaW5nUHJlc2VudDsKKyAgICAgIHBHTW9kW2JdLmF0dGVudWF0aW9uU2NhbGluZyA9IGF0dGVudWF0aW9uU2NhbGluZzsKKyAgICAgIHBHTW9kW2JdLmFtcGxpZmljYXRpb25TY2FsaW5nID0gYW1wbGlmaWNhdGlvblNjYWxpbmc7CisgICAgICBwR01vZFtiXS5nYWluT2Zmc2V0UHJlc2VudCA9IGdhaW5PZmZzZXRQcmVzZW50OworICAgICAgcEdNb2RbYl0uZ2Fpbk9mZnNldCA9IGdhaW5PZmZzZXQ7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIF9yZWFkRHJjQ2hhcmFjdGVyaXN0aWMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBjb25zdCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJDX0NIQVJBQ1RFUklTVElDKiBwRENoYXIsIGludCBpc0JveCkgeworICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgMSk7IC8qIHJlc2VydmVkICovCisgICAgcERDaGFyLT5jaWNwSW5kZXggPSBGREtyZWFkQml0cyhoQnMsIDcpOworICAgIGlmIChwRENoYXItPmNpY3BJbmRleCA+IDApIHsKKyAgICAgIHBEQ2hhci0+cHJlc2VudCA9IDE7CisgICAgICBwRENoYXItPmlzQ0lDUCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHBEQ2hhci0+cHJlc2VudCA9IDA7CisgICAgfQorICB9IGVsc2UgeworICAgIHBEQ2hhci0+cHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGlzQm94KSBwRENoYXItPmlzQ0lDUCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKHBEQ2hhci0+cHJlc2VudCkgeworICAgICAgaWYgKCFpc0JveCkgcERDaGFyLT5pc0NJQ1AgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgaWYgKHBEQ2hhci0+aXNDSUNQKSB7CisgICAgICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDEpOyAvKiByZXNlcnZlZCAqLworICAgICAgICBwRENoYXItPmNpY3BJbmRleCA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwRENoYXItPmN1c3RvbS5sZWZ0ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgICAgcERDaGFyLT5jdXN0b20ucmlnaHQgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBfcmVhZEJhbmRCb3JkZXIoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBCQU5EX0JPUkRFUiogcEJCb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkcmNCYW5kVHlwZSwgaW50IGlzQm94KSB7CisgIGlmIChkcmNCYW5kVHlwZSkgeworICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDQpOyAvKiByZXNlcnZlZCAqLworICAgIHBCQm9yZC0+Y3Jvc3NvdmVyRnJlcUluZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBwQkJvcmQtPnN0YXJ0U3ViQmFuZEluZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCAxMCk7CisgIH0KK30KKworc3RhdGljIERSQ19FUlJPUiBfcmVhZEdhaW5TZXQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBjb25zdCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZ2FpblNlcXVlbmNlSW5kZXgsIEdBSU5fU0VUKiBwR1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc0JveCkgeworICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCAyKTsgLyogcmVzZXJ2ZWQgKi8KKyAgcEdTZXQtPmdhaW5Db2RpbmdQcm9maWxlID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgcEdTZXQtPmdhaW5JbnRlcnBvbGF0aW9uVHlwZSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIHBHU2V0LT5mdWxsRnJhbWUgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBwR1NldC0+dGltZUFsaWdubWVudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIHBHU2V0LT50aW1lRGVsdGFNaW5QcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKworICBpZiAocEdTZXQtPnRpbWVEZWx0YU1pblByZXNlbnQpIHsKKyAgICBpbnQgYnNUaW1lRGVsdGFNaW47CisgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgNSk7IC8qIHJlc2VydmVkICovCisgICAgYnNUaW1lRGVsdGFNaW4gPSBGREtyZWFkQml0cyhoQnMsIDExKTsKKyAgICBwR1NldC0+dGltZURlbHRhTWluID0gYnNUaW1lRGVsdGFNaW4gKyAxOworICB9CisKKyAgaWYgKHBHU2V0LT5nYWluQ29kaW5nUHJvZmlsZSAhPSBHQ1BfQ09OU1RBTlQpIHsKKyAgICBpbnQgaTsKKyAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCAzKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBwR1NldC0+YmFuZENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICBpZiAocEdTZXQtPmJhbmRDb3VudCA+IDQpIHJldHVybiBERV9NRU1PUllfRVJST1I7CisKKyAgICBpZiAoKHBHU2V0LT5iYW5kQ291bnQgPiAxKSB8fCBpc0JveCkgeworICAgICAgcEdTZXQtPmRyY0JhbmRUeXBlID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcEdTZXQtPmJhbmRDb3VudDsgaSsrKSB7CisgICAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICAgICpnYWluU2VxdWVuY2VJbmRleCA9ICgqZ2FpblNlcXVlbmNlSW5kZXgpICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpbmRleFByZXNlbnQ7CisgICAgICAgIGluZGV4UHJlc2VudCA9IChpc0JveCkgPyAxIDogRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgICAgaWYgKGluZGV4UHJlc2VudCkgeworICAgICAgICAgIGludCBic0luZGV4OworICAgICAgICAgIGJzSW5kZXggPSBGREtyZWFkQml0cyhoQnMsIDYpOworICAgICAgICAgICpnYWluU2VxdWVuY2VJbmRleCA9IGJzSW5kZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmdhaW5TZXF1ZW5jZUluZGV4ID0gKCpnYWluU2VxdWVuY2VJbmRleCkgKyAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBwR1NldC0+Z2FpblNlcXVlbmNlSW5kZXhbaV0gPSAqZ2FpblNlcXVlbmNlSW5kZXg7CisgICAgICBfcmVhZERyY0NoYXJhY3RlcmlzdGljKGhCcywgdmVyc2lvbiwgJihwR1NldC0+ZHJjQ2hhcmFjdGVyaXN0aWNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JveCk7CisgICAgfQorICAgIGZvciAoaSA9IDE7IGkgPCBwR1NldC0+YmFuZENvdW50OyBpKyspIHsKKyAgICAgIF9yZWFkQmFuZEJvcmRlcihoQnMsICYocEdTZXQtPmJhbmRCb3JkZXJbaV0pLCBwR1NldC0+ZHJjQmFuZFR5cGUsIGlzQm94KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcEdTZXQtPmJhbmRDb3VudCA9IDE7CisgICAgKmdhaW5TZXF1ZW5jZUluZGV4ID0gKCpnYWluU2VxdWVuY2VJbmRleCkgKyAxOworICAgIHBHU2V0LT5nYWluU2VxdWVuY2VJbmRleFswXSA9ICpnYWluU2VxdWVuY2VJbmRleDsKKyAgfQorCisgIHJldHVybiBERV9PSzsKK30KKworc3RhdGljIERSQ19FUlJPUiBfcmVhZEN1c3RvbURyY0NoYXJhY3RlcmlzdGljKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFSQUNURVJJU1RJQ19TSURFIHNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIHBDaGFyYWN0ZXJpc3RpY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVNUT01fRFJDX0NIQVIqIHBDQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNCb3gpIHsKKyAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgNyk7IC8qIHJlc2VydmVkICovCisgICpwQ2hhcmFjdGVyaXN0aWNGb3JtYXQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoKnBDaGFyYWN0ZXJpc3RpY0Zvcm1hdCA9PSBDRl9TSUdNT0lEKSB7CisgICAgaW50IGJzR2FpbiwgYnNJb1JhdGlvLCBic0V4cDsKKyAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCAxKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBic0dhaW4gPSBGREtyZWFkQml0cyhoQnMsIDYpOworICAgIGlmIChzaWRlID09IENTX0xFRlQpIHsKKyAgICAgIHBDQ2hhci0+c2lnbW9pZC5nYWluID0gKEZJWFBfU0dMKShic0dhaW4gPDwgKEZSQUNUX0JJVFMgLSAxIC0gNikpOworICAgIH0gZWxzZSB7CisgICAgICBwQ0NoYXItPnNpZ21vaWQuZ2FpbiA9IChGSVhQX1NHTCkoLWJzR2FpbiA8PCAoRlJBQ1RfQklUUyAtIDEgLSA2KSk7CisgICAgfQorICAgIGJzSW9SYXRpbyA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgLyogcENDaGFyLT5zaWdtb2lkLmlvUmF0aW8gPSAwLjA1ICsgMC4xNSAqIGJzSW9SYXRpbzsgKi8KKyAgICBwQ0NoYXItPnNpZ21vaWQuaW9SYXRpbyA9CisgICAgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDVmIC8gKGZsb2F0KSgxIDw8IDIpKSArCisgICAgICAgIChGSVhQX1NHTCkoKCgoMyAqIGJzSW9SYXRpbykgPDwgKEZSQUNUX0JJVFMgLSAxKSkgLyA1KSA+PiA0KTsKKyAgICBic0V4cCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgaWYgKGJzRXhwIDwgMTUpIHsKKyAgICAgIHBDQ2hhci0+c2lnbW9pZC5leHAgPSAoRklYUF9TR0wpKCgxICsgMiAqIGJzRXhwKSA8PCAoRlJBQ1RfQklUUyAtIDEgLSA1KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBDQ2hhci0+c2lnbW9pZC5leHAgPSAoRklYUF9TR0wpTUFYVkFMX1NHTDsgLyogcmVwcmVzZW50cyBpbmZpbml0eSAqLworICAgIH0KKyAgICBwQ0NoYXItPnNpZ21vaWQuZmxpcFNpZ24gPSBGREtyZWFkQml0cyhoQnMsIDEpOworICB9IGVsc2UgeyAvKiBDRl9OT0RFUyAqLworICAgIGludCBpLCBic0NoYXJhY3RlcmlzdGljTm9kZUNvdW50LCBic05vZGVMZXZlbERlbHRhLCBic05vZGVHYWluOworICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiByZXNlcnZlZCAqLworICAgIGJzQ2hhcmFjdGVyaXN0aWNOb2RlQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDIpOworICAgIHBDQ2hhci0+bm9kZXMuY2hhcmFjdGVyaXN0aWNOb2RlQ291bnQgPSBic0NoYXJhY3RlcmlzdGljTm9kZUNvdW50ICsgMTsKKyAgICBpZiAocENDaGFyLT5ub2Rlcy5jaGFyYWN0ZXJpc3RpY05vZGVDb3VudCA+IDQpIHJldHVybiBERV9NRU1PUllfRVJST1I7CisgICAgcENDaGFyLT5ub2Rlcy5ub2RlTGV2ZWxbMF0gPSBEUkNfSU5QVVRfTE9VRE5FU1NfVEFSR0VUX1NHTDsKKyAgICBwQ0NoYXItPm5vZGVzLm5vZGVHYWluWzBdID0gKEZJWFBfU0dMKTA7CisgICAgZm9yIChpID0gMDsgaSA8IHBDQ2hhci0+bm9kZXMuY2hhcmFjdGVyaXN0aWNOb2RlQ291bnQ7IGkrKykgeworICAgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgMyk7IC8qIHJlc2VydmVkICovCisgICAgICBic05vZGVMZXZlbERlbHRhID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgIGlmIChzaWRlID09IENTX0xFRlQpIHsKKyAgICAgICAgcENDaGFyLT5ub2Rlcy5ub2RlTGV2ZWxbaSArIDFdID0KKyAgICAgICAgICAgIHBDQ2hhci0+bm9kZXMubm9kZUxldmVsW2ldIC0KKyAgICAgICAgICAgIChGSVhQX1NHTCkoKDEgKyBic05vZGVMZXZlbERlbHRhKSA8PCAoRlJBQ1RfQklUUyAtIDEgLSA3KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwQ0NoYXItPm5vZGVzLm5vZGVMZXZlbFtpICsgMV0gPQorICAgICAgICAgICAgcENDaGFyLT5ub2Rlcy5ub2RlTGV2ZWxbaV0gKworICAgICAgICAgICAgKEZJWFBfU0dMKSgoMSArIGJzTm9kZUxldmVsRGVsdGEpIDw8IChGUkFDVF9CSVRTIC0gMSAtIDcpKTsKKyAgICAgIH0KKyAgICAgIGJzTm9kZUdhaW4gPSBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgcENDaGFyLT5ub2Rlcy5ub2RlR2FpbltpICsgMV0gPSAoRklYUF9TR0wpKAorICAgICAgICAgIChic05vZGVHYWluIC0gMTI4KQorICAgICAgICAgIDw8IChGUkFDVF9CSVRTIC0gMSAtIDEgLSA3KSk7IC8qIDAuNWYgKiBic05vZGVHYWluIC0gNjQuMGY7ICovCisgICAgfQorICB9CisgIHJldHVybiBERV9PSzsKK30KKworc3RhdGljIHZvaWQgX3NraXBMb3VkRXFJbnN0cnVjdGlvbnMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKSB7CisgIGludCBpOworICBpbnQgZG93bm1peElkUHJlc2VudCwgYWRkaXRpb25hbERvd25taXhJZFByZXNlbnQsCisgICAgICBhZGRpdGlvbmFsRG93bm1peElkQ291bnQgPSAwOworICBpbnQgZHJjU2V0SWRQcmVzZW50LCBhZGRpdGlvbmFsRHJjU2V0SWRQcmVzZW50LCBhZGRpdGlvbmFsRHJjU2V0SWRDb3VudCA9IDA7CisgIGludCBlcVNldElkUHJlc2VudCwgYWRkaXRpb25hbEVxU2V0SWRQcmVzZW50LCBhZGRpdGlvbmFsRXFTZXRJZENvdW50ID0gMDsKKyAgaW50IGxvdWRFcUdhaW5TZXF1ZW5jZUNvdW50LCBkcmNDaGFyYWN0ZXJpc3RpY0Zvcm1hdElzQ0lDUDsKKworICBGREtwdXNoRm9yKGhCcywgNCk7IC8qIGxvdWRFcVNldElkICovCisgIEZES3B1c2hGb3IoaEJzLCA0KTsgLyogZHJjTG9jYXRpb24gKi8KKyAgZG93bm1peElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChkb3dubWl4SWRQcmVzZW50KSB7CisgICAgRkRLcHVzaEZvcihoQnMsIDcpOyAvKiBkb3dubWl4SWQgKi8KKyAgICBhZGRpdGlvbmFsRG93bm1peElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGFkZGl0aW9uYWxEb3dubWl4SWRQcmVzZW50KSB7CisgICAgICBhZGRpdGlvbmFsRG93bm1peElkQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDcpOworICAgICAgZm9yIChpID0gMDsgaSA8IGFkZGl0aW9uYWxEb3dubWl4SWRDb3VudDsgaSsrKSB7CisgICAgICAgIEZES3B1c2hGb3IoaEJzLCA3KTsgLyogYWRkaXRpb25hbERvd25taXhJZCAqLworICAgICAgfQorICAgIH0KKyAgfQorCisgIGRyY1NldElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChkcmNTZXRJZFByZXNlbnQpIHsKKyAgICBGREtwdXNoRm9yKGhCcywgNik7IC8qIGRyY1NldElkICovCisgICAgYWRkaXRpb25hbERyY1NldElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGFkZGl0aW9uYWxEcmNTZXRJZFByZXNlbnQpIHsKKyAgICAgIGFkZGl0aW9uYWxEcmNTZXRJZENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhZGRpdGlvbmFsRHJjU2V0SWRDb3VudDsgaSsrKSB7CisgICAgICAgIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogYWRkaXRpb25hbERyY1NldElkOyAqLworICAgICAgfQorICAgIH0KKyAgfQorCisgIGVxU2V0SWRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGVxU2V0SWRQcmVzZW50KSB7CisgICAgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiBlcVNldElkICovCisgICAgYWRkaXRpb25hbEVxU2V0SWRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBpZiAoYWRkaXRpb25hbEVxU2V0SWRQcmVzZW50KSB7CisgICAgICBhZGRpdGlvbmFsRXFTZXRJZENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhZGRpdGlvbmFsRXFTZXRJZENvdW50OyBpKyspIHsKKyAgICAgICAgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiBhZGRpdGlvbmFsRXFTZXRJZDsgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBGREtwdXNoRm9yKGhCcywgMSk7IC8qIGxvdWRuZXNzQWZ0ZXJEcmMgKi8KKyAgRkRLcHVzaEZvcihoQnMsIDEpOyAvKiBsb3VkbmVzc0FmdGVyRXEgKi8KKyAgbG91ZEVxR2FpblNlcXVlbmNlQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDYpOworICBmb3IgKGkgPSAwOyBpIDwgbG91ZEVxR2FpblNlcXVlbmNlQ291bnQ7IGkrKykgeworICAgIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogZ2FpblNlcXVlbmNlSW5kZXggKi8KKyAgICBkcmNDaGFyYWN0ZXJpc3RpY0Zvcm1hdElzQ0lDUCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGRyY0NoYXJhY3RlcmlzdGljRm9ybWF0SXNDSUNQKSB7CisgICAgICBGREtwdXNoRm9yKGhCcywgNyk7IC8qIGRyY0NoYXJhY3RlcmlzdGljICovCisgICAgfSBlbHNlIHsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCA0KTsgLyogZHJjQ2hhcmFjdGVyaXN0aWNMZWZ0SW5kZXggKi8KKyAgICAgIEZES3B1c2hGb3IoaEJzLCA0KTsgLyogZHJjQ2hhcmFjdGVyaXN0aWNSaWdodEluZGV4ICovCisgICAgfQorICAgIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogZnJlcXVlbmN5UmFuZ2VJbmRleCAqLworICAgIEZES3B1c2hGb3IoaEJzLCAzKTsgLyogYnNMb3VkRXFTY2FsaW5nICovCisgICAgRkRLcHVzaEZvcihoQnMsIDUpOyAvKiBic0xvdWRFcU9mZnNldCAqLworICB9Cit9CisKK3N0YXRpYyB2b2lkIF9za2lwRXFTdWJiYW5kR2FpblNwbGluZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpIHsKKyAgaW50IG5FcU5vZGVzLCBrLCBiaXRzOworICBuRXFOb2RlcyA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgIG5FcU5vZGVzICs9IDI7CisgIGZvciAoayA9IDA7IGsgPCBuRXFOb2RlczsgaysrKSB7CisgICAgYml0cyA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKCFiaXRzKSB7CisgICAgICBGREtwdXNoRm9yKGhCcywgNCk7CisgICAgfQorICB9CisgIEZES3B1c2hGb3IoaEJzLCA0ICogKG5FcU5vZGVzIC0gMSkpOworICBiaXRzID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgc3dpdGNoIChiaXRzKSB7CisgICAgY2FzZSAwOgorICAgICAgRkRLcHVzaEZvcihoQnMsIDUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICAgIEZES3B1c2hGb3IoaEJzLCA0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIEZES3B1c2hGb3IoaEJzLCAzKTsKKyAgICAgIGJyZWFrOworICB9CisgIEZES3B1c2hGb3IoaEJzLCA1ICogKG5FcU5vZGVzIC0gMSkpOworfQorCitzdGF0aWMgdm9pZCBfc2tpcEVxQ29lZmZpY2llbnRzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcykgeworICBpbnQgaiwgazsKKyAgaW50IGVxRGVsYXlNYXhQcmVzZW50OworICBpbnQgdW5pcXVlRmlsdGVyQmxvY2tDb3VudCwgZmlsdGVyRWxlbWVudENvdW50LCBmaWx0ZXJFbGVtZW50R2FpblByZXNlbnQ7CisgIGludCB1bmlxdWVUZEZpbHRlckVsZW1lbnRDb3VudCwgZXFGaWx0ZXJGb3JtYXQsIGJzUmVhbFplcm9SYWRpdXNPbmVDb3VudCwKKyAgICAgIHJlYWxaZXJvQ291bnQsIGdlbmVyaWNaZXJvQ291bnQsIHJlYWxQb2xlQ291bnQsIGNvbXBsZXhQb2xlQ291bnQsCisgICAgICBmaXJGaWx0ZXJPcmRlcjsKKyAgaW50IHVuaXF1ZUVxU3ViYmFuZEdhaW5zQ291bnQsIGVxU3ViYmFuZEdhaW5SZXByZXNlbnRhdGlvbiwKKyAgICAgIGVxU3ViYmFuZEdhaW5Db3VudDsKKyAgRVFfU1VCQkFORF9HQUlOX0ZPUk1BVCBlcVN1YmJhbmRHYWluRm9ybWF0OworCisgIGVxRGVsYXlNYXhQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGVxRGVsYXlNYXhQcmVzZW50KSB7CisgICAgRkRLcHVzaEZvcihoQnMsIDgpOyAvKiBic0VxRGVsYXlNYXggKi8KKyAgfQorCisgIHVuaXF1ZUZpbHRlckJsb2NrQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDYpOworICBmb3IgKGogPSAwOyBqIDwgdW5pcXVlRmlsdGVyQmxvY2tDb3VudDsgaisrKSB7CisgICAgZmlsdGVyRWxlbWVudENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgZmlsdGVyRWxlbWVudENvdW50OyBrKyspIHsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogZmlsdGVyRWxlbWVudEluZGV4ICovCisgICAgICBmaWx0ZXJFbGVtZW50R2FpblByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgaWYgKGZpbHRlckVsZW1lbnRHYWluUHJlc2VudCkgeworICAgICAgICBGREtwdXNoRm9yKGhCcywgMTApOyAvKiBic0ZpbHRlckVsZW1lbnRHYWluICovCisgICAgICB9CisgICAgfQorICB9CisgIHVuaXF1ZVRkRmlsdGVyRWxlbWVudENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgZm9yIChqID0gMDsgaiA8IHVuaXF1ZVRkRmlsdGVyRWxlbWVudENvdW50OyBqKyspIHsKKyAgICBlcUZpbHRlckZvcm1hdCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGVxRmlsdGVyRm9ybWF0ID09IDApIHsgLyogcG9sZS96ZXJvICovCisgICAgICBic1JlYWxaZXJvUmFkaXVzT25lQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDMpOworICAgICAgcmVhbFplcm9Db3VudCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgICAgICBnZW5lcmljWmVyb0NvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgICAgIHJlYWxQb2xlQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgY29tcGxleFBvbGVDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICBGREtwdXNoRm9yKGhCcywgMiAqIGJzUmVhbFplcm9SYWRpdXNPbmVDb3VudCAqIDEpOworICAgICAgRkRLcHVzaEZvcihoQnMsIHJlYWxaZXJvQ291bnQgKiA4KTsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCBnZW5lcmljWmVyb0NvdW50ICogMTQpOworICAgICAgRkRLcHVzaEZvcihoQnMsIHJlYWxQb2xlQ291bnQgKiA4KTsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCBjb21wbGV4UG9sZUNvdW50ICogMTQpOworICAgIH0gZWxzZSB7IC8qIEZJUiBjb2VmZmljaWVudHMgKi8KKyAgICAgIGZpckZpbHRlck9yZGVyID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCAxKTsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCAoZmlyRmlsdGVyT3JkZXIgLyAyICsgMSkgKiAxMSk7CisgICAgfQorICB9CisgIHVuaXF1ZUVxU3ViYmFuZEdhaW5zQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDYpOworICBpZiAodW5pcXVlRXFTdWJiYW5kR2FpbnNDb3VudCA+IDApIHsKKyAgICBlcVN1YmJhbmRHYWluUmVwcmVzZW50YXRpb24gPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGVxU3ViYmFuZEdhaW5Gb3JtYXQgPSAoRVFfU1VCQkFORF9HQUlOX0ZPUk1BVClGREtyZWFkQml0cyhoQnMsIDQpOworICAgIHN3aXRjaCAoZXFTdWJiYW5kR2FpbkZvcm1hdCkgeworICAgICAgY2FzZSBHRl9RTUYzMjoKKyAgICAgICAgZXFTdWJiYW5kR2FpbkNvdW50ID0gMzI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRl9RTUZIWUJSSUQzOToKKyAgICAgICAgZXFTdWJiYW5kR2FpbkNvdW50ID0gMzk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRl9RTUY2NDoKKyAgICAgICAgZXFTdWJiYW5kR2FpbkNvdW50ID0gNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRl9RTUZIWUJSSUQ3MToKKyAgICAgICAgZXFTdWJiYW5kR2FpbkNvdW50ID0gNzE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRl9RTUYxMjg6CisgICAgICAgIGVxU3ViYmFuZEdhaW5Db3VudCA9IDEyODsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdGX1FNRkhZQlJJRDEzNToKKyAgICAgICAgZXFTdWJiYW5kR2FpbkNvdW50ID0gMTM1OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0ZfVU5JRk9STToKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGVxU3ViYmFuZEdhaW5Db3VudCA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgIGVxU3ViYmFuZEdhaW5Db3VudCsrOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZm9yIChrID0gMDsgayA8IHVuaXF1ZUVxU3ViYmFuZEdhaW5zQ291bnQ7IGsrKykgeworICAgICAgaWYgKGVxU3ViYmFuZEdhaW5SZXByZXNlbnRhdGlvbiA9PSAxKSB7CisgICAgICAgIF9za2lwRXFTdWJiYW5kR2FpblNwbGluZShoQnMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRkRLcHVzaEZvcihoQnMsIGVxU3ViYmFuZEdhaW5Db3VudCAqIDkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBfc2tpcFRkRmlsdGVyQ2FzY2FkZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZXFDaGFubmVsR3JvdXBDb3VudCkgeworICBpbnQgaSwgZXFDYXNjYWRlR2FpblByZXNlbnQsIGZpbHRlckJsb2NrQ291bnQsIGVxUGhhc2VBbGlnbm1lbnRQcmVzZW50OworICBmb3IgKGkgPSAwOyBpIDwgZXFDaGFubmVsR3JvdXBDb3VudDsgaSsrKSB7CisgICAgZXFDYXNjYWRlR2FpblByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChlcUNhc2NhZGVHYWluUHJlc2VudCkgeworICAgICAgRkRLcHVzaEZvcihoQnMsIDEwKTsgLyogYnNFcUNhc2NhZGVHYWluICovCisgICAgfQorICAgIGZpbHRlckJsb2NrQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgIEZES3B1c2hGb3IoaEJzLCBmaWx0ZXJCbG9ja0NvdW50ICogNyk7IC8qIGZpbHRlckJsb2NrSW5kZXggKi8KKyAgfQorICBlcVBoYXNlQWxpZ25tZW50UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIHsKKyAgICBpZiAoZXFQaGFzZUFsaWdubWVudFByZXNlbnQpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBlcUNoYW5uZWxHcm91cENvdW50OyBpKyspIHsKKyAgICAgICAgRkRLcHVzaEZvcihoQnMsIChlcUNoYW5uZWxHcm91cENvdW50IC0gaSAtIDEpICogMSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX3NraXBFcUluc3RydWN0aW9ucyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBpbnQgYywgaSwgaywgY2hhbm5lbENvdW50OworICBpbnQgZG93bm1peElkUHJlc2VudCwgZG93bm1peElkLCBlcUFwcGx5VG9Eb3dubWl4LCBhZGRpdGlvbmFsRG93bm1peElkUHJlc2VudCwKKyAgICAgIGFkZGl0aW9uYWxEb3dubWl4SWRDb3VudCA9IDA7CisgIGludCBhZGRpdGlvbmFsRHJjU2V0SWRQcmVzZW50LCBhZGRpdGlvbmFsRHJjU2V0SWRDb3VudDsKKyAgaW50IGRlcGVuZHNPbkVxU2V0UHJlc2VudCwgZXFDaGFubmVsR3JvdXBDb3VudCwgdGRGaWx0ZXJDYXNjYWRlUHJlc2VudCwKKyAgICAgIHN1YmJhbmRHYWluc1ByZXNlbnQsIGVxVHJhbnNpdGlvbkR1cmF0aW9uUHJlc2VudDsKKworICBGREtwdXNoRm9yKGhCcywgNik7IC8qIGVxU2V0SWQgKi8KKyAgRkRLcHVzaEZvcihoQnMsIDQpOyAvKiBlcVNldENvbXBsZXhpdHlMZXZlbCAqLworICBkb3dubWl4SWRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGRvd25taXhJZFByZXNlbnQpIHsKKyAgICBkb3dubWl4SWQgPSBGREtyZWFkQml0cyhoQnMsIDcpOworICAgIGVxQXBwbHlUb0Rvd25taXggPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGFkZGl0aW9uYWxEb3dubWl4SWRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBpZiAoYWRkaXRpb25hbERvd25taXhJZFByZXNlbnQpIHsKKyAgICAgIGFkZGl0aW9uYWxEb3dubWl4SWRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisgICAgICBGREtwdXNoRm9yKGhCcywgYWRkaXRpb25hbERvd25taXhJZENvdW50ICogNyk7IC8qIGFkZGl0aW9uYWxEb3dubWl4SWQgKi8KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZG93bm1peElkID0gMDsKKyAgICBlcUFwcGx5VG9Eb3dubWl4ID0gMDsKKyAgfQorICBGREtwdXNoRm9yKGhCcywgNik7IC8qIGRyY1NldElkICovCisgIGFkZGl0aW9uYWxEcmNTZXRJZFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoYWRkaXRpb25hbERyY1NldElkUHJlc2VudCkgeworICAgIGFkZGl0aW9uYWxEcmNTZXRJZENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYWRkaXRpb25hbERyY1NldElkQ291bnQ7IGkrKykgeworICAgICAgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiBhZGRpdGlvbmFsRHJjU2V0SWQgKi8KKyAgICB9CisgIH0KKyAgRkRLcHVzaEZvcihoQnMsIDE2KTsgLyogZXFTZXRQdXJwb3NlICovCisgIGRlcGVuZHNPbkVxU2V0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChkZXBlbmRzT25FcVNldFByZXNlbnQpIHsKKyAgICBGREtwdXNoRm9yKGhCcywgNik7IC8qIGRlcGVuZHNPbkVxU2V0ICovCisgIH0gZWxzZSB7CisgICAgRkRLcHVzaEZvcihoQnMsIDEpOyAvKiBub0luZGVwZW5kZW50RXFVc2UgKi8KKyAgfQorCisgIGNoYW5uZWxDb3VudCA9IGhVbmlEcmNDb25maWctPmNoYW5uZWxMYXlvdXQuYmFzZUNoYW5uZWxDb3VudDsKKyAgaWYgKChkb3dubWl4SWRQcmVzZW50ID09IDEpICYmIChlcUFwcGx5VG9Eb3dubWl4ID09IDEpICYmIChkb3dubWl4SWQgIT0gMCkgJiYKKyAgICAgIChkb3dubWl4SWQgIT0gRE9XTk1JWF9JRF9BTllfRE9XTk1JWCkgJiYKKyAgICAgIChhZGRpdGlvbmFsRG93bm1peElkQ291bnQgPT0gMCkpIHsKKyAgICBET1dOTUlYX0lOU1RSVUNUSU9OUyogcERvd24gPQorICAgICAgICBzZWxlY3REb3dubWl4SW5zdHJ1Y3Rpb25zKGhVbmlEcmNDb25maWcsIGRvd25taXhJZCk7CisgICAgaWYgKHBEb3duID09IE5VTEwpIHJldHVybiBERV9OT1RfT0s7CisKKyAgICBjaGFubmVsQ291bnQgPQorICAgICAgICBwRG93bi0+dGFyZ2V0Q2hhbm5lbENvdW50OyAvKiB0YXJnZXRDaGFubmVsQ291bnRGcm9tRG93bm1peElkKi8KKyAgfSBlbHNlIGlmICgoZG93bm1peElkID09IERPV05NSVhfSURfQU5ZX0RPV05NSVgpIHx8CisgICAgICAgICAgICAgKGFkZGl0aW9uYWxEb3dubWl4SWRDb3VudCA+IDEpKSB7CisgICAgY2hhbm5lbENvdW50ID0gMTsKKyAgfQorCisgIGVxQ2hhbm5lbEdyb3VwQ291bnQgPSAwOworICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHsKKyAgICBVQ0hBUiBlcUNoYW5uZWxHcm91cEZvckNoYW5uZWxbOF07CisgICAgaW50IG5ld0dyb3VwID0gMTsKKyAgICBpZiAoYyA+PSA4KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgIGVxQ2hhbm5lbEdyb3VwRm9yQ2hhbm5lbFtjXSA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisgICAgZm9yIChrID0gMDsgayA8IGM7IGsrKykgeworICAgICAgaWYgKGVxQ2hhbm5lbEdyb3VwRm9yQ2hhbm5lbFtjXSA9PSBlcUNoYW5uZWxHcm91cEZvckNoYW5uZWxba10pIHsKKyAgICAgICAgbmV3R3JvdXAgPSAwOworICAgICAgfQorICAgIH0KKyAgICBpZiAobmV3R3JvdXAgPT0gMSkgeworICAgICAgZXFDaGFubmVsR3JvdXBDb3VudCArPSAxOworICAgIH0KKyAgfQorICB0ZEZpbHRlckNhc2NhZGVQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKHRkRmlsdGVyQ2FzY2FkZVByZXNlbnQpIHsKKyAgICBfc2tpcFRkRmlsdGVyQ2FzY2FkZShoQnMsIGVxQ2hhbm5lbEdyb3VwQ291bnQpOworICB9CisgIHN1YmJhbmRHYWluc1ByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoc3ViYmFuZEdhaW5zUHJlc2VudCkgeworICAgIEZES3B1c2hGb3IoaEJzLCBlcUNoYW5uZWxHcm91cENvdW50ICogNik7IC8qIHN1YmJhbmRHYWluc0luZGV4ICovCisgIH0KKyAgZXFUcmFuc2l0aW9uRHVyYXRpb25QcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGVxVHJhbnNpdGlvbkR1cmF0aW9uUHJlc2VudCkgeworICAgIEZES3B1c2hGb3IoaEJzLCA1KTsgLyogYnNFcVRyYW5zaXRpb25EdXJhdGlvbiAqLworICB9CisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9za2lwRHJjQ29lZmZpY2llbnRzQmFzaWMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKSB7CisgIEZES3B1c2hGb3IoaEJzLCA0KTsgLyogZHJjTG9jYXRpb24gKi8KKyAgRkRLcHVzaEZvcihoQnMsIDcpOyAvKiBkcmNDaGFyYWN0ZXJpc3RpYyAqLworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9yZWFkRHJjQ29lZmZpY2llbnRzVW5pRHJjKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQyogcENvZWYpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBpbnQgaSwgYnNEcmNGcmFtZVNpemU7CisgIGludCBnYWluU2VxdWVuY2VJbmRleCA9IC0xOworCisgIHBDb2VmLT5kcmNMb2NhdGlvbiA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgIHBDb2VmLT5kcmNGcmFtZVNpemVQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKworICBpZiAocENvZWYtPmRyY0ZyYW1lU2l6ZVByZXNlbnQgPT0gMSkgeworICAgIGJzRHJjRnJhbWVTaXplID0gRkRLcmVhZEJpdHMoaEJzLCAxNSk7CisgICAgcENvZWYtPmRyY0ZyYW1lU2l6ZSA9IGJzRHJjRnJhbWVTaXplICsgMTsKKyAgfQorICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgaW50IGdhaW5TZXF1ZW5jZUNvdW50ID0gMCwgZ2FpblNldENvdW50OworICAgIHBDb2VmLT5jaGFyYWN0ZXJpc3RpY0xlZnRDb3VudCA9IDA7CisgICAgcENvZWYtPmNoYXJhY3RlcmlzdGljUmlnaHRDb3VudCA9IDA7CisgICAgZ2FpblNldENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgICBwQ29lZi0+Z2FpblNldENvdW50ID0gZk1pbihnYWluU2V0Q291bnQsIDEyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2FpblNldENvdW50OyBpKyspIHsKKyAgICAgIEdBSU5fU0VUIHRtcEdzZXQ7CisgICAgICBGREttZW1jbGVhcigmdG1wR3NldCwgc2l6ZW9mKEdBSU5fU0VUKSk7CisgICAgICBlcnIgPSBfcmVhZEdhaW5TZXQoaEJzLCB2ZXJzaW9uLCAmZ2FpblNlcXVlbmNlSW5kZXgsICZ0bXBHc2V0LCAwKTsKKyAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgICBnYWluU2VxdWVuY2VDb3VudCArPSB0bXBHc2V0LmJhbmRDb3VudDsKKworICAgICAgaWYgKGkgPj0gMTIpIGNvbnRpbnVlOworICAgICAgcENvZWYtPmdhaW5TZXRbaV0gPSB0bXBHc2V0OworICAgIH0KKyAgICBwQ29lZi0+Z2FpblNlcXVlbmNlQ291bnQgPSBnYWluU2VxdWVuY2VDb3VudDsKKyAgfSBlbHNlIHsgLyogKHZlcnNpb24gPT0gMSkgKi8KKyAgICBVQ0hBUiBkcmNDaGFyYWN0ZXJpc3RpY0xlZnRQcmVzZW50LCBkcmNDaGFyYWN0ZXJpc3RpY1JpZ2h0UHJlc2VudDsKKyAgICBVQ0hBUiBzaGFwZUZpbHRlcnNQcmVzZW50LCBzaGFwZUZpbHRlckNvdW50LCB0bXBQcmVzZW50OworICAgIGludCBnYWluU2V0Q291bnQ7CisgICAgZHJjQ2hhcmFjdGVyaXN0aWNMZWZ0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGRyY0NoYXJhY3RlcmlzdGljTGVmdFByZXNlbnQpIHsKKyAgICAgIHBDb2VmLT5jaGFyYWN0ZXJpc3RpY0xlZnRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICBpZiAoKHBDb2VmLT5jaGFyYWN0ZXJpc3RpY0xlZnRDb3VudCArIDEpID4gOCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwQ29lZi0+Y2hhcmFjdGVyaXN0aWNMZWZ0Q291bnQ7IGkrKykgeworICAgICAgICBlcnIgPSBfcmVhZEN1c3RvbURyY0NoYXJhY3RlcmlzdGljKAorICAgICAgICAgICAgaEJzLCBDU19MRUZULCAmKHBDb2VmLT5jaGFyYWN0ZXJpc3RpY0xlZnRGb3JtYXRbaSArIDFdKSwKKyAgICAgICAgICAgICYocENvZWYtPmN1c3RvbUNoYXJhY3RlcmlzdGljTGVmdFtpICsgMV0pLCAwKTsKKyAgICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICAgIH0KKyAgICB9CisgICAgZHJjQ2hhcmFjdGVyaXN0aWNSaWdodFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChkcmNDaGFyYWN0ZXJpc3RpY1JpZ2h0UHJlc2VudCkgeworICAgICAgcENvZWYtPmNoYXJhY3RlcmlzdGljUmlnaHRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICBpZiAoKHBDb2VmLT5jaGFyYWN0ZXJpc3RpY1JpZ2h0Q291bnQgKyAxKSA+IDgpIHJldHVybiBERV9NRU1PUllfRVJST1I7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcENvZWYtPmNoYXJhY3RlcmlzdGljUmlnaHRDb3VudDsgaSsrKSB7CisgICAgICAgIGVyciA9IF9yZWFkQ3VzdG9tRHJjQ2hhcmFjdGVyaXN0aWMoCisgICAgICAgICAgICBoQnMsIENTX1JJR0hULCAmKHBDb2VmLT5jaGFyYWN0ZXJpc3RpY1JpZ2h0Rm9ybWF0W2kgKyAxXSksCisgICAgICAgICAgICAmKHBDb2VmLT5jdXN0b21DaGFyYWN0ZXJpc3RpY1JpZ2h0W2kgKyAxXSksIDApOworICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgfQorICAgIH0KKyAgICBzaGFwZUZpbHRlcnNQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBpZiAoc2hhcGVGaWx0ZXJzUHJlc2VudCkgeworICAgICAgc2hhcGVGaWx0ZXJDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2hhcGVGaWx0ZXJDb3VudDsgaSsrKSB7CisgICAgICAgIHRtcFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICBpZiAodG1wUHJlc2VudCkgLyogbGZDdXRQYXJhbXMgKi8KKyAgICAgICAgICBGREtwdXNoRm9yKGhCcywgNSk7CisKKyAgICAgICAgdG1wUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICAgIGlmICh0bXBQcmVzZW50KSAvKiBsZkJvb3N0UGFyYW1zICovCisgICAgICAgICAgRkRLcHVzaEZvcihoQnMsIDUpOworCisgICAgICAgIHRtcFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICBpZiAodG1wUHJlc2VudCkgLyogaGZDdXRQYXJhbXMgKi8KKyAgICAgICAgICBGREtwdXNoRm9yKGhCcywgNSk7CisKKyAgICAgICAgdG1wUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICAgIGlmICh0bXBQcmVzZW50KSAvKiBoZkJvb3N0UGFyYW1zICovCisgICAgICAgICAgRkRLcHVzaEZvcihoQnMsIDUpOworICAgICAgfQorICAgIH0KKyAgICBwQ29lZi0+Z2FpblNlcXVlbmNlQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDYpOworICAgIGdhaW5TZXRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgICAgcENvZWYtPmdhaW5TZXRDb3VudCA9IGZNaW4oZ2FpblNldENvdW50LCAxMik7CisgICAgZm9yIChpID0gMDsgaSA8IGdhaW5TZXRDb3VudDsgaSsrKSB7CisgICAgICBHQUlOX1NFVCB0bXBHc2V0OworICAgICAgRkRLbWVtY2xlYXIoJnRtcEdzZXQsIHNpemVvZihHQUlOX1NFVCkpOworICAgICAgZXJyID0gX3JlYWRHYWluU2V0KGhCcywgdmVyc2lvbiwgJmdhaW5TZXF1ZW5jZUluZGV4LCAmdG1wR3NldCwgMCk7CisgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgICAgICBpZiAoaSA+PSAxMikgY29udGludWU7CisgICAgICBwQ29lZi0+Z2FpblNldFtpXSA9IHRtcEdzZXQ7CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisgICAgcENvZWYtPmdhaW5TZXRJbmRleEZvckdhaW5TZXF1ZW5jZVtpXSA9IDI1NTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgcENvZWYtPmdhaW5TZXRDb3VudDsgaSsrKSB7CisgICAgaW50IGI7CisgICAgZm9yIChiID0gMDsgYiA8IHBDb2VmLT5nYWluU2V0W2ldLmJhbmRDb3VudDsgYisrKSB7CisgICAgICBpZiAocENvZWYtPmdhaW5TZXRbaV0uZ2FpblNlcXVlbmNlSW5kZXhbYl0gPj0gMTIpIGNvbnRpbnVlOworICAgICAgcENvZWYtPmdhaW5TZXRJbmRleEZvckdhaW5TZXF1ZW5jZVtwQ29lZi0+Z2FpblNldFtpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdhaW5TZXF1ZW5jZUluZGV4W2JdXSA9IGk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX3NraXBEcmNJbnN0cnVjdGlvbnNCYXNpYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpIHsKKyAgaW50IGRyY1NldEVmZmVjdDsKKyAgaW50IGFkZGl0aW9uYWxEb3dubWl4SWRQcmVzZW50LCBhZGRpdGlvbmFsRG93bm1peElkQ291bnQsCisgICAgICBsaW1pdGVyUGVha1RhcmdldFByZXNlbnQ7CisgIGludCBkcmNTZXRUYXJnZXRMb3VkbmVzc1ByZXNlbnQsIGRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlclByZXNlbnQ7CisKKyAgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiBkcmNTZXRJZCAqLworICBGREtwdXNoRm9yKGhCcywgNCk7IC8qIGRyY0xvY2F0aW9uICovCisgIEZES3B1c2hGb3IoaEJzLCA3KTsgLyogZG93bm1peElkICovCisgIGFkZGl0aW9uYWxEb3dubWl4SWRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGFkZGl0aW9uYWxEb3dubWl4SWRQcmVzZW50KSB7CisgICAgYWRkaXRpb25hbERvd25taXhJZENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICBGREtwdXNoRm9yKGhCcywgNyAqIGFkZGl0aW9uYWxEb3dubWl4SWRDb3VudCk7IC8qIGFkZGl0aW9uYWxEb3dubWl4SWQgKi8KKyAgfQorCisgIGRyY1NldEVmZmVjdCA9IEZES3JlYWRCaXRzKGhCcywgMTYpOworICBpZiAoIShkcmNTZXRFZmZlY3QgJiAoRUJfRFVDS19PVEhFUiB8IEVCX0RVQ0tfU0VMRikpKSB7CisgICAgbGltaXRlclBlYWtUYXJnZXRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBpZiAobGltaXRlclBlYWtUYXJnZXRQcmVzZW50KSB7CisgICAgICBGREtwdXNoRm9yKGhCcywgOCk7IC8qIGJzTGltaXRlclBlYWtUYXJnZXQgKi8KKyAgICB9CisgIH0KKworICBkcmNTZXRUYXJnZXRMb3VkbmVzc1ByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoZHJjU2V0VGFyZ2V0TG91ZG5lc3NQcmVzZW50KSB7CisgICAgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiBic0RyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlciAqLworICAgIGRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlclByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChkcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXJQcmVzZW50KSB7CisgICAgICBGREtwdXNoRm9yKGhCcywgNik7IC8qIGJzRHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZUxvd2VyICovCisgICAgfQorICB9Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX3JlYWREcmNJbnN0cnVjdGlvbnNVbmlEcmMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBpbnQgaSwgZywgYzsKKyAgaW50IGRvd25taXhJZFByZXNlbnQsIGFkZGl0aW9uYWxEb3dubWl4SWRQcmVzZW50LCBhZGRpdGlvbmFsRG93bm1peElkQ291bnQ7CisgIGludCBic0xpbWl0ZXJQZWFrVGFyZ2V0LCBjaGFubmVsQ291bnQ7CisgIERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQyogcENvZWYgPSBOVUxMOworICBpbnQgcmVwZWF0UGFyYW1ldGVycywgYnNSZXBlYXRQYXJhbWV0ZXJzQ291bnQ7CisgIGludCByZXBlYXRTZXF1ZW5jZUluZGV4LCBic1JlcGVhdFNlcXVlbmNlQ291bnQ7CisgIFNDSEFSKiBnYWluU2V0SW5kZXggPSBwSW5zdC0+Z2FpblNldEluZGV4OworICBTQ0hBUiBjaGFubmVsR3JvdXBGb3JDaGFubmVsWzhdOworICBEVUNLSU5HX01PRElGSUNBVElPTiBkdWNraW5nTW9kaWZpY2F0aW9uRm9yQ2hhbm5lbEdyb3VwWzhdOworCisgIHBJbnN0LT5kcmNTZXRJZCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAvKiBBc3N1bWUgYWxsIHYwIERSQyBzZXRzIHRvIGJlIG1hbmFnZWFibGUgaW4gdGVybXMgb2YgY29tcGxleGl0eSAqLworICAgIHBJbnN0LT5kcmNTZXRDb21wbGV4aXR5TGV2ZWwgPSAyOworICB9IGVsc2UgeworICAgIHBJbnN0LT5kcmNTZXRDb21wbGV4aXR5TGV2ZWwgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICB9CisgIHBJbnN0LT5kcmNMb2NhdGlvbiA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICBkb3dubWl4SWRQcmVzZW50ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBkb3dubWl4SWRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgfQorICBpZiAoZG93bm1peElkUHJlc2VudCkgeworICAgIHBJbnN0LT5kb3dubWl4SWRbMF0gPSBGREtyZWFkQml0cyhoQnMsIDcpOworICAgIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgIGlmIChwSW5zdC0+ZG93bm1peElkWzBdID09IDApCisgICAgICAgIHBJbnN0LT5kcmNBcHBseVRvRG93bm1peCA9IDA7CisgICAgICBlbHNlCisgICAgICAgIHBJbnN0LT5kcmNBcHBseVRvRG93bm1peCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHBJbnN0LT5kcmNBcHBseVRvRG93bm1peCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgfQorCisgICAgYWRkaXRpb25hbERvd25taXhJZFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChhZGRpdGlvbmFsRG93bm1peElkUHJlc2VudCkgeworICAgICAgYWRkaXRpb25hbERvd25taXhJZENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICAgIGlmICgoMSArIGFkZGl0aW9uYWxEb3dubWl4SWRDb3VudCkgPiA4KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgICAgZm9yIChpID0gMDsgaSA8IGFkZGl0aW9uYWxEb3dubWl4SWRDb3VudDsgaSsrKSB7CisgICAgICAgIHBJbnN0LT5kb3dubWl4SWRbaSArIDFdID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgICAgIH0KKyAgICAgIHBJbnN0LT5kb3dubWl4SWRDb3VudCA9IDEgKyBhZGRpdGlvbmFsRG93bm1peElkQ291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHBJbnN0LT5kb3dubWl4SWRDb3VudCA9IDE7CisgICAgfQorICB9IGVsc2UgeworICAgIHBJbnN0LT5kb3dubWl4SWRbMF0gPSAwOworICAgIHBJbnN0LT5kb3dubWl4SWRDb3VudCA9IDE7CisgIH0KKworICBwSW5zdC0+ZHJjU2V0RWZmZWN0ID0gRkRLcmVhZEJpdHMoaEJzLCAxNik7CisKKyAgaWYgKChwSW5zdC0+ZHJjU2V0RWZmZWN0ICYgKEVCX0RVQ0tfT1RIRVIgfCBFQl9EVUNLX1NFTEYpKSA9PSAwKSB7CisgICAgcEluc3QtPmxpbWl0ZXJQZWFrVGFyZ2V0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKHBJbnN0LT5saW1pdGVyUGVha1RhcmdldFByZXNlbnQpIHsKKyAgICAgIGJzTGltaXRlclBlYWtUYXJnZXQgPSBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgcEluc3QtPmxpbWl0ZXJQZWFrVGFyZ2V0ID0gLShGSVhQX1NHTCkoCisgICAgICAgICAgYnNMaW1pdGVyUGVha1RhcmdldAorICAgICAgICAgIDw8IChGUkFDVF9CSVRTIC0gMSAtIDMgLSA1KSk7IC8qIC0gYnNMaW1pdGVyUGVha1RhcmdldCAqIDAuMTI1OyAqLworICAgIH0KKyAgfQorCisgIHBJbnN0LT5kcmNTZXRUYXJnZXRMb3VkbmVzc1ByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworCisgIC8qIHNldCBkZWZhdWx0IHZhbHVlcyAqLworICBwSW5zdC0+ZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZVVwcGVyID0gMDsKKyAgcEluc3QtPmRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlciA9IC02MzsKKworICBpZiAocEluc3QtPmRyY1NldFRhcmdldExvdWRuZXNzUHJlc2VudCA9PSAxKSB7CisgICAgaW50IGJzRHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZVVwcGVyLCBic0RyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlcjsKKyAgICBpbnQgZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZUxvd2VyUHJlc2VudDsKKyAgICBic0RyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlciA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgICAgcEluc3QtPmRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlciA9CisgICAgICAgIGJzRHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZVVwcGVyIC0gNjM7CisgICAgZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZUxvd2VyUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlclByZXNlbnQgPT0gMSkgeworICAgICAgYnNEcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXIgPSBGREtyZWFkQml0cyhoQnMsIDYpOworICAgICAgcEluc3QtPmRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlciA9CisgICAgICAgICAgYnNEcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXIgLSA2MzsKKyAgICB9CisgIH0KKworICBwSW5zdC0+ZGVwZW5kc09uRHJjU2V0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisKKyAgcEluc3QtPm5vSW5kZXBlbmRlbnRVc2UgPSAwOworICBpZiAocEluc3QtPmRlcGVuZHNPbkRyY1NldFByZXNlbnQpIHsKKyAgICBwSW5zdC0+ZGVwZW5kc09uRHJjU2V0ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgfSBlbHNlIHsKKyAgICBwSW5zdC0+bm9JbmRlcGVuZGVudFVzZSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIH0KKworICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgcEluc3QtPnJlcXVpcmVzRXEgPSAwOworICB9IGVsc2UgeworICAgIHBJbnN0LT5yZXF1aXJlc0VxID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgfQorCisgIHBDb2VmID0gc2VsZWN0RHJjQ29lZmZpY2llbnRzKGhVbmlEcmNDb25maWcsIHBJbnN0LT5kcmNMb2NhdGlvbik7CisKKyAgcEluc3QtPmRyY0NoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudCA9CisgICAgICBoVW5pRHJjQ29uZmlnLT5jaGFubmVsTGF5b3V0LmJhc2VDaGFubmVsQ291bnQ7CisKKyAgaWYgKHBJbnN0LT5kcmNTZXRFZmZlY3QgJiAoRUJfRFVDS19PVEhFUiB8IEVCX0RVQ0tfU0VMRikpIHsKKyAgICBEVUNLSU5HX01PRElGSUNBVElPTiogcERNb2RGb3JDaGFubmVsID0KKyAgICAgICAgcEluc3QtPmR1Y2tpbmdNb2RpZmljYXRpb25Gb3JDaGFubmVsOworICAgIGMgPSAwOworICAgIHdoaWxlIChjIDwgY2hhbm5lbENvdW50KSB7CisgICAgICBpbnQgYnNHYWluU2V0SW5kZXg7CisgICAgICBic0dhaW5TZXRJbmRleCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgICAgICBpZiAoYyA+PSA4KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgICAgZ2FpblNldEluZGV4W2NdID0gYnNHYWluU2V0SW5kZXggLSAxOworICAgICAgX2RlY29kZUR1Y2tpbmdNb2RpZmljYXRpb24oaEJzLCAmKHBETW9kRm9yQ2hhbm5lbFtjXSksIDApOworCisgICAgICBjKys7CisgICAgICByZXBlYXRQYXJhbWV0ZXJzID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgIGlmIChyZXBlYXRQYXJhbWV0ZXJzID09IDEpIHsKKyAgICAgICAgYnNSZXBlYXRQYXJhbWV0ZXJzQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDUpOworICAgICAgICBic1JlcGVhdFBhcmFtZXRlcnNDb3VudCArPSAxOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnNSZXBlYXRQYXJhbWV0ZXJzQ291bnQ7IGkrKykgeworICAgICAgICAgIGlmIChjID49IDgpIHJldHVybiBERV9NRU1PUllfRVJST1I7CisgICAgICAgICAgZ2FpblNldEluZGV4W2NdID0gZ2FpblNldEluZGV4W2MgLSAxXTsKKyAgICAgICAgICBwRE1vZEZvckNoYW5uZWxbY10gPSBwRE1vZEZvckNoYW5uZWxbYyAtIDFdOworICAgICAgICAgIGMrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoYyA+IGNoYW5uZWxDb3VudCkgeworICAgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgICB9CisKKyAgICBlcnIgPSBkZXJpdmVEcmNDaGFubmVsR3JvdXBzKAorICAgICAgICBwSW5zdC0+ZHJjU2V0RWZmZWN0LCBwSW5zdC0+ZHJjQ2hhbm5lbENvdW50LCBnYWluU2V0SW5kZXgsCisgICAgICAgIHBETW9kRm9yQ2hhbm5lbCwgJnBJbnN0LT5uRHJjQ2hhbm5lbEdyb3VwcywKKyAgICAgICAgcEluc3QtPmdhaW5TZXRJbmRleEZvckNoYW5uZWxHcm91cCwgY2hhbm5lbEdyb3VwRm9yQ2hhbm5lbCwKKyAgICAgICAgZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWxHcm91cCk7CisgICAgaWYgKGVycikgcmV0dXJuIChlcnIpOworICB9IGVsc2UgeworICAgIGludCBkZXJpdmVDaGFubmVsQ291bnQgPSAwOworICAgIGlmICgoKHZlcnNpb24gPT0gMCkgfHwgKHBJbnN0LT5kcmNBcHBseVRvRG93bm1peCAhPSAwKSkgJiYKKyAgICAgICAgKHBJbnN0LT5kb3dubWl4SWRbMF0gIT0gRE9XTk1JWF9JRF9CQVNFX0xBWU9VVCkgJiYKKyAgICAgICAgKHBJbnN0LT5kb3dubWl4SWRbMF0gIT0gRE9XTk1JWF9JRF9BTllfRE9XTk1JWCkgJiYKKyAgICAgICAgKHBJbnN0LT5kb3dubWl4SWRDb3VudCA9PSAxKSkgeworICAgICAgaWYgKGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudCAhPSAwKSB7CisgICAgICAgIERPV05NSVhfSU5TVFJVQ1RJT05TKiBwRG93biA9CisgICAgICAgICAgICBzZWxlY3REb3dubWl4SW5zdHJ1Y3Rpb25zKGhVbmlEcmNDb25maWcsIHBJbnN0LT5kb3dubWl4SWRbMF0pOworICAgICAgICBpZiAocERvd24gPT0gTlVMTCkgcmV0dXJuIERFX05PVF9PSzsKKyAgICAgICAgcEluc3QtPmRyY0NoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudCA9CisgICAgICAgICAgICBwRG93bi0+dGFyZ2V0Q2hhbm5lbENvdW50OyAvKiB0YXJnZXRDaGFubmVsQ291bnRGcm9tRG93bm1peElkKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlcml2ZUNoYW5uZWxDb3VudCA9IDE7CisgICAgICAgIGNoYW5uZWxDb3VudCA9IDE7CisgICAgICB9CisgICAgfSBlbHNlIGlmICgoKHZlcnNpb24gPT0gMCkgfHwgKHBJbnN0LT5kcmNBcHBseVRvRG93bm1peCAhPSAwKSkgJiYKKyAgICAgICAgICAgICAgICgocEluc3QtPmRvd25taXhJZFswXSA9PSBET1dOTUlYX0lEX0FOWV9ET1dOTUlYKSB8fAorICAgICAgICAgICAgICAgIChwSW5zdC0+ZG93bm1peElkQ291bnQgPiAxKSkpIHsKKyAgICAgIC8qIFNldCBtYXhpbXVtIGNoYW5uZWwgY291bnQgYXMgdXBwZXIgYm9yZGVyLiBUaGUgZWZmZWN0aXZlIGNoYW5uZWwgY291bnQKKyAgICAgICAqIGlzIHNldCBhdCB0aGUgcHJvY2VzcyBmdW5jdGlvbi4gKi8KKyAgICAgIHBJbnN0LT5kcmNDaGFubmVsQ291bnQgPSA4OworICAgICAgY2hhbm5lbENvdW50ID0gMTsKKyAgICB9CisKKyAgICBjID0gMDsKKyAgICB3aGlsZSAoYyA8IGNoYW5uZWxDb3VudCkgeworICAgICAgaW50IGJzR2FpblNldEluZGV4OworICAgICAgYnNHYWluU2V0SW5kZXggPSBGREtyZWFkQml0cyhoQnMsIDYpOworICAgICAgaWYgKGMgPj0gOCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICAgIGdhaW5TZXRJbmRleFtjXSA9IGJzR2FpblNldEluZGV4IC0gMTsKKyAgICAgIGMrKzsKKyAgICAgIHJlcGVhdFNlcXVlbmNlSW5kZXggPSBGREtyZWFkQml0cyhoQnMsIDEpOworCisgICAgICBpZiAocmVwZWF0U2VxdWVuY2VJbmRleCA9PSAxKSB7CisgICAgICAgIGJzUmVwZWF0U2VxdWVuY2VDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgICAgICAgIGJzUmVwZWF0U2VxdWVuY2VDb3VudCArPSAxOworICAgICAgICBpZiAoZGVyaXZlQ2hhbm5lbENvdW50KSB7CisgICAgICAgICAgY2hhbm5lbENvdW50ID0gMSArIGJzUmVwZWF0U2VxdWVuY2VDb3VudDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnNSZXBlYXRTZXF1ZW5jZUNvdW50OyBpKyspIHsKKyAgICAgICAgICBpZiAoYyA+PSA4KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgICAgICAgIGdhaW5TZXRJbmRleFtjXSA9IGJzR2FpblNldEluZGV4IC0gMTsKKyAgICAgICAgICBjKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGMgPiBjaGFubmVsQ291bnQpIHsKKyAgICAgIHJldHVybiBERV9OT1RfT0s7CisgICAgfQorICAgIGlmIChkZXJpdmVDaGFubmVsQ291bnQpIHsKKyAgICAgIHBJbnN0LT5kcmNDaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgfQorCisgICAgLyogRE9XTk1JWF9JRF9BTllfRE9XTk1JWDogY2hhbm5lbENvdW50IGlzIDEuIERpc3RyaWJ1dGUgZ2FpblNldEluZGV4IHRvIGFsbAorICAgICAqIGNoYW5uZWxzLiAqLworICAgIGlmICgocEluc3QtPmRvd25taXhJZFswXSA9PSBET1dOTUlYX0lEX0FOWV9ET1dOTUlYKSB8fAorICAgICAgICAocEluc3QtPmRvd25taXhJZENvdW50ID4gMSkpIHsKKyAgICAgIGZvciAoYyA9IDE7IGMgPCBwSW5zdC0+ZHJjQ2hhbm5lbENvdW50OyBjKyspIHsKKyAgICAgICAgZ2FpblNldEluZGV4W2NdID0gZ2FpblNldEluZGV4WzBdOworICAgICAgfQorICAgIH0KKworICAgIGVyciA9IGRlcml2ZURyY0NoYW5uZWxHcm91cHMocEluc3QtPmRyY1NldEVmZmVjdCwgcEluc3QtPmRyY0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5TZXRJbmRleCwgTlVMTCwgJnBJbnN0LT5uRHJjQ2hhbm5lbEdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0LT5nYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsR3JvdXBGb3JDaGFubmVsLCBOVUxMKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gKGVycik7CisKKyAgICBmb3IgKGcgPSAwOyBnIDwgcEluc3QtPm5EcmNDaGFubmVsR3JvdXBzOyBnKyspIHsKKyAgICAgIGludCBzZXQsIGJhbmRDb3VudDsKKyAgICAgIHNldCA9IHBJbnN0LT5nYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXBbZ107CisKKyAgICAgIC8qIGdldCBiYW5kQ291bnQgKi8KKyAgICAgIGlmIChwQ29lZiAhPSBOVUxMICYmIHNldCA8IHBDb2VmLT5nYWluU2V0Q291bnQpIHsKKyAgICAgICAgYmFuZENvdW50ID0gcENvZWYtPmdhaW5TZXRbc2V0XS5iYW5kQ291bnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBiYW5kQ291bnQgPSAxOworICAgICAgfQorCisgICAgICBfZGVjb2RlR2Fpbk1vZGlmaWNhdGlvbihoQnMsIHZlcnNpb24sIGJhbmRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0LT5nYWluTW9kaWZpY2F0aW9uRm9yQ2hhbm5lbEdyb3VwW2ddLCAwKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9yZWFkQ2hhbm5lbExheW91dChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX0xBWU9VVCogcENoYW4pIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworCisgIHBDaGFuLT5iYXNlQ2hhbm5lbENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKworICBpZiAocENoYW4tPmJhc2VDaGFubmVsQ291bnQgPiA4KSByZXR1cm4gREVfTk9UX09LOworCisgIHBDaGFuLT5sYXlvdXRTaWduYWxpbmdQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKworICBpZiAocENoYW4tPmxheW91dFNpZ25hbGluZ1ByZXNlbnQpIHsKKyAgICBwQ2hhbi0+ZGVmaW5lZExheW91dCA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisKKyAgICBpZiAocENoYW4tPmRlZmluZWRMYXlvdXQgPT0gMCkgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcENoYW4tPmJhc2VDaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoaSA8IDgpIHsKKyAgICAgICAgICBwQ2hhbi0+c3BlYWtlclBvc2l0aW9uW2ldID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGREtwdXNoRm9yKGhCcywgNyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIERSQ19FUlJPUiBfcmVhZERvd25taXhJbnN0cnVjdGlvbnMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX0xBWU9VVCogcENoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBET1dOTUlYX0lOU1RSVUNUSU9OUyogcERvd24pIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworCisgIHBEb3duLT5kb3dubWl4SWQgPSBGREtyZWFkQml0cyhoQnMsIDcpOworICBwRG93bi0+dGFyZ2V0Q2hhbm5lbENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgcERvd24tPnRhcmdldExheW91dCA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisgIHBEb3duLT5kb3dubWl4Q29lZmZpY2llbnRzUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisKKyAgaWYgKHBEb3duLT5kb3dubWl4Q29lZmZpY2llbnRzUHJlc2VudCkgeworICAgIGludCBuRG93bm1peENvZWZmcyA9IHBEb3duLT50YXJnZXRDaGFubmVsQ291bnQgKiBwQ2hhbi0+YmFzZUNoYW5uZWxDb3VudDsKKyAgICBpbnQgaTsKKyAgICBpZiAobkRvd25taXhDb2VmZnMgPiA4ICogOCkgcmV0dXJuIERFX05PVF9PSzsKKyAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICBwRG93bi0+YnNEb3dubWl4T2Zmc2V0ID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuRG93bm1peENvZWZmczsgaSsrKSB7CisgICAgICAgIC8qIExGRSBkb3dubWl4IGNvZWZmaWNpZW50cyBhcmUgbm90IHN1cHBvcnRlZC4gKi8KKyAgICAgICAgcERvd24tPmRvd25taXhDb2VmZmljaWVudFtpXSA9IGRvd25taXhDb2VmZltGREtyZWFkQml0cyhoQnMsIDQpXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcERvd24tPmJzRG93bm1peE9mZnNldCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbkRvd25taXhDb2VmZnM7IGkrKykgeworICAgICAgICBwRG93bi0+ZG93bm1peENvZWZmaWNpZW50W2ldID0gZG93bm1peENvZWZmVjFbRkRLcmVhZEJpdHMoaEJzLCA1KV07CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX3JlYWREcmNFeHRlbnNpb25WMShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBpbnQgZG93bm1peEluc3RydWN0aW9uc1YxUHJlc2VudDsKKyAgaW50IGRyY0NvZWZmc0FuZEluc3RydWN0aW9uc1VuaURyY1YxUHJlc2VudDsKKyAgaW50IGxvdWRFcUluc3RydWN0aW9uc1ByZXNlbnQsIGxvdWRFcUluc3RydWN0aW9uc0NvdW50OworICBpbnQgZXFQcmVzZW50LCBlcUluc3RydWN0aW9uc0NvdW50OworICBpbnQgaSwgb2Zmc2V0OworICBpbnQgZGlmZiA9IGhVbmlEcmNDb25maWctPmRpZmY7CisKKyAgZG93bm1peEluc3RydWN0aW9uc1YxUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChkb3dubWl4SW5zdHJ1Y3Rpb25zVjFQcmVzZW50ID09IDEpIHsKKyAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnRWMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgNykpOworICAgIG9mZnNldCA9IGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudFYwOworICAgIGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudCA9IGZNaW4oCisgICAgICAgIChVQ0hBUikob2Zmc2V0ICsgaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc0NvdW50VjEpLCAoVUNIQVIpNik7CisgICAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudFYxOyBpKyspIHsKKyAgICAgIERPV05NSVhfSU5TVFJVQ1RJT05TIHRtcERvd247CisgICAgICBGREttZW1jbGVhcigmdG1wRG93biwgc2l6ZW9mKERPV05NSVhfSU5TVFJVQ1RJT05TKSk7CisgICAgICBlcnIgPSBfcmVhZERvd25taXhJbnN0cnVjdGlvbnMoaEJzLCAxLCAmaFVuaURyY0NvbmZpZy0+Y2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wRG93bik7CisgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgaWYgKChvZmZzZXQgKyBpKSA+PSA2KSBjb250aW51ZTsKKyAgICAgIGlmICghZGlmZikKKyAgICAgICAgZGlmZiB8PSAoRkRLbWVtY21wKCZ0bXBEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJihoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zW29mZnNldCArIGldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihET1dOTUlYX0lOU1RSVUNUSU9OUykpICE9IDApOworICAgICAgaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc1tvZmZzZXQgKyBpXSA9IHRtcERvd247CisgICAgfQorICB9IGVsc2UgeworICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJmhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudFYxLCAwKTsKKyAgfQorCisgIGRyY0NvZWZmc0FuZEluc3RydWN0aW9uc1VuaURyY1YxUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChkcmNDb2VmZnNBbmRJbnN0cnVjdGlvbnNVbmlEcmNWMVByZXNlbnQgPT0gMSkgeworICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJmhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50VjEsCisgICAgICAgICAgICAgICAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDMpKTsKKyAgICBvZmZzZXQgPSBoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudFYwOworICAgIGhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50ID0KKyAgICAgICAgZk1pbigoVUNIQVIpKG9mZnNldCArIGhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50VjEpLAorICAgICAgICAgICAgIChVQ0hBUikyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaFVuaURyY0NvbmZpZy0+ZHJjQ29lZmZpY2llbnRzVW5pRHJjQ291bnRWMTsgaSsrKSB7CisgICAgICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMgdG1wQ29lZjsKKyAgICAgIEZES21lbWNsZWFyKCZ0bXBDb2VmLCBzaXplb2YoRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKSk7CisgICAgICBlcnIgPSBfcmVhZERyY0NvZWZmaWNpZW50c1VuaURyYyhoQnMsIDEsICZ0bXBDb2VmKTsKKyAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgICBpZiAoKG9mZnNldCArIGkpID49IDIpIGNvbnRpbnVlOworICAgICAgaWYgKCFkaWZmKQorICAgICAgICBkaWZmIHw9IChGREttZW1jbXAoJnRtcENvZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY1tvZmZzZXQgKyBpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKSkgIT0gMCk7CisgICAgICBoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNbb2Zmc2V0ICsgaV0gPSB0bXBDb2VmOworICAgIH0KKworICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJmhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50VjEsCisgICAgICAgICAgICAgICAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDYpKTsKKyAgICBvZmZzZXQgPSBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudDsKKyAgICBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudCA9CisgICAgICAgIGZNaW4oKFVDSEFSKShvZmZzZXQgKyBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudFYxKSwKKyAgICAgICAgICAgICAoVUNIQVIpMTIpOworICAgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudDsgaSsrKSB7CisgICAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMgdG1wSW5zdDsKKyAgICAgIEZES21lbWNsZWFyKCZ0bXBJbnN0LCBzaXplb2YoRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKSk7CisgICAgICBlcnIgPSBfcmVhZERyY0luc3RydWN0aW9uc1VuaURyYyhoQnMsIDEsIGhVbmlEcmNDb25maWcsICZ0bXBJbnN0KTsKKyAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgICBpZiAoKG9mZnNldCArIGkpID49IDEyKSBjb250aW51ZTsKKyAgICAgIGlmICghZGlmZikKKyAgICAgICAgZGlmZiB8PSAoRkRLbWVtY21wKCZ0bXBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJihoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbb2Zmc2V0ICsgaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQykpICE9IDApOworICAgICAgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW29mZnNldCArIGldID0gdG1wSW5zdDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZGlmZiB8PSBfY29tcEFzc2lnbigmaFVuaURyY0NvbmZpZy0+ZHJjQ29lZmZpY2llbnRzVW5pRHJjQ291bnRWMSwgMCk7CisgICAgZGlmZiB8PSBfY29tcEFzc2lnbigmaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnRWMSwgMCk7CisgIH0KKworICBsb3VkRXFJbnN0cnVjdGlvbnNQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGxvdWRFcUluc3RydWN0aW9uc1ByZXNlbnQgPT0gMSkgeworICAgIGxvdWRFcUluc3RydWN0aW9uc0NvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbG91ZEVxSW5zdHJ1Y3Rpb25zQ291bnQ7IGkrKykgeworICAgICAgX3NraXBMb3VkRXFJbnN0cnVjdGlvbnMoaEJzKTsKKyAgICB9CisgIH0KKworICBlcVByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoZXFQcmVzZW50ID09IDEpIHsKKyAgICBfc2tpcEVxQ29lZmZpY2llbnRzKGhCcyk7CisgICAgZXFJbnN0cnVjdGlvbnNDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgZm9yIChpID0gMDsgaSA8IGVxSW5zdHJ1Y3Rpb25zQ291bnQ7IGkrKykgeworICAgICAgX3NraXBFcUluc3RydWN0aW9ucyhoQnMsIGhVbmlEcmNDb25maWcpOworICAgIH0KKyAgfQorCisgIGhVbmlEcmNDb25maWctPmRpZmYgPSBkaWZmOworCisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX3JlYWRVbmlEcmNDb25maWdFeHRlbnNpb24oCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZykgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBrLCBiaXRTaXplTGVuLCBleHRTaXplQml0cywgYml0U2l6ZTsKKyAgSU5UIG5CaXRzUmVtYWluaW5nOworICBVTklfRFJDX0NPTkZJR19FWFRFTlNJT04qIHBFeHQgPSAmKGhVbmlEcmNDb25maWctPnVuaURyY0NvbmZpZ0V4dCk7CisKKyAgayA9IDA7CisgIHBFeHQtPnVuaURyY0NvbmZpZ0V4dFR5cGVba10gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICB3aGlsZSAocEV4dC0+dW5pRHJjQ29uZmlnRXh0VHlwZVtrXSAhPSBVTklEUkNDT05GRVhUX1RFUk0pIHsKKyAgICBpZiAoayA+PSAoOCAtIDEpKSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgIGJpdFNpemVMZW4gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgIGV4dFNpemVCaXRzID0gYml0U2l6ZUxlbiArIDQ7CisKKyAgICBiaXRTaXplID0gRkRLcmVhZEJpdHMoaEJzLCBleHRTaXplQml0cyk7CisgICAgcEV4dC0+ZXh0Qml0U2l6ZVtrXSA9IGJpdFNpemUgKyAxOworICAgIG5CaXRzUmVtYWluaW5nID0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKKworICAgIHN3aXRjaCAocEV4dC0+dW5pRHJjQ29uZmlnRXh0VHlwZVtrXSkgeworICAgICAgY2FzZSBVTklEUkNDT05GRVhUX1YxOgorICAgICAgICBlcnIgPSBfcmVhZERyY0V4dGVuc2lvblYxKGhCcywgaFVuaURyY0NvbmZpZyk7CisgICAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgICAgIGlmIChuQml0c1JlbWFpbmluZyAhPQorICAgICAgICAgICAgKChJTlQpcEV4dC0+ZXh0Qml0U2l6ZVtrXSArIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykpKQorICAgICAgICAgIHJldHVybiBERV9OT1RfT0s7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVTklEUkNDT05GRVhUX1BBUkFNX0RSQzoKKyAgICAgIC8qIGFkZCBmdXR1cmUgZXh0ZW5zaW9ucyBoZXJlICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBGREtwdXNoRm9yKGhCcywgcEV4dC0+ZXh0Qml0U2l6ZVtrXSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBrKys7CisgICAgcEV4dC0+dW5pRHJjQ29uZmlnRXh0VHlwZVtrXSA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitEUkNfRVJST1IKK2RyY0RlY19yZWFkVW5pRHJjQ29uZmlnKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGksIGRpZmYgPSAwOworICBpbnQgZHJjRGVzY3JpcHRpb25CYXNpY1ByZXNlbnQsIGRyY0NvZWZmaWNpZW50c0Jhc2ljQ291bnQsCisgICAgICBkcmNJbnN0cnVjdGlvbnNCYXNpY0NvdW50OworICBDSEFOTkVMX0xBWU9VVCB0bXBDaGFuOworICBGREttZW1jbGVhcigmdG1wQ2hhbiwgc2l6ZW9mKENIQU5ORUxfTEFZT1VUKSk7CisgIGlmIChoVW5pRHJjQ29uZmlnID09IE5VTEwpIHJldHVybiBERV9OT1RfT0s7CisKKyAgZGlmZiB8PSBfY29tcEFzc2lnbigmaFVuaURyY0NvbmZpZy0+c2FtcGxlUmF0ZVByZXNlbnQsIEZES3JlYWRCaXRzKGhCcywgMSkpOworCisgIGlmIChoVW5pRHJjQ29uZmlnLT5zYW1wbGVSYXRlUHJlc2VudCA9PSAxKSB7CisgICAgZGlmZiB8PQorICAgICAgICBfY29tcEFzc2lnbigmaFVuaURyY0NvbmZpZy0+c2FtcGxlUmF0ZSwgRkRLcmVhZEJpdHMoaEJzLCAxOCkgKyAxMDAwKTsKKyAgfQorCisgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJmhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudFYwLAorICAgICAgICAgICAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgNykpOworCisgIGRyY0Rlc2NyaXB0aW9uQmFzaWNQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGRyY0Rlc2NyaXB0aW9uQmFzaWNQcmVzZW50ID09IDEpIHsKKyAgICBkcmNDb2VmZmljaWVudHNCYXNpY0NvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICBkcmNJbnN0cnVjdGlvbnNCYXNpY0NvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgfSBlbHNlIHsKKyAgICBkcmNDb2VmZmljaWVudHNCYXNpY0NvdW50ID0gMDsKKyAgICBkcmNJbnN0cnVjdGlvbnNCYXNpY0NvdW50ID0gMDsKKyAgfQorCisgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJmhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50VjAsCisgICAgICAgICAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCAzKSk7CisgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJmhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50VjAsCisgICAgICAgICAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCA2KSk7CisKKyAgZXJyID0gX3JlYWRDaGFubmVsTGF5b3V0KGhCcywgJnRtcENoYW4pOworICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgIGlmICghZGlmZikKKyAgICBkaWZmIHw9IChGREttZW1jbXAoJnRtcENoYW4sICZoVW5pRHJjQ29uZmlnLT5jaGFubmVsTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ0hBTk5FTF9MQVlPVVQpKSAhPSAwKTsKKyAgaFVuaURyY0NvbmZpZy0+Y2hhbm5lbExheW91dCA9IHRtcENoYW47CisKKyAgaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc0NvdW50ID0KKyAgICAgIGZNaW4oaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc0NvdW50VjAsIChVQ0hBUik2KTsKKyAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudFYwOyBpKyspIHsKKyAgICBET1dOTUlYX0lOU1RSVUNUSU9OUyB0bXBEb3duOworICAgIEZES21lbWNsZWFyKCZ0bXBEb3duLCBzaXplb2YoRE9XTk1JWF9JTlNUUlVDVElPTlMpKTsKKyAgICBlcnIgPSBfcmVhZERvd25taXhJbnN0cnVjdGlvbnMoaEJzLCAwLCAmaFVuaURyY0NvbmZpZy0+Y2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcERvd24pOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgaWYgKGkgPj0gNikgY29udGludWU7CisgICAgaWYgKCFkaWZmKQorICAgICAgZGlmZiB8PSAoRkRLbWVtY21wKCZ0bXBEb3duLCAmKGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihET1dOTUlYX0lOU1RSVUNUSU9OUykpICE9IDApOworICAgIGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNbaV0gPSB0bXBEb3duOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGRyY0NvZWZmaWNpZW50c0Jhc2ljQ291bnQ7IGkrKykgeworICAgIF9za2lwRHJjQ29lZmZpY2llbnRzQmFzaWMoaEJzKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgZHJjSW5zdHJ1Y3Rpb25zQmFzaWNDb3VudDsgaSsrKSB7CisgICAgX3NraXBEcmNJbnN0cnVjdGlvbnNCYXNpYyhoQnMpOworICB9CisKKyAgaFVuaURyY0NvbmZpZy0+ZHJjQ29lZmZpY2llbnRzVW5pRHJjQ291bnQgPQorICAgICAgZk1pbihoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudFYwLCAoVUNIQVIpMik7CisgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudFYwOyBpKyspIHsKKyAgICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMgdG1wQ29lZjsKKyAgICBGREttZW1jbGVhcigmdG1wQ29lZiwgc2l6ZW9mKERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQykpOworICAgIGVyciA9IF9yZWFkRHJjQ29lZmZpY2llbnRzVW5pRHJjKGhCcywgMCwgJnRtcENvZWYpOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgaWYgKGkgPj0gMikgY29udGludWU7CisgICAgaWYgKCFkaWZmKQorICAgICAgZGlmZiB8PSAoRkRLbWVtY21wKCZ0bXBDb2VmLCAmKGhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQykpICE9IDApOworICAgIGhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY1tpXSA9IHRtcENvZWY7CisgIH0KKworICBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudCA9CisgICAgICBmTWluKGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50VjAsIChVQ0hBUikxMik7CisgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudFYwOyBpKyspIHsKKyAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMgdG1wSW5zdDsKKyAgICBGREttZW1jbGVhcigmdG1wSW5zdCwgc2l6ZW9mKERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQykpOworICAgIGVyciA9IF9yZWFkRHJjSW5zdHJ1Y3Rpb25zVW5pRHJjKGhCcywgMCwgaFVuaURyY0NvbmZpZywgJnRtcEluc3QpOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgaWYgKGkgPj0gMTIpIGNvbnRpbnVlOworICAgIGlmICghZGlmZikKKyAgICAgIGRpZmYgfD0gKEZES21lbWNtcCgmdG1wSW5zdCwgJihoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMpKSAhPSAwKTsKKyAgICBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0gPSB0bXBJbnN0OworICB9CisKKyAgZGlmZiB8PQorICAgICAgX2NvbXBBc3NpZ24oJmhVbmlEcmNDb25maWctPnVuaURyY0NvbmZpZ0V4dFByZXNlbnQsIEZES3JlYWRCaXRzKGhCcywgMSkpOworICBoVW5pRHJjQ29uZmlnLT5kaWZmID0gZGlmZjsKKworICBpZiAoaFVuaURyY0NvbmZpZy0+dW5pRHJjQ29uZmlnRXh0UHJlc2VudCA9PSAxKSB7CisgICAgZXJyID0gX3JlYWRVbmlEcmNDb25maWdFeHRlbnNpb24oaEJzLCBoVW5pRHJjQ29uZmlnKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKiovCisvKiBsb3VkbmVzc0luZm9TZXQgKi8KKy8qKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgRFJDX0VSUk9SIF9kZWNvZGVNZXRob2RWYWx1ZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBtZXRob2REZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIG1ldGhvZFZhbHVlLCBJTlQgaXNCb3gpIHsKKyAgaW50IHRtcDsKKyAgRklYUF9EQkwgdmFsOworICBzd2l0Y2ggKG1ldGhvZERlZmluaXRpb24pIHsKKyAgICBjYXNlIE1EX1VOS05PV05fT1RIRVI6CisgICAgY2FzZSBNRF9QUk9HUkFNX0xPVURORVNTOgorICAgIGNhc2UgTURfQU5DSE9SX0xPVURORVNTOgorICAgIGNhc2UgTURfTUFYX09GX0xPVURORVNTX1JBTkdFOgorICAgIGNhc2UgTURfTU9NRU5UQVJZX0xPVURORVNTX01BWDoKKyAgICBjYXNlIE1EX1NIT1JUX1RFUk1fTE9VRE5FU1NfTUFYOgorICAgICAgdG1wID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKKyAgICAgIHZhbCA9IEZMMkZYQ09OU1RfREJMKC01Ny43NWYgLyAoZmxvYXQpKDEgPDwgNykpICsKKyAgICAgICAgICAgIChGSVhQX0RCTCkoCisgICAgICAgICAgICAgICAgdG1wIDw8IChERlJBQ1RfQklUUyAtIDEgLSAyIC0gNykpOyAvKiAtNTcuNzUgKyB0bXAgKiAwLjI1OyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBNRF9MT1VETkVTU19SQU5HRToKKyAgICAgIHRtcCA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICBpZiAodG1wID09IDApCisgICAgICAgIHZhbCA9IChGSVhQX0RCTCkwOworICAgICAgZWxzZSBpZiAodG1wIDw9IDEyOCkKKyAgICAgICAgdmFsID0gKEZJWFBfREJMKSh0bXAgPDwgKERGUkFDVF9CSVRTIC0gMSAtIDIgLSA3KSk7IC8qIHRtcCAqIDAuMjU7ICovCisgICAgICBlbHNlIGlmICh0bXAgPD0gMjA0KSB7CisgICAgICAgIHZhbCA9IChGSVhQX0RCTCkodG1wIDw8IChERlJBQ1RfQklUUyAtIDEgLSAxIC0gNykpIC0KKyAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMzIuMGYgLyAoZmxvYXQpKDEgPDwgNykpOyAvKiAwLjUgKiB0bXAgLSAzMi4wZjsgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGRvd25zY2FsZSBieSAxIG1vcmUgYml0IHRvIHByZXZlbnQgb3ZlcmZsb3cgYXQgaW50ZXJtZWRpYXRlIHJlc3VsdCAqLworICAgICAgICB2YWwgPSAoRklYUF9EQkwpKHRtcCA8PCAoREZSQUNUX0JJVFMgLSAxIC0gOCkpIC0KKyAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTM0LjBmIC8gKGZsb2F0KSgxIDw8IDgpKTsgLyogdG1wIC0gMTM0LjA7ICovCisgICAgICAgIHZhbCA8PD0gMTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTURfTUlYSU5HX0xFVkVMOgorICAgICAgdG1wID0gRkRLcmVhZEJpdHMoaEJzLCBpc0JveCA/IDggOiA1KTsKKyAgICAgIHZhbCA9IChGSVhQX0RCTCkodG1wIDw8IChERlJBQ1RfQklUUyAtIDEgLSA3KSkgKworICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoODAuMGYgLyAoZmxvYXQpKDEgPDwgNykpOyAvKiB0bXAgKyA4MC4wOyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBNRF9ST09NX1RZUEU6CisgICAgICB0bXAgPSBGREtyZWFkQml0cyhoQnMsIGlzQm94ID8gOCA6IDIpOworICAgICAgdmFsID0gKEZJWFBfREJMKSh0bXAgPDwgKERGUkFDVF9CSVRTIC0gMSAtIDcpKTsgLyogdG1wOyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBNRF9TSE9SVF9URVJNX0xPVURORVNTOgorICAgICAgdG1wID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKKyAgICAgIHZhbCA9IEZMMkZYQ09OU1RfREJMKC0xMTYuMGYgLyAoZmxvYXQpKDEgPDwgNykpICsKKyAgICAgICAgICAgIChGSVhQX0RCTCkoCisgICAgICAgICAgICAgICAgdG1wIDw8IChERlJBQ1RfQklUUyAtIDEgLSAxIC0gNykpOyAvKiAtMTE2LjAgKyB0bXAgKiAwLjU7ICovCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIERFX05PVF9PSzsgLyogaW52YWxpZCBtZXRob2REZWZpbml0aW9uIHZhbHVlICovCisgIH0KKyAgKm1ldGhvZFZhbHVlID0gdmFsOworICByZXR1cm4gREVfT0s7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX3JlYWRMb3VkbmVzc01lYXN1cmVtZW50KEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPVURORVNTX01FQVNVUkVNRU5UKiBwTWVhcykgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisKKyAgcE1lYXMtPm1ldGhvZERlZmluaXRpb24gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICBlcnIgPQorICAgICAgX2RlY29kZU1ldGhvZFZhbHVlKGhCcywgcE1lYXMtPm1ldGhvZERlZmluaXRpb24sICZwTWVhcy0+bWV0aG9kVmFsdWUsIDApOworICBpZiAoZXJyKSByZXR1cm4gZXJyOworICBwTWVhcy0+bWVhc3VyZW1lbnRTeXN0ZW0gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICBwTWVhcy0+cmVsaWFiaWxpdHkgPSBGREtyZWFkQml0cyhoQnMsIDIpOworCisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX3JlYWRMb3VkbmVzc0luZm8oSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBjb25zdCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9VRE5FU1NfSU5GTyogbG91ZG5lc3NJbmZvKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGJzU2FtcGxlUGVha0xldmVsLCBic1RydWVQZWFrTGV2ZWwsIGk7CisgIGludCBtZWFzdXJlbWVudENvdW50OworCisgIGxvdWRuZXNzSW5mby0+ZHJjU2V0SWQgPSBGREtyZWFkQml0cyhoQnMsIDYpOworICBpZiAodmVyc2lvbiA+PSAxKSB7CisgICAgbG91ZG5lc3NJbmZvLT5lcVNldElkID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgfSBlbHNlIHsKKyAgICBsb3VkbmVzc0luZm8tPmVxU2V0SWQgPSAwOworICB9CisgIGxvdWRuZXNzSW5mby0+ZG93bm1peElkID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKworICBsb3VkbmVzc0luZm8tPnNhbXBsZVBlYWtMZXZlbFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAobG91ZG5lc3NJbmZvLT5zYW1wbGVQZWFrTGV2ZWxQcmVzZW50KSB7CisgICAgYnNTYW1wbGVQZWFrTGV2ZWwgPSBGREtyZWFkQml0cyhoQnMsIDEyKTsKKyAgICBpZiAoYnNTYW1wbGVQZWFrTGV2ZWwgPT0gMCkgeworICAgICAgbG91ZG5lc3NJbmZvLT5zYW1wbGVQZWFrTGV2ZWxQcmVzZW50ID0gMDsKKyAgICAgIGxvdWRuZXNzSW5mby0+c2FtcGxlUGVha0xldmVsID0gKEZJWFBfREJMKTA7CisgICAgfSBlbHNlIHsgLyogMjAuMCAtIGJzU2FtcGxlUGVha0xldmVsICogMC4wMzEyNTsgKi8KKyAgICAgIGxvdWRuZXNzSW5mby0+c2FtcGxlUGVha0xldmVsID0KKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyMC4wZiAvIChmbG9hdCkoMSA8PCA3KSkgLQorICAgICAgICAgIChGSVhQX0RCTCkoYnNTYW1wbGVQZWFrTGV2ZWwgPDwgKERGUkFDVF9CSVRTIC0gMSAtIDUgLSA3KSk7CisgICAgfQorICB9CisKKyAgbG91ZG5lc3NJbmZvLT50cnVlUGVha0xldmVsUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChsb3VkbmVzc0luZm8tPnRydWVQZWFrTGV2ZWxQcmVzZW50KSB7CisgICAgYnNUcnVlUGVha0xldmVsID0gRkRLcmVhZEJpdHMoaEJzLCAxMik7CisgICAgaWYgKGJzVHJ1ZVBlYWtMZXZlbCA9PSAwKSB7CisgICAgICBsb3VkbmVzc0luZm8tPnRydWVQZWFrTGV2ZWxQcmVzZW50ID0gMDsKKyAgICAgIGxvdWRuZXNzSW5mby0+dHJ1ZVBlYWtMZXZlbCA9IChGSVhQX0RCTCkwOworICAgIH0gZWxzZSB7CisgICAgICBsb3VkbmVzc0luZm8tPnRydWVQZWFrTGV2ZWwgPQorICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDIwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSAtCisgICAgICAgICAgKEZJWFBfREJMKShic1RydWVQZWFrTGV2ZWwgPDwgKERGUkFDVF9CSVRTIC0gMSAtIDUgLSA3KSk7CisgICAgfQorICAgIGxvdWRuZXNzSW5mby0+dHJ1ZVBlYWtMZXZlbE1lYXN1cmVtZW50U3lzdGVtID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICBsb3VkbmVzc0luZm8tPnRydWVQZWFrTGV2ZWxSZWxpYWJpbGl0eSA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgIH0KKworICBtZWFzdXJlbWVudENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgbG91ZG5lc3NJbmZvLT5tZWFzdXJlbWVudENvdW50ID0gZk1pbihtZWFzdXJlbWVudENvdW50LCA4KTsKKyAgZm9yIChpID0gMDsgaSA8IG1lYXN1cmVtZW50Q291bnQ7IGkrKykgeworICAgIExPVURORVNTX01FQVNVUkVNRU5UIHRtcE1lYXM7CisgICAgRkRLbWVtY2xlYXIoJnRtcE1lYXMsIHNpemVvZihMT1VETkVTU19NRUFTVVJFTUVOVCkpOworICAgIGVyciA9IF9yZWFkTG91ZG5lc3NNZWFzdXJlbWVudChoQnMsICZ0bXBNZWFzKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgIGlmIChpID49IDgpIGNvbnRpbnVlOworICAgIGxvdWRuZXNzSW5mby0+bG91ZG5lc3NNZWFzdXJlbWVudFtpXSA9IHRtcE1lYXM7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9yZWFkTG91ZG5lc3NJbmZvU2V0RXh0RXEoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCkgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBpLCBvZmZzZXQ7CisgIGludCBkaWZmID0gaExvdWRuZXNzSW5mb1NldC0+ZGlmZjsKKworICBkaWZmIHw9IF9jb21wQXNzaWduKCZoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50VjEsCisgICAgICAgICAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCA2KSk7CisgIGRpZmYgfD0KKyAgICAgIF9jb21wQXNzaWduKCZoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9Db3VudFYxLCBGREtyZWFkQml0cyhoQnMsIDYpKTsKKworICBvZmZzZXQgPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50VjA7CisgIGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtQ291bnQgPSBmTWluKAorICAgICAgKFVDSEFSKShvZmZzZXQgKyBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50VjEpLCAoVUNIQVIpMTIpOworICBmb3IgKGkgPSAwOyBpIDwgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudFYxOyBpKyspIHsKKyAgICBMT1VETkVTU19JTkZPIHRtcExvdWQ7CisgICAgRkRLbWVtY2xlYXIoJnRtcExvdWQsIHNpemVvZihMT1VETkVTU19JTkZPKSk7CisgICAgZXJyID0gX3JlYWRMb3VkbmVzc0luZm8oaEJzLCAxLCAmdG1wTG91ZCk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICBpZiAoKG9mZnNldCArIGkpID49IDEyKSBjb250aW51ZTsKKyAgICBpZiAoIWRpZmYpCisgICAgICBkaWZmIHw9IChGREttZW1jbXAoJnRtcExvdWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJihoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bVtvZmZzZXQgKyBpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExPVURORVNTX0lORk8pKSAhPSAwKTsKKyAgICBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bVtvZmZzZXQgKyBpXSA9IHRtcExvdWQ7CisgIH0KKworICBvZmZzZXQgPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9Db3VudFYwOworICBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9Db3VudCA9CisgICAgICBmTWluKChVQ0hBUikob2Zmc2V0ICsgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQ291bnRWMSksIChVQ0hBUikxMik7CisgIGZvciAoaSA9IDA7IGkgPCBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9Db3VudFYxOyBpKyspIHsKKyAgICBMT1VETkVTU19JTkZPIHRtcExvdWQ7CisgICAgRkRLbWVtY2xlYXIoJnRtcExvdWQsIHNpemVvZihMT1VETkVTU19JTkZPKSk7CisgICAgZXJyID0gX3JlYWRMb3VkbmVzc0luZm8oaEJzLCAxLCAmdG1wTG91ZCk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICBpZiAoKG9mZnNldCArIGkpID49IDEyKSBjb250aW51ZTsKKyAgICBpZiAoIWRpZmYpCisgICAgICBkaWZmIHw9CisgICAgICAgICAgKEZES21lbWNtcCgmdG1wTG91ZCwgJihoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9bb2Zmc2V0ICsgaV0pLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExPVURORVNTX0lORk8pKSAhPSAwKTsKKyAgICBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9bb2Zmc2V0ICsgaV0gPSB0bXBMb3VkOworICB9CisgIGhMb3VkbmVzc0luZm9TZXQtPmRpZmYgPSBkaWZmOworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9yZWFkTG91ZG5lc3NJbmZvU2V0RXh0ZW5zaW9uKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBpbnQgaywgYml0U2l6ZUxlbiwgZXh0U2l6ZUJpdHMsIGJpdFNpemU7CisgIElOVCBuQml0c1JlbWFpbmluZzsKKyAgTE9VRE5FU1NfSU5GT19TRVRfRVhURU5TSU9OKiBwRXh0ID0gJihoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9TZXRFeHQpOworCisgIGsgPSAwOworICBwRXh0LT5sb3VkbmVzc0luZm9TZXRFeHRUeXBlW2tdID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgd2hpbGUgKHBFeHQtPmxvdWRuZXNzSW5mb1NldEV4dFR5cGVba10gIT0gVU5JRFJDTE9VREVYVF9URVJNKSB7CisgICAgaWYgKGsgPj0gKDggLSAxKSkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICBiaXRTaXplTGVuID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICBleHRTaXplQml0cyA9IGJpdFNpemVMZW4gKyA0OworCisgICAgYml0U2l6ZSA9IEZES3JlYWRCaXRzKGhCcywgZXh0U2l6ZUJpdHMpOworICAgIHBFeHQtPmV4dEJpdFNpemVba10gPSBiaXRTaXplICsgMTsKKyAgICBuQml0c1JlbWFpbmluZyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgICBzd2l0Y2ggKHBFeHQtPmxvdWRuZXNzSW5mb1NldEV4dFR5cGVba10pIHsKKyAgICAgIGNhc2UgVU5JRFJDTE9VREVYVF9FUToKKyAgICAgICAgZXJyID0gX3JlYWRMb3VkbmVzc0luZm9TZXRFeHRFcShoQnMsIGhMb3VkbmVzc0luZm9TZXQpOworICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgICBpZiAobkJpdHNSZW1haW5pbmcgIT0KKyAgICAgICAgICAgICgoSU5UKXBFeHQtPmV4dEJpdFNpemVba10gKyAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpKSkKKyAgICAgICAgICByZXR1cm4gREVfTk9UX09LOworICAgICAgICBicmVhazsKKyAgICAgIC8qIGFkZCBmdXR1cmUgZXh0ZW5zaW9ucyBoZXJlICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBGREtwdXNoRm9yKGhCcywgcEV4dC0+ZXh0Qml0U2l6ZVtrXSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBrKys7CisgICAgcEV4dC0+bG91ZG5lc3NJbmZvU2V0RXh0VHlwZVtrXSA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKiBQYXJzZXIgZm9yIGxvdW5kZXNzSW5mb1NldCgpICovCitEUkNfRVJST1IKK2RyY0RlY19yZWFkTG91ZG5lc3NJbmZvU2V0KEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0KSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGksIGRpZmYgPSAwOworICBpZiAoaExvdWRuZXNzSW5mb1NldCA9PSBOVUxMKSByZXR1cm4gREVfTk9UX09LOworCisgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJmhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtQ291bnRWMCwKKyAgICAgICAgICAgICAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDYpKTsKKyAgZGlmZiB8PQorICAgICAgX2NvbXBBc3NpZ24oJmhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0NvdW50VjAsIEZES3JlYWRCaXRzKGhCcywgNikpOworCisgIGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtQ291bnQgPQorICAgICAgZk1pbihoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50VjAsIChVQ0hBUikxMik7CisgIGZvciAoaSA9IDA7IGkgPCBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50VjA7IGkrKykgeworICAgIExPVURORVNTX0lORk8gdG1wTG91ZDsKKyAgICBGREttZW1jbGVhcigmdG1wTG91ZCwgc2l6ZW9mKExPVURORVNTX0lORk8pKTsKKyAgICBlcnIgPSBfcmVhZExvdWRuZXNzSW5mbyhoQnMsIDAsICZ0bXBMb3VkKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgIGlmIChpID49IDEyKSBjb250aW51ZTsKKyAgICBpZiAoIWRpZmYpCisgICAgICBkaWZmIHw9IChGREttZW1jbXAoJnRtcExvdWQsICYoaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1baV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMT1VETkVTU19JTkZPKSkgIT0gMCk7CisgICAgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1baV0gPSB0bXBMb3VkOworICB9CisKKyAgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQ291bnQgPQorICAgICAgZk1pbihoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9Db3VudFYwLCAoVUNIQVIpMTIpOworICBmb3IgKGkgPSAwOyBpIDwgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQ291bnRWMDsgaSsrKSB7CisgICAgTE9VRE5FU1NfSU5GTyB0bXBMb3VkOworICAgIEZES21lbWNsZWFyKCZ0bXBMb3VkLCBzaXplb2YoTE9VRE5FU1NfSU5GTykpOworICAgIGVyciA9IF9yZWFkTG91ZG5lc3NJbmZvKGhCcywgMCwgJnRtcExvdWQpOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgaWYgKGkgPj0gMTIpIGNvbnRpbnVlOworICAgIGlmICghZGlmZikKKyAgICAgIGRpZmYgfD0gKEZES21lbWNtcCgmdG1wTG91ZCwgJihoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9baV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMT1VETkVTU19JTkZPKSkgIT0gMCk7CisgICAgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvW2ldID0gdG1wTG91ZDsKKyAgfQorCisgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJmhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb1NldEV4dFByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCAxKSk7CisgIGhMb3VkbmVzc0luZm9TZXQtPmRpZmYgPSBkaWZmOworCisgIGlmIChoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9TZXRFeHRQcmVzZW50KSB7CisgICAgZXJyID0gX3JlYWRMb3VkbmVzc0luZm9TZXRFeHRlbnNpb24oaEJzLCBoTG91ZG5lc3NJbmZvU2V0KTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3JlYWRlci5oIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfcmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiOWI1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3JlYWRlci5oCkBAIC0wLDAgKzEsMTMwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRFJDREVDX1JFQURFUl9ICisjZGVmaW5lIERSQ0RFQ19SRUFERVJfSAorCisjaW5jbHVkZSAiZHJjRGVjb2Rlci5oIgorI2luY2x1ZGUgImRyY0RlY190eXBlcy5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworRFJDX0VSUk9SCitkcmNEZWNfcmVhZFVuaURyYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVTaXplLCBjb25zdCBpbnQgZGVsdGFUbWluRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0dBSU4gaFVuaURyY0dhaW4pOworCitEUkNfRVJST1IKK2RyY0RlY19yZWFkVW5pRHJjR2FpbihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsIGNvbnN0IGludCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRlbHRhVG1pbkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfR0FJTiBoVW5pRHJjR2Fpbik7CisKK0RSQ19FUlJPUgorZHJjRGVjX3JlYWRVbmlEcmNDb25maWcoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcpOworCitEUkNfRVJST1IKK2RyY0RlY19yZWFkTG91ZG5lc3NJbmZvU2V0KEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJEUkNkZWMvc3JjL2RyY0RlY19yb20uY3BwIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfcm9tLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjg5Njg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfcm9tLmNwcApAQCAtMCwwICsxLDMyMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJjRGVjX3R5cGVzLmgiCisjaW5jbHVkZSAiZHJjRGVjX3JvbS5oIgorCitjb25zdCBTQ0hBUiBkZWx0YUdhaW5fY29kaW5nUHJvZmlsZV8wXzFfaHVmZm1hblsyNF1bMl0gPSB7CisgICAgezEsIDJ9LCAgICB7MywgNH0sICAgICB7LTYzLCAtNjV9LCB7NSwgLTY2fSwgICB7LTY0LCA2fSwgICB7LTgwLCA3fSwKKyAgICB7OCwgOX0sICAgIHstNjgsIDEwfSwgIHsxMSwgMTJ9LCAgIHstNTYsIC02N30sIHstNjEsIDEzfSwgIHstNjIsIC02OX0sCisgICAgezE0LCAxNX0sICB7MTYsIC03Mn0sICB7LTcxLCAxN30sICB7LTcwLCAtNjB9LCB7MTgsIC01OX0sICB7MTksIDIwfSwKKyAgICB7MjEsIC03OX0sIHstNTcsIC03M30sIHsyMiwgLTU4fSwgIHstNzYsIDIzfSwgIHstNzUsIC03NH0sIHstNzgsIC03N319OworCitjb25zdCBTQ0hBUiBkZWx0YUdhaW5fY29kaW5nUHJvZmlsZV8yX2h1ZmZtYW5bNDhdWzJdID0geworICAgIHsxLCAyfSwgICAgIHszLCA0fSwgICAgIHs1LCA2fSwgICAgIHs3LCA4fSwgICAgIHs5LCAxMH0sICAgIHsxMSwgMTJ9LAorICAgIHsxMywgLTY1fSwgIHsxNCwgLTY0fSwgIHsxNSwgLTY2fSwgIHsxNiwgLTY3fSwgIHsxNywgMTh9LCAgIHsxOSwgLTY4fSwKKyAgICB7MjAsIC02M30sICB7LTY5LCAyMX0sICB7LTU5LCAyMn0sICB7LTYxLCAtNjJ9LCB7LTYwLCAyM30sICB7MjQsIC01OH0sCisgICAgey03MCwgLTU3fSwgey01NiwgLTcxfSwgezI1LCAyNn0sICAgezI3LCAtNTV9LCAgey03MiwgMjh9LCAgey01NCwgMjl9LAorICAgIHstNTMsIDMwfSwgIHstNzMsIC01Mn0sIHszMSwgLTc0fSwgIHszMiwgMzN9LCAgIHstNzUsIDM0fSwgIHstNzYsIDM1fSwKKyAgICB7LTUxLCAzNn0sICB7LTc4LCAzN30sICB7LTc3LCAzOH0sICB7LTk2LCAzOX0sICB7LTQ4LCA0MH0sICB7LTUwLCAtNzl9LAorICAgIHs0MSwgNDJ9LCAgIHstODAsIC04MX0sIHstODIsIDQzfSwgIHs0NCwgLTQ5fSwgIHs0NSwgLTg0fSwgIHstODMsIC04OX0sCisgICAgey04NiwgNDZ9LCAgey05MCwgLTg1fSwgey05MSwgLTkzfSwgey05MiwgNDd9LCAgey04OCwgLTg3fSwgey05NSwgLTk0fX07CisKK2NvbnN0IEZJWFBfU0dMIHNsb3BlU3RlZXBuZXNzW10gPSB7RkwyRlhDT05TVF9TR0woLTMuMDUxOGYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgtMS4yMjA3ZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjQ4ODNmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woLTAuMTk1M2YgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgtMC4wNzgxZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjAzMTJmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woLTAuMDA1ZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjAwNWYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjAzMTJmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMC4wNzgxZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKDAuMTk1M2YgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjQ4ODNmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMS4yMjA3ZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKDMuMDUxOGYgLyAoZmxvYXQpKDEgPDwgMikpfTsKKworY29uc3QgU0NIQVIgc2xvcGVTdGVlcG5lc3NfaHVmZm1hblsxNF1bMl0gPSB7CisgICAgezEsIC01N30sICB7LTU4LCAyfSwgICB7MywgNH0sICAgIHs1LCA2fSwgICAgezcsIC01Nn0sCisgICAgezgsIC02MH0sICB7LTYxLCAtNTV9LCB7OSwgLTU5fSwgIHsxMCwgLTU0fSwgey02NCwgMTF9LAorICAgIHstNTEsIDEyfSwgey02MiwgLTUwfSwgey02MywgMTN9LCB7LTUyLCAtNTN9fTsKKworY29uc3QgRklYUF9EQkwgZG93bm1peENvZWZmW10gPSB7CisgICAgRkwyRlhDT05TVF9EQkwoMS4wMDAwMDAwMDAwIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk0NDA2MDg3NjMgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODkxMjUwOTM4MSAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC44NDEzOTUxNDE2IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc5NDMyODIzNDcgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzQ5ODk0MjA5MyAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MDc5NDU3ODQ0IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY2ODM0MzkxNzYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjMwOTU3MzQ0NSAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41OTU2NjIxNDM1IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU2MjM0MTMyNTIgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTMwODg0NDQ0MiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MDExODcyMzM2IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQyMTY5NjUwMzQgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMzU0ODEzMzg5MiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDAwMDAwIC8gKGZsb2F0KSgxIDw8IDIpKX07CisKK2NvbnN0IEZJWFBfREJMIGRvd25taXhDb2VmZlYxW10gPSB7CisgICAgRkwyRlhDT05TVF9EQkwoMy4xNjIyNzc2NjAyIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgxLjk5NTI2MjMxNTAgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDEuNjc4ODA0MDE4MSAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMS40MTI1Mzc1NDQ2IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgxLjE4ODUwMjIyNzQgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDEuMDAwMDAwMDAwMCAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NDQwNjA4NzYzIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg5MTI1MDkzODEgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODQxMzk1MTQxNiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC43OTQzMjgyMzQ3IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc0OTg5NDIwOTMgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzA3OTQ1Nzg0NCAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NjgzNDM5MTc2IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYzMDk1NzM0NDUgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTk1NjYyMTQzNSAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NjIzNDEzMjUyIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUzMDg4NDQ0NDIgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTAxMTg3MjMzNiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NzMxNTEyNTkwIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ0NjY4MzU5MjIgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDIxNjk2NTAzNCAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC4zOTgxMDcxNzA2IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjM1NDgxMzM4OTIgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMzE2MjI3NzY2MCAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC4yODE4MzgyOTMxIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjI1MTE4ODY0MzIgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMTc3ODI3OTQxMCAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC4xMDAwMDAwMDAwIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjA1NjIzNDEzMjUgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMDMxNjIyNzc2NiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC4wMTAwMDAwMDAwIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMDAwMDAgLyAoZmxvYXQpKDEgPDwgMikpfTsKKworY29uc3QgQ1VTVE9NX0RSQ19DSEFSX1NJR01PSUQgY2ljcERyY0NoYXJTaWdtb2lkTGVmdFtdID0geworICAgIHtGTDJGWENPTlNUX1NHTCgzMi4wZiAvIChmbG9hdCkoMSA8PCA2KSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICBGTDJGWENPTlNUX1NHTCg5LjBmIC8gKGZsb2F0KSgxIDw8IDUpKSwgMH0sIC8qIDEgKi8KKyAgICB7RkwyRlhDT05TVF9TR0woMzIuMGYgLyAoZmxvYXQpKDEgPDwgNikpLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjJmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woOS4wZiAvIChmbG9hdCkoMSA8PCA1KSksIDB9LCAvKiAyICovCisgICAge0ZMMkZYQ09OU1RfU0dMKDMyLjBmIC8gKGZsb2F0KSgxIDw8IDYpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40ZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDkuMGYgLyAoZmxvYXQpKDEgPDwgNSkpLCAwfSwgLyogMyAqLworICAgIHtGTDJGWENPTlNUX1NHTCgzMi4wZiAvIChmbG9hdCkoMSA8PCA2KSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNmYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICBGTDJGWENPTlNUX1NHTCg5LjBmIC8gKGZsb2F0KSgxIDw8IDUpKSwgMH0sIC8qIDQgKi8KKyAgICB7RkwyRlhDT05TVF9TR0woMzIuMGYgLyAoZmxvYXQpKDEgPDwgNikpLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjhmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woNi4wZiAvIChmbG9hdCkoMSA8PCA1KSksIDB9LCAvKiA1ICovCisgICAge0ZMMkZYQ09OU1RfU0dMKDMyLjBmIC8gKGZsb2F0KSgxIDw8IDYpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMS4wZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDUuMGYgLyAoZmxvYXQpKDEgPDwgNSkpLCAwfSwgLyogNiAqLworfTsKKworY29uc3QgQ1VTVE9NX0RSQ19DSEFSX1NJR01PSUQgY2ljcERyY0NoYXJTaWdtb2lkUmlnaHRbXSA9IHsKKyAgICB7RkwyRlhDT05TVF9TR0woLTMyLjBmIC8gKGZsb2F0KSgxIDw8IDYpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDEyLjBmIC8gKGZsb2F0KSgxIDw8IDUpKSwgMH0sIC8qIDEgKi8KKyAgICB7RkwyRlhDT05TVF9TR0woLTMyLjBmIC8gKGZsb2F0KSgxIDw8IDYpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDEyLjBmIC8gKGZsb2F0KSgxIDw8IDUpKSwgMH0sIC8qIDIgKi8KKyAgICB7RkwyRlhDT05TVF9TR0woLTMyLjBmIC8gKGZsb2F0KSgxIDw8IDYpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40ZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDEyLjBmIC8gKGZsb2F0KSgxIDw8IDUpKSwgMH0sIC8qIDMgKi8KKyAgICB7RkwyRlhDT05TVF9TR0woLTMyLjBmIC8gKGZsb2F0KSgxIDw8IDYpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42ZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDEwLjBmIC8gKGZsb2F0KSgxIDw8IDUpKSwgMH0sIC8qIDQgKi8KKyAgICB7RkwyRlhDT05TVF9TR0woLTMyLjBmIC8gKGZsb2F0KSgxIDw8IDYpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44ZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDguMGYgLyAoZmxvYXQpKDEgPDwgNSkpLCAwfSwgLyogNSAqLworICAgIHtGTDJGWENPTlNUX1NHTCgtMzIuMGYgLyAoZmxvYXQpKDEgPDwgNikpLAorICAgICBGTDJGWENPTlNUX1NHTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woNi4wZiAvIChmbG9hdCkoMSA8PCA1KSksIDB9LCAvKiA2ICovCit9OworCitjb25zdCBDVVNUT01fRFJDX0NIQVJfTk9ERVMgY2ljcERyY0NoYXJOb2Rlc0xlZnRbXSA9IHsKKyAgICB7MiwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKC0zMS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtNDEuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTUzLjBmIC8gKGZsb2F0KSgxIDw8IDcpKX0sCisgICAgIHtGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woNi4wZiAvIChmbG9hdCkoMSA8PCA3KSl9fSwgLyogNyAqLworICAgIHsxLAorICAgICB7RkwyRlhDT05TVF9TR0woLTMxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC00My4wZiAvIChmbG9hdCkoMSA8PCA3KSl9LAorICAgICB7RkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCg2LjBmIC8gKGZsb2F0KSgxIDw8IDcpKX19LCAvKiA4ICovCisgICAgezIsCisgICAgIHtGTDJGWENPTlNUX1NHTCgtMzEuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTQxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC02NS4wZiAvIChmbG9hdCkoMSA8PCA3KSl9LAorICAgICB7RkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDEyLjBmIC8gKGZsb2F0KSgxIDw8IDcpKX19LCAvKiA5ICovCisgICAgezEsCisgICAgIHtGTDJGWENPTlNUX1NHTCgtMzEuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTU1LjBmIC8gKGZsb2F0KSgxIDw8IDcpKX0sCisgICAgIHtGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDEyLjBmIC8gKGZsb2F0KSgxIDw8IDcpKX19LCAvKiAxMCAqLworICAgIHsxLAorICAgICB7RkwyRlhDT05TVF9TR0woLTMxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC01MC4wZiAvIChmbG9hdCkoMSA8PCA3KSl9LAorICAgICB7RkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgxNS4wZiAvIChmbG9hdCkoMSA8PCA3KSl9fSAvKiAxMSAqLworfTsKKworY29uc3QgQ1VTVE9NX0RSQ19DSEFSX05PREVTIGNpY3BEcmNDaGFyTm9kZXNSaWdodFtdID0geworICAgIHs0LAorICAgICB7RkwyRlhDT05TVF9TR0woLTMxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0yMS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtMTEuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woOS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgxOS4wZiAvIChmbG9hdCkoMSA8PCA3KSl9LAorICAgICB7RkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC01LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0yNC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtMzQuMGYgLyAoZmxvYXQpKDEgPDwgNykpfX0sIC8qIDcgKi8KKyAgICB7NCwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKC0zMS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtMjYuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTE2LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDQuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woMTQuMGYgLyAoZmxvYXQpKDEgPDwgNykpfSwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtNS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtMjQuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTM0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKX19LCAvKiA4ICovCisgICAgezMsCisgICAgIHtGTDJGWENPTlNUX1NHTCgtMzEuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTIxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDkuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woMjkuMGYgLyAoZmxvYXQpKDEgPDwgNykpfSwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtMTUuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTM1LjBmIC8gKGZsb2F0KSgxIDw8IDcpKX19LCAvKiA5ICovCisgICAgezQsCisgICAgIHtGTDJGWENPTlNUX1NHTCgtMzEuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTI2LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0xNi4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCg0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDE0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKX0sCisgICAgIHtGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTUuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTI0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0zNC4wZiAvIChmbG9hdCkoMSA8PCA3KSl9fSwgLyogMTAgKi8KKyAgICB7NCwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKC0zMS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtMjYuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTE2LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDQuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woMTQuMGYgLyAoZmxvYXQpKDEgPDwgNykpfSwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtNS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtMjQuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTM0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKX19IC8qIDExICovCit9OwpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL3NyYy9kcmNEZWNfcm9tLmggYi9saWJEUkNkZWMvc3JjL2RyY0RlY19yb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWVlODgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfcm9tLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBEUkNERUNfUk9NX0gKKyNkZWZpbmUgRFJDREVDX1JPTV9ICisKK2V4dGVybiBjb25zdCBTQ0hBUiBkZWx0YUdhaW5fY29kaW5nUHJvZmlsZV8wXzFfaHVmZm1hblsyNF1bMl07CitleHRlcm4gY29uc3QgU0NIQVIgZGVsdGFHYWluX2NvZGluZ1Byb2ZpbGVfMl9odWZmbWFuWzQ4XVsyXTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIHNsb3BlU3RlZXBuZXNzW107CitleHRlcm4gY29uc3QgU0NIQVIgc2xvcGVTdGVlcG5lc3NfaHVmZm1hblsxNF1bMl07CisKK2V4dGVybiBjb25zdCBGSVhQX0RCTCBkb3dubWl4Q29lZmZbXTsKK2V4dGVybiBjb25zdCBGSVhQX0RCTCBkb3dubWl4Q29lZmZWMVtdOworCitleHRlcm4gY29uc3QgQ1VTVE9NX0RSQ19DSEFSX1NJR01PSUQgY2ljcERyY0NoYXJTaWdtb2lkTGVmdFtdOworZXh0ZXJuIGNvbnN0IENVU1RPTV9EUkNfQ0hBUl9TSUdNT0lEIGNpY3BEcmNDaGFyU2lnbW9pZFJpZ2h0W107CitleHRlcm4gY29uc3QgQ1VTVE9NX0RSQ19DSEFSX05PREVTIGNpY3BEcmNDaGFyTm9kZXNMZWZ0W107CitleHRlcm4gY29uc3QgQ1VTVE9NX0RSQ19DSEFSX05PREVTIGNpY3BEcmNDaGFyTm9kZXNSaWdodFtdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3NlbGVjdGlvblByb2Nlc3MuY3BwIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfc2VsZWN0aW9uUHJvY2Vzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiNzMxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3NlbGVjdGlvblByb2Nlc3MuY3BwCkBAIC0wLDAgKzEsMzA4MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgQW5kcmVhcyBIb2VsemVyCisKKyAgIERlc2NyaXB0aW9uOiBEUkMgU2V0IFNlbGVjdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJjRGVjX3NlbGVjdGlvblByb2Nlc3MuaCIKKyNpbmNsdWRlICJkcmNEZWNfdG9vbHMuaCIKKworI2RlZmluZSBVTkRFRklORURfTE9VRE5FU1NfVkFMVUUgKEZJWFBfREJMKSBNQVhWQUxfREJMCisKK3R5cGVkZWYgZW51bSB7CisgIERFVFJfTk9ORSA9IDAsCisgIERFVFJfTklHSFQgPSAxLAorICBERVRSX05PSVNZID0gMiwKKyAgREVUUl9MSU1JVEVEID0gMywKKyAgREVUUl9MT1dMRVZFTCA9IDQsCisgIERFVFJfRElBTE9HID0gNSwKKyAgREVUUl9HRU5FUkFMX0NPTVBSID0gNiwKKyAgREVUUl9FWFBBTkQgPSA3LAorICBERVRSX0FSVElTVElDID0gOCwKKyAgREVUUl9DT1VOVAorfSBEUkNfRUZGRUNUX1RZUEVfUkVRVUVTVDsKKwordHlwZWRlZiBlbnVtIHsKKyAgREZSVF9FRkZFQ1RfVFlQRSwKKyAgREZSVF9EWU5BTUlDX1JBTkdFLAorICBERlJUX0RSQ19DSEFSQUNURVJJU1RJQworfSBEUkNfRkVBVFVSRV9SRVFVRVNUX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgIE1EUl9ERUZBVUxUID0gMCwKKyAgTURSX1BST0dSQU1fTE9VRE5FU1MgPSAxLAorICBNRFJfQU5DSE9SX0xPVURORVNTID0gMgorfSBNRVRIT0RfREVGSU5JVElPTl9SRVFVRVNUOworCit0eXBlZGVmIGVudW0geworICBNU1JfREVGQVVMVCA9IDAsCisgIE1TUl9CU18xNzcwXzQgPSAxLAorICBNU1JfVVNFUiA9IDIsCisgIE1TUl9FWFBFUlRfUEFORUwgPSAzLAorICBNU1JfUkVTRVJWRURfQSA9IDQsCisgIE1TUl9SRVNFUlZFRF9CID0gNSwKKyAgTVNSX1JFU0VSVkVEX0MgPSA2LAorICBNU1JfUkVTRVJWRURfRCA9IDcsCisgIE1TUl9SRVNFUlZFRF9FID0gOAorfSBNRUFTVVJFTUVOVF9TWVNURU1fUkVRVUVTVDsKKwordHlwZWRlZiBlbnVtIHsKKyAgTFBSX0RFRkFVTFQgPSAwLAorICBMUFJfT0ZGID0gMSwKKyAgTFBSX0hJR0hQQVNTID0gMgorfSBMT1VETkVTU19QUkVQUk9DRVNTSU5HX1JFUVVFU1Q7CisKK3R5cGVkZWYgZW51bSB7CisgIERSTVJUX1NIT1JUX1RFUk1fTE9VRE5FU1NfVE9fQVZHID0gMCwKKyAgRFJNUlRfTU9NRU5UQVJZX0xPVURORVNTX1RPX0FWRyA9IDEsCisgIERSTVJUX1RPUF9PRl9MT1VETkVTU19SQU5HRV9UT19BVkcgPSAyCit9IERZTl9SQU5HRV9NRUFTVVJFTUVOVF9SRVFVRVNUX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgIFRDUlRfRE9XTk1JWF9JRCA9IDAsCisgIFRDUlRfVEFSR0VUX0xBWU9VVCA9IDEsCisgIFRDUlRfVEFSR0VUX0NIQU5ORUxfQ09VTlQgPSAyCit9IFRBUkdFVF9DT05GSUdfUkVRVUVTVF9UWVBFOworCit0eXBlZGVmIHNob3VsZEJlVW5pb24geworICBzdHJ1Y3QgeworICAgIFVDSEFSIG51bVJlcXVlc3RzOworICAgIFVDSEFSIG51bVJlcXVlc3RzRGVzaXJlZDsKKyAgICBEUkNfRUZGRUNUX1RZUEVfUkVRVUVTVCByZXF1ZXN0W01BWF9SRVFVRVNUU19EUkNfRUZGRUNUX1RZUEVdOworICB9IGRyY0VmZmVjdFR5cGU7CisgIHN0cnVjdCB7CisgICAgRFlOX1JBTkdFX01FQVNVUkVNRU5UX1JFUVVFU1RfVFlQRSBtZWFzdXJlbWVudFJlcXVlc3RUeXBlOworICAgIFVDSEFSIHJlcXVlc3RlZElzUmFuZ2U7CisgICAgRklYUF9EQkwgcmVxdWVzdFZhbHVlOyAgICAvKiBlID0gNyAqLworICAgIEZJWFBfREJMIHJlcXVlc3RWYWx1ZU1pbjsgLyogZSA9IDcgKi8KKyAgICBGSVhQX0RCTCByZXF1ZXN0VmFsdWVNYXg7IC8qIGUgPSA3ICovCisgIH0gZHluYW1pY1JhbmdlOworICBVQ0hBUiBkcmNDaGFyYWN0ZXJpc3RpYzsKK30KK0RSQ19GRUFUVVJFX1JFUVVFU1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogc3lzdGVtIHBhcmFtZXRlcnMgKi8KKyAgU0NIQVIgYmFzZUNoYW5uZWxDb3VudDsKKyAgU0NIQVIgYmFzZUxheW91dDsgLyogbm90IHN1cHBvcnRlZCAqLworICBUQVJHRVRfQ09ORklHX1JFUVVFU1RfVFlQRSB0YXJnZXRDb25maWdSZXF1ZXN0VHlwZTsKKyAgVUNIQVIgbnVtRG93bm1peElkUmVxdWVzdHM7CisgIFVDSEFSIGRvd25taXhJZFJlcXVlc3RlZFtNQVhfUkVRVUVTVFNfRE9XTk1JWF9JRF07CisgIFVDSEFSIHRhcmdldExheW91dFJlcXVlc3RlZDsKKyAgVUNIQVIgdGFyZ2V0Q2hhbm5lbENvdW50UmVxdWVzdGVkOworICBMT05HIGF1ZGlvU2FtcGxlUmF0ZTsgLyogbmVlZGVkIGZvciBjb21wbGV4aXR5IGVzdGltYXRpb24sIGN1cnJlbnRseSBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCAqLworCisgIC8qIGxvdWRuZXNzIG5vcm1hbGl6YXRpb24gcGFyYW1ldGVycyAqLworICBVQ0hBUiBsb3VkbmVzc05vcm1hbGl6YXRpb25PbjsKKyAgRklYUF9EQkwgdGFyZ2V0TG91ZG5lc3M7IC8qIGUgPSA3ICovCisgIFVDSEFSIGFsYnVtTW9kZTsKKyAgVUNIQVIgcGVha0xpbWl0ZXJQcmVzZW50OworICBVQ0hBUiBsb3VkbmVzc0RldmlhdGlvbk1heDsgLyogcmVzb2x1dGlvbjogMSBkQiAqLworICBNRVRIT0RfREVGSU5JVElPTl9SRVFVRVNUIGxvdWRuZXNzTWVhc3VyZW1lbnRNZXRob2Q7CisgIE1FQVNVUkVNRU5UX1NZU1RFTV9SRVFVRVNUIGxvdWRuZXNzTWVhc3VyZW1lbnRTeXN0ZW07CisgIExPVURORVNTX1BSRVBST0NFU1NJTkdfUkVRVUVTVCBsb3VkbmVzc01lYXN1cmVtZW50UHJlUHJvYzsgLyogbm90IHN1cHBvcnRlZCAqLworICBMT05HIGRldmljZUN1dE9mZkZyZXF1ZW5jeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgKi8KKyAgRklYUF9EQkwgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiTWF4OyAgICAgICAgICAgICAgICAgICAvKiBlID0gNyAqLworICBGSVhQX0RCTCBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluTW9kaWZpY2F0aW9uRGI7ICAgICAgICAgIC8qIGUgPSA3ICovCisgIEZJWFBfREJMIG91dHB1dFBlYWtMZXZlbE1heDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZSA9IDcgKi8KKworICAvKiBkeW5hbWljIHJhbmdlIGNvbnRyb2wgcGFyYW1ldGVycyAqLworICBVQ0hBUiBkeW5hbWljUmFuZ2VDb250cm9sT247CisgIFVDSEFSIG51bURyY0ZlYXR1cmVSZXF1ZXN0czsKKyAgRFJDX0ZFQVRVUkVfUkVRVUVTVF9UWVBFIGRyY0ZlYXR1cmVSZXF1ZXN0VHlwZVtNQVhfUkVRVUVTVFNfRFJDX0ZFQVRVUkVdOworICBEUkNfRkVBVFVSRV9SRVFVRVNUIGRyY0ZlYXR1cmVSZXF1ZXN0W01BWF9SRVFVRVNUU19EUkNfRkVBVFVSRV07CisKKyAgLyogb3RoZXIgKi8KKyAgRklYUF9TR0wgYm9vc3Q7ICAgICAgICAgICAgICAgIC8qIGUgPSAxICovCisgIEZJWFBfU0dMIGNvbXByZXNzOyAgICAgICAgICAgICAvKiBlID0gMSAqLworICBVQ0hBUiBkcmNDaGFyYWN0ZXJpc3RpY1RhcmdldDsgLyogbm90IHN1cHBvcnRlZCAqLworfSBTRUxfUFJPQ19JTlBVVCwgKkhBTkRMRV9TRUxfUFJPQ19JTlBVVDsKKworLyogVGFibGUgRS4xIG9mIElTTy9JRUMgRElTIDIzMDAzLTQ6IFJlY29tbWVuZGVkIG9yZGVyIG9mIGZhbGxiYWNrIGVmZmVjdCB0eXBlCisgKiByZXF1ZXN0cyAqLworc3RhdGljIERSQ19FRkZFQ1RfVFlQRV9SRVFVRVNUIGZhbGxiYWNrRWZmZWN0VHlwZVJlcXVlc3RzWzZdWzVdID0geworICAgIC8qIE5pZ2h0ICovIHtERVRSX0dFTkVSQUxfQ09NUFIsIERFVFJfTk9JU1ksIERFVFJfTElNSVRFRCwgREVUUl9MT1dMRVZFTCwKKyAgICAgICAgICAgICAgICAgREVUUl9ESUFMT0d9LAorICAgIC8qIE5vaXN5ICovCisgICAge0RFVFJfR0VORVJBTF9DT01QUiwgREVUUl9OSUdIVCwgREVUUl9MSU1JVEVELCBERVRSX0xPV0xFVkVMLCBERVRSX0RJQUxPR30sCisgICAgLyogTGltaXRlZCAqLworICAgIHtERVRSX0dFTkVSQUxfQ09NUFIsIERFVFJfTklHSFQsIERFVFJfTk9JU1ksIERFVFJfTE9XTEVWRUwsIERFVFJfRElBTE9HfSwKKyAgICAvKiBMb3dMZXZlbCAqLworICAgIHtERVRSX0dFTkVSQUxfQ09NUFIsIERFVFJfTk9JU1ksIERFVFJfTklHSFQsIERFVFJfTElNSVRFRCwgREVUUl9ESUFMT0d9LAorICAgIC8qIERpYWxvZyAqLworICAgIHtERVRSX0dFTkVSQUxfQ09NUFIsIERFVFJfTklHSFQsIERFVFJfTk9JU1ksIERFVFJfTElNSVRFRCwgREVUUl9MT1dMRVZFTH0sCisgICAgLyogR2VuZXJhbCAqLworICAgIHtERVRSX05JR0hULCBERVRSX05PSVNZLCBERVRSX0xJTUlURUQsIERFVFJfTE9XTEVWRUwsIERFVFJfRElBTE9HfX07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBzZWxlY3Rpb25GbGFnOworICBVQ0hBUiBkb3dubWl4SWRSZXF1ZXN0SW5kZXg7CisgIEZJWFBfREJMIG91dHB1dFBlYWtMZXZlbDsgICAgICAgICAgICAgICAgICAgICAvKiBlID0gNyAqLworICBGSVhQX0RCTCBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGJBZGp1c3RlZDsgLyogZSA9IDcgKi8KKyAgRklYUF9EQkwgb3V0cHV0TG91ZG5lc3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIGUgPSA3ICovCisgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3Q7CisKK30gRFJDREVDX1NFTEVDVElPTl9EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIG51bURhdGE7CisgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSBkYXRhWygxMiArIDEgKyA2KV07CisKK30gRFJDREVDX1NFTEVDVElPTjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBoZWxwZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9pc0Vycm9yKGludCB4KSB7CisgIGlmICh4IDwgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1dBUk5JTkcpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvKiBjb21wYXJlIGFuZCBhc3NpZ24gKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9jb21wQXNzaWduKFVDSEFSKiBkZXN0LCBjb25zdCBVQ0hBUiBzcmMpIHsKKyAgaW50IGRpZmYgPSAwOworICBpZiAoKmRlc3QgIT0gc3JjKSBkaWZmID0gMTsKKyAgKmRlc3QgPSBzcmM7CisgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgaW5saW5lIGludCBfY29tcEFzc2lnbihTQ0hBUiogZGVzdCwgY29uc3QgU0NIQVIgc3JjKSB7CisgIGludCBkaWZmID0gMDsKKyAgaWYgKCpkZXN0ICE9IHNyYykgZGlmZiA9IDE7CisgICpkZXN0ID0gc3JjOworICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgX2NvbXBBc3NpZ24oRklYUF9EQkwqIGRlc3QsIGNvbnN0IEZJWFBfREJMIHNyYykgeworICBpbnQgZGlmZiA9IDA7CisgIGlmICgqZGVzdCAhPSBzcmMpIGRpZmYgPSAxOworICAqZGVzdCA9IHNyYzsKKyAgcmV0dXJuIGRpZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9jb21wQXNzaWduKEZJWFBfU0dMKiBkZXN0LCBjb25zdCBGSVhQX1NHTCBzcmMpIHsKKyAgaW50IGRpZmYgPSAwOworICBpZiAoKmRlc3QgIT0gc3JjKSBkaWZmID0gMTsKKyAgKmRlc3QgPSBzcmM7CisgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgaW5saW5lIGludCBfY29tcEFzc2lnbihUQVJHRVRfQ09ORklHX1JFUVVFU1RfVFlQRSogZGVzdCwgY29uc3QgaW50IHNyYykgeworICBpbnQgZGlmZiA9IDA7CisgIGlmICgqZGVzdCAhPSBzcmMpIGRpZmYgPSAxOworICAqZGVzdCA9IChUQVJHRVRfQ09ORklHX1JFUVVFU1RfVFlQRSlzcmM7CisgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgaW5saW5lIGludCBfY29tcEFzc2lnbihNRVRIT0RfREVGSU5JVElPTl9SRVFVRVNUKiBkZXN0LCBjb25zdCBpbnQgc3JjKSB7CisgIGludCBkaWZmID0gMDsKKyAgaWYgKCpkZXN0ICE9IHNyYykgZGlmZiA9IDE7CisgICpkZXN0ID0gKE1FVEhPRF9ERUZJTklUSU9OX1JFUVVFU1Qpc3JjOworICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgX2NvbXBBc3NpZ24oRFJDX0ZFQVRVUkVfUkVRVUVTVF9UWVBFKiBkZXN0LCBjb25zdCBpbnQgc3JjKSB7CisgIGludCBkaWZmID0gMDsKKyAgaWYgKCpkZXN0ICE9IHNyYykgZGlmZiA9IDE7CisgICpkZXN0ID0gKERSQ19GRUFUVVJFX1JFUVVFU1RfVFlQRSlzcmM7CisgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgaW5saW5lIGludCBfY29tcEFzc2lnbihEUkNfRUZGRUNUX1RZUEVfUkVRVUVTVCogZGVzdCwgY29uc3QgaW50IHNyYykgeworICBpbnQgZGlmZiA9IDA7CisgIGlmICgqZGVzdCAhPSBzcmMpIGRpZmYgPSAxOworICAqZGVzdCA9IChEUkNfRUZGRUNUX1RZUEVfUkVRVUVTVClzcmM7CisgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBfZHJjZGVjX3NlbGVjdGlvbl9hZGROZXcoCisgICAgRFJDREVDX1NFTEVDVElPTiogcFNlbGVjdGlvbik7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIF9kcmNkZWNfc2VsZWN0aW9uX2FkZCgKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwU2VsZWN0aW9uLCBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBEYXRhSW4pOworCitzdGF0aWMgaW50IF9kcmNkZWNfc2VsZWN0aW9uX2NsZWFyKERSQ0RFQ19TRUxFQ1RJT04qIHBTZWxlY3Rpb24pOworCitzdGF0aWMgaW50IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihEUkNERUNfU0VMRUNUSU9OKiBwU2VsZWN0aW9uKTsKKworc3RhdGljIGludCBfZHJjZGVjX3NlbGVjdGlvbl9zZXROdW1iZXIoRFJDREVDX1NFTEVDVElPTiogcFNlbGVjdGlvbiwgaW50IG51bSk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBTZWxlY3Rpb24sIGludCBhdCk7CisKK3N0YXRpYyBpbnQgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcihEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKK3N0YXRpYyBpbnQgX3N3YXBTZWxlY3Rpb24oRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkZWNsYXJhdGlvbnMgb2Ygc3RhdGljIGZ1bmN0aW9ucyAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfaW5pdERlZmF1bHRQYXJhbXMoCisgICAgSEFORExFX1NFTF9QUk9DX0lOUFVUIGhTZWxQcm9jSW5wdXQpOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfaW5pdENvZGVjTW9kZVBhcmFtcygKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwgY29uc3QgU0VMX1BST0NfQ09ERUNfTU9ERSBjb2RlY01vZGUpOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHJjU2V0UHJlU2VsZWN0aW9uKAorICAgIFNFTF9QUk9DX0lOUFVUKiBoU2VsUHJvY0lucHV0LCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNTZWxlY3RlZCwgU0VMX1BST0NfQ09ERUNfTU9ERSBjb2RlY01vZGUpOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHJjU2V0RmluYWxTZWxlY3Rpb25fcGVha1ZhbHVlMCgKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2R5bmFtaWNSYW5nZU1lYXN1cmVtZW50KAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LCBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0LAorICAgIFVDSEFSIGRvd25taXhJZFJlcXVlc3RlZCwKKyAgICBEWU5fUkFOR0VfTUVBU1VSRU1FTlRfUkVRVUVTVF9UWVBFIGR5bmFtaWNSYW5nZU1lYXN1cmVtZW50VHlwZSwKKyAgICBpbnQgYWxidW1Nb2RlLCBpbnQqIHBlYWtUb0F2ZXJhZ2VQcmVzZW50LCBGSVhQX0RCTCogcGVha1RvQXZlcmFnZSk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9jaGFubmVsTGF5b3V0VG9Eb3dubWl4SWRNYXBwaW5nKAorICAgIEhBTkRMRV9TRUxfUFJPQ19JTlBVVCBoU2VsUHJvY0lucHV0LCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZyk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9nZW5lcmF0ZVZpcnR1YWxEcmNTZXRzKAorICAgIEhBTkRMRV9TRUxfUFJPQ19JTlBVVCBoU2VsUHJvY0lucHV0LCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9kcmNTZXRSZXF1ZXN0U2VsZWN0aW9uKAorICAgIFNFTF9QUk9DX0lOUFVUKiBoU2VsUHJvY0lucHV0LCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9kcmNTZXRGaW5hbFNlbGVjdGlvbigKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzU2VsZWN0ZWQsIFNFTF9QUk9DX0NPREVDX01PREUgY29kZWNNb2RlKTsKKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dlbmVyYXRlT3V0cHV0SW5mbygKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwgSEFORExFX1NFTF9QUk9DX09VVFBVVCBoU2VsUHJvY091dHB1dCwKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBTZWxlY3Rpb25EYXRhLCBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9zZWxlY3REb3dubWl4TWF0cml4KAorICAgIEhBTkRMRV9TRUxfUFJPQ19PVVRQVVQgaFNlbFByb2NPdXRwdXQsIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnKTsKKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dldExvdWRuZXNzKAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LCBpbnQgYWxidW1Nb2RlLAorICAgIE1FVEhPRF9ERUZJTklUSU9OX1JFUVVFU1QgbWVhc3VyZW1lbnRNZXRob2RSZXF1ZXN0ZWQsCisgICAgTUVBU1VSRU1FTlRfU1lTVEVNX1JFUVVFU1QgbWVhc3VyZW1lbnRTeXN0ZW1SZXF1ZXN0ZWQsCisgICAgRklYUF9EQkwgdGFyZ2V0TG91ZG5lc3MsIGludCBkcmNTZXRJZCwgaW50IGRvd25taXhJZFJlcXVlc3RlZCwKKyAgICBGSVhQX0RCTCogcExvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW4sIEZJWFBfREJMKiBwTG91ZG5lc3MpOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZ2V0TWl4aW5nTGV2ZWwoCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsIGludCBkb3dubWl4SWRSZXF1ZXN0ZWQsCisgICAgaW50IGRyY1NldElkUmVxdWVzdGVkLCBpbnQgYWxidW1Nb2RlLCBGSVhQX0RCTCogcE1peGluZ0xldmVsKTsKKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dldFNpZ25hbFBlYWtMZXZlbCgKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QsCisgICAgaW50IGRvd25taXhJZFJlcXVlc3RlZCwgaW50KiBleHBsaWNpdFBlYWtJbmZvcm1hdGlvblByZXNlbnQsCisgICAgRklYUF9EQkwqIHNpZ25hbFBlYWtMZXZlbE91dCwgLyogZSA9IDcgKi8KKyAgICBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9leHRyYWN0TG91ZG5lc3NQZWFrVG9BdmVyYWdlVmFsdWUoCisgICAgTE9VRE5FU1NfSU5GTyogbG91ZG5lc3NJbmZvLAorICAgIERZTl9SQU5HRV9NRUFTVVJFTUVOVF9SRVFVRVNUX1RZUEUgZHluYW1pY1JhbmdlTWVhc3VyZW1lbnRUeXBlLAorICAgIGludCogcExvdWRuZXNzUGVha1RvQXZlcmFnZVZhbHVlUHJlc2VudCwKKyAgICBGSVhQX0RCTCogcExvdWRuZXNzUGVha1RvQXZlcmFnZVZhbHVlKTsKKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3NlbGVjdEFsYnVtTG91ZG5lc3MoCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKK3N0YXRpYyBpbnQgX2ZpbmRNZXRob2REZWZpbml0aW9uKExPVURORVNTX0lORk8qIHBMb3VkbmVzc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kRGVmaW5pdGlvbiwgaW50IHN0YXJ0SW5kZXgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHB1YmxpYyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBzX2RyY2RlY19zZWxlY3Rpb25fcHJvY2VzcyB7CisgIFNFTF9QUk9DX0NPREVDX01PREUgY29kZWNNb2RlOworICBTRUxfUFJPQ19JTlBVVCBzZWxQcm9jSW5wdXQ7CisgIERSQ0RFQ19TRUxFQ1RJT04KKyAgc2VsZWN0aW9uRGF0YVsyXTsgLyogMiBpbnN0YW5jZXMsIG9uZSBiZWZvcmUgYW5kIG9uZSBhZnRlciBzZWxlY3Rpb24gKi8KK307CisKK0RSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4KK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX0NyZWF0ZShIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTKiBwaEluc3RhbmNlKSB7CisgIEhBTkRMRV9EUkNfU0VMRUNUSU9OX1BST0NFU1MgaEluc3RhbmNlOworICBoSW5zdGFuY2UgPSAoSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUylGREtjYWxsb2MoCisgICAgICAxLCBzaXplb2Yoc3RydWN0IHNfZHJjZGVjX3NlbGVjdGlvbl9wcm9jZXNzKSk7CisKKyAgaWYgKCFoSW5zdGFuY2UpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfT1VUT0ZNRU1PUlk7CisKKyAgaEluc3RhbmNlLT5jb2RlY01vZGUgPSBTRUxfUFJPQ19DT0RFQ19NT0RFX1VOREVGSU5FRDsKKworICAqcGhJbnN0YW5jZSA9IGhJbnN0YW5jZTsKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTgorZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfSW5pdChIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTIGhJbnN0YW5jZSkgeworICBpZiAoIWhJbnN0YW5jZSkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgX2luaXREZWZhdWx0UGFyYW1zKCZoSW5zdGFuY2UtPnNlbFByb2NJbnB1dCk7CisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKK0RSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4KK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldENvZGVjTW9kZShIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKworICBpZiAoIWhJbnN0YW5jZSkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgc3dpdGNoIChjb2RlY01vZGUpIHsKKyAgICBjYXNlIFNFTF9QUk9DX01QRUdfNF9BQUM6CisgICAgY2FzZSBTRUxfUFJPQ19NUEVHX0RfVVNBQzoKKyAgICBjYXNlIFNFTF9QUk9DX1RFU1RfVElNRV9ET01BSU46CisgICAgY2FzZSBTRUxfUFJPQ19URVNUX1FNRl9ET01BSU46CisgICAgY2FzZSBTRUxfUFJPQ19URVNUX1NURlRfRE9NQUlOOgorICAgICAgaEluc3RhbmNlLT5jb2RlY01vZGUgPSBjb2RlY01vZGU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0VMX1BST0NfQ09ERUNfTU9ERV9VTkRFRklORUQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICB9CisKKyAgcmV0VmFsID0gX2luaXRDb2RlY01vZGVQYXJhbXMoJihoSW5zdGFuY2UtPnNlbFByb2NJbnB1dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnN0YW5jZS0+Y29kZWNNb2RlID0gY29kZWNNb2RlKTsKKworICByZXR1cm4gcmV0VmFsOworfQorCitEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOCitkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRQYXJhbShIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNFTF9QUk9DX1VTRVJfUEFSQU0gcmVxdWVzdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCByZXF1ZXN0VmFsdWUsIGludCogcERpZmYpIHsKKyAgSU5UIHJlcXVlc3RWYWx1ZUludCA9IChJTlQpcmVxdWVzdFZhbHVlOworICBpbnQgaSwgZGlmZiA9IDA7CisgIFNFTF9QUk9DX0lOUFVUKiBwU2VsUHJvY0lucHV0ID0gJihoSW5zdGFuY2UtPnNlbFByb2NJbnB1dCk7CisKKyAgc3dpdGNoIChyZXF1ZXN0VHlwZSkgeworICAgIGNhc2UgU0VMX1BST0NfTE9VRE5FU1NfTk9STUFMSVpBVElPTl9PTjoKKyAgICAgIGlmICgocmVxdWVzdFZhbHVlSW50ICE9IDApICYmIChyZXF1ZXN0VmFsdWVJbnQgIT0gMSkpCisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUEFSQU1fT1VUX09GX1JBTkdFOworICAgICAgZGlmZiB8PQorICAgICAgICAgIF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25PbiwgcmVxdWVzdFZhbHVlSW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VMX1BST0NfVEFSR0VUX0xPVURORVNTOgorICAgICAgLyogTG93ZXIgYm91bmRhcnk6IGRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlciBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgVXBwZXIgYm91bmRhcnk6IGRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlciBkZWZhdWx0IHZhbHVlICovCisgICAgICBpZiAoKHJlcXVlc3RWYWx1ZSA8IEZMMkZYQ09OU1RfREJMKC02My4wZiAvIChmbG9hdCkoMSA8PCA3KSkpIHx8CisgICAgICAgICAgKHJlcXVlc3RWYWx1ZSA+IChGSVhQX0RCTCkwKSkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBpZiAocmVxdWVzdFZhbHVlID4KKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMTAuMGYgLworICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkoMSA8PCA3KSkpIC8qIHJlY29tbWVuZGVkIG1heGltdW0gdmFsdWUgKi8KKyAgICAgICAgcmVxdWVzdFZhbHVlID0gRkwyRlhDT05TVF9EQkwoLTEwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKTsKKyAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPnRhcmdldExvdWRuZXNzLCByZXF1ZXN0VmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUxfUFJPQ19FRkZFQ1RfVFlQRToKKyAgICAgIGlmICgocmVxdWVzdFZhbHVlSW50IDwgLTEpIHx8IChyZXF1ZXN0VmFsdWVJbnQgPj0gREVUUl9DT1VOVCkpCisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUEFSQU1fT1VUX09GX1JBTkdFOworICAgICAgLyogQ2F1dGlvbi4gVGhpcyBvdmVycmlkZXMgYWxsIGRyY0ZlYXR1cmVSZXF1ZXN0cyByZXF1ZXN0ZWQgc28gZmFyISAqLworICAgICAgaWYgKHJlcXVlc3RWYWx1ZUludCA9PSAtMSkgeworICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5keW5hbWljUmFuZ2VDb250cm9sT24sIDApOworICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0VmFsdWVJbnQgPT0gREVUUl9OT05FKSB7CisgICAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPmR5bmFtaWNSYW5nZUNvbnRyb2xPbiwgMSk7CisgICAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPm51bURyY0ZlYXR1cmVSZXF1ZXN0cywgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5keW5hbWljUmFuZ2VDb250cm9sT24sIDEpOworICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5udW1EcmNGZWF0dXJlUmVxdWVzdHMsIDEpOworICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5kcmNGZWF0dXJlUmVxdWVzdFR5cGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREZSVF9FRkZFQ1RfVFlQRSk7CisgICAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPmRyY0ZlYXR1cmVSZXF1ZXN0WzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZHJjRWZmZWN0VHlwZS5udW1SZXF1ZXN0c0Rlc2lyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oCisgICAgICAgICAgICAmcFNlbFByb2NJbnB1dC0+ZHJjRmVhdHVyZVJlcXVlc3RbMF0uZHJjRWZmZWN0VHlwZS5yZXF1ZXN0WzBdLAorICAgICAgICAgICAgcmVxdWVzdFZhbHVlSW50KTsKKyAgICAgICAgaWYgKChyZXF1ZXN0VmFsdWVJbnQgPiBERVRSX05PTkUpICYmCisgICAgICAgICAgICAocmVxdWVzdFZhbHVlSW50IDw9IERFVFJfR0VORVJBTF9DT01QUikpIHsKKyAgICAgICAgICAvKiB1c2UgZmFsbGJhY2sgZWZmZWN0IHR5cGUgcmVxdWVzdHMgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBkaWZmIHw9CisgICAgICAgICAgICAgICAgX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPmRyY0ZlYXR1cmVSZXF1ZXN0WzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZHJjRWZmZWN0VHlwZS5yZXF1ZXN0W2kgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsYmFja0VmZmVjdFR5cGVSZXF1ZXN0c1tyZXF1ZXN0VmFsdWVJbnQgLSAxXVtpXSk7CisgICAgICAgICAgfQorICAgICAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oCisgICAgICAgICAgICAgICZwU2VsUHJvY0lucHV0LT5kcmNGZWF0dXJlUmVxdWVzdFswXS5kcmNFZmZlY3RUeXBlLm51bVJlcXVlc3RzLAorICAgICAgICAgICAgICA2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKAorICAgICAgICAgICAgICAmcFNlbFByb2NJbnB1dC0+ZHJjRmVhdHVyZVJlcXVlc3RbMF0uZHJjRWZmZWN0VHlwZS5udW1SZXF1ZXN0cywKKyAgICAgICAgICAgICAgMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VMX1BST0NfTE9VRE5FU1NfTUVBU1VSRU1FTlRfTUVUSE9EOgorICAgICAgaWYgKChyZXF1ZXN0VmFsdWVJbnQgPCAwKSB8fCAocmVxdWVzdFZhbHVlSW50ID4gMikpCisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUEFSQU1fT1VUX09GX1JBTkdFOworICAgICAgZGlmZiB8PSBfY29tcEFzc2lnbigmcFNlbFByb2NJbnB1dC0+bG91ZG5lc3NNZWFzdXJlbWVudE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFZhbHVlSW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VMX1BST0NfRE9XTk1JWF9JRDoKKyAgICAgIGRpZmYgfD0KKyAgICAgICAgICBfY29tcEFzc2lnbigmcFNlbFByb2NJbnB1dC0+dGFyZ2V0Q29uZmlnUmVxdWVzdFR5cGUsIFRDUlRfRE9XTk1JWF9JRCk7CisgICAgICBpZiAocmVxdWVzdFZhbHVlSW50IDwgMCkgeyAvKiBuZWdhdGl2ZSByZXF1ZXN0cyBzaWduYWwgbm8gZG93bm1peElkICovCisgICAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzLCAwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzLCAxKTsKKyAgICAgICAgZGlmZiB8PQorICAgICAgICAgICAgX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPmRvd25taXhJZFJlcXVlc3RlZFswXSwgcmVxdWVzdFZhbHVlSW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VMX1BST0NfVEFSR0VUX0xBWU9VVDoKKyAgICAgIC8qIFJlcXVlc3QgdGFyZ2V0IGxheW91dCBhY2NvcmRpbmcgdG8gQ2hhbm5lbENvbmZpZ3VyYXRpb24gaW4gSVNPL0lFQworICAgICAgICogMjMwMDEtOCAoQ0lDUCkgKi8KKyAgICAgIGlmICgocmVxdWVzdFZhbHVlSW50IDwgMSkgfHwgKHJlcXVlc3RWYWx1ZUludCA+IDYzKSkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT50YXJnZXRDb25maWdSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVENSVF9UQVJHRVRfTEFZT1VUKTsKKyAgICAgIGRpZmYgfD0KKyAgICAgICAgICBfY29tcEFzc2lnbigmcFNlbFByb2NJbnB1dC0+dGFyZ2V0TGF5b3V0UmVxdWVzdGVkLCByZXF1ZXN0VmFsdWVJbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUxfUFJPQ19UQVJHRVRfQ0hBTk5FTF9DT1VOVDoKKyAgICAgIGlmICgocmVxdWVzdFZhbHVlSW50IDwgMSkgfHwgKHJlcXVlc3RWYWx1ZUludCA+IDgpKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPnRhcmdldENvbmZpZ1JlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUQ1JUX1RBUkdFVF9DSEFOTkVMX0NPVU5UKTsKKyAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPnRhcmdldENoYW5uZWxDb3VudFJlcXVlc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFZhbHVlSW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VMX1BST0NfQkFTRV9DSEFOTkVMX0NPVU5UOgorICAgICAgaWYgKHJlcXVlc3RWYWx1ZUludCA8IDApCisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUEFSQU1fT1VUX09GX1JBTkdFOworICAgICAgZGlmZiB8PSBfY29tcEFzc2lnbigmcFNlbFByb2NJbnB1dC0+YmFzZUNoYW5uZWxDb3VudCwgcmVxdWVzdFZhbHVlSW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VMX1BST0NfU0FNUExFX1JBVEU6CisgICAgICBpZiAocmVxdWVzdFZhbHVlSW50IDwgMCkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5hdWRpb1NhbXBsZVJhdGUsIHJlcXVlc3RWYWx1ZUludCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFTF9QUk9DX0JPT1NUOgorICAgICAgaWYgKChyZXF1ZXN0VmFsdWUgPCAoRklYUF9EQkwpMCkgfHwKKyAgICAgICAgICAocmVxdWVzdFZhbHVlID4gRkwyRlhDT05TVF9EQkwoMS4wZiAvIChmbG9hdCkoMSA8PCAxKSkpKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPmJvb3N0LCBGWF9EQkwyRlhfU0dMKHJlcXVlc3RWYWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUxfUFJPQ19DT01QUkVTUzoKKyAgICAgIGlmICgocmVxdWVzdFZhbHVlIDwgKEZJWFBfREJMKTApIHx8CisgICAgICAgICAgKHJlcXVlc3RWYWx1ZSA+IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgMSkpKSkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBkaWZmIHw9CisgICAgICAgICAgX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPmNvbXByZXNzLCBGWF9EQkwyRlhfU0dMKHJlcXVlc3RWYWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfSU5WQUxJRF9QQVJBTTsKKyAgfQorCisgIGlmIChwRGlmZiAhPSBOVUxMKSB7CisgICAgKnBEaWZmIHw9IGRpZmY7CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCitGSVhQX0RCTAorZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfR2V0UGFyYW0oSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUyBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRUxfUFJPQ19VU0VSX1BBUkFNIHJlcXVlc3RUeXBlKSB7CisgIFNFTF9QUk9DX0lOUFVUKiBwU2VsUHJvY0lucHV0ID0gJihoSW5zdGFuY2UtPnNlbFByb2NJbnB1dCk7CisKKyAgc3dpdGNoIChyZXF1ZXN0VHlwZSkgeworICAgIGNhc2UgU0VMX1BST0NfTE9VRE5FU1NfTk9STUFMSVpBVElPTl9PTjoKKyAgICAgIHJldHVybiAoRklYUF9EQkwpcFNlbFByb2NJbnB1dC0+bG91ZG5lc3NOb3JtYWxpemF0aW9uT247CisgICAgY2FzZSBTRUxfUFJPQ19EWU5BTUlDX1JBTkdFX0NPTlRST0xfT046CisgICAgICByZXR1cm4gKEZJWFBfREJMKXBTZWxQcm9jSW5wdXQtPmR5bmFtaWNSYW5nZUNvbnRyb2xPbjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIChGSVhQX0RCTCkwOworICB9Cit9CisKK0RSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4KK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX0RlbGV0ZShIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTKiBwaEluc3RhbmNlKSB7CisgIGlmIChwaEluc3RhbmNlID09IE5VTEwgfHwgKnBoSW5zdGFuY2UgPT0gTlVMTCkKKyAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX0lOVkFMSURfSEFORExFOworCisgIEZES2ZyZWUoKnBoSW5zdGFuY2UpOworICAqcGhJbnN0YW5jZSA9IE5VTEw7CisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKK0RSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4KK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1Byb2Nlc3MoSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUyBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NFTF9QUk9DX09VVFBVVCBoU2VsUHJvY091dHB1dCkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNTZWxlY3RlZDsKKyAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWw7CisKKyAgaWYgKGhJbnN0YW5jZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX0lOVkFMSURfSEFORExFOworCisgIHBDYW5kaWRhdGVzU2VsZWN0ZWQgPSAmKGhJbnN0YW5jZS0+c2VsZWN0aW9uRGF0YVswXSk7CisgIHBDYW5kaWRhdGVzUG90ZW50aWFsID0gJihoSW5zdGFuY2UtPnNlbGVjdGlvbkRhdGFbMV0pOworICBfZHJjZGVjX3NlbGVjdGlvbl9zZXROdW1iZXIocENhbmRpZGF0ZXNTZWxlY3RlZCwgMCk7CisgIF9kcmNkZWNfc2VsZWN0aW9uX3NldE51bWJlcihwQ2FuZGlkYXRlc1BvdGVudGlhbCwgMCk7CisKKyAgcmV0VmFsID0gX2dlbmVyYXRlVmlydHVhbERyY1NldHMoJihoSW5zdGFuY2UtPnNlbFByb2NJbnB1dCksIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnN0YW5jZS0+Y29kZWNNb2RlKTsKKyAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworCisgIGlmIChoSW5zdGFuY2UtPnNlbFByb2NJbnB1dC5iYXNlQ2hhbm5lbENvdW50ICE9CisgICAgICBoVW5pRHJjQ29uZmlnLT5jaGFubmVsTGF5b3V0LmJhc2VDaGFubmVsQ291bnQpIHsKKyAgICBoSW5zdGFuY2UtPnNlbFByb2NJbnB1dC5iYXNlQ2hhbm5lbENvdW50ID0KKyAgICAgICAgaFVuaURyY0NvbmZpZy0+Y2hhbm5lbExheW91dC5iYXNlQ2hhbm5lbENvdW50OworICB9CisKKyAgaWYgKChoSW5zdGFuY2UtPnNlbFByb2NJbnB1dC50YXJnZXRDb25maWdSZXF1ZXN0VHlwZSAhPSAwKSB8fAorICAgICAgKGhJbnN0YW5jZS0+c2VsUHJvY0lucHV0LnRhcmdldENvbmZpZ1JlcXVlc3RUeXBlID09IDAgJiYKKyAgICAgICBoSW5zdGFuY2UtPnNlbFByb2NJbnB1dC5udW1Eb3dubWl4SWRSZXF1ZXN0cyA9PSAwKSkgeworICAgIHJldFZhbCA9IF9jaGFubmVsTGF5b3V0VG9Eb3dubWl4SWRNYXBwaW5nKCYoaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhVbmlEcmNDb25maWcpOworCisgICAgaWYgKF9pc0Vycm9yKHJldFZhbCkpIHJldHVybiAocmV0VmFsKTsKKyAgfQorCisgIHJldFZhbCA9IF9kcmNTZXRQcmVTZWxlY3Rpb24oJihoSW5zdGFuY2UtPnNlbFByb2NJbnB1dCksIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaExvdWRuZXNzSW5mb1NldCwgJnBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2FuZGlkYXRlc1NlbGVjdGVkLCBoSW5zdGFuY2UtPmNvZGVjTW9kZSk7CisgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKworICBpZiAoaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQuYWxidW1Nb2RlKSB7CisgICAgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcigmcENhbmRpZGF0ZXNQb3RlbnRpYWwsICZwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKworICAgIHJldFZhbCA9IF9zZWxlY3RBbGJ1bUxvdWRuZXNzKGhMb3VkbmVzc0luZm9TZXQsIHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKworICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNTZWxlY3RlZCkgPT0gMCkgeworICAgICAgX3N3YXBTZWxlY3Rpb24oJnBDYW5kaWRhdGVzUG90ZW50aWFsLCAmcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgfQorICB9CisKKyAgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcigmcENhbmRpZGF0ZXNQb3RlbnRpYWwsICZwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKworICByZXRWYWwgPSBfZHJjU2V0UmVxdWVzdFNlbGVjdGlvbigmKGhJbnN0YW5jZS0+c2VsUHJvY0lucHV0KSwgaFVuaURyY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaExvdWRuZXNzSW5mb1NldCwgJnBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKworICByZXRWYWwgPSBfZHJjU2V0RmluYWxTZWxlY3Rpb24oJihoSW5zdGFuY2UtPnNlbFByb2NJbnB1dCksIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENhbmRpZGF0ZXNQb3RlbnRpYWwsICZwQ2FuZGlkYXRlc1NlbGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEluc3RhbmNlLT5jb2RlY01vZGUpOworICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisKKyAgcmV0VmFsID0gX2dlbmVyYXRlT3V0cHV0SW5mbygKKyAgICAgICYoaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQpLCBoU2VsUHJvY091dHB1dCwgaFVuaURyY0NvbmZpZywKKyAgICAgIGhMb3VkbmVzc0luZm9TZXQsICYocENhbmRpZGF0ZXNTZWxlY3RlZC0+ZGF0YVswXSksIGhJbnN0YW5jZS0+Y29kZWNNb2RlKTsKKworICBpZiAoX2lzRXJyb3IocmV0VmFsKSkgcmV0dXJuIChyZXRWYWwpOworCisgIHJldFZhbCA9IF9zZWxlY3REb3dubWl4TWF0cml4KGhTZWxQcm9jT3V0cHV0LCBoVW5pRHJjQ29uZmlnKTsKKyAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc3RhdGljIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2luaXREZWZhdWx0UGFyYW1zKAorICAgIEhBTkRMRV9TRUxfUFJPQ19JTlBVVCBoU2VsUHJvY0lucHV0KSB7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworCisgIGlmIChoU2VsUHJvY0lucHV0ID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfSU5WQUxJRF9IQU5ETEU7CisKKyAgLyogc3lzdGVtIHBhcmFtZXRlcnMgKi8KKyAgaFNlbFByb2NJbnB1dC0+YmFzZUNoYW5uZWxDb3VudCA9IC0xOworICBoU2VsUHJvY0lucHV0LT5iYXNlTGF5b3V0ID0gLTE7CisgIGhTZWxQcm9jSW5wdXQtPnRhcmdldENvbmZpZ1JlcXVlc3RUeXBlID0gVENSVF9ET1dOTUlYX0lEOworICBoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cyA9IDA7CisKKyAgLyogbG91ZG5lc3Mgbm9ybWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCisgIGhTZWxQcm9jSW5wdXQtPmFsYnVtTW9kZSA9IDA7CisgIGhTZWxQcm9jSW5wdXQtPnBlYWtMaW1pdGVyUHJlc2VudCA9IDA7CisgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbk9uID0gMTsKKyAgaFNlbFByb2NJbnB1dC0+dGFyZ2V0TG91ZG5lc3MgPSBGTDJGWENPTlNUX0RCTCgtMjQuMGYgLyAoZmxvYXQpKDEgPDwgNykpOworICBoU2VsUHJvY0lucHV0LT5sb3VkbmVzc0RldmlhdGlvbk1heCA9IERFRkFVTFRfTE9VRE5FU1NfREVWSUFUSU9OX01BWDsKKyAgaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NNZWFzdXJlbWVudE1ldGhvZCA9IE1EUl9ERUZBVUxUOworICBoU2VsUHJvY0lucHV0LT5sb3VkbmVzc01lYXN1cmVtZW50U3lzdGVtID0gTVNSX0RFRkFVTFQ7CisgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTWVhc3VyZW1lbnRQcmVQcm9jID0gTFBSX0RFRkFVTFQ7CisgIGhTZWxQcm9jSW5wdXQtPmRldmljZUN1dE9mZkZyZXF1ZW5jeSA9IDUwMDsKKyAgaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiTWF4ID0KKyAgICAgIChGSVhQX0RCTClNQVhWQUxfREJMOyAvKiBpbmZpbml0eSBhcyBkZWZhdWx0ICovCisgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5Nb2RpZmljYXRpb25EYiA9IChGSVhQX0RCTCkwOworICBoU2VsUHJvY0lucHV0LT5vdXRwdXRQZWFrTGV2ZWxNYXggPSAoRklYUF9EQkwpMDsKKyAgaWYgKGhTZWxQcm9jSW5wdXQtPnBlYWtMaW1pdGVyUHJlc2VudCA9PSAxKSB7CisgICAgaFNlbFByb2NJbnB1dC0+b3V0cHV0UGVha0xldmVsTWF4ID0gRkwyRlhDT05TVF9EQkwoNi4wZiAvIChmbG9hdCkoMSA8PCA3KSk7CisgIH0KKworICAvKiBkeW5hbWljIHJhbmdlIGNvbnRyb2wgcGFyYW1ldGVycyAqLworICBoU2VsUHJvY0lucHV0LT5keW5hbWljUmFuZ2VDb250cm9sT24gPSAxOworCisgIGhTZWxQcm9jSW5wdXQtPm51bURyY0ZlYXR1cmVSZXF1ZXN0cyA9IDA7CisKKyAgLyogb3RoZXIgcGFyYW1ldGVycyAqLworICBoU2VsUHJvY0lucHV0LT5ib29zdCA9IEZMMkZYQ09OU1RfU0dMKDEuZiAvIChmbG9hdCkoMSA8PCAxKSk7CisgIGhTZWxQcm9jSW5wdXQtPmNvbXByZXNzID0gRkwyRlhDT05TVF9TR0woMS5mIC8gKGZsb2F0KSgxIDw8IDEpKTsKKyAgaFNlbFByb2NJbnB1dC0+ZHJjQ2hhcmFjdGVyaXN0aWNUYXJnZXQgPSAwOworCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9pbml0Q29kZWNNb2RlUGFyYW1zKAorICAgIEhBTkRMRV9TRUxfUFJPQ19JTlBVVCBoU2VsUHJvY0lucHV0LCBjb25zdCBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKworICBpZiAoaFNlbFByb2NJbnB1dCA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX0lOVkFMSURfSEFORExFOworCisgIHN3aXRjaCAoY29kZWNNb2RlKSB7CisgICAgY2FzZSBTRUxfUFJPQ19NUEVHX0hfM0RBOgorICAgICAgaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NEZXZpYXRpb25NYXggPSAwOworICAgICAgaFNlbFByb2NJbnB1dC0+cGVha0xpbWl0ZXJQcmVzZW50ID0gMTsgLyogcGVhayBsaW1pdGVyIGlzIG1hbmRhdG9yeSAqLworICAgICAgLyogVGhlIHBlYWsgbGltaXRlciBhbHNvIGhhcyB0byBjYXRjaCBvdmVyc2hvb3RzIGR1ZSB0byB1c2VyCisgICAgICBpbnRlcmFjdGl2aXR5LCBkb3dubWl4aW5nIGV0Yy4gVGhlcmVmb3JlIHRoZSBtYXhpbXVtIG91dHB1dCBwZWFrIGxldmVsIGlzCisgICAgICByZWR1Y2VkIHRvIDAgZEIuICovCisgICAgICBoU2VsUHJvY0lucHV0LT5vdXRwdXRQZWFrTGV2ZWxNYXggPSAoRklYUF9EQkwpMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VMX1BST0NfTVBFR180X0FBQzoKKyAgICBjYXNlIFNFTF9QUk9DX01QRUdfRF9VU0FDOgorICAgICAgaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NEZXZpYXRpb25NYXggPSBERUZBVUxUX0xPVURORVNTX0RFVklBVElPTl9NQVg7CisgICAgICBoU2VsUHJvY0lucHV0LT5wZWFrTGltaXRlclByZXNlbnQgPSAxOworICAgICAgLyogQSBwZWFrIGxpbWl0ZXIgaXMgcHJlc2VudCBhdCB0aGUgZW5kIG9mIHRoZSBkZWNvZGVyLCB0aGVyZWZvcmUgd2UgY2FuCisgICAgICAgKiBhbGxvdyBmb3IgYSBtYXhpbXVtIG91dHB1dCBwZWFrIGxldmVsIGdyZWF0ZXIgdGhhbiBmdWxsIHNjYWxlCisgICAgICAgKi8KKyAgICAgIGhTZWxQcm9jSW5wdXQtPm91dHB1dFBlYWtMZXZlbE1heCA9CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoNi4wZiAvIChmbG9hdCkoMSA8PCA3KSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFTF9QUk9DX1RFU1RfVElNRV9ET01BSU46CisgICAgY2FzZSBTRUxfUFJPQ19URVNUX1FNRl9ET01BSU46CisgICAgY2FzZSBTRUxfUFJPQ19URVNUX1NURlRfRE9NQUlOOgorICAgICAgLyogZm9yIHRlc3RpbmcsIGFkYXB0IHRvIGRlZmF1bHQgc2V0dGluZ3MgaW4gcmVmZXJlbmNlIHNvZnR3YXJlICovCisgICAgICBoU2VsUHJvY0lucHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25PbiA9IDA7CisgICAgICBoU2VsUHJvY0lucHV0LT5keW5hbWljUmFuZ2VDb250cm9sT24gPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUxfUFJPQ19DT0RFQ19NT0RFX1VOREVGSU5FRDoKKyAgICBkZWZhdWx0OgorICAgICAgaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NEZXZpYXRpb25NYXggPSBERUZBVUxUX0xPVURORVNTX0RFVklBVElPTl9NQVg7CisgICAgICBoU2VsUHJvY0lucHV0LT5wZWFrTGltaXRlclByZXNlbnQgPSAwOworICB9CisKKyAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2NoYW5uZWxMYXlvdXRUb0Rvd25taXhJZE1hcHBpbmcoCisgICAgSEFORExFX1NFTF9QUk9DX0lOUFVUIGhTZWxQcm9jSW5wdXQsIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnKSB7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworCisgIERPV05NSVhfSU5TVFJVQ1RJT05TKiBwRG93biA9IE5VTEw7CisKKyAgaW50IGk7CisKKyAgaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHMgPSAwOworCisgIHN3aXRjaCAoaFNlbFByb2NJbnB1dC0+dGFyZ2V0Q29uZmlnUmVxdWVzdFR5cGUpIHsKKyAgICBjYXNlIFRDUlRfRE9XTk1JWF9JRDoKKyAgICAgIGlmIChoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cyA9PSAwKSB7CisgICAgICAgIGhTZWxQcm9jSW5wdXQtPmRvd25taXhJZFJlcXVlc3RlZFswXSA9IDA7CisgICAgICAgIGhTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzID0gMTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRDUlRfVEFSR0VUX0xBWU9VVDoKKyAgICAgIGlmIChoU2VsUHJvY0lucHV0LT50YXJnZXRMYXlvdXRSZXF1ZXN0ZWQgPT0gaFNlbFByb2NJbnB1dC0+YmFzZUxheW91dCkgeworICAgICAgICBoU2VsUHJvY0lucHV0LT5kb3dubWl4SWRSZXF1ZXN0ZWRbMF0gPSAwOworICAgICAgICBoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cyA9IDE7CisgICAgICB9CisKKyAgICAgIGlmIChoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cyA9PSAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnQ7IGkrKykgeworICAgICAgICAgIHBEb3duID0gJihoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zW2ldKTsKKworICAgICAgICAgIGlmIChoU2VsUHJvY0lucHV0LT50YXJnZXRMYXlvdXRSZXF1ZXN0ZWQgPT0gcERvd24tPnRhcmdldExheW91dCkgeworICAgICAgICAgICAgaFNlbFByb2NJbnB1dAorICAgICAgICAgICAgICAgIC0+ZG93bm1peElkUmVxdWVzdGVkW2hTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzXSA9CisgICAgICAgICAgICAgICAgcERvd24tPmRvd25taXhJZDsKKyAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChoU2VsUHJvY0lucHV0LT5iYXNlTGF5b3V0ID09IC0xKSB7CisgICAgICAgIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19XQVJOSU5HOworICAgICAgfQorCisgICAgICBpZiAoaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHMgPT0gMCkgeworICAgICAgICBoU2VsUHJvY0lucHV0LT5kb3dubWl4SWRSZXF1ZXN0ZWRbMF0gPSAwOworICAgICAgICBoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cyA9IDE7CisgICAgICAgIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19XQVJOSU5HOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgVENSVF9UQVJHRVRfQ0hBTk5FTF9DT1VOVDoKKyAgICAgIGlmIChoU2VsUHJvY0lucHV0LT50YXJnZXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgPT0KKyAgICAgICAgICBoU2VsUHJvY0lucHV0LT5iYXNlQ2hhbm5lbENvdW50KSB7CisgICAgICAgIGhTZWxQcm9jSW5wdXQtPmRvd25taXhJZFJlcXVlc3RlZFswXSA9IDA7CisgICAgICAgIGhTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzID0gMTsKKyAgICAgIH0KKworICAgICAgaWYgKGhTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzID09IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudDsgaSsrKSB7CisgICAgICAgICAgcERvd24gPSAmKGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNbaV0pOworCisgICAgICAgICAgaWYgKGhTZWxQcm9jSW5wdXQtPnRhcmdldENoYW5uZWxDb3VudFJlcXVlc3RlZCA9PQorICAgICAgICAgICAgICBwRG93bi0+dGFyZ2V0Q2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICBoU2VsUHJvY0lucHV0CisgICAgICAgICAgICAgICAgLT5kb3dubWl4SWRSZXF1ZXN0ZWRbaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHNdID0KKyAgICAgICAgICAgICAgICBwRG93bi0+ZG93bm1peElkOworICAgICAgICAgICAgaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHMrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGhTZWxQcm9jSW5wdXQtPmJhc2VDaGFubmVsQ291bnQgPT0gLTEpIHsKKyAgICAgICAgcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1dBUk5JTkc7CisgICAgICB9CisKKyAgICAgIGlmIChoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cyA9PSAwKSB7CisgICAgICAgIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19XQVJOSU5HOworICAgICAgICBoU2VsUHJvY0lucHV0LT5kb3dubWl4SWRSZXF1ZXN0ZWRbMF0gPSAwOworICAgICAgICBoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cyA9IDE7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICB9CisKKyAgcmV0dXJuIHJldFZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE5vdGU6IE51bWJlcmluZyBvZiBEUkMgcHJlLXNlbGVjdGlvbiBzdGVwcyBhY2NvcmRpbmcgdG8gTVBFRy1EIFBhcnQtNCBEUkMKKyAqIEFtZDEgKi8KKworLyogIzE6IERvd25taXhJZCBvZiBEUkMgc2V0IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBkb3dubWl4SWQuCisgICAjMjogT3V0cHV0IGNoYW5uZWwgbGF5b3V0IG9mIERSQyBzZXQgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIGxheW91dC4KKyAgICMzOiBDaGFubmVsIGNvdW50IG9mIERSQyBzZXQgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIGNoYW5uZWwgY291bnQuICovCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfcHJlU2VsZWN0aW9uUmVxdWlyZW1lbnQxMjMoCisgICAgaW50IG5SZXF1ZXN0ZWREb3dubWl4SWQsIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uVW5pRHJjLAorICAgIGludCogcE1hdGNoRm91bmQpIHsKKyAgaW50IGk7CisgICpwTWF0Y2hGb3VuZCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IHBEcmNJbnN0cnVjdGlvblVuaURyYy0+ZG93bm1peElkQ291bnQ7IGkrKykgeworICAgIGlmICgocERyY0luc3RydWN0aW9uVW5pRHJjLT5kb3dubWl4SWRbaV0gPT0gblJlcXVlc3RlZERvd25taXhJZCkgfHwKKyAgICAgICAgKHBEcmNJbnN0cnVjdGlvblVuaURyYy0+ZG93bm1peElkW2ldID09IERPV05NSVhfSURfQU5ZX0RPV05NSVgpIHx8CisgICAgICAgICgocERyY0luc3RydWN0aW9uVW5pRHJjLT5kb3dubWl4SWRbaV0gPT0gRE9XTk1JWF9JRF9CQVNFX0xBWU9VVCkgJiYKKyAgICAgICAgIChwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPmRyY1NldElkID4gMCkpKSB7CisgICAgICAqcE1hdGNoRm91bmQgPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworLyogIzQ6IFRoZSBEUkMgc2V0IGlzIG5vdCBhICJGYWRlLSIgb3IgIkR1Y2tpbmctIiBvbmx5IERSQyBzZXQuICovCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfcHJlU2VsZWN0aW9uUmVxdWlyZW1lbnQ0KAorICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uLCBpbnQgbkR5bmFtaWNSYW5nZUNvbnRyb2xPbiwKKyAgICBpbnQqIHBNYXRjaEZvdW5kKSB7CisgICpwTWF0Y2hGb3VuZCA9IDA7CisKKyAgaWYgKG5EeW5hbWljUmFuZ2VDb250cm9sT24gPT0gMSkgeworICAgIGlmICgocERyY0luc3RydWN0aW9uLT5kcmNTZXRFZmZlY3QgIT0gRUJfRkFERSkgJiYKKyAgICAgICAgKHBEcmNJbnN0cnVjdGlvbi0+ZHJjU2V0RWZmZWN0ICE9IEVCX0RVQ0tfT1RIRVIpICYmCisgICAgICAgIChwRHJjSW5zdHJ1Y3Rpb24tPmRyY1NldEVmZmVjdCAhPSBFQl9EVUNLX1NFTEYpICYmCisgICAgICAgIChwRHJjSW5zdHJ1Y3Rpb24tPmRyY1NldEVmZmVjdCAhPSAwIHx8IHBEcmNJbnN0cnVjdGlvbi0+ZHJjU2V0SWQgPCAwKSkgeworICAgICAgKnBNYXRjaEZvdW5kID0gMTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgKnBNYXRjaEZvdW5kID0gMTsKKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKKy8qICM1OiBUaGUgbnVtYmVyIG9mIERSQyBiYW5kcyBpcyBzdXBwb3J0ZWQuICovCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfcHJlU2VsZWN0aW9uUmVxdWlyZW1lbnQ1KAorICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uVW5pRHJjLAorICAgIERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQyogcENvZWYsIGludCogcE1hdGNoRm91bmQpIHsKKyAgaW50IGk7CisKKyAgKnBNYXRjaEZvdW5kID0gMTsKKworICBpZiAocENvZWYgPT0gTlVMTCkgLyogY2hlY2sgZm9yIHBhcmFtZXRyaWNEUkMgKi8KKyAgeworICAgICpwTWF0Y2hGb3VuZCA9IDE7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPm5EcmNDaGFubmVsR3JvdXBzOyBpKyspIHsKKyAgICBpbnQgaW5kZXhEcmNDb2VmZiA9IHBEcmNJbnN0cnVjdGlvblVuaURyYy0+Z2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwW2ldOworICAgIGludCBiYW5kQ291bnQgPSAwOworCisgICAgaWYgKGluZGV4RHJjQ29lZmYgPiBwQ29lZi0+Z2FpblNldENvdW50IC0gMSkgLyogY2hlY2sgZm9yIHBhcmFtZXRyaWNEUkMgKi8KKyAgICB7CisgICAgICAqcE1hdGNoRm91bmQgPSAxOworICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgICB9CisKKyAgICBHQUlOX1NFVCogZ2FpblNldCA9ICYocENvZWYtPmdhaW5TZXRbaW5kZXhEcmNDb2VmZl0pOworICAgIGJhbmRDb3VudCA9IGdhaW5TZXQtPmJhbmRDb3VudDsKKworICAgIGlmIChiYW5kQ291bnQgPiA0KSB7CisgICAgICAqcE1hdGNoRm91bmQgPSAwOworICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKKy8qICM2OiBJbmRlcGVuZGVudCB1c2Ugb2YgRFJDIHNldCBpcyBwZXJtaXR0ZWQuKi8KK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9wcmVTZWxlY3Rpb25SZXF1aXJlbWVudDYoCisgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsIGludCogcE1hdGNoRm91bmQpIHsKKyAgKnBNYXRjaEZvdW5kID0gMDsKKworICBpZiAoKChwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPmRlcGVuZHNPbkRyY1NldFByZXNlbnQgPT0gMCkgJiYKKyAgICAgICAocERyY0luc3RydWN0aW9uVW5pRHJjLT5ub0luZGVwZW5kZW50VXNlID09IDApKSB8fAorICAgICAgKHBEcmNJbnN0cnVjdGlvblVuaURyYy0+ZGVwZW5kc09uRHJjU2V0UHJlc2VudCA9PSAxKSkgeworICAgICpwTWF0Y2hGb3VuZCA9IDE7CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCisvKiAjNzogRFJDIHNldHMgdGhhdCByZXF1aXJlIEVRIGFyZSBvbmx5IHBlcm1pdHRlZCBpZiBFUSBpcyBzdXBwb3J0ZWQuICovCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfcHJlU2VsZWN0aW9uUmVxdWlyZW1lbnQ3KAorICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uVW5pRHJjLCBpbnQqIHBNYXRjaEZvdW5kKSB7CisgICpwTWF0Y2hGb3VuZCA9IDE7CisKKyAgaWYgKHBEcmNJbnN0cnVjdGlvblVuaURyYy0+cmVxdWlyZXNFcSkgeworICAgIC8qIEVRIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAqcE1hdGNoRm91bmQgPSAwOworICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworc3RhdGljIHZvaWQgX3NldFNlbGVjdGlvbkRhdGFJbmZvKERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbG91ZG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYk1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBsb3VkbmVzc0RldmlhdGlvbk1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBzaWduYWxQZWFrTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgb3V0cHV0UGVha0xldmVsTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcHBseUFkanVzdG1lbnQpIHsKKyAgRklYUF9EQkwgYWRqdXN0bWVudCA9IDA7CisKKyAgaWYgKGFwcGx5QWRqdXN0bWVudCkgeworICAgIGFkanVzdG1lbnQgPQorICAgICAgICBmTWF4KChGSVhQX0RCTCkwLCBzaWduYWxQZWFrTGV2ZWwgKyBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGVha0xldmVsTWF4KTsKKyAgICBhZGp1c3RtZW50ID0gZk1pbihhZGp1c3RtZW50LCBmTWF4KChGSVhQX0RCTCkwLCBsb3VkbmVzc0RldmlhdGlvbk1heCkpOworICB9CisKKyAgcERhdGEtPmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYkFkanVzdGVkID0gZk1pbigKKyAgICAgIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiAtIGFkanVzdG1lbnQsIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYk1heCk7CisgIHBEYXRhLT5vdXRwdXRMb3VkbmVzcyA9IGxvdWRuZXNzICsgcERhdGEtPmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYkFkanVzdGVkOworICBwRGF0YS0+b3V0cHV0UGVha0xldmVsID0KKyAgICAgIHNpZ25hbFBlYWtMZXZlbCArIHBEYXRhLT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGJBZGp1c3RlZDsKK30KKworc3RhdGljIGludCBfdGFyZ2V0TG91ZG5lc3NJblJhbmdlKAorICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uVW5pRHJjLCBGSVhQX0RCTCB0YXJnZXRMb3VkbmVzcykgeworICBpbnQgcmV0VmFsID0gMDsKKworICBGSVhQX0RCTCBkcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlVXBwZXIgPQorICAgICAgKChGSVhQX0RCTClwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPmRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlcikKKyAgICAgIDw8IChERlJBQ1RfQklUUyAtIDEgLSA3KTsKKyAgRklYUF9EQkwgZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZUxvd2VyID0KKyAgICAgICgoRklYUF9EQkwpcERyY0luc3RydWN0aW9uVW5pRHJjLT5kcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXIpCisgICAgICA8PCAoREZSQUNUX0JJVFMgLSAxIC0gNyk7CisKKyAgaWYgKHBEcmNJbnN0cnVjdGlvblVuaURyYy0+ZHJjU2V0VGFyZ2V0TG91ZG5lc3NQcmVzZW50ICYmCisgICAgICBkcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlVXBwZXIgPj0gdGFyZ2V0TG91ZG5lc3MgJiYKKyAgICAgIGRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlciA8IHRhcmdldExvdWRuZXNzKSB7CisgICAgcmV0VmFsID0gMTsKKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisKKy8qICM4OiBUaGUgcmFuZ2Ugb2YgdGhlIHRhcmdldCBsb3VkbmVzcyBzcGVjaWZpZWQgZm9yIGEgRFJDIHNldCBoYXMgdG8gaW5jbHVkZQorICogdGhlIHJlcXVlc3RlZCBkZWNvZGVyIHRhcmdldCBsb3VkbmVzcy4gKi8KK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9wcmVTZWxlY3Rpb25SZXF1aXJlbWVudDgoCisgICAgU0VMX1BST0NfSU5QVVQqIGhTZWxQcm9jSW5wdXQsIGludCBkb3dubWl4SWRJbmRleCwKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBEcmNJbnN0cnVjdGlvblVuaURyYywKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1NlbGVjdGVkLCBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgaW50IGV4cGxpY2l0UGVha0luZm9ybWF0aW9uUHJlc2VudDsKKyAgRklYUF9EQkwgc2lnbmFsUGVha0xldmVsOworICBpbnQgYWRkVG9DYW5kaWRhdGUgPSAwOworCisgIEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYjsKKyAgRklYUF9EQkwgbG91ZG5lc3M7CisKKyAgRklYUF9EQkwgbG91ZG5lc3NEZXZpYXRpb25NYXggPQorICAgICAgKChGSVhQX0RCTCloU2VsUHJvY0lucHV0LT5sb3VkbmVzc0RldmlhdGlvbk1heCkgPDwgKERGUkFDVF9CSVRTIC0gMSAtIDcpOworICA7CisKKyAgaWYgKGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbk9uKSB7CisgICAgcmV0VmFsID0gX2dldExvdWRuZXNzKGhMb3VkbmVzc0luZm9TZXQsIGhTZWxQcm9jSW5wdXQtPmFsYnVtTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NNZWFzdXJlbWVudE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NNZWFzdXJlbWVudFN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaFNlbFByb2NJbnB1dC0+dGFyZ2V0TG91ZG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEcmNJbnN0cnVjdGlvblVuaURyYy0+ZHJjU2V0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPmRvd25taXhJZFJlcXVlc3RlZFtkb3dubWl4SWRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIsICZsb3VkbmVzcyk7CisgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICB9IGVsc2UgeworICAgIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiA9IChGSVhQX0RCTCkwOworICAgIGxvdWRuZXNzID0gVU5ERUZJTkVEX0xPVURORVNTX1ZBTFVFOworICB9CisKKyAgcmV0VmFsID0gX2dldFNpZ25hbFBlYWtMZXZlbCgKKyAgICAgIGhTZWxQcm9jSW5wdXQsIGhVbmlEcmNDb25maWcsIGhMb3VkbmVzc0luZm9TZXQsIHBEcmNJbnN0cnVjdGlvblVuaURyYywKKyAgICAgIGhTZWxQcm9jSW5wdXQtPmRvd25taXhJZFJlcXVlc3RlZFtkb3dubWl4SWRJbmRleF0sCisgICAgICAmZXhwbGljaXRQZWFrSW5mb3JtYXRpb25QcmVzZW50LCAmc2lnbmFsUGVha0xldmVsLCBjb2RlY01vZGUKKworICApOworICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisKKyAgaWYgKGhTZWxQcm9jSW5wdXQtPmR5bmFtaWNSYW5nZUNvbnRyb2xPbikgeworICAgIGlmIChleHBsaWNpdFBlYWtJbmZvcm1hdGlvblByZXNlbnQgPT0gMCkgeworICAgICAgaWYgKHBEcmNJbnN0cnVjdGlvblVuaURyYy0+ZHJjU2V0VGFyZ2V0TG91ZG5lc3NQcmVzZW50ICYmCisgICAgICAgICAgKChoU2VsUHJvY0lucHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25PbiAmJgorICAgICAgICAgICAgX3RhcmdldExvdWRuZXNzSW5SYW5nZShwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPnRhcmdldExvdWRuZXNzKSkgfHwKKyAgICAgICAgICAgIWhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbk9uKSkgeworICAgICAgICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBEYXRhID0KKyAgICAgICAgICAgIF9kcmNkZWNfc2VsZWN0aW9uX2FkZE5ldyhwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgICAgaWYgKHBEYXRhID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgICAgIF9zZXRTZWxlY3Rpb25EYXRhSW5mbyhwRGF0YSwgbG91ZG5lc3MsIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYk1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdWRuZXNzRGV2aWF0aW9uTWF4LCBzaWduYWxQZWFrTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT5vdXRwdXRQZWFrTGV2ZWxNYXgsIDApOworICAgICAgICBwRGF0YS0+ZG93bm1peElkUmVxdWVzdEluZGV4ID0gZG93bm1peElkSW5kZXg7CisgICAgICAgIHBEYXRhLT5wSW5zdCA9IHBEcmNJbnN0cnVjdGlvblVuaURyYzsKKyAgICAgICAgcERhdGEtPnNlbGVjdGlvbkZsYWcgPQorICAgICAgICAgICAgMTsgLyogc2lnbmFsIHByZS1zZWxlY3Rpb24gc3RlcCBkZWFsaW5nIHdpdGggZHJjU2V0VGFyZ2V0TG91ZG5lc3MgKi8KKworICAgICAgICBpZiAoaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NOb3JtYWxpemF0aW9uT24pIHsKKyAgICAgICAgICBwRGF0YS0+b3V0cHV0UGVha0xldmVsID0KKyAgICAgICAgICAgICAgaFNlbFByb2NJbnB1dC0+dGFyZ2V0TG91ZG5lc3MgLQorICAgICAgICAgICAgICAoKChGSVhQX0RCTClwRGF0YS0+cEluc3QtPmRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlcikKKyAgICAgICAgICAgICAgIDw8IChERlJBQ1RfQklUUyAtIDEgLSA3KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcERhdGEtPm91dHB1dFBlYWtMZXZlbCA9IChGSVhQX0RCTCkwOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKCFoU2VsUHJvY0lucHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25PbikgfHwKKyAgICAgICAgICAgICghcERyY0luc3RydWN0aW9uVW5pRHJjLT5kcmNTZXRUYXJnZXRMb3VkbmVzc1ByZXNlbnQpIHx8CisgICAgICAgICAgICAoaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NOb3JtYWxpemF0aW9uT24gJiYKKyAgICAgICAgICAgICBfdGFyZ2V0TG91ZG5lc3NJblJhbmdlKHBEcmNJbnN0cnVjdGlvblVuaURyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPnRhcmdldExvdWRuZXNzKSkpIHsKKyAgICAgICAgICBhZGRUb0NhbmRpZGF0ZSA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgYWRkVG9DYW5kaWRhdGUgPSAxOworICAgIH0KKworICAgIGlmIChhZGRUb0NhbmRpZGF0ZSkgeworICAgICAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwRGF0YSA9CisgICAgICAgICAgX2RyY2RlY19zZWxlY3Rpb25fYWRkTmV3KHBDYW5kaWRhdGVzUG90ZW50aWFsKTsKKyAgICAgIGlmIChwRGF0YSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgICAgX3NldFNlbGVjdGlvbkRhdGFJbmZvKHBEYXRhLCBsb3VkbmVzcywgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYk1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3VkbmVzc0RldmlhdGlvbk1heCwgc2lnbmFsUGVha0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPm91dHB1dFBlYWtMZXZlbE1heCwgMCk7CisgICAgICBwRGF0YS0+ZG93bm1peElkUmVxdWVzdEluZGV4ID0gZG93bm1peElkSW5kZXg7CisgICAgICBwRGF0YS0+cEluc3QgPSBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmM7CisgICAgICBwRGF0YS0+c2VsZWN0aW9uRmxhZyA9IDA7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPmRyY1NldElkIDwgMCkgeworICAgICAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwRGF0YSA9CisgICAgICAgICAgX2RyY2RlY19zZWxlY3Rpb25fYWRkTmV3KHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgaWYgKHBEYXRhID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgICBfc2V0U2VsZWN0aW9uRGF0YUluZm8ocERhdGEsIGxvdWRuZXNzLCBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdWRuZXNzRGV2aWF0aW9uTWF4LCBzaWduYWxQZWFrTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNlbFByb2NJbnB1dC0+b3V0cHV0UGVha0xldmVsTWF4LCAxKTsKKworICAgICAgcERhdGEtPmRvd25taXhJZFJlcXVlc3RJbmRleCA9IGRvd25taXhJZEluZGV4OworICAgICAgcERhdGEtPnBJbnN0ID0gcERyY0luc3RydWN0aW9uVW5pRHJjOworICAgICAgcERhdGEtPnNlbGVjdGlvbkZsYWcgPSAwOworICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKKy8qICM5OiBDbGlwcGluZyBpcyBtaW5pbWl6ZWQuICovCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfcHJlU2VsZWN0aW9uUmVxdWlyZW1lbnQ5KAorICAgIFNFTF9QUk9DX0lOUFVUKiBoU2VsUHJvY0lucHV0LCBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBDYW5kaWRhdGUgPQorICAgICAgICBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICBpZiAocENhbmRpZGF0ZS0+b3V0cHV0UGVha0xldmVsIDw9IGhTZWxQcm9jSW5wdXQtPm91dHB1dFBlYWtMZXZlbE1heCkgeworICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2FkZChwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICB9CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHJjU2V0UHJlU2VsZWN0aW9uU2luZ2xlSW5zdHJ1Y3Rpb24oCisgICAgU0VMX1BST0NfSU5QVVQqIGhTZWxQcm9jSW5wdXQsIGludCBkb3dubWl4SWRJbmRleCwKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBEcmNJbnN0cnVjdGlvblVuaURyYywKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1NlbGVjdGVkLCBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgaW50IG1hdGNoRm91bmQgPSAwOworICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMqIHBDb2VmID0KKyAgICAgIHNlbGVjdERyY0NvZWZmaWNpZW50cyhoVW5pRHJjQ29uZmlnLCBMT0NBVElPTl9TRUxFQ1RFRCk7CisKKyAgcmV0VmFsID0gX3ByZVNlbGVjdGlvblJlcXVpcmVtZW50MTIzKAorICAgICAgaFNlbFByb2NJbnB1dC0+ZG93bm1peElkUmVxdWVzdGVkW2Rvd25taXhJZEluZGV4XSwgcERyY0luc3RydWN0aW9uVW5pRHJjLAorICAgICAgJm1hdGNoRm91bmQpOworCisgIGlmICghcmV0VmFsICYmIG1hdGNoRm91bmQpCisgICAgcmV0VmFsID0gX3ByZVNlbGVjdGlvblJlcXVpcmVtZW50NChwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT5keW5hbWljUmFuZ2VDb250cm9sT24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF0Y2hGb3VuZCk7CisKKyAgaWYgKCFyZXRWYWwgJiYgbWF0Y2hGb3VuZCkKKyAgICByZXRWYWwgPQorICAgICAgICBfcHJlU2VsZWN0aW9uUmVxdWlyZW1lbnQ1KHBEcmNJbnN0cnVjdGlvblVuaURyYywgcENvZWYsICZtYXRjaEZvdW5kKTsKKworICBpZiAoIXJldFZhbCAmJiBtYXRjaEZvdW5kKQorICAgIHJldFZhbCA9IF9wcmVTZWxlY3Rpb25SZXF1aXJlbWVudDYocERyY0luc3RydWN0aW9uVW5pRHJjLCAmbWF0Y2hGb3VuZCk7CisKKyAgaWYgKCFyZXRWYWwgJiYgbWF0Y2hGb3VuZCkKKyAgICByZXRWYWwgPSBfcHJlU2VsZWN0aW9uUmVxdWlyZW1lbnQ3KHBEcmNJbnN0cnVjdGlvblVuaURyYywgJm1hdGNoRm91bmQpOworCisgIGlmICghcmV0VmFsICYmIG1hdGNoRm91bmQpCisgICAgcmV0VmFsID0gX3ByZVNlbGVjdGlvblJlcXVpcmVtZW50OCgKKyAgICAgICAgaFNlbFByb2NJbnB1dCwgZG93bm1peElkSW5kZXgsIGhVbmlEcmNDb25maWcsIGhMb3VkbmVzc0luZm9TZXQsCisgICAgICAgIHBEcmNJbnN0cnVjdGlvblVuaURyYywgcENhbmRpZGF0ZXNQb3RlbnRpYWwsIHBDYW5kaWRhdGVzU2VsZWN0ZWQsCisgICAgICAgIGNvZGVjTW9kZSk7CisKKyAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2RyY1NldFNlbGVjdGlvbkFkZENhbmRpZGF0ZXMoCisgICAgU0VMX1BST0NfSU5QVVQqIGhTZWxQcm9jSW5wdXQsIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgIGludCBuSGl0Q291bnQgPSAwOworICBpbnQgaTsKKworICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBDYW5kaWRhdGUgPSBOVUxMOworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBEcmNJbnN0cnVjdGlvblVuaURyYyA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihwQ2FuZGlkYXRlc1BvdGVudGlhbCk7IGkrKykgeworICAgIHBDYW5kaWRhdGUgPSBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMgPSBwQ2FuZGlkYXRlLT5wSW5zdDsKKworICAgIGlmIChfdGFyZ2V0TG91ZG5lc3NJblJhbmdlKHBEcmNJbnN0cnVjdGlvblVuaURyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT50YXJnZXRMb3VkbmVzcykpIHsKKyAgICAgIG5IaXRDb3VudCsrOworICAgIH0KKyAgfQorCisgIGlmIChuSGl0Q291bnQgIT0gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICAgIHBDYW5kaWRhdGUgPSBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgICAgcERyY0luc3RydWN0aW9uVW5pRHJjID0gcENhbmRpZGF0ZS0+cEluc3Q7CisKKyAgICAgIGlmIChfdGFyZ2V0TG91ZG5lc3NJblJhbmdlKHBEcmNJbnN0cnVjdGlvblVuaURyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPnRhcmdldExvdWRuZXNzKSkgeworICAgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fYWRkKHBDYW5kaWRhdGVzU2VsZWN0ZWQsIHBDYW5kaWRhdGUpID09IE5VTEwpCisgICAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIEZJWFBfREJMIGxvd2VzdFBlYWtMZXZlbCA9IE1BWFZBTF9EQkw7IC8qIGUgPSA3ICovCisgICAgRklYUF9EQkwgcGVha0xldmVsID0gMDsgICAgICAgICAgICAgICAgLyogZSA9IDcgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICAgIHBDYW5kaWRhdGUgPSBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgICAgcGVha0xldmVsID0gcENhbmRpZGF0ZS0+b3V0cHV0UGVha0xldmVsOworCisgICAgICBpZiAocGVha0xldmVsIDwgbG93ZXN0UGVha0xldmVsKSB7CisgICAgICAgIGxvd2VzdFBlYWtMZXZlbCA9IHBlYWtMZXZlbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhZGQgYWxsIHdpdGggbG93ZXN0IHBlYWsgbGV2ZWwgb3IgbWF4IDFkQiBhYm92ZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICAgIEZJWFBfREJMIGxvdWRuZXNzRGV2aWF0aW9uTWF4ID0KKyAgICAgICAgICAoKEZJWFBfREJMKWhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzRGV2aWF0aW9uTWF4KQorICAgICAgICAgIDw8IChERlJBQ1RfQklUUyAtIDEgLSA3KTsgLyogZSA9IDcgKi8KKworICAgICAgcENhbmRpZGF0ZSA9IF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KHBDYW5kaWRhdGVzUG90ZW50aWFsLCBpKTsKKyAgICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgICBwZWFrTGV2ZWwgPSBwQ2FuZGlkYXRlLT5vdXRwdXRQZWFrTGV2ZWw7CisKKyAgICAgIGlmIChwZWFrTGV2ZWwgPT0gbG93ZXN0UGVha0xldmVsIHx8CisgICAgICAgICAgcGVha0xldmVsIDw9CisgICAgICAgICAgICAgIGxvd2VzdFBlYWtMZXZlbCArIEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgNykpKSB7CisgICAgICAgIEZJWFBfREJMIGFkanVzdG1lbnQgPQorICAgICAgICAgICAgZk1heCgoRklYUF9EQkwpMCwgcGVha0xldmVsIC0gaFNlbFByb2NJbnB1dC0+b3V0cHV0UGVha0xldmVsTWF4KTsKKyAgICAgICAgYWRqdXN0bWVudCA9IGZNaW4oYWRqdXN0bWVudCwgZk1heCgoRklYUF9EQkwpMCwgbG91ZG5lc3NEZXZpYXRpb25NYXgpKTsKKworICAgICAgICBwQ2FuZGlkYXRlLT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGJBZGp1c3RlZCAtPSBhZGp1c3RtZW50OworICAgICAgICBwQ2FuZGlkYXRlLT5vdXRwdXRQZWFrTGV2ZWwgLT0gYWRqdXN0bWVudDsKKyAgICAgICAgcENhbmRpZGF0ZS0+b3V0cHV0TG91ZG5lc3MgLT0gYWRqdXN0bWVudDsKKyAgICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2FkZChwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9kZXBlbmRlbnREcmNJbnN0cnVjdGlvbigKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCwKKyAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqKiBwcERyY0luc3RydWN0aW9uc0RlcGVuZGVudCkgeworICBpbnQgaTsKKyAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwRGVwZW5kZW50RHJjID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQ7IGkrKykgeworICAgIHBEZXBlbmRlbnREcmMgPQorICAgICAgICAoRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKikmKGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXSk7CisKKyAgICBpZiAocERlcGVuZGVudERyYy0+ZHJjU2V0SWQgPT0gcEluc3QtPmRlcGVuZHNPbkRyY1NldCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGkgPT0gaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQpIHsKKyAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgfQorCisgIGlmIChwRGVwZW5kZW50RHJjLT5kZXBlbmRzT25EcmNTZXRQcmVzZW50ID09IDEpIHsKKyAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgfQorCisgICpwcERyY0luc3RydWN0aW9uc0RlcGVuZGVudCA9IHBEZXBlbmRlbnREcmM7CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3NlbGVjdERyY1NldEVmZmVjdE5vbmUoCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihwQ2FuZGlkYXRlc1BvdGVudGlhbCk7IGkrKykgeworICAgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcENhbmRpZGF0ZSA9CisgICAgICAgIF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KHBDYW5kaWRhdGVzUG90ZW50aWFsLCBpKTsKKyAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgIGlmICgocENhbmRpZGF0ZS0+cEluc3QtPmRyY1NldEVmZmVjdCAmIDB4ZmYpID09IDApIHsKKyAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgfQorICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3NlbGVjdFNpbmdsZUVmZmVjdFR5cGUoCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsIERSQ19FRkZFQ1RfVFlQRV9SRVFVRVNUIGVmZmVjdFR5cGUsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBpbnQgaTsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3Q7CisgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uc0RlcGVuZGVudDsKKworICBpZiAoZWZmZWN0VHlwZSA9PSBERVRSX05PTkUpIHsKKyAgICByZXRWYWwgPSBfc2VsZWN0RHJjU2V0RWZmZWN0Tm9uZShoVW5pRHJjQ29uZmlnLCBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgIH0gZWxzZSB7CisgICAgaW50IGVmZmVjdEJpdFBvc2l0aW9uID0gMSA8PCAoZWZmZWN0VHlwZSAtIDEpOworCisgICAgZm9yIChpID0gMDsgaSA8IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihwQ2FuZGlkYXRlc1BvdGVudGlhbCk7IGkrKykgeworICAgICAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwQ2FuZGlkYXRlID0KKyAgICAgICAgICBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgICAgcEluc3QgPSBwQ2FuZGlkYXRlLT5wSW5zdDsKKworICAgICAgaWYgKCFwSW5zdC0+ZGVwZW5kc09uRHJjU2V0UHJlc2VudCkgeworICAgICAgICBpZiAoKHBJbnN0LT5kcmNTZXRFZmZlY3QgJiBlZmZlY3RCaXRQb3NpdGlvbikpIHsKKyAgICAgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fYWRkKHBDYW5kaWRhdGVzU2VsZWN0ZWQsIHBDYW5kaWRhdGUpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0VmFsID0gX2RlcGVuZGVudERyY0luc3RydWN0aW9uKGhVbmlEcmNDb25maWcsIHBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEcmNJbnN0cnVjdGlvbnNEZXBlbmRlbnQpOworICAgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisKKyAgICAgICAgaWYgKCgocEluc3QtPmRyY1NldEVmZmVjdCAmIGVmZmVjdEJpdFBvc2l0aW9uKSkgfHwKKyAgICAgICAgICAgICgocERyY0luc3RydWN0aW9uc0RlcGVuZGVudC0+ZHJjU2V0RWZmZWN0ICYgZWZmZWN0Qml0UG9zaXRpb24pKSkgeworICAgICAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3NlbGVjdEVmZmVjdFR5cGVGZWF0dXJlKAorICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBEUkNfRkVBVFVSRV9SRVFVRVNUIGRyY0ZlYXR1cmVSZXF1ZXN0LAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICBpbnQgaTsKKyAgaW50IGRlc2lyZWRFZmZlY3RUeXBlRm91bmQgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBkcmNGZWF0dXJlUmVxdWVzdC5kcmNFZmZlY3RUeXBlLm51bVJlcXVlc3RzRGVzaXJlZDsgaSsrKSB7CisgICAgcmV0VmFsID0gX3NlbGVjdFNpbmdsZUVmZmVjdFR5cGUoCisgICAgICAgIGhVbmlEcmNDb25maWcsIGRyY0ZlYXR1cmVSZXF1ZXN0LmRyY0VmZmVjdFR5cGUucmVxdWVzdFtpXSwKKyAgICAgICAgKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisKKyAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkpIHsKKyAgICAgIGRlc2lyZWRFZmZlY3RUeXBlRm91bmQgPSAxOworICAgICAgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcihwcENhbmRpZGF0ZXNQb3RlbnRpYWwsIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICB9CisgIH0KKworICBpZiAoIWRlc2lyZWRFZmZlY3RUeXBlRm91bmQpIHsKKyAgICBmb3IgKGkgPSBkcmNGZWF0dXJlUmVxdWVzdC5kcmNFZmZlY3RUeXBlLm51bVJlcXVlc3RzRGVzaXJlZDsKKyAgICAgICAgIGkgPCBkcmNGZWF0dXJlUmVxdWVzdC5kcmNFZmZlY3RUeXBlLm51bVJlcXVlc3RzOyBpKyspIHsKKyAgICAgIHJldFZhbCA9IF9zZWxlY3RTaW5nbGVFZmZlY3RUeXBlKAorICAgICAgICAgIGhVbmlEcmNDb25maWcsIGRyY0ZlYXR1cmVSZXF1ZXN0LmRyY0VmZmVjdFR5cGUucmVxdWVzdFtpXSwKKyAgICAgICAgICAqcHBDYW5kaWRhdGVzUG90ZW50aWFsLCAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworCisgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkpIHsKKyAgICAgICAgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcihwcENhbmRpZGF0ZXNQb3RlbnRpYWwsIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgX3N3YXBTZWxlY3Rpb24ocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKKyAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3NlbGVjdER5bmFtaWNSYW5nZSgKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICBEUkNfRkVBVFVSRV9SRVFVRVNUIGRyY0ZlYXR1cmVSZXF1ZXN0LCBVQ0hBUiogcERvd25taXhJZFJlcXVlc3RlZCwKKyAgICBpbnQgYWxidW1Nb2RlLCBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgaW50IGk7CisgIGludCBwZWFrVG9BdmVyYWdlUHJlc2VudDsKKyAgRklYUF9EQkwgcGVha1RvQXZlcmFnZTsKKworICBGSVhQX0RCTCBtaW5WYWwgPSBNQVhWQUxfREJMOworICBGSVhQX0RCTCB2YWwgPSAwOworCisgIGludCBudW1TZWxlY3RlZENhbmRpZGF0ZXMgPSBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBDYW5kaWRhdGUgPQorICAgICAgICBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICByZXRWYWwgPSBfZHluYW1pY1JhbmdlTWVhc3VyZW1lbnQoCisgICAgICAgIGhMb3VkbmVzc0luZm9TZXQsIHBDYW5kaWRhdGUtPnBJbnN0LAorICAgICAgICBwRG93bm1peElkUmVxdWVzdGVkW3BDYW5kaWRhdGUtPmRvd25taXhJZFJlcXVlc3RJbmRleF0sCisgICAgICAgIGRyY0ZlYXR1cmVSZXF1ZXN0LmR5bmFtaWNSYW5nZS5tZWFzdXJlbWVudFJlcXVlc3RUeXBlLCBhbGJ1bU1vZGUsCisgICAgICAgICZwZWFrVG9BdmVyYWdlUHJlc2VudCwgJnBlYWtUb0F2ZXJhZ2UpOworICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKworICAgIGlmIChwZWFrVG9BdmVyYWdlUHJlc2VudCkgeworICAgICAgaWYgKCFkcmNGZWF0dXJlUmVxdWVzdC5keW5hbWljUmFuZ2UucmVxdWVzdGVkSXNSYW5nZSkgeworICAgICAgICB2YWwgPSBmQWJzKGRyY0ZlYXR1cmVSZXF1ZXN0LmR5bmFtaWNSYW5nZS5yZXF1ZXN0VmFsdWUgLSBwZWFrVG9BdmVyYWdlKTsKKworICAgICAgICBpZiAobWluVmFsID4gdmFsKSB7CisgICAgICAgICAgbWluVmFsID0gdmFsOworCisgICAgICAgICAgX2RyY2RlY19zZWxlY3Rpb25fc2V0TnVtYmVyKHBwQ2FuZGlkYXRlc1NlbGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TZWxlY3RlZENhbmRpZGF0ZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocHBDYW5kaWRhdGVzU2VsZWN0ZWQsIHBDYW5kaWRhdGUpID09IE5VTEwpCisgICAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHBlYWtUb0F2ZXJhZ2UgPj0gZHJjRmVhdHVyZVJlcXVlc3QuZHluYW1pY1JhbmdlLnJlcXVlc3RWYWx1ZU1pbikgJiYKKyAgICAgICAgICAgIChwZWFrVG9BdmVyYWdlIDw9IGRyY0ZlYXR1cmVSZXF1ZXN0LmR5bmFtaWNSYW5nZS5yZXF1ZXN0VmFsdWVNYXgpKSB7CisgICAgICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2FkZChwcENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3NlbGVjdFNpbmdsZURyY0NoYXJhY3RlcmlzdGljKAorICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBpbnQgcmVxdWVzdGVkRHJjQ2hhcmFjdGVyaXN0aWMsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgaW50IGksIGosIGI7CisgIGludCBoaXQgPSAwOworCisgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QgPSBOVUxMOworICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMqIHBDb2VmID0gTlVMTDsKKyAgR0FJTl9TRVQqIHBHYWluU2V0ID0gTlVMTDsKKworICBpZiAocmVxdWVzdGVkRHJjQ2hhcmFjdGVyaXN0aWMgPCAxKSB7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgIH0KKworICBwQ29lZiA9IHNlbGVjdERyY0NvZWZmaWNpZW50cyhoVW5pRHJjQ29uZmlnLCBMT0NBVElPTl9TRUxFQ1RFRCk7CisKKyAgaWYgKHBDb2VmID09IE5VTEwpIC8qIGNoZWNrIGZvciBwYXJhbWV0cmljRFJDICovCisgIHsKKyAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwQ2FuZGlkYXRlID0KKyAgICAgICAgX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQoKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICBwSW5zdCA9IHBDYW5kaWRhdGUtPnBJbnN0OworCisgICAgaGl0ID0gMDsKKworICAgIGZvciAoaiA9IDA7IGogPCBwSW5zdC0+bkRyY0NoYW5uZWxHcm91cHM7IGorKykgeworICAgICAgaW50IGJhbmRDb3VudCA9IDA7CisgICAgICBpbnQgaW5kZXhEcmNDb2VmZiA9IHBJbnN0LT5nYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXBbal07CisKKyAgICAgIGlmIChpbmRleERyY0NvZWZmID4gcENvZWYtPmdhaW5TZXRDb3VudCAtIDEpIC8qIGNoZWNrIGZvciBwYXJhbWV0cmljRFJDICovCisgICAgICB7CisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgICAgICB9CisKKyAgICAgIHBHYWluU2V0ID0gJihwQ29lZi0+Z2FpblNldFtpbmRleERyY0NvZWZmXSk7CisgICAgICBiYW5kQ291bnQgPSBwR2FpblNldC0+YmFuZENvdW50OworCisgICAgICBmb3IgKGIgPSAwOyBiIDwgYmFuZENvdW50OyBiKyspIHsKKyAgICAgICAgaWYgKChwR2FpblNldC0+ZHJjQ2hhcmFjdGVyaXN0aWNbYl0uaXNDSUNQKSAmJgorICAgICAgICAgICAgKHBHYWluU2V0LT5kcmNDaGFyYWN0ZXJpc3RpY1tiXS5jaWNwSW5kZXggPT0KKyAgICAgICAgICAgICByZXF1ZXN0ZWREcmNDaGFyYWN0ZXJpc3RpYykpIHsKKyAgICAgICAgICBoaXQgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChoaXQpIGJyZWFrOworICAgIH0KKworICAgIGlmIChoaXQpIHsKKyAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICB9CisgIH0KKworICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkpIHsKKyAgICBfc3dhcFNlbGVjdGlvbkFuZENsZWFyKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3NlbGVjdERyY0NoYXJhY3RlcmlzdGljKAorICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBpbnQgZHJjQ2hhcmFjdGVyaXN0aWNSZXF1ZXN0ZWQsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisKKyAgY29uc3QgaW50IHNlY29uZFRyeVsxMl0gPSB7MCwgMiwgMywgNCwgNSwgNiwgNSwgOSwgMTAsIDcsIDgsIDEwfTsKKworICByZXRWYWwgPSBfc2VsZWN0U2luZ2xlRHJjQ2hhcmFjdGVyaXN0aWMoCisgICAgICBoVW5pRHJjQ29uZmlnLCBkcmNDaGFyYWN0ZXJpc3RpY1JlcXVlc3RlZCwgcHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgICAgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisKKyAgaWYgKChkcmNDaGFyYWN0ZXJpc3RpY1JlcXVlc3RlZCA8PSAxMSkgJiYKKyAgICAgIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKSA9PSAwKSkgeworICAgIHJldFZhbCA9IF9zZWxlY3RTaW5nbGVEcmNDaGFyYWN0ZXJpc3RpYygKKyAgICAgICAgaFVuaURyY0NvbmZpZywgc2Vjb25kVHJ5W2RyY0NoYXJhY3RlcmlzdGljUmVxdWVzdGVkXSwKKyAgICAgICAgcHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICB9CisKKyAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpID09IDApIHsKKyAgICBpZiAoKGRyY0NoYXJhY3RlcmlzdGljUmVxdWVzdGVkID49IDIpICYmCisgICAgICAgIChkcmNDaGFyYWN0ZXJpc3RpY1JlcXVlc3RlZCA8PSA1KSkgeworICAgICAgcmV0VmFsID0gX3NlbGVjdFNpbmdsZURyY0NoYXJhY3RlcmlzdGljKAorICAgICAgICAgIGhVbmlEcmNDb25maWcsIGRyY0NoYXJhY3RlcmlzdGljUmVxdWVzdGVkIC0gMSwgcHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgICAgICAgIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgICB9IGVsc2UgaWYgKGRyY0NoYXJhY3RlcmlzdGljUmVxdWVzdGVkID09IDExKSB7CisgICAgICByZXRWYWwgPSBfc2VsZWN0U2luZ2xlRHJjQ2hhcmFjdGVyaXN0aWMoCisgICAgICAgICAgaFVuaURyY0NvbmZpZywgOSwgcHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgICAgfQorICB9CisKKyAgX3N3YXBTZWxlY3Rpb24ocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKKyAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2RyY1NldEZpbmFsU2VsZWN0aW9uX3BlYWtWYWx1ZTAoCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwQ2FuZGlkYXRlID0KKyAgICAgICAgX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgaWYgKHBDYW5kaWRhdGUtPm91dHB1dFBlYWtMZXZlbCA8PSBGSVhQX0RCTCgwKSkgeworICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2FkZChwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICB9CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHJjU2V0RmluYWxTZWxlY3Rpb25fZG93bm1peElkKAorICAgIEhBTkRMRV9TRUxfUFJPQ19JTlBVVCBoU2VsUHJvY0lucHV0LAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIGludCBpLCBqOworICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBDYW5kaWRhdGUgPSBOVUxMOworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0ID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBwQ2FuZGlkYXRlID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQoKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICBwSW5zdCA9IHBDYW5kaWRhdGUtPnBJbnN0OworCisgICAgZm9yIChqID0gMDsgaiA8IHBJbnN0LT5kb3dubWl4SWRDb3VudDsgaisrKSB7CisgICAgICBpZiAoRE9XTk1JWF9JRF9CQVNFX0xBWU9VVCAhPSBwSW5zdC0+ZG93bm1peElkW2pdICYmCisgICAgICAgICAgRE9XTk1JWF9JRF9BTllfRE9XTk1JWCAhPSBwSW5zdC0+ZG93bm1peElkW2pdICYmCisgICAgICAgICAgaFNlbFByb2NJbnB1dAorICAgICAgICAgICAgICAgICAgLT5kb3dubWl4SWRSZXF1ZXN0ZWRbcENhbmRpZGF0ZS0+ZG93bm1peElkUmVxdWVzdEluZGV4XSA9PQorICAgICAgICAgICAgICBwSW5zdC0+ZG93bm1peElkW2pdKSB7CisgICAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKSA9PSAwKSB7CisgICAgX3N3YXBTZWxlY3Rpb24ocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCitzdGF0aWMgaW50IF9jcm9zc1N1bShpbnQgdmFsdWUpIHsKKyAgaW50IHN1bSA9IDA7CisKKyAgd2hpbGUgKHZhbHVlICE9IDApIHsKKyAgICBpZiAoKHZhbHVlICYgMSkgPT0gMSkgeworICAgICAgc3VtKys7CisgICAgfQorCisgICAgdmFsdWUgPj49IDE7CisgIH0KKworICByZXR1cm4gc3VtOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHJjU2V0RmluYWxTZWxlY3Rpb25fZWZmZWN0VHlwZXMoCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBpbnQgaTsKKyAgaW50IG1pbk51bUVmZmVjdHMgPSAxMDAwOworICBpbnQgbnVtRWZmZWN0cyA9IDA7CisgIGludCBlZmZlY3RzID0gMDsKKyAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwQ2FuZGlkYXRlID0gTlVMTDsKKyAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihwQ2FuZGlkYXRlc1BvdGVudGlhbCk7IGkrKykgeworICAgIHBDYW5kaWRhdGUgPSBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICBwSW5zdCA9IHBDYW5kaWRhdGUtPnBJbnN0OworCisgICAgZWZmZWN0cyA9IHBJbnN0LT5kcmNTZXRFZmZlY3Q7CisgICAgZWZmZWN0cyAmPSAweGZmZmYgXiAoRUJfR0VORVJBTF9DT01QUik7CisgICAgbnVtRWZmZWN0cyA9IF9jcm9zc1N1bShlZmZlY3RzKTsKKworICAgIGlmIChudW1FZmZlY3RzIDwgbWluTnVtRWZmZWN0cykgeworICAgICAgbWluTnVtRWZmZWN0cyA9IG51bUVmZmVjdHM7CisgICAgfQorICB9CisKKyAgLyogYWRkIGFsbCB3aXRoIG1pbmltdW0gbnVtYmVyIG9mIGVmZmVjdHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihwQ2FuZGlkYXRlc1BvdGVudGlhbCk7IGkrKykgeworICAgIHBDYW5kaWRhdGUgPSBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICBwSW5zdCA9IHBDYW5kaWRhdGUtPnBJbnN0OworCisgICAgZWZmZWN0cyA9IHBJbnN0LT5kcmNTZXRFZmZlY3Q7CisgICAgZWZmZWN0cyAmPSAweGZmZmYgXiAoRUJfR0VORVJBTF9DT01QUik7CisgICAgbnVtRWZmZWN0cyA9IF9jcm9zc1N1bShlZmZlY3RzKTsKKworICAgIGlmIChudW1FZmZlY3RzID09IG1pbk51bUVmZmVjdHMpIHsKKyAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgfQorICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3NlbGVjdFNtYWxsZXN0VGFyZ2V0TG91ZG5lc3NWYWx1ZVVwcGVyKAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgaW50IGk7CisgIFNDSEFSIG1pblZhbCA9IDB4N0Y7CisgIFNDSEFSIHZhbCA9IDA7CisgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcENhbmRpZGF0ZSA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihwQ2FuZGlkYXRlc1BvdGVudGlhbCk7IGkrKykgeworICAgIHBDYW5kaWRhdGUgPSBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICB2YWwgPSBwQ2FuZGlkYXRlLT5wSW5zdC0+ZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZVVwcGVyOworCisgICAgaWYgKHZhbCA8IG1pblZhbCkgeworICAgICAgbWluVmFsID0gdmFsOworICAgIH0KKyAgfQorCisgIC8qIGFkZCBhbGwgd2l0aCBzYW1lIHNtYWxsZXN0IGRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlciAqLworICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgcENhbmRpZGF0ZSA9IF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KHBDYW5kaWRhdGVzUG90ZW50aWFsLCBpKTsKKyAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgIHZhbCA9IHBDYW5kaWRhdGUtPnBJbnN0LT5kcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlVXBwZXI7CisKKyAgICBpZiAodmFsID09IG1pblZhbCkgeworICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2FkZChwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICB9CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHJjU2V0RmluYWxTZWxlY3Rpb25fdGFyZ2V0TG91ZG5lc3MoCisgICAgRklYUF9EQkwgdGFyZ2V0TG91ZG5lc3MsIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgIGludCBpOworICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBDYW5kaWRhdGUgPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBwQ2FuZGlkYXRlID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgaWYgKHBDYW5kaWRhdGUtPnNlbGVjdGlvbkZsYWcgPT0gMCkgeworICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2FkZChwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICB9CisgIH0KKworICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzU2VsZWN0ZWQpID09IDApIHsKKyAgICByZXRWYWwgPSBfc2VsZWN0U21hbGxlc3RUYXJnZXRMb3VkbmVzc1ZhbHVlVXBwZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgfQorCisgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNTZWxlY3RlZCkgPiAxKSB7CisgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMgPSBOVUxMOworCisgICAgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcigmcENhbmRpZGF0ZXNQb3RlbnRpYWwsICZwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICAgIHBDYW5kaWRhdGUgPSBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgICAgcERyY0luc3RydWN0aW9uVW5pRHJjID0gcENhbmRpZGF0ZS0+cEluc3Q7CisKKyAgICAgIGlmIChfdGFyZ2V0TG91ZG5lc3NJblJhbmdlKHBEcmNJbnN0cnVjdGlvblVuaURyYywgdGFyZ2V0TG91ZG5lc3MpKSB7CisgICAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzU2VsZWN0ZWQpID4gMSkgeworICAgICAgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcigmcENhbmRpZGF0ZXNQb3RlbnRpYWwsICZwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKworICAgICAgcmV0VmFsID0gX3NlbGVjdFNtYWxsZXN0VGFyZ2V0TG91ZG5lc3NWYWx1ZVVwcGVyKHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9kcmNTZXRGaW5hbFNlbGVjdGlvbl9wZWFrVmFsdWVMYXJnZXN0KAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgaW50IGk7CisgIEZJWFBfREJMIGxhcmdlc3RQZWFrTGV2ZWwgPSBNSU5WQUxfREJMOworICBGSVhQX0RCTCBwZWFrTGV2ZWwgPSAwOworICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBDYW5kaWRhdGUgPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBwQ2FuZGlkYXRlID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgcGVha0xldmVsID0gcENhbmRpZGF0ZS0+b3V0cHV0UGVha0xldmVsOworCisgICAgaWYgKHBlYWtMZXZlbCA+IGxhcmdlc3RQZWFrTGV2ZWwpIHsKKyAgICAgIGxhcmdlc3RQZWFrTGV2ZWwgPSBwZWFrTGV2ZWw7CisgICAgfQorICB9CisKKyAgLyogYWRkIGFsbCB3aXRoIHNhbWUgbGFyZ2VzdCBwZWFrIGxldmVsICovCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBwQ2FuZGlkYXRlID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgcGVha0xldmVsID0gcENhbmRpZGF0ZS0+b3V0cHV0UGVha0xldmVsOworCisgICAgaWYgKHBlYWtMZXZlbCA9PSBsYXJnZXN0UGVha0xldmVsKSB7CisgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fYWRkKHBDYW5kaWRhdGVzU2VsZWN0ZWQsIHBDYW5kaWRhdGUpID09IE5VTEwpCisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9kcmNTZXRGaW5hbFNlbGVjdGlvbl9kcmNTZXRJZCgKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIGludCBpOworICBpbnQgbGFyZ2VzdElkID0gLTEwMDA7CisgIGludCBpZCA9IDA7CisgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcENhbmRpZGF0ZSA9IE5VTEw7CisgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcENhbmRpZGF0ZVNlbGVjdGVkID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgcENhbmRpZGF0ZSA9IF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KHBDYW5kaWRhdGVzUG90ZW50aWFsLCBpKTsKKyAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgIGlkID0gcENhbmRpZGF0ZS0+cEluc3QtPmRyY1NldElkOworCisgICAgaWYgKGlkID4gbGFyZ2VzdElkKSB7CisgICAgICBsYXJnZXN0SWQgPSBpZDsKKyAgICAgIHBDYW5kaWRhdGVTZWxlY3RlZCA9IHBDYW5kaWRhdGU7CisgICAgfQorICB9CisKKyAgaWYgKHBDYW5kaWRhdGVTZWxlY3RlZCAhPSBOVUxMKSB7CisgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2FkZChwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlU2VsZWN0ZWQpID09IE5VTEwpCisgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9kcmNTZXRGaW5hbFNlbGVjdGlvbigKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzU2VsZWN0ZWQsIFNFTF9QUk9DX0NPREVDX01PREUgY29kZWNNb2RlKSB7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworCisgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCkgPT0gMCkgeworICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICB9IGVsc2UgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzUG90ZW50aWFsKSA9PSAxKSB7CisgICAgX3N3YXBTZWxlY3Rpb24ocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgLyogZmluaXNoZWQgKi8KKyAgfSBlbHNlIC8qID4gMSAqLworICB7CisgICAgcmV0VmFsID0gX2RyY1NldEZpbmFsU2VsZWN0aW9uX3BlYWtWYWx1ZTAoKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKworICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKSA+IDEpIHsKKyAgICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICByZXRWYWwgPSBfZHJjU2V0RmluYWxTZWxlY3Rpb25fZG93bm1peElkKAorICAgICAgICAgIGhTZWxQcm9jSW5wdXQsIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICAgIH0KKworICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKSA+IDEpIHsKKyAgICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICByZXRWYWwgPSBfZHJjU2V0RmluYWxTZWxlY3Rpb25fZWZmZWN0VHlwZXMoKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICAgIH0KKworICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKSA+IDEpIHsKKyAgICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICByZXRWYWwgPSBfZHJjU2V0RmluYWxTZWxlY3Rpb25fdGFyZ2V0TG91ZG5lc3MoCisgICAgICAgICAgaFNlbFByb2NJbnB1dC0+dGFyZ2V0TG91ZG5lc3MsICpwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgICAgICAgKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgICB9CisKKyAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkgPiAxKSB7CisgICAgICBfc3dhcFNlbGVjdGlvbkFuZENsZWFyKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgcmV0VmFsID0gX2RyY1NldEZpbmFsU2VsZWN0aW9uX3BlYWtWYWx1ZUxhcmdlc3QoKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgICAgfQorCisgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpID4gMSkgeworICAgICAgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcihwcENhbmRpZGF0ZXNQb3RlbnRpYWwsIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgIHJldFZhbCA9IF9kcmNTZXRGaW5hbFNlbGVjdGlvbl9kcmNTZXRJZCgqcHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgICAgfQorICB9CisKKyAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpID09IDApIHsKKyAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9nZW5lcmF0ZVZpcnR1YWxEcmNTZXRzKAorICAgIEhBTkRMRV9TRUxfUFJPQ19JTlBVVCBoU2VsUHJvY0lucHV0LCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSkgeworICBpbnQgaTsKKyAgaW50IG5NaXhlcyA9IGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudCArIDE7CisgIGludCBpbmRleCA9IGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50OworICBpbnQgaW5kZXhWaXJ0dWFsID0gLTE7CisgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uID0KKyAgICAgICYoaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW2luZGV4XSk7CisKKyAgaWYgKGNvZGVjTW9kZSA9PSBTRUxfUFJPQ19NUEVHX0hfM0RBKSB7CisgICAgbk1peGVzID0gMTsKKyAgfQorCisgIGlmICgoaW5kZXggKyBuTWl4ZXMpID4gKDEyICsgMSArIDYpKSB7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgIH0KKworICBGREttZW1zZXQocERyY0luc3RydWN0aW9uLCAwLCBzaXplb2YoRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKSk7CisKKyAgcERyY0luc3RydWN0aW9uLT5kcmNTZXRJZCA9IGluZGV4VmlydHVhbDsKKyAgaW5kZXgrKzsKKyAgaW5kZXhWaXJ0dWFsLS07CisgIHBEcmNJbnN0cnVjdGlvbi0+ZG93bm1peElkQ291bnQgPSAxOworCisgIGlmICgoY29kZWNNb2RlID09IFNFTF9QUk9DX01QRUdfSF8zREEpICYmCisgICAgICAoaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHMpKSB7CisgICAgcERyY0luc3RydWN0aW9uLT5kb3dubWl4SWRbMF0gPSBoU2VsUHJvY0lucHV0LT5kb3dubWl4SWRSZXF1ZXN0ZWRbMF07CisgIH0gZWxzZSB7CisgICAgcERyY0luc3RydWN0aW9uLT5kb3dubWl4SWRbMF0gPSBET1dOTUlYX0lEX0JBU0VfTEFZT1VUOworICB9CisKKyAgZm9yIChpID0gMTsgaSA8IG5NaXhlczsgaSsrKSB7CisgICAgcERyY0luc3RydWN0aW9uID0gJihoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaW5kZXhdKTsKKyAgICBGREttZW1zZXQocERyY0luc3RydWN0aW9uLCAwLCBzaXplb2YoRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKSk7CisgICAgcERyY0luc3RydWN0aW9uLT5kcmNTZXRJZCA9IGluZGV4VmlydHVhbDsKKyAgICBwRHJjSW5zdHJ1Y3Rpb24tPmRvd25taXhJZFswXSA9CisgICAgICAgIGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNbaSAtIDFdLmRvd25taXhJZDsKKyAgICBwRHJjSW5zdHJ1Y3Rpb24tPmRvd25taXhJZENvdW50ID0gMTsKKyAgICBpbmRleCsrOworICAgIGluZGV4VmlydHVhbC0tOworICB9CisKKyAgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zQ291bnRJbmNsVmlydHVhbCA9CisgICAgICBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudCArIG5NaXhlczsKKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZ2VuZXJhdGVPdXRwdXRJbmZvKAorICAgIEhBTkRMRV9TRUxfUFJPQ19JTlBVVCBoU2VsUHJvY0lucHV0LCBIQU5ETEVfU0VMX1BST0NfT1VUUFVUIGhTZWxQcm9jT3V0cHV0LAorICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LAorICAgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcFNlbGVjdGlvbkRhdGEsIFNFTF9QUk9DX0NPREVDX01PREUgY29kZWNNb2RlKSB7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworCisgIGludCBpLCBqOworICBpbnQgaGFzRGVwZW5kZW5kID0gMDsKKyAgaW50IGhhc0ZhZGluZyA9IDA7CisgIGludCBoYXNEdWNraW5nID0gMDsKKyAgaW50IHNlbGVjdGVkRHJjU2V0SWRzOworICBpbnQgc2VsZWN0ZWREb3dubWl4SWRzOworICBGSVhQX0RCTCBtaXhpbmdMZXZlbCA9IDA7CisgIGludCBhbGJ1bU1vZGUgPSBoU2VsUHJvY0lucHV0LT5hbGJ1bU1vZGU7CisgIFVDSEFSKiBwRG93bm1peElkUmVxdWVzdGVkID0gaFNlbFByb2NJbnB1dC0+ZG93bm1peElkUmVxdWVzdGVkOworICBGSVhQX1NHTCBib29zdCA9IGhTZWxQcm9jSW5wdXQtPmJvb3N0OworICBGSVhQX1NHTCBjb21wcmVzcyA9IGhTZWxQcm9jSW5wdXQtPmNvbXByZXNzOworCisgIGhTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHMgPSAxOworICBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREcmNTZXRJZHNbMF0gPSBwU2VsZWN0aW9uRGF0YS0+cEluc3QtPmRyY1NldElkOworICBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREb3dubWl4SWRzWzBdID0KKyAgICAgIHBTZWxlY3Rpb25EYXRhLT5wSW5zdC0+ZHJjQXBwbHlUb0Rvd25taXggPT0gMQorICAgICAgICAgID8gcFNlbGVjdGlvbkRhdGEtPnBJbnN0LT5kb3dubWl4SWRbMF0KKyAgICAgICAgICA6IDA7CisgIGhTZWxQcm9jT3V0cHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIgPQorICAgICAgcFNlbGVjdGlvbkRhdGEtPmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYkFkanVzdGVkICsKKyAgICAgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5Nb2RpZmljYXRpb25EYjsKKyAgaFNlbFByb2NPdXRwdXQtPm91dHB1dFBlYWtMZXZlbERiID0gcFNlbGVjdGlvbkRhdGEtPm91dHB1dFBlYWtMZXZlbDsKKworICBoU2VsUHJvY091dHB1dC0+Ym9vc3QgPSBib29zdDsKKyAgaFNlbFByb2NPdXRwdXQtPmNvbXByZXNzID0gY29tcHJlc3M7CisgIGhTZWxQcm9jT3V0cHV0LT5iYXNlQ2hhbm5lbENvdW50ID0KKyAgICAgIGhVbmlEcmNDb25maWctPmNoYW5uZWxMYXlvdXQuYmFzZUNoYW5uZWxDb3VudDsKKyAgaFNlbFByb2NPdXRwdXQtPnRhcmdldENoYW5uZWxDb3VudCA9CisgICAgICBoVW5pRHJjQ29uZmlnLT5jaGFubmVsTGF5b3V0LmJhc2VDaGFubmVsQ291bnQ7CisgIGhTZWxQcm9jT3V0cHV0LT5hY3RpdmVEb3dubWl4SWQgPQorICAgICAgcERvd25taXhJZFJlcXVlc3RlZFtwU2VsZWN0aW9uRGF0YS0+ZG93bm1peElkUmVxdWVzdEluZGV4XTsKKworICBfZ2V0TWl4aW5nTGV2ZWwoaExvdWRuZXNzSW5mb1NldCwgKnBEb3dubWl4SWRSZXF1ZXN0ZWQsCisgICAgICAgICAgICAgICAgICBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREcmNTZXRJZHNbMF0sIGFsYnVtTW9kZSwKKyAgICAgICAgICAgICAgICAgICZtaXhpbmdMZXZlbCk7CisgIGhTZWxQcm9jT3V0cHV0LT5taXhpbmdMZXZlbCA9IG1peGluZ0xldmVsOworCisgIC8qZGVwZW5kZW50Ki8KKyAgaWYgKHBTZWxlY3Rpb25EYXRhLT5wSW5zdC0+ZGVwZW5kc09uRHJjU2V0UHJlc2VudCkgeworICAgIGludCBkZXBlbmRzT25EcmNTZXRJRCA9IHBTZWxlY3Rpb25EYXRhLT5wSW5zdC0+ZGVwZW5kc09uRHJjU2V0OworCisgICAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc0NvdW50SW5jbFZpcnR1YWw7IGkrKykgeworICAgICAgaWYgKGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXS5kcmNTZXRJZCA9PQorICAgICAgICAgIGRlcGVuZHNPbkRyY1NldElEKSB7CisgICAgICAgIGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERyY1NldElkc1toU2VsUHJvY091dHB1dC0+bnVtU2VsZWN0ZWREcmNTZXRzXSA9CisgICAgICAgICAgICBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0uZHJjU2V0SWQ7CisgICAgICAgIGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERvd25taXhJZHNbaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0c10gPQorICAgICAgICAgICAgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW2ldLmRyY0FwcGx5VG9Eb3dubWl4ID09IDEKKyAgICAgICAgICAgICAgICA/IGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXS5kb3dubWl4SWRbMF0KKyAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgIGhTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHMrKzsKKyAgICAgICAgaGFzRGVwZW5kZW5kID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogZmFkaW5nICovCisgIGlmIChoU2VsUHJvY0lucHV0LT5hbGJ1bU1vZGUgPT0gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudDsgaSsrKSB7CisgICAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0ID0KKyAgICAgICAgICAmKGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXSk7CisKKyAgICAgIGlmIChwSW5zdC0+ZHJjU2V0RWZmZWN0ICYgRUJfRkFERSkgeworICAgICAgICBpZiAocEluc3QtPmRvd25taXhJZFswXSA9PSBET1dOTUlYX0lEX0FOWV9ET1dOTUlYKSB7CisgICAgICAgICAgaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0cyA9IGhhc0RlcGVuZGVuZCArIDE7CisgICAgICAgICAgaFNlbFByb2NPdXRwdXQKKyAgICAgICAgICAgICAgLT5zZWxlY3RlZERyY1NldElkc1toU2VsUHJvY091dHB1dC0+bnVtU2VsZWN0ZWREcmNTZXRzXSA9CisgICAgICAgICAgICAgIGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXS5kcmNTZXRJZDsKKyAgICAgICAgICBoU2VsUHJvY091dHB1dAorICAgICAgICAgICAgICAtPnNlbGVjdGVkRG93bm1peElkc1toU2VsUHJvY091dHB1dC0+bnVtU2VsZWN0ZWREcmNTZXRzXSA9CisgICAgICAgICAgICAgIGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXS5kcmNBcHBseVRvRG93bm1peCA9PSAxCisgICAgICAgICAgICAgICAgICA/IGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXS5kb3dubWl4SWRbMF0KKyAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgICAgICBoU2VsUHJvY091dHB1dC0+bnVtU2VsZWN0ZWREcmNTZXRzKys7CisgICAgICAgICAgaGFzRmFkaW5nID0gMTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBkdWNraW5nICovCisgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudDsgaSsrKSB7CisgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCA9CisgICAgICAgICYoaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW2ldKTsKKworICAgIGlmIChwSW5zdC0+ZHJjU2V0RWZmZWN0ICYgKEVCX0RVQ0tfT1RIRVIgfCBFQl9EVUNLX1NFTEYpKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgcEluc3QtPmRvd25taXhJZENvdW50OyBqKyspIHsKKyAgICAgICAgaWYgKHBJbnN0LT5kb3dubWl4SWRbal0gPT0gaFNlbFByb2NPdXRwdXQtPmFjdGl2ZURvd25taXhJZCkgeworICAgICAgICAgIGhTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHMgPQorICAgICAgICAgICAgICBoYXNEZXBlbmRlbmQgKyAxOyAvKiBkdWNraW5nIG92ZXJyaWRlcyBmYWRpbmcgKi8KKworICAgICAgICAgIGhTZWxQcm9jT3V0cHV0CisgICAgICAgICAgICAgIC0+c2VsZWN0ZWREcmNTZXRJZHNbaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0c10gPQorICAgICAgICAgICAgICBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0uZHJjU2V0SWQ7CisgICAgICAgICAgLyogZm9yY2UgZHVja2luZyBEUkMgc2V0IHRvIGJlIHByb2Nlc3NlZCBvbiBiYXNlIGxheW91dCAqLworICAgICAgICAgIGhTZWxQcm9jT3V0cHV0CisgICAgICAgICAgICAgIC0+c2VsZWN0ZWREb3dubWl4SWRzW2hTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHNdID0gMDsKKyAgICAgICAgICBoU2VsUHJvY091dHB1dC0+bnVtU2VsZWN0ZWREcmNTZXRzKys7CisgICAgICAgICAgaGFzRHVja2luZyA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiByZXBlYXQgZm9yIERPV05NSVhfSURfQkFTRV9MQVlPVVQgaWYgbm8gZHVja2luZyBmb3VuZCovCisKKyAgaWYgKCFoYXNEdWNraW5nKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50OyBpKyspIHsKKyAgICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QgPQorICAgICAgICAgICYoaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW2ldKTsKKworICAgICAgaWYgKHBJbnN0LT5kcmNTZXRFZmZlY3QgJiAoRUJfRFVDS19PVEhFUiB8IEVCX0RVQ0tfU0VMRikpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHBJbnN0LT5kb3dubWl4SWRDb3VudDsgaisrKSB7CisgICAgICAgICAgaWYgKHBJbnN0LT5kb3dubWl4SWRbal0gPT0gRE9XTk1JWF9JRF9CQVNFX0xBWU9VVCkgeworICAgICAgICAgICAgaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0cyA9IGhhc0RlcGVuZGVuZCArIGhhc0ZhZGluZyArIDE7CisgICAgICAgICAgICBoU2VsUHJvY091dHB1dAorICAgICAgICAgICAgICAgIC0+c2VsZWN0ZWREcmNTZXRJZHNbaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0c10gPQorICAgICAgICAgICAgICAgIGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXS5kcmNTZXRJZDsKKyAgICAgICAgICAgIC8qIGZvcmNlIGR1Y2tpbmcgRFJDIHNldCB0byBiZSBwcm9jZXNzZWQgb24gYmFzZSBsYXlvdXQgKi8KKyAgICAgICAgICAgIGhTZWxQcm9jT3V0cHV0CisgICAgICAgICAgICAgICAgLT5zZWxlY3RlZERvd25taXhJZHNbaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0c10gPSAwOworICAgICAgICAgICAgaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0cysrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoU2VsUHJvY091dHB1dC0+bnVtU2VsZWN0ZWREcmNTZXRzID4gMykgeworICAgIC8qIG1heGltdW0gcGVybWl0dGVkIG51bWJlciBvZiBhcHBsaWVkIERSQyBzZXRzIGlzIDMsIHNlZSBzZWN0aW9uIDYuMy41IG9mCisgICAgICogSVNPL0lFQyAyMzAwMy00ICovCisgICAgaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0cyA9IDA7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgIH0KKworICAvKiBzb3J0aW5nOiBEdWNraW5nL0ZhZGluZyAtPiBEZXBlbmRlbnQgLT4gU2VsZWN0ZWQgKi8KKyAgaWYgKGhTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHMgPT0gMykgeworICAgIHNlbGVjdGVkRHJjU2V0SWRzID0gaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRHJjU2V0SWRzWzBdOworICAgIHNlbGVjdGVkRG93bm1peElkcyA9IGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERvd25taXhJZHNbMF07CisgICAgaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRHJjU2V0SWRzWzBdID0gaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRHJjU2V0SWRzWzJdOworICAgIGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERvd25taXhJZHNbMF0gPQorICAgICAgICBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREb3dubWl4SWRzWzJdOworICAgIGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERyY1NldElkc1syXSA9IHNlbGVjdGVkRHJjU2V0SWRzOworICAgIGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERvd25taXhJZHNbMl0gPSBzZWxlY3RlZERvd25taXhJZHM7CisgIH0gZWxzZSBpZiAoaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0cyA9PSAyKSB7CisgICAgc2VsZWN0ZWREcmNTZXRJZHMgPSBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREcmNTZXRJZHNbMF07CisgICAgc2VsZWN0ZWREb3dubWl4SWRzID0gaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRG93bm1peElkc1swXTsKKyAgICBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREcmNTZXRJZHNbMF0gPSBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREcmNTZXRJZHNbMV07CisgICAgaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRG93bm1peElkc1swXSA9CisgICAgICAgIGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERvd25taXhJZHNbMV07CisgICAgaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRHJjU2V0SWRzWzFdID0gc2VsZWN0ZWREcmNTZXRJZHM7CisgICAgaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRG93bm1peElkc1sxXSA9IHNlbGVjdGVkRG93bm1peElkczsKKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9zZWxlY3REb3dubWl4TWF0cml4KAorICAgIEhBTkRMRV9TRUxfUFJPQ19PVVRQVVQgaFNlbFByb2NPdXRwdXQsCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcpIHsKKyAgaW50IGk7CisgIGhTZWxQcm9jT3V0cHV0LT5iYXNlQ2hhbm5lbENvdW50ID0KKyAgICAgIGhVbmlEcmNDb25maWctPmNoYW5uZWxMYXlvdXQuYmFzZUNoYW5uZWxDb3VudDsKKyAgaFNlbFByb2NPdXRwdXQtPnRhcmdldENoYW5uZWxDb3VudCA9CisgICAgICBoVW5pRHJjQ29uZmlnLT5jaGFubmVsTGF5b3V0LmJhc2VDaGFubmVsQ291bnQ7CisgIGhTZWxQcm9jT3V0cHV0LT50YXJnZXRMYXlvdXQgPSAtMTsKKyAgaFNlbFByb2NPdXRwdXQtPmRvd25taXhNYXRyaXhQcmVzZW50ID0gMDsKKworICBpZiAoaFNlbFByb2NPdXRwdXQtPmFjdGl2ZURvd25taXhJZCAhPSAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudDsgaSsrKSB7CisgICAgICBET1dOTUlYX0lOU1RSVUNUSU9OUyogcERvd24gPSAmKGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNbaV0pOworCisgICAgICBpZiAoaFNlbFByb2NPdXRwdXQtPmFjdGl2ZURvd25taXhJZCA9PSBwRG93bi0+ZG93bm1peElkKSB7CisgICAgICAgIGhTZWxQcm9jT3V0cHV0LT50YXJnZXRDaGFubmVsQ291bnQgPSBwRG93bi0+dGFyZ2V0Q2hhbm5lbENvdW50OworICAgICAgICBoU2VsUHJvY091dHB1dC0+dGFyZ2V0TGF5b3V0ID0gcERvd24tPnRhcmdldExheW91dDsKKworICAgICAgICBpZiAocERvd24tPmRvd25taXhDb2VmZmljaWVudHNQcmVzZW50KSB7CisgICAgICAgICAgaW50IGosIGs7CisgICAgICAgICAgRklYUF9EQkwgZG93bm1peE9mZnNldCA9IGdldERvd25taXhPZmZzZXQoCisgICAgICAgICAgICAgIHBEb3duLCBoU2VsUHJvY091dHB1dC0+YmFzZUNoYW5uZWxDb3VudCk7IC8qIGUgPSAxICovCisKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaFNlbFByb2NPdXRwdXQtPmJhc2VDaGFubmVsQ291bnQ7IGorKykgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGhTZWxQcm9jT3V0cHV0LT50YXJnZXRDaGFubmVsQ291bnQ7IGsrKykgeworICAgICAgICAgICAgICBoU2VsUHJvY091dHB1dC0+ZG93bm1peE1hdHJpeFtqXVtrXSA9CisgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoCisgICAgICAgICAgICAgICAgICAgICAgZG93bm1peE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBwRG93bi0+ZG93bm1peENvZWZmaWNpZW50W2ogKyBrICogaFNlbFByb2NPdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+YmFzZUNoYW5uZWxDb3VudF0pCisgICAgICAgICAgICAgICAgICA8PCAyOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGhTZWxQcm9jT3V0cHV0LT5kb3dubWl4TWF0cml4UHJlc2VudCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2RyY1NldFByZVNlbGVjdGlvbigKKyAgICBTRUxfUFJPQ19JTlBVVCogaFNlbFByb2NJbnB1dCwgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzU2VsZWN0ZWQsIFNFTF9QUk9DX0NPREVDX01PREUgY29kZWNNb2RlKSB7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICBpbnQgaSwgajsKKworICBmb3IgKGkgPSAwOyBpIDwgaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHM7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNDb3VudEluY2xWaXJ0dWFsOyBqKyspIHsKKyAgICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uID0KKyAgICAgICAgICAmKGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tqXSk7CisgICAgICByZXRWYWwgPSBfZHJjU2V0UHJlU2VsZWN0aW9uU2luZ2xlSW5zdHJ1Y3Rpb24oCisgICAgICAgICAgaFNlbFByb2NJbnB1dCwgaSwgaFVuaURyY0NvbmZpZywgaExvdWRuZXNzSW5mb1NldCwgcERyY0luc3RydWN0aW9uLAorICAgICAgICAgICpwcENhbmRpZGF0ZXNQb3RlbnRpYWwsICpwcENhbmRpZGF0ZXNTZWxlY3RlZCwgY29kZWNNb2RlKTsKKyAgICAgIGlmIChyZXRWYWwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgIH0KKyAgfQorCisgIHJldFZhbCA9IF9wcmVTZWxlY3Rpb25SZXF1aXJlbWVudDkoaFNlbFByb2NJbnB1dCwgKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICBpZiAocmV0VmFsKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkgPT0gMCkgeworICAgIHJldFZhbCA9IF9kcmNTZXRTZWxlY3Rpb25BZGRDYW5kaWRhdGVzKAorICAgICAgICBoU2VsUHJvY0lucHV0LCAqcHBDYW5kaWRhdGVzUG90ZW50aWFsLCAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgIGlmIChyZXRWYWwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICB9CisKKyAgcmV0dXJuIHJldFZhbDsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2RyY1NldFJlcXVlc3RTZWxlY3Rpb24oCisgICAgU0VMX1BST0NfSU5QVVQqIGhTZWxQcm9jSW5wdXQsIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsOworICBpbnQgaTsKKworICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNQb3RlbnRpYWwpID09IDApIHsKKyAgICByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgIGlmIChyZXRWYWwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICB9CisKKyAgaWYgKGhTZWxQcm9jSW5wdXQtPmR5bmFtaWNSYW5nZUNvbnRyb2xPbikgeworICAgIGlmIChoU2VsUHJvY0lucHV0LT5udW1EcmNGZWF0dXJlUmVxdWVzdHMgPT0gMCkgeworICAgICAgcmV0VmFsID0gX3NlbGVjdERyY1NldEVmZmVjdE5vbmUoaFVuaURyY0NvbmZpZywgKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisKKyAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKSA9PSAwKSB7CisgICAgICAgIERSQ19GRUFUVVJFX1JFUVVFU1QgZmFsbGJhY2tSZXF1ZXN0OworICAgICAgICBmYWxsYmFja1JlcXVlc3QuZHJjRWZmZWN0VHlwZS5udW1SZXF1ZXN0cyA9IDU7CisgICAgICAgIGZhbGxiYWNrUmVxdWVzdC5kcmNFZmZlY3RUeXBlLm51bVJlcXVlc3RzRGVzaXJlZCA9IDU7CisgICAgICAgIGZhbGxiYWNrUmVxdWVzdC5kcmNFZmZlY3RUeXBlLnJlcXVlc3RbMF0gPSBERVRSX0dFTkVSQUxfQ09NUFI7CisgICAgICAgIGZhbGxiYWNrUmVxdWVzdC5kcmNFZmZlY3RUeXBlLnJlcXVlc3RbMV0gPSBERVRSX05JR0hUOworICAgICAgICBmYWxsYmFja1JlcXVlc3QuZHJjRWZmZWN0VHlwZS5yZXF1ZXN0WzJdID0gREVUUl9OT0lTWTsKKyAgICAgICAgZmFsbGJhY2tSZXF1ZXN0LmRyY0VmZmVjdFR5cGUucmVxdWVzdFszXSA9IERFVFJfTElNSVRFRDsKKyAgICAgICAgZmFsbGJhY2tSZXF1ZXN0LmRyY0VmZmVjdFR5cGUucmVxdWVzdFs0XSA9IERFVFJfTE9XTEVWRUw7CisKKyAgICAgICAgcmV0VmFsID0gX3NlbGVjdEVmZmVjdFR5cGVGZWF0dXJlKGhVbmlEcmNDb25maWcsIGZhbGxiYWNrUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgICB9CisKKyAgICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoU2VsUHJvY0lucHV0LT5udW1EcmNGZWF0dXJlUmVxdWVzdHM7IGkrKykgeworICAgICAgICBpZiAoaFNlbFByb2NJbnB1dC0+ZHJjRmVhdHVyZVJlcXVlc3RUeXBlW2ldID09IERGUlRfRUZGRUNUX1RZUEUpIHsKKyAgICAgICAgICByZXRWYWwgPSBfc2VsZWN0RWZmZWN0VHlwZUZlYXR1cmUoCisgICAgICAgICAgICAgIGhVbmlEcmNDb25maWcsIGhTZWxQcm9jSW5wdXQtPmRyY0ZlYXR1cmVSZXF1ZXN0W2ldLAorICAgICAgICAgICAgICBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKworICAgICAgICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmIChoU2VsUHJvY0lucHV0LT5kcmNGZWF0dXJlUmVxdWVzdFR5cGVbaV0gPT0KKyAgICAgICAgICAgICAgICAgREZSVF9EWU5BTUlDX1JBTkdFKSB7CisgICAgICAgICAgcmV0VmFsID0gX3NlbGVjdER5bmFtaWNSYW5nZSgKKyAgICAgICAgICAgICAgaFVuaURyY0NvbmZpZywgaExvdWRuZXNzSW5mb1NldCwKKyAgICAgICAgICAgICAgaFNlbFByb2NJbnB1dC0+ZHJjRmVhdHVyZVJlcXVlc3RbaV0sCisgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPmRvd25taXhJZFJlcXVlc3RlZCwgaFNlbFByb2NJbnB1dC0+YWxidW1Nb2RlLAorICAgICAgICAgICAgICAqcHBDYW5kaWRhdGVzUG90ZW50aWFsLCAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworCisgICAgICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpID4gMCkgeworICAgICAgICAgICAgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcihwcENhbmRpZGF0ZXNQb3RlbnRpYWwsIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgICAgIH0gZWxzZSBpZiAoaFNlbFByb2NJbnB1dC0+ZHJjRmVhdHVyZVJlcXVlc3RUeXBlW2ldID09CisgICAgICAgICAgICAgICAgICAgREZSVF9EUkNfQ0hBUkFDVEVSSVNUSUMpIHsKKyAgICAgICAgICByZXRWYWwgPSBfc2VsZWN0RHJjQ2hhcmFjdGVyaXN0aWMoCisgICAgICAgICAgICAgIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPmRyY0ZlYXR1cmVSZXF1ZXN0W2ldLmRyY0NoYXJhY3RlcmlzdGljLAorICAgICAgICAgICAgICBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKworICAgICAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKSA+IDApIHsKKyAgICAgICAgICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChyZXRWYWwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHluYW1pY1JhbmdlTWVhc3VyZW1lbnQoCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QsCisgICAgVUNIQVIgZG93bm1peElkUmVxdWVzdGVkLAorICAgIERZTl9SQU5HRV9NRUFTVVJFTUVOVF9SRVFVRVNUX1RZUEUgZHluYW1pY1JhbmdlTWVhc3VyZW1lbnRUeXBlLAorICAgIGludCBhbGJ1bU1vZGUsIGludCogcFBlYWtUb0F2ZXJhZ2VQcmVzZW50LCBGSVhQX0RCTCogcFBlYWtUb0F2ZXJhZ2UpIHsKKyAgaW50IGk7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICBpbnQgZHJjU2V0SWQgPSBmTWF4KDAsIHBJbnN0LT5kcmNTZXRJZCk7CisKKyAgKnBQZWFrVG9BdmVyYWdlUHJlc2VudCA9IDA7CisKKyAgaWYgKGFsYnVtTW9kZSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50OyBpKyspIHsKKyAgICAgIExPVURORVNTX0lORk8qIHBMb3VkbmVzc0luZm8gPSAmKGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtW2ldKTsKKworICAgICAgaWYgKGRyY1NldElkID09IHBMb3VkbmVzc0luZm8tPmRyY1NldElkKSB7CisgICAgICAgIGlmIChkb3dubWl4SWRSZXF1ZXN0ZWQgPT0gcExvdWRuZXNzSW5mby0+ZG93bm1peElkKSB7CisgICAgICAgICAgcmV0VmFsID0gX2V4dHJhY3RMb3VkbmVzc1BlYWtUb0F2ZXJhZ2VWYWx1ZSgKKyAgICAgICAgICAgICAgcExvdWRuZXNzSW5mbywgZHluYW1pY1JhbmdlTWVhc3VyZW1lbnRUeXBlLCBwUGVha1RvQXZlcmFnZVByZXNlbnQsCisgICAgICAgICAgICAgIHBQZWFrVG9BdmVyYWdlKTsKKyAgICAgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoKnBQZWFrVG9BdmVyYWdlUHJlc2VudCA9PSAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0NvdW50OyBpKyspIHsKKyAgICAgIExPVURORVNTX0lORk8qIHBMb3VkbmVzc0luZm8gPSAmKGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb1tpXSk7CisKKyAgICAgIGlmIChkcmNTZXRJZCA9PSBwTG91ZG5lc3NJbmZvLT5kcmNTZXRJZCkgeworICAgICAgICBpZiAoZG93bm1peElkUmVxdWVzdGVkID09IHBMb3VkbmVzc0luZm8tPmRvd25taXhJZCkgeworICAgICAgICAgIHJldFZhbCA9IF9leHRyYWN0TG91ZG5lc3NQZWFrVG9BdmVyYWdlVmFsdWUoCisgICAgICAgICAgICAgIHBMb3VkbmVzc0luZm8sIGR5bmFtaWNSYW5nZU1lYXN1cmVtZW50VHlwZSwgcFBlYWtUb0F2ZXJhZ2VQcmVzZW50LAorICAgICAgICAgICAgICBwUGVha1RvQXZlcmFnZSk7CisgICAgICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldFZhbDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBfZHJjZGVjX3NlbGVjdGlvbl9hZGROZXcoCisgICAgRFJDREVDX1NFTEVDVElPTiogcFNlbGVjdGlvbikgeworICBpZiAocFNlbGVjdGlvbi0+bnVtRGF0YSA8ICgxMiArIDEgKyA2KSkgeworICAgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcERhdGEgPSAmKHBTZWxlY3Rpb24tPmRhdGFbcFNlbGVjdGlvbi0+bnVtRGF0YV0pOworICAgIEZES21lbXNldChwRGF0YSwgMCwgc2l6ZW9mKERSQ0RFQ19TRUxFQ1RJT05fREFUQSkpOworICAgIHBTZWxlY3Rpb24tPm51bURhdGErKzsKKworICAgIHJldHVybiBwRGF0YTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBfZHJjZGVjX3NlbGVjdGlvbl9hZGQoCisgICAgRFJDREVDX1NFTEVDVElPTiogcFNlbGVjdGlvbiwgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwRGF0YUluKSB7CisgIGlmIChwU2VsZWN0aW9uLT5udW1EYXRhIDwgKDEyICsgMSArIDYpKSB7CisgICAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwRGF0YSA9ICYocFNlbGVjdGlvbi0+ZGF0YVtwU2VsZWN0aW9uLT5udW1EYXRhXSk7CisgICAgRkRLbWVtY3B5KHBEYXRhLCBwRGF0YUluLCBzaXplb2YoRFJDREVDX1NFTEVDVElPTl9EQVRBKSk7CisgICAgcFNlbGVjdGlvbi0+bnVtRGF0YSsrOworICAgIHJldHVybiBwRGF0YTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgaW50IF9kcmNkZWNfc2VsZWN0aW9uX2NsZWFyKERSQ0RFQ19TRUxFQ1RJT04qIHBTZWxlY3Rpb24pIHsKKyAgcmV0dXJuIHBTZWxlY3Rpb24tPm51bURhdGEgPSAwOworfQorCitzdGF0aWMgaW50IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihEUkNERUNfU0VMRUNUSU9OKiBwU2VsZWN0aW9uKSB7CisgIHJldHVybiBwU2VsZWN0aW9uLT5udW1EYXRhOworfQorCitzdGF0aWMgaW50IF9kcmNkZWNfc2VsZWN0aW9uX3NldE51bWJlcihEUkNERUNfU0VMRUNUSU9OKiBwU2VsZWN0aW9uLCBpbnQgbnVtKSB7CisgIGlmIChudW0gPj0gMCAmJiBudW0gPCBwU2VsZWN0aW9uLT5udW1EYXRhKSB7CisgICAgcmV0dXJuIHBTZWxlY3Rpb24tPm51bURhdGEgPSBudW07CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHBTZWxlY3Rpb24tPm51bURhdGE7CisgIH0KK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQoCisgICAgRFJDREVDX1NFTEVDVElPTiogcFNlbGVjdGlvbiwgaW50IGF0KSB7CisgIGlmIChhdCA+PSAwICYmIGF0IDwgKDEyICsgMSArIDYpKSB7CisgICAgcmV0dXJuICYocFNlbGVjdGlvbi0+ZGF0YVthdF0pOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBpbnQgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcihEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBEUkNERUNfU0VMRUNUSU9OKiBwVG1wID0gKnBwQ2FuZGlkYXRlc1BvdGVudGlhbDsKKyAgKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCA9ICpwcENhbmRpZGF0ZXNTZWxlY3RlZDsKKyAgKnBwQ2FuZGlkYXRlc1NlbGVjdGVkID0gcFRtcDsKKyAgX2RyY2RlY19zZWxlY3Rpb25fY2xlYXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3N3YXBTZWxlY3Rpb24oRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIERSQ0RFQ19TRUxFQ1RJT04qIHBUbXAgPSAqcHBDYW5kaWRhdGVzUG90ZW50aWFsOworICAqcHBDYW5kaWRhdGVzUG90ZW50aWFsID0gKnBwQ2FuZGlkYXRlc1NlbGVjdGVkOworICAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQgPSBwVG1wOworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBMT1VETkVTU19JTkZPKiBfZ2V0TG91ZG5lc3NJbmZvU3RydWN0dXJlKAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LCBpbnQgZHJjU2V0SWQsIGludCBkb3dubWl4SWQsCisgICAgaW50IGFsYnVtTW9kZSkgeworICBpbnQgaSwgajsKKyAgaW50IGNvdW50OworCisgIExPVURORVNTX0lORk8qIHBMb3VkbmVzc0luZm8gPSBOVUxMOworCisgIGlmIChhbGJ1bU1vZGUpIHsKKyAgICBjb3VudCA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtQ291bnQ7CisgICAgcExvdWRuZXNzSW5mbyA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtOworICB9IGVsc2UgeworICAgIGNvdW50ID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQ291bnQ7CisgICAgcExvdWRuZXNzSW5mbyA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mbzsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaWYgKChwTG91ZG5lc3NJbmZvW2ldLmRyY1NldElkID09IGRyY1NldElkKSAmJgorICAgICAgICAocExvdWRuZXNzSW5mb1tpXS5kb3dubWl4SWQgPT0gZG93bm1peElkKSkgeworICAgICAgZm9yIChqID0gMDsgaiA8IHBMb3VkbmVzc0luZm9baV0ubWVhc3VyZW1lbnRDb3VudDsgaisrKSB7CisgICAgICAgIGlmICgocExvdWRuZXNzSW5mb1tpXS5sb3VkbmVzc01lYXN1cmVtZW50W2pdLm1ldGhvZERlZmluaXRpb24gPT0gMSkgfHwKKyAgICAgICAgICAgIChwTG91ZG5lc3NJbmZvW2ldLmxvdWRuZXNzTWVhc3VyZW1lbnRbal0ubWV0aG9kRGVmaW5pdGlvbiA9PSAyKSkgeworICAgICAgICAgIHJldHVybiAmcExvdWRuZXNzSW5mb1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgTE9VRE5FU1NfSU5GTyogX2dldEFwcGxpY2FibGVMb3VkbmVzc0luZm9TdHJ1Y3R1cmUoCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsIGludCBkcmNTZXRJZCwKKyAgICBpbnQgZG93bm1peElkUmVxdWVzdGVkLCBpbnQgYWxidW1Nb2RlKSB7CisgIExPVURORVNTX0lORk8qIHBMb3VkbmVzc0luZm8gPSBOVUxMOworCisgIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgcExvdWRuZXNzSW5mbyA9IF9nZXRMb3VkbmVzc0luZm9TdHJ1Y3R1cmUoaExvdWRuZXNzSW5mb1NldCwgZHJjU2V0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhJZFJlcXVlc3RlZCwgYWxidW1Nb2RlKTsKKworICAvKiBmYWxsYmFjayB2YWx1ZXMgKi8KKyAgaWYgKHBMb3VkbmVzc0luZm8gPT0gTlVMTCkgeworICAgIHBMb3VkbmVzc0luZm8gPQorICAgICAgICBfZ2V0TG91ZG5lc3NJbmZvU3RydWN0dXJlKGhMb3VkbmVzc0luZm9TZXQsIGRyY1NldElkLCAweDdGLCBhbGJ1bU1vZGUpOworICB9CisKKyAgaWYgKHBMb3VkbmVzc0luZm8gPT0gTlVMTCkgeworICAgIHBMb3VkbmVzc0luZm8gPSBfZ2V0TG91ZG5lc3NJbmZvU3RydWN0dXJlKGhMb3VkbmVzc0luZm9TZXQsIDB4M0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peElkUmVxdWVzdGVkLCBhbGJ1bU1vZGUpOworICB9CisKKyAgaWYgKHBMb3VkbmVzc0luZm8gPT0gTlVMTCkgeworICAgIHBMb3VkbmVzc0luZm8gPSBfZ2V0TG91ZG5lc3NJbmZvU3RydWN0dXJlKGhMb3VkbmVzc0luZm9TZXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peElkUmVxdWVzdGVkLCBhbGJ1bU1vZGUpOworICB9CisKKyAgaWYgKHBMb3VkbmVzc0luZm8gPT0gTlVMTCkgeworICAgIHBMb3VkbmVzc0luZm8gPQorICAgICAgICBfZ2V0TG91ZG5lc3NJbmZvU3RydWN0dXJlKGhMb3VkbmVzc0luZm9TZXQsIDB4M0YsIDB4N0YsIGFsYnVtTW9kZSk7CisgIH0KKworICBpZiAocExvdWRuZXNzSW5mbyA9PSBOVUxMKSB7CisgICAgcExvdWRuZXNzSW5mbyA9CisgICAgICAgIF9nZXRMb3VkbmVzc0luZm9TdHJ1Y3R1cmUoaExvdWRuZXNzSW5mb1NldCwgMCwgMHg3RiwgYWxidW1Nb2RlKTsKKyAgfQorCisgIGlmIChwTG91ZG5lc3NJbmZvID09IE5VTEwpIHsKKyAgICBwTG91ZG5lc3NJbmZvID0KKyAgICAgICAgX2dldExvdWRuZXNzSW5mb1N0cnVjdHVyZShoTG91ZG5lc3NJbmZvU2V0LCBkcmNTZXRJZCwgMCwgYWxidW1Nb2RlKTsKKyAgfQorCisgIGlmIChwTG91ZG5lc3NJbmZvID09IE5VTEwpIHsKKyAgICBwTG91ZG5lc3NJbmZvID0KKyAgICAgICAgX2dldExvdWRuZXNzSW5mb1N0cnVjdHVyZShoTG91ZG5lc3NJbmZvU2V0LCAweDNGLCAwLCBhbGJ1bU1vZGUpOworICB9CisKKyAgaWYgKHBMb3VkbmVzc0luZm8gPT0gTlVMTCkgeworICAgIHBMb3VkbmVzc0luZm8gPQorICAgICAgICBfZ2V0TG91ZG5lc3NJbmZvU3RydWN0dXJlKGhMb3VkbmVzc0luZm9TZXQsIDAsIDAsIGFsYnVtTW9kZSk7CisgIH0KKworICByZXR1cm4gcExvdWRuZXNzSW5mbzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9EQkwgdmFsdWU7CisgIGludCBvcmRlcjsKK30gVkFMVUVfT1JERVI7CisKK3ZvaWQgX2luaXRWYWx1ZU9yZGVyKFZBTFVFX09SREVSKiBwVmFsdWUpIHsKKyAgcFZhbHVlLT52YWx1ZSA9IChGSVhQX0RCTCkwOworICBwVmFsdWUtPm9yZGVyID0gLTE7Cit9CisKK2VudW0geworICBNU19CT05VUzAgPSAwLAorICBNU19CT05VUzE3NzAsCisgIE1TX0JPTlVTVVNFUiwKKyAgTVNfQk9OVVNFWFBFUlQsCisgIE1TX1JFU0EsCisgIE1TX1JFU0IsCisgIE1TX1JFU0MsCisgIE1TX1JFU0QsCisgIE1TX1JFU0UsCisgIE1TX1BST0dSQU1MT1VETkVTUywKKyAgTVNfUEVBS0xPVURORVNTCit9OworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZ2V0TWV0aG9kVmFsdWUoCisgICAgVkFMVUVfT1JERVIqIHBWYWx1ZU9yZGVyLCBGSVhQX0RCTCB2YWx1ZSwgaW50IG1lYXN1cmVtZW50U3lzdGVtLAorICAgIGludCBtZWFzdXJlbWVudFN5c3RlbVJlcXVlc3RlZCkgeworICBjb25zdCBpbnQgcm93cyA9IDExOworICBjb25zdCBpbnQgY29sdW1ucyA9IDEyOworICBjb25zdCBpbnQgcE9yZGVyaW5nW3Jvd3NdW2NvbHVtbnNdID0geworICAgICAgezAsIDAsIDgsIDAsIDEsIDMsIDAsIDUsIDYsIDcsIDQsIDJ9LCAvKiBkZWZhdWx0ID0gYm9udXMxNzcwICovCisgICAgICB7MCwgMCwgOCwgMCwgMSwgMywgMCwgNSwgNiwgNywgNCwgMn0sIC8qIGJvbnVzMTc3MCAqLworICAgICAgezAsIDAsIDEsIDAsIDgsIDUsIDAsIDIsIDMsIDQsIDYsIDd9LCAvKiBib251c1VzZXIgKi8KKyAgICAgIHswLCAwLCAzLCAwLCAxLCA4LCAwLCA0LCA1LCA2LCA3LCAyfSwgLyogYm9udXNFeHBlcnQgKi8KKyAgICAgIHswLCAwLCA1LCAwLCAxLCAzLCAwLCA4LCA2LCA3LCA0LCAyfSwgLyogUmVzQSAqLworICAgICAgezAsIDAsIDUsIDAsIDEsIDMsIDAsIDYsIDgsIDcsIDQsIDJ9LCAvKiBSZXNCICovCisgICAgICB7MCwgMCwgNSwgMCwgMSwgMywgMCwgNiwgNywgOCwgNCwgMn0sIC8qIFJlc0MgKi8KKyAgICAgIHswLCAwLCAzLCAwLCAxLCA3LCAwLCA0LCA1LCA2LCA4LCAyfSwgLyogUmVzRCAqLworICAgICAgezAsIDAsIDEsIDAsIDcsIDUsIDAsIDIsIDMsIDQsIDYsIDh9LCAvKiBSZXNFICovCisgICAgICB7MCwgMCwgMSwgMCwgMCwgMCwgMCwgMiwgMywgNCwgMCwgMH0sIC8qIFByb2dyYW1Mb3VkbmVzcyAqLworICAgICAgezAsIDcsIDAsIDAsIDAsIDAsIDYsIDUsIDQsIDMsIDIsIDF9ICAvKiBQZWFrTG91ZG5lc3MgKi8KKyAgfTsKKworICBpZiAobWVhc3VyZW1lbnRTeXN0ZW1SZXF1ZXN0ZWQgPCAwIHx8IG1lYXN1cmVtZW50U3lzdGVtUmVxdWVzdGVkID49IHJvd3MgfHwKKyAgICAgIG1lYXN1cmVtZW50U3lzdGVtIDwgMCB8fCBtZWFzdXJlbWVudFN5c3RlbSA+PSBjb2x1bW5zKSB7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgIH0KKworICBpZiAocE9yZGVyaW5nW21lYXN1cmVtZW50U3lzdGVtUmVxdWVzdGVkXVttZWFzdXJlbWVudFN5c3RlbV0gPgorICAgICAgcFZhbHVlT3JkZXItPm9yZGVyKSB7CisgICAgcFZhbHVlT3JkZXItPm9yZGVyID0KKyAgICAgICAgcE9yZGVyaW5nW21lYXN1cmVtZW50U3lzdGVtUmVxdWVzdGVkXVttZWFzdXJlbWVudFN5c3RlbV07CisgICAgcFZhbHVlT3JkZXItPnZhbHVlID0gdmFsdWU7CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dldExvdWRuZXNzKAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LCBpbnQgYWxidW1Nb2RlLAorICAgIE1FVEhPRF9ERUZJTklUSU9OX1JFUVVFU1QgbWVhc3VyZW1lbnRNZXRob2RSZXF1ZXN0ZWQsCisgICAgTUVBU1VSRU1FTlRfU1lTVEVNX1JFUVVFU1QgbWVhc3VyZW1lbnRTeXN0ZW1SZXF1ZXN0ZWQsCisgICAgRklYUF9EQkwgdGFyZ2V0TG91ZG5lc3MsIC8qIGUgPSA3ICovCisgICAgaW50IGRyY1NldElkLCBpbnQgZG93bm1peElkUmVxdWVzdGVkLAorICAgIEZJWFBfREJMKiBwTG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbiwgLyogZSA9IDcgKi8KKyAgICBGSVhQX0RCTCogcExvdWRuZXNzKSAgICAgICAgICAgICAgICAgIC8qIGUgPSA3ICovCit7CisgIGludCBpbmRleDsKKworICBMT1VETkVTU19JTkZPKiBwTG91ZG5lc3NJbmZvID0gTlVMTDsKKyAgVkFMVUVfT1JERVIgdmFsdWVPcmRlcjsKKworICAvKiBtYXAgTURSX0RFRkFVTFQgdG8gTURSX1BST0dSQU1fTE9VRE5FU1MgKi8KKyAgTUVUSE9EX0RFRklOSVRJT05fUkVRVUVTVCByZXF1ZXN0ZWRNZXRob2REZWZpbml0aW9uID0KKyAgICAgIG1lYXN1cmVtZW50TWV0aG9kUmVxdWVzdGVkIDwgTURSX0FOQ0hPUl9MT1VETkVTUyA/IE1EUl9QUk9HUkFNX0xPVURORVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNRFJfQU5DSE9SX0xPVURORVNTOworCisgIGlmIChtZWFzdXJlbWVudE1ldGhvZFJlcXVlc3RlZCA+IE1EUl9BTkNIT1JfTE9VRE5FU1MpIHsKKyAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgfQorCisgIF9pbml0VmFsdWVPcmRlcigmdmFsdWVPcmRlcik7CisKKyAgKnBMb3VkbmVzcyA9IFVOREVGSU5FRF9MT1VETkVTU19WQUxVRTsKKyAgKnBMb3VkbmVzc05vcm1hbGl6YXRpb25HYWluID0gKEZJWFBfREJMKTA7CisKKyAgaWYgKGRyY1NldElkIDwgMCkgeworICAgIGRyY1NldElkID0gMDsKKyAgfQorCisgIHBMb3VkbmVzc0luZm8gPSBfZ2V0QXBwbGljYWJsZUxvdWRuZXNzSW5mb1N0cnVjdHVyZSgKKyAgICAgIGhMb3VkbmVzc0luZm9TZXQsIGRyY1NldElkLCBkb3dubWl4SWRSZXF1ZXN0ZWQsIGFsYnVtTW9kZSk7CisKKyAgaWYgKGFsYnVtTW9kZSAmJiAocExvdWRuZXNzSW5mbyA9PSBOVUxMKSkgeworICAgIHBMb3VkbmVzc0luZm8gPSBfZ2V0QXBwbGljYWJsZUxvdWRuZXNzSW5mb1N0cnVjdHVyZSgKKyAgICAgICAgaExvdWRuZXNzSW5mb1NldCwgZHJjU2V0SWQsIGRvd25taXhJZFJlcXVlc3RlZCwgMCk7CisgIH0KKworICBpZiAocExvdWRuZXNzSW5mbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgfQorCisgIGluZGV4ID0gLTE7CisKKyAgZG8geworICAgIGluZGV4ID0gX2ZpbmRNZXRob2REZWZpbml0aW9uKHBMb3VkbmVzc0luZm8sIHJlcXVlc3RlZE1ldGhvZERlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKyAxKTsKKworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICBfZ2V0TWV0aG9kVmFsdWUoCisgICAgICAgICAgJnZhbHVlT3JkZXIsIHBMb3VkbmVzc0luZm8tPmxvdWRuZXNzTWVhc3VyZW1lbnRbaW5kZXhdLm1ldGhvZFZhbHVlLAorICAgICAgICAgIHBMb3VkbmVzc0luZm8tPmxvdWRuZXNzTWVhc3VyZW1lbnRbaW5kZXhdLm1lYXN1cmVtZW50U3lzdGVtLAorICAgICAgICAgIG1lYXN1cmVtZW50U3lzdGVtUmVxdWVzdGVkKTsKKyAgICB9CisgIH0gd2hpbGUgKGluZGV4ID49IDApOworCisgIC8qIHJlcGVhdCB3aXRoIG90aGVyIG1ldGhvZCBkZWZpbml0aW9uICovCisgIGlmICh2YWx1ZU9yZGVyLm9yZGVyID09IC0xKSB7CisgICAgaW5kZXggPSAtMTsKKworICAgIGRvIHsKKyAgICAgIGluZGV4ID0gX2ZpbmRNZXRob2REZWZpbml0aW9uKAorICAgICAgICAgIHBMb3VkbmVzc0luZm8sCisgICAgICAgICAgcmVxdWVzdGVkTWV0aG9kRGVmaW5pdGlvbiA9PSBNRFJfUFJPR1JBTV9MT1VETkVTUworICAgICAgICAgICAgICA/IE1EUl9BTkNIT1JfTE9VRE5FU1MKKyAgICAgICAgICAgICAgOiBNRFJfUFJPR1JBTV9MT1VETkVTUywKKyAgICAgICAgICBpbmRleCArIDEpOworCisgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBfZ2V0TWV0aG9kVmFsdWUoCisgICAgICAgICAgICAmdmFsdWVPcmRlciwgcExvdWRuZXNzSW5mby0+bG91ZG5lc3NNZWFzdXJlbWVudFtpbmRleF0ubWV0aG9kVmFsdWUsCisgICAgICAgICAgICBwTG91ZG5lc3NJbmZvLT5sb3VkbmVzc01lYXN1cmVtZW50W2luZGV4XS5tZWFzdXJlbWVudFN5c3RlbSwKKyAgICAgICAgICAgIG1lYXN1cmVtZW50U3lzdGVtUmVxdWVzdGVkKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChpbmRleCA+PSAwKTsKKyAgfQorCisgIGlmICh2YWx1ZU9yZGVyLm9yZGVyID09IC0xKSB7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgIH0gZWxzZSB7CisgICAgKnBMb3VkbmVzc05vcm1hbGl6YXRpb25HYWluID0gdGFyZ2V0TG91ZG5lc3MgLSB2YWx1ZU9yZGVyLnZhbHVlOworICAgICpwTG91ZG5lc3MgPSB2YWx1ZU9yZGVyLnZhbHVlOworICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX3RydWVQZWFrTGV2ZWxJc1ByZXNlbnQoSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkcmNTZXRJZCwgaW50IGRvd25taXhJZCwgaW50IGFsYnVtTW9kZSkgeworICBpbnQgaTsKKyAgaW50IGNvdW50OworICBMT1VETkVTU19JTkZPKiBwTG91ZG5lc3NJbmZvID0gTlVMTDsKKworICBpZiAoYWxidW1Nb2RlKSB7CisgICAgY291bnQgPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50OworICAgIHBMb3VkbmVzc0luZm8gPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bTsKKyAgfSBlbHNlIHsKKyAgICBjb3VudCA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0NvdW50OworICAgIHBMb3VkbmVzc0luZm8gPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm87CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGlmICgocExvdWRuZXNzSW5mb1tpXS5kcmNTZXRJZCA9PSBkcmNTZXRJZCkgJiYKKyAgICAgICAgKHBMb3VkbmVzc0luZm9baV0uZG93bm1peElkID09IGRvd25taXhJZCkpIHsKKyAgICAgIGlmIChwTG91ZG5lc3NJbmZvW2ldLnRydWVQZWFrTGV2ZWxQcmVzZW50KSByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dldFRydWVQZWFrTGV2ZWwoCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsIGludCBkcmNTZXRJZCwgaW50IGRvd25taXhJZCwKKyAgICBpbnQgYWxidW1Nb2RlLCBGSVhQX0RCTCogcFRydWVQZWFrTGV2ZWwpIHsKKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgTE9VRE5FU1NfSU5GTyogcExvdWRuZXNzSW5mbyA9IE5VTEw7CisKKyAgaWYgKGFsYnVtTW9kZSkgeworICAgIGNvdW50ID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudDsKKyAgICBwTG91ZG5lc3NJbmZvID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW07CisgIH0gZWxzZSB7CisgICAgY291bnQgPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9Db3VudDsKKyAgICBwTG91ZG5lc3NJbmZvID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAoKHBMb3VkbmVzc0luZm9baV0uZHJjU2V0SWQgPT0gZHJjU2V0SWQpICYmCisgICAgICAgIChwTG91ZG5lc3NJbmZvW2ldLmRvd25taXhJZCA9PSBkb3dubWl4SWQpKSB7CisgICAgICBpZiAocExvdWRuZXNzSW5mb1tpXS50cnVlUGVha0xldmVsUHJlc2VudCkgeworICAgICAgICAqcFRydWVQZWFrTGV2ZWwgPSBwTG91ZG5lc3NJbmZvW2ldLnRydWVQZWFrTGV2ZWw7CisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7Cit9CisKK3N0YXRpYyBpbnQgX3NhbXBsZVBlYWtMZXZlbElzUHJlc2VudChIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHJjU2V0SWQsIGludCBkb3dubWl4SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsYnVtTW9kZSkgeworICBpbnQgaTsKKyAgaW50IGNvdW50OworICBMT1VETkVTU19JTkZPKiBwTG91ZG5lc3NJbmZvID0gTlVMTDsKKworICBpZiAoYWxidW1Nb2RlKSB7CisgICAgY291bnQgPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50OworICAgIHBMb3VkbmVzc0luZm8gPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bTsKKyAgfSBlbHNlIHsKKyAgICBjb3VudCA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0NvdW50OworICAgIHBMb3VkbmVzc0luZm8gPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm87CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGlmICgocExvdWRuZXNzSW5mb1tpXS5kcmNTZXRJZCA9PSBkcmNTZXRJZCkgJiYKKyAgICAgICAgKHBMb3VkbmVzc0luZm9baV0uZG93bm1peElkID09IGRvd25taXhJZCkpIHsKKyAgICAgIGlmIChwTG91ZG5lc3NJbmZvW2ldLnNhbXBsZVBlYWtMZXZlbFByZXNlbnQpIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZ2V0U2FtcGxlUGVha0xldmVsKAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LCBpbnQgZHJjU2V0SWQsIGludCBkb3dubWl4SWQsCisgICAgaW50IGFsYnVtTW9kZSwgRklYUF9EQkwqIHBTYW1wbGVQZWFrTGV2ZWwgLyogZSA9IDcgKi8KKykgeworICBpbnQgaTsKKyAgaW50IGNvdW50OworICBMT1VETkVTU19JTkZPKiBwTG91ZG5lc3NJbmZvID0gTlVMTDsKKworICBpZiAoYWxidW1Nb2RlKSB7CisgICAgY291bnQgPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50OworICAgIHBMb3VkbmVzc0luZm8gPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bTsKKyAgfSBlbHNlIHsKKyAgICBjb3VudCA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0NvdW50OworICAgIHBMb3VkbmVzc0luZm8gPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm87CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGlmICgocExvdWRuZXNzSW5mb1tpXS5kcmNTZXRJZCA9PSBkcmNTZXRJZCkgJiYKKyAgICAgICAgKHBMb3VkbmVzc0luZm9baV0uZG93bm1peElkID09IGRvd25taXhJZCkpIHsKKyAgICAgIGlmIChwTG91ZG5lc3NJbmZvW2ldLnNhbXBsZVBlYWtMZXZlbFByZXNlbnQpIHsKKyAgICAgICAgKnBTYW1wbGVQZWFrTGV2ZWwgPSBwTG91ZG5lc3NJbmZvW2ldLnNhbXBsZVBlYWtMZXZlbDsKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKK30KKworc3RhdGljIGludCBfbGltaXRlclBlYWtUYXJnZXRJc1ByZXNlbnQoCisgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwRHJjSW5zdHJ1Y3Rpb24sIGludCBkcmNTZXRJZCwgaW50IGRvd25taXhJZCkgeworICBpbnQgaTsKKworICBpZiAocERyY0luc3RydWN0aW9uLT5saW1pdGVyUGVha1RhcmdldFByZXNlbnQpIHsKKyAgICBpZiAoKHBEcmNJbnN0cnVjdGlvbi0+ZG93bm1peElkWzBdID09IGRvd25taXhJZCkgfHwKKyAgICAgICAgKHBEcmNJbnN0cnVjdGlvbi0+ZG93bm1peElkWzBdID09IDB4N0YpKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcERyY0luc3RydWN0aW9uLT5kb3dubWl4SWRDb3VudDsgaSsrKSB7CisgICAgICBpZiAocERyY0luc3RydWN0aW9uLT5kb3dubWl4SWRbaV0gPT0gZG93bm1peElkKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZ2V0TGltaXRlclBlYWtUYXJnZXQoCisgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwRHJjSW5zdHJ1Y3Rpb24sIGludCBkcmNTZXRJZCwgaW50IGRvd25taXhJZCwKKyAgICBGSVhQX0RCTCogcExpbWl0ZXJQZWFrVGFyZ2V0KSB7CisgIGludCBpOworCisgIGlmIChwRHJjSW5zdHJ1Y3Rpb24tPmxpbWl0ZXJQZWFrVGFyZ2V0UHJlc2VudCkgeworICAgIGlmICgocERyY0luc3RydWN0aW9uLT5kb3dubWl4SWRbMF0gPT0gZG93bm1peElkKSB8fAorICAgICAgICAocERyY0luc3RydWN0aW9uLT5kb3dubWl4SWRbMF0gPT0gMHg3RikpIHsKKyAgICAgICpwTGltaXRlclBlYWtUYXJnZXQgPQorICAgICAgICAgICgoRlhfU0dMMkZYX0RCTChwRHJjSW5zdHJ1Y3Rpb24tPmxpbWl0ZXJQZWFrVGFyZ2V0KSA+PiAyKSk7CisgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwRHJjSW5zdHJ1Y3Rpb24tPmRvd25taXhJZENvdW50OyBpKyspIHsKKyAgICAgIGlmIChwRHJjSW5zdHJ1Y3Rpb24tPmRvd25taXhJZFtpXSA9PSBkb3dubWl4SWQpIHsKKyAgICAgICAgKnBMaW1pdGVyUGVha1RhcmdldCA9CisgICAgICAgICAgICAoKEZYX1NHTDJGWF9EQkwocERyY0luc3RydWN0aW9uLT5saW1pdGVyUGVha1RhcmdldCkgPj4gMikpOworICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworfQorCitzdGF0aWMgaW50IF9kb3dubWl4Q29lZmZpY2llbnRzQXJlUHJlc2VudChIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb3dubWl4SWQsIGludCogcEluZGV4KSB7CisgIGludCBpOworICAqcEluZGV4ID0gLTE7CisKKyAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudDsgaSsrKSB7CisgICAgaWYgKGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNbaV0uZG93bm1peElkID09IGRvd25taXhJZCkgeworICAgICAgaWYgKGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNbaV0uZG93bm1peENvZWZmaWNpZW50c1ByZXNlbnQpIHsKKyAgICAgICAgKnBJbmRleCA9IGk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZ2V0U2lnbmFsUGVha0xldmVsKAorICAgIEhBTkRMRV9TRUxfUFJPQ19JTlBVVCBoU2VsUHJvY0lucHV0LCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCwKKyAgICBpbnQgZG93bm1peElkUmVxdWVzdGVkLCBpbnQqIGV4cGxpY2l0UGVha0luZm9ybWF0aW9uUHJlc2VudCwKKyAgICBGSVhQX0RCTCogc2lnbmFsUGVha0xldmVsT3V0LCAvKiBlID0gNyAqLworICAgIFNFTF9QUk9DX0NPREVDX01PREUgY29kZWNNb2RlCisKKykgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKworICBpbnQgYWxidW1Nb2RlID0gaFNlbFByb2NJbnB1dC0+YWxidW1Nb2RlOworCisgIEZJWFBfREJMIHNpZ25hbFBlYWtMZXZlbFRtcCA9IChGSVhQX0RCTCkwOworICBGSVhQX0RCTCBzaWduYWxQZWFrTGV2ZWwgPSBGSVhQX0RCTCgwKTsKKworICBpbnQgZG14SWQgPSBkb3dubWl4SWRSZXF1ZXN0ZWQ7CisKKyAgaW50IGRyY1NldElkID0gcEluc3QtPmRyY1NldElkOworCisgIGlmIChkcmNTZXRJZCA8IDApIHsKKyAgICBkcmNTZXRJZCA9IDA7CisgIH0KKworICAqZXhwbGljaXRQZWFrSW5mb3JtYXRpb25QcmVzZW50ID0gMTsKKworICBpZiAoX3RydWVQZWFrTGV2ZWxJc1ByZXNlbnQoaExvdWRuZXNzSW5mb1NldCwgZHJjU2V0SWQsIGRteElkLCBhbGJ1bU1vZGUpKSB7CisgICAgcmV0VmFsID0gX2dldFRydWVQZWFrTGV2ZWwoaExvdWRuZXNzSW5mb1NldCwgZHJjU2V0SWQsIGRteElkLCBhbGJ1bU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hbFBlYWtMZXZlbCk7CisgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICB9IGVsc2UgaWYgKF9zYW1wbGVQZWFrTGV2ZWxJc1ByZXNlbnQoaExvdWRuZXNzSW5mb1NldCwgZHJjU2V0SWQsIGRteElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1Nb2RlKSkgeworICAgIHJldFZhbCA9IF9nZXRTYW1wbGVQZWFrTGV2ZWwoaExvdWRuZXNzSW5mb1NldCwgZHJjU2V0SWQsIGRteElkLCBhbGJ1bU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnbmFsUGVha0xldmVsKTsKKyAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgIH0gZWxzZSBpZiAoX3RydWVQZWFrTGV2ZWxJc1ByZXNlbnQoaExvdWRuZXNzSW5mb1NldCwgMHgzRiwgZG14SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1Nb2RlKSkgeworICAgIHJldFZhbCA9IF9nZXRUcnVlUGVha0xldmVsKGhMb3VkbmVzc0luZm9TZXQsIDB4M0YsIGRteElkLCBhbGJ1bU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hbFBlYWtMZXZlbCk7CisgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICB9IGVsc2UgaWYgKF9zYW1wbGVQZWFrTGV2ZWxJc1ByZXNlbnQoaExvdWRuZXNzSW5mb1NldCwgMHgzRiwgZG14SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bU1vZGUpKSB7CisgICAgcmV0VmFsID0gX2dldFNhbXBsZVBlYWtMZXZlbChoTG91ZG5lc3NJbmZvU2V0LCAweDNGLCBkbXhJZCwgYWxidW1Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hbFBlYWtMZXZlbCk7CisgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICB9IGVsc2UgaWYgKF9saW1pdGVyUGVha1RhcmdldElzUHJlc2VudChwSW5zdCwgZHJjU2V0SWQsIGRteElkKSkgeworICAgIHJldFZhbCA9IF9nZXRMaW1pdGVyUGVha1RhcmdldChwSW5zdCwgZHJjU2V0SWQsIGRteElkLCAmc2lnbmFsUGVha0xldmVsKTsKKyAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgIH0gZWxzZSBpZiAoZG14SWQgIT0gMCkgeworICAgIGludCBkb3dubWl4SW5zdHJ1Y3Rpb25JbmRleCA9IDA7CisgICAgRklYUF9EQkwgZG93bm1peFBlYWtMZXZlbERCID0gMDsKKworICAgICpleHBsaWNpdFBlYWtJbmZvcm1hdGlvblByZXNlbnQgPSAwOworCisgICAgc2lnbmFsUGVha0xldmVsVG1wID0gRklYUF9EQkwoMCk7CisKKyAgICBpZiAoX2Rvd25taXhDb2VmZmljaWVudHNBcmVQcmVzZW50KGhVbmlEcmNDb25maWcsIGRteElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvd25taXhJbnN0cnVjdGlvbkluZGV4KSkgeworICAgICAgRklYUF9EQkwgZEJfbTsKKyAgICAgIGludCBkQl9lOworICAgICAgRklYUF9EQkwgY29lZmY7CisgICAgICBGSVhQX0RCTCBzdW0sIG1heFN1bTsgLyogZSA9IDcsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIHN1bSB1cCB1cCB0byAzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXggY29lZmZpY2llbnRzICh3aXRoIGUgPSAyKSAqLworICAgICAgaW50IGksIGo7CisgICAgICBET1dOTUlYX0lOU1RSVUNUSU9OUyogcERvd24gPQorICAgICAgICAgICYoaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc1tkb3dubWl4SW5zdHJ1Y3Rpb25JbmRleF0pOworICAgICAgRklYUF9EQkwgZG93bm1peE9mZnNldCA9IGdldERvd25taXhPZmZzZXQoCisgICAgICAgICAgcERvd24sIGhVbmlEcmNDb25maWctPmNoYW5uZWxMYXlvdXQuYmFzZUNoYW5uZWxDb3VudCk7IC8qIGUgPSAxICovCisgICAgICBtYXhTdW0gPSAoRklYUF9EQkwpMDsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHBEb3duLT50YXJnZXRDaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICBzdW0gPSAoRklYUF9EQkwpMDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGhVbmlEcmNDb25maWctPmNoYW5uZWxMYXlvdXQuYmFzZUNoYW5uZWxDb3VudDsgaisrKSB7CisgICAgICAgICAgY29lZmYgPSBwRG93bi0+ZG93bm1peENvZWZmaWNpZW50W2ogKyBpICogaFVuaURyY0NvbmZpZy0+Y2hhbm5lbExheW91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmFzZUNoYW5uZWxDb3VudF07CisgICAgICAgICAgc3VtICs9IGNvZWZmID4+IDU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heFN1bSA8IHN1bSkgbWF4U3VtID0gc3VtOworICAgICAgfQorCisgICAgICBtYXhTdW0gPSBmTXVsdERpdjIobWF4U3VtLCBkb3dubWl4T2Zmc2V0KSA8PCAyOworCisgICAgICBpZiAobWF4U3VtID09IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgNykpKSB7CisgICAgICAgIGRvd25taXhQZWFrTGV2ZWxEQiA9IChGSVhQX0RCTCkwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZEJfbSA9IGxpbjJkQihtYXhTdW0sIDcsICZkQl9lKTsgLyogZV9tYXhTdW0gPSA3ICovCisgICAgICAgIGRvd25taXhQZWFrTGV2ZWxEQiA9CisgICAgICAgICAgICBzY2FsZVZhbHVlKGRCX20sIGRCX2UgLSA3KTsgLyogZV9kb3dubWl4UGVha0xldmVsREIgPSA3ICovCisgICAgICB9CisgICAgfQorCisgICAgaWYgKF90cnVlUGVha0xldmVsSXNQcmVzZW50KGhMb3VkbmVzc0luZm9TZXQsIGRyY1NldElkLCAwLCBhbGJ1bU1vZGUpKSB7CisgICAgICByZXRWYWwgPSBfZ2V0VHJ1ZVBlYWtMZXZlbChoTG91ZG5lc3NJbmZvU2V0LCBkcmNTZXRJZCwgMCwgYWxidW1Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hbFBlYWtMZXZlbFRtcCk7CisgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgICAgfSBlbHNlIGlmIChfc2FtcGxlUGVha0xldmVsSXNQcmVzZW50KGhMb3VkbmVzc0luZm9TZXQsIGRyY1NldElkLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bU1vZGUpKSB7CisgICAgICByZXRWYWwgPSBfZ2V0U2FtcGxlUGVha0xldmVsKGhMb3VkbmVzc0luZm9TZXQsIGRyY1NldElkLCAwLCBhbGJ1bU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYWxQZWFrTGV2ZWxUbXApOworICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICAgIH0gZWxzZSBpZiAoX3RydWVQZWFrTGV2ZWxJc1ByZXNlbnQoaExvdWRuZXNzSW5mb1NldCwgMHgzRiwgMCwgYWxidW1Nb2RlKSkgeworICAgICAgcmV0VmFsID0gX2dldFRydWVQZWFrTGV2ZWwoaExvdWRuZXNzSW5mb1NldCwgMHgzRiwgMCwgYWxidW1Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hbFBlYWtMZXZlbFRtcCk7CisgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgICAgfSBlbHNlIGlmIChfc2FtcGxlUGVha0xldmVsSXNQcmVzZW50KGhMb3VkbmVzc0luZm9TZXQsIDB4M0YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtTW9kZSkpIHsKKyAgICAgIHJldFZhbCA9IF9nZXRTYW1wbGVQZWFrTGV2ZWwoaExvdWRuZXNzSW5mb1NldCwgMHgzRiwgMCwgYWxidW1Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnbmFsUGVha0xldmVsVG1wKTsKKyAgICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgICB9IGVsc2UgaWYgKF9saW1pdGVyUGVha1RhcmdldElzUHJlc2VudChwSW5zdCwgZHJjU2V0SWQsIDApKSB7CisgICAgICByZXRWYWwgPSBfZ2V0TGltaXRlclBlYWtUYXJnZXQocEluc3QsIGRyY1NldElkLCAwLCAmc2lnbmFsUGVha0xldmVsVG1wKTsKKyAgICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgICB9CisKKyAgICBzaWduYWxQZWFrTGV2ZWwgPSBzaWduYWxQZWFrTGV2ZWxUbXAgKyBkb3dubWl4UGVha0xldmVsREI7CisgIH0gZWxzZSB7CisgICAgc2lnbmFsUGVha0xldmVsID0gRklYUF9EQkwoMCk7IC8qIHdvcnN0IGNhc2UgZXN0aW1hdGUgKi8KKyAgICAqZXhwbGljaXRQZWFrSW5mb3JtYXRpb25QcmVzZW50ID0gRklYUF9EQkwoMCk7CisgIH0KKworICAqc2lnbmFsUGVha0xldmVsT3V0ID0gc2lnbmFsUGVha0xldmVsOworCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9leHRyYWN0TG91ZG5lc3NQZWFrVG9BdmVyYWdlVmFsdWUoCisgICAgTE9VRE5FU1NfSU5GTyogbG91ZG5lc3NJbmZvLAorICAgIERZTl9SQU5HRV9NRUFTVVJFTUVOVF9SRVFVRVNUX1RZUEUgZHluYW1pY1JhbmdlTWVhc3VyZW1lbnRUeXBlLAorICAgIGludCogcExvdWRuZXNzUGVha1RvQXZlcmFnZVZhbHVlUHJlc2VudCwKKyAgICBGSVhQX0RCTCogcExvdWRuZXNzUGVha1RvQXZlcmFnZVZhbHVlKSB7CisgIGludCBpOworCisgIFZBTFVFX09SREVSIHZhbHVlT3JkZXJMb3VkbmVzczsKKyAgVkFMVUVfT1JERVIgdmFsdWVPcmRlclBlYWtMb3VkbmVzczsKKworICBfaW5pdFZhbHVlT3JkZXIoJnZhbHVlT3JkZXJMb3VkbmVzcyk7CisgIF9pbml0VmFsdWVPcmRlcigmdmFsdWVPcmRlclBlYWtMb3VkbmVzcyk7CisKKyAgTE9VRE5FU1NfTUVBU1VSRU1FTlQqIHBMb3VkbmVzc01lYXN1cmUgPSBOVUxMOworCisgICpwTG91ZG5lc3NQZWFrVG9BdmVyYWdlVmFsdWVQcmVzZW50ID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgbG91ZG5lc3NJbmZvLT5tZWFzdXJlbWVudENvdW50OyBpKyspIHsKKyAgICBwTG91ZG5lc3NNZWFzdXJlID0gJihsb3VkbmVzc0luZm8tPmxvdWRuZXNzTWVhc3VyZW1lbnRbaV0pOworCisgICAgaWYgKHBMb3VkbmVzc01lYXN1cmUtPm1ldGhvZERlZmluaXRpb24gPT0gTURfUFJPR1JBTV9MT1VETkVTUykgeworICAgICAgX2dldE1ldGhvZFZhbHVlKCZ2YWx1ZU9yZGVyTG91ZG5lc3MsIHBMb3VkbmVzc01lYXN1cmUtPm1ldGhvZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIHBMb3VkbmVzc01lYXN1cmUtPm1lYXN1cmVtZW50U3lzdGVtLCBNU19QUk9HUkFNTE9VRE5FU1MpOworICAgIH0KKworICAgIGlmICgoZHluYW1pY1JhbmdlTWVhc3VyZW1lbnRUeXBlID09IERSTVJUX1NIT1JUX1RFUk1fTE9VRE5FU1NfVE9fQVZHKSAmJgorICAgICAgICAocExvdWRuZXNzTWVhc3VyZS0+bWV0aG9kRGVmaW5pdGlvbiA9PSBNRF9TSE9SVF9URVJNX0xPVURORVNTX01BWCkpIHsKKyAgICAgIF9nZXRNZXRob2RWYWx1ZSgmdmFsdWVPcmRlclBlYWtMb3VkbmVzcywgcExvdWRuZXNzTWVhc3VyZS0+bWV0aG9kVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgcExvdWRuZXNzTWVhc3VyZS0+bWVhc3VyZW1lbnRTeXN0ZW0sIE1TX1BFQUtMT1VETkVTUyk7CisgICAgfQorCisgICAgaWYgKChkeW5hbWljUmFuZ2VNZWFzdXJlbWVudFR5cGUgPT0gRFJNUlRfTU9NRU5UQVJZX0xPVURORVNTX1RPX0FWRykgJiYKKyAgICAgICAgKHBMb3VkbmVzc01lYXN1cmUtPm1ldGhvZERlZmluaXRpb24gPT0gTURfTU9NRU5UQVJZX0xPVURORVNTX01BWCkpIHsKKyAgICAgIF9nZXRNZXRob2RWYWx1ZSgmdmFsdWVPcmRlclBlYWtMb3VkbmVzcywgcExvdWRuZXNzTWVhc3VyZS0+bWV0aG9kVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgcExvdWRuZXNzTWVhc3VyZS0+bWVhc3VyZW1lbnRTeXN0ZW0sIE1TX1BFQUtMT1VETkVTUyk7CisgICAgfQorCisgICAgaWYgKChkeW5hbWljUmFuZ2VNZWFzdXJlbWVudFR5cGUgPT0gRFJNUlRfVE9QX09GX0xPVURORVNTX1JBTkdFX1RPX0FWRykgJiYKKyAgICAgICAgKHBMb3VkbmVzc01lYXN1cmUtPm1ldGhvZERlZmluaXRpb24gPT0gTURfTUFYX09GX0xPVURORVNTX1JBTkdFKSkgeworICAgICAgX2dldE1ldGhvZFZhbHVlKCZ2YWx1ZU9yZGVyUGVha0xvdWRuZXNzLCBwTG91ZG5lc3NNZWFzdXJlLT5tZXRob2RWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwTG91ZG5lc3NNZWFzdXJlLT5tZWFzdXJlbWVudFN5c3RlbSwgTVNfUEVBS0xPVURORVNTKTsKKyAgICB9CisgIH0KKworICBpZiAoKHZhbHVlT3JkZXJMb3VkbmVzcy5vcmRlciA+IC0xKSAmJiAodmFsdWVPcmRlclBlYWtMb3VkbmVzcy5vcmRlciA+IC0xKSkgeworICAgICpwTG91ZG5lc3NQZWFrVG9BdmVyYWdlVmFsdWUgPQorICAgICAgICB2YWx1ZU9yZGVyUGVha0xvdWRuZXNzLnZhbHVlIC0gdmFsdWVPcmRlckxvdWRuZXNzLnZhbHVlOworICAgICpwTG91ZG5lc3NQZWFrVG9BdmVyYWdlVmFsdWVQcmVzZW50ID0gMTsKKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfc2VsZWN0QWxidW1Mb3VkbmVzcygKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIGludCBpLCBqOworCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBDYW5kaWRhdGUgPQorICAgICAgICBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudDsgaisrKSB7CisgICAgICBpZiAocENhbmRpZGF0ZS0+cEluc3QtPmRyY1NldElkID09CisgICAgICAgICAgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1bal0uZHJjU2V0SWQpIHsKKyAgICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2FkZChwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9maW5kTWV0aG9kRGVmaW5pdGlvbihMT1VETkVTU19JTkZPKiBwTG91ZG5lc3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZERlZmluaXRpb24sIGludCBzdGFydEluZGV4KSB7CisgIGludCBpOworICBpbnQgaW5kZXggPSAtMTsKKworICBmb3IgKGkgPSBzdGFydEluZGV4OyBpIDwgcExvdWRuZXNzSW5mby0+bWVhc3VyZW1lbnRDb3VudDsgaSsrKSB7CisgICAgaWYgKHBMb3VkbmVzc0luZm8tPmxvdWRuZXNzTWVhc3VyZW1lbnRbaV0ubWV0aG9kRGVmaW5pdGlvbiA9PQorICAgICAgICBtZXRob2REZWZpbml0aW9uKSB7CisgICAgICBpbmRleCA9IGk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gaW5kZXg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZ2V0TWl4aW5nTGV2ZWwoCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsIGludCBkb3dubWl4SWRSZXF1ZXN0ZWQsCisgICAgaW50IGRyY1NldElkUmVxdWVzdGVkLCBpbnQgYWxidW1Nb2RlLCBGSVhQX0RCTCogcE1peGluZ0xldmVsKSB7CisgIGNvbnN0IEZJWFBfREJMIG1peGluZ0xldmVsRGVmYXVsdCA9IEZMMkZYQ09OU1RfREJMKDg1LjBmIC8gKGZsb2F0KSgxIDw8IDcpKTsKKworICBpbnQgaTsKKyAgaW50IGNvdW50OworCisgIExPVURORVNTX0lORk8qIHBMb3VkbmVzc0luZm8gPSBOVUxMOworCisgICpwTWl4aW5nTGV2ZWwgPSBtaXhpbmdMZXZlbERlZmF1bHQ7CisKKyAgaWYgKGRyY1NldElkUmVxdWVzdGVkIDwgMCkgeworICAgIGRyY1NldElkUmVxdWVzdGVkID0gMDsKKyAgfQorCisgIGlmIChhbGJ1bU1vZGUpIHsKKyAgICBjb3VudCA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtQ291bnQ7CisgICAgcExvdWRuZXNzSW5mbyA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtOworICB9IGVsc2UgeworICAgIGNvdW50ID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQ291bnQ7CisgICAgcExvdWRuZXNzSW5mbyA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mbzsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaWYgKChkcmNTZXRJZFJlcXVlc3RlZCA9PSBwTG91ZG5lc3NJbmZvW2ldLmRyY1NldElkKSAmJgorICAgICAgICAoKGRvd25taXhJZFJlcXVlc3RlZCA9PSBwTG91ZG5lc3NJbmZvW2ldLmRvd25taXhJZCkgfHwKKyAgICAgICAgIChET1dOTUlYX0lEX0FOWV9ET1dOTUlYID09IHBMb3VkbmVzc0luZm9baV0uZG93bm1peElkKSkpIHsKKyAgICAgIGludCBpbmRleCA9IF9maW5kTWV0aG9kRGVmaW5pdGlvbigmcExvdWRuZXNzSW5mb1tpXSwgTURfTUlYSU5HX0xFVkVMLCAwKTsKKworICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgKnBNaXhpbmdMZXZlbCA9IHBMb3VkbmVzc0luZm9baV0ubG91ZG5lc3NNZWFzdXJlbWVudFtpbmRleF0ubWV0aG9kVmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL3NyYy9kcmNEZWNfc2VsZWN0aW9uUHJvY2Vzcy5oIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfc2VsZWN0aW9uUHJvY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMGUzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvc3JjL2RyY0RlY19zZWxlY3Rpb25Qcm9jZXNzLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEFuZHJlYXMgSG9lbHplcgorCisgICBEZXNjcmlwdGlvbjogRFJDIFNldCBTZWxlY3Rpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBEUkNERUNfU0VMRUNUSU9OUFJPQ0VTU19ICisjZGVmaW5lIERSQ0RFQ19TRUxFQ1RJT05QUk9DRVNTX0gKKworI2luY2x1ZGUgImRyY0RlY190eXBlcy5oIgorI2luY2x1ZGUgImRyY0RlY29kZXIuaCIKKworLyogRFJDIHNldCBzZWxlY3Rpb24gYWNjb3JkaW5nIHRvIHNlY3Rpb24gNi4yIG9mIElTTy9JRUMgMjMwMDMtNCAoTVBFRy1EIERSQykgKi8KKy8qIGluY2x1ZGluZyBJU08vSUVDIDIzMDAzLTQvQU1EMSAoQW1lbmRtZW50IDEpICovCisKK3R5cGVkZWYgc3RydWN0IHNfZHJjZGVjX3NlbGVjdGlvbl9wcm9jZXNzKiBIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTOworCit0eXBlZGVmIGVudW0geworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1IgPSAwLAorCisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19XQVJOSU5HID0gLTEwMDAsCisKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSyA9IC0yMDAwLAorICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfT1VUT0ZNRU1PUlksCisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19JTlZBTElEX0hBTkRMRSwKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9TVVBQT1JURUQsCisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19JTlZBTElEX1BBUkFNLAorICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUEFSQU1fT1VUX09GX1JBTkdFCisKK30gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTjsKKwordHlwZWRlZiBlbnVtIHsKKyAgU0VMX1BST0NfVEVTVF9USU1FX0RPTUFJTiA9IC0xMDAsCisgIFNFTF9QUk9DX1RFU1RfUU1GX0RPTUFJTiwKKyAgU0VMX1BST0NfVEVTVF9TVEZUX0RPTUFJTiwKKworICBTRUxfUFJPQ19DT0RFQ19NT0RFX1VOREVGSU5FRCA9IC0xLAorICBTRUxfUFJPQ19NUEVHXzRfQUFDLAorICBTRUxfUFJPQ19NUEVHX0RfVVNBQywKKyAgU0VMX1BST0NfTVBFR19IXzNEQQorfSBTRUxfUFJPQ19DT0RFQ19NT0RFOworCit0eXBlZGVmIGVudW0geworICAvKiBzZXQgYW5kIGdldCB1c2VyIHBhcmFtICovCisgIFNFTF9QUk9DX0xPVURORVNTX05PUk1BTElaQVRJT05fT04sCisgIC8qIGdldCBvbmx5IHVzZXIgcGFyYW0gKi8KKyAgU0VMX1BST0NfRFlOQU1JQ19SQU5HRV9DT05UUk9MX09OLAorICAvKiBzZXQgb25seSB1c2VyIHBhcmFtcyAqLworICBTRUxfUFJPQ19UQVJHRVRfTE9VRE5FU1MsCisgIFNFTF9QUk9DX0VGRkVDVF9UWVBFLAorICBTRUxfUFJPQ19FRkZFQ1RfVFlQRV9GQUxMQkFDS19DT0RFLAorICBTRUxfUFJPQ19MT1VETkVTU19NRUFTVVJFTUVOVF9NRVRIT0QsCisgIFNFTF9QUk9DX0RPV05NSVhfSUQsCisgIFNFTF9QUk9DX1RBUkdFVF9MQVlPVVQsCisgIFNFTF9QUk9DX1RBUkdFVF9DSEFOTkVMX0NPVU5ULAorICBTRUxfUFJPQ19CQVNFX0NIQU5ORUxfQ09VTlQsCisgIFNFTF9QUk9DX1NBTVBMRV9SQVRFLAorICBTRUxfUFJPQ19CT09TVCwKKyAgU0VMX1BST0NfQ09NUFJFU1MKK30gU0VMX1BST0NfVVNFUl9QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3Qgc19zZWxlY3Rpb25fcHJvY2Vzc19vdXRwdXQgeworICBGSVhQX0RCTCBvdXRwdXRQZWFrTGV2ZWxEYjsgICAgICAgICAgIC8qIGUgPSA3ICovCisgIEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYjsgLyogZSA9IDcgKi8KKyAgRklYUF9EQkwgb3V0cHV0TG91ZG5lc3M7ICAgICAgICAgICAgICAvKiBlID0gNyAqLworCisgIFVDSEFSIG51bVNlbGVjdGVkRHJjU2V0czsKKyAgU0NIQVIgc2VsZWN0ZWREcmNTZXRJZHNbTUFYX0FDVElWRV9EUkNTXTsKKyAgVUNIQVIgc2VsZWN0ZWREb3dubWl4SWRzW01BWF9BQ1RJVkVfRFJDU107CisKKyAgVUNIQVIgYWN0aXZlRG93bm1peElkOworICBVQ0hBUiBiYXNlQ2hhbm5lbENvdW50OworICBVQ0hBUiB0YXJnZXRDaGFubmVsQ291bnQ7CisgIFNDSEFSIHRhcmdldExheW91dDsKKyAgVUNIQVIgZG93bm1peE1hdHJpeFByZXNlbnQ7CisgIEZJWFBfREJMIGRvd25taXhNYXRyaXhbOF1bOF07IC8qIGUgPSAyICovCisKKyAgRklYUF9TR0wgYm9vc3Q7ICAgIC8qIGUgPSAxICovCisgIEZJWFBfU0dMIGNvbXByZXNzOyAvKiBlID0gMSAqLworCisgIEZJWFBfREJMIG1peGluZ0xldmVsOyAvKiBlID0gNyAqLworCit9IFNFTF9QUk9DX09VVFBVVCwgKkhBTkRMRV9TRUxfUFJPQ19PVVRQVVQ7CisKK0RSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4KK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX0NyZWF0ZShIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTKiBwaEluc3RhbmNlKTsKKworRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTgorZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfRGVsZXRlKEhBTkRMRV9EUkNfU0VMRUNUSU9OX1BST0NFU1MqIHBoSW5zdGFuY2UpOworCitEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOCitkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19Jbml0KEhBTkRMRV9EUkNfU0VMRUNUSU9OX1BST0NFU1MgaEluc3RhbmNlKTsKKworRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTgorZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfU2V0Q29kZWNNb2RlKEhBTkRMRV9EUkNfU0VMRUNUSU9OX1BST0NFU1MgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNFTF9QUk9DX0NPREVDX01PREUgY29kZWNNb2RlKTsKKworRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTgorZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfU2V0UGFyYW0oSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUyBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRUxfUFJPQ19VU0VSX1BBUkFNIHJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgcmVxdWVzdFZhbHVlLCBpbnQqIHBEaWZmKTsKKworRklYUF9EQkwKK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX0dldFBhcmFtKEhBTkRMRV9EUkNfU0VMRUNUSU9OX1BST0NFU1MgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0VMX1BST0NfVVNFUl9QQVJBTSByZXF1ZXN0VHlwZSk7CisKK0RSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4KK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldE1wZWdoUGFyYW1zKAorICAgIEhBTkRMRV9EUkNfU0VMRUNUSU9OX1BST0NFU1MgaEluc3RhbmNlLCBjb25zdCBpbnQgbnVtR3JvdXBJZHNSZXF1ZXN0ZWQsCisgICAgY29uc3QgaW50KiBncm91cElkUmVxdWVzdGVkLCBjb25zdCBpbnQgbnVtR3JvdXBQcmVzZXRJZHNSZXF1ZXN0ZWQsCisgICAgY29uc3QgaW50KiBncm91cFByZXNldElkUmVxdWVzdGVkLAorICAgIGNvbnN0IGludCogbnVtTWVtYmVyc0dyb3VwUHJlc2V0SWRzUmVxdWVzdGVkLAorICAgIGNvbnN0IGludCBncm91cFByZXNldElkUmVxdWVzdGVkUHJlZmVyZW5jZSwgaW50KiBwRGlmZik7CisKK0RSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4KK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1Byb2Nlc3MoSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUyBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NFTF9QUk9DX09VVFBVVCBoU2VsUHJvY091dHB1dCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL3NyYy9kcmNEZWNfdG9vbHMuY3BwIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfdG9vbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmZlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvc3JjL2RyY0RlY190b29scy5jcHAKQEAgLTAsMCArMSwzNzEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImRyY0RlY190eXBlcy5oIgorI2luY2x1ZGUgImRyY0RlY190b29scy5oIgorI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKKyNpbmNsdWRlICJkcmNEZWNvZGVyLmgiCisKK2ludCBnZXREZWx0YVRtaW4oY29uc3QgaW50IHNhbXBsZVJhdGUpIHsKKyAgLyogaGFsZl9tcyA9IHJvdW5kICgwLjAwMDUgKiBzYW1wbGVSYXRlKTsgKi8KKyAgaW50IGhhbGZfbXMgPSAoc2FtcGxlUmF0ZSArIDEwMDApIC8gMjAwMDsKKyAgaW50IGRlbHRhVG1pbiA9IDE7CisgIGlmIChzYW1wbGVSYXRlIDwgMTAwMCkgeworICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKyAgd2hpbGUgKGRlbHRhVG1pbiA8PSBoYWxmX21zKSB7CisgICAgZGVsdGFUbWluID0gZGVsdGFUbWluIDw8IDE7CisgIH0KKyAgcmV0dXJuIGRlbHRhVG1pbjsKK30KKworRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKiBzZWxlY3REcmNDb2VmZmljaWVudHMoCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsIGNvbnN0IGludCBsb2NhdGlvbikgeworICBpbnQgbjsKKyAgaW50IGMgPSAtMTsKKyAgZm9yIChuID0gMDsgbiA8IGhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50OyBuKyspIHsKKyAgICBpZiAoaFVuaURyY0NvbmZpZy0+ZHJjQ29lZmZpY2llbnRzVW5pRHJjW25dLmRyY0xvY2F0aW9uID09IGxvY2F0aW9uKSB7CisgICAgICBjID0gbjsKKyAgICB9CisgIH0KKyAgaWYgKGMgPj0gMCkgeworICAgIHJldHVybiAmKGhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY1tjXSk7CisgIH0KKyAgcmV0dXJuIE5VTEw7IC8qIHBvc3NpYmxlIGR1cmluZyBiaXRzdHJlYW0gcGFyc2luZyAqLworfQorCitEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHNlbGVjdERyY0luc3RydWN0aW9ucygKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywgY29uc3QgaW50IGRyY1NldElkKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zQ291bnRJbmNsVmlydHVhbDsgaSsrKSB7CisgICAgaWYgKGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXS5kcmNTZXRJZCA9PSBkcmNTZXRJZCkgeworICAgICAgcmV0dXJuICYoaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW2ldKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK0RPV05NSVhfSU5TVFJVQ1RJT05TKiBzZWxlY3REb3dubWl4SW5zdHJ1Y3Rpb25zKAorICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBjb25zdCBpbnQgZG93bm1peElkKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc0NvdW50OyBpKyspIHsKKyAgICBpZiAoaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc1tpXS5kb3dubWl4SWQgPT0gZG93bm1peElkKSB7CisgICAgICByZXR1cm4gJihoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zW2ldKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK0RSQ19FUlJPUgorZGVyaXZlRHJjQ2hhbm5lbEdyb3VwcygKKyAgICBjb25zdCBpbnQgZHJjU2V0RWZmZWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCisgICAgY29uc3QgaW50IGNoYW5uZWxDb3VudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLworICAgIGNvbnN0IFNDSEFSKiBnYWluU2V0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KKyAgICBjb25zdCBEVUNLSU5HX01PRElGSUNBVElPTiogZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWwsIC8qIGluICovCisgICAgVUNIQVIqIG5EcmNDaGFubmVsR3JvdXBzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KKyAgICBTQ0hBUiogdW5pcXVlSW5kZXgsICAgICAvKiBvdXQgKGdhaW5TZXRJbmRleEZvckNoYW5uZWxHcm91cCkgKi8KKyAgICBTQ0hBUiogZ3JvdXBGb3JDaGFubmVsLCAvKiBvdXQgKi8KKyAgICBEVUNLSU5HX01PRElGSUNBVElPTiogZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWxHcm91cCkgLyogb3V0ICovCit7CisgIGludCBkdWNraW5nU2VxdWVuY2UgPSAtMTsKKyAgaW50IGMsIG4sIGcsIG1hdGNoLCBpZHg7CisgIEZJWFBfU0dMIGZhY3RvcjsKKyAgRklYUF9TR0wgdW5pcXVlU2NhbGluZ1s4XTsKKworICBmb3IgKGcgPSAwOyBnIDwgODsgZysrKSB7CisgICAgdW5pcXVlSW5kZXhbZ10gPSAtMTA7CisgICAgdW5pcXVlU2NhbGluZ1tnXSA9IEZJWFBfU0dMKC0xLjBmKTsKKyAgfQorCisgIGcgPSAwOworCisgIGlmIChkcmNTZXRFZmZlY3QgJiBFQl9EVUNLX09USEVSKSB7CisgICAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7CisgICAgICBtYXRjaCA9IDA7CisgICAgICBpZiAoYyA+PSA4KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgICAgaWR4ID0gZ2FpblNldEluZGV4W2NdOworICAgICAgZmFjdG9yID0gZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWxbY10uZHVja2luZ1NjYWxpbmc7CisgICAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZzsgbisrKSB7CisgICAgICAgICAgaWYgKHVuaXF1ZVNjYWxpbmdbbl0gPT0gZmFjdG9yKSB7CisgICAgICAgICAgICBtYXRjaCA9IDE7CisgICAgICAgICAgICBncm91cEZvckNoYW5uZWxbY10gPSBuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtYXRjaCA9PSAwKSB7CisgICAgICAgICAgaWYgKGcgPj0gOCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICAgICAgICB1bmlxdWVJbmRleFtnXSA9IGlkeDsKKyAgICAgICAgICB1bmlxdWVTY2FsaW5nW2ddID0gZmFjdG9yOworICAgICAgICAgIGdyb3VwRm9yQ2hhbm5lbFtjXSA9IGc7CisgICAgICAgICAgZysrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGR1Y2tpbmdTZXF1ZW5jZSA+IDApICYmIChkdWNraW5nU2VxdWVuY2UgIT0gaWR4KSkgeworICAgICAgICAgIHJldHVybiBERV9OT1RfT0s7CisgICAgICAgIH0KKyAgICAgICAgZHVja2luZ1NlcXVlbmNlID0gaWR4OworICAgICAgICBncm91cEZvckNoYW5uZWxbY10gPSAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGR1Y2tpbmdTZXF1ZW5jZSA9PSAtMSkgeworICAgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgICB9CisgIH0gZWxzZSBpZiAoZHJjU2V0RWZmZWN0ICYgRUJfRFVDS19TRUxGKSB7CisgICAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7CisgICAgICBtYXRjaCA9IDA7CisgICAgICBpZiAoYyA+PSA4KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgICAgaWR4ID0gZ2FpblNldEluZGV4W2NdOworICAgICAgZmFjdG9yID0gZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWxbY10uZHVja2luZ1NjYWxpbmc7CisgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGc7IG4rKykgeworICAgICAgICAgIGlmICgodW5pcXVlSW5kZXhbbl0gPT0gaWR4KSAmJiAodW5pcXVlU2NhbGluZ1tuXSA9PSBmYWN0b3IpKSB7CisgICAgICAgICAgICBtYXRjaCA9IDE7CisgICAgICAgICAgICBncm91cEZvckNoYW5uZWxbY10gPSBuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtYXRjaCA9PSAwKSB7CisgICAgICAgICAgaWYgKGcgPj0gOCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICAgICAgICB1bmlxdWVJbmRleFtnXSA9IGlkeDsKKyAgICAgICAgICB1bmlxdWVTY2FsaW5nW2ddID0gZmFjdG9yOworICAgICAgICAgIGdyb3VwRm9yQ2hhbm5lbFtjXSA9IGc7CisgICAgICAgICAgZysrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBncm91cEZvckNoYW5uZWxbY10gPSAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7IC8qIG5vIGR1Y2tpbmcgKi8KKyAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHsKKyAgICAgIGlmIChjID49IDgpIHJldHVybiBERV9NRU1PUllfRVJST1I7CisgICAgICBpZHggPSBnYWluU2V0SW5kZXhbY107CisgICAgICBtYXRjaCA9IDA7CisgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGc7IG4rKykgeworICAgICAgICAgIGlmICh1bmlxdWVJbmRleFtuXSA9PSBpZHgpIHsKKyAgICAgICAgICAgIG1hdGNoID0gMTsKKyAgICAgICAgICAgIGdyb3VwRm9yQ2hhbm5lbFtjXSA9IG47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hdGNoID09IDApIHsKKyAgICAgICAgICBpZiAoZyA+PSA4KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgICAgICAgIHVuaXF1ZUluZGV4W2ddID0gaWR4OworICAgICAgICAgIGdyb3VwRm9yQ2hhbm5lbFtjXSA9IGc7CisgICAgICAgICAgZysrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBncm91cEZvckNoYW5uZWxbY10gPSAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgKm5EcmNDaGFubmVsR3JvdXBzID0gZzsKKworICBpZiAoZHJjU2V0RWZmZWN0ICYgKEVCX0RVQ0tfT1RIRVIgfCBFQl9EVUNLX1NFTEYpKSB7CisgICAgZm9yIChnID0gMDsgZyA8ICpuRHJjQ2hhbm5lbEdyb3VwczsgZysrKSB7CisgICAgICBpZiAoZHJjU2V0RWZmZWN0ICYgRUJfRFVDS19PVEhFUikgeworICAgICAgICB1bmlxdWVJbmRleFtnXSA9IGR1Y2tpbmdTZXF1ZW5jZTsKKyAgICAgIH0KKyAgICAgIGR1Y2tpbmdNb2RpZmljYXRpb25Gb3JDaGFubmVsR3JvdXBbZ10uZHVja2luZ1NjYWxpbmcgPSB1bmlxdWVTY2FsaW5nW2ddOworICAgICAgaWYgKHVuaXF1ZVNjYWxpbmdbZ10gIT0gRkwyRlhDT05TVF9TR0woMS4wZiAvIChmbG9hdCkoMSA8PCAyKSkpIHsKKyAgICAgICAgZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWxHcm91cFtnXS5kdWNraW5nU2NhbGluZ1ByZXNlbnQgPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWxHcm91cFtnXS5kdWNraW5nU2NhbGluZ1ByZXNlbnQgPSAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBERV9PSzsKK30KKworRklYUF9EQkwKK2RCMmxpbihjb25zdCBGSVhQX0RCTCBkQl9tLCBjb25zdCBpbnQgZEJfZSwgaW50KiBwTGluX2UpIHsKKyAgLyogZ2V0IGxpbmVhciB2YWx1ZSBmcm9tIGRCLgorICAgICByZXR1cm4gbGluX3ZhbCA9IDEwXihkQl92YWwvMjApID0gMl4obG9nMigxMCkvMjAqZEJfdmFsKQorICAgICB3aXRoIGRCX3ZhbCA9IGRCX20gKjJeZEJfZSBhbmQgbGluX3ZhbCA9IGxpbl9tICogMl5saW5fZSAqLworICBGSVhQX0RCTCBsaW5fbSA9CisgICAgICBmMlBvdyhmTXVsdChkQl9tLCBGTDJGWENPTlNUX0RCTCgwLjE2NjA5NjRmICogKGZsb2F0KSgxIDw8IDIpKSksIGRCX2UgLSAyLAorICAgICAgICAgICAgcExpbl9lKTsKKworICByZXR1cm4gbGluX207Cit9CisKK0ZJWFBfREJMCitsaW4yZEIoY29uc3QgRklYUF9EQkwgbGluX20sIGNvbnN0IGludCBsaW5fZSwgaW50KiBwRGJfZSkgeworICAvKiBnZXQgZEIgdmFsdWUgZnJvbSBsaW5lYXIgdmFsdWUuCisgICAgIHJldHVybiBkQl92YWwgPSAyMCpsb2cxMChsaW5fdmFsKQorICAgICB3aXRoIGRCX3ZhbCA9IGRCX20gKjJeZEJfZSBhbmQgbGluX3ZhbCA9IGxpbl9tICogMl5saW5fZSAqLworICBGSVhQX0RCTCBkQl9tOworCisgIGlmIChsaW5fbSA9PSAoRklYUF9EQkwpMCkgeyAvKiByZXR1cm4gdmVyeSBzbWFsbCB2YWx1ZSByZXByZXNlbnRpbmcgLWluZiAqLworICAgIGRCX20gPSAoRklYUF9EQkwpTUlOVkFMX0RCTDsKKyAgICAqcERiX2UgPSBERlJBQ1RfQklUUyAtIDE7CisgIH0gZWxzZSB7CisgICAgLyogMjAqbG9nMTAobGluX3ZhbCkgPSAyMC9sb2cyKDEwKSpsb2cyKGxpbl92YWwpICovCisgICAgZEJfbSA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCg2LjAyMDU5OTkxZiAvIChmbG9hdCkoMSA8PCAzKSksCisgICAgICAgICAgICAgICAgICAgICBmTG9nMihsaW5fbSwgbGluX2UsIHBEYl9lKSk7CisgICAgKnBEYl9lICs9IDMgKyAxOworICB9CisKKyAgcmV0dXJuIGRCX207Cit9CisKK0ZJWFBfREJMCithcHByb3hEYjJsaW4oY29uc3QgRklYUF9EQkwgZEJfbSwgY29uc3QgaW50IGRCX2UsIGludCogcExpbl9lKSB7CisgIC8qIGdldCBsaW5lYXIgdmFsdWUgZnJvbSBhcHByb3hpbWF0ZSBkQi4KKyAgICAgcmV0dXJuIGxpbl92YWwgPSAyXihkQl92YWwvNikKKyAgICAgd2l0aCBkQl92YWwgPSBkQl9tICoyXmRCX2UgYW5kIGxpbl92YWwgPSBsaW5fbSAqIDJebGluX2UgKi8KKyAgRklYUF9EQkwgbGluX20gPQorICAgICAgZjJQb3coZk11bHQoZEJfbSwgRkwyRlhDT05TVF9EQkwoMC4xNjY2NjY3ZiAqIChmbG9hdCkoMSA8PCAyKSkpLCBkQl9lIC0gMiwKKyAgICAgICAgICAgIHBMaW5fZSk7CisKKyAgcmV0dXJuIGxpbl9tOworfQorCitpbnQgYml0c3RyZWFtQ29udGFpbnNNdWx0aWJhbmREcmMoSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRvd25taXhJZCkgeworICBpbnQgaSwgZywgZCwgc2VxOworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0OworICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMqIHBDb2VmID0gTlVMTDsKKyAgaW50IGlzTXVsdGliYW5kID0gMDsKKworICBwQ29lZiA9IHNlbGVjdERyY0NvZWZmaWNpZW50cyhoVW5pRHJjQ29uZmlnLCBMT0NBVElPTl9TRUxFQ1RFRCk7CisgIGlmIChwQ29lZiA9PSBOVUxMKSByZXR1cm4gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQ7IGkrKykgeworICAgIHBJbnN0ID0gJihoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0pOworICAgIGZvciAoZCA9IDA7IGQgPCBwSW5zdC0+ZG93bm1peElkQ291bnQ7IGQrKykgeworICAgICAgaWYgKGRvd25taXhJZCA9PSBwSW5zdC0+ZG93bm1peElkW2RdKSB7CisgICAgICAgIGZvciAoZyA9IDA7IGcgPCBwSW5zdC0+bkRyY0NoYW5uZWxHcm91cHM7IGcrKykgeworICAgICAgICAgIHNlcSA9IHBJbnN0LT5nYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXBbZ107CisgICAgICAgICAgaWYgKHBDb2VmLT5nYWluU2V0W3NlcV0uYmFuZENvdW50ID4gMSkgeworICAgICAgICAgICAgaXNNdWx0aWJhbmQgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBpc011bHRpYmFuZDsKK30KKworRklYUF9EQkwgZ2V0RG93bm1peE9mZnNldChET1dOTUlYX0lOU1RSVUNUSU9OUyogcERvd24sIGludCBiYXNlQ2hhbm5lbENvdW50KSB7CisgIEZJWFBfREJMIGRvd25taXhPZmZzZXQgPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKDEgPDwgMSkpOyAvKiBlID0gMSAqLworICBpZiAoKHBEb3duLT5ic0Rvd25taXhPZmZzZXQgPT0gMSkgfHwgKHBEb3duLT5ic0Rvd25taXhPZmZzZXQgPT0gMikpIHsKKyAgICBpbnQgZV9hLCBlX2Rvd25taXhPZmZzZXQ7CisgICAgRklYUF9EQkwgYSwgcTsKKyAgICBpZiAoYmFzZUNoYW5uZWxDb3VudCA8PSBwRG93bi0+dGFyZ2V0Q2hhbm5lbENvdW50KSByZXR1cm4gZG93bm1peE9mZnNldDsKKworICAgIHEgPSBmRGl2Tm9ybSgoRklYUF9EQkwpcERvd24tPnRhcmdldENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgKEZJWFBfREJMKWJhc2VDaGFubmVsQ291bnQpOyAvKiBlID0gMCAqLworICAgIGEgPSBsaW4yZEIocSwgMCwgJmVfYSk7CisgICAgaWYgKHBEb3duLT5ic0Rvd25taXhPZmZzZXQgPT0gMikgeworICAgICAgZV9hICs9IDE7IC8qIGEgKj0gMiAqLworICAgIH0KKyAgICAvKiBhID0gMC41ICogcm91bmQgKGEpICovCisgICAgYSA9IGZpeHBfcm91bmQoYSwgZV9hKSA+PiAxOworICAgIGRvd25taXhPZmZzZXQgPSBkQjJsaW4oYSwgZV9hLCAmZV9kb3dubWl4T2Zmc2V0KTsKKyAgICBkb3dubWl4T2Zmc2V0ID0gc2NhbGVWYWx1ZShkb3dubWl4T2Zmc2V0LCBlX2Rvd25taXhPZmZzZXQgLSAxKTsKKyAgfQorICByZXR1cm4gZG93bm1peE9mZnNldDsKK30KZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3Rvb2xzLmggYi9saWJEUkNkZWMvc3JjL2RyY0RlY190b29scy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTBhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvc3JjL2RyY0RlY190b29scy5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRFJDREVDX1RPT0xTX0gKKyNkZWZpbmUgRFJDREVDX1RPT0xTX0gKKworI2luY2x1ZGUgImRyY0RlY190eXBlcy5oIgorI2luY2x1ZGUgImRyY0RlY19zZWxlY3Rpb25Qcm9jZXNzLmgiCisKK2ludCBnZXREZWx0YVRtaW4oY29uc3QgaW50IHNhbXBsZVJhdGUpOworCitEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMqIHNlbGVjdERyY0NvZWZmaWNpZW50cygKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywgY29uc3QgaW50IGxvY2F0aW9uKTsKKworRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBzZWxlY3REcmNJbnN0cnVjdGlvbnMoCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsIGNvbnN0IGludCBkcmNTZXRJZCk7CisKK0RPV05NSVhfSU5TVFJVQ1RJT05TKiBzZWxlY3REb3dubWl4SW5zdHJ1Y3Rpb25zKAorICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBjb25zdCBpbnQgZG93bm1peElkKTsKKworRFJDX0VSUk9SCitkZXJpdmVEcmNDaGFubmVsR3JvdXBzKAorICAgIGNvbnN0IGludCBkcmNTZXRFZmZlY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KKyAgICBjb25zdCBpbnQgY2hhbm5lbENvdW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCisgICAgY29uc3QgU0NIQVIqIGdhaW5TZXRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLworICAgIGNvbnN0IERVQ0tJTkdfTU9ESUZJQ0FUSU9OKiBkdWNraW5nTW9kaWZpY2F0aW9uRm9yQ2hhbm5lbCwgLyogaW4gKi8KKyAgICBVQ0hBUiogbkRyY0NoYW5uZWxHcm91cHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLworICAgIFNDSEFSKiB1bmlxdWVJbmRleCwgICAgIC8qIG91dCAoZ2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwKSAqLworICAgIFNDSEFSKiBncm91cEZvckNoYW5uZWwsIC8qIG91dCAqLworICAgIERVQ0tJTkdfTU9ESUZJQ0FUSU9OKiBkdWNraW5nTW9kaWZpY2F0aW9uRm9yQ2hhbm5lbEdyb3VwKTsgLyogb3V0ICovCisKK0ZJWFBfREJMCitkQjJsaW4oY29uc3QgRklYUF9EQkwgZEJfbSwgY29uc3QgaW50IGRCX2UsIGludCogcExpbl9lKTsKKworRklYUF9EQkwKK2xpbjJkQihjb25zdCBGSVhQX0RCTCBsaW5fbSwgY29uc3QgaW50IGxpbl9lLCBpbnQqIHBEYl9lKTsKKworRklYUF9EQkwKK2FwcHJveERiMmxpbihjb25zdCBGSVhQX0RCTCBkQl9tLCBjb25zdCBpbnQgZEJfZSwgaW50KiBwTGluX2UpOworCitpbnQgYml0c3RyZWFtQ29udGFpbnNNdWx0aWJhbmREcmMoSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRvd25taXhJZCk7CisKK0ZJWFBfREJMCitnZXREb3dubWl4T2Zmc2V0KERPV05NSVhfSU5TVFJVQ1RJT05TKiBwRG93biwgaW50IGJhc2VDaGFubmVsQ291bnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3R5cGVzLmggYi9saWJEUkNkZWMvc3JjL2RyY0RlY190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YzE3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvc3JjL2RyY0RlY190eXBlcy5oCkBAIC0wLDAgKzEsNDI4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRFJDREVDX1RZUEVTX0gKKyNkZWZpbmUgRFJDREVDX1RZUEVTX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworLyogRGF0YSBzdHJ1Y3R1cmVzIGNvcnJlc3BvbmRpbmcgdG8gc3RhdGljIGFuZCBkeW5hbWljIERSQy9Mb3VkbmVzcyBwYXlsb2FkCisgICBhcyBkZWZpbmVkIGluIHNlY3Rpb24gNyBvZiBNUEVHLUQgRFJDIHN0YW5kYXJkLCBJU08vSUVDIDIzMDAzLTQgKi8KKworLyoqKioqKioqKioqKioqLworLyogdW5pRHJjR2FpbiAqLworLyoqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfU0dMIGdhaW5EYjsgLyogZSA9IDcgKi8KKyAgU0hPUlQgdGltZTsKK30gR0FJTl9OT0RFOworCisvKiB1bmlEcmNHYWluRXh0ZW5zaW9uKCkgKFRhYmxlIDU2KSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiB1bmlEcmNHYWluRXh0VHlwZVs4XTsKKyAgVUxPTkcgZXh0Qml0U2l6ZVs4IC0gMV07Cit9IFVOSV9EUkNfR0FJTl9FWFRFTlNJT047CisKKy8qIHVuaURyY0dhaW4oKSAoVGFibGUgNTUpICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIG5Ob2Rlc1sxMl07IC8qIHVuc2F0dXJhdGVkIHZhbHVlLCBpLmUuIGFzIHByb3ZpZGVkIGluIGJpdHN0cmVhbSAqLworICBHQUlOX05PREUgZ2Fpbk5vZGVbMTJdWzE2XTsKKworICBVQ0hBUiB1bmlEcmNHYWluRXh0UHJlc2VudDsKKyAgVU5JX0RSQ19HQUlOX0VYVEVOU0lPTiB1bmlEcmNHYWluRXh0ZW5zaW9uOworfSBVTklfRFJDX0dBSU4sICpIQU5ETEVfVU5JX0RSQ19HQUlOOworCisvKioqKioqKioqKioqKioqKi8KKy8qIHVuaURyY0NvbmZpZyAqLworLyoqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgZW51bSB7CisgIEVCX05JR0hUID0gMHgwMDAxLAorICBFQl9OT0lTWSA9IDB4MDAwMiwKKyAgRUJfTElNSVRFRCA9IDB4MDAwNCwKKyAgRUJfTE9XTEVWRUwgPSAweDAwMDgsCisgIEVCX0RJQUxPRyA9IDB4MDAxMCwKKyAgRUJfR0VORVJBTF9DT01QUiA9IDB4MDAyMCwKKyAgRUJfRVhQQU5EID0gMHgwMDQwLAorICBFQl9BUlRJU1RJQyA9IDB4MDA4MCwKKyAgRUJfQ0xJUFBJTkcgPSAweDAxMDAsCisgIEVCX0ZBREUgPSAweDAyMDAsCisgIEVCX0RVQ0tfT1RIRVIgPSAweDA0MDAsCisgIEVCX0RVQ0tfU0VMRiA9IDB4MDgwMAorfSBFRkZFQ1RfQklUOworCit0eXBlZGVmIGVudW0geworICBHQ1BfUkVHVUxBUiA9IDAsCisgIEdDUF9GQURJTkcgPSAxLAorICBHQ1BfQ0xJUFBJTkdfRFVDS0lORyA9IDIsCisgIEdDUF9DT05TVEFOVCA9IDMKK30gR0FJTl9DT0RJTkdfUFJPRklMRTsKKwordHlwZWRlZiBlbnVtIHsgR0lUX1NQTElORSA9IDAsIEdJVF9MSU5FQVIgPSAxIH0gR0FJTl9JTlRFUlBPTEFUSU9OX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7IENTX0xFRlQgPSAwLCBDU19SSUdIVCA9IDEgfSBDSEFSQUNURVJJU1RJQ19TSURFOworCit0eXBlZGVmIGVudW0geyBDRl9TSUdNT0lEID0gMCwgQ0ZfTk9ERVMgPSAxIH0gQ0hBUkFDVEVSSVNUSUNfRk9STUFUOworCit0eXBlZGVmIGVudW0geworICBHRl9RTUYzMiA9IDB4MSwKKyAgR0ZfUU1GSFlCUklEMzkgPSAweDIsCisgIEdGX1FNRjY0ID0gMHgzLAorICBHRl9RTUZIWUJSSUQ3MSA9IDB4NCwKKyAgR0ZfUU1GMTI4ID0gMHg1LAorICBHRl9RTUZIWUJSSUQxMzUgPSAweDYsCisgIEdGX1VOSUZPUk0gPSAweDcKK30gRVFfU1VCQkFORF9HQUlOX0ZPUk1BVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBkdWNraW5nU2NhbGluZ1ByZXNlbnQ7CisgIEZJWFBfU0dMIGR1Y2tpbmdTY2FsaW5nOyAvKiBlID0gMiAqLworfSBEVUNLSU5HX01PRElGSUNBVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiB0YXJnZXRDaGFyYWN0ZXJpc3RpY0xlZnRQcmVzZW50OworICBVQ0hBUiB0YXJnZXRDaGFyYWN0ZXJpc3RpY0xlZnRJbmRleDsKKyAgVUNIQVIgdGFyZ2V0Q2hhcmFjdGVyaXN0aWNSaWdodFByZXNlbnQ7CisgIFVDSEFSIHRhcmdldENoYXJhY3RlcmlzdGljUmlnaHRJbmRleDsKKyAgVUNIQVIgZ2FpblNjYWxpbmdQcmVzZW50OworICBGSVhQX1NHTCBhdHRlbnVhdGlvblNjYWxpbmc7ICAgLyogZSA9IDIgKi8KKyAgRklYUF9TR0wgYW1wbGlmaWNhdGlvblNjYWxpbmc7IC8qIGUgPSAyICovCisgIFVDSEFSIGdhaW5PZmZzZXRQcmVzZW50OworICBGSVhQX1NHTCBnYWluT2Zmc2V0OyAvKiBlID0gNCAqLworfSBHQUlOX01PRElGSUNBVElPTjsKKwordHlwZWRlZiB1bmlvbiB7CisgIFVDSEFSIGNyb3Nzb3ZlckZyZXFJbmRleDsKKyAgVVNIT1JUIHN0YXJ0U3ViQmFuZEluZGV4OworfSBCQU5EX0JPUkRFUjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBsZWZ0OworICBVQ0hBUiByaWdodDsKK30gQ1VTVE9NX0lOREVYOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIHByZXNlbnQ7CisgIFVDSEFSIGlzQ0lDUDsKKyAgdW5pb24geworICAgIFVDSEFSIGNpY3BJbmRleDsKKyAgICBDVVNUT01fSU5ERVggY3VzdG9tOworICB9OworfSBEUkNfQ0hBUkFDVEVSSVNUSUM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgZ2FpbkNvZGluZ1Byb2ZpbGU7CisgIFVDSEFSIGdhaW5JbnRlcnBvbGF0aW9uVHlwZTsKKyAgVUNIQVIgZnVsbEZyYW1lOworICBVQ0hBUiB0aW1lQWxpZ25tZW50OworICBVQ0hBUiB0aW1lRGVsdGFNaW5QcmVzZW50OworICBVU0hPUlQgdGltZURlbHRhTWluOworICBVQ0hBUiBiYW5kQ291bnQ7CisgIFVDSEFSIGRyY0JhbmRUeXBlOworICBVQ0hBUiBnYWluU2VxdWVuY2VJbmRleFs0XTsKKyAgRFJDX0NIQVJBQ1RFUklTVElDIGRyY0NoYXJhY3RlcmlzdGljWzRdOworICBCQU5EX0JPUkRFUiBiYW5kQm9yZGVyWzRdOworfSBHQUlOX1NFVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX1NHTCBnYWluOyAgICAvKiBlID0gNiAqLworICBGSVhQX1NHTCBpb1JhdGlvOyAvKiBlID0gMiAqLworICBGSVhQX1NHTCBleHA7ICAgICAvKiBlID0gNSAqLworICBVQ0hBUiBmbGlwU2lnbjsKK30gQ1VTVE9NX0RSQ19DSEFSX1NJR01PSUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgY2hhcmFjdGVyaXN0aWNOb2RlQ291bnQ7CisgIEZJWFBfU0dMIG5vZGVMZXZlbFs0ICsgMV07IC8qIGUgPSA3ICovCisgIEZJWFBfU0dMIG5vZGVHYWluWzQgKyAxXTsgIC8qIGUgPSA3ICovCit9IENVU1RPTV9EUkNfQ0hBUl9OT0RFUzsKKwordHlwZWRlZiBzaG91bGRCZVVuaW9uIHsKKyAgQ1VTVE9NX0RSQ19DSEFSX1NJR01PSUQgc2lnbW9pZDsKKyAgQ1VTVE9NX0RSQ19DSEFSX05PREVTIG5vZGVzOworfQorQ1VTVE9NX0RSQ19DSEFSOworCisvKiBkcmNDb2VmZmljaWVudHNVbmlEcmMoKSAoVGFibGUgNjcpICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGRyY0xvY2F0aW9uOworICBVQ0hBUiBkcmNGcmFtZVNpemVQcmVzZW50OworICBVU0hPUlQgZHJjRnJhbWVTaXplOworICBVQ0hBUiBjaGFyYWN0ZXJpc3RpY0xlZnRDb3VudDsKKyAgVUNIQVIgY2hhcmFjdGVyaXN0aWNMZWZ0Rm9ybWF0WzhdOworICBDVVNUT01fRFJDX0NIQVIgY3VzdG9tQ2hhcmFjdGVyaXN0aWNMZWZ0WzhdOworICBVQ0hBUiBjaGFyYWN0ZXJpc3RpY1JpZ2h0Q291bnQ7CisgIFVDSEFSIGNoYXJhY3RlcmlzdGljUmlnaHRGb3JtYXRbOF07CisgIENVU1RPTV9EUkNfQ0hBUiBjdXN0b21DaGFyYWN0ZXJpc3RpY1JpZ2h0WzhdOworICBVQ0hBUgorICBnYWluU2VxdWVuY2VDb3VudDsgIC8qIHVuc2F0dXJhdGVkIHZhbHVlLCBpLmUuIGFzIHByb3ZpZGVkIGluIGJpdHN0cmVhbSAqLworICBVQ0hBUiBnYWluU2V0Q291bnQ7IC8qIHNhdHVyYXRlZCB0byAxMiAqLworICBHQUlOX1NFVCBnYWluU2V0WzEyXTsKKyAgLyogZGVyaXZlZCBkYXRhICovCisgIFVDSEFSIGdhaW5TZXRJbmRleEZvckdhaW5TZXF1ZW5jZVsxMl07Cit9IERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQzsKKworLyogZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjKCkgKFRhYmxlIDcyKSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBTQ0hBUiBkcmNTZXRJZDsKKyAgVUNIQVIgZHJjU2V0Q29tcGxleGl0eUxldmVsOworICBVQ0hBUiBkcmNMb2NhdGlvbjsKKyAgVUNIQVIgZHJjQXBwbHlUb0Rvd25taXg7CisgIFVDSEFSIGRvd25taXhJZENvdW50OworICBVQ0hBUiBkb3dubWl4SWRbOF07CisgIFVTSE9SVCBkcmNTZXRFZmZlY3Q7CisgIFVDSEFSIGxpbWl0ZXJQZWFrVGFyZ2V0UHJlc2VudDsKKyAgRklYUF9TR0wgbGltaXRlclBlYWtUYXJnZXQ7IC8qIGUgPSA1ICovCisgIFVDSEFSIGRyY1NldFRhcmdldExvdWRuZXNzUHJlc2VudDsKKyAgU0NIQVIgZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZVVwcGVyOworICBTQ0hBUiBkcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXI7CisgIFVDSEFSIGRlcGVuZHNPbkRyY1NldFByZXNlbnQ7CisgIHVuaW9uIHsKKyAgICBTQ0hBUiBkZXBlbmRzT25EcmNTZXQ7CisgICAgVUNIQVIgbm9JbmRlcGVuZGVudFVzZTsKKyAgfTsKKyAgVUNIQVIgcmVxdWlyZXNFcTsKKyAgc2hvdWxkQmVVbmlvbiB7CisgICAgR0FJTl9NT0RJRklDQVRJT04gZ2Fpbk1vZGlmaWNhdGlvbkZvckNoYW5uZWxHcm91cFs4XVs0XTsKKyAgICBEVUNLSU5HX01PRElGSUNBVElPTiBkdWNraW5nTW9kaWZpY2F0aW9uRm9yQ2hhbm5lbFs4XTsKKyAgfTsKKyAgU0NIQVIgZ2FpblNldEluZGV4WzhdOworCisgIC8qIGRlcml2ZWQgZGF0YSAqLworICBVQ0hBUiBkcmNDaGFubmVsQ291bnQ7CisgIFVDSEFSIG5EcmNDaGFubmVsR3JvdXBzOworICBTQ0hBUiBnYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXBbOF07Cit9IERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQzsKKworLyogY2hhbm5lbExheW91dCgpIChUYWJsZSA2MikgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgYmFzZUNoYW5uZWxDb3VudDsKKyAgVUNIQVIgbGF5b3V0U2lnbmFsaW5nUHJlc2VudDsKKyAgVUNIQVIgZGVmaW5lZExheW91dDsKKyAgVUNIQVIgc3BlYWtlclBvc2l0aW9uWzhdOworfSBDSEFOTkVMX0xBWU9VVDsKKworLyogZG93bm1peEluc3RydWN0aW9ucygpIChUYWJsZSA2MykgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgZG93bm1peElkOworICBVQ0hBUiB0YXJnZXRDaGFubmVsQ291bnQ7CisgIFVDSEFSIHRhcmdldExheW91dDsKKyAgVUNIQVIgZG93bm1peENvZWZmaWNpZW50c1ByZXNlbnQ7CisgIFVDSEFSIGJzRG93bm1peE9mZnNldDsKKyAgRklYUF9EQkwgZG93bm1peENvZWZmaWNpZW50WzggKiA4XTsgLyogZSA9IDIgKi8KK30gRE9XTk1JWF9JTlNUUlVDVElPTlM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgdW5pRHJjQ29uZmlnRXh0VHlwZVs4XTsKKyAgVUxPTkcgZXh0Qml0U2l6ZVs4IC0gMV07Cit9IFVOSV9EUkNfQ09ORklHX0VYVEVOU0lPTjsKKworLyogdW5pRHJjQ29uZmlnKCkgKFRhYmxlIDU3KSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBzYW1wbGVSYXRlUHJlc2VudDsKKyAgVUxPTkcgc2FtcGxlUmF0ZTsKKyAgVUNIQVIgZG93bm1peEluc3RydWN0aW9uc0NvdW50VjA7CisgIFVDSEFSIGRvd25taXhJbnN0cnVjdGlvbnNDb3VudFYxOworICBVQ0hBUiBkb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnQ7IC8qIHNhdHVyYXRlZCB0byA2ICovCisgIFVDSEFSIGRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50VjA7CisgIFVDSEFSIGRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50VjE7CisgIFVDSEFSIGRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50OyAvKiBzYXR1cmF0ZWQgdG8gMiAqLworICBVQ0hBUiBkcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudFYwOworICBVQ0hBUiBkcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudFYxOworICBVQ0hBUiBkcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudDsgLyogc2F0dXJhdGVkIHRvICgxMiArIDEgKyA2KSAqLworICBDSEFOTkVMX0xBWU9VVCBjaGFubmVsTGF5b3V0OworICBET1dOTUlYX0lOU1RSVUNUSU9OUyBkb3dubWl4SW5zdHJ1Y3Rpb25zWzZdOworICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMgZHJjQ29lZmZpY2llbnRzVW5pRHJjWzJdOworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMgZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjWygxMiArIDEgKyA2KV07CisgIFVDSEFSIHVuaURyY0NvbmZpZ0V4dFByZXNlbnQ7CisgIFVOSV9EUkNfQ09ORklHX0VYVEVOU0lPTiB1bmlEcmNDb25maWdFeHQ7CisKKyAgLyogZGVyaXZlZCBkYXRhICovCisgIFVDSEFSIGRyY0luc3RydWN0aW9uc0NvdW50SW5jbFZpcnR1YWw7CisgIFVDSEFSIGRpZmY7Cit9IFVOSV9EUkNfQ09ORklHLCAqSEFORExFX1VOSV9EUkNfQ09ORklHOworCisvKioqKioqKioqKioqKioqKioqKi8KKy8qIGxvdWRuZXNzSW5mb1NldCAqLworLyoqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgZW51bSB7CisgIE1EX1VOS05PV05fT1RIRVIgPSAwLAorICBNRF9QUk9HUkFNX0xPVURORVNTID0gMSwKKyAgTURfQU5DSE9SX0xPVURORVNTID0gMiwKKyAgTURfTUFYX09GX0xPVURORVNTX1JBTkdFID0gMywKKyAgTURfTU9NRU5UQVJZX0xPVURORVNTX01BWCA9IDQsCisgIE1EX1NIT1JUX1RFUk1fTE9VRE5FU1NfTUFYID0gNSwKKyAgTURfTE9VRE5FU1NfUkFOR0UgPSA2LAorICBNRF9NSVhJTkdfTEVWRUwgPSA3LAorICBNRF9ST09NX1RZUEUgPSA4LAorICBNRF9TSE9SVF9URVJNX0xPVURORVNTID0gOQorfSBNRVRIT0RfREVGSU5JVElPTjsKKwordHlwZWRlZiBlbnVtIHsKKyAgTVNfVU5LTk9XTl9PVEhFUiA9IDAsCisgIE1TX0VCVV9SXzEyOCA9IDEsCisgIE1TX0JTXzE3NzBfNCA9IDIsCisgIE1TX0JTXzE3NzBfNF9QUkVfUFJPQ0VTU0lORyA9IDMsCisgIE1TX1VTRVIgPSA0LAorICBNU19FWFBFUlRfUEFORUwgPSA1LAorICBNU19CU18xNzcxXzEgPSA2LAorICBNU19SRVNFUlZFRF9BID0gNywKKyAgTVNfUkVTRVJWRURfQiA9IDgsCisgIE1TX1JFU0VSVkVEX0MgPSA5LAorICBNU19SRVNFUlZFRF9EID0gMTAsCisgIE1TX1JFU0VSVkVEX0UgPSAxMQorfSBNRUFTVVJFTUVOVF9TWVNURU07CisKK3R5cGVkZWYgZW51bSB7CisgIFJfVUtOT1dOID0gMCwKKyAgUl9VTlZFUklGSUVEID0gMSwKKyAgUl9DRUlMSU5HID0gMiwKKyAgUl9BQ0NVUkFURSA9IDMKK30gUkVMSUFCSUxJVFk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgbWV0aG9kRGVmaW5pdGlvbjsKKyAgRklYUF9EQkwgbWV0aG9kVmFsdWU7IC8qIGUgPSA3IGZvciBhbGwgbWV0aG9kRGVmaW5pdGlvbnMgKi8KKyAgVUNIQVIgbWVhc3VyZW1lbnRTeXN0ZW07CisgIFVDSEFSIHJlbGlhYmlsaXR5OworfSBMT1VETkVTU19NRUFTVVJFTUVOVDsKKworLyogbG91ZG5lc3NJbmZvKCkgKFRhYmxlIDU5KSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBTQ0hBUiBkcmNTZXRJZDsKKyAgVUNIQVIgZXFTZXRJZDsKKyAgVUNIQVIgZG93bm1peElkOworICBVQ0hBUiBzYW1wbGVQZWFrTGV2ZWxQcmVzZW50OworICBGSVhQX0RCTCBzYW1wbGVQZWFrTGV2ZWw7IC8qIGUgPSA3ICovCisgIFVDSEFSIHRydWVQZWFrTGV2ZWxQcmVzZW50OworICBGSVhQX0RCTCB0cnVlUGVha0xldmVsOyAvKiBlID0gNyAqLworICBVQ0hBUiB0cnVlUGVha0xldmVsTWVhc3VyZW1lbnRTeXN0ZW07CisgIFVDSEFSIHRydWVQZWFrTGV2ZWxSZWxpYWJpbGl0eTsKKyAgVUNIQVIgbWVhc3VyZW1lbnRDb3VudDsgLyogc2F0dXJhdGVkIHRvIDggKi8KKyAgTE9VRE5FU1NfTUVBU1VSRU1FTlQgbG91ZG5lc3NNZWFzdXJlbWVudFs4XTsKK30gTE9VRE5FU1NfSU5GTzsKKworLyogbG91ZG5lc3NJbmZvU2V0RXh0ZW5zaW9uKCkgKFRhYmxlIDYxKSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBsb3VkbmVzc0luZm9TZXRFeHRUeXBlWzhdOworICBVTE9ORyBleHRCaXRTaXplWzggLSAxXTsKK30gTE9VRE5FU1NfSU5GT19TRVRfRVhURU5TSU9OOworCisvKiBsb3VkbmVzc0luZm9TZXQoKSAoVGFibGUgNTgpICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGxvdWRuZXNzSW5mb0FsYnVtQ291bnRWMDsKKyAgVUNIQVIgbG91ZG5lc3NJbmZvQWxidW1Db3VudFYxOworICBVQ0hBUiBsb3VkbmVzc0luZm9BbGJ1bUNvdW50OyAvKiBzYXR1cmF0ZWQgdG8gMTIgKi8KKyAgVUNIQVIgbG91ZG5lc3NJbmZvQ291bnRWMDsKKyAgVUNIQVIgbG91ZG5lc3NJbmZvQ291bnRWMTsKKyAgVUNIQVIgbG91ZG5lc3NJbmZvQ291bnQ7IC8qIHNhdHVyYXRlZCB0byAxMiAqLworICBMT1VETkVTU19JTkZPIGxvdWRuZXNzSW5mb0FsYnVtWzEyXTsKKyAgTE9VRE5FU1NfSU5GTyBsb3VkbmVzc0luZm9bMTJdOworICBVQ0hBUiBsb3VkbmVzc0luZm9TZXRFeHRQcmVzZW50OworICBMT1VETkVTU19JTkZPX1NFVF9FWFRFTlNJT04gbG91ZG5lc3NJbmZvU2V0RXh0OworICAvKiBkZXJpdmVkIGRhdGEgKi8KKyAgVUNIQVIgZGlmZjsKK30gTE9VRE5FU1NfSU5GT19TRVQsICpIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL3NyYy9kcmNEZWNvZGVyLmggYi9saWJEUkNkZWMvc3JjL2RyY0RlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODI2YTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNvZGVyLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBEUkNERUNPREVSX0gKKyNkZWZpbmUgRFJDREVDT0RFUl9ICisKKy8qIGRyY0RlY29kZXIuaDogZGVmaW5pdGlvbnMgdXNlZCBpbiBhbGwgc3VibW9kdWxlcyAqLworCisjZGVmaW5lIE1BWF9BQ1RJVkVfRFJDUyAzCisKK3R5cGVkZWYgZW51bSB7IERNX1JFR1VMQVJfREVMQVkgPSAwLCBETV9MT1dfREVMQVkgPSAxIH0gREVMQVlfTU9ERTsKKwordHlwZWRlZiBlbnVtIHsKKyAgREVfT0sgPSAwLAorICBERV9OT1RfT0sgPSAtMTAwLAorICBERV9QQVJBTV9PVVRfT0ZfUkFOR0UsCisgIERFX1BBUkFNX0lOVkFMSUQsCisgIERFX01FTU9SWV9FUlJPUgorfSBEUkNfRVJST1I7CisKK3R5cGVkZWYgZW51bSB7IFNETV9PRkYsIFNETV9RTUY2NCwgU0RNX1FNRjcxLCBTRE1fU1RGVDI1NiB9IFNVQkJBTkRfRE9NQUlOX01PREU7CisKKyNkZWZpbmUgRE9XTk1JWF9JRF9CQVNFX0xBWU9VVCAweDAKKyNkZWZpbmUgRE9XTk1JWF9JRF9BTllfRE9XTk1JWCAweDdGCisjZGVmaW5lIERSQ19TRVRfSURfTk9fRFJDIDB4MAorI2RlZmluZSBEUkNfU0VUX0lEX0FOWV9EUkMgMHgzRgorCisjZGVmaW5lIExPQ0FUSU9OX01QNF9JTlNUUkVBTV9VTklEUkMgMHgxCisjZGVmaW5lIExPQ0FUSU9OX01QNF9EWU5fUkFOR0VfSU5GTyAweDIKKyNkZWZpbmUgTE9DQVRJT05fTVA0X0NPTVBSRVNTSU9OX1ZBTFVFIDB4MworI2RlZmluZSBMT0NBVElPTl9TRUxFQ1RFRCBcCisgIExPQ0FUSU9OX01QNF9JTlNUUkVBTV9VTklEUkMgLyogc2V0IHRvIGxvY2F0aW9uIHNlbGVjdGVkIGJ5IHN5c3RlbSAqLworCisjZGVmaW5lIE1BWF9SRVFVRVNUU19ET1dOTUlYX0lEIDE1CisjZGVmaW5lIE1BWF9SRVFVRVNUU19EUkNfRkVBVFVSRSA3CisjZGVmaW5lIE1BWF9SRVFVRVNUU19EUkNfRUZGRUNUX1RZUEUgMTUKKworI2RlZmluZSBERUZBVUxUX0xPVURORVNTX0RFVklBVElPTl9NQVggNjMKKworI2RlZmluZSBEUkNfSU5QVVRfTE9VRE5FU1NfVEFSR0VUIEZMMkZYQ09OU1RfREJMKC0zMS4wZiAvIChmbG9hdCkoMSA8PCA3KSkKKyNkZWZpbmUgRFJDX0lOUFVUX0xPVURORVNTX1RBUkdFVF9TR0wgRkwyRlhDT05TVF9TR0woLTMxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19pbml0LmNwcCBiL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19pbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGYzMjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX2luaXQuY3BwCkBAIC0wLDAgKzEsMzQ0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkcmNEZWNfdHlwZXMuaCIKKyNpbmNsdWRlICJkcmNEZWNfdG9vbHMuaCIKKyNpbmNsdWRlICJkcmNEZWNfZ2FpbkRlY29kZXIuaCIKKyNpbmNsdWRlICJkcmNHYWluRGVjX2luaXQuaCIKKworc3RhdGljIERSQ19FUlJPUiBfZ2VuZXJhdGVEcmNJbnN0cnVjdGlvbnNEZXJpdmVkRGF0YSgKKyAgICBIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCwgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKiBwQ29lZiwKKyAgICBBQ1RJVkVfRFJDKiBwQWN0aXZlRHJjKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGc7CisgIGludCBnYWluRWxlbWVudENvdW50ID0gMDsKKyAgVUNIQVIgbkRyY0NoYW5uZWxHcm91cHMgPSAwOworICBTQ0hBUiBnYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXBbOF07CisKKyAgZXJyID0gZGVyaXZlRHJjQ2hhbm5lbEdyb3VwcygKKyAgICAgIHBJbnN0LT5kcmNTZXRFZmZlY3QsIHBJbnN0LT5kcmNDaGFubmVsQ291bnQsIHBJbnN0LT5nYWluU2V0SW5kZXgsCisgICAgICBwSW5zdC0+ZHJjU2V0RWZmZWN0ICYgKEVCX0RVQ0tfT1RIRVIgfCBFQl9EVUNLX1NFTEYpCisgICAgICAgICAgPyBwSW5zdC0+ZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWwKKyAgICAgICAgICA6IE5VTEwsCisgICAgICAmbkRyY0NoYW5uZWxHcm91cHMsIGdhaW5TZXRJbmRleEZvckNoYW5uZWxHcm91cCwKKyAgICAgIHBBY3RpdmVEcmMtPmNoYW5uZWxHcm91cEZvckNoYW5uZWwsCisgICAgICBwSW5zdC0+ZHJjU2V0RWZmZWN0ICYgKEVCX0RVQ0tfT1RIRVIgfCBFQl9EVUNLX1NFTEYpCisgICAgICAgICAgPyBwQWN0aXZlRHJjLT5kdWNraW5nTW9kaWZpY2F0aW9uRm9yQ2hhbm5lbEdyb3VwCisgICAgICAgICAgOiBOVUxMKTsKKyAgaWYgKGVycikgcmV0dXJuIChlcnIpOworCisgIC8qIHNhbml0eSBjaGVjayAqLworICBpZiAobkRyY0NoYW5uZWxHcm91cHMgIT0gcEluc3QtPm5EcmNDaGFubmVsR3JvdXBzKSByZXR1cm4gREVfTk9UX09LOworICBmb3IgKGcgPSAwOyBnIDwgcEluc3QtPm5EcmNDaGFubmVsR3JvdXBzOyBnKyspIHsKKyAgICBpZiAoZ2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwW2ddICE9IHBJbnN0LT5nYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXBbZ10pCisgICAgICByZXR1cm4gREVfTk9UX09LOworICB9CisKKyAgZm9yIChnID0gMDsgZyA8IHBJbnN0LT5uRHJjQ2hhbm5lbEdyb3VwczsgZysrKSB7CisgICAgaW50IHNlcSA9IHBJbnN0LT5nYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXBbZ107CisgICAgaWYgKHNlcSAhPSAtMSAmJiAoaFVuaURyY0NvbmZpZy0+ZHJjQ29lZmZpY2llbnRzVW5pRHJjQ291bnQgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgIHNlcSA+PSBwQ29lZi0+Z2FpblNldENvdW50KSkgeworICAgICAgcEFjdGl2ZURyYy0+Y2hhbm5lbEdyb3VwSXNQYXJhbWV0cmljRHJjW2ddID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgcEFjdGl2ZURyYy0+Y2hhbm5lbEdyb3VwSXNQYXJhbWV0cmljRHJjW2ddID0gMDsKKyAgICAgIGlmIChzZXEgPj0gcENvZWYtPmdhaW5TZXRDb3VudCkgeworICAgICAgICByZXR1cm4gREVfTk9UX09LOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGdhaW5FbGVtZW50Q291bnQgKi8KKyAgaWYgKHBJbnN0LT5kcmNTZXRFZmZlY3QgJiAoRUJfRFVDS19PVEhFUiB8IEVCX0RVQ0tfU0VMRikpIHsKKyAgICBmb3IgKGcgPSAwOyBnIDwgcEluc3QtPm5EcmNDaGFubmVsR3JvdXBzOyBnKyspIHsKKyAgICAgIHBBY3RpdmVEcmMtPmJhbmRDb3VudEZvckNoYW5uZWxHcm91cFtnXSA9IDE7CisgICAgfQorICAgIHBBY3RpdmVEcmMtPmdhaW5FbGVtZW50Q291bnQgPQorICAgICAgICBwSW5zdC0+bkRyY0NoYW5uZWxHcm91cHM7IC8qIG9uZSBnYWluIGVsZW1lbnQgcGVyIGNoYW5uZWwgZ3JvdXAgKi8KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGcgPSAwOyBnIDwgcEluc3QtPm5EcmNDaGFubmVsR3JvdXBzOyBnKyspIHsKKyAgICAgIGlmIChwQWN0aXZlRHJjLT5jaGFubmVsR3JvdXBJc1BhcmFtZXRyaWNEcmNbZ10pIHsKKyAgICAgICAgZ2FpbkVsZW1lbnRDb3VudCsrOworICAgICAgICBwQWN0aXZlRHJjLT5iYW5kQ291bnRGb3JDaGFubmVsR3JvdXBbZ10gPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHNlcSwgYmFuZENvdW50OworICAgICAgICBzZXEgPSBwSW5zdC0+Z2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwW2ddOworICAgICAgICBiYW5kQ291bnQgPSBwQ29lZi0+Z2FpblNldFtzZXFdLmJhbmRDb3VudDsKKyAgICAgICAgcEFjdGl2ZURyYy0+YmFuZENvdW50Rm9yQ2hhbm5lbEdyb3VwW2ddID0gYmFuZENvdW50OworICAgICAgICBnYWluRWxlbWVudENvdW50ICs9IGJhbmRDb3VudDsKKyAgICAgIH0KKyAgICB9CisgICAgcEFjdGl2ZURyYy0+Z2FpbkVsZW1lbnRDb3VudCA9IGdhaW5FbGVtZW50Q291bnQ7CisgIH0KKworICAvKiBwcmVwYXJlIGdhaW5FbGVtZW50Rm9yR3JvdXAgKGN1bXVsYXRlZCBzdW0gb2YgYmFuZENvdW50Rm9yQ2hhbm5lbEdyb3VwKSAqLworICBwQWN0aXZlRHJjLT5nYWluRWxlbWVudEZvckdyb3VwWzBdID0gMDsKKyAgZm9yIChnID0gMTsgZyA8IHBJbnN0LT5uRHJjQ2hhbm5lbEdyb3VwczsgZysrKSB7CisgICAgcEFjdGl2ZURyYy0+Z2FpbkVsZW1lbnRGb3JHcm91cFtnXSA9CisgICAgICAgIHBBY3RpdmVEcmMtPmdhaW5FbGVtZW50Rm9yR3JvdXBbZyAtIDFdICsKKyAgICAgICAgcEFjdGl2ZURyYy0+YmFuZENvdW50Rm9yQ2hhbm5lbEdyb3VwW2cgLSAxXTsgLyogaW5kZXggb2YgZmlyc3QgZ2FpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBpbiBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwICovCisgIH0KKworICByZXR1cm4gREVfT0s7Cit9CisKK0RSQ19FUlJPUgoraW5pdEdhaW5EZWMoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIGNvbnN0IGludCBmcmFtZVNpemUsCisgICAgICAgICAgICBjb25zdCBpbnQgc2FtcGxlUmF0ZSkgeworICBpbnQgaSwgaiwgazsKKworICBpZiAoZnJhbWVTaXplIDwgMSkgeworICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKworICBoR2FpbkRlYy0+ZnJhbWVTaXplID0gZnJhbWVTaXplOworCisgIGlmIChoR2FpbkRlYy0+ZnJhbWVTaXplICogMTAwMCA8IHNhbXBsZVJhdGUpIHsKKyAgICByZXR1cm4gREVfTk9UX09LOworICB9CisKKyAgaEdhaW5EZWMtPmRlbHRhVG1pbkRlZmF1bHQgPSBnZXREZWx0YVRtaW4oc2FtcGxlUmF0ZSk7CisgIGlmIChoR2FpbkRlYy0+ZGVsdGFUbWluRGVmYXVsdCA+IGhHYWluRGVjLT5mcmFtZVNpemUpIHsKKyAgICByZXR1cm4gREVfTk9UX09LOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9BQ1RJVkVfRFJDUzsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgLyogdXNlIHN0YXJ0dXAgbm9kZSBhdCB0aGUgYmVnaW5uaW5nICovCisgICAgICBoR2FpbkRlYy0+YWN0aXZlRHJjW2ldLmxuYkluZGV4Rm9yQ2hhbm5lbFtqXVswXSA9IDA7CisgICAgICBmb3IgKGsgPSAxOyBrIDwgTlVNX0xOQl9GUkFNRVM7IGsrKykgeworICAgICAgICBoR2FpbkRlYy0+YWN0aXZlRHJjW2ldLmxuYkluZGV4Rm9yQ2hhbm5lbFtqXVtrXSA9IC0xOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICBoR2FpbkRlYy0+Y2hhbm5lbEdhaW5bal0gPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDgpKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCA0ICogMTAyNCAvIDI1NjsgaSsrKSB7CisgICAgaEdhaW5EZWMtPmR1bW15U3ViYmFuZEdhaW5zW2ldID0gRkwyRlhDT05TVF9EQkwoMS4wZiAvIChmbG9hdCkoMSA8PCA3KSk7CisgIH0KKworICBoR2FpbkRlYy0+c3RhdHVzID0gMDsgLyogc3RhcnR1cCAqLworCisgIHJldHVybiBERV9PSzsKK30KKwordm9pZCBpbml0RHJjR2FpbkJ1ZmZlcnMoY29uc3QgaW50IGZyYW1lU2l6ZSwgRFJDX0dBSU5fQlVGRkVSUyogZHJjR2FpbkJ1ZmZlcnMpIHsKKyAgaW50IGksIGMsIGo7CisgIC8qIHByZXBhcmUgMTIgaW5zdGFuY2VzIG9mIG5vZGUgYnVmZmVycyAqLworICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCBOVU1fTE5CX0ZSQU1FUzsgaisrKSB7CisgICAgICBkcmNHYWluQnVmZmVycy0+bGluZWFyTm9kZUJ1ZmZlcltpXS5uTm9kZXNbal0gPSAxOworICAgICAgZHJjR2FpbkJ1ZmZlcnMtPmxpbmVhck5vZGVCdWZmZXJbaV0ubGluZWFyTm9kZVtqXVswXS5nYWluTGluID0KKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKTsKKyAgICAgIGlmIChqID09IDApIHsKKyAgICAgICAgZHJjR2FpbkJ1ZmZlcnMtPmxpbmVhck5vZGVCdWZmZXJbaV0ubGluZWFyTm9kZVtqXVswXS50aW1lID0KKyAgICAgICAgICAgIDA7IC8qIGluaXRpYWxpemUgbGFzdCBub2RlIHdpdGggc3RhcnR1cCBub2RlICovCisgICAgICB9IGVsc2UgeworICAgICAgICBkcmNHYWluQnVmZmVycy0+bGluZWFyTm9kZUJ1ZmZlcltpXS5saW5lYXJOb2RlW2pdWzBdLnRpbWUgPQorICAgICAgICAgICAgZnJhbWVTaXplIC0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBwcmVwYXJlIGR1bW15TG5iLCBhIGxpbmVhck5vZGVCdWZmZXIgY29udGFpbmluZyBhIGNvbnN0YW50IGdhaW4gb2YgMCBkQiwKKyAgICogZm9yIHRoZSAibm8gRFJDIHByb2Nlc3NpbmciIGNhc2UgKi8KKyAgZHJjR2FpbkJ1ZmZlcnMtPmR1bW15TG5iLmdhaW5JbnRlcnBvbGF0aW9uVHlwZSA9IEdJVF9MSU5FQVI7CisgIGZvciAoaSA9IDA7IGkgPCBOVU1fTE5CX0ZSQU1FUzsgaSsrKSB7CisgICAgZHJjR2FpbkJ1ZmZlcnMtPmR1bW15TG5iLm5Ob2Rlc1tpXSA9IDE7CisgICAgZHJjR2FpbkJ1ZmZlcnMtPmR1bW15TG5iLmxpbmVhck5vZGVbaV1bMF0uZ2FpbkxpbiA9CisgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgNykpOworICAgIGRyY0dhaW5CdWZmZXJzLT5kdW1teUxuYi5saW5lYXJOb2RlW2ldWzBdLnRpbWUgPSBmcmFtZVNpemUgLSAxOworICB9CisKKyAgLyogcHJlcGFyZSBjaGFubmVsR2FpbiBkZWxheSBsaW5lICovCisgIGZvciAoYyA9IDA7IGMgPCA4OyBjKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0xOQl9GUkFNRVM7IGkrKykgeworICAgICAgZHJjR2FpbkJ1ZmZlcnMtPmNoYW5uZWxHYWluW2NdW2ldID0KKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDgpKTsKKyAgICB9CisgIH0KKworICBkcmNHYWluQnVmZmVycy0+bG5iUG9pbnRlciA9IDA7Cit9CisKK0RSQ19FUlJPUgoraW5pdEFjdGl2ZURyYyhIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywKKyAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsIGNvbnN0IGludCBkcmNTZXRJZFNlbGVjdGVkLAorICAgICAgICAgICAgICBjb25zdCBpbnQgZG93bm1peElkU2VsZWN0ZWQpIHsKKyAgaW50IGcsIGlzTXVsdGliYW5kID0gMDsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0ID0gTlVMTDsKKyAgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKiBwQ29lZiA9IE5VTEw7CisKKyAgcEluc3QgPSBzZWxlY3REcmNJbnN0cnVjdGlvbnMoaFVuaURyY0NvbmZpZywgZHJjU2V0SWRTZWxlY3RlZCk7CisgIGlmIChwSW5zdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgfQorCisgIGlmIChwSW5zdC0+ZHJjU2V0SWQgPj0gMCkgeworICAgIHBDb2VmID0gc2VsZWN0RHJjQ29lZmZpY2llbnRzKGhVbmlEcmNDb25maWcsIHBJbnN0LT5kcmNMb2NhdGlvbik7CisgICAgaWYgKHBDb2VmID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBERV9OT1RfT0s7CisgICAgfQorCisgICAgaWYgKHBDb2VmLT5kcmNGcmFtZVNpemVQcmVzZW50KSB7CisgICAgICBpZiAocENvZWYtPmRyY0ZyYW1lU2l6ZSAhPSBoR2FpbkRlYy0+ZnJhbWVTaXplKSB7CisgICAgICAgIHJldHVybiBERV9OT1RfT0s7CisgICAgICB9CisgICAgfQorCisgICAgZXJyID0gX2dlbmVyYXRlRHJjSW5zdHJ1Y3Rpb25zRGVyaXZlZERhdGEoCisgICAgICAgIGhHYWluRGVjLCBoVW5pRHJjQ29uZmlnLCBwSW5zdCwgcENvZWYsCisgICAgICAgICYoaEdhaW5EZWMtPmFjdGl2ZURyY1toR2FpbkRlYy0+bkFjdGl2ZURyY3NdKSk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgfQorCisgIGhHYWluRGVjLT5hY3RpdmVEcmNbaEdhaW5EZWMtPm5BY3RpdmVEcmNzXS5wSW5zdCA9IHBJbnN0OworICBoR2FpbkRlYy0+YWN0aXZlRHJjW2hHYWluRGVjLT5uQWN0aXZlRHJjc10ucENvZWYgPSBwQ29lZjsKKworICBmb3IgKGcgPSAwOyBnIDwgcEluc3QtPm5EcmNDaGFubmVsR3JvdXBzOyBnKyspIHsKKyAgICBpZiAoaEdhaW5EZWMtPmFjdGl2ZURyY1toR2FpbkRlYy0+bkFjdGl2ZURyY3NdLmJhbmRDb3VudEZvckNoYW5uZWxHcm91cFtnXSA+CisgICAgICAgIDEpIHsKKyAgICAgIGlmIChoR2FpbkRlYy0+bXVsdGlCYW5kQWN0aXZlRHJjSW5kZXggIT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgICAgIH0KKyAgICAgIGlzTXVsdGliYW5kID0gMTsKKyAgICB9CisgIH0KKworICBpZiAoaXNNdWx0aWJhbmQpIHsKKyAgICAvKiBLZWVwIGFjdGl2ZURyYyBpbmRleCBvZiBtdWx0aWJhbmQgRFJDIHNldCAqLworICAgIGhHYWluRGVjLT5tdWx0aUJhbmRBY3RpdmVEcmNJbmRleCA9IGhHYWluRGVjLT5uQWN0aXZlRHJjczsKKyAgfQorCisgIGlmICgoaEdhaW5EZWMtPmNoYW5uZWxHYWluQWN0aXZlRHJjSW5kZXggPT0gLTEpICYmCisgICAgICAoZG93bm1peElkU2VsZWN0ZWQgPT0gRE9XTk1JWF9JRF9CQVNFX0xBWU9VVCkgJiYKKyAgICAgIChoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudCA+CisgICAgICAgMCkpIHsgLyogdXNlIHRoaXMgYWN0aXZlRHJjIHRvIGFwcGx5IGNoYW5uZWxHYWlucyAqLworICAgIGhHYWluRGVjLT5jaGFubmVsR2FpbkFjdGl2ZURyY0luZGV4ID0gaEdhaW5EZWMtPm5BY3RpdmVEcmNzOworICB9CisKKyAgaEdhaW5EZWMtPm5BY3RpdmVEcmNzKys7CisgIGlmIChoR2FpbkRlYy0+bkFjdGl2ZURyY3MgPiBNQVhfQUNUSVZFX0RSQ1MpIHJldHVybiBERV9OT1RfT0s7CisKKyAgcmV0dXJuIERFX09LOworfQorCitEUkNfRVJST1IKK2luaXRBY3RpdmVEcmNPZmZzZXQoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMpIHsKKyAgaW50IGEsIGFjY0dhaW5FbGVtZW50Q291bnQ7CisKKyAgYWNjR2FpbkVsZW1lbnRDb3VudCA9IDA7CisgIGZvciAoYSA9IDA7IGEgPCBoR2FpbkRlYy0+bkFjdGl2ZURyY3M7IGErKykgeworICAgIGhHYWluRGVjLT5hY3RpdmVEcmNbYV0uYWN0aXZlRHJjT2Zmc2V0ID0gYWNjR2FpbkVsZW1lbnRDb3VudDsKKyAgICBhY2NHYWluRWxlbWVudENvdW50ICs9IGhHYWluRGVjLT5hY3RpdmVEcmNbYV0uZ2FpbkVsZW1lbnRDb3VudDsKKyAgfQorCisgIGlmIChhY2NHYWluRWxlbWVudENvdW50ID4gMTIpIHJldHVybiBERV9OT1RfT0s7CisKKyAgcmV0dXJuIERFX09LOworfQpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX2luaXQuaCBiL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19pbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxNWJjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19pbml0LmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBEUkNHQUlOREVDX0lOSVRfSAorI2RlZmluZSBEUkNHQUlOREVDX0lOSVRfSAorCitEUkNfRVJST1IKK2luaXRHYWluRGVjKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLCBjb25zdCBpbnQgZnJhbWVTaXplLAorICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZVJhdGUpOworCit2b2lkIGluaXREcmNHYWluQnVmZmVycyhjb25zdCBpbnQgZnJhbWVTaXplLCBEUkNfR0FJTl9CVUZGRVJTKiBkcmNHYWluQnVmZmVycyk7CisKK0RSQ19FUlJPUgoraW5pdEFjdGl2ZURyYyhIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywKKyAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsIGNvbnN0IGludCBkcmNTZXRJZFNlbGVjdGVkLAorICAgICAgICAgICAgICBjb25zdCBpbnQgZG93bm1peElkU2VsZWN0ZWQpOworCitEUkNfRVJST1IKK2luaXRBY3RpdmVEcmNPZmZzZXQoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19wcmVwcm9jZXNzLmNwcCBiL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19wcmVwcm9jZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE5NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX3ByZXByb2Nlc3MuY3BwCkBAIC0wLDAgKzEsNzE0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkcmNEZWNfdHlwZXMuaCIKKyNpbmNsdWRlICJkcmNEZWNfZ2FpbkRlY29kZXIuaCIKKyNpbmNsdWRlICJkcmNHYWluRGVjX3ByZXByb2Nlc3MuaCIKKyNpbmNsdWRlICJkcmNEZWNfdG9vbHMuaCIKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisjaW5jbHVkZSAiZHJjRGVjX3JvbS5oIgorCisjZGVmaW5lIFNMT1BFX0ZBQ1RPUl9EQl9UT19MSU5FQVIgXAorICBGTDJGWENPTlNUX0RCTCgwLjExNTFmICogKGZsb2F0KSgxIDw8IDMpKSAvKiBsbigxMCkgLyAyMCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBkcmNTZXRFZmZlY3Q7CisgIERVQ0tJTkdfTU9ESUZJQ0FUSU9OKiBwRE1vZDsKKyAgR0FJTl9NT0RJRklDQVRJT04qIHBHTW9kOworICBpbnQgZHJjQ2hhcmFjdGVyaXN0aWNQcmVzZW50OworICBDSEFSQUNURVJJU1RJQ19GT1JNQVQgY2hhcmFjdGVyaXN0aWNGb3JtYXRTb3VyY2VbMl07CisgIGNvbnN0IENVU1RPTV9EUkNfQ0hBUiogcENDaGFyU291cmNlWzJdOworICBDSEFSQUNURVJJU1RJQ19GT1JNQVQgY2hhcmFjdGVyaXN0aWNGb3JtYXRUYXJnZXRbMl07CisgIGNvbnN0IENVU1RPTV9EUkNfQ0hBUiogcENDaGFyVGFyZ2V0WzJdOworICBpbnQgc2xvcGVJc05lZ2F0aXZlOworICBpbnQgbGltaXRlclBlYWtUYXJnZXRQcmVzZW50OworICBGSVhQX1NHTCBsaW1pdGVyUGVha1RhcmdldDsKKyAgRklYUF9EQkwgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiOworICBGSVhQX1NHTCBjb21wcmVzczsKKyAgRklYUF9TR0wgYm9vc3Q7Cit9IE5PREVfTU9ESUZJQ0FUSU9OOworCitzdGF0aWMgRFJDX0VSUk9SIF9nZXRDaWNwQ2hhcmFjdGVyaXN0aWMoCisgICAgY29uc3QgaW50IGNpY3BDaGFyYWN0ZXJpc3RpYywKKyAgICBDSEFSQUNURVJJU1RJQ19GT1JNQVQgcENoYXJhY3RlcmlzdGljRm9ybWF0WzJdLAorICAgIGNvbnN0IENVU1RPTV9EUkNfQ0hBUiogcENDaGFyU291cmNlWzJdKSB7CisgIGlmICgoY2ljcENoYXJhY3RlcmlzdGljIDwgMSkgfHwgKGNpY3BDaGFyYWN0ZXJpc3RpYyA+IDExKSkgeworICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKworICBpZiAoY2ljcENoYXJhY3RlcmlzdGljIDwgNykgeyAvKiBzaWdtb2lkIGNoYXJhY3RlcmlzdGljICovCisgICAgcENoYXJhY3RlcmlzdGljRm9ybWF0W0NTX0xFRlRdID0gQ0ZfU0lHTU9JRDsKKyAgICBwQ0NoYXJTb3VyY2VbQ1NfTEVGVF0gPQorICAgICAgICAoY29uc3QgQ1VTVE9NX0RSQ19DSEFSKikoJmNpY3BEcmNDaGFyU2lnbW9pZExlZnRbY2ljcENoYXJhY3RlcmlzdGljIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdKTsKKyAgICBwQ2hhcmFjdGVyaXN0aWNGb3JtYXRbQ1NfUklHSFRdID0gQ0ZfU0lHTU9JRDsKKyAgICBwQ0NoYXJTb3VyY2VbQ1NfUklHSFRdID0KKyAgICAgICAgKGNvbnN0IENVU1RPTV9EUkNfQ0hBUiopKCZjaWNwRHJjQ2hhclNpZ21vaWRSaWdodFtjaWNwQ2hhcmFjdGVyaXN0aWMgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdKTsKKyAgfSBlbHNlIHsgLyogbm9kZXMgY2hhcmFjdGVyaXN0aWMgKi8KKyAgICBwQ2hhcmFjdGVyaXN0aWNGb3JtYXRbQ1NfTEVGVF0gPSBDRl9OT0RFUzsKKyAgICBwQ0NoYXJTb3VyY2VbQ1NfTEVGVF0gPQorICAgICAgICAoY29uc3QgQ1VTVE9NX0RSQ19DSEFSKikoJmNpY3BEcmNDaGFyTm9kZXNMZWZ0W2NpY3BDaGFyYWN0ZXJpc3RpYyAtIDddKTsKKyAgICBwQ2hhcmFjdGVyaXN0aWNGb3JtYXRbQ1NfUklHSFRdID0gQ0ZfTk9ERVM7CisgICAgcENDaGFyU291cmNlW0NTX1JJR0hUXSA9CisgICAgICAgIChjb25zdCBDVVNUT01fRFJDX0NIQVIqKSgmY2ljcERyY0NoYXJOb2Rlc1JpZ2h0W2NpY3BDaGFyYWN0ZXJpc3RpYyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDddKTsKKyAgfQorICByZXR1cm4gREVfT0s7Cit9CisKK3N0YXRpYyBpbnQgX2dldFNpZ24oRklYUF9TR0wgaW4pIHsKKyAgaWYgKGluID4gKEZJWFBfREJMKTApIHJldHVybiAxOworICBpZiAoaW4gPCAoRklYUF9EQkwpMCkgcmV0dXJuIC0xOworICByZXR1cm4gMDsKK30KKworc3RhdGljIERSQ19FUlJPUiBfZ2V0U2xvcGVTaWduKGNvbnN0IENIQVJBQ1RFUklTVElDX0ZPUk1BVCBkcmNDaGFyRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENVU1RPTV9EUkNfQ0hBUiogcENDaGFyLCBpbnQqIHBTbG9wZVNpZ24pIHsKKyAgaWYgKGRyY0NoYXJGb3JtYXQgPT0gQ0ZfU0lHTU9JRCkgeworICAgICpwU2xvcGVTaWduID0gKHBDQ2hhci0+c2lnbW9pZC5mbGlwU2lnbiA/IDEgOiAtMSk7CisgIH0gZWxzZSB7CisgICAgaW50IGssIHNsb3BlU2lnbiA9IDAsIHRtcF9zbG9wZVNpZ247CisgICAgZm9yIChrID0gMDsgayA8IHBDQ2hhci0+bm9kZXMuY2hhcmFjdGVyaXN0aWNOb2RlQ291bnQ7IGsrKykgeworICAgICAgaWYgKHBDQ2hhci0+bm9kZXMubm9kZUxldmVsW2sgKyAxXSA+IHBDQ2hhci0+bm9kZXMubm9kZUxldmVsW2tdKSB7CisgICAgICAgIHRtcF9zbG9wZVNpZ24gPQorICAgICAgICAgICAgX2dldFNpZ24ocENDaGFyLT5ub2Rlcy5ub2RlR2FpbltrICsgMV0gLSBwQ0NoYXItPm5vZGVzLm5vZGVHYWluW2tdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRtcF9zbG9wZVNpZ24gPSAtX2dldFNpZ24ocENDaGFyLT5ub2Rlcy5ub2RlR2FpbltrICsgMV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDQ2hhci0+bm9kZXMubm9kZUdhaW5ba10pOworICAgICAgfQorICAgICAgaWYgKChzbG9wZVNpZ24gfHwgdG1wX3Nsb3BlU2lnbikgJiYgKHNsb3BlU2lnbiA9PSAtdG1wX3Nsb3BlU2lnbikpCisgICAgICAgIHJldHVybiBERV9OT1RfT0s7IC8qIERSQyBjaGFyYWN0ZXJpc3RpYyBpcyBub3QgaW52ZXJ0aWJsZSAqLworICAgICAgZWxzZQorICAgICAgICBzbG9wZVNpZ24gPSB0bXBfc2xvcGVTaWduOworICAgIH0KKyAgICAqcFNsb3BlU2lnbiA9IHNsb3BlU2lnbjsKKyAgfQorICByZXR1cm4gREVfT0s7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX2lzU2xvcGVOZWdhdGl2ZShjb25zdCBDSEFSQUNURVJJU1RJQ19GT1JNQVQgZHJjQ2hhckZvcm1hdFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDVVNUT01fRFJDX0NIQVIqIHBDQ2hhclsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBTbG9wZUlzTmVnYXRpdmUpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBpbnQgc2xvcGVTaWduWzJdID0gezAsIDB9OworCisgIGVyciA9IF9nZXRTbG9wZVNpZ24oZHJjQ2hhckZvcm1hdFtDU19MRUZUXSwgcENDaGFyW0NTX0xFRlRdLAorICAgICAgICAgICAgICAgICAgICAgICZzbG9wZVNpZ25bQ1NfTEVGVF0pOworICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgIGVyciA9IF9nZXRTbG9wZVNpZ24oZHJjQ2hhckZvcm1hdFtDU19SSUdIVF0sIHBDQ2hhcltDU19SSUdIVF0sCisgICAgICAgICAgICAgICAgICAgICAgJnNsb3BlU2lnbltDU19SSUdIVF0pOworICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgIGlmICgoc2xvcGVTaWduW0NTX0xFRlRdIHx8IHNsb3BlU2lnbltDU19SSUdIVF0pICYmCisgICAgICAoc2xvcGVTaWduW0NTX0xFRlRdID09IC1zbG9wZVNpZ25bQ1NfUklHSFRdKSkKKyAgICByZXR1cm4gREVfTk9UX09LOyAvKiBEUkMgY2hhcmFjdGVyaXN0aWMgaXMgbm90IGludmVydGlibGUgKi8KKworICAqcFNsb3BlSXNOZWdhdGl2ZSA9IChzbG9wZVNpZ25bQ1NfTEVGVF0gPCAwKTsKKyAgcmV0dXJuIERFX09LOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9wcmVwYXJlRHJjQ2hhcmFjdGVyaXN0aWMoY29uc3QgRFJDX0NIQVJBQ1RFUklTVElDKiBwRENoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKiBwQ29lZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT0RFX01PRElGSUNBVElPTiogcE5vZGVNb2QpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBwTm9kZU1vZC0+ZHJjQ2hhcmFjdGVyaXN0aWNQcmVzZW50ID0gcERDaGFyLT5wcmVzZW50OworICBpZiAocE5vZGVNb2QtPmRyY0NoYXJhY3RlcmlzdGljUHJlc2VudCkgeworICAgIGlmIChwRENoYXItPmlzQ0lDUCA9PSAxKSB7CisgICAgICBlcnIgPSBfZ2V0Q2ljcENoYXJhY3RlcmlzdGljKHBEQ2hhci0+Y2ljcEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZU1vZC0+Y2hhcmFjdGVyaXN0aWNGb3JtYXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlTW9kLT5wQ0NoYXJTb3VyY2UpOworICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICB9IGVsc2UgeworICAgICAgcE5vZGVNb2QtPmNoYXJhY3RlcmlzdGljRm9ybWF0U291cmNlW0NTX0xFRlRdID0KKyAgICAgICAgICAoQ0hBUkFDVEVSSVNUSUNfRk9STUFUKQorICAgICAgICAgICAgICBwQ29lZi0+Y2hhcmFjdGVyaXN0aWNMZWZ0Rm9ybWF0W3BEQ2hhci0+Y3VzdG9tLmxlZnRdOworICAgICAgcE5vZGVNb2QtPnBDQ2hhclNvdXJjZVtDU19MRUZUXSA9CisgICAgICAgICAgJihwQ29lZi0+Y3VzdG9tQ2hhcmFjdGVyaXN0aWNMZWZ0W3BEQ2hhci0+Y3VzdG9tLmxlZnRdKTsKKyAgICAgIHBOb2RlTW9kLT5jaGFyYWN0ZXJpc3RpY0Zvcm1hdFNvdXJjZVtDU19SSUdIVF0gPQorICAgICAgICAgIChDSEFSQUNURVJJU1RJQ19GT1JNQVQpCisgICAgICAgICAgICAgIHBDb2VmLT5jaGFyYWN0ZXJpc3RpY1JpZ2h0Rm9ybWF0W3BEQ2hhci0+Y3VzdG9tLnJpZ2h0XTsKKyAgICAgIHBOb2RlTW9kLT5wQ0NoYXJTb3VyY2VbQ1NfUklHSFRdID0KKyAgICAgICAgICAmKHBDb2VmLT5jdXN0b21DaGFyYWN0ZXJpc3RpY1JpZ2h0W3BEQ2hhci0+Y3VzdG9tLnJpZ2h0XSk7CisgICAgfQorICAgIGVyciA9IF9pc1Nsb3BlTmVnYXRpdmUocE5vZGVNb2QtPmNoYXJhY3RlcmlzdGljRm9ybWF0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGVNb2QtPnBDQ2hhclNvdXJjZSwgJnBOb2RlTW9kLT5zbG9wZUlzTmVnYXRpdmUpOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisKKyAgICBpZiAocE5vZGVNb2QtPnBHTW9kICE9IE5VTEwpIHsKKyAgICAgIGlmIChwTm9kZU1vZC0+cEdNb2RbYl0udGFyZ2V0Q2hhcmFjdGVyaXN0aWNMZWZ0UHJlc2VudCkgeworICAgICAgICBwTm9kZU1vZC0+Y2hhcmFjdGVyaXN0aWNGb3JtYXRUYXJnZXRbQ1NfTEVGVF0gPQorICAgICAgICAgICAgKENIQVJBQ1RFUklTVElDX0ZPUk1BVClwQ29lZi0+Y2hhcmFjdGVyaXN0aWNMZWZ0Rm9ybWF0CisgICAgICAgICAgICAgICAgW3BOb2RlTW9kLT5wR01vZFtiXS50YXJnZXRDaGFyYWN0ZXJpc3RpY0xlZnRJbmRleF07CisgICAgICAgIHBOb2RlTW9kLT5wQ0NoYXJUYXJnZXRbQ1NfTEVGVF0gPQorICAgICAgICAgICAgJihwQ29lZi0+Y3VzdG9tQ2hhcmFjdGVyaXN0aWNMZWZ0CisgICAgICAgICAgICAgICAgICBbcE5vZGVNb2QtPnBHTW9kW2JdLnRhcmdldENoYXJhY3RlcmlzdGljTGVmdEluZGV4XSk7CisgICAgICB9CisgICAgICBpZiAocE5vZGVNb2QtPnBHTW9kW2JdLnRhcmdldENoYXJhY3RlcmlzdGljUmlnaHRQcmVzZW50KSB7CisgICAgICAgIHBOb2RlTW9kLT5jaGFyYWN0ZXJpc3RpY0Zvcm1hdFRhcmdldFtDU19SSUdIVF0gPQorICAgICAgICAgICAgKENIQVJBQ1RFUklTVElDX0ZPUk1BVClwQ29lZi0+Y2hhcmFjdGVyaXN0aWNSaWdodEZvcm1hdAorICAgICAgICAgICAgICAgIFtwTm9kZU1vZC0+cEdNb2RbYl0udGFyZ2V0Q2hhcmFjdGVyaXN0aWNSaWdodEluZGV4XTsKKyAgICAgICAgcE5vZGVNb2QtPnBDQ2hhclRhcmdldFtDU19SSUdIVF0gPQorICAgICAgICAgICAgJihwQ29lZi0+Y3VzdG9tQ2hhcmFjdGVyaXN0aWNSaWdodAorICAgICAgICAgICAgICAgICAgW3BOb2RlTW9kLT5wR01vZFtiXS50YXJnZXRDaGFyYWN0ZXJpc3RpY1JpZ2h0SW5kZXhdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIERFX09LOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9jb21wcmVzc29ySU9fc2lnbW9pZF9jb21tb24oCisgICAgY29uc3QgRklYUF9EQkwgdG1wLCAgICAgICAgICAgICAgIC8qIGUgPSA3ICovCisgICAgY29uc3QgRklYUF9EQkwgZ2FpbkRiTGltaXQsICAgICAgIC8qIGUgPSA2ICovCisgICAgY29uc3QgRklYUF9EQkwgZXhwLCAgICAgICAgICAgICAgIC8qIGUgPSA1ICovCisgICAgY29uc3QgaW50IGludmVyc2UsIEZJWFBfREJMKiBvdXQpIC8qIGUgPSA3ICovCit7CisgIEZJWFBfREJMIHgsIHRtcDEsIHRtcDIsIGludkV4cCwgZGVub207CisgIGludCBlX3gsIGVfdG1wMSwgZV90bXAyLCBlX2ludkV4cCwgZV9kZW5vbSwgZV9vdXQ7CisKKyAgaWYgKGV4cCA8IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgNSkpKSB7CisgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgfQorCisgIC8qIHggPSB0bXAgLyBnYWluRGJMaW1pdDsgKi8KKyAgeCA9IGZEaXZOb3JtU2lnbmVkKHRtcCwgZ2FpbkRiTGltaXQsICZlX3gpOworICBlX3ggKz0gNyAtIDY7CisgIGlmICh4IDwgKEZJWFBfREJMKTApIHsKKyAgICByZXR1cm4gREVfTk9UX09LOworICB9CisKKyAgLyogb3V0ID0gdG1wIC8gcG93KDEuMGYgKy8tIHBvdyh4LCBleHApLCAxLjBmL2V4cCk7ICovCisgIHRtcDEgPSBmUG93KHgsIGVfeCwgZXhwLCA1LCAmZV90bXAxKTsKKyAgaWYgKGludmVyc2UpIHRtcDEgPSAtdG1wMTsKKyAgdG1wMiA9IGZBZGROb3JtKEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgMSkpLCAxLCB0bXAxLCBlX3RtcDEsCisgICAgICAgICAgICAgICAgICAmZV90bXAyKTsKKyAgaW52RXhwID0gZkRpdk5vcm0oRkwyRlhDT05TVF9EQkwoMS4wZiAvIChmbG9hdCkoMSA8PCAxKSksIGV4cCwgJmVfaW52RXhwKTsKKyAgZV9pbnZFeHAgKz0gMSAtIDU7CisgIGRlbm9tID0gZlBvdyh0bXAyLCBlX3RtcDIsIGludkV4cCwgZV9pbnZFeHAsICZlX2Rlbm9tKTsKKyAgKm91dCA9IGZEaXZOb3JtU2lnbmVkKHRtcCwgZGVub20sICZlX291dCk7CisgIGVfb3V0ICs9IDcgLSBlX2Rlbm9tOworICAqb3V0ID0gc2NhbGVWYWx1ZVNhdHVyYXRlKCpvdXQsIGVfb3V0IC0gNyk7CisgIHJldHVybiBERV9PSzsKK30KKworc3RhdGljIERSQ19FUlJPUiBfY29tcHJlc3NvcklPX3NpZ21vaWQoY29uc3QgQ1VTVE9NX0RSQ19DSEFSX1NJR01PSUQqIHBDQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGluTGV2ZWxEYiwgLyogZSA9IDcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBvdXRHYWluRGIpICAgICAgLyogZSA9IDcgKi8KK3sKKyAgRklYUF9EQkwgdG1wOworICBGSVhQX1NHTCBleHAgPSBwQ0NoYXItPmV4cDsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworCisgIHRtcCA9IGZNdWx0RGl2MihEUkNfSU5QVVRfTE9VRE5FU1NfVEFSR0VUIC0gaW5MZXZlbERiLCBwQ0NoYXItPmlvUmF0aW8pOworICB0bXAgPSBTQVRVUkFURV9MRUZUX1NISUZUKHRtcCwgMiArIDEsIERGUkFDVF9CSVRTKTsKKyAgaWYgKGV4cCA8IChGSVhQX1NHTClNQVhWQUxfU0dMKSB7CisgICAgLyogeCA9IHRtcCAvIGdhaW5EYkxpbWl0OyAqLworICAgIC8qICpvdXRHYWluRGIgPSB0bXAgLyBwb3coMS4wZiArIHBvdyh4LCBleHApLCAxLjBmL2V4cCk7ICovCisgICAgZXJyID0gX2NvbXByZXNzb3JJT19zaWdtb2lkX2NvbW1vbih0bXAsIEZYX1NHTDJGWF9EQkwocENDaGFyLT5nYWluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NHTDJGWF9EQkwoZXhwKSwgMCwgb3V0R2FpbkRiKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICB9IGVsc2UgeworICAgICpvdXRHYWluRGIgPQorICAgICAgICB0bXA7IC8qIHNjYWxpbmcgb2Ygb3V0R2FpbkRiICg3KSBpcyBlcXVhbCB0byBzY2FsaW5nIG9mIHRtcCAoNykgKi8KKyAgfQorICBpZiAocENDaGFyLT5mbGlwU2lnbiA9PSAxKSB7CisgICAgKm91dEdhaW5EYiA9IC0qb3V0R2FpbkRiOworICB9CisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX2NvbXByZXNzb3JJT19zaWdtb2lkX2ludmVyc2UoCisgICAgY29uc3QgQ1VTVE9NX0RSQ19DSEFSX1NJR01PSUQqIHBDQ2hhciwgY29uc3QgRklYUF9TR0wgZ2FpbkRiLAorICAgIEZJWFBfREJMKiBpbkxldikgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIEZJWFBfU0dMIGlvUmF0aW8gPSBwQ0NoYXItPmlvUmF0aW87CisgIEZJWFBfU0dMIGV4cCA9IHBDQ2hhci0+ZXhwOworICBGSVhQX0RCTCB0bXAgPSBGWF9TR0wyRlhfREJMKGdhaW5EYiksIHRtcF9vdXQ7CisgIGludCBlX291dDsKKworICBpZiAocENDaGFyLT5mbGlwU2lnbiA9PSAxKSB7CisgICAgdG1wID0gLXRtcDsKKyAgfQorICBpZiAoZXhwIDwgKEZJWFBfU0dMKU1BWFZBTF9TR0wpIHsKKyAgICAvKiB4ID0gdG1wIC8gZ2FpbkRiTGltaXQ7ICovCisgICAgLyogdG1wID0gdG1wIC8gcG93KDEuMGYgLSBwb3coeCwgZXhwKSwgMS4wZiAvIGV4cCk7ICovCisgICAgZXJyID0gX2NvbXByZXNzb3JJT19zaWdtb2lkX2NvbW1vbih0bXAsIEZYX1NHTDJGWF9EQkwocENDaGFyLT5nYWluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NHTDJGWF9EQkwoZXhwKSwgMSwgJnRtcCk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoaW9SYXRpbyA9PSAoRklYUF9TR0wpMCkgeworICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKyAgdG1wX291dCA9IGZEaXZOb3JtU2lnbmVkKHRtcCwgRlhfU0dMMkZYX0RCTChpb1JhdGlvKSwgJmVfb3V0KTsKKyAgZV9vdXQgKz0gNyAtIDI7CisgIHRtcF9vdXQgPSBmQWRkTm9ybShEUkNfSU5QVVRfTE9VRE5FU1NfVEFSR0VULCA3LCAtdG1wX291dCwgZV9vdXQsICZlX291dCk7CisgICppbkxldiA9IHNjYWxlVmFsdWVTYXR1cmF0ZSh0bXBfb3V0LCBlX291dCAtIDcpOworCisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX2NvbXByZXNzb3JJT19ub2Rlcyhjb25zdCBDVVNUT01fRFJDX0NIQVJfTk9ERVMqIHBDQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBpbkxldmVsRGIsIC8qIGUgPSA3ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIG91dEdhaW5EYikgICAgICAvKiBlID0gNyAqLworeworICBpbnQgbjsKKyAgRklYUF9EQkwgdzsKKyAgY29uc3QgRklYUF9TR0wqIG5vZGVMZXZlbCA9IHBDQ2hhci0+bm9kZUxldmVsOworICBjb25zdCBGSVhQX1NHTCogbm9kZUdhaW4gPSBwQ0NoYXItPm5vZGVHYWluOworCisgIGlmIChpbkxldmVsRGIgPCBEUkNfSU5QVVRfTE9VRE5FU1NfVEFSR0VUKSB7CisgICAgZm9yIChuID0gMDsgbiA8IHBDQ2hhci0+Y2hhcmFjdGVyaXN0aWNOb2RlQ291bnQ7IG4rKykgeworICAgICAgaWYgKChpbkxldmVsRGIgPD0gRlhfU0dMMkZYX0RCTChub2RlTGV2ZWxbbl0pKSAmJgorICAgICAgICAgIChpbkxldmVsRGIgPiBGWF9TR0wyRlhfREJMKG5vZGVMZXZlbFtuICsgMV0pKSkgeworICAgICAgICB3ID0gZkRpdk5vcm0oaW5MZXZlbERiIC0gRlhfU0dMMkZYX0RCTChub2RlTGV2ZWxbbiArIDFdKSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW25dIC0gbm9kZUxldmVsW24gKyAxXSkpOworICAgICAgICAqb3V0R2FpbkRiID0gZk11bHQodywgbm9kZUdhaW5bbl0pICsKKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0KChGSVhQX0RCTClNQVhWQUxfREJMIC0gdywgbm9kZUdhaW5bbiArIDFdKTsKKyAgICAgICAgLyogKm91dEdhaW5EYiA9ICh3ICogbm9kZUdhaW5bbl0gKyAoMS4wLXcpICogbm9kZUdhaW5bbisxXSk7ICovCisgICAgICAgIHJldHVybiBERV9PSzsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChuID0gMDsgbiA8IHBDQ2hhci0+Y2hhcmFjdGVyaXN0aWNOb2RlQ291bnQ7IG4rKykgeworICAgICAgaWYgKChpbkxldmVsRGIgPj0gRlhfU0dMMkZYX0RCTChub2RlTGV2ZWxbbl0pKSAmJgorICAgICAgICAgIChpbkxldmVsRGIgPCBGWF9TR0wyRlhfREJMKG5vZGVMZXZlbFtuICsgMV0pKSkgeworICAgICAgICB3ID0gZkRpdk5vcm0oRlhfU0dMMkZYX0RCTChub2RlTGV2ZWxbbiArIDFdKSAtIGluTGV2ZWxEYiwKKyAgICAgICAgICAgICAgICAgICAgIEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW24gKyAxXSAtIG5vZGVMZXZlbFtuXSkpOworICAgICAgICAqb3V0R2FpbkRiID0gZk11bHQodywgbm9kZUdhaW5bbl0pICsKKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0KChGSVhQX0RCTClNQVhWQUxfREJMIC0gdywgbm9kZUdhaW5bbiArIDFdKTsKKyAgICAgICAgLyogKm91dEdhaW5EYiA9ICh3ICogbm9kZUdhaW5bbl0gKyAoMS4wLXcpICogbm9kZUdhaW5bbisxXSk7ICovCisgICAgICAgIHJldHVybiBERV9PSzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgKm91dEdhaW5EYiA9IEZYX1NHTDJGWF9EQkwobm9kZUdhaW5bcENDaGFyLT5jaGFyYWN0ZXJpc3RpY05vZGVDb3VudF0pOworICByZXR1cm4gREVfT0s7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX2NvbXByZXNzb3JJT19ub2Rlc19pbnZlcnNlKAorICAgIGNvbnN0IENVU1RPTV9EUkNfQ0hBUl9OT0RFUyogcENDaGFyLCBjb25zdCBGSVhQX1NHTCBnYWluRGIsIC8qIGUgPSA3ICovCisgICAgRklYUF9EQkwqIGluTGV2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZSA9IDcgKi8KK3sKKyAgaW50IG47CisgIGludCBrOworICBGSVhQX0RCTCB3OworICBpbnQgZ2FpbklzTmVnYXRpdmUgPSAwOworICBjb25zdCBGSVhQX1NHTCogbm9kZUxldmVsID0gcENDaGFyLT5ub2RlTGV2ZWw7CisgIGNvbnN0IEZJWFBfU0dMKiBub2RlR2FpbiA9IHBDQ2hhci0+bm9kZUdhaW47CisgIGludCBub2RlQ291bnQgPSBwQ0NoYXItPmNoYXJhY3RlcmlzdGljTm9kZUNvdW50OworICBmb3IgKGsgPSAwOyBrIDwgbm9kZUNvdW50OyBrKyspIHsKKyAgICBpZiAocENDaGFyLT5ub2RlR2FpbltrICsgMV0gPCAoRklYUF9TR0wpMCkgeworICAgICAgZ2FpbklzTmVnYXRpdmUgPSAxOworICAgIH0KKyAgfQorICBpZiAoZ2FpbklzTmVnYXRpdmUgPT0gMSkgeworICAgIGlmIChnYWluRGIgPD0gbm9kZUdhaW5bbm9kZUNvdW50XSkgeworICAgICAgKmluTGV2ID0gRlhfU0dMMkZYX0RCTChub2RlTGV2ZWxbbm9kZUNvdW50XSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChnYWluRGIgPj0gKEZJWFBfU0dMKTApIHsKKyAgICAgICAgKmluTGV2ID0gRFJDX0lOUFVUX0xPVURORVNTX1RBUkdFVDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBub2RlQ291bnQ7IG4rKykgeworICAgICAgICAgIGlmICgoZ2FpbkRiIDw9IG5vZGVHYWluW25dKSAmJiAoZ2FpbkRiID4gbm9kZUdhaW5bbiArIDFdKSkgeworICAgICAgICAgICAgRklYUF9TR0wgZ2FpbkRlbHRhID0gbm9kZUdhaW5bbl0gLSBub2RlR2FpbltuICsgMV07CisgICAgICAgICAgICBpZiAoZ2FpbkRlbHRhID09IChGSVhQX1NHTCkwKSB7CisgICAgICAgICAgICAgICppbkxldiA9IEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW25dKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERFX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdyA9IGZEaXZOb3JtKGdhaW5EYiAtIG5vZGVHYWluW24gKyAxXSwgZ2FpbkRlbHRhKTsKKyAgICAgICAgICAgICppbkxldiA9IGZNdWx0KHcsIG5vZGVMZXZlbFtuXSkgKworICAgICAgICAgICAgICAgICAgICAgZk11bHQoKEZJWFBfREJMKU1BWFZBTF9EQkwgLSB3LCBub2RlTGV2ZWxbbiArIDFdKTsKKyAgICAgICAgICAgIC8qICppbkxldiA9ICh3ICogbm9kZUxldmVsW25dICsgKDEuMC13KSAqIG5vZGVMZXZlbFtuKzFdKTsgKi8KKyAgICAgICAgICAgIHJldHVybiBERV9PSzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKmluTGV2ID0gRlhfU0dMMkZYX0RCTChub2RlTGV2ZWxbbm9kZUNvdW50XSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnYWluRGIgPj0gbm9kZUdhaW5bbm9kZUNvdW50XSkgeworICAgICAgKmluTGV2ID0gRlhfU0dMMkZYX0RCTChub2RlTGV2ZWxbbm9kZUNvdW50XSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChnYWluRGIgPD0gKEZJWFBfU0dMKTApIHsKKyAgICAgICAgKmluTGV2ID0gRFJDX0lOUFVUX0xPVURORVNTX1RBUkdFVDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBub2RlQ291bnQ7IG4rKykgeworICAgICAgICAgIGlmICgoZ2FpbkRiID49IG5vZGVHYWluW25dKSAmJiAoZ2FpbkRiIDwgbm9kZUdhaW5bbiArIDFdKSkgeworICAgICAgICAgICAgRklYUF9TR0wgZ2FpbkRlbHRhID0gbm9kZUdhaW5bbiArIDFdIC0gbm9kZUdhaW5bbl07CisgICAgICAgICAgICBpZiAoZ2FpbkRlbHRhID09IChGSVhQX1NHTCkwKSB7CisgICAgICAgICAgICAgICppbkxldiA9IEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW25dKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERFX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdyA9IGZEaXZOb3JtKG5vZGVHYWluW24gKyAxXSAtIGdhaW5EYiwgZ2FpbkRlbHRhKTsKKyAgICAgICAgICAgICppbkxldiA9IGZNdWx0KHcsIG5vZGVMZXZlbFtuXSkgKworICAgICAgICAgICAgICAgICAgICAgZk11bHQoKEZJWFBfREJMKU1BWFZBTF9EQkwgLSB3LCBub2RlTGV2ZWxbbiArIDFdKTsKKyAgICAgICAgICAgIC8qICppbkxldiA9ICh3ICogbm9kZUxldmVsW25dICsgKDEuMC13KSAqIG5vZGVMZXZlbFtuKzFdKTsgKi8KKyAgICAgICAgICAgIHJldHVybiBERV9PSzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKmluTGV2ID0gRlhfU0dMMkZYX0RCTChub2RlTGV2ZWxbbm9kZUNvdW50XSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBERV9PSzsKK30KKworc3RhdGljIERSQ19FUlJPUiBfbWFwR2Fpbihjb25zdCBDSEFSQUNURVJJU1RJQ19GT1JNQVQgcENDaGFyRm9ybWF0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDVVNUT01fRFJDX0NIQVIqIHBDQ2hhclNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBUkFDVEVSSVNUSUNfRk9STUFUIHBDQ2hhckZvcm1hdFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1VTVE9NX0RSQ19DSEFSKiBwQ0NoYXJUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGdhaW5JbkRiLCAvKiBlID0gNyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogZ2Fpbk91dERiKSAgICAgLyogZSA9IDcgKi8KK3sKKyAgRklYUF9EQkwgaW5MZXZlbCA9IChGSVhQX0RCTCkwOworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisKKyAgc3dpdGNoIChwQ0NoYXJGb3JtYXRTb3VyY2UpIHsKKyAgICBjYXNlIENGX1NJR01PSUQ6CisgICAgICBlcnIgPSBfY29tcHJlc3NvcklPX3NpZ21vaWRfaW52ZXJzZSgKKyAgICAgICAgICAoY29uc3QgQ1VTVE9NX0RSQ19DSEFSX1NJR01PSUQqKXBDQ2hhclNvdXJjZSwgZ2FpbkluRGIsICZpbkxldmVsKTsKKyAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGX05PREVTOgorICAgICAgZXJyID0gX2NvbXByZXNzb3JJT19ub2Rlc19pbnZlcnNlKAorICAgICAgICAgIChjb25zdCBDVVNUT01fRFJDX0NIQVJfTk9ERVMqKXBDQ2hhclNvdXJjZSwgZ2FpbkluRGIsICZpbkxldmVsKTsKKyAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgfQorICBzd2l0Y2ggKHBDQ2hhckZvcm1hdFRhcmdldCkgeworICAgIGNhc2UgQ0ZfU0lHTU9JRDoKKyAgICAgIGVyciA9IF9jb21wcmVzc29ySU9fc2lnbW9pZCgoY29uc3QgQ1VTVE9NX0RSQ19DSEFSX1NJR01PSUQqKXBDQ2hhclRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkxldmVsLCBnYWluT3V0RGIpOworICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZfTk9ERVM6CisgICAgICBlcnIgPSBfY29tcHJlc3NvcklPX25vZGVzKChjb25zdCBDVVNUT01fRFJDX0NIQVJfTk9ERVMqKXBDQ2hhclRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5MZXZlbCwgZ2Fpbk91dERiKTsKKyAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIERFX09LOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF90b0xpbmVhcigKKyAgICBjb25zdCBOT0RFX01PRElGSUNBVElPTiogbm9kZU1vZCwgY29uc3QgaW50IGRyY0JhbmQsCisgICAgY29uc3QgRklYUF9TR0wgZ2FpbkRiLCAgLyogaW46IGdhaW4gdmFsdWUgaW4gZEIsIGUgPSA3ICovCisgICAgY29uc3QgRklYUF9TR0wgc2xvcGVEYiwgLyogaW46IHNsb3BlIHZhbHVlIGluIGRCL2RlbHRhVG1pbiwgZSA9IDIgKi8KKyAgICBGSVhQX0RCTCogZ2FpbkxpbiwgICAgICAvKiBvdXQ6IGxpbmVhciBnYWluIHZhbHVlLCBlID0gNyAqLworICAgIEZJWFBfREJMKiBzbG9wZUxpbikgICAgIC8qIG91dDogbGluZWFyIHNsb3BlIHZhbHVlLCBlID0gNyAqLworeworICBGSVhQX0RCTCBnYWluUmF0aW9fbSA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgMSkpOworICBHQUlOX01PRElGSUNBVElPTiogcEdNb2QgPSBOVUxMOworICBEVUNLSU5HX01PRElGSUNBVElPTiogcERNb2QgPSBub2RlTW9kLT5wRE1vZDsKKyAgRklYUF9EQkwgdG1wX2RibCwgZ2FpbkRiX21vZGlmaWVkLCBnYWluRGJfb2Zmc2V0LCBnYWluRGJfb3V0LCBnYWluTGluX20sCisgICAgICBzbG9wZUxpbl9tOworICBpbnQgZ2Fpbkxpbl9lLCBnYWluUmF0aW9fZSA9IDEsIGdhaW5EYl9vdXRfZTsKKyAgaWYgKG5vZGVNb2QtPnBHTW9kICE9IE5VTEwpIHsKKyAgICBwR01vZCA9ICYobm9kZU1vZC0+cEdNb2RbZHJjQmFuZF0pOworICB9CisgIGlmICgoKG5vZGVNb2QtPmRyY1NldEVmZmVjdCAmIChFQl9EVUNLX09USEVSIHwgRUJfRFVDS19TRUxGKSkgPT0gMCkgJiYKKyAgICAgIChub2RlTW9kLT5kcmNTZXRFZmZlY3QgIT0gRUJfRkFERSkgJiYKKyAgICAgIChub2RlTW9kLT5kcmNTZXRFZmZlY3QgIT0gRUJfQ0xJUFBJTkcpKSB7CisgICAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICAgIEZJWFBfREJMIGdhaW5EYk1hcHBlZDsKKworICAgIGlmICgocEdNb2QgIT0gTlVMTCkgJiYgKG5vZGVNb2QtPmRyY0NoYXJhY3RlcmlzdGljUHJlc2VudCkpIHsKKyAgICAgIGlmICgoKGdhaW5EYiA+IChGSVhQX1NHTCkwKSAmJiBub2RlTW9kLT5zbG9wZUlzTmVnYXRpdmUpIHx8CisgICAgICAgICAgKChnYWluRGIgPCAoRklYUF9TR0wpMCkgJiYgIW5vZGVNb2QtPnNsb3BlSXNOZWdhdGl2ZSkpIHsKKyAgICAgICAgLyogbGVmdCBzaWRlICovCisgICAgICAgIGlmIChwR01vZC0+dGFyZ2V0Q2hhcmFjdGVyaXN0aWNMZWZ0UHJlc2VudCA9PSAxKSB7CisgICAgICAgICAgZXJyID0gX21hcEdhaW4obm9kZU1vZC0+Y2hhcmFjdGVyaXN0aWNGb3JtYXRTb3VyY2VbQ1NfTEVGVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU1vZC0+cENDaGFyU291cmNlW0NTX0xFRlRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVNb2QtPmNoYXJhY3RlcmlzdGljRm9ybWF0VGFyZ2V0W0NTX0xFRlRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVNb2QtPnBDQ2hhclRhcmdldFtDU19MRUZUXSwgZ2FpbkRiLCAmZ2FpbkRiTWFwcGVkKTsKKyAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgICAgIGdhaW5SYXRpb19tID0gZkRpdk5vcm1TaWduZWQoCisgICAgICAgICAgICAgIGdhaW5EYk1hcHBlZCwgRlhfU0dMMkZYX0RCTChnYWluRGIpLAorICAgICAgICAgICAgICAmZ2FpblJhdGlvX2UpOyAvKiB0YXJnZXQgY2hhcmFjdGVyaXN0aWMgaW4gcGF5bG9hZCAqLworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UgeyAvKiBpZiAoKChnYWluRGIgPCAoRklYUF9TR0wpMCkgJiYgbm9kZU1vZC0+c2xvcGVJc05lZ2F0aXZlKSB8fAorICAgICAgICAgICAgICAgICgoZ2FpbkRiID4gKEZJWFBfU0dMKTApICYmICFub2RlTW9kLT5zbG9wZUlzTmVnYXRpdmUpKSAqLworCisgICAgICAgIC8qIHJpZ2h0IHNpZGUgKi8KKyAgICAgICAgaWYgKHBHTW9kLT50YXJnZXRDaGFyYWN0ZXJpc3RpY1JpZ2h0UHJlc2VudCA9PSAxKSB7CisgICAgICAgICAgZXJyID0KKyAgICAgICAgICAgICAgX21hcEdhaW4obm9kZU1vZC0+Y2hhcmFjdGVyaXN0aWNGb3JtYXRTb3VyY2VbQ1NfUklHSFRdLAorICAgICAgICAgICAgICAgICAgICAgICBub2RlTW9kLT5wQ0NoYXJTb3VyY2VbQ1NfUklHSFRdLAorICAgICAgICAgICAgICAgICAgICAgICBub2RlTW9kLT5jaGFyYWN0ZXJpc3RpY0Zvcm1hdFRhcmdldFtDU19SSUdIVF0sCisgICAgICAgICAgICAgICAgICAgICAgIG5vZGVNb2QtPnBDQ2hhclRhcmdldFtDU19SSUdIVF0sIGdhaW5EYiwgJmdhaW5EYk1hcHBlZCk7CisgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICAgICAgICBnYWluUmF0aW9fbSA9IGZEaXZOb3JtU2lnbmVkKAorICAgICAgICAgICAgICBnYWluRGJNYXBwZWQsIEZYX1NHTDJGWF9EQkwoZ2FpbkRiKSwKKyAgICAgICAgICAgICAgJmdhaW5SYXRpb19lKTsgLyogdGFyZ2V0IGNoYXJhY3RlcmlzdGljIGluIHBheWxvYWQgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoZ2FpbkRiIDwgKEZJWFBfU0dMKTApIHsKKyAgICAgIGdhaW5SYXRpb19tID0gZk11bHREaXYyKGdhaW5SYXRpb19tLCBub2RlTW9kLT5jb21wcmVzcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdhaW5SYXRpb19tID0gZk11bHREaXYyKGdhaW5SYXRpb19tLCBub2RlTW9kLT5ib29zdCk7CisgICAgfQorICAgIGdhaW5SYXRpb19lICs9IDI7CisgIH0KKyAgaWYgKChwR01vZCAhPSBOVUxMKSAmJiAocEdNb2QtPmdhaW5TY2FsaW5nUHJlc2VudCA9PSAxKSkgeworICAgIGlmIChnYWluRGIgPCAoRklYUF9TR0wpMCkgeworICAgICAgZ2FpblJhdGlvX20gPSBmTXVsdERpdjIoZ2FpblJhdGlvX20sIHBHTW9kLT5hdHRlbnVhdGlvblNjYWxpbmcpOworICAgIH0gZWxzZSB7CisgICAgICBnYWluUmF0aW9fbSA9IGZNdWx0RGl2MihnYWluUmF0aW9fbSwgcEdNb2QtPmFtcGxpZmljYXRpb25TY2FsaW5nKTsKKyAgICB9CisgICAgZ2FpblJhdGlvX2UgKz0gMzsKKyAgfQorICBpZiAoKHBETW9kICE9IE5VTEwpICYmCisgICAgICAobm9kZU1vZC0+ZHJjU2V0RWZmZWN0ICYgKEVCX0RVQ0tfT1RIRVIgfCBFQl9EVUNLX1NFTEYpKSAmJgorICAgICAgKHBETW9kLT5kdWNraW5nU2NhbGluZ1ByZXNlbnQgPT0gMSkpIHsKKyAgICBnYWluUmF0aW9fbSA9IGZNdWx0RGl2MihnYWluUmF0aW9fbSwgcERNb2QtPmR1Y2tpbmdTY2FsaW5nKTsKKyAgICBnYWluUmF0aW9fZSArPSAzOworICB9CisKKyAgZ2FpbkRiX21vZGlmaWVkID0KKyAgICAgIGZNdWx0RGl2MihnYWluRGIsIGdhaW5SYXRpb19tKTsgLyogcmVzdWx0aW5nIGU6IDcgKyBnYWluUmF0aW9fZSArIDEqLworICBnYWluRGJfb2Zmc2V0ID0gKEZJWFBfREJMKTA7CisKKyAgaWYgKChwR01vZCAhPSBOVUxMKSAmJiAocEdNb2QtPmdhaW5PZmZzZXRQcmVzZW50ID09IDEpKSB7CisgICAgLyogKmdhaW5MaW4gKj0gKGZsb2F0KXBvdygyLjAsIChkb3VibGUpKHBHTW9kLT5nYWluT2Zmc2V0LzYuMGYpKTsgKi8KKyAgICBnYWluRGJfb2Zmc2V0ICs9IEZYX1NHTDJGWF9EQkwocEdNb2QtPmdhaW5PZmZzZXQpID4+IDQ7IC8qIHJlc3VsdGluZyBlOiA4ICovCisgIH0KKyAgaWYgKChub2RlTW9kLT5saW1pdGVyUGVha1RhcmdldFByZXNlbnQgPT0gMSkgJiYKKyAgICAgIChub2RlTW9kLT5kcmNTZXRFZmZlY3QgPT0KKyAgICAgICBFQl9DTElQUElORykpIHsgLyogVGhlIG9ubHkgZHJjU2V0RWZmZWN0IGlzICJjbGlwcGluZyBwcmV2ZW50aW9uIiAqLworICAgIC8qIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5Nb2RpZmljYXRpb25EYiBpcyBpbmNsdWRlZCBpbgorICAgICAqIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiAqLworICAgIC8qICpnYWluTGluICo9IChmbG9hdClwb3coMi4wLCBtYXgoMC4wLCAtbm9kZU1vZGlmaWNhdGlvbi0+bGltaXRlclBlYWtUYXJnZXQKKyAgICAgKiAtIG5vZGVNb2RpZmljYXRpb24tPmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYikvNi4wKTsgKi8KKyAgICBnYWluRGJfb2Zmc2V0ICs9IGZNYXgoCisgICAgICAgIChGSVhQX0RCTCkwLAorICAgICAgICAoRlhfU0dMMkZYX0RCTCgtbm9kZU1vZC0+bGltaXRlclBlYWtUYXJnZXQpID4+IDMpIC0KKyAgICAgICAgICAgIChub2RlTW9kLT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIgPj4gMSkpOyAvKiByZXN1bHRpbmcgZTogOCAqLworICB9CisgIGlmIChnYWluRGJfb2Zmc2V0ICE9IChGSVhQX0RCTCkwKSB7CisgICAgZ2FpbkRiX291dCA9IGZBZGROb3JtKGdhaW5EYl9tb2RpZmllZCwgNyArIGdhaW5SYXRpb19lICsgMSwgZ2FpbkRiX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgJmdhaW5EYl9vdXRfZSk7CisgIH0gZWxzZSB7CisgICAgZ2FpbkRiX291dCA9IGdhaW5EYl9tb2RpZmllZDsKKyAgICBnYWluRGJfb3V0X2UgPSA3ICsgZ2FpblJhdGlvX2UgKyAxOworICB9CisKKyAgLyogKmdhaW5MaW4gPSAoZmxvYXQpcG93KDIuMCwgKGRvdWJsZSkoZ2FpbkRiX21vZGlmaWVkWzFdIC8gNi4wZikpOyAqLworICBnYWluTGluX20gPSBhcHByb3hEYjJsaW4oZ2FpbkRiX291dCwgZ2FpbkRiX291dF9lLCAmZ2Fpbkxpbl9lKTsKKyAgKmdhaW5MaW4gPSBzY2FsZVZhbHVlU2F0dXJhdGUoZ2Fpbkxpbl9tLCBnYWluTGluX2UgLSA3KTsKKworICAvKiAqc2xvcGVMaW4gPSBTTE9QRV9GQUNUT1JfREJfVE9fTElORUFSICogZ2FpblJhdGlvICogKmdhaW5MaW4gKiBzbG9wZURiOyAqLworICBpZiAoc2xvcGVEYiA9PSAoRklYUF9TR0wpMCkgeworICAgICpzbG9wZUxpbiA9IChGSVhQX0RCTCkwOworICB9IGVsc2UgeworICAgIHRtcF9kYmwgPQorICAgICAgICBmTXVsdChzbG9wZURiLCBTTE9QRV9GQUNUT1JfREJfVE9fTElORUFSKTsgLyogcmVzdWx0aW5nIGU6IDIgLSAzID0gLTEgKi8KKyAgICB0bXBfZGJsID0gZk11bHQodG1wX2RibCwgZ2FpblJhdGlvX20pOyAvKiByZXN1bHRpbmcgZTogLTEgKyBnYWluUmF0aW9fZSAqLworICAgIGlmIChnYWluRGJfb2Zmc2V0ICE9CisgICAgICAgIChGSVhQX0RCTCkwKSB7IC8qIHJlY2FsY3VsYXRlIGdhaW5MaW4gZnJvbSBnYWluRGIgdGhhdCB3YXNuJ3QgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgZ2Fpbk9mZnNldCBhbmQgbGltaXRlclBlYWtUYXJnZXQgKi8KKyAgICAgIGdhaW5MaW5fbSA9IGFwcHJveERiMmxpbihnYWluRGJfbW9kaWZpZWQsIDcgKyBnYWluUmF0aW9fZSwgJmdhaW5MaW5fZSk7CisgICAgfQorICAgIHNsb3BlTGluX20gPSBmTXVsdCh0bXBfZGJsLCBnYWluTGluX20pOworICAgICpzbG9wZUxpbiA9CisgICAgICAgIHNjYWxlVmFsdWVTYXR1cmF0ZShzbG9wZUxpbl9tLCAtMSArIGdhaW5SYXRpb19lICsgZ2Fpbkxpbl9lIC0gNyk7CisgIH0KKworICBpZiAoKG5vZGVNb2QtPmxpbWl0ZXJQZWFrVGFyZ2V0UHJlc2VudCA9PSAxKSAmJgorICAgICAgKG5vZGVNb2QtPmRyY1NldEVmZmVjdCA9PSBFQl9DTElQUElORykpIHsKKyAgICBpZiAoKmdhaW5MaW4gPj0gRkwyRlhDT05TVF9EQkwoMS4wZiAvIChmbG9hdCkoMSA8PCA3KSkpIHsKKyAgICAgICpnYWluTGluID0gRkwyRlhDT05TVF9EQkwoMS4wZiAvIChmbG9hdCkoMSA8PCA3KSk7CisgICAgICAqc2xvcGVMaW4gPSAoRklYUF9EQkwpMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gREVfT0s7Cit9CisKKy8qIHByZXBhcmUgYnVmZmVycyBjb250YWluaW5nIGxpbmVhciBub2RlcyBmb3IgZWFjaCBnYWluIHNlcXVlbmNlICovCitEUkNfRVJST1IKK3ByZXBhcmVEcmNHYWluKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLAorICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfR0FJTiBoVW5pRHJjR2FpbiwgY29uc3QgRklYUF9TR0wgY29tcHJlc3MsCisgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBib29zdCwgY29uc3QgRklYUF9EQkwgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiLAorICAgICAgICAgICAgICAgY29uc3QgaW50IGFjdGl2ZURyY0luZGV4KSB7CisgIGludCBiLCBnLCBnYWluRWxlbWVudEluZGV4OworICBEUkNfR0FJTl9CVUZGRVJTKiBkcmNHYWluQnVmZmVycyA9ICYoaEdhaW5EZWMtPmRyY0dhaW5CdWZmZXJzKTsKKyAgTk9ERV9NT0RJRklDQVRJT04gbm9kZU1vZDsKKyAgRkRLbWVtY2xlYXIoJm5vZGVNb2QsIHNpemVvZihOT0RFX01PRElGSUNBVElPTikpOworICBBQ1RJVkVfRFJDKiBwQWN0aXZlRHJjID0gJihoR2FpbkRlYy0+YWN0aXZlRHJjW2FjdGl2ZURyY0luZGV4XSk7CisgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QgPSBwQWN0aXZlRHJjLT5wSW5zdDsKKyAgaWYgKHBJbnN0ID09IE5VTEwpIHJldHVybiBERV9OT1RfT0s7CisKKyAgbm9kZU1vZC5kcmNTZXRFZmZlY3QgPSBwSW5zdC0+ZHJjU2V0RWZmZWN0OworCisgIG5vZGVNb2QuY29tcHJlc3MgPSBjb21wcmVzczsKKyAgbm9kZU1vZC5ib29zdCA9IGJvb3N0OworICBub2RlTW9kLmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiA9IGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYjsKKyAgbm9kZU1vZC5saW1pdGVyUGVha1RhcmdldFByZXNlbnQgPSBwSW5zdC0+bGltaXRlclBlYWtUYXJnZXRQcmVzZW50OworICBub2RlTW9kLmxpbWl0ZXJQZWFrVGFyZ2V0ID0gcEluc3QtPmxpbWl0ZXJQZWFrVGFyZ2V0OworCisgIGdhaW5FbGVtZW50SW5kZXggPSAwOworICBmb3IgKGcgPSAwOyBnIDwgcEluc3QtPm5EcmNDaGFubmVsR3JvdXBzOyBnKyspIHsKKyAgICBpbnQgZ2FpblNldEluZGV4ID0gMDsKKyAgICBpbnQgbkRyY0JhbmRzID0gMDsKKyAgICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMqIHBDb2VmID0gcEFjdGl2ZURyYy0+cENvZWY7CisgICAgaWYgKHBDb2VmID09IE5VTEwpIHJldHVybiBERV9OT1RfT0s7CisKKyAgICBpZiAoIXBBY3RpdmVEcmMtPmNoYW5uZWxHcm91cElzUGFyYW1ldHJpY0RyY1tnXSkgeworICAgICAgZ2FpblNldEluZGV4ID0gcEluc3QtPmdhaW5TZXRJbmRleEZvckNoYW5uZWxHcm91cFtnXTsKKworICAgICAgaWYgKG5vZGVNb2QuZHJjU2V0RWZmZWN0ICYgKEVCX0RVQ0tfT1RIRVIgfCBFQl9EVUNLX1NFTEYpKSB7CisgICAgICAgIG5vZGVNb2QucERNb2QgPSAmKHBBY3RpdmVEcmMtPmR1Y2tpbmdNb2RpZmljYXRpb25Gb3JDaGFubmVsR3JvdXBbZ10pOworICAgICAgICBub2RlTW9kLnBHTW9kID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5vZGVNb2QucEdNb2QgPSBwSW5zdC0+Z2Fpbk1vZGlmaWNhdGlvbkZvckNoYW5uZWxHcm91cFtnXTsKKyAgICAgICAgbm9kZU1vZC5wRE1vZCA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIG5EcmNCYW5kcyA9IHBBY3RpdmVEcmMtPmJhbmRDb3VudEZvckNoYW5uZWxHcm91cFtnXTsKKyAgICAgIGZvciAoYiA9IDA7IGIgPCBuRHJjQmFuZHM7IGIrKykgeworICAgICAgICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgICAgICAgIEdBSU5fU0VUKiBwR2FpblNldCA9ICYocENvZWYtPmdhaW5TZXRbZ2FpblNldEluZGV4XSk7CisgICAgICAgIGludCBzZXEgPSBwR2FpblNldC0+Z2FpblNlcXVlbmNlSW5kZXhbYl07CisgICAgICAgIERSQ19DSEFSQUNURVJJU1RJQyogcERDaGFyID0gJihwR2FpblNldC0+ZHJjQ2hhcmFjdGVyaXN0aWNbYl0pOworCisgICAgICAgIC8qIGxpbmVhck5vZGVCdWZmZXIgY29udGFpbnMgYSBjb3B5IG9mIHRoZSBnYWluIHNlcXVlbmNlcyAoY29uc2lzdGluZyBvZgorICAgICAgICAgICBub2RlcykgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIGRlY29kaW5nLiBJdCBhbHNvIGNvbnRhaW5zIGdhaW4KKyAgICAgICAgICAgc2VxdWVuY2VzIG9mIHByZXZpb3VzIGZyYW1lcy4gKi8KKyAgICAgICAgTElORUFSX05PREVfQlVGRkVSKiBwTG5iID0KKyAgICAgICAgICAgICYoZHJjR2FpbkJ1ZmZlcnMtPmxpbmVhck5vZGVCdWZmZXJbcEFjdGl2ZURyYy0+YWN0aXZlRHJjT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbkVsZW1lbnRJbmRleF0pOworICAgICAgICBpbnQgaSwgbG5icDsKKyAgICAgICAgbG5icCA9IGRyY0dhaW5CdWZmZXJzLT5sbmJQb2ludGVyOworICAgICAgICBwTG5iLT5nYWluSW50ZXJwb2xhdGlvblR5cGUgPQorICAgICAgICAgICAgKEdBSU5fSU5URVJQT0xBVElPTl9UWVBFKXBHYWluU2V0LT5nYWluSW50ZXJwb2xhdGlvblR5cGU7CisKKyAgICAgICAgZXJyID0gX3ByZXBhcmVEcmNDaGFyYWN0ZXJpc3RpYyhwRENoYXIsIHBDb2VmLCBiLCAmbm9kZU1vZCk7CisgICAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisKKyAgICAgICAgLyogY29weSBhIG5vZGUgYnVmZmVyIGFuZCBjb252ZXJ0IGZyb20gZEIgdG8gbGluZWFyICovCisgICAgICAgIHBMbmItPm5Ob2Rlc1tsbmJwXSA9IGZNaW4oKGludCloVW5pRHJjR2Fpbi0+bk5vZGVzW3NlcV0sIDE2KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBMbmItPm5Ob2Rlc1tsbmJwXTsgaSsrKSB7CisgICAgICAgICAgRklYUF9EQkwgZ2Fpbkxpbiwgc2xvcGVMaW47CisgICAgICAgICAgZXJyID0gX3RvTGluZWFyKCZub2RlTW9kLCBiLCBoVW5pRHJjR2Fpbi0+Z2Fpbk5vZGVbc2VxXVtpXS5nYWluRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1NHTCkwLCAmZ2FpbkxpbiwgJnNsb3BlTGluKTsKKyAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgICAgIHBMbmItPmxpbmVhck5vZGVbbG5icF1baV0uZ2FpbkxpbiA9IGdhaW5MaW47CisgICAgICAgICAgcExuYi0+bGluZWFyTm9kZVtsbmJwXVtpXS50aW1lID0gaFVuaURyY0dhaW4tPmdhaW5Ob2RlW3NlcV1baV0udGltZTsKKyAgICAgICAgfQorICAgICAgICBnYWluRWxlbWVudEluZGV4Kys7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHBhcmFtZXRyaWMgRFJDIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgIGdhaW5FbGVtZW50SW5kZXgrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIERFX09LOworfQpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX3ByZXByb2Nlc3MuaCBiL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19wcmVwcm9jZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0NzQwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19wcmVwcm9jZXNzLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBEUkNHQUlOREVDX1BSRVBST0NFU1NfSAorI2RlZmluZSBEUkNHQUlOREVDX1BSRVBST0NFU1NfSAorCitEUkNfRVJST1IKK3ByZXBhcmVEcmNHYWluKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLAorICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfR0FJTiBoVW5pRHJjR2FpbiwgY29uc3QgRklYUF9TR0wgY29tcHJlc3MsCisgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBib29zdCwgY29uc3QgRklYUF9EQkwgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiLAorICAgICAgICAgICAgICAgY29uc3QgaW50IGFjdGl2ZURyY0luZGV4KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX3Byb2Nlc3MuY3BwIGIvbGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX3Byb2Nlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYzk1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfcHJvY2Vzcy5jcHAKQEAgLTAsMCArMSw1MzIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImRyY0RlY190eXBlcy5oIgorI2luY2x1ZGUgImRyY0RlY19nYWluRGVjb2Rlci5oIgorI2luY2x1ZGUgImRyY0dhaW5EZWNfcHJvY2Vzcy5oIgorCisjZGVmaW5lIEVfVEdBSU5TVEVQIDEyCisKK3N0YXRpYyBEUkNfRVJST1IgX3ByZXBhcmVMbmJJbmRleChBQ1RJVkVfRFJDKiBwQWN0aXZlRHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkcmNDaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1DaGFubmVsc1Byb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbG5iUG9pbnRlcikgeworICBpbnQgZywgYzsKKyAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCA9IHBBY3RpdmVEcmMtPnBJbnN0OworCisgIC8qIGNoYW5uZWxPZmZzZXQ6IHN0YXJ0IGluZGV4IG9mIHBoeXNpY2FsIGNoYW5uZWxzCisgICAgIG51bUNoYW5uZWxzUHJvY2Vzc2VkOiBudW1iZXIgb2YgcHJvY2Vzc2VkIGNoYW5uZWxzLCBwaHlzaWNhbCBjaGFubmVscyBhbmQKKyAgICAgRFJDIGNoYW5uZWxzIGNoYW5uZWxPZmZzZXQgKyBkcmNDaGFubmVsT2Zmc2V0OiBzdGFydCBpbmRleCBvZiBEUkMgY2hhbm5lbHMsCisgICAgICAgIGkuZS4gdGhlIGNoYW5uZWwgb3JkZXIgcmVmZXJlbmNlZCBpbiBwSW5zdC5zZXF1ZW5jZUluZGV4ICovCisKKyAgLyogc2FuaXR5IGNoZWNrcyAqLworICBpZiAoKGNoYW5uZWxPZmZzZXQgKyBudW1DaGFubmVsc1Byb2Nlc3NlZCkgPiA4KSByZXR1cm4gREVfTk9UX09LOworCisgIGlmICgoY2hhbm5lbE9mZnNldCArIGRyY0NoYW5uZWxPZmZzZXQgKyBudW1DaGFubmVsc1Byb2Nlc3NlZCkgPiA4KQorICAgIHJldHVybiBERV9OT1RfT0s7CisKKyAgaWYgKChjaGFubmVsT2Zmc2V0ICsgZHJjQ2hhbm5lbE9mZnNldCkgPCAwKSByZXR1cm4gREVfTk9UX09LOworCisgIC8qIHByZXBhcmUgbG5iSW5kZXhGb3JDaGFubmVsLCBhIG1hcCBvZiBpbmRpY2VzIGZyb20gZWFjaCBjaGFubmVsIHRvIGl0cworICAgKiBjb3JyZXNwb25kaW5nIGxpbmVhck5vZGVCdWZmZXIgaW5zdGFuY2UgKi8KKyAgZm9yIChjID0gY2hhbm5lbE9mZnNldDsgYyA8IGNoYW5uZWxPZmZzZXQgKyBudW1DaGFubmVsc1Byb2Nlc3NlZDsgYysrKSB7CisgICAgaWYgKHBJbnN0LT5kcmNTZXRJZCA+IDApIHsKKyAgICAgIGludCBkcmNDaGFubmVsID0gYyArIGRyY0NoYW5uZWxPZmZzZXQ7CisgICAgICAvKiBmYWxsYmFjayBmb3IgY29uZmlndXJhdGlvbiB3aXRoIG1vcmUgcGh5c2ljYWwgY2hhbm5lbHMgdGhhbiBEUkMKKyAgICAgICAgIGNoYW5uZWxzOiByZXVzZSBEUkMgZ2FpbiBvZiBmaXJzdCBjaGFubmVsLiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgSEUtQUFDCisgICAgICAgICBtb25vIHdpdGggc3RlcmVvIG91dHB1dCAqLworICAgICAgaWYgKGRyY0NoYW5uZWwgPj0gcEluc3QtPmRyY0NoYW5uZWxDb3VudCkgZHJjQ2hhbm5lbCA9IDA7CisgICAgICBnID0gcEFjdGl2ZURyYy0+Y2hhbm5lbEdyb3VwRm9yQ2hhbm5lbFtkcmNDaGFubmVsXTsKKyAgICAgIGlmICgoZyA+PSAwKSAmJiAhcEFjdGl2ZURyYy0+Y2hhbm5lbEdyb3VwSXNQYXJhbWV0cmljRHJjW2ddKSB7CisgICAgICAgIHBBY3RpdmVEcmMtPmxuYkluZGV4Rm9yQ2hhbm5lbFtjXVtsbmJQb2ludGVyXSA9CisgICAgICAgICAgICBwQWN0aXZlRHJjLT5hY3RpdmVEcmNPZmZzZXQgKyBwQWN0aXZlRHJjLT5nYWluRWxlbWVudEZvckdyb3VwW2ddOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBERV9PSzsKK30KKworc3RhdGljIERSQ19FUlJPUiBfaW50ZXJwb2xhdGVEcmNHYWluKAorICAgIGNvbnN0IEdBSU5fSU5URVJQT0xBVElPTl9UWVBFIGdhaW5JbnRlcnBvbGF0aW9uVHlwZSwKKyAgICBjb25zdCBTSE9SVCB0aW1lUHJldiwgIC8qIHRpbWUwICovCisgICAgY29uc3QgU0hPUlQgdEdhaW5TdGVwLCAvKiB0aW1lMSAtIHRpbWUwICovCisgICAgY29uc3QgU0hPUlQgc3RhcnQsIGNvbnN0IFNIT1JUIHN0b3AsIGNvbnN0IFNIT1JUIHN0ZXBzaXplLAorICAgIGNvbnN0IEZJWFBfREJMIGdhaW5MZWZ0LCBjb25zdCBGSVhQX0RCTCBnYWluUmlnaHQsIGNvbnN0IEZJWFBfREJMIHNsb3BlTGVmdCwKKyAgICBjb25zdCBGSVhQX0RCTCBzbG9wZVJpZ2h0LCBGSVhQX0RCTCogYnVmZmVyKSB7CisgIGludCBuLCBuX2J1ZjsKKyAgaW50IHN0YXJ0X21vZHVsbywgc3RhcnRfb2Zmc2V0OworCisgIGlmICh0R2FpblN0ZXAgPCAwKSB7CisgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgfQorICBpZiAodEdhaW5TdGVwID09IDApIHsKKyAgICByZXR1cm4gREVfT0s7CisgIH0KKworICAvKiBnZXQgc3RhcnQgaW5kZXggb2Zmc2V0IGFuZCBidWZmZXIgaW5kZXggZm9yIGRvd25zYW1wbGVkIGludGVycG9sYXRpb24gKi8KKyAgLyogc3RhcnRfbW9kdWxvID0gKHN0YXJ0K3RpbWVQcmV2KSVzdGVwc2l6ZTsgKi8gLyogc3RlcHNpemUgaXMgYSBwb3dlciBvZiAyICovCisgIHN0YXJ0X21vZHVsbyA9IChzdGFydCArIHRpbWVQcmV2KSAmIChzdGVwc2l6ZSAtIDEpOworICBzdGFydF9vZmZzZXQgPSAoc3RhcnRfbW9kdWxvID8gc3RlcHNpemUgLSBzdGFydF9tb2R1bG8gOiAwKTsKKyAgLyogbl9idWYgPSAoc3RhcnQgKyB0aW1lUHJldiArIHN0YXJ0X29mZnNldCkvc3RlcHNpemU7ICovCisgIG5fYnVmID0gKHN0YXJ0ICsgdGltZVByZXYgKyBzdGFydF9vZmZzZXQpID4+ICgxNSAtIGZpeG5vcm16X1Moc3RlcHNpemUpKTsKKworICB7IC8qIGdhaW5JbnRlcnBvbGF0aW9uVHlwZSA9PSBHSVRfTElORUFSICovCisgICAgTE9ORyBhOworICAgIC8qIHJ1bnMgPSBjZWlsKChzdG9wIC0gc3RhcnQgLSBzdGFydF9vZmZzZXQpL3N0ZXBzaXplKS4gVGhpcyB3b3JrcyBmb3IKKyAgICAgKiBzdGVwc2l6ZSA9IDJeTiBvbmx5LiAqLworICAgIElOVCBydW5zID0gKElOVCkoc3RvcCAtIHN0YXJ0IC0gc3RhcnRfb2Zmc2V0ICsgc3RlcHNpemUgLSAxKSA+PgorICAgICAgICAgICAgICAgKDMwIC0gQ291bnRMZWFkaW5nQml0cyhzdGVwc2l6ZSkpOworICAgIElOVCBuX21pbiA9IGZNaW4oCisgICAgICAgIGZNaW4oQ250TGVhZGluZ1plcm9zKGdhaW5SaWdodCksIENudExlYWRpbmdaZXJvcyhnYWluTGVmdCkpIC0gMSwgOCk7CisgICAgYSA9IChMT05HKSgoZ2FpblJpZ2h0IDw8IG5fbWluKSAtIChnYWluTGVmdCA8PCBuX21pbikpIC8gdEdhaW5TdGVwOworICAgIExPTkcgYV9zdGVwID0gYSAqIHN0ZXBzaXplOworICAgIG4gPSBzdGFydCArIHN0YXJ0X29mZnNldDsKKyAgICBhID0gYSAqIG4gKyAoTE9ORykoZ2FpbkxlZnQgPDwgbl9taW4pOworICAgIGJ1ZmZlciArPSBuX2J1ZjsKKyNpZiBkZWZpbmVkKEZVTkNUSU9OX2ludGVycG9sYXRlRHJjR2Fpbl9mdW5jMSkKKyAgICBpbnRlcnBvbGF0ZURyY0dhaW5fZnVuYzEoYnVmZmVyLCBhLCBhX3N0ZXAsIG5fbWluLCBydW5zKTsKKyNlbHNlCisgICAgYSAtPSBhX3N0ZXA7CisgICAgbl9taW4gPSA4IC0gbl9taW47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zOyBpKyspIHsKKyAgICAgIGEgKz0gYV9zdGVwOworICAgICAgYnVmZmVyW2ldID0gZk11bHREaXYyKGJ1ZmZlcltpXSwgKEZJWFBfREJMKWEpIDw8IG5fbWluOworICAgIH0KKyNlbmRpZiAvKiBkZWZpbmVkKEZVTkNUSU9OX2ludGVycG9sYXRlRHJjR2Fpbl9mdW5jMSkgKi8KKyAgfQorICByZXR1cm4gREVfT0s7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX3Byb2Nlc3NOb2RlU2VnbWVudHMoCisgICAgY29uc3QgaW50IGZyYW1lU2l6ZSwgY29uc3QgR0FJTl9JTlRFUlBPTEFUSU9OX1RZUEUgZ2FpbkludGVycG9sYXRpb25UeXBlLAorICAgIGNvbnN0IGludCBuTm9kZXMsIGNvbnN0IE5PREVfTElOKiBwTm9kZUxpbiwgY29uc3QgaW50IG9mZnNldCwKKyAgICBjb25zdCBTSE9SVCBzdGVwc2l6ZSwKKyAgICBjb25zdCBOT0RFX0xJTiBub2RlUHJldmlvdXMsIC8qIHRoZSBsYXN0IG5vZGUgb2YgdGhlIHByZXZpb3VzIGZyYW1lICovCisgICAgY29uc3QgRklYUF9EQkwgY2hhbm5lbEdhaW4sIEZJWFBfREJMKiBidWZmZXIpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBTSE9SVCB0aW1lUHJldiwgZHVyYXRpb24sIHN0YXJ0LCBzdG9wLCB0aW1lOworICBpbnQgbjsKKyAgRklYUF9EQkwgZ2FpbkxpbiA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgNykpLCBnYWluTGluUHJldjsKKyAgRklYUF9EQkwgc2xvcGVMaW4gPSAoRklYUF9EQkwpMCwgc2xvcGVMaW5QcmV2ID0gKEZJWFBfREJMKTA7CisKKyAgdGltZVByZXYgPSBub2RlUHJldmlvdXMudGltZSArIG9mZnNldDsKKyAgZ2FpbkxpblByZXYgPSBub2RlUHJldmlvdXMuZ2FpbkxpbjsKKyAgZm9yIChuID0gMDsgbiA8IG5Ob2RlczsgbisrKSB7CisgICAgdGltZSA9IHBOb2RlTGluW25dLnRpbWUgKyBvZmZzZXQ7CisgICAgZHVyYXRpb24gPSB0aW1lIC0gdGltZVByZXY7CisgICAgZ2FpbkxpbiA9IHBOb2RlTGluW25dLmdhaW5MaW47CisgICAgaWYgKGNoYW5uZWxHYWluICE9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgOCkpKQorICAgICAgZ2FpbkxpbiA9CisgICAgICAgICAgU0FUVVJBVEVfTEVGVF9TSElGVChmTXVsdERpdjIoZ2FpbkxpbiwgY2hhbm5lbEdhaW4pLCA5LCBERlJBQ1RfQklUUyk7CisKKyAgICBpZiAoKHRpbWVQcmV2ID49IChmcmFtZVNpemUgLSAxKSkgfHwKKyAgICAgICAgKHRpbWUgPCAwKSkgeyAvKiBUaGlzIHNlZ21lbnQgKGJldHdlZW4gcHJldmlvdXMgYW5kIGN1cnJlbnQgbm9kZSkgbGllcworICAgICAgICAgICAgICAgICAgICAgICAgIG91dHNpZGUgb2YgdGhpcyBhdWRpbyBmcmFtZSAqLworICAgICAgdGltZVByZXYgPSB0aW1lOworICAgICAgZ2FpbkxpblByZXYgPSBnYWluTGluOworICAgICAgc2xvcGVMaW5QcmV2ID0gc2xvcGVMaW47CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBzdGFydCBhbmQgc3RvcCBhcmUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJlZ2lvbiBvZiB0aGlzIHNlZ21lbnQgdGhhdCBsaWUKKyAgICAgICB3aXRoaW4gdGhpcyBhdWRpbyBmcmFtZS4gVGhlaXIgdmFsdWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mCisgICAgICAgdGhpcyBzZWdtZW50LiBzdG9wIGlzIHRoZSBmaXJzdCBzYW1wbGUgdGhhdCBpc24ndCBwcm9jZXNzZWQgYW55IG1vcmUuICovCisgICAgc3RhcnQgPSBmTWF4KC10aW1lUHJldiwgMSk7CisgICAgc3RvcCA9IGZNaW4odGltZSwgKFNIT1JUKShmcmFtZVNpemUgLSAxKSkgLSB0aW1lUHJldiArIDE7CisKKyAgICBlcnIgPSBfaW50ZXJwb2xhdGVEcmNHYWluKGdhaW5JbnRlcnBvbGF0aW9uVHlwZSwgdGltZVByZXYsIGR1cmF0aW9uLCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AsIHN0ZXBzaXplLCBnYWluTGluUHJldiwgZ2FpbkxpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BlTGluUHJldiwgc2xvcGVMaW4sIGJ1ZmZlcik7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKworICAgIHRpbWVQcmV2ID0gdGltZTsKKyAgICBnYWluTGluUHJldiA9IGdhaW5MaW47CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKworLyogcHJvY2VzcyBEUkMgb24gdGltZS1kb21haW4gc2lnbmFsICovCitEUkNfRVJST1IKK3Byb2Nlc3NEcmNUaW1lKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLCBjb25zdCBpbnQgYWN0aXZlRHJjSW5kZXgsCisgICAgICAgICAgICAgICBjb25zdCBpbnQgZGVsYXlTYW1wbGVzLCBjb25zdCBpbnQgY2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBkcmNDaGFubmVsT2Zmc2V0LCBjb25zdCBpbnQgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsCisgICAgICAgICAgICAgICBjb25zdCBpbnQgdGltZURhdGFDaGFubmVsT2Zmc2V0LCBGSVhQX0RCTCogZGVpbnRlcmxlYXZlZEF1ZGlvKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGMsIGIsIGk7CisgIEFDVElWRV9EUkMqIHBBY3RpdmVEcmMgPSAmKGhHYWluRGVjLT5hY3RpdmVEcmNbYWN0aXZlRHJjSW5kZXhdKTsKKyAgRFJDX0dBSU5fQlVGRkVSUyogcERyY0dhaW5CdWZmZXJzID0gJihoR2FpbkRlYy0+ZHJjR2FpbkJ1ZmZlcnMpOworICBpbnQgbG5iUG9pbnRlciA9IHBEcmNHYWluQnVmZmVycy0+bG5iUG9pbnRlciwgbG5iSXg7CisgIExJTkVBUl9OT0RFX0JVRkZFUiogcExpbmVhck5vZGVCdWZmZXIgPSBwRHJjR2FpbkJ1ZmZlcnMtPmxpbmVhck5vZGVCdWZmZXI7CisgIExJTkVBUl9OT0RFX0JVRkZFUiogcER1bW15TG5iID0gJihwRHJjR2FpbkJ1ZmZlcnMtPmR1bW15TG5iKTsKKyAgaW50IG9mZnNldCA9IDA7CisKKyAgaWYgKGhHYWluRGVjLT5kZWxheU1vZGUgPT0gRE1fUkVHVUxBUl9ERUxBWSkgeworICAgIG9mZnNldCA9IGhHYWluRGVjLT5mcmFtZVNpemU7CisgIH0KKworICBpZiAoKGRlbGF5U2FtcGxlcyArIG9mZnNldCkgPgorICAgICAgKE5VTV9MTkJfRlJBTUVTIC0gMikgKgorICAgICAgICAgIGhHYWluRGVjLT5mcmFtZVNpemUpIC8qIGlmIGRlbGF5U2FtcGxlcyBpcyB0b28gYmlnLCBOVU1fTE5CX0ZSQU1FUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBpbmNyZWFzZWQgKi8KKyAgICByZXR1cm4gREVfTk9UX09LOworCisgIGVyciA9IF9wcmVwYXJlTG5iSW5kZXgocEFjdGl2ZURyYywgY2hhbm5lbE9mZnNldCwgZHJjQ2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVsc1Byb2Nlc3NlZCwgbG5iUG9pbnRlcik7CisgIGlmIChlcnIpIHJldHVybiBlcnI7CisKKyAgZGVpbnRlcmxlYXZlZEF1ZGlvICs9CisgICAgICBjaGFubmVsT2Zmc2V0ICogdGltZURhdGFDaGFubmVsT2Zmc2V0OyAvKiBhcHBseSBjaGFubmVsT2Zmc2V0ICovCisKKyAgLyogc2lnbmFsIHByb2Nlc3NpbmcgbG9vcCAqLworICBmb3IgKGMgPSBjaGFubmVsT2Zmc2V0OyBjIDwgY2hhbm5lbE9mZnNldCArIG51bUNoYW5uZWxzUHJvY2Vzc2VkOyBjKyspIHsKKyAgICBpZiAoYWN0aXZlRHJjSW5kZXggPT0gaEdhaW5EZWMtPmNoYW5uZWxHYWluQWN0aXZlRHJjSW5kZXgpCisgICAgICBwRHJjR2FpbkJ1ZmZlcnMtPmNoYW5uZWxHYWluW2NdW2xuYlBvaW50ZXJdID0gaEdhaW5EZWMtPmNoYW5uZWxHYWluW2NdOworCisgICAgYiA9IDA7CisgICAgeworICAgICAgTElORUFSX05PREVfQlVGRkVSICpwTG5iLCAqcExuYlByZXZpb3VzOworICAgICAgTk9ERV9MSU4gbm9kZVByZXZpb3VzOworICAgICAgaW50IGxuYlBvaW50ZXJEaWZmOworICAgICAgRklYUF9EQkwgY2hhbm5lbEdhaW47CisgICAgICAvKiBnZXQgcG9pbnRlciB0byBvbGRlc3QgbGluZWFyTm9kZXMgKi8KKyAgICAgIGxuYkl4ID0gbG5iUG9pbnRlciArIDEgLSBOVU1fTE5CX0ZSQU1FUzsKKyAgICAgIHdoaWxlIChsbmJJeCA8IDApIGxuYkl4ICs9IE5VTV9MTkJfRlJBTUVTOworCisgICAgICBpZiAoYWN0aXZlRHJjSW5kZXggPT0gaEdhaW5EZWMtPmNoYW5uZWxHYWluQWN0aXZlRHJjSW5kZXgpCisgICAgICAgIGNoYW5uZWxHYWluID0gcERyY0dhaW5CdWZmZXJzLT5jaGFubmVsR2FpbltjXVtsbmJJeF07CisgICAgICBlbHNlCisgICAgICAgIGNoYW5uZWxHYWluID0gRkwyRlhDT05TVF9EQkwoMS4wZiAvIChmbG9hdCkoMSA8PCA4KSk7CisKKyAgICAgIC8qIExvb3Agb3ZlciBhbGwgbm9kZSBidWZmZXJzIGluIGxpbmVhck5vZGVCdWZmZXIuCisgICAgICAgICBBbGwgbm9kZXMgd2hpY2ggYXJlIG5vdCByZWxldmFudCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgYXJlIHNvcnRlZCBvdXQKKyAgICAgICAgIGluc2lkZSBfcHJvY2Vzc05vZGVTZWdtZW50cy4gKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTE5CX0ZSQU1FUyAtIDE7IGkrKykgeworICAgICAgICAvKiBQcmVwYXJlIHByZXZpb3VzIG5vZGUgKi8KKyAgICAgICAgaWYgKHBBY3RpdmVEcmMtPmxuYkluZGV4Rm9yQ2hhbm5lbFtjXVtsbmJJeF0gPj0gMCkKKyAgICAgICAgICBwTG5iUHJldmlvdXMgPSAmKAorICAgICAgICAgICAgICBwTGluZWFyTm9kZUJ1ZmZlcltwQWN0aXZlRHJjLT5sbmJJbmRleEZvckNoYW5uZWxbY11bbG5iSXhdICsgYl0pOworICAgICAgICBlbHNlCisgICAgICAgICAgcExuYlByZXZpb3VzID0gcER1bW15TG5iOworICAgICAgICBub2RlUHJldmlvdXMgPQorICAgICAgICAgICAgcExuYlByZXZpb3VzLT5saW5lYXJOb2RlW2xuYkl4XVtwTG5iUHJldmlvdXMtPm5Ob2Rlc1tsbmJJeF0gLSAxXTsKKyAgICAgICAgbm9kZVByZXZpb3VzLnRpbWUgLT0gaEdhaW5EZWMtPmZyYW1lU2l6ZTsKKyAgICAgICAgaWYgKGNoYW5uZWxHYWluICE9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgOCkpKQorICAgICAgICAgIG5vZGVQcmV2aW91cy5nYWluTGluID0gU0FUVVJBVEVfTEVGVF9TSElGVCgKKyAgICAgICAgICAgICAgZk11bHREaXYyKG5vZGVQcmV2aW91cy5nYWluTGluLAorICAgICAgICAgICAgICAgICAgICAgICAgcERyY0dhaW5CdWZmZXJzLT5jaGFubmVsR2FpbltjXVtsbmJJeF0pLAorICAgICAgICAgICAgICA5LCBERlJBQ1RfQklUUyk7CisKKyAgICAgICAgLyogUHJlcGFyZSBjdXJyZW50IGxpbmVhck5vZGVCdWZmZXIgaW5zdGFuY2UgKi8KKyAgICAgICAgbG5iSXgrKzsKKyAgICAgICAgaWYgKGxuYkl4ID49IE5VTV9MTkJfRlJBTUVTKSBsbmJJeCA9IDA7CisKKyAgICAgICAgLyogaWYgbG5iSW5kZXhGb3JDaGFubmVsIGNoYW5nZXMgb3ZlciB0aW1lLCB1c2UgdGhlIG9sZCBpbmRpY2VzIGZvcgorICAgICAgICAgKiBzbW9vdGggdHJhbnNpdGlvbnMgKi8KKyAgICAgICAgaWYgKHBBY3RpdmVEcmMtPmxuYkluZGV4Rm9yQ2hhbm5lbFtjXVtsbmJJeF0gPj0gMCkKKyAgICAgICAgICBwTG5iID0gJigKKyAgICAgICAgICAgICAgcExpbmVhck5vZGVCdWZmZXJbcEFjdGl2ZURyYy0+bG5iSW5kZXhGb3JDaGFubmVsW2NdW2xuYkl4XSArIGJdKTsKKyAgICAgICAgZWxzZSAvKiBsbmJJbmRleEZvckNoYW5uZWwgPSAtMSBtZWFucyAibm8gRFJDIHByb2Nlc3NpbmciLCBkdWUgdG8KKyAgICAgICAgICAgICAgICBkcmNJbnN0cnVjdGlvbnNJbmRleCA8IDAsIGRyY1NldElkIDwgMCBvciBjaGFubmVsIGdyb3VwIDwgMCAqLworICAgICAgICAgIHBMbmIgPSBwRHVtbXlMbmI7CisKKyAgICAgICAgaWYgKGFjdGl2ZURyY0luZGV4ID09IGhHYWluRGVjLT5jaGFubmVsR2FpbkFjdGl2ZURyY0luZGV4KQorICAgICAgICAgIGNoYW5uZWxHYWluID0gcERyY0dhaW5CdWZmZXJzLT5jaGFubmVsR2FpbltjXVtsbmJJeF07CisKKyAgICAgICAgLyogbnVtYmVyIG9mIGZyYW1lcyBvZiBvZmZzZXQgd2l0aCByZXNwZWN0IHRvIGxuYlBvaW50ZXIgKi8KKyAgICAgICAgbG5iUG9pbnRlckRpZmYgPSBpIC0gKE5VTV9MTkJfRlJBTUVTIC0gMik7CisKKyAgICAgICAgZXJyID0gX3Byb2Nlc3NOb2RlU2VnbWVudHMoCisgICAgICAgICAgICBoR2FpbkRlYy0+ZnJhbWVTaXplLCBwTG5iLT5nYWluSW50ZXJwb2xhdGlvblR5cGUsCisgICAgICAgICAgICBwTG5iLT5uTm9kZXNbbG5iSXhdLCBwTG5iLT5saW5lYXJOb2RlW2xuYkl4XSwKKyAgICAgICAgICAgIGxuYlBvaW50ZXJEaWZmICogaEdhaW5EZWMtPmZyYW1lU2l6ZSArIGRlbGF5U2FtcGxlcyArIG9mZnNldCwgMSwKKyAgICAgICAgICAgIG5vZGVQcmV2aW91cywgY2hhbm5lbEdhaW4sIGRlaW50ZXJsZWF2ZWRBdWRpbyk7CisgICAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgICB9CisgICAgICBkZWludGVybGVhdmVkQXVkaW8gKz0gdGltZURhdGFDaGFubmVsT2Zmc2V0OyAvKiBwcm9jZWVkIHRvIG5leHQgY2hhbm5lbCAqLworICAgIH0KKyAgfQorICByZXR1cm4gREVfT0s7Cit9CisKKy8qIHByb2Nlc3MgRFJDIG9uIHN1YmJhbmQtZG9tYWluIHNpZ25hbCAqLworRFJDX0VSUk9SCitwcm9jZXNzRHJjU3ViYmFuZChIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywgY29uc3QgaW50IGFjdGl2ZURyY0luZGV4LAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRlbGF5U2FtcGxlcywgY29uc3QgaW50IGNoYW5uZWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwgY29uc3QgaW50IG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHByb2Nlc3NTaW5nbGVUaW1lc2xvdCwKKyAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBkZWludGVybGVhdmVkQXVkaW9SZWFsW10sCisgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogZGVpbnRlcmxlYXZlZEF1ZGlvSW1hZ1tdKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGIsIGMsIGcsIG0sIG1fc3RhcnQsIG1fc3RvcCwgcywgaTsKKyAgRklYUF9EQkwgZ2FpblNiOworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0ID0gaEdhaW5EZWMtPmFjdGl2ZURyY1thY3RpdmVEcmNJbmRleF0ucEluc3Q7CisgIERSQ19HQUlOX0JVRkZFUlMqIHBEcmNHYWluQnVmZmVycyA9ICYoaEdhaW5EZWMtPmRyY0dhaW5CdWZmZXJzKTsKKyAgQUNUSVZFX0RSQyogcEFjdGl2ZURyYyA9ICYoaEdhaW5EZWMtPmFjdGl2ZURyY1thY3RpdmVEcmNJbmRleF0pOworICBpbnQgYWN0aXZlRHJjT2Zmc2V0ID0gcEFjdGl2ZURyYy0+YWN0aXZlRHJjT2Zmc2V0OworICBpbnQgbG5iUG9pbnRlciA9IHBEcmNHYWluQnVmZmVycy0+bG5iUG9pbnRlciwgbG5iSXg7CisgIExJTkVBUl9OT0RFX0JVRkZFUiogcExpbmVhck5vZGVCdWZmZXIgPSBwRHJjR2FpbkJ1ZmZlcnMtPmxpbmVhck5vZGVCdWZmZXI7CisgIEZJWFBfREJMKCpzdWJiYW5kR2FpbnMpWzQgKiAxMDI0IC8gMjU2XSA9IGhHYWluRGVjLT5zdWJiYW5kR2FpbnM7CisgIEZJWFBfREJMKiBkdW1teVN1YmJhbmRHYWlucyA9IGhHYWluRGVjLT5kdW1teVN1YmJhbmRHYWluczsKKyAgU1VCQkFORF9ET01BSU5fTU9ERSBzdWJiYW5kRG9tYWluTW9kZSA9IGhHYWluRGVjLT5zdWJiYW5kRG9tYWluU3VwcG9ydGVkOworICBpbnQgc2lnbmFsSW5kZXggPSAwOworICBpbnQgZnJhbWVTaXplU2IgPSAwOworICBpbnQgbkRlY29kZXJTdWJiYW5kczsKKyAgU0hPUlQgTCA9IDA7IC8qIEw6IGRvd25zYW1wbGluZyBmYWN0b3IgKi8KKyAgaW50IG9mZnNldCA9IDA7CisgIEZJWFBfREJMICphdWRpb1JlYWwgPSBOVUxMLCAqYXVkaW9JbWFnID0gTlVMTDsKKworICBpZiAoaEdhaW5EZWMtPmRlbGF5TW9kZSA9PSBETV9SRUdVTEFSX0RFTEFZKSB7CisgICAgb2Zmc2V0ID0gaEdhaW5EZWMtPmZyYW1lU2l6ZTsKKyAgfQorCisgIGlmICgoZGVsYXlTYW1wbGVzICsgb2Zmc2V0KSA+CisgICAgICAoTlVNX0xOQl9GUkFNRVMgLSAyKSAqCisgICAgICAgICAgaEdhaW5EZWMtPmZyYW1lU2l6ZSkgLyogaWYgZGVsYXlTYW1wbGVzIGlzIHRvbyBiaWcsIE5VTV9MTkJfRlJBTUVTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGluY3JlYXNlZCAqLworICAgIHJldHVybiBERV9OT1RfT0s7CisKKyAgc3dpdGNoIChzdWJiYW5kRG9tYWluTW9kZSkgeworI2lmICgoMTAyNCAvIDI1NikgPj0gKDQwOTYgLyBTVUJCQU5EX0RPV05TQU1QTElOR19GQUNUT1JfUU1GNjQpKQorICAgIGNhc2UgU0RNX1FNRjY0OgorICAgICAgbkRlY29kZXJTdWJiYW5kcyA9IFNVQkJBTkRfTlVNX0JBTkRTX1FNRjY0OworICAgICAgTCA9IFNVQkJBTkRfRE9XTlNBTVBMSU5HX0ZBQ1RPUl9RTUY2NDsKKyAgICAgIC8qIGFuYWx5c2lzRGVsYXkgPSBTVUJCQU5EX0FOQUxZU0lTX0RFTEFZX1FNRjY0OyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRE1fUU1GNzE6CisgICAgICBuRGVjb2RlclN1YmJhbmRzID0gU1VCQkFORF9OVU1fQkFORFNfUU1GNzE7CisgICAgICBMID0gU1VCQkFORF9ET1dOU0FNUExJTkdfRkFDVE9SX1FNRjcxOworICAgICAgLyogYW5hbHlzaXNEZWxheSA9IFNVQkJBTkRfQU5BTFlTSVNfREVMQVlfUU1GNzE7ICovCisgICAgICBicmVhazsKKyNlbHNlCisgICAgY2FzZSBTRE1fUU1GNjQ6CisgICAgY2FzZSBTRE1fUU1GNzE6CisgICAgICAvKiBRTUYgZG9tYWluIHByb2Nlc3NpbmcgaXMgbm90IHN1cHBvcnRlZC4gKi8KKyAgICAgIHJldHVybiBERV9OT1RfT0s7CisjZW5kaWYKKyAgICBjYXNlIFNETV9TVEZUMjU2OgorICAgICAgbkRlY29kZXJTdWJiYW5kcyA9IFNVQkJBTkRfTlVNX0JBTkRTX1NURlQyNTY7CisgICAgICBMID0gU1VCQkFORF9ET1dOU0FNUExJTkdfRkFDVE9SX1NURlQyNTY7CisgICAgICAvKiBhbmFseXNpc0RlbGF5ID0gU1VCQkFORF9BTkFMWVNJU19ERUxBWV9TVEZUMjU2OyAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKworICAvKiBmcmFtZVNpemVTYiA9IGhHYWluRGVjLT5mcmFtZVNpemUvTDsgKi8gLyogTCBpcyBhIHBvd2VyIG9mIDIgKi8KKyAgZnJhbWVTaXplU2IgPQorICAgICAgaEdhaW5EZWMtPmZyYW1lU2l6ZSA+PiAoMTUgLSBmaXhub3Jtel9TKEwpKTsgLyogdGltZXNsb3RzIHBlciBmcmFtZSAqLworCisgIGlmICgocHJvY2Vzc1NpbmdsZVRpbWVzbG90IDwgMCkgfHwgKHByb2Nlc3NTaW5nbGVUaW1lc2xvdCA+PSBmcmFtZVNpemVTYikpIHsKKyAgICBtX3N0YXJ0ID0gMDsKKyAgICBtX3N0b3AgPSBmcmFtZVNpemVTYjsKKyAgfSBlbHNlIHsKKyAgICBtX3N0YXJ0ID0gcHJvY2Vzc1NpbmdsZVRpbWVzbG90OworICAgIG1fc3RvcCA9IG1fc3RhcnQgKyAxOworICB9CisKKyAgZXJyID0gX3ByZXBhcmVMbmJJbmRleChwQWN0aXZlRHJjLCBjaGFubmVsT2Zmc2V0LCBkcmNDaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzUHJvY2Vzc2VkLCBsbmJQb2ludGVyKTsKKyAgaWYgKGVycikgcmV0dXJuIGVycjsKKworICBpZiAoIXBBY3RpdmVEcmMtPnN1YmJhbmRHYWluc1JlYWR5KSAvKiBvbmx5IGZvciB0aGUgZmlyc3QgdGltZSBwZXIgZnJhbWUgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRHJjU3ViYmFuZCBpcyBjYWxsZWQgKi8KKyAgeworICAgIC8qIHdyaXRlIHN1YmJhbmRHYWlucyAqLworICAgIGZvciAoZyA9IDA7IGcgPCBwSW5zdC0+bkRyY0NoYW5uZWxHcm91cHM7IGcrKykgeworICAgICAgYiA9IDA7CisgICAgICB7CisgICAgICAgIExJTkVBUl9OT0RFX0JVRkZFUiogcExuYiA9CisgICAgICAgICAgICAmKHBMaW5lYXJOb2RlQnVmZmVyW2FjdGl2ZURyY09mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBY3RpdmVEcmMtPmdhaW5FbGVtZW50Rm9yR3JvdXBbZ10gKyBiXSk7CisgICAgICAgIE5PREVfTElOIG5vZGVQcmV2aW91czsKKyAgICAgICAgaW50IGxuYlBvaW50ZXJEaWZmOworCisgICAgICAgIGZvciAobSA9IDA7IG0gPCBmcmFtZVNpemVTYjsgbSsrKSB7CisgICAgICAgICAgc3ViYmFuZEdhaW5zW2FjdGl2ZURyY09mZnNldCArIGddW2IgKiBmcmFtZVNpemVTYiArIG1dID0KKyAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMS4wZiAvIChmbG9hdCkoMSA8PCA3KSk7CisgICAgICAgIH0KKworICAgICAgICBsbmJJeCA9IGxuYlBvaW50ZXIgLSAoTlVNX0xOQl9GUkFNRVMgLSAxKTsKKyAgICAgICAgd2hpbGUgKGxuYkl4IDwgMCkgbG5iSXggKz0gTlVNX0xOQl9GUkFNRVM7CisKKyAgICAgICAgLyogTG9vcCBvdmVyIGFsbCBub2RlIGJ1ZmZlcnMgaW4gbGluZWFyTm9kZUJ1ZmZlci4KKyAgICAgICAgICAgQWxsIG5vZGVzIHdoaWNoIGFyZSBub3QgcmVsZXZhbnQgZm9yIHRoZSBjdXJyZW50IGZyYW1lIGFyZSBzb3J0ZWQgb3V0CisgICAgICAgICAgIGluc2lkZSBfcHJvY2Vzc05vZGVTZWdtZW50cy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9MTkJfRlJBTUVTIC0gMTsgaSsrKSB7CisgICAgICAgICAgLyogUHJlcGFyZSBwcmV2aW91cyBub2RlICovCisgICAgICAgICAgbm9kZVByZXZpb3VzID0gcExuYi0+bGluZWFyTm9kZVtsbmJJeF1bcExuYi0+bk5vZGVzW2xuYkl4XSAtIDFdOworICAgICAgICAgIG5vZGVQcmV2aW91cy50aW1lIC09IGhHYWluRGVjLT5mcmFtZVNpemU7CisKKyAgICAgICAgICBsbmJJeCsrOworICAgICAgICAgIGlmIChsbmJJeCA+PSBOVU1fTE5CX0ZSQU1FUykgbG5iSXggPSAwOworCisgICAgICAgICAgLyogbnVtYmVyIG9mIGZyYW1lcyBvZiBvZmZzZXQgd2l0aCByZXNwZWN0IHRvIGxuYlBvaW50ZXIgKi8KKyAgICAgICAgICBsbmJQb2ludGVyRGlmZiA9IGkgLSAoTlVNX0xOQl9GUkFNRVMgLSAyKTsKKworICAgICAgICAgIGVyciA9IF9wcm9jZXNzTm9kZVNlZ21lbnRzKAorICAgICAgICAgICAgICBoR2FpbkRlYy0+ZnJhbWVTaXplLCBwTG5iLT5nYWluSW50ZXJwb2xhdGlvblR5cGUsCisgICAgICAgICAgICAgIHBMbmItPm5Ob2Rlc1tsbmJJeF0sIHBMbmItPmxpbmVhck5vZGVbbG5iSXhdLAorICAgICAgICAgICAgICBsbmJQb2ludGVyRGlmZiAqIGhHYWluRGVjLT5mcmFtZVNpemUgKyBkZWxheVNhbXBsZXMgKyBvZmZzZXQgLQorICAgICAgICAgICAgICAgICAgKEwgLSAxKSAvIDIsCisgICAgICAgICAgICAgIEwsIG5vZGVQcmV2aW91cywgRkwyRlhDT05TVF9EQkwoMS4wZiAvIChmbG9hdCkoMSA8PCA4KSksCisgICAgICAgICAgICAgICYoc3ViYmFuZEdhaW5zW2FjdGl2ZURyY09mZnNldCArIGddW2IgKiBmcmFtZVNpemVTYl0pKTsKKyAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHBBY3RpdmVEcmMtPnN1YmJhbmRHYWluc1JlYWR5ID0gMTsKKyAgfQorCisgIGZvciAoYyA9IGNoYW5uZWxPZmZzZXQ7IGMgPCBjaGFubmVsT2Zmc2V0ICsgbnVtQ2hhbm5lbHNQcm9jZXNzZWQ7IGMrKykgeworICAgIEZJWFBfREJMKiB0aGlzU3ViYmFuZEdhaW5zQnVmZmVyOworICAgIGlmIChwSW5zdC0+ZHJjU2V0SWQgPiAwKQorICAgICAgZyA9IHBBY3RpdmVEcmMtPmNoYW5uZWxHcm91cEZvckNoYW5uZWxbYyArIGRyY0NoYW5uZWxPZmZzZXRdOworICAgIGVsc2UKKyAgICAgIGcgPSAtMTsKKworICAgIGF1ZGlvUmVhbCA9IGRlaW50ZXJsZWF2ZWRBdWRpb1JlYWxbc2lnbmFsSW5kZXhdOworICAgIGlmIChzdWJiYW5kRG9tYWluTW9kZSAhPSBTRE1fU1RGVDI1NikgeworICAgICAgYXVkaW9JbWFnID0gZGVpbnRlcmxlYXZlZEF1ZGlvSW1hZ1tzaWduYWxJbmRleF07CisgICAgfQorCisgICAgaWYgKChnID49IDApICYmICFwQWN0aXZlRHJjLT5jaGFubmVsR3JvdXBJc1BhcmFtZXRyaWNEcmNbZ10pIHsKKyAgICAgIHRoaXNTdWJiYW5kR2FpbnNCdWZmZXIgPSBzdWJiYW5kR2FpbnNbYWN0aXZlRHJjT2Zmc2V0ICsgZ107CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXNTdWJiYW5kR2FpbnNCdWZmZXIgPSBkdW1teVN1YmJhbmRHYWluczsKKyAgICB9CisKKyAgICBmb3IgKG0gPSBtX3N0YXJ0OyBtIDwgbV9zdG9wOyBtKyspIHsKKyAgICAgIElOVCBuX21pbiA9IDg7CisgICAgICB7IC8qIHNpbmdsZS1iYW5kIERSQyAqLworICAgICAgICBnYWluU2IgPSB0aGlzU3ViYmFuZEdhaW5zQnVmZmVyW21dOworICAgICAgICBpZiAoYWN0aXZlRHJjSW5kZXggPT0gaEdhaW5EZWMtPmNoYW5uZWxHYWluQWN0aXZlRHJjSW5kZXgpCisgICAgICAgICAgZ2FpblNiID0gU0FUVVJBVEVfTEVGVF9TSElGVCgKKyAgICAgICAgICAgICAgZk11bHREaXYyKGdhaW5TYiwgaEdhaW5EZWMtPmNoYW5uZWxHYWluW2NdKSwgOSwgREZSQUNUX0JJVFMpOworICAgICAgICAvKiBub3JtYWxpemUgZ2FpblNiIGZvciBrZWVwaW5nIHNpZ25hbCBwcmVjaXNpb24gKi8KKyAgICAgICAgbl9taW4gPSBmTWluKENudExlYWRpbmdaZXJvcyhnYWluU2IpIC0gMSwgbl9taW4pOworICAgICAgICBnYWluU2IgPDw9IG5fbWluOworICAgICAgICBuX21pbiA9IDggLSBuX21pbjsKKyAgICAgICAgaWYgKHN1YmJhbmREb21haW5Nb2RlID09CisgICAgICAgICAgICBTRE1fU1RGVDI1NikgeyAvKiBGb3IgU1RGVCBmaWx0ZXJiYW5rLCByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZC4gKi8KKyAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgbkRlY29kZXJTdWJiYW5kczsgcysrKSB7CisgICAgICAgICAgICAqYXVkaW9SZWFsID0gZk11bHREaXYyKCphdWRpb1JlYWwsIGdhaW5TYikgPDwgbl9taW47CisgICAgICAgICAgICBhdWRpb1JlYWwrKzsKKyAgICAgICAgICAgICphdWRpb1JlYWwgPSBmTXVsdERpdjIoKmF1ZGlvUmVhbCwgZ2FpblNiKSA8PCBuX21pbjsKKyAgICAgICAgICAgIGF1ZGlvUmVhbCsrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgbkRlY29kZXJTdWJiYW5kczsgcysrKSB7CisgICAgICAgICAgICAqYXVkaW9SZWFsID0gZk11bHREaXYyKCphdWRpb1JlYWwsIGdhaW5TYikgPDwgbl9taW47CisgICAgICAgICAgICBhdWRpb1JlYWwrKzsKKyAgICAgICAgICAgICphdWRpb0ltYWcgPSBmTXVsdERpdjIoKmF1ZGlvSW1hZywgZ2FpblNiKSA8PCBuX21pbjsKKyAgICAgICAgICAgIGF1ZGlvSW1hZysrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBzaWduYWxJbmRleCsrOworICB9CisgIHJldHVybiBERV9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19wcm9jZXNzLmggYi9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfcHJvY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NTFhYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfcHJvY2Vzcy5oCkBAIC0wLDAgKzEsMTE5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRFJDR0FJTkRFQ19QUk9DRVNTX0gKKyNkZWZpbmUgRFJDR0FJTkRFQ19QUk9DRVNTX0gKKworRFJDX0VSUk9SCitwcm9jZXNzRHJjVGltZShIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywgY29uc3QgaW50IGFjdGl2ZURyY0luZGV4LAorICAgICAgICAgICAgICAgY29uc3QgaW50IGRlbGF5U2FtcGxlcywgY29uc3QgaW50IGNoYW5uZWxPZmZzZXQsCisgICAgICAgICAgICAgICBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwgY29uc3QgaW50IG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVEYXRhQ2hhbm5lbE9mZnNldCwgRklYUF9EQkwqIGRlaW50ZXJsZWF2ZWRBdWRpbyk7CisKK0RSQ19FUlJPUgorcHJvY2Vzc0RyY1N1YmJhbmQoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIGNvbnN0IGludCBhY3RpdmVEcmNJbmRleCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWxheVNhbXBsZXMsIGNvbnN0IGludCBjaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRyY0NoYW5uZWxPZmZzZXQsIGNvbnN0IGludCBudW1DaGFubmVsc1Byb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwcm9jZXNzU2luZ2xlVGltZXNsb3QsCisgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogZGVpbnRlcmxlYXZlZEF1ZGlvUmVhbFtdLAorICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIGRlaW50ZXJsZWF2ZWRBdWRpb0ltYWdbXSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL0ZES19hcmNoZGVmLmggYi9saWJGREsvaW5jbHVkZS9GREtfYXJjaGRlZi5oCmluZGV4IDVkYmMxMzguLjk1NjAxYmIgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL0ZES19hcmNoZGVmLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvRkRLX2FyY2hkZWYuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3NCArOTAsNzYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fQVJDSF9IX18KLSNkZWZpbmUgX19BUkNIX0hfXworI2lmbmRlZiBGREtfQVJDSERFRl9ICisjZGVmaW5lIEZES19BUkNIREVGX0gKIAotLyogUGVyZm9ybWFuY2UgLyBRdWFsaXR5IHByb2ZpbGUgc2VsZWN0b3IgKi8KLSAgI2RlZmluZSBGREtfSElHSF9QRVJGT1JNQU5DRQorLyogVW5pZnkgc29tZSBmZXcgdG9vbGNoYWluIHNwZWNpZmljIGRlZmluZXMgdG8gYXZvaWQgaGF2aW5nIGxhcmdlICJvciIgbWFjcm8KKyAqIGNvbnRyYXB0aW9ucyBhbGwgb3ZlciB0aGUgc291cmNlIGNvZGUuICovCiAKLS8qIFVuaWZ5IHNvbWUgZmV3IHRvb2xjaGFpbiBzcGVjaWZpYyBkZWZpbmVzIHRvIGF2b2lkIGhhdmluZyBsYXJnZSAib3IiIG1hY3JvIGNvbnRyYXB0aW9ucyBhbGwgb3ZlciB0aGUgc291cmNlIGNvZGUuICovCi0KLS8qIFRha2UgYWN0aW9uIGFnYWluc3QgVmlzdWFsU3R1ZGlvIDIwMDUgY3Jvc3Njb21waWxlIHByb2JsZW1zLiAqLwotCi0vKiBVc2Ugc2luZ2xlIG1hY3JvICh0aGUgR0NDIGJ1aWx0IGluIG1hY3JvKSBmb3IgYXJjaGl0ZWN0dXJlIGlkZW50aWZpY2F0aW9uIGluZGVwZW5kZW50IG9mIHRoZSBwYXJ0aWN1bGFyIHRvb2xjaGFpbiAqLwotI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQoX19pNjg2X18pIHx8IChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpKSB8fCBkZWZpbmVkIChfX3g4Nl82NF9fKQorLyogVXNlIHNpbmdsZSBtYWNybyAodGhlIEdDQyBidWlsdCBpbiBtYWNybykgZm9yIGFyY2hpdGVjdHVyZSBpZGVudGlmaWNhdGlvbgorICogaW5kZXBlbmRlbnQgb2YgdGhlIHBhcnRpY3VsYXIgdG9vbGNoYWluICovCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykgfHwgIFwKKyAgICBkZWZpbmVkKF9faTY4Nl9fKSB8fCAoZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9JWDg2KSkgfHwgXAorICAgIChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX1g2NCkpIHx8IGRlZmluZWQoX194ODZfNjRfXykKICNkZWZpbmUgX194ODZfXwogI2VuZGlmCiAKLSNpZiAoZGVmaW5lZChfTV9BUk0pIHx8IGRlZmluZWQoX19DQ19BUk0pKSAmJiAhZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fVElfVE1TNDcwX1Y1X18pICYmICFkZWZpbmVkKF9fYXJtX18pCisjaWYgZGVmaW5lZChfTV9BUk0pICYmICFkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19hYXJjaDY0X18pCiAjZGVmaW5lIF9fYXJtX18KICNlbmRpZgogCi0KLQorI2lmIChfX1RBUkdFVF9BUkNIX0FSTSA9PSA1KSB8fCBkZWZpbmVkKF9fVEFSR0VUX0ZFQVRVUkVfRFNQTVVMKSB8fCBcCisgICAgKF9NX0FSTSA9PSA1KSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFSl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN0VNX18pCiAvKiBEZWZpbmUgX19BUk1fQVJDSF81VEVfXyBpZiBhcm12NXRlIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQgICovCi0jaWYgKF9fVEFSR0VUX0FSQ0hfQVJNID09IDUpIHx8IGRlZmluZWQoX19UQVJHRVRfRkVBVFVSRV9EU1BNVUwpIHx8IChfTV9BUk0gPT0gNSkgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVURUpfXykgfHwgZGVmaW5lZChfX1RJX1RNUzQ3MF9WNV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN0VNX18pCiAjZGVmaW5lIF9fQVJNX0FSQ0hfNVRFX18KICNlbmRpZgogCisjaWYgKF9fVEFSR0VUX0FSQ0hfQVJNID09IDYpIHx8IGRlZmluZWQoX19BUk1fQVJDSF82Sl9fKSB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzZaS19fKQogLyogRGVmaW5lIF9fQVJNX0FSQ0hfNl9fIGlmIHRoZSBhcm12NiBpbnRydWN0aW9ucyBhcmUgYmVpbmcgc3VwcG9ydGVkLiAqLwotI2lmIChfX1RBUkdFVF9BUkNIX0FSTSA9PSA2KSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNkpfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZaS19fKQogI2RlZmluZSBfX0FSTV9BUkNIXzVURV9fCiAjZGVmaW5lIF9fQVJNX0FSQ0hfNl9fCiAjZW5kaWYKIAotLyogRGVmaW5lIF9fQVJNX0FSQ0hfN19BX18gaWYgdGhlIGFybXY3IGludHJ1Y3Rpb25zIGFyZSBiZWluZyBzdXBwb3J0ZWQuICovCiAjaWYgZGVmaW5lZChfX1RBUkdFVF9BUkNIXzdfUikgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdSX18pCisvKiBEZWZpbmUgX19BUk1fQVJDSF83X0FfXyBpZiB0aGUgYXJtdjcgaW50cnVjdGlvbnMgYXJlIGJlaW5nIHN1cHBvcnRlZC4gKi8KICNkZWZpbmUgX19BUk1fQVJDSF81VEVfXwogI2RlZmluZSBfX0FSTV9BUkNIXzZfXwogI2RlZmluZSBfX0FSTV9BUkNIXzdfUl9fCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoX19UQVJHRVRfQVJDSF83X0EpIHx8IGRlZmluZWQoX19BUk1fQVJDSF83QV9fKSB8fCBcCisgICAgKChfX0FSTV9BUkNIID09IDgpICYmIChfX0FSTV8zMkJJVF9TVEFURSA9PSAxKSkKIC8qIERlZmluZSBfX0FSTV9BUkNIXzdfQV9fIGlmIHRoZSBhcm12NyBpbnRydWN0aW9ucyBhcmUgYmVpbmcgc3VwcG9ydGVkLiAqLwotI2lmIGRlZmluZWQoX19UQVJHRVRfQVJDSF83X0EpIHx8IGRlZmluZWQoX19BUk1fQVJDSF83QV9fKQogI2RlZmluZSBfX0FSTV9BUkNIXzVURV9fCiAjZGVmaW5lIF9fQVJNX0FSQ0hfNl9fCiAjZGVmaW5lIF9fQVJNX0FSQ0hfN19BX18KICNlbmRpZgogCi0vKiBEZWZpbmUgX19BUk1fQVJDSF83TV9fIGlmIHRoZSBBUk12Ny1NIGluc3RydWN0aW9ucyBhcmUgYmVpbmcgc3VwcG9ydGVkLCBlLmcuIENvcnRleC1NMy4gKi8KICNpZiBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfN19NKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN19NX18pCisvKiBEZWZpbmUgX19BUk1fQVJDSF83TV9fIGlmIHRoZSBBUk12Ny1NIGluc3RydWN0aW9ucyBhcmUgYmVpbmcgc3VwcG9ydGVkLCBlLmcuCisgKiBDb3J0ZXgtTTMuICovCiAjZGVmaW5lIF9fQVJNX0FSQ0hfN01fXwogI2VuZGlmCiAKLS8qIERlZmluZSBfX0FSTV9BUkNIXzdFTV9fIGlmIHRoZSBBUk12Ny1NRSBpbnN0cnVjdGlvbnMgYXJlIGJlaW5nIHN1cHBvcnRlZCwgZS5nLiBDb3J0ZXgtTTQuICovCiAjaWYgZGVmaW5lZChfX1RBUkdFVF9BUkNIXzdFX00pIHx8IGRlZmluZWQoX19BUk1fQVJDSF83RV9NX18pCisvKiBEZWZpbmUgX19BUk1fQVJDSF83RU1fXyBpZiB0aGUgQVJNdjctTUUgaW5zdHJ1Y3Rpb25zIGFyZSBiZWluZyBzdXBwb3J0ZWQsCisgKiBlLmcuIENvcnRleC1NNC4gKi8KICNkZWZpbmUgX19BUk1fQVJDSF83RU1fXwogI2VuZGlmCiAKLS8qIERldGVjdCBhbmQgdW5pZnkgbWFjcm9zIGZvciBuZW9uIGZlYXR1cmUuICovCi0jaWYgZGVmaW5lZChfX1RBUkdFVF9GRUFUVVJFX05FT04pICYmICFkZWZpbmVkKF9fQVJNX05FT05fXykKLSNkZWZpbmUgX19BUk1fTkVPTl9fCisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKyNkZWZpbmUgX19BUk1fQVJDSF84X18KICNlbmRpZgogCiAjaWZkZWYgX01fQVJNCkBAIC0xNTQsMTggKzE2NywyMyBAQAogI2luY2x1ZGUgImFybWludHIuaCIKICNlbmRpZgogCi0KIC8qIERlZmluZSBwcmVmZXJyZWQgTXVsdGlwbGljYXRpb24gdHlwZSAqLwotI2lmIGRlZmluZWQoRkRLX0hJR0hfUEVSRk9STUFOQ0UpICYmICFkZWZpbmVkKEZES19ISUdIX1FVQUxJVFkpIC8qIEZES19ISUdIX1BFUkZPUk1BTkNFICovCiAKLSNpZiBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fc2hfXykKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQogI2RlZmluZSBBUkNIX1BSRUZFUl9NVUxUXzE2eDE2CiAjdW5kZWYgU0lORVRBQkxFXzE2QklUCiAjdW5kZWYgUE9XMkNPRUZGXzE2QklUCiAjdW5kZWYgTERDT0VGRl8xNkJJVAogI3VuZGVmIFdJTkRPV1RBQkxFXzE2QklUCiAKLSNlbGlmIGRlZmluZWQoX19hcm1fXykgJiYgZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNlbGlmIGRlZmluZWQoX19hcm1fXykgJiYgZGVmaW5lZChfX0FSTV9BUkNIXzhfXykKKyNkZWZpbmUgQVJDSF9QUkVGRVJfTVVMVF8zMngxNgorI2RlZmluZSBTSU5FVEFCTEVfMTZCSVQKKyNkZWZpbmUgUE9XMkNPRUZGXzE2QklUCisjZGVmaW5lIExEQ09FRkZfMTZCSVQKKyNkZWZpbmUgV0lORE9XVEFCTEVfMTZCSVQKKworI2VsaWYgZGVmaW5lZChfX2FybV9fKSAmJiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pCiAjZGVmaW5lIEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYKICNkZWZpbmUgU0lORVRBQkxFXzE2QklUCiAjZGVmaW5lIFBPVzJDT0VGRl8xNkJJVApAQCAtMTk0LDcgKzIxMiw3IEBACiAjdW5kZWYgUE9XMkNPRUZGXzE2QklUCiAjdW5kZWYgTERDT0VGRl8xNkJJVAogCi0jZWxpZiBkZWZpbmVkKF9feDg2X18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNlbGlmIGRlZmluZWQoX194ODZfXykKICNkZWZpbmUgQVJDSF9QUkVGRVJfTVVMVF8zMngxNgogI2RlZmluZSBTSU5FVEFCTEVfMTZCSVQKICNkZWZpbmUgV0lORE9XVEFCTEVfMTZCSVQKQEAgLTIwMiw0NCArMjIwLDQwIEBACiAjZGVmaW5lIExEQ09FRkZfMTZCSVQKIAogI2Vsc2UKLQotICAjd2FybmluZyAgPj4+PiBQbGVhc2Ugc2V0IGFyY2hpdGVjdHVyZSBjaGFyYWN0ZXJpemF0aW9uIGRlZmluZXMgZm9yIHlvdXIgcGxhdGZvcm0gKEZES19ISUdIX1BFUkZPUk1BTkNFKSEgPDw8PAorI3dhcm5pbmcgPj4+PiBQbGVhc2Ugc2V0IGFyY2hpdGVjdHVyZSBjaGFyYWN0ZXJpemF0aW9uIGRlZmluZXMgZm9yIHlvdXIgcGxhdGZvcm0gKEZES19ISUdIX1BFUkZPUk1BTkNFKSEgPDw8PAogCiAjZW5kaWYgLyogQXJjaGl0ZWN0dXJlIHN3aXRjaGVzICovCiAKLSNlbHNlIC8qIG5laXRoZXIgRkRLX0hJR0hfUVVBTElUWSBvciBGREtfSElHSF9QRVJGT1JNQU5DRSAqLwotCi0jZXJyb3IgRWl0aGVyIHNldCBGREtfSElHSF9RVUFMSVRZIG9yIEZES19ISUdIX1BFUkZPUk1BTkNFLCBidXQgbm90IGJvdGggbm9yIG5vbmUgb2YgdGhlbS4KLQotI2VuZGlmIC8qIEVuZCBvZiBxdWFsaXR5L2NvbXBsZXhpdHkgdHJhZGVvZmYgKi8KLQotI2RlZmluZSBGREtUT09MU19QQUNLRURfVEFCTEVTCi0KLQogI2lmZGVmIFNJTkVUQUJMRV8xNkJJVAotICAjZGVmaW5lIEZJWFBfU1RCIEZJWFBfU0dMICAgICAvKiBTVEIgc2ludXMgVGFiIHVzZWQgaW4gdHJhbnNmb3JtYXRpb24gKi8KLSAgI2RlZmluZSBGSVhQX1NUUCBGSVhQX1NQSwotICAjZGVmaW5lIFNUQyhhKSAoRlhfREJMMkZYQ09OU1RfU0dMKGEpKQorI2RlZmluZSBGSVhQX1NUQiBGSVhQX1NHTCAvKiBTVEIgc2ludXMgVGFiIHVzZWQgaW4gdHJhbnNmb3JtYXRpb24gKi8KKyNkZWZpbmUgRklYUF9TVFAgRklYUF9TUEsKKyNkZWZpbmUgU1RDKGEpIChGWF9EQkwyRlhDT05TVF9TR0woYSkpCiAjZWxzZQotICAjZGVmaW5lIEZJWFBfU1RCIEZJWFBfREJMCi0gICNkZWZpbmUgRklYUF9TVFAgRklYUF9EUEsKLSAgI2RlZmluZSBTVEMoYSkgKChGSVhQX0RCTCkoTE9ORykoYSkpCisjZGVmaW5lIEZJWFBfU1RCIEZJWFBfREJMCisjZGVmaW5lIEZJWFBfU1RQIEZJWFBfRFBLCisjZGVmaW5lIFNUQyhhKSAoKEZJWFBfREJMKShMT05HKShhKSkKICNlbmRpZiAvKiBkZWZpbmVkKFNJTkVUQUJMRV8xNkJJVCkgKi8KIAotI2RlZmluZSBTVENQKGNvcyxzaW4pIHsgeyBTVEMoY29zKSwgU1RDKHNpbikgfSB9Ci0KKyNkZWZpbmUgU1RDUChjb3MsIHNpbikgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IFNUQyhjb3MpLCBTVEMoc2luKSB9IFwKKyAgfQogCiAjaWZkZWYgV0lORE9XVEFCTEVfMTZCSVQKLSAgI2RlZmluZSBGSVhQX1dUQiBGSVhQX1NHTCAvKiBzaW5nbGUgRklYUF9TR0wgdmFsdWVzICovCi0gICNkZWZpbmUgRklYUF9XVFAgRklYUF9TUEsgLyogcGFja2VkIEZJWFBfU0dMIHZhbHVlcyAqLwotICAjZGVmaW5lIFdUQyhhKSBGWF9EQkwyRlhDT05TVF9TR0woYSkKKyNkZWZpbmUgRklYUF9XVEIgRklYUF9TR0wgLyogc2luZ2xlIEZJWFBfU0dMIHZhbHVlcyAqLworI2RlZmluZSBGWF9EQkwyRlhfV1RCKHgpIEZYX0RCTDJGWF9TR0woeCkKKyNkZWZpbmUgRklYUF9XVFAgRklYUF9TUEsgLyogcGFja2VkIEZJWFBfU0dMIHZhbHVlcyAqLworI2RlZmluZSBXVEMoYSkgRlhfREJMMkZYQ09OU1RfU0dMKGEpCiAjZWxzZSAvKiBTSU5FVEFCTEVfMTZCSVQgKi8KLSAgI2RlZmluZSBGSVhQX1dUQiBGSVhQX0RCTAotICAjZGVmaW5lIEZJWFBfV1RQIEZJWFBfRFBLCi0gICNkZWZpbmUgV1RDKGEpIChGSVhQX0RCTCkoYSkKKyNkZWZpbmUgRklYUF9XVEIgRklYUF9EQkwKKyNkZWZpbmUgRlhfREJMMkZYX1dUQih4KSAoeCkKKyNkZWZpbmUgRklYUF9XVFAgRklYUF9EUEsKKyNkZWZpbmUgV1RDKGEpIChGSVhQX0RCTCkoYSkKICNlbmRpZiAvKiBTSU5FVEFCTEVfMTZCSVQgKi8KIAotI2RlZmluZSBXVENQKGEsYikgeyB7IFdUQyhhKSwgV1RDKGIpIH0gfQorI2RlZmluZSBXVENQKGEsIGIpICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IFdUQyhhKSwgV1RDKGIpIH0gXAorICB9CiAKLQotI2VuZGlmIC8qIF9fQVJDSF9IX18gKi8KKyNlbmRpZiAvKiBGREtfQVJDSERFRl9IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9GREtfYml0YnVmZmVyLmggYi9saWJGREsvaW5jbHVkZS9GREtfYml0YnVmZmVyLmgKaW5kZXggNjVmYTA0Yi4uMTlhMjRiMyAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvRkRLX2JpdGJ1ZmZlci5oCisrKyBiL2xpYkZESy9pbmNsdWRlL0ZES19iaXRidWZmZXIuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw4OCArOTAsODggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCisKICAgIERlc2NyaXB0aW9uOiBjb21tb24gYml0YnVmZmVyIHJlYWQvd3JpdGUgcm91dGluZXMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfX0ZES19CSVRCVUZGRVJfSF9fCi0jZGVmaW5lIF9fRkRLX0JJVEJVRkZFUl9IX18KKyNpZm5kZWYgRkRLX0JJVEJVRkZFUl9ICisjZGVmaW5lIEZES19CSVRCVUZGRVJfSAogCi0KLQorI2luY2x1ZGUgIkZES19hcmNoZGVmLmgiCiAjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCiAKLXR5cGVkZWYgc3RydWN0Ci17CisvKiBsZWF2ZSAzIGJpdHMgaGVhZHJvb20gc28gTUFYX0JVRlNJWkUgY2FuIGJlIHJlcHJlc2VudGVkIGluIGJpdHMgYXMgd2VsbC4gKi8KKyNkZWZpbmUgTUFYX0JVRlNJWkVfQllURVMgKDB4MTAwMDAwMDApCisKK3R5cGVkZWYgc3RydWN0IHsKICAgVUlOVCBWYWxpZEJpdHM7CiAgIFVJTlQgUmVhZE9mZnNldDsKICAgVUlOVCBXcml0ZU9mZnNldDsKLSAgVUlOVCBCaXRDbnQ7CiAgIFVJTlQgQml0TmR4OwogCiAgIFVDSEFSICpCdWZmZXI7Ci0gIFVJTlQgICBidWZTaXplOwotICBVSU5UICAgYnVmQml0czsKKyAgVUlOVCBidWZTaXplOworICBVSU5UIGJ1ZkJpdHM7CiB9IEZES19CSVRCVUY7CiAKIHR5cGVkZWYgRkRLX0JJVEJVRiAqSEFORExFX0ZES19CSVRCVUY7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgoteworZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotZXh0ZXJuIGNvbnN0IFVJTlQgQml0TWFzayBbMzIrMV07CitleHRlcm4gY29uc3QgVUlOVCBCaXRNYXNrWzMyICsgMV07CiAKIC8qKiAgVGhlIEJpdEJ1ZmZlciBGdW5jdGlvbnMgYXJlIGNhbGxlZCBzdHJhaWdodCBmcm9tIEZES19iaXRzdHJlYW0gSW50ZXJmYWNlLgogICAgICBGb3IgRnVuY3Rpb25zIGZ1bmN0aW9uYWwgc3VydmV5IGxvb2sgdGhlcmUuCiAqLwogCi12b2lkIEZES19DcmVhdGVCaXRCdWZmZXIgKEhBTkRMRV9GREtfQklUQlVGICpoQml0QnVmZmVyLCBVQ0hBUiAqcEJ1ZmZlciwgVUlOVCBidWZTaXplKSA7Cit2b2lkIEZES19DcmVhdGVCaXRCdWZmZXIoSEFORExFX0ZES19CSVRCVUYgKmhCaXRCdWZmZXIsIFVDSEFSICpwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSk7CiAKLXZvaWQgRkRLX0luaXRCaXRCdWZmZXIgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgVUNIQVIgKnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSwgVUlOVCB2YWxpZEJpdHMpIDsKK3ZvaWQgRkRLX0luaXRCaXRCdWZmZXIoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgVUNIQVIgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSwgVUlOVCB2YWxpZEJpdHMpOwogCi12b2lkIEZES19SZXNldEJpdEJ1ZmZlciAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIpIDsKK3ZvaWQgRkRLX1Jlc2V0Qml0QnVmZmVyKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIpOwogCi12b2lkIEZES19EZWxldGVCaXRCdWZmZXIgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIpIDsKK3ZvaWQgRkRLX0RlbGV0ZUJpdEJ1ZmZlcihIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyKTsKIAotSU5UICBGREtfZ2V0ICAgICAgICAgICAgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykgOworSU5UIEZES19nZXQoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpOwogCi1JTlQgIEZES19nZXQzMiAgICAgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIpIDsKK0lOVCBGREtfZ2V0MzIoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1Zik7CiAKLXZvaWQgRkRLX3B1dCAgICAgICAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgVUlOVCB2YWx1ZSwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpIDsKK3ZvaWQgRkRLX3B1dChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBVSU5UIHZhbHVlLCBjb25zdCBVSU5UIG51bWJlck9mQml0cyk7CiAKLUlOVCAgRkRLX2dldEJ3ZCAgICAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpOwotdm9pZCBGREtfcHV0QndkICAgICAgICAgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBVSU5UIHZhbHVlLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykgOworSU5UIEZES19nZXRCd2QoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpOwordm9pZCBGREtfcHV0QndkKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIFVJTlQgdmFsdWUsCisgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpOwogCi12b2lkIEZES19wdXNoQmFjayAgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzLCBVQ0hBUiBjb25maWcpIDsKLXZvaWQgRkRLX3B1c2hGb3J3YXJkICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMsIFVDSEFSIGNvbmZpZykgOwordm9pZCBGREtfcHVzaEJhY2soSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMsCisgICAgICAgICAgICAgICAgICBVQ0hBUiBjb25maWcpOwogCi12b2lkIEZES19ieXRlQWxpZ24gICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIFVDSEFSIGNvbmZpZykgOwordm9pZCBGREtfcHVzaEZvcndhcmQoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMsCisgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBjb25maWcpOwogCi1VSU5UIEZES19nZXRWYWxpZEJpdHMgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIpIDsKLUlOVCAgRkRLX2dldEZyZWVCaXRzICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlcikgOworVUlOVCBGREtfZ2V0VmFsaWRCaXRzKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIpOwogCi12b2lkIEZES19zZXRCaXRDbnQgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgdmFsdWUpIDsKLUlOVCAgRkRLX2dldEJpdENudCAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlcikgOworSU5UIEZES19nZXRGcmVlQml0cyhIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyKTsKIAotdm9pZCBGREtfRmVlZCAgICAgICAgICAgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBVQ0hBUiBpbnB1dEJ1ZmZlciBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBidWZmZXJTaXplLCBVSU5UICpieXRlc1ZhbGlkKSA7Cit2b2lkIEZES19GZWVkKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVDSEFSIGlucHV0QnVmZmVyW10sCisgICAgICAgICAgICAgIGNvbnN0IFVJTlQgYnVmZmVyU2l6ZSwgVUlOVCAqYnl0ZXNWYWxpZCk7CiAKLXZvaWQgRkRLX0NvcHkgICAgICAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZkRzdCwgSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZlNyYywgVUlOVCAqYnl0ZXNWYWxpZCkgOwordm9pZCBGREtfQ29weShIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmRHN0LCBIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmU3JjLAorICAgICAgICAgICAgICBVSU5UICpieXRlc1ZhbGlkKTsKIAotdm9pZCBGREtfRmV0Y2ggICAgICAgICAgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBVQ0hBUiBvdXRCdWZbXSwgVUlOVCAqd3JpdGVCeXRlcyk7Ci0KK3ZvaWQgRkRLX0ZldGNoKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIFVDSEFSIG91dEJ1ZltdLCBVSU5UICp3cml0ZUJ5dGVzKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKIAotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL0ZES19iaXRzdHJlYW0uaCBiL2xpYkZESy9pbmNsdWRlL0ZES19iaXRzdHJlYW0uaAppbmRleCBmYzhkN2RlLi5mNzk5MDI2IDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9GREtfYml0c3RyZWFtLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvRkRLX2JpdHN0cmVhbS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE5ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKKwogICAgRGVzY3JpcHRpb246IGJpdHN0cmVhbSBpbnRlcmZhY2UgdG8gYml0YnVmZmVyIHJvdXRpbmVzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX19GREtfQklUU1RSRUFNX0hfXwotI2RlZmluZSBfX0ZES19CSVRTVFJFQU1fSF9fCi0KLQorI2lmbmRlZiBGREtfQklUU1RSRUFNX0gKKyNkZWZpbmUgRkRLX0JJVFNUUkVBTV9ICiAKICNpbmNsdWRlICJGREtfYml0YnVmZmVyLmgiCiAjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCkBAIC0xMDAsMjEgKzExMCwxOCBAQAogCiAjZGVmaW5lIENBQ0hFX0JJVFMgMzIKIAotdHlwZWRlZiBlbnVtIHsKLSAgICBCU19SRUFERVIsCi0gICAgQlNfV1JJVEVSCi19IEZES19CU19DRkc7CisjZGVmaW5lIEJVRlNJWkVfRFVNTVlfVkFMVUUgTUFYX0JVRlNJWkVfQllURVMKIAordHlwZWRlZiBlbnVtIHsgQlNfUkVBREVSLCBCU19XUklURVIgfSBGREtfQlNfQ0ZHOwogCi10eXBlZGVmIHN0cnVjdAotewotICBVSU5UICAgICAgIENhY2hlV29yZCA7Ci0gIFVJTlQgICAgICAgQml0c0luQ2FjaGUgOwordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UIENhY2hlV29yZDsKKyAgVUlOVCBCaXRzSW5DYWNoZTsKICAgRkRLX0JJVEJVRiBoQml0QnVmOwotICBVSU5UICAgICAgIENvbmZpZ0NhY2hlIDsKKyAgVUlOVCBDb25maWdDYWNoZTsKIH0gRkRLX0JJVFNUUkVBTTsKIAotdHlwZWRlZiBGREtfQklUU1RSRUFNKiBIQU5ETEVfRkRLX0JJVFNUUkVBTTsKK3R5cGVkZWYgRkRLX0JJVFNUUkVBTSAqSEFORExFX0ZES19CSVRTVFJFQU07CiAKIC8qKgogICogXGJyaWVmIENyZWF0ZUJpdFN0cmVhbSBGdW5jdGlvbi4KQEAgLTEyMiw1MCArMTI5LDQ4IEBACiAgKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYml0c3RyZWFtIHdpdGggZXh0ZXJuIGFsbG9jYXRlZCBidWZmZXIuCiAgKgogICogXHBhcmFtIHBCdWZmZXIgIFBvaW50ZXIgdG8gQml0QnVmZmVyIGFycmF5LgotICogXHBhcmFtIGJ1ZlNpemUgIExlbmd0aCBvZiBCaXRCdWZmZXIgYXJyYXkuIChhd2FpdHMgc2l6ZSAyXm4pCisgKiBccGFyYW0gYnVmU2l6ZSAgTGVuZ3RoIG9mIEJpdEJ1ZmZlciBhcnJheS4gKGF3YWl0cyBzaXplIDJebiBhbmQgPD0KKyAqIE1BWF9CVUZTSVpFX0JZVEVTKQogICogXHBhcmFtIGNvbmZpZyAgIEluaXRpYWxpemUgQml0U3RyZWFtIGFzIFJlYWRlciBvciBXcml0ZXIuCiAgKi8KIEZES19JTkxJTkUKLUhBTkRMRV9GREtfQklUU1RSRUFNIEZES2NyZWF0ZUJpdFN0cmVhbSAoVUNIQVIgKnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLX0JTX0NGRyBjb25maWcgPSBCU19SRUFERVIpCi17Ci0gIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0gPSAoSEFORExFX0ZES19CSVRTVFJFQU0pIEZES2NhbGxvYygxLCBzaXplb2YoRkRLX0JJVFNUUkVBTSkpOwotICBGREtfSW5pdEJpdEJ1ZmZlcigmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgcEJ1ZmZlciwgYnVmU2l6ZSwgMCkgOworSEFORExFX0ZES19CSVRTVFJFQU0gRkRLY3JlYXRlQml0U3RyZWFtKFVDSEFSICpwQnVmZmVyLCBVSU5UIGJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLX0JTX0NGRyBjb25maWcgPSBCU19SRUFERVIpIHsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSA9CisgICAgICAoSEFORExFX0ZES19CSVRTVFJFQU0pRkRLY2FsbG9jKDEsIHNpemVvZihGREtfQklUU1RSRUFNKSk7CisgIGlmIChoQml0U3RyZWFtID09IE5VTEwpIHJldHVybiBOVUxMOworICBGREtfSW5pdEJpdEJ1ZmZlcigmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgcEJ1ZmZlciwgYnVmU2l6ZSwgMCk7CiAKICAgLyogaW5pdCBjYWNoZSAqLwotICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IDAgOwotICBoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9IGNvbmZpZyA7CisgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gMDsKKyAgaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPSBjb25maWc7CiAKLSAgcmV0dXJuIGhCaXRTdHJlYW0gOworICByZXR1cm4gaEJpdFN0cmVhbTsKIH0KIAotCiAvKioKLSAqIFxicmllZiBJbml0aWFsaXplIEJpc3RyZWFtQnVmZmVyLiBCaXRCdWZmZXIgY2FuIHBvaW50IHRvIGZpbGxlZCBCaXRCdWZmZXIgYXJyYXkgLgorICogXGJyaWVmIEluaXRpYWxpemUgQmlzdHJlYW1CdWZmZXIuIEJpdEJ1ZmZlciBjYW4gcG9pbnQgdG8gZmlsbGVkIEJpdEJ1ZmZlcgorICogYXJyYXkgLgogICoKICAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQogICogXHBhcmFtIHBCdWZmZXIgICAgUG9pbnRlciB0byBCaXRCdWZmZXIgYXJyYXkuCi0gKiBccGFyYW0gYnVmU2l6ZSAgICBMZW5ndGggb2YgQml0QnVmZmVyIGFycmF5LiAoYXdhaXRzIHNpemUgMl5uKQorICogXHBhcmFtIGJ1ZlNpemUgICAgTGVuZ3RoIG9mIEJpdEJ1ZmZlciBhcnJheSBpbiBieXRlcy4gKGF3YWl0cyBzaXplIDJebiBhbmQgPD0KKyAqIE1BWF9CVUZTSVpFX0JZVEVTKQogICogXHBhcmFtIHZhbGlkQml0cyAgTnVtYmVyIG9mIHZhbGlkIEJpdEJ1ZmZlciBmaWxsZWQgQml0cy4KICAqIFxwYXJhbSBjb25maWcgICAgIEluaXRpYWxpemUgQml0U3RyZWFtIGFzIFJlYWRlciBvciBXcml0ZXIuCiAgKiBccmV0dXJuIHZvaWQKICAqLwogRkRLX0lOTElORQotdm9pZCBGREtpbml0Qml0U3RyZWFtIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBidWZTaXplLAotICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHZhbGlkQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgRkRLX0JTX0NGRyBjb25maWcgPSBCU19SRUFERVIpCi17Ci0gIEZES19Jbml0Qml0QnVmZmVyKCZoQml0U3RyZWFtLT5oQml0QnVmLCBwQnVmZmVyLCBidWZTaXplLCB2YWxpZEJpdHMpIDsKK3ZvaWQgRkRLaW5pdEJpdFN0cmVhbShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBVQ0hBUiAqcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICBVSU5UIGJ1ZlNpemUsIFVJTlQgdmFsaWRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgIEZES19CU19DRkcgY29uZmlnID0gQlNfUkVBREVSKSB7CisgIEZES19Jbml0Qml0QnVmZmVyKCZoQml0U3RyZWFtLT5oQml0QnVmLCBwQnVmZmVyLCBidWZTaXplLCB2YWxpZEJpdHMpOwogCiAgIC8qIGluaXQgY2FjaGUgKi8KLSAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSAwIDsKLSAgaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPSBjb25maWcgOworICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IDA7CisgIGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlID0gY29uZmlnOwogfQogCi0KIC8qKgogICogXGJyaWVmIFJlc2V0Qml0YnVmZmVyIEZ1bmN0aW9uLiBSZXNldCBzdGF0ZXMgaW4gQml0QnVmZmVyIGFuZCBDYWNoZS4KICAqCkBAIC0xNzMsMTgzICsxNzgsMjA2IEBACiAgKiBccGFyYW0gY29uZmlnICAgICBJbml0aWFsaXplIEJpdFN0cmVhbSBhcyBSZWFkZXIgb3IgV3JpdGVyLgogICogXHJldHVybiB2b2lkCiAgKi8KLUZES19JTkxJTkUgdm9pZCBGREtyZXNldEJpdGJ1ZmZlciggSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgRkRLX0JTX0NGRyBjb25maWcgPSBCU19SRUFERVIpCi17Ci0gIEZES19SZXNldEJpdEJ1ZmZlciggJmhCaXRTdHJlYW0tPmhCaXRCdWYgKSA7CitGREtfSU5MSU5FIHZvaWQgRkRLcmVzZXRCaXRidWZmZXIoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREtfQlNfQ0ZHIGNvbmZpZyA9IEJTX1JFQURFUikgeworICBGREtfUmVzZXRCaXRCdWZmZXIoJmhCaXRTdHJlYW0tPmhCaXRCdWYpOwogCiAgIC8qIGluaXQgY2FjaGUgKi8KLSAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSAwIDsKLSAgaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPSBjb25maWcgOworICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IDA7CisgIGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlID0gY29uZmlnOwogfQogCi0KIC8qKiBEZWxldGVCaXRTdHJlYW0uCiAKICAgICBEZWxldGVzIHRoZSBpbiBDcmVhdGUgQml0c3RyZWFtIGFsbG9jYXRlZCBCaXRTdHJlYW0gYW5kIEJpdEJ1ZmZlci4KICovCi1GREtfSU5MSU5FIHZvaWQgRkRLZGVsZXRlQml0U3RyZWFtIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQotewotICBGREtfRGVsZXRlQml0QnVmZmVyKCZoQml0U3RyZWFtLT5oQml0QnVmKSA7Ci0gIEZES2ZyZWUoaEJpdFN0cmVhbSkgOworRkRLX0lOTElORSB2b2lkIEZES2RlbGV0ZUJpdFN0cmVhbShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKSB7CisgIEZES19EZWxldGVCaXRCdWZmZXIoJmhCaXRTdHJlYW0tPmhCaXRCdWYpOworICBGREtmcmVlKGhCaXRTdHJlYW0pOwogfQogCi0KIC8qKgotICogXGJyaWVmIFJlYWRCaXRzIEZ1bmN0aW9uIChmb3J3YXJkKS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbnVtYmVyIG9mIHNlcXVlbnRpYWwKLSAqICAgICAgICBiaXRzIGZyb20gdGhlIGlucHV0IGJpdHN0cmVhbS4KKyAqIFxicmllZiBSZWFkQml0cyBGdW5jdGlvbiAoZm9yd2FyZCkuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG51bWJlciBvZgorICogc2VxdWVudGlhbCBiaXRzIGZyb20gdGhlIGlucHV0IGJpdHN0cmVhbS4KICAqCiAgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKLSAqIFxwYXJhbSBudW1iZXJPZkJpdHMgIFRoZSBudW1iZXIgb2YgYml0cyB0byBiZSByZXRyaWV2ZWQuCisgKiBccGFyYW0gbnVtYmVyT2ZCaXRzICBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgcmV0cmlldmVkLiAoICgwKSwxIDw9CisgKiBudW1iZXJPZkJpdHMgPD0gMzIpCiAgKiBccmV0dXJuIHRoZSByZXF1ZXN0ZWQgYml0cywgcmlnaHQgYWxpZ25lZAogICogXHJldHVybgogICovCi0jZGVmaW5lIE9QVElNSVpFX0ZES1JFQURCSVRTCiAKIEZES19JTkxJTkUgVUlOVCBGREtyZWFkQml0cyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpCi17Ci0jaWZkZWYgbm9PUFRJTUlaRV9GREtSRUFEQklUUwotICBJTlQgbWlzc2luZ0JpdHMgPSBudW1iZXJPZkJpdHMgLSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZTsKLSAgaWYgKG1pc3NpbmdCaXRzID4gMCkKLSAgewotICAgIFVJTlQgYml0cyA9IGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBtaXNzaW5nQml0czsKLSAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSBGREtfZ2V0MzIgKCZoQml0U3RyZWFtLT5oQml0QnVmKSA7Ci0gICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSBDQUNIRV9CSVRTIC0gbWlzc2luZ0JpdHM7Ci0gICAgcmV0dXJuICggYml0cyB8IChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPj4gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpKSAmIEJpdE1hc2tbbnVtYmVyT2ZCaXRzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykgeworICBVSU5UIGJpdHMgPSAwOworICBJTlQgbWlzc2luZ0JpdHMgPSAoSU5UKW51bWJlck9mQml0cyAtIChJTlQpaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGU7CisKKyAgRkRLX0FTU0VSVChudW1iZXJPZkJpdHMgPD0gMzIpOworICBpZiAobWlzc2luZ0JpdHMgPiAwKSB7CisgICAgaWYgKG1pc3NpbmdCaXRzICE9IDMyKSBiaXRzID0gaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IG1pc3NpbmdCaXRzOworICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IEZES19nZXQzMigmaEJpdFN0cmVhbS0+aEJpdEJ1Zik7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gQ0FDSEVfQklUUzsKICAgfQogCiAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIC09IG51bWJlck9mQml0czsKLSAgcmV0dXJuICggaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID4+IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSAmIEJpdE1hc2tbbnVtYmVyT2ZCaXRzXTsKIAotI2Vsc2UKLSAgY29uc3QgVUlOVCB2YWxpZE1hc2sgPSBCaXRNYXNrIFtudW1iZXJPZkJpdHNdIDsKLQotICBpZiAoaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPD0gbnVtYmVyT2ZCaXRzKQotICB7Ci0gICAgY29uc3QgSU5UIGZyZWVCaXRzID0gKENBQ0hFX0JJVFMtMSkgLSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA7Ci0KLSAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IGZyZWVCaXRzKSB8IEZES19nZXQgKCZoQml0U3RyZWFtLT5oQml0QnVmLGZyZWVCaXRzKSA7Ci0gICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gZnJlZUJpdHMgOwotICB9Ci0KLSAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgLT0gbnVtYmVyT2ZCaXRzIDsKLQotICByZXR1cm4gKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA+PiBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgJiB2YWxpZE1hc2sgOwotI2VuZGlmCisgIHJldHVybiAoYml0cyB8IChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPj4gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpKSAmCisgICAgICAgICBCaXRNYXNrW251bWJlck9mQml0c107CiB9CiAKLUZES19JTkxJTkUgVUlOVCBGREtyZWFkQml0KEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17Ci0jaWZkZWYgT1BUSU1JWkVfRkRLUkVBREJJVFMKLSAgaWYgKCFoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkKLSAgewotICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IEZES19nZXQzMiAoJmhCaXRTdHJlYW0tPmhCaXRCdWYpOwotICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gQ0FDSEVfQklUUzsKK0ZES19JTkxJTkUgVUlOVCBGREtyZWFkQml0KEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKKyAgaWYgKCFoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgeworICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IEZES19nZXQzMigmaEJpdFN0cmVhbS0+aEJpdEJ1Zik7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSBDQUNIRV9CSVRTIC0gMTsKKyAgICByZXR1cm4gaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID4+IDMxOwogICB9CiAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlLS07CiAKICAgcmV0dXJuIChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPj4gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpICYgMTsKLSNlbHNlCi0gcmV0dXJuIEZES3JlYWRCaXRzKGhCaXRTdHJlYW0sMSk7Ci0jZW5kaWYKIH0KIAogLyoqCi0gKiBcYnJpZWYgUmVhZDJCaXRzIEZ1bmN0aW9uIChmb3J3YXJkKS4gVGhpcyBmdW5jdGlvbiAyIHNlcXVlbnRpYWwKKyAqIFxicmllZiBSZWFkMkJpdHMgRnVuY3Rpb24gKGZvcndhcmQpLiBUaGlzIGZ1bmN0aW9uIHJlYWRzIDIgc2VxdWVudGlhbAogICogICAgICAgIGJpdHMgZnJvbSB0aGUgaW5wdXQgYml0c3RyZWFtLiBJdCBpcyB0aGUgb3B0aW1pemVkIHZlcnNpb24KLSAgICAgICAgICBvZiBGREtyZWFkQml0cygpIGZvciByZWFkaWduIDIgYml0cy4KKyAgICAgICAgICBvZiBGREtyZWFkQml0cygpIGZvciByZWFkaW5nIDIgYml0cy4KICAqCiAgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKICAqIFxyZXR1cm4gdGhlIHJlcXVlc3RlZCBiaXRzLCByaWdodCBhbGlnbmVkCiAgKiBccmV0dXJuCiAgKi8KLWlubGluZSBVSU5UIEZES3JlYWQyQml0cyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQotewotICBVSU5UIEJpdHNJbkNhY2hlID0gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGU7Ci0gIGlmIChCaXRzSW5DYWNoZSA8IDIpICAvKiBDb21wYXJpc29uIGNoYW5nZWQgZnJvbSAnbGVzcy1lcXVhbCcgdG8gJ2xlc3MnICovCi0gIHsKLSAgICBjb25zdCBJTlQgZnJlZUJpdHMgPSAoQ0FDSEVfQklUUy0xKSAtIEJpdHNJbkNhY2hlIDsKLQotICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPDwgZnJlZUJpdHMpIHwgRkRLX2dldCAoJmhCaXRTdHJlYW0tPmhCaXRCdWYsZnJlZUJpdHMpIDsKLSAgICBCaXRzSW5DYWNoZSArPSBmcmVlQml0czsKK0ZES19JTkxJTkUgVUlOVCBGREtyZWFkMkJpdHMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgeworICAvKgorICAqKiBWZXJzaW9uIGNvcnJlc3BvbmRzIHRvIG9wdGltaXplZCBGREtyZWFkQml0cyBpbXBsZW1lbnRhdGlvbgorICAqKiBjYWxsaW5nIEZES19nZXQzMiwgdGhhdCBrZWVwcyByZWFkIHBvaW50ZXIgYWxpZ25lZC4KKyAgKi8KKyAgVUlOVCBiaXRzID0gMDsKKyAgSU5UIG1pc3NpbmdCaXRzID0gMiAtIChJTlQpaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGU7CisgIGlmIChtaXNzaW5nQml0cyA+IDApIHsKKyAgICBiaXRzID0gaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IG1pc3NpbmdCaXRzOworICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IEZES19nZXQzMigmaEJpdFN0cmVhbS0+aEJpdEJ1Zik7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gQ0FDSEVfQklUUzsKICAgfQotICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IEJpdHNJbkNhY2hlIC0gMjsKLSAgcmV0dXJuIChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPj4gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpICYgMHgzOworCisgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIC09IDI7CisKKyAgcmV0dXJuIChiaXRzIHwgKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA+PiBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkpICYgMHgzOwogfQogCiAvKioKLSAqIFxicmllZiBSZWFkQml0cyBGdW5jdGlvbiAoYmFja3dhcmQpLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBudW1iZXIgb2Ygc2VxdWVudGlhbCBiaXRzCi0gKiAgICAgICAgZnJvbSB0aGUgaW5wdXQgYml0c3RyZWFtLgorICogXGJyaWVmIFJlYWRCaXRzIEZ1bmN0aW9uIChiYWNrd2FyZCkuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG51bWJlciBvZgorICogc2VxdWVudGlhbCBiaXRzIGZyb20gdGhlIGlucHV0IGJpdHN0cmVhbS4KICAqCiAgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKICAqIFxwYXJhbSBudW1iZXJPZkJpdHMgIFRoZSBudW1iZXIgb2YgYml0cyB0byBiZSByZXRyaWV2ZWQuCiAgKiBccmV0dXJuIHRoZSByZXF1ZXN0ZWQgYml0cywgcmlnaHQgYWxpZ25lZAogICovCiBGREtfSU5MSU5FIFVJTlQgRkRLcmVhZEJpdHNCd2QoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQotewotICBjb25zdCBVSU5UIHZhbGlkTWFzayA9IEJpdE1hc2sgW251bWJlck9mQml0c10gOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSB7CisgIGNvbnN0IFVJTlQgdmFsaWRNYXNrID0gQml0TWFza1tudW1iZXJPZkJpdHNdOwogCi0gIGlmIChoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA8PSBudW1iZXJPZkJpdHMpCi0gIHsKLSAgICBjb25zdCBJTlQgZnJlZUJpdHMgPSAoQ0FDSEVfQklUUy0xKSAtIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIDsKKyAgaWYgKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIDw9IG51bWJlck9mQml0cykgeworICAgIGNvbnN0IElOVCBmcmVlQml0cyA9IChDQUNIRV9CSVRTIC0gMSkgLSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZTsKIAotICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPDwgZnJlZUJpdHMpIHwgRkRLX2dldEJ3ZCAoJmhCaXRTdHJlYW0tPmhCaXRCdWYsZnJlZUJpdHMpIDsKLSAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArPSBmcmVlQml0cyA7CisgICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBmcmVlQml0cykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES19nZXRCd2QoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIGZyZWVCaXRzKTsKKyAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArPSBmcmVlQml0czsKICAgfQogCi0gIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIC09IG51bWJlck9mQml0cyA7CisgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIC09IG51bWJlck9mQml0czsKIAotICByZXR1cm4gKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA+PiBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgJiB2YWxpZE1hc2sgOworICByZXR1cm4gKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA+PiBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgJiB2YWxpZE1hc2s7CiB9CiAKKy8qKgorICogXGJyaWVmIHJlYWQgYW4gaW50ZWdlciB2YWx1ZSB1c2luZyBhIHZhcnlpbmcgbnVtYmVyIG9mIGJpdHMgZnJvbSB0aGUKKyAqIGJpdHN0cmVhbQorICoKKyAqICAgICAgICBxLnYuIElTTy9JRUMgRkRJUyAyMzAwMy0zICBUYWJsZSAxNgorICoKKyAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQorICogXHBhcmFtIG5CaXRzMSAgbnVtYmVyIG9mIGJpdHMgdG8gcmVhZCBmb3IgYSBzbWFsbCBpbnRlZ2VyIHZhbHVlIG9yIGVzY2FwZQorICogdmFsdWUKKyAqIFxwYXJhbSBuQml0czIgIG51bWJlciBvZiBiaXRzIHRvIHJlYWQgZm9yIGEgbWVkaXVtIHNpemVkIGludGVnZXIgdmFsdWUgb3IKKyAqIGVzY2FwZSB2YWx1ZQorICogXHBhcmFtIG5CaXRzMyAgbnVtYmVyIG9mIGJpdHMgdG8gcmVhZCBmb3IgYSBsYXJnZSBpbnRlZ2VyIHZhbHVlCisgKiBccmV0dXJuIGludGVnZXIgdmFsdWUgcmVhZCBmcm9tIGJpdHN0cmVhbQorICovCitGREtfSU5MSU5FIFVJTlQgZXNjYXBlZFZhbHVlKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGludCBuQml0czEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQml0czIsIGludCBuQml0czMpIHsKKyAgVUlOVCB2YWx1ZSA9IEZES3JlYWRCaXRzKGhCaXRTdHJlYW0sIG5CaXRzMSk7CisKKyAgaWYgKHZhbHVlID09IChVSU5UKSgxIDw8IG5CaXRzMSkgLSAxKSB7CisgICAgVUlOVCB2YWx1ZUFkZCA9IEZES3JlYWRCaXRzKGhCaXRTdHJlYW0sIG5CaXRzMik7CisgICAgdmFsdWUgKz0gdmFsdWVBZGQ7CisgICAgaWYgKHZhbHVlQWRkID09IChVSU5UKSgxIDw8IG5CaXRzMikgLSAxKSB7CisgICAgICB2YWx1ZSArPSBGREtyZWFkQml0cyhoQml0U3RyZWFtLCBuQml0czMpOworICAgIH0KKyAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KIAogLyoqCiAgKiBcYnJpZWYgcmV0dXJuIGEgbnVtYmVyIG9mIGJpdHMgZnJvbSB0aGUgYml0QnVmZmVyLgotICogICAgICAgIFlvdSBoYXZlIHRvIGtub3cgd2hhdCB5b3UgZG8hIENhY2hlIGhhcyB0byBiZSBzeW5jaHJvbml6ZWQgYmVmb3JlIHVzaW5nIHRoaXMKLSAqICAgICAgICBmdW5jdGlvbi4KKyAqICAgICAgICBZb3UgaGF2ZSB0byBrbm93IHdoYXQgeW91IGRvISBDYWNoZSBoYXMgdG8gYmUgc3luY2hyb25pemVkIGJlZm9yZQorICogdXNpbmcgdGhpcyBmdW5jdGlvbi4KICAqCiAgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKICAqIFxwYXJhbSBudW1CaXRzIFRoZSBudW1iZXIgb2YgYml0cyB0byBiZSByZXRyaWV2ZWQuCiAgKiBccmV0dXJuIHRoZSByZXF1ZXN0ZWQgYml0cywgcmlnaHQgYWxpZ25lZAogICovCi1GREtfSU5MSU5FIFVJTlQgRkRLZ2V0Qml0cyAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgVUlOVCBudW1CaXRzKQotewotICAgIHJldHVybiBGREtfZ2V0ICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgbnVtQml0cykgOworRkRLX0lOTElORSBVSU5UIEZES2dldEJpdHMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgVUlOVCBudW1CaXRzKSB7CisgIHJldHVybiBGREtfZ2V0KCZoQml0U3RyZWFtLT5oQml0QnVmLCBudW1CaXRzKTsKIH0KIAotCiAvKioKLSAqIFxicmllZiBXcml0ZUJpdHMgRnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd3JpdGVzIG51bWJlck9mQml0cyBvZiB2YWx1ZSBpbnRvIGJpdHN0cmVhbS4KKyAqIFxicmllZiBXcml0ZUJpdHMgRnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd3JpdGVzIG51bWJlck9mQml0cyBvZiB2YWx1ZSBpbnRvCisgKiBiaXRzdHJlYW0uCiAgKgogICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCi0gKiBccGFyYW0gdmFsdWUgICAgICAgICBWYXJpYWJsZSBob2xkcyBkYXRhIHRvIGJlIHdyaXR0ZW4uCi0gKiBccGFyYW0gbnVtYmVyT2ZCaXRzICBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgd3JpdHRlbi4KLSAqIFxyZXR1cm4gbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgorICogXHBhcmFtIHZhbHVlICAgICAgICAgVGhlIGRhdGEgdG8gYmUgd3JpdHRlbgorICogXHBhcmFtIG51bWJlck9mQml0cyAgVGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIHdyaXR0ZW4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgIE51bWJlciBvZiBiaXRzIHdyaXR0ZW4KICAqLwogRkRLX0lOTElORSBVQ0hBUiBGREt3cml0ZUJpdHMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgVUlOVCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQotewotICBjb25zdCBVSU5UIHZhbGlkTWFzayA9IEJpdE1hc2sgW251bWJlck9mQml0c10gOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpIHsKKyAgY29uc3QgVUlOVCB2YWxpZE1hc2sgPSBCaXRNYXNrW251bWJlck9mQml0c107CiAKLSAgaWYgKChoQml0U3RyZWFtLT5CaXRzSW5DYWNoZStudW1iZXJPZkJpdHMpIDwgQ0FDSEVfQklUUykKLSAgewotICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlICs9IG51bWJlck9mQml0cyA7Ci0gICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkICAgPSAgKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBudW1iZXJPZkJpdHMpIHwgKHZhbHVlICYgdmFsaWRNYXNrKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBGREtfcHV0KCZoQml0U3RyZWFtLT5oQml0QnVmLCBoQml0U3RyZWFtLT5DYWNoZVdvcmQsIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSA7Ci0gICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSBudW1iZXJPZkJpdHMgOwotICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCAgID0gKHZhbHVlICYgdmFsaWRNYXNrKSA7CisgIGlmIChoQml0U3RyZWFtID09IE5VTEwpIHsKKyAgICByZXR1cm4gbnVtYmVyT2ZCaXRzOwogICB9CiAKLSByZXR1cm4gbnVtYmVyT2ZCaXRzOworICBpZiAoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlICsgbnVtYmVyT2ZCaXRzKSA8IENBQ0hFX0JJVFMpIHsKKyAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArPSBudW1iZXJPZkJpdHM7CisgICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0KKyAgICAgICAgKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBudW1iZXJPZkJpdHMpIHwgKHZhbHVlICYgdmFsaWRNYXNrKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBQdXQgYWx3YXlzIDMyIGJpdHMgaW50byBtZW1vcnkgICAgICAgICAgICAgKi8KKyAgICAvKiAtIGZpbGwgY2FjaGUncyBMU0JpdHMgd2l0aCBNU0JpdHMgb2YgdmFsdWUgKi8KKyAgICAvKiAtIHN0b3JlIDMyIGJpdHMgaW4gbWVtb3J5IHVzaW5nIHN1YnJvdXRpbmUgKi8KKyAgICAvKiAtIGZpbGwgcmVtYWluaW5nIGJpdHMgaW50byBjYWNoZSdzIExTQml0cyAgKi8KKyAgICAvKiAtIHVwcGVyIGJpdHMgaW4gY2FjaGUgYXJlIGRvbid0IGNhcmUgICAgICAgKi8KKworICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgZmlsbGVkIGludG8gY2FjaGUgKi8KKyAgICBpbnQgbWlzc2luZ19iaXRzID0gQ0FDSEVfQklUUyAtIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlOworICAgIGludCByZW1haW5pbmdfYml0cyA9IG51bWJlck9mQml0cyAtIG1pc3NpbmdfYml0czsKKyAgICB2YWx1ZSA9IHZhbHVlICYgdmFsaWRNYXNrOworICAgIC8qIEF2b2lkIHNoaWZ0IGxlZnQgYnkgMzIgcG9zaXRpb25zICovCisgICAgVUlOVCBDYWNoZVdvcmQgPQorICAgICAgICAobWlzc2luZ19iaXRzID09IDMyKSA/IDAgOiAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IG1pc3NpbmdfYml0cyk7CisgICAgQ2FjaGVXb3JkIHw9ICh2YWx1ZSA+PiAocmVtYWluaW5nX2JpdHMpKTsKKyAgICBGREtfcHV0KCZoQml0U3RyZWFtLT5oQml0QnVmLCBDYWNoZVdvcmQsIDMyKTsKKworICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IHZhbHVlOworICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gcmVtYWluaW5nX2JpdHM7CisgIH0KKworICByZXR1cm4gbnVtYmVyT2ZCaXRzOwogfQogCi0KIC8qKgotICogXGJyaWVmIFdyaXRlQml0cyBGdW5jdGlvbiAoYmFja3dhcmQpLiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBudW1iZXJPZkJpdHMgb2YgdmFsdWUgaW50byBiaXRzdHJlYW0uCisgKiBcYnJpZWYgV3JpdGVCaXRzIEZ1bmN0aW9uIChiYWNrd2FyZCkuIFRoaXMgZnVuY3Rpb24gd3JpdGVzIG51bWJlck9mQml0cyBvZgorICogdmFsdWUgaW50byBiaXRzdHJlYW0uCiAgKgogICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCiAgKiBccGFyYW0gdmFsdWUgICAgICAgICBWYXJpYWJsZSBob2xkcyBkYXRhIHRvIGJlIHdyaXR0ZW4uCkBAIC0zNTcsMjUgKzM4NSw2MyBAQAogICogXHJldHVybiBudW1iZXIgb2YgYml0cyB3cml0dGVuCiAgKi8KIEZES19JTkxJTkUgVUNIQVIgRkRLd3JpdGVCaXRzQndkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVJTlQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykKLXsKLSAgY29uc3QgVUlOVCB2YWxpZE1hc2sgPSBCaXRNYXNrIFtudW1iZXJPZkJpdHNdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSB7CisgIGNvbnN0IFVJTlQgdmFsaWRNYXNrID0gQml0TWFza1tudW1iZXJPZkJpdHNdOwogCi0gIGlmICgoaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUrbnVtYmVyT2ZCaXRzKSA8PSBDQUNIRV9CSVRTKQotICB7Ci0gICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gbnVtYmVyT2ZCaXRzIDsKLSAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgICA9ICAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IG51bWJlck9mQml0cykgfCAodmFsdWUgJiB2YWxpZE1hc2spOwotICB9Ci0gIGVsc2UKLSAgewotICAgIEZES19wdXRCd2QoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIGhCaXRTdHJlYW0tPkNhY2hlV29yZCwgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpIDsKLSAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IG51bWJlck9mQml0cyA7Ci0gICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkICAgPSAodmFsdWUgJiB2YWxpZE1hc2spIDsKKyAgaWYgKChoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArIG51bWJlck9mQml0cykgPD0gQ0FDSEVfQklUUykgeworICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlICs9IG51bWJlck9mQml0czsKKyAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPQorICAgICAgICAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IG51bWJlck9mQml0cykgfCAodmFsdWUgJiB2YWxpZE1hc2spOworICB9IGVsc2UgeworICAgIEZES19wdXRCd2QoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIGhCaXRTdHJlYW0tPkNhY2hlV29yZCwKKyAgICAgICAgICAgICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKTsKKyAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IG51bWJlck9mQml0czsKKyAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSAodmFsdWUgJiB2YWxpZE1hc2spOwogICB9CiAKLSByZXR1cm4gbnVtYmVyT2ZCaXRzOworICByZXR1cm4gbnVtYmVyT2ZCaXRzOwogfQogCisvKioKKyAqIFxicmllZiB3cml0ZSBhbiBpbnRlZ2VyIHZhbHVlIHVzaW5nIGEgdmFyeWluZyBudW1iZXIgb2YgYml0cyBmcm9tIHRoZQorICogYml0c3RyZWFtCisgKgorICogICAgICAgIHEudi4gSVNPL0lFQyBGRElTIDIzMDAzLTMgIFRhYmxlIDE2CisgKgorICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCisgKiBccGFyYW0gdmFsdWUgICB0aGUgZGF0YSB0byBiZSB3cml0dGVuCisgKiBccGFyYW0gbkJpdHMxICBudW1iZXIgb2YgYml0cyB0byB3cml0ZSBmb3IgYSBzbWFsbCBpbnRlZ2VyIHZhbHVlIG9yIGVzY2FwZQorICogdmFsdWUKKyAqIFxwYXJhbSBuQml0czIgIG51bWJlciBvZiBiaXRzIHRvIHdyaXRlIGZvciBhIG1lZGl1bSBzaXplZCBpbnRlZ2VyIHZhbHVlIG9yCisgKiBlc2NhcGUgdmFsdWUKKyAqIFxwYXJhbSBuQml0czMgIG51bWJlciBvZiBiaXRzIHRvIHdyaXRlIGZvciBhIGxhcmdlIGludGVnZXIgdmFsdWUKKyAqIFxyZXR1cm4gbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgorICovCitGREtfSU5MSU5FIFVDSEFSIEZES3dyaXRlRXNjYXBlZFZhbHVlKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdmFsdWUsIFVJTlQgbkJpdHMxLCBVSU5UIG5CaXRzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBuQml0czMpIHsKKyAgVUNIQVIgbmJpdHMgPSAwOworICBVSU5UIHRtcCA9ICgxIDw8IG5CaXRzMSkgLSAxOworCisgIGlmICh2YWx1ZSA8IHRtcCkgeworICAgIG5iaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB2YWx1ZSwgbkJpdHMxKTsKKyAgfSBlbHNlIHsKKyAgICBuYml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdG1wLCBuQml0czEpOworICAgIHZhbHVlIC09IHRtcDsKKyAgICB0bXAgPSAoMSA8PCBuQml0czIpIC0gMTsKKworICAgIGlmICh2YWx1ZSA8IHRtcCkgeworICAgICAgbmJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHZhbHVlLCBuQml0czIpOworICAgIH0gZWxzZSB7CisgICAgICBuYml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdG1wLCBuQml0czIpOworICAgICAgdmFsdWUgLT0gdG1wOworCisgICAgICBuYml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdmFsdWUsIG5CaXRzMyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG5iaXRzOworfQogCiAvKioKICAqIFxicmllZiBTeW5jQ2FjaGUgRnVuY3Rpb24uIENsZWFyIGNhY2hlIGFmdGVyIHJlYWQgZm9yd2FyZC4KQEAgLTM4MywyMzYgKzQ0OSwxOTQgQEAKICAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQogICogXHJldHVybiB2b2lkCiAgKi8KLUZES19JTkxJTkUgdm9pZCBGREtzeW5jQ2FjaGUgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17CitGREtfSU5MSU5FIHZvaWQgRkRLc3luY0NhY2hlKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKICAgaWYgKGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlID09IEJTX1JFQURFUikKLSAgICBGREtfcHVzaEJhY2sgKCZoQml0U3RyZWFtLT5oQml0QnVmLGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlLGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlKSA7Ci0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiBCU19XUklURVIgKi8KLSAgICBGREtfcHV0KCZoQml0U3RyZWFtLT5oQml0QnVmLCBoQml0U3RyZWFtLT5DYWNoZVdvcmQsIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSA7CisgICAgRkRLX3B1c2hCYWNrKCZoQml0U3RyZWFtLT5oQml0QnVmLCBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSwKKyAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUpOworICBlbHNlIGlmIChoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgLyogQlNfV1JJVEVSICovCisgICAgRkRLX3B1dCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkLAorICAgICAgICAgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpOwogCi0gIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gMCA7Ci0gIGhCaXRTdHJlYW0tPkNhY2hlV29yZCAgID0gMCA7CisgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gMDsKKyAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gMDsKIH0KIAotCiAvKioKICAqIFxicmllZiBTeW5jQ2FjaGUgRnVuY3Rpb24uIENsZWFyIGNhY2hlIGFmdGVyIHJlYWQgYmFja3dhcmRzLgogICoKICAqIFxwYXJhbSAgaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKICAqIFxyZXR1cm4gdm9pZAogICovCi1GREtfSU5MSU5FIHZvaWQgRkRLc3luY0NhY2hlQndkIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoteworRkRLX0lOTElORSB2b2lkIEZES3N5bmNDYWNoZUJ3ZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKSB7CiAgIGlmIChoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9PSBCU19SRUFERVIpIHsKLSAgICBGREtfcHVzaEZvcndhcmQgKCZoQml0U3RyZWFtLT5oQml0QnVmLGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlLGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlKSA7Ci0gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIEJTX1dSSVRFUiAqLwotICAgIEZES19wdXRCd2QgKCZoQml0U3RyZWFtLT5oQml0QnVmLCBoQml0U3RyZWFtLT5DYWNoZVdvcmQsIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSA7CisgICAgRkRLX3B1c2hGb3J3YXJkKCZoQml0U3RyZWFtLT5oQml0QnVmLCBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUpOworICB9IGVsc2UgeyAvKiBCU19XUklURVIgKi8KKyAgICBGREtfcHV0QndkKCZoQml0U3RyZWFtLT5oQml0QnVmLCBoQml0U3RyZWFtLT5DYWNoZVdvcmQsCisgICAgICAgICAgICAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSk7CiAgIH0KIAotICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IDAgOwotICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgICA9IDAgOworICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IDA7CisgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IDA7CiB9CiAKLQotLyoqCi0gKiBcYnJpZWYgQnl0ZSBBbGlnbm1lbnQgRnVuY3Rpb24uCi0gKiAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgYnl0ZV9hbGlnbm1lbnQoKSBzeW50YWN0aWMgZnVuY3Rpb24gb24gdGhlIGlucHV0IHN0cmVhbSwKLSAqICAgICAgICBpLmUuIHNvbWUgYml0cyB3aWxsIGJlIGRpc2NhcmRlZC9wYWRkZWQgc28gdGhhdCB0aGUgbmV4dCBiaXRzIHRvIGJlIHJlYWQvd3JpdHRlbiB3aWxsCi0gKiAgICAgICAgYmUgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnkgd2l0aCByZXNwZWN0IHRvIHRoZSBiaXQgcG9zaXRpb24gMC4KLSAqCi0gKiBccGFyYW0gIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCi0gKiBccmV0dXJuIHZvaWQKLSAqLwotRkRLX0lOTElORSB2b2lkIEZES2J5dGVBbGlnbiAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKLXsKLSAgRkRLc3luY0NhY2hlIChoQml0U3RyZWFtKSA7Ci0gIEZES19ieXRlQWxpZ24gKCZoQml0U3RyZWFtLT5oQml0QnVmLCAoVUNIQVIpaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUpIDsKLX0KLQotCiAvKioKICAqIFxicmllZiBCeXRlIEFsaWdubWVudCBGdW5jdGlvbiB3aXRoIGFuY2hvcgotICogICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGJ5dGVfYWxpZ25tZW50KCkgc3ludGFjdGljIGZ1bmN0aW9uIG9uIHRoZSBpbnB1dCBzdHJlYW0sCi0gKiAgICAgICAgaS5lLiBzb21lIGJpdHMgd2lsbCBiZSBkaXNjYXJkZWQgc28gdGhhdCB0aGUgbmV4dCBiaXRzIHRvIGJlIHJlYWQvd3JpdHRlbiB3b3VsZCBiZSBhbGlnbmVkCi0gKiAgICAgICAgb24gYSBieXRlIGJvdW5kYXJ5IHdpdGggcmVzcGVjdCB0byB0aGUgZ2l2ZW4gYWxpZ25tZW50IGFuY2hvci4KKyAqICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBieXRlX2FsaWdubWVudCgpIHN5bnRhY3RpYyBmdW5jdGlvbiBvbiB0aGUKKyAqIGlucHV0IHN0cmVhbSwgaS5lLiBzb21lIGJpdHMgd2lsbCBiZSBkaXNjYXJkZWQgc28gdGhhdCB0aGUgbmV4dCBiaXRzIHRvIGJlCisgKiByZWFkL3dyaXR0ZW4gd291bGQgYmUgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnkgd2l0aCByZXNwZWN0IHRvIHRoZQorICogZ2l2ZW4gYWxpZ25tZW50IGFuY2hvci4KICAqCiAgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKLSAqIFxwYXJhbSBhbGlnbm1lbnRBbmNob3IgYml0IHBvc2l0aW9uIHRvIGJlIGNvbnNpZGVyZWQgYXMgb3JpZ2luIGZvciBieXRlIGFsaWdubWVudAorICogXHBhcmFtIGFsaWdubWVudEFuY2hvciBiaXQgcG9zaXRpb24gdG8gYmUgY29uc2lkZXJlZCBhcyBvcmlnaW4gZm9yIGJ5dGUKKyAqIGFsaWdubWVudAogICogXHJldHVybiB2b2lkCiAgKi8KLUZES19JTkxJTkUgdm9pZCBGREtieXRlQWxpZ24gKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVJTlQgYWxpZ25tZW50QW5jaG9yKQotewotICBGREtzeW5jQ2FjaGUgKGhCaXRTdHJlYW0pIDsKK0ZES19JTkxJTkUgdm9pZCBGREtieXRlQWxpZ24oSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhbGlnbm1lbnRBbmNob3IpIHsKKyAgRkRLc3luY0NhY2hlKGhCaXRTdHJlYW0pOwogICBpZiAoaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPT0gQlNfUkVBREVSKSB7Ci0gICAgRkRLX3B1c2hGb3J3YXJkICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICg4IC0gKChhbGlnbm1lbnRBbmNob3IgLSBGREtfZ2V0VmFsaWRCaXRzKCZoQml0U3RyZWFtLT5oQml0QnVmKSkgJiAweDA3KSkgJiAweDA3LAotICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUpIDsKLSAgfQotICBlbHNlIHsKLSAgICBGREtfcHV0ICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwKLSAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICg4IC0gKChGREtfZ2V0VmFsaWRCaXRzKCZoQml0U3RyZWFtLT5oQml0QnVmKS1hbGlnbm1lbnRBbmNob3IpICYgMHgwNykpICYgMHgwNyApOworICAgIEZES19wdXNoRm9yd2FyZCgKKyAgICAgICAgJmhCaXRTdHJlYW0tPmhCaXRCdWYsCisgICAgICAgIChVSU5UKSgoSU5UKTggLSAoKChJTlQpYWxpZ25tZW50QW5jaG9yIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVClGREtfZ2V0VmFsaWRCaXRzKCZoQml0U3RyZWFtLT5oQml0QnVmKSkgJgorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcpKSAmCisgICAgICAgICAgICAweDA3LAorICAgICAgICBoQml0U3RyZWFtLT5Db25maWdDYWNoZSk7CisgIH0gZWxzZSB7CisgICAgRkRLX3B1dCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgMCwKKyAgICAgICAgICAgICg4IC0gKChGREtfZ2V0VmFsaWRCaXRzKCZoQml0U3RyZWFtLT5oQml0QnVmKSAtIGFsaWdubWVudEFuY2hvcikgJgorICAgICAgICAgICAgICAgICAgMHgwNykpICYKKyAgICAgICAgICAgICAgICAweDA3KTsKICAgfQogfQogCi0KIC8qKgogICogXGJyaWVmIFB1c2ggQmFjayhDYWNoZSkgLyBGb3IgLyBCaURpcmVjdGlvbmFsIEZ1bmN0aW9uLgotICogICAgICAgIFB1c2hCYWNrQ2FjaGUgZnVuY3Rpb24gdW5nZXRzIGEgbnVtYmVyIG9mIGJpdHMgZXJyb25lb3VzbHkgcmVhZC93cml0dGVuIGJ5IHRoZSBsYXN0IEdldCgpIGNhbGwuCi0gKiAgICAgICBOQjogVGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIHN0dWZmZWQgYmFjayBpbnRvIHRoZSBzdHJlYW0gbWF5IG5ldmVyIGV4Y2VlZCB0aGUKLSAqICAgICAgIG51bWJlciBvZiBiaXRzIHJldHVybmVkIGJ5IHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgR2V0KCkgY2FsbC4KKyAqICAgICAgICBQdXNoQmFja0NhY2hlIGZ1bmN0aW9uIHVuZ2V0cyBhIG51bWJlciBvZiBiaXRzIGVycm9uZW91c2x5CisgKiByZWFkL3dyaXR0ZW4gYnkgdGhlIGxhc3QgR2V0KCkgY2FsbC4gTkI6IFRoZSBudW1iZXIgb2YgYml0cyB0byBiZSBzdHVmZmVkCisgKiBiYWNrIGludG8gdGhlIHN0cmVhbSBtYXkgbmV2ZXIgZXhjZWVkIHRoZSBudW1iZXIgb2YgYml0cyByZXR1cm5lZCBieQorICogdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBHZXQoKSBjYWxsLgogICoKLSAqICAgICAgIFB1c2hCYWNrIGZ1bmN0aW9uIHVuZ2V0cyBhIG51bWJlciBvZiBiaXRzIChjb21iaW5lcyBjYWNoZSBhbmQgYml0YnVmZmVyIGluZGljZXMpCi0gKiAgICAgICBQdXNoRm9yICBmdW5jdGlvbiBnZXRzIGEgbnVtYmVyIG9mIGJpdHMgKGNvbWJpbmVzIGNhY2hlIGFuZCBiaXRidWZmZXIgaW5kaWNlcykKLSAqICAgICAgIFB1c2hCaURpcmVjdGlvbmFsIGdldHMvdW5nZXRzIG51bWJlciBvZiBiaXRzIGFzIGRlZmluZWQgaW4gUHVzQmFjay9Gb3IgZnVuY3Rpb24KLSAqICAgICAgIE5COiBUaGUgc2lnbiBvZiBiaXRzIGlzIG5vdCBrbm93biwgc28gdGhlIGZ1bmN0aW9uIGNoZWNrcyBkaXJlY3Rpb24gYW5kIGNhbGxzCi0gKiAgICAgICAgYXBwcm9wcmlhdGUgZnVuY3Rpb24uIChwb3NpdGl2ZSBzaWduIHB1c2hGb3IsIG5lZ2F0aXZlIHNpZ24gcHVzaEJhY2sgKQorICogICAgICAgUHVzaEJhY2sgZnVuY3Rpb24gdW5nZXRzIGEgbnVtYmVyIG9mIGJpdHMgKGNvbWJpbmVzIGNhY2hlIGFuZCBiaXRidWZmZXIKKyAqIGluZGljZXMpIFB1c2hGb3IgIGZ1bmN0aW9uIGdldHMgYSBudW1iZXIgb2YgYml0cyAoY29tYmluZXMgY2FjaGUgYW5kCisgKiBiaXRidWZmZXIgaW5kaWNlcykgUHVzaEJpRGlyZWN0aW9uYWwgZ2V0cy91bmdldHMgbnVtYmVyIG9mIGJpdHMgYXMKKyAqIGRlZmluZWQgaW4gUHVzQmFjay9Gb3IgZnVuY3Rpb24gTkI6IFRoZSBzaWduIG9mIGJpdHMgaXMgbm90IGtub3duLCBzbworICogdGhlIGZ1bmN0aW9uIGNoZWNrcyBkaXJlY3Rpb24gYW5kIGNhbGxzIGFwcHJvcHJpYXRlIGZ1bmN0aW9uLiAocG9zaXRpdmUKKyAqIHNpZ24gcHVzaEZvciwgbmVnYXRpdmUgc2lnbiBwdXNoQmFjayApCiAgKgogICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCiAgKiBccGFyYW0gbnVtYmVyT2ZCaXRzICBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgcHVzaGVkIGJhY2svZm9yLgogICogXHJldHVybiB2b2lkCiAgKi8KLUZES19JTkxJTkUgdm9pZCBGREtwdXNoQmFja0NhY2hlIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykKLXsKLSAgRkRLX0FTU0VSVCAoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlK251bWJlck9mQml0cyk8PUNBQ0hFX0JJVFMpOwotICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArPSBudW1iZXJPZkJpdHMgOworRkRLX0lOTElORSB2b2lkIEZES3B1c2hCYWNrQ2FjaGUoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSB7CisgIEZES19BU1NFUlQoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlICsgbnVtYmVyT2ZCaXRzKSA8PSBDQUNIRV9CSVRTKTsKKyAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gbnVtYmVyT2ZCaXRzOwogfQogCi1GREtfSU5MSU5FIHZvaWQgRkRLcHVzaEJhY2sgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQotewotICBpZiAoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlK251bWJlck9mQml0cyk8Q0FDSEVfQklUUyAmJiAoaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPT0gQlNfUkVBREVSKSApIHsKLSAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArPSBudW1iZXJPZkJpdHMgOwotICAgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKSA7IC8qIHN5bmMgY2FjaGUgdG8gYXZvaWQgaW52YWxpZCBjYWNoZSAqLwotICB9Ci0gIGVsc2UgewotICAgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKSA7Ci0gICAgRkRLX3B1c2hCYWNrKCZoQml0U3RyZWFtLT5oQml0QnVmLG51bWJlck9mQml0cyxoQml0U3RyZWFtLT5Db25maWdDYWNoZSk7CitGREtfSU5MSU5FIHZvaWQgRkRLcHVzaEJhY2soSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykgeworICBpZiAoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlICsgbnVtYmVyT2ZCaXRzKSA8IENBQ0hFX0JJVFMgJiYKKyAgICAgIChoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9PSBCU19SRUFERVIpKSB7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gbnVtYmVyT2ZCaXRzOworICAgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKTsgLyogc3luYyBjYWNoZSB0byBhdm9pZCBpbnZhbGlkIGNhY2hlICovCisgIH0gZWxzZSB7CisgICAgRkRLc3luY0NhY2hlKGhCaXRTdHJlYW0pOworICAgIEZES19wdXNoQmFjaygmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgbnVtYmVyT2ZCaXRzLCBoQml0U3RyZWFtLT5Db25maWdDYWNoZSk7CiAgIH0KIH0KIAotRkRLX0lOTElORSB2b2lkIEZES3B1c2hGb3IgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQotewotICBpZiAoIChoQml0U3RyZWFtLT5CaXRzSW5DYWNoZT5udW1iZXJPZkJpdHMpICYmIChoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9PSBCU19SRUFERVIpICkgeworRkRLX0lOTElORSB2b2lkIEZES3B1c2hGb3IoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSB7CisgIGlmICgoaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPiBudW1iZXJPZkJpdHMpICYmCisgICAgICAoaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPT0gQlNfUkVBREVSKSkgewogICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIC09IG51bWJlck9mQml0czsKLSAgfQotICBlbHNlIHsKLSAgICBGREtzeW5jQ2FjaGUoaEJpdFN0cmVhbSkgOwotICAgIEZES19wdXNoRm9yd2FyZCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZixudW1iZXJPZkJpdHMsaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUpOworICB9IGVsc2UgeworICAgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKTsKKyAgICBGREtfcHVzaEZvcndhcmQoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIG51bWJlck9mQml0cywKKyAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUpOwogICB9CiB9CiAKLUZES19JTkxJTkUgdm9pZCBGREtwdXNoQmlEaXJlY3Rpb25hbCAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgY29uc3QgSU5UIG51bWJlck9mQml0cykKLXsKLSAgaWYobnVtYmVyT2ZCaXRzPj0wKSAgRkRLcHVzaEZvcihoQml0U3RyZWFtLCBudW1iZXJPZkJpdHMpIDsKLSAgZWxzZSAgICAgICAgICAgICAgICAgRkRLcHVzaEJhY2soaEJpdFN0cmVhbSwgLW51bWJlck9mQml0cykgOworRkRLX0lOTElORSB2b2lkIEZES3B1c2hCaURpcmVjdGlvbmFsKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bWJlck9mQml0cykgeworICBpZiAobnVtYmVyT2ZCaXRzID49IDApCisgICAgRkRLcHVzaEZvcihoQml0U3RyZWFtLCBudW1iZXJPZkJpdHMpOworICBlbHNlCisgICAgRkRLcHVzaEJhY2soaEJpdFN0cmVhbSwgLW51bWJlck9mQml0cyk7CiB9CiAKLQogLyoqCi0gKiBcYnJpZWYgR2V0VmFsaWRCaXRzIEZ1bmN0aW9uLiAgQ2xlYXIgY2FjaGUgYW5kIHJldHVybiB2YWxpZCBCaXRzIGZyb20gQml0YnVmZmVyLgorICogXGJyaWVmIEdldFZhbGlkQml0cyBGdW5jdGlvbi4gIENsZWFyIGNhY2hlIGFuZCByZXR1cm4gdmFsaWQgQml0cyBmcm9tCisgKiBCaXRidWZmZXIuCiAgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKICAqIFxyZXR1cm4gYW1vdW50IG9mIHZhbGlkIGJpdHMgdGhhdCBzdGlsbCBjYW4gYmUgcmVhZCBvciB3ZXJlIGFscmVhZHkgd3JpdHRlbi4KICAqCiAgKi8KLUZES19JTkxJTkUgVUlOVCBGREtnZXRWYWxpZEJpdHMgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17Ci0gIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKSA7Ci0gIHJldHVybiBGREtfZ2V0VmFsaWRCaXRzKCZoQml0U3RyZWFtLT5oQml0QnVmKSA7CitGREtfSU5MSU5FIFVJTlQgRkRLZ2V0VmFsaWRCaXRzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKKyAgRkRLc3luY0NhY2hlKGhCaXRTdHJlYW0pOworICByZXR1cm4gRkRLX2dldFZhbGlkQml0cygmaEJpdFN0cmVhbS0+aEJpdEJ1Zik7CiB9CiAKLQogLyoqCiAgKiBcYnJpZWYgcmV0dXJuIGFtb3VudCBvZiB1bnVzZWQgQml0cyBmcm9tIEJpdGJ1ZmZlci4KICAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQogICogXHJldHVybiBhbW91bnQgb2YgZnJlZSBiaXRzIHRoYXQgc3RpbGwgY2FuIGJlIHdyaXR0ZW4gaW50byB0aGUgYml0c3RyZWFtCiAgKi8KLUZES19JTkxJTkUgSU5UIEZES2dldEZyZWVCaXRzIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQotewotICAgcmV0dXJuIEZES19nZXRGcmVlQml0cyAoJmhCaXRTdHJlYW0tPmhCaXRCdWYpIDsKK0ZES19JTkxJTkUgSU5UIEZES2dldEZyZWVCaXRzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKKyAgcmV0dXJuIEZES19nZXRGcmVlQml0cygmaEJpdFN0cmVhbS0+aEJpdEJ1Zik7CiB9CiAKIC8qKgotICogXGJyaWVmIHJlc2V0IGJpdGNvdW50ZXIgaW4gYml0QnVmZmVyIHRvIHplcm8uCi0gKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKLSAqIFxyZXR1cm4gdm9pZAotICovCi1GREtfSU5MSU5FIHZvaWQgRkRLcmVzZXRCaXRDbnQgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17Ci0gICAgRkRLc3luY0NhY2hlIChoQml0U3RyZWFtKSA7Ci0gICAgRkRLX3NldEJpdENudCAoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIDApIDsKLX0KLQotLyoqCi0gKiBcYnJpZWYgc2V0IGJpdGNvdXRuZXIgaW4gYml0QnVmZmVyIHRvIGdpdmVuIHZhbHVlLgotICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCi0gKiBccGFyYW0gdmFsdWUgbmV3IHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBiaXQgY291bnRlcgotICogXHJldHVybiB2b2lkCi0gKi8KLUZES19JTkxJTkUgdm9pZCBGREtzZXRCaXRDbnQgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVJTlQgdmFsdWUpCi17Ci0gICAgRkRLc3luY0NhY2hlIChoQml0U3RyZWFtKSA7Ci0gICAgRkRLX3NldEJpdENudCAoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIHZhbHVlKSA7Ci19Ci0KLS8qKgotICogXGJyaWVmIGdldCBiaXRjb3VudGVyIHN0YXRlIGZyb20gYml0QnVmZmVyLgotICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCi0gKiBccmV0dXJuIGN1cnJlbnQgYml0IGNvdW50ZXIgdmFsdWUKLSAqLwotRkRLX0lOTElORSBJTlQgIEZES2dldEJpdENudCAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKLXsKLSAgICBGREtzeW5jQ2FjaGUoaEJpdFN0cmVhbSkgOwotICAgIHJldHVybiBGREtfZ2V0Qml0Q250KCZoQml0U3RyZWFtLT5oQml0QnVmKSA7Ci19Ci0KLQotLyoqCiAgKiBcYnJpZWYgRmlsbCB0aGUgQml0QnVmZmVyIHdpdGggYSBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgZnJvbSAgZXh0ZXJuYWwgc291cmNlLgotICogICAgICAgIFRoZSBieXRlc1ZhbGlkIHZhcmlhYmxlIHJldHVybnMgdGhlIG51bWJlciBvZiByYW1haW5pbmcgdmFsaWQgYnl0ZXMgaW4gZXh0ZXJuIGlucHV0QnVmZmVyLgorICogICAgICAgIFRoZSBieXRlc1ZhbGlkIHZhcmlhYmxlIHJldHVybnMgdGhlIG51bWJlciBvZiByYW1haW5pbmcgdmFsaWQgYnl0ZXMgaW4KKyAqIGV4dGVybiBpbnB1dEJ1ZmZlci4KICAqCiAgKiBccGFyYW0gaEJpdFN0cmVhbSAgSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCiAgKiBccGFyYW0gaW5wdXRCdWZmZXIgUG9pbnRlciB0byBpbnB1dCBidWZmZXIgd2l0aCBiaXRzdHJlYW0gZGF0YS4KICAqIFxwYXJhbSBidWZmZXJTaXplICBUb3RhbCBzaXplIG9mIGlucHV0QnVmZmVyIGFycmF5LgotICogXHBhcmFtIGJ5dGVzVmFsaWQgIElucHV0OiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gaW5wdXRCdWZmZXIuIE91dHB1dDogYnl0ZXMgc3RpbGwgbGVmdCB1bnJlYWQgaW4gaW5wdXRCdWZmZXIuCisgKiBccGFyYW0gYnl0ZXNWYWxpZCAgSW5wdXQ6IG51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBpbnB1dEJ1ZmZlci4gT3V0cHV0OiBieXRlcworICogc3RpbGwgbGVmdCB1bnJlYWQgaW4gaW5wdXRCdWZmZXIuCiAgKiBccmV0dXJuIHZvaWQKICAqLwotRkRLX0lOTElORSB2b2lkIEZES2ZlZWRCdWZmZXIgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGNvbnN0IFVDSEFSIGlucHV0QnVmZmVyIFtdLCBjb25zdCBVSU5UIGJ1ZmZlclNpemUsIFVJTlQgKmJ5dGVzVmFsaWQpCi17Ci0gIEZES3N5bmNDYWNoZSAoaEJpdFN0cmVhbSkgOwotICBGREtfRmVlZCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgKFVDSEFSKilpbnB1dEJ1ZmZlciwgYnVmZmVyU2l6ZSwgYnl0ZXNWYWxpZCAgKSA7CitGREtfSU5MSU5FIHZvaWQgRkRLZmVlZEJ1ZmZlcihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgaW5wdXRCdWZmZXJbXSwgY29uc3QgVUlOVCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqYnl0ZXNWYWxpZCkgeworICBGREtzeW5jQ2FjaGUoaEJpdFN0cmVhbSk7CisgIEZES19GZWVkKCZoQml0U3RyZWFtLT5oQml0QnVmLCBpbnB1dEJ1ZmZlciwgYnVmZmVyU2l6ZSwgYnl0ZXNWYWxpZCk7CiB9CiAKLQogLyoqCi0gKiBcYnJpZWYgZmlsbCBkZXN0aW5hdGlvbiBCaXRCdWZmZXIgd2l0aCBhIG51bWJlciBvZiBieXRlcyBmcm9tIHNvdXJjZSBCaXRCdWZmZXIuIFRoZQotICogICAgICAgIGJ5dGVzVmFsaWQgdmFyaWFibGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJhbWFpbmluZyB2YWxpZCBieXRlcyBpbiBzb3VyY2UgQml0QnVmZmVyLgorICogXGJyaWVmIGZpbGwgZGVzdGluYXRpb24gQml0QnVmZmVyIHdpdGggYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSBzb3VyY2UKKyAqIEJpdEJ1ZmZlci4gVGhlIGJ5dGVzVmFsaWQgdmFyaWFibGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJhbWFpbmluZyB2YWxpZAorICogYnl0ZXMgaW4gc291cmNlIEJpdEJ1ZmZlci4KICAqCiAgKiBccGFyYW0gaEJTRHN0ICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlIHRvIHdyaXRlIGRhdGEgaW50bwogICogXHBhcmFtIGhCU1NyYyAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZSB0byByZWFkIGRhdGEgZnJvbQotICogXHBhcmFtIGJ5dGVzVmFsaWQgICAgICAgIElucHV0OiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gaW5wdXRCdWZmZXIuIE91dHB1dDogYnl0ZXMgc3RpbGwgbGVmdCB1bnJlYWQgaW4gaW5wdXRCdWZmZXIuCisgKiBccGFyYW0gYnl0ZXNWYWxpZCAgICAgICAgSW5wdXQ6IG51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBpbnB1dEJ1ZmZlci4gT3V0cHV0OgorICogYnl0ZXMgc3RpbGwgbGVmdCB1bnJlYWQgaW4gaW5wdXRCdWZmZXIuCiAgKiBccmV0dXJuIHZvaWQKICAqLwotRkRLX0lOTElORSB2b2lkIEZES2NvcHlCdWZmZXIgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCU0RzdCwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJTU3JjLCBVSU5UICpieXRlc1ZhbGlkKQotewotICBGREtzeW5jQ2FjaGUgKGhCU1NyYykgOwotICBGREtfQ29weSAoJmhCU0RzdC0+aEJpdEJ1ZiwgJmhCU1NyYy0+aEJpdEJ1ZiwgYnl0ZXNWYWxpZCkgOworRkRLX0lOTElORSB2b2lkIEZES2NvcHlCdWZmZXIoSEFORExFX0ZES19CSVRTVFJFQU0gaEJTRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJTU3JjLCBVSU5UICpieXRlc1ZhbGlkKSB7CisgIEZES3N5bmNDYWNoZShoQlNTcmMpOworICBGREtfQ29weSgmaEJTRHN0LT5oQml0QnVmLCAmaEJTU3JjLT5oQml0QnVmLCBieXRlc1ZhbGlkKTsKIH0KIAotCiAvKioKLSAqIFxicmllZiBmaWxsIHRoZSBvdXRwdXRCdWZmZXIgd2l0aCBhbGwgdmFsaWQgYnl0ZXMgaG9sZCBpbiBCaXRCdWZmZXIuIFRoZSBXcml0ZUJ5dGVzCi0gKiAgICAgICAgdmFyaWFibGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gQnl0ZXMuCisgKiBcYnJpZWYgZmlsbCB0aGUgb3V0cHV0QnVmZmVyIHdpdGggYWxsIHZhbGlkIGJ5dGVzIGhvbGQgaW4gQml0QnVmZmVyLiBUaGUKKyAqIFdyaXRlQnl0ZXMgdmFyaWFibGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gQnl0ZXMuCiAgKgogICogXHBhcmFtIGhCaXRTdHJlYW0gICAgSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCiAgKiBccGFyYW0gb3V0cHV0QnVmZmVyICBQb2ludGVyIHRvIG91dHB1dCBidWZmZXIuCiAgKiBccGFyYW0gd3JpdGVCeXRlcyAgICBOdW1iZXIgb2YgYnl0ZXMgd3JpdGUgdG8gb3V0cHV0IGJ1ZmZlci4KICAqIFxyZXR1cm4gdm9pZAogICovCi1GREtfSU5MSU5FIHZvaWQgRkRLZmV0Y2hCdWZmZXIoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgVUNIQVIgKm91dHB1dEJ1ZmZlciwgVUlOVCAqd3JpdGVCeXRlcykKLXsKLSAgRkRLc3luY0NhY2hlIChoQml0U3RyZWFtKSA7CitGREtfSU5MSU5FIHZvaWQgRkRLZmV0Y2hCdWZmZXIoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqb3V0cHV0QnVmZmVyLCBVSU5UICp3cml0ZUJ5dGVzKSB7CisgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKTsKICAgRkRLX0ZldGNoKCZoQml0U3RyZWFtLT5oQml0QnVmLCBvdXRwdXRCdWZmZXIsIHdyaXRlQnl0ZXMpOwogfQogCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvRkRLX2NvcmUuaCBiL2xpYkZESy9pbmNsdWRlL0ZES19jb3JlLmgKaW5kZXggMTBhNmE4ZS4uOTU0MzUyMiAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvRkRLX2NvcmUuaAorKysgYi9saWJGREsvaW5jbHVkZS9GREtfY29yZS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKICAgIERlc2NyaXB0aW9uOiBGREsgdG9vbHMgdmVyc2lvbmluZyBzdXBwb3J0CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgRkRLX0NPUkVfSAogI2RlZmluZSBGREtfQ09SRV9ICkBAIC05OCw3ICsxMTAsOCBAQAogI2VuZGlmCiAKIC8qKiBAYnJpZWYgR2V0IEZES190b29scyBsaWJyYXJ5IGluZm9ybWF0aW9uLgotICogIEByZXR1cm4gICAgIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3Jjb2RlIG9uIGZhaWx1cmUgKHNlZSBlcnJvcmNvZGVzLmgpLgorICogIEByZXR1cm4gICAgIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3Jjb2RlIG9uIGZhaWx1cmUgKHNlZQorICogZXJyb3Jjb2Rlcy5oKS4KICAqLwogaW50IEZES190b29sc0dldExpYkluZm8oTElCX0lORk8gKmluZm8pOwogCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9GREtfY3JjLmggYi9saWJGREsvaW5jbHVkZS9GREtfY3JjLmgKaW5kZXggYjFmZWQ4OC4uNmM3MDQwYyAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvRkRLX2NyYy5oCisrKyBiL2xpYkZESy9pbmNsdWRlL0ZES19jcmMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw1NSArOTAsNTMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjoKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBDUkMgY2FsY3VsYXRpb24KKyAgIEF1dGhvcihzKToKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IENSQyBjYWxjdWxhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIEZES19DUkNfSAogI2RlZmluZSBGREtfQ1JDX0gKIAotCi0KICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKLQotI2RlZmluZSBNQVhfQ1JDX1JFR1MgMyAgICAvKiE8IE1heGltYWwgbnVtYmVyIG9mIG92ZXJsYXBwaW5nIGNyYyByZWdpb24gaW4gQURUUyBjaGFubmVsIHBhaXIgZWxlbWVudCBpcyB0d28uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IHRocmVlIGluZGVwZW5kZW50IHJlZ2lvbnMgcHJldmVudGl2ZWx5LiAqLworI2RlZmluZSBNQVhfQ1JDX1JFR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMyAvKiE8IE1heGltYWwgbnVtYmVyIG9mIG92ZXJsYXBwaW5nIGNyYyByZWdpb24gaW4gQURUUyBjaGFubmVsIHBhaXIgZWxlbWVudCBcCisgICAgICAgaXMgdHdvLiBTZWxlY3QgdGhyZWUgaW5kZXBlbmRlbnQgcmVnaW9ucyBwcmV2ZW50aXZlbHkuICovCiAKIC8qKgogICogIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBzaW5nbGUgY3JjIHJlZ2lvbiB1c2VkIGZvciBjcmMgY2FsY3VsYXRpb24uCiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIFVDSEFSIGlzQWN0aXZlOwotICBJTlQgICBtYXhCaXRzOwotICBVSU5UICBiaXRCdWZDbnRCaXRzOwotICBVSU5UICB2YWxpZEJpdHM7CisgIElOVCBtYXhCaXRzOworICBJTlQgYml0QnVmQ250Qml0czsKKyAgSU5UIHZhbGlkQml0czsKIAogfSBDQ3JjUmVnRGF0YTsKIAogLyoqCiAgKiAgQ1JDIGluZm8gc3RydWN0dXJlLgogICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIENDcmNSZWdEYXRhICBjcmNSZWdEYXRhW01BWF9DUkNfUkVHU107ICAgLyohPCBNdWx0aXBsZSBjcmMgcmVnaW9uIGRlc2NyaXB0aW9uLiAqLwotICAgIGNvbnN0IFVTSE9SVCAgICAgICAqcENyY0xvb2t1cDsgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGxvb2t1cCB0YWJsZSBmaWxsZWQgaW4gRkRLX2NyY0luaXQoKS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgQ0NyY1JlZ0RhdGEgY3JjUmVnRGF0YVtNQVhfQ1JDX1JFR1NdOyAvKiE8IE11bHRpcGxlIGNyYyByZWdpb24gZGVzY3JpcHRpb24uICovCisgIGNvbnN0IFVTSE9SVCoKKyAgICAgIHBDcmNMb29rdXA7IC8qITwgUG9pbnRlciB0byBsb29rdXAgdGFibGUgZmlsbGVkIGluIEZES19jcmNJbml0KCkuICovCiAKLSAgICBVU0hPUlQgICAgICAgICAgICAgIGNyY1BvbHk7ICAgICAgICAgICAgIC8qITwgQ1JDIGdlbmVyYXRvciBwb2x5bm9tLiAqLwotICAgIFVTSE9SVCAgICAgICAgICAgICAgY3JjTWFzazsgICAgICAgICAgICAgLyohPCBDUkMgbWFzay4gKi8KLSAgICBVU0hPUlQgICAgICAgICAgICAgIHN0YXJ0VmFsdWU7ICAgICAgICAgIC8qITwgQ1JDIHN0YXJ0IHZhbHVlLiAqLwotICAgIFVDSEFSICAgICAgICAgICAgICAgY3JjTGVuOyAgICAgICAgICAgICAgLyohPCBDUkMgbGVuZ3RoLiAqLworICBVU0hPUlQgY3JjUG9seTsgICAgLyohPCBDUkMgZ2VuZXJhdG9yIHBvbHlub20uICovCisgIFVTSE9SVCBjcmNNYXNrOyAgICAvKiE8IENSQyBtYXNrLiAqLworICBVU0hPUlQgc3RhcnRWYWx1ZTsgLyohPCBDUkMgc3RhcnQgdmFsdWUuICovCisgIFVDSEFSIGNyY0xlbjsgICAgICAvKiE8IENSQyBsZW5ndGguICovCiAKLSAgICBVSU5UICAgICAgICAgICAgICAgIHJlZ1N0YXJ0OyAgICAgICAgICAgIC8qITwgU3RhcnQgcmVnaW9uIG1hcmtlciBmb3Igc3luY2hyb25pemF0aW9uLiAqLwotICAgIFVJTlQgICAgICAgICAgICAgICAgcmVnU3RvcDsgICAgICAgICAgICAgLyohPCBTdG9wIHJlZ2lvbiBtYXJrZXIgZm9yIHN5bmNocm9uaXphdGlvbi4gKi8KKyAgVUlOVCByZWdTdGFydDsgLyohPCBTdGFydCByZWdpb24gbWFya2VyIGZvciBzeW5jaHJvbml6YXRpb24uICovCisgIFVJTlQgcmVnU3RvcDsgIC8qITwgU3RvcCByZWdpb24gbWFya2VyIGZvciBzeW5jaHJvbml6YXRpb24uICovCiAKLSAgICBVU0hPUlQgICAgICAgICAgICAgIGNyY1ZhbHVlOyAgICAgICAgICAgIC8qITwgQ3JjIHZhbHVlIHRvIGJlIGNhbGN1bGF0ZWQuICovCisgIFVTSE9SVCBjcmNWYWx1ZTsgLyohPCBDcmMgdmFsdWUgdG8gYmUgY2FsY3VsYXRlZC4gKi8KIAogfSBGREtfQ1JDSU5GTzsKIApAQCAtMTM2LDI1ICsxNDUsMjIgQEAKICAqLwogdHlwZWRlZiBGREtfQ1JDSU5GTyogSEFORExFX0ZES19DUkNJTkZPOwogCi0KIC8qKgogICogXGJyaWVmICBJbml0aWFsaXplIENSQyBzdHJ1Y3R1cmUuCiAgKgotICogVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIGV4aXN0aW5nIGNyYyBpbmZvIHN0cnVjdHVyZSB3aXRoIGRlbm90ZWQgY29uZmlndXJhdGlvbi4KKyAqIFRoZSBmdW5jdGlvbiBpbml0aWFsaXplcyBleGlzdGluZyBjcmMgaW5mbyBzdHJ1Y3R1cmUgd2l0aCBkZW5vdGVkCisgKiBjb25maWd1cmF0aW9uLgogICoKLSAqIFxwYXJhbSBoQ3JjSW5mbyAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBvdXRseWluZyBhbGxvY2F0ZWQgY3JjIGluZm8gc3RydWN0dXJlLgorICogXHBhcmFtIGhDcmNJbmZvICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIG91dGx5aW5nIGFsbG9jYXRlZCBjcmMgaW5mbworICogc3RydWN0dXJlLgogICogXHBhcmFtIGNyY1BvbHkgICAgICAgICAgICAgICBDb25maWd1cmUgY3JjIHBvbHlub20uCiAgKiBccGFyYW0gY3JjU3RhcnRWYWx1ZSAgICAgICAgIENvbmZpZ3VyZSBjcmMgc3RhcnQgdmFsdWUuCiAgKiBccGFyYW0gY3JjTGVuICAgICAgICAgICAgICAgIENvbmZpZ3VyZSBjcmMgbGVuZ3RoLgogICoKICAqIFxyZXR1cm4gIG5vbmUKICAqLwotdm9pZCBGREtjcmNJbml0KAotICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgICAgICAgIGhDcmNJbmZvLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIGNyY1BvbHksCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgY3JjU3RhcnRWYWx1ZSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICBjcmNMZW4KLSAgICAgICAgKTsKK3ZvaWQgRkRLY3JjSW5pdChIQU5ETEVfRkRLX0NSQ0lORk8gaENyY0luZm8sIGNvbnN0IFVJTlQgY3JjUG9seSwKKyAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNyY1N0YXJ0VmFsdWUsIGNvbnN0IFVJTlQgY3JjTGVuKTsKIAogLyoqCiAgKiBcYnJpZWYgIFJlc2V0IENSQyBpbmZvIHN0cnVjdHVyZS4KQEAgLTE2NSw0MiArMTcxLDM3IEBACiAgKgogICogXHJldHVybiAgbm9uZQogICovCi12b2lkIEZES2NyY1Jlc2V0KAotICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgICAgICAgIGhDcmNJbmZvCi0gICAgICAgICk7Ci0KK3ZvaWQgRkRLY3JjUmVzZXQoSEFORExFX0ZES19DUkNJTkZPIGhDcmNJbmZvKTsKIAogLyoqCiAgKiBcYnJpZWYgIFN0YXJ0IENSQyByZWdpb24gd2l0aCBtYXhpbXVtIG51bWJlciBvZiBiaXRzLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gbWFya3MgcG9zaXRpb24gaW4gYml0c3RyZWFtIHRvIGJlIHVzZWQgYXMgc3RhcnQgcG9pbnQgZm9yIGNyYyBjYWxjdWxhdGlvbi4KLSAqIEJpdHN0cmVhbSByYW5nZSBmb3IgY3JjIGNhbGN1bGF0aW9uIGNhbiBiZSBsaW1pdGVkIG9yIGtlcHQgZHluYW1pYyBkZXBlbmRpbmcgb24gbUJpdHMgcGFyYW1ldGVyLgotICogVGhlIGNyYyByZWdpb24gaGFzIHRvIGJlIHRlcm1pbmF0ZWQgd2l0aCBGREtjcmNFbmRSZWcoKSBpbiBlYWNoIGNhc2UuCisgKiBUaGlzIGZ1bmN0aW9uIG1hcmtzIHBvc2l0aW9uIGluIGJpdHN0cmVhbSB0byBiZSB1c2VkIGFzIHN0YXJ0IHBvaW50IGZvciBjcmMKKyAqIGNhbGN1bGF0aW9uLiBCaXRzdHJlYW0gcmFuZ2UgZm9yIGNyYyBjYWxjdWxhdGlvbiBjYW4gYmUgbGltaXRlZCBvciBrZXB0CisgKiBkeW5hbWljIGRlcGVuZGluZyBvbiBtQml0cyBwYXJhbWV0ZXIuIFRoZSBjcmMgcmVnaW9uIGhhcyB0byBiZSB0ZXJtaW5hdGVkCisgKiB3aXRoIEZES2NyY0VuZFJlZygpIGluIGVhY2ggY2FzZS4KICAqCiAgKiBccGFyYW0gaENyY0luZm8gICAgICAgICAgICAgIFBvaW50ZXIgdG8gY3JjIGluZm8gc3R1Y3R1cmUuCiAgKiBccGFyYW0gaEJzICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZS4KICAqIFxwYXJhbSBtQml0cyAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGJpdHMgaW4gY3JjIHJlZ2lvbiB0byBiZSBjYWxjdWxhdGVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1CaXRzID4gMDogWmVybyBwYWRkaW5nIHdpbGwgYmUgdXNlZCBmb3IgQ1JDIGNhbGN1bGF0aW9uLCBpZiB0aGVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGxlc3MgdGhhbiBtQml0cyBiaXRzIGF2YWlsYWJsZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtQml0cyA+IDA6IFplcm8gcGFkZGluZyB3aWxsIGJlIHVzZWQgZm9yIENSQworICogY2FsY3VsYXRpb24sIGlmIHRoZXJlIGFyZSBsZXNzIHRoYW4gbUJpdHMgYml0cyBhdmFpbGFibGUuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbUJpdHMgPCAwOiBObyB6ZXJvIHBhZGRpbmcgaXMgZG9uZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtQml0cyA9IDA6IFRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIGNyYyBjYWxjdWxhdGlvbiBpcyBkeW5hbWljYWxseSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiBiaXRzdHJlYW0gcG9zaXRpb24gYmV0d2VlbiBGREtjcmNTdGFydFJlZygpIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLY3JjRW5kUmVnKCkgY2FsbC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtQml0cyA9IDA6IFRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIGNyYworICogY2FsY3VsYXRpb24gaXMgZHluYW1pY2FsbHksIGRlcGVuZGluZyBvbiBiaXRzdHJlYW0gcG9zaXRpb24gYmV0d2VlbgorICogRkRLY3JjU3RhcnRSZWcoKSBhbmQgRkRLY3JjRW5kUmVnKCkKKyAqIGNhbGwuCiAgKgogICogXHJldHVybiAgSUQgZm9yIHRoZSBjcmVhdGVkIHJlZ2lvbiwgLTEgaW4gY2FzZSBvZiBhbiBlcnJvcgogICovCi1JTlQgRkRLY3JjU3RhcnRSZWcoCi0gICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8sCi0gICAgICAgIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgaEJzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIG1CaXRzCi0gICAgICAgICk7Ci0KK0lOVCBGREtjcmNTdGFydFJlZyhIQU5ETEVfRkRLX0NSQ0lORk8gaENyY0luZm8sIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbUJpdHMpOwogCiAvKioKICAqIFxicmllZiAgRW5kcyBDUkMgcmVnaW9uLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyBjcmMgcmVnaW9uIHNwZWNpZmllZCB3aXRoIEZES2NyY1N0YXJ0UmVnKCkuIFRoZSBudW1iZXIgb2YgYml0cyBpbiBjcmMgcmVnaW9uIGRlcGVuZHMKLSAqIG9uIG1CaXRzIHBhcmFtZXRlciBvZiBGREtjcmNTdGFydFJlZygpLgorICogVGhpcyBmdW5jdGlvbiB0ZXJtaW5hdGVzIGNyYyByZWdpb24gc3BlY2lmaWVkIHdpdGggRkRLY3JjU3RhcnRSZWcoKS4gVGhlCisgKiBudW1iZXIgb2YgYml0cyBpbiBjcmMgcmVnaW9uIGRlcGVuZHMgb24gbUJpdHMgcGFyYW1ldGVyIG9mIEZES2NyY1N0YXJ0UmVnKCkuCiAgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYW5kIHVwZGF0ZXMgY3JjIGluIGluZm8gc3RydWN0dXJlLgogICoKICAqIFxwYXJhbSBoQ3JjSW5mbyAgICAgICAgICAgICAgUG9pbnRlciB0byBjcmMgaW5mbyBzdHVjdHVyZS4KQEAgLTIwOSwxMiArMjEwLDggQEAKICAqCiAgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MKICAqLwotSU5UIEZES2NyY0VuZFJlZygKLSAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgICAgICAgICAgICBoQ3JjSW5mbywKLSAgICAgICAgY29uc3QgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICBoQnMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgcmVnCi0gICAgICAgICk7Ci0KK0lOVCBGREtjcmNFbmRSZWcoSEFORExFX0ZES19DUkNJTkZPIGhDcmNJbmZvLCBjb25zdCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IElOVCByZWcpOwogCiAvKioKICAqIFxicmllZiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGNyYyB2YWx1ZSBmcm9tIGluZm8gc3RydWN0LgpAQCAtMjIzLDkgKzIyMCw2IEBACiAgKgogICogXHJldHVybiAgQ1JDIHZhbHVlIG1hc2tlZCB3aXRoIGNyYyBsZW5ndGguCiAgKi8KLVVTSE9SVCBGREtjcmNHZXRDUkMoCi0gICAgICAgIGNvbnN0IEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgaENyY0luZm8KLSAgICAgICAgKTsKLQorVVNIT1JUIEZES2NyY0dldENSQyhjb25zdCBIQU5ETEVfRkRLX0NSQ0lORk8gaENyY0luZm8pOwogCiAjZW5kaWYgLyogRkRLX0NSQ19IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9GREtfZGVjb3JyZWxhdGUuaCBiL2xpYkZESy9pbmNsdWRlL0ZES19kZWNvcnJlbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2FhYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvaW5jbHVkZS9GREtfZGVjb3JyZWxhdGUuaApAQCAtMCwwICsxLDMxNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFya3VzIExvaHdhc3NlcgorCisgICBEZXNjcmlwdGlvbjogRkRLIFRvb2xzIERlY29ycmVsYXRvcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZES19ERUNPUlJFTEFURV9ICisjZGVmaW5lIEZES19ERUNPUlJFTEFURV9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNkZWZpbmUgRklYUF9NUFMgRklYUF9EQkwKKworI2lmbmRlZiBBUkNIX1BSRUZFUl9NVUxUXzMyeDMyCisjZGVmaW5lIEZJWFBfREVDT1JSIEZJWFBfU0dMCisjZGVmaW5lIEZYX0RFQ09SUjJGWF9EQkwgRlhfU0dMMkZYX0RCTAorI2RlZmluZSBGWF9ERUNPUlIyRlhfU0dMCisjZGVmaW5lIEZYX0RCTDJGWF9ERUNPUlIgRlhfREJMMkZYX1NHTAorI2RlZmluZSBGWF9TR0wyRlhfREVDT1JSCisjZGVmaW5lIERFQ09SUihhKSAoRlhfREJMMkZYQ09OU1RfU0dMKGEpKQorI2RlZmluZSBGTDJGWENPTlNUX0RFQ09SUiBGTDJGWENPTlNUX1NHTAorI2Vsc2UKKyNkZWZpbmUgRklYUF9ERUNPUlIgRklYUF9EQkwKKyNkZWZpbmUgRlhfREVDT1JSMkZYX0RCTAorI2RlZmluZSBGWF9ERUNPUlIyRlhfU0dMIEZYX0RCTDJGWF9TR0wKKyNkZWZpbmUgRlhfREJMMkZYX0RFQ09SUgorI2RlZmluZSBGWF9TR0wyRlhfREVDT1JSIEZYX1NHTDJGWF9EQkwKKyNkZWZpbmUgREVDT1JSKGEpIEZJWFBfREJMKGEpCisjZGVmaW5lIEZMMkZYQ09OU1RfREVDT1JSIEZMMkZYQ09OU1RfREJMCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0gZW51bXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogRGVjb3JyZWxhdG9yIHR5cGVzLgorICovCit0eXBlZGVmIGVudW0geworICBERUNPUlJfTVBTLCAgLyoqPCBEZWNvcnJlbGF0b3IgdHlwZSB1c2VkIGJ5IE1QUyBMUC9IUSAqLworICBERUNPUlJfUFMsICAgLyoqPCBEZWNvcnJlbGF0b3IgdHlwZSB1c2VkIGJ5IEhFQUFDdjIgYW5kIE1QUyBMUCAqLworICBERUNPUlJfVVNBQywgLyoqPCBEZWNvcnJlbGF0b3IgdHlwZSB1c2VkIGJ5IFVTQUMgKi8KKyAgREVDT1JSX0xEICAgIC8qKjwgRGVjb3JyZWxhdG9yIHR5cGUgdXNlZCBieSBNUFMgTG93IERlbGF5ICovCit9IEZES19ERUNPUlJfVFlQRTsKKworLyoqCisgKiBEdWNrZXIgdHlwZXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIERVQ0tFUl9BVVRPTUFUSUMsIC8qKjwgRkRLZGVjb3JyZWxhdGVJbml0KCkgY2hvb3NlcyBjb3JyZWN0IGR1Y2tlciB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiBwcm92aWRlZCBwYXJhbWV0ZXJzLiAqLworICBEVUNLRVJfTVBTLCAgICAgICAvKio8IEZvcmNlIGR1Y2tlciB0eXBlIHRvIE1QUy4gKi8KKyAgRFVDS0VSX1BTICAgICAgICAgLyoqPCBGb3JjZSBkdWNrZXIgdHlwZSB0byBQUy4gKi8KK30gRkRLX0RVQ0tFUl9UWVBFOworCisvKioKKyAqIFJldmVyYiBiYW5kIHR5cGVzLgorICovCit0eXBlZGVmIGVudW0geworICBOT1RfRVhJU1QsIC8qKjwgTWFyayByZXZlcmIgYmFuZCBhcyBub24tZXhpc3RpbmcgKG51bWJlciBvZiBiYW5kcyA9IDApLiAqLworICBERUxBWSwgLyoqPCBSZXZlcmIgYmFuZHMganVzdCBjb250YWlucyBkZWxheSBlbGVtZW50cyBhbmQgbm8gYWxscGFzcyBmaWx0ZXJzLgorICAgICAgICAgICovCisgIENPTU1PTl9SRUFMLCAgLyoqPCBSZWFsIGZpbHRlciBjb2VmZnMsIGNvbW1vbiBmaWx0ZXIgY29lZmZzIHdpdGhpbiBvbmUgcmV2ZXJiCisgICAgICAgICAgICAgICAgICAgYmFuZCAqLworICBDT01NT05fQ1BMWCwgIC8qKjwgQ29tcGxleCBmaWx0ZXIgY29lZmZzLCBjb21tb24gZmlsdGVyIGNvZWZmcyB3aXRoaW4gb25lCisgICAgICAgICAgICAgICAgICAgcmV2ZXJiIGJhbmQgKi8KKyAgSU5ERVBfQ1BMWCwgICAvKio8IENvbXBsZXggZmlsdGVyIGNvZWZmcywgaW5kZXBlbmRlbnQgZmlsdGVyIGNvZWZmcyBmb3IgZWFjaAorICAgICAgICAgICAgICAgICAgIGh5YnJpZCBiYW5kICovCisgIElOREVQX0NQTFhfUFMgLyoqPCBQUyBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gb2YgZ2VuZXJhbCBJTkRFUF9DUExYIHR5cGUgKi8KK30gUkVWQkFORF9GSUxUX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IERFQ09SUl9ERUMgKkhBTkRMRV9ERUNPUlJfREVDOworCit0eXBlZGVmIHN0cnVjdCBEVUNLRVJfSU5TVEFOQ0UgeworICBpbnQgaHlicmlkQmFuZHM7CisgIGludCBwYXJhbWV0ZXJCYW5kczsKKyAgaW50IHBhcnRpYWxseUNvbXBsZXg7CisgIEZES19EVUNLRVJfVFlQRSBkdWNrZXJUeXBlOworCisgIGNvbnN0IFVDSEFSICpxc19uZXh0OworICBjb25zdCBVQ0hBUiAqbWFwUHJvY0JhbmRzMkh5YkJhbmRzOworICBjb25zdCBVQ0hBUiAqbWFwSHliQmFuZHMyUHJvY0JhbmRzOworICAvKiBpbnRlcmxlYXZlZCAgICAgU21vb3RoRGlyZWN0TnJnW10gYW5kIFNtb290aFJldmVyYk5yZ1tdLAorICAgICBub24taW50ZXJsZWF2ZWQgU21vb3RoRGlyZWN0TnJnW10gaW4gY2FzZSBvZiBwYXJhbWV0cmljIHN0ZXJlbyAqLworICBGSVhQX01QUyBTbW9vdGhEaXJSZXZOcmdbMiAqICgyOCldOworCisgIC8qCisgICAgcGFyYW1ldHJpYyBzdGVyZW8KKyAgKi8KKyAgRklYUF9NUFMgcGVha0RlY2F5WygyOCldOworICBGSVhQX01QUyBwZWFrRGlmZlsoMjgpXTsKKyAgRklYUF9EQkwgbWF4VmFsRGlyZWN0RGF0YTsKKyAgRklYUF9EQkwgbWF4VmFsUmV2ZXJiRGF0YTsKKyAgU0NIQVIgc2NhbGVEaXJlY3ROcmc7CisgIFNDSEFSIHNjYWxlUmV2ZXJiTnJnOworICBTQ0hBUiBzY2FsZVNtb290aERpclJldk5yZzsKKyAgU0NIQVIgaGVhZHJvb21TbW9vdGhEaXJSZXZOcmc7CisKK30gRFVDS0VSX0lOU1RBTkNFOworCit0eXBlZGVmIHN0cnVjdCBERUNPUlJfRklMVEVSX0lOU1RBTkNFIHsKKyAgRklYUF9NUFMgKnN0YXRlQ3BseDsKKyAgRklYUF9EQkwgKkRlbGF5QnVmZmVyQ3BseDsKKworICBjb25zdCBGSVhQX0RFQ09SUiAqbnVtZXJhdG9yUmVhbDsKKyAgY29uc3QgRklYUF9TVFAgKmNvZWZmc1BhY2tlZDsKKyAgY29uc3QgRklYUF9ERUNPUlIgKmRlbm9taW5hdG9yUmVhbDsKK30gREVDT1JSX0ZJTFRFUl9JTlNUQU5DRTsKKwordHlwZWRlZiBzdHJ1Y3QgREVDT1JSX0RFQyB7CisgIElOVCBMX3N0YXRlQnVmZmVyQ3BseDsKKyAgRklYUF9EQkwgKnN0YXRlQnVmZmVyQ3BseDsKKyAgSU5UIExfZGVsYXlCdWZmZXJDcGx4OworICBGSVhQX0RCTCAqZGVsYXlCdWZmZXJDcGx4OworCisgIGNvbnN0IFJFVkJBTkRfRklMVF9UWVBFICpSRVZfZmlsdFR5cGU7CisgIGNvbnN0IFVDSEFSICpSRVZfYmFuZE9mZnNldDsKKyAgY29uc3QgVUNIQVIgKlJFVl9kZWxheTsKKyAgY29uc3QgU0NIQVIgKlJFVl9maWx0ZXJPcmRlcjsKKyAgSU5UIHJldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4Wyg0KV07CisgIFVDSEFSIHN0YXRlQnVmZmVyT2Zmc2V0WygzKV07CisKKyAgREVDT1JSX0ZJTFRFUl9JTlNUQU5DRSBGaWx0ZXJbKDcxKV07CisgIERVQ0tFUl9JTlNUQU5DRSBkdWNrZXI7CisKKyAgaW50IG51bWJpbnM7CisgIGludCBwYXJ0aWFsbHlDb21wbGV4OworfSBERUNPUlJfREVDOworCisvKioKKyAqIFxicmllZiAgQ3JlYXRlIG9uZSBpbnN0YW5jZSBvZiBEZWNvcnJlbGF0b3IuCisgKgorICogXHBhcmFtIGhEZWNvcnJEZWMgICAgICAgICAgQSBwb2ludGVyIHRvIGEgZGVjb3JyZWxhdG9yIGluc3RhbmNlIHdoaWNoIHdhcworICogYWxsb2NhdGVkIGV4dGVybmFsbHkuCisgKiBccGFyYW0gYnVmZmVyQ3BseCAgICAgICAgICBFeHRlcm5hbGx5IGFsbG9jYXRlZCBidWZmZXIgKGFsbG9jYXRlICgyKiggKCA4MjUgKQorICogKyAoIDM3MyApICkpIEZJWFBfREJMIHZhbHVlcykuCisgKiBccGFyYW0gYnVmTGVuICAgICAgICAgICAgICBMZW5ndGggb2YgYnVmZmVyQ3BseC4gTXVzdCBiZSA+PSAoMiooICggODI1ICkgKyAoCisgKiAzNzMgKSApKS4KKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCisgKi8KK0lOVCBGREtkZWNvcnJlbGF0ZU9wZW4oSEFORExFX0RFQ09SUl9ERUMgaERlY29yckRlYywgRklYUF9EQkwgKmJ1ZmZlckNwbHgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBidWZMZW4pOworCisvKioKKyAqIFxicmllZiAgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIERlY29ycmVsYXRvciBpbnN0YW5jZS4KKyAqCisgKiBccGFyYW0gaERlY29yckRlYyAgICAgICAgICBBIERlY29ycmVsYXRvciBoYW5kbGUuCisgKiBccGFyYW0gbnJIeWJCYW5kcyAgICAgICAgICBOdW1iZXIgb2YgKGh5YnJpZCkgYmFuZHMuCisgKiBccGFyYW0gZGVjb3JyVHlwZSAgICAgICAgICBEZWNvcnJlbGF0b3IgdHlwZSB0byB1c2UuCisgKiBccGFyYW0gZHVja2VyVHlwZSAgICAgICAgICBEdWNrZXIgdHlwZSB0byB1c2UgKGluIGdlbmVyYWwgdXNlCisgKiBEVUNLRVJfQVVUT01BVElDKS4KKyAqIFxwYXJhbSBkZWNvcnJDb25maWcgICAgICAgIERlcGVuZGluZyBvbiBkZWNvcnJUeXBlIHZhbHVlcyBvZiAwLDEsMiBhcmUKKyAqIGFsbG93ZWQuCisgKiBccGFyYW0gc2VlZCAgICAgICAgICAgICAgICBTZWVkIG9mIGRlY29ycmVsYXRvciBpbnN0YW5jZS4gQWxsb3dlZCBtYXhpbXVtCisgKiB2YWx1ZWQgZGVwZW5kcyBvbiBkZWNvcnJUeXBlLgorICogXHBhcmFtIHBhcnRpYWxseUNvbXBsZXggICAgTG93IHBvd2VyIG9yIGhpZ2ggcXVhbGl0eSBwcm9jZXNzaW5nIDA6IEhRLCAxOiBMUQorICogKG9ubHkgYWxsb3dlZCBmb3IgREVDT1JSX01QUyB8IERFQ09SUl9QUykuCisgKiBccGFyYW0gdXNlRnJhY3REZWxheSAgICAgICBJbmRpY2F0ZSB1c2FnZSBvZiBmcmFjdGlvbmFsIGRlbGF5IDA6IG9mZiwgMTogb24KKyAqIChjdXJyZW50bHkgbm90IHN1cHBvcnRlZCkuCisgKiBccGFyYW0gaXNMZWdhY3lQUyAgICAgICAgICBJbmRpY2F0ZSBpZiBERUNPUlJfUFMgaXMgdXNlZCBmb3IgSEVBQUN2MiAoZm9yIGFsbAorICogb3RoZXIgY2FzZXM6IGlzTGVnYWN5UFMgPSAwKS4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBwYXJhbWV0ZXIgaXMgdG8gc2VsZWN0IHRoZQorICogY29ycmVjdCBudW1iZXIgb2YgcGFyYW0gYmFuZHMgZm9yIHRoZSBkdWNrZXIuCisgKiBccGFyYW0gaW5pdFN0YXRlc0ZsYWcgICAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RhdGVzIGJ1ZmZlciBoYXMgdG8gYmUKKyAqIGNsZWFyZWQuCisgKgorICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgorICovCitJTlQgRkRLZGVjb3JyZWxhdGVJbml0KEhBTkRMRV9ERUNPUlJfREVDIGhEZWNvcnJEZWMsIGNvbnN0IElOVCBuckh5YkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfREVDT1JSX1RZUEUgZGVjb3JyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX0RVQ0tFUl9UWVBFIGR1Y2tlclR5cGUsIGNvbnN0IElOVCBkZWNvcnJDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZWVkLCBjb25zdCBJTlQgcGFydGlhbGx5Q29tcGxleCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHVzZUZyYWN0RGVsYXksIGNvbnN0IElOVCBpc0xlZ2FjeVBTLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaW5pdFN0YXRlc0ZsYWcpOworCisvKioKKyAqIFxicmllZiAgQXBwbHkgRGVjb3JyZWxhdG9yIG9uIGlucHV0IGRhdGEuCisgKgorICogRnVuY3Rpb24gYXBwbGllcyBkZWNvcnJlbGF0b3IgYW5kIGR1Y2tlciBpbnBsYWNlIG9uIGh5YnJpZCBpbnB1dCBkYXRhLgorICogTW9kaWZpZWQgaHlicmlkIGRhdGEgd2lsbCBiZSByZXR1cm5lZCBpbnBsYWNlLgorICoKKyAqIFxwYXJhbSBoRGVjb3JyRGVjICAgICAgICAgIEEgZGVjb3JyZWxhdG9yIGhhbmRsZS4KKyAqIFxwYXJhbSBkYXRhUmVhbEluICAgICAgICAgIEluIChoeWJyaWQpIGRhdGEuCisgKiBccGFyYW0gZGF0YUltYWdJbiAgICAgICAgICBJbiAoaHlicmlkKSBkYXRhLgorICogXHBhcmFtIGRhdGFSZWFsT3V0ICAgICAgICAgT3V0IChoeWJyaWQpIGRhdGEgKGNhbiBiZSBzYW1lIGFzIGRhdGFSZWFsSW4gZm9yCisgKiBpbi1wbGFjZSBjYWxjdWxhdGlvbikuCisgKiBccGFyYW0gZGF0YUltYWdPdXQgICAgICAgICBPdXQgKGh5YnJpZCkgZGF0YSAoY2FuIGJlIHNhbWUgYXMgZGF0YUltYWdJbiBmb3IKKyAqIGluLXBsYWNlIGNhbGN1bGF0aW9uKS4KKyAqIFxwYXJhbSBzdGFydEh5YkJhbmQgICAgICAgIEh5YnJpZCBiYW5kIHRvIHN0YXJ0IHdpdGggZGVjb3JyZWxhdGlvbi4KKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCisgKi8KK0lOVCBGREtkZWNvcnJlbGF0ZUFwcGx5KEhBTkRMRV9ERUNPUlJfREVDIGhEZWNvcnJEZWMsIEZJWFBfREJMICpkYXRhUmVhbEluLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRhdGFJbWFnSW4sIEZJWFBfREJMICpkYXRhUmVhbE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkYXRhSW1hZ091dCwgY29uc3QgSU5UIHN0YXJ0SHliQmFuZCk7CisKKy8qKgorICogXGJyaWVmICBEZXN0cm95IGEgRGVjb3JyZWxhdG9yIGluc3RhbmNlLgorICoKKyAqIERlYWxsb2NhdGUgd2hvbGUgbWVtb3J5IG9mIGRlY29ycmFsdG9yIGFuZCBpbnNpZGUgZHVja2VyLgorICoKKyAqIFxwYXJhbSBoRGVjb3JyRGVjICBQb2ludGVyIHRvIGEgZGVjb2RlcnJvbGF0b3IgaGFuZGxlLiBOdWxsIGluaXRpYWxpemVkIG9uCisgKiByZXR1cm4uCisgKgorICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgorICovCitJTlQgRkRLZGVjb3JyZWxhdGVDbG9zZShIQU5ETEVfREVDT1JSX0RFQyBoRGVjb3JyRGVjKTsKKworLyoqCisgKiBcYnJpZWYgIEdldCBtYXggdmFsdWUgYWRkcmVzcyBvZiBkaXJlY3Qgc2lnbmFsLgorICoKKyAqIEdldCBtYXggdmFsdWUgYWRkcmVzcyBvZiBkaXJlY3Qgc2lnbmFsIG5lZWRlZCBmb3IgZHVja2VyIGVuZXJneSBjYWxjdWxhdGlvbi4KKyAqCisgKiBccGFyYW0gaERlY29yckRlYyAgUG9pbnRlciB0byBhIGRlY29kZXJyb2xhdG9yIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuICBhZGRyZXNzIG9mIG1heCB2YWx1ZQorICovCitGSVhQX0RCTCAqZ2V0QWRkckRpcmVjdFNpZ25hbE1heFZhbChIQU5ETEVfREVDT1JSX0RFQyBoRGVjb3JyRGVjKTsKKworI2VuZGlmIC8qIEZES19ERUNPUlJFTEFURV9IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9GREtfaHlicmlkLmggYi9saWJGREsvaW5jbHVkZS9GREtfaHlicmlkLmgKaW5kZXggNjNmMmQ3MC4uNTgzZjI5OSAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvRkRLX2h5YnJpZC5oCisrKyBiL2xpYkZESy9pbmNsdWRlL0ZES19oeWJyaWQuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxOSArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogTWFya3VzIExvaHdhc3NlcgorICAgQXV0aG9yKHMpOiAgIE1hcmt1cyBMb2h3YXNzZXIKKwogICAgRGVzY3JpcHRpb246IEZESyBUb29scyBIeWJyaWQgRmlsdGVyYmFuawogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fRkRLX0hZQlJJRF9ICi0jZGVmaW5lIF9fRkRLX0hZQlJJRF9ICi0KLQorI2lmbmRlZiBGREtfSFlCUklEX0gKKyNkZWZpbmUgRkRLX0hZQlJJRF9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKQEAgLTEwMSw1NyArMTExLDUzIEBACiAgKiBIeWJyaWQgRmlsdGVyYmFuZCBtb2Rlcy4KICAqLwogdHlwZWRlZiBlbnVtIHsKLSAgICBUSFJFRV9UT19URU4sCi0gICAgVEhSRUVfVE9fVFdFTFZFLAotICAgIFRIUkVFX1RPX1NJWFRFRU4KKyAgVEhSRUVfVE9fVEVOLAorICBUSFJFRV9UT19UV0VMVkUsCisgIFRIUkVFX1RPX1NJWFRFRU4KIAogfSBGREtfSFlCUklEX01PREU7CiAKLQogLyotLS0tLS0tLS0tLS0tLS0gc3RydWN0dXJlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCBGREtfSFlCUklEX1NFVFVQICpIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUDsKK3R5cGVkZWYgY29uc3Qgc3RydWN0IEZES19IWUJSSURfU0VUVVAgKkhBTkRMRV9GREtfSFlCUklEX1NFVFVQOwogCi10eXBlZGVmIHN0cnVjdAotewotICBGSVhQX0RCTCAgICAgICAgICAgICAqYnVmZmVyTEZSZWFsWzNdOyAgICAgLyohPCBMRiByZWFsIGZpbHRlciBzdGF0ZXMuICovCi0gIEZJWFBfREJMICAgICAgICAgICAgICpidWZmZXJMRkltYWdbM107ICAgICAvKiE8IExGIGltYWcgZmlsdGVyIHN0YXRlcy4gKi8KLSAgRklYUF9EQkwgICAgICAgICAgICAgKmJ1ZmZlckhGUmVhbFsxM107ICAgIC8qITwgSEYgcmVhbCBkZWxheSBsaW5lcy4gKi8KLSAgRklYUF9EQkwgICAgICAgICAgICAgKmJ1ZmZlckhGSW1hZ1sxM107ICAgIC8qITwgSEYgaW1hZyBkZWxheSBsaW5lcy4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9EQkwgKmJ1ZmZlckxGUmVhbFszXTsgIC8qITwgTEYgcmVhbCBmaWx0ZXIgc3RhdGVzLiAqLworICBGSVhQX0RCTCAqYnVmZmVyTEZJbWFnWzNdOyAgLyohPCBMRiBpbWFnIGZpbHRlciBzdGF0ZXMuICovCisgIEZJWFBfREJMICpidWZmZXJIRlJlYWxbMTNdOyAvKiE8IEhGIHJlYWwgZGVsYXkgbGluZXMuICovCisgIEZJWFBfREJMICpidWZmZXJIRkltYWdbMTNdOyAvKiE8IEhGIGltYWcgZGVsYXkgbGluZXMuICovCiAKLSAgSU5UICAgICAgICAgICAgICAgICAgIGJ1ZmZlckxGcG9zOyAgICAgICAgIC8qITwgUG9zaXRpb24gdG8gd3JpdGUgaW5jb21pbmcgZGF0YSBpbnRvIHJpbmdidWZmZXIuICovCi0gIElOVCAgICAgICAgICAgICAgICAgICBidWZmZXJIRnBvczsgICAgICAgICAvKiE8IERlbGF5IGxpbmUgcG9zaXRpb25pbmcuICovCi0gIElOVCAgICAgICAgICAgICAgICAgICBuckJhbmRzOyAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgYmFuZHMuICovCi0gIElOVCAgICAgICAgICAgICAgICAgICBjcGx4QmFuZHM7ICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjb21wbGV4IFFNRiBiYW5kcy4qLwotICBVQ0hBUiAgICAgICAgICAgICAgICAgaGZNb2RlOyAgICAgICAgICAgICAgLyohPCBGbGFnIHNpZ25hbGl6ZXMgdHJlYXRtZW50IG9mIEhGIGJhbmRzLiAqLworICBJTlQgYnVmZmVyTEZwb3M7IC8qITwgUG9zaXRpb24gdG8gd3JpdGUgaW5jb21pbmcgZGF0YSBpbnRvIHJpbmdidWZmZXIuICovCisgIElOVCBidWZmZXJIRnBvczsgLyohPCBEZWxheSBsaW5lIHBvc2l0aW9uaW5nLiAqLworICBJTlQgbnJCYW5kczsgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBiYW5kcy4gKi8KKyAgSU5UIGNwbHhCYW5kczsgICAvKiE8IE51bWJlciBvZiBjb21wbGV4IFFNRiBiYW5kcy4qLworICBVQ0hBUiBoZk1vZGU7ICAgIC8qITwgRmxhZyBzaWduYWxpemVzIHRyZWF0bWVudCBvZiBIRiBiYW5kcy4gKi8KIAotICBGSVhQX0RCTCAgICAgICAgICAgICAqcExGbWVtb3J5OyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIExGIHN0YXRlcyBidWZmZXIuICovCi0gIEZJWFBfREJMICAgICAgICAgICAgICpwSEZtZW1vcnk7ICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gSEYgc3RhdGVzIGJ1ZmZlci4gKi8KKyAgRklYUF9EQkwgKnBMRm1lbW9yeTsgLyohPCBQb2ludGVyIHRvIExGIHN0YXRlcyBidWZmZXIuICovCisgIEZJWFBfREJMICpwSEZtZW1vcnk7IC8qITwgUG9pbnRlciB0byBIRiBzdGF0ZXMgYnVmZmVyLiAqLwogCi0gIFVJTlQgICAgICAgICAgICAgICAgICBMRm1lbW9yeVNpemU7ICAgICAgICAvKiE8IFNpemUgb2YgTEYgc3RhdGVzIGJ1ZmZlci4gKi8KLSAgVUlOVCAgICAgICAgICAgICAgICAgIEhGbWVtb3J5U2l6ZTsgICAgICAgIC8qITwgU2l6ZSBvZiBIRiBzdGF0ZXMgYnVmZmVyLiAqLworICBVSU5UIExGbWVtb3J5U2l6ZTsgLyohPCBTaXplIG9mIExGIHN0YXRlcyBidWZmZXIuICovCisgIFVJTlQgSEZtZW1vcnlTaXplOyAvKiE8IFNpemUgb2YgSEYgc3RhdGVzIGJ1ZmZlci4gKi8KIAotICBIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCBwU2V0dXA7ICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGZpbHRlciBzZXR1cC4gKi8KKyAgSEFORExFX0ZES19IWUJSSURfU0VUVVAgcFNldHVwOyAvKiE8IFBvaW50ZXIgdG8gZmlsdGVyIHNldHVwLiAqLwogCiB9IEZES19BTkFfSFlCX0ZJTFRFUjsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgbnJCYW5kczsgICAvKiE8IE51bWJlciBvZiBRTUYgYmFuZHMuICovCisgIElOVCBjcGx4QmFuZHM7IC8qITwgTnVtYmVyIG9mIGNvbXBsZXggUU1GIGJhbmRzLiovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIElOVCAgICAgICAgICAgICAgICAgICBuckJhbmRzOyAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgYmFuZHMuICovCi0gIElOVCAgICAgICAgICAgICAgICAgICBjcGx4QmFuZHM7ICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjb21wbGV4IFFNRiBiYW5kcy4qLwotCi0gIEhBTkRMRV9GREtfSFlCUklEX1NFVFVQIHBTZXR1cDsgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gZmlsdGVyIHNldHVwLiAqLworICBIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCBwU2V0dXA7IC8qITwgUG9pbnRlciB0byBmaWx0ZXIgc2V0dXAuICovCiAKIH0gRkRLX1NZTl9IWUJfRklMVEVSOwogCiB0eXBlZGVmIEZES19BTkFfSFlCX0ZJTFRFUiAqSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUjsKIHR5cGVkZWYgRkRLX1NZTl9IWUJfRklMVEVSICpIQU5ETEVfRkRLX1NZTl9IWUJfRklMVEVSOwogCi0KIC8qKgogICogXGJyaWVmICBDcmVhdGUgb25lIGluc3RhbmNlIG9mIEh5YnJpZCBBbmFseWlzIEZpbHRlcmJhbmsuCiAgKgotICogXHBhcmFtIGhBbmFseXNpc0h5YkZpbHRlciAgUG9pbnRlciB0byBhbiBvdXRseWluZyBhbGxvY2F0ZWQgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgc3RydWN0dXJlLgorICogXHBhcmFtIGhBbmFseXNpc0h5YkZpbHRlciAgUG9pbnRlciB0byBhbiBvdXRseWluZyBhbGxvY2F0ZWQgSHlicmlkIEFuYWx5c2lzCisgKiBGaWx0ZXJiYW5rIHN0cnVjdHVyZS4KICAqIFxwYXJhbSBwTEZtZW1vcnkgICAgICAgICAgIFBvaW50ZXIgdG8gb3V0bHlpbmcgYnVmZmVyIHVzZWQgTEYgZmlsdGVyaW5nLgogICogXHBhcmFtIExGbWVtb3J5U2l6ZSAgICAgICAgU2l6ZSBvZiBwTEZtZW1vcnkgaW4gYnl0ZXMuCiAgKiBccGFyYW0gcEhGbWVtb3J5ICAgICAgICAgICBQb2ludGVyIHRvIG91dGx5aW5nIGJ1ZmZlciB1c2VkIEhGIGRlbGF5IGxpbmUuCkBAIC0xNTksNDggKzE2NSwzNiBAQAogICoKICAqIFxyZXR1cm4gIDAgb24gc3VjY2Vzcy4KICAqLwotSU5UIEZES2h5YnJpZEFuYWx5c2lzT3BlbigKLSAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyLAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwTEZtZW1vcnksCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgIExGbWVtb3J5U2l6ZSwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcEhGbWVtb3J5LAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICBIRm1lbW9yeVNpemUKLSAgICAgICAgKTsKLQorSU5UIEZES2h5YnJpZEFuYWx5c2lzT3BlbihIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSIGhBbmFseXNpc0h5YkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBMRm1lbW9yeSwgY29uc3QgVUlOVCBMRm1lbW9yeVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBwSEZtZW1vcnksIGNvbnN0IFVJTlQgSEZtZW1vcnlTaXplKTsKIAogLyoqCi0gKiBcYnJpZWYgIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSBIeWJyZGlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgaW5zdGFuY2UuCisgKiBcYnJpZWYgIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSBIeWJyaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBpbnN0YW5jZS4KICAqCiAgKiBccGFyYW0gaEFuYWx5c2lzSHliRmlsdGVyICBBIEh5YnJpZCBBbmFseXNpcyBGaWx0ZXJiYW5rIGhhbmRsZS4KICAqIFxwYXJhbSBtb2RlICAgICAgICAgICAgICAgIFNlbGVjdCBoeWJyaWQgZmlsdGVyIGNvbmZpZ3VyYXRpb24uCiAgKiBccGFyYW0gcW1mQmFuZHMgICAgICAgICAgICBOdW1iZXIgb2YgcW1mIGJhbmRzIHRvIGJlIHByb2Nlc3NlZC4KICAqIFxwYXJhbSBjcGx4QmFuZHMgICAgICAgICAgIE51bWJlciBvZiBjb21wbGV4IHFtZiBiYW5kcyB0byBiZSBwcm9jZXNzZWQuCi0gKiBccGFyYW0gaW5pdFN0YXRlc0ZsYWcgICAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RhdGVzIGJ1ZmZlciBoYXMgdG8gYmUgY2xlYXJlZC4KKyAqIFxwYXJhbSBpbml0U3RhdGVzRmxhZyAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdGF0ZXMgYnVmZmVyIGhhcyB0byBiZQorICogY2xlYXJlZC4KICAqCiAgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCiAgKi8KLUlOVCBGREtoeWJyaWRBbmFseXNpc0luaXQoCi0gICAgICAgIEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgIGhBbmFseXNpc0h5YkZpbHRlciwKLSAgICAgICAgY29uc3QgRkRLX0hZQlJJRF9NT0RFICAgICAgbW9kZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgcW1mQmFuZHMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGNwbHhCYW5kcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgaW5pdFN0YXRlc0ZsYWcKLSAgICAgICAgKTsKLQorSU5UIEZES2h5YnJpZEFuYWx5c2lzSW5pdChIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSIGhBbmFseXNpc0h5YkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX0hZQlJJRF9NT0RFIG1vZGUsIGNvbnN0IElOVCBxbWZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGNwbHhCYW5kcywgY29uc3QgSU5UIGluaXRTdGF0ZXNGbGFnKTsKIAogLyoqCi0gKiBcYnJpZWYgIEFkanVzdCBIeWJyZGlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgc3RhdGVzLgorICogXGJyaWVmICBBZGp1c3QgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgc3RhdGVzLgogICoKICAqIFxwYXJhbSBoQW5hbHlzaXNIeWJGaWx0ZXIgIEEgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgaGFuZGxlLgogICogXHBhcmFtIHNjYWxpbmdWYWx1ZSAgICAgICAgU2NhbGluZyB2YWx1ZSB0byBiZSBhcHBsaWVkIG9uIGZpbHRlciBzdGF0ZXMuCiAgKgogICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgogICovCi1JTlQgRkRLaHlicmlkQW5hbHlzaXNTY2FsZVN0YXRlcygKLSAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBzY2FsaW5nVmFsdWUKLSAgICAgICAgKTsKLQorSU5UIEZES2h5YnJpZEFuYWx5c2lzU2NhbGVTdGF0ZXMoSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiBoQW5hbHlzaXNIeWJGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2NhbGluZ1ZhbHVlKTsKIAogLyoqCiAgKiBcYnJpZWYgIEFwcGx5IEh5YnJpZCBBbmFseXNpcyBGaWx0ZXJiYW5rIG9uIFFtZiBpbnB1dCBkYXRhLgpAQCAtMjEzLDE0ICsyMDcsMTEgQEAKICAqCiAgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCiAgKi8KLUlOVCBGREtoeWJyaWRBbmFseXNpc0FwcGx5KAotICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZSZWFsLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcEh5YnJpZFJlYWwsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIHBIeWJyaWRJbWFnCi0gICAgICAgICk7Ci0KK0lOVCBGREtoeWJyaWRBbmFseXNpc0FwcGx5KEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgaEFuYWx5c2lzSHliRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBIeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBIeWJyaWRJbWFnKTsKIAogLyoqCiAgKiBcYnJpZWYgIENsb3NlIGEgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgaW5zdGFuY2UuCkBAIC0yMjksOSArMjIwLDcgQEAKICAqCiAgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCiAgKi8KLUlOVCBGREtoeWJyaWRBbmFseXNpc0Nsb3NlKAotICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIKLSAgICAgICAgKTsKK0lOVCBGREtoeWJyaWRBbmFseXNpc0Nsb3NlKEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgaEFuYWx5c2lzSHliRmlsdGVyKTsKIAogLyoqCiAgKiBcYnJpZWYgIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSBIeWJyZGlkIFN5bnRoZXNpcyBGaWx0ZXJiYW5rIGluc3RhbmNlLgpAQCAtMjQzLDEyICsyMzIsOSBAQAogICoKICAqIFxyZXR1cm4gIDAgb24gc3VjY2Vzcy4KICAqLwotSU5UIEZES2h5YnJpZFN5bnRoZXNpc0luaXQoCi0gICAgICAgIEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgIGhTeW50aGVzaXNIeWJGaWx0ZXIsCi0gICAgICAgIGNvbnN0IEZES19IWUJSSURfTU9ERSAgICAgIG1vZGUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHFtZkJhbmRzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBjcGx4QmFuZHMKLSAgICAgICAgKTsKK0lOVCBGREtoeWJyaWRTeW50aGVzaXNJbml0KEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgaFN5bnRoZXNpc0h5YkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19IWUJSSURfTU9ERSBtb2RlLCBjb25zdCBJTlQgcW1mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY3BseEJhbmRzKTsKIAogLyoqCiAgKiBcYnJpZWYgIEFwcGx5IEh5YnJpZCBBbmFseXNpcyBGaWx0ZXJiYW5rIG9uIEh5YnJpZCBkYXRhLgpAQCAtMjU5LDE1ICsyNDUsMTEgQEAKICAqIFxwYXJhbSBwUW1mUmVhbCAgICAgICAgICAgICBRbWYgb3V0cHV0IGRhdGEuCiAgKiBccGFyYW0gcFFtZkltYWcgICAgICAgICAgICAgUW1mIG91dHB1dCBkYXRhLgogICoKLSAqIFxyZXR1cm4gIDAgb24gc3VjY2Vzcy4KICAqLwotSU5UIEZES2h5YnJpZFN5bnRoZXNpc0FwcGx5KAotICAgICAgICBIQU5ETEVfRkRLX1NZTl9IWUJfRklMVEVSICBoU3ludGhlc2lzSHliRmlsdGVyLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwSHlicmlkUmVhbCwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcEh5YnJpZEltYWcsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIHBRbWZSZWFsLAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwUW1mSW1hZwotICAgICAgICApOwordm9pZCBGREtoeWJyaWRTeW50aGVzaXNBcHBseShIQU5ETEVfRkRLX1NZTl9IWUJfRklMVEVSIGhTeW50aGVzaXNIeWJGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwSHlicmlkUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBIeWJyaWRJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgcFFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBwUW1mSW1hZyk7CiAKLQotI2VuZGlmIC8qIF9fRkRLX0hZQlJJRF9IICovCisjZW5kaWYgLyogRkRLX0hZQlJJRF9IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9GREtfbHBjLmggYi9saWJGREsvaW5jbHVkZS9GREtfbHBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxZGQxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYkZESy9pbmNsdWRlL0ZES19scGMuaApAQCAtMCwwICsxLDIxOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorCisgICBEZXNjcmlwdGlvbjogTFBDIHJlbGF0ZWQgZnVuY3Rpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRkRLX0xQQ19ICisjZGVmaW5lIEZES19MUENfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjZGVmaW5lIExQQ19NQVhfT1JERVIgMjQKKworLyoKKyAqIEV4cGVyaW1lbnRhbCBzb2x1dGlvbiBmb3IgbGF0dGljZSBmaWx0ZXIgc3Vic3RpdHV0aW9uLgorICogTFBDX1NZTlRIRVNJU19JSVIgbWFjcm8gbXVzdCBiZSBhY3RpdmF0ZWQgaW4gYWFjZGVjX3Rucy5jcHAuCisgKiBXaGVuIExQQ19TWU5USEVTSVNfSUlSIGVuYWJsZWQsIHRoZXJlIHdpbGwgYmUgYSBzdWJzdGl0dXRpb24gb2YgdGhlIGRlZmF1bHQKKyAqIGxwYyBzeW50aGVzaXMgbGF0dGljZSBmaWx0ZXIgYnkgYW4gSUlSIHN5bnRoZXNpcyBmaWx0ZXIgKHdpdGggYSBjb252ZXJzaW9ub2YKKyAqIHRoZSBmaWx0ZXIgY29lZnMpLiBMUENfVE5TIHJlbGF0ZWQgbWFjcm9zIGFyZSBpbnRlbmRlZCB0byBpbXBsZW1lbnQgdGhlIGRhdGEKKyAqIHR5cGVzIHVzZWQgYnkgdGhlIENMcGNfU3ludGhlc2lzIHZhcmlhbnQgd2hpY2ggaXMgdXNlZCBmb3IgdGhpcyBzb2x1dGlvbi4KKyAqICovCisKKy8qICNkZWZpbmUgTFBDX1ROU19MT1dFUl9QUkVDSVNJT04gKi8KKwordHlwZWRlZiBGSVhQX0RCTCBGSVhQX0xQQ19UTlM7CisjZGVmaW5lIEZYX0RCTDJGWF9MUENfVE5TKHgpICh4KQorI2RlZmluZSBGWF9EQkwyRlhDT05TVF9MUENfVE5TKHgpICh4KQorI2RlZmluZSBGWF9MUENfVE5TMkZYX0RCTCh4KSAoeCkKKyNkZWZpbmUgRkwyRlhDT05TVF9MUENfVE5TKHZhbCkgRkwyRlhDT05TVF9EQkwodmFsKQorI2RlZmluZSBNQVhWQUxfTFBDX1ROUyBNQVhWQUxfREJMCisKK3R5cGVkZWYgRklYUF9TR0wgRklYUF9MUEM7CisjZGVmaW5lIEZYX0RCTDJGWF9MUEMoeCkgRlhfREJMMkZYX1NHTCgoRklYUF9EQkwpKHgpKQorI2RlZmluZSBGWF9EQkwyRlhDT05TVF9MUEMoeCkgRlhfREJMMkZYQ09OU1RfU0dMKHgpCisjZGVmaW5lIEZYX0xQQzJGWF9EQkwoeCkgRlhfU0dMMkZYX0RCTCh4KQorI2RlZmluZSBGTDJGWENPTlNUX0xQQyh2YWwpIEZMMkZYQ09OU1RfU0dMKHZhbCkKKyNkZWZpbmUgTUFYVkFMX0xQQyBNQVhWQUxfU0dMCisKKy8qKgorICogXGJyaWVmIE9idGFpbiByZXNpZHVhbCBzaWduYWwgdGhyb3VnaCBMUEMgYW5hbHlzaXMuCisgKiBccGFyYW0gc2lnbmFsIHBvaW50ZXIgdG8gYnVmZmVyIGhvbGRpbmcgc2lnbmFsIHRvIGJlIGFuYWx5c2VkLiBSZXNpZHVhbCBpcworICogcmV0dXJuZWQgdGhlcmUgKGluIHBsYWNlKQorICogXHBhcmFtIHNpZ25hbF9zaXplIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBkYXRhIGluIHBEYXRhCisgKiBccGFyYW0gbHBjQ29lZmZfbSB0aGUgTFBDIGZpbHRlciBjb2VmZmljaWVudCBtYW50aXNzYXMKKyAqIFxwYXJhbSBscGNDb2VmZl9lIHRoZSBMUEMgZmlsdGVyIGNvZWZmaWNpZW50IGV4cG9uZW50CisgKiBccGFyYW0gb3JkZXIgdGhlIExQQyBmaWx0ZXIgb3JkZXIgKHNpemUgb2YgY29lZmYpCisgKiBccGFyYW0gZmlsdFN0YXRlIFBvaW50ZXIgdG8gc3RhdGUgYnVmZmVyIG9mIHNpemUgb3JkZXIKKyAqIFxwYXJhbSBmaWx0U3RhdGVJbmRleCBwb2ludGVyIHRvIHN0YXRlIGluZGV4IHN0b3JhZ2UKKyAqLwordm9pZCBDTHBjX0FuYWx5c2lzKEZJWFBfREJMIHNpZ25hbFtdLCBjb25zdCBpbnQgc2lnbmFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9MUEMgbHBjQ29lZmZfbVtdLCBjb25zdCBpbnQgbHBjQ29lZmZfZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3JkZXIsIEZJWFBfREJMICpmaWx0U3RhdGUsIGludCAqZmlsdFN0YXRlSW5kZXgpOworCisvKioKKyAqIFxicmllZiBTeW50aGVzaXplIHNpZ25hbCBmb20gcmVzaWR1YWwgdGhyb3VnaCBMUEMgc3ludGhlc2lzLCB1c2luZyBMUAorICogY29lZmZpY2llbnRzLgorICogXHBhcmFtIHNpZ25hbCBwb2ludGVyIHRvIGJ1ZmZlciBob2xkaW5nIHRoZSByZXNpZHVhbCBzaWduYWwuIFRoZSBzeW50aGVzaXMgaXMKKyAqIHJldHVybmVkIHRoZXJlIChpbiBwbGFjZSkKKyAqIFxwYXJhbSBzaWduYWxfc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgZGF0YSBpbiBwRGF0YQorICogXHBhcmFtIGluYyBidWZmZXIgdHJhdmVyc2FsIGluY3JlbWVudCBmb3Igc2lnbmFsCisgKiBccGFyYW0gY29lZmYgdGhlIExQQyBmaWx0ZXIgY29lZmZpY2llbnRzCisgKiBccGFyYW0gY29lZmZfZSBleHBvbmVudCBvZiBjb2VmZgorICogXHBhcmFtIG9yZGVyIHRoZSBMUEMgZmlsdGVyIG9yZGVyIChzaXplIG9mIGNvZWZmKQorICogXHBhcmFtIHN0YXRlIHN0YXRlIGJ1ZmZlciBvZiBzaXplIExQQ19NQVhfT1JERVIKKyAqIFxwYXJhbSBwU3RhdGVJbmRleCBwb2ludGVyIHRvIHN0YXRlIGluZGV4IHN0b3JhZ2UKKyAqLwordm9pZCBDTHBjX1N5bnRoZXNpcyhGSVhQX0RCTCAqc2lnbmFsLCBjb25zdCBpbnQgc2lnbmFsX3NpemUsIGNvbnN0IGludCBzaWduYWxfZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGluYywgY29uc3QgRklYUF9MUENfVE5TICpscGNDb2VmZl9tLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbHBjQ29lZmZfZSwgY29uc3QgaW50IG9yZGVyLCBGSVhQX0RCTCAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIGludCAqcFN0YXRlSW5kZXgpOwordm9pZCBDTHBjX1N5bnRoZXNpcyhGSVhQX0RCTCAqc2lnbmFsLCBjb25zdCBpbnQgc2lnbmFsX3NpemUsIGNvbnN0IGludCBzaWduYWxfZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGluYywgY29uc3QgRklYUF9MUEMgY29lZmZbXSwgY29uc3QgaW50IGNvZWZmX2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvcmRlciwgRklYUF9EQkwgKmZpbHRTdGF0ZSwgaW50ICpwU3RhdGVJbmRleCk7CisKKy8qKgorICogXGJyaWVmIFN5bnRoZXNpemUgc2lnbmFsIGZvbSByZXNpZHVhbCB0aHJvdWdoIExQQyBzeW50aGVzaXMsIHVzaW5nIFBhckNvcgorICogY29lZmZpY2llbnRzLiBUaGUgYWxnb3JpdGhtIGFzc3VtZXMgYSBmaWx0ZXIgZ2FpbiBvZiBtYXggMS4wLiBJZiB0aGUgZmlsdGVyCisgKiBnYWluIGlzIGhpZ2hlciwgdGhpcyBtdXN0IGJlIGFjY291bnRlZCBpbnRvIHRoZSB2YWx1ZXMgb2Ygc2lnbmFsX2UKKyAqIGFuZC9vciBzaWduYWxfZV9vdXQgdG8gYXZvaWQgb3ZlcmZsb3dzLgorICogXHBhcmFtIHNpZ25hbCBwb2ludGVyIHRvIGJ1ZmZlciBob2xkaW5nIHRoZSByZXNpZHVhbCBzaWduYWwuIFRoZSBzeW50aGVzaXMgaXMKKyAqIHJldHVybmVkIHRoZXJlIChpbiBwbGFjZSkKKyAqIFxwYXJhbSBzaWduYWxfc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgZGF0YSBpbiBwRGF0YQorICogXHBhcmFtIGluYyBidWZmZXIgdHJhdmVyc2FsIGluY3JlbWVudCBmb3Igc2lnbmFsCisgKiBccGFyYW0gY29lZmYgdGhlIExQQyBmaWx0ZXIgY29lZmZpY2llbnRzCisgKiBccGFyYW0gY29lZmZfZSBleHBvbmVudCBvZiBjb2VmZgorICogXHBhcmFtIG9yZGVyIHRoZSBMUEMgZmlsdGVyIG9yZGVyIChzaXplIG9mIGNvZWZmKQorICogXHBhcmFtIHN0YXRlIHN0YXRlIGJ1ZmZlciBvZiBzaXplIExQQ19NQVhfT1JERVIKKyAqLwordm9pZCBDTHBjX1N5bnRoZXNpc0xhdHRpY2UoRklYUF9EQkwgKnNpZ25hbCwgY29uc3QgaW50IHNpZ25hbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNpZ25hbF9lLCBjb25zdCBpbnQgc2lnbmFsX2Vfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGluYywgY29uc3QgRklYUF9TR0wgKmNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG9yZGVyLCBGSVhQX0RCTCAqc3RhdGUpOworCit2b2lkIENMcGNfU3ludGhlc2lzTGF0dGljZShGSVhQX0RCTCAqUkVTVFJJQ1Qgc2lnbmFsLCBjb25zdCBpbnQgc2lnbmFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2lnbmFsX2UsIGNvbnN0IGludCBzaWduYWxfZV9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5jLCBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgY29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3JkZXIsIEZJWFBfREJMICpSRVNUUklDVCBzdGF0ZSk7CisKKy8qKgorICogXGJyaWVmCisgKi8KK0lOVCBDTHBjX1BhcmNvclRvTHBjKGNvbnN0IEZJWFBfTFBDX1ROUyByZWZsQ29lZmZbXSwgRklYUF9MUENfVE5TIExwY0NvZWZmW10sCisgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtT2ZDb2VmZiwgRklYUF9EQkwgd29ya0J1ZmZlcltdKTsKK0lOVCBDTHBjX1BhcmNvclRvTHBjKGNvbnN0IEZJWFBfTFBDIHJlZmxDb2VmZltdLCBGSVhQX0xQQyBMcGNDb2VmZltdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bU9mQ29lZmYsIEZJWFBfREJMIHdvcmtCdWZmZXJbXSk7CisKKy8qKgorICogXGJyaWVmIENhbGN1bGF0ZSBQYXJDb3IgKFBhcnRpYWwgYXV0b0NvcnJlbGF0aW9uLCByZWZsZWN0aW9uKSBjb2VmZmljaWVudHMKKyAqIGZyb20gYXV0b2NvcnJlbGF0aW9uIGNvZWZmaWNpZW50cyB1c2luZyB0aGUgU2NodXIgYWxnb3JpdGhtIChpbnN0ZWFkIG9mCisgKiBMZXZpbnNvbiBEdXJiaW4pLgorICogXHBhcmFtIGFjb3JyIG9yZGVyKzEgYXV0b2NvcnJlbGF0aW9uIGNvZWZmaWNpZW50cworICogXHBhcmFtIHJlZmxDb2VmZiBvdXRwdXQgcmVmbGVjdGlvbiAvUGFyQ29yIGNvZWZmaWNpZW50cy4gVGhlIGZpcnN0CisgKiBjb2VmZmljaWVudCB3aGljaCBpcyBhbHdheXMgMS4wIGlzIG9tbWl0dGVkLgorICogXHBhcmFtIG9yZGVyIG51bWJlciBvZiBhY29yciAvIHJlZmxDb2VmZiBjb2VmZmljaWVudHMuCisgKiBccGFyYW0gcFByZWRpY3Rpb25HYWluX20gcHJlZGljdGlvbiBnYWluIG1hbnRpc3NhCisgKiBccGFyYW0gcFByZWRpY3Rpb25HYWluX2UgcHJlZGljdGlvbiBnYWluIGV4cG9uZW50CisgKi8KK3ZvaWQgQ0xwY19BdXRvVG9QYXJjb3IoRklYUF9EQkwgYWNvcnJbXSwgY29uc3QgaW50IGFjb3JyX2UsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfTFBDIHJlZmxDb2VmZltdLCBjb25zdCBpbnQgb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwUHJlZGljdGlvbkdhaW5fbSwgSU5UICpwUHJlZGljdGlvbkdhaW5fZSk7CisKKyNlbmRpZiAvKiBGREtfTFBDX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL0ZES19tYXRyaXhDYWxsb2MuaCBiL2xpYkZESy9pbmNsdWRlL0ZES19tYXRyaXhDYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmI1NGZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUvRkRLX21hdHJpeENhbGxvYy5oCkBAIC0wLDAgKzEsMjMwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IG1hdHJpeCBtZW1vcnkgYWxsb2NhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZES19NQVRSSVhDQUxMT0NfSAorI2RlZmluZSBGREtfTUFUUklYQ0FMTE9DX0gKKworI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgorI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKy8qIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBGREtfQUxMT0NBVEVfTUVNT1JZXzFEIGluc3RlYWQgb2YgZmRrQ2FsbG9jTWF0cml4MUQKKyAqLwordm9pZCogZmRrQ2FsbG9jTWF0cml4MUQoVUlOVCBkaW0xLCBVSU5UIHNpemUpOwordm9pZCogZmRrQ2FsbG9jTWF0cml4MURfYWxpZ25lZChVSU5UIGRpbTEsIFVJTlQgc2l6ZSk7CisvKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgRkRLX0FMTE9DQVRFX01FTU9SWV8xRF9JTlQgaW5zdGVhZCBvZgorICogZmRrQ2FsbG9jTWF0cml4MURfaW50ICovCit2b2lkKiBmZGtDYWxsb2NNYXRyaXgxRF9pbnQoVUlOVCBkaW0xLCBVSU5UIHNpemUsIE1FTU9SWV9TRUNUSU9OIHMpOwordm9pZCogZmRrQ2FsbG9jTWF0cml4MURfaW50X2FsaWduZWQoVUlOVCBkaW0xLCBVSU5UIHNpemUsIE1FTU9SWV9TRUNUSU9OIHMpOworLyogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEZES19GUkVFX01FTU9SWV8xRCBpbnN0ZWFkIG9mIGZka0ZyZWVNYXRyaXgxRCAqLwordm9pZCBmZGtGcmVlTWF0cml4MUQodm9pZCogcCk7Cit2b2lkIGZka0ZyZWVNYXRyaXgxRF9hbGlnbmVkKHZvaWQqIHApOworCisvKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgRkRLX0FMTE9DQVRFX01FTU9SWV8yRCBpbnN0ZWFkIG9mIGZka0NhbGxvY01hdHJpeDJECisgKi8KK3ZvaWQqKiBmZGtDYWxsb2NNYXRyaXgyRChVSU5UIGRpbTEsIFVJTlQgZGltMiwgVUlOVCBzaXplKTsKK3ZvaWQqKiBmZGtDYWxsb2NNYXRyaXgyRF9hbGlnbmVkKFVJTlQgZGltMSwgVUlOVCBkaW0yLCBVSU5UIHNpemUpOworLyogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UIGluc3RlYWQgb2YKKyAqIGZka0NhbGxvY01hdHJpeDJEX2ludCAqLwordm9pZCoqIGZka0NhbGxvY01hdHJpeDJEX2ludChVSU5UIGRpbTEsIFVJTlQgZGltMiwgVUlOVCBzaXplLCBNRU1PUllfU0VDVElPTiBzKTsKKy8qIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVF9BTElHTkVEIGluc3RlYWQgb2YKKyAqIGZka0NhbGxvY01hdHJpeDJEX2ludF9hbGlnbmVkICovCit2b2lkKiogZmRrQ2FsbG9jTWF0cml4MkRfaW50X2FsaWduZWQoVUlOVCBkaW0xLCBVSU5UIGRpbTIsIFVJTlQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1PUllfU0VDVElPTiBzKTsKKy8qIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBGREtfRlJFRV9NRU1PUllfMkQgaW5zdGVhZCBvZiBmZGtGcmVlTWF0cml4MkQgKi8KK3ZvaWQgZmRrRnJlZU1hdHJpeDJEKHZvaWQqKiBwKTsKKy8qIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBGREtfRlJFRV9NRU1PUllfMkRfQUxJR05FRCBpbnN0ZWFkIG9mCisgKiBmZGtGcmVlTWF0cml4MkRfYWxpZ25lZCAqLwordm9pZCBmZGtGcmVlTWF0cml4MkRfYWxpZ25lZCh2b2lkKiogcCk7CisKKy8qIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBGREtfQUxMT0NBVEVfTUVNT1JZXzNEIGluc3RlYWQgb2YgZmRrQ2FsbG9jTWF0cml4M0QKKyAqLwordm9pZCoqKiBmZGtDYWxsb2NNYXRyaXgzRChVSU5UIGRpbTEsIFVJTlQgZGltMiwgVUlOVCBkaW0zLCBVSU5UIHNpemUpOworLyogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEZES19BTExPQ0FURV9NRU1PUllfM0RfSU5UIGluc3RlYWQgb2YKKyAqIGZka0NhbGxvY01hdHJpeDNEX2ludCAqLwordm9pZCoqKiBmZGtDYWxsb2NNYXRyaXgzRF9pbnQoVUlOVCBkaW0xLCBVSU5UIGRpbTIsIFVJTlQgZGltMywgVUlOVCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVNT1JZX1NFQ1RJT04gcyk7CisvKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgRkRLX0ZSRUVfTUVNT1JZXzNEIGluc3RlYWQgb2YgZmRrRnJlZU1hdHJpeDNEICovCit2b2lkIGZka0ZyZWVNYXRyaXgzRCh2b2lkKioqIHApOworCisjZGVmaW5lIEZES19BTExPQ0FURV9NRU1PUllfMUQoYSwgZGltMSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoKGEpID0gKHR5cGUqKWZka0NhbGxvY01hdHJpeDFEKChkaW0xKSwgc2l6ZW9mKHR5cGUpKSkgPT0gTlVMTCkgeyBcCisgICAgZ290byBiYWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBGREtfQUxMT0NBVEVfTUVNT1JZXzFEX0FMSUdORUQoYSwgZGltMSwgdHlwZSkgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKChhKSA9ICh0eXBlKilmZGtDYWxsb2NNYXRyaXgxRF9hbGlnbmVkKChkaW0xKSwgc2l6ZW9mKHR5cGUpKSkgPT0gXAorICAgICAgTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdvdG8gYmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRkRLX0FMTE9DQVRFX01FTU9SWV8xRF9QKGEsIGRpbTEsIHR5cGUsIHB0eXBlKSAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCgoYSkgPSAocHR5cGUpZmRrQ2FsbG9jTWF0cml4MUQoKGRpbTEpLCBzaXplb2YodHlwZSkpKSA9PSBOVUxMKSB7IFwKKyAgICBnb3RvIGJhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEZES19BTExPQ0FURV9NRU1PUllfMURfSU5UKGEsIGRpbTEsIHR5cGUsIHMpICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKChhKSA9ICh0eXBlKilmZGtDYWxsb2NNYXRyaXgxRF9pbnQoKGRpbTEpLCBzaXplb2YodHlwZSksIChzKSkpID09IFwKKyAgICAgIE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ290byBiYWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRkRLX0ZSRUVfTUVNT1JZXzFEKGEpICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZGtGcmVlTWF0cml4MUQoKHZvaWQqKShhKSk7IFwKKyAgICAoYSkgPSBOVUxMOyAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBGREtfRlJFRV9NRU1PUllfMURfQUxJR05FRChhKSAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZGtGcmVlTWF0cml4MURfYWxpZ25lZCgodm9pZCopKGEpKTsgXAorICAgIChhKSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChhLCBkaW0xLCBkaW0yLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoKGEpID0gKHR5cGUqKilmZGtDYWxsb2NNYXRyaXgyRCgoZGltMSksIChkaW0yKSwgc2l6ZW9mKHR5cGUpKSkgPT0gXAorICAgICAgTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnb3RvIGJhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVChhLCBkaW0xLCBkaW0yLCB0eXBlLCBzKSAgICAgICAgICAgICAgIFwKKyAgaWYgKCgoYSkgPSAodHlwZSoqKWZka0NhbGxvY01hdHJpeDJEX2ludCgoZGltMSksIChkaW0yKSwgc2l6ZW9mKHR5cGUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMpKSkgPT0gTlVMTCkgeyAgICAgICAgICAgICAgXAorICAgIGdvdG8gYmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UX0FMSUdORUQoYSwgZGltMSwgZGltMiwgdHlwZSwgcykgXAorICBpZiAoKChhKSA9ICh0eXBlKiopZmRrQ2FsbG9jTWF0cml4MkRfaW50X2FsaWduZWQoICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKGRpbTEpLCAoZGltMiksIHNpemVvZih0eXBlKSwgKHMpKSkgPT0gTlVMTCkgeyAgICAgICAgICBcCisgICAgZ290byBiYWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRkRLX0ZSRUVfTUVNT1JZXzJEKGEpICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZka0ZyZWVNYXRyaXgyRCgodm9pZCoqKShhKSk7IFwKKyAgICAoYSkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRkRLX0ZSRUVfTUVNT1JZXzJEX0FMSUdORUQoYSkgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZGtGcmVlTWF0cml4MkRfYWxpZ25lZCgodm9pZCoqKShhKSk7IFwKKyAgICAoYSkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBGREtfQUxMT0NBVEVfTUVNT1JZXzNEKGEsIGRpbTEsIGRpbTIsIGRpbTMsIHR5cGUpICAgICAgICAgXAorICBpZiAoKChhKSA9ICh0eXBlKioqKWZka0NhbGxvY01hdHJpeDNEKChkaW0xKSwgKGRpbTIpLCAoZGltMyksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0eXBlKSkpID09IE5VTEwpIHsgXAorICAgIGdvdG8gYmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRkRLX0FMTE9DQVRFX01FTU9SWV8zRF9JTlQoYSwgZGltMSwgZGltMiwgZGltMywgdHlwZSwgcykgICAgICAgICAgIFwKKyAgaWYgKCgoYSkgPSAodHlwZSoqKilmZGtDYWxsb2NNYXRyaXgzRF9pbnQoKGRpbTEpLCAoZGltMiksIChkaW0zKSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHR5cGUpLCAocykpKSA9PSBOVUxMKSB7IFwKKyAgICBnb3RvIGJhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEZES19GUkVFX01FTU9SWV8zRChhKSAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZka0ZyZWVNYXRyaXgzRCgodm9pZCoqKikoYSkpOyBcCisgICAgKGEpID0gTlVMTDsgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIEZES19NQVRSSVhDQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvRkRLX3FtZl9kb21haW4uaCBiL2xpYkZESy9pbmNsdWRlL0ZES19xbWZfZG9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxMjY4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYkZESy9pbmNsdWRlL0ZES19xbWZfZG9tYWluLmgKQEAgLTAsMCArMSw0MTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOiBNb2R1bGUgdG8gZWZmaWNpZW50bHkgaGFuZGxlIFFNRiBkYXRhIGZvciBtdWx0aXBsZSBjaGFubmVscyBhbmQKKyAgICAgICAgICAgICAgICB0byBzaGFyZSB0aGUgZGF0YSBiZXR3ZWVuIGUuZy4gU0JSIGFuZCBNUFMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGREtfUU1GX0RPTUFJTl9ICisjZGVmaW5lIEZES19RTUZfRE9NQUlOX0gKKworI2luY2x1ZGUgInFtZi5oIgorCit0eXBlZGVmIGVudW0geworICBRTUZfRE9NQUlOX09LID0gMHgwLCAvKiE8IE5vIGVycm9yIG9jY3VycmVkLiAqLworICBRTUZfRE9NQUlOX09VVF9PRl9NRU1PUlkgPQorICAgICAgMHgxLCAvKiE8IFFNRi1Db25maWd1cmF0aW9uIGRlbWFuZHMgZm9yIG1vcmUgbWVtb3J5IHRoYW4gYWxsb2NhdGVkIG9uCisgICAgICAgICAgICAgIGhlYXAuICovCisgIFFNRl9ET01BSU5fSU5JVF9FUlJPUiA9CisgICAgICAweDIsIC8qITwgQW4gZXJyb3IgZHVyaW5nIGZpbHRlcmJhbmstc2V0dXAgb2NjdXJyZWQuICovCisgIFFNRl9ET01BSU5fUkVTQU1QTEVSX0lOSVRfRVJST1IgPQorICAgICAgMHgzIC8qITwgQW4gZXJyb3IgZHVyaW5nIFFNRi1yZXNhbXBsZXItc2V0dXAgb2NjdXJyZWQuICovCit9IFFNRl9ET01BSU5fRVJST1I7CisKKyNkZWZpbmUgQ01QTFhfTU9EICgyKQorCisjZGVmaW5lIFFNRl9NQVhfV0JfU0VDVElPTlMgKDUpIC8qIG1heGltdW0gbnVtYmVyIG9mIHdvcmtidWZmZXIgc2VjdGlvbnMgKi8KKyNkZWZpbmUgUU1GX1dCX1NFQ1RJT05fU0laRSAoMTAyNCAqIDIpCisKK0hfQUxMT0NfTUVNX09WRVJMQVkoUW1mV29ya0J1ZmZlckNvcmUxLCBGSVhQX0RCTCkKK0hfQUxMT0NfTUVNX09WRVJMQVkoUW1mV29ya0J1ZmZlckNvcmUyLCBGSVhQX0RCTCkKK0hfQUxMT0NfTUVNX09WRVJMQVkoUW1mV29ya0J1ZmZlckNvcmUzLCBGSVhQX0RCTCkKK0hfQUxMT0NfTUVNX09WRVJMQVkoUW1mV29ya0J1ZmZlckNvcmU0LCBGSVhQX0RCTCkKK0hfQUxMT0NfTUVNX09WRVJMQVkoUW1mV29ya0J1ZmZlckNvcmU1LCBGSVhQX0RCTCkKK0hfQUxMT0NfTUVNX09WRVJMQVkoUW1mV29ya0J1ZmZlckNvcmU2LCBGSVhQX0RCTCkKKworI2RlZmluZSBRTUZfRE9NQUlOX01BWF9BTkFMWVNJU19RTUZfQkFORFMgKDY0KQorI2RlZmluZSBRTUZfRE9NQUlOX01BWF9TWU5USEVTSVNfUU1GX0JBTkRTIChRTUZfTUFYX1NZTlRIRVNJU19CQU5EUykKKyNkZWZpbmUgUU1GX0RPTUFJTl9NQVhfUU1GX1BST0NfQkFORFMgKDY0KQorI2RlZmluZSBRTUZfRE9NQUlOX01BWF9USU1FU0xPVFMgKDY0KQorI2RlZmluZSBRTUZfRE9NQUlOX01BWF9PVl9USU1FU0xPVFMgKDEyKQorCisjZGVmaW5lIFFNRl9ET01BSU5fQU5BTFlTSVNfUU1GX0JBTkRTXzE2ICgxNikKKyNkZWZpbmUgUU1GX0RPTUFJTl9BTkFMWVNJU19RTUZfQkFORFNfMjQgKDI0KQorI2RlZmluZSBRTUZfRE9NQUlOX0FOQUxZU0lTX1FNRl9CQU5EU18zMiAoMzIpCisKKyNkZWZpbmUgUU1GX0RPTUFJTl9USU1FU0xPVFNfMTYgKDE2KQorI2RlZmluZSBRTUZfRE9NQUlOX1RJTUVTTE9UU18zMiAoMzIpCisKKyNkZWZpbmUgUU1GX0RPTUFJTl9PVl9USU1FU0xPVFNfMTYgKDMpCisjZGVmaW5lIFFNRl9ET01BSU5fT1ZfVElNRVNMT1RTXzMyICg2KQorCitIX0FMTE9DX01FTShBbmFRbWZTdGF0ZXMsIEZJWFBfUUFTKQorSF9BTExPQ19NRU0oU3luUW1mU3RhdGVzLCBGSVhQX1FTUykKK0hfQUxMT0NfTUVNKFFtZlNsb3RzUmVhbCwgRklYUF9EQkwgKikKK0hfQUxMT0NfTUVNKFFtZlNsb3RzSW1hZywgRklYUF9EQkwgKikKK0hfQUxMT0NfTUVNKFFtZk92ZXJsYXBCdWZmZXIsIEZJWFBfREJMKQorCitIX0FMTE9DX01FTShBbmFRbWZTdGF0ZXMxNiwgRklYUF9RQVMpCitIX0FMTE9DX01FTShBbmFRbWZTdGF0ZXMyNCwgRklYUF9RQVMpCitIX0FMTE9DX01FTShBbmFRbWZTdGF0ZXMzMiwgRklYUF9RQVMpCitIX0FMTE9DX01FTShRbWZTbG90c1JlYWwxNiwgRklYUF9EQkwgKikKK0hfQUxMT0NfTUVNKFFtZlNsb3RzUmVhbDMyLCBGSVhQX0RCTCAqKQorSF9BTExPQ19NRU0oUW1mU2xvdHNJbWFnMTYsIEZJWFBfREJMICopCitIX0FMTE9DX01FTShRbWZTbG90c0ltYWczMiwgRklYUF9EQkwgKikKK0hfQUxMT0NfTUVNKFFtZk92ZXJsYXBCdWZmZXIxNiwgRklYUF9EQkwpCitIX0FMTE9DX01FTShRbWZPdmVybGFwQnVmZmVyMzIsIEZJWFBfREJMKQorCisjZGVmaW5lIFFET01fUENNIElOVF9QQ00KKworLyoqCisgKiBTdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgY29uZmlndXJhdGlvbiBkYXRhIHdoaWNoIGlzIGdsb2JhbCB3aGl0aGluIGEgUU1GIGRvbWFpbgorICogaW5zdGFuY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgcW1mRG9tYWluRXhwbGljaXRDb25maWc7ICAgLyohPCBGbGFnIHRvIHNpZ25hbCB0aGF0IFFNRiBkb21haW4gaXMgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0bHkgaW5zdGVhZCBvZiBTQlIgYW5kIE1QUyBpbml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmVzLiAqLworICBVQ0hBUiBuSW5wdXRDaGFubmVsczsgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgaW5wdXQgY2hhbm5lbHMuICovCisgIFVDSEFSIG5JbnB1dENoYW5uZWxzX3JlcXVlc3RlZDsgIC8qITwgQ29ycmVzcG9uZGluZyByZXF1ZXN0ZWQgbm90IHlldCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuICovCisgIFVDSEFSIG5PdXRwdXRDaGFubmVsczsgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBvdXRwdXQgY2hhbm5lbHMuICovCisgIFVDSEFSIG5PdXRwdXRDaGFubmVsc19yZXF1ZXN0ZWQ7IC8qITwgQ29ycmVzcG9uZGluZyByZXF1ZXN0ZWQgbm90IHlldCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuICovCisgIFVDSEFSCisgIHBhcmtDaGFubmVsOyAvKiE8IHNpZ25hbCB0byBhdXRvbWF0aWNhbGx5IGFsbG9jYXRlIGFkZGl0aW9uYWwgbWVtb3J5IHRvCisgICAgICAgICAgICAgICAgICBwYXJrIGEgY2hhbm5lbCBpZiBvbmx5IG9uZSBwcm9jZXNzaW5nIGNoYW5uZWwgaXMKKyAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS4gKi8KKyAgVUNIQVIgcGFya0NoYW5uZWxfcmVxdWVzdGVkOworICBRRE9NX1BDTQorICAqVERpbnB1dDsgLyohPCBQb2ludGVyIHRvIHRpbWUgZG9tYWluIGRhdGEgdXNlZCBhcyBpbnB1dCBmb3IgdGhlIFFNRgorICAgICAgICAgICAgICAgYW5hbHlzaXMuICovCisgIEZJWFBfREJMICoKKyAgICAgIHBXb3JrQnVmZmVyW1FNRl9NQVhfV0JfU0VDVElPTlNdOyAvKiE8IFBvaW50ZXJhcnJheSB0byB2b2xhdGlsZSBtZW1vcnkuICovCisgIFVJTlQgZmxhZ3M7IC8qITwgRmxhZ3MgdG8gYmUgc2V0IG9uIGFsbCBRTUYgYW5hbHlzaXMvc3ludGhlc2lzIGZpbHRlcgorICAgICAgICAgICAgICAgICBpbnN0YW5jZXMuICovCisgIFVJTlQgZmxhZ3NfcmVxdWVzdGVkOyAvKiE8IENvcnJlc3BvbmRpbmcgcmVxdWVzdGVkIG5vdCB5ZXQgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4gKi8KKyAgVUNIQVIgbkJhbmRzQW5hbHlzaXM7IC8qITwgTnVtYmVyIG9mIFFNRiBhbmFseXNpcyBiYW5kcyBmb3IgYWxsIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscy4gKi8KKyAgVUNIQVIgbkJhbmRzQW5hbHlzaXNfcmVxdWVzdGVkOyAvKiE8IENvcnJlc3BvbmRpbmcgcmVxdWVzdGVkIG5vdCB5ZXQgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuICovCisgIFVTSE9SVCBuQmFuZHNTeW50aGVzaXM7IC8qITwgTnVtYmVyIG9mIFFNRiBzeW50aGVzaXMgYmFuZHMgZm9yIGFsbCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMuICovCisgIFVTSE9SVAorICBuQmFuZHNTeW50aGVzaXNfcmVxdWVzdGVkOyAvKiE8IENvcnJlc3BvbmRpbmcgcmVxdWVzdGVkIG5vdCB5ZXQgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLiAqLworICBVQ0hBUiBuUW1mVGltZVNsb3RzOyAvKiE8IE51bWJlciBvZiBRTUYgdGltZSBzbG90cyAoc3RvcmVkIGluIHdvcmsgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSkuICovCisgIFVDSEFSIG5RbWZUaW1lU2xvdHNfcmVxdWVzdGVkOyAvKiE8IENvcnJlc3BvbmRpbmcgcmVxdWVzdGVkIG5vdCB5ZXQgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4gKi8KKyAgVUNIQVIKKyAgblFtZk92VGltZVNsb3RzOyAvKiE8IE51bWJlciBvZiBRTUYgb3ZlcmxhcC9kZWxheSB0aW1lIHNsb3RzIChzdG9yZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50IG1lbW9yeSkuICovCisgIFVDSEFSIG5RbWZPdlRpbWVTbG90c19yZXF1ZXN0ZWQ7IC8qITwgQ29ycmVzcG9uZGluZyByZXF1ZXN0ZWQgbm90IHlldCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuICovCisgIFVDSEFSIG5RbWZQcm9jQmFuZHM7IC8qITwgTnVtYmVyIG9mIFFNRiBiYW5kcyB3aGljaCBhcmUgcHJvY2Vzc2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLiBUeXBpY2FsbHkgdGhpcyBpcyBlcXVhbCB0byBuQmFuZHNTeW50aGVzaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IG1heSBkaWZmZXIgaWYgdGhlIFFNRiBiYXNlZCByZXNhbXBsZXIgaXMgYmVpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZC4gKi8KKyAgVUNIQVIgblFtZlByb2NCYW5kc19yZXF1ZXN0ZWQ7IC8qITwgQ29ycmVzcG9uZGluZyByZXF1ZXN0ZWQgbm90IHlldCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLiAqLworICBVQ0hBUgorICBuUW1mUHJvY0NoYW5uZWxzOyAvKiE8IE51bWJlciBvZiBjb21wbGV0ZSBRTUYgY2hhbm5lbHMgd2hpY2ggbmVlZCB0bworICAgICAgICAgICAgICAgICAgICAgICBjb2V4aXN0IGluIG1lbW9yeSBhdCB0aGUgc2FtZSB0aW1lLiBGb3IgbW9zdCBjYXNlcworICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIDEgd2hpY2ggbWVhbnMgdGhlIHdvcmsgYnVmZmVyIGNhbiBiZSBzaGFyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBhdWRpbyBjaGFubmVscy4gKi8KKyAgVUNIQVIKKyAgblFtZlByb2NDaGFubmVsc19yZXF1ZXN0ZWQ7IC8qITwgQ29ycmVzcG9uZGluZyByZXF1ZXN0ZWQgbm90IHlldCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLiAqLworfSBGREtfUU1GX0RPTUFJTl9HQzsKK3R5cGVkZWYgRkRLX1FNRl9ET01BSU5fR0MgKkhBTkRMRV9GREtfUU1GX0RPTUFJTl9HQzsKKworLyoqCisgKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIG9uZSBRTUYgaW5wdXQgY2hhbm5lbC4gVGhpcyBpbmNsdWRlcyB0aGUgUU1GIGFuYWx5c2lzCisgKiBhbmQgdGhlIFFNRiBkb21haW4gZGF0YSByZXByZXNlbnRhdGlvbiBuZWVkZWQgYnkgdGhlIGNvZGVjLiBXb3JrIGJ1ZmZlciBkYXRhCisgKiBtYXkgYmUgc2hhcmVkIGJldHdlZW4gY2hhbm5lbHMgaWYgdGhlIGNvZGVjIHByb2Nlc3NlcyBhbGwgUU1GIGNoYW5uZWxzIGluIGEKKyAqIGNvbnNlY3V0aXZlIG9yZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIEhBTkRMRV9GREtfUU1GX0RPTUFJTl9HQworICBwR2xvYmFsQ29uZjsgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gZ2xvYmFsIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLiAqLworICBRTUZfRklMVEVSX0JBTksgZmI7ICAgICAgICAvKiE8IFFNRiAoYW5hbHlzaXMpIGZpbHRlciBiYW5rIHN0cnVjdHVyZS4gKi8KKyAgUU1GX1NDQUxFX0ZBQ1RPUiBzY2FsaW5nOyAgLyohPCBTdHJ1Y3R1cmUgd2l0aCBzY2FsaW5nIGluZm9ybWF0aW9uLiAqLworICBVQ0hBUiB3b3JrQnVmX25UaW1lU2xvdHM7ICAvKiE8IFdvcmsgYnVmZmVyIGRpbWVuc2lvbiBmb3IgdGhpcyBjaGFubmVsIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrQnVmX25UaW1lU2xvdHMgKiB3b3JrQnVmX25CYW5kcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNUExYX01PRCkuICovCisgIFVDSEFSIHdvcmtCdWZfbkJhbmRzOyAgICAgIC8qITwgV29yayBidWZmZXIgZGltZW5zaW9uIGZvciB0aGlzIGNoYW5uZWwgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtCdWZfblRpbWVTbG90cyAqIHdvcmtCdWZfbkJhbmRzICogQ01QTFhfTU9EKS4gKi8KKyAgVVNIT1JUIHdvcmtCdWZmZXJPZmZzZXQ7ICAgLyohPCBPZmZzZXQgd2l0aGluIHdvcmsgYnVmZmVyLiAqLworICBVU0hPUlQgd29ya0J1ZmZlclNlY3RTaXplOyAvKiE8IFNpemUgb2Ygd29yayBidWZmZXIgc2VjdGlvbi4gKi8KKyAgRklYUF9RQVMgKgorICAgICAgcEFuYVFtZlN0YXRlczsgLyohPCBQb2ludGVyIHRvIFFNRiBhbmFseXNpcyBzdGF0ZXMgKHBlcnNpc3RlbnQgbWVtb3J5KS4gKi8KKyAgRklYUF9EQkwKKyAgKnBPdmVybGFwQnVmZmVyOyAgICAgICAgLyohPCBQb2ludGVyIHRvIFFNRiBvdmVybGFwL2RlbGF5IG1lbW9yeSAocGVyc2lzdGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkpLiAqLworICBGSVhQX0RCTCAqKnBXb3JrQnVmZmVyOyAvKiE8IFBvaW50ZXIgYXJyYXkgdG8gYXZhaWxhYmxlIHdvcmsgYnVmZmVycy4gKi8KKyAgRklYUF9EQkwgKgorICAgICAgKmhRbWZTbG90c1JlYWw7IC8qITwgSGFuZGxlIGZvciBRTUYgcmVhbCBkYXRhIHRpbWUgc2xvdCBwb2ludGVyIGFycmF5LiAqLworICBGSVhQX0RCTCAqKmhRbWZTbG90c0ltYWc7IC8qITwgSGFuZGxlIGZvciBRTUYgaW1hZ2luYXJ5IGRhdGEgdGltZSBzbG90IHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS4gKi8KK30gRkRLX1FNRl9ET01BSU5fSU47Cit0eXBlZGVmIEZES19RTUZfRE9NQUlOX0lOICpIQU5ETEVfRkRLX1FNRl9ET01BSU5fSU47CisKKy8qKgorICogU3RydWN0dXJlIHJlcHJlc2VudGluZyBvbmUgUU1GIG91dHB1dCBjaGFubmVsLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFFNRl9GSUxURVJfQkFOSyBmYjsgICAgICAvKiE8IFFNRiAoc3ludGhlc2lzKSBmaWx0ZXIgYmFuayBzdHJ1Y3R1cmUuICovCisgIEZJWFBfUVNTICpwU3luUW1mU3RhdGVzOyAvKiE8IFBvaW50ZXIgdG8gUU1GIHN5bnRoZXNpcyBzdGF0ZXMgKHBlcnNpc3RlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSkuICovCit9IEZES19RTUZfRE9NQUlOX09VVDsKK3R5cGVkZWYgRkRLX1FNRl9ET01BSU5fT1VUICpIQU5ETEVfRkRLX1FNRl9ET01BSU5fT1VUOworCisvKioKKyAqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIFFNRiBkb21haW4gZm9yIG11bHRpcGxlIGNoYW5uZWxzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIEZES19RTUZfRE9NQUlOX0dDIGdsb2JhbENvbmY7IC8qITwgR2xvYmFsIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLiAqLworICBGREtfUU1GX0RPTUFJTl9JTgorICBRbWZEb21haW5JblsoKDgpICsgKDEpKV07IC8qITwgQXJyYXkgb2YgUU1GIGRvbWFpbiBpbnB1dCBzdHJ1Y3R1cmVzICovCisgIEZES19RTUZfRE9NQUlOX09VVAorICBRbWZEb21haW5PdXRbKCg4KSArICgxKSldOyAvKiE8IEFycmF5IG9mIFFNRiBkb21haW4gb3V0cHV0IHN0cnVjdHVyZXMgKi8KK30gRkRLX1FNRl9ET01BSU47Cit0eXBlZGVmIEZES19RTUZfRE9NQUlOICpIQU5ETEVfRkRLX1FNRl9ET01BSU47CisKKy8qKgorICogXGJyaWVmIENoZWNrIHdoZXRoZXIgYW5hbHlzaXMtIGFuZCBzeW50aGVzaXMtZmlsdGVyYmFuay1zdGF0ZXMgaGF2ZSBiZWVuCisgKiBpbml0aWFsaXplZC4KKyAqCisgKiBccGFyYW0gcWQgUG9pbnRlciB0byBRTUYgZG9tYWluIHN0cnVjdHVyZS4KKyAqCisgKiBccmV0dXJuICAxIGlmIGluaXRpYWxpemVkLCAwIGVsc2UKKyAqLworaW50IEZES19RbWZEb21haW5fSXNJbml0aWFsaXplZChjb25zdCBIQU5ETEVfRkRLX1FNRl9ET01BSU4gcWQpOworCisvKioKKyAqIFxicmllZiBJbml0aWFsaXplIFFNRiBhbmFseXNpcyBhbmQgc3ludGhlc2lzIGZpbHRlciBiYW5rcyBhbmQgc2V0IHVwIFFNRiBkYXRhCisgKiByZXByZXNlbnRhdGlvbi4KKyAqCisgKiBccGFyYW0gcWQgUG9pbnRlciB0byBRTUYgZG9tYWluIHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBleHRyYV9mbGFncyBJbml0aWFsaXplIGZpbHRlciBiYW5rcyB3aXRoIGV4dHJhIGZsYWdzIHdoaWNoIHdlcmUgbm90CisgKiBzZXQgaW4gdGhlIGdsb2JhbCBjb25maWcgZmxhZ3MgZmllbGQuCisgKgorICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgorICovCitpbnQgRkRLX1FtZkRvbWFpbl9Jbml0RmlsdGVyQmFuayhIQU5ETEVfRkRLX1FNRl9ET01BSU4gcWQsIFVJTlQgZXh0cmFfZmxhZ3MpOworCisvKioKKyAqIFxicmllZiBXaGVuIFFNRiBwcm9jZXNzaW5nIG9mIG9uZSBjaGFubmVsIGlzIGZpbmlzaGVkIGNvcHkgdGhlIG92ZXJsYXAvZGVsYXkKKyAqIHBhcnQgaW50byB0aGUgcGVyc2lzdGVudCBtZW1vcnkgdG8gYmUgdXNlZCBpbiB0aGUgbmV4dCBmcmFtZS4KKyAqCisgKiBccGFyYW0gcWRfY2ggUG9pbnRlciB0byBhIFFNRiBkb21haW4gaW5wdXQgY2hhbm5lbC4KKyAqIFxwYXJhbSBvZmZzZXQKKyAqCisgKiBccmV0dXJuICB2b2lkCisgKi8KK3ZvaWQgRkRLX1FtZkRvbWFpbl9TYXZlT3ZlcmxhcChIQU5ETEVfRkRLX1FNRl9ET01BSU5fSU4gcWRfY2gsIGludCBvZmZzZXQpOworCisvKioKKyAqIFxicmllZiBHZXQgb25lIHNsb3Qgb2YgUU1GIGRhdGEgYW5kIGFkYXB0IHRoZSBzY2FsaW5nLgorICoKKyAqIFxwYXJhbSBxZF9jaCBQb2ludGVyIHRvIGEgUU1GIGRvbWFpbiBpbnB1dCBjaGFubmVsLgorICogXHBhcmFtIHRzIFRpbWUgc2xvdCBudW1iZXIgdG8gYmUgb2J0YWluZWQuCisgKiBccGFyYW0gc3RhcnRfYmFuZCBTdGFydCBpbmRleCBvZiBRTUYgYmFuZHMgdG8gYmUgb2J0YWluZWQuCisgKiBccGFyYW0gc3RvcF9iYW5kIFN0b3AgaW5kZXggb2YgUU1GIGJhbmQgdG8gYmUgb2J0YWluZWQuCisgKiBccGFyYW0gcFFtZk91dFJlYWwgT3V0cHV0IGJ1ZmZlciAocmVhbCBRTUYgZGF0YSkuCisgKiBccGFyYW0gcFFtZk91dEltYWcgIE91dHB1dCBidWZmZXIgKGltYWcgUU1GIGRhdGEpLgorICogXHBhcmFtIGV4cF9vdXQgVGFyZ2V0IGV4cG9uZW50IChzY2FsaW5nKSBvZiBkYXRhLgorICoKKyAqIFxyZXR1cm4gIHZvaWQKKyAqLwordm9pZCBGREtfUW1mRG9tYWluX0dldFNsb3QoY29uc3QgSEFORExFX0ZES19RTUZfRE9NQUlOX0lOIHFkX2NoLCBjb25zdCBpbnQgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3RhcnRfYmFuZCwgY29uc3QgaW50IHN0b3BfYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwUW1mT3V0UmVhbCwgRklYUF9EQkwgKnBRbWZPdXRJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGV4cF9vdXQpOworCisvKioKKyAqIFxicmllZiBEaXJlY3QgYWNjZXNzIHRvIHRoZSB3b3JrIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggYSBjZXJ0YWluIGNoYW5uZWwgKG5vCisgKiB0aW1lIHNsb3QgcG9pbnRlciBhcnJheSBpcyB1c2VkKS4KKyAqCisgKiBccGFyYW0gcWRfY2ggUG9pbnRlciB0byBhIFFNRiBkb21haW4gaW5wdXQgY2hhbm5lbC4KKyAqIFxwYXJhbSB0cyBUaW1lIHNsb3QgbnVtYmVyIHRvIGJlIG9idGFpbmVkLgorICogXHBhcmFtIHBwUW1mUmVhbCBSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgcGFydCBvZiB0aGUgd29yayBidWZmZXIKKyAqIChyZWFsIHRpbWUgc2xvdCkuCisgKiBccGFyYW0gcHBRbWZJbWFnIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBwYXJ0IG9mIHRoZSB3b3JrIGJ1ZmZlcgorICogKGltYWcgdGltZSBzbG90KS4KKyAqCisgKiBccmV0dXJuICB2b2lkCisgKi8KK3ZvaWQgRkRLX1FtZkRvbWFpbl9HZXRXb3JrQnVmZmVyKGNvbnN0IEhBTkRMRV9GREtfUU1GX0RPTUFJTl9JTiBxZF9jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0cywgRklYUF9EQkwgKipwcFFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnBwUW1mSW1hZyk7CisKKy8qKgorICogXGJyaWVmIEZvciB0aGUgY2FzZSB0aGF0IHRoZSB3b3JrIGJ1ZmZlciBhc3NvY2lhdGVkIHRvIHRoaXMgY2hhbm5lbCBpcyBub3QKKyAqIGlkZW50aWNhbCB0byB0aGUgcHJvY2Vzc2luZyBjaGFubmVsIHdvcmsgYnVmZmVyIGNvcHkgdGhlIGRhdGEgaW50byB0aGUKKyAqIHByb2Nlc3NpbmcgY2hhbm5lbC4KKyAqCisgKiBccGFyYW0gcWRfY2ggUG9pbnRlciB0byBhIFFNRiBkb21haW4gaW5wdXQgY2hhbm5lbC4KKyAqIFxyZXR1cm4gIHZvaWQKKyAqLwordm9pZCBGREtfUW1mRG9tYWluX1dvcmtCdWZmZXIyUHJvY0NoYW5uZWwoY29uc3QgSEFORExFX0ZES19RTUZfRE9NQUlOX0lOIHFkX2NoKTsKKworLyoqCisgKiBcYnJpZWYgRm9yIHRoZSBjYXNlIG9mIHN0ZXJlb0NmZ0luZGV4MyB3aXRoIEhCRSB0aGUgSEJFIGJ1ZmZlciBpcyBjb3BpZWQgaW50bworICogdGhlIHByb2Nlc3NpbmcgY2hhbm5lbCB3b3JrIGJ1ZmZlciBhbmQgdGhlIHByb2Nlc3NpbmcgY2hhbm5lbCB3b3JrIGJ1ZmZlciBpcworICogY29waWVkIGludG8gdGhlIEhCRSBidWZmZXIuCisgKgorICogXHBhcmFtIHFkX2NoIFBvaW50ZXIgdG8gYSBRTUYgZG9tYWluIGlucHV0IGNoYW5uZWwuCisgKiBccGFyYW0gcHBRbWZSZWFsIFBvaW50ZXIgdG8gYSBIQkUgUU1GIGRhdGEgYnVmZmVyIChyZWFsKS4KKyAqIFxwYXJhbSBwcFFtZkltYWcgUG9pbnRlciB0byBhIEhCRSBRTUYgZGF0YSBidWZmZXIgKGltYWcpLgorICoKKyAqIFxyZXR1cm4gIHZvaWQKKyAqLwordm9pZCBGREtfUW1mRG9tYWluX1FtZkRhdGEySEJFKEhBTkRMRV9GREtfUU1GX0RPTUFJTl9JTiBxZF9jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnBwUW1mUmVhbCwgRklYUF9EQkwgKipwcFFtZkltYWcpOworCisvKioKKyAqIFxicmllZiBTZXQgYWxsIGZpZWxkcyBmb3IgcmVxdWVzdGVkIHBhcmFtZXRlcnZhbHVlcyBpbiBnbG9iYWwgY29uZmlnIHN0cnVjdAorICogRkRLX1FNRl9ET01BSU5fR0MgdG8gMC4KKyAqCisgKiBccGFyYW0gaGdjICBQb2ludGVyIHRvIGEgUU1GIGRvbWFpbiBnbG9iYWwgY29uZmlnIHN0cnVjdC4KKyAqLwordm9pZCBGREtfUW1mRG9tYWluX0NsZWFyUmVxdWVzdGVkKEhBTkRMRV9GREtfUU1GX0RPTUFJTl9HQyBoZ2MpOworCisvKioKKyAqIFxicmllZiBDaGVjayBmb3IgcGFyYW1ldGVyLWNoYW5nZSByZXF1ZXN0cyBpbiBnbG9iYWwgY29uZmlnIGFuZAorICogKHJlLSljb25maWd1cmUgUU1GIGRvbWFpbiBhY2NvcmRpbmdseS4KKyAqCisgKiBccGFyYW0gIGhxZCAgUG9pbnRlciB0byBRTUYgZG9tYWluCisgKgorICogXHJldHVybiAgZXJyb3Jjb2RlCisgKi8KK1FNRl9ET01BSU5fRVJST1IgRkRLX1FtZkRvbWFpbl9Db25maWd1cmUoSEFORExFX0ZES19RTUZfRE9NQUlOIGhxZCk7CisKKy8qKgorICogXGJyaWVmIEZyZWUgUU1GIHdvcmtidWZmZXIsIFFNRiBwZXJzaXN0ZW50IG1lbW9yeSBhbmQgY29uZmlndXJhdGlvbgorICogdmFyaWFibGVzLgorICoKKyAqIFxwYXJhbSAgaHFkICBQb2ludGVyIHRvIFFNRiBkb21haW4KKyAqLwordm9pZCBGREtfUW1mRG9tYWluX0ZyZWVNZW0oSEFORExFX0ZES19RTUZfRE9NQUlOIGhxZCk7CisKKy8qKgorICogXGJyaWVmIENsZWFyIFFNRiBvdmVybGFwIGJ1ZmZlcnMgYW5kIFFNRiBmaWx0ZXIgYmFuayBzdGF0ZXMuCisgKgorICogXHBhcmFtICBocWQgIFBvaW50ZXIgdG8gUU1GIGRvbWFpbgorICovCitRTUZfRE9NQUlOX0VSUk9SIEZES19RbWZEb21haW5fQ2xlYXJQZXJzaXN0ZW50TWVtb3J5KEhBTkRMRV9GREtfUU1GX0RPTUFJTiBocWQpOworCisvKioKKyAqIFxicmllZiBGcmVlIFFNRiB3b3JrYnVmZmVyIGFuZCBRTUYgcGVyc2lzdGVudCBtZW1vcnkuCisgKgorICogXHBhcmFtICBocWQgIFBvaW50ZXIgdG8gUU1GIGRvbWFpbgorICoKKyAqIFxwYXJhbSAgZG14X2xwX21vZGUgIGRvd25taXggbG93IHBvd2VyIG1vZGUgZmxhZworICovCit2b2lkIEZES19RbWZEb21haW5fQ2xvc2UoSEFORExFX0ZES19RTUZfRE9NQUlOIGhxZCk7CisKKyNlbmRpZiAvKiBGREtfUU1GX0RPTUFJTl9IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9GREtfdG9vbHNfcm9tLmggYi9saWJGREsvaW5jbHVkZS9GREtfdG9vbHNfcm9tLmgKaW5kZXggOTM2MWM4MS4uZDFjYjk4MCAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvRkRLX3Rvb2xzX3JvbS5oCisrKyBiL2xpYkZESy9pbmNsdWRlL0ZES190b29sc19yb20uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3MiArOTAsMTE0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE9saXZlciBNb3NlcgorCiAgICBEZXNjcmlwdGlvbjogUk9NIHRhYmxlcyB1c2VkIGJ5IEZESyB0b29scwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fRkRLX1RPT0xTX1JPTV9IX18KLSNkZWZpbmUgX19GREtfVE9PTFNfUk9NX0hfXworI2lmbmRlZiBGREtfVE9PTFNfUk9NX0gKKyNkZWZpbmUgRkRLX1RPT0xTX1JPTV9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCiAKKy8qIHNpbmV0YWJsZXMgKi8KIAogLyogTm9uZSByYWRpeDIgcm90YXRpb24gdmVjdG9ycyAqLwotZXh0ZXJuIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw2MFs2MF07Ci1leHRlcm4gY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzYwWzYwXTsKLWV4dGVybiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMjQwWzI0MF07Ci1leHRlcm4gY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzI0MFsyNDBdOwotZXh0ZXJuIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw0ODBbNDgwXTsKLWV4dGVybiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnNDgwWzQ4MF07Ci0KK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDYwWzYwXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzYwWzYwXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDE5MlsxOTJdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMTkyWzE5Ml07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWwyNDBbMjEwXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzI0MFsyMTBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsNDgwWzQ4MF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWc0ODBbNDgwXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDZbNl07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWc2WzZdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMTJbMTJdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMTJbMTJdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMjRbMjRdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMjRbMjRdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsNDhbNDhdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnNDhbNDhdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsODBbODBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnODBbODBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsOTZbOTZdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnOTZbOTZdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMzg0WzM4NF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWczODRbMzg0XTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDIwWzIwXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzIwWzIwXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDEyMFsxMjBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMTIwWzEyMF07CiAKIC8qIFJlZ3VsYXIgc2luZSB0YWJsZXMgKi8KLWV4dGVybiBjb25zdCBGSVhQX1NUUCBTaW5lVGFibGU1MTJbXTsKLWV4dGVybiBjb25zdCBGSVhQX1NUUCBTaW5lVGFibGU0ODBbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVFAgU2luZVRhYmxlMTAyNFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUUCBTaW5lVGFibGU1MTJbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVFAgU2luZVRhYmxlNDgwW107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTM4NFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUUCBTaW5lVGFibGU4MFtdOworI2lmZGVmIElOQ0xVREVfU2luZVRhYmxlMTAKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVFAgU2luZVRhYmxlMTBbXTsKKyNlbmRpZgogCiAvKiBBQUMtTEMgd2luZG93cyAqLwotZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMDI0W107Ci1leHRlcm4gY29uc3QgRklYUF9XVFAgS0JEV2luZG93MTAyNFtdOwotZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMjhbXTsKLWV4dGVybiBjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMjhbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzEwMjRbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgS0JEV2luZG93MTAyNFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTI4W107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzEyOFtdOwogCi1leHRlcm4gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzk2MFtdOwotZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzk2MFtdOwotZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMjBbXTsKLWV4dGVybiBjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMjBbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzk2MFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3c5NjBbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzEyMFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMjBbXTsKIAogLyogQUFDLUxEIHdpbmRvd3MgKi8KLWV4dGVybiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NTEyW107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c1MTJbXTsKICNkZWZpbmUgTG93T3ZlcmxhcFdpbmRvdzUxMiBTaW5lV2luZG93MTI4Ci1leHRlcm4gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzQ4MFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NDgwW107CiAjZGVmaW5lIExvd092ZXJsYXBXaW5kb3c0ODAgU2luZVdpbmRvdzEyMAogCisvKiBVU0FDIFRDWCBXaW5kb3cgKi8KK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzI1NlsyNTZdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTkyW107CiAKKy8qIFVTQUMgOC8zIHdpbmRvd3MgKi8KK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzc2OFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3c3NjhbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzk2W107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzk2W107CiAKLWV4dGVybiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NjRbXTsKLWV4dGVybiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MzJbXTsKKy8qIERDVCBhbmQgb3RoZXJzICovCitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c2NFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NDhbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzMyW107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cyNFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTZbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzhbXTsKIAogLyoqCi0gKiBcYnJpZWYgSGVscGVyIHRhYmxlIGZvciB3aW5kb3cgc2xvcGUgbWFwcGluZy4gWW91IHNob3VsZCBwcmVmZXIgdGhlIHVzYWdlIG9mIHRoZQotICogZnVuY3Rpb24gRkRLZ2V0V2luZG93U2xvcGUoKSwgdGhpcyB0YWJsZSBpcyBvbmx5IG1hZGUgcHVibGljIGZvciBzb21lIG9wdGltaXplZAotICogYWNjZXNzIGluc2lkZSBkY3QuY3BwLgorICogXGJyaWVmIEhlbHBlciB0YWJsZSBmb3Igd2luZG93IHNsb3BlIG1hcHBpbmcuIFlvdSBzaG91bGQgcHJlZmVyIHRoZSB1c2FnZSBvZgorICogdGhlIGZ1bmN0aW9uIEZES2dldFdpbmRvd1Nsb3BlKCksIHRoaXMgdGFibGUgaXMgb25seSBtYWRlIHB1YmxpYyBmb3Igc29tZQorICogb3B0aW1pemVkIGFjY2VzcyBpbnNpZGUgZGN0LmNwcC4KICAqLwotZXh0ZXJuIGNvbnN0IEZJWFBfV1RQICpjb25zdCB3aW5kb3dTbG9wZXNbMl1bM11bOV07CitleHRlcm4gY29uc3QgRklYUF9XVFAgKmNvbnN0IHdpbmRvd1Nsb3Blc1syXVs0XVs5XTsKIAogLyoqCiAgKiBcYnJpZWYgV2luZG93IHNsb3BlIGFjY2VzcyBoZWxwZXIuIE9idGFpbiBhIHdpbmRvdyBvZiBnaXZlbiBsZW5ndGggYW5kIHNoYXBlLgogICogXHBhcmFtIGxlbmd0aCBMZW5ndGggb2YgdGhlIHdpbmRvdyBzbG9wZS4KLSAqIFxwYXJhbSBzaGFwZSBTaGFwZSBpbmRleCBvZiB0aGUgd2luZG93IHNsb3BlLiAwOiBzaW5lIHdpbmRvdywgMTogS2Fpc2VyLUJlc3NlbC4gQW55IG90aGVyCi0gKiAgICAgICAgICAgICAgdmFsdWUgaXMgYXBwbGllZCBhIG1hc2sgb2YgMSB0bywgbWFwcGluZyBpdCB0byBlaXRoZXIgMCBvciAxLgotICogXHBhcmFtIFBvaW50ZXIgdG8gd2luZG93IHNsb3BlIG9yIE5VTEwgaWYgdGhlIHJlcXVlc3RlZCB3aW5kb3cgc2xvcGUgaXMgbm90IGF2YWlsYWJsZS4KKyAqIFxwYXJhbSBzaGFwZSBTaGFwZSBpbmRleCBvZiB0aGUgd2luZG93IHNsb3BlLiAwOiBzaW5lIHdpbmRvdywgMToKKyAqIEthaXNlci1CZXNzZWwuIEFueSBvdGhlciB2YWx1ZSBpcyBhcHBsaWVkIGEgbWFzayBvZiAxIHRvLCBtYXBwaW5nIGl0IHRvCisgKiBlaXRoZXIgMCBvciAxLgorICogXHBhcmFtIFBvaW50ZXIgdG8gd2luZG93IHNsb3BlIG9yIE5VTEwgaWYgdGhlIHJlcXVlc3RlZCB3aW5kb3cgc2xvcGUgaXMgbm90CisgKiBhdmFpbGFibGUuCiAgKi8KLWNvbnN0IEZJWFBfV1RQICogRkRLZ2V0V2luZG93U2xvcGUoaW50IGxlbmd0aCwgaW50IHNoYXBlKTsKK2NvbnN0IEZJWFBfV1RQICpGREtnZXRXaW5kb3dTbG9wZShpbnQgbGVuZ3RoLCBpbnQgc2hhcGUpOwogCiBleHRlcm4gY29uc3QgRklYUF9XVFAgc2luX3R3aWRkbGVfTDY0W107CiAKQEAgLTE1Myw2MiArMjA2LDEwMyBAQAogICovCiAKICNpZiBkZWZpbmVkKEFSQ0hfUFJFRkVSX01VTFRfMTZ4MTYpIHx8IGRlZmluZWQoQVJDSF9QUkVGRVJfTVVMVF8zMngxNikKLSAgI2RlZmluZSBRTUZfQ09FRkZfMTZCSVQKKyNkZWZpbmUgUU1GX0NPRUZGXzE2QklUCiAjZW5kaWYKIAotI2RlZmluZSBRTUZfRklMVEVSX1BST1RPVFlQRV9TSVpFICAgIDY0MAotI2RlZmluZSBRTUZfTk9fUE9MWSAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUU1GX0ZJTFRFUl9QUk9UT1RZUEVfU0laRSA2NDAKKyNkZWZpbmUgUU1GX05PX1BPTFkgNQogCiAjaWZkZWYgUU1GX0NPRUZGXzE2QklUCi0gICNkZWZpbmUgRklYUF9QRlQgRklYUF9TR0wKLSAgI2RlZmluZSBGSVhQX1FUVyBGSVhQX1NHTAorI2RlZmluZSBGSVhQX1BGVCBGSVhQX1NHTAorI2RlZmluZSBGSVhQX1FUVyBGSVhQX1NHTAorI2RlZmluZSBGWF9EQkwyRlhfUVRXKHgpIEZYX0RCTDJGWF9TR0woeCkKICNlbHNlCi0gICNkZWZpbmUgRklYUF9QRlQgRklYUF9EQkwKLSAgI2RlZmluZSBGSVhQX1FUVyBGSVhQX0RCTAorI2RlZmluZSBGSVhQX1BGVCBGSVhQX0RCTAorI2RlZmluZSBGSVhQX1FUVyBGSVhQX0RCTAorCisjZGVmaW5lIEZYX0RCTDJGWF9RVFcoeCkgKHgpCisKICNlbmRpZgogCi0jZGVmaW5lIFFNRjY0MF9QRlRfVEFCTEVfU0laRSAgICAgICAoNjQwLzIgKyBRTUZfTk9fUE9MWSkKKyNkZWZpbmUgUU1GNjQwX1BGVF9UQUJMRV9TSVpFICg2NDAgLyAyICsgUU1GX05PX1BPTFkpCiAKLWV4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3MzMlszMl07Ci1leHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luMzJbMzJdOworLyogUmVzYW1wbGluZyB0d2lkZGxlcyBmb3IgUU1GICovCisKKy8qIE5vdCByZXNhbXBsaW5nIHR3aWRkbGVzICovCitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyWzMyXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luMzJbMzJdOwogLyogQWRhcHRlZCBhbmFseXNpcyBwb3N0LXR3aWRkbGVzIGZvciBkb3duLXNhbXBsZWQgSFEgU0JSICovCi1leHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zX2Rvd25zYW1wMzJbMzJdOwotZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3Npbl9kb3duc2FtcDMyWzMyXTsKLWV4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3M2NFs2NF07Ci1leHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luNjRbNjRdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3NfZG93bnNhbXAzMlszMl07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3Npbl9kb3duc2FtcDMyWzMyXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zNjRbNjRdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW42NFs2NF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUEZUCisgICAgcW1mX3BmaWx0NjQwW1FNRjY0MF9QRlRfVEFCTEVfU0laRSArIFFNRl9OT19QT0xZXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9QRlQgcW1mX3BmaWx0NjQwX3ZlY3Rvcls2NDBdOwogCi1leHRlcm4gY29uc3QgRklYUF9QRlQgcW1mXzY0W1FNRjY0MF9QRlRfVEFCTEVfU0laRStRTUZfTk9fUE9MWV07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczQwWzQwXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luNDBbNDBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1BGVCBxbWZfcGZpbHQ0MDBbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9QRlQgcW1mX3BmaWx0MjAwW107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUEZUIHFtZl9wZmlsdDEyMFtdOwogCitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczI0WzI0XTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luMjRbMjRdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1BGVCBxbWZfcGZpbHQyNDBbXTsKIAotCi0KK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMTZbMTZdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW4xNlsxNl07CiAKICNkZWZpbmUgUU1GNjQwX0NMREZCX1BGVF9UQUJMRV9TSVpFICg2NDApCiAjZGVmaW5lIFFNRjMyMF9DTERGQl9QRlRfVEFCTEVfU0laRSAoMzIwKQogI2RlZmluZSBRTUZfQ0xERkJfUEZUX1NDQUxFIDEKIAotZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyX2NsZGZiWzMyXTsKK2V4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3MzMl9jbGRmYl9hbmFbMzJdOworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyX2NsZGZiX3N5blszMl07CiBleHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luMzJfY2xkZmJbMzJdOworCitleHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMTZfY2xkZmJfYW5hWzE2XTsKK2V4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3MxNl9jbGRmYl9zeW5bMTZdOworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjE2X2NsZGZiWzE2XTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczhfY2xkZmJfYW5hWzhdOworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczhfY2xkZmJfc3luWzhdOworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjhfY2xkZmJbOF07CisKIGV4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3M2NF9jbGRmYls2NF07CiBleHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luNjRfY2xkZmJbNjRdOwogCi1leHRlcm4gY29uc3QgRklYUF9QRlQgcW1mX2NsZGZiXzY0MFtRTUY2NDBfQ0xERkJfUEZUX1RBQkxFX1NJWkVdOwotZXh0ZXJuIGNvbnN0IEZJWFBfUEZUIHFtZl9jbGRmYl8zMjBbUU1GMzIwX0NMREZCX1BGVF9UQUJMRV9TSVpFXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9QRlQgcW1mX2NsZGZiXzY0MFtRTUY2NDBfQ0xERkJfUEZUX1RBQkxFX1NJWkVdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1BGVCBxbWZfY2xkZmJfMzIwW1FNRjMyMF9DTERGQl9QRlRfVEFCTEVfU0laRV07CisjZGVmaW5lIFFNRjE2MF9DTERGQl9QRlRfVEFCTEVfU0laRSAoMTYwKQorZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1BGVCBxbWZfY2xkZmJfMTYwW1FNRjE2MF9DTERGQl9QRlRfVEFCTEVfU0laRV07CisjZGVmaW5lIFFNRjgwX0NMREZCX1BGVF9UQUJMRV9TSVpFICg4MCkKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9QRlQgcW1mX2NsZGZiXzgwW1FNRjgwX0NMREZCX1BGVF9UQUJMRV9TSVpFXTsKIAorI2RlZmluZSBRTUYzMjBfTVBTTERGQl9QRlRfVEFCTEVfU0laRSAoMzIwKQorI2RlZmluZSBRTUY2NDBfTVBTTERGQl9QRlRfVEFCTEVfU0laRSAoNjQwKQorI2RlZmluZSBRTUZfTVBTTERGQl9QRlRfU0NBTEUgMQogCitleHRlcm4gY29uc3QgRklYUF9QRlQgcW1mX21wc2xkZmJfMzIwW1FNRjMyMF9NUFNMREZCX1BGVF9UQUJMRV9TSVpFXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9QRlQgcW1mX21wc2xkZmJfNjQwW1FNRjY0MF9NUFNMREZCX1BGVF9UQUJMRV9TSVpFXTsKIAotCisvKioKKyAqIEF1ZGlvIGJpdHN0cmVhbSBlbGVtZW50IHNwZWNpZmljIHN5bnRheCBmbGFnczoKKyAqLworI2RlZmluZSBBQ19FTF9HQV9DQ0UgMHgwMDAwMDAwMSAvKiE8IEdBIEFBQyBjb3VwbGluZyBjaGFubmVsIGVsZW1lbnQgKENDRSkgKi8KIAogLyoKLSAqIFJhdyBEYXRhIEJsb2NrIGxpc3Qgc3R1ZmYuCisgKiBSYXcgRGF0YSBCbG9jayBsaXN0IGl0ZW1zLgogICovCiB0eXBlZGVmIGVudW0gewogICBlbGVtZW50X2luc3RhbmNlX3RhZywKLSAgY29tbW9uX3dpbmRvdywKKyAgY29tbW9uX3dpbmRvdywgLyogLT4gZGVjaXNpb24gZm9yIGxpbmtfc2VxdWVuY2UgKi8KICAgZ2xvYmFsX2dhaW4sCi0gIGljc19pbmZvLCAvKiBpY3NfcmVzZXJ2ZWRfYml0LCB3aW5kb3dfc2VxdWVuY2UsIHdpbmRvd19zaGFwZSwgbWF4X3NmYiwgc2NhbGVfZmFjdG9yX2dyb3VwaW5nLCBwcmVkaWN0b3JfZGF0YV9wcmVzZW50LCBsdHBfZGF0YV9wcmVzZW50LCBsdHBfZGF0YSAqLworICBpY3NfaW5mbywgLyogaWNzX3Jlc2VydmVkX2JpdCwgd2luZG93X3NlcXVlbmNlLCB3aW5kb3dfc2hhcGUsIG1heF9zZmIsCisgICAgICAgICAgICAgICBzY2FsZV9mYWN0b3JfZ3JvdXBpbmcsIHByZWRpY3Rvcl9kYXRhX3ByZXNlbnQsIGx0cF9kYXRhX3ByZXNlbnQsCisgICAgICAgICAgICAgICBsdHBfZGF0YSAqLwogICBtYXhfc2ZiLAotICBtcywgLyogbXNfbWFza19wcmVzZW50LCBtc191c2VkICovCisgIG1zLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtc19tYXNrX3ByZXNlbnQsIG1zX3VzZWQgKi8KICAgLypwcmVkaWN0b3JfZGF0YV9wcmVzZW50LCovIC8qIHBhcnQgb2YgaWNzX2luZm8gKi8KICAgbHRwX2RhdGFfcHJlc2VudCwKICAgbHRwX2RhdGEsCkBAIC0yMjQsNyArMzE4LDcgQEAKICAgc3BlY3RyYWxfZGF0YSwKIAogICBzY2FsZV9mYWN0b3JfZGF0YV91c2FjLAotICBjb3JlX21vZGUsCisgIGNvcmVfbW9kZSwgLyogLT4gZGVjaXNpb24gZm9yIGxpbmtfc2VxdWVuY2UgKi8KICAgY29tbW9uX3R3LAogICBscGRfY2hhbm5lbF9zdHJlYW0sCiAgIHR3X2RhdGEsCkBAIC0yMzUsNiArMzI5LDggQEAKICAgdG5zX2RhdGFfcHJlc2VudF91c2FjLAogICBjb21tb25fbWF4X3NmYiwKIAorICBjb3VwbGVkX2VsZW1lbnRzLCAgIC8qIG9ubHkgZm9yIENDRSBwYXJzaW5nICovCisgIGdhaW5fZWxlbWVudF9saXN0cywgLyogb25seSBmb3IgQ0NFIHBhcnNpbmcgKi8KIAogICAvKiBOb24gZGF0YSBsaXN0IGl0ZW1zICovCiAgIGFkdHNjcmNfc3RhcnRfcmVnMSwKQEAgLTI2MSwxMCArMzU3LDQyIEBACiAgKiBccGFyYW0gZXBDb25maWcgdGhlIGVwQ29uZmlnIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgQXVkaW8gU3BlY2lmaWMgQ29uZmlnCiAgKiBccGFyYW0gbkNoYW5uZWxzIGFtb3VudCBvZiBjaGFubmVscyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgZWxlbWVudC4KICAqIFxwYXJhbSBsYXllciB0aGUgbGF5ZXIgb2YgdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAqIFxwYXJhbSBlbEZsYWdzIGVsZW1lbnQgc3BlY2lmaWMgZmxhZ3MuCiAgKiBccmV0dXJuIGVsZW1lbnRfbGlzdF90IHBhcnNlciBndWlkYW5jZSBzdHJ1Y3R1cmUuCiAgKi8KLWNvbnN0IGVsZW1lbnRfbGlzdF90ICogZ2V0Qml0c3RyZWFtRWxlbWVudExpc3QoQVVESU9fT0JKRUNUX1RZUEUgYW90LCBTQ0hBUiBlcENvbmZpZywgVUNIQVIgbkNoYW5uZWxzLCBVQ0hBUiBsYXllcik7Citjb25zdCBlbGVtZW50X2xpc3RfdCAqZ2V0Qml0c3RyZWFtRWxlbWVudExpc3QoQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGVwQ29uZmlnLCBVQ0hBUiBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbGF5ZXIsIFVJTlQgZWxGbGFncyk7CiAKK3R5cGVkZWYgZW51bSB7CisgIC8qIG4uYS4gKi8KKyAgRkRLX0ZPUk1BVF8xXzAgPSAxLCAgICAgLyogbW9ubyAqLworICBGREtfRk9STUFUXzJfMCA9IDIsICAgICAvKiBzdGVyZW8gKi8KKyAgRkRLX0ZPUk1BVF8zXzBfRkMgPSAzLCAgLyogMy8wLjAgKi8KKyAgRkRLX0ZPUk1BVF8zXzFfMCA9IDQsICAgLyogMy8xLjAgKi8KKyAgRkRLX0ZPUk1BVF81XzAgPSA1LCAgICAgLyogMy8yLjAgKi8KKyAgRkRLX0ZPUk1BVF81XzEgPSA2LCAgICAgLyogNS4xICovCisgIEZES19GT1JNQVRfN18xX0FMVCA9IDcsIC8qIDUvMi4xIEFMVCAqLworICAvKiA4IG4uYS4qLworICBGREtfRk9STUFUXzNfMF9SQyA9IDksIC8qIDIvMS4wICovCisgIEZES19GT1JNQVRfMl8yXzAgPSAxMCwgLyogMi8yLjAgKi8KKyAgRkRLX0ZPUk1BVF82XzEgPSAxMSwgICAvKiAzLzMuMSAqLworICBGREtfRk9STUFUXzdfMSA9IDEyLCAgIC8qIDMvNC4xICovCisgIEZES19GT1JNQVRfMjJfMiA9IDEzLCAgLyogMjIuMiAqLworICBGREtfRk9STUFUXzVfMl8xID0gMTQsIC8qIDUvMi4xKi8KKyAgRkRLX0ZPUk1BVF81XzVfMiA9IDE1LCAvKiA1LzUuMiAqLworICBGREtfRk9STUFUXzlfMSA9IDE2LCAgIC8qIDUvNC4xICovCisgIEZES19GT1JNQVRfNl81XzEgPSAxNywgLyogNi81LjEgKi8KKyAgRkRLX0ZPUk1BVF82XzdfMSA9IDE4LCAvKiA2LzcuMSAqLworICBGREtfRk9STUFUXzVfNl8xID0gMTksIC8qIDUvNi4xICovCisgIEZES19GT1JNQVRfN182XzEgPSAyMCwgLyogNy82LjEgKi8KKyAgRkRLX0ZPUk1BVF9JTl9MSVNUT0ZDSEFOTkVMUyA9IDIxLAorICBGREtfRk9STUFUX09VVF9MSVNUT0ZDSEFOTkVMUyA9IDIyLAorICAvKiAyMCBmb3JtYXRzICsgSW4gJiBPdXQgbGlzdCBvZiBjaGFubmVscyAqLworICBGREtfTkZPUk1BVFMgPSAyMywKKyAgRkRLX0ZPUk1BVF9GQUlMID0gLTEKK30gRkRLX2NvbnZlcnRlcl9mb3JtYXRpZF90OworCitleHRlcm4gY29uc3QgSU5UIGZvcm1hdF9uY2hhbltGREtfTkZPUk1BVFMgKyA5IC0gMl07CiAKICNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9GREtfdHJpZ0ZjdHMuaCBiL2xpYkZESy9pbmNsdWRlL0ZES190cmlnRmN0cy5oCmluZGV4IGMzMmMwZjIuLjE1M2NhNGMgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL0ZES190cmlnRmN0cy5oCisrKyBiL2xpYkZESy9pbmNsdWRlL0ZES190cmlnRmN0cy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQzICs5MCw0NSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEhhcmljaGFyYW4gTGFrc2htYW4sIE1hbnVlbCBKYW5kZXIKKwogICAgRGVzY3JpcHRpb246IFRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIGZpeGVkIHBvaW50IGZyYWN0aW9uYWwgaW1wbGVtZW50YXRpb24uCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQorI2lmICFkZWZpbmVkKEZES19UUklHRkNUU19IKQorI2RlZmluZSBGREtfVFJJR0ZDVFNfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogCiAvKiBGaXhlZCBwb2ludCBwcmVjaXNpb24gZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgUShmb3JtYXQpICAgICAgICAoKEZJWFBfREJMKSgoKExPTkcpMSkgPDwgKGZvcm1hdCkpKQorI2RlZmluZSBRKGZvcm1hdCkgKChGSVhQX0RCTCkoKChMT05HKTEpIDw8IChmb3JtYXQpKSkKIAogI2lmbmRlZiBNX1BJCi0jZGVmaW5lIE1fUEkgICAgICAoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NmYpCisjZGVmaW5lIE1fUEkgKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDZmKQogI2VuZGlmCiAKIC8qIQogICogSW52ZXJzZSB0YW5nZW50IGZ1bmN0aW9uLgogICovCiAKLS8vIC0tLSBmaXhwX2F0YW4oKSAtLS0tCi0jZGVmaW5lIFFfQVRBTklOUCAgICgyNSkgICAgLy8gSW5wdXQgaW4gcTI1LCBPdXRwdXQgaW4gcTMwCi0jZGVmaW5lIFFfQVRBTk9VVCAgICgzMCkKLSNkZWZpbmUgQVRJX1NGICAgICAgICAgICAgICAoKERGUkFDVF9CSVRTLTEpLVFfQVRBTklOUCkgIC8vIDYKLSNkZWZpbmUgQVRJX1NDQUxFICAgICAgICAgICAoKGZsb2F0KSgxPDxBVElfU0YpKSAgICAgICAgIC8vCi0jZGVmaW5lIEFUT19TRiAgICAgICAgICAgICAgKChERlJBQ1RfQklUUy0xKS1RX0FUQU5PVVQpICAvLyAxICAgXSAtcGkvMiAuLiBwaS8yIFsKLSNkZWZpbmUgQVRPX1NDQUxFICAgICAgICAgICAoKGZsb2F0KSgxPDxBVE9fU0YpKSAgICAgICAgIC8vCi0vLyAtLS0gZml4cF9hdGFuMigpIC0tLQotI2RlZmluZSBRX0FUQU4yT1VUICAoMjkpCi0jZGVmaW5lIEFUMk9fU0YgICAgICAgICAgICAgKChERlJBQ1RfQklUUy0xKS1RX0FUQU4yT1VUKSAvLyAyICAgXSAtcGkgICAuLiBwaSAgIF0KLSNkZWZpbmUgQVQyT19TQ0FMRSAgICAgICAgICAoKGZsb2F0KSgxPDxBVDJPX1NGKSkgICAgICAgIC8vCisvKiAtLS0gZml4cF9hdGFuKCkgLS0tLSAgICAqLworI2RlZmluZSBRX0FUQU5JTlAgKDI1KSAgLy8gSW5wdXQgaW4gcTI1LCBPdXRwdXQgaW4gcTMwCisjZGVmaW5lIFFfQVRBTk9VVCAoMzApCisjZGVmaW5lIEFUSV9TRiAoKERGUkFDVF9CSVRTIC0gMSkgLSBRX0FUQU5JTlApIC8qIDYgICovCisjZGVmaW5lIEFUSV9TQ0FMRSAoKGZsb2F0KSgxIDw8IEFUSV9TRikpCisjZGVmaW5lIEFUT19TRiAoKERGUkFDVF9CSVRTIC0gMSkgLSBRX0FUQU5PVVQpIC8qIDEgICBdIC1waS8yIC4uIHBpLzIgWyAqLworI2RlZmluZSBBVE9fU0NBTEUgKChmbG9hdCkoMSA8PCBBVE9fU0YpKQorLyogLS0tIGZpeHBfYXRhbjIoKSAtLS0gICAgKi8KKyNkZWZpbmUgUV9BVEFOMk9VVCAoMjkpCisjZGVmaW5lIEFUMk9fU0YgKChERlJBQ1RfQklUUyAtIDEpIC0gUV9BVEFOMk9VVCkgLyogMiAgIF0gLXBpICAgLi4gcGkgICBdICovCisjZGVmaW5lIEFUMk9fU0NBTEUgKChmbG9hdCkoMSA8PCBBVDJPX1NGKSkKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEZJWFBfREJMIGZpeHBfYXRhbihGSVhQX0RCTCB4KTsKQEAgLTEyNiwxMyArMTM5LDExIEBACiAKICNkZWZpbmUgRklYUF9DT1NfU0lOCiAKLQogI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKIAogI2RlZmluZSBTSU5FVEFCIFNpbmVUYWJsZTUxMgogI2RlZmluZSBMRCA5CiAKLQogI2lmbmRlZiBGVU5DVElPTl9pbmxpbmVfZml4cF9jb3Nfc2luCiAKICNkZWZpbmUgRlVOQ1RJT05faW5saW5lX2ZpeHBfY29zX3NpbgpAQCAtMTQxLDg5ICsxNTIsMTA3IEBACiAgKiBDYWxjdWxhdGVzIGNvYXJzZSBsb29rdXAgaW5kZXggYW5kIHNpZ24gZm9yIHNpbmUuCiAgKiBSZXR1cm5zIGRlbHRhIHggcmVzaWR1YWwuCiAgKi8KLXN0YXRpYyBpbmxpbmUgRklYUF9EQkwgZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZShGSVhQX0RCTCB4LCBpbnQgc2NhbGUsIEZJWFBfREJMICpzaW5lLCBGSVhQX0RCTCAqY29zaW5lKQotewotICAgIEZJWFBfREJMIHJlc2lkdWFsOwotICAgIGludCBzOwotICAgIGludCBzaGlmdCA9ICgzMS1zY2FsZS1MRC0xKTsKLSAgICBpbnQgc3NpZ24gPSAxOwotICAgIGludCBjc2lnbiA9IDE7CitzdGF0aWMgaW5saW5lIEZJWFBfREJMIGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUoRklYUF9EQkwgeCwgaW50IHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb3NpbmUpIHsKKyAgRklYUF9EQkwgcmVzaWR1YWw7CisgIGludCBzOworICBpbnQgc2hpZnQgPSAoMzEgLSBzY2FsZSAtIExEIC0gMSk7CisgIGludCBzc2lnbiA9IDE7CisgIGludCBjc2lnbiA9IDE7CiAKLSAgICByZXNpZHVhbCA9IGZNdWx0KHgsIEZMMkZYQ09OU1RfREJMKDEuMC9NX1BJKSk7Ci0gICAgcyA9ICgoTE9ORylyZXNpZHVhbCkgPj4gc2hpZnQ7CisgIHJlc2lkdWFsID0gZk11bHQoeCwgRkwyRlhDT05TVF9EQkwoMS4wIC8gTV9QSSkpOworICBzID0gKChMT05HKXJlc2lkdWFsKSA+PiBzaGlmdDsKIAotICAgIHJlc2lkdWFsICY9ICggKDE8PHNoaWZ0KSAtIDEgKTsKLSAgICByZXNpZHVhbCA9IGZNdWx0KHJlc2lkdWFsLCBGTDJGWENPTlNUX0RCTChNX1BJLzQuMCkpIDw8IDI7Ci0gICAgcmVzaWR1YWwgPDw9IHNjYWxlOworICByZXNpZHVhbCAmPSAoKDEgPDwgc2hpZnQpIC0gMSk7CisgIHJlc2lkdWFsID0gZk11bHQocmVzaWR1YWwsIEZMMkZYQ09OU1RfREJMKE1fUEkgLyA0LjApKSA8PCAyOworICByZXNpZHVhbCA8PD0gc2NhbGU7CiAKLSAgICAvKiBTaW5lIHNpZ24gc3ltbWV0cnkgKi8KLSAgICBpZiAocyAmICgoMTw8TEQpPDwxKSApIHsKLSAgICAgIHNzaWduID0gLXNzaWduOworICAvKiBTaW5lIHNpZ24gc3ltbWV0cnkgKi8KKyAgaWYgKHMgJiAoKDEgPDwgTEQpIDw8IDEpKSB7CisgICAgc3NpZ24gPSAtc3NpZ247CisgIH0KKyAgLyogQ29zaW5lIHNpZ24gc3ltbWV0cnkgKi8KKyAgaWYgKChzICsgKDEgPDwgTEQpKSAmICgoMSA8PCBMRCkgPDwgMSkpIHsKKyAgICBjc2lnbiA9IC1jc2lnbjsKKyAgfQorCisgIHMgPSBmQWJzKHMpOworCisgIHMgJj0gKCgoMSA8PCBMRCkgPDwgMSkgLSAxKTsgLyogTW9kdWxvIFBJICovCisKKyAgaWYgKHMgPiAoMSA8PCBMRCkpIHsKKyAgICBzID0gKCgxIDw8IExEKSA8PCAxKSAtIHM7CisgIH0KKworICB7CisgICAgTE9ORyBzbCwgY2w7CisgICAgLyogQmVjYXVzZSBvZiBwYWNrZWQgdGFibGUgKi8KKyAgICBpZiAocyA+ICgxIDw8IChMRCAtIDEpKSkgeworICAgICAgRklYUF9TVFAgdG1wOworICAgICAgLyogQ29zaW5lL1NpbmUgc2ltZXRyeSBmb3IgYW5nbGVzIGdyZWF0ZXIgdGhhbiBQSS80ICovCisgICAgICBzID0gKDEgPDwgTEQpIC0gczsKKyAgICAgIHRtcCA9IFNJTkVUQUJbc107CisgICAgICBzbCA9IChMT05HKXRtcC52LnJlOworICAgICAgY2wgPSAoTE9ORyl0bXAudi5pbTsKKyAgICB9IGVsc2UgeworICAgICAgRklYUF9TVFAgdG1wOworICAgICAgdG1wID0gU0lORVRBQltzXTsKKyAgICAgIHNsID0gKExPTkcpdG1wLnYuaW07CisgICAgICBjbCA9IChMT05HKXRtcC52LnJlOwogICAgIH0KLSAgICAvKiBDb3NpbmUgc2lnbiBzeW1tZXRyeSAqLwotICAgIGlmICggKHMgKyAoMTw8TEQpKSAmICgoMTw8TEQpPDwxKSApIHsKLSAgICAgIGNzaWduID0gLWNzaWduOwotICAgIH0KLQotICAgIHMgPSBmQWJzKHMpOwotCi0gICAgcyAmPSAoKCgxPDxMRCk8PDEpLTEpOyAvKiBNb2R1bG8gUEkgKi8KLQotICAgIGlmIChzID4gKDE8PExEKSkgewotICAgICAgcyA9ICgoMTw8TEQpPDwxKSAtIHM7Ci0gICAgfQotCi0gICAgewotICAgICAgTE9ORyBzbCwgY2w7Ci0gICAgICAvKiBCZWNhdXNlIG9mIHBhY2tlZCB0YWJsZSAqLwotICAgICAgaWYgKHMgPiAoMTw8KExELTEpKSkgewotICAgICAgICBGSVhQX1NUUCB0bXA7Ci0gICAgICAgIC8qIENvc2luZS9TaW5lIHNpbWV0cnkgZm9yIGFuZ2xlcyBncmVhdGVyIHRoYW4gUEkvNCAqLwotICAgICAgICBzID0gKDE8PExEKS1zOwotICAgICAgICB0bXAgPSBTSU5FVEFCW3NdOwotICAgICAgICBzbCA9IChMT05HKXRtcC52LnJlOwotICAgICAgICBjbCA9IChMT05HKXRtcC52LmltOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRklYUF9TVFAgdG1wOwotICAgICAgICB0bXAgPSBTSU5FVEFCW3NdOwotICAgICAgICBzbCA9IChMT05HKXRtcC52LmltOwotICAgICAgICBjbCA9IChMT05HKXRtcC52LnJlOwotICAgICAgfQogCiAjaWZkZWYgU0lORVRBQkxFXzE2QklUCi0gICAgICAqc2luZSAgID0gKEZJWFBfREJMKSgoc2wgKiBzc2lnbikgPDwgKERGUkFDVF9CSVRTLUZSQUNUX0JJVFMpKTsKLSAgICAgICpjb3NpbmUgPSAoRklYUF9EQkwpKChjbCAqIGNzaWduKSA8PCAoREZSQUNUX0JJVFMtRlJBQ1RfQklUUykpOworICAgICpzaW5lID0gKEZJWFBfREJMKSgoc2wgKiBzc2lnbikgPDwgKERGUkFDVF9CSVRTIC0gRlJBQ1RfQklUUykpOworICAgICpjb3NpbmUgPSAoRklYUF9EQkwpKChjbCAqIGNzaWduKSA8PCAoREZSQUNUX0JJVFMgLSBGUkFDVF9CSVRTKSk7CiAjZWxzZQotICAgICAgKnNpbmUgICA9IChGSVhQX0RCTCkoc2wgKiBzc2lnbik7Ci0gICAgICAqY29zaW5lID0gKEZJWFBfREJMKShjbCAqIGNzaWduKTsKKyAgICAvKiBzY2FsZSBkb3duIGJ5IDEgZm9yIG92ZXJmbG93IHByZXZlbnRpb24uIFRoaXMgaXMgdW5kb25lIGF0IHRoZSBjYWxsaW5nCisgICAgICogZnVuY3Rpb24uICovCisgICAgKnNpbmUgPSAoRklYUF9EQkwpKHNsICogc3NpZ24pID4+IDE7CisgICAgKmNvc2luZSA9IChGSVhQX0RCTCkoY2wgKiBjc2lnbikgPj4gMTsKICNlbmRpZgotICAgIH0KKyAgfQogCi0gICAgcmV0dXJuIHJlc2lkdWFsOworICByZXR1cm4gcmVzaWR1YWw7CiB9CiAKIC8qKgotICogXGJyaWVmIENhbGN1bGF0ZSBjb3NpbmUgYW5kIHNpbmUgdmFsdWUgZWFjaCBvZiAyIGFuZ2xlcyBkaWZmZXJlbnQgYW5nbGUgdmFsdWVzLgorICogXGJyaWVmIENhbGN1bGF0ZSBjb3NpbmUgYW5kIHNpbmUgdmFsdWUgZWFjaCBvZiAyIGFuZ2xlcyBkaWZmZXJlbnQgYW5nbGUKKyAqIHZhbHVlcy4KICAqIFxwYXJhbSB4MSBmaXJzdCBhbmdsZSB2YWx1ZQogICogXHBhcmFtIHgyIHNlY29uZCBhbmdsZSB2YWx1ZQogICogXHBhcmFtIHNjYWxlIGV4cG9uZW50IG9mIHgxIGFuZCB4MgotICogXHBhcmFtIG91dCBwb2ludGVyIHRvIDQgRklYUF9EQkwgbG9jYXRpb25zLCB3ZXJlIHRoZSB2YWx1ZXMgY29zKHgxKSwgc2luKHgxKSwgY29zKHgyKSwgc2luKHgyKQotICogICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIG91dCBwb2ludGVyIHRvIDQgRklYUF9EQkwgbG9jYXRpb25zLCB3ZXJlIHRoZSB2YWx1ZXMgY29zKHgxKSwgc2luKHgxKSwKKyAqIGNvcyh4MiksIHNpbih4Mikgd2lsbCBiZSBzdG9yZWQgaW50by4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGlubGluZV9maXhwX2Nvc19zaW4gKEZJWFBfREJMIHgxLCBGSVhQX0RCTCB4MiwgY29uc3QgaW50IHNjYWxlLCBGSVhQX0RCTCAqb3V0KQotewotICAgIEZJWFBfREJMIHJlc2lkdWFsLCBlcnJvcjAsIGVycm9yMSwgc2luZSwgY29zaW5lOwotICAgIHJlc2lkdWFsID0gZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZSh4MSwgc2NhbGUsICZzaW5lLCAmY29zaW5lKTsKLSAgICBlcnJvcjAgPSBmTXVsdERpdjIoc2luZSwgcmVzaWR1YWwpOwotICAgIGVycm9yMSA9IGZNdWx0RGl2Mihjb3NpbmUsIHJlc2lkdWFsKTsKLSAgICAqb3V0KysgID0gY29zaW5lIC0gKGVycm9yMDw8MSk7Ci0gICAgKm91dCsrICA9IHNpbmUgICArIChlcnJvcjE8PDEpOworc3RhdGljIGlubGluZSB2b2lkIGlubGluZV9maXhwX2Nvc19zaW4oRklYUF9EQkwgeDEsIEZJWFBfREJMIHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlLCBGSVhQX0RCTCAqb3V0KSB7CisgIEZJWFBfREJMIHJlc2lkdWFsLCBlcnJvcjAsIGVycm9yMSwgc2luZSwgY29zaW5lOworICByZXNpZHVhbCA9IGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUoeDEsIHNjYWxlLCAmc2luZSwgJmNvc2luZSk7CisgIGVycm9yMCA9IGZNdWx0RGl2MihzaW5lLCByZXNpZHVhbCk7CisgIGVycm9yMSA9IGZNdWx0RGl2Mihjb3NpbmUsIHJlc2lkdWFsKTsKIAotICAgIHJlc2lkdWFsID0gZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZSh4Miwgc2NhbGUsICZzaW5lLCAmY29zaW5lKTsKLSAgICBlcnJvcjAgPSBmTXVsdERpdjIoc2luZSwgcmVzaWR1YWwpOwotICAgIGVycm9yMSA9IGZNdWx0RGl2Mihjb3NpbmUsIHJlc2lkdWFsKTsKLSAgICAqb3V0KysgID0gY29zaW5lIC0gKGVycm9yMDw8MSk7Ci0gICAgKm91dCsrICA9IHNpbmUgICArIChlcnJvcjE8PDEpOworI2lmZGVmIFNJTkVUQUJMRV8xNkJJVAorICAqb3V0KysgPSBjb3NpbmUgLSAoZXJyb3IwIDw8IDEpOworICAqb3V0KysgPSBzaW5lICsgKGVycm9yMSA8PCAxKTsKKyNlbHNlCisgIC8qIFVuZG8gZG93bnNjYWxpbmcgYnkgMSB3aGljaCB3YXMgZG9uZSBhdCBmaXhwX3Npbl9jb3NfcmVzaWR1YWxfaW5saW5lICovCisgICpvdXQrKyA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoY29zaW5lIC0gKGVycm9yMCA8PCAxKSwgMSwgREZSQUNUX0JJVFMpOworICAqb3V0KysgPSBTQVRVUkFURV9MRUZUX1NISUZUKHNpbmUgKyAoZXJyb3IxIDw8IDEpLCAxLCBERlJBQ1RfQklUUyk7CisjZW5kaWYKKworICByZXNpZHVhbCA9IGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUoeDIsIHNjYWxlLCAmc2luZSwgJmNvc2luZSk7CisgIGVycm9yMCA9IGZNdWx0RGl2MihzaW5lLCByZXNpZHVhbCk7CisgIGVycm9yMSA9IGZNdWx0RGl2Mihjb3NpbmUsIHJlc2lkdWFsKTsKKworI2lmZGVmIFNJTkVUQUJMRV8xNkJJVAorICAqb3V0KysgPSBjb3NpbmUgLSAoZXJyb3IwIDw8IDEpOworICAqb3V0KysgPSBzaW5lICsgKGVycm9yMSA8PCAxKTsKKyNlbHNlCisgICpvdXQrKyA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoY29zaW5lIC0gKGVycm9yMCA8PCAxKSwgMSwgREZSQUNUX0JJVFMpOworICAqb3V0KysgPSBTQVRVUkFURV9MRUZUX1NISUZUKHNpbmUgKyAoZXJyb3IxIDw8IDEpLCAxLCBERlJBQ1RfQklUUyk7CisjZW5kaWYKIH0KICNlbmRpZgogCisjZW5kaWYgLyogIWRlZmluZWQoRkRLX1RSSUdGQ1RTX0gpICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9hYnMuaCBiL2xpYkZESy9pbmNsdWRlL2Ficy5oCmluZGV4IDA4MzdlM2MuLjA4NDZjOTYgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL2Ficy5oCisrKyBiL2xpYkZESy9pbmNsdWRlL2Ficy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIzICs5MCwyMyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGFicyBkZWZpbml0aW9ucwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgIWRlZmluZWQoX19BQlNfSF9fKQotI2RlZmluZSBfX0FCU19IX18KKyNpZiAhZGVmaW5lZChBQlNfSCkKKyNkZWZpbmUgQUJTX0gKIAotCi0jaWYgZGVmaW5lZChfX21pcHNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2lmIGRlZmluZWQoX19taXBzX18pCiAjaW5jbHVkZSAibWlwcy9hYnNfbWlwcy5oIgogCi0jZWxpZiBkZWZpbmVkKF9feDg2X18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNlbGlmIGRlZmluZWQoX194ODZfXykKICNpbmNsdWRlICJ4ODYvYWJzX3g4Ni5oIgogCiAjZW5kaWYgLyogYWxsIGNvcmVzICovCkBAIC0xMDcsMTUgKzExOCwxOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhhYnNfRCkKLWlubGluZSBGSVhQX0RCTCBmaXhhYnNfRChGSVhQX0RCTCB4KSB7IHJldHVybiAoKHgpID4gKEZJWFBfREJMKSgwKSkgPyAoeCkgOiAtKHgpIDsgfQoraW5saW5lIEZJWFBfREJMIGZpeGFic19EKEZJWFBfREJMIHgpIHsKKyAgcmV0dXJuICgoeCkgPiAoRklYUF9EQkwpKDApKSA/ICh4KSA6IC0oeCk7Cit9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeGFic19JKQotaW5saW5lIElOVCBmaXhhYnNfSShJTlQgeCkgICAgICAgICAgIHsgcmV0dXJuICgoeCkgPiAoSU5UKSgwKSkgICAgICA/ICh4KSA6IC0oeCkgOyB9CitpbmxpbmUgSU5UIGZpeGFic19JKElOVCB4KSB7IHJldHVybiAoKHgpID4gKElOVCkoMCkpID8gKHgpIDogLSh4KTsgfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhhYnNfUykKLWlubGluZSBGSVhQX1NHTCBmaXhhYnNfUyhGSVhQX1NHTCB4KSB7IHJldHVybiAoKHgpID4gKEZJWFBfU0dMKSgwKSkgPyAoeCkgOiAtKHgpIDsgfQoraW5saW5lIEZJWFBfU0dMIGZpeGFic19TKEZJWFBfU0dMIHgpIHsKKyAgcmV0dXJuICgoeCkgPiAoRklYUF9TR0wpKDApKSA/ICh4KSA6IC0oeCk7Cit9CiAjZW5kaWYKIAotI2VuZGlmIC8qIF9fQUJTX0hfXyAqLworI2VuZGlmIC8qIEFCU19IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9hcm0vY2x6X2FybS5oIGIvbGliRkRLL2luY2x1ZGUvYXJtL2Nsel9hcm0uaAppbmRleCBmNDNhN2IxLi4xYzNlMWZiIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9hcm0vY2x6X2FybS5oCisrKyBiL2xpYkZESy9pbmNsdWRlL2FybS9jbHpfYXJtLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDQgKzkwLDc1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChDTFpfQVJNX0gpCisjZGVmaW5lIENMWl9BUk1fSAogCiAjaWYgZGVmaW5lZChfX2FybV9fKQogCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCi0gIC8qIEFSTSBnY2MqLworI2lmIGRlZmluZWQoX19HTlVDX18pCisvKiBBUk0gZ2NjKi8KIAotICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm16X0QKLSAgI2RlZmluZSBGVU5DVElPTl9maXhub3JtX0QKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF84X18pCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm16X0QKKyNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybV9ECisjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm16X1MKKyNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybV9TCiAKLSAgaW5saW5lIElOVCBmaXhub3Jtel9EKExPTkcgdmFsdWUpCi0gIHsKLSAgICBJTlQgcmVzdWx0OwotICAgIGFzbSgiY2x6ICUwLCAlMSAiOiAiPXIiKHJlc3VsdCkgOiAiciIodmFsdWUpICk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQorI2lmZGVmIEZVTkNUSU9OX2ZpeG5vcm16X0QKK2lubGluZSBJTlQgZml4bm9ybXpfRChMT05HIHZhbHVlKSB7CisgIElOVCByZXN1bHQ7CisjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzhfXykKKyAgYXNtKCJjbHogJXcwLCAldzEgIiA6ICI9ciIocmVzdWx0KSA6ICJyIih2YWx1ZSkpOworI2Vsc2UKKyAgYXNtKCJjbHogJTAsICUxICIgOiAiPXIiKHJlc3VsdCkgOiAiciIodmFsdWUpKTsKKyNlbmRpZgorICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhub3Jtel9EICovCiAKLSAgaW5saW5lIElOVCBmaXhub3JtX0QoTE9ORyB2YWx1ZSkKLSAgewotICAgIElOVCByZXN1bHQ7Ci0gICAgaWYgKHZhbHVlID09IDApIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAodmFsdWUgPCAwKSB7Ci0gICAgICB2YWx1ZSA9IH52YWx1ZTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gIGZpeG5vcm16X0QodmFsdWUpOwotICAgIHJldHVybiByZXN1bHQgLSAxOwotICB9CisjaWZkZWYgRlVOQ1RJT05fZml4bm9ybV9ECitpbmxpbmUgSU5UIGZpeG5vcm1fRChMT05HIHZhbHVlKSB7CisgIGlmICghdmFsdWUpIHJldHVybiAwOworICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IH52YWx1ZTsKKyAgcmV0dXJuIGZpeG5vcm16X0QodmFsdWUpIC0gMTsKK30KKyNlbmRpZiAvKiAjaWZkZWYgRlVOQ1RJT05fZml4bm9ybV9EICovCisKKyNpZmRlZiBGVU5DVElPTl9maXhub3Jtel9TCitpbmxpbmUgSU5UIGZpeG5vcm16X1MoU0hPUlQgdmFsdWUpIHsKKyAgSU5UIHJlc3VsdDsKKyAgcmVzdWx0ID0gKExPTkcpKHZhbHVlIDw8IDE2KTsKKyAgaWYgKHJlc3VsdCA9PSAwKQorICAgIHJlc3VsdCA9IDE2OworICBlbHNlCisgICAgcmVzdWx0ID0gZml4bm9ybXpfRChyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhub3Jtel9TICovCisKKyNpZmRlZiBGVU5DVElPTl9maXhub3JtX1MKK2lubGluZSBJTlQgZml4bm9ybV9TKFNIT1JUIHZhbHVlKSB7CisgIExPTkcgbHZhbHVlID0gKExPTkcpKHZhbHVlIDw8IDE2KTsKKyAgaWYgKCFsdmFsdWUpIHJldHVybiAwOworICBpZiAobHZhbHVlIDwgMCkgbHZhbHVlID0gfmx2YWx1ZTsKKyAgcmV0dXJuIGZpeG5vcm16X0QobHZhbHVlKSAtIDE7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG5vcm1fUyAqLworCisjZW5kaWYKIAogI2VuZGlmIC8qIGFybSB0b29sY2hhaW4gKi8KIAogI2VuZGlmIC8qIF9fYXJtX18gKi8KIAorI2VuZGlmIC8qICFkZWZpbmVkKENMWl9BUk1fSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2FybS9jcGx4X211bC5oIGIvbGliRkRLL2luY2x1ZGUvYXJtL2NwbHhfbXVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDgwMzEuLjAwMDAwMDAKLS0tIGEvbGliRkRLL2luY2x1ZGUvYXJtL2NwbHhfbXVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6Ci0gICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoX19HTlVDX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KLQotI2lmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykKLSAgI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYKLSAgI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgotICAvLyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MTYKLSAgLy8jZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0XzMyeDE2WDIKLSNlbmRpZgotCi0jZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyCi0vLyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MzJYMgotCi0jaWZkZWYgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2Ci1pbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TUEsgd3BrICkKLXsKLSAgIExPTkcgdG1wMSx0bXAyOwotICAgY29uc3QgTE9ORyB3ID0gd3BrLnc7Ci0KLSAgIGFzbSgic211bHd0ICUwLCAlMywgJTQ7XG4iCi0gICAgICAgInJzYiAlMSwlMCwjMDtcbiIKLSAgICAgICAic21sYXdiICUwLCAlMiwgJTQsICUxO1xuIgotICAgICAgICJzbXVsd3QgJTEsICUyLCAlNDtcbiIKLSAgICAgICAic21sYXdiICUxLCAlMywgJTQsICUxO1xuIgotICAgICAgIDogIj0mciIodG1wMSksICI9JnIiKHRtcDIpCi0gICAgICAgOiAiciIoYV9SZSksICJyIihhX0ltKSwgInIiKHcpCi0gICAgICAgKTsKLQotICAgICpjX1JlID0gdG1wMTsKLSAgICAqY19JbSA9IHRtcDI7Ci19Ci0jZW5kaWYgLyogRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2ICovCi0KLSNpZmRlZiBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgotaW5saW5lIHZvaWQgY3BseE11bHREaXYyKCBGSVhQX0RCTCAqY19SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfSW0pCi17Ci0gICAgTE9ORyB0bXAxLCB0bXAyOwotCi0gICAgYXNtKCJzbXVsd2IgJTAsICUzLCAlNTtcbiIgICAgIC8qICU3ICAgPSAtYV9JbSAqIGJfSW0gKi8KLSAgICAgICAgInJzYiAlMSwlMCwjMDtcbiIKLSAgICAgICAgInNtbGF3YiAlMCwgJTIsICU0LCAlMTtcbiIgLyogdG1wMSA9ICBhX1JlICogYl9SZSAtIGFfSW0gKiBiX0ltICovCi0gICAgICAgICJzbXVsd2IgJTEsICUyLCAlNTtcbiIgICAgIC8qICU3ICAgPSAgYV9SZSAqIGJfSW0gKi8KLSAgICAgICAgInNtbGF3YiAlMSwgJTMsICU0LCAlMTtcbiIgLyogdG1wMiA9ICBhX0ltICogYl9SZSArIGFfUmUgKiBiX0ltICovCi0gICAgICAgIDogIj0mciIodG1wMSksICI9JnIiKHRtcDIpCi0gICAgICAgIDogInIiKGFfUmUpLCAiciIoYV9JbSksICJyIihiX1JlKSwgInIiKGJfSW0pCi0gICAgICAgICk7Ci0KLSAgICAgKmNfUmUgPSB0bXAxOwotICAgICAqY19JbSA9IHRtcDI7Ci19Ci0jZW5kaWYgLyogRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2WDIgKi8KLQotI2lmZGVmIEZVTkNUSU9OX2NwbHhNdWx0QWRkRGl2Ml8zMngxNlgyCi1pbmxpbmUgdm9pZCBjcGx4TXVsdEFkZERpdjIoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBiX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBiX0ltKQotewotICAgIExPTkcgdG1wMSwgdG1wMjsKLQotICAgIGFzbSgic211bHdiICUwLCAlMywgJTU7XG4iCi0gICAgICAgICJyc2IgJTEsJTAsIzA7XG4iCi0gICAgICAgICJzbWxhd2IgJTAsICUyLCAlNCwgJTE7XG4iCi0gICAgICAgICJzbXVsd2IgJTEsICUyLCAlNTtcbiIKLSAgICAgICAgInNtbGF3YiAlMSwgJTMsICU0LCAlMTtcbiIKLSAgICAgICAgOiAiPSZyIih0bXAxKSwgIj0mciIodG1wMikKLSAgICAgICAgOiAiciIoYV9SZSksICJyIihhX0ltKSwgInIiKGJfUmUpLCAiciIoYl9JbSkKLSAgICAgICAgKTsKLQotICAgICAqY19SZSArPSB0bXAxOwotICAgICAqY19JbSArPSB0bXAyOwotfQotI2VuZGlmIC8qIEZVTkNUSU9OX2NwbHhNdWx0QWRkRGl2Ml8zMngxNlgyICovCi0KLQotI2lmZGVmIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyCi1pbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYl9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYl9JbSkKLXsKLSAgICBMT05HIHRtcDEsIHRtcDI7Ci0KLSNpZmRlZiBfX0FSTV9BUkNIXzZfXwotICAgIGFzbSgKLSAgICAgICAic21tdWwgJTAsICUyLCAlNDtcbiIgICAgIC8qIHRtcDEgID0gYV9SZSAqIGJfUmUgKi8KLSAgICAgICAic21tbHMgJTAsICUzLCAlNSwgJTA7XG4iIC8qIHRtcDEgLT0gYV9JbSAqIGJfSW0gKi8KLSAgICAgICAic21tdWwgJTEsICUyLCAlNTtcbiIgICAgIC8qIHRtcDIgID0gYV9SZSAqIGJfSW0gKi8KLSAgICAgICAic21tbGEgJTEsICUzLCAlNCwgJTE7XG4iIC8qIHRtcDIgKz0gYV9JbSAqIGJfUmUgKi8KLSAgICAgICA6ICI9JnIiKHRtcDEpLCAiPSZyIih0bXAyKQotICAgICAgIDogInIiKGFfUmUpLCAiciIoYV9JbSksICJyIihiX1JlKSwgInIiKGJfSW0pCi0gICAgICAgOiAicjAiCi0gICAgICAgKTsKLSNlbHNlCi0gICAgTE9ORyBkaXNjYXJkOwotICAgIGFzbSgKLSAgICAgICAic211bGwgJTIsICUwLCAlNywgJTY7XG4iIC8qIHRtcDEgID0gLWFfSW0gKiBiX0ltICovCi0gICAgICAgInNtbGFsICUyLCAlMCwgJTMsICU1O1xuIiAvKiB0bXAxICs9ICBhX1JlICogYl9SZSAqLwotICAgICAgICJzbXVsbCAlMiwgJTEsICUzLCAlNjtcbiIgLyogdG1wMiAgPSAgYV9SZSAqIGJfSW0gKi8KLSAgICAgICAic21sYWwgJTIsICUxLCAlNCwgJTU7XG4iIC8qIHRtcDIgKz0gIGFfSW0gKiBiX1JlICovCi0gICAgICAgOiAiPSZyIih0bXAxKSwgIj0mciIodG1wMiksICI9JnIiKGRpc2NhcmQpCi0gICAgICAgOiAiciIoYV9SZSksICJyIihhX0ltKSwgInIiKGJfUmUpLCAiciIoYl9JbSksICJyIigtYV9JbSkKLSAgICAgICApOwotICNlbmRpZgotICAgICpjX1JlID0gdG1wMTsKLSAgICAqY19JbSA9IHRtcDI7Ci19Ci0jZW5kaWYgLyogRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDMyWDIgKi8KLQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvYXJtL2NwbHhfbXVsX2FybS5oIGIvbGliRkRLL2luY2x1ZGUvYXJtL2NwbHhfbXVsX2FybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NDhlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvaW5jbHVkZS9hcm0vY3BseF9tdWxfYXJtLmgKQEAgLTAsMCArMSwyMDEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoQ1BMWF9NVUxfQVJNX0gpCisjZGVmaW5lIENQTFhfTVVMX0FSTV9ICisKKyNpZiBkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoX19HTlVDX18pCisKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82X18pIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfOF9fKQorI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYKKyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2WDIKKyNlbmRpZgorCisjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyCisjaWZkZWYgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDMyWDIKK2lubGluZSB2b2lkIGNwbHhNdWx0RGl2MihGSVhQX0RCTCAqY19SZSwgRklYUF9EQkwgKmNfSW0sIGNvbnN0IEZJWFBfREJMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwgY29uc3QgRklYUF9EQkwgYl9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBiX0ltKSB7CisgIExPTkcgdG1wMSwgdG1wMjsKKworI2lmZGVmIF9fQVJNX0FSQ0hfOF9fCisgIGFzbSgic211bGwgICV4MCwgJXcyLCAldzQ7ICAgICAgIFxuIiAvKiB0bXAxICA9IGFfUmUgKiBiX1JlICovCisgICAgICAic211bGwgICV4MSwgJXcyLCAldzU7ICAgICAgIFxuIiAvKiB0bXAyICA9IGFfUmUgKiBiX0ltICovCisgICAgICAic21zdWJsICV4MCwgJXczLCAldzUsICV4MDsgIFxuIiAvKiB0bXAxIC09IGFfSW0gKiBiX0ltICovCisgICAgICAic21hZGRsICV4MSwgJXczLCAldzQsICV4MTsgIFxuIiAvKiB0bXAyICs9IGFfSW0gKiBiX1JlICovCisgICAgICAiYXNyICAgICV4MCwgJXgwLCAgIzMyICAgICAgIFxuIgorICAgICAgImFzciAgICAleDEsICV4MSwgICMzMiAgICAgICBcbiIKKyAgICAgIDogIj0mciIodG1wMSksICI9JnIiKHRtcDIpCisgICAgICA6ICJyIihhX1JlKSwgInIiKGFfSW0pLCAiciIoYl9SZSksICJyIihiX0ltKSk7CisjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKQorICBhc20oInNtbXVsICUwLCAlMiwgJTQ7XG4iICAgICAvKiB0bXAxICA9IGFfUmUgKiBiX1JlICovCisgICAgICAic21tbHMgJTAsICUzLCAlNSwgJTA7XG4iIC8qIHRtcDEgLT0gYV9JbSAqIGJfSW0gKi8KKyAgICAgICJzbW11bCAlMSwgJTIsICU1O1xuIiAgICAgLyogdG1wMiAgPSBhX1JlICogYl9JbSAqLworICAgICAgInNtbWxhICUxLCAlMywgJTQsICUxO1xuIiAvKiB0bXAyICs9IGFfSW0gKiBiX1JlICovCisgICAgICA6ICI9JnIiKHRtcDEpLCAiPSZyIih0bXAyKQorICAgICAgOiAiciIoYV9SZSksICJyIihhX0ltKSwgInIiKGJfUmUpLCAiciIoYl9JbSkpOworI2Vsc2UKKyAgTE9ORyBkaXNjYXJkOworICBhc20oInNtdWxsICUyLCAlMCwgJTcsICU2O1xuIiAvKiB0bXAxICA9IC1hX0ltICogYl9JbSAqLworICAgICAgInNtbGFsICUyLCAlMCwgJTMsICU1O1xuIiAvKiB0bXAxICs9ICBhX1JlICogYl9SZSAqLworICAgICAgInNtdWxsICUyLCAlMSwgJTMsICU2O1xuIiAvKiB0bXAyICA9ICBhX1JlICogYl9JbSAqLworICAgICAgInNtbGFsICUyLCAlMSwgJTQsICU1O1xuIiAvKiB0bXAyICs9ICBhX0ltICogYl9SZSAqLworICAgICAgOiAiPSZyIih0bXAxKSwgIj0mciIodG1wMiksICI9JnIiKGRpc2NhcmQpCisgICAgICA6ICJyIihhX1JlKSwgInIiKGFfSW0pLCAiciIoYl9SZSksICJyIihiX0ltKSwgInIiKC1hX0ltKSk7CisjZW5kaWYKKyAgKmNfUmUgPSB0bXAxOworICAqY19JbSA9IHRtcDI7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDMyWDIgKi8KKworI2lmIGRlZmluZWQoRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2KQoraW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLCBGSVhQX1NQSyB3cGspIHsKKyNpZmRlZiBfX0FSTV9BUkNIXzhfXworICBGSVhQX0RCTCBiX0ltID0gRlhfU0dMMkZYX0RCTCh3cGsudi5pbSk7CisgIEZJWFBfREJMIGJfUmUgPSBGWF9TR0wyRlhfREJMKHdway52LnJlKTsKKyAgY3BseE11bHREaXYyKGNfUmUsIGNfSW0sIGFfUmUsIGFfSW0sIGJfUmUsIGJfSW0pOworI2Vsc2UKKyAgTE9ORyB0bXAxLCB0bXAyOworICBjb25zdCBMT05HIHcgPSB3cGsudzsKKyAgYXNtKCJzbXVsd3QgJTAsICUzLCAlNDtcbiIKKyAgICAgICJyc2IgJTEsJTAsIzA7XG4iCisgICAgICAic21sYXdiICUwLCAlMiwgJTQsICUxO1xuIgorICAgICAgInNtdWx3dCAlMSwgJTIsICU0O1xuIgorICAgICAgInNtbGF3YiAlMSwgJTMsICU0LCAlMTtcbiIKKyAgICAgIDogIj0mciIodG1wMSksICI9JnIiKHRtcDIpCisgICAgICA6ICJyIihhX1JlKSwgInIiKGFfSW0pLCAiciIodykpOworICAqY19SZSA9IHRtcDE7CisgICpjX0ltID0gdG1wMjsKKyNlbmRpZgorfQorI2VuZGlmIC8qIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngxNiAqLworCisjaWZkZWYgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2WDIKK2lubGluZSB2b2lkIGNwbHhNdWx0RGl2MihGSVhQX0RCTCAqY19SZSwgRklYUF9EQkwgKmNfSW0sIGNvbnN0IEZJWFBfREJMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwgY29uc3QgRklYUF9TR0wgYl9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBiX0ltKSB7CisjaWZkZWYgX19BUk1fQVJDSF84X18KKyAgRklYUF9EQkwgYl9yZSA9IEZYX1NHTDJGWF9EQkwoYl9SZSk7CisgIEZJWFBfREJMIGJfaW0gPSBGWF9TR0wyRlhfREJMKGJfSW0pOworICBjcGx4TXVsdERpdjIoY19SZSwgY19JbSwgYV9SZSwgYV9JbSwgYl9yZSwgYl9pbSk7CisjZWxzZQorICBMT05HIHRtcDEsIHRtcDI7CisKKyAgYXNtKCJzbXVsd2IgJTAsICUzLCAlNTtcbiIgLyogJTcgICA9IC1hX0ltICogYl9JbSAqLworICAgICAgInJzYiAlMSwlMCwjMDtcbiIKKyAgICAgICJzbWxhd2IgJTAsICUyLCAlNCwgJTE7XG4iIC8qIHRtcDEgPSAgYV9SZSAqIGJfUmUgLSBhX0ltICogYl9JbSAqLworICAgICAgInNtdWx3YiAlMSwgJTIsICU1O1xuIiAgICAgLyogJTcgICA9ICBhX1JlICogYl9JbSAqLworICAgICAgInNtbGF3YiAlMSwgJTMsICU0LCAlMTtcbiIgLyogdG1wMiA9ICBhX0ltICogYl9SZSArIGFfUmUgKiBiX0ltICovCisgICAgICA6ICI9JnIiKHRtcDEpLCAiPSZyIih0bXAyKQorICAgICAgOiAiciIoYV9SZSksICJyIihhX0ltKSwgInIiKGJfUmUpLCAiciIoYl9JbSkpOworCisgICpjX1JlID0gdG1wMTsKKyAgKmNfSW0gPSB0bXAyOworI2VuZGlmCit9CisjZW5kaWYgLyogRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2WDIgKi8KKworI2VuZGlmCisKKyNlbmRpZiAvKiAhZGVmaW5lZChDUExYX01VTF9BUk1fSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2FybS9maXhtYWRkX2FybS5oIGIvbGliRkRLL2luY2x1ZGUvYXJtL2ZpeG1hZGRfYXJtLmgKaW5kZXggMTExMTQ3Yi4uMTM3ODY2MCAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvYXJtL2ZpeG1hZGRfYXJtLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvYXJtL2ZpeG1hZGRfYXJtLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksODIgKzkwLDEzMSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOgorCiAgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoRklYTUFERF9BUk1fSCkKKyNkZWZpbmUgRklYTUFERF9BUk1fSAogCiAjaWYgZGVmaW5lZChfX2FybV9fKQogCi0gIC8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0gICNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fU1lNQklBTjMyX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KLSAgLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLSAgICAvKiBBUk0gR05VIEdDQyAqLworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKi8KKy8qIEFSTSBHTlUgR0NDICovCiAKLSAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0RECisjaWZkZWYgX19BUk1fQVJDSF84X18KKyNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJfREQKKyNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2Ml9ERAoraW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyX0REKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgSU5UNjQgcmVzdWx0OworICBhc20oInNtdWxsICAleDAsICAldzEsICAldzI7ICAgIFxuIgorICAgICAgImFzciAgICAleDAsICAleDAsICAjMzI7ICAgIFxuIgorICAgICAgImFkZCAgICAldzAsICV3MywgICV3MDsgICAgXG4iCisgICAgICA6ICI9JnIiKHJlc3VsdCkKKyAgICAgIDogInIiKGEpLCAiciIoYiksICJyIih4KSk7CisgIHJldHVybiAoSU5UKXJlc3VsdDsKK30KKyNlbmRpZiAvKiAjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJfREQgKi8KIAotICAgICNpZmRlZiBfX0FSTV9BUkNIXzZfXwotICAgICAgaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyX0REIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7Ci0gICAgICAgIElOVCByZXN1bHQ7Ci0gICAgICAgIGFzbSAgKCJzbW1sYSAlMCwgJTEsICUyLCAlMztcbiIKLSAgICAgICAgICAgICAgOiAiPXIiIChyZXN1bHQpCi0gICAgICAgICAgICAgIDogInIiIChhKSwgInIiIChiKSwgInIiKHgpICk7Ci0gICAgICAgIHJldHVybiByZXN1bHQgOwotICAgICAgfQotICAgICAgI2RlZmluZSBGVU5DVElPTl9maXhtc3ViZGl2Ml9ERAotICAgICAgaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyX0REIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7Ci0gICAgICAgIElOVCByZXN1bHQ7Ci0gICAgICAgIGFzbSAgKCJzbW1scyAlMCwgJTEsICUyLCAlMztcbiIKLSAgICAgICAgICAgICAgOiAiPXIiIChyZXN1bHQpCi0gICAgICAgICAgICAgIDogInIiIChhKSwgInIiIChiKSwgInIiKHgpICk7Ci0gICAgICAgIHJldHVybiByZXN1bHQgOwotICAgICAgfQotICAgICNlbHNlIC8qIF9fQVJNX0FSQ0hfNl9fICovCi0gICAgICBpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfREQgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKLSAgICAgICAgSU5UIGRpc2NhcmQsIHJlc3VsdCA9IHg7Ci0gICAgICAgIGFzbSAgKCJzbWxhbCAlMCwgJTEsICUyLCAlMztcbiIKLSAgICAgICAgICAgICAgOiAiPXIiIChkaXNjYXJkKSwgIityIiAocmVzdWx0KQotICAgICAgICAgICAgICA6ICJyIiAoYSksICJyIiAoYikgKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdCA7Ci0gICAgICB9Ci0gICAgI2VuZGlmIC8qIF9fQVJNX0FSQ0hfNl9fICovCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG1zdWJkaXYyX0RECisjaWZkZWYgRlVOQ1RJT05fZml4bXN1YmRpdjJfREQKK2lubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2Ml9ERChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisgIElOVDY0IHJlc3VsdDsKKyAgYXNtKCJzbXVsbCAgJXgwLCAgJXcxLCAldzI7ICAgICBcbiIKKyAgICAgICJhc3IgICAgJXgwLCAgJXgwLCAgIzMyOyAgICAgXG4iCisgICAgICAic3ViICAgICV3MCwgJXczLCAldzA7ICAgICBcbiIKKyAgICAgIDogIj0mciIocmVzdWx0KQorICAgICAgOiAiciIoYSksICJyIihiKSwgInIiKHgpKTsKKyAgcmV0dXJuIChJTlQpcmVzdWx0OworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtc3ViZGl2Ml9ERCAqLwogCi0gICAgI2lmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykKKyNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF82X18pCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0RECisjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJfREQKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9ERChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisgIElOVCByZXN1bHQ7CisgIGFzbSgic21tbGEgJTAsICUxLCAlMiwgJTM7XG4iIDogIj1yIihyZXN1bHQpIDogInIiKGEpLCAiciIoYiksICJyIih4KSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0REICovCiAKLSAgICAgICNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJfRFMKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXN1YmRpdjJfREQKKyNpZmRlZiBGVU5DVElPTl9maXhtc3ViZGl2Ml9ERAoraW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyX0REKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgSU5UIHJlc3VsdDsKKyAgYXNtKCJzbW1scyAlMCwgJTEsICUyLCAlMztcbiIgOiAiPXIiKHJlc3VsdCkgOiAiciIoYSksICJyIihiKSwgInIiKHgpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvKiAjaWZkZWYgRlVOQ1RJT05fZml4bXN1YmRpdjJfREQgKi8KIAotICAgICAgaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyX0RTIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7Ci0gICAgICAgIElOVCByZXN1bHQ7Ci0gICAgICAgIGFzbSgic21sYXdiICUwLCAlMSwgJTIsICUzICIKLSAgICAgICAgICAgICAgOiAiPXIiIChyZXN1bHQpCi0gICAgICAgICAgICAgIDogInIiIChhKSwgInIiIChiKSwgInIiICh4KSApOwotICAgICAgICByZXR1cm4gcmVzdWx0IDsKLSAgICAgIH0KKyNlbHNlCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0RECisjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJfREQKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9ERChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisgIElOVCBkaXNjYXJkID0gMDsKKyAgSU5UIHJlc3VsdCA9IHg7CisgIGFzbSgic21sYWwgJTAsICUxLCAlMiwgJTM7XG4iIDogIityIihkaXNjYXJkKSwgIityIihyZXN1bHQpIDogInIiKGEpLCAiciIoYikpOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2Ml9ERCAqLworI2VuZGlmCiAKLSAgICAjZW5kaWYgLyogZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSAqLworI2lmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykKIAotICAgICNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9ERAotICAgICNkZWZpbmUgZml4bWFkZGRpdjJCaXRFeGFjdF9ERChhLCBiLCBjKSBmaXhtYWRkZGl2Ml9ERChhLCBiLCBjKQorI2RlZmluZSBGVU5DVElPTl9maXhtYWRkZGl2Ml9EUworI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0RTCitpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfRFMoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9TR0wgYikgeworICBJTlQgcmVzdWx0OworICBhc20oInNtbGF3YiAlMCwgJTEsICUyLCAlMyAiIDogIj1yIihyZXN1bHQpIDogInIiKGEpLCAiciIoYiksICJyIih4KSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0RTICovCiAKLSAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfREQKLSAgICBpbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJCaXRFeGFjdF9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgewotICAgICAgcmV0dXJuIHggLSBmaXhtdWxkaXYyQml0RXhhY3RfREQoYSwgYik7Ci0gICAgfQorI2VuZGlmIC8qIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykgKi8KIAotICAgICNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9EUwotICAgICNkZWZpbmUgZml4bWFkZGRpdjJCaXRFeGFjdF9EUyhhLCBiLCBjKSBmaXhtYWRkZGl2Ml9EUyhhLCBiLCBjKQorI2RlZmluZSBGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X0RECisjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9ERAorI2RlZmluZSBmaXhtYWRkZGl2MkJpdEV4YWN0X0REKGEsIGIsIGMpIGZpeG1hZGRkaXYyX0REKGEsIGIsIGMpCisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfREQgKi8KIAotICAgICNkZWZpbmUgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9EUwotICAgIGlubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2MkJpdEV4YWN0X0RTIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7Ci0gICAgICByZXR1cm4geCAtIGZpeG11bGRpdjJCaXRFeGFjdF9EUyhhLCBiKTsKLSAgICB9Ci0gIC8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0gICNlbmRpZiAvKiB0b29sY2hhaW4gKi8KLSAgLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKyNkZWZpbmUgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9ERAorI2lmZGVmIEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfREQKK2lubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2MkJpdEV4YWN0X0REKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBiKSB7CisgIHJldHVybiB4IC0gZml4bXVsZGl2MkJpdEV4YWN0X0REKGEsIGIpOworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X0REICovCisKKyNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9EUworI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfRFMKKyNkZWZpbmUgZml4bWFkZGRpdjJCaXRFeGFjdF9EUyhhLCBiLCBjKSBmaXhtYWRkZGl2Ml9EUyhhLCBiLCBjKQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X0RTICovCisKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9EUworI2lmZGVmIEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfRFMKK2lubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2MkJpdEV4YWN0X0RTKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBiKSB7CisgIHJldHVybiB4IC0gZml4bXVsZGl2MkJpdEV4YWN0X0RTKGEsIGIpOworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X0RTICovCisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKi8KKyNlbmRpZiAvKiB0b29sY2hhaW4gKi8KKyAgLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICovCiAKICNlbmRpZiAvKiBfX2FybV9fICovCiAKKyNlbmRpZiAvKiAhZGVmaW5lZChGSVhNQUREX0FSTV9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvYXJtL2ZpeG11bF9hcm0uaCBiL2xpYkZESy9pbmNsdWRlL2FybS9maXhtdWxfYXJtLmgKaW5kZXggMmYwNDcwNS4uMDc3ZTVjNiAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvYXJtL2ZpeG11bF9hcm0uaAorKysgYi9saWJGREsvaW5jbHVkZS9hcm0vZml4bXVsX2FybS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDY0ICs5MCwxMDkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKEZJWE1VTF9BUk1fSCkKKyNkZWZpbmUgRklYTVVMX0FSTV9ICiAKICNpZiBkZWZpbmVkKF9fYXJtX18pCiAKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pCiAvKiBBUk0gd2l0aCBHTlUgY29tcGlsZXIgKi8KIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyX0RECiAKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RECi0jZGVmaW5lIGZpeG11bGRpdjJCaXRFeGFjdF9ERChhLGIpIGZpeG11bGRpdjJfREQoYSxiKQorI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9ERAorI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfREQoYSwgYikgZml4bXVsZGl2Ml9ERChhLCBiKQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfREQgKi8KKwogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9ERAotI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9ERChhLGIpIGZpeG11bF9ERChhLGIpCisjaWZkZWYgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfREQKKyNkZWZpbmUgZml4bXVsQml0RXhhY3RfREQoYSwgYikgKGZpeG11bGRpdjJCaXRFeGFjdF9ERChhLCBiKSA8PCAxKQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9ERCAqLwogCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9EUwotI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfRFMoYSxiKSBmaXhtdWxkaXYyX0RTKGEsYikKKyNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfRFMKKyNkZWZpbmUgZml4bXVsZGl2MkJpdEV4YWN0X0RTKGEsIGIpIGZpeG11bGRpdjJfRFMoYSwgYikKKyNlbmRpZiAvKiAjaWZkZWYgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RTICovCiAKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfRFMKLSNkZWZpbmUgZml4bXVsQml0RXhhY3RfRFMoYSxiKSBmaXhtdWxfRFMoYSxiKQorI2lmZGVmIEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X0RTCisjZGVmaW5lIGZpeG11bEJpdEV4YWN0X0RTKGEsIGIpIGZpeG11bF9EUyhhLCBiKQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9EUyAqLwogCi0jaWYgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykgfHwgZGVmaW5lZChfX1RBUkdFVF9BUkNIXzdFX00pCi1pbmxpbmUgSU5UIGZpeG11bGRpdjJfREQgKGNvbnN0IElOVCBhLCBjb25zdCBJTlQgYikKLXsKLSAgSU5UIHJlc3VsdCA7Ci0gIF9fYXNtX18gKCJzbW11bCAlMCwgJTEsICUyIiA6ICI9ciIgKHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiIChhKSwgInIiIChiKSkgOwotICByZXR1cm4gcmVzdWx0IDsKKyNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyX0RECitpbmxpbmUgSU5UIGZpeG11bGRpdjJfREQoY29uc3QgSU5UIGEsIGNvbnN0IElOVCBiKSB7CisgIElOVCByZXN1bHQ7CisjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzhfXykKKyAgSU5UNjQgcmVzdWx0NjQ7CisgIF9fYXNtX18oCisgICAgICAic211bGwgJXgwLCAldzEsICV3MjtcbiIKKyAgICAgICJhc3IgJXgwLCAleDAsICMzMjsgICAgICIKKyAgICAgIDogIj1yIihyZXN1bHQ2NCkKKyAgICAgIDogInIiKGEpLCAiciIoYikpOworICByZXN1bHQgPSAoSU5UKXJlc3VsdDY0OworI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykgfHwgZGVmaW5lZChfX1RBUkdFVF9BUkNIXzdFX00pCisgIF9fYXNtX18oInNtbXVsICUwLCAlMSwgJTIiIDogIj1yIihyZXN1bHQpIDogInIiKGEpLCAiciIoYikpOworI2Vsc2UKKyAgSU5UIGRpc2NhcmQ7CisgIF9fYXNtX18oInNtdWxsICUwLCAlMSwgJTIsICUzIgorICAgICAgICAgIDogIj0mciIoZGlzY2FyZCksICI9ciIocmVzdWx0KQorICAgICAgICAgIDogInIiKGEpLCAiciIoYikpOworI2VuZGlmCisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJfREQgKi8KKworI2lmIGRlZmluZWQoX19BUk1fQVJDSF84X18pCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfU0QKKyNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyX1NECitpbmxpbmUgSU5UIGZpeG11bGRpdjJfU0QoY29uc3QgU0hPUlQgYSwgY29uc3QgSU5UIGIpIHsKKyAgcmV0dXJuIGZpeG11bGRpdjJfREQoKElOVCkoYSA8PCAxNiksIGIpOworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyX1NEICovCisjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82X18pCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfU0QKKyNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyX1NECitpbmxpbmUgSU5UIGZpeG11bGRpdjJfU0QoY29uc3QgU0hPUlQgYSwgY29uc3QgSU5UIGIpIHsKKyAgSU5UIHJlc3VsdDsKKyAgX19hc21fXygic211bHdiICUwLCAlMSwgJTIiIDogIj1yIihyZXN1bHQpIDogInIiKGIpLCAiciIoYSkpOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyX1NEICovCisjZW5kaWYKKworI2RlZmluZSBGVU5DVElPTl9maXhtdWxfREQKKyNpZmRlZiBGVU5DVElPTl9maXhtdWxfREQKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfOF9fKQoraW5saW5lIElOVCBmaXhtdWxfREQoY29uc3QgSU5UIGEsIGNvbnN0IElOVCBiKSB7CisgIElOVDY0IHJlc3VsdDY0OworCisgIF9fYXNtX18oCisgICAgICAic211bGwgJXgwLCAldzEsICV3MjtcbiIKKyAgICAgICJhc3IgJXgwLCAleDAsICMzMTsgICAgICIKKyAgICAgIDogIj1yIihyZXN1bHQ2NCkKKyAgICAgIDogInIiKGEpLCAiciIoYikpOworICByZXR1cm4gKElOVClyZXN1bHQ2NDsKIH0KICNlbHNlCi1pbmxpbmUgSU5UIGZpeG11bGRpdjJfREQgKGNvbnN0IElOVCBhLCBjb25zdCBJTlQgYikKLXsKLSAgSU5UIGRpc2NhcmQsIHJlc3VsdCA7Ci0gIF9fYXNtX18gKCJzbXVsbCAlMCwgJTEsICUyLCAlMyIgOiAiPSZyIiAoZGlzY2FyZCksICI9ciIgKHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKLSAgcmV0dXJuIHJlc3VsdCA7CitpbmxpbmUgSU5UIGZpeG11bF9ERChjb25zdCBJTlQgYSwgY29uc3QgSU5UIGIpIHsKKyAgcmV0dXJuIChmaXhtdWxkaXYyX0REKGEsIGIpIDw8IDEpOwogfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82X18pCi0jZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfU0QKLWlubGluZSBJTlQgZml4bXVsZGl2Ml9TRCAoY29uc3QgU0hPUlQgYSwgY29uc3QgSU5UIGIpCi17Ci0gIElOVCByZXN1bHQgOwotICBfX2FzbV9fICgic211bHdiICUwLCAlMSwgJTIiCi0gICAgOiAiPXIiIChyZXN1bHQpCi0gICAgOiAiciIgKGIpLCAiciIgKGEpKSA7Ci0gIHJldHVybiByZXN1bHQgOwotfQotI2VuZGlmCisjZW5kaWYgLyogX19BUk1fQVJDSF84X18gKi8KKyNlbmRpZiAvKiAjaWZkZWYgRlVOQ1RJT05fZml4bXVsX0REICovCiAKICNlbmRpZiAvKiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pICovCiAKICNlbmRpZiAvKiBfX2FybV9fICovCiAKKyNlbmRpZiAvKiAhZGVmaW5lZChGSVhNVUxfQVJNX0gpICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9hcm0vc2NhbGUuaCBiL2xpYkZESy9pbmNsdWRlL2FybS9zY2FsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmI4MWRjLi4wMDAwMDAwCi0tLSBhL2xpYkZESy9pbmNsdWRlL2FybS9zY2FsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOgotICAgRGVzY3JpcHRpb246IEFSTSBzY2FsaW5nIG9wZXJhdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgLyogR0NDIENvbXBpbGVyICovCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KLQotI2lmIGRlZmluZWQoX19BUk1fQVJDSF82X18pCi0KLWlubGluZSBzdGF0aWMgSU5UIHNoaWZ0UmlnaHRTYXQoSU5UIHNyYywgaW50IHNjYWxlKQotewotICBJTlQgcmVzdWx0OwotICBhc20oCi0gICAgICAic3NhdCAlMCwlMiwlMDtcbiIKLQotICAgICAgOiAiPSZyIihyZXN1bHQpCi0gICAgICA6ICJyIihzcmM+PnNjYWxlKSwgIk0iKFNBTVBMRV9CSVRTKQotICAgICAgKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0gICNkZWZpbmUgU0FUVVJBVEVfSU5UX1BDTV9SSUdIVF9TSElGVChzcmMsIHNjYWxlKSBzaGlmdFJpZ2h0U2F0KHNyYywgc2NhbGUpCi0KLWlubGluZSBzdGF0aWMgSU5UIHNoaWZ0TGVmdFNhdChJTlQgc3JjLCBpbnQgc2NhbGUpCi17Ci0gIElOVCByZXN1bHQ7Ci0gIGFzbSgKLSAgICAgICJzc2F0ICUwLCUyLCUwO1xuIgotCi0gICAgICA6ICI9JnIiKHJlc3VsdCkKLSAgICAgIDogInIiKHNyYzw8c2NhbGUpLCAiTSIoU0FNUExFX0JJVFMpCi0gICAgICApOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLSAgI2RlZmluZSBTQVRVUkFURV9JTlRfUENNX0xFRlRfU0hJRlQoc3JjLCBzY2FsZSkgIHNoaWZ0TGVmdFNhdChzcmMsIHNjYWxlKQotCi0jZW5kaWYgLyogX19BUk1fQVJDSF82X18gKi8KLQotI2VuZGlmIC8qIGNvbXBpbGVyIHNlbGVjdGlvbiAqLwotCi0jZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVJblBsYWNlCi1pbmxpbmUKLXZvaWQgc2NhbGVWYWx1ZUluUGxhY2UoRklYUF9EQkwgKnZhbHVlLCAvKiE8IFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgIC8qITwgU2NhbGVmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKQotewotICBJTlQgbmV3c2NhbGU7Ci0gIGlmICgobmV3c2NhbGUgPSBzY2FsZWZhY3RvcikgPj0gMCkKLSAgICAqdmFsdWUgPDw9IG5ld3NjYWxlOwotICBlbHNlCi0gICAgKnZhbHVlID4+PSAtbmV3c2NhbGU7Ci19Ci0KLQotICAjZGVmaW5lIFNBVFVSQVRFX1JJR0hUX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKCAoKChMT05HKShzcmMpIF4gKChMT05HKShzcmMpID4+IChERlJBQ1RfQklUUy0xKSkpPj4oc2NhbGUpKSA+IChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpKSAgICAgXAotICAgICAgICAgID8gKChMT05HKShzcmMpID4+IChERlJBQ1RfQklUUy0xKSkgXiAoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIDogKChMT05HKShzcmMpID4+IChzY2FsZSkpCi0KLSAgI2RlZmluZSBTQVRVUkFURV9MRUZUX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICggKChMT05HKShzcmMpIF4gKChMT05HKShzcmMpID4+IChERlJBQ1RfQklUUy0xKSkpID4gKChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpID4+IChzY2FsZSkpICkgIFwKLSAgICAgICAgICA/ICgoTE9ORykoc3JjKSA+PiAoREZSQUNUX0JJVFMtMSkpIF4gKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICA6ICgoTE9ORykoc3JjKSA8PCAoc2NhbGUpKQotCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9hcm0vc2NhbGVfYXJtLmggYi9saWJGREsvaW5jbHVkZS9hcm0vc2NhbGVfYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmNGY2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYkZESy9pbmNsdWRlL2FybS9zY2FsZV9hcm0uaApAQCAtMCwwICsxLDE2MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBBUk0gc2NhbGluZyBvcGVyYXRpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChTQ0FMRV9BUk1fSCkKKyNkZWZpbmUgU0NBTEVfQVJNX0gKKworI2lmIGRlZmluZWQoX19HTlVDX18pIC8qIEdDQyBDb21waWxlciAqLworCisjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykKKworaW5saW5lIHN0YXRpYyBJTlQgc2hpZnRSaWdodFNhdChJTlQgc3JjLCBpbnQgc2NhbGUpIHsKKyAgSU5UIHJlc3VsdDsKKyAgYXNtKCJzc2F0ICUwLCUyLCUwO1xuIgorCisgICAgICA6ICI9JnIiKHJlc3VsdCkKKyAgICAgIDogInIiKHNyYyA+PiBzY2FsZSksICJNIihTQU1QTEVfQklUUykpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgU0FUVVJBVEVfSU5UX1BDTV9SSUdIVF9TSElGVChzcmMsIHNjYWxlKSBzaGlmdFJpZ2h0U2F0KHNyYywgc2NhbGUpCisKK2lubGluZSBzdGF0aWMgSU5UIHNoaWZ0TGVmdFNhdChJTlQgc3JjLCBpbnQgc2NhbGUpIHsKKyAgSU5UIHJlc3VsdDsKKyAgYXNtKCJzc2F0ICUwLCUyLCUwO1xuIgorCisgICAgICA6ICI9JnIiKHJlc3VsdCkKKyAgICAgIDogInIiKHNyYyA8PCBzY2FsZSksICJNIihTQU1QTEVfQklUUykpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgU0FUVVJBVEVfSU5UX1BDTV9MRUZUX1NISUZUKHNyYywgc2NhbGUpIHNoaWZ0TGVmdFNhdChzcmMsIHNjYWxlKQorCisjZW5kaWYgLyogX19BUk1fQVJDSF82X18gKi8KKworI2VuZGlmIC8qIGNvbXBpbGVyIHNlbGVjdGlvbiAqLworCisjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVJblBsYWNlCisjaWZkZWYgRlVOQ1RJT05fc2NhbGVWYWx1ZUluUGxhY2UKK2lubGluZSB2b2lkIHNjYWxlVmFsdWVJblBsYWNlKEZJWFBfREJMICp2YWx1ZSwgLyohPCBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yICAvKiE8IFNjYWxlZmFjdG9yICovCispIHsKKyAgSU5UIG5ld3NjYWxlOworICBpZiAoKG5ld3NjYWxlID0gc2NhbGVmYWN0b3IpID49IDApCisgICAgKnZhbHVlIDw8PSBuZXdzY2FsZTsKKyAgZWxzZQorICAgICp2YWx1ZSA+Pj0gLW5ld3NjYWxlOworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlSW5QbGFjZSAqLworCisjZGVmaW5lIFNBVFVSQVRFX1JJR0hUX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoTE9ORykoc3JjKSBeICgoTE9ORykoc3JjKSA+PiAoREZSQUNUX0JJVFMgLSAxKSkpID4+IChzY2FsZSkpID4gICAgICAgICAgIFwKKyAgIChMT05HKSgoKDFVKSA8PCAoKGRCaXRzKS0xKSkgLSAxKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA/ICgoTE9ORykoc3JjKSA+PiAoREZSQUNUX0JJVFMgLSAxKSkgXiAoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkgXAorICAgICAgOiAoKExPTkcpKHNyYykgPj4gKHNjYWxlKSkKKworI2RlZmluZSBTQVRVUkFURV9MRUZUX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoTE9ORykoc3JjKSBeICgoTE9ORykoc3JjKSA+PiAoREZSQUNUX0JJVFMgLSAxKSkpID4gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpID4+IChzY2FsZSkpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgPyAoKExPTkcpKHNyYykgPj4gKERGUkFDVF9CSVRTIC0gMSkpIF4gKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpIFwKKyAgICAgIDogKChMT05HKShzcmMpIDw8IChzY2FsZSkpCisKKyNlbmRpZiAvKiAhZGVmaW5lZChTQ0FMRV9BUk1fSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2FybS9zY3JhbWJsZS5oIGIvbGliRkRLL2luY2x1ZGUvYXJtL3NjcmFtYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZDAzMzguLjAwMDAwMDAKLS0tIGEvbGliRkRLL2luY2x1ZGUvYXJtL3NjcmFtYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6Ci0gICBEZXNjcmlwdGlvbjogYml0cmV2ZXJzYWwgb2YgaW5wdXQgZGF0YQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBkZWZpbmVkKEZVTkNUSU9OX3NjcmFtYmxlKQotI2lmIGRlZmluZWQoX19HTlVDX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KLQotI2RlZmluZSBGVU5DVElPTl9zY3JhbWJsZQotCi0jaWYgZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKQotI2RlZmluZSBVU0VfTERSRF9TVFJEICAgLyogTERSRCByZXF1aXJlcyA4IGJ5dGUgZGF0YSBhbGlnbm1lbnQuICovCi0jZW5kaWYKLQotaW5saW5lIHZvaWQgc2NyYW1ibGUoRklYUF9EQkwgeCBbXSwgSU5UIG4pIHsKLSAgRkRLX0FTU0VSVCghKCgoSU5UKXgpJihBTElHTk1FTlRfREVGQVVMVC0xKSkpOwotICBhc20oIm1vdiAgICAgcjIsICMxO1xuIiAgICAgICAgICAgICAgIC8qIHIyKG0pID0gMTsgICAgICAgICAgICovCi0gICAgICAic3ViICAgICByMywgJTEsICMxO1xuIiAgICAgICAgICAgLyogcjMgPSBuLTE7ICAgICAgICAgICAgKi8KLSAgICAgICJtb3YgICAgIHI0LCAjMDtcbiIgICAgICAgICAgICAgICAvKiByNChqKSA9IDA7ICAgICAgICAgICAqLwotCi0ic2NyYW1ibGVfbV9sb29wJT06XG4iICAgICAgICAgICAgICAgICAgLyogeyAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICJtb3YgICAgIHI1LCAlMTtcbiIgICAgICAgICAgICAgICAvKiAgcjUoaykgPSAxOyAgICAgICAgICAqLwotCi0ic2NyYW1ibGVfa19sb29wJT06XG4iICAgICAgICAgICAgICAgICAgLyogIHsgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICJtb3YgICAgIHI1LCByNSwgbHNyICMxO1xuIiAgICAgICAvKiAgIGsgPj49IDE7ICAgICAgICAgICAqLwotICAgICAgImVvciAgICAgcjQsIHI0LCByNTtcbiIgICAgICAgICAgIC8qICAgaiBePWs7ICAgICAgICAgICAgICovCi0gICAgICAiYW5kcyAgICByMTAsIHI0LCByNTtcbiIgICAgICAgICAgIC8qICAgcjEwID0gcjQgJiByNTsgICAgICAqLwotICAgICAgImJlcSAgICAgc2NyYW1ibGVfa19sb29wJT07XG4iICAgICAgLyogIH0gd2hpbGUgKHIxMCA9PSAwKTsgICovCi0KLSAgICAgICJjbXAgICAgIHI0LCByMjtcbiIgICAgICAgICAgICAgICAvKiAgIGlmIChyNCA8IHIyKSBicmVhazsgICAgICAgICovCi0gICAgICAiYmNjICAgICBzY3JhbWJsZV9tX2xvb3BfZW5kJT07XG4iCi0KLSNpZmRlZiBVU0VfTERSRF9TVFJECi0gICAgICAibW92ICAgICByNSwgcjIsIGxzbCAjMztcbiIgICAgICAgLyogbShyNSkgPSByMio0KjIgICAgICAgICAgICAgICAqLwotICAgICAgImxkcmQgICAgcjEwLCBbJTAsIHI1XTtcbiIgICAgICAgICAvKiByMTAgPSB4W3I1XSwgeDcgPSB4W3I1KzFdICAgICAqLwotICAgICAgIm1vdiAgICAgcjYsIHI0LCBsc2wgIzM7XG4iICAgICAgLyogaihyNikgPSByNCo0KjIgICAgICAgICAgICAgICovCi0gICAgICAibGRyZCAgICByOCwgWyUwLCByNl07XG4iICAgICAgICAvKiByOCA9IHhbcjZdLCByOSA9IHhbcjYrMV07ICAqLwotICAgICAgInN0cmQgICAgcjEwLCBbJTAsIHI2XTtcbiIgICAgICAgIC8qIHhbcjYscjYrMV0gPSByMTAscjExOyAgICAgICAgKi8KLSAgICAgICJzdHJkICAgIHI4LCBbJTAsIHI1XTtcbiIgICAgICAgICAvKiB4W3I1LHI1KzFdID0gcjgscjk7ICAgICAgICAgICovCi0jZWxzZQotICAgICAgIm1vdiAgICAgIHI1LCByMiwgbHNsICMzO1xuIiAgICAgICAvKiBtKHI1KSA9IHIyKjQqMiAgICAgICAgICAgICAgICovCi0gICAgICAibGRyCXIxMCwgWyUwLCByNV07XG4iCi0gICAgICAibW92ICAgICAgcjYsIHI0LCBsc2wgIzM7XG4iICAgICAgLyogaihyNikgPSByNCo0KjIgICAgICAgICAgICAgICovCi0gICAgICAibGRyCXIxMSwgWyUwLCByNl07XG4iCi0KLSAgICAgICJzdHIJcjEwLCBbJTAsIHI2XTtcbiIKLSAgICAgICJzdHIgICAgICByMTEsIFslMCwgcjVdO1xuIgotCi0gICAgICAiYWRkCXI1LCByNSwgIzQ7IgotICAgICAgImxkcglyMTAsIFslMCwgcjVdO1xuIgotICAgICAgImFkZAlyNiwgcjYsICM0OyIKLSAgICAgICJsZHIgICAgICByMTEsIFslMCwgcjZdO1xuIgotICAgICAgInN0ciAgICAgIHIxMCwgWyUwLCByNl07XG4iCi0gICAgICAic3RyICAgICAgcjExLCBbJTAsIHI1XTtcbiIKLSNlbmRpZgotInNjcmFtYmxlX21fbG9vcF9lbmQlPTpcbiIKLSAgICAgICJhZGQgICAgIHIyLCByMiwgIzE7XG4iICAgICAgICAgICAvKiByMisrOyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAiY21wICAgICByMiwgcjM7XG4iCi0gICAgICAiYmNjICAgICBzY3JhbWJsZV9tX2xvb3AlPTtcbiIgICAgICAvKiB9IHdoaWxlIChyMihtKSA8IHIzKG4tMSkpOyAgICovCi0gICAgICAgOgotICAgICAgIDogInIiKHgpLCAiciIobikKLSNpZmRlZiBVU0VfTERSRF9TVFJECi0gICAgICAgOiAicjIiLCJyMyIsICJyNCIsInI1IiwgInIxMCIsInIxMSIsICJyOCIsInI5IiwgInI2IiApOwotI2Vsc2UKLSAgICAgICA6ICJyMiIsInIzIiwgInI0IiwicjUiLCAicjEwIiwicjExIiwgInI2IiApOwotI2VuZGlmCi19Ci0jZWxzZQotLyogRm9yY2UgQyBpbXBsZW1lbnRhdGlvbiBpZiBubyBhc3NlbWJsZXIgdmVyc2lvbiBhdmFpbGFibGUuICovCi0jdW5kZWYgRlVOQ1RJT05fc2NyYW1ibGUKLSNlbmRpZgkvKiBUb29sY2hhaW4gc2VsZWN0aW9uLiAqLwotCi0jZW5kaWYJLyogZGVmaW5lZChGVU5DVElPTl9zY3JhbWJsZSkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2FybS9zY3JhbWJsZV9hcm0uaCBiL2xpYkZESy9pbmNsdWRlL2FybS9zY3JhbWJsZV9hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NmZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUvYXJtL3NjcmFtYmxlX2FybS5oCkBAIC0wLDAgKzEsMTc0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IGJpdHJldmVyc2FsIG9mIGlucHV0IGRhdGEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKFNDUkFNQkxFX0FSTV9IKQorI2RlZmluZSBTQ1JBTUJMRV9BUk1fSAorCisjaWYgZGVmaW5lZChGVU5DVElPTl9zY3JhbWJsZSkKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorCisjZGVmaW5lIEZVTkNUSU9OX3NjcmFtYmxlCisKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pCisjZGVmaW5lIFVTRV9MRFJEX1NUUkQgLyogTERSRCByZXF1aXJlcyA4IGJ5dGUgZGF0YSBhbGlnbm1lbnQuICovCisjZW5kaWYKKworaW5saW5lIHZvaWQgc2NyYW1ibGUoRklYUF9EQkwgeFtdLCBJTlQgbikgeworICBGREtfQVNTRVJUKCEoKChJTlQpeCkgJiAoQUxJR05NRU5UX0RFRkFVTFQgLSAxKSkpOworICBhc20oIm1vdiAgICAgcjIsICMxO1xuIiAgICAgLyogcjIobSkgPSAxOyAgICAgICAgICAgKi8KKyAgICAgICJzdWIgICAgIHIzLCAlMSwgIzE7XG4iIC8qIHIzID0gbi0xOyAgICAgICAgICAgICovCisgICAgICAibW92ICAgICByNCwgIzA7XG4iICAgICAvKiByNChqKSA9IDA7ICAgICAgICAgICAqLworCisgICAgICAic2NyYW1ibGVfbV9sb29wJT06XG4iIC8qIHsgICAgICAgICAgICAgICAgICAgICovCisgICAgICAibW92ICAgICByNSwgJTE7XG4iICAgIC8qICByNShrKSA9IDE7ICAgICAgICAgICovCisKKyAgICAgICJzY3JhbWJsZV9rX2xvb3AlPTpcbiIgICAgICAgICAvKiAgeyAgICAgICAgICAgICAgICAgICAqLworICAgICAgIm1vdiAgICAgcjUsIHI1LCBsc3IgIzE7XG4iICAgIC8qICAgayA+Pj0gMTsgICAgICAgICAgICovCisgICAgICAiZW9yICAgICByNCwgcjQsIHI1O1xuIiAgICAgICAgLyogICBqIF49azsgICAgICAgICAgICAgKi8KKyAgICAgICJhbmRzICAgIHIxMCwgcjQsIHI1O1xuIiAgICAgICAvKiAgIHIxMCA9IHI0ICYgcjU7ICAgICAgKi8KKyAgICAgICJiZXEgICAgIHNjcmFtYmxlX2tfbG9vcCU9O1xuIiAvKiAgfSB3aGlsZSAocjEwID09IDApOyAgKi8KKworICAgICAgImNtcCAgICAgcjQsIHIyO1xuIiAvKiAgIGlmIChyNCA8IHIyKSBicmVhazsgICAgICAgICovCisgICAgICAiYmNjICAgICBzY3JhbWJsZV9tX2xvb3BfZW5kJT07XG4iCisKKyNpZmRlZiBVU0VfTERSRF9TVFJECisgICAgICAibW92ICAgICByNSwgcjIsIGxzbCAjMztcbiIgLyogbShyNSkgPSByMio0KjIgICAgICAgICAgICAgICAqLworICAgICAgImxkcmQgICAgcjEwLCBbJTAsIHI1XTtcbiIgIC8qIHIxMCA9IHhbcjVdLCB4NyA9IHhbcjUrMV0gICAgICovCisgICAgICAibW92ICAgICByNiwgcjQsIGxzbCAjMztcbiIgLyogaihyNikgPSByNCo0KjIgICAgICAgICAgICAgICovCisgICAgICAibGRyZCAgICByOCwgWyUwLCByNl07XG4iICAgLyogcjggPSB4W3I2XSwgcjkgPSB4W3I2KzFdOyAgKi8KKyAgICAgICJzdHJkICAgIHIxMCwgWyUwLCByNl07XG4iICAvKiB4W3I2LHI2KzFdID0gcjEwLHIxMTsgICAgICAgICovCisgICAgICAic3RyZCAgICByOCwgWyUwLCByNV07XG4iICAgLyogeFtyNSxyNSsxXSA9IHI4LHI5OyAgICAgICAgICAqLworI2Vsc2UKKyAgICAgICJtb3YgICAgICByNSwgcjIsIGxzbCAjMztcbiIgLyogbShyNSkgPSByMio0KjIgICAgICAgICAgICAgICAqLworICAgICAgImxkciAgICAgIHIxMCwgWyUwLCByNV07XG4iCisgICAgICAibW92ICAgICAgcjYsIHI0LCBsc2wgIzM7XG4iIC8qIGoocjYpID0gcjQqNCoyICAgICAgICAgICAgICAqLworICAgICAgImxkciAgICAgIHIxMSwgWyUwLCByNl07XG4iCisKKyAgICAgICJzdHIgICAgICByMTAsIFslMCwgcjZdO1xuIgorICAgICAgInN0ciAgICAgIHIxMSwgWyUwLCByNV07XG4iCisKKyAgICAgICJhZGQgICAgICByNSwgcjUsICM0OyIKKyAgICAgICJsZHIgICAgICByMTAsIFslMCwgcjVdO1xuIgorICAgICAgImFkZCAgICAgIHI2LCByNiwgIzQ7IgorICAgICAgImxkciAgICAgIHIxMSwgWyUwLCByNl07XG4iCisgICAgICAic3RyICAgICAgcjEwLCBbJTAsIHI2XTtcbiIKKyAgICAgICJzdHIgICAgICByMTEsIFslMCwgcjVdO1xuIgorI2VuZGlmCisgICAgICAic2NyYW1ibGVfbV9sb29wX2VuZCU9OlxuIgorICAgICAgImFkZCAgICAgcjIsIHIyLCAjMTtcbiIgLyogcjIrKzsgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgImNtcCAgICAgcjIsIHIzO1xuIgorICAgICAgImJjYyAgICAgc2NyYW1ibGVfbV9sb29wJT07XG4iIC8qIH0gd2hpbGUgKHIyKG0pIDwgcjMobi0xKSk7ICAgKi8KKyAgICAgIDoKKyAgICAgIDogInIiKHgpLCAiciIobikKKyNpZmRlZiBVU0VfTERSRF9TVFJECisgICAgICA6ICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyMTAiLCAicjExIiwgInI4IiwgInI5IiwgInI2Iik7CisjZWxzZQorICAgICAgOiAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjEwIiwgInIxMSIsICJyNiIpOworI2VuZGlmCit9CisjZWxzZQorLyogRm9yY2UgQyBpbXBsZW1lbnRhdGlvbiBpZiBubyBhc3NlbWJsZXIgdmVyc2lvbiBhdmFpbGFibGUuICovCisjdW5kZWYgRlVOQ1RJT05fc2NyYW1ibGUKKyNlbmRpZiAvKiBUb29sY2hhaW4gc2VsZWN0aW9uLiAqLworCisjZW5kaWYgLyogZGVmaW5lZChGVU5DVElPTl9zY3JhbWJsZSkgKi8KKyNlbmRpZiAvKiAhZGVmaW5lZChTQ1JBTUJMRV9BUk1fSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2F1dG9jb3JyMm5kLmggYi9saWJGREsvaW5jbHVkZS9hdXRvY29ycjJuZC5oCmluZGV4IGMyZTk1OTUuLmUwMTk4OWIgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL2F1dG9jb3JyMm5kLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvYXV0b2NvcnIybmQuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw1MCArOTAsNDggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCisKICAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBhYnMgZGVmaW5pdGlvbnMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfQVVUT0NPUlJfMk5EX0gKLSNkZWZpbmUgX0FVVE9DT1JSXzJORF9ICi0KLQorI2lmbmRlZiBBVVRPQ09SUjJORF9ICisjZGVmaW5lIEFVVE9DT1JSMk5EX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewotICBGSVhQX0RCTCAgcjAwcjsKLSAgRklYUF9EQkwgIHIxMXI7Ci0gIEZJWFBfREJMICByMjJyOwotICBGSVhQX0RCTCAgcjAxcjsKLSAgRklYUF9EQkwgIHIwMnI7Ci0gIEZJWFBfREJMICByMTJyOwotICBGSVhQX0RCTCAgcjAxaTsKLSAgRklYUF9EQkwgIHIwMmk7Ci0gIEZJWFBfREJMICByMTJpOwotICBGSVhQX0RCTCAgZGV0OworICBGSVhQX0RCTCByMDByOworICBGSVhQX0RCTCByMTFyOworICBGSVhQX0RCTCByMjJyOworICBGSVhQX0RCTCByMDFyOworICBGSVhQX0RCTCByMDJyOworICBGSVhQX0RCTCByMTJyOworICBGSVhQX0RCTCByMDFpOworICBGSVhQX0RCTCByMDJpOworICBGSVhQX0RCTCByMTJpOworICBGSVhQX0RCTCBkZXQ7CiAgIGludCBkZXRfc2NhbGU7CiB9IEFDT1JSX0NPRUZTOwogCiAjZGVmaW5lIExQQ19PUkRFUiAyCiAKK0lOVCBhdXRvQ29ycjJuZF9yZWFsKAorICAgIEFDT1JSX0NPRUZTICphYywgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGF1dG9jb3JyZWxhdGlvbiBjb2VmZnMgKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqcmVCdWZmZXIsIC8qITwgUG9pbnRlciB0byB0byByZWFsIHBhcnQgb2Ygc3BlY3RydW0gKi8KKyAgICBjb25zdCBpbnQgbGVuICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHFtZiBzbG90cyAqLworKTsKIAotSU5UCi1hdXRvQ29ycjJuZF9yZWFsIChBQ09SUl9DT0VGUyAqYWMsICAgICAgICAgIC8qITwgUG9pbnRlciB0byBhdXRvY29ycmVsYXRpb24gY29lZmZzICovCi0gICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqcmVCdWZmZXIsIC8qITwgUG9pbnRlciB0byB0byByZWFsIHBhcnQgb2Ygc3BlY3RydW0gKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsZW4gICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgcW1mIHNsb3RzICovCi0gICAgICAgICAgICAgICAgICk7Ci1JTlQKLWF1dG9Db3JyMm5kX2NwbHggKEFDT1JSX0NPRUZTICphYywgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBhdXRvY29ycmVsYXRpb24gY29lZmZzICovCi0gICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqcmVCdWZmZXIsICAvKiE8IFBvaW50ZXIgdG8gdG8gcmVhbCBwYXJ0IG9mIHNwZWN0cnVtICovCi0gICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqaW1CdWZmZXIsICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBwYXJ0IG9mIHNwZWN0cnVtICovCi0gICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGVuICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBxbWYgc2xvdHMgKi8KLSAgICAgICAgICAgICAgICAgKTsKK0lOVCBhdXRvQ29ycjJuZF9jcGx4KAorICAgIEFDT1JSX0NPRUZTICphYywgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGF1dG9jb3JyZWxhdGlvbiBjb2VmZnMgKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqcmVCdWZmZXIsIC8qITwgUG9pbnRlciB0byB0byByZWFsIHBhcnQgb2Ygc3BlY3RydW0gKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqaW1CdWZmZXIsIC8qITwgUG9pbnRlciB0byBpbWFnIHBhcnQgb2Ygc3BlY3RydW0gKi8KKyAgICBjb25zdCBpbnQgbGVuICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHFtZiBzbG90cyAqLworKTsKIAotCi0jZW5kaWYgLyogX0FVVE9DT1JSXzJORF9IICovCisjZW5kaWYgLyogQVVUT0NPUlIyTkRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvY2x6LmggYi9saWJGREsvaW5jbHVkZS9jbHouaAppbmRleCBmYzYxMmUxLi42YWNkZWU2IDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9jbHouaAorKysgYi9saWJGREsvaW5jbHVkZS9jbHouaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNyArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNYXJjIEdheWVyCisKICAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAhZGVmaW5lZChfX0NMWl9IX18pCi0jZGVmaW5lIF9fQ0xaX0hfXworI2lmICFkZWZpbmVkKENMWl9IKQorI2RlZmluZSBDTFpfSAogCiAjaW5jbHVkZSAiRkRLX2FyY2hkZWYuaCIKICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKQEAgLTk3LDE1ICsxMDksMTQgQEAKICNpZiBkZWZpbmVkKF9fYXJtX18pCiAjaW5jbHVkZSAiYXJtL2Nsel9hcm0uaCIKIAotI2VsaWYgZGVmaW5lZChfX21pcHNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2VsaWYgZGVmaW5lZChfX21pcHNfXykKICNpbmNsdWRlICJtaXBzL2Nsel9taXBzLmgiCiAKLSNlbGlmIGRlZmluZWQoX194ODZfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2VsaWYgZGVmaW5lZChfX3g4Nl9fKQogI2luY2x1ZGUgIng4Ni9jbHpfeDg2LmgiCiAKICNlbmRpZiAvKiBhbGwgY29yZXMgKi8KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBTb2Z0d2FyZSBmYWxsYmFja3MgZm9yIG1pc3NpbmcgZnVuY3Rpb25zLgpAQCAtMTE0LDc5ICsxMjUsNzggQEAKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG5vcm16X1MpCiAjaWZkZWYgRlVOQ1RJT05fZml4bm9ybXpfRAotaW5saW5lIElOVCBmaXhub3Jtel9TIChTSE9SVCBhKQotewotICByZXR1cm4gZml4bm9ybXpfRCgoSU5UKShhKSk7CitpbmxpbmUgSU5UIGZpeG5vcm16X1MoU0hPUlQgYSkgeworICBpZiAoYSA8IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gZml4bm9ybXpfRCgoSU5UKShhKSkgLSAxNjsKIH0KICNlbHNlCi1pbmxpbmUgSU5UIGZpeG5vcm16X1MgKFNIT1JUIGEpCi17Ci0gICAgaW50IGxlYWRpbmdCaXRzID0gMDsKLSAgICBhID0gfmE7Ci0gICAgd2hpbGUoYSAmIDB4ODAwMCkgewotICAgICAgbGVhZGluZ0JpdHMrKzsKLSAgICAgIGEgPDw9IDE7Ci0gICAgfQoraW5saW5lIElOVCBmaXhub3Jtel9TKFNIT1JUIGEpIHsKKyAgaW50IGxlYWRpbmdCaXRzID0gMDsKKyAgYSA9IH5hOworICB3aGlsZSAoYSAmIDB4ODAwMCkgeworICAgIGxlYWRpbmdCaXRzKys7CisgICAgYSA8PD0gMTsKKyAgfQogCi0gICAgcmV0dXJuIChsZWFkaW5nQml0cyk7CisgIHJldHVybiAobGVhZGluZ0JpdHMpOwogfQogI2VuZGlmCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG5vcm16X0QpCi1pbmxpbmUgSU5UIGZpeG5vcm16X0QgKExPTkcgYSkKLXsKLSAgICBJTlQgbGVhZGluZ0JpdHMgPSAwOwotICAgIGEgPSB+YTsKLSAgICB3aGlsZShhICYgMHg4MDAwMDAwMCkgewotICAgICAgbGVhZGluZ0JpdHMrKzsKLSAgICAgIGEgPDw9IDE7Ci0gICAgfQoraW5saW5lIElOVCBmaXhub3Jtel9EKExPTkcgYSkgeworICBJTlQgbGVhZGluZ0JpdHMgPSAwOworICBhID0gfmE7CisgIHdoaWxlIChhICYgMHg4MDAwMDAwMCkgeworICAgIGxlYWRpbmdCaXRzKys7CisgICAgYSA8PD0gMTsKKyAgfQogCi0gICAgcmV0dXJuIChsZWFkaW5nQml0cyk7CisgIHJldHVybiAobGVhZGluZ0JpdHMpOwogfQogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IGZpeG5vcm1fRAotICAgIGRlc2NyaXB0aW9uOiAgQ291bnQgbGVhZGluZyBvbmVzIG9yIHplcm9zIG9mIG9wZXJhbmQgdmFsIGZvciBkZnJhY3QvTE9ORyBJTlQgdmFsdWVzLgotICAgICAgICAgICAgICAgICAgUmV0dXJuIHRoaXMgdmFsdWUgbWludXMgMS4gUmV0dXJuIDAgaWYgb3BlcmFuZD09MC4KKyAgICBkZXNjcmlwdGlvbjogIENvdW50IGxlYWRpbmcgb25lcyBvciB6ZXJvcyBvZiBvcGVyYW5kIHZhbCBmb3IgZGZyYWN0L0xPTkcgSU5UCit2YWx1ZXMuIFJldHVybiB0aGlzIHZhbHVlIG1pbnVzIDEuIFJldHVybiAwIGlmIG9wZXJhbmQ9PTAuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhub3JtX1MpCiAjaWZkZWYgRlVOQ1RJT05fZml4bm9ybV9ECi1pbmxpbmUgSU5UIGZpeG5vcm1fUyhGSVhQX1NHTCB2YWwpCi17Ci0gIHJldHVybiBmaXhub3JtX0QoKElOVCkodmFsKSk7CitpbmxpbmUgSU5UIGZpeG5vcm1fUyhGSVhQX1NHTCB2YWwpIHsKKyAgaWYgKHZhbCA9PSAoRklYUF9TR0wpMCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBmaXhub3JtX0QoKElOVCkodmFsKSkgLSAxNjsKIH0KICNlbHNlCi1pbmxpbmUgSU5UIGZpeG5vcm1fUyhGSVhQX1NHTCB2YWwpCi17Ci0gICAgSU5UIGxlYWRpbmdCaXRzID0gMDsKLSAgICBpZiAoIHZhbCAhPSAoRklYUF9TR0wpMCApIHsKLSAgICAgICAgaWYgKCB2YWwgPCAoRklYUF9TR0wpMCApIHsKLSAgICAgICAgICAgIHZhbCA9IH52YWw7Ci0gICAgICAgIH0KLSAgICAgICAgbGVhZGluZ0JpdHMgPSBmaXhub3Jtel9TKHZhbCkgLSAxOworaW5saW5lIElOVCBmaXhub3JtX1MoRklYUF9TR0wgdmFsKSB7CisgIElOVCBsZWFkaW5nQml0cyA9IDA7CisgIGlmICh2YWwgIT0gKEZJWFBfU0dMKTApIHsKKyAgICBpZiAodmFsIDwgKEZJWFBfU0dMKTApIHsKKyAgICAgIHZhbCA9IH52YWw7CiAgICAgfQotICAgIHJldHVybiAobGVhZGluZ0JpdHMpOworICAgIGxlYWRpbmdCaXRzID0gZml4bm9ybXpfUyh2YWwpIC0gMTsKKyAgfQorICByZXR1cm4gKGxlYWRpbmdCaXRzKTsKIH0KICNlbmRpZgogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhub3JtX0QpCi1pbmxpbmUgSU5UIGZpeG5vcm1fRChGSVhQX0RCTCB2YWwpCi17Ci0gICAgSU5UIGxlYWRpbmdCaXRzID0gMDsKLSAgICBpZiAoIHZhbCAhPSAoRklYUF9EQkwpMCApIHsKLSAgICAgICAgaWYgKCB2YWwgPCAoRklYUF9EQkwpMCApIHsKLSAgICAgICAgICAgIHZhbCA9IH52YWw7Ci0gICAgICAgIH0KLSAgICAgICAgbGVhZGluZ0JpdHMgPSBmaXhub3Jtel9EKHZhbCkgLSAxOworaW5saW5lIElOVCBmaXhub3JtX0QoRklYUF9EQkwgdmFsKSB7CisgIElOVCBsZWFkaW5nQml0cyA9IDA7CisgIGlmICh2YWwgIT0gKEZJWFBfREJMKTApIHsKKyAgICBpZiAodmFsIDwgKEZJWFBfREJMKTApIHsKKyAgICAgIHZhbCA9IH52YWw7CiAgICAgfQotICAgIHJldHVybiAobGVhZGluZ0JpdHMpOworICAgIGxlYWRpbmdCaXRzID0gZml4bm9ybXpfRCh2YWwpIC0gMTsKKyAgfQorICByZXR1cm4gKGxlYWRpbmdCaXRzKTsKIH0KICNlbmRpZgogCi0jZW5kaWYgLyogX19DTFpfSF9fICovCisjZW5kaWYgLyogQ0xaX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2NvbW1vbl9maXguaCBiL2xpYkZESy9pbmNsdWRlL2NvbW1vbl9maXguaAppbmRleCBkMmQxMWY0Li44ZDBkZmRlIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9jb21tb25fZml4LmgKKysrIGIvbGliRkRLL2luY2x1ZGUvY29tbW9uX2ZpeC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDc0ICs5MCw4NSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKKwogICAgRGVzY3JpcHRpb246IEZsZXhpYmxlIGZpeHBvaW50IGxpYnJhcnkgY29uZmlndXJhdGlvbgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9DT01NT05fRklYX0gKLSNkZWZpbmUgX0NPTU1PTl9GSVhfSAorI2lmbmRlZiBDT01NT05fRklYX0gKKyNkZWZpbmUgQ09NTU9OX0ZJWF9ICiAKICNpbmNsdWRlICJGREtfYXJjaGRlZi5oIgogI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgogCiAvKiAqKioqKiBTdGFydCBvZiBmb3JtZXIgZml4LmggKioqKioqICovCiAKLS8qIENvbmZpZ3VyZSBmcmFjdGlvbmFsIG9yIGludGVnZXIgYXJpdGhtZXRpYyAqLwotICAjZGVmaW5lIEZJWF9GUkFDVCAwIC8qIERlZmluZSB0aGlzIHRvICIxIiB0byB1c2UgZnJhY3Rpb25hbCBhcml0aG1ldGljIHNpbXVsYXRpb24gaW4gY2xhc3MgZnJhY3QgaW5zdGVhZCBvZiBpbnRlZ2VyIGFyaXRobWV0aWMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAvKiAxIGZvciBkZWJ1ZyB3aXRoIGV4dHJhIHJ1bnRpbWUgb3ZlcmZsb3cgY2hlY2tpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQogLyogRGVmaW5lIGJpdCBzaXplcyBvZiBpbnRlZ2VyIGZpeHBvaW50IGZyYWN0aW9uYWwgZGF0YSB0eXBlcyAqLwotI2RlZmluZSBGUkFDVF9CSVRTICAgICAgMTYgLyogc2luZ2xlIHByZWNpc2lvbiAqLwotI2RlZmluZSBERlJBQ1RfQklUUyAgICAgMzIgLyogZG91YmxlIHByZWNpc2lvbiAqLwotI2RlZmluZSBBQ0NVX0JJVFMgICAgICAgNDAgLyogZG91YmxlIHByZWNpc2lvbiBwbHVzIG92ZXJmbG93ICovCisjZGVmaW5lIEZSQUNUX0JJVFMgMTYgIC8qIHNpbmdsZSBwcmVjaXNpb24gKi8KKyNkZWZpbmUgREZSQUNUX0JJVFMgMzIgLyogZG91YmxlIHByZWNpc2lvbiAqLworI2RlZmluZSBBQ0NVX0JJVFMgNDAgICAvKiBkb3VibGUgcHJlY2lzaW9uIHBsdXMgb3ZlcmZsb3cgKi8KIAogLyogRml4cG9pbnQgZXF1aXZhbGVudCB0eXBlIGZvdCBQQ00gYXVkaW8gdGltZSBkb21haW4gZGF0YS4gKi8KICNpZiBkZWZpbmVkKFNBTVBMRV9CSVRTKQogI2lmIChTQU1QTEVfQklUUyA9PSBERlJBQ1RfQklUUykKLSAgI2RlZmluZSBGSVhQX1BDTSAgICAgIEZJWFBfREJMCi0gICNkZWZpbmUgRlhfUENNMkZYX0RCTCh4KSAoKEZJWFBfREJMKSh4KSkKLSAgI2RlZmluZSBGWF9EQkwyRlhfUENNKHgpICgoSU5UX1BDTSkoeCkpCisjZGVmaW5lIEZJWFBfUENNIEZJWFBfREJMCisjZGVmaW5lIE1BWFZBTF9GSVhQX1BDTSBNQVhWQUxfREJMCisjZGVmaW5lIE1JTlZBTF9GSVhQX1BDTSBNSU5WQUxfREJMCisjZGVmaW5lIEZYX1BDTTJGWF9EQkwoeCkgKChGSVhQX0RCTCkoeCkpCisjZGVmaW5lIEZYX0RCTDJGWF9QQ00oeCkgKChJTlRfUENNKSh4KSkKICNlbGlmIChTQU1QTEVfQklUUyA9PSBGUkFDVF9CSVRTKQotICAjZGVmaW5lIEZJWFBfUENNICAgICAgRklYUF9TR0wKLSAgI2RlZmluZSBGWF9QQ00yRlhfREJMKHgpIEZYX1NHTDJGWF9EQkwoKEZJWFBfU0dMKSh4KSkKLSAgI2RlZmluZSBGWF9EQkwyRlhfUENNKHgpIEZYX0RCTDJGWF9TR0woeCkKKyNkZWZpbmUgRklYUF9QQ00gRklYUF9TR0wKKyNkZWZpbmUgTUFYVkFMX0ZJWFBfUENNIE1BWFZBTF9TR0wKKyNkZWZpbmUgTUlOVkFMX0ZJWFBfUENNIE1JTlZBTF9TR0wKKyNkZWZpbmUgRlhfUENNMkZYX0RCTCh4KSBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoeCkpCisjZGVmaW5lIEZYX0RCTDJGWF9QQ00oeCkgRlhfREJMMkZYX1NHTCh4KQogI2Vsc2UKLSAgI2Vycm9yIFNBTVBMRV9CSVRTIGRpZmZlcmVudCBmcm9tIEZSQUNUX0JJVFMgb3IgREZSQUNUX0JJVFMgbm90IGltcGxlbWVudGVkIQorI2Vycm9yIFNBTVBMRV9CSVRTIGRpZmZlcmVudCBmcm9tIEZSQUNUX0JJVFMgb3IgREZSQUNUX0JJVFMgbm90IGltcGxlbWVudGVkIQogI2VuZGlmCiAjZW5kaWYKIAogLyogKioqKioqIEVuZCBvZiBmb3JtZXIgZml4LmggKioqKioqICovCiAKLSNkZWZpbmUgU0dMX01BU0sgICAgICAgICAgICAoKDFVTDw8RlJBQ1RfQklUUyktMSkgICAvKiAxNmJpdDogKDJeMTYpLTEgPSAweEZGRkYgKi8KKyNkZWZpbmUgU0dMX01BU0sgKCgxVUwgPDwgRlJBQ1RfQklUUykgLSAxKSAvKiAxNmJpdDogKDJeMTYpLTEgPSAweEZGRkYgKi8KIAotI2RlZmluZSBNQVhfU0hJRlRfU0dMIChGUkFDVF9CSVRTLTEpICAgLyogbWF4aW11bSBwb3NzaWJsZSBzaGlmdCBmb3IgRklYUF9TR0wgdmFsdWVzICovCi0jZGVmaW5lIE1BWF9TSElGVF9EQkwgKERGUkFDVF9CSVRTLTEpICAvKiBtYXhpbXVtIHBvc3NpYmxlIHNoaWZ0IGZvciBGSVhQX0RCTCB2YWx1ZXMgKi8KKyNkZWZpbmUgTUFYX1NISUZUX1NHTCBcCisgIChGUkFDVF9CSVRTIC0gMSkgLyogbWF4aW11bSBwb3NzaWJsZSBzaGlmdCBmb3IgRklYUF9TR0wgdmFsdWVzICovCisjZGVmaW5lIE1BWF9TSElGVF9EQkwgXAorICAoREZSQUNUX0JJVFMgLSAxKSAvKiBtYXhpbXVtIHBvc3NpYmxlIHNoaWZ0IGZvciBGSVhQX0RCTCB2YWx1ZXMgKi8KIAotLyogU2NhbGUgZmFjdG9yIGZyb20vdG8gZmxvYXQvZml4cG9pbnQgdmFsdWVzLiBETyBOT1QgVVNFIFRIRVNFIFZBTFVFUyBBUyBTQVRVUkFUSU9OIExJTUlUUyAhISAqLwotI2RlZmluZSBGUkFDVF9GSVhfU0NBTEUgICAgICgoSU5UNjQoMSk8PChGUkFDVF9CSVRTLTEpKSkKLSNkZWZpbmUgREZSQUNUX0ZJWF9TQ0FMRSAgICAoKElOVDY0KDEpPDwoREZSQUNUX0JJVFMtMSkpKQorLyogU2NhbGUgZmFjdG9yIGZyb20vdG8gZmxvYXQvZml4cG9pbnQgdmFsdWVzLiBETyBOT1QgVVNFIFRIRVNFIFZBTFVFUyBBUworICogU0FUVVJBVElPTiBMSU1JVFMgISEgKi8KKyNkZWZpbmUgRlJBQ1RfRklYX1NDQUxFICgoSU5UNjQoMSkgPDwgKEZSQUNUX0JJVFMgLSAxKSkpCisjZGVmaW5lIERGUkFDVF9GSVhfU0NBTEUgKChJTlQ2NCgxKSA8PCAoREZSQUNUX0JJVFMgLSAxKSkpCiAKLS8qIE1heCBhbmQgTWluIHZhbHVlcyBmb3Igc2F0dXJhdGlvbiBwdXJwb3Nlcy4gRE8gTk9UIFVTRSBUSEVTRSBWQUxVRVMgQVMgU0NBTEUgVkFMVUVTICEhICovCi0jZGVmaW5lICBNQVhWQUxfU0dMICAgICAoKHNpZ25lZCkweDAwMDA3RkZGKSAgICAvKiB0aGlzIGhhcyB0byBiZSBzeW5jaHJvbml6ZWQgdG8gRlJBQ1RfQklUUyAqLwotI2RlZmluZSAgTUlOVkFMX1NHTCAgICAgKChzaWduZWQpMHhGRkZGODAwMCkgICAgLyogdGhpcyBoYXMgdG8gYmUgc3luY2hyb25pemVkIHRvIEZSQUNUX0JJVFMgKi8KLSNkZWZpbmUgIE1BWFZBTF9EQkwgICAgICgoc2lnbmVkKTB4N0ZGRkZGRkYpICAgIC8qIHRoaXMgaGFzIHRvIGJlIHN5bmNocm9uaXplZCB0byBERlJBQ1RfQklUUyAqLwotI2RlZmluZSAgTUlOVkFMX0RCTCAgICAgKChzaWduZWQpMHg4MDAwMDAwMCkgICAgLyogdGhpcyBoYXMgdG8gYmUgc3luY2hyb25pemVkIHRvIERGUkFDVF9CSVRTICovCisvKiBNYXggYW5kIE1pbiB2YWx1ZXMgZm9yIHNhdHVyYXRpb24gcHVycG9zZXMuIERPIE5PVCBVU0UgVEhFU0UgVkFMVUVTIEFTIFNDQUxFCisgKiBWQUxVRVMgISEgKi8KKyNkZWZpbmUgTUFYVkFMX1NHTCBcCisgICgoc2lnbmVkKTB4MDAwMDdGRkYpIC8qIHRoaXMgaGFzIHRvIGJlIHN5bmNocm9uaXplZCB0byBGUkFDVF9CSVRTICovCisjZGVmaW5lIE1JTlZBTF9TR0wgXAorICAoKHNpZ25lZCkweEZGRkY4MDAwKSAvKiB0aGlzIGhhcyB0byBiZSBzeW5jaHJvbml6ZWQgdG8gRlJBQ1RfQklUUyAqLworI2RlZmluZSBNQVhWQUxfREJMIFwKKyAgKChzaWduZWQpMHg3RkZGRkZGRikgLyogdGhpcyBoYXMgdG8gYmUgc3luY2hyb25pemVkIHRvIERGUkFDVF9CSVRTICovCisjZGVmaW5lIE1JTlZBTF9EQkwgXAorICAoKHNpZ25lZCkweDgwMDAwMDAwKSAvKiB0aGlzIGhhcyB0byBiZSBzeW5jaHJvbml6ZWQgdG8gREZSQUNUX0JJVFMgKi8KIAorI2RlZmluZSBGWF9EQkwyRlhDT05TVF9TR0wodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoKCh2YWwpID4+IChERlJBQ1RfQklUUyAtIEZSQUNUX0JJVFMgLSAxKSkgKyAxKSA+ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChMT05HKTEgPDwgRlJBQ1RfQklUUykgLSAxKSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoTE9ORykodmFsKSA+IDApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKEZJWFBfU0dMKShTSE9SVCkoKChMT05HKTEgPDwgKEZSQUNUX0JJVFMgLSAxKSkgLSAxKSAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKEZJWFBfU0dMKShTSE9SVCkoKCgodmFsKSA+PiAoREZSQUNUX0JJVFMgLSBGUkFDVF9CSVRTIC0gMSkpICsgMSkgPj4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpCiAKLSNkZWZpbmUgRlhfREJMMkZYQ09OU1RfU0dMKHZhbCkgKCAoICgoKCh2YWwpID4+IChERlJBQ1RfQklUUy1GUkFDVF9CSVRTLTEpKSArIDEpID4gKCgoTE9ORykxPDxGUkFDVF9CSVRTKS0xKSkgJiYgKChMT05HKSh2YWwpID4gMCkgKSA/IFwKLSAgIChGSVhQX1NHTCkoU0hPUlQpKCgoTE9ORykxPDwoRlJBQ1RfQklUUy0xKSktMSk6KEZJWFBfU0dMKShTSE9SVCkoKCgodmFsKSA+PiAoREZSQUNUX0JJVFMtRlJBQ1RfQklUUy0xKSkgKyAxKSA+PiAxKSApCisjZGVmaW5lIHNob3VsZEJlVW5pb24gdW5pb24gLyogdW5pb25zIGFyZSBwb3NzaWJsZSAqLwogCi0KLQotI2RlZmluZSBzaG91bGRCZVVuaW9uIHVuaW9uICAgICAvKiB1bmlvbnMgYXJlIHBvc3NpYmxlICovCi0KLSAgICB0eXBlZGVmIFNIT1JUICAgICAgIEZJWFBfU0dMOwotICAgIHR5cGVkZWYgTE9ORyAgICAgICAgRklYUF9EQkw7Cit0eXBlZGVmIFNIT1JUIEZJWFBfU0dMOwordHlwZWRlZiBMT05HIEZJWFBfREJMOwogCiAvKiBtYWNyb3MgZm9yIGNvbXBpbGUtdGltZSBjb252ZXJzaW9uIG9mIGNvbnN0YW50IGZsb2F0IHZhbHVlcyB0byBmaXhlZHBvaW50ICovCiAjZGVmaW5lIEZMMkZYQ09OU1RfU1BDIEZMMkZYQ09OU1RfREJMCkBAIC0xNTQsMTk5ICsxNzYsMjUxIEBACiAjZGVmaW5lIE1JTlZBTF9EQkxfQ09OU1QgTUlOVkFMX0RCTAogI2RlZmluZSBNSU5WQUxfU0dMX0NPTlNUIE1JTlZBTF9TR0wKIAotI2RlZmluZSBGTDJGWENPTlNUX1NHTCh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0oRklYUF9TR0wpKCAoICh2YWwpID49IDApID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0oKCggKGRvdWJsZSkodmFsKSAqIChGUkFDVF9GSVhfU0NBTEUpICsgMC41ICkgPj0gKGRvdWJsZSkoTUFYVkFMX1NHTCkgKSA/IChTSE9SVCkoTUFYVkFMX1NHTCkgOiAoU0hPUlQpKCAoZG91YmxlKSh2YWwpICogKGRvdWJsZSkoRlJBQ1RfRklYX1NDQUxFKSArIDAuNSkpIDogICBcCi0oKCggKGRvdWJsZSkodmFsKSAqIChGUkFDVF9GSVhfU0NBTEUpIC0gMC41KSA8PSAgKGRvdWJsZSkoTUlOVkFMX1NHTF9DT05TVCkgKSA/IChTSE9SVCkoTUlOVkFMX1NHTF9DT05TVCkgOiAoU0hPUlQpKCAoZG91YmxlKSh2YWwpICogKGRvdWJsZSkoRlJBQ1RfRklYX1NDQUxFKSAtIDAuNSkpICkKKyNkZWZpbmUgRkwyRlhDT05TVF9TR0wodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoRklYUF9TR0wpKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKHZhbCkgPj0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA/ICgoKChkb3VibGUpKHZhbCkgKiAoRlJBQ1RfRklYX1NDQUxFKSArIDAuNSkgPj0gICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoZG91YmxlKShNQVhWQUxfU0dMKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgID8gKFNIT1JUKShNQVhWQUxfU0dMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgOiAoU0hPUlQpKChkb3VibGUpKHZhbCkgKiAoZG91YmxlKShGUkFDVF9GSVhfU0NBTEUpICsgMC41KSkgXAorICAgICAgICAgIDogKCgoKGRvdWJsZSkodmFsKSAqIChGUkFDVF9GSVhfU0NBTEUpLTAuNSkgPD0gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChkb3VibGUpKE1JTlZBTF9TR0xfQ09OU1QpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgPyAoU0hPUlQpKE1JTlZBTF9TR0xfQ09OU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA6IChTSE9SVCkoKGRvdWJsZSkodmFsKSAqIChkb3VibGUpKEZSQUNUX0ZJWF9TQ0FMRSktMC41KSkpCiAKLSNkZWZpbmUgRkwyRlhDT05TVF9EQkwodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotKEZJWFBfREJMKSggKCAodmFsKSA+PSAwKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotKCgoIChkb3VibGUpKHZhbCkgKiAoREZSQUNUX0ZJWF9TQ0FMRSkgKyAwLjUgKSA+PSAoZG91YmxlKShNQVhWQUxfREJMKSApID8gKExPTkcpKE1BWFZBTF9EQkwpIDogKExPTkcpKCAoZG91YmxlKSh2YWwpICogKGRvdWJsZSkoREZSQUNUX0ZJWF9TQ0FMRSkgKyAwLjUpKSA6IFwKLSgoKCAoZG91YmxlKSh2YWwpICogKERGUkFDVF9GSVhfU0NBTEUpIC0gMC41KSA8PSAgKGRvdWJsZSkoTUlOVkFMX0RCTF9DT05TVCkgKSA/IChMT05HKShNSU5WQUxfREJMX0NPTlNUKSA6IChMT05HKSggKGRvdWJsZSkodmFsKSAqIChkb3VibGUpKERGUkFDVF9GSVhfU0NBTEUpIC0gMC41KSkgKQorI2RlZmluZSBGTDJGWENPTlNUX0RCTCh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChGSVhQX0RCTCkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgodmFsKSA+PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgID8gKCgoKGRvdWJsZSkodmFsKSAqIChERlJBQ1RfRklYX1NDQUxFKSArIDAuNSkgPj0gICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChkb3VibGUpKE1BWFZBTF9EQkwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgPyAoTE9ORykoTUFYVkFMX0RCTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA6IChMT05HKSgoZG91YmxlKSh2YWwpICogKGRvdWJsZSkoREZSQUNUX0ZJWF9TQ0FMRSkgKyAwLjUpKSBcCisgICAgICAgICAgOiAoKCgoZG91YmxlKSh2YWwpICogKERGUkFDVF9GSVhfU0NBTEUpLTAuNSkgPD0gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKGRvdWJsZSkoTUlOVkFMX0RCTF9DT05TVCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA/IChMT05HKShNSU5WQUxfREJMX0NPTlNUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIDogKExPTkcpKChkb3VibGUpKHZhbCkgKiAoZG91YmxlKShERlJBQ1RfRklYX1NDQUxFKS0wLjUpKSkKIAotLyogbWFjcm9zIGZvciBydW50aW1lIGNvbnZlcnNpb24gb2YgZmxvYXQgdmFsdWVzIHRvIGludGVnZXIgZml4ZWRwb2ludC4gTk8gT1ZFUkZMT1cgQ0hFQ0shISEgKi8KKy8qIG1hY3JvcyBmb3IgcnVudGltZSBjb252ZXJzaW9uIG9mIGZsb2F0IHZhbHVlcyB0byBpbnRlZ2VyIGZpeGVkcG9pbnQuIE5PCisgKiBPVkVSRkxPVyBDSEVDSyEhISAqLwogI2RlZmluZSBGTDJGWF9TUEMgRkwyRlhfREJMCi0jZGVmaW5lIEZMMkZYX1NHTCh2YWwpICggKHZhbCk+MC4wZiA/IChTSE9SVCkoICh2YWwpKihmbG9hdCkoRlJBQ1RfRklYX1NDQUxFKSswLjVmICkgOiAoU0hPUlQpKCAodmFsKSooZmxvYXQpKEZSQUNUX0ZJWF9TQ0FMRSktMC41ZiApICkKLSNkZWZpbmUgRkwyRlhfREJMKHZhbCkgKCAodmFsKT4wLjBmID8gKExPTkcpKCAodmFsKSooZmxvYXQpKERGUkFDVF9GSVhfU0NBTEUpKzAuNWYgKSA6IChMT05HKSggKHZhbCkqKGZsb2F0KShERlJBQ1RfRklYX1NDQUxFKS0wLjVmICkgKQorI2RlZmluZSBGTDJGWF9TR0wodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh2YWwpID4gMC4wZiA/IChTSE9SVCkoKHZhbCkgKiAoZmxvYXQpKEZSQUNUX0ZJWF9TQ0FMRSkgKyAwLjVmKSBcCisgICAgICAgICAgICAgICAgOiAoU0hPUlQpKCh2YWwpICogKGZsb2F0KShGUkFDVF9GSVhfU0NBTEUpLTAuNWYpKQorI2RlZmluZSBGTDJGWF9EQkwodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh2YWwpID4gMC4wZiA/IChMT05HKSgodmFsKSAqIChmbG9hdCkoREZSQUNUX0ZJWF9TQ0FMRSkgKyAwLjVmKSBcCisgICAgICAgICAgICAgICAgOiAoTE9ORykoKHZhbCkgKiAoZmxvYXQpKERGUkFDVF9GSVhfU0NBTEUpLTAuNWYpKQogCi0vKiBtYWNyb3MgZm9yIHJ1bnRpbWUgY29udmVyc2lvbiBvZiBmaXhlZHBvaW50IHZhbHVlcyB0byBvdGhlciBmaXhlZHBvaW50LiBOTyBST1VORElORyEhISAqLwotI2RlZmluZSBGWF9BQ0MyRlhfU0dMKHZhbCkgKChGSVhQX1NHTCkoKHZhbCk+PihBQ0NVX0JJVFMtRlJBQ1RfQklUUykpKQotI2RlZmluZSBGWF9BQ0MyRlhfREJMKHZhbCkgKChGSVhQX0RCTCkoKHZhbCk+PihBQ0NVX0JJVFMtREZSQUNUX0JJVFMpKSkKLSNkZWZpbmUgRlhfU0dMMkZYX0FDQyh2YWwpICgoRklYUF9BQ0MpKChMT05HKSh2YWwpPDwoQUNDVV9CSVRTLUZSQUNUX0JJVFMpKSkKLSNkZWZpbmUgRlhfU0dMMkZYX0RCTCh2YWwpICgoRklYUF9EQkwpKChMT05HKSh2YWwpPDwoREZSQUNUX0JJVFMtRlJBQ1RfQklUUykpKQotI2RlZmluZSBGWF9EQkwyRlhfU0dMKHZhbCkgKChGSVhQX1NHTCkoKHZhbCk+PihERlJBQ1RfQklUUy1GUkFDVF9CSVRTKSkpCisvKiBtYWNyb3MgZm9yIHJ1bnRpbWUgY29udmVyc2lvbiBvZiBmaXhlZHBvaW50IHZhbHVlcyB0byBvdGhlciBmaXhlZHBvaW50LiBOTworICogUk9VTkRJTkchISEgKi8KKyNkZWZpbmUgRlhfQUNDMkZYX1NHTCh2YWwpICgoRklYUF9TR0wpKCh2YWwpID4+IChBQ0NVX0JJVFMgLSBGUkFDVF9CSVRTKSkpCisjZGVmaW5lIEZYX0FDQzJGWF9EQkwodmFsKSAoKEZJWFBfREJMKSgodmFsKSA+PiAoQUNDVV9CSVRTIC0gREZSQUNUX0JJVFMpKSkKKyNkZWZpbmUgRlhfU0dMMkZYX0FDQyh2YWwpICgoRklYUF9BQ0MpKChMT05HKSh2YWwpIDw8IChBQ0NVX0JJVFMgLSBGUkFDVF9CSVRTKSkpCisjZGVmaW5lIEZYX1NHTDJGWF9EQkwodmFsKSBcCisgICgoRklYUF9EQkwpKChMT05HKSh2YWwpIDw8IChERlJBQ1RfQklUUyAtIEZSQUNUX0JJVFMpKSkKKyNkZWZpbmUgRlhfREJMMkZYX1NHTCh2YWwpICgoRklYUF9TR0wpKCh2YWwpID4+IChERlJBQ1RfQklUUyAtIEZSQUNUX0JJVFMpKSkKIAogLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwogCiAvKiBtYWNyb3MgZm9yIHJ1bnRpbWUgY29udmVyc2lvbiBvZiBpbnRlZ2VyIGZpeGVkcG9pbnQgdmFsdWVzIHRvIGZsb2F0LiAqLwotLyogVGhpcyBpcyBqdXN0IGZvciB0ZW1wb3JhcnkgdXNlIGFuZCBzaG91bGQgbm90IGJlIHJlcXVpcmVkIGluIGEgZmluYWwgdmVyc2lvbiEgKi8KIAotLyogI2RlZmluZSBGWF9EQkwyRkwodmFsKSAgKChmbG9hdCkocG93KDIuLC0zMS4pKihmbG9hdCl2YWwpKSAqLyAgLyogdmVyc2lvbiAjMSAqLwotI2RlZmluZSBGWF9EQkwyRkwodmFsKSAgKChmbG9hdCkoKGRvdWJsZSkodmFsKS8oZG91YmxlKURGUkFDVF9GSVhfU0NBTEUpKSAgIC8qIHZlcnNpb24gIzIgLSBpZGVudGljYWwgdG8gY2xhc3MgZGZyYWN0IGNhc3QgZnJvbSBkZnJhY3QgdG8gZmxvYXQgKi8KKy8qICNkZWZpbmUgRlhfREJMMkZMKHZhbCkgICgoZmxvYXQpKHBvdygyLiwtMzEuKSooZmxvYXQpdmFsKSkgKi8gLyogdmVyc2lvbiAjMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlhfREJMMkZMKHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoZmxvYXQpKChkb3VibGUpKHZhbCkgLyAoZG91YmxlKURGUkFDVF9GSVhfU0NBTEUpKSAvKiB2ZXJzaW9uICMyIC0gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpY2FsIHRvIGNsYXNzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmcmFjdCBjYXN0IGZyb20gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZnJhY3QgdG8gZmxvYXQgKi8KKyNkZWZpbmUgRlhfREJMMkRPVUJMRSh2YWwpICgoKGRvdWJsZSkodmFsKSAvIChkb3VibGUpREZSQUNUX0ZJWF9TQ0FMRSkpCiAKIC8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KICNpbmNsdWRlICJmaXhtdWwuaCIKIAotRkRLX0lOTElORSBMT05HIGZNdWx0KFNIT1JUIGEsIFNIT1JUIGIpICAgICAgICAgeyByZXR1cm4gZml4bXVsX1NTKGEsIGIpOyB9Ci1GREtfSU5MSU5FIExPTkcgZk11bHQoU0hPUlQgYSwgTE9ORyBiKSAgICAgICAgICB7IHJldHVybiBmaXhtdWxfU0QoYSwgYik7IH0KLUZES19JTkxJTkUgTE9ORyBmTXVsdChMT05HIGEsIFNIT1JUIGIpICAgICAgICAgIHsgcmV0dXJuIGZpeG11bF9EUyhhLCBiKTsgfQotRkRLX0lOTElORSBMT05HIGZNdWx0KExPTkcgYSwgTE9ORyBiKSAgICAgICAgICAgeyByZXR1cm4gZml4bXVsX0REKGEsIGIpOyB9Ci1GREtfSU5MSU5FIExPTkcgZlBvdzIoTE9ORyBhKSAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhwb3cyX0QoYSk7ICAgIH0KLUZES19JTkxJTkUgTE9ORyBmUG93MihTSE9SVCBhKSAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeHBvdzJfUyhhKTsgICAgfQorRkRLX0lOTElORSBMT05HIGZNdWx0KFNIT1JUIGEsIFNIT1JUIGIpIHsgcmV0dXJuIGZpeG11bF9TUyhhLCBiKTsgfQorRkRLX0lOTElORSBMT05HIGZNdWx0KFNIT1JUIGEsIExPTkcgYikgeyByZXR1cm4gZml4bXVsX1NEKGEsIGIpOyB9CitGREtfSU5MSU5FIExPTkcgZk11bHQoTE9ORyBhLCBTSE9SVCBiKSB7IHJldHVybiBmaXhtdWxfRFMoYSwgYik7IH0KK0ZES19JTkxJTkUgTE9ORyBmTXVsdChMT05HIGEsIExPTkcgYikgeyByZXR1cm4gZml4bXVsX0REKGEsIGIpOyB9CitGREtfSU5MSU5FIExPTkcgZlBvdzIoTE9ORyBhKSB7IHJldHVybiBmaXhwb3cyX0QoYSk7IH0KK0ZES19JTkxJTkUgTE9ORyBmUG93MihTSE9SVCBhKSB7IHJldHVybiBmaXhwb3cyX1MoYSk7IH0KIAotRkRLX0lOTElORSBJTlQgIGZNdWx0SShMT05HIGEsIFNIT1JUIGIpICAgICAgICAgeyByZXR1cm4gKCAoSU5UKSgoKDE8PChGUkFDVF9CSVRTLTIpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4bXVsZGl2Ml9ERChhLCgoSU5UKWI8PEZSQUNUX0JJVFMpKSk+PihGUkFDVF9CSVRTLTEpKSApOyB9CitGREtfSU5MSU5FIExPTkcgZk11bHREaXYyKFNIT1JUIGEsIFNIT1JUIGIpIHsgcmV0dXJuIGZpeG11bGRpdjJfU1MoYSwgYik7IH0KK0ZES19JTkxJTkUgTE9ORyBmTXVsdERpdjIoU0hPUlQgYSwgTE9ORyBiKSB7IHJldHVybiBmaXhtdWxkaXYyX1NEKGEsIGIpOyB9CitGREtfSU5MSU5FIExPTkcgZk11bHREaXYyKExPTkcgYSwgU0hPUlQgYikgeyByZXR1cm4gZml4bXVsZGl2Ml9EUyhhLCBiKTsgfQorRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MihMT05HIGEsIExPTkcgYikgeyByZXR1cm4gZml4bXVsZGl2Ml9ERChhLCBiKTsgfQorRkRLX0lOTElORSBMT05HIGZQb3cyRGl2MihMT05HIGEpIHsgcmV0dXJuIGZpeHBvdzJkaXYyX0QoYSk7IH0KK0ZES19JTkxJTkUgTE9ORyBmUG93MkRpdjIoU0hPUlQgYSkgeyByZXR1cm4gZml4cG93MmRpdjJfUyhhKTsgfQogCi1GREtfSU5MSU5FIElOVCAgZk11bHRJZmxvb3IoTE9ORyBhLCBJTlQgYikgICAgICB7IHJldHVybiAoIChJTlQpKCgxICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhtdWxkaXYyX0REKGEsKGI8PEZSQUNUX0JJVFMpKSkgPj4gKEZSQUNUX0JJVFMtMSkpICk7IH0KK0ZES19JTkxJTkUgTE9ORyBmTXVsdERpdjJCaXRFeGFjdChMT05HIGEsIExPTkcgYikgeworICByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X0REKGEsIGIpOworfQorRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MkJpdEV4YWN0KFNIT1JUIGEsIExPTkcgYikgeworICByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X1NEKGEsIGIpOworfQorRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MkJpdEV4YWN0KExPTkcgYSwgU0hPUlQgYikgeworICByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X0RTKGEsIGIpOworfQorRkRLX0lOTElORSBMT05HIGZNdWx0Qml0RXhhY3QoTE9ORyBhLCBMT05HIGIpIHsKKyAgcmV0dXJuIGZpeG11bEJpdEV4YWN0X0REKGEsIGIpOworfQorRkRLX0lOTElORSBMT05HIGZNdWx0Qml0RXhhY3QoU0hPUlQgYSwgTE9ORyBiKSB7CisgIHJldHVybiBmaXhtdWxCaXRFeGFjdF9TRChhLCBiKTsKK30KK0ZES19JTkxJTkUgTE9ORyBmTXVsdEJpdEV4YWN0KExPTkcgYSwgU0hPUlQgYikgeworICByZXR1cm4gZml4bXVsQml0RXhhY3RfRFMoYSwgYik7Cit9CiAKLUZES19JTkxJTkUgSU5UICBmTXVsdEljZWlsKExPTkcgYSwgSU5UIGIpICAgICAgIHsgcmV0dXJuICggKElOVCkoKChJTlQpMHg3ZmZmICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhtdWxkaXYyX0REKGEsKGI8PEZSQUNUX0JJVFMpKSkgPj4gKEZSQUNUX0JJVFMtMSkpICk7IH0KLQotRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MihTSE9SVCBhLCBTSE9SVCBiKSAgICAgeyByZXR1cm4gZml4bXVsZGl2Ml9TUyhhLCBiKTsgfQotRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MihTSE9SVCBhLCBMT05HIGIpICAgICAgeyByZXR1cm4gZml4bXVsZGl2Ml9TRChhLCBiKTsgfQotRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MihMT05HIGEsIFNIT1JUIGIpICAgICAgeyByZXR1cm4gZml4bXVsZGl2Ml9EUyhhLCBiKTsgfQotRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MihMT05HIGEsIExPTkcgYikgICAgICAgeyByZXR1cm4gZml4bXVsZGl2Ml9ERChhLCBiKTsgfQotRkRLX0lOTElORSBMT05HIGZQb3cyRGl2MihMT05HIGEpICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cG93MmRpdjJfRChhKTsgICAgfQotRkRLX0lOTElORSBMT05HIGZQb3cyRGl2MihTSE9SVCBhKSAgICAgICAgICAgICAgeyByZXR1cm4gZml4cG93MmRpdjJfUyhhKTsgICAgfQotCi1GREtfSU5MSU5FIExPTkcgZk11bHREaXYyQml0RXhhY3QoTE9ORyBhLCBMT05HIGIpICAgeyByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X0REKGEsIGIpOyB9Ci1GREtfSU5MSU5FIExPTkcgZk11bHREaXYyQml0RXhhY3QoU0hPUlQgYSwgTE9ORyAgYikgeyByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X1NEKGEsIGIpOyB9Ci1GREtfSU5MSU5FIExPTkcgZk11bHREaXYyQml0RXhhY3QoTE9ORyAgYSwgU0hPUlQgYikgeyByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X0RTKGEsIGIpOyB9Ci1GREtfSU5MSU5FIExPTkcgZk11bHRCaXRFeGFjdChMT05HIGEsIExPTkcgYikgICAgICAgeyByZXR1cm4gZml4bXVsQml0RXhhY3RfREQoYSwgYik7IH0KLUZES19JTkxJTkUgTE9ORyBmTXVsdEJpdEV4YWN0KFNIT1JUIGEsIExPTkcgIGIpICAgICB7IHJldHVybiBmaXhtdWxCaXRFeGFjdF9TRChhLCBiKTsgfQotRkRLX0lOTElORSBMT05HIGZNdWx0Qml0RXhhY3QoTE9ORyAgYSwgU0hPUlQgYikgICAgIHsgcmV0dXJuIGZpeG11bEJpdEV4YWN0X0RTKGEsIGIpOyB9Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCiAjaW5jbHVkZSAiYWJzLmgiCiAKLUZES19JTkxJTkUgRklYUF9EQkwgZkFicyhGSVhQX0RCTCB4KQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeGFic19EKHgpOyB9Ci1GREtfSU5MSU5FIEZJWFBfU0dMIGZBYnMoRklYUF9TR0wgeCkKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhhYnNfUyh4KTsgfQorRkRLX0lOTElORSBGSVhQX0RCTCBmQWJzKEZJWFBfREJMIHgpIHsgcmV0dXJuIGZpeGFic19EKHgpOyB9CitGREtfSU5MSU5FIEZJWFBfU0dMIGZBYnMoRklYUF9TR0wgeCkgeyByZXR1cm4gZml4YWJzX1MoeCk7IH0KIAotLyogd29ya2Fyb3VuZCBmb3IgVEkgQzZ4IGNvbXBpbGVyIGJ1dCBub3QgZm9yIFRJIEFSTTlFIGNvbXBpbGVyICovCi0jaWYgKCFkZWZpbmVkKF9fVElfQ09NUElMRVJfVkVSU0lPTl9fKSB8fCBkZWZpbmVkKF9fVElfVE1TNDcwX1Y1X18pKSAmJiAhZGVmaW5lZChfX0xQNjRfXykKLUZES19JTkxJTkUgSU5UICBmQWJzKElOVCB4KQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeGFic19JKHgpOyB9CisjaWYgIWRlZmluZWQoX19MUDY0X18pCitGREtfSU5MSU5FIElOVCBmQWJzKElOVCB4KSB7IHJldHVybiBmaXhhYnNfSSh4KTsgfQogI2VuZGlmCiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqLwogCiAjaW5jbHVkZSAiY2x6LmgiCiAKLUZES19JTkxJTkUgSU5UIGZOb3JteihGSVhQX0RCTCB4KQotICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bm9ybXpfRCh4KTsgfQotRkRLX0lOTElORSBJTlQgZk5vcm16KEZJWFBfU0dMIHgpCi0gICAgICAgICAgICAgICB7IHJldHVybiBmaXhub3Jtel9TKHgpOyB9Ci1GREtfSU5MSU5FIElOVCBmTm9ybShGSVhQX0RCTCB4KQotICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bm9ybV9EKHgpOyB9Ci1GREtfSU5MSU5FIElOVCBmTm9ybShGSVhQX1NHTCB4KQotICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bm9ybV9TKHgpOyB9CitGREtfSU5MSU5FIElOVCBmTm9ybXooSU5UNjQgeCkgeworICBJTlQgY2x6ID0gZml4bm9ybXpfRCgoSU5UKSh4ID4+IDMyKSk7CisgIGlmIChjbHogPT0gMzIpIGNseiArPSBmaXhub3Jtel9EKChJTlQpeCk7CisgIHJldHVybiBjbHo7Cit9CitGREtfSU5MSU5FIElOVCBmTm9ybXooRklYUF9EQkwgeCkgeyByZXR1cm4gZml4bm9ybXpfRCh4KTsgfQorRkRLX0lOTElORSBJTlQgZk5vcm16KEZJWFBfU0dMIHgpIHsgcmV0dXJuIGZpeG5vcm16X1MoeCk7IH0KK0ZES19JTkxJTkUgSU5UIGZOb3JtKEZJWFBfREJMIHgpIHsgcmV0dXJuIGZpeG5vcm1fRCh4KTsgfQorRkRLX0lOTElORSBJTlQgZk5vcm0oRklYUF9TR0wgeCkgeyByZXR1cm4gZml4bm9ybV9TKHgpOyB9CiAKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKi8KKyAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICovCisgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqLwogCiAjaW5jbHVkZSAiY2x6LmgiCiAjZGVmaW5lIGZpeHBfYWJzKHgpIGZBYnMoeCkKLSNkZWZpbmUgZml4TWluKGEsYikgZk1pbihhLGIpCi0jZGVmaW5lIGZpeE1heChhLGIpIGZNYXgoYSxiKQotI2RlZmluZSBDbnRMZWFkaW5nWmVyb3MoeCkgIGZpeG5vcm16X0QoeCkKKyNkZWZpbmUgZml4TWluKGEsIGIpIGZNaW4oYSwgYikKKyNkZWZpbmUgZml4TWF4KGEsIGIpIGZNYXgoYSwgYikKKyNkZWZpbmUgQ250TGVhZGluZ1plcm9zKHgpIGZpeG5vcm16X0QoeCkKICNkZWZpbmUgQ291bnRMZWFkaW5nQml0cyh4KSBmaXhub3JtX0QoeCkKIAogI2luY2x1ZGUgImZpeG1hZGQuaCIKIAogLyogeSA9ICh4KzAuNSphKmIpICovCi1GREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyX0REKHgsIGEsIGIpOyB9Ci1GREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyX1NEKHgsIGEsIGIpOyB9Ci1GREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyX0RTKHgsIGEsIGIpOyB9Ci1GREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX1NHTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyX1NTKHgsIGEsIGIpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKSB7CisgIHJldHVybiBmaXhtYWRkZGl2Ml9ERCh4LCBhLCBiKTsKK30KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIGZpeG1hZGRkaXYyX1NEKHgsIGEsIGIpOworfQorRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdEFkZERpdjIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9TR0wgYikgeworICByZXR1cm4gZml4bWFkZGRpdjJfRFMoeCwgYSwgYik7Cit9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX1NHTCBiKSB7CisgIHJldHVybiBmaXhtYWRkZGl2Ml9TUyh4LCBhLCBiKTsKK30KIAotRkRLX0lOTElORSBGSVhQX0RCTCBmUG93MkFkZERpdjIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSkKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhwYWRkZGl2Ml9EKHgsIGEpOyB9Ci1GREtfSU5MSU5FIEZJWFBfREJMIGZQb3cyQWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeHBhZGRkaXYyX1MoeCwgYSk7IH0KLQorRkRLX0lOTElORSBGSVhQX0RCTCBmUG93MkFkZERpdjIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSkgeworICByZXR1cm4gZml4cGFkZGRpdjJfRCh4LCBhKTsKK30KK0ZES19JTkxJTkUgRklYUF9EQkwgZlBvdzJBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEpIHsKKyAgcmV0dXJuIGZpeHBhZGRkaXYyX1MoeCwgYSk7Cit9CiAKIC8qIHkgPSAyKih4KzAuNSphKmIpID0gKDJ4K2EqYikgKi8KLUZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGQoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYWRkX0REKHgsIGEsIGIpOyB9Ci1pbmxpbmUgRklYUF9EQkwgZk11bHRBZGQoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYWRkX1NEKHgsIGEsIGIpOyB9Ci1pbmxpbmUgRklYUF9EQkwgZk11bHRBZGQoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9TR0wgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYWRkX0RTKHgsIGEsIGIpOyB9Ci1pbmxpbmUgRklYUF9EQkwgZk11bHRBZGQoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9TR0wgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYWRkX1NTKHgsIGEsIGIpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIGZpeG1hZGRfREQoeCwgYSwgYik7Cit9CitpbmxpbmUgRklYUF9EQkwgZk11bHRBZGQoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bWFkZF9TRCh4LCBhLCBiKTsKK30KK2lubGluZSBGSVhQX0RCTCBmTXVsdEFkZChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKSB7CisgIHJldHVybiBmaXhtYWRkX0RTKHgsIGEsIGIpOworfQoraW5saW5lIEZJWFBfREJMIGZNdWx0QWRkKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpIHsKKyAgcmV0dXJuIGZpeG1hZGRfU1MoeCwgYSwgYik7Cit9CiAKLWlubGluZSBGSVhQX0RCTCBmUG93MkFkZChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeHBhZGRfRCh4LCBhKTsgfQotaW5saW5lIEZJWFBfREJMIGZQb3cyQWRkKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cGFkZF9TKHgsIGEpOyB9Ci0KK2lubGluZSBGSVhQX0RCTCBmUG93MkFkZChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhKSB7IHJldHVybiBmaXhwYWRkX0QoeCwgYSk7IH0KK2lubGluZSBGSVhQX0RCTCBmUG93MkFkZChGSVhQX0RCTCB4LCBGSVhQX1NHTCBhKSB7IHJldHVybiBmaXhwYWRkX1MoeCwgYSk7IH0KIAogLyogeSA9ICh4LTAuNSphKmIpICovCi1pbmxpbmUgRklYUF9EQkwgZk11bHRTdWJEaXYyKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1YmRpdjJfREQoeCwgYSwgYik7IH0KLWlubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViZGl2Ml9TRCh4LCBhLCBiKTsgfQotaW5saW5lIEZJWFBfREJMIGZNdWx0U3ViRGl2MihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyX0RTKHgsIGEsIGIpOyB9Ci1pbmxpbmUgRklYUF9EQkwgZk11bHRTdWJEaXYyKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1YmRpdjJfU1MoeCwgYSwgYik7IH0KK2lubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bXN1YmRpdjJfREQoeCwgYSwgYik7Cit9CitpbmxpbmUgRklYUF9EQkwgZk11bHRTdWJEaXYyKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIGZpeG1zdWJkaXYyX1NEKHgsIGEsIGIpOworfQoraW5saW5lIEZJWFBfREJMIGZNdWx0U3ViRGl2MihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKSB7CisgIHJldHVybiBmaXhtc3ViZGl2Ml9EUyh4LCBhLCBiKTsKK30KK2lubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9TR0wgYikgeworICByZXR1cm4gZml4bXN1YmRpdjJfU1MoeCwgYSwgYik7Cit9CiAKIC8qIHkgPSAyKih4LTAuNSphKmIpID0gKDIqeC1hKmIpICovCi1GREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0U3ViKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1Yl9ERCh4LCBhLCBiKTsgfQotaW5saW5lIEZJWFBfREJMIGZNdWx0U3ViKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfREJMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1Yl9TRCh4LCBhLCBiKTsgfQotaW5saW5lIEZJWFBfREJMIGZNdWx0U3ViKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfU0dMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1Yl9EUyh4LCBhLCBiKTsgfQotaW5saW5lIEZJWFBfREJMIGZNdWx0U3ViKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1Yl9TUyh4LCBhLCBiKTsgfQorRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdFN1YihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKSB7CisgIHJldHVybiBmaXhtc3ViX0REKHgsIGEsIGIpOworfQoraW5saW5lIEZJWFBfREJMIGZNdWx0U3ViKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIGZpeG1zdWJfU0QoeCwgYSwgYik7Cit9CitpbmxpbmUgRklYUF9EQkwgZk11bHRTdWIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9TR0wgYikgeworICByZXR1cm4gZml4bXN1Yl9EUyh4LCBhLCBiKTsKK30KK2lubGluZSBGSVhQX0RCTCBmTXVsdFN1YihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX1NHTCBiKSB7CisgIHJldHVybiBmaXhtc3ViX1NTKHgsIGEsIGIpOworfQogCi1GREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWFkZGRpdjJCaXRFeGFjdF9ERCh4LCBhLCBiKTsgfQotRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdEFkZERpdjJCaXRFeGFjdChGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyQml0RXhhY3RfU0QoeCwgYSwgYik7IH0KLUZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9TR0wgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYWRkZGl2MkJpdEV4YWN0X0RTKHgsIGEsIGIpOyB9Ci1GREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0U3ViRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1YmRpdjJCaXRFeGFjdF9ERCh4LCBhLCBiKTsgfQotRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdFN1YkRpdjJCaXRFeGFjdChGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyQml0RXhhY3RfU0QoeCwgYSwgYik7IH0KLUZES19JTkxJTkUgRklYUF9EQkwgZk11bHRTdWJEaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9TR0wgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViZGl2MkJpdEV4YWN0X0RTKHgsIGEsIGIpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIGZpeG1hZGRkaXYyQml0RXhhY3RfREQoeCwgYSwgYik7Cit9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIGZpeG1hZGRkaXYyQml0RXhhY3RfU0QoeCwgYSwgYik7Cit9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfU0dMIGIpIHsKKyAgcmV0dXJuIGZpeG1hZGRkaXYyQml0RXhhY3RfRFMoeCwgYSwgYik7Cit9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0U3ViRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIGZpeG1zdWJkaXYyQml0RXhhY3RfREQoeCwgYSwgYik7Cit9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0U3ViRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIGZpeG1zdWJkaXYyQml0RXhhY3RfU0QoeCwgYSwgYik7Cit9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0U3ViRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfU0dMIGIpIHsKKyAgcmV0dXJuIGZpeG1zdWJkaXYyQml0RXhhY3RfRFMoeCwgYSwgYik7Cit9CiAKICNpbmNsdWRlICJmaXhtaW5tYXguaCIKIAotRkRLX0lOTElORSBGSVhQX0RCTCBmTWluKEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWluX0QoYSxiKTsgfQotRkRLX0lOTElORSBGSVhQX0RCTCBmTWF4KEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWF4X0QoYSxiKTsgfQorRkRLX0lOTElORSBGSVhQX0RCTCBmTWluKEZJWFBfREJMIGEsIEZJWFBfREJMIGIpIHsgcmV0dXJuIGZpeG1pbl9EKGEsIGIpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNYXgoRklYUF9EQkwgYSwgRklYUF9EQkwgYikgeyByZXR1cm4gZml4bWF4X0QoYSwgYik7IH0KIAotRkRLX0lOTElORSBGSVhQX1NHTCBmTWluKEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWluX1MoYSxiKTsgfQotRkRLX0lOTElORSBGSVhQX1NHTCBmTWF4KEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWF4X1MoYSxiKTsgfQorRkRLX0lOTElORSBGSVhQX1NHTCBmTWluKEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpIHsgcmV0dXJuIGZpeG1pbl9TKGEsIGIpOyB9CitGREtfSU5MSU5FIEZJWFBfU0dMIGZNYXgoRklYUF9TR0wgYSwgRklYUF9TR0wgYikgeyByZXR1cm4gZml4bWF4X1MoYSwgYik7IH0KIAotLyogd29ya2Fyb3VuZCBmb3IgVEkgQzZ4IGNvbXBpbGVyIGJ1dCBub3QgZm9yIFRJIEFSTTlFICovCi0jaWYgKCghZGVmaW5lZChfX1RJX0NPTVBJTEVSX1ZFUlNJT05fXykgfHwgZGVmaW5lZChfX1RJX1RNUzQ3MF9WNV9fKSkgJiYgIWRlZmluZWQoX19MUDY0X18pKSB8fCAoRklYX0ZSQUNUID09IDEpCi1GREtfSU5MSU5FIElOVCBmTWF4KElOVCBhLCBJTlQgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYXhfSShhLGIpOyB9Ci1GREtfSU5MSU5FIElOVCBmTWluKElOVCBhLCBJTlQgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtaW5fSShhLGIpOyB9CisjaWYgIWRlZmluZWQoX19MUDY0X18pCitGREtfSU5MSU5FIElOVCBmTWF4KElOVCBhLCBJTlQgYikgeyByZXR1cm4gZml4bWF4X0koYSwgYik7IH0KK0ZES19JTkxJTkUgSU5UIGZNaW4oSU5UIGEsIElOVCBiKSB7IHJldHVybiBmaXhtaW5fSShhLCBiKTsgfQorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9feDg2XzY0X18pCitGREtfSU5MSU5FIFNIT1JUIGZNYXgoU0hPUlQgYSwgU0hPUlQgYikgeyByZXR1cm4gZml4bWF4X1MoYSwgYik7IH0KK0ZES19JTkxJTkUgU0hPUlQgZk1pbihTSE9SVCBhLCBTSE9SVCBiKSB7IHJldHVybiBmaXhtaW5fUyhhLCBiKTsgfQorI2VuZGlmCiAjZW5kaWYKIAotaW5saW5lIFVJTlQgZk1heChVSU5UIGEsIFVJTlQgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYXhfVUkoYSxiKTsgfQotaW5saW5lIFVJTlQgZk1pbihVSU5UIGEsIFVJTlQgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtaW5fVUkoYSxiKTsgfQoraW5saW5lIFVJTlQgZk1heChVSU5UIGEsIFVJTlQgYikgeyByZXR1cm4gZml4bWF4X1VJKGEsIGIpOyB9CitpbmxpbmUgVUlOVCBmTWluKFVJTlQgYSwgVUlOVCBiKSB7IHJldHVybiBmaXhtaW5fVUkoYSwgYik7IH0KKworaW5saW5lIFVDSEFSIGZNYXgoVUNIQVIgYSwgVUNIQVIgYikgeworICByZXR1cm4gKFVDSEFSKWZpeG1heF9VSSgoVUlOVClhLCAoVUlOVCliKTsKK30KK2lubGluZSBVQ0hBUiBmTWluKFVDSEFSIGEsIFVDSEFSIGIpIHsKKyAgcmV0dXJuIChVQ0hBUilmaXhtaW5fVUkoKFVJTlQpYSwgKFVJTlQpYik7Cit9CiAKIC8qIENvbXBsZXggZGF0YSB0eXBlcyAqLwogdHlwZWRlZiBzaG91bGRCZVVuaW9uIHsKQEAgLTM1Nyw3ICs0MzEsOCBAQAogICB9IHY7CiAgIC8qIHdvcmQgcmVwcmVzZW50YXRpb24gZm9yIG1lbW9yeSBtb3ZlICovCiAgIExPTkcgdzsKLX0gRklYUF9TUEs7Cit9CitGSVhQX1NQSzsKIAogdHlwZWRlZiBzaG91bGRCZVVuaW9uIHsKICAgLyogdmVjdG9yIHJlcHJlc2VudGF0aW9uIGZvciBhcml0aG1ldGljICovCkBAIC0zNjcsMTIgKzQ0MiwxMiBAQAogICB9IHY7CiAgIC8qIHdvcmQgcmVwcmVzZW50YXRpb24gZm9yIG1lbW9yeSBtb3ZlICovCiAgIElOVDY0IHc7Ci19IEZJWFBfRFBLOworfQorRklYUF9EUEs7CiAKICNpbmNsdWRlICJmaXhtdWwuaCIKICNpbmNsdWRlICJmaXhtYWRkLmgiCiAjaW5jbHVkZSAiY3BseF9tdWwuaCIKLSNpbmNsdWRlICJzY2FsZS5oIgogI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9jcGx4X211bC5oIGIvbGliRkRLL2luY2x1ZGUvY3BseF9tdWwuaAppbmRleCBjZTVjOWY3Li5lYjFhZmNlIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9jcGx4X211bC5oCisrKyBiL2xpYkZESy9pbmNsdWRlL2NwbHhfbXVsLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTE0ICs5MCwxMTMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKENQTFhfTVVMX0gpCisjZGVmaW5lIENQTFhfTVVMX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAotI2lmICFkZWZpbmVkKF9fQ1BMWF9NdWx0X0hfXykKLSNkZWZpbmUgX19DUExYX011bHRfSF9fCi0KLSNpZiBkZWZpbmVkKF9fQ0NfQVJNKSB8fCBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCi0jaW5jbHVkZSAiYXJtL2NwbHhfbXVsLmgiCisjaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9NX0FSTSkKKyNpbmNsdWRlICJhcm0vY3BseF9tdWxfYXJtLmgiCiAKICNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pICYmIF9fbWlwc19pc2FfcmV2IDwgNgotI2luY2x1ZGUgIm1pcHMvY3BseF9tdWwuaCIKKyNpbmNsdWRlICJtaXBzL2NwbHhfbXVsX21pcHMuaCIKIAogI2VuZGlmIC8qICNpZiBkZWZpbmVkIGFsbCBjb3JlczogYmZpbiwgYXJtLCBldGMuICovCiAKLS8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICovCiAKIC8qIEZhbGxiYWNrIGdlbmVyaWMgaW1wbGVtZW50YXRpb25zICovCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMikKICNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2WDIKIAotaW5saW5lIHZvaWQgY3BseE11bHREaXYyKCBGSVhQX0RCTCAqY19SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgIGJfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMICBiX0ltKQotewotICAqY19SZSA9IGZNdWx0RGl2MihhX1JlLGJfUmUpIC0gZk11bHREaXYyKGFfSW0sYl9JbSk7Ci0gICpjX0ltID0gZk11bHREaXYyKGFfUmUsYl9JbSkgKyBmTXVsdERpdjIoYV9JbSxiX1JlKTsKK2lubGluZSB2b2lkIGNwbHhNdWx0RGl2MihGSVhQX0RCTCAqY19SZSwgRklYUF9EQkwgKmNfSW0sIGNvbnN0IEZJWFBfREJMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwgY29uc3QgRklYUF9TR0wgYl9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBiX0ltKSB7CisgICpjX1JlID0gZk11bHREaXYyKGFfUmUsIGJfUmUpIC0gZk11bHREaXYyKGFfSW0sIGJfSW0pOworICAqY19JbSA9IGZNdWx0RGl2MihhX1JlLCBiX0ltKSArIGZNdWx0RGl2MihhX0ltLCBiX1JlKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHREaXYyXzE2eDE2WDIpCisjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8xNngxNlgyCisKK2lubGluZSB2b2lkIGNwbHhNdWx0RGl2MihGSVhQX0RCTCAqY19SZSwgRklYUF9EQkwgKmNfSW0sIGNvbnN0IEZJWFBfU0dMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYV9JbSwgY29uc3QgRklYUF9TR0wgYl9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBiX0ltKSB7CisgICpjX1JlID0gZk11bHREaXYyKGFfUmUsIGJfUmUpIC0gZk11bHREaXYyKGFfSW0sIGJfSW0pOworICAqY19JbSA9IGZNdWx0RGl2MihhX1JlLCBiX0ltKSArIGZNdWx0RGl2MihhX0ltLCBiX1JlKTsKK30KKworaW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfU0dMICpjX1JlLCBGSVhQX1NHTCAqY19JbSwgY29uc3QgRklYUF9TR0wgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBhX0ltLCBjb25zdCBGSVhQX1NHTCBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfSW0pIHsKKyAgKmNfUmUgPSBGWF9EQkwyRlhfU0dMKGZNdWx0RGl2MihhX1JlLCBiX1JlKSAtIGZNdWx0RGl2MihhX0ltLCBiX0ltKSk7CisgICpjX0ltID0gRlhfREJMMkZYX1NHTChmTXVsdERpdjIoYV9SZSwgYl9JbSkgKyBmTXVsdERpdjIoYV9JbSwgYl9SZSkpOwogfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYpCiAjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngxNgogCi1pbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TUEsgdyApCi17CitpbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoRklYUF9EQkwgKmNfUmUsIEZJWFBfREJMICpjX0ltLCBjb25zdCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sIGNvbnN0IEZJWFBfU1BLIHcpIHsKICAgY3BseE11bHREaXYyKGNfUmUsIGNfSW0sIGFfUmUsIGFfSW0sIHcudi5yZSwgdy52LmltKTsKIH0KICNlbmRpZgogCi0jaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHRBZGREaXYyXzMyeDE2WDIpCi0jZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0QWRkRGl2Ml8zMngxNlgyCisjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHREaXYyXzE2eDE2KQorI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMTZ4MTYKIAotaW5saW5lIHZvaWQgY3BseE11bHRBZGREaXYyKCBGSVhQX0RCTCAqY19SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgIGJfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMICBiX0ltKQotewotICAqY19SZSArPSBmTXVsdERpdjIoYV9SZSxiX1JlKSAtIGZNdWx0RGl2MihhX0ltLGJfSW0pOwotICAqY19JbSArPSBmTXVsdERpdjIoYV9SZSxiX0ltKSArIGZNdWx0RGl2MihhX0ltLGJfUmUpOworaW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9TR0wgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBhX0ltLCBjb25zdCBGSVhQX1NQSyB3KSB7CisgIGNwbHhNdWx0RGl2MihjX1JlLCBjX0ltLCBhX1JlLCBhX0ltLCB3LnYucmUsIHcudi5pbSk7Cit9CisKK2lubGluZSB2b2lkIGNwbHhNdWx0RGl2MihGSVhQX1NHTCAqY19SZSwgRklYUF9TR0wgKmNfSW0sIGNvbnN0IEZJWFBfU0dMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYV9JbSwgY29uc3QgRklYUF9TUEsgdykgeworICBjcGx4TXVsdERpdjIoY19SZSwgY19JbSwgYV9SZSwgYV9JbSwgdy52LnJlLCB3LnYuaW0pOwogfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdFN1YkRpdjJfMzJ4MTZYMikKICNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRTdWJEaXYyXzMyeDE2WDIKIAotaW5saW5lIHZvaWQgY3BseE11bHRTdWJEaXYyKCBGSVhQX0RCTCAqY19SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgIGJfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMICBiX0ltKQotewotICAqY19SZSAtPSBmTXVsdERpdjIoYV9SZSxiX1JlKSAtIGZNdWx0RGl2MihhX0ltLGJfSW0pOwotICAqY19JbSAtPSBmTXVsdERpdjIoYV9SZSxiX0ltKSArIGZNdWx0RGl2MihhX0ltLGJfUmUpOworaW5saW5lIHZvaWQgY3BseE11bHRTdWJEaXYyKEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLCBjb25zdCBGSVhQX1NHTCBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfSW0pIHsKKyAgKmNfUmUgLT0gZk11bHREaXYyKGFfUmUsIGJfUmUpIC0gZk11bHREaXYyKGFfSW0sIGJfSW0pOworICAqY19JbSAtPSBmTXVsdERpdjIoYV9SZSwgYl9JbSkgKyBmTXVsdERpdjIoYV9JbSwgYl9SZSk7CiB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyKQogI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MzJYMgogCi1pbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYl9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGJfSW0pCi17Ci0gICpjX1JlID0gZk11bHREaXYyKGFfUmUsYl9SZSkgLSBmTXVsdERpdjIoYV9JbSxiX0ltKTsKLSAgKmNfSW0gPSBmTXVsdERpdjIoYV9SZSxiX0ltKSArIGZNdWx0RGl2MihhX0ltLGJfUmUpOworaW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLCBjb25zdCBGSVhQX0RCTCBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGJfSW0pIHsKKyAgKmNfUmUgPSBmTXVsdERpdjIoYV9SZSwgYl9SZSkgLSBmTXVsdERpdjIoYV9JbSwgYl9JbSk7CisgICpjX0ltID0gZk11bHREaXYyKGFfUmUsIGJfSW0pICsgZk11bHREaXYyKGFfSW0sIGJfUmUpOwogfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MzIpCiAjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMgogCi1pbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RQSyAgdykKLXsKK2lubGluZSB2b2lkIGNwbHhNdWx0RGl2MihGSVhQX0RCTCAqY19SZSwgRklYUF9EQkwgKmNfSW0sIGNvbnN0IEZJWFBfREJMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwgY29uc3QgRklYUF9EUEsgdykgewogICBjcGx4TXVsdERpdjIoY19SZSwgY19JbSwgYV9SZSwgYV9JbSwgdy52LnJlLCB3LnYuaW0pOwogfQogI2VuZGlmCkBAIC0xOTQsNDQgKzIwNCwzOSBAQAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0U3ViRGl2Ml8zMngzMlgyKQogI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdFN1YkRpdjJfMzJ4MzJYMgogCi1pbmxpbmUgdm9pZCBjcGx4TXVsdFN1YkRpdjIoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYl9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGJfSW0pCi17Ci0gICpjX1JlIC09IGZNdWx0RGl2MihhX1JlLGJfUmUpIC0gZk11bHREaXYyKGFfSW0sYl9JbSk7Ci0gICpjX0ltIC09IGZNdWx0RGl2MihhX1JlLGJfSW0pICsgZk11bHREaXYyKGFfSW0sYl9SZSk7CitpbmxpbmUgdm9pZCBjcGx4TXVsdFN1YkRpdjIoRklYUF9EQkwgKmNfUmUsIEZJWFBfREJMICpjX0ltLCBjb25zdCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sIGNvbnN0IEZJWFBfREJMIGJfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYl9JbSkgeworICAqY19SZSAtPSBmTXVsdERpdjIoYV9SZSwgYl9SZSkgLSBmTXVsdERpdjIoYV9JbSwgYl9JbSk7CisgICpjX0ltIC09IGZNdWx0RGl2MihhX1JlLCBiX0ltKSArIGZNdWx0RGl2MihhX0ltLCBiX1JlKTsKIH0KICNlbmRpZgogCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworICAvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgKi8KIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0XzMyeDE2WDIpCiAjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0XzMyeDE2WDIKIAotaW5saW5lIHZvaWQgY3BseE11bHQoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMICBiX1JlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMICBiX0ltKQotewotICAqY19SZSA9IGZNdWx0KGFfUmUsYl9SZSkgLSBmTXVsdChhX0ltLGJfSW0pOwotICAqY19JbSA9IGZNdWx0KGFfUmUsYl9JbSkgKyBmTXVsdChhX0ltLGJfUmUpOworaW5saW5lIHZvaWQgY3BseE11bHQoRklYUF9EQkwgKmNfUmUsIEZJWFBfREJMICpjX0ltLCBjb25zdCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwgY29uc3QgRklYUF9TR0wgYl9SZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfSW0pIHsKKyAgKmNfUmUgPSBmTXVsdChhX1JlLCBiX1JlKSAtIGZNdWx0KGFfSW0sIGJfSW0pOworICAqY19JbSA9IGZNdWx0KGFfUmUsIGJfSW0pICsgZk11bHQoYV9JbSwgYl9SZSk7Cit9CitpbmxpbmUgdm9pZCBjcGx4TXVsdChGSVhQX1NHTCAqY19SZSwgRklYUF9TR0wgKmNfSW0sIGNvbnN0IEZJWFBfU0dMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBhX0ltLCBjb25zdCBGSVhQX1NHTCBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYl9JbSkgeworICAqY19SZSA9IEZYX0RCTDJGWF9TR0woZk11bHQoYV9SZSwgYl9SZSkgLSBmTXVsdChhX0ltLCBiX0ltKSk7CisgICpjX0ltID0gRlhfREJMMkZYX1NHTChmTXVsdChhX1JlLCBiX0ltKSArIGZNdWx0KGFfSW0sIGJfUmUpKTsKIH0KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHRfMzJ4MTYpCiAjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0XzMyeDE2CiAKLWlubGluZSB2b2lkIGNwbHhNdWx0KCBGSVhQX0RCTCAqY19SZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TUEsgdyApCi17CitpbmxpbmUgdm9pZCBjcGx4TXVsdChGSVhQX0RCTCAqY19SZSwgRklYUF9EQkwgKmNfSW0sIGNvbnN0IEZJWFBfREJMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLCBjb25zdCBGSVhQX1NQSyB3KSB7CiAgIGNwbHhNdWx0KGNfUmUsIGNfSW0sIGFfUmUsIGFfSW0sIHcudi5yZSwgdy52LmltKTsKIH0KICNlbmRpZgpAQCAtMjM5LDMxICsyNDQsMjMgQEAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdF8zMngzMlgyKQogI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdF8zMngzMlgyCiAKLWlubGluZSB2b2lkIGNwbHhNdWx0KCBGSVhQX0RCTCAqY19SZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYl9SZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYl9JbSkKLXsKLSAgKmNfUmUgPSBmTXVsdChhX1JlLGJfUmUpIC0gZk11bHQoYV9JbSxiX0ltKTsKLSAgKmNfSW0gPSBmTXVsdChhX1JlLGJfSW0pICsgZk11bHQoYV9JbSxiX1JlKTsKK2lubGluZSB2b2lkIGNwbHhNdWx0KEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sIGNvbnN0IEZJWFBfREJMIGJfUmUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBiX0ltKSB7CisgICpjX1JlID0gZk11bHQoYV9SZSwgYl9SZSkgLSBmTXVsdChhX0ltLCBiX0ltKTsKKyAgKmNfSW0gPSBmTXVsdChhX1JlLCBiX0ltKSArIGZNdWx0KGFfSW0sIGJfUmUpOwogfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdF8zMngzMikKICNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MzIKLWlubGluZSB2b2lkIGNwbHhNdWx0KCBGSVhQX0RCTCAqY19SZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RQSyAgdykKLXsKK2lubGluZSB2b2lkIGNwbHhNdWx0KEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sIGNvbnN0IEZJWFBfRFBLIHcpIHsKICAgY3BseE11bHQoY19SZSwgY19JbSwgYV9SZSwgYV9JbSwgdy52LnJlLCB3LnYuaW0pOwogfQogI2VuZGlmCiAKLS8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisgIC8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAqLwogCi0jZW5kaWYgLyogX19DUExYX011bHRfSF9fICovCi0KKyNlbmRpZiAvKiBDUExYX01VTF9IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9kY3QuaCBiL2xpYkZESy9pbmNsdWRlL2RjdC5oCmluZGV4IGFmMWVkZDMuLjMwOGFmY2IgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL2RjdC5oCisrKyBiL2xpYkZESy9pbmNsdWRlL2RjdC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI0ICs5MCwyNiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOgorCiAgICBEZXNjcmlwdGlvbjogTGlicmFyeSBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIHN0YW5kYXJkIERDVHMuIFRoaXMgd2lsbCBtb3N0CiAgICAgICAgICAgICAgICAgbGlrZWx5IGJlIHJlcGxhY2VkIGJ5IGhhbmQtb3B0aW1pemVkIGZ1bmN0aW9ucyBmb3IgdGhlIHNwZWNpZmljCiAgICAgICAgICAgICAgICAgdGFyZ2V0IHByb2Nlc3Nvci4KIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfX2RjdF9ICi0jZGVmaW5lIF9fZGN0X0gKLQotCisjaWZuZGVmIERDVF9ICisjZGVmaW5lIERDVF9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKK3ZvaWQgZGN0X2dldFRhYmxlcyhjb25zdCBGSVhQX1dUUCAqKnB0d2lkZGxlLCBjb25zdCBGSVhQX1NUUCAqKnNpbl90d2lkZGxlLAorICAgICAgICAgICAgICAgICAgIGludCAqc2luX3N0ZXAsIGludCBsZW5ndGgpOworCiAvKioKICAqIFxicmllZiBDYWxjdWxhdGUgRENUIHR5cGUgSUkgb2YgZ2l2ZW4gbGVuZ3RoLiBUaGUgRENUIElWIGlzCiAgKiAgICAgICAgY2FsY3VsYXRlZCBieSBhIGNvbXBsZXggRkZULCB3aXRoIHNvbWUgcHJlIGFuZCBwb3N0IHR3aWRkZWxpbmcuCkBAIC0xMjEsNiArMTM0LDE5IEBACiB2b2lkIGRjdF9JSUkoRklYUF9EQkwgKnBEYXQsIEZJWFBfREJMICp0bXAsIGludCBzaXplLCBpbnQgKnBEYXRfZSk7CiAKIC8qKgorICogXGJyaWVmIENhbGN1bGF0ZSBEU1QgdHlwZSBJSUkgb2YgZ2l2ZW4gbGVuZ3RoLiBUaGUgRFNUIElJSSBpcworICogICAgICAgIGNhbGN1bGF0ZWQgYnkgYSBEQ1QgSUlJIG9mIG1pcnJvcmVkIGlucHV0IGFuZCBzaWduLWZsaXBwaW5nIG9mIG9kZAorICogICAgICAgIG91dHB1dCBjb2VmZmljaWVudHMuCisgKiAgICAgICAgTm90ZSB0aGF0IHRoZSBmYWN0b3IgMC41IGZvciB0aGUgc3VtIHRlcm0geFtOLTFdIGlzIDEuMCBpbnN0ZWFkIG9mCisgKiAwLjUuIEEgZmFjdG9yIG9mIHNxcnQoMi9OKSBpcyBOT1QgYXBwbGllZC4KKyAqIFxwYXJhbSBwRGF0IHBvaW50ZXIgdG8gaW5wdXQvb3V0cHV0IGRhdGEgKGluIHBsYWNlIHByb2Nlc3NpbmcpLgorICogXHBhcmFtIHNpemUgc2l6ZSBvZiBwRGF0LgorICogXHBhcmFtIHBEYXRfZSBwb2ludGVyIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgZXhwb25lbnQgb2YgdGhlIGRhdGEKKyAqICAgICAgICAgICAgICAgcmVmZXJlbmNlZCBieSBwRGF0LiBUaGUgZXhwb25lbnQgaXMgdXBkYXRlZCBhY2NvcmRpbmdseS4KKyAqLwordm9pZCBkc3RfSUlJKEZJWFBfREJMICpwRGF0LCBGSVhQX0RCTCAqdG1wLCBpbnQgc2l6ZSwgaW50ICpwRGF0X2UpOworCisvKioKICAqIFxicmllZiBDYWxjdWxhdGUgRENUIHR5cGUgSVYgb2YgZ2l2ZW4gbGVuZ3RoLiBUaGUgRENUIElWIGlzCiAgKiAgICAgICAgY2FsY3VsYXRlZCBieSBhIGNvbXBsZXggRkZULCB3aXRoIHNvbWUgcHJlIGFuZCBwb3N0IHR3aWRkZWxpbmcuCiAgKiAgICAgICAgQSBmYWN0b3Igb2Ygc3FydCgyL04pIGlzIE5PVCBhcHBsaWVkLgpAQCAtMTI5LDcgKzE1NSw3IEBACiAgKiBccGFyYW0gcERhdF9lIHBvaW50ZXIgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBleHBvbmVudCBvZiB0aGUgZGF0YQogICogICAgICAgICAgICAgICByZWZlcmVuY2VkIGJ5IHBEYXQuIFRoZSBleHBvbmVudCBpcyB1cGRhdGVkIGFjY29yZGluZ2x5LgogICovCi12b2lkIGRjdF9JVihGSVhQX0RCTCAqcERhdCxpbnQgc2l6ZSwgaW50ICpwRGF0X2UpOwordm9pZCBkY3RfSVYoRklYUF9EQkwgKnBEYXQsIGludCBzaXplLCBpbnQgKnBEYXRfZSk7CiAKIC8qKgogICogXGJyaWVmIENhbGN1bGF0ZSBEU1QgdHlwZSBJViBvZiBnaXZlbiBsZW5ndGguIFRoZSBEU1QgSVYgaXMKQEAgLTE0MCw4ICsxNjYsNiBAQAogICogXHBhcmFtIHBEYXRfZSBwb2ludGVyIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgZXhwb25lbnQgb2YgdGhlIGRhdGEKICAqICAgICAgICAgICAgICAgcmVmZXJlbmNlZCBieSBwRGF0LiBUaGUgZXhwb25lbnQgaXMgdXBkYXRlZCBhY2NvcmRpbmdseS4KICAqLwotdm9pZCBkc3RfSVYoRklYUF9EQkwgKnBEYXQsaW50IHNpemUsIGludCAqcERhdF9lKTsKLQotCit2b2lkIGRzdF9JVihGSVhQX0RCTCAqcERhdCwgaW50IHNpemUsIGludCAqcERhdF9lKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9mZnQuaCBiL2xpYkZESy9pbmNsdWRlL2ZmdC5oCmluZGV4IDYxNmYzNTAuLjM1NzZlZDMgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL2ZmdC5oCisrKyBiL2xpYkZESy9pbmNsdWRlL2ZmdC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE3ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbCwgRFNQIFNvbHV0aW9ucworCiAgICBEZXNjcmlwdGlvbjogRml4IHBvaW50IEZGVAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fRkZUX0hfXwotI2RlZmluZSBfX0ZGVF9IX18KKyNpZm5kZWYgRkZUX0gKKyNkZWZpbmUgRkZUX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIApAQCAtOTcsMTAgKzEwOSwxMCBAQAogICogXGJyaWVmIFBlcmZvcm0gYW4gaW5wbGFjZSBjb21wbGV4IHZhbHVlZCBGRlQgb2YgbGVuZ3RoIDJebgogICoKICAqIFxwYXJhbSBsZW5ndGggTGVuZ3RoIG9mIHRoZSBGRlQgdG8gYmUgY2FsY3VsYXRlZC4KLSAqIFxwYXJhbSBwSW5wdXQgSW5wdXQvT3V0cHV0IGRhdGEgYnVmZmVyLiBUaGUgaW5wdXQgZGF0YSBtdXN0IGhhdmUgYXQgbGVhc3QgMSBiaXQgc2NhbGUgaGVhZHJvb20uCi0gKiAgICAgICAgICBUaGUgdmFsdWVzIGFyZSBpbnRlcmxlYXZlZCwgcmVhbC9pbWFnIHBhaXJzLgotICogXHBhcmFtIHNjYWxlZmFjdG9yIFBvaW50ZXIgdG8gYW4gSU5ULCB3aGljaCBjb250YWlucyB0aGUgY3VycmVudCBzY2FsZSBvZiB0aGUgaW5wdXQgZGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyB1cGRhdGVkIGFjY29yZGluZyB0byB0aGUgRkZUIHNjYWxlLgorICogXHBhcmFtIHBJbnB1dCBJbnB1dC9PdXRwdXQgZGF0YSBidWZmZXIuIFRoZSBpbnB1dCBkYXRhIG11c3QgaGF2ZSBhdCBsZWFzdCAxCisgKiBiaXQgc2NhbGUgaGVhZHJvb20uIFRoZSB2YWx1ZXMgYXJlIGludGVybGVhdmVkLCByZWFsL2ltYWcgcGFpcnMuCisgKiBccGFyYW0gc2NhbGVmYWN0b3IgUG9pbnRlciB0byBhbiBJTlQsIHdoaWNoIGNvbnRhaW5zIHRoZSBjdXJyZW50IHNjYWxlIG9mIHRoZQorICogaW5wdXQgZGF0YSwgd2hpY2ggaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIEZGVCBzY2FsZS4KICAqLwogdm9pZCBmZnQoaW50IGxlbmd0aCwgRklYUF9EQkwgKnBJbnB1dCwgSU5UICpzY2FsZWZhY3Rvcik7CiAKQEAgLTEwOCwxNDYgKzEyMCwxNDQgQEAKICAqIFxicmllZiBQZXJmb3JtIGFuIGlucGxhY2UgY29tcGxleCB2YWx1ZWQgSUZGVCBvZiBsZW5ndGggMl5uCiAgKgogICogXHBhcmFtIGxlbmd0aCBMZW5ndGggb2YgdGhlIEZGVCB0byBiZSBjYWxjdWxhdGVkLgotICogXHBhcmFtIHBJbnB1dCBJbnB1dC9PdXRwdXQgZGF0YSBidWZmZXIuIFRoZSBpbnB1dCBkYXRhIG11c3QgaGF2ZSBhdCBsZWFzdCAxIGJpdCBzY2FsZSBoZWFkcm9vbS4KLSAqICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlIGludGVybGVhdmVkLCByZWFsL2ltYWcgcGFpcnMuCi0gKiBccGFyYW0gc2NhbGVmYWN0b3IgUG9pbnRlciB0byBhbiBJTlQsIHdoaWNoIGNvbnRhaW5zIHRoZSBjdXJyZW50IHNjYWxlIG9mIHRoZSBpbnB1dCBkYXRhLAotICogICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBJRkZUIHNjYWxlLgorICogXHBhcmFtIHBJbnB1dCBJbnB1dC9PdXRwdXQgZGF0YSBidWZmZXIuIFRoZSBpbnB1dCBkYXRhIG11c3QgaGF2ZSBhdCBsZWFzdCAxCisgKiBiaXQgc2NhbGUgaGVhZHJvb20uIFRoZSB2YWx1ZXMgYXJlIGludGVybGVhdmVkLCByZWFsL2ltYWcgcGFpcnMuCisgKiBccGFyYW0gc2NhbGVmYWN0b3IgUG9pbnRlciB0byBhbiBJTlQsIHdoaWNoIGNvbnRhaW5zIHRoZSBjdXJyZW50IHNjYWxlIG9mIHRoZQorICogaW5wdXQgZGF0YSwgd2hpY2ggaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIElGRlQgc2NhbGUuCiAgKi8KIHZvaWQgaWZmdChpbnQgbGVuZ3RoLCBGSVhQX0RCTCAqcElucHV0LCBJTlQgKnNjYWxlZmFjdG9yKTsKIAotCiAvKgogICogRnJlcXVlbnRseSB1c2VkIGFuZCBmaXhlZCBzaG9ydCBsZW5ndGggRkZUcy4KICAqLwogCi1MTktfU0VDVElPTl9DT0RFX0wxCi1zdGF0aWMgdm9pZCBGT1JDRUlOTElORSBmZnRfNChGSVhQX0RCTCAqeCkKLXsKLSAgICBGSVhQX0RCTCBhMDAsIGExMCwgYTIwLCBhMzAsIHRtcDAsIHRtcDE7Ci0KLSAgICBhMDAgPSAoeFswXSArIHhbNF0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KLSAgICBhMTAgPSAoeFsyXSArIHhbNl0pPj4xOyAgLyogUmUgQyArIFJlIEQgKi8KLSAgICBhMjAgPSAoeFsxXSArIHhbNV0pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KLSAgICBhMzAgPSAoeFszXSArIHhbN10pPj4xOyAgLyogSW0gQyArIEltIEQgKi8KLQotICAgIHhbMF0gPSBhMDAgKyBhMTA7ICAgICAgIC8qIFJlIEEnID0gUmUgQSArIFJlIEIgKyBSZSBDICsgUmUgRCAqLwotICAgIHhbMV0gPSBhMjAgKyBhMzA7ICAgICAgIC8qIEltIEEnID0gSW0gQSArIEltIEIgKyBJbSBDICsgSW0gRCAqLwotCi0gICAgdG1wMCA9IGEwMCAtIHhbNF07ICAgICAgIC8qIFJlIEEgLSBSZSBCICovCi0gICAgdG1wMSA9IGEyMCAtIHhbNV07ICAgICAgIC8qIEltIEEgLSBJbSBCICovCi0KLSAgICB4WzRdID0gYTAwIC0gYTEwOyAgICAgICAvKiBSZSBDJyA9IFJlIEEgKyBSZSBCIC0gUmUgQyAtIFJlIEQgKi8KLSAgICB4WzVdID0gYTIwIC0gYTMwOyAgICAgICAvKiBJbSBDJyA9IEltIEEgKyBJbSBCIC0gSW0gQyAtIEltIEQgKi8KLQotICAgIGExMCA9IGExMCAtIHhbNl07ICAgICAgIC8qIFJlIEMgLSBSZSBEICovCi0gICAgYTMwID0gYTMwIC0geFs3XTsgICAgICAgLyogSW0gQyAtIEltIEQgKi8KLQotICAgIHhbMl0gPSB0bXAwICsgYTMwOyAgICAgICAvKiBSZSBCJyA9IFJlIEEgLSBSZSBCICsgSW0gQyAtIEltIEQgKi8KLSAgICB4WzZdID0gdG1wMCAtIGEzMDsgICAgICAgLyogUmUgRCcgPSBSZSBBIC0gUmUgQiAtIEltIEMgKyBJbSBEICovCi0gICAgeFszXSA9IHRtcDEgLSBhMTA7ICAgICAgIC8qIEltIEInID0gSW0gQSAtIEltIEIgLSBSZSBDICsgUmUgRCAqLwotICAgIHhbN10gPSB0bXAxICsgYTEwOyAgICAgICAvKiBJbSBEJyA9IEltIEEgLSBJbSBCICsgUmUgQyAtIFJlIEQgKi8KLX0KLQotTE5LX1NFQ1RJT05fQ09ERV9MMQotc3RhdGljIHZvaWQgRk9SQ0VJTkxJTkUgZmZ0XzgoRklYUF9EQkwgKngpCi17Ci0gICAgICAjZGVmaW5lIFdfUGlGT1VSVEggU1RDKDB4NWE4Mjc5OWEpCi0KLSAgICAgIEZJWFBfREJMIGEwMCwgYTEwLCBhMjAsIGEzMDsKLSAgICAgIEZJWFBfREJMIHlbMTZdOwotCi0gICAgICBhMDAgPSAoeFswXSArIHhbOF0pPj4xOwotICAgICAgYTEwID0gIHhbNF0gKyB4WzEyXTsKLSAgICAgIGEyMCA9ICh4WzFdICsgeFs5XSk+PjE7Ci0gICAgICBhMzAgPSAgeFs1XSArIHhbMTNdOwotCi0gICAgICB5WzBdID0gYTAwICsgKGExMD4+MSk7Ci0gICAgICB5WzRdID0gYTAwIC0gKGExMD4+MSk7Ci0gICAgICB5WzFdID0gYTIwICsgKGEzMD4+MSk7Ci0gICAgICB5WzVdID0gYTIwIC0gKGEzMD4+MSk7Ci0KLSAgICAgIGEwMCA9IGEwMCAgICAgIC0geFs4XTsKLSAgICAgIGExMCA9IChhMTA+PjEpIC0geFsxMl07Ci0gICAgICBhMjAgPSBhMjAgICAgICAtIHhbOV07Ci0gICAgICBhMzAgPSAoYTMwPj4xKSAtIHhbMTNdOwotCi0gICAgICB5WzJdID0gYTAwICsgYTMwOwotICAgICAgeVs2XSA9IGEwMCAtIGEzMDsKLSAgICAgIHlbM10gPSBhMjAgLSBhMTA7Ci0gICAgICB5WzddID0gYTIwICsgYTEwOwotCi0gICAgICBhMDAgPSAoeFsyXSArIHhbMTBdKT4+MTsKLSAgICAgIGExMCA9ICB4WzZdICsgeFsxNF07Ci0gICAgICBhMjAgPSAoeFszXSArIHhbMTFdKT4+MTsKLSAgICAgIGEzMCA9ICB4WzddICsgeFsxNV07Ci0KLSAgICAgIHlbOF0gID0gYTAwICsgKGExMD4+MSk7Ci0gICAgICB5WzEyXSA9IGEwMCAtIChhMTA+PjEpOwotICAgICAgeVs5XSAgPSBhMjAgKyAoYTMwPj4xKTsKLSAgICAgIHlbMTNdID0gYTIwIC0gKGEzMD4+MSk7Ci0KLSAgICAgIGEwMCA9IGEwMCAgICAgIC0geFsxMF07Ci0gICAgICBhMTAgPSAoYTEwPj4xKSAtIHhbMTRdOwotICAgICAgYTIwID0gYTIwICAgICAgLSB4WzExXTsKLSAgICAgIGEzMCA9IChhMzA+PjEpIC0geFsxNV07Ci0KLSAgICAgIHlbMTBdID0gYTAwICsgYTMwOwotICAgICAgeVsxNF0gPSBhMDAgLSBhMzA7Ci0gICAgICB5WzExXSA9IGEyMCAtIGExMDsKLSAgICAgIHlbMTVdID0gYTIwICsgYTEwOwotCi0gICAgICBGSVhQX0RCTCB2ciwgdmksIHVyLCB1aTsKLQotICAgICAgdXIgPSB5WzBdPj4xOwotICAgICAgdWkgPSB5WzFdPj4xOwotICAgICAgdnIgPSB5WzhdOwotICAgICAgdmkgPSB5WzldOwotICAgICAgeFswXSA9IHVyICsgKHZyPj4xKTsKLSAgICAgIHhbMV0gPSB1aSArICh2aT4+MSk7Ci0gICAgICB4WzhdID0gdXIgLSAodnI+PjEpOwotICAgICAgeFs5XSA9IHVpIC0gKHZpPj4xKTsKLQotICAgICAgdXIgPSB5WzRdPj4xOwotICAgICAgdWkgPSB5WzVdPj4xOwotICAgICAgdmkgPSB5WzEyXTsKLSAgICAgIHZyID0geVsxM107Ci0gICAgICB4WzRdICA9IHVyICsgKHZyPj4xKTsKLSAgICAgIHhbNV0gID0gdWkgLSAodmk+PjEpOwotICAgICAgeFsxMl0gPSB1ciAtICh2cj4+MSk7Ci0gICAgICB4WzEzXSA9IHVpICsgKHZpPj4xKTsKLQotICAgICAgdXIgPSB5WzEwXTsKLSAgICAgIHVpID0geVsxMV07Ci0gICAgICB2ciA9IGZNdWx0RGl2Mih1aSt1cixXX1BpRk9VUlRIKTsKLSAgICAgIHZpID0gZk11bHREaXYyKHVpLXVyLFdfUGlGT1VSVEgpOwotICAgICAgdXIgPSB5WzJdOwotICAgICAgdWkgPSB5WzNdOwotICAgICAgeFsyXSAgPSAodXI+PjEpICsgdnI7Ci0gICAgICB4WzNdICA9ICh1aT4+MSkgKyB2aTsKLSAgICAgIHhbMTBdID0gKHVyPj4xKSAtIHZyOwotICAgICAgeFsxMV0gPSAodWk+PjEpIC0gdmk7Ci0KLSAgICAgIHVyID0geVsxNF07Ci0gICAgICB1aSA9IHlbMTVdOwotICAgICAgdnIgPSBmTXVsdERpdjIodWktdXIsV19QaUZPVVJUSCk7Ci0gICAgICB2aSA9IGZNdWx0RGl2Mih1aSt1cixXX1BpRk9VUlRIKTsKLSAgICAgIHVyID0geVs2XTsKLSAgICAgIHVpID0geVs3XTsKLSAgICAgIHhbNl0gID0gKHVyPj4xKSArIHZyOwotICAgICAgeFs3XSAgPSAodWk+PjEpIC0gdmk7Ci0gICAgICB4WzE0XSA9ICh1cj4+MSkgLSB2cjsKLSAgICAgIHhbMTVdID0gKHVpPj4xKSArIHZpOwotfQotCisjaWZuZGVmIEZVTkNUSU9OX2ZmdF80CiAvKioKLSAqIFxicmllZiBGRlQgb2YgZml4ZWQgbGVuZ3RoIDE2CisgKiBcYnJpZWYgUGVyZm9ybSBhbiBpbnBsYWNlIGNvbXBsZXggdmFsdWVkIEZGVCBvZiBsZW5ndGggNAorICoKKyAqIFxwYXJhbSBwSW5wdXQgSW5wdXQvT3V0cHV0IGRhdGEgYnVmZmVyLiBUaGUgaW5wdXQgZGF0YSBtdXN0IGhhdmUgYXQgbGVhc3QgMQorICogYml0IHNjYWxlIGhlYWRyb29tLiBUaGUgdmFsdWVzIGFyZSBpbnRlcmxlYXZlZCwgcmVhbC9pbWFnIHBhaXJzLgogICovCi1pbmxpbmUgdm9pZCBmZnRfMTYoRklYUF9EQkwgKngpOworTE5LX1NFQ1RJT05fQ09ERV9MMQorc3RhdGljIHZvaWQgRkRLX0ZPUkNFSU5MSU5FIGZmdF80KEZJWFBfREJMICp4KSB7CisgIEZJWFBfREJMIGEwMCwgYTEwLCBhMjAsIGEzMCwgdG1wMCwgdG1wMTsKIAotLyoqCi0gKiBcYnJpZWYgRkZUIG9mIGZpeGVkIGxlbmd0aCAzMgotICovCi1pbmxpbmUgdm9pZCBmZnRfMzIoRklYUF9EQkwgKngpOworICBhMDAgPSAoeFswXSArIHhbNF0pID4+IDE7IC8qIFJlIEEgKyBSZSBCICovCisgIGExMCA9ICh4WzJdICsgeFs2XSkgPj4gMTsgLyogUmUgQyArIFJlIEQgKi8KKyAgYTIwID0gKHhbMV0gKyB4WzVdKSA+PiAxOyAvKiBJbSBBICsgSW0gQiAqLworICBhMzAgPSAoeFszXSArIHhbN10pID4+IDE7IC8qIEltIEMgKyBJbSBEICovCiAKKyAgeFswXSA9IGEwMCArIGExMDsgLyogUmUgQScgPSBSZSBBICsgUmUgQiArIFJlIEMgKyBSZSBEICovCisgIHhbMV0gPSBhMjAgKyBhMzA7IC8qIEltIEEnID0gSW0gQSArIEltIEIgKyBJbSBDICsgSW0gRCAqLworCisgIHRtcDAgPSBhMDAgLSB4WzRdOyAvKiBSZSBBIC0gUmUgQiAqLworICB0bXAxID0gYTIwIC0geFs1XTsgLyogSW0gQSAtIEltIEIgKi8KKworICB4WzRdID0gYTAwIC0gYTEwOyAvKiBSZSBDJyA9IFJlIEEgKyBSZSBCIC0gUmUgQyAtIFJlIEQgKi8KKyAgeFs1XSA9IGEyMCAtIGEzMDsgLyogSW0gQycgPSBJbSBBICsgSW0gQiAtIEltIEMgLSBJbSBEICovCisKKyAgYTEwID0gYTEwIC0geFs2XTsgLyogUmUgQyAtIFJlIEQgKi8KKyAgYTMwID0gYTMwIC0geFs3XTsgLyogSW0gQyAtIEltIEQgKi8KKworICB4WzJdID0gdG1wMCArIGEzMDsgLyogUmUgQicgPSBSZSBBIC0gUmUgQiArIEltIEMgLSBJbSBEICovCisgIHhbNl0gPSB0bXAwIC0gYTMwOyAvKiBSZSBEJyA9IFJlIEEgLSBSZSBCIC0gSW0gQyArIEltIEQgKi8KKyAgeFszXSA9IHRtcDEgLSBhMTA7IC8qIEltIEInID0gSW0gQSAtIEltIEIgLSBSZSBDICsgUmUgRCAqLworICB4WzddID0gdG1wMSArIGExMDsgLyogSW0gRCcgPSBJbSBBIC0gSW0gQiArIFJlIEMgLSBSZSBEICovCit9CisjZW5kaWYgLyogRlVOQ1RJT05fZmZ0XzQgKi8KKworI2lmbmRlZiBGVU5DVElPTl9mZnRfOAorTE5LX1NFQ1RJT05fQ09ERV9MMQorc3RhdGljIHZvaWQgRkRLX0ZPUkNFSU5MSU5FIGZmdF84KEZJWFBfREJMICp4KSB7CisgIEZJWFBfU1BLIHdfUGlGT1VSVEggPSB7e0ZJWFBfU0dMKDB4NUE4MiksIEZJWFBfU0dMKDB4NUE4Mil9fTsKKworICBGSVhQX0RCTCBhMDAsIGExMCwgYTIwLCBhMzA7CisgIEZJWFBfREJMIHlbMTZdOworCisgIGEwMCA9ICh4WzBdICsgeFs4XSkgPj4gMTsKKyAgYTEwID0geFs0XSArIHhbMTJdOworICBhMjAgPSAoeFsxXSArIHhbOV0pID4+IDE7CisgIGEzMCA9IHhbNV0gKyB4WzEzXTsKKworICB5WzBdID0gYTAwICsgKGExMCA+PiAxKTsKKyAgeVs0XSA9IGEwMCAtIChhMTAgPj4gMSk7CisgIHlbMV0gPSBhMjAgKyAoYTMwID4+IDEpOworICB5WzVdID0gYTIwIC0gKGEzMCA+PiAxKTsKKworICBhMDAgPSBhMDAgLSB4WzhdOworICBhMTAgPSAoYTEwID4+IDEpIC0geFsxMl07CisgIGEyMCA9IGEyMCAtIHhbOV07CisgIGEzMCA9IChhMzAgPj4gMSkgLSB4WzEzXTsKKworICB5WzJdID0gYTAwICsgYTMwOworICB5WzZdID0gYTAwIC0gYTMwOworICB5WzNdID0gYTIwIC0gYTEwOworICB5WzddID0gYTIwICsgYTEwOworCisgIGEwMCA9ICh4WzJdICsgeFsxMF0pID4+IDE7CisgIGExMCA9IHhbNl0gKyB4WzE0XTsKKyAgYTIwID0gKHhbM10gKyB4WzExXSkgPj4gMTsKKyAgYTMwID0geFs3XSArIHhbMTVdOworCisgIHlbOF0gPSBhMDAgKyAoYTEwID4+IDEpOworICB5WzEyXSA9IGEwMCAtIChhMTAgPj4gMSk7CisgIHlbOV0gPSBhMjAgKyAoYTMwID4+IDEpOworICB5WzEzXSA9IGEyMCAtIChhMzAgPj4gMSk7CisKKyAgYTAwID0gYTAwIC0geFsxMF07CisgIGExMCA9IChhMTAgPj4gMSkgLSB4WzE0XTsKKyAgYTIwID0gYTIwIC0geFsxMV07CisgIGEzMCA9IChhMzAgPj4gMSkgLSB4WzE1XTsKKworICB5WzEwXSA9IGEwMCArIGEzMDsKKyAgeVsxNF0gPSBhMDAgLSBhMzA7CisgIHlbMTFdID0gYTIwIC0gYTEwOworICB5WzE1XSA9IGEyMCArIGExMDsKKworICBGSVhQX0RCTCB2ciwgdmksIHVyLCB1aTsKKworICB1ciA9IHlbMF0gPj4gMTsKKyAgdWkgPSB5WzFdID4+IDE7CisgIHZyID0geVs4XTsKKyAgdmkgPSB5WzldOworICB4WzBdID0gdXIgKyAodnIgPj4gMSk7CisgIHhbMV0gPSB1aSArICh2aSA+PiAxKTsKKyAgeFs4XSA9IHVyIC0gKHZyID4+IDEpOworICB4WzldID0gdWkgLSAodmkgPj4gMSk7CisKKyAgdXIgPSB5WzRdID4+IDE7CisgIHVpID0geVs1XSA+PiAxOworICB2aSA9IHlbMTJdOworICB2ciA9IHlbMTNdOworICB4WzRdID0gdXIgKyAodnIgPj4gMSk7CisgIHhbNV0gPSB1aSAtICh2aSA+PiAxKTsKKyAgeFsxMl0gPSB1ciAtICh2ciA+PiAxKTsKKyAgeFsxM10gPSB1aSArICh2aSA+PiAxKTsKKworICB1ciA9IHlbMTBdOworICB1aSA9IHlbMTFdOworCisgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgdWksIHVyLCB3X1BpRk9VUlRIKTsKKworICB1ciA9IHlbMl07CisgIHVpID0geVszXTsKKyAgeFsyXSA9ICh1ciA+PiAxKSArIHZyOworICB4WzNdID0gKHVpID4+IDEpICsgdmk7CisgIHhbMTBdID0gKHVyID4+IDEpIC0gdnI7CisgIHhbMTFdID0gKHVpID4+IDEpIC0gdmk7CisKKyAgdXIgPSB5WzE0XTsKKyAgdWkgPSB5WzE1XTsKKworICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHVpLCB1ciwgd19QaUZPVVJUSCk7CisKKyAgdXIgPSB5WzZdOworICB1aSA9IHlbN107CisgIHhbNl0gPSAodXIgPj4gMSkgKyB2cjsKKyAgeFs3XSA9ICh1aSA+PiAxKSAtIHZpOworICB4WzE0XSA9ICh1ciA+PiAxKSAtIHZyOworICB4WzE1XSA9ICh1aSA+PiAxKSArIHZpOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZmdF84ICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvZmZ0X3JhZDIuaCBiL2xpYkZESy9pbmNsdWRlL2ZmdF9yYWQyLmgKaW5kZXggOTBkMTRkYS4uYjgyMGI3ZCAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvZmZ0X3JhZDIuaAorKysgYi9saWJGREsvaW5jbHVkZS9mZnRfcmFkMi5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDU2ICs5MCwzMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKKwogICAgRGVzY3JpcHRpb246CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX0ZGVF9SQUQyX0gKLSNkZWZpbmUgX0ZGVF9SQUQyX0gKLQorI2lmbmRlZiBGRlRfUkFEMl9ICisjZGVmaW5lIEZGVF9SQUQyX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogLyoqCiAgKiBcYnJpZWYgUGVyZm9ybWUgYW4gaW5wbGFjZSAgY29tcGxleCB2YWx1ZWQgRkZUIG9mIDJebiBsZW5ndGgKICAqCi0gKiBccGFyYW0geCBJbnB1dC9PdXRwdXQgZGF0YSBidWZmZXIuIFRoZSBpbnB1dCBkYXRhIG11c3QgaGF2ZSBhdCBsZWFzdCAxIGJpdCBzY2FsZSBoZWFkcm9vbS4KLSAqICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlIGludGVybGVhdmVkLCByZWFsL2ltYWcgcGFpcnMuCisgKiBccGFyYW0geCBJbnB1dC9PdXRwdXQgZGF0YSBidWZmZXIuIFRoZSBpbnB1dCBkYXRhIG11c3QgaGF2ZSBhdCBsZWFzdCAxIGJpdAorICogc2NhbGUgaGVhZHJvb20uIFRoZSB2YWx1ZXMgYXJlIGludGVybGVhdmVkLCByZWFsL2ltYWcgcGFpcnMuCiAgKiBccGFyYW0gbGRuIGxvZzIgb2YgRkZUIGxlbmd0aAotICogXHBhcmFtIHRyaWdkYXRhIFBvaW50ZXIgdG8gYSBzaW5ldGFibGUgb2YgYSBsZW5ndGggb2YgYXQgbGVhc3QgKDJebGRuKS8yIHNpbmUgdmFsdWVzLgorICogXHBhcmFtIHRyaWdkYXRhIFBvaW50ZXIgdG8gYSBzaW5ldGFibGUgb2YgYSBsZW5ndGggb2YgYXQgbGVhc3QgKDJebGRuKS8yIHNpbmUKKyAqIHZhbHVlcy4KICAqIFxwYXJhbSB0cmlnRGF0YVNpemUgbGVuZ3RoIG9mIHRoZSBzaW5ldGFibGUgInRyaWdkYXRhIi4KICAqLwotdm9pZCBkaXRfZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsIGNvbnN0IElOVCB0cmlnRGF0YVNpemUpIDsKK3ZvaWQgZGl0X2ZmdChGSVhQX0RCTCAqeCwgY29uc3QgSU5UIGxkbiwgY29uc3QgRklYUF9TVFAgKnRyaWdkYXRhLAorICAgICAgICAgICAgIGNvbnN0IElOVCB0cmlnRGF0YVNpemUpOwogCi0vKioKLSAqIFxicmllZiBQZXJmb3JtZSBhbiBpbnBsYWNlIGNvbXBsZXggdmFsdWVkIGludmVyc2UgRkZUIG9mIDJebiBsZW5ndGgKLSAqCi0gKiBccGFyYW0geCBJbnB1dC9PdXRwdXQgZGF0YSBidWZmZXIuIFRoZSBpbnB1dCBkYXRhIG11c3QgaGF2ZSBhdCBsZWFzdCAxIGJpdCBzY2FsZSBoZWFkcm9vbS4KLSAqICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlIGludGVybGVhdmVkLCByZWFsL2ltYWcgcGFpcnMuCi0gKiBccGFyYW0gbGRuIGxvZzIgb2YgRkZUIGxlbmd0aAotICogXHBhcmFtIHRyaWdkYXRhIFBvaW50ZXIgdG8gYSBzaW5ldGFibGUgb2YgYSBsZW5ndGggb2YgYXQgbGVhc3QgKDJebGRuKS8yIHNpbmUgdmFsdWVzLgotICogXHBhcmFtIHRyaWdEYXRhU2l6ZSBsZW5ndGggb2YgdGhlIHNpbmV0YWJsZSAidHJpZ2RhdGEiLgotICovCi12b2lkIGRpdF9pZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsIGNvbnN0IElOVCB0cmlnRGF0YVNpemUpIDsKLQotLyogUmVzdCBvZiB0aGUgd29ybGQuICovCi0KLSNkZWZpbmUgU0NBTEVGQUNUT1IyMDQ4ICAgICAgIDEwCi0jZGVmaW5lIFNDQUxFRkFDVE9SMTAyNCAgICAgICAgOQotI2RlZmluZSBTQ0FMRUZBQ1RPUjUxMiAgICAgICAgIDgKLSNkZWZpbmUgU0NBTEVGQUNUT1IyNTYgICAgICAgICA3Ci0jZGVmaW5lIFNDQUxFRkFDVE9SMTI4ICAgICAgICAgNgotI2RlZmluZSBTQ0FMRUZBQ1RPUjY0ICAgICAgICAgIDUKLSNkZWZpbmUgU0NBTEVGQUNUT1IzMiAgICAgICAgICA0Ci0jZGVmaW5lIFNDQUxFRkFDVE9SMTYgICAgICAgICAgMwotI2RlZmluZSBTQ0FMRUZBQ1RPUjggICAgICAgICAgIDIKLSNkZWZpbmUgU0NBTEVGQUNUT1I0ICAgICAgICAgICAxCi0jZGVmaW5lIFNDQUxFRkFDVE9SMiAgICAgICAgICAgMQotCi0jZW5kaWYgLyogX0ZGVF9SQUQyX0ggKi8KLQorI2VuZGlmIC8qIEZGVF9SQUQyX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2ZpeG1hZGQuaCBiL2xpYkZESy9pbmNsdWRlL2ZpeG1hZGQuaAppbmRleCA4NTFiN2EyLi4xNjcyNDU2IDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9maXhtYWRkLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvZml4bWFkZC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE3ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmICFkZWZpbmVkKF9fRklYTUFERF9IX18pCi0jZGVmaW5lIF9fRklYTUFERF9IX18KKyNpZiAhZGVmaW5lZChGSVhNQUREX0gpCisjZGVmaW5lIEZJWE1BRERfSAogCiAjaW5jbHVkZSAiRkRLX2FyY2hkZWYuaCIKICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKQEAgLTk4LDkgKzExMCw2IEBACiAjaWYgZGVmaW5lZChfX2FybV9fKQogI2luY2x1ZGUgImFybS9maXhtYWRkX2FybS5oIgogCi0jZWxpZiBkZWZpbmVkKF9fbWlwc19fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCi0jaW5jbHVkZSAibWlwcy9maXhtYWRkX21pcHMuaCIKLQogI2VuZGlmIC8qIGFsbCBjb3JlcyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTEyLDEyICsxMjEsMTMgQEAKIC8qIERpdmlkZSBieSB0d28gdmVyc2lvbnMuICovCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtYWRkZGl2Ml9ERCkKLWlubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikKLSAgICAgICAgICAgIHsgcmV0dXJuICh4ICsgZk11bHREaXYyIChhLCBiKSk7IH0KK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9ERChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisgIHJldHVybiAoeCArIGZNdWx0RGl2MihhLCBiKSk7Cit9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRkaXYyX1NEKQotaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyX1NEIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CitpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfU0QoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9EQkwgYikgewogI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0RTCiAgIHJldHVybiBmaXhtYWRkZGl2Ml9EUyh4LCBiLCBhKTsKICNlbHNlCkBAIC0xMjcsNyArMTM3LDcgQEAKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZGRpdjJfRFMpCi1pbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfRFMgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9EUyhGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CiAjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJfU0QKICAgcmV0dXJuIGZpeG1hZGRkaXYyX1NEKHgsIGIsIGEpOwogI2Vsc2UKQEAgLTEzNywxNyArMTQ3LDE5IEBACiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRkaXYyX1NTKQotaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyX1NTIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX1NHTCBiKQotICAgICAgICAgICAgeyByZXR1cm4geCArIGZNdWx0RGl2MihhLGIpOyB9CitpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfU1MoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikgeworICByZXR1cm4geCArIGZNdWx0RGl2MihhLCBiKTsKK30KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXN1YmRpdjJfREQpCi1pbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJfREQgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpCi0gICAgICAgICAgICB7IHJldHVybiAoeCAtIGZNdWx0RGl2MiAoYSwgYikpOyB9CitpbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJfREQoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgeworICByZXR1cm4gKHggLSBmTXVsdERpdjIoYSwgYikpOworfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtc3ViZGl2Ml9TRCkKLWlubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2Ml9TRCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9EQkwgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyX1NEKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKICNpZmRlZiBGVU5DVElPTl9maXhtc3ViZGl2Ml9EUwogICByZXR1cm4gZml4bXN1YmRpdjJfRFMoeCwgYiwgYSk7CiAjZWxzZQpAQCAtMTU3LDcgKzE2OSw3IEBACiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJkaXYyX0RTKQotaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyX0RTIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CitpbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJfRFMoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9TR0wgYikgewogI2lmZGVmIEZVTkNUSU9OX2ZpeG1zdWJkaXYyX1NECiAgIHJldHVybiBmaXhtc3ViZGl2Ml9TRCh4LCBiLCBhKTsKICNlbHNlCkBAIC0xNjcsMjAgKzE3OSwyMiBAQAogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtc3ViZGl2Ml9TUykKLWlubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2Ml9TUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikKLSAgICAgICAgICAgIHsgcmV0dXJuIHggLSBmTXVsdERpdjIoYSxiKTsgfQoraW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyX1NTKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKKyAgcmV0dXJuIHggLSBmTXVsdERpdjIoYSwgYik7Cit9CiAjZW5kaWYKIAotCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9ERCkKICNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9ERAotaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyQml0RXhhY3RfREQgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2MkJpdEV4YWN0X0REKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBiKSB7CiAgIHJldHVybiB4ICsgZk11bHREaXYyQml0RXhhY3QoYSwgYik7CiB9CiAjZW5kaWYKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X1NEKQogI2RlZmluZSBGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X1NECi1pbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJCaXRFeGFjdF9TRCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9EQkwgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyQml0RXhhY3RfU0QoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGIpIHsKICNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X0RTCiAgIHJldHVybiBmaXhtYWRkZGl2MkJpdEV4YWN0X0RTKHgsIGIsIGEpOwogI2Vsc2UKQEAgLTE5MCw3ICsyMDQsOCBAQAogI2VuZGlmCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9EUykKICNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9EUwotaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyQml0RXhhY3RfRFMgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2MkJpdEV4YWN0X0RTKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBiKSB7CiAjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9TRAogICByZXR1cm4gZml4bWFkZGRpdjJCaXRFeGFjdF9TRCh4LCBiLCBhKTsKICNlbHNlCkBAIC0yMDEsMTMgKzIxNiwxNSBAQAogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9ERCkKICNkZWZpbmUgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9ERAotaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyQml0RXhhY3RfREQgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKK2lubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2MkJpdEV4YWN0X0REKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBiKSB7CiAgIHJldHVybiB4IC0gZk11bHREaXYyQml0RXhhY3QoYSwgYik7CiB9CiAjZW5kaWYKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X1NEKQogI2RlZmluZSBGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X1NECi1pbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJCaXRFeGFjdF9TRCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9EQkwgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyQml0RXhhY3RfU0QoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGIpIHsKICNpZmRlZiBGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X0RTCiAgIHJldHVybiBmaXhtc3ViZGl2MkJpdEV4YWN0X0RTKHgsIGIsIGEpOwogI2Vsc2UKQEAgLTIxNyw3ICsyMzQsOCBAQAogI2VuZGlmCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9EUykKICNkZWZpbmUgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9EUwotaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyQml0RXhhY3RfRFMgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKK2lubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2MkJpdEV4YWN0X0RTKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBiKSB7CiAjaWZkZWYgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9TRAogICByZXR1cm4gZml4bXN1YmRpdjJCaXRFeGFjdF9TRCh4LCBiLCBhKTsKICNlbHNlCkBAIC0yMjYsMTQgKzI0NCwxNSBAQAogfQogI2VuZGlmCiAKLS8qIE5vcm1hbCB2ZXJzaW9ucyAqLworICAvKiBOb3JtYWwgdmVyc2lvbnMgKi8KIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRfREQpCi1pbmxpbmUgRklYUF9EQkwgZml4bWFkZF9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikKLSAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyX0REKHgsYSxiKTw8MTsgfQoraW5saW5lIEZJWFBfREJMIGZpeG1hZGRfREQoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bWFkZGRpdjJfREQoeCwgYSwgYikgPDwgMTsKK30KICNlbmRpZgogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRfU0QpCi1pbmxpbmUgRklYUF9EQkwgZml4bWFkZF9TRCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9EQkwgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1hZGRfU0QoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9EQkwgYikgewogI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRfRFMKICAgcmV0dXJuIGZpeG1hZGRfRFMoeCwgYiwgYSk7CiAjZWxzZQpAQCAtMjQyLDcgKzI2MSw3IEBACiB9CiAjZW5kaWYKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtYWRkX0RTKQotaW5saW5lIEZJWFBfREJMIGZpeG1hZGRfRFMgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkX0RTKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKICNpZmRlZiBGVU5DVElPTl9maXhtYWRkX1NECiAgIHJldHVybiBmaXhtYWRkX1NEKHgsIGIsIGEpOwogI2Vsc2UKQEAgLTI1MSwxNiArMjcwLDE4IEBACiB9CiAjZW5kaWYKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtYWRkX1NTKQotaW5saW5lIEZJWFBfREJMIGZpeG1hZGRfU1MgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEsIGNvbnN0IEZJWFBfU0dMIGIpCi0gICAgICAgICAgICB7IHJldHVybiAoeCArIGZNdWx0RGl2MihhLGIpKTw8MTsgfQoraW5saW5lIEZJWFBfREJMIGZpeG1hZGRfU1MoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikgeworICByZXR1cm4gKHggKyBmTXVsdERpdjIoYSwgYikpIDw8IDE7Cit9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJfREQpCi1pbmxpbmUgRklYUF9EQkwgZml4bXN1Yl9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikKLSAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyX0REKHgsYSxiKTw8MTsgfQoraW5saW5lIEZJWFBfREJMIGZpeG1zdWJfREQoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bXN1YmRpdjJfREQoeCwgYSwgYikgPDwgMTsKK30KICNlbmRpZgogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJfU0QpCi1pbmxpbmUgRklYUF9EQkwgZml4bXN1Yl9TRCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9EQkwgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1zdWJfU0QoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9EQkwgYikgewogI2lmZGVmIEZVTkNUSU9OX2ZpeG1zdWJfRFMKICAgcmV0dXJuIGZpeG1zdWJfRFMoeCwgYiwgYSk7CiAjZWxzZQpAQCAtMjY5LDcgKzI5MCw3IEBACiB9CiAjZW5kaWYKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtc3ViX0RTKQotaW5saW5lIEZJWFBfREJMIGZpeG1zdWJfRFMgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKK2lubGluZSBGSVhQX0RCTCBmaXhtc3ViX0RTKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKICNpZmRlZiBGVU5DVElPTl9maXhtc3ViX1NECiAgIHJldHVybiBmaXhtc3ViX1NEKHgsIGIsIGEpOwogI2Vsc2UKQEAgLTI3OCwyOSArMjk5LDM1IEBACiB9CiAjZW5kaWYKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtc3ViX1NTKQotaW5saW5lIEZJWFBfREJMIGZpeG1zdWJfU1MgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEsIGNvbnN0IEZJWFBfU0dMIGIpCi0gICAgICAgICAgICB7IHJldHVybiAoeCAtIGZNdWx0RGl2MihhLGIpKTw8MTsgfQoraW5saW5lIEZJWFBfREJMIGZpeG1zdWJfU1MoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikgeworICByZXR1cm4gKHggLSBmTXVsdERpdjIoYSwgYikpIDw8IDE7Cit9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeHBvdzJhZGRkaXYyX0QpCi1pbmxpbmUgSU5UIGZpeHBhZGRkaXYyX0QgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEpCi0gICAgICAgICAgICB7IHJldHVybiAoeCArIGZQb3cyRGl2MihhKSk7IH0KKyNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2Ml9ERAorI2RlZmluZSBmaXhwYWRkZGl2Ml9EKHgsIGEpIGZpeG1hZGRkaXYyX0REKHgsIGEsIGEpCisjZWxzZQoraW5saW5lIElOVCBmaXhwYWRkZGl2Ml9EKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEpIHsKKyAgcmV0dXJuICh4ICsgZlBvdzJEaXYyKGEpKTsKK30KKyNlbmRpZgogI2VuZGlmCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4cG93MmFkZF9EKQotaW5saW5lIElOVCBmaXhwYWRkX0QgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEpCi0gICAgICAgICAgICB7ICByZXR1cm4gKHggKyBmUG93MihhKSk7IH0KK2lubGluZSBJTlQgZml4cGFkZF9EKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEpIHsgcmV0dXJuICh4ICsgZlBvdzIoYSkpOyB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeHBvdzJhZGRkaXYyX1MpCi1pbmxpbmUgSU5UIGZpeHBhZGRkaXYyX1MgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEpCi0gICAgICAgICAgICB7IHJldHVybiAoeCArIGZQb3cyRGl2MihhKSk7IH0KKyNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2Ml9TUworI2RlZmluZSBmaXhwYWRkZGl2Ml9TKHgsIGEpIGZpeG1hZGRkaXYyX1NTKHgsIGEsIGEpCisjZWxzZQoraW5saW5lIElOVCBmaXhwYWRkZGl2Ml9TKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEpIHsKKyAgcmV0dXJuICh4ICsgZlBvdzJEaXYyKGEpKTsKK30KKyNlbmRpZgogI2VuZGlmCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4cG93MmFkZF9TKQotaW5saW5lIElOVCBmaXhwYWRkX1MgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEpCi0gICAgICAgICAgICB7ICByZXR1cm4gKHggKyBmUG93MihhKSk7IH0KK2lubGluZSBJTlQgZml4cGFkZF9TKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEpIHsgcmV0dXJuICh4ICsgZlBvdzIoYSkpOyB9CiAjZW5kaWYKIAotCi0KLSNlbmRpZiAvLyBfX0ZJWE1BRERfSF9fCi0KKyNlbmRpZiAvKiBGSVhNQUREX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2ZpeG1pbm1heC5oIGIvbGliRkRLL2luY2x1ZGUvZml4bWlubWF4LmgKaW5kZXggNWE1MjgyNC4uNjllZjM1ZCAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvZml4bWlubWF4LmgKKysrIGIvbGliRkRLL2luY2x1ZGUvZml4bWlubWF4LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDIgKzkwLDQyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgorCiAgICBEZXNjcmlwdGlvbjogbWluL21heCBpbmxpbmUgZnVuY3Rpb25zIGFuZCBkZWZpbmVzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgRklYTUlOTUFYX19ICi0jZGVmaW5lIEZJWE1JTk1BWF9fSAorI2lmbmRlZiBGSVhNSU5NQVhfSAorI2RlZmluZSBGSVhNSU5NQVhfSAogCiAjaW5jbHVkZSAiRkRLX2FyY2hkZWYuaCIKICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKIAotLyogSW5saW5lIEZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgc21hbGxlci9iaWdnZXIgdmFsdWUgb2YgdHdvIHZhbHVlcyB3aXRoIHNhbWUgdHlwZS4gKi8KKy8qIElubGluZSBGdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIHNtYWxsZXIvYmlnZ2VyIHZhbHVlIG9mIHR3byB2YWx1ZXMgd2l0aCBzYW1lCisgKiB0eXBlLiAqLwogCi0KLXRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgVCBmaXhtaW4gKFQgYSwgVCBiKQotewotCXJldHVybiAoYSA8IGIgPyBhIDogYik7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBUIGZpeG1pbihUIGEsIFQgYikgeworICByZXR1cm4gKGEgPCBiID8gYSA6IGIpOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIFQgZml4bWF4IChUIGEsIFQgYikKLXsKLQlyZXR1cm4gKGEgPiBiID8gYSA6IGIpOwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgVCBmaXhtYXgoVCBhLCBUIGIpIHsKKyAgcmV0dXJuIChhID4gYiA/IGEgOiBiKTsKIH0KIAotI2RlZmluZSBmaXhtYXhfRChhLGIpIGZpeG1heChhLGIpCi0jZGVmaW5lIGZpeG1pbl9EKGEsYikgZml4bWluKGEsYikKLSNkZWZpbmUgZml4bWF4X1MoYSxiKSBmaXhtYXgoYSxiKQotI2RlZmluZSBmaXhtaW5fUyhhLGIpIGZpeG1pbihhLGIpCi0jZGVmaW5lIGZpeG1heF9JKGEsYikgZml4bWF4KGEsYikKLSNkZWZpbmUgZml4bWluX0koYSxiKSBmaXhtaW4oYSxiKQotI2RlZmluZSBmaXhtYXhfVUkoYSxiKSBmaXhtYXgoYSxiKQotI2RlZmluZSBmaXhtaW5fVUkoYSxiKSBmaXhtaW4oYSxiKQotCisjZGVmaW5lIGZpeG1heF9EKGEsIGIpIGZpeG1heChhLCBiKQorI2RlZmluZSBmaXhtaW5fRChhLCBiKSBmaXhtaW4oYSwgYikKKyNkZWZpbmUgZml4bWF4X1MoYSwgYikgZml4bWF4KGEsIGIpCisjZGVmaW5lIGZpeG1pbl9TKGEsIGIpIGZpeG1pbihhLCBiKQorI2RlZmluZSBmaXhtYXhfSShhLCBiKSBmaXhtYXgoYSwgYikKKyNkZWZpbmUgZml4bWluX0koYSwgYikgZml4bWluKGEsIGIpCisjZGVmaW5lIGZpeG1heF9VSShhLCBiKSBmaXhtYXgoYSwgYikKKyNkZWZpbmUgZml4bWluX1VJKGEsIGIpIGZpeG1pbihhLCBiKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2ZpeG11bC5oIGIvbGliRkRLL2luY2x1ZGUvZml4bXVsLmgKaW5kZXggZWE0YmM2Yy4uYTUxY2EwYyAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvZml4bXVsLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvZml4bXVsLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjkgKzkwLDI5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgU3RlZmFuIEdld2lubmVyCisKICAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBtdWx0aXBsaWNhdGlvbgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgIWRlZmluZWQoX19GSVhNVUxfSF9fKQotI2RlZmluZSBfX0ZJWE1VTF9IX18KKyNpZiAhZGVmaW5lZChGSVhNVUxfSCkKKyNkZWZpbmUgRklYTVVMX0gKIAogI2luY2x1ZGUgIkZES19hcmNoZGVmLmgiCiAjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCiAKLQogI2lmIGRlZmluZWQoX19hcm1fXykKICNpbmNsdWRlICJhcm0vZml4bXVsX2FybS5oIgogCi0jZWxpZiBkZWZpbmVkKF9fbWlwc19fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKQogI2luY2x1ZGUgIm1pcHMvZml4bXVsX21pcHMuaCIKIAotI2VsaWYgZGVmaW5lZChfX3g4Nl9fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisjZWxpZiBkZWZpbmVkKF9feDg2X18pCiAjaW5jbHVkZSAieDg2L2ZpeG11bF94ODYuaCIKIAogI2VuZGlmIC8qIGFsbCBjb3JlcyAqLwpAQCAtMTE0LDE3MyArMTI1LDE3MSBAQAogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXVsZGl2Ml9ERCkKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2Ml9ERAotI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19DQ19BUk0pIHx8IGRlZmluZWQoX19BTkFMT0dfRVhURU5TSU9OU19fKSB8fCBkZWZpbmVkKF9fVElfQ09NUElMRVJfVkVSU0lPTl9fKQotI3ByYWdtYSBtZXNzYWdlICgiRXh0cmVtZWx5IHNsb3cgaW1wbGVtZW50YXRpb24gb2YgZml4bXVsZGl2Ml9ERCAhISIpCi0jZWxzZQotI3dhcm5pbmcgRXh0cmVtZWx5IHNsb3cgaW1wbGVtZW50YXRpb24gb2YgZml4bXVsZGl2Ml9ERCAhIQotI2VuZGlmCi1pbmxpbmUgTE9ORyBmaXhtdWxkaXYyX0REIChjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikKLXsKLSAgcmV0dXJuIChMT05HKSAoKCgoSU5UNjQpYSkgKiBiKSA+PiAzMikgOworaW5saW5lIExPTkcgZml4bXVsZGl2Ml9ERChjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikgeworICByZXR1cm4gKExPTkcpKCgoKElOVDY0KWEpICogYikgPj4gMzIpOwogfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfREQpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9ERAotI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19DQ19BUk0pIHx8IGRlZmluZWQoX19BTkFMT0dfRVhURU5TSU9OU19fKSB8fCBkZWZpbmVkKF9fVElfQ09NUElMRVJfVkVSU0lPTl9fKQotI3ByYWdtYSBtZXNzYWdlICgiRXh0cmVtZWx5IHNsb3cgaW1wbGVtZW50YXRpb24gb2YgZml4bXVsZGl2MkJpdEV4YWN0X0REICEhIikKLSNlbHNlCi0jd2FybmluZyBFeHRyZW1lbHkgc2xvdyBpbXBsZW1lbnRhdGlvbiBvZiBmaXhtdWxkaXYyQml0RXhhY3RfREQgISEKLSNlbmRpZgotaW5saW5lIExPTkcgZml4bXVsZGl2MkJpdEV4YWN0X0REIChjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikKLXsKLSAgcmV0dXJuIChMT05HKSAoKCgoSU5UNjQpYSkgKiBiKSA+PiAzMikgOworaW5saW5lIExPTkcgZml4bXVsZGl2MkJpdEV4YWN0X0REKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKSB7CisgIHJldHVybiAoTE9ORykoKCgoSU5UNjQpYSkgKiBiKSA+PiAzMik7CiB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG11bF9ERCkKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsX0RECi1pbmxpbmUgTE9ORyBmaXhtdWxfREQgKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQotICB7IHJldHVybiBmaXhtdWxkaXYyX0REIChhLCBiKSA8PCAxIDsgfQoraW5saW5lIExPTkcgZml4bXVsX0REKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKSB7CisgIHJldHVybiBmaXhtdWxkaXYyX0REKGEsIGIpIDw8IDE7Cit9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X0REKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9ERAotI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19DQ19BUk0pIHx8IGRlZmluZWQoX19BTkFMT0dfRVhURU5TSU9OU19fKSB8fCBkZWZpbmVkKF9fVElfQ09NUElMRVJfVkVSU0lPTl9fKSB8fCBkZWZpbmVkKF9fWFRFTlNBX18pCi0jcHJhZ21hIG1lc3NhZ2UgKCJFeHRyZW1lbHkgc2xvdyBpbXBsZW1lbnRhdGlvbiBvZiBmaXhtdWxCaXRFeGFjdF9ERCAhISIpCi0jZWxzZQotI3dhcm5pbmcgRXh0cmVtZWx5IHNsb3cgaW1wbGVtZW50YXRpb24gb2YgZml4bXVsQml0RXhhY3RfREQgISEKLSNlbmRpZgotaW5saW5lIExPTkcgZml4bXVsQml0RXhhY3RfREQgKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQotewotICByZXR1cm4gKCAoTE9ORykgKCgoKElOVDY0KWEpICogYikgPj4gMzIpICkgPDwgMTsKK2lubGluZSBMT05HIGZpeG11bEJpdEV4YWN0X0REKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKSB7CisgIHJldHVybiAoKExPTkcpKCgoKElOVDY0KWEpICogYikgPj4gMzIpKSA8PCAxOwogfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxkaXYyX1NTKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyX1NTCi1pbmxpbmUgTE9ORyBmaXhtdWxkaXYyX1NTIChjb25zdCBTSE9SVCBhLCBjb25zdCBTSE9SVCBiKQotICB7IHJldHVybiAoKExPTkcpYSpiKTsgfQoraW5saW5lIExPTkcgZml4bXVsZGl2Ml9TUyhjb25zdCBTSE9SVCBhLCBjb25zdCBTSE9SVCBiKSB7CisgIHJldHVybiAoKExPTkcpYSAqIGIpOworfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxfU1MpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bF9TUwotaW5saW5lIExPTkcgZml4bXVsX1NTIChjb25zdCBTSE9SVCBhLCBjb25zdCBTSE9SVCBiKQotICB7IHJldHVybiAoYSpiKSA8PDE7IH0KK2lubGluZSBMT05HIGZpeG11bF9TUyhjb25zdCBTSE9SVCBhLCBjb25zdCBTSE9SVCBiKSB7IHJldHVybiAoYSAqIGIpIDw8IDE7IH0KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXVsZGl2Ml9TRCkKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2Ml9TRAotaW5saW5lIExPTkcgZml4bXVsZGl2Ml9TRCAoY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKQoraW5saW5lIExPTkcgZml4bXVsZGl2Ml9TRChjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpCiAjaWZkZWYgRlVOQ1RJT05fZml4bXVsZGl2Ml9EUwotICB7IHJldHVybiBmaXhtdWxkaXYyX0RTKGIsIGEpOyB9Cit7CisgIHJldHVybiBmaXhtdWxkaXYyX0RTKGIsIGEpOworfQogI2Vsc2UKLSAgeyByZXR1cm4gZml4bXVsZGl2Ml9ERChGWF9TR0wyRlhfREJMKGEpLCBiKTsgfQoreworICByZXR1cm4gZml4bXVsZGl2Ml9ERChGWF9TR0wyRlhfREJMKGEpLCBiKTsKK30KICNlbmRpZgogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxkaXYyX0RTKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyX0RTCi1pbmxpbmUgTE9ORyBmaXhtdWxkaXYyX0RTIChjb25zdCBMT05HIGEsIGNvbnN0IFNIT1JUIGIpCitpbmxpbmUgTE9ORyBmaXhtdWxkaXYyX0RTKGNvbnN0IExPTkcgYSwgY29uc3QgU0hPUlQgYikKICNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyX1NECi0gIHsgcmV0dXJuIGZpeG11bGRpdjJfU0QoYiwgYSk7IH0KK3sKKyAgcmV0dXJuIGZpeG11bGRpdjJfU0QoYiwgYSk7Cit9CiAjZWxzZQotICB7IHJldHVybiBmaXhtdWxkaXYyX0REKGEsIEZYX1NHTDJGWF9EQkwoYikpOyB9Cit7CisgIHJldHVybiBmaXhtdWxkaXYyX0REKGEsIEZYX1NHTDJGWF9EQkwoYikpOworfQogI2VuZGlmCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9TRCkKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X1NECi1pbmxpbmUgTE9ORyBmaXhtdWxkaXYyQml0RXhhY3RfU0QgKGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKK2lubGluZSBMT05HIGZpeG11bGRpdjJCaXRFeGFjdF9TRChjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpCiAjaWZkZWYgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RTCi0gIHsgcmV0dXJuIGZpeG11bGRpdjJCaXRFeGFjdF9EUyhiLCBhKTsgfQoreworICByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X0RTKGIsIGEpOworfQogI2Vsc2UKLSAgeyByZXR1cm4gKExPTkcpICgoKChJTlQ2NClhKSAqIGIpID4+IDE2KSA7IH0KK3sKKyAgcmV0dXJuIChMT05HKSgoKChJTlQ2NClhKSAqIGIpID4+IDE2KTsKK30KICNlbmRpZgogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfRFMpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9EUwotaW5saW5lIExPTkcgZml4bXVsZGl2MkJpdEV4YWN0X0RTIChjb25zdCBMT05HIGEsIGNvbnN0IFNIT1JUIGIpCitpbmxpbmUgTE9ORyBmaXhtdWxkaXYyQml0RXhhY3RfRFMoY29uc3QgTE9ORyBhLCBjb25zdCBTSE9SVCBiKQogI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9TRAotICB7IHJldHVybiBmaXhtdWxkaXYyQml0RXhhY3RfU0QoYiwgYSk7IH0KK3sKKyAgcmV0dXJuIGZpeG11bGRpdjJCaXRFeGFjdF9TRChiLCBhKTsKK30KICNlbHNlCi0gIHsgcmV0dXJuIChMT05HKSAoKCgoSU5UNjQpYSkgKiBiKSA+PiAxNikgOyB9Cit7CisgIHJldHVybiAoTE9ORykoKCgoSU5UNjQpYSkgKiBiKSA+PiAxNik7Cit9CiAjZW5kaWYKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXVsX1NEKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxfU0QKLWlubGluZSBMT05HIGZpeG11bF9TRCAoY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKSB7CitpbmxpbmUgTE9ORyBmaXhtdWxfU0QoY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKSB7CiAjaWZkZWYgRlVOQ1RJT05fZml4bXVsX0RTCi0gIHJldHVybiBmaXhtdWxfU0QoYiwgYSk7CisgIHJldHVybiBmaXhtdWxfRFMoYiwgYSk7CiAjZWxzZQotICByZXR1cm4gZml4bXVsZGl2Ml9TRCAoYSwgYikgPDwgMSA7CisgIHJldHVybiBmaXhtdWxkaXYyX1NEKGEsIGIpIDw8IDE7CiAjZW5kaWYKIH0KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXVsX0RTKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxfRFMKLWlubGluZSBMT05HIGZpeG11bF9EUyAoY29uc3QgTE9ORyBhLCBjb25zdCBTSE9SVCBiKSB7CitpbmxpbmUgTE9ORyBmaXhtdWxfRFMoY29uc3QgTE9ORyBhLCBjb25zdCBTSE9SVCBiKSB7CiAjaWZkZWYgRlVOQ1RJT05fZml4bXVsX1NECiAgIHJldHVybiBmaXhtdWxfU0QoYiwgYSk7CiAjZWxzZQotICByZXR1cm4gZml4bXVsZGl2Ml9EUyhhLCBiKSA8PCAxIDsKKyAgcmV0dXJuIGZpeG11bGRpdjJfRFMoYSwgYikgPDwgMTsKICNlbmRpZgogfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9TRCkKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfU0QKLWlubGluZSBMT05HIGZpeG11bEJpdEV4YWN0X1NEIChjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpCitpbmxpbmUgTE9ORyBmaXhtdWxCaXRFeGFjdF9TRChjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpCiAjaWZkZWYgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfRFMKLSAgeyByZXR1cm4gZml4bXVsQml0RXhhY3RfRFMoYiwgYSk7IH0KK3sKKyAgcmV0dXJuIGZpeG11bEJpdEV4YWN0X0RTKGIsIGEpOworfQogI2Vsc2UKLSAgeyByZXR1cm4gKExPTkcpICgoKCgoSU5UNjQpYSkgKiBiKSA+PiAxNikgPDwgMSk7IH0KK3sKKyAgcmV0dXJuIChMT05HKSgoKCgoSU5UNjQpYSkgKiBiKSA+PiAxNikgPDwgMSk7Cit9CiAjZW5kaWYKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfRFMpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X0RTCi1pbmxpbmUgTE9ORyBmaXhtdWxCaXRFeGFjdF9EUyAoY29uc3QgTE9ORyBhLCBjb25zdCBTSE9SVCBiKQoraW5saW5lIExPTkcgZml4bXVsQml0RXhhY3RfRFMoY29uc3QgTE9ORyBhLCBjb25zdCBTSE9SVCBiKQogI2lmZGVmIEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X1NECi0gIHsgcmV0dXJuIGZpeG11bEJpdEV4YWN0X1NEKGIsIGEpOyB9Cit7CisgIHJldHVybiBmaXhtdWxCaXRFeGFjdF9TRChiLCBhKTsKK30KICNlbHNlCi0gIHsgcmV0dXJuIChMT05HKSAoKCgoKElOVDY0KWEpICogYikgPj4gMTYpIDw8IDEpOyB9Cit7CisgIHJldHVybiAoTE9ORykoKCgoKElOVDY0KWEpICogYikgPj4gMTYpIDw8IDEpOworfQogI2VuZGlmCiAjZW5kaWYKIAotCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4cG93MmRpdjJfRCkKLSNpZmRlZiBBUkNIX1dBXzE2QklUTVVMVAotI2Vycm9yIEZhbGxiYWNrIGZvciBmaXhwb3cyZGl2Ml9EIGlzIG5vdCAxNiBiaXQgc2FmZSAhCi0jZW5kaWYKICNkZWZpbmUgRlVOQ1RJT05fZml4cG93MmRpdjJfRAotaW5saW5lIExPTkcgZml4cG93MmRpdjJfRCAoY29uc3QgTE9ORyBhKQotICB7IHJldHVybiBmaXhtdWxkaXYyX0REKGEsIGEpOyB9CitpbmxpbmUgTE9ORyBmaXhwb3cyZGl2Ml9EKGNvbnN0IExPTkcgYSkgeyByZXR1cm4gZml4bXVsZGl2Ml9ERChhLCBhKTsgfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhwb3cyX0QpCi0jaWZkZWYgQVJDSF9XQV8xNkJJVE1VTFQKLSNlcnJvciBGYWxsYmFjayBmb3IgZml4cG93Ml9EIGlzIG5vdCAxNiBiaXQgc2FmZSAhCi0jZW5kaWYKICNkZWZpbmUgRlVOQ1RJT05fZml4cG93Ml9ECi1pbmxpbmUgTE9ORyBmaXhwb3cyX0QgKGNvbnN0IExPTkcgYSkKLSAgeyByZXR1cm4gZml4cG93MmRpdjJfRChhKTw8MTsgfQoraW5saW5lIExPTkcgZml4cG93Ml9EKGNvbnN0IExPTkcgYSkgeyByZXR1cm4gZml4cG93MmRpdjJfRChhKSA8PCAxOyB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeHBvdzJkaXYyX1MpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeHBvdzJkaXYyX1MKLWlubGluZSBMT05HIGZpeHBvdzJkaXYyX1MgKGNvbnN0IFNIT1JUIGEpCi0gIHsgcmV0dXJuIGZpeG11bGRpdjJfU1MoYSwgYSk7IH0KK2lubGluZSBMT05HIGZpeHBvdzJkaXYyX1MoY29uc3QgU0hPUlQgYSkgeyByZXR1cm4gZml4bXVsZGl2Ml9TUyhhLCBhKTsgfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhwb3cyX1MpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeHBvdzJfUwotaW5saW5lIExPTkcgZml4cG93Ml9TIChjb25zdCBTSE9SVCBhKQotICB7IHJldHVybiBmaXhwb3cyZGl2Ml9TKGEpPDwxOyB9CitpbmxpbmUgTE9ORyBmaXhwb3cyX1MoY29uc3QgU0hPUlQgYSkgeworICBMT05HIHJlc3VsdCA9IGZpeHBvdzJkaXYyX1MoYSkgPDwgMTsKKyAgcmV0dXJuIHJlc3VsdCBeIChyZXN1bHQgPj4gMzEpOworfQogI2VuZGlmCiAKLQotI2VuZGlmIC8qIF9fRklYTVVMX0hfXyAqLworI2VuZGlmIC8qIEZJWE1VTF9IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9maXhwb2ludF9tYXRoLmggYi9saWJGREsvaW5jbHVkZS9maXhwb2ludF9tYXRoLmgKaW5kZXggNmFhMGE5MC4uMzgwNTg5MiAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvZml4cG9pbnRfbWF0aC5oCisrKyBiL2xpYkZESy9pbmNsdWRlL2ZpeHBvaW50X21hdGguaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyMSArOTAsNzcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNLiBHYXllcgorCiAgICBEZXNjcmlwdGlvbjogRml4ZWQgcG9pbnQgc3BlY2lmaWMgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fZml4cG9pbnRfbWF0aF9ICi0jZGVmaW5lIF9fZml4cG9pbnRfbWF0aF9ICi0KKyNpZm5kZWYgRklYUE9JTlRfTUFUSF9ICisjZGVmaW5lIEZJWFBPSU5UX01BVEhfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgInNjYWxlLmgiCiAKKy8qCisgKiBEYXRhIGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBMRF9EQVRBX1NDQUxJTkcgKDY0LjBmKQorI2RlZmluZSBMRF9EQVRBX1NISUZUIDYgLyogcG93KDIsIExEX0RBVEFfU0hJRlQpID0gTERfREFUQV9TQ0FMSU5HICovCisKKyNkZWZpbmUgTUFYX0xEX1BSRUNJU0lPTiAxMAorI2RlZmluZSBMRF9QUkVDSVNJT04gMTAKKworLyogVGF5bG9yIHNlcmllcyBjb2VmZmljaWVudHMgZm9yIGxuKDEteCksIGNlbnRlcmVkIGF0IDAgKE1hY0xhdXJpbiBwb2x5bm9taWFsKS4KKyAqLworI2lmbmRlZiBMRENPRUZGXzE2QklUCitMTktfU0VDVElPTl9DT05TVERBVEFfTDEKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBsZENvZWZmW01BWF9MRF9QUkVDSVNJT05dID0geworICAgIEZMMkZYQ09OU1RfREJMKC0xLjApLCAgICAgICBGTDJGWENPTlNUX0RCTCgtMS4wIC8gMi4wKSwKKyAgICBGTDJGWENPTlNUX0RCTCgtMS4wIC8gMy4wKSwgRkwyRlhDT05TVF9EQkwoLTEuMCAvIDQuMCksCisgICAgRkwyRlhDT05TVF9EQkwoLTEuMCAvIDUuMCksIEZMMkZYQ09OU1RfREJMKC0xLjAgLyA2LjApLAorICAgIEZMMkZYQ09OU1RfREJMKC0xLjAgLyA3LjApLCBGTDJGWENPTlNUX0RCTCgtMS4wIC8gOC4wKSwKKyAgICBGTDJGWENPTlNUX0RCTCgtMS4wIC8gOS4wKSwgRkwyRlhDT05TVF9EQkwoLTEuMCAvIDEwLjApfTsKKyNlbHNlICAvKiBMRENPRUZGXzE2QklUICovCitMTktfU0VDVElPTl9DT05TVERBVEFfTDEKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBsZENvZWZmW01BWF9MRF9QUkVDSVNJT05dID0geworICAgIEZMMkZYQ09OU1RfU0dMKC0xLjApLCAgICAgICBGTDJGWENPTlNUX1NHTCgtMS4wIC8gMi4wKSwKKyAgICBGTDJGWENPTlNUX1NHTCgtMS4wIC8gMy4wKSwgRkwyRlhDT05TVF9TR0woLTEuMCAvIDQuMCksCisgICAgRkwyRlhDT05TVF9TR0woLTEuMCAvIDUuMCksIEZMMkZYQ09OU1RfU0dMKC0xLjAgLyA2LjApLAorICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAgLyA3LjApLCBGTDJGWENPTlNUX1NHTCgtMS4wIC8gOC4wKSwKKyAgICBGTDJGWENPTlNUX1NHTCgtMS4wIC8gOS4wKSwgRkwyRlhDT05TVF9TR0woLTEuMCAvIDEwLjApfTsKKyNlbmRpZiAvKiBMRENPRUZGXzE2QklUICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBpbnZTcXJ0Tm9ybTIKKyAgICBkZXNjcmlwdGlvbjogIGRlbGl2ZXJzIDEvc3FydChvcCkgbm9ybWFsaXplZCB0byAuNS4uLjEgYW5kIHRoZSBzaGlmdCB2YWx1ZQorb2YgdGhlIE9VVFBVVAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU1FSVF9CSVRTIDcKKyNkZWZpbmUgU1FSVF9WQUxVRVMgKDEyOCArIDIpCisjZGVmaW5lIFNRUlRfQklUU19NQVNLIDB4N2YKKyNkZWZpbmUgU1FSVF9GUkFDVF9CSVRTX01BU0sgMHgwMDdGRkZGRgorCitleHRlcm4gY29uc3QgRklYUF9EQkwgaW52U3FydFRhYltTUVJUX1ZBTFVFU107CisKKy8qCisgKiBIYXJkd2FyZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMKKyAqLworCisjaWYgZGVmaW5lZChfX3g4Nl9fKQorI2luY2x1ZGUgIng4Ni9maXhwb2ludF9tYXRoX3g4Ni5oIgorI2VuZGlmIC8qIHRhcmdldCBhcmNoaXRlY3R1cmUgc2VsZWN0b3IgKi8KKworLyoKKyAqIEZhbGxiYWNrIGltcGxlbWVudGF0aW9ucworICovCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZklzTGVzc1RoYW4pCiAvKioKICAqIFxicmllZiBDb21wYXJlcyB0d28gZml4cG9pbnQgdmFsdWVzIGluY2wuIHNjYWxpbmcuCkBAIC0xMDMsNjEgKzE3MCw4MyBAQAogICogXHBhcmFtIGJfZSBleHBvbmVudCBvZiB0aGUgc2Vjb25kIGlucHV0IHZhbHVlLgogICogXHJldHVybiBub24temVybyBpZiAoYV9tKjJeYV9lKSA8IChiX20qMl5iX2UpLCAwIG90aGVyd2lzZQogICovCi1GREtfSU5MSU5FIElOVCBmSXNMZXNzVGhhbihGSVhQX0RCTCBhX20sIElOVCBhX2UsIEZJWFBfREJMIGJfbSwgSU5UIGJfZSkKLXsKK0ZES19JTkxJTkUgSU5UIGZJc0xlc3NUaGFuKEZJWFBfREJMIGFfbSwgSU5UIGFfZSwgRklYUF9EQkwgYl9tLCBJTlQgYl9lKSB7CiAgIGlmIChhX2UgPiBiX2UpIHsKLSAgICByZXR1cm4gKGJfbSA+PiBmTWluKGFfZS1iX2UsIERGUkFDVF9CSVRTLTEpID4gYV9tKTsKKyAgICByZXR1cm4gKChiX20gPj4gZk1pbihhX2UgLSBiX2UsIERGUkFDVF9CSVRTIC0gMSkpID4gYV9tKTsKICAgfSBlbHNlIHsKLSAgICByZXR1cm4gKGFfbSA+PiBmTWluKGJfZS1hX2UsIERGUkFDVF9CSVRTLTEpIDwgYl9tKTsKKyAgICByZXR1cm4gKChhX20gPj4gZk1pbihiX2UgLSBhX2UsIERGUkFDVF9CSVRTIC0gMSkpIDwgYl9tKTsKICAgfQogfQogCi1GREtfSU5MSU5FIElOVCBmSXNMZXNzVGhhbihGSVhQX1NHTCBhX20sIElOVCBhX2UsIEZJWFBfU0dMIGJfbSwgSU5UIGJfZSkKLXsKK0ZES19JTkxJTkUgSU5UIGZJc0xlc3NUaGFuKEZJWFBfU0dMIGFfbSwgSU5UIGFfZSwgRklYUF9TR0wgYl9tLCBJTlQgYl9lKSB7CiAgIGlmIChhX2UgPiBiX2UpIHsKLSAgICByZXR1cm4gKGJfbSA+PiBmTWluKGFfZS1iX2UsIEZSQUNUX0JJVFMtMSkgPiBhX20pOworICAgIHJldHVybiAoKGJfbSA+PiBmTWluKGFfZSAtIGJfZSwgRlJBQ1RfQklUUyAtIDEpKSA+IGFfbSk7CiAgIH0gZWxzZSB7Ci0gICAgcmV0dXJuIChhX20gPj4gZk1pbihiX2UtYV9lLCBGUkFDVF9CSVRTLTEpIDwgYl9tKTsKKyAgICByZXR1cm4gKChhX20gPj4gZk1pbihiX2UgLSBhX2UsIEZSQUNUX0JJVFMgLSAxKSkgPCBiX20pOwogICB9CiB9CiAjZW5kaWYKIAotCi0KLSNkZWZpbmUgTERfREFUQV9TQ0FMSU5HICg2NC4wZikKLSNkZWZpbmUgTERfREFUQV9TSElGVCAgIDYgICAvKiBwb3coMiwgTERfREFUQV9TSElGVCkgPSBMRF9EQVRBX1NDQUxJTkcgKi8KLQogLyoqCiAgKiBcYnJpZWYgZGVwcmVjYXRlZC4gVXNlIGZMb2cyKCkgaW5zdGVhZC4KICAqLwotRklYUF9EQkwgQ2FsY0xkRGF0YShGSVhQX0RCTCBvcCk7CisjZGVmaW5lIENhbGNMZERhdGEob3ApIGZMb2cyKG9wLCAwKQogCiB2b2lkIExkRGF0YVZlY3RvcihGSVhQX0RCTCAqc3JjVmVjdG9yLCBGSVhQX0RCTCAqZGVzdFZlY3RvciwgSU5UIG51bWJlcik7CiAKLUZJWFBfREJMIENhbGNJbnZMZERhdGEoRklYUF9EQkwgb3ApOworZXh0ZXJuIGNvbnN0IFVJTlQgZXhwMl90YWJfbG9uZ1szMl07CitleHRlcm4gY29uc3QgVUlOVCBleHAyd190YWJfbG9uZ1szMl07CitleHRlcm4gY29uc3QgVUlOVCBleHAyeF90YWJfbG9uZ1szMl07CiAKK0xOS19TRUNUSU9OX0NPREVfTDEKK0ZES19JTkxJTkUgRklYUF9EQkwgQ2FsY0ludkxkRGF0YShjb25zdCBGSVhQX0RCTCB4KSB7CisgIGludCBzZXRfemVybyA9ICh4IDwgRkwyRlhDT05TVF9EQkwoLTMxLjAgLyA2NC4wKSkgPyAwIDogMTsKKyAgaW50IHNldF9tYXggPSAoeCA+PSBGTDJGWENPTlNUX0RCTCgzMS4wIC8gNjQuMCkpIHwgKHggPT0gRkwyRlhDT05TVF9EQkwoMC4wKSk7CiAKLXZvaWQgICAgIEluaXRMZEludCgpOworICBGSVhQX1NHTCBmcmFjID0gKEZJWFBfU0dMKSgoTE9ORyl4ICYgMHgzRkYpOworICBVSU5UIGluZGV4MyA9IChVSU5UKShMT05HKSh4ID4+IDEwKSAmIDB4MUY7CisgIFVJTlQgaW5kZXgyID0gKFVJTlQpKExPTkcpKHggPj4gMTUpICYgMHgxRjsKKyAgVUlOVCBpbmRleDEgPSAoVUlOVCkoTE9ORykoeCA+PiAyMCkgJiAweDFGOworICBpbnQgZXhwID0gZk1pbigzMSwgKCh4ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpID8gKDMxIC0gKGludCkoeCA+PiAyNSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaW50KSgtKHggPj4gMjUpKSkpOworCisgIFVJTlQgbG9va3VwMSA9IGV4cDJfdGFiX2xvbmdbaW5kZXgxXSAqIHNldF96ZXJvOworICBVSU5UIGxvb2t1cDIgPSBleHAyd190YWJfbG9uZ1tpbmRleDJdOworICBVSU5UIGxvb2t1cDMgPSBleHAyeF90YWJfbG9uZ1tpbmRleDNdOworICBVSU5UIGxvb2t1cDNmID0KKyAgICAgIGxvb2t1cDMgKyAoVUlOVCkoTE9ORylmTXVsdERpdjIoKEZJWFBfREJMKSgweDAwMTYzMDJGKSwgKEZJWFBfU0dMKWZyYWMpOworCisgIFVJTlQgbG9va3VwMTIgPSAoVUlOVCkoTE9ORylmTXVsdCgoRklYUF9EQkwpbG9va3VwMSwgKEZJWFBfREJMKWxvb2t1cDIpOworICBVSU5UIGxvb2t1cCA9IChVSU5UKShMT05HKWZNdWx0KChGSVhQX0RCTClsb29rdXAxMiwgKEZJWFBfREJMKWxvb2t1cDNmKTsKKworICBGSVhQX0RCTCByZXRWYWwgPSAobG9va3VwIDw8IDMpID4+IGV4cDsKKworICBpZiAoc2V0X21heCkgeworICAgIHJldFZhbCA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICB9CisKKyAgcmV0dXJuIHJldFZhbDsKK30KKwordm9pZCBJbml0TGRJbnQoKTsKIEZJWFBfREJMIENhbGNMZEludChJTlQgaSk7CiAKIGV4dGVybiBjb25zdCBVU0hPUlQgc3FydF90YWJbNDldOwogCi1pbmxpbmUgRklYUF9EQkwgc3FydEZpeHBfbG9va3VwKEZJWFBfREJMIHgpCi17CitpbmxpbmUgRklYUF9EQkwgc3FydEZpeHBfbG9va3VwKEZJWFBfREJMIHgpIHsKICAgVUlOVCB5ID0gKElOVCl4OwotICBVQ0hBUiBpc196ZXJvPSh5PT0wKTsKLSAgSU5UIHplcm9zPWZpeG5vcm16X0QoeSkgJiAweDFlOwotICB5PDw9emVyb3M7Ci0gIFVJTlQgaWR4PSh5Pj4yNiktMTY7Ci0gIFVTSE9SVCBmcmFjPSh5Pj4xMCkmMHhmZmZmOwotICBVU0hPUlQgbmZyYWM9MHhmZmZmXmZyYWM7Ci0gIFVJTlQgdD1uZnJhYypzcXJ0X3RhYltpZHhdK2ZyYWMqc3FydF90YWJbaWR4KzFdOwotICB0PXQ+Pih6ZXJvcz4+MSk7Ci0gIHJldHVybihpc196ZXJvID8gMCA6IHQpOworICBVQ0hBUiBpc196ZXJvID0gKHkgPT0gMCk7CisgIElOVCB6ZXJvcyA9IGZpeG5vcm16X0QoeSkgJiAweDFlOworICB5IDw8PSB6ZXJvczsKKyAgVUlOVCBpZHggPSAoeSA+PiAyNikgLSAxNjsKKyAgVVNIT1JUIGZyYWMgPSAoeSA+PiAxMCkgJiAweGZmZmY7CisgIFVTSE9SVCBuZnJhYyA9IDB4ZmZmZiBeIGZyYWM7CisgIFVJTlQgdCA9IChVSU5UKW5mcmFjICogc3FydF90YWJbaWR4XSArIChVSU5UKWZyYWMgKiBzcXJ0X3RhYltpZHggKyAxXTsKKyAgdCA9IHQgPj4gKHplcm9zID4+IDEpOworICByZXR1cm4gKGlzX3plcm8gPyAwIDogdCk7CiB9CiAKLWlubGluZSBGSVhQX0RCTCBzcXJ0Rml4cF9sb29rdXAoRklYUF9EQkwgeCwgSU5UICp4X2UpCi17CitpbmxpbmUgRklYUF9EQkwgc3FydEZpeHBfbG9va3VwKEZJWFBfREJMIHgsIElOVCAqeF9lKSB7CiAgIFVJTlQgeSA9IChJTlQpeDsKICAgSU5UIGU7CiAKQEAgLTE2NiwxMDYgKzI1NSwxNTMgQEAKICAgfQogCiAgIC8qIE5vcm1hbGl6ZSAqLwotICBlPWZpeG5vcm16X0QoeSk7Ci0gIHk8PD1lOwotICBlICA9ICp4X2UgLSBlICsgMjsKKyAgZSA9IGZpeG5vcm16X0QoeSk7CisgIHkgPDw9IGU7CisgIGUgPSAqeF9lIC0gZSArIDI7CiAKICAgLyogQ29ycmVjdCBvZGQgZXhwb25lbnQuICovCiAgIGlmIChlICYgMSkgewogICAgIHkgPj49IDE7Ci0gICAgZSArKzsKKyAgICBlKys7CiAgIH0KICAgLyogR2V0IHNxdWFyZSByb290ICovCi0gIFVJTlQgaWR4PSh5Pj4yNiktMTY7Ci0gIFVTSE9SVCBmcmFjPSh5Pj4xMCkmMHhmZmZmOwotICBVU0hPUlQgbmZyYWM9MHhmZmZmXmZyYWM7Ci0gIFVJTlQgdD1uZnJhYypzcXJ0X3RhYltpZHhdK2ZyYWMqc3FydF90YWJbaWR4KzFdOworICBVSU5UIGlkeCA9ICh5ID4+IDI2KSAtIDE2OworICBVU0hPUlQgZnJhYyA9ICh5ID4+IDEwKSAmIDB4ZmZmZjsKKyAgVVNIT1JUIG5mcmFjID0gMHhmZmZmIF4gZnJhYzsKKyAgVUlOVCB0ID0gKFVJTlQpbmZyYWMgKiBzcXJ0X3RhYltpZHhdICsgKFVJTlQpZnJhYyAqIHNxcnRfdGFiW2lkeCArIDFdOwogCiAgIC8qIFdyaXRlIGJhY2sgZXhwb25lbnQgKi8KICAgKnhfZSA9IGUgPj4gMTsKLSAgcmV0dXJuIChGSVhQX0RCTCkoTE9ORykodD4+MSk7CisgIHJldHVybiAoRklYUF9EQkwpKExPTkcpKHQgPj4gMSk7CiB9CiAKLQotCi1GSVhQX0RCTCBzcXJ0Rml4cChGSVhQX0RCTCBvcCk7Ci0KIHZvaWQgSW5pdEludlNxcnRUYWIoKTsKIAotRklYUF9EQkwgaW52U3FydE5vcm0yKEZJWFBfREJMIG9wLCBJTlQgKnNoaWZ0KTsKLQorI2lmbmRlZiBGVU5DVElPTl9pbnZTcXJ0Tm9ybTIKKy8qKgorICogXGJyaWVmIGNhbGN1bGF0ZSAxLjAvc3FydChvcCkKKyAqIFxwYXJhbSBvcF9tIG1hbnRpc3NhIG9mIGlucHV0IHZhbHVlLgorICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gcmV0dXJuIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0CisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKKyAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBmdW5jdGlvbm5hbWU6IGludkZpeHAKLSAgICBkZXNjcmlwdGlvbjogIGRlbGl2ZXJzIDEvKG9wKQotCisgIGRlbGl2ZXJzIDEvc3FydChvcCkgbm9ybWFsaXplZCB0byAuNS4uLjEgYW5kIHRoZSBzaGlmdCB2YWx1ZSBvZiB0aGUgT1VUUFVULAorICBpLmUuIHRoZSBkZW5vcm1hbGl6ZWQgcmVzdWx0IGlzIDEvc3FydChvcCkgPSBpbnZTcXJ0Tm9ybShvcCkgKiAyXihzaGlmdCkKKyAgdXNlcyBOZXd0b24taXRlcmF0aW9uIGZvciBhcHByb3hpbWF0aW9uCisgICAgICBRKG4rMSkgPSBRKG4pICsgUShuKSAqICgwLjUgLSAyICogViAqIFEobileMikKKyAgICAgIHdpdGggUSA9IDAuNSogViBeLTAuNTsgMC41IDw9IFYgPCAxLjAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW5saW5lIEZJWFBfREJMIGludkZpeHAoRklYUF9EQkwgb3ApCi17Ci0gICAgSU5UIHRtcF9leHAgOwotICAgIEZJWFBfREJMIHRtcF9pbnYgPSBpbnZTcXJ0Tm9ybTIob3AsICZ0bXBfZXhwKSA7Ci0gICAgRkRLX0FTU0VSVCgoMzEtKDIqdG1wX2V4cCsxKSk+PTApIDsKLSAgICByZXR1cm4gKCBmUG93MkRpdjIoIChGSVhQX0RCTCl0bXBfaW52ICkgPj4gKDMxLSgyKnRtcF9leHArMSkpICkgOworc3RhdGljIEZES19GT1JDRUlOTElORSBGSVhQX0RCTCBpbnZTcXJ0Tm9ybTIoRklYUF9EQkwgb3AsIElOVCAqc2hpZnQpIHsKKyAgRklYUF9EQkwgdmFsID0gb3A7CisgIEZJWFBfREJMIHJlZzEsIHJlZzI7CisKKyAgaWYgKHZhbCA9PSBGTDJGWENPTlNUX0RCTCgwLjApKSB7CisgICAgKnNoaWZ0ID0gMTY7CisgICAgcmV0dXJuICgoTE9ORylNQVhWQUxfREJMKTsgLyogbWF4aW11bSBwb3NpdGl2ZSB2YWx1ZSAqLworICB9CisKKyNkZWZpbmUgSU5WU1FSVE5PUk0yX0xJTkVBUl9JTlRFUlBPTEFURQorI2RlZmluZSBJTlZTUVJUTk9STTJfTElORUFSX0lOVEVSUE9MQVRFX0hRCisKKyAgLyogbm9ybWFsaXplIGlucHV0LCBjYWxjdWxhdGUgc2hpZnQgdmFsdWUgKi8KKyAgRkRLX0FTU0VSVCh2YWwgPiBGTDJGWENPTlNUX0RCTCgwLjApKTsKKyAgKnNoaWZ0ID0gZk5vcm16KHZhbCkgLSAxOyAvKiBDb3VudExlYWRpbmdCaXRzKCkgaXMgbm90IG5lY2Vzc2FyeSBoZXJlIHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCB2YWx1ZSBpcyBhbHdheXMgPiAwICovCisgIHZhbCA8PD0gKnNoaWZ0OyAgICAgICAgICAgLyogbm9ybWFsaXplZCBpbnB1dCBWICovCisgICpzaGlmdCArPSAyOyAgICAgICAgICAgICAgLyogYmlhcyBmb3IgZXhwb25lbnQgKi8KKworI2lmIGRlZmluZWQoSU5WU1FSVE5PUk0yX0xJTkVBUl9JTlRFUlBPTEFURSkKKyAgSU5UIGluZGV4ID0KKyAgICAgIChJTlQpKHZhbCA+PiAoREZSQUNUX0JJVFMgLSAxIC0gKFNRUlRfQklUUyArIDEpKSkgJiBTUVJUX0JJVFNfTUFTSzsKKyAgRklYUF9EQkwgRnJhY3QgPQorICAgICAgKEZJWFBfREJMKSgoKElOVCl2YWwgJiBTUVJUX0ZSQUNUX0JJVFNfTUFTSykgPDwgKFNRUlRfQklUUyArIDEpKTsKKyAgRklYUF9EQkwgZGlmZiA9IGludlNxcnRUYWJbaW5kZXggKyAxXSAtIGludlNxcnRUYWJbaW5kZXhdOworICByZWcxID0gaW52U3FydFRhYltpbmRleF0gKyAoZk11bHREaXYyKGRpZmYsIEZyYWN0KSA8PCAxKTsKKyNpZiBkZWZpbmVkKElOVlNRUlROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEpCisgIC8qIHJlZzEgPSB0W2ldICsgKHRbaSsxXS10W2ldKSpmcmFjdCAuLi4gYWxyZWFkeSBjb21wdXRlZCAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKDEtZnJhY3QpZnJhY3QqKHRbaSsyXS10W2krMV0pLzIgKi8KKyAgaWYgKEZyYWN0ICE9IChGSVhQX0RCTCkwKSB7CisgICAgLyogZnJhY3QgPSBmcmFjdCAqICgxIC0gZnJhY3QpICovCisgICAgRnJhY3QgPSBmTXVsdERpdjIoRnJhY3QsIChGSVhQX0RCTCkoKFVMT05HKTB4ODAwMDAwMDAgLSAoVUxPTkcpRnJhY3QpKSA8PCAxOworICAgIGRpZmYgPSBkaWZmIC0gKGludlNxcnRUYWJbaW5kZXggKyAyXSAtIGludlNxcnRUYWJbaW5kZXggKyAxXSk7CisgICAgcmVnMSA9IGZNdWx0QWRkRGl2MihyZWcxLCBGcmFjdCwgZGlmZik7CisgIH0KKyNlbmRpZiAvKiBJTlZTUVJUTk9STTJfTElORUFSX0lOVEVSUE9MQVRFX0hRICovCisjZWxzZQorI2Vycm9yIFwKKyAgICAiRWl0aGVyIGRlZmluZSBJTlZTUVJUTk9STTJfTkVXVE9OX0lURVJBVEUgb3IgSU5WU1FSVE5PUk0yX0xJTkVBUl9JTlRFUlBPTEFURSIKKyNlbmRpZgorICAvKiBjYWxjdWxhdGUgdGhlIG91dHB1dCBleHBvbmVudCA9IGlucHV0IGV4cC8yICovCisgIGlmICgqc2hpZnQgJiAweDAwMDAwMDAxKSB7IC8qIG9kZCBzaGlmdCB2YWx1ZXMgPyAqLworICAgIC8qIE5vdGU6IERvIG5vdCB1c2Ugcm91bmRlZCB2YWx1ZSAweDVBODI3OTlBIHRvIGF2b2lkIG92ZXJmbG93IHdpdGgKKyAgICAgKiBzaGlmdC1ieS0yICovCisgICAgcmVnMiA9IChGSVhQX0RCTCkweDVBODI3OTk5OworICAgIC8qIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAwODQ0MzYyMTA0ODQ5Zik7Ki8gLyogMS9zcXJ0KDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgcmVnMSA9IGZNdWx0RGl2MihyZWcxLCByZWcyKSA8PCAyOworICB9CisKKyAgKnNoaWZ0ID0gKnNoaWZ0ID4+IDE7CisKKyAgcmV0dXJuIChyZWcxKTsKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9pbnZTcXJ0Tm9ybTIgKi8KKworI2lmbmRlZiBGVU5DVElPTl9zcXJ0Rml4cAorc3RhdGljIEZES19GT1JDRUlOTElORSBGSVhQX0RCTCBzcXJ0Rml4cChGSVhQX0RCTCBvcCkgeworICBJTlQgdG1wX2V4cCA9IDA7CisgIEZJWFBfREJMIHRtcF9pbnYgPSBpbnZTcXJ0Tm9ybTIob3AsICZ0bXBfZXhwKTsKKworICBGREtfQVNTRVJUKHRtcF9leHAgPiAwKTsKKyAgcmV0dXJuICgoRklYUF9EQkwpKGZNdWx0RGl2Migob3AgPDwgKHRtcF9leHAgLSAxKSksIHRtcF9pbnYpIDw8IDIpKTsKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9zcXJ0Rml4cCAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ludkZpeHAKKy8qKgorICogXGJyaWVmIGNhbGN1bGF0ZSAxLjAvb3AKKyAqIFxwYXJhbSBvcCBtYW50aXNzYSBvZiB0aGUgaW5wdXQgdmFsdWUuCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQgd2l0aCBpbXBsaWNpdCBleHBvbmVudCBvZiAzMQorICogXGV4Y2VwdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBvcD0wLDEgc2V0dGluZyBtYXguIHBvc2l0aXZlIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgRklYUF9EQkwgaW52Rml4cChGSVhQX0RCTCBvcCkgeworICBpZiAoKG9wID09IChGSVhQX0RCTCkweDAwMDAwMDAwKSB8fCAob3AgPT0gKEZJWFBfREJMKTB4MDAwMDAwMDEpKSB7CisgICAgcmV0dXJuICgoTE9ORylNQVhWQUxfREJMKTsKKyAgfQorICBJTlQgdG1wX2V4cDsKKyAgRklYUF9EQkwgdG1wX2ludiA9IGludlNxcnROb3JtMihvcCwgJnRtcF9leHApOworICBGREtfQVNTRVJUKCgzMSAtICgyICogdG1wX2V4cCArIDEpKSA+PSAwKTsKKyAgaW50IHNoaWZ0ID0gMzEgLSAoMiAqIHRtcF9leHAgKyAxKTsKKyAgdG1wX2ludiA9IGZQb3cyRGl2Mih0bXBfaW52KTsKKyAgaWYgKHNoaWZ0KSB7CisgICAgdG1wX2ludiA9ICgodG1wX2ludiA+PiAoc2hpZnQgLSAxKSkgKyAoRklYUF9EQkwpMSkgPj4gMTsKKyAgfQorICByZXR1cm4gdG1wX2ludjsKIH0KIAorLyoqCisgKiBcYnJpZWYgY2FsY3VsYXRlIDEuMC8ob3BfbSAqIDJeb3BfZSkKKyAqIFxwYXJhbSBvcF9tIG1hbnRpc3NhIG9mIHRoZSBpbnB1dCB2YWx1ZS4KKyAqIFxwYXJhbSBvcF9lIHBvaW50ZXIgaW50byB3ZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgaW5wdXQgdmFsdWUgaXMgc3RvcmVkLCBhbmQKKyAqIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQgaW50by4KKyAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAorICovCitzdGF0aWMgaW5saW5lIEZJWFBfREJMIGludkZpeHAoRklYUF9EQkwgb3BfbSwgaW50ICpvcF9lKSB7CisgIGlmICgob3BfbSA9PSAoRklYUF9EQkwpMHgwMDAwMDAwMCkgfHwgKG9wX20gPT0gKEZJWFBfREJMKTB4MDAwMDAwMDEpKSB7CisgICAgKm9wX2UgPSAzMSAtICpvcF9lOworICAgIHJldHVybiAoKExPTkcpTUFYVkFMX0RCTCk7CisgIH0KIAorICBJTlQgdG1wX2V4cDsKKyAgRklYUF9EQkwgdG1wX2ludiA9IGludlNxcnROb3JtMihvcF9tLCAmdG1wX2V4cCk7CiAKLSNpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiAoX19HTlVDX189PTIpCi0KLSNkZWZpbmUgRlVOQ1RJT05fc2NodXJfZGl2Ci1pbmxpbmUgRklYUF9EQkwgc2NodXJfZGl2KEZJWFBfREJMIG51bSxGSVhQX0RCTCBkZW51bSwgSU5UIGNvdW50KQotewotICBJTlQgcmVzdWx0LCB0bXAgOwotICAgX19hc21fXyAoInNybCAlMSwgJTIsIDE1XG4iCi0gICAgICAgICAgICAiZGl2ICUzLCAlMVxuIiA6ICI9bG8iIChyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIlZCIgKHRtcCksICJkIiAoZGVudW0pICwgICJkIiAobnVtKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiaGkiICkgOwotICByZXR1cm4gcmVzdWx0PDwxNiA7CisgICpvcF9lID0gKHRtcF9leHAgPDwgMSkgLSAqb3BfZSArIDE7CisgIHJldHVybiBmUG93MkRpdjIodG1wX2ludik7CiB9CisjZW5kaWYgLyogRlVOQ1RJT05faW52Rml4cCAqLwogCi0vKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwotI2VsaWYgZGVmaW5lZChfX21pcHNfXykgJiYgKF9fR05VQ19fPT0zKQorI2lmbmRlZiBGVU5DVElPTl9zY2h1cl9kaXYKIAotI2RlZmluZSBGVU5DVElPTl9zY2h1cl9kaXYKLWlubGluZSBGSVhQX0RCTCBzY2h1cl9kaXYoRklYUF9EQkwgbnVtLEZJWFBfREJMIGRlbnVtLCBJTlQgY291bnQpCi17Ci0gIElOVCByZXN1bHQsIHRtcDsKLQotICAgX19hc21fXyAoInNybCAgJVt0bXBdLCAlW2RlbnVtXSwgMTVcbiIKLSAgICAgICAgICAgICJkaXYgJVtyZXN1bHRdLCAlW251bV0sICVbdG1wXVxuIgotICAgICAgICAgICAgOiBbdG1wXSAiK3IiICh0bXApLCBbcmVzdWx0XSI9ciIocmVzdWx0KQotICAgICAgICAgICAgOiBbZGVudW1dInIiKGRlbnVtKSwgW251bV0iciIobnVtKQotICAgICAgICAgICAgOiAiaGkiLCAibG8iKTsKLSAgcmV0dXJuIHJlc3VsdCA8PCAoREZSQUNUX0JJVFMtMTYpOwotfQotCi0vKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwotI2VsaWYgZGVmaW5lZChTSU1VTEFURV9NSVBTX0RJVikKLQotI2RlZmluZSBGVU5DVElPTl9zY2h1cl9kaXYKLWlubGluZSBGSVhQX0RCTCBzY2h1cl9kaXYoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW51bSwgSU5UIGNvdW50KQotewotICAgIEZES19BU1NFUlQgKGNvdW50PD1ERlJBQ1RfQklUUy0xKTsKLSAgICBGREtfQVNTRVJUIChudW0+PShGSVhQX0RCTCkwKTsKLSAgICBGREtfQVNTRVJUIChkZW51bT4oRklYUF9EQkwpMCk7Ci0gICAgRkRLX0FTU0VSVCAobnVtIDw9IGRlbnVtKTsKLQotICAgIElOVCB0bXAgPSBkZW51bSA+PiAoY291bnQtMSk7Ci0gICAgSU5UIHJlc3VsdCA9IDA7Ci0KLSAgICB3aGlsZSAobnVtID4gdG1wKQotICAgIHsKLSAgICAgICAgbnVtIC09IHRtcDsKLSAgICAgICAgcmVzdWx0Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdCA8PCAoREZSQUNUX0JJVFMtY291bnQpOwotfQotCi0vKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwotI2VuZGlmIC8qIHRhcmdldCBhcmNoaXRlY3R1cmUgc2VsZWN0b3IgKi8KLQotI2lmICFkZWZpbmVkKEZVTkNUSU9OX3NjaHVyX2RpdikKIC8qKgogICogXGJyaWVmIERpdmlkZSB0d28gRklYUF9EQkwgdmFsdWVzIHdpdGggZ2l2ZW4gcHJlY2lzaW9uLgogICogXHBhcmFtIG51bSBkaXZpZGVuZApAQCAtMjczLDMxICs0MDksMzQgQEAKICAqIFxwYXJhbSBjb3VudCBhbW91bnQgb2Ygc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgcmVzdWx0IChzdGFydGluZyB0byB0aGUgTVNCKQogICogXHJldHVybiBudW0vZGl2aXNvcgogICovCi1GSVhQX0RCTCBzY2h1cl9kaXYoRklYUF9EQkwgbnVtLEZJWFBfREJMIGRlbnVtLCBJTlQgY291bnQpOwotI2VuZGlmCiAKK0ZJWFBfREJMIHNjaHVyX2RpdihGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbnVtLCBJTlQgY291bnQpOwogCisjZW5kaWYgLyogRlVOQ1RJT05fc2NodXJfZGl2ICovCiAKLUZJWFBfREJMIG11bF9kYmxfc2dsX3JuZCAoY29uc3QgRklYUF9EQkwgb3AxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBvcDIpOworRklYUF9EQkwgbXVsX2RibF9zZ2xfcm5kKGNvbnN0IEZJWFBfREJMIG9wMSwgY29uc3QgRklYUF9TR0wgb3AyKTsKIAorI2lmbmRlZiBGVU5DVElPTl9mTXVsdE5vcm0KIC8qKgogICogXGJyaWVmIG11bHRpcGx5IHR3byB2YWx1ZXMgd2l0aCBub3JtYWxpemF0aW9uLCB0aHVzIG1heCBwcmVjaXNpb24uCiAgKiBBdXRob3I6IFJvYmVydCBXZWlkbmVyCiAgKgogICogXHBhcmFtIGYxIGZpcnN0IGZhY3RvcgotICogXHBhcmFtIGYyIHNlY29kIGZhY3RvcgotICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IGlzIHN0b3JlZCBpbnRvCisgKiBccGFyYW0gZjIgc2Vjb25kIGZhY3RvcgorICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IGlzIHN0b3JlZAorICogaW50bwogICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcHJvZHVjdCBmMSpmMgogICovCi1GSVhQX0RCTCBmTXVsdE5vcm0oCi0gICAgICAgIEZJWFBfREJMIGYxLAotICAgICAgICBGSVhQX0RCTCBmMiwKLSAgICAgICAgSU5UICpyZXN1bHRfZQotICAgICAgICApOworRklYUF9EQkwgZk11bHROb3JtKEZJWFBfREJMIGYxLCBGSVhQX0RCTCBmMiwgSU5UICpyZXN1bHRfZSk7CiAKLWlubGluZSBGSVhQX0RCTCBmTXVsdE5vcm0oRklYUF9EQkwgZjEsIEZJWFBfREJMIGYyKQoteworLyoqCisgKiBcYnJpZWYgTXVsdGlwbHkgMiB2YWx1ZXMgdXNpbmcgbWF4aW11bSBwcmVjaXNpb24uIFRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0CisgKiBpcyAwLgorICogXHBhcmFtIGYxX20gbWFudGlzc2Egb2YgZmFjdG9yIDEKKyAqIFxwYXJhbSBmMl9tIG1hbnRpc3NhIG9mIGZhY3RvciAyCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQgd2l0aCBleHBvbmVudCBlcXVhbCB0byAwCisgKi8KK2lubGluZSBGSVhQX0RCTCBmTXVsdE5vcm0oRklYUF9EQkwgZjEsIEZJWFBfREJMIGYyKSB7CiAgIEZJWFBfREJMIG07CiAgIElOVCBlOwogCkBAIC0zMDksMjMgKzQ0OCwyMzEgQEAKIH0KIAogLyoqCisgKiBcYnJpZWYgTXVsdGlwbHkgMiB2YWx1ZXMgd2l0aCBleHBvbmVudCBhbmQgdXNlIGdpdmVuIGV4cG9uZW50IGZvciB0aGUKKyAqIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQuCisgKiBccGFyYW0gZjFfbSBtYW50aXNzYSBvZiBmYWN0b3IgMQorICogXHBhcmFtIGYxX2UgZXhwb25lbnQgb2YgZmFjdG9yIDEKKyAqIFxwYXJhbSBmMl9tIG1hbnRpc3NhIG9mIGZhY3RvciAyCisgKiBccGFyYW0gZjJfZSBleHBvbmVudCBvZiBmYWN0b3IgMgorICogXHBhcmFtIHJlc3VsdF9lIGV4cG9uZW50IGZvciB0aGUgcmV0dXJuZWQgbWFudGlzc2Egb2YgdGhlIHJlc3VsdAorICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0IHdpdGggZXhwb25lbnQgZXF1YWwgdG8gcmVzdWx0X2UKKyAqLworaW5saW5lIEZJWFBfREJMIGZNdWx0Tm9ybShGSVhQX0RCTCBmMV9tLCBJTlQgZjFfZSwgRklYUF9EQkwgZjJfbSwgSU5UIGYyX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCByZXN1bHRfZSkgeworICBGSVhQX0RCTCBtOworICBJTlQgZTsKKworICBtID0gZk11bHROb3JtKGYxX20sIGYyX20sICZlKTsKKworICBtID0gc2NhbGVWYWx1ZVNhdHVyYXRlKG0sIGUgKyBmMV9lICsgZjJfZSAtIHJlc3VsdF9lKTsKKworICByZXR1cm4gbTsKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9mTXVsdE5vcm0gKi8KKworI2lmbmRlZiBGVU5DVElPTl9mTXVsdEkKKy8qKgorICogXGJyaWVmIE11bHRpcGxpZXMgYSBmcmFjdGlvbmFsIHZhbHVlIGFuZCBhIGludGVnZXIgdmFsdWUgYW5kIHBlcmZvcm1zCisgKiByb3VuZGluZyB0byBuZWFyZXN0CisgKiBccGFyYW0gYSBmcmFjdGlvbmFsIHZhbHVlCisgKiBccGFyYW0gYiBpbnRlZ2VyIHZhbHVlCisgKiBccmV0dXJuIGludGVnZXIgdmFsdWUKKyAqLworaW5saW5lIElOVCBmTXVsdEkoRklYUF9EQkwgYSwgSU5UIGIpIHsKKyAgRklYUF9EQkwgbSwgbWk7CisgIElOVCBtX2U7CisKKyAgbSA9IGZNdWx0Tm9ybShhLCAoRklYUF9EQkwpYiwgJm1fZSk7CisKKyAgaWYgKG1fZSA8IChJTlQpMCkgeworICAgIGlmIChtX2UgPiAoSU5UKS1ERlJBQ1RfQklUUykgeworICAgICAgbSA9IG0gPj4gKCgtbV9lKSAtIDEpOworICAgICAgbWkgPSAobSArIChGSVhQX0RCTCkxKSA+PiAxOworICAgIH0gZWxzZSB7CisgICAgICBtaSA9IChGSVhQX0RCTCkwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtaSA9IHNjYWxlVmFsdWVTYXR1cmF0ZShtLCBtX2UpOworICB9CisKKyAgcmV0dXJuICgoSU5UKW1pKTsKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9mTXVsdEkgKi8KKworI2lmbmRlZiBGVU5DVElPTl9mTXVsdElmbG9vcgorLyoqCisgKiBcYnJpZWYgTXVsdGlwbGllcyBhIGZyYWN0aW9uYWwgdmFsdWUgYW5kIGEgaW50ZWdlciB2YWx1ZSBhbmQgcGVyZm9ybXMgZmxvb3IKKyAqIHJvdW5kaW5nCisgKiBccGFyYW0gYSBmcmFjdGlvbmFsIHZhbHVlCisgKiBccGFyYW0gYiBpbnRlZ2VyIHZhbHVlCisgKiBccmV0dXJuIGludGVnZXIgdmFsdWUKKyAqLworaW5saW5lIElOVCBmTXVsdElmbG9vcihGSVhQX0RCTCBhLCBJTlQgYikgeworICBGSVhQX0RCTCBtLCBtaTsKKyAgSU5UIG1fZTsKKworICBtID0gZk11bHROb3JtKGEsIChGSVhQX0RCTCliLCAmbV9lKTsKKworICBpZiAobV9lIDwgKElOVCkwKSB7CisgICAgaWYgKG1fZSA+IChJTlQpLURGUkFDVF9CSVRTKSB7CisgICAgICBtaSA9IG0gPj4gKC1tX2UpOworICAgIH0gZWxzZSB7CisgICAgICBtaSA9IChGSVhQX0RCTCkwOworICAgICAgaWYgKG0gPCAoRklYUF9EQkwpMCkgeworICAgICAgICBtaSA9IChGSVhQX0RCTCktMTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWkgPSBzY2FsZVZhbHVlU2F0dXJhdGUobSwgbV9lKTsKKyAgfQorCisgIHJldHVybiAoKElOVCltaSk7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fZk11bHRJZmxvb3IgKi8KKworI2lmbmRlZiBGVU5DVElPTl9mTXVsdEljZWlsCisvKioKKyAqIFxicmllZiBNdWx0aXBsaWVzIGEgZnJhY3Rpb25hbCB2YWx1ZSBhbmQgYSBpbnRlZ2VyIHZhbHVlIGFuZCBwZXJmb3JtcyBjZWlsCisgKiByb3VuZGluZworICogXHBhcmFtIGEgZnJhY3Rpb25hbCB2YWx1ZQorICogXHBhcmFtIGIgaW50ZWdlciB2YWx1ZQorICogXHJldHVybiBpbnRlZ2VyIHZhbHVlCisgKi8KK2lubGluZSBJTlQgZk11bHRJY2VpbChGSVhQX0RCTCBhLCBJTlQgYikgeworICBGSVhQX0RCTCBtLCBtaTsKKyAgSU5UIG1fZTsKKworICBtID0gZk11bHROb3JtKGEsIChGSVhQX0RCTCliLCAmbV9lKTsKKworICBpZiAobV9lIDwgKElOVCkwKSB7CisgICAgaWYgKG1fZSA+IChJTlQpLURGUkFDVF9CSVRTKSB7CisgICAgICBtaSA9IChtID4+ICgtbV9lKSk7CisgICAgICBpZiAoKExPTkcpbSAmICgoMSA8PCAoLW1fZSkpIC0gMSkpIHsKKyAgICAgICAgbWkgPSBtaSArIChGSVhQX0RCTCkxOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBtaSA9IChGSVhQX0RCTCkxOworICAgICAgaWYgKG0gPCAoRklYUF9EQkwpMCkgeworICAgICAgICBtaSA9IChGSVhQX0RCTCkwOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtaSA9IHNjYWxlVmFsdWVTYXR1cmF0ZShtLCBtX2UpOworICB9CisKKyAgcmV0dXJuICgoSU5UKW1pKTsKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9mTXVsdEljZWlsICovCisKKyNpZm5kZWYgRlVOQ1RJT05fZkRpdk5vcm0KKy8qKgogICogXGJyaWVmIERpdmlkZSAyIEZJWFBfREJMIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24gb2YgaW5wdXQgdmFsdWVzLgogICogXHBhcmFtIG51bSBudW1lcmF0b3IKLSAqIFxwYXJhbSBkZW51bSBkZW5vbWludGF0b3IKLSAqIFxyZXR1cm4gbnVtL2RlbnVtIHdpdGggZXhwb25lbnQgPSAwCisgKiBccGFyYW0gZGVudW0gZGVub21pbmF0b3IKKyAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGFuIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCBpcyBzdG9yZWQKKyAqIGludG8KKyAqIFxyZXR1cm4gbnVtL2RlbnVtIHdpdGggZXhwb25lbnQgPSAqcmVzdWx0X2UKICAqLwogRklYUF9EQkwgZkRpdk5vcm0oRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSwgSU5UICpyZXN1bHRfZSk7CiAKIC8qKgotICogXGJyaWVmIERpdmlkZSAyIEZJWFBfREJMIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24gb2YgaW5wdXQgdmFsdWVzLgorICogXGJyaWVmIERpdmlkZSAyIHBvc2l0aXZlIEZJWFBfREJMIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24gb2YgaW5wdXQgdmFsdWVzLgogICogXHBhcmFtIG51bSBudW1lcmF0b3IKLSAqIFxwYXJhbSBkZW51bSBkZW5vbWludGF0b3IKLSAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGFuIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCBpcyBzdG9yZWQgaW50bwotICogXHJldHVybiBudW0vZGVudW0gd2l0aCBleHBvbmVudCA9ICpyZXN1bHRfZQorICogXHBhcmFtIGRlbnVtIGRlbm9taW5hdG9yCisgKiBccmV0dXJuIG51bS9kZW51bSB3aXRoIGV4cG9uZW50ID0gMAogICovCiBGSVhQX0RCTCBmRGl2Tm9ybShGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tKTsKIAogLyoqCisgKiBcYnJpZWYgRGl2aWRlIDIgc2lnbmVkIEZJWFBfREJMIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24gb2YgaW5wdXQgdmFsdWVzLgorICogXHBhcmFtIG51bSBudW1lcmF0b3IKKyAqIFxwYXJhbSBkZW51bSBkZW5vbWluYXRvcgorICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IGlzIHN0b3JlZAorICogaW50bworICogXHJldHVybiBudW0vZGVudW0gd2l0aCBleHBvbmVudCA9ICpyZXN1bHRfZQorICovCitGSVhQX0RCTCBmRGl2Tm9ybVNpZ25lZChGSVhQX0RCTCBMX251bSwgRklYUF9EQkwgTF9kZW51bSwgSU5UICpyZXN1bHRfZSk7CisKKy8qKgorICogXGJyaWVmIERpdmlkZSAyIHNpZ25lZCBGSVhQX0RCTCB2YWx1ZXMgd2l0aCBub3JtYWxpemF0aW9uIG9mIGlucHV0IHZhbHVlcy4KKyAqIFxwYXJhbSBudW0gbnVtZXJhdG9yCisgKiBccGFyYW0gZGVudW0gZGVub21pbmF0b3IKKyAqIFxyZXR1cm4gbnVtL2RlbnVtIHdpdGggZXhwb25lbnQgPSAwCisgKi8KK0ZJWFBfREJMIGZEaXZOb3JtU2lnbmVkKEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20pOworI2VuZGlmIC8qIEZVTkNUSU9OX2ZEaXZOb3JtICovCisKKy8qKgorICogXGJyaWVmIEFkanVzdCBtYW50aXNzYSB0byBleHBvbmVudCAtMQorICogXHBhcmFtIGFfbSBtYW50aXNzYSBvZiB2YWx1ZSB0byBiZSBhZGp1c3RlZAorICogXHBhcmFtIHBBX2UgcG9pbnRlciB0byB0aGUgZXhwb25lbiBvZiBhX20KKyAqIFxyZXR1cm4gYWRqdXN0ZWQgbWFudGlzc2EKKyAqLworaW5saW5lIEZJWFBfREJMIGZBZGp1c3QoRklYUF9EQkwgYV9tLCBJTlQgKnBBX2UpIHsKKyAgSU5UIHNoaWZ0OworCisgIHNoaWZ0ID0gZk5vcm0oYV9tKSAtIDE7CisgICpwQV9lIC09IHNoaWZ0OworCisgIHJldHVybiBzY2FsZVZhbHVlKGFfbSwgc2hpZnQpOworfQorCisjaWZuZGVmIEZVTkNUSU9OX2ZBZGROb3JtCisvKioKKyAqIFxicmllZiBBZGQgdHdvIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24KKyAqIFxwYXJhbSBhX20gbWFudGlzc2Egb2YgZmlyc3Qgc3VtbWFuZAorICogXHBhcmFtIGFfZSBleHBvbmVudCBvZiBmaXJzdCBzdW1tYW5kCisgKiBccGFyYW0gYV9tIG1hbnRpc3NhIG9mIHNlY29uZCBzdW1tYW5kCisgKiBccGFyYW0gYV9lIGV4cG9uZW50IG9mIHNlY29uZCBzdW1tYW5kCisgKiBccGFyYW0gcFJlc3VsdF9lIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQKKyAqIHRvLgorICogXHJldHVybiBtYW50aXNzYSBvZiByZXN1bHQKKyAqLworaW5saW5lIEZJWFBfREJMIGZBZGROb3JtKEZJWFBfREJMIGFfbSwgSU5UIGFfZSwgRklYUF9EQkwgYl9tLCBJTlQgYl9lLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcFJlc3VsdF9lKSB7CisgIElOVCByZXN1bHRfZTsKKyAgRklYUF9EQkwgcmVzdWx0X207CisKKyAgLyogSWYgb25lIG9mIHRoZSBzdW1tYW5kcyBpcyB6ZXJvLCByZXR1cm4gdGhlIG90aGVyLgorICAgICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHN1bW1hdGlvbiBvZiBhIHZlcnkgc21hbGwgbnVtYmVyIHRvIHplcm8gKi8KKyAgaWYgKGFfbSA9PSAoRklYUF9EQkwpMCkgeworICAgICpwUmVzdWx0X2UgPSBiX2U7CisgICAgcmV0dXJuIGJfbTsKKyAgfQorICBpZiAoYl9tID09IChGSVhQX0RCTCkwKSB7CisgICAgKnBSZXN1bHRfZSA9IGFfZTsKKyAgICByZXR1cm4gYV9tOworICB9CisKKyAgYV9tID0gZkFkanVzdChhX20sICZhX2UpOworICBiX20gPSBmQWRqdXN0KGJfbSwgJmJfZSk7CisKKyAgaWYgKGFfZSA+IGJfZSkgeworICAgIHJlc3VsdF9tID0gYV9tICsgKGJfbSA+PiBmTWluKGFfZSAtIGJfZSwgREZSQUNUX0JJVFMgLSAxKSk7CisgICAgcmVzdWx0X2UgPSBhX2U7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0X20gPSAoYV9tID4+IGZNaW4oYl9lIC0gYV9lLCBERlJBQ1RfQklUUyAtIDEpKSArIGJfbTsKKyAgICByZXN1bHRfZSA9IGJfZTsKKyAgfQorCisgICpwUmVzdWx0X2UgPSByZXN1bHRfZTsKKyAgcmV0dXJuIHJlc3VsdF9tOworfQorCitpbmxpbmUgRklYUF9EQkwgZkFkZE5vcm0oRklYUF9EQkwgYV9tLCBJTlQgYV9lLCBGSVhQX0RCTCBiX20sIElOVCBiX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJlc3VsdF9lKSB7CisgIEZJWFBfREJMIHJlc3VsdF9tOworCisgIGFfbSA9IHNjYWxlVmFsdWUoYV9tLCBhX2UgLSByZXN1bHRfZSk7CisgIGJfbSA9IHNjYWxlVmFsdWUoYl9tLCBiX2UgLSByZXN1bHRfZSk7CisKKyAgcmVzdWx0X20gPSBhX20gKyBiX207CisKKyAgcmV0dXJuIHJlc3VsdF9tOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZBZGROb3JtICovCisKKy8qKgogICogXGJyaWVmIERpdmlkZSAyIEZJWFBfREJMIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24gb2YgaW5wdXQgdmFsdWVzLgogICogXHBhcmFtIG51bSBudW1lcmF0b3IKICAqIFxwYXJhbSBkZW51bSBkZW5vbWludGF0b3IKQEAgLTMzMyw4ICs2ODAsODQgQEAKICAqLwogRklYUF9EQkwgZkRpdk5vcm1IaWdoUHJlYyhGSVhQX0RCTCBMX251bSwgRklYUF9EQkwgTF9kZW51bSwgSU5UICpyZXN1bHRfZSk7CiAKKyNpZm5kZWYgRlVOQ1RJT05fZlBvdwogLyoqCi0gKiBcYnJpZWYgQ2FsY3VsYXRlIGxvZyhhcmd1bWVudCkvbG9nKDIpIChsb2dhcml0aG0gd2l0aCBiYXNlIDIpLiBkZXByZWNhdGVkLiBVc2UgZkxvZzIoKSBpbnN0ZWFkLgorICogXGJyaWVmIHJldHVybiAyIF4gKGV4cF9tICogMl5leHBfZSkKKyAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgorICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCisgKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlCisgKiBzdG9yZWQgaW50bworICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKi8KK0ZJWFBfREJMIGYyUG93KGNvbnN0IEZJWFBfREJMIGV4cF9tLCBjb25zdCBJTlQgZXhwX2UsIElOVCAqcmVzdWx0X2UpOworCisvKioKKyAqIFxicmllZiByZXR1cm4gMiBeIChleHBfbSAqIDJeZXhwX2UpLiBUaGlzIHZlcnNpb24gcmV0dXJucyBvbmx5IHRoZSBtYW50aXNzYQorICogd2l0aCBpbXBsaWNpdCBleHBvbmVudCBvZiB6ZXJvLgorICogXHBhcmFtIGV4cF9tIG1hbnRpc3NhIG9mIHRoZSBleHBvbmVudCB0byAyLjBmCisgKiBccGFyYW0gZXhwX2UgZXhwb25lbnQgb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKKyAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAorICovCitGSVhQX0RCTCBmMlBvdyhjb25zdCBGSVhQX0RCTCBleHBfbSwgY29uc3QgSU5UIGV4cF9lKTsKKworLyoqCisgKiBcYnJpZWYgcmV0dXJuIHggXiAoZXhwX20gKiAyXmV4cF9lKSwgd2hlcmUgbG9nMih4KSA9IGJhc2VMZF9tICogMl4oYmFzZUxkX2UpLgorICogVGhpcyBzYXZlcyB0aGUgbmVlZCB0byBjb21wdXRlIGxvZzIoKSBvZiBjb25zdGFudCB2YWx1ZXMgKHdoZW4geCBpcyBhCisgKiBjb25zdGFudCkuCisgKiBccGFyYW0gYmFzZUxkX20gbWFudGlzc2Egb2YgbG9nMigpIG9mIHguCisgKiBccGFyYW0gYmFzZUxkX2UgZXhwb25lbnQgb2YgbG9nMigpIG9mIHguCisgKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKKyAqIFxwYXJhbSBleHBfZSBleHBvbmVudCBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgorICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYSBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgd2lsbCBiZQorICogc3RvcmVkIGludG8KKyAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAorICovCitGSVhQX0RCTCBmTGRQb3coRklYUF9EQkwgYmFzZUxkX20sIElOVCBiYXNlTGRfZSwgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSwKKyAgICAgICAgICAgICAgICBJTlQgKnJlc3VsdF9lKTsKKworLyoqCisgKiBcYnJpZWYgcmV0dXJuIHggXiAoZXhwX20gKiAyXmV4cF9lKSwgd2hlcmUgbG9nMih4KSA9IGJhc2VMZF9tICogMl4oYmFzZUxkX2UpLgorICogVGhpcyBzYXZlcyB0aGUgbmVlZCB0byBjb21wdXRlIGxvZzIoKSBvZiBjb25zdGFudCB2YWx1ZXMgKHdoZW4geCBpcyBhCisgKiBjb25zdGFudCkuIFRoaXMgdmVyc2lvbiBkb2VzIG5vdCByZXR1cm4gYW4gZXhwb25lbnQsIHdoaWNoIGlzCisgKiBpbXBsaWNpdGx5IDAuCisgKiBccGFyYW0gYmFzZUxkX20gbWFudGlzc2Egb2YgbG9nMigpIG9mIHguCisgKiBccGFyYW0gYmFzZUxkX2UgZXhwb25lbnQgb2YgbG9nMigpIG9mIHguCisgKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKKyAqIFxwYXJhbSBleHBfZSBleHBvbmVudCBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgorICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKi8KK0ZJWFBfREJMIGZMZFBvdyhGSVhQX0RCTCBiYXNlTGRfbSwgSU5UIGJhc2VMZF9lLCBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lKTsKKworLyoqCisgKiBcYnJpZWYgcmV0dXJuIChiYXNlX20gKiAyXmJhc2VfZSkgXiAoZXhwICogMl5leHBfZSkuIFVzZSBmTGRQb3coKSBpbnN0ZWFkCisgKiB3aGVuZXZlciBwb3NzaWJsZS4KKyAqIFxwYXJhbSBiYXNlX20gbWFudGlzc2Egb2YgdGhlIGJhc2UuCisgKiBccGFyYW0gYmFzZV9lIGV4cG9uZW50IG9mIHRoZSBiYXNlLgorICogXHBhcmFtIGV4cF9tIG1hbnRpc3NhIG9mIHBvd2VyIHRvIGJlIGNhbGN1bGF0ZWQgb2YgdGhlIGJhc2UuCisgKiBccGFyYW0gZXhwX2UgZXhwb25lbnQgb2YgcG93ZXIgdG8gYmUgY2FsY3VsYXRlZCBvZiB0aGUgYmFzZS4KKyAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGEgSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IHdpbGwgYmUKKyAqIHN0b3JlZCBpbnRvLgorICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0LgorICovCitGSVhQX0RCTCBmUG93KEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSwKKyAgICAgICAgICAgICAgSU5UICpyZXN1bHRfZSk7CisKKy8qKgorICogXGJyaWVmIHJldHVybiAoYmFzZV9tICogMl5iYXNlX2UpIF4gTgorICogXHBhcmFtIGJhc2VfbSBtYW50aXNzYSBvZiB0aGUgYmFzZQorICogXHBhcmFtIGJhc2VfZSBleHBvbmVudCBvZiB0aGUgYmFzZQorICogXHBhcmFtIE4gcG93ZXIgdG8gYmUgY2FsY3VsYXRlZCBvZiB0aGUgYmFzZQorICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYSBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgd2lsbCBiZQorICogc3RvcmVkIGludG8KKyAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAorICovCitGSVhQX0RCTCBmUG93SW50KEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwgSU5UIE4sIElOVCAqcmVzdWx0X2UpOworI2VuZGlmIC8qICNpZm5kZWYgRlVOQ1RJT05fZlBvdyAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZMb2cyCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgbG9nKGFyZ3VtZW50KS9sb2coMikgKGxvZ2FyaXRobSB3aXRoIGJhc2UgMikuIGRlcHJlY2F0ZWQuCisgKiBVc2UgZkxvZzIoKSBpbnN0ZWFkLgogICogXHBhcmFtIGFyZyBtYW50aXNzYSBvZiB0aGUgYXJndW1lbnQKICAqIFxwYXJhbSBhcmdfZSBleHBvbmVudCBvZiB0aGUgYXJndW1lbnQKICAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGFuIElOVCB0byBzdG9yZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdApAQCAtMzQ0LDgzICs3NjcsNzQgQEAKIEZJWFBfREJMIENhbGNMb2cyKEZJWFBfREJMIGFyZywgSU5UIGFyZ19lLCBJTlQgKnJlc3VsdF9lKTsKIAogLyoqCi0gKiBcYnJpZWYgcmV0dXJuIDIgXiAoZXhwICogMl5leHBfZSkKLSAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgotICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCi0gKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbnRvCi0gKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKLSAqLwotRklYUF9EQkwgZjJQb3coY29uc3QgRklYUF9EQkwgZXhwX20sIGNvbnN0IElOVCBleHBfZSwgSU5UICpyZXN1bHRfZSk7Ci0KLS8qKgotICogXGJyaWVmIHJldHVybiAyIF4gKGV4cF9tICogMl5leHBfZSkuIFRoaXMgdmVyc2lvbiByZXR1cm5zIG9ubHkgdGhlIG1hbnRpc3NhIHdpdGggaW1wbGljaXQgZXhwb25lbnQgb2YgemVyby4KLSAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgotICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCi0gKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKLSAqLwotRklYUF9EQkwgZjJQb3coY29uc3QgRklYUF9EQkwgZXhwX20sIGNvbnN0IElOVCBleHBfZSk7Ci0KLS8qKgotICogXGJyaWVmIHJldHVybiB4IF4gKGV4cCAqIDJeZXhwX2UpLCB3aGVyZSBsb2cyKHgpID0gYmFzZUxkX20gKiAyXihiYXNlTGRfZSkuIFRoaXMgc2F2ZXMKLSAqICAgICAgICB0aGUgbmVlZCB0byBjb21wdXRlIGxvZzIoKSBvZiBjb25zdGFudCB2YWx1ZXMgKHdoZW4geCBpcyBhIGNvbnN0YW50KS4KLSAqIFxwYXJhbSBsZHhfbSBtYW50aXNzYSBvZiBsb2cyKCkgb2YgeC4KLSAqIFxwYXJhbSBsZHhfZSBleHBvbmVudCBvZiBsb2cyKCkgb2YgeC4KLSAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgotICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCi0gKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbnRvCi0gKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKLSAqLwotRklYUF9EQkwgZkxkUG93KAotICAgICAgICBGSVhQX0RCTCBiYXNlTGRfbSwKLSAgICAgICAgSU5UIGJhc2VMZF9lLAotICAgICAgICBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lLAotICAgICAgICBJTlQgKnJlc3VsdF9lCi0gICAgICAgICk7Ci0KLS8qKgotICogXGJyaWVmIHJldHVybiB4IF4gKGV4cCAqIDJeZXhwX2UpLCB3aGVyZSBsb2cyKHgpID0gYmFzZUxkX20gKiAyXihiYXNlTGRfZSkuIFRoaXMgc2F2ZXMKLSAqICAgICAgICB0aGUgbmVlZCB0byBjb21wdXRlIGxvZzIoKSBvZiBjb25zdGFudCB2YWx1ZXMgKHdoZW4geCBpcyBhIGNvbnN0YW50KS4gVGhpcyB2ZXJzaW9uCi0gKiAgICAgICAgZG9lcyBub3QgcmV0dXJuIGFuIGV4cG9uZW50LCB3aGljaCBpcyBpbXBsaWNpdGx5IDAuCi0gKiBccGFyYW0gbGR4X20gbWFudGlzc2Egb2YgbG9nMigpIG9mIHguCi0gKiBccGFyYW0gbGR4X2UgZXhwb25lbnQgb2YgbG9nMigpIG9mIHguCi0gKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKLSAqIFxwYXJhbSBleHBfZSBleHBvbmVudCBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgotICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0Ci0gKi8KLUZJWFBfREJMIGZMZFBvdygKLSAgICAgICAgRklYUF9EQkwgYmFzZUxkX20sIElOVCBiYXNlTGRfZSwKLSAgICAgICAgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZQotICAgICAgICApOwotCi0vKioKLSAqIFxicmllZiByZXR1cm4gKGJhc2UgKiAyXmJhc2VfZSkgXiAoZXhwICogMl5leHBfZSkuIFVzZSBmTGRQb3coKSBpbnN0ZWFkIHdoZW5ldmVyIHBvc3NpYmxlLgotICogXHBhcmFtIGJhc2VfbSBtYW50aXNzYSBvZiB0aGUgYmFzZS4KLSAqIFxwYXJhbSBiYXNlX2UgZXhwb25lbnQgb2YgdGhlIGJhc2UuCi0gKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgcG93ZXIgdG8gYmUgY2FsY3VsYXRlZCBvZiB0aGUgYmFzZS4KLSAqIFxwYXJhbSBleHBfZSBleHBvbmVudCBvZiBwb3dlciB0byBiZSBjYWxjdWxhdGVkIG9mIHRoZSBiYXNlLgotICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYSBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQgaW50by4KLSAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdC4KLSAqLwotRklYUF9EQkwgZlBvdyhGSVhQX0RCTCBiYXNlX20sIElOVCBiYXNlX2UsIEZJWFBfREJMIGV4cF9tLCBJTlQgZXhwX2UsIElOVCAqcmVzdWx0X2UpOwotCi0vKioKLSAqIFxicmllZiByZXR1cm4gKGJhc2UgKiAyXmJhc2VfZSkgXiBOCi0gKiBccGFyYW0gYmFzZSBtYW50aXNzYSBvZiB0aGUgYmFzZQotICogXHBhcmFtIGJhc2VfZSBleHBvbmVudCBvZiB0aGUgYmFzZQotICogXHBhcmFtIHBvd2VyIHRvIGJlIGNhbGN1bGF0ZWQgb2YgdGhlIGJhc2UKLSAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGEgSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkIGludG8KLSAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAotICovCi1GSVhQX0RCTCBmUG93SW50KEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwgSU5UIE4sIElOVCAqcmVzdWx0X2UpOwotCi0vKioKICAqIFxicmllZiBjYWxjdWxhdGUgbG9nYXJpdGhtIG9mIGJhc2UgMiBvZiB4X20gKiAyXih4X2UpCiAgKiBccGFyYW0geF9tIG1hbnRpc3NhIG9mIHRoZSBpbnB1dCB2YWx1ZS4KICAqIFxwYXJhbSB4X2UgZXhwb25lbnQgb2YgdGhlIGlucHV0IHZhbHVlLgogICogXHBhcmFtIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IGlzIHJldHVybmVkIGludG8uCiAgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQuCiAgKi8KLUZJWFBfREJMIGZMb2cyKEZJWFBfREJMIHhfbSwgSU5UIHhfZSwgSU5UICpyZXN1bHRfZSk7CitGREtfSU5MSU5FIEZJWFBfREJMIGZMb2cyKEZJWFBfREJMIHhfbSwgSU5UIHhfZSwgSU5UICpyZXN1bHRfZSkgeworICBGSVhQX0RCTCByZXN1bHRfbTsKKworICAvKiBTaG9ydCBjdXQgZm9yIHplcm8gYW5kIG5lZ2F0aXZlIG51bWJlcnMuICovCisgIGlmICh4X20gPD0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAqcmVzdWx0X2UgPSBERlJBQ1RfQklUUyAtIDE7CisgICAgcmV0dXJuIEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBsb2cyKCkgKi8KKyAgeworICAgIEZJWFBfREJMIHgyX207CisKKyAgICAvKiBNb3ZlIGlucHV0IHZhbHVlIHhfbSAqIDJeeF9lIHRvd2FyZCAxLjAsIHdoZXJlIHRoZSB0YXlsb3IgYXBwcm94aW1hdGlvbgorICAgICAgIG9mIHRoZSBmdW5jdGlvbiBsb2coMS14KSBjZW50ZXJlZCBhdCAwIGlzIG1vc3QgYWNjdXJhdGUuICovCisgICAgeworICAgICAgSU5UIGJfbm9ybTsKKworICAgICAgYl9ub3JtID0gZk5vcm16KHhfbSkgLSAxOworICAgICAgeDJfbSA9IHhfbSA8PCBiX25vcm07CisgICAgICB4X2UgPSB4X2UgLSBiX25vcm07CisgICAgfQorCisgICAgLyogbWFwIHggZnJvbSBsb2coeCkgZG9tYWluIHRvIGxvZygxLXgpIGRvbWFpbi4gKi8KKyAgICB4Ml9tID0gLSh4Ml9tICsgRkwyRlhDT05TVF9EQkwoLTEuMCkpOworCisgICAgLyogVGF5bG9yIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbiBvZiBsbigxLXgpICovCisgICAgeworICAgICAgRklYUF9EQkwgcHgyX207CisgICAgICByZXN1bHRfbSA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisgICAgICBweDJfbSA9IHgyX207CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IExEX1BSRUNJU0lPTjsgaSsrKSB7CisgICAgICAgIHJlc3VsdF9tID0gZk11bHRBZGREaXYyKHJlc3VsdF9tLCBsZENvZWZmW2ldLCBweDJfbSk7CisgICAgICAgIHB4Ml9tID0gZk11bHQocHgyX20sIHgyX20pOworICAgICAgfQorICAgIH0KKyAgICAvKiBNdWx0aXBseSByZXN1bHQgd2l0aCAxL2xuKDIpID0gMS4wICsgMC40NDI2OTUwNDA4ODggKGdldCBsb2cyKHgpIGZyb20KKyAgICAgKiBsbih4KSByZXN1bHQpLiAqLworICAgIHJlc3VsdF9tID0KKyAgICAgICAgZk11bHRBZGREaXYyKHJlc3VsdF9tLCByZXN1bHRfbSwKKyAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDIuMCAqIDAuNDQyNjk1MDQwODg4OTYzNDA3MzU5OTI0NjgxMDAxOSkpOworCisgICAgLyogQWRkIGV4cG9uZW50IHBhcnQuIGxvZzIoeF9tICogMl54X2UpID0gbG9nMih4X20pICsgeF9lICovCisgICAgaWYgKHhfZSAhPSAwKSB7CisgICAgICBpbnQgZW5vcm07CisKKyAgICAgIGVub3JtID0gREZSQUNUX0JJVFMgLSBmTm9ybSgoRklYUF9EQkwpeF9lKTsKKyAgICAgIC8qIFRoZSAtMSBpbiB0aGUgcmlnaHQgc2hpZnQgb2YgcmVzdWx0X20gY29tcGVuc2F0ZXMgdGhlIGZNdWx0RGl2MigpIGFib3ZlCisgICAgICAgKiBpbiB0aGUgdGF5bG9yIHBvbHlub21pYWwgZXZhbHVhdGlvbiBsb29wLiovCisgICAgICByZXN1bHRfbSA9IChyZXN1bHRfbSA+PiAoZW5vcm0gLSAxKSkgKworICAgICAgICAgICAgICAgICAoKEZJWFBfREJMKXhfZSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gZW5vcm0pKTsKKworICAgICAgKnJlc3VsdF9lID0gZW5vcm07CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIDEgY29tcGVuc2F0ZXMgdGhlIGZNdWx0RGl2MigpIGFib3ZlIGluIHRoZSB0YXlsb3IgcG9seW5vbWlhbCBldmFsdWF0aW9uCisgICAgICAgKiBsb29wLiovCisgICAgICAqcmVzdWx0X2UgPSAxOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHRfbTsKK30KIAogLyoqCiAgKiBcYnJpZWYgY2FsY3VsYXRlIGxvZ2FyaXRobSBvZiBiYXNlIDIgb2YgeF9tICogMl4oeF9lKQpAQCAtNDI4LDE2ICs4NDIsMjcgQEAKICAqIFxwYXJhbSB4X2UgZXhwb25lbnQgb2YgdGhlIGlucHV0IHZhbHVlLgogICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0IHdpdGggaW1wbGljaXQgZXhwb25lbnQgb2YgTERfREFUQV9TSElGVC4KICAqLwotRklYUF9EQkwgZkxvZzIoRklYUF9EQkwgeF9tLCBJTlQgeF9lKTsKK0ZES19JTkxJTkUgRklYUF9EQkwgZkxvZzIoRklYUF9EQkwgeF9tLCBJTlQgeF9lKSB7CisgIGlmICh4X20gPD0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICB4X20gPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgIH0gZWxzZSB7CisgICAgSU5UIHJlc3VsdF9lOworICAgIHhfbSA9IGZMb2cyKHhfbSwgeF9lLCAmcmVzdWx0X2UpOworICAgIHhfbSA9IHNjYWxlVmFsdWUoeF9tLCByZXN1bHRfZSAtIExEX0RBVEFfU0hJRlQpOworICB9CisgIHJldHVybiB4X207Cit9CiAKKyNlbmRpZiAvKiBGVU5DVElPTl9mTG9nMiAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZBZGRTYXR1cmF0ZQogLyoqCiAgKiBcYnJpZWYgQWRkIHdpdGggc2F0dXJhdGlvbiBvZiB0aGUgcmVzdWx0LgogICogXHBhcmFtIGEgZmlyc3Qgc3VtbWFuZAogICogXHBhcmFtIGIgc2Vjb25kIHN1bW1hbmQKICAqIFxyZXR1cm4gc2F0dXJhdGVkIHN1bSBvZiBhIGFuZCBiLgogICovCi1pbmxpbmUgRklYUF9TR0wgZkFkZFNhdHVyYXRlKGNvbnN0IEZJWFBfU0dMIGEsIGNvbnN0IEZJWFBfU0dMIGIpCi17CitpbmxpbmUgRklYUF9TR0wgZkFkZFNhdHVyYXRlKGNvbnN0IEZJWFBfU0dMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKICAgTE9ORyBzdW07CiAKICAgc3VtID0gKExPTkcpKFNIT1JUKWEgKyAoTE9ORykoU0hPUlQpYjsKQEAgLTQ1MSwxOSArODc2LDI2IEBACiAgKiBccGFyYW0gYiBzZWNvbmQgc3VtbWFuZAogICogXHJldHVybiBzYXR1cmF0ZWQgc3VtIG9mIGEgYW5kIGIuCiAgKi8KLWlubGluZSBGSVhQX0RCTCBmQWRkU2F0dXJhdGUoY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikKLXsKK2lubGluZSBGSVhQX0RCTCBmQWRkU2F0dXJhdGUoY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgewogICBMT05HIHN1bTsKIAotICBzdW0gPSAoTE9ORykoYT4+MSkgKyAoTE9ORykoYj4+MSk7Ci0gIHN1bSA9IGZNYXgoZk1pbigoSU5UKXN1bSwgKElOVCkoTUFYVkFMX0RCTD4+MSkpLCAoSU5UKShNSU5WQUxfREJMPj4xKSk7Ci0gIHJldHVybiAoRklYUF9EQkwpKExPTkcpKHN1bTw8MSk7CisgIHN1bSA9IChMT05HKShhID4+IDEpICsgKExPTkcpKGIgPj4gMSk7CisgIHN1bSA9IGZNYXgoZk1pbigoSU5UKXN1bSwgKElOVCkoTUFYVkFMX0RCTCA+PiAxKSksIChJTlQpKE1JTlZBTF9EQkwgPj4gMSkpOworICByZXR1cm4gKEZJWFBfREJMKShMT05HKShzdW0gPDwgMSk7CiB9CisjZW5kaWYgLyogRlVOQ1RJT05fZkFkZFNhdHVyYXRlICovCiAKLS8vI2RlZmluZSBURVNUX1JPVU5ESU5HCitJTlQgZml4cF9mbG9vclRvSW50KEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpOworRklYUF9EQkwgZml4cF9mbG9vcihGSVhQX0RCTCBmX2lucCwgSU5UIHNmKTsKIAorSU5UIGZpeHBfY2VpbFRvSW50KEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpOworRklYUF9EQkwgZml4cF9jZWlsKEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpOwogCitJTlQgZml4cF90cnVuY2F0ZVRvSW50KEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpOworRklYUF9EQkwgZml4cF90cnVuY2F0ZShGSVhQX0RCTCBmX2lucCwgSU5UIHNmKTsKIAorSU5UIGZpeHBfcm91bmRUb0ludChGSVhQX0RCTCBmX2lucCwgSU5UIHNmKTsKK0ZJWFBfREJMIGZpeHBfcm91bmQoRklYUF9EQkwgZl9pbnAsIElOVCBzZik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC00NzEsMjkgKzkwMywxOSBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gIGV4dGVybiBjb25zdCBGSVhQX0RCTCBpbnZDb3VudFs4MF07CitleHRlcm4gY29uc3QgRklYUF9EQkwgaW52Q291bnRbODBdOwogCi0gIExOS19TRUNUSU9OX0lOSVRDT0RFCi0gIGlubGluZSB2b2lkIEluaXRJbnZJbnQodm9pZCkge30KLQorTE5LX1NFQ1RJT05fSU5JVENPREUKK2lubGluZSB2b2lkIEluaXRJbnZJbnQodm9pZCkge30KIAogLyoqCiAgKiBcYnJpZWYgQ2FsY3VsYXRlIHRoZSB2YWx1ZSBvZiAxL2kgd2hlcmUgaSBpcyBhIGludGVnZXIgdmFsdWUuIEl0IHN1cHBvcnRzCi0gKiAgICAgICAgaW5wdXQgdmFsdWVzIGZyb20gMCB1cHRvIDc5LgorICogICAgICAgIGlucHV0IHZhbHVlcyBmcm9tIDEgdXB0byAoODAtMSkuCiAgKiBccGFyYW0gaW50VmFsdWUgSW50ZWdlciBpbnB1dCB2YWx1ZS4KICAqIFxwYXJhbSBGSVhQX0RCTCByZXByZXNlbnRhdGlvbiBvZiAxL2ludFZhbHVlCiAgKi8KLWlubGluZSBGSVhQX0RCTCBHZXRJbnZJbnQoaW50IGludFZhbHVlKQotewotICBGREtfQVNTRVJUKChpbnRWYWx1ZSA+PSAwKSAmJiAoaW50VmFsdWUgPCA4MCkpOwotICBpZiAoaW50VmFsdWUgPiA3OSkKLSAgICByZXR1cm4gaW52Q291bnRbNzldOwotICBlbHNlIGlmIChpbnRWYWx1ZSA8IDApCi0gICAgcmV0dXJuIGludkNvdW50WzBdOwotICBlbHNlCi0gICAgcmV0dXJuIGludkNvdW50W2ludFZhbHVlXTsKK2lubGluZSBGSVhQX0RCTCBHZXRJbnZJbnQoaW50IGludFZhbHVlKSB7CisgIHJldHVybiBpbnZDb3VudFtmTWluKGZNYXgoaW50VmFsdWUsIDApLCA4MCAtIDEpXTsKIH0KIAotCi0jZW5kaWYKLQorI2VuZGlmIC8qIEZJWFBPSU5UX01BVEhfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvaHVmZl9ub2Rlcy5oIGIvbGliRkRLL2luY2x1ZGUvaHVmZl9ub2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZGE1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvaW5jbHVkZS9odWZmX25vZGVzLmgKQEAgLTAsMCArMSwyNTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE9tZXIgT3NtYW4KKworICAgRGVzY3JpcHRpb246IE1QRUctRCBTQUMvVVNBQy9TQU9DIEh1ZmZtYW4gUGFydDAgVGFibGVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSFVGRl9OT0RFU19ICisjZGVmaW5lIEhVRkZfTk9ERVNfSAorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTSE9SVCBub2RlVGFiWzM5XVsyXTsKKworfSBIVUZGX1JFU19OT0RFUzsKKworLyogMUQgTm9kZXMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbm9kZVRhYlszMF1bMl07CisKK30gSFVGRl9DTERfTk9EXzFEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNIT1JUIG5vZGVUYWJbN11bMl07CisKK30gSFVGRl9JQ0NfTk9EXzFEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNIT1JUIG5vZGVUYWJbNTBdWzJdOworCit9IEhVRkZfQ1BDX05PRF8xRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTSE9SVCBub2RlVGFiWzE1XVsyXTsKKworfSBIVUZGX09MRF9OT0RfMUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbm9kZVRhYls2M11bMl07CisKK30gSFVGRl9OUkdfTk9EXzFEOworCisvKiAyRCBOb2RlcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBTSE9SVCBsYXYzWzE1XVsyXTsKKyAgU0hPUlQgbGF2NVszNV1bMl07CisgIFNIT1JUIGxhdjdbNjNdWzJdOworICBTSE9SVCBsYXY5Wzk5XVsyXTsKKworfSBIVUZGX0NMRF9OT0RfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbGF2MVszXVsyXTsKKyAgU0hPUlQgbGF2M1sxNV1bMl07CisgIFNIT1JUIGxhdjVbMzVdWzJdOworICBTSE9SVCBsYXY3WzYzXVsyXTsKKworfSBIVUZGX0lDQ19OT0RfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbGF2M1sxNV1bMl07CisgIFNIT1JUIGxhdjZbNDhdWzJdOworICBTSE9SVCBsYXY5Wzk5XVsyXTsKKyAgU0hPUlQgbGF2MTJbMTY4XVsyXTsKKworfSBIVUZGX09MRF9OT0RfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbGF2M1sxNV1bMl07CisgIFNIT1JUIGxhdjVbMzVdWzJdOworICBTSE9SVCBsYXY3WzYzXVsyXTsKKyAgU0hPUlQgbGF2OVs5OV1bMl07CisKK30gSFVGRl9OUkdfTk9EXzJEX2RmOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNIT1JUIGxhdjNbMTVdWzJdOworICBTSE9SVCBsYXY2WzQ4XVsyXTsKKyAgU0hPUlQgbGF2OVs5OV1bMl07CisgIFNIT1JUIGxhdjEyWzE2OF1bMl07CisKK30gSFVGRl9OUkdfTk9EXzJEX2R0OworCit0eXBlZGVmIHN0cnVjdCB7CisgIEhVRkZfTlJHX05PRF8yRF9kZiBkZlsyXTsKKyAgSFVGRl9OUkdfTk9EXzJEX2R0IGR0WzJdOworICBIVUZGX05SR19OT0RfMkRfZGYgZHBbMl07CisKK30gSFVGRl9OUkdfTk9EXzJEOworCisvKiBDb21wbGV0ZSBicyBQYXJhbWV0ZXIgTm9kZXMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgSFVGRl9DTERfTk9EXzFEICpoMURbM107CisgIGNvbnN0IEhVRkZfQ0xEX05PRF8yRCAqaDJEWzNdWzJdOworCit9IEhVRkZfQ0xEX05PREVTOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IEhVRkZfSUNDX05PRF8xRCAqaDFEWzNdOworICBjb25zdCBIVUZGX0lDQ19OT0RfMkQgKmgyRFszXVsyXTsKKworfSBIVUZGX0lDQ19OT0RFUzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBIVUZGX09MRF9OT0RfMUQgKmgxRFszXTsKKyAgY29uc3QgSFVGRl9PTERfTk9EXzJEICpoMkRbM11bMl07CisKK30gSFVGRl9PTERfTk9ERVM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgSFVGRl9OUkdfTk9EXzFEICpoMURbM107CisgIGNvbnN0IEhVRkZfTlJHX05PRF8yRCAqaDJEOworCit9IEhVRkZfTlJHX05PREVTOworCisvKiBwYXJhbWV0ZXIgaW5zdGFuY2UgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgY2xkWzMwXVsyXTsKKyAgU0hPUlQgaWNjWzddWzJdOworICBTSE9SVCBpcGRbN11bMl07CisgIFNIT1JUIG9sZFsxNV1bMl07CisgIFNIT1JUIG5yZ1s2M11bMl07Cit9IEhVRkZfUFQwX05PREVTOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNIT1JUIG5vZGVUYWJbM11bMl07CisKK30gSFVGRl9MQVZfTk9ERVM7CisKKy8qIFVTQUMgc3BlY2lmaWMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbm9kZVRhYls3XVsyXTsKKworfSBIVUZGX0lQRF9OT0RfMUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbGF2MVszXVsyXTsKKyAgU0hPUlQgbGF2M1sxNV1bMl07CisgIFNIT1JUIGxhdjVbMzVdWzJdOworICBTSE9SVCBsYXY3WzYzXVsyXTsKKworfSBIVUZGX0lQRF9OT0RfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSFVGRl9JUERfTk9EXzFEIGgxRFszXTsKKyAgSFVGRl9JUERfTk9EXzJEIGgyRFszXVsyXTsKKworfSBIVUZGX0lQRF9OT0RFUzsKKworLyogbm9uLWxvc3N5IGNvZGluZyBkZWNvZGVyICovCitleHRlcm4gY29uc3QgSFVGRl9QVDBfTk9ERVMgRkRLX2h1ZmZQYXJ0ME5vZGVzOworZXh0ZXJuIGNvbnN0IEhVRkZfTEFWX05PREVTIEZES19odWZmTGF2SWR4Tm9kZXM7CisKK2V4dGVybiBjb25zdCBIVUZGX0lDQ19OT0RFUyBGREtfaHVmZklDQ05vZGVzOworZXh0ZXJuIGNvbnN0IEhVRkZfQ0xEX05PREVTIEZES19odWZmQ0xETm9kZXM7CitleHRlcm4gY29uc3QgSFVGRl9SRVNfTk9ERVMgRkRLX2h1ZmZSZXNoYXBlTm9kZXM7CisKK2V4dGVybiBjb25zdCBIVUZGX09MRF9OT0RFUyBodWZmT0xETm9kZXM7CisKK2V4dGVybiBjb25zdCBIVUZGX0lQRF9OT0RFUyBGREtfaHVmZklQRE5vZGVzOworCisjZW5kaWYgLyogSFVGRl9OT0RFU19IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9tZGN0LmggYi9saWJGREsvaW5jbHVkZS9tZGN0LmgKaW5kZXggZTFjMmQ3NC4uMTM4MjM3NCAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvbWRjdC5oCisrKyBiL2xpYkZESy9pbmNsdWRlL21kY3QuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMyArOTAsNDcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyLCBKb3NlZiBIb2VwZmwKLSAgIERlc2NyaXB0aW9uOiBNRENUIHJvdXRpbmVzCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlciwgSm9zZWYgSG9lcGZsLCBZb3VsaXkgTmlub3YsIERhbmllbCBIYWdlbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogTURDVC9NRFNUIHJvdXRpbmVzCiAKLSNpZm5kZWYgX19NRENUX0hfXwotI2RlZmluZSBfX01EQ1RfSF9fCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KKyNpZm5kZWYgTURDVF9ICisjZGVmaW5lIE1EQ1RfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCi0jZGVmaW5lIE1EQ1RfT1VUX0hFQURST09NICAgICAyIC8qIE91dHB1dCBhZGRpdGlvbmFsIGhlYWRyb29tICovCi0jZGVmaW5lIE1EQ1RfT1VUUFVUX1NDQUxFICAgIChERlJBQ1RfQklUUy1TQU1QTEVfQklUUy1NRENUX09VVF9IRUFEUk9PTSkKLS8qIFJlZmVyIHRvICJPdXRwdXQgd29yZCBsZW5ndGgiIGluIElTTy9JRUMgMTQ0OTYtMzoyMDA4KEUpIDIzLjIuMy42ICovCi0jZGVmaW5lIE1EQ1RfT1VUUFVUX0dBSU4gICAgICAxNgorI2RlZmluZSBNRENUX09VVF9IRUFEUk9PTSAyIC8qIE91dHB1dCBhZGRpdGlvbmFsIGhlYWRyb29tICovCisjZGVmaW5lIFBDTV9PVVRfQklUUyBTQU1QTEVfQklUUworI2RlZmluZSBQQ01fT1VUX0hFQURST09NIDggLyogTXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlcyBhcyBETVhIX0hFQURST09NICovCiAKLSNpZiAoU0FNUExFX0JJVFMgPT0gREZSQUNUX0JJVFMpCi0jZGVmaW5lIElNRENUX1NDQUxFKHgpIChJTlRfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQoeCwgLU1EQ1RfT1VUUFVUX1NDQUxFLCBTQU1QTEVfQklUUykKKyNkZWZpbmUgTURDVF9PVVRQVVRfU0NBTEUgKC1NRENUX09VVF9IRUFEUk9PTSArIChERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTKSkKKy8qIFJlZmVyIHRvICJPdXRwdXQgd29yZCBsZW5ndGgiIGluIElTTy9JRUMgMTQ0OTYtMzoyMDA4KEUpIDIzLjIuMy42ICovCisjZGVmaW5lIE1EQ1RfT1VUUFVUX0dBSU4gMTYKKworI2lmIChNRENUX09VVFBVVF9TQ0FMRSA+PSAwKQorI2RlZmluZSBJTURDVF9TQ0FMRSh4KSBTQVRVUkFURV9SSUdIVF9TSElGVCh4LCBNRENUX09VVFBVVF9TQ0FMRSwgUENNX09VVF9CSVRTKQogI2Vsc2UKLSNkZWZpbmUgSU1EQ1RfU0NBTEUoeCkgKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoeCwgTURDVF9PVVRQVVRfU0NBTEUsIFNBTVBMRV9CSVRTKQorI2RlZmluZSBJTURDVF9TQ0FMRSh4KSBTQVRVUkFURV9MRUZUX1NISUZUKHgsIC1NRENUX09VVFBVVF9TQ0FMRSwgUENNX09VVF9CSVRTKQogI2VuZGlmCiAjZGVmaW5lIElNRENUX1NDQUxFX0RCTCh4KSAoRklYUF9EQkwpKHgpCisjZGVmaW5lIElNRENUX1NDQUxFX0RCTF9MU0gxKHgpIFNBVFVSQVRFX0xFRlRfU0hJRlRfQUxUKCh4KSwgMSwgREZSQUNUX0JJVFMpCisKKyNkZWZpbmUgTUxUX0ZMQUdfQ1VSUl9BTElBU19TWU1NRVRSWSAxCisKK3R5cGVkZWYgZW51bSB7CisgIEJMT0NLX0xPTkcgPSAwLCAvKiBub3JtYWwgbG9uZyBibG9jayAqLworICBCTE9DS19TVEFSVCwgICAgLyogbG9uZyBzdGFydCBibG9jayAqLworICBCTE9DS19TSE9SVCwgICAgLyogOCBzaG9ydCBibG9ja3Mgc2VxdWVuY2UgKi8KKyAgQkxPQ0tfU1RPUCAgICAgIC8qIGxvbmcgc3RvcCBibG9jayovCit9IEJMT0NLX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7IFNIQVBFX1NJTkUgPSAwLCBTSEFQRV9LQkQsIFNIQVBFX0xPTCB9IFdJTkRPV19TSEFQRTsKIAogLyoqCiAgKiBcYnJpZWYgTURDVCBwZXJzaXN0ZW50IGRhdGEKQEAgLTExNCwxOCArMTM5LDI0IEBACiAgIHVuaW9uIHsKICAgICBGSVhQX0RCTCAqZnJlcTsKICAgICBGSVhQX0RCTCAqdGltZTsKLSAgfSBvdmVybGFwOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIG92ZXJsYXAgbWVtb3J5ICovCisgIH0gb3ZlcmxhcDsgLyoqPCBQb2ludGVyIHRvIG92ZXJsYXAgbWVtb3J5ICovCiAKLSAgY29uc3QgRklYUF9XVFAgKnByZXZfd3JzOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIHByZXZpb3VzIHJpZ2h0IHdpbmRvdyBzbG9wZSAgKi8KLSAgaW50IHByZXZfdGw7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBwcmV2aW91cyB0cmFuZm9ybSBsZW5ndGggKi8KLSAgaW50IHByZXZfbnI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBwcmV2aW91cyByaWdodCB3aW5kb3cgb2Zmc2V0ICovCi0gIGludCBwcmV2X2ZyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgcHJldmlvdXMgcmlnaHQgd2luZG93IHNsb3BlIGxlbmd0aCAqLwotICBpbnQgb3Zfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAvKio8IG92ZXJsYXAgdGltZSBkYXRhIGZpbGwgbGV2ZWwgKi8KLSAgaW50IG92X3NpemU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBPdmVybGFwIGJ1ZmZlciBzaXplIGluIHdvcmRzICovCisgIGNvbnN0IEZJWFBfV1RQICpwcmV2X3dyczsgLyoqPCBwb2ludGVyIHRvIHByZXZpb3VzIHJpZ2h0IHdpbmRvdyBzbG9wZSAgKi8KKyAgaW50IHByZXZfdGw7ICAgICAgICAgICAgICAvKio8IHByZXZpb3VzIHRyYW5zZm9ybSBsZW5ndGggKi8KKyAgaW50IHByZXZfbnI7ICAgICAgICAgICAgICAvKio8IHByZXZpb3VzIHJpZ2h0IHdpbmRvdyBvZmZzZXQgKi8KKyAgaW50IHByZXZfZnI7ICAgICAgICAgICAgICAvKio8IHByZXZpb3VzIHJpZ2h0IHdpbmRvdyBzbG9wZSBsZW5ndGggKi8KKyAgaW50IG92X29mZnNldDsgICAgICAgICAgICAvKio8IG92ZXJsYXAgdGltZSBkYXRhIGZpbGwgbGV2ZWwgKi8KKyAgaW50IG92X3NpemU7ICAgICAgICAgICAgICAvKio8IE92ZXJsYXAgYnVmZmVyIHNpemUgaW4gd29yZHMgKi8KIAorICBpbnQgcHJldkFsaWFzU3ltbWV0cnk7CisgIGludCBwcmV2UHJldkFsaWFzU3ltbWV0cnk7CisKKyAgRklYUF9EQkwgKnBGYWNaaXI7CisgIEZJWFBfREJMICpwQXN5bU92bHA7IC8qKjwgcG9pbnRlciB0byBhc3ltbWV0cmljIG92ZXJsYXAgKHVzZWQgZm9yIHN0ZXJlbyBMUEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbikgKi8KIH0gbWRjdF90OwogCi10eXBlZGVmIG1kY3RfdCogSF9NRENUOwordHlwZWRlZiBtZGN0X3QgKkhfTURDVDsKIAogLyoqCiAgKiBcYnJpZWYgSW5pdGlhbGl6ZSBhcyB2YWxpZCBNRENUIGhhbmRsZQpAQCAtMTMzLDY4ICsxNjQsNTIgQEAKICAqIFxwYXJhbSBoTWRjdCBoYW5kbGUgb2YgYW4gYWxsb2NhdGVkIE1EQ1QgaGFuZGxlLgogICogXHBhcmFtIG92ZXJsYXAgcG9pbnRlciB0byBGSVhQX0RCTCBvdmVybGFwIGJ1ZmZlci4KICAqIFxwYXJhbSBvdmVybGFwQnVmZmVyU2l6ZSBzaXplIGluIEZJWFBfREJMcyBvZiB0aGUgZ2l2ZW4gb3ZlcmxhcCBidWZmZXIuCi0gKiBccmV0dXJuIHZvaWQKICAqLwotdm9pZCBtZGN0X2luaXQoIEhfTURDVCBoTWRjdCwKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCAqb3ZlcmxhcCwKLSAgICAgICAgICAgICAgICBJTlQgb3ZlcmxhcEJ1ZmZlclNpemUgKTsKK3ZvaWQgbWRjdF9pbml0KEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKm92ZXJsYXAsIElOVCBvdmVybGFwQnVmZmVyU2l6ZSk7CiAKIC8qKgotICogXGJyaWVmIHBlcmZvcm0gTURDVCB0cmFuc2Zvcm0gKHRpbWUgZG9tYWluIHRvIGZyZXF1ZW5jeSBkb21haW4pIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy4KKyAqIFxicmllZiBwZXJmb3JtIE1EQ1QgdHJhbnNmb3JtICh0aW1lIGRvbWFpbiB0byBmcmVxdWVuY3kgZG9tYWluKSB3aXRoIGdpdmVuCisgKiBwYXJhbWV0ZXJzLgogICoKICAqIFxwYXJhbSBoTWRjdCBoYW5kbGUgb2YgYW4gYWxsb2NhdGVkIE1EQ1QgaGFuZGxlLgotICogXHBhcmFtIHNwZWN0cnVtIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHJlc3VsdGluZyBNRENUIHNwZWN0cnVtIHdpbGwgYmUgc3RvcmVkIGludG8uCi0gKiBccGFyYW0gc2NhbGVmYWN0b3IgcG9pbnRlciB0byB0aGUgaW5wdXQgc2NhbGUgc2hpZnQgdmFsdWUuIFVwZGF0ZWQgYWNjb3JkaW5nbHkgb24gcmV0dXJuLgotICogXHBhcmFtIGlucHV0IHBvaW50ZXIgdG8gaW5wdXQgdGltZSBkb21haW4gc2lnbmFsCi0gKiBccGFyYW0gdGwgdHJhbnNmb3JtYXRpb24gbGVuZ3RoLgotICogXHBhcmFtIG5yIHJpZ2h0IHdpbmRvdyBzbG9wZSBvZmZzZXQgKGFtb3VudCBvZiB3aW5kb3cgY29lZmZpY2llbnRzIGFzc3VtZWQgdG8gYmUgMS4wKQotICogXHBhcmFtIGZyIHJpZ2h0IG92ZXJsYXAgd2luZG93IHNsb3BlIGxlbmd0aAotICogXHBhcmFtIHdycyBwb2ludGVyIHRvIHRoZSByaWdodCBzaWRlIG92ZXJsYXAgd2luZG93IGNvZWZmaWNpZW50cy4KKyAqIFxwYXJhbSBwVGltZURhdGEgcG9pbnRlciB0byBpbnB1dCB0aW1lIGRvbWFpbiBzaWduYWwKKyAqIFxwYXJhbSBub0luU2FtcGxlcyBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcworICogXHBhcmFtIG1kY3REYXRhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHJlc3VsdGluZyBNRENUIHNwZWN0cnVtIHdpbGwgYmUgc3RvcmVkCisgKiBpbnRvLgorICogXHBhcmFtIG5TcGVjIG51bWJlciBvZiBzcGVjdHJhCisgKiBccGFyYW0gcE1kY3REYXRhX2UgcG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBleHBvbmVudC4gVXBkYXRlZCBhY2NvcmRpbmdseSBvbgorICogcmV0dXJuIGZvciBvdXRwdXQgZGF0YS4KICAqIFxyZXR1cm4gbnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgcHJvY2Vzc2VkLgogICovCi1JTlQgIG1kY3RfYmxvY2soCi0gICAgICAgIEhfTURDVCBoTWRjdCwKLSAgICAgICAgRklYUF9EQkwgKnNwZWN0cnVtLAotICAgICAgICBJTlQgKnNjYWxlZmFjdG9yLAotICAgICAgICBJTlRfUENNICppbnB1dCwKLSAgICAgICAgSU5UIHRsLAotICAgICAgICBJTlQgbnIsCi0gICAgICAgIElOVCBmciwKLSAgICAgICAgY29uc3QgRklYUF9XVEIgKndycyApOwotCitJTlQgbWRjdF9ibG9jayhIX01EQ1QgaE1kY3QsIGNvbnN0IElOVF9QQ00gKnBUaW1lRGF0YSwgY29uc3QgSU5UIG5vSW5TYW1wbGVzLAorICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3REYXRhLCBjb25zdCBJTlQgblNwZWMsIGNvbnN0IElOVCB0bCwKKyAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfV1RQICpwUmlnaHRXaW5kb3dQYXJ0LCBjb25zdCBJTlQgZnIsCisgICAgICAgICAgICAgICBTSE9SVCAqcE1kY3REYXRhX2UpOwogCiAvKioKLSAqIFxicmllZiBhZGQvbXVsdGlwbHkgMi9OIHRyYW5zZm9ybSBnYWluIGFuZCBNUEVHNCBwYXJ0IDMgZGVmaW5lZCBvdXRwdXQgZ2FpbiAoc2VlIGRlZmluaXRpb24KLSAqICAgICAgICBvZiBNRENUX09VVFBVVF9HQUlOKSB0byBnaXZlbiBtYW50aXNzYSBmYWN0b3IgYW5kIGV4cG9uZW50LgotICogXHBhcmFtIHBHYWluIHBvaW50ZXIgdG8gdGhlIG1hbnRpc3NhIG9mIGEgZ2FpbiBmYWN0b3IgdG8gYmUgYXBwbGllZCB0byBJTURDVCBkYXRhLgotICogXHBhcmFtIHBFeHBvbmVudCBwb2ludGVyIHRvIHRoZSBleHBvbmVudCBvZiBhIGdhaW4gZmFjdG9yIHRvIGJlIGFwcGxpZWQgdG8gSU1EQ1QgZGF0YS4KLSAqIFxwYXJhbSB0bCBsZW5ndGggb2YgdGhlIElNRENUIHdoZXJlIHRoZSBnYWluICpwR2FpbiAqICgyIF4gKnBFeHBvbmVudCkgd2lsbCBiZSBhcHBsaWVkIHRvLgorICogXGJyaWVmIGFkZC9tdWx0aXBseSAyL04gdHJhbnNmb3JtIGdhaW4gYW5kIE1QRUc0IHBhcnQgMyBkZWZpbmVkIG91dHB1dCBnYWluCisgKiAoc2VlIGRlZmluaXRpb24gb2YgTURDVF9PVVRQVVRfR0FJTikgdG8gZ2l2ZW4gbWFudGlzc2EgZmFjdG9yIGFuZCBleHBvbmVudC4KKyAqIFxwYXJhbSBwR2FpbiBwb2ludGVyIHRvIHRoZSBtYW50aXNzYSBvZiBhIGdhaW4gZmFjdG9yIHRvIGJlIGFwcGxpZWQgdG8gSU1EQ1QKKyAqIGRhdGEuCisgKiBccGFyYW0gcEV4cG9uZW50IHBvaW50ZXIgdG8gdGhlIGV4cG9uZW50IG9mIGEgZ2FpbiBmYWN0b3IgdG8gYmUgYXBwbGllZCB0bworICogSU1EQ1QgZGF0YS4KKyAqIFxwYXJhbSB0bCBsZW5ndGggb2YgdGhlIElNRENUIHdoZXJlIHRoZSBnYWluICpwR2FpbiAqICgyIF4gKnBFeHBvbmVudCkgd2lsbAorICogYmUgYXBwbGllZCB0by4KICAqLwotdm9pZCBpbWRjdF9nYWluKAotICAgICAgICBGSVhQX0RCTCAqcEdhaW4sCi0gICAgICAgIGludCAqcEV4cG9uZW50LAotICAgICAgICBpbnQgdGwKLSAgICAgICAgKTsKK3ZvaWQgaW1kY3RfZ2FpbihGSVhQX0RCTCAqcEdhaW4sIGludCAqcEV4cG9uZW50LCBpbnQgdGwpOwogCiAvKioKLSAqIFxicmllZiBkcmFpbiBidWZmZXJlZCBvdXRwdXQgc2FtcGxlcyBpbnRvIGdpdmVuIGJ1ZmZlci4gQ2hhbmdlcyB0aGUgTURDVCBzdGF0ZS4KKyAqIFxicmllZiBkcmFpbiBidWZmZXJlZCBvdXRwdXQgc2FtcGxlcyBpbnRvIGdpdmVuIGJ1ZmZlci4gQ2hhbmdlcyB0aGUgTURDVAorICogc3RhdGUuCiAgKi8KLUlOVCBpbWRjdF9kcmFpbigKLSAgICAgICAgSF9NRENUIGhNZGN0LAotICAgICAgICBGSVhQX0RCTCAqIHBUaW1lRGF0YSwKLSAgICAgICAgSU5UIG5yU2FtcGxlc1Jvb20KLSAgICAgICAgKTsKLQorSU5UIGltZGN0X2RyYWluKEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKnBUaW1lRGF0YSwgSU5UIG5yU2FtcGxlc1Jvb20pOwogCiAvKioKLSAqIFxicmllZiBDb3B5IG92ZXJsYXAgdGltZSBkb21haW4gZGF0YSB0byBnaXZlbiBidWZmZXIuIERvZXMgbm90IGNoYW5nZSB0aGUgTURDVCBzdGF0ZS4KKyAqIFxicmllZiBDb3B5IG92ZXJsYXAgdGltZSBkb21haW4gZGF0YSB0byBnaXZlbiBidWZmZXIuIERvZXMgbm90IGNoYW5nZSB0aGUKKyAqIE1EQ1Qgc3RhdGUuCiAgKiBccmV0dXJuIG51bWJlciBvZiBhY3R1YWxseSBjb3BpZWQgc2FtcGxlcyAob3YgKyBucikuCiAgKi8KLUlOVCBpbWRjdF9jb3B5X292X2FuZF9ucigKLSAgICAgICAgSF9NRENUIGhNZGN0LAotICAgICAgICBGSVhQX0RCTCAqIHBUaW1lRGF0YSwKLSAgICAgICAgSU5UIG5yU2FtcGxlcwotICAgICAgICApOworSU5UIGltZGN0X2NvcHlfb3ZfYW5kX25yKEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKnBUaW1lRGF0YSwgSU5UIG5yU2FtcGxlcyk7CiAKIC8qKgogICogXGJyaWVmIEFkYXB0IE1EQ1QgcGFyYW1ldGVycyBmb3Igbm9uLW1hdGNoaW5nIHdpbmRvdyBzbG9wZXMuCkBAIC0yMDUsMzkgKzIyMCwzNCBAQAogICogXHBhcmFtIHdscyBwb2ludGVyIHRvIHRoZSBsZWZ0IHNpZGUgb3ZlcmxhcCB3aW5kb3cgY29lZmZpY2llbnRzLgogICogXHBhcmFtIG5vT3V0U2FtcGxlcyBkZXNpcmVkIG51bWJlciBvZiBvdXRwdXQgc2FtcGxlcy4KICAqLwotdm9pZCBpbWRjdF9hZGFwdF9wYXJhbWV0ZXJzKEhfTURDVCBoTWRjdCwgaW50ICpwZmwsIGludCAqcG5sLCBpbnQgdGwsIGNvbnN0IEZJWFBfV1RQICp3bHMsIGludCBub091dFNhbXBsZXMpOwordm9pZCBpbWRjdF9hZGFwdF9wYXJhbWV0ZXJzKEhfTURDVCBoTWRjdCwgaW50ICpwZmwsIGludCAqcG5sLCBpbnQgdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9XVFAgKndscywgaW50IG5vT3V0U2FtcGxlcyk7CiAKIC8qKgotICogXGJyaWVmIHBlcmZvcm0gc2V2ZXJhbCBpbnZlcnNlIE1EQ1QgdHJhbnNmb3JtcyAoZnJlcXVlbmN5IGRvbWFpbiB0byB0aW1lIGRvbWFpbikgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLgorICogXGJyaWVmIHBlcmZvcm0gc2V2ZXJhbCBpbnZlcnNlIE1MVCB0cmFuc2Zvcm1zIChmcmVxdWVuY3kgZG9tYWluIHRvIHRpbWUKKyAqIGRvbWFpbikgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLgogICoKICAqIFxwYXJhbSBoTWRjdCBoYW5kbGUgb2YgYW4gYWxsb2NhdGVkIE1EQ1QgaGFuZGxlLgotICogXHBhcmFtIG91dHB1dCBwb2ludGVyIHRvIHdoZXJlIHRoZSBvdXRwdXQgdGltZSBkb21haW4gc2lnbmFsIHdpbGwgYmUgc3RvcmVkIGludG8uCi0gKiBccGFyYW0gc3RyaWRlIHRoZSBzdHJpZGUgZmFjdG9yIGZvciBhY2Nlc3NpbmcgdGltZSBkb21haW4gc2FtcGxlcyBpbiBvdXRwdXQuCisgKiBccGFyYW0gb3V0cHV0IHBvaW50ZXIgdG8gd2hlcmUgdGhlIG91dHB1dCB0aW1lIGRvbWFpbiBzaWduYWwgd2lsbCBiZSBzdG9yZWQKKyAqIGludG8uCiAgKiBccGFyYW0gc3BlY3RydW0gcG9pbnRlciB0byB0aGUgaW5wdXQgTURDVCBzcGVjdHJhLgotICogXHBhcmFtIHNjYWxlZmFjdG9ycyBzY2FsZSBzaGlmdCB2YWx1ZXMgb2YgdGhlIGlucHV0IHNwZWN0cnVtLgorICogXHBhcmFtIHNjYWxlZmFjdG9ycyBleHBvbmVudHMgb2YgdGhlIGlucHV0IHNwZWN0cnVtLgogICogXHBhcmFtIG5TcGVjIG51bWJlciBvZiBNRENUIHNwZWN0cnVtcy4KICAqIFxwYXJhbSBub091dFNhbXBsZXMgZGVzaXJlZCBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMuCiAgKiBccGFyYW0gdGwgdHJhbnNmb3JtIGxlbmd0aC4KICAqIFxwYXJhbSB3bHMgcG9pbnRlciB0byB0aGUgbGVmdCBzaWRlIG92ZXJsYXAgd2luZG93IGNvZWZmaWNpZW50cy4KICAqIFxwYXJhbSBmbCBsZWZ0IG92ZXJsYXAgd2luZG93IHNpZGUgbGVuZ3RoLgotICogXHBhcmFtIHdycyBwb2ludGVyIHRvIHRoZSByaWdodCBzaWRlIG92ZXJsYXAgd2luZG93IGNvZWZmaWNpZW50cyBvZiBhbGwgaW5kaXZpZHVhbCBJTURDVHMuCisgKiBccGFyYW0gd3JzIHBvaW50ZXIgdG8gdGhlIHJpZ2h0IHNpZGUgb3ZlcmxhcCB3aW5kb3cgY29lZmZpY2llbnRzIG9mIGFsbAorICogaW5kaXZpZHVhbCBJTURDVHMuCiAgKiBccGFyYW0gZnIgcmlnaHQgb3ZlcmxhcCB3aW5kb3cgc2lkZSBsZW5ndGggb2YgYWxsIGluZGl2aWR1YWwgSU1EQ1RzLgogICogXHBhcmFtIGdhaW4gZmFjdG9yIHRvIGFwcGx5IHRvIG91dHB1dCBzYW1wbGVzIChpZiAhPSAwKS4KKyAqIFxwYXJhbSBmbGFncyBmbGFncyBjb250cm9sbGluZyB0aGUgdHlwZSBvZiB0cmFuc2Zvcm0KICAqIFxyZXR1cm4gbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIHJldHVybmVkLgogICovCi1JTlQgIGltZGN0X2Jsb2NrKAotICAgICAgICBIX01EQ1QgaE1kY3QsCi0gICAgICAgIEZJWFBfREJMICpvdXRwdXQsCi0gICAgICAgIEZJWFBfREJMICpzcGVjdHJ1bSwKLSAgICAgICAgY29uc3QgU0hPUlQgc2NhbGVmYWN0b3JbXSwKLSAgICAgICAgY29uc3QgSU5UIG5TcGVjLAotICAgICAgICBjb25zdCBJTlQgbm9PdXRTYW1wbGVzLAotICAgICAgICBjb25zdCBJTlQgdGwsCi0gICAgICAgIGNvbnN0IEZJWFBfV1RQICp3bHMsCi0gICAgICAgIElOVCBmbCwKLSAgICAgICAgY29uc3QgRklYUF9XVFAgKndycywKLSAgICAgICAgY29uc3QgSU5UIGZyLAotICAgICAgICBGSVhQX0RCTCBnYWluICk7CitJTlQgaW1sdF9ibG9jayhIX01EQ1QgaE1kY3QsIEZJWFBfREJMICpvdXRwdXQsIEZJWFBfREJMICpzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUIHNjYWxlZmFjdG9yW10sIGNvbnN0IElOVCBuU3BlYywKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCBub091dFNhbXBsZXMsIGNvbnN0IElOVCB0bCwgY29uc3QgRklYUF9XVFAgKndscywKKyAgICAgICAgICAgICAgIElOVCBmbCwgY29uc3QgRklYUF9XVFAgKndycywgY29uc3QgSU5UIGZyLCBGSVhQX0RCTCBnYWluLAorICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKIAotCi0jZW5kaWYgLyogX19NRENUX0hfXyAqLworI2VuZGlmIC8qIE1EQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbWlwcy9hYnNfbWlwcy5oIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9hYnNfbWlwcy5oCmluZGV4IDNiOWY4NzYuLmRiYjIwNjMgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL21pcHMvYWJzX21pcHMuaAorKysgYi9saWJGREsvaW5jbHVkZS9taXBzL2Fic19taXBzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjkgKzkwLDM2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChBQlNfTUlQU19IKQorI2RlZmluZSBBQlNfTUlQU19ICiAKICNpZiBkZWZpbmVkKF9fbWlwc19fKQogCiAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX21pcHNfXykKIAotICAjaWYgZGVmaW5lZChfX21pcHNfZHNwKQotICAgICNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0QKLSAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeGFic19JCi0gICAgI2RlZmluZSBGVU5DVElPTl9maXhhYnNfUwotICAgIGlubGluZSBGSVhQX0RCTCBmaXhhYnNfRChGSVhQX0RCTCB4KSB7IHJldHVybiBfX2J1aWx0aW5fbWlwc19hYnNxX3Nfdyh4KTsgfQotICAgIGlubGluZSBGSVhQX1NHTCBmaXhhYnNfUyhGSVhQX1NHTCB4KSB7IHJldHVybiAoKHgpID4gKEZJWFBfU0dMKSgwKSkgPyAoeCkgOiAtKHgpIDsgfQotICAgIGlubGluZSBJTlQgZml4YWJzX0koSU5UIHgpICAgICAgICAgICB7IHJldHVybiBfX2J1aWx0aW5fbWlwc19hYnNxX3Nfdyh4KTsgfQotICAjZW5kaWYgLyogX19taXBzX2RzcCAqLworI2lmIGRlZmluZWQoX19taXBzX2RzcCkKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0QKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0kKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX1MKK2lubGluZSBGSVhQX0RCTCBmaXhhYnNfRChGSVhQX0RCTCB4KSB7IHJldHVybiBfX2J1aWx0aW5fbWlwc19hYnNxX3Nfdyh4KTsgfQoraW5saW5lIEZJWFBfU0dMIGZpeGFic19TKEZJWFBfU0dMIHgpIHsKKyAgcmV0dXJuICgoeCkgPiAoRklYUF9TR0wpKDApKSA/ICh4KSA6IC0oeCk7Cit9CitpbmxpbmUgSU5UIGZpeGFic19JKElOVCB4KSB7IHJldHVybiBfX2J1aWx0aW5fbWlwc19hYnNxX3Nfdyh4KTsgfQorI2VuZGlmIC8qIF9fbWlwc19kc3AgKi8KIAogI2VuZGlmIC8qIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pICovCiAKICNlbmRpZiAvKl9fbWlwc19fICovCiAKKyNlbmRpZiAvKiAhZGVmaW5lZChBQlNfTUlQU19IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbWlwcy9jbHpfbWlwcy5oIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9jbHpfbWlwcy5oCmluZGV4IGZmNDBhMDkuLjc0OGY2YzIgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL21pcHMvY2x6X21pcHMuaAorKysgYi9saWJGREsvaW5jbHVkZS9taXBzL2Nsel9taXBzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDAgKzkwLDQ1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChDTFpfTUlQU19IKQorI2RlZmluZSBDTFpfTUlQU19ICiAKICNpZiBkZWZpbmVkKF9fbWlwc19fKQogCi0jaWYgZGVmaW5lZChfX21pcHNfXykgJiYgKF9fR05VQ19fPT0yKSAmJiAobWlwcz49MzIpCisjaWYgZGVmaW5lZChfX21pcHNfXykgJiYgKF9fR05VQ19fID09IDIpICYmIChtaXBzID49IDMyKQogCi0gICNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybXpfRAotICBpbmxpbmUgSU5UIGZpeG5vcm16X0QoTE9ORyB2YWx1ZSkKLSAgewotICAgIElOVCByZXN1bHQ7Ci0gICAgX19hc21fXyAoImNseiAlMCwlMSIgOiAiPWQiIChyZXN1bHQpIDogImQiICh2YWx1ZSkpOworI2RlZmluZSBGVU5DVElPTl9maXhub3Jtel9ECitpbmxpbmUgSU5UIGZpeG5vcm16X0QoTE9ORyB2YWx1ZSkgeworICBJTlQgcmVzdWx0OworICBfX2FzbV9fKCJjbHogJTAsJTEiIDogIj1kIihyZXN1bHQpIDogImQiKHZhbHVlKSk7CiAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9CisgIHJldHVybiByZXN1bHQ7Cit9CiAKLSNlbGlmIGRlZmluZWQoX19taXBzX18pICYmIChfX0dOVUNfXz09MykgJiYgKF9fbWlwcz49MzIpCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiAoX19HTlVDX18gPT0gMykgJiYgKF9fbWlwcyA+PSAzMikKIAotICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm16X0QKLSAgSU5UIGlubGluZSBmaXhub3Jtel9EKExPTkcgdmFsdWUpCi0gIHsKLSAgICBJTlQgcmVzdWx0OwotICAgIF9fYXNtX18gKCJjbHogJVtyZXN1bHRdLCAlW3ZhbHVlXSIgOiBbcmVzdWx0XSAiPXIiIChyZXN1bHQpIDogW3ZhbHVlXSAiciIgKHZhbHVlKSkgOworI2RlZmluZSBGVU5DVElPTl9maXhub3Jtel9ECitJTlQgaW5saW5lIGZpeG5vcm16X0QoTE9ORyB2YWx1ZSkgeworICBJTlQgcmVzdWx0OworICBfX2FzbV9fKCJjbHogJVtyZXN1bHRdLCAlW3ZhbHVlXSIKKyAgICAgICAgICA6IFtyZXN1bHRdICI9ciIocmVzdWx0KQorICAgICAgICAgIDogW3ZhbHVlXSAiciIodmFsdWUpKTsKIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KIAogI2VuZGlmCiAKICNlbmRpZiAvKiBfX21pcHNfXyAqLwogCisjZW5kaWYgLyogIWRlZmluZWQoQ0xaX01JUFNfSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL21pcHMvY3BseF9tdWwuaCBiL2xpYkZESy9pbmNsdWRlL21pcHMvY3BseF9tdWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZGJkMC4uMDAwMDAwMAotLS0gYS9saWJGREsvaW5jbHVkZS9taXBzL2NwbHhfbXVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6Ci0gICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pICYmIF9fbWlwc19pc2FfcmV2IDwgNgotCi0KLS8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYKLS8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgotI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MzJYMgotLy8jZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0XzMyeDE2Ci0vLyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MTZYMgotI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdF8zMngzMlgyCi0KLSNpZiBkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyKQotaW5saW5lIHZvaWQgY3BseE11bHREaXYyKCBGSVhQX0RCTCAqY19SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIGJfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICBiX0ltKQotewotICBJTlQgcmVzdWx0OwotCi0gICBfX2FzbV9fICgibXVsdCAlW2FfUmVdLCAlW2JfUmVdO1xuIgotICAgICAgICAgICAgIm1zdWIgJVthX0ltXSwgJVtiX0ltXTtcbiIKLSAgICAgICAgICAgICJtZmhpICVbcmVzdWx0XTtcbiIKLSAgICAgICA6IFtyZXN1bHRdIj1yIihyZXN1bHQpCi0gICAgICAgOiBbYV9SZV0iZCIoYV9SZSksIFtiX1JlXSJkIihiX1JlKSwgIFthX0ltXSJkIihhX0ltKSwgW2JfSW1dImQiKGJfSW0pCi0gICAgICAgOiAibG8iKTsKLQotICAgKmNfUmUgPSByZXN1bHQ7Ci0KLSAgIF9fYXNtX18gKCJtdWx0ICVbYV9SZV0sICVbYl9JbV07XG4iCi0gICAgICAgICAgICAibWFkZCAlW2FfSW1dLCAlW2JfUmVdO1xuIgotICAgICAgICAgICAgIm1maGkgJVtyZXN1bHRdO1xuIgotICAgICAgIDogW3Jlc3VsdF0iPXIiKHJlc3VsdCkgCi0gICAgICAgOiBbYV9SZV0iciIoYV9SZSksIFtiX0ltXSJyIihiX0ltKSwgW2FfSW1dInIiKGFfSW0pLCBbYl9SZV0iciIoYl9SZSkKLSAgICAgICA6ICJsbyIpOwotICAgKmNfSW0gPSByZXN1bHQ7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoRlVOQ1RJT05fY3BseE11bHRfMzJ4MzJYMikKLWlubGluZSB2b2lkIGNwbHhNdWx0KCBGSVhQX0RCTCAqY19SZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYl9SZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYl9JbSkKLXsKLSAgSU5UIHJlc3VsdDsKLQotICAgX19hc21fXyAoIm11bHQgJVthX1JlXSwgJVtiX1JlXTtcbiIKLSAgICAgICAgICAgICJtc3ViICVbYV9JbV0sICVbYl9JbV07XG4iCi0gICAgICAgICAgICAibWZoaSAlW3Jlc3VsdF07XG4iCi0gICAgICAgICAgICAvLyJleHRyX3cgJVtyZXN1bHRdLCAzMTtcbiIKLSAgICAgICAgOiBbcmVzdWx0XSI9ciIocmVzdWx0KQotICAgICAgICA6IFthX1JlXSJyIihhX1JlKSwgW2JfUmVdInIiKGJfUmUpLCBbYV9JbV0iciIoYV9JbSksIFtiX0ltXSJyIihiX0ltKQotICAgICAgICA6ICJsbyIpOwotICAgKmNfUmUgPSByZXN1bHQ8PDE7Ci0KLSAgIF9fYXNtX18gKCJtdWx0ICVbYV9SZV0sICVbYl9JbV07XG4iCi0gICAgICAgICAgICAibWFkZCAlW2FfSW1dLCAlW2JfUmVdO1xuIgotICAgICAgICAgICAgIm1maGkgJVtyZXN1bHRdO1xuIgotICAgICAgICAgICAgLy8iZXh0cl93ICVbcmVzdWx0XSwgMzE7XG4iCi0gICAgICAgIDogW3Jlc3VsdF0iPXIiKHJlc3VsdCkKLSAgICAgICAgOiBbYV9SZV0iciIoYV9SZSksIFtiX0ltXSJyIihiX0ltKSwgW2FfSW1dInIiKGFfSW0pLCBbYl9SZV0iciIoYl9SZSkKLSAgICAgICAgOiAibG8iKTsKLSAgICpjX0ltID0gcmVzdWx0PDwxOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fbWlwc19fKSAqLwotCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9taXBzL2NwbHhfbXVsX21pcHMuaCBiL2xpYkZESy9pbmNsdWRlL21pcHMvY3BseF9tdWxfbWlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYWUxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvaW5jbHVkZS9taXBzL2NwbHhfbXVsX21pcHMuaApAQCAtMCwwICsxLDE3MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChDUExYX01VTF9NSVBTX0gpCisjZGVmaW5lIENQTFhfTVVMX01JUFNfSAorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX21pcHNfXykgJiYgX19taXBzX2lzYV9yZXYgPCA2CisKKy8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYKKy8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgorI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MzJYMgorLy8jZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0XzMyeDE2CisvLyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MTZYMgorI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdF8zMngzMlgyCisKKyNpZiBkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyKQoraW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBhX0ltLCBGSVhQX0RCTCBiX1JlLCBGSVhQX0RCTCBiX0ltKSB7CisgIElOVCByZXN1bHQ7CisKKyAgX19hc21fXygKKyAgICAgICJtdWx0ICVbYV9SZV0sICVbYl9SZV07XG4iCisgICAgICAibXN1YiAlW2FfSW1dLCAlW2JfSW1dO1xuIgorICAgICAgIm1maGkgJVtyZXN1bHRdO1xuIgorICAgICAgOiBbcmVzdWx0XSAiPXIiKHJlc3VsdCkKKyAgICAgIDogW2FfUmVdICJkIihhX1JlKSwgW2JfUmVdICJkIihiX1JlKSwgW2FfSW1dICJkIihhX0ltKSwgW2JfSW1dICJkIihiX0ltKQorICAgICAgOiAibG8iKTsKKworICAqY19SZSA9IHJlc3VsdDsKKworICBfX2FzbV9fKAorICAgICAgIm11bHQgJVthX1JlXSwgJVtiX0ltXTtcbiIKKyAgICAgICJtYWRkICVbYV9JbV0sICVbYl9SZV07XG4iCisgICAgICAibWZoaSAlW3Jlc3VsdF07XG4iCisgICAgICA6IFtyZXN1bHRdICI9ciIocmVzdWx0KQorICAgICAgOiBbYV9SZV0gInIiKGFfUmUpLCBbYl9JbV0gInIiKGJfSW0pLCBbYV9JbV0gInIiKGFfSW0pLCBbYl9SZV0gInIiKGJfUmUpCisgICAgICA6ICJsbyIpOworICAqY19JbSA9IHJlc3VsdDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdF8zMngzMlgyKQoraW5saW5lIHZvaWQgY3BseE11bHQoRklYUF9EQkwgKmNfUmUsIEZJWFBfREJMICpjX0ltLCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgYV9JbSwgRklYUF9EQkwgYl9SZSwgRklYUF9EQkwgYl9JbSkgeworICBJTlQgcmVzdWx0OworCisgIF9fYXNtX18oCisgICAgICAibXVsdCAlW2FfUmVdLCAlW2JfUmVdO1xuIgorICAgICAgIm1zdWIgJVthX0ltXSwgJVtiX0ltXTtcbiIKKyAgICAgICJtZmhpICVbcmVzdWx0XTtcbiIKKyAgICAgIC8vImV4dHJfdyAlW3Jlc3VsdF0sIDMxO1xuIgorICAgICAgOiBbcmVzdWx0XSAiPXIiKHJlc3VsdCkKKyAgICAgIDogW2FfUmVdICJyIihhX1JlKSwgW2JfUmVdICJyIihiX1JlKSwgW2FfSW1dICJyIihhX0ltKSwgW2JfSW1dICJyIihiX0ltKQorICAgICAgOiAibG8iKTsKKyAgKmNfUmUgPSByZXN1bHQgPDwgMTsKKworICBfX2FzbV9fKAorICAgICAgIm11bHQgJVthX1JlXSwgJVtiX0ltXTtcbiIKKyAgICAgICJtYWRkICVbYV9JbV0sICVbYl9SZV07XG4iCisgICAgICAibWZoaSAlW3Jlc3VsdF07XG4iCisgICAgICAvLyJleHRyX3cgJVtyZXN1bHRdLCAzMTtcbiIKKyAgICAgIDogW3Jlc3VsdF0gIj1yIihyZXN1bHQpCisgICAgICA6IFthX1JlXSAiciIoYV9SZSksIFtiX0ltXSAiciIoYl9JbSksIFthX0ltXSAiciIoYV9JbSksIFtiX1JlXSAiciIoYl9SZSkKKyAgICAgIDogImxvIik7CisgICpjX0ltID0gcmVzdWx0IDw8IDE7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pICovCisKKyNlbmRpZiAvKiAhZGVmaW5lZChDUExYX01VTF9NSVBTX0gpICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9taXBzL2ZpeG1hZGRfbWlwcy5oIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9maXhtYWRkX21pcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1NzVmYi4uMDAwMDAwMAotLS0gYS9saWJGREsvaW5jbHVkZS9taXBzL2ZpeG1hZGRfbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6Ci0gICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBkZWZpbmVkKF9fbWlwc19fKQotCi0KLSNlbmRpZiAvKiBfX21pcHNfXyAqLwotCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9taXBzL2ZpeG11bF9taXBzLmggYi9saWJGREsvaW5jbHVkZS9taXBzL2ZpeG11bF9taXBzLmgKaW5kZXggNzM2OTNlMi4uMDZjZjUzMCAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvbWlwcy9maXhtdWxfbWlwcy5oCisrKyBiL2xpYkZESy9pbmNsdWRlL21pcHMvZml4bXVsX21pcHMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMCArOTAsMzUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKEZJWE1VTF9NSVBTX0gpCisjZGVmaW5lIEZJWE1VTF9NSVBTX0gKIAogI2lmIGRlZmluZWQoX19taXBzX18pCiAKLSNpZiAoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNpZiAoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pCiAvKiBNSVBTIEdDQyBiYXNlZCBjb21waWxlciAqLwogCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfREQKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfREQKLSNkZWZpbmUgZml4bXVsZGl2MkJpdEV4YWN0X0REKGEsYikgZml4bXVsZGl2Ml9ERChhLGIpCisjZGVmaW5lIGZpeG11bGRpdjJCaXRFeGFjdF9ERChhLCBiKSBmaXhtdWxkaXYyX0REKGEsIGIpCiAKLWlubGluZSBJTlQgZml4bXVsZGl2Ml9ERCAoY29uc3QgSU5UIGEsIGNvbnN0IElOVCBiKQotewotICBJTlQgcmVzdWx0IDsKLSAgcmVzdWx0ID0gKChsb25nIGxvbmcpYSAqIGIpPj4zMjsKLSAgcmV0dXJuIHJlc3VsdCA7CitpbmxpbmUgSU5UIGZpeG11bGRpdjJfREQoY29uc3QgSU5UIGEsIGNvbnN0IElOVCBiKSB7CisgIElOVCByZXN1bHQ7CisKKyAgcmVzdWx0ID0gKChsb25nIGxvbmcpYSAqIGIpID4+IDMyOworCisgIHJldHVybiByZXN1bHQ7CiB9CiAKICNlbmRpZiAvKiAoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pICovCkBAIC0xMTEsMyArMTI3LDQgQEAKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9ERAogI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9ERCBmaXhtdWxfREQKKyNlbmRpZiAvKiAhZGVmaW5lZChGSVhNVUxfTUlQU19IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbWlwcy9zY2FsZS5oIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9zY2FsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGYyOWRhLi4wMDAwMDAwCi0tLSBhL2xpYkZESy9pbmNsdWRlL21pcHMvc2NhbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKToKLSAgIERlc2NyaXB0aW9uOgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgTUlQU19TQ0FMRV9ICi0jZGVmaW5lIE1JUFNfU0NBTEVfSAotCi0jaWYgZGVmaW5lZChfX21pcHNfZHNwKQotCi0vKiEKLSoKLSogIFxicmllZiAgU2NhbGUgaW5wdXQgdmFsdWUgYnkgMl57c2NhbGV9IGFuZCBzYXR1cmF0ZSBvdXRwdXQgdG8gMl57ZEJpdHMtMX0KLSogIFxyZXR1cm4gc2NhbGVkIGFuZCBzYXR1cmF0ZWQgdmFsdWUKLSoKLSogIFRoaXMgbWFjcm8gc2NhbGVzIHNyYyB2YWx1ZSByaWdodCBvciBsZWZ0IGFuZCBhcHBsaWVzIHNhdHVyYXRpb24gdG8gKDJeZEJpdHMpLTEKLSogIG1heGltYSBvdXRwdXQuCi0qLwotI2RlZmluZSBTQVRVUkFURV9SSUdIVF9TSElGVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgXAotICAgICAgICAgIChfX2J1aWx0aW5fbWlwc19zaGxsX3Nfdygoc3JjKT4+c2NhbGUsKERGUkFDVF9CSVRTLShkQml0cykpKT4+KERGUkFDVF9CSVRTLShkQml0cykpKQotCi0KLSNlbmRpZiAvKl9fbWlwc19kc3AgKi8KLQotI2VuZGlmIC8qIE1JUFNfU0NBTEVfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbWlwcy9zY2FsZV9taXBzLmggYi9saWJGREsvaW5jbHVkZS9taXBzL3NjYWxlX21pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzE0MWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9zY2FsZV9taXBzLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQ0FMRV9NSVBTX0gKKyNkZWZpbmUgU0NBTEVfTUlQU19ICisKKyNpZiBkZWZpbmVkKF9fbWlwc19kc3ApCisKKy8qIQorICoKKyAqICBcYnJpZWYgIFNjYWxlIGlucHV0IHZhbHVlIGJ5IDJee3NjYWxlfSBhbmQgc2F0dXJhdGUgb3V0cHV0IHRvIDJee2RCaXRzLTF9CisgKiAgXHJldHVybiBzY2FsZWQgYW5kIHNhdHVyYXRlZCB2YWx1ZQorICoKKyAqICBUaGlzIG1hY3JvIHNjYWxlcyBzcmMgdmFsdWUgcmlnaHQgb3IgbGVmdCBhbmQgYXBwbGllcyBzYXR1cmF0aW9uIHRvCisgKiAoMl5kQml0cyktMSBtYXhpbWEgb3V0cHV0LgorICovCisjZGVmaW5lIFNBVFVSQVRFX1JJR0hUX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoX19idWlsdGluX21pcHNfc2hsbF9zX3coKHNyYykgPj4gKHNjYWxlKSwgKERGUkFDVF9CSVRTIC0gKGRCaXRzKSkpID4+IFwKKyAgIChERlJBQ1RfQklUUyAtIChkQml0cykpKQorCisjZW5kaWYgLypfX21pcHNfZHNwICovCisKKyNlbmRpZiAvKiBTQ0FMRV9NSVBTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL21pcHMvc2NyYW1ibGUuaCBiL2xpYkZESy9pbmNsdWRlL21pcHMvc2NyYW1ibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyZmU2ZS4uMDAwMDAwMAotLS0gYS9saWJGREsvaW5jbHVkZS9taXBzL3NjcmFtYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6Ci0gICBEZXNjcmlwdGlvbjoKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIE1JUFNfU0NSQU1CTEVfSAotI2RlZmluZSBNSVBTX1NDUkFNQkxFX0gKLQotI2RlZmluZSBGVU5DVElPTl9zY3JhbWJsZQotCi0jaWYgZGVmaW5lZChGVU5DVElPTl9zY3JhbWJsZSkKLWlubGluZSB2b2lkIHNjcmFtYmxlKEZJWFBfREJMICp4LCBJTlQgbikgewotICBJTlQgbSxqOwotICBpbnQgbGRuPTE7Ci0gIGRvIHtsZG4rKzt9IHdoaWxlKCgxPDxsZG4pPG4pOwotCi0gIGZvciAobT0xLGo9MDsgbTxuLTE7IG0rKykKLSAgewotICAgIGogPSBfX2J1aWx0aW5fbWlwc19iaXRyZXYobSkgPj4gKDE2LWxkbik7Ci0KLSAgICBpZiAoaj5tKQotICAgIHsKLSAgICAgIEZJWFBfREJMIHRtcDsKLSAgICAgIHRtcD14WzIqbV07Ci0gICAgICB4WzIqbV09eFsyKmpdOwotICAgICAgeFsyKmpdPXRtcDsKLQotICAgICAgdG1wPXhbMiptKzFdOwotICAgICAgeFsyKm0rMV09eFsyKmorMV07Ci0gICAgICB4WzIqaisxXT10bXA7Ci0gICAgfQotICB9Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIE1JUFNfU0NSQU1CTEVfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbWlwcy9zY3JhbWJsZV9taXBzLmggYi9saWJGREsvaW5jbHVkZS9taXBzL3NjcmFtYmxlX21pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGMyZTZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9zY3JhbWJsZV9taXBzLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQ1JBTUJMRV9NSVBTX0gKKyNkZWZpbmUgU0NSQU1CTEVfTUlQU19ICisKKyNkZWZpbmUgRlVOQ1RJT05fc2NyYW1ibGUKKworI2lmIGRlZmluZWQoRlVOQ1RJT05fc2NyYW1ibGUpCitpbmxpbmUgdm9pZCBzY3JhbWJsZShGSVhQX0RCTCAqeCwgSU5UIG4pIHsKKyAgSU5UIG0sIGo7CisgIGludCBsZG4gPSAxOworICBkbyB7CisgICAgbGRuKys7CisgIH0gd2hpbGUgKCgxIDw8IGxkbikgPCBuKTsKKworICBmb3IgKG0gPSAxLCBqID0gMDsgbSA8IG4gLSAxOyBtKyspIHsKKyAgICBqID0gX19idWlsdGluX21pcHNfYml0cmV2KG0pID4+ICgxNiAtIGxkbik7CisKKyAgICBpZiAoaiA+IG0pIHsKKyAgICAgIEZJWFBfREJMIHRtcDsKKyAgICAgIHRtcCA9IHhbMiAqIG1dOworICAgICAgeFsyICogbV0gPSB4WzIgKiBqXTsKKyAgICAgIHhbMiAqIGpdID0gdG1wOworCisgICAgICB0bXAgPSB4WzIgKiBtICsgMV07CisgICAgICB4WzIgKiBtICsgMV0gPSB4WzIgKiBqICsgMV07CisgICAgICB4WzIgKiBqICsgMV0gPSB0bXA7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNDUkFNQkxFX01JUFNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbmxjX2RlYy5oIGIvbGliRkRLL2luY2x1ZGUvbmxjX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTk3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvaW5jbHVkZS9ubGNfZGVjLmgKQEAgLTAsMCArMSwxODcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE9tZXIgT3NtYW4KKworICAgRGVzY3JpcHRpb246IFNBQy9TQU9DIERlYyBOb2lzZWxlc3MgQ29kaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTkxDX0RFQ19ICisjZGVmaW5lIE5MQ19ERUNfSAorCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImh1ZmZfbm9kZXMuaCIKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKK3R5cGVkZWYgZW51bSB7CisKKyAgU0FDX0RFQ09ERVIsCisgIFNBT0NfREVDT0RFUiwKKyAgVVNBQ19ERUNPREVSCisKK30gREVDT0RFUl9UWVBFOworCit0eXBlZGVmIGVudW0geworICB0X0NMRCwKKyAgdF9JQ0MsCisgIHRfSVBELAorICB0X09MRCwKKyAgdF9JT0MsCisgIHRfTlJHLAorICB0X0RDTEQsCisgIHRfRE1HLAorICB0X1BERworCit9IERBVEFfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKworICBCQUNLV0FSRFMgPSAweDAsCisgIEZPUldBUkRTID0gMHgxCisKK30gRElSRUNUSU9OOworCit0eXBlZGVmIGVudW0geworCisgIERJRkZfRlJFUSA9IDB4MCwKKyAgRElGRl9USU1FID0gMHgxCisKK30gRElGRl9UWVBFOworCit0eXBlZGVmIGVudW0geworCisgIEhVRkZfMUQgPSAweDAsCisgIEhVRkZfMkQgPSAweDEKKworfSBDT0RJTkdfU0NIRU1FOworCit0eXBlZGVmIGVudW0geworCisgIEZSRVFfUEFJUiA9IDB4MCwKKyAgVElNRV9QQUlSID0gMHgxCisKK30gUEFJUklORzsKKworI2lmbmRlZiBIVUZGREVDX1BBUkFNUworI2RlZmluZSBIVUZGREVDX1BBUk1TCisKKyNkZWZpbmUgUEFJUl9TSElGVCA0CisjZGVmaW5lIFBBSVJfTUFTSyAweGYKKworI2RlZmluZSBNQVhfRU5UUklFUyAxNjgKKyNkZWZpbmUgSEFORExFX0hVRkZfTk9ERSBjb25zdCBTSE9SVCgqKVtNQVhfRU5UUklFU11bMl0KKworI2VuZGlmIC8qIEhVRkZERUNQQVJBTVMgKi8KKworI2RlZmluZSBIVUZGREVDX09LIDAKKyNkZWZpbmUgSFVGRkRFQ19OT1RPSyAoLTEpCisKK3R5cGVkZWYgaW50IEVSUk9SX3Q7CisKK0VSUk9SX3QgRWNEYXRhUGFpckRlYyhERUNPREVSX1RZUEUgREVDT0RFUiwgSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqYWFPdXREYXRhMSwgU0NIQVIgKmFhT3V0RGF0YTIsIFNDSEFSICphSGlzdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRBX1RZUEUgZGF0YV90eXBlLCBpbnQgc3RhcnRCYW5kLCBpbnQgZGF0YUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBwYWlyX2ZsYWcsIGludCBjb2Fyc2VfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dEaWZmVGltZUJhY2tfZmxhZyk7CisKKy8qIG5lZWRlZCBmb3IgR0VTLSAmIFNUUC10b29sICovCitFUlJPUl90IGh1ZmZfZGVjX3Jlc2hhcGUoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwgaW50ICpvdXRfZGF0YSwgaW50IG51bV92YWwpOworCitleHRlcm4gRVJST1JfdCBzeW1fcmVzdG9yZUlQRChIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLCBpbnQgbGF2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgZGF0YVsyXSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvcW1mLmggYi9saWJGREsvaW5jbHVkZS9xbWYuaAppbmRleCBiZTY5NDc3Li42MDljNmYxIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9xbWYuaAorKysgYi9saWJGREsvaW5jbHVkZS9xbWYuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNzAgKzkwLDIxMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZSAgIHFtZi5oCi0gIFxicmllZiAgQ29tcGxleCBxbWYgYW5hbHlzaXMvc3ludGhlc2lzICAgCisgIFxicmllZiAgQ29tcGxleCBxbWYgYW5hbHlzaXMvc3ludGhlc2lzCiAgIFxhdXRob3IgTWFya3VzIFdlcm5lcgogCiAqLwotI2lmbmRlZiBfX1FNRl9ICi0jZGVmaW5lIF9fUU1GX0gKIAotCisjaWZuZGVmIFFNRl9ICisjZGVmaW5lIFFNRl9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogI2luY2x1ZGUgImRjdC5oIgogCi0vKgotICogRmlsdGVyIGNvZWZmaWNpZW50IHR5cGUgZGVmaW5pdGlvbgotICovCi0jaWZkZWYgUU1GX0RBVEFfMTZCSVQKLSNkZWZpbmUgRklYUF9RTUYgRklYUF9TR0wKLSNkZWZpbmUgRlhfREJMMkZYX1FNRiBGWF9EQkwyRlhfU0dMCi0jZGVmaW5lIEZYX1FNRjJGWF9EQkwgRlhfU0dMMkZYX0RCTAotI2RlZmluZSBRRlJBQ1RfQklUUyBGUkFDVF9CSVRTCi0jZWxzZQotI2RlZmluZSBGSVhQX1FNRiBGSVhQX0RCTAotI2RlZmluZSBGWF9EQkwyRlhfUU1GCi0jZGVmaW5lIEZYX1FNRjJGWF9EQkwKLSNkZWZpbmUgUUZSQUNUX0JJVFMgREZSQUNUX0JJVFMKLSNlbmRpZgotCi0vKiBBUk0gbmVvbiBvcHRpbWl6ZWQgUU1GIGFuYWx5c2lzIGZpbHRlciByZXF1aXJlcyAzMiBiaXQgaW5wdXQuCi0gICBJbXBsZW1lbnRlZCBmb3IgUlZDVCBvbmx5LCBjdXJyZW50bHkgZGlzYWJsZWQuIFNlZSBzcmMvYXJtL3FtZl9hcm0uY3BwOjQ1ICovCiAjZGVmaW5lIEZJWFBfUUFTIEZJWFBfUENNCiAjZGVmaW5lIFFBU19CSVRTIFNBTVBMRV9CSVRTCiAKLSNpZmRlZiBRTUZTWU5fU1RBVEVTXzE2QklUCi0jZGVmaW5lIEZJWFBfUVNTIEZJWFBfU0dMCi0jZGVmaW5lIFFTU19CSVRTIEZSQUNUX0JJVFMKLSNlbHNlCiAjZGVmaW5lIEZJWFBfUVNTIEZJWFBfREJMCiAjZGVmaW5lIFFTU19CSVRTIERGUkFDVF9CSVRTCi0jZW5kaWYKIAogLyogRmxhZ3MgZm9yIFFNRiBpbnRpYWxpemF0aW9uICovCiAvKiBMb3cgUG93ZXIgbW9kZSBmbGFnICovCi0jZGVmaW5lIFFNRl9GTEFHX0xQICAgICAgICAgICAxCi0vKiBGaWx0ZXIgaXMgbm90IHN5bWV0cmljLiBUaGlzIGZsYWcgaXMgc2V0IGludGVybmFsbHkgaW4gdGhlIFFNRiBpbml0aWFsaXphdGlvbiBhcyByZXF1aXJlZC4gKi8KKyNkZWZpbmUgUU1GX0ZMQUdfTFAgMQorLyogRmlsdGVyIGlzIG5vdCBzeW1tZXRyaWMuIFRoaXMgZmxhZyBpcyBzZXQgaW50ZXJuYWxseSBpbiB0aGUgUU1GCisgKiBpbml0aWFsaXphdGlvbiBhcyByZXF1aXJlZC4gKi8KKy8qIERPIE5PVCBQQVNTIFRISVMgRkxBRyBUTyBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rIG9yCisgKiBxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuayAqLwogI2RlZmluZSBRTUZfRkxBR19OT05TWU1NRVRSSUMgMgogLyogQ29tcGxleCBMb3cgRGVsYXkgRmlsdGVyIEJhbmsgKG9yIHN0ZCBzeW1tZXRyaWMgZmlsdGVyIGJhbmspICovCi0jZGVmaW5lIFFNRl9GTEFHX0NMREZCICAgICAgICA0CisjZGVmaW5lIFFNRl9GTEFHX0NMREZCIDQKIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBzdGF0ZXMgc2hvdWxkIGJlIGtlcHQuICovCi0jZGVmaW5lIFFNRl9GTEFHX0tFRVBfU1RBVEVTICA4CisjZGVmaW5lIFFNRl9GTEFHX0tFRVBfU1RBVEVTIDgKIC8qIENvbXBsZXggTG93IERlbGF5IEZpbHRlciBCYW5rIHVzZWQgaW4gTVBFRyBTdXJyb3VuZCBFbmNvZGVyICovCi0jZGVmaW5lIFFNRl9GTEFHX01QU0xERkIgICAgIDE2Ci0vKiBDb21wbGV4IExvdyBEZWxheSBGaWx0ZXIgQmFuayB1c2VkIGluIE1QRUcgU3Vycm91bmQgRW5jb2RlciBhbGxvd3MgYSBvcHRpbWl6ZWQgY2FsY3VsYXRpb24gb2YgdGhlIG1vZHVsYXRpb24gaW4gcW1mRm9yd2FyZE1vZHVsYXRpb25IUSgpICovCi0jZGVmaW5lIFFNRl9GTEFHX01QU0xERkJfT1BUSU1JWkVfTU9EVUxBVElPTiAgMzIKLS8qIEZsYWcgdG8gaW5kaWNhdGUgSEUtQUFDIGRvd24tc2FtcGxlZCBTQlIgbW9kZSAoZGVjb2RlcikgLT4gYWRhcHQgYW5hbHlzaXMgcG9zdCB0d2lkZGxpbmcgKi8KLSNkZWZpbmUgUU1GX0ZMQUdfRE9XTlNBTVBMRUQgIDY0CisjZGVmaW5lIFFNRl9GTEFHX01QU0xERkIgMTYKKy8qIENvbXBsZXggTG93IERlbGF5IEZpbHRlciBCYW5rIHVzZWQgaW4gTVBFRyBTdXJyb3VuZCBFbmNvZGVyIGFsbG93cyBhCisgKiBvcHRpbWl6ZWQgY2FsY3VsYXRpb24gb2YgdGhlIG1vZHVsYXRpb24gaW4gcW1mRm9yd2FyZE1vZHVsYXRpb25IUSgpICovCisjZGVmaW5lIFFNRl9GTEFHX01QU0xERkJfT1BUSU1JWkVfTU9EVUxBVElPTiAzMgorLyogRmxhZyB0byBpbmRpY2F0ZSBIRS1BQUMgZG93bi1zYW1wbGVkIFNCUiBtb2RlIChkZWNvZGVyKSAtPiBhZGFwdCBhbmFseXNpcworICogcG9zdCB0d2lkZGxpbmcgKi8KKyNkZWZpbmUgUU1GX0ZMQUdfRE9XTlNBTVBMRUQgNjQKIAorI2RlZmluZSBRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyAoNjQpCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGludCBsYl9zY2FsZTsgICAgICAgIC8qITwgU2NhbGUgb2YgbG93IGJhbmQgYXJlYSAgICAgICAgICAgICAgICAgICAqLwotICBpbnQgb3ZfbGJfc2NhbGU7ICAgICAvKiE8IFNjYWxlIG9mIGFkanVzdGVkIG92ZXJsYXAgbG93IGJhbmQgYXJlYSAgKi8KLSAgaW50IGhiX3NjYWxlOyAgICAgICAgLyohPCBTY2FsZSBvZiBoaWdoIGJhbmQgYXJlYSAgICAgICAgICAgICAgICAgICovCi0gIGludCBvdl9oYl9zY2FsZTsgICAgIC8qITwgU2NhbGUgb2YgYWRqdXN0ZWQgb3ZlcmxhcCBoaWdoIGJhbmQgYXJlYSAqLworLyohCisgKiBcYnJpZWYgQWxnb3JpdGhtaWMgc2NhbGluZyBpbiBzYnJGb3J3YXJkTW9kdWxhdGlvbigpCisgKgorICogVGhlIHNjYWxpbmcgaW4gc2JyRm9yd2FyZE1vZHVsYXRpb24oKSBpcyBjYXVzZWQgYnk6CisgKgorICogICBcbGkgMSBSX1NISUZUIGluIHNickZvcndhcmRNb2R1bGF0aW9uKCkKKyAqICAgXGxpIDUvNiBSX1NISUZUIGluIGRjdDMoKSBpZiB1c2luZyAzMi82NCBCYW5kcworICogICBcbGkgMSBvbWl0dGVkIGdhaW4gb2YgMi4wIGluIHFtZkZvcndhcmRNb2R1bGF0aW9uKCkKKyAqLworI2RlZmluZSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgNworCisvKiEKKyAqIFxicmllZiBBbGdvcml0aG1pYyBzY2FsaW5nIGluIGNwbHhTeW50aGVzaXNRbWZGaWx0ZXJpbmcoKQorICoKKyAqIFRoZSBzY2FsaW5nIGluIGNwbHhTeW50aGVzaXNRbWZGaWx0ZXJpbmcoKSBpcyBjYXVzZWQgYnk6CisgKgorICogICBcbGkgIDUvNiBSX1NISUZUIGluIGRjdDIoKSBpZiB1c2luZyAzMi82NCBCYW5kcworICogICBcbGkgIDEgb21pdHRlZCBnYWluIG9mIDIuMCBpbiBxbWZJbnZlcnNlTW9kdWxhdGlvbigpCisgKiAgIFxsaSAtNiBkaXZpc2lvbiBieSA2NCBpbiBzeW50aGVzaXMgZmlsdGVyYmFuaworICogICBcbGkgeCBiaXRzIGV4dGVybmFsIGluZmx1ZW5jZQorICovCisjZGVmaW5lIEFMR09SSVRITUlDX1NDQUxJTkdfSU5fU1lOVEhFU0lTX0ZJTFRFUkJBTksgMQorCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBsYl9zY2FsZTsgICAgLyohPCBTY2FsZSBvZiBsb3cgYmFuZCBhcmVhICAgICAgICAgICAgICAgICAgICovCisgIGludCBvdl9sYl9zY2FsZTsgLyohPCBTY2FsZSBvZiBhZGp1c3RlZCBvdmVybGFwIGxvdyBiYW5kIGFyZWEgICovCisgIGludCBoYl9zY2FsZTsgICAgLyohPCBTY2FsZSBvZiBoaWdoIGJhbmQgYXJlYSAgICAgICAgICAgICAgICAgICovCisgIGludCBvdl9oYl9zY2FsZTsgLyohPCBTY2FsZSBvZiBhZGp1c3RlZCBvdmVybGFwIGhpZ2ggYmFuZCBhcmVhICovCiB9IFFNRl9TQ0FMRV9GQUNUT1I7CiAKLXN0cnVjdCBRTUZfRklMVEVSX0JBTksKLXsKLSAgY29uc3QgRklYUF9QRlQgKnBfZmlsdGVyOyAgICAgLyohPCBQb2ludGVyIHRvIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK3N0cnVjdCBRTUZfRklMVEVSX0JBTksgeworICBjb25zdCBGSVhQX1BGVCAqcF9maWx0ZXI7IC8qITwgUG9pbnRlciB0byBmaWx0ZXIgY29lZmZpY2llbnRzICovCiAKLSAgdm9pZCAqRmlsdGVyU3RhdGVzOyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGJ1ZmZlciBvZiBmaWx0ZXIgc3RhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9QQ00gaW4gYW5hbHlzZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBpbiBzeW50aGVzaXMgZmlsdGVyICovCi0gIGludCBGaWx0ZXJTaXplOyAgICAgICAgICAgICAgIC8qITwgU2l6ZSBvZiBwcm90b3R5cGUgZmlsdGVyLiAqLwotICBjb25zdCBGSVhQX1FUVyAqdF9jb3M7ICAgICAgICAvKiE8IE1vZHVsYXRpb24gdGFibGVzLiAqLworICB2b2lkICpGaWx0ZXJTdGF0ZXM7ICAgIC8qITwgUG9pbnRlciB0byBidWZmZXIgb2YgZmlsdGVyIHN0YXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9QQ00gaW4gYW5hbHlzZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGluIHN5bnRoZXNpcyBmaWx0ZXIgKi8KKyAgaW50IEZpbHRlclNpemU7ICAgICAgICAvKiE8IFNpemUgb2YgcHJvdG90eXBlIGZpbHRlci4gKi8KKyAgY29uc3QgRklYUF9RVFcgKnRfY29zOyAvKiE8IE1vZHVsYXRpb24gdGFibGVzLiAqLwogICBjb25zdCBGSVhQX1FUVyAqdF9zaW47Ci0gIGludCBmaWx0ZXJTY2FsZTsgICAgICAgICAgICAgIC8qITwgZmlsdGVyIHNjYWxlICovCisgIGludCBmaWx0ZXJTY2FsZTsgLyohPCBmaWx0ZXIgc2NhbGUgKi8KIAotICBpbnQgbm9fY2hhbm5lbHM7ICAgICAgICAgICAgICAvKiE8IFRvdGFsIG51bWJlciBvZiBjaGFubmVscyAoc3ViYmFuZHMpICovCi0gIGludCBub19jb2w7ICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUgc2xvdHMgICAgICAgKi8KLSAgaW50IGxzYjsgICAgICAgICAgICAgICAgICAgICAgLyohPCBUb3Agb2YgbG93IHN1YmJhbmRzICovCi0gIGludCB1c2I7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgVG9wIG9mIGhpZ2ggc3ViYmFuZHMgKi8KKyAgaW50IG5vX2NoYW5uZWxzOyAvKiE8IFRvdGFsIG51bWJlciBvZiBjaGFubmVscyAoc3ViYmFuZHMpICovCisgIGludCBub19jb2w7ICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyAgICAgICAqLworICBpbnQgbHNiOyAgICAgICAgIC8qITwgVG9wIG9mIGxvdyBzdWJiYW5kcyAqLworICBpbnQgdXNiOyAgICAgICAgIC8qITwgVG9wIG9mIGhpZ2ggc3ViYmFuZHMgKi8KIAotICBpbnQgb3V0U2NhbGVmYWN0b3I7ICAgICAgICAgICAvKiE8IFNjYWxlIGZhY3RvciBvZiBvdXRwdXQgZGF0YSAoc3luIG9ubHkpICovCi0gIEZJWFBfREJMIG91dEdhaW47ICAgICAgICAgICAgIC8qITwgR2FpbiBvdXRwdXQgZGF0YSAoc3luIG9ubHkpIChpbml0IHdpdGggMHg4MDAwMDAwMCB0byBpZ25vcmUpICovCisgIGludCBzeW5TY2FsZWZhY3RvcjsgLyohPCBTY2FsZSBmYWN0b3Igb2Ygc3ludGhlc2lzIHFtZiAoc3luIG9ubHkpICovCisgIGludCBvdXRTY2FsZWZhY3RvcjsgLyohPCBTY2FsZSBmYWN0b3Igb2Ygb3V0cHV0IGRhdGEgKHN5biBvbmx5KSAqLworICBGSVhQX0RCTCBvdXRHYWluX207IC8qITwgTWFudGlzc2Egb2YgZ2FpbiBvdXRwdXQgZGF0YSAoc3luIG9ubHkpIChpbml0IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwIHRvIGlnbm9yZSkgKi8KKyAgaW50IG91dEdhaW5fZTsgICAgICAvKiE8IEV4cG9uZW50IG9mIGdhaW4gb3V0cHV0IGRhdGEgKHN5biBvbmx5KSAqLwogCi0gIFVJTlQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qITwgZmxhZ3MgKi8KLSAgVUNIQVIgcF9zdHJpZGU7ICAgICAgICAgICAgICAgLyohPCBTdHJpZGUgRmFjdG9yIG9mIHBvbHlwaGFzZSBmaWx0ZXJzICovCi0KKyAgVUlOVCBmbGFnczsgICAgIC8qITwgZmxhZ3MgKi8KKyAgVUNIQVIgcF9zdHJpZGU7IC8qITwgU3RyaWRlIEZhY3RvciBvZiBwb2x5cGhhc2UgZmlsdGVycyAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgUU1GX0ZJTFRFUl9CQU5LICpIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LOwogCi12b2lkCi1xbWZBbmFseXNpc0ZpbHRlcmluZyggSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsICAvKiE8IEhhbmRsZSBvZiBRbWYgQW5hbHlzaXMgQmFuayAgICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKipxbWZSZWFsLCAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcmVhbCBzdWJiYW5kIHNsb3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKipxbWZJbWFnLCAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2NhbGVGYWN0b3IsICAvKiE8IFNjYWxlIGZhY3RvcnMgb2YgUU1GIGRhdGEgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSAqdGltZUluLCAgICAgICAgICAvKiE8IFRpbWUgc2lnbmFsICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBzdHJpZGUsICAgICAgICAgICAgICAvKiE8IFN0cmlkZSBmYWN0b3Igb2YgYXVkaW8gZGF0YSAgICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICpwV29ya0J1ZmZlciAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICApOwordm9pZCBxbWZBbmFseXNpc0ZpbHRlcmluZygKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgICAqLworICAgIEZJWFBfREJMICoqcW1mUmVhbCwgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcmVhbCBzdWJiYW5kIHNsb3RzICovCisgICAgRklYUF9EQkwgKipxbWZJbWFnLCAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBpbWFnIHN1YmJhbmQgc2xvdHMgKi8KKyAgICBRTUZfU0NBTEVfRkFDVE9SICpzY2FsZUZhY3RvciwgLyohPCBTY2FsZSBmYWN0b3JzIG9mIFFNRiBkYXRhICAgICAqLworICAgIGNvbnN0IExPTkcgKnRpbWVJbiwgICAgICAgICAgICAvKiE8IFRpbWUgc2lnbmFsICovCisgICAgY29uc3QgaW50IHRpbWVJbl9lLCAgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgYXVkaW8gZGF0YSAgICAgICAgKi8KKyAgICBjb25zdCBpbnQgc3RyaWRlLCAgICAgICAgICAgICAgLyohPCBTdHJpZGUgZmFjdG9yIG9mIGF1ZGlvIGRhdGEgICAqLworICAgIEZJWFBfREJMICpwV29ya0J1ZmZlciAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYXJ5IHdvcmtpbmcgYnVmZmVyICovCispOwogCi12b2lkCi1xbWZTeW50aGVzaXNGaWx0ZXJpbmcoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAgICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAqKlFtZkJ1ZmZlclJlYWwsICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcmVhbCBzdWJiYW5kIHNsb3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAqKlFtZkJ1ZmZlckltYWcsICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFNRl9TQ0FMRV9GQUNUT1IgKnNjYWxlRmFjdG9yLCAvKiE8IFNjYWxlIGZhY3RvcnMgb2YgUU1GIGRhdGEgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIG92X2xlbiwgICAgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBiYW5kIG92ZXJsYXAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgKnRpbWVPdXQsICAgICAgICAgICAgICAgICAvKiE8IFRpbWUgc2lnbmFsICovCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIHN0cmlkZSwgICAgICAgICAgICAgICAgICAvKiE8IFN0cmlkZSBmYWN0b3Igb2YgYXVkaW8gZGF0YSAgICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAgKnBXb3JrQnVmZmVyICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKTsKK3ZvaWQgcW1mQW5hbHlzaXNGaWx0ZXJpbmcoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBBbmFseXNpcyBCYW5rICAgKi8KKyAgICBGSVhQX0RCTCAqKnFtZlJlYWwsICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHJlYWwgc3ViYmFuZCBzbG90cyAqLworICAgIEZJWFBfREJMICoqcW1mSW1hZywgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCisgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2NhbGVGYWN0b3IsIC8qITwgU2NhbGUgZmFjdG9ycyBvZiBRTUYgZGF0YSAgICAgKi8KKyAgICBjb25zdCBJTlRfUENNICp0aW1lSW4sICAgICAgICAgLyohPCBUaW1lIHNpZ25hbCAqLworICAgIGNvbnN0IGludCB0aW1lSW5fZSwgICAgICAgICAgICAvKiE8IEV4cG9uZW50IG9mIGF1ZGlvIGRhdGEgICAgICAgICovCisgICAgY29uc3QgaW50IHN0cmlkZSwgICAgICAgICAgICAgIC8qITwgU3RyaWRlIGZhY3RvciBvZiBhdWRpbyBkYXRhICAgKi8KKyAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCispOwogCi1pbnQKLXFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgaF9RbWYsIC8qITwgUU1GIEhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RQVMgKnBGaWx0ZXJTdGF0ZXMsICAgICAgLyohPCBQb2ludGVyIHRvIGZpbHRlciBzdGF0ZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbHMsICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUgc2xvdHMgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBsb3dlciBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdXBwZXIgYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jaGFubmVscywgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNyaXRpY2FsbHkgc2FtcGxlZCBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsgICAgICAgICAgICAgICAgICAgLyohPCBGbGFncyAqLwordm9pZCBxbWZTeW50aGVzaXNGaWx0ZXJpbmcoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgICAgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgKi8KKyAgICBGSVhQX0RCTCAqKlFtZkJ1ZmZlclJlYWwsICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHJlYWwgc3ViYmFuZCBzbG90cyAqLworICAgIEZJWFBfREJMICoqUW1mQnVmZmVySW1hZywgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCisgICAgY29uc3QgUU1GX1NDQUxFX0ZBQ1RPUiAqc2NhbGVGYWN0b3IsIC8qITwgU2NhbGUgZmFjdG9ycyBvZiBRTUYgZGF0YSAgICAgKi8KKyAgICBjb25zdCBpbnQgb3ZfbGVuLCAgICAgICAgICAgICAgICAgICAgLyohPCBMZW5ndGggb2YgYmFuZCBvdmVybGFwICAgICAgICAqLworICAgIElOVF9QQ00gKnRpbWVPdXQsICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWUgc2lnbmFsICovCisgICAgY29uc3QgSU5UIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgIC8qITwgU3RyaWRlIGZhY3RvciBvZiBhdWRpbyBkYXRhICAgKi8KKyAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFyeSB3b3JraW5nIGJ1ZmZlci4gSXQgbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkICovCispOwogCi12b2lkCi1xbWZBbmFseXNpc0ZpbHRlcmluZ1Nsb3QoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgICAgICpxbWZSZWFsLCAgICAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIHJlYWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICAgICAqcW1mSW1hZywgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCBpbWFnICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00gKnRpbWVJbiwgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgIHN0cmlkZSwgICAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAgICAgKnBXb3JrQnVmZmVyICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgKTsKK2ludCBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgaF9RbWYsIC8qITwgUU1GIEhhbmRsZSAqLworICAgIEZJWFBfUUFTICpwRmlsdGVyU3RhdGVzLCAgICAgIC8qITwgUG9pbnRlciB0byBmaWx0ZXIgc3RhdGUgYnVmZmVyICovCisgICAgaW50IG5vQ29scywgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyAgKi8KKyAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBsb3dlciBiYW5kcyAqLworICAgIGludCB1c2IsICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHVwcGVyIGJhbmRzICovCisgICAgaW50IG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY3JpdGljYWxseSBzYW1wbGVkIGJhbmRzICovCisgICAgaW50IGZsYWdzKTsgICAgICAgICAgICAgICAgICAgLyohPCBGbGFncyAqLwogCi1pbnQKLXFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGhfUW1mLCAvKiE8IFFNRiBIYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FTUyAqcEZpbHRlclN0YXRlcywgICAgICAvKiE8IFBvaW50ZXIgdG8gZmlsdGVyIHN0YXRlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbHMsICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUgc2xvdHMgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgbG93ZXIgYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB1cHBlciBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jaGFubmVscywgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNyaXRpY2FsbHkgc2FtcGxlZCBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7ICAgICAgICAgICAgICAgICAgIC8qITwgRmxhZ3MgKi8KK3ZvaWQgcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCisgICAgRklYUF9EQkwgKnFtZlJlYWwsICAgICAgICAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIHJlYWwgKi8KKyAgICBGSVhQX0RCTCAqcW1mSW1hZywgICAgICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgaW1hZyAqLworICAgIGNvbnN0IExPTkcgKnRpbWVJbiwgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgKi8KKyAgICBjb25zdCBpbnQgc3RyaWRlLCAgICAgICAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIGlucHV0ICovCisgICAgRklYUF9EQkwgKnBXb3JrQnVmZmVyICAgICAgICAgIC8qITwgcG9pbnRlciB0byB0ZW1wb3Jhcnkgd29ya2luZyBidWZmZXIgKi8KKyk7CiAKLXZvaWQgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdCggSEFORExFX1FNRl9GSUxURVJfQkFOSyAgc3luUW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqcmVhbFNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUU1GICppbWFnU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICp0aW1lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgICAgICAqcFdvcmtCdWZmZXIpOwordm9pZCBxbWZBbmFseXNpc0ZpbHRlcmluZ1Nsb3QoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgKi8KKyAgICBGSVhQX0RCTCAqcW1mUmVhbCwgICAgICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgcmVhbCAqLworICAgIEZJWFBfREJMICpxbWZJbWFnLCAgICAgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCBpbWFnICovCisgICAgY29uc3QgSU5UX1BDTSAqdGltZUluLCAgICAgICAgIC8qITwgUG9pbnRlciB0byBpbnB1dCAqLworICAgIGNvbnN0IGludCBzdHJpZGUsICAgICAgICAgICAgICAvKiE8IHN0cmlkZSBmYWN0b3Igb2YgaW5wdXQgKi8KKyAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCispOworaW50IHFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgaF9RbWYsIC8qITwgUU1GIEhhbmRsZSAqLworICAgIEZJWFBfUVNTICpwRmlsdGVyU3RhdGVzLCAgICAgIC8qITwgUG9pbnRlciB0byBmaWx0ZXIgc3RhdGUgYnVmZmVyICovCisgICAgaW50IG5vQ29scywgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyAgKi8KKyAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBsb3dlciBiYW5kcyAqLworICAgIGludCB1c2IsICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHVwcGVyIGJhbmRzICovCisgICAgaW50IG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY3JpdGljYWxseSBzYW1wbGVkIGJhbmRzICovCisgICAgaW50IGZsYWdzKTsgICAgICAgICAgICAgICAgICAgLyohPCBGbGFncyAqLwogCi12b2lkCi1xbWZDaGFuZ2VPdXRTY2FsZWZhY3RvciAoSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0U2NhbGVmYWN0b3IgICAgICAgICAgICAgICAgIC8qITwgTmV3IHNjYWxpbmcgZmFjdG9yIGZvciBvdXRwdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKTsKK3ZvaWQgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdChIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqcmVhbFNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmltYWdTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3Rvckxvd0JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9ySGlnaEJhbmQsIElOVF9QQ00gKnRpbWVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVPdXRfZSwgRklYUF9EQkwgKnBXb3JrQnVmZmVyKTsKIAotdm9pZAotcW1mQ2hhbmdlT3V0R2FpbiAoSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgKi8KLSAgICAgICAgICAgICAgICAgIEZJWFBfREJMIG91dHB1dEdhaW4gICAgICAgICAgICAgICAgLyohPCBOZXcgZ2FpbiBmb3Igb3V0cHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgKTsKK3ZvaWQgcW1mQ2hhbmdlT3V0U2NhbGVmYWN0b3IoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAqLworICAgIGludCBvdXRTY2FsZWZhY3RvciAgICAgICAgICAgICAvKiE8IE5ldyBzY2FsaW5nIGZhY3RvciBmb3Igb3V0cHV0IGRhdGEgKi8KKyk7CiAKK2ludCBxbWZHZXRPdXRTY2FsZWZhY3RvcigKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgKi8KKyk7CiAKK3ZvaWQgcW1mQ2hhbmdlT3V0R2FpbigKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICovCisgICAgRklYUF9EQkwgb3V0cHV0R2FpbiwgICAgICAgICAgIC8qITwgTmV3IGdhaW4gZm9yIG91dHB1dCBkYXRhIChtYW50aXNzYSkgKi8KKyAgICBpbnQgb3V0cHV0R2FpblNjYWxlICAgICAgICAgICAgLyohPCBOZXcgZ2FpbiBmb3Igb3V0cHV0IGRhdGEgKGV4cG9uZW50KSAqLworKTsKK3ZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdCgKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHFtZiwKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcmVhbFNsb3QsIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIGltYWdTbG90LCAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLworICAgIElOVF9QQ00gKlJFU1RSSUNUIHRpbWVPdXQsICAgLyohPCBUaW1lIGRvbWFpbiBkYXRhICovCisgICAgY29uc3QgaW50IHRpbWVPdXRfZSk7CiAKLSNlbmRpZiAvKiBfX1FNRl9IICovCisjZW5kaWYgLyppZm5kZWYgUU1GX0ggICAgICAgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL3FtZl9wY20uaCBiL2xpYkZESy9pbmNsdWRlL3FtZl9wY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRlMGNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUvcW1mX3BjbS5oCkBAIC0wLDAgKzEsNDA1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXJrdXMgTG9od2Fzc2VyLCBKb3NlZiBIb2VwZmwsIE1hbnVlbCBKYW5kZXIKKworICAgRGVzY3JpcHRpb246IFFNRiBmaWx0ZXJiYW5rCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUU1GX1BDTV9ICisjZGVmaW5lIFFNRl9QQ01fSAorCisvKgorICAgQWxsIFN5bnRoZXNpcyBmdW5jdGlvbnMgZGVwZW5kZW50IG9uIGRhdGF0eXBlIElOVF9QQ01fUU1GT1VUCisgICBTaG91bGQgb25seSBiZSBpbmNsdWRlZCBieSBxbWYuY3BwLCBidXQgbm90IGNvbXBpbGVkIHNlcGFyYXRlbHksIHBsZWFzZQorICAgZXhjbHVkZSBjb21waWxhdGlvbiBmcm9tIHByb2plY3QsIGlmIGRvbmUgb3RoZXJ3aXNlLiBJcyBvcHRpb25hbCBpbmNsdWRlZAorICAgdHdpY2UgdG8gZHVwbGljYXRlIGFsbCBmdW5jdGlvbnMgd2l0aCB0d28gZGlmZmVyZW50IHByZS1kZWZpbml0aW9ucywgYXM6CisgICAgICAgICNkZWZpbmUgSU5UX1BDTV9RTUZPVVQgTE9ORworICAgIGFuZCAuLi4KKyAgICAgICAgI2RlZmluZSBJTlRfUENNX1FNRk9VVCBTSE9SVAorICAgIG5lZWRlZCB0byBydW4gUU1GIHN5bnRoZXNpcyBpbiBib3RoIDE2Yml0IGFuZCAzMmJpdCBzYW1wbGUgb3V0cHV0IGZvcm1hdC4KKyovCisKKyNkZWZpbmUgUVNTQ0FMRSAoMCkKKyNkZWZpbmUgRlhfREJMMkZYX1FTUyh4KSAoeCkKKyNkZWZpbmUgRlhfUVNTMkZYX0RCTCh4KSAoeCkKKworLyohCisgIFxicmllZiBQZXJmb3JtIFN5bnRoZXNpcyBQcm90b3R5cGUgRmlsdGVyaW5nIG9uIGEgc2luZ2xlIHNsb3Qgb2YgaW5wdXQgZGF0YS4KKworICBUaGUgZmlsdGVyIHRha2VzIDIgKiBxbWYtPm5vX2NoYW5uZWxzIG9mIGlucHV0IGRhdGEgYW5kCisgIGdlbmVyYXRlcyBxbWYtPm5vX2NoYW5uZWxzIHRpbWUgZG9tYWluIG91dHB1dCBzYW1wbGVzLgorKi8KKy8qIHN0YXRpYyAqLworI2lmbmRlZiBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90Cit2b2lkIHFtZlN5blByb3RvdHlwZUZpclNsb3QoCisjZWxzZQordm9pZCBxbWZTeW5Qcm90b3R5cGVGaXJTbG90X2ZhbGxiYWNrKAorI2VuZGlmCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBxbWYsCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHJlYWxTbG90LCAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIGltYWdTbG90LCAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gaW1hZyBTbG90ICovCisgICAgSU5UX1BDTV9RTUZPVVQgKlJFU1RSSUNUIHRpbWVPdXQsIC8qITwgVGltZSBkb21haW4gZGF0YSAqLworICAgIGludCBzdHJpZGUpIHsKKyAgRklYUF9RU1MgKkZpbHRlclN0YXRlcyA9IChGSVhQX1FTUyAqKXFtZi0+RmlsdGVyU3RhdGVzOworICBpbnQgbm9fY2hhbm5lbHMgPSBxbWYtPm5vX2NoYW5uZWxzOworICBjb25zdCBGSVhQX1BGVCAqcF9GaWx0ZXIgPSBxbWYtPnBfZmlsdGVyOworICBpbnQgcF9zdHJpZGUgPSBxbWYtPnBfc3RyaWRlOworICBpbnQgajsKKyAgRklYUF9RU1MgKlJFU1RSSUNUIHN0YSA9IEZpbHRlclN0YXRlczsKKyAgY29uc3QgRklYUF9QRlQgKlJFU1RSSUNUIHBfZmx0LCAqUkVTVFJJQ1QgcF9mbHRtOworICBpbnQgc2NhbGUgPSAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUU19RTUZPVVQpIC0gMSAtIHFtZi0+b3V0U2NhbGVmYWN0b3IgLQorICAgICAgICAgICAgICBxbWYtPm91dEdhaW5fZTsKKworICBwX2ZsdCA9CisgICAgICBwX0ZpbHRlciArIHBfc3RyaWRlICogUU1GX05PX1BPTFk7IC8qICAgICAgICAgICAgICAgICAgICAgNXRoIG9mIDMzMCAqLworICBwX2ZsdG0gPSBwX0ZpbHRlciArIChxbWYtPkZpbHRlclNpemUgLyAyKSAtCisgICAgICAgICAgIHBfc3RyaWRlICogUU1GX05PX1BPTFk7IC8qIDUgKyAoMzIwIC0gMio1KSA9IDMxNXRoIG9mIDMzMCAqLworCisgIEZJWFBfU0dMIGdhaW4gPSBGWF9EQkwyRlhfU0dMKHFtZi0+b3V0R2Fpbl9tKTsKKworICBGSVhQX0RCTCBybmRfdmFsID0gMDsKKworICBpZiAoc2NhbGUgPiAwKSB7CisgICAgaWYgKHNjYWxlIDwgKERGUkFDVF9CSVRTIC0gMSkpCisgICAgICBybmRfdmFsID0gRklYUF9EQkwoMSA8PCAoc2NhbGUgLSAxKSk7CisgICAgZWxzZQorICAgICAgc2NhbGUgPSAoREZSQUNUX0JJVFMgLSAxKTsKKyAgfSBlbHNlIHsKKyAgICBzY2FsZSA9IGZNYXgoc2NhbGUsIC0oREZSQUNUX0JJVFMgLSAxKSk7CisgIH0KKworICBmb3IgKGogPSBub19jaGFubmVscyAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgRklYUF9EQkwgaW1hZyA9IGltYWdTbG90W2pdOyAvKiBub19jaGFubmVscy0xIC4uIDAgKi8KKyAgICBGSVhQX0RCTCByZWFsID0gcmVhbFNsb3Rbal07IC8qIG5vX2NoYW5uZWxzLTEgLi4gMCAqLworICAgIHsKKyAgICAgIElOVF9QQ01fUU1GT1VUIHRtcDsKKyAgICAgIEZJWFBfREJMIEFyZSA9IGZNdWx0QWRkRGl2MihGWF9RU1MyRlhfREJMKHN0YVswXSksIHBfZmx0bVswXSwgcmVhbCk7CisKKyAgICAgIC8qIFRoaXMgUENNIGZvcm1hdHRpbmcgcGVyZm9ybXM6CisgICAgICAgICAtIG11bHRpcGxpY2F0aW9uIHdpdGggMTYtYml0IGdhaW4sIGlmIG5vdCAtMS4wZgorICAgICAgICAgLSByb3VuZGluZywgaWYgc2hpZnQgcmlnaHQgaXMgYXBwbGllZAorICAgICAgICAgLSBhcHBseSBzaGlmdCBsZWZ0IChvciByaWdodCkgd2l0aCBzYXR1cmF0aW9uIHRvIDMyIChvciAxNikgYml0cworICAgICAgICAgLSBzdG9yZSBvdXRwdXQgd2l0aCAtLXN0cmlkZSBpbiAzMiAob3IgMTYpIGJpdCBmb3JtYXQKKyAgICAgICovCisgICAgICBpZiAoZ2FpbiAhPSAoRklYUF9TR0wpKC0zMjc2OCkpIC8qIC0xLjBmICovCisgICAgICB7CisgICAgICAgIEFyZSA9IGZNdWx0KEFyZSwgZ2Fpbik7CisgICAgICB9CisgICAgICBpZiAoc2NhbGUgPj0gMCkgeworICAgICAgICBGREtfQVNTRVJUKAorICAgICAgICAgICAgQXJlIDw9CisgICAgICAgICAgICAoQXJlICsgcm5kX3ZhbCkpOyAvKiBSb3VuZC1hZGRpdGlvbiBtdXN0IG5vdCBvdmVyZmxvdywgbWlnaHQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsIGZvciBybmRfdmFsPTAgKi8KKyAgICAgICAgdG1wID0gKElOVF9QQ01fUU1GT1VUKSgKKyAgICAgICAgICAgIFNBVFVSQVRFX1JJR0hUX1NISUZUKEFyZSArIHJuZF92YWwsIHNjYWxlLCBTQU1QTEVfQklUU19RTUZPVVQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IChJTlRfUENNX1FNRk9VVCkoCisgICAgICAgICAgICBTQVRVUkFURV9MRUZUX1NISUZUKEFyZSwgLXNjYWxlLCBTQU1QTEVfQklUU19RTUZPVVQpKTsKKyAgICAgIH0KKworICAgICAgeyB0aW1lT3V0WyhqKSpzdHJpZGVdID0gdG1wOyB9CisgICAgfQorCisgICAgc3RhWzBdID0gRlhfREJMMkZYX1FTUyhmTXVsdEFkZERpdjIoRlhfUVNTMkZYX0RCTChzdGFbMV0pLCBwX2ZsdFs0XSwgaW1hZykpOworICAgIHN0YVsxXSA9CisgICAgICAgIEZYX0RCTDJGWF9RU1MoZk11bHRBZGREaXYyKEZYX1FTUzJGWF9EQkwoc3RhWzJdKSwgcF9mbHRtWzFdLCByZWFsKSk7CisgICAgc3RhWzJdID0gRlhfREJMMkZYX1FTUyhmTXVsdEFkZERpdjIoRlhfUVNTMkZYX0RCTChzdGFbM10pLCBwX2ZsdFszXSwgaW1hZykpOworICAgIHN0YVszXSA9CisgICAgICAgIEZYX0RCTDJGWF9RU1MoZk11bHRBZGREaXYyKEZYX1FTUzJGWF9EQkwoc3RhWzRdKSwgcF9mbHRtWzJdLCByZWFsKSk7CisgICAgc3RhWzRdID0gRlhfREJMMkZYX1FTUyhmTXVsdEFkZERpdjIoRlhfUVNTMkZYX0RCTChzdGFbNV0pLCBwX2ZsdFsyXSwgaW1hZykpOworICAgIHN0YVs1XSA9CisgICAgICAgIEZYX0RCTDJGWF9RU1MoZk11bHRBZGREaXYyKEZYX1FTUzJGWF9EQkwoc3RhWzZdKSwgcF9mbHRtWzNdLCByZWFsKSk7CisgICAgc3RhWzZdID0gRlhfREJMMkZYX1FTUyhmTXVsdEFkZERpdjIoRlhfUVNTMkZYX0RCTChzdGFbN10pLCBwX2ZsdFsxXSwgaW1hZykpOworICAgIHN0YVs3XSA9CisgICAgICAgIEZYX0RCTDJGWF9RU1MoZk11bHRBZGREaXYyKEZYX1FTUzJGWF9EQkwoc3RhWzhdKSwgcF9mbHRtWzRdLCByZWFsKSk7CisgICAgc3RhWzhdID0gRlhfREJMMkZYX1FTUyhmTXVsdERpdjIocF9mbHRbMF0sIGltYWcpKTsKKyAgICBwX2ZsdCArPSAocF9zdHJpZGUgKiBRTUZfTk9fUE9MWSk7CisgICAgcF9mbHRtIC09IChwX3N0cmlkZSAqIFFNRl9OT19QT0xZKTsKKyAgICBzdGEgKz0gOTsgIC8vID0gKDIqUU1GX05PX1BPTFktMSk7CisgIH0KK30KKworI2lmbmRlZiBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYworLyohCisgIFxicmllZiBQZXJmb3JtIFN5bnRoZXNpcyBQcm90b3R5cGUgRmlsdGVyaW5nIG9uIGEgc2luZ2xlIHNsb3Qgb2YgaW5wdXQgZGF0YS4KKworICBUaGUgZmlsdGVyIHRha2VzIDIgKiBxbWYtPm5vX2NoYW5uZWxzIG9mIGlucHV0IGRhdGEgYW5kCisgIGdlbmVyYXRlcyBxbWYtPm5vX2NoYW5uZWxzIHRpbWUgZG9tYWluIG91dHB1dCBzYW1wbGVzLgorKi8KK3N0YXRpYyB2b2lkIHFtZlN5blByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgcW1mLAorICAgIEZJWFBfREJMICpSRVNUUklDVCByZWFsU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIHJlYWwgU2xvdCAqLworICAgIEZJWFBfREJMICpSRVNUUklDVCBpbWFnU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLworICAgIElOVF9QQ01fUU1GT1VUICpSRVNUUklDVCB0aW1lT3V0LCAvKiE8IFRpbWUgZG9tYWluIGRhdGEgKi8KKyAgICBpbnQgc3RyaWRlKSB7CisgIEZJWFBfUVNTICpGaWx0ZXJTdGF0ZXMgPSAoRklYUF9RU1MgKilxbWYtPkZpbHRlclN0YXRlczsKKyAgaW50IG5vX2NoYW5uZWxzID0gcW1mLT5ub19jaGFubmVsczsKKyAgY29uc3QgRklYUF9QRlQgKnBfRmlsdGVyID0gcW1mLT5wX2ZpbHRlcjsKKyAgaW50IHBfc3RyaWRlID0gcW1mLT5wX3N0cmlkZTsKKyAgaW50IGo7CisgIEZJWFBfUVNTICpSRVNUUklDVCBzdGEgPSBGaWx0ZXJTdGF0ZXM7CisgIGNvbnN0IEZJWFBfUEZUICpSRVNUUklDVCBwX2ZsdCwgKlJFU1RSSUNUIHBfZmx0bTsKKyAgaW50IHNjYWxlID0gKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFNfUU1GT1VUKSAtIDEgLSBxbWYtPm91dFNjYWxlZmFjdG9yIC0KKyAgICAgICAgICAgICAgcW1mLT5vdXRHYWluX2U7CisKKyAgcF9mbHQgPSBwX0ZpbHRlcjsgLyohPCBQb2ludGVyIHRvIGZpcnN0IGhhbGYgb2YgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICBwX2ZsdG0gPQorICAgICAgJnBfZmx0W3FtZi0+RmlsdGVyU2l6ZSAvIDJdOyAvKiBhdCBpbmRleCAzMjAsIG92ZXJhbGwgNjQwIGNvZWZmaWNpZW50cyAqLworCisgIEZJWFBfU0dMIGdhaW4gPSBGWF9EQkwyRlhfU0dMKHFtZi0+b3V0R2Fpbl9tKTsKKworICBGSVhQX0RCTCBybmRfdmFsID0gKEZJWFBfREJMKTA7CisKKyAgaWYgKHNjYWxlID4gMCkgeworICAgIGlmIChzY2FsZSA8IChERlJBQ1RfQklUUyAtIDEpKQorICAgICAgcm5kX3ZhbCA9IEZJWFBfREJMKDEgPDwgKHNjYWxlIC0gMSkpOworICAgIGVsc2UKKyAgICAgIHNjYWxlID0gKERGUkFDVF9CSVRTIC0gMSk7CisgIH0gZWxzZSB7CisgICAgc2NhbGUgPSBmTWF4KHNjYWxlLCAtKERGUkFDVF9CSVRTIC0gMSkpOworICB9CisKKyAgZm9yIChqID0gbm9fY2hhbm5lbHMgLSAxOyBqID49IDA7IGotLSkgeworICAgIEZJWFBfREJMIGltYWcgPSBpbWFnU2xvdFtqXTsgLyogbm9fY2hhbm5lbHMtMSAuLiAwICovCisgICAgRklYUF9EQkwgcmVhbCA9IHJlYWxTbG90W2pdOyAvKiBub19jaGFubmVscy0xIC4uIDAgKi8KKyAgICB7CisgICAgICBJTlRfUENNX1FNRk9VVCB0bXA7CisgICAgICBGSVhQX0RCTCBBcmUgPSBzdGFbMF0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MihwX2ZsdG1bNF0sIHJlYWwpKTsKKworICAgICAgLyogVGhpcyBQQ00gZm9ybWF0dGluZyBwZXJmb3JtczoKKyAgICAgICAgIC0gbXVsdGlwbGljYXRpb24gd2l0aCAxNi1iaXQgZ2FpbiwgaWYgbm90IC0xLjBmCisgICAgICAgICAtIHJvdW5kaW5nLCBpZiBzaGlmdCByaWdodCBpcyBhcHBsaWVkCisgICAgICAgICAtIGFwcGx5IHNoaWZ0IGxlZnQgKG9yIHJpZ2h0KSB3aXRoIHNhdHVyYXRpb24gdG8gMzIgKG9yIDE2KSBiaXRzCisgICAgICAgICAtIHN0b3JlIG91dHB1dCB3aXRoIC0tc3RyaWRlIGluIDMyIChvciAxNikgYml0IGZvcm1hdAorICAgICAgKi8KKyAgICAgIGlmIChnYWluICE9IChGSVhQX1NHTCkoLTMyNzY4KSkgLyogLTEuMGYgKi8KKyAgICAgIHsKKyAgICAgICAgQXJlID0gZk11bHQoQXJlLCBnYWluKTsKKyAgICAgIH0KKyAgICAgIGlmIChzY2FsZSA+IDApIHsKKyAgICAgICAgRkRLX0FTU0VSVChBcmUgPAorICAgICAgICAgICAgICAgICAgIChBcmUgKyBybmRfdmFsKSk7IC8qIFJvdW5kLWFkZGl0aW9uIG11c3Qgbm90IG92ZXJmbG93ICovCisgICAgICAgIHRtcCA9IChJTlRfUENNX1FNRk9VVCkoCisgICAgICAgICAgICBTQVRVUkFURV9SSUdIVF9TSElGVChBcmUgKyBybmRfdmFsLCBzY2FsZSwgU0FNUExFX0JJVFNfUU1GT1VUKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0bXAgPSAoSU5UX1BDTV9RTUZPVVQpKAorICAgICAgICAgICAgU0FUVVJBVEVfTEVGVF9TSElGVChBcmUsIC1zY2FsZSwgU0FNUExFX0JJVFNfUU1GT1VUKSk7CisgICAgICB9CisgICAgICB0aW1lT3V0W2ogKiBzdHJpZGVdID0gdG1wOworICAgIH0KKworICAgIHN0YVswXSA9IHN0YVsxXSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKHBfZmx0WzRdLCBpbWFnKSk7CisgICAgc3RhWzFdID0gc3RhWzJdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIocF9mbHRtWzNdLCByZWFsKSk7CisgICAgc3RhWzJdID0gc3RhWzNdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIocF9mbHRbM10sIGltYWcpKTsKKworICAgIHN0YVszXSA9IHN0YVs0XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKHBfZmx0bVsyXSwgcmVhbCkpOworICAgIHN0YVs0XSA9IHN0YVs1XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKHBfZmx0WzJdLCBpbWFnKSk7CisgICAgc3RhWzVdID0gc3RhWzZdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIocF9mbHRtWzFdLCByZWFsKSk7CisgICAgc3RhWzZdID0gc3RhWzddICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIocF9mbHRbMV0sIGltYWcpKTsKKworICAgIHN0YVs3XSA9IHN0YVs4XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKHBfZmx0bVswXSwgcmVhbCkpOworICAgIHN0YVs4XSA9IEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKHBfZmx0WzBdLCBpbWFnKSk7CisKKyAgICBwX2ZsdCArPSAocF9zdHJpZGUgKiBRTUZfTk9fUE9MWSk7CisgICAgcF9mbHRtICs9IChwX3N0cmlkZSAqIFFNRl9OT19QT0xZKTsKKyAgICBzdGEgKz0gOTsgIC8vID0gKDIqUU1GX05PX1BPTFktMSk7CisgIH0KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYyAqLworCit2b2lkIHFtZlN5bnRoZXNpc0ZpbHRlcmluZ1Nsb3QoSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnJlYWxTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICppbWFnU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JMb3dCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckhpZ2hCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ01fUU1GT1VUICp0aW1lT3V0LCBjb25zdCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwV29ya0J1ZmZlcikgeworICBpZiAoIShzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfTFApKQorICAgIHFtZkludmVyc2VNb2R1bGF0aW9uSFEoc3luUW1mLCByZWFsU2xvdCwgaW1hZ1Nsb3QsIHNjYWxlRmFjdG9yTG93QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsIHBXb3JrQnVmZmVyKTsKKyAgZWxzZSB7CisgICAgaWYgKHN5blFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19DTERGQikgeworICAgICAgcW1mSW52ZXJzZU1vZHVsYXRpb25MUF9vZGQoc3luUW1mLCByZWFsU2xvdCwgc2NhbGVGYWN0b3JMb3dCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwgcFdvcmtCdWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICBxbWZJbnZlcnNlTW9kdWxhdGlvbkxQX2V2ZW4oc3luUW1mLCByZWFsU2xvdCwgc2NhbGVGYWN0b3JMb3dCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsIHBXb3JrQnVmZmVyKTsKKyAgICB9CisgIH0KKworICBpZiAoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX05PTlNZTU1FVFJJQykgeworICAgIHFtZlN5blByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljKHN5blFtZiwgcFdvcmtCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIgKyBzeW5RbWYtPm5vX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXQsIHN0cmlkZSk7CisgIH0gZWxzZSB7CisgICAgcW1mU3luUHJvdG90eXBlRmlyU2xvdChzeW5RbWYsIHBXb3JrQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIgKyBzeW5RbWYtPm5vX2NoYW5uZWxzLCB0aW1lT3V0LCBzdHJpZGUpOworICB9Cit9CisKKy8qIQorICoKKyAqIFxicmllZiBQZXJmb3JtIGNvbXBsZXgtdmFsdWVkIHN1YmJhbmQgc3ludGhlc2lzIG9mIHRoZQorICogICAgICAgIGxvdyBiYW5kIGFuZCB0aGUgaGlnaCBiYW5kIGFuZCBzdG9yZSB0aGUKKyAqICAgICAgICB0aW1lIGRvbWFpbiBkYXRhIGluIHRpbWVPdXQKKyAqCisgKiBGaXJzdCBzdGVwOiBDYWxjdWxhdGUgdGhlIHByb3BlciBzY2FsaW5nIGZhY3RvciBvZiBjdXJyZW50CisgKiBzcGVjdHJhbCBkYXRhIGluIHFtZlJlYWwvcW1mSW1hZywgb2xkIHNwZWN0cmFsIGRhdGEgaW4gdGhlIG92ZXJsYXAKKyAqIHJhbmdlIGFuZCBmaWx0ZXIgc3RhdGVzLgorICoKKyAqIFNlY29uZCBzdGVwOiBQZXJmb3JtIEZyZXF1ZW5jeS10by1UaW1lIG1hcHBpbmcgd2l0aCBpbnZlcnNlCisgKiBNb2R1bGF0aW9uIHNsb3Qtd2lzZS4KKyAqCisgKiBUaGlyZCBzdGVwOiBQZXJmb3JtIEZJUi1maWx0ZXIgc2xvdC13aXNlLiBUbyBzYXZlIHNwYWNlIGZvciBmaWx0ZXIKKyAqIHN0YXRlcywgdGhlIE1BQyBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBkaXJlY3RseSBvbiB0aGUgZmlsdGVyIHN0YXRlcworICogaW5zdGVhZCBvZiBhY2N1bXVsYXRpbmcgc2V2ZXJhbCBwcm9kdWN0cyBpbiB0aGUgYWNjdW11bGF0b3IuIFRoZQorICogYnVmZmVyIHNoaWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSByZXBsYWNlZCBieSBhCisgKiBtb2R1bG8gb3BlcmF0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgb24gc29tZSBEU1BzLgorICoKKyAqIExhc3Qgc3RlcDogQ29weSB0aGUgdXBwZXIgcGFydCBvZiB0aGUgc3BlY3RyYWwgZGF0YSB0byB0aGUgb3ZlcmxhcCBidWZmZXIuCisgKgorICogVGhlIHFtZiBjb2VmZmljaWVudCB0YWJsZSBpcyBzeW1tZXRyaWMuIFRoZSBzeW1tZXRyeSBpcyBleHBsb2l0ZWQgYnkKKyAqIHNocmlua2luZyB0aGUgY29lZmZpY2llbnQgdGFibGUgdG8gaGFsZiB0aGUgc2l6ZS4gVGhlIGFkZHJlc3NpbmcgbW9kZQorICogdGFrZXMgY2FyZSBvZiB0aGUgc3ltbWV0cmllcy4gIElmIHRoZSAjZGVmaW5lICNRTUZUQUJMRV9GVUxMIGlzIHNldCwKKyAqIGNvZWZmaWNpZW50IGFkZHJlc3Npbmcgd29ya3Mgb24gdGhlIGZ1bGwgdGFibGUgc2l6ZS4gVGhlIGNvZGUgd2lsbCBiZQorICogc2xpZ2h0bHkgZmFzdGVyIGFuZCBzbGlnaHRseSBtb3JlIGNvbXBhY3QuCisgKgorICogV29ya2J1ZmZlciByZXF1aXJlbWVudDogMiB4IHNpemVvZigqKlFtZkJ1ZmZlclJlYWwpICogc3luUW1mLT5ub19jaGFubmVscworICogVGhlIHdvcmtidWZmZXIgbXVzdCBiZSBhbGlnbmVkCisgKi8KK3ZvaWQgcW1mU3ludGhlc2lzRmlsdGVyaW5nKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCisgICAgRklYUF9EQkwgKipRbWZCdWZmZXJSZWFsLCAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIHJlYWwgKi8KKyAgICBGSVhQX0RCTCAqKlFtZkJ1ZmZlckltYWcsICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgaW1hZyAqLworICAgIGNvbnN0IFFNRl9TQ0FMRV9GQUNUT1IgKnNjYWxlRmFjdG9yLAorICAgIGNvbnN0IElOVCBvdl9sZW4sICAgICAgICAvKiE8IHNwbGl0IFNsb3Qgb2Ygb3ZlcmxhcCBhbmQgYWN0dWFsIHNsb3RzICovCisgICAgSU5UX1BDTV9RTUZPVVQgKnRpbWVPdXQsIC8qITwgUG9pbnRlciB0byBvdXRwdXQgKi8KKyAgICBjb25zdCBJTlQgc3RyaWRlLCAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIG91dHB1dCAqLworICAgIEZJWFBfREJMICpwV29ya0J1ZmZlciAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KKykgeworICBpbnQgaTsKKyAgaW50IEwgPSBzeW5RbWYtPm5vX2NoYW5uZWxzOworICBpbnQgc2NhbGVGYWN0b3JIaWdoQmFuZDsKKyAgaW50IHNjYWxlRmFjdG9yTG93QmFuZF9vdiwgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292OworCisgIEZES19BU1NFUlQoc3luUW1mLT5ub19jaGFubmVscyA+PSBzeW5RbWYtPmxzYik7CisgIEZES19BU1NFUlQoc3luUW1mLT5ub19jaGFubmVscyA+PSBzeW5RbWYtPnVzYik7CisKKyAgLyogYWRhcHQgc2NhbGluZyAqLworICBzY2FsZUZhY3RvckhpZ2hCYW5kID0gLUFMR09SSVRITUlDX1NDQUxJTkdfSU5fQU5BTFlTSVNfRklMVEVSQkFOSyAtCisgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3Rvci0+aGJfc2NhbGUgLSBzeW5RbWYtPmZpbHRlclNjYWxlOworICBzY2FsZUZhY3Rvckxvd0JhbmRfb3YgPSAtQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3ItPm92X2xiX3NjYWxlIC0gc3luUW1mLT5maWx0ZXJTY2FsZTsKKyAgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292ID0gLUFMR09SSVRITUlDX1NDQUxJTkdfSU5fQU5BTFlTSVNfRklMVEVSQkFOSyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yLT5sYl9zY2FsZSAtIHN5blFtZi0+ZmlsdGVyU2NhbGU7CisKKyAgZm9yIChpID0gMDsgaSA8IHN5blFtZi0+bm9fY29sOyBpKyspIC8qIC0tLS0tIG5vX2NvbCBsb29wIC0tLS0tICovCisgIHsKKyAgICBjb25zdCBGSVhQX0RCTCAqUW1mQnVmZmVySW1hZ1Nsb3QgPSBOVUxMOworCisgICAgaW50IHNjYWxlRmFjdG9yTG93QmFuZCA9CisgICAgICAgIChpIDwgb3ZfbGVuKSA/IHNjYWxlRmFjdG9yTG93QmFuZF9vdiA6IHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdjsKKworICAgIGlmICghKHN5blFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19MUCkpIFFtZkJ1ZmZlckltYWdTbG90ID0gUW1mQnVmZmVySW1hZ1tpXTsKKworICAgIHFtZlN5bnRoZXNpc0ZpbHRlcmluZ1Nsb3Qoc3luUW1mLCBRbWZCdWZmZXJSZWFsW2ldLCBRbWZCdWZmZXJJbWFnU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCwgc2NhbGVGYWN0b3JIaWdoQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXQgKyAoaSAqIEwgKiBzdHJpZGUpLCBzdHJpZGUsIHBXb3JrQnVmZmVyKTsKKyAgfSAvKiBub19jb2wgbG9vcCAgaSAgKi8KK30KKyNlbmRpZiAvKiBRTUZfUENNX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL3NjYWxlLmggYi9saWJGREsvaW5jbHVkZS9zY2FsZS5oCmluZGV4IDE1ODdmOWYuLjA3YmQzYWYgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL3NjYWxlLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvc2NhbGUuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IFNjYWxpbmcgb3BlcmF0aW9ucwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFNDQUxFX0gKICNkZWZpbmUgU0NBTEVfSApAQCAtOTUsMTkgKzEwNyw0MSBAQAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAjaW5jbHVkZSAiZml4bWlubWF4LmgiCiAKLSAgI2RlZmluZSBTQ0FMRV9JTkxJTkUgaW5saW5lCisjZGVmaW5lIFNDQUxFX0lOTElORQogCisjaWYgZGVmaW5lZChfX2FybV9fKQorI2luY2x1ZGUgImFybS9zY2FsZV9hcm0uaCIKIAotI2lmIGRlZmluZWQoX19hcm1fXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotI2luY2x1ZGUgImFybS9zY2FsZS5oIgotCi0jZWxpZiBkZWZpbmVkKF9fbWlwc19fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCi0jaW5jbHVkZSAibWlwcy9zY2FsZS5oIgorI2VsaWYgZGVmaW5lZChfX21pcHNfXykKKyNpbmNsdWRlICJtaXBzL3NjYWxlX21pcHMuaCIKIAogI2VuZGlmCiAKLQotI2luY2x1ZGUgIi4uL3NyYy9zY2FsZS5jcHAiCit2b2lkIHNjYWxlVmFsdWVzKEZJWFBfU0dMICp2ZWN0b3IsIElOVCBsZW4sIElOVCBzY2FsZWZhY3Rvcik7Cit2b2lkIHNjYWxlVmFsdWVzKEZJWFBfREJMICp2ZWN0b3IsIElOVCBsZW4sIElOVCBzY2FsZWZhY3Rvcik7Cit2b2lkIHNjYWxlVmFsdWVzKEZJWFBfREJMICpkc3QsIGNvbnN0IEZJWFBfREJMICpzcmMsIElOVCBsZW4sIElOVCBzY2FsZWZhY3Rvcik7CisjaWYgKFNBTVBMRV9CSVRTID09IDE2KQordm9pZCBzY2FsZVZhbHVlcyhGSVhQX1BDTSAqZHN0LCBjb25zdCBGSVhQX0RCTCAqc3JjLCBJTlQgbGVuLCBJTlQgc2NhbGVmYWN0b3IpOworI2VuZGlmCit2b2lkIHNjYWxlVmFsdWVzKEZJWFBfUENNICpkc3QsIGNvbnN0IEZJWFBfU0dMICpzcmMsIElOVCBsZW4sIElOVCBzY2FsZWZhY3Rvcik7Cit2b2lkIHNjYWxlQ3BseFZhbHVlcyhGSVhQX0RCTCAqcl9kc3QsIEZJWFBfREJMICppX2RzdCwgY29uc3QgRklYUF9EQkwgKnJfc3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmlfc3JjLCBJTlQgbGVuLCBJTlQgc2NhbGVmYWN0b3IpOwordm9pZCBzY2FsZVZhbHVlc1dpdGhGYWN0b3IoRklYUF9EQkwgKnZlY3RvciwgRklYUF9EQkwgZmFjdG9yLCBJTlQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yKTsKK3ZvaWQgc2NhbGVWYWx1ZXNTYXR1cmF0ZShGSVhQX0RCTCAqdmVjdG9yLCBJTlQgbGVuLCBJTlQgc2NhbGVmYWN0b3IpOwordm9pZCBzY2FsZVZhbHVlc1NhdHVyYXRlKEZJWFBfREJMICpkc3QsIEZJWFBfREJMICpzcmMsIElOVCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yKTsKK3ZvaWQgc2NhbGVWYWx1ZXNTYXR1cmF0ZShGSVhQX1NHTCAqZHN0LCBGSVhQX0RCTCAqc3JjLCBJTlQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3Rvcik7Cit2b2lkIHNjYWxlVmFsdWVzU2F0dXJhdGUoSU5UX1BDTSAqZHN0LCBGSVhQX0RCTCAqc3JjLCBJTlQgbGVuLCBJTlQgc2NhbGVmYWN0b3IpOwordm9pZCBzY2FsZVZhbHVlc1NhdHVyYXRlKEZJWFBfU0dMICp2ZWN0b3IsIElOVCBsZW4sIElOVCBzY2FsZWZhY3Rvcik7Cit2b2lkIHNjYWxlVmFsdWVzU2F0dXJhdGUoRklYUF9TR0wgKmRzdCwgRklYUF9TR0wgKnNyYywgSU5UIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IpOwordm9pZCBzY2FsZVZhbHVlc1NhdHVyYXRlKElOVF9QQ00gKmRzdCwgSU5UX1BDTSAqc3JjLCBJTlQgbGVuLCBJTlQgc2NhbGVmYWN0b3IpOworSU5UIGdldFNjYWxlZmFjdG9yU2hvcnQoY29uc3QgU0hPUlQgKnZlY3RvciwgSU5UIGxlbik7CitJTlQgZ2V0U2NhbGVmYWN0b3JQQ00oY29uc3QgSU5UX1BDTSAqdmVjdG9yLCBJTlQgbGVuLCBJTlQgc3RyaWRlKTsKK0lOVCBnZXRTY2FsZWZhY3Rvcihjb25zdCBGSVhQX0RCTCAqdmVjdG9yLCBJTlQgbGVuKTsKK0lOVCBnZXRTY2FsZWZhY3Rvcihjb25zdCBGSVhQX1NHTCAqdmVjdG9yLCBJTlQgbGVuKTsKIAogI2lmbmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlCiAvKiEKQEAgLTExOCwxNSArMTUyLDIxIEBACiAgKgogICovCiAjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWUKLWlubGluZQotRklYUF9EQkwgc2NhbGVWYWx1ZShjb25zdCBGSVhQX0RCTCB2YWx1ZSwgLyohPCBWYWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAvKiE8IFNjYWxlZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgKQotewotICBpZihzY2FsZWZhY3RvciA+IDApCi0gICAgcmV0dXJuICh2YWx1ZTw8c2NhbGVmYWN0b3IpOworaW5saW5lIEZJWFBfREJMIHNjYWxlVmFsdWUoY29uc3QgRklYUF9EQkwgdmFsdWUsIC8qITwgVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgICAgICAvKiE8IFNjYWxlZmFjdG9yICovCispIHsKKyAgaWYgKHNjYWxlZmFjdG9yID4gMCkKKyAgICByZXR1cm4gKHZhbHVlIDw8IHNjYWxlZmFjdG9yKTsKICAgZWxzZQotICAgIHJldHVybiAodmFsdWU+Pigtc2NhbGVmYWN0b3IpKTsKKyAgICByZXR1cm4gKHZhbHVlID4+ICgtc2NhbGVmYWN0b3IpKTsKK30KK2lubGluZSBGSVhQX1NHTCBzY2FsZVZhbHVlKGNvbnN0IEZJWFBfU0dMIHZhbHVlLCAvKiE8IFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAgICAgLyohPCBTY2FsZWZhY3RvciAqLworKSB7CisgIGlmIChzY2FsZWZhY3RvciA+IDApCisgICAgcmV0dXJuICh2YWx1ZSA8PCBzY2FsZWZhY3Rvcik7CisgIGVsc2UKKyAgICByZXR1cm4gKHZhbHVlID4+ICgtc2NhbGVmYWN0b3IpKTsKIH0KICNlbmRpZgogCkBAIC0xNDAsMjcgKzE4MCwyOCBAQAogICoKICAqLwogI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlU2F0dXJhdGUKLWlubGluZQotRklYUF9EQkwgc2NhbGVWYWx1ZVNhdHVyYXRlKAotICAgICAgICBjb25zdCBGSVhQX0RCTCB2YWx1ZSwKLSAgICAgICAgSU5UIHNjYWxlZmFjdG9yCi0gICAgICAgICkKLXsKLSAgaWYoc2NhbGVmYWN0b3IgPiAwKSB7Ci0gICAgaWYgKGZOb3JtKHZhbHVlKSA8IHNjYWxlZmFjdG9yICYmIHZhbHVlICE9IChGSVhQX0RCTCkwKSB7Ci0gICAgICBpZiAodmFsdWUgPiAoRklYUF9EQkwpMCkgewotICAgICAgICByZXR1cm4gKEZJWFBfREJMKU1BWFZBTF9EQkw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKEZJWFBfREJMKU1JTlZBTF9EQkw7Ci0gICAgICB9CitpbmxpbmUgRklYUF9EQkwgc2NhbGVWYWx1ZVNhdHVyYXRlKGNvbnN0IEZJWFBfREJMIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgLyogaW4gcmFuZ2UgLTMxIC4uLiArMzEgKi8KKykgeworICBpbnQgaGVhZHJvb20gPSBmaXhub3Jtel9EKAorICAgICAgKElOVCl2YWx1ZSBeIChJTlQpKCh2YWx1ZSA+PiAzMSkpKTsgLyogaGVhZHJvb20gaW4gcmFuZ2UgMS4uLjMyICovCisgIGlmIChzY2FsZWZhY3RvciA+PSAwKSB7CisgICAgLyogc2hpZnQgbGVmdDogc2F0dXJhdGUgaW4gY2FzZSBvZiBoZWFkcm9vbSBsZXNzL2VxdWFsIHNjYWxlZmFjdG9yICovCisgICAgaWYgKGhlYWRyb29tIDw9IHNjYWxlZmFjdG9yKSB7CisgICAgICBpZiAodmFsdWUgPiAoRklYUF9EQkwpMCkKKyAgICAgICAgcmV0dXJuIChGSVhQX0RCTClNQVhWQUxfREJMOyAvKiAweDdGRkYuRkZGRiAqLworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKEZJWFBfREJMKU1JTlZBTF9EQkwgKyAoRklYUF9EQkwpMTsgLyogMHg4MDAwLjAwMDEgKi8KICAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICh2YWx1ZTw8c2NhbGVmYWN0b3IpOworICAgICAgcmV0dXJuIGZNYXgoKHZhbHVlIDw8IHNjYWxlZmFjdG9yKSwgKEZJWFBfREJMKU1JTlZBTF9EQkwgKyAoRklYUF9EQkwpMSk7CiAgICAgfQogICB9IGVsc2UgewotICAgIGlmICgtKERGUkFDVF9CSVRTLTEpID4gc2NhbGVmYWN0b3IpIHsKKyAgICBzY2FsZWZhY3RvciA9IC1zY2FsZWZhY3RvcjsKKyAgICAvKiBzaGlmdCByaWdodDogY2xlYXIgaW4gY2FzZSBvZiAzMi1oZWFkcm9vbSBncmVhdGVyL2VxdWFsIC1zY2FsZWZhY3RvciAqLworICAgIGlmICgoREZSQUNUX0JJVFMgLSBoZWFkcm9vbSkgPD0gc2NhbGVmYWN0b3IpIHsKICAgICAgIHJldHVybiAoRklYUF9EQkwpMDsKICAgICB9IGVsc2UgewotICAgIHJldHVybiAodmFsdWU+Pigtc2NhbGVmYWN0b3IpKTsKKyAgICAgIHJldHVybiBmTWF4KCh2YWx1ZSA+PiBzY2FsZWZhY3RvciksIChGSVhQX0RCTClNSU5WQUxfREJMICsgKEZJWFBfREJMKTEpOwogICAgIH0KICAgfQogfQpAQCAtMTc1LDE0ICsyMTYsMTIgQEAKICAqCiAgKi8KICNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZUluUGxhY2UKLWlubGluZQotdm9pZCBzY2FsZVZhbHVlSW5QbGFjZSgKLSAgICAgICAgRklYUF9EQkwgKnZhbHVlLCAvKiE8IFZhbHVlICovCi0gICAgICAgIElOVCBzY2FsZWZhY3RvciAgIC8qITwgU2NhbGVmYWN0b3IgKi8KLSAgICAgICAgKQoteworaW5saW5lIHZvaWQgc2NhbGVWYWx1ZUluUGxhY2UoRklYUF9EQkwgKnZhbHVlLCAvKiE8IFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgIC8qITwgU2NhbGVmYWN0b3IgKi8KKykgewogICBJTlQgbmV3c2NhbGU7Ci0gIC8qIE5vdGU6IFRoZSBhc3NpZ25tZW50IGluc2lkZSB0aGUgaWYgY29uZGl0aW9uYWwgYWxsb3dzIGNvbWJpbmluZyBhIGxvYWQgd2l0aCB0aGUgY29tcGFyZSB0byB6ZXJvIChvbiBBUk0gYW5kIG1heWJlIG90aGVycykgKi8KKyAgLyogTm90ZTogVGhlIGFzc2lnbm1lbnQgaW5zaWRlIHRoZSBpZiBjb25kaXRpb25hbCBhbGxvd3MgY29tYmluaW5nIGEgbG9hZCB3aXRoCisgICAqIHRoZSBjb21wYXJlIHRvIHplcm8gKG9uIEFSTSBhbmQgbWF5YmUgb3RoZXJzKSAqLwogICBpZiAoKG5ld3NjYWxlID0gKHNjYWxlZmFjdG9yKSkgPj0gMCkgewogICAgICoodmFsdWUpIDw8PSBuZXdzY2FsZTsKICAgfSBlbHNlIHsKQEAgLTE5MSwzNCArMjMwLDM3IEBACiB9CiAjZW5kaWYKIAotLyohCi0gKgotICogIFxicmllZiAgU2NhbGUgaW5wdXQgdmFsdWUgYnkgMl57c2NhbGV9IGFuZCBzYXR1cmF0ZSBvdXRwdXQgdG8gMl57ZEJpdHMtMX0KLSAqICBccmV0dXJuIHNjYWxlZCBhbmQgc2F0dXJhdGVkIHZhbHVlCi0gKgotICogIFRoaXMgbWFjcm8gc2NhbGVzIHNyYyB2YWx1ZSByaWdodCBvciBsZWZ0IGFuZCBhcHBsaWVzIHNhdHVyYXRpb24gdG8gKDJeZEJpdHMpLTEKLSAqICBtYXhpbWEgb3V0cHV0LgotICovCisgIC8qIQorICAgKgorICAgKiAgXGJyaWVmICBTY2FsZSBpbnB1dCB2YWx1ZSBieSAyXntzY2FsZX0gYW5kIHNhdHVyYXRlIG91dHB1dCB0byAyXntkQml0cy0xfQorICAgKiAgXHJldHVybiBzY2FsZWQgYW5kIHNhdHVyYXRlZCB2YWx1ZQorICAgKgorICAgKiAgVGhpcyBtYWNybyBzY2FsZXMgc3JjIHZhbHVlIHJpZ2h0IG9yIGxlZnQgYW5kIGFwcGxpZXMgc2F0dXJhdGlvbiB0bworICAgKiAoMl5kQml0cyktMSBtYXhpbWEgb3V0cHV0LgorICAgKi8KIAogI2lmbmRlZiBTQVRVUkFURV9SSUdIVF9TSElGVAotICAjZGVmaW5lIFNBVFVSQVRFX1JJR0hUX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICggKCgoTE9ORykoc3JjKT4+KHNjYWxlKSkgPiAoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKSkgICAgICA/IChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpICAgIFwKLSAgICAgICAgICAgICAgOiAoKChMT05HKShzcmMpPj4oc2NhbGUpKSA8IH4oKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkpKSA/IH4oKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkpIFwKLSAgICAgICAgICAgICAgOiAoKExPTkcpKHNyYykgPj4gKHNjYWxlKSkgKQorI2RlZmluZSBTQVRVUkFURV9SSUdIVF9TSElGVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoTE9ORykoc3JjKSA+PiAoc2NhbGUpKSA+IChMT05HKSgoKDFVKSA8PCAoKGRCaXRzKS0xKSkgLSAxKSkgICAgICAgICAgXAorICAgICAgID8gKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKCgoTE9ORykoc3JjKSA+PiAoc2NhbGUpKSA8IH4oKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpKSkgXAorICAgICAgICAgICAgID8gfigoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIDogKChMT05HKShzcmMpID4+IChzY2FsZSkpKQogI2VuZGlmCiAKICNpZm5kZWYgU0FUVVJBVEVfTEVGVF9TSElGVAotICAjZGVmaW5lIFNBVFVSQVRFX0xFRlRfU0hJRlQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICggKChMT05HKShzcmMpID4gKChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpPj4oc2NhbGUpKSkgICAgPyAoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKSAgICAgIFwKLSAgICAgICAgICAgICAgOiAoKExPTkcpKHNyYykgPCB+KChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpPj4oc2NhbGUpKSkgPyB+KChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpKSAgIFwKLSAgICAgICAgICAgICAgOiAoKExPTkcpKHNyYykgPDwgKHNjYWxlKSkgKQorI2RlZmluZSBTQVRVUkFURV9MRUZUX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoTE9ORykoc3JjKSA+ICgoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkgPj4gKHNjYWxlKSkpICAgICAgICBcCisgICAgICAgPyAoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKChMT05HKShzcmMpIDwgfigoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkgPj4gKHNjYWxlKSkpIFwKKyAgICAgICAgICAgICA/IH4oKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgOiAoKExPTkcpKHNyYykgPDwgKHNjYWxlKSkpCiAjZW5kaWYKIAogI2lmbmRlZiBTQVRVUkFURV9TSElGVAotI2RlZmluZSBTQVRVUkFURV9TSElGVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgICAgICAgICBcCi0gICAgICggKChzY2FsZSkgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgPyBTQVRVUkFURV9MRUZUX1NISUZUKChzcmMpLCAtKHNjYWxlKSwgKGRCaXRzKSkgICBcCi0gICAgICA6IFNBVFVSQVRFX1JJR0hUX1NISUZUKChzcmMpLCAoc2NhbGUpLCAoZEJpdHMpKSApCisjZGVmaW5lIFNBVFVSQVRFX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoc2NhbGUpIDwgMCkgPyBTQVRVUkFURV9MRUZUX1NISUZUKChzcmMpLCAtKHNjYWxlKSwgKGRCaXRzKSkgXAorICAgICAgICAgICAgICAgICA6IFNBVFVSQVRFX1JJR0hUX1NISUZUKChzcmMpLCAoc2NhbGUpLCAoZEJpdHMpKSkKICNlbmRpZgogCiAvKgpAQCAtMjI2LDI1ICsyNjgsMzEgQEAKICAqIHRvIGF2b2lkIHByb2JsZW1zIHdoZW4gaW52ZXJ0aW5nIHRoZSBzaWduIG9mIHRoZSByZXN1bHQuCiAgKi8KICNpZm5kZWYgU0FUVVJBVEVfTEVGVF9TSElGVF9BTFQKLSNkZWZpbmUgU0FUVVJBVEVfTEVGVF9TSElGVF9BTFQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAoICgoTE9ORykoc3JjKSA+ICgoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKT4+KHNjYWxlKSkpICAgID8gKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkgICAgICBcCi0gICAgICAgICAgICAgIDogKChMT05HKShzcmMpIDwgfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0yKT4+KHNjYWxlKSkpID8gfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0yKSkgICBcCi0gICAgICAgICAgICAgIDogKChMT05HKShzcmMpIDw8IChzY2FsZSkpICkKKyNkZWZpbmUgU0FUVVJBVEVfTEVGVF9TSElGVF9BTFQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKExPTkcpKHNyYykgPiAoKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpID4+IChzY2FsZSkpKSAgICAgICAgXAorICAgICAgID8gKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6ICgoTE9ORykoc3JjKSA8IH4oKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDIpID4+IChzY2FsZSkpKSBcCisgICAgICAgICAgICAgPyB+KChMT05HKSgoKDFVKSA8PCAoKGRCaXRzKS0xKSkgLSAyKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIDogKChMT05HKShzcmMpIDw8IChzY2FsZSkpKQogI2VuZGlmCiAKICNpZm5kZWYgU0FUVVJBVEVfUklHSFRfU0hJRlRfQUxUCi0gICNkZWZpbmUgU0FUVVJBVEVfUklHSFRfU0hJRlRfQUxUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKCAoKChMT05HKShzcmMpPj4oc2NhbGUpKSA+IChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpKSAgICAgID8gKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkgICAgXAotICAgICAgICAgICAgICA6ICgoKExPTkcpKHNyYyk+PihzY2FsZSkpIDwgfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0yKSkpID8gfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0yKSkgXAotICAgICAgICAgICAgICA6ICgoTE9ORykoc3JjKSA+PiAoc2NhbGUpKSApCisjZGVmaW5lIFNBVFVSQVRFX1JJR0hUX1NISUZUX0FMVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChMT05HKShzcmMpID4+IChzY2FsZSkpID4gKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpKSAgICAgICAgICBcCisgICAgICAgPyAoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAoKChMT05HKShzcmMpID4+IChzY2FsZSkpIDwgfigoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMikpKSBcCisgICAgICAgICAgICAgPyB+KChMT05HKSgoKDFVKSA8PCAoKGRCaXRzKS0xKSkgLSAyKSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgOiAoKExPTkcpKHNyYykgPj4gKHNjYWxlKSkpCiAjZW5kaWYKIAogI2lmbmRlZiBTQVRVUkFURV9JTlRfUENNX1JJR0hUX1NISUZUCi0jZGVmaW5lIFNBVFVSQVRFX0lOVF9QQ01fUklHSFRfU0hJRlQoc3JjLCBzY2FsZSkgU0FUVVJBVEVfUklHSFRfU0hJRlQoc3JjLCBzY2FsZSwgU0FNUExFX0JJVFMpCisjZGVmaW5lIFNBVFVSQVRFX0lOVF9QQ01fUklHSFRfU0hJRlQoc3JjLCBzY2FsZSkgXAorICBTQVRVUkFURV9SSUdIVF9TSElGVChzcmMsIHNjYWxlLCBTQU1QTEVfQklUUykKICNlbmRpZgogCiAjaWZuZGVmIFNBVFVSQVRFX0lOVF9QQ01fTEVGVF9TSElGVAotI2RlZmluZSBTQVRVUkFURV9JTlRfUENNX0xFRlRfU0hJRlQoc3JjLCBzY2FsZSkgU0FUVVJBVEVfTEVGVF9TSElGVChzcmMsIHNjYWxlLCBTQU1QTEVfQklUUykKKyNkZWZpbmUgU0FUVVJBVEVfSU5UX1BDTV9MRUZUX1NISUZUKHNyYywgc2NhbGUpIFwKKyAgU0FUVVJBVEVfTEVGVF9TSElGVChzcmMsIHNjYWxlLCBTQU1QTEVfQklUUykKICNlbmRpZgogCiAjZW5kaWYgLyogI2lmbmRlZiBTQ0FMRV9IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9zY3JhbWJsZS5oIGIvbGliRkRLL2luY2x1ZGUvc2NyYW1ibGUuaAppbmRleCBjZWFmNTI3Li5mMDdlYmVkIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9zY3JhbWJsZS5oCisrKyBiL2xpYkZESy9pbmNsdWRlL3NjcmFtYmxlLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFNDUkFNQkxFX0gKICNkZWZpbmUgU0NSQU1CTEVfSApAQCAtOTQsMTAgKzEwNiwxMCBAQAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogI2lmIGRlZmluZWQoX19hcm1fXykKLSNpbmNsdWRlICJhcm0vc2NyYW1ibGUuaCIKKyNpbmNsdWRlICJhcm0vc2NyYW1ibGVfYXJtLmgiCiAKLSNlbGlmIGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19taXBzX2RzcCkJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotI2luY2x1ZGUgIm1pcHMvc2NyYW1ibGUuaCIKKyNlbGlmIGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19taXBzX2RzcCkKKyNpbmNsdWRlICJtaXBzL3NjcmFtYmxlX21pcHMuaCIKIAogI2VuZGlmCiAKQEAgLTExMCw1MyArMTIyLDI5IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAhZGVmaW5lZChGVU5DVElPTl9zY3JhbWJsZV9zZ2wpCi0KLWlubGluZSB2b2lkIHNjcmFtYmxlX3NnbChGSVhQX1NHTCAqeCwgSU5UIG4pCi17Ci0gIElOVCBtLGssajsKLQotICBmb3IgKG09MSxqPTA7IG08bi0xOyBtKyspCi0gIHsKLSAgICB7Zm9yKGs9bj4+MTsgKCEoKGpePWspJmspKTsgaz4+PTEpO30KLQotICAgIGlmIChqPm0pCi0gICAgewotICAgICAgRklYUF9TR0wgdG1wOwotICAgICAgdG1wPXhbMiptXTsKLSAgICAgIHhbMiptXT14WzIqal07Ci0gICAgICB4WzIqal09dG1wOwotCi0gICAgICB0bXA9eFsyKm0rMV07Ci0gICAgICB4WzIqbSsxXT14WzIqaisxXTsKLSAgICAgIHhbMipqKzFdPXRtcDsKLSAgICB9Ci0gIH0KLX0KLSNlbmRpZgotCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fc2NyYW1ibGUpCiAKIC8qIGRlZmF1bHQgc2NyYW1ibGUgZnVuY3Rpb25hbGl0eSAqLwotaW5saW5lIHZvaWQgc2NyYW1ibGUoRklYUF9EQkwgKngsIElOVCBuKQotewotICBJTlQgbSxrLGo7Ci0gIEZES19BU1NFUlQoISgoKFVJTlQ2NCl4KSYoQUxJR05NRU5UX0RFRkFVTFQtMSkpKTsKK2lubGluZSB2b2lkIHNjcmFtYmxlKEZJWFBfREJMICp4LCBJTlQgbGVuZ3RoKSB7CisgIElOVCBtLCBrLCBqOworICBGREtfQVNTRVJUKCEoKChJTlQpKElOVDY0KXgpICYgKEFMSUdOTUVOVF9ERUZBVUxUIC0gMSkpKTsKKyAgQ19BTExPQ19BTElHTkVEX0NIRUNLKHgpOwogCi0gIGZvciAobT0xLGo9MDsgbTxuLTE7IG0rKykKLSAgewotICAgIHtmb3Ioaz1uPj4xOyAoISgoal49aykmaykpOyBrPj49MSk7fQotCi0gICAgaWYgKGo+bSkKKyAgZm9yIChtID0gMSwgaiA9IDA7IG0gPCBsZW5ndGggLSAxOyBtKyspIHsKICAgICB7Ci0gICAgICBGSVhQX0RCTCB0bXA7Ci0gICAgICB0bXA9eFsyKm1dOwotICAgICAgeFsyKm1dPXhbMipqXTsKLSAgICAgIHhbMipqXT10bXA7CisgICAgICBmb3IgKGsgPSBsZW5ndGggPj4gMTsgKCEoKGogXj0gaykgJiBrKSk7IGsgPj49IDEpCisgICAgICAgIDsKKyAgICB9CiAKLSAgICAgIHRtcD14WzIqbSsxXTsKLSAgICAgIHhbMiptKzFdPXhbMipqKzFdOwotICAgICAgeFsyKmorMV09dG1wOworICAgIGlmIChqID4gbSkgeworICAgICAgRklYUF9EQkwgdG1wOworICAgICAgdG1wID0geFsyICogbV07CisgICAgICB4WzIgKiBtXSA9IHhbMiAqIGpdOworICAgICAgeFsyICogal0gPSB0bXA7CisKKyAgICAgIHRtcCA9IHhbMiAqIG0gKyAxXTsKKyAgICAgIHhbMiAqIG0gKyAxXSA9IHhbMiAqIGogKyAxXTsKKyAgICAgIHhbMiAqIGogKyAxXSA9IHRtcDsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL3g4Ni9hYnNfeDg2LmggYi9saWJGREsvaW5jbHVkZS94ODYvYWJzX3g4Ni5oCmluZGV4IDk2Mzc0ZWMuLmVmZDY0MzMgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL3g4Ni9hYnNfeDg2LmgKKysrIGIvbGliRkRLL2luY2x1ZGUveDg2L2Fic194ODYuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyOCArOTAsMzQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKEFCU19YODZfSCkKKyNkZWZpbmUgQUJTX1g4Nl9ICisKICNpZiBkZWZpbmVkKF9feDg2X18pCiAKLSAgI2lmIGRlZmluZWQoX194ODZfNjRfXykKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCiAKLSAgICBpbmxpbmUgSU5UIGZpeGFic19EKElOVCB4KSAgICAgIHsgcmV0dXJuICgoeCkgPiAoSU5UKSgwKSkgICAgICA/ICh4KSA6IC0oeCkgOyB9Ci0gICAgaW5saW5lIElOVCBmaXhhYnNfUyhJTlQgeCkgICAgICB7IHJldHVybiAoKHgpID4gKElOVCkoMCkpICAgICAgPyAoeCkgOiAtKHgpIDsgfQoraW5saW5lIElOVCBmaXhhYnNfRChJTlQgeCkgeyByZXR1cm4gKCh4KSA+IChJTlQpKDApKSA/ICh4KSA6IC0oeCk7IH0KK2lubGluZSBJTlQgZml4YWJzX1MoSU5UIHgpIHsgcmV0dXJuICgoeCkgPiAoSU5UKSgwKSkgPyAoeCkgOiAtKHgpOyB9CiAKLSAgICAjZGVmaW5lIGZpeGFic19JKHgpIGZpeGFic19EKHgpCisjZGVmaW5lIGZpeGFic19JKHgpIGZpeGFic19EKHgpCiAKLSAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeGFic19TCi0gICAgI2RlZmluZSBGVU5DVElPTl9maXhhYnNfRAotICAgICNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0kKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX1MKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0QKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0kKIAotICAjZW5kaWYgLyogX194ODZfNjRfXyAqLworI2VuZGlmIC8qIF9feDg2XzY0X18gKi8KIAogI2VuZGlmIC8qX194ODZfXyAqLwogCisjZW5kaWYgLyogIWRlZmluZWQoQUJTX1g4Nl9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUveDg2L2Nsel94ODYuaCBiL2xpYkZESy9pbmNsdWRlL3g4Ni9jbHpfeDg2LmgKaW5kZXggMWJjNDNlNS4uYmFkY2EyOSAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUveDg2L2Nsel94ODYuaAorKysgYi9saWJGREsvaW5jbHVkZS94ODYvY2x6X3g4Ni5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDc2ICs5MCw3NiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAotICAgQXV0aG9yKHMpOgotICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiB4ODYgdmVyc2lvbiBvZiBjb3VudCBsZWFkaW5nIHplcm8gLyBiaXRzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChDTFpfWDg2X0gpCisjZGVmaW5lIENMWl9YODZfSAogCiAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX194ODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkKIAotICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm16X0QKLSAgI2RlZmluZSBGVU5DVElPTl9maXhub3JtX0QKKyNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybXpfRAorI2RlZmluZSBGVU5DVElPTl9maXhub3JtX0QKIAotICBpbmxpbmUgSU5UIGZpeG5vcm16X0QoTE9ORyB2YWx1ZSkKLSAgewotICAgIElOVCByZXN1bHQ7CitpbmxpbmUgSU5UIGZpeG5vcm16X0QoTE9ORyB2YWx1ZSkgeworICBJTlQgcmVzdWx0OwogCi0gICAgaWYgKHZhbHVlICE9IDApIHsKLSAgICAgIHJlc3VsdCA9IF9fYnVpbHRpbl9jbHoodmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgPSAzMjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgaWYgKHZhbHVlICE9IDApIHsKKyAgICByZXN1bHQgPSBfX2J1aWx0aW5fY2x6KHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSAzMjsKICAgfQorICByZXR1cm4gcmVzdWx0OworfQogCi0gIGlubGluZSBJTlQgZml4bm9ybV9EKExPTkcgdmFsdWUpCi0gIHsKLSAgICBJTlQgcmVzdWx0OwotICAgIGlmICh2YWx1ZSA9PSAwKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIDwgMCkgewotICAgICAgdmFsdWUgPSB+dmFsdWU7Ci0gICAgfQotICAgIHJlc3VsdCA9ICBmaXhub3Jtel9EKHZhbHVlKTsKLSAgICByZXR1cm4gcmVzdWx0IC0gMTsKK2lubGluZSBJTlQgZml4bm9ybV9EKExPTkcgdmFsdWUpIHsKKyAgSU5UIHJlc3VsdDsKKyAgaWYgKHZhbHVlID09IDApIHsKKyAgICByZXR1cm4gMDsKICAgfQorICBpZiAodmFsdWUgPCAwKSB7CisgICAgdmFsdWUgPSB+dmFsdWU7CisgIH0KKyAgcmVzdWx0ID0gZml4bm9ybXpfRCh2YWx1ZSk7CisgIHJldHVybiByZXN1bHQgLSAxOworfQogCi0KLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIChkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX01fWDY0KSkKKyNlbGlmIChfTVNDX1ZFUiA+IDEyMDApICYmIChkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX01fWDY0KSkKIAogI2luY2x1ZGUgPGludHJpbi5oPgogCi0gICNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybXpfRAotICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm1fRAorI2RlZmluZSBGVU5DVElPTl9maXhub3Jtel9ECisjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm1fRAogCi0gIGlubGluZSBJTlQgZml4bm9ybXpfRChMT05HIHZhbHVlKQotICB7Ci0gICAgdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOwotICAgIHVuc2lnbmVkIGNoYXIgZXJyOwotICAgIGVyciA9IF9CaXRTY2FuUmV2ZXJzZSgmcmVzdWx0LCB2YWx1ZSk7Ci0gICAgaWYgKGVycikgewotICAgICAgcmV0dXJuIDMxIC0gcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMzI7Ci0gICAgfQoraW5saW5lIElOVCBmaXhub3Jtel9EKExPTkcgdmFsdWUpIHsKKyAgdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworICB1bnNpZ25lZCBjaGFyIGVycjsKKyAgZXJyID0gX0JpdFNjYW5SZXZlcnNlKCZyZXN1bHQsIHZhbHVlKTsKKyAgaWYgKGVycikgeworICAgIHJldHVybiAzMSAtIHJlc3VsdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMzI7CiAgIH0KK30KIAotICBpbmxpbmUgSU5UIGZpeG5vcm1fRChMT05HIHZhbHVlKQotICB7Ci0gICAgSU5UIHJlc3VsdDsKLSAgICBpZiAodmFsdWUgPT0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgIHZhbHVlID0gfnZhbHVlOwotICAgIH0KLSAgICByZXN1bHQgPSAgZml4bm9ybXpfRCh2YWx1ZSk7Ci0gICAgcmV0dXJuIHJlc3VsdCAtIDE7CitpbmxpbmUgSU5UIGZpeG5vcm1fRChMT05HIHZhbHVlKSB7CisgIElOVCByZXN1bHQ7CisgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgcmV0dXJuIDA7CiAgIH0KKyAgaWYgKHZhbHVlIDwgMCkgeworICAgIHZhbHVlID0gfnZhbHVlOworICB9CisgIHJlc3VsdCA9IGZpeG5vcm16X0QodmFsdWUpOworICByZXR1cm4gcmVzdWx0IC0gMTsKK30KIAogI2VuZGlmIC8qIHRvb2xjaGFpbiAqLworI2VuZGlmIC8qICFkZWZpbmVkKENMWl9YODZfSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL3g4Ni9maXhtdWxfeDg2LmggYi9saWJGREsvaW5jbHVkZS94ODYvZml4bXVsX3g4Ni5oCmluZGV4IDdiNzRjYzcuLjg0ZTYzMTYgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL3g4Ni9maXhtdWxfeDg2LmgKKysrIGIvbGliRkRLL2luY2x1ZGUveDg2L2ZpeG11bF94ODYuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKEZJWE1VTF9YODZfSCkKKyNkZWZpbmUgRklYTVVMX1g4Nl9ICiAKICNpZiBkZWZpbmVkKF9feDg2X18pCiAKQEAgLTk2LDE4ICsxMTEsMTcgQEAKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsX0RECiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfREQKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RECi0jZGVmaW5lIGZpeG11bGRpdjJCaXRFeGFjdF9ERChhLGIpIGZpeG11bGRpdjJfREQoYSxiKQorI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfREQoYSwgYikgZml4bXVsZGl2Ml9ERChhLCBiKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9ERAotI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9ERChhLGIpIGZpeG11bF9ERChhLGIpCisjZGVmaW5lIGZpeG11bEJpdEV4YWN0X0REKGEsIGIpIGZpeG11bF9ERChhLCBiKQogCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9EUwotI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfRFMoYSxiKSBmaXhtdWxkaXYyX0RTKGEsYikKKyNkZWZpbmUgZml4bXVsZGl2MkJpdEV4YWN0X0RTKGEsIGIpIGZpeG11bGRpdjJfRFMoYSwgYikKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9EUwotI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9EUyhhLGIpIGZpeG11bF9EUyhhLGIpCisjZGVmaW5lIGZpeG11bEJpdEV4YWN0X0RTKGEsIGIpIGZpeG11bF9EUyhhLCBiKQogCi1pbmxpbmUgSU5UIGZpeG11bF9ERCAoSU5UIGEsIGNvbnN0IElOVCBiKQoteworaW5saW5lIElOVCBmaXhtdWxfREQoSU5UIGEsIGNvbnN0IElOVCBiKSB7CiAgIF9fYXNtCiAgIHsKICAgICBtb3YgZWF4LCBhCkBAIC0xMTUsNTkgKzEyOSw1MyBAQAogICAgIHNobCBlZHgsIDEKICAgICBtb3YgYSwgZWR4CiAgIH0KLSAgcmV0dXJuIGEgOworICByZXR1cm4gYTsKIH0KIAotCi1pbmxpbmUgSU5UIGZpeG11bGRpdjJfREQgKElOVCBhLCBjb25zdCBJTlQgYikKLXsKK2lubGluZSBJTlQgZml4bXVsZGl2Ml9ERChJTlQgYSwgY29uc3QgSU5UIGIpIHsKICAgX19hc20KICAgewogICAgIG1vdiBlYXgsIGEKICAgICBpbXVsIGIKICAgICBtb3YgYSwgZWR4CiAgIH0KLSAgcmV0dXJuIGEgOworICByZXR1cm4gYTsKIH0KIAotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLSNlbGlmIChkZWZpbmVkKF9fR05VQ19fKXx8ZGVmaW5lZChfX2dudV9saW51eF9fKSkgJiYgZGVmaW5lZChfX3g4Nl9fKQorLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqLworI2VsaWYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19nbnVfbGludXhfXykpICYmIGRlZmluZWQoX194ODZfXykKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxfREQKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2Ml9ERAogCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9ERAotI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfREQoYSxiKSBmaXhtdWxkaXYyX0REKGEsYikKKyNkZWZpbmUgZml4bXVsZGl2MkJpdEV4YWN0X0REKGEsIGIpIGZpeG11bGRpdjJfREQoYSwgYikKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9ERAotI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9ERChhLGIpIGZpeG11bF9ERChhLGIpCisjZGVmaW5lIGZpeG11bEJpdEV4YWN0X0REKGEsIGIpIGZpeG11bF9ERChhLCBiKQogCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9EUwotI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfRFMoYSxiKSBmaXhtdWxkaXYyX0RTKGEsYikKKyNkZWZpbmUgZml4bXVsZGl2MkJpdEV4YWN0X0RTKGEsIGIpIGZpeG11bGRpdjJfRFMoYSwgYikKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9EUwotI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9EUyhhLGIpIGZpeG11bF9EUyhhLGIpCisjZGVmaW5lIGZpeG11bEJpdEV4YWN0X0RTKGEsIGIpIGZpeG11bF9EUyhhLCBiKQogCi1pbmxpbmUgSU5UIGZpeG11bF9ERCAoSU5UIGEsIGNvbnN0IElOVCBiKQoteworaW5saW5lIElOVCBmaXhtdWxfREQoSU5UIGEsIGNvbnN0IElOVCBiKSB7CiAgIElOVCByZXN1bHQ7CiAKLSAgYXNtKCAiaW11bCAlMjtcbiIKLSAgICAgICAic2hsICQxLCAlMDtcbiIKLSAgICAgICAgICAgIDogIj1kIihyZXN1bHQpLCAiK2EiKGEpCi0gICAgICAgICAgICA6ICJyIihiKSApOworICBhc20oImltdWwgJTI7XG4iCisgICAgICAic2hsICQxLCAlMDtcbiIKKyAgICAgIDogIj1kIihyZXN1bHQpLCAiK2EiKGEpCisgICAgICA6ICJyIihiKSk7CiAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotCi1pbmxpbmUgSU5UIGZpeG11bGRpdjJfREQgKElOVCBhLCBjb25zdCBJTlQgYikKLXsKK2lubGluZSBJTlQgZml4bXVsZGl2Ml9ERChJTlQgYSwgY29uc3QgSU5UIGIpIHsKICAgSU5UIHJlc3VsdDsKIAotICBhc20gKCAiaW11bCAlMjsiCi0gICAgICAgICAgICAgOiAiPWQiKHJlc3VsdCksICIrYSIoYSkKLSAgICAgICAgICAgICA6ICJyIihiKSApOworICBhc20oImltdWwgJTI7IiA6ICI9ZCIocmVzdWx0KSwgIithIihhKSA6ICJyIihiKSk7CiAKICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTE3NiwzICsxODQsNCBAQAogCiAjZW5kaWYgLyogX194ODZfXyAqLwogCisjZW5kaWYgLyogIWRlZmluZWQoRklYTVVMX1g4Nl9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUveDg2L2ZpeHBvaW50X21hdGhfeDg2LmggYi9saWJGREsvaW5jbHVkZS94ODYvZml4cG9pbnRfbWF0aF94ODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODFmYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUveDg2L2ZpeHBvaW50X21hdGhfeDg2LmgKQEAgLTAsMCArMSwyMDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKworICAgRGVzY3JpcHRpb246IEZpeGVkIHBvaW50IHNwZWNpZmljIG1hdGhlbWF0aWNhbCBmdW5jdGlvbnMgZm9yIHg4NgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoRklYUE9JTlRfTUFUSF9YODZfSCkKKyNkZWZpbmUgRklYUE9JTlRfTUFUSF9YODZfSAorCisjZGVmaW5lIEZVTkNUSU9OX3NxcnRGaXhwCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpZmRlZiBGVU5DVElPTl9zcXJ0Rml4cAorc3RhdGljIGlubGluZSBGSVhQX0RCTCBzcXJ0Rml4cChjb25zdCBGSVhQX0RCTCBvcCkgeworICBGSVhQX0RCTCByZXN1bHQ7CisgIC8qIHJlc3VsdCA9CisgICAqIChGSVhQX0RCTCkoSU5UKShzcXJ0KChkb3VibGUpKElOVClvcCkqNDYzNDAuOTUwMDExODQxNTc4NTU5MTMzNzM2MTE0OTAzKTsKKyAgICovCisgIHJlc3VsdCA9IChGSVhQX0RCTCkoSU5UKShzcXJ0KChmbG9hdCkoSU5UKW9wKSAqIDQ2MzQwLjk0OTJmKTsKKyAgRkRLX0FTU0VSVChyZXN1bHQgPj0gKEZJWFBfREJMKTApOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qIEZVTkNUSU9OX3NxcnRGaXhwICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNkZWZpbmUgRlVOQ1RJT05faW52U3FydE5vcm0yCisvKioKKyAqIFxicmllZiBjYWxjdWxhdGUgMS4wL3NxcnQob3ApCisgKiBccGFyYW0gb3BfbSBtYW50aXNzYSBvZiBpbnB1dCB2YWx1ZS4KKyAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIHJldHVybiB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdAorICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKi8KKyNpZmRlZiBGVU5DVElPTl9pbnZTcXJ0Tm9ybTIKK2lubGluZSBGSVhQX0RCTCBpbnZTcXJ0Tm9ybTIoRklYUF9EQkwgb3BfbSwgSU5UICpyZXN1bHRfZSkgeworICBmbG9hdCByZXN1bHQ7CisgIGlmIChvcF9tID09IChGSVhQX0RCTCkwKSB7CisgICAgKnJlc3VsdF9lID0gMTY7CisgICAgcmV0dXJuICgoTE9ORykweDdmZmZmZmZmKTsKKyAgfQorICByZXN1bHQgPSAoZmxvYXQpKDEuMCAvIHNxcnQoMC41ZiAqIChmbG9hdCkoSU5UKW9wX20pKTsKKyAgcmVzdWx0ID0gKGZsb2F0KWxkZXhwKGZyZXhwZihyZXN1bHQsIHJlc3VsdF9lKSwgREZSQUNUX0JJVFMgLSAxKTsKKyAgKnJlc3VsdF9lICs9IDE1OworCisgIEZES19BU1NFUlQocmVzdWx0ID49IDApOworICByZXR1cm4gKEZJWFBfREJMKShJTlQpcmVzdWx0OworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ludlNxcnROb3JtMiAqLworCisjZGVmaW5lIEZVTkNUSU9OX2ludkZpeHAKKy8qKgorICogXGJyaWVmIGNhbGN1bGF0ZSAxLjAvb3AKKyAqIFxwYXJhbSBvcCBtYW50aXNzYSBvZiB0aGUgaW5wdXQgdmFsdWUuCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQgd2l0aCBpbXBsaXppdCBleHBvbmVudCBvZiAzMQorICovCisjaWZkZWYgRlVOQ1RJT05faW52Rml4cAoraW5saW5lIEZJWFBfREJMIGludkZpeHAoRklYUF9EQkwgb3ApIHsKKyAgZmxvYXQgcmVzdWx0OworICBJTlQgcmVzdWx0X2U7CisgIGlmICgob3AgPT0gKEZJWFBfREJMKTApIHx8IChvcCA9PSAoRklYUF9EQkwpMSkpIHsKKyAgICByZXR1cm4gKChMT05HKTB4N2ZmZmZmZmYpOworICB9CisgIHJlc3VsdCA9IChmbG9hdCkoMS4wIC8gKGZsb2F0KShJTlQpb3ApOworICByZXN1bHQgPSBmcmV4cGYocmVzdWx0LCAmcmVzdWx0X2UpOworICByZXN1bHQgPSBsZGV4cGYocmVzdWx0LCAzMSArIHJlc3VsdF9lKTsKKworICByZXR1cm4gKEZJWFBfREJMKShJTlQpcmVzdWx0OworfQorCisvKioKKyAqIFxicmllZiBjYWxjdWxhdGUgMS4wLyhvcF9tICogMl5vcF9lKQorICogXHBhcmFtIG9wX20gbWFudGlzc2Egb2YgdGhlIGlucHV0IHZhbHVlLgorICogXHBhcmFtIG9wX2UgcG9pbnRlciBpbnRvIHdlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSBpbnB1dCB2YWx1ZSBpcyBzdG9yZWQsIGFuZAorICogdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbnRvLgorICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKi8KK2lubGluZSBGSVhQX0RCTCBpbnZGaXhwKEZJWFBfREJMIG9wX20sIGludCAqb3BfZSkgeworICBmbG9hdCByZXN1bHQ7CisgIElOVCByZXN1bHRfZTsKKyAgaWYgKChvcF9tID09IChGSVhQX0RCTCkweDAwMDAwMDAwKSB8fCAob3BfbSA9PSAoRklYUF9EQkwpMHgwMDAwMDAwMSkpIHsKKyAgICAqb3BfZSA9IDMxIC0gKm9wX2U7CisgICAgcmV0dXJuICgoTE9ORykweDdmZmZmZmZmKTsKKyAgfQorICByZXN1bHQgPSAoZmxvYXQpKDEuMCAvIChmbG9hdCkoSU5UKW9wX20pOworICByZXN1bHQgPSBsZGV4cGYoZnJleHBmKHJlc3VsdCwgJnJlc3VsdF9lKSwgREZSQUNUX0JJVFMgLSAxKTsKKyAgKm9wX2UgPSByZXN1bHRfZSAtICpvcF9lICsgMzE7CisgIHJldHVybiAoRklYUF9EQkwpKElOVClyZXN1bHQ7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05faW52Rml4cCAqLworCisjZGVmaW5lIEZVTkNUSU9OX3NjaHVyX2RpdgorLyoqCisgKiBcYnJpZWYgRGl2aWRlIHR3byBGSVhQX0RCTCB2YWx1ZXMgd2l0aCBnaXZlbiBwcmVjaXNpb24uCisgKiBccGFyYW0gbnVtIGRpdmlkZW5kCisgKiBccGFyYW0gZGVudW0gZGl2aXNvcgorICogXHBhcmFtIGNvdW50IGFtb3VudCBvZiBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSByZXN1bHQgKHN0YXJ0aW5nIHRvIHRoZSBNU0IpCisgKiBccmV0dXJuIG51bS9kaXZpc29yCisgKi8KKyNpZmRlZiBGVU5DVElPTl9zY2h1cl9kaXYKK2lubGluZSBGSVhQX0RCTCBzY2h1cl9kaXYoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW51bSwgSU5UIGNvdW50KSB7CisgICh2b2lkKWNvdW50OworICAvKiBzYW1lIGFzc2VydHMgdGhhbiBmb3IgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gKi8KKyAgRkRLX0FTU0VSVChudW0gPj0gKEZJWFBfREJMKTApOworICBGREtfQVNTRVJUKGRlbnVtID4gKEZJWFBfREJMKTApOworICBGREtfQVNTRVJUKG51bSA8PSBkZW51bSk7CisKKyAgcmV0dXJuIChudW0gPT0gZGVudW0pID8gKEZJWFBfREJMKU1BWFZBTF9EQkwKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKEZJWFBfREJMKShJTlQpKCgoSU5UNjQpKElOVCludW0gPDwgMzEpIC8gKElOVClkZW51bSk7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fc2NodXJfZGl2ICovCisjZW5kaWYgLyogIWRlZmluZWQoRklYUE9JTlRfTUFUSF9YODZfSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvRkRLX2JpdGJ1ZmZlci5jcHAgYi9saWJGREsvc3JjL0ZES19iaXRidWZmZXIuY3BwCmluZGV4IDY4MGNlYWUuLjk4OTA1ZWEgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvRkRLX2JpdGJ1ZmZlci5jcHAKKysrIGIvbGliRkRLL3NyYy9GREtfYml0YnVmZmVyLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNjAgKzkwLDE0NyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKKwogICAgRGVzY3JpcHRpb246IGNvbW1vbiBiaXRidWZmZXIgcmVhZC93cml0ZSByb3V0aW5lcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiRkRLX2JpdGJ1ZmZlci5oIgogCi0KLQotCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAjaW5jbHVkZSAiZml4bWlubWF4LmgiCiAKLWNvbnN0IFVJTlQgQml0TWFzayBbMzIrMV0gPQotewotICAgICAgICAgMHgwLCAgICAgICAgMHgxLCAgICAgICAgMHgzLCAgICAgICAgMHg3LAotICAgICAgICAgMHhmLCAgICAgICAweDFmLCAgICAgICAweDNmLCAgICAgICAweDdmLAotICAgICAgICAweGZmLCAgICAgIDB4MWZmLCAgICAgIDB4M2ZmLCAgICAgIDB4N2ZmLAotICAgICAgIDB4ZmZmLCAgICAgMHgxZmZmLCAgICAgMHgzZmZmLCAgICAgMHg3ZmZmLAotICAgICAgMHhmZmZmLCAgICAweDFmZmZmLCAgICAweDNmZmZmLCAgICAweDdmZmZmLAotICAgICAweGZmZmZmLCAgIDB4MWZmZmZmLCAgIDB4M2ZmZmZmLCAgIDB4N2ZmZmZmLAotICAgIDB4ZmZmZmZmLCAgMHgxZmZmZmZmLCAgMHgzZmZmZmZmLCAgMHg3ZmZmZmZmLAotICAgMHhmZmZmZmZmLCAweDFmZmZmZmZmLCAweDNmZmZmZmZmLCAweDdmZmZmZmZmLAotICAweGZmZmZmZmZmCi19OworY29uc3QgVUlOVCBCaXRNYXNrWzMyICsgMV0gPSB7CisgICAgMHgwLCAgICAgICAgMHgxLCAgICAgICAgMHgzLCAgICAgICAweDcsICAgICAgIDB4ZiwgICAgICAgMHgxZiwKKyAgICAweDNmLCAgICAgICAweDdmLCAgICAgICAweGZmLCAgICAgIDB4MWZmLCAgICAgMHgzZmYsICAgICAweDdmZiwKKyAgICAweGZmZiwgICAgICAweDFmZmYsICAgICAweDNmZmYsICAgIDB4N2ZmZiwgICAgMHhmZmZmLCAgICAweDFmZmZmLAorICAgIDB4M2ZmZmYsICAgIDB4N2ZmZmYsICAgIDB4ZmZmZmYsICAgMHgxZmZmZmYsICAweDNmZmZmZiwgIDB4N2ZmZmZmLAorICAgIDB4ZmZmZmZmLCAgIDB4MWZmZmZmZiwgIDB4M2ZmZmZmZiwgMHg3ZmZmZmZmLCAweGZmZmZmZmYsIDB4MWZmZmZmZmYsCisgICAgMHgzZmZmZmZmZiwgMHg3ZmZmZmZmZiwgMHhmZmZmZmZmZn07CiAKLWNvbnN0IFVJTlQgKmNvbnN0IFJFU1RSSUNUIHBCaXRNYXNrID0gQml0TWFzazsKK3ZvaWQgRkRLX0NyZWF0ZUJpdEJ1ZmZlcihIQU5ETEVfRkRLX0JJVEJVRiAqaEJpdEJ1ZiwgVUNIQVIgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBidWZTaXplKSB7CisgIEZES19Jbml0Qml0QnVmZmVyKCpoQml0QnVmLCBwQnVmZmVyLCBidWZTaXplLCAwKTsKIAotdm9pZCBGREtfQ3JlYXRlQml0QnVmZmVyIChIQU5ETEVfRkRLX0JJVEJVRiAqaEJpdEJ1ZiwgVUNIQVIgKnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSkKLXsKLSAgIEZES19Jbml0Qml0QnVmZmVyICgqaEJpdEJ1ZiwgcEJ1ZmZlciwgYnVmU2l6ZSwgMCk7Ci0KLSAgIEZES21lbWNsZWFyKCgqaEJpdEJ1ZiktPkJ1ZmZlciwgYnVmU2l6ZSpzaXplb2YoVUNIQVIpKTsKKyAgRkRLbWVtY2xlYXIoKCpoQml0QnVmKS0+QnVmZmVyLCBidWZTaXplICogc2l6ZW9mKFVDSEFSKSk7CiB9CiAKLXZvaWQgRkRLX0RlbGV0ZUJpdEJ1ZmZlciAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikgeyA7IH0KK3ZvaWQgRkRLX0RlbGV0ZUJpdEJ1ZmZlcihIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmKSB7IDsgfQogCi12b2lkIEZES19Jbml0Qml0QnVmZmVyIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVQ0hBUiAqcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSwgVUlOVCB2YWxpZEJpdHMpCi17Ci0gICBoQml0QnVmLT5WYWxpZEJpdHMgICA9IHZhbGlkQml0cyA7Ci0gICBoQml0QnVmLT5SZWFkT2Zmc2V0ICA9IDAgOwotICAgaEJpdEJ1Zi0+V3JpdGVPZmZzZXQgPSAwIDsKLSAgIGhCaXRCdWYtPkJpdENudCAgICAgID0gMCA7Ci0gICBoQml0QnVmLT5CaXROZHggICAgICA9IDAgOwordm9pZCBGREtfSW5pdEJpdEJ1ZmZlcihIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVQ0hBUiAqcEJ1ZmZlciwgVUlOVCBidWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHZhbGlkQml0cykgeworICBoQml0QnVmLT5WYWxpZEJpdHMgPSB2YWxpZEJpdHM7CisgIGhCaXRCdWYtPlJlYWRPZmZzZXQgPSAwOworICBoQml0QnVmLT5Xcml0ZU9mZnNldCA9IDA7CisgIGhCaXRCdWYtPkJpdE5keCA9IDA7CiAKLSAgIGhCaXRCdWYtPkJ1ZmZlciAgICAgID0gcEJ1ZmZlciA7Ci0gICBoQml0QnVmLT5idWZTaXplICAgICA9IGJ1ZlNpemUgOwotICAgaEJpdEJ1Zi0+YnVmQml0cyAgICAgPSAoYnVmU2l6ZSA8PCAzKSA7Ci0jaWYgZGVmaW5lZChGREtfREVCVUcpIHx8IGRlZmluZWQoREVCVUcpCi0gICAvKmFzc3VyZSBidWZzaXplICgyXm4pICovCi0gICBpZiAoYnVmU2l6ZSE9MCkgewotICAgICBVSU5UIHggPSAwLCBuPWJ1ZlNpemU7Ci0gICAgIGZvciAoeD0wOyBuPjA7IHgrKyxuPj49MSkge30KLSAgICAgaWYgKCBidWZTaXplICE9ICgxPDwoeC0xKSkgKSB7Ci0gICAgICAgRkRLcHJpbnRmRXJyKCJFcnJvcjogYnVmU2l6ZWluIEZES19Jbml0Qml0QnVmZmVyKCkgIT0gKDJebiksICVkXG4iLCBidWZTaXplKTsKLSAgICAgfQotICAgfQotI2VuZGlmCi19Ci0KLXZvaWQgRkRLX1Jlc2V0Qml0QnVmZmVyICggSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiApCi17Ci0gICBoQml0QnVmLT5WYWxpZEJpdHMgICA9IDAgOwotICAgaEJpdEJ1Zi0+UmVhZE9mZnNldCAgPSAwIDsKLSAgIGhCaXRCdWYtPldyaXRlT2Zmc2V0ID0gMCA7Ci0gICBoQml0QnVmLT5CaXRDbnQgICAgICA9IDAgOwotICAgaEJpdEJ1Zi0+Qml0TmR4ICAgICAgPSAwIDsKLX0KLQotSU5UICBGREtfZ2V0IChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykKLXsKLSAgVUlOVCBieXRlT2Zmc2V0ID0gaEJpdEJ1Zi0+Qml0TmR4ID4+IDMgOwotICBVSU5UIGJpdE9mZnNldCAgPSBoQml0QnVmLT5CaXROZHggJiAweDA3IDsKLQotICBoQml0QnVmLT5CaXROZHggICAgID0gKGhCaXRCdWYtPkJpdE5keCArIG51bWJlck9mQml0cykgJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpIDsKLSAgaEJpdEJ1Zi0+Qml0Q250ICAgICs9ICBudW1iZXJPZkJpdHMgOwotICBoQml0QnVmLT5WYWxpZEJpdHMgLT0gIG51bWJlck9mQml0cyA7Ci0KLSAgVUlOVCBieXRlTWFzayA9IGhCaXRCdWYtPmJ1ZlNpemUgLSAxIDsKLQotICBVSU5UIHR4ID0gKGhCaXRCdWYtPkJ1ZmZlciBbIGJ5dGVPZmZzZXQgICAgJiBieXRlTWFza10gPDwgMjQpIHwKLSAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzEpICYgYnl0ZU1hc2tdIDw8IDE2KSB8Ci0gICAgICAgICAgICAoaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCsyKSAmIGJ5dGVNYXNrXSA8PCAgOCkgfAotICAgICAgICAgICAgIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrMykgJiBieXRlTWFza107Ci0KLSAgaWYgKGJpdE9mZnNldCkKKyAgaEJpdEJ1Zi0+QnVmZmVyID0gcEJ1ZmZlcjsKKyAgaEJpdEJ1Zi0+YnVmU2l6ZSA9IGJ1ZlNpemU7CisgIGhCaXRCdWYtPmJ1ZkJpdHMgPSAoYnVmU2l6ZSA8PCAzKTsKKyAgLyphc3N1cmUgYnVmc2l6ZSAoMl5uKSAqLworICBGREtfQVNTRVJUKGhCaXRCdWYtPlZhbGlkQml0cyA8PSBoQml0QnVmLT5idWZCaXRzKTsKKyAgRkRLX0FTU0VSVCgoYnVmU2l6ZSA+IDApICYmIChidWZTaXplIDw9IE1BWF9CVUZTSVpFX0JZVEVTKSk7CiAgIHsKLSAgICB0eCA8PD0gYml0T2Zmc2V0OwotICAgIHR4IHw9IGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrNCkgJiBieXRlTWFza10gPj4gKDgtYml0T2Zmc2V0KTsKLSAgfQotCi0gIHJldHVybiAodHggPj4gKDMyIC0gbnVtYmVyT2ZCaXRzKSkgOwotfQotCi1JTlQgRkRLX2dldDMyIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmKQotewotICBVSU5UIEJpdE5keCA9IGhCaXRCdWYtPkJpdE5keCArIDMyOwotICBpZiAoQml0TmR4IDw9IGhCaXRCdWYtPmJ1ZkJpdHMpCi0gIHsKLSAgICBoQml0QnVmLT5CaXROZHggPSBCaXROZHg7Ci0gICAgaEJpdEJ1Zi0+Qml0Q250ICs9ICAzMjsKLSAgICBoQml0QnVmLT5WYWxpZEJpdHMgLT0gMzI7Ci0KLSAgICBVSU5UIGJ5dGVPZmZzZXQgPSAoQml0TmR4LTEpID4+IDM7Ci0gICAgVUlOVCBjYWNoZSA9IChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMyldIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMildIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMSldIDw8ICA4KSB8Ci0gICAgICAgICAgICAgICAgICBoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMCldOwotCi0gICAgaWYgKCAoQml0TmR4ID0gKEJpdE5keCY3KSkgIT0gMCApIHsKLSAgICAgIGNhY2hlID0gKGNhY2hlID4+ICg4LUJpdE5keCkpIHwgKChVSU5UKWhCaXRCdWYtPkJ1ZmZlciBbYnl0ZU9mZnNldC00XSA8PCAoMjQrQml0TmR4KSk7CisgICAgVUlOVCB4ID0gMCwgbiA9IGJ1ZlNpemU7CisgICAgZm9yICh4ID0gMDsgbiA+IDA7IHgrKywgbiA+Pj0gMSkgewogICAgIH0KLSAgICByZXR1cm4gKGNhY2hlKSA7CisgICAgaWYgKGJ1ZlNpemUgIT0gKChVSU5UKTEgPDwgKHggLSAxKSkpIHsKKyAgICAgIEZES19BU1NFUlQoMCk7CisgICAgfQogICB9Ci0gIGVsc2UKLSAgewotICAgIC8qIGV4b3RpYyBwYXRoLCB1c2VkIG9ubHkgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCB3aGVuIHdyYXBwaW5nIGFyb3VuZCAqLwotICAgIGludCBuQml0cyA9IChJTlQpaEJpdEJ1Zi0+YnVmQml0cy0oSU5UKWhCaXRCdWYtPkJpdE5keDsKK30KIAotICAgIFVJTlQgY2FjaGUgPSBGREtfZ2V0IChoQml0QnVmLG5CaXRzKTw8ICgzMi1uQml0cyk7Ci0gICAgY2FjaGUgfD0gKEZES19nZXQgKGhCaXRCdWYsMzItbkJpdHMpKTsKK3ZvaWQgRkRLX1Jlc2V0Qml0QnVmZmVyKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYpIHsKKyAgaEJpdEJ1Zi0+VmFsaWRCaXRzID0gMDsKKyAgaEJpdEJ1Zi0+UmVhZE9mZnNldCA9IDA7CisgIGhCaXRCdWYtPldyaXRlT2Zmc2V0ID0gMDsKKyAgaEJpdEJ1Zi0+Qml0TmR4ID0gMDsKK30KKworI2lmbmRlZiBGVU5DVElPTl9GREtfZ2V0CitJTlQgRkRLX2dldChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykgeworICBVSU5UIGJ5dGVPZmZzZXQgPSBoQml0QnVmLT5CaXROZHggPj4gMzsKKyAgVUlOVCBiaXRPZmZzZXQgPSBoQml0QnVmLT5CaXROZHggJiAweDA3OworCisgIGhCaXRCdWYtPkJpdE5keCA9IChoQml0QnVmLT5CaXROZHggKyBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKTsKKyAgaEJpdEJ1Zi0+VmFsaWRCaXRzIC09IG51bWJlck9mQml0czsKKworICBVSU5UIGJ5dGVNYXNrID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIDE7CisKKyAgVUlOVCB0eCA9IChoQml0QnVmLT5CdWZmZXJbYnl0ZU9mZnNldCAmIGJ5dGVNYXNrXSA8PCAyNCkgfAorICAgICAgICAgICAgKGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCArIDEpICYgYnl0ZU1hc2tdIDw8IDE2KSB8CisgICAgICAgICAgICAoaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0ICsgMikgJiBieXRlTWFza10gPDwgOCkgfAorICAgICAgICAgICAgaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0ICsgMykgJiBieXRlTWFza107CisKKyAgaWYgKGJpdE9mZnNldCkgeworICAgIHR4IDw8PSBiaXRPZmZzZXQ7CisgICAgdHggfD0gaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0ICsgNCkgJiBieXRlTWFza10gPj4gKDggLSBiaXRPZmZzZXQpOworICB9CisKKyAgcmV0dXJuICh0eCA+PiAoMzIgLSBudW1iZXJPZkJpdHMpKTsKK30KKyNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX0ZES19nZXQgKi8KKworI2lmbmRlZiBGVU5DVElPTl9GREtfZ2V0MzIKK0lOVCBGREtfZ2V0MzIoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikgeworICBVSU5UIEJpdE5keCA9IGhCaXRCdWYtPkJpdE5keCArIDMyOworICBoQml0QnVmLT5CaXROZHggPSBCaXROZHggJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpOworICBoQml0QnVmLT5WYWxpZEJpdHMgPSAoVUlOVCkoKElOVCloQml0QnVmLT5WYWxpZEJpdHMgLSAoSU5UKTMyKTsKKworICBVSU5UIGJ5dGVPZmZzZXQgPSAoQml0TmR4IC0gMSkgPj4gMzsKKyAgaWYgKEJpdE5keCA8PSBoQml0QnVmLT5idWZCaXRzKSB7CisgICAgVUlOVCBjYWNoZSA9IChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAzKV0gPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgKGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDIpXSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAoaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0IC0gMSldIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0IC0gMCldOworCisgICAgaWYgKChCaXROZHggPSAoQml0TmR4ICYgNykpICE9IDApIHsKKyAgICAgIGNhY2hlID0gKGNhY2hlID4+ICg4IC0gQml0TmR4KSkgfAorICAgICAgICAgICAgICAoKFVJTlQpaEJpdEJ1Zi0+QnVmZmVyW2J5dGVPZmZzZXQgLSA0XSA8PCAoMjQgKyBCaXROZHgpKTsKKyAgICB9CisgICAgcmV0dXJuIChjYWNoZSk7CisgIH0gZWxzZSB7CisgICAgVUlOVCBieXRlX21hc2sgPSBoQml0QnVmLT5idWZTaXplIC0gMTsKKyAgICBVSU5UIGNhY2hlID0gKGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDMpICYgYnl0ZV9tYXNrXSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAoaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0IC0gMikgJiBieXRlX21hc2tdIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAxKSAmIGJ5dGVfbWFza10gPDwgOCkgfAorICAgICAgICAgICAgICAgICBoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAwKSAmIGJ5dGVfbWFza107CisKKyAgICBpZiAoKEJpdE5keCA9IChCaXROZHggJiA3KSkgIT0gMCkgeworICAgICAgY2FjaGUgPSAoY2FjaGUgPj4gKDggLSBCaXROZHgpKSB8CisgICAgICAgICAgICAgICgoVUlOVCloQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSA0KSAmIGJ5dGVfbWFza10KKyAgICAgICAgICAgICAgIDw8ICgyNCArIEJpdE5keCkpOworICAgIH0KICAgICByZXR1cm4gKGNhY2hlKTsKICAgfQogfQorI2VuZGlmCiAKLUlOVCBGREtfZ2V0QndkIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykKLXsKLSAgVUlOVCBieXRlT2Zmc2V0ID0gaEJpdEJ1Zi0+Qml0TmR4ID4+IDMgOwotICBVSU5UIGJpdE9mZnNldCAgPSBoQml0QnVmLT5CaXROZHggJiAweDA3IDsKLSAgVUlOVCBieXRlTWFzayAgID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIDEgOworSU5UIEZES19nZXRCd2QoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpIHsKKyAgVUlOVCBieXRlT2Zmc2V0ID0gaEJpdEJ1Zi0+Qml0TmR4ID4+IDM7CisgIFVJTlQgYml0T2Zmc2V0ID0gaEJpdEJ1Zi0+Qml0TmR4ICYgMHgwNzsKKyAgVUlOVCBieXRlTWFzayA9IGhCaXRCdWYtPmJ1ZlNpemUgLSAxOwogICBpbnQgaTsKIAotICBoQml0QnVmLT5CaXROZHggICAgID0gKGhCaXRCdWYtPkJpdE5keCAtIG51bWJlck9mQml0cykgJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpIDsKLSAgaEJpdEJ1Zi0+Qml0Q250ICAgIC09ICBudW1iZXJPZkJpdHMgOwotICBoQml0QnVmLT5WYWxpZEJpdHMgKz0gIG51bWJlck9mQml0cyA7CisgIGhCaXRCdWYtPkJpdE5keCA9IChoQml0QnVmLT5CaXROZHggLSBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKTsKKyAgaEJpdEJ1Zi0+VmFsaWRCaXRzICs9IG51bWJlck9mQml0czsKIAotICBVSU5UIHR4ID0gaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC0zKSAmIGJ5dGVNYXNrXSA8PCAyNCB8Ci0gICAgICAgICAgICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTIpICYgYnl0ZU1hc2tdIDw8IDE2IHwKLSAgICAgICAgICAgIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMSkgJiBieXRlTWFza10gPDwgIDggfAotICAgICAgICAgICAgaEJpdEJ1Zi0+QnVmZmVyIFsgYnl0ZU9mZnNldCAgICAmIGJ5dGVNYXNrXSA7CisgIFVJTlQgdHggPSBoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAzKSAmIGJ5dGVNYXNrXSA8PCAyNCB8CisgICAgICAgICAgICBoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAyKSAmIGJ5dGVNYXNrXSA8PCAxNiB8CisgICAgICAgICAgICBoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAxKSAmIGJ5dGVNYXNrXSA8PCA4IHwKKyAgICAgICAgICAgIGhCaXRCdWYtPkJ1ZmZlcltieXRlT2Zmc2V0ICYgYnl0ZU1hc2tdOwogICBVSU5UIHR4YSA9IDB4MDsKIAotICB0eCA+Pj0gKDggLSBiaXRPZmZzZXQpIDsKKyAgdHggPj49ICg4IC0gYml0T2Zmc2V0KTsKIAotICBpZiAoYml0T2Zmc2V0ICYmIG51bWJlck9mQml0cyA+IDI0KQotICB7Ci0gICAgdHggfD0gaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC00KSAmIGJ5dGVNYXNrXSA8PCAoMjQgKyBiaXRPZmZzZXQpIDsKKyAgaWYgKGJpdE9mZnNldCAmJiBudW1iZXJPZkJpdHMgPiAyNCkgeworICAgIHR4IHw9IGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDQpICYgYnl0ZU1hc2tdIDw8ICgyNCArIGJpdE9mZnNldCk7CiAgIH0KIAogICAvKiBpbiBwbGFjZSB0dXJuIGFyb3VuZCAqLwpAQCAtMjQwLDI0MSArMjM4LDI1MiBAQAogICAgIFVJTlQgYml0TWFza1IgPSAweDAwMDAwMDAxIDw8IGk7CiAgICAgVUlOVCBiaXRNYXNrTCA9IDB4ODAwMDAwMDAgPj4gaTsKIAotICAgIHR4YSB8PSAodHggJiBiaXRNYXNrUikgPDwgKDMxIC0gKGk8PDEpKTsKLSAgICB0eGEgfD0gKHR4ICYgYml0TWFza0wpID4+ICgzMSAtIChpPDwxKSk7CisgICAgdHhhIHw9ICh0eCAmIGJpdE1hc2tSKSA8PCAoMzEgLSAoaSA8PCAxKSk7CisgICAgdHhhIHw9ICh0eCAmIGJpdE1hc2tMKSA+PiAoMzEgLSAoaSA8PCAxKSk7CiAgIH0KIAotICByZXR1cm4gKHR4YSA+PiAoMzIgLSBudW1iZXJPZkJpdHMpKSA7CisgIHJldHVybiAodHhhID4+ICgzMiAtIG51bWJlck9mQml0cykpOwogfQogCi12b2lkIEZES19wdXQgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIFVJTlQgdmFsdWUsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQotewotICBVSU5UIGJ5dGVPZmZzZXQgPSBoQml0QnVmLT5CaXROZHggPj4gMyA7Ci0gIFVJTlQgYml0T2Zmc2V0ICA9IGhCaXRCdWYtPkJpdE5keCAmIDB4MDcgOwordm9pZCBGREtfcHV0KEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIFVJTlQgdmFsdWUsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSB7CisgIGlmIChudW1iZXJPZkJpdHMgIT0gMCkgeworICAgIFVJTlQgYnl0ZU9mZnNldDAgPSBoQml0QnVmLT5CaXROZHggPj4gMzsKKyAgICBVSU5UIGJpdE9mZnNldCA9IGhCaXRCdWYtPkJpdE5keCAmIDB4NzsKIAotICBoQml0QnVmLT5CaXROZHggICAgID0gKGhCaXRCdWYtPkJpdE5keCArIG51bWJlck9mQml0cykgJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpIDsKLSAgaEJpdEJ1Zi0+Qml0Q250ICAgICs9ICBudW1iZXJPZkJpdHMgOwotICBoQml0QnVmLT5WYWxpZEJpdHMgKz0gIG51bWJlck9mQml0cyA7CisgICAgaEJpdEJ1Zi0+Qml0TmR4ID0gKGhCaXRCdWYtPkJpdE5keCArIG51bWJlck9mQml0cykgJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpOworICAgIGhCaXRCdWYtPlZhbGlkQml0cyArPSBudW1iZXJPZkJpdHM7CiAKLSAgVUlOVCBieXRlTWFzayA9IGhCaXRCdWYtPmJ1ZlNpemUgLSAxIDsKKyAgICBVSU5UIGJ5dGVNYXNrID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIDE7CiAKLSAgVUlOVCB0bXAgID0gdmFsdWU8PCgzMi1udW1iZXJPZkJpdHMpPj5iaXRPZmZzZXQ7Ci0gIFVJTlQgbWFzayA9IH5CaXRNYXNrWygzMi1iaXRPZmZzZXQpXSB8IChCaXRNYXNrIFsoMzItbnVtYmVyT2ZCaXRzKV0gPj4gYml0T2Zmc2V0KSA7CisgICAgVUlOVCBieXRlT2Zmc2V0MSA9IChieXRlT2Zmc2V0MCArIDEpICYgYnl0ZU1hc2s7CisgICAgVUlOVCBieXRlT2Zmc2V0MiA9IChieXRlT2Zmc2V0MCArIDIpICYgYnl0ZU1hc2s7CisgICAgVUlOVCBieXRlT2Zmc2V0MyA9IChieXRlT2Zmc2V0MCArIDMpICYgYnl0ZU1hc2s7CiAKLSAgaEJpdEJ1Zi0+QnVmZmVyIFsgYnl0ZU9mZnNldCAgICAmIGJ5dGVNYXNrXSAgPSAoaEJpdEJ1Zi0+QnVmZmVyIFsgYnl0ZU9mZnNldCAgICAmIGJ5dGVNYXNrXSYobWFzaz4+MjQpKSB8IChVQ0hBUikodG1wPj4yNCk7Ci0gIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrMSkgJiBieXRlTWFza10gID0gKGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrMSkgJiBieXRlTWFza10mKG1hc2s+PjE2KSkgfCAoVUNIQVIpKHRtcD4+MTYpOwotICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzIpICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzIpICYgYnl0ZU1hc2tdJihtYXNrPj44KSkgIHwgKFVDSEFSKSh0bXA+PjgpOwotICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzMpICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzMpICYgYnl0ZU1hc2tdJihtYXNrKSkgICAgIHwgKFVDSEFSKSh0bXApOworICAgIC8vIENyZWF0ZSB0bXAgY29udGFpbmluZyBmcmVlIGJpdHMgYXQgdGhlIGxlZnQgYm9yZGVyIGZvbGxvd2VkIGJ5IGJpdHMgdG8KKyAgICAvLyB3cml0ZSwgTFNCJ3MgYXJlIGNsZWFyZWQsIGlmIGF2YWlsYWJsZSBDcmVhdGUgbWFzayB0byBhcHBseSB1cG9uIGFsbAorICAgIC8vIGJ1ZmZlciBieXRlcworICAgIFVJTlQgdG1wID0gKHZhbHVlIDw8ICgzMiAtIG51bWJlck9mQml0cykpID4+IGJpdE9mZnNldDsKKyAgICBVSU5UIG1hc2sgPSB+KChCaXRNYXNrW251bWJlck9mQml0c10gPDwgKDMyIC0gbnVtYmVyT2ZCaXRzKSkgPj4gYml0T2Zmc2V0KTsKIAotICBpZiAoYml0T2Zmc2V0ICYmIG51bWJlck9mQml0cyA+IDI0KQotICB7Ci0gICAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCs0KSAmIGJ5dGVNYXNrXSAgPSAoVUNIQVIpKHZhbHVlPDwoNDAtbnVtYmVyT2ZCaXRzKT4+Yml0T2Zmc2V0KSB8Ci0gICAgICAgICAgICAgICAoIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrNCkgJiBieXRlTWFza10gJiBCaXRNYXNrWyg0MC1udW1iZXJPZkJpdHMtYml0T2Zmc2V0KV0gKSA7CisgICAgLy8gcmVhZCBhbGwgNCBieXRlcyBmcm9tIGJ1ZmZlciBhbmQgY3JlYXRlIGEgMzItYml0IGNhY2hlCisgICAgVUlOVCBjYWNoZSA9ICgoKFVJTlQpaEJpdEJ1Zi0+QnVmZmVyW2J5dGVPZmZzZXQwXSkgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgKCgoVUlOVCloQml0QnVmLT5CdWZmZXJbYnl0ZU9mZnNldDFdKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAoKChVSU5UKWhCaXRCdWYtPkJ1ZmZlcltieXRlT2Zmc2V0Ml0pIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgKCgoVUlOVCloQml0QnVmLT5CdWZmZXJbYnl0ZU9mZnNldDNdKSA8PCAwKTsKKworICAgIGNhY2hlID0gKGNhY2hlICYgbWFzaykgfCB0bXA7CisgICAgaEJpdEJ1Zi0+QnVmZmVyW2J5dGVPZmZzZXQwXSA9IChVQ0hBUikoY2FjaGUgPj4gMjQpOworICAgIGhCaXRCdWYtPkJ1ZmZlcltieXRlT2Zmc2V0MV0gPSAoVUNIQVIpKGNhY2hlID4+IDE2KTsKKyAgICBoQml0QnVmLT5CdWZmZXJbYnl0ZU9mZnNldDJdID0gKFVDSEFSKShjYWNoZSA+PiA4KTsKKyAgICBoQml0QnVmLT5CdWZmZXJbYnl0ZU9mZnNldDNdID0gKFVDSEFSKShjYWNoZSA+PiAwKTsKKworICAgIGlmICgoYml0T2Zmc2V0ICsgbnVtYmVyT2ZCaXRzKSA+IDMyKSB7CisgICAgICBVSU5UIGJ5dGVPZmZzZXQ0ID0gKGJ5dGVPZmZzZXQwICsgNCkgJiBieXRlTWFzazsKKyAgICAgIC8vIHJlbWFpbmluZyBiaXRzOiBpbiByYW5nZSAxLi43CisgICAgICAvLyByZXBsYWNlIE1TQml0cyBvZiBuZXh0IGJ5dGUgaW4gYnVmZmVyIGJ5IExTQml0cyBvZiAidmFsdWUiCisgICAgICBpbnQgYml0cyA9IChiaXRPZmZzZXQgKyBudW1iZXJPZkJpdHMpICYgNzsKKyAgICAgIGNhY2hlID0KKyAgICAgICAgICAoVUlOVCloQml0QnVmLT5CdWZmZXJbYnl0ZU9mZnNldDRdICYgKH4oQml0TWFza1tiaXRzXSA8PCAoOCAtIGJpdHMpKSk7CisgICAgICBjYWNoZSB8PSB2YWx1ZSA8PCAoOCAtIGJpdHMpOworICAgICAgaEJpdEJ1Zi0+QnVmZmVyW2J5dGVPZmZzZXQ0XSA9IChVQ0hBUiljYWNoZTsKKyAgICB9CiAgIH0KIH0KIAotdm9pZCBGREtfcHV0QndkIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVSU5UIHZhbHVlLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykKLXsKLSAgVUlOVCBieXRlT2Zmc2V0ID0gaEJpdEJ1Zi0+Qml0TmR4ID4+IDMgOwotICBVSU5UIGJpdE9mZnNldCAgPSA3IC0gKGhCaXRCdWYtPkJpdE5keCAmIDB4MDcpIDsKLSAgVUlOVCBieXRlTWFzayAgID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIDEgOwordm9pZCBGREtfcHV0QndkKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIFVJTlQgdmFsdWUsCisgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpIHsKKyAgVUlOVCBieXRlT2Zmc2V0ID0gaEJpdEJ1Zi0+Qml0TmR4ID4+IDM7CisgIFVJTlQgYml0T2Zmc2V0ID0gNyAtIChoQml0QnVmLT5CaXROZHggJiAweDA3KTsKKyAgVUlOVCBieXRlTWFzayA9IGhCaXRCdWYtPmJ1ZlNpemUgLSAxOwogCi0gIFVJTlQgbWFzayA9IH4oQml0TWFza1tudW1iZXJPZkJpdHNdIDw8IGJpdE9mZnNldCkgOworICBVSU5UIG1hc2sgPSB+KEJpdE1hc2tbbnVtYmVyT2ZCaXRzXSA8PCBiaXRPZmZzZXQpOwogICBVSU5UIHRtcCA9IDB4MDAwMDsKLSAgaW50ICBpOworICBpbnQgaTsKIAotICBoQml0QnVmLT5CaXROZHggICAgID0gKGhCaXRCdWYtPkJpdE5keCAtIG51bWJlck9mQml0cykgJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpIDsKLSAgaEJpdEJ1Zi0+Qml0Q250ICAgIC09ICBudW1iZXJPZkJpdHMgOwotICBoQml0QnVmLT5WYWxpZEJpdHMgLT0gIG51bWJlck9mQml0cyA7CisgIGhCaXRCdWYtPkJpdE5keCA9IChoQml0QnVmLT5CaXROZHggLSBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKTsKKyAgaEJpdEJ1Zi0+VmFsaWRCaXRzIC09IG51bWJlck9mQml0czsKIAogICAvKiBpbiBwbGFjZSB0dXJuIGFyb3VuZCAqLwogICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgIFVJTlQgYml0TWFza1IgPSAweDAwMDAwMDAxIDw8IGk7CiAgICAgVUlOVCBiaXRNYXNrTCA9IDB4ODAwMDAwMDAgPj4gaTsKIAotICAgIHRtcCB8PSAodmFsdWUgJiBiaXRNYXNrUikgPDwgKDMxIC0gKGk8PDEpKTsKLSAgICB0bXAgfD0gKHZhbHVlICYgYml0TWFza0wpID4+ICgzMSAtIChpPDwxKSk7CisgICAgdG1wIHw9ICh2YWx1ZSAmIGJpdE1hc2tSKSA8PCAoMzEgLSAoaSA8PCAxKSk7CisgICAgdG1wIHw9ICh2YWx1ZSAmIGJpdE1hc2tMKSA+PiAoMzEgLSAoaSA8PCAxKSk7CiAgIH0KICAgdmFsdWUgPSB0bXA7Ci0gIHRtcCAgID0gdmFsdWU+PigzMi1udW1iZXJPZkJpdHMpPDxiaXRPZmZzZXQ7CisgIHRtcCA9IHZhbHVlID4+ICgzMiAtIG51bWJlck9mQml0cykgPDwgYml0T2Zmc2V0OwogCi0gIGhCaXRCdWYtPkJ1ZmZlciBbIGJ5dGVPZmZzZXQgICAgJiBieXRlTWFza10gID0gKGhCaXRCdWYtPkJ1ZmZlciBbIGJ5dGVPZmZzZXQgICAgJiBieXRlTWFza10mKG1hc2spKSAgICAgfCAoVUNIQVIpKHRtcCk7Ci0gIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMSkgJiBieXRlTWFza10gID0gKGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMSkgJiBieXRlTWFza10mKG1hc2s+PjgpKSAgfCAoVUNIQVIpKHRtcD4+OCk7Ci0gIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMikgJiBieXRlTWFza10gID0gKGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMikgJiBieXRlTWFza10mKG1hc2s+PjE2KSkgfCAoVUNIQVIpKHRtcD4+MTYpOwotICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTMpICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTMpICYgYnl0ZU1hc2tdJihtYXNrPj4yNCkpIHwgKFVDSEFSKSh0bXA+PjI0KTsKKyAgaEJpdEJ1Zi0+QnVmZmVyW2J5dGVPZmZzZXQgJiBieXRlTWFza10gPQorICAgICAgKGhCaXRCdWYtPkJ1ZmZlcltieXRlT2Zmc2V0ICYgYnl0ZU1hc2tdICYgKG1hc2spKSB8IChVQ0hBUikodG1wKTsKKyAgaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0IC0gMSkgJiBieXRlTWFza10gPQorICAgICAgKGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDEpICYgYnl0ZU1hc2tdICYgKG1hc2sgPj4gOCkpIHwKKyAgICAgIChVQ0hBUikodG1wID4+IDgpOworICBoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAyKSAmIGJ5dGVNYXNrXSA9CisgICAgICAoaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0IC0gMikgJiBieXRlTWFza10gJiAobWFzayA+PiAxNikpIHwKKyAgICAgIChVQ0hBUikodG1wID4+IDE2KTsKKyAgaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0IC0gMykgJiBieXRlTWFza10gPQorICAgICAgKGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDMpICYgYnl0ZU1hc2tdICYgKG1hc2sgPj4gMjQpKSB8CisgICAgICAoVUNIQVIpKHRtcCA+PiAyNCk7CiAKLSAgaWYgKChiaXRPZmZzZXQgKyBudW1iZXJPZkJpdHMpID4gMzIpCi0gIHsKLSAgICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTQpICYgYnl0ZU1hc2tdICA9IChVQ0hBUikodmFsdWU+Pig2NC1udW1iZXJPZkJpdHMtYml0T2Zmc2V0KSkgfAotICAgICAgICAgICAgICAgKCBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTQpICYgYnl0ZU1hc2tdICYgfihCaXRNYXNrW2JpdE9mZnNldF0gPj4gKDMyLW51bWJlck9mQml0cykpICkgOworICBpZiAoKGJpdE9mZnNldCArIG51bWJlck9mQml0cykgPiAzMikgeworICAgIGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDQpICYgYnl0ZU1hc2tdID0KKyAgICAgICAgKFVDSEFSKSh2YWx1ZSA+PiAoNjQgLSBudW1iZXJPZkJpdHMgLSBiaXRPZmZzZXQpKSB8CisgICAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSA0KSAmIGJ5dGVNYXNrXSAmCisgICAgICAgICB+KEJpdE1hc2tbYml0T2Zmc2V0XSA+PiAoMzIgLSBudW1iZXJPZkJpdHMpKSk7CiAgIH0KIH0KIAorI2lmbmRlZiBGVU5DVElPTl9GREtfcHVzaEJhY2sKK3ZvaWQgRkRLX3B1c2hCYWNrKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzLAorICAgICAgICAgICAgICAgICAgVUNIQVIgY29uZmlnKSB7CisgIGhCaXRCdWYtPlZhbGlkQml0cyA9CisgICAgICAoY29uZmlnID09IDApID8gKFVJTlQpKChJTlQpaEJpdEJ1Zi0+VmFsaWRCaXRzICsgKElOVCludW1iZXJPZkJpdHMpCisgICAgICAgICAgICAgICAgICAgIDogKChVSU5UKSgoSU5UKWhCaXRCdWYtPlZhbGlkQml0cyAtIChJTlQpbnVtYmVyT2ZCaXRzKSk7CisgIGhCaXRCdWYtPkJpdE5keCA9ICgoVUlOVCkoKElOVCloQml0QnVmLT5CaXROZHggLSAoSU5UKW51bWJlck9mQml0cykpICYKKyAgICAgICAgICAgICAgICAgICAgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKTsKK30KKyNlbmRpZgogCi12b2lkIEZES19wdXNoQmFjayAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMsIFVDSEFSIGNvbmZpZykKLXsKLSAgaEJpdEJ1Zi0+Qml0Q250ICAgIC09IG51bWJlck9mQml0cyA7Ci0gIGhCaXRCdWYtPlZhbGlkQml0cyArPSAoY29uZmlnPT0wKSA/IG51bWJlck9mQml0cyA6ICgtKElOVCludW1iZXJPZkJpdHMpIDsKLSAgaEJpdEJ1Zi0+Qml0TmR4ICAgICA9IChoQml0QnVmLT5CaXROZHggLSBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKSA7Cit2b2lkIEZES19wdXNoRm9yd2FyZChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cywKKyAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGNvbmZpZykgeworICBoQml0QnVmLT5WYWxpZEJpdHMgPQorICAgICAgKGNvbmZpZyA9PSAwKSA/ICgoVUlOVCkoKElOVCloQml0QnVmLT5WYWxpZEJpdHMgLSAoSU5UKW51bWJlck9mQml0cykpCisgICAgICAgICAgICAgICAgICAgIDogKFVJTlQpKChJTlQpaEJpdEJ1Zi0+VmFsaWRCaXRzICsgKElOVCludW1iZXJPZkJpdHMpOworICBoQml0QnVmLT5CaXROZHggPQorICAgICAgKFVJTlQpKChJTlQpaEJpdEJ1Zi0+Qml0TmR4ICsgKElOVCludW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKTsKIH0KIAotdm9pZCBGREtfcHVzaEZvcndhcmQgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzLCBVQ0hBUiBjb25maWcpCi17Ci0gIGhCaXRCdWYtPkJpdENudCAgICArPSBudW1iZXJPZkJpdHMgOwotICBoQml0QnVmLT5WYWxpZEJpdHMgLT0gKGNvbmZpZz09MCkgPyBudW1iZXJPZkJpdHMgOiAoLShJTlQpbnVtYmVyT2ZCaXRzKSA7Ci0gIGhCaXRCdWYtPkJpdE5keCAgICAgPSAoaEJpdEJ1Zi0+Qml0TmR4ICsgbnVtYmVyT2ZCaXRzKSAmIChoQml0QnVmLT5idWZCaXRzIC0gMSkgOworI2lmbmRlZiBGVU5DVElPTl9GREtfZ2V0VmFsaWRCaXRzCitVSU5UIEZES19nZXRWYWxpZEJpdHMoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikgeyByZXR1cm4gaEJpdEJ1Zi0+VmFsaWRCaXRzOyB9CisjZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9GREtfZ2V0VmFsaWRCaXRzICovCisKK0lOVCBGREtfZ2V0RnJlZUJpdHMoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikgeworICByZXR1cm4gKGhCaXRCdWYtPmJ1ZkJpdHMgLSBoQml0QnVmLT5WYWxpZEJpdHMpOwogfQogCit2b2lkIEZES19GZWVkKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIGNvbnN0IFVDSEFSICpSRVNUUklDVCBpbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgY29uc3QgVUlOVCBidWZmZXJTaXplLCBVSU5UICpieXRlc1ZhbGlkKSB7CisgIGlucHV0QnVmZmVyID0gJmlucHV0QnVmZmVyW2J1ZmZlclNpemUgLSAqYnl0ZXNWYWxpZF07CiAKLXZvaWQgRkRLX2J5dGVBbGlnbiAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgVUNIQVIgY29uZmlnKQotewotICBJTlQgYWxpZ25tZW50ID0gaEJpdEJ1Zi0+Qml0Q250ICYgMHgwNyA7CisgIFVJTlQgYlRvdGFsID0gMDsKIAotICBpZiAoYWxpZ25tZW50KQotICB7Ci0gICAgaWYgKGNvbmZpZz09MCkKLSAgICAgIEZES19wdXNoRm9yd2FyZCAoaEJpdEJ1ZiwgOCAtIGFsaWdubWVudCwgY29uZmlnKSA7IC8qIEJTX1JFQURFUiAqLwotICAgIGVsc2UKLSAgICAgIEZES19wdXQgKGhCaXRCdWYsMCAsIDggLSBhbGlnbm1lbnQpIDsgICAgICAgICAgICAgIC8qIEJTX1dSSVRFUiAqLwotICB9CisgIFVJTlQgYlRvUmVhZCA9IChoQml0QnVmLT5idWZCaXRzIC0gaEJpdEJ1Zi0+VmFsaWRCaXRzKSA+PiAzOworICBVSU5UIG5vT2ZCeXRlcyA9CisgICAgICBmTWluKGJUb1JlYWQsCisgICAgICAgICAgICpieXRlc1ZhbGlkKTsgIC8vKGJUb1JlYWQgPCAqYnl0ZXNWYWxpZCkgPyBiVG9SZWFkIDogKmJ5dGVzVmFsaWQgOwogCi0gIGhCaXRCdWYtPkJpdENudCA9IDAgOwotfQotCi1VSU5UIEZES19nZXRWYWxpZEJpdHMgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYpCi17Ci0gICAgcmV0dXJuIGhCaXRCdWYtPlZhbGlkQml0czsKLX0KLQotSU5UIEZES19nZXRGcmVlQml0cyAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikKLXsKLSAgICByZXR1cm4gKGhCaXRCdWYtPmJ1ZkJpdHMgLSBoQml0QnVmLT5WYWxpZEJpdHMpIDsKLX0KLQotdm9pZCBGREtfc2V0Qml0Q250IChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIHZhbHVlKQotewotICBoQml0QnVmLT5CaXRDbnQgPSB2YWx1ZSA7Ci19Ci0KLUlOVCBGREtfZ2V0Qml0Q250IChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmKQotewotICByZXR1cm4gaEJpdEJ1Zi0+Qml0Q250IDsKLX0KLQotdm9pZCBGREtfRmVlZChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLAotICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICpSRVNUUklDVCBpbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAqYnl0ZXNWYWxpZCkKLXsKLSAgaW5wdXRCdWZmZXIgPSAmaW5wdXRCdWZmZXIgW2J1ZmZlclNpemUgLSAqYnl0ZXNWYWxpZF0gOwotCi0gIFVJTlQgYlRvdGFsID0gMCA7Ci0KLSAgVUlOVCBiVG9SZWFkICAgPSAoaEJpdEJ1Zi0+YnVmQml0cyAtIGhCaXRCdWYtPlZhbGlkQml0cykgPj4gMyA7Ci0gIFVJTlQgbm9PZkJ5dGVzID0gZk1pbihiVG9SZWFkLCAqYnl0ZXNWYWxpZCk7IC8vKGJUb1JlYWQgPCAqYnl0ZXNWYWxpZCkgPyBiVG9SZWFkIDogKmJ5dGVzVmFsaWQgOwotCi0gIHdoaWxlIChub09mQnl0ZXMgPiAwKQotICB7CisgIHdoaWxlIChub09mQnl0ZXMgPiAwKSB7CiAgICAgLyogc3BsaXQgcmVhZCB0byBidWZmZXIgc2l6ZSAqLwotICAgIGJUb1JlYWQgPSBoQml0QnVmLT5idWZTaXplIC0gaEJpdEJ1Zi0+UmVhZE9mZnNldCA7Ci0gICAgYlRvUmVhZCA9IGZNaW4oYlRvUmVhZCwgbm9PZkJ5dGVzKTsgLy8oYlRvUmVhZCA8IG5vT2ZCeXRlcykgPyBiVG9SZWFkIDogbm9PZkJ5dGVzIDsKKyAgICBiVG9SZWFkID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIGhCaXRCdWYtPlJlYWRPZmZzZXQ7CisgICAgYlRvUmVhZCA9IGZNaW4oYlRvUmVhZCwKKyAgICAgICAgICAgICAgICAgICBub09mQnl0ZXMpOyAgLy8oYlRvUmVhZCA8IG5vT2ZCeXRlcykgPyBiVG9SZWFkIDogbm9PZkJ5dGVzIDsKIAogICAgIC8qIGNvcHkgJ2JUb1JlYWQnIGJ5dGVzIGZyb20gJ3B0cicgdG8gaW5wdXRidWZmZXIgKi8KLSAgICBGREttZW1jcHkoJmhCaXRCdWYtPkJ1ZmZlcltoQml0QnVmLT5SZWFkT2Zmc2V0XSwgaW5wdXRCdWZmZXIsIGJUb1JlYWQqc2l6ZW9mKFVDSEFSKSk7CisgICAgRkRLbWVtY3B5KCZoQml0QnVmLT5CdWZmZXJbaEJpdEJ1Zi0+UmVhZE9mZnNldF0sIGlucHV0QnVmZmVyLAorICAgICAgICAgICAgICBiVG9SZWFkICogc2l6ZW9mKFVDSEFSKSk7CiAKICAgICAvKiBhZGQgbm9PZkJpdHMgdG8gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYnVmZmVyICovCi0gICAgaEJpdEJ1Zi0+VmFsaWRCaXRzICArPSBiVG9SZWFkIDw8IDMgOwotICAgIGJUb3RhbCAgICAgICArPSBiVG9SZWFkIDsKLSAgICBpbnB1dEJ1ZmZlciAgKz0gYlRvUmVhZCA7CisgICAgaEJpdEJ1Zi0+VmFsaWRCaXRzICs9IGJUb1JlYWQgPDwgMzsKKyAgICBiVG90YWwgKz0gYlRvUmVhZDsKKyAgICBpbnB1dEJ1ZmZlciArPSBiVG9SZWFkOwogCi0gICAgaEJpdEJ1Zi0+UmVhZE9mZnNldCAgPSAoaEJpdEJ1Zi0+UmVhZE9mZnNldCArIGJUb1JlYWQpICYgKGhCaXRCdWYtPmJ1ZlNpemUgLSAxKSA7Ci0gICAgbm9PZkJ5dGVzICAgIC09IGJUb1JlYWQgOworICAgIGhCaXRCdWYtPlJlYWRPZmZzZXQgPQorICAgICAgICAoaEJpdEJ1Zi0+UmVhZE9mZnNldCArIGJUb1JlYWQpICYgKGhCaXRCdWYtPmJ1ZlNpemUgLSAxKTsKKyAgICBub09mQnl0ZXMgLT0gYlRvUmVhZDsKICAgfQogCi0gICpieXRlc1ZhbGlkIC09IGJUb3RhbCA7CisgICpieXRlc1ZhbGlkIC09IGJUb3RhbDsKIH0KIAotdm9pZCBDb3B5QWxpZ25lZEJsb2NrIChIQU5ETEVfRkRLX0JJVEJVRiBoX0JpdEJ1ZlNyYywgVUNIQVIgKlJFU1RSSUNUIGRzdEJ1ZmZlciwgVUlOVCBiVG9SZWFkKQotewotICBVSU5UIGJ5dGVPZmZzZXQgPSBoX0JpdEJ1ZlNyYy0+Qml0TmR4ID4+IDMgOwotICBjb25zdCBVSU5UIGJ5dGVNYXNrID0gaF9CaXRCdWZTcmMtPmJ1ZlNpemUgLSAxIDsKK3ZvaWQgQ29weUFsaWduZWRCbG9jayhIQU5ETEVfRkRLX0JJVEJVRiBoX0JpdEJ1ZlNyYywgVUNIQVIgKlJFU1RSSUNUIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICBVSU5UIGJUb1JlYWQpIHsKKyAgVUlOVCBieXRlT2Zmc2V0ID0gaF9CaXRCdWZTcmMtPkJpdE5keCA+PiAzOworICBjb25zdCBVSU5UIGJ5dGVNYXNrID0gaF9CaXRCdWZTcmMtPmJ1ZlNpemUgLSAxOwogCiAgIFVDSEFSICpSRVNUUklDVCBwQkJCID0gaF9CaXRCdWZTcmMtPkJ1ZmZlcjsKLSAgZm9yIChVSU5UIGkgPSAwIDsgaSA8IGJUb1JlYWQgOyBpKyspCi0gIHsKLSAgICBkc3RCdWZmZXJbaV0gPSBwQkJCWyhieXRlT2Zmc2V0K2kpICYgYnl0ZU1hc2tdIDsKKyAgZm9yIChVSU5UIGkgPSAwOyBpIDwgYlRvUmVhZDsgaSsrKSB7CisgICAgZHN0QnVmZmVyW2ldID0gcEJCQlsoYnl0ZU9mZnNldCArIGkpICYgYnl0ZU1hc2tdOwogICB9CiAKLSAgYlRvUmVhZCA8PD0gMyA7CisgIGJUb1JlYWQgPDw9IDM7CiAKLSAgaF9CaXRCdWZTcmMtPkJpdE5keCA9IChoX0JpdEJ1ZlNyYy0+Qml0TmR4ICsgYlRvUmVhZCkgJiAoaF9CaXRCdWZTcmMtPmJ1ZkJpdHMgLSAxKSA7Ci0gIGhfQml0QnVmU3JjLT5CaXRDbnQgKz0gYlRvUmVhZCA7Ci0gIGhfQml0QnVmU3JjLT5WYWxpZEJpdHMgLT0gYlRvUmVhZCA7CisgIGhfQml0QnVmU3JjLT5CaXROZHggPQorICAgICAgKGhfQml0QnVmU3JjLT5CaXROZHggKyBiVG9SZWFkKSAmIChoX0JpdEJ1ZlNyYy0+YnVmQml0cyAtIDEpOworICBoX0JpdEJ1ZlNyYy0+VmFsaWRCaXRzIC09IGJUb1JlYWQ7CiB9CiAKLXZvaWQgRkRLX0NvcHkgKEhBTkRMRV9GREtfQklUQlVGIGhfQml0QnVmRHN0LCBIQU5ETEVfRkRLX0JJVEJVRiBoX0JpdEJ1ZlNyYywgVUlOVCAqYnl0ZXNWYWxpZCkKLXsKK3ZvaWQgRkRLX0NvcHkoSEFORExFX0ZES19CSVRCVUYgaF9CaXRCdWZEc3QsIEhBTkRMRV9GREtfQklUQlVGIGhfQml0QnVmU3JjLAorICAgICAgICAgICAgICBVSU5UICpieXRlc1ZhbGlkKSB7CiAgIElOVCBiVG90YWwgPSAwOwogCi0gIC8qIGxpbWl0IG5vT2ZCeXRlcyB0byB2YWxpZCBieXRlcyBpbiBzcmMgYnVmZmVyIGFuZCBhdmFpbGFibGUgYnl0ZXMgaW4gZHN0IGJ1ZmZlciAqLwotICBVSU5UIGJUb1JlYWQgICA9IGhfQml0QnVmU3JjLT5WYWxpZEJpdHMgPj4gMyA7Ci0gIFVJTlQgbm9PZkJ5dGVzID0gZk1pbihiVG9SZWFkLCAqYnl0ZXNWYWxpZCk7IC8vKCpieXRlc1ZhbGlkIDwgYlRvUmVhZCkgPyAqYnl0ZXNWYWxpZCA6IGJUb1JlYWQgOwotICBiVG9SZWFkICAgPSBGREtfZ2V0RnJlZUJpdHMoaF9CaXRCdWZEc3QpOwotICBub09mQnl0ZXMgPSBmTWluKGJUb1JlYWQsIG5vT2ZCeXRlcyk7IC8vKGJUb1JlYWQgPCBub09mQnl0ZXMpID8gYlRvUmVhZCA6IG5vT2ZCeXRlczsKKyAgLyogbGltaXQgbm9PZkJ5dGVzIHRvIHZhbGlkIGJ5dGVzIGluIHNyYyBidWZmZXIgYW5kIGF2YWlsYWJsZSBieXRlcyBpbiBkc3QKKyAgICogYnVmZmVyICovCisgIFVJTlQgYlRvUmVhZCA9IGhfQml0QnVmU3JjLT5WYWxpZEJpdHMgPj4gMzsKKyAgVUlOVCBub09mQnl0ZXMgPQorICAgICAgZk1pbihiVG9SZWFkLAorICAgICAgICAgICAqYnl0ZXNWYWxpZCk7ICAvLygqYnl0ZXNWYWxpZCA8IGJUb1JlYWQpID8gKmJ5dGVzVmFsaWQgOiBiVG9SZWFkIDsKKyAgYlRvUmVhZCA9IEZES19nZXRGcmVlQml0cyhoX0JpdEJ1ZkRzdCk7CisgIG5vT2ZCeXRlcyA9CisgICAgICBmTWluKGJUb1JlYWQsIG5vT2ZCeXRlcyk7ICAvLyhiVG9SZWFkIDwgbm9PZkJ5dGVzKSA/IGJUb1JlYWQgOiBub09mQnl0ZXM7CiAKLSAgd2hpbGUgKG5vT2ZCeXRlcyA+IDApCi0gIHsKKyAgd2hpbGUgKG5vT2ZCeXRlcyA+IDApIHsKICAgICAvKiBTcGxpdCBSZWFkIHRvIGJ1ZmZlciBzaXplICovCi0gICAgYlRvUmVhZCA9IGhfQml0QnVmRHN0LT5idWZTaXplIC0gaF9CaXRCdWZEc3QtPlJlYWRPZmZzZXQgOwotICAgIGJUb1JlYWQgPSBmTWluKG5vT2ZCeXRlcywgYlRvUmVhZCk7IC8vKG5vT2ZCeXRlcyA8IGJUb1JlYWQpID8gbm9PZkJ5dGVzIDogYlRvUmVhZCA7CisgICAgYlRvUmVhZCA9IGhfQml0QnVmRHN0LT5idWZTaXplIC0gaF9CaXRCdWZEc3QtPlJlYWRPZmZzZXQ7CisgICAgYlRvUmVhZCA9IGZNaW4obm9PZkJ5dGVzLAorICAgICAgICAgICAgICAgICAgIGJUb1JlYWQpOyAgLy8obm9PZkJ5dGVzIDwgYlRvUmVhZCkgPyBub09mQnl0ZXMgOiBiVG9SZWFkIDsKIAogICAgIC8qIGNvcHkgJ2JUb1JlYWQnIGJ5dGVzIGZyb20gYnVmZmVyIHRvIGJ1ZmZlciAqLwogICAgIGlmICghKGhfQml0QnVmU3JjLT5CaXROZHggJiAweDA3KSkgewotICAgICAgQ29weUFsaWduZWRCbG9jayAoaF9CaXRCdWZTcmMsIGhfQml0QnVmRHN0LT5CdWZmZXIgKyBoX0JpdEJ1ZkRzdC0+UmVhZE9mZnNldCwgYlRvUmVhZCkgOworICAgICAgQ29weUFsaWduZWRCbG9jayhoX0JpdEJ1ZlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgaF9CaXRCdWZEc3QtPkJ1ZmZlciArIGhfQml0QnVmRHN0LT5SZWFkT2Zmc2V0LCBiVG9SZWFkKTsKICAgICB9IGVsc2UgewotICAgICAgZm9yIChVSU5UIGkgPSAwOyBpIDwgYlRvUmVhZDsgaSsrKQotICAgICAgewotICAgICAgICBoX0JpdEJ1ZkRzdC0+QnVmZmVyIFtoX0JpdEJ1ZkRzdC0+UmVhZE9mZnNldCArIGldID0gKFVDSEFSKUZES19nZXQoaF9CaXRCdWZTcmMsOCk7CisgICAgICBmb3IgKFVJTlQgaSA9IDA7IGkgPCBiVG9SZWFkOyBpKyspIHsKKyAgICAgICAgaF9CaXRCdWZEc3QtPkJ1ZmZlcltoX0JpdEJ1ZkRzdC0+UmVhZE9mZnNldCArIGldID0KKyAgICAgICAgICAgIChVQ0hBUilGREtfZ2V0KGhfQml0QnVmU3JjLCA4KTsKICAgICAgIH0KICAgICB9CiAKICAgICAvKiBhZGQgbm9PZkJpdHMgdG8gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYnVmZmVyICovCi0gICAgaF9CaXRCdWZEc3QtPlZhbGlkQml0cyAgKz0gYlRvUmVhZCA8PCAzIDsKLSAgICBiVG90YWwgICAgICAgKz0gYlRvUmVhZDsKKyAgICBoX0JpdEJ1ZkRzdC0+VmFsaWRCaXRzICs9IGJUb1JlYWQgPDwgMzsKKyAgICBiVG90YWwgKz0gYlRvUmVhZDsKIAotICAgIGhfQml0QnVmRHN0LT5SZWFkT2Zmc2V0ICA9IChoX0JpdEJ1ZkRzdC0+UmVhZE9mZnNldCArIGJUb1JlYWQpICYgKGhfQml0QnVmRHN0LT5idWZTaXplLTEpOwotICAgIG5vT2ZCeXRlcyAgICAtPSBiVG9SZWFkOworICAgIGhfQml0QnVmRHN0LT5SZWFkT2Zmc2V0ID0KKyAgICAgICAgKGhfQml0QnVmRHN0LT5SZWFkT2Zmc2V0ICsgYlRvUmVhZCkgJiAoaF9CaXRCdWZEc3QtPmJ1ZlNpemUgLSAxKTsKKyAgICBub09mQnl0ZXMgLT0gYlRvUmVhZDsKICAgfQogCi0gICpieXRlc1ZhbGlkIC09YlRvdGFsOworICAqYnl0ZXNWYWxpZCAtPSBiVG90YWw7CiB9CiAKLXZvaWQgRkRLX0ZldGNoIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVQ0hBUiAqb3V0QnVmLCBVSU5UICp3cml0ZUJ5dGVzKQotewordm9pZCBGREtfRmV0Y2goSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgVUNIQVIgKm91dEJ1ZiwgVUlOVCAqd3JpdGVCeXRlcykgewogICBVQ0hBUiAqUkVTVFJJQ1Qgb3V0cHV0QnVmZmVyID0gb3V0QnVmOwotICBVSU5UIGJUb3RhbCA9IDAgOworICBVSU5UIGJUb3RhbCA9IDA7CiAKLSAgVUlOVCBiVG9Xcml0ZSAgPSAoaEJpdEJ1Zi0+VmFsaWRCaXRzKSA+PiAzIDsKLSAgVUlOVCBub09mQnl0ZXMgPSBmTWluKGJUb1dyaXRlLCAqd3JpdGVCeXRlcyk7IC8vKGJUb1dyaXRlIDwgKndyaXRlQnl0ZXMpID8gYlRvV3JpdGUgOiAqd3JpdGVCeXRlcyA7CisgIFVJTlQgYlRvV3JpdGUgPSAoaEJpdEJ1Zi0+VmFsaWRCaXRzKSA+PiAzOworICBVSU5UIG5vT2ZCeXRlcyA9CisgICAgICBmTWluKGJUb1dyaXRlLAorICAgICAgICAgICAqd3JpdGVCeXRlcyk7ICAvLyhiVG9Xcml0ZSA8ICp3cml0ZUJ5dGVzKSA/IGJUb1dyaXRlIDogKndyaXRlQnl0ZXMgOwogCi0gIHdoaWxlIChub09mQnl0ZXMgPiAwKQotICB7CisgIHdoaWxlIChub09mQnl0ZXMgPiAwKSB7CiAgICAgLyogc3BsaXQgd3JpdGUgdG8gYnVmZmVyIHNpemUgKi8KLSAgICBiVG9Xcml0ZSA9IGhCaXRCdWYtPmJ1ZlNpemUgLSBoQml0QnVmLT5Xcml0ZU9mZnNldCA7Ci0gICAgYlRvV3JpdGUgPSBmTWluKGJUb1dyaXRlLCBub09mQnl0ZXMpOyAvLyhiVG9Xcml0ZSA8IG5vT2ZCeXRlcykgPyBiVG9Xcml0ZSA6IG5vT2ZCeXRlcyA7CisgICAgYlRvV3JpdGUgPSBoQml0QnVmLT5idWZTaXplIC0gaEJpdEJ1Zi0+V3JpdGVPZmZzZXQ7CisgICAgYlRvV3JpdGUgPSBmTWluKAorICAgICAgICBiVG9Xcml0ZSwgbm9PZkJ5dGVzKTsgIC8vKGJUb1dyaXRlIDwgbm9PZkJ5dGVzKSA/IGJUb1dyaXRlIDogbm9PZkJ5dGVzIDsKIAogICAgIC8qIGNvcHkgJ2JUb1dyaXRlJyBieXRlcyBmcm9tIGJpdGJ1ZmZlciB0byBvdXRwdXRidWZmZXIgKi8KLSAgICBGREttZW1jcHkob3V0cHV0QnVmZmVyLCAmaEJpdEJ1Zi0+QnVmZmVyW2hCaXRCdWYtPldyaXRlT2Zmc2V0XSwgYlRvV3JpdGUqc2l6ZW9mKFVDSEFSKSk7CisgICAgRkRLbWVtY3B5KG91dHB1dEJ1ZmZlciwgJmhCaXRCdWYtPkJ1ZmZlcltoQml0QnVmLT5Xcml0ZU9mZnNldF0sCisgICAgICAgICAgICAgIGJUb1dyaXRlICogc2l6ZW9mKFVDSEFSKSk7CiAKICAgICAvKiBzdWIgbm9PZkJpdHMgZnJvbSBudW1iZXIgb2YgdmFsaWQgYml0cyBpbiBidWZmZXIgKi8KLSAgICBoQml0QnVmLT5WYWxpZEJpdHMgIC09IGJUb1dyaXRlIDw8IDMgOwotICAgIGJUb3RhbCAgICAgICArPSBiVG9Xcml0ZSA7Ci0gICAgb3V0cHV0QnVmZmVyICs9IGJUb1dyaXRlIDsKKyAgICBoQml0QnVmLT5WYWxpZEJpdHMgLT0gYlRvV3JpdGUgPDwgMzsKKyAgICBiVG90YWwgKz0gYlRvV3JpdGU7CisgICAgb3V0cHV0QnVmZmVyICs9IGJUb1dyaXRlOwogCi0gICAgaEJpdEJ1Zi0+V3JpdGVPZmZzZXQgID0gKGhCaXRCdWYtPldyaXRlT2Zmc2V0ICsgYlRvV3JpdGUpICYgKGhCaXRCdWYtPmJ1ZlNpemUgLSAxKSA7Ci0gICAgbm9PZkJ5dGVzICAgIC09IGJUb1dyaXRlIDsKKyAgICBoQml0QnVmLT5Xcml0ZU9mZnNldCA9CisgICAgICAgIChoQml0QnVmLT5Xcml0ZU9mZnNldCArIGJUb1dyaXRlKSAmIChoQml0QnVmLT5idWZTaXplIC0gMSk7CisgICAgbm9PZkJ5dGVzIC09IGJUb1dyaXRlOwogICB9CiAKLSAgKndyaXRlQnl0ZXMgPSBiVG90YWwgOworICAqd3JpdGVCeXRlcyA9IGJUb3RhbDsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9GREtfY29yZS5jcHAgYi9saWJGREsvc3JjL0ZES19jb3JlLmNwcAppbmRleCAxZDhhYzdiLi43NWVhOGEyIDEwMDY0NAotLS0gYS9saWJGREsvc3JjL0ZES19jb3JlLmNwcAorKysgYi9saWJGREsvc3JjL0ZES19jb3JlLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyMSArOTAsMjIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorCiAgICBEZXNjcmlwdGlvbjogRkRLIHRvb2xzIHZlcnNpb25pbmcgc3VwcG9ydAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiRkRLX2NvcmUuaCIKIAogLyogRkRLIHRvb2xzIGxpYnJhcnkgaW5mbyAqLwotI2RlZmluZSBGREtfVE9PTFNfTElCX1ZMMCAyCi0jZGVmaW5lIEZES19UT09MU19MSUJfVkwxIDMKLSNkZWZpbmUgRkRLX1RPT0xTX0xJQl9WTDIgNgorI2RlZmluZSBGREtfVE9PTFNfTElCX1ZMMCAzCisjZGVmaW5lIEZES19UT09MU19MSUJfVkwxIDAKKyNkZWZpbmUgRkRLX1RPT0xTX0xJQl9WTDIgMAogI2RlZmluZSBGREtfVE9PTFNfTElCX1RJVExFICJGREsgVG9vbHMiCiAjaWZkZWYgX19BTkRST0lEX18KICNkZWZpbmUgRkRLX1RPT0xTX0xJQl9CVUlMRF9EQVRFICIiCkBAIC0xMDMsOCArMTE1LDcgQEAKICNkZWZpbmUgRkRLX1RPT0xTX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCiAjZW5kaWYKIAotaW50IEZES190b29sc0dldExpYkluZm8oTElCX0lORk8gKmluZm8pCi17CitpbnQgRkRLX3Rvb2xzR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykgewogICBVSU5UIHY7CiAgIGludCBpOwogCkBAIC0xMTQsMjAgKzEyNSwyMSBAQAogCiAgIC8qIHNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLwogICBpID0gRkRLbGliSW5mb19sb29rdXAoaW5mbywgRkRLX1RPT0xTKTsKLSAgaWYgKGk8MCkgcmV0dXJuIC0xOworICBpZiAoaSA8IDApIHJldHVybiAtMTsKIAogICBpbmZvICs9IGk7CiAKICAgdiA9IExJQl9WRVJTSU9OKEZES19UT09MU19MSUJfVkwwLCBGREtfVE9PTFNfTElCX1ZMMSwgRkRLX1RPT0xTX0xJQl9WTDIpOwogCi0gIEZES3NwcmludGYoaW5mby0+dmVyc2lvblN0ciwgIiVkLiVkLiVkIiwgKCh2ID4+IDI0KSAmIDB4ZmYpLCAoKHYgPj4gMTYpICYgMHhmZiksICgodiA+PiA4ICkgJiAweGZmKSk7CisgIEZES3NwcmludGYoaW5mby0+dmVyc2lvblN0ciwgIiVkLiVkLiVkIiwgKCh2ID4+IDI0KSAmIDB4ZmYpLAorICAgICAgICAgICAgICgodiA+PiAxNikgJiAweGZmKSwgKCh2ID4+IDgpICYgMHhmZikpOwogCiAgIGluZm8tPm1vZHVsZV9pZCA9IEZES19UT09MUzsKICAgaW5mby0+dmVyc2lvbiA9IHY7Ci0gIGluZm8tPmJ1aWxkX2RhdGUgPSAoY2hhciAqKUZES19UT09MU19MSUJfQlVJTERfREFURTsKLSAgaW5mby0+YnVpbGRfdGltZSA9IChjaGFyICopRkRLX1RPT0xTX0xJQl9CVUlMRF9USU1FOwotICBpbmZvLT50aXRsZSAgICAgID0gKGNoYXIgKilGREtfVE9PTFNfTElCX1RJVExFOwotICBpbmZvLT5mbGFncyA9IDA7CisgIGluZm8tPmJ1aWxkX2RhdGUgPSBGREtfVE9PTFNfTElCX0JVSUxEX0RBVEU7CisgIGluZm8tPmJ1aWxkX3RpbWUgPSBGREtfVE9PTFNfTElCX0JVSUxEX1RJTUU7CisgIGluZm8tPnRpdGxlID0gRkRLX1RPT0xTX0xJQl9USVRMRTsKKyAgaW5mby0+ZmxhZ3MgPSAxOwogCiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9GREtfY3JjLmNwcCBiL2xpYkZESy9zcmMvRkRLX2NyYy5jcHAKaW5kZXggMTdkNDdhZC4uZTIwODMzOCAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9GREtfY3JjLmNwcAorKysgYi9saWJGREsvc3JjL0ZES19jcmMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0OSArOTAsMTY0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6Ci0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogQ1JDIGNhbGN1bGF0aW9uCisgICBBdXRob3Iocyk6CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBDUkMgY2FsY3VsYXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgIkZES19jcmMuaCIKIAotCi0KIC8qLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKioKLSAqIFxicmllZiAgVGhpcyB0YWJsZSBkZWZpbmVzIHByZWNhbGN1bGF0ZWQgbG9va3VwIHRhYmxlcyBmb3IgY3JjIHBvbHlub20gIHheMTYgKyB4XjE1ICsgeF4yICsgeF4wLgorICogXGJyaWVmICBUaGlzIHRhYmxlIGRlZmluZXMgcHJlY2FsY3VsYXRlZCBsb29rdXAgdGFibGVzIGZvciBjcmMgcG9seW5vbSAgeF4xNgorICogKyB4XjE1ICsgeF4yICsgeF4wLgogICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIGNyY0xvb2t1cF8xNl8xNV8yXzBbMjU2XSA9Ci17Ci0gIDB4MDAwMCwgMHg4MDA1LCAweDgwMGYsIDB4MDAwYSwgMHg4MDFiLCAweDAwMWUsIDB4MDAxNCwgMHg4MDExLAotICAweDgwMzMsIDB4MDAzNiwgMHgwMDNjLCAweDgwMzksIDB4MDAyOCwgMHg4MDJkLCAweDgwMjcsIDB4MDAyMiwKLSAgMHg4MDYzLCAweDAwNjYsIDB4MDA2YywgMHg4MDY5LCAweDAwNzgsIDB4ODA3ZCwgMHg4MDc3LCAweDAwNzIsCi0gIDB4MDA1MCwgMHg4MDU1LCAweDgwNWYsIDB4MDA1YSwgMHg4MDRiLCAweDAwNGUsIDB4MDA0NCwgMHg4MDQxLAotICAweDgwYzMsIDB4MDBjNiwgMHgwMGNjLCAweDgwYzksIDB4MDBkOCwgMHg4MGRkLCAweDgwZDcsIDB4MDBkMiwKLSAgMHgwMGYwLCAweDgwZjUsIDB4ODBmZiwgMHgwMGZhLCAweDgwZWIsIDB4MDBlZSwgMHgwMGU0LCAweDgwZTEsCi0gIDB4MDBhMCwgMHg4MGE1LCAweDgwYWYsIDB4MDBhYSwgMHg4MGJiLCAweDAwYmUsIDB4MDBiNCwgMHg4MGIxLAotICAweDgwOTMsIDB4MDA5NiwgMHgwMDljLCAweDgwOTksIDB4MDA4OCwgMHg4MDhkLCAweDgwODcsIDB4MDA4MiwKLSAgMHg4MTgzLCAweDAxODYsIDB4MDE4YywgMHg4MTg5LCAweDAxOTgsIDB4ODE5ZCwgMHg4MTk3LCAweDAxOTIsCi0gIDB4MDFiMCwgMHg4MWI1LCAweDgxYmYsIDB4MDFiYSwgMHg4MWFiLCAweDAxYWUsIDB4MDFhNCwgMHg4MWExLAotICAweDAxZTAsIDB4ODFlNSwgMHg4MWVmLCAweDAxZWEsIDB4ODFmYiwgMHgwMWZlLCAweDAxZjQsIDB4ODFmMSwKLSAgMHg4MWQzLCAweDAxZDYsIDB4MDFkYywgMHg4MWQ5LCAweDAxYzgsIDB4ODFjZCwgMHg4MWM3LCAweDAxYzIsCi0gIDB4MDE0MCwgMHg4MTQ1LCAweDgxNGYsIDB4MDE0YSwgMHg4MTViLCAweDAxNWUsIDB4MDE1NCwgMHg4MTUxLAotICAweDgxNzMsIDB4MDE3NiwgMHgwMTdjLCAweDgxNzksIDB4MDE2OCwgMHg4MTZkLCAweDgxNjcsIDB4MDE2MiwKLSAgMHg4MTIzLCAweDAxMjYsIDB4MDEyYywgMHg4MTI5LCAweDAxMzgsIDB4ODEzZCwgMHg4MTM3LCAweDAxMzIsCi0gIDB4MDExMCwgMHg4MTE1LCAweDgxMWYsIDB4MDExYSwgMHg4MTBiLCAweDAxMGUsIDB4MDEwNCwgMHg4MTAxLAotICAweDgzMDMsIDB4MDMwNiwgMHgwMzBjLCAweDgzMDksIDB4MDMxOCwgMHg4MzFkLCAweDgzMTcsIDB4MDMxMiwKLSAgMHgwMzMwLCAweDgzMzUsIDB4ODMzZiwgMHgwMzNhLCAweDgzMmIsIDB4MDMyZSwgMHgwMzI0LCAweDgzMjEsCi0gIDB4MDM2MCwgMHg4MzY1LCAweDgzNmYsIDB4MDM2YSwgMHg4MzdiLCAweDAzN2UsIDB4MDM3NCwgMHg4MzcxLAotICAweDgzNTMsIDB4MDM1NiwgMHgwMzVjLCAweDgzNTksIDB4MDM0OCwgMHg4MzRkLCAweDgzNDcsIDB4MDM0MiwKLSAgMHgwM2MwLCAweDgzYzUsIDB4ODNjZiwgMHgwM2NhLCAweDgzZGIsIDB4MDNkZSwgMHgwM2Q0LCAweDgzZDEsCi0gIDB4ODNmMywgMHgwM2Y2LCAweDAzZmMsIDB4ODNmOSwgMHgwM2U4LCAweDgzZWQsIDB4ODNlNywgMHgwM2UyLAotICAweDgzYTMsIDB4MDNhNiwgMHgwM2FjLCAweDgzYTksIDB4MDNiOCwgMHg4M2JkLCAweDgzYjcsIDB4MDNiMiwKLSAgMHgwMzkwLCAweDgzOTUsIDB4ODM5ZiwgMHgwMzlhLCAweDgzOGIsIDB4MDM4ZSwgMHgwMzg0LCAweDgzODEsCi0gIDB4MDI4MCwgMHg4Mjg1LCAweDgyOGYsIDB4MDI4YSwgMHg4MjliLCAweDAyOWUsIDB4MDI5NCwgMHg4MjkxLAotICAweDgyYjMsIDB4MDJiNiwgMHgwMmJjLCAweDgyYjksIDB4MDJhOCwgMHg4MmFkLCAweDgyYTcsIDB4MDJhMiwKLSAgMHg4MmUzLCAweDAyZTYsIDB4MDJlYywgMHg4MmU5LCAweDAyZjgsIDB4ODJmZCwgMHg4MmY3LCAweDAyZjIsCi0gIDB4MDJkMCwgMHg4MmQ1LCAweDgyZGYsIDB4MDJkYSwgMHg4MmNiLCAweDAyY2UsIDB4MDJjNCwgMHg4MmMxLAotICAweDgyNDMsIDB4MDI0NiwgMHgwMjRjLCAweDgyNDksIDB4MDI1OCwgMHg4MjVkLCAweDgyNTcsIDB4MDI1MiwKLSAgMHgwMjcwLCAweDgyNzUsIDB4ODI3ZiwgMHgwMjdhLCAweDgyNmIsIDB4MDI2ZSwgMHgwMjY0LCAweDgyNjEsCi0gIDB4MDIyMCwgMHg4MjI1LCAweDgyMmYsIDB4MDIyYSwgMHg4MjNiLCAweDAyM2UsIDB4MDIzNCwgMHg4MjMxLAotICAweDgyMTMsIDB4MDIxNiwgMHgwMjFjLCAweDgyMTksIDB4MDIwOCwgMHg4MjBkLCAweDgyMDcsIDB4MDIwMgotfTsKK3N0YXRpYyBjb25zdCBVU0hPUlQgY3JjTG9va3VwXzE2XzE1XzJfMFsyNTZdID0geworICAgIDB4MDAwMCwgMHg4MDA1LCAweDgwMGYsIDB4MDAwYSwgMHg4MDFiLCAweDAwMWUsIDB4MDAxNCwgMHg4MDExLCAweDgwMzMsCisgICAgMHgwMDM2LCAweDAwM2MsIDB4ODAzOSwgMHgwMDI4LCAweDgwMmQsIDB4ODAyNywgMHgwMDIyLCAweDgwNjMsIDB4MDA2NiwKKyAgICAweDAwNmMsIDB4ODA2OSwgMHgwMDc4LCAweDgwN2QsIDB4ODA3NywgMHgwMDcyLCAweDAwNTAsIDB4ODA1NSwgMHg4MDVmLAorICAgIDB4MDA1YSwgMHg4MDRiLCAweDAwNGUsIDB4MDA0NCwgMHg4MDQxLCAweDgwYzMsIDB4MDBjNiwgMHgwMGNjLCAweDgwYzksCisgICAgMHgwMGQ4LCAweDgwZGQsIDB4ODBkNywgMHgwMGQyLCAweDAwZjAsIDB4ODBmNSwgMHg4MGZmLCAweDAwZmEsIDB4ODBlYiwKKyAgICAweDAwZWUsIDB4MDBlNCwgMHg4MGUxLCAweDAwYTAsIDB4ODBhNSwgMHg4MGFmLCAweDAwYWEsIDB4ODBiYiwgMHgwMGJlLAorICAgIDB4MDBiNCwgMHg4MGIxLCAweDgwOTMsIDB4MDA5NiwgMHgwMDljLCAweDgwOTksIDB4MDA4OCwgMHg4MDhkLCAweDgwODcsCisgICAgMHgwMDgyLCAweDgxODMsIDB4MDE4NiwgMHgwMThjLCAweDgxODksIDB4MDE5OCwgMHg4MTlkLCAweDgxOTcsIDB4MDE5MiwKKyAgICAweDAxYjAsIDB4ODFiNSwgMHg4MWJmLCAweDAxYmEsIDB4ODFhYiwgMHgwMWFlLCAweDAxYTQsIDB4ODFhMSwgMHgwMWUwLAorICAgIDB4ODFlNSwgMHg4MWVmLCAweDAxZWEsIDB4ODFmYiwgMHgwMWZlLCAweDAxZjQsIDB4ODFmMSwgMHg4MWQzLCAweDAxZDYsCisgICAgMHgwMWRjLCAweDgxZDksIDB4MDFjOCwgMHg4MWNkLCAweDgxYzcsIDB4MDFjMiwgMHgwMTQwLCAweDgxNDUsIDB4ODE0ZiwKKyAgICAweDAxNGEsIDB4ODE1YiwgMHgwMTVlLCAweDAxNTQsIDB4ODE1MSwgMHg4MTczLCAweDAxNzYsIDB4MDE3YywgMHg4MTc5LAorICAgIDB4MDE2OCwgMHg4MTZkLCAweDgxNjcsIDB4MDE2MiwgMHg4MTIzLCAweDAxMjYsIDB4MDEyYywgMHg4MTI5LCAweDAxMzgsCisgICAgMHg4MTNkLCAweDgxMzcsIDB4MDEzMiwgMHgwMTEwLCAweDgxMTUsIDB4ODExZiwgMHgwMTFhLCAweDgxMGIsIDB4MDEwZSwKKyAgICAweDAxMDQsIDB4ODEwMSwgMHg4MzAzLCAweDAzMDYsIDB4MDMwYywgMHg4MzA5LCAweDAzMTgsIDB4ODMxZCwgMHg4MzE3LAorICAgIDB4MDMxMiwgMHgwMzMwLCAweDgzMzUsIDB4ODMzZiwgMHgwMzNhLCAweDgzMmIsIDB4MDMyZSwgMHgwMzI0LCAweDgzMjEsCisgICAgMHgwMzYwLCAweDgzNjUsIDB4ODM2ZiwgMHgwMzZhLCAweDgzN2IsIDB4MDM3ZSwgMHgwMzc0LCAweDgzNzEsIDB4ODM1MywKKyAgICAweDAzNTYsIDB4MDM1YywgMHg4MzU5LCAweDAzNDgsIDB4ODM0ZCwgMHg4MzQ3LCAweDAzNDIsIDB4MDNjMCwgMHg4M2M1LAorICAgIDB4ODNjZiwgMHgwM2NhLCAweDgzZGIsIDB4MDNkZSwgMHgwM2Q0LCAweDgzZDEsIDB4ODNmMywgMHgwM2Y2LCAweDAzZmMsCisgICAgMHg4M2Y5LCAweDAzZTgsIDB4ODNlZCwgMHg4M2U3LCAweDAzZTIsIDB4ODNhMywgMHgwM2E2LCAweDAzYWMsIDB4ODNhOSwKKyAgICAweDAzYjgsIDB4ODNiZCwgMHg4M2I3LCAweDAzYjIsIDB4MDM5MCwgMHg4Mzk1LCAweDgzOWYsIDB4MDM5YSwgMHg4MzhiLAorICAgIDB4MDM4ZSwgMHgwMzg0LCAweDgzODEsIDB4MDI4MCwgMHg4Mjg1LCAweDgyOGYsIDB4MDI4YSwgMHg4MjliLCAweDAyOWUsCisgICAgMHgwMjk0LCAweDgyOTEsIDB4ODJiMywgMHgwMmI2LCAweDAyYmMsIDB4ODJiOSwgMHgwMmE4LCAweDgyYWQsIDB4ODJhNywKKyAgICAweDAyYTIsIDB4ODJlMywgMHgwMmU2LCAweDAyZWMsIDB4ODJlOSwgMHgwMmY4LCAweDgyZmQsIDB4ODJmNywgMHgwMmYyLAorICAgIDB4MDJkMCwgMHg4MmQ1LCAweDgyZGYsIDB4MDJkYSwgMHg4MmNiLCAweDAyY2UsIDB4MDJjNCwgMHg4MmMxLCAweDgyNDMsCisgICAgMHgwMjQ2LCAweDAyNGMsIDB4ODI0OSwgMHgwMjU4LCAweDgyNWQsIDB4ODI1NywgMHgwMjUyLCAweDAyNzAsIDB4ODI3NSwKKyAgICAweDgyN2YsIDB4MDI3YSwgMHg4MjZiLCAweDAyNmUsIDB4MDI2NCwgMHg4MjYxLCAweDAyMjAsIDB4ODIyNSwgMHg4MjJmLAorICAgIDB4MDIyYSwgMHg4MjNiLCAweDAyM2UsIDB4MDIzNCwgMHg4MjMxLCAweDgyMTMsIDB4MDIxNiwgMHgwMjFjLCAweDgyMTksCisgICAgMHgwMjA4LCAweDgyMGQsIDB4ODIwNywgMHgwMjAyfTsKIAogLyoqCi0gKiBcYnJpZWYgIFRoaXMgdGFibGUgZGVmaW5lcyBwcmVjYWxjdWxhdGVkIGxvb2t1cCB0YWJsZXMgZm9yIGNyYyBwb2x5bm9tICB4XjE2ICsgeF4xMiArIHheNSArIHheMC4KKyAqIFxicmllZiAgVGhpcyB0YWJsZSBkZWZpbmVzIHByZWNhbGN1bGF0ZWQgbG9va3VwIHRhYmxlcyBmb3IgY3JjIHBvbHlub20gIHheMTYKKyAqICsgeF4xMiArIHheNSArIHheMC4KICAqLwotc3RhdGljIGNvbnN0IFVTSE9SVCBjcmNMb29rdXBfMTZfMTJfNV8wWzI1Nl0gPQotewotICAweDAwMDAsIDB4MTAyMSwgMHgyMDQyLCAweDMwNjMsIDB4NDA4NCwgMHg1MGE1LCAweDYwYzYsIDB4NzBlNywKLSAgMHg4MTA4LCAweDkxMjksIDB4YTE0YSwgMHhiMTZiLCAweGMxOGMsIDB4ZDFhZCwgMHhlMWNlLCAweGYxZWYsCi0gIDB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MmI1LCAweDQyOTQsIDB4NzJmNywgMHg2MmQ2LAotICAweDkzMzksIDB4ODMxOCwgMHhiMzdiLCAweGEzNWEsIDB4ZDNiZCwgMHhjMzljLCAweGYzZmYsIDB4ZTNkZSwKLSAgMHgyNDYyLCAweDM0NDMsIDB4MDQyMCwgMHgxNDAxLCAweDY0ZTYsIDB4NzRjNywgMHg0NGE0LCAweDU0ODUsCi0gIDB4YTU2YSwgMHhiNTRiLCAweDg1MjgsIDB4OTUwOSwgMHhlNWVlLCAweGY1Y2YsIDB4YzVhYywgMHhkNThkLAotICAweDM2NTMsIDB4MjY3MiwgMHgxNjExLCAweDA2MzAsIDB4NzZkNywgMHg2NmY2LCAweDU2OTUsIDB4NDZiNCwKLSAgMHhiNzViLCAweGE3N2EsIDB4OTcxOSwgMHg4NzM4LCAweGY3ZGYsIDB4ZTdmZSwgMHhkNzlkLCAweGM3YmMsCi0gIDB4NDhjNCwgMHg1OGU1LCAweDY4ODYsIDB4NzhhNywgMHgwODQwLCAweDE4NjEsIDB4MjgwMiwgMHgzODIzLAotICAweGM5Y2MsIDB4ZDllZCwgMHhlOThlLCAweGY5YWYsIDB4ODk0OCwgMHg5OTY5LCAweGE5MGEsIDB4YjkyYiwKLSAgMHg1YWY1LCAweDRhZDQsIDB4N2FiNywgMHg2YTk2LCAweDFhNzEsIDB4MGE1MCwgMHgzYTMzLCAweDJhMTIsCi0gIDB4ZGJmZCwgMHhjYmRjLCAweGZiYmYsIDB4ZWI5ZSwgMHg5Yjc5LCAweDhiNTgsIDB4YmIzYiwgMHhhYjFhLAotICAweDZjYTYsIDB4N2M4NywgMHg0Y2U0LCAweDVjYzUsIDB4MmMyMiwgMHgzYzAzLCAweDBjNjAsIDB4MWM0MSwKLSAgMHhlZGFlLCAweGZkOGYsIDB4Y2RlYywgMHhkZGNkLCAweGFkMmEsIDB4YmQwYiwgMHg4ZDY4LCAweDlkNDksCi0gIDB4N2U5NywgMHg2ZWI2LCAweDVlZDUsIDB4NGVmNCwgMHgzZTEzLCAweDJlMzIsIDB4MWU1MSwgMHgwZTcwLAotICAweGZmOWYsIDB4ZWZiZSwgMHhkZmRkLCAweGNmZmMsIDB4YmYxYiwgMHhhZjNhLCAweDlmNTksIDB4OGY3OCwKLSAgMHg5MTg4LCAweDgxYTksIDB4YjFjYSwgMHhhMWViLCAweGQxMGMsIDB4YzEyZCwgMHhmMTRlLCAweGUxNmYsCi0gIDB4MTA4MCwgMHgwMGExLCAweDMwYzIsIDB4MjBlMywgMHg1MDA0LCAweDQwMjUsIDB4NzA0NiwgMHg2MDY3LAotICAweDgzYjksIDB4OTM5OCwgMHhhM2ZiLCAweGIzZGEsIDB4YzMzZCwgMHhkMzFjLCAweGUzN2YsIDB4ZjM1ZSwKLSAgMHgwMmIxLCAweDEyOTAsIDB4MjJmMywgMHgzMmQyLCAweDQyMzUsIDB4NTIxNCwgMHg2Mjc3LCAweDcyNTYsCi0gIDB4YjVlYSwgMHhhNWNiLCAweDk1YTgsIDB4ODU4OSwgMHhmNTZlLCAweGU1NGYsIDB4ZDUyYywgMHhjNTBkLAotICAweDM0ZTIsIDB4MjRjMywgMHgxNGEwLCAweDA0ODEsIDB4NzQ2NiwgMHg2NDQ3LCAweDU0MjQsIDB4NDQwNSwKLSAgMHhhN2RiLCAweGI3ZmEsIDB4ODc5OSwgMHg5N2I4LCAweGU3NWYsIDB4Zjc3ZSwgMHhjNzFkLCAweGQ3M2MsCi0gIDB4MjZkMywgMHgzNmYyLCAweDA2OTEsIDB4MTZiMCwgMHg2NjU3LCAweDc2NzYsIDB4NDYxNSwgMHg1NjM0LAotICAweGQ5NGMsIDB4Yzk2ZCwgMHhmOTBlLCAweGU5MmYsIDB4OTljOCwgMHg4OWU5LCAweGI5OGEsIDB4YTlhYiwKLSAgMHg1ODQ0LCAweDQ4NjUsIDB4NzgwNiwgMHg2ODI3LCAweDE4YzAsIDB4MDhlMSwgMHgzODgyLCAweDI4YTMsCi0gIDB4Y2I3ZCwgMHhkYjVjLCAweGViM2YsIDB4ZmIxZSwgMHg4YmY5LCAweDliZDgsIDB4YWJiYiwgMHhiYjlhLAotICAweDRhNzUsIDB4NWE1NCwgMHg2YTM3LCAweDdhMTYsIDB4MGFmMSwgMHgxYWQwLCAweDJhYjMsIDB4M2E5MiwKLSAgMHhmZDJlLCAweGVkMGYsIDB4ZGQ2YywgMHhjZDRkLCAweGJkYWEsIDB4YWQ4YiwgMHg5ZGU4LCAweDhkYzksCi0gIDB4N2MyNiwgMHg2YzA3LCAweDVjNjQsIDB4NGM0NSwgMHgzY2EyLCAweDJjODMsIDB4MWNlMCwgMHgwY2MxLAotICAweGVmMWYsIDB4ZmYzZSwgMHhjZjVkLCAweGRmN2MsIDB4YWY5YiwgMHhiZmJhLCAweDhmZDksIDB4OWZmOCwKLSAgMHg2ZTE3LCAweDdlMzYsIDB4NGU1NSwgMHg1ZTc0LCAweDJlOTMsIDB4M2ViMiwgMHgwZWQxLCAweDFlZjAKLX07CitzdGF0aWMgY29uc3QgVVNIT1JUIGNyY0xvb2t1cF8xNl8xMl81XzBbMjU2XSA9IHsKKyAgICAweDAwMDAsIDB4MTAyMSwgMHgyMDQyLCAweDMwNjMsIDB4NDA4NCwgMHg1MGE1LCAweDYwYzYsIDB4NzBlNywgMHg4MTA4LAorICAgIDB4OTEyOSwgMHhhMTRhLCAweGIxNmIsIDB4YzE4YywgMHhkMWFkLCAweGUxY2UsIDB4ZjFlZiwgMHgxMjMxLCAweDAyMTAsCisgICAgMHgzMjczLCAweDIyNTIsIDB4NTJiNSwgMHg0Mjk0LCAweDcyZjcsIDB4NjJkNiwgMHg5MzM5LCAweDgzMTgsIDB4YjM3YiwKKyAgICAweGEzNWEsIDB4ZDNiZCwgMHhjMzljLCAweGYzZmYsIDB4ZTNkZSwgMHgyNDYyLCAweDM0NDMsIDB4MDQyMCwgMHgxNDAxLAorICAgIDB4NjRlNiwgMHg3NGM3LCAweDQ0YTQsIDB4NTQ4NSwgMHhhNTZhLCAweGI1NGIsIDB4ODUyOCwgMHg5NTA5LCAweGU1ZWUsCisgICAgMHhmNWNmLCAweGM1YWMsIDB4ZDU4ZCwgMHgzNjUzLCAweDI2NzIsIDB4MTYxMSwgMHgwNjMwLCAweDc2ZDcsIDB4NjZmNiwKKyAgICAweDU2OTUsIDB4NDZiNCwgMHhiNzViLCAweGE3N2EsIDB4OTcxOSwgMHg4NzM4LCAweGY3ZGYsIDB4ZTdmZSwgMHhkNzlkLAorICAgIDB4YzdiYywgMHg0OGM0LCAweDU4ZTUsIDB4Njg4NiwgMHg3OGE3LCAweDA4NDAsIDB4MTg2MSwgMHgyODAyLCAweDM4MjMsCisgICAgMHhjOWNjLCAweGQ5ZWQsIDB4ZTk4ZSwgMHhmOWFmLCAweDg5NDgsIDB4OTk2OSwgMHhhOTBhLCAweGI5MmIsIDB4NWFmNSwKKyAgICAweDRhZDQsIDB4N2FiNywgMHg2YTk2LCAweDFhNzEsIDB4MGE1MCwgMHgzYTMzLCAweDJhMTIsIDB4ZGJmZCwgMHhjYmRjLAorICAgIDB4ZmJiZiwgMHhlYjllLCAweDliNzksIDB4OGI1OCwgMHhiYjNiLCAweGFiMWEsIDB4NmNhNiwgMHg3Yzg3LCAweDRjZTQsCisgICAgMHg1Y2M1LCAweDJjMjIsIDB4M2MwMywgMHgwYzYwLCAweDFjNDEsIDB4ZWRhZSwgMHhmZDhmLCAweGNkZWMsIDB4ZGRjZCwKKyAgICAweGFkMmEsIDB4YmQwYiwgMHg4ZDY4LCAweDlkNDksIDB4N2U5NywgMHg2ZWI2LCAweDVlZDUsIDB4NGVmNCwgMHgzZTEzLAorICAgIDB4MmUzMiwgMHgxZTUxLCAweDBlNzAsIDB4ZmY5ZiwgMHhlZmJlLCAweGRmZGQsIDB4Y2ZmYywgMHhiZjFiLCAweGFmM2EsCisgICAgMHg5ZjU5LCAweDhmNzgsIDB4OTE4OCwgMHg4MWE5LCAweGIxY2EsIDB4YTFlYiwgMHhkMTBjLCAweGMxMmQsIDB4ZjE0ZSwKKyAgICAweGUxNmYsIDB4MTA4MCwgMHgwMGExLCAweDMwYzIsIDB4MjBlMywgMHg1MDA0LCAweDQwMjUsIDB4NzA0NiwgMHg2MDY3LAorICAgIDB4ODNiOSwgMHg5Mzk4LCAweGEzZmIsIDB4YjNkYSwgMHhjMzNkLCAweGQzMWMsIDB4ZTM3ZiwgMHhmMzVlLCAweDAyYjEsCisgICAgMHgxMjkwLCAweDIyZjMsIDB4MzJkMiwgMHg0MjM1LCAweDUyMTQsIDB4NjI3NywgMHg3MjU2LCAweGI1ZWEsIDB4YTVjYiwKKyAgICAweDk1YTgsIDB4ODU4OSwgMHhmNTZlLCAweGU1NGYsIDB4ZDUyYywgMHhjNTBkLCAweDM0ZTIsIDB4MjRjMywgMHgxNGEwLAorICAgIDB4MDQ4MSwgMHg3NDY2LCAweDY0NDcsIDB4NTQyNCwgMHg0NDA1LCAweGE3ZGIsIDB4YjdmYSwgMHg4Nzk5LCAweDk3YjgsCisgICAgMHhlNzVmLCAweGY3N2UsIDB4YzcxZCwgMHhkNzNjLCAweDI2ZDMsIDB4MzZmMiwgMHgwNjkxLCAweDE2YjAsIDB4NjY1NywKKyAgICAweDc2NzYsIDB4NDYxNSwgMHg1NjM0LCAweGQ5NGMsIDB4Yzk2ZCwgMHhmOTBlLCAweGU5MmYsIDB4OTljOCwgMHg4OWU5LAorICAgIDB4Yjk4YSwgMHhhOWFiLCAweDU4NDQsIDB4NDg2NSwgMHg3ODA2LCAweDY4MjcsIDB4MThjMCwgMHgwOGUxLCAweDM4ODIsCisgICAgMHgyOGEzLCAweGNiN2QsIDB4ZGI1YywgMHhlYjNmLCAweGZiMWUsIDB4OGJmOSwgMHg5YmQ4LCAweGFiYmIsIDB4YmI5YSwKKyAgICAweDRhNzUsIDB4NWE1NCwgMHg2YTM3LCAweDdhMTYsIDB4MGFmMSwgMHgxYWQwLCAweDJhYjMsIDB4M2E5MiwgMHhmZDJlLAorICAgIDB4ZWQwZiwgMHhkZDZjLCAweGNkNGQsIDB4YmRhYSwgMHhhZDhiLCAweDlkZTgsIDB4OGRjOSwgMHg3YzI2LCAweDZjMDcsCisgICAgMHg1YzY0LCAweDRjNDUsIDB4M2NhMiwgMHgyYzgzLCAweDFjZTAsIDB4MGNjMSwgMHhlZjFmLCAweGZmM2UsIDB4Y2Y1ZCwKKyAgICAweGRmN2MsIDB4YWY5YiwgMHhiZmJhLCAweDhmZDksIDB4OWZmOCwgMHg2ZTE3LCAweDdlMzYsIDB4NGU1NSwgMHg1ZTc0LAorICAgIDB4MmU5MywgMHgzZWIyLCAweDBlZDEsIDB4MWVmMH07CiAKKy8qKgorICogXGJyaWVmICBUaGlzIHRhYmxlIGRlZmluZXMgcHJlY2FsY3VsYXRlZCBsb29rdXAgdGFibGVzIGZvciBjcmMgcG9seW5vbSAgeF4xNgorICogKyB4XjE1ICsgeF41ICsgeF4wLgorICovCisKK3N0YXRpYyBjb25zdCBVU0hPUlQgY3JjTG9va3VwXzE2XzE1XzVfMFsyNTZdID0geworICAgIDB4MDAwMCwgMHg4MDIxLCAweDgwNjMsIDB4MDA0MiwgMHg4MGU3LCAweDAwYzYsIDB4MDA4NCwgMHg4MGE1LCAweDgxZWYsCisgICAgMHgwMWNlLCAweDAxOGMsIDB4ODFhZCwgMHgwMTA4LCAweDgxMjksIDB4ODE2YiwgMHgwMTRhLCAweDgzZmYsIDB4MDNkZSwKKyAgICAweDAzOWMsIDB4ODNiZCwgMHgwMzE4LCAweDgzMzksIDB4ODM3YiwgMHgwMzVhLCAweDAyMTAsIDB4ODIzMSwgMHg4MjczLAorICAgIDB4MDI1MiwgMHg4MmY3LCAweDAyZDYsIDB4MDI5NCwgMHg4MmI1LCAweDg3ZGYsIDB4MDdmZSwgMHgwN2JjLCAweDg3OWQsCisgICAgMHgwNzM4LCAweDg3MTksIDB4ODc1YiwgMHgwNzdhLCAweDA2MzAsIDB4ODYxMSwgMHg4NjUzLCAweDA2NzIsIDB4ODZkNywKKyAgICAweDA2ZjYsIDB4MDZiNCwgMHg4Njk1LCAweDA0MjAsIDB4ODQwMSwgMHg4NDQzLCAweDA0NjIsIDB4ODRjNywgMHgwNGU2LAorICAgIDB4MDRhNCwgMHg4NDg1LCAweDg1Y2YsIDB4MDVlZSwgMHgwNWFjLCAweDg1OGQsIDB4MDUyOCwgMHg4NTA5LCAweDg1NGIsCisgICAgMHgwNTZhLCAweDhmOWYsIDB4MGZiZSwgMHgwZmZjLCAweDhmZGQsIDB4MGY3OCwgMHg4ZjU5LCAweDhmMWIsIDB4MGYzYSwKKyAgICAweDBlNzAsIDB4OGU1MSwgMHg4ZTEzLCAweDBlMzIsIDB4OGU5NywgMHgwZWI2LCAweDBlZjQsIDB4OGVkNSwgMHgwYzYwLAorICAgIDB4OGM0MSwgMHg4YzAzLCAweDBjMjIsIDB4OGM4NywgMHgwY2E2LCAweDBjZTQsIDB4OGNjNSwgMHg4ZDhmLCAweDBkYWUsCisgICAgMHgwZGVjLCAweDhkY2QsIDB4MGQ2OCwgMHg4ZDQ5LCAweDhkMGIsIDB4MGQyYSwgMHgwODQwLCAweDg4NjEsIDB4ODgyMywKKyAgICAweDA4MDIsIDB4ODhhNywgMHgwODg2LCAweDA4YzQsIDB4ODhlNSwgMHg4OWFmLCAweDA5OGUsIDB4MDljYywgMHg4OWVkLAorICAgIDB4MDk0OCwgMHg4OTY5LCAweDg5MmIsIDB4MDkwYSwgMHg4YmJmLCAweDBiOWUsIDB4MGJkYywgMHg4YmZkLCAweDBiNTgsCisgICAgMHg4Yjc5LCAweDhiM2IsIDB4MGIxYSwgMHgwYTUwLCAweDhhNzEsIDB4OGEzMywgMHgwYTEyLCAweDhhYjcsIDB4MGE5NiwKKyAgICAweDBhZDQsIDB4OGFmNSwgMHg5ZjFmLCAweDFmM2UsIDB4MWY3YywgMHg5ZjVkLCAweDFmZjgsIDB4OWZkOSwgMHg5ZjliLAorICAgIDB4MWZiYSwgMHgxZWYwLCAweDllZDEsIDB4OWU5MywgMHgxZWIyLCAweDllMTcsIDB4MWUzNiwgMHgxZTc0LCAweDllNTUsCisgICAgMHgxY2UwLCAweDljYzEsIDB4OWM4MywgMHgxY2EyLCAweDljMDcsIDB4MWMyNiwgMHgxYzY0LCAweDljNDUsIDB4OWQwZiwKKyAgICAweDFkMmUsIDB4MWQ2YywgMHg5ZDRkLCAweDFkZTgsIDB4OWRjOSwgMHg5ZDhiLCAweDFkYWEsIDB4MThjMCwgMHg5OGUxLAorICAgIDB4OThhMywgMHgxODgyLCAweDk4MjcsIDB4MTgwNiwgMHgxODQ0LCAweDk4NjUsIDB4OTkyZiwgMHgxOTBlLCAweDE5NGMsCisgICAgMHg5OTZkLCAweDE5YzgsIDB4OTllOSwgMHg5OWFiLCAweDE5OGEsIDB4OWIzZiwgMHgxYjFlLCAweDFiNWMsIDB4OWI3ZCwKKyAgICAweDFiZDgsIDB4OWJmOSwgMHg5YmJiLCAweDFiOWEsIDB4MWFkMCwgMHg5YWYxLCAweDlhYjMsIDB4MWE5MiwgMHg5YTM3LAorICAgIDB4MWExNiwgMHgxYTU0LCAweDlhNzUsIDB4MTA4MCwgMHg5MGExLCAweDkwZTMsIDB4MTBjMiwgMHg5MDY3LCAweDEwNDYsCisgICAgMHgxMDA0LCAweDkwMjUsIDB4OTE2ZiwgMHgxMTRlLCAweDExMGMsIDB4OTEyZCwgMHgxMTg4LCAweDkxYTksIDB4OTFlYiwKKyAgICAweDExY2EsIDB4OTM3ZiwgMHgxMzVlLCAweDEzMWMsIDB4OTMzZCwgMHgxMzk4LCAweDkzYjksIDB4OTNmYiwgMHgxM2RhLAorICAgIDB4MTI5MCwgMHg5MmIxLCAweDkyZjMsIDB4MTJkMiwgMHg5Mjc3LCAweDEyNTYsIDB4MTIxNCwgMHg5MjM1LCAweDk3NWYsCisgICAgMHgxNzdlLCAweDE3M2MsIDB4OTcxZCwgMHgxN2I4LCAweDk3OTksIDB4OTdkYiwgMHgxN2ZhLCAweDE2YjAsIDB4OTY5MSwKKyAgICAweDk2ZDMsIDB4MTZmMiwgMHg5NjU3LCAweDE2NzYsIDB4MTYzNCwgMHg5NjE1LCAweDE0YTAsIDB4OTQ4MSwgMHg5NGMzLAorICAgIDB4MTRlMiwgMHg5NDQ3LCAweDE0NjYsIDB4MTQyNCwgMHg5NDA1LCAweDk1NGYsIDB4MTU2ZSwgMHgxNTJjLCAweDk1MGQsCisgICAgMHgxNWE4LCAweDk1ODksIDB4OTVjYiwgMHgxNWVhLAorfTsKIAogLyotLS0tLS0tLS0tLS0tLS0gZnVuY3Rpb24gZGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGlubGluZSBJTlQgY2FsY0NyY19CaXRzKAotICAgICAgICBVU0hPUlQgKiBjb25zdCAgICAgICAgICAgICAgICAgIHBDcmMsCi0gICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgY3JjTWFzaywKLSAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICBjcmNQb2x5LAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgICAgICAgIGhCcywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQml0cwotICAgICAgICApOworc3RhdGljIGlubGluZSBJTlQgY2FsY0NyY19CaXRzKFVTSE9SVCAqY29uc3QgcENyYywgVVNIT1JUIGNyY01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIGNyY1BvbHksIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbkJpdHMpOwogCi1zdGF0aWMgaW5saW5lIElOVCBjYWxjQ3JjX0J5dGVzKAotICAgICAgICBVU0hPUlQgKiBjb25zdCAgICAgICAgICAgICAgICAgIHBDcmMsCi0gICAgICAgIGNvbnN0IFVTSE9SVCAqICAgICAgICAgICAgICAgICAgcENyY0xvb2t1cCwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICAgICAgICBoQnMsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzCi0gICAgICAgICk7CitzdGF0aWMgaW5saW5lIElOVCBjYWxjQ3JjX0J5dGVzKFVTSE9SVCAqY29uc3QgcENyYywgY29uc3QgVVNIT1JUICpwQ3JjTG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIElOVCBuQnl0ZXMpOwogCi1zdGF0aWMgdm9pZCBjcmNDYWxjKAotICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgICAgICAgIGhDcmNJbmZvLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgICAgICAgIGhCcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICByZWcKLSAgICAgICAgKTsKLQorc3RhdGljIHZvaWQgY3JjQ2FsYyhIQU5ETEVfRkRLX0NSQ0lORk8gaENyY0luZm8sIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHJlZyk7CiAKIC8qLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCBGREtjcmNJbml0KAotICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgICAgICAgIGhDcmNJbmZvLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIGNyY1BvbHksCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgY3JjU3RhcnRWYWx1ZSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICBjcmNMZW4KLSAgICAgICAgKQotewordm9pZCBGREtjcmNJbml0KEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbywgY29uc3QgVUlOVCBjcmNQb2x5LAorICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY3JjU3RhcnRWYWx1ZSwgY29uc3QgVUlOVCBjcmNMZW4pIHsKICAgLyogY3JjIHBvbHlub20gZXhhbXBsZToKKyAgeF4xNiArIHheMTUgKyB4XjUgKyB4XjAgICAgICAgICgxKSAxMDAwIDAwMDAgMDAxMCAwMDAxIC0+IDB4ODAyMQogICB4XjE2ICsgeF4xNSArIHheMiArIHheMCAgICAgICAgKDEpIDEwMDAgMDAwMCAwMDAwIDAxMDEgLT4gMHg4MDA1CiAgIHheMTYgKyB4XjEyICsgeF41ICsgeF4wICAgICAgICAoMSkgMDAwMSAwMDAwIDAwMTAgMDAwMSAtPiAweDEwMjEKICAgeF44ICsgeF40ICsgeF4zICsgeF4yICsgeF4wICAgICAgICAgICAgICAoMSkgMDAwMSAxMTAxIC0+IDB4MDAxZCAqLwogCi0gIGhDcmNJbmZvLT5jcmNMZW4gICAgID0gY3JjTGVuOwotICBoQ3JjSW5mby0+Y3JjUG9seSAgICA9IGNyY1BvbHk7CisgIGhDcmNJbmZvLT5jcmNMZW4gPSBjcmNMZW47CisgIGhDcmNJbmZvLT5jcmNQb2x5ID0gY3JjUG9seTsKICAgaENyY0luZm8tPnN0YXJ0VmFsdWUgPSBjcmNTdGFydFZhbHVlOwotICBoQ3JjSW5mby0+Y3JjTWFzayAgICA9IChjcmNMZW4pID8gKDE8PChjcmNMZW4tMSkpIDogMDsKKyAgaENyY0luZm8tPmNyY01hc2sgPSAoY3JjTGVuKSA/ICgxIDw8IChjcmNMZW4gLSAxKSkgOiAwOwogCiAgIEZES2NyY1Jlc2V0KGhDcmNJbmZvKTsKIAotICBoQ3JjSW5mby0+cENyY0xvb2t1cCA9IDA7CisgIGhDcmNJbmZvLT5wQ3JjTG9va3VwID0KKyAgICAgIDA7IC8qIFByZXNldCAwIGZvciAiY3JjTGVuIiAhPSAxNiBvciB1bmtub3duIDE2LWJpdCBwb2x5bm9tcyAiY3JjUG9seSIgKi8KIAotICBpZiAoaENyY0luZm8tPmNyY0xlbj09MTYpIHsKLSAgICBzd2l0Y2ggKCBjcmNQb2x5ICkgeworICBpZiAoaENyY0luZm8tPmNyY0xlbiA9PSAxNikgeworICAgIHN3aXRjaCAoY3JjUG9seSkgeworICAgICAgY2FzZSAweDgwMjE6CisgICAgICAgIGhDcmNJbmZvLT5wQ3JjTG9va3VwID0gY3JjTG9va3VwXzE2XzE1XzVfMDsKKyAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIDB4ODAwNToKICAgICAgICAgaENyY0luZm8tPnBDcmNMb29rdXAgPSBjcmNMb29rdXBfMTZfMTVfMl8wOwogICAgICAgICBicmVhazsKQEAgLTIzMSw3NyArMjU3LDY1IEBACiAgICAgICBjYXNlIDB4MDAxZDoKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIC8qIG5vIGxvb2t1cCB0YWJsZSAqLwotICAgICAgICBoQ3JjSW5mby0+cENyY0xvb2t1cCA9IDA7CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQotCi0KIH0KIAotdm9pZCBGREtjcmNSZXNldChIQU5ETEVfRkRLX0NSQ0lORk8gaENyY0luZm8pCi17Cit2b2lkIEZES2NyY1Jlc2V0KEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbykgewogICBpbnQgaTsKIAogICBoQ3JjSW5mby0+Y3JjVmFsdWUgPSBoQ3JjSW5mby0+c3RhcnRWYWx1ZTsKIAotICBmb3IoaT0wO2k8TUFYX0NSQ19SRUdTO2krKykgeworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NSQ19SRUdTOyBpKyspIHsKICAgICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtpXS5pc0FjdGl2ZSA9IDA7CiAgIH0KICAgaENyY0luZm8tPnJlZ1N0YXJ0ID0gMDsKLSAgaENyY0luZm8tPnJlZ1N0b3AgID0gMDsKKyAgaENyY0luZm8tPnJlZ1N0b3AgPSAwOwogfQogCi1JTlQgRkRLY3JjU3RhcnRSZWcoCi0gICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8sCi0gICAgICAgIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgaEJzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIG1CaXRzCi0gICAgICAgICkKLXsKK0lOVCBGREtjcmNTdGFydFJlZyhIQU5ETEVfRkRLX0NSQ0lORk8gaENyY0luZm8sIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbUJpdHMpIHsKICAgaW50IHJlZyA9IGhDcmNJbmZvLT5yZWdTdGFydDsKIAotICBGREtfQVNTRVJUKGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uaXNBY3RpdmU9PTApOwotICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmlzQWN0aXZlICAgICAgPSAxOwotICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLm1heEJpdHMgICAgICAgPSBtQml0czsKLSAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS52YWxpZEJpdHMgICAgID0gRkRLZ2V0VmFsaWRCaXRzKGhCcykgOworICBGREtfQVNTRVJUKGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uaXNBY3RpdmUgPT0gMCk7CisgIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uaXNBY3RpdmUgPSAxOworICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLm1heEJpdHMgPSBtQml0czsKKyAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS52YWxpZEJpdHMgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOwogICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmJpdEJ1ZkNudEJpdHMgPSAwOwogCi0gIGhDcmNJbmZvLT5yZWdTdGFydCA9IChoQ3JjSW5mby0+cmVnU3RhcnQrMSklTUFYX0NSQ19SRUdTOworICBoQ3JjSW5mby0+cmVnU3RhcnQgPSAoaENyY0luZm8tPnJlZ1N0YXJ0ICsgMSkgJSBNQVhfQ1JDX1JFR1M7CiAKICAgcmV0dXJuIChyZWcpOwogfQogCi1JTlQgRkRLY3JjRW5kUmVnKAotICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgICAgICAgIGhDcmNJbmZvLAotICAgICAgICBjb25zdCBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgIGhCcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICByZWcKLSAgICAgICAgKQotewotICBGREtfQVNTRVJUKChyZWc9PShJTlQpaENyY0luZm8tPnJlZ1N0b3ApJiYoaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5pc0FjdGl2ZT09MSkpOworSU5UIEZES2NyY0VuZFJlZyhIQU5ETEVfRkRLX0NSQ0lORk8gaENyY0luZm8sIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHJlZykgeworICBGREtfQVNTRVJUKChyZWcgPT0gKElOVCloQ3JjSW5mby0+cmVnU3RvcCkgJiYKKyAgICAgICAgICAgICAoaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5pc0FjdGl2ZSA9PSAxKSk7CiAKLSAgaWYgKGhCcy0+Q29uZmlnQ2FjaGU9PUJTX1dSSVRFUikgewotICAgIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uYml0QnVmQ250Qml0cyA9IEZES2dldFZhbGlkQml0cyhoQnMpIC0gaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS52YWxpZEJpdHM7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5iaXRCdWZDbnRCaXRzID0gaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS52YWxpZEJpdHMgLSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgaWYgKGhCcy0+Q29uZmlnQ2FjaGUgPT0gQlNfV1JJVEVSKSB7CisgICAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5iaXRCdWZDbnRCaXRzID0KKyAgICAgICAgKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSAtIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10udmFsaWRCaXRzOworICB9IGVsc2UgeworICAgIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uYml0QnVmQ250Qml0cyA9CisgICAgICAgIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10udmFsaWRCaXRzIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKICAgfQogCiAgIGlmIChoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLm1heEJpdHMgPT0gMCkgewogICAgIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10ubWF4Qml0cyA9IGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uYml0QnVmQ250Qml0czsKICAgfQogCi0gIGNyY0NhbGMoIGhDcmNJbmZvLCBoQnMsIHJlZyk7CisgIGNyY0NhbGMoaENyY0luZm8sIGhCcywgcmVnKTsKIAogICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmlzQWN0aXZlID0gMDsKLSAgaENyY0luZm8tPnJlZ1N0b3AgPSAoaENyY0luZm8tPnJlZ1N0b3ArMSklTUFYX0NSQ19SRUdTOworICBoQ3JjSW5mby0+cmVnU3RvcCA9IChoQ3JjSW5mby0+cmVnU3RvcCArIDEpICUgTUFYX0NSQ19SRUdTOwogCiAgIHJldHVybiAwOwogfQogCi1VU0hPUlQgRkRLY3JjR2V0Q1JDKAotICAgICAgICBjb25zdCBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgIGhDcmNJbmZvCi0gICAgICAgICkKLXsKLSAgcmV0dXJuICggaENyY0luZm8tPmNyY1ZhbHVlICYgKCgoaENyY0luZm8tPmNyY01hc2stMSk8PDEpKzEpICk7CitVU0hPUlQgRkRLY3JjR2V0Q1JDKGNvbnN0IEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbykgeworICByZXR1cm4gKGhDcmNJbmZvLT5jcmNWYWx1ZSAmICgoKGhDcmNJbmZvLT5jcmNNYXNrIC0gMSkgPDwgMSkgKyAxKSk7CiB9CiAKIC8qKgpAQCAtMzA5LDcgKzMyMyw4IEBACiAgKgogICogQ2FsY3VsYXRlIGNyYyBzdGFydGluZyBhdCBjdXJyZW50IGJpdHN0cmVhbSBwb3N0aW9uIG92ZXIgbkJpdHMuCiAgKgotICogXHBhcmFtIHBDcmMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIG91dGx5aW5nIGFsbG9jYXRlZCBjcmMgaW5mbyBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gcENyYyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIGNyYyBpbmZvCisgKiBzdHJ1Y3R1cmUuCiAgKiBccGFyYW0gY3JjTWFzayAgICAgICAgICAgICAgIENyY01hc2sgaW4gdXNlLgogICogXHBhcmFtIGNyY1BvbHkgICAgICAgICAgICAgICBDcmMgcG9seW5vbSBpbiB1c2UuCiAgKiBccGFyYW0gaEJzICAgICAgICAgICAgICAgICAgIEhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlLgpAQCAtMzE3LDMxICszMzIsMjMgQEAKICAqCiAgKiBccmV0dXJuICBOdW1iZXIgb2YgcHJvY2Vzc2VkIGJpdHMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgSU5UIGNhbGNDcmNfQml0cygKLSAgICAgICAgVVNIT1JUICogY29uc3QgICAgICAgICAgICAgICAgICBwQ3JjLAotICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIGNyY01hc2ssCi0gICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgY3JjUG9seSwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICAgICAgICBoQnMsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJpdHMKLSAgICAgICAgKQoteworc3RhdGljIGlubGluZSBJTlQgY2FsY0NyY19CaXRzKFVTSE9SVCAqY29uc3QgcENyYywgVVNIT1JUIGNyY01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIGNyY1BvbHksIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbkJpdHMpIHsKICAgaW50IGk7CiAgIFVTSE9SVCBjcmMgPSAqcENyYzsgLyogZ2V0IGNyYyB2YWx1ZSAqLwogCi0gIGlmIChoQnMhPU5VTEwpIHsKKyAgaWYgKGhCcyAhPSBOVUxMKSB7CiAgICAgZm9yIChpID0gMDsgKGkgPCBuQml0cyk7IGkrKykgewotICAgICAgVVNIT1JUIHRtcCA9IEZES3JlYWRCaXRzKGhCcywxKTsgICAgIC8vIHByb2Nlc3Mgc2luZ2xlIGJpdAotICAgICAgdG1wIF49ICggKGNyYyAmIGNyY01hc2spID8gMSA6IDAgKTsKLSAgICAgIHRtcCAqPSBjcmNQb2x5OworICAgICAgVVNIT1JUIHRtcCA9IEZES3JlYWRCaXQoaEJzKTsgIC8vIHByb2Nlc3Mgc2luZ2xlIGJpdAorICAgICAgdG1wIF49ICgoY3JjICYgY3JjTWFzaykgPyAxIDogMCk7CisgICAgICBpZiAodG1wICE9IDApIHRtcCA9IGNyY1BvbHk7CiAgICAgICBjcmMgPDw9IDE7CiAgICAgICBjcmMgXj0gdG1wOwogICAgIH0KLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBmb3IgKGkgPSAwOyAoaSA8IG5CaXRzKTsgaSsrKSB7Ci0gICAgICBVU0hPUlQgdG1wID0gMDsgICAgIC8vIHByb2Nlc3Mgc2luZ2xlIGJpdAotICAgICAgdG1wIF49ICggKGNyYyAmIGNyY01hc2spID8gMSA6IDAgKTsKLSAgICAgIHRtcCAqPSBjcmNQb2x5OworICAgICAgVVNIT1JUIHRtcCA9IChjcmMgJiBjcmNNYXNrKSA/IGNyY1BvbHkgOiAwOyAgLy8gcHJvY2VzcyBzaW5nbGUgYml0CiAgICAgICBjcmMgPDw9IDE7CiAgICAgICBjcmMgXj0gdG1wOwogICAgIH0KQEAgLTM1NiwxMDQgKzM2MywxMTcgQEAKICAqCiAgKiBDYWxjdWxhdGUgY3JjIHN0YXJ0aW5nIGF0IGN1cnJlbnQgYml0c3RyZWFtIHBvc3Rpb24gb3ZlciBuQnl0ZXMuCiAgKgotICogXHBhcmFtIHBDcmMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIG91dGx5aW5nIGFsbG9jYXRlZCBjcmMgaW5mbyBzdHJ1Y3R1cmUuCi0gKiBccGFyYW0gcENyY0xvb2t1cCAgICAgICAgICAgIFBvaW50ZXIgdG8gbG9va3VwIHRhYmxlIHVzZWQgZm9yIGZhc3QgY3JjIGNhbGN1bGF0aW9uLgorICogXHBhcmFtIHBDcmMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIG91dGx5aW5nIGFsbG9jYXRlZCBjcmMgaW5mbworICogc3RydWN0dXJlLgorICogXHBhcmFtIHBDcmNMb29rdXAgICAgICAgICAgICBQb2ludGVyIHRvIGxvb2t1cCB0YWJsZSB1c2VkIGZvciBmYXN0IGNyYworICogY2FsY3VsYXRpb24uCiAgKiBccGFyYW0gaEJzICAgICAgICAgICAgICAgICAgIEhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlLgogICogXHBhcmFtIG5CaXRzICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgcHJvY2Vzc2luZyBieXRlcy4KICAqCiAgKiBccmV0dXJuICBOdW1iZXIgb2YgcHJvY2Vzc2VkIGJpdHMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgSU5UIGNhbGNDcmNfQnl0ZXMoCi0gICAgICAgIFVTSE9SVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgcENyYywKLSAgICAgICAgY29uc3QgVVNIT1JUICogICAgICAgICAgICAgICAgICBwQ3JjTG9va3VwLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgICAgICAgIGhCcywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQnl0ZXMKLSAgICAgICAgKQoteworCitzdGF0aWMgaW5saW5lIElOVCBjYWxjQ3JjX0J5dGVzKFVTSE9SVCAqY29uc3QgcENyYywgY29uc3QgVVNIT1JUICpwQ3JjTG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIElOVCBuQnl0ZXMpIHsKICAgaW50IGk7CiAgIFVTSE9SVCBjcmMgPSAqcENyYzsgLyogZ2V0IGNyYyB2YWx1ZSAqLwogCi0gIGlmIChoQnMhPU5VTEwpIHsKLSAgICBmb3IgKGk9MDsgaTxuQnl0ZXM7IGkrKykgewotICAgICAgY3JjID0gKGNyYzw8OClecENyY0xvb2t1cFsoKGNyYz4+OCleKChVQ0hBUilGREtyZWFkQml0cyhoQnMsOCkpKSYweEZGXTsKKyAgaWYgKGhCcyAhPSBOVUxMKSB7CisgICAgVUxPTkcgZGF0YTsKKyAgICBJTlQgYml0czsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKG5CeXRlcyA+PiAyKTsgaSsrKSB7CisgICAgICBkYXRhID0gKFVMT05HKUZES3JlYWRCaXRzKGhCcywgMzIpOworICAgICAgY3JjID0KKyAgICAgICAgICAoY3JjIDw8IDgpIF4gcENyY0xvb2t1cFsoKGNyYyA+PiA4KSBeICgoVVNIT1JUKShkYXRhID4+IDI0KSkpICYgMHhGRl07CisgICAgICBjcmMgPQorICAgICAgICAgIChjcmMgPDwgOCkgXiBwQ3JjTG9va3VwWygoY3JjID4+IDgpIF4gKChVU0hPUlQpKGRhdGEgPj4gMTYpKSkgJiAweEZGXTsKKyAgICAgIGNyYyA9CisgICAgICAgICAgKGNyYyA8PCA4KSBeIHBDcmNMb29rdXBbKChjcmMgPj4gOCkgXiAoKFVTSE9SVCkoZGF0YSA+PiA4KSkpICYgMHhGRl07CisgICAgICBjcmMgPQorICAgICAgICAgIChjcmMgPDwgOCkgXiBwQ3JjTG9va3VwWygoY3JjID4+IDgpIF4gKChVU0hPUlQpKGRhdGEgPj4gMCkpKSAmIDB4RkZdOwogICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBmb3IgKGk9MDsgaTxuQnl0ZXM7IGkrKykgewotICAgICAgY3JjID0gKGNyYzw8OClecENyY0xvb2t1cFsoKGNyYz4+OCleKChVQ0hBUikwKSkmMHhGRl07CisgICAgYml0cyA9IChuQnl0ZXMgJiAzKSA8PCAzOworICAgIGlmIChiaXRzID4gMCkgeworICAgICAgZGF0YSA9IChVTE9ORylGREtyZWFkQml0cyhoQnMsIGJpdHMpOworICAgICAgZm9yIChiaXRzIC09IDg7IGJpdHMgPj0gMDsgYml0cyAtPSA4KQorICAgICAgICBjcmMgPSAoY3JjIDw8IDgpIF4KKyAgICAgICAgICAgICAgcENyY0xvb2t1cFsoKGNyYyA+PiA4KSBeIChVU0hPUlQpKGRhdGEgPj4gYml0cykpICYgMHhGRl07CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBuQnl0ZXM7IGkrKykgeworICAgICAgY3JjID0gKGNyYyA8PCA4KSBeIHBDcmNMb29rdXBbKGNyYyA+PiA4KSAmIDB4RkZdOwogICAgIH0KICAgfQogCiAgICpwQ3JjID0gY3JjOyAvKiB1cGRhdGUgY3JjIHZhbHVlICovCiAKLSAgcmV0dXJuIChpKTsKKyAgcmV0dXJuIChuQnl0ZXMpOwogfQogCiAvKioKICAqIFxicmllZiAgQ2FsY3VsYXRlIGNyYy4KICAqCi0gKiBDYWxjdWxhdGUgY3JjLiBMZW5naHQgZGVwZW5kcyBvbiBtQml0cyBwYXJhbWV0ZXIgaW4gRkRLY3JjU3RhcnRSZWcoKSBjb25maWd1cmF0aW9uLgorICogQ2FsY3VsYXRlIGNyYy4gTGVuZ2h0IGRlcGVuZHMgb24gbUJpdHMgcGFyYW1ldGVyIGluIEZES2NyY1N0YXJ0UmVnKCkKKyAqIGNvbmZpZ3VyYXRpb24uCiAgKgotICogXHBhcmFtIGhDcmNJbmZvICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIG91dGx5aW5nIGFsbG9jYXRlZCBjcmMgaW5mbyBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gaENyY0luZm8gICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIGNyYyBpbmZvCisgKiBzdHJ1Y3R1cmUuCiAgKiBccGFyYW0gaEJzICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZS4KICAqIFxwYXJhbSByZWcgICAgICAgICAgICAgICAgICAgQ3JjIHJlZ2lvbiBJRC4KICAqCiAgKiBccmV0dXJuICBOdW1iZXIgb2YgcHJvY2Vzc2VkIGJpdHMuCiAgKi8KLXN0YXRpYyB2b2lkIGNyY0NhbGMoCi0gICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8sCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgICAgICAgaEJzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIHJlZwotICAgICAgICApCi17CitzdGF0aWMgdm9pZCBjcmNDYWxjKEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgcmVnKSB7CiAgIFVTSE9SVCBjcmMgPSBoQ3JjSW5mby0+Y3JjVmFsdWU7CiAgIENDcmNSZWdEYXRhICpyRCA9ICZoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddOwogICBGREtfQklUU1RSRUFNIGJzUmVhZGVyOwogCi0gIGlmIChoQnMtPkNvbmZpZ0NhY2hlPT1CU19SRUFERVIpIHsKKyAgaWYgKGhCcy0+Q29uZmlnQ2FjaGUgPT0gQlNfUkVBREVSKSB7CiAgICAgYnNSZWFkZXIgPSAqaEJzOwotICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKCZic1JlYWRlciwgLShJTlQpKHJELT52YWxpZEJpdHMtRkRLZ2V0VmFsaWRCaXRzKCZic1JlYWRlcikpKTsKLSAgfQotICBlbHNlIHsKLSAgICBGREtpbml0Qml0U3RyZWFtKCZic1JlYWRlciwgaEJzLT5oQml0QnVmLkJ1ZmZlciwgaEJzLT5oQml0QnVmLmJ1ZlNpemUsIGhCcy0+aEJpdEJ1Zi5WYWxpZEJpdHMsIEJTX1JFQURFUik7CisgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoJmJzUmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIC0ockQtPnZhbGlkQml0cyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKCZic1JlYWRlcikpKTsKKyAgfSBlbHNlIHsKKyAgICBGREtpbml0Qml0U3RyZWFtKCZic1JlYWRlciwgaEJzLT5oQml0QnVmLkJ1ZmZlciwgaEJzLT5oQml0QnVmLmJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICBoQnMtPmhCaXRCdWYuVmFsaWRCaXRzLCBCU19SRUFERVIpOwogICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKCZic1JlYWRlciwgckQtPnZhbGlkQml0cyk7CiAgIH0KIAogICBpbnQgYml0cywgckJpdHM7Ci0gIHJCaXRzID0gKHJELT5tYXhCaXRzPj0wKSA/IHJELT5tYXhCaXRzIDogLXJELT5tYXhCaXRzOyAvKiByYW1haW5pbmcgYml0cyAqLwotICBpZiAoKHJELT5tYXhCaXRzPjApICYmICgoKElOVClyRC0+Yml0QnVmQ250Qml0cz4+Mzw8Myk8ckJpdHMpICkgeworICByQml0cyA9IChyRC0+bWF4Qml0cyA+PSAwKSA/IHJELT5tYXhCaXRzIDogLXJELT5tYXhCaXRzOyAvKiByYW1haW5pbmcgYml0cyAqLworICBpZiAoKHJELT5tYXhCaXRzID4gMCkgJiYgKChyRC0+Yml0QnVmQ250Qml0cyA+PiAzIDw8IDMpIDwgckJpdHMpKSB7CiAgICAgYml0cyA9IHJELT5iaXRCdWZDbnRCaXRzOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGJpdHMgPSByQml0czsKICAgfQogCiAgIGludCB3b3JkcyA9IGJpdHMgPj4gMzsgIC8qIHByb2Nlc3NpbmcgYnl0ZXMgKi8KICAgaW50IG1CaXRzID0gYml0cyAmIDB4NzsgLyogbW9kdWxvIGJpdHMgKi8KIAotICBpZihoQ3JjSW5mby0+cENyY0xvb2t1cCkgewotICAgIHJCaXRzIC09IChjYWxjQ3JjX0J5dGVzKCZjcmMsIGhDcmNJbmZvLT5wQ3JjTG9va3VwLCAmYnNSZWFkZXIsIHdvcmRzKTw8Myk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgckJpdHMgLT0gY2FsY0NyY19CaXRzKCZjcmMsIGhDcmNJbmZvLT5jcmNNYXNrLCBoQ3JjSW5mby0+Y3JjUG9seSwgJmJzUmVhZGVyLCB3b3Jkczw8MyApOworICBpZiAoaENyY0luZm8tPnBDcmNMb29rdXApIHsKKyAgICByQml0cyAtPSAoY2FsY0NyY19CeXRlcygmY3JjLCBoQ3JjSW5mby0+cENyY0xvb2t1cCwgJmJzUmVhZGVyLCB3b3JkcykgPDwgMyk7CisgIH0gZWxzZSB7CisgICAgckJpdHMgLT0gY2FsY0NyY19CaXRzKCZjcmMsIGhDcmNJbmZvLT5jcmNNYXNrLCBoQ3JjSW5mby0+Y3JjUG9seSwgJmJzUmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkcyA8PCAzKTsKICAgfQogCiAgIC8qIHJlbWFpbmluZyB2YWxpZCBiaXRzKi8KLSAgaWYobUJpdHMhPTApIHsKLSAgICByQml0cyAtPSBjYWxjQ3JjX0JpdHMoJmNyYywgaENyY0luZm8tPmNyY01hc2ssIGhDcmNJbmZvLT5jcmNQb2x5LCAmYnNSZWFkZXIsIG1CaXRzICk7CisgIGlmIChtQml0cyAhPSAwKSB7CisgICAgckJpdHMgLT0gY2FsY0NyY19CaXRzKCZjcmMsIGhDcmNJbmZvLT5jcmNNYXNrLCBoQ3JjSW5mby0+Y3JjUG9seSwgJmJzUmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtQml0cyk7CiAgIH0KIAotICBpZiAockJpdHMhPTApIHsKKyAgaWYgKHJCaXRzICE9IDApIHsKICAgICAvKiB6ZXJvIGJ5dGVzICovCi0gICAgaWYgKCAoaENyY0luZm8tPnBDcmNMb29rdXApICYmIChyQml0cz44KSApIHsKLSAgICAgIHJCaXRzIC09IChjYWxjQ3JjX0J5dGVzKCZjcmMsIGhDcmNJbmZvLT5wQ3JjTG9va3VwLCBOVUxMLCByQml0cz4+Myk8PDMpOworICAgIGlmICgoaENyY0luZm8tPnBDcmNMb29rdXApICYmIChyQml0cyA+IDgpKSB7CisgICAgICByQml0cyAtPQorICAgICAgICAgIChjYWxjQ3JjX0J5dGVzKCZjcmMsIGhDcmNJbmZvLT5wQ3JjTG9va3VwLCBOVUxMLCByQml0cyA+PiAzKSA8PCAzKTsKICAgICB9CiAgICAgLyogcmVtYWluaW5nIHplcm8gYml0cyAqLwotICAgIGlmIChyQml0cyE9MCkgewotICAgICAgckJpdHMgLT0gY2FsY0NyY19CaXRzKCZjcmMsIGhDcmNJbmZvLT5jcmNNYXNrLCBoQ3JjSW5mby0+Y3JjUG9seSwgTlVMTCwgckJpdHMgKTsKKyAgICBpZiAockJpdHMgIT0gMCkgeworICAgICAgY2FsY0NyY19CaXRzKCZjcmMsIGhDcmNJbmZvLT5jcmNNYXNrLCBoQ3JjSW5mby0+Y3JjUG9seSwgTlVMTCwgckJpdHMpOwogICAgIH0KICAgfQogCiAgIGhDcmNJbmZvLT5jcmNWYWx1ZSA9IGNyYzsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9GREtfZGVjb3JyZWxhdGUuY3BwIGIvbGliRkRLL3NyYy9GREtfZGVjb3JyZWxhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjY1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvc3JjL0ZES19kZWNvcnJlbGF0ZS5jcHAKQEAgLTAsMCArMSwxNzQ0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXJrdXMgTG9od2Fzc2VyCisKKyAgIERlc2NyaXB0aW9uOiBGREsgVG9vbHMgRGVjb3JyZWxhdG9yCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJGREtfZGVjb3JyZWxhdGUuaCIKKworI2RlZmluZSBQQ19OVU1fQkFORFMgKDgpCisjZGVmaW5lIFBDX05VTV9IWUJfQkFORFMgKFBDX05VTV9CQU5EUyAtIDMgKyAxMCkKKworI2RlZmluZSBEVUNLX0FMUEhBICgwLjhmKQorI2RlZmluZSBEVUNLX0dBTU1BICgxLjVmKQorI2RlZmluZSBBQlNfVEhSICgxZS05ZiAqIDMyNzY4ICogMzI3NjgpCisjZGVmaW5lIEFCU19USFJfRkRLICgoRklYUF9EQkwpMSkKKworI2RlZmluZSBERUNPUlJfWkVST19QQURESU5HIDAKKworI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMF9NUFMgKDIwKQorI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMV9NUFMgKDE1KQorI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMl9NUFMgKDYpCisjZGVmaW5lIERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8zX01QUyAoMykKKworI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMF9VU0FDICgxMCkKKyNkZWZpbmUgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzFfVVNBQyAoOCkKKyNkZWZpbmUgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzJfVVNBQyAoMykKKyNkZWZpbmUgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzNfVVNBQyAoMikKKworI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMF9MRCAoMCkKKyNkZWZpbmUgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzFfTEQgKERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8xX01QUykKKyNkZWZpbmUgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzJfTEQgKERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8yX01QUykKKyNkZWZpbmUgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzNfTEQgKERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8zX01QUykKKworI2RlZmluZSBNQVhfREVDT1JSX1NFRURfTVBTIFwKKyAgKDUpIC8qIDQgaXMgd29yc3QgY2FzZSBmb3IgNzI3MiBtb2RlIGZvciBsb3cgcG93ZXIgKi8KKyAgICAgIC8qIDUgaXMgd29yc3QgY2FzZSBmb3IgNzI3MSBhbmQgNzI3MiBtb2RlIGZvciBoaWdoIHF1YWxpdHkgKi8KKyNkZWZpbmUgTUFYX0RFQ09SUl9TRUVEX1VTQUMgKDEpCisjZGVmaW5lIE1BWF9ERUNPUlJfU0VFRF9MRCAoNCkKKworI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX1BTICgxMikKKyNkZWZpbmUgTlVNX0RFQ09SUl9DT05GSUdTIFwKKyAgKDMpIC8qIGRpZmZlcmVudCBjb25maWdzIGRlZmluZWQgYnkgYnNEZWNvcnJDb25maWcgYml0c3RyZWFtIGZpZWxkICovCisKKy8qIFJFVl9iYW5kT2Zmc2V0Xy4uLiB0YWJsZXMgbWFwIChoeWJyaWQpIGJhbmRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJldmVyYgorICAgYmFuZHMuIFdpdGhpbiBlYWNoIHJldmVyYiBiYW5kIHRoZSBzYW1lIHByb2Nlc3NpbmcgaXMgYXBwbGllZC4gSW5zdGVhZCBvZiBRTUYKKyAgIHNwbGl0IGZyZXF1ZW5jaWVzIHRoZSBjb3JyZXNwb25kaW5nIGh5YnJpZCBiYW5kIG9mZnNldHMgYXJlIHN0b3JlZCBkaXJlY3RseQorICovCitzdGF0aWMgY29uc3QgVUNIQVIgUkVWX2JhbmRPZmZzZXRfTVBTX0hRW05VTV9ERUNPUlJfQ09ORklHU11bKDQpXSA9IHsKKyAgICB7OCwgMjEsIDMwLCA3MX0sIHs4LCA1NiwgNzEsIDcxfSwgezAsIDIxLCA3MSwgNzF9fTsKKy8qIFJFVl9iYW5kT2Zmc2V0X1VTQUNbXSBhcmUgZXF1aXZhbGVudCB0byBSRVZfYmFuZE9mZnNldF9NUFNfSFEgKi8KK3N0YXRpYyBjb25zdCBVQ0hBUiBSRVZfYmFuZE9mZnNldF9QU19IUVsoNCldID0gezMwLCA0MiwgNzEsIDcxfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBSRVZfYmFuZE9mZnNldF9QU19MUFsoNCldID0gezE0LCA0MiwgNzEsIDcxfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBSRVZfYmFuZE9mZnNldF9MRFtOVU1fREVDT1JSX0NPTkZJR1NdWyg0KV0gPSB7CisgICAgezAsIDE0LCAyMywgNjR9LCB7MCwgNDksIDY0LCA2NH0sIHswLCAxNCwgNjQsIDY0fX07CisKKy8qIFJFVl9kZWxheV8uLi4gdGFibGVzIGRlZmluZSB0aGUgbnVtYmVyIG9mIGRlbGF5IGVsZW1lbnRzIHdpdGhpbiBlYWNoIHJldmVyYgorICogYmFuZCAqLworLyogUkVWX2ZpbHRlck9yZGVyXy4uLiB0YWJsZXMgZGVmaW5lIHRoZSBmaWx0ZXIgb3JkZXIgd2l0aGluIGVhY2ggcmV2ZXJiIGJhbmQgKi8KK3N0YXRpYyBjb25zdCBVQ0hBUiBSRVZfZGVsYXlfTVBTWyg0KV0gPSB7OCwgNywgMiwgMX07CitzdGF0aWMgY29uc3QgU0NIQVIgUkVWX2ZpbHRlck9yZGVyX01QU1soNCldID0geworICAgIERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8wX01QUywgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzFfTVBTLAorICAgIERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8yX01QUywgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzNfTVBTfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBSRVZfZGVsYXlfUFNfSFFbKDQpXSA9IHsyLCAxNCwgMSwgMH07CitzdGF0aWMgY29uc3QgVUNIQVIgUkVWX2RlbGF5X1BTX0xQWyg0KV0gPSB7OCwgMTQsIDEsIDB9Oworc3RhdGljIGNvbnN0IFNDSEFSIFJFVl9maWx0ZXJPcmRlcl9QU1soNCldID0ge0RFQ09SUl9GSUxURVJfT1JERVJfUFMsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMX07CitzdGF0aWMgY29uc3QgVUNIQVIgUkVWX2RlbGF5X1VTQUNbKDQpXSA9IHsxMSwgMTAsIDUsIDJ9Oworc3RhdGljIGNvbnN0IFNDSEFSIFJFVl9maWx0ZXJPcmRlcl9VU0FDWyg0KV0gPSB7CisgICAgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzBfVVNBQywgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzFfVVNBQywKKyAgICBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMl9VU0FDLCBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfM19VU0FDfTsKKworLyogUkVWX2ZpbHRUeXBlXy4uLiB0YWJsZXMgZGVmaW5lIHRoZSB0eXBlIG9mIHByb2Nlc3NpbmcgKGZpbHRlcmluZyB3aXRoCisgICBkaWZmZXJlbnQgcHJvcGVydGllcyBvciBwdXJlIGRlbGF5KSBkb25lIGluIGVhY2ggcmV2ZXJiIGJhbmQuIFRoaXMgaXMgbWFwcGVkCisgICB0byBzcGVjaWFsaXplZCByb3V0aW5lcy4gKi8KK3N0YXRpYyBjb25zdCBSRVZCQU5EX0ZJTFRfVFlQRSBSRVZfZmlsdFR5cGVfTVBTWyg0KV0gPSB7CisgICAgQ09NTU9OX1JFQUwsIENPTU1PTl9SRUFMLCBDT01NT05fUkVBTCwgQ09NTU9OX1JFQUx9OworCitzdGF0aWMgY29uc3QgUkVWQkFORF9GSUxUX1RZUEUgUkVWX2ZpbHRUeXBlX1BTWyg0KV0gPSB7SU5ERVBfQ1BMWF9QUywgREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVMQVksIE5PVF9FWElTVH07CisKKy8qIGluaXRpYWxpemF0aW9uIHZhbHVlcyBvZiByaW5nIGJ1ZmZlciBvZmZzZXRzIGZvciB0aGUgMyBjb25jYXRlbmF0ZWQgYWxscGFzcworICogZmlsdGVycyAoUFMgdHlwZSBkZWNvcnJlbGF0b3IpLiAqLworc3RhdGljIGNvbnN0IFVDSEFSIHN0YXRlQnVmZmVyT2Zmc2V0SW5pdFsoMyldID0gezAsIDYsIDE0fTsKKworc3RhdGljIGNvbnN0IFJFVkJBTkRfRklMVF9UWVBFIFJFVl9maWx0VHlwZV9MRFsoNCldID0geworICAgIE5PVF9FWElTVCwgQ09NTU9OX1JFQUwsIENPTU1PTl9SRUFMLCBDT01NT05fUkVBTH07CisKKy8qKiogbWFwcGluZyBvZiBoeWJyaWQgYmFuZHMgdG8gcHJvY2Vzc2luZyAoL3BhcmFtZXRlcj8pIGJhbmRzICoqKi8KKy8qIHRhYmxlIGZvciBQUyBkZWNvcnIgcnVubmluZyBpbiBsZWdhY3kgUFMgZGVjb2Rlci4gKi8KK3N0YXRpYyBjb25zdCBVQ0hBUiBrZXJuZWxzXzIwX3RvXzcxX1BTWyg3MSkgKyAxXSA9IHsKKyAgICAwLCAgMCwgIDEsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDEyLCAxMywgMTQsIDE0LAorICAgIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsCisgICAgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5fTsKKworLyoqKiBtYXBwaW5nIG9mIHByb2Nlc3NpbmcgKC9wYXJhbWV0ZXI/KSBiYW5kcyB0byBoeWJyaWQgYmFuZHMgKioqLworLyogdGFibGUgZm9yIFBTIGRlY29yciBydW5uaW5nIGluIGxlZ2FjeSBQUyBkZWNvZGVyLiAqLworc3RhdGljIGNvbnN0IFVDSEFSIGtlcm5lbHNfMjBfdG9fNzFfb2Zmc2V0X1BTWygyMCkgKyAxXSA9IHsKKyAgICAwLCAyLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTgsIDIxLCAyNSwgMzAsIDQyLCA3MX07CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBrZXJuZWxzXzI4X3RvXzcxWyg3MSkgKyAxXSA9IHsKKyAgICAwLCAgMCwgIDEsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAgIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIzLCAyMywgMjMsCisgICAgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKKyAgICAyNiwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3fTsKKworc3RhdGljIGNvbnN0IFVDSEFSIGtlcm5lbHNfMjhfdG9fNzFfb2Zmc2V0WygyOCkgKyAxXSA9IHsKKyAgICAwLCAgMiwgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LAorICAgIDE3LCAxOCwgMTksIDIxLCAyMywgMjUsIDI3LCAzMCwgMzMsIDM3LCA0MiwgNDgsIDU1LCA3MX07CisKKy8qIExELU1QUyBkZWZpbmVkIGluIFNBT0Mgc3RhbmRhcnQgKG1hcHBpbmcgcW1mIC0+IHBhcmFtIGJhbmRzKSovCitzdGF0aWMgY29uc3QgVUNIQVIga2VybmVsc18yM190b182NFsoNjQpICsgMV0gPSB7CisgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LAorICAgIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsCisgICAgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLAorfTsKKworc3RhdGljIGNvbnN0IFVDSEFSIGtlcm5lbHNfMjNfdG9fNjRfb2Zmc2V0WygyMykgKyAxXSA9IHsKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsIDExLAorICAgIDEyLCAxNCwgMTYsIDE4LCAyMCwgMjMsIDI2LCAzMCwgMzUsIDQxLCA0OCwgNjR9OworCitzdGF0aWMgaW5saW5lIGludCBTcGF0aWFsRGVjR2V0UHJvY2Vzc2luZ0JhbmQoaW50IGh5YnJpZEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnRhYikgeworICByZXR1cm4gdGFiW2h5YnJpZEJhbmRdOworfQorCisvKiBoZWxwZXIgaW5saW5lIGZ1bmN0aW9uICovCitzdGF0aWMgaW5saW5lIGludCBTcGF0aWFsRGVjR2V0UW1mQmFuZChpbnQgcGFyYW1CYW5kLCBjb25zdCBVQ0hBUiAqdGFiKSB7CisgIHJldHVybiAoaW50KXRhYltwYXJhbUJhbmRdOworfQorCisjZGVmaW5lIERVQ0tFUl9NQVhfTlJHX1NDQUxFICgyNCkKKyNkZWZpbmUgRFVDS0VSX0hFQURST09NX0JJVFMgKDMpCisKKyNkZWZpbmUgRklMVEVSX1NGICgyKQorCisjaWZkZWYgQVJDSF9QUkVGRVJfTVVMVF8zMngzMgorI2RlZmluZSBGSVhQX0RVQ0tfR0FJTiBGSVhQX0RCTAorI2RlZmluZSBGWF9EQkwyRlhfRFVDS19HQUlOCisjZGVmaW5lIEZMMkZYQ09OU1RfRFVDSyBGTDJGWENPTlNUX0RCTAorI2Vsc2UKKyNkZWZpbmUgRklYUF9EVUNLX0dBSU4gRklYUF9TR0wKKyNkZWZpbmUgRlhfREJMMkZYX0RVQ0tfR0FJTiBGWF9EQkwyRlhfU0dMCisjZGVmaW5lIEZMMkZYQ09OU1RfRFVDSyBGTDJGWENPTlNUX1NHTAorI2VuZGlmCisjZGVmaW5lIFBTX0RVQ0tfUEVBS19ERUNBWV9GQUNUT1IgKDAuNzY1OTI4MzM4MzY0NjQ5ZikKKyNkZWZpbmUgUFNfRFVDS19GSUxURVJfQ09FRkYgKDAuMjVmKQorI2RlZmluZSBEVUNLX0FMUEhBX0ZESyBGTDJGWENPTlNUX0RVQ0soRFVDS19BTFBIQSkKKyNkZWZpbmUgRFVDS19PTkVfTUlOVVNfQUxQSEFfWDRfRkRLIEZMMkZYQ09OU1RfRFVDSyg0LjBmICogKDEuMGYgLSBEVUNLX0FMUEhBKSkKKyNkZWZpbmUgRFVDS19HQU1NQV9GREsgRkwyRlhDT05TVF9EVUNLKERVQ0tfR0FNTUEgLyAyKQorI2RlZmluZSBQU19EVUNLX1BFQUtfREVDQVlfRkFDVE9SX0ZESyBGTDJGWENPTlNUX0RVQ0soUFNfRFVDS19QRUFLX0RFQ0FZX0ZBQ1RPUikKKyNkZWZpbmUgUFNfRFVDS19GSUxURVJfQ09FRkZfRkRLIEZMMkZYQ09OU1RfRFVDSyhQU19EVUNLX0ZJTFRFUl9DT0VGRikKK1JBTV9BTElHTgorY29uc3QgRklYUF9TVFAgRGVjb3JyUHNDb2VmZnNDcGx4W11bNF0gPSB7CisgICAge1NUQ1AoMHg1ZDY5NDBlYiwgMHg1NzgzMTUzZSksIFNUQ1AoMHhhZGNkNDFhOCwgMHgwZTAzNzNlZCksCisgICAgIFNUQ1AoMHhiYWQ0MWYzZSwgMHgxNGZiYTA0NSksIFNUQ1AoMHhjMWViNjY5NCwgMHgwODgzMjI3ZCl9LAorICAgIHtTVENQKDB4NWQ2OTQwZWIsIDB4YTg3Y2VhYzIpLCBTVENQKDB4YWRjZDQxYTgsIDB4ZjFmYzhjMTMpLAorICAgICBTVENQKDB4YmFkNDFmM2UsIDB4ZWIwNDVmYmIpLCBTVENQKDB4YzFlYjY2OTQsIDB4Zjc3Y2RkODMpfSwKKyAgICB7U1RDUCgweGFlYzI0MTYyLCAweDYyZTlkNzViKSwgU1RDUCgweGI3MTY5MzE2LCAweDI4NzUxMDQ4KSwKKyAgICAgU1RDUCgweGQyMjRjMGNjLCAweDM3ZTA1MDUwKSwgU1RDUCgweGM2ODA4NjRmLCAweDE4ZTg4Y2JhKX0sCisgICAge1NUQ1AoMHhhZWMyNDE2MiwgMHg5ZDE2MjhhNSksIFNUQ1AoMHhiNzE2OTMxNiwgMHhkNzhhZWZiOCksCisgICAgIFNUQ1AoMHhkMjI0YzBjYywgMHhjODFmYWZiMCksIFNUQ1AoMHhjNjgwODY0ZiwgMHhlNzE3NzM0Nil9LAorICAgIHtTVENQKDB4OTgwMTIzNDEsIDB4NGFhMDBlZDEpLCBTVENQKDB4Yzg5Y2ExYjIsIDB4YzFhYjZiZmYpLAorICAgICBTVENQKDB4ZjhlYTM5NGUsIDB4YjgxMDZiZjQpLCBTVENQKDB4Y2Y1NDJkNzMsIDB4ZDg4OGI5OWIpfSwKKyAgICB7U1RDUCgweDQzYjEzN2IzLCAweDZjYTJjYTQwKSwgU1RDUCgweGUwNjQ5Y2M0LCAweGIyZDY5Y2NhKSwKKyAgICAgU1RDUCgweDIyMTMwYzIxLCAweGMwNDA1MzgyKSwgU1RDUCgweGRiYmY4ZmJhLCAweGNjZTNjN2NjKX0sCisgICAge1NUQ1AoMHgyOGZjNGQ3MSwgMHg4NmJkM2I4NyksIFNUQ1AoMHgwOWNjZmViOSwgMHhhZDMxOWJhZiksCisgICAgIFNUQ1AoMHg0NmU1MWYwMiwgMHhmMWU1ZWE1NSksIFNUQ1AoMHhmMzBkNWUzNCwgMHhjMmIwZTMzNSl9LAorICAgIHtTVENQKDB4Yzc5OGY3NTYsIDB4NzJlNzNjN2QpLCBTVENQKDB4M2I2YzNjMWUsIDB4YzU4MGRjNzIpLAorICAgICBTVENQKDB4MjgyOGE2YmEsIDB4M2MxYTE0ZmIpLCBTVENQKDB4MTRiNzMzYmIsIDB4YzRkY2FhZTEpfSwKKyAgICB7U1RDUCgweDQ2ZGNhZGQzLCAweDk1Njc5NWM3KSwgU1RDUCgweDUyZjMyZmFlLCAweGY3ODA0OGNkKSwKKyAgICAgU1RDUCgweGQ3ZDc1OTQ2LCAweDNjMWExNGZiKSwgU1RDUCgweDMwNjAxN2NiLCAweGQ4MmMwYTc1KX0sCisgICAge1NUQ1AoMHhhYmUxOTdkZSwgMHg2MDdhNjc1ZSksIFNUQ1AoMHg0NjBjZWY2ZSwgMHgyZDNiMjY0ZSksCisgICAgIFNUQ1AoMHhiOTFhZTBmZSwgMHhmMWU1ZWE1NSksIFNUQ1AoMHgzZTAzZTVlMCwgMHhmNzA2NTkwZSl9LAorICAgIHtTVENQKDB4YjFiNGY1MDksIDB4OWFiY2FmNWYpLCBTVENQKDB4ZmViMGI0YmUsIDB4NTM1ZmI4YmEpLAorICAgICBTVENQKDB4MWJhOTZmOGUsIDB4YmQzN2U2ZDgpLCBTVENQKDB4MzBmNmRiYmIsIDB4MjcxYTA3NDMpfSwKKyAgICB7U1RDUCgweGNlNzViNTJhLCAweDg5ZjliZTYxKSwgU1RDUCgweGIyNmU0ZGRhLCAweDEwMTA1NGM1KSwKKyAgICAgU1RDUCgweDFhNDc1ZDJlLCAweDNmNzE0YjE5KSwgU1RDUCgweGY0OTFmMTU0LCAweDNhNmJhZjQ2KX0sCisgICAge1NUQ1AoMHhlZThmZGZjYiwgMHg4MTMxODFmYSksIFNUQ1AoMHhlMTFlMWEwMCwgMHhiYjlhNjAzOSksCisgICAgIFNUQ1AoMHhjM2U1ODJmNSwgMHhlNzFhYjUzMyksIFNUQ1AoMHhjOWViMzVlMiwgMHgwZmZkMjEyYSl9LAorICAgIHtTVENQKDB4MGZkN2Q5MmYsIDB4ODBmYmY5NzUpLCBTVENQKDB4MzhhZGNjYmMsIDB4ZDU3MWJiZjQpLAorICAgICBTVENQKDB4MzhjM2FlZmMsIDB4ZTg3Y2M3OTQpLCBTVENQKDB4ZGFmZThjM2QsIDB4ZDliMTYxMDApfSwKKyAgICB7U1RDUCgweDMwMGQ5ZTEwLCAweDg5NWNjMzU5KSwgU1RDUCgweDMyYjk4NDNlLCAweDJiNTJhZGNjKSwKKyAgICAgU1RDUCgweGU5ZGVkOWY0LCAweDM1NmNlMGVkKSwgU1RDUCgweDBmZGQ1Y2EzLCAweGQwNzI5MzJlKX0sCisgICAge1NUQ1AoMHg0ZDAzYjRmOCwgMHg5OWMyZGVjMyksIFNUQ1AoMHhlMmJjOGQ5NCwgMHgzNzQ0ZTE5NSksCisgICAgIFNUQ1AoMHhlYjQwZWM1NSwgMHhjZGU5ZWQyMiksIFNUQ1AoMHgyZTY3ZTIzMSwgMHhmODkzNDcwYil9LAorICAgIHtTVENQKDB4NjRjNGRlYjMsIDB4YjExMjc5MGYpLCBTVENQKDB4YzdiMzI2ODIsIDB4ZjA5OTE3MmQpLAorICAgICBTVENQKDB4MmViZjQ0Y2YsIDB4MTM1ZDAxNGEpLCBTVENQKDB4MWEyYmFjZDUsIDB4MjMzMzQyNTQpfSwKKyAgICB7U1RDUCgweDc1YjVmOWFhLCAweGNkYjgxZTE0KSwgU1RDUCgweDAyOGQ5YmIxLCAweGM5ZGM0NWI5KSwKKyAgICAgU1RDUCgweGQ0OTc4OTNmLCAweDExZmFlZWU5KSwgU1RDUCgweGVlNDBmZjcxLCAweDI0YTkxYjg1KX0sCisgICAge1NUQ1AoMHg3ZWIxY2Q4MSwgMHhlZGMzZmVlYyksIFNUQ1AoMHgzMTQ5MTg5NywgMHhmNzY1ZjZkOCksCisgICAgIFNUQ1AoMHgxMDk4ZGM4OSwgMHhkN2VlNTc0ZSksIFNUQ1AoMHhkYTZiODE2ZCwgMHgwMTFmMzVjZil9LAorICAgIHtTVENQKDB4N2YxY2RlMDEsIDB4MGYwYjc3MjcpLCBTVENQKDB4MTE4Y2U0OWQsIDB4MmE1ZWNkYTQpLAorICAgICBTVENQKDB4MGYzNmNhMjgsIDB4MjRiYWRhYTMpLCBTVENQKDB4ZWYyOTA4YTQsIDB4ZTFlZTM3NDMpfSwKKyAgICB7U1RDUCgweDc2ZWZlZTI1LCAweDJmNGU4YzNhKSwgU1RDUCgweGRkZTNiZTJhLCAweDE3ZjkyMjE1KSwKKyAgICAgU1RDUCgweGRlOWJmMzZjLCAweGYyMmI0ODM5KSwgU1RDUCgweDExMjhmYzBjLCAweGU1Yzk1ZjVhKX0sCisgICAge1NUQ1AoMHg2NmI4N2Q2NSwgMHg0YzVlZGU0MiksIFNUQ1AoMHhlNDNmMzUxYSwgMHhlNmJmMjJkYyksCisgICAgIFNUQ1AoMHgxZTBkM2U4NSwgMHhmMzhkNWE5YSksIFNUQ1AoMHgxYzBmNDRhMywgMHgwMmM5MmZlMyl9LAorICAgIHtTVENQKDB4NGY4ZjM2YjcsIDB4NjQ0NTY4MGYpLCBTVENQKDB4MTA4NjdlYTIsIDB4ZTMwNzI3NDApLAorICAgICBTVENQKDB4ZjRlZjZjZmEsIDB4MWFiNjcwNzYpLCBTVENQKDB4MDk1NjJhOGEsIDB4MTc0MmJiOGIpfSwKKyAgICB7U1RDUCgweDMzMDRmNmVjLCAweDc1NjQ4MTJhKSwgU1RDUCgweDFiZTRmMWE4LCAweDA4OTRkNzVhKSwKKyAgICAgU1RDUCgweGY2NTE3ZjViLCAweGU4YTA1ZDk4KSwgU1RDUCgweGYxYmIwMDUzLCAweDEwYTc4ODUzKX0sCisgICAge1NUQ1AoMHgxMzA3YjJjNSwgMHg3ZTkzZDUzMiksIFNUQ1AoMHhmZTA5OGUyNywgMHgxOGYwMmE1OCksCisgICAgIFNUQ1AoMHgxNDA4ZDQ1OSwgMHgwODRjNmU0NCksIFNUQ1AoMHhlZGFmZTViZCwgMHhmYmMxNWIyZSl9LAorICAgIHtTVENQKDB4ZjFjMTExY2QsIDB4N2YzNDZjOTcpLCBTVENQKDB4ZWI1Y2E2YTAsIDB4MDJlZmVlOTMpLAorICAgICBTVENQKDB4ZWY0ZGY5YjYsIDB4MDZlYTViZTQpLCBTVENQKDB4ZmMxNDkyODksIDB4ZjBkNTNjZTQpfSwKKyAgICB7U1RDUCgweGQxNzEwMDAxLCAweDc3M2I2YmViKSwgU1RDUCgweGZhMWFlYjhjLCAweGYwNjY1NWZmKSwKKyAgICAgU1RDUCgweDA1ODg0OTgzLCAweGYyYTRjN2M1KSwgU1RDUCgweDA5NGYxM2RmLCAweGY3OWMwMWJmKX0sCisgICAge1NUQ1AoMHhiNDQ2YmUwYiwgMHg2NzMyY2ZjYSksIFNUQ1AoMHgwYTc0Mzc1MiwgMHhmOTIyMGRmYSksCisgICAgIFNUQ1AoMHgwNDI2MzcyMiwgMHgwYTA0NmEyYyksIFNUQ1AoMHgwOGNlZDgwYiwgMHgwMzQ3ZTljMil9LAorICAgIHtTVENQKDB4OWMzYjEyMDIsIDB4NTAzMDE4YTUpLCBTVENQKDB4MDVmY2YwMWEsIDB4MDVjZDg1MjkpLAorICAgICBTVENQKDB4Zjk1MjYzZTIsIDB4ZmQzYmRiM2YpLCBTVENQKDB4MDBjNjhjZjksIDB4MDYzN2NiN2YpfSwKKyAgICB7U1RDUCgweDhhZWUyNzEwLCAweDMzYzE4N2VjKSwgU1RDUCgweGZkZDI1M2Y4LCAweDAzOGUwOWI5KSwKKyAgICAgU1RDUCgweDAzNTZjZTBmLCAweGZlOWRlZDlmKSwgU1RDUCgweGZkNmMzMDU0LCAweDAxYzgwNjBhKX19OworCitjb25zdCBGSVhQX0RFQ09SUiBEZWNvcnJOdW1lcmF0b3JSZWFsMF9VU0FDCisgICAgW01BWF9ERUNPUlJfU0VFRF9VU0FDXVtERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMF9VU0FDICsgMV0gPSB7CisgICAgICAgIHtERUNPUlIoMHgwNWJmNDg4MCksIERFQ09SUigweDA4MzIxYzAwKSwgREVDT1JSKDB4ZTkzMTVlZTApLAorICAgICAgICAgREVDT1JSKDB4MDdkOWRkMjApLCBERUNPUlIoMHgwMjIyNDk5NCksIERFQ09SUigweDAwMDlkMjAwKSwKKyAgICAgICAgIERFQ09SUigweGY4YTI5MzU4KSwgREVDT1JSKDB4ZjRlMzEwZDApLCBERUNPUlIoMHhlZjkwMWZjMCksCisgICAgICAgICBERUNPUlIoMHhlYmRhMDQ2MCksIERFQ09SUigweDQwMDAwMDAwKX19OworCitjb25zdCBGSVhQX0RFQ09SUiBEZWNvcnJOdW1lcmF0b3JSZWFsMV9VU0FDCisgICAgW01BWF9ERUNPUlJfU0VFRF9VU0FDXVtERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMV9VU0FDICsgMV0gPSB7CisgICAgICAgIHtERUNPUlIoMHhmODJmODM3OCksIERFQ09SUigweGZlZjU4OGMyKSwgREVDT1JSKDB4MDJlZGRiZDgpLAorICAgICAgICAgREVDT1JSKDB4MDQxYzI0NTApLCBERUNPUlIoMHhmN2VkY2Q2MCksIERFQ09SUigweDA3ZTI5MzEwKSwKKyAgICAgICAgIERFQ09SUigweGZhNGVjZTQ4KSwgREVDT1JSKDB4ZWQ5ZjhhMjApLCBERUNPUlIoMHg0MDAwMDAwMCl9fTsKKworLyogaWRlbnRpY2FsIHRvIE1QUyBjb2VmZnMgZm9yIHJldmVyYiBiYW5kIDM6IERlY29yck51bWVyYXRvclJlYWwzWzBdICovCitjb25zdCBGSVhQX0RFQ09SUgorICAgIERlY29yck51bWVyYXRvclJlYWwyX1VTQUNbTUFYX0RFQ09SUl9TRUVEX1VTQUNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMl9VU0FDICsgMV0gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REVDT1JSKDB4MDI0OGU4YTgpLCBERUNPUlIoMHhmZGU5NTgzOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MDg0ODIzYzApLCBERUNPUlIoMHg0MDAwMDAwMCl9fTsKKworY29uc3QgRklYUF9ERUNPUlIKKyAgICBEZWNvcnJOdW1lcmF0b3JSZWFsM19VU0FDW01BWF9ERUNPUlJfU0VFRF9VU0FDXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzNfVVNBQyArIDFdID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RFQ09SUigweGZmMmIwMjBjKSwgREVDT1JSKDB4MDIzOTM4MzApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDQwMDAwMDAwKX19OworCisvKiBjb25zdCBGSVhQX0RFQ09SUiBEZWNvcnJOdW1lcmF0b3JSZWFsMF9MRFtNQVhfREVDT1JSX1NFRURfTERdW10gZG9lcyBub3QKKyAqIGV4aXN0ICovCisKK1JBTV9BTElHTgorY29uc3QgRklYUF9ERUNPUlIgRGVjb3JyTnVtZXJhdG9yUmVhbDFfTERbTUFYX0RFQ09SUl9TRUVEX0xEXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzFfTEQgKyAxXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmMzEwY2IyOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MTkzMmQ3NDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDBjYzJkOTE3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhkZGRlMDY0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZjIzNGE2MjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDE5ODU1MWE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgxNzE0MWI2YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZjI5ODgwM2QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGVmOThiZTkyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwOWVhMTcwNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MjhmYmRmZjQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDFhODY5ZWI5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhkZWVmZTE0NyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4Y2RlMmFkZGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDEzZGRjNjE5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHg0MDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDA0MWQ3ZGJmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwMWI3MzA5YyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZmI1OTk4MzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDA5MmZjNWVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmMmZkN2MyNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZGQ1MWUyZWIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGY2MmZlNzJiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwYjE1ZDU4OCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZjFmMDkxYTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGVkMWJiYmZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwMzUyNjg5OSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MTgwY2IyNTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGVjZjE0MzNkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmNjI2YWI5NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MTk3ZGQyN2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDQwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MTU3YTc4NmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDAwMjhjOThjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmNWVmZjU3YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MTFmN2QwNGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGYzOTBkMjhkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgxODk0NzA4MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZTVkYzIzMTkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGY0Y2MwMjM1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgyMzk0ZDQ3ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZTA2OTIzMGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDAzYTFhNzczKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmYmM5YjA5MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MTVhMDE3M2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDBlOWVjZGYwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhkMzA5YjJjNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4NDAwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhlMGNlNzAzYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZTUwOGI2NzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGVmMzYyMzk4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmZmU3ODhlZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MmZkYTM3NDkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDQ2NzFjMGM2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgzYzAwMzQ5NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MjM4NzcwN2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGQyMTA3ZDJlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhiM2U0N2UwOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4YWNkMGFiY2EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGM3MDc5MWRmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwYjU4NmU4NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MmYxMWNkYTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDNhNGEyMTBiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHg0MDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorfTsKKworUkFNX0FMSUdOCitjb25zdCBGSVhQX0RFQ09SUiBEZWNvcnJOdW1lcmF0b3JSZWFsMl9MRFtNQVhfREVDT1JSX1NFRURfTERdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMl9MRCArIDEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSX1pFUk9fUEFERElOR10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZmZiNGEyMzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDAxYWM3MWEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmMmJjYTAxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZmUzZDc1OTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDA5M2U5OTc2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmMmM1ZjNmNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4NDAwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhlMzAzYWZiOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4Y2Q3MGMyYmIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGYxZTJhZDdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwYzhmZmJlMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MjFmODBhYmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDNkMDg0MTBjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHg0MDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGUyNjgwOWQ1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwZWZiY2ZhNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MjEwYzFhOTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGZlNjBhZjRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhlZGEwMWE1MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MDBmYWY0NjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDQwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MWVkYzVkNjQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGU1YjJlMzVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhlOTRiMWM0NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MzBhNmYxZTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGYwNGU1MmRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhlMzBkZTQ1YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4NDAwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKK307CisKK1JBTV9BTElHTgorY29uc3QgRklYUF9ERUNPUlIgRGVjb3JyTnVtZXJhdG9yUmVhbDNfTERbTUFYX0RFQ09SUl9TRUVEX0xEXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzNfTEQgKyAxXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwMjQ4ZThhNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZmRlOTU4M2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDA4NDgyM2JiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHg0MDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDFkYjIyZDBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmYzc3Mzk5MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MGU4MTlhNzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDQwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MGZjYjkyM2EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDAxNTRiN2ZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhlNzBjYjY0NyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4NDAwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhlMzlmNTU5YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZTA2ZGQ2Y2EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDE5ZjcxZjcxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHg0MDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorfTsKKworRklYUF9EQkwgKmdldEFkZHJEaXJlY3RTaWduYWxNYXhWYWwoSEFORExFX0RFQ09SUl9ERUMgc2VsZikgeworICByZXR1cm4gJihzZWxmLT5kdWNrZXIubWF4VmFsRGlyZWN0RGF0YSk7Cit9CisKK3N0YXRpYyBJTlQgRGVjb3JyRmlsdGVySW5pdChERUNPUlJfRklMVEVSX0lOU1RBTkNFICpjb25zdCBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfTVBTICpwU3RhdGVCdWZmZXJDcGx4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwRGVsYXlCdWZmZXJDcGx4LCBJTlQgKm9mZnNldFN0YXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqb2Zmc2V0RGVsYXlCdWZmZXIsIElOVCBjb25zdCBkZWNvcnJfc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY29uc3QgcmV2ZXJiX2JhbmQsIElOVCBjb25zdCB1c2VGcmFjdERlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjb25zdCBub1NhbXBsZURlbGF5LCBJTlQgY29uc3QgZmlsdGVyT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLX0RFQ09SUl9UWVBFIGNvbnN0IGRlY29yclR5cGUpIHsKKyAgSU5UIGVycm9yQ29kZSA9IDA7CisgIHN3aXRjaCAoZGVjb3JyVHlwZSkgeworICAgIGNhc2UgREVDT1JSX1VTQUM6CisgICAgICBpZiAodXNlRnJhY3REZWxheSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZES19BU1NFUlQoZGVjb3JyX3NlZWQgPT0gMCk7CisKKyAgICAgICAgc3dpdGNoIChyZXZlcmJfYmFuZCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHNlbGYtPm51bWVyYXRvclJlYWwgPSBEZWNvcnJOdW1lcmF0b3JSZWFsMF9VU0FDW2RlY29ycl9zZWVkXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHNlbGYtPm51bWVyYXRvclJlYWwgPSBEZWNvcnJOdW1lcmF0b3JSZWFsMV9VU0FDW2RlY29ycl9zZWVkXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHNlbGYtPm51bWVyYXRvclJlYWwgPSBEZWNvcnJOdW1lcmF0b3JSZWFsMl9VU0FDW2RlY29ycl9zZWVkXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHNlbGYtPm51bWVyYXRvclJlYWwgPSBEZWNvcnJOdW1lcmF0b3JSZWFsM19VU0FDW2RlY29ycl9zZWVkXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERFQ09SUl9MRDoKKyAgICAgIEZES19BU1NFUlQoZGVjb3JyX3NlZWQgPCBNQVhfREVDT1JSX1NFRURfTEQpOworICAgICAgc3dpdGNoIChyZXZlcmJfYmFuZCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgc2VsZi0+bnVtZXJhdG9yUmVhbCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBzZWxmLT5udW1lcmF0b3JSZWFsID0gRGVjb3JyTnVtZXJhdG9yUmVhbDFfTERbZGVjb3JyX3NlZWRdOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgc2VsZi0+bnVtZXJhdG9yUmVhbCA9IERlY29yck51bWVyYXRvclJlYWwyX0xEW2RlY29ycl9zZWVkXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIHNlbGYtPm51bWVyYXRvclJlYWwgPSBEZWNvcnJOdW1lcmF0b3JSZWFsM19MRFtkZWNvcnJfc2VlZF07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDE7CisgIH0KKworICBzZWxmLT5zdGF0ZUNwbHggPSBwU3RhdGVCdWZmZXJDcGx4ICsgKCpvZmZzZXRTdGF0ZUJ1ZmZlcik7CisgICpvZmZzZXRTdGF0ZUJ1ZmZlciArPSAyICogZmlsdGVyT3JkZXI7CisgIHNlbGYtPkRlbGF5QnVmZmVyQ3BseCA9IHBEZWxheUJ1ZmZlckNwbHggKyAoKm9mZnNldERlbGF5QnVmZmVyKTsKKyAgKm9mZnNldERlbGF5QnVmZmVyICs9IDIgKiBub1NhbXBsZURlbGF5OworCisgIHJldHVybiBlcnJvckNvZGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVCBEZWNvcnJGaWx0ZXJJbml0UFMoREVDT1JSX0ZJTFRFUl9JTlNUQU5DRSAqY29uc3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfTVBTICpwU3RhdGVCdWZmZXJDcGx4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBEZWxheUJ1ZmZlckNwbHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm9mZnNldFN0YXRlQnVmZmVyLCBJTlQgKm9mZnNldERlbGF5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNvbnN0IGh5YnJpZEJhbmQsIElOVCBjb25zdCByZXZlcmJCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNvbnN0IG5vU2FtcGxlRGVsYXkpIHsKKyAgSU5UIGVycm9yQ29kZSA9IDA7CisKKyAgaWYgKHJldmVyYkJhbmQgPT0gMCkgeworICAgIHNlbGYtPmNvZWZmc1BhY2tlZCA9IERlY29yclBzQ29lZmZzQ3BseFtoeWJyaWRCYW5kXTsKKworICAgIHNlbGYtPnN0YXRlQ3BseCA9IHBTdGF0ZUJ1ZmZlckNwbHggKyAoKm9mZnNldFN0YXRlQnVmZmVyKTsKKyAgICAqb2Zmc2V0U3RhdGVCdWZmZXIgKz0gMiAqIERFQ09SUl9GSUxURVJfT1JERVJfUFM7CisgIH0KKworICBzZWxmLT5EZWxheUJ1ZmZlckNwbHggPSBwRGVsYXlCdWZmZXJDcGx4ICsgKCpvZmZzZXREZWxheUJ1ZmZlcik7CisgICpvZmZzZXREZWxheUJ1ZmZlciArPSAyICogbm9TYW1wbGVEZWxheTsKKworICByZXR1cm4gZXJyb3JDb2RlOworfQorCitMTktfU0VDVElPTl9DT0RFX0wxCitzdGF0aWMgSU5UIERlY29yckZpbHRlckFwcGx5UEFTUyhERUNPUlJfRklMVEVSX0lOU1RBTkNFIGNvbnN0IGZpbHRlcltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRhdGFSZWFsSW4sIEZJWFBfREJMICpkYXRhSW1hZ0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRhdGFSZWFsT3V0LCBGSVhQX0RCTCAqZGF0YUltYWdPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnQsIElOVCBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJldmVyYkJhbmROb1NhbXBsZURlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4KSB7CisgIElOVCBpOworICBJTlQgb2Zmc2V0ID0gMiAqIHJldmVyYkJhbmROb1NhbXBsZURlbGF5OworICBGSVhQX01QUyAqcERlbGF5QnVmZmVyID0KKyAgICAgICZmaWx0ZXJbc3RhcnRdLkRlbGF5QnVmZmVyQ3BseFtyZXZlcmJCYW5kRGVsYXlCdWZmZXJJbmRleF07CisKKyAgLyogTWVtb3J5IGZvciB0aGUgZGVsYXlsaW5lIGhhcyBiZWVuIGFsbG9jYXRlZCBpbiBhIGNvbnNlY3V0aXZlIG9yZGVyLCBzbyB3ZQorICAgICBjYW4gYWRkcmVzcyBmcm9tIGZpbHRlciB0byBmaWx0ZXIgd2l0aCBhIGNvbnN0YW50IGxlbmd0aC4KKyAgICAgQmUgYXdhcmUgdGhhdCByZWFsIGFuZCBpbWFnaW5hcnkgcGFydCBvZiB0aGUgZGVsYXlsaW5lIGFyZSBzdG9yZWQgaW4KKyAgICAgaW50ZXJsZWF2ZWQgb3JkZXIuCisgICovCisgIGlmIChkYXRhSW1hZ0luID09IE5VTEwpIHsKKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3A7IGkrKykgeworICAgICAgRklYUF9EQkwgdG1wOworCisgICAgICB0bXAgPSAqcERlbGF5QnVmZmVyOworICAgICAgKnBEZWxheUJ1ZmZlciA9IGRhdGFSZWFsSW5baV07CisgICAgICBkYXRhUmVhbE91dFtpXSA9IHRtcDsKKyAgICAgIHBEZWxheUJ1ZmZlciArPSBvZmZzZXQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICgoaSA9IHN0b3AgLSBzdGFydCkgIT0gMCkgeworICAgICAgZGF0YVJlYWxJbiArPSBzdGFydDsKKyAgICAgIGRhdGFJbWFnSW4gKz0gc3RhcnQ7CisgICAgICBkYXRhUmVhbE91dCArPSBzdGFydDsKKyAgICAgIGRhdGFJbWFnT3V0ICs9IHN0YXJ0OworI2lmZGVmIEZVTkNUSU9OX0RlY29yckZpbHRlckFwcGx5UEFTU19mdW5jMQorICAgICAgRGVjb3JyRmlsdGVyQXBwbHlQQVNTX2Z1bmMxKGksIGRhdGFSZWFsSW4sIGRhdGFJbWFnSW4sIGRhdGFSZWFsT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFJbWFnT3V0LCBwRGVsYXlCdWZmZXIsIG9mZnNldCk7CisjZWxzZQorICAgICAgZG8geworICAgICAgICBGSVhQX0RCTCBkZWxheV9yZSwgZGVsYXlfaW0sIHJlYWwsIGltYWc7CisKKyAgICAgICAgcmVhbCA9ICpkYXRhUmVhbEluKys7CisgICAgICAgIGltYWcgPSAqZGF0YUltYWdJbisrOworICAgICAgICBkZWxheV9yZSA9IHBEZWxheUJ1ZmZlclswXTsKKyAgICAgICAgZGVsYXlfaW0gPSBwRGVsYXlCdWZmZXJbMV07CisgICAgICAgIHBEZWxheUJ1ZmZlclswXSA9IHJlYWw7CisgICAgICAgIHBEZWxheUJ1ZmZlclsxXSA9IGltYWc7CisgICAgICAgICpkYXRhUmVhbE91dCsrID0gZGVsYXlfcmU7CisgICAgICAgICpkYXRhSW1hZ091dCsrID0gZGVsYXlfaW07CisgICAgICAgIHBEZWxheUJ1ZmZlciArPSBvZmZzZXQ7CisgICAgICB9IHdoaWxlICgtLWkgIT0gMCk7CisjZW5kaWYKKyAgICB9CisgIH0KKworICByZXR1cm4gKElOVCkwOworfQorCisjaWZuZGVmIEZVTkNUSU9OX0RlY29yckZpbHRlckFwcGx5UkVBTAorTE5LX1NFQ1RJT05fQ09ERV9MMQorc3RhdGljIElOVCBEZWNvcnJGaWx0ZXJBcHBseVJFQUwoREVDT1JSX0ZJTFRFUl9JTlNUQU5DRSBjb25zdCBmaWx0ZXJbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkYXRhUmVhbEluLCBGSVhQX0RCTCAqZGF0YUltYWdJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkYXRhUmVhbE91dCwgRklYUF9EQkwgKmRhdGFJbWFnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0LCBJTlQgc3RvcCwgSU5UIHJldmVyYkZpbHRlck9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJldmVyYkJhbmROb1NhbXBsZURlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4KSB7CisgIElOVCBpLCBqOworICBGSVhQX0RCTCB4UmVhbCwgeEltYWcsIHlSZWFsLCB5SW1hZzsKKworICBjb25zdCBGSVhQX0RFQ09SUiAqcEZpbHRlciA9IGZpbHRlcltzdGFydF0ubnVtZXJhdG9yUmVhbDsKKworICBJTlQgb2Zmc2V0RGVsYXlCdWZmZXIgPSAoMiAqIHJldmVyYkJhbmROb1NhbXBsZURlbGF5KSAtIDE7CisgIEZJWFBfTVBTICpwRGVsYXlCdWZmZXIgPQorICAgICAgJmZpbHRlcltzdGFydF0uRGVsYXlCdWZmZXJDcGx4W3JldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4XTsKKworICBJTlQgb2Zmc2V0U3RhdGVzID0gMiAqIHJldmVyYkZpbHRlck9yZGVyOworICBGSVhQX0RCTCAqcFN0YXRlcyA9IGZpbHRlcltzdGFydF0uc3RhdGVDcGx4OworCisgIC8qIE1lbW9yeSBmb3IgdGhlIGRlbGF5bGluZSBoYXMgYmVlbiBhbGxvY2F0ZWQgaW4gYSBjb25zZWN1dGl2ZSBvcmRlciwgc28gd2UKKyAgICAgY2FuIGFkZHJlc3MgZnJvbSBmaWx0ZXIgdG8gZmlsdGVyIHdpdGggYSBjb25zdGFudCBsZW5ndGguIFRoZSBzYW1lIGlzIHZhbGlkCisgICAgIGZvciB0aGUgc3RhdGVzLgorICAgICBCZSBhd2FyZSB0aGF0IHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBkZWxheWxpbmUgYW5kIHRoZSBzdGF0ZXMgYXJlCisgICAgIHN0b3JlZCBpbiBpbnRlcmxlYXZlZCBvcmRlci4KKyAgICAgQWxsIGZpbHRlciBpbiBhIHJldmVyYiBiYW5kIGhhdmUgdGhlIHNhbWUgZmlsdGVyIGNvZWZmaWNpZW50cy4KKyAgICAgRXhwbG9pdCBzeW1tZXRyeTogbnVtZXJhdG9yUmVhbFtpXSA9CisgICAgIGRlbm9taW5hdG9yUmVhbFtyZXZlcmJGaWx0ZXJMZW5ndGgtMS1pXSBEbyBub3QgYWNjdW11bGF0ZSB0aGUgaGlnaGVzdAorICAgICBzdGF0ZXMgd2hpY2ggYXJlIGFsd2F5cyB6ZXJvLgorICAqLworICBpZiAocmV2ZXJiRmlsdGVyT3JkZXIgPT0gMikgeworICAgIEZJWFBfREVDT1JSIG5GaWx0MEwsIG5GaWx0MEg7CisKKyAgICBuRmlsdDBMID0gcEZpbHRlclswXTsKKyAgICBuRmlsdDBIID0gcEZpbHRlclsxXTsKKworICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSsrKSB7CisgICAgICB4UmVhbCA9ICpwRGVsYXlCdWZmZXI7CisgICAgICAqcERlbGF5QnVmZmVyID0gZGF0YVJlYWxJbltpXTsKKyAgICAgIHBEZWxheUJ1ZmZlcisrOworCisgICAgICB4SW1hZyA9ICpwRGVsYXlCdWZmZXI7CisgICAgICAqcERlbGF5QnVmZmVyID0gZGF0YUltYWdJbltpXTsKKyAgICAgIHBEZWxheUJ1ZmZlciArPSBvZmZzZXREZWxheUJ1ZmZlcjsKKworICAgICAgeVJlYWwgPSAocFN0YXRlc1swXSArIGZNdWx0RGl2Mih4UmVhbCwgbkZpbHQwTCkpIDw8IEZJTFRFUl9TRjsKKyAgICAgIHlJbWFnID0gKHBTdGF0ZXNbMV0gKyBmTXVsdERpdjIoeEltYWcsIG5GaWx0MEwpKSA8PCBGSUxURVJfU0Y7CisKKyAgICAgIGRhdGFSZWFsT3V0W2ldID0geVJlYWw7CisgICAgICBkYXRhSW1hZ091dFtpXSA9IHlJbWFnOworCisgICAgICBwU3RhdGVzWzBdID0KKyAgICAgICAgICBwU3RhdGVzWzJdICsgZk11bHREaXYyKHhSZWFsLCBuRmlsdDBIKSAtIGZNdWx0RGl2Mih5UmVhbCwgbkZpbHQwSCk7CisgICAgICBwU3RhdGVzWzFdID0KKyAgICAgICAgICBwU3RhdGVzWzNdICsgZk11bHREaXYyKHhJbWFnLCBuRmlsdDBIKSAtIGZNdWx0RGl2Mih5SW1hZywgbkZpbHQwSCk7CisgICAgICBwU3RhdGVzWzJdID0gKHhSZWFsID4+IEZJTFRFUl9TRikgLSBmTXVsdERpdjIoeVJlYWwsIG5GaWx0MEwpOworICAgICAgcFN0YXRlc1szXSA9ICh4SW1hZyA+PiBGSUxURVJfU0YpIC0gZk11bHREaXYyKHlJbWFnLCBuRmlsdDBMKTsKKyAgICAgIHBTdGF0ZXMgKz0gb2Zmc2V0U3RhdGVzOworICAgIH0KKyAgfSBlbHNlIGlmIChyZXZlcmJGaWx0ZXJPcmRlciA9PSAzKSB7CisgICAgRklYUF9ERUNPUlIgbkZpbHQwTCwgbkZpbHQwSCwgbkZpbHQxTDsKKworICAgIG5GaWx0MEwgPSBwRmlsdGVyWzBdOworICAgIG5GaWx0MEggPSBwRmlsdGVyWzFdOworICAgIG5GaWx0MUwgPSBwRmlsdGVyWzJdOworCisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpKyspIHsKKyAgICAgIHhSZWFsID0gKnBEZWxheUJ1ZmZlcjsKKyAgICAgICpwRGVsYXlCdWZmZXIgPSBkYXRhUmVhbEluW2ldOworICAgICAgcERlbGF5QnVmZmVyKys7CisKKyAgICAgIHhJbWFnID0gKnBEZWxheUJ1ZmZlcjsKKyAgICAgICpwRGVsYXlCdWZmZXIgPSBkYXRhSW1hZ0luW2ldOworICAgICAgcERlbGF5QnVmZmVyICs9IG9mZnNldERlbGF5QnVmZmVyOworCisgICAgICB5UmVhbCA9IChwU3RhdGVzWzBdICsgZk11bHREaXYyKHhSZWFsLCBuRmlsdDBMKSkgPDwgRklMVEVSX1NGOworICAgICAgeUltYWcgPSAocFN0YXRlc1sxXSArIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQwTCkpIDw8IEZJTFRFUl9TRjsKKworICAgICAgZGF0YVJlYWxPdXRbaV0gPSB5UmVhbDsKKyAgICAgIGRhdGFJbWFnT3V0W2ldID0geUltYWc7CisKKyAgICAgIHBTdGF0ZXNbMF0gPQorICAgICAgICAgIHBTdGF0ZXNbMl0gKyBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MEgpIC0gZk11bHREaXYyKHlSZWFsLCBuRmlsdDFMKTsKKyAgICAgIHBTdGF0ZXNbMV0gPQorICAgICAgICAgIHBTdGF0ZXNbM10gKyBmTXVsdERpdjIoeEltYWcsIG5GaWx0MEgpIC0gZk11bHREaXYyKHlJbWFnLCBuRmlsdDFMKTsKKyAgICAgIHBTdGF0ZXNbMl0gPQorICAgICAgICAgIHBTdGF0ZXNbNF0gKyBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MUwpIC0gZk11bHREaXYyKHlSZWFsLCBuRmlsdDBIKTsKKyAgICAgIHBTdGF0ZXNbM10gPQorICAgICAgICAgIHBTdGF0ZXNbNV0gKyBmTXVsdERpdjIoeEltYWcsIG5GaWx0MUwpIC0gZk11bHREaXYyKHlJbWFnLCBuRmlsdDBIKTsKKyAgICAgIHBTdGF0ZXNbNF0gPSAoeFJlYWwgPj4gRklMVEVSX1NGKSAtIGZNdWx0RGl2Mih5UmVhbCwgbkZpbHQwTCk7CisgICAgICBwU3RhdGVzWzVdID0gKHhJbWFnID4+IEZJTFRFUl9TRikgLSBmTXVsdERpdjIoeUltYWcsIG5GaWx0MEwpOworICAgICAgcFN0YXRlcyArPSBvZmZzZXRTdGF0ZXM7CisgICAgfQorICB9IGVsc2UgaWYgKHJldmVyYkZpbHRlck9yZGVyID09IDYpIHsKKyAgICBGSVhQX0RFQ09SUiBuRmlsdDBMLCBuRmlsdDBILCBuRmlsdDFMLCBuRmlsdDFILCBuRmlsdDJMLCBuRmlsdDJIOworCisgICAgbkZpbHQwTCA9IHBGaWx0ZXJbMF07CisgICAgbkZpbHQwSCA9IHBGaWx0ZXJbMV07CisgICAgbkZpbHQxTCA9IHBGaWx0ZXJbMl07CisgICAgbkZpbHQxSCA9IHBGaWx0ZXJbM107CisgICAgbkZpbHQyTCA9IHBGaWx0ZXJbNF07CisgICAgbkZpbHQySCA9IHBGaWx0ZXJbNV07CisKKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3A7IGkrKykgeworICAgICAgeFJlYWwgPSAqcERlbGF5QnVmZmVyOworICAgICAgKnBEZWxheUJ1ZmZlciA9IGRhdGFSZWFsSW5baV07CisgICAgICBwRGVsYXlCdWZmZXIrKzsKKworICAgICAgeEltYWcgPSAqcERlbGF5QnVmZmVyOworICAgICAgKnBEZWxheUJ1ZmZlciA9IGRhdGFJbWFnSW5baV07CisgICAgICBwRGVsYXlCdWZmZXIgKz0gb2Zmc2V0RGVsYXlCdWZmZXI7CisKKyAgICAgIHlSZWFsID0gKHBTdGF0ZXNbMF0gKyBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MEwpKSA8PCBGSUxURVJfU0Y7CisgICAgICB5SW1hZyA9IChwU3RhdGVzWzFdICsgZk11bHREaXYyKHhJbWFnLCBuRmlsdDBMKSkgPDwgRklMVEVSX1NGOworICAgICAgZGF0YVJlYWxPdXRbaV0gPSB5UmVhbDsKKyAgICAgIGRhdGFJbWFnT3V0W2ldID0geUltYWc7CisKKyAgICAgIHBTdGF0ZXNbMF0gPQorICAgICAgICAgIHBTdGF0ZXNbMl0gKyBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MEgpIC0gZk11bHREaXYyKHlSZWFsLCBuRmlsdDJIKTsKKyAgICAgIHBTdGF0ZXNbMV0gPQorICAgICAgICAgIHBTdGF0ZXNbM10gKyBmTXVsdERpdjIoeEltYWcsIG5GaWx0MEgpIC0gZk11bHREaXYyKHlJbWFnLCBuRmlsdDJIKTsKKyAgICAgIHBTdGF0ZXNbMl0gPQorICAgICAgICAgIHBTdGF0ZXNbNF0gKyBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MUwpIC0gZk11bHREaXYyKHlSZWFsLCBuRmlsdDJMKTsKKyAgICAgIHBTdGF0ZXNbM10gPQorICAgICAgICAgIHBTdGF0ZXNbNV0gKyBmTXVsdERpdjIoeEltYWcsIG5GaWx0MUwpIC0gZk11bHREaXYyKHlJbWFnLCBuRmlsdDJMKTsKKyAgICAgIHBTdGF0ZXNbNF0gPQorICAgICAgICAgIHBTdGF0ZXNbNl0gKyBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MUgpIC0gZk11bHREaXYyKHlSZWFsLCBuRmlsdDFIKTsKKyAgICAgIHBTdGF0ZXNbNV0gPQorICAgICAgICAgIHBTdGF0ZXNbN10gKyBmTXVsdERpdjIoeEltYWcsIG5GaWx0MUgpIC0gZk11bHREaXYyKHlJbWFnLCBuRmlsdDFIKTsKKyAgICAgIHBTdGF0ZXNbNl0gPQorICAgICAgICAgIHBTdGF0ZXNbOF0gKyBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MkwpIC0gZk11bHREaXYyKHlSZWFsLCBuRmlsdDFMKTsKKyAgICAgIHBTdGF0ZXNbN10gPQorICAgICAgICAgIHBTdGF0ZXNbOV0gKyBmTXVsdERpdjIoeEltYWcsIG5GaWx0MkwpIC0gZk11bHREaXYyKHlJbWFnLCBuRmlsdDFMKTsKKyAgICAgIHBTdGF0ZXNbOF0gPQorICAgICAgICAgIHBTdGF0ZXNbMTBdICsgZk11bHREaXYyKHhSZWFsLCBuRmlsdDJIKSAtIGZNdWx0RGl2Mih5UmVhbCwgbkZpbHQwSCk7CisgICAgICBwU3RhdGVzWzldID0KKyAgICAgICAgICBwU3RhdGVzWzExXSArIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQySCkgLSBmTXVsdERpdjIoeUltYWcsIG5GaWx0MEgpOworICAgICAgcFN0YXRlc1sxMF0gPSAoeFJlYWwgPj4gRklMVEVSX1NGKSAtIGZNdWx0RGl2Mih5UmVhbCwgbkZpbHQwTCk7CisgICAgICBwU3RhdGVzWzExXSA9ICh4SW1hZyA+PiBGSUxURVJfU0YpIC0gZk11bHREaXYyKHlJbWFnLCBuRmlsdDBMKTsKKyAgICAgIHBTdGF0ZXMgKz0gb2Zmc2V0U3RhdGVzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGSVhQX0RFQ09SUiBuRmlsdDBMLCBuRmlsdDBIOworICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSsrKSB7CisgICAgICB4UmVhbCA9ICpwRGVsYXlCdWZmZXI7CisgICAgICAqcERlbGF5QnVmZmVyID0gZGF0YVJlYWxJbltpXTsKKyAgICAgIHBEZWxheUJ1ZmZlcisrOworCisgICAgICB4SW1hZyA9ICpwRGVsYXlCdWZmZXI7CisgICAgICAqcERlbGF5QnVmZmVyID0gZGF0YUltYWdJbltpXTsKKyAgICAgIHBEZWxheUJ1ZmZlciArPSBvZmZzZXREZWxheUJ1ZmZlcjsKKworICAgICAgbkZpbHQwTCA9IHBGaWx0ZXJbMF07CisgICAgICB5UmVhbCA9IChwU3RhdGVzWzBdICsgZk11bHREaXYyKHhSZWFsLCBuRmlsdDBMKSkgPDwgMjsKKyAgICAgIHlJbWFnID0gKHBTdGF0ZXNbMV0gKyBmTXVsdERpdjIoeEltYWcsIG5GaWx0MEwpKSA8PCAyOworICAgICAgZGF0YVJlYWxPdXRbaV0gPSB5UmVhbDsKKyAgICAgIGRhdGFJbWFnT3V0W2ldID0geUltYWc7CisKKyAgICAgIGZvciAoaiA9IDE7IGogPCByZXZlcmJGaWx0ZXJPcmRlcjsgaisrKSB7CisgICAgICAgIG5GaWx0MEwgPSBwRmlsdGVyW2pdOworICAgICAgICBuRmlsdDBIID0gcEZpbHRlcltyZXZlcmJGaWx0ZXJPcmRlciAtIGpdOworICAgICAgICBwU3RhdGVzWzIgKiBqIC0gMl0gPSBwU3RhdGVzWzIgKiBqXSArIGZNdWx0RGl2Mih4UmVhbCwgbkZpbHQwTCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoeVJlYWwsIG5GaWx0MEgpOworICAgICAgICBwU3RhdGVzWzIgKiBqIC0gMV0gPSBwU3RhdGVzWzIgKiBqICsgMV0gKyBmTXVsdERpdjIoeEltYWcsIG5GaWx0MEwpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKHlJbWFnLCBuRmlsdDBIKTsKKyAgICAgIH0KKyAgICAgIG5GaWx0MEwgPSBwRmlsdGVyW2pdOworICAgICAgbkZpbHQwSCA9IHBGaWx0ZXJbcmV2ZXJiRmlsdGVyT3JkZXIgLSBqXTsKKyAgICAgIHBTdGF0ZXNbMiAqIGogLSAyXSA9CisgICAgICAgICAgZk11bHREaXYyKHhSZWFsLCBuRmlsdDBMKSAtIGZNdWx0RGl2Mih5UmVhbCwgbkZpbHQwSCk7CisgICAgICBwU3RhdGVzWzIgKiBqIC0gMV0gPQorICAgICAgICAgIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQwTCkgLSBmTXVsdERpdjIoeUltYWcsIG5GaWx0MEgpOworCisgICAgICBwU3RhdGVzICs9IG9mZnNldFN0YXRlczsKKyAgICB9CisgIH0KKworICByZXR1cm4gKElOVCkwOworfQorI2VuZGlmIC8qICNpZm5kZWYgRlVOQ1RJT05fRGVjb3JyRmlsdGVyQXBwbHlSRUFMICovCisKKyNpZm5kZWYgRlVOQ1RJT05fRGVjb3JyRmlsdGVyQXBwbHlDUExYX1BTCitMTktfU0VDVElPTl9DT0RFX0wxCitzdGF0aWMgSU5UIERlY29yckZpbHRlckFwcGx5Q1BMWF9QUygKKyAgICBERUNPUlJfRklMVEVSX0lOU1RBTkNFIGNvbnN0IGZpbHRlcltdLCBGSVhQX0RCTCAqZGF0YVJlYWxJbiwKKyAgICBGSVhQX0RCTCAqZGF0YUltYWdJbiwgRklYUF9EQkwgKmRhdGFSZWFsT3V0LCBGSVhQX0RCTCAqZGF0YUltYWdPdXQsCisgICAgSU5UIHN0YXJ0LCBJTlQgc3RvcCwgSU5UIHJldmVyYkZpbHRlck9yZGVyLCBJTlQgcmV2ZXJiQmFuZE5vU2FtcGxlRGVsYXksCisgICAgSU5UIHJldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4LCBVQ0hBUiAqc3RhdGVCdWZmZXJPZmZzZXQpIHsKKyAgLyogciA9IHJlYWwsIGogPSBpbWFnaW5hcnkgKi8KKyAgRklYUF9EQkwgcl9kYXRhX2EsIGpfZGF0YV9hLCByX2RhdGFfYiwgal9kYXRhX2IsIHJfc3RhZ2VfbXVsdCwgal9zdGFnZV9tdWx0OworICBGSVhQX1NUUCByal9jb2VmZjsKKworICAvKiBnZXQgcG9pbnRlciB0byBjdXJyZW50IHBvc2l0aW9uIGluIGlucHV0IGRlbGF5IGJ1ZmZlciBvZiBmaWx0ZXIgd2l0aAorICAgKiBzdGFydGluZy1pbmRleCAqLworICBGSVhQX0RCTCAqcERlbGF5QnVmZmVyID0KKyAgICAgICZmaWx0ZXJbc3RhcnRdLkRlbGF5QnVmZmVyQ3BseFtyZXZlcmJCYW5kRGVsYXlCdWZmZXJJbmRleF07IC8qIGluY3JlYXNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgMiBldmVyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKi8KKyAgLyogZGV0ZXJtaW5lIHRoZSBpbmNyZW1lbnQgZm9yIHRoaXMgcG9pbnRlciB0byBnZXQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4KKyAgICogdGhlIGRlbGF5IGJ1ZmZlciBvZiB0aGUgbmV4dCBmaWx0ZXIgKi8KKyAgSU5UIG9mZnNldERlbGF5QnVmZmVyID0gKDIgKiByZXZlcmJCYW5kTm9TYW1wbGVEZWxheSkgLSAxOworCisgIC8qIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiBzdGF0ZSBidWZmZXIgKi8KKyAgRklYUF9EQkwgKnBTdGF0ZXMgPSBmaWx0ZXJbc3RhcnRdLnN0YXRlQ3BseDsKKyAgSU5UIHBTdGF0ZXNJbmNyZW1lbnQgPSAyICogcmV2ZXJiRmlsdGVyT3JkZXI7CisKKyAgLyogc3RhdGVCdWZmZXJPZmZzZXQtcG9pbnRlcnMgKi8KKyAgRklYUF9EQkwgKnBTdGF0ZUJ1ZmZlck9mZnNldDAgPSBwU3RhdGVzICsgc3RhdGVCdWZmZXJPZmZzZXRbMF07CisgIEZJWFBfREJMICpwU3RhdGVCdWZmZXJPZmZzZXQxID0gcFN0YXRlcyArIHN0YXRlQnVmZmVyT2Zmc2V0WzFdOworICBGSVhQX0RCTCAqcFN0YXRlQnVmZmVyT2Zmc2V0MiA9IHBTdGF0ZXMgKyBzdGF0ZUJ1ZmZlck9mZnNldFsyXTsKKworICAvKiB0cmF2ZXJzZSBhbGwgaHlicmlkLWJhbmRzIGluYmV0d2VlbiBzdGFydC0gYW5kIHN0b3AtaW5kZXggKi8KKyAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSsrKSB7CisgICAgLyogMS4gaW5wdXQgZGVsYXkgKHJlYWwvaW1hZ2luYXJ5IHZhbHVlcyBpbnRlcmxlYXZlZCkgKi8KKworICAgIC8qIGxvYWQgZGVsYXllZCByZWFsIGlucHV0IHZhbHVlICovCisgICAgcl9kYXRhX2EgPSAqcERlbGF5QnVmZmVyOworICAgIC8qIHN0b3JlIGluY29taW5nIHJlYWwgZGF0YSB2YWx1ZSB0byBkZWxheSBidWZmZXIgYW5kIGluY3JlbWVudCBwb2ludGVyICovCisgICAgKnBEZWxheUJ1ZmZlcisrID0gZGF0YVJlYWxJbltpXTsKKworICAgIC8qIGxvYWQgZGVsYXllZCBpbWFnaW5hcnkgaW5wdXQgdmFsdWUgKi8KKyAgICBqX2RhdGFfYSA9ICpwRGVsYXlCdWZmZXI7CisgICAgLyogc3RvcmUgaW5jb21pbmcgaW1hZ2luYXJ5IGRhdGEgdmFsdWUgdG8gZGVsYXkgYnVmZmVyICovCisgICAgKnBEZWxheUJ1ZmZlciA9IGRhdGFJbWFnSW5baV07CisgICAgLyogaW5jcmVhc2UgZGVsYXkgYnVmZmVyIGJ5IG9mZnNldCAqLworICAgIHBEZWxheUJ1ZmZlciArPSBvZmZzZXREZWxheUJ1ZmZlcjsKKworICAgIC8qIDIuIFBoaShrKS1zdGFnZSAqLworCisgICAgLyogY3JlYXRlIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgdGFibGUgKHJlYWwgYW5kIGltYWdpbmFyeSBjb2VmZmljaWVudHMKKyAgICAgKiBpbnRlcmxlYXZlZCkgKi8KKyAgICBjb25zdCBGSVhQX1NUUCAqcENvZWZmcyA9IGZpbHRlcltpXS5jb2VmZnNQYWNrZWQ7CisKKyAgICAvKiB0aGUgZmlyc3QgdHdvIGVudHJpZXMgb2YgdGhlIGNvZWZmaWNpZW50IHRhYmxlIGFyZSB0aGUKKyAgICAgKiBQaGkoayktbXVsdGlwbGljYW50cyAqLworICAgIHJqX2NvZWZmID0gKnBDb2VmZnMrKzsKKyAgICAvKiBtdWx0aXBseSB2YWx1ZSBmcm9tIGlucHV0IGRlbGF5IGJ1ZmZlciBieSBsb29rZWQtdXAgdmFsdWVzICovCisgICAgY3BseE11bHREaXYyKCZyX2RhdGFfYiwgJmpfZGF0YV9iLCByX2RhdGFfYSwgal9kYXRhX2EsIHJqX2NvZWZmKTsKKworICAgIC8qIDMuIHByb2Nlc3MgYWxsIHRocmVlIGZpbHRlciBzdGFnZXMgKi8KKworICAgIC8qIHN0YWdlIDAgKi8KKworICAgIC8qIGdldCBjb2VmZmljaWVudHMgZnJvbSBsb29rdXAgdGFibGUgKi8KKyAgICByal9jb2VmZiA9ICpwQ29lZmZzKys7CisKKyAgICAvKiBtdWx0aXBseSBvdXRwdXQgb2YgbGFzdCBzdGFnZSBieSBjb2VmZmljaWVudCAqLworICAgIGNwbHhNdWx0RGl2Migmcl9zdGFnZV9tdWx0LCAmal9zdGFnZV9tdWx0LCByX2RhdGFfYiwgal9kYXRhX2IsIHJqX2NvZWZmKTsKKyAgICByX3N0YWdlX211bHQgPDw9IDE7CisgICAgal9zdGFnZV9tdWx0IDw8PSAxOworCisgICAgLyogcmVhZCBhbmQgYWRkIHZhbHVlIGZyb20gc3RhdGUgYnVmZmVyICh0aGlzIGlzIHRoZSBpbnB1dCBmb3IgdGhlIG5leHQKKyAgICAgKiBzdGFnZSkgKi8KKyAgICByX2RhdGFfYSA9IHJfc3RhZ2VfbXVsdCArIHBTdGF0ZUJ1ZmZlck9mZnNldDBbMF07CisgICAgal9kYXRhX2EgPSBqX3N0YWdlX211bHQgKyBwU3RhdGVCdWZmZXJPZmZzZXQwWzFdOworCisgICAgLyogbmVnYXRlIHJfZGF0YV9hIHRvIHBlcmZvcm0gbXVsdGlwbGljYXRpb24gd2l0aCBjb21wbGV4IGNvbmp1Z2F0ZSBvZgorICAgICAqIHJqX2NvZWZmICovCisgICAgY3BseE11bHREaXYyKCZyX3N0YWdlX211bHQsICZqX3N0YWdlX211bHQsIC1yX2RhdGFfYSwgal9kYXRhX2EsIHJqX2NvZWZmKTsKKworICAgIC8qIGFkZCBzdGFnZSBpbnB1dCB0byBzaGlmdGVkIHJlc3VsdCAqLworICAgIHJfc3RhZ2VfbXVsdCA9IHJfZGF0YV9iICsgKHJfc3RhZ2VfbXVsdCA8PCAxKTsKKyAgICBqX3N0YWdlX211bHQgPSBqX2RhdGFfYiAtIChqX3N0YWdlX211bHQgPDwgMSk7CisKKyAgICAvKiBzdG9yZSByZXN1bHQgdG8gc3RhdGUgYnVmZmVyICovCisgICAgcFN0YXRlQnVmZmVyT2Zmc2V0MFswXSA9IHJfc3RhZ2VfbXVsdDsKKyAgICBwU3RhdGVCdWZmZXJPZmZzZXQwWzFdID0gal9zdGFnZV9tdWx0OworICAgIHBTdGF0ZUJ1ZmZlck9mZnNldDAgKz0gcFN0YXRlc0luY3JlbWVudDsKKworICAgIC8qIHN0YWdlIDEgKi8KKworICAgIC8qIGdldCBjb2VmZmljaWVudHMgZnJvbSBsb29rdXAgdGFibGUgKi8KKyAgICByal9jb2VmZiA9ICpwQ29lZmZzKys7CisKKyAgICAvKiBtdWx0aXBseSBvdXRwdXQgb2YgbGFzdCBzdGFnZSBieSBjb2VmZmljaWVudCAqLworICAgIGNwbHhNdWx0RGl2Migmcl9zdGFnZV9tdWx0LCAmal9zdGFnZV9tdWx0LCByX2RhdGFfYSwgal9kYXRhX2EsIHJqX2NvZWZmKTsKKyAgICByX3N0YWdlX211bHQgPDw9IDE7CisgICAgal9zdGFnZV9tdWx0IDw8PSAxOworCisgICAgLyogcmVhZCBhbmQgYWRkIHZhbHVlIGZyb20gc3RhdGUgYnVmZmVyICh0aGlzIGlzIHRoZSBpbnB1dCBmb3IgdGhlIG5leHQKKyAgICAgKiBzdGFnZSkgKi8KKyAgICByX2RhdGFfYiA9IHJfc3RhZ2VfbXVsdCArIHBTdGF0ZUJ1ZmZlck9mZnNldDFbMF07CisgICAgal9kYXRhX2IgPSBqX3N0YWdlX211bHQgKyBwU3RhdGVCdWZmZXJPZmZzZXQxWzFdOworCisgICAgLyogbmVnYXRlIHJfZGF0YV9iIHRvIHBlcmZvcm0gbXVsdGlwbGljYXRpb24gd2l0aCBjb21wbGV4IGNvbmp1Z2F0ZSBvZgorICAgICAqIHJqX2NvZWZmICovCisgICAgY3BseE11bHREaXYyKCZyX3N0YWdlX211bHQsICZqX3N0YWdlX211bHQsIC1yX2RhdGFfYiwgal9kYXRhX2IsIHJqX2NvZWZmKTsKKworICAgIC8qIGFkZCBzdGFnZSBpbnB1dCB0byBzaGlmdGVkIHJlc3VsdCAqLworICAgIHJfc3RhZ2VfbXVsdCA9IHJfZGF0YV9hICsgKHJfc3RhZ2VfbXVsdCA8PCAxKTsKKyAgICBqX3N0YWdlX211bHQgPSBqX2RhdGFfYSAtIChqX3N0YWdlX211bHQgPDwgMSk7CisKKyAgICAvKiBzdG9yZSByZXN1bHQgdG8gc3RhdGUgYnVmZmVyICovCisgICAgcFN0YXRlQnVmZmVyT2Zmc2V0MVswXSA9IHJfc3RhZ2VfbXVsdDsKKyAgICBwU3RhdGVCdWZmZXJPZmZzZXQxWzFdID0gal9zdGFnZV9tdWx0OworICAgIHBTdGF0ZUJ1ZmZlck9mZnNldDEgKz0gcFN0YXRlc0luY3JlbWVudDsKKworICAgIC8qIHN0YWdlIDIgKi8KKworICAgIC8qIGdldCBjb2VmZmljaWVudHMgZnJvbSBsb29rdXAgdGFibGUgKi8KKyAgICByal9jb2VmZiA9ICpwQ29lZmZzKys7CisKKyAgICAvKiBtdWx0aXBseSBvdXRwdXQgb2YgbGFzdCBzdGFnZSBieSBjb2VmZmljaWVudCAqLworICAgIGNwbHhNdWx0RGl2Migmcl9zdGFnZV9tdWx0LCAmal9zdGFnZV9tdWx0LCByX2RhdGFfYiwgal9kYXRhX2IsIHJqX2NvZWZmKTsKKyAgICByX3N0YWdlX211bHQgPDw9IDE7CisgICAgal9zdGFnZV9tdWx0IDw8PSAxOworCisgICAgLyogcmVhZCBhbmQgYWRkIHZhbHVlIGZyb20gc3RhdGUgYnVmZmVyICh0aGlzIGlzIHRoZSBpbnB1dCBmb3IgdGhlIG5leHQKKyAgICAgKiBzdGFnZSkgKi8KKyAgICByX2RhdGFfYSA9IHJfc3RhZ2VfbXVsdCArIHBTdGF0ZUJ1ZmZlck9mZnNldDJbMF07CisgICAgal9kYXRhX2EgPSBqX3N0YWdlX211bHQgKyBwU3RhdGVCdWZmZXJPZmZzZXQyWzFdOworCisgICAgLyogbmVnYXRlIHJfZGF0YV9hIHRvIHBlcmZvcm0gbXVsdGlwbGljYXRpb24gd2l0aCBjb21wbGV4IGNvbmp1Z2F0ZSBvZgorICAgICAqIHJqX2NvZWZmICovCisgICAgY3BseE11bHREaXYyKCZyX3N0YWdlX211bHQsICZqX3N0YWdlX211bHQsIC1yX2RhdGFfYSwgal9kYXRhX2EsIHJqX2NvZWZmKTsKKworICAgIC8qIGFkZCBzdGFnZSBpbnB1dCB0byBzaGlmdGVkIHJlc3VsdCAqLworICAgIHJfc3RhZ2VfbXVsdCA9IHJfZGF0YV9iICsgKHJfc3RhZ2VfbXVsdCA8PCAxKTsKKyAgICBqX3N0YWdlX211bHQgPSBqX2RhdGFfYiAtIChqX3N0YWdlX211bHQgPDwgMSk7CisKKyAgICAvKiBzdG9yZSByZXN1bHQgdG8gc3RhdGUgYnVmZmVyICovCisgICAgcFN0YXRlQnVmZmVyT2Zmc2V0MlswXSA9IHJfc3RhZ2VfbXVsdDsKKyAgICBwU3RhdGVCdWZmZXJPZmZzZXQyWzFdID0gal9zdGFnZV9tdWx0OworICAgIHBTdGF0ZUJ1ZmZlck9mZnNldDIgKz0gcFN0YXRlc0luY3JlbWVudDsKKworICAgIC8qIHdyaXRlIGZpbHRlciBvdXRwdXQgKi8KKyAgICBkYXRhUmVhbE91dFtpXSA9IHJfZGF0YV9hIDw8IDE7CisgICAgZGF0YUltYWdPdXRbaV0gPSBqX2RhdGFfYSA8PCAxOworCisgIH0gLyogZW5kIG9mIGJhbmQvZmlsdGVyIGxvb3AgKG91dGVyIGxvb3ApICovCisKKyAgLyogdXBkYXRlIHN0YXRlQnVmZmVyT2Zmc2V0IHdpdGggcmVzcGVjdCB0byByaW5nIGJ1ZmZlciBib3VuZGFyaWVzICovCisgIGlmIChzdGF0ZUJ1ZmZlck9mZnNldFswXSA9PSA0KQorICAgIHN0YXRlQnVmZmVyT2Zmc2V0WzBdID0gMDsKKyAgZWxzZQorICAgIHN0YXRlQnVmZmVyT2Zmc2V0WzBdICs9IDI7CisKKyAgaWYgKHN0YXRlQnVmZmVyT2Zmc2V0WzFdID09IDEyKQorICAgIHN0YXRlQnVmZmVyT2Zmc2V0WzFdID0gNjsKKyAgZWxzZQorICAgIHN0YXRlQnVmZmVyT2Zmc2V0WzFdICs9IDI7CisKKyAgaWYgKHN0YXRlQnVmZmVyT2Zmc2V0WzJdID09IDIyKQorICAgIHN0YXRlQnVmZmVyT2Zmc2V0WzJdID0gMTQ7CisgIGVsc2UKKyAgICBzdGF0ZUJ1ZmZlck9mZnNldFsyXSArPSAyOworCisgIHJldHVybiAoSU5UKTA7Cit9CisKKyNlbmRpZiAvKiBGVU5DVElPTl9EZWNvcnJGaWx0ZXJBcHBseUNQTFhfUFMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIER1Y2tlckluaXQoRFVDS0VSX0lOU1RBTkNFICpjb25zdCBzZWxmLCBpbnQgY29uc3QgaHlicmlkQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcnRpYWxseUNvbXBsZXgsIGNvbnN0IEZES19EVUNLRVJfVFlQRSBkdWNrZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuUGFyYW1CYW5kcywgaW50IGluaXRTdGF0ZXNGbGFnKSB7CisgIElOVCBlcnJvckNvZGUgPSAwOworCisgIGlmIChzZWxmKSB7CisgICAgc3dpdGNoIChuUGFyYW1CYW5kcykgeworICAgICAgY2FzZSAoMjApOgorICAgICAgICBGREtfQVNTRVJUKGh5YnJpZEJhbmRzID09IDcxKTsKKyAgICAgICAgc2VsZi0+bWFwSHliQmFuZHMyUHJvY0JhbmRzID0ga2VybmVsc18yMF90b183MV9QUzsKKyAgICAgICAgc2VsZi0+bWFwUHJvY0JhbmRzMkh5YkJhbmRzID0ga2VybmVsc18yMF90b183MV9vZmZzZXRfUFM7CisgICAgICAgIHNlbGYtPnBhcmFtZXRlckJhbmRzID0gKDIwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICgyOCk6CisKKyAgICAgICAgc2VsZi0+bWFwSHliQmFuZHMyUHJvY0JhbmRzID0ga2VybmVsc18yOF90b183MTsKKyAgICAgICAgc2VsZi0+bWFwUHJvY0JhbmRzMkh5YkJhbmRzID0ga2VybmVsc18yOF90b183MV9vZmZzZXQ7CisgICAgICAgIHNlbGYtPnBhcmFtZXRlckJhbmRzID0gKDI4KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICgyMyk6CisgICAgICAgIEZES19BU1NFUlQoaHlicmlkQmFuZHMgPT0gNjQgfHwgaHlicmlkQmFuZHMgPT0gMzIpOworICAgICAgICBzZWxmLT5tYXBIeWJCYW5kczJQcm9jQmFuZHMgPSBrZXJuZWxzXzIzX3RvXzY0OworICAgICAgICBzZWxmLT5tYXBQcm9jQmFuZHMySHliQmFuZHMgPSBrZXJuZWxzXzIzX3RvXzY0X29mZnNldDsKKyAgICAgICAgc2VsZi0+cGFyYW1ldGVyQmFuZHMgPSAoMjMpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBzZWxmLT5xc19uZXh0ID0gJnNlbGYtPm1hcFByb2NCYW5kczJIeWJCYW5kc1sxXTsKKworICAgIHNlbGYtPm1heFZhbERpcmVjdERhdGEgPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgICAgc2VsZi0+bWF4VmFsUmV2ZXJiRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgICBzZWxmLT5zY2FsZURpcmVjdE5yZyA9IDIgKiBEVUNLRVJfTUFYX05SR19TQ0FMRTsKKyAgICBzZWxmLT5zY2FsZVJldmVyYk5yZyA9IDIgKiBEVUNLRVJfTUFYX05SR19TQ0FMRTsKKyAgICBzZWxmLT5zY2FsZVNtb290aERpclJldk5yZyA9IDIgKiBEVUNLRVJfTUFYX05SR19TQ0FMRTsKKyAgICBzZWxmLT5oZWFkcm9vbVNtb290aERpclJldk5yZyA9IDIgKiBEVUNLRVJfTUFYX05SR19TQ0FMRTsKKyAgICBzZWxmLT5oeWJyaWRCYW5kcyA9IGh5YnJpZEJhbmRzOworICAgIHNlbGYtPnBhcnRpYWxseUNvbXBsZXggPSBwYXJ0aWFsbHlDb21wbGV4OworCisgICAgaWYgKGluaXRTdGF0ZXNGbGFnICYmIChkdWNrZXJUeXBlID09IERVQ0tFUl9QUykpIHsKKyAgICAgIGludCBwYjsKKyAgICAgIGZvciAocGIgPSAwOyBwYiA8IHNlbGYtPnBhcmFtZXRlckJhbmRzOyBwYisrKSB7CisgICAgICAgIHNlbGYtPlNtb290aERpclJldk5yZ1twYl0gPSAoRklYUF9NUFMpMDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZQorICAgIGVycm9yQ29kZSA9IDE7CisKKyAgcmV0dXJuIGVycm9yQ29kZTsKK30KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZVTkNUSU9OX0R1Y2tlckNhbGNFbmVyZ3kKK3N0YXRpYyBJTlQgRHVja2VyQ2FsY0VuZXJneShEVUNLRVJfSU5TVEFOQ0UgKmNvbnN0IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgY29uc3QgaW5wdXRSZWFsWyg3MSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGNvbnN0IGlucHV0SW1hZ1soNzEpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBlbmVyZ3lbKDI4KV0sIEZJWFBfREJMIGlucHV0TWF4VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpucmdTY2FsZSwgaW50IG1vZGUsIC8qIDE6KHBzKSAwOihlbHNlKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydEh5YkJhbmQpIHsKKyAgSU5UIGVyciA9IDA7CisgIGludCBxcywgbWF4SHliQmFuZDsKKyAgaW50IG1heEh5YnJpZEJhbmQgPSBzZWxmLT5oeWJyaWRCYW5kcyAtIDE7CisKKyAgbWF4SHliQmFuZCA9IG1heEh5YnJpZEJhbmQ7CisKKyAgRkRLbWVtY2xlYXIoZW5lcmd5LCAoMjgpICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgaWYgKG1vZGUgPT0gMSkgeworICAgIGludCBwYjsKKyAgICBpbnQgY2x6OworICAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKworICAgIGlmIChtYXhWYWwgPT0gRkwyRlhDT05TVF9EQkwoLTEuMGYpKSB7CisjaWZkZWYgRlVOQ1RJT05fRHVja2VyQ2FsY0VuZXJneV9mdW5jMgorICAgICAgbWF4VmFsID0gRHVja2VyQ2FsY0VuZXJneV9mdW5jMihpbnB1dFJlYWwsIGlucHV0SW1hZywgc3RhcnRIeWJCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhIeWJCYW5kLCBtYXhIeWJyaWRCYW5kKTsKKyNlbHNlCisgICAgICBGSVhQX0RCTCBsb2NhbE1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgZm9yIChxcyA9IHN0YXJ0SHliQmFuZDsgcXMgPD0gbWF4SHliQmFuZDsgcXMrKykgeworICAgICAgICBsb2NhbE1heFZhbCB8PSBmQWJzKGlucHV0UmVhbFtxc10pOworICAgICAgICBsb2NhbE1heFZhbCB8PSBmQWJzKGlucHV0SW1hZ1txc10pOworICAgICAgfQorICAgICAgZm9yICg7IHFzIDw9IG1heEh5YnJpZEJhbmQ7IHFzKyspIHsKKyAgICAgICAgbG9jYWxNYXhWYWwgfD0gZkFicyhpbnB1dFJlYWxbcXNdKTsKKyAgICAgIH0KKyAgICAgIG1heFZhbCA9IGxvY2FsTWF4VmFsOworI2VuZGlmCisgICAgfQorCisgICAgY2x6ID0gZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhtYXhWYWwpIC0gRFVDS0VSX0hFQURST09NX0JJVFMpOworICAgIGNseiA9IGZpeE1pbihjbHosIERVQ0tFUl9NQVhfTlJHX1NDQUxFKTsKKyAgICAqbnJnU2NhbGUgPSAoU0NIQVIpY2x6IDw8IDE7CisKKyAgICAvKiBJbml0aWFsaXplIHBiIHNpbmNlIGl0IHdvdWxkIHN0YXkgdW5pbml0aWFsaXplZCBmb3IgdGhlIGNhc2Ugc3RhcnRIeWJCYW5kCisgICAgICogPiBtYXhIeWJCYW5kLiAqLworICAgIHBiID0gU3BhdGlhbERlY0dldFByb2Nlc3NpbmdCYW5kKG1heEh5YkJhbmQsIHNlbGYtPm1hcEh5YkJhbmRzMlByb2NCYW5kcyk7CisgICAgZm9yIChxcyA9IHN0YXJ0SHliQmFuZDsgcXMgPD0gbWF4SHliQmFuZDsgcXMrKykgeworICAgICAgcGIgPSBTcGF0aWFsRGVjR2V0UHJvY2Vzc2luZ0JhbmQocXMsIHNlbGYtPm1hcEh5YkJhbmRzMlByb2NCYW5kcyk7CisgICAgICBlbmVyZ3lbcGJdICs9CisgICAgICAgICAgKGZQb3cyRGl2MihpbnB1dFJlYWxbcXNdIDw8IGNseikgKyBmUG93MkRpdjIoaW5wdXRJbWFnW3FzXSA8PCBjbHopKTsKKyAgICB9CisgICAgcGIrKzsKKworICAgIGZvciAoOyBwYiA8PSBTcGF0aWFsRGVjR2V0UHJvY2Vzc2luZ0JhbmQobWF4SHlicmlkQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm1hcEh5YkJhbmRzMlByb2NCYW5kcyk7CisgICAgICAgICBwYisrKSB7CisgICAgICBGREtfQVNTRVJUKHBiICE9IFNwYXRpYWxEZWNHZXRQcm9jZXNzaW5nQmFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHFzIC0gMSwgc2VsZi0+bWFwSHliQmFuZHMyUHJvY0JhbmRzKSk7CisgICAgICBpbnQgcXNfbmV4dDsKKyAgICAgIEZJWFBfREJMIG5yZyA9IDA7CisgICAgICBxc19uZXh0ID0gKGludClzZWxmLT5xc19uZXh0W3BiXTsKKyAgICAgIGZvciAoOyBxcyA8IHFzX25leHQ7IHFzKyspIHsKKyAgICAgICAgbnJnICs9IGZQb3cyRGl2MihpbnB1dFJlYWxbcXNdIDw8IGNseik7CisgICAgICB9CisgICAgICBlbmVyZ3lbcGJdID0gbnJnOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgY2x6OworICAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKworICAgIG1heFZhbCA9IGlucHV0TWF4VmFsOworCisgICAgaWYgKG1heFZhbCA9PSBGTDJGWENPTlNUX0RCTCgtMS4wZikpIHsKKyNpZmRlZiBGVU5DVElPTl9EdWNrZXJDYWxjRW5lcmd5X2Z1bmMyCisgICAgICBtYXhWYWwgPSBEdWNrZXJDYWxjRW5lcmd5X2Z1bmMyKGlucHV0UmVhbCwgaW5wdXRJbWFnLCBzdGFydEh5YkJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEh5YkJhbmQsIG1heEh5YnJpZEJhbmQpOworI2Vsc2UKKyAgICAgIEZJWFBfREJMIGxvY2FsTWF4VmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBmb3IgKHFzID0gc3RhcnRIeWJCYW5kOyBxcyA8PSBtYXhIeWJCYW5kOyBxcysrKSB7CisgICAgICAgIGxvY2FsTWF4VmFsIHw9IGZBYnMoaW5wdXRSZWFsW3FzXSk7CisgICAgICAgIGxvY2FsTWF4VmFsIHw9IGZBYnMoaW5wdXRJbWFnW3FzXSk7CisgICAgICB9CisgICAgICBmb3IgKDsgcXMgPD0gbWF4SHlicmlkQmFuZDsgcXMrKykgeworICAgICAgICBsb2NhbE1heFZhbCB8PSBmQWJzKGlucHV0UmVhbFtxc10pOworICAgICAgfQorICAgICAgbWF4VmFsID0gbG9jYWxNYXhWYWw7CisjZW5kaWYKKyAgICB9CisKKyAgICBjbHogPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSBEVUNLRVJfSEVBRFJPT01fQklUUyk7CisgICAgY2x6ID0gZml4TWluKGNseiwgRFVDS0VSX01BWF9OUkdfU0NBTEUpOworICAgICpucmdTY2FsZSA9IChTQ0hBUiljbHogPDwgMTsKKworI2lmZGVmIEZVTkNUSU9OX0R1Y2tlckNhbGNFbmVyZ3lfZnVuYzQKKyAgICBEdWNrZXJDYWxjRW5lcmd5X2Z1bmM0KGlucHV0UmVhbCwgaW5wdXRJbWFnLCBlbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5tYXBIeWJCYW5kczJQcm9jQmFuZHMsIGNseiwgc3RhcnRIeWJCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SHliQmFuZCwgbWF4SHlicmlkQmFuZCk7CisjZWxzZQorICAgIGZvciAocXMgPSBzdGFydEh5YkJhbmQ7IHFzIDw9IG1heEh5YkJhbmQ7IHFzKyspIHsKKyAgICAgIGludCBwYiA9IFNwYXRpYWxEZWNHZXRQcm9jZXNzaW5nQmFuZChxcywgc2VsZi0+bWFwSHliQmFuZHMyUHJvY0JhbmRzKTsKKyAgICAgIGVuZXJneVtwYl0gKz0KKyAgICAgICAgICAoZlBvdzJEaXYyKGlucHV0UmVhbFtxc10gPDwgY2x6KSArIGZQb3cyRGl2MihpbnB1dEltYWdbcXNdIDw8IGNseikpOworICAgIH0KKworICAgIGZvciAoOyBxcyA8PSBtYXhIeWJyaWRCYW5kOyBxcysrKSB7CisgICAgICBpbnQgcGIgPSBTcGF0aWFsRGVjR2V0UHJvY2Vzc2luZ0JhbmQocXMsIHNlbGYtPm1hcEh5YkJhbmRzMlByb2NCYW5kcyk7CisgICAgICBlbmVyZ3lbcGJdICs9IGZQb3cyRGl2MihpbnB1dFJlYWxbcXNdIDw8IGNseik7CisgICAgfQorI2VuZGlmIC8qIEZVTkNUSU9OX0R1Y2tlckNhbGNFbmVyZ3lfZnVuYzQgKi8KKyAgfQorCisgIHsKKyAgICAvKiBDYXRjaCBvdmVyZmxvd3Mgd2hpY2ggaGF2ZSBiZWVuIG9ic2VydmVkIGluIGVycmVkIGJpdHN0cmVhbXMgdG8gYXZvaWQKKyAgICAgKiBhc3NlcnRpb24gZmFpbHVyZXMgbGF0ZXIuICovCisgICAgaW50IHBiOworICAgIGZvciAocGIgPSAwOyBwYiA8ICgyOCk7IHBiKyspIHsKKyAgICAgIGVuZXJneVtwYl0gPSAoRklYUF9EQkwpKChMT05HKWVuZXJneVtwYl0gJiAoTE9ORylNQVhWQUxfREJMKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKyNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX0R1Y2tlckNhbGNFbmVyZ3kgKi8KKworTE5LX1NFQ1RJT05fQ09ERV9MMQorc3RhdGljIElOVCBEdWNrZXJBcHBseShEVUNLRVJfSU5TVEFOQ0UgKmNvbnN0IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGNvbnN0IGRpcmVjdE5yZ1soMjgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgb3V0cHV0UmVhbFsoNzEpXSwgRklYUF9EQkwgb3V0cHV0SW1hZ1soNzEpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0SHliQmFuZCkgeworICBJTlQgZXJyID0gMDsKKyAgaW50IHFzID0gc3RhcnRIeWJCYW5kOworICBpbnQgcXNfbmV4dCA9IDA7CisgIGludCBwYiA9IDA7CisgIGludCBzdGFydFBhcmFtQmFuZCA9IDA7CisgIGludCBoeWJCYW5kczsKKyAgaW50IGh5YnJpZEJhbmRzID0gc2VsZi0+aHlicmlkQmFuZHM7CisKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHJldmVyYk5yZywgRklYUF9EQkwsICgyOCkpOworCisgIEZJWFBfREJMICpzbW9vdGhEaXJSZXZOcmcgPSAmc2VsZi0+U21vb3RoRGlyUmV2TnJnWzBdOworICBGSVhQX0RVQ0tfR0FJTiBkdWNrR2FpbiA9IDA7CisKKyAgaW50IGRvU2NhbGVOcmcgPSAwOworICBpbnQgc2NhbGVEaXJlY3ROcmcgPSAwOworICBpbnQgc2NhbGVSZXZlcmJOcmcgPSAwOworICBpbnQgc2NhbGVTbW9vdGhEaXJSZXZOcmcgPSAwOworICBGSVhQX0RCTCBtYXhEaXJSZXZOcmcgPSBGTDJGWENPTlNUX0RCTCgwLjApOworCisgIGh5YkJhbmRzID0gaHlicmlkQmFuZHM7CisKKyAgc3RhcnRQYXJhbUJhbmQgPQorICAgICAgU3BhdGlhbERlY0dldFByb2Nlc3NpbmdCYW5kKHN0YXJ0SHliQmFuZCwgc2VsZi0+bWFwSHliQmFuZHMyUHJvY0JhbmRzKTsKKworICBEdWNrZXJDYWxjRW5lcmd5KHNlbGYsIG91dHB1dFJlYWwsIG91dHB1dEltYWcsIHJldmVyYk5yZywKKyAgICAgICAgICAgICAgICAgICBzZWxmLT5tYXhWYWxSZXZlcmJEYXRhLCAmKHNlbGYtPnNjYWxlUmV2ZXJiTnJnKSwgMCwKKyAgICAgICAgICAgICAgICAgICBzdGFydEh5YkJhbmQpOworCisgIGlmICgoc2VsZi0+c2NhbGVEaXJlY3ROcmcgIT0gc2VsZi0+c2NhbGVSZXZlcmJOcmcpIHx8CisgICAgICAoc2VsZi0+c2NhbGVEaXJlY3ROcmcgIT0gc2VsZi0+c2NhbGVTbW9vdGhEaXJSZXZOcmcpIHx8CisgICAgICAoc2VsZi0+aGVhZHJvb21TbW9vdGhEaXJSZXZOcmcgPT0gMCkpIHsKKyAgICBpbnQgc2NhbGU7CisKKyAgICBzY2FsZSA9IGZpeE1pbihzZWxmLT5zY2FsZURpcmVjdE5yZywgc2VsZi0+c2NhbGVTbW9vdGhEaXJSZXZOcmcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aGVhZHJvb21TbW9vdGhEaXJSZXZOcmcgLSAxKTsKKyAgICBzY2FsZSA9IGZpeE1pbihzY2FsZSwgc2VsZi0+c2NhbGVSZXZlcmJOcmcpOworCisgICAgc2NhbGVEaXJlY3ROcmcgPSBmTWF4KGZNaW4oc2VsZi0+c2NhbGVEaXJlY3ROcmcgLSBzY2FsZSwgKERGUkFDVF9CSVRTIC0gMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAtKERGUkFDVF9CSVRTIC0gMSkpOworICAgIHNjYWxlUmV2ZXJiTnJnID0gZk1heChmTWluKHNlbGYtPnNjYWxlUmV2ZXJiTnJnIC0gc2NhbGUsIChERlJBQ1RfQklUUyAtIDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLShERlJBQ1RfQklUUyAtIDEpKTsKKyAgICBzY2FsZVNtb290aERpclJldk5yZyA9CisgICAgICAgIGZNYXgoZk1pbihzZWxmLT5zY2FsZVNtb290aERpclJldk5yZyAtIHNjYWxlLCAoREZSQUNUX0JJVFMgLSAxKSksCisgICAgICAgICAgICAgLShERlJBQ1RfQklUUyAtIDEpKTsKKworICAgIHNlbGYtPnNjYWxlU21vb3RoRGlyUmV2TnJnID0gKFNDSEFSKXNjYWxlOworCisgICAgZG9TY2FsZU5yZyA9IDE7CisgIH0KKyAgZm9yIChwYiA9IHN0YXJ0UGFyYW1CYW5kOyBwYiA8IHNlbGYtPnBhcmFtZXRlckJhbmRzOyBwYisrKSB7CisgICAgRklYUF9EQkwgdG1wMTsKKyAgICBGSVhQX0RCTCB0bXAyOworICAgIElOVCBzOworCisgICAgLyogc21vb3RoRGlyUmV2TnJnWzIqcGIgIF0gPSBmTXVsdChzbW9vdGhEaXJSZXZOcmdbMipwYiAgXSxEVUNLX0FMUEhBX0ZESykgKworICAgICAgIGZNdWx0RGl2MihkaXJlY3ROcmdbcGJdLERVQ0tfT05FX01JTlVTX0FMUEhBX1g0X0ZESyk7CisgICAgICAgc21vb3RoRGlyUmV2TnJnWzIqcGIrMV0gPSBmTXVsdChzbW9vdGhEaXJSZXZOcmdbMipwYisxXSxEVUNLX0FMUEhBX0ZESykgKworICAgICAgIGZNdWx0RGl2MihyZXZlcmJOcmdbcGJdLERVQ0tfT05FX01JTlVTX0FMUEhBX1g0X0ZESyk7IHRtcDEgPQorICAgICAgIGZNdWx0KHNtb290aERpclJldk5yZ1syKnBiXSxEVUNLX0dBTU1BX0ZESyk7IHRtcDIgPQorICAgICAgIHNtb290aERpclJldk5yZ1syKnBiKzFdID4+IDE7CisgICAgKi8KKyAgICB0bXAxID0gc21vb3RoRGlyUmV2TnJnWzIgKiBwYiArIDBdOworICAgIHRtcDIgPSBzbW9vdGhEaXJSZXZOcmdbMiAqIHBiICsgMV07CisgICAgdG1wMSA9IGZNdWx0KHRtcDEsIERVQ0tfQUxQSEFfRkRLKTsKKyAgICB0bXAyID0gZk11bHQodG1wMiwgRFVDS19BTFBIQV9GREspOworCisgICAgaWYgKGRvU2NhbGVOcmcpIHsKKyAgICAgIGludCBzY2FsZVNtb290aERpclJldk5yZ19hc0V4cG9uZW50ID0gLXNjYWxlU21vb3RoRGlyUmV2TnJnOworCisgICAgICB0bXAxID0gc2NhbGVWYWx1ZSh0bXAxLCBzY2FsZVNtb290aERpclJldk5yZ19hc0V4cG9uZW50KTsKKyAgICAgIHRtcDIgPSBzY2FsZVZhbHVlKHRtcDIsIHNjYWxlU21vb3RoRGlyUmV2TnJnX2FzRXhwb25lbnQpOworICAgICAgdG1wMSA9IGZNdWx0QWRkRGl2Mih0bXAxLCBkaXJlY3ROcmdbcGJdID4+IHNjYWxlRGlyZWN0TnJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEVUNLX09ORV9NSU5VU19BTFBIQV9YNF9GREspOworICAgICAgdG1wMiA9IGZNdWx0QWRkRGl2Mih0bXAyLCByZXZlcmJOcmdbcGJdID4+IHNjYWxlUmV2ZXJiTnJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEVUNLX09ORV9NSU5VU19BTFBIQV9YNF9GREspOworICAgIH0gZWxzZSB7CisgICAgICB0bXAxID0gZk11bHRBZGREaXYyKHRtcDEsIGRpcmVjdE5yZ1twYl0sIERVQ0tfT05FX01JTlVTX0FMUEhBX1g0X0ZESyk7CisgICAgICB0bXAyID0gZk11bHRBZGREaXYyKHRtcDIsIHJldmVyYk5yZ1twYl0sIERVQ0tfT05FX01JTlVTX0FMUEhBX1g0X0ZESyk7CisgICAgfQorCisgICAgc21vb3RoRGlyUmV2TnJnWzIgKiBwYl0gPSB0bXAxOworICAgIHNtb290aERpclJldk5yZ1syICogcGIgKyAxXSA9IHRtcDI7CisKKyAgICBtYXhEaXJSZXZOcmcgfD0gZkFicyh0bXAxKTsKKyAgICBtYXhEaXJSZXZOcmcgfD0gZkFicyh0bXAyKTsKKworICAgIHRtcDEgPSBmTXVsdCh0bXAxLCBEVUNLX0dBTU1BX0ZESyk7CisgICAgdG1wMiA9IHRtcDIgPj4gMTsKKworICAgIHFzX25leHQgPSBmTWluKChpbnQpc2VsZi0+cXNfbmV4dFtwYl0sIHNlbGYtPmh5YnJpZEJhbmRzKTsKKworICAgIGlmICh0bXAyID4gdG1wMSkgeyAvKiB0cnVlIGZvciBhYm91dCAyMCUgKi8KKyAgICAgIC8qIGdhaW4gc21hbGxlciB0aGFuIDEuMCAqLworICAgICAgdG1wMSA9IHNxcnRGaXhwKHRtcDEpOworICAgICAgdG1wMiA9IGludlNxcnROb3JtMih0bXAyLCAmcyk7CisgICAgICBkdWNrR2FpbiA9IEZYX0RCTDJGWF9EVUNLX0dBSU4oZk11bHREaXYyKHRtcDEsIHRtcDIpIDw8IHMpOworICAgIH0gZWxzZSB7IC8qIHRydWUgZm9yIGFib3V0IDgwICUgKi8KKyAgICAgIHRtcDIgPSBzbW9vdGhEaXJSZXZOcmdbMiAqIHBiXSA+PiAxOworICAgICAgdG1wMSA9IGZNdWx0KHNtb290aERpclJldk5yZ1syICogcGIgKyAxXSwgRFVDS19HQU1NQV9GREspOworICAgICAgaWYgKHRtcDIgPiB0bXAxKSB7IC8qIHRydWUgZm9yIGFib3V0IDIwJSAqLworICAgICAgICBpZiAodG1wMSA8PSAodG1wMiA+PiAyKSkgeworICAgICAgICAgIC8qIGxpbWl0IGdhaW4gdG8gMi4wICovCisgICAgICAgICAgaWYgKHFzIDwgaHliQmFuZHMpIHsKKyAgICAgICAgICAgIGZvciAoOyBxcyA8IHFzX25leHQ7IHFzKyspIHsKKyAgICAgICAgICAgICAgb3V0cHV0UmVhbFtxc10gPSBvdXRwdXRSZWFsW3FzXSA8PCAxOworICAgICAgICAgICAgICBvdXRwdXRJbWFnW3FzXSA9IG91dHB1dEltYWdbcXNdIDw8IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoOyBxcyA8IHFzX25leHQ7IHFzKyspIHsKKyAgICAgICAgICAgICAgb3V0cHV0UmVhbFtxc10gPSBvdXRwdXRSZWFsW3FzXSA8PCAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAvKiBza2lwIGdlbmVyYWwgZ2FpbipvdXRwdXQgc2VjdGlvbiAqLworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIGdhaW4gZnJvbSAxLjAgdG8gMi4wICovCisgICAgICAgICAgdG1wMiA9IHNxcnRGaXhwKHRtcDIgPj4gMik7CisgICAgICAgICAgdG1wMSA9IGludlNxcnROb3JtMih0bXAxLCAmcyk7CisgICAgICAgICAgZHVja0dhaW4gPSBGWF9EQkwyRlhfRFVDS19HQUlOKGZNdWx0KHRtcDEsIHRtcDIpIDw8IHMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvKiB0cnVlIGZvciBhYm91dCA2MCUgKi8KKyAgICAgICAgLyogZ2FpbiA9IDEuMDsgb3V0cHV0IGRvZXMgbm90IGNoYW5nZTsgdXBkYXRlIHFzIGluZGV4ICovCisgICAgICAgIHFzID0gcXNfbmV4dDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorCisjaWZkZWYgRlVOQ1RJT05fRHVja2VyQXBwbHlfZnVuYzEKKyAgICBxcyA9IER1Y2tlckFwcGx5X2Z1bmMxKHFzLCBoeWJCYW5kcywgcXNfbmV4dCwgb3V0cHV0UmVhbCwgb3V0cHV0SW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1Y2tHYWluKTsKKyNlbHNlCisgICAgLyogZ2VuZXJhbCBnYWluKm91dHB1dCBzZWN0aW9uICovCisgICAgaWYgKHFzIDwgaHliQmFuZHMpIHsgICAgICAgICAgIC8qIHRydWUgZm9yIGFib3V0IDM5JSAqLworICAgICAgZm9yICg7IHFzIDwgcXNfbmV4dDsgcXMrKykgeyAvKiBydW5zIGFib3V0IDIgdGltZXMgKi8KKyAgICAgICAgb3V0cHV0UmVhbFtxc10gPSBmTXVsdERpdjIob3V0cHV0UmVhbFtxc10sIGR1Y2tHYWluKSA8PCAyOworICAgICAgICBvdXRwdXRJbWFnW3FzXSA9IGZNdWx0RGl2MihvdXRwdXRJbWFnW3FzXSwgZHVja0dhaW4pIDw8IDI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoOyBxcyA8IHFzX25leHQ7IHFzKyspIHsKKyAgICAgICAgb3V0cHV0UmVhbFtxc10gPSBmTXVsdERpdjIob3V0cHV0UmVhbFtxc10sIGR1Y2tHYWluKSA8PCAyOworICAgICAgfQorICAgIH0KKyNlbmRpZgorICB9IC8qIHBiICovCisKKyAgc2VsZi0+aGVhZHJvb21TbW9vdGhEaXJSZXZOcmcgPQorICAgICAgKFNDSEFSKWZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MobWF4RGlyUmV2TnJnKSAtIDEpOworCisgIENfQUxMT0NfU0NSQVRDSF9FTkQocmV2ZXJiTnJnLCBGSVhQX0RCTCwgKDI4KSk7CisKKyAgcmV0dXJuIGVycjsKK30KKworTE5LX1NFQ1RJT05fQ09ERV9MMQorc3RhdGljIElOVCBEdWNrZXJBcHBseVBTKERVQ0tFUl9JTlNUQU5DRSAqY29uc3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBjb25zdCBkaXJlY3ROcmdbKDI4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgb3V0cHV0UmVhbFsoNzEpXSwgRklYUF9EQkwgb3V0cHV0SW1hZ1soNzEpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRIeWJCYW5kKSB7CisgIGludCBxcyA9IHN0YXJ0SHliQmFuZDsKKyAgaW50IHBiID0gMDsKKyAgaW50IHN0YXJ0UGFyYW1CYW5kID0KKyAgICAgIFNwYXRpYWxEZWNHZXRQcm9jZXNzaW5nQmFuZChzdGFydEh5YkJhbmQsIHNlbGYtPm1hcEh5YkJhbmRzMlByb2NCYW5kcyk7CisgIGludCBoeWJCYW5kczsKKworICBpbnQgZG9TY2FsZU5yZyA9IDA7CisgIGludCBzY2FsZURpcmVjdE5yZyA9IDA7CisgIGludCBzY2FsZVNtb290aERpclJldk5yZyA9IDA7CisgIEZJWFBfREJMIG1heERpclJldk5yZyA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisKKyAgaWYgKChzZWxmLT5zY2FsZURpcmVjdE5yZyAhPSBzZWxmLT5zY2FsZVNtb290aERpclJldk5yZykgfHwKKyAgICAgIChzZWxmLT5oZWFkcm9vbVNtb290aERpclJldk5yZyA9PSAwKSkgeworICAgIGludCBzY2FsZTsKKworICAgIHNjYWxlID0gZml4TWluKHNlbGYtPnNjYWxlRGlyZWN0TnJnLCBzZWxmLT5zY2FsZVNtb290aERpclJldk5yZyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5oZWFkcm9vbVNtb290aERpclJldk5yZyAtIDIpOworCisgICAgc2NhbGVEaXJlY3ROcmcgPSBmTWF4KGZNaW4oc2VsZi0+c2NhbGVEaXJlY3ROcmcgLSBzY2FsZSwgKERGUkFDVF9CSVRTIC0gMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAtKERGUkFDVF9CSVRTIC0gMSkpOworICAgIHNjYWxlU21vb3RoRGlyUmV2TnJnID0KKyAgICAgICAgZk1heChmTWluKHNlbGYtPnNjYWxlU21vb3RoRGlyUmV2TnJnIC0gc2NhbGUsIChERlJBQ1RfQklUUyAtIDEpKSwKKyAgICAgICAgICAgICAtKERGUkFDVF9CSVRTIC0gMSkpOworCisgICAgc2VsZi0+c2NhbGVTbW9vdGhEaXJSZXZOcmcgPSAoU0NIQVIpc2NhbGU7CisKKyAgICBkb1NjYWxlTnJnID0gMTsKKyAgfQorCisgIGh5YkJhbmRzID0gc2VsZi0+aHlicmlkQmFuZHM7CisKKyAgRkRLX0FTU0VSVCgoc2VsZi0+cGFyYW1ldGVyQmFuZHMgPT0gKDI4KSkgfHwgKHNlbGYtPnBhcmFtZXRlckJhbmRzID09ICgyMCkpKTsKKyAgZm9yIChwYiA9IHN0YXJ0UGFyYW1CYW5kOyBwYiA8IHNlbGYtPnBhcmFtZXRlckJhbmRzOyBwYisrKSB7CisgICAgRklYUF9EQkwgZGlyZWN0TnJnMiA9IGRpcmVjdE5yZ1twYl07CisKKyAgICBpZiAoZG9TY2FsZU5yZykgeworICAgICAgZGlyZWN0TnJnMiA9IHNjYWxlVmFsdWUoZGlyZWN0TnJnMiwgLXNjYWxlRGlyZWN0TnJnKTsKKyAgICAgIHNlbGYtPnBlYWtEaWZmW3BiXSA9CisgICAgICAgICAgc2NhbGVWYWx1ZShzZWxmLT5wZWFrRGlmZltwYl0sIC1zY2FsZVNtb290aERpclJldk5yZyk7CisgICAgICBzZWxmLT5wZWFrRGVjYXlbcGJdID0KKyAgICAgICAgICBzY2FsZVZhbHVlKHNlbGYtPnBlYWtEZWNheVtwYl0sIC1zY2FsZVNtb290aERpclJldk5yZyk7CisgICAgICBzZWxmLT5TbW9vdGhEaXJSZXZOcmdbcGJdID0KKyAgICAgICAgICBzY2FsZVZhbHVlKHNlbGYtPlNtb290aERpclJldk5yZ1twYl0sIC1zY2FsZVNtb290aERpclJldk5yZyk7CisgICAgfQorICAgIHNlbGYtPnBlYWtEZWNheVtwYl0gPSBmaXhNYXgoCisgICAgICAgIGRpcmVjdE5yZzIsIGZNdWx0KHNlbGYtPnBlYWtEZWNheVtwYl0sIFBTX0RVQ0tfUEVBS19ERUNBWV9GQUNUT1JfRkRLKSk7CisgICAgc2VsZi0+cGVha0RpZmZbcGJdID0KKyAgICAgICAgc2VsZi0+cGVha0RpZmZbcGJdICsKKyAgICAgICAgZk11bHQoUFNfRFVDS19GSUxURVJfQ09FRkZfRkRLLAorICAgICAgICAgICAgICAoc2VsZi0+cGVha0RlY2F5W3BiXSAtIGRpcmVjdE5yZzIgLSBzZWxmLT5wZWFrRGlmZltwYl0pKTsKKyAgICBzZWxmLT5TbW9vdGhEaXJSZXZOcmdbcGJdID0KKyAgICAgICAgZml4TWF4KHNlbGYtPlNtb290aERpclJldk5yZ1twYl0gKworICAgICAgICAgICAgICAgICAgIGZNdWx0KFBTX0RVQ0tfRklMVEVSX0NPRUZGX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0TnJnMiAtIHNlbGYtPlNtb290aERpclJldk5yZ1twYl0pKSwKKyAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDApKTsKKworICAgIG1heERpclJldk5yZyB8PSBmQWJzKHNlbGYtPnBlYWtEaWZmW3BiXSk7CisgICAgbWF4RGlyUmV2TnJnIHw9IGZBYnMoc2VsZi0+U21vb3RoRGlyUmV2TnJnW3BiXSk7CisKKyAgICBpZiAoKHNlbGYtPnBlYWtEaWZmW3BiXSA9PSBGTDJGWENPTlNUX0RCTCgwKSkgJiYKKyAgICAgICAgKHNlbGYtPlNtb290aERpclJldk5yZ1twYl0gPT0gRkwyRlhDT05TVF9EQkwoMCkpKSB7CisgICAgICBpbnQgcXNfbmV4dDsKKworICAgICAgcXMgPSBmTWF4KHFzLCBTcGF0aWFsRGVjR2V0UW1mQmFuZChwYiwgc2VsZi0+bWFwUHJvY0JhbmRzMkh5YkJhbmRzKSk7CisgICAgICBxc19uZXh0ID0gZk1pbigoaW50KXNlbGYtPnFzX25leHRbcGJdLCBzZWxmLT5oeWJyaWRCYW5kcyk7CisKKyAgICAgIEZJWFBfREJMICpwT3V0cHV0UmVhbCA9ICZvdXRwdXRSZWFsW3FzXTsKKyAgICAgIEZJWFBfREJMICpwT3V0cHV0SW1hZyA9ICZvdXRwdXRJbWFnW3FzXTsKKworICAgICAgaWYgKHFzIDwgaHliQmFuZHMpIHsKKyAgICAgICAgZm9yICg7IHFzIDwgcXNfbmV4dDsgcXMrKykgeworICAgICAgICAgICpwT3V0cHV0UmVhbCsrID0gRkwyRlhDT05TVF9EQkwoMCk7CisgICAgICAgICAgKnBPdXRwdXRJbWFnKysgPSBGTDJGWENPTlNUX0RCTCgwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICg7IHFzIDwgcXNfbmV4dDsgcXMrKykgeworICAgICAgICAgICpwT3V0cHV0UmVhbCsrID0gRkwyRlhDT05TVF9EQkwoMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNlbGYtPnBlYWtEaWZmW3BiXSAhPSBGTDJGWENPTlNUX0RCTCgwKSkgeworICAgICAgRklYUF9EQkwgbXVsdGlwbGljYXRpb24gPQorICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfRFVDSygwLjc1ZiksIHNlbGYtPnBlYWtEaWZmW3BiXSk7CisgICAgICBpZiAobXVsdGlwbGljYXRpb24gPiAoc2VsZi0+U21vb3RoRGlyUmV2TnJnW3BiXSA+PiAxKSkgeworICAgICAgICBGSVhQX0RCTCBudW0sIGRlbm9tLCBkdWNrR2FpbjsKKyAgICAgICAgaW50IHNjYWxlLCBxc19uZXh0OworCisgICAgICAgIC8qIGltcGxlbWVudCB4L3kgYXMgKHNxcnQoeCkqaW52U3FydCh5KSleMiAqLworICAgICAgICBudW0gPSBzcXJ0Rml4cChzZWxmLT5TbW9vdGhEaXJSZXZOcmdbcGJdID4+IDEpOworICAgICAgICBkZW5vbSA9IHNlbGYtPnBlYWtEaWZmW3BiXSArCisgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoQUJTX1RIUiAvICgzMjc2OC4wZiAqIDMyNzY4LjBmICogMTI4LjBmICogMS41ZikpOworICAgICAgICBkZW5vbSA9IGludlNxcnROb3JtMihkZW5vbSwgJnNjYWxlKTsKKworICAgICAgICAvKiBkdWNrIG91dHB1dCB3aGV0aGVyIGR1Y2tHYWluICE9IDEuZiAqLworICAgICAgICBxcyA9IGZNYXgocXMsIFNwYXRpYWxEZWNHZXRRbWZCYW5kKHBiLCBzZWxmLT5tYXBQcm9jQmFuZHMySHliQmFuZHMpKTsKKyAgICAgICAgcXNfbmV4dCA9IGZNaW4oKGludClzZWxmLT5xc19uZXh0W3BiXSwgc2VsZi0+aHlicmlkQmFuZHMpOworCisgICAgICAgIGR1Y2tHYWluID0gZk11bHQobnVtLCBkZW5vbSk7CisgICAgICAgIGR1Y2tHYWluID0gZlBvdzJEaXYyKGR1Y2tHYWluIDw8IHNjYWxlKTsKKyAgICAgICAgZHVja0dhaW4gPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EVUNLKDIuZiAvIDMuZiksIGR1Y2tHYWluKSA8PCAzOworCisgICAgICAgIEZJWFBfREJMICpwT3V0cHV0UmVhbCA9ICZvdXRwdXRSZWFsW3FzXTsKKyAgICAgICAgRklYUF9EQkwgKnBPdXRwdXRJbWFnID0gJm91dHB1dEltYWdbcXNdOworCisgICAgICAgIGlmIChxcyA8IGh5YkJhbmRzKSB7CisgICAgICAgICAgZm9yICg7IHFzIDwgcXNfbmV4dDsgcXMrKykgeworICAgICAgICAgICAgKnBPdXRwdXRSZWFsID0gZk11bHQoKnBPdXRwdXRSZWFsLCBkdWNrR2Fpbik7CisgICAgICAgICAgICBwT3V0cHV0UmVhbCsrOyAvKiBkb24ndCBtb3ZlIGluIGZyb250IG9mICI9IiBhYm92ZSwgYmVjYXVzZSB0aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhY3QgY2xhc3MgdHJlYXRzIGl0IGRpZmZlcmVudGx5IGFuZCBwcm92aWRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JvbmcgYXJndW1lbnQgdG8gZk11bHQoKSAoc2VlbiBvbiB3aW4zMi9tc3ZjOCkgKi8KKyAgICAgICAgICAgICpwT3V0cHV0SW1hZyA9IGZNdWx0KCpwT3V0cHV0SW1hZywgZHVja0dhaW4pOworICAgICAgICAgICAgcE91dHB1dEltYWcrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yICg7IHFzIDwgcXNfbmV4dDsgcXMrKykgeworICAgICAgICAgICAgKnBPdXRwdXRSZWFsID0gZk11bHQoKnBPdXRwdXRSZWFsLCBkdWNrR2Fpbik7CisgICAgICAgICAgICBwT3V0cHV0UmVhbCsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSAvKiBwYiAqLworCisgIHNlbGYtPmhlYWRyb29tU21vb3RoRGlyUmV2TnJnID0KKyAgICAgIChTQ0hBUilmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heERpclJldk5yZykgLSAxKTsKKworICByZXR1cm4gMDsKK30KKworSU5UIEZES2RlY29ycmVsYXRlT3BlbihIQU5ETEVfREVDT1JSX0RFQyBoRGVjb3JyRGVjLCBGSVhQX0RCTCAqYnVmZmVyQ3BseCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJ1ZkxlbikgeworICBIQU5ETEVfREVDT1JSX0RFQyBzZWxmID0gaERlY29yckRlYzsKKworICBpZiAoYnVmTGVuIDwgKDIgKiAoKDgyNSkgKyAoMzczKSkpKSByZXR1cm4gMTsKKworICAvKiBhc3NpZ24gYWxsIG1lbW9yeSB0byBzdGF0ZUJ1ZmZlckNwbHguIEl0IGlzIHJlYXNzaWduZWQgZHVyaW5nCisgICAqIEZES2RlY29ycmVsYXRlSW5pdCgpICovCisgIHNlbGYtPnN0YXRlQnVmZmVyQ3BseCA9IGJ1ZmZlckNwbHg7CisgIHNlbGYtPkxfc3RhdGVCdWZmZXJDcGx4ID0gMDsKKworICBzZWxmLT5kZWxheUJ1ZmZlckNwbHggPSBOVUxMOworICBzZWxmLT5MX2RlbGF5QnVmZmVyQ3BseCA9IDA7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlzdHJpYnV0ZUJ1ZmZlcihIQU5ETEVfREVDT1JSX0RFQyBzZWxmLCBjb25zdCBpbnQgTF9zdGF0ZUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgTF9kZWxheUJ1ZikgeworICAvKiBmYWN0b3IgMiBiZWNhdXNlIG9mIGNvbXBsZXggdmFsdWVzICovCisgIGlmICgoMiAqICgoODI1KSArICgzNzMpKSkgPCAyICogKExfc3RhdGVCdWYgKyBMX2RlbGF5QnVmKSkgeworICAgIHJldHVybiAxOworICB9CisKKyAgc2VsZi0+TF9zdGF0ZUJ1ZmZlckNwbHggPSAyICogTF9zdGF0ZUJ1ZjsKKyAgc2VsZi0+ZGVsYXlCdWZmZXJDcGx4ID0gc2VsZi0+c3RhdGVCdWZmZXJDcGx4ICsgMiAqIExfc3RhdGVCdWY7CisgIHNlbGYtPkxfZGVsYXlCdWZmZXJDcGx4ID0gMiAqIExfZGVsYXlCdWY7CisKKyAgcmV0dXJuIDA7Cit9CitJTlQgRkRLZGVjb3JyZWxhdGVJbml0KEhBTkRMRV9ERUNPUlJfREVDIGhEZWNvcnJEZWMsIGNvbnN0IElOVCBuckh5YkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfREVDT1JSX1RZUEUgZGVjb3JyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX0RVQ0tFUl9UWVBFIGR1Y2tlclR5cGUsIGNvbnN0IElOVCBkZWNvcnJDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZWVkLCBjb25zdCBJTlQgcGFydGlhbGx5Q29tcGxleCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHVzZUZyYWN0RGVsYXksIGNvbnN0IElOVCBpc0xlZ2FjeVBTLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaW5pdFN0YXRlc0ZsYWcpIHsKKyAgSU5UIGVycm9yQ29kZSA9IDA7CisgIGludCBpLCByYiwgaV9zdGFydDsKKyAgaW50IG5QYXJhbUJhbmRzID0gMjg7CisKKyAgSU5UIG9mZnNldFN0YXRlQnVmZmVyID0gMDsKKyAgSU5UIG9mZnNldERlbGF5QnVmZmVyID0gMDsKKworICBjb25zdCBVQ0hBUiAqUkVWX2JhbmRPZmZzZXQ7CisKKyAgY29uc3QgU0NIQVIgKlJFVl9maWx0ZXJPcmRlcjsKKworICBoRGVjb3JyRGVjLT5wYXJ0aWFsbHlDb21wbGV4ID0gcGFydGlhbGx5Q29tcGxleDsKKyAgaERlY29yckRlYy0+bnVtYmlucyA9IG5ySHliQmFuZHM7CisKKyAgc3dpdGNoIChkZWNvcnJUeXBlKSB7CisgICAgY2FzZSBERUNPUlJfUFM6CisgICAgICAvKiBpZ25vcmUgZGVjb3JyQ29uZmlnLCBzZWVkICovCisgICAgICBpZiAocGFydGlhbGx5Q29tcGxleCkgeworICAgICAgICBoRGVjb3JyRGVjLT5SRVZfYmFuZE9mZnNldCA9IFJFVl9iYW5kT2Zmc2V0X1BTX0xQOworICAgICAgICBoRGVjb3JyRGVjLT5SRVZfZGVsYXkgPSBSRVZfZGVsYXlfUFNfTFA7CisgICAgICAgIGVycm9yQ29kZSA9IGRpc3RyaWJ1dGVCdWZmZXIoaERlY29yckRlYywgKDE2OCksICg1MzMpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhEZWNvcnJEZWMtPlJFVl9iYW5kT2Zmc2V0ID0gUkVWX2JhbmRPZmZzZXRfUFNfSFE7CisgICAgICAgIGhEZWNvcnJEZWMtPlJFVl9kZWxheSA9IFJFVl9kZWxheV9QU19IUTsKKyAgICAgICAgZXJyb3JDb2RlID0gZGlzdHJpYnV0ZUJ1ZmZlcihoRGVjb3JyRGVjLCAoMzYwKSwgKDI1NykpOworICAgICAgfQorICAgICAgaERlY29yckRlYy0+UkVWX2ZpbHRlck9yZGVyID0gUkVWX2ZpbHRlck9yZGVyX1BTOworICAgICAgaERlY29yckRlYy0+UkVWX2ZpbHRUeXBlID0gUkVWX2ZpbHRUeXBlX1BTOworCisgICAgICAvKiBJbml0aWFsaXplIHJpbmcgYnVmZmVyIG9mZnNldHMgZm9yIFBTIHNwZWNpZmljIGZpbHRlciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAqLworICAgICAgZm9yIChpID0gMDsgaSA8ICgzKTsgaSsrKQorICAgICAgICBoRGVjb3JyRGVjLT5zdGF0ZUJ1ZmZlck9mZnNldFtpXSA9IHN0YXRlQnVmZmVyT2Zmc2V0SW5pdFtpXTsKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBERUNPUlJfVVNBQzoKKyAgICAgIGlmIChwYXJ0aWFsbHlDb21wbGV4KSByZXR1cm4gMTsKKyAgICAgIGlmIChzZWVkICE9IDApIHJldHVybiAxOworICAgICAgaERlY29yckRlYy0+UkVWX2JhbmRPZmZzZXQgPQorICAgICAgICAgIFJFVl9iYW5kT2Zmc2V0X01QU19IUVtkZWNvcnJDb25maWddOyAvKiByZXZlcmIgYmFuZCBsYXlvdXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkIGZyb20gTVBTIHN0YW5kYXJkICovCisgICAgICBoRGVjb3JyRGVjLT5SRVZfZmlsdGVyT3JkZXIgPSBSRVZfZmlsdGVyT3JkZXJfVVNBQzsKKyAgICAgIGhEZWNvcnJEZWMtPlJFVl9kZWxheSA9IFJFVl9kZWxheV9VU0FDOworICAgICAgaWYgKHVzZUZyYWN0RGVsYXkpIHsKKyAgICAgICAgcmV0dXJuIDE7IC8qIG5vdCB5ZXQgc3VwcG9ydGVkICovCisgICAgICB9IGVsc2UgeworICAgICAgICBoRGVjb3JyRGVjLT5SRVZfZmlsdFR5cGUgPSBSRVZfZmlsdFR5cGVfTVBTOyAvKiB0aGUgZmlsdGVyIHR5cGVzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0ZWQgZnJvbSBNUFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgKi8KKyAgICAgIH0KKyAgICAgIC8qIGJzRGVjb3JyQ29uZmlnID09IDEgaXMgd29yc3QgY2FzZSAqLworICAgICAgZXJyb3JDb2RlID0gZGlzdHJpYnV0ZUJ1ZmZlcihoRGVjb3JyRGVjLCAoNTA5KSwgKDY0MykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBERUNPUlJfTEQ6CisgICAgICBpZiAocGFydGlhbGx5Q29tcGxleCkgcmV0dXJuIDE7CisgICAgICBpZiAodXNlRnJhY3REZWxheSkgcmV0dXJuIDE7CisgICAgICBpZiAoZGVjb3JyQ29uZmlnID4gMikgcmV0dXJuIDE7CisgICAgICBpZiAoc2VlZCA+IChNQVhfREVDT1JSX1NFRURfTEQgLSAxKSkgcmV0dXJuIDE7CisgICAgICBpZiAoIShuckh5YkJhbmRzID09IDY0IHx8IG5ySHliQmFuZHMgPT0gMzIpKQorICAgICAgICByZXR1cm4gMTsgLyogYWN0dWFsbHkganVzdCBxbWYgYmFuZHMgYW5kIG5vIGh5YnJpZCBiYW5kcyAqLworICAgICAgaERlY29yckRlYy0+UkVWX2JhbmRPZmZzZXQgPSBSRVZfYmFuZE9mZnNldF9MRFtkZWNvcnJDb25maWddOworICAgICAgaERlY29yckRlYy0+UkVWX2ZpbHRlck9yZGVyID0gUkVWX2ZpbHRlck9yZGVyX01QUzsgLyogdGhlIGZpbHRlciBvcmRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbmhlcml0ZWQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBTIHN0YW5kYXJkICovCisgICAgICBoRGVjb3JyRGVjLT5SRVZfZGVsYXkgPQorICAgICAgICAgIFJFVl9kZWxheV9NUFM7IC8qIHRoZSBkZWxheXMgaW4gZWFjaCByZXZlcmIgYmFuZCBhcmUgaW5oZXJpdGVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUFMgc3RhbmRhcmQgKi8KKyAgICAgIGhEZWNvcnJEZWMtPlJFVl9maWx0VHlwZSA9IFJFVl9maWx0VHlwZV9MRDsKKyAgICAgIGVycm9yQ29kZSA9IGRpc3RyaWJ1dGVCdWZmZXIoaERlY29yckRlYywgKDgyNSksICgzNzMpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChlcnJvckNvZGUpIHsKKyAgICByZXR1cm4gZXJyb3JDb2RlOworICB9CisKKyAgaWYgKGluaXRTdGF0ZXNGbGFnKSB7CisgICAgRkRLbWVtY2xlYXIoCisgICAgICAgIGhEZWNvcnJEZWMtPnN0YXRlQnVmZmVyQ3BseCwKKyAgICAgICAgaERlY29yckRlYy0+TF9zdGF0ZUJ1ZmZlckNwbHggKiBzaXplb2YoKmhEZWNvcnJEZWMtPnN0YXRlQnVmZmVyQ3BseCkpOworICAgIEZES21lbWNsZWFyKAorICAgICAgICBoRGVjb3JyRGVjLT5kZWxheUJ1ZmZlckNwbHgsCisgICAgICAgIGhEZWNvcnJEZWMtPkxfZGVsYXlCdWZmZXJDcGx4ICogc2l6ZW9mKCpoRGVjb3JyRGVjLT5kZWxheUJ1ZmZlckNwbHgpKTsKKyAgICBGREttZW1jbGVhcihoRGVjb3JyRGVjLT5yZXZlcmJCYW5kRGVsYXlCdWZmZXJJbmRleCwKKyAgICAgICAgICAgICAgICBzaXplb2YoaERlY29yckRlYy0+cmV2ZXJiQmFuZERlbGF5QnVmZmVySW5kZXgpKTsKKyAgfQorCisgIFJFVl9iYW5kT2Zmc2V0ID0gaERlY29yckRlYy0+UkVWX2JhbmRPZmZzZXQ7CisKKyAgUkVWX2ZpbHRlck9yZGVyID0gaERlY29yckRlYy0+UkVWX2ZpbHRlck9yZGVyOworCisgIGlfc3RhcnQgPSAwOworICBmb3IgKHJiID0gMDsgcmIgPCAoNCk7IHJiKyspIHsKKyAgICBpbnQgaV9zdG9wOworCisgICAgaV9zdG9wID0gUkVWX2JhbmRPZmZzZXRbcmJdOworCisgICAgaWYgKGlfc3RvcCA8PSBpX3N0YXJ0KSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBpX3N0YXJ0OyBpIDwgaV9zdG9wOyBpKyspIHsKKyAgICAgIHN3aXRjaCAoZGVjb3JyVHlwZSkgeworICAgICAgICBjYXNlIERFQ09SUl9QUzoKKyAgICAgICAgICBlcnJvckNvZGUgPSBEZWNvcnJGaWx0ZXJJbml0UFMoCisgICAgICAgICAgICAgICZoRGVjb3JyRGVjLT5GaWx0ZXJbaV0sIGhEZWNvcnJEZWMtPnN0YXRlQnVmZmVyQ3BseCwKKyAgICAgICAgICAgICAgaERlY29yckRlYy0+ZGVsYXlCdWZmZXJDcGx4LCAmb2Zmc2V0U3RhdGVCdWZmZXIsCisgICAgICAgICAgICAgICZvZmZzZXREZWxheUJ1ZmZlciwgaSwgcmIsIGhEZWNvcnJEZWMtPlJFVl9kZWxheVtyYl0pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVycm9yQ29kZSA9IERlY29yckZpbHRlckluaXQoCisgICAgICAgICAgICAgICZoRGVjb3JyRGVjLT5GaWx0ZXJbaV0sIGhEZWNvcnJEZWMtPnN0YXRlQnVmZmVyQ3BseCwKKyAgICAgICAgICAgICAgaERlY29yckRlYy0+ZGVsYXlCdWZmZXJDcGx4LCAmb2Zmc2V0U3RhdGVCdWZmZXIsCisgICAgICAgICAgICAgICZvZmZzZXREZWxheUJ1ZmZlciwgc2VlZCwgcmIsIHVzZUZyYWN0RGVsYXksCisgICAgICAgICAgICAgIGhEZWNvcnJEZWMtPlJFVl9kZWxheVtyYl0sIFJFVl9maWx0ZXJPcmRlcltyYl0sIGRlY29yclR5cGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlfc3RhcnQgPSBpX3N0b3A7CisgIH0gLyogbG9vcCBvdmVyIHJldmVyYkJhbmRzICovCisKKyAgaWYgKCEob2Zmc2V0U3RhdGVCdWZmZXIgPD0gaERlY29yckRlYy0+TF9zdGF0ZUJ1ZmZlckNwbHgpIHx8CisgICAgICAhKG9mZnNldERlbGF5QnVmZmVyIDw9IGhEZWNvcnJEZWMtPkxfZGVsYXlCdWZmZXJDcGx4KSkgeworICAgIHJldHVybiBlcnJvckNvZGUgPSAxOworICB9CisKKyAgaWYgKGR1Y2tlclR5cGUgPT0gRFVDS0VSX0FVVE9NQVRJQykgeworICAgIC8qIENob29zZSBjb3JyZWN0IGR1Y2tlciB0eXBlIGFjY29yZGluZyB0byBzdGFuZGFyZHM6ICovCisgICAgc3dpdGNoIChkZWNvcnJUeXBlKSB7CisgICAgICBjYXNlIERFQ09SUl9QUzoKKyAgICAgICAgaERlY29yckRlYy0+ZHVja2VyLmR1Y2tlclR5cGUgPSBEVUNLRVJfUFM7CisgICAgICAgIGlmIChpc0xlZ2FjeVBTKSB7CisgICAgICAgICAgblBhcmFtQmFuZHMgPSAoMjApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5QYXJhbUJhbmRzID0gKDI4KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgREVDT1JSX1VTQUM6CisgICAgICAgIGhEZWNvcnJEZWMtPmR1Y2tlci5kdWNrZXJUeXBlID0gRFVDS0VSX01QUzsKKyAgICAgICAgblBhcmFtQmFuZHMgPSAoMjgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgREVDT1JSX0xEOgorICAgICAgICBoRGVjb3JyRGVjLT5kdWNrZXIuZHVja2VyVHlwZSA9IERVQ0tFUl9NUFM7CisgICAgICAgIG5QYXJhbUJhbmRzID0gKDIzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICBlcnJvckNvZGUgPSBEdWNrZXJJbml0KAorICAgICAgJmhEZWNvcnJEZWMtPmR1Y2tlciwgaERlY29yckRlYy0+bnVtYmlucywgaERlY29yckRlYy0+cGFydGlhbGx5Q29tcGxleCwKKyAgICAgIGhEZWNvcnJEZWMtPmR1Y2tlci5kdWNrZXJUeXBlLCBuUGFyYW1CYW5kcywgaW5pdFN0YXRlc0ZsYWcpOworCisgIHJldHVybiBlcnJvckNvZGU7Cit9CisKK0lOVCBGREtkZWNvcnJlbGF0ZUNsb3NlKEhBTkRMRV9ERUNPUlJfREVDIGhEZWNvcnJEZWMpIHsKKyAgSU5UIGVyciA9IDA7CisKKyAgaWYgKGhEZWNvcnJEZWMgPT0gTlVMTCkgeworICAgIHJldHVybiAxOworICB9CisKKyAgaERlY29yckRlYy0+c3RhdGVCdWZmZXJDcGx4ID0gTlVMTDsKKyAgaERlY29yckRlYy0+TF9zdGF0ZUJ1ZmZlckNwbHggPSAwOworICBoRGVjb3JyRGVjLT5kZWxheUJ1ZmZlckNwbHggPSBOVUxMOworICBoRGVjb3JyRGVjLT5MX2RlbGF5QnVmZmVyQ3BseCA9IDA7CisKKyAgcmV0dXJuIGVycjsKK30KKworTE5LX1NFQ1RJT05fQ09ERV9MMQorSU5UIEZES2RlY29ycmVsYXRlQXBwbHkoSEFORExFX0RFQ09SUl9ERUMgaERlY29yckRlYywgRklYUF9EQkwgKmRhdGFSZWFsSW4sCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGF0YUltYWdJbiwgRklYUF9EQkwgKmRhdGFSZWFsT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRhdGFJbWFnT3V0LCBjb25zdCBJTlQgc3RhcnRIeWJCYW5kKSB7CisgIEhBTkRMRV9ERUNPUlJfREVDIHNlbGYgPSBoRGVjb3JyRGVjOworICBJTlQgZXJyID0gMDsKKyAgSU5UIHJiLCBzdG9wLCBzdGFydDsKKworICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgaW50IG5IeWJCYW5kcyA9IDA7CisgICAgLyogY29weSBuZXcgc2FtcGxlcyAqLworICAgIG5IeWJCYW5kcyA9IHNlbGYtPm51bWJpbnM7CisKKyAgICBGSVhQX0RCTCBkaXJlY3ROcmdbKDI4KV07CisKKyAgICBEdWNrZXJDYWxjRW5lcmd5KAorICAgICAgICAmc2VsZi0+ZHVja2VyLCBkYXRhUmVhbEluLCBkYXRhSW1hZ0luLCBkaXJlY3ROcmcsCisgICAgICAgIHNlbGYtPmR1Y2tlci5tYXhWYWxEaXJlY3REYXRhLCAmKHNlbGYtPmR1Y2tlci5zY2FsZURpcmVjdE5yZyksCisgICAgICAgIChzZWxmLT5kdWNrZXIuZHVja2VyVHlwZSA9PSBEVUNLRVJfUFMpID8gMSA6IDAsIHN0YXJ0SHliQmFuZCk7CisKKyAgICAvKiBjb21wbGV4LXZhbHVlZCBoeWJyaWQgYmFuZHMgKi8KKyAgICBmb3IgKHN0b3AgPSAwLCByYiA9IDA7IHJiIDwgKDQpOyByYisrKSB7CisgICAgICBzdGFydCA9IGZNYXgoc3RvcCwgc3RhcnRIeWJCYW5kKTsKKyAgICAgIHN0b3AgPSBmTWluKHNlbGYtPlJFVl9iYW5kT2Zmc2V0W3JiXSwgKFVDSEFSKW5IeWJCYW5kcyk7CisKKyAgICAgIGlmIChzdGFydCA8IHN0b3ApIHsKKyAgICAgICAgc3dpdGNoIChoRGVjb3JyRGVjLT5SRVZfZmlsdFR5cGVbcmJdKSB7CisgICAgICAgICAgY2FzZSBERUxBWToKKyAgICAgICAgICAgIGVyciA9IERlY29yckZpbHRlckFwcGx5UEFTUygmc2VsZi0+RmlsdGVyWzBdLCBkYXRhUmVhbEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFJbWFnSW4sIGRhdGFSZWFsT3V0LCBkYXRhSW1hZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgc3RvcCwgc2VsZi0+UkVWX2RlbGF5W3JiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5yZXZlcmJCYW5kRGVsYXlCdWZmZXJJbmRleFtyYl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBJTkRFUF9DUExYX1BTOgorICAgICAgICAgICAgZXJyID0gRGVjb3JyRmlsdGVyQXBwbHlDUExYX1BTKAorICAgICAgICAgICAgICAgICZzZWxmLT5GaWx0ZXJbMF0sIGRhdGFSZWFsSW4sIGRhdGFJbWFnSW4sIGRhdGFSZWFsT3V0LAorICAgICAgICAgICAgICAgIGRhdGFJbWFnT3V0LCBzdGFydCwgc3RvcCwgc2VsZi0+UkVWX2ZpbHRlck9yZGVyW3JiXSwKKyAgICAgICAgICAgICAgICBzZWxmLT5SRVZfZGVsYXlbcmJdLCBzZWxmLT5yZXZlcmJCYW5kRGVsYXlCdWZmZXJJbmRleFtyYl0sCisgICAgICAgICAgICAgICAgc2VsZi0+c3RhdGVCdWZmZXJPZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDT01NT05fUkVBTDoKKyAgICAgICAgICAgIGVyciA9IERlY29yckZpbHRlckFwcGx5UkVBTCgKKyAgICAgICAgICAgICAgICAmc2VsZi0+RmlsdGVyWzBdLCBkYXRhUmVhbEluLCBkYXRhSW1hZ0luLCBkYXRhUmVhbE91dCwKKyAgICAgICAgICAgICAgICBkYXRhSW1hZ091dCwgc3RhcnQsIHN0b3AsIHNlbGYtPlJFVl9maWx0ZXJPcmRlcltyYl0sCisgICAgICAgICAgICAgICAgc2VsZi0+UkVWX2RlbGF5W3JiXSwgc2VsZi0+cmV2ZXJiQmFuZERlbGF5QnVmZmVySW5kZXhbcmJdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9IC8qIGlmIHN0YXJ0IDwgc3RvcCAqLworICAgIH0gICAvKiBsb29wIG92ZXIgcmV2ZXJiIGJhbmRzICovCisKKyAgICBmb3IgKHJiID0gMDsgcmIgPCAoNCk7IHJiKyspIHsKKyAgICAgIHNlbGYtPnJldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4W3JiXSArPSAyOworICAgICAgaWYgKHNlbGYtPnJldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4W3JiXSA+PSAyICogc2VsZi0+UkVWX2RlbGF5W3JiXSkKKyAgICAgICAgc2VsZi0+cmV2ZXJiQmFuZERlbGF5QnVmZmVySW5kZXhbcmJdID0gMDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHNlbGYtPmR1Y2tlci5kdWNrZXJUeXBlKSB7CisgICAgICBjYXNlIERVQ0tFUl9QUzoKKyAgICAgICAgZXJyID0gRHVja2VyQXBwbHlQUygmc2VsZi0+ZHVja2VyLCBkaXJlY3ROcmcsIGRhdGFSZWFsT3V0LCBkYXRhSW1hZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEh5YkJhbmQpOworICAgICAgICBpZiAoZXJyICE9IDApIGdvdG8gYmFpbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBlcnIgPSBEdWNrZXJBcHBseSgmc2VsZi0+ZHVja2VyLCBkaXJlY3ROcmcsIGRhdGFSZWFsT3V0LCBkYXRhSW1hZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRIeWJCYW5kKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSBnb3RvIGJhaWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCitiYWlsOgorICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9GREtfaHlicmlkLmNwcCBiL2xpYkZESy9zcmMvRkRLX2h5YnJpZC5jcHAKaW5kZXggMjA4MTZmNS4uYjY2MWY4MiAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9GREtfaHlicmlkLmNwcAorKysgYi9saWJGREsvc3JjL0ZES19oeWJyaWQuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI5OSArOTAsMzQ0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6IE1hcmt1cyBMb2h3YXNzZXIKKyAgIEF1dGhvcihzKTogICBNYXJrdXMgTG9od2Fzc2VyCisKICAgIERlc2NyaXB0aW9uOiBGREsgVG9vbHMgSHlicmlkIEZpbHRlcmJhbmsKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgIkZES19oeWJyaWQuaCIKIAotCiAjaW5jbHVkZSAiZmZ0LmgiCiAKIC8qLS0tLS0tLS0tLS0tLS0tIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBGRlRfSURYX1IoYSkgICgyKmEpCi0jZGVmaW5lIEZGVF9JRFhfSShhKSAgKDIqYSsxKQorI2RlZmluZSBGRlRfSURYX1IoYSkgKDIgKiBhKQorI2RlZmluZSBGRlRfSURYX0koYSkgKDIgKiBhICsgMSkKIAotI2RlZmluZSBIWUJfQ09FRjhfMCAgKCAwLjAwNzQ2MDgyOTQ5ODEyZiApCi0jZGVmaW5lIEhZQl9DT0VGOF8xICAoIDAuMDIyNzA0MjA5NDk4MjVmICkKLSNkZWZpbmUgSFlCX0NPRUY4XzIgICggMC4wNDU0Njg2NTkzMDQ3M2YgKQotI2RlZmluZSBIWUJfQ09FRjhfMyAgKCAwLjA3MjY2MTEzOTI5NTkxZiApCi0jZGVmaW5lIEhZQl9DT0VGOF80ICAoIDAuMDk4ODUxMDg1NzUyNjRmICkKLSNkZWZpbmUgSFlCX0NPRUY4XzUgICggMC4xMTc5MzcxMDU2NzIxN2YgKQotI2RlZmluZSBIWUJfQ09FRjhfNiAgKCAwLjEyNTAwMDAwMDAwMDAwZiApCi0jZGVmaW5lIEhZQl9DT0VGOF83ICAoIEhZQl9DT0VGOF81ICkKLSNkZWZpbmUgSFlCX0NPRUY4XzggICggSFlCX0NPRUY4XzQgKQotI2RlZmluZSBIWUJfQ09FRjhfOSAgKCBIWUJfQ09FRjhfMyApCi0jZGVmaW5lIEhZQl9DT0VGOF8xMCAoIEhZQl9DT0VGOF8yICkKLSNkZWZpbmUgSFlCX0NPRUY4XzExICggSFlCX0NPRUY4XzEgKQotI2RlZmluZSBIWUJfQ09FRjhfMTIgKCBIWUJfQ09FRjhfMCApCi0KKyNkZWZpbmUgSFlCX0NPRUY4XzAgKDAuMDA3NDYwODI5NDk4MTJmKQorI2RlZmluZSBIWUJfQ09FRjhfMSAoMC4wMjI3MDQyMDk0OTgyNWYpCisjZGVmaW5lIEhZQl9DT0VGOF8yICgwLjA0NTQ2ODY1OTMwNDczZikKKyNkZWZpbmUgSFlCX0NPRUY4XzMgKDAuMDcyNjYxMTM5Mjk1OTFmKQorI2RlZmluZSBIWUJfQ09FRjhfNCAoMC4wOTg4NTEwODU3NTI2NGYpCisjZGVmaW5lIEhZQl9DT0VGOF81ICgwLjExNzkzNzEwNTY3MjE3ZikKKyNkZWZpbmUgSFlCX0NPRUY4XzYgKDAuMTI1MDAwMDAwMDAwMDBmKQorI2RlZmluZSBIWUJfQ09FRjhfNyAoSFlCX0NPRUY4XzUpCisjZGVmaW5lIEhZQl9DT0VGOF84IChIWUJfQ09FRjhfNCkKKyNkZWZpbmUgSFlCX0NPRUY4XzkgKEhZQl9DT0VGOF8zKQorI2RlZmluZSBIWUJfQ09FRjhfMTAgKEhZQl9DT0VGOF8yKQorI2RlZmluZSBIWUJfQ09FRjhfMTEgKEhZQl9DT0VGOF8xKQorI2RlZmluZSBIWUJfQ09FRjhfMTIgKEhZQl9DT0VGOF8wKQogCiAvKi0tLS0tLS0tLS0tLS0tLSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmIGRlZmluZWQoQVJDSF9QUkVGRVJfTVVMVF8zMngxNikKLSAgI2RlZmluZSBGSVhQX0hUQiBGSVhQX1NHTCAgICAgICAgICAgICAgIC8qIFNHTCBkYXRhIHR5cGUuICovCi0gICNkZWZpbmUgRklYUF9IVFAgRklYUF9TUEsgICAgICAgICAgICAgICAvKiBQYWNrZWQgU0dMIGRhdGEgdHlwZS4gKi8KLSAgI2RlZmluZSBIVEMoYSkgKEZYX0RCTDJGWENPTlNUX1NHTChhKSkgIC8qIENhc3QgdG8gU0dMICovCi0gICNkZWZpbmUgRkwyRlhDT05TVF9IVEIgRkwyRlhDT05TVF9TR0wKKyNkZWZpbmUgRklYUF9IVEIgRklYUF9TR0wgICAgICAgICAgICAgIC8qIFNHTCBkYXRhIHR5cGUuICovCisjZGVmaW5lIEZJWFBfSFRQIEZJWFBfU1BLICAgICAgICAgICAgICAvKiBQYWNrZWQgU0dMIGRhdGEgdHlwZS4gKi8KKyNkZWZpbmUgSFRDKGEpIChGWF9EQkwyRlhDT05TVF9TR0woYSkpIC8qIENhc3QgdG8gU0dMICovCisjZGVmaW5lIEZMMkZYQ09OU1RfSFRCIEZMMkZYQ09OU1RfU0dMCiAjZWxzZQotICAjZGVmaW5lIEZJWFBfSFRCIEZJWFBfREJMICAgICAgICAgICAgICAgLyogU0dMIGRhdGEgdHlwZS4gKi8KLSAgI2RlZmluZSBGSVhQX0hUUCBGSVhQX0RQSyAgICAgICAgICAgICAgIC8qIFBhY2tlZCBEQkwgZGF0YSB0eXBlLiAqLwotICAjZGVmaW5lIEhUQyhhKSAoKEZJWFBfREJMKShMT05HKShhKSkgICAgLyogQ2FzdCB0byBEQkwgKi8KLSAgI2RlZmluZSBGTDJGWENPTlNUX0hUQiBGTDJGWENPTlNUX0RCTAorI2RlZmluZSBGSVhQX0hUQiBGSVhQX0RCTCAgICAgICAgICAgIC8qIFNHTCBkYXRhIHR5cGUuICovCisjZGVmaW5lIEZJWFBfSFRQIEZJWFBfRFBLICAgICAgICAgICAgLyogUGFja2VkIERCTCBkYXRhIHR5cGUuICovCisjZGVmaW5lIEhUQyhhKSAoKEZJWFBfREJMKShMT05HKShhKSkgLyogQ2FzdCB0byBEQkwgKi8KKyNkZWZpbmUgRkwyRlhDT05TVF9IVEIgRkwyRlhDT05TVF9EQkwKICNlbmRpZgogCi0jZGVmaW5lIEhUQ1AocmVhbCxpbWFnKSB7IHsgSFRDKHJlYWwpLCBIVEMoaW1hZykgfSB9IC8qIEhvdyB0byBhcnJhbmdlIHRoZSBwYWNrZWQgdmFsdWVzLiAqLworI2RlZmluZSBIVENQKHJlYWwsIGltYWcpICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IEhUQyhyZWFsKSwgSFRDKGltYWcpIH0gXAorICB9IC8qIEhvdyB0byBhcnJhbmdlIHRoZSBwYWNrZWQgdmFsdWVzLiAqLwogCi0KLXN0cnVjdCBGREtfSFlCUklEX1NFVFVQCi17Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBuclFtZkJhbmRzOyAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgYmFuZHMgdG8gYmUgY29udmVydGVkIHRvIGh5YnJpZC4gKi8KLSAgICBVQ0hBUiAgICAgICAgICAgICAgIG5IeWJCYW5kc1szXTsgICAgICAgIC8qITwgTnVtYmVyIG9mIEh5YnJpZCBiYW5kcyBnZW5lcmF0ZWQgYnkgbnJRbWZCYW5kcy4gKi8KLSAgICBTQ0hBUiAgICAgICAgICAgICAgIGtIeWJyaWRbM107ICAgICAgICAgIC8qITwgRmlsdGVyIGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBRTUYgYmFuZC4gKi8KLSAgICBVQ0hBUiAgICAgICAgICAgICAgIHByb3RvTGVuOyAgICAgICAgICAgIC8qITwgUHJvdG90eXBlIGZpbHRlciBsZW5ndGguICovCi0gICAgVUNIQVIgICAgICAgICAgICAgICBmaWx0ZXJEZWxheTsgICAgICAgICAvKiE8IERlbGF5IGNhdXNlZCBieSBoeWJyaWQgZmlsdGVyLiAqLwotICAgIGNvbnN0IElOVCAgICAgICAgICAqcFJlYWRJZHhUYWJsZTsgICAgICAgLyohPCBIZWxwZXIgdGFibGUgdG8gYWNjZXNzIGlucHV0IGRhdGEgcmluZ2J1ZmZlci4gKi8KLQorc3RydWN0IEZES19IWUJSSURfU0VUVVAgeworICBVQ0hBUiBuclFtZkJhbmRzOyAgIC8qITwgTnVtYmVyIG9mIFFNRiBiYW5kcyB0byBiZSBjb252ZXJ0ZWQgdG8gaHlicmlkLiAqLworICBVQ0hBUiBuSHliQmFuZHNbM107IC8qITwgTnVtYmVyIG9mIEh5YnJpZCBiYW5kcyBnZW5lcmF0ZWQgYnkgbnJRbWZCYW5kcy4gKi8KKyAgU0NIQVIga0h5YnJpZFszXTsgICAvKiE8IEZpbHRlciBjb25maWd1cmF0aW9uIG9mIGVhY2ggUU1GIGJhbmQuICovCisgIFVDSEFSIHByb3RvTGVuOyAgICAgLyohPCBQcm90b3R5cGUgZmlsdGVyIGxlbmd0aC4gKi8KKyAgVUNIQVIgZmlsdGVyRGVsYXk7ICAvKiE8IERlbGF5IGNhdXNlZCBieSBoeWJyaWQgZmlsdGVyLiAqLworICBjb25zdCBJTlQKKyAgICAgICpwUmVhZElkeFRhYmxlOyAvKiE8IEhlbHBlciB0YWJsZSB0byBhY2Nlc3MgaW5wdXQgZGF0YSByaW5nYnVmZmVyLiAqLwogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0gY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgY29uc3QgSU5UIHJpbmdidWZmSWR4VGFiWzIqMTNdID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyIH07CitzdGF0aWMgY29uc3QgSU5UIHJpbmdidWZmSWR4VGFiWzIgKiAxM10gPSB7MCwgMSwgIDIsICAzLCAgNCwgNSwgIDYsICA3LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIDEwLCAxMSwgMTIsIDAsIDEsICAyLCAgMywgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyfTsKIAotc3RhdGljIGNvbnN0IEZES19IWUJSSURfU0VUVVAgc2V0dXBfM18xNiA9IHsgMywgeyA4LCA0LCA0fSwgeyAgOCwgIDQsICA0fSwgMTMsICgxMy0xKS8yLCByaW5nYnVmZklkeFRhYn07Ci1zdGF0aWMgY29uc3QgRkRLX0hZQlJJRF9TRVRVUCBzZXR1cF8zXzEyID0geyAzLCB7IDgsIDIsIDJ9LCB7ICA4LCAgMiwgIDJ9LCAxMywgKDEzLTEpLzIsIHJpbmdidWZmSWR4VGFifTsKLXN0YXRpYyBjb25zdCBGREtfSFlCUklEX1NFVFVQIHNldHVwXzNfMTAgPSB7IDMsIHsgNiwgMiwgMn0sIHsgLTgsIC0yLCAgMn0sIDEzLCAoMTMtMSkvMiwgcmluZ2J1ZmZJZHhUYWJ9OwotCitzdGF0aWMgY29uc3QgRkRLX0hZQlJJRF9TRVRVUCBzZXR1cF8zXzE2ID0gezMsICB7OCwgNCwgNH0sICAgIHs4LCA0LCA0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsICgxMyAtIDEpIC8gMiwgcmluZ2J1ZmZJZHhUYWJ9Oworc3RhdGljIGNvbnN0IEZES19IWUJSSURfU0VUVVAgc2V0dXBfM18xMiA9IHszLCAgezgsIDIsIDJ9LCAgICB7OCwgMiwgMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLCAoMTMgLSAxKSAvIDIsIHJpbmdidWZmSWR4VGFifTsKK3N0YXRpYyBjb25zdCBGREtfSFlCUklEX1NFVFVQIHNldHVwXzNfMTAgPSB7MywgIHs2LCAyLCAyfSwgICAgey04LCAtMiwgMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLCAoMTMgLSAxKSAvIDIsIHJpbmdidWZmSWR4VGFifTsKIAogc3RhdGljIGNvbnN0IEZJWFBfSFRQIEh5YkZpbHRlckNvZWY4W10gPSB7Ci0gIEhUQ1AoMHgxMDAwMDAwMCwgMHgwMDAwMDAwMCksIEhUQ1AoMHgwZGYyNjQwNywgMHhmYTM5MTg4MiksIEhUQ1AoMHhmZjUzMjEwOSwgMHgwMGFjZGVmNyksIEhUQ1AoMHgwOGYyNmQzNiwgMHhmNzBkOTJjYSksCi0gIEhUQ1AoMHhmZWUzNGI1ZiwgMHgwMmFmNTcwZiksIEhUQ1AoMHgwMzhmMjc2ZSwgMHhmNzY4NDc5MyksIEhUQ1AoMHgwMDAwMDAwMCwgMHgwNWQxZWFjMiksIEhUQ1AoMHgwMDAwMDAwMCwgMHgwNWQxZWFjMiksCi0gIEhUQ1AoMHgwMzhmMjc2ZSwgMHgwODk3Yjg2ZCksIEhUQ1AoMHhmZWUzNGI1ZiwgMHhmZDUwYThmMSksIEhUQ1AoMHgwOGYyNmQzNiwgMHgwOGYyNmQzNiksIEhUQ1AoMHhmZjUzMjEwOSwgMHhmZjUzMjEwOSksCi0gIEhUQ1AoMHgwZGYyNjQwNywgMHgwNWM2ZTc3ZSkKLX07CisgICAgSFRDUCgweDEwMDAwMDAwLCAweDAwMDAwMDAwKSwgSFRDUCgweDBkZjI2NDA3LCAweGZhMzkxODgyKSwKKyAgICBIVENQKDB4ZmY1MzIxMDksIDB4MDBhY2RlZjcpLCBIVENQKDB4MDhmMjZkMzYsIDB4ZjcwZDkyY2EpLAorICAgIEhUQ1AoMHhmZWUzNGI1ZiwgMHgwMmFmNTcwZiksIEhUQ1AoMHgwMzhmMjc2ZSwgMHhmNzY4NDc5MyksCisgICAgSFRDUCgweDAwMDAwMDAwLCAweDA1ZDFlYWMyKSwgSFRDUCgweDAwMDAwMDAwLCAweDA1ZDFlYWMyKSwKKyAgICBIVENQKDB4MDM4ZjI3NmUsIDB4MDg5N2I4NmQpLCBIVENQKDB4ZmVlMzRiNWYsIDB4ZmQ1MGE4ZjEpLAorICAgIEhUQ1AoMHgwOGYyNmQzNiwgMHgwOGYyNmQzNiksIEhUQ1AoMHhmZjUzMjEwOSwgMHhmZjUzMjEwOSksCisgICAgSFRDUCgweDBkZjI2NDA3LCAweDA1YzZlNzdlKX07CiAKLXN0YXRpYyBjb25zdCBGSVhQX0hUQiBIeWJGaWx0ZXJDb2VmMlsxM10gPSB7Ci0gIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAxODk5NDg3NTI2MDQ5ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKC0wLjA3MjkzMTM5MTY3NTM4ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKCAwLjMwNTk2NjMwNTQ1MTY4ZiksCi0gIEZMMkZYQ09OU1RfSFRCKCAwLjUwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKCAwLjMwNTk2NjMwNTQ1MTY4ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKC0wLjA3MjkzMTM5MTY3NTM4ZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfSFRCKCAwLjAxODk5NDg3NTI2MDQ5ZiksCi0gIEZMMkZYQ09OU1RfSFRCKCAwLjAwMDAwMDAwMDAwMDAwZikKLX07CitzdGF0aWMgY29uc3QgRklYUF9IVEIgSHliRmlsdGVyQ29lZjJbM10gPSB7RkwyRlhDT05TVF9IVEIoMC4wMTg5OTQ4NzUyNjA0OWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfSFRCKC0wLjA3MjkzMTM5MTY3NTM4ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoMC4zMDU5NjYzMDU0NTE2OGYpfTsKIAotc3RhdGljIGNvbnN0IEZJWFBfSFRCIEh5YkZpbHRlckNvZWY0WzEzXSA9IHsKLSAgRkwyRlhDT05TVF9IVEIoLTAuMDAzMDUxNTE5MjczMDVmKSwgRkwyRlhDT05TVF9IVEIoLTAuMDA3OTQ4NjIzMTYyMDNmKSwgRkwyRlhDT05TVF9IVEIoICAgICAgICAgICAgICAwLjBmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDQzMTg5MjQwMzg3NTZmKSwgRkwyRlhDT05TVF9IVEIoIDAuMTI1NDI0NDgyMTA0NDVmKSwgRkwyRlhDT05TVF9IVEIoIDAuMjEyMjc4MDcwNDkxNjBmKSwKLSAgRkwyRlhDT05TVF9IVEIoICAgICAgICAgICAgIDAuMjVmKSwgRkwyRlhDT05TVF9IVEIoIDAuMjEyMjc4MDcwNDkxNjBmKSwgRkwyRlhDT05TVF9IVEIoIDAuMTI1NDI0NDgyMTA0NDVmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDQzMTg5MjQwMzg3NTZmKSwgRkwyRlhDT05TVF9IVEIoICAgICAgICAgICAgICAwLjBmKSwgRkwyRlhDT05TVF9IVEIoLTAuMDA3OTQ4NjIzMTYyMDNmKSwKLSAgRkwyRlhDT05TVF9IVEIoLTAuMDAzMDUxNTE5MjczMDVmKQotfTsKK3N0YXRpYyBjb25zdCBGSVhQX0hUQiBIeWJGaWx0ZXJDb2VmNFsxM10gPSB7RkwyRlhDT05TVF9IVEIoLTAuMDAzMDUxNTE5MjczMDVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoLTAuMDA3OTQ4NjIzMTYyMDNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoMC4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfSFRCKDAuMDQzMTg5MjQwMzg3NTZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoMC4xMjU0MjQ0ODIxMDQ0NWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0hUQigwLjIxMjI3ODA3MDQ5MTYwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfSFRCKDAuMjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoMC4yMTIyNzgwNzA0OTE2MGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0hUQigwLjEyNTQyNDQ4MjEwNDQ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfSFRCKDAuMDQzMTg5MjQwMzg3NTZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoMC4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfSFRCKC0wLjAwNzk0ODYyMzE2MjAzZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfSFRCKC0wLjAwMzA1MTUxOTI3MzA1Zil9OwogCiAvKi0tLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBJTlQga0NoYW5uZWxGaWx0ZXJpbmcoCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZSZWFsLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKLSAgICAgICAgY29uc3QgSU5UICpjb25zdCAgICAgICAgICAgcFJlYWRJZHgsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRSZWFsLAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkSW1hZywKLSAgICAgICAgY29uc3QgU0NIQVIgICAgICAgICAgICAgICAgaHlicmlkQ29uZmlnCi0gICAgICAgICk7Ci0KK3N0YXRpYyBJTlQga0NoYW5uZWxGaWx0ZXJpbmcoY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcFFtZkltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqY29uc3QgcFJlYWRJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBtSHlicmlkUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IG1IeWJyaWRJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiBoeWJyaWRDb25maWcpOwogCiAvKi0tLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tKi8KIAotSU5UIEZES2h5YnJpZEFuYWx5c2lzT3BlbigKLSAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyLAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwTEZtZW1vcnksCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgIExGbWVtb3J5U2l6ZSwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcEhGbWVtb3J5LAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICBIRm1lbW9yeVNpemUKLSAgICAgICAgKQoteworSU5UIEZES2h5YnJpZEFuYWx5c2lzT3BlbihIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSIGhBbmFseXNpc0h5YkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBMRm1lbW9yeSwgY29uc3QgVUlOVCBMRm1lbW9yeVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBwSEZtZW1vcnksIGNvbnN0IFVJTlQgSEZtZW1vcnlTaXplKSB7CiAgIElOVCBlcnIgPSAwOwogCiAgIC8qIFNhdmUgcG9pbnRlciB0byBleHRlcm4gbWVtb3J5LiAqLwotICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBMRm1lbW9yeSAgICA9IHBMRm1lbW9yeTsKKyAgaEFuYWx5c2lzSHliRmlsdGVyLT5wTEZtZW1vcnkgPSBwTEZtZW1vcnk7CiAgIGhBbmFseXNpc0h5YkZpbHRlci0+TEZtZW1vcnlTaXplID0gTEZtZW1vcnlTaXplOwogCi0gIGhBbmFseXNpc0h5YkZpbHRlci0+cEhGbWVtb3J5ICAgID0gcEhGbWVtb3J5OworICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBIRm1lbW9yeSA9IHBIRm1lbW9yeTsKICAgaEFuYWx5c2lzSHliRmlsdGVyLT5IRm1lbW9yeVNpemUgPSBIRm1lbW9yeVNpemU7CiAKICAgcmV0dXJuIGVycjsKIH0KIAotSU5UIEZES2h5YnJpZEFuYWx5c2lzSW5pdCgKLSAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyLAotICAgICAgICBjb25zdCBGREtfSFlCUklEX01PREUgICAgICBtb2RlLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBxbWZCYW5kcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgY3BseEJhbmRzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBpbml0U3RhdGVzRmxhZwotICAgICAgICApCi17Ci0gICAgaW50IGs7Ci0gICAgSU5UIGVyciA9IDA7Ci0gICAgRklYUF9EQkwgKnBNZW0gPSBOVUxMOwotICAgIEhBTkRMRV9GREtfSFlCUklEX1NFVFVQIHNldHVwID0gTlVMTDsKK0lOVCBGREtoeWJyaWRBbmFseXNpc0luaXQoSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiBoQW5hbHlzaXNIeWJGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19IWUJSSURfTU9ERSBtb2RlLCBjb25zdCBJTlQgcW1mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjcGx4QmFuZHMsIGNvbnN0IElOVCBpbml0U3RhdGVzRmxhZykgeworICBpbnQgazsKKyAgSU5UIGVyciA9IDA7CisgIEZJWFBfREJMICpwTWVtID0gTlVMTDsKKyAgSEFORExFX0ZES19IWUJSSURfU0VUVVAgc2V0dXAgPSBOVUxMOwogCi0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICBjYXNlIFRIUkVFX1RPX1RFTjogICAgIHNldHVwID0gKEhBTkRMRV9GREtfSFlCUklEX1NFVFVQKSZzZXR1cF8zXzEwOyBicmVhazsKLSAgICAgIGNhc2UgVEhSRUVfVE9fVFdFTFZFOiAgc2V0dXAgPSAoSEFORExFX0ZES19IWUJSSURfU0VUVVApJnNldHVwXzNfMTI7IGJyZWFrOwotICAgICAgY2FzZSBUSFJFRV9UT19TSVhURUVOOiBzZXR1cCA9IChIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCkmc2V0dXBfM18xNjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgIGVyciA9IC0xOyBnb3RvIGJhaWw7Ci0gICAgfQorICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFRIUkVFX1RPX1RFTjoKKyAgICAgIHNldHVwID0gJnNldHVwXzNfMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRIUkVFX1RPX1RXRUxWRToKKyAgICAgIHNldHVwID0gJnNldHVwXzNfMTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRIUkVFX1RPX1NJWFRFRU46CisgICAgICBzZXR1cCA9ICZzZXR1cF8zXzE2OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVyciA9IC0xOworICAgICAgZ290byBiYWlsOworICB9CiAKLSAgICAvKiBJbml0aWFsaXplIGhhbmRsZS4gKi8KLSAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cCAgICAgID0gc2V0dXA7Ci0gICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRnBvcyA9IHNldHVwLT5wcm90b0xlbi0xOworICAvKiBJbml0aWFsaXplIGhhbmRsZS4gKi8KKyAgaEFuYWx5c2lzSHliRmlsdGVyLT5wU2V0dXAgPSBzZXR1cDsKKyAgaWYgKGluaXRTdGF0ZXNGbGFnKSB7CisgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRnBvcyA9IHNldHVwLT5wcm90b0xlbiAtIDE7CiAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvcyA9IDA7Ci0gICAgaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzICAgICA9IHFtZkJhbmRzOwotICAgIGhBbmFseXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzICAgPSBjcGx4QmFuZHM7Ci0gICAgaEFuYWx5c2lzSHliRmlsdGVyLT5oZk1vZGUgICAgICA9IDA7CisgIH0KKyAgaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzID0gcW1mQmFuZHM7CisgIGhBbmFseXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzID0gY3BseEJhbmRzOworICBoQW5hbHlzaXNIeWJGaWx0ZXItPmhmTW9kZSA9IDA7CiAKLSAgICAvKiBDaGVjayBhdmFpbGFibGUgbWVtb3J5LiAqLwotICAgIGlmICggKCgyKnNldHVwLT5uclFtZkJhbmRzKnNldHVwLT5wcm90b0xlbipzaXplb2YoRklYUF9EQkwpKSA+IGhBbmFseXNpc0h5YkZpbHRlci0+TEZtZW1vcnlTaXplKQotICAgICAgfHwgKChzZXR1cC0+ZmlsdGVyRGVsYXkqKChxbWZCYW5kcy1zZXR1cC0+bnJRbWZCYW5kcykrKGNwbHhCYW5kcy1zZXR1cC0+bnJRbWZCYW5kcykpKnNpemVvZihGSVhQX0RCTCkpID4gaEFuYWx5c2lzSHliRmlsdGVyLT5IRm1lbW9yeVNpemUpICkKLSAgICB7Ci0gICAgICBlcnIgPSAtMjsKKyAgLyogQ2hlY2sgYXZhaWxhYmxlIG1lbW9yeS4gKi8KKyAgaWYgKCgoMiAqIHNldHVwLT5uclFtZkJhbmRzICogc2V0dXAtPnByb3RvTGVuICogc2l6ZW9mKEZJWFBfREJMKSkgPgorICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+TEZtZW1vcnlTaXplKSkgeworICAgIGVyciA9IC0yOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyLT5IRm1lbW9yeVNpemUgIT0gMCkgeworICAgIGlmICgoKHNldHVwLT5maWx0ZXJEZWxheSAqCisgICAgICAgICAgKChxbWZCYW5kcyAtIHNldHVwLT5uclFtZkJhbmRzKSArIChjcGx4QmFuZHMgLSBzZXR1cC0+bnJRbWZCYW5kcykpICoKKyAgICAgICAgICBzaXplb2YoRklYUF9EQkwpKSA+IGhBbmFseXNpc0h5YkZpbHRlci0+SEZtZW1vcnlTaXplKSkgeworICAgICAgZXJyID0gLTM7CiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQorICB9CiAKLSAgICAvKiBEaXN0cmlidXQgTEYgbWVtb3J5LiAqLwotICAgIHBNZW0gPSBoQW5hbHlzaXNIeWJGaWx0ZXItPnBMRm1lbW9yeTsKLSAgICBmb3IgKGs9MDsgazxzZXR1cC0+bnJRbWZCYW5kczsgaysrKSB7Ci0gICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGUmVhbFtrXSA9IHBNZW07IHBNZW0gKz0gc2V0dXAtPnByb3RvTGVuOwotICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRkltYWdba10gPSBwTWVtOyBwTWVtICs9IHNldHVwLT5wcm90b0xlbjsKLSAgICB9CisgIC8qIERpc3RyaWJ1dGUgTEYgbWVtb3J5LiAqLworICBwTWVtID0gaEFuYWx5c2lzSHliRmlsdGVyLT5wTEZtZW1vcnk7CisgIGZvciAoayA9IDA7IGsgPCBzZXR1cC0+bnJRbWZCYW5kczsgaysrKSB7CisgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRlJlYWxba10gPSBwTWVtOworICAgIHBNZW0gKz0gc2V0dXAtPnByb3RvTGVuOworICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZJbWFnW2tdID0gcE1lbTsKKyAgICBwTWVtICs9IHNldHVwLT5wcm90b0xlbjsKKyAgfQogCi0gICAgLyogRGlzdHJpYnV0IEhGIG1lbW9yeS4gKi8KKyAgLyogRGlzdHJpYnV0ZSBIRiBtZW1vcnkuICovCisgIGlmIChoQW5hbHlzaXNIeWJGaWx0ZXItPkhGbWVtb3J5U2l6ZSAhPSAwKSB7CiAgICAgcE1lbSA9IGhBbmFseXNpc0h5YkZpbHRlci0+cEhGbWVtb3J5OwotICAgIGZvciAoaz0wOyBrPHNldHVwLT5maWx0ZXJEZWxheTsgaysrKSB7Ci0gICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGUmVhbFtrXSA9IHBNZW07IHBNZW0gKz0gKHFtZkJhbmRzLXNldHVwLT5uclFtZkJhbmRzKTsKLSAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2tdID0gcE1lbTsgcE1lbSArPSAoY3BseEJhbmRzLXNldHVwLT5uclFtZkJhbmRzKTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgc2V0dXAtPmZpbHRlckRlbGF5OyBrKyspIHsKKyAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZSZWFsW2tdID0gcE1lbTsKKyAgICAgIHBNZW0gKz0gKHFtZkJhbmRzIC0gc2V0dXAtPm5yUW1mQmFuZHMpOworICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRkltYWdba10gPSBwTWVtOworICAgICAgcE1lbSArPSAoY3BseEJhbmRzIC0gc2V0dXAtPm5yUW1mQmFuZHMpOworICAgIH0KKyAgfQorCisgIGlmIChpbml0U3RhdGVzRmxhZykgeworICAgIC8qIENsZWFyIExGIGJ1ZmZlciAqLworICAgIGZvciAoayA9IDA7IGsgPCBzZXR1cC0+bnJRbWZCYW5kczsgaysrKSB7CisgICAgICBGREttZW1jbGVhcihoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGUmVhbFtrXSwKKyAgICAgICAgICAgICAgICAgIHNldHVwLT5wcm90b0xlbiAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY2xlYXIoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRkltYWdba10sCisgICAgICAgICAgICAgICAgICBzZXR1cC0+cHJvdG9MZW4gKiBzaXplb2YoRklYUF9EQkwpKTsKICAgICB9CiAKLSAgICBpZiAoaW5pdFN0YXRlc0ZsYWcpIHsKLSAgICAgIC8qIENsZWFyIExGIGJ1ZmZlciAqLwotICAgICAgZm9yIChrPTA7IGs8c2V0dXAtPm5yUW1mQmFuZHM7IGsrKykgewotICAgICAgICBGREttZW1jbGVhcihoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGUmVhbFtrXSwgc2V0dXAtPnByb3RvTGVuKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgICBGREttZW1jbGVhcihoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXSwgc2V0dXAtPnByb3RvTGVuKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgfQotCisgICAgaWYgKGhBbmFseXNpc0h5YkZpbHRlci0+SEZtZW1vcnlTaXplICE9IDApIHsKICAgICAgIGlmIChxbWZCYW5kcyA+IHNldHVwLT5uclFtZkJhbmRzKSB7Ci0gICAgICAvKiBDbGVhciBIRiBidWZmZXIgKi8KLSAgICAgIGZvciAoaz0wOyBrPHNldHVwLT5maWx0ZXJEZWxheTsgaysrKSB7Ci0gICAgICAgIEZES21lbWNsZWFyKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZSZWFsW2tdLCAocW1mQmFuZHMtc2V0dXAtPm5yUW1mQmFuZHMpKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgICBGREttZW1jbGVhcihoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGSW1hZ1trXSwgKGNwbHhCYW5kcy1zZXR1cC0+bnJRbWZCYW5kcykqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIH0KLQotYmFpbDoKLSAgICByZXR1cm4gZXJyOwotfQotCi1JTlQgRkRLaHlicmlkQW5hbHlzaXNTY2FsZVN0YXRlcygKLSAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBzY2FsaW5nVmFsdWUKLSAgICAgICAgKQotewotICAgIElOVCBlcnIgPSAwOwotCi0gICAgaWYgKGhBbmFseXNpc0h5YkZpbHRlcj09TlVMTCkgewotICAgICAgZXJyID0gMTsgLyogaW52YWxpZCBoYW5kbGUgKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpbnQgazsKLSAgICAgIEhBTkRMRV9GREtfSFlCUklEX1NFVFVQIHNldHVwID0gaEFuYWx5c2lzSHliRmlsdGVyLT5wU2V0dXA7Ci0KLSAgICAgIC8qIFNjYWxlIExGIGJ1ZmZlciAqLwotICAgICAgZm9yIChrPTA7IGs8c2V0dXAtPm5yUW1mQmFuZHM7IGsrKykgewotICAgICAgICBzY2FsZVZhbHVlcyhoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGUmVhbFtrXSwgc2V0dXAtPnByb3RvTGVuLCBzY2FsaW5nVmFsdWUpOwotICAgICAgICBzY2FsZVZhbHVlcyhoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXSwgc2V0dXAtPnByb3RvTGVuLCBzY2FsaW5nVmFsdWUpOwotICAgICAgfQotICAgICAgaWYgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcyA+IHNldHVwLT5uclFtZkJhbmRzKSB7Ci0gICAgICAgIC8qIFNjYWxlIEhGIGJ1ZmZlciAqLwotICAgICAgICBmb3IgKGs9MDsgazxzZXR1cC0+ZmlsdGVyRGVsYXk7IGsrKykgewotICAgICAgICAgIHNjYWxlVmFsdWVzKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZSZWFsW2tdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzLXNldHVwLT5uclFtZkJhbmRzKSwgc2NhbGluZ1ZhbHVlKTsKLSAgICAgICAgICBzY2FsZVZhbHVlcyhoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGSW1hZ1trXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzLXNldHVwLT5uclFtZkJhbmRzKSwgc2NhbGluZ1ZhbHVlKTsKKyAgICAgICAgLyogQ2xlYXIgSEYgYnVmZmVyICovCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzZXR1cC0+ZmlsdGVyRGVsYXk7IGsrKykgeworICAgICAgICAgIEZES21lbWNsZWFyKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZSZWFsW2tdLAorICAgICAgICAgICAgICAgICAgICAgIChxbWZCYW5kcyAtIHNldHVwLT5uclFtZkJhbmRzKSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIEZES21lbWNsZWFyKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2tdLAorICAgICAgICAgICAgICAgICAgICAgIChjcGx4QmFuZHMgLSBzZXR1cC0+bnJRbWZCYW5kcykgKiBzaXplb2YoRklYUF9EQkwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZXJyOworICB9CisKK2JhaWw6CisgIHJldHVybiBlcnI7CiB9CiAKLUlOVCBGREtoeWJyaWRBbmFseXNpc0FwcGx5KAotICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZSZWFsLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcEh5YnJpZFJlYWwsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIHBIeWJyaWRJbWFnKQotewotICAgIGludCBrLCBoeWJPZmZzZXQgPSAwOwotICAgIElOVCBlcnIgPSAwOwotICAgIGNvbnN0IGludCBuclFtZkJhbmRzTEYgPSBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+bnJRbWZCYW5kczsgLyogbnVtYmVyIG9mIFFNRiBiYW5kcyB0byBiZSBjb252ZXJ0ZWQgdG8gaHlicmlkICovCitJTlQgRkRLaHlicmlkQW5hbHlzaXNTY2FsZVN0YXRlcyhIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSIGhBbmFseXNpc0h5YkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzY2FsaW5nVmFsdWUpIHsKKyAgSU5UIGVyciA9IDA7CiAKLSAgICBjb25zdCBpbnQgd3JpdEluZGV4ID0gaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRnBvczsKLSAgICBpbnQgcmVhZEluZGV4ID0gaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRnBvczsKKyAgaWYgKGhBbmFseXNpc0h5YkZpbHRlciA9PSBOVUxMKSB7CisgICAgZXJyID0gMTsgLyogaW52YWxpZCBoYW5kbGUgKi8KKyAgfSBlbHNlIHsKKyAgICBpbnQgazsKKyAgICBIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCBzZXR1cCA9IGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwOwogCi0gICAgaWYgKCsrcmVhZEluZGV4Pj1oQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+cHJvdG9MZW4pIHJlYWRJbmRleCA9IDA7Ci0gICAgY29uc3QgSU5UKiBwQnVmZmVyTEZyZWFkSWR4ID0gJmhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5wUmVhZElkeFRhYmxlW3JlYWRJbmRleF07CisgICAgLyogU2NhbGUgTEYgYnVmZmVyICovCisgICAgZm9yIChrID0gMDsgayA8IHNldHVwLT5uclFtZkJhbmRzOyBrKyspIHsKKyAgICAgIHNjYWxlVmFsdWVzKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdLCBzZXR1cC0+cHJvdG9MZW4sCisgICAgICAgICAgICAgICAgICBzY2FsaW5nVmFsdWUpOworICAgICAgc2NhbGVWYWx1ZXMoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRkltYWdba10sIHNldHVwLT5wcm90b0xlbiwKKyAgICAgICAgICAgICAgICAgIHNjYWxpbmdWYWx1ZSk7CisgICAgfQorICAgIGlmIChoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMgPiBzZXR1cC0+bnJRbWZCYW5kcykgeworICAgICAgLyogU2NhbGUgSEYgYnVmZmVyICovCisgICAgICBmb3IgKGsgPSAwOyBrIDwgc2V0dXAtPmZpbHRlckRlbGF5OyBrKyspIHsKKyAgICAgICAgc2NhbGVWYWx1ZXMoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRlJlYWxba10sCisgICAgICAgICAgICAgICAgICAgIChoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMgLSBzZXR1cC0+bnJRbWZCYW5kcyksCisgICAgICAgICAgICAgICAgICAgIHNjYWxpbmdWYWx1ZSk7CisgICAgICAgIHNjYWxlVmFsdWVzKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2tdLAorICAgICAgICAgICAgICAgICAgICAoaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMgLSBzZXR1cC0+bnJRbWZCYW5kcyksCisgICAgICAgICAgICAgICAgICAgIHNjYWxpbmdWYWx1ZSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBlcnI7Cit9CiAKLSAgICAvKgotICAgICAqIExGIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBmb3IgKGs9MDsgazxuclFtZkJhbmRzTEY7IGsrKykgewotICAgICAgICAvKiBOZXcgaW5wdXQgc2FtcGxlLiAqLwotICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGUmVhbFtrXVt3cml0SW5kZXhdID0gcFFtZlJlYWxba107Ci0gICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZJbWFnW2tdW3dyaXRJbmRleF0gPSBwUW1mSW1hZ1trXTsKK0lOVCBGREtoeWJyaWRBbmFseXNpc0FwcGx5KEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgaEFuYWx5c2lzSHliRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBIeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBIeWJyaWRJbWFnKSB7CisgIGludCBrLCBoeWJPZmZzZXQgPSAwOworICBJTlQgZXJyID0gMDsKKyAgY29uc3QgaW50IG5yUW1mQmFuZHNMRiA9CisgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cAorICAgICAgICAgIC0+bnJRbWZCYW5kczsgLyogbnVtYmVyIG9mIFFNRiBiYW5kcyB0byBiZSBjb252ZXJ0ZWQgdG8gaHlicmlkICovCisKKyAgY29uc3QgaW50IHdyaXRJbmRleCA9IGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZwb3M7CisgIGludCByZWFkSW5kZXggPSBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGcG9zOworCisgIGlmICgrK3JlYWRJbmRleCA+PSBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+cHJvdG9MZW4pIHJlYWRJbmRleCA9IDA7CisgIGNvbnN0IElOVCAqcEJ1ZmZlckxGcmVhZElkeCA9CisgICAgICAmaEFuYWx5c2lzSHliRmlsdGVyLT5wU2V0dXAtPnBSZWFkSWR4VGFibGVbcmVhZEluZGV4XTsKKworICAvKgorICAgKiBMRiBidWZmZXIuCisgICAqLworICBmb3IgKGsgPSAwOyBrIDwgbnJRbWZCYW5kc0xGOyBrKyspIHsKKyAgICAvKiBOZXcgaW5wdXQgc2FtcGxlLiAqLworICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdW3dyaXRJbmRleF0gPSBwUW1mUmVhbFtrXTsKKyAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXVt3cml0SW5kZXhdID0gcFFtZkltYWdba107CiAKICAgICAvKiBQZXJmb3JtIGh5YnJpZCBmaWx0ZXJpbmcuICovCi0gICAgICAgIGtDaGFubmVsRmlsdGVyaW5nKAotICAgICAgICAgICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdLAotICAgICAgICAgICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZJbWFnW2tdLAotICAgICAgICAgICAgICAgIHBCdWZmZXJMRnJlYWRJZHgsCi0gICAgICAgICAgICAgICAgcEh5YnJpZFJlYWwraHliT2Zmc2V0LAotICAgICAgICAgICAgICAgIHBIeWJyaWRJbWFnK2h5Yk9mZnNldCwKLSAgICAgICAgICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+a0h5YnJpZFtrXSk7CisgICAgZXJyIHw9CisgICAgICAgIGtDaGFubmVsRmlsdGVyaW5nKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXSwgcEJ1ZmZlckxGcmVhZElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEh5YnJpZFJlYWwgKyBoeWJPZmZzZXQsIHBIeWJyaWRJbWFnICsgaHliT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+a0h5YnJpZFtrXSk7CiAKLSAgICAgICAgaHliT2Zmc2V0ICs9IGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5uSHliQmFuZHNba107Ci0gICAgfQorICAgIGh5Yk9mZnNldCArPSBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+bkh5YkJhbmRzW2tdOworICB9CiAKLSAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGcG9zID0gcmVhZEluZGV4OyAvKiBJbmRleCB3aGVyZSB0byB3cml0ZSBuZXh0IGlucHV0IHNhbXBsZS4gKi8KKyAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRnBvcyA9CisgICAgICByZWFkSW5kZXg7IC8qIEluZGV4IHdoZXJlIHRvIHdyaXRlIG5leHQgaW5wdXQgc2FtcGxlLiAqLwogCi0gICAgaWYgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcyA+IG5yUW1mQmFuZHNMRikgeworICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzID4gbnJRbWZCYW5kc0xGKSB7CiAgICAgLyoKICAgICAgKiBIRiBidWZmZXIuCiAgICAgICovCi0gICAgaWYgKGhBbmFseXNpc0h5YkZpbHRlci0+aGZNb2RlIT0wKSB7Ci0gICAgICAgIC8qIEhGIGRlbGF5IGNvbXBlbnNhdGlvbiB3YXMgYXBwbGllZCBvdXRzaWRlLiAqLwotICAgICAgICBGREttZW1jcHkocEh5YnJpZFJlYWwraHliT2Zmc2V0LCAmcFFtZlJlYWxbbnJRbWZCYW5kc0xGXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcy1uclFtZkJhbmRzTEYpKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgICBGREttZW1jcHkocEh5YnJpZEltYWcraHliT2Zmc2V0LCAmcFFtZkltYWdbbnJRbWZCYW5kc0xGXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgaWYgKGhBbmFseXNpc0h5YkZpbHRlci0+aGZNb2RlICE9IDApIHsKKyAgICAgIC8qIEhGIGRlbGF5IGNvbXBlbnNhdGlvbiB3YXMgYXBwbGllZCBvdXRzaWRlLiAqLworICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgIHBIeWJyaWRSZWFsICsgaHliT2Zmc2V0LCAmcFFtZlJlYWxbbnJRbWZCYW5kc0xGXSwKKyAgICAgICAgICAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzIC0gbnJRbWZCYW5kc0xGKSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgIHBIeWJyaWRJbWFnICsgaHliT2Zmc2V0LCAmcFFtZkltYWdbbnJRbWZCYW5kc0xGXSwKKyAgICAgICAgICAoaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMgLSBuclFtZkJhbmRzTEYpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZES19BU1NFUlQoaEFuYWx5c2lzSHliRmlsdGVyLT5IRm1lbW9yeVNpemUgIT0gMCk7CisgICAgICAvKiBIRiBkZWxheSBjb21wZW5zYXRpb24sIGZpbHRlcmxlbmd0aC8yLiAqLworICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgIHBIeWJyaWRSZWFsICsgaHliT2Zmc2V0LAorICAgICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZSZWFsW2hBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3NdLAorICAgICAgICAgIChoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMgLSBuclFtZkJhbmRzTEYpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jcHkoCisgICAgICAgICAgcEh5YnJpZEltYWcgKyBoeWJPZmZzZXQsCisgICAgICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRkltYWdbaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvc10sCisgICAgICAgICAgKGhBbmFseXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzIC0gbnJRbWZCYW5kc0xGKSAqIHNpemVvZihGSVhQX0RCTCkpOworCisgICAgICBGREttZW1jcHkoCisgICAgICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRlJlYWxbaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvc10sCisgICAgICAgICAgJnBRbWZSZWFsW25yUW1mQmFuZHNMRl0sCisgICAgICAgICAgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcyAtIG5yUW1mQmFuZHNMRikgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNweSgKKyAgICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGSW1hZ1toQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zXSwKKyAgICAgICAgICAmcFFtZkltYWdbbnJRbWZCYW5kc0xGXSwKKyAgICAgICAgICAoaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMgLSBuclFtZkJhbmRzTEYpICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICAgIGlmICgrK2hBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3MgPj0KKyAgICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+ZmlsdGVyRGVsYXkpCisgICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3MgPSAwOwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogSEYgZGVsYXkgY29tcGVuc2F0aW9uLCBmaWx0ZXJsZW5ndGgvMi4gKi8KLSAgICBGREttZW1jcHkocEh5YnJpZFJlYWwraHliT2Zmc2V0LCBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGUmVhbFtoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcy1uclFtZkJhbmRzTEYpKnNpemVvZihGSVhQX0RCTCkpOwotICAgIEZES21lbWNweShwSHlicmlkSW1hZytoeWJPZmZzZXQsIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2hBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3NdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMtbnJRbWZCYW5kc0xGKSpzaXplb2YoRklYUF9EQkwpKTsKKyAgfSAvKiBwcm9jZXNzIEhGIHBhcnQqLwogCi0gICAgRkRLbWVtY3B5KGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZSZWFsW2hBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3NdLCAmcFFtZlJlYWxbbnJRbWZCYW5kc0xGXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcy1uclFtZkJhbmRzTEYpKnNpemVvZihGSVhQX0RCTCkpOwotICAgIEZES21lbWNweShoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGSW1hZ1toQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zXSwgJnBRbWZJbWFnW25yUW1mQmFuZHNMRl0sIChoQW5hbHlzaXNIeWJGaWx0ZXItPmNwbHhCYW5kcy1uclFtZkJhbmRzTEYpKnNpemVvZihGSVhQX0RCTCkpOwotCi0gICAgaWYgKCsraEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvcz49aEFuYWx5c2lzSHliRmlsdGVyLT5wU2V0dXAtPmZpbHRlckRlbGF5KSBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zID0gMDsKLSAgICB9Ci0gICAgfSAvKiBwcm9jZXNzIEhGIHBhcnQqLwotCi0gICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIGVycjsKIH0KIAotSU5UIEZES2h5YnJpZEFuYWx5c2lzQ2xvc2UoCi0gICAgICAgIEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgaEFuYWx5c2lzSHliRmlsdGVyCi0gICAgICAgICkKLXsKK0lOVCBGREtoeWJyaWRBbmFseXNpc0Nsb3NlKEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgaEFuYWx5c2lzSHliRmlsdGVyKSB7CiAgIElOVCBlcnIgPSAwOwogCiAgIGlmIChoQW5hbHlzaXNIeWJGaWx0ZXIgIT0gTlVMTCkgewotICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cExGbWVtb3J5ICAgID0gTlVMTDsKLSAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBIRm1lbW9yeSAgICA9IE5VTEw7CisgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5wTEZtZW1vcnkgPSBOVUxMOworICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cEhGbWVtb3J5ID0gTlVMTDsKICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPkxGbWVtb3J5U2l6ZSA9IDA7CiAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5IRm1lbW9yeVNpemUgPSAwOwogICB9CkBAIC0zNzksMzMxICs0MzUsMzc5IEBACiAgIHJldHVybiBlcnI7CiB9CiAKLUlOVCBGREtoeWJyaWRTeW50aGVzaXNJbml0KAotICAgICAgICBIQU5ETEVfRkRLX1NZTl9IWUJfRklMVEVSICBoU3ludGhlc2lzSHliRmlsdGVyLAotICAgICAgICBjb25zdCBGREtfSFlCUklEX01PREUgICAgICBtb2RlLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBxbWZCYW5kcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgY3BseEJhbmRzCi0gICAgICAgICkKLXsKLSAgICBJTlQgZXJyID0gMDsKLSAgICBIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCBzZXR1cCA9IE5VTEw7CitJTlQgRkRLaHlicmlkU3ludGhlc2lzSW5pdChIQU5ETEVfRkRLX1NZTl9IWUJfRklMVEVSIGhTeW50aGVzaXNIeWJGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfSFlCUklEX01PREUgbW9kZSwgY29uc3QgSU5UIHFtZkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGNwbHhCYW5kcykgeworICBJTlQgZXJyID0gMDsKKyAgSEFORExFX0ZES19IWUJSSURfU0VUVVAgc2V0dXAgPSBOVUxMOwogCi0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICBjYXNlIFRIUkVFX1RPX1RFTjogICAgIHNldHVwID0gKEhBTkRMRV9GREtfSFlCUklEX1NFVFVQKSZzZXR1cF8zXzEwOyBicmVhazsKLSAgICAgIGNhc2UgVEhSRUVfVE9fVFdFTFZFOiAgc2V0dXAgPSAoSEFORExFX0ZES19IWUJSSURfU0VUVVApJnNldHVwXzNfMTI7IGJyZWFrOwotICAgICAgY2FzZSBUSFJFRV9UT19TSVhURUVOOiBzZXR1cCA9IChIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCkmc2V0dXBfM18xNjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgIGVyciA9IC0xOyBnb3RvIGJhaWw7Ci0gICAgfQorICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFRIUkVFX1RPX1RFTjoKKyAgICAgIHNldHVwID0gJnNldHVwXzNfMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRIUkVFX1RPX1RXRUxWRToKKyAgICAgIHNldHVwID0gJnNldHVwXzNfMTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRIUkVFX1RPX1NJWFRFRU46CisgICAgICBzZXR1cCA9ICZzZXR1cF8zXzE2OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVyciA9IC0xOworICAgICAgZ290byBiYWlsOworICB9CiAKLSAgICBoU3ludGhlc2lzSHliRmlsdGVyLT5wU2V0dXAgICAgICA9IHNldHVwOwotICAgIGhTeW50aGVzaXNIeWJGaWx0ZXItPm5yQmFuZHMgICAgID0gcW1mQmFuZHM7Ci0gICAgaFN5bnRoZXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzICAgPSBjcGx4QmFuZHM7CisgIGhTeW50aGVzaXNIeWJGaWx0ZXItPnBTZXR1cCA9IHNldHVwOworICBoU3ludGhlc2lzSHliRmlsdGVyLT5uckJhbmRzID0gcW1mQmFuZHM7CisgIGhTeW50aGVzaXNIeWJGaWx0ZXItPmNwbHhCYW5kcyA9IGNwbHhCYW5kczsKIAogYmFpbDoKLSAgICByZXR1cm4gZXJyOworICByZXR1cm4gZXJyOwogfQogCit2b2lkIEZES2h5YnJpZFN5bnRoZXNpc0FwcGx5KEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgaFN5bnRoZXNpc0h5YkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBIeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcEh5YnJpZEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBwUW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBRbWZJbWFnKSB7CisgIGludCBrLCBuLCBoeWJPZmZzZXQgPSAwOworICBjb25zdCBJTlQgbnJRbWZCYW5kc0xGID0gaFN5bnRoZXNpc0h5YkZpbHRlci0+cFNldHVwLT5uclFtZkJhbmRzOwogCi1JTlQgRkRLaHlicmlkU3ludGhlc2lzQXBwbHkoCi0gICAgICAgIEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgIGhTeW50aGVzaXNIeWJGaWx0ZXIsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBIeWJyaWRSZWFsLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwSHlicmlkSW1hZywKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcFFtZlJlYWwsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIHBRbWZJbWFnCi0gICAgICAgICkKLXsKLSAgICBpbnQgaywgbiwgaHliT2Zmc2V0PTA7Ci0gICAgSU5UIGVyciA9IDA7Ci0gICAgY29uc3QgSU5UIG5yUW1mQmFuZHNMRiA9IGhTeW50aGVzaXNIeWJGaWx0ZXItPnBTZXR1cC0+bnJRbWZCYW5kczsKKyAgLyoKKyAgICogTEYgYnVmZmVyLgorICAgKi8KKyAgZm9yIChrID0gMDsgayA8IG5yUW1mQmFuZHNMRjsgaysrKSB7CisgICAgY29uc3QgaW50IG5IeWJCYW5kcyA9IGhTeW50aGVzaXNIeWJGaWx0ZXItPnBTZXR1cC0+bkh5YkJhbmRzW2tdOwogCisgICAgRklYUF9EQkwgYWNjdTEgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgIEZJWFBfREJMIGFjY3UyID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKworICAgIC8qIFBlcmZvcm0gaHlicmlkIGZpbHRlcmluZy4gKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgbkh5YkJhbmRzOyBuKyspIHsKKyAgICAgIGFjY3UxICs9IHBIeWJyaWRSZWFsW2h5Yk9mZnNldCArIG5dOworICAgICAgYWNjdTIgKz0gcEh5YnJpZEltYWdbaHliT2Zmc2V0ICsgbl07CisgICAgfQorICAgIHBRbWZSZWFsW2tdID0gYWNjdTE7CisgICAgcFFtZkltYWdba10gPSBhY2N1MjsKKworICAgIGh5Yk9mZnNldCArPSBuSHliQmFuZHM7CisgIH0KKworICBpZiAoaFN5bnRoZXNpc0h5YkZpbHRlci0+bnJCYW5kcyA+IG5yUW1mQmFuZHNMRikgewogICAgIC8qCi0gICAgICogTEYgYnVmZmVyLgorICAgICAqIEhGIGJ1ZmZlci4KICAgICAgKi8KLSAgICBmb3IgKGs9MDsgazxuclFtZkJhbmRzTEY7IGsrKykgewotICAgICAgY29uc3QgaW50IG5IeWJCYW5kcyA9IGhTeW50aGVzaXNIeWJGaWx0ZXItPnBTZXR1cC0+bkh5YkJhbmRzW2tdOworICAgIEZES21lbWNweSgmcFFtZlJlYWxbbnJRbWZCYW5kc0xGXSwgJnBIeWJyaWRSZWFsW2h5Yk9mZnNldF0sCisgICAgICAgICAgICAgIChoU3ludGhlc2lzSHliRmlsdGVyLT5uckJhbmRzIC0gbnJRbWZCYW5kc0xGKSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNweSgKKyAgICAgICAgJnBRbWZJbWFnW25yUW1mQmFuZHNMRl0sICZwSHlicmlkSW1hZ1toeWJPZmZzZXRdLAorICAgICAgICAoaFN5bnRoZXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzIC0gbnJRbWZCYW5kc0xGKSAqIHNpemVvZihGSVhQX0RCTCkpOworICB9CiAKLSAgICAgIEZJWFBfREJMIGFjY3UxID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgIEZJWFBfREJMIGFjY3UyID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLQotICAgICAgLyogUGVyZm9ybSBoeWJyaWQgZmlsdGVyaW5nLiAqLwotICAgICAgZm9yIChuPTA7IG48bkh5YkJhbmRzOyBuKyspIHsKLSAgICAgICAgICBhY2N1MSArPSBwSHlicmlkUmVhbFtoeWJPZmZzZXQrbl07Ci0gICAgICAgICAgYWNjdTIgKz0gcEh5YnJpZEltYWdbaHliT2Zmc2V0K25dOwotICAgICAgfQotICAgICAgcFFtZlJlYWxba10gPSBhY2N1MTsKLSAgICAgIHBRbWZJbWFnW2tdID0gYWNjdTI7Ci0KLSAgICAgIGh5Yk9mZnNldCArPSBuSHliQmFuZHM7Ci0gICAgfQotCi0gICAgaWYgKGhTeW50aGVzaXNIeWJGaWx0ZXItPm5yQmFuZHMgPiBuclFtZkJhbmRzTEYpIHsKLSAgICAgIC8qCi0gICAgICAgKiBIRiBidWZmZXIuCi0gICAgICAgKi8KLSAgICBGREttZW1jcHkoJnBRbWZSZWFsW25yUW1mQmFuZHNMRl0sICZwSHlicmlkUmVhbFtoeWJPZmZzZXRdLCAoaFN5bnRoZXNpc0h5YkZpbHRlci0+bnJCYW5kcy1uclFtZkJhbmRzTEYpKnNpemVvZihGSVhQX0RCTCkpOwotICAgIEZES21lbWNweSgmcFFtZkltYWdbbnJRbWZCYW5kc0xGXSwgJnBIeWJyaWRJbWFnW2h5Yk9mZnNldF0sIChoU3ludGhlc2lzSHliRmlsdGVyLT5jcGx4QmFuZHMtbnJRbWZCYW5kc0xGKSpzaXplb2YoRklYUF9EQkwpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOworICByZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGR1YWxDaGFubmVsRmlsdGVyaW5nKAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mUmVhbCwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZkltYWcsCi0gICAgICAgIGNvbnN0IElOVCAqY29uc3QgICAgICAgICAgIHBSZWFkSWR4LAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkUmVhbCwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgbUh5YnJpZEltYWcsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGludmVydAotICAgICAgICApCi17Ci0gICAgY29uc3QgRklYUF9IVEIgKnAgPSBIeWJGaWx0ZXJDb2VmMjsKK3N0YXRpYyB2b2lkIGR1YWxDaGFubmVsRmlsdGVyaW5nKGNvbnN0IEZJWFBfREJMICpjb25zdCBwUW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwUW1mSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqY29uc3QgcFJlYWRJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgbUh5YnJpZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgbUh5YnJpZEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaW52ZXJ0KSB7CisgIEZJWFBfREJMIHIxLCByNjsKKyAgRklYUF9EQkwgaTEsIGk2OwogCi0gICAgRklYUF9EQkwgIHIxLCByNjsKLSAgICBGSVhQX0RCTCAgaTEsIGk2OworICBjb25zdCBGSVhQX0hUQiBmMCA9IEh5YkZpbHRlckNvZWYyWzBdOyAvKiBjb3JyZXNwb25kcyB0byBwMSBhbmQgcDExICovCisgIGNvbnN0IEZJWFBfSFRCIGYxID0gSHliRmlsdGVyQ29lZjJbMV07IC8qIGNvcnJlc3BvbmRzIHRvIHAzIGFuZCBwOSAgKi8KKyAgY29uc3QgRklYUF9IVEIgZjIgPSBIeWJGaWx0ZXJDb2VmMlsyXTsgLyogY29ycmVzcG9uZHMgdG8gcDUgYW5kIHA3ICAqLwogCi0gICAgLyogc3ltbWV0cmljIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLSAgICByMSAgPSBmTXVsdERpdjIocFsxXSwgcFFtZlJlYWxbcFJlYWRJZHhbMV1dKSArIGZNdWx0RGl2MihwWzFdLCBwUW1mUmVhbFtwUmVhZElkeFsxMV1dKSA7Ci0gICAgaTEgID0gZk11bHREaXYyKHBbMV0sIHBRbWZJbWFnW3BSZWFkSWR4WzFdXSkgKyBmTXVsdERpdjIocFsxXSwgcFFtZkltYWdbcFJlYWRJZHhbMTFdXSkgOwotICAgIHIxICs9IGZNdWx0RGl2MihwWzNdLCBwUW1mUmVhbFtwUmVhZElkeFszXV0pICsgZk11bHREaXYyKHBbM10sIHBRbWZSZWFsW3BSZWFkSWR4WyA5XV0pIDsKLSAgICBpMSArPSBmTXVsdERpdjIocFszXSwgcFFtZkltYWdbcFJlYWRJZHhbM11dKSArIGZNdWx0RGl2MihwWzNdLCBwUW1mSW1hZ1twUmVhZElkeFsgOV1dKSA7Ci0gICAgcjEgKz0gZk11bHREaXYyKHBbNV0sIHBRbWZSZWFsW3BSZWFkSWR4WzVdXSkgKyBmTXVsdERpdjIocFs1XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDddXSkgOwotICAgIGkxICs9IGZNdWx0RGl2MihwWzVdLCBwUW1mSW1hZ1twUmVhZElkeFs1XV0pICsgZk11bHREaXYyKHBbNV0sIHBRbWZJbWFnW3BSZWFkSWR4WyA3XV0pIDsKLSAgICByNiAgPSBmTXVsdERpdjIocFs2XSwgcFFtZlJlYWxbcFJlYWRJZHhbNl1dKSA7Ci0gICAgaTYgID0gZk11bHREaXYyKHBbNl0sIHBRbWZJbWFnW3BSZWFkSWR4WzZdXSkgOworICAvKiBzeW1tZXRyaWMgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICByMSA9IGZNdWx0RGl2MihmMCwgcFFtZlJlYWxbcFJlYWRJZHhbMV1dKSArCisgICAgICAgZk11bHREaXYyKGYwLCBwUW1mUmVhbFtwUmVhZElkeFsxMV1dKTsKKyAgaTEgPSBmTXVsdERpdjIoZjAsIHBRbWZJbWFnW3BSZWFkSWR4WzFdXSkgKworICAgICAgIGZNdWx0RGl2MihmMCwgcFFtZkltYWdbcFJlYWRJZHhbMTFdXSk7CisgIHIxICs9IGZNdWx0RGl2MihmMSwgcFFtZlJlYWxbcFJlYWRJZHhbM11dKSArCisgICAgICAgIGZNdWx0RGl2MihmMSwgcFFtZlJlYWxbcFJlYWRJZHhbOV1dKTsKKyAgaTEgKz0gZk11bHREaXYyKGYxLCBwUW1mSW1hZ1twUmVhZElkeFszXV0pICsKKyAgICAgICAgZk11bHREaXYyKGYxLCBwUW1mSW1hZ1twUmVhZElkeFs5XV0pOworICByMSArPSBmTXVsdERpdjIoZjIsIHBRbWZSZWFsW3BSZWFkSWR4WzVdXSkgKworICAgICAgICBmTXVsdERpdjIoZjIsIHBRbWZSZWFsW3BSZWFkSWR4WzddXSk7CisgIGkxICs9IGZNdWx0RGl2MihmMiwgcFFtZkltYWdbcFJlYWRJZHhbNV1dKSArCisgICAgICAgIGZNdWx0RGl2MihmMiwgcFFtZkltYWdbcFJlYWRJZHhbN11dKTsKIAotICAgIGlmIChpbnZlcnQpIHsKLSAgICAgIG1IeWJyaWRSZWFsWzFdID0gKHIxICsgcjYpIDw8IDE7Ci0gICAgICBtSHlicmlkSW1hZ1sxXSA9IChpMSArIGk2KSA8PCAxOworICByNiA9IHBRbWZSZWFsW3BSZWFkSWR4WzZdXSA+PiAyOworICBpNiA9IHBRbWZJbWFnW3BSZWFkSWR4WzZdXSA+PiAyOwogCi0gICAgICBtSHlicmlkUmVhbFswXSA9IChyNiAtIHIxKSA8PCAxOwotICAgICAgbUh5YnJpZEltYWdbMF0gPSAoaTYgLSBpMSkgPDwgMTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBtSHlicmlkUmVhbFswXSA9IChyMSArIHI2KSA8PCAxOwotICAgICAgbUh5YnJpZEltYWdbMF0gPSAoaTEgKyBpNikgPDwgMTsKKyAgRkRLX0FTU0VSVCgoaW52ZXJ0ID09IDApIHx8IChpbnZlcnQgPT0gMSkpOworICBtSHlicmlkUmVhbFswICsgaW52ZXJ0XSA9IChyNiArIHIxKSA8PCAxOworICBtSHlicmlkSW1hZ1swICsgaW52ZXJ0XSA9IChpNiArIGkxKSA8PCAxOwogCi0gICAgICBtSHlicmlkUmVhbFsxXSA9IChyNiAtIHIxKSA8PCAxOwotICAgICAgbUh5YnJpZEltYWdbMV0gPSAoaTYgLSBpMSkgPDwgMTsKLSAgICB9CisgIG1IeWJyaWRSZWFsWzEgLSBpbnZlcnRdID0gKHI2IC0gcjEpIDw8IDE7CisgIG1IeWJyaWRJbWFnWzEgLSBpbnZlcnRdID0gKGk2IC0gaTEpIDw8IDE7CiB9CiAKLXN0YXRpYyB2b2lkIGZvdXJDaGFubmVsRmlsdGVyaW5nKAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mUmVhbCwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZkltYWcsCi0gICAgICAgIGNvbnN0IElOVCAqY29uc3QgICAgICAgICAgIHBSZWFkSWR4LAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkUmVhbCwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgbUh5YnJpZEltYWcsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGludmVydAotICAgICAgICApCi17Ci0gICAgY29uc3QgRklYUF9IVEIgKnAgPSBIeWJGaWx0ZXJDb2VmNDsKK3N0YXRpYyB2b2lkIGZvdXJDaGFubmVsRmlsdGVyaW5nKGNvbnN0IEZJWFBfREJMICpjb25zdCBwUW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwUW1mSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqY29uc3QgcFJlYWRJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgbUh5YnJpZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgbUh5YnJpZEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaW52ZXJ0KSB7CisgIGNvbnN0IEZJWFBfSFRCICpwID0gSHliRmlsdGVyQ29lZjQ7CiAKLSAgICBGSVhQX0RCTCBmZnRbOF07CisgIEZJWFBfREJMIGZmdFs4XTsKIAotICAgIHN0YXRpYyBjb25zdCBGSVhQX0RCTCAgY3JbMTNdID0gewotICAgICAgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAgMC5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAtMS5mKSwKLSAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDAuZiksIEZMMkZYQ09OU1RfREJMKCAwLjcwNzEwNjc4MTE4NjU1ZiksCi0gICAgICBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAxLmYpLAotICAgICAgRkwyRlhDT05TVF9EQkwoIDAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAgMC5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwKLSAgICAgIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgLTEuZiksIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDAuZikKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBGSVhQX0RCTCAgY2lbMTNdID0gewotICAgICAgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAtMS5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAgMC5mKSwKLSAgICAgIEZMMkZYQ09OU1RfREJMKCAwLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDEuZiksIEZMMkZYQ09OU1RfREJMKCAwLjcwNzEwNjc4MTE4NjU1ZiksCi0gICAgICBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAwLmYpLAotICAgICAgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAtMS5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwKLSAgICAgIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDAuZiksIEZMMkZYQ09OU1RfREJMKCAwLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDEuZikKLSAgICB9OworICBzdGF0aWMgY29uc3QgRklYUF9EQkwgY3JbMTNdID0geworICAgICAgRkwyRlhDT05TVF9EQkwoMC5mKSwgIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksCisgICAgICBGTDJGWENPTlNUX0RCTCgtMS5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKDAuZiksICBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU1ZiksCisgICAgICBGTDJGWENPTlNUX0RCTCgxLmYpLCAgRkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NWYpLAorICAgICAgRkwyRlhDT05TVF9EQkwoMC5mKSwgIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksCisgICAgICBGTDJGWENPTlNUX0RCTCgtMS5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKDAuZil9OworICBzdGF0aWMgY29uc3QgRklYUF9EQkwgY2lbMTNdID0geworICAgICAgRkwyRlhDT05TVF9EQkwoLTEuZiksIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksCisgICAgICBGTDJGWENPTlNUX0RCTCgwLmYpLCAgRkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NWYpLAorICAgICAgRkwyRlhDT05TVF9EQkwoMS5mKSwgIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTVmKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKDAuZiksICBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLAorICAgICAgRkwyRlhDT05TVF9EQkwoLTEuZiksIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksCisgICAgICBGTDJGWENPTlNUX0RCTCgwLmYpLCAgRkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NWYpLAorICAgICAgRkwyRlhDT05TVF9EQkwoMS5mKX07CiAKKyAgLyogRklSIGZpbHRlci4gKi8KKyAgLyogcHJlIHR3aWRkZWxpbmcgd2l0aCBwcmUtdHdpZGRsaW5nIGNvZWZmaWNpZW50cyBjW25dICAqLworICAvKiBtdWx0aXBsaWNhdGlvbiB3aXRoIGZpbHRlciBjb2VmZmljaWVudHMgcFtuXSAgICAgICAgICovCisgIC8qIGhpbnQ6IChhICsgaWIpKihjICsgaWQpID0gKGEqYyAtIGIqZCkgKyBpKGEqZCArIGIqYykgKi8KKyAgLyogd3JpdGUgdG8gZmZ0IGNvZWZmaWNpZW50IG4nICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBmZnRbRkZUX0lEWF9SKDApXSA9CisgICAgICAoZk11bHQocFsxMF0sIChmTXVsdFN1YihmTXVsdERpdjIoY3JbMl0sIHBRbWZSZWFsW3BSZWFkSWR4WzJdXSksIGNpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbMl1dKSkpICsKKyAgICAgICBmTXVsdChwWzZdLCAoZk11bHRTdWIoZk11bHREaXYyKGNyWzZdLCBwUW1mUmVhbFtwUmVhZElkeFs2XV0pLCBjaVs2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbNl1dKSkpICsKKyAgICAgICBmTXVsdChwWzJdLCAoZk11bHRTdWIoZk11bHREaXYyKGNyWzEwXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTBdXSksIGNpWzEwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbMTBdXSkpKSk7CisgIGZmdFtGRlRfSURYX0koMCldID0KKyAgICAgIChmTXVsdChwWzEwXSwgKGZNdWx0QWRkKGZNdWx0RGl2MihjaVsyXSwgcFFtZlJlYWxbcFJlYWRJZHhbMl1dKSwgY3JbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFsyXV0pKSkgKworICAgICAgIGZNdWx0KHBbNl0sIChmTXVsdEFkZChmTXVsdERpdjIoY2lbNl0sIHBRbWZSZWFsW3BSZWFkSWR4WzZdXSksIGNyWzZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFs2XV0pKSkgKworICAgICAgIGZNdWx0KHBbMl0sIChmTXVsdEFkZChmTXVsdERpdjIoY2lbMTBdLCBwUW1mUmVhbFtwUmVhZElkeFsxMF1dKSwgY3JbMTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFsxMF1dKSkpKTsKIAotICAgIC8qIEZJUiBmaWx0ZXIuICovCi0gICAgLyogcHJlIHR3aWRkZWxpbmcgd2l0aCBwcmUtdHdpZGRsaW5nIGNvZWZmaWNpZW50cyBjW25dICAqLwotICAgIC8qIG11bHRpcGxpY2F0aW9uIHdpdGggZmlsdGVyIGNvZWZmaWNpZW50cyBwW25dICAgICAgICAgKi8KLSAgICAvKiBoaW50OiAoYSArIGliKSooYyArIGlkKSA9IChhKmMgLSBiKmQpICsgaShhKmQgKyBiKmMpICovCi0gICAgLyogd3JpdGUgdG8gZmZ0IGNvZWZmaWNpZW50IG4nICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZmdFtGRlRfSURYX1IoMCldID0gICggZk11bHQocFsxMF0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyAyXSwgcFFtZlJlYWxbcFJlYWRJZHhbIDJdXSksIGNpWyAyXSwgcFFtZkltYWdbcFJlYWRJZHhbIDJdXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA2XSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDZdLCBwUW1mUmVhbFtwUmVhZElkeFsgNl1dKSwgY2lbIDZdLCBwUW1mSW1hZ1twUmVhZElkeFsgNl1dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDJdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsxMF0sIHBRbWZSZWFsW3BSZWFkSWR4WzEwXV0pLCBjaVsxMF0sIHBRbWZJbWFnW3BSZWFkSWR4WzEwXV0pKSkgKTsKLSAgICBmZnRbRkZUX0lEWF9JKDApXSA9ICAoIGZNdWx0KHBbMTBdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgMl0sIHBRbWZSZWFsW3BSZWFkSWR4WyAyXV0pLCBjclsgMl0sIHBRbWZJbWFnW3BSZWFkSWR4WyAyXV0pKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgNl0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyA2XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDZdXSksIGNyWyA2XSwgcFFtZkltYWdbcFJlYWRJZHhbIDZdXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyAyXSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbMTBdLCBwUW1mUmVhbFtwUmVhZElkeFsxMF1dKSwgY3JbMTBdLCBwUW1mSW1hZ1twUmVhZElkeFsxMF1dKSkpICk7CisgIC8qIHR3aWRkbGUgZGVlIGR1bSAqLworICBmZnRbRkZUX0lEWF9SKDEpXSA9CisgICAgICAoZk11bHQocFs5XSwgKGZNdWx0U3ViKGZNdWx0RGl2MihjclszXSwgcFFtZlJlYWxbcFJlYWRJZHhbM11dKSwgY2lbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzNdXSkpKSArCisgICAgICAgZk11bHQocFs1XSwgKGZNdWx0U3ViKGZNdWx0RGl2Mihjcls3XSwgcFFtZlJlYWxbcFJlYWRJZHhbN11dKSwgY2lbN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzddXSkpKSArCisgICAgICAgZk11bHQocFsxXSwgKGZNdWx0U3ViKGZNdWx0RGl2MihjclsxMV0sIHBRbWZSZWFsW3BSZWFkSWR4WzExXV0pLCBjaVsxMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzExXV0pKSkpOworICBmZnRbRkZUX0lEWF9JKDEpXSA9CisgICAgICAoZk11bHQocFs5XSwgKGZNdWx0QWRkKGZNdWx0RGl2MihjaVszXSwgcFFtZlJlYWxbcFJlYWRJZHhbM11dKSwgY3JbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzNdXSkpKSArCisgICAgICAgZk11bHQocFs1XSwgKGZNdWx0QWRkKGZNdWx0RGl2MihjaVs3XSwgcFFtZlJlYWxbcFJlYWRJZHhbN11dKSwgY3JbN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzddXSkpKSArCisgICAgICAgZk11bHQocFsxXSwgKGZNdWx0QWRkKGZNdWx0RGl2MihjaVsxMV0sIHBRbWZSZWFsW3BSZWFkSWR4WzExXV0pLCBjclsxMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzExXV0pKSkpOwogCi0gICAgLyogdHdpZGRsZSBkZWUgZHVtICovCi0gICAgZmZ0W0ZGVF9JRFhfUigxKV0gPSAgKCBmTXVsdChwWyA5XSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDNdLCBwUW1mUmVhbFtwUmVhZElkeFsgM11dKSwgY2lbIDNdLCBwUW1mSW1hZ1twUmVhZElkeFsgM11dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDVdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgN10sIHBRbWZSZWFsW3BSZWFkSWR4WyA3XV0pLCBjaVsgN10sIHBRbWZJbWFnW3BSZWFkSWR4WyA3XV0pKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgMV0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWzExXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTFdXSksIGNpWzExXSwgcFFtZkltYWdbcFJlYWRJZHhbMTFdXSkpKSApOwotICAgIGZmdFtGRlRfSURYX0koMSldID0gICggZk11bHQocFsgOV0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyAzXSwgcFFtZlJlYWxbcFJlYWRJZHhbIDNdXSksIGNyWyAzXSwgcFFtZkltYWdbcFJlYWRJZHhbIDNdXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA1XSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDddLCBwUW1mUmVhbFtwUmVhZElkeFsgN11dKSwgY3JbIDddLCBwUW1mSW1hZ1twUmVhZElkeFsgN11dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDFdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsxMV0sIHBRbWZSZWFsW3BSZWFkSWR4WzExXV0pLCBjclsxMV0sIHBRbWZJbWFnW3BSZWFkSWR4WzExXV0pKSkgKTsKKyAgLyogdHdpZGRsZSBkZWUgZGVlICovCisgIGZmdFtGRlRfSURYX1IoMildID0KKyAgICAgIChmTXVsdChwWzEyXSwgKGZNdWx0U3ViKGZNdWx0RGl2MihjclswXSwgcFFtZlJlYWxbcFJlYWRJZHhbMF1dKSwgY2lbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFswXV0pKSkgKworICAgICAgIGZNdWx0KHBbOF0sIChmTXVsdFN1YihmTXVsdERpdjIoY3JbNF0sIHBRbWZSZWFsW3BSZWFkSWR4WzRdXSksIGNpWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFs0XV0pKSkgKworICAgICAgIGZNdWx0KHBbNF0sIChmTXVsdFN1YihmTXVsdERpdjIoY3JbOF0sIHBRbWZSZWFsW3BSZWFkSWR4WzhdXSksIGNpWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFs4XV0pKSkgKworICAgICAgIGZNdWx0KHBbMF0sIChmTXVsdFN1YihmTXVsdERpdjIoY3JbMTJdLCBwUW1mUmVhbFtwUmVhZElkeFsxMl1dKSwgY2lbMTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFsxMl1dKSkpKTsKKyAgZmZ0W0ZGVF9JRFhfSSgyKV0gPQorICAgICAgKGZNdWx0KHBbMTJdLCAoZk11bHRBZGQoZk11bHREaXYyKGNpWzBdLCBwUW1mUmVhbFtwUmVhZElkeFswXV0pLCBjclswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzBdXSkpKSArCisgICAgICAgZk11bHQocFs4XSwgKGZNdWx0QWRkKGZNdWx0RGl2MihjaVs0XSwgcFFtZlJlYWxbcFJlYWRJZHhbNF1dKSwgY3JbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzRdXSkpKSArCisgICAgICAgZk11bHQocFs0XSwgKGZNdWx0QWRkKGZNdWx0RGl2MihjaVs4XSwgcFFtZlJlYWxbcFJlYWRJZHhbOF1dKSwgY3JbOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzhdXSkpKSArCisgICAgICAgZk11bHQocFswXSwgKGZNdWx0QWRkKGZNdWx0RGl2MihjaVsxMl0sIHBRbWZSZWFsW3BSZWFkSWR4WzEyXV0pLCBjclsxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzEyXV0pKSkpOwogCi0gICAgLyogdHdpZGRsZSBkZWUgZGVlICovCi0gICAgZmZ0W0ZGVF9JRFhfUigyKV0gPSAgKCBmTXVsdChwWzEyXSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDBdLCBwUW1mUmVhbFtwUmVhZElkeFsgMF1dKSwgY2lbIDBdLCBwUW1mSW1hZ1twUmVhZElkeFsgMF1dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDhdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgNF0sIHBRbWZSZWFsW3BSZWFkSWR4WyA0XV0pLCBjaVsgNF0sIHBRbWZJbWFnW3BSZWFkSWR4WyA0XV0pKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgNF0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyA4XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDhdXSksIGNpWyA4XSwgcFFtZkltYWdbcFJlYWRJZHhbIDhdXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyAwXSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbMTJdLCBwUW1mUmVhbFtwUmVhZElkeFsxMl1dKSwgY2lbMTJdLCBwUW1mSW1hZ1twUmVhZElkeFsxMl1dKSkpICk7Ci0gICAgZmZ0W0ZGVF9JRFhfSSgyKV0gPSAgKCBmTXVsdChwWzEyXSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDBdLCBwUW1mUmVhbFtwUmVhZElkeFsgMF1dKSwgY3JbIDBdLCBwUW1mSW1hZ1twUmVhZElkeFsgMF1dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDhdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgNF0sIHBRbWZSZWFsW3BSZWFkSWR4WyA0XV0pLCBjclsgNF0sIHBRbWZJbWFnW3BSZWFkSWR4WyA0XV0pKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgNF0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyA4XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDhdXSksIGNyWyA4XSwgcFFtZkltYWdbcFJlYWRJZHhbIDhdXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyAwXSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbMTJdLCBwUW1mUmVhbFtwUmVhZElkeFsxMl1dKSwgY3JbMTJdLCBwUW1mSW1hZ1twUmVhZElkeFsxMl1dKSkpICk7CisgIGZmdFtGRlRfSURYX1IoMyldID0KKyAgICAgIChmTXVsdChwWzExXSwgKGZNdWx0U3ViKGZNdWx0RGl2MihjclsxXSwgcFFtZlJlYWxbcFJlYWRJZHhbMV1dKSwgY2lbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFsxXV0pKSkgKworICAgICAgIGZNdWx0KHBbN10sIChmTXVsdFN1YihmTXVsdERpdjIoY3JbNV0sIHBRbWZSZWFsW3BSZWFkSWR4WzVdXSksIGNpWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFs1XV0pKSkgKworICAgICAgIGZNdWx0KHBbM10sIChmTXVsdFN1YihmTXVsdERpdjIoY3JbOV0sIHBRbWZSZWFsW3BSZWFkSWR4WzldXSksIGNpWzldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFs5XV0pKSkpOworICBmZnRbRkZUX0lEWF9JKDMpXSA9CisgICAgICAoZk11bHQocFsxMV0sIChmTXVsdEFkZChmTXVsdERpdjIoY2lbMV0sIHBRbWZSZWFsW3BSZWFkSWR4WzFdXSksIGNyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbMV1dKSkpICsKKyAgICAgICBmTXVsdChwWzddLCAoZk11bHRBZGQoZk11bHREaXYyKGNpWzVdLCBwUW1mUmVhbFtwUmVhZElkeFs1XV0pLCBjcls1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbNV1dKSkpICsKKyAgICAgICBmTXVsdChwWzNdLCAoZk11bHRBZGQoZk11bHREaXYyKGNpWzldLCBwUW1mUmVhbFtwUmVhZElkeFs5XV0pLCBjcls5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbOV1dKSkpKTsKIAotICAgIGZmdFtGRlRfSURYX1IoMyldID0gICggZk11bHQocFsxMV0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyAxXSwgcFFtZlJlYWxbcFJlYWRJZHhbIDFdXSksIGNpWyAxXSwgcFFtZkltYWdbcFJlYWRJZHhbIDFdXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA3XSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDVdLCBwUW1mUmVhbFtwUmVhZElkeFsgNV1dKSwgY2lbIDVdLCBwUW1mSW1hZ1twUmVhZElkeFsgNV1dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDNdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgOV0sIHBRbWZSZWFsW3BSZWFkSWR4WyA5XV0pLCBjaVsgOV0sIHBRbWZJbWFnW3BSZWFkSWR4WyA5XV0pKSkgKTsKLSAgICBmZnRbRkZUX0lEWF9JKDMpXSA9ICAoIGZNdWx0KHBbMTFdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgMV0sIHBRbWZSZWFsW3BSZWFkSWR4WyAxXV0pLCBjclsgMV0sIHBRbWZJbWFnW3BSZWFkSWR4WyAxXV0pKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgN10sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyA1XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDVdXSksIGNyWyA1XSwgcFFtZkltYWdbcFJlYWRJZHhbIDVdXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyAzXSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDldLCBwUW1mUmVhbFtwUmVhZElkeFsgOV1dKSwgY3JbIDldLCBwUW1mSW1hZ1twUmVhZElkeFsgOV1dKSkpICk7CisgIC8qIGZmdCBtb2R1bGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGhlcmU6IGZhc3QgbWFudWFsIGZmdCBtb2R1bGF0aW9uIGZvciBhIGZmdCBvZiBsZW5ndGggTT00ICAgICAgICAgICovCisgIC8qIGZmdF80e3hbbl19ID0geFswXSpleHAoLWkqMipwaS80Km0qMCkgKyB4WzFdKmV4cCgtaSoyKnBpLzQqbSoxKSArCisgIHhbMl0qZXhwKC1pKjIqcGkvNCptKjIpICsgeFszXSpleHAoLWkqMipwaS80Km0qMykgICAqLwogCi0gICAgLyogZmZ0IG1vZHVsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBoZXJlOiBmYXN0IG1hbnVhbCBmZnQgbW9kdWxhdGlvbiBmb3IgYSBmZnQgb2YgbGVuZ3RoIE09NCAgICAgICAgICAqLwotICAgIC8qIGZmdF80e3hbbl19ID0geFswXSpleHAoLWkqMipwaS80Km0qMCkgKyB4WzFdKmV4cCgtaSoyKnBpLzQqbSoxKSArCi0gICAgeFsyXSpleHAoLWkqMipwaS80Km0qMikgKyB4WzNdKmV4cCgtaSoyKnBpLzQqbSozKSAgICovCisgIC8qCisgIGZmdCBiaW4gbT0wOgorICBYWzAsIG5dID0geFswXSArICAgeFsxXSArIHhbMl0gKyAgIHhbM10KKyAgKi8KKyAgbUh5YnJpZFJlYWxbMF0gPSBmZnRbRkZUX0lEWF9SKDApXSArIGZmdFtGRlRfSURYX1IoMSldICsgZmZ0W0ZGVF9JRFhfUigyKV0gKworICAgICAgICAgICAgICAgICAgIGZmdFtGRlRfSURYX1IoMyldOworICBtSHlicmlkSW1hZ1swXSA9IGZmdFtGRlRfSURYX0koMCldICsgZmZ0W0ZGVF9JRFhfSSgxKV0gKyBmZnRbRkZUX0lEWF9JKDIpXSArCisgICAgICAgICAgICAgICAgICAgZmZ0W0ZGVF9JRFhfSSgzKV07CiAKLSAgICAvKgotICAgIGZmdCBiaW4gbT0wOgotICAgIFhbMCwgbl0gPSB4WzBdICsgICB4WzFdICsgeFsyXSArICAgeFszXQotICAgICovCi0gICAgbUh5YnJpZFJlYWxbMF0gPSBmZnRbRkZUX0lEWF9SKDApXSArIGZmdFtGRlRfSURYX1IoMSldICsgZmZ0W0ZGVF9JRFhfUigyKV0gKyBmZnRbRkZUX0lEWF9SKDMpXTsKLSAgICBtSHlicmlkSW1hZ1swXSA9IGZmdFtGRlRfSURYX0koMCldICsgZmZ0W0ZGVF9JRFhfSSgxKV0gKyBmZnRbRkZUX0lEWF9JKDIpXSArIGZmdFtGRlRfSURYX0koMyldOworICAvKgorICBmZnQgYmluIG09MToKKyAgWFsxLCBuXSA9IHhbMF0gLSBpKnhbMV0gLSB4WzJdICsgaSp4WzNdCisgICovCisgIG1IeWJyaWRSZWFsWzFdID0gZmZ0W0ZGVF9JRFhfUigwKV0gKyBmZnRbRkZUX0lEWF9JKDEpXSAtIGZmdFtGRlRfSURYX1IoMildIC0KKyAgICAgICAgICAgICAgICAgICBmZnRbRkZUX0lEWF9JKDMpXTsKKyAgbUh5YnJpZEltYWdbMV0gPSBmZnRbRkZUX0lEWF9JKDApXSAtIGZmdFtGRlRfSURYX1IoMSldIC0gZmZ0W0ZGVF9JRFhfSSgyKV0gKworICAgICAgICAgICAgICAgICAgIGZmdFtGRlRfSURYX1IoMyldOwogCi0gICAgLyoKLSAgICBmZnQgYmluIG09MToKLSAgICBYWzEsIG5dID0geFswXSAtIGkqeFsxXSAtIHhbMl0gKyBpKnhbM10KLSAgICAqLwotICAgIG1IeWJyaWRSZWFsWzFdID0gZmZ0W0ZGVF9JRFhfUigwKV0gKyBmZnRbRkZUX0lEWF9JKDEpXSAtIGZmdFtGRlRfSURYX1IoMildIC0gZmZ0W0ZGVF9JRFhfSSgzKV07Ci0gICAgbUh5YnJpZEltYWdbMV0gPSBmZnRbRkZUX0lEWF9JKDApXSAtIGZmdFtGRlRfSURYX1IoMSldIC0gZmZ0W0ZGVF9JRFhfSSgyKV0gKyBmZnRbRkZUX0lEWF9SKDMpXTsKKyAgLyoKKyAgZmZ0IGJpbiBtPTI6CisgIFhbMiwgbl0gPSB4WzBdIC0gICB4WzFdICsgeFsyXSAtICAgeFszXQorICAqLworICBtSHlicmlkUmVhbFsyXSA9IGZmdFtGRlRfSURYX1IoMCldIC0gZmZ0W0ZGVF9JRFhfUigxKV0gKyBmZnRbRkZUX0lEWF9SKDIpXSAtCisgICAgICAgICAgICAgICAgICAgZmZ0W0ZGVF9JRFhfUigzKV07CisgIG1IeWJyaWRJbWFnWzJdID0gZmZ0W0ZGVF9JRFhfSSgwKV0gLSBmZnRbRkZUX0lEWF9JKDEpXSArIGZmdFtGRlRfSURYX0koMildIC0KKyAgICAgICAgICAgICAgICAgICBmZnRbRkZUX0lEWF9JKDMpXTsKIAotICAgIC8qCi0gICAgZmZ0IGJpbiBtPTI6Ci0gICAgWFsyLCBuXSA9IHhbMF0gLSAgIHhbMV0gKyB4WzJdIC0gICB4WzNdCi0gICAgKi8KLSAgICBtSHlicmlkUmVhbFsyXSA9IGZmdFtGRlRfSURYX1IoMCldIC0gZmZ0W0ZGVF9JRFhfUigxKV0gKyBmZnRbRkZUX0lEWF9SKDIpXSAtIGZmdFtGRlRfSURYX1IoMyldOwotICAgIG1IeWJyaWRJbWFnWzJdID0gZmZ0W0ZGVF9JRFhfSSgwKV0gLSBmZnRbRkZUX0lEWF9JKDEpXSArIGZmdFtGRlRfSURYX0koMildIC0gZmZ0W0ZGVF9JRFhfSSgzKV07Ci0KLSAgICAvKgotICAgIGZmdCBiaW4gbT0zOgotICAgIFhbMywgbl0gPSB4WzBdICsgaip4WzFdIC0geFsyXSAtIGoqeFszXQotICAgICovCi0gICAgbUh5YnJpZFJlYWxbM10gPSBmZnRbRkZUX0lEWF9SKDApXSAtIGZmdFtGRlRfSURYX0koMSldIC0gZmZ0W0ZGVF9JRFhfUigyKV0gKyBmZnRbRkZUX0lEWF9JKDMpXTsKLSAgICBtSHlicmlkSW1hZ1szXSA9IGZmdFtGRlRfSURYX0koMCldICsgZmZ0W0ZGVF9JRFhfUigxKV0gLSBmZnRbRkZUX0lEWF9JKDIpXSAtIGZmdFtGRlRfSURYX1IoMyldOworICAvKgorICBmZnQgYmluIG09MzoKKyAgWFszLCBuXSA9IHhbMF0gKyBqKnhbMV0gLSB4WzJdIC0gaip4WzNdCisgICovCisgIG1IeWJyaWRSZWFsWzNdID0gZmZ0W0ZGVF9JRFhfUigwKV0gLSBmZnRbRkZUX0lEWF9JKDEpXSAtIGZmdFtGRlRfSURYX1IoMildICsKKyAgICAgICAgICAgICAgICAgICBmZnRbRkZUX0lEWF9JKDMpXTsKKyAgbUh5YnJpZEltYWdbM10gPSBmZnRbRkZUX0lEWF9JKDApXSArIGZmdFtGRlRfSURYX1IoMSldIC0gZmZ0W0ZGVF9JRFhfSSgyKV0gLQorICAgICAgICAgICAgICAgICAgIGZmdFtGRlRfSURYX1IoMyldOwogfQogCitzdGF0aWMgdm9pZCBlaWdodENoYW5uZWxGaWx0ZXJpbmcoY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwUW1mSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmNvbnN0IHBSZWFkSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBtSHlicmlkUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgbUh5YnJpZEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGludmVydCkgeworICBjb25zdCBGSVhQX0hUUCAqcCA9IEh5YkZpbHRlckNvZWY4OworICBJTlQgaywgc2M7CiAKLXN0YXRpYyB2b2lkIGVpZ2h0Q2hhbm5lbEZpbHRlcmluZygKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZlJlYWwsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZJbWFnLAotICAgICAgICBjb25zdCBJTlQgKmNvbnN0ICAgICAgICAgICBwUmVhZElkeCwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgbUh5YnJpZFJlYWwsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRJbWFnLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBpbnZlcnQKLSAgICAgICAgKQotewotICAgIGNvbnN0IEZJWFBfSFRQICpwID0gSHliRmlsdGVyQ29lZjg7Ci0gICAgSU5UIGssIHNjOworICBGSVhQX0RCTCBtZmZ0WzE2ICsgQUxJR05NRU5UX0RFRkFVTFRdOworICBGSVhQX0RCTCAqcGZmdCA9IChGSVhQX0RCTCAqKUFMSUdOX1BUUihtZmZ0KTsKIAotICAgIEZJWFBfREJMIG1mZnRbMTYrQUxJR05NRU5UX0RFRkFVTFRdOwotICAgIEZJWFBfREJMICpwZmZ0ID0gKEZJWFBfREJMKilBTElHTl9QVFIobWZmdCk7CisgIEZJWFBfREJMIGFjY3UxLCBhY2N1MiwgYWNjdTMsIGFjY3U0OwogCi0gICAgRklYUF9EQkwgYWNjdTEsIGFjY3UyLCBhY2N1MywgYWNjdTQ7CisgIC8qIHByZSB0d2lkZGVsaW5nICovCisgIHBmZnRbRkZUX0lEWF9SKDApXSA9CisgICAgICBwUW1mUmVhbFtwUmVhZElkeFs2XV0gPj4KKyAgICAgICgzICsgMSk7IC8qIGZNdWx0RGl2MihwWzBdLnYucmUsIHBRbWZSZWFsW3BSZWFkSWR4WzZdXSk7ICovCisgIHBmZnRbRkZUX0lEWF9JKDApXSA9CisgICAgICBwUW1mSW1hZ1twUmVhZElkeFs2XV0gPj4KKyAgICAgICgzICsgMSk7IC8qIGZNdWx0RGl2MihwWzBdLnYucmUsIHBRbWZJbWFnW3BSZWFkSWR4WzZdXSk7ICovCiAKLSAgICAvKiBwcmUgdHdpZGRlbGluZyAqLwotICAgIHBmZnRbRkZUX0lEWF9SKDApXSA9IGZNdWx0RGl2MihwWzBdLnYucmUsIHBRbWZSZWFsW3BSZWFkSWR4WzZdXSk7Ci0gICAgcGZmdFtGRlRfSURYX0koMCldID0gZk11bHREaXYyKHBbMF0udi5yZSwgcFFtZkltYWdbcFJlYWRJZHhbNl1dKTsKKyAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFs3XV0sIHBRbWZJbWFnW3BSZWFkSWR4WzddXSwKKyAgICAgICAgICAgICAgIHBbMV0pOworICBwZmZ0W0ZGVF9JRFhfUigxKV0gPSBhY2N1MTsKKyAgcGZmdFtGRlRfSURYX0koMSldID0gYWNjdTI7CiAKLSAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WzddXSwgcFFtZkltYWdbcFJlYWRJZHhbN11dLCBwWzFdKTsKLSAgICBwZmZ0W0ZGVF9JRFhfUigxKV0gPSBhY2N1MTsKLSAgICBwZmZ0W0ZGVF9JRFhfSSgxKV0gPSBhY2N1MjsKKyAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFswXV0sIHBRbWZJbWFnW3BSZWFkSWR4WzBdXSwKKyAgICAgICAgICAgICAgIHBbMl0pOworICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBRbWZSZWFsW3BSZWFkSWR4WzhdXSwgcFFtZkltYWdbcFJlYWRJZHhbOF1dLAorICAgICAgICAgICAgICAgcFszXSk7CisgIHBmZnRbRkZUX0lEWF9SKDIpXSA9IGFjY3UxICsgYWNjdTM7CisgIHBmZnRbRkZUX0lEWF9JKDIpXSA9IGFjY3UyICsgYWNjdTQ7CiAKLSAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WzBdXSwgcFFtZkltYWdbcFJlYWRJZHhbMF1dLCBwWzJdKTsKLSAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBRbWZSZWFsW3BSZWFkSWR4WzhdXSwgcFFtZkltYWdbcFJlYWRJZHhbOF1dLCBwWzNdKTsKLSAgICBwZmZ0W0ZGVF9JRFhfUigyKV0gPSBhY2N1MSArIGFjY3UzOwotICAgIHBmZnRbRkZUX0lEWF9JKDIpXSA9IGFjY3UyICsgYWNjdTQ7CisgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgcFFtZlJlYWxbcFJlYWRJZHhbMV1dLCBwUW1mSW1hZ1twUmVhZElkeFsxXV0sCisgICAgICAgICAgICAgICBwWzRdKTsKKyAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwUW1mUmVhbFtwUmVhZElkeFs5XV0sIHBRbWZJbWFnW3BSZWFkSWR4WzldXSwKKyAgICAgICAgICAgICAgIHBbNV0pOworICBwZmZ0W0ZGVF9JRFhfUigzKV0gPSBhY2N1MSArIGFjY3UzOworICBwZmZ0W0ZGVF9JRFhfSSgzKV0gPSBhY2N1MiArIGFjY3U0OwogCi0gICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFsxXV0sIHBRbWZJbWFnW3BSZWFkSWR4WzFdXSwgcFs0XSk7Ci0gICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwUW1mUmVhbFtwUmVhZElkeFs5XV0sIHBRbWZJbWFnW3BSZWFkSWR4WzldXSwgcFs1XSk7Ci0gICAgcGZmdFtGRlRfSURYX1IoMyldID0gYWNjdTEgKyBhY2N1MzsKLSAgICBwZmZ0W0ZGVF9JRFhfSSgzKV0gPSBhY2N1MiArIGFjY3U0OworICBwZmZ0W0ZGVF9JRFhfUig0KV0gPSBmTXVsdERpdjIocFFtZkltYWdbcFJlYWRJZHhbMTBdXSwgcFs3XS52LmltKSAtCisgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihwUW1mSW1hZ1twUmVhZElkeFsyXV0sIHBbNl0udi5pbSk7CisgIHBmZnRbRkZUX0lEWF9JKDQpXSA9IGZNdWx0RGl2MihwUW1mUmVhbFtwUmVhZElkeFsyXV0sIHBbNl0udi5pbSkgLQorICAgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIocFFtZlJlYWxbcFJlYWRJZHhbMTBdXSwgcFs3XS52LmltKTsKIAotICAgIHBmZnRbRkZUX0lEWF9SKDQpXSA9IGZNdWx0RGl2MihwUW1mSW1hZ1twUmVhZElkeFsxMF1dLCBwWzddLnYuaW0pIC0gZk11bHREaXYyKHBRbWZJbWFnW3BSZWFkSWR4WyAyXV0sIHBbNl0udi5pbSk7Ci0gICAgcGZmdFtGRlRfSURYX0koNCldID0gZk11bHREaXYyKHBRbWZSZWFsW3BSZWFkSWR4WyAyXV0sIHBbNl0udi5pbSkgLSBmTXVsdERpdjIocFFtZlJlYWxbcFJlYWRJZHhbMTBdXSwgcFs3XS52LmltKTsKKyAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFszXV0sIHBRbWZJbWFnW3BSZWFkSWR4WzNdXSwKKyAgICAgICAgICAgICAgIHBbOF0pOworICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBRbWZSZWFsW3BSZWFkSWR4WzExXV0sIHBRbWZJbWFnW3BSZWFkSWR4WzExXV0sCisgICAgICAgICAgICAgICBwWzldKTsKKyAgcGZmdFtGRlRfSURYX1IoNSldID0gYWNjdTEgKyBhY2N1MzsKKyAgcGZmdFtGRlRfSURYX0koNSldID0gYWNjdTIgKyBhY2N1NDsKIAotICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgcFFtZlJlYWxbcFJlYWRJZHhbIDNdXSwgcFFtZkltYWdbcFJlYWRJZHhbIDNdXSwgcFs4XSk7Ci0gICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwUW1mUmVhbFtwUmVhZElkeFsxMV1dLCBwUW1mSW1hZ1twUmVhZElkeFsxMV1dLCBwWzldKTsKLSAgICBwZmZ0W0ZGVF9JRFhfUig1KV0gPSBhY2N1MSArIGFjY3UzOwotICAgIHBmZnRbRkZUX0lEWF9JKDUpXSA9IGFjY3UyICsgYWNjdTQ7CisgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgcFFtZlJlYWxbcFJlYWRJZHhbNF1dLCBwUW1mSW1hZ1twUmVhZElkeFs0XV0sCisgICAgICAgICAgICAgICBwWzEwXSk7CisgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgcFFtZlJlYWxbcFJlYWRJZHhbMTJdXSwgcFFtZkltYWdbcFJlYWRJZHhbMTJdXSwKKyAgICAgICAgICAgICAgIHBbMTFdKTsKKyAgcGZmdFtGRlRfSURYX1IoNildID0gYWNjdTEgKyBhY2N1MzsKKyAgcGZmdFtGRlRfSURYX0koNildID0gYWNjdTIgKyBhY2N1NDsKIAotICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgcFFtZlJlYWxbcFJlYWRJZHhbIDRdXSwgcFFtZkltYWdbcFJlYWRJZHhbIDRdXSwgcFsxMF0pOwotICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgcFFtZlJlYWxbcFJlYWRJZHhbMTJdXSwgcFFtZkltYWdbcFJlYWRJZHhbMTJdXSwgcFsxMV0pOwotICAgIHBmZnRbRkZUX0lEWF9SKDYpXSA9IGFjY3UxICsgYWNjdTM7Ci0gICAgcGZmdFtGRlRfSURYX0koNildID0gYWNjdTIgKyBhY2N1NDsKKyAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFs1XV0sIHBRbWZJbWFnW3BSZWFkSWR4WzVdXSwKKyAgICAgICAgICAgICAgIHBbMTJdKTsKKyAgcGZmdFtGRlRfSURYX1IoNyldID0gYWNjdTE7CisgIHBmZnRbRkZUX0lEWF9JKDcpXSA9IGFjY3UyOwogCi0gICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFsgNV1dLCBwUW1mSW1hZ1twUmVhZElkeFsgNV1dLCBwWzEyXSk7Ci0gICAgcGZmdFtGRlRfSURYX1IoNyldID0gYWNjdTE7Ci0gICAgcGZmdFtGRlRfSURYX0koNyldID0gYWNjdTI7CisgIC8qIGZmdCBtb2R1bGF0aW9uICovCisgIGZmdF84KHBmZnQpOworICBzYyA9IDEgKyAyOwogCi0gICAgLyogZmZ0IG1vZHVsYXRpb24gKi8KLSAgICBmZnRfOCAocGZmdCk7Ci0gICAgc2MgPSAxICsgMjsKKyAgaWYgKGludmVydCkgeworICAgIG1IeWJyaWRSZWFsWzBdID0gcGZmdFtGRlRfSURYX1IoNyldIDw8IHNjOworICAgIG1IeWJyaWRJbWFnWzBdID0gcGZmdFtGRlRfSURYX0koNyldIDw8IHNjOworICAgIG1IeWJyaWRSZWFsWzFdID0gcGZmdFtGRlRfSURYX1IoMCldIDw8IHNjOworICAgIG1IeWJyaWRJbWFnWzFdID0gcGZmdFtGRlRfSURYX0koMCldIDw8IHNjOwogCi0gICAgaWYgKGludmVydCkgewotICAgICAgbUh5YnJpZFJlYWxbMF0gID0gcGZmdFtGRlRfSURYX1IoNyldIDw8IHNjOwotICAgICAgbUh5YnJpZEltYWdbMF0gID0gcGZmdFtGRlRfSURYX0koNyldIDw8IHNjOwotICAgICAgbUh5YnJpZFJlYWxbMV0gID0gcGZmdFtGRlRfSURYX1IoMCldIDw8IHNjOwotICAgICAgbUh5YnJpZEltYWdbMV0gID0gcGZmdFtGRlRfSURYX0koMCldIDw8IHNjOworICAgIG1IeWJyaWRSZWFsWzJdID0gcGZmdFtGRlRfSURYX1IoNildIDw8IHNjOworICAgIG1IeWJyaWRJbWFnWzJdID0gcGZmdFtGRlRfSURYX0koNildIDw8IHNjOworICAgIG1IeWJyaWRSZWFsWzNdID0gcGZmdFtGRlRfSURYX1IoMSldIDw8IHNjOworICAgIG1IeWJyaWRJbWFnWzNdID0gcGZmdFtGRlRfSURYX0koMSldIDw8IHNjOwogCi0gICAgICBtSHlicmlkUmVhbFsyXSAgPSBwZmZ0W0ZGVF9JRFhfUig2KV0gPDwgc2M7Ci0gICAgICBtSHlicmlkSW1hZ1syXSAgPSBwZmZ0W0ZGVF9JRFhfSSg2KV0gPDwgc2M7Ci0gICAgICBtSHlicmlkUmVhbFszXSAgPSBwZmZ0W0ZGVF9JRFhfUigxKV0gPDwgc2M7Ci0gICAgICBtSHlicmlkSW1hZ1szXSAgPSBwZmZ0W0ZGVF9JRFhfSSgxKV0gPDwgc2M7CisgICAgbUh5YnJpZFJlYWxbNF0gPSBwZmZ0W0ZGVF9JRFhfUigyKV0gPDwgc2M7CisgICAgbUh5YnJpZFJlYWxbNF0gKz0gcGZmdFtGRlRfSURYX1IoNSldIDw8IHNjOworICAgIG1IeWJyaWRJbWFnWzRdID0gcGZmdFtGRlRfSURYX0koMildIDw8IHNjOworICAgIG1IeWJyaWRJbWFnWzRdICs9IHBmZnRbRkZUX0lEWF9JKDUpXSA8PCBzYzsKIAotICAgICAgbUh5YnJpZFJlYWxbNF0gID0gcGZmdFtGRlRfSURYX1IoMildIDw8IHNjOwotICAgICAgbUh5YnJpZFJlYWxbNF0gKz0gcGZmdFtGRlRfSURYX1IoNSldIDw8IHNjOwotICAgICAgbUh5YnJpZEltYWdbNF0gID0gcGZmdFtGRlRfSURYX0koMildIDw8IHNjOwotICAgICAgbUh5YnJpZEltYWdbNF0gKz0gcGZmdFtGRlRfSURYX0koNSldIDw8IHNjOwotCi0gICAgICBtSHlicmlkUmVhbFs1XSAgPSBwZmZ0W0ZGVF9JRFhfUigzKV0gPDwgc2M7Ci0gICAgICBtSHlicmlkUmVhbFs1XSArPSBwZmZ0W0ZGVF9JRFhfUig0KV0gPDwgc2M7Ci0gICAgICBtSHlicmlkSW1hZ1s1XSAgPSBwZmZ0W0ZGVF9JRFhfSSgzKV0gPDwgc2M7Ci0gICAgICBtSHlicmlkSW1hZ1s1XSArPSBwZmZ0W0ZGVF9JRFhfSSg0KV0gPDwgc2M7CisgICAgbUh5YnJpZFJlYWxbNV0gPSBwZmZ0W0ZGVF9JRFhfUigzKV0gPDwgc2M7CisgICAgbUh5YnJpZFJlYWxbNV0gKz0gcGZmdFtGRlRfSURYX1IoNCldIDw8IHNjOworICAgIG1IeWJyaWRJbWFnWzVdID0gcGZmdFtGRlRfSURYX0koMyldIDw8IHNjOworICAgIG1IeWJyaWRJbWFnWzVdICs9IHBmZnRbRkZUX0lEWF9JKDQpXSA8PCBzYzsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7CisgICAgICBtSHlicmlkUmVhbFtrXSA9IHBmZnRbRkZUX0lEWF9SKGspXSA8PCBzYzsKKyAgICAgIG1IeWJyaWRJbWFnW2tdID0gcGZmdFtGRlRfSURYX0koayldIDw8IHNjOwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGZvcihrPTA7IGs8ODtrKysgKSB7Ci0gICAgICAgIG1IeWJyaWRSZWFsW2tdID0gcGZmdFtGRlRfSURYX1IoayldIDw8IHNjOwotICAgICAgICBtSHlicmlkSW1hZ1trXSA9IHBmZnRbRkZUX0lEWF9JKGspXSA8PCBzYzsKLSAgICAgIH0KLSAgICB9CisgIH0KIH0KIAotc3RhdGljIElOVCBrQ2hhbm5lbEZpbHRlcmluZygKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZlJlYWwsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZJbWFnLAotICAgICAgICBjb25zdCBJTlQgKmNvbnN0ICAgICAgICAgICBwUmVhZElkeCwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgbUh5YnJpZFJlYWwsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRJbWFnLAotICAgICAgICBjb25zdCBTQ0hBUiAgICAgICAgICAgICAgICBoeWJyaWRDb25maWcKLSAgICAgICAgKQotewotICAgIElOVCBlcnIgPSAwOworc3RhdGljIElOVCBrQ2hhbm5lbEZpbHRlcmluZyhjb25zdCBGSVhQX0RCTCAqY29uc3QgcFFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwUW1mSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpjb25zdCBwUmVhZElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IG1IeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgbUh5YnJpZEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSIGh5YnJpZENvbmZpZykgeworICBJTlQgZXJyID0gMDsKIAotICAgIHN3aXRjaCAoaHlicmlkQ29uZmlnKSB7Ci0gICAgICBjYXNlICAyOgotICAgICAgY2FzZSAtMjoKLSAgICAgICAgZHVhbENoYW5uZWxGaWx0ZXJpbmcocFFtZlJlYWwsIHBRbWZJbWFnLCBwUmVhZElkeCwgbUh5YnJpZFJlYWwsIG1IeWJyaWRJbWFnLCAoaHlicmlkQ29uZmlnPDApID8gMSA6IDAgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICA0OgotICAgICAgY2FzZSAtNDoKLSAgICAgICAgZm91ckNoYW5uZWxGaWx0ZXJpbmcocFFtZlJlYWwsIHBRbWZJbWFnLCBwUmVhZElkeCwgbUh5YnJpZFJlYWwsIG1IeWJyaWRJbWFnLCAoaHlicmlkQ29uZmlnPDApID8gMSA6IDAgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICA4OgotICAgICAgY2FzZSAtODoKLSAgICAgICAgZWlnaHRDaGFubmVsRmlsdGVyaW5nKHBRbWZSZWFsLCBwUW1mSW1hZywgcFJlYWRJZHgsIG1IeWJyaWRSZWFsLCBtSHlicmlkSW1hZywgKGh5YnJpZENvbmZpZzwwKSA/IDEgOiAwICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZXJyID0gLTE7Ci0gICAgfQorICBzd2l0Y2ggKGh5YnJpZENvbmZpZykgeworICAgIGNhc2UgMjoKKyAgICBjYXNlIC0yOgorICAgICAgZHVhbENoYW5uZWxGaWx0ZXJpbmcocFFtZlJlYWwsIHBRbWZJbWFnLCBwUmVhZElkeCwgbUh5YnJpZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtSHlicmlkSW1hZywgKGh5YnJpZENvbmZpZyA8IDApID8gMSA6IDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgIGNhc2UgLTQ6CisgICAgICBmb3VyQ2hhbm5lbEZpbHRlcmluZyhwUW1mUmVhbCwgcFFtZkltYWcsIHBSZWFkSWR4LCBtSHlicmlkUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IeWJyaWRJbWFnLCAoaHlicmlkQ29uZmlnIDwgMCkgPyAxIDogMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgY2FzZSAtODoKKyAgICAgIGVpZ2h0Q2hhbm5lbEZpbHRlcmluZyhwUW1mUmVhbCwgcFFtZkltYWcsIHBSZWFkSWR4LCBtSHlicmlkUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSHlicmlkSW1hZywgKGh5YnJpZENvbmZpZyA8IDApID8gMSA6IDApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVyciA9IC0xOworICB9CiAKLSAgICByZXR1cm4gZXJyOworICByZXR1cm4gZXJyOwogfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9GREtfbHBjLmNwcCBiL2xpYkZESy9zcmMvRkRLX2xwYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q3ZTY5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYkZESy9zcmMvRkRLX2xwYy5jcHAKQEAgLTAsMCArMSw0ODcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKworICAgRGVzY3JpcHRpb246IExQQyByZWxhdGVkIGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRkRLX2xwYy5oIgorCisvKiBJbnRlcm5hbCBzY2FsaW5nIG9mIExQQyBzeW50aGVzaXMgdG8gYXZvaWQgb3ZlcmZsb3cgb2YgZmlsdGUgc3RhdGVzLgorICAgVGhpcyBkZXBlbmRzIG9uIHRoZSBMUEMgb3JkZXIsIGJlY2F1c2UgdGhlIExQQyBvcmRlciBkZWZpbmVzIHRoZSBhbW91bnQKKyAgIG9mIE1BQyBvcGVyYXRpb25zLiAqLworc3RhdGljIFNDSEFSIG9yZGVyX2xkW0xQQ19NQVhfT1JERVJdID0geworICAgIC8qIEFzc3VtZSB0aGF0IFN5bnRoZXNpcyBmaWx0ZXIgb3V0cHV0IGRvZXMgbm90IGNsaXAgYW5kIGZpbHRlcgorICAgICAgIGFjY3UgZG9lcyBjaGFuZ2Ugbm8gbW9yZSB0aGFuIDEuMCBmb3IgZWFjaCBpdGVyYXRpb24uCisgICAgICAgY2VpbCgwLjUqbG9nKCgxOjI0KSkvbG9nKDIpKSAqLworICAgIDAsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDN9OworCisvKiBJSVJMYXR0aWNlICovCisjaWZuZGVmIEZVTkNUSU9OX0NMcGNfU3ludGhlc2lzTGF0dGljZV9TR0wKK3ZvaWQgQ0xwY19TeW50aGVzaXNMYXR0aWNlKEZJWFBfREJMICpzaWduYWwsIGNvbnN0IGludCBzaWduYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzaWduYWxfZSwgY29uc3QgaW50IHNpZ25hbF9lX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmMsIGNvbnN0IEZJWFBfU0dMICpjb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvcmRlciwgRklYUF9EQkwgKnN0YXRlKSB7CisgIGludCBpLCBqOworICBGSVhQX0RCTCAqcFNpZ25hbDsKKyAgaW50IHNoaWZ0OworCisgIEZES19BU1NFUlQob3JkZXIgPD0gTFBDX01BWF9PUkRFUik7CisgIEZES19BU1NFUlQob3JkZXIgPiAwKTsKKworICBpZiAoaW5jID09IC0xKQorICAgIHBTaWduYWwgPSAmc2lnbmFsW3NpZ25hbF9zaXplIC0gMV07CisgIGVsc2UKKyAgICBwU2lnbmFsID0gJnNpZ25hbFswXTsKKworICAvKgorICAgIHRtcCA9IHgoaykgLSBLKE0pKmcoTSk7CisgICAgZm9yIG09TS0xOi0xOjEKKyAgICAgICAgICAgIHRtcCA9IHRtcCAtIEsobSkgKiBnKG0pOworICAgICAgICAgICAgZyhtKzEpID0gZyhtKSArIEsobSkgKiB0bXA7CisgICAgZW5kZm9yCisgICAgZygxKSA9IHRtcDsKKworICAgIHkoaykgPSB0bXA7CisgICovCisKKyAgc2hpZnQgPSAtb3JkZXJfbGRbb3JkZXIgLSAxXTsKKworICBmb3IgKGkgPSBzaWduYWxfc2l6ZTsgaSAhPSAwOyBpLS0pIHsKKyAgICBGSVhQX0RCTCAqcFN0YXRlID0gc3RhdGUgKyBvcmRlciAtIDE7CisgICAgY29uc3QgRklYUF9TR0wgKnBDb2VmZiA9IGNvZWZmICsgb3JkZXIgLSAxOworICAgIEZJWFBfREJMIHRtcDsKKworICAgIHRtcCA9IHNjYWxlVmFsdWUoKnBTaWduYWwsIHNoaWZ0ICsgc2lnbmFsX2UpIC0KKyAgICAgICAgICBmTXVsdERpdjIoKnBDb2VmZi0tLCAqcFN0YXRlLS0pOworICAgIGZvciAoaiA9IG9yZGVyIC0gMTsgaiAhPSAwOyBqLS0pIHsKKyAgICAgIHRtcCA9IGZNdWx0U3ViRGl2Mih0bXAsIHBDb2VmZlswXSwgcFN0YXRlWzBdKTsKKyAgICAgIHBTdGF0ZVsxXSA9IHBTdGF0ZVswXSArIChmTXVsdERpdjIoKnBDb2VmZi0tLCB0bXApIDw8IDIpOworICAgICAgcFN0YXRlLS07CisgICAgfQorCisgICAgKnBTaWduYWwgPSBzY2FsZVZhbHVlU2F0dXJhdGUodG1wLCAtc2hpZnQgLSBzaWduYWxfZV9vdXQpOworCisgICAgLyogZXhwb25lbnQgb2Ygc3RhdGVbXSBpcyAtMSAqLworICAgIHBTdGF0ZVsxXSA9IHRtcCA8PCAxOworICAgIHBTaWduYWwgKz0gaW5jOworICB9Cit9CisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTl9DTHBjX1N5bnRoZXNpc0xhdHRpY2VfREJMCit2b2lkIENMcGNfU3ludGhlc2lzTGF0dGljZShGSVhQX0RCTCAqc2lnbmFsLCBjb25zdCBpbnQgc2lnbmFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2lnbmFsX2UsIGNvbnN0IGludCBzaWduYWxfZV9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5jLCBjb25zdCBGSVhQX0RCTCAqY29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3JkZXIsIEZJWFBfREJMICpzdGF0ZSkgeworICBpbnQgaSwgajsKKyAgRklYUF9EQkwgKnBTaWduYWw7CisKKyAgRkRLX0FTU0VSVChvcmRlciA8PSBMUENfTUFYX09SREVSKTsKKyAgRkRLX0FTU0VSVChvcmRlciA+IDApOworCisgIGlmIChpbmMgPT0gLTEpCisgICAgcFNpZ25hbCA9ICZzaWduYWxbc2lnbmFsX3NpemUgLSAxXTsKKyAgZWxzZQorICAgIHBTaWduYWwgPSAmc2lnbmFsWzBdOworCisgIEZES19BU1NFUlQoc2lnbmFsX3NpemUgPiAwKTsKKyAgZm9yIChpID0gc2lnbmFsX3NpemU7IGkgIT0gMDsgaS0tKSB7CisgICAgRklYUF9EQkwgKnBTdGF0ZSA9IHN0YXRlICsgb3JkZXIgLSAxOworICAgIGNvbnN0IEZJWFBfREJMICpwQ29lZmYgPSBjb2VmZiArIG9yZGVyIC0gMTsKKyAgICBGSVhQX0RCTCB0bXAsIGFjY3U7CisKKyAgICBhY2N1ID0KKyAgICAgICAgZk11bHRTdWJEaXYyKHNjYWxlVmFsdWUoKnBTaWduYWwsIHNpZ25hbF9lIC0gMSksICpwQ29lZmYtLSwgKnBTdGF0ZS0tKTsKKyAgICB0bXAgPSBTQVRVUkFURV9MRUZUX1NISUZUX0FMVChhY2N1LCAxLCBERlJBQ1RfQklUUyk7CisKKyAgICBmb3IgKGogPSBvcmRlciAtIDE7IGogIT0gMDsgai0tKSB7CisgICAgICBhY2N1ID0gZk11bHRTdWJEaXYyKHRtcCA+PiAxLCBwQ29lZmZbMF0sIHBTdGF0ZVswXSk7CisgICAgICB0bXAgPSBTQVRVUkFURV9MRUZUX1NISUZUX0FMVChhY2N1LCAxLCBERlJBQ1RfQklUUyk7CisKKyAgICAgIGFjY3UgPSBmTXVsdEFkZERpdjIocFN0YXRlWzBdID4+IDEsICpwQ29lZmYtLSwgdG1wKTsKKyAgICAgIHBTdGF0ZVsxXSA9IFNBVFVSQVRFX0xFRlRfU0hJRlRfQUxUKGFjY3UsIDEsIERGUkFDVF9CSVRTKTsKKworICAgICAgcFN0YXRlLS07CisgICAgfQorCisgICAgKnBTaWduYWwgPSBzY2FsZVZhbHVlKHRtcCwgLXNpZ25hbF9lX291dCk7CisKKyAgICAvKiBleHBvbmVudCBvZiBzdGF0ZVtdIGlzIDAgKi8KKyAgICBwU3RhdGVbMV0gPSB0bXA7CisgICAgcFNpZ25hbCArPSBpbmM7CisgIH0KK30KKworI2VuZGlmCisKKy8qIExQQ19TWU5USEVTSVNfSUlSIHZlcnNpb24gKi8KK3ZvaWQgQ0xwY19TeW50aGVzaXMoRklYUF9EQkwgKnNpZ25hbCwgY29uc3QgaW50IHNpZ25hbF9zaXplLCBjb25zdCBpbnQgc2lnbmFsX2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmMsIGNvbnN0IEZJWFBfTFBDX1ROUyAqbHBjQ29lZmZfbSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxwY0NvZWZmX2UsIGNvbnN0IGludCBvcmRlciwgRklYUF9EQkwgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICBpbnQgKnBTdGF0ZUluZGV4KSB7CisgIGludCBpLCBqOworICBGSVhQX0RCTCAqcFNpZ25hbDsKKyAgaW50IHN0YXRlSW5kZXggPSAqcFN0YXRlSW5kZXg7CisKKyAgRklYUF9MUENfVE5TIGNvZWZmWzIgKiBMUENfTUFYX09SREVSXTsKKyAgRkRLbWVtY3B5KCZjb2VmZlswXSwgbHBjQ29lZmZfbSwgb3JkZXIgKiBzaXplb2YoRklYUF9MUENfVE5TKSk7CisgIEZES21lbWNweSgmY29lZmZbb3JkZXJdLCBscGNDb2VmZl9tLCBvcmRlciAqIHNpemVvZihGSVhQX0xQQ19UTlMpKTsKKworICBGREtfQVNTRVJUKG9yZGVyIDw9IExQQ19NQVhfT1JERVIpOworICBGREtfQVNTRVJUKHN0YXRlSW5kZXggPCBvcmRlcik7CisKKyAgaWYgKGluYyA9PSAtMSkKKyAgICBwU2lnbmFsID0gJnNpZ25hbFtzaWduYWxfc2l6ZSAtIDFdOworICBlbHNlCisgICAgcFNpZ25hbCA9ICZzaWduYWxbMF07CisKKyAgLyogeShuKSA9IHgobikgLSBscGNbMV0qeShuLTEpIC0gLi4uIC0gbHBjW29yZGVyXSp5KG4tb3JkZXIpICovCisKKyAgZm9yIChpID0gMDsgaSA8IHNpZ25hbF9zaXplOyBpKyspIHsKKyAgICBGSVhQX0RCTCB4OworICAgIGNvbnN0IEZJWFBfTFBDX1ROUyAqcENvZWZmID0gY29lZmYgKyBvcmRlciAtIHN0YXRlSW5kZXg7CisKKyAgICB4ID0gc2NhbGVWYWx1ZSgqcFNpZ25hbCwgLShscGNDb2VmZl9lICsgMSkpOworICAgIGZvciAoaiA9IDA7IGogPCBvcmRlcjsgaisrKSB7CisgICAgICB4IC09IGZNdWx0RGl2MihzdGF0ZVtqXSwgcENvZWZmW2pdKTsKKyAgICB9CisgICAgeCA9IFNBVFVSQVRFX1NISUZUKHgsIC1scGNDb2VmZl9lIC0gMSwgREZSQUNUX0JJVFMpOworCisgICAgLyogVXBkYXRlIHN0YXRlcyAqLworICAgIHN0YXRlSW5kZXggPSAoKHN0YXRlSW5kZXggLSAxKSA8IDApID8gKG9yZGVyIC0gMSkgOiAoc3RhdGVJbmRleCAtIDEpOworICAgIHN0YXRlW3N0YXRlSW5kZXhdID0geDsKKworICAgICpwU2lnbmFsID0gc2NhbGVWYWx1ZSh4LCBzaWduYWxfZSk7CisgICAgcFNpZ25hbCArPSBpbmM7CisgIH0KKworICAqcFN0YXRlSW5kZXggPSBzdGF0ZUluZGV4OworfQorLyogZGVmYXVsdCB2ZXJzaW9uICovCit2b2lkIENMcGNfU3ludGhlc2lzKEZJWFBfREJMICpzaWduYWwsIGNvbnN0IGludCBzaWduYWxfc2l6ZSwgY29uc3QgaW50IHNpZ25hbF9lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5jLCBjb25zdCBGSVhQX0xQQyAqbHBjQ29lZmZfbSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxwY0NvZWZmX2UsIGNvbnN0IGludCBvcmRlciwgRklYUF9EQkwgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICBpbnQgKnBTdGF0ZUluZGV4KSB7CisgIGludCBpLCBqOworICBGSVhQX0RCTCAqcFNpZ25hbDsKKyAgaW50IHN0YXRlSW5kZXggPSAqcFN0YXRlSW5kZXg7CisKKyAgRklYUF9MUEMgY29lZmZbMiAqIExQQ19NQVhfT1JERVJdOworICBGREttZW1jcHkoJmNvZWZmWzBdLCBscGNDb2VmZl9tLCBvcmRlciAqIHNpemVvZihGSVhQX0xQQykpOworICBGREttZW1jcHkoJmNvZWZmW29yZGVyXSwgbHBjQ29lZmZfbSwgb3JkZXIgKiBzaXplb2YoRklYUF9MUEMpKTsKKworICBGREtfQVNTRVJUKG9yZGVyIDw9IExQQ19NQVhfT1JERVIpOworICBGREtfQVNTRVJUKHN0YXRlSW5kZXggPCBvcmRlcik7CisKKyAgaWYgKGluYyA9PSAtMSkKKyAgICBwU2lnbmFsID0gJnNpZ25hbFtzaWduYWxfc2l6ZSAtIDFdOworICBlbHNlCisgICAgcFNpZ25hbCA9ICZzaWduYWxbMF07CisKKyAgLyogeShuKSA9IHgobikgLSBscGNbMV0qeShuLTEpIC0gLi4uIC0gbHBjW29yZGVyXSp5KG4tb3JkZXIpICovCisKKyAgZm9yIChpID0gMDsgaSA8IHNpZ25hbF9zaXplOyBpKyspIHsKKyAgICBGSVhQX0RCTCB4OworICAgIGNvbnN0IEZJWFBfTFBDICpwQ29lZmYgPSBjb2VmZiArIG9yZGVyIC0gc3RhdGVJbmRleDsKKworICAgIHggPSBzY2FsZVZhbHVlKCpwU2lnbmFsLCAtKGxwY0NvZWZmX2UgKyAxKSk7CisgICAgZm9yIChqID0gMDsgaiA8IG9yZGVyOyBqKyspIHsKKyAgICAgIHggLT0gZk11bHREaXYyKHN0YXRlW2pdLCBwQ29lZmZbal0pOworICAgIH0KKyAgICB4ID0gU0FUVVJBVEVfU0hJRlQoeCwgLWxwY0NvZWZmX2UgLSAxLCBERlJBQ1RfQklUUyk7CisKKyAgICAvKiBVcGRhdGUgc3RhdGVzICovCisgICAgc3RhdGVJbmRleCA9ICgoc3RhdGVJbmRleCAtIDEpIDwgMCkgPyAob3JkZXIgLSAxKSA6IChzdGF0ZUluZGV4IC0gMSk7CisgICAgc3RhdGVbc3RhdGVJbmRleF0gPSB4OworCisgICAgKnBTaWduYWwgPSBzY2FsZVZhbHVlKHgsIHNpZ25hbF9lKTsKKyAgICBwU2lnbmFsICs9IGluYzsKKyAgfQorCisgICpwU3RhdGVJbmRleCA9IHN0YXRlSW5kZXg7Cit9CisKKy8qIEZJUiAqLwordm9pZCBDTHBjX0FuYWx5c2lzKEZJWFBfREJMICpSRVNUUklDVCBzaWduYWwsIGNvbnN0IGludCBzaWduYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0xQQyBscGNDb2VmZl9tW10sIGNvbnN0IGludCBscGNDb2VmZl9lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvcmRlciwgRklYUF9EQkwgKlJFU1RSSUNUIGZpbHRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgKmZpbHRTdGF0ZUluZGV4KSB7CisgIGludCBzdGF0ZUluZGV4OworICBJTlQgaSwgaiwgc2hpZnQgPSBscGNDb2VmZl9lICsgMTsgLyogKzEsIGJlY2F1c2UgZk11bHREaXYyICovCisgIEZJWFBfREJMIHRtcDsKKworICBpZiAob3JkZXIgPD0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoZmlsdFN0YXRlSW5kZXggIT0gTlVMTCkgeworICAgIHN0YXRlSW5kZXggPSAqZmlsdFN0YXRlSW5kZXg7CisgIH0gZWxzZSB7CisgICAgc3RhdGVJbmRleCA9IDA7CisgIH0KKworICAvKiBrZWVwIGZpbHRlciBjb2VmZmljaWVudHMgdHdpY2UgYW5kIHNhdmUgbWVtb3J5IGNvcHkgb3BlcmF0aW9uIGluCisgICAgIG1vZHVsbyBzdGF0ZSBidWZmZXIgKi8KKyAgRklYUF9MUEMgY29lZmZbMiAqIExQQ19NQVhfT1JERVJdOworICBGSVhQX0xQQyAqcENvZWZmOworICBGREttZW1jcHkoJmNvZWZmWzBdLCBscGNDb2VmZl9tLCBvcmRlciAqIHNpemVvZihGSVhQX0xQQykpOworICBGREttZW1jcHkoJmNvZWZmW29yZGVyXSwgbHBjQ29lZmZfbSwgb3JkZXIgKiBzaXplb2YoRklYUF9MUEMpKTsKKworICAvKgorICAgICAgIyBBbmFseXNpcyBmaWx0ZXIsIG9idGFpbiByZXNpZHVhbC4KKyAgICAgIGZvciBrID0gMDpCTC0xCisgICAgICAgICAgICAgIGVycihpLUJMK2spID0gYSAqIGlucHV0U2lnbmFsKGktQkwrazotMTppLUJMLU0rayk7CisgICAgICBlbmRmb3IKKyAgICovCisKKyAgRkRLX0FTU0VSVChzaGlmdCA+PSAwKTsKKworICBmb3IgKGogPSAwOyBqIDwgc2lnbmFsX3NpemU7IGorKykgeworICAgIHBDb2VmZiA9ICZjb2VmZlsob3JkZXIgLSBzdGF0ZUluZGV4KV07CisKKyAgICB0bXAgPSBzaWduYWxbal0gPj4gc2hpZnQ7CisgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspIHsKKyAgICAgIHRtcCA9IGZNdWx0QWRkRGl2Mih0bXAsIHBDb2VmZltpXSwgZmlsdFN0YXRlW2ldKTsKKyAgICB9CisKKyAgICBzdGF0ZUluZGV4ID0KKyAgICAgICAgKChzdGF0ZUluZGV4IC0gMSkgPCAwKSA/IChzdGF0ZUluZGV4IC0gMSArIG9yZGVyKSA6IChzdGF0ZUluZGV4IC0gMSk7CisgICAgZmlsdFN0YXRlW3N0YXRlSW5kZXhdID0gc2lnbmFsW2pdOworCisgICAgc2lnbmFsW2pdID0gdG1wIDw8IHNoaWZ0OworICB9CisKKyAgaWYgKGZpbHRTdGF0ZUluZGV4ICE9IE5VTEwpIHsKKyAgICAqZmlsdFN0YXRlSW5kZXggPSBzdGF0ZUluZGV4OworICB9Cit9CisKKy8qIEZvciB0aGUgTFBDX1NZTlRIRVNJU19JSVIgdmVyc2lvbiAqLworSU5UIENMcGNfUGFyY29yVG9McGMoY29uc3QgRklYUF9MUENfVE5TIHJlZmxDb2VmZltdLCBGSVhQX0xQQ19UTlMgTHBjQ29lZmZbXSwKKyAgICAgICAgICAgICAgICAgICAgIElOVCBudW1PZkNvZWZmLCBGSVhQX0RCTCB3b3JrQnVmZmVyW10pIHsKKyAgSU5UIGksIGo7CisgIElOVCBzaGlmdHZhbCwKKyAgICAgIHBhcjJMcGNTaGlmdFZhbCA9IDY7IC8qIDYgc2hvdWxkIGJlIGVub3VnaCwgYmVjLiBtYXgobnVtT2ZDb2VmZikgPSAyMCAqLworICBGSVhQX0RCTCBtYXhWYWwgPSAoRklYUF9EQkwpMDsKKworICB3b3JrQnVmZmVyWzBdID0gRlhfTFBDX1ROUzJGWF9EQkwocmVmbENvZWZmWzBdKSA+PiBwYXIyTHBjU2hpZnRWYWw7CisgIGZvciAoaSA9IDE7IGkgPCBudW1PZkNvZWZmOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgaSAvIDI7IGorKykgeworICAgICAgRklYUF9EQkwgdG1wMSwgdG1wMjsKKworICAgICAgdG1wMSA9IHdvcmtCdWZmZXJbal07CisgICAgICB0bXAyID0gd29ya0J1ZmZlcltpIC0gMSAtIGpdOworICAgICAgd29ya0J1ZmZlcltqXSArPSBmTXVsdChyZWZsQ29lZmZbaV0sIHRtcDIpOworICAgICAgd29ya0J1ZmZlcltpIC0gMSAtIGpdICs9IGZNdWx0KHJlZmxDb2VmZltpXSwgdG1wMSk7CisgICAgfQorICAgIGlmIChpICYgMSkgeworICAgICAgd29ya0J1ZmZlcltqXSArPSBmTXVsdChyZWZsQ29lZmZbaV0sIHdvcmtCdWZmZXJbal0pOworICAgIH0KKworICAgIHdvcmtCdWZmZXJbaV0gPSBGWF9MUENfVE5TMkZYX0RCTChyZWZsQ29lZmZbaV0pID4+IHBhcjJMcGNTaGlmdFZhbDsKKyAgfQorCisgIC8qIGNhbGN1bGF0ZSBleHBvbmVudCAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtT2ZDb2VmZjsgaSsrKSB7CisgICAgbWF4VmFsID0gZk1heChtYXhWYWwsIGZBYnMod29ya0J1ZmZlcltpXSkpOworICB9CisKKyAgc2hpZnR2YWwgPSBmTWluKGZOb3JtKG1heFZhbCksIHBhcjJMcGNTaGlmdFZhbCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bU9mQ29lZmY7IGkrKykgeworICAgIExwY0NvZWZmW2ldID0gRlhfREJMMkZYX0xQQ19UTlMod29ya0J1ZmZlcltpXSA8PCBzaGlmdHZhbCk7CisgIH0KKworICByZXR1cm4gKHBhcjJMcGNTaGlmdFZhbCAtIHNoaWZ0dmFsKTsKK30KKy8qIERlZmF1bHQgdmVyc2lvbiAqLworSU5UIENMcGNfUGFyY29yVG9McGMoY29uc3QgRklYUF9MUEMgcmVmbENvZWZmW10sIEZJWFBfTFBDIExwY0NvZWZmW10sCisgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtT2ZDb2VmZiwgRklYUF9EQkwgd29ya0J1ZmZlcltdKSB7CisgIElOVCBpLCBqOworICBJTlQgc2hpZnR2YWwsCisgICAgICBwYXIyTHBjU2hpZnRWYWwgPSA2OyAvKiA2IHNob3VsZCBiZSBlbm91Z2gsIGJlYy4gbWF4KG51bU9mQ29lZmYpID0gMjAgKi8KKyAgRklYUF9EQkwgbWF4VmFsID0gKEZJWFBfREJMKTA7CisKKyAgd29ya0J1ZmZlclswXSA9IEZYX0xQQzJGWF9EQkwocmVmbENvZWZmWzBdKSA+PiBwYXIyTHBjU2hpZnRWYWw7CisgIGZvciAoaSA9IDE7IGkgPCBudW1PZkNvZWZmOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgaSAvIDI7IGorKykgeworICAgICAgRklYUF9EQkwgdG1wMSwgdG1wMjsKKworICAgICAgdG1wMSA9IHdvcmtCdWZmZXJbal07CisgICAgICB0bXAyID0gd29ya0J1ZmZlcltpIC0gMSAtIGpdOworICAgICAgd29ya0J1ZmZlcltqXSArPSBmTXVsdChyZWZsQ29lZmZbaV0sIHRtcDIpOworICAgICAgd29ya0J1ZmZlcltpIC0gMSAtIGpdICs9IGZNdWx0KHJlZmxDb2VmZltpXSwgdG1wMSk7CisgICAgfQorICAgIGlmIChpICYgMSkgeworICAgICAgd29ya0J1ZmZlcltqXSArPSBmTXVsdChyZWZsQ29lZmZbaV0sIHdvcmtCdWZmZXJbal0pOworICAgIH0KKworICAgIHdvcmtCdWZmZXJbaV0gPSBGWF9MUEMyRlhfREJMKHJlZmxDb2VmZltpXSkgPj4gcGFyMkxwY1NoaWZ0VmFsOworICB9CisKKyAgLyogY2FsY3VsYXRlIGV4cG9uZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1PZkNvZWZmOyBpKyspIHsKKyAgICBtYXhWYWwgPSBmTWF4KG1heFZhbCwgZkFicyh3b3JrQnVmZmVyW2ldKSk7CisgIH0KKworICBzaGlmdHZhbCA9IGZNaW4oZk5vcm0obWF4VmFsKSwgcGFyMkxwY1NoaWZ0VmFsKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtT2ZDb2VmZjsgaSsrKSB7CisgICAgTHBjQ29lZmZbaV0gPSBGWF9EQkwyRlhfTFBDKHdvcmtCdWZmZXJbaV0gPDwgc2hpZnR2YWwpOworICB9CisKKyAgcmV0dXJuIChwYXIyTHBjU2hpZnRWYWwgLSBzaGlmdHZhbCk7Cit9CisKK3ZvaWQgQ0xwY19BdXRvVG9QYXJjb3IoRklYUF9EQkwgYWNvcnJbXSwgY29uc3QgaW50IGFjb3JyX2UsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfTFBDIHJlZmxDb2VmZltdLCBjb25zdCBpbnQgbnVtT2ZDb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBQcmVkaWN0aW9uR2Fpbl9tLCBJTlQgKnBQcmVkaWN0aW9uR2Fpbl9lKSB7CisgIElOVCBpLCBqLCBzY2FsZSA9IDA7CisgIEZJWFBfREJMIHBhcmNvcldvcmtCdWZmZXJbTFBDX01BWF9PUkRFUl07CisKKyAgRklYUF9EQkwgKndvcmtCdWZmZXIgPSBwYXJjb3JXb3JrQnVmZmVyOworICBGSVhQX0RCTCBhdXRvQ29ycl8wID0gYWNvcnJbMF07CisKKyAgRkRLbWVtY2xlYXIocmVmbENvZWZmLCBudW1PZkNvZWZmICogc2l6ZW9mKEZJWFBfTFBDKSk7CisKKyAgaWYgKGF1dG9Db3JyXzAgPT0gRkwyRlhDT05TVF9EQkwoMC4wKSkgeworICAgIGlmIChwUHJlZGljdGlvbkdhaW5fbSAhPSBOVUxMKSB7CisgICAgICAqcFByZWRpY3Rpb25HYWluX20gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKKyAgICAgICpwUHJlZGljdGlvbkdhaW5fZSA9IDE7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIEZES21lbWNweSh3b3JrQnVmZmVyLCBhY29yciArIDEsIG51bU9mQ29lZmYgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bU9mQ29lZmY7IGkrKykgeworICAgIExPTkcgc2lnbiA9ICgoTE9ORyl3b3JrQnVmZmVyWzBdID4+IChERlJBQ1RfQklUUyAtIDEpKTsKKyAgICBGSVhQX0RCTCB0bXAgPSAoRklYUF9EQkwpKChMT05HKXdvcmtCdWZmZXJbMF0gXiBzaWduKTsKKworICAgIC8qIENoZWNrIHByZWNvbmRpdGlvbnMgZm9yIGRpdmlzaW9uIGZ1bmN0aW9uOiBudW08PWRlbnVtICAgICAgICAgICAgICovCisgICAgLyogRm9yIDFzdCBpdGVyYXRpb24gYWNvcnJbMF0gY2Fubm90IGJlIDAsIGl0IGlzIGNoZWNrZWQgYmVmb3JlIGxvb3AgKi8KKyAgICAvKiBEdWUgdG8gZXhvciBvcGVyYXRpb24gd2l0aCAic2lnbiIsIG51bSg9dG1wKSBpcyBncmVhdGVyL2VxdWFsIDAgICAqLworICAgIGlmIChhY29yclswXSA8IHRtcCkgYnJlYWs7CisKKyAgICAvKiB0bXAgPSBkaXYobnVtLCBkZW51bSwgMTYpICovCisgICAgdG1wID0gKEZJWFBfREJMKSgoTE9ORylzY2h1cl9kaXYodG1wLCBhY29yclswXSwgRlJBQ1RfQklUUykgXiAofnNpZ24pKTsKKworICAgIHJlZmxDb2VmZltpXSA9IEZYX0RCTDJGWF9MUEModG1wKTsKKworICAgIGZvciAoaiA9IG51bU9mQ29lZmYgLSBpIC0gMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgIEZJWFBfREJMIGFjY3UxID0gZk11bHQodG1wLCBhY29ycltqXSk7CisgICAgICBGSVhQX0RCTCBhY2N1MiA9IGZNdWx0KHRtcCwgd29ya0J1ZmZlcltqXSk7CisgICAgICB3b3JrQnVmZmVyW2pdICs9IGFjY3UxOworICAgICAgYWNvcnJbal0gKz0gYWNjdTI7CisgICAgfQorICAgIC8qIENoZWNrIHByZWNvbmRpdGlvbnMgZm9yIGRpdmlzaW9uIGZ1bmN0aW9uOiBkZW51bSAoPWFjb3JyWzBdKSA+IDAgKi8KKyAgICBpZiAoYWNvcnJbMF0gPT0gKEZJWFBfREJMKTApIGJyZWFrOworCisgICAgd29ya0J1ZmZlcisrOworICB9CisKKyAgaWYgKHBQcmVkaWN0aW9uR2Fpbl9tICE9IE5VTEwpIHsKKyAgICBpZiAoYWNvcnJbMF0gPiAoRklYUF9EQkwpMCkgeworICAgICAgLyogcHJlZGljdGlvbiBnYWluID0gc2lnbmFsIHBvd2VyIC8gZXJyb3IgKHJlc2lkdWFsKSBwb3dlciAqLworICAgICAgKnBQcmVkaWN0aW9uR2Fpbl9tID0gZkRpdk5vcm1TaWduZWQoYXV0b0NvcnJfMCwgYWNvcnJbMF0sICZzY2FsZSk7CisgICAgICAqcFByZWRpY3Rpb25HYWluX2UgPSBzY2FsZTsKKyAgICB9IGVsc2UgeworICAgICAgKnBQcmVkaWN0aW9uR2Fpbl9tID0gKEZJWFBfREJMKTA7CisgICAgICAqcFByZWRpY3Rpb25HYWluX2UgPSAwOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9GREtfbWF0cml4Q2FsbG9jLmNwcCBiL2xpYkZESy9zcmMvRkRLX21hdHJpeENhbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1YzUyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYkZESy9zcmMvRkRLX21hdHJpeENhbGxvYy5jcHAKQEAgLTAsMCArMSwzMTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogbWF0cml4IG1lbW9yeSBhbGxvY2F0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCit2b2lkICpmZGtDYWxsb2NNYXRyaXgxRF9hbGlnbmVkKFVJTlQgZGltMSwgVUlOVCBzaXplKSB7CisgIHJldHVybiBGREthYWxsb2MoZGltMSAqIHNpemUsIEFMSUdOTUVOVF9ERUZBVUxUKTsKK30KKwordm9pZCAqZmRrQ2FsbG9jTWF0cml4MURfaW50KFVJTlQgZGltLCBVSU5UIHNpemUsIE1FTU9SWV9TRUNUSU9OIHMpIHsKKyAgcmV0dXJuIEZES2NhbGxvY19MKGRpbSwgc2l6ZSwgcyk7Cit9CisKK3ZvaWQgKmZka0NhbGxvY01hdHJpeDFEX2ludF9hbGlnbmVkKFVJTlQgZGltLCBVSU5UIHNpemUsIE1FTU9SWV9TRUNUSU9OIHMpIHsKKyAgcmV0dXJuIEZES2FhbGxvY19MKGRpbSAqIHNpemUsIEFMSUdOTUVOVF9ERUZBVUxULCBzKTsKK30KKwordm9pZCBmZGtGcmVlTWF0cml4MUQodm9pZCAqcCkgeworICBpZiAocCAhPSBOVUxMKSB7CisgICAgRkRLZnJlZV9MKHApOworICB9Cit9CisKK3ZvaWQgZmRrRnJlZU1hdHJpeDFEX2FsaWduZWQodm9pZCAqcCkgeworICBpZiAocCAhPSBOVUxMKSB7CisgICAgRkRLYWZyZWVfTChwKTsKKyAgfQorfQorCit2b2lkICpmZGtDYWxsb2NNYXRyaXgxRChVSU5UIGRpbTEsIFVJTlQgc2l6ZSkgeyByZXR1cm4gRkRLY2FsbG9jKGRpbTEsIHNpemUpOyB9CisKKy8qIDJEICovCit2b2lkICoqZmRrQ2FsbG9jTWF0cml4MkQoVUlOVCBkaW0xLCBVSU5UIGRpbTIsIFVJTlQgc2l6ZSkgeworICB2b2lkICoqcDE7CisgIFVJTlQgaTsKKyAgY2hhciAqcDI7CisgIGlmICghZGltMSB8fCAhZGltMikgcmV0dXJuIE5VTEw7CisgIGlmICgocDEgPSAodm9pZCAqKilmZGtDYWxsb2NNYXRyaXgxRChkaW0xLCBzaXplb2Yodm9pZCAqKSkpID09IE5VTEwpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgaWYgKChwMiA9IChjaGFyICopZmRrQ2FsbG9jTWF0cml4MUQoZGltMSAqIGRpbTIsIHNpemUpKSA9PSBOVUxMKSB7CisgICAgZmRrRnJlZU1hdHJpeDFEKHAxKTsKKyAgICBwMSA9IE5VTEw7CisgICAgZ290byBiYWlsOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBkaW0xOyBpKyspIHsKKyAgICBwMVtpXSA9IHAyOworICAgIHAyICs9IGRpbTIgKiBzaXplOworICB9CitiYWlsOgorICByZXR1cm4gcDE7Cit9CisKK3ZvaWQgKipmZGtDYWxsb2NNYXRyaXgyRF9hbGlnbmVkKFVJTlQgZGltMSwgVUlOVCBkaW0yLCBVSU5UIHNpemUpIHsKKyAgdm9pZCAqKnAxOworICBVSU5UIGk7CisgIGNoYXIgKnAyOworICBpZiAoIWRpbTEgfHwgIWRpbTIpIHJldHVybiBOVUxMOworICBpZiAoKHAxID0gKHZvaWQgKiopZmRrQ2FsbG9jTWF0cml4MUQoZGltMSwgc2l6ZW9mKHZvaWQgKikpKSA9PSBOVUxMKSB7CisgICAgZ290byBiYWlsOworICB9CisgIGlmICgocDIgPSAoY2hhciAqKWZka0NhbGxvY01hdHJpeDFEX2FsaWduZWQoZGltMSAqIGRpbTIsIHNpemUpKSA9PSBOVUxMKSB7CisgICAgZmRrRnJlZU1hdHJpeDFEKHAxKTsKKyAgICBwMSA9IE5VTEw7CisgICAgZ290byBiYWlsOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBkaW0xOyBpKyspIHsKKyAgICBwMVtpXSA9IHAyOworICAgIHAyICs9IGRpbTIgKiBzaXplOworICB9CitiYWlsOgorICByZXR1cm4gcDE7Cit9CisKK3ZvaWQgZmRrRnJlZU1hdHJpeDJEKHZvaWQgKipwKSB7CisgIGlmICghcCkgcmV0dXJuOworICBmZGtGcmVlTWF0cml4MUQocFswXSk7CisgIGZka0ZyZWVNYXRyaXgxRChwKTsKK30KKwordm9pZCBmZGtGcmVlTWF0cml4MkRfYWxpZ25lZCh2b2lkICoqcCkgeworICBpZiAoIXApIHJldHVybjsKKyAgZmRrRnJlZU1hdHJpeDFEX2FsaWduZWQocFswXSk7CisgIGZka0ZyZWVNYXRyaXgxRChwKTsKK30KKwordm9pZCAqKmZka0NhbGxvY01hdHJpeDJEX2ludChVSU5UIGRpbTEsIFVJTlQgZGltMiwgVUlOVCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1PUllfU0VDVElPTiBzKSB7CisgIHZvaWQgKipwMTsKKyAgVUlOVCBpOworICBjaGFyICpwMjsKKworICBpZiAoIWRpbTEgfHwgIWRpbTIpIHJldHVybiBOVUxMOworICBpZiAoKHAxID0gKHZvaWQgKiopZmRrQ2FsbG9jTWF0cml4MURfaW50KGRpbTEsIHNpemVvZih2b2lkICopLCBzKSkgPT0gTlVMTCkgeworICAgIGdvdG8gYmFpbDsKKyAgfQorICBpZiAoKHAyID0gKGNoYXIgKilmZGtDYWxsb2NNYXRyaXgxRF9pbnQoZGltMSAqIGRpbTIsIHNpemUsIHMpKSA9PSBOVUxMKSB7CisgICAgZmRrRnJlZU1hdHJpeDFEKHAxKTsKKyAgICBwMSA9IE5VTEw7CisgICAgZ290byBiYWlsOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBkaW0xOyBpKyspIHsKKyAgICBwMVtpXSA9IHAyOworICAgIHAyICs9IGRpbTIgKiBzaXplOworICB9CitiYWlsOgorICByZXR1cm4gcDE7Cit9CisKK3ZvaWQgKipmZGtDYWxsb2NNYXRyaXgyRF9pbnRfYWxpZ25lZChVSU5UIGRpbTEsIFVJTlQgZGltMiwgVUlOVCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWV9TRUNUSU9OIHMpIHsKKyAgdm9pZCAqKnAxOworICBVSU5UIGk7CisgIGNoYXIgKnAyOworCisgIGlmICghZGltMSB8fCAhZGltMikgcmV0dXJuIE5VTEw7CisgIGlmICgocDEgPSAodm9pZCAqKilmZGtDYWxsb2NNYXRyaXgxRF9pbnQoZGltMSwgc2l6ZW9mKHZvaWQgKiksIHMpKSA9PSBOVUxMKSB7CisgICAgZ290byBiYWlsOworICB9CisgIGlmICgocDIgPSAoY2hhciAqKWZka0NhbGxvY01hdHJpeDFEX2ludF9hbGlnbmVkKGRpbTEgKiBkaW0yLCBzaXplLCBzKSkgPT0KKyAgICAgIE5VTEwpIHsKKyAgICBmZGtGcmVlTWF0cml4MUQocDEpOworICAgIHAxID0gTlVMTDsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGRpbTE7IGkrKykgeworICAgIHAxW2ldID0gcDI7CisgICAgcDIgKz0gZGltMiAqIHNpemU7CisgIH0KK2JhaWw6CisgIHJldHVybiBwMTsKK30KKworLyogM0QgKi8KK3ZvaWQgKioqZmRrQ2FsbG9jTWF0cml4M0QoVUlOVCBkaW0xLCBVSU5UIGRpbTIsIFVJTlQgZGltMywgVUlOVCBzaXplKSB7CisgIHZvaWQgKioqcDE7CisgIFVJTlQgaSwgajsKKyAgdm9pZCAqKnAyOworICBjaGFyICpwMzsKKworICBpZiAoIWRpbTEgfHwgIWRpbTIgfHwgIWRpbTMpIHJldHVybiBOVUxMOworICBpZiAoKHAxID0gKHZvaWQgKioqKWZka0NhbGxvY01hdHJpeDFEKGRpbTEsIHNpemVvZih2b2lkICoqKSkpID09IE5VTEwpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgaWYgKChwMiA9ICh2b2lkICoqKWZka0NhbGxvY01hdHJpeDFEKGRpbTEgKiBkaW0yLCBzaXplb2Yodm9pZCAqKSkpID09IE5VTEwpIHsKKyAgICBmZGtGcmVlTWF0cml4MUQocDEpOworICAgIHAxID0gTlVMTDsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgcDFbMF0gPSBwMjsKKyAgaWYgKChwMyA9IChjaGFyICopZmRrQ2FsbG9jTWF0cml4MUQoZGltMSAqIGRpbTIgKiBkaW0zLCBzaXplKSkgPT0gTlVMTCkgeworICAgIGZka0ZyZWVNYXRyaXgxRChwMSk7CisgICAgZmRrRnJlZU1hdHJpeDFEKHAyKTsKKyAgICBwMSA9IE5VTEw7CisgICAgcDIgPSBOVUxMOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgZGltMTsgaSsrKSB7CisgICAgcDFbaV0gPSBwMjsKKyAgICBmb3IgKGogPSAwOyBqIDwgZGltMjsgaisrKSB7CisgICAgICBwMltqXSA9IHAzOworICAgICAgcDMgKz0gZGltMyAqIHNpemU7CisgICAgfQorICAgIHAyICs9IGRpbTI7CisgIH0KK2JhaWw6CisgIHJldHVybiBwMTsKK30KKwordm9pZCBmZGtGcmVlTWF0cml4M0Qodm9pZCAqKipwKSB7CisgIGlmICghcCkgcmV0dXJuOworICBpZiAocFswXSAhPSBOVUxMKSBmZGtGcmVlTWF0cml4MUQocFswXVswXSk7CisgIGZka0ZyZWVNYXRyaXgxRChwWzBdKTsKKyAgZmRrRnJlZU1hdHJpeDFEKHApOworfQorCit2b2lkICoqKmZka0NhbGxvY01hdHJpeDNEX2ludChVSU5UIGRpbTEsIFVJTlQgZGltMiwgVUlOVCBkaW0zLCBVSU5UIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1PUllfU0VDVElPTiBzKSB7CisgIHZvaWQgKioqcDE7CisgIFVJTlQgaSwgajsKKyAgdm9pZCAqKnAyOworICBjaGFyICpwMzsKKworICBpZiAoIWRpbTEgfHwgIWRpbTIgfHwgIWRpbTMpIHJldHVybiBOVUxMOworICBpZiAoKHAxID0gKHZvaWQgKioqKWZka0NhbGxvY01hdHJpeDFEX2ludChkaW0xLCBzaXplb2Yodm9pZCAqKiksIHMpKSA9PQorICAgICAgTlVMTCkgeworICAgIGdvdG8gYmFpbDsKKyAgfQorICBpZiAoKHAyID0gKHZvaWQgKiopZmRrQ2FsbG9jTWF0cml4MURfaW50KGRpbTEgKiBkaW0yLCBzaXplb2Yodm9pZCAqKSwgcykpID09CisgICAgICBOVUxMKSB7CisgICAgZmRrRnJlZU1hdHJpeDFEKHAxKTsKKyAgICBwMSA9IE5VTEw7CisgICAgZ290byBiYWlsOworICB9CisgIHAxWzBdID0gcDI7CisgIGlmICgocDMgPSAoY2hhciAqKWZka0NhbGxvY01hdHJpeDFEX2ludChkaW0xICogZGltMiAqIGRpbTMsIHNpemUsIHMpKSA9PQorICAgICAgTlVMTCkgeworICAgIGZka0ZyZWVNYXRyaXgxRChwMSk7CisgICAgZmRrRnJlZU1hdHJpeDFEKHAyKTsKKyAgICBwMSA9IE5VTEw7CisgICAgcDIgPSBOVUxMOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgZGltMTsgaSsrKSB7CisgICAgcDFbaV0gPSBwMjsKKyAgICBmb3IgKGogPSAwOyBqIDwgZGltMjsgaisrKSB7CisgICAgICBwMltqXSA9IHAzOworICAgICAgcDMgKz0gZGltMyAqIHNpemU7CisgICAgfQorICAgIHAyICs9IGRpbTI7CisgIH0KK2JhaWw6CisgIHJldHVybiBwMTsKK30KZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvRkRLX3FtZl9kb21haW4uY3BwIGIvbGliRkRLL3NyYy9GREtfcW1mX2RvbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzYTM3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYkZESy9zcmMvRkRLX3FtZl9kb21haW4uY3BwCkBAIC0wLDAgKzEsMTAxNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF0dGhpYXMgSGlsZGVuYnJhbmQKKworICAgRGVzY3JpcHRpb246IE1vZHVsZSB0byBlZmZpY2llbnRseSBoYW5kbGUgUU1GIGRhdGEgZm9yIG11bHRpcGxlIGNoYW5uZWxzIGFuZAorICAgICAgICAgICAgICAgIHRvIHNoYXJlIHRoZSBkYXRhIGJldHdlZW4gZS5nLiBTQlIgYW5kIE1QUworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRkRLX3FtZl9kb21haW4uaCIKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2RlZmluZSBXT1JLQlVGRkVSMV9UQUcgMAorI2RlZmluZSBXT1JLQlVGRkVSMl9UQUcgMQorCisjZGVmaW5lIFdPUktCVUZGRVIzX1RBRyA0CisjZGVmaW5lIFdPUktCVUZGRVI0X1RBRyA1CisjZGVmaW5lIFdPUktCVUZGRVI1X1RBRyA2CisjZGVmaW5lIFdPUktCVUZGRVI2X1RBRyA3CisKK0NfQUxMT0NfTUVNX09WRVJMQVkoUW1mV29ya0J1ZmZlckNvcmUxLCBGSVhQX0RCTCwgUU1GX1dCX1NFQ1RJT05fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgU0VDVF9EQVRBX0wxLCBXT1JLQlVGRkVSMV9UQUcpCitDX0FMTE9DX01FTV9PVkVSTEFZKFFtZldvcmtCdWZmZXJDb3JlMiwgRklYUF9EQkwsIFFNRl9XQl9TRUNUSU9OX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIFNFQ1RfREFUQV9MMiwgV09SS0JVRkZFUjJfVEFHKQorQ19BTExPQ19NRU1fT1ZFUkxBWShRbWZXb3JrQnVmZmVyQ29yZTMsIEZJWFBfREJMLCBRTUZfV0JfU0VDVElPTl9TSVpFLAorICAgICAgICAgICAgICAgICAgICBTRUNUX0RBVEFfTDIsIFdPUktCVUZGRVIzX1RBRykKK0NfQUxMT0NfTUVNX09WRVJMQVkoUW1mV29ya0J1ZmZlckNvcmU0LCBGSVhQX0RCTCwgUU1GX1dCX1NFQ1RJT05fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgU0VDVF9EQVRBX0wyLCBXT1JLQlVGRkVSNF9UQUcpCitDX0FMTE9DX01FTV9PVkVSTEFZKFFtZldvcmtCdWZmZXJDb3JlNSwgRklYUF9EQkwsIFFNRl9XQl9TRUNUSU9OX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIFNFQ1RfREFUQV9MMiwgV09SS0JVRkZFUjVfVEFHKQorQ19BTExPQ19NRU1fT1ZFUkxBWShRbWZXb3JrQnVmZmVyQ29yZTYsIEZJWFBfREJMLCBRTUZfV0JfU0VDVElPTl9TSVpFLAorICAgICAgICAgICAgICAgICAgICBTRUNUX0RBVEFfTDIsIFdPUktCVUZGRVI2X1RBRykKKworLyohIEFuYWx5c2lzIHN0YXRlcyBidWZmZXIuIDxicj4KKyAgICBEaW1lbnNpb246ICMoKDgpICsgKDEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDX0FMTE9DX01FTTIoQW5hUW1mU3RhdGVzLCBGSVhQX1FBUywgMTAgKiBRTUZfRE9NQUlOX01BWF9BTkFMWVNJU19RTUZfQkFORFMsCisgICAgICAgICAgICAgKCg4KSArICgxKSkpCisKKy8qISBTeW50aGVzaXMgc3RhdGVzIGJ1ZmZlci4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQ19BTExPQ19NRU0yKFN5blFtZlN0YXRlcywgRklYUF9RU1MsIDkgKiBRTUZfRE9NQUlOX01BWF9TWU5USEVTSVNfUU1GX0JBTkRTLAorICAgICAgICAgICAgICgoOCkgKyAoMSkpKQorCisvKiEgUG9pbnRlciB0byByZWFsIHFtZiBkYXRhIGZvciBlYWNoIHRpbWUgc2xvdC4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUxMT0NfTUVNMihRbWZTbG90c1JlYWwsIEZJWFBfREJMICosCisgICAgICAgICAgICAgUU1GX0RPTUFJTl9NQVhfVElNRVNMT1RTICsgUU1GX0RPTUFJTl9NQVhfT1ZfVElNRVNMT1RTLAorICAgICAgICAgICAgICgoOCkgKyAoMSkpKQorCisvKiEgUG9pbnRlciB0byBpbWFnaW5hcnkgcW1mIGRhdGEgZm9yIGVhY2ggdGltZSBzbG90LiA8YnI+CisgICAgRGltZW5zaW9uOiAjKCg4KSArICgxKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQ19BTExPQ19NRU0yKFFtZlNsb3RzSW1hZywgRklYUF9EQkwgKiwKKyAgICAgICAgICAgICBRTUZfRE9NQUlOX01BWF9USU1FU0xPVFMgKyBRTUZfRE9NQUlOX01BWF9PVl9USU1FU0xPVFMsCisgICAgICAgICAgICAgKCg4KSArICgxKSkpCisKKy8qISBRTUYgb3ZlcmxhcCBidWZmZXIuIDxicj4KKyAgICBEaW1lbnNpb246ICMoKDgpICsgKDEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDX0FBTExPQ19NRU0yKFFtZk92ZXJsYXBCdWZmZXIsIEZJWFBfREJMLAorICAgICAgICAgICAgICAyICogUU1GX0RPTUFJTl9NQVhfT1ZfVElNRVNMT1RTICogUU1GX0RPTUFJTl9NQVhfUU1GX1BST0NfQkFORFMsCisgICAgICAgICAgICAgICgoOCkgKyAoMSkpKQorCisvKiEgQW5hbHlzaXMgc3RhdGVzIGJ1ZmZlci4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUxMT0NfTUVNMihBbmFRbWZTdGF0ZXMxNiwgRklYUF9RQVMsIDEwICogUU1GX0RPTUFJTl9BTkFMWVNJU19RTUZfQkFORFNfMTYsCisgICAgICAgICAgICAgKCg4KSArICgxKSkpCisKKy8qISBBbmFseXNpcyBzdGF0ZXMgYnVmZmVyLiA8YnI+CisgICAgRGltZW5zaW9uOiAjKCg4KSArICgxKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQ19BTExPQ19NRU0yKEFuYVFtZlN0YXRlczI0LCBGSVhQX1FBUywgMTAgKiBRTUZfRE9NQUlOX0FOQUxZU0lTX1FNRl9CQU5EU18yNCwKKyAgICAgICAgICAgICAoKDgpICsgKDEpKSkKKworLyohIEFuYWx5c2lzIHN0YXRlcyBidWZmZXIuIDxicj4KKyAgICBEaW1lbnNpb246ICMoKDgpICsgKDEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDX0FMTE9DX01FTTIoQW5hUW1mU3RhdGVzMzIsIEZJWFBfUUFTLCAxMCAqIFFNRl9ET01BSU5fQU5BTFlTSVNfUU1GX0JBTkRTXzMyLAorICAgICAgICAgICAgICgoOCkgKyAoMSkpKQorCisvKiEgUG9pbnRlciB0byByZWFsIHFtZiBkYXRhIGZvciBlYWNoIHRpbWUgc2xvdC4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUxMT0NfTUVNMihRbWZTbG90c1JlYWwxNiwgRklYUF9EQkwgKiwKKyAgICAgICAgICAgICBRTUZfRE9NQUlOX1RJTUVTTE9UU18xNiArIFFNRl9ET01BSU5fT1ZfVElNRVNMT1RTXzE2LCAoKDgpICsgKDEpKSkKKworLyohIFBvaW50ZXIgdG8gcmVhbCBxbWYgZGF0YSBmb3IgZWFjaCB0aW1lIHNsb3QuIDxicj4KKyAgICBEaW1lbnNpb246ICMoKDgpICsgKDEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDX0FMTE9DX01FTTIoUW1mU2xvdHNSZWFsMzIsIEZJWFBfREJMICosCisgICAgICAgICAgICAgUU1GX0RPTUFJTl9USU1FU0xPVFNfMzIgKyBRTUZfRE9NQUlOX09WX1RJTUVTTE9UU18zMiwgKCg4KSArICgxKSkpCisKKy8qISBQb2ludGVyIHRvIGltYWdpbmFyeSBxbWYgZGF0YSBmb3IgZWFjaCB0aW1lIHNsb3QuIDxicj4KKyAgICBEaW1lbnNpb246ICMoKDgpICsgKDEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDX0FMTE9DX01FTTIoUW1mU2xvdHNJbWFnMTYsIEZJWFBfREJMICosCisgICAgICAgICAgICAgUU1GX0RPTUFJTl9USU1FU0xPVFNfMTYgKyBRTUZfRE9NQUlOX09WX1RJTUVTTE9UU18xNiwgKCg4KSArICgxKSkpCisKKy8qISBQb2ludGVyIHRvIGltYWdpbmFyeSBxbWYgZGF0YSBmb3IgZWFjaCB0aW1lIHNsb3QuIDxicj4KKyAgICBEaW1lbnNpb246ICMoKDgpICsgKDEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDX0FMTE9DX01FTTIoUW1mU2xvdHNJbWFnMzIsIEZJWFBfREJMICosCisgICAgICAgICAgICAgUU1GX0RPTUFJTl9USU1FU0xPVFNfMzIgKyBRTUZfRE9NQUlOX09WX1RJTUVTTE9UU18zMiwgKCg4KSArICgxKSkpCisKKy8qISBRTUYgb3ZlcmxhcCBidWZmZXIuIDxicj4KKyAgICBEaW1lbnNpb246ICMoKDgpICsgKDEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDX0FBTExPQ19NRU0yKFFtZk92ZXJsYXBCdWZmZXIxNiwgRklYUF9EQkwsCisgICAgICAgICAgICAgIDIgKiBRTUZfRE9NQUlOX09WX1RJTUVTTE9UU18xNiAqIFFNRl9ET01BSU5fTUFYX1FNRl9QUk9DX0JBTkRTLAorICAgICAgICAgICAgICAoKDgpICsgKDEpKSkKKworLyohIFFNRiBvdmVybGFwIGJ1ZmZlci4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUFMTE9DX01FTTIoUW1mT3ZlcmxhcEJ1ZmZlcjMyLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgMiAqIFFNRl9ET01BSU5fT1ZfVElNRVNMT1RTXzMyICogUU1GX0RPTUFJTl9NQVhfUU1GX1BST0NfQkFORFMsCisgICAgICAgICAgICAgICgoOCkgKyAoMSkpKQorCitzdGF0aWMgaW50IEZES19RbWZEb21haW5fRnJlZVBlcnNpc3RlbnRNZW1vcnkoSEFORExFX0ZES19RTUZfRE9NQUlOIHFkKSB7CisgIGludCBlcnIgPSAwOworICBpbnQgY2g7CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgKCg4KSArICgxKSk7IGNoKyspIHsKKyAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5wQW5hUW1mU3RhdGVzKSB7CisgICAgICBpZiAocWQtPmdsb2JhbENvbmYubkJhbmRzQW5hbHlzaXMgPT0gUU1GX0RPTUFJTl9BTkFMWVNJU19RTUZfQkFORFNfMTYpIHsKKyAgICAgICAgRnJlZUFuYVFtZlN0YXRlczE2KCZxZC0+UW1mRG9tYWluSW5bY2hdLnBBbmFRbWZTdGF0ZXMpOworICAgICAgfSBlbHNlIGlmIChxZC0+Z2xvYmFsQ29uZi5uQmFuZHNBbmFseXNpcyA9PQorICAgICAgICAgICAgICAgICBRTUZfRE9NQUlOX0FOQUxZU0lTX1FNRl9CQU5EU18yNCkgeworICAgICAgICBGcmVlQW5hUW1mU3RhdGVzMjQoJnFkLT5RbWZEb21haW5JbltjaF0ucEFuYVFtZlN0YXRlcyk7CisgICAgICB9IGVsc2UgaWYgKHFkLT5nbG9iYWxDb25mLm5CYW5kc0FuYWx5c2lzID09CisgICAgICAgICAgICAgICAgIFFNRl9ET01BSU5fQU5BTFlTSVNfUU1GX0JBTkRTXzMyKSB7CisgICAgICAgIEZyZWVBbmFRbWZTdGF0ZXMzMigmcWQtPlFtZkRvbWFpbkluW2NoXS5wQW5hUW1mU3RhdGVzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZyZWVBbmFRbWZTdGF0ZXMoJnFkLT5RbWZEb21haW5JbltjaF0ucEFuYVFtZlN0YXRlcyk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0ucE92ZXJsYXBCdWZmZXIpIHsKKyAgICAgIGlmIChxZC0+Z2xvYmFsQ29uZi5uUW1mT3ZUaW1lU2xvdHMgPT0gUU1GX0RPTUFJTl9PVl9USU1FU0xPVFNfMTYpIHsKKyAgICAgICAgRnJlZVFtZk92ZXJsYXBCdWZmZXIxNigmcWQtPlFtZkRvbWFpbkluW2NoXS5wT3ZlcmxhcEJ1ZmZlcik7CisgICAgICB9IGVsc2UgaWYgKHFkLT5nbG9iYWxDb25mLm5RbWZPdlRpbWVTbG90cyA9PSBRTUZfRE9NQUlOX09WX1RJTUVTTE9UU18zMikgeworICAgICAgICBGcmVlUW1mT3ZlcmxhcEJ1ZmZlcjMyKCZxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZyZWVRbWZPdmVybGFwQnVmZmVyKCZxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNSZWFsKSB7CisgICAgICBpZiAocWQtPmdsb2JhbENvbmYublFtZlRpbWVTbG90cyA9PSBRTUZfRE9NQUlOX1RJTUVTTE9UU18xNikgeworICAgICAgICBGcmVlUW1mU2xvdHNSZWFsMTYoJnFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzUmVhbCk7CisgICAgICB9IGVsc2UgaWYgKHFkLT5nbG9iYWxDb25mLm5RbWZUaW1lU2xvdHMgPT0gUU1GX0RPTUFJTl9USU1FU0xPVFNfMzIpIHsKKyAgICAgICAgRnJlZVFtZlNsb3RzUmVhbDMyKCZxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c1JlYWwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRnJlZVFtZlNsb3RzUmVhbCgmcWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNSZWFsKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNJbWFnKSB7CisgICAgICBpZiAocWQtPmdsb2JhbENvbmYublFtZlRpbWVTbG90cyA9PSBRTUZfRE9NQUlOX1RJTUVTTE9UU18xNikgeworICAgICAgICBGcmVlUW1mU2xvdHNJbWFnMTYoJnFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzSW1hZyk7CisgICAgICB9CisgICAgICBpZiAocWQtPmdsb2JhbENvbmYublFtZlRpbWVTbG90cyA9PSBRTUZfRE9NQUlOX1RJTUVTTE9UU18zMikgeworICAgICAgICBGcmVlUW1mU2xvdHNJbWFnMzIoJnFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzSW1hZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBGcmVlUW1mU2xvdHNJbWFnKCZxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c0ltYWcpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoY2ggPSAwOyBjaCA8ICgoOCkgKyAoMSkpOyBjaCsrKSB7CisgICAgaWYgKHFkLT5RbWZEb21haW5PdXRbY2hdLnBTeW5RbWZTdGF0ZXMpIHsKKyAgICAgIEZyZWVTeW5RbWZTdGF0ZXMoJnFkLT5RbWZEb21haW5PdXRbY2hdLnBTeW5RbWZTdGF0ZXMpOworICAgIH0KKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgRkRLX1FtZkRvbWFpbl9BbGxvY2F0ZVBlcnNpc3RlbnRNZW1vcnkoSEFORExFX0ZES19RTUZfRE9NQUlOIHFkKSB7CisgIGludCBlcnIgPSAwOworICBpbnQgY2g7CisgIEhBTkRMRV9GREtfUU1GX0RPTUFJTl9HQyBnYyA9ICZxZC0+Z2xvYmFsQ29uZjsKKworICBpZiAoKGdjLT5uSW5wdXRDaGFubmVscyA+ICgoOCkgKyAoMSkpKSB8fCAoZ2MtPm5PdXRwdXRDaGFubmVscyA+ICgoOCkgKyAoMSkpKSkKKyAgICByZXR1cm4gZXJyID0gMTsKKyAgZm9yIChjaCA9IDA7IGNoIDwgZ2MtPm5JbnB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgaW50IHNpemU7CisKKyAgICBzaXplID0gZ2MtPm5CYW5kc0FuYWx5c2lzICogMTA7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICBpZiAoZ2MtPm5CYW5kc0FuYWx5c2lzID09IFFNRl9ET01BSU5fQU5BTFlTSVNfUU1GX0JBTkRTXzE2KSB7CisgICAgICAgIGlmIChxZC0+UW1mRG9tYWluSW5bY2hdLnBBbmFRbWZTdGF0ZXMgPT0gTlVMTCkgeworICAgICAgICAgIGlmIChOVUxMID09CisgICAgICAgICAgICAgIChxZC0+UW1mRG9tYWluSW5bY2hdLnBBbmFRbWZTdGF0ZXMgPSBHZXRBbmFRbWZTdGF0ZXMxNihjaCkpKQorICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGdjLT5uQmFuZHNBbmFseXNpcyA9PSBRTUZfRE9NQUlOX0FOQUxZU0lTX1FNRl9CQU5EU18yNCkgeworICAgICAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5wQW5hUW1mU3RhdGVzID09IE5VTEwpIHsKKyAgICAgICAgICBpZiAoTlVMTCA9PQorICAgICAgICAgICAgICAocWQtPlFtZkRvbWFpbkluW2NoXS5wQW5hUW1mU3RhdGVzID0gR2V0QW5hUW1mU3RhdGVzMjQoY2gpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChnYy0+bkJhbmRzQW5hbHlzaXMgPT0gUU1GX0RPTUFJTl9BTkFMWVNJU19RTUZfQkFORFNfMzIpIHsKKyAgICAgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0ucEFuYVFtZlN0YXRlcyA9PSBOVUxMKSB7CisgICAgICAgICAgaWYgKE5VTEwgPT0KKyAgICAgICAgICAgICAgKHFkLT5RbWZEb21haW5JbltjaF0ucEFuYVFtZlN0YXRlcyA9IEdldEFuYVFtZlN0YXRlczMyKGNoKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChxZC0+UW1mRG9tYWluSW5bY2hdLnBBbmFRbWZTdGF0ZXMgPT0gTlVMTCkgeworICAgICAgICAgIGlmIChOVUxMID09IChxZC0+UW1mRG9tYWluSW5bY2hdLnBBbmFRbWZTdGF0ZXMgPSBHZXRBbmFRbWZTdGF0ZXMoY2gpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBxZC0+UW1mRG9tYWluSW5bY2hdLnBBbmFRbWZTdGF0ZXMgPSBOVUxMOworICAgIH0KKworICAgIHNpemUgPSBnYy0+blFtZk92VGltZVNsb3RzICsgZ2MtPm5RbWZUaW1lU2xvdHM7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICBpZiAoZ2MtPm5RbWZUaW1lU2xvdHMgPT0gUU1GX0RPTUFJTl9USU1FU0xPVFNfMTYpIHsKKyAgICAgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzUmVhbCA9PSBOVUxMKSB7CisgICAgICAgICAgaWYgKE5VTEwgPT0KKyAgICAgICAgICAgICAgKHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzUmVhbCA9IEdldFFtZlNsb3RzUmVhbDE2KGNoKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzSW1hZyA9PSBOVUxMKSB7CisgICAgICAgICAgaWYgKE5VTEwgPT0KKyAgICAgICAgICAgICAgKHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzSW1hZyA9IEdldFFtZlNsb3RzSW1hZzE2KGNoKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZ2MtPm5RbWZUaW1lU2xvdHMgPT0gUU1GX0RPTUFJTl9USU1FU0xPVFNfMzIpIHsKKyAgICAgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzUmVhbCA9PSBOVUxMKSB7CisgICAgICAgICAgaWYgKE5VTEwgPT0KKyAgICAgICAgICAgICAgKHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzUmVhbCA9IEdldFFtZlNsb3RzUmVhbDMyKGNoKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzSW1hZyA9PSBOVUxMKSB7CisgICAgICAgICAgaWYgKE5VTEwgPT0KKyAgICAgICAgICAgICAgKHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzSW1hZyA9IEdldFFtZlNsb3RzSW1hZzMyKGNoKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c1JlYWwgPT0gTlVMTCkgeworICAgICAgICAgIGlmIChOVUxMID09IChxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c1JlYWwgPSBHZXRRbWZTbG90c1JlYWwoY2gpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNJbWFnID09IE5VTEwpIHsKKyAgICAgICAgICBpZiAoTlVMTCA9PSAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNJbWFnID0gR2V0UW1mU2xvdHNJbWFnKGNoKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNSZWFsID0gTlVMTDsKKyAgICAgIHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzSW1hZyA9IE5VTEw7CisgICAgfQorCisgICAgc2l6ZSA9IGdjLT5uUW1mT3ZUaW1lU2xvdHMgKiBnYy0+blFtZlByb2NCYW5kcyAqIENNUExYX01PRDsKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgIGlmIChnYy0+blFtZk92VGltZVNsb3RzID09IFFNRl9ET01BSU5fT1ZfVElNRVNMT1RTXzE2KSB7CisgICAgICAgIGlmIChxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICBpZiAoTlVMTCA9PQorICAgICAgICAgICAgICAocWQtPlFtZkRvbWFpbkluW2NoXS5wT3ZlcmxhcEJ1ZmZlciA9IEdldFFtZk92ZXJsYXBCdWZmZXIxNihjaCkpKQorICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGdjLT5uUW1mT3ZUaW1lU2xvdHMgPT0gUU1GX0RPTUFJTl9PVl9USU1FU0xPVFNfMzIpIHsKKyAgICAgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0ucE92ZXJsYXBCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgIGlmIChOVUxMID09CisgICAgICAgICAgICAgIChxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyID0gR2V0UW1mT3ZlcmxhcEJ1ZmZlcjMyKGNoKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICBpZiAoTlVMTCA9PQorICAgICAgICAgICAgICAocWQtPlFtZkRvbWFpbkluW2NoXS5wT3ZlcmxhcEJ1ZmZlciA9IEdldFFtZk92ZXJsYXBCdWZmZXIoY2gpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyID0gTlVMTDsKKyAgICB9CisgIH0KKworICBmb3IgKGNoID0gMDsgY2ggPCBnYy0+bk91dHB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgaW50IHNpemUgPSBnYy0+bkJhbmRzU3ludGhlc2lzICogOTsKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgIGlmIChxZC0+UW1mRG9tYWluT3V0W2NoXS5wU3luUW1mU3RhdGVzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKE5VTEwgPT0gKHFkLT5RbWZEb21haW5PdXRbY2hdLnBTeW5RbWZTdGF0ZXMgPSBHZXRTeW5RbWZTdGF0ZXMoY2gpKSkKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHFkLT5RbWZEb21haW5PdXRbY2hdLnBTeW5RbWZTdGF0ZXMgPSBOVUxMOworICAgIH0KKyAgfQorCisgIHJldHVybiBlcnI7CisKK2JhaWw6CisgIEZES19RbWZEb21haW5fRnJlZVBlcnNpc3RlbnRNZW1vcnkocWQpOworICByZXR1cm4gLTE7Cit9CisKK1FNRl9ET01BSU5fRVJST1IgRkRLX1FtZkRvbWFpbl9DbGVhclBlcnNpc3RlbnRNZW1vcnkoCisgICAgSEFORExFX0ZES19RTUZfRE9NQUlOIGhxZCkgeworICBRTUZfRE9NQUlOX0VSUk9SIGVyciA9IFFNRl9ET01BSU5fT0s7CisgIGludCBjaCwgc2l6ZTsKKyAgaWYgKGhxZCkgeworICAgIEhBTkRMRV9GREtfUU1GX0RPTUFJTl9HQyBnYyA9ICZocWQtPmdsb2JhbENvbmY7CisKKyAgICBzaXplID0gZ2MtPm5RbWZPdlRpbWVTbG90cyAqIGdjLT5uUW1mUHJvY0JhbmRzICogQ01QTFhfTU9EOworICAgIGZvciAoY2ggPSAwOyBjaCA8IGdjLT5uSW5wdXRDaGFubmVsczsgY2grKykgeworICAgICAgaWYgKGhxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyKSB7CisgICAgICAgIEZES21lbWNsZWFyKGhxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBzaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChGREtfUW1mRG9tYWluX0luaXRGaWx0ZXJCYW5rKGhxZCwgMCkpIHsKKyAgICAgIGVyciA9IFFNRl9ET01BSU5fSU5JVF9FUlJPUjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZXJyID0gUU1GX0RPTUFJTl9JTklUX0VSUk9SOworICB9CisgIHJldHVybiBlcnI7Cit9CisKKy8qCisgICBGREtfZ2V0V29ya0J1ZmZlcgorCisgICAgUGFyYW1ldGVyczoKKworICAgIHBXb3JrQnVmZmVyICAgICAgICBpOiBhcnJheSBvZiBwb2ludGVycyB3aGljaCBwb2ludCB0byBkaWZmZXJlbnQgd29ya2J1ZmZlcgorICAgc2VjdGlvbnMgd29ya0J1ZmZlck9mZnNldCAgIGk6IG9mZnNldCBpbiB0aGUgd29ya2J1ZmZlciB0byB0aGUgcmVxdWVzdGVkCisgICBtZW1vcnkgbWVtU2l6ZSAgICAgICAgICAgIGk6IHNpemUgb2YgcmVxdWVzdGVkIG1lbW9yeQorCisgICAgRnVuY3Rpb246CisKKyAgICBUaGUgZnVuY3Rpb25zIHJldHVybnMgdGhlIGFkZHJlc3MgdG8gdGhlIHJlcXVlc3RlZCBtZW1vcnkgaW4gdGhlIHdvcmtidWZmZXIuCisKKyAgICBUaGUgb3ZlcmFsbCB3b3JrYnVmZmVyIGlzIGRpdmlkZWQgaW50byBzZXZlcmFsIHNlY3Rpb25zLiBUaGVyZSBhcmUKKyAgIFFNRl9NQVhfV0JfU0VDVElPTlMgc2VjdGlvbnMgb2Ygc2l6ZSBRTUZfV0JfU0VDVElPTl9TSVpFLiBUaGUgZnVuY3Rpb24KKyAgIHNlbGVjdHMgdGhlIHdvcmtidWZmZXIgc2VjdGlvbiB3aXRoIHRoZSBoZWxwIG9mIHRoZSB3b3JrQnVmZmVyT2Zmc2V0IGFuZCB0aGFuCisgICBpdCB2ZXJpZmllcyB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIG1lbW9yeSBmaXRzIGludG8gdGhlIHNlbGVjdGVkCisgICB3b3JrYnVmZmVyIHNlY3Rpb24uCisKKyAgICBSZXR1cm5zOgorCisgICAgYWRkcmVzcyB0byB3b3JrYnVmZmVyCisqLworc3RhdGljIEZJWFBfREJMICpGREtfZ2V0V29ya0J1ZmZlcihGSVhQX0RCTCAqKnBXb3JrQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgd29ya0J1ZmZlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIHdvcmtCdWZmZXJTZWN0U2l6ZSwgVVNIT1JUIG1lbVNpemUpIHsKKyAgaW50IGlkeDE7CisgIGludCBpZHgyOworICBGSVhQX0RCTCAqcHdiOworCisgIC8qIGEgc2VjdGlvbiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIG51bWJlciBvZiBwcm9jZXNzaW5nIGJhbmRzIChjdXJyZW50bHkKKyAgICogYWx3YXlzIDY0KSAqLworICBGREtfQVNTRVJUKCh3b3JrQnVmZmVyU2VjdFNpemUgJSA2NCkgPT0gMCk7CisKKyAgLyogY2FsY3VsYXRlIG9mZnNldCB3aXRoaW4gdGhlIHNlY3Rpb24gKi8KKyAgaWR4MiA9IHdvcmtCdWZmZXJPZmZzZXQgJSB3b3JrQnVmZmVyU2VjdFNpemU7CisgIC8qIGNhbGN1bGF0ZSBzZWN0aW9uIG51bWJlciAqLworICBpZHgxID0gKHdvcmtCdWZmZXJPZmZzZXQgLSBpZHgyKSAvIHdvcmtCdWZmZXJTZWN0U2l6ZTsKKyAgLyogbWF4aW11bSBzZWN0aW9ubnVtYmVyIGlzIFFNRl9NQVhfV0JfU0VDVElPTlMgKi8KKyAgRkRLX0FTU0VSVChpZHgxIDwgUU1GX01BWF9XQl9TRUNUSU9OUyk7CisKKyAgLyogY2hlY2ssIHdoZXRoZXIgd29ya2J1ZmZlciBpcyBhdmFpbGFibGUgICovCisgIEZES19BU1NFUlQocFdvcmtCdWZmZXJbaWR4MV0gIT0gTlVMTCk7CisKKyAgLyogY2hlY2ssIHdoZXRoZXIgYnVmZmVyIGZpdHMgaW50byBzZWxlY3RlZCBzZWN0aW9uICovCisgIEZES19BU1NFUlQoKGlkeDIgKyBtZW1TaXplKSA8PSB3b3JrQnVmZmVyU2VjdFNpemUpOworCisgIC8qIGdldCByZXF1ZXN0ZWQgYWRkcmVzcyB0byB3b3JrYnVmZmVyICovCisgIHB3YiA9ICZwV29ya0J1ZmZlcltpZHgxXVtpZHgyXTsKKworICByZXR1cm4gcHdiOworfQorCitzdGF0aWMgaW50IEZES19RbWZEb21haW5fRmVlZFdvcmtCdWZmZXIoSEFORExFX0ZES19RTUZfRE9NQUlOIHFkLCBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipwV29ya0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgd29ya0J1ZmZlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgd29ya0J1ZmZlclNlY3RTaXplLCBpbnQgc2l6ZSkgeworICBpbnQgZXJyID0gMDsKKyAgaW50IG1lbV9uZWVkZWQ7CisKKyAgbWVtX25lZWRlZCA9IHFkLT5RbWZEb21haW5JbltjaF0ud29ya0J1Zl9uQmFuZHMgKgorICAgICAgICAgICAgICAgcWQtPlFtZkRvbWFpbkluW2NoXS53b3JrQnVmX25UaW1lU2xvdHMgKiBDTVBMWF9NT0Q7CisgIGlmIChtZW1fbmVlZGVkID4gc2l6ZSkgeworICAgIHJldHVybiAoZXJyID0gMSk7CisgIH0KKyAgcWQtPlFtZkRvbWFpbkluW2NoXS5wV29ya0J1ZmZlciA9IHBXb3JrQnVmZmVyOworICBxZC0+UW1mRG9tYWluSW5bY2hdLndvcmtCdWZmZXJPZmZzZXQgPSB3b3JrQnVmZmVyT2Zmc2V0OworICBxZC0+UW1mRG9tYWluSW5bY2hdLndvcmtCdWZmZXJTZWN0U2l6ZSA9IHdvcmtCdWZmZXJTZWN0U2l6ZTsKKworICByZXR1cm4gZXJyOworfQorCitpbnQgRkRLX1FtZkRvbWFpbl9Jc0luaXRpYWxpemVkKGNvbnN0IEhBTkRMRV9GREtfUU1GX0RPTUFJTiBxZCkgeworICBGREtfQVNTRVJUKHFkICE9IE5VTEwpOworICByZXR1cm4gKChxZC0+UW1mRG9tYWluSW5bMF0ucEFuYVFtZlN0YXRlcyA9PSBOVUxMKSAmJgorICAgICAgICAgIChxZC0+UW1mRG9tYWluT3V0WzBdLnBTeW5RbWZTdGF0ZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgOiAxOworfQorCitpbnQgRkRLX1FtZkRvbWFpbl9Jbml0RmlsdGVyQmFuayhIQU5ETEVfRkRLX1FNRl9ET01BSU4gcWQsIFVJTlQgZXh0cmFfZmxhZ3MpIHsKKyAgRkRLX0FTU0VSVChxZCAhPSBOVUxMKTsKKyAgaW50IGVyciA9IDA7CisgIGludCBjaCwgdHM7CisgIEhBTkRMRV9GREtfUU1GX0RPTUFJTl9HQyBnYyA9ICZxZC0+Z2xvYmFsQ29uZjsKKyAgaW50IG5vQ29scyA9IGdjLT5uUW1mVGltZVNsb3RzOworICBpbnQgbHNiID0gZ2MtPm5CYW5kc0FuYWx5c2lzOworICBpbnQgdXNiID0gZk1pbigoSU5UKWdjLT5uQmFuZHNTeW50aGVzaXMsIDY0KTsKKyAgaW50IG5Qcm9jQmFuZHMgPSBnYy0+blFtZlByb2NCYW5kczsKKyAgRkRLX0FTU0VSVChuUHJvY0JhbmRzICUgQUxJR05NRU5UX0RFRkFVTFQgPT0gMCk7CisKKyAgaWYgKGV4dHJhX2ZsYWdzICYgUU1GX0ZMQUdfTVBTTERGQikgeworICAgIGdjLT5mbGFncyAmPSB+UU1GX0ZMQUdfQ0xERkI7CisgICAgZ2MtPmZsYWdzIHw9IFFNRl9GTEFHX01QU0xERkI7CisgIH0KKyAgZm9yIChjaCA9IDA7IGNoIDwgZ2MtPm5JbnB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgLyogZGlzdHJpYnV0ZSBtZW1vcnkgdG8gc2xvdHMgYXJyYXkgKi8KKyAgICBGSVhQX0RCTCAqcHRyT3YgPQorICAgICAgICBxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyOyAvKiBwZXJzaXN0ZW50IG1lbW9yeSBmb3Igb3ZlcmxhcCAqLworICAgIGlmICgocHRyT3YgPT0gTlVMTCkgJiYgKGdjLT5uUW1mT3ZUaW1lU2xvdHMgIT0gMCkpIHsKKyAgICAgIGVyciA9IDE7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAvKiBUaGlzIGFzc3VtZXMgdGhlIHdvcmtidWZmZXIgZGVmaW5lZCBmb3IgY2gwIGlzIHRoZSBiaWcgb25lIGJlaW5nIHVzZWQgdG8KKyAgICAgKiBob2xkIG9uZSBmdWxsIGZyYW1lIG9mIFFNRiBkYXRhLiAqLworICAgIEZJWFBfREJMICoqcHRyID0KKyAgICAgICAgcWQtPlFtZkRvbWFpbkluW2ZNaW4oY2gsIGZNYXgoKElOVClnYy0+blFtZlByb2NDaGFubmVscyAtIDEsIDApKV0KKyAgICAgICAgICAgIC5wV29ya0J1ZmZlcjsgLyogbm9uLXBlcnNpc3RlbnQgd29ya2J1ZmZlciAqLworICAgIFVTSE9SVCB3b3JrQnVmZmVyT2Zmc2V0ID0KKyAgICAgICAgcWQtPlFtZkRvbWFpbkluW2ZNaW4oY2gsIGZNYXgoKElOVClnYy0+blFtZlByb2NDaGFubmVscyAtIDEsIDApKV0KKyAgICAgICAgICAgIC53b3JrQnVmZmVyT2Zmc2V0OworICAgIFVTSE9SVCB3b3JrQnVmZmVyU2VjdFNpemUgPQorICAgICAgICBxZC0+UW1mRG9tYWluSW5bZk1pbihjaCwgZk1heCgoSU5UKWdjLT5uUW1mUHJvY0NoYW5uZWxzIC0gMSwgMCkpXQorICAgICAgICAgICAgLndvcmtCdWZmZXJTZWN0U2l6ZTsKKworICAgIGlmICgocHRyID09IE5VTEwpICYmIChnYy0+blFtZlRpbWVTbG90cyAhPSAwKSkgeworICAgICAgZXJyID0gMTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcWQtPlFtZkRvbWFpbkluW2NoXS5wR2xvYmFsQ29uZiA9IGdjOworICAgIGZvciAodHMgPSAwOyB0cyA8IGdjLT5uUW1mT3ZUaW1lU2xvdHM7IHRzKyspIHsKKyAgICAgIHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzUmVhbFt0c10gPSBwdHJPdjsKKyAgICAgIHB0ck92ICs9IG5Qcm9jQmFuZHM7CisgICAgICBxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c0ltYWdbdHNdID0gcHRyT3Y7CisgICAgICBwdHJPdiArPSBuUHJvY0JhbmRzOworICAgIH0KKyAgICBmb3IgKDsgdHMgPCAoZ2MtPm5RbWZPdlRpbWVTbG90cyArIGdjLT5uUW1mVGltZVNsb3RzKTsgdHMrKykgeworICAgICAgcWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNSZWFsW3RzXSA9IEZES19nZXRXb3JrQnVmZmVyKAorICAgICAgICAgIHB0ciwgd29ya0J1ZmZlck9mZnNldCwgd29ya0J1ZmZlclNlY3RTaXplLCBuUHJvY0JhbmRzKTsKKyAgICAgIHdvcmtCdWZmZXJPZmZzZXQgKz0gblByb2NCYW5kczsKKyAgICAgIHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzSW1hZ1t0c10gPSBGREtfZ2V0V29ya0J1ZmZlcigKKyAgICAgICAgICBwdHIsIHdvcmtCdWZmZXJPZmZzZXQsIHdvcmtCdWZmZXJTZWN0U2l6ZSwgblByb2NCYW5kcyk7CisgICAgICB3b3JrQnVmZmVyT2Zmc2V0ICs9IG5Qcm9jQmFuZHM7CisgICAgfQorICAgIGVyciB8PSBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rKAorICAgICAgICAmcWQtPlFtZkRvbWFpbkluW2NoXS5mYiwgcWQtPlFtZkRvbWFpbkluW2NoXS5wQW5hUW1mU3RhdGVzLCBub0NvbHMsCisgICAgICAgIChxZC0+UW1mRG9tYWluSW5bY2hdLmZiLmxzYiA9PSAwKSA/IGxzYiA6IHFkLT5RbWZEb21haW5JbltjaF0uZmIubHNiLAorICAgICAgICAocWQtPlFtZkRvbWFpbkluW2NoXS5mYi51c2IgPT0gMCkgPyB1c2IgOiBxZC0+UW1mRG9tYWluSW5bY2hdLmZiLnVzYiwKKyAgICAgICAgZ2MtPm5CYW5kc0FuYWx5c2lzLCBnYy0+ZmxhZ3MgfCBleHRyYV9mbGFncyk7CisgIH0KKworICBmb3IgKGNoID0gMDsgY2ggPCBnYy0+bk91dHB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgRklYUF9EQkwgb3V0R2Fpbl9tID0gcWQtPlFtZkRvbWFpbk91dFtjaF0uZmIub3V0R2Fpbl9tOworICAgIGludCBvdXRHYWluX2UgPSBxZC0+UW1mRG9tYWluT3V0W2NoXS5mYi5vdXRHYWluX2U7CisgICAgaW50IG91dFNjYWxlID0gcW1mR2V0T3V0U2NhbGVmYWN0b3IoJnFkLT5RbWZEb21haW5PdXRbY2hdLmZiKTsKKyAgICBlcnIgfD0gcW1mSW5pdFN5bnRoZXNpc0ZpbHRlckJhbmsoCisgICAgICAgICZxZC0+UW1mRG9tYWluT3V0W2NoXS5mYiwgcWQtPlFtZkRvbWFpbk91dFtjaF0ucFN5blFtZlN0YXRlcywgbm9Db2xzLAorICAgICAgICAocWQtPlFtZkRvbWFpbk91dFtjaF0uZmIubHNiID09IDApID8gbHNiIDogcWQtPlFtZkRvbWFpbk91dFtjaF0uZmIubHNiLAorICAgICAgICAocWQtPlFtZkRvbWFpbk91dFtjaF0uZmIudXNiID09IDApID8gdXNiIDogcWQtPlFtZkRvbWFpbk91dFtjaF0uZmIudXNiLAorICAgICAgICBnYy0+bkJhbmRzU3ludGhlc2lzLCBnYy0+ZmxhZ3MgfCBleHRyYV9mbGFncyk7CisgICAgaWYgKG91dEdhaW5fbSAhPSAoRklYUF9EQkwpMCkgeworICAgICAgcW1mQ2hhbmdlT3V0R2FpbigmcWQtPlFtZkRvbWFpbk91dFtjaF0uZmIsIG91dEdhaW5fbSwgb3V0R2Fpbl9lKTsKKyAgICB9CisgICAgaWYgKG91dFNjYWxlKSB7CisgICAgICBxbWZDaGFuZ2VPdXRTY2FsZWZhY3RvcigmcWQtPlFtZkRvbWFpbk91dFtjaF0uZmIsIG91dFNjYWxlKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXJyOworfQorCit2b2lkIEZES19RbWZEb21haW5fU2F2ZU92ZXJsYXAoSEFORExFX0ZES19RTUZfRE9NQUlOX0lOIHFkX2NoLCBpbnQgb2Zmc2V0KSB7CisgIEZES19BU1NFUlQocWRfY2ggIT0gTlVMTCk7CisgIGludCB0czsKKyAgSEFORExFX0ZES19RTUZfRE9NQUlOX0dDIGdjID0gcWRfY2gtPnBHbG9iYWxDb25mOworICBpbnQgb3ZTbG90cyA9IGdjLT5uUW1mT3ZUaW1lU2xvdHM7CisgIGludCBuQ29scyA9IGdjLT5uUW1mVGltZVNsb3RzOworICBpbnQgblByb2NCYW5kcyA9IGdjLT5uUW1mUHJvY0JhbmRzOworICBGSVhQX0RCTCAqKnFtZlJlYWwgPSBxZF9jaC0+aFFtZlNsb3RzUmVhbDsKKyAgRklYUF9EQkwgKipxbWZJbWFnID0gcWRfY2gtPmhRbWZTbG90c0ltYWc7CisgIFFNRl9TQ0FMRV9GQUNUT1IgKnBTY2FsaW5nID0gJnFkX2NoLT5zY2FsaW5nOworCisgIC8qIGZvciBoaWdoIHBhcnQgaXQgd291bGQgYmUgZW5vdWdoIHRvIHNhdmUgb25seSB1c2VkIHBhcnQgb2Ygb3ZlcmxhcCBhcmVhICovCisgIGlmIChxbWZJbWFnICE9IE5VTEwpIHsKKyAgICBmb3IgKHRzID0gb2Zmc2V0OyB0cyA8IG92U2xvdHM7IHRzKyspIHsKKyAgICAgIEZES21lbWNweShxbWZSZWFsW3RzXSwgcW1mUmVhbFtuQ29scyArIHRzXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogblByb2NCYW5kcyk7CisgICAgICBGREttZW1jcHkocW1mSW1hZ1t0c10sIHFtZkltYWdbbkNvbHMgKyB0c10sCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIG5Qcm9jQmFuZHMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKHRzID0gMDsgdHMgPCBvdlNsb3RzOyB0cysrKSB7CisgICAgICBGREttZW1jcHkocW1mUmVhbFt0c10sIHFtZlJlYWxbbkNvbHMgKyB0c10sCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIG5Qcm9jQmFuZHMpOworICAgIH0KKyAgfQorICBwU2NhbGluZy0+b3ZfbGJfc2NhbGUgPSBwU2NhbGluZy0+bGJfc2NhbGU7Cit9CisKKyAgLyogQ29udmVydCBoZWFkcm9vbSBiaXRzIHRvIGV4cG9uZW50ICovCisjZGVmaW5lIFNDQUxFMkVYUChzKSAoMTUgLSAocykpCisjZGVmaW5lIEVYUDJTQ0FMRShlKSAoMTUgLSAoZSkpCisKK3ZvaWQgRkRLX1FtZkRvbWFpbl9HZXRTbG90KGNvbnN0IEhBTkRMRV9GREtfUU1GX0RPTUFJTl9JTiBxZF9jaCwgY29uc3QgaW50IHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0YXJ0X2JhbmQsIGNvbnN0IGludCBzdG9wX2JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcFFtZk91dFJlYWwsIEZJWFBfREJMICpwUW1mT3V0SW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBleHBfb3V0KSB7CisgIEZES19BU1NFUlQocWRfY2ggIT0gTlVMTCk7CisgIEZES19BU1NFUlQocFFtZk91dFJlYWwgIT0gTlVMTCk7CisgIEhBTkRMRV9GREtfUU1GX0RPTUFJTl9HQyBnYyA9IHFkX2NoLT5wR2xvYmFsQ29uZjsKKyAgY29uc3QgRklYUF9EQkwgKnJlYWwgPSBxZF9jaC0+aFFtZlNsb3RzUmVhbFt0c107CisgIGNvbnN0IEZJWFBfREJMICppbWFnID0gcWRfY2gtPmhRbWZTbG90c0ltYWdbdHNdOworICBjb25zdCBpbnQgb3ZTbG90cyA9IGdjLT5uUW1mT3ZUaW1lU2xvdHM7CisgIGNvbnN0IGludCBleHBfbGIgPSBTQ0FMRTJFWFAoKHRzIDwgb3ZTbG90cykgPyBxZF9jaC0+c2NhbGluZy5vdl9sYl9zY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcWRfY2gtPnNjYWxpbmcubGJfc2NhbGUpOworICBjb25zdCBpbnQgZXhwX2hiID0gU0NBTEUyRVhQKHFkX2NoLT5zY2FsaW5nLmhiX3NjYWxlKTsKKyAgY29uc3QgaW50IGxzYiA9IHFkX2NoLT5mYi5sc2I7CisgIGNvbnN0IGludCB1c2IgPSBxZF9jaC0+ZmIudXNiOworICBpbnQgYiA9IHN0YXJ0X2JhbmQ7CisgIGludCBsYl9zZiwgaGJfc2Y7CisKKyAgaW50IHRhcmdldF9leHAgPQorICAgICAgQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LICsgcWRfY2gtPmZiLmZpbHRlclNjYWxlOworCisgIEZES19BU1NFUlQodHMgPCAoZ2MtPm5RbWZUaW1lU2xvdHMgKyBnYy0+blFtZk92VGltZVNsb3RzKSk7CisgIEZES19BU1NFUlQoc3RhcnRfYmFuZCA+PSAwKTsKKyAgRkRLX0FTU0VSVChzdG9wX2JhbmQgPD0gZ2MtPm5RbWZQcm9jQmFuZHMpOworCisgIGlmIChxZF9jaC0+ZmIubm9fY2hhbm5lbHMgPT0gMjQpIHsKKyAgICB0YXJnZXRfZXhwIC09IDE7CisgIH0KKworICAvKiBMaW1pdCBzY2FsaW5nIGZhY3RvcnMgdG8gbWF4aW11bSBuZWdhdGl2ZSB2YWx1ZSB0byBhdm9pZCBmYXVsdHkgYmVoYXZpb3VyCisgICAgIGR1ZSB0byByaWdodC1zaGlmdHMuIENvcnJlc3BvbmRpbmcgYXNzZXJ0cyB3ZXJlIG9ic2VydmVkIGR1cmluZyByb2J1c3RuZXNzCisgICAgIHRlc3RpbmcuCisgICAqLworICBsYl9zZiA9IGZNYXgoZXhwX2xiIC0gdGFyZ2V0X2V4cCAtIGV4cF9vdXQsIC0zMSk7CisgIEZES19BU1NFUlQobGJfc2YgPCAzMik7CisgIGhiX3NmID0gZk1heChleHBfaGIgLSB0YXJnZXRfZXhwIC0gZXhwX291dCwgLTMxKTsKKyAgRkRLX0FTU0VSVChoYl9zZiA8IDMyKTsKKworICBpZiAocFFtZk91dEltYWcgPT0gTlVMTCkgeworICAgIGZvciAoOyBiIDwgZk1pbihsc2IsIHN0b3BfYmFuZCk7IGIrKykgeworICAgICAgcFFtZk91dFJlYWxbYl0gPSBzY2FsZVZhbHVlKHJlYWxbYl0sIGxiX3NmKTsKKyAgICB9CisgICAgZm9yICg7IGIgPCBmTWluKHVzYiwgc3RvcF9iYW5kKTsgYisrKSB7CisgICAgICBwUW1mT3V0UmVhbFtiXSA9IHNjYWxlVmFsdWUocmVhbFtiXSwgaGJfc2YpOworICAgIH0KKyAgICBmb3IgKDsgYiA8IHN0b3BfYmFuZDsgYisrKSB7CisgICAgICBwUW1mT3V0UmVhbFtiXSA9IChGSVhQX0RCTCkwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGREtfQVNTRVJUKGltYWcgIT0gTlVMTCk7CisgICAgZm9yICg7IGIgPCBmTWluKGxzYiwgc3RvcF9iYW5kKTsgYisrKSB7CisgICAgICBwUW1mT3V0UmVhbFtiXSA9IHNjYWxlVmFsdWUocmVhbFtiXSwgbGJfc2YpOworICAgICAgcFFtZk91dEltYWdbYl0gPSBzY2FsZVZhbHVlKGltYWdbYl0sIGxiX3NmKTsKKyAgICB9CisgICAgZm9yICg7IGIgPCBmTWluKHVzYiwgc3RvcF9iYW5kKTsgYisrKSB7CisgICAgICBwUW1mT3V0UmVhbFtiXSA9IHNjYWxlVmFsdWUocmVhbFtiXSwgaGJfc2YpOworICAgICAgcFFtZk91dEltYWdbYl0gPSBzY2FsZVZhbHVlKGltYWdbYl0sIGhiX3NmKTsKKyAgICB9CisgICAgZm9yICg7IGIgPCBzdG9wX2JhbmQ7IGIrKykgeworICAgICAgcFFtZk91dFJlYWxbYl0gPSAoRklYUF9EQkwpMDsKKyAgICAgIHBRbWZPdXRJbWFnW2JdID0gKEZJWFBfREJMKTA7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRkRLX1FtZkRvbWFpbl9HZXRXb3JrQnVmZmVyKGNvbnN0IEhBTkRMRV9GREtfUU1GX0RPTUFJTl9JTiBxZF9jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0cywgRklYUF9EQkwgKipwcFFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnBwUW1mSW1hZykgeworICBGREtfQVNTRVJUKHFkX2NoICE9IE5VTEwpOworICBGREtfQVNTRVJUKHBwUW1mUmVhbCAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwcFFtZkltYWcgIT0gTlVMTCk7CisgIGNvbnN0IGludCBiYW5kcyA9IHFkX2NoLT53b3JrQnVmX25CYW5kczsKKyAgRklYUF9EQkwgKipwV29ya0J1ZiA9IHFkX2NoLT5wV29ya0J1ZmZlcjsKKyAgVVNIT1JUIHdvcmtCdWZmZXJPZmZzZXQgPSBxZF9jaC0+d29ya0J1ZmZlck9mZnNldDsKKyAgVVNIT1JUIHdvcmtCdWZmZXJTZWN0U2l6ZSA9IHFkX2NoLT53b3JrQnVmZmVyU2VjdFNpemU7CisKKyAgRkRLX0FTU0VSVChiYW5kcyA+IDApOworICBGREtfQVNTRVJUKHRzIDwgcWRfY2gtPndvcmtCdWZfblRpbWVTbG90cyk7CisKKyAgKnBwUW1mUmVhbCA9IEZES19nZXRXb3JrQnVmZmVyKAorICAgICAgcFdvcmtCdWYsIHdvcmtCdWZmZXJPZmZzZXQgKyAodHMgKiBDTVBMWF9NT0QgKyAwKSAqIGJhbmRzLAorICAgICAgd29ya0J1ZmZlclNlY3RTaXplLCBiYW5kcyk7CisgICpwcFFtZkltYWcgPSBGREtfZ2V0V29ya0J1ZmZlcigKKyAgICAgIHBXb3JrQnVmLCB3b3JrQnVmZmVyT2Zmc2V0ICsgKHRzICogQ01QTFhfTU9EICsgMSkgKiBiYW5kcywKKyAgICAgIHdvcmtCdWZmZXJTZWN0U2l6ZSwgYmFuZHMpOworfQorCit2b2lkIEZES19RbWZEb21haW5fV29ya0J1ZmZlcjJQcm9jQ2hhbm5lbCgKKyAgICBjb25zdCBIQU5ETEVfRkRLX1FNRl9ET01BSU5fSU4gcWRfY2gpIHsKKyAgRkRLX0FTU0VSVChxZF9jaCAhPSBOVUxMKTsKKyAgSEFORExFX0ZES19RTUZfRE9NQUlOX0dDIGdjID0gcWRfY2gtPnBHbG9iYWxDb25mOworICBGSVhQX0RCTCAqKnBXb3JrQnVmID0gcWRfY2gtPnBXb3JrQnVmZmVyOworICBVU0hPUlQgd29ya0J1ZmZlck9mZnNldCA9IHFkX2NoLT53b3JrQnVmZmVyT2Zmc2V0OworICBVU0hPUlQgd29ya0J1ZmZlclNlY3RTaXplID0gcWRfY2gtPndvcmtCdWZmZXJTZWN0U2l6ZTsKKworICBpZiAoRkRLX2dldFdvcmtCdWZmZXIocFdvcmtCdWYsIHdvcmtCdWZmZXJPZmZzZXQsIHdvcmtCdWZmZXJTZWN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHFkX2NoLT53b3JrQnVmX25CYW5kcykgPT0KKyAgICAgIHFkX2NoLT5oUW1mU2xvdHNSZWFsW2djLT5uUW1mT3ZUaW1lU2xvdHNdKSB7CisgICAgLyogd29yayBidWZmZXIgaXMgcGFydCBvZiBwcm9jZXNzaW5nIGNoYW5uZWwgPT4gbm90aGluZyB0byBkbyAqLworICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKyAgICAvKiBjb3B5IHBhcmtlZCBuZXcgUU1GIGRhdGEgdG8gcHJvY2Vzc2luZyBjaGFubmVsICovCisgICAgY29uc3QgaW50IGJhbmRzID0gcWRfY2gtPndvcmtCdWZfbkJhbmRzOworICAgIGNvbnN0IGludCBzbG90cyA9IHFkX2NoLT53b3JrQnVmX25UaW1lU2xvdHM7CisgICAgaW50IHRzOworICAgIGZvciAodHMgPSAwOyB0cyA8IHNsb3RzOyB0cysrKSB7CisgICAgICBGREttZW1jcHkocWRfY2gtPmhRbWZTbG90c1JlYWxbZ2MtPm5RbWZPdlRpbWVTbG90cyArIHRzXSwKKyAgICAgICAgICAgICAgICBGREtfZ2V0V29ya0J1ZmZlcihwV29ya0J1Ziwgd29ya0J1ZmZlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrQnVmZmVyU2VjdFNpemUsIGJhbmRzKSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogYmFuZHMpOyAgLy8gcGFya0J1Zl90b19hbmFNYXRyaXgKKyAgICAgIHdvcmtCdWZmZXJPZmZzZXQgKz0gYmFuZHM7CisgICAgICBGREttZW1jcHkocWRfY2gtPmhRbWZTbG90c0ltYWdbZ2MtPm5RbWZPdlRpbWVTbG90cyArIHRzXSwKKyAgICAgICAgICAgICAgICBGREtfZ2V0V29ya0J1ZmZlcihwV29ya0J1Ziwgd29ya0J1ZmZlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrQnVmZmVyU2VjdFNpemUsIGJhbmRzKSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogYmFuZHMpOworICAgICAgd29ya0J1ZmZlck9mZnNldCArPSBiYW5kczsKKyAgICB9CisgIH0KK30KKwordm9pZCBGREtfUW1mRG9tYWluX1FtZkRhdGEySEJFKEhBTkRMRV9GREtfUU1GX0RPTUFJTl9JTiBxZF9jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnBwUW1mUmVhbCwgRklYUF9EQkwgKipwcFFtZkltYWcpIHsKKyAgRkRLX0FTU0VSVChxZF9jaCAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwcFFtZlJlYWwgIT0gTlVMTCk7CisgIEZES19BU1NFUlQocHBRbWZJbWFnICE9IE5VTEwpOworICBIQU5ETEVfRkRLX1FNRl9ET01BSU5fR0MgZ2MgPSBxZF9jaC0+cEdsb2JhbENvbmY7CisgIEZJWFBfREJMICoqcFdvcmtCdWYgPSBxZF9jaC0+cFdvcmtCdWZmZXI7CisgIFVTSE9SVCB3b3JrQnVmZmVyT2Zmc2V0ID0gcWRfY2gtPndvcmtCdWZmZXJPZmZzZXQ7CisgIFVTSE9SVCB3b3JrQnVmZmVyU2VjdFNpemUgPSBxZF9jaC0+d29ya0J1ZmZlclNlY3RTaXplOworCisgIGlmIChGREtfZ2V0V29ya0J1ZmZlcihwV29ya0J1Ziwgd29ya0J1ZmZlck9mZnNldCwgd29ya0J1ZmZlclNlY3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgcWRfY2gtPndvcmtCdWZfbkJhbmRzKSA9PQorICAgICAgcWRfY2gtPmhRbWZTbG90c1JlYWxbZ2MtPm5RbWZPdlRpbWVTbG90c10pIHsgIC8vIGxlZnQgY2hhbm5lbCAoYW5hTWF0cml4KQorICAgIGludCB0czsKKyAgICBjb25zdCBpbnQgYmFuZHMgPSBnYy0+bkJhbmRzQW5hbHlzaXM7CisgICAgY29uc3QgaW50IHNsb3RzID0gcWRfY2gtPndvcmtCdWZfblRpbWVTbG90czsKKyAgICBGREtfQVNTRVJUKGJhbmRzIDw9IDY0KTsKKyAgICBmb3IgKHRzID0gMDsgdHMgPCBzbG90czsgdHMrKykgeworICAgICAgLyogY29weSBjdXJyZW50IGRhdGEgb2YgcHJvY2Vzc2luZyBjaGFubmVsICovCisgICAgICBGSVhQX0RCTCB0bXBbNjRdOyAgLy8gb25lIHNsb3QKKyAgICAgIC8qIHJlYWwgKi8KKyAgICAgIEZES21lbWNweSh0bXAsIHFkX2NoLT5oUW1mU2xvdHNSZWFsW2djLT5uUW1mT3ZUaW1lU2xvdHMgKyB0c10sCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIGJhbmRzKTsgIC8vIGFuYU1hdHJpeF90b190bXAKKyAgICAgIEZES21lbWNweShxZF9jaC0+aFFtZlNsb3RzUmVhbFtnYy0+blFtZk92VGltZVNsb3RzICsgdHNdLCBwcFFtZlJlYWxbdHNdLAorICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBiYW5kcyk7ICAvLyBIQkVfdG9fYW5hTWF0cml4CisgICAgICBGREttZW1jcHkocHBRbWZSZWFsW3RzXSwgdG1wLCBzaXplb2YoRklYUF9EQkwpICogYmFuZHMpOyAgLy8gdG1wX3RvX0hCRQorICAgICAgLyogaW1hZyAqLworICAgICAgRkRLbWVtY3B5KHRtcCwgcWRfY2gtPmhRbWZTbG90c0ltYWdbZ2MtPm5RbWZPdlRpbWVTbG90cyArIHRzXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogYmFuZHMpOworICAgICAgRkRLbWVtY3B5KHFkX2NoLT5oUW1mU2xvdHNJbWFnW2djLT5uUW1mT3ZUaW1lU2xvdHMgKyB0c10sIHBwUW1mSW1hZ1t0c10sCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIGJhbmRzKTsKKyAgICAgIEZES21lbWNweShwcFFtZkltYWdbdHNdLCB0bXAsIHNpemVvZihGSVhQX0RCTCkgKiBiYW5kcyk7CisgICAgfQorICB9IGVsc2UgeyAgLy8gcmlnaHQgY2hhbm5lbCAocGFya0J1ZikKKyAgICBjb25zdCBpbnQgYmFuZHMgPSBxZF9jaC0+d29ya0J1Zl9uQmFuZHM7CisgICAgY29uc3QgaW50IHNsb3RzID0gcWRfY2gtPndvcmtCdWZfblRpbWVTbG90czsKKyAgICBpbnQgdHM7CisgICAgRkRLX0FTU0VSVChxZF9jaC0+d29ya0J1Zl9uQmFuZHMgPT0gZ2MtPm5CYW5kc0FuYWx5c2lzKTsKKyAgICBmb3IgKHRzID0gMDsgdHMgPCBzbG90czsgdHMrKykgeworICAgICAgLyogY29weSBIQkUgUU1GIGRhdGEgYnVmZmVyIHRvIHByb2Nlc3NpbmcgY2hhbm5lbCAqLworICAgICAgRkRLbWVtY3B5KHFkX2NoLT5oUW1mU2xvdHNSZWFsW2djLT5uUW1mT3ZUaW1lU2xvdHMgKyB0c10sIHBwUW1mUmVhbFt0c10sCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIGJhbmRzKTsgIC8vIEhCRV90b19hbmFNYXRyaXgKKyAgICAgIEZES21lbWNweShxZF9jaC0+aFFtZlNsb3RzSW1hZ1tnYy0+blFtZk92VGltZVNsb3RzICsgdHNdLCBwcFFtZkltYWdbdHNdLAorICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBiYW5kcyk7CisgICAgICAvKiBjb3B5IHBhcmtlZCBuZXcgUU1GIGRhdGEgdG8gSEJFIFFNRiBkYXRhIGJ1ZmZlciAqLworICAgICAgRkRLbWVtY3B5KHBwUW1mUmVhbFt0c10sCisgICAgICAgICAgICAgICAgRkRLX2dldFdvcmtCdWZmZXIocFdvcmtCdWYsIHdvcmtCdWZmZXJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya0J1ZmZlclNlY3RTaXplLCBiYW5kcyksCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIGJhbmRzKTsgIC8vIHBhcmtCdWZfdG9fSEJFCisgICAgICB3b3JrQnVmZmVyT2Zmc2V0ICs9IGJhbmRzOworICAgICAgRkRLbWVtY3B5KHBwUW1mSW1hZ1t0c10sCisgICAgICAgICAgICAgICAgRkRLX2dldFdvcmtCdWZmZXIocFdvcmtCdWYsIHdvcmtCdWZmZXJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya0J1ZmZlclNlY3RTaXplLCBiYW5kcyksCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIGJhbmRzKTsKKyAgICAgIHdvcmtCdWZmZXJPZmZzZXQgKz0gYmFuZHM7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRkRLX1FtZkRvbWFpbl9DbGVhclJlcXVlc3RlZChIQU5ETEVfRkRLX1FNRl9ET01BSU5fR0MgaGdjKSB7CisgIGhnYy0+cW1mRG9tYWluRXhwbGljaXRDb25maWcgPSAwOworICBoZ2MtPmZsYWdzX3JlcXVlc3RlZCA9IDA7CisgIGhnYy0+bklucHV0Q2hhbm5lbHNfcmVxdWVzdGVkID0gMDsKKyAgaGdjLT5uT3V0cHV0Q2hhbm5lbHNfcmVxdWVzdGVkID0gMDsKKyAgaGdjLT5uQmFuZHNBbmFseXNpc19yZXF1ZXN0ZWQgPSAwOworICBoZ2MtPm5CYW5kc1N5bnRoZXNpc19yZXF1ZXN0ZWQgPSAwOworICBoZ2MtPm5RbWZUaW1lU2xvdHNfcmVxdWVzdGVkID0gMDsKKyAgaGdjLT5uUW1mT3ZUaW1lU2xvdHNfcmVxdWVzdGVkID0gMDsKKyAgaGdjLT5uUW1mUHJvY0JhbmRzX3JlcXVlc3RlZCA9IDA7CisgIGhnYy0+blFtZlByb2NDaGFubmVsc19yZXF1ZXN0ZWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBGREtfUW1mRG9tYWluX0NsZWFyQ29uZmlndXJlZChIQU5ETEVfRkRLX1FNRl9ET01BSU5fR0MgaGdjKSB7CisgIGhnYy0+ZmxhZ3MgPSAwOworICBoZ2MtPm5JbnB1dENoYW5uZWxzID0gMDsKKyAgaGdjLT5uT3V0cHV0Q2hhbm5lbHMgPSAwOworICBoZ2MtPm5CYW5kc0FuYWx5c2lzID0gMDsKKyAgaGdjLT5uQmFuZHNTeW50aGVzaXMgPSAwOworICBoZ2MtPm5RbWZUaW1lU2xvdHMgPSAwOworICBoZ2MtPm5RbWZPdlRpbWVTbG90cyA9IDA7CisgIGhnYy0+blFtZlByb2NCYW5kcyA9IDA7CisgIGhnYy0+blFtZlByb2NDaGFubmVscyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIEZES19RbWZEb21haW5fQ2xlYXJGaWx0ZXJCYW5rKEhBTkRMRV9GREtfUU1GX0RPTUFJTiBocWQpIHsKKyAgaW50IGNoOworCisgIGZvciAoY2ggPSAwOyBjaCA8ICgoOCkgKyAoMSkpOyBjaCsrKSB7CisgICAgRkRLbWVtY2xlYXIoJmhxZC0+UW1mRG9tYWluSW5bY2hdLmZiLCBzaXplb2YoaHFkLT5RbWZEb21haW5JbltjaF0uZmIpKTsKKyAgfQorCisgIGZvciAoY2ggPSAwOyBjaCA8ICgoOCkgKyAoMSkpOyBjaCsrKSB7CisgICAgRkRLbWVtY2xlYXIoJmhxZC0+UW1mRG9tYWluT3V0W2NoXS5mYiwgc2l6ZW9mKGhxZC0+UW1mRG9tYWluSW5bY2hdLmZiKSk7CisgIH0KK30KKworUU1GX0RPTUFJTl9FUlJPUiBGREtfUW1mRG9tYWluX0NvbmZpZ3VyZShIQU5ETEVfRkRLX1FNRl9ET01BSU4gaHFkKSB7CisgIEZES19BU1NFUlQoaHFkICE9IE5VTEwpOworICBRTUZfRE9NQUlOX0VSUk9SIGVyciA9IFFNRl9ET01BSU5fT0s7CisgIGludCBpLCBzaXplX21haW4sIHNpemUsIHNpemVfdGVtcCA9IDA7CisKKyAgSEFORExFX0ZES19RTUZfRE9NQUlOX0dDIGhnYyA9ICZocWQtPmdsb2JhbENvbmY7CisgIEZJWFBfREJMICoqcFdvcmtCdWZmZXIgPSBoZ2MtPnBXb3JrQnVmZmVyOworCisgIGludCBoYXNDaGFuZ2VkID0gMDsKKworICBpZiAoKGhnYy0+blFtZlByb2NDaGFubmVsc19yZXF1ZXN0ZWQgPiAwKSAmJgorICAgICAgKGhnYy0+blFtZlByb2NCYW5kc19yZXF1ZXN0ZWQgIT0gNjQpKSB7CisgICAgcmV0dXJuIFFNRl9ET01BSU5fSU5JVF9FUlJPUjsKKyAgfQorICBpZiAoaGdjLT5uQmFuZHNBbmFseXNpc19yZXF1ZXN0ZWQgPiBoZ2MtPm5RbWZQcm9jQmFuZHNfcmVxdWVzdGVkKSB7CisgICAgLyogSW4gZ2VuZXJhbCB0aGUgb3V0cHV0IG9mIHRoZSBxbWYgYW5hbHlzaXMgaXMgd3JpdHRlbiB0byBRTUYgbWVtb3J5IHNsb3RzCisgICAgICAgd2hpY2ggc2l6ZSBpcyBkZWZpbmVkIGJ5IG5RbWZQcm9jQmFuZHMuIG5CYW5kc1N5bnRoZXNpcyBtYXkgYmUgbGFyZ2VyCisgICAgICAgdGhhbiBuUW1mUHJvY0JhbmRzLiBUaGlzIGlzIGUuZy4gdGhlIGNhc2UgaWYgdGhlIFFNRiBiYXNlZCByZXNhbXBsZXIgaXMKKyAgICAgICB1c2VkLgorICAgICovCisgICAgcmV0dXJuIFFNRl9ET01BSU5fSU5JVF9FUlJPUjsKKyAgfQorCisgIC8qIDEuIGFkanVzdCBjaGFuZ2Ugb2YgcHJvY2Vzc2luZyBjaGFubmVscyBieSBjb21wYXJpc29uIG9mIGN1cnJlbnQgYW5kCisgICAqIHJlcXVlc3RlZCBwYXJhbWV0ZXJzICovCisgIGlmICgoaGdjLT5uUW1mUHJvY0NoYW5uZWxzICE9IGhnYy0+blFtZlByb2NDaGFubmVsc19yZXF1ZXN0ZWQpIHx8CisgICAgICAoaGdjLT5uUW1mUHJvY0JhbmRzICE9IGhnYy0+blFtZlByb2NCYW5kc19yZXF1ZXN0ZWQpIHx8CisgICAgICAoaGdjLT5uUW1mVGltZVNsb3RzICE9IGhnYy0+blFtZlRpbWVTbG90c19yZXF1ZXN0ZWQpKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhnYy0+blFtZlByb2NDaGFubmVsc19yZXF1ZXN0ZWQ7IGkrKykgeworICAgICAgaHFkLT5RbWZEb21haW5JbltpXS53b3JrQnVmX25CYW5kcyA9IGhnYy0+blFtZlByb2NCYW5kc19yZXF1ZXN0ZWQ7CisgICAgICBoZ2MtPm5RbWZQcm9jQmFuZHMgPSBoZ2MtPm5RbWZQcm9jQmFuZHNfcmVxdWVzdGVkOworCisgICAgICBocWQtPlFtZkRvbWFpbkluW2ldLndvcmtCdWZfblRpbWVTbG90cyA9IGhnYy0+blFtZlRpbWVTbG90c19yZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgaGdjLT5uUW1mUHJvY0NoYW5uZWxzID0KKyAgICAgICAgaGdjLT5uUW1mUHJvY0NoYW5uZWxzX3JlcXVlc3RlZDsgLyoga2VlcCBoaWdoZXN0IHZhbHVlIGVuY291bnRlcmVkIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhciBhcyBhbGxvY2F0ZWQgKi8KKworICAgIGhhc0NoYW5nZWQgPSAxOworICB9CisKKyAgLyogMi4gcmVhbGxvY2F0ZSBwZXJzaXN0ZW50IG1lbW9yeSBpZiBuZWNlc3NhcnkgKGFuYWx5c2lzIHN0YXRlLWJ1ZmZlcnMsCisgICAqIHRpbWVzbG90LXBvaW50ZXItYXJyYXksIG92ZXJsYXAtYnVmZmVycywgc3ludGhlc2lzIHN0YXRlLWJ1ZmZlcnMpICovCisgIGlmICgoaGdjLT5uSW5wdXRDaGFubmVscyAhPSBoZ2MtPm5JbnB1dENoYW5uZWxzX3JlcXVlc3RlZCkgfHwKKyAgICAgIChoZ2MtPm5CYW5kc0FuYWx5c2lzICE9IGhnYy0+bkJhbmRzQW5hbHlzaXNfcmVxdWVzdGVkKSB8fAorICAgICAgKGhnYy0+blFtZlRpbWVTbG90cyAhPSBoZ2MtPm5RbWZUaW1lU2xvdHNfcmVxdWVzdGVkKSB8fAorICAgICAgKGhnYy0+blFtZk92VGltZVNsb3RzICE9IGhnYy0+blFtZk92VGltZVNsb3RzX3JlcXVlc3RlZCkgfHwKKyAgICAgIChoZ2MtPm5PdXRwdXRDaGFubmVscyAhPSBoZ2MtPm5PdXRwdXRDaGFubmVsc19yZXF1ZXN0ZWQpIHx8CisgICAgICAoaGdjLT5uQmFuZHNTeW50aGVzaXMgIT0gaGdjLT5uQmFuZHNTeW50aGVzaXNfcmVxdWVzdGVkKSB8fAorICAgICAgKGhnYy0+cGFya0NoYW5uZWwgIT0gaGdjLT5wYXJrQ2hhbm5lbF9yZXF1ZXN0ZWQpKSB7CisgICAgaGdjLT5uSW5wdXRDaGFubmVscyA9IGhnYy0+bklucHV0Q2hhbm5lbHNfcmVxdWVzdGVkOworICAgIGhnYy0+bkJhbmRzQW5hbHlzaXMgPSBoZ2MtPm5CYW5kc0FuYWx5c2lzX3JlcXVlc3RlZDsKKyAgICBoZ2MtPm5RbWZUaW1lU2xvdHMgPSBoZ2MtPm5RbWZUaW1lU2xvdHNfcmVxdWVzdGVkOworICAgIGhnYy0+blFtZk92VGltZVNsb3RzID0gaGdjLT5uUW1mT3ZUaW1lU2xvdHNfcmVxdWVzdGVkOworICAgIGhnYy0+bk91dHB1dENoYW5uZWxzID0gaGdjLT5uT3V0cHV0Q2hhbm5lbHNfcmVxdWVzdGVkOworICAgIGhnYy0+bkJhbmRzU3ludGhlc2lzID0gaGdjLT5uQmFuZHNTeW50aGVzaXNfcmVxdWVzdGVkOworICAgIGhnYy0+cGFya0NoYW5uZWwgPSBoZ2MtPnBhcmtDaGFubmVsX3JlcXVlc3RlZDsKKworICAgIGlmIChGREtfUW1mRG9tYWluX0FsbG9jYXRlUGVyc2lzdGVudE1lbW9yeShocWQpKSB7CisgICAgICBlcnIgPSBRTUZfRE9NQUlOX09VVF9PRl9NRU1PUlk7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogMy4gc2V0IHJlcXVlc3QtZmxhZyBmb3IgZG93bnNhbXBsZWQgU0JSICovCisgICAgaWYgKChoZ2MtPm5CYW5kc0FuYWx5c2lzID09IDMyKSAmJiAoaGdjLT5uQmFuZHNTeW50aGVzaXMgPT0gMzIpICYmCisgICAgICAgICEoaGdjLT5mbGFncyAmIChRTUZfRkxBR19DTERGQiB8IFFNRl9GTEFHX01QU0xERkIpKSkgeworICAgICAgaGdjLT5mbGFnc19yZXF1ZXN0ZWQgfD0gUU1GX0ZMQUdfRE9XTlNBTVBMRUQ7CisgICAgfQorICAgIGlmICgoaGdjLT5mbGFnc19yZXF1ZXN0ZWQgJiBRTUZfRkxBR19NUFNMREZCKSAmJgorICAgICAgICAoaGdjLT5mbGFnc19yZXF1ZXN0ZWQgJiBRTUZfRkxBR19DTERGQikpIHsKKyAgICAgIGhnYy0+ZmxhZ3NfcmVxdWVzdGVkICY9IH5RTUZfRkxBR19DTERGQjsKKyAgICB9CisKKyAgICBoYXNDaGFuZ2VkID0gMTsKKyAgfQorCisgIC8qIDQuIGluaXRpYWxpemUgdGFibGVzIGFuZCBidWZmZXIgZm9yIFFNRi1yZXNhbXBsZXIgKi8KKworICAvKiA1LiBzZXQgcmVxdWVzdGVkIGZsYWdzICovCisgIGlmIChoZ2MtPmZsYWdzICE9IGhnYy0+ZmxhZ3NfcmVxdWVzdGVkKSB7CisgICAgaGdjLT5mbGFncyA9IGhnYy0+ZmxhZ3NfcmVxdWVzdGVkOworICAgIGhhc0NoYW5nZWQgPSAxOworICB9CisKKyAgaWYgKGhhc0NoYW5nZWQpIHsKKyAgICAvKiA2LiByZWNhbGN1bGF0ZSBhbmQgY2hlY2sgc2l6ZSBvZiByZXF1aXJlZCB3b3JrYnVmZmVyLXNwYWNlICovCisKKyAgICBpZiAoaGdjLT5wYXJrQ2hhbm5lbCAmJiAoaHFkLT5nbG9iYWxDb25mLm5RbWZQcm9jQ2hhbm5lbHMgPT0gMSkpIHsKKyAgICAgIC8qIGNvbmZpZ3VyZSB0ZW1wIFFNRiBidWZmZXIgZm9yIHBhcmtpbmcgcmlnaHQgY2hhbm5lbCBNUFMyMTIgb3V0cHV0LAorICAgICAgICogKFVTQUMgc3RlcmVvQ29uZmlnSW5kZXggMyBvbmx5KSAqLworICAgICAgaHFkLT5RbWZEb21haW5JblsxXS53b3JrQnVmX25CYW5kcyA9IGhxZC0+Z2xvYmFsQ29uZi5uQmFuZHNBbmFseXNpczsKKyAgICAgIGhxZC0+UW1mRG9tYWluSW5bMV0ud29ya0J1Zl9uVGltZVNsb3RzID0gaHFkLT5nbG9iYWxDb25mLm5RbWZUaW1lU2xvdHM7CisgICAgICBzaXplX3RlbXAgPSBocWQtPlFtZkRvbWFpbkluWzFdLndvcmtCdWZfbkJhbmRzICoKKyAgICAgICAgICAgICAgICAgIGhxZC0+UW1mRG9tYWluSW5bMV0ud29ya0J1Zl9uVGltZVNsb3RzICogQ01QTFhfTU9EOworICAgIH0KKworICAgIHNpemVfbWFpbiA9IGhxZC0+UW1mRG9tYWluSW5bMF0ud29ya0J1Zl9uQmFuZHMgKgorICAgICAgICAgICAgICAgIGhxZC0+UW1mRG9tYWluSW5bMF0ud29ya0J1Zl9uVGltZVNsb3RzICogQ01QTFhfTU9EOworCisgICAgc2l6ZSA9IHNpemVfbWFpbiAqIGhnYy0+blFtZlByb2NDaGFubmVscyArIHNpemVfdGVtcDsKKworICAgIGlmIChzaXplID4gKFFNRl9NQVhfV0JfU0VDVElPTlMgKiBRTUZfV0JfU0VDVElPTl9TSVpFKSkgeworICAgICAgZXJyID0gUU1GX0RPTUFJTl9PVVRfT0ZfTUVNT1JZOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIDcuIGFsbG9jYXRlIGFkZGl0aW9uYWwgd29ya2J1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoKHNpemUgPiAwIC8qICpRTUZfV0JfU0VDVElPTl9TSVpFICovKSAmJiAocFdvcmtCdWZmZXJbMF0gPT0gTlVMTCkpIHsKKyAgICAgIC8qIGdldCB3b3JrIGJ1ZmZlciBvZiBzaXplIFFNRl9XQl9TRUNUSU9OX1NJWkUgKi8KKyAgICAgIHBXb3JrQnVmZmVyWzBdID0gR2V0UW1mV29ya0J1ZmZlckNvcmU2KCk7CisgICAgfQorCisgICAgaWYgKChzaXplID4gMSAqIFFNRl9XQl9TRUNUSU9OX1NJWkUpICYmIChwV29ya0J1ZmZlclsxXSA9PSBOVUxMKSkgeworICAgICAgLyogZ2V0IHdvcmsgYnVmZmVyIG9mIHNpemUgUU1GX1dCX1NFQ1RJT05fU0laRSAqLworICAgICAgcFdvcmtCdWZmZXJbMV0gPSBHZXRRbWZXb3JrQnVmZmVyQ29yZTEoKTsKKyAgICB9CisKKyAgICBpZiAoKHNpemUgPiAyICogUU1GX1dCX1NFQ1RJT05fU0laRSkgJiYgKHBXb3JrQnVmZmVyWzJdID09IE5VTEwpKSB7CisgICAgICAvKiBnZXQgd29yayBidWZmZXIgb2Ygc2l6ZSBRTUZfV0JfU0VDVElPTl9TSVpFICovCisgICAgICBwV29ya0J1ZmZlclsyXSA9IEdldFFtZldvcmtCdWZmZXJDb3JlMygpOworICAgIH0KKworICAgIGlmICgoc2l6ZSA+IDMgKiBRTUZfV0JfU0VDVElPTl9TSVpFKSAmJiAocFdvcmtCdWZmZXJbM10gPT0gTlVMTCkpIHsKKyAgICAgIC8qIGdldCB3b3JrIGJ1ZmZlciBvZiBzaXplIFFNRl9XQl9TRUNUSU9OX1NJWkUgKi8KKyAgICAgIHBXb3JrQnVmZmVyWzNdID0gR2V0UW1mV29ya0J1ZmZlckNvcmU0KCk7CisgICAgfQorCisgICAgaWYgKChzaXplID4gNCAqIFFNRl9XQl9TRUNUSU9OX1NJWkUpICYmIChwV29ya0J1ZmZlcls0XSA9PSBOVUxMKSkgeworICAgICAgLyogZ2V0IHdvcmsgYnVmZmVyIG9mIHNpemUgUU1GX1dCX1NFQ1RJT05fU0laRSAqLworICAgICAgcFdvcmtCdWZmZXJbNF0gPSBHZXRRbWZXb3JrQnVmZmVyQ29yZTUoKTsKKyAgICB9CisKKyAgICAvKiA4LiBkaXN0cmlidXRlIHdvcmtidWZmZXIgb3ZlciBwcm9jZXNzaW5nIGNoYW5uZWxzICovCisgICAgZm9yIChpID0gMDsgaSA8IGhnYy0+blFtZlByb2NDaGFubmVsczsgaSsrKSB7CisgICAgICBGREtfUW1mRG9tYWluX0ZlZWRXb3JrQnVmZmVyKGhxZCwgaSwgcFdvcmtCdWZmZXIsIHNpemVfbWFpbiAqIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFNRl9XQl9TRUNUSU9OX1NJWkUsIHNpemVfbWFpbik7CisgICAgfQorICAgIGlmIChoZ2MtPnBhcmtDaGFubmVsKSB7CisgICAgICBmb3IgKDsgaSA8IGhnYy0+bklucHV0Q2hhbm5lbHM7IGkrKykgeworICAgICAgICBGREtfUW1mRG9tYWluX0ZlZWRXb3JrQnVmZmVyKGhxZCwgMSwgcFdvcmtCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9tYWluICogaGdjLT5uUW1mUHJvY0NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFNRl9XQl9TRUNUSU9OX1NJWkUsIHNpemVfdGVtcCk7CisgICAgICB9CisgICAgfQorCisgICAgLyogOS4gKHJlLSlpbml0IGZpbHRlcmJhbmsgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaGdjLT5uT3V0cHV0Q2hhbm5lbHM7IGkrKykgeworICAgICAgaWYgKChocWQtPlFtZkRvbWFpbk91dFtpXS5mYi5sc2IgPT0gMCkgJiYKKyAgICAgICAgICAoaHFkLT5RbWZEb21haW5PdXRbaV0uZmIudXNiID09IDApKSB7CisgICAgICAgIC8qIEFsdGhvdWdoIGxzYiBhbmQgdXNiIGFyZSBzZXQgaW4gdGhlIFNCUiBtb2R1bGUsIHRoZXkgYXJlIGluaXRpYWxpemVkCisgICAgICAgICAqIGF0IHRoaXMgcG9pbnQgZHVlIHRvIHRoZSBjYXNlIG9mIHVzaW5nIE1QUyB3aXRob3V0IFNCUi4gKi8KKyAgICAgICAgaHFkLT5RbWZEb21haW5PdXRbaV0uZmIubHNiID0gaGdjLT5uQmFuZHNBbmFseXNpc19yZXF1ZXN0ZWQ7CisgICAgICAgIGhxZC0+UW1mRG9tYWluT3V0W2ldLmZiLnVzYiA9CisgICAgICAgICAgICBmTWluKChJTlQpaGdjLT5uQmFuZHNTeW50aGVzaXNfcmVxdWVzdGVkLCA2NCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChGREtfUW1mRG9tYWluX0luaXRGaWx0ZXJCYW5rKGhxZCwgMCkpIHsKKyAgICAgIGVyciA9IFFNRl9ET01BSU5fSU5JVF9FUlJPUjsKKyAgICB9CisgIH0KKworYmFpbDoKKyAgaWYgKGVyciA9PSBRTUZfRE9NQUlOX09VVF9PRl9NRU1PUlkpIHsKKyAgICBGREtfUW1mRG9tYWluX0ZyZWVQZXJzaXN0ZW50TWVtb3J5KGhxZCk7CisgICAgRkRLX1FtZkRvbWFpbl9DbGVhckNvbmZpZ3VyZWQoJmhxZC0+Z2xvYmFsQ29uZik7CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgRkRLX1FtZkRvbWFpbl9GcmVlV29ya0J1ZmZlcihIQU5ETEVfRkRLX1FNRl9ET01BSU4gaHFkKSB7CisgIEZJWFBfREJMICoqcFdvcmtCdWZmZXIgPSBocWQtPmdsb2JhbENvbmYucFdvcmtCdWZmZXI7CisKKyAgaWYgKHBXb3JrQnVmZmVyWzBdKSBGcmVlUW1mV29ya0J1ZmZlckNvcmU2KCZwV29ya0J1ZmZlclswXSk7CisgIGlmIChwV29ya0J1ZmZlclsxXSkgRnJlZVFtZldvcmtCdWZmZXJDb3JlMSgmcFdvcmtCdWZmZXJbMV0pOworICBpZiAocFdvcmtCdWZmZXJbMl0pIEZyZWVRbWZXb3JrQnVmZmVyQ29yZTMoJnBXb3JrQnVmZmVyWzJdKTsKKyAgaWYgKHBXb3JrQnVmZmVyWzNdKSBGcmVlUW1mV29ya0J1ZmZlckNvcmU0KCZwV29ya0J1ZmZlclszXSk7CisgIGlmIChwV29ya0J1ZmZlcls0XSkgRnJlZVFtZldvcmtCdWZmZXJDb3JlNSgmcFdvcmtCdWZmZXJbNF0pOworfQorCit2b2lkIEZES19RbWZEb21haW5fRnJlZU1lbShIQU5ETEVfRkRLX1FNRl9ET01BSU4gaHFkKSB7CisgIEZES19RbWZEb21haW5fRnJlZVdvcmtCdWZmZXIoaHFkKTsKKworICBGREtfUW1mRG9tYWluX0ZyZWVQZXJzaXN0ZW50TWVtb3J5KGhxZCk7CisKKyAgRkRLX1FtZkRvbWFpbl9DbGVhckZpbHRlckJhbmsoaHFkKTsKKworICBGREtfUW1mRG9tYWluX0NsZWFyQ29uZmlndXJlZCgmaHFkLT5nbG9iYWxDb25mKTsKKworICBGREtfUW1mRG9tYWluX0NsZWFyUmVxdWVzdGVkKCZocWQtPmdsb2JhbENvbmYpOworfQorCit2b2lkIEZES19RbWZEb21haW5fQ2xvc2UoSEFORExFX0ZES19RTUZfRE9NQUlOIGhxZCkgeworICBGREtfUW1mRG9tYWluX0ZyZWVXb3JrQnVmZmVyKGhxZCk7CisKKyAgRkRLX1FtZkRvbWFpbl9GcmVlUGVyc2lzdGVudE1lbW9yeShocWQpOworfQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9GREtfdG9vbHNfcm9tLmNwcCBiL2xpYkZESy9zcmMvRkRLX3Rvb2xzX3JvbS5jcHAKaW5kZXggZjkxMjFkMS4uMDA5NTg3OCAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9GREtfdG9vbHNfcm9tLmNwcAorKysgYi9saWJGREsvc3JjL0ZES190b29sc19yb20uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDExNDkgKzkwLDM5OTQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgT2xpdmVyIE1vc2VyCisKICAgIERlc2NyaXB0aW9uOiBST00gdGFibGVzIHVzZWQgYnkgRkRLIHRvb2xzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCiAKLQotCi0KLQotCi0KLQotCi0KLQogUkFNX0FMSUdOCiBMTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTQ4MFtdID0KLXsKLSAgU1RDUCgweDdmZmZmZmZmLCAweDAwMDAwMDAwKSwgU1RDUCgweDdmZmZkMzE1LCAweDAwNmIzYjliKSwgU1RDUCgweDdmZmY0YzU0LCAweDAwZDY3NmViKSwgU1RDUCgweDdmZmU2YmJmLCAweDAxNDFiMWE1KSwKLSAgU1RDUCgweDdmZmQzMTU0LCAweDAxYWNlYjdjKSwgU1RDUCgweDdmZmI5ZDE1LCAweDAyMTgyNDI3KSwgU1RDUCgweDdmZjlhZjA0LCAweDAyODM1YjVhKSwgU1RDUCgweDdmZjc2NzIxLCAweDAyZWU5MGM4KSwKLSAgU1RDUCgweDdmZjRjNTZmLCAweDAzNTljNDI4KSwgU1RDUCgweDdmZjFjOWVmLCAweDAzYzRmNTJmKSwgU1RDUCgweDdmZWU3NGEyLCAweDA0MzAyMzhmKSwgU1RDUCgweDdmZWFjNThkLCAweDA0OWI0ZjAwKSwKLSAgU1RDUCgweDdmZTZiY2IwLCAweDA1MDY3NzM0KSwgU1RDUCgweDdmZTI1YTBmLCAweDA1NzE5YmUyKSwgU1RDUCgweDdmZGQ5ZGFkLCAweDA1ZGNiY2JlKSwgU1RDUCgweDdmZDg4NzhlLCAweDA2NDdkOTdjKSwKLSAgU1RDUCgweDdmZDMxN2I0LCAweDA2YjJmMWQyKSwgU1RDUCgweDdmY2Q0ZTI0LCAweDA3MWUwNTc1KSwgU1RDUCgweDdmYzcyYWUyLCAweDA3ODkxNDE4KSwgU1RDUCgweDdmYzBhZGYyLCAweDA3ZjQxZDcyKSwKLSAgU1RDUCgweDdmYjlkNzU5LCAweDA4NWYyMTM3KSwgU1RDUCgweDdmYjJhNzFiLCAweDA4Y2ExZjFiKSwgU1RDUCgweDdmYWIxZDNkLCAweDA5MzUxNmQ0KSwgU1RDUCgweDdmYTMzOWM1LCAweDA5YTAwODE3KSwKLSAgU1RDUCgweDdmOWFmY2I5LCAweDBhMGFmMjk5KSwgU1RDUCgweDdmOTI2NjFkLCAweDBhNzVkNjBlKSwgU1RDUCgweDdmODk3NWY5LCAweDBhZTBiMjJjKSwgU1RDUCgweDdmODAyYzUyLCAweDBiNGI4NmE4KSwKLSAgU1RDUCgweDdmNzY4OTJmLCAweDBiYjY1MzM2KSwgU1RDUCgweDdmNmM4Yzk2LCAweDBjMjExNzhjKSwgU1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwgU1RDUCgweDdmNTc4NzIxLCAweDBjZjY4NjYyKSwKLSAgU1RDUCgweDdmNGM3ZTU0LCAweDBkNjEzMDRlKSwgU1RDUCgweDdmNDExYzJmLCAweDBkY2JkMGQ1KSwgU1RDUCgweDdmMzU2MGI5LCAweDBlMzY2N2FkKSwgU1RDUCgweDdmMjk0YmZkLCAweDBlYTBmNDhjKSwKLSAgU1RDUCgweDdmMWNkZTAxLCAweDBmMGI3NzI3KSwgU1RDUCgweDdmMTAxNmNlLCAweDBmNzVlZjMzKSwgU1RDUCgweDdmMDJmNjZmLCAweDBmZTA1YzY0KSwgU1RDUCgweDdlZjU3Y2VhLCAweDEwNGFiZTcxKSwKLSAgU1RDUCgweDdlZTdhYTRjLCAweDEwYjUxNTBmKSwgU1RDUCgweDdlZDk3ZTljLCAweDExMWY1ZmY0KSwgU1RDUCgweDdlY2FmOWU1LCAweDExODk5ZWQzKSwgU1RDUCgweDdlYmMxYzMxLCAweDExZjNkMTY0KSwKLSAgU1RDUCgweDdlYWNlNThhLCAweDEyNWRmNzViKSwgU1RDUCgweDdlOWQ1NWZjLCAweDEyYzgxMDZmKSwgU1RDUCgweDdlOGQ2ZDkxLCAweDEzMzIxYzUzKSwgU1RDUCgweDdlN2QyYzU0LCAweDEzOWMxYWJmKSwKLSAgU1RDUCgweDdlNmM5MjUxLCAweDE0MDYwYjY4KSwgU1RDUCgweDdlNWI5ZjkzLCAweDE0NmZlZTAzKSwgU1RDUCgweDdlNGE1NDI2LCAweDE0ZDljMjQ1KSwgU1RDUCgweDdlMzhiMDE3LCAweDE1NDM4N2U2KSwKLSAgU1RDUCgweDdlMjZiMzcxLCAweDE1YWQzZTlhKSwgU1RDUCgweDdlMTQ1ZTQyLCAweDE2MTZlNjE4KSwgU1RDUCgweDdlMDFiMDk2LCAweDE2ODA3ZTE1KSwgU1RDUCgweDdkZWVhYTdhLCAweDE2ZWEwNjQ2KSwKLSAgU1RDUCgweDdkZGI0YmZjLCAweDE3NTM3ZTYzKSwgU1RDUCgweDdkYzc5NTI5LCAweDE3YmNlNjIxKSwgU1RDUCgweDdkYjM4NjBmLCAweDE4MjYzZDM2KSwgU1RDUCgweDdkOWYxZWJkLCAweDE4OGY4MzU3KSwKLSAgU1RDUCgweDdkOGE1ZjQwLCAweDE4ZjhiODNjKSwgU1RDUCgweDdkNzU0N2E3LCAweDE5NjFkYjliKSwgU1RDUCgweDdkNWZkODAxLCAweDE5Y2FlZDI5KSwgU1RDUCgweDdkNGExMDVkLCAweDFhMzNlYzljKSwKLSAgU1RDUCgweDdkMzNmMGNhLCAweDFhOWNkOWFjKSwgU1RDUCgweDdkMWQ3OTU4LCAweDFiMDViNDBmKSwgU1RDUCgweDdkMDZhYTE2LCAweDFiNmU3YjdhKSwgU1RDUCgweDdjZWY4MzE1LCAweDFiZDcyZmE0KSwKLSAgU1RDUCgweDdjZDgwNDY0LCAweDFjM2ZkMDQ1KSwgU1RDUCgweDdjYzAyZTE1LCAweDFjYTg1ZDEyKSwgU1RDUCgweDdjYTgwMDM4LCAweDFkMTBkNWMyKSwgU1RDUCgweDdjOGY3YWRlLCAweDFkNzkzYTBiKSwKLSAgU1RDUCgweDdjNzY5ZTE4LCAweDFkZTE4OWE2KSwgU1RDUCgweDdjNWQ2OWY3LCAweDFlNDljNDQ3KSwgU1RDUCgweDdjNDNkZThlLCAweDFlYjFlOWE3KSwgU1RDUCgweDdjMjlmYmVlLCAweDFmMTlmOTdiKSwKLSAgU1RDUCgweDdjMGZjMjJhLCAweDFmODFmMzdjKSwgU1RDUCgweDdiZjUzMTUzLCAweDFmZTlkNzVmKSwgU1RDUCgweDdiZGE0OTdkLCAweDIwNTFhNGRkKSwgU1RDUCgweDdiYmYwYWJhLCAweDIwYjk1YmFjKSwKLSAgU1RDUCgweDdiYTM3NTFkLCAweDIxMjBmYjgzKSwgU1RDUCgweDdiODc4OGJhLCAweDIxODg4NDFhKSwgU1RDUCgweDdiNmI0NWE1LCAweDIxZWZmNTI4KSwgU1RDUCgweDdiNGVhYmYxLCAweDIyNTc0ZTY1KSwKLSAgU1RDUCgweDdiMzFiYmIyLCAweDIyYmU4Zjg3KSwgU1RDUCgweDdiMTQ3NGZkLCAweDIzMjViODQ3KSwgU1RDUCgweDdhZjZkN2U2LCAweDIzOGNjODVkKSwgU1RDUCgweDdhZDhlNDgyLCAweDIzZjNiZjdlKSwKLSAgU1RDUCgweDdhYmE5YWU2LCAweDI0NWE5ZDY1KSwgU1RDUCgweDdhOWJmYjI3LCAweDI0YzE2MWM3KSwgU1RDUCgweDdhN2QwNTViLCAweDI1MjgwYzVlKSwgU1RDUCgweDdhNWRiOTk3LCAweDI1OGU5Y2UwKSwKLSAgU1RDUCgweDdhM2UxN2YyLCAweDI1ZjUxMzA3KSwgU1RDUCgweDdhMWUyMDgyLCAweDI2NWI2ZThhKSwgU1RDUCgweDc5ZmRkMzVjLCAweDI2YzFhZjIyKSwgU1RDUCgweDc5ZGQzMDk4LCAweDI3MjdkNDg2KSwKLSAgU1RDUCgweDc5YmMzODRkLCAweDI3OGRkZTZlKSwgU1RDUCgweDc5OWFlYTkyLCAweDI3ZjNjYzk0KSwgU1RDUCgweDc5Nzk0NzdkLCAweDI4NTk5ZWIwKSwgU1RDUCgweDc5NTc0ZjI4LCAweDI4YmY1NDdiKSwKLSAgU1RDUCgweDc5MzUwMWE5LCAweDI5MjRlZGFjKSwgU1RDUCgweDc5MTI1ZjE5LCAweDI5OGE2OWZjKSwgU1RDUCgweDc4ZWY2NzhmLCAweDI5ZWZjOTI1KSwgU1RDUCgweDc4Y2MxYjI2LCAweDJhNTUwYWRmKSwKLSAgU1RDUCgweDc4YTg3OWY0LCAweDJhYmEyZWU0KSwgU1RDUCgweDc4ODQ4NDE0LCAweDJiMWYzNGViKSwgU1RDUCgweDc4NjAzOTllLCAweDJiODQxY2FmKSwgU1RDUCgweDc4M2I5YWFkLCAweDJiZThlNWU4KSwKLSAgU1RDUCgweDc4MTZhNzU5LCAweDJjNGQ5MDUwKSwgU1RDUCgweDc3ZjE1ZmJjLCAweDJjYjIxYmEwKSwgU1RDUCgweDc3Y2JjM2YyLCAweDJkMTY4NzkyKSwgU1RDUCgweDc3YTVkNDEzLCAweDJkN2FkM2RlKSwKLSAgU1RDUCgweDc3N2Y5MDNjLCAweDJkZGYwMDQwKSwgU1RDUCgweDc3NThmODg2LCAweDJlNDMwYzZmKSwgU1RDUCgweDc3MzIwZDBkLCAweDJlYTZmODI3KSwgU1RDUCgweDc3MGFjZGVjLCAweDJmMGFjMzIwKSwKLSAgU1RDUCgweDc2ZTMzYjNmLCAweDJmNmU2ZDE2KSwgU1RDUCgweDc2YmI1NTIxLCAweDJmZDFmNWMxKSwgU1RDUCgweDc2OTMxYmFlLCAweDMwMzU1Y2RkKSwgU1RDUCgweDc2NmE4ZjA0LCAweDMwOThhMjIzKSwKLSAgU1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgU1RDUCgweDc2MTg3Yzc3LCAweDMxNWVjNjE3KSwgU1RDUCgweDc1ZWVmNmNlLCAweDMxYzFhNDNiKSwgU1RDUCgweDc1YzUxZTYxLCAweDMyMjQ1ZjcyKSwKLSAgU1RDUCgweDc1OWFmMzRjLCAweDMyODZmNzc5KSwgU1RDUCgweDc1NzA3NWFjLCAweDMyZTk2YzA5KSwgU1RDUCgweDc1NDVhNWEwLCAweDMzNGJiY2RlKSwgU1RDUCgweDc1MWE4MzQ2LCAweDMzYWRlOWIzKSwKLSAgU1RDUCgweDc0ZWYwZWJjLCAweDM0MGZmMjQyKSwgU1RDUCgweDc0YzM0ODIwLCAweDM0NzFkNjQ3KSwgU1RDUCgweDc0OTcyZjkyLCAweDM0ZDM5NTdlKSwgU1RDUCgweDc0NmFjNTJmLCAweDM1MzUyZmExKSwKLSAgU1RDUCgweDc0M2UwOTE4LCAweDM1OTZhNDZjKSwgU1RDUCgweDc0MTBmYjZiLCAweDM1ZjdmMzljKSwgU1RDUCgweDczZTM5YzQ5LCAweDM2NTkxY2VhKSwgU1RDUCgweDczYjVlYmQxLCAweDM2YmEyMDE0KSwKLSAgU1RDUCgweDczODdlYTIzLCAweDM3MWFmY2Q1KSwgU1RDUCgweDczNTk5NzYwLCAweDM3N2JiMmU5KSwgU1RDUCgweDczMmFmM2E3LCAweDM3ZGM0MjBjKSwgU1RDUCgweDcyZmJmZjFiLCAweDM4M2NhOWZiKSwKLSAgU1RDUCgweDcyY2NiOWRiLCAweDM4OWNlYTcyKSwgU1RDUCgweDcyOWQyNDA5LCAweDM4ZmQwMzJkKSwgU1RDUCgweDcyNmQzZGM2LCAweDM5NWNmM2U5KSwgU1RDUCgweDcyM2QwNzM0LCAweDM5YmNiYzYzKSwKLSAgU1RDUCgweDcyMGM4MDc1LCAweDNhMWM1YzU3KSwgU1RDUCgweDcxZGJhOWFiLCAweDNhN2JkMzgyKSwgU1RDUCgweDcxYWE4MmY3LCAweDNhZGIyMWExKSwgU1RDUCgweDcxNzkwYzdlLCAweDNiM2E0NjcyKSwKLSAgU1RDUCgweDcxNDc0NjYwLCAweDNiOTk0MWIxKSwgU1RDUCgweDcxMTUzMGMyLCAweDNiZjgxMzFjKSwgU1RDUCgweDcwZTJjYmM2LCAweDNjNTZiYTcwKSwgU1RDUCgweDcwYjAxNzkwLCAweDNjYjUzNzZiKSwKLSAgU1RDUCgweDcwN2QxNDQzLCAweDNkMTM4OWNiKSwgU1RDUCgweDcwNDljMjAzLCAweDNkNzFiMTRkKSwgU1RDUCgweDcwMTYyMGY1LCAweDNkY2ZhZGIwKSwgU1RDUCgweDZmZTIzMTNjLCAweDNlMmQ3ZWIxKSwKLSAgU1RDUCgweDZmYWRmMmZjLCAweDNlOGIyNDBlKSwgU1RDUCgweDZmNzk2NjViLCAweDNlZTg5ZDg2KSwgU1RDUCgweDZmNDQ4YjdlLCAweDNmNDVlYWQ4KSwgU1RDUCgweDZmMGY2Mjg5LCAweDNmYTMwYmMxKSwKLSAgU1RDUCgweDZlZDllYmExLCAweDQwMDAwMDAwKSwgU1RDUCgweDZlYTQyNmVkLCAweDQwNWNjNzU0KSwgU1RDUCgweDZlNmUxNDkyLCAweDQwYjk2MTdkKSwgU1RDUCgweDZlMzdiNGI2LCAweDQxMTVjZTM4KSwKLSAgU1RDUCgweDZlMDEwNzgwLCAweDQxNzIwZDQ2KSwgU1RDUCgweDZkY2EwZDE0LCAweDQxY2UxZTY1KSwgU1RDUCgweDZkOTJjNTliLCAweDQyMmEwMTU0KSwgU1RDUCgweDZkNWIzMTNiLCAweDQyODViNWQ0KSwKLSAgU1RDUCgweDZkMjM1MDFiLCAweDQyZTEzYmE0KSwgU1RDUCgweDZjZWIyMjYxLCAweDQzM2M5MjgzKSwgU1RDUCgweDZjYjJhODM3LCAweDQzOTdiYTMyKSwgU1RDUCgweDZjNzllMWMyLCAweDQzZjJiMjcxKSwKLSAgU1RDUCgweDZjNDBjZjJjLCAweDQ0NGQ3YWZmKSwgU1RDUCgweDZjMDc3MDliLCAweDQ0YTgxMzllKSwgU1RDUCgweDZiY2RjNjM5LCAweDQ1MDI3YzBjKSwgU1RDUCgweDZiOTNkMDJlLCAweDQ1NWNiNDBjKSwKLSAgU1RDUCgweDZiNTk4ZWEzLCAweDQ1YjZiYjVlKSwgU1RDUCgweDZiMWYwMWMwLCAweDQ2MTA5MWMyKSwgU1RDUCgweDZhZTQyOWFlLCAweDQ2NmEzNmY5KSwgU1RDUCgweDZhYTkwNjk3LCAweDQ2YzNhYWM1KSwKLSAgU1RDUCgweDZhNmQ5OGE0LCAweDQ3MWNlY2U3KSwgU1RDUCgweDZhMzFlMDAwLCAweDQ3NzVmZDFmKSwgU1RDUCgweDY5ZjVkY2QzLCAweDQ3Y2VkYjMxKSwgU1RDUCgweDY5Yjk4ZjQ4LCAweDQ4Mjc4NmRjKSwKLSAgU1RDUCgweDY5N2NmNzhhLCAweDQ4N2ZmZmU0KSwgU1RDUCgweDY5NDAxNWMzLCAweDQ4ZDg0NjA5KSwgU1RDUCgweDY5MDJlYTFkLCAweDQ5MzA1OTBmKSwgU1RDUCgweDY4YzU3NGM0LCAweDQ5ODgzOGI2KSwKLSAgU1RDUCgweDY4ODdiNWUyLCAweDQ5ZGZlNGMyKSwgU1RDUCgweDY4NDlhZGEzLCAweDRhMzc1Y2Y1KSwgU1RDUCgweDY4MGI1YzMzLCAweDRhOGVhMTExKSwgU1RDUCgweDY3Y2NjMWJlLCAweDRhZTViMGRhKSwKLSAgU1RDUCgweDY3OGRkZTZlLCAweDRiM2M4YzEyKSwgU1RDUCgweDY3NGViMjcxLCAweDRiOTMzMjdjKSwgU1RDUCgweDY3MGYzZGYzLCAweDRiZTlhM2RiKSwgU1RDUCgweDY2Y2Y4MTIwLCAweDRjM2ZkZmY0KSwKLSAgU1RDUCgweDY2OGY3YzI1LCAweDRjOTVlNjg4KSwgU1RDUCgweDY2NGYyZjJlLCAweDRjZWJiNzVjKSwgU1RDUCgweDY2MGU5YTZhLCAweDRkNDE1MjM0KSwgU1RDUCgweDY1Y2RiZTA1LCAweDRkOTZiNmQzKSwKLSAgU1RDUCgweDY1OGM5YTJkLCAweDRkZWJlNGZlKSwgU1RDUCgweDY1NGIyZjEwLCAweDRlNDBkYzc5KSwgU1RDUCgweDY1MDk3Y2RiLCAweDRlOTU5ZDA4KSwgU1RDUCgweDY0Yzc4M2JkLCAweDRlZWEyNjcwKSwKLSAgU1RDUCgweDY0ODU0M2U0LCAweDRmM2U3ODc1KSwgU1RDUCgweDY0NDJiZDdlLCAweDRmOTI5MmRjKSwgU1RDUCgweDYzZmZmMGJhLCAweDRmZTY3NTZhKSwgU1RDUCgweDYzYmNkZGM3LCAweDUwM2ExZmU1KSwKLSAgU1RDUCgweDYzNzk4NGQ0LCAweDUwOGQ5MjExKSwgU1RDUCgweDYzMzVlNjExLCAweDUwZTBjYmI0KSwgU1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwgU1RDUCgweDYyYWRkN2Q2LCAweDUxODY5NDc2KSwKLSAgU1RDUCgweDYyNjk2OGJlLCAweDUxZDkyMzIxKSwgU1RDUCgweDYyMjRiNDk1LCAweDUyMmI3ODU5KSwgU1RDUCgweDYxZGZiYjhhLCAweDUyN2Q5M2U2KSwgU1RDUCgweDYxOWE3ZGNlLCAweDUyY2Y3NThmKSwKLSAgU1RDUCgweDYxNTRmYjkxLCAweDUzMjExZDE4KSwgU1RDUCgweDYxMGYzNTA1LCAweDUzNzI4YTRhKSwgU1RDUCgweDYwYzkyYTVhLCAweDUzYzNiY2VhKSwgU1RDUCgweDYwODJkYmMxLCAweDU0MTRiNGMxKSwKLSAgU1RDUCgweDYwM2M0OTZjLCAweDU0NjU3MTk0KSwgU1RDUCgweDVmZjU3MzhkLCAweDU0YjVmMzJjKSwgU1RDUCgweDVmYWU1YTU1LCAweDU1MDYzOTUxKSwgU1RDUCgweDVmNjZmZGY1LCAweDU1NTY0M2M4KSwKLSAgU1RDUCgweDVmMWY1ZWExLCAweDU1YTYxMjVjKSwgU1RDUCgweDVlZDc3YzhhLCAweDU1ZjVhNGQyKSwgU1RDUCgweDVlOGY1N2UyLCAweDU2NDRmYWY0KSwgU1RDUCgweDVlNDZmMGRkLCAweDU2OTQxNDhiKSwKLSAgU1RDUCgweDVkZmU0N2FkLCAweDU2ZTJmMTVkKSwgU1RDUCgweDVkYjU1Yzg2LCAweDU3MzE5MTM1KSwgU1RDUCgweDVkNmMyZjk5LCAweDU3N2ZmM2RhKSwgU1RDUCgweDVkMjJjMTFjLCAweDU3Y2UxOTE3KSwKLSAgU1RDUCgweDVjZDkxMTQwLCAweDU4MWMwMGIzKSwgU1RDUCgweDVjOGYyMDNiLCAweDU4NjlhYTc5KSwgU1RDUCgweDVjNDRlZTQwLCAweDU4YjcxNjMyKSwgU1RDUCgweDViZmE3YjgyLCAweDU5MDQ0M2E3KSwKLSAgU1RDUCgweDViYWZjODM3LCAweDU5NTEzMmEyKSwgU1RDUCgweDViNjRkNDkyLCAweDU5OWRlMmVlKSwgU1RDUCgweDViMTlhMGM4LCAweDU5ZWE1NDU0KSwgU1RDUCgweDVhY2UyZDBmLCAweDVhMzY4NjlmKSwKLSAgU1RDUCgweDVhODI3OTlhLCAweDVhODI3OTlhKQotfTsKLQotCi1SQU1fQUxJR04KLUxOS19TRUNUSU9OX0NPTlNUREFUQQotTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCi1jb25zdCBGSVhQX1NUUCBTaW5lVGFibGU1MTJbXSA9Ci17Ci0gIFNUQ1AoMHg3ZmZmZmZmZiwgMHgwMDAwMDAwMCksIFNUQ1AoMHg3ZmZmZDg4NiwgMHgwMDY0ODdlMyksIFNUQ1AoMHg3ZmZmNjIxNiwgMHgwMGM5MGY4OCksIFNUQ1AoMHg3ZmZlOWNiMiwgMHgwMTJkOTZiMSksCi0gIFNUQ1AoMHg3ZmZkODg1YSwgMHgwMTkyMWQyMCksIFNUQ1AoMHg3ZmZjMjUwZiwgMHgwMWY2YTI5NyksIFNUQ1AoMHg3ZmZhNzJkMSwgMHgwMjViMjZkNyksIFNUQ1AoMHg3ZmY4NzFhMiwgMHgwMmJmYTlhNCksCi0gIFNUQ1AoMHg3ZmY2MjE4MiwgMHgwMzI0MmFiZiksIFNUQ1AoMHg3ZmYzODI3NCwgMHgwMzg4YTllYSksIFNUQ1AoMHg3ZmYwOTQ3OCwgMHgwM2VkMjZlNiksIFNUQ1AoMHg3ZmVkNTc5MSwgMHgwNDUxYTE3NyksCi0gIFNUQ1AoMHg3ZmU5Y2JjMCwgMHgwNGI2MTk1ZCksIFNUQ1AoMHg3ZmU1ZjEwOCwgMHgwNTFhOGU1YyksIFNUQ1AoMHg3ZmUxYzc2YiwgMHgwNTdmMDAzNSksIFNUQ1AoMHg3ZmRkNGVlYywgMHgwNWUzNmVhOSksCi0gIFNUQ1AoMHg3ZmQ4ODc4ZSwgMHgwNjQ3ZDk3YyksIFNUQ1AoMHg3ZmQzNzE1MywgMHgwNmFjNDA2ZiksIFNUQ1AoMHg3ZmNlMGMzZSwgMHgwNzEwYTM0NSksIFNUQ1AoMHg3ZmM4NTg1NCwgMHgwNzc1MDFiZSksCi0gIFNUQ1AoMHg3ZmMyNTU5NiwgMHgwN2Q5NWI5ZSksIFNUQ1AoMHg3ZmJjMDQwYSwgMHgwODNkYjBhNyksIFNUQ1AoMHg3ZmI1NjNiMywgMHgwOGEyMDA5YSksIFNUQ1AoMHg3ZmFlNzQ5NSwgMHgwOTA2NGIzYSksCi0gIFNUQ1AoMHg3ZmE3MzZiNCwgMHgwOTZhOTA0OSksIFNUQ1AoMHg3ZjlmYWExNSwgMHgwOWNlY2Y4OSksIFNUQ1AoMHg3Zjk3Y2ViZCwgMHgwYTMzMDhiZCksIFNUQ1AoMHg3ZjhmYTRiMCwgMHgwYTk3M2JhNSksCi0gIFNUQ1AoMHg3Zjg3MmJmMywgMHgwYWZiNjgwNSksIFNUQ1AoMHg3ZjdlNjQ4YywgMHgwYjVmOGQ5ZiksIFNUQ1AoMHg3Zjc1NGU4MCwgMHgwYmMzYWMzNSksIFNUQ1AoMHg3ZjZiZTlkNCwgMHgwYzI3YzM4OSksCi0gIFNUQ1AoMHg3ZjYyMzY4ZiwgMHgwYzhiZDM1ZSksIFNUQ1AoMHg3ZjU4MzRiNywgMHgwY2VmZGI3NiksIFNUQ1AoMHg3ZjRkZTQ1MSwgMHgwZDUzZGI5MiksIFNUQ1AoMHg3ZjQzNDU2MywgMHgwZGI3ZDM3NiksCi0gIFNUQ1AoMHg3ZjM4NTdmNiwgMHgwZTFiYzJlNCksIFNUQ1AoMHg3ZjJkMWMwZSwgMHgwZTdmYTk5ZSksIFNUQ1AoMHg3ZjIxOTFiNCwgMHgwZWUzODc2NiksIFNUQ1AoMHg3ZjE1YjhlZSwgMHgwZjQ3NWJmZiksCi0gIFNUQ1AoMHg3ZjA5OTFjNCwgMHgwZmFiMjcyYiksIFNUQ1AoMHg3ZWZkMWMzYywgMHgxMDBlZThhZCksIFNUQ1AoMHg3ZWYwNTg2MCwgMHgxMDcyYTA0OCksIFNUQ1AoMHg3ZWUzNDYzNiwgMHgxMGQ2NGRiZCksCi0gIFNUQ1AoMHg3ZWQ1ZTVjNiwgMHgxMTM5ZjBjZiksIFNUQ1AoMHg3ZWM4MzcxYSwgMHgxMTlkODk0MSksIFNUQ1AoMHg3ZWJhM2EzOSwgMHgxMjAxMTZkNSksIFNUQ1AoMHg3ZWFiZWYyYywgMHgxMjY0OTk0ZSksCi0gIFNUQ1AoMHg3ZTlkNTVmYywgMHgxMmM4MTA2ZiksIFNUQ1AoMHg3ZThlNmViMiwgMHgxMzJiN2JmOSksIFNUQ1AoMHg3ZTdmMzk1NywgMHgxMzhlZGJiMSksIFNUQ1AoMHg3ZTZmYjVmNCwgMHgxM2YyMmY1OCksCi0gIFNUQ1AoMHg3ZTVmZTQ5MywgMHgxNDU1NzZiMSksIFNUQ1AoMHg3ZTRmYzUzZSwgMHgxNGI4YjE3ZiksIFNUQ1AoMHg3ZTNmNTdmZiwgMHgxNTFiZGY4NiksIFNUQ1AoMHg3ZTJlOWNkZiwgMHgxNTdmMDA4NiksCi0gIFNUQ1AoMHg3ZTFkOTNlYSwgMHgxNWUyMTQ0NSksIFNUQ1AoMHg3ZTBjM2QyOSwgMHgxNjQ1MWE4MyksIFNUQ1AoMHg3ZGZhOThhOCwgMHgxNmE4MTMwNSksIFNUQ1AoMHg3ZGU4YTY3MCwgMHgxNzBhZmQ4ZCksCi0gIFNUQ1AoMHg3ZGQ2NjY4ZiwgMHgxNzZkZDlkZSksIFNUQ1AoMHg3ZGMzZDkwZCwgMHgxN2QwYTdiYyksIFNUQ1AoMHg3ZGIwZmRmOCwgMHgxODMzNjZlOSksIFNUQ1AoMHg3ZDlkZDU1YSwgMHgxODk2MTcyOCksCi0gIFNUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksIFNUQ1AoMHg3ZDc2OWJiNSwgMHgxOTViNDllYSksIFNUQ1AoMHg3ZDYyOGFjNiwgMHgxOWJkY2JmMyksIFNUQ1AoMHg3ZDRlMmM3ZiwgMHgxYTIwM2UxYiksCi0gIFNUQ1AoMHg3ZDM5ODBlYywgMHgxYTgyYTAyNiksIFNUQ1AoMHg3ZDI0ODgxYiwgMHgxYWU0ZjFkNiksIFNUQ1AoMHg3ZDBmNDIxOCwgMHgxYjQ3MzJlZiksIFNUQ1AoMHg3Y2Y5YWVmMCwgMHgxYmE5NjMzNSksCi0gIFNUQ1AoMHg3Y2UzY2ViMiwgMHgxYzBiODI2YSksIFNUQ1AoMHg3Y2NkYTE2OSwgMHgxYzZkOTA1MyksIFNUQ1AoMHg3Y2I3MjcyNCwgMHgxY2NmOGNiMyksIFNUQ1AoMHg3Y2EwNWZmMSwgMHgxZDMxNzc0ZCksCi0gIFNUQ1AoMHg3Yzg5NGJkZSwgMHgxZDkzNGZlNSksIFNUQ1AoMHg3YzcxZWFmOSwgMHgxZGY1MTYzZiksIFNUQ1AoMHg3YzVhM2Q1MCwgMHgxZTU2Y2ExZSksIFNUQ1AoMHg3YzQyNDJmMiwgMHgxZWI4NmI0NiksCi0gIFNUQ1AoMHg3YzI5ZmJlZSwgMHgxZjE5Zjk3YiksIFNUQ1AoMHg3YzExNjg1MywgMHgxZjdiNzQ4MSksIFNUQ1AoMHg3YmY4ODgzMCwgMHgxZmRjZGMxYiksIFNUQ1AoMHg3YmRmNWI5NCwgMHgyMDNlMzAwZCksCi0gIFNUQ1AoMHg3YmM1ZTI5MCwgMHgyMDlmNzAxYyksIFNUQ1AoMHg3YmFjMWQzMSwgMHgyMTAwOWMwYyksIFNUQ1AoMHg3YjkyMGI4OSwgMHgyMTYxYjNhMCksIFNUQ1AoMHg3Yjc3YWRhOCwgMHgyMWMyYjY5YyksCi0gIFNUQ1AoMHg3YjVkMDM5ZSwgMHgyMjIzYTRjNSksIFNUQ1AoMHg3YjQyMGQ3YSwgMHgyMjg0N2RlMCksIFNUQ1AoMHg3YjI2Y2I0ZiwgMHgyMmU1NDFhZiksIFNUQ1AoMHg3YjBiM2QyYywgMHgyMzQ1ZWZmOCksCi0gIFNUQ1AoMHg3YWVmNjMyMywgMHgyM2E2ODg3ZiksIFNUQ1AoMHg3YWQzM2Q0NSwgMHgyNDA3MGIwOCksIFNUQ1AoMHg3YWI2Y2JhNCwgMHgyNDY3Nzc1OCksIFNUQ1AoMHg3YTlhMGU1MCwgMHgyNGM3Y2QzMyksCi0gIFNUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksIFNUQ1AoMHg3YTVmYjBkOCwgMHgyNTg4MzQ5ZCksIFNUQ1AoMHg3YTQyMTBkOCwgMHgyNWU4NDViNiksIFNUQ1AoMHg3YTI0MjU2ZiwgMHgyNjQ4M2Y2YyksCi0gIFNUQ1AoMHg3YTA1ZWVhZCwgMHgyNmE4MjE4NiksIFNUQ1AoMHg3OWU3NmNhNywgMHgyNzA3ZWJjNyksIFNUQ1AoMHg3OWM4OWY2ZSwgMHgyNzY3OWRmNCksIFNUQ1AoMHg3OWE5ODcxNSwgMHgyN2M3MzdkMyksCi0gIFNUQ1AoMHg3OThhMjNiMSwgMHgyODI2YjkyOCksIFNUQ1AoMHg3OTZhNzU1NCwgMHgyODg2MjFiOSksIFNUQ1AoMHg3OTRhN2MxMiwgMHgyOGU1NzE0YiksIFNUQ1AoMHg3OTJhMzdmZSwgMHgyOTQ0YTdhMiksCi0gIFNUQ1AoMHg3OTA5YTkyZCwgMHgyOWEzYzQ4NSksIFNUQ1AoMHg3OGU4Y2ZiMiwgMHgyYTAyYzdiOCksIFNUQ1AoMHg3OGM3YWJhMiwgMHgyYTYxYjEwMSksIFNUQ1AoMHg3OGE2M2QxMSwgMHgyYWMwODAyNiksCi0gIFNUQ1AoMHg3ODg0ODQxNCwgMHgyYjFmMzRlYiksIFNUQ1AoMHg3ODYyODBiZiwgMHgyYjdkY2YxNyksIFNUQ1AoMHg3ODQwMzMyOSwgMHgyYmRjNGU2ZiksIFNUQ1AoMHg3ODFkOWI2NSwgMHgyYzNhYjJiOSksCi0gIFNUQ1AoMHg3N2ZhYjk4OSwgMHgyYzk4ZmJiYSksIFNUQ1AoMHg3N2Q3OGRhYSwgMHgyY2Y3MjkzOSksIFNUQ1AoMHg3N2I0MTdkZiwgMHgyZDU1M2FmYyksIFNUQ1AoMHg3NzkwNTgzZSwgMHgyZGIzMzBjNyksCi0gIFNUQ1AoMHg3NzZjNGVkYiwgMHgyZTExMGE2MiksIFNUQ1AoMHg3NzQ3ZmJjZSwgMHgyZTZlYzc5MiksIFNUQ1AoMHg3NzIzNWYyZCwgMHgyZWNjNjgxZSksIFNUQ1AoMHg3NmZlNzkwZSwgMHgyZjI5ZWJjYyksCi0gIFNUQ1AoMHg3NmQ5NDk4OSwgMHgyZjg3NTI2MiksIFNUQ1AoMHg3NmIzZDBiNCwgMHgyZmU0OWJhNyksIFNUQ1AoMHg3NjhlMGVhNiwgMHgzMDQxYzc2MSksIFNUQ1AoMHg3NjY4MDM3NiwgMHgzMDllZDU1NiksCi0gIFNUQ1AoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksIFNUQ1AoMHg3NjFiMTIxMSwgMHgzMTU4OTcwZSksIFNUQ1AoMHg3NWY0MmMwYiwgMHgzMWI1NGE1ZSksIFNUQ1AoMHg3NWNjZmQ0MiwgMHgzMjExZGYwNCksCi0gIFNUQ1AoMHg3NWE1ODVjZiwgMHgzMjZlNTRjNyksIFNUQ1AoMHg3NTdkYzVjYSwgMHgzMmNhYWI2ZiksIFNUQ1AoMHg3NTU1YmQ0YywgMHgzMzI2ZTJjMyksIFNUQ1AoMHg3NTJkNmM2YywgMHgzMzgyZmE4OCksCi0gIFNUQ1AoMHg3NTA0ZDM0NSwgMHgzM2RlZjI4NyksIFNUQ1AoMHg3NGRiZjFlZiwgMHgzNDNhY2E4NyksIFNUQ1AoMHg3NGIyYzg4NCwgMHgzNDk2ODI1MCksIFNUQ1AoMHg3NDg5NTcxYywgMHgzNGYyMTlhOCksCi0gIFNUQ1AoMHg3NDVmOWRkMSwgMHgzNTRkOTA1NyksIFNUQ1AoMHg3NDM1OWNiZCwgMHgzNWE4ZTYyNSksIFNUQ1AoMHg3NDBiNTNmYiwgMHgzNjA0MWFkOSksIFNUQ1AoMHg3M2UwYzNhMywgMHgzNjVmMmUzYiksCi0gIFNUQ1AoMHg3M2I1ZWJkMSwgMHgzNmJhMjAxNCksIFNUQ1AoMHg3MzhhY2M5ZSwgMHgzNzE0ZjAyYSksIFNUQ1AoMHg3MzVmNjYyNiwgMHgzNzZmOWU0NiksIFNUQ1AoMHg3MzMzYjg4MywgMHgzN2NhMmEzMCksCi0gIFNUQ1AoMHg3MzA3YzNkMCwgMHgzODI0OTNiMCksIFNUQ1AoMHg3MmRiODgyOCwgMHgzODdlZGE4ZSksIFNUQ1AoMHg3MmFmMDVhNywgMHgzOGQ4ZmU5MyksIFNUQ1AoMHg3MjgyM2M2NywgMHgzOTMyZmY4NyksCi0gIFNUQ1AoMHg3MjU1MmM4NSwgMHgzOThjZGQzMiksIFNUQ1AoMHg3MjI3ZDYxYywgMHgzOWU2OTc1ZSksIFNUQ1AoMHg3MWZhMzk0OSwgMHgzYTQwMmRkMiksIFNUQ1AoMHg3MWNjNTYyNiwgMHgzYTk5YTA1NyksCi0gIFNUQ1AoMHg3MTllMmNkMiwgMHgzYWYyZWViNyksIFNUQ1AoMHg3MTZmYmQ2OCwgMHgzYjRjMThiYSksIFNUQ1AoMHg3MTQxMDgwNSwgMHgzYmE1MWUyOSksIFNUQ1AoMHg3MTEyMGNjNSwgMHgzYmZkZmVjZCksCi0gIFNUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksIFNUQ1AoMHg3MGIzNDUyNSwgMHgzY2FmNTBkYSksIFNUQ1AoMHg3MDgzNzhmZiwgMHgzZDA3YzFkNiksIFNUQ1AoMHg3MDUzNjc3MSwgMHgzZDYwMGQyYyksCi0gIFNUQ1AoMHg3MDIzMTA5YSwgMHgzZGI4MzJhNiksIFNUQ1AoMHg2ZmYyNzQ5NywgMHgzZTEwMzIwZCksIFNUQ1AoMHg2ZmMxOTM4NSwgMHgzZTY4MGIyYyksIFNUQ1AoMHg2ZjkwNmQ4NCwgMHgzZWJmYmRjZCksCi0gIFNUQ1AoMHg2ZjVmMDJiMiwgMHgzZjE3NDliOCksIFNUQ1AoMHg2ZjJkNTMyYywgMHgzZjZlYWViOCksIFNUQ1AoMHg2ZWZiNWYxMiwgMHgzZmM1ZWM5OCksIFNUQ1AoMHg2ZWM5MjY4MywgMHg0MDFkMDMyMSksCi0gIFNUQ1AoMHg2ZTk2YTk5ZCwgMHg0MDczZjIxZCksIFNUQ1AoMHg2ZTYzZTg3ZiwgMHg0MGNhYjk1OCksIFNUQ1AoMHg2ZTMwZTM0YSwgMHg0MTIxNTg5YiksIFNUQ1AoMHg2ZGZkOWExYywgMHg0MTc3Y2ZiMSksCi0gIFNUQ1AoMHg2ZGNhMGQxNCwgMHg0MWNlMWU2NSksIFNUQ1AoMHg2ZDk2M2M1NCwgMHg0MjI0NDQ4MSksIFNUQ1AoMHg2ZDYyMjdmYSwgMHg0MjdhNDFkMCksIFNUQ1AoMHg2ZDJkZDAyNywgMHg0MmQwMTYxZSksCi0gIFNUQ1AoMHg2Y2Y5MzRmYywgMHg0MzI1YzEzNSksIFNUQ1AoMHg2Y2M0NTY5OCwgMHg0MzdiNDJlMSksIFNUQ1AoMHg2YzhmMzUxYywgMHg0M2QwOWFlZCksIFNUQ1AoMHg2YzU5ZDBhOSwgMHg0NDI1YzkyMyksCi0gIFNUQ1AoMHg2YzI0Mjk2MCwgMHg0NDdhY2Q1MCksIFNUQ1AoMHg2YmVlM2Y2MiwgMHg0NGNmYTc0MCksIFNUQ1AoMHg2YmI4MTJkMSwgMHg0NTI0NTZiZCksIFNUQ1AoMHg2YjgxYTNjZCwgMHg0NTc4ZGI5MyksCi0gIFNUQ1AoMHg2YjRhZjI3OSwgMHg0NWNkMzU4ZiksIFNUQ1AoMHg2YjEzZmVmNSwgMHg0NjIxNjQ3ZCksIFNUQ1AoMHg2YWRjYzk2NCwgMHg0Njc1NjgyOCksIFNUQ1AoMHg2YWE1NTFlOSwgMHg0NmM5NDA1YyksCi0gIFNUQ1AoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksIFNUQ1AoMHg2YTM1OWRiOSwgMHg0NzcwNmQ5MyksIFNUQ1AoMHg2OWZkNjE0YSwgMHg0N2MzYzIyZiksIFNUQ1AoMHg2OWM0ZTM3YSwgMHg0ODE2ZWE4NiksCi0gIFNUQ1AoMHg2OThjMjQ2YywgMHg0ODY5ZTY2NSksIFNUQ1AoMHg2OTUzMjQ0MiwgMHg0OGJjYjU5OSksIFNUQ1AoMHg2OTE5ZTMyMCwgMHg0OTBmNTdlZSksIFNUQ1AoMHg2OGUwNjEyOSwgMHg0OTYxY2QzMyksCi0gIFNUQ1AoMHg2OGE2OWU4MSwgMHg0OWI0MTUzMyksIFNUQ1AoMHg2ODZjOWI0YiwgMHg0YTA2MmZiZCksIFNUQ1AoMHg2ODMyNTdhYiwgMHg0YTU4MWM5ZSksIFNUQ1AoMHg2N2Y3ZDNjNSwgMHg0YWE5ZGJhMiksCi0gIFNUQ1AoMHg2N2JkMGZiZCwgMHg0YWZiNmM5OCksIFNUQ1AoMHg2NzgyMGJiNywgMHg0YjRjY2Y0ZCksIFNUQ1AoMHg2NzQ2YzdkOCwgMHg0YjllMDM5MCksIFNUQ1AoMHg2NzBiNDQ0NCwgMHg0YmVmMDkyZCksCi0gIFNUQ1AoMHg2NmNmODEyMCwgMHg0YzNmZGZmNCksIFNUQ1AoMHg2NjkzN2U5MSwgMHg0YzkwODdiMSksIFNUQ1AoMHg2NjU3M2NiYiwgMHg0Y2UxMDAzNCksIFNUQ1AoMHg2NjFhYmJjNSwgMHg0ZDMxNDk0YiksCi0gIFNUQ1AoMHg2NWRkZmJkMywgMHg0ZDgxNjJjNCksIFNUQ1AoMHg2NWEwZmQwYiwgMHg0ZGQxNGM2ZSksIFNUQ1AoMHg2NTYzYmY5MiwgMHg0ZTIxMDYxNyksIFNUQ1AoMHg2NTI2NDM4ZiwgMHg0ZTcwOGY4ZiksCi0gIFNUQ1AoMHg2NGU4ODkyNiwgMHg0ZWJmZThhNSksIFNUQ1AoMHg2NGFhOTA3ZiwgMHg0ZjBmMTEyNiksIFNUQ1AoMHg2NDZjNTliZiwgMHg0ZjVlMDhlMyksIFNUQ1AoMHg2NDJkZTUwZCwgMHg0ZmFjY2ZhYiksCi0gIFNUQ1AoMHg2M2VmMzI5MCwgMHg0ZmZiNjU0ZCksIFNUQ1AoMHg2M2IwNDI2ZCwgMHg1MDQ5Yzk5OSksIFNUQ1AoMHg2MzcxMTRjYywgMHg1MDk3ZmM1ZSksIFNUQ1AoMHg2MzMxYTlkNCwgMHg1MGU1ZmQ2ZCksCi0gIFNUQ1AoMHg2MmYyMDFhYywgMHg1MTMzY2M5NCksIFNUQ1AoMHg2MmIyMWM3YiwgMHg1MTgxNjlhNSksIFNUQ1AoMHg2MjcxZmE2OSwgMHg1MWNlZDQ2ZSksIFNUQ1AoMHg2MjMxOWI5ZCwgMHg1MjFjMGNjMiksCi0gIFNUQ1AoMHg2MWYxMDAzZiwgMHg1MjY5MTI2ZSksIFNUQ1AoMHg2MWIwMjg3NiwgMHg1MmI1ZTU0NiksIFNUQ1AoMHg2MTZmMTQ2YywgMHg1MzAyODUxOCksIFNUQ1AoMHg2MTJkYzQ0NywgMHg1MzRlZjFiNSksCi0gIFNUQ1AoMHg2MGVjMzgzMCwgMHg1MzliMmFmMCksIFNUQ1AoMHg2MGFhNzA1MCwgMHg1M2U3MzA5NyksIFNUQ1AoMHg2MDY4NmNjZiwgMHg1NDMzMDI3ZCksIFNUQ1AoMHg2MDI2MmRkNiwgMHg1NDdlYTA3MyksCi0gIFNUQ1AoMHg1ZmUzYjM4ZCwgMHg1NGNhMGE0YiksIFNUQ1AoMHg1ZmEwZmUxZiwgMHg1NTE1M2ZkNCksIFNUQ1AoMHg1ZjVlMGRiMywgMHg1NTYwNDBlMiksIFNUQ1AoMHg1ZjFhZTI3NCwgMHg1NWFiMGQ0NiksCi0gIFNUQ1AoMHg1ZWQ3N2M4YSwgMHg1NWY1YTRkMiksIFNUQ1AoMHg1ZTkzZGMxZiwgMHg1NjQwMDc1OCksIFNUQ1AoMHg1ZTUwMDE1ZCwgMHg1NjhhMzRhOSksIFNUQ1AoMHg1ZTBiZWM2ZSwgMHg1NmQ0MmM5OSksCi0gIFNUQ1AoMHg1ZGM3OWQ3YywgMHg1NzFkZWVmYSksIFNUQ1AoMHg1ZDgzMTRiMSwgMHg1NzY3N2I5ZCksIFNUQ1AoMHg1ZDNlNTIzNywgMHg1N2IwZDI1NiksIFNUQ1AoMHg1Y2Y5NTYzOCwgMHg1N2Y5ZjJmOCksCi0gIFNUQ1AoMHg1Y2I0MjBlMCwgMHg1ODQyZGQ1NCksIFNUQ1AoMHg1YzZlYjI1OCwgMHg1ODhiOTE0MCksIFNUQ1AoMHg1YzI5MGFjYywgMHg1OGQ0MGU4YyksIFNUQ1AoMHg1YmUzMmE2NywgMHg1OTFjNTUwZSksCi0gIFNUQ1AoMHg1YjlkMTE1NCwgMHg1OTY0NjQ5OCksIFNUQ1AoMHg1YjU2YmZiZCwgMHg1OWFjM2NmZCksIFNUQ1AoMHg1YjEwMzVjZiwgMHg1OWYzZGUxMiksIFNUQ1AoMHg1YWM5NzNiNSwgMHg1YTNiNDdhYiksCi0gIFNUQ1AoMHg1YTgyNzk5YSwgMHg1YTgyNzk5YSkKLX07Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0vKiBnZW5lcmF0ZV9mZnRfdGFibGVzLm0gNCAxNSAqLwotUkFNX0FMSUdOCi1MTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw2MFtdID0KLXsKLSAgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDc5YmMzODRkKSwKLSAgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDY3OGRkZTZlKSwKLSAgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDRiM2M4YzEyKSwKLSAgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDI3OGRkZTZlKSwKLSAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDAwMDAwMDAwKSwKLSAgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweGQ4NzIyMTkxKSwKLSAgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweGI0YzM3M2VkKSwKLSAgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHhmMjllY2ZiMSksIFNUQygweDk4NzIyMTkxKSwKLSAgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweDg2NDNjN2IyKSwKLSAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHhiZmZmZmZmZiksIFNUQygweDgwMDAwMDAwKSwKLSAgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHhhYTU5ZWRhMyksIFNUQygweDg2NDNjN2IyKSwKLSAgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHg5ODcyMjE5MSksIFNUQygweDk4NzIyMTkxKSwKLSAgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHg4YjEwZjE0MyksIFNUQygweGI0YzM3M2VkKSwKLSAgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHg4MmNjMGYzNSksIFNUQygweGQ4NzIyMTkxKSwKLX07Ci1SQU1fQUxJR04KLUxOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzYwW10gPQotewotICBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4Mjc4ZGRlNmUpLAotICBTVEMoMHgxYTljZDlhYyksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NGIzYzhjMTIpLAotICBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Njc4ZGRlNmUpLAotICBTVEMoMHgzNDBmZjI0MiksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NzliYzM4NGQpLAotICBTVEMoMHg0MDAwMDAwMCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4N2ZmZmZmZmYpLAotICBTVEMoMHg0YjNjOGMxMiksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzliYzM4NGQpLAotICBTVEMoMHg1NWE2MTI1YyksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4Njc4ZGRlNmUpLAotICBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4NGIzYzhjMTIpLAotICBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4Mjc4ZGRlNmUpLAotICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4MDAwMDAwMDApLAotICBTVEMoMHg3NGVmMGViYyksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4ZDg3MjIxOTEpLAotICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4YjRjMzczZWQpLAotICBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4OTg3MjIxOTEpLAotICBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4ODY0M2M3YjIpLAotfTsKLQotCi0KLVJBTV9BTElHTgotTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1jb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMjQwW10gPQotewotICBTVEMoMHg3ZmY0YzU2ZiksIFNUQygweDdmZDMxN2I0KSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZGRiNGJmYyksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdhYmE5YWU2KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3OGE4NzlmNCksIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NzY0MWFmM2QpLAotICBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDZiNTk4ZWEzKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NWE4Mjc5OWEpLAotICBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MzBmYmM1NGQpLAotICBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDZlZDllYmExKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MDAwMDAwMDApLAotICBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlZjRhZWFmMCksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4Y2YwNDNhYjIpLAotICBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGViZjlmNDk3KSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhjNWUzYTNhOCksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4YTU3ZDg2NjUpLAotICBTVEMoMHg3ZGRiNGJmYyksIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgyNDVhOWQ2NSksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4ZjVmNTBkNjYpLCBTVEMoMHhkZWRmMDQ3YyksIFNUQygweGM4ZTUwMzJhKSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHhhMzI2ZWViZiksIFNUQygweDk0YTY3MTVjKSwgU1RDKDB4ODliZTUwYzIpLAotICBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweGYyOWVjZmIxKSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhiZmZmZmZmZiksIFNUQygweGFhNTllZGEzKSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHg4YjEwZjE0MyksIFNUQygweDgyY2MwZjM1KSwgU1RDKDB4ODAwMDAwMDApLAotICBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHhmNWY1MGQ2NiksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4YmQxZWM0NWIpLCBTVEMoMHhhNTdkODY2NSksIFNUQygweDkyZGNhZmU0KSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg4MDY1MDM0NiksIFNUQygweDgxOTM2ZGFlKSwgU1RDKDB4ODliZTUwYzIpLAotICBTVEMoMHg3YmEzNzUxZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhkZWRmMDQ3YyksIFNUQygweGJmZmZmZmZmKSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHg5MTI2MTQ1ZSksIFNUQygweDg0NWM4YWUyKSwgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHg4NDVjOGFlMiksIFNUQygweDkxMjYxNDVlKSwgU1RDKDB4YTU3ZDg2NjUpLAotICBTVEMoMHg3YWJhOWFlNiksIFNUQygweDZiNTk4ZWEzKSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4ZWJmOWY0OTcpLCBTVEMoMHhjOGU1MDMyYSksIFNUQygweGFhNTllZGEzKSwgU1RDKDB4OTJkY2FmZTQpLCBTVEMoMHg4NDVjOGFlMiksIFNUQygweDgwMGIzYTkwKSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg5NjgzMDg3NSksIFNUQygweGFmNzI2ZGVlKSwgU1RDKDB4Y2YwNDNhYjIpLAotICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweDk4NzIyMTkxKSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4ZmZmZmZmZmYpLAotICBTVEMoMHg3OGE4NzlmNCksIFNUQygweDYzNzk4NGQ0KSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweGVmNGFlYWYwKSwgU1RDKDB4YzVlM2EzYTgpLCBTVEMoMHhhMzI2ZWViZiksIFNUQygweDhiMTBmMTQzKSwgU1RDKDB4ODA2NTAzNDYpLCBTVEMoMHg4NDVjOGFlMiksIFNUQygweDk2ODMwODc1KSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHhkYmE1NjI5YSksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MzBmYmM1NGQpLAotICBTVEMoMHg3NzdmOTAzYyksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHg5NGE2NzE1YyksIFNUQygweDgyY2MwZjM1KSwgU1RDKDB4ODE5MzZkYWUpLCBTVEMoMHg5MTI2MTQ1ZSksIFNUQygweGFmNzI2ZGVlKSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHgwNmIyZjFkMiksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NWE4Mjc5OWEpLAotfTsKLVJBTV9BTElHTgotTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1jb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMjQwW10gPQotewotICBTVEMoMHgwMzU5YzQyOCksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxNzUzN2U2MyksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyYWJhMmVlNCksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4MzBmYmM1NGQpLAotICBTVEMoMHgwNmIyZjFkMiksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyZGRmMDA0MCksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1MDhkOTIxMSksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NWE4Mjc5OWEpLAotICBTVEMoMHgwYTBhZjI5OSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzY0MWFmM2QpLAotICBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2ZmZmZmZmYpLAotICBTVEMoMHgxMGI1MTUwZiksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzY0MWFmM2QpLAotICBTVEMoMHgxNDA2MGI2OCksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NWE4Mjc5OWEpLAotICBTVEMoMHgxNzUzN2U2MyksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDczODdlYTIzKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1ODFjMDBiMyksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4MzBmYmM1NGQpLAotICBTVEMoMHgxYTljZDlhYyksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MDAwMDAwMDApLAotICBTVEMoMHgxZGUxODlhNiksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgwYTBhZjI5OSksIFNUQygweGViZjlmNDk3KSwgU1RDKDB4Y2YwNDNhYjIpLAotICBTVEMoMHgyMTIwZmI4MyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhkZWRmMDQ3YyksIFNUQygweGJmZmZmZmZmKSwgU1RDKDB4YTU3ZDg2NjUpLAotICBTVEMoMHgyNDVhOWQ2NSksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3Mzg3ZWEyMyksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweGZjYTYzYmQ3KSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhiNzgwMDAxYiksIFNUQygweDljODY3YjJiKSwgU1RDKDB4ODliZTUwYzIpLAotICBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHg5ODcyMjE5MSksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4ODAwMDAwMDApLAotICBTVEMoMHgyYWJhMmVlNCksIFNUQygweDUwOGQ5MjExKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg1ODFjMDBiMyksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHhkZWRmMDQ3YyksIFNUQygweGI3ODAwMDFiKSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHg4NTQ1NjUxOSksIFNUQygweDgwMmNlODRiKSwgU1RDKDB4ODliZTUwYzIpLAotICBTVEMoMHgyZGRmMDA0MCksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4ZWJmOWY0OTcpLCBTVEMoMHhiZmZmZmZmZiksIFNUQygweDljODY3YjJiKSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg4MDJjZTg0YiksIFNUQygweDhiMTBmMTQzKSwgU1RDKDB4YTU3ZDg2NjUpLAorY29uc3QgRklYUF9TVFAgU2luZVRhYmxlODBbXSA9IHsKKyAgICBTVENQKDB4N2ZmZmZmZmYsIDB4MDAwMDAwMDApLCBTVENQKDB4N2ZmOWFmMDQsIDB4MDI4MzViNWEpLAorICAgIFNUQ1AoMHg3ZmU2YmNiMCwgMHgwNTA2NzczNCksIFNUQ1AoMHg3ZmM3MmFlMiwgMHgwNzg5MTQxOCksCisgICAgU1RDUCgweDdmOWFmY2I5LCAweDBhMGFmMjk5KSwgU1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwKKyAgICBTVENQKDB4N2YxY2RlMDEsIDB4MGYwYjc3MjcpLCBTVENQKDB4N2VjYWY5ZTUsIDB4MTE4OTllZDMpLAorICAgIFNUQ1AoMHg3ZTZjOTI1MSwgMHgxNDA2MGI2OCksIFNUQ1AoMHg3ZTAxYjA5NiwgMHgxNjgwN2UxNSksCisgICAgU1RDUCgweDdkOGE1ZjQwLCAweDE4ZjhiODNjKSwgU1RDUCgweDdkMDZhYTE2LCAweDFiNmU3YjdhKSwKKyAgICBTVENQKDB4N2M3NjllMTgsIDB4MWRlMTg5YTYpLCBTVENQKDB4N2JkYTQ5N2QsIDB4MjA1MWE0ZGQpLAorICAgIFNUQ1AoMHg3YjMxYmJiMiwgMHgyMmJlOGY4NyksIFNUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksCisgICAgU1RDUCgweDc5YmMzODRkLCAweDI3OGRkZTZlKSwgU1RDUCgweDc4ZWY2NzhmLCAweDI5ZWZjOTI1KSwKKyAgICBTVENQKDB4NzgxNmE3NTksIDB4MmM0ZDkwNTApLCBTVENQKDB4NzczMjBkMGQsIDB4MmVhNmY4MjcpLAorICAgIFNUQ1AoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksIFNUQ1AoMHg3NTQ1YTVhMCwgMHgzMzRiYmNkZSksCisgICAgU1RDUCgweDc0M2UwOTE4LCAweDM1OTZhNDZjKSwgU1RDUCgweDczMmFmM2E3LCAweDM3ZGM0MjBjKSwKKyAgICBTVENQKDB4NzIwYzgwNzUsIDB4M2ExYzVjNTcpLCBTVENQKDB4NzBlMmNiYzYsIDB4M2M1NmJhNzApLAorICAgIFNUQ1AoMHg2ZmFkZjJmYywgMHgzZThiMjQwZSksIFNUQ1AoMHg2ZTZlMTQ5MiwgMHg0MGI5NjE3ZCksCisgICAgU1RDUCgweDZkMjM1MDFiLCAweDQyZTEzYmE0KSwgU1RDUCgweDZiY2RjNjM5LCAweDQ1MDI3YzBjKSwKKyAgICBTVENQKDB4NmE2ZDk4YTQsIDB4NDcxY2VjZTcpLCBTVENQKDB4NjkwMmVhMWQsIDB4NDkzMDU5MGYpLAorICAgIFNUQ1AoMHg2NzhkZGU2ZSwgMHg0YjNjOGMxMiksIFNUQ1AoMHg2NjBlOWE2YSwgMHg0ZDQxNTIzNCksCisgICAgU1RDUCgweDY0ODU0M2U0LCAweDRmM2U3ODc1KSwgU1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwKKyAgICBTVENQKDB4NjE1NGZiOTEsIDB4NTMyMTFkMTgpLCBTVENQKDB4NWZhZTVhNTUsIDB4NTUwNjM5NTEpLAorICAgIFNUQ1AoMHg1ZGZlNDdhZCwgMHg1NmUyZjE1ZCksIFNUQ1AoMHg1YzQ0ZWU0MCwgMHg1OGI3MTYzMiksCisgICAgU1RDUCgweDVhODI3OTlhLCAweDVhODI3OTlhKSwKIH07CiAKIFJBTV9BTElHTgogTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1jb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsNDgwW10gPQotewotICBTVEMoMHg3ZmZkMzE1NCksIFNUQygweDdmZjRjNTZmKSwgU1RDKDB4N2ZlNmJjYjApLCBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3Zjc2ODkyZiksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2YxY2RlMDEpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdlYWNlNThhKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZTI2YjM3MSksIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdjZDgwNDY0KSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3YzBmYzIyYSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDdhM2UxN2YyKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3OTM1MDFhOSksIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4NzgxNmE3NTkpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDc2ZTMzYjNmKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3NTlhZjM0YyksCi0gIFNUQygweDdmZjRjNTZmKSwgU1RDKDB4N2ZkMzE3YjQpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2FiYTlhZTYpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NzM4N2VhMjMpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDcwN2QxNDQzKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDZiNTk4ZWEzKSwgU1RDKDB4Njk3Y2Y3OGEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NjM3OTg0ZDQpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NWNkOTExNDApLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDU4MWMwMGIzKSwKLSAgU1RDKDB4N2ZlNmJjYjApLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdmMWNkZTAxKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc4MTZhNzU5KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3NDNlMDkxOCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NmZhZGYyZmMpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2NDg1NDNlNCksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NWRmZTQ3YWQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDU2ZTJmMTVkKSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg0ZjNlNzg3NSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDNlOGIyNDBlKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgzNTk2YTQ2YyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MmM0ZDkwNTApLAotICBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDZiNTk4ZWEzKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDUwOGQ5MjExKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhmOTRkMGUyZCksCi0gIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzkzNTAxYTkpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4Mzg5Y2VhNzIpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MDg1ZjIxMzcpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGY3YTBkZWM4KSwgU1RDKDB4ZWY0YWVhZjApLCBTVEMoMHhlNzA3NDdjMyksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4ZDZkYjEyNTMpLCBTVEMoMHhjZjA0M2FiMiksIFNUQygweGM3NjMxNThkKSwKLSAgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGY1ZjUwZDY2KSwgU1RDKDB4ZWJmOWY0OTcpLCBTVEMoMHhlMjFlNzY1OSksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4Y2YwNDNhYjIpLCBTVEMoMHhjNWUzYTNhOCksIFNUQygweGJkMWVjNDViKSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHhhY2RlZTJlNyksIFNUQygweGE1N2Q4NjY1KSwgU1RDKDB4OWVhYjA0NmUpLAotICBTVEMoMHg3Zjc2ODkyZiksIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg2NjhmN2MyNSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NTZlMmYxNWQpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQ0NGQ3YWZmKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgyZjZlNmQxNiksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDAxYWNlYjdjKSwgU1RDKDB4ZjVmNTBkNjYpLCBTVEMoMHhlYTUyYzE2NSksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4ZDNiMjZmYWYpLCBTVEMoMHhjOGU1MDMyYSksIFNUQygweGJlOGRmMmI5KSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHhhYjlhOGU2YiksIFNUQygweGEzMjZlZWJmKSwgU1RDKDB4OWI3YWJjMWIpLCBTVEMoMHg5NGE2NzE1YyksIFNUQygweDhlYjhiOTlmKSwgU1RDKDB4ODliZTUwYzIpLCBTVEMoMHg4NWMxZTgwZCksCi0gIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGYyOWVjZmIxKSwgU1RDKDB4ZTU2MzI2NTMpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGNiZjAwZGJkKSwgU1RDKDB4YmZmZmZmZmYpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGFhNTllZGEzKSwgU1RDKDB4YTBlMGExNWUpLCBTVEMoMHg5ODcyMjE5MSksIFNUQygweDkxMjYxNDVlKSwgU1RDKDB4OGIxMGYxNDMpLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDgyY2MwZjM1KSwgU1RDKDB4ODBiMzgxYWIpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDgwYjM4MWFiKSwKLSAgU1RDKDB4N2YxY2RlMDEpLCBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDc4MTZhNzU5KSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NTZlMmYxNWQpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDNlOGIyNDBlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyMmJlOGY4NyksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MDUwNjc3MzQpLCBTVEMoMHhmNWY1MGQ2NiksIFNUQygweGU3MDc0N2MzKSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhjYTY5NWI5MyksIFNUQygweGJkMWVjNDViKSwgU1RDKDB4YjBjMTg3OGEpLCBTVEMoMHhhNTdkODY2NSksIFNUQygweDliN2FiYzFiKSwgU1RDKDB4OTJkY2FmZTQpLCBTVEMoMHg4YmMxZjZlNyksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4ODI3NWEwYmYpLCBTVEMoMHg4MDY1MDM0NiksIFNUQygweDgwMTk0MzRmKSwgU1RDKDB4ODE5MzZkYWUpLCBTVEMoMHg4NGNlNDQ0ZCksIFNUQygweDg5YmU1MGMyKSwgU1RDKDB4OTA1MjBkMDMpLAotICBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlZjRhZWFmMCksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4Y2YwNDNhYjIpLCBTVEMoMHhiZmZmZmZmZiksIFNUQygweGIyMTQxYjAxKSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHg5YTczNjVkMiksIFNUQygweDkxMjYxNDVlKSwgU1RDKDB4ODliZTUwYzIpLCBTVEMoMHg4NDVjOGFlMiksIFNUQygweDgxMTg1NWIzKSwgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHg4MTE4NTViMyksIFNUQygweDg0NWM4YWUyKSwgU1RDKDB4ODliZTUwYzIpLCBTVEMoMHg5MTI2MTQ1ZSksIFNUQygweDlhNzM2NWQyKSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHhiMjE0MWIwMSksCi0gIFNUQygweDdlYWNlNThhKSwgU1RDKDB4N2FiYTlhZTYpLCBTVEMoMHg3NDNlMDkxOCksIFNUQygweDZiNTk4ZWEzKSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDQ0NGQ3YWZmKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgyMmJlOGY4NyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4ZmU1MzE0ODMpLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGRhMGFlY2Y4KSwgU1RDKDB4YzhlNTAzMmEpLCBTVEMoMHhiOGUzMTMxOCksIFNUQygweGFhNTllZGEzKSwgU1RDKDB4OWQ5Njk3NDEpLCBTVEMoMHg5MmRjYWZlNCksIFNUQygweDhhNjUwY2IzKSwgU1RDKDB4ODQ1YzhhZTIpLCBTVEMoMHg4MGUzMjFmZSksIFNUQygweDgwMGIzYTkwKSwgU1RDKDB4ODFkOTRjOGUpLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDhkMzM0NjI0KSwgU1RDKDB4OTY4MzA4NzUpLCBTVEMoMHhhMjAxYjg1MiksIFNUQygweGFmNzI2ZGVlKSwgU1RDKDB4YmU4ZGYyYjkpLCBTVEMoMHhjZjA0M2FiMiksIFNUQygweGUwN2UwYzgzKSwKLSAgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4YzVlM2EzYTgpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGE1N2Q4NjY1KSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHg4ZGYzN2Y4YSksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4ODE5MzZkYWUpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDgxOTM2ZGFlKSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg4ZGYzN2Y4YSksIFNUQygweDk4NzIyMTkxKSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGM1ZTNhM2E4KSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGZmZmZmZmZmKSwgU1RDKDB4MTQwNjBiNjgpLAotICBTVEMoMHg3ZTI2YjM3MSksIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4NmZhZGYyZmMpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgyZjZlNmQxNiksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MDUwNjc3MzQpLCBTVEMoMHhlZjRhZWFmMCksIFNUQygweGRhMGFlY2Y4KSwgU1RDKDB4YzVlM2EzYTgpLCBTVEMoMHhiMzZhMTk3NyksIFNUQygweGEzMjZlZWJmKSwgU1RDKDB4OTU5MjY3NWIpLCBTVEMoMHg4YjEwZjE0MyksIFNUQygweDgzZjAzZGQ1KSwgU1RDKDB4ODA2NTAzNDYpLCBTVEMoMHg4MDg5NzZkMCksIFNUQygweDg0NWM4YWUyKSwgU1RDKDB4OGJjMWY2ZTcpLCBTVEMoMHg5NjgzMDg3NSksIFNUQygweGE0NTAzN2M4KSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHhjNzYzMTU4ZCksIFNUQygweGRiYTU2MjlhKSwgU1RDKDB4ZjBmNDg4ZDgpLCBTVEMoMHgwNmIyZjFkMiksIFNUQygweDFjM2ZkMDQ1KSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg0NDRkN2FmZiksCi0gIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHhmNWY1MGQ2NiksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4YzhlNTAzMmEpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGEzMjZlZWJmKSwgU1RDKDB4OTRhNjcxNWMpLCBTVEMoMHg4OWJlNTBjMiksIFNUQygweDgyY2MwZjM1KSwgU1RDKDB4ODAwYjNhOTApLCBTVEMoMHg4MTkzNmRhZSksIFNUQygweDg3NTc4NjBiKSwgU1RDKDB4OTEyNjE0NWUpLCBTVEMoMHg5ZWFiMDQ2ZSksIFNUQygweGFmNzI2ZGVlKSwgU1RDKDB4YzJlYzc2MzQpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGVmNGFlYWYwKSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NDg3ZmZmZTQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDY5N2NmNzhhKSwKLX07Ci1SQU1fQUxJR04KLUxOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzQ4MFtdID0KLXsKLSAgU1RDKDB4MDFhY2ViN2MpLCBTVEMoMHgwMzU5YzQyOCksIFNUQygweDA1MDY3NzM0KSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgwODVmMjEzNyksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4MGJiNjUzMzYpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDBmMGI3NzI3KSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgxMjVkZjc1YiksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MTVhZDNlOWEpLCBTVEMoMHgxNzUzN2U2MyksIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgxYzNmZDA0NSksIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4MWY4MWYzN2MpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgyNWY1MTMwNyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MjkyNGVkYWMpLCBTVEMoMHgyYWJhMmVlNCksIFNUQygweDJjNGQ5MDUwKSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgyZjZlNmQxNiksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MzI4NmY3NzkpLAotICBTVEMoMHgwMzU5YzQyOCksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxNzUzN2U2MyksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyYWJhMmVlNCksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDM3MWFmY2Q1KSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgzZDEzODljYiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDQ4N2ZmZmU0KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDUwOGQ5MjExKSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDU4MWMwMGIzKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1Y2Q5MTE0MCksCi0gIFNUQygweDA1MDY3NzM0KSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgwZjBiNzcyNyksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyYzRkOTA1MCksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MzU5NmE0NmMpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDNlOGIyNDBlKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NGYzZTc4NzUpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDU2ZTJmMTVkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1ZGZlNDdhZCksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NjQ4NTQzZTQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg2ZmFkZjJmYyksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzQzZTA5MTgpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc4MTZhNzU5KSwKLSAgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTA4ZDkyMTEpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NmI1OThlYTMpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2ZkMzE3YjQpLAotICBTVEMoMHgwODVmMjEzNyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzODljZWE3MiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3OTM1MDFhOSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZmI5ZDc1OSksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3MmNjYjlkYiksCi0gIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDUzMjExZDE4KSwKLSAgU1RDKDB4MGJiNjUzMzYpLCBTVEMoMHgxNzUzN2U2MyksIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgzODljZWE3MiksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4NGM5NWU2ODgpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDVkZmU0N2FkKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2YzQwY2YyYyksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzZlMzNiM2YpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZmZkMzE1NCksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2UyNmIzNzEpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc4MTZhNzU5KSwgU1RDKDB4NzM4N2VhMjMpLCBTVEMoMHg2ZTAxMDc4MCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg1ODFjMDBiMyksIFNUQygweDRmM2U3ODc1KSwgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHgzYjk5NDFiMSksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MjVmNTEzMDcpLAotICBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDZlZDllYmExKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhmMjllY2ZiMSksCi0gIFNUQygweDBmMGI3NzI3KSwgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgyYzRkOTA1MCksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDVkZmU0N2FkKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2ZmFkZjJmYyksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdmZTZiY2IwKSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzQzZTA5MTgpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDY0ODU0M2U0KSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0ZjNlNzg3NSksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4MzU5NmE0NmMpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHhmYWY5ODhjYiksIFNUQygweGViZjlmNDk3KSwgU1RDKDB4ZGQ0MTcwNzgpLCBTVEMoMHhjZjA0M2FiMiksIFNUQygweGMxNzRkYmYxKSwKLSAgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZWY0YWVhZjApLCBTVEMoMHhkZWRmMDQ3YyksIFNUQygweGNmMDQzYWIyKSwgU1RDKDB4YmZmZmZmZmYpLCBTVEMoMHhiMjE0MWIwMSksIFNUQygweGE1N2Q4NjY1KSwgU1RDKDB4OWE3MzY1ZDIpLAotICBTVEMoMHgxMjVkZjc1YiksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4MzU5NmE0NmMpLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg2YzQwY2YyYyksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdmZmQzMTU0KSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3YTNlMTdmMiksIFNUQygweDczODdlYTIzKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDUxZDkyMzIxKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgzMjg2Zjc3OSksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MGYwYjc3MjcpLCBTVEMoMHhmY2E2M2JkNyksIFNUQygweGVhNTJjMTY1KSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhjNzYzMTU4ZCksIFNUQygweGI3ODAwMDFiKSwgU1RDKDB4YTkxZDBlYTIpLCBTVEMoMHg5Yzg2N2IyYiksIFNUQygweDkxZmVmODdmKSwgU1RDKDB4ODliZTUwYzIpLCBTVEMoMHg4M2YwM2RkNSksCi0gIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4YzVlM2EzYTgpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGE1N2Q4NjY1KSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHg4ZGYzN2Y4YSksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4ODE5MzZkYWUpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDgxOTM2ZGFlKSwKLSAgU1RDKDB4MTVhZDNlOWEpLCBTVEMoMHgyYWJhMmVlNCksIFNUQygweDNlOGIyNDBlKSwgU1RDKDB4NTA4ZDkyMTEpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NzZlMzNiM2YpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdmZTZiY2IwKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YTNlMTdmMiksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NjY4ZjdjMjUpLCBTVEMoMHg1ODFjMDBiMyksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgxZjgxZjM3YyksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4ZjQ0OWFjYzkpLCBTVEMoMHhkZWRmMDQ3YyksIFNUQygweGNhNjk1YjkzKSwgU1RDKDB4Yjc4MDAwMWIpLCBTVEMoMHhhNmFlY2Q1ZCksIFNUQygweDk4NzIyMTkxKSwgU1RDKDB4OGQzMzQ2MjQpLCBTVEMoMHg4NTQ1NjUxOSksIFNUQygweDgwZTMyMWZlKSwgU1RDKDB4ODAyY2U4NGIpLCBTVEMoMHg4MzI3ZmI5YiksIFNUQygweDg5YmU1MGMyKSwgU1RDKDB4OTNiZjMwZDMpLAotICBTVEMoMHgxNzUzN2U2MyksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDczODdlYTIzKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1ODFjMDBiMyksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDAzNTljNDI4KSwgU1RDKDB4ZWJmOWY0OTcpLCBTVEMoMHhkNTQ1ZDExYiksIFNUQygweGJmZmZmZmZmKSwgU1RDKDB4YWNkZWUyZTcpLCBTVEMoMHg5Yzg2N2IyYiksIFNUQygweDhmODJlYmJjKSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg4MTE4NTViMyksIFNUQygweDgwMmNlODRiKSwgU1RDKDB4ODM4OTYxZTcpLCBTVEMoMHg4YjEwZjE0MyksIFNUQygweDk2ODMwODc1KSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHhiNzgwMDAxYiksCi19OwotCi0KLVJBTV9BTElHTgotTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1jb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTAyNFtdID0KLXsKLSAgV1RDUCgweDdmZmZmZDg4LCAweDAwMTkyMWZiKSwgV1RDUCgweDdmZmZlOWNiLCAweDAwNGI2NWVlKSwgV1RDUCgweDdmZmZjMjUxLCAweDAwN2RhOWQ0KSwgV1RDUCgweDdmZmY4NzE5LCAweDAwYWZlZGE4KSwKLSAgV1RDUCgweDdmZmYzODI0LCAweDAwZTIzMTYwKSwgV1RDUCgweDdmZmVkNTcyLCAweDAxMTQ3NGY2KSwgV1RDUCgweDdmZmU1ZjAzLCAweDAxNDZiODYwKSwgV1RDUCgweDdmZmRkNGQ3LCAweDAxNzhmYjk5KSwKLSAgV1RDUCgweDdmZmQzNmVlLCAweDAxYWIzZTk3KSwgV1RDUCgweDdmZmM4NTQ5LCAweDAxZGQ4MTU0KSwgV1RDUCgweDdmZmJiZmU2LCAweDAyMGZjM2M2KSwgV1RDUCgweDdmZmFlNmM3LCAweDAyNDIwNWU4KSwKLSAgV1RDUCgweDdmZjlmOWVjLCAweDAyNzQ0N2IwKSwgV1RDUCgweDdmZjhmOTU0LCAweDAyYTY4OTE3KSwgV1RDUCgweDdmZjdlNTAwLCAweDAyZDhjYTE2KSwgV1RDUCgweDdmZjZiY2YwLCAweDAzMGIwYWE0KSwKLSAgV1RDUCgweDdmZjU4MTI1LCAweDAzM2Q0YWJiKSwgV1RDUCgweDdmZjQzMTlkLCAweDAzNmY4YTUxKSwgV1RDUCgweDdmZjJjZTViLCAweDAzYTFjOTYwKSwgV1RDUCgweDdmZjE1NzVkLCAweDAzZDQwN2RmKSwKLSAgV1RDUCgweDdmZWZjY2E0LCAweDA0MDY0NWM3KSwgV1RDUCgweDdmZWUyZTMwLCAweDA0Mzg4MzEwKSwgV1RDUCgweDdmZWM3YzAyLCAweDA0NmFiZmIzKSwgV1RDUCgweDdmZWFiNjFhLCAweDA0OWNmYmE3KSwKLSAgV1RDUCgweDdmZThkYzc4LCAweDA0Y2YzNmU1KSwgV1RDUCgweDdmZTZlZjFjLCAweDA1MDE3MTY1KSwgV1RDUCgweDdmZTRlZTA2LCAweDA1MzNhYjIwKSwgV1RDUCgweDdmZTJkOTM4LCAweDA1NjVlNDBkKSwKLSAgV1RDUCgweDdmZTBiMGIxLCAweDA1OTgxYzI2KSwgV1RDUCgweDdmZGU3NDcxLCAweDA1Y2E1MzYxKSwgV1RDUCgweDdmZGMyNDdhLCAweDA1ZmM4OWI4KSwgV1RDUCgweDdmZDljMGNhLCAweDA2MmViZjIyKSwKLSAgV1RDUCgweDdmZDc0OTY0LCAweDA2NjBmMzk4KSwgV1RDUCgweDdmZDRiZTQ2LCAweDA2OTMyNzEzKSwgV1RDUCgweDdmZDIxZjcyLCAweDA2YzU1OThhKSwgV1RDUCgweDdmY2Y2Y2U4LCAweDA2Zjc4YWY2KSwKLSAgV1RDUCgweDdmY2NhNmE3LCAweDA3MjliYjRlKSwgV1RDUCgweDdmYzljY2IyLCAweDA3NWJlYThjKSwgV1RDUCgweDdmYzZkZjA4LCAweDA3OGUxOGE3KSwgV1RDUCgweDdmYzNkZGE5LCAweDA3YzA0NTk4KSwKLSAgV1RDUCgweDdmYzBjODk2LCAweDA3ZjI3MTU3KSwgV1RDUCgweDdmYmQ5ZmQwLCAweDA4MjQ5YmRkKSwgV1RDUCgweDdmYmE2MzU3LCAweDA4NTZjNTIwKSwgV1RDUCgweDdmYjcxMzJiLCAweDA4ODhlZDFiKSwKLSAgV1RDUCgweDdmYjNhZjRlLCAweDA4YmIxM2M1KSwgV1RDUCgweDdmYjAzN2JmLCAweDA4ZWQzOTE2KSwgV1RDUCgweDdmYWNhYzdmLCAweDA5MWY1ZDA2KSwgV1RDUCgweDdmYTkwZDhlLCAweDA5NTE3ZjhmKSwKLSAgV1RDUCgweDdmYTU1YWVlLCAweDA5ODNhMGE3KSwgV1RDUCgweDdmYTE5NDllLCAweDA5YjVjMDQ4KSwgV1RDUCgweDdmOWRiYWEwLCAweDA5ZTdkZTZhKSwgV1RDUCgweDdmOTljY2Y0LCAweDBhMTlmYjA0KSwKLSAgV1RDUCgweDdmOTVjYjlhLCAweDBhNGMxNjEwKSwgV1RDUCgweDdmOTFiNjk0LCAweDBhN2UyZjg1KSwgV1RDUCgweDdmOGQ4ZGUxLCAweDBhYjA0NzVjKSwgV1RDUCgweDdmODk1MTgyLCAweDBhZTI1ZDhkKSwKLSAgV1RDUCgweDdmODUwMTc5LCAweDBiMTQ3MjExKSwgV1RDUCgweDdmODA5ZGM1LCAweDBiNDY4NGRmKSwgV1RDUCgweDdmN2MyNjY4LCAweDBiNzg5NWYwKSwgV1RDUCgweDdmNzc5YjYyLCAweDBiYWFhNTNiKSwKLSAgV1RDUCgweDdmNzJmY2I0LCAweDBiZGNiMmJiKSwgV1RDUCgweDdmNmU0YTVlLCAweDBjMGViZTY2KSwgV1RDUCgweDdmNjk4NDYxLCAweDBjNDBjODM1KSwgV1RDUCgweDdmNjRhYWJmLCAweDBjNzJkMDIwKSwKLSAgV1RDUCgweDdmNWZiZDc3LCAweDBjYTRkNjIwKSwgV1RDUCgweDdmNWFiYzhhLCAweDBjZDZkYTJkKSwgV1RDUCgweDdmNTVhN2ZhLCAweDBkMDhkYzNmKSwgV1RDUCgweDdmNTA3ZmM3LCAweDBkM2FkYzRlKSwKLSAgV1RDUCgweDdmNGI0M2YyLCAweDBkNmNkYTUzKSwgV1RDUCgweDdmNDVmNDdiLCAweDBkOWVkNjQ2KSwgV1RDUCgweDdmNDA5MTY0LCAweDBkZDBkMDFmKSwgV1RDUCgweDdmM2IxYWFkLCAweDBlMDJjN2Q3KSwKLSAgV1RDUCgweDdmMzU5MDU3LCAweDBlMzRiZDY2KSwgV1RDUCgweDdmMmZmMjYzLCAweDBlNjZiMGMzKSwgV1RDUCgweDdmMmE0MGQyLCAweDBlOThhMWU5KSwgV1RDUCgweDdmMjQ3YmE1LCAweDBlY2E5MGNlKSwKLSAgV1RDUCgweDdmMWVhMmRjLCAweDBlZmM3ZDZiKSwgV1RDUCgweDdmMThiNjc5LCAweDBmMmU2N2I4KSwgV1RDUCgweDdmMTJiNjdjLCAweDBmNjA0ZmFmKSwgV1RDUCgweDdmMGNhMmU3LCAweDBmOTIzNTQ2KSwKLSAgV1RDUCgweDdmMDY3YmJhLCAweDBmYzQxODc2KSwgV1RDUCgweDdmMDA0MGY2LCAweDBmZjVmOTM4KSwgV1RDUCgweDdlZjlmMjlkLCAweDEwMjdkNzg0KSwgV1RDUCgweDdlZjM5MGFlLCAweDEwNTliMzUyKSwKLSAgV1RDUCgweDdlZWQxYjJjLCAweDEwOGI4YzliKSwgV1RDUCgweDdlZTY5MjE3LCAweDEwYmQ2MzU2KSwgV1RDUCgweDdlZGZmNTcwLCAweDEwZWYzNzdkKSwgV1RDUCgweDdlZDk0NTM4LCAweDExMjEwOTA3KSwKLSAgV1RDUCgweDdlZDI4MTcxLCAweDExNTJkN2VkKSwgV1RDUCgweDdlY2JhYTFhLCAweDExODRhNDI3KSwgV1RDUCgweDdlYzRiZjM2LCAweDExYjY2ZGFkKSwgV1RDUCgweDdlYmRjMGM2LCAweDExZTgzNDc4KSwKLSAgV1RDUCgweDdlYjZhZWNhLCAweDEyMTlmODgwKSwgV1RDUCgweDdlYWY4OTQzLCAweDEyNGJiOWJlKSwgV1RDUCgweDdlYTg1MDMzLCAweDEyN2Q3ODI5KSwgV1RDUCgweDdlYTEwMzliLCAweDEyYWYzM2JhKSwKLSAgV1RDUCgweDdlOTlhMzdjLCAweDEyZTBlYzZhKSwgV1RDUCgweDdlOTIyZmQ2LCAweDEzMTJhMjMwKSwgV1RDUCgweDdlOGFhOGFjLCAweDEzNDQ1NTA1KSwgV1RDUCgweDdlODMwZGZmLCAweDEzNzYwNGUyKSwKLSAgV1RDUCgweDdlN2I1ZmNlLCAweDEzYTdiMWJmKSwgV1RDUCgweDdlNzM5ZTFkLCAweDEzZDk1YjkzKSwgV1RDUCgweDdlNmJjOGViLCAweDE0MGIwMjU4KSwgV1RDUCgweDdlNjNlMDNiLCAweDE0M2NhNjA1KSwKLSAgV1RDUCgweDdlNWJlNDBjLCAweDE0NmU0Njk0KSwgV1RDUCgweDdlNTNkNDYyLCAweDE0OWZlM2ZjKSwgV1RDUCgweDdlNGJiMTNjLCAweDE0ZDE3ZTM2KSwgV1RDUCgweDdlNDM3YTljLCAweDE1MDMxNTNhKSwKLSAgV1RDUCgweDdlM2IzMDgzLCAweDE1MzRhOTAxKSwgV1RDUCgweDdlMzJkMmY0LCAweDE1NjYzOTgyKSwgV1RDUCgweDdlMmE2MWVkLCAweDE1OTdjNmI3KSwgV1RDUCgweDdlMjFkZDczLCAweDE1Yzk1MDk3KSwKLSAgV1RDUCgweDdlMTk0NTg0LCAweDE1ZmFkNzFiKSwgV1RDUCgweDdlMTA5YTI0LCAweDE2MmM1YTNiKSwgV1RDUCgweDdlMDdkYjUyLCAweDE2NWRkOWYwKSwgV1RDUCgweDdkZmYwOTExLCAweDE2OGY1NjMyKSwKLSAgV1RDUCgweDdkZjYyMzYyLCAweDE2YzBjZWY5KSwgV1RDUCgweDdkZWQyYTQ3LCAweDE2ZjI0NDNlKSwgV1RDUCgweDdkZTQxZGMwLCAweDE3MjNiNWY5KSwgV1RDUCgweDdkZGFmZGNlLCAweDE3NTUyNDIyKSwKLSAgV1RDUCgweDdkZDFjYTc1LCAweDE3ODY4ZWIzKSwgV1RDUCgweDdkYzg4M2I0LCAweDE3YjdmNWEzKSwgV1RDUCgweDdkYmYyOThkLCAweDE3ZTk1OGVhKSwgV1RDUCgweDdkYjViYzAyLCAweDE4MWFiODgxKSwKLSAgV1RDUCgweDdkYWMzYjE1LCAweDE4NGMxNDYxKSwgV1RDUCgweDdkYTJhNmM2LCAweDE4N2Q2YzgyKSwgV1RDUCgweDdkOThmZjE3LCAweDE4YWVjMGRiKSwgV1RDUCgweDdkOGY0NDA5LCAweDE4ZTAxMTY3KSwKLSAgV1RDUCgweDdkODU3NTlmLCAweDE5MTE1ZTFjKSwgV1RDUCgweDdkN2I5M2RhLCAweDE5NDJhNmYzKSwgV1RDUCgweDdkNzE5ZWJhLCAweDE5NzNlYmU2KSwgV1RDUCgweDdkNjc5NjQyLCAweDE5YTUyY2ViKSwKLSAgV1RDUCgweDdkNWQ3YTc0LCAweDE5ZDY2OWZjKSwgV1RDUCgweDdkNTM0YjUwLCAweDFhMDdhMzExKSwgV1RDUCgweDdkNDkwOGQ5LCAweDFhMzhkODIzKSwgV1RDUCgweDdkM2ViMzBmLCAweDFhNmEwOTI5KSwKLSAgV1RDUCgweDdkMzQ0OWY1LCAweDFhOWIzNjFkKSwgV1RDUCgweDdkMjljZDhjLCAweDFhY2M1ZWY2KSwgV1RDUCgweDdkMWYzZGQ2LCAweDFhZmQ4M2FkKSwgV1RDUCgweDdkMTQ5YWQ1LCAweDFiMmVhNDNhKSwKLSAgV1RDUCgweDdkMDllNDg5LCAweDFiNWZjMDk3KSwgV1RDUCgweDdjZmYxYWY1LCAweDFiOTBkOGJiKSwgV1RDUCgweDdjZjQzZTFhLCAweDFiYzFlYzllKSwgV1RDUCgweDdjZTk0ZGZiLCAweDFiZjJmYzNhKSwKLSAgV1RDUCgweDdjZGU0YTk4LCAweDFjMjQwNzg2KSwgV1RDUCgweDdjZDMzM2YzLCAweDFjNTUwZTdjKSwgV1RDUCgweDdjYzgwYTBmLCAweDFjODYxMTEzKSwgV1RDUCgweDdjYmNjY2VjLCAweDFjYjcwZjQzKSwKLSAgV1RDUCgweDdjYjE3YzhkLCAweDFjZTgwOTA2KSwgV1RDUCgweDdjYTYxOGYzLCAweDFkMThmZTU0KSwgV1RDUCgweDdjOWFhMjIxLCAweDFkNDllZjI2KSwgV1RDUCgweDdjOGYxODE3LCAweDFkN2FkYjczKSwKLSAgV1RDUCgweDdjODM3YWQ4LCAweDFkYWJjMzM0KSwgV1RDUCgweDdjNzdjYTY1LCAweDFkZGNhNjYyKSwgV1RDUCgweDdjNmMwNmMwLCAweDFlMGQ4NGY1KSwgV1RDUCgweDdjNjAyZmVjLCAweDFlM2U1ZWU1KSwKLSAgV1RDUCgweDdjNTQ0NWU5LCAweDFlNmYzNDJjKSwgV1RDUCgweDdjNDg0OGJhLCAweDFlYTAwNGMxKSwgV1RDUCgweDdjM2MzODYwLCAweDFlZDBkMDlkKSwgV1RDUCgweDdjMzAxNGRlLCAweDFmMDE5N2I4KSwKLSAgV1RDUCgweDdjMjNkZTM1LCAweDFmMzI1YTBiKSwgV1RDUCgweDdjMTc5NDY3LCAweDFmNjMxNzhmKSwgV1RDUCgweDdjMGIzNzc3LCAweDFmOTNkMDNjKSwgV1RDUCgweDdiZmVjNzY1LCAweDFmYzQ4NDBhKSwKLSAgV1RDUCgweDdiZjI0NDM0LCAweDFmZjUzMmYyKSwgV1RDUCgweDdiZTVhZGU2LCAweDIwMjVkY2VjKSwgV1RDUCgweDdiZDkwNDdjLCAweDIwNTY4MWYxKSwgV1RDUCgweDdiY2M0N2ZhLCAweDIwODcyMWY5KSwKLSAgV1RDUCgweDdiYmY3ODYwLCAweDIwYjdiY2ZlKSwgV1RDUCgweDdiYjI5NWIwLCAweDIwZTg1MmY2KSwgV1RDUCgweDdiYTU5ZmVlLCAweDIxMThlM2RjKSwgV1RDUCgweDdiOTg5NzE5LCAweDIxNDk2ZmE3KSwKLSAgV1RDUCgweDdiOGI3YjM2LCAweDIxNzlmNjRmKSwgV1RDUCgweDdiN2U0YzQ1LCAweDIxYWE3N2NmKSwgV1RDUCgweDdiNzEwYTQ5LCAweDIxZGFmNDFkKSwgV1RDUCgweDdiNjNiNTQzLCAweDIyMGI2YjMyKSwKLSAgV1RDUCgweDdiNTY0ZDM2LCAweDIyM2JkZDA4KSwgV1RDUCgweDdiNDhkMjI1LCAweDIyNmM0OTk2KSwgV1RDUCgweDdiM2I0NDEwLCAweDIyOWNiMGQ1KSwgV1RDUCgweDdiMmRhMmZhLCAweDIyY2QxMmJkKSwKLSAgV1RDUCgweDdiMWZlZWU1LCAweDIyZmQ2ZjQ4KSwgV1RDUCgweDdiMTIyN2QzLCAweDIzMmRjNjZkKSwgV1RDUCgweDdiMDQ0ZGM3LCAweDIzNWUxODI2KSwgV1RDUCgweDdhZjY2MGMyLCAweDIzOGU2NDZhKSwKLSAgV1RDUCgweDdhZTg2MGM3LCAweDIzYmVhYjMzKSwgV1RDUCgweDdhZGE0ZGQ4LCAweDIzZWVlYzc4KSwgV1RDUCgweDdhY2MyN2Y3LCAweDI0MWYyODMzKSwgV1RDUCgweDdhYmRlZjI1LCAweDI0NGY1ZTVjKSwKLSAgV1RDUCgweDdhYWZhMzY3LCAweDI0N2Y4ZWVjKSwgV1RDUCgweDdhYTE0NGJjLCAweDI0YWZiOWRhKSwgV1RDUCgweDdhOTJkMzI5LCAweDI0ZGZkZjIwKSwgV1RDUCgweDdhODQ0ZWFlLCAweDI1MGZmZWI3KSwKLSAgV1RDUCgweDdhNzViNzRmLCAweDI1NDAxODk2KSwgV1RDUCgweDdhNjcwZDBkLCAweDI1NzAyY2I3KSwgV1RDUCgweDdhNTg0ZmViLCAweDI1YTAzYjExKSwgV1RDUCgweDdhNDk3ZmViLCAweDI1ZDA0MzlmKSwKLSAgV1RDUCgweDdhM2E5ZDBmLCAweDI2MDA0NjU3KSwgV1RDUCgweDdhMmJhNzVhLCAweDI2MzA0MzMzKSwgV1RDUCgweDdhMWM5ZWNlLCAweDI2NjAzYTJjKSwgV1RDUCgweDdhMGQ4MzZkLCAweDI2OTAyYjM5KSwKLSAgV1RDUCgweDc5ZmU1NTM5LCAweDI2YzAxNjU1KSwgV1RDUCgweDc5ZWYxNDM2LCAweDI2ZWZmYjc2KSwgV1RDUCgweDc5ZGZjMDY0LCAweDI3MWZkYTk2KSwgV1RDUCgweDc5ZDA1OWM4LCAweDI3NGZiM2FlKSwKLSAgV1RDUCgweDc5YzBlMDYyLCAweDI3N2Y4NmI1KSwgV1RDUCgweDc5YjE1NDM1LCAweDI3YWY1M2E2KSwgV1RDUCgweDc5YTFiNTQ1LCAweDI3ZGYxYTc3KSwgV1RDUCgweDc5OTIwMzkyLCAweDI4MGVkYjIzKSwKLSAgV1RDUCgweDc5ODIzZjIwLCAweDI4M2U5NWExKSwgV1RDUCgweDc5NzI2N2YyLCAweDI4NmU0OWVhKSwgV1RDUCgweDc5NjI3ZTA4LCAweDI4OWRmN2Y4KSwgV1RDUCgweDc5NTI4MTY3LCAweDI4Y2Q5ZmMxKSwKLSAgV1RDUCgweDc5NDI3MjEwLCAweDI4ZmQ0MTQwKSwgV1RDUCgweDc5MzI1MDA2LCAweDI5MmNkYzZkKSwgV1RDUCgweDc5MjIxYjRiLCAweDI5NWM3MTQwKSwgV1RDUCgweDc5MTFkM2UyLCAweDI5OGJmZmIyKSwKLSAgV1RDUCgweDc5MDE3OWNkLCAweDI5YmI4N2JjKSwgV1RDUCgweDc4ZjEwZDBmLCAweDI5ZWIwOTU3KSwgV1RDUCgweDc4ZTA4ZGFiLCAweDJhMWE4NDdiKSwgV1RDUCgweDc4Y2ZmYmEzLCAweDJhNDlmOTIwKSwKLSAgV1RDUCgweDc4YmY1NmY5LCAweDJhNzk2NzQwKSwgV1RDUCgweDc4YWU5ZmIwLCAweDJhYThjZWQzKSwgV1RDUCgweDc4OWRkNWNiLCAweDJhZDgyZmQyKSwgV1RDUCgweDc4OGNmOTRjLCAweDJiMDc4YTM2KSwKLSAgV1RDUCgweDc4N2MwYTM2LCAweDJiMzZkZGY3KSwgV1RDUCgweDc4NmIwODhjLCAweDJiNjYyYjBlKSwgV1RDUCgweDc4NTlmNDRmLCAweDJiOTU3MTczKSwgV1RDUCgweDc4NDhjZDgzLCAweDJiYzRiMTIwKSwKLSAgV1RDUCgweDc4Mzc5NDJiLCAweDJiZjNlYTBkKSwgV1RDUCgweDc4MjY0ODQ5LCAweDJjMjMxYzMzKSwgV1RDUCgweDc4MTRlOWRmLCAweDJjNTI0NzhhKSwgV1RDUCgweDc4MDM3OGYxLCAweDJjODE2YzBjKSwKLSAgV1RDUCgweDc3ZjFmNTgxLCAweDJjYjA4OWIxKSwgV1RDUCgweDc3ZTA1ZjkxLCAweDJjZGZhMDcxKSwgV1RDUCgweDc3Y2ViNzI1LCAweDJkMGViMDQ2KSwgV1RDUCgweDc3YmNmYzNmLCAweDJkM2RiOTI4KSwKLSAgV1RDUCgweDc3YWIyZWUyLCAweDJkNmNiYjEwKSwgV1RDUCgweDc3OTk0ZjExLCAweDJkOWJiNWY2KSwgV1RDUCgweDc3ODc1Y2NlLCAweDJkY2FhOWQ1KSwgV1RDUCgweDc3NzU1ODFkLCAweDJkZjk5NmEzKSwKLSAgV1RDUCgweDc3NjM0MGZmLCAweDJlMjg3YzVhKSwgV1RDUCgweDc3NTExNzc4LCAweDJlNTc1YWYzKSwgV1RDUCgweDc3M2VkYjhiLCAweDJlODYzMjY3KSwgV1RDUCgweDc3MmM4ZDNhLCAweDJlYjUwMmFlKSwKLSAgV1RDUCgweDc3MWEyYzg4LCAweDJlZTNjYmMxKSwgV1RDUCgweDc3MDdiOTc5LCAweDJmMTI4ZDk5KSwgV1RDUCgweDc2ZjUzNDBlLCAweDJmNDE0ODJlKSwgV1RDUCgweDc2ZTI5YzRiLCAweDJmNmZmYjdhKSwKLSAgV1RDUCgweDc2Y2ZmMjMyLCAweDJmOWVhNzc1KSwgV1RDUCgweDc2YmQzNWM3LCAweDJmY2Q0YzE5KSwgV1RDUCgweDc2YWE2NzBkLCAweDJmZmJlOTVkKSwgV1RDUCgweDc2OTc4NjA1LCAweDMwMmE3ZjNhKSwKLSAgV1RDUCgweDc2ODQ5MmI0LCAweDMwNTkwZGFiKSwgV1RDUCgweDc2NzE4ZDFjLCAweDMwODc5NGE2KSwgV1RDUCgweDc2NWU3NTQwLCAweDMwYjYxNDI2KSwgV1RDUCgweDc2NGI0YjIzLCAweDMwZTQ4YzIyKSwKLSAgV1RDUCgweDc2MzgwZWM4LCAweDMxMTJmYzk1KSwgV1RDUCgweDc2MjRjMDMxLCAweDMxNDE2NTc2KSwgV1RDUCgweDc2MTE1ZjYzLCAweDMxNmZjNmJlKSwgV1RDUCgweDc1ZmRlYzYwLCAweDMxOWUyMDY3KSwKLSAgV1RDUCgweDc1ZWE2NzJhLCAweDMxY2M3MjY5KSwgV1RDUCgweDc1ZDZjZmM1LCAweDMxZmFiY2JkKSwgV1RDUCgweDc1YzMyNjM0LCAweDMyMjhmZjVjKSwgV1RDUCgweDc1YWY2YTdiLCAweDMyNTczYTNmKSwKLSAgV1RDUCgweDc1OWI5YzliLCAweDMyODU2ZDVlKSwgV1RDUCgweDc1ODdiYzk4LCAweDMyYjM5OGIzKSwgV1RDUCgweDc1NzNjYTc1LCAweDMyZTFiYzM2KSwgV1RDUCgweDc1NWZjNjM1LCAweDMzMGZkN2UxKSwKLSAgV1RDUCgweDc1NGJhZmRjLCAweDMzM2RlYmFiKSwgV1RDUCgweDc1Mzc4NzZjLCAweDMzNmJmNzhmKSwgV1RDUCgweDc1MjM0Y2U4LCAweDMzOTlmYjg1KSwgV1RDUCgweDc1MGYwMDU0LCAweDMzYzdmNzg1KSwKLSAgV1RDUCgweDc0ZmFhMWIzLCAweDMzZjVlYjg5KSwgV1RDUCgweDc0ZTYzMTA4LCAweDM0MjNkNzhhKSwgV1RDUCgweDc0ZDFhZTU1LCAweDM0NTFiYjgxKSwgV1RDUCgweDc0YmQxOTlmLCAweDM0N2Y5NzY2KSwKLSAgV1RDUCgweDc0YTg3MmU4LCAweDM0YWQ2YjMyKSwgV1RDUCgweDc0OTNiYTM0LCAweDM0ZGIzNmRmKSwgV1RDUCgweDc0N2VlZjg1LCAweDM1MDhmYTY2KSwgV1RDUCgweDc0NmExMmRmLCAweDM1MzZiNWJlKSwKLSAgV1RDUCgweDc0NTUyNDQ2LCAweDM1NjQ2OGUyKSwgV1RDUCgweDc0NDAyM2JjLCAweDM1OTIxM2M5KSwgV1RDUCgweDc0MmIxMTQ0LCAweDM1YmZiNjZlKSwgV1RDUCgweDc0MTVlY2UyLCAweDM1ZWQ1MGM5KSwKLSAgV1RDUCgweDc0MDBiNjlhLCAweDM2MWFlMmQzKSwgV1RDUCgweDczZWI2ZTZlLCAweDM2NDg2Yzg2KSwgV1RDUCgweDczZDYxNDYxLCAweDM2NzVlZGQ5KSwgV1RDUCgweDczYzBhODc4LCAweDM2YTM2NmM2KSwKLSAgV1RDUCgweDczYWIyYWI0LCAweDM2ZDBkNzQ2KSwgV1RDUCgweDczOTU5YjFiLCAweDM2ZmUzZjUyKSwgV1RDUCgweDczN2ZmOWFlLCAweDM3MmI5ZWUzKSwgV1RDUCgweDczNmE0NjcxLCAweDM3NThmNWYyKSwKLSAgV1RDUCgweDczNTQ4MTY4LCAweDM3ODY0NDc3KSwgV1RDUCgweDczM2VhYTk2LCAweDM3YjM4YTZkKSwgV1RDUCgweDczMjhjMWZmLCAweDM3ZTBjN2NjKSwgV1RDUCgweDczMTJjN2E1LCAweDM4MGRmYzhkKSwKLSAgV1RDUCgweDcyZmNiYjhjLCAweDM4M2IyOGE5KSwgV1RDUCgweDcyZTY5ZGI3LCAweDM4Njg0YzE5KSwgV1RDUCgweDcyZDA2ZTJiLCAweDM4OTU2NmQ2KSwgV1RDUCgweDcyYmEyY2VhLCAweDM4YzI3OGQ5KSwKLSAgV1RDUCgweDcyYTNkOWY3LCAweDM4ZWY4MjFjKSwgV1RDUCgweDcyOGQ3NTU3LCAweDM5MWM4Mjk3KSwgV1RDUCgweDcyNzZmZjBkLCAweDM5NDk3YTQzKSwgV1RDUCgweDcyNjA3NzFiLCAweDM5NzY2OTE5KSwKLSAgV1RDUCgweDcyNDlkZDg2LCAweDM5YTM0ZjEzKSwgV1RDUCgweDcyMzMzMjUxLCAweDM5ZDAyYzJhKSwgV1RDUCgweDcyMWM3NTgwLCAweDM5ZmQwMDU2KSwgV1RDUCgweDcyMDVhNzE2LCAweDNhMjljYjkxKSwKLSAgV1RDUCgweDcxZWVjNzE2LCAweDNhNTY4ZGQ0KSwgV1RDUCgweDcxZDdkNTg1LCAweDNhODM0NzE3KSwgV1RDUCgweDcxYzBkMjY1LCAweDNhYWZmNzU1KSwgV1RDUCgweDcxYTliZGJhLCAweDNhZGM5ZTg2KSwKLSAgV1RDUCgweDcxOTI5Nzg5LCAweDNiMDkzY2EzKSwgV1RDUCgweDcxN2I1ZmQzLCAweDNiMzVkMWE1KSwgV1RDUCgweDcxNjQxNjlkLCAweDNiNjI1ZDg2KSwgV1RDUCgweDcxNGNiYmViLCAweDNiOGVlMDNlKSwKLSAgV1RDUCgweDcxMzU0ZmMwLCAweDNiYmI1OWM3KSwgV1RDUCgweDcxMWRkMjIwLCAweDNiZTdjYTFhKSwgV1RDUCgweDcxMDY0MzBlLCAweDNjMTQzMTMwKSwgV1RDUCgweDcwZWVhMjhlLCAweDNjNDA4ZjAzKSwKLSAgV1RDUCgweDcwZDZmMGE0LCAweDNjNmNlMzhhKSwgV1RDUCgweDcwYmYyZDUzLCAweDNjOTkyZWMwKSwgV1RDUCgweDcwYTc1ODlmLCAweDNjYzU3MDllKSwgV1RDUCgweDcwOGY3MjhiLCAweDNjZjFhOTFjKSwKLSAgV1RDUCgweDcwNzc3YjFjLCAweDNkMWRkODM1KSwgV1RDUCgweDcwNWY3MjU1LCAweDNkNDlmZGUxKSwgV1RDUCgweDcwNDc1ODM5LCAweDNkNzYxYTE5KSwgV1RDUCgweDcwMmYyY2NkLCAweDNkYTIyY2Q3KSwKLSAgV1RDUCgweDcwMTZmMDE0LCAweDNkY2UzNjE0KSwgV1RDUCgweDZmZmVhMjEyLCAweDNkZmEzNWM4KSwgV1RDUCgweDZmZTY0MmNhLCAweDNlMjYyYmVlKSwgV1RDUCgweDZmY2RkMjQxLCAweDNlNTIxODdmKSwKLSAgV1RDUCgweDZmYjU1MDdhLCAweDNlN2RmYjczKSwgV1RDUCgweDZmOWNiZDc5LCAweDNlYTlkNGMzKSwgV1RDUCgweDZmODQxOTQyLCAweDNlZDVhNDZiKSwgV1RDUCgweDZmNmI2M2Q4LCAweDNmMDE2YTYxKSwKLSAgV1RDUCgweDZmNTI5ZDQwLCAweDNmMmQyNmEwKSwgV1RDUCgweDZmMzljNTdkLCAweDNmNThkOTIxKSwgV1RDUCgweDZmMjBkYzkyLCAweDNmODQ4MWRkKSwgV1RDUCgweDZmMDdlMjg1LCAweDNmYjAyMGNlKSwKLSAgV1RDUCgweDZlZWVkNzU4LCAweDNmZGJiNWVjKSwgV1RDUCgweDZlZDViYjEwLCAweDQwMDc0MTMyKSwgV1RDUCgweDZlYmM4ZGIwLCAweDQwMzJjMjk3KSwgV1RDUCgweDZlYTM0ZjNkLCAweDQwNWUzYTE2KSwKLSAgV1RDUCgweDZlODlmZmI5LCAweDQwODlhN2E4KSwgV1RDUCgweDZlNzA5ZjJhLCAweDQwYjUwYjQ2KSwgV1RDUCgweDZlNTcyZDkzLCAweDQwZTA2NGVhKSwgV1RDUCgweDZlM2RhYWY4LCAweDQxMGJiNDhjKSwKLSAgV1RDUCgweDZlMjQxNzVjLCAweDQxMzZmYTI3KSwgV1RDUCgweDZlMGE3MmM1LCAweDQxNjIzNWIyKSwgV1RDUCgweDZkZjBiZDM1LCAweDQxOGQ2NzI5KSwgV1RDUCgweDZkZDZmNmIxLCAweDQxYjg4ZTg0KSwKLSAgV1RDUCgweDZkYmQxZjNjLCAweDQxZTNhYmJjKSwgV1RDUCgweDZkYTMzNmRjLCAweDQyMGViZWNiKSwgV1RDUCgweDZkODkzZDkzLCAweDQyMzljN2FhKSwgV1RDUCgweDZkNmYzMzY1LCAweDQyNjRjNjUzKSwKLSAgV1RDUCgweDZkNTUxODU4LCAweDQyOGZiYWJlKSwgV1RDUCgweDZkM2FlYzZlLCAweDQyYmFhNGU2KSwgV1RDUCgweDZkMjBhZmFjLCAweDQyZTU4NGMzKSwgV1RDUCgweDZkMDY2MjE1LCAweDQzMTA1YTUwKSwKLSAgV1RDUCgweDZjZWMwM2FmLCAweDQzM2IyNTg1KSwgV1RDUCgweDZjZDE5NDdjLCAweDQzNjVlNjViKSwgV1RDUCgweDZjYjcxNDgyLCAweDQzOTA5Y2NkKSwgV1RDUCgweDZjOWM4M2MzLCAweDQzYmI0OGQ0KSwKLSAgV1RDUCgweDZjODFlMjQ1LCAweDQzZTVlYTY4KSwgV1RDUCgweDZjNjczMDBiLCAweDQ0MTA4MTg0KSwgV1RDUCgweDZjNGM2ZDFhLCAweDQ0M2IwZTIxKSwgV1RDUCgweDZjMzE5OTc1LCAweDQ0NjU5MDM5KSwKLSAgV1RDUCgweDZjMTZiNTIxLCAweDQ0OTAwN2M0KSwgV1RDUCgweDZiZmJjMDIxLCAweDQ0YmE3NGJkKSwgV1RDUCgweDZiZTBiYTdiLCAweDQ0ZTRkNzFjKSwgV1RDUCgweDZiYzVhNDMxLCAweDQ1MGYyZWRiKSwKLSAgV1RDUCgweDZiYWE3ZDQ5LCAweDQ1Mzk3YmY0KSwgV1RDUCgweDZiOGY0NWM3LCAweDQ1NjNiZTYwKSwgV1RDUCgweDZiNzNmZGFlLCAweDQ1OGRmNjE5KSwgV1RDUCgweDZiNThhNTAzLCAweDQ1YjgyMzE4KSwKLSAgV1RDUCgweDZiM2QzYmNiLCAweDQ1ZTI0NTU2KSwgV1RDUCgweDZiMjFjMjA4LCAweDQ2MGM1Y2NlKSwgV1RDUCgweDZiMDYzN2MxLCAweDQ2MzY2OTc4KSwgV1RDUCgweDZhZWE5Y2Y4LCAweDQ2NjA2YjRlKSwKLSAgV1RDUCgweDZhY2VmMWIyLCAweDQ2OGE2MjRhKSwgV1RDUCgweDZhYjMzNWY0LCAweDQ2YjQ0ZTY1KSwgV1RDUCgweDZhOTc2OWMxLCAweDQ2ZGUyZjk5KSwgV1RDUCgweDZhN2I4ZDFlLCAweDQ3MDgwNWRmKSwKLSAgV1RDUCgweDZhNWZhMDEwLCAweDQ3MzFkMTMxKSwgV1RDUCgweDZhNDNhMjlhLCAweDQ3NWI5MTg4KSwgV1RDUCgweDZhMjc5NGMxLCAweDQ3ODU0NmRlKSwgV1RDUCgweDZhMGI3Njg5LCAweDQ3YWVmMTJjKSwKLSAgV1RDUCgweDY5ZWY0N2Y2LCAweDQ3ZDg5MDZkKSwgV1RDUCgweDY5ZDMwOTBlLCAweDQ4MDIyNDk5KSwgV1RDUCgweDY5YjZiOWQzLCAweDQ4MmJhZGFiKSwgV1RDUCgweDY5OWE1YTRjLCAweDQ4NTUyYjliKSwKLSAgV1RDUCgweDY5N2RlYTdiLCAweDQ4N2U5ZTY0KSwgV1RDUCgweDY5NjE2YTY1LCAweDQ4YTgwNWZmKSwgV1RDUCgweDY5NDRkYTEwLCAweDQ4ZDE2MjY1KSwgV1RDUCgweDY5MjgzOTdlLCAweDQ4ZmFiMzkxKSwKLSAgV1RDUCgweDY5MGI4OGI1LCAweDQ5MjNmOTdiKSwgV1RDUCgweDY4ZWVjN2I5LCAweDQ5NGQzNDFlKSwgV1RDUCgweDY4ZDFmNjhmLCAweDQ5NzY2MzczKSwgV1RDUCgweDY4YjUxNTNhLCAweDQ5OWY4Nzc0KSwKLSAgV1RDUCgweDY4OTgyM2JmLCAweDQ5YzhhMDFiKSwgV1RDUCgweDY4N2IyMjI0LCAweDQ5ZjFhZDYxKSwgV1RDUCgweDY4NWUxMDZjLCAweDRhMWFhZjNmKSwgV1RDUCgweDY4NDBlZTliLCAweDRhNDNhNWIwKSwKLSAgV1RDUCgweDY4MjNiY2I3LCAweDRhNmM5MGFkKSwgV1RDUCgweDY4MDY3YWMzLCAweDRhOTU3MDMwKSwgV1RDUCgweDY3ZTkyOGM1LCAweDRhYmU0NDMzKSwgV1RDUCgweDY3Y2JjNmMwLCAweDRhZTcwY2FmKSwKLSAgV1RDUCgweDY3YWU1NGJhLCAweDRiMGZjOTlkKSwgV1RDUCgweDY3OTBkMmI2LCAweDRiMzg3YWY5KSwgV1RDUCgweDY3NzM0MGJhLCAweDRiNjEyMGJiKSwgV1RDUCgweDY3NTU5ZWNhLCAweDRiODliYWRkKSwKLSAgV1RDUCgweDY3MzdlY2VhLCAweDRiYjI0OTU4KSwgV1RDUCgweDY3MWEyYjIwLCAweDRiZGFjYzI4KSwgV1RDUCgweDY2ZmM1OTZmLCAweDRjMDM0MzQ1KSwgV1RDUCgweDY2ZGU3N2RjLCAweDRjMmJhZWE5KSwKLSAgV1RDUCgweDY2YzA4NjZkLCAweDRjNTQwZTRlKSwgV1RDUCgweDY2YTI4NTI0LCAweDRjN2M2MjJkKSwgV1RDUCgweDY2ODQ3NDA4LCAweDRjYTRhYTQxKSwgV1RDUCgweDY2NjY1MzFkLCAweDRjY2NlNjg0KSwKLSAgV1RDUCgweDY2NDgyMjY3LCAweDRjZjUxNmVlKSwgV1RDUCgweDY2MjllMWVjLCAweDRkMWQzYjdhKSwgV1RDUCgweDY2MGI5MWFmLCAweDRkNDU1NDIyKSwgV1RDUCgweDY1ZWQzMWI1LCAweDRkNmQ2MGRmKSwKLSAgV1RDUCgweDY1Y2VjMjA0LCAweDRkOTU2MWFjKSwgV1RDUCgweDY1YjA0MjlmLCAweDRkYmQ1NjgyKSwgV1RDUCgweDY1OTFiMzhjLCAweDRkZTUzZjVhKSwgV1RDUCgweDY1NzMxNGNmLCAweDRlMGQxYzMwKSwKLSAgV1RDUCgweDY1NTQ2NjZkLCAweDRlMzRlY2ZjKSwgV1RDUCgweDY1MzVhODZiLCAweDRlNWNiMWI5KSwgV1RDUCgweDY1MTZkYWNkLCAweDRlODQ2YTYwKSwgV1RDUCgweDY0ZjdmZDk4LCAweDRlYWMxNmViKSwKLSAgV1RDUCgweDY0ZDkxMGQxLCAweDRlZDNiNzU1KSwgV1RDUCgweDY0YmExNDdkLCAweDRlZmI0Yjk2KSwgV1RDUCgweDY0OWIwOGEwLCAweDRmMjJkM2FhKSwgV1RDUCgweDY0N2JlZDNmLCAweDRmNGE0Zjg5KSwKLSAgV1RDUCgweDY0NWNjMjYwLCAweDRmNzFiZjJlKSwgV1RDUCgweDY0M2Q4ODA2LCAweDRmOTkyMjkzKSwgV1RDUCgweDY0MWUzZTM4LCAweDRmYzA3OWIxKSwgV1RDUCgweDYzZmVlNGY4LCAweDRmZTdjNDgzKSwKLSAgV1RDUCgweDYzZGY3YzRkLCAweDUwMGYwMzAyKSwgV1RDUCgweDYzYzAwNDNiLCAweDUwMzYzNTI5KSwgV1RDUCgweDYzYTA3Y2M3LCAweDUwNWQ1YWYxKSwgV1RDUCgweDYzODBlNWY2LCAweDUwODQ3NDU0KSwKLSAgV1RDUCgweDYzNjEzZmNkLCAweDUwYWI4MTRkKSwgV1RDUCgweDYzNDE4YTUwLCAweDUwZDI4MWQ1KSwgV1RDUCgweDYzMjFjNTg1LCAweDUwZjk3NWU2KSwgV1RDUCgweDYzMDFmMTcxLCAweDUxMjA1ZDdiKSwKLSAgV1RDUCgweDYyZTIwZTE3LCAweDUxNDczODhjKSwgV1RDUCgweDYyYzIxYjdlLCAweDUxNmUwNzE1KSwgV1RDUCgweDYyYTIxOWFhLCAweDUxOTRjOTEwKSwgV1RDUCgweDYyODIwOGExLCAweDUxYmI3ZTc1KSwKLSAgV1RDUCgweDYyNjFlODY2LCAweDUxZTIyNzQwKSwgV1RDUCgweDYyNDFiOGZmLCAweDUyMDhjMzZhKSwgV1RDUCgweDYyMjE3YTcyLCAweDUyMmY1MmVlKSwgV1RDUCgweDYyMDEyY2MyLCAweDUyNTVkNWM1KSwKLSAgV1RDUCgweDYxZTBjZmY1LCAweDUyN2M0YmVhKSwgV1RDUCgweDYxYzA2NDEwLCAweDUyYTJiNTU2KSwgV1RDUCgweDYxOWZlOTE4LCAweDUyYzkxMjA0KSwgV1RDUCgweDYxN2Y1ZjEyLCAweDUyZWY2MWVlKSwKLSAgV1RDUCgweDYxNWVjNjAzLCAweDUzMTVhNTBlKSwgV1RDUCgweDYxM2UxZGYwLCAweDUzM2JkYjVkKSwgV1RDUCgweDYxMWQ2NmRlLCAweDUzNjIwNGQ3KSwgV1RDUCgweDYwZmNhMGQyLCAweDUzODgyMTc1KSwKLSAgV1RDUCgweDYwZGJjYmQxLCAweDUzYWUzMTMxKSwgV1RDUCgweDYwYmFlN2UxLCAweDUzZDQzNDA2KSwgV1RDUCgweDYwOTlmNTA1LCAweDUzZmEyOWVkKSwgV1RDUCgweDYwNzhmMzQ0LCAweDU0MjAxMmUxKSwKLSAgV1RDUCgweDYwNTdlMmEyLCAweDU0NDVlZWRiKSwgV1RDUCgweDYwMzZjMzI1LCAweDU0NmJiZGQ3KSwgV1RDUCgweDYwMTU5NGQxLCAweDU0OTE3ZmNlKSwgV1RDUCgweDVmZjQ1N2FkLCAweDU0YjczNGJhKSwKLSAgV1RDUCgweDVmZDMwYmJjLCAweDU0ZGNkYzk2KSwgV1RDUCgweDVmYjFiMTA0LCAweDU1MDI3NzVjKSwgV1RDUCgweDVmOTA0NzhhLCAweDU1MjgwNTA1KSwgV1RDUCgweDVmNmVjZjUzLCAweDU1NGQ4NThkKSwKLSAgV1RDUCgweDVmNGQ0ODY1LCAweDU1NzJmOGVkKSwgV1RDUCgweDVmMmJiMmM1LCAweDU1OTg1ZjIwKSwgV1RDUCgweDVmMGEwZTc3LCAweDU1YmRiODFmKSwgV1RDUCgweDVlZTg1YjgyLCAweDU1ZTMwM2U2KSwKLSAgV1RDUCgweDVlYzY5OWU5LCAweDU2MDg0MjZlKSwgV1RDUCgweDVlYTRjOWIzLCAweDU2MmQ3M2IyKSwgV1RDUCgweDVlODJlYWU1LCAweDU2NTI5N2FiKSwgV1RDUCgweDVlNjBmZDg0LCAweDU2NzdhZTU0KSwKLSAgV1RDUCgweDVlM2YwMTk0LCAweDU2OWNiN2E4KSwgV1RDUCgweDVlMWNmNzFjLCAweDU2YzFiM2ExKSwgV1RDUCgweDVkZmFkZTIwLCAweDU2ZTZhMjM5KSwgV1RDUCgweDVkZDhiNmE3LCAweDU3MGI4MzY5KSwKLSAgV1RDUCgweDVkYjY4MGI0LCAweDU3MzA1NzJlKSwgV1RDUCgweDVkOTQzYzRlLCAweDU3NTUxZDgwKSwgV1RDUCgweDVkNzFlOTc5LCAweDU3NzlkNjViKSwgV1RDUCgweDVkNGY4ODNiLCAweDU3OWU4MWI4KSwKLSAgV1RDUCgweDVkMmQxODlhLCAweDU3YzMxZjkyKSwgV1RDUCgweDVkMGE5YTlhLCAweDU3ZTdhZmU0KSwgV1RDUCgweDVjZTgwZTQxLCAweDU4MGMzMmE3KSwgV1RDUCgweDVjYzU3Mzk0LCAweDU4MzBhN2Q2KSwKLSAgV1RDUCgweDVjYTJjYTk5LCAweDU4NTUwZjZjKSwgV1RDUCgweDVjODAxMzU0LCAweDU4Nzk2OTYyKSwgV1RDUCgweDVjNWQ0ZGNjLCAweDU4OWRiNWIzKSwgV1RDUCgweDVjM2E3YTA1LCAweDU4YzFmNDViKSwKLSAgV1RDUCgweDVjMTc5ODA2LCAweDU4ZTYyNTUyKSwgV1RDUCgweDViZjRhN2QyLCAweDU5MGE0ODkzKSwgV1RDUCgweDViZDFhOTcxLCAweDU5MmU1ZTE5KSwgV1RDUCgweDViYWU5Y2U3LCAweDU5NTI2NWRmKSwKLSAgV1RDUCgweDViOGI4MjM5LCAweDU5NzY1ZmRlKSwgV1RDUCgweDViNjg1OTZkLCAweDU5OWE0YzEyKSwgV1RDUCgweDViNDUyMjg4LCAweDU5YmUyYTc0KSwgV1RDUCgweDViMjFkZDkwLCAweDU5ZTFmYWZmKSwKLSAgV1RDUCgweDVhZmU4YThiLCAweDVhMDViZGFlKSwgV1RDUCgweDVhZGIyOTdkLCAweDVhMjk3MjdiKSwgV1RDUCgweDVhYjdiYTZjLCAweDVhNGQxOTYwKSwgV1RDUCgweDVhOTQzZDVlLCAweDVhNzBiMjU4KSwKK2NvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTM4NFtdID0geworICAgIFNUQ1AoMHg3ZmZmZmZmZiwgMHgwMDAwMDAwMCksIFNUQ1AoMHg3ZmZmYjlkMSwgMHgwMDg2MGE3OSksCisgICAgU1RDUCgweDdmZmVlNzQ0LCAweDAxMGMxNDYwKSwgU1RDUCgweDdmZmQ4ODVhLCAweDAxOTIxZDIwKSwKKyAgICBTVENQKDB4N2ZmYjlkMTUsIDB4MDIxODI0MjcpLCBTVENQKDB4N2ZmOTI1NzcsIDB4MDI5ZTI4ZTIpLAorICAgIFNUQ1AoMHg3ZmY2MjE4MiwgMHgwMzI0MmFiZiksIFNUQ1AoMHg3ZmYyOTEzYSwgMHgwM2FhMjkyYSksCisgICAgU1RDUCgweDdmZWU3NGEyLCAweDA0MzAyMzhmKSwgU1RDUCgweDdmZTljYmMwLCAweDA0YjYxOTVkKSwKKyAgICBTVENQKDB4N2ZlNDk2OTgsIDB4MDUzYzBhMDEpLCBTVENQKDB4N2ZkZWQ1MzAsIDB4MDVjMWY0ZTcpLAorICAgIFNUQ1AoMHg3ZmQ4ODc4ZSwgMHgwNjQ3ZDk3YyksIFNUQ1AoMHg3ZmQxYWRiOSwgMHgwNmNkYjcyZiksCisgICAgU1RDUCgweDdmY2E0N2I5LCAweDA3NTM4ZDZiKSwgU1RDUCgweDdmYzI1NTk2LCAweDA3ZDk1YjllKSwKKyAgICBTVENQKDB4N2ZiOWQ3NTksIDB4MDg1ZjIxMzcpLCBTVENQKDB4N2ZiMGNkMGEsIDB4MDhlNGRkYTApLAorICAgIFNUQ1AoMHg3ZmE3MzZiNCwgMHgwOTZhOTA0OSksIFNUQ1AoMHg3ZjlkMTQ2MSwgMHgwOWYwMzg5ZiksCisgICAgU1RDUCgweDdmOTI2NjFkLCAweDBhNzVkNjBlKSwgU1RDUCgweDdmODcyYmYzLCAweDBhZmI2ODA1KSwKKyAgICBTVENQKDB4N2Y3YjY1ZWYsIDB4MGI4MGVkZjEpLCBTVENQKDB4N2Y2ZjE0MWYsIDB4MGMwNjY3NDApLAorICAgIFNUQ1AoMHg3ZjYyMzY4ZiwgMHgwYzhiZDM1ZSksIFNUQ1AoMHg3ZjU0Y2Q0ZiwgMHgwZDExMzFiYSksCisgICAgU1RDUCgweDdmNDZkODZjLCAweDBkOTY4MWMyKSwgU1RDUCgweDdmMzg1N2Y2LCAweDBlMWJjMmU0KSwKKyAgICBTVENQKDB4N2YyOTRiZmQsIDB4MGVhMGY0OGMpLCBTVENQKDB4N2YxOWI0OTEsIDB4MGYyNjE2MmEpLAorICAgIFNUQ1AoMHg3ZjA5OTFjNCwgMHgwZmFiMjcyYiksIFNUQ1AoMHg3ZWY4ZTNhNiwgMHgxMDMwMjZmZSksCisgICAgU1RDUCgweDdlZTdhYTRjLCAweDEwYjUxNTBmKSwgU1RDUCgweDdlZDVlNWM2LCAweDExMzlmMGNmKSwKKyAgICBTVENQKDB4N2VjMzk2MmEsIDB4MTFiZWI5YWEpLCBTVENQKDB4N2ViMGJiOGEsIDB4MTI0MzZmMTApLAorICAgIFNUQ1AoMHg3ZTlkNTVmYywgMHgxMmM4MTA2ZiksIFNUQ1AoMHg3ZTg5NjU5NSwgMHgxMzRjOWQzNCksCisgICAgU1RDUCgweDdlNzRlYTZhLCAweDEzZDExNGQwKSwgU1RDUCgweDdlNWZlNDkzLCAweDE0NTU3NmIxKSwKKyAgICBTVENQKDB4N2U0YTU0MjYsIDB4MTRkOWMyNDUpLCBTVENQKDB4N2UzNDM5M2IsIDB4MTU1ZGY2ZmMpLAorICAgIFNUQ1AoMHg3ZTFkOTNlYSwgMHgxNWUyMTQ0NSksIFNUQ1AoMHg3ZTA2NjQ0YywgMHgxNjY2MTk4ZCksCisgICAgU1RDUCgweDdkZWVhYTdhLCAweDE2ZWEwNjQ2KSwgU1RDUCgweDdkZDY2NjhmLCAweDE3NmRkOWRlKSwKKyAgICBTVENQKDB4N2RiZDk4YTQsIDB4MTdmMTkzYzUpLCBTVENQKDB4N2RhNDQwZDYsIDB4MTg3NTMzNmEpLAorICAgIFNUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksIFNUQ1AoMHg3ZDZmZjNmZSwgMHgxOTdjMjFhZCksCisgICAgU1RDUCgweDdkNTRmZjJlLCAweDE5ZmY2ZjJhKSwgU1RDUCgweDdkMzk4MGVjLCAweDFhODJhMDI2KSwKKyAgICBTVENQKDB4N2QxZDc5NTgsIDB4MWIwNWI0MGYpLCBTVENQKDB4N2QwMGU4OGYsIDB4MWI4OGFhNTUpLAorICAgIFNUQ1AoMHg3Y2UzY2ViMiwgMHgxYzBiODI2YSksIFNUQ1AoMHg3Y2M2MmJkZiwgMHgxYzhlM2JiZSksCisgICAgU1RDUCgweDdjYTgwMDM4LCAweDFkMTBkNWMyKSwgU1RDUCgweDdjODk0YmRlLCAweDFkOTM0ZmU1KSwKKyAgICBTVENQKDB4N2M2YTBlZjIsIDB4MWUxNWE5OWEpLCBTVENQKDB4N2M0YTQ5OTYsIDB4MWU5N2UyNTEpLAorICAgIFNUQ1AoMHg3YzI5ZmJlZSwgMHgxZjE5Zjk3YiksIFNUQ1AoMHg3YzA5MjYxZCwgMHgxZjliZWU4YSksCisgICAgU1RDUCgweDdiZTdjODQ3LCAweDIwMWRjMGVmKSwgU1RDUCgweDdiYzVlMjkwLCAweDIwOWY3MDFjKSwKKyAgICBTVENQKDB4N2JhMzc1MWQsIDB4MjEyMGZiODMpLCBTVENQKDB4N2I4MDgwMTUsIDB4MjFhMjYyOTUpLAorICAgIFNUQ1AoMHg3YjVkMDM5ZSwgMHgyMjIzYTRjNSksIFNUQ1AoMHg3YjM4ZmZkZSwgMHgyMmE0YzE4NSksCisgICAgU1RDUCgweDdiMTQ3NGZkLCAweDIzMjViODQ3KSwgU1RDUCgweDdhZWY2MzIzLCAweDIzYTY4ODdmKSwKKyAgICBTVENQKDB4N2FjOWNhN2EsIDB4MjQyNzMxOWQpLCBTVENQKDB4N2FhM2FiMjksIDB4MjRhN2IzMTcpLAorICAgIFNUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksIFNUQ1AoMHg3YTU1ZDkzYSwgMHgyNWE4M2NlNiksCisgICAgU1RDUCgweDdhMmUyNmYyLCAweDI2Mjg0NDIyKSwgU1RDUCgweDdhMDVlZWFkLCAweDI2YTgyMTg2KSwKKyAgICBTVENQKDB4NzlkZDMwOTgsIDB4MjcyN2Q0ODYpLCBTVENQKDB4NzliM2VjZTAsIDB4MjdhNzVjOTUpLAorICAgIFNUQ1AoMHg3OThhMjNiMSwgMHgyODI2YjkyOCksIFNUQ1AoMHg3OTVmZDUzYSwgMHgyOGE1ZTliNCksCisgICAgU1RDUCgweDc5MzUwMWE5LCAweDI5MjRlZGFjKSwgU1RDUCgweDc5MDlhOTJkLCAweDI5YTNjNDg1KSwKKyAgICBTVENQKDB4NzhkZGNiZjUsIDB4MmEyMjZkYjUpLCBTVENQKDB4NzhiMTZhMzIsIDB4MmFhMGU4YjApLAorICAgIFNUQ1AoMHg3ODg0ODQxNCwgMHgyYjFmMzRlYiksIFNUQ1AoMHg3ODU3MTljYywgMHgyYjlkNTFkZCksCisgICAgU1RDUCgweDc4MjkyYjhkLCAweDJjMWIzZWZiKSwgU1RDUCgweDc3ZmFiOTg5LCAweDJjOThmYmJhKSwKKyAgICBTVENQKDB4NzdjYmMzZjIsIDB4MmQxNjg3OTIpLCBTVENQKDB4Nzc5YzRhZmMsIDB4MmQ5M2UxZjgpLAorICAgIFNUQ1AoMHg3NzZjNGVkYiwgMHgyZTExMGE2MiksIFNUQ1AoMHg3NzNiY2ZjNCwgMHgyZThlMDA0OCksCisgICAgU1RDUCgweDc3MGFjZGVjLCAweDJmMGFjMzIwKSwgU1RDUCgweDc2ZDk0OTg5LCAweDJmODc1MjYyKSwKKyAgICBTVENQKDB4NzZhNzQyZDEsIDB4MzAwM2FkODUpLCBTVENQKDB4NzY3NGI5ZmEsIDB4MzA3ZmQ0MDEpLAorICAgIFNUQ1AoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksIFNUQ1AoMHg3NjBlMjJkMSwgMHgzMTc3ODBlMiksCisgICAgU1RDUCgweDc1ZGExNGVmLCAweDMxZjMwNjM4KSwgU1RDUCgweDc1YTU4NWNmLCAweDMyNmU1NGM3KSwKKyAgICBTVENQKDB4NzU3MDc1YWMsIDB4MzJlOTZjMDkpLCBTVENQKDB4NzUzYWU0YzAsIDB4MzM2NDRiNzYpLAorICAgIFNUQ1AoMHg3NTA0ZDM0NSwgMHgzM2RlZjI4NyksIFNUQ1AoMHg3NGNlNDE3NywgMHgzNDU5NjBiNyksCisgICAgU1RDUCgweDc0OTcyZjkyLCAweDM0ZDM5NTdlKSwgU1RDUCgweDc0NWY5ZGQxLCAweDM1NGQ5MDU3KSwKKyAgICBTVENQKDB4NzQyNzhjNzIsIDB4MzVjNzUwYmMpLCBTVENQKDB4NzNlZWZiYjMsIDB4MzY0MGQ2MjcpLAorICAgIFNUQ1AoMHg3M2I1ZWJkMSwgMHgzNmJhMjAxNCksIFNUQ1AoMHg3MzdjNWQwYiwgMHgzNzMzMmRmZCksCisgICAgU1RDUCgweDczNDI0ZmEwLCAweDM3YWJmZjVkKSwgU1RDUCgweDczMDdjM2QwLCAweDM4MjQ5M2IwKSwKKyAgICBTVENQKDB4NzJjY2I5ZGIsIDB4Mzg5Y2VhNzIpLCBTVENQKDB4NzI5MTMyMDEsIDB4MzkxNTAzMWYpLAorICAgIFNUQ1AoMHg3MjU1MmM4NSwgMHgzOThjZGQzMiksIFNUQ1AoMHg3MjE4YTlhNywgMHgzYTA0NzgyYSksCisgICAgU1RDUCgweDcxZGJhOWFiLCAweDNhN2JkMzgyKSwgU1RDUCgweDcxOWUyY2QyLCAweDNhZjJlZWI3KSwKKyAgICBTVENQKDB4NzE2MDMzNjEsIDB4M2I2OWM5NDcpLCBTVENQKDB4NzEyMWJkOWMsIDB4M2JlMDYyYjApLAorICAgIFNUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksIFNUQ1AoMHg3MGEzNWUyNSwgMHgzY2NjZDAwNCksCisgICAgU1RDUCgweDcwNjM3NGZmLCAweDNkNDJhMmVjKSwgU1RDUCgweDcwMjMxMDlhLCAweDNkYjgzMmE2KSwKKyAgICBTVENQKDB4NmZlMjMxM2MsIDB4M2UyZDdlYjEpLCBTVENQKDB4NmZhMGQ3MmMsIDB4M2VhMjg2OGMpLAorICAgIFNUQ1AoMHg2ZjVmMDJiMiwgMHgzZjE3NDliOCksIFNUQ1AoMHg2ZjFjYjQxNiwgMHgzZjhiYzdiNCksCisgICAgU1RDUCgweDZlZDllYmExLCAweDQwMDAwMDAwKSwgU1RDUCgweDZlOTZhOTlkLCAweDQwNzNmMjFkKSwKKyAgICBTVENQKDB4NmU1MmVlNTIsIDB4NDBlNzlkOGMpLCBTVENQKDB4NmUwZWJhMGMsIDB4NDE1YjAxY2UpLAorICAgIFNUQ1AoMHg2ZGNhMGQxNCwgMHg0MWNlMWU2NSksIFNUQ1AoMHg2ZDg0ZTdiNywgMHg0MjQwZjJkMSksCisgICAgU1RDUCgweDZkM2Y0YTQwLCAweDQyYjM3ZTk2KSwgU1RDUCgweDZjZjkzNGZjLCAweDQzMjVjMTM1KSwKKyAgICBTVENQKDB4NmNiMmE4MzcsIDB4NDM5N2JhMzIpLCBTVENQKDB4NmM2YmE0M2UsIDB4NDQwOTY5MTApLAorICAgIFNUQ1AoMHg2YzI0Mjk2MCwgMHg0NDdhY2Q1MCksIFNUQ1AoMHg2YmRjMzdlYiwgMHg0NGViZTY3OSksCisgICAgU1RDUCgweDZiOTNkMDJlLCAweDQ1NWNiNDBjKSwgU1RDUCgweDZiNGFmMjc5LCAweDQ1Y2QzNThmKSwKKyAgICBTVENQKDB4NmIwMTlmMWEsIDB4NDYzZDZhODcpLCBTVENQKDB4NmFiN2Q2NjMsIDB4NDZhZDUyNzgpLAorICAgIFNUQ1AoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksIFNUQ1AoMHg2YTIyZTYzMCwgMHg0NzhjMzk1YSksCisgICAgU1RDUCgweDY5ZDdiZjU3LCAweDQ3ZmIzNzU3KSwgU1RDUCgweDY5OGMyNDZjLCAweDQ4NjllNjY1KSwKKyAgICBTVENQKDB4Njk0MDE1YzMsIDB4NDhkODQ2MDkpLCBTVENQKDB4NjhmMzkzYWUsIDB4NDk0NjU1Y2MpLAorICAgIFNUQ1AoMHg2OGE2OWU4MSwgMHg0OWI0MTUzMyksIFNUQ1AoMHg2ODU5MzY5MSwgMHg0YTIxODNjOCksCisgICAgU1RDUCgweDY4MGI1YzMzLCAweDRhOGVhMTExKSwgU1RDUCgweDY3YmQwZmJkLCAweDRhZmI2Yzk4KSwKKyAgICBTVENQKDB4Njc2ZTUxODMsIDB4NGI2N2U1ZTQpLCBTVENQKDB4NjcxZjIxZGMsIDB4NGJkNDBjODApLAorICAgIFNUQ1AoMHg2NmNmODEyMCwgMHg0YzNmZGZmNCksIFNUQ1AoMHg2NjdmNmZhNSwgMHg0Y2FiNWZjOSksCisgICAgU1RDUCgweDY2MmVlZGMzLCAweDRkMTY4YjhiKSwgU1RDUCgweDY1ZGRmYmQzLCAweDRkODE2MmM0KSwKKyAgICBTVENQKDB4NjU4YzlhMmQsIDB4NGRlYmU0ZmUpLCBTVENQKDB4NjUzYWM5MmIsIDB4NGU1NjExYzUpLAorICAgIFNUQ1AoMHg2NGU4ODkyNiwgMHg0ZWJmZThhNSksIFNUQ1AoMHg2NDk1ZGE3OSwgMHg0ZjI5NjkyOCksCisgICAgU1RDUCgweDY0NDJiZDdlLCAweDRmOTI5MmRjKSwgU1RDUCgweDYzZWYzMjkwLCAweDRmZmI2NTRkKSwKKyAgICBTVENQKDB4NjM5YjNhMGIsIDB4NTA2M2UwMDgpLCBTVENQKDB4NjM0NmQ0NGIsIDB4NTBjYzAyOWMpLAorICAgIFNUQ1AoMHg2MmYyMDFhYywgMHg1MTMzY2M5NCksIFNUQ1AoMHg2MjljYzI4YywgMHg1MTliM2Q4MCksCisgICAgU1RDUCgweDYyNDcxNzQ5LCAweDUyMDI1NGVmKSwgU1RDUCgweDYxZjEwMDNmLCAweDUyNjkxMjZlKSwKKyAgICBTVENQKDB4NjE5YTdkY2UsIDB4NTJjZjc1OGYpLCBTVENQKDB4NjE0MzkwNTMsIDB4NTMzNTdkZGYpLAorICAgIFNUQ1AoMHg2MGVjMzgzMCwgMHg1MzliMmFmMCksIFNUQ1AoMHg2MDk0NzVjMywgMHg1NDAwN2M1MSksCisgICAgU1RDUCgweDYwM2M0OTZjLCAweDU0NjU3MTk0KSwgU1RDUCgweDVmZTNiMzhkLCAweDU0Y2EwYTRiKSwKKyAgICBTVENQKDB4NWY4YWI0ODcsIDB4NTUyZTQ2MDUpLCBTVENQKDB4NWYzMTRjYmEsIDB4NTU5MjI0NTcpLAorICAgIFNUQ1AoMHg1ZWQ3N2M4YSwgMHg1NWY1YTRkMiksIFNUQ1AoMHg1ZTdkNDQ1OCwgMHg1NjU4YzcwOSksCisgICAgU1RDUCgweDVlMjJhNDg3LCAweDU2YmI4YTkwKSwgU1RDUCgweDVkYzc5ZDdjLCAweDU3MWRlZWZhKSwKKyAgICBTVENQKDB4NWQ2YzJmOTksIDB4NTc3ZmYzZGEpLCBTVENQKDB4NWQxMDViNDQsIDB4NTdlMTk4YzcpLAorICAgIFNUQ1AoMHg1Y2I0MjBlMCwgMHg1ODQyZGQ1NCksIFNUQ1AoMHg1YzU3ODBkMywgMHg1OGEzYzExOCksCisgICAgU1RDUCgweDViZmE3YjgyLCAweDU5MDQ0M2E3KSwgU1RDUCgweDViOWQxMTU0LCAweDU5NjQ2NDk4KSwKKyAgICBTVENQKDB4NWIzZjQyYWUsIDB4NTljNDIzODEpLCBTVENQKDB4NWFlMTBmZjksIDB4NWEyMzdmZmEpLAorICAgIFNUQ1AoMHg1YTgyNzk5YSwgMHg1YTgyNzk5YSksCiB9OwogCiBSQU1fQUxJR04KIExOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9XVFAgS0JEV2luZG93MTAyNFtdID0KLXsKLSAgV1RDUCgweDdmZmZmZmE0LCAweDAwMDk5NjJmKSwgV1RDUCgweDdmZmZmZjM5LCAweDAwMGUxNmZiKSwgV1RDUCgweDdmZmZmZWJmLCAweDAwMTFlYTY1KSwgV1RDUCgweDdmZmZmZTM0LCAweDAwMTU3NTBlKSwKLSAgV1RDUCgweDdmZmZmZDk2LCAweDAwMThkYzc0KSwgV1RDUCgweDdmZmZmY2U1LCAweDAwMWMzMzJlKSwgV1RDUCgweDdmZmZmYzFmLCAweDAwMWY4M2Y1KSwgV1RDUCgweDdmZmZmYjQzLCAweDAwMjJkNTlhKSwKLSAgV1RDUCgweDdmZmZmYTRmLCAweDAwMjYyY2MyKSwgV1RDUCgweDdmZmZmOTQyLCAweDAwMjk4Y2M0KSwgV1RDUCgweDdmZmZmODFhLCAweDAwMmNmODFmKSwgV1RDUCgweDdmZmZmNmQ2LCAweDAwMzA3MGM0KSwKLSAgV1RDUCgweDdmZmZmNTczLCAweDAwMzNmODQwKSwgV1RDUCgweDdmZmZmM2YxLCAweDAwMzc4ZmQ5KSwgV1RDUCgweDdmZmZmMjRkLCAweDAwM2IzOGExKSwgV1RDUCgweDdmZmZmMDg1LCAweDAwM2VmMzgxKSwKLSAgV1RDUCgweDdmZmZlZTk4LCAweDAwNDJjMTQ3KSwgV1RDUCgweDdmZmZlYzgzLCAweDAwNDZhMmE4KSwgV1RDUCgweDdmZmZlYTQ0LCAweDAwNGE5ODQ3KSwgV1RDUCgweDdmZmZlN2Q4LCAweDAwNGVhMmI3KSwKLSAgV1RDUCgweDdmZmZlNTNmLCAweDAwNTJjMjgzKSwgV1RDUCgweDdmZmZlMjc0LCAweDAwNTZmODI5KSwgV1RDUCgweDdmZmZkZjc2LCAweDAwNWI0NDIyKSwgV1RDUCgweDdmZmZkYzQzLCAweDAwNWZhNmRkKSwKLSAgV1RDUCgweDdmZmZkOGQ2LCAweDAwNjQyMGM4KSwgV1RDUCgweDdmZmZkNTJmLCAweDAwNjhiMjQ5KSwgV1RDUCgweDdmZmZkMTQ5LCAweDAwNmQ1YmM0KSwgV1RDUCgweDdmZmZjZDIyLCAweDAwNzIxZDlhKSwKLSAgV1RDUCgweDdmZmZjOGI2LCAweDAwNzZmODI4KSwgV1RDUCgweDdmZmZjNDA0LCAweDAwN2JlYmNhKSwgV1RDUCgweDdmZmZiZjA2LCAweDAwODBmOGQ5KSwgV1RDUCgweDdmZmZiOWJiLCAweDAwODYxZmFlKSwKLSAgV1RDUCgweDdmZmZiNDFlLCAweDAwOGI2MDllKSwgV1RDUCgweDdmZmZhZTJjLCAweDAwOTBiYmZmKSwgV1RDUCgweDdmZmZhN2UxLCAweDAwOTYzMjI0KSwgV1RDUCgweDdmZmZhMTNhLCAweDAwOWJjMzYyKSwKLSAgV1RDUCgweDdmZmY5YTMyLCAweDAwYTE3MDA5KSwgV1RDUCgweDdmZmY5MmM1LCAweDAwYTczODZjKSwgV1RDUCgweDdmZmY4YWYwLCAweDAwYWQxY2RjKSwgV1RDUCgweDdmZmY4MmFkLCAweDAwYjMxZGE4KSwKLSAgV1RDUCgweDdmZmY3OWY5LCAweDAwYjkzYjIxKSwgV1RDUCgweDdmZmY3MGNmLCAweDAwYmY3NTk2KSwgV1RDUCgweDdmZmY2NzJhLCAweDAwYzVjZDU3KSwgV1RDUCgweDdmZmY1ZDA1LCAweDAwY2M0MmIxKSwKLSAgV1RDUCgweDdmZmY1MjVjLCAweDAwZDJkNWYzKSwgV1RDUCgweDdmZmY0NzI5LCAweDAwZDk4NzZjKSwgV1RDUCgweDdmZmYzYjY2LCAweDAwZTA1NzY5KSwgV1RDUCgweDdmZmYyZjEwLCAweDAwZTc0NjM4KSwKLSAgV1RDUCgweDdmZmYyMjFmLCAweDAwZWU1NDI2KSwgV1RDUCgweDdmZmYxNDhlLCAweDAwZjU4MTgyKSwgV1RDUCgweDdmZmYwNjU4LCAweDAwZmNjZTk3KSwgV1RDUCgweDdmZmVmNzc2LCAweDAxMDQzYmIzKSwKLSAgV1RDUCgweDdmZmVlN2UyLCAweDAxMGJjOTIzKSwgV1RDUCgweDdmZmVkNzk1LCAweDAxMTM3NzMzKSwgV1RDUCgweDdmZmVjNjhhLCAweDAxMWI0NjMxKSwgV1RDUCgweDdmZmViNGJhLCAweDAxMjMzNjY5KSwKLSAgV1RDUCgweDdmZmVhMjFkLCAweDAxMmI0ODI3KSwgV1RDUCgweDdmZmU4ZWFjLCAweDAxMzM3YmI4KSwgV1RDUCgweDdmZmU3YTYxLCAweDAxM2JkMTY3KSwgV1RDUCgweDdmZmU2NTMzLCAweDAxNDQ0OTgyKSwKLSAgV1RDUCgweDdmZmU0ZjFjLCAweDAxNGNlNDU0KSwgV1RDUCgweDdmZmUzODEzLCAweDAxNTVhMjI5KSwgV1RDUCgweDdmZmUyMDExLCAweDAxNWU4MzRkKSwgV1RDUCgweDdmZmUwNzBkLCAweDAxNjc4ODBjKSwKLSAgV1RDUCgweDdmZmRlY2ZmLCAweDAxNzBiMGIyKSwgV1RDUCgweDdmZmRkMWRmLCAweDAxNzlmZDhiKSwgV1RDUCgweDdmZmRiNWEyLCAweDAxODM2ZWUxKSwgV1RDUCgweDdmZmQ5ODQyLCAweDAxOGQwNTAwKSwKLSAgV1RDUCgweDdmZmQ3OWIzLCAweDAxOTZjMDM1KSwgV1RDUCgweDdmZmQ1OWVlLCAweDAxYTBhMGNhKSwgV1RDUCgweDdmZmQzOGU4LCAweDAxYWFhNzBhKSwgV1RDUCgweDdmZmQxNjk3LCAweDAxYjRkMzQxKSwKLSAgV1RDUCgweDdmZmNmMmYyLCAweDAxYmYyNWI5KSwgV1RDUCgweDdmZmNjZGVlLCAweDAxYzk5ZWJkKSwgV1RDUCgweDdmZmNhNzgwLCAweDAxZDQzZTk5KSwgV1RDUCgweDdmZmM3ZjllLCAweDAxZGYwNTk3KSwKLSAgV1RDUCgweDdmZmM1NjNkLCAweDAxZTlmNDAxKSwgV1RDUCgweDdmZmMyYjUxLCAweDAxZjUwYTIyKSwgV1RDUCgweDdmZmJmZWNmLCAweDAyMDA0ODQ0KSwgV1RDUCgweDdmZmJkMGFiLCAweDAyMGJhZWIxKSwKLSAgV1RDUCgweDdmZmJhMGRhLCAweDAyMTczZGI0KSwgV1RDUCgweDdmZmI2ZjRmLCAweDAyMjJmNTk2KSwgV1RDUCgweDdmZmIzYmZkLCAweDAyMmVkNmExKSwgV1RDUCgweDdmZmIwNmQ4LCAweDAyM2FlMTFmKSwKLSAgV1RDUCgweDdmZmFjZmQzLCAweDAyNDcxNTU4KSwgV1RDUCgweDdmZmE5NmUwLCAweDAyNTM3Mzk3KSwgV1RDUCgweDdmZmE1YmYyLCAweDAyNWZmYzI1KSwgV1RDUCgweDdmZmExZWZjLCAweDAyNmNhZjRhKSwKLSAgV1RDUCgweDdmZjlkZmVlLCAweDAyNzk4ZDRmKSwgV1RDUCgweDdmZjk5ZWJiLCAweDAyODY5NjdjKSwgV1RDUCgweDdmZjk1YjU1LCAweDAyOTNjYjFiKSwgV1RDUCgweDdmZjkxNWFiLCAweDAyYTEyYjcyKSwKLSAgV1RDUCgweDdmZjhjZGFmLCAweDAyYWViN2NiKSwgV1RDUCgweDdmZjg4MzUxLCAweDAyYmM3MDZkKSwgV1RDUCgweDdmZjgzNjgyLCAweDAyY2E1NTlmKSwgV1RDUCgweDdmZjdlNzMxLCAweDAyZDg2N2E5KSwKLSAgV1RDUCgweDdmZjc5NTRlLCAweDAyZTZhNmQyKSwgV1RDUCgweDdmZjc0MGM4LCAweDAyZjUxMzYxKSwgV1RDUCgweDdmZjZlOThlLCAweDAzMDNhZDljKSwgV1RDUCgweDdmZjY4ZjhmLCAweDAzMTI3NWNhKSwKLSAgV1RDUCgweDdmZjYzMmJhLCAweDAzMjE2YzMwKSwgV1RDUCgweDdmZjVkMmZiLCAweDAzMzA5MTE2KSwgV1RDUCgweDdmZjU3MDQyLCAweDAzM2ZlNGJmKSwgV1RDUCgweDdmZjUwYTdhLCAweDAzNGY2NzczKSwKLSAgV1RDUCgweDdmZjRhMTkyLCAweDAzNWYxOTc1KSwgV1RDUCgweDdmZjQzNTc2LCAweDAzNmVmYjBhKSwgV1RDUCgweDdmZjNjNjEyLCAweDAzN2YwYzc4KSwgV1RDUCgweDdmZjM1MzUzLCAweDAzOGY0ZTAyKSwKLSAgV1RDUCgweDdmZjJkZDI0LCAweDAzOWZiZmViKSwgV1RDUCgweDdmZjI2MzcwLCAweDAzYjA2Mjc5KSwgV1RDUCgweDdmZjFlNjIzLCAweDAzYzEzNWVkKSwgV1RDUCgweDdmZjE2NTI3LCAweDAzZDIzYThiKSwKLSAgV1RDUCgweDdmZjBlMDY3LCAweDAzZTM3MDk1KSwgV1RDUCgweDdmZjA1N2NjLCAweDAzZjRkODRlKSwgV1RDUCgweDdmZWZjYjQwLCAweDA0MDY3MWY3KSwgV1RDUCgweDdmZWYzYWFkLCAweDA0MTgzZGQzKSwKLSAgV1RDUCgweDdmZWVhNWZhLCAweDA0MmEzYzIyKSwgV1RDUCgweDdmZWUwZDExLCAweDA0M2M2ZDI1KSwgV1RDUCgweDdmZWQ2ZmRhLCAweDA0NGVkMTFkKSwgV1RDUCgweDdmZWNjZTNkLCAweDA0NjE2ODQ5KSwKLSAgV1RDUCgweDdmZWMyODIxLCAweDA0NzQzMmViKSwgV1RDUCgweDdmZWI3ZDZjLCAweDA0ODczMTQwKSwgV1RDUCgweDdmZWFjZTA3LCAweDA0OWE2Mzg4KSwgV1RDUCgweDdmZWExOWQ2LCAweDA0YWRjYTAxKSwKLSAgV1RDUCgweDdmZTk2MGMwLCAweDA0YzE2NGVhKSwgV1RDUCgweDdmZThhMmFhLCAweDA0ZDUzNDgxKSwgV1RDUCgweDdmZTdkZjc5LCAweDA0ZTkzOTAyKSwgV1RDUCgweDdmZTcxNzEyLCAweDA0ZmQ3MmFhKSwKLSAgV1RDUCgweDdmZTY0OTVhLCAweDA1MTFlMWI2KSwgV1RDUCgweDdmZTU3NjM0LCAweDA1MjY4NjYzKSwgV1RDUCgweDdmZTQ5ZDgzLCAweDA1M2I2MGViKSwgV1RDUCgweDdmZTNiZjJiLCAweDA1NTA3MTg5KSwKLSAgV1RDUCgweDdmZTJkYjBmLCAweDA1NjViODc5KSwgV1RDUCgweDdmZTFmMTEwLCAweDA1N2IzNWY0KSwgV1RDUCgweDdmZTEwMTExLCAweDA1OTBlYTM1KSwgV1RDUCgweDdmZTAwYWYzLCAweDA1YTZkNTc0KSwKLSAgV1RDUCgweDdmZGYwZTk3LCAweDA1YmNmN2VhKSwgV1RDUCgweDdmZGUwYmRkLCAweDA1ZDM1MWNmKSwgV1RDUCgweDdmZGQwMmE2LCAweDA1ZTllMzVjKSwgV1RDUCgweDdmZGJmMmQyLCAweDA2MDBhY2M4KSwKLSAgV1RDUCgweDdmZGFkYzQwLCAweDA2MTdhZTQ4KSwgV1RDUCgweDdmZDliZWNmLCAweDA2MmVlODE0KSwgV1RDUCgweDdmZDg5YTVlLCAweDA2NDY1YTYyKSwgV1RDUCgweDdmZDc2ZWNhLCAweDA2NWUwNTY1KSwKLSAgV1RDUCgweDdmZDYzYmYxLCAweDA2NzVlOTU0KSwgV1RDUCgweDdmZDUwMWIwLCAweDA2OGUwNjYyKSwgV1RDUCgweDdmZDNiZmU0LCAweDA2YTY1Y2MzKSwgV1RDUCgweDdmZDI3NjZhLCAweDA2YmVlY2FhKSwKLSAgV1RDUCgweDdmZDEyNTFlLCAweDA2ZDdiNjQ4KSwgV1RDUCgweDdmY2ZjYmRhLCAweDA2ZjBiOWQxKSwgV1RDUCgweDdmY2U2YTdhLCAweDA3MDlmNzc1KSwgV1RDUCgweDdmY2QwMGQ4LCAweDA3MjM2ZjY1KSwKLSAgV1RDUCgweDdmY2I4ZWNmLCAweDA3M2QyMWQyKSwgV1RDUCgweDdmY2ExNDM5LCAweDA3NTcwZWVhKSwgV1RDUCgweDdmYzg5MGVkLCAweDA3NzEzNmRkKSwgV1RDUCgweDdmYzcwNGM3LCAweDA3OGI5OWRhKSwKLSAgV1RDUCgweDdmYzU2ZjlkLCAweDA3YTYzODBkKSwgV1RDUCgweDdmYzNkMTQ3LCAweDA3YzExMWE0KSwgV1RDUCgweDdmYzIyOTllLCAweDA3ZGMyNmNjKSwgV1RDUCgweDdmYzA3ODc4LCAweDA3Zjc3N2IxKSwKLSAgV1RDUCgweDdmYmViZGFjLCAweDA4MTMwNDdkKSwgV1RDUCgweDdmYmNmOTBmLCAweDA4MmVjZDViKSwgV1RDUCgweDdmYmIyYTc4LCAweDA4NGFkMjc2KSwgV1RDUCgweDdmYjk1MWJjLCAweDA4NjcxM2Y3KSwKLSAgV1RDUCgweDdmYjc2ZWFmLCAweDA4ODM5MjA2KSwgV1RDUCgweDdmYjU4MTI2LCAweDA4YTA0Y2NiKSwgV1RDUCgweDdmYjM4OGY0LCAweDA4YmQ0NDZlKSwgV1RDUCgweDdmYjE4NWVlLCAweDA4ZGE3OTE1KSwKLSAgV1RDUCgweDdmYWY3N2U1LCAweDA4ZjdlYWU3KSwgV1RDUCgweDdmYWQ1ZWFkLCAweDA5MTU5YTA5KSwgV1RDUCgweDdmYWIzYTE3LCAweDA5MzM4NjlmKSwgV1RDUCgweDdmYTkwOWY2LCAweDA5NTFiMGNkKSwKLSAgV1RDUCgweDdmYTZjZTFhLCAweDA5NzAxOGI3KSwgV1RDUCgweDdmYTQ4NjUzLCAweDA5OGViZTdmKSwgV1RDUCgweDdmYTIzMjczLCAweDA5YWRhMjQ4KSwgV1RDUCgweDdmOWZkMjQ5LCAweDA5Y2NjNDMxKSwKLSAgV1RDUCgweDdmOWQ2NWE0LCAweDA5ZWMyNDViKSwgV1RDUCgweDdmOWFlYzUzLCAweDBhMGJjMmU3KSwgV1RDUCgweDdmOTg2NjI1LCAweDBhMmI5ZmYzKSwgV1RDUCgweDdmOTVkMmU3LCAweDBhNGJiYjllKSwKLSAgV1RDUCgweDdmOTMzMjY3LCAweDBhNmMxNjA0KSwgV1RDUCgweDdmOTA4NDcyLCAweDBhOGNhZjQzKSwgV1RDUCgweDdmOGRjOGQ1LCAweDBhYWQ4Nzc2KSwgV1RDUCgweDdmOGFmZjVjLCAweDBhY2U5ZWI5KSwKLSAgV1RDUCgweDdmODgyN2QzLCAweDBhZWZmNTI2KSwgV1RDUCgweDdmODU0MjA0LCAweDBiMTE4YWQ4KSwgV1RDUCgweDdmODI0ZGJiLCAweDBiMzM1ZmU2KSwgV1RDUCgweDdmN2Y0YWMzLCAweDBiNTU3NDY5KSwKLSAgV1RDUCgweDdmN2MzOGU0LCAweDBiNzdjODc5KSwgV1RDUCgweDdmNzkxN2U5LCAweDBiOWE1YzJiKSwgV1RDUCgweDdmNzVlNzliLCAweDBiYmQyZjk3KSwgV1RDUCgweDdmNzJhN2MzLCAweDBiZTA0MmQwKSwKLSAgV1RDUCgweDdmNmY1ODI4LCAweDBjMDM5NWVjKSwgV1RDUCgweDdmNmJmODkyLCAweDBjMjcyOGZkKSwgV1RDUCgweDdmNjg4OGM5LCAweDBjNGFmYzE2KSwgV1RDUCgweDdmNjUwODk0LCAweDBjNmYwZjRhKSwKLSAgV1RDUCgweDdmNjE3N2I5LCAweDBjOTM2MmE4KSwgV1RDUCgweDdmNWRkNWZmLCAweDBjYjdmNjQyKSwgV1RDUCgweDdmNWEyMzJhLCAweDBjZGNjYTI2KSwgV1RDUCgweDdmNTY1ZjAwLCAweDBkMDFkZTYzKSwKLSAgV1RDUCgweDdmNTI4OTQ3LCAweDBkMjczMzA3KSwgV1RDUCgweDdmNGVhMWMyLCAweDBkNGNjODFmKSwgV1RDUCgweDdmNGFhODM1LCAweDBkNzI5ZGI3KSwgV1RDUCgweDdmNDY5YzY1LCAweDBkOThiM2RhKSwKLSAgV1RDUCgweDdmNDI3ZTEzLCAweDBkYmYwYTkyKSwgV1RDUCgweDdmM2U0ZDA0LCAweDBkZTVhMWU5KSwgV1RDUCgweDdmM2EwOGY5LCAweDBlMGM3OWU3KSwgV1RDUCgweDdmMzViMWI0LCAweDBlMzM5Mjk1KSwKLSAgV1RDUCgweDdmMzE0NmY4LCAweDBlNWFlYmZhKSwgV1RDUCgweDdmMmNjODg0LCAweDBlODI4NjFhKSwgV1RDUCgweDdmMjgzNjFiLCAweDBlYWE2MGZkKSwgV1RDUCgweDdmMjM4ZjdjLCAweDBlZDI3Y2E1KSwKLSAgV1RDUCgweDdmMWVkNDY3LCAweDBlZmFkOTE3KSwgV1RDUCgweDdmMWEwNDlkLCAweDBmMjM3NjU2KSwgV1RDUCgweDdmMTUxZmRjLCAweDBmNGM1NDYyKSwgV1RDUCgweDdmMTAyNWUzLCAweDBmNzU3MzNkKSwKLSAgV1RDUCgweDdmMGIxNjcyLCAweDBmOWVkMmU2KSwgV1RDUCgweDdmMDVmMTQ2LCAweDBmYzg3MzVlKSwgV1RDUCgweDdmMDBiNjFkLCAweDBmZjI1NGExKSwgV1RDUCgweDdlZmI2NGI0LCAweDEwMWM3NmFlKSwKLSAgV1RDUCgweDdlZjVmY2NhLCAweDEwNDZkOTgxKSwgV1RDUCgweDdlZjA3ZTE5LCAweDEwNzE3ZDE1KSwgV1RDUCgweDdlZWFlODYwLCAweDEwOWM2MTY1KSwgV1RDUCgweDdlZTUzYjViLCAweDEwYzc4NjZhKSwKLSAgV1RDUCgweDdlZGY3NmM0LCAweDEwZjJlYzFlKSwgV1RDUCgweDdlZDk5YTU4LCAweDExMWU5Mjc5KSwgV1RDUCgweDdlZDNhNWQxLCAweDExNGE3OTcxKSwgV1RDUCgweDdlY2Q5OGViLCAweDExNzZhMGZjKSwKLSAgV1RDUCgweDdlYzc3MzYwLCAweDExYTMwOTEwKSwgV1RDUCgweDdlYzEzNGViLCAweDExY2ZiMWExKSwgV1RDUCgweDdlYmFkZDQ0LCAweDExZmM5YWEyKSwgV1RDUCgweDdlYjQ2YzI3LCAweDEyMjljNDA2KSwKLSAgV1RDUCgweDdlYWRlMTRjLCAweDEyNTcyZGJmKSwgV1RDUCgweDdlYTczYzZjLCAweDEyODRkN2JjKSwgV1RDUCgweDdlYTA3ZDQxLCAweDEyYjJjMWVkKSwgV1RDUCgweDdlOTlhMzgyLCAweDEyZTBlYzQyKSwKLSAgV1RDUCgweDdlOTJhZWU3LCAweDEzMGY1NmE4KSwgV1RDUCgweDdlOGI5ZjJhLCAweDEzM2UwMTBiKSwgV1RDUCgweDdlODQ3NDAyLCAweDEzNmNlYjU5KSwgV1RDUCgweDdlN2QyZDI1LCAweDEzOWMxNTdiKSwKLSAgV1RDUCgweDdlNzVjYTRjLCAweDEzY2I3ZjVkKSwgV1RDUCgweDdlNmU0YjJkLCAweDEzZmIyOGU2KSwgV1RDUCgweDdlNjZhZjdmLCAweDE0MmIxMjAwKSwgV1RDUCgweDdlNWVmNmY4LCAweDE0NWIzYTkyKSwKLSAgV1RDUCgweDdlNTcyMTUwLCAweDE0OGJhMjgxKSwgV1RDUCgweDdlNGYyZTNiLCAweDE0YmM0OWI0KSwgV1RDUCgweDdlNDcxZDcwLCAweDE0ZWQzMDBmKSwgV1RDUCgweDdlM2VlZWE1LCAweDE1MWU1NTc1KSwKLSAgV1RDUCgweDdlMzZhMThlLCAweDE1NGZiOWM5KSwgV1RDUCgweDdlMmUzNWUyLCAweDE1ODE1Y2VkKSwgV1RDUCgweDdlMjVhYjU2LCAweDE1YjMzZWMxKSwgV1RDUCgweDdlMWQwMTllLCAweDE1ZTU1ZjI1KSwKLSAgV1RDUCgweDdlMTQzODZlLCAweDE2MTdiZGY5KSwgV1RDUCgweDdlMGI0ZjdkLCAweDE2NGE1YjE5KSwgV1RDUCgweDdlMDI0NjdlLCAweDE2N2QzNjYyKSwgV1RDUCgweDdkZjkxZDI1LCAweDE2YjA0ZmIyKSwKLSAgV1RDUCgweDdkZWZkMzI3LCAweDE2ZTNhNmUyKSwgV1RDUCgweDdkZTY2ODM3LCAweDE3MTczYmNlKSwgV1RDUCgweDdkZGNkYzBhLCAweDE3NGIwZTRkKSwgV1RDUCgweDdkZDMyZTUzLCAweDE3N2YxZTM5KSwKLSAgV1RDUCgweDdkYzk1ZWM2LCAweDE3YjM2YjY5KSwgV1RDUCgweDdkYmY2ZDE3LCAweDE3ZTdmNWIzKSwgV1RDUCgweDdkYjU1OGY5LCAweDE4MWNiY2VjKSwgV1RDUCgweDdkYWIyMjFmLCAweDE4NTFjMGU5KSwKLSAgV1RDUCgweDdkYTBjODNjLCAweDE4ODcwMTdkKSwgV1RDUCgweDdkOTY0YjA1LCAweDE4YmM3ZTdjKSwgV1RDUCgweDdkOGJhYTJiLCAweDE4ZjIzN2I2KSwgV1RDUCgweDdkODBlNTYzLCAweDE5MjgyY2ZkKSwKLSAgV1RDUCgweDdkNzVmYzVlLCAweDE5NWU1ZTIwKSwgV1RDUCgweDdkNmFlZWQwLCAweDE5OTRjYWVlKSwgV1RDUCgweDdkNWZiYzZkLCAweDE5Y2I3MzM1KSwgV1RDUCgweDdkNTQ2NGU2LCAweDFhMDI1NmMyKSwKLSAgV1RDUCgweDdkNDhlN2VmLCAweDFhMzk3NTYxKSwgV1RDUCgweDdkM2Q0NTNiLCAweDFhNzBjZWRlKSwgV1RDUCgweDdkMzE3YzdjLCAweDFhYTg2MzAxKSwgV1RDUCgweDdkMjU4ZDY1LCAweDFhZTAzMTk1KSwKLSAgV1RDUCgweDdkMTk3N2FhLCAweDFiMTgzYTYzKSwgV1RDUCgweDdkMGQzYWZjLCAweDFiNTA3ZDMwKSwgV1RDUCgweDdkMDBkNzEwLCAweDFiODhmOWM1KSwgV1RDUCgweDdjZjQ0Yjk3LCAweDFiYzFhZmU2KSwKLSAgV1RDUCgweDdjZTc5ODQ2LCAweDFiZmE5ZjU4KSwgV1RDUCgweDdjZGFiY2NlLCAweDFjMzNjN2UwKSwgV1RDUCgweDdjY2RiOGU0LCAweDFjNmQyOTNmKSwgV1RDUCgweDdjYzA4YzM5LCAweDFjYTZjMzM3KSwKLSAgV1RDUCgweDdjYjMzNjgyLCAweDFjZTA5NThhKSwgV1RDUCgweDdjYTViNzcyLCAweDFkMWE5ZmY4KSwgV1RDUCgweDdjOTgwZWJkLCAweDFkNTRlMjQwKSwgV1RDUCgweDdjOGEzYzE0LCAweDFkOGY1YzIxKSwKLSAgV1RDUCgweDdjN2MzZjJlLCAweDFkY2EwZDU2KSwgV1RDUCgweDdjNmUxN2JjLCAweDFlMDRmNTlmKSwgV1RDUCgweDdjNWZjNTczLCAweDFlNDAxNGI0KSwgV1RDUCgweDdjNTE0ODA3LCAweDFlN2I2YTUzKSwKLSAgV1RDUCgweDdjNDI5ZjJjLCAweDFlYjZmNjMzKSwgV1RDUCgweDdjMzNjYTk2LCAweDFlZjJiODBmKSwgV1RDUCgweDdjMjRjOWZhLCAweDFmMmVhZjllKSwgV1RDUCgweDdjMTU5ZDBkLCAweDFmNmFkYzk4KSwKLSAgV1RDUCgweDdjMDY0MzgzLCAweDFmYTczZWIyKSwgV1RDUCgweDdiZjZiZDExLCAweDFmZTNkNWEzKSwgV1RDUCgweDdiZTcwOTZjLCAweDIwMjBhMTFlKSwgV1RDUCgweDdiZDcyODRhLCAweDIwNWRhMGQ4KSwKLSAgV1RDUCgweDdiYzcxOTYwLCAweDIwOWFkNDgzKSwgV1RDUCgweDdiYjZkYzY1LCAweDIwZDgzYmQxKSwgV1RDUCgweDdiYTY3MTBkLCAweDIxMTVkNjc0KSwgV1RDUCgweDdiOTVkNzEwLCAweDIxNTNhNDFiKSwKLSAgV1RDUCgweDdiODUwZTI0LCAweDIxOTFhNDc2KSwgV1RDUCgweDdiNzQxNWZmLCAweDIxY2ZkNzM0KSwgV1RDUCgweDdiNjJlZTU5LCAweDIyMGUzYzAyKSwgV1RDUCgweDdiNTE5NmU5LCAweDIyNGNkMjhkKSwKLSAgV1RDUCgweDdiNDAwZjY3LCAweDIyOGI5YTgyKSwgV1RDUCgweDdiMmU1NzhhLCAweDIyY2E5MzhhKSwgV1RDUCgweDdiMWM2ZjBiLCAweDIzMDliZDUyKSwgV1RDUCgweDdiMGE1NWExLCAweDIzNDkxNzgzKSwKLSAgV1RDUCgweDdhZjgwYjA3LCAweDIzODhhMWM0KSwgV1RDUCgweDdhZTU4ZWY1LCAweDIzYzg1YmJmKSwgV1RDUCgweDdhZDJlMTI0LCAweDI0MDg0NTFhKSwgV1RDUCgweDdhYzAwMTRlLCAweDI0NDg1ZDdjKSwKLSAgV1RDUCgweDdhYWNlZjJlLCAweDI0ODhhNDhhKSwgV1RDUCgweDdhOTlhYTdlLCAweDI0YzkxOWU5KSwgV1RDUCgweDdhODYzMmY4LCAweDI1MDliZDNkKSwgV1RDUCgweDdhNzI4ODU4LCAweDI1NGE4ZTI5KSwKLSAgV1RDUCgweDdhNWVhYTVhLCAweDI1OGI4YzUwKSwgV1RDUCgweDdhNGE5OGI5LCAweDI1Y2NiNzUzKSwgV1RDUCgweDdhMzY1MzMzLCAweDI2MGUwZWQzKSwgV1RDUCgweDdhMjFkOTgzLCAweDI2NGY5MjcxKSwKLSAgV1RDUCgweDdhMGQyYjY4LCAweDI2OTE0MWNiKSwgV1RDUCgweDc5Zjg0ODllLCAweDI2ZDMxYzgwKSwgV1RDUCgweDc5ZTMzMGU0LCAweDI3MTUyMjJmKSwgV1RDUCgweDc5Y2RlM2Y4LCAweDI3NTc1MjczKSwKLSAgV1RDUCgweDc5Yjg2MTlhLCAweDI3OTlhY2VhKSwgV1RDUCgweDc5YTJhOTg5LCAweDI3ZGMzMTMwKSwgV1RDUCgweDc5OGNiYjg1LCAweDI4MWVkZWRmKSwgV1RDUCgweDc5NzY5NzRlLCAweDI4NjFiNTkxKSwKLSAgV1RDUCgweDc5NjAzY2E1LCAweDI4YTRiNGUwKSwgV1RDUCgweDc5NDlhYjRjLCAweDI4ZTdkYzY1KSwgV1RDUCgweDc5MzJlMzA0LCAweDI5MmIyYmI4KSwgV1RDUCgweDc5MWJlMzkwLCAweDI5NmVhMjcwKSwKLSAgV1RDUCgweDc5MDRhY2IzLCAweDI5YjI0MDI0KSwgV1RDUCgweDc4ZWQzZTMwLCAweDI5ZjYwNDZiKSwgV1RDUCgweDc4ZDU5N2NjLCAweDJhMzllZWQ4KSwgV1RDUCgweDc4YmRiOTRhLCAweDJhN2RmZjAyKSwKLSAgV1RDUCgweDc4YTVhMjcwLCAweDJhYzIzNDdjKSwgV1RDUCgweDc4OGQ1MzA0LCAweDJiMDY4ZWRhKSwgV1RDUCgweDc4NzRjYWNiLCAweDJiNGIwZGFlKSwgV1RDUCgweDc4NWMwOThkLCAweDJiOGZiMDhhKSwKLSAgV1RDUCgweDc4NDMwZjExLCAweDJiZDQ3NzAwKSwgV1RDUCgweDc4MjlkYjFmLCAweDJjMTk2MGExKSwgV1RDUCgweDc4MTA2ZDdmLCAweDJjNWU2Y2ZkKSwgV1RDUCgweDc3ZjZjNWZiLCAweDJjYTM5YmEzKSwKLSAgV1RDUCgweDc3ZGNlNDVjLCAweDJjZThlYzIzKSwgV1RDUCgweDc3YzJjODZlLCAweDJkMmU1ZTBiKSwgV1RDUCgweDc3YTg3MWZhLCAweDJkNzNmMGU4KSwgV1RDUCgweDc3OGRlMGNkLCAweDJkYjlhNDQ5KSwKLSAgV1RDUCgweDc3NzMxNGIyLCAweDJkZmY3N2I4KSwgV1RDUCgweDc3NTgwZDc4LCAweDJlNDU2YWM0KSwgV1RDUCgweDc3M2NjYWViLCAweDJlOGI3Y2Y2KSwgV1RDUCgweDc3MjE0Y2RiLCAweDJlZDFhZGRiKSwKLSAgV1RDUCgweDc3MDU5MzE1LCAweDJmMTdmY2ZiKSwgV1RDUCgweDc2ZTk5ZDY5LCAweDJmNWU2OWUyKSwgV1RDUCgweDc2Y2Q2YmE5LCAweDJmYTRmNDE5KSwgV1RDUCgweDc2YjBmZGE0LCAweDJmZWI5YjI3KSwKLSAgV1RDUCgweDc2OTQ1MzJlLCAweDMwMzI1ZTk2KSwgV1RDUCgweDc2Nzc2YzE3LCAweDMwNzkzZGVlKSwgV1RDUCgweDc2NWE0ODM0LCAweDMwYzAzOGI1KSwgV1RDUCgweDc2M2NlNzU5LCAweDMxMDc0ZTcyKSwKLSAgV1RDUCgweDc2MWY0OTU5LCAweDMxNGU3ZWFiKSwgV1RDUCgweDc2MDE2ZTBiLCAweDMxOTVjOGU2KSwgV1RDUCgweDc1ZTM1NTQ1LCAweDMxZGQyY2E5KSwgV1RDUCgweDc1YzRmZWRjLCAweDMyMjRhOTc5KSwKLSAgV1RDUCgweDc1YTY2YWFiLCAweDMyNmMzZWQ4KSwgV1RDUCgweDc1ODc5ODg3LCAweDMyYjNlYzRkKSwgV1RDUCgweDc1Njg4ODRiLCAweDMyZmJiMTU5KSwgV1RDUCgweDc1NDkzOWQxLCAweDMzNDM4ZDgxKSwKLSAgV1RDUCgweDc1MjlhY2Y0LCAweDMzOGI4MDQ1KSwgV1RDUCgweDc1MDllMThlLCAweDMzZDM4OTJhKSwgV1RDUCgweDc0ZTlkNzdkLCAweDM0MWJhN2IxKSwgV1RDUCgweDc0Yzk4ZTllLCAweDM0NjNkYjVhKSwKLSAgV1RDUCgweDc0YTkwNmNkLCAweDM0YWMyM2E3KSwgV1RDUCgweDc0ODgzZmVjLCAweDM0ZjQ4MDE5KSwgV1RDUCgweDc0NjczOWQ4LCAweDM1M2NmMDJmKSwgV1RDUCgweDc0NDVmNDcyLCAweDM1ODU3MzZhKSwKLSAgV1RDUCgweDc0MjQ2ZjljLCAweDM1Y2UwOTQ5KSwgV1RDUCgweDc0MDJhYjM3LCAweDM2MTZiMTRjKSwgV1RDUCgweDczZTBhNzI3LCAweDM2NWY2YWYwKSwgV1RDUCgweDczYmU2MzUwLCAweDM2YTgzNWI1KSwKLSAgV1RDUCgweDczOWJkZjk1LCAweDM2ZjExMTE4KSwgV1RDUCgweDczNzkxYmRkLCAweDM3MzlmYzk4KSwgV1RDUCgweDczNTYxODBlLCAweDM3ODJmN2IyKSwgV1RDUCgweDczMzJkNDEwLCAweDM3Y2MwMWUzKSwKLSAgV1RDUCgweDczMGY0ZmM5LCAweDM4MTUxYWE4KSwgV1RDUCgweDcyZWI4YjI0LCAweDM4NWU0MTdlKSwgV1RDUCgweDcyYzc4NjBhLCAweDM4YTc3NWUxKSwgV1RDUCgweDcyYTM0MDY2LCAweDM4ZjBiNzRkKSwKLSAgV1RDUCgweDcyN2ViYTI0LCAweDM5M2EwNTNlKSwgV1RDUCgweDcyNTlmMzMxLCAweDM5ODM1ZjMwKSwgV1RDUCgweDcyMzRlYjc5LCAweDM5Y2NjNDllKSwgV1RDUCgweDcyMGZhMmViLCAweDNhMTYzNTAzKSwKLSAgV1RDUCgweDcxZWExOTc3LCAweDNhNWZhZmRhKSwgV1RDUCgweDcxYzQ0ZjBjLCAweDNhYTkzNDllKSwgV1RDUCgweDcxOWU0MzlkLCAweDNhZjJjMmNhKSwgV1RDUCgweDcxNzdmNzFhLCAweDNiM2M1OWQ3KSwKLSAgV1RDUCgweDcxNTE2OTc4LCAweDNiODVmOTQwKSwgV1RDUCgweDcxMmE5YWFhLCAweDNiY2ZhMDdlKSwgV1RDUCgweDcxMDM4YWE0LCAweDNjMTk0ZjBkKSwgV1RDUCgweDcwZGMzOTVlLCAweDNjNjMwNDY0KSwKLSAgV1RDUCgweDcwYjRhNmNkLCAweDNjYWNiZmZmKSwgV1RDUCgweDcwOGNkMmU5LCAweDNjZjY4MTU1KSwgV1RDUCgweDcwNjRiZGFiLCAweDNkNDA0N2UxKSwgV1RDUCgweDcwM2M2NzBkLCAweDNkOGExMzFjKSwKLSAgV1RDUCgweDcwMTNjZjBhLCAweDNkZDNlMjdlKSwgV1RDUCgweDZmZWFmNTljLCAweDNlMWRiNTgwKSwgV1RDUCgweDZmYzFkYWMxLCAweDNlNjc4YjliKSwgV1RDUCgweDZmOTg3ZTc2LCAweDNlYjE2NDQ5KSwKLSAgV1RDUCgweDZmNmVlMGI5LCAweDNlZmIzZjAxKSwgV1RDUCgweDZmNDUwMThiLCAweDNmNDUxYjNkKSwgV1RDUCgweDZmMWFlMGViLCAweDNmOGVmODc0KSwgV1RDUCgweDZlZjA3ZWRiLCAweDNmZDhkNjIwKSwKLSAgV1RDUCgweDZlYzVkYjVkLCAweDQwMjJiM2I5KSwgV1RDUCgweDZlOWFmNjc1LCAweDQwNmM5MGI3KSwgV1RDUCgweDZlNmZkMDI3LCAweDQwYjY2YzkzKSwgV1RDUCgweDZlNDQ2ODc5LCAweDQxMDA0NmM1KSwKLSAgV1RDUCgweDZlMThiZjcxLCAweDQxNGExZWM2KSwgV1RDUCgweDZkZWNkNTE3LCAweDQxOTNmNDBkKSwgV1RDUCgweDZkYzBhOTcyLCAweDQxZGRjNjE1KSwgV1RDUCgweDZkOTQzYzhkLCAweDQyMjc5NDU1KSwKLSAgV1RDUCgweDZkNjc4ZTcxLCAweDQyNzE1ZTQ1KSwgV1RDUCgweDZkM2E5ZjJhLCAweDQyYmIyMzVmKSwgV1RDUCgweDZkMGQ2ZWM1LCAweDQzMDRlMzFhKSwgV1RDUCgweDZjZGZmZDRmLCAweDQzNGU5Y2YxKSwKLSAgV1RDUCgweDZjYjI0YWQ2LCAweDQzOTg1MDViKSwgV1RDUCgweDZjODQ1NzZiLCAweDQzZTFmY2QxKSwgV1RDUCgweDZjNTYyMzFjLCAweDQ0MmJhMWNkKSwgV1RDUCgweDZjMjdhZGZkLCAweDQ0NzUzZWM3KSwKLSAgV1RDUCgweDZiZjhmODFlLCAweDQ0YmVkMzNhKSwgV1RDUCgweDZiY2EwMTk1LCAweDQ1MDg1ZTlkKSwgV1RDUCgweDZiOWFjYTc1LCAweDQ1NTFlMDZiKSwgV1RDUCgweDZiNmI1MmQ1LCAweDQ1OWI1ODFlKSwKLSAgV1RDUCgweDZiM2I5YWM5LCAweDQ1ZTRjNTJmKSwgV1RDUCgweDZiMGJhMjZiLCAweDQ2MmUyNzE3KSwgV1RDUCgweDZhZGI2OWQzLCAweDQ2Nzc3ZDUyKSwgV1RDUCgweDZhYWFmMTFiLCAweDQ2YzBjNzVhKSwKLSAgV1RDUCgweDZhN2EzODVjLCAweDQ3MGEwNGE5KSwgV1RDUCgweDZhNDkzZmIzLCAweDQ3NTMzNGI5KSwgV1RDUCgweDZhMTgwNzNkLCAweDQ3OWM1NzA3KSwgV1RDUCgweDY5ZTY4ZjE3LCAweDQ3ZTU2YjBjKSwKLSAgV1RDUCgweDY5YjRkNzYxLCAweDQ4MmU3MDQ1KSwgV1RDUCgweDY5ODJlMDM5LCAweDQ4Nzc2NjJjKSwgV1RDUCgweDY5NTBhOWMwLCAweDQ4YzA0YzNmKSwgV1RDUCgweDY5MWUzNDFhLCAweDQ5MDkyMWY4KSwKLSAgV1RDUCgweDY4ZWI3ZjY3LCAweDQ5NTFlNmQ1KSwgV1RDUCgweDY4Yjg4YmNkLCAweDQ5OWE5YTUxKSwgV1RDUCgweDY4ODU1OTcwLCAweDQ5ZTMzYmViKSwgV1RDUCgweDY4NTFlODc1LCAweDRhMmJjYjFmKSwKLSAgV1RDUCgweDY4MWUzOTA1LCAweDRhNzQ0NzZiKSwgV1RDUCgweDY3ZWE0YjQ3LCAweDRhYmNiMDRjKSwgV1RDUCgweDY3YjYxZjYzLCAweDRiMDUwNTQxKSwgV1RDUCgweDY3ODFiNTg1LCAweDRiNGQ0NWM5KSwKLSAgV1RDUCgweDY3NGQwZGQ2LCAweDRiOTU3MTYyKSwgV1RDUCgweDY3MTgyODgzLCAweDRiZGQ4NzhjKSwgV1RDUCgweDY2ZTMwNWI4LCAweDRjMjU4N2M2KSwgV1RDUCgweDY2YWRhNWE1LCAweDRjNmQ3MTkwKSwKLSAgV1RDUCgweDY2NzgwODc4LCAweDRjYjU0NDZhKSwgV1RDUCgweDY2NDIyZTYwLCAweDRjZmNmZmQ1KSwgV1RDUCgweDY2MGMxNzkwLCAweDRkNDRhMzUzKSwgV1RDUCgweDY1ZDVjNDM5LCAweDRkOGMyZTY0KSwKLSAgV1RDUCgweDY1OWYzNDhlLCAweDRkZDNhMDhjKSwgV1RDUCgweDY1Njg2OGMzLCAweDRlMWFmOTRiKSwgV1RDUCgweDY1MzE2MTBkLCAweDRlNjIzODI1KSwgV1RDUCgweDY0ZmExZGEzLCAweDRlYTk1YzlkKSwKLSAgV1RDUCgweDY0YzI5ZWJiLCAweDRlZjA2NjM3KSwgV1RDUCgweDY0OGFlNDhkLCAweDRmMzc1NDc3KSwgV1RDUCgweDY0NTJlZjUzLCAweDRmN2UyNmUxKSwgV1RDUCgweDY0MWFiZjQ2LCAweDRmYzRkY2ZiKSwKLSAgV1RDUCgweDYzZTI1NGEyLCAweDUwMGI3NjQ5KSwgV1RDUCgweDYzYTlhZmEyLCAweDUwNTFmMjUzKSwgV1RDUCgweDYzNzBkMDgzLCAweDUwOTg1MDlmKSwgV1RDUCgweDYzMzdiNzg0LCAweDUwZGU5MGIzKSwKLSAgV1RDUCgweDYyZmU2NGUzLCAweDUxMjRiMjE4KSwgV1RDUCgweDYyYzRkOGUwLCAweDUxNmFiNDU1KSwgV1RDUCgweDYyOGIxM2JjLCAweDUxYjA5NmYzKSwgV1RDUCgweDYyNTExNWI4LCAweDUxZjY1OTdiKSwKLSAgV1RDUCgweDYyMTZkZjE4LCAweDUyM2JmYjc4KSwgV1RDUCgweDYxZGM3MDFmLCAweDUyODE3YzcyKSwgV1RDUCgweDYxYTFjOTEyLCAweDUyYzZkYmY1KSwgV1RDUCgweDYxNjZlYTM2LCAweDUzMGMxOThkKSwKLSAgV1RDUCgweDYxMmJkM2QyLCAweDUzNTEzNGM1KSwgV1RDUCgweDYwZjA4NjJkLCAweDUzOTYyZDJhKSwgV1RDUCgweDYwYjUwMTkwLCAweDUzZGIwMjRhKSwgV1RDUCgweDYwNzk0NjQ0LCAweDU0MWZiM2IxKSwKLSAgV1RDUCgweDYwM2Q1NDk0LCAweDU0NjQ0MGVmKSwgV1RDUCgweDYwMDEyY2NhLCAweDU0YThhOTkyKSwgV1RDUCgweDVmYzRjZjMzLCAweDU0ZWNlZDJiKSwgV1RDUCgweDVmODgzYzFjLCAweDU1MzEwYjQ4KSwKLSAgV1RDUCgweDVmNGI3M2QyLCAweDU1NzUwMzdjKSwgV1RDUCgweDVmMGU3NmE1LCAweDU1YjhkNTU4KSwgV1RDUCgweDVlZDE0NGU1LCAweDU1ZmM4MDZmKSwgV1RDUCgweDVlOTNkZWUxLCAweDU2NDAwNDUyKSwKLSAgV1RDUCgweDVlNTY0NGVjLCAweDU2ODM2MDk2KSwgV1RDUCgweDVlMTg3NzU3LCAweDU2YzY5NGNmKSwgV1RDUCgweDVkZGE3Njc3LCAweDU3MDlhMDkyKSwgV1RDUCgweDVkOWM0MjlmLCAweDU3NGM4Mzc0KSwKLSAgV1RDUCgweDVkNWRkYzI0LCAweDU3OGYzZDBkKSwgV1RDUCgweDVkMWY0MzVkLCAweDU3ZDFjY2YyKSwgV1RDUCgweDVjZTA3OGEwLCAweDU4MTQzMmJkKSwgV1RDUCgweDVjYTE3YzQ1LCAweDU4NTY2ZTA0KSwKLSAgV1RDUCgweDVjNjI0ZWE0LCAweDU4OTg3ZTYzKSwgV1RDUCgweDVjMjJmMDE2LCAweDU4ZGE2MzcyKSwgV1RDUCgweDViZTM2MGY2LCAweDU5MWMxY2NjKSwgV1RDUCgweDViYTNhMTlmLCAweDU5NWRhYTBkKSwKLSAgV1RDUCgweDViNjNiMjZjLCAweDU5OWYwYWQxKSwgV1RDUCgweDViMjM5M2JhLCAweDU5ZTAzZWI2KSwgV1RDUCgweDVhZTM0NWU3LCAweDVhMjE0NTU4KSwgV1RDUCgweDVhYTJjOTUxLCAweDVhNjIxZTU2KSwKK2NvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTQ4MFtdID0geworICAgIFNUQ1AoMHg3ZmZmZmZmZiwgMHgwMDAwMDAwMCksIFNUQ1AoMHg3ZmZmZDMxNSwgMHgwMDZiM2I5YiksCisgICAgU1RDUCgweDdmZmY0YzU0LCAweDAwZDY3NmViKSwgU1RDUCgweDdmZmU2YmJmLCAweDAxNDFiMWE1KSwKKyAgICBTVENQKDB4N2ZmZDMxNTQsIDB4MDFhY2ViN2MpLCBTVENQKDB4N2ZmYjlkMTUsIDB4MDIxODI0MjcpLAorICAgIFNUQ1AoMHg3ZmY5YWYwNCwgMHgwMjgzNWI1YSksIFNUQ1AoMHg3ZmY3NjcyMSwgMHgwMmVlOTBjOCksCisgICAgU1RDUCgweDdmZjRjNTZmLCAweDAzNTljNDI4KSwgU1RDUCgweDdmZjFjOWVmLCAweDAzYzRmNTJmKSwKKyAgICBTVENQKDB4N2ZlZTc0YTIsIDB4MDQzMDIzOGYpLCBTVENQKDB4N2ZlYWM1OGQsIDB4MDQ5YjRmMDApLAorICAgIFNUQ1AoMHg3ZmU2YmNiMCwgMHgwNTA2NzczNCksIFNUQ1AoMHg3ZmUyNWEwZiwgMHgwNTcxOWJlMiksCisgICAgU1RDUCgweDdmZGQ5ZGFkLCAweDA1ZGNiY2JlKSwgU1RDUCgweDdmZDg4NzhlLCAweDA2NDdkOTdjKSwKKyAgICBTVENQKDB4N2ZkMzE3YjQsIDB4MDZiMmYxZDIpLCBTVENQKDB4N2ZjZDRlMjQsIDB4MDcxZTA1NzUpLAorICAgIFNUQ1AoMHg3ZmM3MmFlMiwgMHgwNzg5MTQxOCksIFNUQ1AoMHg3ZmMwYWRmMiwgMHgwN2Y0MWQ3MiksCisgICAgU1RDUCgweDdmYjlkNzU5LCAweDA4NWYyMTM3KSwgU1RDUCgweDdmYjJhNzFiLCAweDA4Y2ExZjFiKSwKKyAgICBTVENQKDB4N2ZhYjFkM2QsIDB4MDkzNTE2ZDQpLCBTVENQKDB4N2ZhMzM5YzUsIDB4MDlhMDA4MTcpLAorICAgIFNUQ1AoMHg3ZjlhZmNiOSwgMHgwYTBhZjI5OSksIFNUQ1AoMHg3ZjkyNjYxZCwgMHgwYTc1ZDYwZSksCisgICAgU1RDUCgweDdmODk3NWY5LCAweDBhZTBiMjJjKSwgU1RDUCgweDdmODAyYzUyLCAweDBiNGI4NmE4KSwKKyAgICBTVENQKDB4N2Y3Njg5MmYsIDB4MGJiNjUzMzYpLCBTVENQKDB4N2Y2YzhjOTYsIDB4MGMyMTE3OGMpLAorICAgIFNUQ1AoMHg3ZjYyMzY4ZiwgMHgwYzhiZDM1ZSksIFNUQ1AoMHg3ZjU3ODcyMSwgMHgwY2Y2ODY2MiksCisgICAgU1RDUCgweDdmNGM3ZTU0LCAweDBkNjEzMDRlKSwgU1RDUCgweDdmNDExYzJmLCAweDBkY2JkMGQ1KSwKKyAgICBTVENQKDB4N2YzNTYwYjksIDB4MGUzNjY3YWQpLCBTVENQKDB4N2YyOTRiZmQsIDB4MGVhMGY0OGMpLAorICAgIFNUQ1AoMHg3ZjFjZGUwMSwgMHgwZjBiNzcyNyksIFNUQ1AoMHg3ZjEwMTZjZSwgMHgwZjc1ZWYzMyksCisgICAgU1RDUCgweDdmMDJmNjZmLCAweDBmZTA1YzY0KSwgU1RDUCgweDdlZjU3Y2VhLCAweDEwNGFiZTcxKSwKKyAgICBTVENQKDB4N2VlN2FhNGMsIDB4MTBiNTE1MGYpLCBTVENQKDB4N2VkOTdlOWMsIDB4MTExZjVmZjQpLAorICAgIFNUQ1AoMHg3ZWNhZjllNSwgMHgxMTg5OWVkMyksIFNUQ1AoMHg3ZWJjMWMzMSwgMHgxMWYzZDE2NCksCisgICAgU1RDUCgweDdlYWNlNThhLCAweDEyNWRmNzViKSwgU1RDUCgweDdlOWQ1NWZjLCAweDEyYzgxMDZmKSwKKyAgICBTVENQKDB4N2U4ZDZkOTEsIDB4MTMzMjFjNTMpLCBTVENQKDB4N2U3ZDJjNTQsIDB4MTM5YzFhYmYpLAorICAgIFNUQ1AoMHg3ZTZjOTI1MSwgMHgxNDA2MGI2OCksIFNUQ1AoMHg3ZTViOWY5MywgMHgxNDZmZWUwMyksCisgICAgU1RDUCgweDdlNGE1NDI2LCAweDE0ZDljMjQ1KSwgU1RDUCgweDdlMzhiMDE3LCAweDE1NDM4N2U2KSwKKyAgICBTVENQKDB4N2UyNmIzNzEsIDB4MTVhZDNlOWEpLCBTVENQKDB4N2UxNDVlNDIsIDB4MTYxNmU2MTgpLAorICAgIFNUQ1AoMHg3ZTAxYjA5NiwgMHgxNjgwN2UxNSksIFNUQ1AoMHg3ZGVlYWE3YSwgMHgxNmVhMDY0NiksCisgICAgU1RDUCgweDdkZGI0YmZjLCAweDE3NTM3ZTYzKSwgU1RDUCgweDdkYzc5NTI5LCAweDE3YmNlNjIxKSwKKyAgICBTVENQKDB4N2RiMzg2MGYsIDB4MTgyNjNkMzYpLCBTVENQKDB4N2Q5ZjFlYmQsIDB4MTg4ZjgzNTcpLAorICAgIFNUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksIFNUQ1AoMHg3ZDc1NDdhNywgMHgxOTYxZGI5YiksCisgICAgU1RDUCgweDdkNWZkODAxLCAweDE5Y2FlZDI5KSwgU1RDUCgweDdkNGExMDVkLCAweDFhMzNlYzljKSwKKyAgICBTVENQKDB4N2QzM2YwY2EsIDB4MWE5Y2Q5YWMpLCBTVENQKDB4N2QxZDc5NTgsIDB4MWIwNWI0MGYpLAorICAgIFNUQ1AoMHg3ZDA2YWExNiwgMHgxYjZlN2I3YSksIFNUQ1AoMHg3Y2VmODMxNSwgMHgxYmQ3MmZhNCksCisgICAgU1RDUCgweDdjZDgwNDY0LCAweDFjM2ZkMDQ1KSwgU1RDUCgweDdjYzAyZTE1LCAweDFjYTg1ZDEyKSwKKyAgICBTVENQKDB4N2NhODAwMzgsIDB4MWQxMGQ1YzIpLCBTVENQKDB4N2M4ZjdhZGUsIDB4MWQ3OTNhMGIpLAorICAgIFNUQ1AoMHg3Yzc2OWUxOCwgMHgxZGUxODlhNiksIFNUQ1AoMHg3YzVkNjlmNywgMHgxZTQ5YzQ0NyksCisgICAgU1RDUCgweDdjNDNkZThlLCAweDFlYjFlOWE3KSwgU1RDUCgweDdjMjlmYmVlLCAweDFmMTlmOTdiKSwKKyAgICBTVENQKDB4N2MwZmMyMmEsIDB4MWY4MWYzN2MpLCBTVENQKDB4N2JmNTMxNTMsIDB4MWZlOWQ3NWYpLAorICAgIFNUQ1AoMHg3YmRhNDk3ZCwgMHgyMDUxYTRkZCksIFNUQ1AoMHg3YmJmMGFiYSwgMHgyMGI5NWJhYyksCisgICAgU1RDUCgweDdiYTM3NTFkLCAweDIxMjBmYjgzKSwgU1RDUCgweDdiODc4OGJhLCAweDIxODg4NDFhKSwKKyAgICBTVENQKDB4N2I2YjQ1YTUsIDB4MjFlZmY1MjgpLCBTVENQKDB4N2I0ZWFiZjEsIDB4MjI1NzRlNjUpLAorICAgIFNUQ1AoMHg3YjMxYmJiMiwgMHgyMmJlOGY4NyksIFNUQ1AoMHg3YjE0NzRmZCwgMHgyMzI1Yjg0NyksCisgICAgU1RDUCgweDdhZjZkN2U2LCAweDIzOGNjODVkKSwgU1RDUCgweDdhZDhlNDgyLCAweDIzZjNiZjdlKSwKKyAgICBTVENQKDB4N2FiYTlhZTYsIDB4MjQ1YTlkNjUpLCBTVENQKDB4N2E5YmZiMjcsIDB4MjRjMTYxYzcpLAorICAgIFNUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksIFNUQ1AoMHg3YTVkYjk5NywgMHgyNThlOWNlMCksCisgICAgU1RDUCgweDdhM2UxN2YyLCAweDI1ZjUxMzA3KSwgU1RDUCgweDdhMWUyMDgyLCAweDI2NWI2ZThhKSwKKyAgICBTVENQKDB4NzlmZGQzNWMsIDB4MjZjMWFmMjIpLCBTVENQKDB4NzlkZDMwOTgsIDB4MjcyN2Q0ODYpLAorICAgIFNUQ1AoMHg3OWJjMzg0ZCwgMHgyNzhkZGU2ZSksIFNUQ1AoMHg3OTlhZWE5MiwgMHgyN2YzY2M5NCksCisgICAgU1RDUCgweDc5Nzk0NzdkLCAweDI4NTk5ZWIwKSwgU1RDUCgweDc5NTc0ZjI4LCAweDI4YmY1NDdiKSwKKyAgICBTVENQKDB4NzkzNTAxYTksIDB4MjkyNGVkYWMpLCBTVENQKDB4NzkxMjVmMTksIDB4Mjk4YTY5ZmMpLAorICAgIFNUQ1AoMHg3OGVmNjc4ZiwgMHgyOWVmYzkyNSksIFNUQ1AoMHg3OGNjMWIyNiwgMHgyYTU1MGFkZiksCisgICAgU1RDUCgweDc4YTg3OWY0LCAweDJhYmEyZWU0KSwgU1RDUCgweDc4ODQ4NDE0LCAweDJiMWYzNGViKSwKKyAgICBTVENQKDB4Nzg2MDM5OWUsIDB4MmI4NDFjYWYpLCBTVENQKDB4NzgzYjlhYWQsIDB4MmJlOGU1ZTgpLAorICAgIFNUQ1AoMHg3ODE2YTc1OSwgMHgyYzRkOTA1MCksIFNUQ1AoMHg3N2YxNWZiYywgMHgyY2IyMWJhMCksCisgICAgU1RDUCgweDc3Y2JjM2YyLCAweDJkMTY4NzkyKSwgU1RDUCgweDc3YTVkNDEzLCAweDJkN2FkM2RlKSwKKyAgICBTVENQKDB4Nzc3ZjkwM2MsIDB4MmRkZjAwNDApLCBTVENQKDB4Nzc1OGY4ODYsIDB4MmU0MzBjNmYpLAorICAgIFNUQ1AoMHg3NzMyMGQwZCwgMHgyZWE2ZjgyNyksIFNUQ1AoMHg3NzBhY2RlYywgMHgyZjBhYzMyMCksCisgICAgU1RDUCgweDc2ZTMzYjNmLCAweDJmNmU2ZDE2KSwgU1RDUCgweDc2YmI1NTIxLCAweDJmZDFmNWMxKSwKKyAgICBTVENQKDB4NzY5MzFiYWUsIDB4MzAzNTVjZGQpLCBTVENQKDB4NzY2YThmMDQsIDB4MzA5OGEyMjMpLAorICAgIFNUQ1AoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksIFNUQ1AoMHg3NjE4N2M3NywgMHgzMTVlYzYxNyksCisgICAgU1RDUCgweDc1ZWVmNmNlLCAweDMxYzFhNDNiKSwgU1RDUCgweDc1YzUxZTYxLCAweDMyMjQ1ZjcyKSwKKyAgICBTVENQKDB4NzU5YWYzNGMsIDB4MzI4NmY3NzkpLCBTVENQKDB4NzU3MDc1YWMsIDB4MzJlOTZjMDkpLAorICAgIFNUQ1AoMHg3NTQ1YTVhMCwgMHgzMzRiYmNkZSksIFNUQ1AoMHg3NTFhODM0NiwgMHgzM2FkZTliMyksCisgICAgU1RDUCgweDc0ZWYwZWJjLCAweDM0MGZmMjQyKSwgU1RDUCgweDc0YzM0ODIwLCAweDM0NzFkNjQ3KSwKKyAgICBTVENQKDB4NzQ5NzJmOTIsIDB4MzRkMzk1N2UpLCBTVENQKDB4NzQ2YWM1MmYsIDB4MzUzNTJmYTEpLAorICAgIFNUQ1AoMHg3NDNlMDkxOCwgMHgzNTk2YTQ2YyksIFNUQ1AoMHg3NDEwZmI2YiwgMHgzNWY3ZjM5YyksCisgICAgU1RDUCgweDczZTM5YzQ5LCAweDM2NTkxY2VhKSwgU1RDUCgweDczYjVlYmQxLCAweDM2YmEyMDE0KSwKKyAgICBTVENQKDB4NzM4N2VhMjMsIDB4MzcxYWZjZDUpLCBTVENQKDB4NzM1OTk3NjAsIDB4Mzc3YmIyZTkpLAorICAgIFNUQ1AoMHg3MzJhZjNhNywgMHgzN2RjNDIwYyksIFNUQ1AoMHg3MmZiZmYxYiwgMHgzODNjYTlmYiksCisgICAgU1RDUCgweDcyY2NiOWRiLCAweDM4OWNlYTcyKSwgU1RDUCgweDcyOWQyNDA5LCAweDM4ZmQwMzJkKSwKKyAgICBTVENQKDB4NzI2ZDNkYzYsIDB4Mzk1Y2YzZTkpLCBTVENQKDB4NzIzZDA3MzQsIDB4MzliY2JjNjMpLAorICAgIFNUQ1AoMHg3MjBjODA3NSwgMHgzYTFjNWM1NyksIFNUQ1AoMHg3MWRiYTlhYiwgMHgzYTdiZDM4MiksCisgICAgU1RDUCgweDcxYWE4MmY3LCAweDNhZGIyMWExKSwgU1RDUCgweDcxNzkwYzdlLCAweDNiM2E0NjcyKSwKKyAgICBTVENQKDB4NzE0NzQ2NjAsIDB4M2I5OTQxYjEpLCBTVENQKDB4NzExNTMwYzIsIDB4M2JmODEzMWMpLAorICAgIFNUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksIFNUQ1AoMHg3MGIwMTc5MCwgMHgzY2I1Mzc2YiksCisgICAgU1RDUCgweDcwN2QxNDQzLCAweDNkMTM4OWNiKSwgU1RDUCgweDcwNDljMjAzLCAweDNkNzFiMTRkKSwKKyAgICBTVENQKDB4NzAxNjIwZjUsIDB4M2RjZmFkYjApLCBTVENQKDB4NmZlMjMxM2MsIDB4M2UyZDdlYjEpLAorICAgIFNUQ1AoMHg2ZmFkZjJmYywgMHgzZThiMjQwZSksIFNUQ1AoMHg2Zjc5NjY1YiwgMHgzZWU4OWQ4NiksCisgICAgU1RDUCgweDZmNDQ4YjdlLCAweDNmNDVlYWQ4KSwgU1RDUCgweDZmMGY2Mjg5LCAweDNmYTMwYmMxKSwKKyAgICBTVENQKDB4NmVkOWViYTEsIDB4NDAwMDAwMDApLCBTVENQKDB4NmVhNDI2ZWQsIDB4NDA1Y2M3NTQpLAorICAgIFNUQ1AoMHg2ZTZlMTQ5MiwgMHg0MGI5NjE3ZCksIFNUQ1AoMHg2ZTM3YjRiNiwgMHg0MTE1Y2UzOCksCisgICAgU1RDUCgweDZlMDEwNzgwLCAweDQxNzIwZDQ2KSwgU1RDUCgweDZkY2EwZDE0LCAweDQxY2UxZTY1KSwKKyAgICBTVENQKDB4NmQ5MmM1OWIsIDB4NDIyYTAxNTQpLCBTVENQKDB4NmQ1YjMxM2IsIDB4NDI4NWI1ZDQpLAorICAgIFNUQ1AoMHg2ZDIzNTAxYiwgMHg0MmUxM2JhNCksIFNUQ1AoMHg2Y2ViMjI2MSwgMHg0MzNjOTI4MyksCisgICAgU1RDUCgweDZjYjJhODM3LCAweDQzOTdiYTMyKSwgU1RDUCgweDZjNzllMWMyLCAweDQzZjJiMjcxKSwKKyAgICBTVENQKDB4NmM0MGNmMmMsIDB4NDQ0ZDdhZmYpLCBTVENQKDB4NmMwNzcwOWIsIDB4NDRhODEzOWUpLAorICAgIFNUQ1AoMHg2YmNkYzYzOSwgMHg0NTAyN2MwYyksIFNUQ1AoMHg2YjkzZDAyZSwgMHg0NTVjYjQwYyksCisgICAgU1RDUCgweDZiNTk4ZWEzLCAweDQ1YjZiYjVlKSwgU1RDUCgweDZiMWYwMWMwLCAweDQ2MTA5MWMyKSwKKyAgICBTVENQKDB4NmFlNDI5YWUsIDB4NDY2YTM2ZjkpLCBTVENQKDB4NmFhOTA2OTcsIDB4NDZjM2FhYzUpLAorICAgIFNUQ1AoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksIFNUQ1AoMHg2YTMxZTAwMCwgMHg0Nzc1ZmQxZiksCisgICAgU1RDUCgweDY5ZjVkY2QzLCAweDQ3Y2VkYjMxKSwgU1RDUCgweDY5Yjk4ZjQ4LCAweDQ4Mjc4NmRjKSwKKyAgICBTVENQKDB4Njk3Y2Y3OGEsIDB4NDg3ZmZmZTQpLCBTVENQKDB4Njk0MDE1YzMsIDB4NDhkODQ2MDkpLAorICAgIFNUQ1AoMHg2OTAyZWExZCwgMHg0OTMwNTkwZiksIFNUQ1AoMHg2OGM1NzRjNCwgMHg0OTg4MzhiNiksCisgICAgU1RDUCgweDY4ODdiNWUyLCAweDQ5ZGZlNGMyKSwgU1RDUCgweDY4NDlhZGEzLCAweDRhMzc1Y2Y1KSwKKyAgICBTVENQKDB4NjgwYjVjMzMsIDB4NGE4ZWExMTEpLCBTVENQKDB4NjdjY2MxYmUsIDB4NGFlNWIwZGEpLAorICAgIFNUQ1AoMHg2NzhkZGU2ZSwgMHg0YjNjOGMxMiksIFNUQ1AoMHg2NzRlYjI3MSwgMHg0YjkzMzI3YyksCisgICAgU1RDUCgweDY3MGYzZGYzLCAweDRiZTlhM2RiKSwgU1RDUCgweDY2Y2Y4MTIwLCAweDRjM2ZkZmY0KSwKKyAgICBTVENQKDB4NjY4ZjdjMjUsIDB4NGM5NWU2ODgpLCBTVENQKDB4NjY0ZjJmMmUsIDB4NGNlYmI3NWMpLAorICAgIFNUQ1AoMHg2NjBlOWE2YSwgMHg0ZDQxNTIzNCksIFNUQ1AoMHg2NWNkYmUwNSwgMHg0ZDk2YjZkMyksCisgICAgU1RDUCgweDY1OGM5YTJkLCAweDRkZWJlNGZlKSwgU1RDUCgweDY1NGIyZjEwLCAweDRlNDBkYzc5KSwKKyAgICBTVENQKDB4NjUwOTdjZGIsIDB4NGU5NTlkMDgpLCBTVENQKDB4NjRjNzgzYmQsIDB4NGVlYTI2NzApLAorICAgIFNUQ1AoMHg2NDg1NDNlNCwgMHg0ZjNlNzg3NSksIFNUQ1AoMHg2NDQyYmQ3ZSwgMHg0ZjkyOTJkYyksCisgICAgU1RDUCgweDYzZmZmMGJhLCAweDRmZTY3NTZhKSwgU1RDUCgweDYzYmNkZGM3LCAweDUwM2ExZmU1KSwKKyAgICBTVENQKDB4NjM3OTg0ZDQsIDB4NTA4ZDkyMTEpLCBTVENQKDB4NjMzNWU2MTEsIDB4NTBlMGNiYjQpLAorICAgIFNUQ1AoMHg2MmYyMDFhYywgMHg1MTMzY2M5NCksIFNUQ1AoMHg2MmFkZDdkNiwgMHg1MTg2OTQ3NiksCisgICAgU1RDUCgweDYyNjk2OGJlLCAweDUxZDkyMzIxKSwgU1RDUCgweDYyMjRiNDk1LCAweDUyMmI3ODU5KSwKKyAgICBTVENQKDB4NjFkZmJiOGEsIDB4NTI3ZDkzZTYpLCBTVENQKDB4NjE5YTdkY2UsIDB4NTJjZjc1OGYpLAorICAgIFNUQ1AoMHg2MTU0ZmI5MSwgMHg1MzIxMWQxOCksIFNUQ1AoMHg2MTBmMzUwNSwgMHg1MzcyOGE0YSksCisgICAgU1RDUCgweDYwYzkyYTVhLCAweDUzYzNiY2VhKSwgU1RDUCgweDYwODJkYmMxLCAweDU0MTRiNGMxKSwKKyAgICBTVENQKDB4NjAzYzQ5NmMsIDB4NTQ2NTcxOTQpLCBTVENQKDB4NWZmNTczOGQsIDB4NTRiNWYzMmMpLAorICAgIFNUQ1AoMHg1ZmFlNWE1NSwgMHg1NTA2Mzk1MSksIFNUQ1AoMHg1ZjY2ZmRmNSwgMHg1NTU2NDNjOCksCisgICAgU1RDUCgweDVmMWY1ZWExLCAweDU1YTYxMjVjKSwgU1RDUCgweDVlZDc3YzhhLCAweDU1ZjVhNGQyKSwKKyAgICBTVENQKDB4NWU4ZjU3ZTIsIDB4NTY0NGZhZjQpLCBTVENQKDB4NWU0NmYwZGQsIDB4NTY5NDE0OGIpLAorICAgIFNUQ1AoMHg1ZGZlNDdhZCwgMHg1NmUyZjE1ZCksIFNUQ1AoMHg1ZGI1NWM4NiwgMHg1NzMxOTEzNSksCisgICAgU1RDUCgweDVkNmMyZjk5LCAweDU3N2ZmM2RhKSwgU1RDUCgweDVkMjJjMTFjLCAweDU3Y2UxOTE3KSwKKyAgICBTVENQKDB4NWNkOTExNDAsIDB4NTgxYzAwYjMpLCBTVENQKDB4NWM4ZjIwM2IsIDB4NTg2OWFhNzkpLAorICAgIFNUQ1AoMHg1YzQ0ZWU0MCwgMHg1OGI3MTYzMiksIFNUQ1AoMHg1YmZhN2I4MiwgMHg1OTA0NDNhNyksCisgICAgU1RDUCgweDViYWZjODM3LCAweDU5NTEzMmEyKSwgU1RDUCgweDViNjRkNDkyLCAweDU5OWRlMmVlKSwKKyAgICBTVENQKDB4NWIxOWEwYzgsIDB4NTllYTU0NTQpLCBTVENQKDB4NWFjZTJkMGYsIDB4NWEzNjg2OWYpLAorICAgIFNUQ1AoMHg1YTgyNzk5YSwgMHg1YTgyNzk5YSksCiB9OwogCiBSQU1fQUxJR04KIExOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzEyOFtdID0KLXsKLSAgV1RDUCgweDdmZmY2MjE2LCAweDAwYzkwZjg4KSwgV1RDUCgweDdmZmE3MmQxLCAweDAyNWIyNmQ3KSwgV1RDUCgweDdmZjA5NDc4LCAweDAzZWQyNmU2KSwgV1RDUCgweDdmZTFjNzZiLCAweDA1N2YwMDM1KSwKLSAgV1RDUCgweDdmY2UwYzNlLCAweDA3MTBhMzQ1KSwgV1RDUCgweDdmYjU2M2IzLCAweDA4YTIwMDlhKSwgV1RDUCgweDdmOTdjZWJkLCAweDBhMzMwOGJkKSwgV1RDUCgweDdmNzU0ZTgwLCAweDBiYzNhYzM1KSwKLSAgV1RDUCgweDdmNGRlNDUxLCAweDBkNTNkYjkyKSwgV1RDUCgweDdmMjE5MWI0LCAweDBlZTM4NzY2KSwgV1RDUCgweDdlZjA1ODYwLCAweDEwNzJhMDQ4KSwgV1RDUCgweDdlYmEzYTM5LCAweDEyMDExNmQ1KSwKLSAgV1RDUCgweDdlN2YzOTU3LCAweDEzOGVkYmIxKSwgV1RDUCgweDdlM2Y1N2ZmLCAweDE1MWJkZjg2KSwgV1RDUCgweDdkZmE5OGE4LCAweDE2YTgxMzA1KSwgV1RDUCgweDdkYjBmZGY4LCAweDE4MzM2NmU5KSwKLSAgV1RDUCgweDdkNjI4YWM2LCAweDE5YmRjYmYzKSwgV1RDUCgweDdkMGY0MjE4LCAweDFiNDczMmVmKSwgV1RDUCgweDdjYjcyNzI0LCAweDFjY2Y4Y2IzKSwgV1RDUCgweDdjNWEzZDUwLCAweDFlNTZjYTFlKSwKLSAgV1RDUCgweDdiZjg4ODMwLCAweDFmZGNkYzFiKSwgV1RDUCgweDdiOTIwYjg5LCAweDIxNjFiM2EwKSwgV1RDUCgweDdiMjZjYjRmLCAweDIyZTU0MWFmKSwgV1RDUCgweDdhYjZjYmE0LCAweDI0Njc3NzU4KSwKLSAgV1RDUCgweDdhNDIxMGQ4LCAweDI1ZTg0NWI2KSwgV1RDUCgweDc5Yzg5ZjZlLCAweDI3Njc5ZGY0KSwgV1RDUCgweDc5NGE3YzEyLCAweDI4ZTU3MTRiKSwgV1RDUCgweDc4YzdhYmEyLCAweDJhNjFiMTAxKSwKLSAgV1RDUCgweDc4NDAzMzI5LCAweDJiZGM0ZTZmKSwgV1RDUCgweDc3YjQxN2RmLCAweDJkNTUzYWZjKSwgV1RDUCgweDc3MjM1ZjJkLCAweDJlY2M2ODFlKSwgV1RDUCgweDc2OGUwZWE2LCAweDMwNDFjNzYxKSwKLSAgV1RDUCgweDc1ZjQyYzBiLCAweDMxYjU0YTVlKSwgV1RDUCgweDc1NTViZDRjLCAweDMzMjZlMmMzKSwgV1RDUCgweDc0YjJjODg0LCAweDM0OTY4MjUwKSwgV1RDUCgweDc0MGI1M2ZiLCAweDM2MDQxYWQ5KSwKLSAgV1RDUCgweDczNWY2NjI2LCAweDM3NmY5ZTQ2KSwgV1RDUCgweDcyYWYwNWE3LCAweDM4ZDhmZTkzKSwgV1RDUCgweDcxZmEzOTQ5LCAweDNhNDAyZGQyKSwgV1RDUCgweDcxNDEwODA1LCAweDNiYTUxZTI5KSwKLSAgV1RDUCgweDcwODM3OGZmLCAweDNkMDdjMWQ2KSwgV1RDUCgweDZmYzE5Mzg1LCAweDNlNjgwYjJjKSwgV1RDUCgweDZlZmI1ZjEyLCAweDNmYzVlYzk4KSwgV1RDUCgweDZlMzBlMzRhLCAweDQxMjE1ODliKSwKLSAgV1RDUCgweDZkNjIyN2ZhLCAweDQyN2E0MWQwKSwgV1RDUCgweDZjOGYzNTFjLCAweDQzZDA5YWVkKSwgV1RDUCgweDZiYjgxMmQxLCAweDQ1MjQ1NmJkKSwgV1RDUCgweDZhZGNjOTY0LCAweDQ2NzU2ODI4KSwKLSAgV1RDUCgweDY5ZmQ2MTRhLCAweDQ3YzNjMjJmKSwgV1RDUCgweDY5MTllMzIwLCAweDQ5MGY1N2VlKSwgV1RDUCgweDY4MzI1N2FiLCAweDRhNTgxYzllKSwgV1RDUCgweDY3NDZjN2Q4LCAweDRiOWUwMzkwKSwKLSAgV1RDUCgweDY2NTczY2JiLCAweDRjZTEwMDM0KSwgV1RDUCgweDY1NjNiZjkyLCAweDRlMjEwNjE3KSwgV1RDUCgweDY0NmM1OWJmLCAweDRmNWUwOGUzKSwgV1RDUCgweDYzNzExNGNjLCAweDUwOTdmYzVlKSwKLSAgV1RDUCgweDYyNzFmYTY5LCAweDUxY2VkNDZlKSwgV1RDUCgweDYxNmYxNDZjLCAweDUzMDI4NTE4KSwgV1RDUCgweDYwNjg2Y2NmLCAweDU0MzMwMjdkKSwgV1RDUCgweDVmNWUwZGIzLCAweDU1NjA0MGUyKSwKLSAgV1RDUCgweDVlNTAwMTVkLCAweDU2OGEzNGE5KSwgV1RDUCgweDVkM2U1MjM3LCAweDU3YjBkMjU2KSwgV1RDUCgweDVjMjkwYWNjLCAweDU4ZDQwZThjKSwgV1RDUCgweDViMTAzNWNmLCAweDU5ZjNkZTEyKSwKK2NvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTUxMltdID0geworICAgIFNUQ1AoMHg3ZmZmZmZmZiwgMHgwMDAwMDAwMCksIFNUQ1AoMHg3ZmZmZDg4NiwgMHgwMDY0ODdlMyksCisgICAgU1RDUCgweDdmZmY2MjE2LCAweDAwYzkwZjg4KSwgU1RDUCgweDdmZmU5Y2IyLCAweDAxMmQ5NmIxKSwKKyAgICBTVENQKDB4N2ZmZDg4NWEsIDB4MDE5MjFkMjApLCBTVENQKDB4N2ZmYzI1MGYsIDB4MDFmNmEyOTcpLAorICAgIFNUQ1AoMHg3ZmZhNzJkMSwgMHgwMjViMjZkNyksIFNUQ1AoMHg3ZmY4NzFhMiwgMHgwMmJmYTlhNCksCisgICAgU1RDUCgweDdmZjYyMTgyLCAweDAzMjQyYWJmKSwgU1RDUCgweDdmZjM4Mjc0LCAweDAzODhhOWVhKSwKKyAgICBTVENQKDB4N2ZmMDk0NzgsIDB4MDNlZDI2ZTYpLCBTVENQKDB4N2ZlZDU3OTEsIDB4MDQ1MWExNzcpLAorICAgIFNUQ1AoMHg3ZmU5Y2JjMCwgMHgwNGI2MTk1ZCksIFNUQ1AoMHg3ZmU1ZjEwOCwgMHgwNTFhOGU1YyksCisgICAgU1RDUCgweDdmZTFjNzZiLCAweDA1N2YwMDM1KSwgU1RDUCgweDdmZGQ0ZWVjLCAweDA1ZTM2ZWE5KSwKKyAgICBTVENQKDB4N2ZkODg3OGUsIDB4MDY0N2Q5N2MpLCBTVENQKDB4N2ZkMzcxNTMsIDB4MDZhYzQwNmYpLAorICAgIFNUQ1AoMHg3ZmNlMGMzZSwgMHgwNzEwYTM0NSksIFNUQ1AoMHg3ZmM4NTg1NCwgMHgwNzc1MDFiZSksCisgICAgU1RDUCgweDdmYzI1NTk2LCAweDA3ZDk1YjllKSwgU1RDUCgweDdmYmMwNDBhLCAweDA4M2RiMGE3KSwKKyAgICBTVENQKDB4N2ZiNTYzYjMsIDB4MDhhMjAwOWEpLCBTVENQKDB4N2ZhZTc0OTUsIDB4MDkwNjRiM2EpLAorICAgIFNUQ1AoMHg3ZmE3MzZiNCwgMHgwOTZhOTA0OSksIFNUQ1AoMHg3ZjlmYWExNSwgMHgwOWNlY2Y4OSksCisgICAgU1RDUCgweDdmOTdjZWJkLCAweDBhMzMwOGJkKSwgU1RDUCgweDdmOGZhNGIwLCAweDBhOTczYmE1KSwKKyAgICBTVENQKDB4N2Y4NzJiZjMsIDB4MGFmYjY4MDUpLCBTVENQKDB4N2Y3ZTY0OGMsIDB4MGI1ZjhkOWYpLAorICAgIFNUQ1AoMHg3Zjc1NGU4MCwgMHgwYmMzYWMzNSksIFNUQ1AoMHg3ZjZiZTlkNCwgMHgwYzI3YzM4OSksCisgICAgU1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwgU1RDUCgweDdmNTgzNGI3LCAweDBjZWZkYjc2KSwKKyAgICBTVENQKDB4N2Y0ZGU0NTEsIDB4MGQ1M2RiOTIpLCBTVENQKDB4N2Y0MzQ1NjMsIDB4MGRiN2QzNzYpLAorICAgIFNUQ1AoMHg3ZjM4NTdmNiwgMHgwZTFiYzJlNCksIFNUQ1AoMHg3ZjJkMWMwZSwgMHgwZTdmYTk5ZSksCisgICAgU1RDUCgweDdmMjE5MWI0LCAweDBlZTM4NzY2KSwgU1RDUCgweDdmMTViOGVlLCAweDBmNDc1YmZmKSwKKyAgICBTVENQKDB4N2YwOTkxYzQsIDB4MGZhYjI3MmIpLCBTVENQKDB4N2VmZDFjM2MsIDB4MTAwZWU4YWQpLAorICAgIFNUQ1AoMHg3ZWYwNTg2MCwgMHgxMDcyYTA0OCksIFNUQ1AoMHg3ZWUzNDYzNiwgMHgxMGQ2NGRiZCksCisgICAgU1RDUCgweDdlZDVlNWM2LCAweDExMzlmMGNmKSwgU1RDUCgweDdlYzgzNzFhLCAweDExOWQ4OTQxKSwKKyAgICBTVENQKDB4N2ViYTNhMzksIDB4MTIwMTE2ZDUpLCBTVENQKDB4N2VhYmVmMmMsIDB4MTI2NDk5NGUpLAorICAgIFNUQ1AoMHg3ZTlkNTVmYywgMHgxMmM4MTA2ZiksIFNUQ1AoMHg3ZThlNmViMiwgMHgxMzJiN2JmOSksCisgICAgU1RDUCgweDdlN2YzOTU3LCAweDEzOGVkYmIxKSwgU1RDUCgweDdlNmZiNWY0LCAweDEzZjIyZjU4KSwKKyAgICBTVENQKDB4N2U1ZmU0OTMsIDB4MTQ1NTc2YjEpLCBTVENQKDB4N2U0ZmM1M2UsIDB4MTRiOGIxN2YpLAorICAgIFNUQ1AoMHg3ZTNmNTdmZiwgMHgxNTFiZGY4NiksIFNUQ1AoMHg3ZTJlOWNkZiwgMHgxNTdmMDA4NiksCisgICAgU1RDUCgweDdlMWQ5M2VhLCAweDE1ZTIxNDQ1KSwgU1RDUCgweDdlMGMzZDI5LCAweDE2NDUxYTgzKSwKKyAgICBTVENQKDB4N2RmYTk4YTgsIDB4MTZhODEzMDUpLCBTVENQKDB4N2RlOGE2NzAsIDB4MTcwYWZkOGQpLAorICAgIFNUQ1AoMHg3ZGQ2NjY4ZiwgMHgxNzZkZDlkZSksIFNUQ1AoMHg3ZGMzZDkwZCwgMHgxN2QwYTdiYyksCisgICAgU1RDUCgweDdkYjBmZGY4LCAweDE4MzM2NmU5KSwgU1RDUCgweDdkOWRkNTVhLCAweDE4OTYxNzI4KSwKKyAgICBTVENQKDB4N2Q4YTVmNDAsIDB4MThmOGI4M2MpLCBTVENQKDB4N2Q3NjliYjUsIDB4MTk1YjQ5ZWEpLAorICAgIFNUQ1AoMHg3ZDYyOGFjNiwgMHgxOWJkY2JmMyksIFNUQ1AoMHg3ZDRlMmM3ZiwgMHgxYTIwM2UxYiksCisgICAgU1RDUCgweDdkMzk4MGVjLCAweDFhODJhMDI2KSwgU1RDUCgweDdkMjQ4ODFiLCAweDFhZTRmMWQ2KSwKKyAgICBTVENQKDB4N2QwZjQyMTgsIDB4MWI0NzMyZWYpLCBTVENQKDB4N2NmOWFlZjAsIDB4MWJhOTYzMzUpLAorICAgIFNUQ1AoMHg3Y2UzY2ViMiwgMHgxYzBiODI2YSksIFNUQ1AoMHg3Y2NkYTE2OSwgMHgxYzZkOTA1MyksCisgICAgU1RDUCgweDdjYjcyNzI0LCAweDFjY2Y4Y2IzKSwgU1RDUCgweDdjYTA1ZmYxLCAweDFkMzE3NzRkKSwKKyAgICBTVENQKDB4N2M4OTRiZGUsIDB4MWQ5MzRmZTUpLCBTVENQKDB4N2M3MWVhZjksIDB4MWRmNTE2M2YpLAorICAgIFNUQ1AoMHg3YzVhM2Q1MCwgMHgxZTU2Y2ExZSksIFNUQ1AoMHg3YzQyNDJmMiwgMHgxZWI4NmI0NiksCisgICAgU1RDUCgweDdjMjlmYmVlLCAweDFmMTlmOTdiKSwgU1RDUCgweDdjMTE2ODUzLCAweDFmN2I3NDgxKSwKKyAgICBTVENQKDB4N2JmODg4MzAsIDB4MWZkY2RjMWIpLCBTVENQKDB4N2JkZjViOTQsIDB4MjAzZTMwMGQpLAorICAgIFNUQ1AoMHg3YmM1ZTI5MCwgMHgyMDlmNzAxYyksIFNUQ1AoMHg3YmFjMWQzMSwgMHgyMTAwOWMwYyksCisgICAgU1RDUCgweDdiOTIwYjg5LCAweDIxNjFiM2EwKSwgU1RDUCgweDdiNzdhZGE4LCAweDIxYzJiNjljKSwKKyAgICBTVENQKDB4N2I1ZDAzOWUsIDB4MjIyM2E0YzUpLCBTVENQKDB4N2I0MjBkN2EsIDB4MjI4NDdkZTApLAorICAgIFNUQ1AoMHg3YjI2Y2I0ZiwgMHgyMmU1NDFhZiksIFNUQ1AoMHg3YjBiM2QyYywgMHgyMzQ1ZWZmOCksCisgICAgU1RDUCgweDdhZWY2MzIzLCAweDIzYTY4ODdmKSwgU1RDUCgweDdhZDMzZDQ1LCAweDI0MDcwYjA4KSwKKyAgICBTVENQKDB4N2FiNmNiYTQsIDB4MjQ2Nzc3NTgpLCBTVENQKDB4N2E5YTBlNTAsIDB4MjRjN2NkMzMpLAorICAgIFNUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksIFNUQ1AoMHg3YTVmYjBkOCwgMHgyNTg4MzQ5ZCksCisgICAgU1RDUCgweDdhNDIxMGQ4LCAweDI1ZTg0NWI2KSwgU1RDUCgweDdhMjQyNTZmLCAweDI2NDgzZjZjKSwKKyAgICBTVENQKDB4N2EwNWVlYWQsIDB4MjZhODIxODYpLCBTVENQKDB4NzllNzZjYTcsIDB4MjcwN2ViYzcpLAorICAgIFNUQ1AoMHg3OWM4OWY2ZSwgMHgyNzY3OWRmNCksIFNUQ1AoMHg3OWE5ODcxNSwgMHgyN2M3MzdkMyksCisgICAgU1RDUCgweDc5OGEyM2IxLCAweDI4MjZiOTI4KSwgU1RDUCgweDc5NmE3NTU0LCAweDI4ODYyMWI5KSwKKyAgICBTVENQKDB4Nzk0YTdjMTIsIDB4MjhlNTcxNGIpLCBTVENQKDB4NzkyYTM3ZmUsIDB4Mjk0NGE3YTIpLAorICAgIFNUQ1AoMHg3OTA5YTkyZCwgMHgyOWEzYzQ4NSksIFNUQ1AoMHg3OGU4Y2ZiMiwgMHgyYTAyYzdiOCksCisgICAgU1RDUCgweDc4YzdhYmEyLCAweDJhNjFiMTAxKSwgU1RDUCgweDc4YTYzZDExLCAweDJhYzA4MDI2KSwKKyAgICBTVENQKDB4Nzg4NDg0MTQsIDB4MmIxZjM0ZWIpLCBTVENQKDB4Nzg2MjgwYmYsIDB4MmI3ZGNmMTcpLAorICAgIFNUQ1AoMHg3ODQwMzMyOSwgMHgyYmRjNGU2ZiksIFNUQ1AoMHg3ODFkOWI2NSwgMHgyYzNhYjJiOSksCisgICAgU1RDUCgweDc3ZmFiOTg5LCAweDJjOThmYmJhKSwgU1RDUCgweDc3ZDc4ZGFhLCAweDJjZjcyOTM5KSwKKyAgICBTVENQKDB4NzdiNDE3ZGYsIDB4MmQ1NTNhZmMpLCBTVENQKDB4Nzc5MDU4M2UsIDB4MmRiMzMwYzcpLAorICAgIFNUQ1AoMHg3NzZjNGVkYiwgMHgyZTExMGE2MiksIFNUQ1AoMHg3NzQ3ZmJjZSwgMHgyZTZlYzc5MiksCisgICAgU1RDUCgweDc3MjM1ZjJkLCAweDJlY2M2ODFlKSwgU1RDUCgweDc2ZmU3OTBlLCAweDJmMjllYmNjKSwKKyAgICBTVENQKDB4NzZkOTQ5ODksIDB4MmY4NzUyNjIpLCBTVENQKDB4NzZiM2QwYjQsIDB4MmZlNDliYTcpLAorICAgIFNUQ1AoMHg3NjhlMGVhNiwgMHgzMDQxYzc2MSksIFNUQ1AoMHg3NjY4MDM3NiwgMHgzMDllZDU1NiksCisgICAgU1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgU1RDUCgweDc2MWIxMjExLCAweDMxNTg5NzBlKSwKKyAgICBTVENQKDB4NzVmNDJjMGIsIDB4MzFiNTRhNWUpLCBTVENQKDB4NzVjY2ZkNDIsIDB4MzIxMWRmMDQpLAorICAgIFNUQ1AoMHg3NWE1ODVjZiwgMHgzMjZlNTRjNyksIFNUQ1AoMHg3NTdkYzVjYSwgMHgzMmNhYWI2ZiksCisgICAgU1RDUCgweDc1NTViZDRjLCAweDMzMjZlMmMzKSwgU1RDUCgweDc1MmQ2YzZjLCAweDMzODJmYTg4KSwKKyAgICBTVENQKDB4NzUwNGQzNDUsIDB4MzNkZWYyODcpLCBTVENQKDB4NzRkYmYxZWYsIDB4MzQzYWNhODcpLAorICAgIFNUQ1AoMHg3NGIyYzg4NCwgMHgzNDk2ODI1MCksIFNUQ1AoMHg3NDg5NTcxYywgMHgzNGYyMTlhOCksCisgICAgU1RDUCgweDc0NWY5ZGQxLCAweDM1NGQ5MDU3KSwgU1RDUCgweDc0MzU5Y2JkLCAweDM1YThlNjI1KSwKKyAgICBTVENQKDB4NzQwYjUzZmIsIDB4MzYwNDFhZDkpLCBTVENQKDB4NzNlMGMzYTMsIDB4MzY1ZjJlM2IpLAorICAgIFNUQ1AoMHg3M2I1ZWJkMSwgMHgzNmJhMjAxNCksIFNUQ1AoMHg3MzhhY2M5ZSwgMHgzNzE0ZjAyYSksCisgICAgU1RDUCgweDczNWY2NjI2LCAweDM3NmY5ZTQ2KSwgU1RDUCgweDczMzNiODgzLCAweDM3Y2EyYTMwKSwKKyAgICBTVENQKDB4NzMwN2MzZDAsIDB4MzgyNDkzYjApLCBTVENQKDB4NzJkYjg4MjgsIDB4Mzg3ZWRhOGUpLAorICAgIFNUQ1AoMHg3MmFmMDVhNywgMHgzOGQ4ZmU5MyksIFNUQ1AoMHg3MjgyM2M2NywgMHgzOTMyZmY4NyksCisgICAgU1RDUCgweDcyNTUyYzg1LCAweDM5OGNkZDMyKSwgU1RDUCgweDcyMjdkNjFjLCAweDM5ZTY5NzVlKSwKKyAgICBTVENQKDB4NzFmYTM5NDksIDB4M2E0MDJkZDIpLCBTVENQKDB4NzFjYzU2MjYsIDB4M2E5OWEwNTcpLAorICAgIFNUQ1AoMHg3MTllMmNkMiwgMHgzYWYyZWViNyksIFNUQ1AoMHg3MTZmYmQ2OCwgMHgzYjRjMThiYSksCisgICAgU1RDUCgweDcxNDEwODA1LCAweDNiYTUxZTI5KSwgU1RDUCgweDcxMTIwY2M1LCAweDNiZmRmZWNkKSwKKyAgICBTVENQKDB4NzBlMmNiYzYsIDB4M2M1NmJhNzApLCBTVENQKDB4NzBiMzQ1MjUsIDB4M2NhZjUwZGEpLAorICAgIFNUQ1AoMHg3MDgzNzhmZiwgMHgzZDA3YzFkNiksIFNUQ1AoMHg3MDUzNjc3MSwgMHgzZDYwMGQyYyksCisgICAgU1RDUCgweDcwMjMxMDlhLCAweDNkYjgzMmE2KSwgU1RDUCgweDZmZjI3NDk3LCAweDNlMTAzMjBkKSwKKyAgICBTVENQKDB4NmZjMTkzODUsIDB4M2U2ODBiMmMpLCBTVENQKDB4NmY5MDZkODQsIDB4M2ViZmJkY2QpLAorICAgIFNUQ1AoMHg2ZjVmMDJiMiwgMHgzZjE3NDliOCksIFNUQ1AoMHg2ZjJkNTMyYywgMHgzZjZlYWViOCksCisgICAgU1RDUCgweDZlZmI1ZjEyLCAweDNmYzVlYzk4KSwgU1RDUCgweDZlYzkyNjgzLCAweDQwMWQwMzIxKSwKKyAgICBTVENQKDB4NmU5NmE5OWQsIDB4NDA3M2YyMWQpLCBTVENQKDB4NmU2M2U4N2YsIDB4NDBjYWI5NTgpLAorICAgIFNUQ1AoMHg2ZTMwZTM0YSwgMHg0MTIxNTg5YiksIFNUQ1AoMHg2ZGZkOWExYywgMHg0MTc3Y2ZiMSksCisgICAgU1RDUCgweDZkY2EwZDE0LCAweDQxY2UxZTY1KSwgU1RDUCgweDZkOTYzYzU0LCAweDQyMjQ0NDgxKSwKKyAgICBTVENQKDB4NmQ2MjI3ZmEsIDB4NDI3YTQxZDApLCBTVENQKDB4NmQyZGQwMjcsIDB4NDJkMDE2MWUpLAorICAgIFNUQ1AoMHg2Y2Y5MzRmYywgMHg0MzI1YzEzNSksIFNUQ1AoMHg2Y2M0NTY5OCwgMHg0MzdiNDJlMSksCisgICAgU1RDUCgweDZjOGYzNTFjLCAweDQzZDA5YWVkKSwgU1RDUCgweDZjNTlkMGE5LCAweDQ0MjVjOTIzKSwKKyAgICBTVENQKDB4NmMyNDI5NjAsIDB4NDQ3YWNkNTApLCBTVENQKDB4NmJlZTNmNjIsIDB4NDRjZmE3NDApLAorICAgIFNUQ1AoMHg2YmI4MTJkMSwgMHg0NTI0NTZiZCksIFNUQ1AoMHg2YjgxYTNjZCwgMHg0NTc4ZGI5MyksCisgICAgU1RDUCgweDZiNGFmMjc5LCAweDQ1Y2QzNThmKSwgU1RDUCgweDZiMTNmZWY1LCAweDQ2MjE2NDdkKSwKKyAgICBTVENQKDB4NmFkY2M5NjQsIDB4NDY3NTY4MjgpLCBTVENQKDB4NmFhNTUxZTksIDB4NDZjOTQwNWMpLAorICAgIFNUQ1AoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksIFNUQ1AoMHg2YTM1OWRiOSwgMHg0NzcwNmQ5MyksCisgICAgU1RDUCgweDY5ZmQ2MTRhLCAweDQ3YzNjMjJmKSwgU1RDUCgweDY5YzRlMzdhLCAweDQ4MTZlYTg2KSwKKyAgICBTVENQKDB4Njk4YzI0NmMsIDB4NDg2OWU2NjUpLCBTVENQKDB4Njk1MzI0NDIsIDB4NDhiY2I1OTkpLAorICAgIFNUQ1AoMHg2OTE5ZTMyMCwgMHg0OTBmNTdlZSksIFNUQ1AoMHg2OGUwNjEyOSwgMHg0OTYxY2QzMyksCisgICAgU1RDUCgweDY4YTY5ZTgxLCAweDQ5YjQxNTMzKSwgU1RDUCgweDY4NmM5YjRiLCAweDRhMDYyZmJkKSwKKyAgICBTVENQKDB4NjgzMjU3YWIsIDB4NGE1ODFjOWUpLCBTVENQKDB4NjdmN2QzYzUsIDB4NGFhOWRiYTIpLAorICAgIFNUQ1AoMHg2N2JkMGZiZCwgMHg0YWZiNmM5OCksIFNUQ1AoMHg2NzgyMGJiNywgMHg0YjRjY2Y0ZCksCisgICAgU1RDUCgweDY3NDZjN2Q4LCAweDRiOWUwMzkwKSwgU1RDUCgweDY3MGI0NDQ0LCAweDRiZWYwOTJkKSwKKyAgICBTVENQKDB4NjZjZjgxMjAsIDB4NGMzZmRmZjQpLCBTVENQKDB4NjY5MzdlOTEsIDB4NGM5MDg3YjEpLAorICAgIFNUQ1AoMHg2NjU3M2NiYiwgMHg0Y2UxMDAzNCksIFNUQ1AoMHg2NjFhYmJjNSwgMHg0ZDMxNDk0YiksCisgICAgU1RDUCgweDY1ZGRmYmQzLCAweDRkODE2MmM0KSwgU1RDUCgweDY1YTBmZDBiLCAweDRkZDE0YzZlKSwKKyAgICBTVENQKDB4NjU2M2JmOTIsIDB4NGUyMTA2MTcpLCBTVENQKDB4NjUyNjQzOGYsIDB4NGU3MDhmOGYpLAorICAgIFNUQ1AoMHg2NGU4ODkyNiwgMHg0ZWJmZThhNSksIFNUQ1AoMHg2NGFhOTA3ZiwgMHg0ZjBmMTEyNiksCisgICAgU1RDUCgweDY0NmM1OWJmLCAweDRmNWUwOGUzKSwgU1RDUCgweDY0MmRlNTBkLCAweDRmYWNjZmFiKSwKKyAgICBTVENQKDB4NjNlZjMyOTAsIDB4NGZmYjY1NGQpLCBTVENQKDB4NjNiMDQyNmQsIDB4NTA0OWM5OTkpLAorICAgIFNUQ1AoMHg2MzcxMTRjYywgMHg1MDk3ZmM1ZSksIFNUQ1AoMHg2MzMxYTlkNCwgMHg1MGU1ZmQ2ZCksCisgICAgU1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwgU1RDUCgweDYyYjIxYzdiLCAweDUxODE2OWE1KSwKKyAgICBTVENQKDB4NjI3MWZhNjksIDB4NTFjZWQ0NmUpLCBTVENQKDB4NjIzMTliOWQsIDB4NTIxYzBjYzIpLAorICAgIFNUQ1AoMHg2MWYxMDAzZiwgMHg1MjY5MTI2ZSksIFNUQ1AoMHg2MWIwMjg3NiwgMHg1MmI1ZTU0NiksCisgICAgU1RDUCgweDYxNmYxNDZjLCAweDUzMDI4NTE4KSwgU1RDUCgweDYxMmRjNDQ3LCAweDUzNGVmMWI1KSwKKyAgICBTVENQKDB4NjBlYzM4MzAsIDB4NTM5YjJhZjApLCBTVENQKDB4NjBhYTcwNTAsIDB4NTNlNzMwOTcpLAorICAgIFNUQ1AoMHg2MDY4NmNjZiwgMHg1NDMzMDI3ZCksIFNUQ1AoMHg2MDI2MmRkNiwgMHg1NDdlYTA3MyksCisgICAgU1RDUCgweDVmZTNiMzhkLCAweDU0Y2EwYTRiKSwgU1RDUCgweDVmYTBmZTFmLCAweDU1MTUzZmQ0KSwKKyAgICBTVENQKDB4NWY1ZTBkYjMsIDB4NTU2MDQwZTIpLCBTVENQKDB4NWYxYWUyNzQsIDB4NTVhYjBkNDYpLAorICAgIFNUQ1AoMHg1ZWQ3N2M4YSwgMHg1NWY1YTRkMiksIFNUQ1AoMHg1ZTkzZGMxZiwgMHg1NjQwMDc1OCksCisgICAgU1RDUCgweDVlNTAwMTVkLCAweDU2OGEzNGE5KSwgU1RDUCgweDVlMGJlYzZlLCAweDU2ZDQyYzk5KSwKKyAgICBTVENQKDB4NWRjNzlkN2MsIDB4NTcxZGVlZmEpLCBTVENQKDB4NWQ4MzE0YjEsIDB4NTc2NzdiOWQpLAorICAgIFNUQ1AoMHg1ZDNlNTIzNywgMHg1N2IwZDI1NiksIFNUQ1AoMHg1Y2Y5NTYzOCwgMHg1N2Y5ZjJmOCksCisgICAgU1RDUCgweDVjYjQyMGUwLCAweDU4NDJkZDU0KSwgU1RDUCgweDVjNmViMjU4LCAweDU4OGI5MTQwKSwKKyAgICBTVENQKDB4NWMyOTBhY2MsIDB4NThkNDBlOGMpLCBTVENQKDB4NWJlMzJhNjcsIDB4NTkxYzU1MGUpLAorICAgIFNUQ1AoMHg1YjlkMTE1NCwgMHg1OTY0NjQ5OCksIFNUQ1AoMHg1YjU2YmZiZCwgMHg1OWFjM2NmZCksCisgICAgU1RDUCgweDViMTAzNWNmLCAweDU5ZjNkZTEyKSwgU1RDUCgweDVhYzk3M2I1LCAweDVhM2I0N2FiKSwKKyAgICBTVENQKDB4NWE4Mjc5OWEsIDB4NWE4Mjc5OWEpLAogfTsKIAogUkFNX0FMSUdOCiBMTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzEyOFtdID0KLXsKLSAgV1RDUCgweDdmZmZmZmZlLCAweDAwMDE2ZjYzKSwgV1RDUCgweDdmZmZmZmYxLCAweDAwMDNlMzgyKSwgV1RDUCgweDdmZmZmZmM3LCAweDAwMDc4ZjY0KSwgV1RDUCgweDdmZmZmZjVkLCAweDAwMGNjMzIzKSwKLSAgV1RDUCgweDdmZmZmZTc2LCAweDAwMTNkOWVkKSwgV1RDUCgweDdmZmZmY2FhLCAweDAwMWQzYTlkKSwgV1RDUCgweDdmZmZmOTUzLCAweDAwMjk1ODFmKSwgV1RDUCgweDdmZmZmMzcyLCAweDAwMzhiMWJkKSwKLSAgV1RDUCgweDdmZmZlOThiLCAweDAwNGJkMzRkKSwgV1RDUCgweDdmZmZkOTc1LCAweDAwNjM1NTM4KSwgV1RDUCgweDdmZmZjMDI0LCAweDAwN2ZkYzY0KSwgV1RDUCgweDdmZmY5OTViLCAweDAwYTIxOWYxKSwKLSAgV1RDUCgweDdmZmY1ZjViLCAweDAwY2FjYWQwKSwgV1RDUCgweDdmZmYwYTc1LCAweDAwZmFiNzJkKSwgV1RDUCgweDdmZmU5MDkxLCAweDAxMzJiMWFmKSwgV1RDUCgweDdmZmRlNDllLCAweDAxNzM5Njg5KSwKLSAgV1RDUCgweDdmZmNmNWVmLCAweDAxYmU0YTYzKSwgV1RDUCgweDdmZmJhZjg0LCAweDAyMTNiOTEwKSwgV1RDUCgweDdmZjlmNzNhLCAweDAyNzRkNDFlKSwgV1RDUCgweDdmZjdhY2YxLCAweDAyZTI5MTNhKSwKLSAgV1RDUCgweDdmZjRhOTlhLCAweDAzNWRlODZjKSwgV1RDUCgweDdmZjBiZTNkLCAweDAzZTdkMjMzKSwgV1RDUCgweDdmZWJiMmYxLCAweDA0ODE0NTdjKSwgV1RDUCgweDdmZTU0NWQ0LCAweDA1MmIzNTdjKSwKLSAgV1RDUCgweDdmZGQyYTAyLCAweDA1ZTY4Zjc3KSwgV1RDUCgweDdmZDMwNjk1LCAweDA2YjQzODZmKSwgV1RDUCgweDdmYzY3NWI0LCAweDA3OTUwYWNiKSwgV1RDUCgweDdmYjcwM2JlLCAweDA4ODlkM2VmKSwKLSAgV1RDUCgweDdmYTQyZTg5LCAweDA5OTM1MWUwKSwgV1RDUCgweDdmOGQ2NGQ4LCAweDBhYjIzMGUwKSwgV1RDUCgweDdmNzIwNWY4LCAweDBiZTcwOTIzKSwgV1RDUCgweDdmNTE2MTk1LCAweDBkMzI1YzkzKSwKLSAgV1RDUCgweDdmMmFiN2QwLCAweDBlOTQ5NGFlKSwgV1RDUCgweDdlZmQzOTk3LCAweDEwMGUwMDg1KSwgV1RDUCgweDdlYzgwOTRhLCAweDExOWVkMmVmKSwgV1RDUCgweDdlOGEzYmE3LCAweDEzNDcyMGQ4KSwKLSAgV1RDUCgweDdlNDJkOTA2LCAweDE1MDZkZmRjKSwgV1RDUCgweDdkZjBkZWU0LCAweDE2ZGRlNTBiKSwgV1RDUCgweDdkOTM0MWI0LCAweDE4Y2JlM2Y3KSwgV1RDUCgweDdkMjhlZjAyLCAweDFhZDA2ZTA3KSwKLSAgV1RDUCgweDdjYjBjZmNjLCAweDFjZWFmMjE1KSwgV1RDUCgweDdjMjljYjIwLCAweDFmMWFiYzRmKSwgV1RDUCgweDdiOTJjOGViLCAweDIxNWVmNjc3KSwgV1RDUCgweDdhZWFiNGVjLCAweDIzYjZhODY3KSwKLSAgV1RDUCgweDdhMzA4MWQwLCAweDI2MjBiOGVjKSwgV1RDUCgweDc5NjMyYzVhLCAweDI4OWJlZWY1KSwgV1RDUCgweDc4ODFiZTk1LCAweDJiMjZmMzBiKSwgV1RDUCgweDc3OGI1MzA0LCAweDJkYzA1MTFmKSwKLSAgV1RDUCgweDc2N2YxN2MwLCAweDMwNjY3YWEyKSwgV1RDUCgweDc1NWM1MTc4LCAweDMzMTdjOGRkKSwgV1RDUCgweDc0MjI1ZTUwLCAweDM1ZDI3Zjk4KSwgV1RDUCgweDcyZDBiODg3LCAweDM4OTRjZmYzKSwKLSAgV1RDUCgweDcxNjZmOGU3LCAweDNiNWNkYjdiKSwgV1RDUCgweDZmZTRkOGU4LCAweDNlMjhiNzcwKSwgV1RDUCgweDZlNGEzNDkxLCAweDQwZjY3MDJhKSwgV1RDUCgweDZjOTcwYmZjLCAweDQzYzQwY2FhKSwKLSAgV1RDUCgweDZhY2I4NDgzLCAweDQ2OGY5MjMxKSwgV1RDUCgweDY4ZTdlOTk0LCAweDQ5NTcwN2Y1KSwgV1RDUCgweDY2ZWNhZDFjLCAweDRjMTg3YWM3KSwgV1RDUCgweDY0ZGE2Nzk3LCAweDRlZDIwMGM1KSwKLSAgV1RDUCgweDYyYjFkN2I3LCAweDUxODFiY2VhKSwgV1RDUCgweDYwNzNlMWFlLCAweDU0MjVlMjhlKSwgV1RDUCgweDVlMjE4ZTE2LCAweDU2YmNiOGMyKSwgV1RDUCgweDViYmMwODc1LCAweDU5NDQ5ZDc2KSwKLX07Ci0KLQotCi0KLQotCi0KLQotUkFNX0FMSUdOCi1MTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c5NjBbXSA9Ci17Ci0gIFdUQ1AoMHg3ZmZmZmQzMSwgMHgwMDFhY2VlYSksIFdUQ1AoMHg3ZmZmZTZiYywgMHgwMDUwNmNiOSksIFdUQ1AoMHg3ZmZmYjlkMSwgMHgwMDg2MGE3OSksIFdUQ1AoMHg3ZmZmNzY3MSwgMHgwMGJiYTgyMiksCi0gIFdUQ1AoMHg3ZmZmMWM5YiwgMHgwMGYxNDVhYiksIFdUQ1AoMHg3ZmZlYWM1MCwgMHgwMTI2ZTMwOSksIFdUQ1AoMHg3ZmZlMjU5MCwgMHgwMTVjODAzMyksIFdUQ1AoMHg3ZmZkODg1YSwgMHgwMTkyMWQyMCksCi0gIFdUQ1AoMHg3ZmZjZDRiMCwgMHgwMWM3YjljNiksIFdUQ1AoMHg3ZmZjMGE5MSwgMHgwMWZkNTYxZCksIFdUQ1AoMHg3ZmZiMjlmZCwgMHgwMjMyZjIxYSksIFdUQ1AoMHg3ZmZhMzJmNCwgMHgwMjY4OGRiNCksCi0gIFdUQ1AoMHg3ZmY5MjU3NywgMHgwMjllMjhlMiksIFdUQ1AoMHg3ZmY4MDE4NiwgMHgwMmQzYzM5YiksIFdUQ1AoMHg3ZmY2YzcyMCwgMHgwMzA5NWRkNSksIFdUQ1AoMHg3ZmY1NzY0NywgMHgwMzNlZjc4NiksCi0gIFdUQ1AoMHg3ZmY0MGVmYSwgMHgwMzc0OTBhNSksIFdUQ1AoMHg3ZmYyOTEzYSwgMHgwM2FhMjkyYSksIFdUQ1AoMHg3ZmYwZmQwNywgMHgwM2RmYzEwOSksIFdUQ1AoMHg3ZmVmNTI2MCwgMHgwNDE1NTgzYiksCi0gIFdUQ1AoMHg3ZmVkOTE0OCwgMHgwNDRhZWViNSksIFdUQ1AoMHg3ZmViYjliZCwgMHgwNDgwODQ2ZSksIFdUQ1AoMHg3ZmU5Y2JjMCwgMHgwNGI2MTk1ZCksIFdUQ1AoMHg3ZmU3Yzc1MiwgMHgwNGViYWQ3OSksCi0gIFdUQ1AoMHg3ZmU1YWM3MiwgMHgwNTIxNDBiNyksIFdUQ1AoMHg3ZmUzN2IyMiwgMHgwNTU2ZDMwZiksIFdUQ1AoMHg3ZmUxMzM2MSwgMHgwNThjNjQ3OCksIFdUQ1AoMHg3ZmRlZDUzMCwgMHgwNWMxZjRlNyksCi0gIFdUQ1AoMHg3ZmRjNjA4ZiwgMHgwNWY3ODQ1MyksIFdUQ1AoMHg3ZmQ5ZDU3ZiwgMHgwNjJkMTJiNCksIFdUQ1AoMHg3ZmQ3MzQwMSwgMHgwNjYyOWZmZSksIFdUQ1AoMHg3ZmQ0N2MxNCwgMHgwNjk4MmMyYiksCi0gIFdUQ1AoMHg3ZmQxYWRiOSwgMHgwNmNkYjcyZiksIFdUQ1AoMHg3ZmNlYzhmMSwgMHgwNzAzNDEwMSksIFdUQ1AoMHg3ZmNiY2RiYywgMHgwNzM4Yzk5OCksIFdUQ1AoMHg3ZmM4YmMxYiwgMHgwNzZlNTBlYiksCi0gIFdUQ1AoMHg3ZmM1OTQwZSwgMHgwN2EzZDZmMCksIFdUQ1AoMHg3ZmMyNTU5NiwgMHgwN2Q5NWI5ZSksIFdUQ1AoMHg3ZmJmMDBiMywgMHgwODBlZGVlYyksIFdUQ1AoMHg3ZmJiOTU2NywgMHgwODQ0NjBjZiksCi0gIFdUQ1AoMHg3ZmI4MTNiMCwgMHgwODc5ZTE0MCksIFdUQ1AoMHg3ZmI0N2I5MSwgMHgwOGFmNjAzMyksIFdUQ1AoMHg3ZmIwY2QwYSwgMHgwOGU0ZGRhMCksIFdUQ1AoMHg3ZmFkMDgxYiwgMHgwOTFhNTk3ZSksCi0gIFdUQ1AoMHg3ZmE5MmNjNSwgMHgwOTRmZDNjMyksIFdUQ1AoMHg3ZmE1M2IwOSwgMHgwOTg1NGM2NiksIFdUQ1AoMHg3ZmExMzJlOCwgMHgwOWJhYzM1ZCksIFdUQ1AoMHg3ZjlkMTQ2MSwgMHgwOWYwMzg5ZiksCi0gIFdUQ1AoMHg3Zjk4ZGY3NywgMHgwYTI1YWMyMyksIFdUQ1AoMHg3Zjk0OTQyOSwgMHgwYTViMWRkZSksIFdUQ1AoMHg3ZjkwMzI3OSwgMHgwYTkwOGRjOSksIFdUQ1AoMHg3ZjhiYmE2NiwgMHgwYWM1ZmJkOSksCi0gIFdUQ1AoMHg3Zjg3MmJmMywgMHgwYWZiNjgwNSksIFdUQ1AoMHg3ZjgyODcxZiwgMHgwYjMwZDI0NCksIFdUQ1AoMHg3ZjdkY2JlYywgMHgwYjY2M2E4YyksIFdUQ1AoMHg3Zjc4ZmE1YiwgMHgwYjliYTBkNSksCi0gIFdUQ1AoMHg3Zjc0MTI2YiwgMHgwYmQxMDUxMyksIFdUQ1AoMHg3ZjZmMTQxZiwgMHgwYzA2Njc0MCksIFdUQ1AoMHg3ZjY5ZmY3NiwgMHgwYzNiYzc0ZiksIFdUQ1AoMHg3ZjY0ZDQ3MywgMHgwYzcxMjUzYSksCi0gIFdUQ1AoMHg3ZjVmOTMxNSwgMHgwY2E2ODBmNSksIFdUQ1AoMHg3ZjVhM2I1ZSwgMHgwY2RiZGE3OSksIFdUQ1AoMHg3ZjU0Y2Q0ZiwgMHgwZDExMzFiYSksIFdUQ1AoMHg3ZjRmNDhlOCwgMHgwZDQ2ODZiMSksCi0gIFdUQ1AoMHg3ZjQ5YWUyYSwgMHgwZDdiZDk1NCksIFdUQ1AoMHg3ZjQzZmQxOCwgMHgwZGIxMjk5OSksIFdUQ1AoMHg3ZjNlMzViMCwgMHgwZGU2Nzc3NiksIFdUQ1AoMHg3ZjM4NTdmNiwgMHgwZTFiYzJlNCksCi0gIFdUQ1AoMHg3ZjMyNjNlOSwgMHgwZTUxMGJkOCksIFdUQ1AoMHg3ZjJjNTk4YSwgMHgwZTg2NTI0OCksIFdUQ1AoMHg3ZjI2MzhkYiwgMHgwZWJiOTYyYyksIFdUQ1AoMHg3ZjIwMDFkZCwgMHgwZWYwZDc3YiksCi0gIFdUQ1AoMHg3ZjE5YjQ5MSwgMHgwZjI2MTYyYSksIFdUQ1AoMHg3ZjEzNTBmOCwgMHgwZjViNTIzMSksIFdUQ1AoMHg3ZjBjZDcxMiwgMHgwZjkwOGI4NiksIFdUQ1AoMHg3ZjA2NDZlMiwgMHgwZmM1YzIyMCksCi0gIFdUQ1AoMHg3ZWZmYTA2OSwgMHgwZmZhZjVmNiksIFdUQ1AoMHg3ZWY4ZTNhNiwgMHgxMDMwMjZmZSksIFdUQ1AoMHg3ZWYyMTA5ZCwgMHgxMDY1NTUyZSksIFdUQ1AoMHg3ZWViMjc0ZCwgMHgxMDlhODA3ZSksCi0gIFdUQ1AoMHg3ZWU0MjdiOSwgMHgxMGNmYThlNSksIFdUQ1AoMHg3ZWRkMTFlMSwgMHgxMTA0Y2U1OCksIFdUQ1AoMHg3ZWQ1ZTVjNiwgMHgxMTM5ZjBjZiksIFdUQ1AoMHg3ZWNlYTM2YiwgMHgxMTZmMTA0MCksCi0gIFdUQ1AoMHg3ZWM3NGFjZiwgMHgxMWE0MmNhMiksIFdUQ1AoMHg3ZWJmZGJmNSwgMHgxMWQ5NDVlYiksIFdUQ1AoMHg3ZWI4NTZkZSwgMHgxMjBlNWMxMyksIFdUQ1AoMHg3ZWIwYmI4YSwgMHgxMjQzNmYxMCksCi0gIFdUQ1AoMHg3ZWE5MDlmYywgMHgxMjc4N2VkOCksIFdUQ1AoMHg3ZWExNDIzNSwgMHgxMmFkOGI2MyksIFdUQ1AoMHg3ZTk5NjQzNiwgMHgxMmUyOTRhNyksIFdUQ1AoMHg3ZTkxNzAwMCwgMHgxMzE3OWE5YiksCi0gIFdUQ1AoMHg3ZTg5NjU5NSwgMHgxMzRjOWQzNCksIFdUQ1AoMHg3ZTgxNDRmNiwgMHgxMzgxOWM2YyksIFdUQ1AoMHg3ZTc5MGUyNSwgMHgxM2I2OTgzNiksIFdUQ1AoMHg3ZTcwYzEyNCwgMHgxM2ViOTA4YyksCi0gIFdUQ1AoMHg3ZTY4NWRmMiwgMHgxNDIwODU2MyksIFdUQ1AoMHg3ZTVmZTQ5MywgMHgxNDU1NzZiMSksIFdUQ1AoMHg3ZTU3NTUwOCwgMHgxNDhhNjQ2ZSksIFdUQ1AoMHg3ZTRlYWY1MSwgMHgxNGJmNGU5MSksCi0gIFdUQ1AoMHg3ZTQ1ZjM3MSwgMHgxNGY0MzUxMCksIFdUQ1AoMHg3ZTNkMjE2OSwgMHgxNTI5MTdlMSksIFdUQ1AoMHg3ZTM0MzkzYiwgMHgxNTVkZjZmYyksIFdUQ1AoMHg3ZTJiM2FlOCwgMHgxNTkyZDI1NyksCi0gIFdUQ1AoMHg3ZTIyMjY3MiwgMHgxNWM3YTllYSksIFdUQ1AoMHg3ZTE4ZmJkYSwgMHgxNWZjN2RhYSksIFdUQ1AoMHg3ZTBmYmIyMiwgMHgxNjMxNGQ4ZSksIFdUQ1AoMHg3ZTA2NjQ0YywgMHgxNjY2MTk4ZCksCi0gIFdUQ1AoMHg3ZGZjZjc1OSwgMHgxNjlhZTE5ZiksIFdUQ1AoMHg3ZGYzNzQ0YiwgMHgxNmNmYTViOSksIFdUQ1AoMHg3ZGU5ZGIyMywgMHgxNzA0NjVkMiksIFdUQ1AoMHg3ZGUwMmJlNCwgMHgxNzM5MjFlMiksCi0gIFdUQ1AoMHg3ZGQ2NjY4ZiwgMHgxNzZkZDlkZSksIFdUQ1AoMHg3ZGNjOGIyNSwgMHgxN2EyOGRiZSksIFdUQ1AoMHg3ZGMyOTlhOSwgMHgxN2Q3M2Q3OSksIFdUQ1AoMHg3ZGI4OTIxYywgMHgxODBiZTkwNCksCi0gIFdUQ1AoMHg3ZGFlNzQ3ZiwgMHgxODQwOTA1OCksIFdUQ1AoMHg3ZGE0NDBkNiwgMHgxODc1MzM2YSksIFdUQ1AoMHg3ZDk5ZjcyMSwgMHgxOGE5ZDIzMSksIFdUQ1AoMHg3ZDhmOTc2MiwgMHgxOGRlNmNhNSksCi0gIFdUQ1AoMHg3ZDg1MjE5YywgMHgxOTEzMDJiYyksIFdUQ1AoMHg3ZDdhOTVjZiwgMHgxOTQ3OTQ2YyksIFdUQ1AoMHg3ZDZmZjNmZSwgMHgxOTdjMjFhZCksIFdUQ1AoMHg3ZDY1M2MyYiwgMHgxOWIwYWE3NSksCi0gIFdUQ1AoMHg3ZDVhNmU1NywgMHgxOWU1MmViYiksIFdUQ1AoMHg3ZDRmOGE4NSwgMHgxYTE5YWU3NiksIFdUQ1AoMHg3ZDQ0OTBiNiwgMHgxYTRlMjk5ZCksIFdUQ1AoMHg3ZDM5ODBlYywgMHgxYTgyYTAyNiksCi0gIFdUQ1AoMHg3ZDJlNWIyYSwgMHgxYWI3MTIwOCksIFdUQ1AoMHg3ZDIzMWY3MCwgMHgxYWViN2YzYSksIFdUQ1AoMHg3ZDE3Y2RjMiwgMHgxYjFmZTdiMyksIFdUQ1AoMHg3ZDBjNjYyMSwgMHgxYjU0NGI2YSksCi0gIFdUQ1AoMHg3ZDAwZTg4ZiwgMHgxYjg4YWE1NSksIFdUQ1AoMHg3Y2Y1NTUwZSwgMHgxYmJkMDQ2YyksIFdUQ1AoMHg3Y2U5YWJhMSwgMHgxYmYxNTlhNCksIFdUQ1AoMHg3Y2RkZWM0OCwgMHgxYzI1YTlmNiksCi0gIFdUQ1AoMHg3Y2QyMTcwNywgMHgxYzU5ZjU1NyksIFdUQ1AoMHg3Y2M2MmJkZiwgMHgxYzhlM2JiZSksIFdUQ1AoMHg3Y2JhMmFkMywgMHgxY2MyN2QyMyksIFdUQ1AoMHg3Y2FlMTNlNCwgMHgxY2Y2Yjk3YyksCi0gIFdUQ1AoMHg3Y2ExZTcxNSwgMHgxZDJhZjBjMSksIFdUQ1AoMHg3Yzk1YTQ2NywgMHgxZDVmMjJlNyksIFdUQ1AoMHg3Yzg5NGJkZSwgMHgxZDkzNGZlNSksIFdUQ1AoMHg3YzdjZGQ3YiwgMHgxZGM3NzdiMyksCi0gIFdUQ1AoMHg3YzcwNTk0MCwgMHgxZGZiOWE0OCksIFdUQ1AoMHg3YzYzYmYyZiwgMHgxZTJmYjc5YSksIFdUQ1AoMHg3YzU3MGY0YiwgMHgxZTYzY2ZhMCksIFdUQ1AoMHg3YzRhNDk5NiwgMHgxZTk3ZTI1MSksCi0gIFdUQ1AoMHg3YzNkNmUxMywgMHgxZWNiZWZhNCksIFdUQ1AoMHg3YzMwN2NjMiwgMHgxZWZmZjc4ZiksIFdUQ1AoMHg3YzIzNzVhOCwgMHgxZjMzZmEwYSksIFdUQ1AoMHg3YzE2NThjNSwgMHgxZjY3ZjcwYiksCi0gIFdUQ1AoMHg3YzA5MjYxZCwgMHgxZjliZWU4YSksIFdUQ1AoMHg3YmZiZGRiMSwgMHgxZmNmZTA3ZCksIFdUQ1AoMHg3YmVlN2Y4NSwgMHgyMDAzY2NkYiksIFdUQ1AoMHg3YmUxMGI5OSwgMHgyMDM3YjM5YiksCi0gIFdUQ1AoMHg3YmQzODFmMSwgMHgyMDZiOTRiNCksIFdUQ1AoMHg3YmM1ZTI5MCwgMHgyMDlmNzAxYyksIFdUQ1AoMHg3YmI4MmQ3NiwgMHgyMGQzNDVjYyksIFdUQ1AoMHg3YmFhNjJhOCwgMHgyMTA3MTViOCksCi0gIFdUQ1AoMHg3YjljODIyNiwgMHgyMTNhZGZkYSksIFdUQ1AoMHg3YjhlOGJmNSwgMHgyMTZlYTQyNiksIFdUQ1AoMHg3YjgwODAxNSwgMHgyMWEyNjI5NSksIFdUQ1AoMHg3YjcyNWU4YSwgMHgyMWQ2MWIxZSksCi0gIFdUQ1AoMHg3YjY0Mjc1NiwgMHgyMjA5Y2RiNiksIFdUQ1AoMHg3YjU1ZGE3YywgMHgyMjNkN2E1NSksIFdUQ1AoMHg3YjQ3NzdmZSwgMHgyMjcxMjBmMyksIFdUQ1AoMHg3YjM4ZmZkZSwgMHgyMmE0YzE4NSksCi0gIFdUQ1AoMHg3YjJhNzIxZiwgMHgyMmQ4NWMwNCksIFdUQ1AoMHg3YjFiY2VjNCwgMHgyMzBiZjA2NSksIFdUQ1AoMHg3YjBkMTVkMCwgMHgyMzNmN2VhMCksIFdUQ1AoMHg3YWZlNDc0NCwgMHgyMzczMDZhYiksCi0gIFdUQ1AoMHg3YWVmNjMyMywgMHgyM2E2ODg3ZiksIFdUQ1AoMHg3YWUwNjk3MSwgMHgyM2RhMDQxMSksIFdUQ1AoMHg3YWQxNWEyZiwgMHgyNDBkNzk1OCksIFdUQ1AoMHg3YWMyMzU2MSwgMHgyNDQwZTg0ZCksCi0gIFdUQ1AoMHg3YWIyZmIwOSwgMHgyNDc0NTBlNCksIFdUQ1AoMHg3YWEzYWIyOSwgMHgyNGE3YjMxNyksIFdUQ1AoMHg3YTk0NDVjNSwgMHgyNGRiMGVkYiksIFdUQ1AoMHg3YTg0Y2FkZSwgMHgyNTBlNjQyNyksCi0gIFdUQ1AoMHg3YTc1M2E3OSwgMHgyNTQxYjJmMyksIFdUQ1AoMHg3YTY1OTQ5NiwgMHgyNTc0ZmIzNiksIFdUQ1AoMHg3YTU1ZDkzYSwgMHgyNWE4M2NlNiksIFdUQ1AoMHg3YTQ2MDg2NywgMHgyNWRiNzdmYSksCi0gIFdUQ1AoMHg3YTM2MjIyMCwgMHgyNjBlYWM2YSksIFdUQ1AoMHg3YTI2MjY2OCwgMHgyNjQxZGEyZCksIFdUQ1AoMHg3YTE2MTU0MCwgMHgyNjc1MDEzOSksIFdUQ1AoMHg3YTA1ZWVhZCwgMHgyNmE4MjE4NiksCi0gIFdUQ1AoMHg3OWY1YjJiMSwgMHgyNmRiM2IwYSksIFdUQ1AoMHg3OWU1NjE0ZiwgMHgyNzBlNGRiZCksIFdUQ1AoMHg3OWQ0ZmE4OSwgMHgyNzQxNTk5NiksIFdUQ1AoMHg3OWM0N2U2MywgMHgyNzc0NWU4YyksCi0gIFdUQ1AoMHg3OWIzZWNlMCwgMHgyN2E3NWM5NSksIFdUQ1AoMHg3OWEzNDYwMiwgMHgyN2RhNTNhOSksIFdUQ1AoMHg3OTkyODljYywgMHgyODBkNDNiZiksIFdUQ1AoMHg3OTgxYjg0MSwgMHgyODQwMmNjZSksCi0gIFdUQ1AoMHg3OTcwZDE2NSwgMHgyODczMGVjZCksIFdUQ1AoMHg3OTVmZDUzYSwgMHgyOGE1ZTliNCksIFdUQ1AoMHg3OTRlYzNjMywgMHgyOGQ4YmQ3OCksIFdUQ1AoMHg3OTNkOWQwMywgMHgyOTBiOGExMiksCi0gIFdUQ1AoMHg3OTJjNjBmZSwgMHgyOTNlNGY3OCksIFdUQ1AoMHg3OTFiMGZiNSwgMHgyOTcxMGRhMSksIFdUQ1AoMHg3OTA5YTkyZCwgMHgyOWEzYzQ4NSksIFdUQ1AoMHg3OGY4MmQ2OCwgMHgyOWQ2NzQxYiksCi0gIFdUQ1AoMHg3OGU2OWM2OSwgMHgyYTA5MWM1OSksIFdUQ1AoMHg3OGQ0ZjYzNCwgMHgyYTNiYmQzNyksIFdUQ1AoMHg3OGMzM2FjYiwgMHgyYTZlNTZhYyksIFdUQ1AoMHg3OGIxNmEzMiwgMHgyYWEwZThiMCksCi0gIFdUQ1AoMHg3ODlmODQ2YiwgMHgyYWQzNzMzOCksIFdUQ1AoMHg3ODhkODk3YiwgMHgyYjA1ZjYzZCksIFdUQ1AoMHg3ODdiNzk2MywgMHgyYjM4NzFiNSksIFdUQ1AoMHg3ODY5NTQyOCwgMHgyYjZhZTU5OCksCi0gIFdUQ1AoMHg3ODU3MTljYywgMHgyYjlkNTFkZCksIFdUQ1AoMHg3ODQ0Y2E1MywgMHgyYmNmYjY3YiksIFdUQ1AoMHg3ODMyNjVjMCwgMHgyYzAyMTM2OSksIFdUQ1AoMHg3ODFmZWMxNSwgMHgyYzM0Njg5ZSksCi0gIFdUQ1AoMHg3ODBkNWQ1NywgMHgyYzY2YjYxMSksIFdUQ1AoMHg3N2ZhYjk4OSwgMHgyYzk4ZmJiYSksIFdUQ1AoMHg3N2U4MDBhZCwgMHgyY2NiMzk5MCksIFdUQ1AoMHg3N2Q1MzJjNywgMHgyY2ZkNmY4YSksCi0gIFdUQ1AoMHg3N2MyNGZkYiwgMHgyZDJmOWQ5ZiksIFdUQ1AoMHg3N2FmNTdlYiwgMHgyZDYxYzNjNyksIFdUQ1AoMHg3NzljNGFmYywgMHgyZDkzZTFmOCksIFdUQ1AoMHg3Nzg5MjkxMCwgMHgyZGM1ZjgyOSksCi0gIFdUQ1AoMHg3Nzc1ZjIyYSwgMHgyZGY4MDY1MyksIFdUQ1AoMHg3NzYyYTY0ZiwgMHgyZTJhMGM2YyksIFdUQ1AoMHg3NzRmNDU4MSwgMHgyZTVjMGE2YiksIFdUQ1AoMHg3NzNiY2ZjNCwgMHgyZThlMDA0OCksCi0gIFdUQ1AoMHg3NzI4NDUxYywgMHgyZWJmZWRmYSksIFdUQ1AoMHg3NzE0YTU4YiwgMHgyZWYxZDM3NyksIFdUQ1AoMHg3NzAwZjExNSwgMHgyZjIzYjBiOSksIFdUQ1AoMHg3NmVkMjdiZSwgMHgyZjU1ODViNSksCi0gIFdUQ1AoMHg3NmQ5NDk4OSwgMHgyZjg3NTI2MiksIFdUQ1AoMHg3NmM1NTY3OSwgMHgyZmI5MTZiOSksIFdUQ1AoMHg3NmIxNGU5MywgMHgyZmVhZDJiMCksIFdUQ1AoMHg3NjlkMzFkOSwgMHgzMDFjODYzZiksCi0gIFdUQ1AoMHg3Njg5MDA1MCwgMHgzMDRlMzE1ZCksIFdUQ1AoMHg3Njc0YjlmYSwgMHgzMDdmZDQwMSksIFdUQ1AoMHg3NjYwNWVkYiwgMHgzMGIxNmUyMyksIFdUQ1AoMHg3NjRiZWVmOCwgMHgzMGUyZmZiOSksCi0gIFdUQ1AoMHg3NjM3NmE1MiwgMHgzMTE0ODhiYyksIFdUQ1AoMHg3NjIyZDBlZiwgMHgzMTQ2MDkyMiksIFdUQ1AoMHg3NjBlMjJkMSwgMHgzMTc3ODBlMiksIFdUQ1AoMHg3NWY5NWZmYywgMHgzMWE4ZWZmNSksCi0gIFdUQ1AoMHg3NWU0ODg3NCwgMHgzMWRhNTY1MSksIFdUQ1AoMHg3NWNmOWMzZCwgMHgzMjBiYjNlZSksIFdUQ1AoMHg3NWJhOWI1YSwgMHgzMjNkMDhjMyksIFdUQ1AoMHg3NWE1ODVjZiwgMHgzMjZlNTRjNyksCi0gIFdUQ1AoMHg3NTkwNWJhMCwgMHgzMjlmOTdmMyksIFdUQ1AoMHg3NTdiMWNjZiwgMHgzMmQwZDIzYyksIFdUQ1AoMHg3NTY1Yzk2MiwgMHgzMzAyMDM5YiksIFdUQ1AoMHg3NTUwNjE1YywgMHgzMzMzMmMwNiksCi0gIFdUQ1AoMHg3NTNhZTRjMCwgMHgzMzY0NGI3NiksIFdUQ1AoMHg3NTI1NTM5MiwgMHgzMzk1NjFlMSksIFdUQ1AoMHg3NTBmYWRkNywgMHgzM2M2NmY0MCksIFdUQ1AoMHg3NGY5ZjM5MSwgMHgzM2Y3NzM4OCksCi0gIFdUQ1AoMHg3NGU0MjRjNSwgMHgzNDI4NmViMyksIFdUQ1AoMHg3NGNlNDE3NywgMHgzNDU5NjBiNyksIFdUQ1AoMHg3NGI4NDlhYSwgMHgzNDhhNDk4YiksIFdUQ1AoMHg3NGEyM2Q2MiwgMHgzNGJiMjkyNyksCi0gIFdUQ1AoMHg3NDhjMWNhNCwgMHgzNGViZmY4MyksIFdUQ1AoMHg3NDc1ZTc3MiwgMHgzNTFjY2M5NiksIFdUQ1AoMHg3NDVmOWRkMSwgMHgzNTRkOTA1NyksIFdUQ1AoMHg3NDQ5M2ZjNSwgMHgzNTdlNGFiZSksCi0gIFdUQ1AoMHg3NDMyY2Q1MSwgMHgzNWFlZmJjMiksIFdUQ1AoMHg3NDFjNDY3YiwgMHgzNWRmYTM1YSksIFdUQ1AoMHg3NDA1YWI0NSwgMHgzNjEwNDE3ZiksIFdUQ1AoMHg3M2VlZmJiMywgMHgzNjQwZDYyNyksCi0gIFdUQ1AoMHg3M2Q4MzdjYSwgMHgzNjcxNjE0YiksIFdUQ1AoMHg3M2MxNWY4ZCwgMHgzNmExZTJlMCksIFdUQ1AoMHg3M2FhNzMwMSwgMHgzNmQyNWFlMCksIFdUQ1AoMHg3MzkzNzIyYSwgMHgzNzAyYzk0MiksCi0gIFdUQ1AoMHg3MzdjNWQwYiwgMHgzNzMzMmRmZCksIFdUQ1AoMHg3MzY1MzNhOSwgMHgzNzYzODkwOCksIFdUQ1AoMHg3MzRkZjYwNywgMHgzNzkzZGE1YiksIFdUQ1AoMHg3MzM2YTQyYiwgMHgzN2M0MjFlZSksCi0gIFdUQ1AoMHg3MzFmM2UxNywgMHgzN2Y0NWZiNyksIFdUQ1AoMHg3MzA3YzNkMCwgMHgzODI0OTNiMCksIFdUQ1AoMHg3MmYwMzU1YSwgMHgzODU0YmRjZiksIFdUQ1AoMHg3MmQ4OTJiYSwgMHgzODg0ZGUwYiksCi0gIFdUQ1AoMHg3MmMwZGJmMywgMHgzOGI0ZjQ1ZCksIFdUQ1AoMHg3MmE5MTEwOSwgMHgzOGU1MDBiYyksIFdUQ1AoMHg3MjkxMzIwMSwgMHgzOTE1MDMxZiksIFdUQ1AoMHg3Mjc5M2VkZiwgMHgzOTQ0ZmI3ZSksCi0gIFdUQ1AoMHg3MjYxMzdhOCwgMHgzOTc0ZTlkMCksIFdUQ1AoMHg3MjQ5MWM1ZSwgMHgzOWE0Y2UwZSksIFdUQ1AoMHg3MjMwZWQwNywgMHgzOWQ0YTgyZiksIFdUQ1AoMHg3MjE4YTlhNywgMHgzYTA0NzgyYSksCi0gIFdUQ1AoMHg3MjAwNTI0MiwgMHgzYTM0M2RmNyksIFdUQ1AoMHg3MWU3ZTZkYywgMHgzYTYzZjk4ZCksIFdUQ1AoMHg3MWNmNjc3YSwgMHgzYTkzYWFlNSksIFdUQ1AoMHg3MWI2ZDQyMCwgMHgzYWMzNTFmNiksCi0gIFdUQ1AoMHg3MTllMmNkMiwgMHgzYWYyZWViNyksIFdUQ1AoMHg3MTg1NzE5NSwgMHgzYjIyODEyMCksIFdUQ1AoMHg3MTZjYTI2YywgMHgzYjUyMDkyYSksIFdUQ1AoMHg3MTUzYmY1ZCwgMHgzYjgxODZjYSksCi0gIFdUQ1AoMHg3MTNhYzg2YiwgMHgzYmIwZjlmYSksIFdUQ1AoMHg3MTIxYmQ5YywgMHgzYmUwNjJiMCksIFdUQ1AoMHg3MTA4OWVmMiwgMHgzYzBmYzBlNiksIFdUQ1AoMHg3MGVmNmM3NCwgMHgzYzNmMTQ5MSksCi0gIFdUQ1AoMHg3MGQ2MjYyNSwgMHgzYzZlNWRhYSksIFdUQ1AoMHg3MGJjY2MwOSwgMHgzYzlkOWMyOCksIFdUQ1AoMHg3MGEzNWUyNSwgMHgzY2NjZDAwNCksIFdUQ1AoMHg3MDg5ZGM3ZSwgMHgzY2ZiZjkzNSksCi0gIFdUQ1AoMHg3MDcwNDcxOCwgMHgzZDJiMTdiMyksIFdUQ1AoMHg3MDU2OWRmOCwgMHgzZDVhMmI3NSksIFdUQ1AoMHg3MDNjZTEyMiwgMHgzZDg5MzQ3NCksIFdUQ1AoMHg3MDIzMTA5YSwgMHgzZGI4MzJhNiksCi0gIFdUQ1AoMHg3MDA5MmM2NSwgMHgzZGU3MjYwNCksIFdUQ1AoMHg2ZmVmMzQ4OCwgMHgzZTE2MGU4NSksIFdUQ1AoMHg2ZmQ1MjkwNywgMHgzZTQ0ZWMyMiksIFdUQ1AoMHg2ZmJiMDllNywgMHgzZTczYmVkMiksCi0gIFdUQ1AoMHg2ZmEwZDcyYywgMHgzZWEyODY4YyksIFdUQ1AoMHg2Zjg2OTBkYiwgMHgzZWQxNDM0OSksIFdUQ1AoMHg2ZjZjMzZmOCwgMHgzZWZmZjUwMSksIFdUQ1AoMHg2ZjUxYzk4OSwgMHgzZjJlOWJhYiksCi0gIFdUQ1AoMHg2ZjM3NDg5MSwgMHgzZjVkMzczZSksIFdUQ1AoMHg2ZjFjYjQxNiwgMHgzZjhiYzdiNCksIFdUQ1AoMHg2ZjAyMGMxYywgMHgzZmJhNGQwMyksIFdUQ1AoMHg2ZWU3NTBhOCwgMHgzZmU4YzcyNCksCi0gIFdUQ1AoMHg2ZWNjODFiZSwgMHg0MDE3MzYwZSksIFdUQ1AoMHg2ZWIxOWY2NCwgMHg0MDQ1OTliOSksIFdUQ1AoMHg2ZTk2YTk5ZCwgMHg0MDczZjIxZCksIFdUQ1AoMHg2ZTdiYTA2ZiwgMHg0MGEyM2YzMiksCi0gIFdUQ1AoMHg2ZTYwODNkZSwgMHg0MGQwODBmMCksIFdUQ1AoMHg2ZTQ1NTNlZiwgMHg0MGZlYjc0ZiksIFdUQ1AoMHg2ZTJhMTBhOCwgMHg0MTJjZTI0NiksIFdUQ1AoMHg2ZTBlYmEwYywgMHg0MTViMDFjZSksCi0gIFdUQ1AoMHg2ZGYzNTAyMCwgMHg0MTg5MTVkZSksIFdUQ1AoMHg2ZGQ3ZDJlYSwgMHg0MWI3MWU2ZiksIFdUQ1AoMHg2ZGJjNDI2ZSwgMHg0MWU1MWI3NyksIFdUQ1AoMHg2ZGEwOWViMSwgMHg0MjEzMGNmMCksCi0gIFdUQ1AoMHg2ZDg0ZTdiNywgMHg0MjQwZjJkMSksIFdUQ1AoMHg2ZDY5MWQ4NywgMHg0MjZlY2QxMiksIFdUQ1AoMHg2ZDRkNDAyMywgMHg0MjljOWJhYiksIFdUQ1AoMHg2ZDMxNGY5MywgMHg0MmNhNWU5NCksCi0gIFdUQ1AoMHg2ZDE1NGJkOSwgMHg0MmY4MTVjNSksIFdUQ1AoMHg2Y2Y5MzRmYywgMHg0MzI1YzEzNSksIFdUQ1AoMHg2Y2RkMGIwMCwgMHg0MzUzNjBkZSksIFdUQ1AoMHg2Y2MwY2RlYSwgMHg0MzgwZjRiNyksCi0gIFdUQ1AoMHg2Y2E0N2RiZiwgMHg0M2FlN2NiNyksIFdUQ1AoMHg2Yzg4MWE4NCwgMHg0M2RiZjhkNyksIFdUQ1AoMHg2YzZiYTQzZSwgMHg0NDA5NjkxMCksIFdUQ1AoMHg2YzRmMWFmMiwgMHg0NDM2Y2Q1OCksCi0gIFdUQ1AoMHg2YzMyN2VhNiwgMHg0NDY0MjVhOCksIFdUQ1AoMHg2YzE1Y2Y1ZCwgMHg0NDkxNzFmOCksIFdUQ1AoMHg2YmY5MGQxZCwgMHg0NGJlYjI0MCksIFdUQ1AoMHg2YmRjMzdlYiwgMHg0NGViZTY3OSksCi0gIFdUQ1AoMHg2YmJmNGZjZCwgMHg0NTE5MGU5OSksIFdUQ1AoMHg2YmEyNTRjNywgMHg0NTQ2MmE5YSksIFdUQ1AoMHg2Yjg1NDZkZSwgMHg0NTczM2E3MyksIFdUQ1AoMHg2YjY4MjYxNywgMHg0NWEwM2UxZCksCi0gIFdUQ1AoMHg2YjRhZjI3OSwgMHg0NWNkMzU4ZiksIFdUQ1AoMHg2YjJkYWMwNiwgMHg0NWZhMjBjMiksIFdUQ1AoMHg2YjEwNTJjNiwgMHg0NjI2ZmZhZSksIFdUQ1AoMHg2YWYyZTZiYywgMHg0NjUzZDI0YiksCi0gIFdUQ1AoMHg2YWQ1NjdlZiwgMHg0NjgwOTg5MSksIFdUQ1AoMHg2YWI3ZDY2MywgMHg0NmFkNTI3OCksIFdUQ1AoMHg2YTlhMzIxZCwgMHg0NmQ5ZmZmOCksIFdUQ1AoMHg2YTdjN2IyMywgMHg0NzA2YTEwYSksCi0gIFdUQ1AoMHg2YTVlYjE3YSwgMHg0NzMzMzVhNSksIFdUQ1AoMHg2YTQwZDUyNywgMHg0NzVmYmRjMyksIFdUQ1AoMHg2YTIyZTYzMCwgMHg0NzhjMzk1YSksIFdUQ1AoMHg2YTA0ZTQ5OSwgMHg0N2I4YTg2NCksCi0gIFdUQ1AoMHg2OWU2ZDA2NywgMHg0N2U1MGFkOCksIFdUQ1AoMHg2OWM4YTlhMSwgMHg0ODExNjBhZSksIFdUQ1AoMHg2OWFhNzA0YywgMHg0ODNkYTllMCksIFdUQ1AoMHg2OThjMjQ2YywgMHg0ODY5ZTY2NSksCi0gIFdUQ1AoMHg2OTZkYzYwNywgMHg0ODk2MTYzNSksIFdUQ1AoMHg2OTRmNTUyMywgMHg0OGMyMzk0OSksIFdUQ1AoMHg2OTMwZDFjNCwgMHg0OGVlNGY5OCksIFdUQ1AoMHg2OTEyM2JmMSwgMHg0OTFhNTkxYyksCi0gIFdUQ1AoMHg2OGYzOTNhZSwgMHg0OTQ2NTVjYyksIFdUQ1AoMHg2OGQ0ZDkwMCwgMHg0OTcyNDVhMSksIFdUQ1AoMHg2OGI2MGJlZSwgMHg0OTllMjg5MiksIFdUQ1AoMHg2ODk3MmM3ZCwgMHg0OWM5ZmU5OSksCi0gIFdUQ1AoMHg2ODc4M2FiMSwgMHg0OWY1YzdhZSksIFdUQ1AoMHg2ODU5MzY5MSwgMHg0YTIxODNjOCksIFdUQ1AoMHg2ODNhMjAyMiwgMHg0YTRkMzJlMSksIFdUQ1AoMHg2ODFhZjc2YSwgMHg0YTc4ZDRmMCksCi0gIFdUQ1AoMHg2N2ZiYmM2ZCwgMHg0YWE0NjllZSksIFdUQ1AoMHg2N2RjNmYzMSwgMHg0YWNmZjFkMyksIFdUQ1AoMHg2N2JkMGZiZCwgMHg0YWZiNmM5OCksIFdUQ1AoMHg2NzlkOWUxNCwgMHg0YjI2ZGEzNSksCi0gIFdUQ1AoMHg2NzdlMWEzZSwgMHg0YjUyM2FhMiksIFdUQ1AoMHg2NzVlODQzZSwgMHg0YjdkOGRkOCksIFdUQ1AoMHg2NzNlZGMxYywgMHg0YmE4ZDNjZiksIFdUQ1AoMHg2NzFmMjFkYywgMHg0YmQ0MGM4MCksCi0gIFdUQ1AoMHg2NmZmNTU4NCwgMHg0YmZmMzdlMiksIFdUQ1AoMHg2NmRmNzcxYSwgMHg0YzJhNTVlZiksIFdUQ1AoMHg2NmJmODZhMywgMHg0YzU1NjY5ZiksIFdUQ1AoMHg2NjlmODQyNSwgMHg0YzgwNjllYSksCi0gIFdUQ1AoMHg2NjdmNmZhNSwgMHg0Y2FiNWZjOSksIFdUQ1AoMHg2NjVmNDkyOSwgMHg0Y2Q2NDgzNCksIFdUQ1AoMHg2NjNmMTBiNywgMHg0ZDAxMjMyNCksIFdUQ1AoMHg2NjFlYzY1NCwgMHg0ZDJiZjA5MSksCi0gIFdUQ1AoMHg2NWZlNmEwNiwgMHg0ZDU2YjA3MyksIFdUQ1AoMHg2NWRkZmJkMywgMHg0ZDgxNjJjNCksIFdUQ1AoMHg2NWJkN2JjMCwgMHg0ZGFjMDc3YiksIFdUQ1AoMHg2NTljZTlkNCwgMHg0ZGQ2OWU5MiksCi0gIFdUQ1AoMHg2NTdjNDYxMywgMHg0ZTAxMjgwMCksIFdUQ1AoMHg2NTViOTA4MywgMHg0ZTJiYTNiZSksIFdUQ1AoMHg2NTNhYzkyYiwgMHg0ZTU2MTFjNSksIFdUQ1AoMHg2NTE5ZjAxMCwgMHg0ZTgwNzIwZSksCi0gIFdUQ1AoMHg2NGY5MDUzOCwgMHg0ZWFhYzQ5MCksIFdUQ1AoMHg2NGQ4MDhhOCwgMHg0ZWQ1MDk0NSksIFdUQ1AoMHg2NGI2ZmE2NiwgMHg0ZWZmNDAyNSksIFdUQ1AoMHg2NDk1ZGE3OSwgMHg0ZjI5NjkyOCksCi0gIFdUQ1AoMHg2NDc0YThlNSwgMHg0ZjUzODQ0OCksIFdUQ1AoMHg2NDUzNjViMiwgMHg0ZjdkOTE3YyksIFdUQ1AoMHg2NDMyMTBlNCwgMHg0ZmE3OTBiZSksIFdUQ1AoMHg2NDEwYWE4MSwgMHg0ZmQxODIwNiksCi0gIFdUQ1AoMHg2M2VmMzI5MCwgMHg0ZmZiNjU0ZCksIFdUQ1AoMHg2M2NkYTkxNiwgMHg1MDI1M2E4YiksIFdUQ1AoMHg2M2FjMGUxOSwgMHg1MDRmMDFiYSksIFdUQ1AoMHg2MzhhNjE5ZSwgMHg1MDc4YmFkMSksCi0gIFdUQ1AoMHg2MzY4YTNhZCwgMHg1MGEyNjVjOSksIFdUQ1AoMHg2MzQ2ZDQ0YiwgMHg1MGNjMDI5YyksIFdUQ1AoMHg2MzI0ZjM3ZCwgMHg1MGY1OTE0MSksIFdUQ1AoMHg2MzAzMDE0YSwgMHg1MTFmMTFiMiksCi0gIFdUQ1AoMHg2MmUwZmRiOCwgMHg1MTQ4ODNlNyksIFdUQ1AoMHg2MmJlZThjYywgMHg1MTcxZTdkOSksIFdUQ1AoMHg2MjljYzI4YywgMHg1MTliM2Q4MCksIFdUQ1AoMHg2MjdhOGIwMCwgMHg1MWM0ODRkNiksCi0gIFdUQ1AoMHg2MjU4NDIyYywgMHg1MWVkYmRkNCksIFdUQ1AoMHg2MjM1ZTgxNiwgMHg1MjE2ZTg3MSksIFdUQ1AoMHg2MjEzN2NjNSwgMHg1MjQwMDRhNyksIFdUQ1AoMHg2MWYxMDAzZiwgMHg1MjY5MTI2ZSksCi0gIFdUQ1AoMHg2MWNlNzI4OSwgMHg1MjkyMTFjMCksIFdUQ1AoMHg2MWFiZDNhYiwgMHg1MmJiMDI5NSksIFdUQ1AoMHg2MTg5MjNhOSwgMHg1MmUzZTRlNiksIFdUQ1AoMHg2MTY2NjI4OSwgMHg1MzBjYjhhYyksCi0gIFdUQ1AoMHg2MTQzOTA1MywgMHg1MzM1N2RkZiksIFdUQ1AoMHg2MTIwYWQwZCwgMHg1MzVlMzQ3OSksIFdUQ1AoMHg2MGZkYjhiYiwgMHg1Mzg2ZGM3MiksIFdUQ1AoMHg2MGRhYjM2NSwgMHg1M2FmNzVjMyksCi0gIFdUQ1AoMHg2MGI3OWQxMCwgMHg1M2Q4MDA2NSksIFdUQ1AoMHg2MDk0NzVjMywgMHg1NDAwN2M1MSksIFdUQ1AoMHg2MDcxM2Q4NCwgMHg1NDI4ZTk4MCksIFdUQ1AoMHg2MDRkZjQ1OSwgMHg1NDUxNDdlYiksCi0gIFdUQ1AoMHg2MDJhOWE0OCwgMHg1NDc5OTc4YSksIFdUQ1AoMHg2MDA3MmY1NywgMHg1NGExZDg1NyksIFdUQ1AoMHg1ZmUzYjM4ZCwgMHg1NGNhMGE0YiksIFdUQ1AoMHg1ZmMwMjZmMCwgMHg1NGYyMmQ1ZCksCi0gIFdUQ1AoMHg1ZjljODk4NywgMHg1NTFhNDE4OSksIFdUQ1AoMHg1Zjc4ZGI1NiwgMHg1NTQyNDZjNiksIFdUQ1AoMHg1ZjU1MWM2NSwgMHg1NTZhM2QwZCksIFdUQ1AoMHg1ZjMxNGNiYSwgMHg1NTkyMjQ1NyksCi0gIFdUQ1AoMHg1ZjBkNmM1YiwgMHg1NWI5ZmM5ZSksIFdUQ1AoMHg1ZWU5N2I0ZiwgMHg1NWUxYzVkYSksIFdUQ1AoMHg1ZWM1Nzk5YiwgMHg1NjA5ODAwNSksIFdUQ1AoMHg1ZWExNjc0NywgMHg1NjMxMmIxNyksCi0gIFdUQ1AoMHg1ZTdkNDQ1OCwgMHg1NjU4YzcwOSksIFdUQ1AoMHg1ZTU5MTBkNCwgMHg1NjgwNTNkNSksIFdUQ1AoMHg1ZTM0Y2NjMywgMHg1NmE3ZDE3NCksIFdUQ1AoMHg1ZTEwNzgyYiwgMHg1NmNmM2ZkZSksCi0gIFdUQ1AoMHg1ZGVjMTMxMSwgMHg1NmY2OWYwZCksIFdUQ1AoMHg1ZGM3OWQ3YywgMHg1NzFkZWVmYSksIFdUQ1AoMHg1ZGEzMTc3MywgMHg1NzQ1MmY5ZCksIFdUQ1AoMHg1ZDdlODBmYywgMHg1NzZjNjBmMSksCi0gIFdUQ1AoMHg1ZDU5ZGExZSwgMHg1NzkzODJlZSksIFdUQ1AoMHg1ZDM1MjJkZSwgMHg1N2JhOTU4ZCksIFdUQ1AoMHg1ZDEwNWI0NCwgMHg1N2UxOThjNyksIFdUQ1AoMHg1Y2ViODM1NSwgMHg1ODA4OGM5NiksCi0gIFdUQ1AoMHg1Y2M2OWIxOSwgMHg1ODJmNzBmMyksIFdUQ1AoMHg1Y2ExYTI5NSwgMHg1ODU2NDVkNyksIFdUQ1AoMHg1YzdjOTlkMSwgMHg1ODdkMGIzYiksIFdUQ1AoMHg1YzU3ODBkMywgMHg1OGEzYzExOCksCi0gIFdUQ1AoMHg1YzMyNTdhMCwgMHg1OGNhNjc2NyksIFdUQ1AoMHg1YzBkMWU0MSwgMHg1OGYwZmUyMyksIFdUQ1AoMHg1YmU3ZDRiYSwgMHg1OTE3ODU0MyksIFdUQ1AoMHg1YmMyN2IxNCwgMHg1OTNkZmNjMiksCi0gIFdUQ1AoMHg1YjlkMTE1NCwgMHg1OTY0NjQ5OCksIFdUQ1AoMHg1Yjc3OTc4MCwgMHg1OThhYmNiZSksIFdUQ1AoMHg1YjUyMGRhMSwgMHg1OWIxMDUyZiksIFdUQ1AoMHg1YjJjNzNiYiwgMHg1OWQ3M2RlMyksCi0gIFdUQ1AoMHg1YjA2YzlkNiwgMHg1OWZkNjZkNCksIFdUQ1AoMHg1YWUxMGZmOSwgMHg1YTIzN2ZmYSksIFdUQ1AoMHg1YWJiNDYyOSwgMHg1YTQ5ODk1MCksIFdUQ1AoMHg1YTk1NmM2ZSwgMHg1YTZmODJjZSksCitjb25zdCBGSVhQX1NUUCBTaW5lVGFibGUxMDI0W10gPSB7CisgICAgU1RDUCgweDdmZmZmZmZmLCAweDAwMDAwMDAwKSwgU1RDUCgweDdmZmZmNjIxLCAweDAwMzI0M2Y1KSwKKyAgICBTVENQKDB4N2ZmZmQ4ODYsIDB4MDA2NDg3ZTMpLCBTVENQKDB4N2ZmZmE3MmMsIDB4MDA5NmNiYzEpLAorICAgIFNUQ1AoMHg3ZmZmNjIxNiwgMHgwMGM5MGY4OCksIFNUQ1AoMHg3ZmZmMDk0MywgMHgwMGZiNTMzMCksCisgICAgU1RDUCgweDdmZmU5Y2IyLCAweDAxMmQ5NmIxKSwgU1RDUCgweDdmZmUxYzY1LCAweDAxNWZkYTAzKSwKKyAgICBTVENQKDB4N2ZmZDg4NWEsIDB4MDE5MjFkMjApLCBTVENQKDB4N2ZmY2UwOTMsIDB4MDFjNDVmZmUpLAorICAgIFNUQ1AoMHg3ZmZjMjUwZiwgMHgwMWY2YTI5NyksIFNUQ1AoMHg3ZmZiNTVjZSwgMHgwMjI4ZTRlMiksCisgICAgU1RDUCgweDdmZmE3MmQxLCAweDAyNWIyNmQ3KSwgU1RDUCgweDdmZjk3YzE4LCAweDAyOGQ2ODcwKSwKKyAgICBTVENQKDB4N2ZmODcxYTIsIDB4MDJiZmE5YTQpLCBTVENQKDB4N2ZmNzUzNzAsIDB4MDJmMWVhNmMpLAorICAgIFNUQ1AoMHg3ZmY2MjE4MiwgMHgwMzI0MmFiZiksIFNUQ1AoMHg3ZmY0ZGJkOSwgMHgwMzU2NmE5NiksCisgICAgU1RDUCgweDdmZjM4Mjc0LCAweDAzODhhOWVhKSwgU1RDUCgweDdmZjIxNTUzLCAweDAzYmFlOGIyKSwKKyAgICBTVENQKDB4N2ZmMDk0NzgsIDB4MDNlZDI2ZTYpLCBTVENQKDB4N2ZlZWZmZTEsIDB4MDQxZjY0ODApLAorICAgIFNUQ1AoMHg3ZmVkNTc5MSwgMHgwNDUxYTE3NyksIFNUQ1AoMHg3ZmViOWI4NSwgMHgwNDgzZGRjMyksCisgICAgU1RDUCgweDdmZTljYmMwLCAweDA0YjYxOTVkKSwgU1RDUCgweDdmZTdlODQxLCAweDA0ZTg1NDNlKSwKKyAgICBTVENQKDB4N2ZlNWYxMDgsIDB4MDUxYThlNWMpLCBTVENQKDB4N2ZlM2U2MTYsIDB4MDU0Y2M3YjEpLAorICAgIFNUQ1AoMHg3ZmUxYzc2YiwgMHgwNTdmMDAzNSksIFNUQ1AoMHg3ZmRmOTUwOCwgMHgwNWIxMzdkZiksCisgICAgU1RDUCgweDdmZGQ0ZWVjLCAweDA1ZTM2ZWE5KSwgU1RDUCgweDdmZGFmNTE5LCAweDA2MTVhNDhiKSwKKyAgICBTVENQKDB4N2ZkODg3OGUsIDB4MDY0N2Q5N2MpLCBTVENQKDB4N2ZkNjA2NGMsIDB4MDY3YTBkNzYpLAorICAgIFNUQ1AoMHg3ZmQzNzE1MywgMHgwNmFjNDA2ZiksIFNUQ1AoMHg3ZmQwYzhhMywgMHgwNmRlNzI2MiksCisgICAgU1RDUCgweDdmY2UwYzNlLCAweDA3MTBhMzQ1KSwgU1RDUCgweDdmY2IzYzIzLCAweDA3NDJkMzExKSwKKyAgICBTVENQKDB4N2ZjODU4NTQsIDB4MDc3NTAxYmUpLCBTVENQKDB4N2ZjNTYwY2YsIDB4MDdhNzJmNDUpLAorICAgIFNUQ1AoMHg3ZmMyNTU5NiwgMHgwN2Q5NWI5ZSksIFNUQ1AoMHg3ZmJmMzZhYSwgMHgwODBiODZjMiksCisgICAgU1RDUCgweDdmYmMwNDBhLCAweDA4M2RiMGE3KSwgU1RDUCgweDdmYjhiZGI4LCAweDA4NmZkOTQ3KSwKKyAgICBTVENQKDB4N2ZiNTYzYjMsIDB4MDhhMjAwOWEpLCBTVENQKDB4N2ZiMWY1ZmMsIDB4MDhkNDI2OTkpLAorICAgIFNUQ1AoMHg3ZmFlNzQ5NSwgMHgwOTA2NGIzYSksIFNUQ1AoMHg3ZmFhZGY3YywgMHgwOTM4NmU3OCksCisgICAgU1RDUCgweDdmYTczNmI0LCAweDA5NmE5MDQ5KSwgU1RDUCgweDdmYTM3YTNjLCAweDA5OWNiMGE3KSwKKyAgICBTVENQKDB4N2Y5ZmFhMTUsIDB4MDljZWNmODkpLCBTVENQKDB4N2Y5YmM2NDAsIDB4MGEwMGVjZTgpLAorICAgIFNUQ1AoMHg3Zjk3Y2ViZCwgMHgwYTMzMDhiZCksIFNUQ1AoMHg3ZjkzYzM4YywgMHgwYTY1MjJmZSksCisgICAgU1RDUCgweDdmOGZhNGIwLCAweDBhOTczYmE1KSwgU1RDUCgweDdmOGI3MjI3LCAweDBhYzk1MmFhKSwKKyAgICBTVENQKDB4N2Y4NzJiZjMsIDB4MGFmYjY4MDUpLCBTVENQKDB4N2Y4MmQyMTQsIDB4MGIyZDdiYWYpLAorICAgIFNUQ1AoMHg3ZjdlNjQ4YywgMHgwYjVmOGQ5ZiksIFNUQ1AoMHg3Zjc5ZTM1YSwgMHgwYjkxOWRjZiksCisgICAgU1RDUCgweDdmNzU0ZTgwLCAweDBiYzNhYzM1KSwgU1RDUCgweDdmNzBhNWZlLCAweDBiZjViOGNiKSwKKyAgICBTVENQKDB4N2Y2YmU5ZDQsIDB4MGMyN2MzODkpLCBTVENQKDB4N2Y2NzFhMDUsIDB4MGM1OWNjNjgpLAorICAgIFNUQ1AoMHg3ZjYyMzY4ZiwgMHgwYzhiZDM1ZSksIFNUQ1AoMHg3ZjVkM2Y3NSwgMHgwY2JkZDg2NSksCisgICAgU1RDUCgweDdmNTgzNGI3LCAweDBjZWZkYjc2KSwgU1RDUCgweDdmNTMxNjU1LCAweDBkMjFkYzg3KSwKKyAgICBTVENQKDB4N2Y0ZGU0NTEsIDB4MGQ1M2RiOTIpLCBTVENQKDB4N2Y0ODllYWEsIDB4MGQ4NWQ4OGYpLAorICAgIFNUQ1AoMHg3ZjQzNDU2MywgMHgwZGI3ZDM3NiksIFNUQ1AoMHg3ZjNkZDg3YywgMHgwZGU5Y2M0MCksCisgICAgU1RDUCgweDdmMzg1N2Y2LCAweDBlMWJjMmU0KSwgU1RDUCgweDdmMzJjM2QxLCAweDBlNGRiNzViKSwKKyAgICBTVENQKDB4N2YyZDFjMGUsIDB4MGU3ZmE5OWUpLCBTVENQKDB4N2YyNzYwYWYsIDB4MGViMTk5YTQpLAorICAgIFNUQ1AoMHg3ZjIxOTFiNCwgMHgwZWUzODc2NiksIFNUQ1AoMHg3ZjFiYWYxZSwgMHgwZjE1NzJkYyksCisgICAgU1RDUCgweDdmMTViOGVlLCAweDBmNDc1YmZmKSwgU1RDUCgweDdmMGZhZjI1LCAweDBmNzk0MmM3KSwKKyAgICBTVENQKDB4N2YwOTkxYzQsIDB4MGZhYjI3MmIpLCBTVENQKDB4N2YwMzYwY2IsIDB4MGZkZDA5MjYpLAorICAgIFNUQ1AoMHg3ZWZkMWMzYywgMHgxMDBlZThhZCksIFNUQ1AoMHg3ZWY2YzQxOCwgMHgxMDQwYzViYiksCisgICAgU1RDUCgweDdlZjA1ODYwLCAweDEwNzJhMDQ4KSwgU1RDUCgweDdlZTlkOTE0LCAweDEwYTQ3ODRiKSwKKyAgICBTVENQKDB4N2VlMzQ2MzYsIDB4MTBkNjRkYmQpLCBTVENQKDB4N2VkYzlmYzYsIDB4MTEwODIwOTYpLAorICAgIFNUQ1AoMHg3ZWQ1ZTVjNiwgMHgxMTM5ZjBjZiksIFNUQ1AoMHg3ZWNmMTgzNywgMHgxMTZiYmU2MCksCisgICAgU1RDUCgweDdlYzgzNzFhLCAweDExOWQ4OTQxKSwgU1RDUCgweDdlYzE0MjcwLCAweDExY2Y1MTZhKSwKKyAgICBTVENQKDB4N2ViYTNhMzksIDB4MTIwMTE2ZDUpLCBTVENQKDB4N2ViMzFlNzgsIDB4MTIzMmQ5NzkpLAorICAgIFNUQ1AoMHg3ZWFiZWYyYywgMHgxMjY0OTk0ZSksIFNUQ1AoMHg3ZWE0YWM1OCwgMHgxMjk2NTY0ZCksCisgICAgU1RDUCgweDdlOWQ1NWZjLCAweDEyYzgxMDZmKSwgU1RDUCgweDdlOTVlYzFhLCAweDEyZjljN2FhKSwKKyAgICBTVENQKDB4N2U4ZTZlYjIsIDB4MTMyYjdiZjkpLCBTVENQKDB4N2U4NmRkYzYsIDB4MTM1ZDJkNTMpLAorICAgIFNUQ1AoMHg3ZTdmMzk1NywgMHgxMzhlZGJiMSksIFNUQ1AoMHg3ZTc3ODE2NiwgMHgxM2MwODcwYSksCisgICAgU1RDUCgweDdlNmZiNWY0LCAweDEzZjIyZjU4KSwgU1RDUCgweDdlNjdkNzAzLCAweDE0MjNkNDkyKSwKKyAgICBTVENQKDB4N2U1ZmU0OTMsIDB4MTQ1NTc2YjEpLCBTVENQKDB4N2U1N2RlYTcsIDB4MTQ4NzE1YWUpLAorICAgIFNUQ1AoMHg3ZTRmYzUzZSwgMHgxNGI4YjE3ZiksIFNUQ1AoMHg3ZTQ3OTg1YiwgMHgxNGVhNGExZiksCisgICAgU1RDUCgweDdlM2Y1N2ZmLCAweDE1MWJkZjg2KSwgU1RDUCgweDdlMzcwNDJhLCAweDE1NGQ3MWFhKSwKKyAgICBTVENQKDB4N2UyZTljZGYsIDB4MTU3ZjAwODYpLCBTVENQKDB4N2UyNjIyMWYsIDB4MTViMDhjMTIpLAorICAgIFNUQ1AoMHg3ZTFkOTNlYSwgMHgxNWUyMTQ0NSksIFNUQ1AoMHg3ZTE0ZjI0MiwgMHgxNjEzOTkxOCksCisgICAgU1RDUCgweDdlMGMzZDI5LCAweDE2NDUxYTgzKSwgU1RDUCgweDdlMDM3NGEwLCAweDE2NzY5ODdmKSwKKyAgICBTVENQKDB4N2RmYTk4YTgsIDB4MTZhODEzMDUpLCBTVENQKDB4N2RmMWE5NDIsIDB4MTZkOThhMGMpLAorICAgIFNUQ1AoMHg3ZGU4YTY3MCwgMHgxNzBhZmQ4ZCksIFNUQ1AoMHg3ZGRmOTAzNCwgMHgxNzNjNmQ4MCksCisgICAgU1RDUCgweDdkZDY2NjhmLCAweDE3NmRkOWRlKSwgU1RDUCgweDdkY2QyOTgxLCAweDE3OWY0MjlmKSwKKyAgICBTVENQKDB4N2RjM2Q5MGQsIDB4MTdkMGE3YmMpLCBTVENQKDB4N2RiYTc1MzQsIDB4MTgwMjA5MmMpLAorICAgIFNUQ1AoMHg3ZGIwZmRmOCwgMHgxODMzNjZlOSksIFNUQ1AoMHg3ZGE3NzM1OSwgMHgxODY0YzBlYSksCisgICAgU1RDUCgweDdkOWRkNTVhLCAweDE4OTYxNzI4KSwgU1RDUCgweDdkOTQyM2ZjLCAweDE4Yzc2OTliKSwKKyAgICBTVENQKDB4N2Q4YTVmNDAsIDB4MThmOGI4M2MpLCBTVENQKDB4N2Q4MDg3MjgsIDB4MTkyYTAzMDQpLAorICAgIFNUQ1AoMHg3ZDc2OWJiNSwgMHgxOTViNDllYSksIFNUQ1AoMHg3ZDZjOWNlOSwgMHgxOThjOGNlNyksCisgICAgU1RDUCgweDdkNjI4YWM2LCAweDE5YmRjYmYzKSwgU1RDUCgweDdkNTg2NTRkLCAweDE5ZWYwNzA3KSwKKyAgICBTVENQKDB4N2Q0ZTJjN2YsIDB4MWEyMDNlMWIpLCBTVENQKDB4N2Q0M2UwNWUsIDB4MWE1MTcxMjgpLAorICAgIFNUQ1AoMHg3ZDM5ODBlYywgMHgxYTgyYTAyNiksIFNUQ1AoMHg3ZDJmMGUyYiwgMHgxYWIzY2IwZCksCisgICAgU1RDUCgweDdkMjQ4ODFiLCAweDFhZTRmMWQ2KSwgU1RDUCgweDdkMTllZWJmLCAweDFiMTYxNDc5KSwKKyAgICBTVENQKDB4N2QwZjQyMTgsIDB4MWI0NzMyZWYpLCBTVENQKDB4N2QwNDgyMjgsIDB4MWI3ODRkMzApLAorICAgIFNUQ1AoMHg3Y2Y5YWVmMCwgMHgxYmE5NjMzNSksIFNUQ1AoMHg3Y2VlYzg3MywgMHgxYmRhNzRmNiksCisgICAgU1RDUCgweDdjZTNjZWIyLCAweDFjMGI4MjZhKSwgU1RDUCgweDdjZDhjMWFlLCAweDFjM2M4YjhjKSwKKyAgICBTVENQKDB4N2NjZGExNjksIDB4MWM2ZDkwNTMpLCBTVENQKDB4N2NjMjZkZTUsIDB4MWM5ZTkwYjgpLAorICAgIFNUQ1AoMHg3Y2I3MjcyNCwgMHgxY2NmOGNiMyksIFNUQ1AoMHg3Y2FiY2QyOCwgMHgxZDAwODQzZCksCisgICAgU1RDUCgweDdjYTA1ZmYxLCAweDFkMzE3NzRkKSwgU1RDUCgweDdjOTRkZjgzLCAweDFkNjI2NWRkKSwKKyAgICBTVENQKDB4N2M4OTRiZGUsIDB4MWQ5MzRmZTUpLCBTVENQKDB4N2M3ZGE1MDUsIDB4MWRjNDM1NWUpLAorICAgIFNUQ1AoMHg3YzcxZWFmOSwgMHgxZGY1MTYzZiksIFNUQ1AoMHg3YzY2MWRiYywgMHgxZTI1ZjI4MiksCisgICAgU1RDUCgweDdjNWEzZDUwLCAweDFlNTZjYTFlKSwgU1RDUCgweDdjNGU0OWI3LCAweDFlODc5ZDBkKSwKKyAgICBTVENQKDB4N2M0MjQyZjIsIDB4MWViODZiNDYpLCBTVENQKDB4N2MzNjI5MDQsIDB4MWVlOTM0YzMpLAorICAgIFNUQ1AoMHg3YzI5ZmJlZSwgMHgxZjE5Zjk3YiksIFNUQ1AoMHg3YzFkYmJiMywgMHgxZjRhYjk2OCksCisgICAgU1RDUCgweDdjMTE2ODUzLCAweDFmN2I3NDgxKSwgU1RDUCgweDdjMDUwMWQyLCAweDFmYWMyYWJmKSwKKyAgICBTVENQKDB4N2JmODg4MzAsIDB4MWZkY2RjMWIpLCBTVENQKDB4N2JlYmZiNzAsIDB4MjAwZDg4OGQpLAorICAgIFNUQ1AoMHg3YmRmNWI5NCwgMHgyMDNlMzAwZCksIFNUQ1AoMHg3YmQyYTg5ZSwgMHgyMDZlZDI5NSksCisgICAgU1RDUCgweDdiYzVlMjkwLCAweDIwOWY3MDFjKSwgU1RDUCgweDdiYjkwOTZiLCAweDIwZDAwODljKSwKKyAgICBTVENQKDB4N2JhYzFkMzEsIDB4MjEwMDljMGMpLCBTVENQKDB4N2I5ZjFkZTYsIDB4MjEzMTJhNjUpLAorICAgIFNUQ1AoMHg3YjkyMGI4OSwgMHgyMTYxYjNhMCksIFNUQ1AoMHg3Yjg0ZTYxZiwgMHgyMTkyMzdiNSksCisgICAgU1RDUCgweDdiNzdhZGE4LCAweDIxYzJiNjljKSwgU1RDUCgweDdiNmE2MjI3LCAweDIxZjMzMDRmKSwKKyAgICBTVENQKDB4N2I1ZDAzOWUsIDB4MjIyM2E0YzUpLCBTVENQKDB4N2I0ZjkyMGUsIDB4MjI1NDEzZjgpLAorICAgIFNUQ1AoMHg3YjQyMGQ3YSwgMHgyMjg0N2RlMCksIFNUQ1AoMHg3YjM0NzVlNSwgMHgyMmI0ZTI3NCksCisgICAgU1RDUCgweDdiMjZjYjRmLCAweDIyZTU0MWFmKSwgU1RDUCgweDdiMTkwZGJjLCAweDIzMTU5Yjg4KSwKKyAgICBTVENQKDB4N2IwYjNkMmMsIDB4MjM0NWVmZjgpLCBTVENQKDB4N2FmZDU5YTQsIDB4MjM3NjNlZjcpLAorICAgIFNUQ1AoMHg3YWVmNjMyMywgMHgyM2E2ODg3ZiksIFNUQ1AoMHg3YWUxNTlhZSwgMHgyM2Q2Y2M4NyksCisgICAgU1RDUCgweDdhZDMzZDQ1LCAweDI0MDcwYjA4KSwgU1RDUCgweDdhYzUwZGVjLCAweDI0Mzc0M2ZhKSwKKyAgICBTVENQKDB4N2FiNmNiYTQsIDB4MjQ2Nzc3NTgpLCBTVENQKDB4N2FhODc2NmYsIDB4MjQ5N2E1MTcpLAorICAgIFNUQ1AoMHg3YTlhMGU1MCwgMHgyNGM3Y2QzMyksIFNUQ1AoMHg3YThiOTM0OCwgMHgyNGY3ZWZhMiksCisgICAgU1RDUCgweDdhN2QwNTViLCAweDI1MjgwYzVlKSwgU1RDUCgweDdhNmU2NDhhLCAweDI1NTgyMzVmKSwKKyAgICBTVENQKDB4N2E1ZmIwZDgsIDB4MjU4ODM0OWQpLCBTVENQKDB4N2E1MGVhNDcsIDB4MjViODQwMTIpLAorICAgIFNUQ1AoMHg3YTQyMTBkOCwgMHgyNWU4NDViNiksIFNUQ1AoMHg3YTMzMjQ5MCwgMHgyNjE4NDU4MSksCisgICAgU1RDUCgweDdhMjQyNTZmLCAweDI2NDgzZjZjKSwgU1RDUCgweDdhMTUxMzc4LCAweDI2NzgzMzcwKSwKKyAgICBTVENQKDB4N2EwNWVlYWQsIDB4MjZhODIxODYpLCBTVENQKDB4NzlmNmI3MTEsIDB4MjZkODA5YTUpLAorICAgIFNUQ1AoMHg3OWU3NmNhNywgMHgyNzA3ZWJjNyksIFNUQ1AoMHg3OWQ4MGY2ZiwgMHgyNzM3YzdlMyksCisgICAgU1RDUCgweDc5Yzg5ZjZlLCAweDI3Njc5ZGY0KSwgU1RDUCgweDc5YjkxY2E0LCAweDI3OTc2ZGYxKSwKKyAgICBTVENQKDB4NzlhOTg3MTUsIDB4MjdjNzM3ZDMpLCBTVENQKDB4Nzk5OWRlYzQsIDB4MjdmNmZiOTIpLAorICAgIFNUQ1AoMHg3OThhMjNiMSwgMHgyODI2YjkyOCksIFNUQ1AoMHg3OTdhNTVlMCwgMHgyODU2NzA4ZCksCisgICAgU1RDUCgweDc5NmE3NTU0LCAweDI4ODYyMWI5KSwgU1RDUCgweDc5NWE4MjBlLCAweDI4YjVjY2E1KSwKKyAgICBTVENQKDB4Nzk0YTdjMTIsIDB4MjhlNTcxNGIpLCBTVENQKDB4NzkzYTYzNjEsIDB4MjkxNTBmYTEpLAorICAgIFNUQ1AoMHg3OTJhMzdmZSwgMHgyOTQ0YTdhMiksIFNUQ1AoMHg3OTE5ZjllYywgMHgyOTc0Mzk0NiksCisgICAgU1RDUCgweDc5MDlhOTJkLCAweDI5YTNjNDg1KSwgU1RDUCgweDc4Zjk0NWMzLCAweDI5ZDM0OTU4KSwKKyAgICBTVENQKDB4NzhlOGNmYjIsIDB4MmEwMmM3YjgpLCBTVENQKDB4NzhkODQ2ZmIsIDB4MmEzMjNmOWUpLAorICAgIFNUQ1AoMHg3OGM3YWJhMiwgMHgyYTYxYjEwMSksIFNUQ1AoMHg3OGI2ZmRhOCwgMHgyYTkxMWJkYyksCisgICAgU1RDUCgweDc4YTYzZDExLCAweDJhYzA4MDI2KSwgU1RDUCgweDc4OTU2OWRmLCAweDJhZWZkZGQ4KSwKKyAgICBTVENQKDB4Nzg4NDg0MTQsIDB4MmIxZjM0ZWIpLCBTVENQKDB4Nzg3MzhiYjMsIDB4MmI0ZTg1NTgpLAorICAgIFNUQ1AoMHg3ODYyODBiZiwgMHgyYjdkY2YxNyksIFNUQ1AoMHg3ODUxNjMzYiwgMHgyYmFkMTIyMSksCisgICAgU1RDUCgweDc4NDAzMzI5LCAweDJiZGM0ZTZmKSwgU1RDUCgweDc4MmVmMDhiLCAweDJjMGI4M2ZhKSwKKyAgICBTVENQKDB4NzgxZDliNjUsIDB4MmMzYWIyYjkpLCBTVENQKDB4NzgwYzMzYjgsIDB4MmM2OWRhYTYpLAorICAgIFNUQ1AoMHg3N2ZhYjk4OSwgMHgyYzk4ZmJiYSksIFNUQ1AoMHg3N2U5MmNkOSwgMHgyY2M4MTVlZSksCisgICAgU1RDUCgweDc3ZDc4ZGFhLCAweDJjZjcyOTM5KSwgU1RDUCgweDc3YzVkYzAxLCAweDJkMjYzNTk2KSwKKyAgICBTVENQKDB4NzdiNDE3ZGYsIDB4MmQ1NTNhZmMpLCBTVENQKDB4NzdhMjQxNDgsIDB4MmQ4NDM5NjQpLAorICAgIFNUQ1AoMHg3NzkwNTgzZSwgMHgyZGIzMzBjNyksIFNUQ1AoMHg3NzdlNWNjMywgMHgyZGUyMjExZSksCisgICAgU1RDUCgweDc3NmM0ZWRiLCAweDJlMTEwYTYyKSwgU1RDUCgweDc3NWEyZTg5LCAweDJlM2ZlYzhiKSwKKyAgICBTVENQKDB4Nzc0N2ZiY2UsIDB4MmU2ZWM3OTIpLCBTVENQKDB4NzczNWI2YWYsIDB4MmU5ZDliNzApLAorICAgIFNUQ1AoMHg3NzIzNWYyZCwgMHgyZWNjNjgxZSksIFNUQ1AoMHg3NzEwZjU0YywgMHgyZWZiMmQ5NSksCisgICAgU1RDUCgweDc2ZmU3OTBlLCAweDJmMjllYmNjKSwgU1RDUCgweDc2ZWJlYTc3LCAweDJmNThhMmJlKSwKKyAgICBTVENQKDB4NzZkOTQ5ODksIDB4MmY4NzUyNjIpLCBTVENQKDB4NzZjNjk2NDcsIDB4MmZiNWZhYjIpLAorICAgIFNUQ1AoMHg3NmIzZDBiNCwgMHgyZmU0OWJhNyksIFNUQ1AoMHg3NmEwZjhkMiwgMHgzMDEzMzUzOSksCisgICAgU1RDUCgweDc2OGUwZWE2LCAweDMwNDFjNzYxKSwgU1RDUCgweDc2N2IxMjMxLCAweDMwNzA1MjE3KSwKKyAgICBTVENQKDB4NzY2ODAzNzYsIDB4MzA5ZWQ1NTYpLCBTVENQKDB4NzY1NGUyNzksIDB4MzBjZDUxMTUpLAorICAgIFNUQ1AoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksIFNUQ1AoMHg3NjJlNjljNCwgMHgzMTJhMzFmOCksCisgICAgU1RDUCgweDc2MWIxMjExLCAweDMxNTg5NzBlKSwgU1RDUCgweDc2MDdhODI4LCAweDMxODZmNDg3KSwKKyAgICBTVENQKDB4NzVmNDJjMGIsIDB4MzFiNTRhNWUpLCBTVENQKDB4NzVlMDlkYmQsIDB4MzFlMzk4ODkpLAorICAgIFNUQ1AoMHg3NWNjZmQ0MiwgMHgzMjExZGYwNCksIFNUQ1AoMHg3NWI5NGE5YywgMHgzMjQwMWRjNiksCisgICAgU1RDUCgweDc1YTU4NWNmLCAweDMyNmU1NGM3KSwgU1RDUCgweDc1OTFhZWRkLCAweDMyOWM4NDAyKSwKKyAgICBTVENQKDB4NzU3ZGM1Y2EsIDB4MzJjYWFiNmYpLCBTVENQKDB4NzU2OWNhOTksIDB4MzJmOGNiMDcpLAorICAgIFNUQ1AoMHg3NTU1YmQ0YywgMHgzMzI2ZTJjMyksIFNUQ1AoMHg3NTQxOWRlNywgMHgzMzU0ZjI5YiksCisgICAgU1RDUCgweDc1MmQ2YzZjLCAweDMzODJmYTg4KSwgU1RDUCgweDc1MTkyOGUwLCAweDMzYjBmYTg0KSwKKyAgICBTVENQKDB4NzUwNGQzNDUsIDB4MzNkZWYyODcpLCBTVENQKDB4NzRmMDZiOWUsIDB4MzQwY2UyOGIpLAorICAgIFNUQ1AoMHg3NGRiZjFlZiwgMHgzNDNhY2E4NyksIFNUQ1AoMHg3NGM3NjYzYSwgMHgzNDY4YWE3NiksCisgICAgU1RDUCgweDc0YjJjODg0LCAweDM0OTY4MjUwKSwgU1RDUCgweDc0OWUxOGNkLCAweDM0YzQ1MjBkKSwKKyAgICBTVENQKDB4NzQ4OTU3MWMsIDB4MzRmMjE5YTgpLCBTVENQKDB4NzQ3NDgzNzEsIDB4MzUxZmQ5MTgpLAorICAgIFNUQ1AoMHg3NDVmOWRkMSwgMHgzNTRkOTA1NyksIFNUQ1AoMHg3NDRhYTYzZiwgMHgzNTdiM2Y1ZCksCisgICAgU1RDUCgweDc0MzU5Y2JkLCAweDM1YThlNjI1KSwgU1RDUCgweDc0MjA4MTUwLCAweDM1ZDY4NGE2KSwKKyAgICBTVENQKDB4NzQwYjUzZmIsIDB4MzYwNDFhZDkpLCBTVENQKDB4NzNmNjE0YzAsIDB4MzYzMWE4YjgpLAorICAgIFNUQ1AoMHg3M2UwYzNhMywgMHgzNjVmMmUzYiksIFNUQ1AoMHg3M2NiNjBhOCwgMHgzNjhjYWI1YyksCisgICAgU1RDUCgweDczYjVlYmQxLCAweDM2YmEyMDE0KSwgU1RDUCgweDczYTA2NTIyLCAweDM2ZTc4YzViKSwKKyAgICBTVENQKDB4NzM4YWNjOWUsIDB4MzcxNGYwMmEpLCBTVENQKDB4NzM3NTIyNDksIDB4Mzc0MjRiN2IpLAorICAgIFNUQ1AoMHg3MzVmNjYyNiwgMHgzNzZmOWU0NiksIFNUQ1AoMHg3MzQ5OTgzOCwgMHgzNzljZTg4NSksCisgICAgU1RDUCgweDczMzNiODgzLCAweDM3Y2EyYTMwKSwgU1RDUCgweDczMWRjNzBhLCAweDM3Zjc2MzQxKSwKKyAgICBTVENQKDB4NzMwN2MzZDAsIDB4MzgyNDkzYjApLCBTVENQKDB4NzJmMWFlZDksIDB4Mzg1MWJiNzcpLAorICAgIFNUQ1AoMHg3MmRiODgyOCwgMHgzODdlZGE4ZSksIFNUQ1AoMHg3MmM1NGZjMSwgMHgzOGFiZjBlZiksCisgICAgU1RDUCgweDcyYWYwNWE3LCAweDM4ZDhmZTkzKSwgU1RDUCgweDcyOThhOWRkLCAweDM5MDYwMzczKSwKKyAgICBTVENQKDB4NzI4MjNjNjcsIDB4MzkzMmZmODcpLCBTVENQKDB4NzI2YmJkNDgsIDB4Mzk1ZmYyYzkpLAorICAgIFNUQ1AoMHg3MjU1MmM4NSwgMHgzOThjZGQzMiksIFNUQ1AoMHg3MjNlOGEyMCwgMHgzOWI5YmViYyksCisgICAgU1RDUCgweDcyMjdkNjFjLCAweDM5ZTY5NzVlKSwgU1RDUCgweDcyMTExMDdlLCAweDNhMTM2NzEyKSwKKyAgICBTVENQKDB4NzFmYTM5NDksIDB4M2E0MDJkZDIpLCBTVENQKDB4NzFlMzUwODAsIDB4M2E2Y2ViOTYpLAorICAgIFNUQ1AoMHg3MWNjNTYyNiwgMHgzYTk5YTA1NyksIFNUQ1AoMHg3MWI1NGE0MSwgMHgzYWM2NGMwZiksCisgICAgU1RDUCgweDcxOWUyY2QyLCAweDNhZjJlZWI3KSwgU1RDUCgweDcxODZmZGRlLCAweDNiMWY4ODQ4KSwKKyAgICBTVENQKDB4NzE2ZmJkNjgsIDB4M2I0YzE4YmEpLCBTVENQKDB4NzE1ODZiNzQsIDB4M2I3OGEwMDcpLAorICAgIFNUQ1AoMHg3MTQxMDgwNSwgMHgzYmE1MWUyOSksIFNUQ1AoMHg3MTI5OTMxZiwgMHgzYmQxOTMxOCksCisgICAgU1RDUCgweDcxMTIwY2M1LCAweDNiZmRmZWNkKSwgU1RDUCgweDcwZmE3NGZjLCAweDNjMmE2MTQyKSwKKyAgICBTVENQKDB4NzBlMmNiYzYsIDB4M2M1NmJhNzApLCBTVENQKDB4NzBjYjExMjgsIDB4M2M4MzBhNTApLAorICAgIFNUQ1AoMHg3MGIzNDUyNSwgMHgzY2FmNTBkYSksIFNUQ1AoMHg3MDliNjdjMCwgMHgzY2RiOGUwOSksCisgICAgU1RDUCgweDcwODM3OGZmLCAweDNkMDdjMWQ2KSwgU1RDUCgweDcwNmI3OGUzLCAweDNkMzNlYzM5KSwKKyAgICBTVENQKDB4NzA1MzY3NzEsIDB4M2Q2MDBkMmMpLCBTVENQKDB4NzAzYjQ0YWQsIDB4M2Q4YzI0YTgpLAorICAgIFNUQ1AoMHg3MDIzMTA5YSwgMHgzZGI4MzJhNiksIFNUQ1AoMHg3MDBhY2IzYywgMHgzZGU0MzcxZiksCisgICAgU1RDUCgweDZmZjI3NDk3LCAweDNlMTAzMjBkKSwgU1RDUCgweDZmZGEwY2FlLCAweDNlM2MyMzY5KSwKKyAgICBTVENQKDB4NmZjMTkzODUsIDB4M2U2ODBiMmMpLCBTVENQKDB4NmZhOTA5MjEsIDB4M2U5M2U5NTApLAorICAgIFNUQ1AoMHg2ZjkwNmQ4NCwgMHgzZWJmYmRjZCksIFNUQ1AoMHg2Zjc3YzBiMywgMHgzZWViODg5YyksCisgICAgU1RDUCgweDZmNWYwMmIyLCAweDNmMTc0OWI4KSwgU1RDUCgweDZmNDYzMzgzLCAweDNmNDMwMTE5KSwKKyAgICBTVENQKDB4NmYyZDUzMmMsIDB4M2Y2ZWFlYjgpLCBTVENQKDB4NmYxNDYxYjAsIDB4M2Y5YTUyOTApLAorICAgIFNUQ1AoMHg2ZWZiNWYxMiwgMHgzZmM1ZWM5OCksIFNUQ1AoMHg2ZWUyNGI1NywgMHgzZmYxN2NjYSksCisgICAgU1RDUCgweDZlYzkyNjgzLCAweDQwMWQwMzIxKSwgU1RDUCgweDZlYWZmMDk5LCAweDQwNDg3Zjk0KSwKKyAgICBTVENQKDB4NmU5NmE5OWQsIDB4NDA3M2YyMWQpLCBTVENQKDB4NmU3ZDUxOTMsIDB4NDA5ZjVhYjYpLAorICAgIFNUQ1AoMHg2ZTYzZTg3ZiwgMHg0MGNhYjk1OCksIFNUQ1AoMHg2ZTRhNmU2NiwgMHg0MGY2MGRmYiksCisgICAgU1RDUCgweDZlMzBlMzRhLCAweDQxMjE1ODliKSwgU1RDUCgweDZlMTc0NzMwLCAweDQxNGM5OTJmKSwKKyAgICBTVENQKDB4NmRmZDlhMWMsIDB4NDE3N2NmYjEpLCBTVENQKDB4NmRlM2RjMTEsIDB4NDFhMmZjMWEpLAorICAgIFNUQ1AoMHg2ZGNhMGQxNCwgMHg0MWNlMWU2NSksIFNUQ1AoMHg2ZGIwMmQyOSwgMHg0MWY5MzY4OSksCisgICAgU1RDUCgweDZkOTYzYzU0LCAweDQyMjQ0NDgxKSwgU1RDUCgweDZkN2MzYTk4LCAweDQyNGY0ODQ1KSwKKyAgICBTVENQKDB4NmQ2MjI3ZmEsIDB4NDI3YTQxZDApLCBTVENQKDB4NmQ0ODA0N2UsIDB4NDJhNTMxMWIpLAorICAgIFNUQ1AoMHg2ZDJkZDAyNywgMHg0MmQwMTYxZSksIFNUQ1AoMHg2ZDEzOGFmYiwgMHg0MmZhZjBkNCksCisgICAgU1RDUCgweDZjZjkzNGZjLCAweDQzMjVjMTM1KSwgU1RDUCgweDZjZGVjZTJmLCAweDQzNTA4NzNjKSwKKyAgICBTVENQKDB4NmNjNDU2OTgsIDB4NDM3YjQyZTEpLCBTVENQKDB4NmNhOWNlM2IsIDB4NDNhNWY0MWUpLAorICAgIFNUQ1AoMHg2YzhmMzUxYywgMHg0M2QwOWFlZCksIFNUQ1AoMHg2Yzc0OGIzZiwgMHg0M2ZiMzc0NiksCisgICAgU1RDUCgweDZjNTlkMGE5LCAweDQ0MjVjOTIzKSwgU1RDUCgweDZjM2YwNTVkLCAweDQ0NTA1MDdlKSwKKyAgICBTVENQKDB4NmMyNDI5NjAsIDB4NDQ3YWNkNTApLCBTVENQKDB4NmMwOTNjYjYsIDB4NDRhNTNmOTMpLAorICAgIFNUQ1AoMHg2YmVlM2Y2MiwgMHg0NGNmYTc0MCksIFNUQ1AoMHg2YmQzMzE2YSwgMHg0NGZhMDQ1MCksCisgICAgU1RDUCgweDZiYjgxMmQxLCAweDQ1MjQ1NmJkKSwgU1RDUCgweDZiOWNlMzliLCAweDQ1NGU5ZTgwKSwKKyAgICBTVENQKDB4NmI4MWEzY2QsIDB4NDU3OGRiOTMpLCBTVENQKDB4NmI2NjUzNmIsIDB4NDVhMzBkZjApLAorICAgIFNUQ1AoMHg2YjRhZjI3OSwgMHg0NWNkMzU4ZiksIFNUQ1AoMHg2YjJmODBmYiwgMHg0NWY3NTI2YiksCisgICAgU1RDUCgweDZiMTNmZWY1LCAweDQ2MjE2NDdkKSwgU1RDUCgweDZhZjg2YzZjLCAweDQ2NGI2YmJlKSwKKyAgICBTVENQKDB4NmFkY2M5NjQsIDB4NDY3NTY4MjgpLCBTVENQKDB4NmFjMTE1ZTIsIDB4NDY5ZjU5YjQpLAorICAgIFNUQ1AoMHg2YWE1NTFlOSwgMHg0NmM5NDA1YyksIFNUQ1AoMHg2YTg5N2Q3ZCwgMHg0NmYzMWMxYSksCisgICAgU1RDUCgweDZhNmQ5OGE0LCAweDQ3MWNlY2U3KSwgU1RDUCgweDZhNTFhMzYxLCAweDQ3NDZiMmJjKSwKKyAgICBTVENQKDB4NmEzNTlkYjksIDB4NDc3MDZkOTMpLCBTVENQKDB4NmExOTg3YjAsIDB4NDc5YTFkNjcpLAorICAgIFNUQ1AoMHg2OWZkNjE0YSwgMHg0N2MzYzIyZiksIFNUQ1AoMHg2OWUxMmE4YywgMHg0N2VkNWJlNiksCisgICAgU1RDUCgweDY5YzRlMzdhLCAweDQ4MTZlYTg2KSwgU1RDUCgweDY5YTg4YzE5LCAweDQ4NDA2ZTA4KSwKKyAgICBTVENQKDB4Njk4YzI0NmMsIDB4NDg2OWU2NjUpLCBTVENQKDB4Njk2ZmFjNzgsIDB4NDg5MzUzOTcpLAorICAgIFNUQ1AoMHg2OTUzMjQ0MiwgMHg0OGJjYjU5OSksIFNUQ1AoMHg2OTM2OGJjZSwgMHg0OGU2MGM2MiksCisgICAgU1RDUCgweDY5MTllMzIwLCAweDQ5MGY1N2VlKSwgU1RDUCgweDY4ZmQyYTNkLCAweDQ5Mzg5ODM2KSwKKyAgICBTVENQKDB4NjhlMDYxMjksIDB4NDk2MWNkMzMpLCBTVENQKDB4NjhjMzg3ZTksIDB4NDk4YWY2ZGYpLAorICAgIFNUQ1AoMHg2OGE2OWU4MSwgMHg0OWI0MTUzMyksIFNUQ1AoMHg2ODg5YTRmNiwgMHg0OWRkMjgyYSksCisgICAgU1RDUCgweDY4NmM5YjRiLCAweDRhMDYyZmJkKSwgU1RDUCgweDY4NGY4MTg2LCAweDRhMmYyYmU2KSwKKyAgICBTVENQKDB4NjgzMjU3YWIsIDB4NGE1ODFjOWUpLCBTVENQKDB4NjgxNTFkYmUsIDB4NGE4MTAxZGUpLAorICAgIFNUQ1AoMHg2N2Y3ZDNjNSwgMHg0YWE5ZGJhMiksIFNUQ1AoMHg2N2RhNzljMywgMHg0YWQyYTllMiksCisgICAgU1RDUCgweDY3YmQwZmJkLCAweDRhZmI2Yzk4KSwgU1RDUCgweDY3OWY5NWI3LCAweDRiMjQyM2JlKSwKKyAgICBTVENQKDB4Njc4MjBiYjcsIDB4NGI0Y2NmNGQpLCBTVENQKDB4Njc2NDcxYzAsIDB4NGI3NTZmNDApLAorICAgIFNUQ1AoMHg2NzQ2YzdkOCwgMHg0YjllMDM5MCksIFNUQ1AoMHg2NzI5MGUwMiwgMHg0YmM2OGMzNiksCisgICAgU1RDUCgweDY3MGI0NDQ0LCAweDRiZWYwOTJkKSwgU1RDUCgweDY2ZWQ2YWExLCAweDRjMTc3YTZlKSwKKyAgICBTVENQKDB4NjZjZjgxMjAsIDB4NGMzZmRmZjQpLCBTVENQKDB4NjZiMTg3YzMsIDB4NGM2ODM5YjcpLAorICAgIFNUQ1AoMHg2NjkzN2U5MSwgMHg0YzkwODdiMSksIFNUQ1AoMHg2Njc1NjU4YywgMHg0Y2I4YzlkZCksCisgICAgU1RDUCgweDY2NTczY2JiLCAweDRjZTEwMDM0KSwgU1RDUCgweDY2MzkwNDIyLCAweDRkMDkyYWIwKSwKKyAgICBTVENQKDB4NjYxYWJiYzUsIDB4NGQzMTQ5NGIpLCBTVENQKDB4NjVmYzYzYTksIDB4NGQ1OTViZmUpLAorICAgIFNUQ1AoMHg2NWRkZmJkMywgMHg0ZDgxNjJjNCksIFNUQ1AoMHg2NWJmODQ0NywgMHg0ZGE5NWQ5NiksCisgICAgU1RDUCgweDY1YTBmZDBiLCAweDRkZDE0YzZlKSwgU1RDUCgweDY1ODI2NjIyLCAweDRkZjkyZjQ2KSwKKyAgICBTVENQKDB4NjU2M2JmOTIsIDB4NGUyMTA2MTcpLCBTVENQKDB4NjU0NTA5NWYsIDB4NGU0OGQwZGQpLAorICAgIFNUQ1AoMHg2NTI2NDM4ZiwgMHg0ZTcwOGY4ZiksIFNUQ1AoMHg2NTA3NmUyNSwgMHg0ZTk4NDIyOSksCisgICAgU1RDUCgweDY0ZTg4OTI2LCAweDRlYmZlOGE1KSwgU1RDUCgweDY0Yzk5NDk4LCAweDRlZTc4MmZiKSwKKyAgICBTVENQKDB4NjRhYTkwN2YsIDB4NGYwZjExMjYpLCBTVENQKDB4NjQ4YjdjZTAsIDB4NGYzNjkzMjApLAorICAgIFNUQ1AoMHg2NDZjNTliZiwgMHg0ZjVlMDhlMyksIFNUQ1AoMHg2NDRkMjcyMiwgMHg0Zjg1NzI2OSksCisgICAgU1RDUCgweDY0MmRlNTBkLCAweDRmYWNjZmFiKSwgU1RDUCgweDY0MGU5Mzg2LCAweDRmZDQyMGE0KSwKKyAgICBTVENQKDB4NjNlZjMyOTAsIDB4NGZmYjY1NGQpLCBTVENQKDB4NjNjZmMyMzEsIDB4NTAyMjlkYTEpLAorICAgIFNUQ1AoMHg2M2IwNDI2ZCwgMHg1MDQ5Yzk5OSksIFNUQ1AoMHg2MzkwYjM0YSwgMHg1MDcwZTkyZiksCisgICAgU1RDUCgweDYzNzExNGNjLCAweDUwOTdmYzVlKSwgU1RDUCgweDYzNTE2NmY5LCAweDUwYmYwMzFmKSwKKyAgICBTVENQKDB4NjMzMWE5ZDQsIDB4NTBlNWZkNmQpLCBTVENQKDB4NjMxMWRkNjQsIDB4NTEwY2ViNDApLAorICAgIFNUQ1AoMHg2MmYyMDFhYywgMHg1MTMzY2M5NCksIFNUQ1AoMHg2MmQyMTZiMywgMHg1MTVhYTE2MiksCisgICAgU1RDUCgweDYyYjIxYzdiLCAweDUxODE2OWE1KSwgU1RDUCgweDYyOTIxMzBjLCAweDUxYTgyNTU1KSwKKyAgICBTVENQKDB4NjI3MWZhNjksIDB4NTFjZWQ0NmUpLCBTVENQKDB4NjI1MWQyOTgsIDB4NTFmNTc2ZWEpLAorICAgIFNUQ1AoMHg2MjMxOWI5ZCwgMHg1MjFjMGNjMiksIFNUQ1AoMHg2MjExNTU3ZSwgMHg1MjQyOTVmMCksCisgICAgU1RDUCgweDYxZjEwMDNmLCAweDUyNjkxMjZlKSwgU1RDUCgweDYxZDA5YmU1LCAweDUyOGY4MjM4KSwKKyAgICBTVENQKDB4NjFiMDI4NzYsIDB4NTJiNWU1NDYpLCBTVENQKDB4NjE4ZmE1ZjcsIDB4NTJkYzNiOTIpLAorICAgIFNUQ1AoMHg2MTZmMTQ2YywgMHg1MzAyODUxOCksIFNUQ1AoMHg2MTRlNzNkYSwgMHg1MzI4YzFkMCksCisgICAgU1RDUCgweDYxMmRjNDQ3LCAweDUzNGVmMWI1KSwgU1RDUCgweDYxMGQwNWI3LCAweDUzNzUxNGMyKSwKKyAgICBTVENQKDB4NjBlYzM4MzAsIDB4NTM5YjJhZjApLCBTVENQKDB4NjBjYjViYjcsIDB4NTNjMTM0MzkpLAorICAgIFNUQ1AoMHg2MGFhNzA1MCwgMHg1M2U3MzA5NyksIFNUQ1AoMHg2MDg5NzYwMSwgMHg1NDBkMjAwNSksCisgICAgU1RDUCgweDYwNjg2Y2NmLCAweDU0MzMwMjdkKSwgU1RDUCgweDYwNDc1NGJmLCAweDU0NThkN2Y5KSwKKyAgICBTVENQKDB4NjAyNjJkZDYsIDB4NTQ3ZWEwNzMpLCBTVENQKDB4NjAwNGY4MTksIDB4NTRhNDViZTYpLAorICAgIFNUQ1AoMHg1ZmUzYjM4ZCwgMHg1NGNhMGE0YiksIFNUQ1AoMHg1ZmMyNjAzOCwgMHg1NGVmYWI5YyksCisgICAgU1RDUCgweDVmYTBmZTFmLCAweDU1MTUzZmQ0KSwgU1RDUCgweDVmN2Y4ZDQ2LCAweDU1M2FjNmVlKSwKKyAgICBTVENQKDB4NWY1ZTBkYjMsIDB4NTU2MDQwZTIpLCBTVENQKDB4NWYzYzdmNmIsIDB4NTU4NWFkYWQpLAorICAgIFNUQ1AoMHg1ZjFhZTI3NCwgMHg1NWFiMGQ0NiksIFNUQ1AoMHg1ZWY5MzZkMSwgMHg1NWQwNWZhYSksCisgICAgU1RDUCgweDVlZDc3YzhhLCAweDU1ZjVhNGQyKSwgU1RDUCgweDVlYjViM2EyLCAweDU2MWFkY2I5KSwKKyAgICBTVENQKDB4NWU5M2RjMWYsIDB4NTY0MDA3NTgpLCBTVENQKDB4NWU3MWY2MDYsIDB4NTY2NTI0YWEpLAorICAgIFNUQ1AoMHg1ZTUwMDE1ZCwgMHg1NjhhMzRhOSksIFNUQ1AoMHg1ZTJkZmUyOSwgMHg1NmFmMzc1MCksCisgICAgU1RDUCgweDVlMGJlYzZlLCAweDU2ZDQyYzk5KSwgU1RDUCgweDVkZTljYzMzLCAweDU2ZjkxNDdlKSwKKyAgICBTVENQKDB4NWRjNzlkN2MsIDB4NTcxZGVlZmEpLCBTVENQKDB4NWRhNTYwNGYsIDB4NTc0MmJjMDYpLAorICAgIFNUQ1AoMHg1ZDgzMTRiMSwgMHg1NzY3N2I5ZCksIFNUQ1AoMHg1ZDYwYmFhNywgMHg1NzhjMmRiYSksCisgICAgU1RDUCgweDVkM2U1MjM3LCAweDU3YjBkMjU2KSwgU1RDUCgweDVkMWJkYjY1LCAweDU3ZDU2OTZkKSwKKyAgICBTVENQKDB4NWNmOTU2MzgsIDB4NTdmOWYyZjgpLCBTVENQKDB4NWNkNmMyYjUsIDB4NTgxZTZlZjEpLAorICAgIFNUQ1AoMHg1Y2I0MjBlMCwgMHg1ODQyZGQ1NCksIFNUQ1AoMHg1YzkxNzBiZiwgMHg1ODY3M2UxYiksCisgICAgU1RDUCgweDVjNmViMjU4LCAweDU4OGI5MTQwKSwgU1RDUCgweDVjNGJlNWIwLCAweDU4YWZkNmJkKSwKKyAgICBTVENQKDB4NWMyOTBhY2MsIDB4NThkNDBlOGMpLCBTVENQKDB4NWMwNjIxYjIsIDB4NThmODM4YTkpLAorICAgIFNUQ1AoMHg1YmUzMmE2NywgMHg1OTFjNTUwZSksIFNUQ1AoMHg1YmMwMjRmMCwgMHg1OTQwNjNiNSksCisgICAgU1RDUCgweDViOWQxMTU0LCAweDU5NjQ2NDk4KSwgU1RDUCgweDViNzllZjk2LCAweDU5ODg1N2IyKSwKKyAgICBTVENQKDB4NWI1NmJmYmQsIDB4NTlhYzNjZmQpLCBTVENQKDB4NWIzMzgxY2UsIDB4NTlkMDE0NzUpLAorICAgIFNUQ1AoMHg1YjEwMzVjZiwgMHg1OWYzZGUxMiksIFNUQ1AoMHg1YWVjZGJjNSwgMHg1YTE3OTlkMSksCisgICAgU1RDUCgweDVhYzk3M2I1LCAweDVhM2I0N2FiKSwgU1RDUCgweDVhYTVmZGE1LCAweDVhNWVlNzlhKSwKKyAgICBTVENQKDB4NWE4Mjc5OWEsIDB4NWE4Mjc5OWEpLAogfTsKIAogUkFNX0FMSUdOCiBMTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzk2MFtdID0KLXsKLSAgV1RDUCgweDdmZmZmZjllLCAweDAwMDllNmFjKSwgV1RDUCgweDdmZmZmZjJiLCAweDAwMGU5NmQ1KSwgV1RDUCgweDdmZmZmZWE2LCAweDAwMTI5ODdlKSwgV1RDUCgweDdmZmZmZTBlLCAweDAwMTY1MmI2KSwKLSAgV1RDUCgweDdmZmZmZDYwLCAweDAwMTllYmNlKSwgV1RDUCgweDdmZmZmYzljLCAweDAwMWQ3NmJmKSwgV1RDUCgweDdmZmZmYmJmLCAweDAwMjBmZTc5KSwgV1RDUCgweDdmZmZmYWM5LCAweDAwMjQ4OWVmKSwKLSAgV1RDUCgweDdmZmZmOWI3LCAweDAwMjgxZGUyKSwgV1RDUCgweDdmZmZmODg3LCAweDAwMmJiZGJiKSwgV1RDUCgweDdmZmZmNzM3LCAweDAwMmY2YzBkKSwgV1RDUCgweDdmZmZmNWM2LCAweDAwMzMyYWQ4KSwKLSAgV1RDUCgweDdmZmZmNDMxLCAweDAwMzZmYmI5KSwgV1RDUCgweDdmZmZmMjc2LCAweDAwM2FlMDA0KSwgV1RDUCgweDdmZmZmMDkyLCAweDAwM2VkOGQ4KSwgV1RDUCgweDdmZmZlZTg0LCAweDAwNDJlNzJmKSwKLSAgV1RDUCgweDdmZmZlYzQ4LCAweDAwNDcwYmUzKSwgV1RDUCgweDdmZmZlOWRkLCAweDAwNGI0N2I4KSwgV1RDUCgweDdmZmZlNzNmLCAweDAwNGY5YjVmKSwgV1RDUCgweDdmZmZlNDZiLCAweDAwNTQwNzdhKSwKLSAgV1RDUCgweDdmZmZlMTVmLCAweDAwNTg4Y2ExKSwgV1RDUCgweDdmZmZkZTE3LCAweDAwNWQyYjYxKSwgV1RDUCgweDdmZmZkYTkxLCAweDAwNjFlNDQyKSwgV1RDUCgweDdmZmZkNmM5LCAweDAwNjZiN2MyKSwKLSAgV1RDUCgweDdmZmZkMmJiLCAweDAwNmJhNjVjKSwgV1RDUCgweDdmZmZjZTY1LCAweDAwNzBiMDg3KSwgV1RDUCgweDdmZmZjOWMyLCAweDAwNzVkNmI1KSwgV1RDUCgweDdmZmZjNGNmLCAweDAwN2IxOTU1KSwKLSAgV1RDUCgweDdmZmZiZjg3LCAweDAwODA3OGQ1KSwgV1RDUCgweDdmZmZiOWU3LCAweDAwODVmNWEwKSwgV1RDUCgweDdmZmZiM2VhLCAweDAwOGI5MDFkKSwgV1RDUCgweDdmZmZhZDhjLCAweDAwOTE0OGI0KSwKLSAgV1RDUCgweDdmZmZhNmM5LCAweDAwOTcxZmNiKSwgV1RDUCgweDdmZmY5ZjljLCAweDAwOWQxNWM3KSwgV1RDUCgweDdmZmY5ODAwLCAweDAwYTMyYjBiKSwgV1RDUCgweDdmZmY4ZmYwLCAweDAwYTk1ZmY5KSwKLSAgV1RDUCgweDdmZmY4NzY3LCAweDAwYWZiNGY0KSwgV1RDUCgweDdmZmY3ZTVmLCAweDAwYjYyYTVjKSwgV1RDUCgweDdmZmY3NGQ0LCAweDAwYmNjMDkzKSwgV1RDUCgweDdmZmY2YWMwLCAweDAwYzM3N2Y4KSwKLSAgV1RDUCgweDdmZmY2MDFjLCAweDAwY2E1MGViKSwgV1RDUCgweDdmZmY1NGUzLCAweDAwZDE0YmNiKSwgV1RDUCgweDdmZmY0OTBlLCAweDAwZDg2OGY3KSwgV1RDUCgweDdmZmYzYzk4LCAweDAwZGZhOGNlKSwKLSAgV1RDUCgweDdmZmYyZjc5LCAweDAwZTcwYmFkKSwgV1RDUCgweDdmZmYyMWFjLCAweDAwZWU5MWYzKSwgV1RDUCgweDdmZmYxMzI4LCAweDAwZjYzYmZlKSwgV1RDUCgweDdmZmYwM2U3LCAweDAwZmUwYTJjKSwKLSAgV1RDUCgweDdmZmVmM2UxLCAweDAxMDVmY2Q5KSwgV1RDUCgweDdmZmVlMzEwLCAweDAxMGUxNDYyKSwgV1RDUCgweDdmZmVkMTZhLCAweDAxMTY1MTI2KSwgV1RDUCgweDdmZmViZWU5LCAweDAxMWViMzgxKSwKLSAgV1RDUCgweDdmZmVhYjgzLCAweDAxMjczYmQwKSwgV1RDUCgweDdmZmU5NzMxLCAweDAxMmZlYTZmKSwgV1RDUCgweDdmZmU4MWVhLCAweDAxMzhiZmJjKSwgV1RDUCgweDdmZmU2YmE0LCAweDAxNDFiYzEyKSwKLSAgV1RDUCgweDdmZmU1NDU3LCAweDAxNGFkZmNlKSwgV1RDUCgweDdmZmUzYmZhLCAweDAxNTQyYjRkKSwgV1RDUCgweDdmZmUyMjgyLCAweDAxNWQ5ZWU5KSwgV1RDUCgweDdmZmUwN2U2LCAweDAxNjczYjAxKSwKLSAgV1RDUCgweDdmZmRlYzFiLCAweDAxNzBmZmVlKSwgV1RDUCgweDdmZmRjZjE3LCAweDAxN2FlZTBlKSwgV1RDUCgweDdmZmRiMGQwLCAweDAxODUwNWJjKSwgV1RDUCgweDdmZmQ5MTNiLCAweDAxOGY0NzU0KSwKLSAgV1RDUCgweDdmZmQ3MDRiLCAweDAxOTliMzMwKSwgV1RDUCgweDdmZmQ0ZGY3LCAweDAxYTQ0OWFkKSwgV1RDUCgweDdmZmQyYTMxLCAweDAxYWYwYjI1KSwgV1RDUCgweDdmZmQwNGVmLCAweDAxYjlmN2Y0KSwKLSAgV1RDUCgweDdmZmNkZTIzLCAweDAxYzUxMDc0KSwgV1RDUCgweDdmZmNiNWMxLCAweDAxZDA1NTAxKSwgV1RDUCgweDdmZmM4YmJjLCAweDAxZGJjNWY1KSwgV1RDUCgweDdmZmM2MDA2LCAweDAxZTc2M2FiKSwKLSAgV1RDUCgweDdmZmMzMjkzLCAweDAxZjMyZTdkKSwgV1RDUCgweDdmZmMwMzU0LCAweDAxZmYyNmM1KSwgV1RDUCgweDdmZmJkMjNiLCAweDAyMGI0Y2RlKSwgV1RDUCgweDdmZmI5ZjNhLCAweDAyMTdhMTIwKSwKLSAgV1RDUCgweDdmZmI2YTQxLCAweDAyMjQyM2U2KSwgV1RDUCgweDdmZmIzMzQyLCAweDAyMzBkNThhKSwgV1RDUCgweDdmZmFmYTJkLCAweDAyM2RiNjY0KSwgV1RDUCgweDdmZmFiZWYyLCAweDAyNGFjNmNlKSwKLSAgV1RDUCgweDdmZmE4MTgwLCAweDAyNTgwNzIwKSwgV1RDUCgweDdmZmE0MWM5LCAweDAyNjU3N2IzKSwgV1RDUCgweDdmZjlmZmI5LCAweDAyNzMxOGUwKSwgV1RDUCgweDdmZjliYjQxLCAweDAyODBlYWZmKSwKLSAgV1RDUCgweDdmZjk3NDRlLCAweDAyOGVlZTY4KSwgV1RDUCgweDdmZjkyYWNmLCAweDAyOWQyMzcxKSwgV1RDUCgweDdmZjhkZWIxLCAweDAyYWI4YTc0KSwgV1RDUCgweDdmZjg4ZmUyLCAweDAyYmEyM2M3KSwKLSAgV1RDUCgweDdmZjgzZTRkLCAweDAyYzhlZmMwKSwgV1RDUCgweDdmZjdlOWUxLCAweDAyZDdlZWI3KSwgV1RDUCgweDdmZjc5Mjg4LCAweDAyZTcyMTAxKSwgV1RDUCgweDdmZjczODJmLCAweDAyZjY4NmY1KSwKLSAgV1RDUCgweDdmZjZkYWMxLCAweDAzMDYyMGU5KSwgV1RDUCgweDdmZjY3YTI5LCAweDAzMTVlZjMxKSwgV1RDUCgweDdmZjYxNjUxLCAweDAzMjVmMjI0KSwgV1RDUCgweDdmZjVhZjIzLCAweDAzMzYyYTE0KSwKLSAgV1RDUCgweDdmZjU0NDhhLCAweDAzNDY5NzU4KSwgV1RDUCgweDdmZjRkNjZkLCAweDAzNTczYTQyKSwgV1RDUCgweDdmZjQ2NGI3LCAweDAzNjgxMzI3KSwgV1RDUCgweDdmZjNlZjRmLCAweDAzNzkyMjVhKSwKLSAgV1RDUCgweDdmZjM3NjFkLCAweDAzOGE2ODJlKSwgV1RDUCgweDdmZjJmOTBhLCAweDAzOWJlNGY0KSwgV1RDUCgweDdmZjI3N2ZiLCAweDAzYWQ5OTAwKSwgV1RDUCgweDdmZjFmMmQ4LCAweDAzYmY4NGEzKSwKLSAgV1RDUCgweDdmZjE2OTg2LCAweDAzZDFhODJlKSwgV1RDUCgweDdmZjBkYmVjLCAweDAzZTQwM2YzKSwgV1RDUCgweDdmZjA0OWVmLCAweDAzZjY5ODQwKSwgV1RDUCgweDdmZWZiMzczLCAweDA0MDk2NTY4KSwKLSAgV1RDUCgweDdmZWYxODVkLCAweDA0MWM2YmI4KSwgV1RDUCgweDdmZWU3ODkwLCAweDA0MmZhYjgxKSwgV1RDUCgweDdmZWRkM2YxLCAweDA0NDMyNTEwKSwgV1RDUCgweDdmZWQyYTYxLCAweDA0NTZkOGI0KSwKLSAgV1RDUCgweDdmZWM3YmM0LCAweDA0NmFjNmJhKSwgV1RDUCgweDdmZWJjN2ZiLCAweDA0N2VlZjcwKSwgV1RDUCgweDdmZWIwZWU4LCAweDA0OTM1MzIyKSwgV1RDUCgweDdmZWE1MDZiLCAweDA0YTdmMjFkKSwKLSAgV1RDUCgweDdmZTk4YzY1LCAweDA0YmNjY2FiKSwgV1RDUCgweDdmZThjMmI3LCAweDA0ZDFlMzE4KSwgV1RDUCgweDdmZTdmMzNlLCAweDA0ZTczNWFmKSwgV1RDUCgweDdmZTcxZGRiLCAweDA0ZmNjNGJhKSwKLSAgV1RDUCgweDdmZTY0MjZjLCAweDA1MTI5MDgxKSwgV1RDUCgweDdmZTU2MGNlLCAweDA1Mjg5OTRkKSwgV1RDUCgweDdmZTQ3OGRmLCAweDA1M2VkZjY4KSwgV1RDUCgweDdmZTM4YTdjLCAweDA1NTU2MzE4KSwKLSAgV1RDUCgweDdmZTI5NTgxLCAweDA1NmMyNGE1KSwgV1RDUCgweDdmZTE5OWNhLCAweDA1ODMyNDU1KSwgV1RDUCgweDdmZTA5NzMzLCAweDA1OWE2MjZlKSwgV1RDUCgweDdmZGY4ZDk1LCAweDA1YjFkZjM1KSwKLSAgV1RDUCgweDdmZGU3Y2NiLCAweDA1Yzk5YWVmKSwgV1RDUCgweDdmZGQ2NGFmLCAweDA1ZTE5NWUwKSwgV1RDUCgweDdmZGM0NTFhLCAweDA1ZjlkMDRiKSwgV1RDUCgweDdmZGIxZGU0LCAweDA2MTI0YTczKSwKLSAgV1RDUCgweDdmZDllZWU1LCAweDA2MmIwNDk5KSwgV1RDUCgweDdmZDhiN2Y1LCAweDA2NDNmZjAwKSwgV1RDUCgweDdmZDc3OGVjLCAweDA2NWQzOWU3KSwgV1RDUCgweDdmZDYzMTllLCAweDA2NzZiNThmKSwKLSAgV1RDUCgweDdmZDRlMWUyLCAweDA2OTA3MjM3KSwgV1RDUCgweDdmZDM4OThkLCAweDA2YWE3MDFkKSwgV1RDUCgweDdmZDIyODczLCAweDA2YzRhZjgwKSwgV1RDUCgweDdmZDBiZTZhLCAweDA2ZGYzMDljKSwKLSAgV1RDUCgweDdmY2Y0YjQ0LCAweDA2ZjlmM2FkKSwgV1RDUCgweDdmY2RjZWQ0LCAweDA3MTRmOGYwKSwgV1RDUCgweDdmY2M0OGVkLCAweDA3MzA0MDlmKSwgV1RDUCgweDdmY2FiOTYwLCAweDA3NGJjYWY1KSwKLSAgV1RDUCgweDdmYzkxZmZmLCAweDA3Njc5ODJhKSwgV1RDUCgweDdmYzc3YzlhLCAweDA3ODNhODc3KSwgV1RDUCgweDdmYzVjZjAyLCAweDA3OWZmYzE0KSwgV1RDUCgweDdmYzQxNzA1LCAweDA3YmM5MzM4KSwKLSAgV1RDUCgweDdmYzI1NDc0LCAweDA3ZDk2ZTE5KSwgV1RDUCgweDdmYzA4NzFiLCAweDA3ZjY4Y2VkKSwgV1RDUCgweDdmYmVhZWNhLCAweDA4MTNlZmU3KSwgV1RDUCgweDdmYmNjYjRjLCAweDA4MzE5NzNkKSwKLSAgV1RDUCgweDdmYmFkYzcwLCAweDA4NGY4MzIwKSwgV1RDUCgweDdmYjhlMjAwLCAweDA4NmRiM2MzKSwgV1RDUCgweDdmYjZkYmM4LCAweDA4OGMyOTU3KSwgV1RDUCgweDdmYjRjOTkzLCAweDA4YWFlNDBjKSwKLSAgV1RDUCgweDdmYjJhYjJiLCAweDA4YzllNDEyKSwgV1RDUCgweDdmYjA4MDVhLCAweDA4ZTkyOTk3KSwgV1RDUCgweDdmYWU0OGU5LCAweDA5MDhiNGM5KSwgV1RDUCgweDdmYWMwNGEwLCAweDA5Mjg4NWQ2KSwKLSAgV1RDUCgweDdmYTliMzQ3LCAweDA5NDg5Y2U4KSwgV1RDUCgweDdmYTc1NGE2LCAweDA5NjhmYTJjKSwgV1RDUCgweDdmYTRlODg0LCAweDA5ODk5ZGNiKSwgV1RDUCgweDdmYTI2ZWE2LCAweDA5YWE4N2VlKSwKLSAgV1RDUCgweDdmOWZlNmQxLCAweDA5Y2JiOGJlKSwgV1RDUCgweDdmOWQ1MGNjLCAweDA5ZWQzMDYyKSwgV1RDUCgweDdmOWFhYzVhLCAweDBhMGVlZjAwKSwgV1RDUCgweDdmOTdmOTNmLCAweDBhMzBmNGJmKSwKLSAgV1RDUCgweDdmOTUzNzNlLCAweDBhNTM0MWMyKSwgV1RDUCgweDdmOTI2NjFiLCAweDBhNzVkNjJlKSwgV1RDUCgweDdmOGY4NTk2LCAweDBhOThiMjI0KSwgV1RDUCgweDdmOGM5NTcyLCAweDBhYmJkNWM3KSwKLSAgV1RDUCgweDdmODk5NTZmLCAweDBhZGY0MTM3KSwgV1RDUCgweDdmODY4NTRkLCAweDBiMDJmNDk0KSwgV1RDUCgweDdmODM2NGNkLCAweDBiMjZlZmZkKSwgV1RDUCgweDdmODAzM2FlLCAweDBiNGIzMzhmKSwKLSAgV1RDUCgweDdmN2NmMWFlLCAweDBiNmZiZjY3KSwgV1RDUCgweDdmNzk5ZThiLCAweDBiOTQ5M2EwKSwgV1RDUCgweDdmNzYzYTAzLCAweDBiYjliMDU2KSwgV1RDUCgweDdmNzJjM2QyLCAweDBiZGYxNWEyKSwKLSAgV1RDUCgweDdmNmYzYmI1LCAweDBjMDRjMzljKSwgV1RDUCgweDdmNmJhMTY4LCAweDBjMmFiYTVkKSwgV1RDUCgweDdmNjdmNGE2LCAweDBjNTBmOWZhKSwgV1RDUCgweDdmNjQzNTI5LCAweDBjNzc4MjhhKSwKLSAgV1RDUCgweDdmNjA2MmFjLCAweDBjOWU1NDIwKSwgV1RDUCgweDdmNWM3Y2U4LCAweDBjYzU2ZWQxKSwgV1RDUCgweDdmNTg4Mzk3LCAweDBjZWNkMmFlKSwgV1RDUCgweDdmNTQ3NjcwLCAweDBkMTQ3ZmM4KSwKLSAgV1RDUCgweDdmNTA1NTJjLCAweDBkM2M3NjMwKSwgV1RDUCgweDdmNGMxZjgzLCAweDBkNjRiNWY2KSwgV1RDUCgweDdmNDdkNTJhLCAweDBkOGQzZjI2KSwgV1RDUCgweDdmNDM3NWQ5LCAweDBkYjYxMWNlKSwKLSAgV1RDUCgweDdmM2YwMTQ0LCAweDBkZGYyZGZhKSwgV1RDUCgweDdmM2E3NzIzLCAweDBlMDg5M2I0KSwgV1RDUCgweDdmMzVkNzI5LCAweDBlMzI0MzA2KSwgV1RDUCgweDdmMzEyMTBhLCAweDBlNWMzYmY5KSwKLSAgV1RDUCgweDdmMmM1NDdiLCAweDBlODY3ZTk0KSwgV1RDUCgweDdmMjc3MTJlLCAweDBlYjEwYWRkKSwgV1RDUCgweDdmMjI3NmQ4LCAweDBlZGJlMGRhKSwgV1RDUCgweDdmMWQ2NTI5LCAweDBmMDcwMDhlKSwKLSAgV1RDUCgweDdmMTgzYmQzLCAweDBmMzI2OWZjKSwgV1RDUCgweDdmMTJmYTg5LCAweDBmNWUxZDI3KSwgV1RDUCgweDdmMGRhMGZiLCAweDBmOGExYTBlKSwgV1RDUCgweDdmMDgyZWQ4LCAweDBmYjY2MGIxKSwKLSAgV1RDUCgweDdmMDJhM2QyLCAweDBmZTJmMTBmKSwgV1RDUCgweDdlZmNmZjk4LCAweDEwMGZjYjI1KSwgV1RDUCgweDdlZjc0MWQ5LCAweDEwM2NlZWVlKSwgV1RDUCgweDdlZjE2YTQyLCAweDEwNmE1YzY2KSwKLSAgV1RDUCgweDdlZWI3ODg0LCAweDEwOTgxMzg2KSwgV1RDUCgweDdlZTU2YzRhLCAweDEwYzYxNDQ3KSwgV1RDUCgweDdlZGY0NTQzLCAweDEwZjQ1ZWEwKSwgV1RDUCgweDdlZDkwMzFiLCAweDExMjJmMjg4KSwKLSAgV1RDUCgweDdlZDJhNTdmLCAweDExNTFjZmYzKSwgV1RDUCgweDdlY2MyYzFhLCAweDExODBmNmQ1KSwgV1RDUCgweDdlYzU5Njk5LCAweDExYjA2NzIwKSwgV1RDUCgweDdlYmVlNGE2LCAweDExZTAyMGM4KSwKLSAgV1RDUCgweDdlYjgxNWVkLCAweDEyMTAyM2JhKSwgV1RDUCgweDdlYjEyYTE4LCAweDEyNDA2ZmU4KSwgV1RDUCgweDdlYWEyMGQxLCAweDEyNzEwNTNlKSwgV1RDUCgweDdlYTJmOWMyLCAweDEyYTFlM2E5KSwKLSAgV1RDUCgweDdlOWJiNDk0LCAweDEyZDMwYjE1KSwgV1RDUCgweDdlOTQ1MGYwLCAweDEzMDQ3YjZjKSwgV1RDUCgweDdlOGNjZTdmLCAweDEzMzYzNDk3KSwgV1RDUCgweDdlODUyY2U5LCAweDEzNjgzNjdmKSwKLSAgV1RDUCgweDdlN2Q2YmQ2LCAweDEzOWE4MTA5KSwgV1RDUCgweDdlNzU4YWVlLCAweDEzY2QxNDFiKSwgV1RDUCgweDdlNmQ4OWQ5LCAweDEzZmZlZjk5KSwgV1RDUCgweDdlNjU2ODNkLCAweDE0MzMxMzY4KSwKLSAgV1RDUCgweDdlNWQyNWMxLCAweDE0NjY3ZjY3KSwgV1RDUCgweDdlNTRjMjBiLCAweDE0OWEzMzc5KSwgV1RDUCgweDdlNGMzY2MzLCAweDE0Y2UyZjdjKSwgV1RDUCgweDdlNDM5NThlLCAweDE1MDI3MzRmKSwKLSAgV1RDUCgweDdlM2FjYzExLCAweDE1MzZmZWNlKSwgV1RDUCgweDdlMzFkZmYyLCAweDE1NmJkMWQ2KSwgV1RDUCgweDdlMjhkMGQ3LCAweDE1YTBlYzQxKSwgV1RDUCgweDdlMWY5ZTYzLCAweDE1ZDY0ZGU5KSwKLSAgV1RDUCgweDdlMTY0ODNkLCAweDE2MGJmNmE1KSwgV1RDUCgweDdlMGNjZTA4LCAweDE2NDFlNjRjKSwgV1RDUCgweDdlMDMyZjZhLCAweDE2NzgxY2I0KSwgV1RDUCgweDdkZjk2YzA1LCAweDE2YWU5OWIyKSwKLSAgV1RDUCgweDdkZWY4MzdlLCAweDE2ZTU1ZDE4KSwgV1RDUCgweDdkZTU3NTc5LCAweDE3MWM2NmJhKSwgV1RDUCgweDdkZGI0MTlhLCAweDE3NTNiNjY3KSwgV1RDUCgweDdkZDBlNzg0LCAweDE3OGI0YmVmKSwKLSAgV1RDUCgweDdkYzY2NmQ5LCAweDE3YzMyNzIxKSwgV1RDUCgweDdkYmJiZjNlLCAweDE3ZmI0N2NhKSwgV1RDUCgweDdkYjBmMDU2LCAweDE4MzNhZGI1KSwgV1RDUCgweDdkYTVmOWMzLCAweDE4NmM1OGFlKSwKLSAgV1RDUCgweDdkOWFkYjI5LCAweDE4YTU0ODdkKSwgV1RDUCgweDdkOGY5NDI5LCAweDE4ZGU3Y2VjKSwgV1RDUCgweDdkODQyNDY3LCAweDE5MTdmNWMxKSwgV1RDUCgweDdkNzg4Yjg2LCAweDE5NTFiMmMyKSwKLSAgV1RDUCgweDdkNmNjOTI3LCAweDE5OGJiM2I0KSwgV1RDUCgweDdkNjBkY2VkLCAweDE5YzVmODVhKSwgV1RDUCgweDdkNTRjNjdjLCAweDFhMDA4MDc3KSwgV1RDUCgweDdkNDg4NTc0LCAweDFhM2I0YmNiKSwKLSAgV1RDUCgweDdkM2MxOTc5LCAweDFhNzY1YTE3KSwgV1RDUCgweDdkMmY4MjJkLCAweDFhYjFhYjE4KSwgV1RDUCgweDdkMjJiZjMyLCAweDFhZWQzZThkKSwgV1RDUCgweDdkMTVkMDJiLCAweDFiMjkxNDMyKSwKLSAgV1RDUCgweDdkMDhiNGJhLCAweDFiNjUyYmMxKSwgV1RDUCgweDdjZmI2YzgyLCAweDFiYTE4NGY1KSwgV1RDUCgweDdjZWRmNzI1LCAweDFiZGUxZjg2KSwgV1RDUCgweDdjZTA1NDQ1LCAweDFjMWFmYjJjKSwKLSAgV1RDUCgweDdjZDI4Mzg2LCAweDFjNTgxNzljKSwgV1RDUCgweDdjYzQ4NDg5LCAweDFjOTU3NDhkKSwgV1RDUCgweDdjYjY1NmYzLCAweDFjZDMxMWIxKSwgV1RDUCgweDdjYTdmYTY1LCAweDFkMTBlZWJkKSwKLSAgV1RDUCgweDdjOTk2ZTgzLCAweDFkNGYwYjYwKSwgV1RDUCgweDdjOGFiMmYwLCAweDFkOGQ2NzRjKSwgV1RDUCgweDdjN2JjNzRmLCAweDFkY2MwMjMwKSwgV1RDUCgweDdjNmNhYjQ0LCAweDFlMGFkYmJiKSwKLSAgV1RDUCgweDdjNWQ1ZTcxLCAweDFlNDlmMzk4KSwgV1RDUCgweDdjNGRlMDdjLCAweDFlODk0OTczKSwgV1RDUCgweDdjM2UzMTA4LCAweDFlYzhkY2Y4KSwgV1RDUCgweDdjMmU0ZmI5LCAweDFmMDhhZGQwKSwKLSAgV1RDUCgweDdjMWUzYzM0LCAweDFmNDhiYmEzKSwgV1RDUCgweDdjMGRmNjFkLCAweDFmODkwNjE4KSwgV1RDUCgweDdiZmQ3ZDE4LCAweDFmYzk4Y2Q2KSwgV1RDUCgweDdiZWNkMGNjLCAweDIwMGE0ZjgwKSwKLSAgV1RDUCgweDdiZGJmMGRkLCAweDIwNGI0ZGJjKSwgV1RDUCgweDdiY2FkY2YxLCAweDIwOGM4NzJjKSwgV1RDUCgweDdiYjk5NGFlLCAweDIwY2RmYjcxKSwgV1RDUCgweDdiYTgxN2I5LCAweDIxMGZhYTJjKSwKLSAgV1RDUCgweDdiOTY2NWJiLCAweDIxNTE5MmZjKSwgV1RDUCgweDdiODQ3ZTU4LCAweDIxOTNiNTdmKSwgV1RDUCgweDdiNzI2MTM5LCAweDIxZDYxMTUzKSwgV1RDUCgweDdiNjAwZTA1LCAweDIyMThhNjE0KSwKLSAgV1RDUCgweDdiNGQ4NDYzLCAweDIyNWI3MzVkKSwgV1RDUCgweDdiM2FjM2ZjLCAweDIyOWU3OGM3KSwgV1RDUCgweDdiMjdjYzc5LCAweDIyZTFiNWViKSwgV1RDUCgweDdiMTQ5ZDgyLCAweDIzMjUyYTYyKSwKLSAgV1RDUCgweDdiMDEzNmMxLCAweDIzNjhkNWMyKSwgV1RDUCgweDdhZWQ5N2RmLCAweDIzYWNiN2EwKSwgV1RDUCgweDdhZDljMDg3LCAweDIzZjBjZjkyKSwgV1RDUCgweDdhYzViMDYzLCAweDI0MzUxZDJhKSwKLSAgV1RDUCgweDdhYjE2NzFlLCAweDI0Nzk5ZmZjKSwgV1RDUCgweDdhOWNlNDY0LCAweDI0YmU1Nzk5KSwgV1RDUCgweDdhODgyN2UxLCAweDI1MDM0MzkxKSwgV1RDUCgweDdhNzMzMTQyLCAweDI1NDg2Mzc1KSwKLSAgV1RDUCgweDdhNWUwMDMzLCAweDI1OGRiNmQyKSwgV1RDUCgweDdhNDg5NDYxLCAweDI1ZDMzZDM1KSwgV1RDUCgweDdhMzJlZDdjLCAweDI2MThmNjJjKSwgV1RDUCgweDdhMWQwYjMxLCAweDI2NWVlMTQzKSwKLSAgV1RDUCgweDdhMDZlZDJmLCAweDI2YTRmZTAyKSwgV1RDUCgweDc5ZjA5MzI3LCAweDI2ZWI0YmY1KSwgV1RDUCgweDc5ZDlmY2M4LCAweDI3MzFjYWEzKSwgV1RDUCgweDc5YzMyOWMyLCAweDI3Nzg3OTk1KSwKLSAgV1RDUCgweDc5YWMxOWM5LCAweDI3YmY1ODUwKSwgV1RDUCgweDc5OTRjYzhkLCAweDI4MDY2NjVjKSwgV1RDUCgweDc5N2Q0MWMxLCAweDI4NGRhMzNjKSwgV1RDUCgweDc5NjU3OTE4LCAweDI4OTUwZTc0KSwKLSAgV1RDUCgweDc5NGQ3MjQ3LCAweDI4ZGNhNzg4KSwgV1RDUCgweDc5MzUyZDAxLCAweDI5MjQ2ZGZhKSwgV1RDUCgweDc5MWNhOGZjLCAweDI5NmM2MTRhKSwgV1RDUCgweDc5MDNlNWVlLCAweDI5YjQ4MGY5KSwKLSAgV1RDUCgweDc4ZWFlMzhkLCAweDI5ZmNjYzg3KSwgV1RDUCgweDc4ZDFhMTkxLCAweDJhNDU0MzcyKSwgV1RDUCgweDc4YjgxZmIxLCAweDJhOGRlNTM3KSwgV1RDUCgweDc4OWU1ZGE2LCAweDJhZDZiMTU1KSwKLSAgV1RDUCgweDc4ODQ1YjI5LCAweDJiMWZhNzQ1KSwgV1RDUCgweDc4NmExN2Y1LCAweDJiNjhjNjg0KSwgV1RDUCgweDc4NGY5M2M0LCAweDJiYjIwZThjKSwgV1RDUCgweDc4MzRjZTUzLCAweDJiZmI3ZWQ3KSwKLSAgV1RDUCgweDc4MTljNzVjLCAweDJjNDUxNmRjKSwgV1RDUCgweDc3ZmU3ZTllLCAweDJjOGVkNjE1KSwgV1RDUCgweDc3ZTJmM2Q3LCAweDJjZDhiYmY3KSwgV1RDUCgweDc3YzcyNmM1LCAweDJkMjJjN2ZhKSwKLSAgV1RDUCgweDc3YWIxNzI4LCAweDJkNmNmOTkzKSwgV1RDUCgweDc3OGVjNGMwLCAweDJkYjc1MDM3KSwgV1RDUCgweDc3NzIyZjRlLCAweDJlMDFjYjU5KSwgV1RDUCgweDc3NTU1Njk1LCAweDJlNGM2YTZkKSwKLSAgV1RDUCgweDc3MzgzYTU4LCAweDJlOTcyY2U2KSwgV1RDUCgweDc3MWFkYTVhLCAweDJlZTIxMjM1KSwgV1RDUCgweDc2ZmQzNjYwLCAweDJmMmQxOWNjKSwgV1RDUCgweDc2ZGY0ZTMwLCAweDJmNzg0MzFhKSwKLSAgV1RDUCgweDc2YzEyMTkwLCAweDJmYzM4ZDkxKSwgV1RDUCgweDc2YTJiMDQ3LCAweDMwMGVmODlkKSwgV1RDUCgweDc2ODNmYTFlLCAweDMwNWE4M2FmKSwgV1RDUCgweDc2NjRmZWRlLCAweDMwYTYyZTM0KSwKLSAgV1RDUCgweDc2NDViZTUxLCAweDMwZjFmNzk4KSwgV1RDUCgweDc2MjYzODQyLCAweDMxM2RkZjQ5KSwgV1RDUCgweDc2MDY2YzdlLCAweDMxODllNGIxKSwgV1RDUCgweDc1ZTY1YWQxLCAweDMxZDYwNzNkKSwKLSAgV1RDUCgweDc1YzYwMzA5LCAweDMyMjI0NjU3KSwgV1RDUCgweDc1YTU2NGY2LCAweDMyNmVhMTY4KSwgV1RDUCgweDc1ODQ4MDY3LCAweDMyYmIxN2RhKSwgV1RDUCgweDc1NjM1NTJkLCAweDMzMDdhOTE3KSwKLSAgV1RDUCgweDc1NDFlMzFhLCAweDMzNTQ1NDg2KSwgV1RDUCgweDc1MjAyYTAyLCAweDMzYTExOThlKSwgV1RDUCgweDc0ZmUyOWI4LCAweDMzZWRmNzk4KSwgV1RDUCgweDc0ZGJlMjExLCAweDM0M2FlZTA5KSwKLSAgV1RDUCgweDc0Yjk1MmUzLCAweDM0ODdmYzQ4KSwgV1RDUCgweDc0OTY3YzA2LCAweDM0ZDUyMWJiKSwgV1RDUCgweDc0NzM1ZDUxLCAweDM1MjI1ZGM3KSwgV1RDUCgweDc0NGZmNjlmLCAweDM1NmZhZmNmKSwKLSAgV1RDUCgweDc0MmM0N2M5LCAweDM1YmQxNzNhKSwgV1RDUCgweDc0MDg1MGFiLCAweDM2MGE5MzY5KSwgV1RDUCgweDczZTQxMTIxLCAweDM2NTgyM2MxKSwgV1RDUCgweDczYmY4OTA5LCAweDM2YTVjN2E0KSwKLSAgV1RDUCgweDczOWFiODQyLCAweDM2ZjM3ZTc1KSwgV1RDUCgweDczNzU5ZWFiLCAweDM3NDE0Nzk2KSwgV1RDUCgweDczNTAzYzI2LCAweDM3OGYyMjY4KSwgV1RDUCgweDczMmE5MDk1LCAweDM3ZGQwZTRjKSwKLSAgV1RDUCgweDczMDQ5YmRhLCAweDM4MmIwYWE0KSwgV1RDUCgweDcyZGU1ZGRiLCAweDM4NzkxNmQwKSwgV1RDUCgweDcyYjdkNjdkLCAweDM4YzczMjMwKSwgV1RDUCgweDcyOTEwNWE2LCAweDM5MTU1YzI0KSwKLSAgV1RDUCgweDcyNjllYjNmLCAweDM5NjM5NDBjKSwgV1RDUCgweDcyNDI4NzMwLCAweDM5YjFkOTQ2KSwgV1RDUCgweDcyMWFkOTY0LCAweDNhMDAyYjMxKSwgV1RDUCgweDcxZjJlMWM1LCAweDNhNGU4OTJjKSwKLSAgV1RDUCgweDcxY2FhMDQyLCAweDNhOWNmMjk2KSwgV1RDUCgweDcxYTIxNGM3LCAweDNhZWI2NmNjKSwgV1RDUCgweDcxNzkzZjQzLCAweDNiMzllNTJjKSwgV1RDUCgweDcxNTAxZmE2LCAweDNiODg2ZDE0KSwKLSAgV1RDUCgweDcxMjZiNWUzLCAweDNiZDZmZGUxKSwgV1RDUCgweDcwZmQwMWViLCAweDNjMjU5NmYxKSwgV1RDUCgweDcwZDMwM2IyLCAweDNjNzQzNzlmKSwgV1RDUCgweDcwYThiYjJlLCAweDNjYzJkZjQ5KSwKLSAgV1RDUCgweDcwN2UyODU1LCAweDNkMTE4ZDRjKSwgV1RDUCgweDcwNTM0YjFlLCAweDNkNjA0MTAzKSwgV1RDUCgweDcwMjgyMzgxLCAweDNkYWVmOWNjKSwgV1RDUCgweDZmZmNiMTdhLCAweDNkZmRiNzAyKSwKLSAgV1RDUCgweDZmZDBmNTA0LCAweDNlNGM3ODAwKSwgV1RDUCgweDZmYTRlZTFhLCAweDNlOWIzYzI1KSwgV1RDUCgweDZmNzg5Y2JiLCAweDNlZWEwMmNhKSwgV1RDUCgweDZmNGMwMGU1LCAweDNmMzhjYjRiKSwKLSAgV1RDUCgweDZmMWYxYTlhLCAweDNmODc5NTA1KSwgV1RDUCgweDZlZjFlOWRhLCAweDNmZDY1ZjUzKSwgV1RDUCgweDZlYzQ2ZWE5LCAweDQwMjUyOTkwKSwgV1RDUCgweDZlOTZhOTBiLCAweDQwNzNmMzE4KSwKLSAgV1RDUCgweDZlNjg5OTA1LCAweDQwYzJiYjQ2KSwgV1RDUCgweDZlM2EzZTlkLCAweDQxMTE4MTc2KSwgV1RDUCgweDZlMGI5OWRkLCAweDQxNjA0NTA0KSwgV1RDUCgweDZkZGNhYWNjLCAweDQxYWYwNTRhKSwKLSAgV1RDUCgweDZkYWQ3MTc3LCAweDQxZmRjMWE1KSwgV1RDUCgweDZkN2RlZGU4LCAweDQyNGM3OTcwKSwgV1RDUCgweDZkNGUyMDJlLCAweDQyOWIyYzA2KSwgV1RDUCgweDZkMWUwODU1LCAweDQyZTlkOGM0KSwKLSAgV1RDUCgweDZjZWRhNjZmLCAweDQzMzg3ZjA1KSwgV1RDUCgweDZjYmNmYThkLCAweDQzODcxZTI2KSwgV1RDUCgweDZjOGMwNGMwLCAweDQzZDViNTgxKSwgV1RDUCgweDZjNWFjNTFkLCAweDQ0MjQ0NDc0KSwKLSAgV1RDUCgweDZjMjkzYmI4LCAweDQ0NzJjYTVhKSwgV1RDUCgweDZiZjc2OGE4LCAweDQ0YzE0NjkwKSwgV1RDUCgweDZiYzU0YzA2LCAweDQ1MGZiODczKSwgV1RDUCgweDZiOTJlNWU5LCAweDQ1NWUxZjVmKSwKLSAgV1RDUCgweDZiNjAzNjZjLCAweDQ1YWM3YWIyKSwgV1RDUCgweDZiMmQzZGFiLCAweDQ1ZmFjOWM4KSwgV1RDUCgweDZhZjlmYmMyLCAweDQ2NDkwYmZmKSwgV1RDUCgweDZhYzY3MGQxLCAweDQ2OTc0MGI1KSwKLSAgV1RDUCgweDZhOTI5Y2Y2LCAweDQ2ZTU2NzQ3KSwgV1RDUCgweDZhNWU4MDUzLCAweDQ3MzM3ZjEzKSwgV1RDUCgweDZhMmExYjBhLCAweDQ3ODE4Nzc5KSwgV1RDUCgweDY5ZjU2ZDNlLCAweDQ3Y2Y3ZmQ2KSwKLSAgV1RDUCgweDY5YzA3NzE1LCAweDQ4MWQ2NzhhKSwgV1RDUCgweDY5OGIzOGI0LCAweDQ4NmIzZGYzKSwgV1RDUCgweDY5NTViMjQzLCAweDQ4YjkwMjcyKSwgV1RDUCgweDY5MWZlM2VjLCAweDQ5MDZiNDY2KSwKLSAgV1RDUCgweDY4ZTljZGQ4LCAweDQ5NTQ1MzMwKSwgV1RDUCgweDY4YjM3MDMzLCAweDQ5YTFkZTMwKSwgV1RDUCgweDY4N2NjYjI5LCAweDQ5ZWY1NGM4KSwgV1RDUCgweDY4NDVkZWU5LCAweDRhM2NiNjU3KSwKLSAgV1RDUCgweDY4MGVhYmEzLCAweDRhOGEwMjQyKSwgV1RDUCgweDY3ZDczMTg3LCAweDRhZDczN2U5KSwgV1RDUCgweDY3OWY3MGM3LCAweDRiMjQ1NmFmKSwgV1RDUCgweDY3Njc2OTk3LCAweDRiNzE1ZGY3KSwKLSAgV1RDUCgweDY3MmYxYzJiLCAweDRiYmU0ZDI1KSwgV1RDUCgweDY2ZjY4OGJhLCAweDRjMGIyMzljKSwgV1RDUCgweDY2YmRhZjdiLCAweDRjNTdlMGMyKSwgV1RDUCgweDY2ODQ5MGE2LCAweDRjYTQ4M2ZhKSwKLSAgV1RDUCgweDY2NGIyYzc2LCAweDRjZjEwY2FjKSwgV1RDUCgweDY2MTE4MzI2LCAweDRkM2Q3YTNiKSwgV1RDUCgweDY1ZDc5NGYzLCAweDRkODljYzBmKSwgV1RDUCgweDY1OWQ2MjFhLCAweDRkZDYwMThmKSwKLSAgV1RDUCgweDY1NjJlYWRhLCAweDRlMjIxYTIyKSwgV1RDUCgweDY1MjgyZjc0LCAweDRlNmUxNTMwKSwgV1RDUCgweDY0ZWQzMDJiLCAweDRlYjlmMjIyKSwgV1RDUCgweDY0YjFlZDQwLCAweDRmMDViMDYxKSwKLSAgV1RDUCgweDY0NzY2NmY4LCAweDRmNTE0ZjU3KSwgV1RDUCgweDY0M2E5ZDk5LCAweDRmOWNjZTZmKSwgV1RDUCgweDYzZmU5MTZhLCAweDRmZTgyZDEzKSwgV1RDUCgweDYzYzI0MmIyLCAweDUwMzM2YWFmKSwKLSAgV1RDUCgweDYzODViMWJjLCAweDUwN2U4NmIwKSwgV1RDUCgweDYzNDhkZWQxLCAweDUwYzk4MDgyKSwgV1RDUCgweDYzMGJjYTNmLCAweDUxMTQ1NzkzKSwgV1RDUCgweDYyY2U3NDUxLCAweDUxNWYwYjUxKSwKLSAgV1RDUCgweDYyOTBkZDU3LCAweDUxYTk5YjJiKSwgV1RDUCgweDYyNTMwNWEwLCAweDUxZjQwNjkyKSwgV1RDUCgweDYyMTRlZDdkLCAweDUyM2U0Y2Y1KSwgV1RDUCgweDYxZDY5NTQxLCAweDUyODg2ZGM1KSwKLSAgV1RDUCgweDYxOTdmZDNlLCAweDUyZDI2ODc1KSwgV1RDUCgweDYxNTkyNWM5LCAweDUzMWMzYzc3KSwgV1RDUCgweDYxMWEwZjM5LCAweDUzNjVlOTNlKSwgV1RDUCgweDYwZGFiOWUzLCAweDUzYWY2ZTNlKSwKLSAgV1RDUCgweDYwOWIyNjIxLCAweDUzZjhjYWVkKSwgV1RDUCgweDYwNWI1NDRjLCAweDU0NDFmZWMwKSwgV1RDUCgweDYwMWI0NGJmLCAweDU0OGIwOTJlKSwgV1RDUCgweDVmZGFmN2Q1LCAweDU0ZDNlOWFlKSwKLSAgV1RDUCgweDVmOWE2ZGViLCAweDU1MWM5ZmI3KSwgV1RDUCgweDVmNTlhNzYxLCAweDU1NjUyYWMzKSwgV1RDUCgweDVmMThhNDk0LCAweDU1YWQ4YTRkKSwgV1RDUCgweDVlZDc2NWU2LCAweDU1ZjViZGNkKSwKLSAgV1RDUCgweDVlOTVlYmI4LCAweDU2M2RjNGMxKSwgV1RDUCgweDVlNTQzNjZkLCAweDU2ODU5ZWEzKSwgV1RDUCgweDVlMTI0NjZhLCAweDU2Y2Q0YWYzKSwgV1RDUCgweDVkZDAxYzEzLCAweDU3MTRjOTJkKSwKLSAgV1RDUCgweDVkOGRiN2NmLCAweDU3NWMxOGQwKSwgV1RDUCgweDVkNGIxYTA1LCAweDU3YTMzOTVlKSwgV1RDUCgweDVkMDg0MzFlLCAweDU3ZWEyYTU2KSwgV1RDUCgweDVjYzUzMzg0LCAweDU4MzBlYjNhKSwKLSAgV1RDUCgweDVjODFlYmEwLCAweDU4Nzc3YjhlKSwgV1RDUCgweDVjM2U2YmRmLCAweDU4YmRkYWQ1KSwgV1RDUCgweDViZmFiNGFmLCAweDU5MDQwODkzKSwgV1RDUCgweDViYjZjNjdjLCAweDU5NGEwNDRmKSwKLSAgV1RDUCgweDViNzJhMWI2LCAweDU5OGZjZDhlKSwgV1RDUCgweDViMmU0NmNlLCAweDU5ZDU2M2Q5KSwgV1RDUCgweDVhZTliNjM0LCAweDVhMWFjNmI4KSwgV1RDUCgweDVhYTRmMDVhLCAweDVhNWZmNWI1KSwKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw2W10gPSB7CisgICAgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweGMwMDAwMDAwKSwKIH07CiAKIFJBTV9BTElHTgogTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1jb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTIwW10gPQotewotICBXVENQKDB4N2ZmZjRjNTQsIDB4MDBkNjc2ZWIpLCBXVENQKDB4N2ZmOWFmMDQsIDB4MDI4MzViNWEpLCBXVENQKDB4N2ZlZTc0YTIsIDB4MDQzMDIzOGYpLCBXVENQKDB4N2ZkZDlkYWQsIDB4MDVkY2JjYmUpLAotICBXVENQKDB4N2ZjNzJhZTIsIDB4MDc4OTE0MTgpLCBXVENQKDB4N2ZhYjFkM2QsIDB4MDkzNTE2ZDQpLCBXVENQKDB4N2Y4OTc1ZjksIDB4MGFlMGIyMmMpLCBXVENQKDB4N2Y2MjM2OGYsIDB4MGM4YmQzNWUpLAotICBXVENQKDB4N2YzNTYwYjksIDB4MGUzNjY3YWQpLCBXVENQKDB4N2YwMmY2NmYsIDB4MGZlMDVjNjQpLCBXVENQKDB4N2VjYWY5ZTUsIDB4MTE4OTllZDMpLCBXVENQKDB4N2U4ZDZkOTEsIDB4MTMzMjFjNTMpLAotICBXVENQKDB4N2U0YTU0MjYsIDB4MTRkOWMyNDUpLCBXVENQKDB4N2UwMWIwOTYsIDB4MTY4MDdlMTUpLCBXVENQKDB4N2RiMzg2MGYsIDB4MTgyNjNkMzYpLCBXVENQKDB4N2Q1ZmQ4MDEsIDB4MTljYWVkMjkpLAotICBXVENQKDB4N2QwNmFhMTYsIDB4MWI2ZTdiN2EpLCBXVENQKDB4N2NhODAwMzgsIDB4MWQxMGQ1YzIpLCBXVENQKDB4N2M0M2RlOGUsIDB4MWViMWU5YTcpLCBXVENQKDB4N2JkYTQ5N2QsIDB4MjA1MWE0ZGQpLAotICBXVENQKDB4N2I2YjQ1YTUsIDB4MjFlZmY1MjgpLCBXVENQKDB4N2FmNmQ3ZTYsIDB4MjM4Y2M4NWQpLCBXVENQKDB4N2E3ZDA1NWIsIDB4MjUyODBjNWUpLCBXVENQKDB4NzlmZGQzNWMsIDB4MjZjMWFmMjIpLAotICBXVENQKDB4Nzk3OTQ3N2QsIDB4Mjg1OTllYjApLCBXVENQKDB4NzhlZjY3OGYsIDB4MjllZmM5MjUpLCBXVENQKDB4Nzg2MDM5OWUsIDB4MmI4NDFjYWYpLCBXVENQKDB4NzdjYmMzZjIsIDB4MmQxNjg3OTIpLAotICBXVENQKDB4NzczMjBkMGQsIDB4MmVhNmY4MjcpLCBXVENQKDB4NzY5MzFiYWUsIDB4MzAzNTVjZGQpLCBXVENQKDB4NzVlZWY2Y2UsIDB4MzFjMWE0M2IpLCBXVENQKDB4NzU0NWE1YTAsIDB4MzM0YmJjZGUpLAotICBXVENQKDB4NzQ5NzJmOTIsIDB4MzRkMzk1N2UpLCBXVENQKDB4NzNlMzljNDksIDB4MzY1OTFjZWEpLCBXVENQKDB4NzMyYWYzYTcsIDB4MzdkYzQyMGMpLCBXVENQKDB4NzI2ZDNkYzYsIDB4Mzk1Y2YzZTkpLAotICBXVENQKDB4NzFhYTgyZjcsIDB4M2FkYjIxYTEpLCBXVENQKDB4NzBlMmNiYzYsIDB4M2M1NmJhNzApLCBXVENQKDB4NzAxNjIwZjUsIDB4M2RjZmFkYjApLCBXVENQKDB4NmY0NDhiN2UsIDB4M2Y0NWVhZDgpLAotICBXVENQKDB4NmU2ZTE0OTIsIDB4NDBiOTYxN2QpLCBXVENQKDB4NmQ5MmM1OWIsIDB4NDIyYTAxNTQpLCBXVENQKDB4NmNiMmE4MzcsIDB4NDM5N2JhMzIpLCBXVENQKDB4NmJjZGM2MzksIDB4NDUwMjdjMGMpLAotICBXVENQKDB4NmFlNDI5YWUsIDB4NDY2YTM2ZjkpLCBXVENQKDB4NjlmNWRjZDMsIDB4NDdjZWRiMzEpLCBXVENQKDB4NjkwMmVhMWQsIDB4NDkzMDU5MGYpLCBXVENQKDB4NjgwYjVjMzMsIDB4NGE4ZWExMTEpLAotICBXVENQKDB4NjcwZjNkZjMsIDB4NGJlOWEzZGIpLCBXVENQKDB4NjYwZTlhNmEsIDB4NGQ0MTUyMzQpLCBXVENQKDB4NjUwOTdjZGIsIDB4NGU5NTlkMDgpLCBXVENQKDB4NjNmZmYwYmEsIDB4NGZlNjc1NmEpLAotICBXVENQKDB4NjJmMjAxYWMsIDB4NTEzM2NjOTQpLCBXVENQKDB4NjFkZmJiOGEsIDB4NTI3ZDkzZTYpLCBXVENQKDB4NjBjOTJhNWEsIDB4NTNjM2JjZWEpLCBXVENQKDB4NWZhZTVhNTUsIDB4NTUwNjM5NTEpLAotICBXVENQKDB4NWU4ZjU3ZTIsIDB4NTY0NGZhZjQpLCBXVENQKDB4NWQ2YzJmOTksIDB4NTc3ZmYzZGEpLCBXVENQKDB4NWM0NGVlNDAsIDB4NThiNzE2MzIpLCBXVENQKDB4NWIxOWEwYzgsIDB4NTllYTU0NTQpLAorY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzZbXSA9IHsKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksCisgICAgU1RDKDB4NmVkOWViYTEpLAogfTsKIAogUkFNX0FMSUdOCiBMTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzEyMFtdID0KLXsKLSAgV1RDUCgweDdmZmZmZmZlLCAweDAwMDE3YjZmKSwgV1RDUCgweDdmZmZmZmVmLCAweDAwMDQyZDJmKSwgV1RDUCgweDdmZmZmZmJiLCAweDAwMDg0OWQwKSwgV1RDUCgweDdmZmZmZjM2LCAweDAwMGUzNDk0KSwKLSAgV1RDUCgweDdmZmZmZTBjLCAweDAwMTY1ZWZkKSwgV1RDUCgweDdmZmZmYmFjLCAweDAwMjE0OWJlKSwgV1RDUCgweDdmZmZmNzJlLCAweDAwMmY4NTRjKSwgV1RDUCgweDdmZmZlZjI0LCAweDAwNDFiMjM1KSwKLSAgV1RDUCgweDdmZmZlMTY3LCAweDAwNTg4MTRmKSwgV1RDUCgweDdmZmZjYWNkLCAweDAwNzRiM2FmKSwgV1RDUCgweDdmZmZhNmQwLCAweDAwOTcxYTY3KSwgV1RDUCgweDdmZmY2ZjFlLCAweDAwYzA5NjBlKSwKLSAgV1RDUCgweDdmZmYxYjEyLCAweDAwZjIxNjAyKSwgV1RDUCgweDdmZmU5ZjBiLCAweDAxMmM5Nzc1KSwgV1RDUCgweDdmZmRlYmIyLCAweDAxNzEyNDI4KSwgV1RDUCgweDdmZmNlZDFiLCAweDAxYzBkMGY3KSwKLSAgV1RDUCgweDdmZmI4OWMyLCAweDAyMWNiYzEyKSwgV1RDUCgweDdmZjlhMTdjLCAweDAyODYwYjA1KSwgV1RDUCgweDdmZjcwYzM5LCAweDAyZmRlODc1KSwgV1RDUCgweDdmZjM5OGJjLCAweDAzODU4MWIzKSwKLSAgV1RDUCgweDdmZWYwYjNiLCAweDA0MWUwNDBjKSwgV1RDUCgweDdmZTkxYmYzLCAweDA0Yzg5OWY0KSwgV1RDUCgweDdmZTE3NWJhLCAweDA1ODY2ODAzKSwgV1RDUCgweDdmZDdiNDkzLCAweDA2NTg4OWQ1KSwKLSAgV1RDUCgweDdmY2I2NDU5LCAweDA3NDAwZWQ0KSwgV1RDUCgweDdmYmJmZjgyLCAweDA4M2RmNmU5KSwgV1RDUCgweDdmYThlZTA5LCAweDA5NTMyZjM3KSwgV1RDUCgweDdmOTE4NDlhLCAweDBhODA4ZWQxKSwKLSAgV1RDUCgweDdmNzUwM2YyLCAweDBiYzZkMzgxKSwgV1RDUCgweDdmNTI5ODlhLCAweDBkMjY5ZWIwKSwgV1RDUCgweDdmMjk1YWY0LCAweDBlYTA3MjcwKSwgV1RDUCgweDdlZjg0ZmI2LCAweDEwMzRhZWI2KSwKLSAgV1RDUCgweDdlYmU2OGM1LCAweDExZTM4ZWQyKSwgV1RDUCgweDdlN2E4Njg2LCAweDEzYWQyNzMzKSwgV1RDUCgweDdlMmI3OWEzLCAweDE1OTE2MzZkKSwgV1RDUCgweDdkZDAwNTNjLCAweDE3OTAwNGE3KSwKLSAgV1RDUCgweDdkNjZlMThiLCAweDE5YThhMDVmKSwgV1RDUCgweDdjZWViZWYwLCAweDFiZGE5ZmEyKSwgV1RDUCgweDdjNjY0OTUzLCAweDFlMjUzZWExKSwgV1RDUCgweDdiY2MyYmU4LCAweDIwODc4Y2NlKSwKLSAgV1RDUCgweDdiMWYxNTI2LCAweDIzMDA2ZDVkKSwgV1RDUCgweDdhNWRiYjAxLCAweDI1OGU5ODQ4KSwgV1RDUCgweDc5ODZkZjNlLCAweDI4MzA5YmM2KSwgV1RDUCgweDc4OTk1M2UwLCAweDJhZTRkZTNlKSwKLSAgV1RDUCgweDc3OTNmZjg4LCAweDJkYTlhMGE4KSwgV1RDUCgweDc2NzVlMWNjLCAweDMwN2QwMTYzKSwgV1RDUCgweDc1M2UxNzYzLCAweDMzNWNmZjcyKSwgV1RDUCgweDczZWJkZTEwLCAweDM2NDc3ZTFmKSwKLSAgV1RDUCgweDcyN2U5ODRlLCAweDM5M2E0OGYxKSwgV1RDUCgweDcwZjVkMDliLCAweDNjMzMxN2Y5KSwgV1RDUCgweDZmNTEzYzYwLCAweDNmMmY5NDVjKSwgV1RDUCgweDZkOTBiZTYxLCAweDQyMmQ1ZDE4KSwKLSAgV1RDUCgweDZiYjQ2OGIxLCAweDQ1MmEwYmYzKSwgV1RDUCgweDY5YmM3ZTFlLCAweDQ4MjMzYTgxKSwgV1RDUCgweDY3YTk3MzE3LCAweDRiMTY4NzNlKSwgV1RDUCgweDY1N2JlZGZhLCAweDRlMDE5YTlkKSwKLSAgV1RDUCgweDYzMzRjNmQyLCAweDUwZTIyYzBiKSwgV1RDUCgweDYwZDUwNjg5LCAweDUzYjYwNmNiKSwgV1RDUCgweDVlNWRlNTg4LCAweDU2N2IwZWE3KSwgV1RDUCgweDViZDBjOWM2LCAweDU5MmY0NDYwKSwKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWwxMltdID0geworICAgIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweGMwMDAwMDAwKSwKIH07CiAKIFJBTV9BTElHTgogTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1jb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NTEyW10gPQotewotICBXVENQKDB4N2ZmZmY2MjEsIDB4MDAzMjQzZjUpLCBXVENQKDB4N2ZmZmE3MmMsIDB4MDA5NmNiYzEpLCBXVENQKDB4N2ZmZjA5NDMsIDB4MDBmYjUzMzApLCBXVENQKDB4N2ZmZTFjNjUsIDB4MDE1ZmRhMDMpLAotICBXVENQKDB4N2ZmY2UwOTMsIDB4MDFjNDVmZmUpLCBXVENQKDB4N2ZmYjU1Y2UsIDB4MDIyOGU0ZTIpLCBXVENQKDB4N2ZmOTdjMTgsIDB4MDI4ZDY4NzApLCBXVENQKDB4N2ZmNzUzNzAsIDB4MDJmMWVhNmMpLAotICBXVENQKDB4N2ZmNGRiZDksIDB4MDM1NjZhOTYpLCBXVENQKDB4N2ZmMjE1NTMsIDB4MDNiYWU4YjIpLCBXVENQKDB4N2ZlZWZmZTEsIDB4MDQxZjY0ODApLCBXVENQKDB4N2ZlYjliODUsIDB4MDQ4M2RkYzMpLAotICBXVENQKDB4N2ZlN2U4NDEsIDB4MDRlODU0M2UpLCBXVENQKDB4N2ZlM2U2MTYsIDB4MDU0Y2M3YjEpLCBXVENQKDB4N2ZkZjk1MDgsIDB4MDViMTM3ZGYpLCBXVENQKDB4N2ZkYWY1MTksIDB4MDYxNWE0OGIpLAotICBXVENQKDB4N2ZkNjA2NGMsIDB4MDY3YTBkNzYpLCBXVENQKDB4N2ZkMGM4YTMsIDB4MDZkZTcyNjIpLCBXVENQKDB4N2ZjYjNjMjMsIDB4MDc0MmQzMTEpLCBXVENQKDB4N2ZjNTYwY2YsIDB4MDdhNzJmNDUpLAotICBXVENQKDB4N2ZiZjM2YWEsIDB4MDgwYjg2YzIpLCBXVENQKDB4N2ZiOGJkYjgsIDB4MDg2ZmQ5NDcpLCBXVENQKDB4N2ZiMWY1ZmMsIDB4MDhkNDI2OTkpLCBXVENQKDB4N2ZhYWRmN2MsIDB4MDkzODZlNzgpLAotICBXVENQKDB4N2ZhMzdhM2MsIDB4MDk5Y2IwYTcpLCBXVENQKDB4N2Y5YmM2NDAsIDB4MGEwMGVjZTgpLCBXVENQKDB4N2Y5M2MzOGMsIDB4MGE2NTIyZmUpLCBXVENQKDB4N2Y4YjcyMjcsIDB4MGFjOTUyYWEpLAotICBXVENQKDB4N2Y4MmQyMTQsIDB4MGIyZDdiYWYpLCBXVENQKDB4N2Y3OWUzNWEsIDB4MGI5MTlkY2YpLCBXVENQKDB4N2Y3MGE1ZmUsIDB4MGJmNWI4Y2IpLCBXVENQKDB4N2Y2NzFhMDUsIDB4MGM1OWNjNjgpLAotICBXVENQKDB4N2Y1ZDNmNzUsIDB4MGNiZGQ4NjUpLCBXVENQKDB4N2Y1MzE2NTUsIDB4MGQyMWRjODcpLCBXVENQKDB4N2Y0ODllYWEsIDB4MGQ4NWQ4OGYpLCBXVENQKDB4N2YzZGQ4N2MsIDB4MGRlOWNjNDApLAotICBXVENQKDB4N2YzMmMzZDEsIDB4MGU0ZGI3NWIpLCBXVENQKDB4N2YyNzYwYWYsIDB4MGViMTk5YTQpLCBXVENQKDB4N2YxYmFmMWUsIDB4MGYxNTcyZGMpLCBXVENQKDB4N2YwZmFmMjUsIDB4MGY3OTQyYzcpLAotICBXVENQKDB4N2YwMzYwY2IsIDB4MGZkZDA5MjYpLCBXVENQKDB4N2VmNmM0MTgsIDB4MTA0MGM1YmIpLCBXVENQKDB4N2VlOWQ5MTQsIDB4MTBhNDc4NGIpLCBXVENQKDB4N2VkYzlmYzYsIDB4MTEwODIwOTYpLAotICBXVENQKDB4N2VjZjE4MzcsIDB4MTE2YmJlNjApLCBXVENQKDB4N2VjMTQyNzAsIDB4MTFjZjUxNmEpLCBXVENQKDB4N2ViMzFlNzgsIDB4MTIzMmQ5NzkpLCBXVENQKDB4N2VhNGFjNTgsIDB4MTI5NjU2NGQpLAotICBXVENQKDB4N2U5NWVjMWEsIDB4MTJmOWM3YWEpLCBXVENQKDB4N2U4NmRkYzYsIDB4MTM1ZDJkNTMpLCBXVENQKDB4N2U3NzgxNjYsIDB4MTNjMDg3MGEpLCBXVENQKDB4N2U2N2Q3MDMsIDB4MTQyM2Q0OTIpLAotICBXVENQKDB4N2U1N2RlYTcsIDB4MTQ4NzE1YWUpLCBXVENQKDB4N2U0Nzk4NWIsIDB4MTRlYTRhMWYpLCBXVENQKDB4N2UzNzA0MmEsIDB4MTU0ZDcxYWEpLCBXVENQKDB4N2UyNjIyMWYsIDB4MTViMDhjMTIpLAotICBXVENQKDB4N2UxNGYyNDIsIDB4MTYxMzk5MTgpLCBXVENQKDB4N2UwMzc0YTAsIDB4MTY3Njk4N2YpLCBXVENQKDB4N2RmMWE5NDIsIDB4MTZkOThhMGMpLCBXVENQKDB4N2RkZjkwMzQsIDB4MTczYzZkODApLAotICBXVENQKDB4N2RjZDI5ODEsIDB4MTc5ZjQyOWYpLCBXVENQKDB4N2RiYTc1MzQsIDB4MTgwMjA5MmMpLCBXVENQKDB4N2RhNzczNTksIDB4MTg2NGMwZWEpLCBXVENQKDB4N2Q5NDIzZmMsIDB4MThjNzY5OWIpLAotICBXVENQKDB4N2Q4MDg3MjgsIDB4MTkyYTAzMDQpLCBXVENQKDB4N2Q2YzljZTksIDB4MTk4YzhjZTcpLCBXVENQKDB4N2Q1ODY1NGQsIDB4MTllZjA3MDcpLCBXVENQKDB4N2Q0M2UwNWUsIDB4MWE1MTcxMjgpLAotICBXVENQKDB4N2QyZjBlMmIsIDB4MWFiM2NiMGQpLCBXVENQKDB4N2QxOWVlYmYsIDB4MWIxNjE0NzkpLCBXVENQKDB4N2QwNDgyMjgsIDB4MWI3ODRkMzApLCBXVENQKDB4N2NlZWM4NzMsIDB4MWJkYTc0ZjYpLAotICBXVENQKDB4N2NkOGMxYWUsIDB4MWMzYzhiOGMpLCBXVENQKDB4N2NjMjZkZTUsIDB4MWM5ZTkwYjgpLCBXVENQKDB4N2NhYmNkMjgsIDB4MWQwMDg0M2QpLCBXVENQKDB4N2M5NGRmODMsIDB4MWQ2MjY1ZGQpLAotICBXVENQKDB4N2M3ZGE1MDUsIDB4MWRjNDM1NWUpLCBXVENQKDB4N2M2NjFkYmMsIDB4MWUyNWYyODIpLCBXVENQKDB4N2M0ZTQ5YjcsIDB4MWU4NzlkMGQpLCBXVENQKDB4N2MzNjI5MDQsIDB4MWVlOTM0YzMpLAotICBXVENQKDB4N2MxZGJiYjMsIDB4MWY0YWI5NjgpLCBXVENQKDB4N2MwNTAxZDIsIDB4MWZhYzJhYmYpLCBXVENQKDB4N2JlYmZiNzAsIDB4MjAwZDg4OGQpLCBXVENQKDB4N2JkMmE4OWUsIDB4MjA2ZWQyOTUpLAotICBXVENQKDB4N2JiOTA5NmIsIDB4MjBkMDA4OWMpLCBXVENQKDB4N2I5ZjFkZTYsIDB4MjEzMTJhNjUpLCBXVENQKDB4N2I4NGU2MWYsIDB4MjE5MjM3YjUpLCBXVENQKDB4N2I2YTYyMjcsIDB4MjFmMzMwNGYpLAotICBXVENQKDB4N2I0ZjkyMGUsIDB4MjI1NDEzZjgpLCBXVENQKDB4N2IzNDc1ZTUsIDB4MjJiNGUyNzQpLCBXVENQKDB4N2IxOTBkYmMsIDB4MjMxNTliODgpLCBXVENQKDB4N2FmZDU5YTQsIDB4MjM3NjNlZjcpLAotICBXVENQKDB4N2FlMTU5YWUsIDB4MjNkNmNjODcpLCBXVENQKDB4N2FjNTBkZWMsIDB4MjQzNzQzZmEpLCBXVENQKDB4N2FhODc2NmYsIDB4MjQ5N2E1MTcpLCBXVENQKDB4N2E4YjkzNDgsIDB4MjRmN2VmYTIpLAotICBXVENQKDB4N2E2ZTY0OGEsIDB4MjU1ODIzNWYpLCBXVENQKDB4N2E1MGVhNDcsIDB4MjViODQwMTIpLCBXVENQKDB4N2EzMzI0OTAsIDB4MjYxODQ1ODEpLCBXVENQKDB4N2ExNTEzNzgsIDB4MjY3ODMzNzApLAotICBXVENQKDB4NzlmNmI3MTEsIDB4MjZkODA5YTUpLCBXVENQKDB4NzlkODBmNmYsIDB4MjczN2M3ZTMpLCBXVENQKDB4NzliOTFjYTQsIDB4Mjc5NzZkZjEpLCBXVENQKDB4Nzk5OWRlYzQsIDB4MjdmNmZiOTIpLAotICBXVENQKDB4Nzk3YTU1ZTAsIDB4Mjg1NjcwOGQpLCBXVENQKDB4Nzk1YTgyMGUsIDB4MjhiNWNjYTUpLCBXVENQKDB4NzkzYTYzNjEsIDB4MjkxNTBmYTEpLCBXVENQKDB4NzkxOWY5ZWMsIDB4Mjk3NDM5NDYpLAotICBXVENQKDB4NzhmOTQ1YzMsIDB4MjlkMzQ5NTgpLCBXVENQKDB4NzhkODQ2ZmIsIDB4MmEzMjNmOWUpLCBXVENQKDB4NzhiNmZkYTgsIDB4MmE5MTFiZGMpLCBXVENQKDB4Nzg5NTY5ZGYsIDB4MmFlZmRkZDgpLAotICBXVENQKDB4Nzg3MzhiYjMsIDB4MmI0ZTg1NTgpLCBXVENQKDB4Nzg1MTYzM2IsIDB4MmJhZDEyMjEpLCBXVENQKDB4NzgyZWYwOGIsIDB4MmMwYjgzZmEpLCBXVENQKDB4NzgwYzMzYjgsIDB4MmM2OWRhYTYpLAotICBXVENQKDB4NzdlOTJjZDksIDB4MmNjODE1ZWUpLCBXVENQKDB4NzdjNWRjMDEsIDB4MmQyNjM1OTYpLCBXVENQKDB4NzdhMjQxNDgsIDB4MmQ4NDM5NjQpLCBXVENQKDB4Nzc3ZTVjYzMsIDB4MmRlMjIxMWUpLAotICBXVENQKDB4Nzc1YTJlODksIDB4MmUzZmVjOGIpLCBXVENQKDB4NzczNWI2YWYsIDB4MmU5ZDliNzApLCBXVENQKDB4NzcxMGY1NGMsIDB4MmVmYjJkOTUpLCBXVENQKDB4NzZlYmVhNzcsIDB4MmY1OGEyYmUpLAotICBXVENQKDB4NzZjNjk2NDcsIDB4MmZiNWZhYjIpLCBXVENQKDB4NzZhMGY4ZDIsIDB4MzAxMzM1MzkpLCBXVENQKDB4NzY3YjEyMzEsIDB4MzA3MDUyMTcpLCBXVENQKDB4NzY1NGUyNzksIDB4MzBjZDUxMTUpLAotICBXVENQKDB4NzYyZTY5YzQsIDB4MzEyYTMxZjgpLCBXVENQKDB4NzYwN2E4MjgsIDB4MzE4NmY0ODcpLCBXVENQKDB4NzVlMDlkYmQsIDB4MzFlMzk4ODkpLCBXVENQKDB4NzViOTRhOWMsIDB4MzI0MDFkYzYpLAotICBXVENQKDB4NzU5MWFlZGQsIDB4MzI5Yzg0MDIpLCBXVENQKDB4NzU2OWNhOTksIDB4MzJmOGNiMDcpLCBXVENQKDB4NzU0MTlkZTcsIDB4MzM1NGYyOWIpLCBXVENQKDB4NzUxOTI4ZTAsIDB4MzNiMGZhODQpLAotICBXVENQKDB4NzRmMDZiOWUsIDB4MzQwY2UyOGIpLCBXVENQKDB4NzRjNzY2M2EsIDB4MzQ2OGFhNzYpLCBXVENQKDB4NzQ5ZTE4Y2QsIDB4MzRjNDUyMGQpLCBXVENQKDB4NzQ3NDgzNzEsIDB4MzUxZmQ5MTgpLAotICBXVENQKDB4NzQ0YWE2M2YsIDB4MzU3YjNmNWQpLCBXVENQKDB4NzQyMDgxNTAsIDB4MzVkNjg0YTYpLCBXVENQKDB4NzNmNjE0YzAsIDB4MzYzMWE4YjgpLCBXVENQKDB4NzNjYjYwYTgsIDB4MzY4Y2FiNWMpLAotICBXVENQKDB4NzNhMDY1MjIsIDB4MzZlNzhjNWIpLCBXVENQKDB4NzM3NTIyNDksIDB4Mzc0MjRiN2IpLCBXVENQKDB4NzM0OTk4MzgsIDB4Mzc5Y2U4ODUpLCBXVENQKDB4NzMxZGM3MGEsIDB4MzdmNzYzNDEpLAotICBXVENQKDB4NzJmMWFlZDksIDB4Mzg1MWJiNzcpLCBXVENQKDB4NzJjNTRmYzEsIDB4MzhhYmYwZWYpLCBXVENQKDB4NzI5OGE5ZGQsIDB4MzkwNjAzNzMpLCBXVENQKDB4NzI2YmJkNDgsIDB4Mzk1ZmYyYzkpLAotICBXVENQKDB4NzIzZThhMjAsIDB4MzliOWJlYmMpLCBXVENQKDB4NzIxMTEwN2UsIDB4M2ExMzY3MTIpLCBXVENQKDB4NzFlMzUwODAsIDB4M2E2Y2ViOTYpLCBXVENQKDB4NzFiNTRhNDEsIDB4M2FjNjRjMGYpLAotICBXVENQKDB4NzE4NmZkZGUsIDB4M2IxZjg4NDgpLCBXVENQKDB4NzE1ODZiNzQsIDB4M2I3OGEwMDcpLCBXVENQKDB4NzEyOTkzMWYsIDB4M2JkMTkzMTgpLCBXVENQKDB4NzBmYTc0ZmMsIDB4M2MyYTYxNDIpLAotICBXVENQKDB4NzBjYjExMjgsIDB4M2M4MzBhNTApLCBXVENQKDB4NzA5YjY3YzAsIDB4M2NkYjhlMDkpLCBXVENQKDB4NzA2Yjc4ZTMsIDB4M2QzM2VjMzkpLCBXVENQKDB4NzAzYjQ0YWQsIDB4M2Q4YzI0YTgpLAotICBXVENQKDB4NzAwYWNiM2MsIDB4M2RlNDM3MWYpLCBXVENQKDB4NmZkYTBjYWUsIDB4M2UzYzIzNjkpLCBXVENQKDB4NmZhOTA5MjEsIDB4M2U5M2U5NTApLCBXVENQKDB4NmY3N2MwYjMsIDB4M2VlYjg4OWMpLAotICBXVENQKDB4NmY0NjMzODMsIDB4M2Y0MzAxMTkpLCBXVENQKDB4NmYxNDYxYjAsIDB4M2Y5YTUyOTApLCBXVENQKDB4NmVlMjRiNTcsIDB4M2ZmMTdjY2EpLCBXVENQKDB4NmVhZmYwOTksIDB4NDA0ODdmOTQpLAotICBXVENQKDB4NmU3ZDUxOTMsIDB4NDA5ZjVhYjYpLCBXVENQKDB4NmU0YTZlNjYsIDB4NDBmNjBkZmIpLCBXVENQKDB4NmUxNzQ3MzAsIDB4NDE0Yzk5MmYpLCBXVENQKDB4NmRlM2RjMTEsIDB4NDFhMmZjMWEpLAotICBXVENQKDB4NmRiMDJkMjksIDB4NDFmOTM2ODkpLCBXVENQKDB4NmQ3YzNhOTgsIDB4NDI0ZjQ4NDUpLCBXVENQKDB4NmQ0ODA0N2UsIDB4NDJhNTMxMWIpLCBXVENQKDB4NmQxMzhhZmIsIDB4NDJmYWYwZDQpLAotICBXVENQKDB4NmNkZWNlMmYsIDB4NDM1MDg3M2MpLCBXVENQKDB4NmNhOWNlM2IsIDB4NDNhNWY0MWUpLCBXVENQKDB4NmM3NDhiM2YsIDB4NDNmYjM3NDYpLCBXVENQKDB4NmMzZjA1NWQsIDB4NDQ1MDUwN2UpLAotICBXVENQKDB4NmMwOTNjYjYsIDB4NDRhNTNmOTMpLCBXVENQKDB4NmJkMzMxNmEsIDB4NDRmYTA0NTApLCBXVENQKDB4NmI5Y2UzOWIsIDB4NDU0ZTllODApLCBXVENQKDB4NmI2NjUzNmIsIDB4NDVhMzBkZjApLAotICBXVENQKDB4NmIyZjgwZmIsIDB4NDVmNzUyNmIpLCBXVENQKDB4NmFmODZjNmMsIDB4NDY0YjZiYmUpLCBXVENQKDB4NmFjMTE1ZTIsIDB4NDY5ZjU5YjQpLCBXVENQKDB4NmE4OTdkN2QsIDB4NDZmMzFjMWEpLAotICBXVENQKDB4NmE1MWEzNjEsIDB4NDc0NmIyYmMpLCBXVENQKDB4NmExOTg3YjAsIDB4NDc5YTFkNjcpLCBXVENQKDB4NjllMTJhOGMsIDB4NDdlZDViZTYpLCBXVENQKDB4NjlhODhjMTksIDB4NDg0MDZlMDgpLAotICBXVENQKDB4Njk2ZmFjNzgsIDB4NDg5MzUzOTcpLCBXVENQKDB4NjkzNjhiY2UsIDB4NDhlNjBjNjIpLCBXVENQKDB4NjhmZDJhM2QsIDB4NDkzODk4MzYpLCBXVENQKDB4NjhjMzg3ZTksIDB4NDk4YWY2ZGYpLAotICBXVENQKDB4Njg4OWE0ZjYsIDB4NDlkZDI4MmEpLCBXVENQKDB4Njg0ZjgxODYsIDB4NGEyZjJiZTYpLCBXVENQKDB4NjgxNTFkYmUsIDB4NGE4MTAxZGUpLCBXVENQKDB4NjdkYTc5YzMsIDB4NGFkMmE5ZTIpLAotICBXVENQKDB4Njc5Zjk1YjcsIDB4NGIyNDIzYmUpLCBXVENQKDB4Njc2NDcxYzAsIDB4NGI3NTZmNDApLCBXVENQKDB4NjcyOTBlMDIsIDB4NGJjNjhjMzYpLCBXVENQKDB4NjZlZDZhYTEsIDB4NGMxNzdhNmUpLAotICBXVENQKDB4NjZiMTg3YzMsIDB4NGM2ODM5YjcpLCBXVENQKDB4NjY3NTY1OGMsIDB4NGNiOGM5ZGQpLCBXVENQKDB4NjYzOTA0MjIsIDB4NGQwOTJhYjApLCBXVENQKDB4NjVmYzYzYTksIDB4NGQ1OTViZmUpLAotICBXVENQKDB4NjViZjg0NDcsIDB4NGRhOTVkOTYpLCBXVENQKDB4NjU4MjY2MjIsIDB4NGRmOTJmNDYpLCBXVENQKDB4NjU0NTA5NWYsIDB4NGU0OGQwZGQpLCBXVENQKDB4NjUwNzZlMjUsIDB4NGU5ODQyMjkpLAotICBXVENQKDB4NjRjOTk0OTgsIDB4NGVlNzgyZmIpLCBXVENQKDB4NjQ4YjdjZTAsIDB4NGYzNjkzMjApLCBXVENQKDB4NjQ0ZDI3MjIsIDB4NGY4NTcyNjkpLCBXVENQKDB4NjQwZTkzODYsIDB4NGZkNDIwYTQpLAotICBXVENQKDB4NjNjZmMyMzEsIDB4NTAyMjlkYTEpLCBXVENQKDB4NjM5MGIzNGEsIDB4NTA3MGU5MmYpLCBXVENQKDB4NjM1MTY2ZjksIDB4NTBiZjAzMWYpLCBXVENQKDB4NjMxMWRkNjQsIDB4NTEwY2ViNDApLAotICBXVENQKDB4NjJkMjE2YjMsIDB4NTE1YWExNjIpLCBXVENQKDB4NjI5MjEzMGMsIDB4NTFhODI1NTUpLCBXVENQKDB4NjI1MWQyOTgsIDB4NTFmNTc2ZWEpLCBXVENQKDB4NjIxMTU1N2UsIDB4NTI0Mjk1ZjApLAotICBXVENQKDB4NjFkMDliZTUsIDB4NTI4ZjgyMzgpLCBXVENQKDB4NjE4ZmE1ZjcsIDB4NTJkYzNiOTIpLCBXVENQKDB4NjE0ZTczZGEsIDB4NTMyOGMxZDApLCBXVENQKDB4NjEwZDA1YjcsIDB4NTM3NTE0YzIpLAotICBXVENQKDB4NjBjYjViYjcsIDB4NTNjMTM0MzkpLCBXVENQKDB4NjA4OTc2MDEsIDB4NTQwZDIwMDUpLCBXVENQKDB4NjA0NzU0YmYsIDB4NTQ1OGQ3ZjkpLCBXVENQKDB4NjAwNGY4MTksIDB4NTRhNDViZTYpLAotICBXVENQKDB4NWZjMjYwMzgsIDB4NTRlZmFiOWMpLCBXVENQKDB4NWY3ZjhkNDYsIDB4NTUzYWM2ZWUpLCBXVENQKDB4NWYzYzdmNmIsIDB4NTU4NWFkYWQpLCBXVENQKDB4NWVmOTM2ZDEsIDB4NTVkMDVmYWEpLAotICBXVENQKDB4NWViNWIzYTIsIDB4NTYxYWRjYjkpLCBXVENQKDB4NWU3MWY2MDYsIDB4NTY2NTI0YWEpLCBXVENQKDB4NWUyZGZlMjksIDB4NTZhZjM3NTApLCBXVENQKDB4NWRlOWNjMzMsIDB4NTZmOTE0N2UpLAotICBXVENQKDB4NWRhNTYwNGYsIDB4NTc0MmJjMDYpLCBXVENQKDB4NWQ2MGJhYTcsIDB4NTc4YzJkYmEpLCBXVENQKDB4NWQxYmRiNjUsIDB4NTdkNTY5NmQpLCBXVENQKDB4NWNkNmMyYjUsIDB4NTgxZTZlZjEpLAotICBXVENQKDB4NWM5MTcwYmYsIDB4NTg2NzNlMWIpLCBXVENQKDB4NWM0YmU1YjAsIDB4NThhZmQ2YmQpLCBXVENQKDB4NWMwNjIxYjIsIDB4NThmODM4YTkpLCBXVENQKDB4NWJjMDI0ZjAsIDB4NTk0MDYzYjUpLAotICBXVENQKDB4NWI3OWVmOTYsIDB4NTk4ODU3YjIpLCBXVENQKDB4NWIzMzgxY2UsIDB4NTlkMDE0NzUpLCBXVENQKDB4NWFlY2RiYzUsIDB4NWExNzk5ZDEpLCBXVENQKDB4NWFhNWZkYTUsIDB4NWE1ZWU3OWEpLAorY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzEyW10gPSB7CisgICAgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksCisgICAgU1RDKDB4NmVkOWViYTEpLAogfTsKIAotLyogVGhlIHdpbmRvdyBjb2VmZmljaWVudHMgYXJlIGNhbGN1bGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOgotICogTj1GUkFNRV9MRU5fTE9OR19MRDQ4MAotICogd2luW25dPXNpbihwaSoobiswLjUpLygyKk4pKSAgIGZvciBuPTAsLi4sTi0xICovCiBSQU1fQUxJR04KIExOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzQ4MFs0ODBdID0KLXsKLSAgV1RDUCgweDdmZmZmNGM1LCAweDAwMzU5ZGQyKSwgV1RDUCgweDdmZmY5YWVmLCAweDAwYTBkOTUxKSwgV1RDUCgweDdmZmVlNzQ0LCAweDAxMGMxNDYwKSwgV1RDUCgweDdmZmRkOWM0LCAweDAxNzc0ZWIyKSwKLSAgV1RDUCgweDdmZmM3MjZmLCAweDAxZTI4N2ZjKSwgV1RDUCgweDdmZmFiMTQ3LCAweDAyNGRiZmY0KSwgV1RDUCgweDdmZjg5NjRkLCAweDAyYjhmNjRlKSwgV1RDUCgweDdmZjYyMTgyLCAweDAzMjQyYWJmKSwKLSAgV1RDUCgweDdmZjM1MmU4LCAweDAzOGY1Y2ZiKSwgV1RDUCgweDdmZjAyYTgyLCAweDAzZmE4Y2I4KSwgV1RDUCgweDdmZWNhODUxLCAweDA0NjViOWFhKSwgV1RDUCgweDdmZThjYzU3LCAweDA0ZDBlMzg2KSwKLSAgV1RDUCgweDdmZTQ5Njk4LCAweDA1M2MwYTAxKSwgV1RDUCgweDdmZTAwNzE2LCAweDA1YTcyY2NmKSwgV1RDUCgweDdmZGIxZGQ1LCAweDA2MTI0YmE1KSwgV1RDUCgweDdmZDVkYWQ4LCAweDA2N2Q2NjM5KSwKLSAgV1RDUCgweDdmZDAzZTIzLCAweDA2ZTg3YzNmKSwgV1RDUCgweDdmY2E0N2I5LCAweDA3NTM4ZDZiKSwgV1RDUCgweDdmYzNmN2EwLCAweDA3YmU5OTczKSwgV1RDUCgweDdmYmQ0ZGRhLCAweDA4MjlhMDBjKSwKLSAgV1RDUCgweDdmYjY0YTZlLCAweDA4OTRhMGVhKSwgV1RDUCgweDdmYWVlZDVmLCAweDA4ZmY5YmMyKSwgV1RDUCgweDdmYTczNmI0LCAweDA5NmE5MDQ5KSwgV1RDUCgweDdmOWYyNjcxLCAweDA5ZDU3ZTM1KSwKLSAgV1RDUCgweDdmOTZiYzljLCAweDBhNDA2NTNhKSwgV1RDUCgweDdmOGRmOTNjLCAweDBhYWI0NTBkKSwgV1RDUCgweDdmODRkYzU1LCAweDBiMTYxZDYzKSwgV1RDUCgweDdmN2I2NWVmLCAweDBiODBlZGYxKSwKLSAgV1RDUCgweDdmNzE5NjExLCAweDBiZWJiNjZjKSwgV1RDUCgweDdmNjc2Y2MwLCAweDBjNTY3NjhhKSwgV1RDUCgweDdmNWNlYTA1LCAweDBjYzEyZGZmKSwgV1RDUCgweDdmNTIwZGU2LCAweDBkMmJkYzgwKSwKLSAgV1RDUCgweDdmNDZkODZjLCAweDBkOTY4MWMyKSwgV1RDUCgweDdmM2I0OTlkLCAweDBlMDExZDdjKSwgV1RDUCgweDdmMmY2MTgzLCAweDBlNmJhZjYxKSwgV1RDUCgweDdmMjMyMDI2LCAweDBlZDYzNzI3KSwKLSAgV1RDUCgweDdmMTY4NThlLCAweDBmNDBiNDgzKSwgV1RDUCgweDdmMDk5MWM0LCAweDBmYWIyNzJiKSwgV1RDUCgweDdlZmM0NGQwLCAweDEwMTU4ZWQ0KSwgV1RDUCgweDdlZWU5ZWJlLCAweDEwN2ZlYjMzKSwKLSAgV1RDUCgweDdlZTA5Zjk1LCAweDEwZWEzYmZkKSwgV1RDUCgweDdlZDI0NzYxLCAweDExNTQ4MGU5KSwgV1RDUCgweDdlYzM5NjJhLCAweDExYmViOWFhKSwgV1RDUCgweDdlYjQ4YmZiLCAweDEyMjhlNWY4KSwKLSAgV1RDUCgweDdlYTUyOGUwLCAweDEyOTMwNTg2KSwgV1RDUCgweDdlOTU2Y2UxLCAweDEyZmQxODBiKSwgV1RDUCgweDdlODU1ODBjLCAweDEzNjcxZDNkKSwgV1RDUCgweDdlNzRlYTZhLCAweDEzZDExNGQwKSwKLSAgV1RDUCgweDdlNjQyNDA4LCAweDE0M2FmZTdiKSwgV1RDUCgweDdlNTMwNGYyLCAweDE0YTRkOWY0KSwgV1RDUCgweDdlNDE4ZDMyLCAweDE1MGVhNmVmKSwgV1RDUCgweDdlMmZiY2Q2LCAweDE1Nzg2NTIyKSwKLSAgV1RDUCgweDdlMWQ5M2VhLCAweDE1ZTIxNDQ1KSwgV1RDUCgweDdlMGIxMjdhLCAweDE2NGJiNDBiKSwgV1RDUCgweDdkZjgzODk1LCAweDE2YjU0NDJiKSwgV1RDUCgweDdkZTUwNjQ2LCAweDE3MWVjNDVjKSwKLSAgV1RDUCgweDdkZDE3YjljLCAweDE3ODgzNDUyKSwgV1RDUCgweDdkYmQ5OGE0LCAweDE3ZjE5M2M1KSwgV1RDUCgweDdkYTk1ZDZjLCAweDE4NWFlMjY5KSwgV1RDUCgweDdkOTRjYTAzLCAweDE4YzQxZmY2KSwKLSAgV1RDUCgweDdkN2ZkZTc2LCAweDE5MmQ0YzIxKSwgV1RDUCgweDdkNmE5YWQ1LCAweDE5OTY2NmEwKSwgV1RDUCgweDdkNTRmZjJlLCAweDE5ZmY2ZjJhKSwgV1RDUCgweDdkM2YwYjkwLCAweDFhNjg2NTc1KSwKLSAgV1RDUCgweDdkMjhjMDBjLCAweDFhZDE0OTM4KSwgV1RDUCgweDdkMTIxY2IwLCAweDFiM2ExYTI4KSwgV1RDUCgweDdjZmIyMThjLCAweDFiYTJkN2ZjKSwgV1RDUCgweDdjZTNjZWIyLCAweDFjMGI4MjZhKSwKLSAgV1RDUCgweDdjY2MyNDMwLCAweDFjNzQxOTJhKSwgV1RDUCgweDdjYjQyMjE3LCAweDFjZGM5YmYyKSwgV1RDUCgweDdjOWJjODdhLCAweDFkNDUwYTc4KSwgV1RDUCgweDdjODMxNzY3LCAweDFkYWQ2NDczKSwKLSAgV1RDUCgweDdjNmEwZWYyLCAweDFlMTVhOTlhKSwgV1RDUCgweDdjNTBhZjJiLCAweDFlN2RkOWE0KSwgV1RDUCgweDdjMzZmODI0LCAweDFlZTVmNDQ3KSwgV1RDUCgweDdjMWNlOWVmLCAweDFmNGRmOTNhKSwKLSAgV1RDUCgweDdjMDI4NDlmLCAweDFmYjVlODM2KSwgV1RDUCgweDdiZTdjODQ3LCAweDIwMWRjMGVmKSwgV1RDUCgweDdiY2NiNGY4LCAweDIwODU4MzFmKSwgV1RDUCgweDdiYjE0YWM1LCAweDIwZWQyZTdiKSwKLSAgV1RDUCgweDdiOTU4OWMzLCAweDIxNTRjMmJiKSwgV1RDUCgweDdiNzk3MjA1LCAweDIxYmMzZjk3KSwgV1RDUCgweDdiNWQwMzllLCAweDIyMjNhNGM1KSwgV1RDUCgweDdiNDAzZWEyLCAweDIyOGFmMWZlKSwKLSAgV1RDUCgweDdiMjMyMzI1LCAweDIyZjIyNmY4KSwgV1RDUCgweDdiMDViMTNkLCAweDIzNTk0MzZjKSwgV1RDUCgweDdhZTdlOGZjLCAweDIzYzA0NzEwKSwgV1RDUCgweDdhYzljYTdhLCAweDI0MjczMTlkKSwKLSAgV1RDUCgweDdhYWI1NWNhLCAweDI0OGUwMmNiKSwgV1RDUCgweDdhOGM4YjAxLCAweDI0ZjRiYTUwKSwgV1RDUCgweDdhNmQ2YTM3LCAweDI1NWI1N2U2KSwgV1RDUCgweDdhNGRmMzgwLCAweDI1YzFkYjQ0KSwKLSAgV1RDUCgweDdhMmUyNmYyLCAweDI2Mjg0NDIyKSwgV1RDUCgweDdhMGUwNGE0LCAweDI2OGU5MjM4KSwgV1RDUCgweDc5ZWQ4Y2FkLCAweDI2ZjRjNTNlKSwgV1RDUCgweDc5Y2NiZjIyLCAweDI3NWFkY2VlKSwKLSAgV1RDUCgweDc5YWI5YzFjLCAweDI3YzBkOGZlKSwgV1RDUCgweDc5OGEyM2IxLCAweDI4MjZiOTI4KSwgV1RDUCgweDc5Njg1NWY5LCAweDI4OGM3ZDI0KSwgV1RDUCgweDc5NDYzMzBjLCAweDI4ZjIyNGFiKSwKLSAgV1RDUCgweDc5MjNiYjAxLCAweDI5NTdhZjc0KSwgV1RDUCgweDc5MDBlZGYyLCAweDI5YmQxZDNhKSwgV1RDUCgweDc4ZGRjYmY1LCAweDJhMjI2ZGI1KSwgV1RDUCgweDc4YmE1NTI0LCAweDJhODdhMDlkKSwKLSAgV1RDUCgweDc4OTY4OTk4LCAweDJhZWNiNWFjKSwgV1RDUCgweDc4NzI2OTZhLCAweDJiNTFhYzlhKSwgV1RDUCgweDc4NGRmNGIzLCAweDJiYjY4NTIyKSwgV1RDUCgweDc4MjkyYjhkLCAweDJjMWIzZWZiKSwKLSAgV1RDUCgweDc4MDQwZTEyLCAweDJjN2ZkOWUwKSwgV1RDUCgweDc3ZGU5YzViLCAweDJjZTQ1NTg5KSwgV1RDUCgweDc3YjhkNjgzLCAweDJkNDhiMWIxKSwgV1RDUCgweDc3OTJiY2E1LCAweDJkYWNlZTExKSwKLSAgV1RDUCgweDc3NmM0ZWRiLCAweDJlMTEwYTYyKSwgV1RDUCgweDc3NDU4ZDQwLCAweDJlNzUwNjVlKSwgV1RDUCgweDc3MWU3N2YwLCAweDJlZDhlMWMwKSwgV1RDUCgweDc2ZjcwZjA1LCAweDJmM2M5YzQwKSwKLSAgV1RDUCgweDc2Y2Y1MjljLCAweDJmYTAzNTk5KSwgV1RDUCgweDc2YTc0MmQxLCAweDMwMDNhZDg1KSwgV1RDUCgweDc2N2VkZmJlLCAweDMwNjcwM2JmKSwgV1RDUCgweDc2NTYyOTgyLCAweDMwY2EzODAwKSwKLSAgV1RDUCgweDc2MmQyMDM4LCAweDMxMmQ0YTAzKSwgV1RDUCgweDc2MDNjM2ZkLCAweDMxOTAzOTgyKSwgV1RDUCgweDc1ZGExNGVmLCAweDMxZjMwNjM4KSwgV1RDUCgweDc1YjAxMzI5LCAweDMyNTVhZmUwKSwKLSAgV1RDUCgweDc1ODViZWNiLCAweDMyYjgzNjM0KSwgV1RDUCgweDc1NWIxN2YyLCAweDMzMWE5OGVmKSwgV1RDUCgweDc1MzAxZWJiLCAweDMzN2NkN2NkKSwgV1RDUCgweDc1MDRkMzQ1LCAweDMzZGVmMjg3KSwKLSAgV1RDUCgweDc0ZDkzNWFlLCAweDM0NDBlOGRhKSwgV1RDUCgweDc0YWQ0NjE1LCAweDM0YTJiYTgxKSwgV1RDUCgweDc0ODEwNDk5LCAweDM1MDQ2NzM2KSwgV1RDUCgweDc0NTQ3MTU4LCAweDM1NjVlZWI2KSwKLSAgV1RDUCgweDc0Mjc4YzcyLCAweDM1Yzc1MGJjKSwgV1RDUCgweDczZmE1NjA3LCAweDM2Mjg4ZDAzKSwgV1RDUCgweDczY2NjZTM2LCAweDM2ODlhMzQ4KSwgV1RDUCgweDczOWVmNTFmLCAweDM2ZWE5MzQ2KSwKLSAgV1RDUCgweDczNzBjYWUyLCAweDM3NGI1Y2I5KSwgV1RDUCgweDczNDI0ZmEwLCAweDM3YWJmZjVkKSwgV1RDUCgweDczMTM4Mzc5LCAweDM4MGM3YWVlKSwgV1RDUCgweDcyZTQ2NjhmLCAweDM4NmNjZjJhKSwKLSAgV1RDUCgweDcyYjRmOTAyLCAweDM4Y2NmYmNiKSwgV1RDUCgweDcyODUzYWYzLCAweDM5MmQwMDhmKSwgV1RDUCgweDcyNTUyYzg1LCAweDM5OGNkZDMyKSwgV1RDUCgweDcyMjRjZGQ4LCAweDM5ZWM5MTcyKSwKLSAgV1RDUCgweDcxZjQxZjBmLCAweDNhNGMxZDA5KSwgV1RDUCgweDcxYzMyMDRjLCAweDNhYWI3ZmI3KSwgV1RDUCgweDcxOTFkMWIxLCAweDNiMGFiOTM3KSwgV1RDUCgweDcxNjAzMzYxLCAweDNiNjljOTQ3KSwKLSAgV1RDUCgweDcxMmU0NTdmLCAweDNiYzhhZmE1KSwgV1RDUCgweDcwZmMwODJkLCAweDNjMjc2YzBkKSwgV1RDUCgweDcwYzk3YjkwLCAweDNjODVmZTNkKSwgV1RDUCgweDcwOTY5ZmNhLCAweDNjZTQ2NWYzKSwKLSAgV1RDUCgweDcwNjM3NGZmLCAweDNkNDJhMmVjKSwgV1RDUCgweDcwMmZmYjU0LCAweDNkYTBiNGU3KSwgV1RDUCgweDZmZmMzMmViLCAweDNkZmU5YmExKSwgV1RDUCgweDZmYzgxYmVhLCAweDNlNWM1NmQ4KSwKLSAgV1RDUCgweDZmOTNiNjc2LCAweDNlYjllNjRiKSwgV1RDUCgweDZmNWYwMmIyLCAweDNmMTc0OWI4KSwgV1RDUCgweDZmMmEwMGM0LCAweDNmNzQ4MGRkKSwgV1RDUCgweDZlZjRiMGQxLCAweDNmZDE4YjdhKSwKLSAgV1RDUCgweDZlYmYxMmZmLCAweDQwMmU2OTRjKSwgV1RDUCgweDZlODkyNzcyLCAweDQwOGIxYTEyKSwgV1RDUCgweDZlNTJlZTUyLCAweDQwZTc5ZDhjKSwgV1RDUCgweDZlMWM2N2M0LCAweDQxNDNmMzc5KSwKLSAgV1RDUCgweDZkZTU5M2VlLCAweDQxYTAxYjk3KSwgV1RDUCgweDZkYWU3MmY3LCAweDQxZmMxNWE2KSwgV1RDUCgweDZkNzcwNTA2LCAweDQyNTdlMTY2KSwgV1RDUCgweDZkM2Y0YTQwLCAweDQyYjM3ZTk2KSwKLSAgV1RDUCgweDZkMDc0MmNmLCAweDQzMGVlY2Y2KSwgV1RDUCgweDZjY2VlZWQ4LCAweDQzNmEyYzQ1KSwgV1RDUCgweDZjOTY0ZTgzLCAweDQzYzUzYzQ0KSwgV1RDUCgweDZjNWQ2MWY5LCAweDQ0MjAxY2IyKSwKLSAgV1RDUCgweDZjMjQyOTYwLCAweDQ0N2FjZDUwKSwgV1RDUCgweDZiZWFhNGUyLCAweDQ0ZDU0ZGRmKSwgV1RDUCgweDZiYjBkNGE3LCAweDQ1MmY5ZTFlKSwgV1RDUCgweDZiNzZiOGQ2LCAweDQ1ODliZGNmKSwKLSAgV1RDUCgweDZiM2M1MTlhLCAweDQ1ZTNhY2IxKSwgV1RDUCgweDZiMDE5ZjFhLCAweDQ2M2Q2YTg3KSwgV1RDUCgweDZhYzZhMTgwLCAweDQ2OTZmNzEwKSwgV1RDUCgweDZhOGI1OGY2LCAweDQ2ZjA1MjBmKSwKLSAgV1RDUCgweDZhNGZjNWE2LCAweDQ3NDk3YjQ0KSwgV1RDUCgweDZhMTNlN2I4LCAweDQ3YTI3MjcxKSwgV1RDUCgweDY5ZDdiZjU3LCAweDQ3ZmIzNzU3KSwgV1RDUCgweDY5OWI0Y2FkLCAweDQ4NTNjOWI5KSwKLSAgV1RDUCgweDY5NWU4ZmU1LCAweDQ4YWMyOTU3KSwgV1RDUCgweDY5MjE4OTI5LCAweDQ5MDQ1NWY0KSwgV1RDUCgweDY4ZTQzOGE0LCAweDQ5NWM0ZjUyKSwgV1RDUCgweDY4YTY5ZTgxLCAweDQ5YjQxNTMzKSwKLSAgV1RDUCgweDY4NjhiYWVjLCAweDRhMGJhNzViKSwgV1RDUCgweDY4MmE4ZTBmLCAweDRhNjMwNThhKSwgV1RDUCgweDY3ZWMxODE3LCAweDRhYmEyZjg0KSwgV1RDUCgweDY3YWQ1OTJmLCAweDRiMTEyNTBjKSwKLSAgV1RDUCgweDY3NmU1MTgzLCAweDRiNjdlNWU0KSwgV1RDUCgweDY3MmYwMTNmLCAweDRiYmU3MWQxKSwgV1RDUCgweDY2ZWY2ODkxLCAweDRjMTRjODk0KSwgV1RDUCgweDY2YWY4N2E0LCAweDRjNmFlOWYyKSwKLSAgV1RDUCgweDY2NmY1ZWE2LCAweDRjYzBkNWFlKSwgV1RDUCgweDY2MmVlZGMzLCAweDRkMTY4YjhiKSwgV1RDUCgweDY1ZWUzNTI5LCAweDRkNmMwYjRlKSwgV1RDUCgweDY1YWQzNTA1LCAweDRkYzE1NGJiKSwKLSAgV1RDUCgweDY1NmJlZDg0LCAweDRlMTY2Nzk1KSwgV1RDUCgweDY1MmE1ZWQ2LCAweDRlNmI0M2EyKSwgV1RDUCgweDY0ZTg4OTI2LCAweDRlYmZlOGE1KSwgV1RDUCgweDY0YTY2Y2E1LCAweDRmMTQ1NjYyKSwKLSAgV1RDUCgweDY0NjQwOTdmLCAweDRmNjg4Y2EwKSwgV1RDUCgweDY0MjE1ZmU1LCAweDRmYmM4YjIyKSwgV1RDUCgweDYzZGU3MDAzLCAweDUwMTA1MWFlKSwgV1RDUCgweDYzOWIzYTBiLCAweDUwNjNlMDA4KSwKLSAgV1RDUCgweDYzNTdiZTJhLCAweDUwYjczNWY4KSwgV1RDUCgweDYzMTNmYzkwLCAweDUxMGE1MzQwKSwgV1RDUCgweDYyY2ZmNTZjLCAweDUxNWQzN2E5KSwgV1RDUCgweDYyOGJhOGVmLCAweDUxYWZlMmY2KSwKLSAgV1RDUCgweDYyNDcxNzQ5LCAweDUyMDI1NGVmKSwgV1RDUCgweDYyMDI0MGE4LCAweDUyNTQ4ZDU5KSwgV1RDUCgweDYxYmQyNTNmLCAweDUyYTY4YmZiKSwgV1RDUCgweDYxNzdjNTNjLCAweDUyZjg1MDliKSwKLSAgV1RDUCgweDYxMzIyMGQyLCAweDUzNDlkYWZmKSwgV1RDUCgweDYwZWMzODMwLCAweDUzOWIyYWYwKSwgV1RDUCgweDYwYTYwYjg4LCAweDUzZWM0MDMyKSwgV1RDUCgweDYwNWY5YjBiLCAweDU0M2QxYThlKSwKLSAgV1RDUCgweDYwMThlNmViLCAweDU0OGRiOWNiKSwgV1RDUCgweDVmZDFlZjU5LCAweDU0ZGUxZGIxKSwgV1RDUCgweDVmOGFiNDg3LCAweDU1MmU0NjA1KSwgV1RDUCgweDVmNDMzNmE3LCAweDU1N2UzMjkyKSwKLSAgV1RDUCgweDVlZmI3NWVhLCAweDU1Y2RlMzFlKSwgV1RDUCgweDVlYjM3Mjg1LCAweDU2MWQ1NzcxKSwgV1RDUCgweDVlNmIyY2E4LCAweDU2NmM4ZjU1KSwgV1RDUCgweDVlMjJhNDg3LCAweDU2YmI4YTkwKSwKLSAgV1RDUCgweDVkZDlkYTU1LCAweDU3MGE0OGVjKSwgV1RDUCgweDVkOTBjZTQ1LCAweDU3NThjYTMxKSwgV1RDUCgweDVkNDc4MDhhLCAweDU3YTcwZTI5KSwgV1RDUCgweDVjZmRmMTU3LCAweDU3ZjUxNDlkKSwKLSAgV1RDUCgweDVjYjQyMGUwLCAweDU4NDJkZDU0KSwgV1RDUCgweDVjNmEwZjU5LCAweDU4OTA2ODFhKSwgV1RDUCgweDVjMWZiY2Y2LCAweDU4ZGRiNGI4KSwgV1RDUCgweDViZDUyOWViLCAweDU5MmFjMmY3KSwKLSAgV1RDUCgweDViOGE1NjZjLCAweDU5Nzc5MmExKSwgV1RDUCgweDViM2Y0MmFlLCAweDU5YzQyMzgxKSwgV1RDUCgweDVhZjNlZWU2LCAweDVhMTA3NTYxKSwgV1RDUCgweDVhYTg1YjQ4LCAweDVhNWM4ODBhKSwKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWwyNFtdID0geworICAgIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDQwMDAwMDAwKSwKKyAgICBTVEMoMHgyMTIwZmI4MyksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhjMDAwMDAwMCksCisgICAgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg5MTI2MTQ1ZiksIFNUQygweDg0NWM4YWUzKSwKIH07CiAKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMjRbXSA9IHsKKyAgICBTVEMoMHgyMTIwZmI4MyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2ZWQ5ZWJhMSksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgyMTIwZmI4MyksCit9OwogCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDQ4W10gPSB7CisgICAgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweGRlZGYwNDdkKSwKKyAgICBTVEMoMHg4OWJlNTBjMyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHg4MDAwMDAwMCksCisgICAgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDg5YmU1MGMzKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweDg0NWM4YWUzKSwKKyAgICBTVEMoMHhjZjA0M2FiMyksCit9OwogCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzQ4W10gPSB7CisgICAgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg3NjQxYWYzZCksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3ZmZmZmZmZiksCisgICAgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDdiYTM3NTFkKSwKKyAgICBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDIxMjBmYjgzKSwKKyAgICBTVEMoMHg4OWJlNTBjMyksCit9OwogCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDgwW10gPSB7CisgICAgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4NzliYzM4NGQpLAorICAgIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDY3OGRkZTZlKSwKKyAgICBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg0YjNjOGMxMiksCisgICAgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Mjc4ZGRlNmUpLAorICAgIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDAwMDAwMDAwKSwKKyAgICBTVEMoMHg3MjBjODA3NSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHhkODcyMjE5MiksCisgICAgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweGY1ZjUwZDY3KSwgU1RDKDB4YjRjMzczZWUpLAorICAgIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHhkODcyMjE5MiksIFNUQygweDk4NzIyMTkyKSwKKyAgICBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4YmQxZWM0NWMpLCBTVEMoMHg4NjQzYzdiMyksCisgICAgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4ODAwMDAwMDApLAorICAgIFNUQygweDUzMjExZDE4KSwgU1RDKDB4ZWJmOWY0OTgpLCBTVEMoMHg5MmRjYWZlNSksIFNUQygweDg2NDNjN2IzKSwKKyAgICBTVEMoMHg0YjNjOGMxMiksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4ODY0M2M3YjMpLCBTVEMoMHg5ODcyMjE5MiksCisgICAgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHhjNWUzYTNhOSksIFNUQygweDgwNjUwMzQ3KSwgU1RDKDB4YjRjMzczZWUpLAorICAgIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHg4MTkzNmRhZiksIFNUQygweGQ4NzIyMTkyKSwKKyAgICBTVEMoMHgzMGZiYzU0ZCksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHgwMDAwMDAwMCksCit9OwogCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzgwW10gPSB7CisgICAgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4Mjc4ZGRlNmUpLAorICAgIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDRiM2M4YzEyKSwKKyAgICBTVEMoMHgxZGUxODlhNiksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NzliYzM4NGQpLAorICAgIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdmZmZmZmZmKSwKKyAgICBTVEMoMHgzYTFjNWM1NyksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4Njc4ZGRlNmUpLAorICAgIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDRiM2M4YzEyKSwKKyAgICBTVEMoMHg1MzIxMWQxOCksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4MDAwMDAwMDApLAorICAgIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweGQ4NzIyMTkyKSwKKyAgICBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHhiNGMzNzNlZSksCisgICAgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4OTg3MjIxOTIpLAorICAgIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHhlYmY5ZjQ5OCksIFNUQygweDg2NDNjN2IzKSwKKyAgICBTVEMoMHg3NjQxYWYzZCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHg4MDAwMDAwMCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDk2W10gPSB7CisgICAgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg3OTM1MDFhOSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NzJjY2I5ZGIpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDIxMjBmYjgzKSwKKyAgICBTVEMoMHg2MDNjNDk2YyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4NTQ2NTcxOTQpLCBTVEMoMHhlZjRhZWFmMSksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4ZGVkZjA0N2QpLAorICAgIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweGMwMDAwMDAwKSwKKyAgICBTVEMoMHgzODljZWE3MiksIFNUQygweGIyMTQxYjAyKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHhhNTdkODY2NiksCisgICAgU1RDKDB4MjkyNGVkYWMpLCBTVEMoMHg5YTczNjVkMyksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4OTEyNjE0NWYpLAorICAgIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweDg0NWM4YWUzKSwKKyAgICBTVEMoMHgwODVmMjEzNyksIFNUQygweDgxMTg1NWI0KSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHg4MDAwMDAwMCksCisgICAgU1RDKDB4ZjdhMGRlYzkpLCBTVEMoMHg4MTE4NTViNCksIFNUQygweGVmNGFlYWYxKSwgU1RDKDB4ODQ1YzhhZTMpLAorICAgIFNUQygweGU3MDc0N2M0KSwgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweDkxMjYxNDVmKSwKKyAgICBTVEMoMHhkNmRiMTI1NCksIFNUQygweDlhNzM2NWQzKSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHhhNTdkODY2NiksCisgICAgU1RDKDB4Yzc2MzE1OGUpLCBTVEMoMHhiMjE0MWIwMiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzk2W10gPSB7CisgICAgU1RDKDB4MDg1ZjIxMzcpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDQwMDAwMDAwKSwKKyAgICBTVEMoMHgyOTI0ZWRhYyksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4Mzg5Y2VhNzIpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDdiYTM3NTFkKSwKKyAgICBTVEMoMHg1NDY1NzE5NCksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg3ZmZmZmZmZiksCisgICAgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg3MmNjYjlkYiksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NzkzNTAxYTkpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDIxMjBmYjgzKSwKKyAgICBTVEMoMHg3ZmI5ZDc1OSksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHhlZjRhZWFmMSksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4ZGVkZjA0N2QpLAorICAgIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweGMwMDAwMDAwKSwKKyAgICBTVEMoMHg3OTM1MDFhOSksIFNUQygweGIyMTQxYjAyKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHhhNTdkODY2NiksCisgICAgU1RDKDB4NzJjY2I5ZGIpLCBTVEMoMHg5YTczNjVkMyksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDM4NFtdID0geworICAgIFNUQygweDdmZmI5ZDE1KSwgU1RDKDB4N2ZlZTc0YTIpLCBTVEMoMHg3ZmQ4ODc4ZSksIFNUQygweDdmYjlkNzU5KSwKKyAgICBTVEMoMHg3ZjkyNjYxZCksIFNUQygweDdmNjIzNjhmKSwgU1RDKDB4N2YyOTRiZmQpLCBTVEMoMHg3ZWU3YWE0YyksCisgICAgU1RDKDB4N2U5ZDU1ZmMpLCBTVEMoMHg3ZTRhNTQyNiksIFNUQygweDdkZWVhYTdhKSwgU1RDKDB4N2ZlZTc0YTIpLAorICAgIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2Y2MjM2OGYpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdlNGE1NDI2KSwKKyAgICBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdjYTgwMDM4KSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3YTdkMDU1YiksCisgICAgU1RDKDB4NzkzNTAxYTkpLCBTVEMoMHg3N2NiYzNmMiksIFNUQygweDdmZDg4NzhlKSwgU1RDKDB4N2Y2MjM2OGYpLAorICAgIFNUQygweDdlOWQ1NWZjKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3YzI5ZmJlZSksIFNUQygweDdhN2QwNTViKSwKKyAgICBTVEMoMHg3ODg0ODQxNCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzNiNWViZDEpLCBTVEMoMHg3MGUyY2JjNiksCisgICAgU1RDKDB4NmRjYTBkMTQpLCBTVEMoMHg3ZmI5ZDc1OSksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2Q4YTVmNDApLAorICAgIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzkzNTAxYTkpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDcyY2NiOWRiKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2MDNjNDk2YyksCisgICAgU1RDKDB4N2Y5MjY2MWQpLCBTVEMoMHg3ZTRhNTQyNiksIFNUQygweDdjMjlmYmVlKSwgU1RDKDB4NzkzNTAxYTkpLAorICAgIFNUQygweDc1NzA3NWFjKSwgU1RDKDB4NzBlMmNiYzYpLCBTVEMoMHg2YjkzZDAyZSksIFNUQygweDY1OGM5YTJkKSwKKyAgICBTVEMoMHg1ZWQ3N2M4YSksIFNUQygweDU3N2ZmM2RhKSwgU1RDKDB4NGY5MjkyZGMpLCBTVEMoMHg3ZjYyMzY4ZiksCisgICAgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3YTdkMDU1YiksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzBlMmNiYzYpLAorICAgIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NjJmMjAxYWMpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDUxMzNjYzk0KSwKKyAgICBTVEMoMHg0NzFjZWNlNyksIFNUQygweDNjNTZiYTcwKSwgU1RDKDB4N2YyOTRiZmQpLCBTVEMoMHg3Y2E4MDAzOCksCisgICAgU1RDKDB4Nzg4NDg0MTQpLCBTVEMoMHg3MmNjYjlkYiksIFNUQygweDZiOTNkMDJlKSwgU1RDKDB4NjJmMjAxYWMpLAorICAgIFNUQygweDU5MDQ0M2E3KSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg0MWNlMWU2NSksIFNUQygweDM0ZDM5NTdlKSwKKyAgICBTVEMoMHgyNzI3ZDQ4NiksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3NjQxYWYzZCksCisgICAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NGRlYmU0ZmUpLAorICAgIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDEwYjUxNTBmKSwKKyAgICBTVEMoMHg3ZTlkNTVmYyksIFNUQygweDdhN2QwNTViKSwgU1RDKDB4NzNiNWViZDEpLCBTVEMoMHg2YTZkOThhNCksCisgICAgU1RDKDB4NWVkNzdjOGEpLCBTVEMoMHg1MTMzY2M5NCksIFNUQygweDQxY2UxZTY1KSwgU1RDKDB4MzBmYmM1NGQpLAorICAgIFNUQygweDFmMTlmOTdiKSwgU1RDKDB4MGM4YmQzNWUpLCBTVEMoMHhmOWI4MjY4NCksIFNUQygweDdlNGE1NDI2KSwKKyAgICBTVEMoMHg3OTM1MDFhOSksIFNUQygweDcwZTJjYmM2KSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg1NzdmZjNkYSksCisgICAgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHgzNGQzOTU3ZSksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MGM4YmQzNWUpLAorICAgIFNUQygweGY3YTBkZWM5KSwgU1RDKDB4ZTJlZjJhM2UpLCBTVEMoMHg3ZGVlYWE3YSksIFNUQygweDc3Y2JjM2YyKSwKKyAgICBTVEMoMHg2ZGNhMGQxNCksIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4NGY5MjkyZGMpLCBTVEMoMHgzYzU2YmE3MCksCisgICAgU1RDKDB4MjcyN2Q0ODYpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweGY5YjgyNjg0KSwgU1RDKDB4ZTJlZjJhM2UpLAorICAgIFNUQygweGNkMTY5M2Y3KSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDZhNmQ5OGE0KSwKKyAgICBTVEMoMHg1YTgyNzk5YSksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgxOGY4YjgzYyksCisgICAgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlNzA3NDdjNCksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4YjhlMzEzMTkpLAorICAgIFNUQygweDdkMWQ3OTU4KSwgU1RDKDB4NzQ5NzJmOTIpLCBTVEMoMHg2NmNmODEyMCksIFNUQygweDU0NjU3MTk0KSwKKyAgICBTVEMoMHgzZTJkN2ViMSksIFNUQygweDI1MjgwYzVlKSwgU1RDKDB4MGE3NWQ2MGUpLCBTVEMoMHhlZjRhZWFmMSksCisgICAgU1RDKDB4ZDRlMGNiMTUpLCBTVEMoMHhiYzY4NDVjZSksIFNUQygweGE2ZmJiYzU5KSwgU1RDKDB4N2NhODAwMzgpLAorICAgIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NjJmMjAxYWMpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDM0ZDM5NTdlKSwKKyAgICBTVEMoMHgxOGY4YjgzYyksIFNUQygweGZiY2ZkYzcxKSwgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhjM2E5NDU5MCksCisgICAgU1RDKDB4YWI5YThlNmMpLCBTVEMoMHg5N2Y0YTNjZCksIFNUQygweDdjMjlmYmVlKSwgU1RDKDB4NzBlMmNiYzYpLAorICAgIFNUQygweDVlZDc3YzhhKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHgyYjFmMzRlYiksIFNUQygweDBjOGJkMzVlKSwKKyAgICBTVEMoMHhlZDM3ZWY5MSksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4YjNjMDIwMGMpLCBTVEMoMHg5ZDBkZmU1NCksCisgICAgU1RDKDB4OGM0YTE0MmYpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGRlZGYwNDdkKSwKKyAgICBTVEMoMHhjMDAwMDAwMCksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4OTEyNjE0NWYpLCBTVEMoMHg4NDVjOGFlMyksCisgICAgU1RDKDB4N2IxNDc0ZmQpLCBTVEMoMHg2Y2IyYTgzNyksIFNUQygweDU1ZjVhNGQyKSwgU1RDKDB4Mzg5Y2VhNzIpLAorICAgIFNUQygweDE2ZWEwNjQ2KSwgU1RDKDB4ZjM3NDJjYTIpLCBTVEMoMHhkMGY1M2NlMCksIFNUQygweGIyMTQxYjAyKSwKKyAgICBTVEMoMHg5OTMwN2VlMCksIFNUQygweDg4MzQzYzBlKSwgU1RDKDB4ODA2ZDk5ZTMpLCBTVEMoMHg3YTdkMDU1YiksCisgICAgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg1MTMzY2M5NCksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MGM4YmQzNWUpLAorICAgIFNUQygweGU3MDc0N2M0KSwgU1RDKDB4YzNhOTQ1OTApLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDhmMWQzNDNhKSwKKyAgICBTVEMoMHg4Mjc1YTBjMCksIFNUQygweDgwOWRjOTcxKSwgU1RDKDB4NzlkZDMwOTgpLCBTVEMoMHg2ODBiNWMzMyksCisgICAgU1RDKDB4NGMzZmRmZjQpLCBTVEMoMHgyOTI0ZWRhYyksIFNUQygweDAyMTgyNDI3KSwgU1RDKDB4ZGFkN2YzYTIpLAorICAgIFNUQygweGI3MjdiOWY3KSwgU1RDKDB4OWE3MzY1ZDMpLCBTVEMoMHg4NzdiN2JlYyksIFNUQygweDgwMTE4YjVlKSwKKyAgICBTVEMoMHg4NGViOGIwMyksIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg0NzFjZWNlNyksCisgICAgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHhmN2EwZGVjOSksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4YWI5YThlNmMpLAorICAgIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4ODI3NWEwYzApLCBTVEMoMHg4MTE4NTViNCksIFNUQygweDhkMzM0NjI1KSwKKyAgICBTVEMoMHg3ODg0ODQxNCksIFNUQygweDYyZjIwMWFjKSwgU1RDKDB4NDFjZTFlNjUpLCBTVEMoMHgxOGY4YjgzYyksCisgICAgU1RDKDB4ZWQzN2VmOTEpLCBTVEMoMHhjM2E5NDU5MCksIFNUQygweGExMjg4Mzc2KSwgU1RDKDB4ODliZTUwYzMpLAorICAgIFNUQygweDgwMjc3ODcyKSwgU1RDKDB4ODU4MmZhYTUpLCBTVEMoMHg5OTMwN2VlMCksIFNUQygweDc3Y2JjM2YyKSwKKyAgICBTVEMoMHg2MDNjNDk2YyksIFNUQygweDNjNTZiYTcwKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHhlMmVmMmEzZSksCisgICAgU1RDKDB4YjhlMzEzMTkpLCBTVEMoMHg5N2Y0YTNjZCksIFNUQygweDg0NWM4YWUzKSwgU1RDKDB4ODA5ZGM5NzEpLAorICAgIFNUQygweDhkMzM0NjI1KSwgU1RDKDB4YTg4MDBjMjYpLCBTVEMoMHg3NzBhY2RlYyksIFNUQygweDVkNmMyZjk5KSwKKyAgICBTVEMoMHgzNmJhMjAxNCksIFNUQygweDA4NWYyMTM3KSwgU1RDKDB4ZDhkODJiN2EpLCBTVEMoMHhhZWNjMzM2YyksCisgICAgU1RDKDB4OTAxZGNlYzQpLCBTVEMoMHg4MTE4NTViNCksIFNUQygweDgzZDYwNDEyKSwgU1RDKDB4OTdmNGEzY2QpLAorICAgIFNUQygweGJhYTM0YmY0KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDMwZmJjNTRkKSwKKyAgICBTVEMoMHgwMDAwMDAwMCksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg4OWJlNTBjMyksCisgICAgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHg4OWJlNTBjMyksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4Y2YwNDNhYjMpLAorICAgIFNUQygweDc1NzA3NWFjKSwgU1RDKDB4NTc3ZmYzZGEpLCBTVEMoMHgyYjFmMzRlYiksIFNUQygweGY3YTBkZWM5KSwKKyAgICBTVEMoMHhjNTg0MmM3ZSksIFNUQygweDlkMGRmZTU0KSwgU1RDKDB4ODRlYjhiMDMpLCBTVEMoMHg4MTE4NTViNCksCisgICAgU1RDKDB4OTIzNWYyZWMpLCBTVEMoMHhiNTcxNWVlZiksIFNUQygweGU0ZmE0YmYxKSwgU1RDKDB4NzQ5NzJmOTIpLAorICAgIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4MjUyODBjNWUpLCBTVEMoMHhlZjRhZWFmMSksIFNUQygweGJjNjg0NWNlKSwKKyAgICBTVEMoMHg5NTkyNjc1YyksIFNUQygweDgxYjVhYmRhKSwgU1RDKDB4ODQ1YzhhZTMpLCBTVEMoMHg5ZDBkZmU1NCksCisgICAgU1RDKDB4Yzc2MzE1OGUpLCBTVEMoMHhmYmNmZGM3MSksIFNUQygweDczYjVlYmQxKSwgU1RDKDB4NTEzM2NjOTQpLAorICAgIFNUQygweDFmMTlmOTdiKSwgU1RDKDB4ZTcwNzQ3YzQpLCBTVEMoMHhiM2MwMjAwYyksIFNUQygweDhmMWQzNDNhKSwKKyAgICBTVEMoMHg4MDI3Nzg3MiksIFNUQygweDg5YmU1MGMzKSwgU1RDKDB4YWEwYTViMmUpLCBTVEMoMHhkYWQ3ZjNhMiksCisgICAgU1RDKDB4MTJjODEwNmYpLCBTVEMoMHg3MmNjYjlkYiksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4MThmOGI4M2MpLAorICAgIFNUQygweGRlZGYwNDdkKSwgU1RDKDB4YWI5YThlNmMpLCBTVEMoMHg4OWJlNTBjMyksIFNUQygweDgwNDYyOGE3KSwKKyAgICBTVEMoMHg5MTI2MTQ1ZiksIFNUQygweGI4ZTMxMzE5KSwgU1RDKDB4ZWY0YWVhZjEpLCBTVEMoMHgyOTI0ZWRhYyksCisgICAgU1RDKDB4NzFkYmE5YWIpLCBTVEMoMHg0YThlYTExMSksIFNUQygweDEyYzgxMDZmKSwgU1RDKDB4ZDZkYjEyNTQpLAorICAgIFNUQygweGE0MDU4NDdlKSwgU1RDKDB4ODU4MmZhYTUpLCBTVEMoMHg4MjExNTU4NiksIFNUQygweDlhNzM2NWQzKSwKKyAgICBTVEMoMHhjOTQ1ZGZlYyksIFNUQygweDA0MzAyMzhmKSwgU1RDKDB4M2UyZDdlYjEpLCBTVEMoMHg3MGUyY2JjNiksCisgICAgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHgwYzhiZDM1ZSksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4OWQwZGZlNTQpLAorICAgIFNUQygweDgyNzVhMGMwKSwgU1RDKDB4ODU4MmZhYTUpLCBTVEMoMHhhNTdkODY2NiksIFNUQygweGRhZDdmM2EyKSwKKyAgICBTVEMoMHgxOGY4YjgzYyksIFNUQygweDUxMzNjYzk0KSwgU1RDKDB4NmZlMjMxM2MpLCBTVEMoMHg0Mzk3YmEzMiksCisgICAgU1RDKDB4MDY0N2Q5N2MpLCBTVEMoMHhjNzYzMTU4ZSksIFNUQygweDk2YmZlYTNkKSwgU1RDKDB4ODA5ZGM5NzEpLAorICAgIFNUQygweDhhOGY4YTU0KSwgU1RDKDB4YjIxNDFiMDIpLCBTVEMoMHhlZDM3ZWY5MSksIFNUQygweDJkMTY4NzkyKSwKKyAgICBTVEMoMHg2MTlhN2RjZSksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzM4NFtdID0geworICAgIFNUQygweDAyMTgyNDI3KSwgU1RDKDB4MDQzMDIzOGYpLCBTVEMoMHgwNjQ3ZDk3YyksIFNUQygweDA4NWYyMTM3KSwKKyAgICBTVEMoMHgwYTc1ZDYwZSksIFNUQygweDBjOGJkMzVlKSwgU1RDKDB4MGVhMGY0OGMpLCBTVEMoMHgxMGI1MTUwZiksCisgICAgU1RDKDB4MTJjODEwNmYpLCBTVEMoMHgxNGQ5YzI0NSksIFNUQygweDE2ZWEwNjQ2KSwgU1RDKDB4MDQzMDIzOGYpLAorICAgIFNUQygweDA4NWYyMTM3KSwgU1RDKDB4MGM4YmQzNWUpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweDE0ZDljMjQ1KSwKKyAgICBTVEMoMHgxOGY4YjgzYyksIFNUQygweDFkMTBkNWMyKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgyNTI4MGM1ZSksCisgICAgU1RDKDB4MjkyNGVkYWMpLCBTVEMoMHgyZDE2ODc5MiksIFNUQygweDA2NDdkOTdjKSwgU1RDKDB4MGM4YmQzNWUpLAorICAgIFNUQygweDEyYzgxMDZmKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgxZjE5Zjk3YiksIFNUQygweDI1MjgwYzVlKSwKKyAgICBTVEMoMHgyYjFmMzRlYiksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MzZiYTIwMTQpLCBTVEMoMHgzYzU2YmE3MCksCisgICAgU1RDKDB4NDFjZTFlNjUpLCBTVEMoMHgwODVmMjEzNyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MThmOGI4M2MpLAorICAgIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MjkyNGVkYWMpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDM4OWNlYTcyKSwKKyAgICBTVEMoMHg0MDAwMDAwMCksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg1NDY1NzE5NCksCisgICAgU1RDKDB4MGE3NWQ2MGUpLCBTVEMoMHgxNGQ5YzI0NSksIFNUQygweDFmMTlmOTdiKSwgU1RDKDB4MjkyNGVkYWMpLAorICAgIFNUQygweDMyZTk2YzA5KSwgU1RDKDB4M2M1NmJhNzApLCBTVEMoMHg0NTVjYjQwYyksIFNUQygweDRkZWJlNGZlKSwKKyAgICBTVEMoMHg1NWY1YTRkMiksIFNUQygweDVkNmMyZjk5KSwgU1RDKDB4NjQ0MmJkN2UpLCBTVEMoMHgwYzhiZDM1ZSksCisgICAgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgyNTI4MGM1ZSksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4M2M1NmJhNzApLAorICAgIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4NTEzM2NjOTQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDYyZjIwMWFjKSwKKyAgICBTVEMoMHg2YTZkOThhNCksIFNUQygweDcwZTJjYmM2KSwgU1RDKDB4MGVhMGY0OGMpLCBTVEMoMHgxZDEwZDVjMiksCisgICAgU1RDKDB4MmIxZjM0ZWIpLCBTVEMoMHgzODljZWE3MiksIFNUQygweDQ1NWNiNDBjKSwgU1RDKDB4NTEzM2NjOTQpLAorICAgIFNUQygweDViZmE3YjgyKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2ZGNhMGQxNCksIFNUQygweDc0OTcyZjkyKSwKKyAgICBTVEMoMHg3OWRkMzA5OCksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjU4YzlhMmQpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdlZTdhYTRjKSwKKyAgICBTVEMoMHgxMmM4MTA2ZiksIFNUQygweDI1MjgwYzVlKSwgU1RDKDB4MzZiYTIwMTQpLCBTVEMoMHg0NzFjZWNlNyksCisgICAgU1RDKDB4NTVmNWE0ZDIpLCBTVEMoMHg2MmYyMDFhYyksIFNUQygweDZkY2EwZDE0KSwgU1RDKDB4NzY0MWFmM2QpLAorICAgIFNUQygweDdjMjlmYmVlKSwgU1RDKDB4N2Y2MjM2OGYpLCBTVEMoMHg3ZmQ4ODc4ZSksIFNUQygweDE0ZDljMjQ1KSwKKyAgICBTVEMoMHgyOTI0ZWRhYyksIFNUQygweDNjNTZiYTcwKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg1ZDZjMmY5OSksCisgICAgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg3NDk3MmY5MiksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2Y2MjM2OGYpLAorICAgIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2NhODAwMzgpLCBTVEMoMHgxNmVhMDY0NiksIFNUQygweDJkMTY4NzkyKSwKKyAgICBTVEMoMHg0MWNlMWU2NSksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NjQ0MmJkN2UpLCBTVEMoMHg3MGUyY2JjNiksCisgICAgU1RDKDB4NzlkZDMwOTgpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdmZDg4NzhlKSwgU1RDKDB4N2NhODAwMzgpLAorICAgIFNUQygweDc1NzA3NWFjKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDQ3MWNlY2U3KSwKKyAgICBTVEMoMHg1YTgyNzk5YSksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3ZDhhNWY0MCksCisgICAgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NmE2ZDk4YTQpLAorICAgIFNUQygweDFiMDViNDBmKSwgU1RDKDB4MzRkMzk1N2UpLCBTVEMoMHg0YzNmZGZmNCksIFNUQygweDYwM2M0OTZjKSwKKyAgICBTVEMoMHg2ZmUyMzEzYyksIFNUQygweDdhN2QwNTViKSwgU1RDKDB4N2Y5MjY2MWQpLCBTVEMoMHg3ZWU3YWE0YyksCisgICAgU1RDKDB4Nzg4NDg0MTQpLCBTVEMoMHg2Y2IyYTgzNyksIFNUQygweDViZmE3YjgyKSwgU1RDKDB4MWQxMGQ1YzIpLAorICAgIFNUQygweDM4OWNlYTcyKSwgU1RDKDB4NTEzM2NjOTQpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDc0OTcyZjkyKSwKKyAgICBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdmZWU3NGEyKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3MGUyY2JjNiksCisgICAgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg0YThlYTExMSksIFNUQygweDFmMTlmOTdiKSwgU1RDKDB4M2M1NmJhNzApLAorICAgIFNUQygweDU1ZjVhNGQyKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg3ODg0ODQxNCksIFNUQygweDdmNjIzNjhmKSwKKyAgICBTVEMoMHg3ZTlkNTVmYyksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NjZjZjgxMjApLCBTVEMoMHg1MTMzY2M5NCksCisgICAgU1RDKDB4MzZiYTIwMTQpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdiYTM3NTFkKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgyMTIwZmI4MyksCisgICAgU1RDKDB4MjMyNWI4NDcpLCBTVEMoMHg0Mzk3YmEzMiksIFNUQygweDVlZDc3YzhhKSwgU1RDKDB4NzJjY2I5ZGIpLAorICAgIFNUQygweDdkZWVhYTdhKSwgU1RDKDB4N2Y2MjM2OGYpLCBTVEMoMHg3NzBhY2RlYyksIFNUQygweDY1OGM5YTJkKSwKKyAgICBTVEMoMHg0YzNmZGZmNCksIFNUQygweDJkMTY4NzkyKSwgU1RDKDB4MGE3NWQ2MGUpLCBTVEMoMHgyNTI4MGM1ZSksCisgICAgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg2MmYyMDFhYyksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2Y2MjM2OGYpLAorICAgIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4NzBlMmNiYzYpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDNjNTZiYTcwKSwKKyAgICBTVEMoMHgxOGY4YjgzYyksIFNUQygweGYzNzQyY2EyKSwgU1RDKDB4MjcyN2Q0ODYpLCBTVEMoMHg0YThlYTExMSksCisgICAgU1RDKDB4NjZjZjgxMjApLCBTVEMoMHg3OTM1MDFhOSksIFNUQygweDdmZmI5ZDE1KSwgU1RDKDB4N2E3ZDA1NWIpLAorICAgIFNUQygweDY5NDAxNWMzKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHgyYjFmMzRlYiksIFNUQygweDA0MzAyMzhmKSwKKyAgICBTVEMoMHhkY2RhNDdiOSksIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg2YTZkOThhNCksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZmI5ZDc1OSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NjAzYzQ5NmMpLAorICAgIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHhlZjRhZWFmMSksIFNUQygweGM3NjMxNThlKSwKKyAgICBTVEMoMHgyYjFmMzRlYiksIFNUQygweDUxMzNjYzk0KSwgU1RDKDB4NmRjYTBkMTQpLCBTVEMoMHg3ZDhhNWY0MCksCisgICAgU1RDKDB4N2U5ZDU1ZmMpLCBTVEMoMHg3MGUyY2JjNiksIFNUQygweDU1ZjVhNGQyKSwgU1RDKDB4MzBmYmM1NGQpLAorICAgIFNUQygweDA2NDdkOTdjKSwgU1RDKDB4ZGFkN2YzYTIpLCBTVEMoMHhiM2MwMjAwYyksIFNUQygweDJkMTY4NzkyKSwKKyAgICBTVEMoMHg1NDY1NzE5NCksIFNUQygweDcwZTJjYmM2KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3Y2E4MDAzOCksCisgICAgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg0YThlYTExMSksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4ZjM3NDJjYTIpLAorICAgIFNUQygweGM3NjMxNThlKSwgU1RDKDB4YTI5M2QwNjcpLCBTVEMoMHgyZjBhYzMyMCksIFNUQygweDU3N2ZmM2RhKSwKKyAgICBTVEMoMHg3M2I1ZWJkMSksIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4NzlkZDMwOTgpLCBTVEMoMHg2MmYyMDFhYyksCisgICAgU1RDKDB4M2UyZDdlYjEpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweGUwZTYwNjg1KSwgU1RDKDB4YjU3MTVlZWYpLAorICAgIFNUQygweDk0NmMyZmQyKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDc2NDFhZjNkKSwKKyAgICBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhjZjA0M2FiMyksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4ODliZTUwYzMpLAorICAgIFNUQygweDMyZTk2YzA5KSwgU1RDKDB4NWQ2YzJmOTkpLCBTVEMoMHg3ODg0ODQxNCksIFNUQygweDdmYjlkNzU5KSwKKyAgICBTVEMoMHg3MWRiYTlhYiksIFNUQygweDUxMzNjYzk0KSwgU1RDKDB4MjMyNWI4NDcpLCBTVEMoMHhlZjRhZWFmMSksCisgICAgU1RDKDB4YmUzMWUxOWIpLCBTVEMoMHg5N2Y0YTNjZCksIFNUQygweDgyZTI4NmE4KSwgU1RDKDB4MzRkMzk1N2UpLAorICAgIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4N2E3ZDA1NWIpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDZjYjJhODM3KSwKKyAgICBTVEMoMHg0NzFjZWNlNyksIFNUQygweDE0ZDljMjQ1KSwgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhhZWNjMzM2YyksCisgICAgU1RDKDB4OGQzMzQ2MjUpLCBTVEMoMHg4MDExOGI1ZSksIFNUQygweDM2YmEyMDE0KSwgU1RDKDB4NjJmMjAxYWMpLAorICAgIFNUQygweDdjMjlmYmVlKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg2NmNmODEyMCksIFNUQygweDNjNTZiYTcwKSwKKyAgICBTVEMoMHgwNjQ3ZDk3YyksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4YTEyODgzNzYpLCBTVEMoMHg4NTgyZmFhNSksCisgICAgU1RDKDB4ODE2MmFhMDQpLCBTVEMoMHgzODljZWE3MiksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4N2Q4YTVmNDApLAorICAgIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweGY3YTBkZWM5KSwKKyAgICBTVEMoMHhjMDAwMDAwMCksIFNUQygweDk1OTI2NzVjKSwgU1RDKDB4ODExODU1YjQpLCBTVEMoMHg4NmNhZmU1NyksCisgICAgU1RDKDB4M2E3YmQzODIpLCBTVEMoMHg2ODBiNWMzMyksIFNUQygweDdlOWQ1NWZjKSwgU1RDKDB4NzkzNTAxYTkpLAorICAgIFNUQygweDU5MDQ0M2E3KSwgU1RDKDB4MjUyODBjNWUpLCBTVEMoMHhlOTE1ZjliYSksIFNUQygweGIyMTQxYjAyKSwKKyAgICBTVEMoMHg4YzRhMTQyZiksIFNUQygweDgwMTE4YjVlKSwgU1RDKDB4OTAxZGNlYzQpLCBTVEMoMHgzYzU2YmE3MCksCisgICAgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg3ZjYyMzY4ZiksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NTEzM2NjOTQpLAorICAgIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4ZGFkN2YzYTIpLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDg1ODJmYWE1KSwKKyAgICBTVEMoMHg4Mjc1YTBjMCksIFNUQygweDlkMGRmZTU0KSwgU1RDKDB4M2UyZDdlYjEpLCBTVEMoMHg2Y2IyYTgzNyksCisgICAgU1RDKDB4N2ZkODg3OGUpLCBTVEMoMHg3MmNjYjlkYiksIFNUQygweDQ4ZDg0NjA5KSwgU1RDKDB4MGM4YmQzNWUpLAorICAgIFNUQygweGNkMTY5M2Y3KSwgU1RDKDB4OWE3MzY1ZDMpLCBTVEMoMHg4MTYyYWEwNCksIFNUQygweDg4MzQzYzBlKSwKKyAgICBTVEMoMHhhZDMwOGE3MSksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDYwW10gPSB7CisgICAgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2QzM2YwY2EpLAorICAgIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDY3OGRkZTZlKSwKKyAgICBTVEMoMHg0YjNjOGMxMiksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4Njc4ZGRlNmUpLAorICAgIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDBkNjEzMDRlKSwKKyAgICBTVEMoMHhiNGMzNzNlZSksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4ZjI5ZWNmYjIpLCBTVEMoMHg5ODcyMjE5MiksCisgICAgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHhkODcyMjE5MiksIFNUQygweDg2NDNjN2IzKSwgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweGMwMDAwMDAwKSwgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweGFhNTllZGE0KSwKKyAgICBTVEMoMHg4NjQzYzdiMyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4OTg3MjIxOTIpLCBTVEMoMHg5ODcyMjE5MiksCisgICAgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHg4YjEwZjE0NCksIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4MGQ2MTMwNGUpLAorICAgIFNUQygweDgyY2MwZjM2KSwgU1RDKDB4ZDg3MjIxOTIpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWc2MFtdID0geworICAgIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDFhOWNkOWFjKSwKKyAgICBTVEMoMHgzNDBmZjI0MiksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksCisgICAgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NzliYzM4NGQpLAorICAgIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDRiM2M4YzEyKSwKKyAgICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg3ZjRjN2U1NCksCisgICAgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4NGIzYzhjMTIpLAorICAgIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg1ZjFmNWVhMSksCisgICAgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4YjRjMzczZWUpLAorICAgIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg5ODcyMjE5MiksIFNUQygweDdmNGM3ZTU0KSwKKyAgICBTVEMoMHgxYTljZDlhYyksIFNUQygweDg2NDNjN2IzKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMTIwW10gPSB7CisgICAgU1RDKDB4N2ZkMzE3YjQpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2QzM2YwY2EpLAorICAgIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDdmNGM3ZTU0KSwKKyAgICBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg2ZWQ5ZWJhMSksCisgICAgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4NzliYzM4NGQpLAorICAgIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRiM2M4YzEyKSwKKyAgICBTVEMoMHgzYTFjNWM1NyksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MGQ2MTMwNGUpLAorICAgIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDQwMDAwMDAwKSwKKyAgICBTVEMoMHgyMTIwZmI4MyksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MDAwMDAwMDApLAorICAgIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDVmMWY1ZWExKSwKKyAgICBTVEMoMHgzYTFjNWM1NyksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhiNGMzNzNlZSksCisgICAgU1RDKDB4OTRhNjcxNWQpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4Mjc4ZGRlNmUpLAorICAgIFNUQygweGYyOWVjZmIyKSwgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHg5ODcyMjE5MiksIFNUQygweDgyY2MwZjM2KSwKKyAgICBTVEMoMHg3MjBjODA3NSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHhkODcyMjE5MiksCisgICAgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg4NjQzYzdiMyksIFNUQygweDgxOTM2ZGFmKSwgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhjMDAwMDAwMCksIFNUQygweDkxMjYxNDVmKSwKKyAgICBTVEMoMHg4MDAwMDAwMCksIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4NmI1OThlYTMpLCBTVEMoMHgzNDBmZjI0MiksCisgICAgU1RDKDB4ZWJmOWY0OTgpLCBTVEMoMHhhYTU5ZWRhNCksIFNUQygweDg0NWM4YWUzKSwgU1RDKDB4ODY0M2M3YjMpLAorICAgIFNUQygweGFmNzI2ZGVmKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweGQ4NzIyMTkyKSwKKyAgICBTVEMoMHg5ODcyMjE5MiksIFNUQygweDgwMDAwMDAwKSwgU1RDKDB4OTg3MjIxOTIpLCBTVEMoMHhkODcyMjE5MiksCisgICAgU1RDKDB4NjM3OTg0ZDQpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweGM1ZTNhM2E5KSwgU1RDKDB4OGIxMGYxNDQpLAorICAgIFNUQygweDg0NWM4YWUzKSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHgwNmIyZjFkMiksIFNUQygweDVmMWY1ZWExKSwKKyAgICBTVEMoMHgwZDYxMzA0ZSksIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4ODJjYzBmMzYpLCBTVEMoMHg5MTI2MTQ1ZiksCisgICAgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHgzNDBmZjI0MiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzEyMFtdID0geworICAgIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDFhOWNkOWFjKSwKKyAgICBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgwZDYxMzA0ZSksCisgICAgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDI3OGRkZTZlKSwKKyAgICBTVEMoMHgzYTFjNWM1NyksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NGIzYzhjMTIpLAorICAgIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdmNGM3ZTU0KSwKKyAgICBTVEMoMHgyMTIwZmI4MyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2ZWQ5ZWJhMSksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4Mjc4ZGRlNmUpLAorICAgIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdmZmZmZmZmKSwKKyAgICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHg1NWE2MTI1YyksCisgICAgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4Njc4ZGRlNmUpLAorICAgIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDc5YmMzODRkKSwKKyAgICBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgxYTljZDlhYyksCisgICAgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4NzliYzM4NGQpLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHhlYmY5ZjQ5OCksIFNUQygweDQwMDAwMDAwKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhjMDAwMDAwMCksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4NzRlZjBlYmMpLAorICAgIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweGQ4NzIyMTkyKSwKKyAgICBTVEMoMHg5Yzg2N2IyYyksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4ODY0M2M3YjMpLAorICAgIFNUQygweDUwOGQ5MjExKSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDM0MGZmMjQyKSwKKyAgICBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweDk4NzIyMTkyKSwgU1RDKDB4ODAyY2U4NGMpLCBTVEMoMHg1NWE2MTI1YyksCisgICAgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4YzAwMDAwMDApLAorICAgIFNUQygweDg2NDNjN2IzKSwgU1RDKDB4OGIxMGYxNDQpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWwxOTJbXSA9IHsKKyAgICBTVEMoMHg3ZmVlNzRhMiksIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2Y2MjM2OGYpLCBTVEMoMHg3ZWU3YWE0YyksCisgICAgU1RDKDB4N2U0YTU0MjYpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdjYTgwMDM4KSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDdhN2QwNTViKSwgU1RDKDB4NzkzNTAxYTkpLCBTVEMoMHg3N2NiYzNmMiksIFNUQygweDc2NDFhZjNkKSwKKyAgICBTVEMoMHg3NDk3MmY5MiksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NzBlMmNiYzYpLCBTVEMoMHg3ZmI5ZDc1OSksCisgICAgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzkzNTAxYTkpLAorICAgIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzJjY2I5ZGIpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDZhNmQ5OGE0KSwKKyAgICBTVEMoMHg2NThjOWEyZCksIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1NDY1NzE5NCksCisgICAgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDdmNjIzNjhmKSwgU1RDKDB4N2Q4YTVmNDApLAorICAgIFNUQygweDdhN2QwNTViKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3MGUyY2JjNiksIFNUQygweDZhNmQ5OGE0KSwKKyAgICBTVEMoMHg2MmYyMDFhYyksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NTEzM2NjOTQpLCBTVEMoMHg0NzFjZWNlNyksCisgICAgU1RDKDB4M2M1NmJhNzApLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDI1MjgwYzVlKSwgU1RDKDB4MThmOGI4M2MpLAorICAgIFNUQygweDBjOGJkMzVlKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0ZGViZTRmZSksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MTBiNTE1MGYpLAorICAgIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZWY0YWVhZjEpLCBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweGNmMDQzYWIzKSwKKyAgICBTVEMoMHg3ZTRhNTQyNiksIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4NzBlMmNiYzYpLCBTVEMoMHg2NThjOWEyZCksCisgICAgU1RDKDB4NTc3ZmYzZGEpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDM0ZDM5NTdlKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDBjOGJkMzVlKSwgU1RDKDB4ZjdhMGRlYzkpLCBTVEMoMHhlMmVmMmEzZSksIFNUQygweGNmMDQzYWIzKSwKKyAgICBTVEMoMHhiYzY4NDVjZSksIFNUQygweGFiOWE4ZTZjKSwgU1RDKDB4OWQwZGZlNTQpLCBTVEMoMHg3ZDhhNWY0MCksCisgICAgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDcxY2VjZTcpLAorICAgIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGU3MDc0N2M0KSwKKyAgICBTVEMoMHhjZjA0M2FiMyksIFNUQygweGI4ZTMxMzE5KSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg5NTkyNjc1YyksCisgICAgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHg4Mjc1YTBjMCksIFNUQygweDdjYTgwMDM4KSwgU1RDKDB4NzJjY2I5ZGIpLAorICAgIFNUQygweDYyZjIwMWFjKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHgzNGQzOTU3ZSksIFNUQygweDE4ZjhiODNjKSwKKyAgICBTVEMoMHhmYmNmZGM3MSksIFNUQygweGRlZGYwNDdkKSwgU1RDKDB4YzNhOTQ1OTApLCBTVEMoMHhhYjlhOGU2YyksCisgICAgU1RDKDB4OTdmNGEzY2QpLCBTVEMoMHg4OWJlNTBjMyksIFNUQygweDgxYjVhYmRhKSwgU1RDKDB4ODA0NjI4YTcpLAorICAgIFNUQygweDg1ODJmYWE1KSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg0MDAwMDAwMCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhkZWRmMDQ3ZCksCisgICAgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4ODQ1YzhhZTMpLAorICAgIFNUQygweDgwMDAwMDAwKSwgU1RDKDB4ODQ1YzhhZTMpLCBTVEMoMHg5MTI2MTQ1ZiksIFNUQygweGE1N2Q4NjY2KSwKKyAgICBTVEMoMHg3YTdkMDU1YiksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NTEzM2NjOTQpLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4MGM4YmQzNWUpLCBTVEMoMHhlNzA3NDdjNCksIFNUQygweGMzYTk0NTkwKSwgU1RDKDB4YTU3ZDg2NjYpLAorICAgIFNUQygweDhmMWQzNDNhKSwgU1RDKDB4ODI3NWEwYzApLCBTVEMoMHg4MDlkYzk3MSksIFNUQygweDg5YmU1MGMzKSwKKyAgICBTVEMoMHg5ZDBkZmU1NCksIFNUQygweGI4ZTMxMzE5KSwgU1RDKDB4ZGFkN2YzYTIpLCBTVEMoMHg3OTM1MDFhOSksCisgICAgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4ZjdhMGRlYzkpLAorICAgIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4YWI5YThlNmMpLCBTVEMoMHg5MTI2MTQ1ZiksIFNUQygweDgyNzVhMGMwKSwKKyAgICBTVEMoMHg4MTE4NTViNCksIFNUQygweDhkMzM0NjI1KSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHhjNzYzMTU4ZSksCisgICAgU1RDKDB4ZWY0YWVhZjEpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDc3Y2JjM2YyKSwgU1RDKDB4NjAzYzQ5NmMpLAorICAgIFNUQygweDNjNTZiYTcwKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHhlMmVmMmEzZSksIFNUQygweGI4ZTMxMzE5KSwKKyAgICBTVEMoMHg5N2Y0YTNjZCksIFNUQygweDg0NWM4YWUzKSwgU1RDKDB4ODA5ZGM5NzEpLCBTVEMoMHg4ZDMzNDYyNSksCisgICAgU1RDKDB4YTg4MDBjMjYpLCBTVEMoMHhjZjA0M2FiMyksIFNUQygweGZiY2ZkYzcxKSwgU1RDKDB4MjkyNGVkYWMpLAorICAgIFNUQygweDUxMzNjYzk0KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMTkyW10gPSB7CisgICAgU1RDKDB4MDQzMDIzOGYpLCBTVEMoMHgwODVmMjEzNyksIFNUQygweDBjOGJkMzVlKSwgU1RDKDB4MTBiNTE1MGYpLAorICAgIFNUQygweDE0ZDljMjQ1KSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgxZDEwZDVjMiksIFNUQygweDIxMjBmYjgzKSwKKyAgICBTVEMoMHgyNTI4MGM1ZSksIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4MmQxNjg3OTIpLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4MzRkMzk1N2UpLCBTVEMoMHgzODljZWE3MiksIFNUQygweDNjNTZiYTcwKSwgU1RDKDB4MDg1ZjIxMzcpLAorICAgIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI5MjRlZGFjKSwKKyAgICBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDM4OWNlYTcyKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0NzFjZWNlNyksCisgICAgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg1NDY1NzE5NCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjAzYzQ5NmMpLAorICAgIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHgwYzhiZDM1ZSksIFNUQygweDE4ZjhiODNjKSwKKyAgICBTVEMoMHgyNTI4MGM1ZSksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4M2M1NmJhNzApLCBTVEMoMHg0NzFjZWNlNyksCisgICAgU1RDKDB4NTEzM2NjOTQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDYyZjIwMWFjKSwgU1RDKDB4NmE2ZDk4YTQpLAorICAgIFNUQygweDcwZTJjYmM2KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3YTdkMDU1YiksIFNUQygweDdkOGE1ZjQwKSwKKyAgICBTVEMoMHg3ZjYyMzY4ZiksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjU4YzlhMmQpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdlZTdhYTRjKSwKKyAgICBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3NjQxYWYzZCksCisgICAgU1RDKDB4MTRkOWMyNDUpLCBTVEMoMHgyOTI0ZWRhYyksIFNUQygweDNjNTZiYTcwKSwgU1RDKDB4NGRlYmU0ZmUpLAorICAgIFNUQygweDVkNmMyZjk5KSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg3NDk3MmY5MiksIFNUQygweDdiYTM3NTFkKSwKKyAgICBTVEMoMHg3ZjYyMzY4ZiksIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2NhODAwMzgpLCBTVEMoMHg3NjQxYWYzZCksCisgICAgU1RDKDB4NmNiMmE4MzcpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDUxMzNjYzk0KSwgU1RDKDB4MThmOGI4M2MpLAorICAgIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDZhNmQ5OGE0KSwKKyAgICBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZDhhNWY0MCksCisgICAgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDcxY2VjZTcpLAorICAgIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgxZDEwZDVjMiksIFNUQygweDM4OWNlYTcyKSwKKyAgICBTVEMoMHg1MTMzY2M5NCksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NzQ5NzJmOTIpLCBTVEMoMHg3ZDhhNWY0MCksCisgICAgU1RDKDB4N2ZlZTc0YTIpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDcwZTJjYmM2KSwgU1RDKDB4NjAzYzQ5NmMpLAorICAgIFNUQygweDRhOGVhMTExKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgxNGQ5YzI0NSksIFNUQygweGY3YTBkZWM5KSwKKyAgICBTVEMoMHhkYWQ3ZjNhMiksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDIxMjBmYjgzKSwKKyAgICBTVEMoMHgwMDAwMDAwMCksIFNUQygweGRlZGYwNDdkKSwgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHhhNTdkODY2NiksCisgICAgU1RDKDB4MjUyODBjNWUpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDYyZjIwMWFjKSwgU1RDKDB4NzY0MWFmM2QpLAorICAgIFNUQygweDdmNjIzNjhmKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3MGUyY2JjNiksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHgzYzU2YmE3MCksIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4ZjM3NDJjYTIpLCBTVEMoMHhjZjA0M2FiMyksCisgICAgU1RDKDB4YWVjYzMzNmMpLCBTVEMoMHg5NTkyNjc1YyksIFNUQygweDg1ODJmYWE1KSwgU1RDKDB4MjkyNGVkYWMpLAorICAgIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdmYjlkNzU5KSwKKyAgICBTVEMoMHg3NjQxYWYzZCksIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgxOGY4YjgzYyksCisgICAgU1RDKDB4ZWY0YWVhZjEpLCBTVEMoMHhjNzYzMTU4ZSksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4OGQzMzQ2MjUpLAorICAgIFNUQygweDgxMTg1NWI0KSwgU1RDKDB4ODI3NWEwYzApLCBTVEMoMHgyZDE2ODc5MiksIFNUQygweDU0NjU3MTk0KSwKKyAgICBTVEMoMHg3MGUyY2JjNiksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2NhODAwMzgpLCBTVEMoMHg2YTZkOThhNCksCisgICAgU1RDKDB4NGE4ZWExMTEpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweGYzNzQyY2EyKSwgU1RDKDB4Yzc2MzE1OGUpLAorICAgIFNUQygweGEyOTNkMDY3KSwgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHg4MDExOGI1ZSksIFNUQygweDg2Y2FmZTU3KSwKKyAgICBTVEMoMHg5ZDBkZmU1NCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDI0MFtdID0geworICAgIFNUQygweDdmZjRjNTZmKSwgU1RDKDB4N2ZkMzE3YjQpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdmNGM3ZTU0KSwKKyAgICBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2RkYjRiZmMpLCBTVEMoMHg3ZDMzZjBjYSksCisgICAgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdhYmE5YWU2KSwgU1RDKDB4NzliYzM4NGQpLAorICAgIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdmZDMxN2I0KSwKKyAgICBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3YmEzNzUxZCksCisgICAgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NzIwYzgwNzUpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4NmI1OThlYTMpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDYzNzk4NGQ0KSwKKyAgICBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZTZjOTI1MSksCisgICAgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzIwYzgwNzUpLAorICAgIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg1MzIxMWQxOCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgzYTFjNWM1NyksCisgICAgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4NzliYzM4NGQpLAorICAgIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVmMWY1ZWExKSwKKyAgICBTVEMoMHg1NWE2MTI1YyksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgzNDBmZjI0MiksCisgICAgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MDAwMDAwMDApLAorICAgIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg2NThjOWEyZCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MDAwMDAwMDApLAorICAgIFNUQygweGVmNGFlYWYxKSwgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhjZjA0M2FiMyksIFNUQygweDdlNmM5MjUxKSwKKyAgICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MTQwNjBiNjgpLAorICAgIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZWJmOWY0OTgpLCBTVEMoMHhkODcyMjE5MiksIFNUQygweGM1ZTNhM2E5KSwKKyAgICBTVEMoMHhiNGMzNzNlZSksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4N2RkYjRiZmMpLCBTVEMoMHg3NzdmOTAzYyksCisgICAgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4M2ExYzVjNTcpLAorICAgIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHhmNWY1MGQ2NyksIFNUQygweGRlZGYwNDdkKSwKKyAgICBTVEMoMHhjOGU1MDMyYiksIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4YTMyNmVlYzApLCBTVEMoMHg5NGE2NzE1ZCksCisgICAgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4Njc4ZGRlNmUpLAorICAgIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDBkNjEzMDRlKSwKKyAgICBTVEMoMHhmMjllY2ZiMiksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHhhYTU5ZWRhNCksCisgICAgU1RDKDB4OTg3MjIxOTIpLCBTVEMoMHg4YjEwZjE0NCksIFNUQygweDgyY2MwZjM2KSwgU1RDKDB4ODAwMDAwMDApLAorICAgIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDRiM2M4YzEyKSwKKyAgICBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4ZjVmNTBkNjcpLCBTVEMoMHhkODcyMjE5MiksCisgICAgU1RDKDB4YmQxZWM0NWMpLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDkyZGNhZmU1KSwgU1RDKDB4ODY0M2M3YjMpLAorICAgIFNUQygweDgwNjUwMzQ3KSwgU1RDKDB4ODE5MzZkYWYpLCBTVEMoMHg4OWJlNTBjMyksIFNUQygweDdiYTM3NTFkKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgyMTIwZmI4MyksCisgICAgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweGMwMDAwMDAwKSwgU1RDKDB4YTU3ZDg2NjYpLAorICAgIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4ODQ1YzhhZTMpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDg0NWM4YWUzKSwKKyAgICBTVEMoMHg5MTI2MTQ1ZiksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4N2FiYTlhZTYpLCBTVEMoMHg2YjU5OGVhMyksCisgICAgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4ZWJmOWY0OTgpLAorICAgIFNUQygweGM4ZTUwMzJiKSwgU1RDKDB4YWE1OWVkYTQpLCBTVEMoMHg5MmRjYWZlNSksIFNUQygweDg0NWM4YWUzKSwKKyAgICBTVEMoMHg4MDBiM2E5MSksIFNUQygweDg2NDNjN2IzKSwgU1RDKDB4OTY4MzA4NzYpLCBTVEMoMHhhZjcyNmRlZiksCisgICAgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NGIzYzhjMTIpLAorICAgIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhkODcyMjE5MiksIFNUQygweGI0YzM3M2VlKSwKKyAgICBTVEMoMHg5ODcyMjE5MiksIFNUQygweDg2NDNjN2IzKSwgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHg4NjQzYzdiMyksCisgICAgU1RDKDB4OTg3MjIxOTIpLCBTVEMoMHhiNGMzNzNlZSksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4MDAwMDAwMDApLAorICAgIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4NjM3OTg0ZDQpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDFhOWNkOWFjKSwKKyAgICBTVEMoMHhlZjRhZWFmMSksIFNUQygweGM1ZTNhM2E5KSwgU1RDKDB4YTMyNmVlYzApLCBTVEMoMHg4YjEwZjE0NCksCisgICAgU1RDKDB4ODA2NTAzNDcpLCBTVEMoMHg4NDVjOGFlMyksIFNUQygweDk2ODMwODc2KSwgU1RDKDB4YjRjMzczZWUpLAorICAgIFNUQygweGRiYTU2MjliKSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDc3N2Y5MDNjKSwKKyAgICBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHhkZWRmMDQ3ZCksCisgICAgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHg5NGE2NzE1ZCksIFNUQygweDgyY2MwZjM2KSwgU1RDKDB4ODE5MzZkYWYpLAorICAgIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4YWY3MjZkZWYpLCBTVEMoMHhkODcyMjE5MiksIFNUQygweDA2YjJmMWQyKSwKKyAgICBTVEMoMHgzNDBmZjI0MiksIFNUQygweDVhODI3OTlhKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMjQwW10gPSB7CisgICAgU1RDKDB4MDM1OWM0MjgpLCBTVEMoMHgwNmIyZjFkMiksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4MGQ2MTMwNGUpLAorICAgIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxNzUzN2U2MyksIFNUQygweDFhOWNkOWFjKSwKKyAgICBTVEMoMHgxZGUxODlhNiksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4MmFiYTJlZTQpLCBTVEMoMHgyZGRmMDA0MCksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MDZiMmYxZDIpLAorICAgIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDIxMjBmYjgzKSwKKyAgICBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgzYTFjNWM1NyksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTA4ZDkyMTEpLAorICAgIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHgwYTBhZjI5OSksIFNUQygweDE0MDYwYjY4KSwKKyAgICBTVEMoMHgxZGUxODlhNiksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzYTFjNWM1NyksCisgICAgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDcyMGM4MDc1KSwKKyAgICBTVEMoMHg3NjQxYWYzZCksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTVhNjEyNWMpLAorICAgIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc0ZWYwZWJjKSwKKyAgICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZmZmZmZmZiksCisgICAgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZmZmZmZmZiksCisgICAgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4MTQwNjBiNjgpLAorICAgIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZTZjOTI1MSksCisgICAgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzIwYzgwNzUpLAorICAgIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHgxNzUzN2U2MyksIFNUQygweDJkZGYwMDQwKSwKKyAgICBTVEMoMHg0MmUxM2JhNCksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg3MjBjODA3NSksCisgICAgU1RDKDB4N2FiYTlhZTYpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDczODdlYTIzKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1ODFjMDBiMyksIFNUQygweDQ1YjZiYjVlKSwKKyAgICBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg0YjNjOGMxMiksCisgICAgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2Y0YzdlNTQpLAorICAgIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDVmMWY1ZWExKSwKKyAgICBTVEMoMHg0YjNjOGMxMiksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4Njc4ZGRlNmUpLAorICAgIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDc5YmMzODRkKSwKKyAgICBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHhlYmY5ZjQ5OCksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDdiYTM3NTFkKSwKKyAgICBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZGVkZjA0N2QpLAorICAgIFNUQygweGMwMDAwMDAwKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHgyNDVhOWQ2NSksIFNUQygweDQ1YjZiYjVlKSwKKyAgICBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZTZjOTI1MSksCisgICAgU1RDKDB4NzM4N2VhMjMpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweGZjYTYzYmQ4KSwgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHhiNzgwMDAxYyksIFNUQygweDljODY3YjJjKSwKKyAgICBTVEMoMHg4OWJlNTBjMyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4Njc4ZGRlNmUpLAorICAgIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGQ4NzIyMTkyKSwKKyAgICBTVEMoMHhiNGMzNzNlZSksIFNUQygweDk4NzIyMTkyKSwgU1RDKDB4ODY0M2M3YjMpLCBTVEMoMHg4MDAwMDAwMCksCisgICAgU1RDKDB4MmFiYTJlZTQpLCBTVEMoMHg1MDhkOTIxMSksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4N2QzM2YwY2EpLAorICAgIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg1ODFjMDBiMyksIFNUQygweDM0MGZmMjQyKSwKKyAgICBTVEMoMHgwYTBhZjI5OSksIFNUQygweGRlZGYwNDdkKSwgU1RDKDB4Yjc4MDAwMWMpLCBTVEMoMHg5ODcyMjE5MiksCisgICAgU1RDKDB4ODU0NTY1MWEpLCBTVEMoMHg4MDJjZTg0YyksIFNUQygweDg5YmU1MGMzKSwgU1RDKDB4MmRkZjAwNDApLAorICAgIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdiYTM3NTFkKSwKKyAgICBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHhlYmY5ZjQ5OCksCisgICAgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHg5Yzg2N2IyYyksIFNUQygweDg2NDNjN2IzKSwgU1RDKDB4ODAyY2U4NGMpLAorICAgIFNUQygweDhiMTBmMTQ0KSwgU1RDKDB4YTU3ZDg2NjYpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw0ODBbXSA9IHsKKyAgICBTVEMoMHg3ZmZkMzE1NCksIFNUQygweDdmZjRjNTZmKSwgU1RDKDB4N2ZlNmJjYjApLCBTVEMoMHg3ZmQzMTdiNCksCisgICAgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdmNzY4OTJmKSwgU1RDKDB4N2Y0YzdlNTQpLAorICAgIFNUQygweDdmMWNkZTAxKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZWFjZTU4YSksIFNUQygweDdlNmM5MjUxKSwKKyAgICBTVEMoMHg3ZTI2YjM3MSksIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3ZDMzZjBjYSksCisgICAgU1RDKDB4N2NkODA0NjQpLCBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDdjMGZjMjJhKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDdiMzFiYmIyKSwgU1RDKDB4N2FiYTlhZTYpLCBTVEMoMHg3YTNlMTdmMiksIFNUQygweDc5YmMzODRkKSwKKyAgICBTVEMoMHg3OTM1MDFhOSksIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4NzgxNmE3NTkpLCBTVEMoMHg3NzdmOTAzYyksCisgICAgU1RDKDB4NzZlMzNiM2YpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc1OWFmMzRjKSwgU1RDKDB4N2ZmNGM1NmYpLAorICAgIFNUQygweDdmZDMxN2I0KSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdlZTdhYTRjKSwKKyAgICBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3Yzc2OWUxOCksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzhhODc5ZjQpLAorICAgIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDczODdlYTIzKSwKKyAgICBTVEMoMHg3MjBjODA3NSksIFNUQygweDcwN2QxNDQzKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2ZDIzNTAxYiksCisgICAgU1RDKDB4NmI1OThlYTMpLCBTVEMoMHg2OTdjZjc4YSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjU4YzlhMmQpLAorICAgIFNUQygweDYzNzk4NGQ0KSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDVjZDkxMTQwKSwKKyAgICBTVEMoMHg1YTgyNzk5YSksIFNUQygweDU4MWMwMGIzKSwgU1RDKDB4N2ZlNmJjYjApLCBTVEMoMHg3ZjlhZmNiOSksCisgICAgU1RDKDB4N2YxY2RlMDEpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2M3NjllMTgpLAorICAgIFNUQygweDdiMzFiYmIyKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ODE2YTc1OSksIFNUQygweDc2NDFhZjNkKSwKKyAgICBTVEMoMHg3NDNlMDkxOCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NmZhZGYyZmMpLCBTVEMoMHg2ZDIzNTAxYiksCisgICAgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDY0ODU0M2U0KSwgU1RDKDB4NjE1NGZiOTEpLAorICAgIFNUQygweDVkZmU0N2FkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1NmUyZjE1ZCksIFNUQygweDUzMjExZDE4KSwKKyAgICBTVEMoMHg0ZjNlNzg3NSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg0MmUxM2JhNCksCisgICAgU1RDKDB4M2U4YjI0MGUpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDM1OTZhNDZjKSwgU1RDKDB4MzBmYmM1NGQpLAorICAgIFNUQygweDJjNGQ5MDUwKSwgU1RDKDB4N2ZkMzE3YjQpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdlNmM5MjUxKSwKKyAgICBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NzdmOTAzYyksCisgICAgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NmI1OThlYTMpLAorICAgIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjM3OTg0ZDQpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg1NWE2MTI1YyksIFNUQygweDUwOGQ5MjExKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0NWI2YmI1ZSksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4MmRkZjAwNDApLAorICAgIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDE0MDYwYjY4KSwKKyAgICBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhmOTRkMGUyZSksCisgICAgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3MmNjYjlkYiksIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg2YTZkOThhNCksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NTQ2NTcxOTQpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweDM4OWNlYTcyKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyOTI0ZWRhYyksIFNUQygweDIxMjBmYjgzKSwKKyAgICBTVEMoMHgxOGY4YjgzYyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MDg1ZjIxMzcpLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4ZjdhMGRlYzkpLCBTVEMoMHhlZjRhZWFmMSksIFNUQygweGU3MDc0N2M0KSwgU1RDKDB4ZGVkZjA0N2QpLAorICAgIFNUQygweGQ2ZGIxMjU0KSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHhjNzYzMTU4ZSksIFNUQygweDdmOWFmY2I5KSwKKyAgICBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NjQxYWYzZCksCisgICAgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjE1NGZiOTEpLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDQyZTEzYmE0KSwKKyAgICBTVEMoMHgzYTFjNWM1NyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgxZGUxODlhNiksCisgICAgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgwYTBhZjI5OSksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZjVmNTBkNjcpLAorICAgIFNUQygweGViZjlmNDk4KSwgU1RDKDB4ZTIxZTc2NWEpLCBTVEMoMHhkODcyMjE5MiksIFNUQygweGNmMDQzYWIzKSwKKyAgICBTVEMoMHhjNWUzYTNhOSksIFNUQygweGJkMWVjNDVjKSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHhhY2RlZTJlOCksCisgICAgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg5ZWFiMDQ2ZiksIFNUQygweDdmNzY4OTJmKSwgU1RDKDB4N2RkYjRiZmMpLAorICAgIFNUQygweDdiMzFiYmIyKSwgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg3MmNjYjlkYiksIFNUQygweDZkMjM1MDFiKSwKKyAgICBTVEMoMHg2NjhmN2MyNSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NTZlMmYxNWQpLCBTVEMoMHg0ZGViZTRmZSksCisgICAgU1RDKDB4NDQ0ZDdhZmYpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDJmNmU2ZDE2KSwgU1RDKDB4MjQ1YTlkNjUpLAorICAgIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgwMWFjZWI3YyksIFNUQygweGY1ZjUwZDY3KSwKKyAgICBTVEMoMHhlYTUyYzE2NiksIFNUQygweGRlZGYwNDdkKSwgU1RDKDB4ZDNiMjZmYjApLCBTVEMoMHhjOGU1MDMyYiksCisgICAgU1RDKDB4YmU4ZGYyYmEpLCBTVEMoMHhiNGMzNzNlZSksIFNUQygweGFiOWE4ZTZjKSwgU1RDKDB4YTMyNmVlYzApLAorICAgIFNUQygweDliN2FiYzFjKSwgU1RDKDB4OTRhNjcxNWQpLCBTVEMoMHg4ZWI4YjlhMCksIFNUQygweDg5YmU1MGMzKSwKKyAgICBTVEMoMHg4NWMxZTgwZSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NWYxZjVlYTEpLAorICAgIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDM0MGZmMjQyKSwKKyAgICBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4ZjI5ZWNmYjIpLCBTVEMoMHhlNTYzMjY1NCksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4Y2JmMDBkYmUpLAorICAgIFNUQygweGMwMDAwMDAwKSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHhhYTU5ZWRhNCksIFNUQygweGEwZTBhMTVmKSwKKyAgICBTVEMoMHg5ODcyMjE5MiksIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4OGIxMGYxNDQpLCBTVEMoMHg4NjQzYzdiMyksCisgICAgU1RDKDB4ODJjYzBmMzYpLCBTVEMoMHg4MGIzODFhYyksIFNUQygweDgwMDAwMDAwKSwgU1RDKDB4ODBiMzgxYWMpLAorICAgIFNUQygweDdmMWNkZTAxKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3ODE2YTc1OSksIFNUQygweDcyMGM4MDc1KSwKKyAgICBTVEMoMHg2YTZkOThhNCksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NTZlMmYxNWQpLCBTVEMoMHg0YjNjOGMxMiksCisgICAgU1RDKDB4M2U4YjI0MGUpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4MTQwNjBiNjgpLAorICAgIFNUQygweDA1MDY3NzM0KSwgU1RDKDB4ZjVmNTBkNjcpLCBTVEMoMHhlNzA3NDdjNCksIFNUQygweGQ4NzIyMTkyKSwKKyAgICBTVEMoMHhjYTY5NWI5NCksIFNUQygweGJkMWVjNDVjKSwgU1RDKDB4YjBjMTg3OGIpLCBTVEMoMHhhNTdkODY2NiksCisgICAgU1RDKDB4OWI3YWJjMWMpLCBTVEMoMHg5MmRjYWZlNSksIFNUQygweDhiYzFmNmU4KSwgU1RDKDB4ODY0M2M3YjMpLAorICAgIFNUQygweDgyNzVhMGMwKSwgU1RDKDB4ODA2NTAzNDcpLCBTVEMoMHg4MDE5NDM1MCksIFNUQygweDgxOTM2ZGFmKSwKKyAgICBTVEMoMHg4NGNlNDQ0ZSksIFNUQygweDg5YmU1MGMzKSwgU1RDKDB4OTA1MjBkMDQpLCBTVEMoMHg3ZWU3YWE0YyksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NjU4YzlhMmQpLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDMwZmJjNTRkKSwKKyAgICBTVEMoMHgyMTIwZmI4MyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlZjRhZWFmMSksCisgICAgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhjZjA0M2FiMyksIFNUQygweGMwMDAwMDAwKSwgU1RDKDB4YjIxNDFiMDIpLAorICAgIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4OWE3MzY1ZDMpLCBTVEMoMHg5MTI2MTQ1ZiksIFNUQygweDg5YmU1MGMzKSwKKyAgICBTVEMoMHg4NDVjOGFlMyksIFNUQygweDgxMTg1NWI0KSwgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHg4MTE4NTViNCksCisgICAgU1RDKDB4ODQ1YzhhZTMpLCBTVEMoMHg4OWJlNTBjMyksIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4OWE3MzY1ZDMpLAorICAgIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4YjIxNDFiMDIpLCBTVEMoMHg3ZWFjZTU4YSksIFNUQygweDdhYmE5YWU2KSwKKyAgICBTVEMoMHg3NDNlMDkxOCksIFNUQygweDZiNTk4ZWEzKSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg1MzIxMWQxOCksCisgICAgU1RDKDB4NDQ0ZDdhZmYpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4MTBiNTE1MGYpLAorICAgIFNUQygweGZlNTMxNDg0KSwgU1RDKDB4ZWJmOWY0OTgpLCBTVEMoMHhkYTBhZWNmOSksIFNUQygweGM4ZTUwMzJiKSwKKyAgICBTVEMoMHhiOGUzMTMxOSksIFNUQygweGFhNTllZGE0KSwgU1RDKDB4OWQ5Njk3NDIpLCBTVEMoMHg5MmRjYWZlNSksCisgICAgU1RDKDB4OGE2NTBjYjQpLCBTVEMoMHg4NDVjOGFlMyksIFNUQygweDgwZTMyMWZmKSwgU1RDKDB4ODAwYjNhOTEpLAorICAgIFNUQygweDgxZDk0YzhmKSwgU1RDKDB4ODY0M2M3YjMpLCBTVEMoMHg4ZDMzNDYyNSksIFNUQygweDk2ODMwODc2KSwKKyAgICBTVEMoMHhhMjAxYjg1MyksIFNUQygweGFmNzI2ZGVmKSwgU1RDKDB4YmU4ZGYyYmEpLCBTVEMoMHhjZjA0M2FiMyksCisgICAgU1RDKDB4ZTA3ZTBjODQpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzIwYzgwNzUpLAorICAgIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDNhMWM1YzU3KSwKKyAgICBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlYmY5ZjQ5OCksCisgICAgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHhjNWUzYTNhOSksIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4YTU3ZDg2NjYpLAorICAgIFNUQygweDk4NzIyMTkyKSwgU1RDKDB4OGRmMzdmOGIpLCBTVEMoMHg4NjQzYzdiMyksIFNUQygweDgxOTM2ZGFmKSwKKyAgICBTVEMoMHg4MDAwMDAwMCksIFNUQygweDgxOTM2ZGFmKSwgU1RDKDB4ODY0M2M3YjMpLCBTVEMoMHg4ZGYzN2Y4YiksCisgICAgU1RDKDB4OTg3MjIxOTIpLCBTVEMoMHhhNTdkODY2NiksIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4YzVlM2EzYTkpLAorICAgIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4ZWJmOWY0OTgpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweDE0MDYwYjY4KSwKKyAgICBTVEMoMHg3ZTI2YjM3MSksIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4NmZhZGYyZmMpLCBTVEMoMHg2Mzc5ODRkNCksCisgICAgU1RDKDB4NTQ2NTcxOTQpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDJmNmU2ZDE2KSwgU1RDKDB4MWE5Y2Q5YWMpLAorICAgIFNUQygweDA1MDY3NzM0KSwgU1RDKDB4ZWY0YWVhZjEpLCBTVEMoMHhkYTBhZWNmOSksIFNUQygweGM1ZTNhM2E5KSwKKyAgICBTVEMoMHhiMzZhMTk3OCksIFNUQygweGEzMjZlZWMwKSwgU1RDKDB4OTU5MjY3NWMpLCBTVEMoMHg4YjEwZjE0NCksCisgICAgU1RDKDB4ODNmMDNkZDYpLCBTVEMoMHg4MDY1MDM0NyksIFNUQygweDgwODk3NmQxKSwgU1RDKDB4ODQ1YzhhZTMpLAorICAgIFNUQygweDhiYzFmNmU4KSwgU1RDKDB4OTY4MzA4NzYpLCBTVEMoMHhhNDUwMzdjOSksIFNUQygweGI0YzM3M2VlKSwKKyAgICBTVEMoMHhjNzYzMTU4ZSksIFNUQygweGRiYTU2MjliKSwgU1RDKDB4ZjBmNDg4ZDkpLCBTVEMoMHgwNmIyZjFkMiksCisgICAgU1RDKDB4MWMzZmQwNDUpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDQ0NGQ3YWZmKSwgU1RDKDB4N2RkYjRiZmMpLAorICAgIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDRkZWJlNGZlKSwKKyAgICBTVEMoMHgzYTFjNWM1NyksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHhmNWY1MGQ2NyksCisgICAgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhjOGU1MDMyYiksIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4YTMyNmVlYzApLAorICAgIFNUQygweDk0YTY3MTVkKSwgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHg4MmNjMGYzNiksIFNUQygweDgwMGIzYTkxKSwKKyAgICBTVEMoMHg4MTkzNmRhZiksIFNUQygweDg3NTc4NjBjKSwgU1RDKDB4OTEyNjE0NWYpLCBTVEMoMHg5ZWFiMDQ2ZiksCisgICAgU1RDKDB4YWY3MjZkZWYpLCBTVEMoMHhjMmVjNzYzNSksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4ZWY0YWVhZjEpLAorICAgIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDQ4N2ZmZmU0KSwKKyAgICBTVEMoMHg1YTgyNzk5YSksIFNUQygweDY5N2NmNzhhKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnNDgwW10gPSB7CisgICAgU1RDKDB4MDFhY2ViN2MpLCBTVEMoMHgwMzU5YzQyOCksIFNUQygweDA1MDY3NzM0KSwgU1RDKDB4MDZiMmYxZDIpLAorICAgIFNUQygweDA4NWYyMTM3KSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgwYmI2NTMzNiksIFNUQygweDBkNjEzMDRlKSwKKyAgICBTVEMoMHgwZjBiNzcyNyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MTI1ZGY3NWIpLCBTVEMoMHgxNDA2MGI2OCksCisgICAgU1RDKDB4MTVhZDNlOWEpLCBTVEMoMHgxNzUzN2U2MyksIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MWE5Y2Q5YWMpLAorICAgIFNUQygweDFjM2ZkMDQ1KSwgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgxZjgxZjM3YyksIFNUQygweDIxMjBmYjgzKSwKKyAgICBTVEMoMHgyMmJlOGY4NyksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4MjVmNTEzMDcpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4MjkyNGVkYWMpLCBTVEMoMHgyYWJhMmVlNCksIFNUQygweDJjNGQ5MDUwKSwgU1RDKDB4MmRkZjAwNDApLAorICAgIFNUQygweDJmNmU2ZDE2KSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzMjg2Zjc3OSksIFNUQygweDAzNTljNDI4KSwKKyAgICBTVEMoMHgwNmIyZjFkMiksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgxMGI1MTUwZiksCisgICAgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxNzUzN2U2MyksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MWRlMTg5YTYpLAorICAgIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDJhYmEyZWU0KSwKKyAgICBTVEMoMHgyZGRmMDA0MCksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgzNzFhZmNkNSksCisgICAgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgzZDEzODljYiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NDJlMTNiYTQpLAorICAgIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4NDg3ZmZmZTQpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDRkZWJlNGZlKSwKKyAgICBTVEMoMHg1MDhkOTIxMSksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg1ODFjMDBiMyksCisgICAgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1Y2Q5MTE0MCksIFNUQygweDA1MDY3NzM0KSwgU1RDKDB4MGEwYWYyOTkpLAorICAgIFNUQygweDBmMGI3NzI3KSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDFkZTE4OWE2KSwKKyAgICBTVEMoMHgyMmJlOGY4NyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MmM0ZDkwNTApLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4MzU5NmE0NmMpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDNlOGIyNDBlKSwgU1RDKDB4NDJlMTNiYTQpLAorICAgIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0ZjNlNzg3NSksIFNUQygweDUzMjExZDE4KSwKKyAgICBTVEMoMHg1NmUyZjE1ZCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NWRmZTQ3YWQpLCBTVEMoMHg2MTU0ZmI5MSksCisgICAgU1RDKDB4NjQ4NTQzZTQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NmQyMzUwMWIpLAorICAgIFNUQygweDZmYWRmMmZjKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3NDNlMDkxOCksIFNUQygweDc2NDFhZjNkKSwKKyAgICBTVEMoMHg3ODE2YTc1OSksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgxNDA2MGI2OCksCisgICAgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MmRkZjAwNDApLAorICAgIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDQ1YjZiYjVlKSwKKyAgICBTVEMoMHg0YjNjOGMxMiksIFNUQygweDUwOGQ5MjExKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NmI1OThlYTMpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDc3N2Y5MDNjKSwKKyAgICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3ZTZjOTI1MSksCisgICAgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2ZkMzE3YjQpLAorICAgIFNUQygweDA4NWYyMTM3KSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDIxMjBmYjgzKSwKKyAgICBTVEMoMHgyOTI0ZWRhYyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4Mzg5Y2VhNzIpLCBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg3MmNjYjlkYiksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzkzNTAxYTkpLCBTVEMoMHg3YmEzNzUxZCksCisgICAgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2ZmZmZmZmYpLAorICAgIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdiYTM3NTFkKSwKKyAgICBTVEMoMHg3OTM1MDFhOSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzJjY2I5ZGIpLCBTVEMoMHgwYTBhZjI5OSksCisgICAgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MzBmYmM1NGQpLAorICAgIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDUzMjExZDE4KSwKKyAgICBTVEMoMHg1YTgyNzk5YSksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2ZDIzNTAxYiksCisgICAgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2M3NjllMTgpLAorICAgIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdmOWFmY2I5KSwKKyAgICBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NjQxYWYzZCksCisgICAgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjE1NGZiOTEpLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHgwYmI2NTMzNiksIFNUQygweDE3NTM3ZTYzKSwKKyAgICBTVEMoMHgyMmJlOGY4NyksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4Mzg5Y2VhNzIpLCBTVEMoMHg0MmUxM2JhNCksCisgICAgU1RDKDB4NGM5NWU2ODgpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDVkZmU0N2FkKSwgU1RDKDB4NjU4YzlhMmQpLAorICAgIFNUQygweDZjNDBjZjJjKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3NmUzM2IzZiksIFNUQygweDdhYmE5YWU2KSwKKyAgICBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2ZmZDMxNTQpLCBTVEMoMHg3ZjlhZmNiOSksCisgICAgU1RDKDB4N2UyNmIzNzEpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc4MTZhNzU5KSwgU1RDKDB4NzM4N2VhMjMpLAorICAgIFNUQygweDZlMDEwNzgwKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDU4MWMwMGIzKSwKKyAgICBTVEMoMHg0ZjNlNzg3NSksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4M2I5OTQxYjEpLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4MjVmNTEzMDcpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4Mjc4ZGRlNmUpLAorICAgIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDU1YTYxMjVjKSwKKyAgICBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3NGVmMGViYyksCisgICAgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2ZmZmZmZmYpLAorICAgIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc0ZWYwZWJjKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg1NWE2MTI1YyksCisgICAgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4Mjc4ZGRlNmUpLAorICAgIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGYyOWVjZmIyKSwKKyAgICBTVEMoMHgwZjBiNzcyNyksIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4MmM0ZDkwNTApLCBTVEMoMHgzYTFjNWM1NyksCisgICAgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDVkZmU0N2FkKSwgU1RDKDB4Njc4ZGRlNmUpLAorICAgIFNUQygweDZmYWRmMmZjKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3YjMxYmJiMiksIFNUQygweDdlNmM5MjUxKSwKKyAgICBTVEMoMHg3ZmU2YmNiMCksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4NzQzZTA5MTgpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDY0ODU0M2U0KSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDRmM2U3ODc1KSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgzNTk2YTQ2YyksIFNUQygweDI3OGRkZTZlKSwKKyAgICBTVEMoMHgxOGY4YjgzYyksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4ZmFmOTg4Y2MpLCBTVEMoMHhlYmY5ZjQ5OCksCisgICAgU1RDKDB4ZGQ0MTcwNzkpLCBTVEMoMHhjZjA0M2FiMyksIFNUQygweGMxNzRkYmYyKSwgU1RDKDB4MTBiNTE1MGYpLAorICAgIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDRkZWJlNGZlKSwKKyAgICBTVEMoMHg1YTgyNzk5YSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3NjQxYWYzZCksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2VlN2FhNGMpLAorICAgIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY1OGM5YTJkKSwKKyAgICBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZWY0YWVhZjEpLAorICAgIFNUQygweGRlZGYwNDdkKSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHhjMDAwMDAwMCksIFNUQygweGIyMTQxYjAyKSwKKyAgICBTVEMoMHhhNTdkODY2NiksIFNUQygweDlhNzM2NWQzKSwgU1RDKDB4MTI1ZGY3NWIpLCBTVEMoMHgyNDVhOWQ2NSksCisgICAgU1RDKDB4MzU5NmE0NmMpLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NjE1NGZiOTEpLAorICAgIFNUQygweDZjNDBjZjJjKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3YjMxYmJiMiksIFNUQygweDdlZTdhYTRjKSwKKyAgICBTVEMoMHg3ZmZkMzE1NCksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2EzZTE3ZjIpLCBTVEMoMHg3Mzg3ZWEyMyksCisgICAgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDUxZDkyMzIxKSwgU1RDKDB4NDJlMTNiYTQpLAorICAgIFNUQygweDMyODZmNzc5KSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgwZjBiNzcyNyksIFNUQygweGZjYTYzYmQ4KSwKKyAgICBTVEMoMHhlYTUyYzE2NiksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4Yzc2MzE1OGUpLCBTVEMoMHhiNzgwMDAxYyksCisgICAgU1RDKDB4YTkxZDBlYTMpLCBTVEMoMHg5Yzg2N2IyYyksIFNUQygweDkxZmVmODgwKSwgU1RDKDB4ODliZTUwYzMpLAorICAgIFNUQygweDgzZjAzZGQ2KSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDNhMWM1YzU3KSwKKyAgICBTVEMoMHg0YjNjOGMxMiksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg3MjBjODA3NSksCisgICAgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2U2YzkyNTEpLAorICAgIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg0YjNjOGMxMiksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgxNDA2MGI2OCksCisgICAgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlYmY5ZjQ5OCksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4YzVlM2EzYTkpLAorICAgIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg5ODcyMjE5MiksIFNUQygweDhkZjM3ZjhiKSwKKyAgICBTVEMoMHg4NjQzYzdiMyksIFNUQygweDgxOTM2ZGFmKSwgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHg4MTkzNmRhZiksCisgICAgU1RDKDB4MTVhZDNlOWEpLCBTVEMoMHgyYWJhMmVlNCksIFNUQygweDNlOGIyNDBlKSwgU1RDKDB4NTA4ZDkyMTEpLAorICAgIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg3NmUzM2IzZiksIFNUQygweDdkMzNmMGNhKSwKKyAgICBTVEMoMHg3ZmU2YmNiMCksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2EzZTE3ZjIpLCBTVEMoMHg3MjBjODA3NSksCisgICAgU1RDKDB4NjY4ZjdjMjUpLCBTVEMoMHg1ODFjMDBiMyksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4MzQwZmYyNDIpLAorICAgIFNUQygweDFmODFmMzdjKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHhmNDQ5YWNjYSksIFNUQygweGRlZGYwNDdkKSwKKyAgICBTVEMoMHhjYTY5NWI5NCksIFNUQygweGI3ODAwMDFjKSwgU1RDKDB4YTZhZWNkNWUpLCBTVEMoMHg5ODcyMjE5MiksCisgICAgU1RDKDB4OGQzMzQ2MjUpLCBTVEMoMHg4NTQ1NjUxYSksIFNUQygweDgwZTMyMWZmKSwgU1RDKDB4ODAyY2U4NGMpLAorICAgIFNUQygweDgzMjdmYjljKSwgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHg5M2JmMzBkNCksIFNUQygweDE3NTM3ZTYzKSwKKyAgICBTVEMoMHgyZGRmMDA0MCksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg2NThjOWEyZCksCisgICAgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2Y5YWZjYjkpLAorICAgIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzM4N2VhMjMpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDU4MWMwMGIzKSwKKyAgICBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgwMzU5YzQyOCksCisgICAgU1RDKDB4ZWJmOWY0OTgpLCBTVEMoMHhkNTQ1ZDExYyksIFNUQygweGMwMDAwMDAwKSwgU1RDKDB4YWNkZWUyZTgpLAorICAgIFNUQygweDljODY3YjJjKSwgU1RDKDB4OGY4MmViYmQpLCBTVEMoMHg4NjQzYzdiMyksIFNUQygweDgxMTg1NWI0KSwKKyAgICBTVEMoMHg4MDJjZTg0YyksIFNUQygweDgzODk2MWU4KSwgU1RDKDB4OGIxMGYxNDQpLCBTVEMoMHg5NjgzMDg3NiksCisgICAgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHhiNzgwMDAxYyksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDIwW10gPSB7CisgICAgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Njc4ZGRlNmUpLAorICAgIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweGQ4NzIyMTkyKSwKKyAgICBTVEMoMHg4NjQzYzdiMyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4OTg3MjIxOTIpLCBTVEMoMHg5ODcyMjE5MiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzIwW10gPSB7CisgICAgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NGIzYzhjMTIpLAorICAgIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDc5YmMzODRkKSwKKyAgICBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHhiNGMzNzNlZSksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzhbXSA9IHsKKyAgICBXVENQKDB4N2Y2MjM2OGYsIDB4MGM4YmQzNWUpLAorICAgIFdUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksCisgICAgV1RDUCgweDcwZTJjYmM2LCAweDNjNTZiYTcwKSwKKyAgICBXVENQKDB4NjJmMjAxYWMsIDB4NTEzM2NjOTQpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMltdID0geworICAgIFdUQ1AoMHg3ZmI5ZDc1OSwgMHgwODVmMjEzNyksIFdUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksCisgICAgV1RDUCgweDc5MzUwMWE5LCAweDI5MjRlZGFjKSwgV1RDUCgweDcyY2NiOWRiLCAweDM4OWNlYTcyKSwKKyAgICBXVENQKDB4NmE2ZDk4YTQsIDB4NDcxY2VjZTcpLCBXVENQKDB4NjAzYzQ5NmMsIDB4NTQ2NTcxOTQpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxNltdID0geworICAgIFdUQ1AoMHg3ZmQ4ODc4ZSwgMHgwNjQ3ZDk3YyksIFdUQ1AoMHg3ZTlkNTVmYywgMHgxMmM4MTA2ZiksCisgICAgV1RDUCgweDdjMjlmYmVlLCAweDFmMTlmOTdiKSwgV1RDUCgweDc4ODQ4NDE0LCAweDJiMWYzNGViKSwKKyAgICBXVENQKDB4NzNiNWViZDEsIDB4MzZiYTIwMTQpLCBXVENQKDB4NmRjYTBkMTQsIDB4NDFjZTFlNjUpLAorICAgIFdUQ1AoMHg2NmNmODEyMCwgMHg0YzNmZGZmNCksIFdUQ1AoMHg1ZWQ3N2M4YSwgMHg1NWY1YTRkMiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzIwW10gPSB7CisgICAgV1RDUCgweDdmZTZiY2IwLCAweDA1MDY3NzM0KSwgV1RDUCgweDdmMWNkZTAxLCAweDBmMGI3NzI3KSwKKyAgICBXVENQKDB4N2Q4YTVmNDAsIDB4MThmOGI4M2MpLCBXVENQKDB4N2IzMWJiYjIsIDB4MjJiZThmODcpLAorICAgIFdUQ1AoMHg3ODE2YTc1OSwgMHgyYzRkOTA1MCksIFdUQ1AoMHg3NDNlMDkxOCwgMHgzNTk2YTQ2YyksCisgICAgV1RDUCgweDZmYWRmMmZjLCAweDNlOGIyNDBlKSwgV1RDUCgweDZhNmQ5OGE0LCAweDQ3MWNlY2U3KSwKKyAgICBXVENQKDB4NjQ4NTQzZTQsIDB4NGYzZTc4NzUpLCBXVENQKDB4NWRmZTQ3YWQsIDB4NTZlMmYxNWQpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cyNFtdID0geworICAgIFdUQ1AoMHg3ZmVlNzRhMiwgMHgwNDMwMjM4ZiksIFdUQ1AoMHg3ZjYyMzY4ZiwgMHgwYzhiZDM1ZSksCisgICAgV1RDUCgweDdlNGE1NDI2LCAweDE0ZDljMjQ1KSwgV1RDUCgweDdjYTgwMDM4LCAweDFkMTBkNWMyKSwKKyAgICBXVENQKDB4N2E3ZDA1NWIsIDB4MjUyODBjNWUpLCBXVENQKDB4NzdjYmMzZjIsIDB4MmQxNjg3OTIpLAorICAgIFdUQ1AoMHg3NDk3MmY5MiwgMHgzNGQzOTU3ZSksIFdUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksCisgICAgV1RDUCgweDZjYjJhODM3LCAweDQzOTdiYTMyKSwgV1RDUCgweDY4MGI1YzMzLCAweDRhOGVhMTExKSwKKyAgICBXVENQKDB4NjJmMjAxYWMsIDB4NTEzM2NjOTQpLCBXVENQKDB4NWQ2YzJmOTksIDB4NTc3ZmYzZGEpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3czMltdID0geworICAgIFdUQ1AoMHg3ZmY2MjE4MiwgMHgwMzI0MmFiZiksIFdUQ1AoMHg3ZmE3MzZiNCwgMHgwOTZhOTA0OSksCisgICAgV1RDUCgweDdmMDk5MWM0LCAweDBmYWIyNzJiKSwgV1RDUCgweDdlMWQ5M2VhLCAweDE1ZTIxNDQ1KSwKKyAgICBXVENQKDB4N2NlM2NlYjIsIDB4MWMwYjgyNmEpLCBXVENQKDB4N2I1ZDAzOWUsIDB4MjIyM2E0YzUpLAorICAgIFdUQ1AoMHg3OThhMjNiMSwgMHgyODI2YjkyOCksIFdUQ1AoMHg3NzZjNGVkYiwgMHgyZTExMGE2MiksCisgICAgV1RDUCgweDc1MDRkMzQ1LCAweDMzZGVmMjg3KSwgV1RDUCgweDcyNTUyYzg1LCAweDM5OGNkZDMyKSwKKyAgICBXVENQKDB4NmY1ZjAyYjIsIDB4M2YxNzQ5YjgpLCBXVENQKDB4NmMyNDI5NjAsIDB4NDQ3YWNkNTApLAorICAgIFdUQ1AoMHg2OGE2OWU4MSwgMHg0OWI0MTUzMyksIFdUQ1AoMHg2NGU4ODkyNiwgMHg0ZWJmZThhNSksCisgICAgV1RDUCgweDYwZWMzODMwLCAweDUzOWIyYWYwKSwgV1RDUCgweDVjYjQyMGUwLCAweDU4NDJkZDU0KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NDBbXSA9IHsKKyAgICBXVENQKDB4N2ZmOWFmMDQsIDB4MDI4MzViNWEpLCBXVENQKDB4N2ZjNzJhZTIsIDB4MDc4OTE0MTgpLAorICAgIFdUQ1AoMHg3ZjYyMzY4ZiwgMHgwYzhiZDM1ZSksIFdUQ1AoMHg3ZWNhZjllNSwgMHgxMTg5OWVkMyksCisgICAgV1RDUCgweDdlMDFiMDk2LCAweDE2ODA3ZTE1KSwgV1RDUCgweDdkMDZhYTE2LCAweDFiNmU3YjdhKSwKKyAgICBXVENQKDB4N2JkYTQ5N2QsIDB4MjA1MWE0ZGQpLCBXVENQKDB4N2E3ZDA1NWIsIDB4MjUyODBjNWUpLAorICAgIFdUQ1AoMHg3OGVmNjc4ZiwgMHgyOWVmYzkyNSksIFdUQ1AoMHg3NzMyMGQwZCwgMHgyZWE2ZjgyNyksCisgICAgV1RDUCgweDc1NDVhNWEwLCAweDMzNGJiY2RlKSwgV1RDUCgweDczMmFmM2E3LCAweDM3ZGM0MjBjKSwKKyAgICBXVENQKDB4NzBlMmNiYzYsIDB4M2M1NmJhNzApLCBXVENQKDB4NmU2ZTE0OTIsIDB4NDBiOTYxN2QpLAorICAgIFdUQ1AoMHg2YmNkYzYzOSwgMHg0NTAyN2MwYyksIFdUQ1AoMHg2OTAyZWExZCwgMHg0OTMwNTkwZiksCisgICAgV1RDUCgweDY2MGU5YTZhLCAweDRkNDE1MjM0KSwgV1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwKKyAgICBXVENQKDB4NWZhZTVhNTUsIDB4NTUwNjM5NTEpLCBXVENQKDB4NWM0NGVlNDAsIDB4NThiNzE2MzIpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c0OFtdID0geworICAgIFdUQ1AoMHg3ZmZiOWQxNSwgMHgwMjE4MjQyNyksIFdUQ1AoMHg3ZmQ4ODc4ZSwgMHgwNjQ3ZDk3YyksCisgICAgV1RDUCgweDdmOTI2NjFkLCAweDBhNzVkNjBlKSwgV1RDUCgweDdmMjk0YmZkLCAweDBlYTBmNDhjKSwKKyAgICBXVENQKDB4N2U5ZDU1ZmMsIDB4MTJjODEwNmYpLCBXVENQKDB4N2RlZWFhN2EsIDB4MTZlYTA2NDYpLAorICAgIFdUQ1AoMHg3ZDFkNzk1OCwgMHgxYjA1YjQwZiksIFdUQ1AoMHg3YzI5ZmJlZSwgMHgxZjE5Zjk3YiksCisgICAgV1RDUCgweDdiMTQ3NGZkLCAweDIzMjViODQ3KSwgV1RDUCgweDc5ZGQzMDk4LCAweDI3MjdkNDg2KSwKKyAgICBXVENQKDB4Nzg4NDg0MTQsIDB4MmIxZjM0ZWIpLCBXVENQKDB4NzcwYWNkZWMsIDB4MmYwYWMzMjApLAorICAgIFdUQ1AoMHg3NTcwNzVhYywgMHgzMmU5NmMwOSksIFdUQ1AoMHg3M2I1ZWJkMSwgMHgzNmJhMjAxNCksCisgICAgV1RDUCgweDcxZGJhOWFiLCAweDNhN2JkMzgyKSwgV1RDUCgweDZmZTIzMTNjLCAweDNlMmQ3ZWIxKSwKKyAgICBXVENQKDB4NmRjYTBkMTQsIDB4NDFjZTFlNjUpLCBXVENQKDB4NmI5M2QwMmUsIDB4NDU1Y2I0MGMpLAorICAgIFdUQ1AoMHg2OTQwMTVjMywgMHg0OGQ4NDYwOSksIFdUQ1AoMHg2NmNmODEyMCwgMHg0YzNmZGZmNCksCisgICAgV1RDUCgweDY0NDJiZDdlLCAweDRmOTI5MmRjKSwgV1RDUCgweDYxOWE3ZGNlLCAweDUyY2Y3NThmKSwKKyAgICBXVENQKDB4NWVkNzdjOGEsIDB4NTVmNWE0ZDIpLCBXVENQKDB4NWJmYTdiODIsIDB4NTkwNDQzYTcpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c2NFtdID0geworICAgIFdUQ1AoMHg3ZmZkODg1YSwgMHgwMTkyMWQyMCksIFdUQ1AoMHg3ZmU5Y2JjMCwgMHgwNGI2MTk1ZCksCisgICAgV1RDUCgweDdmYzI1NTk2LCAweDA3ZDk1YjllKSwgV1RDUCgweDdmODcyYmYzLCAweDBhZmI2ODA1KSwKKyAgICBXVENQKDB4N2YzODU3ZjYsIDB4MGUxYmMyZTQpLCBXVENQKDB4N2VkNWU1YzYsIDB4MTEzOWYwY2YpLAorICAgIFdUQ1AoMHg3ZTVmZTQ5MywgMHgxNDU1NzZiMSksIFdUQ1AoMHg3ZGQ2NjY4ZiwgMHgxNzZkZDlkZSksCisgICAgV1RDUCgweDdkMzk4MGVjLCAweDFhODJhMDI2KSwgV1RDUCgweDdjODk0YmRlLCAweDFkOTM0ZmU1KSwKKyAgICBXVENQKDB4N2JjNWUyOTAsIDB4MjA5ZjcwMWMpLCBXVENQKDB4N2FlZjYzMjMsIDB4MjNhNjg4N2YpLAorICAgIFdUQ1AoMHg3YTA1ZWVhZCwgMHgyNmE4MjE4NiksIFdUQ1AoMHg3OTA5YTkyZCwgMHgyOWEzYzQ4NSksCisgICAgV1RDUCgweDc3ZmFiOTg5LCAweDJjOThmYmJhKSwgV1RDUCgweDc2ZDk0OTg5LCAweDJmODc1MjYyKSwKKyAgICBXVENQKDB4NzVhNTg1Y2YsIDB4MzI2ZTU0YzcpLCBXVENQKDB4NzQ1ZjlkZDEsIDB4MzU0ZDkwNTcpLAorICAgIFdUQ1AoMHg3MzA3YzNkMCwgMHgzODI0OTNiMCksIFdUQ1AoMHg3MTllMmNkMiwgMHgzYWYyZWViNyksCisgICAgV1RDUCgweDcwMjMxMDlhLCAweDNkYjgzMmE2KSwgV1RDUCgweDZlOTZhOTlkLCAweDQwNzNmMjFkKSwKKyAgICBXVENQKDB4NmNmOTM0ZmMsIDB4NDMyNWMxMzUpLCBXVENQKDB4NmI0YWYyNzksIDB4NDVjZDM1OGYpLAorICAgIFdUQ1AoMHg2OThjMjQ2YywgMHg0ODY5ZTY2NSksIFdUQ1AoMHg2N2JkMGZiZCwgMHg0YWZiNmM5OCksCisgICAgV1RDUCgweDY1ZGRmYmQzLCAweDRkODE2MmM0KSwgV1RDUCgweDYzZWYzMjkwLCAweDRmZmI2NTRkKSwKKyAgICBXVENQKDB4NjFmMTAwM2YsIDB4NTI2OTEyNmUpLCBXVENQKDB4NWZlM2IzOGQsIDB4NTRjYTBhNGIpLAorICAgIFdUQ1AoMHg1ZGM3OWQ3YywgMHg1NzFkZWVmYSksIFdUQ1AoMHg1YjlkMTE1NCwgMHg1OTY0NjQ5OCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzk2W10gPSB7CisgICAgV1RDUCgweDdmZmVlNzQ0LCAweDAxMGMxNDYwKSwgV1RDUCgweDdmZjYyMTgyLCAweDAzMjQyYWJmKSwKKyAgICBXVENQKDB4N2ZlNDk2OTgsIDB4MDUzYzBhMDEpLCBXVENQKDB4N2ZjYTQ3YjksIDB4MDc1MzhkNmIpLAorICAgIFdUQ1AoMHg3ZmE3MzZiNCwgMHgwOTZhOTA0OSksIFdUQ1AoMHg3ZjdiNjVlZiwgMHgwYjgwZWRmMSksCisgICAgV1RDUCgweDdmNDZkODZjLCAweDBkOTY4MWMyKSwgV1RDUCgweDdmMDk5MWM0LCAweDBmYWIyNzJiKSwKKyAgICBXVENQKDB4N2VjMzk2MmEsIDB4MTFiZWI5YWEpLCBXVENQKDB4N2U3NGVhNmEsIDB4MTNkMTE0ZDApLAorICAgIFdUQ1AoMHg3ZTFkOTNlYSwgMHgxNWUyMTQ0NSksIFdUQ1AoMHg3ZGJkOThhNCwgMHgxN2YxOTNjNSksCisgICAgV1RDUCgweDdkNTRmZjJlLCAweDE5ZmY2ZjJhKSwgV1RDUCgweDdjZTNjZWIyLCAweDFjMGI4MjZhKSwKKyAgICBXVENQKDB4N2M2YTBlZjIsIDB4MWUxNWE5OWEpLCBXVENQKDB4N2JlN2M4NDcsIDB4MjAxZGMwZWYpLAorICAgIFdUQ1AoMHg3YjVkMDM5ZSwgMHgyMjIzYTRjNSksIFdUQ1AoMHg3YWM5Y2E3YSwgMHgyNDI3MzE5ZCksCisgICAgV1RDUCgweDdhMmUyNmYyLCAweDI2Mjg0NDIyKSwgV1RDUCgweDc5OGEyM2IxLCAweDI4MjZiOTI4KSwKKyAgICBXVENQKDB4NzhkZGNiZjUsIDB4MmEyMjZkYjUpLCBXVENQKDB4NzgyOTJiOGQsIDB4MmMxYjNlZmIpLAorICAgIFdUQ1AoMHg3NzZjNGVkYiwgMHgyZTExMGE2MiksIFdUQ1AoMHg3NmE3NDJkMSwgMHgzMDAzYWQ4NSksCisgICAgV1RDUCgweDc1ZGExNGVmLCAweDMxZjMwNjM4KSwgV1RDUCgweDc1MDRkMzQ1LCAweDMzZGVmMjg3KSwKKyAgICBXVENQKDB4NzQyNzhjNzIsIDB4MzVjNzUwYmMpLCBXVENQKDB4NzM0MjRmYTAsIDB4MzdhYmZmNWQpLAorICAgIFdUQ1AoMHg3MjU1MmM4NSwgMHgzOThjZGQzMiksIFdUQ1AoMHg3MTYwMzM2MSwgMHgzYjY5Yzk0NyksCisgICAgV1RDUCgweDcwNjM3NGZmLCAweDNkNDJhMmVjKSwgV1RDUCgweDZmNWYwMmIyLCAweDNmMTc0OWI4KSwKKyAgICBXVENQKDB4NmU1MmVlNTIsIDB4NDBlNzlkOGMpLCBXVENQKDB4NmQzZjRhNDAsIDB4NDJiMzdlOTYpLAorICAgIFdUQ1AoMHg2YzI0Mjk2MCwgMHg0NDdhY2Q1MCksIFdUQ1AoMHg2YjAxOWYxYSwgMHg0NjNkNmE4NyksCisgICAgV1RDUCgweDY5ZDdiZjU3LCAweDQ3ZmIzNzU3KSwgV1RDUCgweDY4YTY5ZTgxLCAweDQ5YjQxNTMzKSwKKyAgICBXVENQKDB4Njc2ZTUxODMsIDB4NGI2N2U1ZTQpLCBXVENQKDB4NjYyZWVkYzMsIDB4NGQxNjhiOGIpLAorICAgIFdUQ1AoMHg2NGU4ODkyNiwgMHg0ZWJmZThhNSksIFdUQ1AoMHg2MzliM2EwYiwgMHg1MDYzZTAwOCksCisgICAgV1RDUCgweDYyNDcxNzQ5LCAweDUyMDI1NGVmKSwgV1RDUCgweDYwZWMzODMwLCAweDUzOWIyYWYwKSwKKyAgICBXVENQKDB4NWY4YWI0ODcsIDB4NTUyZTQ2MDUpLCBXVENQKDB4NWUyMmE0ODcsIDB4NTZiYjhhOTApLAorICAgIFdUQ1AoMHg1Y2I0MjBlMCwgMHg1ODQyZGQ1NCksIFdUQ1AoMHg1YjNmNDJhZSwgMHg1OWM0MjM4MSksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzEyMFtdID0geworICAgIFdUQ1AoMHg3ZmZmNGM1NCwgMHgwMGQ2NzZlYiksIFdUQ1AoMHg3ZmY5YWYwNCwgMHgwMjgzNWI1YSksCisgICAgV1RDUCgweDdmZWU3NGEyLCAweDA0MzAyMzhmKSwgV1RDUCgweDdmZGQ5ZGFkLCAweDA1ZGNiY2JlKSwKKyAgICBXVENQKDB4N2ZjNzJhZTIsIDB4MDc4OTE0MTgpLCBXVENQKDB4N2ZhYjFkM2QsIDB4MDkzNTE2ZDQpLAorICAgIFdUQ1AoMHg3Zjg5NzVmOSwgMHgwYWUwYjIyYyksIFdUQ1AoMHg3ZjYyMzY4ZiwgMHgwYzhiZDM1ZSksCisgICAgV1RDUCgweDdmMzU2MGI5LCAweDBlMzY2N2FkKSwgV1RDUCgweDdmMDJmNjZmLCAweDBmZTA1YzY0KSwKKyAgICBXVENQKDB4N2VjYWY5ZTUsIDB4MTE4OTllZDMpLCBXVENQKDB4N2U4ZDZkOTEsIDB4MTMzMjFjNTMpLAorICAgIFdUQ1AoMHg3ZTRhNTQyNiwgMHgxNGQ5YzI0NSksIFdUQ1AoMHg3ZTAxYjA5NiwgMHgxNjgwN2UxNSksCisgICAgV1RDUCgweDdkYjM4NjBmLCAweDE4MjYzZDM2KSwgV1RDUCgweDdkNWZkODAxLCAweDE5Y2FlZDI5KSwKKyAgICBXVENQKDB4N2QwNmFhMTYsIDB4MWI2ZTdiN2EpLCBXVENQKDB4N2NhODAwMzgsIDB4MWQxMGQ1YzIpLAorICAgIFdUQ1AoMHg3YzQzZGU4ZSwgMHgxZWIxZTlhNyksIFdUQ1AoMHg3YmRhNDk3ZCwgMHgyMDUxYTRkZCksCisgICAgV1RDUCgweDdiNmI0NWE1LCAweDIxZWZmNTI4KSwgV1RDUCgweDdhZjZkN2U2LCAweDIzOGNjODVkKSwKKyAgICBXVENQKDB4N2E3ZDA1NWIsIDB4MjUyODBjNWUpLCBXVENQKDB4NzlmZGQzNWMsIDB4MjZjMWFmMjIpLAorICAgIFdUQ1AoMHg3OTc5NDc3ZCwgMHgyODU5OWViMCksIFdUQ1AoMHg3OGVmNjc4ZiwgMHgyOWVmYzkyNSksCisgICAgV1RDUCgweDc4NjAzOTllLCAweDJiODQxY2FmKSwgV1RDUCgweDc3Y2JjM2YyLCAweDJkMTY4NzkyKSwKKyAgICBXVENQKDB4NzczMjBkMGQsIDB4MmVhNmY4MjcpLCBXVENQKDB4NzY5MzFiYWUsIDB4MzAzNTVjZGQpLAorICAgIFdUQ1AoMHg3NWVlZjZjZSwgMHgzMWMxYTQzYiksIFdUQ1AoMHg3NTQ1YTVhMCwgMHgzMzRiYmNkZSksCisgICAgV1RDUCgweDc0OTcyZjkyLCAweDM0ZDM5NTdlKSwgV1RDUCgweDczZTM5YzQ5LCAweDM2NTkxY2VhKSwKKyAgICBXVENQKDB4NzMyYWYzYTcsIDB4MzdkYzQyMGMpLCBXVENQKDB4NzI2ZDNkYzYsIDB4Mzk1Y2YzZTkpLAorICAgIFdUQ1AoMHg3MWFhODJmNywgMHgzYWRiMjFhMSksIFdUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksCisgICAgV1RDUCgweDcwMTYyMGY1LCAweDNkY2ZhZGIwKSwgV1RDUCgweDZmNDQ4YjdlLCAweDNmNDVlYWQ4KSwKKyAgICBXVENQKDB4NmU2ZTE0OTIsIDB4NDBiOTYxN2QpLCBXVENQKDB4NmQ5MmM1OWIsIDB4NDIyYTAxNTQpLAorICAgIFdUQ1AoMHg2Y2IyYTgzNywgMHg0Mzk3YmEzMiksIFdUQ1AoMHg2YmNkYzYzOSwgMHg0NTAyN2MwYyksCisgICAgV1RDUCgweDZhZTQyOWFlLCAweDQ2NmEzNmY5KSwgV1RDUCgweDY5ZjVkY2QzLCAweDQ3Y2VkYjMxKSwKKyAgICBXVENQKDB4NjkwMmVhMWQsIDB4NDkzMDU5MGYpLCBXVENQKDB4NjgwYjVjMzMsIDB4NGE4ZWExMTEpLAorICAgIFdUQ1AoMHg2NzBmM2RmMywgMHg0YmU5YTNkYiksIFdUQ1AoMHg2NjBlOWE2YSwgMHg0ZDQxNTIzNCksCisgICAgV1RDUCgweDY1MDk3Y2RiLCAweDRlOTU5ZDA4KSwgV1RDUCgweDYzZmZmMGJhLCAweDRmZTY3NTZhKSwKKyAgICBXVENQKDB4NjJmMjAxYWMsIDB4NTEzM2NjOTQpLCBXVENQKDB4NjFkZmJiOGEsIDB4NTI3ZDkzZTYpLAorICAgIFdUQ1AoMHg2MGM5MmE1YSwgMHg1M2MzYmNlYSksIFdUQ1AoMHg1ZmFlNWE1NSwgMHg1NTA2Mzk1MSksCisgICAgV1RDUCgweDVlOGY1N2UyLCAweDU2NDRmYWY0KSwgV1RDUCgweDVkNmMyZjk5LCAweDU3N2ZmM2RhKSwKKyAgICBXVENQKDB4NWM0NGVlNDAsIDB4NThiNzE2MzIpLCBXVENQKDB4NWIxOWEwYzgsIDB4NTllYTU0NTQpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMjhbXSA9IHsKKyAgICBXVENQKDB4N2ZmZjYyMTYsIDB4MDBjOTBmODgpLCBXVENQKDB4N2ZmYTcyZDEsIDB4MDI1YjI2ZDcpLAorICAgIFdUQ1AoMHg3ZmYwOTQ3OCwgMHgwM2VkMjZlNiksIFdUQ1AoMHg3ZmUxYzc2YiwgMHgwNTdmMDAzNSksCisgICAgV1RDUCgweDdmY2UwYzNlLCAweDA3MTBhMzQ1KSwgV1RDUCgweDdmYjU2M2IzLCAweDA4YTIwMDlhKSwKKyAgICBXVENQKDB4N2Y5N2NlYmQsIDB4MGEzMzA4YmQpLCBXVENQKDB4N2Y3NTRlODAsIDB4MGJjM2FjMzUpLAorICAgIFdUQ1AoMHg3ZjRkZTQ1MSwgMHgwZDUzZGI5MiksIFdUQ1AoMHg3ZjIxOTFiNCwgMHgwZWUzODc2NiksCisgICAgV1RDUCgweDdlZjA1ODYwLCAweDEwNzJhMDQ4KSwgV1RDUCgweDdlYmEzYTM5LCAweDEyMDExNmQ1KSwKKyAgICBXVENQKDB4N2U3ZjM5NTcsIDB4MTM4ZWRiYjEpLCBXVENQKDB4N2UzZjU3ZmYsIDB4MTUxYmRmODYpLAorICAgIFdUQ1AoMHg3ZGZhOThhOCwgMHgxNmE4MTMwNSksIFdUQ1AoMHg3ZGIwZmRmOCwgMHgxODMzNjZlOSksCisgICAgV1RDUCgweDdkNjI4YWM2LCAweDE5YmRjYmYzKSwgV1RDUCgweDdkMGY0MjE4LCAweDFiNDczMmVmKSwKKyAgICBXVENQKDB4N2NiNzI3MjQsIDB4MWNjZjhjYjMpLCBXVENQKDB4N2M1YTNkNTAsIDB4MWU1NmNhMWUpLAorICAgIFdUQ1AoMHg3YmY4ODgzMCwgMHgxZmRjZGMxYiksIFdUQ1AoMHg3YjkyMGI4OSwgMHgyMTYxYjNhMCksCisgICAgV1RDUCgweDdiMjZjYjRmLCAweDIyZTU0MWFmKSwgV1RDUCgweDdhYjZjYmE0LCAweDI0Njc3NzU4KSwKKyAgICBXVENQKDB4N2E0MjEwZDgsIDB4MjVlODQ1YjYpLCBXVENQKDB4NzljODlmNmUsIDB4Mjc2NzlkZjQpLAorICAgIFdUQ1AoMHg3OTRhN2MxMiwgMHgyOGU1NzE0YiksIFdUQ1AoMHg3OGM3YWJhMiwgMHgyYTYxYjEwMSksCisgICAgV1RDUCgweDc4NDAzMzI5LCAweDJiZGM0ZTZmKSwgV1RDUCgweDc3YjQxN2RmLCAweDJkNTUzYWZjKSwKKyAgICBXVENQKDB4NzcyMzVmMmQsIDB4MmVjYzY4MWUpLCBXVENQKDB4NzY4ZTBlYTYsIDB4MzA0MWM3NjEpLAorICAgIFdUQ1AoMHg3NWY0MmMwYiwgMHgzMWI1NGE1ZSksIFdUQ1AoMHg3NTU1YmQ0YywgMHgzMzI2ZTJjMyksCisgICAgV1RDUCgweDc0YjJjODg0LCAweDM0OTY4MjUwKSwgV1RDUCgweDc0MGI1M2ZiLCAweDM2MDQxYWQ5KSwKKyAgICBXVENQKDB4NzM1ZjY2MjYsIDB4Mzc2ZjllNDYpLCBXVENQKDB4NzJhZjA1YTcsIDB4MzhkOGZlOTMpLAorICAgIFdUQ1AoMHg3MWZhMzk0OSwgMHgzYTQwMmRkMiksIFdUQ1AoMHg3MTQxMDgwNSwgMHgzYmE1MWUyOSksCisgICAgV1RDUCgweDcwODM3OGZmLCAweDNkMDdjMWQ2KSwgV1RDUCgweDZmYzE5Mzg1LCAweDNlNjgwYjJjKSwKKyAgICBXVENQKDB4NmVmYjVmMTIsIDB4M2ZjNWVjOTgpLCBXVENQKDB4NmUzMGUzNGEsIDB4NDEyMTU4OWIpLAorICAgIFdUQ1AoMHg2ZDYyMjdmYSwgMHg0MjdhNDFkMCksIFdUQ1AoMHg2YzhmMzUxYywgMHg0M2QwOWFlZCksCisgICAgV1RDUCgweDZiYjgxMmQxLCAweDQ1MjQ1NmJkKSwgV1RDUCgweDZhZGNjOTY0LCAweDQ2NzU2ODI4KSwKKyAgICBXVENQKDB4NjlmZDYxNGEsIDB4NDdjM2MyMmYpLCBXVENQKDB4NjkxOWUzMjAsIDB4NDkwZjU3ZWUpLAorICAgIFdUQ1AoMHg2ODMyNTdhYiwgMHg0YTU4MWM5ZSksIFdUQ1AoMHg2NzQ2YzdkOCwgMHg0YjllMDM5MCksCisgICAgV1RDUCgweDY2NTczY2JiLCAweDRjZTEwMDM0KSwgV1RDUCgweDY1NjNiZjkyLCAweDRlMjEwNjE3KSwKKyAgICBXVENQKDB4NjQ2YzU5YmYsIDB4NGY1ZTA4ZTMpLCBXVENQKDB4NjM3MTE0Y2MsIDB4NTA5N2ZjNWUpLAorICAgIFdUQ1AoMHg2MjcxZmE2OSwgMHg1MWNlZDQ2ZSksIFdUQ1AoMHg2MTZmMTQ2YywgMHg1MzAyODUxOCksCisgICAgV1RDUCgweDYwNjg2Y2NmLCAweDU0MzMwMjdkKSwgV1RDUCgweDVmNWUwZGIzLCAweDU1NjA0MGUyKSwKKyAgICBXVENQKDB4NWU1MDAxNWQsIDB4NTY4YTM0YTkpLCBXVENQKDB4NWQzZTUyMzcsIDB4NTdiMGQyNTYpLAorICAgIFdUQ1AoMHg1YzI5MGFjYywgMHg1OGQ0MGU4YyksIFdUQ1AoMHg1YjEwMzVjZiwgMHg1OWYzZGUxMiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzE2MFtdID0geworICAgIFdUQ1AoMHg3ZmZmOWFlZiwgMHgwMGEwZDk1MSksIFdUQ1AoMHg3ZmZjNzI2ZiwgMHgwMWUyODdmYyksCisgICAgV1RDUCgweDdmZjYyMTgyLCAweDAzMjQyYWJmKSwgV1RDUCgweDdmZWNhODUxLCAweDA0NjViOWFhKSwKKyAgICBXVENQKDB4N2ZlMDA3MTYsIDB4MDVhNzJjY2YpLCBXVENQKDB4N2ZkMDNlMjMsIDB4MDZlODdjM2YpLAorICAgIFdUQ1AoMHg3ZmJkNGRkYSwgMHgwODI5YTAwYyksIFdUQ1AoMHg3ZmE3MzZiNCwgMHgwOTZhOTA0OSksCisgICAgV1RDUCgweDdmOGRmOTNjLCAweDBhYWI0NTBkKSwgV1RDUCgweDdmNzE5NjExLCAweDBiZWJiNjZjKSwKKyAgICBXVENQKDB4N2Y1MjBkZTYsIDB4MGQyYmRjODApLCBXVENQKDB4N2YyZjYxODMsIDB4MGU2YmFmNjEpLAorICAgIFdUQ1AoMHg3ZjA5OTFjNCwgMHgwZmFiMjcyYiksIFdUQ1AoMHg3ZWUwOWY5NSwgMHgxMGVhM2JmZCksCisgICAgV1RDUCgweDdlYjQ4YmZiLCAweDEyMjhlNWY4KSwgV1RDUCgweDdlODU1ODBjLCAweDEzNjcxZDNkKSwKKyAgICBXVENQKDB4N2U1MzA0ZjIsIDB4MTRhNGQ5ZjQpLCBXVENQKDB4N2UxZDkzZWEsIDB4MTVlMjE0NDUpLAorICAgIFdUQ1AoMHg3ZGU1MDY0NiwgMHgxNzFlYzQ1YyksIFdUQ1AoMHg3ZGE5NWQ2YywgMHgxODVhZTI2OSksCisgICAgV1RDUCgweDdkNmE5YWQ1LCAweDE5OTY2NmEwKSwgV1RDUCgweDdkMjhjMDBjLCAweDFhZDE0OTM4KSwKKyAgICBXVENQKDB4N2NlM2NlYjIsIDB4MWMwYjgyNmEpLCBXVENQKDB4N2M5YmM4N2EsIDB4MWQ0NTBhNzgpLAorICAgIFdUQ1AoMHg3YzUwYWYyYiwgMHgxZTdkZDlhNCksIFdUQ1AoMHg3YzAyODQ5ZiwgMHgxZmI1ZTgzNiksCisgICAgV1RDUCgweDdiYjE0YWM1LCAweDIwZWQyZTdiKSwgV1RDUCgweDdiNWQwMzllLCAweDIyMjNhNGM1KSwKKyAgICBXVENQKDB4N2IwNWIxM2QsIDB4MjM1OTQzNmMpLCBXVENQKDB4N2FhYjU1Y2EsIDB4MjQ4ZTAyY2IpLAorICAgIFdUQ1AoMHg3YTRkZjM4MCwgMHgyNWMxZGI0NCksIFdUQ1AoMHg3OWVkOGNhZCwgMHgyNmY0YzUzZSksCisgICAgV1RDUCgweDc5OGEyM2IxLCAweDI4MjZiOTI4KSwgV1RDUCgweDc5MjNiYjAxLCAweDI5NTdhZjc0KSwKKyAgICBXVENQKDB4NzhiYTU1MjQsIDB4MmE4N2EwOWQpLCBXVENQKDB4Nzg0ZGY0YjMsIDB4MmJiNjg1MjIpLAorICAgIFdUQ1AoMHg3N2RlOWM1YiwgMHgyY2U0NTU4OSksIFdUQ1AoMHg3NzZjNGVkYiwgMHgyZTExMGE2MiksCisgICAgV1RDUCgweDc2ZjcwZjA1LCAweDJmM2M5YzQwKSwgV1RDUCgweDc2N2VkZmJlLCAweDMwNjcwM2JmKSwKKyAgICBXVENQKDB4NzYwM2MzZmQsIDB4MzE5MDM5ODIpLCBXVENQKDB4NzU4NWJlY2IsIDB4MzJiODM2MzQpLAorICAgIFdUQ1AoMHg3NTA0ZDM0NSwgMHgzM2RlZjI4NyksIFdUQ1AoMHg3NDgxMDQ5OSwgMHgzNTA0NjczNiksCisgICAgV1RDUCgweDczZmE1NjA3LCAweDM2Mjg4ZDAzKSwgV1RDUCgweDczNzBjYWUyLCAweDM3NGI1Y2I5KSwKKyAgICBXVENQKDB4NzJlNDY2OGYsIDB4Mzg2Y2NmMmEpLCBXVENQKDB4NzI1NTJjODUsIDB4Mzk4Y2RkMzIpLAorICAgIFdUQ1AoMHg3MWMzMjA0YywgMHgzYWFiN2ZiNyksIFdUQ1AoMHg3MTJlNDU3ZiwgMHgzYmM4YWZhNSksCisgICAgV1RDUCgweDcwOTY5ZmNhLCAweDNjZTQ2NWYzKSwgV1RDUCgweDZmZmMzMmViLCAweDNkZmU5YmExKSwKKyAgICBXVENQKDB4NmY1ZjAyYjIsIDB4M2YxNzQ5YjgpLCBXVENQKDB4NmViZjEyZmYsIDB4NDAyZTY5NGMpLAorICAgIFdUQ1AoMHg2ZTFjNjdjNCwgMHg0MTQzZjM3OSksIFdUQ1AoMHg2ZDc3MDUwNiwgMHg0MjU3ZTE2NiksCisgICAgV1RDUCgweDZjY2VlZWQ4LCAweDQzNmEyYzQ1KSwgV1RDUCgweDZjMjQyOTYwLCAweDQ0N2FjZDUwKSwKKyAgICBXVENQKDB4NmI3NmI4ZDYsIDB4NDU4OWJkY2YpLCBXVENQKDB4NmFjNmExODAsIDB4NDY5NmY3MTApLAorICAgIFdUQ1AoMHg2YTEzZTdiOCwgMHg0N2EyNzI3MSksIFdUQ1AoMHg2OTVlOGZlNSwgMHg0OGFjMjk1NyksCisgICAgV1RDUCgweDY4YTY5ZTgxLCAweDQ5YjQxNTMzKSwgV1RDUCgweDY3ZWMxODE3LCAweDRhYmEyZjg0KSwKKyAgICBXVENQKDB4NjcyZjAxM2YsIDB4NGJiZTcxZDEpLCBXVENQKDB4NjY2ZjVlYTYsIDB4NGNjMGQ1YWUpLAorICAgIFdUQ1AoMHg2NWFkMzUwNSwgMHg0ZGMxNTRiYiksIFdUQ1AoMHg2NGU4ODkyNiwgMHg0ZWJmZThhNSksCisgICAgV1RDUCgweDY0MjE1ZmU1LCAweDRmYmM4YjIyKSwgV1RDUCgweDYzNTdiZTJhLCAweDUwYjczNWY4KSwKKyAgICBXVENQKDB4NjI4YmE4ZWYsIDB4NTFhZmUyZjYpLCBXVENQKDB4NjFiZDI1M2YsIDB4NTJhNjhiZmIpLAorICAgIFdUQ1AoMHg2MGVjMzgzMCwgMHg1MzliMmFmMCksIFdUQ1AoMHg2MDE4ZTZlYiwgMHg1NDhkYjljYiksCisgICAgV1RDUCgweDVmNDMzNmE3LCAweDU1N2UzMjkyKSwgV1RDUCgweDVlNmIyY2E4LCAweDU2NmM4ZjU1KSwKKyAgICBXVENQKDB4NWQ5MGNlNDUsIDB4NTc1OGNhMzEpLCBXVENQKDB4NWNiNDIwZTAsIDB4NTg0MmRkNTQpLAorICAgIFdUQ1AoMHg1YmQ1MjllYiwgMHg1OTJhYzJmNyksIFdUQ1AoMHg1YWYzZWVlNiwgMHg1YTEwNzU2MSksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzE5MltdID0geworICAgIFdUQ1AoMHg3ZmZmYjlkMSwgMHgwMDg2MGE3OSksIFdUQ1AoMHg3ZmZkODg1YSwgMHgwMTkyMWQyMCksCisgICAgV1RDUCgweDdmZjkyNTc3LCAweDAyOWUyOGUyKSwgV1RDUCgweDdmZjI5MTNhLCAweDAzYWEyOTJhKSwKKyAgICBXVENQKDB4N2ZlOWNiYzAsIDB4MDRiNjE5NWQpLCBXVENQKDB4N2ZkZWQ1MzAsIDB4MDVjMWY0ZTcpLAorICAgIFdUQ1AoMHg3ZmQxYWRiOSwgMHgwNmNkYjcyZiksIFdUQ1AoMHg3ZmMyNTU5NiwgMHgwN2Q5NWI5ZSksCisgICAgV1RDUCgweDdmYjBjZDBhLCAweDA4ZTRkZGEwKSwgV1RDUCgweDdmOWQxNDYxLCAweDA5ZjAzODlmKSwKKyAgICBXVENQKDB4N2Y4NzJiZjMsIDB4MGFmYjY4MDUpLCBXVENQKDB4N2Y2ZjE0MWYsIDB4MGMwNjY3NDApLAorICAgIFdUQ1AoMHg3ZjU0Y2Q0ZiwgMHgwZDExMzFiYSksIFdUQ1AoMHg3ZjM4NTdmNiwgMHgwZTFiYzJlNCksCisgICAgV1RDUCgweDdmMTliNDkxLCAweDBmMjYxNjJhKSwgV1RDUCgweDdlZjhlM2E2LCAweDEwMzAyNmZlKSwKKyAgICBXVENQKDB4N2VkNWU1YzYsIDB4MTEzOWYwY2YpLCBXVENQKDB4N2ViMGJiOGEsIDB4MTI0MzZmMTApLAorICAgIFdUQ1AoMHg3ZTg5NjU5NSwgMHgxMzRjOWQzNCksIFdUQ1AoMHg3ZTVmZTQ5MywgMHgxNDU1NzZiMSksCisgICAgV1RDUCgweDdlMzQzOTNiLCAweDE1NWRmNmZjKSwgV1RDUCgweDdlMDY2NDRjLCAweDE2NjYxOThkKSwKKyAgICBXVENQKDB4N2RkNjY2OGYsIDB4MTc2ZGQ5ZGUpLCBXVENQKDB4N2RhNDQwZDYsIDB4MTg3NTMzNmEpLAorICAgIFdUQ1AoMHg3ZDZmZjNmZSwgMHgxOTdjMjFhZCksIFdUQ1AoMHg3ZDM5ODBlYywgMHgxYTgyYTAyNiksCisgICAgV1RDUCgweDdkMDBlODhmLCAweDFiODhhYTU1KSwgV1RDUCgweDdjYzYyYmRmLCAweDFjOGUzYmJlKSwKKyAgICBXVENQKDB4N2M4OTRiZGUsIDB4MWQ5MzRmZTUpLCBXVENQKDB4N2M0YTQ5OTYsIDB4MWU5N2UyNTEpLAorICAgIFdUQ1AoMHg3YzA5MjYxZCwgMHgxZjliZWU4YSksIFdUQ1AoMHg3YmM1ZTI5MCwgMHgyMDlmNzAxYyksCisgICAgV1RDUCgweDdiODA4MDE1LCAweDIxYTI2Mjk1KSwgV1RDUCgweDdiMzhmZmRlLCAweDIyYTRjMTg1KSwKKyAgICBXVENQKDB4N2FlZjYzMjMsIDB4MjNhNjg4N2YpLCBXVENQKDB4N2FhM2FiMjksIDB4MjRhN2IzMTcpLAorICAgIFdUQ1AoMHg3YTU1ZDkzYSwgMHgyNWE4M2NlNiksIFdUQ1AoMHg3YTA1ZWVhZCwgMHgyNmE4MjE4NiksCisgICAgV1RDUCgweDc5YjNlY2UwLCAweDI3YTc1Yzk1KSwgV1RDUCgweDc5NWZkNTNhLCAweDI4YTVlOWI0KSwKKyAgICBXVENQKDB4NzkwOWE5MmQsIDB4MjlhM2M0ODUpLCBXVENQKDB4NzhiMTZhMzIsIDB4MmFhMGU4YjApLAorICAgIFdUQ1AoMHg3ODU3MTljYywgMHgyYjlkNTFkZCksIFdUQ1AoMHg3N2ZhYjk4OSwgMHgyYzk4ZmJiYSksCisgICAgV1RDUCgweDc3OWM0YWZjLCAweDJkOTNlMWY4KSwgV1RDUCgweDc3M2JjZmM0LCAweDJlOGUwMDQ4KSwKKyAgICBXVENQKDB4NzZkOTQ5ODksIDB4MmY4NzUyNjIpLCBXVENQKDB4NzY3NGI5ZmEsIDB4MzA3ZmQ0MDEpLAorICAgIFdUQ1AoMHg3NjBlMjJkMSwgMHgzMTc3ODBlMiksIFdUQ1AoMHg3NWE1ODVjZiwgMHgzMjZlNTRjNyksCisgICAgV1RDUCgweDc1M2FlNGMwLCAweDMzNjQ0Yjc2KSwgV1RDUCgweDc0Y2U0MTc3LCAweDM0NTk2MGI3KSwKKyAgICBXVENQKDB4NzQ1ZjlkZDEsIDB4MzU0ZDkwNTcpLCBXVENQKDB4NzNlZWZiYjMsIDB4MzY0MGQ2MjcpLAorICAgIFdUQ1AoMHg3MzdjNWQwYiwgMHgzNzMzMmRmZCksIFdUQ1AoMHg3MzA3YzNkMCwgMHgzODI0OTNiMCksCisgICAgV1RDUCgweDcyOTEzMjAxLCAweDM5MTUwMzFmKSwgV1RDUCgweDcyMThhOWE3LCAweDNhMDQ3ODJhKSwKKyAgICBXVENQKDB4NzE5ZTJjZDIsIDB4M2FmMmVlYjcpLCBXVENQKDB4NzEyMWJkOWMsIDB4M2JlMDYyYjApLAorICAgIFdUQ1AoMHg3MGEzNWUyNSwgMHgzY2NjZDAwNCksIFdUQ1AoMHg3MDIzMTA5YSwgMHgzZGI4MzJhNiksCisgICAgV1RDUCgweDZmYTBkNzJjLCAweDNlYTI4NjhjKSwgV1RDUCgweDZmMWNiNDE2LCAweDNmOGJjN2I0KSwKKyAgICBXVENQKDB4NmU5NmE5OWQsIDB4NDA3M2YyMWQpLCBXVENQKDB4NmUwZWJhMGMsIDB4NDE1YjAxY2UpLAorICAgIFdUQ1AoMHg2ZDg0ZTdiNywgMHg0MjQwZjJkMSksIFdUQ1AoMHg2Y2Y5MzRmYywgMHg0MzI1YzEzNSksCisgICAgV1RDUCgweDZjNmJhNDNlLCAweDQ0MDk2OTEwKSwgV1RDUCgweDZiZGMzN2ViLCAweDQ0ZWJlNjc5KSwKKyAgICBXVENQKDB4NmI0YWYyNzksIDB4NDVjZDM1OGYpLCBXVENQKDB4NmFiN2Q2NjMsIDB4NDZhZDUyNzgpLAorICAgIFdUQ1AoMHg2YTIyZTYzMCwgMHg0NzhjMzk1YSksIFdUQ1AoMHg2OThjMjQ2YywgMHg0ODY5ZTY2NSksCisgICAgV1RDUCgweDY4ZjM5M2FlLCAweDQ5NDY1NWNjKSwgV1RDUCgweDY4NTkzNjkxLCAweDRhMjE4M2M4KSwKKyAgICBXVENQKDB4NjdiZDBmYmQsIDB4NGFmYjZjOTgpLCBXVENQKDB4NjcxZjIxZGMsIDB4NGJkNDBjODApLAorICAgIFdUQ1AoMHg2NjdmNmZhNSwgMHg0Y2FiNWZjOSksIFdUQ1AoMHg2NWRkZmJkMywgMHg0ZDgxNjJjNCksCisgICAgV1RDUCgweDY1M2FjOTJiLCAweDRlNTYxMWM1KSwgV1RDUCgweDY0OTVkYTc5LCAweDRmMjk2OTI4KSwKKyAgICBXVENQKDB4NjNlZjMyOTAsIDB4NGZmYjY1NGQpLCBXVENQKDB4NjM0NmQ0NGIsIDB4NTBjYzAyOWMpLAorICAgIFdUQ1AoMHg2MjljYzI4YywgMHg1MTliM2Q4MCksIFdUQ1AoMHg2MWYxMDAzZiwgMHg1MjY5MTI2ZSksCisgICAgV1RDUCgweDYxNDM5MDUzLCAweDUzMzU3ZGRmKSwgV1RDUCgweDYwOTQ3NWMzLCAweDU0MDA3YzUxKSwKKyAgICBXVENQKDB4NWZlM2IzOGQsIDB4NTRjYTBhNGIpLCBXVENQKDB4NWYzMTRjYmEsIDB4NTU5MjI0NTcpLAorICAgIFdUQ1AoMHg1ZTdkNDQ1OCwgMHg1NjU4YzcwOSksIFdUQ1AoMHg1ZGM3OWQ3YywgMHg1NzFkZWVmYSksCisgICAgV1RDUCgweDVkMTA1YjQ0LCAweDU3ZTE5OGM3KSwgV1RDUCgweDVjNTc4MGQzLCAweDU4YTNjMTE4KSwKKyAgICBXVENQKDB4NWI5ZDExNTQsIDB4NTk2NDY0OTgpLCBXVENQKDB4NWFlMTBmZjksIDB4NWEyMzdmZmEpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cyNDBbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmQzMTUsIDB4MDA2YjNiOWIpLCBXVENQKDB4N2ZmZTZiYmYsIDB4MDE0MWIxYTUpLAorICAgIFdUQ1AoMHg3ZmZiOWQxNSwgMHgwMjE4MjQyNyksIFdUQ1AoMHg3ZmY3NjcyMSwgMHgwMmVlOTBjOCksCisgICAgV1RDUCgweDdmZjFjOWVmLCAweDAzYzRmNTJmKSwgV1RDUCgweDdmZWFjNThkLCAweDA0OWI0ZjAwKSwKKyAgICBXVENQKDB4N2ZlMjVhMGYsIDB4MDU3MTliZTIpLCBXVENQKDB4N2ZkODg3OGUsIDB4MDY0N2Q5N2MpLAorICAgIFdUQ1AoMHg3ZmNkNGUyNCwgMHgwNzFlMDU3NSksIFdUQ1AoMHg3ZmMwYWRmMiwgMHgwN2Y0MWQ3MiksCisgICAgV1RDUCgweDdmYjJhNzFiLCAweDA4Y2ExZjFiKSwgV1RDUCgweDdmYTMzOWM1LCAweDA5YTAwODE3KSwKKyAgICBXVENQKDB4N2Y5MjY2MWQsIDB4MGE3NWQ2MGUpLCBXVENQKDB4N2Y4MDJjNTIsIDB4MGI0Yjg2YTgpLAorICAgIFdUQ1AoMHg3ZjZjOGM5NiwgMHgwYzIxMTc4YyksIFdUQ1AoMHg3ZjU3ODcyMSwgMHgwY2Y2ODY2MiksCisgICAgV1RDUCgweDdmNDExYzJmLCAweDBkY2JkMGQ1KSwgV1RDUCgweDdmMjk0YmZkLCAweDBlYTBmNDhjKSwKKyAgICBXVENQKDB4N2YxMDE2Y2UsIDB4MGY3NWVmMzMpLCBXVENQKDB4N2VmNTdjZWEsIDB4MTA0YWJlNzEpLAorICAgIFdUQ1AoMHg3ZWQ5N2U5YywgMHgxMTFmNWZmNCksIFdUQ1AoMHg3ZWJjMWMzMSwgMHgxMWYzZDE2NCksCisgICAgV1RDUCgweDdlOWQ1NWZjLCAweDEyYzgxMDZmKSwgV1RDUCgweDdlN2QyYzU0LCAweDEzOWMxYWJmKSwKKyAgICBXVENQKDB4N2U1YjlmOTMsIDB4MTQ2ZmVlMDMpLCBXVENQKDB4N2UzOGIwMTcsIDB4MTU0Mzg3ZTYpLAorICAgIFdUQ1AoMHg3ZTE0NWU0MiwgMHgxNjE2ZTYxOCksIFdUQ1AoMHg3ZGVlYWE3YSwgMHgxNmVhMDY0NiksCisgICAgV1RDUCgweDdkYzc5NTI5LCAweDE3YmNlNjIxKSwgV1RDUCgweDdkOWYxZWJkLCAweDE4OGY4MzU3KSwKKyAgICBXVENQKDB4N2Q3NTQ3YTcsIDB4MTk2MWRiOWIpLCBXVENQKDB4N2Q0YTEwNWQsIDB4MWEzM2VjOWMpLAorICAgIFdUQ1AoMHg3ZDFkNzk1OCwgMHgxYjA1YjQwZiksIFdUQ1AoMHg3Y2VmODMxNSwgMHgxYmQ3MmZhNCksCisgICAgV1RDUCgweDdjYzAyZTE1LCAweDFjYTg1ZDEyKSwgV1RDUCgweDdjOGY3YWRlLCAweDFkNzkzYTBiKSwKKyAgICBXVENQKDB4N2M1ZDY5ZjcsIDB4MWU0OWM0NDcpLCBXVENQKDB4N2MyOWZiZWUsIDB4MWYxOWY5N2IpLAorICAgIFdUQ1AoMHg3YmY1MzE1MywgMHgxZmU5ZDc1ZiksIFdUQ1AoMHg3YmJmMGFiYSwgMHgyMGI5NWJhYyksCisgICAgV1RDUCgweDdiODc4OGJhLCAweDIxODg4NDFhKSwgV1RDUCgweDdiNGVhYmYxLCAweDIyNTc0ZTY1KSwKKyAgICBXVENQKDB4N2IxNDc0ZmQsIDB4MjMyNWI4NDcpLCBXVENQKDB4N2FkOGU0ODIsIDB4MjNmM2JmN2UpLAorICAgIFdUQ1AoMHg3YTliZmIyNywgMHgyNGMxNjFjNyksIFdUQ1AoMHg3YTVkYjk5NywgMHgyNThlOWNlMCksCisgICAgV1RDUCgweDdhMWUyMDgyLCAweDI2NWI2ZThhKSwgV1RDUCgweDc5ZGQzMDk4LCAweDI3MjdkNDg2KSwKKyAgICBXVENQKDB4Nzk5YWVhOTIsIDB4MjdmM2NjOTQpLCBXVENQKDB4Nzk1NzRmMjgsIDB4MjhiZjU0N2IpLAorICAgIFdUQ1AoMHg3OTEyNWYxOSwgMHgyOThhNjlmYyksIFdUQ1AoMHg3OGNjMWIyNiwgMHgyYTU1MGFkZiksCisgICAgV1RDUCgweDc4ODQ4NDE0LCAweDJiMWYzNGViKSwgV1RDUCgweDc4M2I5YWFkLCAweDJiZThlNWU4KSwKKyAgICBXVENQKDB4NzdmMTVmYmMsIDB4MmNiMjFiYTApLCBXVENQKDB4NzdhNWQ0MTMsIDB4MmQ3YWQzZGUpLAorICAgIFdUQ1AoMHg3NzU4Zjg4NiwgMHgyZTQzMGM2ZiksIFdUQ1AoMHg3NzBhY2RlYywgMHgyZjBhYzMyMCksCisgICAgV1RDUCgweDc2YmI1NTIxLCAweDJmZDFmNWMxKSwgV1RDUCgweDc2NmE4ZjA0LCAweDMwOThhMjIzKSwKKyAgICBXVENQKDB4NzYxODdjNzcsIDB4MzE1ZWM2MTcpLCBXVENQKDB4NzVjNTFlNjEsIDB4MzIyNDVmNzIpLAorICAgIFdUQ1AoMHg3NTcwNzVhYywgMHgzMmU5NmMwOSksIFdUQ1AoMHg3NTFhODM0NiwgMHgzM2FkZTliMyksCisgICAgV1RDUCgweDc0YzM0ODIwLCAweDM0NzFkNjQ3KSwgV1RDUCgweDc0NmFjNTJmLCAweDM1MzUyZmExKSwKKyAgICBXVENQKDB4NzQxMGZiNmIsIDB4MzVmN2YzOWMpLCBXVENQKDB4NzNiNWViZDEsIDB4MzZiYTIwMTQpLAorICAgIFdUQ1AoMHg3MzU5OTc2MCwgMHgzNzdiYjJlOSksIFdUQ1AoMHg3MmZiZmYxYiwgMHgzODNjYTlmYiksCisgICAgV1RDUCgweDcyOWQyNDA5LCAweDM4ZmQwMzJkKSwgV1RDUCgweDcyM2QwNzM0LCAweDM5YmNiYzYzKSwKKyAgICBXVENQKDB4NzFkYmE5YWIsIDB4M2E3YmQzODIpLCBXVENQKDB4NzE3OTBjN2UsIDB4M2IzYTQ2NzIpLAorICAgIFdUQ1AoMHg3MTE1MzBjMiwgMHgzYmY4MTMxYyksIFdUQ1AoMHg3MGIwMTc5MCwgMHgzY2I1Mzc2YiksCisgICAgV1RDUCgweDcwNDljMjAzLCAweDNkNzFiMTRkKSwgV1RDUCgweDZmZTIzMTNjLCAweDNlMmQ3ZWIxKSwKKyAgICBXVENQKDB4NmY3OTY2NWIsIDB4M2VlODlkODYpLCBXVENQKDB4NmYwZjYyODksIDB4M2ZhMzBiYzEpLAorICAgIFdUQ1AoMHg2ZWE0MjZlZCwgMHg0MDVjYzc1NCksIFdUQ1AoMHg2ZTM3YjRiNiwgMHg0MTE1Y2UzOCksCisgICAgV1RDUCgweDZkY2EwZDE0LCAweDQxY2UxZTY1KSwgV1RDUCgweDZkNWIzMTNiLCAweDQyODViNWQ0KSwKKyAgICBXVENQKDB4NmNlYjIyNjEsIDB4NDMzYzkyODMpLCBXVENQKDB4NmM3OWUxYzIsIDB4NDNmMmIyNzEpLAorICAgIFdUQ1AoMHg2YzA3NzA5YiwgMHg0NGE4MTM5ZSksIFdUQ1AoMHg2YjkzZDAyZSwgMHg0NTVjYjQwYyksCisgICAgV1RDUCgweDZiMWYwMWMwLCAweDQ2MTA5MWMyKSwgV1RDUCgweDZhYTkwNjk3LCAweDQ2YzNhYWM1KSwKKyAgICBXVENQKDB4NmEzMWUwMDAsIDB4NDc3NWZkMWYpLCBXVENQKDB4NjliOThmNDgsIDB4NDgyNzg2ZGMpLAorICAgIFdUQ1AoMHg2OTQwMTVjMywgMHg0OGQ4NDYwOSksIFdUQ1AoMHg2OGM1NzRjNCwgMHg0OTg4MzhiNiksCisgICAgV1RDUCgweDY4NDlhZGEzLCAweDRhMzc1Y2Y1KSwgV1RDUCgweDY3Y2NjMWJlLCAweDRhZTViMGRhKSwKKyAgICBXVENQKDB4Njc0ZWIyNzEsIDB4NGI5MzMyN2MpLCBXVENQKDB4NjZjZjgxMjAsIDB4NGMzZmRmZjQpLAorICAgIFdUQ1AoMHg2NjRmMmYyZSwgMHg0Y2ViYjc1YyksIFdUQ1AoMHg2NWNkYmUwNSwgMHg0ZDk2YjZkMyksCisgICAgV1RDUCgweDY1NGIyZjEwLCAweDRlNDBkYzc5KSwgV1RDUCgweDY0Yzc4M2JkLCAweDRlZWEyNjcwKSwKKyAgICBXVENQKDB4NjQ0MmJkN2UsIDB4NGY5MjkyZGMpLCBXVENQKDB4NjNiY2RkYzcsIDB4NTAzYTFmZTUpLAorICAgIFdUQ1AoMHg2MzM1ZTYxMSwgMHg1MGUwY2JiNCksIFdUQ1AoMHg2MmFkZDdkNiwgMHg1MTg2OTQ3NiksCisgICAgV1RDUCgweDYyMjRiNDk1LCAweDUyMmI3ODU5KSwgV1RDUCgweDYxOWE3ZGNlLCAweDUyY2Y3NThmKSwKKyAgICBXVENQKDB4NjEwZjM1MDUsIDB4NTM3MjhhNGEpLCBXVENQKDB4NjA4MmRiYzEsIDB4NTQxNGI0YzEpLAorICAgIFdUQ1AoMHg1ZmY1NzM4ZCwgMHg1NGI1ZjMyYyksIFdUQ1AoMHg1ZjY2ZmRmNSwgMHg1NTU2NDNjOCksCisgICAgV1RDUCgweDVlZDc3YzhhLCAweDU1ZjVhNGQyKSwgV1RDUCgweDVlNDZmMGRkLCAweDU2OTQxNDhiKSwKKyAgICBXVENQKDB4NWRiNTVjODYsIDB4NTczMTkxMzUpLCBXVENQKDB4NWQyMmMxMWMsIDB4NTdjZTE5MTcpLAorICAgIFdUQ1AoMHg1YzhmMjAzYiwgMHg1ODY5YWE3OSksIFdUQ1AoMHg1YmZhN2I4MiwgMHg1OTA0NDNhNyksCisgICAgV1RDUCgweDViNjRkNDkyLCAweDU5OWRlMmVlKSwgV1RDUCgweDVhY2UyZDBmLCAweDVhMzY4NjlmKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MjU2W10gPSB7CisgICAgV1RDUCgweDdmZmZkODg2LCAweDAwNjQ4N2UzKSwgV1RDUCgweDdmZmU5Y2IyLCAweDAxMmQ5NmIxKSwKKyAgICBXVENQKDB4N2ZmYzI1MGYsIDB4MDFmNmEyOTcpLCBXVENQKDB4N2ZmODcxYTIsIDB4MDJiZmE5YTQpLAorICAgIFdUQ1AoMHg3ZmYzODI3NCwgMHgwMzg4YTllYSksIFdUQ1AoMHg3ZmVkNTc5MSwgMHgwNDUxYTE3NyksCisgICAgV1RDUCgweDdmZTVmMTA4LCAweDA1MWE4ZTVjKSwgV1RDUCgweDdmZGQ0ZWVjLCAweDA1ZTM2ZWE5KSwKKyAgICBXVENQKDB4N2ZkMzcxNTMsIDB4MDZhYzQwNmYpLCBXVENQKDB4N2ZjODU4NTQsIDB4MDc3NTAxYmUpLAorICAgIFdUQ1AoMHg3ZmJjMDQwYSwgMHgwODNkYjBhNyksIFdUQ1AoMHg3ZmFlNzQ5NSwgMHgwOTA2NGIzYSksCisgICAgV1RDUCgweDdmOWZhYTE1LCAweDA5Y2VjZjg5KSwgV1RDUCgweDdmOGZhNGIwLCAweDBhOTczYmE1KSwKKyAgICBXVENQKDB4N2Y3ZTY0OGMsIDB4MGI1ZjhkOWYpLCBXVENQKDB4N2Y2YmU5ZDQsIDB4MGMyN2MzODkpLAorICAgIFdUQ1AoMHg3ZjU4MzRiNywgMHgwY2VmZGI3NiksIFdUQ1AoMHg3ZjQzNDU2MywgMHgwZGI3ZDM3NiksCisgICAgV1RDUCgweDdmMmQxYzBlLCAweDBlN2ZhOTllKSwgV1RDUCgweDdmMTViOGVlLCAweDBmNDc1YmZmKSwKKyAgICBXVENQKDB4N2VmZDFjM2MsIDB4MTAwZWU4YWQpLCBXVENQKDB4N2VlMzQ2MzYsIDB4MTBkNjRkYmQpLAorICAgIFdUQ1AoMHg3ZWM4MzcxYSwgMHgxMTlkODk0MSksIFdUQ1AoMHg3ZWFiZWYyYywgMHgxMjY0OTk0ZSksCisgICAgV1RDUCgweDdlOGU2ZWIyLCAweDEzMmI3YmY5KSwgV1RDUCgweDdlNmZiNWY0LCAweDEzZjIyZjU4KSwKKyAgICBXVENQKDB4N2U0ZmM1M2UsIDB4MTRiOGIxN2YpLCBXVENQKDB4N2UyZTljZGYsIDB4MTU3ZjAwODYpLAorICAgIFdUQ1AoMHg3ZTBjM2QyOSwgMHgxNjQ1MWE4MyksIFdUQ1AoMHg3ZGU4YTY3MCwgMHgxNzBhZmQ4ZCksCisgICAgV1RDUCgweDdkYzNkOTBkLCAweDE3ZDBhN2JjKSwgV1RDUCgweDdkOWRkNTVhLCAweDE4OTYxNzI4KSwKKyAgICBXVENQKDB4N2Q3NjliYjUsIDB4MTk1YjQ5ZWEpLCBXVENQKDB4N2Q0ZTJjN2YsIDB4MWEyMDNlMWIpLAorICAgIFdUQ1AoMHg3ZDI0ODgxYiwgMHgxYWU0ZjFkNiksIFdUQ1AoMHg3Y2Y5YWVmMCwgMHgxYmE5NjMzNSksCisgICAgV1RDUCgweDdjY2RhMTY5LCAweDFjNmQ5MDUzKSwgV1RDUCgweDdjYTA1ZmYxLCAweDFkMzE3NzRkKSwKKyAgICBXVENQKDB4N2M3MWVhZjksIDB4MWRmNTE2M2YpLCBXVENQKDB4N2M0MjQyZjIsIDB4MWViODZiNDYpLAorICAgIFdUQ1AoMHg3YzExNjg1MywgMHgxZjdiNzQ4MSksIFdUQ1AoMHg3YmRmNWI5NCwgMHgyMDNlMzAwZCksCisgICAgV1RDUCgweDdiYWMxZDMxLCAweDIxMDA5YzBjKSwgV1RDUCgweDdiNzdhZGE4LCAweDIxYzJiNjljKSwKKyAgICBXVENQKDB4N2I0MjBkN2EsIDB4MjI4NDdkZTApLCBXVENQKDB4N2IwYjNkMmMsIDB4MjM0NWVmZjgpLAorICAgIFdUQ1AoMHg3YWQzM2Q0NSwgMHgyNDA3MGIwOCksIFdUQ1AoMHg3YTlhMGU1MCwgMHgyNGM3Y2QzMyksCisgICAgV1RDUCgweDdhNWZiMGQ4LCAweDI1ODgzNDlkKSwgV1RDUCgweDdhMjQyNTZmLCAweDI2NDgzZjZjKSwKKyAgICBXVENQKDB4NzllNzZjYTcsIDB4MjcwN2ViYzcpLCBXVENQKDB4NzlhOTg3MTUsIDB4MjdjNzM3ZDMpLAorICAgIFdUQ1AoMHg3OTZhNzU1NCwgMHgyODg2MjFiOSksIFdUQ1AoMHg3OTJhMzdmZSwgMHgyOTQ0YTdhMiksCisgICAgV1RDUCgweDc4ZThjZmIyLCAweDJhMDJjN2I4KSwgV1RDUCgweDc4YTYzZDExLCAweDJhYzA4MDI2KSwKKyAgICBXVENQKDB4Nzg2MjgwYmYsIDB4MmI3ZGNmMTcpLCBXVENQKDB4NzgxZDliNjUsIDB4MmMzYWIyYjkpLAorICAgIFdUQ1AoMHg3N2Q3OGRhYSwgMHgyY2Y3MjkzOSksIFdUQ1AoMHg3NzkwNTgzZSwgMHgyZGIzMzBjNyksCisgICAgV1RDUCgweDc3NDdmYmNlLCAweDJlNmVjNzkyKSwgV1RDUCgweDc2ZmU3OTBlLCAweDJmMjllYmNjKSwKKyAgICBXVENQKDB4NzZiM2QwYjQsIDB4MmZlNDliYTcpLCBXVENQKDB4NzY2ODAzNzYsIDB4MzA5ZWQ1NTYpLAorICAgIFdUQ1AoMHg3NjFiMTIxMSwgMHgzMTU4OTcwZSksIFdUQ1AoMHg3NWNjZmQ0MiwgMHgzMjExZGYwNCksCisgICAgV1RDUCgweDc1N2RjNWNhLCAweDMyY2FhYjZmKSwgV1RDUCgweDc1MmQ2YzZjLCAweDMzODJmYTg4KSwKKyAgICBXVENQKDB4NzRkYmYxZWYsIDB4MzQzYWNhODcpLCBXVENQKDB4NzQ4OTU3MWMsIDB4MzRmMjE5YTgpLAorICAgIFdUQ1AoMHg3NDM1OWNiZCwgMHgzNWE4ZTYyNSksIFdUQ1AoMHg3M2UwYzNhMywgMHgzNjVmMmUzYiksCisgICAgV1RDUCgweDczOGFjYzllLCAweDM3MTRmMDJhKSwgV1RDUCgweDczMzNiODgzLCAweDM3Y2EyYTMwKSwKKyAgICBXVENQKDB4NzJkYjg4MjgsIDB4Mzg3ZWRhOGUpLCBXVENQKDB4NzI4MjNjNjcsIDB4MzkzMmZmODcpLAorICAgIFdUQ1AoMHg3MjI3ZDYxYywgMHgzOWU2OTc1ZSksIFdUQ1AoMHg3MWNjNTYyNiwgMHgzYTk5YTA1NyksCisgICAgV1RDUCgweDcxNmZiZDY4LCAweDNiNGMxOGJhKSwgV1RDUCgweDcxMTIwY2M1LCAweDNiZmRmZWNkKSwKKyAgICBXVENQKDB4NzBiMzQ1MjUsIDB4M2NhZjUwZGEpLCBXVENQKDB4NzA1MzY3NzEsIDB4M2Q2MDBkMmMpLAorICAgIFdUQ1AoMHg2ZmYyNzQ5NywgMHgzZTEwMzIwZCksIFdUQ1AoMHg2ZjkwNmQ4NCwgMHgzZWJmYmRjZCksCisgICAgV1RDUCgweDZmMmQ1MzJjLCAweDNmNmVhZWI4KSwgV1RDUCgweDZlYzkyNjgzLCAweDQwMWQwMzIxKSwKKyAgICBXVENQKDB4NmU2M2U4N2YsIDB4NDBjYWI5NTgpLCBXVENQKDB4NmRmZDlhMWMsIDB4NDE3N2NmYjEpLAorICAgIFdUQ1AoMHg2ZDk2M2M1NCwgMHg0MjI0NDQ4MSksIFdUQ1AoMHg2ZDJkZDAyNywgMHg0MmQwMTYxZSksCisgICAgV1RDUCgweDZjYzQ1Njk4LCAweDQzN2I0MmUxKSwgV1RDUCgweDZjNTlkMGE5LCAweDQ0MjVjOTIzKSwKKyAgICBXVENQKDB4NmJlZTNmNjIsIDB4NDRjZmE3NDApLCBXVENQKDB4NmI4MWEzY2QsIDB4NDU3OGRiOTMpLAorICAgIFdUQ1AoMHg2YjEzZmVmNSwgMHg0NjIxNjQ3ZCksIFdUQ1AoMHg2YWE1NTFlOSwgMHg0NmM5NDA1YyksCisgICAgV1RDUCgweDZhMzU5ZGI5LCAweDQ3NzA2ZDkzKSwgV1RDUCgweDY5YzRlMzdhLCAweDQ4MTZlYTg2KSwKKyAgICBXVENQKDB4Njk1MzI0NDIsIDB4NDhiY2I1OTkpLCBXVENQKDB4NjhlMDYxMjksIDB4NDk2MWNkMzMpLAorICAgIFdUQ1AoMHg2ODZjOWI0YiwgMHg0YTA2MmZiZCksIFdUQ1AoMHg2N2Y3ZDNjNSwgMHg0YWE5ZGJhMiksCisgICAgV1RDUCgweDY3ODIwYmI3LCAweDRiNGNjZjRkKSwgV1RDUCgweDY3MGI0NDQ0LCAweDRiZWYwOTJkKSwKKyAgICBXVENQKDB4NjY5MzdlOTEsIDB4NGM5MDg3YjEpLCBXVENQKDB4NjYxYWJiYzUsIDB4NGQzMTQ5NGIpLAorICAgIFdUQ1AoMHg2NWEwZmQwYiwgMHg0ZGQxNGM2ZSksIFdUQ1AoMHg2NTI2NDM4ZiwgMHg0ZTcwOGY4ZiksCisgICAgV1RDUCgweDY0YWE5MDdmLCAweDRmMGYxMTI2KSwgV1RDUCgweDY0MmRlNTBkLCAweDRmYWNjZmFiKSwKKyAgICBXVENQKDB4NjNiMDQyNmQsIDB4NTA0OWM5OTkpLCBXVENQKDB4NjMzMWE5ZDQsIDB4NTBlNWZkNmQpLAorICAgIFdUQ1AoMHg2MmIyMWM3YiwgMHg1MTgxNjlhNSksIFdUQ1AoMHg2MjMxOWI5ZCwgMHg1MjFjMGNjMiksCisgICAgV1RDUCgweDYxYjAyODc2LCAweDUyYjVlNTQ2KSwgV1RDUCgweDYxMmRjNDQ3LCAweDUzNGVmMWI1KSwKKyAgICBXVENQKDB4NjBhYTcwNTAsIDB4NTNlNzMwOTcpLCBXVENQKDB4NjAyNjJkZDYsIDB4NTQ3ZWEwNzMpLAorICAgIFdUQ1AoMHg1ZmEwZmUxZiwgMHg1NTE1M2ZkNCksIFdUQ1AoMHg1ZjFhZTI3NCwgMHg1NWFiMGQ0NiksCisgICAgV1RDUCgweDVlOTNkYzFmLCAweDU2NDAwNzU4KSwgV1RDUCgweDVlMGJlYzZlLCAweDU2ZDQyYzk5KSwKKyAgICBXVENQKDB4NWQ4MzE0YjEsIDB4NTc2NzdiOWQpLCBXVENQKDB4NWNmOTU2MzgsIDB4NTdmOWYyZjgpLAorICAgIFdUQ1AoMHg1YzZlYjI1OCwgMHg1ODhiOTE0MCksIFdUQ1AoMHg1YmUzMmE2NywgMHg1OTFjNTUwZSksCisgICAgV1RDUCgweDViNTZiZmJkLCAweDU5YWMzY2ZkKSwgV1RDUCgweDVhYzk3M2I1LCAweDVhM2I0N2FiKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93Mzg0W10gPSB7CisgICAgV1RDUCgweDdmZmZlZTc0LCAweDAwNDMwNTQ2KSwgV1RDUCgweDdmZmY2MjE2LCAweDAwYzkwZjg4KSwKKyAgICBXVENQKDB4N2ZmZTQ5NWIsIDB4MDE0ZjE4ZWUpLCBXVENQKDB4N2ZmY2E0NDMsIDB4MDFkNTIwZTQpLAorICAgIFdUQ1AoMHg3ZmZhNzJkMSwgMHgwMjViMjZkNyksIFdUQ1AoMHg3ZmY3YjUwNywgMHgwMmUxMmEzNiksCisgICAgV1RDUCgweDdmZjQ2YWU4LCAweDAzNjcyYTZjKSwgV1RDUCgweDdmZjA5NDc4LCAweDAzZWQyNmU2KSwKKyAgICBXVENQKDB4N2ZlYzMxYmEsIDB4MDQ3MzFmMTMpLCBXVENQKDB4N2ZlNzQyYjQsIDB4MDRmOTEyNWUpLAorICAgIFdUQ1AoMHg3ZmUxYzc2YiwgMHgwNTdmMDAzNSksIFdUQ1AoMHg3ZmRiYmZlNiwgMHgwNjA0ZTgwNSksCisgICAgV1RDUCgweDdmZDUyYzI5LCAweDA2OGFjOTNiKSwgV1RDUCgweDdmY2UwYzNlLCAweDA3MTBhMzQ1KSwKKyAgICBXVENQKDB4N2ZjNjYwMmMsIDB4MDc5Njc1OGYpLCBXVENQKDB4N2ZiZTI3ZmEsIDB4MDgxYzNmODcpLAorICAgIFdUQ1AoMHg3ZmI1NjNiMywgMHgwOGEyMDA5YSksIFdUQ1AoMHg3ZmFjMTM1ZiwgMHgwOTI3YjgzNiksCisgICAgV1RDUCgweDdmYTIzNzBhLCAweDA5YWQ2NWM4KSwgV1RDUCgweDdmOTdjZWJkLCAweDBhMzMwOGJkKSwKKyAgICBXVENQKDB4N2Y4Y2RhODQsIDB4MGFiOGEwODIpLCBXVENQKDB4N2Y4MTVhNmIsIDB4MGIzZTJjODYpLAorICAgIFdUQ1AoMHg3Zjc1NGU4MCwgMHgwYmMzYWMzNSksIFdUQ1AoMHg3ZjY4YjZjZSwgMHgwYzQ5MWVmZSksCisgICAgV1RDUCgweDdmNWI5MzY0LCAweDBjY2U4NDRlKSwgV1RDUCgweDdmNGRlNDUxLCAweDBkNTNkYjkyKSwKKyAgICBXVENQKDB4N2YzZmE5YTIsIDB4MGRkOTI0MzkpLCBXVENQKDB4N2YzMGUzNjksIDB4MGU1ZTVkYjApLAorICAgIFdUQ1AoMHg3ZjIxOTFiNCwgMHgwZWUzODc2NiksIFdUQ1AoMHg3ZjExYjQ5NSwgMHgwZjY4YTBjOCksCisgICAgV1RDUCgweDdmMDE0YzFlLCAweDBmZWRhOTQzKSwgV1RDUCgweDdlZjA1ODYwLCAweDEwNzJhMDQ4KSwKKyAgICBXVENQKDB4N2VkZWQ5NmQsIDB4MTBmNzg1NDMpLCBXVENQKDB4N2VjY2NmNWEsIDB4MTE3YzU3YTIpLAorICAgIFdUQ1AoMHg3ZWJhM2EzOSwgMHgxMjAxMTZkNSksIFdUQ1AoMHg3ZWE3MWEyMCwgMHgxMjg1YzI0OSksCisgICAgV1RDUCgweDdlOTM2ZjIyLCAweDEzMGE1OTZlKSwgV1RDUCgweDdlN2YzOTU3LCAweDEzOGVkYmIxKSwKKyAgICBXVENQKDB4N2U2YTc4ZDMsIDB4MTQxMzQ4ODEpLCBXVENQKDB4N2U1NTJkYWUsIDB4MTQ5NzlmNGUpLAorICAgIFdUQ1AoMHg3ZTNmNTdmZiwgMHgxNTFiZGY4NiksIFdUQ1AoMHg3ZTI4ZjdkZSwgMHgxNWEwMDg5NyksCisgICAgV1RDUCgweDdlMTIwZDYzLCAweDE2MjQxOWYyKSwgV1RDUCgweDdkZmE5OGE4LCAweDE2YTgxMzA1KSwKKyAgICBXVENQKDB4N2RlMjk5YzYsIDB4MTcyYmYzM2YpLCBXVENQKDB4N2RjYTEwZDgsIDB4MTdhZmJhMTEpLAorICAgIFdUQ1AoMHg3ZGIwZmRmOCwgMHgxODMzNjZlOSksIFdUQ1AoMHg3ZDk3NjE0MiwgMHgxOGI2ZjkzNiksCisgICAgV1RDUCgweDdkN2QzYWQzLCAweDE5M2E3MDZhKSwgV1RDUCgweDdkNjI4YWM2LCAweDE5YmRjYmYzKSwKKyAgICBXVENQKDB4N2Q0NzUxMzksIDB4MWE0MTBiNDEpLCBXVENQKDB4N2QyYjhlNGEsIDB4MWFjNDJkYzUpLAorICAgIFdUQ1AoMHg3ZDBmNDIxOCwgMHgxYjQ3MzJlZiksIFdUQ1AoMHg3Y2YyNmNjMSwgMHgxYmNhMWEyZiksCisgICAgV1RDUCgweDdjZDUwZTY1LCAweDFjNGNlMmY2KSwgV1RDUCgweDdjYjcyNzI0LCAweDFjY2Y4Y2IzKSwKKyAgICBXVENQKDB4N2M5OGI3MWYsIDB4MWQ1MjE2ZDgpLCBXVENQKDB4N2M3OWJlNzgsIDB4MWRkNDgwZDYpLAorICAgIFdUQ1AoMHg3YzVhM2Q1MCwgMHgxZTU2Y2ExZSksIFdUQ1AoMHg3YzNhMzNjYSwgMHgxZWQ4ZjIyMCksCisgICAgV1RDUCgweDdjMTlhMjA5LCAweDFmNWFmODRmKSwgV1RDUCgweDdiZjg4ODMwLCAweDFmZGNkYzFiKSwKKyAgICBXVENQKDB4N2JkNmU2NjUsIDB4MjA1ZTljZjYpLCBXVENQKDB4N2JiNGJjY2IsIDB4MjBlMDNhNTEpLAorICAgIFdUQ1AoMHg3YjkyMGI4OSwgMHgyMTYxYjNhMCksIFdUQ1AoMHg3YjZlZDJjNSwgMHgyMWUzMDg1MyksCisgICAgV1RDUCgweDdiNGIxMmE0LCAweDIyNjQzN2RjKSwgV1RDUCgweDdiMjZjYjRmLCAweDIyZTU0MWFmKSwKKyAgICBXVENQKDB4N2IwMWZjZWQsIDB4MjM2NjI1M2QpLCBXVENQKDB4N2FkY2E3YTYsIDB4MjNlNmUxZmEpLAorICAgIFdUQ1AoMHg3YWI2Y2JhNCwgMHgyNDY3Nzc1OCksIFdUQ1AoMHg3YTkwNjkwZiwgMHgyNGU3ZTRjOSksCisgICAgV1RDUCgweDdhNjk4MDEyLCAweDI1NjgyOWMyKSwgV1RDUCgweDdhNDIxMGQ4LCAweDI1ZTg0NWI2KSwKKyAgICBXVENQKDB4N2ExYTFiOGMsIDB4MjY2ODM4MTgpLCBXVENQKDB4NzlmMWEwNWEsIDB4MjZlODAwNWIpLAorICAgIFdUQ1AoMHg3OWM4OWY2ZSwgMHgyNzY3OWRmNCksIFdUQ1AoMHg3OTlmMThmNCwgMHgyN2U3MTA1NyksCisgICAgV1RDUCgweDc5NzUwZDFjLCAweDI4NjY1NmY4KSwgV1RDUCgweDc5NGE3YzEyLCAweDI4ZTU3MTRiKSwKKyAgICBXVENQKDB4NzkxZjY2MDUsIDB4Mjk2NDVlYzUpLCBXVENQKDB4NzhmM2NiMjUsIDB4MjllMzFlZGIpLAorICAgIFdUQ1AoMHg3OGM3YWJhMiwgMHgyYTYxYjEwMSksIFdUQ1AoMHg3ODliMDdhYiwgMHgyYWUwMTRhZSksCisgICAgV1RDUCgweDc4NmRkZjcyLCAweDJiNWU0OTU2KSwgV1RDUCgweDc4NDAzMzI5LCAweDJiZGM0ZTZmKSwKKyAgICBXVENQKDB4NzgxMjAzMDAsIDB4MmM1YTIzNmYpLCBXVENQKDB4NzdlMzRmMmMsIDB4MmNkN2M3Y2MpLAorICAgIFdUQ1AoMHg3N2I0MTdkZiwgMHgyZDU1M2FmYyksIFdUQ1AoMHg3Nzg0NWQ0ZSwgMHgyZGQyN2M3NSksCisgICAgV1RDUCgweDc3NTQxZmFiLCAweDJlNGY4YmFlKSwgV1RDUCgweDc3MjM1ZjJkLCAweDJlY2M2ODFlKSwKKyAgICBXVENQKDB4NzZmMjFjMDksIDB4MmY0OTExM2QpLCBXVENQKDB4NzZjMDU2NzQsIDB4MmZjNTg2ODApLAorICAgIFdUQ1AoMHg3NjhlMGVhNiwgMHgzMDQxYzc2MSksIFdUQ1AoMHg3NjViNDRkNSwgMHgzMGJkZDM1NiksCisgICAgV1RDUCgweDc2MjdmOTM5LCAweDMxMzlhOWQ3KSwgV1RDUCgweDc1ZjQyYzBiLCAweDMxYjU0YTVlKSwKKyAgICBXVENQKDB4NzViZmRkODMsIDB4MzIzMGI0NjEpLCBXVENQKDB4NzU4YjBkZGIsIDB4MzJhYmU3NWEpLAorICAgIFdUQ1AoMHg3NTU1YmQ0YywgMHgzMzI2ZTJjMyksIFdUQ1AoMHg3NTFmZWMxMSwgMHgzM2ExYTYxMiksCisgICAgV1RDUCgweDc0ZTk5YTY1LCAweDM0MWMzMGM0KSwgV1RDUCgweDc0YjJjODg0LCAweDM0OTY4MjUwKSwKKyAgICBXVENQKDB4NzQ3Yjc2YTksIDB4MzUxMDlhMzEpLCBXVENQKDB4NzQ0M2E1MTIsIDB4MzU4YTc3ZTApLAorICAgIFdUQ1AoMHg3NDBiNTNmYiwgMHgzNjA0MWFkOSksIFdUQ1AoMHg3M2QyODNhMiwgMHgzNjdkODI5NiksCisgICAgV1RDUCgweDczOTkzNDQ3LCAweDM2ZjZhZTkxKSwgV1RDUCgweDczNWY2NjI2LCAweDM3NmY5ZTQ2KSwKKyAgICBXVENQKDB4NzMyNTE5ODEsIDB4MzdlODUxMzApLCBXVENQKDB4NzJlYTRlOTYsIDB4Mzg2MGM2Y2IpLAorICAgIFdUQ1AoMHg3MmFmMDVhNywgMHgzOGQ4ZmU5MyksIFdUQ1AoMHg3MjczM2VmMywgMHgzOTUwZjgwNCksCisgICAgV1RDUCgweDcyMzZmYWJlLCAweDM5YzhiMjlhKSwgV1RDUCgweDcxZmEzOTQ5LCAweDNhNDAyZGQyKSwKKyAgICBXVENQKDB4NzFiY2ZhZDYsIDB4M2FiNzY5MjkpLCBXVENQKDB4NzE3ZjNmYTgsIDB4M2IyZTY0MWMpLAorICAgIFdUQ1AoMHg3MTQxMDgwNSwgMHgzYmE1MWUyOSksIFdUQ1AoMHg3MTAyNTQyZiwgMHgzYzFiOTZjZSksCisgICAgV1RDUCgweDcwYzMyNDZiLCAweDNjOTFjZDg4KSwgV1RDUCgweDcwODM3OGZmLCAweDNkMDdjMWQ2KSwKKyAgICBXVENQKDB4NzA0MzUyMzAsIDB4M2Q3ZDczMzcpLCBXVENQKDB4NzAwMmIwNDUsIDB4M2RmMmUxMjkpLAorICAgIFdUQ1AoMHg2ZmMxOTM4NSwgMHgzZTY4MGIyYyksIFdUQ1AoMHg2ZjdmZmMzNywgMHgzZWRjZjBjMCksCisgICAgV1RDUCgweDZmM2RlYWE0LCAweDNmNTE5MTY0KSwgV1RDUCgweDZlZmI1ZjEyLCAweDNmYzVlYzk4KSwKKyAgICBXVENQKDB4NmViODU5Y2MsIDB4NDAzYTAxZGMpLCBXVENQKDB4NmU3NGRiMWMsIDB4NDBhZGQwYjIpLAorICAgIFdUQ1AoMHg2ZTMwZTM0YSwgMHg0MTIxNTg5YiksIFdUQ1AoMHg2ZGVjNzJhMiwgMHg0MTk0OTkxNyksCisgICAgV1RDUCgweDZkYTc4OTZlLCAweDQyMDc5MWE4KSwgV1RDUCgweDZkNjIyN2ZhLCAweDQyN2E0MWQwKSwKKyAgICBXVENQKDB4NmQxYzRlOTMsIDB4NDJlY2E5MTIpLCBXVENQKDB4NmNkNWZkODUsIDB4NDM1ZWM2ZjApLAorICAgIFdUQ1AoMHg2YzhmMzUxYywgMHg0M2QwOWFlZCksIFdUQ1AoMHg2YzQ3ZjVhNywgMHg0NDQyMjQ4YiksCisgICAgV1RDUCgweDZjMDAzZjc0LCAweDQ0YjM2MzRmKSwgV1RDUCgweDZiYjgxMmQxLCAweDQ1MjQ1NmJkKSwKKyAgICBXVENQKDB4NmI2ZjcwMGUsIDB4NDU5NGZlNTgpLCBXVENQKDB4NmIyNjU3NzksIDB4NDYwNTU5YTQpLAorICAgIFdUQ1AoMHg2YWRjYzk2NCwgMHg0Njc1NjgyOCksIFdUQ1AoMHg2YTkyYzYxZiwgMHg0NmU1Mjk2NyksCisgICAgV1RDUCgweDZhNDg0ZGZjLCAweDQ3NTQ5Y2U3KSwgV1RDUCgweDY5ZmQ2MTRhLCAweDQ3YzNjMjJmKSwKKyAgICBXVENQKDB4NjliMjAwNWUsIDB4NDgzMjk4YzQpLCBXVENQKDB4Njk2NjJiOGEsIDB4NDhhMTIwMmMpLAorICAgIFdUQ1AoMHg2OTE5ZTMyMCwgMHg0OTBmNTdlZSksIFdUQ1AoMHg2OGNkMjc3NSwgMHg0OTdkM2Y5MyksCisgICAgV1RDUCgweDY4N2ZmOGRjLCAweDQ5ZWFkNmEwKSwgV1RDUCgweDY4MzI1N2FiLCAweDRhNTgxYzllKSwKKyAgICBXVENQKDB4NjdlNDQ0MzYsIDB4NGFjNTExMTQpLCBXVENQKDB4Njc5NWJlZDMsIDB4NGIzMWIzOGQpLAorICAgIFdUQ1AoMHg2NzQ2YzdkOCwgMHg0YjllMDM5MCksIFdUQ1AoMHg2NmY3NWY5YiwgMHg0YzBhMDBhNiksCisgICAgV1RDUCgweDY2YTc4Njc1LCAweDRjNzVhYTVhKSwgV1RDUCgweDY2NTczY2JiLCAweDRjZTEwMDM0KSwKKyAgICBXVENQKDB4NjYwNjgyYzcsIDB4NGQ0YzAxYzApLCBXVENQKDB4NjViNTU4ZjEsIDB4NGRiNmFlODgpLAorICAgIFdUQ1AoMHg2NTYzYmY5MiwgMHg0ZTIxMDYxNyksIFdUQ1AoMHg2NTExYjcwMywgMHg0ZThiMDdmOSksCisgICAgV1RDUCgweDY0YmYzZjlmLCAweDRlZjRiM2I5KSwgV1RDUCgweDY0NmM1OWJmLCAweDRmNWUwOGUzKSwKKyAgICBXVENQKDB4NjQxOTA1YmYsIDB4NGZjNzA3MDQpLCBXVENQKDB4NjNjNTQzZmEsIDB4NTAyZmFkYTkpLAorICAgIFdUQ1AoMHg2MzcxMTRjYywgMHg1MDk3ZmM1ZSksIFdUQ1AoMHg2MzFjNzg5MiwgMHg1MGZmZjJiMiksCisgICAgV1RDUCgweDYyYzc2ZmE3LCAweDUxNjc5MDMzKSwgV1RDUCgweDYyNzFmYTY5LCAweDUxY2VkNDZlKSwKKyAgICBXVENQKDB4NjIxYzE5MzcsIDB4NTIzNWJlZjQpLCBXVENQKDB4NjFjNWNjNmQsIDB4NTI5YzRmNTEpLAorICAgIFdUQ1AoMHg2MTZmMTQ2YywgMHg1MzAyODUxOCksIFdUQ1AoMHg2MTE3ZjE5MSwgMHg1MzY4NWZkNiksCisgICAgV1RDUCgweDYwYzA2NDNkLCAweDUzY2RkZjFkKSwgV1RDUCgweDYwNjg2Y2NmLCAweDU0MzMwMjdkKSwKKyAgICBXVENQKDB4NjAxMDBiYTgsIDB4NTQ5N2M5ODgpLCBXVENQKDB4NWZiNzQxMjksIDB4NTRmYzMzY2UpLAorICAgIFdUQ1AoMHg1ZjVlMGRiMywgMHg1NTYwNDBlMiksIFdUQ1AoMHg1ZjA0NzFhOCwgMHg1NWMzZjA1NiksCisgICAgV1RDUCgweDVlYWE2ZDZiLCAweDU2Mjc0MWJkKSwgV1RDUCgweDVlNTAwMTVkLCAweDU2OGEzNGE5KSwKKyAgICBXVENQKDB4NWRmNTJkZTMsIDB4NTZlY2M4YWYpLCBXVENQKDB4NWQ5OWYzNWYsIDB4NTc0ZWZkNjIpLAorICAgIFdUQ1AoMHg1ZDNlNTIzNywgMHg1N2IwZDI1NiksIFdUQ1AoMHg1Y2UyNGFjZCwgMHg1ODEyNDcyMCksCisgICAgV1RDUCgweDVjODVkZDg4LCAweDU4NzM1YjU2KSwgV1RDUCgweDVjMjkwYWNjLCAweDU4ZDQwZThjKSwKKyAgICBXVENQKDB4NWJjYmQzMDAsIDB4NTkzNDYwNWEpLCBXVENQKDB4NWI2ZTM2ODksIDB4NTk5NDUwNTQpLAorICAgIFdUQ1AoMHg1YjEwMzVjZiwgMHg1OWYzZGUxMiksIFdUQ1AoMHg1YWIxZDEzOCwgMHg1YTUzMDkyYyksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzQ4MFtdID0geworICAgIFdUQ1AoMHg3ZmZmZjRjNSwgMHgwMDM1OWRkMiksIFdUQ1AoMHg3ZmZmOWFlZiwgMHgwMGEwZDk1MSksCisgICAgV1RDUCgweDdmZmVlNzQ0LCAweDAxMGMxNDYwKSwgV1RDUCgweDdmZmRkOWM0LCAweDAxNzc0ZWIyKSwKKyAgICBXVENQKDB4N2ZmYzcyNmYsIDB4MDFlMjg3ZmMpLCBXVENQKDB4N2ZmYWIxNDcsIDB4MDI0ZGJmZjQpLAorICAgIFdUQ1AoMHg3ZmY4OTY0ZCwgMHgwMmI4ZjY0ZSksIFdUQ1AoMHg3ZmY2MjE4MiwgMHgwMzI0MmFiZiksCisgICAgV1RDUCgweDdmZjM1MmU4LCAweDAzOGY1Y2ZiKSwgV1RDUCgweDdmZjAyYTgyLCAweDAzZmE4Y2I4KSwKKyAgICBXVENQKDB4N2ZlY2E4NTEsIDB4MDQ2NWI5YWEpLCBXVENQKDB4N2ZlOGNjNTcsIDB4MDRkMGUzODYpLAorICAgIFdUQ1AoMHg3ZmU0OTY5OCwgMHgwNTNjMGEwMSksIFdUQ1AoMHg3ZmUwMDcxNiwgMHgwNWE3MmNjZiksCisgICAgV1RDUCgweDdmZGIxZGQ1LCAweDA2MTI0YmE1KSwgV1RDUCgweDdmZDVkYWQ4LCAweDA2N2Q2NjM5KSwKKyAgICBXVENQKDB4N2ZkMDNlMjMsIDB4MDZlODdjM2YpLCBXVENQKDB4N2ZjYTQ3YjksIDB4MDc1MzhkNmIpLAorICAgIFdUQ1AoMHg3ZmMzZjdhMCwgMHgwN2JlOTk3MyksIFdUQ1AoMHg3ZmJkNGRkYSwgMHgwODI5YTAwYyksCisgICAgV1RDUCgweDdmYjY0YTZlLCAweDA4OTRhMGVhKSwgV1RDUCgweDdmYWVlZDVmLCAweDA4ZmY5YmMyKSwKKyAgICBXVENQKDB4N2ZhNzM2YjQsIDB4MDk2YTkwNDkpLCBXVENQKDB4N2Y5ZjI2NzEsIDB4MDlkNTdlMzUpLAorICAgIFdUQ1AoMHg3Zjk2YmM5YywgMHgwYTQwNjUzYSksIFdUQ1AoMHg3ZjhkZjkzYywgMHgwYWFiNDUwZCksCisgICAgV1RDUCgweDdmODRkYzU1LCAweDBiMTYxZDYzKSwgV1RDUCgweDdmN2I2NWVmLCAweDBiODBlZGYxKSwKKyAgICBXVENQKDB4N2Y3MTk2MTEsIDB4MGJlYmI2NmMpLCBXVENQKDB4N2Y2NzZjYzAsIDB4MGM1Njc2OGEpLAorICAgIFdUQ1AoMHg3ZjVjZWEwNSwgMHgwY2MxMmRmZiksIFdUQ1AoMHg3ZjUyMGRlNiwgMHgwZDJiZGM4MCksCisgICAgV1RDUCgweDdmNDZkODZjLCAweDBkOTY4MWMyKSwgV1RDUCgweDdmM2I0OTlkLCAweDBlMDExZDdjKSwKKyAgICBXVENQKDB4N2YyZjYxODMsIDB4MGU2YmFmNjEpLCBXVENQKDB4N2YyMzIwMjYsIDB4MGVkNjM3MjcpLAorICAgIFdUQ1AoMHg3ZjE2ODU4ZSwgMHgwZjQwYjQ4MyksIFdUQ1AoMHg3ZjA5OTFjNCwgMHgwZmFiMjcyYiksCisgICAgV1RDUCgweDdlZmM0NGQwLCAweDEwMTU4ZWQ0KSwgV1RDUCgweDdlZWU5ZWJlLCAweDEwN2ZlYjMzKSwKKyAgICBXVENQKDB4N2VlMDlmOTUsIDB4MTBlYTNiZmQpLCBXVENQKDB4N2VkMjQ3NjEsIDB4MTE1NDgwZTkpLAorICAgIFdUQ1AoMHg3ZWMzOTYyYSwgMHgxMWJlYjlhYSksIFdUQ1AoMHg3ZWI0OGJmYiwgMHgxMjI4ZTVmOCksCisgICAgV1RDUCgweDdlYTUyOGUwLCAweDEyOTMwNTg2KSwgV1RDUCgweDdlOTU2Y2UxLCAweDEyZmQxODBiKSwKKyAgICBXVENQKDB4N2U4NTU4MGMsIDB4MTM2NzFkM2QpLCBXVENQKDB4N2U3NGVhNmEsIDB4MTNkMTE0ZDApLAorICAgIFdUQ1AoMHg3ZTY0MjQwOCwgMHgxNDNhZmU3YiksIFdUQ1AoMHg3ZTUzMDRmMiwgMHgxNGE0ZDlmNCksCisgICAgV1RDUCgweDdlNDE4ZDMyLCAweDE1MGVhNmVmKSwgV1RDUCgweDdlMmZiY2Q2LCAweDE1Nzg2NTIyKSwKKyAgICBXVENQKDB4N2UxZDkzZWEsIDB4MTVlMjE0NDUpLCBXVENQKDB4N2UwYjEyN2EsIDB4MTY0YmI0MGIpLAorICAgIFdUQ1AoMHg3ZGY4Mzg5NSwgMHgxNmI1NDQyYiksIFdUQ1AoMHg3ZGU1MDY0NiwgMHgxNzFlYzQ1YyksCisgICAgV1RDUCgweDdkZDE3YjljLCAweDE3ODgzNDUyKSwgV1RDUCgweDdkYmQ5OGE0LCAweDE3ZjE5M2M1KSwKKyAgICBXVENQKDB4N2RhOTVkNmMsIDB4MTg1YWUyNjkpLCBXVENQKDB4N2Q5NGNhMDMsIDB4MThjNDFmZjYpLAorICAgIFdUQ1AoMHg3ZDdmZGU3NiwgMHgxOTJkNGMyMSksIFdUQ1AoMHg3ZDZhOWFkNSwgMHgxOTk2NjZhMCksCisgICAgV1RDUCgweDdkNTRmZjJlLCAweDE5ZmY2ZjJhKSwgV1RDUCgweDdkM2YwYjkwLCAweDFhNjg2NTc1KSwKKyAgICBXVENQKDB4N2QyOGMwMGMsIDB4MWFkMTQ5MzgpLCBXVENQKDB4N2QxMjFjYjAsIDB4MWIzYTFhMjgpLAorICAgIFdUQ1AoMHg3Y2ZiMjE4YywgMHgxYmEyZDdmYyksIFdUQ1AoMHg3Y2UzY2ViMiwgMHgxYzBiODI2YSksCisgICAgV1RDUCgweDdjY2MyNDMwLCAweDFjNzQxOTJhKSwgV1RDUCgweDdjYjQyMjE3LCAweDFjZGM5YmYyKSwKKyAgICBXVENQKDB4N2M5YmM4N2EsIDB4MWQ0NTBhNzgpLCBXVENQKDB4N2M4MzE3NjcsIDB4MWRhZDY0NzMpLAorICAgIFdUQ1AoMHg3YzZhMGVmMiwgMHgxZTE1YTk5YSksIFdUQ1AoMHg3YzUwYWYyYiwgMHgxZTdkZDlhNCksCisgICAgV1RDUCgweDdjMzZmODI0LCAweDFlZTVmNDQ3KSwgV1RDUCgweDdjMWNlOWVmLCAweDFmNGRmOTNhKSwKKyAgICBXVENQKDB4N2MwMjg0OWYsIDB4MWZiNWU4MzYpLCBXVENQKDB4N2JlN2M4NDcsIDB4MjAxZGMwZWYpLAorICAgIFdUQ1AoMHg3YmNjYjRmOCwgMHgyMDg1ODMxZiksIFdUQ1AoMHg3YmIxNGFjNSwgMHgyMGVkMmU3YiksCisgICAgV1RDUCgweDdiOTU4OWMzLCAweDIxNTRjMmJiKSwgV1RDUCgweDdiNzk3MjA1LCAweDIxYmMzZjk3KSwKKyAgICBXVENQKDB4N2I1ZDAzOWUsIDB4MjIyM2E0YzUpLCBXVENQKDB4N2I0MDNlYTIsIDB4MjI4YWYxZmUpLAorICAgIFdUQ1AoMHg3YjIzMjMyNSwgMHgyMmYyMjZmOCksIFdUQ1AoMHg3YjA1YjEzZCwgMHgyMzU5NDM2YyksCisgICAgV1RDUCgweDdhZTdlOGZjLCAweDIzYzA0NzEwKSwgV1RDUCgweDdhYzljYTdhLCAweDI0MjczMTlkKSwKKyAgICBXVENQKDB4N2FhYjU1Y2EsIDB4MjQ4ZTAyY2IpLCBXVENQKDB4N2E4YzhiMDEsIDB4MjRmNGJhNTApLAorICAgIFdUQ1AoMHg3YTZkNmEzNywgMHgyNTViNTdlNiksIFdUQ1AoMHg3YTRkZjM4MCwgMHgyNWMxZGI0NCksCisgICAgV1RDUCgweDdhMmUyNmYyLCAweDI2Mjg0NDIyKSwgV1RDUCgweDdhMGUwNGE0LCAweDI2OGU5MjM4KSwKKyAgICBXVENQKDB4NzllZDhjYWQsIDB4MjZmNGM1M2UpLCBXVENQKDB4NzljY2JmMjIsIDB4Mjc1YWRjZWUpLAorICAgIFdUQ1AoMHg3OWFiOWMxYywgMHgyN2MwZDhmZSksIFdUQ1AoMHg3OThhMjNiMSwgMHgyODI2YjkyOCksCisgICAgV1RDUCgweDc5Njg1NWY5LCAweDI4OGM3ZDI0KSwgV1RDUCgweDc5NDYzMzBjLCAweDI4ZjIyNGFiKSwKKyAgICBXVENQKDB4NzkyM2JiMDEsIDB4Mjk1N2FmNzQpLCBXVENQKDB4NzkwMGVkZjIsIDB4MjliZDFkM2EpLAorICAgIFdUQ1AoMHg3OGRkY2JmNSwgMHgyYTIyNmRiNSksIFdUQ1AoMHg3OGJhNTUyNCwgMHgyYTg3YTA5ZCksCisgICAgV1RDUCgweDc4OTY4OTk4LCAweDJhZWNiNWFjKSwgV1RDUCgweDc4NzI2OTZhLCAweDJiNTFhYzlhKSwKKyAgICBXVENQKDB4Nzg0ZGY0YjMsIDB4MmJiNjg1MjIpLCBXVENQKDB4NzgyOTJiOGQsIDB4MmMxYjNlZmIpLAorICAgIFdUQ1AoMHg3ODA0MGUxMiwgMHgyYzdmZDllMCksIFdUQ1AoMHg3N2RlOWM1YiwgMHgyY2U0NTU4OSksCisgICAgV1RDUCgweDc3YjhkNjgzLCAweDJkNDhiMWIxKSwgV1RDUCgweDc3OTJiY2E1LCAweDJkYWNlZTExKSwKKyAgICBXVENQKDB4Nzc2YzRlZGIsIDB4MmUxMTBhNjIpLCBXVENQKDB4Nzc0NThkNDAsIDB4MmU3NTA2NWUpLAorICAgIFdUQ1AoMHg3NzFlNzdmMCwgMHgyZWQ4ZTFjMCksIFdUQ1AoMHg3NmY3MGYwNSwgMHgyZjNjOWM0MCksCisgICAgV1RDUCgweDc2Y2Y1MjljLCAweDJmYTAzNTk5KSwgV1RDUCgweDc2YTc0MmQxLCAweDMwMDNhZDg1KSwKKyAgICBXVENQKDB4NzY3ZWRmYmUsIDB4MzA2NzAzYmYpLCBXVENQKDB4NzY1NjI5ODIsIDB4MzBjYTM4MDApLAorICAgIFdUQ1AoMHg3NjJkMjAzOCwgMHgzMTJkNGEwMyksIFdUQ1AoMHg3NjAzYzNmZCwgMHgzMTkwMzk4MiksCisgICAgV1RDUCgweDc1ZGExNGVmLCAweDMxZjMwNjM4KSwgV1RDUCgweDc1YjAxMzI5LCAweDMyNTVhZmUwKSwKKyAgICBXVENQKDB4NzU4NWJlY2IsIDB4MzJiODM2MzQpLCBXVENQKDB4NzU1YjE3ZjIsIDB4MzMxYTk4ZWYpLAorICAgIFdUQ1AoMHg3NTMwMWViYiwgMHgzMzdjZDdjZCksIFdUQ1AoMHg3NTA0ZDM0NSwgMHgzM2RlZjI4NyksCisgICAgV1RDUCgweDc0ZDkzNWFlLCAweDM0NDBlOGRhKSwgV1RDUCgweDc0YWQ0NjE1LCAweDM0YTJiYTgxKSwKKyAgICBXVENQKDB4NzQ4MTA0OTksIDB4MzUwNDY3MzYpLCBXVENQKDB4NzQ1NDcxNTgsIDB4MzU2NWVlYjYpLAorICAgIFdUQ1AoMHg3NDI3OGM3MiwgMHgzNWM3NTBiYyksIFdUQ1AoMHg3M2ZhNTYwNywgMHgzNjI4OGQwMyksCisgICAgV1RDUCgweDczY2NjZTM2LCAweDM2ODlhMzQ4KSwgV1RDUCgweDczOWVmNTFmLCAweDM2ZWE5MzQ2KSwKKyAgICBXVENQKDB4NzM3MGNhZTIsIDB4Mzc0YjVjYjkpLCBXVENQKDB4NzM0MjRmYTAsIDB4MzdhYmZmNWQpLAorICAgIFdUQ1AoMHg3MzEzODM3OSwgMHgzODBjN2FlZSksIFdUQ1AoMHg3MmU0NjY4ZiwgMHgzODZjY2YyYSksCisgICAgV1RDUCgweDcyYjRmOTAyLCAweDM4Y2NmYmNiKSwgV1RDUCgweDcyODUzYWYzLCAweDM5MmQwMDhmKSwKKyAgICBXVENQKDB4NzI1NTJjODUsIDB4Mzk4Y2RkMzIpLCBXVENQKDB4NzIyNGNkZDgsIDB4MzllYzkxNzIpLAorICAgIFdUQ1AoMHg3MWY0MWYwZiwgMHgzYTRjMWQwOSksIFdUQ1AoMHg3MWMzMjA0YywgMHgzYWFiN2ZiNyksCisgICAgV1RDUCgweDcxOTFkMWIxLCAweDNiMGFiOTM3KSwgV1RDUCgweDcxNjAzMzYxLCAweDNiNjljOTQ3KSwKKyAgICBXVENQKDB4NzEyZTQ1N2YsIDB4M2JjOGFmYTUpLCBXVENQKDB4NzBmYzA4MmQsIDB4M2MyNzZjMGQpLAorICAgIFdUQ1AoMHg3MGM5N2I5MCwgMHgzYzg1ZmUzZCksIFdUQ1AoMHg3MDk2OWZjYSwgMHgzY2U0NjVmMyksCisgICAgV1RDUCgweDcwNjM3NGZmLCAweDNkNDJhMmVjKSwgV1RDUCgweDcwMmZmYjU0LCAweDNkYTBiNGU3KSwKKyAgICBXVENQKDB4NmZmYzMyZWIsIDB4M2RmZTliYTEpLCBXVENQKDB4NmZjODFiZWEsIDB4M2U1YzU2ZDgpLAorICAgIFdUQ1AoMHg2ZjkzYjY3NiwgMHgzZWI5ZTY0YiksIFdUQ1AoMHg2ZjVmMDJiMiwgMHgzZjE3NDliOCksCisgICAgV1RDUCgweDZmMmEwMGM0LCAweDNmNzQ4MGRkKSwgV1RDUCgweDZlZjRiMGQxLCAweDNmZDE4YjdhKSwKKyAgICBXVENQKDB4NmViZjEyZmYsIDB4NDAyZTY5NGMpLCBXVENQKDB4NmU4OTI3NzIsIDB4NDA4YjFhMTIpLAorICAgIFdUQ1AoMHg2ZTUyZWU1MiwgMHg0MGU3OWQ4YyksIFdUQ1AoMHg2ZTFjNjdjNCwgMHg0MTQzZjM3OSksCisgICAgV1RDUCgweDZkZTU5M2VlLCAweDQxYTAxYjk3KSwgV1RDUCgweDZkYWU3MmY3LCAweDQxZmMxNWE2KSwKKyAgICBXVENQKDB4NmQ3NzA1MDYsIDB4NDI1N2UxNjYpLCBXVENQKDB4NmQzZjRhNDAsIDB4NDJiMzdlOTYpLAorICAgIFdUQ1AoMHg2ZDA3NDJjZiwgMHg0MzBlZWNmNiksIFdUQ1AoMHg2Y2NlZWVkOCwgMHg0MzZhMmM0NSksCisgICAgV1RDUCgweDZjOTY0ZTgzLCAweDQzYzUzYzQ0KSwgV1RDUCgweDZjNWQ2MWY5LCAweDQ0MjAxY2IyKSwKKyAgICBXVENQKDB4NmMyNDI5NjAsIDB4NDQ3YWNkNTApLCBXVENQKDB4NmJlYWE0ZTIsIDB4NDRkNTRkZGYpLAorICAgIFdUQ1AoMHg2YmIwZDRhNywgMHg0NTJmOWUxZSksIFdUQ1AoMHg2Yjc2YjhkNiwgMHg0NTg5YmRjZiksCisgICAgV1RDUCgweDZiM2M1MTlhLCAweDQ1ZTNhY2IxKSwgV1RDUCgweDZiMDE5ZjFhLCAweDQ2M2Q2YTg3KSwKKyAgICBXVENQKDB4NmFjNmExODAsIDB4NDY5NmY3MTApLCBXVENQKDB4NmE4YjU4ZjYsIDB4NDZmMDUyMGYpLAorICAgIFdUQ1AoMHg2YTRmYzVhNiwgMHg0NzQ5N2I0NCksIFdUQ1AoMHg2YTEzZTdiOCwgMHg0N2EyNzI3MSksCisgICAgV1RDUCgweDY5ZDdiZjU3LCAweDQ3ZmIzNzU3KSwgV1RDUCgweDY5OWI0Y2FkLCAweDQ4NTNjOWI5KSwKKyAgICBXVENQKDB4Njk1ZThmZTUsIDB4NDhhYzI5NTcpLCBXVENQKDB4NjkyMTg5MjksIDB4NDkwNDU1ZjQpLAorICAgIFdUQ1AoMHg2OGU0MzhhNCwgMHg0OTVjNGY1MiksIFdUQ1AoMHg2OGE2OWU4MSwgMHg0OWI0MTUzMyksCisgICAgV1RDUCgweDY4NjhiYWVjLCAweDRhMGJhNzViKSwgV1RDUCgweDY4MmE4ZTBmLCAweDRhNjMwNThhKSwKKyAgICBXVENQKDB4NjdlYzE4MTcsIDB4NGFiYTJmODQpLCBXVENQKDB4NjdhZDU5MmYsIDB4NGIxMTI1MGMpLAorICAgIFdUQ1AoMHg2NzZlNTE4MywgMHg0YjY3ZTVlNCksIFdUQ1AoMHg2NzJmMDEzZiwgMHg0YmJlNzFkMSksCisgICAgV1RDUCgweDY2ZWY2ODkxLCAweDRjMTRjODk0KSwgV1RDUCgweDY2YWY4N2E0LCAweDRjNmFlOWYyKSwKKyAgICBXVENQKDB4NjY2ZjVlYTYsIDB4NGNjMGQ1YWUpLCBXVENQKDB4NjYyZWVkYzMsIDB4NGQxNjhiOGIpLAorICAgIFdUQ1AoMHg2NWVlMzUyOSwgMHg0ZDZjMGI0ZSksIFdUQ1AoMHg2NWFkMzUwNSwgMHg0ZGMxNTRiYiksCisgICAgV1RDUCgweDY1NmJlZDg0LCAweDRlMTY2Nzk1KSwgV1RDUCgweDY1MmE1ZWQ2LCAweDRlNmI0M2EyKSwKKyAgICBXVENQKDB4NjRlODg5MjYsIDB4NGViZmU4YTUpLCBXVENQKDB4NjRhNjZjYTUsIDB4NGYxNDU2NjIpLAorICAgIFdUQ1AoMHg2NDY0MDk3ZiwgMHg0ZjY4OGNhMCksIFdUQ1AoMHg2NDIxNWZlNSwgMHg0ZmJjOGIyMiksCisgICAgV1RDUCgweDYzZGU3MDAzLCAweDUwMTA1MWFlKSwgV1RDUCgweDYzOWIzYTBiLCAweDUwNjNlMDA4KSwKKyAgICBXVENQKDB4NjM1N2JlMmEsIDB4NTBiNzM1ZjgpLCBXVENQKDB4NjMxM2ZjOTAsIDB4NTEwYTUzNDApLAorICAgIFdUQ1AoMHg2MmNmZjU2YywgMHg1MTVkMzdhOSksIFdUQ1AoMHg2MjhiYThlZiwgMHg1MWFmZTJmNiksCisgICAgV1RDUCgweDYyNDcxNzQ5LCAweDUyMDI1NGVmKSwgV1RDUCgweDYyMDI0MGE4LCAweDUyNTQ4ZDU5KSwKKyAgICBXVENQKDB4NjFiZDI1M2YsIDB4NTJhNjhiZmIpLCBXVENQKDB4NjE3N2M1M2MsIDB4NTJmODUwOWIpLAorICAgIFdUQ1AoMHg2MTMyMjBkMiwgMHg1MzQ5ZGFmZiksIFdUQ1AoMHg2MGVjMzgzMCwgMHg1MzliMmFmMCksCisgICAgV1RDUCgweDYwYTYwYjg4LCAweDUzZWM0MDMyKSwgV1RDUCgweDYwNWY5YjBiLCAweDU0M2QxYThlKSwKKyAgICBXVENQKDB4NjAxOGU2ZWIsIDB4NTQ4ZGI5Y2IpLCBXVENQKDB4NWZkMWVmNTksIDB4NTRkZTFkYjEpLAorICAgIFdUQ1AoMHg1ZjhhYjQ4NywgMHg1NTJlNDYwNSksIFdUQ1AoMHg1ZjQzMzZhNywgMHg1NTdlMzI5MiksCisgICAgV1RDUCgweDVlZmI3NWVhLCAweDU1Y2RlMzFlKSwgV1RDUCgweDVlYjM3Mjg1LCAweDU2MWQ1NzcxKSwKKyAgICBXVENQKDB4NWU2YjJjYTgsIDB4NTY2YzhmNTUpLCBXVENQKDB4NWUyMmE0ODcsIDB4NTZiYjhhOTApLAorICAgIFdUQ1AoMHg1ZGQ5ZGE1NSwgMHg1NzBhNDhlYyksIFdUQ1AoMHg1ZDkwY2U0NSwgMHg1NzU4Y2EzMSksCisgICAgV1RDUCgweDVkNDc4MDhhLCAweDU3YTcwZTI5KSwgV1RDUCgweDVjZmRmMTU3LCAweDU3ZjUxNDlkKSwKKyAgICBXVENQKDB4NWNiNDIwZTAsIDB4NTg0MmRkNTQpLCBXVENQKDB4NWM2YTBmNTksIDB4NTg5MDY4MWEpLAorICAgIFdUQ1AoMHg1YzFmYmNmNiwgMHg1OGRkYjRiOCksIFdUQ1AoMHg1YmQ1MjllYiwgMHg1OTJhYzJmNyksCisgICAgV1RDUCgweDViOGE1NjZjLCAweDU5Nzc5MmExKSwgV1RDUCgweDViM2Y0MmFlLCAweDU5YzQyMzgxKSwKKyAgICBXVENQKDB4NWFmM2VlZTYsIDB4NWExMDc1NjEpLCBXVENQKDB4NWFhODViNDgsIDB4NWE1Yzg4MGEpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c1MTJbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmY2MjEsIDB4MDAzMjQzZjUpLCBXVENQKDB4N2ZmZmE3MmMsIDB4MDA5NmNiYzEpLAorICAgIFdUQ1AoMHg3ZmZmMDk0MywgMHgwMGZiNTMzMCksIFdUQ1AoMHg3ZmZlMWM2NSwgMHgwMTVmZGEwMyksCisgICAgV1RDUCgweDdmZmNlMDkzLCAweDAxYzQ1ZmZlKSwgV1RDUCgweDdmZmI1NWNlLCAweDAyMjhlNGUyKSwKKyAgICBXVENQKDB4N2ZmOTdjMTgsIDB4MDI4ZDY4NzApLCBXVENQKDB4N2ZmNzUzNzAsIDB4MDJmMWVhNmMpLAorICAgIFdUQ1AoMHg3ZmY0ZGJkOSwgMHgwMzU2NmE5NiksIFdUQ1AoMHg3ZmYyMTU1MywgMHgwM2JhZThiMiksCisgICAgV1RDUCgweDdmZWVmZmUxLCAweDA0MWY2NDgwKSwgV1RDUCgweDdmZWI5Yjg1LCAweDA0ODNkZGMzKSwKKyAgICBXVENQKDB4N2ZlN2U4NDEsIDB4MDRlODU0M2UpLCBXVENQKDB4N2ZlM2U2MTYsIDB4MDU0Y2M3YjEpLAorICAgIFdUQ1AoMHg3ZmRmOTUwOCwgMHgwNWIxMzdkZiksIFdUQ1AoMHg3ZmRhZjUxOSwgMHgwNjE1YTQ4YiksCisgICAgV1RDUCgweDdmZDYwNjRjLCAweDA2N2EwZDc2KSwgV1RDUCgweDdmZDBjOGEzLCAweDA2ZGU3MjYyKSwKKyAgICBXVENQKDB4N2ZjYjNjMjMsIDB4MDc0MmQzMTEpLCBXVENQKDB4N2ZjNTYwY2YsIDB4MDdhNzJmNDUpLAorICAgIFdUQ1AoMHg3ZmJmMzZhYSwgMHgwODBiODZjMiksIFdUQ1AoMHg3ZmI4YmRiOCwgMHgwODZmZDk0NyksCisgICAgV1RDUCgweDdmYjFmNWZjLCAweDA4ZDQyNjk5KSwgV1RDUCgweDdmYWFkZjdjLCAweDA5Mzg2ZTc4KSwKKyAgICBXVENQKDB4N2ZhMzdhM2MsIDB4MDk5Y2IwYTcpLCBXVENQKDB4N2Y5YmM2NDAsIDB4MGEwMGVjZTgpLAorICAgIFdUQ1AoMHg3ZjkzYzM4YywgMHgwYTY1MjJmZSksIFdUQ1AoMHg3ZjhiNzIyNywgMHgwYWM5NTJhYSksCisgICAgV1RDUCgweDdmODJkMjE0LCAweDBiMmQ3YmFmKSwgV1RDUCgweDdmNzllMzVhLCAweDBiOTE5ZGNmKSwKKyAgICBXVENQKDB4N2Y3MGE1ZmUsIDB4MGJmNWI4Y2IpLCBXVENQKDB4N2Y2NzFhMDUsIDB4MGM1OWNjNjgpLAorICAgIFdUQ1AoMHg3ZjVkM2Y3NSwgMHgwY2JkZDg2NSksIFdUQ1AoMHg3ZjUzMTY1NSwgMHgwZDIxZGM4NyksCisgICAgV1RDUCgweDdmNDg5ZWFhLCAweDBkODVkODhmKSwgV1RDUCgweDdmM2RkODdjLCAweDBkZTljYzQwKSwKKyAgICBXVENQKDB4N2YzMmMzZDEsIDB4MGU0ZGI3NWIpLCBXVENQKDB4N2YyNzYwYWYsIDB4MGViMTk5YTQpLAorICAgIFdUQ1AoMHg3ZjFiYWYxZSwgMHgwZjE1NzJkYyksIFdUQ1AoMHg3ZjBmYWYyNSwgMHgwZjc5NDJjNyksCisgICAgV1RDUCgweDdmMDM2MGNiLCAweDBmZGQwOTI2KSwgV1RDUCgweDdlZjZjNDE4LCAweDEwNDBjNWJiKSwKKyAgICBXVENQKDB4N2VlOWQ5MTQsIDB4MTBhNDc4NGIpLCBXVENQKDB4N2VkYzlmYzYsIDB4MTEwODIwOTYpLAorICAgIFdUQ1AoMHg3ZWNmMTgzNywgMHgxMTZiYmU2MCksIFdUQ1AoMHg3ZWMxNDI3MCwgMHgxMWNmNTE2YSksCisgICAgV1RDUCgweDdlYjMxZTc4LCAweDEyMzJkOTc5KSwgV1RDUCgweDdlYTRhYzU4LCAweDEyOTY1NjRkKSwKKyAgICBXVENQKDB4N2U5NWVjMWEsIDB4MTJmOWM3YWEpLCBXVENQKDB4N2U4NmRkYzYsIDB4MTM1ZDJkNTMpLAorICAgIFdUQ1AoMHg3ZTc3ODE2NiwgMHgxM2MwODcwYSksIFdUQ1AoMHg3ZTY3ZDcwMywgMHgxNDIzZDQ5MiksCisgICAgV1RDUCgweDdlNTdkZWE3LCAweDE0ODcxNWFlKSwgV1RDUCgweDdlNDc5ODViLCAweDE0ZWE0YTFmKSwKKyAgICBXVENQKDB4N2UzNzA0MmEsIDB4MTU0ZDcxYWEpLCBXVENQKDB4N2UyNjIyMWYsIDB4MTViMDhjMTIpLAorICAgIFdUQ1AoMHg3ZTE0ZjI0MiwgMHgxNjEzOTkxOCksIFdUQ1AoMHg3ZTAzNzRhMCwgMHgxNjc2OTg3ZiksCisgICAgV1RDUCgweDdkZjFhOTQyLCAweDE2ZDk4YTBjKSwgV1RDUCgweDdkZGY5MDM0LCAweDE3M2M2ZDgwKSwKKyAgICBXVENQKDB4N2RjZDI5ODEsIDB4MTc5ZjQyOWYpLCBXVENQKDB4N2RiYTc1MzQsIDB4MTgwMjA5MmMpLAorICAgIFdUQ1AoMHg3ZGE3NzM1OSwgMHgxODY0YzBlYSksIFdUQ1AoMHg3ZDk0MjNmYywgMHgxOGM3Njk5YiksCisgICAgV1RDUCgweDdkODA4NzI4LCAweDE5MmEwMzA0KSwgV1RDUCgweDdkNmM5Y2U5LCAweDE5OGM4Y2U3KSwKKyAgICBXVENQKDB4N2Q1ODY1NGQsIDB4MTllZjA3MDcpLCBXVENQKDB4N2Q0M2UwNWUsIDB4MWE1MTcxMjgpLAorICAgIFdUQ1AoMHg3ZDJmMGUyYiwgMHgxYWIzY2IwZCksIFdUQ1AoMHg3ZDE5ZWViZiwgMHgxYjE2MTQ3OSksCisgICAgV1RDUCgweDdkMDQ4MjI4LCAweDFiNzg0ZDMwKSwgV1RDUCgweDdjZWVjODczLCAweDFiZGE3NGY2KSwKKyAgICBXVENQKDB4N2NkOGMxYWUsIDB4MWMzYzhiOGMpLCBXVENQKDB4N2NjMjZkZTUsIDB4MWM5ZTkwYjgpLAorICAgIFdUQ1AoMHg3Y2FiY2QyOCwgMHgxZDAwODQzZCksIFdUQ1AoMHg3Yzk0ZGY4MywgMHgxZDYyNjVkZCksCisgICAgV1RDUCgweDdjN2RhNTA1LCAweDFkYzQzNTVlKSwgV1RDUCgweDdjNjYxZGJjLCAweDFlMjVmMjgyKSwKKyAgICBXVENQKDB4N2M0ZTQ5YjcsIDB4MWU4NzlkMGQpLCBXVENQKDB4N2MzNjI5MDQsIDB4MWVlOTM0YzMpLAorICAgIFdUQ1AoMHg3YzFkYmJiMywgMHgxZjRhYjk2OCksIFdUQ1AoMHg3YzA1MDFkMiwgMHgxZmFjMmFiZiksCisgICAgV1RDUCgweDdiZWJmYjcwLCAweDIwMGQ4ODhkKSwgV1RDUCgweDdiZDJhODllLCAweDIwNmVkMjk1KSwKKyAgICBXVENQKDB4N2JiOTA5NmIsIDB4MjBkMDA4OWMpLCBXVENQKDB4N2I5ZjFkZTYsIDB4MjEzMTJhNjUpLAorICAgIFdUQ1AoMHg3Yjg0ZTYxZiwgMHgyMTkyMzdiNSksIFdUQ1AoMHg3YjZhNjIyNywgMHgyMWYzMzA0ZiksCisgICAgV1RDUCgweDdiNGY5MjBlLCAweDIyNTQxM2Y4KSwgV1RDUCgweDdiMzQ3NWU1LCAweDIyYjRlMjc0KSwKKyAgICBXVENQKDB4N2IxOTBkYmMsIDB4MjMxNTliODgpLCBXVENQKDB4N2FmZDU5YTQsIDB4MjM3NjNlZjcpLAorICAgIFdUQ1AoMHg3YWUxNTlhZSwgMHgyM2Q2Y2M4NyksIFdUQ1AoMHg3YWM1MGRlYywgMHgyNDM3NDNmYSksCisgICAgV1RDUCgweDdhYTg3NjZmLCAweDI0OTdhNTE3KSwgV1RDUCgweDdhOGI5MzQ4LCAweDI0ZjdlZmEyKSwKKyAgICBXVENQKDB4N2E2ZTY0OGEsIDB4MjU1ODIzNWYpLCBXVENQKDB4N2E1MGVhNDcsIDB4MjViODQwMTIpLAorICAgIFdUQ1AoMHg3YTMzMjQ5MCwgMHgyNjE4NDU4MSksIFdUQ1AoMHg3YTE1MTM3OCwgMHgyNjc4MzM3MCksCisgICAgV1RDUCgweDc5ZjZiNzExLCAweDI2ZDgwOWE1KSwgV1RDUCgweDc5ZDgwZjZmLCAweDI3MzdjN2UzKSwKKyAgICBXVENQKDB4NzliOTFjYTQsIDB4Mjc5NzZkZjEpLCBXVENQKDB4Nzk5OWRlYzQsIDB4MjdmNmZiOTIpLAorICAgIFdUQ1AoMHg3OTdhNTVlMCwgMHgyODU2NzA4ZCksIFdUQ1AoMHg3OTVhODIwZSwgMHgyOGI1Y2NhNSksCisgICAgV1RDUCgweDc5M2E2MzYxLCAweDI5MTUwZmExKSwgV1RDUCgweDc5MTlmOWVjLCAweDI5NzQzOTQ2KSwKKyAgICBXVENQKDB4NzhmOTQ1YzMsIDB4MjlkMzQ5NTgpLCBXVENQKDB4NzhkODQ2ZmIsIDB4MmEzMjNmOWUpLAorICAgIFdUQ1AoMHg3OGI2ZmRhOCwgMHgyYTkxMWJkYyksIFdUQ1AoMHg3ODk1NjlkZiwgMHgyYWVmZGRkOCksCisgICAgV1RDUCgweDc4NzM4YmIzLCAweDJiNGU4NTU4KSwgV1RDUCgweDc4NTE2MzNiLCAweDJiYWQxMjIxKSwKKyAgICBXVENQKDB4NzgyZWYwOGIsIDB4MmMwYjgzZmEpLCBXVENQKDB4NzgwYzMzYjgsIDB4MmM2OWRhYTYpLAorICAgIFdUQ1AoMHg3N2U5MmNkOSwgMHgyY2M4MTVlZSksIFdUQ1AoMHg3N2M1ZGMwMSwgMHgyZDI2MzU5NiksCisgICAgV1RDUCgweDc3YTI0MTQ4LCAweDJkODQzOTY0KSwgV1RDUCgweDc3N2U1Y2MzLCAweDJkZTIyMTFlKSwKKyAgICBXVENQKDB4Nzc1YTJlODksIDB4MmUzZmVjOGIpLCBXVENQKDB4NzczNWI2YWYsIDB4MmU5ZDliNzApLAorICAgIFdUQ1AoMHg3NzEwZjU0YywgMHgyZWZiMmQ5NSksIFdUQ1AoMHg3NmViZWE3NywgMHgyZjU4YTJiZSksCisgICAgV1RDUCgweDc2YzY5NjQ3LCAweDJmYjVmYWIyKSwgV1RDUCgweDc2YTBmOGQyLCAweDMwMTMzNTM5KSwKKyAgICBXVENQKDB4NzY3YjEyMzEsIDB4MzA3MDUyMTcpLCBXVENQKDB4NzY1NGUyNzksIDB4MzBjZDUxMTUpLAorICAgIFdUQ1AoMHg3NjJlNjljNCwgMHgzMTJhMzFmOCksIFdUQ1AoMHg3NjA3YTgyOCwgMHgzMTg2ZjQ4NyksCisgICAgV1RDUCgweDc1ZTA5ZGJkLCAweDMxZTM5ODg5KSwgV1RDUCgweDc1Yjk0YTljLCAweDMyNDAxZGM2KSwKKyAgICBXVENQKDB4NzU5MWFlZGQsIDB4MzI5Yzg0MDIpLCBXVENQKDB4NzU2OWNhOTksIDB4MzJmOGNiMDcpLAorICAgIFdUQ1AoMHg3NTQxOWRlNywgMHgzMzU0ZjI5YiksIFdUQ1AoMHg3NTE5MjhlMCwgMHgzM2IwZmE4NCksCisgICAgV1RDUCgweDc0ZjA2YjllLCAweDM0MGNlMjhiKSwgV1RDUCgweDc0Yzc2NjNhLCAweDM0NjhhYTc2KSwKKyAgICBXVENQKDB4NzQ5ZTE4Y2QsIDB4MzRjNDUyMGQpLCBXVENQKDB4NzQ3NDgzNzEsIDB4MzUxZmQ5MTgpLAorICAgIFdUQ1AoMHg3NDRhYTYzZiwgMHgzNTdiM2Y1ZCksIFdUQ1AoMHg3NDIwODE1MCwgMHgzNWQ2ODRhNiksCisgICAgV1RDUCgweDczZjYxNGMwLCAweDM2MzFhOGI4KSwgV1RDUCgweDczY2I2MGE4LCAweDM2OGNhYjVjKSwKKyAgICBXVENQKDB4NzNhMDY1MjIsIDB4MzZlNzhjNWIpLCBXVENQKDB4NzM3NTIyNDksIDB4Mzc0MjRiN2IpLAorICAgIFdUQ1AoMHg3MzQ5OTgzOCwgMHgzNzljZTg4NSksIFdUQ1AoMHg3MzFkYzcwYSwgMHgzN2Y3NjM0MSksCisgICAgV1RDUCgweDcyZjFhZWQ5LCAweDM4NTFiYjc3KSwgV1RDUCgweDcyYzU0ZmMxLCAweDM4YWJmMGVmKSwKKyAgICBXVENQKDB4NzI5OGE5ZGQsIDB4MzkwNjAzNzMpLCBXVENQKDB4NzI2YmJkNDgsIDB4Mzk1ZmYyYzkpLAorICAgIFdUQ1AoMHg3MjNlOGEyMCwgMHgzOWI5YmViYyksIFdUQ1AoMHg3MjExMTA3ZSwgMHgzYTEzNjcxMiksCisgICAgV1RDUCgweDcxZTM1MDgwLCAweDNhNmNlYjk2KSwgV1RDUCgweDcxYjU0YTQxLCAweDNhYzY0YzBmKSwKKyAgICBXVENQKDB4NzE4NmZkZGUsIDB4M2IxZjg4NDgpLCBXVENQKDB4NzE1ODZiNzQsIDB4M2I3OGEwMDcpLAorICAgIFdUQ1AoMHg3MTI5OTMxZiwgMHgzYmQxOTMxOCksIFdUQ1AoMHg3MGZhNzRmYywgMHgzYzJhNjE0MiksCisgICAgV1RDUCgweDcwY2IxMTI4LCAweDNjODMwYTUwKSwgV1RDUCgweDcwOWI2N2MwLCAweDNjZGI4ZTA5KSwKKyAgICBXVENQKDB4NzA2Yjc4ZTMsIDB4M2QzM2VjMzkpLCBXVENQKDB4NzAzYjQ0YWQsIDB4M2Q4YzI0YTgpLAorICAgIFdUQ1AoMHg3MDBhY2IzYywgMHgzZGU0MzcxZiksIFdUQ1AoMHg2ZmRhMGNhZSwgMHgzZTNjMjM2OSksCisgICAgV1RDUCgweDZmYTkwOTIxLCAweDNlOTNlOTUwKSwgV1RDUCgweDZmNzdjMGIzLCAweDNlZWI4ODljKSwKKyAgICBXVENQKDB4NmY0NjMzODMsIDB4M2Y0MzAxMTkpLCBXVENQKDB4NmYxNDYxYjAsIDB4M2Y5YTUyOTApLAorICAgIFdUQ1AoMHg2ZWUyNGI1NywgMHgzZmYxN2NjYSksIFdUQ1AoMHg2ZWFmZjA5OSwgMHg0MDQ4N2Y5NCksCisgICAgV1RDUCgweDZlN2Q1MTkzLCAweDQwOWY1YWI2KSwgV1RDUCgweDZlNGE2ZTY2LCAweDQwZjYwZGZiKSwKKyAgICBXVENQKDB4NmUxNzQ3MzAsIDB4NDE0Yzk5MmYpLCBXVENQKDB4NmRlM2RjMTEsIDB4NDFhMmZjMWEpLAorICAgIFdUQ1AoMHg2ZGIwMmQyOSwgMHg0MWY5MzY4OSksIFdUQ1AoMHg2ZDdjM2E5OCwgMHg0MjRmNDg0NSksCisgICAgV1RDUCgweDZkNDgwNDdlLCAweDQyYTUzMTFiKSwgV1RDUCgweDZkMTM4YWZiLCAweDQyZmFmMGQ0KSwKKyAgICBXVENQKDB4NmNkZWNlMmYsIDB4NDM1MDg3M2MpLCBXVENQKDB4NmNhOWNlM2IsIDB4NDNhNWY0MWUpLAorICAgIFdUQ1AoMHg2Yzc0OGIzZiwgMHg0M2ZiMzc0NiksIFdUQ1AoMHg2YzNmMDU1ZCwgMHg0NDUwNTA3ZSksCisgICAgV1RDUCgweDZjMDkzY2I2LCAweDQ0YTUzZjkzKSwgV1RDUCgweDZiZDMzMTZhLCAweDQ0ZmEwNDUwKSwKKyAgICBXVENQKDB4NmI5Y2UzOWIsIDB4NDU0ZTllODApLCBXVENQKDB4NmI2NjUzNmIsIDB4NDVhMzBkZjApLAorICAgIFdUQ1AoMHg2YjJmODBmYiwgMHg0NWY3NTI2YiksIFdUQ1AoMHg2YWY4NmM2YywgMHg0NjRiNmJiZSksCisgICAgV1RDUCgweDZhYzExNWUyLCAweDQ2OWY1OWI0KSwgV1RDUCgweDZhODk3ZDdkLCAweDQ2ZjMxYzFhKSwKKyAgICBXVENQKDB4NmE1MWEzNjEsIDB4NDc0NmIyYmMpLCBXVENQKDB4NmExOTg3YjAsIDB4NDc5YTFkNjcpLAorICAgIFdUQ1AoMHg2OWUxMmE4YywgMHg0N2VkNWJlNiksIFdUQ1AoMHg2OWE4OGMxOSwgMHg0ODQwNmUwOCksCisgICAgV1RDUCgweDY5NmZhYzc4LCAweDQ4OTM1Mzk3KSwgV1RDUCgweDY5MzY4YmNlLCAweDQ4ZTYwYzYyKSwKKyAgICBXVENQKDB4NjhmZDJhM2QsIDB4NDkzODk4MzYpLCBXVENQKDB4NjhjMzg3ZTksIDB4NDk4YWY2ZGYpLAorICAgIFdUQ1AoMHg2ODg5YTRmNiwgMHg0OWRkMjgyYSksIFdUQ1AoMHg2ODRmODE4NiwgMHg0YTJmMmJlNiksCisgICAgV1RDUCgweDY4MTUxZGJlLCAweDRhODEwMWRlKSwgV1RDUCgweDY3ZGE3OWMzLCAweDRhZDJhOWUyKSwKKyAgICBXVENQKDB4Njc5Zjk1YjcsIDB4NGIyNDIzYmUpLCBXVENQKDB4Njc2NDcxYzAsIDB4NGI3NTZmNDApLAorICAgIFdUQ1AoMHg2NzI5MGUwMiwgMHg0YmM2OGMzNiksIFdUQ1AoMHg2NmVkNmFhMSwgMHg0YzE3N2E2ZSksCisgICAgV1RDUCgweDY2YjE4N2MzLCAweDRjNjgzOWI3KSwgV1RDUCgweDY2NzU2NThjLCAweDRjYjhjOWRkKSwKKyAgICBXVENQKDB4NjYzOTA0MjIsIDB4NGQwOTJhYjApLCBXVENQKDB4NjVmYzYzYTksIDB4NGQ1OTViZmUpLAorICAgIFdUQ1AoMHg2NWJmODQ0NywgMHg0ZGE5NWQ5NiksIFdUQ1AoMHg2NTgyNjYyMiwgMHg0ZGY5MmY0NiksCisgICAgV1RDUCgweDY1NDUwOTVmLCAweDRlNDhkMGRkKSwgV1RDUCgweDY1MDc2ZTI1LCAweDRlOTg0MjI5KSwKKyAgICBXVENQKDB4NjRjOTk0OTgsIDB4NGVlNzgyZmIpLCBXVENQKDB4NjQ4YjdjZTAsIDB4NGYzNjkzMjApLAorICAgIFdUQ1AoMHg2NDRkMjcyMiwgMHg0Zjg1NzI2OSksIFdUQ1AoMHg2NDBlOTM4NiwgMHg0ZmQ0MjBhNCksCisgICAgV1RDUCgweDYzY2ZjMjMxLCAweDUwMjI5ZGExKSwgV1RDUCgweDYzOTBiMzRhLCAweDUwNzBlOTJmKSwKKyAgICBXVENQKDB4NjM1MTY2ZjksIDB4NTBiZjAzMWYpLCBXVENQKDB4NjMxMWRkNjQsIDB4NTEwY2ViNDApLAorICAgIFdUQ1AoMHg2MmQyMTZiMywgMHg1MTVhYTE2MiksIFdUQ1AoMHg2MjkyMTMwYywgMHg1MWE4MjU1NSksCisgICAgV1RDUCgweDYyNTFkMjk4LCAweDUxZjU3NmVhKSwgV1RDUCgweDYyMTE1NTdlLCAweDUyNDI5NWYwKSwKKyAgICBXVENQKDB4NjFkMDliZTUsIDB4NTI4ZjgyMzgpLCBXVENQKDB4NjE4ZmE1ZjcsIDB4NTJkYzNiOTIpLAorICAgIFdUQ1AoMHg2MTRlNzNkYSwgMHg1MzI4YzFkMCksIFdUQ1AoMHg2MTBkMDViNywgMHg1Mzc1MTRjMiksCisgICAgV1RDUCgweDYwY2I1YmI3LCAweDUzYzEzNDM5KSwgV1RDUCgweDYwODk3NjAxLCAweDU0MGQyMDA1KSwKKyAgICBXVENQKDB4NjA0NzU0YmYsIDB4NTQ1OGQ3ZjkpLCBXVENQKDB4NjAwNGY4MTksIDB4NTRhNDViZTYpLAorICAgIFdUQ1AoMHg1ZmMyNjAzOCwgMHg1NGVmYWI5YyksIFdUQ1AoMHg1ZjdmOGQ0NiwgMHg1NTNhYzZlZSksCisgICAgV1RDUCgweDVmM2M3ZjZiLCAweDU1ODVhZGFkKSwgV1RDUCgweDVlZjkzNmQxLCAweDU1ZDA1ZmFhKSwKKyAgICBXVENQKDB4NWViNWIzYTIsIDB4NTYxYWRjYjkpLCBXVENQKDB4NWU3MWY2MDYsIDB4NTY2NTI0YWEpLAorICAgIFdUQ1AoMHg1ZTJkZmUyOSwgMHg1NmFmMzc1MCksIFdUQ1AoMHg1ZGU5Y2MzMywgMHg1NmY5MTQ3ZSksCisgICAgV1RDUCgweDVkYTU2MDRmLCAweDU3NDJiYzA2KSwgV1RDUCgweDVkNjBiYWE3LCAweDU3OGMyZGJhKSwKKyAgICBXVENQKDB4NWQxYmRiNjUsIDB4NTdkNTY5NmQpLCBXVENQKDB4NWNkNmMyYjUsIDB4NTgxZTZlZjEpLAorICAgIFdUQ1AoMHg1YzkxNzBiZiwgMHg1ODY3M2UxYiksIFdUQ1AoMHg1YzRiZTViMCwgMHg1OGFmZDZiZCksCisgICAgV1RDUCgweDVjMDYyMWIyLCAweDU4ZjgzOGE5KSwgV1RDUCgweDViYzAyNGYwLCAweDU5NDA2M2I1KSwKKyAgICBXVENQKDB4NWI3OWVmOTYsIDB4NTk4ODU3YjIpLCBXVENQKDB4NWIzMzgxY2UsIDB4NTlkMDE0NzUpLAorICAgIFdUQ1AoMHg1YWVjZGJjNSwgMHg1YTE3OTlkMSksIFdUQ1AoMHg1YWE1ZmRhNSwgMHg1YTVlZTc5YSksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzc2OFtdID0geworICAgIFdUQ1AoMHg3ZmZmZmI5ZCwgMHgwMDIxODJhNCksIFdUQ1AoMHg3ZmZmZDg4NiwgMHgwMDY0ODdlMyksCisgICAgV1RDUCgweDdmZmY5MjU3LCAweDAwYTc4ZDA2KSwgV1RDUCgweDdmZmYyOTEwLCAweDAwZWE5MWZjKSwKKyAgICBXVENQKDB4N2ZmZTljYjIsIDB4MDEyZDk2YjEpLCBXVENQKDB4N2ZmZGVkM2QsIDB4MDE3MDliMTMpLAorICAgIFdUQ1AoMHg3ZmZkMWFiMiwgMHgwMWIzOWYxMSksIFdUQ1AoMHg3ZmZjMjUwZiwgMHgwMWY2YTI5NyksCisgICAgV1RDUCgweDdmZmIwYzU2LCAweDAyMzlhNTkzKSwgV1RDUCgweDdmZjlkMDg3LCAweDAyN2NhN2YzKSwKKyAgICBXVENQKDB4N2ZmODcxYTIsIDB4MDJiZmE5YTQpLCBXVENQKDB4N2ZmNmVmYTcsIDB4MDMwMmFhOTUpLAorICAgIFdUQ1AoMHg3ZmY1NGE5OCwgMHgwMzQ1YWFiMiksIFdUQ1AoMHg3ZmYzODI3NCwgMHgwMzg4YTllYSksCisgICAgV1RDUCgweDdmZjE5NzNiLCAweDAzY2JhODI5KSwgV1RDUCgweDdmZWY4OGVmLCAweDA0MGVhNTVlKSwKKyAgICBXVENQKDB4N2ZlZDU3OTEsIDB4MDQ1MWExNzcpLCBXVENQKDB4N2ZlYjAzMWYsIDB4MDQ5NDljNjApLAorICAgIFdUQ1AoMHg3ZmU4OGI5YywgMHgwNGQ3OTYwOCksIFdUQ1AoMHg3ZmU1ZjEwOCwgMHgwNTFhOGU1YyksCisgICAgV1RDUCgweDdmZTMzMzY0LCAweDA1NWQ4NTRhKSwgV1RDUCgweDdmZTA1MmFmLCAweDA1YTA3YWJmKSwKKyAgICBXVENQKDB4N2ZkZDRlZWMsIDB4MDVlMzZlYTkpLCBXVENQKDB4N2ZkYTI4MWIsIDB4MDYyNjYwZjYpLAorICAgIFdUQ1AoMHg3ZmQ2ZGUzZCwgMHgwNjY5NTE5NCksIFdUQ1AoMHg3ZmQzNzE1MywgMHgwNmFjNDA2ZiksCisgICAgV1RDUCgweDdmY2ZlMTVkLCAweDA2ZWYyZDc2KSwgV1RDUCgweDdmY2MyZTVkLCAweDA3MzIxODk3KSwKKyAgICBXVENQKDB4N2ZjODU4NTQsIDB4MDc3NTAxYmUpLCBXVENQKDB4N2ZjNDVmNDIsIDB4MDdiN2U4ZGEpLAorICAgIFdUQ1AoMHg3ZmMwNDMyOSwgMHgwN2ZhY2RkOSksIFdUQ1AoMHg3ZmJjMDQwYSwgMHgwODNkYjBhNyksCisgICAgV1RDUCgweDdmYjdhMWU2LCAweDA4ODA5MTMzKSwgV1RDUCgweDdmYjMxY2JmLCAweDA4YzM2ZjZhKSwKKyAgICBXVENQKDB4N2ZhZTc0OTUsIDB4MDkwNjRiM2EpLCBXVENQKDB4N2ZhOWE5NmEsIDB4MDk0OTI0OTEpLAorICAgIFdUQ1AoMHg3ZmE0YmIzZiwgMHgwOThiZmI1YyksIFdUQ1AoMHg3ZjlmYWExNSwgMHgwOWNlY2Y4OSksCisgICAgV1RDUCgweDdmOWE3NWVmLCAweDBhMTFhMTA2KSwgV1RDUCgweDdmOTUxZWNjLCAweDBhNTQ2ZmMwKSwKKyAgICBXVENQKDB4N2Y4ZmE0YjAsIDB4MGE5NzNiYTUpLCBXVENQKDB4N2Y4YTA3OWEsIDB4MGFkYTA0YTMpLAorICAgIFdUQ1AoMHg3Zjg0NDc4ZSwgMHgwYjFjY2FhNyksIFdUQ1AoMHg3ZjdlNjQ4YywgMHgwYjVmOGQ5ZiksCisgICAgV1RDUCgweDdmNzg1ZTk2LCAweDBiYTI0ZDc5KSwgV1RDUCgweDdmNzIzNWFkLCAweDBiZTUwYTIzKSwKKyAgICBXVENQKDB4N2Y2YmU5ZDQsIDB4MGMyN2MzODkpLCBXVENQKDB4N2Y2NTdiMGMsIDB4MGM2YTc5OWIpLAorICAgIFdUQ1AoMHg3ZjVlZTk1NywgMHgwY2FkMmM0NSksIFdUQ1AoMHg3ZjU4MzRiNywgMHgwY2VmZGI3NiksCisgICAgV1RDUCgweDdmNTE1ZDJkLCAweDBkMzI4NzFhKSwgV1RDUCgweDdmNGE2MmJiLCAweDBkNzUyZjIwKSwKKyAgICBXVENQKDB4N2Y0MzQ1NjMsIDB4MGRiN2QzNzYpLCBXVENQKDB4N2YzYzA1MjgsIDB4MGRmYTc0MDkpLAorICAgIFdUQ1AoMHg3ZjM0YTIwYiwgMHgwZTNkMTBjNyksIFdUQ1AoMHg3ZjJkMWMwZSwgMHgwZTdmYTk5ZSksCisgICAgV1RDUCgweDdmMjU3MzM0LCAweDBlYzIzZTdiKSwgV1RDUCgweDdmMWRhNzdlLCAweDBmMDRjZjRjKSwKKyAgICBXVENQKDB4N2YxNWI4ZWUsIDB4MGY0NzViZmYpLCBXVENQKDB4N2YwZGE3ODcsIDB4MGY4OWU0ODIpLAorICAgIFdUQ1AoMHg3ZjA1NzM0YiwgMHgwZmNjNjhjMiksIFdUQ1AoMHg3ZWZkMWMzYywgMHgxMDBlZThhZCksCisgICAgV1RDUCgweDdlZjRhMjVkLCAweDEwNTE2NDMyKSwgV1RDUCgweDdlZWMwNWFmLCAweDEwOTNkYjNkKSwKKyAgICBXVENQKDB4N2VlMzQ2MzYsIDB4MTBkNjRkYmQpLCBXVENQKDB4N2VkYTYzZjMsIDB4MTExOGJiOWYpLAorICAgIFdUQ1AoMHg3ZWQxNWVlOSwgMHgxMTViMjRkMSksIFdUQ1AoMHg3ZWM4MzcxYSwgMHgxMTlkODk0MSksCisgICAgV1RDUCgweDdlYmVlYzg5LCAweDExZGZlOGRjKSwgV1RDUCgweDdlYjU3ZjM5LCAweDEyMjI0MzkyKSwKKyAgICBXVENQKDB4N2VhYmVmMmMsIDB4MTI2NDk5NGUpLCBXVENQKDB4N2VhMjNjNjUsIDB4MTJhNmVhMDApLAorICAgIFdUQ1AoMHg3ZTk4NjZlNiwgMHgxMmU5MzU5NCksIFdUQ1AoMHg3ZThlNmViMiwgMHgxMzJiN2JmOSksCisgICAgV1RDUCgweDdlODQ1M2NjLCAweDEzNmRiZDFkKSwgV1RDUCgweDdlN2ExNjM2LCAweDEzYWZmOGVkKSwKKyAgICBXVENQKDB4N2U2ZmI1ZjQsIDB4MTNmMjJmNTgpLCBXVENQKDB4N2U2NTMzMDgsIDB4MTQzNDYwNGEpLAorICAgIFdUQ1AoMHg3ZTVhOGQ3NSwgMHgxNDc2OGJiMyksIFdUQ1AoMHg3ZTRmYzUzZSwgMHgxNGI4YjE3ZiksCisgICAgV1RDUCgweDdlNDRkYTY2LCAweDE0ZmFkMTllKSwgV1RDUCgweDdlMzljY2YwLCAweDE1M2NlYmZiKSwKKyAgICBXVENQKDB4N2UyZTljZGYsIDB4MTU3ZjAwODYpLCBXVENQKDB4N2UyMzRhMzYsIDB4MTVjMTBmMmQpLAorICAgIFdUQ1AoMHg3ZTE3ZDRmOCwgMHgxNjAzMTdkYyksIFdUQ1AoMHg3ZTBjM2QyOSwgMHgxNjQ1MWE4MyksCisgICAgV1RDUCgweDdlMDA4MmNiLCAweDE2ODcxNzBmKSwgV1RDUCgweDdkZjRhNWUyLCAweDE2YzkwZDZlKSwKKyAgICBXVENQKDB4N2RlOGE2NzAsIDB4MTcwYWZkOGQpLCBXVENQKDB4N2RkYzg0N2EsIDB4MTc0Y2U3NWIpLAorICAgIFdUQ1AoMHg3ZGQwNDAwMywgMHgxNzhlY2FjNiksIFdUQ1AoMHg3ZGMzZDkwZCwgMHgxN2QwYTdiYyksCisgICAgV1RDUCgweDdkYjc0ZjlkLCAweDE4MTI3ZTJhKSwgV1RDUCgweDdkYWFhM2I1LCAweDE4NTQ0ZGZmKSwKKyAgICBXVENQKDB4N2Q5ZGQ1NWEsIDB4MTg5NjE3MjgpLCBXVENQKDB4N2Q5MGU0OGYsIDB4MThkN2Q5OTMpLAorICAgIFdUQ1AoMHg3ZDgzZDE1NiwgMHgxOTE5OTUyZiksIFdUQ1AoMHg3ZDc2OWJiNSwgMHgxOTViNDllYSksCisgICAgV1RDUCgweDdkNjk0M2FlLCAweDE5OWNmN2IwKSwgV1RDUCgweDdkNWJjOTQ2LCAweDE5ZGU5ZTcyKSwKKyAgICBXVENQKDB4N2Q0ZTJjN2YsIDB4MWEyMDNlMWIpLCBXVENQKDB4N2Q0MDZkNWUsIDB4MWE2MWQ2OWIpLAorICAgIFdUQ1AoMHg3ZDMyOGJlNiwgMHgxYWEzNjdkZiksIFdUQ1AoMHg3ZDI0ODgxYiwgMHgxYWU0ZjFkNiksCisgICAgV1RDUCgweDdkMTY2MjAxLCAweDFiMjY3NDZkKSwgV1RDUCgweDdkMDgxOTljLCAweDFiNjdlZjkzKSwKKyAgICBXVENQKDB4N2NmOWFlZjAsIDB4MWJhOTYzMzUpLCBXVENQKDB4N2NlYjIyMDEsIDB4MWJlYWNmNDIpLAorICAgIFdUQ1AoMHg3Y2RjNzJkMywgMHgxYzJjMzNhNyksIFdUQ1AoMHg3Y2NkYTE2OSwgMHgxYzZkOTA1MyksCisgICAgV1RDUCgweDdjYmVhZGM4LCAweDFjYWVlNTM0KSwgV1RDUCgweDdjYWY5N2Y0LCAweDFjZjAzMjM4KSwKKyAgICBXVENQKDB4N2NhMDVmZjEsIDB4MWQzMTc3NGQpLCBXVENQKDB4N2M5MTA1YzMsIDB4MWQ3MmI0NjEpLAorICAgIFdUQ1AoMHg3YzgxODk2ZiwgMHgxZGIzZTk2MiksIFdUQ1AoMHg3YzcxZWFmOSwgMHgxZGY1MTYzZiksCisgICAgV1RDUCgweDdjNjIyYTY0LCAweDFlMzYzYWU1KSwgV1RDUCgweDdjNTI0N2I2LCAweDFlNzc1NzQzKSwKKyAgICBXVENQKDB4N2M0MjQyZjIsIDB4MWViODZiNDYpLCBXVENQKDB4N2MzMjFjMWUsIDB4MWVmOTc2ZGUpLAorICAgIFdUQ1AoMHg3YzIxZDMzYywgMHgxZjNhNzlmNyksIFdUQ1AoMHg3YzExNjg1MywgMHgxZjdiNzQ4MSksCisgICAgV1RDUCgweDdjMDBkYjY2LCAweDFmYmM2NjY5KSwgV1RDUCgweDdiZjAyYzdiLCAweDFmZmQ0ZjllKSwKKyAgICBXVENQKDB4N2JkZjViOTQsIDB4MjAzZTMwMGQpLCBXVENQKDB4N2JjZTY4YjgsIDB4MjA3ZjA3YTYpLAorICAgIFdUQ1AoMHg3YmJkNTNlYiwgMHgyMGJmZDY1NiksIFdUQ1AoMHg3YmFjMWQzMSwgMHgyMTAwOWMwYyksCisgICAgV1RDUCgweDdiOWFjNDkwLCAweDIxNDE1OGI1KSwgV1RDUCgweDdiODk0YTBiLCAweDIxODIwYzQxKSwKKyAgICBXVENQKDB4N2I3N2FkYTgsIDB4MjFjMmI2OWMpLCBXVENQKDB4N2I2NWVmNmMsIDB4MjIwMzU3YjYpLAorICAgIFdUQ1AoMHg3YjU0MGY1YiwgMHgyMjQzZWY3ZCksIFdUQ1AoMHg3YjQyMGQ3YSwgMHgyMjg0N2RlMCksCisgICAgV1RDUCgweDdiMmZlOWNmLCAweDIyYzUwMmNiKSwgV1RDUCgweDdiMWRhNDVlLCAweDIzMDU3ZTJlKSwKKyAgICBXVENQKDB4N2IwYjNkMmMsIDB4MjM0NWVmZjgpLCBXVENQKDB4N2FmOGI0M2YsIDB4MjM4NjU4MTYpLAorICAgIFdUQ1AoMHg3YWU2MDk5YiwgMHgyM2M2YjY3NiksIFdUQ1AoMHg3YWQzM2Q0NSwgMHgyNDA3MGIwOCksCisgICAgV1RDUCgweDdhYzA0ZjQ0LCAweDI0NDc1NWI5KSwgV1RDUCgweDdhYWQzZjliLCAweDI0ODc5Njc4KSwKKyAgICBXVENQKDB4N2E5YTBlNTAsIDB4MjRjN2NkMzMpLCBXVENQKDB4N2E4NmJiNjgsIDB4MjUwN2Y5ZDgpLAorICAgIFdUQ1AoMHg3YTczNDZlOSwgMHgyNTQ4MWM1NyksIFdUQ1AoMHg3YTVmYjBkOCwgMHgyNTg4MzQ5ZCksCisgICAgV1RDUCgweDdhNGJmOTNhLCAweDI1Yzg0Mjk5KSwgV1RDUCgweDdhMzgyMDE1LCAweDI2MDg0NjM5KSwKKyAgICBXVENQKDB4N2EyNDI1NmYsIDB4MjY0ODNmNmMpLCBXVENQKDB4N2ExMDA5NGMsIDB4MjY4ODJlMjEpLAorICAgIFdUQ1AoMHg3OWZiY2JiMiwgMHgyNmM4MTI0NSksIFdUQ1AoMHg3OWU3NmNhNywgMHgyNzA3ZWJjNyksCisgICAgV1RDUCgweDc5ZDJlYzMwLCAweDI3NDdiYTk1KSwgV1RDUCgweDc5YmU0YTUzLCAweDI3ODc3ZTlmKSwKKyAgICBXVENQKDB4NzlhOTg3MTUsIDB4MjdjNzM3ZDMpLCBXVENQKDB4Nzk5NGEyN2QsIDB4MjgwNmU2MWYpLAorICAgIFdUQ1AoMHg3OTdmOWM5MCwgMHgyODQ2ODk3MSksIFdUQ1AoMHg3OTZhNzU1NCwgMHgyODg2MjFiOSksCisgICAgV1RDUCgweDc5NTUyY2NlLCAweDI4YzVhZWU1KSwgV1RDUCgweDc5M2ZjMzA1LCAweDI5MDUzMGUzKSwKKyAgICBXVENQKDB4NzkyYTM3ZmUsIDB4Mjk0NGE3YTIpLCBXVENQKDB4NzkxNDhiYmYsIDB4Mjk4NDEzMTEpLAorICAgIFdUQ1AoMHg3OGZlYmU0ZSwgMHgyOWMzNzMxZSksIFdUQ1AoMHg3OGU4Y2ZiMiwgMHgyYTAyYzdiOCksCisgICAgV1RDUCgweDc4ZDJiZmVmLCAweDJhNDIxMGNlKSwgV1RDUCgweDc4YmM4ZjBkLCAweDJhODE0ZTRkKSwKKyAgICBXVENQKDB4NzhhNjNkMTEsIDB4MmFjMDgwMjYpLCBXVENQKDB4Nzg4ZmNhMDEsIDB4MmFmZmE2NDYpLAorICAgIFdUQ1AoMHg3ODc5MzVlNCwgMHgyYjNlYzA5YyksIFdUQ1AoMHg3ODYyODBiZiwgMHgyYjdkY2YxNyksCisgICAgV1RDUCgweDc4NGJhYTlhLCAweDJiYmNkMWE2KSwgV1RDUCgweDc4MzRiMzdhLCAweDJiZmJjODM3KSwKKyAgICBXVENQKDB4NzgxZDliNjUsIDB4MmMzYWIyYjkpLCBXVENQKDB4NzgwNjYyNjIsIDB4MmM3OTkxMWIpLAorICAgIFdUQ1AoMHg3N2VmMDg3NywgMHgyY2I4NjM0YiksIFdUQ1AoMHg3N2Q3OGRhYSwgMHgyY2Y3MjkzOSksCisgICAgV1RDUCgweDc3YmZmMjAzLCAweDJkMzVlMmQzKSwgV1RDUCgweDc3YTgzNTg3LCAweDJkNzQ5MDA4KSwKKyAgICBXVENQKDB4Nzc5MDU4M2UsIDB4MmRiMzMwYzcpLCBXVENQKDB4Nzc3ODVhMmQsIDB4MmRmMWM0ZmUpLAorICAgIFdUQ1AoMHg3NzYwM2I1YSwgMHgyZTMwNGM5ZCksIFdUQ1AoMHg3NzQ3ZmJjZSwgMHgyZTZlYzc5MiksCisgICAgV1RDUCgweDc3MmY5YjhlLCAweDJlYWQzNWNkKSwgV1RDUCgweDc3MTcxYWExLCAweDJlZWI5NzNiKSwKKyAgICBXVENQKDB4NzZmZTc5MGUsIDB4MmYyOWViY2MpLCBXVENQKDB4NzZlNWI2ZGMsIDB4MmY2ODMzNmYpLAorICAgIFdUQ1AoMHg3NmNjZDQxMSwgMHgyZmE2NmUxMyksIFdUQ1AoMHg3NmIzZDBiNCwgMHgyZmU0OWJhNyksCisgICAgV1RDUCgweDc2OWFhY2NjLCAweDMwMjJiYzE5KSwgV1RDUCgweDc2ODE2ODVmLCAweDMwNjBjZjU5KSwKKyAgICBXVENQKDB4NzY2ODAzNzYsIDB4MzA5ZWQ1NTYpLCBXVENQKDB4NzY0ZTdlMTcsIDB4MzBkY2NkZmUpLAorICAgIFdUQ1AoMHg3NjM0ZDg0OCwgMHgzMTFhYjk0MSksIFdUQ1AoMHg3NjFiMTIxMSwgMHgzMTU4OTcwZSksCisgICAgV1RDUCgweDc2MDEyYjc5LCAweDMxOTY2NzUzKSwgV1RDUCgweDc1ZTcyNDg3LCAweDMxZDQyYTAwKSwKKyAgICBXVENQKDB4NzVjY2ZkNDIsIDB4MzIxMWRmMDQpLCBXVENQKDB4NzViMmI1YjIsIDB4MzI0Zjg2NGUpLAorICAgIFdUQ1AoMHg3NTk4NGRkYywgMHgzMjhkMWZjYyksIFdUQ1AoMHg3NTdkYzVjYSwgMHgzMmNhYWI2ZiksCisgICAgV1RDUCgweDc1NjMxZDgyLCAweDMzMDgyOTI1KSwgV1RDUCgweDc1NDg1NTBiLCAweDMzNDU5OGRlKSwKKyAgICBXVENQKDB4NzUyZDZjNmMsIDB4MzM4MmZhODgpLCBXVENQKDB4NzUxMjYzYWUsIDB4MzNjMDRlMTMpLAorICAgIFdUQ1AoMHg3NGY3M2FkNywgMHgzM2ZkOTM2ZSksIFdUQ1AoMHg3NGRiZjFlZiwgMHgzNDNhY2E4NyksCisgICAgV1RDUCgweDc0YzA4OGZlLCAweDM0NzdmMzUwKSwgV1RDUCgweDc0YTUwMDBhLCAweDM0YjUwZGI1KSwKKyAgICBXVENQKDB4NzQ4OTU3MWMsIDB4MzRmMjE5YTgpLCBXVENQKDB4NzQ2ZDhlM2EsIDB4MzUyZjE3MTYpLAorICAgIFdUQ1AoMHg3NDUxYTU2ZSwgMHgzNTZjMDVmMCksIFdUQ1AoMHg3NDM1OWNiZCwgMHgzNWE4ZTYyNSksCisgICAgV1RDUCgweDc0MTk3NDMxLCAweDM1ZTViN2EzKSwgV1RDUCgweDczZmQyYmQwLCAweDM2MjI3YTViKSwKKyAgICBXVENQKDB4NzNlMGMzYTMsIDB4MzY1ZjJlM2IpLCBXVENQKDB4NzNjNDNiYjEsIDB4MzY5YmQzMzQpLAorICAgIFdUQ1AoMHg3M2E3OTQwMiwgMHgzNmQ4NjkzNCksIFdUQ1AoMHg3MzhhY2M5ZSwgMHgzNzE0ZjAyYSksCisgICAgV1RDUCgweDczNmRlNThkLCAweDM3NTE2ODA3KSwgV1RDUCgweDczNTBkZWQ3LCAweDM3OGRkMGI5KSwKKyAgICBXVENQKDB4NzMzM2I4ODMsIDB4MzdjYTJhMzApLCBXVENQKDB4NzMxNjcyOWEsIDB4MzgwNjc0NWMpLAorICAgIFdUQ1AoMHg3MmY5MGQyNCwgMHgzODQyYWYyYiksIFdUQ1AoMHg3MmRiODgyOCwgMHgzODdlZGE4ZSksCisgICAgV1RDUCgweDcyYmRlM2FmLCAweDM4YmFmNjc0KSwgV1RDUCgweDcyYTAxZmMyLCAweDM4ZjcwMmNkKSwKKyAgICBXVENQKDB4NzI4MjNjNjcsIDB4MzkzMmZmODcpLCBXVENQKDB4NzI2NDM5YTgsIDB4Mzk2ZWVjOTMpLAorICAgIFdUQ1AoMHg3MjQ2MTc4YywgMHgzOWFhYzllMCksIFdUQ1AoMHg3MjI3ZDYxYywgMHgzOWU2OTc1ZSksCisgICAgV1RDUCgweDcyMDk3NTYwLCAweDNhMjI1NGZjKSwgV1RDUCgweDcxZWFmNTYxLCAweDNhNWUwMmFhKSwKKyAgICBXVENQKDB4NzFjYzU2MjYsIDB4M2E5OWEwNTcpLCBXVENQKDB4NzFhZDk3YjksIDB4M2FkNTJkZjQpLAorICAgIFdUQ1AoMHg3MThlYmEyMiwgMHgzYjEwYWI3MCksIFdUQ1AoMHg3MTZmYmQ2OCwgMHgzYjRjMThiYSksCisgICAgV1RDUCgweDcxNTBhMTk1LCAweDNiODc3NWMyKSwgV1RDUCgweDcxMzE2NmIxLCAweDNiYzJjMjc5KSwKKyAgICBXVENQKDB4NzExMjBjYzUsIDB4M2JmZGZlY2QpLCBXVENQKDB4NzBmMjkzZDksIDB4M2MzOTJhYWYpLAorICAgIFdUQ1AoMHg3MGQyZmJmNiwgMHgzYzc0NDYwZSksIFdUQ1AoMHg3MGIzNDUyNSwgMHgzY2FmNTBkYSksCisgICAgV1RDUCgweDcwOTM2ZjZlLCAweDNjZWE0YjA0KSwgV1RDUCgweDcwNzM3YWQ5LCAweDNkMjUzNDc5KSwKKyAgICBXVENQKDB4NzA1MzY3NzEsIDB4M2Q2MDBkMmMpLCBXVENQKDB4NzAzMzM1M2QsIDB4M2Q5YWQ1MGIpLAorICAgIFdUQ1AoMHg3MDEyZTQ0NywgMHgzZGQ1OGMwNiksIFdUQ1AoMHg2ZmYyNzQ5NywgMHgzZTEwMzIwZCksCisgICAgV1RDUCgweDZmZDFlNjM1LCAweDNlNGFjNzExKSwgV1RDUCgweDZmYjEzOTJjLCAweDNlODU0YjAxKSwKKyAgICBXVENQKDB4NmY5MDZkODQsIDB4M2ViZmJkY2QpLCBXVENQKDB4NmY2ZjgzNDYsIDB4M2VmYTFmNjUpLAorICAgIFdUQ1AoMHg2ZjRlN2E3YiwgMHgzZjM0NmZiOCksIFdUQ1AoMHg2ZjJkNTMyYywgMHgzZjZlYWViOCksCisgICAgV1RDUCgweDZmMGMwZDYyLCAweDNmYThkYzU0KSwgV1RDUCgweDZlZWFhOTI3LCAweDNmZTJmODdjKSwKKyAgICBXVENQKDB4NmVjOTI2ODMsIDB4NDAxZDAzMjEpLCBXVENQKDB4NmVhNzg1N2YsIDB4NDA1NmZjMzEpLAorICAgIFdUQ1AoMHg2ZTg1YzYyNiwgMHg0MDkwZTM5ZSksIFdUQ1AoMHg2ZTYzZTg3ZiwgMHg0MGNhYjk1OCksCisgICAgV1RDUCgweDZlNDFlYzk1LCAweDQxMDQ3ZDRlKSwgV1RDUCgweDZlMWZkMjcxLCAweDQxM2UyZjcxKSwKKyAgICBXVENQKDB4NmRmZDlhMWMsIDB4NDE3N2NmYjEpLCBXVENQKDB4NmRkYjQzOWYsIDB4NDFiMTVkZmUpLAorICAgIFdUQ1AoMHg2ZGI4Y2YwNCwgMHg0MWVhZGE0OSksIFdUQ1AoMHg2ZDk2M2M1NCwgMHg0MjI0NDQ4MSksCisgICAgV1RDUCgweDZkNzM4Yjk5LCAweDQyNWQ5Yzk3KSwgV1RDUCgweDZkNTBiY2RjLCAweDQyOTZlMjdiKSwKKyAgICBXVENQKDB4NmQyZGQwMjcsIDB4NDJkMDE2MWUpLCBXVENQKDB4NmQwYWM1ODQsIDB4NDMwOTM3NzApLAorICAgIFdUQ1AoMHg2Y2U3OWNmYywgMHg0MzQyNDY2MSksIFdUQ1AoMHg2Y2M0NTY5OCwgMHg0MzdiNDJlMSksCisgICAgV1RDUCgweDZjYTBmMjYyLCAweDQzYjQyY2UxKSwgV1RDUCgweDZjN2Q3MDY1LCAweDQzZWQwNDUyKSwKKyAgICBXVENQKDB4NmM1OWQwYTksIDB4NDQyNWM5MjMpLCBXVENQKDB4NmMzNjEzMzksIDB4NDQ1ZTdiNDYpLAorICAgIFdUQ1AoMHg2YzEyMzgxZSwgMHg0NDk3MWFhYSksIFdUQ1AoMHg2YmVlM2Y2MiwgMHg0NGNmYTc0MCksCisgICAgV1RDUCgweDZiY2EyOTEwLCAweDQ1MDgyMGY4KSwgV1RDUCgweDZiYTVmNTMwLCAweDQ1NDA4N2M0KSwKKyAgICBXVENQKDB4NmI4MWEzY2QsIDB4NDU3OGRiOTMpLCBXVENQKDB4NmI1ZDM0ZjEsIDB4NDViMTFjNTcpLAorICAgIFdUQ1AoMHg2YjM4YThhNiwgMHg0NWU5NDlmZiksIFdUQ1AoMHg2YjEzZmVmNSwgMHg0NjIxNjQ3ZCksCisgICAgV1RDUCgweDZhZWYzN2U5LCAweDQ2NTk2YmMxKSwgV1RDUCgweDZhY2E1MzhjLCAweDQ2OTE1ZmJiKSwKKyAgICBXVENQKDB4NmFhNTUxZTksIDB4NDZjOTQwNWMpLCBXVENQKDB4NmE4MDMzMDgsIDB4NDcwMTBkOTYpLAorICAgIFdUQ1AoMHg2YTVhZjZmNSwgMHg0NzM4Yzc1OCksIFdUQ1AoMHg2YTM1OWRiOSwgMHg0NzcwNmQ5MyksCisgICAgV1RDUCgweDZhMTAyNzYwLCAweDQ3YTgwMDM5KSwgV1RDUCgweDY5ZWE5M2YyLCAweDQ3ZGY3ZjNhKSwKKyAgICBXVENQKDB4NjljNGUzN2EsIDB4NDgxNmVhODYpLCBXVENQKDB4Njk5ZjE2MDQsIDB4NDg0ZTQyMGYpLAorICAgIFdUQ1AoMHg2OTc5MmI5OCwgMHg0ODg1ODVjNSksIFdUQ1AoMHg2OTUzMjQ0MiwgMHg0OGJjYjU5OSksCisgICAgV1RDUCgweDY5MmQwMDBjLCAweDQ4ZjNkMTdjKSwgV1RDUCgweDY5MDZiZjAwLCAweDQ5MmFkOTVmKSwKKyAgICBXVENQKDB4NjhlMDYxMjksIDB4NDk2MWNkMzMpLCBXVENQKDB4NjhiOWU2OTIsIDB4NDk5OGFjZTkpLAorICAgIFdUQ1AoMHg2ODkzNGY0NCwgMHg0OWNmNzg3MSksIFdUQ1AoMHg2ODZjOWI0YiwgMHg0YTA2MmZiZCksCisgICAgV1RDUCgweDY4NDVjYWIxLCAweDRhM2NkMmJlKSwgV1RDUCgweDY4MWVkZDgxLCAweDRhNzM2MTY1KSwKKyAgICBXVENQKDB4NjdmN2QzYzUsIDB4NGFhOWRiYTIpLCBXVENQKDB4NjdkMGFkODgsIDB4NGFlMDQxNjcpLAorICAgIFdUQ1AoMHg2N2E5NmFkNSwgMHg0YjE2OTJhNSksIFdUQ1AoMHg2NzgyMGJiNywgMHg0YjRjY2Y0ZCksCisgICAgV1RDUCgweDY3NWE5MDM4LCAweDRiODJmNzUwKSwgV1RDUCgweDY3MzJmODYzLCAweDRiYjkwYWEwKSwKKyAgICBXVENQKDB4NjcwYjQ0NDQsIDB4NGJlZjA5MmQpLCBXVENQKDB4NjZlMzczZTQsIDB4NGMyNGYyZTkpLAorICAgIFdUQ1AoMHg2NmJiODc1MCwgMHg0YzVhYzdjNCksIFdUQ1AoMHg2NjkzN2U5MSwgMHg0YzkwODdiMSksCisgICAgV1RDUCgweDY2NmI1OWIzLCAweDRjYzYzMmEwKSwgV1RDUCgweDY2NDMxOGMwLCAweDRjZmJjODgzKSwKKyAgICBXVENQKDB4NjYxYWJiYzUsIDB4NGQzMTQ5NGIpLCBXVENQKDB4NjVmMjQyY2MsIDB4NGQ2NmI0ZTkpLAorICAgIFdUQ1AoMHg2NWM5YWRkZiwgMHg0ZDljMGI0ZiksIFdUQ1AoMHg2NWEwZmQwYiwgMHg0ZGQxNGM2ZSksCisgICAgV1RDUCgweDY1NzgzMDVhLCAweDRlMDY3ODM3KSwgV1RDUCgweDY1NGY0N2Q3LCAweDRlM2I4ZTlkKSwKKyAgICBXVENQKDB4NjUyNjQzOGYsIDB4NGU3MDhmOGYpLCBXVENQKDB4NjRmZDIzOGIsIDB4NGVhNTdiMDEpLAorICAgIFdUQ1AoMHg2NGQzZTdkNywgMHg0ZWRhNTBlMiksIFdUQ1AoMHg2NGFhOTA3ZiwgMHg0ZjBmMTEyNiksCisgICAgV1RDUCgweDY0ODExZDhlLCAweDRmNDNiYmJkKSwgV1RDUCgweDY0NTc4ZjBmLCAweDRmNzg1MDk5KSwKKyAgICBXVENQKDB4NjQyZGU1MGQsIDB4NGZhY2NmYWIpLCBXVENQKDB4NjQwNDFmOTUsIDB4NGZlMTM4ZTUpLAorICAgIFdUQ1AoMHg2M2RhM2ViMSwgMHg1MDE1OGMzOSksIFdUQ1AoMHg2M2IwNDI2ZCwgMHg1MDQ5Yzk5OSksCisgICAgV1RDUCgweDYzODYyYWQ1LCAweDUwN2RmMGY2KSwgV1RDUCgweDYzNWJmN2YzLCAweDUwYjIwMjQxKSwKKyAgICBXVENQKDB4NjMzMWE5ZDQsIDB4NTBlNWZkNmQpLCBXVENQKDB4NjMwNzQwODQsIDB4NTExOWUyNmIpLAorICAgIFdUQ1AoMHg2MmRjYmMwZCwgMHg1MTRkYjEyZCksIFdUQ1AoMHg2MmIyMWM3YiwgMHg1MTgxNjlhNSksCisgICAgV1RDUCgweDYyODc2MWRiLCAweDUxYjUwYmM0KSwgV1RDUCgweDYyNWM4YzM4LCAweDUxZTg5NzdkKSwKKyAgICBXVENQKDB4NjIzMTliOWQsIDB4NTIxYzBjYzIpLCBXVENQKDB4NjIwNjkwMTcsIDB4NTI0ZjZiODMpLAorICAgIFdUQ1AoMHg2MWRiNjliMSwgMHg1MjgyYjNiNCksIFdUQ1AoMHg2MWIwMjg3NiwgMHg1MmI1ZTU0NiksCisgICAgV1RDUCgweDYxODRjYzc0LCAweDUyZTkwMDJhKSwgV1RDUCgweDYxNTk1NWI2LCAweDUzMWMwNDU0KSwKKyAgICBXVENQKDB4NjEyZGM0NDcsIDB4NTM0ZWYxYjUpLCBXVENQKDB4NjEwMjE4MzQsIDB4NTM4MWM4M2YpLAorICAgIFdUQ1AoMHg2MGQ2NTE4OCwgMHg1M2I0ODdlNSksIFdUQ1AoMHg2MGFhNzA1MCwgMHg1M2U3MzA5NyksCisgICAgV1RDUCgweDYwN2U3NDk3LCAweDU0MTljMjQ5KSwgV1RDUCgweDYwNTI1ZTZiLCAweDU0NGMzY2VjKSwKKyAgICBXVENQKDB4NjAyNjJkZDYsIDB4NTQ3ZWEwNzMpLCBXVENQKDB4NWZmOWUyZTUsIDB4NTRiMGVjZDApLAorICAgIFdUQ1AoMHg1ZmNkN2RhNCwgMHg1NGUzMjFmNSksIFdUQ1AoMHg1ZmEwZmUxZiwgMHg1NTE1M2ZkNCksCisgICAgV1RDUCgweDVmNzQ2NDYyLCAweDU1NDc0NjYwKSwgV1RDUCgweDVmNDdiMDdhLCAweDU1NzkzNThiKSwKKyAgICBXVENQKDB4NWYxYWUyNzQsIDB4NTVhYjBkNDYpLCBXVENQKDB4NWVlZGZhNWEsIDB4NTVkY2NkODYpLAorICAgIFdUQ1AoMHg1ZWMwZjgzOSwgMHg1NjBlNzYzYiksIFdUQ1AoMHg1ZTkzZGMxZiwgMHg1NjQwMDc1OCksCisgICAgV1RDUCgweDVlNjZhNjE3LCAweDU2NzE4MGQwKSwgV1RDUCgweDVlMzk1NjJkLCAweDU2YTJlMjk1KSwKKyAgICBXVENQKDB4NWUwYmVjNmUsIDB4NTZkNDJjOTkpLCBXVENQKDB4NWRkZTY4ZTcsIDB4NTcwNTVlZDApLAorICAgIFdUQ1AoMHg1ZGIwY2JhNCwgMHg1NzM2NzkyYiksIFdUQ1AoMHg1ZDgzMTRiMSwgMHg1NzY3N2I5ZCksCisgICAgV1RDUCgweDVkNTU0NDFiLCAweDU3OTg2NjE5KSwgV1RDUCgweDVkMjc1OWVlLCAweDU3YzkzODkxKSwKKyAgICBXVENQKDB4NWNmOTU2MzgsIDB4NTdmOWYyZjgpLCBXVENQKDB4NWNjYjM5MDUsIDB4NTgyYTk1NDApLAorICAgIFdUQ1AoMHg1YzlkMDI2MCwgMHg1ODViMWY1YyksIFdUQ1AoMHg1YzZlYjI1OCwgMHg1ODhiOTE0MCksCisgICAgV1RDUCgweDVjNDA0OGY5LCAweDU4YmJlYWRkKSwgV1RDUCgweDVjMTFjNjRmLCAweDU4ZWMyYzI2KSwKKyAgICBXVENQKDB4NWJlMzJhNjcsIDB4NTkxYzU1MGUpLCBXVENQKDB4NWJiNDc1NGUsIDB4NTk0YzY1ODgpLAorICAgIFdUQ1AoMHg1Yjg1YTcxMSwgMHg1OTdjNWQ4NyksIFdUQ1AoMHg1YjU2YmZiZCwgMHg1OWFjM2NmZCksCisgICAgV1RDUCgweDViMjdiZjVlLCAweDU5ZGMwM2RlKSwgV1RDUCgweDVhZjhhNjAyLCAweDVhMGJiMjFjKSwKKyAgICBXVENQKDB4NWFjOTczYjUsIDB4NWEzYjQ3YWIpLCBXVENQKDB4NWE5YTI4ODQsIDB4NWE2YWM0N2MpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c5NjBbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmZkMzEsIDB4MDAxYWNlZWEpLCBXVENQKDB4N2ZmZmU2YmMsIDB4MDA1MDZjYjkpLAorICAgIFdUQ1AoMHg3ZmZmYjlkMSwgMHgwMDg2MGE3OSksIFdUQ1AoMHg3ZmZmNzY3MSwgMHgwMGJiYTgyMiksCisgICAgV1RDUCgweDdmZmYxYzliLCAweDAwZjE0NWFiKSwgV1RDUCgweDdmZmVhYzUwLCAweDAxMjZlMzA5KSwKKyAgICBXVENQKDB4N2ZmZTI1OTAsIDB4MDE1YzgwMzMpLCBXVENQKDB4N2ZmZDg4NWEsIDB4MDE5MjFkMjApLAorICAgIFdUQ1AoMHg3ZmZjZDRiMCwgMHgwMWM3YjljNiksIFdUQ1AoMHg3ZmZjMGE5MSwgMHgwMWZkNTYxZCksCisgICAgV1RDUCgweDdmZmIyOWZkLCAweDAyMzJmMjFhKSwgV1RDUCgweDdmZmEzMmY0LCAweDAyNjg4ZGI0KSwKKyAgICBXVENQKDB4N2ZmOTI1NzcsIDB4MDI5ZTI4ZTIpLCBXVENQKDB4N2ZmODAxODYsIDB4MDJkM2MzOWIpLAorICAgIFdUQ1AoMHg3ZmY2YzcyMCwgMHgwMzA5NWRkNSksIFdUQ1AoMHg3ZmY1NzY0NywgMHgwMzNlZjc4NiksCisgICAgV1RDUCgweDdmZjQwZWZhLCAweDAzNzQ5MGE1KSwgV1RDUCgweDdmZjI5MTNhLCAweDAzYWEyOTJhKSwKKyAgICBXVENQKDB4N2ZmMGZkMDcsIDB4MDNkZmMxMDkpLCBXVENQKDB4N2ZlZjUyNjAsIDB4MDQxNTU4M2IpLAorICAgIFdUQ1AoMHg3ZmVkOTE0OCwgMHgwNDRhZWViNSksIFdUQ1AoMHg3ZmViYjliZCwgMHgwNDgwODQ2ZSksCisgICAgV1RDUCgweDdmZTljYmMwLCAweDA0YjYxOTVkKSwgV1RDUCgweDdmZTdjNzUyLCAweDA0ZWJhZDc5KSwKKyAgICBXVENQKDB4N2ZlNWFjNzIsIDB4MDUyMTQwYjcpLCBXVENQKDB4N2ZlMzdiMjIsIDB4MDU1NmQzMGYpLAorICAgIFdUQ1AoMHg3ZmUxMzM2MSwgMHgwNThjNjQ3OCksIFdUQ1AoMHg3ZmRlZDUzMCwgMHgwNWMxZjRlNyksCisgICAgV1RDUCgweDdmZGM2MDhmLCAweDA1Zjc4NDUzKSwgV1RDUCgweDdmZDlkNTdmLCAweDA2MmQxMmI0KSwKKyAgICBXVENQKDB4N2ZkNzM0MDEsIDB4MDY2MjlmZmUpLCBXVENQKDB4N2ZkNDdjMTQsIDB4MDY5ODJjMmIpLAorICAgIFdUQ1AoMHg3ZmQxYWRiOSwgMHgwNmNkYjcyZiksIFdUQ1AoMHg3ZmNlYzhmMSwgMHgwNzAzNDEwMSksCisgICAgV1RDUCgweDdmY2JjZGJjLCAweDA3MzhjOTk4KSwgV1RDUCgweDdmYzhiYzFiLCAweDA3NmU1MGViKSwKKyAgICBXVENQKDB4N2ZjNTk0MGUsIDB4MDdhM2Q2ZjApLCBXVENQKDB4N2ZjMjU1OTYsIDB4MDdkOTViOWUpLAorICAgIFdUQ1AoMHg3ZmJmMDBiMywgMHgwODBlZGVlYyksIFdUQ1AoMHg3ZmJiOTU2NywgMHgwODQ0NjBjZiksCisgICAgV1RDUCgweDdmYjgxM2IwLCAweDA4NzllMTQwKSwgV1RDUCgweDdmYjQ3YjkxLCAweDA4YWY2MDMzKSwKKyAgICBXVENQKDB4N2ZiMGNkMGEsIDB4MDhlNGRkYTApLCBXVENQKDB4N2ZhZDA4MWIsIDB4MDkxYTU5N2UpLAorICAgIFdUQ1AoMHg3ZmE5MmNjNSwgMHgwOTRmZDNjMyksIFdUQ1AoMHg3ZmE1M2IwOSwgMHgwOTg1NGM2NiksCisgICAgV1RDUCgweDdmYTEzMmU4LCAweDA5YmFjMzVkKSwgV1RDUCgweDdmOWQxNDYxLCAweDA5ZjAzODlmKSwKKyAgICBXVENQKDB4N2Y5OGRmNzcsIDB4MGEyNWFjMjMpLCBXVENQKDB4N2Y5NDk0MjksIDB4MGE1YjFkZGUpLAorICAgIFdUQ1AoMHg3ZjkwMzI3OSwgMHgwYTkwOGRjOSksIFdUQ1AoMHg3ZjhiYmE2NiwgMHgwYWM1ZmJkOSksCisgICAgV1RDUCgweDdmODcyYmYzLCAweDBhZmI2ODA1KSwgV1RDUCgweDdmODI4NzFmLCAweDBiMzBkMjQ0KSwKKyAgICBXVENQKDB4N2Y3ZGNiZWMsIDB4MGI2NjNhOGMpLCBXVENQKDB4N2Y3OGZhNWIsIDB4MGI5YmEwZDUpLAorICAgIFdUQ1AoMHg3Zjc0MTI2YiwgMHgwYmQxMDUxMyksIFdUQ1AoMHg3ZjZmMTQxZiwgMHgwYzA2Njc0MCksCisgICAgV1RDUCgweDdmNjlmZjc2LCAweDBjM2JjNzRmKSwgV1RDUCgweDdmNjRkNDczLCAweDBjNzEyNTNhKSwKKyAgICBXVENQKDB4N2Y1ZjkzMTUsIDB4MGNhNjgwZjUpLCBXVENQKDB4N2Y1YTNiNWUsIDB4MGNkYmRhNzkpLAorICAgIFdUQ1AoMHg3ZjU0Y2Q0ZiwgMHgwZDExMzFiYSksIFdUQ1AoMHg3ZjRmNDhlOCwgMHgwZDQ2ODZiMSksCisgICAgV1RDUCgweDdmNDlhZTJhLCAweDBkN2JkOTU0KSwgV1RDUCgweDdmNDNmZDE4LCAweDBkYjEyOTk5KSwKKyAgICBXVENQKDB4N2YzZTM1YjAsIDB4MGRlNjc3NzYpLCBXVENQKDB4N2YzODU3ZjYsIDB4MGUxYmMyZTQpLAorICAgIFdUQ1AoMHg3ZjMyNjNlOSwgMHgwZTUxMGJkOCksIFdUQ1AoMHg3ZjJjNTk4YSwgMHgwZTg2NTI0OCksCisgICAgV1RDUCgweDdmMjYzOGRiLCAweDBlYmI5NjJjKSwgV1RDUCgweDdmMjAwMWRkLCAweDBlZjBkNzdiKSwKKyAgICBXVENQKDB4N2YxOWI0OTEsIDB4MGYyNjE2MmEpLCBXVENQKDB4N2YxMzUwZjgsIDB4MGY1YjUyMzEpLAorICAgIFdUQ1AoMHg3ZjBjZDcxMiwgMHgwZjkwOGI4NiksIFdUQ1AoMHg3ZjA2NDZlMiwgMHgwZmM1YzIyMCksCisgICAgV1RDUCgweDdlZmZhMDY5LCAweDBmZmFmNWY2KSwgV1RDUCgweDdlZjhlM2E2LCAweDEwMzAyNmZlKSwKKyAgICBXVENQKDB4N2VmMjEwOWQsIDB4MTA2NTU1MmUpLCBXVENQKDB4N2VlYjI3NGQsIDB4MTA5YTgwN2UpLAorICAgIFdUQ1AoMHg3ZWU0MjdiOSwgMHgxMGNmYThlNSksIFdUQ1AoMHg3ZWRkMTFlMSwgMHgxMTA0Y2U1OCksCisgICAgV1RDUCgweDdlZDVlNWM2LCAweDExMzlmMGNmKSwgV1RDUCgweDdlY2VhMzZiLCAweDExNmYxMDQwKSwKKyAgICBXVENQKDB4N2VjNzRhY2YsIDB4MTFhNDJjYTIpLCBXVENQKDB4N2ViZmRiZjUsIDB4MTFkOTQ1ZWIpLAorICAgIFdUQ1AoMHg3ZWI4NTZkZSwgMHgxMjBlNWMxMyksIFdUQ1AoMHg3ZWIwYmI4YSwgMHgxMjQzNmYxMCksCisgICAgV1RDUCgweDdlYTkwOWZjLCAweDEyNzg3ZWQ4KSwgV1RDUCgweDdlYTE0MjM1LCAweDEyYWQ4YjYzKSwKKyAgICBXVENQKDB4N2U5OTY0MzYsIDB4MTJlMjk0YTcpLCBXVENQKDB4N2U5MTcwMDAsIDB4MTMxNzlhOWIpLAorICAgIFdUQ1AoMHg3ZTg5NjU5NSwgMHgxMzRjOWQzNCksIFdUQ1AoMHg3ZTgxNDRmNiwgMHgxMzgxOWM2YyksCisgICAgV1RDUCgweDdlNzkwZTI1LCAweDEzYjY5ODM2KSwgV1RDUCgweDdlNzBjMTI0LCAweDEzZWI5MDhjKSwKKyAgICBXVENQKDB4N2U2ODVkZjIsIDB4MTQyMDg1NjMpLCBXVENQKDB4N2U1ZmU0OTMsIDB4MTQ1NTc2YjEpLAorICAgIFdUQ1AoMHg3ZTU3NTUwOCwgMHgxNDhhNjQ2ZSksIFdUQ1AoMHg3ZTRlYWY1MSwgMHgxNGJmNGU5MSksCisgICAgV1RDUCgweDdlNDVmMzcxLCAweDE0ZjQzNTEwKSwgV1RDUCgweDdlM2QyMTY5LCAweDE1MjkxN2UxKSwKKyAgICBXVENQKDB4N2UzNDM5M2IsIDB4MTU1ZGY2ZmMpLCBXVENQKDB4N2UyYjNhZTgsIDB4MTU5MmQyNTcpLAorICAgIFdUQ1AoMHg3ZTIyMjY3MiwgMHgxNWM3YTllYSksIFdUQ1AoMHg3ZTE4ZmJkYSwgMHgxNWZjN2RhYSksCisgICAgV1RDUCgweDdlMGZiYjIyLCAweDE2MzE0ZDhlKSwgV1RDUCgweDdlMDY2NDRjLCAweDE2NjYxOThkKSwKKyAgICBXVENQKDB4N2RmY2Y3NTksIDB4MTY5YWUxOWYpLCBXVENQKDB4N2RmMzc0NGIsIDB4MTZjZmE1YjkpLAorICAgIFdUQ1AoMHg3ZGU5ZGIyMywgMHgxNzA0NjVkMiksIFdUQ1AoMHg3ZGUwMmJlNCwgMHgxNzM5MjFlMiksCisgICAgV1RDUCgweDdkZDY2NjhmLCAweDE3NmRkOWRlKSwgV1RDUCgweDdkY2M4YjI1LCAweDE3YTI4ZGJlKSwKKyAgICBXVENQKDB4N2RjMjk5YTksIDB4MTdkNzNkNzkpLCBXVENQKDB4N2RiODkyMWMsIDB4MTgwYmU5MDQpLAorICAgIFdUQ1AoMHg3ZGFlNzQ3ZiwgMHgxODQwOTA1OCksIFdUQ1AoMHg3ZGE0NDBkNiwgMHgxODc1MzM2YSksCisgICAgV1RDUCgweDdkOTlmNzIxLCAweDE4YTlkMjMxKSwgV1RDUCgweDdkOGY5NzYyLCAweDE4ZGU2Y2E1KSwKKyAgICBXVENQKDB4N2Q4NTIxOWMsIDB4MTkxMzAyYmMpLCBXVENQKDB4N2Q3YTk1Y2YsIDB4MTk0Nzk0NmMpLAorICAgIFdUQ1AoMHg3ZDZmZjNmZSwgMHgxOTdjMjFhZCksIFdUQ1AoMHg3ZDY1M2MyYiwgMHgxOWIwYWE3NSksCisgICAgV1RDUCgweDdkNWE2ZTU3LCAweDE5ZTUyZWJiKSwgV1RDUCgweDdkNGY4YTg1LCAweDFhMTlhZTc2KSwKKyAgICBXVENQKDB4N2Q0NDkwYjYsIDB4MWE0ZTI5OWQpLCBXVENQKDB4N2QzOTgwZWMsIDB4MWE4MmEwMjYpLAorICAgIFdUQ1AoMHg3ZDJlNWIyYSwgMHgxYWI3MTIwOCksIFdUQ1AoMHg3ZDIzMWY3MCwgMHgxYWViN2YzYSksCisgICAgV1RDUCgweDdkMTdjZGMyLCAweDFiMWZlN2IzKSwgV1RDUCgweDdkMGM2NjIxLCAweDFiNTQ0YjZhKSwKKyAgICBXVENQKDB4N2QwMGU4OGYsIDB4MWI4OGFhNTUpLCBXVENQKDB4N2NmNTU1MGUsIDB4MWJiZDA0NmMpLAorICAgIFdUQ1AoMHg3Y2U5YWJhMSwgMHgxYmYxNTlhNCksIFdUQ1AoMHg3Y2RkZWM0OCwgMHgxYzI1YTlmNiksCisgICAgV1RDUCgweDdjZDIxNzA3LCAweDFjNTlmNTU3KSwgV1RDUCgweDdjYzYyYmRmLCAweDFjOGUzYmJlKSwKKyAgICBXVENQKDB4N2NiYTJhZDMsIDB4MWNjMjdkMjMpLCBXVENQKDB4N2NhZTEzZTQsIDB4MWNmNmI5N2MpLAorICAgIFdUQ1AoMHg3Y2ExZTcxNSwgMHgxZDJhZjBjMSksIFdUQ1AoMHg3Yzk1YTQ2NywgMHgxZDVmMjJlNyksCisgICAgV1RDUCgweDdjODk0YmRlLCAweDFkOTM0ZmU1KSwgV1RDUCgweDdjN2NkZDdiLCAweDFkYzc3N2IzKSwKKyAgICBXVENQKDB4N2M3MDU5NDAsIDB4MWRmYjlhNDgpLCBXVENQKDB4N2M2M2JmMmYsIDB4MWUyZmI3OWEpLAorICAgIFdUQ1AoMHg3YzU3MGY0YiwgMHgxZTYzY2ZhMCksIFdUQ1AoMHg3YzRhNDk5NiwgMHgxZTk3ZTI1MSksCisgICAgV1RDUCgweDdjM2Q2ZTEzLCAweDFlY2JlZmE0KSwgV1RDUCgweDdjMzA3Y2MyLCAweDFlZmZmNzhmKSwKKyAgICBXVENQKDB4N2MyMzc1YTgsIDB4MWYzM2ZhMGEpLCBXVENQKDB4N2MxNjU4YzUsIDB4MWY2N2Y3MGIpLAorICAgIFdUQ1AoMHg3YzA5MjYxZCwgMHgxZjliZWU4YSksIFdUQ1AoMHg3YmZiZGRiMSwgMHgxZmNmZTA3ZCksCisgICAgV1RDUCgweDdiZWU3Zjg1LCAweDIwMDNjY2RiKSwgV1RDUCgweDdiZTEwYjk5LCAweDIwMzdiMzliKSwKKyAgICBXVENQKDB4N2JkMzgxZjEsIDB4MjA2Yjk0YjQpLCBXVENQKDB4N2JjNWUyOTAsIDB4MjA5ZjcwMWMpLAorICAgIFdUQ1AoMHg3YmI4MmQ3NiwgMHgyMGQzNDVjYyksIFdUQ1AoMHg3YmFhNjJhOCwgMHgyMTA3MTViOCksCisgICAgV1RDUCgweDdiOWM4MjI2LCAweDIxM2FkZmRhKSwgV1RDUCgweDdiOGU4YmY1LCAweDIxNmVhNDI2KSwKKyAgICBXVENQKDB4N2I4MDgwMTUsIDB4MjFhMjYyOTUpLCBXVENQKDB4N2I3MjVlOGEsIDB4MjFkNjFiMWUpLAorICAgIFdUQ1AoMHg3YjY0Mjc1NiwgMHgyMjA5Y2RiNiksIFdUQ1AoMHg3YjU1ZGE3YywgMHgyMjNkN2E1NSksCisgICAgV1RDUCgweDdiNDc3N2ZlLCAweDIyNzEyMGYzKSwgV1RDUCgweDdiMzhmZmRlLCAweDIyYTRjMTg1KSwKKyAgICBXVENQKDB4N2IyYTcyMWYsIDB4MjJkODVjMDQpLCBXVENQKDB4N2IxYmNlYzQsIDB4MjMwYmYwNjUpLAorICAgIFdUQ1AoMHg3YjBkMTVkMCwgMHgyMzNmN2VhMCksIFdUQ1AoMHg3YWZlNDc0NCwgMHgyMzczMDZhYiksCisgICAgV1RDUCgweDdhZWY2MzIzLCAweDIzYTY4ODdmKSwgV1RDUCgweDdhZTA2OTcxLCAweDIzZGEwNDExKSwKKyAgICBXVENQKDB4N2FkMTVhMmYsIDB4MjQwZDc5NTgpLCBXVENQKDB4N2FjMjM1NjEsIDB4MjQ0MGU4NGQpLAorICAgIFdUQ1AoMHg3YWIyZmIwOSwgMHgyNDc0NTBlNCksIFdUQ1AoMHg3YWEzYWIyOSwgMHgyNGE3YjMxNyksCisgICAgV1RDUCgweDdhOTQ0NWM1LCAweDI0ZGIwZWRiKSwgV1RDUCgweDdhODRjYWRlLCAweDI1MGU2NDI3KSwKKyAgICBXVENQKDB4N2E3NTNhNzksIDB4MjU0MWIyZjMpLCBXVENQKDB4N2E2NTk0OTYsIDB4MjU3NGZiMzYpLAorICAgIFdUQ1AoMHg3YTU1ZDkzYSwgMHgyNWE4M2NlNiksIFdUQ1AoMHg3YTQ2MDg2NywgMHgyNWRiNzdmYSksCisgICAgV1RDUCgweDdhMzYyMjIwLCAweDI2MGVhYzZhKSwgV1RDUCgweDdhMjYyNjY4LCAweDI2NDFkYTJkKSwKKyAgICBXVENQKDB4N2ExNjE1NDAsIDB4MjY3NTAxMzkpLCBXVENQKDB4N2EwNWVlYWQsIDB4MjZhODIxODYpLAorICAgIFdUQ1AoMHg3OWY1YjJiMSwgMHgyNmRiM2IwYSksIFdUQ1AoMHg3OWU1NjE0ZiwgMHgyNzBlNGRiZCksCisgICAgV1RDUCgweDc5ZDRmYTg5LCAweDI3NDE1OTk2KSwgV1RDUCgweDc5YzQ3ZTYzLCAweDI3NzQ1ZThjKSwKKyAgICBXVENQKDB4NzliM2VjZTAsIDB4MjdhNzVjOTUpLCBXVENQKDB4NzlhMzQ2MDIsIDB4MjdkYTUzYTkpLAorICAgIFdUQ1AoMHg3OTkyODljYywgMHgyODBkNDNiZiksIFdUQ1AoMHg3OTgxYjg0MSwgMHgyODQwMmNjZSksCisgICAgV1RDUCgweDc5NzBkMTY1LCAweDI4NzMwZWNkKSwgV1RDUCgweDc5NWZkNTNhLCAweDI4YTVlOWI0KSwKKyAgICBXVENQKDB4Nzk0ZWMzYzMsIDB4MjhkOGJkNzgpLCBXVENQKDB4NzkzZDlkMDMsIDB4MjkwYjhhMTIpLAorICAgIFdUQ1AoMHg3OTJjNjBmZSwgMHgyOTNlNGY3OCksIFdUQ1AoMHg3OTFiMGZiNSwgMHgyOTcxMGRhMSksCisgICAgV1RDUCgweDc5MDlhOTJkLCAweDI5YTNjNDg1KSwgV1RDUCgweDc4ZjgyZDY4LCAweDI5ZDY3NDFiKSwKKyAgICBXVENQKDB4NzhlNjljNjksIDB4MmEwOTFjNTkpLCBXVENQKDB4NzhkNGY2MzQsIDB4MmEzYmJkMzcpLAorICAgIFdUQ1AoMHg3OGMzM2FjYiwgMHgyYTZlNTZhYyksIFdUQ1AoMHg3OGIxNmEzMiwgMHgyYWEwZThiMCksCisgICAgV1RDUCgweDc4OWY4NDZiLCAweDJhZDM3MzM4KSwgV1RDUCgweDc4OGQ4OTdiLCAweDJiMDVmNjNkKSwKKyAgICBXVENQKDB4Nzg3Yjc5NjMsIDB4MmIzODcxYjUpLCBXVENQKDB4Nzg2OTU0MjgsIDB4MmI2YWU1OTgpLAorICAgIFdUQ1AoMHg3ODU3MTljYywgMHgyYjlkNTFkZCksIFdUQ1AoMHg3ODQ0Y2E1MywgMHgyYmNmYjY3YiksCisgICAgV1RDUCgweDc4MzI2NWMwLCAweDJjMDIxMzY5KSwgV1RDUCgweDc4MWZlYzE1LCAweDJjMzQ2ODllKSwKKyAgICBXVENQKDB4NzgwZDVkNTcsIDB4MmM2NmI2MTEpLCBXVENQKDB4NzdmYWI5ODksIDB4MmM5OGZiYmEpLAorICAgIFdUQ1AoMHg3N2U4MDBhZCwgMHgyY2NiMzk5MCksIFdUQ1AoMHg3N2Q1MzJjNywgMHgyY2ZkNmY4YSksCisgICAgV1RDUCgweDc3YzI0ZmRiLCAweDJkMmY5ZDlmKSwgV1RDUCgweDc3YWY1N2ViLCAweDJkNjFjM2M3KSwKKyAgICBXVENQKDB4Nzc5YzRhZmMsIDB4MmQ5M2UxZjgpLCBXVENQKDB4Nzc4OTI5MTAsIDB4MmRjNWY4MjkpLAorICAgIFdUQ1AoMHg3Nzc1ZjIyYSwgMHgyZGY4MDY1MyksIFdUQ1AoMHg3NzYyYTY0ZiwgMHgyZTJhMGM2YyksCisgICAgV1RDUCgweDc3NGY0NTgxLCAweDJlNWMwYTZiKSwgV1RDUCgweDc3M2JjZmM0LCAweDJlOGUwMDQ4KSwKKyAgICBXVENQKDB4NzcyODQ1MWMsIDB4MmViZmVkZmEpLCBXVENQKDB4NzcxNGE1OGIsIDB4MmVmMWQzNzcpLAorICAgIFdUQ1AoMHg3NzAwZjExNSwgMHgyZjIzYjBiOSksIFdUQ1AoMHg3NmVkMjdiZSwgMHgyZjU1ODViNSksCisgICAgV1RDUCgweDc2ZDk0OTg5LCAweDJmODc1MjYyKSwgV1RDUCgweDc2YzU1Njc5LCAweDJmYjkxNmI5KSwKKyAgICBXVENQKDB4NzZiMTRlOTMsIDB4MmZlYWQyYjApLCBXVENQKDB4NzY5ZDMxZDksIDB4MzAxYzg2M2YpLAorICAgIFdUQ1AoMHg3Njg5MDA1MCwgMHgzMDRlMzE1ZCksIFdUQ1AoMHg3Njc0YjlmYSwgMHgzMDdmZDQwMSksCisgICAgV1RDUCgweDc2NjA1ZWRiLCAweDMwYjE2ZTIzKSwgV1RDUCgweDc2NGJlZWY4LCAweDMwZTJmZmI5KSwKKyAgICBXVENQKDB4NzYzNzZhNTIsIDB4MzExNDg4YmMpLCBXVENQKDB4NzYyMmQwZWYsIDB4MzE0NjA5MjIpLAorICAgIFdUQ1AoMHg3NjBlMjJkMSwgMHgzMTc3ODBlMiksIFdUQ1AoMHg3NWY5NWZmYywgMHgzMWE4ZWZmNSksCisgICAgV1RDUCgweDc1ZTQ4ODc0LCAweDMxZGE1NjUxKSwgV1RDUCgweDc1Y2Y5YzNkLCAweDMyMGJiM2VlKSwKKyAgICBXVENQKDB4NzViYTliNWEsIDB4MzIzZDA4YzMpLCBXVENQKDB4NzVhNTg1Y2YsIDB4MzI2ZTU0YzcpLAorICAgIFdUQ1AoMHg3NTkwNWJhMCwgMHgzMjlmOTdmMyksIFdUQ1AoMHg3NTdiMWNjZiwgMHgzMmQwZDIzYyksCisgICAgV1RDUCgweDc1NjVjOTYyLCAweDMzMDIwMzliKSwgV1RDUCgweDc1NTA2MTVjLCAweDMzMzMyYzA2KSwKKyAgICBXVENQKDB4NzUzYWU0YzAsIDB4MzM2NDRiNzYpLCBXVENQKDB4NzUyNTUzOTIsIDB4MzM5NTYxZTEpLAorICAgIFdUQ1AoMHg3NTBmYWRkNywgMHgzM2M2NmY0MCksIFdUQ1AoMHg3NGY5ZjM5MSwgMHgzM2Y3NzM4OCksCisgICAgV1RDUCgweDc0ZTQyNGM1LCAweDM0Mjg2ZWIzKSwgV1RDUCgweDc0Y2U0MTc3LCAweDM0NTk2MGI3KSwKKyAgICBXVENQKDB4NzRiODQ5YWEsIDB4MzQ4YTQ5OGIpLCBXVENQKDB4NzRhMjNkNjIsIDB4MzRiYjI5MjcpLAorICAgIFdUQ1AoMHg3NDhjMWNhNCwgMHgzNGViZmY4MyksIFdUQ1AoMHg3NDc1ZTc3MiwgMHgzNTFjY2M5NiksCisgICAgV1RDUCgweDc0NWY5ZGQxLCAweDM1NGQ5MDU3KSwgV1RDUCgweDc0NDkzZmM1LCAweDM1N2U0YWJlKSwKKyAgICBXVENQKDB4NzQzMmNkNTEsIDB4MzVhZWZiYzIpLCBXVENQKDB4NzQxYzQ2N2IsIDB4MzVkZmEzNWEpLAorICAgIFdUQ1AoMHg3NDA1YWI0NSwgMHgzNjEwNDE3ZiksIFdUQ1AoMHg3M2VlZmJiMywgMHgzNjQwZDYyNyksCisgICAgV1RDUCgweDczZDgzN2NhLCAweDM2NzE2MTRiKSwgV1RDUCgweDczYzE1ZjhkLCAweDM2YTFlMmUwKSwKKyAgICBXVENQKDB4NzNhYTczMDEsIDB4MzZkMjVhZTApLCBXVENQKDB4NzM5MzcyMmEsIDB4MzcwMmM5NDIpLAorICAgIFdUQ1AoMHg3MzdjNWQwYiwgMHgzNzMzMmRmZCksIFdUQ1AoMHg3MzY1MzNhOSwgMHgzNzYzODkwOCksCisgICAgV1RDUCgweDczNGRmNjA3LCAweDM3OTNkYTViKSwgV1RDUCgweDczMzZhNDJiLCAweDM3YzQyMWVlKSwKKyAgICBXVENQKDB4NzMxZjNlMTcsIDB4MzdmNDVmYjcpLCBXVENQKDB4NzMwN2MzZDAsIDB4MzgyNDkzYjApLAorICAgIFdUQ1AoMHg3MmYwMzU1YSwgMHgzODU0YmRjZiksIFdUQ1AoMHg3MmQ4OTJiYSwgMHgzODg0ZGUwYiksCisgICAgV1RDUCgweDcyYzBkYmYzLCAweDM4YjRmNDVkKSwgV1RDUCgweDcyYTkxMTA5LCAweDM4ZTUwMGJjKSwKKyAgICBXVENQKDB4NzI5MTMyMDEsIDB4MzkxNTAzMWYpLCBXVENQKDB4NzI3OTNlZGYsIDB4Mzk0NGZiN2UpLAorICAgIFdUQ1AoMHg3MjYxMzdhOCwgMHgzOTc0ZTlkMCksIFdUQ1AoMHg3MjQ5MWM1ZSwgMHgzOWE0Y2UwZSksCisgICAgV1RDUCgweDcyMzBlZDA3LCAweDM5ZDRhODJmKSwgV1RDUCgweDcyMThhOWE3LCAweDNhMDQ3ODJhKSwKKyAgICBXVENQKDB4NzIwMDUyNDIsIDB4M2EzNDNkZjcpLCBXVENQKDB4NzFlN2U2ZGMsIDB4M2E2M2Y5OGQpLAorICAgIFdUQ1AoMHg3MWNmNjc3YSwgMHgzYTkzYWFlNSksIFdUQ1AoMHg3MWI2ZDQyMCwgMHgzYWMzNTFmNiksCisgICAgV1RDUCgweDcxOWUyY2QyLCAweDNhZjJlZWI3KSwgV1RDUCgweDcxODU3MTk1LCAweDNiMjI4MTIwKSwKKyAgICBXVENQKDB4NzE2Y2EyNmMsIDB4M2I1MjA5MmEpLCBXVENQKDB4NzE1M2JmNWQsIDB4M2I4MTg2Y2EpLAorICAgIFdUQ1AoMHg3MTNhYzg2YiwgMHgzYmIwZjlmYSksIFdUQ1AoMHg3MTIxYmQ5YywgMHgzYmUwNjJiMCksCisgICAgV1RDUCgweDcxMDg5ZWYyLCAweDNjMGZjMGU2KSwgV1RDUCgweDcwZWY2Yzc0LCAweDNjM2YxNDkxKSwKKyAgICBXVENQKDB4NzBkNjI2MjUsIDB4M2M2ZTVkYWEpLCBXVENQKDB4NzBiY2NjMDksIDB4M2M5ZDljMjgpLAorICAgIFdUQ1AoMHg3MGEzNWUyNSwgMHgzY2NjZDAwNCksIFdUQ1AoMHg3MDg5ZGM3ZSwgMHgzY2ZiZjkzNSksCisgICAgV1RDUCgweDcwNzA0NzE4LCAweDNkMmIxN2IzKSwgV1RDUCgweDcwNTY5ZGY4LCAweDNkNWEyYjc1KSwKKyAgICBXVENQKDB4NzAzY2UxMjIsIDB4M2Q4OTM0NzQpLCBXVENQKDB4NzAyMzEwOWEsIDB4M2RiODMyYTYpLAorICAgIFdUQ1AoMHg3MDA5MmM2NSwgMHgzZGU3MjYwNCksIFdUQ1AoMHg2ZmVmMzQ4OCwgMHgzZTE2MGU4NSksCisgICAgV1RDUCgweDZmZDUyOTA3LCAweDNlNDRlYzIyKSwgV1RDUCgweDZmYmIwOWU3LCAweDNlNzNiZWQyKSwKKyAgICBXVENQKDB4NmZhMGQ3MmMsIDB4M2VhMjg2OGMpLCBXVENQKDB4NmY4NjkwZGIsIDB4M2VkMTQzNDkpLAorICAgIFdUQ1AoMHg2ZjZjMzZmOCwgMHgzZWZmZjUwMSksIFdUQ1AoMHg2ZjUxYzk4OSwgMHgzZjJlOWJhYiksCisgICAgV1RDUCgweDZmMzc0ODkxLCAweDNmNWQzNzNlKSwgV1RDUCgweDZmMWNiNDE2LCAweDNmOGJjN2I0KSwKKyAgICBXVENQKDB4NmYwMjBjMWMsIDB4M2ZiYTRkMDMpLCBXVENQKDB4NmVlNzUwYTgsIDB4M2ZlOGM3MjQpLAorICAgIFdUQ1AoMHg2ZWNjODFiZSwgMHg0MDE3MzYwZSksIFdUQ1AoMHg2ZWIxOWY2NCwgMHg0MDQ1OTliOSksCisgICAgV1RDUCgweDZlOTZhOTlkLCAweDQwNzNmMjFkKSwgV1RDUCgweDZlN2JhMDZmLCAweDQwYTIzZjMyKSwKKyAgICBXVENQKDB4NmU2MDgzZGUsIDB4NDBkMDgwZjApLCBXVENQKDB4NmU0NTUzZWYsIDB4NDBmZWI3NGYpLAorICAgIFdUQ1AoMHg2ZTJhMTBhOCwgMHg0MTJjZTI0NiksIFdUQ1AoMHg2ZTBlYmEwYywgMHg0MTViMDFjZSksCisgICAgV1RDUCgweDZkZjM1MDIwLCAweDQxODkxNWRlKSwgV1RDUCgweDZkZDdkMmVhLCAweDQxYjcxZTZmKSwKKyAgICBXVENQKDB4NmRiYzQyNmUsIDB4NDFlNTFiNzcpLCBXVENQKDB4NmRhMDllYjEsIDB4NDIxMzBjZjApLAorICAgIFdUQ1AoMHg2ZDg0ZTdiNywgMHg0MjQwZjJkMSksIFdUQ1AoMHg2ZDY5MWQ4NywgMHg0MjZlY2QxMiksCisgICAgV1RDUCgweDZkNGQ0MDIzLCAweDQyOWM5YmFiKSwgV1RDUCgweDZkMzE0ZjkzLCAweDQyY2E1ZTk0KSwKKyAgICBXVENQKDB4NmQxNTRiZDksIDB4NDJmODE1YzUpLCBXVENQKDB4NmNmOTM0ZmMsIDB4NDMyNWMxMzUpLAorICAgIFdUQ1AoMHg2Y2RkMGIwMCwgMHg0MzUzNjBkZSksIFdUQ1AoMHg2Y2MwY2RlYSwgMHg0MzgwZjRiNyksCisgICAgV1RDUCgweDZjYTQ3ZGJmLCAweDQzYWU3Y2I3KSwgV1RDUCgweDZjODgxYTg0LCAweDQzZGJmOGQ3KSwKKyAgICBXVENQKDB4NmM2YmE0M2UsIDB4NDQwOTY5MTApLCBXVENQKDB4NmM0ZjFhZjIsIDB4NDQzNmNkNTgpLAorICAgIFdUQ1AoMHg2YzMyN2VhNiwgMHg0NDY0MjVhOCksIFdUQ1AoMHg2YzE1Y2Y1ZCwgMHg0NDkxNzFmOCksCisgICAgV1RDUCgweDZiZjkwZDFkLCAweDQ0YmViMjQwKSwgV1RDUCgweDZiZGMzN2ViLCAweDQ0ZWJlNjc5KSwKKyAgICBXVENQKDB4NmJiZjRmY2QsIDB4NDUxOTBlOTkpLCBXVENQKDB4NmJhMjU0YzcsIDB4NDU0NjJhOWEpLAorICAgIFdUQ1AoMHg2Yjg1NDZkZSwgMHg0NTczM2E3MyksIFdUQ1AoMHg2YjY4MjYxNywgMHg0NWEwM2UxZCksCisgICAgV1RDUCgweDZiNGFmMjc5LCAweDQ1Y2QzNThmKSwgV1RDUCgweDZiMmRhYzA2LCAweDQ1ZmEyMGMyKSwKKyAgICBXVENQKDB4NmIxMDUyYzYsIDB4NDYyNmZmYWUpLCBXVENQKDB4NmFmMmU2YmMsIDB4NDY1M2QyNGIpLAorICAgIFdUQ1AoMHg2YWQ1NjdlZiwgMHg0NjgwOTg5MSksIFdUQ1AoMHg2YWI3ZDY2MywgMHg0NmFkNTI3OCksCisgICAgV1RDUCgweDZhOWEzMjFkLCAweDQ2ZDlmZmY4KSwgV1RDUCgweDZhN2M3YjIzLCAweDQ3MDZhMTBhKSwKKyAgICBXVENQKDB4NmE1ZWIxN2EsIDB4NDczMzM1YTUpLCBXVENQKDB4NmE0MGQ1MjcsIDB4NDc1ZmJkYzMpLAorICAgIFdUQ1AoMHg2YTIyZTYzMCwgMHg0NzhjMzk1YSksIFdUQ1AoMHg2YTA0ZTQ5OSwgMHg0N2I4YTg2NCksCisgICAgV1RDUCgweDY5ZTZkMDY3LCAweDQ3ZTUwYWQ4KSwgV1RDUCgweDY5YzhhOWExLCAweDQ4MTE2MGFlKSwKKyAgICBXVENQKDB4NjlhYTcwNGMsIDB4NDgzZGE5ZTApLCBXVENQKDB4Njk4YzI0NmMsIDB4NDg2OWU2NjUpLAorICAgIFdUQ1AoMHg2OTZkYzYwNywgMHg0ODk2MTYzNSksIFdUQ1AoMHg2OTRmNTUyMywgMHg0OGMyMzk0OSksCisgICAgV1RDUCgweDY5MzBkMWM0LCAweDQ4ZWU0Zjk4KSwgV1RDUCgweDY5MTIzYmYxLCAweDQ5MWE1OTFjKSwKKyAgICBXVENQKDB4NjhmMzkzYWUsIDB4NDk0NjU1Y2MpLCBXVENQKDB4NjhkNGQ5MDAsIDB4NDk3MjQ1YTEpLAorICAgIFdUQ1AoMHg2OGI2MGJlZSwgMHg0OTllMjg5MiksIFdUQ1AoMHg2ODk3MmM3ZCwgMHg0OWM5ZmU5OSksCisgICAgV1RDUCgweDY4NzgzYWIxLCAweDQ5ZjVjN2FlKSwgV1RDUCgweDY4NTkzNjkxLCAweDRhMjE4M2M4KSwKKyAgICBXVENQKDB4NjgzYTIwMjIsIDB4NGE0ZDMyZTEpLCBXVENQKDB4NjgxYWY3NmEsIDB4NGE3OGQ0ZjApLAorICAgIFdUQ1AoMHg2N2ZiYmM2ZCwgMHg0YWE0NjllZSksIFdUQ1AoMHg2N2RjNmYzMSwgMHg0YWNmZjFkMyksCisgICAgV1RDUCgweDY3YmQwZmJkLCAweDRhZmI2Yzk4KSwgV1RDUCgweDY3OWQ5ZTE0LCAweDRiMjZkYTM1KSwKKyAgICBXVENQKDB4Njc3ZTFhM2UsIDB4NGI1MjNhYTIpLCBXVENQKDB4Njc1ZTg0M2UsIDB4NGI3ZDhkZDgpLAorICAgIFdUQ1AoMHg2NzNlZGMxYywgMHg0YmE4ZDNjZiksIFdUQ1AoMHg2NzFmMjFkYywgMHg0YmQ0MGM4MCksCisgICAgV1RDUCgweDY2ZmY1NTg0LCAweDRiZmYzN2UyKSwgV1RDUCgweDY2ZGY3NzFhLCAweDRjMmE1NWVmKSwKKyAgICBXVENQKDB4NjZiZjg2YTMsIDB4NGM1NTY2OWYpLCBXVENQKDB4NjY5Zjg0MjUsIDB4NGM4MDY5ZWEpLAorICAgIFdUQ1AoMHg2NjdmNmZhNSwgMHg0Y2FiNWZjOSksIFdUQ1AoMHg2NjVmNDkyOSwgMHg0Y2Q2NDgzNCksCisgICAgV1RDUCgweDY2M2YxMGI3LCAweDRkMDEyMzI0KSwgV1RDUCgweDY2MWVjNjU0LCAweDRkMmJmMDkxKSwKKyAgICBXVENQKDB4NjVmZTZhMDYsIDB4NGQ1NmIwNzMpLCBXVENQKDB4NjVkZGZiZDMsIDB4NGQ4MTYyYzQpLAorICAgIFdUQ1AoMHg2NWJkN2JjMCwgMHg0ZGFjMDc3YiksIFdUQ1AoMHg2NTljZTlkNCwgMHg0ZGQ2OWU5MiksCisgICAgV1RDUCgweDY1N2M0NjEzLCAweDRlMDEyODAwKSwgV1RDUCgweDY1NWI5MDgzLCAweDRlMmJhM2JlKSwKKyAgICBXVENQKDB4NjUzYWM5MmIsIDB4NGU1NjExYzUpLCBXVENQKDB4NjUxOWYwMTAsIDB4NGU4MDcyMGUpLAorICAgIFdUQ1AoMHg2NGY5MDUzOCwgMHg0ZWFhYzQ5MCksIFdUQ1AoMHg2NGQ4MDhhOCwgMHg0ZWQ1MDk0NSksCisgICAgV1RDUCgweDY0YjZmYTY2LCAweDRlZmY0MDI1KSwgV1RDUCgweDY0OTVkYTc5LCAweDRmMjk2OTI4KSwKKyAgICBXVENQKDB4NjQ3NGE4ZTUsIDB4NGY1Mzg0NDgpLCBXVENQKDB4NjQ1MzY1YjIsIDB4NGY3ZDkxN2MpLAorICAgIFdUQ1AoMHg2NDMyMTBlNCwgMHg0ZmE3OTBiZSksIFdUQ1AoMHg2NDEwYWE4MSwgMHg0ZmQxODIwNiksCisgICAgV1RDUCgweDYzZWYzMjkwLCAweDRmZmI2NTRkKSwgV1RDUCgweDYzY2RhOTE2LCAweDUwMjUzYThiKSwKKyAgICBXVENQKDB4NjNhYzBlMTksIDB4NTA0ZjAxYmEpLCBXVENQKDB4NjM4YTYxOWUsIDB4NTA3OGJhZDEpLAorICAgIFdUQ1AoMHg2MzY4YTNhZCwgMHg1MGEyNjVjOSksIFdUQ1AoMHg2MzQ2ZDQ0YiwgMHg1MGNjMDI5YyksCisgICAgV1RDUCgweDYzMjRmMzdkLCAweDUwZjU5MTQxKSwgV1RDUCgweDYzMDMwMTRhLCAweDUxMWYxMWIyKSwKKyAgICBXVENQKDB4NjJlMGZkYjgsIDB4NTE0ODgzZTcpLCBXVENQKDB4NjJiZWU4Y2MsIDB4NTE3MWU3ZDkpLAorICAgIFdUQ1AoMHg2MjljYzI4YywgMHg1MTliM2Q4MCksIFdUQ1AoMHg2MjdhOGIwMCwgMHg1MWM0ODRkNiksCisgICAgV1RDUCgweDYyNTg0MjJjLCAweDUxZWRiZGQ0KSwgV1RDUCgweDYyMzVlODE2LCAweDUyMTZlODcxKSwKKyAgICBXVENQKDB4NjIxMzdjYzUsIDB4NTI0MDA0YTcpLCBXVENQKDB4NjFmMTAwM2YsIDB4NTI2OTEyNmUpLAorICAgIFdUQ1AoMHg2MWNlNzI4OSwgMHg1MjkyMTFjMCksIFdUQ1AoMHg2MWFiZDNhYiwgMHg1MmJiMDI5NSksCisgICAgV1RDUCgweDYxODkyM2E5LCAweDUyZTNlNGU2KSwgV1RDUCgweDYxNjY2Mjg5LCAweDUzMGNiOGFjKSwKKyAgICBXVENQKDB4NjE0MzkwNTMsIDB4NTMzNTdkZGYpLCBXVENQKDB4NjEyMGFkMGQsIDB4NTM1ZTM0NzkpLAorICAgIFdUQ1AoMHg2MGZkYjhiYiwgMHg1Mzg2ZGM3MiksIFdUQ1AoMHg2MGRhYjM2NSwgMHg1M2FmNzVjMyksCisgICAgV1RDUCgweDYwYjc5ZDEwLCAweDUzZDgwMDY1KSwgV1RDUCgweDYwOTQ3NWMzLCAweDU0MDA3YzUxKSwKKyAgICBXVENQKDB4NjA3MTNkODQsIDB4NTQyOGU5ODApLCBXVENQKDB4NjA0ZGY0NTksIDB4NTQ1MTQ3ZWIpLAorICAgIFdUQ1AoMHg2MDJhOWE0OCwgMHg1NDc5OTc4YSksIFdUQ1AoMHg2MDA3MmY1NywgMHg1NGExZDg1NyksCisgICAgV1RDUCgweDVmZTNiMzhkLCAweDU0Y2EwYTRiKSwgV1RDUCgweDVmYzAyNmYwLCAweDU0ZjIyZDVkKSwKKyAgICBXVENQKDB4NWY5Yzg5ODcsIDB4NTUxYTQxODkpLCBXVENQKDB4NWY3OGRiNTYsIDB4NTU0MjQ2YzYpLAorICAgIFdUQ1AoMHg1ZjU1MWM2NSwgMHg1NTZhM2QwZCksIFdUQ1AoMHg1ZjMxNGNiYSwgMHg1NTkyMjQ1NyksCisgICAgV1RDUCgweDVmMGQ2YzViLCAweDU1YjlmYzllKSwgV1RDUCgweDVlZTk3YjRmLCAweDU1ZTFjNWRhKSwKKyAgICBXVENQKDB4NWVjNTc5OWIsIDB4NTYwOTgwMDUpLCBXVENQKDB4NWVhMTY3NDcsIDB4NTYzMTJiMTcpLAorICAgIFdUQ1AoMHg1ZTdkNDQ1OCwgMHg1NjU4YzcwOSksIFdUQ1AoMHg1ZTU5MTBkNCwgMHg1NjgwNTNkNSksCisgICAgV1RDUCgweDVlMzRjY2MzLCAweDU2YTdkMTc0KSwgV1RDUCgweDVlMTA3ODJiLCAweDU2Y2YzZmRlKSwKKyAgICBXVENQKDB4NWRlYzEzMTEsIDB4NTZmNjlmMGQpLCBXVENQKDB4NWRjNzlkN2MsIDB4NTcxZGVlZmEpLAorICAgIFdUQ1AoMHg1ZGEzMTc3MywgMHg1NzQ1MmY5ZCksIFdUQ1AoMHg1ZDdlODBmYywgMHg1NzZjNjBmMSksCisgICAgV1RDUCgweDVkNTlkYTFlLCAweDU3OTM4MmVlKSwgV1RDUCgweDVkMzUyMmRlLCAweDU3YmE5NThkKSwKKyAgICBXVENQKDB4NWQxMDViNDQsIDB4NTdlMTk4YzcpLCBXVENQKDB4NWNlYjgzNTUsIDB4NTgwODhjOTYpLAorICAgIFdUQ1AoMHg1Y2M2OWIxOSwgMHg1ODJmNzBmMyksIFdUQ1AoMHg1Y2ExYTI5NSwgMHg1ODU2NDVkNyksCisgICAgV1RDUCgweDVjN2M5OWQxLCAweDU4N2QwYjNiKSwgV1RDUCgweDVjNTc4MGQzLCAweDU4YTNjMTE4KSwKKyAgICBXVENQKDB4NWMzMjU3YTAsIDB4NThjYTY3NjcpLCBXVENQKDB4NWMwZDFlNDEsIDB4NThmMGZlMjMpLAorICAgIFdUQ1AoMHg1YmU3ZDRiYSwgMHg1OTE3ODU0MyksIFdUQ1AoMHg1YmMyN2IxNCwgMHg1OTNkZmNjMiksCisgICAgV1RDUCgweDViOWQxMTU0LCAweDU5NjQ2NDk4KSwgV1RDUCgweDViNzc5NzgwLCAweDU5OGFiY2JlKSwKKyAgICBXVENQKDB4NWI1MjBkYTEsIDB4NTliMTA1MmYpLCBXVENQKDB4NWIyYzczYmIsIDB4NTlkNzNkZTMpLAorICAgIFdUQ1AoMHg1YjA2YzlkNiwgMHg1OWZkNjZkNCksIFdUQ1AoMHg1YWUxMGZmOSwgMHg1YTIzN2ZmYSksCisgICAgV1RDUCgweDVhYmI0NjI5LCAweDVhNDk4OTUwKSwgV1RDUCgweDVhOTU2YzZlLCAweDVhNmY4MmNlKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTAyNFtdID0geworICAgIFdUQ1AoMHg3ZmZmZmQ4OCwgMHgwMDE5MjFmYiksIFdUQ1AoMHg3ZmZmZTljYiwgMHgwMDRiNjVlZSksCisgICAgV1RDUCgweDdmZmZjMjUxLCAweDAwN2RhOWQ0KSwgV1RDUCgweDdmZmY4NzE5LCAweDAwYWZlZGE4KSwKKyAgICBXVENQKDB4N2ZmZjM4MjQsIDB4MDBlMjMxNjApLCBXVENQKDB4N2ZmZWQ1NzIsIDB4MDExNDc0ZjYpLAorICAgIFdUQ1AoMHg3ZmZlNWYwMywgMHgwMTQ2Yjg2MCksIFdUQ1AoMHg3ZmZkZDRkNywgMHgwMTc4ZmI5OSksCisgICAgV1RDUCgweDdmZmQzNmVlLCAweDAxYWIzZTk3KSwgV1RDUCgweDdmZmM4NTQ5LCAweDAxZGQ4MTU0KSwKKyAgICBXVENQKDB4N2ZmYmJmZTYsIDB4MDIwZmMzYzYpLCBXVENQKDB4N2ZmYWU2YzcsIDB4MDI0MjA1ZTgpLAorICAgIFdUQ1AoMHg3ZmY5ZjllYywgMHgwMjc0NDdiMCksIFdUQ1AoMHg3ZmY4Zjk1NCwgMHgwMmE2ODkxNyksCisgICAgV1RDUCgweDdmZjdlNTAwLCAweDAyZDhjYTE2KSwgV1RDUCgweDdmZjZiY2YwLCAweDAzMGIwYWE0KSwKKyAgICBXVENQKDB4N2ZmNTgxMjUsIDB4MDMzZDRhYmIpLCBXVENQKDB4N2ZmNDMxOWQsIDB4MDM2ZjhhNTEpLAorICAgIFdUQ1AoMHg3ZmYyY2U1YiwgMHgwM2ExYzk2MCksIFdUQ1AoMHg3ZmYxNTc1ZCwgMHgwM2Q0MDdkZiksCisgICAgV1RDUCgweDdmZWZjY2E0LCAweDA0MDY0NWM3KSwgV1RDUCgweDdmZWUyZTMwLCAweDA0Mzg4MzEwKSwKKyAgICBXVENQKDB4N2ZlYzdjMDIsIDB4MDQ2YWJmYjMpLCBXVENQKDB4N2ZlYWI2MWEsIDB4MDQ5Y2ZiYTcpLAorICAgIFdUQ1AoMHg3ZmU4ZGM3OCwgMHgwNGNmMzZlNSksIFdUQ1AoMHg3ZmU2ZWYxYywgMHgwNTAxNzE2NSksCisgICAgV1RDUCgweDdmZTRlZTA2LCAweDA1MzNhYjIwKSwgV1RDUCgweDdmZTJkOTM4LCAweDA1NjVlNDBkKSwKKyAgICBXVENQKDB4N2ZlMGIwYjEsIDB4MDU5ODFjMjYpLCBXVENQKDB4N2ZkZTc0NzEsIDB4MDVjYTUzNjEpLAorICAgIFdUQ1AoMHg3ZmRjMjQ3YSwgMHgwNWZjODliOCksIFdUQ1AoMHg3ZmQ5YzBjYSwgMHgwNjJlYmYyMiksCisgICAgV1RDUCgweDdmZDc0OTY0LCAweDA2NjBmMzk4KSwgV1RDUCgweDdmZDRiZTQ2LCAweDA2OTMyNzEzKSwKKyAgICBXVENQKDB4N2ZkMjFmNzIsIDB4MDZjNTU5OGEpLCBXVENQKDB4N2ZjZjZjZTgsIDB4MDZmNzhhZjYpLAorICAgIFdUQ1AoMHg3ZmNjYTZhNywgMHgwNzI5YmI0ZSksIFdUQ1AoMHg3ZmM5Y2NiMiwgMHgwNzViZWE4YyksCisgICAgV1RDUCgweDdmYzZkZjA4LCAweDA3OGUxOGE3KSwgV1RDUCgweDdmYzNkZGE5LCAweDA3YzA0NTk4KSwKKyAgICBXVENQKDB4N2ZjMGM4OTYsIDB4MDdmMjcxNTcpLCBXVENQKDB4N2ZiZDlmZDAsIDB4MDgyNDliZGQpLAorICAgIFdUQ1AoMHg3ZmJhNjM1NywgMHgwODU2YzUyMCksIFdUQ1AoMHg3ZmI3MTMyYiwgMHgwODg4ZWQxYiksCisgICAgV1RDUCgweDdmYjNhZjRlLCAweDA4YmIxM2M1KSwgV1RDUCgweDdmYjAzN2JmLCAweDA4ZWQzOTE2KSwKKyAgICBXVENQKDB4N2ZhY2FjN2YsIDB4MDkxZjVkMDYpLCBXVENQKDB4N2ZhOTBkOGUsIDB4MDk1MTdmOGYpLAorICAgIFdUQ1AoMHg3ZmE1NWFlZSwgMHgwOTgzYTBhNyksIFdUQ1AoMHg3ZmExOTQ5ZSwgMHgwOWI1YzA0OCksCisgICAgV1RDUCgweDdmOWRiYWEwLCAweDA5ZTdkZTZhKSwgV1RDUCgweDdmOTljY2Y0LCAweDBhMTlmYjA0KSwKKyAgICBXVENQKDB4N2Y5NWNiOWEsIDB4MGE0YzE2MTApLCBXVENQKDB4N2Y5MWI2OTQsIDB4MGE3ZTJmODUpLAorICAgIFdUQ1AoMHg3ZjhkOGRlMSwgMHgwYWIwNDc1YyksIFdUQ1AoMHg3Zjg5NTE4MiwgMHgwYWUyNWQ4ZCksCisgICAgV1RDUCgweDdmODUwMTc5LCAweDBiMTQ3MjExKSwgV1RDUCgweDdmODA5ZGM1LCAweDBiNDY4NGRmKSwKKyAgICBXVENQKDB4N2Y3YzI2NjgsIDB4MGI3ODk1ZjApLCBXVENQKDB4N2Y3NzliNjIsIDB4MGJhYWE1M2IpLAorICAgIFdUQ1AoMHg3ZjcyZmNiNCwgMHgwYmRjYjJiYiksIFdUQ1AoMHg3ZjZlNGE1ZSwgMHgwYzBlYmU2NiksCisgICAgV1RDUCgweDdmNjk4NDYxLCAweDBjNDBjODM1KSwgV1RDUCgweDdmNjRhYWJmLCAweDBjNzJkMDIwKSwKKyAgICBXVENQKDB4N2Y1ZmJkNzcsIDB4MGNhNGQ2MjApLCBXVENQKDB4N2Y1YWJjOGEsIDB4MGNkNmRhMmQpLAorICAgIFdUQ1AoMHg3ZjU1YTdmYSwgMHgwZDA4ZGMzZiksIFdUQ1AoMHg3ZjUwN2ZjNywgMHgwZDNhZGM0ZSksCisgICAgV1RDUCgweDdmNGI0M2YyLCAweDBkNmNkYTUzKSwgV1RDUCgweDdmNDVmNDdiLCAweDBkOWVkNjQ2KSwKKyAgICBXVENQKDB4N2Y0MDkxNjQsIDB4MGRkMGQwMWYpLCBXVENQKDB4N2YzYjFhYWQsIDB4MGUwMmM3ZDcpLAorICAgIFdUQ1AoMHg3ZjM1OTA1NywgMHgwZTM0YmQ2NiksIFdUQ1AoMHg3ZjJmZjI2MywgMHgwZTY2YjBjMyksCisgICAgV1RDUCgweDdmMmE0MGQyLCAweDBlOThhMWU5KSwgV1RDUCgweDdmMjQ3YmE1LCAweDBlY2E5MGNlKSwKKyAgICBXVENQKDB4N2YxZWEyZGMsIDB4MGVmYzdkNmIpLCBXVENQKDB4N2YxOGI2NzksIDB4MGYyZTY3YjgpLAorICAgIFdUQ1AoMHg3ZjEyYjY3YywgMHgwZjYwNGZhZiksIFdUQ1AoMHg3ZjBjYTJlNywgMHgwZjkyMzU0NiksCisgICAgV1RDUCgweDdmMDY3YmJhLCAweDBmYzQxODc2KSwgV1RDUCgweDdmMDA0MGY2LCAweDBmZjVmOTM4KSwKKyAgICBXVENQKDB4N2VmOWYyOWQsIDB4MTAyN2Q3ODQpLCBXVENQKDB4N2VmMzkwYWUsIDB4MTA1OWIzNTIpLAorICAgIFdUQ1AoMHg3ZWVkMWIyYywgMHgxMDhiOGM5YiksIFdUQ1AoMHg3ZWU2OTIxNywgMHgxMGJkNjM1NiksCisgICAgV1RDUCgweDdlZGZmNTcwLCAweDEwZWYzNzdkKSwgV1RDUCgweDdlZDk0NTM4LCAweDExMjEwOTA3KSwKKyAgICBXVENQKDB4N2VkMjgxNzEsIDB4MTE1MmQ3ZWQpLCBXVENQKDB4N2VjYmFhMWEsIDB4MTE4NGE0MjcpLAorICAgIFdUQ1AoMHg3ZWM0YmYzNiwgMHgxMWI2NmRhZCksIFdUQ1AoMHg3ZWJkYzBjNiwgMHgxMWU4MzQ3OCksCisgICAgV1RDUCgweDdlYjZhZWNhLCAweDEyMTlmODgwKSwgV1RDUCgweDdlYWY4OTQzLCAweDEyNGJiOWJlKSwKKyAgICBXVENQKDB4N2VhODUwMzMsIDB4MTI3ZDc4MjkpLCBXVENQKDB4N2VhMTAzOWIsIDB4MTJhZjMzYmEpLAorICAgIFdUQ1AoMHg3ZTk5YTM3YywgMHgxMmUwZWM2YSksIFdUQ1AoMHg3ZTkyMmZkNiwgMHgxMzEyYTIzMCksCisgICAgV1RDUCgweDdlOGFhOGFjLCAweDEzNDQ1NTA1KSwgV1RDUCgweDdlODMwZGZmLCAweDEzNzYwNGUyKSwKKyAgICBXVENQKDB4N2U3YjVmY2UsIDB4MTNhN2IxYmYpLCBXVENQKDB4N2U3MzllMWQsIDB4MTNkOTViOTMpLAorICAgIFdUQ1AoMHg3ZTZiYzhlYiwgMHgxNDBiMDI1OCksIFdUQ1AoMHg3ZTYzZTAzYiwgMHgxNDNjYTYwNSksCisgICAgV1RDUCgweDdlNWJlNDBjLCAweDE0NmU0Njk0KSwgV1RDUCgweDdlNTNkNDYyLCAweDE0OWZlM2ZjKSwKKyAgICBXVENQKDB4N2U0YmIxM2MsIDB4MTRkMTdlMzYpLCBXVENQKDB4N2U0MzdhOWMsIDB4MTUwMzE1M2EpLAorICAgIFdUQ1AoMHg3ZTNiMzA4MywgMHgxNTM0YTkwMSksIFdUQ1AoMHg3ZTMyZDJmNCwgMHgxNTY2Mzk4MiksCisgICAgV1RDUCgweDdlMmE2MWVkLCAweDE1OTdjNmI3KSwgV1RDUCgweDdlMjFkZDczLCAweDE1Yzk1MDk3KSwKKyAgICBXVENQKDB4N2UxOTQ1ODQsIDB4MTVmYWQ3MWIpLCBXVENQKDB4N2UxMDlhMjQsIDB4MTYyYzVhM2IpLAorICAgIFdUQ1AoMHg3ZTA3ZGI1MiwgMHgxNjVkZDlmMCksIFdUQ1AoMHg3ZGZmMDkxMSwgMHgxNjhmNTYzMiksCisgICAgV1RDUCgweDdkZjYyMzYyLCAweDE2YzBjZWY5KSwgV1RDUCgweDdkZWQyYTQ3LCAweDE2ZjI0NDNlKSwKKyAgICBXVENQKDB4N2RlNDFkYzAsIDB4MTcyM2I1ZjkpLCBXVENQKDB4N2RkYWZkY2UsIDB4MTc1NTI0MjIpLAorICAgIFdUQ1AoMHg3ZGQxY2E3NSwgMHgxNzg2OGViMyksIFdUQ1AoMHg3ZGM4ODNiNCwgMHgxN2I3ZjVhMyksCisgICAgV1RDUCgweDdkYmYyOThkLCAweDE3ZTk1OGVhKSwgV1RDUCgweDdkYjViYzAyLCAweDE4MWFiODgxKSwKKyAgICBXVENQKDB4N2RhYzNiMTUsIDB4MTg0YzE0NjEpLCBXVENQKDB4N2RhMmE2YzYsIDB4MTg3ZDZjODIpLAorICAgIFdUQ1AoMHg3ZDk4ZmYxNywgMHgxOGFlYzBkYiksIFdUQ1AoMHg3ZDhmNDQwOSwgMHgxOGUwMTE2NyksCisgICAgV1RDUCgweDdkODU3NTlmLCAweDE5MTE1ZTFjKSwgV1RDUCgweDdkN2I5M2RhLCAweDE5NDJhNmYzKSwKKyAgICBXVENQKDB4N2Q3MTllYmEsIDB4MTk3M2ViZTYpLCBXVENQKDB4N2Q2Nzk2NDIsIDB4MTlhNTJjZWIpLAorICAgIFdUQ1AoMHg3ZDVkN2E3NCwgMHgxOWQ2NjlmYyksIFdUQ1AoMHg3ZDUzNGI1MCwgMHgxYTA3YTMxMSksCisgICAgV1RDUCgweDdkNDkwOGQ5LCAweDFhMzhkODIzKSwgV1RDUCgweDdkM2ViMzBmLCAweDFhNmEwOTI5KSwKKyAgICBXVENQKDB4N2QzNDQ5ZjUsIDB4MWE5YjM2MWQpLCBXVENQKDB4N2QyOWNkOGMsIDB4MWFjYzVlZjYpLAorICAgIFdUQ1AoMHg3ZDFmM2RkNiwgMHgxYWZkODNhZCksIFdUQ1AoMHg3ZDE0OWFkNSwgMHgxYjJlYTQzYSksCisgICAgV1RDUCgweDdkMDllNDg5LCAweDFiNWZjMDk3KSwgV1RDUCgweDdjZmYxYWY1LCAweDFiOTBkOGJiKSwKKyAgICBXVENQKDB4N2NmNDNlMWEsIDB4MWJjMWVjOWUpLCBXVENQKDB4N2NlOTRkZmIsIDB4MWJmMmZjM2EpLAorICAgIFdUQ1AoMHg3Y2RlNGE5OCwgMHgxYzI0MDc4NiksIFdUQ1AoMHg3Y2QzMzNmMywgMHgxYzU1MGU3YyksCisgICAgV1RDUCgweDdjYzgwYTBmLCAweDFjODYxMTEzKSwgV1RDUCgweDdjYmNjY2VjLCAweDFjYjcwZjQzKSwKKyAgICBXVENQKDB4N2NiMTdjOGQsIDB4MWNlODA5MDYpLCBXVENQKDB4N2NhNjE4ZjMsIDB4MWQxOGZlNTQpLAorICAgIFdUQ1AoMHg3YzlhYTIyMSwgMHgxZDQ5ZWYyNiksIFdUQ1AoMHg3YzhmMTgxNywgMHgxZDdhZGI3MyksCisgICAgV1RDUCgweDdjODM3YWQ4LCAweDFkYWJjMzM0KSwgV1RDUCgweDdjNzdjYTY1LCAweDFkZGNhNjYyKSwKKyAgICBXVENQKDB4N2M2YzA2YzAsIDB4MWUwZDg0ZjUpLCBXVENQKDB4N2M2MDJmZWMsIDB4MWUzZTVlZTUpLAorICAgIFdUQ1AoMHg3YzU0NDVlOSwgMHgxZTZmMzQyYyksIFdUQ1AoMHg3YzQ4NDhiYSwgMHgxZWEwMDRjMSksCisgICAgV1RDUCgweDdjM2MzODYwLCAweDFlZDBkMDlkKSwgV1RDUCgweDdjMzAxNGRlLCAweDFmMDE5N2I4KSwKKyAgICBXVENQKDB4N2MyM2RlMzUsIDB4MWYzMjVhMGIpLCBXVENQKDB4N2MxNzk0NjcsIDB4MWY2MzE3OGYpLAorICAgIFdUQ1AoMHg3YzBiMzc3NywgMHgxZjkzZDAzYyksIFdUQ1AoMHg3YmZlYzc2NSwgMHgxZmM0ODQwYSksCisgICAgV1RDUCgweDdiZjI0NDM0LCAweDFmZjUzMmYyKSwgV1RDUCgweDdiZTVhZGU2LCAweDIwMjVkY2VjKSwKKyAgICBXVENQKDB4N2JkOTA0N2MsIDB4MjA1NjgxZjEpLCBXVENQKDB4N2JjYzQ3ZmEsIDB4MjA4NzIxZjkpLAorICAgIFdUQ1AoMHg3YmJmNzg2MCwgMHgyMGI3YmNmZSksIFdUQ1AoMHg3YmIyOTViMCwgMHgyMGU4NTJmNiksCisgICAgV1RDUCgweDdiYTU5ZmVlLCAweDIxMThlM2RjKSwgV1RDUCgweDdiOTg5NzE5LCAweDIxNDk2ZmE3KSwKKyAgICBXVENQKDB4N2I4YjdiMzYsIDB4MjE3OWY2NGYpLCBXVENQKDB4N2I3ZTRjNDUsIDB4MjFhYTc3Y2YpLAorICAgIFdUQ1AoMHg3YjcxMGE0OSwgMHgyMWRhZjQxZCksIFdUQ1AoMHg3YjYzYjU0MywgMHgyMjBiNmIzMiksCisgICAgV1RDUCgweDdiNTY0ZDM2LCAweDIyM2JkZDA4KSwgV1RDUCgweDdiNDhkMjI1LCAweDIyNmM0OTk2KSwKKyAgICBXVENQKDB4N2IzYjQ0MTAsIDB4MjI5Y2IwZDUpLCBXVENQKDB4N2IyZGEyZmEsIDB4MjJjZDEyYmQpLAorICAgIFdUQ1AoMHg3YjFmZWVlNSwgMHgyMmZkNmY0OCksIFdUQ1AoMHg3YjEyMjdkMywgMHgyMzJkYzY2ZCksCisgICAgV1RDUCgweDdiMDQ0ZGM3LCAweDIzNWUxODI2KSwgV1RDUCgweDdhZjY2MGMyLCAweDIzOGU2NDZhKSwKKyAgICBXVENQKDB4N2FlODYwYzcsIDB4MjNiZWFiMzMpLCBXVENQKDB4N2FkYTRkZDgsIDB4MjNlZWVjNzgpLAorICAgIFdUQ1AoMHg3YWNjMjdmNywgMHgyNDFmMjgzMyksIFdUQ1AoMHg3YWJkZWYyNSwgMHgyNDRmNWU1YyksCisgICAgV1RDUCgweDdhYWZhMzY3LCAweDI0N2Y4ZWVjKSwgV1RDUCgweDdhYTE0NGJjLCAweDI0YWZiOWRhKSwKKyAgICBXVENQKDB4N2E5MmQzMjksIDB4MjRkZmRmMjApLCBXVENQKDB4N2E4NDRlYWUsIDB4MjUwZmZlYjcpLAorICAgIFdUQ1AoMHg3YTc1Yjc0ZiwgMHgyNTQwMTg5NiksIFdUQ1AoMHg3YTY3MGQwZCwgMHgyNTcwMmNiNyksCisgICAgV1RDUCgweDdhNTg0ZmViLCAweDI1YTAzYjExKSwgV1RDUCgweDdhNDk3ZmViLCAweDI1ZDA0MzlmKSwKKyAgICBXVENQKDB4N2EzYTlkMGYsIDB4MjYwMDQ2NTcpLCBXVENQKDB4N2EyYmE3NWEsIDB4MjYzMDQzMzMpLAorICAgIFdUQ1AoMHg3YTFjOWVjZSwgMHgyNjYwM2EyYyksIFdUQ1AoMHg3YTBkODM2ZCwgMHgyNjkwMmIzOSksCisgICAgV1RDUCgweDc5ZmU1NTM5LCAweDI2YzAxNjU1KSwgV1RDUCgweDc5ZWYxNDM2LCAweDI2ZWZmYjc2KSwKKyAgICBXVENQKDB4NzlkZmMwNjQsIDB4MjcxZmRhOTYpLCBXVENQKDB4NzlkMDU5YzgsIDB4Mjc0ZmIzYWUpLAorICAgIFdUQ1AoMHg3OWMwZTA2MiwgMHgyNzdmODZiNSksIFdUQ1AoMHg3OWIxNTQzNSwgMHgyN2FmNTNhNiksCisgICAgV1RDUCgweDc5YTFiNTQ1LCAweDI3ZGYxYTc3KSwgV1RDUCgweDc5OTIwMzkyLCAweDI4MGVkYjIzKSwKKyAgICBXVENQKDB4Nzk4MjNmMjAsIDB4MjgzZTk1YTEpLCBXVENQKDB4Nzk3MjY3ZjIsIDB4Mjg2ZTQ5ZWEpLAorICAgIFdUQ1AoMHg3OTYyN2UwOCwgMHgyODlkZjdmOCksIFdUQ1AoMHg3OTUyODE2NywgMHgyOGNkOWZjMSksCisgICAgV1RDUCgweDc5NDI3MjEwLCAweDI4ZmQ0MTQwKSwgV1RDUCgweDc5MzI1MDA2LCAweDI5MmNkYzZkKSwKKyAgICBXVENQKDB4NzkyMjFiNGIsIDB4Mjk1YzcxNDApLCBXVENQKDB4NzkxMWQzZTIsIDB4Mjk4YmZmYjIpLAorICAgIFdUQ1AoMHg3OTAxNzljZCwgMHgyOWJiODdiYyksIFdUQ1AoMHg3OGYxMGQwZiwgMHgyOWViMDk1NyksCisgICAgV1RDUCgweDc4ZTA4ZGFiLCAweDJhMWE4NDdiKSwgV1RDUCgweDc4Y2ZmYmEzLCAweDJhNDlmOTIwKSwKKyAgICBXVENQKDB4NzhiZjU2ZjksIDB4MmE3OTY3NDApLCBXVENQKDB4NzhhZTlmYjAsIDB4MmFhOGNlZDMpLAorICAgIFdUQ1AoMHg3ODlkZDVjYiwgMHgyYWQ4MmZkMiksIFdUQ1AoMHg3ODhjZjk0YywgMHgyYjA3OGEzNiksCisgICAgV1RDUCgweDc4N2MwYTM2LCAweDJiMzZkZGY3KSwgV1RDUCgweDc4NmIwODhjLCAweDJiNjYyYjBlKSwKKyAgICBXVENQKDB4Nzg1OWY0NGYsIDB4MmI5NTcxNzMpLCBXVENQKDB4Nzg0OGNkODMsIDB4MmJjNGIxMjApLAorICAgIFdUQ1AoMHg3ODM3OTQyYiwgMHgyYmYzZWEwZCksIFdUQ1AoMHg3ODI2NDg0OSwgMHgyYzIzMWMzMyksCisgICAgV1RDUCgweDc4MTRlOWRmLCAweDJjNTI0NzhhKSwgV1RDUCgweDc4MDM3OGYxLCAweDJjODE2YzBjKSwKKyAgICBXVENQKDB4NzdmMWY1ODEsIDB4MmNiMDg5YjEpLCBXVENQKDB4NzdlMDVmOTEsIDB4MmNkZmEwNzEpLAorICAgIFdUQ1AoMHg3N2NlYjcyNSwgMHgyZDBlYjA0NiksIFdUQ1AoMHg3N2JjZmMzZiwgMHgyZDNkYjkyOCksCisgICAgV1RDUCgweDc3YWIyZWUyLCAweDJkNmNiYjEwKSwgV1RDUCgweDc3OTk0ZjExLCAweDJkOWJiNWY2KSwKKyAgICBXVENQKDB4Nzc4NzVjY2UsIDB4MmRjYWE5ZDUpLCBXVENQKDB4Nzc3NTU4MWQsIDB4MmRmOTk2YTMpLAorICAgIFdUQ1AoMHg3NzYzNDBmZiwgMHgyZTI4N2M1YSksIFdUQ1AoMHg3NzUxMTc3OCwgMHgyZTU3NWFmMyksCisgICAgV1RDUCgweDc3M2VkYjhiLCAweDJlODYzMjY3KSwgV1RDUCgweDc3MmM4ZDNhLCAweDJlYjUwMmFlKSwKKyAgICBXVENQKDB4NzcxYTJjODgsIDB4MmVlM2NiYzEpLCBXVENQKDB4NzcwN2I5NzksIDB4MmYxMjhkOTkpLAorICAgIFdUQ1AoMHg3NmY1MzQwZSwgMHgyZjQxNDgyZSksIFdUQ1AoMHg3NmUyOWM0YiwgMHgyZjZmZmI3YSksCisgICAgV1RDUCgweDc2Y2ZmMjMyLCAweDJmOWVhNzc1KSwgV1RDUCgweDc2YmQzNWM3LCAweDJmY2Q0YzE5KSwKKyAgICBXVENQKDB4NzZhYTY3MGQsIDB4MmZmYmU5NWQpLCBXVENQKDB4NzY5Nzg2MDUsIDB4MzAyYTdmM2EpLAorICAgIFdUQ1AoMHg3Njg0OTJiNCwgMHgzMDU5MGRhYiksIFdUQ1AoMHg3NjcxOGQxYywgMHgzMDg3OTRhNiksCisgICAgV1RDUCgweDc2NWU3NTQwLCAweDMwYjYxNDI2KSwgV1RDUCgweDc2NGI0YjIzLCAweDMwZTQ4YzIyKSwKKyAgICBXVENQKDB4NzYzODBlYzgsIDB4MzExMmZjOTUpLCBXVENQKDB4NzYyNGMwMzEsIDB4MzE0MTY1NzYpLAorICAgIFdUQ1AoMHg3NjExNWY2MywgMHgzMTZmYzZiZSksIFdUQ1AoMHg3NWZkZWM2MCwgMHgzMTllMjA2NyksCisgICAgV1RDUCgweDc1ZWE2NzJhLCAweDMxY2M3MjY5KSwgV1RDUCgweDc1ZDZjZmM1LCAweDMxZmFiY2JkKSwKKyAgICBXVENQKDB4NzVjMzI2MzQsIDB4MzIyOGZmNWMpLCBXVENQKDB4NzVhZjZhN2IsIDB4MzI1NzNhM2YpLAorICAgIFdUQ1AoMHg3NTliOWM5YiwgMHgzMjg1NmQ1ZSksIFdUQ1AoMHg3NTg3YmM5OCwgMHgzMmIzOThiMyksCisgICAgV1RDUCgweDc1NzNjYTc1LCAweDMyZTFiYzM2KSwgV1RDUCgweDc1NWZjNjM1LCAweDMzMGZkN2UxKSwKKyAgICBXVENQKDB4NzU0YmFmZGMsIDB4MzMzZGViYWIpLCBXVENQKDB4NzUzNzg3NmMsIDB4MzM2YmY3OGYpLAorICAgIFdUQ1AoMHg3NTIzNGNlOCwgMHgzMzk5ZmI4NSksIFdUQ1AoMHg3NTBmMDA1NCwgMHgzM2M3Zjc4NSksCisgICAgV1RDUCgweDc0ZmFhMWIzLCAweDMzZjVlYjg5KSwgV1RDUCgweDc0ZTYzMTA4LCAweDM0MjNkNzhhKSwKKyAgICBXVENQKDB4NzRkMWFlNTUsIDB4MzQ1MWJiODEpLCBXVENQKDB4NzRiZDE5OWYsIDB4MzQ3Zjk3NjYpLAorICAgIFdUQ1AoMHg3NGE4NzJlOCwgMHgzNGFkNmIzMiksIFdUQ1AoMHg3NDkzYmEzNCwgMHgzNGRiMzZkZiksCisgICAgV1RDUCgweDc0N2VlZjg1LCAweDM1MDhmYTY2KSwgV1RDUCgweDc0NmExMmRmLCAweDM1MzZiNWJlKSwKKyAgICBXVENQKDB4NzQ1NTI0NDYsIDB4MzU2NDY4ZTIpLCBXVENQKDB4NzQ0MDIzYmMsIDB4MzU5MjEzYzkpLAorICAgIFdUQ1AoMHg3NDJiMTE0NCwgMHgzNWJmYjY2ZSksIFdUQ1AoMHg3NDE1ZWNlMiwgMHgzNWVkNTBjOSksCisgICAgV1RDUCgweDc0MDBiNjlhLCAweDM2MWFlMmQzKSwgV1RDUCgweDczZWI2ZTZlLCAweDM2NDg2Yzg2KSwKKyAgICBXVENQKDB4NzNkNjE0NjEsIDB4MzY3NWVkZDkpLCBXVENQKDB4NzNjMGE4NzgsIDB4MzZhMzY2YzYpLAorICAgIFdUQ1AoMHg3M2FiMmFiNCwgMHgzNmQwZDc0NiksIFdUQ1AoMHg3Mzk1OWIxYiwgMHgzNmZlM2Y1MiksCisgICAgV1RDUCgweDczN2ZmOWFlLCAweDM3MmI5ZWUzKSwgV1RDUCgweDczNmE0NjcxLCAweDM3NThmNWYyKSwKKyAgICBXVENQKDB4NzM1NDgxNjgsIDB4Mzc4NjQ0NzcpLCBXVENQKDB4NzMzZWFhOTYsIDB4MzdiMzhhNmQpLAorICAgIFdUQ1AoMHg3MzI4YzFmZiwgMHgzN2UwYzdjYyksIFdUQ1AoMHg3MzEyYzdhNSwgMHgzODBkZmM4ZCksCisgICAgV1RDUCgweDcyZmNiYjhjLCAweDM4M2IyOGE5KSwgV1RDUCgweDcyZTY5ZGI3LCAweDM4Njg0YzE5KSwKKyAgICBXVENQKDB4NzJkMDZlMmIsIDB4Mzg5NTY2ZDYpLCBXVENQKDB4NzJiYTJjZWEsIDB4MzhjMjc4ZDkpLAorICAgIFdUQ1AoMHg3MmEzZDlmNywgMHgzOGVmODIxYyksIFdUQ1AoMHg3MjhkNzU1NywgMHgzOTFjODI5NyksCisgICAgV1RDUCgweDcyNzZmZjBkLCAweDM5NDk3YTQzKSwgV1RDUCgweDcyNjA3NzFiLCAweDM5NzY2OTE5KSwKKyAgICBXVENQKDB4NzI0OWRkODYsIDB4MzlhMzRmMTMpLCBXVENQKDB4NzIzMzMyNTEsIDB4MzlkMDJjMmEpLAorICAgIFdUQ1AoMHg3MjFjNzU4MCwgMHgzOWZkMDA1NiksIFdUQ1AoMHg3MjA1YTcxNiwgMHgzYTI5Y2I5MSksCisgICAgV1RDUCgweDcxZWVjNzE2LCAweDNhNTY4ZGQ0KSwgV1RDUCgweDcxZDdkNTg1LCAweDNhODM0NzE3KSwKKyAgICBXVENQKDB4NzFjMGQyNjUsIDB4M2FhZmY3NTUpLCBXVENQKDB4NzFhOWJkYmEsIDB4M2FkYzllODYpLAorICAgIFdUQ1AoMHg3MTkyOTc4OSwgMHgzYjA5M2NhMyksIFdUQ1AoMHg3MTdiNWZkMywgMHgzYjM1ZDFhNSksCisgICAgV1RDUCgweDcxNjQxNjlkLCAweDNiNjI1ZDg2KSwgV1RDUCgweDcxNGNiYmViLCAweDNiOGVlMDNlKSwKKyAgICBXVENQKDB4NzEzNTRmYzAsIDB4M2JiYjU5YzcpLCBXVENQKDB4NzExZGQyMjAsIDB4M2JlN2NhMWEpLAorICAgIFdUQ1AoMHg3MTA2NDMwZSwgMHgzYzE0MzEzMCksIFdUQ1AoMHg3MGVlYTI4ZSwgMHgzYzQwOGYwMyksCisgICAgV1RDUCgweDcwZDZmMGE0LCAweDNjNmNlMzhhKSwgV1RDUCgweDcwYmYyZDUzLCAweDNjOTkyZWMwKSwKKyAgICBXVENQKDB4NzBhNzU4OWYsIDB4M2NjNTcwOWUpLCBXVENQKDB4NzA4ZjcyOGIsIDB4M2NmMWE5MWMpLAorICAgIFdUQ1AoMHg3MDc3N2IxYywgMHgzZDFkZDgzNSksIFdUQ1AoMHg3MDVmNzI1NSwgMHgzZDQ5ZmRlMSksCisgICAgV1RDUCgweDcwNDc1ODM5LCAweDNkNzYxYTE5KSwgV1RDUCgweDcwMmYyY2NkLCAweDNkYTIyY2Q3KSwKKyAgICBXVENQKDB4NzAxNmYwMTQsIDB4M2RjZTM2MTQpLCBXVENQKDB4NmZmZWEyMTIsIDB4M2RmYTM1YzgpLAorICAgIFdUQ1AoMHg2ZmU2NDJjYSwgMHgzZTI2MmJlZSksIFdUQ1AoMHg2ZmNkZDI0MSwgMHgzZTUyMTg3ZiksCisgICAgV1RDUCgweDZmYjU1MDdhLCAweDNlN2RmYjczKSwgV1RDUCgweDZmOWNiZDc5LCAweDNlYTlkNGMzKSwKKyAgICBXVENQKDB4NmY4NDE5NDIsIDB4M2VkNWE0NmIpLCBXVENQKDB4NmY2YjYzZDgsIDB4M2YwMTZhNjEpLAorICAgIFdUQ1AoMHg2ZjUyOWQ0MCwgMHgzZjJkMjZhMCksIFdUQ1AoMHg2ZjM5YzU3ZCwgMHgzZjU4ZDkyMSksCisgICAgV1RDUCgweDZmMjBkYzkyLCAweDNmODQ4MWRkKSwgV1RDUCgweDZmMDdlMjg1LCAweDNmYjAyMGNlKSwKKyAgICBXVENQKDB4NmVlZWQ3NTgsIDB4M2ZkYmI1ZWMpLCBXVENQKDB4NmVkNWJiMTAsIDB4NDAwNzQxMzIpLAorICAgIFdUQ1AoMHg2ZWJjOGRiMCwgMHg0MDMyYzI5NyksIFdUQ1AoMHg2ZWEzNGYzZCwgMHg0MDVlM2ExNiksCisgICAgV1RDUCgweDZlODlmZmI5LCAweDQwODlhN2E4KSwgV1RDUCgweDZlNzA5ZjJhLCAweDQwYjUwYjQ2KSwKKyAgICBXVENQKDB4NmU1NzJkOTMsIDB4NDBlMDY0ZWEpLCBXVENQKDB4NmUzZGFhZjgsIDB4NDEwYmI0OGMpLAorICAgIFdUQ1AoMHg2ZTI0MTc1YywgMHg0MTM2ZmEyNyksIFdUQ1AoMHg2ZTBhNzJjNSwgMHg0MTYyMzViMiksCisgICAgV1RDUCgweDZkZjBiZDM1LCAweDQxOGQ2NzI5KSwgV1RDUCgweDZkZDZmNmIxLCAweDQxYjg4ZTg0KSwKKyAgICBXVENQKDB4NmRiZDFmM2MsIDB4NDFlM2FiYmMpLCBXVENQKDB4NmRhMzM2ZGMsIDB4NDIwZWJlY2IpLAorICAgIFdUQ1AoMHg2ZDg5M2Q5MywgMHg0MjM5YzdhYSksIFdUQ1AoMHg2ZDZmMzM2NSwgMHg0MjY0YzY1MyksCisgICAgV1RDUCgweDZkNTUxODU4LCAweDQyOGZiYWJlKSwgV1RDUCgweDZkM2FlYzZlLCAweDQyYmFhNGU2KSwKKyAgICBXVENQKDB4NmQyMGFmYWMsIDB4NDJlNTg0YzMpLCBXVENQKDB4NmQwNjYyMTUsIDB4NDMxMDVhNTApLAorICAgIFdUQ1AoMHg2Y2VjMDNhZiwgMHg0MzNiMjU4NSksIFdUQ1AoMHg2Y2QxOTQ3YywgMHg0MzY1ZTY1YiksCisgICAgV1RDUCgweDZjYjcxNDgyLCAweDQzOTA5Y2NkKSwgV1RDUCgweDZjOWM4M2MzLCAweDQzYmI0OGQ0KSwKKyAgICBXVENQKDB4NmM4MWUyNDUsIDB4NDNlNWVhNjgpLCBXVENQKDB4NmM2NzMwMGIsIDB4NDQxMDgxODQpLAorICAgIFdUQ1AoMHg2YzRjNmQxYSwgMHg0NDNiMGUyMSksIFdUQ1AoMHg2YzMxOTk3NSwgMHg0NDY1OTAzOSksCisgICAgV1RDUCgweDZjMTZiNTIxLCAweDQ0OTAwN2M0KSwgV1RDUCgweDZiZmJjMDIxLCAweDQ0YmE3NGJkKSwKKyAgICBXVENQKDB4NmJlMGJhN2IsIDB4NDRlNGQ3MWMpLCBXVENQKDB4NmJjNWE0MzEsIDB4NDUwZjJlZGIpLAorICAgIFdUQ1AoMHg2YmFhN2Q0OSwgMHg0NTM5N2JmNCksIFdUQ1AoMHg2YjhmNDVjNywgMHg0NTYzYmU2MCksCisgICAgV1RDUCgweDZiNzNmZGFlLCAweDQ1OGRmNjE5KSwgV1RDUCgweDZiNThhNTAzLCAweDQ1YjgyMzE4KSwKKyAgICBXVENQKDB4NmIzZDNiY2IsIDB4NDVlMjQ1NTYpLCBXVENQKDB4NmIyMWMyMDgsIDB4NDYwYzVjY2UpLAorICAgIFdUQ1AoMHg2YjA2MzdjMSwgMHg0NjM2Njk3OCksIFdUQ1AoMHg2YWVhOWNmOCwgMHg0NjYwNmI0ZSksCisgICAgV1RDUCgweDZhY2VmMWIyLCAweDQ2OGE2MjRhKSwgV1RDUCgweDZhYjMzNWY0LCAweDQ2YjQ0ZTY1KSwKKyAgICBXVENQKDB4NmE5NzY5YzEsIDB4NDZkZTJmOTkpLCBXVENQKDB4NmE3YjhkMWUsIDB4NDcwODA1ZGYpLAorICAgIFdUQ1AoMHg2YTVmYTAxMCwgMHg0NzMxZDEzMSksIFdUQ1AoMHg2YTQzYTI5YSwgMHg0NzViOTE4OCksCisgICAgV1RDUCgweDZhMjc5NGMxLCAweDQ3ODU0NmRlKSwgV1RDUCgweDZhMGI3Njg5LCAweDQ3YWVmMTJjKSwKKyAgICBXVENQKDB4NjllZjQ3ZjYsIDB4NDdkODkwNmQpLCBXVENQKDB4NjlkMzA5MGUsIDB4NDgwMjI0OTkpLAorICAgIFdUQ1AoMHg2OWI2YjlkMywgMHg0ODJiYWRhYiksIFdUQ1AoMHg2OTlhNWE0YywgMHg0ODU1MmI5YiksCisgICAgV1RDUCgweDY5N2RlYTdiLCAweDQ4N2U5ZTY0KSwgV1RDUCgweDY5NjE2YTY1LCAweDQ4YTgwNWZmKSwKKyAgICBXVENQKDB4Njk0NGRhMTAsIDB4NDhkMTYyNjUpLCBXVENQKDB4NjkyODM5N2UsIDB4NDhmYWIzOTEpLAorICAgIFdUQ1AoMHg2OTBiODhiNSwgMHg0OTIzZjk3YiksIFdUQ1AoMHg2OGVlYzdiOSwgMHg0OTRkMzQxZSksCisgICAgV1RDUCgweDY4ZDFmNjhmLCAweDQ5NzY2MzczKSwgV1RDUCgweDY4YjUxNTNhLCAweDQ5OWY4Nzc0KSwKKyAgICBXVENQKDB4Njg5ODIzYmYsIDB4NDljOGEwMWIpLCBXVENQKDB4Njg3YjIyMjQsIDB4NDlmMWFkNjEpLAorICAgIFdUQ1AoMHg2ODVlMTA2YywgMHg0YTFhYWYzZiksIFdUQ1AoMHg2ODQwZWU5YiwgMHg0YTQzYTViMCksCisgICAgV1RDUCgweDY4MjNiY2I3LCAweDRhNmM5MGFkKSwgV1RDUCgweDY4MDY3YWMzLCAweDRhOTU3MDMwKSwKKyAgICBXVENQKDB4NjdlOTI4YzUsIDB4NGFiZTQ0MzMpLCBXVENQKDB4NjdjYmM2YzAsIDB4NGFlNzBjYWYpLAorICAgIFdUQ1AoMHg2N2FlNTRiYSwgMHg0YjBmYzk5ZCksIFdUQ1AoMHg2NzkwZDJiNiwgMHg0YjM4N2FmOSksCisgICAgV1RDUCgweDY3NzM0MGJhLCAweDRiNjEyMGJiKSwgV1RDUCgweDY3NTU5ZWNhLCAweDRiODliYWRkKSwKKyAgICBXVENQKDB4NjczN2VjZWEsIDB4NGJiMjQ5NTgpLCBXVENQKDB4NjcxYTJiMjAsIDB4NGJkYWNjMjgpLAorICAgIFdUQ1AoMHg2NmZjNTk2ZiwgMHg0YzAzNDM0NSksIFdUQ1AoMHg2NmRlNzdkYywgMHg0YzJiYWVhOSksCisgICAgV1RDUCgweDY2YzA4NjZkLCAweDRjNTQwZTRlKSwgV1RDUCgweDY2YTI4NTI0LCAweDRjN2M2MjJkKSwKKyAgICBXVENQKDB4NjY4NDc0MDgsIDB4NGNhNGFhNDEpLCBXVENQKDB4NjY2NjUzMWQsIDB4NGNjY2U2ODQpLAorICAgIFdUQ1AoMHg2NjQ4MjI2NywgMHg0Y2Y1MTZlZSksIFdUQ1AoMHg2NjI5ZTFlYywgMHg0ZDFkM2I3YSksCisgICAgV1RDUCgweDY2MGI5MWFmLCAweDRkNDU1NDIyKSwgV1RDUCgweDY1ZWQzMWI1LCAweDRkNmQ2MGRmKSwKKyAgICBXVENQKDB4NjVjZWMyMDQsIDB4NGQ5NTYxYWMpLCBXVENQKDB4NjViMDQyOWYsIDB4NGRiZDU2ODIpLAorICAgIFdUQ1AoMHg2NTkxYjM4YywgMHg0ZGU1M2Y1YSksIFdUQ1AoMHg2NTczMTRjZiwgMHg0ZTBkMWMzMCksCisgICAgV1RDUCgweDY1NTQ2NjZkLCAweDRlMzRlY2ZjKSwgV1RDUCgweDY1MzVhODZiLCAweDRlNWNiMWI5KSwKKyAgICBXVENQKDB4NjUxNmRhY2QsIDB4NGU4NDZhNjApLCBXVENQKDB4NjRmN2ZkOTgsIDB4NGVhYzE2ZWIpLAorICAgIFdUQ1AoMHg2NGQ5MTBkMSwgMHg0ZWQzYjc1NSksIFdUQ1AoMHg2NGJhMTQ3ZCwgMHg0ZWZiNGI5NiksCisgICAgV1RDUCgweDY0OWIwOGEwLCAweDRmMjJkM2FhKSwgV1RDUCgweDY0N2JlZDNmLCAweDRmNGE0Zjg5KSwKKyAgICBXVENQKDB4NjQ1Y2MyNjAsIDB4NGY3MWJmMmUpLCBXVENQKDB4NjQzZDg4MDYsIDB4NGY5OTIyOTMpLAorICAgIFdUQ1AoMHg2NDFlM2UzOCwgMHg0ZmMwNzliMSksIFdUQ1AoMHg2M2ZlZTRmOCwgMHg0ZmU3YzQ4MyksCisgICAgV1RDUCgweDYzZGY3YzRkLCAweDUwMGYwMzAyKSwgV1RDUCgweDYzYzAwNDNiLCAweDUwMzYzNTI5KSwKKyAgICBXVENQKDB4NjNhMDdjYzcsIDB4NTA1ZDVhZjEpLCBXVENQKDB4NjM4MGU1ZjYsIDB4NTA4NDc0NTQpLAorICAgIFdUQ1AoMHg2MzYxM2ZjZCwgMHg1MGFiODE0ZCksIFdUQ1AoMHg2MzQxOGE1MCwgMHg1MGQyODFkNSksCisgICAgV1RDUCgweDYzMjFjNTg1LCAweDUwZjk3NWU2KSwgV1RDUCgweDYzMDFmMTcxLCAweDUxMjA1ZDdiKSwKKyAgICBXVENQKDB4NjJlMjBlMTcsIDB4NTE0NzM4OGMpLCBXVENQKDB4NjJjMjFiN2UsIDB4NTE2ZTA3MTUpLAorICAgIFdUQ1AoMHg2MmEyMTlhYSwgMHg1MTk0YzkxMCksIFdUQ1AoMHg2MjgyMDhhMSwgMHg1MWJiN2U3NSksCisgICAgV1RDUCgweDYyNjFlODY2LCAweDUxZTIyNzQwKSwgV1RDUCgweDYyNDFiOGZmLCAweDUyMDhjMzZhKSwKKyAgICBXVENQKDB4NjIyMTdhNzIsIDB4NTIyZjUyZWUpLCBXVENQKDB4NjIwMTJjYzIsIDB4NTI1NWQ1YzUpLAorICAgIFdUQ1AoMHg2MWUwY2ZmNSwgMHg1MjdjNGJlYSksIFdUQ1AoMHg2MWMwNjQxMCwgMHg1MmEyYjU1NiksCisgICAgV1RDUCgweDYxOWZlOTE4LCAweDUyYzkxMjA0KSwgV1RDUCgweDYxN2Y1ZjEyLCAweDUyZWY2MWVlKSwKKyAgICBXVENQKDB4NjE1ZWM2MDMsIDB4NTMxNWE1MGUpLCBXVENQKDB4NjEzZTFkZjAsIDB4NTMzYmRiNWQpLAorICAgIFdUQ1AoMHg2MTFkNjZkZSwgMHg1MzYyMDRkNyksIFdUQ1AoMHg2MGZjYTBkMiwgMHg1Mzg4MjE3NSksCisgICAgV1RDUCgweDYwZGJjYmQxLCAweDUzYWUzMTMxKSwgV1RDUCgweDYwYmFlN2UxLCAweDUzZDQzNDA2KSwKKyAgICBXVENQKDB4NjA5OWY1MDUsIDB4NTNmYTI5ZWQpLCBXVENQKDB4NjA3OGYzNDQsIDB4NTQyMDEyZTEpLAorICAgIFdUQ1AoMHg2MDU3ZTJhMiwgMHg1NDQ1ZWVkYiksIFdUQ1AoMHg2MDM2YzMyNSwgMHg1NDZiYmRkNyksCisgICAgV1RDUCgweDYwMTU5NGQxLCAweDU0OTE3ZmNlKSwgV1RDUCgweDVmZjQ1N2FkLCAweDU0YjczNGJhKSwKKyAgICBXVENQKDB4NWZkMzBiYmMsIDB4NTRkY2RjOTYpLCBXVENQKDB4NWZiMWIxMDQsIDB4NTUwMjc3NWMpLAorICAgIFdUQ1AoMHg1ZjkwNDc4YSwgMHg1NTI4MDUwNSksIFdUQ1AoMHg1ZjZlY2Y1MywgMHg1NTRkODU4ZCksCisgICAgV1RDUCgweDVmNGQ0ODY1LCAweDU1NzJmOGVkKSwgV1RDUCgweDVmMmJiMmM1LCAweDU1OTg1ZjIwKSwKKyAgICBXVENQKDB4NWYwYTBlNzcsIDB4NTViZGI4MWYpLCBXVENQKDB4NWVlODViODIsIDB4NTVlMzAzZTYpLAorICAgIFdUQ1AoMHg1ZWM2OTllOSwgMHg1NjA4NDI2ZSksIFdUQ1AoMHg1ZWE0YzliMywgMHg1NjJkNzNiMiksCisgICAgV1RDUCgweDVlODJlYWU1LCAweDU2NTI5N2FiKSwgV1RDUCgweDVlNjBmZDg0LCAweDU2NzdhZTU0KSwKKyAgICBXVENQKDB4NWUzZjAxOTQsIDB4NTY5Y2I3YTgpLCBXVENQKDB4NWUxY2Y3MWMsIDB4NTZjMWIzYTEpLAorICAgIFdUQ1AoMHg1ZGZhZGUyMCwgMHg1NmU2YTIzOSksIFdUQ1AoMHg1ZGQ4YjZhNywgMHg1NzBiODM2OSksCisgICAgV1RDUCgweDVkYjY4MGI0LCAweDU3MzA1NzJlKSwgV1RDUCgweDVkOTQzYzRlLCAweDU3NTUxZDgwKSwKKyAgICBXVENQKDB4NWQ3MWU5NzksIDB4NTc3OWQ2NWIpLCBXVENQKDB4NWQ0Zjg4M2IsIDB4NTc5ZTgxYjgpLAorICAgIFdUQ1AoMHg1ZDJkMTg5YSwgMHg1N2MzMWY5MiksIFdUQ1AoMHg1ZDBhOWE5YSwgMHg1N2U3YWZlNCksCisgICAgV1RDUCgweDVjZTgwZTQxLCAweDU4MGMzMmE3KSwgV1RDUCgweDVjYzU3Mzk0LCAweDU4MzBhN2Q2KSwKKyAgICBXVENQKDB4NWNhMmNhOTksIDB4NTg1NTBmNmMpLCBXVENQKDB4NWM4MDEzNTQsIDB4NTg3OTY5NjIpLAorICAgIFdUQ1AoMHg1YzVkNGRjYywgMHg1ODlkYjViMyksIFdUQ1AoMHg1YzNhN2EwNSwgMHg1OGMxZjQ1YiksCisgICAgV1RDUCgweDVjMTc5ODA2LCAweDU4ZTYyNTUyKSwgV1RDUCgweDViZjRhN2QyLCAweDU5MGE0ODkzKSwKKyAgICBXVENQKDB4NWJkMWE5NzEsIDB4NTkyZTVlMTkpLCBXVENQKDB4NWJhZTljZTcsIDB4NTk1MjY1ZGYpLAorICAgIFdUQ1AoMHg1YjhiODIzOSwgMHg1OTc2NWZkZSksIFdUQ1AoMHg1YjY4NTk2ZCwgMHg1OTlhNGMxMiksCisgICAgV1RDUCgweDViNDUyMjg4LCAweDU5YmUyYTc0KSwgV1RDUCgweDViMjFkZDkwLCAweDU5ZTFmYWZmKSwKKyAgICBXVENQKDB4NWFmZThhOGIsIDB4NWEwNWJkYWUpLCBXVENQKDB4NWFkYjI5N2QsIDB4NWEyOTcyN2IpLAorICAgIFdUQ1AoMHg1YWI3YmE2YywgMHg1YTRkMTk2MCksIFdUQ1AoMHg1YTk0M2Q1ZSwgMHg1YTcwYjI1OCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgS0JEV2luZG93OTZbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmZmZmQsIDB4MDAwMWE4MzgpLCBXVENQKDB4N2ZmZmZmZTIsIDB4MDAwNTZlODMpLAorICAgIFdUQ1AoMHg3ZmZmZmY3OSwgMHgwMDBiOWZkYSksIFdUQ1AoMHg3ZmZmZmU0NSwgMHgwMDE1MGU4ZSksCisgICAgV1RDUCgweDdmZmZmYjRkLCAweDAwMjJhZWViKSwgV1RDUCgweDdmZmZmNGM2LCAweDAwMzU5YjM2KSwKKyAgICBXVENQKDB4N2ZmZmU3OTIsIDB4MDA0ZjE0ZmYpLCBXVENQKDB4N2ZmZmNlOGIsIDB4MDA3MDg1OGMpLAorICAgIFdUQ1AoMHg3ZmZmYTE4ZiwgMHgwMDliN2Q3NSksIFdUQ1AoMHg3ZmZmNTQzOSwgMHgwMGQxYjM1MyksCisgICAgV1RDUCgweDdmZmVkNDQyLCAweDAxMTUwMThmKSwgV1RDUCgweDdmZmUwNzc1LCAweDAxNjc2MzM1KSwKKyAgICBXVENQKDB4N2ZmY2M5MzcsIDB4MDFjYWVmY2IpLCBXVENQKDB4N2ZmYWU3OWYsIDB4MDI0MWQ2MmUpLAorICAgIFdUQ1AoMHg3ZmY4MjAxOSwgMHgwMmNlNTY3ZiksIFdUQ1AoMHg3ZmY0MWJhNCwgMHgwMzcyYmIyNSksCisgICAgV1RDUCgweDdmZWU2YWMzLCAweDA0MzE1MGZjKSwgV1RDUCgweDdmZTY4MTI5LCAweDA1MGM1ZWM4KSwKKyAgICBXVENQKDB4N2ZkYmIxNjQsIDB4MDYwNjFjMGYpLCBXVENQKDB4N2ZjZDI4OTQsIDB4MDcyMGE3NzkpLAorICAgIFdUQ1AoMHg3ZmI5ZWE4MCwgMHgwODVkZmNlMiksIFdUQ1AoMHg3ZmEwY2UyZSwgMHgwOWJmZWI0ZCksCisgICAgV1RDUCgweDdmODA3YjQ1LCAweDBiNDgwYWUyKSwgV1RDUCgweDdmNTc2ODgwLCAweDBjZjdiMzM5KSwKKyAgICBXVENQKDB4N2YyM2RiNGUsIDB4MGVjZmYyMTIpLCBXVENQKDB4N2VlM2U4ZWUsIDB4MTBkMTgyYzApLAorICAgIFdUQ1AoMHg3ZTk1NzkxZiwgMHgxMmZjYzY3MCksIFdUQ1AoMHg3ZTM2NGE3NCwgMHgxNTUxYmQ4OCksCisgICAgV1RDUCgweDdkYzNmODY0LCAweDE3ZDAwMjM4KSwgV1RDUCgweDdkM2MwMmZkLCAweDFhNzZjNDdlKSwKKyAgICBXVENQKDB4N2M5YmQ4MmEsIDB4MWQ0NGM3YWQpLCBXVENQKDB4N2JlMGRlNTYsIDB4MjAzODYxYTEpLAorICAgIFdUQ1AoMHg3YjA4ODAzZCwgMHgyMzRmN2JhNiksIFdUQ1AoMHg3YTEwMzk5MywgMHgyNjg3OTUzMCksCisgICAgV1RDUCgweDc4ZjVhNDQyLCAweDI5ZGRjODU0KSwgV1RDUCgweDc3YjY4NWRlLCAweDJkNGVkMDBmKSwKKyAgICBXVENQKDB4NzY1MGRjZjUsIDB4MzBkNzEwM2QpLCBXVENQKDB4NzRjMmVkZTQsIDB4MzQ3MjlmMmQpLAorICAgIFdUQ1AoMHg3MzBiNGVkYiwgMHgzODFkNTBhZCksIFdUQ1AoMHg3MTI4ZjJjMSwgMHgzYmQyYzI3MyksCisgICAgV1RDUCgweDZmMWIzMmE5LCAweDNmOGU2OThmKSwgV1RDUCgweDZjZTFkNWEwLCAweDQzNGJhMGQ2KSwKKyAgICBXVENQKDB4NmE3ZDE2YTMsIDB4NDcwNWI3ZTUpLCBXVENQKDB4NjdlZGE4OTAsIDB4NGFiODAyODgpLAorICAgIFdUQ1AoMHg2NTM0YjdmOCwgMHg0ZTVkZTg0MiksIFdUQ1AoMHg2MjUzZWFjZCwgMHg1MWYyZjM5YSksCisgICAgV1RDUCgweDVmNGQ1ZGUxLCAweDU1NzJlMGY3KSwgV1RDUCgweDVjMjNhMDRhLCAweDU4ZDlhY2I5KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMjBbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmZmZmUsIDB4MDAwMTdiNmYpLCBXVENQKDB4N2ZmZmZmZWYsIDB4MDAwNDJkMmYpLAorICAgIFdUQ1AoMHg3ZmZmZmZiYiwgMHgwMDA4NDlkMCksIFdUQ1AoMHg3ZmZmZmYzNiwgMHgwMDBlMzQ5NCksCisgICAgV1RDUCgweDdmZmZmZTBjLCAweDAwMTY1ZWZkKSwgV1RDUCgweDdmZmZmYmFjLCAweDAwMjE0OWJlKSwKKyAgICBXVENQKDB4N2ZmZmY3MmUsIDB4MDAyZjg1NGMpLCBXVENQKDB4N2ZmZmVmMjQsIDB4MDA0MWIyMzUpLAorICAgIFdUQ1AoMHg3ZmZmZTE2NywgMHgwMDU4ODE0ZiksIFdUQ1AoMHg3ZmZmY2FjZCwgMHgwMDc0YjNhZiksCisgICAgV1RDUCgweDdmZmZhNmQwLCAweDAwOTcxYTY3KSwgV1RDUCgweDdmZmY2ZjFlLCAweDAwYzA5NjBlKSwKKyAgICBXVENQKDB4N2ZmZjFiMTIsIDB4MDBmMjE2MDIpLCBXVENQKDB4N2ZmZTlmMGIsIDB4MDEyYzk3NzUpLAorICAgIFdUQ1AoMHg3ZmZkZWJiMiwgMHgwMTcxMjQyOCksIFdUQ1AoMHg3ZmZjZWQxYiwgMHgwMWMwZDBmNyksCisgICAgV1RDUCgweDdmZmI4OWMyLCAweDAyMWNiYzEyKSwgV1RDUCgweDdmZjlhMTdjLCAweDAyODYwYjA1KSwKKyAgICBXVENQKDB4N2ZmNzBjMzksIDB4MDJmZGU4NzUpLCBXVENQKDB4N2ZmMzk4YmMsIDB4MDM4NTgxYjMpLAorICAgIFdUQ1AoMHg3ZmVmMGIzYiwgMHgwNDFlMDQwYyksIFdUQ1AoMHg3ZmU5MWJmMywgMHgwNGM4OTlmNCksCisgICAgV1RDUCgweDdmZTE3NWJhLCAweDA1ODY2ODAzKSwgV1RDUCgweDdmZDdiNDkzLCAweDA2NTg4OWQ1KSwKKyAgICBXVENQKDB4N2ZjYjY0NTksIDB4MDc0MDBlZDQpLCBXVENQKDB4N2ZiYmZmODIsIDB4MDgzZGY2ZTkpLAorICAgIFdUQ1AoMHg3ZmE4ZWUwOSwgMHgwOTUzMmYzNyksIFdUQ1AoMHg3ZjkxODQ5YSwgMHgwYTgwOGVkMSksCisgICAgV1RDUCgweDdmNzUwM2YyLCAweDBiYzZkMzgxKSwgV1RDUCgweDdmNTI5ODlhLCAweDBkMjY5ZWIwKSwKKyAgICBXVENQKDB4N2YyOTVhZjQsIDB4MGVhMDcyNzApLCBXVENQKDB4N2VmODRmYjYsIDB4MTAzNGFlYjYpLAorICAgIFdUQ1AoMHg3ZWJlNjhjNSwgMHgxMWUzOGVkMiksIFdUQ1AoMHg3ZTdhODY4NiwgMHgxM2FkMjczMyksCisgICAgV1RDUCgweDdlMmI3OWEzLCAweDE1OTE2MzZkKSwgV1RDUCgweDdkZDAwNTNjLCAweDE3OTAwNGE3KSwKKyAgICBXVENQKDB4N2Q2NmUxOGIsIDB4MTlhOGEwNWYpLCBXVENQKDB4N2NlZWJlZjAsIDB4MWJkYTlmYTIpLAorICAgIFdUQ1AoMHg3YzY2NDk1MywgMHgxZTI1M2VhMSksIFdUQ1AoMHg3YmNjMmJlOCwgMHgyMDg3OGNjZSksCisgICAgV1RDUCgweDdiMWYxNTI2LCAweDIzMDA2ZDVkKSwgV1RDUCgweDdhNWRiYjAxLCAweDI1OGU5ODQ4KSwKKyAgICBXVENQKDB4Nzk4NmRmM2UsIDB4MjgzMDliYzYpLCBXVENQKDB4Nzg5OTUzZTAsIDB4MmFlNGRlM2UpLAorICAgIFdUQ1AoMHg3NzkzZmY4OCwgMHgyZGE5YTBhOCksIFdUQ1AoMHg3Njc1ZTFjYywgMHgzMDdkMDE2MyksCisgICAgV1RDUCgweDc1M2UxNzYzLCAweDMzNWNmZjcyKSwgV1RDUCgweDczZWJkZTEwLCAweDM2NDc3ZTFmKSwKKyAgICBXVENQKDB4NzI3ZTk4NGUsIDB4MzkzYTQ4ZjEpLCBXVENQKDB4NzBmNWQwOWIsIDB4M2MzMzE3ZjkpLAorICAgIFdUQ1AoMHg2ZjUxM2M2MCwgMHgzZjJmOTQ1YyksIFdUQ1AoMHg2ZDkwYmU2MSwgMHg0MjJkNWQxOCksCisgICAgV1RDUCgweDZiYjQ2OGIxLCAweDQ1MmEwYmYzKSwgV1RDUCgweDY5YmM3ZTFlLCAweDQ4MjMzYTgxKSwKKyAgICBXVENQKDB4NjdhOTczMTcsIDB4NGIxNjg3M2UpLCBXVENQKDB4NjU3YmVkZmEsIDB4NGUwMTlhOWQpLAorICAgIFdUQ1AoMHg2MzM0YzZkMiwgMHg1MGUyMmMwYiksIFdUQ1AoMHg2MGQ1MDY4OSwgMHg1M2I2MDZjYiksCisgICAgV1RDUCgweDVlNWRlNTg4LCAweDU2N2IwZWE3KSwgV1RDUCgweDViZDBjOWM2LCAweDU5MmY0NDYwKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMjhbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmZmZmUsIDB4MDAwMTZmNjMpLCBXVENQKDB4N2ZmZmZmZjEsIDB4MDAwM2UzODIpLAorICAgIFdUQ1AoMHg3ZmZmZmZjNywgMHgwMDA3OGY2NCksIFdUQ1AoMHg3ZmZmZmY1ZCwgMHgwMDBjYzMyMyksCisgICAgV1RDUCgweDdmZmZmZTc2LCAweDAwMTNkOWVkKSwgV1RDUCgweDdmZmZmY2FhLCAweDAwMWQzYTlkKSwKKyAgICBXVENQKDB4N2ZmZmY5NTMsIDB4MDAyOTU4MWYpLCBXVENQKDB4N2ZmZmYzNzIsIDB4MDAzOGIxYmQpLAorICAgIFdUQ1AoMHg3ZmZmZTk4YiwgMHgwMDRiZDM0ZCksIFdUQ1AoMHg3ZmZmZDk3NSwgMHgwMDYzNTUzOCksCisgICAgV1RDUCgweDdmZmZjMDI0LCAweDAwN2ZkYzY0KSwgV1RDUCgweDdmZmY5OTViLCAweDAwYTIxOWYxKSwKKyAgICBXVENQKDB4N2ZmZjVmNWIsIDB4MDBjYWNhZDApLCBXVENQKDB4N2ZmZjBhNzUsIDB4MDBmYWI3MmQpLAorICAgIFdUQ1AoMHg3ZmZlOTA5MSwgMHgwMTMyYjFhZiksIFdUQ1AoMHg3ZmZkZTQ5ZSwgMHgwMTczOTY4OSksCisgICAgV1RDUCgweDdmZmNmNWVmLCAweDAxYmU0YTYzKSwgV1RDUCgweDdmZmJhZjg0LCAweDAyMTNiOTEwKSwKKyAgICBXVENQKDB4N2ZmOWY3M2EsIDB4MDI3NGQ0MWUpLCBXVENQKDB4N2ZmN2FjZjEsIDB4MDJlMjkxM2EpLAorICAgIFdUQ1AoMHg3ZmY0YTk5YSwgMHgwMzVkZTg2YyksIFdUQ1AoMHg3ZmYwYmUzZCwgMHgwM2U3ZDIzMyksCisgICAgV1RDUCgweDdmZWJiMmYxLCAweDA0ODE0NTdjKSwgV1RDUCgweDdmZTU0NWQ0LCAweDA1MmIzNTdjKSwKKyAgICBXVENQKDB4N2ZkZDJhMDIsIDB4MDVlNjhmNzcpLCBXVENQKDB4N2ZkMzA2OTUsIDB4MDZiNDM4NmYpLAorICAgIFdUQ1AoMHg3ZmM2NzViNCwgMHgwNzk1MGFjYiksIFdUQ1AoMHg3ZmI3MDNiZSwgMHgwODg5ZDNlZiksCisgICAgV1RDUCgweDdmYTQyZTg5LCAweDA5OTM1MWUwKSwgV1RDUCgweDdmOGQ2NGQ4LCAweDBhYjIzMGUwKSwKKyAgICBXVENQKDB4N2Y3MjA1ZjgsIDB4MGJlNzA5MjMpLCBXVENQKDB4N2Y1MTYxOTUsIDB4MGQzMjVjOTMpLAorICAgIFdUQ1AoMHg3ZjJhYjdkMCwgMHgwZTk0OTRhZSksIFdUQ1AoMHg3ZWZkMzk5NywgMHgxMDBlMDA4NSksCisgICAgV1RDUCgweDdlYzgwOTRhLCAweDExOWVkMmVmKSwgV1RDUCgweDdlOGEzYmE3LCAweDEzNDcyMGQ4KSwKKyAgICBXVENQKDB4N2U0MmQ5MDYsIDB4MTUwNmRmZGMpLCBXVENQKDB4N2RmMGRlZTQsIDB4MTZkZGU1MGIpLAorICAgIFdUQ1AoMHg3ZDkzNDFiNCwgMHgxOGNiZTNmNyksIFdUQ1AoMHg3ZDI4ZWYwMiwgMHgxYWQwNmUwNyksCisgICAgV1RDUCgweDdjYjBjZmNjLCAweDFjZWFmMjE1KSwgV1RDUCgweDdjMjljYjIwLCAweDFmMWFiYzRmKSwKKyAgICBXVENQKDB4N2I5MmM4ZWIsIDB4MjE1ZWY2NzcpLCBXVENQKDB4N2FlYWI0ZWMsIDB4MjNiNmE4NjcpLAorICAgIFdUQ1AoMHg3YTMwODFkMCwgMHgyNjIwYjhlYyksIFdUQ1AoMHg3OTYzMmM1YSwgMHgyODliZWVmNSksCisgICAgV1RDUCgweDc4ODFiZTk1LCAweDJiMjZmMzBiKSwgV1RDUCgweDc3OGI1MzA0LCAweDJkYzA1MTFmKSwKKyAgICBXVENQKDB4NzY3ZjE3YzAsIDB4MzA2NjdhYTIpLCBXVENQKDB4NzU1YzUxNzgsIDB4MzMxN2M4ZGQpLAorICAgIFdUQ1AoMHg3NDIyNWU1MCwgMHgzNWQyN2Y5OCksIFdUQ1AoMHg3MmQwYjg4NywgMHgzODk0Y2ZmMyksCisgICAgV1RDUCgweDcxNjZmOGU3LCAweDNiNWNkYjdiKSwgV1RDUCgweDZmZTRkOGU4LCAweDNlMjhiNzcwKSwKKyAgICBXVENQKDB4NmU0YTM0OTEsIDB4NDBmNjcwMmEpLCBXVENQKDB4NmM5NzBiZmMsIDB4NDNjNDBjYWEpLAorICAgIFdUQ1AoMHg2YWNiODQ4MywgMHg0NjhmOTIzMSksIFdUQ1AoMHg2OGU3ZTk5NCwgMHg0OTU3MDdmNSksCisgICAgV1RDUCgweDY2ZWNhZDFjLCAweDRjMTg3YWM3KSwgV1RDUCgweDY0ZGE2Nzk3LCAweDRlZDIwMGM1KSwKKyAgICBXVENQKDB4NjJiMWQ3YjcsIDB4NTE4MWJjZWEpLCBXVENQKDB4NjA3M2UxYWUsIDB4NTQyNWUyOGUpLAorICAgIFdUQ1AoMHg1ZTIxOGUxNiwgMHg1NmJjYjhjMiksIFdUQ1AoMHg1YmJjMDg3NSwgMHg1OTQ0OWQ3NiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgS0JEV2luZG93MjU2W10gPSB7CisgICAgV1RDUCgweDdmZmZmZmZmLCAweDAwMDEwM2M4KSwgV1RDUCgweDdmZmZmZmZjLCAweDAwMDIwM2FkKSwKKyAgICBXVENQKDB4N2ZmZmZmZjUsIDB4MDAwMzQxMGEpLCBXVENQKDB4N2ZmZmZmZTksIDB4MDAwNGM2Y2UpLAorICAgIFdUQ1AoMHg3ZmZmZmZkNCwgMHgwMDA2OWVlMCksIFdUQ1AoMHg3ZmZmZmZiMiwgMHgwMDA4ZDM3NiksCisgICAgV1RDUCgweDdmZmZmZjdkLCAweDAwMGI2ZjVhKSwgV1RDUCgweDdmZmZmZjJlLCAweDAwMGU3ZGZkKSwKKyAgICBXVENQKDB4N2ZmZmZlYmEsIDB4MDAxMjBiODMpLCBXVENQKDB4N2ZmZmZlMTYsIDB4MDAxNjI0Y2QpLAorICAgIFdUQ1AoMHg3ZmZmZmQzMCwgMHgwMDFhZDc3OCksIFdUQ1AoMHg3ZmZmZmJmMywgMHgwMDIwMzFlMiksCisgICAgV1RDUCgweDdmZmZmYTQ4LCAweDAwMjY0MzMwKSwgV1RDUCgweDdmZmZmODBkLCAweDAwMmQxYjRiKSwKKyAgICBXVENQKDB4N2ZmZmY1MWQsIDB4MDAzNGNhZTYpLCBXVENQKDB4N2ZmZmYxNDcsIDB4MDAzZDYzN2MpLAorICAgIFdUQ1AoMHg3ZmZmZWM1NCwgMHgwMDQ2Zjc1MSksIFdUQ1AoMHg3ZmZmZTVmZSwgMHgwMDUxOTk3NCksCisgICAgV1RDUCgweDdmZmZkZGYzLCAweDAwNWQ1ZGJhKSwgV1RDUCgweDdmZmZkM2QyLCAweDAwNmE1OGMxKSwKKyAgICBXVENQKDB4N2ZmZmM3MmEsIDB4MDA3ODlmZWIpLCBXVENQKDB4N2ZmZmI3NzIsIDB4MDA4ODQ5NWQpLAorICAgIFdUQ1AoMHg3ZmZmYTQwZSwgMHgwMDk5NmJmYiksIFdUQ1AoMHg3ZmZmOGM0NiwgMHgwMGFjMWY2MyksCisgICAgV1RDUCgweDdmZmY2ZjQ2LCAweDAwYzA3YmVjKSwgV1RDUCgweDdmZmY0YzE5LCAweDAwZDY5YTliKSwKKyAgICBXVENQKDB4N2ZmZjIxYTYsIDB4MDBlZTk1MjMpLCBXVENQKDB4N2ZmZWVlYWIsIDB4MDEwODg1ZDkpLAorICAgIFdUQ1AoMHg3ZmZlYjFiOCwgMHgwMTI0ODdiMSksIFdUQ1AoMHg3ZmZlNjkyZiwgMHgwMTQyYjYzMSksCisgICAgV1RDUCgweDdmZmUxMzM1LCAweDAxNjMyZDZmKSwgV1RDUCgweDdmZmRhZGI4LCAweDAxODYwYTAwKSwKKyAgICBXVENQKDB4N2ZmZDM2NjEsIDB4MDFhYjY4ZjMpLCBXVENQKDB4N2ZmY2FhOTEsIDB4MDFkMzY3YzUpLAorICAgIFdUQ1AoMHg3ZmZjMDc1YiwgMHgwMWZlMjQ1MyksIFdUQ1AoMHg3ZmZiNDk3ZSwgMHgwMjJiYmNkMCksCisgICAgV1RDUCgweDdmZmE2ZDU5LCAweDAyNWM0ZmJhKSwgV1RDUCgweDdmZjk2ZWViLCAweDAyOGZmYmM3KSwKKyAgICBXVENQKDB4N2ZmODQ5YzYsIDB4MDJjNmRmZGIpLCBXVENQKDB4N2ZmNmY5MGIsIDB4MDMwMTFhZmMpLAorICAgIFdUQ1AoMHg3ZmY1Nzc2MCwgMHgwMzNlY2MzYSksIFdUQ1AoMHg3ZmYzYmVlNywgMHgwMzgwMTJhOCksCisgICAgV1RDUCgweDdmZjFjOTM5LCAweDAzYzUwZDQ3KSwgV1RDUCgweDdmZWY4ZjVhLCAweDA0MGRkYWY2KSwKKyAgICBXVENQKDB4N2ZlZDA5YjQsIDB4MDQ1YTlhNjQpLCBXVENQKDB4N2ZlYTMwMGUsIDB4MDRhYjY5ZjkpLAorICAgIFdUQ1AoMHg3ZmU2Zjk4MCwgMHgwNTAwNjdjNyksIFdUQ1AoMHg3ZmUzNWM3MCwgMHgwNTU5YjE3YiksCisgICAgV1RDUCgweDdmZGY0ZTg4LCAweDA1Yjc2NDQzKSwgV1RDUCgweDdmZGFjNGFkLCAweDA2MTk5Y2M0KSwKKyAgICBXVENQKDB4N2ZkNWIyZjgsIDB4MDY4MDc2ZmUpLCBXVENQKDB4N2ZkMDBjYWYsIDB4MDZlYzBlNDEpLAorICAgIFdUQ1AoMHg3ZmM5YzQ0MSwgMHgwNzVjN2QxNiksIFdUQ1AoMHg3ZmMyY2IzYiwgMHgwN2QxZGQyYyksCisgICAgV1RDUCgweDdmYmIxMjQyLCAweDA4NGM0NzQ1KSwgV1RDUCgweDdmYjI4OTE1LCAweDA4Y2JkMzIzKSwKKyAgICBXVENQKDB4N2ZhOTFlN2UsIDB4MDk1MDk3NzgpLCBXVENQKDB4N2Y5ZWMwNTksIDB4MDlkYWE5Y2MpLAorICAgIFdUQ1AoMHg3ZjkzNWI4NywgMHgwYTZhMWU3NCksIFdUQ1AoMHg3Zjg2ZGJmMiwgMHgwYWZmMDg3NyksCisgICAgV1RDUCgweDdmNzkyYzhhLCAweDBiOTk3OTgzKSwgV1RDUCgweDdmNmEzNzQ2LCAweDBjMzk4MWQ2KSwKKyAgICBXVENQKDB4N2Y1OWU1MjAsIDB4MGNkZjMwMzApLCBXVENQKDB4N2Y0ODFlMWMsIDB4MGQ4YTkxYzMpLAorICAgIFdUQ1AoMHg3ZjM0Yzk0OSwgMHgwZTNiYjIyMiksIFdUQ1AoMHg3ZjFmY2NjMywgMHgwZWYyOWIzMCksCisgICAgV1RDUCgweDdmMDkwZGJjLCAweDBmYWY1NTEzKSwgV1RDUCgweDdlZjA3MDdkLCAweDEwNzFlNjI5KSwKKyAgICBXVENQKDB4N2VkNWQ4NzIsIDB4MTEzYTUyZjQpLCBXVENQKDB4N2ViOTI4MzEsIDB4MTIwODllMTQpLAorICAgIFdUQ1AoMHg3ZTlhNDE4MywgMHgxMmRjYzgzNiksIFdUQ1AoMHg3ZTc5MDU3MSwgMHgxM2I2ZDAxMCksCisgICAgV1RDUCgweDdlNTU1NDRlLCAweDE0OTZiMjRmKSwgV1RDUCgweDdlMmYwZGM4LCAweDE1N2M2OTk4KSwKKyAgICBXVENQKDB4N2UwNjEwZjEsIDB4MTY2N2VlNzcpLCBXVENQKDB4N2RkYTNjNTQsIDB4MTc1OTM3NjApLAorICAgIFdUQ1AoMHg3ZGFiNmUwNiwgMHgxODUwMzhhMyksIFdUQ1AoMHg3ZDc5ODNiMywgMHgxOTRjZTQ2ZSksCisgICAgV1RDUCgweDdkNDQ1YWI1LCAweDFhNGYyYWM0KSwgV1RDUCgweDdkMGJkMDI4LCAweDFiNTZmOTgxKSwKKyAgICBXVENQKDB4N2NjZmMwZmQsIDB4MWM2NDNjNTQpLCBXVENQKDB4N2M5MDBhMTEsIDB4MWQ3NmRjYzIpLAorICAgIFdUQ1AoMHg3YzRjODg0NCwgMHgxZThlYzIyNyksIFdUQ1AoMHg3YzA1MTg4ZCwgMHgxZmFiZDFiYiksCisgICAgV1RDUCgweDdiYjk5ODE3LCAweDIwY2RlZTkyKSwgV1RDUCgweDdiNjllNDU1LCAweDIxZjRmOWE2KSwKKyAgICBXVENQKDB4N2IxNWRiMWEsIDB4MjMyMGQxZGMpLCBXVENQKDB4N2FiZDVhYjgsIDB4MjQ1MTU0MGMpLAorICAgIFdUQ1AoMHg3YTYwNDIxMywgMHgyNTg2NWIwOSksIFdUQ1AoMHg3OWZlNzBiZiwgMHgyNmJmYmZhZiksCisgICAgV1RDUCgweDc5OTdjNzE2LCAweDI3ZmQ1OGVkKSwgV1RDUCgweDc5MmMyNjU0LCAweDI5M2VmYmQwKSwKKyAgICBXVENQKDB4NzhiYjcwYjAsIDB4MmE4NDdiOTcpLCBXVENQKDB4Nzg0NTg5NzYsIDB4MmJjZGE5YmIpLAorICAgIFdUQ1AoMHg3N2NhNTUxZCwgMHgyZDFhNTYwOCksIFdUQ1AoMHg3NzQ5Yjk2NSwgMHgyZTZhNGVhNiksCisgICAgV1RDUCgweDc2YzM5ZDY4LCAweDJmYmQ2MDM2KSwgV1RDUCgweDc2MzdlOWI4LCAweDMxMTM1NWRjKSwKKyAgICBXVENQKDB4NzVhNjg4NzMsIDB4MzI2YmY5NWEpLCBXVENQKDB4NzUwZjY1NTksIDB4MzNjNzEzMjYpLAorICAgIFdUQ1AoMHg3NDcyNmRlMSwgMHgzNTI0NmE3ZSksIFdUQ1AoMHg3M2NmOTE0ZiwgMHgzNjgzYzU4MiksCisgICAgV1RDUCgweDczMjZjMGM4LCAweDM3ZTRlOTRiKSwgV1RDUCgweDcyNzdlZjVmLCAweDM5NDc5YTA4KSwKKyAgICBXVENQKDB4NzFjMzEyMmYsIDB4M2FhYjliMTQpLCBXVENQKDB4NzEwODIwNjMsIDB4M2MxMGFmMTEpLAorICAgIFdUQ1AoMHg3MDQ3MTM0YSwgMHgzZDc2OTgwNyksIFdUQ1AoMHg2ZjdmZTY2MSwgMHgzZWRkMTc3YyksCisgICAgV1RDUCgweDZlYjI5NzYzLCAweDQwNDNlZTkyKSwgV1RDUCgweDZkZGYyNjUxLCAweDQxYWFkZTI2KSwKKyAgICBXVENQKDB4NmQwNTk1N2MsIDB4NDMxMWE2ZTgpLCBXVENQKDB4NmMyNWU5OGYsIDB4NDQ3ODA5N2IpLAorICAgIFdUQ1AoMHg2YjQwMjk5MSwgMHg0NWRkYzY5MyksIFdUQ1AoMHg2YTU0NWVmMCwgMHg0NzQyOWYxMyksCisgICAgV1RDUCgweDY5NjI5NTdmLCAweDQ4YTY1NDI3KSwgV1RDUCgweDY4NmFkYjdjLCAweDRhMDhhNzY0KSwKKyAgICBXVENQKDB4Njc2ZDQxOGQsIDB4NGI2OTVhZTgpLCBXVENQKDB4NjY2OWRhYzIsIDB4NGNjODMxNzEpLAorICAgIFdUQ1AoMHg2NTYwYmM5MCwgMHg0ZTI0ZWU3ZCksIFdUQ1AoMHg2NDUxZmVjZiwgMHg0ZjdmNTY2OCksCisgICAgV1RDUCgweDYzM2RiYmIxLCAweDUwZDcyZTg1KSwgV1RDUCgweDYyMjQwZmJkLCAweDUyMmMzZDNiKSwKKyAgICBXVENQKDB4NjEwNTE5YzcsIDB4NTM3ZTRhMWYpLCBXVENQKDB4NWZlMGZhZTMsIDB4NTRjZDFlMTApLAorICAgIFdUQ1AoMHg1ZWI3ZDY1YywgMHg1NjE4ODM0YyksIFdUQ1AoMHg1ZDg5ZDFhNSwgMHg1NzYwNDU5MCksCisgICAgV1RDUCgweDVjNTcxNDRiLCAweDU4YTQzMjI3KSwgV1RDUCgweDViMWZjN2U2LCAweDU5ZTQxODA4KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3c3NjhbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmZmODUsIDB4MDAwYjExZDkpLCBXVENQKDB4N2ZmZmZlZjAsIDB4MDAxMDdhYTkpLAorICAgIFdUQ1AoMHg3ZmZmZmUzZSwgMHgwMDE1MzUxYyksIFdUQ1AoMHg3ZmZmZmQ2YywgMHgwMDE5YjBhMSksCisgICAgV1RDUCgweDdmZmZmYzc3LCAweDAwMWUxNjU2KSwgV1RDUCgweDdmZmZmYjViLCAweDAwMjI3YTgwKSwKKyAgICBXVENQKDB4N2ZmZmZhMTYsIDB4MDAyNmU4ZDMpLCBXVENQKDB4N2ZmZmY4YTQsIDB4MDAyYjY4YzkpLAorICAgIFdUQ1AoMHg3ZmZmZjcwMCwgMHgwMDJmZmY4YSksIFdUQ1AoMHg3ZmZmZjUyOCwgMHgwMDM0YjBkOSksCisgICAgV1RDUCgweDdmZmZmMzE2LCAweDAwMzk3ZjljKSwgV1RDUCgweDdmZmZmMGM2LCAweDAwM2U2ZTIyKSwKKyAgICBXVENQKDB4N2ZmZmVlMzUsIDB4MDA0MzdlNTMpLCBXVENQKDB4N2ZmZmViNWIsIDB4MDA0OGIxZDApLAorICAgIFdUQ1AoMHg3ZmZmZTgzNiwgMHgwMDRlMGEwNSksIFdUQ1AoMHg3ZmZmZTRiZSwgMHgwMDUzODgzNyksCisgICAgV1RDUCgweDdmZmZlMGVmLCAweDAwNTkyZDhlKSwgV1RDUCgweDdmZmZkY2MzLCAweDAwNWVmYjFhKSwKKyAgICBXVENQKDB4N2ZmZmQ4MzIsIDB4MDA2NGYxZGEpLCBXVENQKDB4N2ZmZmQzMzcsIDB4MDA2YjEyYzEpLAorICAgIFdUQ1AoMHg3ZmZmY2RjYiwgMHgwMDcxNWViNCksIFdUQ1AoMHg3ZmZmYzdlNywgMHgwMDc3ZDY5MiksCisgICAgV1RDUCgweDdmZmZjMTgyLCAweDAwN2U3YjMwKSwgV1RDUCgweDdmZmZiYTk2LCAweDAwODU0ZDYxKSwKKyAgICBXVENQKDB4N2ZmZmIzMWIsIDB4MDA4YzRkZjApLCBXVENQKDB4N2ZmZmFiMDYsIDB4MDA5MzdkYTYpLAorICAgIFdUQ1AoMHg3ZmZmYTI1MSwgMHgwMDlhZGQ0OCksIFdUQ1AoMHg3ZmZmOThmMSwgMHgwMGEyNmQ5OCksCisgICAgV1RDUCgweDdmZmY4ZWRkLCAweDAwYWEyZjU3KSwgV1RDUCgweDdmZmY4NDBiLCAweDAwYjIyMzQzKSwKKyAgICBXVENQKDB4N2ZmZjc4NzAsIDB4MDBiYTRhMTkpLCBXVENQKDB4N2ZmZjZjMDIsIDB4MDBjMmE0OTUpLAorICAgIFdUQ1AoMHg3ZmZmNWViNSwgMHgwMGNiMzM3MSksIFdUQ1AoMHg3ZmZmNTA3ZSwgMHgwMGQzZjc2NyksCisgICAgV1RDUCgweDdmZmY0MTUwLCAweDAwZGNmMTMwKSwgV1RDUCgweDdmZmYzMTFmLCAweDAwZTYyMTgzKSwKKyAgICBXVENQKDB4N2ZmZjFmZGUsIDB4MDBlZjg5MTkpLCBXVENQKDB4N2ZmZjBkN2YsIDB4MDBmOTI4YTcpLAorICAgIFdUQ1AoMHg3ZmZlZjlmNCwgMHgwMTAzMDBlNSksIFdUQ1AoMHg3ZmZlZTUyZiwgMHgwMTBkMTI4OCksCisgICAgV1RDUCgweDdmZmVjZjIwLCAweDAxMTc1ZTQ3KSwgV1RDUCgweDdmZmViN2I4LCAweDAxMjFlNGQ2KSwKKyAgICBXVENQKDB4N2ZmZTllZTYsIDB4MDEyY2E2ZWIpLCBXVENQKDB4N2ZmZTg0OWIsIDB4MDEzN2E1M2IpLAorICAgIFdUQ1AoMHg3ZmZlNjhjNCwgMHgwMTQyZTA3YSksIFdUQ1AoMHg3ZmZlNGI1MCwgMHgwMTRlNTk1YyksCisgICAgV1RDUCgweDdmZmUyYzJjLCAweDAxNWExMDk1KSwgV1RDUCgweDdmZmUwYjQ1LCAweDAxNjYwNmRhKSwKKyAgICBXVENQKDB4N2ZmZGU4ODgsIDB4MDE3MjNjZGUpLCBXVENQKDB4N2ZmZGMzZGYsIDB4MDE3ZWIzNTMpLAorICAgIFdUQ1AoMHg3ZmZkOWQzNywgMHgwMThiNmFlZCksIFdUQ1AoMHg3ZmZkNzQ3OSwgMHgwMTk4NjQ1ZiksCisgICAgV1RDUCgweDdmZmQ0OTkwLCAweDAxYTVhMDViKSwgV1RDUCgweDdmZmQxYzYzLCAweDAxYjMxZjkyKSwKKyAgICBXVENQKDB4N2ZmY2VjZGMsIDB4MDFjMGUyYjgpLCBXVENQKDB4N2ZmY2JhZTIsIDB4MDFjZWVhN2QpLAorICAgIFdUQ1AoMHg3ZmZjODY1YywgMHgwMWRkMzc5MyksIFdUQ1AoMHg3ZmZjNGYyZiwgMHgwMWViY2FhYSksCisgICAgV1RDUCgweDdmZmMxNTQyLCAweDAxZmFhNDcyKSwgV1RDUCgweDdmZmJkODc5LCAweDAyMDljNTljKSwKKyAgICBXVENQKDB4N2ZmYjk4YjcsIDB4MDIxOTJlZDcpLCBXVENQKDB4N2ZmYjU1ZTAsIDB4MDIyOGUwZDIpLAorICAgIFdUQ1AoMHg3ZmZiMGZkNiwgMHgwMjM4ZGMzYyksIFdUQ1AoMHg3ZmZhYzY3OSwgMHgwMjQ5MjFjMyksCisgICAgV1RDUCgweDdmZmE3OWFjLCAweDAyNTliMjE1KSwgV1RDUCgweDdmZmEyOTRkLCAweDAyNmE4ZGRlKSwKKyAgICBXVENQKDB4N2ZmOWQ1M2IsIDB4MDI3YmI1Y2MpLCBXVENQKDB4N2ZmOTdkNTQsIDB4MDI4ZDJhOGEpLAorICAgIFdUQ1AoMHg3ZmY5MjE3NSwgMHgwMjllZWNjMyksIFdUQ1AoMHg3ZmY4YzE3YSwgMHgwMmIwZmQyMyksCisgICAgV1RDUCgweDdmZjg1ZDNmLCAweDAyYzM1YzUzKSwgV1RDUCgweDdmZjdmNDlkLCAweDAyZDYwYWZkKSwKKyAgICBXVENQKDB4N2ZmNzg3NmUsIDB4MDJlOTA5Y2EpLCBXVENQKDB4N2ZmNzE1OGIsIDB4MDJmYzU5NjApLAorICAgIFdUQ1AoMHg3ZmY2OWVjYSwgMHgwMzBmZmE2OSksIFdUQ1AoMHg3ZmY2MjMwMywgMHgwMzIzZWQ4OSksCisgICAgV1RDUCgweDdmZjVhMjBhLCAweDAzMzgzMzY3KSwgV1RDUCgweDdmZjUxYmIzLCAweDAzNGNjY2E3KSwKKyAgICBXVENQKDB4N2ZmNDhmZDMsIDB4MDM2MWI5ZWQpLCBXVENQKDB4N2ZmM2ZlM2MsIDB4MDM3NmZiZGQpLAorICAgIFdUQ1AoMHg3ZmYzNjZiZSwgMHgwMzhjOTMxNyksIFdUQ1AoMHg3ZmYyYzkyOSwgMHgwM2EyODAzZSksCisgICAgV1RDUCgweDdmZjIyNTRlLCAweDAzYjhjM2YyKSwgV1RDUCgweDdmZjE3YWZhLCAweDAzY2Y1ZWQxKSwKKyAgICBXVENQKDB4N2ZmMGM5ZjksIDB4MDNlNjUxN2EpLCBXVENQKDB4N2ZmMDEyMTgsIDB4MDNmZDljOGEpLAorICAgIFdUQ1AoMHg3ZmVmNTMyMSwgMHgwNDE1NDA5YyksIFdUQ1AoMHg3ZmVlOGNkZSwgMHgwNDJkM2U0ZCksCisgICAgV1RDUCgweDdmZWRiZjE3LCAweDA0NDU5NjM0KSwgV1RDUCgweDdmZWNlOTkzLCAweDA0NWU0OGVjKSwKKyAgICBXVENQKDB4N2ZlYzBjMTgsIDB4MDQ3NzU3MGEpLCBXVENQKDB4N2ZlYjI2NmEsIDB4MDQ5MGMxMjcpLAorICAgIFdUQ1AoMHg3ZmVhMzg0ZSwgMHgwNGFhODdkNSksIFdUQ1AoMHg3ZmU5NDE4NiwgMHgwNGM0YWJhYSksCisgICAgV1RDUCgweDdmZTg0MWQzLCAweDA0ZGYyZDM3KSwgV1RDUCgweDdmZTczOGY0LCAweDA0ZmEwZDBkKSwKKyAgICBXVENQKDB4N2ZlNjI2YTksIDB4MDUxNTRiYmMpLCBXVENQKDB4N2ZlNTBhYWYsIDB4MDUzMGU5ZDMpLAorICAgIFdUQ1AoMHg3ZmUzZTRjMSwgMHgwNTRjZTdkZCksIFdUQ1AoMHg3ZmUyYjQ5YiwgMHgwNTY5NDY2NyksCisgICAgV1RDUCgweDdmZTE3OWY2LCAweDA1ODYwNWZhKSwgV1RDUCgweDdmZTAzNDhiLCAweDA1YTMyNzFlKSwKKyAgICBXVENQKDB4N2ZkZWU0MTAsIDB4MDVjMGFhNWMpLCBXVENQKDB4N2ZkZDg4M2IsIDB4MDVkZTkwMzgpLAorICAgIFdUQ1AoMHg3ZmRjMjBjMSwgMHgwNWZjZDkzNSksIFdUQ1AoMHg3ZmRhYWQ1MywgMHgwNjFiODVkNiksCisgICAgV1RDUCgweDdmZDkyZGE1LCAweDA2M2E5NjljKSwgV1RDUCgweDdmZDdhMTY2LCAweDA2NWEwYzA2KSwKKyAgICBXVENQKDB4N2ZkNjA4NDQsIDB4MDY3OWU2OTApLCBXVENQKDB4N2ZkNDYxZWUsIDB4MDY5YTI2YjYpLAorICAgIFdUQ1AoMHg3ZmQyYWUxMCwgMHgwNmJhY2NmMiksIFdUQ1AoMHg3ZmQwZWM1NSwgMHgwNmRiZDliZCksCisgICAgV1RDUCgweDdmY2YxYzY1LCAweDA2ZmQ0ZDhjKSwgV1RDUCgweDdmY2QzZGU5LCAweDA3MWYyOGQzKSwKKyAgICBXVENQKDB4N2ZjYjUwODgsIDB4MDc0MTZjMDYpLCBXVENQKDB4N2ZjOTUzZTYsIDB4MDc2NDE3OTQpLAorICAgIFdUQ1AoMHg3ZmM3NDdhOCwgMHgwNzg3MmJlZSksIFdUQ1AoMHg3ZmM1MmI3MCwgMHgwN2FhYTk3ZiksCisgICAgV1RDUCgweDdmYzJmZWRmLCAweDA3Y2U5MGI0KSwgV1RDUCgweDdmYzBjMTk1LCAweDA3ZjJlMWY0KSwKKyAgICBXVENQKDB4N2ZiZTczMmYsIDB4MDgxNzlkYTcpLCBXVENQKDB4N2ZiYzEzNGIsIDB4MDgzY2M0MzEpLAorICAgIFdUQ1AoMHg3ZmI5YTE4MywgMHgwODYyNTVmNyksIFdUQ1AoMHg3ZmI3MWQ3MiwgMHgwODg4NTM1OSksCisgICAgV1RDUCgweDdmYjQ4NmFmLCAweDA4YWViY2I1KSwgV1RDUCgweDdmYjFkY2QzLCAweDA4ZDU5MjY5KSwKKyAgICBXVENQKDB4N2ZhZjFmNzIsIDB4MDhmY2Q0Y2YpLCBXVENQKDB4N2ZhYzRlMjEsIDB4MDkyNDg0NDApLAorICAgIFdUQ1AoMHg3ZmE5Njg3MywgMHgwOTRjYTExMSksIFdUQ1AoMHg3ZmE2NmRmOCwgMHgwOTc1MmI5OCksCisgICAgV1RDUCgweDdmYTM1ZTQwLCAweDA5OWUyNDI1KSwgV1RDUCgweDdmYTAzOGRiLCAweDA5Yzc4YjA5KSwKKyAgICBXVENQKDB4N2Y5Y2ZkNTQsIDB4MDlmMTYwOTApLCBXVENQKDB4N2Y5OWFiMzgsIDB4MGExYmE1MDcpLAorICAgIFdUQ1AoMHg3Zjk2NDIxMCwgMHgwYTQ2NThiNiksIFdUQ1AoMHg3ZjkyYzE2NSwgMHgwYTcxN2JlMiksCisgICAgV1RDUCgweDdmOGYyOGJmLCAweDBhOWQwZWQxKSwgV1RDUCgweDdmOGI3N2E0LCAweDBhYzkxMWM0KSwKKyAgICBXVENQKDB4N2Y4N2FkOTcsIDB4MGFmNTg0ZmIpLCBXVENQKDB4N2Y4M2NhMWQsIDB4MGIyMjY4YjIpLAorICAgIFdUQ1AoMHg3ZjdmY2NiNSwgMHgwYjRmYmQyMyksIFdUQ1AoMHg3ZjdiYjRlMiwgMHgwYjdkODI4OCksCisgICAgV1RDUCgweDdmNzc4MjIxLCAweDBiYWJiOTE1KSwgV1RDUCgweDdmNzMzM2YxLCAweDBiZGE2MGZkKSwKKyAgICBXVENQKDB4N2Y2ZWM5Y2QsIDB4MGMwOTdhNzIpLCBXVENQKDB4N2Y2YTQzMzAsIDB4MGMzOTA1YTEpLAorICAgIFdUQ1AoMHg3ZjY1OWY5NCwgMHgwYzY5MDJiNiksIFdUQ1AoMHg3ZjYwZGU3MCwgMHgwYzk5NzFkOSksCisgICAgV1RDUCgweDdmNWJmZjNiLCAweDBjY2E1MzMxKSwgV1RDUCgweDdmNTcwMTZiLCAweDBjZmJhNmUzKSwKKyAgICBXVENQKDB4N2Y1MWU0NzQsIDB4MGQyZDZkMGUpLCBXVENQKDB4N2Y0Y2E3YzgsIDB4MGQ1ZmE1ZDIpLAorICAgIFdUQ1AoMHg3ZjQ3NGFkOSwgMHgwZDkyNTE0YSksIFdUQ1AoMHg3ZjQxY2QxNywgMHgwZGM1NmY5MCksCisgICAgV1RDUCgweDdmM2MyZGYxLCAweDBkZjkwMGJiKSwgV1RDUCgweDdmMzY2Y2Q1LCAweDBlMmQwNGRlKSwKKyAgICBXVENQKDB4N2YzMDg5MmUsIDB4MGU2MTdjMGEpLCBXVENQKDB4N2YyYTgyNjksIDB4MGU5NjY2NGUpLAorICAgIFdUQ1AoMHg3ZjI0NTdlZiwgMHgwZWNiYzNiNSksIFdUQ1AoMHg3ZjFlMDkyOSwgMHgwZjAxOTQ0OSksCisgICAgV1RDUCgweDdmMTc5NTdlLCAweDBmMzdkODBmKSwgV1RDUCgweDdmMTBmYzU1LCAweDBmNmU4ZjBjKSwKKyAgICBXVENQKDB4N2YwYTNkMTQsIDB4MGZhNWI5NDApLCBXVENQKDB4N2YwMzU3MWQsIDB4MGZkZDU2YTgpLAorICAgIFdUQ1AoMHg3ZWZjNDlkNCwgMHgxMDE1Njc0MCksIFdUQ1AoMHg3ZWY1MTQ5YiwgMHgxMDRkZWIwMCksCisgICAgV1RDUCgweDdlZWRiNmQyLCAweDEwODZlMWRkKSwgV1RDUCgweDdlZTYyZmRhLCAweDEwYzA0YmNhKSwKKyAgICBXVENQKDB4N2VkZTdmMTEsIDB4MTBmYTI4YjcpLCBXVENQKDB4N2VkNmEzZDUsIDB4MTEzNDc4OTApLAorICAgIFdUQ1AoMHg3ZWNlOWQ4MSwgMHgxMTZmM2IzZiksIFdUQ1AoMHg3ZWM2NmI3MywgMHgxMWFhNzBhYyksCisgICAgV1RDUCgweDdlYmUwZDA0LCAweDExZTYxOGJhKSwgV1RDUCgweDdlYjU4MThkLCAweDEyMjIzMzRjKSwKKyAgICBXVENQKDB4N2VhY2M4NjksIDB4MTI1ZWMwM2UpLCBXVENQKDB4N2VhM2UwZWYsIDB4MTI5YmJmNmUpLAorICAgIFdUQ1AoMHg3ZTlhY2E3NSwgMHgxMmQ5MzBiMiksIFdUQ1AoMHg3ZTkxODQ1MiwgMHgxMzE3MTNlMiksCisgICAgV1RDUCgweDdlODgwZGRiLCAweDEzNTU2OGNmKSwgV1RDUCgweDdlN2U2NjY1LCAweDEzOTQyZjQ5KSwKKyAgICBXVENQKDB4N2U3NDhkNDMsIDB4MTNkMzY3MWUpLCBXVENQKDB4N2U2YTgxYzgsIDB4MTQxMzEwMTcpLAorICAgIFdUQ1AoMHg3ZTYwNDM0NywgMHgxNDUzMjlmYSksIFdUQ1AoMHg3ZTU1ZDExMSwgMHgxNDkzYjQ4YyksCisgICAgV1RDUCgweDdlNGIyYTc2LCAweDE0ZDRhZjhlKSwgV1RDUCgweDdlNDA0ZWM4LCAweDE1MTYxYWJlKSwKKyAgICBXVENQKDB4N2UzNTNkNTUsIDB4MTU1N2Y1ZDcpLCBXVENQKDB4N2UyOWY1NmMsIDB4MTU5YTQwOTApLAorICAgIFdUQ1AoMHg3ZTFlNzY1YywgMHgxNWRjZmFhMCksIFdUQ1AoMHg3ZTEyYmY3MiwgMHgxNjIwMjNiNyksCisgICAgV1RDUCgweDdlMDZjZmZjLCAweDE2NjNiYjg2KSwgV1RDUCgweDdkZmFhNzQ2LCAweDE2YTdjMWI5KSwKKyAgICBXVENQKDB4N2RlZTQ0OWUsIDB4MTZlYzM1ZjcpLCBXVENQKDB4N2RlMWE3NGUsIDB4MTczMTE3ZTkpLAorICAgIFdUQ1AoMHg3ZGQ0Y2VhMywgMHgxNzc2NjczMSksIFdUQ1AoMHg3ZGM3YjllNywgMHgxN2JjMjM2ZiksCisgICAgV1RDUCgweDdkYmE2ODY1LCAweDE4MDI0YzQwKSwgV1RDUCgweDdkYWNkOTY4LCAweDE4NDhlMTNmKSwKKyAgICBXVENQKDB4N2Q5ZjBjM2EsIDB4MTg4ZmUyMDQpLCBXVENQKDB4N2Q5MTAwMjUsIDB4MThkNzRlMjIpLAorICAgIFdUQ1AoMHg3ZDgyYjQ3MiwgMHgxOTFmMjUyYyksIFdUQ1AoMHg3ZDc0Mjg2YywgMHgxOTY3NjZhZSksCisgICAgV1RDUCgweDdkNjU1YjViLCAweDE5YjAxMjM2KSwgV1RDUCgweDdkNTY0YzhhLCAweDE5ZjkyNzRiKSwKKyAgICBXVENQKDB4N2Q0NmZiNDAsIDB4MWE0MmE1NzQpLCBXVENQKDB4N2QzNzY2YzgsIDB4MWE4YzhjMzIpLAorICAgIFdUQ1AoMHg3ZDI3OGU2YSwgMHgxYWQ2ZGIwNiksIFdUQ1AoMHg3ZDE3NzE2ZiwgMHgxYjIxOTE2YyksCisgICAgV1RDUCgweDdkMDcwZjIyLCAweDFiNmNhZWRmKSwgV1RDUCgweDdjZjY2NmNiLCAweDFiYjgzMmQ1KSwKKyAgICBXVENQKDB4N2NlNTc3YjMsIDB4MWMwNDFjYzIpLCBXVENQKDB4N2NkNDQxMjQsIDB4MWM1MDZjMTcpLAorICAgIFdUQ1AoMHg3Y2MyYzI2OSwgMHgxYzlkMjA0NCksIFdUQ1AoMHg3Y2IwZmFjYSwgMHgxY2VhMzhiMiksCisgICAgV1RDUCgweDdjOWVlOTkyLCAweDFkMzdiNGNjKSwgV1RDUCgweDdjOGM4ZTBjLCAweDFkODU5M2Y1KSwKKyAgICBXVENQKDB4N2M3OWU3ODIsIDB4MWRkM2Q1OTIpLCBXVENQKDB4N2M2NmY1NDEsIDB4MWUyMjc5MDMpLAorICAgIFdUQ1AoMHg3YzUzYjY5MiwgMHgxZTcxN2RhMyksIFdUQ1AoMHg3YzQwMmFjMywgMHgxZWMwZTJjZiksCisgICAgV1RDUCgweDdjMmM1MTIwLCAweDFmMTBhN2RjKSwgV1RDUCgweDdjMTgyOGY2LCAweDFmNjBjYzIxKSwKKyAgICBXVENQKDB4N2MwM2IxOTMsIDB4MWZiMTRlZWYpLCBXVENQKDB4N2JlZWVhNDQsIDB4MjAwMjJmOTYpLAorICAgIFdUQ1AoMHg3YmQ5ZDI1OSwgMHgyMDUzNmQ2MSksIFdUQ1AoMHg3YmM0NjkyMSwgMHgyMGE1MDc5YSksCisgICAgV1RDUCgweDdiYWVhZGVjLCAweDIwZjZmZDhhKSwgV1RDUCgweDdiOThhMDBiLCAweDIxNDk0ZTczKSwKKyAgICBXVENQKDB4N2I4MjNlY2YsIDB4MjE5YmY5OTgpLCBXVENQKDB4N2I2Yjg5OGIsIDB4MjFlZWZlMzcpLAorICAgIFdUQ1AoMHg3YjU0N2Y5MywgMHgyMjQyNWI4ZCksIFdUQ1AoMHg3YjNkMjAzYSwgMHgyMjk2MTBkNCksCisgICAgV1RDUCgweDdiMjU2YWQ1LCAweDIyZWExZDQyKSwgV1RDUCgweDdiMGQ1ZWJiLCAweDIzM2U4MDBjKSwKKyAgICBXVENQKDB4N2FmNGZiNDIsIDB4MjM5MzM4NjQpLCBXVENQKDB4N2FkYzNmYzIsIDB4MjNlODQ1N2EpLAorICAgIFdUQ1AoMHg3YWMzMmI5NSwgMHgyNDNkYTY3OSksIFdUQ1AoMHg3YWE5YmUxNCwgMHgyNDkzNWE4ZCksCisgICAgV1RDUCgweDdhOGZmNjlhLCAweDI0ZTk2MGRkKSwgV1RDUCgweDdhNzVkNDg1LCAweDI1M2ZiODhlKSwKKyAgICBXVENQKDB4N2E1YjU3MzEsIDB4MjU5NjYwYzMpLCBXVENQKDB4N2E0MDdkZmUsIDB4MjVlZDU4OWMpLAorICAgIFdUQ1AoMHg3YTI1NDg0YywgMHgyNjQ0OWYzOCksIFdUQ1AoMHg3YTA5YjU3YywgMHgyNjljMzNiMSksCisgICAgV1RDUCgweDc5ZWRjNGYxLCAweDI2ZjQxNTIyKSwgV1RDUCgweDc5ZDE3NjBlLCAweDI3NGM0MmEwKSwKKyAgICBXVENQKDB4NzliNGM4M2IsIDB4MjdhNGJiNDApLCBXVENQKDB4Nzk5N2JhZGQsIDB4MjdmZDdlMTUpLAorICAgIFdUQ1AoMHg3OTdhNGQ1ZSwgMHgyODU2OGEyZiksIFdUQ1AoMHg3OTVjN2YyNiwgMHgyOGFmZGU5YSksCisgICAgV1RDUCgweDc5M2U0ZmEzLCAweDI5MDk3YTYzKSwgV1RDUCgweDc5MWZiZTQwLCAweDI5NjM1YzkyKSwKKyAgICBXVENQKDB4NzkwMGNhNmUsIDB4MjliZDg0MmUpLCBXVENQKDB4NzhlMTczOWMsIDB4MmExN2YwM2UpLAorICAgIFdUQ1AoMHg3OGMxYjkzZCwgMHgyYTcyOWZjMiksIFdUQ1AoMHg3OGExOWFjNCwgMHgyYWNkOTFiYyksCisgICAgV1RDUCgweDc4ODExN2E3LCAweDJiMjhjNTJhKSwgV1RDUCgweDc4NjAyZjVlLCAweDJiODQzOTA5KSwKKyAgICBXVENQKDB4NzgzZWUxNjMsIDB4MmJkZmVjNTQpLCBXVENQKDB4NzgxZDJkMmYsIDB4MmMzYmRlMDIpLAorICAgIFdUQ1AoMHg3N2ZiMTI0MSwgMHgyYzk4MGQwYSksIFdUQ1AoMHg3N2Q4OTAxNywgMHgyY2Y0Nzg2MiksCisgICAgV1RDUCgweDc3YjVhNjMyLCAweDJkNTExZWZiKSwgV1RDUCgweDc3OTI1NDE2LCAweDJkYWRmZmM2KSwKKyAgICBXVENQKDB4Nzc2ZTk5NDcsIDB4MmUwYjE5YjMpLCBXVENQKDB4Nzc0YTc1NGQsIDB4MmU2ODZiYWUpLAorICAgIFdUQ1AoMHg3NzI1ZTdiMCwgMHgyZWM1ZjRhNCksIFdUQ1AoMHg3NzAwZWZmZCwgMHgyZjIzYjM3ZCksCisgICAgV1RDUCgweDc2ZGI4ZGJmLCAweDJmODFhNzIxKSwgV1RDUCgweDc2YjVjMDg4LCAweDJmZGZjZTc3KSwKKyAgICBXVENQKDB4NzY4Zjg3ZTgsIDB4MzAzZTI4NjMpLCBXVENQKDB4NzY2OGUzNzUsIDB4MzA5Y2IzYzgpLAorICAgIFdUQ1AoMHg3NjQxZDJjNCwgMHgzMGZiNmY4OCksIFdUQ1AoMHg3NjFhNTU2ZSwgMHgzMTVhNWE4MiksCisgICAgV1RDUCgweDc1ZjI2YjBlLCAweDMxYjk3Mzk0KSwgV1RDUCgweDc1Y2ExMzQxLCAweDMyMThiOTljKSwKKyAgICBXVENQKDB4NzVhMTRkYTgsIDB4MzI3ODJiNzQpLCBXVENQKDB4NzU3ODE5ZTQsIDB4MzJkN2M3ZjYpLAorICAgIFdUQ1AoMHg3NTRlNzc5YSwgMHgzMzM3OGRmYyksIFdUQ1AoMHg3NTI0NjY3MSwgMHgzMzk3N2M1YiksCisgICAgV1RDUCgweDc0ZjllNjEzLCAweDMzZjc5MWU5KSwgV1RDUCgweDc0Y2VmNjJiLCAweDM0NTdjZDdjKSwKKyAgICBXVENQKDB4NzRhMzk2NmEsIDB4MzRiODJkZTYpLCBXVENQKDB4NzQ3N2M2N2YsIDB4MzUxOGIxZjkpLAorICAgIFdUQ1AoMHg3NDRiODYxZSwgMHgzNTc5NTg4NyksIFdUQ1AoMHg3NDFlZDRmZiwgMHgzNWRhMjA1ZSksCisgICAgV1RDUCgweDczZjFiMmRhLCAweDM2M2IwODRlKSwgV1RDUCgweDczYzQxZjZiLCAweDM2OWMwZjI0KSwKKyAgICBXVENQKDB4NzM5NjFhNzEsIDB4MzZmZDMzYWMpLCBXVENQKDB4NzM2N2EzYWMsIDB4Mzc1ZTc0YjEpLAorICAgIFdUQ1AoMHg3MzM4YmFlMSwgMHgzN2JmZDBmZiksIFdUQ1AoMHg3MzA5NWZkNywgMHgzODIxNDc1ZiksCisgICAgV1RDUCgweDcyZDk5MjU3LCAweDM4ODJkNjk5KSwgV1RDUCgweDcyYTk1MjJkLCAweDM4ZTQ3ZDc1KSwKKyAgICBXVENQKDB4NzI3ODlmMjgsIDB4Mzk0NjNhYmEpLCBXVENQKDB4NzI0Nzc5MWIsIDB4MzlhODBkMmUpLAorICAgIFdUQ1AoMHg3MjE1ZGZkYSwgMHgzYTA5ZjM5NyksIFdUQ1AoMHg3MWUzZDMzZCwgMHgzYTZiZWNiYSksCisgICAgV1RDUCgweDcxYjE1MzFmLCAweDNhY2RmNzVhKSwgV1RDUCgweDcxN2U1ZjVkLCAweDNiMzAxMjNiKSwKKyAgICBXVENQKDB4NzE0YWY3ZDcsIDB4M2I5MjNjMjApLCBXVENQKDB4NzExNzFjNzIsIDB4M2JmNDczY2MpLAorICAgIFdUQ1AoMHg3MGUyY2QxNCwgMHgzYzU2YjdmZiksIFdUQ1AoMHg3MGFlMDlhNiwgMHgzY2I5MDc3YiksCisgICAgV1RDUCgweDcwNzhkMjE1LCAweDNkMWI2MTAxKSwgV1RDUCgweDcwNDMyNjRmLCAweDNkN2RjMzUzKSwKKyAgICBXVENQKDB4NzAwZDA2NDgsIDB4M2RlMDJkMmUpLCBXVENQKDB4NmZkNjcxZjUsIDB4M2U0MjlkNTUpLAorICAgIFdUQ1AoMHg2ZjlmNjk0ZiwgMHgzZWE1MTI4NSksIFdUQ1AoMHg2ZjY3ZWM1MiwgMHgzZjA3OGI3ZiksCisgICAgV1RDUCgweDZmMmZmYWZiLCAweDNmNmEwNzAxKSwgV1RDUCgweDZlZjc5NTRlLCAweDNmY2M4M2NhKSwKKyAgICBXVENQKDB4NmViZWJiNGUsIDB4NDAyZjAwOWEpLCBXVENQKDB4NmU4NTZkMDUsIDB4NDA5MTdjMmUpLAorICAgIFdUQ1AoMHg2ZTRiYWE3ZSwgMHg0MGYzZjU0NiksIFdUQ1AoMHg2ZTExNzNjNiwgMHg0MTU2NmFhMSksCisgICAgV1RDUCgweDZkZDZjOGVmLCAweDQxYjhkYWZjKSwgV1RDUCgweDZkOWJhYTBmLCAweDQyMWI0NTE4KSwKKyAgICBXVENQKDB4NmQ2MDE3M2QsIDB4NDI3ZGE3YjEpLCBXVENQKDB4NmQyNDEwOTQsIDB4NDJlMDAxODkpLAorICAgIFdUQ1AoMHg2Y2U3OTYzMiwgMHg0MzQyNTE1ZSksIFdUQ1AoMHg2Y2FhYTgzOSwgMHg0M2E0OTVlZiksCisgICAgV1RDUCgweDZjNmQ0NmNlLCAweDQ0MDZjZGZkKSwgV1RDUCgweDZjMmY3MjE4LCAweDQ0NjhmODQ4KSwKKyAgICBXVENQKDB4NmJmMTJhNDIsIDB4NDRjYjEzOGYpLCBXVENQKDB4NmJiMjZmN2IsIDB4NDUyZDFlOTQpLAorICAgIFdUQ1AoMHg2YjczNDFmNSwgMHg0NThmMTgxOCksIFdUQ1AoMHg2YjMzYTFlMywgMHg0NWYwZmVkZSksCisgICAgV1RDUCgweDZhZjM4ZjdlLCAweDQ2NTJkMWE2KSwgV1RDUCgweDZhYjMwYjAxLCAweDQ2YjQ4ZjM0KSwKKyAgICBXVENQKDB4NmE3MjE0YWIsIDB4NDcxNjM2NGMpLCBXVENQKDB4NmEzMGFjYmQsIDB4NDc3N2M1YjIpLAorICAgIFdUQ1AoMHg2OWVlZDM3YywgMHg0N2Q5M2MyYSksIFdUQ1AoMHg2OWFjODkzMCwgMHg0ODNhOTg3YSksCisgICAgV1RDUCgweDY5NjljZTI0LCAweDQ4OWJkOTY4KSwgV1RDUCgweDY5MjZhMmE4LCAweDQ4ZmNmZGJiKSwKKyAgICBXVENQKDB4NjhlMzA3MGMsIDB4NDk1ZTA0M2IpLCBXVENQKDB4Njg5ZWZiYTcsIDB4NDliZWViYjApLAorICAgIFdUQ1AoMHg2ODVhODBjZiwgMHg0YTFmYjJlNSksIFdUQ1AoMHg2ODE1OTZlMSwgMHg0YTgwNThhNCksCisgICAgV1RDUCgweDY3ZDAzZTNiLCAweDRhZTBkYmI4KSwgV1RDUCgweDY3OGE3NzNmLCAweDRiNDEzYWVlKSwKKyAgICBXVENQKDB4Njc0NDQyNTMsIDB4NGJhMTc1MTQpLCBXVENQKDB4NjZmZDlmZGUsIDB4NGMwMTg4ZjgpLAorICAgIFdUQ1AoMHg2NmI2OTA0YywgMHg0YzYxNzU2YiksIFdUQ1AoMHg2NjZmMTQwZCwgMHg0Y2MxMzkzZCksCisgICAgV1RDUCgweDY2MjcyYjkxLCAweDRkMjBkMzQxKSwgV1RDUCgweDY1ZGVkNzRkLCAweDRkODA0MjRhKSwKKyAgICBXVENQKDB4NjU5NjE3YmIsIDB4NGRkZjg1MmQpLCBXVENQKDB4NjU0Y2VkNTUsIDB4NGUzZTlhYzEpLAorICAgIFdUQ1AoMHg2NTAzNTg5YiwgMHg0ZTlkODFkYyksIFdUQ1AoMHg2NGI5NWEwZCwgMHg0ZWZjMzk1OSksCisgICAgV1RDUCgweDY0NmVmMjMwLCAweDRmNWFjMDEwKSwgV1RDUCgweDY0MjQyMThkLCAweDRmYjkxNGRmKSwKKyAgICBXVENQKDB4NjNkOGU4YWUsIDB4NTAxNzM2YTEpLCBXVENQKDB4NjM4ZDQ4MjIsIDB4NTA3NTI0MzgpLAorICAgIFdUQ1AoMHg2MzQxNDA3YSwgMHg1MGQyZGM4MiksIFdUQ1AoMHg2MmY0ZDI0YiwgMHg1MTMwNWU2MSksCisgICAgV1RDUCgweDYyYTdmZTJiLCAweDUxOGRhOGJiKSwgV1RDUCgweDYyNWFjNGI1LCAweDUxZWFiYTc0KSwKKyAgICBXVENQKDB4NjIwZDI2ODYsIDB4NTI0NzkyNzMpLCBXVENQKDB4NjFiZjI0NDAsIDB4NTJhNDJmYTIpLAorICAgIFdUQ1AoMHg2MTcwYmU4NSwgMHg1MzAwOTBlYSksIFdUQ1AoMHg2MTIxZjVmYiwgMHg1MzVjYjUzYSksCisgICAgV1RDUCgweDYwZDJjYjRlLCAweDUzYjg5YjdlKSwgV1RDUCgweDYwODMzZjI4LCAweDU0MTQ0MmE4KSwKKyAgICBXVENQKDB4NjAzMzUyMzksIDB4NTQ2ZmE5YTkpLCBXVENQKDB4NWZlMzA1MzMsIDB4NTRjYWNmNzcpLAorICAgIFdUQ1AoMHg1ZjkyNThjYywgMHg1NTI1YjMwNiksIFdUQ1AoMHg1ZjQxNGRiYiwgMHg1NTgwNTM1MCksCisgICAgV1RDUCgweDVlZWZlNGJjLCAweDU1ZGFhZjRlKSwgV1RDUCgweDVlOWUxZThjLCAweDU2MzRjNWZlKSwKKyAgICBXVENQKDB4NWU0YmZiZWMsIDB4NTY4ZTk2NWMpLCBXVENQKDB4NWRmOTdkOWUsIDB4NTZlODFmNmMpLAorICAgIFdUQ1AoMHg1ZGE2YTQ2YSwgMHg1NzQxNjAyZSksIFdUQ1AoMHg1ZDUzNzExOCwgMHg1NzlhNTdhOCksCisgICAgV1RDUCgweDVjZmZlNDc0LCAweDU3ZjMwNGUyKSwgV1RDUCgweDVjYWJmZjRjLCAweDU4NGI2NmU0KSwKKyAgICBXVENQKDB4NWM1N2MyNzEsIDB4NThhMzdjYmIpLCBXVENQKDB4NWMwMzJlYjcsIDB4NThmYjQ1NzYpLAorICAgIFdUQ1AoMHg1YmFlNDRmNCwgMHg1OTUyYzAyNCksIFdUQ1AoMHg1YjU5MDYwMiwgMHg1OWE5ZWJkOCksCisgICAgV1RDUCgweDViMDM3MmJiLCAweDVhMDBjN2E4KSwgV1RDUCgweDVhYWQ4YmZlLCAweDVhNTc1MmFjKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3c5NjBbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmZmOWUsIDB4MDAwOWU2YWMpLCBXVENQKDB4N2ZmZmZmMmIsIDB4MDAwZTk2ZDUpLAorICAgIFdUQ1AoMHg3ZmZmZmVhNiwgMHgwMDEyOTg3ZSksIFdUQ1AoMHg3ZmZmZmUwZSwgMHgwMDE2NTJiNiksCisgICAgV1RDUCgweDdmZmZmZDYwLCAweDAwMTllYmNlKSwgV1RDUCgweDdmZmZmYzljLCAweDAwMWQ3NmJmKSwKKyAgICBXVENQKDB4N2ZmZmZiYmYsIDB4MDAyMGZlNzkpLCBXVENQKDB4N2ZmZmZhYzksIDB4MDAyNDg5ZWYpLAorICAgIFdUQ1AoMHg3ZmZmZjliNywgMHgwMDI4MWRlMiksIFdUQ1AoMHg3ZmZmZjg4NywgMHgwMDJiYmRiYiksCisgICAgV1RDUCgweDdmZmZmNzM3LCAweDAwMmY2YzBkKSwgV1RDUCgweDdmZmZmNWM2LCAweDAwMzMyYWQ4KSwKKyAgICBXVENQKDB4N2ZmZmY0MzEsIDB4MDAzNmZiYjkpLCBXVENQKDB4N2ZmZmYyNzYsIDB4MDAzYWUwMDQpLAorICAgIFdUQ1AoMHg3ZmZmZjA5MiwgMHgwMDNlZDhkOCksIFdUQ1AoMHg3ZmZmZWU4NCwgMHgwMDQyZTcyZiksCisgICAgV1RDUCgweDdmZmZlYzQ4LCAweDAwNDcwYmUzKSwgV1RDUCgweDdmZmZlOWRkLCAweDAwNGI0N2I4KSwKKyAgICBXVENQKDB4N2ZmZmU3M2YsIDB4MDA0ZjliNWYpLCBXVENQKDB4N2ZmZmU0NmIsIDB4MDA1NDA3N2EpLAorICAgIFdUQ1AoMHg3ZmZmZTE1ZiwgMHgwMDU4OGNhMSksIFdUQ1AoMHg3ZmZmZGUxNywgMHgwMDVkMmI2MSksCisgICAgV1RDUCgweDdmZmZkYTkxLCAweDAwNjFlNDQyKSwgV1RDUCgweDdmZmZkNmM5LCAweDAwNjZiN2MyKSwKKyAgICBXVENQKDB4N2ZmZmQyYmIsIDB4MDA2YmE2NWMpLCBXVENQKDB4N2ZmZmNlNjUsIDB4MDA3MGIwODcpLAorICAgIFdUQ1AoMHg3ZmZmYzljMiwgMHgwMDc1ZDZiNSksIFdUQ1AoMHg3ZmZmYzRjZiwgMHgwMDdiMTk1NSksCisgICAgV1RDUCgweDdmZmZiZjg3LCAweDAwODA3OGQ1KSwgV1RDUCgweDdmZmZiOWU3LCAweDAwODVmNWEwKSwKKyAgICBXVENQKDB4N2ZmZmIzZWEsIDB4MDA4YjkwMWQpLCBXVENQKDB4N2ZmZmFkOGMsIDB4MDA5MTQ4YjQpLAorICAgIFdUQ1AoMHg3ZmZmYTZjOSwgMHgwMDk3MWZjYiksIFdUQ1AoMHg3ZmZmOWY5YywgMHgwMDlkMTVjNyksCisgICAgV1RDUCgweDdmZmY5ODAwLCAweDAwYTMyYjBiKSwgV1RDUCgweDdmZmY4ZmYwLCAweDAwYTk1ZmY5KSwKKyAgICBXVENQKDB4N2ZmZjg3NjcsIDB4MDBhZmI0ZjQpLCBXVENQKDB4N2ZmZjdlNWYsIDB4MDBiNjJhNWMpLAorICAgIFdUQ1AoMHg3ZmZmNzRkNCwgMHgwMGJjYzA5MyksIFdUQ1AoMHg3ZmZmNmFjMCwgMHgwMGMzNzdmOCksCisgICAgV1RDUCgweDdmZmY2MDFjLCAweDAwY2E1MGViKSwgV1RDUCgweDdmZmY1NGUzLCAweDAwZDE0YmNiKSwKKyAgICBXVENQKDB4N2ZmZjQ5MGUsIDB4MDBkODY4ZjcpLCBXVENQKDB4N2ZmZjNjOTgsIDB4MDBkZmE4Y2UpLAorICAgIFdUQ1AoMHg3ZmZmMmY3OSwgMHgwMGU3MGJhZCksIFdUQ1AoMHg3ZmZmMjFhYywgMHgwMGVlOTFmMyksCisgICAgV1RDUCgweDdmZmYxMzI4LCAweDAwZjYzYmZlKSwgV1RDUCgweDdmZmYwM2U3LCAweDAwZmUwYTJjKSwKKyAgICBXVENQKDB4N2ZmZWYzZTEsIDB4MDEwNWZjZDkpLCBXVENQKDB4N2ZmZWUzMTAsIDB4MDEwZTE0NjIpLAorICAgIFdUQ1AoMHg3ZmZlZDE2YSwgMHgwMTE2NTEyNiksIFdUQ1AoMHg3ZmZlYmVlOSwgMHgwMTFlYjM4MSksCisgICAgV1RDUCgweDdmZmVhYjgzLCAweDAxMjczYmQwKSwgV1RDUCgweDdmZmU5NzMxLCAweDAxMmZlYTZmKSwKKyAgICBXVENQKDB4N2ZmZTgxZWEsIDB4MDEzOGJmYmMpLCBXVENQKDB4N2ZmZTZiYTQsIDB4MDE0MWJjMTIpLAorICAgIFdUQ1AoMHg3ZmZlNTQ1NywgMHgwMTRhZGZjZSksIFdUQ1AoMHg3ZmZlM2JmYSwgMHgwMTU0MmI0ZCksCisgICAgV1RDUCgweDdmZmUyMjgyLCAweDAxNWQ5ZWU5KSwgV1RDUCgweDdmZmUwN2U2LCAweDAxNjczYjAxKSwKKyAgICBXVENQKDB4N2ZmZGVjMWIsIDB4MDE3MGZmZWUpLCBXVENQKDB4N2ZmZGNmMTcsIDB4MDE3YWVlMGUpLAorICAgIFdUQ1AoMHg3ZmZkYjBkMCwgMHgwMTg1MDViYyksIFdUQ1AoMHg3ZmZkOTEzYiwgMHgwMThmNDc1NCksCisgICAgV1RDUCgweDdmZmQ3MDRiLCAweDAxOTliMzMwKSwgV1RDUCgweDdmZmQ0ZGY3LCAweDAxYTQ0OWFkKSwKKyAgICBXVENQKDB4N2ZmZDJhMzEsIDB4MDFhZjBiMjUpLCBXVENQKDB4N2ZmZDA0ZWYsIDB4MDFiOWY3ZjQpLAorICAgIFdUQ1AoMHg3ZmZjZGUyMywgMHgwMWM1MTA3NCksIFdUQ1AoMHg3ZmZjYjVjMSwgMHgwMWQwNTUwMSksCisgICAgV1RDUCgweDdmZmM4YmJjLCAweDAxZGJjNWY1KSwgV1RDUCgweDdmZmM2MDA2LCAweDAxZTc2M2FiKSwKKyAgICBXVENQKDB4N2ZmYzMyOTMsIDB4MDFmMzJlN2QpLCBXVENQKDB4N2ZmYzAzNTQsIDB4MDFmZjI2YzUpLAorICAgIFdUQ1AoMHg3ZmZiZDIzYiwgMHgwMjBiNGNkZSksIFdUQ1AoMHg3ZmZiOWYzYSwgMHgwMjE3YTEyMCksCisgICAgV1RDUCgweDdmZmI2YTQxLCAweDAyMjQyM2U2KSwgV1RDUCgweDdmZmIzMzQyLCAweDAyMzBkNThhKSwKKyAgICBXVENQKDB4N2ZmYWZhMmQsIDB4MDIzZGI2NjQpLCBXVENQKDB4N2ZmYWJlZjIsIDB4MDI0YWM2Y2UpLAorICAgIFdUQ1AoMHg3ZmZhODE4MCwgMHgwMjU4MDcyMCksIFdUQ1AoMHg3ZmZhNDFjOSwgMHgwMjY1NzdiMyksCisgICAgV1RDUCgweDdmZjlmZmI5LCAweDAyNzMxOGUwKSwgV1RDUCgweDdmZjliYjQxLCAweDAyODBlYWZmKSwKKyAgICBXVENQKDB4N2ZmOTc0NGUsIDB4MDI4ZWVlNjgpLCBXVENQKDB4N2ZmOTJhY2YsIDB4MDI5ZDIzNzEpLAorICAgIFdUQ1AoMHg3ZmY4ZGViMSwgMHgwMmFiOGE3NCksIFdUQ1AoMHg3ZmY4OGZlMiwgMHgwMmJhMjNjNyksCisgICAgV1RDUCgweDdmZjgzZTRkLCAweDAyYzhlZmMwKSwgV1RDUCgweDdmZjdlOWUxLCAweDAyZDdlZWI3KSwKKyAgICBXVENQKDB4N2ZmNzkyODgsIDB4MDJlNzIxMDEpLCBXVENQKDB4N2ZmNzM4MmYsIDB4MDJmNjg2ZjUpLAorICAgIFdUQ1AoMHg3ZmY2ZGFjMSwgMHgwMzA2MjBlOSksIFdUQ1AoMHg3ZmY2N2EyOSwgMHgwMzE1ZWYzMSksCisgICAgV1RDUCgweDdmZjYxNjUxLCAweDAzMjVmMjI0KSwgV1RDUCgweDdmZjVhZjIzLCAweDAzMzYyYTE0KSwKKyAgICBXVENQKDB4N2ZmNTQ0OGEsIDB4MDM0Njk3NTgpLCBXVENQKDB4N2ZmNGQ2NmQsIDB4MDM1NzNhNDIpLAorICAgIFdUQ1AoMHg3ZmY0NjRiNywgMHgwMzY4MTMyNyksIFdUQ1AoMHg3ZmYzZWY0ZiwgMHgwMzc5MjI1YSksCisgICAgV1RDUCgweDdmZjM3NjFkLCAweDAzOGE2ODJlKSwgV1RDUCgweDdmZjJmOTBhLCAweDAzOWJlNGY0KSwKKyAgICBXVENQKDB4N2ZmMjc3ZmIsIDB4MDNhZDk5MDApLCBXVENQKDB4N2ZmMWYyZDgsIDB4MDNiZjg0YTMpLAorICAgIFdUQ1AoMHg3ZmYxNjk4NiwgMHgwM2QxYTgyZSksIFdUQ1AoMHg3ZmYwZGJlYywgMHgwM2U0MDNmMyksCisgICAgV1RDUCgweDdmZjA0OWVmLCAweDAzZjY5ODQwKSwgV1RDUCgweDdmZWZiMzczLCAweDA0MDk2NTY4KSwKKyAgICBXVENQKDB4N2ZlZjE4NWQsIDB4MDQxYzZiYjgpLCBXVENQKDB4N2ZlZTc4OTAsIDB4MDQyZmFiODEpLAorICAgIFdUQ1AoMHg3ZmVkZDNmMSwgMHgwNDQzMjUxMCksIFdUQ1AoMHg3ZmVkMmE2MSwgMHgwNDU2ZDhiNCksCisgICAgV1RDUCgweDdmZWM3YmM0LCAweDA0NmFjNmJhKSwgV1RDUCgweDdmZWJjN2ZiLCAweDA0N2VlZjcwKSwKKyAgICBXVENQKDB4N2ZlYjBlZTgsIDB4MDQ5MzUzMjIpLCBXVENQKDB4N2ZlYTUwNmIsIDB4MDRhN2YyMWQpLAorICAgIFdUQ1AoMHg3ZmU5OGM2NSwgMHgwNGJjY2NhYiksIFdUQ1AoMHg3ZmU4YzJiNywgMHgwNGQxZTMxOCksCisgICAgV1RDUCgweDdmZTdmMzNlLCAweDA0ZTczNWFmKSwgV1RDUCgweDdmZTcxZGRiLCAweDA0ZmNjNGJhKSwKKyAgICBXVENQKDB4N2ZlNjQyNmMsIDB4MDUxMjkwODEpLCBXVENQKDB4N2ZlNTYwY2UsIDB4MDUyODk5NGQpLAorICAgIFdUQ1AoMHg3ZmU0NzhkZiwgMHgwNTNlZGY2OCksIFdUQ1AoMHg3ZmUzOGE3YywgMHgwNTU1NjMxOCksCisgICAgV1RDUCgweDdmZTI5NTgxLCAweDA1NmMyNGE1KSwgV1RDUCgweDdmZTE5OWNhLCAweDA1ODMyNDU1KSwKKyAgICBXVENQKDB4N2ZlMDk3MzMsIDB4MDU5YTYyNmUpLCBXVENQKDB4N2ZkZjhkOTUsIDB4MDViMWRmMzUpLAorICAgIFdUQ1AoMHg3ZmRlN2NjYiwgMHgwNWM5OWFlZiksIFdUQ1AoMHg3ZmRkNjRhZiwgMHgwNWUxOTVlMCksCisgICAgV1RDUCgweDdmZGM0NTFhLCAweDA1ZjlkMDRiKSwgV1RDUCgweDdmZGIxZGU0LCAweDA2MTI0YTczKSwKKyAgICBXVENQKDB4N2ZkOWVlZTUsIDB4MDYyYjA0OTkpLCBXVENQKDB4N2ZkOGI3ZjUsIDB4MDY0M2ZmMDApLAorICAgIFdUQ1AoMHg3ZmQ3NzhlYywgMHgwNjVkMzllNyksIFdUQ1AoMHg3ZmQ2MzE5ZSwgMHgwNjc2YjU4ZiksCisgICAgV1RDUCgweDdmZDRlMWUyLCAweDA2OTA3MjM3KSwgV1RDUCgweDdmZDM4OThkLCAweDA2YWE3MDFkKSwKKyAgICBXVENQKDB4N2ZkMjI4NzMsIDB4MDZjNGFmODApLCBXVENQKDB4N2ZkMGJlNmEsIDB4MDZkZjMwOWMpLAorICAgIFdUQ1AoMHg3ZmNmNGI0NCwgMHgwNmY5ZjNhZCksIFdUQ1AoMHg3ZmNkY2VkNCwgMHgwNzE0ZjhmMCksCisgICAgV1RDUCgweDdmY2M0OGVkLCAweDA3MzA0MDlmKSwgV1RDUCgweDdmY2FiOTYwLCAweDA3NGJjYWY1KSwKKyAgICBXVENQKDB4N2ZjOTFmZmYsIDB4MDc2Nzk4MmEpLCBXVENQKDB4N2ZjNzdjOWEsIDB4MDc4M2E4NzcpLAorICAgIFdUQ1AoMHg3ZmM1Y2YwMiwgMHgwNzlmZmMxNCksIFdUQ1AoMHg3ZmM0MTcwNSwgMHgwN2JjOTMzOCksCisgICAgV1RDUCgweDdmYzI1NDc0LCAweDA3ZDk2ZTE5KSwgV1RDUCgweDdmYzA4NzFiLCAweDA3ZjY4Y2VkKSwKKyAgICBXVENQKDB4N2ZiZWFlY2EsIDB4MDgxM2VmZTcpLCBXVENQKDB4N2ZiY2NiNGMsIDB4MDgzMTk3M2QpLAorICAgIFdUQ1AoMHg3ZmJhZGM3MCwgMHgwODRmODMyMCksIFdUQ1AoMHg3ZmI4ZTIwMCwgMHgwODZkYjNjMyksCisgICAgV1RDUCgweDdmYjZkYmM4LCAweDA4OGMyOTU3KSwgV1RDUCgweDdmYjRjOTkzLCAweDA4YWFlNDBjKSwKKyAgICBXVENQKDB4N2ZiMmFiMmIsIDB4MDhjOWU0MTIpLCBXVENQKDB4N2ZiMDgwNWEsIDB4MDhlOTI5OTcpLAorICAgIFdUQ1AoMHg3ZmFlNDhlOSwgMHgwOTA4YjRjOSksIFdUQ1AoMHg3ZmFjMDRhMCwgMHgwOTI4ODVkNiksCisgICAgV1RDUCgweDdmYTliMzQ3LCAweDA5NDg5Y2U4KSwgV1RDUCgweDdmYTc1NGE2LCAweDA5NjhmYTJjKSwKKyAgICBXVENQKDB4N2ZhNGU4ODQsIDB4MDk4OTlkY2IpLCBXVENQKDB4N2ZhMjZlYTYsIDB4MDlhYTg3ZWUpLAorICAgIFdUQ1AoMHg3ZjlmZTZkMSwgMHgwOWNiYjhiZSksIFdUQ1AoMHg3ZjlkNTBjYywgMHgwOWVkMzA2MiksCisgICAgV1RDUCgweDdmOWFhYzVhLCAweDBhMGVlZjAwKSwgV1RDUCgweDdmOTdmOTNmLCAweDBhMzBmNGJmKSwKKyAgICBXVENQKDB4N2Y5NTM3M2UsIDB4MGE1MzQxYzIpLCBXVENQKDB4N2Y5MjY2MWIsIDB4MGE3NWQ2MmUpLAorICAgIFdUQ1AoMHg3ZjhmODU5NiwgMHgwYTk4YjIyNCksIFdUQ1AoMHg3ZjhjOTU3MiwgMHgwYWJiZDVjNyksCisgICAgV1RDUCgweDdmODk5NTZmLCAweDBhZGY0MTM3KSwgV1RDUCgweDdmODY4NTRkLCAweDBiMDJmNDk0KSwKKyAgICBXVENQKDB4N2Y4MzY0Y2QsIDB4MGIyNmVmZmQpLCBXVENQKDB4N2Y4MDMzYWUsIDB4MGI0YjMzOGYpLAorICAgIFdUQ1AoMHg3ZjdjZjFhZSwgMHgwYjZmYmY2NyksIFdUQ1AoMHg3Zjc5OWU4YiwgMHgwYjk0OTNhMCksCisgICAgV1RDUCgweDdmNzYzYTAzLCAweDBiYjliMDU2KSwgV1RDUCgweDdmNzJjM2QyLCAweDBiZGYxNWEyKSwKKyAgICBXVENQKDB4N2Y2ZjNiYjUsIDB4MGMwNGMzOWMpLCBXVENQKDB4N2Y2YmExNjgsIDB4MGMyYWJhNWQpLAorICAgIFdUQ1AoMHg3ZjY3ZjRhNiwgMHgwYzUwZjlmYSksIFdUQ1AoMHg3ZjY0MzUyOSwgMHgwYzc3ODI4YSksCisgICAgV1RDUCgweDdmNjA2MmFjLCAweDBjOWU1NDIwKSwgV1RDUCgweDdmNWM3Y2U4LCAweDBjYzU2ZWQxKSwKKyAgICBXVENQKDB4N2Y1ODgzOTcsIDB4MGNlY2QyYWUpLCBXVENQKDB4N2Y1NDc2NzAsIDB4MGQxNDdmYzgpLAorICAgIFdUQ1AoMHg3ZjUwNTUyYywgMHgwZDNjNzYzMCksIFdUQ1AoMHg3ZjRjMWY4MywgMHgwZDY0YjVmNiksCisgICAgV1RDUCgweDdmNDdkNTJhLCAweDBkOGQzZjI2KSwgV1RDUCgweDdmNDM3NWQ5LCAweDBkYjYxMWNlKSwKKyAgICBXVENQKDB4N2YzZjAxNDQsIDB4MGRkZjJkZmEpLCBXVENQKDB4N2YzYTc3MjMsIDB4MGUwODkzYjQpLAorICAgIFdUQ1AoMHg3ZjM1ZDcyOSwgMHgwZTMyNDMwNiksIFdUQ1AoMHg3ZjMxMjEwYSwgMHgwZTVjM2JmOSksCisgICAgV1RDUCgweDdmMmM1NDdiLCAweDBlODY3ZTk0KSwgV1RDUCgweDdmMjc3MTJlLCAweDBlYjEwYWRkKSwKKyAgICBXVENQKDB4N2YyMjc2ZDgsIDB4MGVkYmUwZGEpLCBXVENQKDB4N2YxZDY1MjksIDB4MGYwNzAwOGUpLAorICAgIFdUQ1AoMHg3ZjE4M2JkMywgMHgwZjMyNjlmYyksIFdUQ1AoMHg3ZjEyZmE4OSwgMHgwZjVlMWQyNyksCisgICAgV1RDUCgweDdmMGRhMGZiLCAweDBmOGExYTBlKSwgV1RDUCgweDdmMDgyZWQ4LCAweDBmYjY2MGIxKSwKKyAgICBXVENQKDB4N2YwMmEzZDIsIDB4MGZlMmYxMGYpLCBXVENQKDB4N2VmY2ZmOTgsIDB4MTAwZmNiMjUpLAorICAgIFdUQ1AoMHg3ZWY3NDFkOSwgMHgxMDNjZWVlZSksIFdUQ1AoMHg3ZWYxNmE0MiwgMHgxMDZhNWM2NiksCisgICAgV1RDUCgweDdlZWI3ODg0LCAweDEwOTgxMzg2KSwgV1RDUCgweDdlZTU2YzRhLCAweDEwYzYxNDQ3KSwKKyAgICBXVENQKDB4N2VkZjQ1NDMsIDB4MTBmNDVlYTApLCBXVENQKDB4N2VkOTAzMWIsIDB4MTEyMmYyODgpLAorICAgIFdUQ1AoMHg3ZWQyYTU3ZiwgMHgxMTUxY2ZmMyksIFdUQ1AoMHg3ZWNjMmMxYSwgMHgxMTgwZjZkNSksCisgICAgV1RDUCgweDdlYzU5Njk5LCAweDExYjA2NzIwKSwgV1RDUCgweDdlYmVlNGE2LCAweDExZTAyMGM4KSwKKyAgICBXVENQKDB4N2ViODE1ZWQsIDB4MTIxMDIzYmEpLCBXVENQKDB4N2ViMTJhMTgsIDB4MTI0MDZmZTgpLAorICAgIFdUQ1AoMHg3ZWFhMjBkMSwgMHgxMjcxMDUzZSksIFdUQ1AoMHg3ZWEyZjljMiwgMHgxMmExZTNhOSksCisgICAgV1RDUCgweDdlOWJiNDk0LCAweDEyZDMwYjE1KSwgV1RDUCgweDdlOTQ1MGYwLCAweDEzMDQ3YjZjKSwKKyAgICBXVENQKDB4N2U4Y2NlN2YsIDB4MTMzNjM0OTcpLCBXVENQKDB4N2U4NTJjZTksIDB4MTM2ODM2N2YpLAorICAgIFdUQ1AoMHg3ZTdkNmJkNiwgMHgxMzlhODEwOSksIFdUQ1AoMHg3ZTc1OGFlZSwgMHgxM2NkMTQxYiksCisgICAgV1RDUCgweDdlNmQ4OWQ5LCAweDEzZmZlZjk5KSwgV1RDUCgweDdlNjU2ODNkLCAweDE0MzMxMzY4KSwKKyAgICBXVENQKDB4N2U1ZDI1YzEsIDB4MTQ2NjdmNjcpLCBXVENQKDB4N2U1NGMyMGIsIDB4MTQ5YTMzNzkpLAorICAgIFdUQ1AoMHg3ZTRjM2NjMywgMHgxNGNlMmY3YyksIFdUQ1AoMHg3ZTQzOTU4ZSwgMHgxNTAyNzM0ZiksCisgICAgV1RDUCgweDdlM2FjYzExLCAweDE1MzZmZWNlKSwgV1RDUCgweDdlMzFkZmYyLCAweDE1NmJkMWQ2KSwKKyAgICBXVENQKDB4N2UyOGQwZDcsIDB4MTVhMGVjNDEpLCBXVENQKDB4N2UxZjllNjMsIDB4MTVkNjRkZTkpLAorICAgIFdUQ1AoMHg3ZTE2NDgzZCwgMHgxNjBiZjZhNSksIFdUQ1AoMHg3ZTBjY2UwOCwgMHgxNjQxZTY0YyksCisgICAgV1RDUCgweDdlMDMyZjZhLCAweDE2NzgxY2I0KSwgV1RDUCgweDdkZjk2YzA1LCAweDE2YWU5OWIyKSwKKyAgICBXVENQKDB4N2RlZjgzN2UsIDB4MTZlNTVkMTgpLCBXVENQKDB4N2RlNTc1NzksIDB4MTcxYzY2YmEpLAorICAgIFdUQ1AoMHg3ZGRiNDE5YSwgMHgxNzUzYjY2NyksIFdUQ1AoMHg3ZGQwZTc4NCwgMHgxNzhiNGJlZiksCisgICAgV1RDUCgweDdkYzY2NmQ5LCAweDE3YzMyNzIxKSwgV1RDUCgweDdkYmJiZjNlLCAweDE3ZmI0N2NhKSwKKyAgICBXVENQKDB4N2RiMGYwNTYsIDB4MTgzM2FkYjUpLCBXVENQKDB4N2RhNWY5YzMsIDB4MTg2YzU4YWUpLAorICAgIFdUQ1AoMHg3ZDlhZGIyOSwgMHgxOGE1NDg3ZCksIFdUQ1AoMHg3ZDhmOTQyOSwgMHgxOGRlN2NlYyksCisgICAgV1RDUCgweDdkODQyNDY3LCAweDE5MTdmNWMxKSwgV1RDUCgweDdkNzg4Yjg2LCAweDE5NTFiMmMyKSwKKyAgICBXVENQKDB4N2Q2Y2M5MjcsIDB4MTk4YmIzYjQpLCBXVENQKDB4N2Q2MGRjZWQsIDB4MTljNWY4NWEpLAorICAgIFdUQ1AoMHg3ZDU0YzY3YywgMHgxYTAwODA3NyksIFdUQ1AoMHg3ZDQ4ODU3NCwgMHgxYTNiNGJjYiksCisgICAgV1RDUCgweDdkM2MxOTc5LCAweDFhNzY1YTE3KSwgV1RDUCgweDdkMmY4MjJkLCAweDFhYjFhYjE4KSwKKyAgICBXVENQKDB4N2QyMmJmMzIsIDB4MWFlZDNlOGQpLCBXVENQKDB4N2QxNWQwMmIsIDB4MWIyOTE0MzIpLAorICAgIFdUQ1AoMHg3ZDA4YjRiYSwgMHgxYjY1MmJjMSksIFdUQ1AoMHg3Y2ZiNmM4MiwgMHgxYmExODRmNSksCisgICAgV1RDUCgweDdjZWRmNzI1LCAweDFiZGUxZjg2KSwgV1RDUCgweDdjZTA1NDQ1LCAweDFjMWFmYjJjKSwKKyAgICBXVENQKDB4N2NkMjgzODYsIDB4MWM1ODE3OWMpLCBXVENQKDB4N2NjNDg0ODksIDB4MWM5NTc0OGQpLAorICAgIFdUQ1AoMHg3Y2I2NTZmMywgMHgxY2QzMTFiMSksIFdUQ1AoMHg3Y2E3ZmE2NSwgMHgxZDEwZWViZCksCisgICAgV1RDUCgweDdjOTk2ZTgzLCAweDFkNGYwYjYwKSwgV1RDUCgweDdjOGFiMmYwLCAweDFkOGQ2NzRjKSwKKyAgICBXVENQKDB4N2M3YmM3NGYsIDB4MWRjYzAyMzApLCBXVENQKDB4N2M2Y2FiNDQsIDB4MWUwYWRiYmIpLAorICAgIFdUQ1AoMHg3YzVkNWU3MSwgMHgxZTQ5ZjM5OCksIFdUQ1AoMHg3YzRkZTA3YywgMHgxZTg5NDk3MyksCisgICAgV1RDUCgweDdjM2UzMTA4LCAweDFlYzhkY2Y4KSwgV1RDUCgweDdjMmU0ZmI5LCAweDFmMDhhZGQwKSwKKyAgICBXVENQKDB4N2MxZTNjMzQsIDB4MWY0OGJiYTMpLCBXVENQKDB4N2MwZGY2MWQsIDB4MWY4OTA2MTgpLAorICAgIFdUQ1AoMHg3YmZkN2QxOCwgMHgxZmM5OGNkNiksIFdUQ1AoMHg3YmVjZDBjYywgMHgyMDBhNGY4MCksCisgICAgV1RDUCgweDdiZGJmMGRkLCAweDIwNGI0ZGJjKSwgV1RDUCgweDdiY2FkY2YxLCAweDIwOGM4NzJjKSwKKyAgICBXVENQKDB4N2JiOTk0YWUsIDB4MjBjZGZiNzEpLCBXVENQKDB4N2JhODE3YjksIDB4MjEwZmFhMmMpLAorICAgIFdUQ1AoMHg3Yjk2NjViYiwgMHgyMTUxOTJmYyksIFdUQ1AoMHg3Yjg0N2U1OCwgMHgyMTkzYjU3ZiksCisgICAgV1RDUCgweDdiNzI2MTM5LCAweDIxZDYxMTUzKSwgV1RDUCgweDdiNjAwZTA1LCAweDIyMThhNjE0KSwKKyAgICBXVENQKDB4N2I0ZDg0NjMsIDB4MjI1YjczNWQpLCBXVENQKDB4N2IzYWMzZmMsIDB4MjI5ZTc4YzcpLAorICAgIFdUQ1AoMHg3YjI3Y2M3OSwgMHgyMmUxYjVlYiksIFdUQ1AoMHg3YjE0OWQ4MiwgMHgyMzI1MmE2MiksCisgICAgV1RDUCgweDdiMDEzNmMxLCAweDIzNjhkNWMyKSwgV1RDUCgweDdhZWQ5N2RmLCAweDIzYWNiN2EwKSwKKyAgICBXVENQKDB4N2FkOWMwODcsIDB4MjNmMGNmOTIpLCBXVENQKDB4N2FjNWIwNjMsIDB4MjQzNTFkMmEpLAorICAgIFdUQ1AoMHg3YWIxNjcxZSwgMHgyNDc5OWZmYyksIFdUQ1AoMHg3YTljZTQ2NCwgMHgyNGJlNTc5OSksCisgICAgV1RDUCgweDdhODgyN2UxLCAweDI1MDM0MzkxKSwgV1RDUCgweDdhNzMzMTQyLCAweDI1NDg2Mzc1KSwKKyAgICBXVENQKDB4N2E1ZTAwMzMsIDB4MjU4ZGI2ZDIpLCBXVENQKDB4N2E0ODk0NjEsIDB4MjVkMzNkMzUpLAorICAgIFdUQ1AoMHg3YTMyZWQ3YywgMHgyNjE4ZjYyYyksIFdUQ1AoMHg3YTFkMGIzMSwgMHgyNjVlZTE0MyksCisgICAgV1RDUCgweDdhMDZlZDJmLCAweDI2YTRmZTAyKSwgV1RDUCgweDc5ZjA5MzI3LCAweDI2ZWI0YmY1KSwKKyAgICBXVENQKDB4NzlkOWZjYzgsIDB4MjczMWNhYTMpLCBXVENQKDB4NzljMzI5YzIsIDB4Mjc3ODc5OTUpLAorICAgIFdUQ1AoMHg3OWFjMTljOSwgMHgyN2JmNTg1MCksIFdUQ1AoMHg3OTk0Y2M4ZCwgMHgyODA2NjY1YyksCisgICAgV1RDUCgweDc5N2Q0MWMxLCAweDI4NGRhMzNjKSwgV1RDUCgweDc5NjU3OTE4LCAweDI4OTUwZTc0KSwKKyAgICBXVENQKDB4Nzk0ZDcyNDcsIDB4MjhkY2E3ODgpLCBXVENQKDB4NzkzNTJkMDEsIDB4MjkyNDZkZmEpLAorICAgIFdUQ1AoMHg3OTFjYThmYywgMHgyOTZjNjE0YSksIFdUQ1AoMHg3OTAzZTVlZSwgMHgyOWI0ODBmOSksCisgICAgV1RDUCgweDc4ZWFlMzhkLCAweDI5ZmNjYzg3KSwgV1RDUCgweDc4ZDFhMTkxLCAweDJhNDU0MzcyKSwKKyAgICBXVENQKDB4NzhiODFmYjEsIDB4MmE4ZGU1MzcpLCBXVENQKDB4Nzg5ZTVkYTYsIDB4MmFkNmIxNTUpLAorICAgIFdUQ1AoMHg3ODg0NWIyOSwgMHgyYjFmYTc0NSksIFdUQ1AoMHg3ODZhMTdmNSwgMHgyYjY4YzY4NCksCisgICAgV1RDUCgweDc4NGY5M2M0LCAweDJiYjIwZThjKSwgV1RDUCgweDc4MzRjZTUzLCAweDJiZmI3ZWQ3KSwKKyAgICBXVENQKDB4NzgxOWM3NWMsIDB4MmM0NTE2ZGMpLCBXVENQKDB4NzdmZTdlOWUsIDB4MmM4ZWQ2MTUpLAorICAgIFdUQ1AoMHg3N2UyZjNkNywgMHgyY2Q4YmJmNyksIFdUQ1AoMHg3N2M3MjZjNSwgMHgyZDIyYzdmYSksCisgICAgV1RDUCgweDc3YWIxNzI4LCAweDJkNmNmOTkzKSwgV1RDUCgweDc3OGVjNGMwLCAweDJkYjc1MDM3KSwKKyAgICBXVENQKDB4Nzc3MjJmNGUsIDB4MmUwMWNiNTkpLCBXVENQKDB4Nzc1NTU2OTUsIDB4MmU0YzZhNmQpLAorICAgIFdUQ1AoMHg3NzM4M2E1OCwgMHgyZTk3MmNlNiksIFdUQ1AoMHg3NzFhZGE1YSwgMHgyZWUyMTIzNSksCisgICAgV1RDUCgweDc2ZmQzNjYwLCAweDJmMmQxOWNjKSwgV1RDUCgweDc2ZGY0ZTMwLCAweDJmNzg0MzFhKSwKKyAgICBXVENQKDB4NzZjMTIxOTAsIDB4MmZjMzhkOTEpLCBXVENQKDB4NzZhMmIwNDcsIDB4MzAwZWY4OWQpLAorICAgIFdUQ1AoMHg3NjgzZmExZSwgMHgzMDVhODNhZiksIFdUQ1AoMHg3NjY0ZmVkZSwgMHgzMGE2MmUzNCksCisgICAgV1RDUCgweDc2NDViZTUxLCAweDMwZjFmNzk4KSwgV1RDUCgweDc2MjYzODQyLCAweDMxM2RkZjQ5KSwKKyAgICBXVENQKDB4NzYwNjZjN2UsIDB4MzE4OWU0YjEpLCBXVENQKDB4NzVlNjVhZDEsIDB4MzFkNjA3M2QpLAorICAgIFdUQ1AoMHg3NWM2MDMwOSwgMHgzMjIyNDY1NyksIFdUQ1AoMHg3NWE1NjRmNiwgMHgzMjZlYTE2OCksCisgICAgV1RDUCgweDc1ODQ4MDY3LCAweDMyYmIxN2RhKSwgV1RDUCgweDc1NjM1NTJkLCAweDMzMDdhOTE3KSwKKyAgICBXVENQKDB4NzU0MWUzMWEsIDB4MzM1NDU0ODYpLCBXVENQKDB4NzUyMDJhMDIsIDB4MzNhMTE5OGUpLAorICAgIFdUQ1AoMHg3NGZlMjliOCwgMHgzM2VkZjc5OCksIFdUQ1AoMHg3NGRiZTIxMSwgMHgzNDNhZWUwOSksCisgICAgV1RDUCgweDc0Yjk1MmUzLCAweDM0ODdmYzQ4KSwgV1RDUCgweDc0OTY3YzA2LCAweDM0ZDUyMWJiKSwKKyAgICBXVENQKDB4NzQ3MzVkNTEsIDB4MzUyMjVkYzcpLCBXVENQKDB4NzQ0ZmY2OWYsIDB4MzU2ZmFmY2YpLAorICAgIFdUQ1AoMHg3NDJjNDdjOSwgMHgzNWJkMTczYSksIFdUQ1AoMHg3NDA4NTBhYiwgMHgzNjBhOTM2OSksCisgICAgV1RDUCgweDczZTQxMTIxLCAweDM2NTgyM2MxKSwgV1RDUCgweDczYmY4OTA5LCAweDM2YTVjN2E0KSwKKyAgICBXVENQKDB4NzM5YWI4NDIsIDB4MzZmMzdlNzUpLCBXVENQKDB4NzM3NTllYWIsIDB4Mzc0MTQ3OTYpLAorICAgIFdUQ1AoMHg3MzUwM2MyNiwgMHgzNzhmMjI2OCksIFdUQ1AoMHg3MzJhOTA5NSwgMHgzN2RkMGU0YyksCisgICAgV1RDUCgweDczMDQ5YmRhLCAweDM4MmIwYWE0KSwgV1RDUCgweDcyZGU1ZGRiLCAweDM4NzkxNmQwKSwKKyAgICBXVENQKDB4NzJiN2Q2N2QsIDB4MzhjNzMyMzApLCBXVENQKDB4NzI5MTA1YTYsIDB4MzkxNTVjMjQpLAorICAgIFdUQ1AoMHg3MjY5ZWIzZiwgMHgzOTYzOTQwYyksIFdUQ1AoMHg3MjQyODczMCwgMHgzOWIxZDk0NiksCisgICAgV1RDUCgweDcyMWFkOTY0LCAweDNhMDAyYjMxKSwgV1RDUCgweDcxZjJlMWM1LCAweDNhNGU4OTJjKSwKKyAgICBXVENQKDB4NzFjYWEwNDIsIDB4M2E5Y2YyOTYpLCBXVENQKDB4NzFhMjE0YzcsIDB4M2FlYjY2Y2MpLAorICAgIFdUQ1AoMHg3MTc5M2Y0MywgMHgzYjM5ZTUyYyksIFdUQ1AoMHg3MTUwMWZhNiwgMHgzYjg4NmQxNCksCisgICAgV1RDUCgweDcxMjZiNWUzLCAweDNiZDZmZGUxKSwgV1RDUCgweDcwZmQwMWViLCAweDNjMjU5NmYxKSwKKyAgICBXVENQKDB4NzBkMzAzYjIsIDB4M2M3NDM3OWYpLCBXVENQKDB4NzBhOGJiMmUsIDB4M2NjMmRmNDkpLAorICAgIFdUQ1AoMHg3MDdlMjg1NSwgMHgzZDExOGQ0YyksIFdUQ1AoMHg3MDUzNGIxZSwgMHgzZDYwNDEwMyksCisgICAgV1RDUCgweDcwMjgyMzgxLCAweDNkYWVmOWNjKSwgV1RDUCgweDZmZmNiMTdhLCAweDNkZmRiNzAyKSwKKyAgICBXVENQKDB4NmZkMGY1MDQsIDB4M2U0Yzc4MDApLCBXVENQKDB4NmZhNGVlMWEsIDB4M2U5YjNjMjUpLAorICAgIFdUQ1AoMHg2Zjc4OWNiYiwgMHgzZWVhMDJjYSksIFdUQ1AoMHg2ZjRjMDBlNSwgMHgzZjM4Y2I0YiksCisgICAgV1RDUCgweDZmMWYxYTlhLCAweDNmODc5NTA1KSwgV1RDUCgweDZlZjFlOWRhLCAweDNmZDY1ZjUzKSwKKyAgICBXVENQKDB4NmVjNDZlYTksIDB4NDAyNTI5OTApLCBXVENQKDB4NmU5NmE5MGIsIDB4NDA3M2YzMTgpLAorICAgIFdUQ1AoMHg2ZTY4OTkwNSwgMHg0MGMyYmI0NiksIFdUQ1AoMHg2ZTNhM2U5ZCwgMHg0MTExODE3NiksCisgICAgV1RDUCgweDZlMGI5OWRkLCAweDQxNjA0NTA0KSwgV1RDUCgweDZkZGNhYWNjLCAweDQxYWYwNTRhKSwKKyAgICBXVENQKDB4NmRhZDcxNzcsIDB4NDFmZGMxYTUpLCBXVENQKDB4NmQ3ZGVkZTgsIDB4NDI0Yzc5NzApLAorICAgIFdUQ1AoMHg2ZDRlMjAyZSwgMHg0MjliMmMwNiksIFdUQ1AoMHg2ZDFlMDg1NSwgMHg0MmU5ZDhjNCksCisgICAgV1RDUCgweDZjZWRhNjZmLCAweDQzMzg3ZjA1KSwgV1RDUCgweDZjYmNmYThkLCAweDQzODcxZTI2KSwKKyAgICBXVENQKDB4NmM4YzA0YzAsIDB4NDNkNWI1ODEpLCBXVENQKDB4NmM1YWM1MWQsIDB4NDQyNDQ0NzQpLAorICAgIFdUQ1AoMHg2YzI5M2JiOCwgMHg0NDcyY2E1YSksIFdUQ1AoMHg2YmY3NjhhOCwgMHg0NGMxNDY5MCksCisgICAgV1RDUCgweDZiYzU0YzA2LCAweDQ1MGZiODczKSwgV1RDUCgweDZiOTJlNWU5LCAweDQ1NWUxZjVmKSwKKyAgICBXVENQKDB4NmI2MDM2NmMsIDB4NDVhYzdhYjIpLCBXVENQKDB4NmIyZDNkYWIsIDB4NDVmYWM5YzgpLAorICAgIFdUQ1AoMHg2YWY5ZmJjMiwgMHg0NjQ5MGJmZiksIFdUQ1AoMHg2YWM2NzBkMSwgMHg0Njk3NDBiNSksCisgICAgV1RDUCgweDZhOTI5Y2Y2LCAweDQ2ZTU2NzQ3KSwgV1RDUCgweDZhNWU4MDUzLCAweDQ3MzM3ZjEzKSwKKyAgICBXVENQKDB4NmEyYTFiMGEsIDB4NDc4MTg3NzkpLCBXVENQKDB4NjlmNTZkM2UsIDB4NDdjZjdmZDYpLAorICAgIFdUQ1AoMHg2OWMwNzcxNSwgMHg0ODFkNjc4YSksIFdUQ1AoMHg2OThiMzhiNCwgMHg0ODZiM2RmMyksCisgICAgV1RDUCgweDY5NTViMjQzLCAweDQ4YjkwMjcyKSwgV1RDUCgweDY5MWZlM2VjLCAweDQ5MDZiNDY2KSwKKyAgICBXVENQKDB4NjhlOWNkZDgsIDB4NDk1NDUzMzApLCBXVENQKDB4NjhiMzcwMzMsIDB4NDlhMWRlMzApLAorICAgIFdUQ1AoMHg2ODdjY2IyOSwgMHg0OWVmNTRjOCksIFdUQ1AoMHg2ODQ1ZGVlOSwgMHg0YTNjYjY1NyksCisgICAgV1RDUCgweDY4MGVhYmEzLCAweDRhOGEwMjQyKSwgV1RDUCgweDY3ZDczMTg3LCAweDRhZDczN2U5KSwKKyAgICBXVENQKDB4Njc5ZjcwYzcsIDB4NGIyNDU2YWYpLCBXVENQKDB4Njc2NzY5OTcsIDB4NGI3MTVkZjcpLAorICAgIFdUQ1AoMHg2NzJmMWMyYiwgMHg0YmJlNGQyNSksIFdUQ1AoMHg2NmY2ODhiYSwgMHg0YzBiMjM5YyksCisgICAgV1RDUCgweDY2YmRhZjdiLCAweDRjNTdlMGMyKSwgV1RDUCgweDY2ODQ5MGE2LCAweDRjYTQ4M2ZhKSwKKyAgICBXVENQKDB4NjY0YjJjNzYsIDB4NGNmMTBjYWMpLCBXVENQKDB4NjYxMTgzMjYsIDB4NGQzZDdhM2IpLAorICAgIFdUQ1AoMHg2NWQ3OTRmMywgMHg0ZDg5Y2MwZiksIFdUQ1AoMHg2NTlkNjIxYSwgMHg0ZGQ2MDE4ZiksCisgICAgV1RDUCgweDY1NjJlYWRhLCAweDRlMjIxYTIyKSwgV1RDUCgweDY1MjgyZjc0LCAweDRlNmUxNTMwKSwKKyAgICBXVENQKDB4NjRlZDMwMmIsIDB4NGViOWYyMjIpLCBXVENQKDB4NjRiMWVkNDAsIDB4NGYwNWIwNjEpLAorICAgIFdUQ1AoMHg2NDc2NjZmOCwgMHg0ZjUxNGY1NyksIFdUQ1AoMHg2NDNhOWQ5OSwgMHg0ZjljY2U2ZiksCisgICAgV1RDUCgweDYzZmU5MTZhLCAweDRmZTgyZDEzKSwgV1RDUCgweDYzYzI0MmIyLCAweDUwMzM2YWFmKSwKKyAgICBXVENQKDB4NjM4NWIxYmMsIDB4NTA3ZTg2YjApLCBXVENQKDB4NjM0OGRlZDEsIDB4NTBjOTgwODIpLAorICAgIFdUQ1AoMHg2MzBiY2EzZiwgMHg1MTE0NTc5MyksIFdUQ1AoMHg2MmNlNzQ1MSwgMHg1MTVmMGI1MSksCisgICAgV1RDUCgweDYyOTBkZDU3LCAweDUxYTk5YjJiKSwgV1RDUCgweDYyNTMwNWEwLCAweDUxZjQwNjkyKSwKKyAgICBXVENQKDB4NjIxNGVkN2QsIDB4NTIzZTRjZjUpLCBXVENQKDB4NjFkNjk1NDEsIDB4NTI4ODZkYzUpLAorICAgIFdUQ1AoMHg2MTk3ZmQzZSwgMHg1MmQyNjg3NSksIFdUQ1AoMHg2MTU5MjVjOSwgMHg1MzFjM2M3NyksCisgICAgV1RDUCgweDYxMWEwZjM5LCAweDUzNjVlOTNlKSwgV1RDUCgweDYwZGFiOWUzLCAweDUzYWY2ZTNlKSwKKyAgICBXVENQKDB4NjA5YjI2MjEsIDB4NTNmOGNhZWQpLCBXVENQKDB4NjA1YjU0NGMsIDB4NTQ0MWZlYzApLAorICAgIFdUQ1AoMHg2MDFiNDRiZiwgMHg1NDhiMDkyZSksIFdUQ1AoMHg1ZmRhZjdkNSwgMHg1NGQzZTlhZSksCisgICAgV1RDUCgweDVmOWE2ZGViLCAweDU1MWM5ZmI3KSwgV1RDUCgweDVmNTlhNzYxLCAweDU1NjUyYWMzKSwKKyAgICBXVENQKDB4NWYxOGE0OTQsIDB4NTVhZDhhNGQpLCBXVENQKDB4NWVkNzY1ZTYsIDB4NTVmNWJkY2QpLAorICAgIFdUQ1AoMHg1ZTk1ZWJiOCwgMHg1NjNkYzRjMSksIFdUQ1AoMHg1ZTU0MzY2ZCwgMHg1Njg1OWVhMyksCisgICAgV1RDUCgweDVlMTI0NjZhLCAweDU2Y2Q0YWYzKSwgV1RDUCgweDVkZDAxYzEzLCAweDU3MTRjOTJkKSwKKyAgICBXVENQKDB4NWQ4ZGI3Y2YsIDB4NTc1YzE4ZDApLCBXVENQKDB4NWQ0YjFhMDUsIDB4NTdhMzM5NWUpLAorICAgIFdUQ1AoMHg1ZDA4NDMxZSwgMHg1N2VhMmE1NiksIFdUQ1AoMHg1Y2M1MzM4NCwgMHg1ODMwZWIzYSksCisgICAgV1RDUCgweDVjODFlYmEwLCAweDU4Nzc3YjhlKSwgV1RDUCgweDVjM2U2YmRmLCAweDU4YmRkYWQ1KSwKKyAgICBXVENQKDB4NWJmYWI0YWYsIDB4NTkwNDA4OTMpLCBXVENQKDB4NWJiNmM2N2MsIDB4NTk0YTA0NGYpLAorICAgIFdUQ1AoMHg1YjcyYTFiNiwgMHg1OThmY2Q4ZSksIFdUQ1AoMHg1YjJlNDZjZSwgMHg1OWQ1NjNkOSksCisgICAgV1RDUCgweDVhZTliNjM0LCAweDVhMWFjNmI4KSwgV1RDUCgweDVhYTRmMDVhLCAweDVhNWZmNWI1KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMDI0W10gPSB7CisgICAgV1RDUCgweDdmZmZmZmE0LCAweDAwMDk5NjJmKSwgV1RDUCgweDdmZmZmZjM5LCAweDAwMGUxNmZiKSwKKyAgICBXVENQKDB4N2ZmZmZlYmYsIDB4MDAxMWVhNjUpLCBXVENQKDB4N2ZmZmZlMzQsIDB4MDAxNTc1MGUpLAorICAgIFdUQ1AoMHg3ZmZmZmQ5NiwgMHgwMDE4ZGM3NCksIFdUQ1AoMHg3ZmZmZmNlNSwgMHgwMDFjMzMyZSksCisgICAgV1RDUCgweDdmZmZmYzFmLCAweDAwMWY4M2Y1KSwgV1RDUCgweDdmZmZmYjQzLCAweDAwMjJkNTlhKSwKKyAgICBXVENQKDB4N2ZmZmZhNGYsIDB4MDAyNjJjYzIpLCBXVENQKDB4N2ZmZmY5NDIsIDB4MDAyOThjYzQpLAorICAgIFdUQ1AoMHg3ZmZmZjgxYSwgMHgwMDJjZjgxZiksIFdUQ1AoMHg3ZmZmZjZkNiwgMHgwMDMwNzBjNCksCisgICAgV1RDUCgweDdmZmZmNTczLCAweDAwMzNmODQwKSwgV1RDUCgweDdmZmZmM2YxLCAweDAwMzc4ZmQ5KSwKKyAgICBXVENQKDB4N2ZmZmYyNGQsIDB4MDAzYjM4YTEpLCBXVENQKDB4N2ZmZmYwODUsIDB4MDAzZWYzODEpLAorICAgIFdUQ1AoMHg3ZmZmZWU5OCwgMHgwMDQyYzE0NyksIFdUQ1AoMHg3ZmZmZWM4MywgMHgwMDQ2YTJhOCksCisgICAgV1RDUCgweDdmZmZlYTQ0LCAweDAwNGE5ODQ3KSwgV1RDUCgweDdmZmZlN2Q4LCAweDAwNGVhMmI3KSwKKyAgICBXVENQKDB4N2ZmZmU1M2YsIDB4MDA1MmMyODMpLCBXVENQKDB4N2ZmZmUyNzQsIDB4MDA1NmY4MjkpLAorICAgIFdUQ1AoMHg3ZmZmZGY3NiwgMHgwMDViNDQyMiksIFdUQ1AoMHg3ZmZmZGM0MywgMHgwMDVmYTZkZCksCisgICAgV1RDUCgweDdmZmZkOGQ2LCAweDAwNjQyMGM4KSwgV1RDUCgweDdmZmZkNTJmLCAweDAwNjhiMjQ5KSwKKyAgICBXVENQKDB4N2ZmZmQxNDksIDB4MDA2ZDViYzQpLCBXVENQKDB4N2ZmZmNkMjIsIDB4MDA3MjFkOWEpLAorICAgIFdUQ1AoMHg3ZmZmYzhiNiwgMHgwMDc2ZjgyOCksIFdUQ1AoMHg3ZmZmYzQwNCwgMHgwMDdiZWJjYSksCisgICAgV1RDUCgweDdmZmZiZjA2LCAweDAwODBmOGQ5KSwgV1RDUCgweDdmZmZiOWJiLCAweDAwODYxZmFlKSwKKyAgICBXVENQKDB4N2ZmZmI0MWUsIDB4MDA4YjYwOWUpLCBXVENQKDB4N2ZmZmFlMmMsIDB4MDA5MGJiZmYpLAorICAgIFdUQ1AoMHg3ZmZmYTdlMSwgMHgwMDk2MzIyNCksIFdUQ1AoMHg3ZmZmYTEzYSwgMHgwMDliYzM2MiksCisgICAgV1RDUCgweDdmZmY5YTMyLCAweDAwYTE3MDA5KSwgV1RDUCgweDdmZmY5MmM1LCAweDAwYTczODZjKSwKKyAgICBXVENQKDB4N2ZmZjhhZjAsIDB4MDBhZDFjZGMpLCBXVENQKDB4N2ZmZjgyYWQsIDB4MDBiMzFkYTgpLAorICAgIFdUQ1AoMHg3ZmZmNzlmOSwgMHgwMGI5M2IyMSksIFdUQ1AoMHg3ZmZmNzBjZiwgMHgwMGJmNzU5NiksCisgICAgV1RDUCgweDdmZmY2NzJhLCAweDAwYzVjZDU3KSwgV1RDUCgweDdmZmY1ZDA1LCAweDAwY2M0MmIxKSwKKyAgICBXVENQKDB4N2ZmZjUyNWMsIDB4MDBkMmQ1ZjMpLCBXVENQKDB4N2ZmZjQ3MjksIDB4MDBkOTg3NmMpLAorICAgIFdUQ1AoMHg3ZmZmM2I2NiwgMHgwMGUwNTc2OSksIFdUQ1AoMHg3ZmZmMmYxMCwgMHgwMGU3NDYzOCksCisgICAgV1RDUCgweDdmZmYyMjFmLCAweDAwZWU1NDI2KSwgV1RDUCgweDdmZmYxNDhlLCAweDAwZjU4MTgyKSwKKyAgICBXVENQKDB4N2ZmZjA2NTgsIDB4MDBmY2NlOTcpLCBXVENQKDB4N2ZmZWY3NzYsIDB4MDEwNDNiYjMpLAorICAgIFdUQ1AoMHg3ZmZlZTdlMiwgMHgwMTBiYzkyMyksIFdUQ1AoMHg3ZmZlZDc5NSwgMHgwMTEzNzczMyksCisgICAgV1RDUCgweDdmZmVjNjhhLCAweDAxMWI0NjMxKSwgV1RDUCgweDdmZmViNGJhLCAweDAxMjMzNjY5KSwKKyAgICBXVENQKDB4N2ZmZWEyMWQsIDB4MDEyYjQ4MjcpLCBXVENQKDB4N2ZmZThlYWMsIDB4MDEzMzdiYjgpLAorICAgIFdUQ1AoMHg3ZmZlN2E2MSwgMHgwMTNiZDE2NyksIFdUQ1AoMHg3ZmZlNjUzMywgMHgwMTQ0NDk4MiksCisgICAgV1RDUCgweDdmZmU0ZjFjLCAweDAxNGNlNDU0KSwgV1RDUCgweDdmZmUzODEzLCAweDAxNTVhMjI5KSwKKyAgICBXVENQKDB4N2ZmZTIwMTEsIDB4MDE1ZTgzNGQpLCBXVENQKDB4N2ZmZTA3MGQsIDB4MDE2Nzg4MGMpLAorICAgIFdUQ1AoMHg3ZmZkZWNmZiwgMHgwMTcwYjBiMiksIFdUQ1AoMHg3ZmZkZDFkZiwgMHgwMTc5ZmQ4YiksCisgICAgV1RDUCgweDdmZmRiNWEyLCAweDAxODM2ZWUxKSwgV1RDUCgweDdmZmQ5ODQyLCAweDAxOGQwNTAwKSwKKyAgICBXVENQKDB4N2ZmZDc5YjMsIDB4MDE5NmMwMzUpLCBXVENQKDB4N2ZmZDU5ZWUsIDB4MDFhMGEwY2EpLAorICAgIFdUQ1AoMHg3ZmZkMzhlOCwgMHgwMWFhYTcwYSksIFdUQ1AoMHg3ZmZkMTY5NywgMHgwMWI0ZDM0MSksCisgICAgV1RDUCgweDdmZmNmMmYyLCAweDAxYmYyNWI5KSwgV1RDUCgweDdmZmNjZGVlLCAweDAxYzk5ZWJkKSwKKyAgICBXVENQKDB4N2ZmY2E3ODAsIDB4MDFkNDNlOTkpLCBXVENQKDB4N2ZmYzdmOWUsIDB4MDFkZjA1OTcpLAorICAgIFdUQ1AoMHg3ZmZjNTYzZCwgMHgwMWU5ZjQwMSksIFdUQ1AoMHg3ZmZjMmI1MSwgMHgwMWY1MGEyMiksCisgICAgV1RDUCgweDdmZmJmZWNmLCAweDAyMDA0ODQ0KSwgV1RDUCgweDdmZmJkMGFiLCAweDAyMGJhZWIxKSwKKyAgICBXVENQKDB4N2ZmYmEwZGEsIDB4MDIxNzNkYjQpLCBXVENQKDB4N2ZmYjZmNGYsIDB4MDIyMmY1OTYpLAorICAgIFdUQ1AoMHg3ZmZiM2JmZCwgMHgwMjJlZDZhMSksIFdUQ1AoMHg3ZmZiMDZkOCwgMHgwMjNhZTExZiksCisgICAgV1RDUCgweDdmZmFjZmQzLCAweDAyNDcxNTU4KSwgV1RDUCgweDdmZmE5NmUwLCAweDAyNTM3Mzk3KSwKKyAgICBXVENQKDB4N2ZmYTViZjIsIDB4MDI1ZmZjMjUpLCBXVENQKDB4N2ZmYTFlZmMsIDB4MDI2Y2FmNGEpLAorICAgIFdUQ1AoMHg3ZmY5ZGZlZSwgMHgwMjc5OGQ0ZiksIFdUQ1AoMHg3ZmY5OWViYiwgMHgwMjg2OTY3YyksCisgICAgV1RDUCgweDdmZjk1YjU1LCAweDAyOTNjYjFiKSwgV1RDUCgweDdmZjkxNWFiLCAweDAyYTEyYjcyKSwKKyAgICBXVENQKDB4N2ZmOGNkYWYsIDB4MDJhZWI3Y2IpLCBXVENQKDB4N2ZmODgzNTEsIDB4MDJiYzcwNmQpLAorICAgIFdUQ1AoMHg3ZmY4MzY4MiwgMHgwMmNhNTU5ZiksIFdUQ1AoMHg3ZmY3ZTczMSwgMHgwMmQ4NjdhOSksCisgICAgV1RDUCgweDdmZjc5NTRlLCAweDAyZTZhNmQyKSwgV1RDUCgweDdmZjc0MGM4LCAweDAyZjUxMzYxKSwKKyAgICBXVENQKDB4N2ZmNmU5OGUsIDB4MDMwM2FkOWMpLCBXVENQKDB4N2ZmNjhmOGYsIDB4MDMxMjc1Y2EpLAorICAgIFdUQ1AoMHg3ZmY2MzJiYSwgMHgwMzIxNmMzMCksIFdUQ1AoMHg3ZmY1ZDJmYiwgMHgwMzMwOTExNiksCisgICAgV1RDUCgweDdmZjU3MDQyLCAweDAzM2ZlNGJmKSwgV1RDUCgweDdmZjUwYTdhLCAweDAzNGY2NzczKSwKKyAgICBXVENQKDB4N2ZmNGExOTIsIDB4MDM1ZjE5NzUpLCBXVENQKDB4N2ZmNDM1NzYsIDB4MDM2ZWZiMGEpLAorICAgIFdUQ1AoMHg3ZmYzYzYxMiwgMHgwMzdmMGM3OCksIFdUQ1AoMHg3ZmYzNTM1MywgMHgwMzhmNGUwMiksCisgICAgV1RDUCgweDdmZjJkZDI0LCAweDAzOWZiZmViKSwgV1RDUCgweDdmZjI2MzcwLCAweDAzYjA2Mjc5KSwKKyAgICBXVENQKDB4N2ZmMWU2MjMsIDB4MDNjMTM1ZWQpLCBXVENQKDB4N2ZmMTY1MjcsIDB4MDNkMjNhOGIpLAorICAgIFdUQ1AoMHg3ZmYwZTA2NywgMHgwM2UzNzA5NSksIFdUQ1AoMHg3ZmYwNTdjYywgMHgwM2Y0ZDg0ZSksCisgICAgV1RDUCgweDdmZWZjYjQwLCAweDA0MDY3MWY3KSwgV1RDUCgweDdmZWYzYWFkLCAweDA0MTgzZGQzKSwKKyAgICBXVENQKDB4N2ZlZWE1ZmEsIDB4MDQyYTNjMjIpLCBXVENQKDB4N2ZlZTBkMTEsIDB4MDQzYzZkMjUpLAorICAgIFdUQ1AoMHg3ZmVkNmZkYSwgMHgwNDRlZDExZCksIFdUQ1AoMHg3ZmVjY2UzZCwgMHgwNDYxNjg0OSksCisgICAgV1RDUCgweDdmZWMyODIxLCAweDA0NzQzMmViKSwgV1RDUCgweDdmZWI3ZDZjLCAweDA0ODczMTQwKSwKKyAgICBXVENQKDB4N2ZlYWNlMDcsIDB4MDQ5YTYzODgpLCBXVENQKDB4N2ZlYTE5ZDYsIDB4MDRhZGNhMDEpLAorICAgIFdUQ1AoMHg3ZmU5NjBjMCwgMHgwNGMxNjRlYSksIFdUQ1AoMHg3ZmU4YTJhYSwgMHgwNGQ1MzQ4MSksCisgICAgV1RDUCgweDdmZTdkZjc5LCAweDA0ZTkzOTAyKSwgV1RDUCgweDdmZTcxNzEyLCAweDA0ZmQ3MmFhKSwKKyAgICBXVENQKDB4N2ZlNjQ5NWEsIDB4MDUxMWUxYjYpLCBXVENQKDB4N2ZlNTc2MzQsIDB4MDUyNjg2NjMpLAorICAgIFdUQ1AoMHg3ZmU0OWQ4MywgMHgwNTNiNjBlYiksIFdUQ1AoMHg3ZmUzYmYyYiwgMHgwNTUwNzE4OSksCisgICAgV1RDUCgweDdmZTJkYjBmLCAweDA1NjViODc5KSwgV1RDUCgweDdmZTFmMTEwLCAweDA1N2IzNWY0KSwKKyAgICBXVENQKDB4N2ZlMTAxMTEsIDB4MDU5MGVhMzUpLCBXVENQKDB4N2ZlMDBhZjMsIDB4MDVhNmQ1NzQpLAorICAgIFdUQ1AoMHg3ZmRmMGU5NywgMHgwNWJjZjdlYSksIFdUQ1AoMHg3ZmRlMGJkZCwgMHgwNWQzNTFjZiksCisgICAgV1RDUCgweDdmZGQwMmE2LCAweDA1ZTllMzVjKSwgV1RDUCgweDdmZGJmMmQyLCAweDA2MDBhY2M4KSwKKyAgICBXVENQKDB4N2ZkYWRjNDAsIDB4MDYxN2FlNDgpLCBXVENQKDB4N2ZkOWJlY2YsIDB4MDYyZWU4MTQpLAorICAgIFdUQ1AoMHg3ZmQ4OWE1ZSwgMHgwNjQ2NWE2MiksIFdUQ1AoMHg3ZmQ3NmVjYSwgMHgwNjVlMDU2NSksCisgICAgV1RDUCgweDdmZDYzYmYxLCAweDA2NzVlOTU0KSwgV1RDUCgweDdmZDUwMWIwLCAweDA2OGUwNjYyKSwKKyAgICBXVENQKDB4N2ZkM2JmZTQsIDB4MDZhNjVjYzMpLCBXVENQKDB4N2ZkMjc2NmEsIDB4MDZiZWVjYWEpLAorICAgIFdUQ1AoMHg3ZmQxMjUxZSwgMHgwNmQ3YjY0OCksIFdUQ1AoMHg3ZmNmY2JkYSwgMHgwNmYwYjlkMSksCisgICAgV1RDUCgweDdmY2U2YTdhLCAweDA3MDlmNzc1KSwgV1RDUCgweDdmY2QwMGQ4LCAweDA3MjM2ZjY1KSwKKyAgICBXVENQKDB4N2ZjYjhlY2YsIDB4MDczZDIxZDIpLCBXVENQKDB4N2ZjYTE0MzksIDB4MDc1NzBlZWEpLAorICAgIFdUQ1AoMHg3ZmM4OTBlZCwgMHgwNzcxMzZkZCksIFdUQ1AoMHg3ZmM3MDRjNywgMHgwNzhiOTlkYSksCisgICAgV1RDUCgweDdmYzU2ZjlkLCAweDA3YTYzODBkKSwgV1RDUCgweDdmYzNkMTQ3LCAweDA3YzExMWE0KSwKKyAgICBXVENQKDB4N2ZjMjI5OWUsIDB4MDdkYzI2Y2MpLCBXVENQKDB4N2ZjMDc4NzgsIDB4MDdmNzc3YjEpLAorICAgIFdUQ1AoMHg3ZmJlYmRhYywgMHgwODEzMDQ3ZCksIFdUQ1AoMHg3ZmJjZjkwZiwgMHgwODJlY2Q1YiksCisgICAgV1RDUCgweDdmYmIyYTc4LCAweDA4NGFkMjc2KSwgV1RDUCgweDdmYjk1MWJjLCAweDA4NjcxM2Y3KSwKKyAgICBXVENQKDB4N2ZiNzZlYWYsIDB4MDg4MzkyMDYpLCBXVENQKDB4N2ZiNTgxMjYsIDB4MDhhMDRjY2IpLAorICAgIFdUQ1AoMHg3ZmIzODhmNCwgMHgwOGJkNDQ2ZSksIFdUQ1AoMHg3ZmIxODVlZSwgMHgwOGRhNzkxNSksCisgICAgV1RDUCgweDdmYWY3N2U1LCAweDA4ZjdlYWU3KSwgV1RDUCgweDdmYWQ1ZWFkLCAweDA5MTU5YTA5KSwKKyAgICBXVENQKDB4N2ZhYjNhMTcsIDB4MDkzMzg2OWYpLCBXVENQKDB4N2ZhOTA5ZjYsIDB4MDk1MWIwY2QpLAorICAgIFdUQ1AoMHg3ZmE2Y2UxYSwgMHgwOTcwMThiNyksIFdUQ1AoMHg3ZmE0ODY1MywgMHgwOThlYmU3ZiksCisgICAgV1RDUCgweDdmYTIzMjczLCAweDA5YWRhMjQ4KSwgV1RDUCgweDdmOWZkMjQ5LCAweDA5Y2NjNDMxKSwKKyAgICBXVENQKDB4N2Y5ZDY1YTQsIDB4MDllYzI0NWIpLCBXVENQKDB4N2Y5YWVjNTMsIDB4MGEwYmMyZTcpLAorICAgIFdUQ1AoMHg3Zjk4NjYyNSwgMHgwYTJiOWZmMyksIFdUQ1AoMHg3Zjk1ZDJlNywgMHgwYTRiYmI5ZSksCisgICAgV1RDUCgweDdmOTMzMjY3LCAweDBhNmMxNjA0KSwgV1RDUCgweDdmOTA4NDcyLCAweDBhOGNhZjQzKSwKKyAgICBXVENQKDB4N2Y4ZGM4ZDUsIDB4MGFhZDg3NzYpLCBXVENQKDB4N2Y4YWZmNWMsIDB4MGFjZTllYjkpLAorICAgIFdUQ1AoMHg3Zjg4MjdkMywgMHgwYWVmZjUyNiksIFdUQ1AoMHg3Zjg1NDIwNCwgMHgwYjExOGFkOCksCisgICAgV1RDUCgweDdmODI0ZGJiLCAweDBiMzM1ZmU2KSwgV1RDUCgweDdmN2Y0YWMzLCAweDBiNTU3NDY5KSwKKyAgICBXVENQKDB4N2Y3YzM4ZTQsIDB4MGI3N2M4NzkpLCBXVENQKDB4N2Y3OTE3ZTksIDB4MGI5YTVjMmIpLAorICAgIFdUQ1AoMHg3Zjc1ZTc5YiwgMHgwYmJkMmY5NyksIFdUQ1AoMHg3ZjcyYTdjMywgMHgwYmUwNDJkMCksCisgICAgV1RDUCgweDdmNmY1ODI4LCAweDBjMDM5NWVjKSwgV1RDUCgweDdmNmJmODkyLCAweDBjMjcyOGZkKSwKKyAgICBXVENQKDB4N2Y2ODg4YzksIDB4MGM0YWZjMTYpLCBXVENQKDB4N2Y2NTA4OTQsIDB4MGM2ZjBmNGEpLAorICAgIFdUQ1AoMHg3ZjYxNzdiOSwgMHgwYzkzNjJhOCksIFdUQ1AoMHg3ZjVkZDVmZiwgMHgwY2I3ZjY0MiksCisgICAgV1RDUCgweDdmNWEyMzJhLCAweDBjZGNjYTI2KSwgV1RDUCgweDdmNTY1ZjAwLCAweDBkMDFkZTYzKSwKKyAgICBXVENQKDB4N2Y1Mjg5NDcsIDB4MGQyNzMzMDcpLCBXVENQKDB4N2Y0ZWExYzIsIDB4MGQ0Y2M4MWYpLAorICAgIFdUQ1AoMHg3ZjRhYTgzNSwgMHgwZDcyOWRiNyksIFdUQ1AoMHg3ZjQ2OWM2NSwgMHgwZDk4YjNkYSksCisgICAgV1RDUCgweDdmNDI3ZTEzLCAweDBkYmYwYTkyKSwgV1RDUCgweDdmM2U0ZDA0LCAweDBkZTVhMWU5KSwKKyAgICBXVENQKDB4N2YzYTA4ZjksIDB4MGUwYzc5ZTcpLCBXVENQKDB4N2YzNWIxYjQsIDB4MGUzMzkyOTUpLAorICAgIFdUQ1AoMHg3ZjMxNDZmOCwgMHgwZTVhZWJmYSksIFdUQ1AoMHg3ZjJjYzg4NCwgMHgwZTgyODYxYSksCisgICAgV1RDUCgweDdmMjgzNjFiLCAweDBlYWE2MGZkKSwgV1RDUCgweDdmMjM4ZjdjLCAweDBlZDI3Y2E1KSwKKyAgICBXVENQKDB4N2YxZWQ0NjcsIDB4MGVmYWQ5MTcpLCBXVENQKDB4N2YxYTA0OWQsIDB4MGYyMzc2NTYpLAorICAgIFdUQ1AoMHg3ZjE1MWZkYywgMHgwZjRjNTQ2MiksIFdUQ1AoMHg3ZjEwMjVlMywgMHgwZjc1NzMzZCksCisgICAgV1RDUCgweDdmMGIxNjcyLCAweDBmOWVkMmU2KSwgV1RDUCgweDdmMDVmMTQ2LCAweDBmYzg3MzVlKSwKKyAgICBXVENQKDB4N2YwMGI2MWQsIDB4MGZmMjU0YTEpLCBXVENQKDB4N2VmYjY0YjQsIDB4MTAxYzc2YWUpLAorICAgIFdUQ1AoMHg3ZWY1ZmNjYSwgMHgxMDQ2ZDk4MSksIFdUQ1AoMHg3ZWYwN2UxOSwgMHgxMDcxN2QxNSksCisgICAgV1RDUCgweDdlZWFlODYwLCAweDEwOWM2MTY1KSwgV1RDUCgweDdlZTUzYjViLCAweDEwYzc4NjZhKSwKKyAgICBXVENQKDB4N2VkZjc2YzQsIDB4MTBmMmVjMWUpLCBXVENQKDB4N2VkOTlhNTgsIDB4MTExZTkyNzkpLAorICAgIFdUQ1AoMHg3ZWQzYTVkMSwgMHgxMTRhNzk3MSksIFdUQ1AoMHg3ZWNkOThlYiwgMHgxMTc2YTBmYyksCisgICAgV1RDUCgweDdlYzc3MzYwLCAweDExYTMwOTEwKSwgV1RDUCgweDdlYzEzNGViLCAweDExY2ZiMWExKSwKKyAgICBXVENQKDB4N2ViYWRkNDQsIDB4MTFmYzlhYTIpLCBXVENQKDB4N2ViNDZjMjcsIDB4MTIyOWM0MDYpLAorICAgIFdUQ1AoMHg3ZWFkZTE0YywgMHgxMjU3MmRiZiksIFdUQ1AoMHg3ZWE3M2M2YywgMHgxMjg0ZDdiYyksCisgICAgV1RDUCgweDdlYTA3ZDQxLCAweDEyYjJjMWVkKSwgV1RDUCgweDdlOTlhMzgyLCAweDEyZTBlYzQyKSwKKyAgICBXVENQKDB4N2U5MmFlZTcsIDB4MTMwZjU2YTgpLCBXVENQKDB4N2U4YjlmMmEsIDB4MTMzZTAxMGIpLAorICAgIFdUQ1AoMHg3ZTg0NzQwMiwgMHgxMzZjZWI1OSksIFdUQ1AoMHg3ZTdkMmQyNSwgMHgxMzljMTU3YiksCisgICAgV1RDUCgweDdlNzVjYTRjLCAweDEzY2I3ZjVkKSwgV1RDUCgweDdlNmU0YjJkLCAweDEzZmIyOGU2KSwKKyAgICBXVENQKDB4N2U2NmFmN2YsIDB4MTQyYjEyMDApLCBXVENQKDB4N2U1ZWY2ZjgsIDB4MTQ1YjNhOTIpLAorICAgIFdUQ1AoMHg3ZTU3MjE1MCwgMHgxNDhiYTI4MSksIFdUQ1AoMHg3ZTRmMmUzYiwgMHgxNGJjNDliNCksCisgICAgV1RDUCgweDdlNDcxZDcwLCAweDE0ZWQzMDBmKSwgV1RDUCgweDdlM2VlZWE1LCAweDE1MWU1NTc1KSwKKyAgICBXVENQKDB4N2UzNmExOGUsIDB4MTU0ZmI5YzkpLCBXVENQKDB4N2UyZTM1ZTIsIDB4MTU4MTVjZWQpLAorICAgIFdUQ1AoMHg3ZTI1YWI1NiwgMHgxNWIzM2VjMSksIFdUQ1AoMHg3ZTFkMDE5ZSwgMHgxNWU1NWYyNSksCisgICAgV1RDUCgweDdlMTQzODZlLCAweDE2MTdiZGY5KSwgV1RDUCgweDdlMGI0ZjdkLCAweDE2NGE1YjE5KSwKKyAgICBXVENQKDB4N2UwMjQ2N2UsIDB4MTY3ZDM2NjIpLCBXVENQKDB4N2RmOTFkMjUsIDB4MTZiMDRmYjIpLAorICAgIFdUQ1AoMHg3ZGVmZDMyNywgMHgxNmUzYTZlMiksIFdUQ1AoMHg3ZGU2NjgzNywgMHgxNzE3M2JjZSksCisgICAgV1RDUCgweDdkZGNkYzBhLCAweDE3NGIwZTRkKSwgV1RDUCgweDdkZDMyZTUzLCAweDE3N2YxZTM5KSwKKyAgICBXVENQKDB4N2RjOTVlYzYsIDB4MTdiMzZiNjkpLCBXVENQKDB4N2RiZjZkMTcsIDB4MTdlN2Y1YjMpLAorICAgIFdUQ1AoMHg3ZGI1NThmOSwgMHgxODFjYmNlYyksIFdUQ1AoMHg3ZGFiMjIxZiwgMHgxODUxYzBlOSksCisgICAgV1RDUCgweDdkYTBjODNjLCAweDE4ODcwMTdkKSwgV1RDUCgweDdkOTY0YjA1LCAweDE4YmM3ZTdjKSwKKyAgICBXVENQKDB4N2Q4YmFhMmIsIDB4MThmMjM3YjYpLCBXVENQKDB4N2Q4MGU1NjMsIDB4MTkyODJjZmQpLAorICAgIFdUQ1AoMHg3ZDc1ZmM1ZSwgMHgxOTVlNWUyMCksIFdUQ1AoMHg3ZDZhZWVkMCwgMHgxOTk0Y2FlZSksCisgICAgV1RDUCgweDdkNWZiYzZkLCAweDE5Y2I3MzM1KSwgV1RDUCgweDdkNTQ2NGU2LCAweDFhMDI1NmMyKSwKKyAgICBXVENQKDB4N2Q0OGU3ZWYsIDB4MWEzOTc1NjEpLCBXVENQKDB4N2QzZDQ1M2IsIDB4MWE3MGNlZGUpLAorICAgIFdUQ1AoMHg3ZDMxN2M3YywgMHgxYWE4NjMwMSksIFdUQ1AoMHg3ZDI1OGQ2NSwgMHgxYWUwMzE5NSksCisgICAgV1RDUCgweDdkMTk3N2FhLCAweDFiMTgzYTYzKSwgV1RDUCgweDdkMGQzYWZjLCAweDFiNTA3ZDMwKSwKKyAgICBXVENQKDB4N2QwMGQ3MTAsIDB4MWI4OGY5YzUpLCBXVENQKDB4N2NmNDRiOTcsIDB4MWJjMWFmZTYpLAorICAgIFdUQ1AoMHg3Y2U3OTg0NiwgMHgxYmZhOWY1OCksIFdUQ1AoMHg3Y2RhYmNjZSwgMHgxYzMzYzdlMCksCisgICAgV1RDUCgweDdjY2RiOGU0LCAweDFjNmQyOTNmKSwgV1RDUCgweDdjYzA4YzM5LCAweDFjYTZjMzM3KSwKKyAgICBXVENQKDB4N2NiMzM2ODIsIDB4MWNlMDk1OGEpLCBXVENQKDB4N2NhNWI3NzIsIDB4MWQxYTlmZjgpLAorICAgIFdUQ1AoMHg3Yzk4MGViZCwgMHgxZDU0ZTI0MCksIFdUQ1AoMHg3YzhhM2MxNCwgMHgxZDhmNWMyMSksCisgICAgV1RDUCgweDdjN2MzZjJlLCAweDFkY2EwZDU2KSwgV1RDUCgweDdjNmUxN2JjLCAweDFlMDRmNTlmKSwKKyAgICBXVENQKDB4N2M1ZmM1NzMsIDB4MWU0MDE0YjQpLCBXVENQKDB4N2M1MTQ4MDcsIDB4MWU3YjZhNTMpLAorICAgIFdUQ1AoMHg3YzQyOWYyYywgMHgxZWI2ZjYzMyksIFdUQ1AoMHg3YzMzY2E5NiwgMHgxZWYyYjgwZiksCisgICAgV1RDUCgweDdjMjRjOWZhLCAweDFmMmVhZjllKSwgV1RDUCgweDdjMTU5ZDBkLCAweDFmNmFkYzk4KSwKKyAgICBXVENQKDB4N2MwNjQzODMsIDB4MWZhNzNlYjIpLCBXVENQKDB4N2JmNmJkMTEsIDB4MWZlM2Q1YTMpLAorICAgIFdUQ1AoMHg3YmU3MDk2YywgMHgyMDIwYTExZSksIFdUQ1AoMHg3YmQ3Mjg0YSwgMHgyMDVkYTBkOCksCisgICAgV1RDUCgweDdiYzcxOTYwLCAweDIwOWFkNDgzKSwgV1RDUCgweDdiYjZkYzY1LCAweDIwZDgzYmQxKSwKKyAgICBXVENQKDB4N2JhNjcxMGQsIDB4MjExNWQ2NzQpLCBXVENQKDB4N2I5NWQ3MTAsIDB4MjE1M2E0MWIpLAorICAgIFdUQ1AoMHg3Yjg1MGUyNCwgMHgyMTkxYTQ3NiksIFdUQ1AoMHg3Yjc0MTVmZiwgMHgyMWNmZDczNCksCisgICAgV1RDUCgweDdiNjJlZTU5LCAweDIyMGUzYzAyKSwgV1RDUCgweDdiNTE5NmU5LCAweDIyNGNkMjhkKSwKKyAgICBXVENQKDB4N2I0MDBmNjcsIDB4MjI4YjlhODIpLCBXVENQKDB4N2IyZTU3OGEsIDB4MjJjYTkzOGEpLAorICAgIFdUQ1AoMHg3YjFjNmYwYiwgMHgyMzA5YmQ1MiksIFdUQ1AoMHg3YjBhNTVhMSwgMHgyMzQ5MTc4MyksCisgICAgV1RDUCgweDdhZjgwYjA3LCAweDIzODhhMWM0KSwgV1RDUCgweDdhZTU4ZWY1LCAweDIzYzg1YmJmKSwKKyAgICBXVENQKDB4N2FkMmUxMjQsIDB4MjQwODQ1MWEpLCBXVENQKDB4N2FjMDAxNGUsIDB4MjQ0ODVkN2MpLAorICAgIFdUQ1AoMHg3YWFjZWYyZSwgMHgyNDg4YTQ4YSksIFdUQ1AoMHg3YTk5YWE3ZSwgMHgyNGM5MTllOSksCisgICAgV1RDUCgweDdhODYzMmY4LCAweDI1MDliZDNkKSwgV1RDUCgweDdhNzI4ODU4LCAweDI1NGE4ZTI5KSwKKyAgICBXVENQKDB4N2E1ZWFhNWEsIDB4MjU4YjhjNTApLCBXVENQKDB4N2E0YTk4YjksIDB4MjVjY2I3NTMpLAorICAgIFdUQ1AoMHg3YTM2NTMzMywgMHgyNjBlMGVkMyksIFdUQ1AoMHg3YTIxZDk4MywgMHgyNjRmOTI3MSksCisgICAgV1RDUCgweDdhMGQyYjY4LCAweDI2OTE0MWNiKSwgV1RDUCgweDc5Zjg0ODllLCAweDI2ZDMxYzgwKSwKKyAgICBXVENQKDB4NzllMzMwZTQsIDB4MjcxNTIyMmYpLCBXVENQKDB4NzljZGUzZjgsIDB4Mjc1NzUyNzMpLAorICAgIFdUQ1AoMHg3OWI4NjE5YSwgMHgyNzk5YWNlYSksIFdUQ1AoMHg3OWEyYTk4OSwgMHgyN2RjMzEzMCksCisgICAgV1RDUCgweDc5OGNiYjg1LCAweDI4MWVkZWRmKSwgV1RDUCgweDc5NzY5NzRlLCAweDI4NjFiNTkxKSwKKyAgICBXVENQKDB4Nzk2MDNjYTUsIDB4MjhhNGI0ZTApLCBXVENQKDB4Nzk0OWFiNGMsIDB4MjhlN2RjNjUpLAorICAgIFdUQ1AoMHg3OTMyZTMwNCwgMHgyOTJiMmJiOCksIFdUQ1AoMHg3OTFiZTM5MCwgMHgyOTZlYTI3MCksCisgICAgV1RDUCgweDc5MDRhY2IzLCAweDI5YjI0MDI0KSwgV1RDUCgweDc4ZWQzZTMwLCAweDI5ZjYwNDZiKSwKKyAgICBXVENQKDB4NzhkNTk3Y2MsIDB4MmEzOWVlZDgpLCBXVENQKDB4NzhiZGI5NGEsIDB4MmE3ZGZmMDIpLAorICAgIFdUQ1AoMHg3OGE1YTI3MCwgMHgyYWMyMzQ3YyksIFdUQ1AoMHg3ODhkNTMwNCwgMHgyYjA2OGVkYSksCisgICAgV1RDUCgweDc4NzRjYWNiLCAweDJiNGIwZGFlKSwgV1RDUCgweDc4NWMwOThkLCAweDJiOGZiMDhhKSwKKyAgICBXVENQKDB4Nzg0MzBmMTEsIDB4MmJkNDc3MDApLCBXVENQKDB4NzgyOWRiMWYsIDB4MmMxOTYwYTEpLAorICAgIFdUQ1AoMHg3ODEwNmQ3ZiwgMHgyYzVlNmNmZCksIFdUQ1AoMHg3N2Y2YzVmYiwgMHgyY2EzOWJhMyksCisgICAgV1RDUCgweDc3ZGNlNDVjLCAweDJjZThlYzIzKSwgV1RDUCgweDc3YzJjODZlLCAweDJkMmU1ZTBiKSwKKyAgICBXVENQKDB4NzdhODcxZmEsIDB4MmQ3M2YwZTgpLCBXVENQKDB4Nzc4ZGUwY2QsIDB4MmRiOWE0NDkpLAorICAgIFdUQ1AoMHg3NzczMTRiMiwgMHgyZGZmNzdiOCksIFdUQ1AoMHg3NzU4MGQ3OCwgMHgyZTQ1NmFjNCksCisgICAgV1RDUCgweDc3M2NjYWViLCAweDJlOGI3Y2Y2KSwgV1RDUCgweDc3MjE0Y2RiLCAweDJlZDFhZGRiKSwKKyAgICBXVENQKDB4NzcwNTkzMTUsIDB4MmYxN2ZjZmIpLCBXVENQKDB4NzZlOTlkNjksIDB4MmY1ZTY5ZTIpLAorICAgIFdUQ1AoMHg3NmNkNmJhOSwgMHgyZmE0ZjQxOSksIFdUQ1AoMHg3NmIwZmRhNCwgMHgyZmViOWIyNyksCisgICAgV1RDUCgweDc2OTQ1MzJlLCAweDMwMzI1ZTk2KSwgV1RDUCgweDc2Nzc2YzE3LCAweDMwNzkzZGVlKSwKKyAgICBXVENQKDB4NzY1YTQ4MzQsIDB4MzBjMDM4YjUpLCBXVENQKDB4NzYzY2U3NTksIDB4MzEwNzRlNzIpLAorICAgIFdUQ1AoMHg3NjFmNDk1OSwgMHgzMTRlN2VhYiksIFdUQ1AoMHg3NjAxNmUwYiwgMHgzMTk1YzhlNiksCisgICAgV1RDUCgweDc1ZTM1NTQ1LCAweDMxZGQyY2E5KSwgV1RDUCgweDc1YzRmZWRjLCAweDMyMjRhOTc5KSwKKyAgICBXVENQKDB4NzVhNjZhYWIsIDB4MzI2YzNlZDgpLCBXVENQKDB4NzU4Nzk4ODcsIDB4MzJiM2VjNGQpLAorICAgIFdUQ1AoMHg3NTY4ODg0YiwgMHgzMmZiYjE1OSksIFdUQ1AoMHg3NTQ5MzlkMSwgMHgzMzQzOGQ4MSksCisgICAgV1RDUCgweDc1MjlhY2Y0LCAweDMzOGI4MDQ1KSwgV1RDUCgweDc1MDllMThlLCAweDMzZDM4OTJhKSwKKyAgICBXVENQKDB4NzRlOWQ3N2QsIDB4MzQxYmE3YjEpLCBXVENQKDB4NzRjOThlOWUsIDB4MzQ2M2RiNWEpLAorICAgIFdUQ1AoMHg3NGE5MDZjZCwgMHgzNGFjMjNhNyksIFdUQ1AoMHg3NDg4M2ZlYywgMHgzNGY0ODAxOSksCisgICAgV1RDUCgweDc0NjczOWQ4LCAweDM1M2NmMDJmKSwgV1RDUCgweDc0NDVmNDcyLCAweDM1ODU3MzZhKSwKKyAgICBXVENQKDB4NzQyNDZmOWMsIDB4MzVjZTA5NDkpLCBXVENQKDB4NzQwMmFiMzcsIDB4MzYxNmIxNGMpLAorICAgIFdUQ1AoMHg3M2UwYTcyNywgMHgzNjVmNmFmMCksIFdUQ1AoMHg3M2JlNjM1MCwgMHgzNmE4MzViNSksCisgICAgV1RDUCgweDczOWJkZjk1LCAweDM2ZjExMTE4KSwgV1RDUCgweDczNzkxYmRkLCAweDM3MzlmYzk4KSwKKyAgICBXVENQKDB4NzM1NjE4MGUsIDB4Mzc4MmY3YjIpLCBXVENQKDB4NzMzMmQ0MTAsIDB4MzdjYzAxZTMpLAorICAgIFdUQ1AoMHg3MzBmNGZjOSwgMHgzODE1MWFhOCksIFdUQ1AoMHg3MmViOGIyNCwgMHgzODVlNDE3ZSksCisgICAgV1RDUCgweDcyYzc4NjBhLCAweDM4YTc3NWUxKSwgV1RDUCgweDcyYTM0MDY2LCAweDM4ZjBiNzRkKSwKKyAgICBXVENQKDB4NzI3ZWJhMjQsIDB4MzkzYTA1M2UpLCBXVENQKDB4NzI1OWYzMzEsIDB4Mzk4MzVmMzApLAorICAgIFdUQ1AoMHg3MjM0ZWI3OSwgMHgzOWNjYzQ5ZSksIFdUQ1AoMHg3MjBmYTJlYiwgMHgzYTE2MzUwMyksCisgICAgV1RDUCgweDcxZWExOTc3LCAweDNhNWZhZmRhKSwgV1RDUCgweDcxYzQ0ZjBjLCAweDNhYTkzNDllKSwKKyAgICBXVENQKDB4NzE5ZTQzOWQsIDB4M2FmMmMyY2EpLCBXVENQKDB4NzE3N2Y3MWEsIDB4M2IzYzU5ZDcpLAorICAgIFdUQ1AoMHg3MTUxNjk3OCwgMHgzYjg1Zjk0MCksIFdUQ1AoMHg3MTJhOWFhYSwgMHgzYmNmYTA3ZSksCisgICAgV1RDUCgweDcxMDM4YWE0LCAweDNjMTk0ZjBkKSwgV1RDUCgweDcwZGMzOTVlLCAweDNjNjMwNDY0KSwKKyAgICBXVENQKDB4NzBiNGE2Y2QsIDB4M2NhY2JmZmYpLCBXVENQKDB4NzA4Y2QyZTksIDB4M2NmNjgxNTUpLAorICAgIFdUQ1AoMHg3MDY0YmRhYiwgMHgzZDQwNDdlMSksIFdUQ1AoMHg3MDNjNjcwZCwgMHgzZDhhMTMxYyksCisgICAgV1RDUCgweDcwMTNjZjBhLCAweDNkZDNlMjdlKSwgV1RDUCgweDZmZWFmNTljLCAweDNlMWRiNTgwKSwKKyAgICBXVENQKDB4NmZjMWRhYzEsIDB4M2U2NzhiOWIpLCBXVENQKDB4NmY5ODdlNzYsIDB4M2ViMTY0NDkpLAorICAgIFdUQ1AoMHg2ZjZlZTBiOSwgMHgzZWZiM2YwMSksIFdUQ1AoMHg2ZjQ1MDE4YiwgMHgzZjQ1MWIzZCksCisgICAgV1RDUCgweDZmMWFlMGViLCAweDNmOGVmODc0KSwgV1RDUCgweDZlZjA3ZWRiLCAweDNmZDhkNjIwKSwKKyAgICBXVENQKDB4NmVjNWRiNWQsIDB4NDAyMmIzYjkpLCBXVENQKDB4NmU5YWY2NzUsIDB4NDA2YzkwYjcpLAorICAgIFdUQ1AoMHg2ZTZmZDAyNywgMHg0MGI2NmM5MyksIFdUQ1AoMHg2ZTQ0Njg3OSwgMHg0MTAwNDZjNSksCisgICAgV1RDUCgweDZlMThiZjcxLCAweDQxNGExZWM2KSwgV1RDUCgweDZkZWNkNTE3LCAweDQxOTNmNDBkKSwKKyAgICBXVENQKDB4NmRjMGE5NzIsIDB4NDFkZGM2MTUpLCBXVENQKDB4NmQ5NDNjOGQsIDB4NDIyNzk0NTUpLAorICAgIFdUQ1AoMHg2ZDY3OGU3MSwgMHg0MjcxNWU0NSksIFdUQ1AoMHg2ZDNhOWYyYSwgMHg0MmJiMjM1ZiksCisgICAgV1RDUCgweDZkMGQ2ZWM1LCAweDQzMDRlMzFhKSwgV1RDUCgweDZjZGZmZDRmLCAweDQzNGU5Y2YxKSwKKyAgICBXVENQKDB4NmNiMjRhZDYsIDB4NDM5ODUwNWIpLCBXVENQKDB4NmM4NDU3NmIsIDB4NDNlMWZjZDEpLAorICAgIFdUQ1AoMHg2YzU2MjMxYywgMHg0NDJiYTFjZCksIFdUQ1AoMHg2YzI3YWRmZCwgMHg0NDc1M2VjNyksCisgICAgV1RDUCgweDZiZjhmODFlLCAweDQ0YmVkMzNhKSwgV1RDUCgweDZiY2EwMTk1LCAweDQ1MDg1ZTlkKSwKKyAgICBXVENQKDB4NmI5YWNhNzUsIDB4NDU1MWUwNmIpLCBXVENQKDB4NmI2YjUyZDUsIDB4NDU5YjU4MWUpLAorICAgIFdUQ1AoMHg2YjNiOWFjOSwgMHg0NWU0YzUyZiksIFdUQ1AoMHg2YjBiYTI2YiwgMHg0NjJlMjcxNyksCisgICAgV1RDUCgweDZhZGI2OWQzLCAweDQ2Nzc3ZDUyKSwgV1RDUCgweDZhYWFmMTFiLCAweDQ2YzBjNzVhKSwKKyAgICBXVENQKDB4NmE3YTM4NWMsIDB4NDcwYTA0YTkpLCBXVENQKDB4NmE0OTNmYjMsIDB4NDc1MzM0YjkpLAorICAgIFdUQ1AoMHg2YTE4MDczZCwgMHg0NzljNTcwNyksIFdUQ1AoMHg2OWU2OGYxNywgMHg0N2U1NmIwYyksCisgICAgV1RDUCgweDY5YjRkNzYxLCAweDQ4MmU3MDQ1KSwgV1RDUCgweDY5ODJlMDM5LCAweDQ4Nzc2NjJjKSwKKyAgICBXVENQKDB4Njk1MGE5YzAsIDB4NDhjMDRjM2YpLCBXVENQKDB4NjkxZTM0MWEsIDB4NDkwOTIxZjgpLAorICAgIFdUQ1AoMHg2OGViN2Y2NywgMHg0OTUxZTZkNSksIFdUQ1AoMHg2OGI4OGJjZCwgMHg0OTlhOWE1MSksCisgICAgV1RDUCgweDY4ODU1OTcwLCAweDQ5ZTMzYmViKSwgV1RDUCgweDY4NTFlODc1LCAweDRhMmJjYjFmKSwKKyAgICBXVENQKDB4NjgxZTM5MDUsIDB4NGE3NDQ3NmIpLCBXVENQKDB4NjdlYTRiNDcsIDB4NGFiY2IwNGMpLAorICAgIFdUQ1AoMHg2N2I2MWY2MywgMHg0YjA1MDU0MSksIFdUQ1AoMHg2NzgxYjU4NSwgMHg0YjRkNDVjOSksCisgICAgV1RDUCgweDY3NGQwZGQ2LCAweDRiOTU3MTYyKSwgV1RDUCgweDY3MTgyODgzLCAweDRiZGQ4NzhjKSwKKyAgICBXVENQKDB4NjZlMzA1YjgsIDB4NGMyNTg3YzYpLCBXVENQKDB4NjZhZGE1YTUsIDB4NGM2ZDcxOTApLAorICAgIFdUQ1AoMHg2Njc4MDg3OCwgMHg0Y2I1NDQ2YSksIFdUQ1AoMHg2NjQyMmU2MCwgMHg0Y2ZjZmZkNSksCisgICAgV1RDUCgweDY2MGMxNzkwLCAweDRkNDRhMzUzKSwgV1RDUCgweDY1ZDVjNDM5LCAweDRkOGMyZTY0KSwKKyAgICBXVENQKDB4NjU5ZjM0OGUsIDB4NGRkM2EwOGMpLCBXVENQKDB4NjU2ODY4YzMsIDB4NGUxYWY5NGIpLAorICAgIFdUQ1AoMHg2NTMxNjEwZCwgMHg0ZTYyMzgyNSksIFdUQ1AoMHg2NGZhMWRhMywgMHg0ZWE5NWM5ZCksCisgICAgV1RDUCgweDY0YzI5ZWJiLCAweDRlZjA2NjM3KSwgV1RDUCgweDY0OGFlNDhkLCAweDRmMzc1NDc3KSwKKyAgICBXVENQKDB4NjQ1MmVmNTMsIDB4NGY3ZTI2ZTEpLCBXVENQKDB4NjQxYWJmNDYsIDB4NGZjNGRjZmIpLAorICAgIFdUQ1AoMHg2M2UyNTRhMiwgMHg1MDBiNzY0OSksIFdUQ1AoMHg2M2E5YWZhMiwgMHg1MDUxZjI1MyksCisgICAgV1RDUCgweDYzNzBkMDgzLCAweDUwOTg1MDlmKSwgV1RDUCgweDYzMzdiNzg0LCAweDUwZGU5MGIzKSwKKyAgICBXVENQKDB4NjJmZTY0ZTMsIDB4NTEyNGIyMTgpLCBXVENQKDB4NjJjNGQ4ZTAsIDB4NTE2YWI0NTUpLAorICAgIFdUQ1AoMHg2MjhiMTNiYywgMHg1MWIwOTZmMyksIFdUQ1AoMHg2MjUxMTViOCwgMHg1MWY2NTk3YiksCisgICAgV1RDUCgweDYyMTZkZjE4LCAweDUyM2JmYjc4KSwgV1RDUCgweDYxZGM3MDFmLCAweDUyODE3YzcyKSwKKyAgICBXVENQKDB4NjFhMWM5MTIsIDB4NTJjNmRiZjUpLCBXVENQKDB4NjE2NmVhMzYsIDB4NTMwYzE5OGQpLAorICAgIFdUQ1AoMHg2MTJiZDNkMiwgMHg1MzUxMzRjNSksIFdUQ1AoMHg2MGYwODYyZCwgMHg1Mzk2MmQyYSksCisgICAgV1RDUCgweDYwYjUwMTkwLCAweDUzZGIwMjRhKSwgV1RDUCgweDYwNzk0NjQ0LCAweDU0MWZiM2IxKSwKKyAgICBXVENQKDB4NjAzZDU0OTQsIDB4NTQ2NDQwZWYpLCBXVENQKDB4NjAwMTJjY2EsIDB4NTRhOGE5OTIpLAorICAgIFdUQ1AoMHg1ZmM0Y2YzMywgMHg1NGVjZWQyYiksIFdUQ1AoMHg1Zjg4M2MxYywgMHg1NTMxMGI0OCksCisgICAgV1RDUCgweDVmNGI3M2QyLCAweDU1NzUwMzdjKSwgV1RDUCgweDVmMGU3NmE1LCAweDU1YjhkNTU4KSwKKyAgICBXVENQKDB4NWVkMTQ0ZTUsIDB4NTVmYzgwNmYpLCBXVENQKDB4NWU5M2RlZTEsIDB4NTY0MDA0NTIpLAorICAgIFdUQ1AoMHg1ZTU2NDRlYywgMHg1NjgzNjA5NiksIFdUQ1AoMHg1ZTE4Nzc1NywgMHg1NmM2OTRjZiksCisgICAgV1RDUCgweDVkZGE3Njc3LCAweDU3MDlhMDkyKSwgV1RDUCgweDVkOWM0MjlmLCAweDU3NGM4Mzc0KSwKKyAgICBXVENQKDB4NWQ1ZGRjMjQsIDB4NTc4ZjNkMGQpLCBXVENQKDB4NWQxZjQzNWQsIDB4NTdkMWNjZjIpLAorICAgIFdUQ1AoMHg1Y2UwNzhhMCwgMHg1ODE0MzJiZCksIFdUQ1AoMHg1Y2ExN2M0NSwgMHg1ODU2NmUwNCksCisgICAgV1RDUCgweDVjNjI0ZWE0LCAweDU4OTg3ZTYzKSwgV1RDUCgweDVjMjJmMDE2LCAweDU4ZGE2MzcyKSwKKyAgICBXVENQKDB4NWJlMzYwZjYsIDB4NTkxYzFjY2MpLCBXVENQKDB4NWJhM2ExOWYsIDB4NTk1ZGFhMGQpLAorICAgIFdUQ1AoMHg1YjYzYjI2YywgMHg1OTlmMGFkMSksIFdUQ1AoMHg1YjIzOTNiYSwgMHg1OWUwM2ViNiksCisgICAgV1RDUCgweDVhZTM0NWU3LCAweDVhMjE0NTU4KSwgV1RDUCgweDVhYTJjOTUxLCAweDVhNjIxZTU2KSwKK307CiAKIC8qKgotICogXGJyaWVmIEhlbHBlciB0YWJsZSBjb250YWluaW5nIHRoZSBsZW5ndGgsIHJhc3RlcmFuZCBzaGFwZSBtYXBwaW5nIHRvIGluZGl2aWR1YWwgd2luZG93IHNsb3BlIHRhYmxlcy4KLSAqIFswOiBzaW5lIF1bMDogcmFkaXgyIHJhc3RlciAgICAgICAgXVtjZWlsKGxvZzIobGVuZ3RoKSkgbGVuZ3RoICAgNCAgICAuLiAxMDI0IF0KLSAqICAgICAgICAgICBbMTogMTBtcyByYXN0ZXIgICAgICAgICAgXVtjZWlsKGxvZzIobGVuZ3RoKSkgbGVuZ3RoICAgMy4yNSAuLiAgOTYwIF0KLSAqICAgICAgICAgICBbMjogMy80IG9mIHJhZGl4IDIgcmFzdGVyXVtjZWlsKGxvZzIobGVuZ3RoKSkgbGVuZ3RoICAgMyAgICAuLiAgNzY4IF0KLSAqIFsxOiBLQkQgIF1bMDogcmFkaXgyIHJhc3RlciAgICAgICAgXVtjZWlsKGxvZzIobGVuZ3RoKSkgbGVuZ3RoIDEyOCAgICAuLiAxMDI0IF0KLSAqICAgICAgICAgICBbMTogMTBtcyByYXN0ZXIgICAgICAgICAgXVtjZWlsKGxvZzIobGVuZ3RoKSkgbGVuZ3RoIDEyMCAgICAuLiAgOTYwIF0KLSAqICAgICAgICAgICBbMjogMy80IG9mIHJhZGl4IDIgcmFzdGVyXVtjZWlsKGxvZzIobGVuZ3RoKSkgbGVuZ3RoICA5NiAgICAuLiAgNzY4IF0KKyAqIFxicmllZiBIZWxwZXIgdGFibGUgY29udGFpbmluZyB0aGUgbGVuZ3RoLCByYXN0ZXJhbmQgc2hhcGUgbWFwcGluZyB0bworICogaW5kaXZpZHVhbCB3aW5kb3cgc2xvcGUgdGFibGVzLiBbMDogc2luZSBdWzA6IHJhZGl4MiByYXN0ZXIKKyAqIF1bY2VpbChsb2cyKGxlbmd0aCkpIGxlbmd0aCAgIDQgICAgLi4gMTAyNCBdIFsxOiAxMG1zIHJhc3RlcgorICogXVtjZWlsKGxvZzIobGVuZ3RoKSkgbGVuZ3RoICAgMy4yNSAuLiAgOTYwIF0gWzI6IDMvNCBvZiByYWRpeCAyCisgKiByYXN0ZXJdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggICAzICAgIC4uICA3NjggXSBbMTogS0JEICBdWzA6CisgKiByYWRpeDIgcmFzdGVyICAgICAgICBdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggMTI4ICAgIC4uIDEwMjQgXSBbMTogMTBtcworICogcmFzdGVyICAgICAgICAgIF1bY2VpbChsb2cyKGxlbmd0aCkpIGxlbmd0aCAxMjAgICAgLi4gIDk2MCBdIFsyOgorICogMy80IG9mIHJhZGl4IDIgcmFzdGVyXVtjZWlsKGxvZzIobGVuZ3RoKSkgbGVuZ3RoICA5NiAgICAuLiAgNzY4IF0KICAqLwotY29uc3QgRklYUF9XVFAgKmNvbnN0IHdpbmRvd1Nsb3Blc1syXVszXVs5XSA9Ci17Ci0gIHsgLyogU2luZSAqLwotICAgIHsgLyogUmFkaXggMiAqLwotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgU2luZVdpbmRvdzMyLAotICAgICAgU2luZVdpbmRvdzY0LAotICAgICAgU2luZVdpbmRvdzEyOCwKLSAgICAgIE5VTEwsCi0gICAgICBTaW5lV2luZG93NTEyLAotICAgICAgU2luZVdpbmRvdzEwMjQKLSAgICB9LAotICAgIHsgLyogMTBtcyByYXN0ZXIgKi8KK2NvbnN0IEZJWFBfV1RQICpjb25zdCB3aW5kb3dTbG9wZXNbMl1bNF1bOV0gPSB7CisgICAgeyAvKiBTaW5lICovCisgICAgIHsvKiBSYWRpeCAyICovCisgICAgICBOVUxMLCBTaW5lV2luZG93OCwgU2luZVdpbmRvdzE2LCBTaW5lV2luZG93MzIsIFNpbmVXaW5kb3c2NCwKKyAgICAgIFNpbmVXaW5kb3cxMjgsIFNpbmVXaW5kb3cyNTYsIFNpbmVXaW5kb3c1MTIsIFNpbmVXaW5kb3cxMDI0fSwKKyAgICAgeyAgICAgIC8qIDEwbXMgcmFzdGVyICovCiAgICAgICBOVUxMLCAvKiAzLjI1ICovCiAgICAgICBOVUxMLCAvKiA3LjUgKi8KLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIFNpbmVXaW5kb3cxMjAsIAotICAgICAgTlVMTCwKLSAgICAgIFNpbmVXaW5kb3c0ODAsCi0gICAgICBTaW5lV2luZG93OTYwCi0gICAgfSwKLSAgICB7IC8qIDMvNCByYWRpeDIgcmFzdGVyICovCisgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBTaW5lV2luZG93MTIwLCBTaW5lV2luZG93MjQwLCBTaW5lV2luZG93NDgwLAorICAgICAgU2luZVdpbmRvdzk2MH0sCisgICAgIHsgICAgICAvKiAzLzQgcmFkaXgyIHJhc3RlciAqLwogICAgICAgTlVMTCwgLyogMyAqLwogICAgICAgTlVMTCwgLyogNiAqLwotI2lmZGVmIElOQ0xVREVfU2luZVdpbmRvdzEyCi0gICAgICBTaW5lV2luZG93MTIsCi0jZWxzZQotICAgICAgTlVMTCwKLSNlbmRpZgotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfQotICB9LAotICB7IC8qIEtCRCAqLwotICAgIHsgLyogUmFkaXggMiAqLwotICAgICAgS0JEV2luZG93MTI4LAotICAgICAgTlVMTCwKLSAgICAgIFNpbmVXaW5kb3c1MTIsCi0gICAgICBLQkRXaW5kb3cxMDI0Ci0gICAgfSwKLSAgICB7IC8qIDEwbXMgcmFzdGVyICovCi0gICAgICBLQkRXaW5kb3cxMjAsCi0gICAgICBOVUxMLAotICAgICAgU2luZVdpbmRvdzQ4MCwKLSAgICAgIEtCRFdpbmRvdzk2MAotICAgIH0sCi0gICAgeyAvKiAzLzQgcmFkaXgyIHJhc3RlciAqLwotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTAotICAgIH0KLSAgfQotfTsKKyAgICAgIFNpbmVXaW5kb3cxMiwgU2luZVdpbmRvdzI0LCBTaW5lV2luZG93NDgsIFNpbmVXaW5kb3c5NiwgU2luZVdpbmRvdzE5MiwKKyAgICAgIFNpbmVXaW5kb3czODQsIFNpbmVXaW5kb3c3Njh9LAorICAgICB7CisgICAgICAgICAvKiAzLzQgcmFkaXgyIHJhc3RlciAqLworICAgICAgICAgTlVMTCwKKyAgICAgICAgIE5VTEwsIC8qIDMgKi8KKyAgICAgICAgIE5VTEwsIC8qIDYgKi8KKyAgICAgICAgIFNpbmVXaW5kb3cyMCwKKyAgICAgICAgIFNpbmVXaW5kb3c0MCwKKyAgICAgICAgIE5VTEwsCisgICAgICAgICBTaW5lV2luZG93MTYwLAorICAgICAgICAgTlVMTCwKKyAgICAgICAgIE5VTEwsCisgICAgIH19LAorICAgIHsgLyogS0JEICovCisgICAgIHsvKiBSYWRpeCAyICovCisgICAgICBOVUxMLCBLQkRXaW5kb3cxMjgsIEtCRFdpbmRvdzI1NiwgU2luZVdpbmRvdzUxMiwgS0JEV2luZG93MTAyNH0sCisgICAgIHsvKiAxMG1zIHJhc3RlciAqLworICAgICAgTlVMTCwgS0JEV2luZG93MTIwLCBOVUxMLCBTaW5lV2luZG93NDgwLCBLQkRXaW5kb3c5NjB9LAorICAgICB7LyogMy80IHJhZGl4MiByYXN0ZXIgKi8KKyAgICAgIE5VTEwsIEtCRFdpbmRvdzk2LAorICAgICAgU2luZVdpbmRvdzE5MiwgLyogVGhpcyBlbnRyeSBtaWdodCBiZSBhY2Nlc3NlZCBmb3IgZXJyZWQgYml0IHN0cmVhbXMuICovCisgICAgICBOVUxMLCBLQkRXaW5kb3c3Njh9LAorICAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH19fTsKIAotY29uc3QgRklYUF9XVFAgKiBGREtnZXRXaW5kb3dTbG9wZShpbnQgbGVuZ3RoLCBpbnQgc2hhcGUpCi17Ci0gIGNvbnN0IEZJWFBfV1RQICogdyA9IE5VTEw7Citjb25zdCBGSVhQX1dUUCAqRkRLZ2V0V2luZG93U2xvcGUoaW50IGxlbmd0aCwgaW50IHNoYXBlKSB7CisgIGNvbnN0IEZJWFBfV1RQICp3ID0gTlVMTDsKICAgaW50IHJhc3RlciwgbGQyX2xlbmd0aDsKIAogICAvKiBHZXQgbGQyIG9mIGxlbmd0aCAtIDIgKyAxCiAgICAgIC0yOiBiZWNhdXNlIGZpcnN0IHRhYmxlIGVudHJ5IGlzIHdpbmRvdyBvZiBzaXplIDQKICAgICAgKzE6IGJlY2F1c2Ugd2UgYWxyZWFkeSBpbmNsdWRlICsxIGJlY2F1c2Ugb2YgY2VpbChsb2cyKGxlbmd0aCkpICovCi0gIGxkMl9sZW5ndGggPSBERlJBQ1RfQklUUy0xLWZOb3JteigoRklYUF9EQkwpbGVuZ3RoKSAtIDE7CisgIGxkMl9sZW5ndGggPSBERlJBQ1RfQklUUyAtIDEgLSBmTm9ybXooKEZJWFBfREJMKWxlbmd0aCkgLSAxOwogCiAgIC8qIEV4dHJhY3Qgc29ydCBvZiAiZWlnZW52YWx1ZSIgKHRoZSA0IGxlZnQgbW9zdCBiaXRzKSBvZiBsZW5ndGguICovCi0gIHN3aXRjaCAoIChsZW5ndGgpID4+IChsZDJfbGVuZ3RoLTIpICkgeworICBzd2l0Y2ggKChsZW5ndGgpID4+IChsZDJfbGVuZ3RoIC0gMikpIHsKICAgICBjYXNlIDB4ODogLyogcmFkaXggMiAqLwogICAgICAgcmFzdGVyID0gMDsKICAgICAgIGxkMl9sZW5ndGgtLTsgLyogcmV2ZXJ0ICsgMSBiZWNhdXNlIG9mIGNlaWwobG9nMihsZW5ndGgpKSBmcm9tIGFib3ZlLiAqLwpAQCAtMTIzNyw5MyArNDA5MywzMyBAQAogICAgICAgYnJlYWs7CiAgIH0KIAotICAvKiBUaGUgdGFibGUgZm9yIHNpbmUgd2luZG93cyAoc2hhcGUgPT0gMCkgaXMgNSBlbnRyaWVzIGxvbmdlci4gKi8KKyAgLyogVGhlIHRhYmxlIGZvciBzaW5lIHdpbmRvd3MgKHNoYXBlID09IDApIGlzIDQgZW50cmllcyBsb25nZXIuICovCiAgIGlmIChzaGFwZSA9PSAxKSB7Ci0gICAgbGQyX2xlbmd0aC09NTsKKyAgICBsZDJfbGVuZ3RoIC09IDQ7CiAgIH0KIAogICAvKiBMb29rIHVwIHRhYmxlICovCi0gIHcgPSB3aW5kb3dTbG9wZXNbc2hhcGUmMV1bcmFzdGVyXVtsZDJfbGVuZ3RoXTsKKyAgdyA9IHdpbmRvd1Nsb3Blc1tzaGFwZSAmIDFdW3Jhc3Rlcl1bbGQyX2xlbmd0aF07CiAKICAgRkRLX0FTU0VSVCh3ICE9IE5VTEwpOwogCiAgIHJldHVybiB3OwogfQogCi0KLS8qCi0gKiBRTUYgZmlsdGVyIGFuZCB0d2lkZGxlIHRhYmxlcwotICovCisgIC8qCisgICAqIFFNRiBmaWx0ZXIgYW5kIHR3aWRkbGUgdGFibGVzCisgICAqLwogCiAjaWZkZWYgUU1GX0NPRUZGXzE2QklUCi0jZGVmaW5lIFFGQyh4KSAgRlhfREJMMkZYQ09OU1RfU0dMKHgpCi0jZGVmaW5lIFFUQ0ZMKHgpICBGTDJGWENPTlNUX1NHTCh4KQotI2RlZmluZSBRVEMoeCkgICAgRlhfREJMMkZYQ09OU1RfU0dMKHgpCisjZGVmaW5lIFFGQyh4KSBGWF9EQkwyRlhDT05TVF9TR0woeCkKKyNkZWZpbmUgUVRDRkwoeCkgRkwyRlhDT05TVF9TR0woeCkKKyNkZWZpbmUgUVRDKHgpIEZYX0RCTDJGWENPTlNUX1NHTCh4KQogI2Vsc2UKICNkZWZpbmUgUUZDKHgpICgoRklYUF9EQkwpKHgpKQotI2RlZmluZSBRVENGTCh4KSAgRkwyRlhDT05TVF9EQkwoeCkKLSNkZWZpbmUgUVRDKHgpICAoKEZJWFBfREJMKSh4KSkKKyNkZWZpbmUgUVRDRkwoeCkgRkwyRlhDT05TVF9EQkwoeCkKKyNkZWZpbmUgUVRDKHgpICgoRklYUF9EQkwpKHgpKQogI2VuZGlmIC8qIEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYgKi8KIAotI2lmbmRlZiBMT1dfUE9XRVJfU0JSX09OTFkKLS8qIQotICBcbmFtZSBRTUYtVHdpZGRsZQotICBcYnJpZWYgUU1GIHR3aWRkbGUgZmFjdG9ycwotCi0gIEw9MzIsIGdhaW49Mi4wLCBhbmdsZSA9IDAuNzUKLSovCi0KLWNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyWzMyXSA9Ci17Ci0gIFFUQ0ZMKCAwLjk5OTMyMjM4NDU4ODM1ZiksUVRDRkwoIDAuOTkzOTA2OTcwMDAyMzZmKSxRVENGTCggMC45ODMxMDU0ODc0MzEyMmYpLFFUQ0ZMKCAwLjk2Njk3NjQ3MTA0NDg1ZiksCi0gIFFUQ0ZMKCAwLjk0NTYwNzMyNTM4MDUyZiksUVRDRkwoIDAuOTE5MTEzODUxNjkwMDZmKSxRVENGTCggMC44ODc2Mzk2MjA0MDI4NWYpLFFUQ0ZMKCAwLjg1MTM1NTE5MzEwNTI3ZiksCi0gIFFUQ0ZMKCAwLjgxMDQ1NzE5ODI1MjU5ZiksUVRDRkwoIDAuNzY1MTY3MjY1NjIyNDZmKSxRVENGTCggMC43MTU3MzA4MjUyODM4MmYpLFFUQ0ZMKCAwLjY2MjQxNTc3NzU5MDE3ZiksCi0gIFFUQ0ZMKCAwLjYwNTUxMTA0MTQwNDMzZiksUVRDRkwoIDAuNTQ1MzI0OTg4NDIyMDVmKSxRVENGTCggMC40ODIxODM3NzIwNzkxMmYpLFFUQ0ZMKCAwLjQxNjQyOTU2MDA5NzY0ZiksCi0gIFFUQ0ZMKCAwLjM0ODQxODY4MDI0OTQzZiksUVRDRkwoIDAuMjc4NTE5Njg5Mzg1MDVmKSxRVENGTCggMC4yMDcxMTEzNzYxOTIyMmYpLFFUQ0ZMKCAwLjEzNDU4MDcwODUwNzEzZiksCi0gIFFUQ0ZMKCAwLjA2MTMyMDczNjMwMjIxZiksUVRDRkwoLTAuMDEyMjcxNTM4Mjg1NzJmKSxRVENGTCgtMC4wODU3OTczMTIzNDQ0NGYpLFFUQ0ZMKC0wLjE1ODg1ODE0MzMzMzg2ZiksCi0gIFFUQ0ZMKC0wLjIzMTA1ODEwODI4MDY3ZiksUVRDRkwoLTAuMzAyMDA1OTQ5MzE5MjNmKSxRVENGTCgtMC4zNzEzMTcxOTM5NTE4NGYpLFFUQ0ZMKC0wLjQzODYxNjIzODUzODUzZiksCi0gIFFUQ0ZMKC0wLjUwMzUzODM4MzcyNTcyZiksUVRDRkwoLTAuNTY1NzMxODEwNzgzNjFmKSxRVENGTCgtMC42MjQ4NTk0ODgxNDIzOWYpLFFUQ0ZMKC0wLjY4MDYwMDk5Nzc5NTQ1ZikKLX07Ci0KLWNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjMyWzMyXSA9Ci17Ci0gIFFUQ0ZMKCAwLjAzNjgwNzIyMjk0MTM2ZiksUVRDRkwoIDAuMTEwMjIyMjA3MjkzODhmKSxRVENGTCggMC4xODMwMzk4ODc5NTUxNGYpLFFUQ0ZMKCAwLjI1NDg2NTY1OTYwNDUxZiksCi0gIFFUQ0ZMKCAwLjMyNTMxMDI5MjE2MjI2ZiksUVRDRkwoIDAuMzkzOTkyMDQwMDYxMDVmKSxRVENGTCggMC40NjA1Mzg3MTA5NTgyNGYpLFFUQ0ZMKCAwLjUyNDU4OTY4MjY3ODQ3ZiksCi0gIFFUQ0ZMKCAwLjU4NTc5Nzg1NzQ1NjQ0ZiksUVRDRkwoIDAuNjQzODMxNTQyODg5NzlmKSxRVENGTCggMC42OTgzNzYyNDk0MDg5N2YpLFFUQ0ZMKCAwLjc0OTEzNjM5NDUyMzQ2ZiksCi0gIFFUQ0ZMKCAwLjc5NTgzNjkwNDYwODg4ZiksUVRDRkwoIDAuODM4MjI0NzA1NTU0ODRmKSxRVENGTCggMC44NzYwNzAwOTQxOTU0MWYpLFFUQ0ZMKCAwLjkwOTE2Nzk4MzA5MDUyZiksCi0gIFFUQ0ZMKCAwLjkzNzMzOTAxMTkxMjU3ZiksUVRDRkwoIDAuOTYwNDMwNTE5NDE1NTdmKSxRVENGTCggMC45NzgzMTczNzA3MTk2M2YpLFFUQ0ZMKCAwLjk5MDkwMjYzNTQyNzc4ZiksCi0gIFFUQ0ZMKCAwLjk5ODExODExMjkwMDE1ZiksUVRDRkwoIDAuOTk5OTI0NzAxODM5MTRmKSxRVENGTCggMC45OTYzMTI2MTIxODI3OGYpLFFUQ0ZMKCAwLjk4NzMwMTQxODE1Nzg2ZiksCi0gIFFUQ0ZMKCAwLjk3MjkzOTk1MjIwNTU2ZiksUVRDRkwoIDAuOTUzMzA2MDQwMzU0MTlmKSxRVENGTCggMC45Mjg1MDYwODA0NzMyMmYpLFFUQ0ZMKCAwLjg5ODY3NDQ2NTY5Mzk1ZiksCi0gIFFUQ0ZMKCAwLjg2Mzk3Mjg1NjEyMTU5ZiksUVRDRkwoIDAuODI0NTg5MzAyNzg1MDNmKSxRVENGTCggMC43ODA3MzcyMjg1NzIwOWYpLFFUQ0ZMKCAwLjczMjY1NDI3MTY3MjQxZikKLX07Ci1jb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3M2NFs2NF0gPSB7Ci0gIFFUQygweDdmZjYyMTgxKSwgUVRDKDB4N2ZhNzM2YjMpLCBRVEMoMHg3ZjA5OTFjMyksIFFUQygweDdlMWQ5M2U5KSwgUVRDKDB4N2NlM2NlYjEpLCBRVEMoMHg3YjVkMDM5ZCksIFFUQygweDc5OGEyM2IwKSwgUVRDKDB4Nzc2YzRlZGEpLAotICBRVEMoMHg3NTA0ZDM0NCksIFFUQygweDcyNTUyYzg0KSwgUVRDKDB4NmY1ZjAyYjEpLCBRVEMoMHg2YzI0Mjk1ZiksIFFUQygweDY4YTY5ZTgwKSwgUVRDKDB4NjRlODg5MjUpLCBRVEMoMHg2MGVjMzgyZiksIFFUQygweDVjYjQyMGRmKSwKLSAgUVRDKDB4NTg0MmRkNTQpLCBRVEMoMHg1MzliMmFlZiksIFFUQygweDRlYmZlOGE0KSwgUVRDKDB4NDliNDE1MzMpLCBRVEMoMHg0NDdhY2Q1MCksIFFUQygweDNmMTc0OWI3KSwgUVRDKDB4Mzk4Y2RkMzIpLCBRVEMoMHgzM2RlZjI4NyksCi0gIFFUQygweDJlMTEwYTYyKSwgUVRDKDB4MjgyNmI5MjgpLCBRVEMoMHgyMjIzYTRjNSksIFFUQygweDFjMGI4MjZhKSwgUVRDKDB4MTVlMjE0NDQpLCBRVEMoMHgwZmFiMjcyYiksIFFUQygweDA5NmE5MDQ5KSwgUVRDKDB4MDMyNDJhYmYpLAotICBRVEMoMHhmY2RiZDU0MSksIFFUQygweGY2OTU2ZmI3KSwgUVRDKDB4ZjA1NGQ4ZDUpLCBRVEMoMHhlYTFkZWJiYyksIFFUQygweGUzZjQ3ZDk2KSwgUVRDKDB4ZGRkYzViM2IpLCBRVEMoMHhkN2Q5NDZkOCksIFFUQygweGQxZWVmNTllKSwKLSAgUVRDKDB4Y2MyMTBkNzkpLCBRVEMoMHhjNjczMjJjZSksIFFUQygweGMwZThiNjQ5KSwgUVRDKDB4YmI4NTMyYjApLCBRVEMoMHhiNjRiZWFjZCksIFFUQygweGIxNDAxNzVjKSwgUVRDKDB4YWM2NGQ1MTEpLCBRVEMoMHhhN2JkMjJhYyksCi0gIFFUQygweGEzNGJkZjIxKSwgUVRDKDB4OWYxM2M3ZDEpLCBRVEMoMHg5YjE3NzZkYiksIFFUQygweDk3NTk2MTgwKSwgUVRDKDB4OTNkYmQ2YTEpLCBRVEMoMHg5MGEwZmQ0ZiksIFFUQygweDhkYWFkMzdjKSwgUVRDKDB4OGFmYjJjYmMpLAotICBRVEMoMHg4ODkzYjEyNiksIFFUQygweDg2NzVkYzUwKSwgUVRDKDB4ODRhMmZjNjMpLCBRVEMoMHg4MzFjMzE0ZiksIFFUQygweDgxZTI2YzE3KSwgUVRDKDB4ODBmNjZlM2QpLCBRVEMoMHg4MDU4Yzk0ZCksIFFUQygweDgwMDlkZTdmKQotfTsKLQotY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luNjRbNjRdID0gewotICBRVEMoMHgwMzI0MmFiZiksIFFUQygweDA5NmE5MDQ5KSwgUVRDKDB4MGZhYjI3MmIpLCBRVEMoMHgxNWUyMTQ0NCksIFFUQygweDFjMGI4MjZhKSwgUVRDKDB4MjIyM2E0YzUpLCBRVEMoMHgyODI2YjkyOCksIFFUQygweDJlMTEwYTYyKSwKLSAgUVRDKDB4MzNkZWYyODcpLCBRVEMoMHgzOThjZGQzMiksIFFUQygweDNmMTc0OWI3KSwgUVRDKDB4NDQ3YWNkNTApLCBRVEMoMHg0OWI0MTUzMyksIFFUQygweDRlYmZlOGE0KSwgUVRDKDB4NTM5YjJhZWYpLCBRVEMoMHg1ODQyZGQ1NCksCi0gIFFUQygweDVjYjQyMGRmKSwgUVRDKDB4NjBlYzM4MmYpLCBRVEMoMHg2NGU4ODkyNSksIFFUQygweDY4YTY5ZTgwKSwgUVRDKDB4NmMyNDI5NWYpLCBRVEMoMHg2ZjVmMDJiMSksIFFUQygweDcyNTUyYzg0KSwgUVRDKDB4NzUwNGQzNDQpLAotICBRVEMoMHg3NzZjNGVkYSksIFFUQygweDc5OGEyM2IwKSwgUVRDKDB4N2I1ZDAzOWQpLCBRVEMoMHg3Y2UzY2ViMSksIFFUQygweDdlMWQ5M2U5KSwgUVRDKDB4N2YwOTkxYzMpLCBRVEMoMHg3ZmE3MzZiMyksIFFUQygweDdmZjYyMTgxKSwKLSAgUVRDKDB4N2ZmNjIxODEpLCBRVEMoMHg3ZmE3MzZiMyksIFFUQygweDdmMDk5MWMzKSwgUVRDKDB4N2UxZDkzZTkpLCBRVEMoMHg3Y2UzY2ViMSksIFFUQygweDdiNWQwMzlkKSwgUVRDKDB4Nzk4YTIzYjApLCBRVEMoMHg3NzZjNGVkYSksCi0gIFFUQygweDc1MDRkMzQ0KSwgUVRDKDB4NzI1NTJjODQpLCBRVEMoMHg2ZjVmMDJiMSksIFFUQygweDZjMjQyOTVmKSwgUVRDKDB4NjhhNjllODApLCBRVEMoMHg2NGU4ODkyNSksIFFUQygweDYwZWMzODJmKSwgUVRDKDB4NWNiNDIwZGYpLAotICBRVEMoMHg1ODQyZGQ1NCksIFFUQygweDUzOWIyYWVmKSwgUVRDKDB4NGViZmU4YTQpLCBRVEMoMHg0OWI0MTUzMyksIFFUQygweDQ0N2FjZDUwKSwgUVRDKDB4M2YxNzQ5YjcpLCBRVEMoMHgzOThjZGQzMiksIFFUQygweDMzZGVmMjg3KSwKLSAgUVRDKDB4MmUxMTBhNjIpLCBRVEMoMHgyODI2YjkyOCksIFFUQygweDIyMjNhNGM1KSwgUVRDKDB4MWMwYjgyNmEpLCBRVEMoMHgxNWUyMTQ0NCksIFFUQygweDBmYWIyNzJiKSwgUVRDKDB4MDk2YTkwNDkpLCBRVEMoMHgwMzI0MmFiZikKLX07Ci0KLS8vQH0KLQotI2VuZGlmIC8qICNpZmRlZiBMT1dfUE9XRVJfU0JSX09OTFkgKi8KLQotCi0KIC8qIQogICBcbmFtZSBRTUYKICAgXGJyaWVmICBRTUYtVGFibGUKQEAgLTEzODgsMTIwICs0MTg0LDExMDcgQEAKIAogICBcc2hvd2luaXRpYWxpemVyCiAqLwotLy9AewotI2lmIFFNRl9OT19QT0xZPT01Ci1MTktfU0VDVElPTl9DT05TVERBVEFfTDEKIFJBTV9BTElHTgotY29uc3QgRklYUF9QRlQgcW1mXzY0W1FNRjY0MF9QRlRfVEFCTEVfU0laRStRTUZfTk9fUE9MWV0gPQotewotICBRRkMoMHgwMDAwMDAwMCksIFFGQygweDAxYjJlNDFkKSwgUUZDKDB4MmUzYTc1MzIpLCBRRkMoMHhkMWM1OGFjZSksIFFGQygweGZlNGQxYmUzKSwKLSAgUUZDKDB4ZmZlZGU1MGUpLCBRRkMoMHgwMWQ3OGJmYyksIFFGQygweDJmYWEyMjFjKSwgUUZDKDB4ZDMzMzdiM2UpLCBRRkMoMHhmZTcwYjhkMSksCi0gIFFGQygweGZmZWQ5NzhhKSwgUUZDKDB4MDFmZDNiYTApLCBRRkMoMHgzMTFhZjNhNCksIFFGQygweGQ0OWZkNTVmKSwgUUZDKDB4ZmU5MzNkYzApLAotICBRRkMoMHhmZmVmYzliOSksIFFGQygweDAyMjQ0YTI0KSwgUUZDKDB4MzI4Y2M2ZjApLCBRRkMoMHhkNjBhNDZlNiksIFFGQygweGZlYjQ4ZDBkKSwKLSAgUUZDKDB4ZmZmMDA2NWQpLCBRRkMoMHgwMjRiZjdhMSksIFFGQygweDMzZmY2NzBlKSwgUUZDKDB4ZDc3MjJmMDQpLCBRRkMoMHhmZWQ0YmVjMyksCi0gIFFGQygweGZmZWZmNmNhKSwgUUZDKDB4MDI3NGJhNDMpLCBRRkMoMHgzNTcyZWM3MCksIFFGQygweGQ4ZDdmMjIwKSwgUUZDKDB4ZmVmM2Y2YWIpLAotICBRRkMoMHhmZmVmN2I4YiksIFFGQygweDAyOWUzNWI0KSwgUUZDKDB4MzZlNjk2OTEpLCBRRkMoMHhkYTNiMTc2YSksIFFGQygweGZmMTIwZDcwKSwKLSAgUUZDKDB4ZmZlZWRmYTQpLCBRRkMoMHgwMmM4OTkwMSksIFFGQygweDM4NWE0OWMzKSwgUUZDKDB4ZGI5YjViMTIpLCBRRkMoMHhmZjJlZjcyNSksCi0gIFFGQygweGZmZWUxNjUwKSwgUUZDKDB4MDJmM2U0OGQpLCBRRkMoMHgzOWNlMDQ3NyksIFFGQygweGRjZjg5OGZiKSwgUUZDKDB4ZmY0YWFiYzgpLAotICBRRkMoMHhmZmVkNjUxZCksIFFGQygweDAzMjAxMTE2KSwgUUZDKDB4M2I0MTUxMTUpLCBRRkMoMHhkZTUyOTA4NyksIFFGQygweGZmNjU0MmQxKSwKLSAgUUZDKDB4ZmZlY2MzMWIpLCBRRkMoMHgwMzRkMDFmMSksIFFGQygweDNjYjQxMjE5KSwgUUZDKDB4ZGZhOTNhYjUpLCBRRkMoMHhmZjdlZTNmMSksCi0gIFFGQygweGZmZWJlNzdiKSwgUUZDKDB4MDM3YWQ0MzgpLCBRRkMoMHgzZTI1YjE3ZSksIFFGQygweGUwZmM0MjFlKSwgUUZDKDB4ZmY5NzVjMDEpLAotICBRRkMoMHhmZmViNTBiMiksIFFGQygweDAzYTk2NmJiKSwgUUZDKDB4M2Y5NjJmYjgpLCBRRkMoMHhlMjRiOGY2NyksIFFGQygweGZmYWVhNWQ2KSwKLSAgUUZDKDB4ZmZlYTkxOTIpLCBRRkMoMHgwM2Q4YWZlNiksIFFGQygweDQxMDU4YmM1KSwgUUZDKDB4ZTM5NmE0NWQpLCBRRkMoMHhmZmM0ZTM2NSksCi0gIFFGQygweGZmZTljYTc2KSwgUUZDKDB4MDQwODNmZWMpLCBRRkMoMHg0MjcyYTM4NSksIFFGQygweGU0ZGUwY2IwKSwgUUZDKDB4ZmZkYTE3ZjIpLAotICBRRkMoMHhmZmU5NDBmNCksIFFGQygweDA0Mzg4OWM2KSwgUUZDKDB4NDNkZTYyMGEpLCBRRkMoMHhlNjIwYzQ3NiksIFFGQygweGZmZWUxODNiKSwKLSAgUUZDKDB4ZmZlODhiYTgpLCBRRkMoMHgwNDY5NDEwMSksIFFGQygweDQ1NDdkYWVhKSwgUUZDKDB4ZTc1ZjhiYjgpLCBRRkMoMHgwMDAwZTc5MCksCi0gIFFGQygweGZmZTgzYTA3KSwgUUZDKDB4MDQ5YWE4MmYpLCBRRkMoMHg0NmFlYTg1NiksIFFGQygweGU4OTk3MWI3KSwgUUZDKDB4MDAxMzFjNzUpLAotICBRRkMoMHhmZmU3OWUxNiksIFFGQygweDA0Y2MyZmNmKSwgUUZDKDB4NDgxMmY4NDgpLCBRRkMoMHhlOWNlYTg0YSksIFFGQygweDAwMjNiOTg5KSwKLSAgUUZDKDB4ZmZlNzc0NmUpLCBRRkMoMHgwNGZlMjBiZSksIFFGQygweDQ5NzNmZWYxKSwgUUZDKDB4ZWFmZWU3ZjEpLCBRRkMoMHgwMDMzYjkyNyksCi0gIFFGQygweGZmZTZkNDY2KSwgUUZDKDB4MDUzMDNmODgpLCBRRkMoMHg0YWQyMzdhMiksIFFGQygweGVjMmEzZjYwKSwgUUZDKDB4MDA0MjZmMzYpLAotICBRRkMoMHhmZmU2YWZlZCksIFFGQygweDA1NjI2MjA5KSwgUUZDKDB4NGMyY2EzZGYpLCBRRkMoMHhlZDUwYTMxZCksIFFGQygweDAwNTA0ZjQxKSwKLSAgUUZDKDB4ZmZlNjU0MTYpLCBRRkMoMHgwNTk1MDEyMiksIFFGQygweDRkODM5NzZjKSwgUUZDKDB4ZWU3MWIyZmUpLCBRRkMoMHgwMDVkMzZkZiksCi0gIFFGQygweGZmZTY4MWM2KSwgUUZDKDB4MDVjNzZmZWQpLCBRRkMoMHg0ZWQ2MmJlMiksIFFGQygweGVmOGQ0ZDdiKSwgUUZDKDB4MDA2OTI4YTApLAotICBRRkMoMHhmZmU2NmRkMCksIFFGQygweDA1ZjljMDUxKSwgUUZDKDB4NTAyNGQ3MGUpLCBRRkMoMHhmMGEzOTU5ZiksIFFGQygweDAwNzQwMGI4KSwKLSAgUUZDKDB4ZmZlNjZmYWIpLCBRRkMoMHgwNjJiZjVlYyksIFFGQygweDUxNmVlZmI4KSwgUUZDKDB4ZjFiNDYxYWIpLCBRRkMoMHgwMDdlMDM5MyksCi0gIFFGQygweGZmZTY5NDIzKSwgUUZDKDB4MDY1ZGQ1NmEpLCBRRkMoMHg1MmI0NDlkZCksIFFGQygweGYyYmY2ZWE0KSwgUUZDKDB4MDA4NzJjNjMpLAotICBRRkMoMHhmZmU2ZmVkNCksIFFGQygweDA2OGY4YjQ0KSwgUUZDKDB4NTNmNDk1YTkpLCBRRkMoMHhmM2M0ZTg4NyksIFFGQygweDAwOGY4N2FhKSwKLSAgUUZDKDB4ZmZlNzUzNjEpLCBRRkMoMHgwNmMwZjBjMCksIFFGQygweDU1MmY4ZmY2KSwgUUZDKDB4ZjRjNDczYzYpLCBRRkMoMHgwMDk2ZGNjMiksCi0gIFFGQygweGZmZTgwNDE0KSwgUUZDKDB4MDZmMTgyNWQpLCBRRkMoMHg1NjY1NGJkYyksIFFGQygweGY1YmUwZmE5KSwgUUZDKDB4MDA5ZGE1MjYpLAotICBRRkMoMHhmZmU4NWI0YSksIFFGQygweDA3MjFiZjIyKSwgUUZDKDB4NTc5NTA1ZjQpLCBRRkMoMHhmNmIxZjNjMyksIFFGQygweDAwYTM1MDhmKSwKLSAgUUZDKDB4ZmZlOTU0ZDApLCBRRkMoMHgwNzUxMTJhMiksIFFGQygweDU4YmVmYWNjKSwgUUZDKDB4Zjc5ZmExM2EpLCBRRkMoMHgwMGE4NWU5NCksCi0gIFFGQygweGZmZWEzNTNhKSwgUUZDKDB4MDc3ZmVkYjMpLCBRRkMoMHg1OWUyZjY5ZSksIFFGQygweGY4ODc1MDdjKSwgUUZDKDB4MDBhY2JkMmYpLAotICBRRkMoMHhmZmViMzg0OSksIFFGQygweDA3YWQ4YzI2KSwgUUZDKDB4NWIwMDFkYjcpLCBRRkMoMHhmOTY5MTZmNSksIFFGQygweDAwYjA2YjY4KSwKLSAgUUZDKDB4ZmZlYzg0MDkpLCBRRkMoMHgwN2RhMmI3ZiksIFFGQygweDVjMTZkMGFlKSwgUUZDKDB4ZmE0NGEwNjkpLCBRRkMoMHgwMGIzNmFjZCksCi0gIFFGQygweGZmZWRjNDE4KSwgUUZDKDB4MDgwNjE2NzEpLCBRRkMoMHg1ZDI2YmU5YiksIFFGQygweGZiMTliN2JkKSwgUUZDKDB4MDBiNThjOGQpLAotICBRRkMoMHhmZmVmMjM5NSksIFFGQygweDA4MzAzODk3KSwgUUZDKDB4NWUyZjYzNjYpLCBRRkMoMHhmYmU4ZjViZCksIFFGQygweDAwYjczYWIwKSwKLSAgUUZDKDB4ZmZmMGU3ZWYpLCBRRkMoMHgwODU5NDg4NyksIFFGQygweDVmMzBmZjVlKSwgUUZDKDB4ZmNiMWQ3NDApLCBRRkMoMHgwMGI4NWY3MCksCi0gIFFGQygweGZmZjI5NGMzKSwgUUZDKDB4MDg4MGZmZGQpLCBRRkMoMHg2MDJiMGM3ZSksIFFGQygweGZkNzQ3NWQ4KSwgUUZDKDB4MDBiOGM2YjApLAotICBRRkMoMHhmZmY0ODcwMCksIFFGQygweDA4YTc1ZGE0KSwgUUZDKDB4NjExZDU4YTIpLCBRRkMoMHhmZTMxMDY1NyksIFFGQygweDAwYjhmZTBkKSwKLSAgUUZDKDB4ZmZmNjgxZDYpLCBRRkMoMHgwOGNiNGUyMyksIFFGQygweDYyMDdmMjFmKSwgUUZDKDB4ZmVlNzIzYzYpLCBRRkMoMHgwMGI4Mzk0YiksCi0gIFFGQygweGZmZjkxZmM5KSwgUUZDKDB4MDhlZGZlYWEpLCBRRkMoMHg2MmVhNjQ3MyksIFFGQygweGZmOTZkYjhmKSwgUUZDKDB4MDBiNzRjMzcpLAotICBRRkMoMHhmZmZiNDJiMCksIFFGQygweDA5MGVjMWZjKSwgUUZDKDB4NjNjNDUyNDMpLCBRRkMoMHgwMDQwYzQ5NyksIFFGQygweDAwYjVjODY3KSwKLSAgUUZDKDB4ZmZmZGZhMjQpLCBRRkMoMHgwOTJkNzk3MCksIFFGQygweDY0OTY0MDYyKSwgUUZDKDB4MDBlNDJmYTIpLCBRRkMoMHgwMGIzZDE1YyksCi0gIFFGQygweDAwMDA3MTM0KSwgUUZDKDB4MDk0OWVhYWMpLCBRRkMoMHg2NTVmNjNmMSksIFFGQygweDAxODE2ZTA2KSwgUUZDKDB4MDBiMTk3OGQpLAotICBRRkMoMHgwMDAzOTYwOSksIFFGQygweDA5NjNlZDQ2KSwgUUZDKDB4NjYxZmQ2YjcpLCBRRkMoMHgwMjE4NmE5MiksIFFGQygweDAwYWYzNzRjKSwKLSAgUUZDKDB4MDAwNmIxY2YpLCBRRkMoMHgwOTdjMWVlOCksIFFGQygweDY2ZDc2NzI0KSwgUUZDKDB4MDJhOTkwOTcpLCBRRkMoMHgwMGFiZTc5ZSksCi0gIFFGQygweDAwMDlhYTNmKSwgUUZDKDB4MDk5MTQwYTcpLCBRRkMoMHg2Nzg1YzI0YyksIFFGQygweDAzMzQzNTM0KSwgUUZDKDB4MDBhODczOWQpLAotICBRRkMoMHgwMDBkMzFiNSksIFFGQygweDA5YTNlMTYzKSwgUUZDKDB4NjgyYjM5YTMpLCBRRkMoMHgwM2I4ZjhkYyksIFFGQygweDAwYTUyMGJiKSwKLSAgUUZDKDB4MDAxMGJjNjMpLCBRRkMoMHgwOWIzZDc3ZiksIFFGQygweDY4YzcyNjliKSwgUUZDKDB4MDQzN2ZiMGEpLCBRRkMoMHgwMGExMDM5YyksCi0gIFFGQygweDAwMTQ3MWY4KSwgUUZDKDB4MDljMGU1OWYpLCBRRkMoMHg2OTU5NzA5YyksIFFGQygweDA0YjBhZGNiKSwgUUZDKDB4MDA5ZDEwYmYpLAotICBRRkMoMHgwMDE4NzAzZiksIFFGQygweDA5Y2FiOWYyKSwgUUZDKDB4NjllMjk3ODMpLCBRRkMoMHgwNTIzN2Y5ZCksIFFGQygweDAwOThiODU1KSwKLSAgUUZDKDB4MDAxYzM1NDkpLCBRRkMoMHgwOWQxOWNhOSksIFFGQygweDZhNjE5YzVlKSwgUUZDKDB4MDU5MGE2N2QpLCBRRkMoMHgwMDk0MjRjNiksCi0gIFFGQygweDAwMjA2NGY4KSwgUUZDKDB4MDlkNTI3MDkpLCBRRkMoMHg2YWQ3M2U4ZCksIFFGQygweDA1ZjdmYjkwKSwgUUZDKDB4MDA4ZjRiZmQpLAotICBRRkMoMHgwMDI0ZGQ1MCksIFFGQygweDA5ZDU1NjBiKSwgUUZDKDB4NmI0MmE4NjMpLCBRRkMoMHgwNjU5MzkxMiksIFFGQygweDAwOGE3ZGQ3KSwKLSAgUUZDKDB4MDAyOTM3MTgpLCBRRkMoMHgwOWQxZmEyMyksIFFGQygweDZiYTQ2MjllKSwgUUZDKDB4MDZiNTU5YzMpLCBRRkMoMHgwMDg1YzIxNyksCi0gIFFGQygweDAwMmQ4ZTQyKSwgUUZDKDB4MDljYWViMGYpLCBRRkMoMHg2YmZiZGQ5NyksIFFGQygweDA3MGJiZjU4KSwgUUZDKDB4MDA4MDc5OTQpLAotICBRRkMoMHgwMDMyOWFiNiksIFFGQygweDA5YzAxOGNlKSwgUUZDKDB4NmM0OTIyMTYpLCBRRkMoMHgwNzVjYTkwYyksIFFGQygweDAwN2IzODc1KSwKLSAgUUZDKDB4MDAzNzQ1ZjkpLCBRRkMoMHgwOWIxOGExZCksIFFGQygweDZjOGM0Yzc5KSwgUUZDKDB4MDdhODEyN2QpLCBRRkMoMHgwMDc1ZmRlZCksCi0gIFFGQygweDAwM2MxZmE0KSwgUUZDKDB4MDk5ZWMzZGMpLCBRRkMoMHg2Y2M1OWJhYSksIFFGQygweDA3ZWU1MDdjKSwgUUZDKDB4MDA3MGM4YTUpLAotICBRRkMoMHgwMDQxMDNmNSksIFFGQygweDA5ODgxZGM1KSwgUUZDKDB4NmNmNDA3M2QpLCBRRkMoMHgwODJmNTUyZSksIFFGQygweDAwNmI0N2ZhKSwKLSAgUUZDKDB4MDA0NjUzNDgpLCBRRkMoMHgwOTZkMGUyMSksIFFGQygweDZkMTg1MjBkKSwgUUZDKDB4MDg2YjFlZWMpLCBRRkMoMHgwMDY1ZmRlNSksCi0gIFFGQygweDAwNGI2YzQ2KSwgUUZDKDB4MDk0ZDdlYzIpLCBRRkMoMHg2ZDMyNzMwZSksIFFGQygweDA4YTI0ODk5KSwgUUZDKDB4MDA2MDkwYzQpLAotICBRRkMoMHgwMDUwYjE3NyksIFFGQygweDA5Mjk5ZWFkKSwgUUZDKDB4NmQ0MWQ5NjMpLCBRRkMoMHgwOGQzZTQxYiksIFFGQygweDAwNWI1MzcxKSwKLSAgUUZDKDB4MDA1NWRiYTEpLCBRRkMoMHgwOTAxNTY1MSksIFFGQygweDZkNDc0ZTFkKSwgUUZDKDB4MDkwMTU2NTEpLCBRRkMoMHgwMDU1ZGJhMSksCi0gIFFGQygweGZlNGQxYmUzKSwgUUZDKDB4ZDFjNThhY2UpLCBRRkMoMHgyZTNhNzUzMiksIFFGQygweDAxYjJlNDFkKSwgUUZDKDB4MDAwMDAwMDApLAorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1BGVCBxbWZfcGZpbHQxMjBbXSA9IHsKKyAgICBRRkMoMHgwMDAwMDAwMCksIFFGQygweDAxYjJlNDFkKSwgUUZDKDB4MmUzYTc1MzIpLCBRRkMoMHhkMWM1OGFjZSksCisgICAgUUZDKDB4ZmU0ZDFiZTMpLCBRRkMoMHhmZmVmY2RiNSksIFFGQygweDAyODI4ZTEzKSwgUUZDKDB4MzVlZWNmZDEpLAorICAgIFFGQygweGQ5NGU1M2UzKSwgUUZDKDB4ZmVmZGZlNDIpLCBRRkMoMHhmZmVjMzBiMCksIFFGQygweDAzNmI4ZTIwKSwKKyAgICBRRkMoMHgzZGFhN2M1YyksIFFGQygweGUwOGIzZmE2KSwgUUZDKDB4ZmY4ZjMzZmMpLCBRRkMoMHhmZmU4OGJhOCksCisgICAgUUZDKDB4MDQ2OTQxMDEpLCBRRkMoMHg0NTQ3ZGFlYiksIFFGQygweGU3NWY4YmI3KSwgUUZDKDB4MDAwMGU3OTApLAorICAgIFFGQygweGZmZTY5MTUwKSwgUUZDKDB4MDU3MzQxYmMpLCBRRkMoMHg0YzllZjUwZiksIFFGQygweGVkYjBmZGJkKSwKKyAgICBRRkMoMHgwMDU0OWM3NiksIFFGQygweGZmZTZkYjQzKSwgUUZDKDB4MDY3ZWY5NTEpLCBRRkMoMHg1Mzg5ZDFiYiksCisgICAgUUZDKDB4ZjM2ZGJmZTYpLCBRRkMoMHgwMDhjYmU5MiksIFFGQygweGZmZWEzNTNhKSwgUUZDKDB4MDc3ZmVkYjMpLAorICAgIFFGQygweDU5ZTJmNjllKSwgUUZDKDB4Zjg4NzUwN2MpLCBRRkMoMHgwMGFjYmQyZiksIFFGQygweGZmZjE3NmUxKSwKKyAgICBRRkMoMHgwODY2ODVhNCksIFFGQygweDVmODQ1OTE0KSwgUUZDKDB4ZmNmMmI2YzgpLCBRRkMoMHgwMGI4ODFkYiksCisgICAgUUZDKDB4ZmZmZDEyNTMpLCBRRkMoMHgwOTIzM2M0OSksIFFGQygweDY0NTA0NjU4KSwgUUZDKDB4MDBhZGI2OWUpLAorICAgIFFGQygweDAwYjQ3OTBhKSwgUUZDKDB4MDAwZDMxYjUpLCBRRkMoMHgwOWEzZTE2MyksIFFGQygweDY4MmIzOWE0KSwKKyAgICBRRkMoMHgwM2I4ZjhkYyksIFFGQygweDAwYTUyMGJiKSwgUUZDKDB4MDAyMWUyNmIpLCBRRkMoMHgwOWQ1MzZiNCksCisgICAgUUZDKDB4NmFmYjBjODApLCBRRkMoMHgwNjE4NjU2NiksIFFGQygweDAwOGRiMWYwKSwgUUZDKDB4MDAzYTgxYzApLAorICAgIFFGQygweDA5YTUwNWYyKSwgUUZDKDB4NmNiMjgxNDUpLCBRRkMoMHgwN2Q2ZTY3YyksIFFGQygweDAwNzI4NTEyKSwKKyAgICBRRkMoMHgwMDU1ZGJhMSksIFFGQygweDA5MDE1NjUxKSwgUUZDKDB4NmQ0NzRlMWQpLCBRRkMoMHgwOTAxNTY1MSksCisgICAgUUZDKDB4MDA1NWRiYTEpLCBRRkMoMHhmZTRkMWJlMyksIFFGQygweGQxYzU4YWNlKSwgUUZDKDB4MmUzYTc1MzIpLAorICAgIFFGQygweDAxYjJlNDFkKSwgUUZDKDB4MDAwMDAwMDApLAogfTsKIAogUkFNX0FMSUdOCiBMTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2Nvc19kb3duc2FtcDMyW10gPQotewotICBRVEMoMHg3ZmQ4ODc4ZSksIFFUQygweDdlOWQ1NWZjKSwgUVRDKDB4N2MyOWZiZWUpLCBRVEMoMHg3ODg0ODQxNCksIFFUQygweDczYjVlYmQxKSwgUVRDKDB4NmRjYTBkMTQpLCBRVEMoMHg2NmNmODEyMCksIFFUQygweDVlZDc3YzhhKSwKLSAgUVRDKDB4NTVmNWE0ZDIpLCBRVEMoMHg0YzNmZGZmNCksIFFUQygweDQxY2UxZTY1KSwgUVRDKDB4MzZiYTIwMTQpLCBRVEMoMHgyYjFmMzRlYiksIFFUQygweDFmMTlmOTdiKSwgUVRDKDB4MTJjODEwNmYpLCBRVEMoMHgwNjQ3ZDk3YyksCi0gIFFUQygweGY5YjgyNjg0KSwgUVRDKDB4ZWQzN2VmOTEpLCBRVEMoMHhlMGU2MDY4NSksIFFUQygweGQ0ZTBjYjE1KSwgUVRDKDB4Yzk0NWRmZWMpLCBRVEMoMHhiZTMxZTE5YiksIFFUQygweGIzYzAyMDBjKSwgUVRDKDB4YWEwYTViMmUpLAotICBRVEMoMHhhMTI4ODM3NiksIFFUQygweDk5MzA3ZWUwKSwgUVRDKDB4OTIzNWYyZWMpLCBRVEMoMHg4YzRhMTQyZiksIFFUQygweDg3N2I3YmVjKSwgUVRDKDB4ODNkNjA0MTIpLCBRVEMoMHg4MTYyYWEwNCksIFFUQygweDgwMjc3ODcyKSwKK2NvbnN0IEZJWFBfUEZUIHFtZl9wZmlsdDIwMFtdID0geworICAgIFFGQygweDAwMDAwMDAwKSwgUUZDKDB4MDFiMmU0MWQpLCBRRkMoMHgyZTNhNzUzMiksIFFGQygweGQxYzU4YWNlKSwKKyAgICBRRkMoMHhmZTRkMWJlMyksIFFGQygweGZmZWZkNWQ5KSwgUUZDKDB4MDIyYzM5YTQpLCBRRkMoMHgzMmQ2ZTZmNiksCisgICAgUUZDKDB4ZDY1MjQyMWYpLCBRRkMoMHhmZWJhZmQ2NCksIFFGQygweGZmZWYzZDJlKSwgUUZDKDB4MDJhZjJhMzkpLAorICAgIFFGQygweDM3N2I0NGE2KSwgUUZDKDB4ZGFjN2ZmNDcpLCBRRkMoMHhmZjFkOWUxZiksIFFGQygweGZmZWQwM2U5KSwKKyAgICBRRkMoMHgwMzNiMDdmZiksIFFGQygweDNjMWZjNGU0KSwgUUZDKDB4ZGYyMDI5ZDUpLCBRRkMoMHhmZjc0YTM3ZSksCisgICAgUUZDKDB4ZmZlYWI3Y2MpLCBRRkMoMHgwM2NmM2FkZSksIFFGQygweDQwYmMxMmY2KSwgUUZDKDB4ZTM1NDZjZjgpLAorICAgIFFGQygweGZmYzA3MGFmKSwgUUZDKDB4ZmZlODhiYTgpLCBRRkMoMHgwNDY5NDEwMSksIFFGQygweDQ1NDdkYWViKSwKKyAgICBRRkMoMHhlNzVmOGJiNyksIFFGQygweDAwMDBlNzkwKSwgUUZDKDB4ZmZlNzU0NmQpLCBRRkMoMHgwNTA4MjZlNiksCisgICAgUUZDKDB4NDliYTBhNDgpLCBRRkMoMHhlYjNhYzYzYSksIFFGQygweDAwMzZhYTVkKSwgUUZDKDB4ZmZlNjY2NWMpLAorICAgIFFGQygweDA1YTkyZDczKSwgUUZDKDB4NGUwYjA2MDIpLCBRRkMoMHhlZWUzMjNmZCksIFFGQygweDAwNjFmZGY5KSwKKyAgICBRRkMoMHhmZmU2ODU4ZCksIFFGQygweDA2NDllMjZiKSwgUUZDKDB4NTIzMjI1Y2YpLCBRRkMoMHhmMjU0OWNhNyksCisgICAgUUZDKDB4MDA4MzgyNzYpLCBRRkMoMHhmZmU3ZTBiZCksIFFGQygweDA2ZTdjYmE0KSwgUUZDKDB4NTYyNzU5N2MpLAorICAgIFFGQygweGY1OGMyM2FlKSwgUUZDKDB4MDA5YzQ5ZGYpLCBRRkMoMHhmZmVhMzUzYSksIFFGQygweDA3N2ZlZGIzKSwKKyAgICBRRkMoMHg1OWUyZjY5ZSksIFFGQygweGY4ODc1MDdjKSwgUUZDKDB4MDBhY2JkMmYpLCBRRkMoMHhmZmVlMGE2NCksCisgICAgUUZDKDB4MDgwZTgzYWMpLCBRRkMoMHg1ZDViYWM1ZSksIFFGQygweGZiNDMyYThhKSwgUUZDKDB4MDBiNWUyOTQpLAorICAgIFFGQygweGZmZjM1YzBmKSwgUUZDKDB4MDg5MDU4OTMpLCBRRkMoMHg2MDhiZjdjMSksIFFGQygweGZkYmZlMmQ4KSwKKyAgICBRRkMoMHgwMGI4ZGNkNiksIFFGQygweGZmZmE2N2VkKSwgUUZDKDB4MDkwMWE3MGYpLCBRRkMoMHg2MzZkMjY1NyksCisgICAgUUZDKDB4ZmZmY2NkYzcpLCBRRkMoMHgwMGI2NjM4NyksIFFGQygweDAwMDJmNTEyKSwgUUZDKDB4MDk1ZWI5OGUpLAorICAgIFFGQygweDY1Zjk1OTVkKSwgUUZDKDB4MDFmYTM4MGYpLCBRRkMoMHgwMGFmYjBmMyksIFFGQygweDAwMGQzMWI1KSwKKyAgICBRRkMoMHgwOWEzZTE2MyksIFFGQygweDY4MmIzOWE0KSwgUUZDKDB4MDNiOGY4ZGMpLCBRRkMoMHgwMGE1MjBiYiksCisgICAgUUZDKDB4MDAxOTMxNDEpLCBRRkMoMHgwOWNjMWE3ZCksIFFGQygweDY5ZmJmZWUzKSwgUUZDKDB4MDUzOTU0MzApLAorICAgIFFGQygweDAwOTdjZTA1KSwgUUZDKDB4MDAyNjlhZDQpLCBRRkMoMHgwOWQzZmUxNCksIFFGQygweDZiNjliZmFmKSwKKyAgICBRRkMoMHgwNjdlMTJmMiksIFFGQygweDAwODg5OTI0KSwgUUZDKDB4MDAzNTY3ZGUpLCBRRkMoMHgwOWI3NWNjYSksCisgICAgUUZDKDB4NmM3MTZlYjkpLCBRRkMoMHgwNzg5ZTg1MCksIFFGQygweDAwNzgxNTU2KSwgUUZDKDB4MDA0NTQzNmEpLAorICAgIFFGQygweDA5NzI3N2E5KSwgUUZDKDB4NmQxMTBmZTQpLCBRRkMoMHgwODVmMjljNiksIFFGQygweDAwNjcwY2I2KSwKKyAgICBRRkMoMHgwMDU1ZGJhMSksIFFGQygweDA5MDE1NjUxKSwgUUZDKDB4NmQ0NzRlMWQpLCBRRkMoMHgwOTAxNTY1MSksCisgICAgUUZDKDB4MDA1NWRiYTEpLCBRRkMoMHhmZTRkMWJlMyksIFFGQygweGQxYzU4YWNlKSwgUUZDKDB4MmUzYTc1MzIpLAorICAgIFFGQygweDAxYjJlNDFkKSwgUUZDKDB4MDAwMDAwMDApLAogfTsKIAogUkFNX0FMSUdOCiBMTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3Npbl9kb3duc2FtcDMyW10gPQotewotICBRVEMoMHgwNjQ3ZDk3YyksIFFUQygweDEyYzgxMDZmKSwgUVRDKDB4MWYxOWY5N2IpLCBRVEMoMHgyYjFmMzRlYiksIFFUQygweDM2YmEyMDE0KSwgUVRDKDB4NDFjZTFlNjUpLCBRVEMoMHg0YzNmZGZmNCksIFFUQygweDU1ZjVhNGQyKSwKLSAgUVRDKDB4NWVkNzdjOGEpLCBRVEMoMHg2NmNmODEyMCksIFFUQygweDZkY2EwZDE0KSwgUVRDKDB4NzNiNWViZDEpLCBRVEMoMHg3ODg0ODQxNCksIFFUQygweDdjMjlmYmVlKSwgUVRDKDB4N2U5ZDU1ZmMpLCBRVEMoMHg3ZmQ4ODc4ZSksCi0gIFFUQygweDdmZDg4NzhlKSwgUVRDKDB4N2U5ZDU1ZmMpLCBRVEMoMHg3YzI5ZmJlZSksIFFUQygweDc4ODQ4NDE0KSwgUVRDKDB4NzNiNWViZDEpLCBRVEMoMHg2ZGNhMGQxNCksIFFUQygweDY2Y2Y4MTIwKSwgUVRDKDB4NWVkNzdjOGEpLAotICBRVEMoMHg1NWY1YTRkMiksIFFUQygweDRjM2ZkZmY0KSwgUVRDKDB4NDFjZTFlNjUpLCBRVEMoMHgzNmJhMjAxNCksIFFUQygweDJiMWYzNGViKSwgUVRDKDB4MWYxOWY5N2IpLCBRVEMoMHgxMmM4MTA2ZiksIFFUQygweDA2NDdkOTdjKSwKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczQwW10gPSB7CisgICAgUVRDKDB4N2ZlZjUyNjApLCBRVEMoMHg3ZjY5ZmY3NiksIFFUQygweDdlNWZlNDkzKSwgUVRDKDB4N2NkMjE3MDcpLAorICAgIFFUQygweDdhYzIzNTYxKSwgUVRDKDB4NzgzMjY1YzApLCBRVEMoMHg3NTI1NTM5MiksIFFUQygweDcxOWUyY2QyKSwKKyAgICBRVEMoMHg2ZGEwOWViMSksIFFUQygweDY5MzBkMWM0KSwgUVRDKDB4NjQ1MzY1YjIpLCBRVEMoMHg1ZjBkNmM1YiksCisgICAgUVRDKDB4NTk2NDY0OTgpLCBRVEMoMHg1MzVlMzQ3OSksIFFUQygweDRkMDEyMzI0KSwgUVRDKDB4NDY1M2QyNGIpLAorICAgIFFUQygweDNmNWQzNzNlKSwgUVRDKDB4MzgyNDkzYjApLCBRVEMoMHgzMGIxNmUyMyksIFFUQygweDI5MGI4YTEyKSwKKyAgICBRVEMoMHgyMTNhZGZkYSksIFFUQygweDE5NDc5NDZjKSwgUVRDKDB4MTEzOWYwY2YpLCBRVEMoMHgwOTFhNTk3ZSksCisgICAgUVRDKDB4MDBmMTQ1YWIpLCBRVEMoMHhmOGM3MzY2OCksIFFUQygweGYwYTRhZGNmKSwgUVRDKDB4ZTg5MjI2MjIpLAorICAgIFFUQygweGUwOTgwOGY1KSwgUVRDKDB4ZDhiZWE2NmEpLCBRVEMoMHhkMTBlMmM4OSksIFFUQygweGM5OGU5ZWI1KSwKKyAgICBRVEMoMHhjMjQ3Y2Q1YSksIFFUQygweGJiNDE0ZGMwKSwgUVRDKDB4YjQ4MjcyMjgpLCBRVEMoMHhhZTEyNDIyYyksCisgICAgUVRDKDB4YTdmNzczNmEpLCBRVEMoMHhhMjM4NjI4NCksIFFUQygweDljZGIwYzgzKSwgUVRDKDB4OTdlNTA4OTYpLAogfTsKIAotI2Vsc2UgLyogUU1GX05PX1BPTFkgPT0gNSAqLwotI2VuZGlmIC8qIFFNRl9OT19QT0xZPT01ICovCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luNDBbXSA9IHsKKyAgICBRVEMoMHgwNDE1NTgzYiksIFFUQygweDBjM2JjNzRmKSwgUVRDKDB4MTQ1NTc2YjEpLCBRVEMoMHgxYzU5ZjU1NyksCisgICAgUVRDKDB4MjQ0MGU4NGQpLCBRVEMoMHgyYzAyMTM2OSksIFFUQygweDMzOTU2MWUxKSwgUVRDKDB4M2FmMmVlYjcpLAorICAgIFFUQygweDQyMTMwY2YwKSwgUVRDKDB4NDhlZTRmOTgpLCBRVEMoMHg0ZjdkOTE3YyksIFFUQygweDU1YjlmYzllKSwKKyAgICBRVEMoMHg1YjlkMTE1NCksIFFUQygweDYxMjBhZDBkKSwgUVRDKDB4NjYzZjEwYjcpLCBRVEMoMHg2YWYyZTZiYyksCisgICAgUVRDKDB4NmYzNzQ4OTEpLCBRVEMoMHg3MzA3YzNkMCksIFFUQygweDc2NjA1ZWRiKSwgUVRDKDB4NzkzZDlkMDMpLAorICAgIFFUQygweDdiOWM4MjI2KSwgUVRDKDB4N2Q3YTk1Y2YpLCBRVEMoMHg3ZWQ1ZTVjNiksIFFUQygweDdmYWQwODFiKSwKKyAgICBRVEMoMHg3ZmZmMWM5YiksIFFUQygweDdmY2JjZGJjKSwgUVRDKDB4N2YxMzUwZjgpLCBRVEMoMHg3ZGQ2NjY4ZiksCisgICAgUVRDKDB4N2MxNjU4YzUpLCBRVEMoMHg3OWQ0ZmE4OSksIFFUQygweDc3MTRhNThiKSwgUVRDKDB4NzNkODM3Y2EpLAorICAgIFFUQygweDcwMjMxMDlhKSwgUVRDKDB4NmJmOTBkMWQpLCBRVEMoMHg2NzVlODQzZSksIFFUQygweDYyNTg0MjJjKSwKKyAgICBRVEMoMHg1Y2ViODM1NSksIFFUQygweDU3MWRlZWZhKSwgUVRDKDB4NTBmNTkxNDEpLCBRVEMoMHg0YTc4ZDRmMCksCit9OwogCisvKiBUaGlzIGZpbHRlciBpcyBzY2FsZWQgKDAuOCpwZmlsdCkgKi8KK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1BGVCBxbWZfcGZpbHQ0MDBbXSA9IHsKKyAgICBRRkMoMHgwMDAwMDAwMCksIFFGQygweDAxNWJlOWIxKSwgUUZDKDB4MjRmYjkwZjUpLCBRRkMoMHhkYjA0NmYwYiksCisgICAgUUZDKDB4ZmVhNDE2NGYpLCBRRkMoMHhmZmYxNWVkNiksIFFGQygweDAxOGI1M2E4KSwgUUZDKDB4MjZkMmJkNGUpLAorICAgIFFGQygweGRjZDgxMmY5KSwgUUZDKDB4ZmVkMTI1OTUpLCBRRkMoMHhmZmYzMTE3YiksIFFGQygweDAxYmNmYWU5KSwKKyAgICBRRkMoMHgyOGFiZWJmOCksIFFGQygweGRlYTgzNGU1KSwgUUZDKDB4ZmVmYmZkZWEpLCBRRkMoMHhmZmYzMmU1MyksCisgICAgUUZDKDB4MDFmMDc1ZGUpLCBRRkMoMHgyYTg2ZTU0MCksIFFGQygweGUwNzM4M2MzKSwgUUZDKDB4ZmYyNDkzNmUpLAorICAgIFFGQygweGZmZjI5NzU4KSwgUUZDKDB4MDIyNWJiNjEpLCBRRkMoMHgyYzYyOWQ1MSksIFFGQygweGUyMzk5OTA1KSwKKyAgICBRRkMoMHhmZjRhZTRlNiksIFFGQygweGZmZjFhYjczKSwgUUZDKDB4MDI1Y2I2ZDcpLCBRRkMoMHgyZTNlNjlmOSksCisgICAgUUZDKDB4ZTNmYTEzZmMpLCBRRkMoMHhmZjZlZWZkNCksIFFGQygweGZmZjBjZmVkKSwgUUZDKDB4MDI5NWEwMDApLAorICAgIFFGQygweDMwMTk2YTUwKSwgUUZDKDB4ZTViMzU0YWIpLCBRRkMoMHhmZjkwODJjYiksIFFGQygweGZmZWZkNDQyKSwKKyAgICBRRkMoMHgwMmQwMWQ2MSksIFFGQygweDMxZjJiNmFjKSwgUUZDKDB4ZTc2NWRhZGMpLCBRRkMoMHhmZmIwMDM3ZiksCisgICAgUUZDKDB4ZmZlZWY5NzApLCBRRkMoMHgwMzBjMmYxOCksIFFGQygweDMzYzlhOGM1KSwgUUZDKDB4ZTkxMDU3MmQpLAorICAgIFFGQygweGZmY2QyNmYyKSwgUUZDKDB4ZmZlZTBmOTEpLCBRRkMoMHgwMzQ5NDA4OCksIFFGQygweDM1OWNlOGJlKSwKKyAgICBRRkMoMHhlYWIyODI2NSksIFFGQygweGZmZTgxMzNmKSwgUUZDKDB4ZmZlZDNjODYpLCBRRkMoMHgwMzg3NjczNCksCisgICAgUUZDKDB4Mzc2Y2FmMjIpLCBRRkMoMHhlYzRjNmZjNiksIFFGQygweDAwMDBiOTQwKSwgUUZDKDB4ZmZlY2IwNWYpLAorICAgIFFGQygweDAzYzZiMzJiKSwgUUZDKDB4MzkzNmMxODYpLCBRRkMoMHhlZGRiZmE0YSksIFFGQygweDAwMTc0MzcyKSwKKyAgICBRRkMoMHhmZmVjNDM4YSksIFFGQygweDA0MDY4NTg1KSwgUUZDKDB4M2FmYjNiNmQpLCBRRkMoMHhlZjYyMzgyZiksCisgICAgUUZDKDB4MDAyYmJiN2UpLCBRRkMoMHhmZmViYzVjNyksIFFGQygweDA0NDZhZjRmKSwgUUZDKDB4M2NiOTE1OWYpLAorICAgIFFGQygweGYwZGUzNTE4KSwgUUZDKDB4MDAzZTA3MTMpLCBRRkMoMHhmZmViODUxNyksIFFGQygweDA0ODc1NzhmKSwKKyAgICBRRkMoMHgzZTZmMzgwMiksIFFGQygweGYyNGY0ZmZkKSwgUUZDKDB4MDA0ZTY0YzcpLCBRRkMoMHhmZmViOGIwZCksCisgICAgUUZDKDB4MDRjN2NkMGQpLCBRRkMoMHg0MDFkNzhkOCksIFFGQygweGYzYjYxMTRjKSwgUUZDKDB4MDA1Y2NkNjApLAorICAgIFFGQygweGZmZWI5ZTBhKSwgUUZDKDB4MDUwN2U4NTUpLCBRRkMoMHg0MWMxYjdkOSksIFFGQygweGY1MTA3ZDUyKSwKKyAgICBRRkMoMHgwMDY5MzUyYiksIFFGQygweGZmZWMwYzk3KSwgUUZDKDB4MDU0Nzg5ZTQpLCBRRkMoMHg0MzVjNzZkMiksCisgICAgUUZDKDB4ZjY2MDAzODApLCBRRkMoMHgwMDczZmY0NCksIFFGQygweGZmZWNiM2NhKSwgUUZDKDB4MDU4NjNjODMpLAorICAgIFFGQygweDQ0ZWM0Nzk2KSwgUUZDKDB4ZjdhMzRmYmYpLCBRRkMoMHgwMDdkMDdlNSksIFFGQygweGZmZWQ2NWFlKSwKKyAgICBRRkMoMHgwNWMzYmRkZSksIFFGQygweDQ2NzAyYTI4KSwgUUZDKDB4ZjhkYTZiMjgpLCBRRkMoMHgwMDg0NDRlZiksCisgICAgUUZDKDB4ZmZlZTkwZmIpLCBRRkMoMHgwNWZmZjE1YyksIFFGQygweDQ3ZThjNTRjKSwgUUZDKDB4ZmEwNWQ5ZmMpLAorICAgIFFGQygweDAwOGEzMGYyKSwgUUZDKDB4ZmZlZmZmNzgpLCBRRkMoMHgwNjM5ZGI1MyksIFFGQygweDQ5NTJhYjFlKSwKKyAgICBRRkMoMHhmYjIzZDk3NyksIFFGQygweDAwOGU5MzEzKSwgUUZDKDB4ZmZmMWExZWEpLCBRRkMoMHgwNjcyMDJmMCksCisgICAgUUZDKDB4NGFhZmJkMTgpLCBRRkMoMHhmYzM1YmJhMiksIFFGQygweDAwOTE4MjEwKSwgUUZDKDB4ZmZmM2E0NWYpLAorICAgIFFGQygweDA2YTc0MWI3KSwgUUZDKDB4NGJmZGZiMDYpLCBRRkMoMHhmZDNhZWU4NSksIFFGQygweDAwOTM1MGI2KSwKKyAgICBRRkMoMHhmZmY1ZTMzZiksIFFGQygweDA2ZDllMDc2KSwgUUZDKDB4NGQzY2M2MzQpLCBRRkMoMHhmZTMzMWJlMCksCisgICAgUUZDKDB4MDA5M2UzZGUpLCBRRkMoMHhmZmY4NjdkZSksIFFGQygweDA3MDkwYjRmKSwgUUZDKDB4NGU2Y2MxYjMpLAorICAgIFFGQygweGZmMWY0ZmQyKSwgUUZDKDB4MDA5MzYxMDkpLCBRRkMoMHhmZmZiODY1OCksIFFGQygweDA3MzQ4NWE1KSwKKyAgICBRRkMoMHg0ZjhhODUxMiksIFFGQygweGZmZmQ3MTZjKSwgUUZDKDB4MDA5MWU5MzkpLCBRRkMoMHhmZmZlYzZhZiksCisgICAgUUZDKDB4MDc1YzIxNTkpLCBRRkMoMHg1MDk4NjIyOCksIFFGQygweDAwY2ZiNTM2KSwgUUZDKDB4MDA4ZjdmODUpLAorICAgIFFGQygweDAwMDI1ZGE4KSwgUUZDKDB4MDc3ZWZhZDgpLCBRRkMoMHg1MTk0NDc3ZSksIFFGQygweDAxOTRmOWE2KSwKKyAgICBRRkMoMHgwMDhjOGQ4ZiksIFFGQygweDAwMDY0ZTYzKSwgUUZDKDB4MDc5ZDQyM2YpLCBRRkMoMHg1MjdkYjc1ZSksCisgICAgUUZDKDB4MDI0ZDllMWMpLCBRRkMoMHgwMDg4NmIzNiksIFFGQygweDAwMGE4ZTJhKSwgUUZDKDB4MDdiNjRkZTkpLAorICAgIFFGQygweDUzNTVjN2I2KSwgUUZDKDB4MDJmYTYwYjApLCBRRkMoMHgwMDg0MWEyZiksIFFGQygweDAwMGYyYjRmKSwKKyAgICBRRkMoMHgwN2M5NTcwNCksIFFGQygweDU0MThiZDRhKSwgUUZDKDB4MDM5OWViNmYpLCBRRkMoMHgwMDdlZWE3OSksCisgICAgUUZDKDB4MDAxNDI3NjcpLCBRRkMoMHgwN2Q2N2I5NyksIFFGQygweDU0Yzk5OGI2KSwgUUZDKDB4MDQyZGRjZjMpLAorICAgIFFGQygweDAwNzk3MTllKSwgUUZDKDB4MDAxOTNlZTgpLCBRRkMoMHgwN2RkMjdjZiksIFFGQygweDU1NjYyYzkzKSwKKyAgICBRRkMoMHgwNGI1ZGE1YyksIFFGQygweDAwNzM2OWI3KSwgUUZDKDB4MDAxZWUyNDMpLCBRRkMoMHgwN2RjY2I0NCksCisgICAgUUZDKDB4NTVlZTMyZjIpLCBRRkMoMHgwNTMxYThjMiksIFFGQygweDAwNmQ0NzUwKSwgUUZDKDB4MDAyNDcxY2UpLAorICAgIFFGQygweDA3ZDU4OGQ5KSwgUUZDKDB4NTY2MzE3YWQpLCBRRkMoMHgwNWEyZmY3YSksIFFGQygweDAwNjZjN2FhKSwKKyAgICBRRkMoMHgwMDJhYjk3ZiksIFFGQygweDA3YzVlM2Q1KSwgUUZDKDB4NTZjMTI1NjEpLCBRRkMoMHgwNjA3ZWQwZCksCisgICAgUUZDKDB4MDA2MDExMTIpLCBRRkMoMHgwMDMwZTFhZiksIFFGQygweDA3YWU5Njk4KSwgUUZDKDB4NTcwYmU5ZTgpLAorICAgIFFGQygweDA2NjJhNzhhKSwgUUZDKDB4MDA1OTU4YmIpLCBRRkMoMHgwMDM3NjkyMiksIFFGQygweDA3OGVjNjIxKSwKKyAgICBRRkMoMHg1NzQwZDk4NCksIFFGQygweDA2YjI4N2QxKSwgUUZDKDB4MDA1MjcwOTIpLCBRRkMoMHgwMDNlMDY1YyksCisgICAgUUZDKDB4MDc2NWI3NGQpLCBRRkMoMHg1NzYwN2NjYiksIFFGQygweDA2ZjgxOWVjKSwgUUZDKDB4MDA0YjkzNjMpLAorICAgIFFGQygweDAwNDRhZmI0KSwgUUZDKDB4MDczNDQ1MGUpLCBRRkMoMHg1NzZjM2U3ZSksIFFGQygweDA3MzQ0NTBlKSwKKyAgICBRRkMoMHgwMDQ0YWZiNCksIFFGQygweGZlYTQxNjRmKSwgUUZDKDB4ZGIwNDZmMGIpLCBRRkMoMHgyNGZiOTBmNSksCisgICAgUUZDKDB4MDE1YmU5YjEpLCBRRkMoMHgwMDAwMDAwMCksCit9OwogCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3MxNltdID0geworICAgIFFUQygweDdmYzI1NTk2KSwgUVRDKDB4N2RkNjY2OGYpLCBRVEMoMHg3YTA1ZWVhZCksIFFUQygweDc0NWY5ZGQxKSwKKyAgICBRVEMoMHg2Y2Y5MzRmYyksIFFUQygweDYzZWYzMjkwKSwgUVRDKDB4NTk2NDY0OTgpLCBRVEMoMHg0ZDgxNjJjNCksCisgICAgUVRDKDB4NDA3M2YyMWQpLCBRVEMoMHgzMjZlNTRjNyksIFFUQygweDIzYTY4ODdmKSwgUVRDKDB4MTQ1NTc2YjEpLAorICAgIFFUQygweDA0YjYxOTVkKSwgUVRDKDB4ZjUwNDk3ZmIpLCBRVEMoMHhlNTdkNWZkYSksIFFUQygweGQ2NWMzYjdiKSwKK307Citjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW4xNltdID0geworICAgIFFUQygweDA3ZDk1YjllKSwgUVRDKDB4MTc2ZGQ5ZGUpLCBRVEMoMHgyNmE4MjE4NiksIFFUQygweDM1NGQ5MDU3KSwKKyAgICBRVEMoMHg0MzI1YzEzNSksIFFUQygweDRmZmI2NTRkKSwgUVRDKDB4NWI5ZDExNTQpLCBRVEMoMHg2NWRkZmJkMyksCisgICAgUVRDKDB4NmU5NmE5OWQpLCBRVEMoMHg3NWE1ODVjZiksIFFUQygweDdhZWY2MzIzKSwgUVRDKDB4N2U1ZmU0OTMpLAorICAgIFFUQygweDdmZTljYmMwKSwgUVRDKDB4N2Y4NzJiZjMpLCBRVEMoMHg3ZDM5ODBlYyksIFFUQygweDc5MDlhOTJkKSwKK307CiAKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1BGVCBxbWZfcGZpbHQyNDBbXSA9IHsKKyAgICAvKiBGUCBmaWx0ZXIgaW1wbGVtZW50YXRpb24gKi8KKyAgICBRRkMoMHgwMDAwMDAwMCksIFFGQygweDAxMjFlZDY4KSwgUUZDKDB4MWVkMWEzODApLCBRRkMoMHhlMTJlNWM4MCksCisgICAgUUZDKDB4ZmVkZTEyOTgpLCBRRkMoMHhmZmY0YjQzOCksIFFGQygweDAxNjRkOGRlKSwgUUZDKDB4MjE2MTAwNjQpLAorICAgIFFGQygweGUzYjY0ZWYyKSwgUUZDKDB4ZmYxYmExYmUpLCBRRkMoMHhmZmY1MzNjZSksIFFGQygweDAxYWM1ZWI4KSwKKyAgICBRRkMoMHgyM2Y0OGE4ZSksIFFGQygweGU2MzQzN2U0KSwgUUZDKDB4ZmY1M2ZlZDcpLCBRRkMoMHhmZmY0MGVlMCksCisgICAgUUZDKDB4MDFmN2VkYjMpLCBRRkMoMHgyNjg5NTg1NSksIFFGQygweGU4YTViYjU1KSwgUUZDKDB4ZmY4NzFkMzApLAorICAgIFFGQygweGZmZjJjYjIwKSwgUUZDKDB4MDI0N2I0MTUpLCBRRkMoMHgyOTFjNTJlNCksIFFGQygweGViMDc3ZmM3KSwKKyAgICBRRkMoMHhmZmI0Y2Q1MyksIFFGQygweGZmZjE4YTIyKSwgUUZDKDB4MDI5YjA3MGUpLCBRRkMoMHgyYmFhMjlhYiksCisgICAgUUZDKDB4ZWQ1N2RhMTUpLCBRRkMoMHhmZmRkNGRmMSksIFFGQygweGZmZjA1ZDFiKSwgUUZDKDB4MDJmMGQ2MDApLAorICAgIFFGQygweDJlMmZlNzU1KSwgUUZDKDB4ZWY5NTA3ZDUpLCBRRkMoMHgwMDAwOWE2MCksIFFGQygweGZmZWZhYzM2KSwKKyAgICBRRkMoMHgwMzQ4ZmNiYyksIFFGQygweDMwYTk4YzFjKSwgUUZDKDB4ZjFiYmE4ZjIpLCBRRkMoMHgwMDFlZWQ0YyksCisgICAgUUZDKDB4ZmZlZjBiOGIpLCBRRkMoMHgwM2EyMmJkMiksIFFGQygweDMzMTRhMzcyKSwgUUZDKDB4ZjNjYjUzZDUpLAorICAgIFFGQygweDAwMzg2ODRlKSwgUUZDKDB4ZmZlZWYzZTApLCBRRkMoMHgwM2ZiZDU4YiksIFFGQygweDM1NmRlNGFiKSwKKyAgICBRRkMoMHhmNWMyNjNjMCksIFFGQygweDAwNGQ1NWQwKSwgUUZDKDB4ZmZlZjNjZDgpLCBRRkMoMHgwNDU0YTYzNyksCisgICAgUUZDKDB4MzdiMTM2NzIpLCBRRkMoMHhmNzllN2ZlYiksIFFGQygweDAwNWRkNDYxKSwgUUZDKDB4ZmZmMDE2MTkpLAorICAgIFFGQygweDA0YWJiOWMwKSwgUUZDKDB4MzlkYzVjMDApLCBRRkMoMHhmOTVmOTI3OSksIFFGQygweDAwNmE1YjRkKSwKKyAgICBRRkMoMHhmZmYxNzhkMiksIFFGQygweDA0ZmZmM2NiKSwgUUZDKDB4M2JlY2E0NTUpLCBRRkMoMHhmYjA0ZTA1MCksCisgICAgUUZDKDB4MDA3MzI4Y2EpLCBRRkMoMHhmZmYzOTBmMCksIFFGQygweDA1NGZhMWRjKSwgUUZDKDB4M2RkZDY2OGUpLAorICAgIFFGQygweGZjOGM3NTUwKSwgUUZDKDB4MDA3ODhmMTYpLCBRRkMoMHhmZmY2NGY0MCksIFFGQygweDA1OTlhZTZiKSwKKyAgICBRRkMoMHgzZmFkOTBjNyksIFFGQygweGZkZjcyNDg1KSwgUUZDKDB4MDA3YjAxM2MpLCBRRkMoMHhmZmY5YWJlNCksCisgICAgUUZDKDB4MDVkY2RlYzApLCBRRkMoMHg0MTVhYTE1NSksIFFGQygweGZmNDRjMjg0KSwgUUZDKDB4MDA3YWQwZGQpLAorICAgIFFGQygweGZmZmUwYzM3KSwgUUZDKDB4MDYxNzdkODcpLCBRRkMoMHg0MmUwMmYwMCksIFFGQygweDAwNzNjZjE0KSwKKyAgICBRRkMoMHgwMDc4NTBiMiksIFFGQygweDAwMDMxNGRkKSwgUUZDKDB4MDY0N2ZlOGIpLCBRRkMoMHg0NDNlMDQ3MiksCisgICAgUUZDKDB4MDE4NWRkYjcpLCBRRkMoMHgwMDc0MTMyOCksIFFGQygweDAwMDhjYmNlKSwgUUZDKDB4MDY2ZDQwZWIpLAorICAgIFFGQygweDQ1NzIyNjU1KSwgUUZDKDB4MDI3YjUwOTMpLCBRRkMoMHgwMDZlMTVkMiksIFFGQygweDAwMGY2N2E4KSwKKyAgICBRRkMoMHgwNjg0Zjc3MiksIFFGQygweDQ2Nzg5NTM5KSwgUUZDKDB4MDM1MzdiYzkpLCBRRkMoMHgwMDY2Yzc2ZCksCisgICAgUUZDKDB4MDAxNjk2ZjIpLCBRRkMoMHgwNjhlMjQ3YyksIFFGQygweDQ3NTIwODU1KSwgUUZDKDB4MDQxMDQzOTkpLAorICAgIFFGQygweDAwNWU3NmEwKSwgUUZDKDB4MDAxZTVlZDcpLCBRRkMoMHgwNjg3NDc2MCksIFFGQygweDQ3ZmQzZTU1KSwKKyAgICBRRkMoMHgwNGIyN2Y5MCksIFFGQygweDAwNTVhNjYzKSwgUUZDKDB4MDAyNzAxMmIpLCBRRkMoMHgwNjZlMDNmOSksCisgICAgUUZDKDB4NDg3NzAwYzcpLCBRRkMoMHgwNTM5ZWVmYyksIFFGQygweDAwNGM1OGI3KSwgUUZDKDB4MDAzMDA0MmYpLAorICAgIFFGQygweDA2NDFiMGFiKSwgUUZDKDB4NDhjMGFmYzcpLCBRRkMoMHgwNWE5MDE3MiksIFFGQygweDAwNDJjOWU3KSwKKyAgICBRRkMoMHgwMDM5M2QxNiksIFFGQygweDA2MDBlNDM1KSwgUUZDKDB4NDhkYTM0MDApLCBRRkMoMHgwNjAwZTQzNSksCisgICAgUUZDKDB4MDAzOTNkMTYpLCBRRkMoMHhmZWRlMTI5OCksIFFGQygweGUxMmU1YzgwKSwgUUZDKDB4MWVkMWEzODApLAorICAgIFFGQygweDAxMjFlZDY4KSwgUUZDKDB4MDAwMDAwMDApLAorfTsKIAorUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczI0W10gPSB7CisgICAgUVRDKDB4N2ZkZWQ1MzApLCBRVEMoMHg3ZWQ1ZTVjNiksIFFUQygweDdjYzYyYmRmKSwgUVRDKDB4NzliM2VjZTApLAorICAgIFFUQygweDc1YTU4NWNmKSwgUVRDKDB4NzBhMzVlMjUpLCBRVEMoMHg2YWI3ZDY2MyksIFFUQygweDYzZWYzMjkwKSwKKyAgICBRVEMoMHg1YzU3ODBkMyksIFFUQygweDU0MDA3YzUxKSwgUVRDKDB4NGFmYjZjOTgpLCBRVEMoMHg0MTViMDFjZSksCisgICAgUVRDKDB4MzczMzJkZmQpLCBRVEMoMHgyYzk4ZmJiYSksIFFUQygweDIxYTI2Mjk1KSwgUVRDKDB4MTY2NjE5OGQpLAorICAgIFFUQygweDBhZmI2ODA1KSwgUVRDKDB4ZmY3OWY1ODcpLCBRVEMoMHhmM2Y5OThjMCksIFFUQygweGU4OTIyNjIyKSwKKyAgICBRVEMoMHhkZDViM2U3YiksIFFUQygweGQyNmMxZTA4KSwgUVRDKDB4YzdkYjZjNTApLCBRVEMoMHhiZGJmMGQyZiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luMjRbXSA9IHsKKyAgICBRVEMoMHgwNWMxZjRlNyksIFFUQygweDExMzlmMGNmKSwgUVRDKDB4MWM4ZTNiYmUpLCBRVEMoMHgyN2E3NWM5NSksCisgICAgUVRDKDB4MzI2ZTU0YzcpLCBRVEMoMHgzY2NjZDAwNCksIFFUQygweDQ2YWQ1Mjc4KSwgUVRDKDB4NGZmYjY1NGQpLAorICAgIFFUQygweDU4YTNjMTE4KSwgUVRDKDB4NjA5NDc1YzMpLCBRVEMoMHg2N2JkMGZiZCksIFFUQygweDZlMGViYTBjKSwKKyAgICBRVEMoMHg3MzdjNWQwYiksIFFUQygweDc3ZmFiOTg5KSwgUVRDKDB4N2I4MDgwMTUpLCBRVEMoMHg3ZTA2NjQ0YyksCisgICAgUVRDKDB4N2Y4NzJiZjMpLCBRVEMoMHg3ZmZmYjlkMSksIFFUQygweDdmNmYxNDFmKSwgUVRDKDB4N2RkNjY2OGYpLAorICAgIFFUQygweDdiMzhmZmRlKSwgUVRDKDB4Nzc5YzRhZmMpLCBRVEMoMHg3MzA3YzNkMCksIFFUQygweDZkODRlN2I3KSwKK307CisKKy8qIHFtZl9wZmlsdDY0MCBpcyB1c2VkIHdpdGggc3RyaWRlIDIgaW5zdGVhZCBvZiBxbWZfcGZpbHQzMjBbXSAqLworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMzJbXSA9IHsKKyAgICBRVEMoMHg3ZmU5Y2JjMCksIFFUQygweDdmMzg1N2Y2KSwgUVRDKDB4N2RkNjY2OGYpLCBRVEMoMHg3YmM1ZTI5MCksCisgICAgUVRDKDB4NzkwOWE5MmQpLCBRVEMoMHg3NWE1ODVjZiksIFFUQygweDcxOWUyY2QyKSwgUVRDKDB4NmNmOTM0ZmMpLAorICAgIFFUQygweDY3YmQwZmJkKSwgUVRDKDB4NjFmMTAwM2YpLCBRVEMoMHg1YjlkMTE1NCksIFFUQygweDU0Y2EwYTRiKSwKKyAgICBRVEMoMHg0ZDgxNjJjNCksIFFUQygweDQ1Y2QzNThmKSwgUVRDKDB4M2RiODMyYTYpLCBRVEMoMHgzNTRkOTA1NyksCisgICAgUVRDKDB4MmM5OGZiYmEpLCBRVEMoMHgyM2E2ODg3ZiksIFFUQygweDFhODJhMDI2KSwgUVRDKDB4MTEzOWYwY2YpLAorICAgIFFUQygweDA3ZDk1YjllKSwgUVRDKDB4ZmU2ZGUyZTApLCBRVEMoMHhmNTA0OTdmYiksIFFUQygweGViYWE4OTRmKSwKKyAgICBRVEMoMHhlMjZjYjAxYiksIFFUQygweGQ5NTdkZTdhKSwgUVRDKDB4ZDA3OGFkOWUpLCBRVEMoMHhjN2RiNmM1MCksCisgICAgUVRDKDB4YmY4YzBkZTMpLCBRVEMoMHhiNzk2MTk5YiksIFFUQygweGIwMDQ5YWIzKSwgUVRDKDB4YThlMjExMDYpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjMyW10gPSB7CisgICAgUVRDKDB4MDRiNjE5NWQpLCBRVEMoMHgwZTFiYzJlNCksIFFUQygweDE3NmRkOWRlKSwgUVRDKDB4MjA5ZjcwMWMpLAorICAgIFFUQygweDI5YTNjNDg1KSwgUVRDKDB4MzI2ZTU0YzcpLCBRVEMoMHgzYWYyZWViNyksIFFUQygweDQzMjVjMTM1KSwKKyAgICBRVEMoMHg0YWZiNmM5OCksIFFUQygweDUyNjkxMjZlKSwgUVRDKDB4NTk2NDY0OTgpLCBRVEMoMHg1ZmUzYjM4ZCksCisgICAgUVRDKDB4NjVkZGZiZDMpLCBRVEMoMHg2YjRhZjI3OSksIFFUQygweDcwMjMxMDlhKSwgUVRDKDB4NzQ1ZjlkZDEpLAorICAgIFFUQygweDc3ZmFiOTg5KSwgUVRDKDB4N2FlZjYzMjMpLCBRVEMoMHg3ZDM5ODBlYyksIFFUQygweDdlZDVlNWM2KSwKKyAgICBRVEMoMHg3ZmMyNTU5NiksIFFUQygweDdmZmQ4ODVhKSwgUVRDKDB4N2Y4NzJiZjMpLCBRVEMoMHg3ZTVmZTQ5MyksCisgICAgUVRDKDB4N2M4OTRiZGUpLCBRVEMoMHg3YTA1ZWVhZCksIFFUQygweDc2ZDk0OTg5KSwgUVRDKDB4NzMwN2MzZDApLAorICAgIFFUQygweDZlOTZhOTlkKSwgUVRDKDB4Njk4YzI0NmMpLCBRVEMoMHg2M2VmMzI5MCksIFFUQygweDVkYzc5ZDdjKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3NfZG93bnNhbXAzMltdID0geworICAgIFFUQygweDdmZDg4NzhlKSwgUVRDKDB4N2U5ZDU1ZmMpLCBRVEMoMHg3YzI5ZmJlZSksIFFUQygweDc4ODQ4NDE0KSwKKyAgICBRVEMoMHg3M2I1ZWJkMSksIFFUQygweDZkY2EwZDE0KSwgUVRDKDB4NjZjZjgxMjApLCBRVEMoMHg1ZWQ3N2M4YSksCisgICAgUVRDKDB4NTVmNWE0ZDIpLCBRVEMoMHg0YzNmZGZmNCksIFFUQygweDQxY2UxZTY1KSwgUVRDKDB4MzZiYTIwMTQpLAorICAgIFFUQygweDJiMWYzNGViKSwgUVRDKDB4MWYxOWY5N2IpLCBRVEMoMHgxMmM4MTA2ZiksIFFUQygweDA2NDdkOTdjKSwKKyAgICBRVEMoMHhmOWI4MjY4NCksIFFUQygweGVkMzdlZjkxKSwgUVRDKDB4ZTBlNjA2ODUpLCBRVEMoMHhkNGUwY2IxNSksCisgICAgUVRDKDB4Yzk0NWRmZWMpLCBRVEMoMHhiZTMxZTE5YiksIFFUQygweGIzYzAyMDBjKSwgUVRDKDB4YWEwYTViMmUpLAorICAgIFFUQygweGExMjg4Mzc2KSwgUVRDKDB4OTkzMDdlZTApLCBRVEMoMHg5MjM1ZjJlYyksIFFUQygweDhjNGExNDJmKSwKKyAgICBRVEMoMHg4NzdiN2JlYyksIFFUQygweDgzZDYwNDEyKSwgUVRDKDB4ODE2MmFhMDQpLCBRVEMoMHg4MDI3Nzg3MiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luX2Rvd25zYW1wMzJbXSA9IHsKKyAgICBRVEMoMHgwNjQ3ZDk3YyksIFFUQygweDEyYzgxMDZmKSwgUVRDKDB4MWYxOWY5N2IpLCBRVEMoMHgyYjFmMzRlYiksCisgICAgUVRDKDB4MzZiYTIwMTQpLCBRVEMoMHg0MWNlMWU2NSksIFFUQygweDRjM2ZkZmY0KSwgUVRDKDB4NTVmNWE0ZDIpLAorICAgIFFUQygweDVlZDc3YzhhKSwgUVRDKDB4NjZjZjgxMjApLCBRVEMoMHg2ZGNhMGQxNCksIFFUQygweDczYjVlYmQxKSwKKyAgICBRVEMoMHg3ODg0ODQxNCksIFFUQygweDdjMjlmYmVlKSwgUVRDKDB4N2U5ZDU1ZmMpLCBRVEMoMHg3ZmQ4ODc4ZSksCisgICAgUVRDKDB4N2ZkODg3OGUpLCBRVEMoMHg3ZTlkNTVmYyksIFFUQygweDdjMjlmYmVlKSwgUVRDKDB4Nzg4NDg0MTQpLAorICAgIFFUQygweDczYjVlYmQxKSwgUVRDKDB4NmRjYTBkMTQpLCBRVEMoMHg2NmNmODEyMCksIFFUQygweDVlZDc3YzhhKSwKKyAgICBRVEMoMHg1NWY1YTRkMiksIFFUQygweDRjM2ZkZmY0KSwgUVRDKDB4NDFjZTFlNjUpLCBRVEMoMHgzNmJhMjAxNCksCisgICAgUVRDKDB4MmIxZjM0ZWIpLCBRVEMoMHgxZjE5Zjk3YiksIFFUQygweDEyYzgxMDZmKSwgUVRDKDB4MDY0N2Q5N2MpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfUEZUIHFtZl9wZmlsdDY0MFtdID0geworICAgIFFGQygweDAwMDAwMDAwKSwgUUZDKDB4MDFiMmU0MWQpLCBRRkMoMHgyZTNhNzUzMiksIFFGQygweGQxYzU4YWNlKSwKKyAgICBRRkMoMHhmZTRkMWJlMyksIFFGQygweGZmZWRlNTBlKSwgUUZDKDB4MDFkNzhiZmMpLCBRRkMoMHgyZmFhMjIxYyksCisgICAgUUZDKDB4ZDMzMzdiM2QpLCBRRkMoMHhmZTcwYjhkMSksIFFGQygweGZmZWQ5NzhhKSwgUUZDKDB4MDFmZDNiYTApLAorICAgIFFGQygweDMxMWFmM2E0KSwgUUZDKDB4ZDQ5ZmQ1NWYpLCBRRkMoMHhmZTkzM2RjMCksIFFGQygweGZmZWZjOWI5KSwKKyAgICBRRkMoMHgwMjI0NGEyNSksIFFGQygweDMyOGNjNmYwKSwgUUZDKDB4ZDYwYTQ2ZTUpLCBRRkMoMHhmZWI0OGQwZCksCisgICAgUUZDKDB4ZmZmMDA2NWQpLCBRRkMoMHgwMjRiZjdhMSksIFFGQygweDMzZmY2NzBlKSwgUUZDKDB4ZDc3MjJmMDQpLAorICAgIFFGQygweGZlZDRiZWMzKSwgUUZDKDB4ZmZlZmY2Y2EpLCBRRkMoMHgwMjc0YmE0MyksIFFGQygweDM1NzJlYzcwKSwKKyAgICBRRkMoMHhkOGQ3ZjIxZiksIFFGQygweGZlZjNmNmFiKSwgUUZDKDB4ZmZlZjdiOGIpLCBRRkMoMHgwMjllMzViNCksCisgICAgUUZDKDB4MzZlNjk2OTEpLCBRRkMoMHhkYTNiMTc2YSksIFFGQygweGZmMTIwZDcwKSwgUUZDKDB4ZmZlZWRmYTQpLAorICAgIFFGQygweDAyYzg5OTAxKSwgUUZDKDB4Mzg1YTQ5YzQpLCBRRkMoMHhkYjliNWIxMiksIFFGQygweGZmMmVmNzI1KSwKKyAgICBRRkMoMHhmZmVlMTY1MCksIFFGQygweDAyZjNlNDhkKSwgUUZDKDB4MzljZTA0NzcpLCBRRkMoMHhkY2Y4OThmYiksCisgICAgUUZDKDB4ZmY0YWFiYzgpLCBRRkMoMHhmZmVkNjUxZCksIFFGQygweDAzMjAxMTE2KSwgUUZDKDB4M2I0MTUxMTUpLAorICAgIFFGQygweGRlNTI5MDg2KSwgUUZDKDB4ZmY2NTQyZDEpLCBRRkMoMHhmZmVjYzMxYiksIFFGQygweDAzNGQwMWYxKSwKKyAgICBRRkMoMHgzY2I0MTIxOSksIFFGQygweGRmYTkzYWI1KSwgUUZDKDB4ZmY3ZWUzZjEpLCBRRkMoMHhmZmViZTc3YiksCisgICAgUUZDKDB4MDM3YWQ0MzgpLCBRRkMoMHgzZTI1YjE3ZSksIFFGQygweGUwZmM0MjFlKSwgUUZDKDB4ZmY5NzVjMDEpLAorICAgIFFGQygweGZmZWI1MGIyKSwgUUZDKDB4MDNhOTY2YmMpLCBRRkMoMHgzZjk2MmZiOCksIFFGQygweGUyNGI4ZjY2KSwKKyAgICBRRkMoMHhmZmFlYTVkNiksIFFGQygweGZmZWE5MTkyKSwgUUZDKDB4MDNkOGFmZTYpLCBRRkMoMHg0MTA1OGJjNiksCisgICAgUUZDKDB4ZTM5NmE0NWQpLCBRRkMoMHhmZmM0ZTM2NSksIFFGQygweGZmZTljYTc2KSwgUUZDKDB4MDQwODNmZWMpLAorICAgIFFGQygweDQyNzJhMzg1KSwgUUZDKDB4ZTRkZTBjYjApLCBRRkMoMHhmZmRhMTdmMiksIFFGQygweGZmZTk0MGY0KSwKKyAgICBRRkMoMHgwNDM4ODljNiksIFFGQygweDQzZGU2MjBhKSwgUUZDKDB4ZTYyMGM0NzYpLCBRRkMoMHhmZmVlMTgzYiksCisgICAgUUZDKDB4ZmZlODhiYTgpLCBRRkMoMHgwNDY5NDEwMSksIFFGQygweDQ1NDdkYWViKSwgUUZDKDB4ZTc1ZjhiYjcpLAorICAgIFFGQygweDAwMDBlNzkwKSwgUUZDKDB4ZmZlODNhMDcpLCBRRkMoMHgwNDlhYTgyZiksIFFGQygweDQ2YWVhODU2KSwKKyAgICBRRkMoMHhlODk5NzFiNyksIFFGQygweDAwMTMxYzc1KSwgUUZDKDB4ZmZlNzllMTYpLCBRRkMoMHgwNGNjMmZjZiksCisgICAgUUZDKDB4NDgxMmY4NDgpLCBRRkMoMHhlOWNlYTg0YSksIFFGQygweDAwMjNiOTg5KSwgUUZDKDB4ZmZlNzc0NmUpLAorICAgIFFGQygweDA0ZmUyMGJlKSwgUUZDKDB4NDk3M2ZlZjIpLCBRRkMoMHhlYWZlZTdmMSksIFFGQygweDAwMzNiOTI3KSwKKyAgICBRRkMoMHhmZmU2ZDQ2NiksIFFGQygweDA1MzAzZjg4KSwgUUZDKDB4NGFkMjM3YTIpLCBRRkMoMHhlYzJhM2Y1ZiksCisgICAgUUZDKDB4MDA0MjZmMzYpLCBRRkMoMHhmZmU2YWZlZCksIFFGQygweDA1NjI2MjA5KSwgUUZDKDB4NGMyY2EzZGYpLAorICAgIFFGQygweGVkNTBhMzFkKSwgUUZDKDB4MDA1MDRmNDEpLCBRRkMoMHhmZmU2NTQxNiksIFFGQygweDA1OTUwMTIyKSwKKyAgICBRRkMoMHg0ZDgzOTc2ZCksIFFGQygweGVlNzFiMmZlKSwgUUZDKDB4MDA1ZDM2ZGYpLCBRRkMoMHhmZmU2ODFjNiksCisgICAgUUZDKDB4MDVjNzZmZWQpLCBRRkMoMHg0ZWQ2MmJlMyksIFFGQygweGVmOGQ0ZDdiKSwgUUZDKDB4MDA2OTI4YTApLAorICAgIFFGQygweGZmZTY2ZGQwKSwgUUZDKDB4MDVmOWMwNTEpLCBRRkMoMHg1MDI0ZDcwZSksIFFGQygweGYwYTM5NTlmKSwKKyAgICBRRkMoMHgwMDc0MDBiOCksIFFGQygweGZmZTY2ZmFiKSwgUUZDKDB4MDYyYmY1ZWMpLCBRRkMoMHg1MTZlZWZiOSksCisgICAgUUZDKDB4ZjFiNDYxYWIpLCBRRkMoMHgwMDdlMDM5MyksIFFGQygweGZmZTY5NDIzKSwgUUZDKDB4MDY1ZGQ1NmEpLAorICAgIFFGQygweDUyYjQ0OWRlKSwgUUZDKDB4ZjJiZjZlYTQpLCBRRkMoMHgwMDg3MmM2MyksIFFGQygweGZmZTZmZWQ0KSwKKyAgICBRRkMoMHgwNjhmOGI0NCksIFFGQygweDUzZjQ5NWFhKSwgUUZDKDB4ZjNjNGU4ODcpLCBRRkMoMHgwMDhmODdhYSksCisgICAgUUZDKDB4ZmZlNzUzNjEpLCBRRkMoMHgwNmMwZjBjMCksIFFGQygweDU1MmY4ZmY3KSwgUUZDKDB4ZjRjNDczYzUpLAorICAgIFFGQygweDAwOTZkY2MyKSwgUUZDKDB4ZmZlODA0MTQpLCBRRkMoMHgwNmYxODI1ZCksIFFGQygweDU2NjU0YmRkKSwKKyAgICBRRkMoMHhmNWJlMGZhOSksIFFGQygweDAwOWRhNTI2KSwgUUZDKDB4ZmZlODViNGEpLCBRRkMoMHgwNzIxYmYyMiksCisgICAgUUZDKDB4NTc5NTA1ZjUpLCBRRkMoMHhmNmIxZjNjMyksIFFGQygweDAwYTM1MDhmKSwgUUZDKDB4ZmZlOTU0ZDApLAorICAgIFFGQygweDA3NTExMmEyKSwgUUZDKDB4NThiZWZhY2QpLCBRRkMoMHhmNzlmYTEzYSksIFFGQygweDAwYTg1ZTk0KSwKKyAgICBRRkMoMHhmZmVhMzUzYSksIFFGQygweDA3N2ZlZGIzKSwgUUZDKDB4NTllMmY2OWUpLCBRRkMoMHhmODg3NTA3YyksCisgICAgUUZDKDB4MDBhY2JkMmYpLCBRRkMoMHhmZmViMzg0OSksIFFGQygweDA3YWQ4YzI2KSwgUUZDKDB4NWIwMDFkYjgpLAorICAgIFFGQygweGY5NjkxNmY1KSwgUUZDKDB4MDBiMDZiNjgpLCBRRkMoMHhmZmVjODQwOSksIFFGQygweDA3ZGEyYjdmKSwKKyAgICBRRkMoMHg1YzE2ZDBhZSksIFFGQygweGZhNDRhMDY5KSwgUUZDKDB4MDBiMzZhY2QpLCBRRkMoMHhmZmVkYzQxOCksCisgICAgUUZDKDB4MDgwNjE2NzEpLCBRRkMoMHg1ZDI2YmU5YiksIFFGQygweGZiMTliN2JkKSwgUUZDKDB4MDBiNThjOGQpLAorICAgIFFGQygweGZmZWYyMzk1KSwgUUZDKDB4MDgzMDM4OTcpLCBRRkMoMHg1ZTJmNjM2NyksIFFGQygweGZiZThmNWJkKSwKKyAgICBRRkMoMHgwMGI3M2FiMCksIFFGQygweGZmZjBlN2VmKSwgUUZDKDB4MDg1OTQ4ODgpLCBRRkMoMHg1ZjMwZmY1ZiksCisgICAgUUZDKDB4ZmNiMWQ3NDApLCBRRkMoMHgwMGI4NWY3MCksIFFGQygweGZmZjI5NGMzKSwgUUZDKDB4MDg4MGZmZGQpLAorICAgIFFGQygweDYwMmIwYzdmKSwgUUZDKDB4ZmQ3NDc1ZDgpLCBRRkMoMHgwMGI4YzZiMCksIFFGQygweGZmZjQ4NzAwKSwKKyAgICBRRkMoMHgwOGE3NWRhNCksIFFGQygweDYxMWQ1OGEzKSwgUUZDKDB4ZmUzMTA2NTcpLCBRRkMoMHgwMGI4ZmUwZCksCisgICAgUUZDKDB4ZmZmNjgxZDYpLCBRRkMoMHgwOGNiNGUyMyksIFFGQygweDYyMDdmMjIwKSwgUUZDKDB4ZmVlNzIzYzYpLAorICAgIFFGQygweDAwYjgzOTRiKSwgUUZDKDB4ZmZmOTFmYzkpLCBRRkMoMHgwOGVkZmVhYSksIFFGQygweDYyZWE2NDc0KSwKKyAgICBRRkMoMHhmZjk2ZGI4ZiksIFFGQygweDAwYjc0YzM3KSwgUUZDKDB4ZmZmYjQyYjApLCBRRkMoMHgwOTBlYzFmZCksCisgICAgUUZDKDB4NjNjNDUyNDMpLCBRRkMoMHgwMDQwYzQ5NyksIFFGQygweDAwYjVjODY3KSwgUUZDKDB4ZmZmZGZhMjQpLAorICAgIFFGQygweDA5MmQ3OTcwKSwgUUZDKDB4NjQ5NjQwNjMpLCBRRkMoMHgwMGU0MmZhMiksIFFGQygweDAwYjNkMTVjKSwKKyAgICBRRkMoMHgwMDAwNzEzNCksIFFGQygweDA5NDllYWFjKSwgUUZDKDB4NjU1ZjYzZjIpLCBRRkMoMHgwMTgxNmUwNiksCisgICAgUUZDKDB4MDBiMTk3OGQpLCBRRkMoMHgwMDAzOTYwOSksIFFGQygweDA5NjNlZDQ2KSwgUUZDKDB4NjYxZmQ2YjgpLAorICAgIFFGQygweDAyMTg2YTkyKSwgUUZDKDB4MDBhZjM3NGMpLCBRRkMoMHgwMDA2YjFjZiksIFFGQygweDA5N2MxZWU5KSwKKyAgICBRRkMoMHg2NmQ3NjcyNSksIFFGQygweDAyYTk5MDk3KSwgUUZDKDB4MDBhYmU3OWUpLCBRRkMoMHgwMDA5YWEzZiksCisgICAgUUZDKDB4MDk5MTQwYTcpLCBRRkMoMHg2Nzg1YzI0ZCksIFFGQygweDAzMzQzNTM0KSwgUUZDKDB4MDBhODczOWQpLAorICAgIFFGQygweDAwMGQzMWI1KSwgUUZDKDB4MDlhM2UxNjMpLCBRRkMoMHg2ODJiMzlhNCksIFFGQygweDAzYjhmOGRjKSwKKyAgICBRRkMoMHgwMGE1MjBiYiksIFFGQygweDAwMTBiYzYzKSwgUUZDKDB4MDliM2Q3ODApLCBRRkMoMHg2OGM3MjY5YyksCisgICAgUUZDKDB4MDQzN2ZiMGEpLCBRRkMoMHgwMGExMDM5YyksIFFGQygweDAwMTQ3MWY4KSwgUUZDKDB4MDljMGU1OWYpLAorICAgIFFGQygweDY5NTk3MDlkKSwgUUZDKDB4MDRiMGFkY2IpLCBRRkMoMHgwMDlkMTBiZiksIFFGQygweDAwMTg3MDNmKSwKKyAgICBRRkMoMHgwOWNhYjlmMiksIFFGQygweDY5ZTI5Nzg0KSwgUUZDKDB4MDUyMzdmOWQpLCBRRkMoMHgwMDk4Yjg1NSksCisgICAgUUZDKDB4MDAxYzM1NDkpLCBRRkMoMHgwOWQxOWNhOSksIFFGQygweDZhNjE5YzVlKSwgUUZDKDB4MDU5MGE2N2QpLAorICAgIFFGQygweDAwOTQyNGM2KSwgUUZDKDB4MDAyMDY0ZjgpLCBRRkMoMHgwOWQ1MjcwOSksIFFGQygweDZhZDczZThlKSwKKyAgICBRRkMoMHgwNWY3ZmI5MCksIFFGQygweDAwOGY0YmZkKSwgUUZDKDB4MDAyNGRkNTApLCBRRkMoMHgwOWQ1NTYwYiksCisgICAgUUZDKDB4NmI0MmE4NjQpLCBRRkMoMHgwNjU5MzkxMiksIFFGQygweDAwOGE3ZGQ3KSwgUUZDKDB4MDAyOTM3MTgpLAorICAgIFFGQygweDA5ZDFmYTIzKSwgUUZDKDB4NmJhNDYyOWYpLCBRRkMoMHgwNmI1NTljMyksIFFGQygweDAwODVjMjE3KSwKKyAgICBRRkMoMHgwMDJkOGU0MiksIFFGQygweDA5Y2FlYjBmKSwgUUZDKDB4NmJmYmRkOTgpLCBRRkMoMHgwNzBiYmY1OCksCisgICAgUUZDKDB4MDA4MDc5OTQpLCBRRkMoMHgwMDMyOWFiNiksIFFGQygweDA5YzAxOGNmKSwgUUZDKDB4NmM0OTIyMTcpLAorICAgIFFGQygweDA3NWNhOTBjKSwgUUZDKDB4MDA3YjM4NzUpLCBRRkMoMHgwMDM3NDVmOSksIFFGQygweDA5YjE4YTFkKSwKKyAgICBRRkMoMHg2YzhjNGM3YSksIFFGQygweDA3YTgxMjdkKSwgUUZDKDB4MDA3NWZkZWQpLCBRRkMoMHgwMDNjMWZhNCksCisgICAgUUZDKDB4MDk5ZWMzZGMpLCBRRkMoMHg2Y2M1OWJhYiksIFFGQygweDA3ZWU1MDdjKSwgUUZDKDB4MDA3MGM4YTUpLAorICAgIFFGQygweDAwNDEwM2Y1KSwgUUZDKDB4MDk4ODFkYzUpLCBRRkMoMHg2Y2Y0MDczZSksIFFGQygweDA4MmY1NTJlKSwKKyAgICBRRkMoMHgwMDZiNDdmYSksIFFGQygweDAwNDY1MzQ4KSwgUUZDKDB4MDk2ZDBlMjIpLCBRRkMoMHg2ZDE4NTIwZSksCisgICAgUUZDKDB4MDg2YjFlZWMpLCBRRkMoMHgwMDY1ZmRlNSksIFFGQygweDAwNGI2YzQ2KSwgUUZDKDB4MDk0ZDdlYzIpLAorICAgIFFGQygweDZkMzI3MzBmKSwgUUZDKDB4MDhhMjQ4OTkpLCBRRkMoMHgwMDYwOTBjNCksIFFGQygweDAwNTBiMTc3KSwKKyAgICBRRkMoMHgwOTI5OWVhZCksIFFGQygweDZkNDFkOTY0KSwgUUZDKDB4MDhkM2U0MWIpLCBRRkMoMHgwMDViNTM3MSksCisgICAgUUZDKDB4MDA1NWRiYTEpLCBRRkMoMHgwOTAxNTY1MSksIFFGQygweDZkNDc0ZTFkKSwgUUZDKDB4MDkwMTU2NTEpLAorICAgIFFGQygweDAwNTVkYmExKSwgUUZDKDB4ZmU0ZDFiZTMpLCBRRkMoMHhkMWM1OGFjZSksIFFGQygweDJlM2E3NTMyKSwKKyAgICBRRkMoMHgwMWIyZTQxZCksIFFGQygweDAwMDAwMDAwKSwKK307CisKKy8qIFRoaXMgdmFyaWFudCBvZiB0aGUgdGFibGUgYWJvdmUgaXMgdXNlZCBvbiBwbGF0Zm9ybXMsIHRoYXQgaGF2ZSB2ZWN0b3JpemVkCisgICBhY2Nlc3MgdG8gdGhlIHRhYmxlIHJlYWRpbmcgNCBmaWx0ZXIgc2V0cyAoZWFjaCBvZiA1IGNvZWZmaWNpZW50cykgaW4gYQorICAgYmxvY2suIEZvcm1hdDogMXN0IHJvdyAgICBmbHRbMF0gb2YgNCBzZXRzIChlLmcuIHNldCAwLCAxLCAyLCAzKSAybmQgcm93CisgICBmbHRbMV0gb2YgNCBzZXRzIChlLmcuIHNldCAwLCAxLCAyLCAzKSAzcmQgcm93ICAgIGZsdFsyXSBvZiA0IHNldHMgKGUuZy4gc2V0CisgICAwLCAxLCAyLCAzKSA0dGggcm93ICAgIGZsdFszXSBvZiA0IHNldHMgKGUuZy4gc2V0IDAsIDEsIDIsIDMpIDV0aCByb3cKKyAgIGZsdFs0XSBvZiA0IHNldHMgKGUuZy4gc2V0IDAsIDEsIDIsIDMpIFRoZXJlIGFyZSAzMiBibG9ja3Mgb2YgMjAKKyAgIGNvZWZmaWNpZW50cywgaW4gdG90YWwgNjQwLiBFYWNoIG9mIHRoZSByb3dzIG11c3QgYmUgYXQgbGVhc3QgNjQtYml0IGFsaWduZWQKKyAgIChzZWU6IFJBTV9BTElHTikuCisqLworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfUEZUIHFtZl9wZmlsdDY0MF92ZWN0b3JbXSA9IHsKKyAgICAvKi0tLS0tLS0tLS0tLS0gMSAuLiA0IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4RkZFREU1MEUpLAorICAgIFFGQygweEZGRUQ5NzhBKSwKKyAgICBRRkMoMHhGRkVGQzlCOSksCisgICAgUUZDKDB4RkZGMDA2NUQpLAorICAgIFFGQygweDAxRDc4QkZDKSwKKyAgICBRRkMoMHgwMUZEM0JBMCksCisgICAgUUZDKDB4MDIyNDRBMjUpLAorICAgIFFGQygweDAyNEJGN0ExKSwKKyAgICBRRkMoMHgyRkFBMjIxQyksCisgICAgUUZDKDB4MzExQUYzQTQpLAorICAgIFFGQygweDMyOENDNkYwKSwKKyAgICBRRkMoMHgzM0ZGNjcwRSksCisgICAgUUZDKDB4RDMzMzdCM0QpLAorICAgIFFGQygweEQ0OUZENTVGKSwKKyAgICBRRkMoMHhENjBBNDZFNSksCisgICAgUUZDKDB4RDc3MjJGMDQpLAorICAgIFFGQygweEZFNzBCOEQxKSwKKyAgICBRRkMoMHhGRTkzM0RDMCksCisgICAgUUZDKDB4RkVCNDhEMEQpLAorICAgIFFGQygweEZFRDRCRUMzKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gNSAuLiA4IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4RkZFRkY2Q0EpLAorICAgIFFGQygweEZGRUY3QjhCKSwKKyAgICBRRkMoMHhGRkVFREZBNCksCisgICAgUUZDKDB4RkZFRTE2NTApLAorICAgIFFGQygweDAyNzRCQTQzKSwKKyAgICBRRkMoMHgwMjlFMzVCNCksCisgICAgUUZDKDB4MDJDODk5MDEpLAorICAgIFFGQygweDAyRjNFNDhEKSwKKyAgICBRRkMoMHgzNTcyRUM3MCksCisgICAgUUZDKDB4MzZFNjk2OTEpLAorICAgIFFGQygweDM4NUE0OUM0KSwKKyAgICBRRkMoMHgzOUNFMDQ3NyksCisgICAgUUZDKDB4RDhEN0YyMUYpLAorICAgIFFGQygweERBM0IxNzZBKSwKKyAgICBRRkMoMHhEQjlCNUIxMiksCisgICAgUUZDKDB4RENGODk4RkIpLAorICAgIFFGQygweEZFRjNGNkFCKSwKKyAgICBRRkMoMHhGRjEyMEQ3MCksCisgICAgUUZDKDB4RkYyRUY3MjUpLAorICAgIFFGQygweEZGNEFBQkM4KSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gOSAuLiAxMiAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweEZGRUQ2NTFEKSwKKyAgICBRRkMoMHhGRkVDQzMxQiksCisgICAgUUZDKDB4RkZFQkU3N0IpLAorICAgIFFGQygweEZGRUI1MEIyKSwKKyAgICBRRkMoMHgwMzIwMTExNiksCisgICAgUUZDKDB4MDM0RDAxRjEpLAorICAgIFFGQygweDAzN0FENDM4KSwKKyAgICBRRkMoMHgwM0E5NjZCQyksCisgICAgUUZDKDB4M0I0MTUxMTUpLAorICAgIFFGQygweDNDQjQxMjE5KSwKKyAgICBRRkMoMHgzRTI1QjE3RSksCisgICAgUUZDKDB4M0Y5NjJGQjgpLAorICAgIFFGQygweERFNTI5MDg2KSwKKyAgICBRRkMoMHhERkE5M0FCNSksCisgICAgUUZDKDB4RTBGQzQyMUUpLAorICAgIFFGQygweEUyNEI4RjY2KSwKKyAgICBRRkMoMHhGRjY1NDJEMSksCisgICAgUUZDKDB4RkY3RUUzRjEpLAorICAgIFFGQygweEZGOTc1QzAxKSwKKyAgICBRRkMoMHhGRkFFQTVENiksCisgICAgLyotLS0tLS0tLS0tLS0tIDEzIC4uIDE2IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4RkZFQTkxOTIpLAorICAgIFFGQygweEZGRTlDQTc2KSwKKyAgICBRRkMoMHhGRkU5NDBGNCksCisgICAgUUZDKDB4RkZFODhCQTgpLAorICAgIFFGQygweDAzRDhBRkU2KSwKKyAgICBRRkMoMHgwNDA4M0ZFQyksCisgICAgUUZDKDB4MDQzODg5QzYpLAorICAgIFFGQygweDA0Njk0MTAxKSwKKyAgICBRRkMoMHg0MTA1OEJDNiksCisgICAgUUZDKDB4NDI3MkEzODUpLAorICAgIFFGQygweDQzREU2MjBBKSwKKyAgICBRRkMoMHg0NTQ3REFFQiksCisgICAgUUZDKDB4RTM5NkE0NUQpLAorICAgIFFGQygweEU0REUwQ0IwKSwKKyAgICBRRkMoMHhFNjIwQzQ3NiksCisgICAgUUZDKDB4RTc1RjhCQjcpLAorICAgIFFGQygweEZGQzRFMzY1KSwKKyAgICBRRkMoMHhGRkRBMTdGMiksCisgICAgUUZDKDB4RkZFRTE4M0IpLAorICAgIFFGQygweDAwMDBFNzkwKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gMTcgLi4gMjAgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRkU4M0EwNyksCisgICAgUUZDKDB4RkZFNzlFMTYpLAorICAgIFFGQygweEZGRTc3NDZFKSwKKyAgICBRRkMoMHhGRkU2RDQ2NiksCisgICAgUUZDKDB4MDQ5QUE4MkYpLAorICAgIFFGQygweDA0Q0MyRkNGKSwKKyAgICBRRkMoMHgwNEZFMjBCRSksCisgICAgUUZDKDB4MDUzMDNGODgpLAorICAgIFFGQygweDQ2QUVBODU2KSwKKyAgICBRRkMoMHg0ODEyRjg0OCksCisgICAgUUZDKDB4NDk3M0ZFRjIpLAorICAgIFFGQygweDRBRDIzN0EyKSwKKyAgICBRRkMoMHhFODk5NzFCNyksCisgICAgUUZDKDB4RTlDRUE4NEEpLAorICAgIFFGQygweEVBRkVFN0YxKSwKKyAgICBRRkMoMHhFQzJBM0Y1RiksCisgICAgUUZDKDB4MDAxMzFDNzUpLAorICAgIFFGQygweDAwMjNCOTg5KSwKKyAgICBRRkMoMHgwMDMzQjkyNyksCisgICAgUUZDKDB4MDA0MjZGMzYpLAorICAgIC8qLS0tLS0tLS0tLS0tLSAyMSAuLiAyNCAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweEZGRTZBRkVEKSwKKyAgICBRRkMoMHhGRkU2NTQxNiksCisgICAgUUZDKDB4RkZFNjgxQzYpLAorICAgIFFGQygweEZGRTY2REQwKSwKKyAgICBRRkMoMHgwNTYyNjIwOSksCisgICAgUUZDKDB4MDU5NTAxMjIpLAorICAgIFFGQygweDA1Qzc2RkVEKSwKKyAgICBRRkMoMHgwNUY5QzA1MSksCisgICAgUUZDKDB4NEMyQ0EzREYpLAorICAgIFFGQygweDREODM5NzZEKSwKKyAgICBRRkMoMHg0RUQ2MkJFMyksCisgICAgUUZDKDB4NTAyNEQ3MEUpLAorICAgIFFGQygweEVENTBBMzFEKSwKKyAgICBRRkMoMHhFRTcxQjJGRSksCisgICAgUUZDKDB4RUY4RDREN0IpLAorICAgIFFGQygweEYwQTM5NTlGKSwKKyAgICBRRkMoMHgwMDUwNEY0MSksCisgICAgUUZDKDB4MDA1RDM2REYpLAorICAgIFFGQygweDAwNjkyOEEwKSwKKyAgICBRRkMoMHgwMDc0MDBCOCksCisgICAgLyotLS0tLS0tLS0tLS0tIDI1IC4uIDI4IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4RkZFNjZGQUIpLAorICAgIFFGQygweEZGRTY5NDIzKSwKKyAgICBRRkMoMHhGRkU2RkVENCksCisgICAgUUZDKDB4RkZFNzUzNjEpLAorICAgIFFGQygweDA2MkJGNUVDKSwKKyAgICBRRkMoMHgwNjVERDU2QSksCisgICAgUUZDKDB4MDY4RjhCNDQpLAorICAgIFFGQygweDA2QzBGMEMwKSwKKyAgICBRRkMoMHg1MTZFRUZCOSksCisgICAgUUZDKDB4NTJCNDQ5REUpLAorICAgIFFGQygweDUzRjQ5NUFBKSwKKyAgICBRRkMoMHg1NTJGOEZGNyksCisgICAgUUZDKDB4RjFCNDYxQUIpLAorICAgIFFGQygweEYyQkY2RUE0KSwKKyAgICBRRkMoMHhGM0M0RTg4NyksCisgICAgUUZDKDB4RjRDNDczQzUpLAorICAgIFFGQygweDAwN0UwMzkzKSwKKyAgICBRRkMoMHgwMDg3MkM2MyksCisgICAgUUZDKDB4MDA4Rjg3QUEpLAorICAgIFFGQygweDAwOTZEQ0MyKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gMjkgLi4gMzIgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRkU4MDQxNCksCisgICAgUUZDKDB4RkZFODVCNEEpLAorICAgIFFGQygweEZGRTk1NEQwKSwKKyAgICBRRkMoMHhGRkVBMzUzQSksCisgICAgUUZDKDB4MDZGMTgyNUQpLAorICAgIFFGQygweDA3MjFCRjIyKSwKKyAgICBRRkMoMHgwNzUxMTJBMiksCisgICAgUUZDKDB4MDc3RkVEQjMpLAorICAgIFFGQygweDU2NjU0QkREKSwKKyAgICBRRkMoMHg1Nzk1MDVGNSksCisgICAgUUZDKDB4NThCRUZBQ0QpLAorICAgIFFGQygweDU5RTJGNjlFKSwKKyAgICBRRkMoMHhGNUJFMEZBOSksCisgICAgUUZDKDB4RjZCMUYzQzMpLAorICAgIFFGQygweEY3OUZBMTNBKSwKKyAgICBRRkMoMHhGODg3NTA3QyksCisgICAgUUZDKDB4MDA5REE1MjYpLAorICAgIFFGQygweDAwQTM1MDhGKSwKKyAgICBRRkMoMHgwMEE4NUU5NCksCisgICAgUUZDKDB4MDBBQ0JEMkYpLAorICAgIC8qLS0tLS0tLS0tLS0tLSAzMyAuLiAzNiAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweEZGRUIzODQ5KSwKKyAgICBRRkMoMHhGRkVDODQwOSksCisgICAgUUZDKDB4RkZFREM0MTgpLAorICAgIFFGQygweEZGRUYyMzk1KSwKKyAgICBRRkMoMHgwN0FEOEMyNiksCisgICAgUUZDKDB4MDdEQTJCN0YpLAorICAgIFFGQygweDA4MDYxNjcxKSwKKyAgICBRRkMoMHgwODMwMzg5NyksCisgICAgUUZDKDB4NUIwMDFEQjgpLAorICAgIFFGQygweDVDMTZEMEFFKSwKKyAgICBRRkMoMHg1RDI2QkU5QiksCisgICAgUUZDKDB4NUUyRjYzNjcpLAorICAgIFFGQygweEY5NjkxNkY1KSwKKyAgICBRRkMoMHhGQTQ0QTA2OSksCisgICAgUUZDKDB4RkIxOUI3QkQpLAorICAgIFFGQygweEZCRThGNUJEKSwKKyAgICBRRkMoMHgwMEIwNkI2OCksCisgICAgUUZDKDB4MDBCMzZBQ0QpLAorICAgIFFGQygweDAwQjU4QzhEKSwKKyAgICBRRkMoMHgwMEI3M0FCMCksCisgICAgLyotLS0tLS0tLS0tLS0tIDM3IC4uIDQwIC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4RkZGMEU3RUYpLAorICAgIFFGQygweEZGRjI5NEMzKSwKKyAgICBRRkMoMHhGRkY0ODcwMCksCisgICAgUUZDKDB4RkZGNjgxRDYpLAorICAgIFFGQygweDA4NTk0ODg4KSwKKyAgICBRRkMoMHgwODgwRkZERCksCisgICAgUUZDKDB4MDhBNzVEQTQpLAorICAgIFFGQygweDA4Q0I0RTIzKSwKKyAgICBRRkMoMHg1RjMwRkY1RiksCisgICAgUUZDKDB4NjAyQjBDN0YpLAorICAgIFFGQygweDYxMUQ1OEEzKSwKKyAgICBRRkMoMHg2MjA3RjIyMCksCisgICAgUUZDKDB4RkNCMUQ3NDApLAorICAgIFFGQygweEZENzQ3NUQ4KSwKKyAgICBRRkMoMHhGRTMxMDY1NyksCisgICAgUUZDKDB4RkVFNzIzQzYpLAorICAgIFFGQygweDAwQjg1RjcwKSwKKyAgICBRRkMoMHgwMEI4QzZCMCksCisgICAgUUZDKDB4MDBCOEZFMEQpLAorICAgIFFGQygweDAwQjgzOTRCKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gNDEgLi4gNDQgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRkY5MUZDOSksCisgICAgUUZDKDB4RkZGQjQyQjApLAorICAgIFFGQygweEZGRkRGQTI0KSwKKyAgICBRRkMoMHgwMDAwNzEzNCksCisgICAgUUZDKDB4MDhFREZFQUEpLAorICAgIFFGQygweDA5MEVDMUZEKSwKKyAgICBRRkMoMHgwOTJENzk3MCksCisgICAgUUZDKDB4MDk0OUVBQUMpLAorICAgIFFGQygweDYyRUE2NDc0KSwKKyAgICBRRkMoMHg2M0M0NTI0MyksCisgICAgUUZDKDB4NjQ5NjQwNjMpLAorICAgIFFGQygweDY1NUY2M0YyKSwKKyAgICBRRkMoMHhGRjk2REI4RiksCisgICAgUUZDKDB4MDA0MEM0OTcpLAorICAgIFFGQygweDAwRTQyRkEyKSwKKyAgICBRRkMoMHgwMTgxNkUwNiksCisgICAgUUZDKDB4MDBCNzRDMzcpLAorICAgIFFGQygweDAwQjVDODY3KSwKKyAgICBRRkMoMHgwMEIzRDE1QyksCisgICAgUUZDKDB4MDBCMTk3OEQpLAorICAgIC8qLS0tLS0tLS0tLS0tLSA0NSAuLiA0OCAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweDAwMDM5NjA5KSwKKyAgICBRRkMoMHgwMDA2QjFDRiksCisgICAgUUZDKDB4MDAwOUFBM0YpLAorICAgIFFGQygweDAwMEQzMUI1KSwKKyAgICBRRkMoMHgwOTYzRUQ0NiksCisgICAgUUZDKDB4MDk3QzFFRTkpLAorICAgIFFGQygweDA5OTE0MEE3KSwKKyAgICBRRkMoMHgwOUEzRTE2MyksCisgICAgUUZDKDB4NjYxRkQ2QjgpLAorICAgIFFGQygweDY2RDc2NzI1KSwKKyAgICBRRkMoMHg2Nzg1QzI0RCksCisgICAgUUZDKDB4NjgyQjM5QTQpLAorICAgIFFGQygweDAyMTg2QTkyKSwKKyAgICBRRkMoMHgwMkE5OTA5NyksCisgICAgUUZDKDB4MDMzNDM1MzQpLAorICAgIFFGQygweDAzQjhGOERDKSwKKyAgICBRRkMoMHgwMEFGMzc0QyksCisgICAgUUZDKDB4MDBBQkU3OUUpLAorICAgIFFGQygweDAwQTg3MzlEKSwKKyAgICBRRkMoMHgwMEE1MjBCQiksCisgICAgLyotLS0tLS0tLS0tLS0tIDQ5IC4uIDUyIC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDAxMEJDNjMpLAorICAgIFFGQygweDAwMTQ3MUY4KSwKKyAgICBRRkMoMHgwMDE4NzAzRiksCisgICAgUUZDKDB4MDAxQzM1NDkpLAorICAgIFFGQygweDA5QjNENzgwKSwKKyAgICBRRkMoMHgwOUMwRTU5RiksCisgICAgUUZDKDB4MDlDQUI5RjIpLAorICAgIFFGQygweDA5RDE5Q0E5KSwKKyAgICBRRkMoMHg2OEM3MjY5QyksCisgICAgUUZDKDB4Njk1OTcwOUQpLAorICAgIFFGQygweDY5RTI5Nzg0KSwKKyAgICBRRkMoMHg2QTYxOUM1RSksCisgICAgUUZDKDB4MDQzN0ZCMEEpLAorICAgIFFGQygweDA0QjBBRENCKSwKKyAgICBRRkMoMHgwNTIzN0Y5RCksCisgICAgUUZDKDB4MDU5MEE2N0QpLAorICAgIFFGQygweDAwQTEwMzlDKSwKKyAgICBRRkMoMHgwMDlEMTBCRiksCisgICAgUUZDKDB4MDA5OEI4NTUpLAorICAgIFFGQygweDAwOTQyNEM2KSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gNTMgLi4gNTYgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHgwMDIwNjRGOCksCisgICAgUUZDKDB4MDAyNERENTApLAorICAgIFFGQygweDAwMjkzNzE4KSwKKyAgICBRRkMoMHgwMDJEOEU0MiksCisgICAgUUZDKDB4MDlENTI3MDkpLAorICAgIFFGQygweDA5RDU1NjBCKSwKKyAgICBRRkMoMHgwOUQxRkEyMyksCisgICAgUUZDKDB4MDlDQUVCMEYpLAorICAgIFFGQygweDZBRDczRThFKSwKKyAgICBRRkMoMHg2QjQyQTg2NCksCisgICAgUUZDKDB4NkJBNDYyOUYpLAorICAgIFFGQygweDZCRkJERDk4KSwKKyAgICBRRkMoMHgwNUY3RkI5MCksCisgICAgUUZDKDB4MDY1OTM5MTIpLAorICAgIFFGQygweDA2QjU1OUMzKSwKKyAgICBRRkMoMHgwNzBCQkY1OCksCisgICAgUUZDKDB4MDA4RjRCRkQpLAorICAgIFFGQygweDAwOEE3REQ3KSwKKyAgICBRRkMoMHgwMDg1QzIxNyksCisgICAgUUZDKDB4MDA4MDc5OTQpLAorICAgIC8qLS0tLS0tLS0tLS0tLSA1NyAuLiA2MCAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweDAwMzI5QUI2KSwKKyAgICBRRkMoMHgwMDM3NDVGOSksCisgICAgUUZDKDB4MDAzQzFGQTQpLAorICAgIFFGQygweDAwNDEwM0Y1KSwKKyAgICBRRkMoMHgwOUMwMThDRiksCisgICAgUUZDKDB4MDlCMThBMUQpLAorICAgIFFGQygweDA5OUVDM0RDKSwKKyAgICBRRkMoMHgwOTg4MURDNSksCisgICAgUUZDKDB4NkM0OTIyMTcpLAorICAgIFFGQygweDZDOEM0QzdBKSwKKyAgICBRRkMoMHg2Q0M1OUJBQiksCisgICAgUUZDKDB4NkNGNDA3M0UpLAorICAgIFFGQygweDA3NUNBOTBDKSwKKyAgICBRRkMoMHgwN0E4MTI3RCksCisgICAgUUZDKDB4MDdFRTUwN0MpLAorICAgIFFGQygweDA4MkY1NTJFKSwKKyAgICBRRkMoMHgwMDdCMzg3NSksCisgICAgUUZDKDB4MDA3NUZERUQpLAorICAgIFFGQygweDAwNzBDOEE1KSwKKyAgICBRRkMoMHgwMDZCNDdGQSksCisgICAgLyotLS0tLS0tLS0tLS0tIDYxIC4uIDY0IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDA0NjUzNDgpLAorICAgIFFGQygweDAwNEI2QzQ2KSwKKyAgICBRRkMoMHgwMDUwQjE3NyksCisgICAgUUZDKDB4MDA1NURCQTEpLAorICAgIFFGQygweDA5NkQwRTIyKSwKKyAgICBRRkMoMHgwOTREN0VDMiksCisgICAgUUZDKDB4MDkyOTlFQUQpLAorICAgIFFGQygweDA5MDE1NjUxKSwKKyAgICBRRkMoMHg2RDE4NTIwRSksCisgICAgUUZDKDB4NkQzMjczMEYpLAorICAgIFFGQygweDZENDFEOTY0KSwKKyAgICBRRkMoMHg2RDQ3NEUxRCksCisgICAgUUZDKDB4MDg2QjFFRUMpLAorICAgIFFGQygweDA4QTI0ODk5KSwKKyAgICBRRkMoMHgwOEQzRTQxQiksCisgICAgUUZDKDB4MDkwMTU2NTEpLAorICAgIFFGQygweDAwNjVGREU1KSwKKyAgICBRRkMoMHgwMDYwOTBDNCksCisgICAgUUZDKDB4MDA1QjUzNzEpLAorICAgIFFGQygweDAwNTVEQkExKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gNjMgLi4gNjAgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHgwMDVCNTM3MSksCisgICAgUUZDKDB4MDA2MDkwQzQpLAorICAgIFFGQygweDAwNjVGREU1KSwKKyAgICBRRkMoMHgwMDZCNDdGQSksCisgICAgUUZDKDB4MDhEM0U0MUIpLAorICAgIFFGQygweDA4QTI0ODk5KSwKKyAgICBRRkMoMHgwODZCMUVFQyksCisgICAgUUZDKDB4MDgyRjU1MkUpLAorICAgIFFGQygweDZENDFEOTY0KSwKKyAgICBRRkMoMHg2RDMyNzMwRiksCisgICAgUUZDKDB4NkQxODUyMEUpLAorICAgIFFGQygweDZDRjQwNzNFKSwKKyAgICBRRkMoMHgwOTI5OUVBRCksCisgICAgUUZDKDB4MDk0RDdFQzIpLAorICAgIFFGQygweDA5NkQwRTIyKSwKKyAgICBRRkMoMHgwOTg4MURDNSksCisgICAgUUZDKDB4MDA1MEIxNzcpLAorICAgIFFGQygweDAwNEI2QzQ2KSwKKyAgICBRRkMoMHgwMDQ2NTM0OCksCisgICAgUUZDKDB4MDA0MTAzRjUpLAorICAgIC8qLS0tLS0tLS0tLS0tLSA1OSAuLiA1NiAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweDAwNzBDOEE1KSwKKyAgICBRRkMoMHgwMDc1RkRFRCksCisgICAgUUZDKDB4MDA3QjM4NzUpLAorICAgIFFGQygweDAwODA3OTk0KSwKKyAgICBRRkMoMHgwN0VFNTA3QyksCisgICAgUUZDKDB4MDdBODEyN0QpLAorICAgIFFGQygweDA3NUNBOTBDKSwKKyAgICBRRkMoMHgwNzBCQkY1OCksCisgICAgUUZDKDB4NkNDNTlCQUIpLAorICAgIFFGQygweDZDOEM0QzdBKSwKKyAgICBRRkMoMHg2QzQ5MjIxNyksCisgICAgUUZDKDB4NkJGQkREOTgpLAorICAgIFFGQygweDA5OUVDM0RDKSwKKyAgICBRRkMoMHgwOUIxOEExRCksCisgICAgUUZDKDB4MDlDMDE4Q0YpLAorICAgIFFGQygweDA5Q0FFQjBGKSwKKyAgICBRRkMoMHgwMDNDMUZBNCksCisgICAgUUZDKDB4MDAzNzQ1RjkpLAorICAgIFFGQygweDAwMzI5QUI2KSwKKyAgICBRRkMoMHgwMDJEOEU0MiksCisgICAgLyotLS0tLS0tLS0tLS0tIDU1IC4uIDUyIC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDA4NUMyMTcpLAorICAgIFFGQygweDAwOEE3REQ3KSwKKyAgICBRRkMoMHgwMDhGNEJGRCksCisgICAgUUZDKDB4MDA5NDI0QzYpLAorICAgIFFGQygweDA2QjU1OUMzKSwKKyAgICBRRkMoMHgwNjU5MzkxMiksCisgICAgUUZDKDB4MDVGN0ZCOTApLAorICAgIFFGQygweDA1OTBBNjdEKSwKKyAgICBRRkMoMHg2QkE0NjI5RiksCisgICAgUUZDKDB4NkI0MkE4NjQpLAorICAgIFFGQygweDZBRDczRThFKSwKKyAgICBRRkMoMHg2QTYxOUM1RSksCisgICAgUUZDKDB4MDlEMUZBMjMpLAorICAgIFFGQygweDA5RDU1NjBCKSwKKyAgICBRRkMoMHgwOUQ1MjcwOSksCisgICAgUUZDKDB4MDlEMTlDQTkpLAorICAgIFFGQygweDAwMjkzNzE4KSwKKyAgICBRRkMoMHgwMDI0REQ1MCksCisgICAgUUZDKDB4MDAyMDY0RjgpLAorICAgIFFGQygweDAwMUMzNTQ5KSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gNTEgLi4gNDggLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHgwMDk4Qjg1NSksCisgICAgUUZDKDB4MDA5RDEwQkYpLAorICAgIFFGQygweDAwQTEwMzlDKSwKKyAgICBRRkMoMHgwMEE1MjBCQiksCisgICAgUUZDKDB4MDUyMzdGOUQpLAorICAgIFFGQygweDA0QjBBRENCKSwKKyAgICBRRkMoMHgwNDM3RkIwQSksCisgICAgUUZDKDB4MDNCOEY4REMpLAorICAgIFFGQygweDY5RTI5Nzg0KSwKKyAgICBRRkMoMHg2OTU5NzA5RCksCisgICAgUUZDKDB4NjhDNzI2OUMpLAorICAgIFFGQygweDY4MkIzOUE0KSwKKyAgICBRRkMoMHgwOUNBQjlGMiksCisgICAgUUZDKDB4MDlDMEU1OUYpLAorICAgIFFGQygweDA5QjNENzgwKSwKKyAgICBRRkMoMHgwOUEzRTE2MyksCisgICAgUUZDKDB4MDAxODcwM0YpLAorICAgIFFGQygweDAwMTQ3MUY4KSwKKyAgICBRRkMoMHgwMDEwQkM2MyksCisgICAgUUZDKDB4MDAwRDMxQjUpLAorICAgIC8qLS0tLS0tLS0tLS0tLSA0NyAuLiA0NCAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweDAwQTg3MzlEKSwKKyAgICBRRkMoMHgwMEFCRTc5RSksCisgICAgUUZDKDB4MDBBRjM3NEMpLAorICAgIFFGQygweDAwQjE5NzhEKSwKKyAgICBRRkMoMHgwMzM0MzUzNCksCisgICAgUUZDKDB4MDJBOTkwOTcpLAorICAgIFFGQygweDAyMTg2QTkyKSwKKyAgICBRRkMoMHgwMTgxNkUwNiksCisgICAgUUZDKDB4Njc4NUMyNEQpLAorICAgIFFGQygweDY2RDc2NzI1KSwKKyAgICBRRkMoMHg2NjFGRDZCOCksCisgICAgUUZDKDB4NjU1RjYzRjIpLAorICAgIFFGQygweDA5OTE0MEE3KSwKKyAgICBRRkMoMHgwOTdDMUVFOSksCisgICAgUUZDKDB4MDk2M0VENDYpLAorICAgIFFGQygweDA5NDlFQUFDKSwKKyAgICBRRkMoMHgwMDA5QUEzRiksCisgICAgUUZDKDB4MDAwNkIxQ0YpLAorICAgIFFGQygweDAwMDM5NjA5KSwKKyAgICBRRkMoMHgwMDAwNzEzNCksCisgICAgLyotLS0tLS0tLS0tLS0tIDQzIC4uIDQwIC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDBCM0QxNUMpLAorICAgIFFGQygweDAwQjVDODY3KSwKKyAgICBRRkMoMHgwMEI3NEMzNyksCisgICAgUUZDKDB4MDBCODM5NEIpLAorICAgIFFGQygweDAwRTQyRkEyKSwKKyAgICBRRkMoMHgwMDQwQzQ5NyksCisgICAgUUZDKDB4RkY5NkRCOEYpLAorICAgIFFGQygweEZFRTcyM0M2KSwKKyAgICBRRkMoMHg2NDk2NDA2MyksCisgICAgUUZDKDB4NjNDNDUyNDMpLAorICAgIFFGQygweDYyRUE2NDc0KSwKKyAgICBRRkMoMHg2MjA3RjIyMCksCisgICAgUUZDKDB4MDkyRDc5NzApLAorICAgIFFGQygweDA5MEVDMUZEKSwKKyAgICBRRkMoMHgwOEVERkVBQSksCisgICAgUUZDKDB4MDhDQjRFMjMpLAorICAgIFFGQygweEZGRkRGQTI0KSwKKyAgICBRRkMoMHhGRkZCNDJCMCksCisgICAgUUZDKDB4RkZGOTFGQzkpLAorICAgIFFGQygweEZGRjY4MUQ2KSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gMzkgLi4gMzYgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHgwMEI4RkUwRCksCisgICAgUUZDKDB4MDBCOEM2QjApLAorICAgIFFGQygweDAwQjg1RjcwKSwKKyAgICBRRkMoMHgwMEI3M0FCMCksCisgICAgUUZDKDB4RkUzMTA2NTcpLAorICAgIFFGQygweEZENzQ3NUQ4KSwKKyAgICBRRkMoMHhGQ0IxRDc0MCksCisgICAgUUZDKDB4RkJFOEY1QkQpLAorICAgIFFGQygweDYxMUQ1OEEzKSwKKyAgICBRRkMoMHg2MDJCMEM3RiksCisgICAgUUZDKDB4NUYzMEZGNUYpLAorICAgIFFGQygweDVFMkY2MzY3KSwKKyAgICBRRkMoMHgwOEE3NURBNCksCisgICAgUUZDKDB4MDg4MEZGREQpLAorICAgIFFGQygweDA4NTk0ODg4KSwKKyAgICBRRkMoMHgwODMwMzg5NyksCisgICAgUUZDKDB4RkZGNDg3MDApLAorICAgIFFGQygweEZGRjI5NEMzKSwKKyAgICBRRkMoMHhGRkYwRTdFRiksCisgICAgUUZDKDB4RkZFRjIzOTUpLAorICAgIC8qLS0tLS0tLS0tLS0tLSAzNSAuLiAzMiAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweDAwQjU4QzhEKSwKKyAgICBRRkMoMHgwMEIzNkFDRCksCisgICAgUUZDKDB4MDBCMDZCNjgpLAorICAgIFFGQygweDAwQUNCRDJGKSwKKyAgICBRRkMoMHhGQjE5QjdCRCksCisgICAgUUZDKDB4RkE0NEEwNjkpLAorICAgIFFGQygweEY5NjkxNkY1KSwKKyAgICBRRkMoMHhGODg3NTA3QyksCisgICAgUUZDKDB4NUQyNkJFOUIpLAorICAgIFFGQygweDVDMTZEMEFFKSwKKyAgICBRRkMoMHg1QjAwMURCOCksCisgICAgUUZDKDB4NTlFMkY2OUUpLAorICAgIFFGQygweDA4MDYxNjcxKSwKKyAgICBRRkMoMHgwN0RBMkI3RiksCisgICAgUUZDKDB4MDdBRDhDMjYpLAorICAgIFFGQygweDA3N0ZFREIzKSwKKyAgICBRRkMoMHhGRkVEQzQxOCksCisgICAgUUZDKDB4RkZFQzg0MDkpLAorICAgIFFGQygweEZGRUIzODQ5KSwKKyAgICBRRkMoMHhGRkVBMzUzQSksCisgICAgLyotLS0tLS0tLS0tLS0tIDMxIC4uIDI4IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDBBODVFOTQpLAorICAgIFFGQygweDAwQTM1MDhGKSwKKyAgICBRRkMoMHgwMDlEQTUyNiksCisgICAgUUZDKDB4MDA5NkRDQzIpLAorICAgIFFGQygweEY3OUZBMTNBKSwKKyAgICBRRkMoMHhGNkIxRjNDMyksCisgICAgUUZDKDB4RjVCRTBGQTkpLAorICAgIFFGQygweEY0QzQ3M0M1KSwKKyAgICBRRkMoMHg1OEJFRkFDRCksCisgICAgUUZDKDB4NTc5NTA1RjUpLAorICAgIFFGQygweDU2NjU0QkREKSwKKyAgICBRRkMoMHg1NTJGOEZGNyksCisgICAgUUZDKDB4MDc1MTEyQTIpLAorICAgIFFGQygweDA3MjFCRjIyKSwKKyAgICBRRkMoMHgwNkYxODI1RCksCisgICAgUUZDKDB4MDZDMEYwQzApLAorICAgIFFGQygweEZGRTk1NEQwKSwKKyAgICBRRkMoMHhGRkU4NUI0QSksCisgICAgUUZDKDB4RkZFODA0MTQpLAorICAgIFFGQygweEZGRTc1MzYxKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gMjcgLi4gMjQgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHgwMDhGODdBQSksCisgICAgUUZDKDB4MDA4NzJDNjMpLAorICAgIFFGQygweDAwN0UwMzkzKSwKKyAgICBRRkMoMHgwMDc0MDBCOCksCisgICAgUUZDKDB4RjNDNEU4ODcpLAorICAgIFFGQygweEYyQkY2RUE0KSwKKyAgICBRRkMoMHhGMUI0NjFBQiksCisgICAgUUZDKDB4RjBBMzk1OUYpLAorICAgIFFGQygweDUzRjQ5NUFBKSwKKyAgICBRRkMoMHg1MkI0NDlERSksCisgICAgUUZDKDB4NTE2RUVGQjkpLAorICAgIFFGQygweDUwMjRENzBFKSwKKyAgICBRRkMoMHgwNjhGOEI0NCksCisgICAgUUZDKDB4MDY1REQ1NkEpLAorICAgIFFGQygweDA2MkJGNUVDKSwKKyAgICBRRkMoMHgwNUY5QzA1MSksCisgICAgUUZDKDB4RkZFNkZFRDQpLAorICAgIFFGQygweEZGRTY5NDIzKSwKKyAgICBRRkMoMHhGRkU2NkZBQiksCisgICAgUUZDKDB4RkZFNjZERDApLAorICAgIC8qLS0tLS0tLS0tLS0tLSAyMyAuLiAyMCAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweDAwNjkyOEEwKSwKKyAgICBRRkMoMHgwMDVEMzZERiksCisgICAgUUZDKDB4MDA1MDRGNDEpLAorICAgIFFGQygweDAwNDI2RjM2KSwKKyAgICBRRkMoMHhFRjhENEQ3QiksCisgICAgUUZDKDB4RUU3MUIyRkUpLAorICAgIFFGQygweEVENTBBMzFEKSwKKyAgICBRRkMoMHhFQzJBM0Y1RiksCisgICAgUUZDKDB4NEVENjJCRTMpLAorICAgIFFGQygweDREODM5NzZEKSwKKyAgICBRRkMoMHg0QzJDQTNERiksCisgICAgUUZDKDB4NEFEMjM3QTIpLAorICAgIFFGQygweDA1Qzc2RkVEKSwKKyAgICBRRkMoMHgwNTk1MDEyMiksCisgICAgUUZDKDB4MDU2MjYyMDkpLAorICAgIFFGQygweDA1MzAzRjg4KSwKKyAgICBRRkMoMHhGRkU2ODFDNiksCisgICAgUUZDKDB4RkZFNjU0MTYpLAorICAgIFFGQygweEZGRTZBRkVEKSwKKyAgICBRRkMoMHhGRkU2RDQ2NiksCisgICAgLyotLS0tLS0tLS0tLS0tIDE5IC4uIDE2IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDAzM0I5MjcpLAorICAgIFFGQygweDAwMjNCOTg5KSwKKyAgICBRRkMoMHgwMDEzMUM3NSksCisgICAgUUZDKDB4MDAwMEU3OTApLAorICAgIFFGQygweEVBRkVFN0YxKSwKKyAgICBRRkMoMHhFOUNFQTg0QSksCisgICAgUUZDKDB4RTg5OTcxQjcpLAorICAgIFFGQygweEU3NUY4QkI3KSwKKyAgICBRRkMoMHg0OTczRkVGMiksCisgICAgUUZDKDB4NDgxMkY4NDgpLAorICAgIFFGQygweDQ2QUVBODU2KSwKKyAgICBRRkMoMHg0NTQ3REFFQiksCisgICAgUUZDKDB4MDRGRTIwQkUpLAorICAgIFFGQygweDA0Q0MyRkNGKSwKKyAgICBRRkMoMHgwNDlBQTgyRiksCisgICAgUUZDKDB4MDQ2OTQxMDEpLAorICAgIFFGQygweEZGRTc3NDZFKSwKKyAgICBRRkMoMHhGRkU3OUUxNiksCisgICAgUUZDKDB4RkZFODNBMDcpLAorICAgIFFGQygweEZGRTg4QkE4KSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gMTUgLi4gMTIgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRkVFMTgzQiksCisgICAgUUZDKDB4RkZEQTE3RjIpLAorICAgIFFGQygweEZGQzRFMzY1KSwKKyAgICBRRkMoMHhGRkFFQTVENiksCisgICAgUUZDKDB4RTYyMEM0NzYpLAorICAgIFFGQygweEU0REUwQ0IwKSwKKyAgICBRRkMoMHhFMzk2QTQ1RCksCisgICAgUUZDKDB4RTI0QjhGNjYpLAorICAgIFFGQygweDQzREU2MjBBKSwKKyAgICBRRkMoMHg0MjcyQTM4NSksCisgICAgUUZDKDB4NDEwNThCQzYpLAorICAgIFFGQygweDNGOTYyRkI4KSwKKyAgICBRRkMoMHgwNDM4ODlDNiksCisgICAgUUZDKDB4MDQwODNGRUMpLAorICAgIFFGQygweDAzRDhBRkU2KSwKKyAgICBRRkMoMHgwM0E5NjZCQyksCisgICAgUUZDKDB4RkZFOTQwRjQpLAorICAgIFFGQygweEZGRTlDQTc2KSwKKyAgICBRRkMoMHhGRkVBOTE5MiksCisgICAgUUZDKDB4RkZFQjUwQjIpLAorICAgIC8qLS0tLS0tLS0tLS0tLSAxMSAuLiA4IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4RkY5NzVDMDEpLAorICAgIFFGQygweEZGN0VFM0YxKSwKKyAgICBRRkMoMHhGRjY1NDJEMSksCisgICAgUUZDKDB4RkY0QUFCQzgpLAorICAgIFFGQygweEUwRkM0MjFFKSwKKyAgICBRRkMoMHhERkE5M0FCNSksCisgICAgUUZDKDB4REU1MjkwODYpLAorICAgIFFGQygweERDRjg5OEZCKSwKKyAgICBRRkMoMHgzRTI1QjE3RSksCisgICAgUUZDKDB4M0NCNDEyMTkpLAorICAgIFFGQygweDNCNDE1MTE1KSwKKyAgICBRRkMoMHgzOUNFMDQ3NyksCisgICAgUUZDKDB4MDM3QUQ0MzgpLAorICAgIFFGQygweDAzNEQwMUYxKSwKKyAgICBRRkMoMHgwMzIwMTExNiksCisgICAgUUZDKDB4MDJGM0U0OEQpLAorICAgIFFGQygweEZGRUJFNzdCKSwKKyAgICBRRkMoMHhGRkVDQzMxQiksCisgICAgUUZDKDB4RkZFRDY1MUQpLAorICAgIFFGQygweEZGRUUxNjUwKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gNyAuLiA0IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4RkYyRUY3MjUpLAorICAgIFFGQygweEZGMTIwRDcwKSwKKyAgICBRRkMoMHhGRUYzRjZBQiksCisgICAgUUZDKDB4RkVENEJFQzMpLAorICAgIFFGQygweERCOUI1QjEyKSwKKyAgICBRRkMoMHhEQTNCMTc2QSksCisgICAgUUZDKDB4RDhEN0YyMUYpLAorICAgIFFGQygweEQ3NzIyRjA0KSwKKyAgICBRRkMoMHgzODVBNDlDNCksCisgICAgUUZDKDB4MzZFNjk2OTEpLAorICAgIFFGQygweDM1NzJFQzcwKSwKKyAgICBRRkMoMHgzM0ZGNjcwRSksCisgICAgUUZDKDB4MDJDODk5MDEpLAorICAgIFFGQygweDAyOUUzNUI0KSwKKyAgICBRRkMoMHgwMjc0QkE0MyksCisgICAgUUZDKDB4MDI0QkY3QTEpLAorICAgIFFGQygweEZGRUVERkE0KSwKKyAgICBRRkMoMHhGRkVGN0I4QiksCisgICAgUUZDKDB4RkZFRkY2Q0EpLAorICAgIFFGQygweEZGRjAwNjVEKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gMyAuLiAwIC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4RkVCNDhEMEQpLAorICAgIFFGQygweEZFOTMzREMwKSwKKyAgICBRRkMoMHhGRTcwQjhEMSksCisgICAgUUZDKDB4RkU0RDFCRTMpLAorICAgIFFGQygweEQ2MEE0NkU1KSwKKyAgICBRRkMoMHhENDlGRDU1RiksCisgICAgUUZDKDB4RDMzMzdCM0QpLAorICAgIFFGQygweEQxQzU4QUNFKSwKKyAgICBRRkMoMHgzMjhDQzZGMCksCisgICAgUUZDKDB4MzExQUYzQTQpLAorICAgIFFGQygweDJGQUEyMjFDKSwKKyAgICBRRkMoMHgyRTNBNzUzMiksCisgICAgUUZDKDB4MDIyNDRBMjUpLAorICAgIFFGQygweDAxRkQzQkEwKSwKKyAgICBRRkMoMHgwMUQ3OEJGQyksCisgICAgUUZDKDB4MDFCMkU0MUQpLAorICAgIFFGQygweEZGRUZDOUI5KSwKKyAgICBRRkMoMHhGRkVEOTc4QSksCisgICAgUUZDKDB4RkZFREU1MEUpLAorICAgIFFGQygweDAwMDAwMDAwKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3M2NFtdID0geworICAgIFFUQygweDdmZjYyMTgyKSwgUVRDKDB4N2ZhNzM2YjQpLCBRVEMoMHg3ZjA5OTFjNCksIFFUQygweDdlMWQ5M2VhKSwKKyAgICBRVEMoMHg3Y2UzY2ViMiksIFFUQygweDdiNWQwMzllKSwgUVRDKDB4Nzk4YTIzYjEpLCBRVEMoMHg3NzZjNGVkYiksCisgICAgUVRDKDB4NzUwNGQzNDUpLCBRVEMoMHg3MjU1MmM4NSksIFFUQygweDZmNWYwMmIyKSwgUVRDKDB4NmMyNDI5NjApLAorICAgIFFUQygweDY4YTY5ZTgxKSwgUVRDKDB4NjRlODg5MjYpLCBRVEMoMHg2MGVjMzgzMCksIFFUQygweDVjYjQyMGUwKSwKKyAgICBRVEMoMHg1ODQyZGQ1NCksIFFUQygweDUzOWIyYWYwKSwgUVRDKDB4NGViZmU4YTUpLCBRVEMoMHg0OWI0MTUzMyksCisgICAgUVRDKDB4NDQ3YWNkNTApLCBRVEMoMHgzZjE3NDliOCksIFFUQygweDM5OGNkZDMyKSwgUVRDKDB4MzNkZWYyODcpLAorICAgIFFUQygweDJlMTEwYTYyKSwgUVRDKDB4MjgyNmI5MjgpLCBRVEMoMHgyMjIzYTRjNSksIFFUQygweDFjMGI4MjZhKSwKKyAgICBRVEMoMHgxNWUyMTQ0NSksIFFUQygweDBmYWIyNzJiKSwgUVRDKDB4MDk2YTkwNDkpLCBRVEMoMHgwMzI0MmFiZiksCisgICAgUVRDKDB4ZmNkYmQ1NDEpLCBRVEMoMHhmNjk1NmZiNyksIFFUQygweGYwNTRkOGQ1KSwgUVRDKDB4ZWExZGViYmIpLAorICAgIFFUQygweGUzZjQ3ZDk2KSwgUVRDKDB4ZGRkYzViM2IpLCBRVEMoMHhkN2Q5NDZkOCksIFFUQygweGQxZWVmNTllKSwKKyAgICBRVEMoMHhjYzIxMGQ3OSksIFFUQygweGM2NzMyMmNlKSwgUVRDKDB4YzBlOGI2NDgpLCBRVEMoMHhiYjg1MzJiMCksCisgICAgUVRDKDB4YjY0YmVhY2QpLCBRVEMoMHhiMTQwMTc1YiksIFFUQygweGFjNjRkNTEwKSwgUVRDKDB4YTdiZDIyYWMpLAorICAgIFFUQygweGEzNGJkZjIwKSwgUVRDKDB4OWYxM2M3ZDApLCBRVEMoMHg5YjE3NzZkYSksIFFUQygweDk3NTk2MTdmKSwKKyAgICBRVEMoMHg5M2RiZDZhMCksIFFUQygweDkwYTBmZDRlKSwgUVRDKDB4OGRhYWQzN2IpLCBRVEMoMHg4YWZiMmNiYiksCisgICAgUVRDKDB4ODg5M2IxMjUpLCBRVEMoMHg4Njc1ZGM0ZiksIFFUQygweDg0YTJmYzYyKSwgUVRDKDB4ODMxYzMxNGUpLAorICAgIFFUQygweDgxZTI2YzE2KSwgUVRDKDB4ODBmNjZlM2MpLCBRVEMoMHg4MDU4Yzk0YyksIFFUQygweDgwMDlkZTdlKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW42NFtdID0geworICAgIFFUQygweDAzMjQyYWJmKSwgUVRDKDB4MDk2YTkwNDkpLCBRVEMoMHgwZmFiMjcyYiksIFFUQygweDE1ZTIxNDQ1KSwKKyAgICBRVEMoMHgxYzBiODI2YSksIFFUQygweDIyMjNhNGM1KSwgUVRDKDB4MjgyNmI5MjgpLCBRVEMoMHgyZTExMGE2MiksCisgICAgUVRDKDB4MzNkZWYyODcpLCBRVEMoMHgzOThjZGQzMiksIFFUQygweDNmMTc0OWI4KSwgUVRDKDB4NDQ3YWNkNTApLAorICAgIFFUQygweDQ5YjQxNTMzKSwgUVRDKDB4NGViZmU4YTUpLCBRVEMoMHg1MzliMmFmMCksIFFUQygweDU4NDJkZDU0KSwKKyAgICBRVEMoMHg1Y2I0MjBlMCksIFFUQygweDYwZWMzODMwKSwgUVRDKDB4NjRlODg5MjYpLCBRVEMoMHg2OGE2OWU4MSksCisgICAgUVRDKDB4NmMyNDI5NjApLCBRVEMoMHg2ZjVmMDJiMiksIFFUQygweDcyNTUyYzg1KSwgUVRDKDB4NzUwNGQzNDUpLAorICAgIFFUQygweDc3NmM0ZWRiKSwgUVRDKDB4Nzk4YTIzYjEpLCBRVEMoMHg3YjVkMDM5ZSksIFFUQygweDdjZTNjZWIyKSwKKyAgICBRVEMoMHg3ZTFkOTNlYSksIFFUQygweDdmMDk5MWM0KSwgUVRDKDB4N2ZhNzM2YjQpLCBRVEMoMHg3ZmY2MjE4MiksCisgICAgUVRDKDB4N2ZmNjIxODIpLCBRVEMoMHg3ZmE3MzZiNCksIFFUQygweDdmMDk5MWM0KSwgUVRDKDB4N2UxZDkzZWEpLAorICAgIFFUQygweDdjZTNjZWIyKSwgUVRDKDB4N2I1ZDAzOWUpLCBRVEMoMHg3OThhMjNiMSksIFFUQygweDc3NmM0ZWRiKSwKKyAgICBRVEMoMHg3NTA0ZDM0NSksIFFUQygweDcyNTUyYzg1KSwgUVRDKDB4NmY1ZjAyYjIpLCBRVEMoMHg2YzI0Mjk2MCksCisgICAgUVRDKDB4NjhhNjllODEpLCBRVEMoMHg2NGU4ODkyNiksIFFUQygweDYwZWMzODMwKSwgUVRDKDB4NWNiNDIwZTApLAorICAgIFFUQygweDU4NDJkZDU0KSwgUVRDKDB4NTM5YjJhZjApLCBRVEMoMHg0ZWJmZThhNSksIFFUQygweDQ5YjQxNTMzKSwKKyAgICBRVEMoMHg0NDdhY2Q1MCksIFFUQygweDNmMTc0OWI4KSwgUVRDKDB4Mzk4Y2RkMzIpLCBRVEMoMHgzM2RlZjI4NyksCisgICAgUVRDKDB4MmUxMTBhNjIpLCBRVEMoMHgyODI2YjkyOCksIFFUQygweDIyMjNhNGM1KSwgUVRDKDB4MWMwYjgyNmEpLAorICAgIFFUQygweDE1ZTIxNDQ1KSwgUVRDKDB4MGZhYjI3MmIpLCBRVEMoMHgwOTZhOTA0OSksIFFUQygweDAzMjQyYWJmKSwKK307CiAKIC8qCiAgKiBMb3cgRGVsYXkgUU1GIGFrYSBDTERGQgogICovCiAKICNpZiBkZWZpbmVkKFFNRl9DT0VGRl8xNkJJVCkKLSNkZWZpbmUgUVRDRkxMRCh4KSAgRkwyRlhDT05TVF9TR0woeC8oZmxvYXQpKDE8PFFNRl9DTERGQl9QRlRfU0NBTEUpKQotI2RlZmluZSBRVENGTExEVCh4KSAgRkwyRlhDT05TVF9TR0woeCkKKyNkZWZpbmUgUVRDRkxMRCh4KSBGTDJGWENPTlNUX1NHTCh4IC8gKGZsb2F0KSgxIDw8IFFNRl9DTERGQl9QRlRfU0NBTEUpKQorI2RlZmluZSBRVENGTExEVCh4KSBGTDJGWENPTlNUX1NHTCh4KQogI2Vsc2UKLSNkZWZpbmUgUVRDRkxMRCh4KSAgRkwyRlhDT05TVF9EQkwoeC8oZmxvYXQpKDE8PFFNRl9DTERGQl9QRlRfU0NBTEUpKQotI2RlZmluZSBRVENGTExEVCh4KSAgRkwyRlhDT05TVF9EQkwoeCkKKyNkZWZpbmUgUVRDRkxMRCh4KSBGTDJGWENPTlNUX0RCTCh4IC8gKGZsb2F0KSgxIDw8IFFNRl9DTERGQl9QRlRfU0NBTEUpKQorI2RlZmluZSBRVENGTExEVCh4KSBGTDJGWENPTlNUX0RCTCh4KQogI2VuZGlmCiAKLQogI2lmbmRlZiBMT1dfUE9XRVJfU0JSX09OTFkKIC8qIQogICBcbmFtZSBRTUYtVHdpZGRsZQpAQCAtMTUxMCw3MyArNTI5MywxNjEgQEAKICAgTD0zMiwgZ2Fpbj0yLjAsIGFuZ2xlID0gMC43NQogKi8KIC8qIHNpbi9jb3MgKGFuZ2xlKSAvIDIgKi8KLWNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyX2NsZGZiWzMyXSA9IHsKLSAgUVRDRkxMRFQoLTcuMDcxMDY3ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDcwZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDY0ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3M2UtMDEpLAotICBRVENGTExEVCgtNy4wNzEwNjFlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNzZlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNThlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDgwZS0wMSksCi0gIFFUQ0ZMTERUKC03LjA3MTA1NWUtMDEpLCBRVENGTExEVCg3LjA3MTA4M2UtMDEpLCBRVENGTExEVCg3LjA3MTA1MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwODZlLTAxKSwKLSAgUVRDRkxMRFQoLTcuMDcxMDQ5ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDg5ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDQ2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA5MmUtMDEpLAotICBRVENGTExEVCgtNy4wNzEwNDJlLTAxKSwgUVRDRkxMRFQoNy4wNzEwOTVlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMzllLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDk4ZS0wMSksCi0gIFFUQ0ZMTERUKC03LjA3MTAzNmUtMDEpLCBRVENGTExEVCg3LjA3MTEwMWUtMDEpLCBRVENGTExEVCg3LjA3MTAzM2UtMDEpLCBRVENGTExEVCgtNy4wNzExMDRlLTAxKSwKLSAgUVRDRkxMRFQoLTcuMDcxMDMwZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTA3ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDI3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTExMWUtMDEpLAotICBRVENGTExEVCgtNy4wNzEwMjRlLTAxKSwgUVRDRkxMRFQoNy4wNzExMTRlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMjFlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTE3ZS0wMSksCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3MzMl9jbGRmYl9hbmFbMzJdID0geworICAgIC8qIGFuYWx5c2lzIHR3aWRkbGUgdGFibGUgKi8KKyAgICBRVENGTExEVCgtNy4wNzEwNjdlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNzBlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDY0ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDczZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA2MWUtMDEpLCBRVENGTExEVCg3LjA3MTA3NmUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDU4ZS0wMSksICBRVENGTExEVCgtNy4wNzEwODBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDU1ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwODNlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDUyZS0wMSksICBRVENGTExEVCgtNy4wNzEwODZlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwNDllLTAxKSwgUVRDRkxMRFQoNy4wNzEwODllLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDQ2ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDkyZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA0MmUtMDEpLCBRVENGTExEVCg3LjA3MTA5NWUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDM5ZS0wMSksICBRVENGTExEVCgtNy4wNzEwOThlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDM2ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzExMDFlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDMzZS0wMSksICBRVENGTExEVCgtNy4wNzExMDRlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwMzBlLTAxKSwgUVRDRkxMRFQoNy4wNzExMDdlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDI3ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMTExZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAyNGUtMDEpLCBRVENGTExEVCg3LjA3MTExNGUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDIxZS0wMSksICBRVENGTExEVCgtNy4wNzExMTdlLTAxKSwKK307CisKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyX2NsZGZiX3N5blszMl0gPSB7CisgICAgLyogc3ludGhlc2lzIHR3aWRkbGUgdGFibGUgKi8KKyAgICBRVENGTExEVCg3LjA3MTA2N2UtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDcwZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA2NGUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDczZS0wMSksICBRVENGTExEVCg3LjA3MTA2MWUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDc2ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDU4ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDgwZS0wMSksICBRVENGTExEVCg3LjA3MTA1NWUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA4M2UtMDEpLCBRVENGTExEVCgtNy4wNzEwNTJlLTAxKSwgUVRDRkxMRFQoNy4wNzEwODZlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA0OWUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDg5ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA0NmUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDkyZS0wMSksICBRVENGTExEVCg3LjA3MTA0MmUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDk1ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDM5ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDk4ZS0wMSksICBRVENGTExEVCg3LjA3MTAzNmUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTEwMWUtMDEpLCBRVENGTExEVCgtNy4wNzEwMzNlLTAxKSwgUVRDRkxMRFQoNy4wNzExMDRlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTAzMGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMTA3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAyN2UtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMTExZS0wMSksICBRVENGTExEVCg3LjA3MTAyNGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMTE0ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDIxZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTE3ZS0wMSksCiB9OwogCiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW4zMl9jbGRmYlszMl0gPSB7Ci0gIFFUQ0ZMTERUKDcuMDcxMDY4ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDY1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwNjJlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwNzVlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNTllLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDc4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA1NmUtMDEpLAotICBRVENGTExEVCg3LjA3MTA4MWUtMDEpLCBRVENGTExEVCg3LjA3MTA1M2UtMDEpLCBRVENGTExEVCgtNy4wNzEwODRlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDUwZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDg3ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDQ3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA5MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNDRlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwOTNlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNDFlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDk2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAzOGUtMDEpLAotICBRVENGTExEVCg3LjA3MTA5OWUtMDEpLCBRVENGTExEVCg3LjA3MTAzNGUtMDEpLCBRVENGTExEVCgtNy4wNzExMDNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDMxZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMTA2ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDI4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwOWUtMDEpLCBRVENGTExEVCgtNy4wNzEwMjVlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzExMTJlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMjJlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTE1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAxOWUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDY4ZS0wMSksICBRVENGTExEVCg3LjA3MTA2NWUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDcyZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDYyZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDc1ZS0wMSksICBRVENGTExEVCg3LjA3MTA1OWUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA3OGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNTZlLTAxKSwgUVRDRkxMRFQoNy4wNzEwODFlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA1M2UtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDg0ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA1MGUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDg3ZS0wMSksICBRVENGTExEVCg3LjA3MTA0N2UtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDkwZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDQ0ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDkzZS0wMSksICBRVENGTExEVCg3LjA3MTA0MWUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA5NmUtMDEpLCBRVENGTExEVCgtNy4wNzEwMzhlLTAxKSwgUVRDRkxMRFQoNy4wNzEwOTllLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTAzNGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMTAzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAzMWUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMTA2ZS0wMSksICBRVENGTExEVCg3LjA3MTAyOGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMTA5ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDI1ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTEyZS0wMSksICBRVENGTExEVCg3LjA3MTAyMmUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTExNWUtMDEpLCBRVENGTExEVCgtNy4wNzEwMTllLTAxKSwKIH07CiAKKy8qIHR3aWRkbGVzIGZvciBYPSg4LDE2KSBiYW5kIHFtZiBhcmUgY29waWVkIGZyb20gZmxvYXQgc2ltcGxlcGxheWVyCisgKiBpbXBsZW1lbnRhdGlvbjogcW1mX3BoYXNlc2hpZnRfY29zWF9jbGRmYl9hbmEgID0KKyAqIFFNRmxpYl90d2lkZGxlM1JlYWxYX1NCUkxEX0EgcW1mX3BoYXNlc2hpZnRfY29zWF9jbGRmYl9zeW4gID0KKyAqIC0oUU1GbGliX3R3aWRkbGUzUmVhbFhfU0JSTERfQSkgcW1mX3BoYXNlc2hpZnRfc2luWF9jbGRmYiAgICAgID0KKyAqIFFNRmxpYl90d2lkZGxlM0ltYWdYX1NCUkxEX0EKKyAqLworCisvKiBjb3MgKChuICsgMC41KSpwaSphbmdsZS9MKSAsIG9yZGVyID0gMTU5LCBMPTE2ICovCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3MxNl9jbGRmYl9hbmFbMTZdID0geworICAgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwKK307CisKKy8qIGNvcyAoKG4gKyAwLjUpKnBpKmFuZ2xlL0wpICwgb3JkZXIgPSAxNTksIEw9MTYgKi8KK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczE2X2NsZGZiX3N5blsxNl0gPSB7CisgICAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLAorfTsKKworLyogc2luICgobiArIDAuNSkqcGkqYW5nbGUvTCkgLCBvcmRlciA9IDE1OSwgTD0xNiAqLworY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luMTZfY2xkZmJbMTZdID0geworICAgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksCit9OworCisvKiBjb3MgKChuICsgMC41KSpwaSphbmdsZS9MKSAsIG9yZGVyID0gNzksIEw9OCAqLworY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zOF9jbGRmYl9hbmFbOF0gPSB7CisgICAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksCit9OworCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3M4X2NsZGZiX3N5bls4XSA9IHsKKyAgICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksCit9OworCisvKiBzaW4gKChuICsgMC41KSpwaSphbmdsZS9MKSAsIG9yZGVyID0gNzksIEw9OCAqLworY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luOF9jbGRmYls4XSA9IHsKKyAgICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksCit9OwogCiAvKiBzaW4vY29zIChhbmdsZSkgLyAxMjggKi8KIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczY0X2NsZGZiWzY0XSA9IHsKLSAgUVRDRkxMRFQoNy4wNzEwNjhlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDY2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3MGUtMDEpLCBRVENGTExEVCg3LjA3MTA2NWUtMDEpLAotICBRVENGTExEVCg3LjA3MTA3MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwNjNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDc0ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDYxZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDc1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA1OWUtMDEpLCBRVENGTExEVCgtNy4wNzEwNzhlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNTdlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwODBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDU1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA4MWUtMDEpLCBRVENGTExEVCg3LjA3MTA1M2UtMDEpLAotICBRVENGTExEVCg3LjA3MTA4M2UtMDEpLCBRVENGTExEVCgtNy4wNzEwNTJlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDg1ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDUwZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDg3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA0OGUtMDEpLCBRVENGTExEVCgtNy4wNzEwODllLTAxKSwgUVRDRkxMRFQoNy4wNzEwNDZlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwOTBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDQ0ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA5MmUtMDEpLCBRVENGTExEVCg3LjA3MTA0MmUtMDEpLAotICBRVENGTExEVCg3LjA3MTA5NWUtMDEpLCBRVENGTExEVCgtNy4wNzEwNDBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDk2ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDM4ZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDk4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAzN2UtMDEpLCBRVENGTExEVCgtNy4wNzExMDBlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMzVlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzExMDJlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDMzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwM2UtMDEpLCBRVENGTExEVCg3LjA3MTAzMWUtMDEpLAotICBRVENGTExEVCg3LjA3MTEwNWUtMDEpLCBRVENGTExEVCgtNy4wNzEwMzBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTA3ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDI4ZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMTA5ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAyNWUtMDEpLCBRVENGTExEVCgtNy4wNzExMTFlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMjRlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzExMTNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDIyZS0wMSksIFFUQ0ZMTERUKC03LjA3MTExNWUtMDEpLCBRVENGTExEVCg3LjA3MTAyMGUtMDEpLAotICBRVENGTExEVCg3LjA3MTExN2UtMDEpLCBRVENGTExEVCgtNy4wNzEwMThlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTE4ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDE2ZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMTIwZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAxNWUtMDEpLCBRVENGTExEVCgtNy4wNzExMjJlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMTNlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzExMjRlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDExZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEyNmUtMDEpLCBRVENGTExEVCg3LjA3MTAwOWUtMDEpLAotIH07Ci0gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luNjRfY2xkZmJbNjRdID0gewotICBRVENGTExEVCg3LjA3MTA2N2UtMDEpLCBRVENGTExEVCg3LjA3MTA2OWUtMDEpLCBRVENGTExEVCgtNy4wNzEwNjVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDcxZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDY0ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDczZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA2MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwNzVlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwNjBlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNzdlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDU4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3OGUtMDEpLAotICBRVENGTExEVCg3LjA3MTA1NmUtMDEpLCBRVENGTExEVCg3LjA3MTA4MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNTVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDgyZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDUzZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDg0ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA1MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwODZlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwNDllLTAxKSwgUVRDRkxMRFQoNy4wNzEwODhlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDQ3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA5MGUtMDEpLAotICBRVENGTExEVCg3LjA3MTA0NWUtMDEpLCBRVENGTExEVCg3LjA3MTA5MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwNDNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDkzZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDQxZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDk1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA0MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwOTdlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwMzhlLTAxKSwgUVRDRkxMRFQoNy4wNzEwOTllLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDM2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwMGUtMDEpLAotICBRVENGTExEVCg3LjA3MTAzNGUtMDEpLCBRVENGTExEVCg3LjA3MTEwM2UtMDEpLCBRVENGTExEVCgtNy4wNzEwMzJlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTA1ZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDMwZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTA2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAyOGUtMDEpLCBRVENGTExEVCgtNy4wNzExMDhlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwMjdlLTAxKSwgUVRDRkxMRFQoNy4wNzExMTBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDI1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTExMmUtMDEpLAotICBRVENGTExEVCg3LjA3MTAyM2UtMDEpLCBRVENGTExEVCg3LjA3MTExNGUtMDEpLCBRVENGTExEVCgtNy4wNzEwMjFlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTE1ZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDE5ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTE3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAxN2UtMDEpLCBRVENGTExEVCgtNy4wNzExMjBlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwMTVlLTAxKSwgUVRDRkxMRFQoNy4wNzExMjFlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDEzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEyM2UtMDEpLAotICBRVENGTExEVCg3LjA3MTAxMmUtMDEpLCBRVENGTExEVCg3LjA3MTEyNWUtMDEpLCBRVENGTExEVCgtNy4wNzEwMTBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTI3ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwNjhlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA2NmUtMDEpLCBRVENGTExEVCgtNy4wNzEwNzBlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA2NWUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwNzJlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA2M2UtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA3NGUtMDEpLCBRVENGTExEVCg3LjA3MTA2MWUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwNzVlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwNTllLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDc4ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDU3ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwODBlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA1NWUtMDEpLCBRVENGTExEVCgtNy4wNzEwODFlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA1M2UtMDEpLCAgUVRDRkxMRFQoNy4wNzEwODNlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA1MmUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA4NWUtMDEpLCBRVENGTExEVCg3LjA3MTA1MGUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwODdlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwNDhlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDg5ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDQ2ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwOTBlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA0NGUtMDEpLCBRVENGTExEVCgtNy4wNzEwOTJlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA0MmUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwOTVlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA0MGUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA5NmUtMDEpLCBRVENGTExEVCg3LjA3MTAzOGUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwOThlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwMzdlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTAwZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDM1ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzExMDJlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTAzM2UtMDEpLCBRVENGTExEVCgtNy4wNzExMDNlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTAzMWUtMDEpLCAgUVRDRkxMRFQoNy4wNzExMDVlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTAzMGUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTEwN2UtMDEpLCBRVENGTExEVCg3LjA3MTAyOGUtMDEpLCAgUVRDRkxMRFQoNy4wNzExMDllLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwMjVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTExZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDI0ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzExMTNlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTAyMmUtMDEpLCBRVENGTExEVCgtNy4wNzExMTVlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTAyMGUtMDEpLCAgUVRDRkxMRFQoNy4wNzExMTdlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTAxOGUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTExOGUtMDEpLCBRVENGTExEVCg3LjA3MTAxNmUtMDEpLCAgUVRDRkxMRFQoNy4wNzExMjBlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwMTVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTIyZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDEzZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzExMjRlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTAxMWUtMDEpLCBRVENGTExEVCgtNy4wNzExMjZlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTAwOWUtMDEpLAorfTsKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjY0X2NsZGZiWzY0XSA9IHsKKyAgICBRVENGTExEVCg3LjA3MTA2N2UtMDEpLCAgUVRDRkxMRFQoNy4wNzEwNjllLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA2NWUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA3MWUtMDEpLCBRVENGTExEVCg3LjA3MTA2NGUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwNzNlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwNjJlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDc1ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDYwZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwNzdlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA1OGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNzhlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA1NmUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwODBlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA1NWUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA4MmUtMDEpLCBRVENGTExEVCg3LjA3MTA1M2UtMDEpLCAgUVRDRkxMRFQoNy4wNzEwODRlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwNTBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDg2ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDQ5ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwODhlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA0N2UtMDEpLCBRVENGTExEVCgtNy4wNzEwOTBlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA0NWUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwOTJlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA0M2UtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA5M2UtMDEpLCBRVENGTExEVCg3LjA3MTA0MWUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwOTVlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwNDBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDk3ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDM4ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwOTllLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTAzNmUtMDEpLCBRVENGTExEVCgtNy4wNzExMDBlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTAzNGUtMDEpLCAgUVRDRkxMRFQoNy4wNzExMDNlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTAzMmUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTEwNWUtMDEpLCBRVENGTExEVCg3LjA3MTAzMGUtMDEpLCAgUVRDRkxMRFQoNy4wNzExMDZlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwMjhlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTA4ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDI3ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzExMTBlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTAyNWUtMDEpLCBRVENGTExEVCgtNy4wNzExMTJlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTAyM2UtMDEpLCAgUVRDRkxMRFQoNy4wNzExMTRlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTAyMWUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTExNWUtMDEpLCBRVENGTExEVCg3LjA3MTAxOWUtMDEpLCAgUVRDRkxMRFQoNy4wNzExMTdlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwMTdlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTIwZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDE1ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzExMjFlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTAxM2UtMDEpLCBRVENGTExEVCgtNy4wNzExMjNlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTAxMmUtMDEpLCAgUVRDRkxMRFQoNy4wNzExMjVlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTAxMGUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTEyN2UtMDEpLAogfTsKIAogLy9AfQogCiAjZW5kaWYgLyogI2lmZGVmIExPV19QT1dFUl9TQlJfT05MWSAqLwogCi0KLQogLyohCiAgIFxuYW1lIFFNRgogICBcYnJpZWYgIFFNRi1UYWJsZQpAQCAtMTYyMCwyMTEgKzU0OTEsOTgzIEBACiAKIExOS19TRUNUSU9OX0NPTlNUREFUQV9MMQogUkFNX0FMSUdOCi1jb25zdCBGSVhQX1BGVCBxbWZfY2xkZmJfNjQwW1FNRjY0MF9DTERGQl9QRlRfVEFCTEVfU0laRV0gPQotewotICBRVENGTExEKDYuNTcxNzYwZS0wNyksIFFUQ0ZMTEQoLTguMDEwMDc5ZS0wNiksIFFUQ0ZMTEQoLTEuMjUwNzQzZS0wMyksIFFUQ0ZMTEQoOC45OTYzNzFlLTAzKSwgUVRDRkxMRCg1LjEyODU1N2UtMDEpLAotICBRVENGTExEKDQuMTE4MzYwZS0wNyksIFFUQ0ZMTEQoLTEuNDY5OTMzZS0wNSksIFFUQ0ZMTEQoLTEuMTk0NzQzZS0wMyksIFFUQ0ZMTEQoOS42NDAyOTllLTAzKSwgUVRDRkxMRCg1LjI5OTUxMGUtMDEpLAotICBRVENGTExEKDguMTA5OTUyZS0wNyksIFFUQ0ZMTEQoNC44NDA1NzhlLTA2KSwgUVRDRkxMRCgtMS4xNTE3OTZlLTAzKSwgUVRDRkxMRCgxLjAzMzEyNmUtMDIpLCBRVENGTExEKDUuNDcwNjUyZS0wMSksCi0gIFFUQ0ZMTEQoNy4wOTk2MzNlLTA3KSwgUVRDRkxMRCg3LjE2NzEwMWUtMDYpLCBRVENGTExEKC0xLjA5OTAwMWUtMDMpLCBRVENGTExEKDEuMTA2OTU5ZS0wMiksIFFUQ0ZMTEQoNS42NDE1MjNlLTAxKSwKLSAgUVRDRkxMRCg2LjgzNDIxMGUtMDcpLCBRVENGTExEKDEuMDg4MzI1ZS0wNSksIFFUQ0ZMTEQoLTEuMDQ3NjU1ZS0wMyksIFFUQ0ZMTEQoMS4xODYyMTFlLTAyKSwgUVRDRkxMRCg1LjgxMTk5M2UtMDEpLAotICBRVENGTExEKDQuMjkyODYyZS0wNyksIFFUQ0ZMTEQoMS4wMTMyNjBlLTA1KSwgUVRDRkxMRCgtOS44NjIwMjdlLTA0KSwgUVRDRkxMRCgxLjI3MDc0N2UtMDIpLCBRVENGTExEKDUuOTgxODc3ZS0wMSksCi0gIFFUQ0ZMTEQoLTUuNDI2NTk3ZS0wOSksIFFUQ0ZMTEQoNS44Njk3MDdlLTA2KSwgUVRDRkxMRCgtOS4yOTQ2NjVlLTA0KSwgUVRDRkxMRCgxLjM2MTA3MmUtMDIpLCBRVENGTExEKDYuMTUxMDMxZS0wMSksCi0gIFFUQ0ZMTEQoNi4zNTUzMDNlLTA4KSwgUVRDRkxMRCgxLjEyNTEzNWUtMDUpLCBRVENGTExEKC05Ljc2NzcwOWUtMDQpLCBRVENGTExEKDEuNDU2MjA5ZS0wMiksIFFUQ0ZMTEQoNi4zMTkyODRlLTAxKSwKLSAgUVRDRkxMRCg1LjQ5MDU3MGUtMDcpLCBRVENGTExEKDIuMDE1NDQ1ZS0wNSksIFFUQ0ZMTEQoLTEuMDQwNTk4ZS0wMyksIFFUQ0ZMTEQoMS41NTc3NTllLTAyKSwgUVRDRkxMRCg2LjQ4NjQzOGUtMDEpLAotICBRVENGTExEKDEuNjIwMTcxZS0wNiksIFFUQ0ZMTEQoMi44MDA0NTZlLTA1KSwgUVRDRkxMRCgtMS4xNDYyNjhlLTAzKSwgUVRDRkxMRCgxLjY2NTE4OGUtMDIpLCBRVENGTExEKDYuNjUyMzA0ZS0wMSksCi0gIFFUQ0ZMTEQoLTYuMDI1MTEwZS0xMCksIFFUQ0ZMTEQoOC45NzU5NzhlLTA2KSwgUVRDRkxMRCgtMS4yOTI4NjZlLTAzKSwgUVRDRkxMRCgxLjc3ODI0OWUtMDIpLCBRVENGTExEKDYuODE2NjY4ZS0wMSksCi0gIFFUQ0ZMTEQoLTYuMzI1NjY0ZS0xMCksIFFUQ0ZMTEQoOC41NjM4MjBlLTA2KSwgUVRDRkxMRCgtMS4xOTY2MzhlLTAzKSwgUVRDRkxMRCgxLjg5NzUwNmUtMDIpLCBRVENGTExEKDYuOTc5MzM3ZS0wMSksCi0gIFFUQ0ZMTEQoLTQuMDEzNTI1ZS0wOSksIFFUQ0ZMTEQoMS4xNjg4OTVlLTA1KSwgUVRDRkxMRCgtOS43MjY2OTllLTA0KSwgUVRDRkxMRCgyLjAyMzUyNWUtMDIpLCBRVENGTExEKDcuMTQwMDg3ZS0wMSksCi0gIFFUQ0ZMTEQoLTQuMjQ0MDkxZS0wOSksIFFUQ0ZMTEQoNy4zMDA1ODllLTA2KSwgUVRDRkxMRCgtOC4wMjk2MjBlLTA0KSwgUVRDRkxMRCgyLjE1NjMwNWUtMDIpLCBRVENGTExEKDcuMjk4NzQ2ZS0wMSksCi0gIFFUQ0ZMTEQoLTEuODQ2NTQ4ZS0wOCksIFFUQ0ZMTEQoMy45NjUzNjRlLTA2KSwgUVRDRkxMRCgtNi43NTQ5MzZlLTA0KSwgUVRDRkxMRCgyLjI5NjQ3MWUtMDIpLCBRVENGTExEKDcuNDU1MTEyZS0wMSksCi0gIFFUQ0ZMTEQoLTMuODcwNTM3ZS0wOSksIFFUQ0ZMTEQoMS4zNzQ4OTZlLTA2KSwgUVRDRkxMRCgtNS43OTExNDVlLTA0KSwgUVRDRkxMRCgyLjQ0MzQzNGUtMDIpLCBRVENGTExEKDcuNjA5MDUxZS0wMSksCi0gIFFUQ0ZMTEQoLTguODgzNDk5ZS0xMCksIFFUQ0ZMTEQoMy43OTg1MjBlLTA3KSwgUVRDRkxMRCgtNC43MzMxNDhlLTA0KSwgUVRDRkxMRCgyLjU5Nzk1N2UtMDIpLCBRVENGTExEKDcuNzYwMzg2ZS0wMSksCi0gIFFUQ0ZMTEQoNS4zMDM1MjhlLTA4KSwgUVRDRkxMRCg0LjQ2OTcyOWUtMDYpLCBRVENGTExEKC0yLjk5ODc0MGUtMDQpLCBRVENGTExEKDIuNzYwMDkxZS0wMiksIFFUQ0ZMTEQoNy45MDg5OTVlLTAxKSwKLSAgUVRDRkxMRCg3LjM5MTk3NGUtMDgpLCBRVENGTExEKDIuNDYxODc3ZS0wNSksIFFUQ0ZMTEQoNy44ODI2MjBlLTA1KSwgUVRDRkxMRCgyLjkzMTUyNmUtMDIpLCBRVENGTExEKDguMDU0NzAxZS0wMSksCi0gIFFUQ0ZMTEQoMS43MjMyMTdlLTA5KSwgUVRDRkxMRCg0LjAwNTI2OWUtMDUpLCBRVENGTExEKDQuNzA4MDEwZS0wNCksIFFUQ0ZMTEQoMy4xMTA4NjFlLTAyKSwgUVRDRkxMRCg4LjE5NzM4N2UtMDEpLAotICBRVENGTExEKDIuNDQzMDg1ZS0wNyksIFFUQ0ZMTEQoNS4yNzI5ODJlLTA1KSwgUVRDRkxMRCg4LjA4OTgxMmUtMDQpLCBRVENGTExEKDMuMjk4MTUxZS0wMiksIFFUQ0ZMTEQoOC4zMzY4NjRlLTAxKSwKLSAgUVRDRkxMRCgxLjM4NzU2N2UtMDgpLCBRVENGTExEKDQuOTM5MzkyZS0wNSksIFFUQ0ZMTEQoMS4xMjcxNDJlLTAzKSwgUVRDRkxMRCgzLjQ5MzMwMGUtMDIpLCBRVENGTExEKDguNDcyOTg3ZS0wMSksCi0gIFFUQ0ZMTEQoLTUuNjkwNTMxZS0wNiksIFFUQ0ZMTEQoLTQuMjU2NDQyZS0wNSksIFFUQ0ZMTEQoMS40MTczNjdlLTAzKSwgUVRDRkxMRCgzLjY5NjM0M2UtMDIpLCBRVENGTExEKDguNjA1NTQzZS0wMSksCi0gIFFUQ0ZMTEQoMy42MjkwNjdlLTA2KSwgUVRDRkxMRCg2LjU4MjMyOGUtMDUpLCBRVENGTExEKDEuNzI1MDMwZS0wMyksIFFUQ0ZMTEQoMy45MDcxMzhlLTAyKSwgUVRDRkxMRCg4LjczNDM2N2UtMDEpLAotICBRVENGTExEKC01LjM5MzU1NmUtMDgpLCBRVENGTExEKDYuNDgxOTIxZS0wNSksIFFUQ0ZMTEQoMS45NDgwNjllLTAzKSwgUVRDRkxMRCg0LjEyNTU3MGUtMDIpLCBRVENGTExEKDguODU5MjMyZS0wMSksCi0gIFFUQ0ZMTEQoMS4zNDk5NDRlLTA3KSwgUVRDRkxMRCgzLjM2Nzk5OGUtMDUpLCBRVENGTExEKDIuMDMzNDY1ZS0wMyksIFFUQ0ZMTEQoNC4zNTU1NjhlLTAyKSwgUVRDRkxMRCg4Ljk3OTk1OWUtMDEpLAotICBRVENGTExEKDcuMzI2NjExZS0wOSksIFFUQ0ZMTEQoNC42OTQyNTJlLTA1KSwgUVRDRkxMRCgyLjIzOTE0M2UtMDMpLCBRVENGTExEKDQuNTk5MDY4ZS0wMiksIFFUQ0ZMTEQoOS4wOTYzMTFlLTAxKSwKLSAgUVRDRkxMRCgyLjM5OTY5NmUtMDcpLCBRVENGTExEKDYuOTA0NDE1ZS0wNSksIFFUQ0ZMTEQoMi40NzA0NTZlLTAzKSwgUVRDRkxMRCg0Ljg0OTI4NWUtMDIpLCBRVENGTExEKDkuMjA4MTk1ZS0wMSksCi0gIFFUQ0ZMTEQoMy4zMzA5ODJlLTA3KSwgUVRDRkxMRCg1LjY0MzEwM2UtMDUpLCBRVENGTExEKDIuNjMwNDcyZS0wMyksIFFUQ0ZMTEQoNS4xMDU2MjFlLTAyKSwgUVRDRkxMRCg5LjMxNTQ0MmUtMDEpLAotICBRVENGTExEKDQuNzY3Nzk0ZS0wNyksIFFUQ0ZMTEQoNy4wOTU4ODdlLTA1KSwgUVRDRkxMRCgyLjcwMzAxOWUtMDMpLCBRVENGTExEKDUuMzY4MzEzZS0wMiksIFFUQ0ZMTEQoOS40MTc5NzZlLTAxKSwKLSAgUVRDRkxMRCgzLjQyODY2MWUtMDcpLCBRVENGTExEKDcuODcyNTkzZS0wNSksIFFUQ0ZMTEQoMi43MjkxMzdlLTAzKSwgUVRDRkxMRCg1LjYzNzIxOWUtMDIpLCBRVENGTExEKDkuNTE1Njc1ZS0wMSksCi0gIFFUQ0ZMTEQoOC42NzY4NDhlLTA2KSwgUVRDRkxMRCgyLjY2NjQ0NWUtMDQpLCBRVENGTExEKDIuNzE5NzQ5ZS0wMyksIFFUQ0ZMTEQoNS45MTEzNjNlLTAyKSwgUVRDRkxMRCg5LjYwODUyMGUtMDEpLAotICBRVENGTExEKDIuNzIyMjk2ZS0wNSksIFFUQ0ZMTEQoNS44MjIyMDFlLTA0KSwgUVRDRkxMRCgyLjUzMDkwN2UtMDMpLCBRVENGTExEKDYuMTkyNjkzZS0wMiksIFFUQ0ZMTEQoOS42OTY0MjZlLTAxKSwKLSAgUVRDRkxMRCgzLjU3NTY1MWUtMDcpLCBRVENGTExEKDcuODcwMzU1ZS0wNSksIFFUQ0ZMTEQoMi4yMjU1MjRlLTAzKSwgUVRDRkxMRCg2LjQ4MDQ0OWUtMDIpLCBRVENGTExEKDkuNzc5NDA1ZS0wMSksCi0gIFFUQ0ZMTEQoNi4yOTMwMDJlLTA3KSwgUVRDRkxMRCg3LjI0NTA5NmUtMDUpLCBRVENGTExEKDEuODkxOTcyZS0wMyksIFFUQ0ZMTEQoNi43NzE2NzVlLTAyKSwgUVRDRkxMRCg5Ljg1NzM4OGUtMDEpLAotICBRVENGTExEKDEuMDcwMjQzZS0wNiksIFFUQ0ZMTEQoNy4xOTQxNTFlLTA1KSwgUVRDRkxMRCgxLjU1NzExMmUtMDMpLCBRVENGTExEKDcuMDY0OTQ4ZS0wMiksIFFUQ0ZMTEQoOS45MzAzODBlLTAxKSwKLSAgUVRDRkxMRCgtMy4yMjU5MTNlLTA3KSwgUVRDRkxMRCgtNy42Nzk5NTVlLTA1KSwgUVRDRkxMRCgxLjE5NDczMWUtMDMpLCBRVENGTExEKDcuMzYwNTU5ZS0wMiksIFFUQ0ZMTEQoOS45OTgyODZlLTAxKSwKLSAgUVRDRkxMRCgtOS41OTc1MTZlLTA5KSwgUVRDRkxMRCgtNi4wOTMzNzNlLTA1KSwgUVRDRkxMRCg2LjQxNTQwMmUtMDQpLCBRVENGTExEKDcuNjU3NjUwZS0wMiksIFFUQ0ZMTEQoMS4wMDYxMDllKzAwKSwKLSAgUVRDRkxMRCgtOC45MDgwNDFlLTA4KSwgUVRDRkxMRCgtMS43MjEzNDdlLTA1KSwgUVRDRkxMRCgxLjA5MjUyNmUtMDQpLCBRVENGTExEKDcuOTU1NTcxZS0wMiksIFFUQ0ZMTEQoMS4wMTE4NjhlKzAwKSwKLSAgUVRDRkxMRCgtMi4yODU1NjNlLTA1KSwgUVRDRkxMRCgtOC44ODIzMDVlLTA1KSwgUVRDRkxMRCgyLjkzNDg3NmUtMDQpLCBRVENGTExEKDguMjUxOTYyZS0wMiksIFFUQ0ZMTEQoMS4wMTcxMDBlKzAwKSwKLSAgUVRDRkxMRCgxLjAxMzU3NWUtMDUpLCBRVENGTExEKDYuNDE4NjU4ZS0wNSksIFFUQ0ZMTEQoNS43MjEyMjNlLTA0KSwgUVRDRkxMRCg4LjU0NzcxNmUtMDIpLCBRVENGTExEKDEuMDIxNzk5ZSswMCksCi0gIFFUQ0ZMTEQoLTEuNzA2OTQxZS0wNSksIFFUQ0ZMTEQoMS43NjkyNjJlLTA0KSwgUVRDRkxMRCg2Ljk3NjU2MWUtMDQpLCBRVENGTExEKDguODQxODEzZS0wMiksIFFUQ0ZMTEQoMS4wMjU5NjdlKzAwKSwKLSAgUVRDRkxMRCgxLjM1NjcyOGUtMDYpLCBRVENGTExEKDIuMjA2MzQxZS0wNSksIFFUQ0ZMTEQoNy4zNzYxMDFlLTA0KSwgUVRDRkxMRCg5LjEzMzU5MWUtMDIpLCBRVENGTExEKDEuMDI5NjAxZSswMCksCi0gIFFUQ0ZMTEQoLTEuMzk4OTEzZS0wOCksIFFUQ0ZMTEQoLTYuNTM4ODc5ZS0wNiksIFFUQ0ZMTEQoNy4xNTQxMjRlLTA0KSwgUVRDRkxMRCg5LjQyMTYyNGUtMDIpLCBRVENGTExEKDEuMDMyNzEzZSswMCksCi0gIFFUQ0ZMTEQoMy41NTI5OTJlLTA4KSwgUVRDRkxMRCgtMS4wNTI3MDdlLTA1KSwgUVRDRkxMRCg3LjEzOTkyMGUtMDQpLCBRVENGTExEKDkuNzA1MjQwZS0wMiksIFFUQ0ZMTEQoMS4wMzUzMTJlKzAwKSwKLSAgUVRDRkxMRCg0LjIxMTE3N2UtMDcpLCBRVENGTExEKC05LjA3NTQzMWUtMDYpLCBRVENGTExEKDYuOTQ0MTIzZS0wNCksIFFUQ0ZMTEQoOS45ODI5NThlLTAyKSwgUVRDRkxMRCgxLjAzNzQyMmUrMDApLAotICBRVENGTExEKDUuNDMzNzE5ZS0wNyksIFFUQ0ZMTEQoLTEuNzQ4Mjg1ZS0wNSksIFFUQ0ZMTEQoNi43NjYzMjBlLTA0KSwgUVRDRkxMRCgxLjAyNTM5OGUtMDEpLCBRVENGTExEKDEuMDM5MDYyZSswMCksCi0gIFFUQ0ZMTEQoOC4yMjY2MDBlLTA4KSwgUVRDRkxMRCgtMy40OTgyODZlLTA1KSwgUVRDRkxMRCg2Ljg4Nzc4NGUtMDQpLCBRVENGTExEKDEuMDUxNjQyZS0wMSksIFFUQ0ZMTEQoMS4wNDAyNjJlKzAwKSwKLSAgUVRDRkxMRCgxLjI3MjcwNWUtMDcpLCBRVENGTExEKC00LjQ4OTQ5MWUtMDUpLCBRVENGTExEKDYuNjczMjUwZS0wNCksIFFUQ0ZMTEQoMS4wNzY5NzJlLTAxKSwgUVRDRkxMRCgxLjA0MTA0M2UrMDApLAotICBRVENGTExEKDIuNTQyNTk4ZS0wNyksIFFUQ0ZMTEQoLTUuNDQ5ODE2ZS0wNSksIFFUQ0ZMTEQoNS45NzA2OTdlLTA0KSwgUVRDRkxMRCgxLjEwMTIxNmUtMDEpLCBRVENGTExEKDEuMDQxNDM0ZSswMCksCi0gIFFUQ0ZMTEQoNi4zMjI3NzBlLTA3KSwgUVRDRkxMRCgtNS44NzQxOTllLTA1KSwgUVRDRkxMRCg0Ljc0OTkzMWUtMDQpLCBRVENGTExEKDEuMTI0Mjk2ZS0wMSksIFFUQ0ZMTEQoMS4wNDE0NDNlKzAwKSwKLSAgUVRDRkxMRCgyLjgwMTg4MmUtMDgpLCBRVENGTExEKC03LjkzNDUxMGUtMDUpLCBRVENGTExEKDMuMTg5MzM2ZS0wNCksIFFUQ0ZMTEQoMS4xNDYwNDJlLTAxKSwgUVRDRkxMRCgxLjA0MTA4N2UrMDApLAotICBRVENGTExEKDUuODkxOTA0ZS0wNyksIFFUQ0ZMTEQoLTguMDM5MjMyZS0wNSksIFFUQ0ZMTEQoMS4yMTgyMjZlLTA0KSwgUVRDRkxMRCgxLjE2NjM5OWUtMDEpLCBRVENGTExEKDEuMDQwMzUwZSswMCksCi0gIFFUQ0ZMTEQoNy4zMDE5NTdlLTA3KSwgUVRDRkxMRCgtOS45MDc2MzFlLTA1KSwgUVRDRkxMRCgtMS4zMjQyOTJlLTA0KSwgUVRDRkxMRCgxLjE4NTI0M2UtMDEpLCBRVENGTExEKDEuMDM5MjI4ZSswMCksCi0gIFFUQ0ZMTEQoLTQuNTE4NjAzZS0wNiksIFFUQ0ZMTEQoLTIuMjE3MDI1ZS0wNCksIFFUQ0ZMTEQoLTQuMjY4NTc1ZS0wNCksIFFUQ0ZMTEQoMS4yMDI1NDZlLTAxKSwgUVRDRkxMRCgxLjAzNzY4M2UrMDApLAotICBRVENGTExEKC0zLjU2MTU4NWUtMDYpLCBRVENGTExEKC0yLjQxNTE2NmUtMDQpLCBRVENGTExEKC03LjgwNDU0NmUtMDQpLCBRVENGTExEKDEuMjE4MTg0ZS0wMSksIFFUQ0ZMTEQoMS4wMzU2OTRlKzAwKSwKLSAgUVRDRkxMRCgtMS4wNzQ3MTdlLTA3KSwgUVRDRkxMRCgtMi4xMjM2NzJlLTA0KSwgUVRDRkxMRCgtMS4xNTY2ODBlLTAzKSwgUVRDRkxMRCgxLjIzMjEzMmUtMDEpLCBRVENGTExEKDEuMDMzMjA2ZSswMCksCi0gIFFUQ0ZMTEQoMS4zMjMyNjhlLTA2KSwgUVRDRkxMRCgtMi4wNzgyOTllLTA0KSwgUVRDRkxMRCgtMS41MjU4MTllLTAzKSwgUVRDRkxMRCgxLjI0NDI3MGUtMDEpLCBRVENGTExEKDEuMDMwMTk5ZSswMCksCi0gIFFUQ0ZMTEQoMy4zNzc4MTVlLTA2KSwgUVRDRkxMRCgtMS44ODUyODZlLTA0KSwgUVRDRkxMRCgtMS45MTQxMTVlLTAzKSwgUVRDRkxMRCgxLjI1NDYwNWUtMDEpLCBRVENGTExEKDEuMDI2NjE2ZSswMCksCi0gIFFUQ0ZMTEQoNS4xNjE2MDdlLTA2KSwgUVRDRkxMRCgtMS43Mjg2NzNlLTA0KSwgUVRDRkxMRCgtMi4yOTI4MTRlLTAzKSwgUVRDRkxMRCgxLjI2Mjk5NmUtMDEpLCBRVENGTExEKDEuMDIyNDcwZSswMCksCi0gIFFUQ0ZMTEQoNS45MjQwMDFlLTA2KSwgUVRDRkxMRCgtMS43NDQ4NDJlLTA0KSwgUVRDRkxMRCgtMi42NTgwNDJlLTAzKSwgUVRDRkxMRCgxLjI2OTQxNmUtMDEpLCBRVENGTExEKDEuMDE3NzI5ZSswMCksCi0gIFFUQ0ZMTEQoNi4zMTAyMDhlLTA2KSwgUVRDRkxMRCgtMS43ODQxOTNlLTA0KSwgUVRDRkxMRCgtMy4wMDA0MjNlLTAzKSwgUVRDRkxMRCgxLjI3MzY0OGUtMDEpLCBRVENGTExEKDEuMDEyNTA4ZSswMCksCi0gIFFUQ0ZMTEQoMy4zNTcyMTllLTA2KSwgUVRDRkxMRCgtMi4xMzE0MDZlLTA0KSwgUVRDRkxMRCgtMy4zMTg4NThlLTAzKSwgUVRDRkxMRCgxLjI3NTU2MWUtMDEpLCBRVENGTExEKDEuMDA2ODkzZSswMCksCi0gIFFUQ0ZMTEQoNS4xODkwODdlLTA2KSwgUVRDRkxMRCgtMi4wNzg4ODZlLTA0KSwgUVRDRkxMRCgtMy41OTc0NzZlLTAzKSwgUVRDRkxMRCgxLjI3NDU2OGUtMDEpLCBRVENGTExEKDEuMDAxNDYzZSswMCksCi0gIFFUQ0ZMTEQoNC4xNzgwNTBlLTA2KSwgUVRDRkxMRCgtNC42NjM3NzhlLTA1KSwgUVRDRkxMRCgtMy44NzA4NTJlLTAzKSwgUVRDRkxMRCgxLjI3MzU5MWUtMDEpLCBRVENGTExEKDkuOTI3NTQ0ZS0wMSksCi0gIFFUQ0ZMTEQoNS4zNjQ4MDdlLTA2KSwgUVRDRkxMRCgtNS44ODkyNzdlLTA2KSwgUVRDRkxMRCgtNC4xMzUxMzBlLTAzKSwgUVRDRkxMRCgxLjI3MjQ5OWUtMDEpLCBRVENGTExEKDkuODA3NjkyZS0wMSksCi0gIFFUQ0ZMTEQoNC4wODM3MTllLTA2KSwgUVRDRkxMRCgtMS43NzQxMDhlLTA1KSwgUVRDRkxMRCgtNC4zNTE2NjhlLTAzKSwgUVRDRkxMRCgxLjI2ODI4MWUtMDEpLCBRVENGTExEKDkuNjkwMDE3ZS0wMSksCi0gIFFUQ0ZMTEQoMy41Njc1ODFlLTA2KSwgUVRDRkxMRCgtMi41OTk0NjhlLTA4KSwgUVRDRkxMRCgtNC41MTcxOTBlLTAzKSwgUVRDRkxMRCgxLjI2MTI2MmUtMDEpLCBRVENGTExEKDkuNTY4ODg2ZS0wMSksCi0gIFFUQ0ZMTEQoMy4yNjI3NTRlLTA2KSwgUVRDRkxMRCgxLjI2MDY0MGUtMDUpLCBRVENGTExEKC00LjYzNjIyOGUtMDMpLCBRVENGTExEKDEuMjUxNDc3ZS0wMSksIFFUQ0ZMTEQoOS40NDM4MDNlLTAxKSwKLSAgUVRDRkxMRCgyLjA0MTEyOGUtMDYpLCBRVENGTExEKDIuMzY0NTE5ZS0wNSksIFFUQ0ZMTEQoLTQuNzA0MzIxZS0wMyksIFFUQ0ZMTEQoMS4yMzg4NjllLTAxKSwgUVRDRkxMRCg5LjMxMzg3NGUtMDEpLAotICBRVENGTExEKC0yLjU2Nzk2NWUtMDgpLCBRVENGTExEKDIuODA2OTYzZS0wNSksIFFUQ0ZMTEQoLTQuNzIyNTY4ZS0wMyksIFFUQ0ZMTEQoMS4yMjMzNzFlLTAxKSwgUVRDRkxMRCg5LjE3OTY2NmUtMDEpLAotICBRVENGTExEKDIuNzE0ODc5ZS0wNyksIFFUQ0ZMTEQoNC40OTM5MTZlLTA1KSwgUVRDRkxMRCgtNC42NjMyNzZlLTAzKSwgUVRDRkxMRCgxLjIwNDg1NGUtMDEpLCBRVENGTExEKDkuMDQxMjg2ZS0wMSksCi0gIFFUQ0ZMTEQoMi4xNTA4ODRlLTA2KSwgUVRDRkxMRCg1LjQwODE1NWUtMDUpLCBRVENGTExEKC00LjU1NDgxMWUtMDMpLCBRVENGTExEKDEuMTgzMjMzZS0wMSksIFFUQ0ZMTEQoOC44OTk0NzRlLTAxKSwKLSAgUVRDRkxMRCg1LjgxODU5NWUtMDYpLCBRVENGTExEKDMuNzU5NjMwZS0wNSksIFFUQ0ZMTEQoLTQuMzY5NTU0ZS0wMyksIFFUQ0ZMTEQoMS4xNTgzNTllLTAxKSwgUVRDRkxMRCg4Ljc1NDY0MWUtMDEpLAotICBRVENGTExEKC0xLjY4NjEzN2UtMDkpLCBRVENGTExEKDIuNTE1MTE4ZS0wNSksIFFUQ0ZMTEQoLTQuMDkxMDMzZS0wMyksIFFUQ0ZMTEQoMS4xMzAxODBlLTAxKSwgUVRDRkxMRCg4LjYwNzQ5MmUtMDEpLAotICBRVENGTExEKC0xLjc3NTE5MWUtMDkpLCBRVENGTExEKDIuNDA2NTE3ZS0wNSksIFFUQ0ZMTEQoLTMuNzk0NDI1ZS0wMyksIFFUQ0ZMTEQoMS4wOTg1NTFlLTAxKSwgUVRDRkxMRCg4LjQ1ODQ1MGUtMDEpLAotICBRVENGTExEKC0yLjIyMjA3MmUtMDkpLCBRVENGTExEKDMuNjI4NTExZS0wNSksIFFUQ0ZMTEQoLTMuNDYwMzYzZS0wMyksIFFUQ0ZMTEQoMS4wNjM0NTVlLTAxKSwgUVRDRkxMRCg4LjMwODA0MGUtMDEpLAotICBRVENGTExEKC0xLjI4MDY3NWUtMDgpLCBRVENGTExEKDIuMjQxNTQ2ZS0wNSksIFFUQ0ZMTEQoLTMuMDY0MzExZS0wMyksIFFUQ0ZMTEQoMS4wMjQ4MDVlLTAxKSwgUVRDRkxMRCg4LjE1NjUyM2UtMDEpLAotICBRVENGTExEKC02Ljk3NzA3OGUtMDgpLCBRVENGTExEKDEuNDk5MTcwZS0wNSksIFFUQ0ZMTEQoLTIuNjIxNTM3ZS0wMyksIFFUQ0ZMTEQoOS44MjYyNTFlLTAyKSwgUVRDRkxMRCg4LjAwNDE2NWUtMDEpLAotICBRVENGTExEKC0xLjQwOTkyN2UtMDgpLCBRVENGTExEKDUuMDA5OTEzZS0wNiksIFFUQ0ZMTEQoLTIuMTI0NjQ4ZS0wMyksIFFUQ0ZMTEQoOS4zNjg2NTJlLTAyKSwgUVRDRkxMRCg3Ljg1MTAxMmUtMDEpLAotICBRVENGTExEKC0yLjk4NjQ4OWUtMDkpLCBRVENGTExEKDEuMjc3MTg0ZS0wNiksIFFUQ0ZMTEQoLTEuNTk0ODYxZS0wMyksIFFUQ0ZMTEQoOC44NzU3NTZlLTAyKSwgUVRDRkxMRCg3LjY5NzA5M2UtMDEpLAotICBRVENGTExEKDEuODc2MDIyZS0wNyksIFFUQ0ZMTEQoMS41ODAxODllLTA1KSwgUVRDRkxMRCgtMS4wNjE0OTllLTAzKSwgUVRDRkxMRCg4LjM0NzE1MWUtMDIpLCBRVENGTExEKDcuNTQyMjk0ZS0wMSksCi0gIFFUQ0ZMTEQoMS43MzcyNzdlLTA3KSwgUVRDRkxMRCg1LjUzMzk1M2UtMDUpLCBRVENGTExEKC02LjE2OTg1NWUtMDQpLCBRVENGTExEKDcuNzgzMzAwZS0wMiksIFFUQ0ZMTEQoNy4zODY1MTVlLTAxKSwKLSAgUVRDRkxMRCgzLjgxODU4OWUtMDkpLCBRVENGTExEKDguODcwMTgyZS0wNSksIFFUQ0ZMTEQoLTIuMDA0ODIzZS0wNCksIFFUQ0ZMTEQoNy4xODQwNzRlLTAyKSwgUVRDRkxMRCg3LjIyOTU5OWUtMDEpLAotICBRVENGTExEKDUuMTQzNjE1ZS0wNyksIFFUQ0ZMTEQoMS4wMzU3ODNlLTA0KSwgUVRDRkxMRCgyLjA0ODQ5OWUtMDQpLCBRVENGTExEKDYuNTUwMjA5ZS0wMiksIFFUQ0ZMTEQoNy4wNzE0NDhlLTAxKSwKLSAgUVRDRkxMRCgyLjgyMDI5MmUtMDgpLCBRVENGTExEKDkuOTkwNzU4ZS0wNSksIFFUQ0ZMTEQoNS42MjE3MjFlLTA0KSwgUVRDRkxMRCg1Ljg4MTI5N2UtMDIpLCBRVENGTExEKDYuOTExOTgyZS0wMSksCi0gIFFUQ0ZMTEQoNC42NzcwMTZlLTA2KSwgUVRDRkxMRCgxLjE4MTA3OGUtMDQpLCBRVENGTExEKDkuMzczOTc1ZS0wNCksIFFUQ0ZMTEQoNS4xNzc5NjVlLTAyKSwgUVRDRkxMRCg2Ljc1MTE5OWUtMDEpLAotICBRVENGTExEKDMuMzYxNjgyZS0wNiksIFFUQ0ZMTEQoMi4xMjYzNjVlLTA1KSwgUVRDRkxMRCgxLjM0NDY1N2UtMDMpLCBRVENGTExEKDQuNDM5Njg0ZS0wMiksIFFUQ0ZMTEQoNi41ODkxNDllLTAxKSwKLSAgUVRDRkxMRCgtNC44ODA4NDVlLTA4KSwgUVRDRkxMRCg1Ljg2MTgwMGUtMDUpLCBRVENGTExEKDEuODEyMTc2ZS0wMyksIFFUQ0ZMTEQoMy42NjY5NDNlLTAyKSwgUVRDRkxMRCg2LjQyNTk0MGUtMDEpLAotICBRVENGTExEKDIuMjY3NzMxZS0wNyksIFFUQ0ZMTEQoNS4wMjE5MDZlLTA1KSwgUVRDRkxMRCgyLjE3Mjg2NmUtMDMpLCBRVENGTExEKDIuODU3NTI4ZS0wMiksIFFUQ0ZMTEQoNi4yNjE3MjVlLTAxKSwKLSAgUVRDRkxMRCg1LjE1ODIxM2UtMDkpLCBRVENGTExEKDQuMTUwMDc1ZS0wNSksIFFUQ0ZMTEQoMS45ODU4MjVlLTAzKSwgUVRDRkxMRCgyLjAxMjIzN2UtMDIpLCBRVENGTExEKDYuMDk2NjkwZS0wMSksCi0gIFFUQ0ZMTEQoLTIuMDY2OTYyZS0wNyksIFFUQ0ZMTEQoMy43OTk5NzJlLTA1KSwgUVRDRkxMRCgxLjY5NzY1M2UtMDMpLCBRVENGTExEKDEuMTMyMzI0ZS0wMiksIFFUQ0ZMTEQoNS45MzA5ODJlLTAxKSwKLSAgUVRDRkxMRCg0Ljg4MzMwNWUtMDcpLCBRVENGTExEKDYuNjA2NDYyZS0wNSksIFFUQ0ZMTEQoMS40NzExNjdlLTAzKSwgUVRDRkxMRCgyLjE4NDI1N2UtMDMpLCBRVENGTExEKDUuNzY0NzM1ZS0wMSksCi0gIFFUQ0ZMTEQoOC4yNTQ0MzBlLTA3KSwgUVRDRkxMRCg5Ljc1NTY4NWUtMDUpLCBRVENGTExEKDEuMjMyMTM0ZS0wMyksIFFUQ0ZMTEQoLTcuMjk4MTk4ZS0wMyksIFFUQ0ZMTEQoNS41OTgwNTJlLTAxKSwKLSAgUVRDRkxMRCg5LjQ2NDc4M2UtMDcpLCBRVENGTExEKDEuODMxMTIxZS0wNCksIFFUQ0ZMTEQoOC45OTAyNTZlLTA0KSwgUVRDRkxMRCgtMS43MTEzMjRlLTAyKSwgUVRDRkxMRCg1LjQzMDk5MGUtMDEpLAotICBRVENGTExEKC0xLjIzMjY5M2UtMDUpLCBRVENGTExEKC01LjkwMTYxOGUtMDcpLCBRVENGTExEKDYuMTUwMzE3ZS0wNCksIFFUQ0ZMTEQoLTIuNzI2NDg0ZS0wMiksIFFUQ0ZMTEQoNS4yNjM1NTRlLTAxKSwKLSAgUVRDRkxMRCgzLjg2NzQ4M2UtMDUpLCBRVENGTExEKC0zLjU5NTA1NGUtMDQpLCBRVENGTExEKDYuMzA3ODQxZS0wNCksIFFUQ0ZMTEQoLTMuNzc1OTI4ZS0wMiksIFFUQ0ZMTEQoNS4wOTU3MjFlLTAxKSwKLSAgUVRDRkxMRCgtOS44NzA1NDhlLTA3KSwgUVRDRkxMRCgtMS44MTU4MzdlLTA0KSwgUVRDRkxMRCg0LjM2NjQ0N2UtMDQpLCBRVENGTExEKC00Ljg1OTAwNmUtMDIpLCBRVENGTExEKDQuOTI3NDY0ZS0wMSksCi0gIFFUQ0ZMTEQoLTEuMDg5NTAxZS0wNiksIFFUQ0ZMTEQoLTkuMjA0ODc2ZS0wNSksIFFUQ0ZMTEQoMS40OTgyMzJlLTA0KSwgUVRDRkxMRCgtNS45NzM3NDJlLTAyKSwgUVRDRkxMRCg0Ljc1ODc1NGUtMDEpLAotICBRVENGTExEKC0xLjU2OTAwM2UtMDYpLCBRVENGTExEKC01LjE5MjQ0NGUtMDUpLCBRVENGTExEKC05LjA5OTcyM2UtMDUpLCBRVENGTExEKC03LjEyMDM1N2UtMDIpLCBRVENGTExEKDQuNTg5NTgzZS0wMSksCi0gIFFUQ0ZMTEQoLTIuNzc4NjE4ZS0wNyksIFFUQ0ZMTEQoNi40ODc4ODBlLTA1KSwgUVRDRkxMRCgtMy4zMzc5NjdlLTA0KSwgUVRDRkxMRCgtOC4yOTgxMDNlLTAyKSwgUVRDRkxMRCg0LjQyMDAxNGUtMDEpLAotICBRVENGTExEKDYuNzU3MDE1ZS0wOSksIFFUQ0ZMTEQoNS4zOTcwNjVlLTA1KSwgUVRDRkxMRCgtNS41OTkzNDhlLTA0KSwgUVRDRkxMRCgtOS41MDY5NjdlLTAyKSwgUVRDRkxMRCg0LjI1MDE0NGUtMDEpLAotICBRVENGTExEKDEuNDk2NDM2ZS0wNyksIFFUQ0ZMTEQoMi40NzIwMjRlLTA1KSwgUVRDRkxMRCgtNy42Nzc2MzRlLTA0KSwgUVRDRkxMRCgtMS4wNzQ2MzFlLTAxKSwgUVRDRkxMRCg0LjA4MDE1NWUtMDEpLAotICBRVENGTExEKDIuMDY4Mjk3ZS0wNSksIFFUQ0ZMTEQoOS43MTE2ODJlLTA1KSwgUVRDRkxMRCgtOS43MzA0NjBlLTA0KSwgUVRDRkxMRCgtMS4yMDE2MjllLTAxKSwgUVRDRkxMRCgzLjkxMDI0NGUtMDEpLAotICBRVENGTExEKC05LjM4ODk2M2UtMDYpLCBRVENGTExEKDUuMTQ0OTY5ZS0wNSksIFFUQ0ZMTEQoLTEuMTMxODYwZS0wMyksIFFUQ0ZMTEQoLTEuMzMxNTQ1ZS0wMSksIFFUQ0ZMTEQoMy43NDA2NDRlLTAxKSwKLSAgUVRDRkxMRCgtMS40MDI5MjVlLTA1KSwgUVRDRkxMRCgtMS4wMzkyNjRlLTA0KSwgUVRDRkxMRCgtMS4yODMyODFlLTAzKSwgUVRDRkxMRCgtMS40NjQzODllLTAxKSwgUVRDRkxMRCgzLjU3MTUyOGUtMDEpLAotICBRVENGTExEKC0yLjc1NzYxMWUtMDYpLCBRVENGTExEKDIuODUzNDM3ZS0wNiksIFFUQ0ZMTEQoLTEuNDgwNTQzZS0wMyksIFFUQ0ZMTEQoLTEuNjAwMDYyZS0wMSksIFFUQ0ZMTEQoMy40MDMwNzRlLTAxKSwKLSAgUVRDRkxMRCgyLjk0NTIzOWUtMDgpLCBRVENGTExEKDEuMzM0MDkxZS0wNSksIFFUQ0ZMTEQoLTEuNjk5MTYxZS0wMyksIFFUQ0ZMTEQoLTEuNzM4NTQyZS0wMSksIFFUQ0ZMTEQoMy4yMzUyOTllLTAxKSwKLSAgUVRDRkxMRCgtNy44NzMzMDRlLTA4KSwgUVRDRkxMRCgyLjQ0MzE2MWUtMDUpLCBRVENGTExEKC0xLjkyNDg0NWUtMDMpLCBRVENGTExEKC0xLjg3OTcxMmUtMDEpLCBRVENGTExEKDMuMDY4MTg3ZS0wMSksCi0gIFFUQ0ZMTEQoLTkuODk3MTk0ZS0wNyksIFFUQ0ZMTEQoMy41Njg1NTVlLTA1KSwgUVRDRkxMRCgtMi4xNTIzODBlLTAzKSwgUVRDRkxMRCgtMi4wMjM1NDhlLTAxKSwgUVRDRkxMRCgyLjkwMTQ5MWUtMDEpLAotICBRVENGTExEKC0xLjkyMjA3NGUtMDYpLCBRVENGTExEKDYuMTkzMzcwZS0wNSksIFFUQ0ZMTEQoLTIuMzk2NDA0ZS0wMyksIFFUQ0ZMTEQoLTIuMTY5OTI2ZS0wMSksIFFUQ0ZMTEQoMi43MzQ5NzdlLTAxKSwKLSAgUVRDRkxMRCgtMi43NjU2NTBlLTA3KSwgUVRDRkxMRCgxLjE3NjIzN2UtMDQpLCBRVENGTExEKC0yLjY1MzgxOWUtMDMpLCBRVENGTExEKC0yLjMxODgxNWUtMDEpLCBRVENGTExEKDIuNTY4MTc2ZS0wMSksCi0gIFFUQ0ZMTEQoLTQuNjM2MTA1ZS0wNyksIFFUQ0ZMTEQoMS42MzU5MDZlLTA0KSwgUVRDRkxMRCgtMi45MjcxNTllLTAzKSwgUVRDRkxMRCgtMi40NzAwOThlLTAxKSwgUVRDRkxMRCgyLjQwMDc2OGUtMDEpLAotICBRVENGTExEKC05LjYwNzA2OWUtMDcpLCBRVENGTExEKDIuMDYwMzk0ZS0wNCksIFFUQ0ZMTEQoLTMuMjA5MDkzZS0wMyksIFFUQ0ZMTEQoLTIuNjIzNzQ5ZS0wMSksIFFUQ0ZMTEQoMi4yMzIyNzdlLTAxKSwKLSAgUVRDRkxMRCgtMS45MDc5MjdlLTA2KSwgUVRDRkxMRCgyLjM0Njk4MWUtMDQpLCBRVENGTExEKC0zLjUwNTUzMWUtMDMpLCBRVENGTExEKC0yLjc3OTYzOGUtMDEpLCBRVENGTExEKDIuMDYyNjA1ZS0wMSksCi0gIFFUQ0ZMTEQoLTEuNTUxMjUxZS0wOCksIFFUQ0ZMTEQoMi41MjA2MDdlLTA0KSwgUVRDRkxMRCgtMy44MTE2MTJlLTAzKSwgUVRDRkxMRCgtMi45Mzc3MjVlLTAxKSwgUVRDRkxMRCgxLjg5MTU5MGUtMDEpLAotICBRVENGTExEKC0xLjY1MzQ2NGUtMDYpLCBRVENGTExEKDIuNTU2NDUwZS0wNCksIFFUQ0ZMTEQoLTQuMTMzNjQwZS0wMyksIFFUQ0ZMTEQoLTMuMDk3ODYyZS0wMSksIFFUQ0ZMTEQoMS43MTk3MjZlLTAxKSwKLSAgUVRDRkxMRCgtMi4wNDM0NjRlLTA2KSwgUVRDRkxMRCgzLjE1NzY2NGUtMDQpLCBRVENGTExEKC00LjQ0ODk5M2UtMDMpLCBRVENGTExEKC0zLjI1OTk5NGUtMDEpLCBRVENGTExEKDEuNTQ3NDYxZS0wMSksCi0gIFFUQ0ZMTEQoMS42MjI3ODZlLTA1KSwgUVRDRkxMRCg2LjIwNTY3NmUtMDQpLCBRVENGTExEKC00Ljc1NDE5MmUtMDMpLCBRVENGTExEKC0zLjQyMzk0MmUtMDEpLCBRVENGTExEKDEuMzc2MTUwZS0wMSksCi0gIFFUQ0ZMTEQoMS4zOTUyMjFlLTA1KSwgUVRDRkxMRCg3Ljg0Nzg0MGUtMDQpLCBRVENGTExEKC01LjA2Mzg1MWUtMDMpLCBRVENGTExEKC0zLjU4OTYyN2UtMDEpLCBRVENGTExEKDEuMjA2OTI0ZS0wMSksCi0gIFFUQ0ZMTEQoNC41OTEwMTBlLTA3KSwgUVRDRkxMRCg5LjAxOTEyOWUtMDQpLCBRVENGTExEKC01LjM5NDU3MGUtMDMpLCBRVENGTExEKC0zLjc1NjgyMmUtMDEpLCBRVENGTExEKDEuMDQyMDMzZS0wMSksCi0gIFFUQ0ZMTEQoLTYuMjYxOTQ0ZS0wNiksIFFUQ0ZMTEQoMS4wNTQ5NjNlLTAzKSwgUVRDRkxMRCgtNS43NDExMDNlLTAzKSwgUVRDRkxMRCgtMy45MjU0MDllLTAxKSwgUVRDRkxMRCg4LjgyOTc0NWUtMDIpLAotICBRVENGTExEKC0xLjYwNjA1MWUtMDUpLCBRVENGTExEKDEuMDg5NDI5ZS0wMyksIFFUQ0ZMTEQoLTYuMTA5MTc5ZS0wMyksIFFUQ0ZMTEQoLTQuMDk1MTYwZS0wMSksIFFUQ0ZMTEQoNy4zMjU5NzllLTAyKSwKLSAgUVRDRkxMRCgtMi40NjQyMjhlLTA1KSwgUVRDRkxMRCgxLjEyMjUwM2UtMDMpLCBRVENGTExEKC02LjUwMDUwM2UtMDMpLCBRVENGTExEKC00LjI2NTk1MGUtMDEpLCBRVENGTExEKDUuOTE4Njc4ZS0wMiksCi0gIFFUQ0ZMTEQoLTIuOTc2ODI0ZS0wNSksIFFUQ0ZMTEQoMS4xNzc1MTVlLTAzKSwgUVRDRkxMRCgtNi45MjUxNDFlLTAzKSwgUVRDRkxMRCgtNC40Mzc1MzBlLTAxKSwgUVRDRkxMRCg0LjYzNDY5NmUtMDIpLAotICBRVENGTExEKC0zLjE3NzQ2OGUtMDUpLCBRVENGTExEKDEuMjI2MTEzZS0wMyksIFFUQ0ZMTEQoLTcuMzgwNTQ0ZS0wMyksIFFUQ0ZMTEQoLTQuNjA5ODI5ZS0wMSksIFFUQ0ZMTEQoMy40NTA3MTllLTAyKSwKLSAgUVRDRkxMRCgtNC4zNzMzMDJlLTA1KSwgUVRDRkxMRCgxLjI2MzU2OWUtMDMpLCBRVENGTExEKC03Ljg3NjM5M2UtMDMpLCBRVENGTExEKC00Ljc4MjY1MGUtMDEpLCBRVENGTExEKDIuMzUzMDYwZS0wMiksCi0gIFFUQ0ZMTEQoLTMuMjk5MDA0ZS0wNSksIFFUQ0ZMTEQoMS4yODc4MTllLTAzKSwgUVRDRkxMRCgtOC40MDc3NDllLTAzKSwgUVRDRkxMRCgtNC45NTYxNzVlLTAxKSwgUVRDRkxMRCgxLjEyOTU4MGUtMDIpLAorY29uc3QgRklYUF9QRlQgcW1mX2NsZGZiXzY0MFtRTUY2NDBfQ0xERkJfUEZUX1RBQkxFX1NJWkVdID0geworICAgIFFUQ0ZMTEQoNi41NzE3NjBlLTA3KSwgIFFUQ0ZMTEQoLTguMDEwMDc5ZS0wNiksIFFUQ0ZMTEQoLTEuMjUwNzQzZS0wMyksCisgICAgUVRDRkxMRCg4Ljk5NjM3MWUtMDMpLCAgUVRDRkxMRCg1LjEyODU1N2UtMDEpLCAgUVRDRkxMRCg0LjExODM2MGUtMDcpLAorICAgIFFUQ0ZMTEQoLTEuNDY5OTMzZS0wNSksIFFUQ0ZMTEQoLTEuMTk0NzQzZS0wMyksIFFUQ0ZMTEQoOS42NDAyOTllLTAzKSwKKyAgICBRVENGTExEKDUuMjk5NTEwZS0wMSksICBRVENGTExEKDguMTA5OTUyZS0wNyksICBRVENGTExEKDQuODQwNTc4ZS0wNiksCisgICAgUVRDRkxMRCgtMS4xNTE3OTZlLTAzKSwgUVRDRkxMRCgxLjAzMzEyNmUtMDIpLCAgUVRDRkxMRCg1LjQ3MDY1MmUtMDEpLAorICAgIFFUQ0ZMTEQoNy4wOTk2MzNlLTA3KSwgIFFUQ0ZMTEQoNy4xNjcxMDFlLTA2KSwgIFFUQ0ZMTEQoLTEuMDk5MDAxZS0wMyksCisgICAgUVRDRkxMRCgxLjEwNjk1OWUtMDIpLCAgUVRDRkxMRCg1LjY0MTUyM2UtMDEpLCAgUVRDRkxMRCg2LjgzNDIxMGUtMDcpLAorICAgIFFUQ0ZMTEQoMS4wODgzMjVlLTA1KSwgIFFUQ0ZMTEQoLTEuMDQ3NjU1ZS0wMyksIFFUQ0ZMTEQoMS4xODYyMTFlLTAyKSwKKyAgICBRVENGTExEKDUuODExOTkzZS0wMSksICBRVENGTExEKDQuMjkyODYyZS0wNyksICBRVENGTExEKDEuMDEzMjYwZS0wNSksCisgICAgUVRDRkxMRCgtOS44NjIwMjdlLTA0KSwgUVRDRkxMRCgxLjI3MDc0N2UtMDIpLCAgUVRDRkxMRCg1Ljk4MTg3N2UtMDEpLAorICAgIFFUQ0ZMTEQoLTUuNDI2NTk3ZS0wOSksIFFUQ0ZMTEQoNS44Njk3MDdlLTA2KSwgIFFUQ0ZMTEQoLTkuMjk0NjY1ZS0wNCksCisgICAgUVRDRkxMRCgxLjM2MTA3MmUtMDIpLCAgUVRDRkxMRCg2LjE1MTAzMWUtMDEpLCAgUVRDRkxMRCg2LjM1NTMwM2UtMDgpLAorICAgIFFUQ0ZMTEQoMS4xMjUxMzVlLTA1KSwgIFFUQ0ZMTEQoLTkuNzY3NzA5ZS0wNCksIFFUQ0ZMTEQoMS40NTYyMDllLTAyKSwKKyAgICBRVENGTExEKDYuMzE5Mjg0ZS0wMSksICBRVENGTExEKDUuNDkwNTcwZS0wNyksICBRVENGTExEKDIuMDE1NDQ1ZS0wNSksCisgICAgUVRDRkxMRCgtMS4wNDA1OThlLTAzKSwgUVRDRkxMRCgxLjU1Nzc1OWUtMDIpLCAgUVRDRkxMRCg2LjQ4NjQzOGUtMDEpLAorICAgIFFUQ0ZMTEQoMS42MjAxNzFlLTA2KSwgIFFUQ0ZMTEQoMi44MDA0NTZlLTA1KSwgIFFUQ0ZMTEQoLTEuMTQ2MjY4ZS0wMyksCisgICAgUVRDRkxMRCgxLjY2NTE4OGUtMDIpLCAgUVRDRkxMRCg2LjY1MjMwNGUtMDEpLCAgUVRDRkxMRCgtNi4wMjUxMTBlLTEwKSwKKyAgICBRVENGTExEKDguOTc1OTc4ZS0wNiksICBRVENGTExEKC0xLjI5Mjg2NmUtMDMpLCBRVENGTExEKDEuNzc4MjQ5ZS0wMiksCisgICAgUVRDRkxMRCg2LjgxNjY2OGUtMDEpLCAgUVRDRkxMRCgtNi4zMjU2NjRlLTEwKSwgUVRDRkxMRCg4LjU2MzgyMGUtMDYpLAorICAgIFFUQ0ZMTEQoLTEuMTk2NjM4ZS0wMyksIFFUQ0ZMTEQoMS44OTc1MDZlLTAyKSwgIFFUQ0ZMTEQoNi45NzkzMzdlLTAxKSwKKyAgICBRVENGTExEKC00LjAxMzUyNWUtMDkpLCBRVENGTExEKDEuMTY4ODk1ZS0wNSksICBRVENGTExEKC05LjcyNjY5OWUtMDQpLAorICAgIFFUQ0ZMTEQoMi4wMjM1MjVlLTAyKSwgIFFUQ0ZMTEQoNy4xNDAwODdlLTAxKSwgIFFUQ0ZMTEQoLTQuMjQ0MDkxZS0wOSksCisgICAgUVRDRkxMRCg3LjMwMDU4OWUtMDYpLCAgUVRDRkxMRCgtOC4wMjk2MjBlLTA0KSwgUVRDRkxMRCgyLjE1NjMwNWUtMDIpLAorICAgIFFUQ0ZMTEQoNy4yOTg3NDZlLTAxKSwgIFFUQ0ZMTEQoLTEuODQ2NTQ4ZS0wOCksIFFUQ0ZMTEQoMy45NjUzNjRlLTA2KSwKKyAgICBRVENGTExEKC02Ljc1NDkzNmUtMDQpLCBRVENGTExEKDIuMjk2NDcxZS0wMiksICBRVENGTExEKDcuNDU1MTEyZS0wMSksCisgICAgUVRDRkxMRCgtMy44NzA1MzdlLTA5KSwgUVRDRkxMRCgxLjM3NDg5NmUtMDYpLCAgUVRDRkxMRCgtNS43OTExNDVlLTA0KSwKKyAgICBRVENGTExEKDIuNDQzNDM0ZS0wMiksICBRVENGTExEKDcuNjA5MDUxZS0wMSksICBRVENGTExEKC04Ljg4MzQ5OWUtMTApLAorICAgIFFUQ0ZMTEQoMy43OTg1MjBlLTA3KSwgIFFUQ0ZMTEQoLTQuNzMzMTQ4ZS0wNCksIFFUQ0ZMTEQoMi41OTc5NTdlLTAyKSwKKyAgICBRVENGTExEKDcuNzYwMzg2ZS0wMSksICBRVENGTExEKDUuMzAzNTI4ZS0wOCksICBRVENGTExEKDQuNDY5NzI5ZS0wNiksCisgICAgUVRDRkxMRCgtMi45OTg3NDBlLTA0KSwgUVRDRkxMRCgyLjc2MDA5MWUtMDIpLCAgUVRDRkxMRCg3LjkwODk5NWUtMDEpLAorICAgIFFUQ0ZMTEQoNy4zOTE5NzRlLTA4KSwgIFFUQ0ZMTEQoMi40NjE4NzdlLTA1KSwgIFFUQ0ZMTEQoNy44ODI2MjBlLTA1KSwKKyAgICBRVENGTExEKDIuOTMxNTI2ZS0wMiksICBRVENGTExEKDguMDU0NzAxZS0wMSksICBRVENGTExEKDEuNzIzMjE3ZS0wOSksCisgICAgUVRDRkxMRCg0LjAwNTI2OWUtMDUpLCAgUVRDRkxMRCg0LjcwODAxMGUtMDQpLCAgUVRDRkxMRCgzLjExMDg2MWUtMDIpLAorICAgIFFUQ0ZMTEQoOC4xOTczODdlLTAxKSwgIFFUQ0ZMTEQoMi40NDMwODVlLTA3KSwgIFFUQ0ZMTEQoNS4yNzI5ODJlLTA1KSwKKyAgICBRVENGTExEKDguMDg5ODEyZS0wNCksICBRVENGTExEKDMuMjk4MTUxZS0wMiksICBRVENGTExEKDguMzM2ODY0ZS0wMSksCisgICAgUVRDRkxMRCgxLjM4NzU2N2UtMDgpLCAgUVRDRkxMRCg0LjkzOTM5MmUtMDUpLCAgUVRDRkxMRCgxLjEyNzE0MmUtMDMpLAorICAgIFFUQ0ZMTEQoMy40OTMzMDBlLTAyKSwgIFFUQ0ZMTEQoOC40NzI5ODdlLTAxKSwgIFFUQ0ZMTEQoLTUuNjkwNTMxZS0wNiksCisgICAgUVRDRkxMRCgtNC4yNTY0NDJlLTA1KSwgUVRDRkxMRCgxLjQxNzM2N2UtMDMpLCAgUVRDRkxMRCgzLjY5NjM0M2UtMDIpLAorICAgIFFUQ0ZMTEQoOC42MDU1NDNlLTAxKSwgIFFUQ0ZMTEQoMy42MjkwNjdlLTA2KSwgIFFUQ0ZMTEQoNi41ODIzMjhlLTA1KSwKKyAgICBRVENGTExEKDEuNzI1MDMwZS0wMyksICBRVENGTExEKDMuOTA3MTM4ZS0wMiksICBRVENGTExEKDguNzM0MzY3ZS0wMSksCisgICAgUVRDRkxMRCgtNS4zOTM1NTZlLTA4KSwgUVRDRkxMRCg2LjQ4MTkyMWUtMDUpLCAgUVRDRkxMRCgxLjk0ODA2OWUtMDMpLAorICAgIFFUQ0ZMTEQoNC4xMjU1NzBlLTAyKSwgIFFUQ0ZMTEQoOC44NTkyMzJlLTAxKSwgIFFUQ0ZMTEQoMS4zNDk5NDRlLTA3KSwKKyAgICBRVENGTExEKDMuMzY3OTk4ZS0wNSksICBRVENGTExEKDIuMDMzNDY1ZS0wMyksICBRVENGTExEKDQuMzU1NTY4ZS0wMiksCisgICAgUVRDRkxMRCg4Ljk3OTk1OWUtMDEpLCAgUVRDRkxMRCg3LjMyNjYxMWUtMDkpLCAgUVRDRkxMRCg0LjY5NDI1MmUtMDUpLAorICAgIFFUQ0ZMTEQoMi4yMzkxNDNlLTAzKSwgIFFUQ0ZMTEQoNC41OTkwNjhlLTAyKSwgIFFUQ0ZMTEQoOS4wOTYzMTFlLTAxKSwKKyAgICBRVENGTExEKDIuMzk5Njk2ZS0wNyksICBRVENGTExEKDYuOTA0NDE1ZS0wNSksICBRVENGTExEKDIuNDcwNDU2ZS0wMyksCisgICAgUVRDRkxMRCg0Ljg0OTI4NWUtMDIpLCAgUVRDRkxMRCg5LjIwODE5NWUtMDEpLCAgUVRDRkxMRCgzLjMzMDk4MmUtMDcpLAorICAgIFFUQ0ZMTEQoNS42NDMxMDNlLTA1KSwgIFFUQ0ZMTEQoMi42MzA0NzJlLTAzKSwgIFFUQ0ZMTEQoNS4xMDU2MjFlLTAyKSwKKyAgICBRVENGTExEKDkuMzE1NDQyZS0wMSksICBRVENGTExEKDQuNzY3Nzk0ZS0wNyksICBRVENGTExEKDcuMDk1ODg3ZS0wNSksCisgICAgUVRDRkxMRCgyLjcwMzAxOWUtMDMpLCAgUVRDRkxMRCg1LjM2ODMxM2UtMDIpLCAgUVRDRkxMRCg5LjQxNzk3NmUtMDEpLAorICAgIFFUQ0ZMTEQoMy40Mjg2NjFlLTA3KSwgIFFUQ0ZMTEQoNy44NzI1OTNlLTA1KSwgIFFUQ0ZMTEQoMi43MjkxMzdlLTAzKSwKKyAgICBRVENGTExEKDUuNjM3MjE5ZS0wMiksICBRVENGTExEKDkuNTE1Njc1ZS0wMSksICBRVENGTExEKDguNjc2ODQ4ZS0wNiksCisgICAgUVRDRkxMRCgyLjY2NjQ0NWUtMDQpLCAgUVRDRkxMRCgyLjcxOTc0OWUtMDMpLCAgUVRDRkxMRCg1LjkxMTM2M2UtMDIpLAorICAgIFFUQ0ZMTEQoOS42MDg1MjBlLTAxKSwgIFFUQ0ZMTEQoMi43MjIyOTZlLTA1KSwgIFFUQ0ZMTEQoNS44MjIyMDFlLTA0KSwKKyAgICBRVENGTExEKDIuNTMwOTA3ZS0wMyksICBRVENGTExEKDYuMTkyNjkzZS0wMiksICBRVENGTExEKDkuNjk2NDI2ZS0wMSksCisgICAgUVRDRkxMRCgzLjU3NTY1MWUtMDcpLCAgUVRDRkxMRCg3Ljg3MDM1NWUtMDUpLCAgUVRDRkxMRCgyLjIyNTUyNGUtMDMpLAorICAgIFFUQ0ZMTEQoNi40ODA0NDllLTAyKSwgIFFUQ0ZMTEQoOS43Nzk0MDVlLTAxKSwgIFFUQ0ZMTEQoNi4yOTMwMDJlLTA3KSwKKyAgICBRVENGTExEKDcuMjQ1MDk2ZS0wNSksICBRVENGTExEKDEuODkxOTcyZS0wMyksICBRVENGTExEKDYuNzcxNjc1ZS0wMiksCisgICAgUVRDRkxMRCg5Ljg1NzM4OGUtMDEpLCAgUVRDRkxMRCgxLjA3MDI0M2UtMDYpLCAgUVRDRkxMRCg3LjE5NDE1MWUtMDUpLAorICAgIFFUQ0ZMTEQoMS41NTcxMTJlLTAzKSwgIFFUQ0ZMTEQoNy4wNjQ5NDhlLTAyKSwgIFFUQ0ZMTEQoOS45MzAzODBlLTAxKSwKKyAgICBRVENGTExEKC0zLjIyNTkxM2UtMDcpLCBRVENGTExEKC03LjY3OTk1NWUtMDUpLCBRVENGTExEKDEuMTk0NzMxZS0wMyksCisgICAgUVRDRkxMRCg3LjM2MDU1OWUtMDIpLCAgUVRDRkxMRCg5Ljk5ODI4NmUtMDEpLCAgUVRDRkxMRCgtOS41OTc1MTZlLTA5KSwKKyAgICBRVENGTExEKC02LjA5MzM3M2UtMDUpLCBRVENGTExEKDYuNDE1NDAyZS0wNCksICBRVENGTExEKDcuNjU3NjUwZS0wMiksCisgICAgUVRDRkxMRCgxLjAwNjEwOWUrMDApLCAgUVRDRkxMRCgtOC45MDgwNDFlLTA4KSwgUVRDRkxMRCgtMS43MjEzNDdlLTA1KSwKKyAgICBRVENGTExEKDEuMDkyNTI2ZS0wNCksICBRVENGTExEKDcuOTU1NTcxZS0wMiksICBRVENGTExEKDEuMDExODY4ZSswMCksCisgICAgUVRDRkxMRCgtMi4yODU1NjNlLTA1KSwgUVRDRkxMRCgtOC44ODIzMDVlLTA1KSwgUVRDRkxMRCgyLjkzNDg3NmUtMDQpLAorICAgIFFUQ0ZMTEQoOC4yNTE5NjJlLTAyKSwgIFFUQ0ZMTEQoMS4wMTcxMDBlKzAwKSwgIFFUQ0ZMTEQoMS4wMTM1NzVlLTA1KSwKKyAgICBRVENGTExEKDYuNDE4NjU4ZS0wNSksICBRVENGTExEKDUuNzIxMjIzZS0wNCksICBRVENGTExEKDguNTQ3NzE2ZS0wMiksCisgICAgUVRDRkxMRCgxLjAyMTc5OWUrMDApLCAgUVRDRkxMRCgtMS43MDY5NDFlLTA1KSwgUVRDRkxMRCgxLjc2OTI2MmUtMDQpLAorICAgIFFUQ0ZMTEQoNi45NzY1NjFlLTA0KSwgIFFUQ0ZMTEQoOC44NDE4MTNlLTAyKSwgIFFUQ0ZMTEQoMS4wMjU5NjdlKzAwKSwKKyAgICBRVENGTExEKDEuMzU2NzI4ZS0wNiksICBRVENGTExEKDIuMjA2MzQxZS0wNSksICBRVENGTExEKDcuMzc2MTAxZS0wNCksCisgICAgUVRDRkxMRCg5LjEzMzU5MWUtMDIpLCAgUVRDRkxMRCgxLjAyOTYwMWUrMDApLCAgUVRDRkxMRCgtMS4zOTg5MTNlLTA4KSwKKyAgICBRVENGTExEKC02LjUzODg3OWUtMDYpLCBRVENGTExEKDcuMTU0MTI0ZS0wNCksICBRVENGTExEKDkuNDIxNjI0ZS0wMiksCisgICAgUVRDRkxMRCgxLjAzMjcxM2UrMDApLCAgUVRDRkxMRCgzLjU1Mjk5MmUtMDgpLCAgUVRDRkxMRCgtMS4wNTI3MDdlLTA1KSwKKyAgICBRVENGTExEKDcuMTM5OTIwZS0wNCksICBRVENGTExEKDkuNzA1MjQwZS0wMiksICBRVENGTExEKDEuMDM1MzEyZSswMCksCisgICAgUVRDRkxMRCg0LjIxMTE3N2UtMDcpLCAgUVRDRkxMRCgtOS4wNzU0MzFlLTA2KSwgUVRDRkxMRCg2Ljk0NDEyM2UtMDQpLAorICAgIFFUQ0ZMTEQoOS45ODI5NThlLTAyKSwgIFFUQ0ZMTEQoMS4wMzc0MjJlKzAwKSwgIFFUQ0ZMTEQoNS40MzM3MTllLTA3KSwKKyAgICBRVENGTExEKC0xLjc0ODI4NWUtMDUpLCBRVENGTExEKDYuNzY2MzIwZS0wNCksICBRVENGTExEKDEuMDI1Mzk4ZS0wMSksCisgICAgUVRDRkxMRCgxLjAzOTA2MmUrMDApLCAgUVRDRkxMRCg4LjIyNjYwMGUtMDgpLCAgUVRDRkxMRCgtMy40OTgyODZlLTA1KSwKKyAgICBRVENGTExEKDYuODg3Nzg0ZS0wNCksICBRVENGTExEKDEuMDUxNjQyZS0wMSksICBRVENGTExEKDEuMDQwMjYyZSswMCksCisgICAgUVRDRkxMRCgxLjI3MjcwNWUtMDcpLCAgUVRDRkxMRCgtNC40ODk0OTFlLTA1KSwgUVRDRkxMRCg2LjY3MzI1MGUtMDQpLAorICAgIFFUQ0ZMTEQoMS4wNzY5NzJlLTAxKSwgIFFUQ0ZMTEQoMS4wNDEwNDNlKzAwKSwgIFFUQ0ZMTEQoMi41NDI1OThlLTA3KSwKKyAgICBRVENGTExEKC01LjQ0OTgxNmUtMDUpLCBRVENGTExEKDUuOTcwNjk3ZS0wNCksICBRVENGTExEKDEuMTAxMjE2ZS0wMSksCisgICAgUVRDRkxMRCgxLjA0MTQzNGUrMDApLCAgUVRDRkxMRCg2LjMyMjc3MGUtMDcpLCAgUVRDRkxMRCgtNS44NzQxOTllLTA1KSwKKyAgICBRVENGTExEKDQuNzQ5OTMxZS0wNCksICBRVENGTExEKDEuMTI0Mjk2ZS0wMSksICBRVENGTExEKDEuMDQxNDQzZSswMCksCisgICAgUVRDRkxMRCgyLjgwMTg4MmUtMDgpLCAgUVRDRkxMRCgtNy45MzQ1MTBlLTA1KSwgUVRDRkxMRCgzLjE4OTMzNmUtMDQpLAorICAgIFFUQ0ZMTEQoMS4xNDYwNDJlLTAxKSwgIFFUQ0ZMTEQoMS4wNDEwODdlKzAwKSwgIFFUQ0ZMTEQoNS44OTE5MDRlLTA3KSwKKyAgICBRVENGTExEKC04LjAzOTIzMmUtMDUpLCBRVENGTExEKDEuMjE4MjI2ZS0wNCksICBRVENGTExEKDEuMTY2Mzk5ZS0wMSksCisgICAgUVRDRkxMRCgxLjA0MDM1MGUrMDApLCAgUVRDRkxMRCg3LjMwMTk1N2UtMDcpLCAgUVRDRkxMRCgtOS45MDc2MzFlLTA1KSwKKyAgICBRVENGTExEKC0xLjMyNDI5MmUtMDQpLCBRVENGTExEKDEuMTg1MjQzZS0wMSksICBRVENGTExEKDEuMDM5MjI4ZSswMCksCisgICAgUVRDRkxMRCgtNC41MTg2MDNlLTA2KSwgUVRDRkxMRCgtMi4yMTcwMjVlLTA0KSwgUVRDRkxMRCgtNC4yNjg1NzVlLTA0KSwKKyAgICBRVENGTExEKDEuMjAyNTQ2ZS0wMSksICBRVENGTExEKDEuMDM3NjgzZSswMCksICBRVENGTExEKC0zLjU2MTU4NWUtMDYpLAorICAgIFFUQ0ZMTEQoLTIuNDE1MTY2ZS0wNCksIFFUQ0ZMTEQoLTcuODA0NTQ2ZS0wNCksIFFUQ0ZMTEQoMS4yMTgxODRlLTAxKSwKKyAgICBRVENGTExEKDEuMDM1Njk0ZSswMCksICBRVENGTExEKC0xLjA3NDcxN2UtMDcpLCBRVENGTExEKC0yLjEyMzY3MmUtMDQpLAorICAgIFFUQ0ZMTEQoLTEuMTU2NjgwZS0wMyksIFFUQ0ZMTEQoMS4yMzIxMzJlLTAxKSwgIFFUQ0ZMTEQoMS4wMzMyMDZlKzAwKSwKKyAgICBRVENGTExEKDEuMzIzMjY4ZS0wNiksICBRVENGTExEKC0yLjA3ODI5OWUtMDQpLCBRVENGTExEKC0xLjUyNTgxOWUtMDMpLAorICAgIFFUQ0ZMTEQoMS4yNDQyNzBlLTAxKSwgIFFUQ0ZMTEQoMS4wMzAxOTllKzAwKSwgIFFUQ0ZMTEQoMy4zNzc4MTVlLTA2KSwKKyAgICBRVENGTExEKC0xLjg4NTI4NmUtMDQpLCBRVENGTExEKC0xLjkxNDExNWUtMDMpLCBRVENGTExEKDEuMjU0NjA1ZS0wMSksCisgICAgUVRDRkxMRCgxLjAyNjYxNmUrMDApLCAgUVRDRkxMRCg1LjE2MTYwN2UtMDYpLCAgUVRDRkxMRCgtMS43Mjg2NzNlLTA0KSwKKyAgICBRVENGTExEKC0yLjI5MjgxNGUtMDMpLCBRVENGTExEKDEuMjYyOTk2ZS0wMSksICBRVENGTExEKDEuMDIyNDcwZSswMCksCisgICAgUVRDRkxMRCg1LjkyNDAwMWUtMDYpLCAgUVRDRkxMRCgtMS43NDQ4NDJlLTA0KSwgUVRDRkxMRCgtMi42NTgwNDJlLTAzKSwKKyAgICBRVENGTExEKDEuMjY5NDE2ZS0wMSksICBRVENGTExEKDEuMDE3NzI5ZSswMCksICBRVENGTExEKDYuMzEwMjA4ZS0wNiksCisgICAgUVRDRkxMRCgtMS43ODQxOTNlLTA0KSwgUVRDRkxMRCgtMy4wMDA0MjNlLTAzKSwgUVRDRkxMRCgxLjI3MzY0OGUtMDEpLAorICAgIFFUQ0ZMTEQoMS4wMTI1MDhlKzAwKSwgIFFUQ0ZMTEQoMy4zNTcyMTllLTA2KSwgIFFUQ0ZMTEQoLTIuMTMxNDA2ZS0wNCksCisgICAgUVRDRkxMRCgtMy4zMTg4NThlLTAzKSwgUVRDRkxMRCgxLjI3NTU2MWUtMDEpLCAgUVRDRkxMRCgxLjAwNjg5M2UrMDApLAorICAgIFFUQ0ZMTEQoNS4xODkwODdlLTA2KSwgIFFUQ0ZMTEQoLTIuMDc4ODg2ZS0wNCksIFFUQ0ZMTEQoLTMuNTk3NDc2ZS0wMyksCisgICAgUVRDRkxMRCgxLjI3NDU2OGUtMDEpLCAgUVRDRkxMRCgxLjAwMTQ2M2UrMDApLCAgUVRDRkxMRCg0LjE3ODA1MGUtMDYpLAorICAgIFFUQ0ZMTEQoLTQuNjYzNzc4ZS0wNSksIFFUQ0ZMTEQoLTMuODcwODUyZS0wMyksIFFUQ0ZMTEQoMS4yNzM1OTFlLTAxKSwKKyAgICBRVENGTExEKDkuOTI3NTQ0ZS0wMSksICBRVENGTExEKDUuMzY0ODA3ZS0wNiksICBRVENGTExEKC01Ljg4OTI3N2UtMDYpLAorICAgIFFUQ0ZMTEQoLTQuMTM1MTMwZS0wMyksIFFUQ0ZMTEQoMS4yNzI0OTllLTAxKSwgIFFUQ0ZMTEQoOS44MDc2OTJlLTAxKSwKKyAgICBRVENGTExEKDQuMDgzNzE5ZS0wNiksICBRVENGTExEKC0xLjc3NDEwOGUtMDUpLCBRVENGTExEKC00LjM1MTY2OGUtMDMpLAorICAgIFFUQ0ZMTEQoMS4yNjgyODFlLTAxKSwgIFFUQ0ZMTEQoOS42OTAwMTdlLTAxKSwgIFFUQ0ZMTEQoMy41Njc1ODFlLTA2KSwKKyAgICBRVENGTExEKC0yLjU5OTQ2OGUtMDgpLCBRVENGTExEKC00LjUxNzE5MGUtMDMpLCBRVENGTExEKDEuMjYxMjYyZS0wMSksCisgICAgUVRDRkxMRCg5LjU2ODg4NmUtMDEpLCAgUVRDRkxMRCgzLjI2Mjc1NGUtMDYpLCAgUVRDRkxMRCgxLjI2MDY0MGUtMDUpLAorICAgIFFUQ0ZMTEQoLTQuNjM2MjI4ZS0wMyksIFFUQ0ZMTEQoMS4yNTE0NzdlLTAxKSwgIFFUQ0ZMTEQoOS40NDM4MDNlLTAxKSwKKyAgICBRVENGTExEKDIuMDQxMTI4ZS0wNiksICBRVENGTExEKDIuMzY0NTE5ZS0wNSksICBRVENGTExEKC00LjcwNDMyMWUtMDMpLAorICAgIFFUQ0ZMTEQoMS4yMzg4NjllLTAxKSwgIFFUQ0ZMTEQoOS4zMTM4NzRlLTAxKSwgIFFUQ0ZMTEQoLTIuNTY3OTY1ZS0wOCksCisgICAgUVRDRkxMRCgyLjgwNjk2M2UtMDUpLCAgUVRDRkxMRCgtNC43MjI1NjhlLTAzKSwgUVRDRkxMRCgxLjIyMzM3MWUtMDEpLAorICAgIFFUQ0ZMTEQoOS4xNzk2NjZlLTAxKSwgIFFUQ0ZMTEQoMi43MTQ4NzllLTA3KSwgIFFUQ0ZMTEQoNC40OTM5MTZlLTA1KSwKKyAgICBRVENGTExEKC00LjY2MzI3NmUtMDMpLCBRVENGTExEKDEuMjA0ODU0ZS0wMSksICBRVENGTExEKDkuMDQxMjg2ZS0wMSksCisgICAgUVRDRkxMRCgyLjE1MDg4NGUtMDYpLCAgUVRDRkxMRCg1LjQwODE1NWUtMDUpLCAgUVRDRkxMRCgtNC41NTQ4MTFlLTAzKSwKKyAgICBRVENGTExEKDEuMTgzMjMzZS0wMSksICBRVENGTExEKDguODk5NDc0ZS0wMSksICBRVENGTExEKDUuODE4NTk1ZS0wNiksCisgICAgUVRDRkxMRCgzLjc1OTYzMGUtMDUpLCAgUVRDRkxMRCgtNC4zNjk1NTRlLTAzKSwgUVRDRkxMRCgxLjE1ODM1OWUtMDEpLAorICAgIFFUQ0ZMTEQoOC43NTQ2NDFlLTAxKSwgIFFUQ0ZMTEQoLTEuNjg2MTM3ZS0wOSksIFFUQ0ZMTEQoMi41MTUxMThlLTA1KSwKKyAgICBRVENGTExEKC00LjA5MTAzM2UtMDMpLCBRVENGTExEKDEuMTMwMTgwZS0wMSksICBRVENGTExEKDguNjA3NDkyZS0wMSksCisgICAgUVRDRkxMRCgtMS43NzUxOTFlLTA5KSwgUVRDRkxMRCgyLjQwNjUxN2UtMDUpLCAgUVRDRkxMRCgtMy43OTQ0MjVlLTAzKSwKKyAgICBRVENGTExEKDEuMDk4NTUxZS0wMSksICBRVENGTExEKDguNDU4NDUwZS0wMSksICBRVENGTExEKC0yLjIyMjA3MmUtMDkpLAorICAgIFFUQ0ZMTEQoMy42Mjg1MTFlLTA1KSwgIFFUQ0ZMTEQoLTMuNDYwMzYzZS0wMyksIFFUQ0ZMTEQoMS4wNjM0NTVlLTAxKSwKKyAgICBRVENGTExEKDguMzA4MDQwZS0wMSksICBRVENGTExEKC0xLjI4MDY3NWUtMDgpLCBRVENGTExEKDIuMjQxNTQ2ZS0wNSksCisgICAgUVRDRkxMRCgtMy4wNjQzMTFlLTAzKSwgUVRDRkxMRCgxLjAyNDgwNWUtMDEpLCAgUVRDRkxMRCg4LjE1NjUyM2UtMDEpLAorICAgIFFUQ0ZMTEQoLTYuOTc3MDc4ZS0wOCksIFFUQ0ZMTEQoMS40OTkxNzBlLTA1KSwgIFFUQ0ZMTEQoLTIuNjIxNTM3ZS0wMyksCisgICAgUVRDRkxMRCg5LjgyNjI1MWUtMDIpLCAgUVRDRkxMRCg4LjAwNDE2NWUtMDEpLCAgUVRDRkxMRCgtMS40MDk5MjdlLTA4KSwKKyAgICBRVENGTExEKDUuMDA5OTEzZS0wNiksICBRVENGTExEKC0yLjEyNDY0OGUtMDMpLCBRVENGTExEKDkuMzY4NjUyZS0wMiksCisgICAgUVRDRkxMRCg3Ljg1MTAxMmUtMDEpLCAgUVRDRkxMRCgtMi45ODY0ODllLTA5KSwgUVRDRkxMRCgxLjI3NzE4NGUtMDYpLAorICAgIFFUQ0ZMTEQoLTEuNTk0ODYxZS0wMyksIFFUQ0ZMTEQoOC44NzU3NTZlLTAyKSwgIFFUQ0ZMTEQoNy42OTcwOTNlLTAxKSwKKyAgICBRVENGTExEKDEuODc2MDIyZS0wNyksICBRVENGTExEKDEuNTgwMTg5ZS0wNSksICBRVENGTExEKC0xLjA2MTQ5OWUtMDMpLAorICAgIFFUQ0ZMTEQoOC4zNDcxNTFlLTAyKSwgIFFUQ0ZMTEQoNy41NDIyOTRlLTAxKSwgIFFUQ0ZMTEQoMS43MzcyNzdlLTA3KSwKKyAgICBRVENGTExEKDUuNTMzOTUzZS0wNSksICBRVENGTExEKC02LjE2OTg1NWUtMDQpLCBRVENGTExEKDcuNzgzMzAwZS0wMiksCisgICAgUVRDRkxMRCg3LjM4NjUxNWUtMDEpLCAgUVRDRkxMRCgzLjgxODU4OWUtMDkpLCAgUVRDRkxMRCg4Ljg3MDE4MmUtMDUpLAorICAgIFFUQ0ZMTEQoLTIuMDA0ODIzZS0wNCksIFFUQ0ZMTEQoNy4xODQwNzRlLTAyKSwgIFFUQ0ZMTEQoNy4yMjk1OTllLTAxKSwKKyAgICBRVENGTExEKDUuMTQzNjE1ZS0wNyksICBRVENGTExEKDEuMDM1NzgzZS0wNCksICBRVENGTExEKDIuMDQ4NDk5ZS0wNCksCisgICAgUVRDRkxMRCg2LjU1MDIwOWUtMDIpLCAgUVRDRkxMRCg3LjA3MTQ0OGUtMDEpLCAgUVRDRkxMRCgyLjgyMDI5MmUtMDgpLAorICAgIFFUQ0ZMTEQoOS45OTA3NThlLTA1KSwgIFFUQ0ZMTEQoNS42MjE3MjFlLTA0KSwgIFFUQ0ZMTEQoNS44ODEyOTdlLTAyKSwKKyAgICBRVENGTExEKDYuOTExOTgyZS0wMSksICBRVENGTExEKDQuNjc3MDE2ZS0wNiksICBRVENGTExEKDEuMTgxMDc4ZS0wNCksCisgICAgUVRDRkxMRCg5LjM3Mzk3NWUtMDQpLCAgUVRDRkxMRCg1LjE3Nzk2NWUtMDIpLCAgUVRDRkxMRCg2Ljc1MTE5OWUtMDEpLAorICAgIFFUQ0ZMTEQoMy4zNjE2ODJlLTA2KSwgIFFUQ0ZMTEQoMi4xMjYzNjVlLTA1KSwgIFFUQ0ZMTEQoMS4zNDQ2NTdlLTAzKSwKKyAgICBRVENGTExEKDQuNDM5Njg0ZS0wMiksICBRVENGTExEKDYuNTg5MTQ5ZS0wMSksICBRVENGTExEKC00Ljg4MDg0NWUtMDgpLAorICAgIFFUQ0ZMTEQoNS44NjE4MDBlLTA1KSwgIFFUQ0ZMTEQoMS44MTIxNzZlLTAzKSwgIFFUQ0ZMTEQoMy42NjY5NDNlLTAyKSwKKyAgICBRVENGTExEKDYuNDI1OTQwZS0wMSksICBRVENGTExEKDIuMjY3NzMxZS0wNyksICBRVENGTExEKDUuMDIxOTA2ZS0wNSksCisgICAgUVRDRkxMRCgyLjE3Mjg2NmUtMDMpLCAgUVRDRkxMRCgyLjg1NzUyOGUtMDIpLCAgUVRDRkxMRCg2LjI2MTcyNWUtMDEpLAorICAgIFFUQ0ZMTEQoNS4xNTgyMTNlLTA5KSwgIFFUQ0ZMTEQoNC4xNTAwNzVlLTA1KSwgIFFUQ0ZMTEQoMS45ODU4MjVlLTAzKSwKKyAgICBRVENGTExEKDIuMDEyMjM3ZS0wMiksICBRVENGTExEKDYuMDk2NjkwZS0wMSksICBRVENGTExEKC0yLjA2Njk2MmUtMDcpLAorICAgIFFUQ0ZMTEQoMy43OTk5NzJlLTA1KSwgIFFUQ0ZMTEQoMS42OTc2NTNlLTAzKSwgIFFUQ0ZMTEQoMS4xMzIzMjRlLTAyKSwKKyAgICBRVENGTExEKDUuOTMwOTgyZS0wMSksICBRVENGTExEKDQuODgzMzA1ZS0wNyksICBRVENGTExEKDYuNjA2NDYyZS0wNSksCisgICAgUVRDRkxMRCgxLjQ3MTE2N2UtMDMpLCAgUVRDRkxMRCgyLjE4NDI1N2UtMDMpLCAgUVRDRkxMRCg1Ljc2NDczNWUtMDEpLAorICAgIFFUQ0ZMTEQoOC4yNTQ0MzBlLTA3KSwgIFFUQ0ZMTEQoOS43NTU2ODVlLTA1KSwgIFFUQ0ZMTEQoMS4yMzIxMzRlLTAzKSwKKyAgICBRVENGTExEKC03LjI5ODE5OGUtMDMpLCBRVENGTExEKDUuNTk4MDUyZS0wMSksICBRVENGTExEKDkuNDY0NzgzZS0wNyksCisgICAgUVRDRkxMRCgxLjgzMTEyMWUtMDQpLCAgUVRDRkxMRCg4Ljk5MDI1NmUtMDQpLCAgUVRDRkxMRCgtMS43MTEzMjRlLTAyKSwKKyAgICBRVENGTExEKDUuNDMwOTkwZS0wMSksICBRVENGTExEKC0xLjIzMjY5M2UtMDUpLCBRVENGTExEKC01LjkwMTYxOGUtMDcpLAorICAgIFFUQ0ZMTEQoNi4xNTAzMTdlLTA0KSwgIFFUQ0ZMTEQoLTIuNzI2NDg0ZS0wMiksIFFUQ0ZMTEQoNS4yNjM1NTRlLTAxKSwKKyAgICBRVENGTExEKDMuODY3NDgzZS0wNSksICBRVENGTExEKC0zLjU5NTA1NGUtMDQpLCBRVENGTExEKDYuMzA3ODQxZS0wNCksCisgICAgUVRDRkxMRCgtMy43NzU5MjhlLTAyKSwgUVRDRkxMRCg1LjA5NTcyMWUtMDEpLCAgUVRDRkxMRCgtOS44NzA1NDhlLTA3KSwKKyAgICBRVENGTExEKC0xLjgxNTgzN2UtMDQpLCBRVENGTExEKDQuMzY2NDQ3ZS0wNCksICBRVENGTExEKC00Ljg1OTAwNmUtMDIpLAorICAgIFFUQ0ZMTEQoNC45Mjc0NjRlLTAxKSwgIFFUQ0ZMTEQoLTEuMDg5NTAxZS0wNiksIFFUQ0ZMTEQoLTkuMjA0ODc2ZS0wNSksCisgICAgUVRDRkxMRCgxLjQ5ODIzMmUtMDQpLCAgUVRDRkxMRCgtNS45NzM3NDJlLTAyKSwgUVRDRkxMRCg0Ljc1ODc1NGUtMDEpLAorICAgIFFUQ0ZMTEQoLTEuNTY5MDAzZS0wNiksIFFUQ0ZMTEQoLTUuMTkyNDQ0ZS0wNSksIFFUQ0ZMTEQoLTkuMDk5NzIzZS0wNSksCisgICAgUVRDRkxMRCgtNy4xMjAzNTdlLTAyKSwgUVRDRkxMRCg0LjU4OTU4M2UtMDEpLCAgUVRDRkxMRCgtMi43Nzg2MThlLTA3KSwKKyAgICBRVENGTExEKDYuNDg3ODgwZS0wNSksICBRVENGTExEKC0zLjMzNzk2N2UtMDQpLCBRVENGTExEKC04LjI5ODEwM2UtMDIpLAorICAgIFFUQ0ZMTEQoNC40MjAwMTRlLTAxKSwgIFFUQ0ZMTEQoNi43NTcwMTVlLTA5KSwgIFFUQ0ZMTEQoNS4zOTcwNjVlLTA1KSwKKyAgICBRVENGTExEKC01LjU5OTM0OGUtMDQpLCBRVENGTExEKC05LjUwNjk2N2UtMDIpLCBRVENGTExEKDQuMjUwMTQ0ZS0wMSksCisgICAgUVRDRkxMRCgxLjQ5NjQzNmUtMDcpLCAgUVRDRkxMRCgyLjQ3MjAyNGUtMDUpLCAgUVRDRkxMRCgtNy42Nzc2MzRlLTA0KSwKKyAgICBRVENGTExEKC0xLjA3NDYzMWUtMDEpLCBRVENGTExEKDQuMDgwMTU1ZS0wMSksICBRVENGTExEKDIuMDY4Mjk3ZS0wNSksCisgICAgUVRDRkxMRCg5LjcxMTY4MmUtMDUpLCAgUVRDRkxMRCgtOS43MzA0NjBlLTA0KSwgUVRDRkxMRCgtMS4yMDE2MjllLTAxKSwKKyAgICBRVENGTExEKDMuOTEwMjQ0ZS0wMSksICBRVENGTExEKC05LjM4ODk2M2UtMDYpLCBRVENGTExEKDUuMTQ0OTY5ZS0wNSksCisgICAgUVRDRkxMRCgtMS4xMzE4NjBlLTAzKSwgUVRDRkxMRCgtMS4zMzE1NDVlLTAxKSwgUVRDRkxMRCgzLjc0MDY0NGUtMDEpLAorICAgIFFUQ0ZMTEQoLTEuNDAyOTI1ZS0wNSksIFFUQ0ZMTEQoLTEuMDM5MjY0ZS0wNCksIFFUQ0ZMTEQoLTEuMjgzMjgxZS0wMyksCisgICAgUVRDRkxMRCgtMS40NjQzODllLTAxKSwgUVRDRkxMRCgzLjU3MTUyOGUtMDEpLCAgUVRDRkxMRCgtMi43NTc2MTFlLTA2KSwKKyAgICBRVENGTExEKDIuODUzNDM3ZS0wNiksICBRVENGTExEKC0xLjQ4MDU0M2UtMDMpLCBRVENGTExEKC0xLjYwMDA2MmUtMDEpLAorICAgIFFUQ0ZMTEQoMy40MDMwNzRlLTAxKSwgIFFUQ0ZMTEQoMi45NDUyMzllLTA4KSwgIFFUQ0ZMTEQoMS4zMzQwOTFlLTA1KSwKKyAgICBRVENGTExEKC0xLjY5OTE2MWUtMDMpLCBRVENGTExEKC0xLjczODU0MmUtMDEpLCBRVENGTExEKDMuMjM1Mjk5ZS0wMSksCisgICAgUVRDRkxMRCgtNy44NzMzMDRlLTA4KSwgUVRDRkxMRCgyLjQ0MzE2MWUtMDUpLCAgUVRDRkxMRCgtMS45MjQ4NDVlLTAzKSwKKyAgICBRVENGTExEKC0xLjg3OTcxMmUtMDEpLCBRVENGTExEKDMuMDY4MTg3ZS0wMSksICBRVENGTExEKC05Ljg5NzE5NGUtMDcpLAorICAgIFFUQ0ZMTEQoMy41Njg1NTVlLTA1KSwgIFFUQ0ZMTEQoLTIuMTUyMzgwZS0wMyksIFFUQ0ZMTEQoLTIuMDIzNTQ4ZS0wMSksCisgICAgUVRDRkxMRCgyLjkwMTQ5MWUtMDEpLCAgUVRDRkxMRCgtMS45MjIwNzRlLTA2KSwgUVRDRkxMRCg2LjE5MzM3MGUtMDUpLAorICAgIFFUQ0ZMTEQoLTIuMzk2NDA0ZS0wMyksIFFUQ0ZMTEQoLTIuMTY5OTI2ZS0wMSksIFFUQ0ZMTEQoMi43MzQ5NzdlLTAxKSwKKyAgICBRVENGTExEKC0yLjc2NTY1MGUtMDcpLCBRVENGTExEKDEuMTc2MjM3ZS0wNCksICBRVENGTExEKC0yLjY1MzgxOWUtMDMpLAorICAgIFFUQ0ZMTEQoLTIuMzE4ODE1ZS0wMSksIFFUQ0ZMTEQoMi41NjgxNzZlLTAxKSwgIFFUQ0ZMTEQoLTQuNjM2MTA1ZS0wNyksCisgICAgUVRDRkxMRCgxLjYzNTkwNmUtMDQpLCAgUVRDRkxMRCgtMi45MjcxNTllLTAzKSwgUVRDRkxMRCgtMi40NzAwOThlLTAxKSwKKyAgICBRVENGTExEKDIuNDAwNzY4ZS0wMSksICBRVENGTExEKC05LjYwNzA2OWUtMDcpLCBRVENGTExEKDIuMDYwMzk0ZS0wNCksCisgICAgUVRDRkxMRCgtMy4yMDkwOTNlLTAzKSwgUVRDRkxMRCgtMi42MjM3NDllLTAxKSwgUVRDRkxMRCgyLjIzMjI3N2UtMDEpLAorICAgIFFUQ0ZMTEQoLTEuOTA3OTI3ZS0wNiksIFFUQ0ZMTEQoMi4zNDY5ODFlLTA0KSwgIFFUQ0ZMTEQoLTMuNTA1NTMxZS0wMyksCisgICAgUVRDRkxMRCgtMi43Nzk2MzhlLTAxKSwgUVRDRkxMRCgyLjA2MjYwNWUtMDEpLCAgUVRDRkxMRCgtMS41NTEyNTFlLTA4KSwKKyAgICBRVENGTExEKDIuNTIwNjA3ZS0wNCksICBRVENGTExEKC0zLjgxMTYxMmUtMDMpLCBRVENGTExEKC0yLjkzNzcyNWUtMDEpLAorICAgIFFUQ0ZMTEQoMS44OTE1OTBlLTAxKSwgIFFUQ0ZMTEQoLTEuNjUzNDY0ZS0wNiksIFFUQ0ZMTEQoMi41NTY0NTBlLTA0KSwKKyAgICBRVENGTExEKC00LjEzMzY0MGUtMDMpLCBRVENGTExEKC0zLjA5Nzg2MmUtMDEpLCBRVENGTExEKDEuNzE5NzI2ZS0wMSksCisgICAgUVRDRkxMRCgtMi4wNDM0NjRlLTA2KSwgUVRDRkxMRCgzLjE1NzY2NGUtMDQpLCAgUVRDRkxMRCgtNC40NDg5OTNlLTAzKSwKKyAgICBRVENGTExEKC0zLjI1OTk5NGUtMDEpLCBRVENGTExEKDEuNTQ3NDYxZS0wMSksICBRVENGTExEKDEuNjIyNzg2ZS0wNSksCisgICAgUVRDRkxMRCg2LjIwNTY3NmUtMDQpLCAgUVRDRkxMRCgtNC43NTQxOTJlLTAzKSwgUVRDRkxMRCgtMy40MjM5NDJlLTAxKSwKKyAgICBRVENGTExEKDEuMzc2MTUwZS0wMSksICBRVENGTExEKDEuMzk1MjIxZS0wNSksICBRVENGTExEKDcuODQ3ODQwZS0wNCksCisgICAgUVRDRkxMRCgtNS4wNjM4NTFlLTAzKSwgUVRDRkxMRCgtMy41ODk2MjdlLTAxKSwgUVRDRkxMRCgxLjIwNjkyNGUtMDEpLAorICAgIFFUQ0ZMTEQoNC41OTEwMTBlLTA3KSwgIFFUQ0ZMTEQoOS4wMTkxMjllLTA0KSwgIFFUQ0ZMTEQoLTUuMzk0NTcwZS0wMyksCisgICAgUVRDRkxMRCgtMy43NTY4MjJlLTAxKSwgUVRDRkxMRCgxLjA0MjAzM2UtMDEpLCAgUVRDRkxMRCgtNi4yNjE5NDRlLTA2KSwKKyAgICBRVENGTExEKDEuMDU0OTYzZS0wMyksICBRVENGTExEKC01Ljc0MTEwM2UtMDMpLCBRVENGTExEKC0zLjkyNTQwOWUtMDEpLAorICAgIFFUQ0ZMTEQoOC44Mjk3NDVlLTAyKSwgIFFUQ0ZMTEQoLTEuNjA2MDUxZS0wNSksIFFUQ0ZMTEQoMS4wODk0MjllLTAzKSwKKyAgICBRVENGTExEKC02LjEwOTE3OWUtMDMpLCBRVENGTExEKC00LjA5NTE2MGUtMDEpLCBRVENGTExEKDcuMzI1OTc5ZS0wMiksCisgICAgUVRDRkxMRCgtMi40NjQyMjhlLTA1KSwgUVRDRkxMRCgxLjEyMjUwM2UtMDMpLCAgUVRDRkxMRCgtNi41MDA1MDNlLTAzKSwKKyAgICBRVENGTExEKC00LjI2NTk1MGUtMDEpLCBRVENGTExEKDUuOTE4Njc4ZS0wMiksICBRVENGTExEKC0yLjk3NjgyNGUtMDUpLAorICAgIFFUQ0ZMTEQoMS4xNzc1MTVlLTAzKSwgIFFUQ0ZMTEQoLTYuOTI1MTQxZS0wMyksIFFUQ0ZMTEQoLTQuNDM3NTMwZS0wMSksCisgICAgUVRDRkxMRCg0LjYzNDY5NmUtMDIpLCAgUVRDRkxMRCgtMy4xNzc0NjhlLTA1KSwgUVRDRkxMRCgxLjIyNjExM2UtMDMpLAorICAgIFFUQ0ZMTEQoLTcuMzgwNTQ0ZS0wMyksIFFUQ0ZMTEQoLTQuNjA5ODI5ZS0wMSksIFFUQ0ZMTEQoMy40NTA3MTllLTAyKSwKKyAgICBRVENGTExEKC00LjM3MzMwMmUtMDUpLCBRVENGTExEKDEuMjYzNTY5ZS0wMyksICBRVENGTExEKC03Ljg3NjM5M2UtMDMpLAorICAgIFFUQ0ZMTEQoLTQuNzgyNjUwZS0wMSksIFFUQ0ZMTEQoMi4zNTMwNjBlLTAyKSwgIFFUQ0ZMTEQoLTMuMjk5MDA0ZS0wNSksCisgICAgUVRDRkxMRCgxLjI4NzgxOWUtMDMpLCAgUVRDRkxMRCgtOC40MDc3NDllLTAzKSwgUVRDRkxMRCgtNC45NTYxNzVlLTAxKSwKKyAgICBRVENGTExEKDEuMTI5NTgwZS0wMiksCiB9OwogCiBSQU1fQUxJR04KLWNvbnN0IEZJWFBfUEZUIHFtZl9jbGRmYl8zMjBbUU1GMzIwX0NMREZCX1BGVF9UQUJMRV9TSVpFXSA9Ci17Ci1RVENGTExEKDUuMzQ1MDYwZS0wNyksIFFUQ0ZMTEQoLTEuMTM1NDcxZS0wNSksIFFUQ0ZMTEQoLTEuMjIyNzQzZS0wMyksIFFUQ0ZMTEQoOS4zMTgzMzVlLTAzKSwgUVRDRkxMRCg1LjIxNDAzM2UtMDEpLAotUVRDRkxMRCg3LjYwNDc5MmUtMDcpLCBRVENGTExEKDYuMDAzODM5ZS0wNiksIFFUQ0ZMTEQoLTEuMTI1Mzk4ZS0wMyksIFFUQ0ZMTEQoMS4wNzAwNDNlLTAyKSwgUVRDRkxMRCg1LjU1NjA4N2UtMDEpLAotUVRDRkxMRCg1LjU2MzUzNmUtMDcpLCBRVENGTExEKDEuMDUwNzkyZS0wNSksIFFUQ0ZMTEQoLTEuMDE2OTI5ZS0wMyksIFFUQ0ZMTEQoMS4yMjg0NzllLTAyKSwgUVRDRkxMRCg1Ljg5NjkzNWUtMDEpLAotUVRDRkxMRCgyLjkwNjMyMmUtMDgpLCBRVENGTExEKDguNTYwNTI3ZS0wNiksIFFUQ0ZMTEQoLTkuNTMxMTg3ZS0wNCksIFFUQ0ZMTEQoMS40MDg2NDBlLTAyKSwgUVRDRkxMRCg2LjIzNTE1N2UtMDEpLAotUVRDRkxMRCgxLjA4NDYxNGUtMDYpLCBRVENGTExEKDIuNDA3OTUxZS0wNSksIFFUQ0ZMTEQoLTEuMDkzNDMzZS0wMyksIFFUQ0ZMTEQoMS42MTE0NzRlLTAyKSwgUVRDRkxMRCg2LjU2OTM3MWUtMDEpLAotUVRDRkxMRCgtNi4xNzUzODdlLTEwKSwgUVRDRkxMRCg4Ljc2OTg5OWUtMDYpLCBRVENGTExEKC0xLjI0NDc1MmUtMDMpLCBRVENGTExEKDEuODM3ODc3ZS0wMiksIFFUQ0ZMTEQoNi44OTgwMDNlLTAxKSwKLVFUQ0ZMTEQoLTQuMTI4ODA4ZS0wOSksIFFUQ0ZMTEQoOS40OTQ3NjdlLTA2KSwgUVRDRkxMRCgtOC44NzgxNjBlLTA0KSwgUVRDRkxMRCgyLjA4OTkxNWUtMDIpLCBRVENGTExEKDcuMjE5NDE2ZS0wMSksCi1RVENGTExEKC0xLjExNjgwMWUtMDgpLCBRVENGTExEKDIuNjcwMTMwZS0wNiksIFFUQ0ZMTEQoLTYuMjczMDQxZS0wNCksIFFUQ0ZMTEQoMi4zNjk5NTJlLTAyKSwgUVRDRkxMRCg3LjUzMjA4MmUtMDEpLAotUVRDRkxMRCgyLjYwNzM0N2UtMDgpLCBRVENGTExEKDIuNDI0NzkwZS0wNiksIFFUQ0ZMTEQoLTMuODY1OTQ0ZS0wNCksIFFUQ0ZMTEQoMi42NzkwMjRlLTAyKSwgUVRDRkxMRCg3LjgzNDY5MWUtMDEpLAotUVRDRkxMRCgzLjc4MjE0OGUtMDgpLCBRVENGTExEKDMuMjMzNTczZS0wNSksIFFUQ0ZMTEQoMi43NDgxMzZlLTA0KSwgUVRDRkxMRCgzLjAyMTE5M2UtMDIpLCBRVENGTExEKDguMTI2MDQ0ZS0wMSksCi1RVENGTExEKDEuMjkwOTIxZS0wNyksIFFUQ0ZMTEQoNS4xMDYxODdlLTA1KSwgUVRDRkxMRCg5LjY4MDYxNWUtMDQpLCBRVENGTExEKDMuMzk1NzI2ZS0wMiksIFFUQ0ZMTEQoOC40MDQ5MjVlLTAxKSwKLVFUQ0ZMTEQoLTEuMDMwNzMyZS0wNiksIFFUQ0ZMTEQoMS4xNjI5NDNlLTA1KSwgUVRDRkxMRCgxLjU3MTE5OGUtMDMpLCBRVENGTExEKDMuODAxNzQwZS0wMiksIFFUQ0ZMTEQoOC42Njk5NTVlLTAxKSwKLVFUQ0ZMTEQoNC4wNTI5NDBlLTA4KSwgUVRDRkxMRCg0LjkyNDk2MGUtMDUpLCBRVENGTExEKDEuOTkwNzY3ZS0wMyksIFFUQ0ZMTEQoNC4yNDA1NjllLTAyKSwgUVRDRkxMRCg4LjkxOTU5NWUtMDEpLAotUVRDRkxMRCgxLjIzNjQ4MWUtMDcpLCBRVENGTExEKDUuNzk5MzMzZS0wNSksIFFUQ0ZMTEQoMi4zNTQ4MDBlLTAzKSwgUVRDRkxMRCg0LjcyNDE3N2UtMDIpLCBRVENGTExEKDkuMTUyMjUzZS0wMSksCi1RVENGTExEKDQuMDQ5Mzg4ZS0wNyksIFFUQ0ZMTEQoNi4zNjk0OTZlLTA1KSwgUVRDRkxMRCgyLjY2Njc0NmUtMDMpLCBRVENGTExEKDUuMjM2OTY3ZS0wMiksIFFUQ0ZMTEQoOS4zNjY3MDllLTAxKSwKLVFUQ0ZMTEQoNC41MDk4NTdlLTA2KSwgUVRDRkxMRCgxLjcyNjg1MmUtMDQpLCBRVENGTExEKDIuNzI0NDQzZS0wMyksIFFUQ0ZMTEQoNS43NzQyOTFlLTAyKSwgUVRDRkxMRCg5LjU2MjA5N2UtMDEpLAotUVRDRkxMRCgxLjM3OTAyNmUtMDUpLCBRVENGTExEKDMuMzA0NjE5ZS0wNCksIFFUQ0ZMTEQoMi4zNzgyMTZlLTAzKSwgUVRDRkxMRCg2LjMzNjU3MWUtMDIpLCBRVENGTExEKDkuNzM3OTE2ZS0wMSksCi1RVENGTExEKDguNDk3NzE1ZS0wNyksIFFUQ0ZMTEQoNy4yMTk2MjRlLTA1KSwgUVRDRkxMRCgxLjcyNDU0MmUtMDMpLCBRVENGTExEKDYuOTE4MzExZS0wMiksIFFUQ0ZMTEQoOS44OTM4ODNlLTAxKSwKLVFUQ0ZMTEQoLTEuNjYwOTQ0ZS0wNyksIFFUQ0ZMTEQoLTYuODg2NjY0ZS0wNSksIFFUQ0ZMTEQoOS4xODEzNTRlLTA0KSwgUVRDRkxMRCg3LjUwOTEwNWUtMDIpLCBRVENGTExEKDEuMDAyOTY5ZSswMCksCi1RVENGTExEKC0xLjE0NzIzNWUtMDUpLCBRVENGTExEKC01LjMwMTgyNmUtMDUpLCBRVENGTExEKDIuMDEzNzAxZS0wNCksIFFUQ0ZMTEQoOC4xMDM3NjZlLTAyKSwgUVRDRkxMRCgxLjAxNDQ4NGUrMDApLAotUVRDRkxMRCgtMy40NjY4MjllLTA2KSwgUVRDRkxMRCgxLjIwNTU2NGUtMDQpLCBRVENGTExEKDYuMzQ4ODkyZS0wNCksIFFUQ0ZMTEQoOC42OTQ3NjVlLTAyKSwgUVRDRkxMRCgxLjAyMzg4M2UrMDApLAotUVRDRkxMRCg2LjcxMzY5MmUtMDcpLCBRVENGTExEKDcuNzYyMjY4ZS0wNiksIFFUQ0ZMTEQoNy4yNjUxMTJlLTA0KSwgUVRDRkxMRCg5LjI3NzYwOGUtMDIpLCBRVENGTExEKDEuMDMxMTU3ZSswMCksCi1RVENGTExEKDIuMjgzMjM4ZS0wNyksIFFUQ0ZMTEQoLTkuODAxMjUzZS0wNiksIFFUQ0ZMTEQoNy4wNDIwMjJlLTA0KSwgUVRDRkxMRCg5Ljg0NDA5OWUtMDIpLCBRVENGTExEKDEuMDM2MzY3ZSswMCksCi1RVENGTExEKDMuMTI4MTg5ZS0wNyksIFFUQ0ZMTEQoLTIuNjIzMjg1ZS0wNSksIFFUQ0ZMTEQoNi44MjcwNTJlLTA0KSwgUVRDRkxMRCgxLjAzODUyMGUtMDEpLCBRVENGTExEKDEuMDM5NjYyZSswMCksCi1RVENGTExEKDEuOTA3NjUyZS0wNyksIFFUQ0ZMTEQoLTQuOTY5NjU0ZS0wNSksIFFUQ0ZMTEQoNi4zMjE5NzRlLTA0KSwgUVRDRkxMRCgxLjA4OTA5NGUtMDEpLCBRVENGTExEKDEuMDQxMjM5ZSswMCksCi1RVENGTExEKDMuMzAxNDc5ZS0wNyksIFFUQ0ZMTEQoLTYuOTA0MzU0ZS0wNSksIFFUQ0ZMTEQoMy45Njk2MzRlLTA0KSwgUVRDRkxMRCgxLjEzNTE2OWUtMDEpLCBRVENGTExEKDEuMDQxMjY1ZSswMCksCi1RVENGTExEKDYuNTk2OTMxZS0wNyksIFFUQ0ZMTEQoLTguOTczNDMxZS0wNSksIFFUQ0ZMTEQoLTUuMzAzMjYwZS0wNiksIFFUQ0ZMTEQoMS4xNzU4MjFlLTAxKSwgUVRDRkxMRCgxLjAzOTc4OWUrMDApLAotUVRDRkxMRCgtNC4wNDAwOTRlLTA2KSwgUVRDRkxMRCgtMi4zMTYwOTZlLTA0KSwgUVRDRkxMRCgtNi4wMzY1NjFlLTA0KSwgUVRDRkxMRCgxLjIxMDM2NWUtMDEpLCBRVENGTExEKDEuMDM2Njg5ZSswMCksCi1RVENGTExEKDYuMDc4OTgwZS0wNyksIFFUQ0ZMTEQoLTIuMTAwOTg1ZS0wNCksIFFUQ0ZMTEQoLTEuMzQxMjQ5ZS0wMyksIFFUQ0ZMTEQoMS4yMzgyMDFlLTAxKSwgUVRDRkxMRCgxLjAzMTcwMmUrMDApLAotUVRDRkxMRCg0LjI2OTcxMWUtMDYpLCBRVENGTExEKC0xLjgwNjk3OWUtMDQpLCBRVENGTExEKC0yLjEwMzQ2NGUtMDMpLCBRVENGTExEKDEuMjU4ODAwZS0wMSksIFFUQ0ZMTEQoMS4wMjQ1NDNlKzAwKSwKLVFUQ0ZMTEQoNi4xMTcxMDVlLTA2KSwgUVRDRkxMRCgtMS43NjQ1MTdlLTA0KSwgUVRDRkxMRCgtMi44MjkyMzJlLTAzKSwgUVRDRkxMRCgxLjI3MTUzMmUtMDEpLCBRVENGTExEKDEuMDE1MTE5ZSswMCksCi1RVENGTExEKDQuMjczMTUzZS0wNiksIFFUQ0ZMTEQoLTIuMTA1MTQ2ZS0wNCksIFFUQ0ZMTEQoLTMuNDU4MTY3ZS0wMyksIFFUQ0ZMTEQoMS4yNzUwNjRlLTAxKSwgUVRDRkxMRCgxLjAwNDE3OGUrMDApLAotUVRDRkxMRCg0Ljc3MTQyOGUtMDYpLCBRVENGTExEKC0yLjYyNjM1M2UtMDUpLCBRVENGTExEKC00LjAwMjk5MWUtMDMpLCBRVENGTExEKDEuMjczMDQ1ZS0wMSksIFFUQ0ZMTEQoOS44Njc2MThlLTAxKSwKLVFUQ0ZMTEQoMy44MjU2NTBlLTA2KSwgUVRDRkxMRCgtOC44ODM1NDBlLTA2KSwgUVRDRkxMRCgtNC40MzQ0MjllLTAzKSwgUVRDRkxMRCgxLjI2NDc3MWUtMDEpLCBRVENGTExEKDkuNjI5NDUxZS0wMSksCi1RVENGTExEKDIuNjUxOTQxZS0wNiksIFFUQ0ZMTEQoMS44MTI1NzllLTA1KSwgUVRDRkxMRCgtNC42NzAyNzRlLTAzKSwgUVRDRkxMRCgxLjI0NTE3M2UtMDEpLCBRVENGTExEKDkuMzc4ODM5ZS0wMSksCi1RVENGTExEKDEuMjI5MDQxZS0wNyksIFFUQ0ZMTEQoMy42NTA0NDBlLTA1KSwgUVRDRkxMRCgtNC42OTI5MjJlLTAzKSwgUVRDRkxMRCgxLjIxNDExM2UtMDEpLCBRVENGTExEKDkuMTEwNDc2ZS0wMSksCi1RVENGTExEKDMuOTg0NzM5ZS0wNiksIFFUQ0ZMTEQoNC41ODM4OTJlLTA1KSwgUVRDRkxMRCgtNC40NjIxODNlLTAzKSwgUVRDRkxMRCgxLjE3MDc5NmUtMDEpLCBRVENGTExEKDguODI3MDU3ZS0wMSksCi1RVENGTExEKC0xLjczMDY2NGUtMDkpLCBRVENGTExEKDIuNDYwODE4ZS0wNSksIFFUQ0ZMTEQoLTMuOTQyNzI5ZS0wMyksIFFUQ0ZMTEQoMS4xMTQzNjZlLTAxKSwgUVRDRkxMRCg4LjUzMjk3MWUtMDEpLAotUVRDRkxMRCgtNy41MTQ0MTNlLTA5KSwgUVRDRkxMRCgyLjkzNTAyOWUtMDUpLCBRVENGTExEKC0zLjI2MjMzN2UtMDMpLCBRVENGTExEKDEuMDQ0MTMwZS0wMSksIFFUQ0ZMTEQoOC4yMzIyODFlLTAxKSwKLVFUQ0ZMTEQoLTQuMTkzNTAzZS0wOCksIFFUQ0ZMTEQoMS4wMDAwODFlLTA1KSwgUVRDRkxMRCgtMi4zNzMwOTJlLTAzKSwgUVRDRkxMRCg5LjU5NzQ1MmUtMDIpLCBRVENGTExEKDcuOTI3NTg5ZS0wMSksCi1RVENGTExEKDkuMjMwNzg2ZS0wOCksIFFUQ0ZMTEQoOC41Mzk1MzhlLTA2KSwgUVRDRkxMRCgtMS4zMjgxODBlLTAzKSwgUVRDRkxMRCg4LjYxMTQ1M2UtMDIpLCBRVENGTExEKDcuNjE5Njk0ZS0wMSksCi1RVENGTExEKDguODc3MzEyZS0wOCksIFFUQ0ZMTEQoNy4yMDIwNjdlLTA1KSwgUVRDRkxMRCgtNC4wODczMzllLTA0KSwgUVRDRkxMRCg3LjQ4MzY4N2UtMDIpLCBRVENGTExEKDcuMzA4MDU4ZS0wMSksCi1RVENGTExEKDIuNzEyODIyZS0wNyksIFFUQ0ZMTEQoMS4wMTc0MjllLTA0KSwgUVRDRkxMRCgzLjgzNTExMGUtMDQpLCBRVENGTExEKDYuMjE1NzUzZS0wMiksIFFUQ0ZMTEQoNi45OTE3MTVlLTAxKSwKLVFUQ0ZMTEQoNC4wMTkzNDllLTA2KSwgUVRDRkxMRCg2Ljk2ODU3MGUtMDUpLCBRVENGTExEKDEuMTQxMDI3ZS0wMyksIFFUQ0ZMTEQoNC44MDg4MjVlLTAyKSwgUVRDRkxMRCg2LjY3MDE3NGUtMDEpLAotUVRDRkxMRCg4Ljg5ODIzM2UtMDgpLCBRVENGTExEKDUuNDQxODUzZS0wNSksIFFUQ0ZMTEQoMS45OTI1MjFlLTAzKSwgUVRDRkxMRCgzLjI2MjIzNmUtMDIpLCBRVENGTExEKDYuMzQzODMzZS0wMSksCi1RVENGTExEKC0xLjAwNzY5MGUtMDcpLCBRVENGTExEKDMuOTc1MDI0ZS0wNSksIFFUQ0ZMTEQoMS44NDE3MzllLTAzKSwgUVRDRkxMRCgxLjU3MjI4MWUtMDIpLCBRVENGTExEKDYuMDEzODM2ZS0wMSksCi1RVENGTExEKDYuNTY4ODY4ZS0wNyksIFFUQ0ZMTEQoOC4xODEwNzRlLTA1KSwgUVRDRkxMRCgxLjM1MTY1MWUtMDMpLCBRVENGTExEKC0yLjU1Njk3MGUtMDMpLCBRVENGTExEKDUuNjgxMzkzZS0wMSksCi1RVENGTExEKC01LjY5MDIyOGUtMDYpLCBRVENGTExEKDkuMTI2MDk4ZS0wNSksIFFUQ0ZMTEQoNy41NzAyODZlLTA0KSwgUVRDRkxMRCgtMi4yMTg5MDRlLTAyKSwgUVRDRkxMRCg1LjM0NzI3MmUtMDEpLAotUVRDRkxMRCgxLjg4NDM4OWUtMDUpLCBRVENGTExEKC0yLjcwNTQ0NmUtMDQpLCBRVENGTExEKDUuMzM3MTQ0ZS0wNCksIFFUQ0ZMTEQoLTQuMzE3NDY3ZS0wMiksIFFUQ0ZMTEQoNS4wMTE1OTNlLTAxKSwKLVFUQ0ZMTEQoLTEuMzI5MjUyZS0wNiksIFFUQ0ZMTEQoLTcuMTk4NjYwZS0wNSksIFFUQ0ZMTEQoMi45NDEyOTZlLTA1KSwgUVRDRkxMRCgtNi41NDcwNDllLTAyKSwgUVRDRkxMRCg0LjY3NDE2OGUtMDEpLAotUVRDRkxMRCgtMS4zNTU1MjRlLTA3KSwgUVRDRkxMRCg1Ljk0MjQ3MmUtMDUpLCBRVENGTExEKC00LjQ2ODY1N2UtMDQpLCBRVENGTExEKC04LjkwMjUzNWUtMDIpLCBRVENGTExEKDQuMzM1MDc5ZS0wMSksCi1RVENGTExEKDEuMDQxNjMxZS0wNSksIFFUQ0ZMTEQoNi4wOTE4NTNlLTA1KSwgUVRDRkxMRCgtOC43MDQwNDdlLTA0KSwgUVRDRkxMRCgtMS4xMzgxMzBlLTAxKSwgUVRDRkxMRCgzLjk5NTIwMGUtMDEpLAotUVRDRkxMRCgtMS4xNzA5MTFlLTA1KSwgUVRDRkxMRCgtMi42MjM4MzNlLTA1KSwgUVRDRkxMRCgtMS4yMDc1NzBlLTAzKSwgUVRDRkxMRCgtMS4zOTc5NjdlLTAxKSwgUVRDRkxMRCgzLjY1NjA4NmUtMDEpLAotUVRDRkxMRCgtMS4zNjQwNzllLTA2KSwgUVRDRkxMRCg4LjA5NzE3M2UtMDYpLCBRVENGTExEKC0xLjU4OTg1MmUtMDMpLCBRVENGTExEKC0xLjY2OTMwMmUtMDEpLCBRVENGTExEKDMuMzE5MTg3ZS0wMSksCi1RVENGTExEKC01LjM0MjI2MmUtMDcpLCBRVENGTExEKDMuMDA1ODU4ZS0wNSksIFFUQ0ZMTEQoLTIuMDM4NjEyZS0wMyksIFFUQ0ZMTEQoLTEuOTUxNjMwZS0wMSksIFFUQ0ZMTEQoMi45ODQ4MzllLTAxKSwKLVFUQ0ZMTEQoLTEuMDk5MzIwZS0wNiksIFFUQ0ZMTEQoOC45Nzc4NzFlLTA1KSwgUVRDRkxMRCgtMi41MjUxMTFlLTAzKSwgUVRDRkxMRCgtMi4yNDQzNzFlLTAxKSwgUVRDRkxMRCgyLjY1MTU3N2UtMDEpLAotUVRDRkxMRCgtNy4xMjE1ODdlLTA3KSwgUVRDRkxMRCgxLjg0ODE1MGUtMDQpLCBRVENGTExEKC0zLjA2ODEyNmUtMDMpLCBRVENGTExEKC0yLjU0NjkyNGUtMDEpLCBRVENGTExEKDIuMzE2NTIzZS0wMSksCi1RVENGTExEKC05LjYxNzE5OWUtMDcpLCBRVENGTExEKDIuNDMzNzk0ZS0wNCksIFFUQ0ZMTEQoLTMuNjU4NTcyZS0wMyksIFFUQ0ZMTEQoLTIuODU4NjgxZS0wMSksIFFUQ0ZMTEQoMS45NzcwOThlLTAxKSwKLVFUQ0ZMTEQoLTEuODQ4NDY0ZS0wNiksIFFUQ0ZMTEQoMi44NTcwNTdlLTA0KSwgUVRDRkxMRCgtNC4yOTEzMTZlLTAzKSwgUVRDRkxMRCgtMy4xNzg5MjhlLTAxKSwgUVRDRkxMRCgxLjYzMzU5NGUtMDEpLAotUVRDRkxMRCgxLjUwOTAwNGUtMDUpLCBRVENGTExEKDcuMDI2NzU4ZS0wNCksIFFUQ0ZMTEQoLTQuOTA5MDIxZS0wMyksIFFUQ0ZMTEQoLTMuNTA2Nzg0ZS0wMSksIFFUQ0ZMTEQoMS4yOTE1MzdlLTAxKSwKLVFUQ0ZMTEQoLTIuOTAxNDIyZS0wNiksIFFUQ0ZMTEQoOS43ODQzODFlLTA0KSwgUVRDRkxMRCgtNS41Njc4MzdlLTAzKSwgUVRDRkxMRCgtMy44NDExMTZlLTAxKSwgUVRDRkxMRCg5LjYyNTAzOGUtMDIpLAotUVRDRkxMRCgtMi4wMzUxNDBlLTA1KSwgUVRDRkxMRCgxLjEwNTk2NmUtMDMpLCBRVENGTExEKC02LjMwNDg0MWUtMDMpLCBRVENGTExEKC00LjE4MDU1NWUtMDEpLCBRVENGTExEKDYuNjIyMzI4ZS0wMiksCi1RVENGTExEKC0zLjA3NzE0NmUtMDUpLCBRVENGTExEKDEuMjAxODE0ZS0wMyksIFFUQ0ZMTEQoLTcuMTUyODQyZS0wMyksIFFUQ0ZMTEQoLTQuNTIzNjgwZS0wMSksIFFUQ0ZMTEQoNC4wNDI3MDdlLTAyKSwKLVFUQ0ZMTEQoLTMuODM2MTUzZS0wNSksIFFUQ0ZMTEQoMS4yNzU2OTRlLTAzKSwgUVRDRkxMRCgtOC4xNDIwNzFlLTAzKSwgUVRDRkxMRCgtNC44Njk0MTNlLTAxKSwgUVRDRkxMRCgxLjc0MTMyMGUtMDIpLAorY29uc3QgRklYUF9QRlQgcW1mX2NsZGZiXzMyMFtRTUYzMjBfQ0xERkJfUEZUX1RBQkxFX1NJWkVdID0geworICAgIFFUQ0ZMTEQoNS4zNDUwNjBlLTA3KSwgIFFUQ0ZMTEQoLTEuMTM1NDcxZS0wNSksIFFUQ0ZMTEQoLTEuMjIyNzQzZS0wMyksCisgICAgUVRDRkxMRCg5LjMxODMzNWUtMDMpLCAgUVRDRkxMRCg1LjIxNDAzM2UtMDEpLCAgUVRDRkxMRCg3LjYwNDc5MmUtMDcpLAorICAgIFFUQ0ZMTEQoNi4wMDM4MzllLTA2KSwgIFFUQ0ZMTEQoLTEuMTI1Mzk4ZS0wMyksIFFUQ0ZMTEQoMS4wNzAwNDNlLTAyKSwKKyAgICBRVENGTExEKDUuNTU2MDg3ZS0wMSksICBRVENGTExEKDUuNTYzNTM2ZS0wNyksICBRVENGTExEKDEuMDUwNzkyZS0wNSksCisgICAgUVRDRkxMRCgtMS4wMTY5MjllLTAzKSwgUVRDRkxMRCgxLjIyODQ3OWUtMDIpLCAgUVRDRkxMRCg1Ljg5NjkzNWUtMDEpLAorICAgIFFUQ0ZMTEQoMi45MDYzMjJlLTA4KSwgIFFUQ0ZMTEQoOC41NjA1MjdlLTA2KSwgIFFUQ0ZMTEQoLTkuNTMxMTg3ZS0wNCksCisgICAgUVRDRkxMRCgxLjQwODY0MGUtMDIpLCAgUVRDRkxMRCg2LjIzNTE1N2UtMDEpLCAgUVRDRkxMRCgxLjA4NDYxNGUtMDYpLAorICAgIFFUQ0ZMTEQoMi40MDc5NTFlLTA1KSwgIFFUQ0ZMTEQoLTEuMDkzNDMzZS0wMyksIFFUQ0ZMTEQoMS42MTE0NzRlLTAyKSwKKyAgICBRVENGTExEKDYuNTY5MzcxZS0wMSksICBRVENGTExEKC02LjE3NTM4N2UtMTApLCBRVENGTExEKDguNzY5ODk5ZS0wNiksCisgICAgUVRDRkxMRCgtMS4yNDQ3NTJlLTAzKSwgUVRDRkxMRCgxLjgzNzg3N2UtMDIpLCAgUVRDRkxMRCg2Ljg5ODAwM2UtMDEpLAorICAgIFFUQ0ZMTEQoLTQuMTI4ODA4ZS0wOSksIFFUQ0ZMTEQoOS40OTQ3NjdlLTA2KSwgIFFUQ0ZMTEQoLTguODc4MTYwZS0wNCksCisgICAgUVRDRkxMRCgyLjA4OTkxNWUtMDIpLCAgUVRDRkxMRCg3LjIxOTQxNmUtMDEpLCAgUVRDRkxMRCgtMS4xMTY4MDFlLTA4KSwKKyAgICBRVENGTExEKDIuNjcwMTMwZS0wNiksICBRVENGTExEKC02LjI3MzA0MWUtMDQpLCBRVENGTExEKDIuMzY5OTUyZS0wMiksCisgICAgUVRDRkxMRCg3LjUzMjA4MmUtMDEpLCAgUVRDRkxMRCgyLjYwNzM0N2UtMDgpLCAgUVRDRkxMRCgyLjQyNDc5MGUtMDYpLAorICAgIFFUQ0ZMTEQoLTMuODY1OTQ0ZS0wNCksIFFUQ0ZMTEQoMi42NzkwMjRlLTAyKSwgIFFUQ0ZMTEQoNy44MzQ2OTFlLTAxKSwKKyAgICBRVENGTExEKDMuNzgyMTQ4ZS0wOCksICBRVENGTExEKDMuMjMzNTczZS0wNSksICBRVENGTExEKDIuNzQ4MTM2ZS0wNCksCisgICAgUVRDRkxMRCgzLjAyMTE5M2UtMDIpLCAgUVRDRkxMRCg4LjEyNjA0NGUtMDEpLCAgUVRDRkxMRCgxLjI5MDkyMWUtMDcpLAorICAgIFFUQ0ZMTEQoNS4xMDYxODdlLTA1KSwgIFFUQ0ZMTEQoOS42ODA2MTVlLTA0KSwgIFFUQ0ZMTEQoMy4zOTU3MjZlLTAyKSwKKyAgICBRVENGTExEKDguNDA0OTI1ZS0wMSksICBRVENGTExEKC0xLjAzMDczMmUtMDYpLCBRVENGTExEKDEuMTYyOTQzZS0wNSksCisgICAgUVRDRkxMRCgxLjU3MTE5OGUtMDMpLCAgUVRDRkxMRCgzLjgwMTc0MGUtMDIpLCAgUVRDRkxMRCg4LjY2OTk1NWUtMDEpLAorICAgIFFUQ0ZMTEQoNC4wNTI5NDBlLTA4KSwgIFFUQ0ZMTEQoNC45MjQ5NjBlLTA1KSwgIFFUQ0ZMTEQoMS45OTA3NjdlLTAzKSwKKyAgICBRVENGTExEKDQuMjQwNTY5ZS0wMiksICBRVENGTExEKDguOTE5NTk1ZS0wMSksICBRVENGTExEKDEuMjM2NDgxZS0wNyksCisgICAgUVRDRkxMRCg1Ljc5OTMzM2UtMDUpLCAgUVRDRkxMRCgyLjM1NDgwMGUtMDMpLCAgUVRDRkxMRCg0LjcyNDE3N2UtMDIpLAorICAgIFFUQ0ZMTEQoOS4xNTIyNTNlLTAxKSwgIFFUQ0ZMTEQoNC4wNDkzODhlLTA3KSwgIFFUQ0ZMTEQoNi4zNjk0OTZlLTA1KSwKKyAgICBRVENGTExEKDIuNjY2NzQ2ZS0wMyksICBRVENGTExEKDUuMjM2OTY3ZS0wMiksICBRVENGTExEKDkuMzY2NzA5ZS0wMSksCisgICAgUVRDRkxMRCg0LjUwOTg1N2UtMDYpLCAgUVRDRkxMRCgxLjcyNjg1MmUtMDQpLCAgUVRDRkxMRCgyLjcyNDQ0M2UtMDMpLAorICAgIFFUQ0ZMTEQoNS43NzQyOTFlLTAyKSwgIFFUQ0ZMTEQoOS41NjIwOTdlLTAxKSwgIFFUQ0ZMTEQoMS4zNzkwMjZlLTA1KSwKKyAgICBRVENGTExEKDMuMzA0NjE5ZS0wNCksICBRVENGTExEKDIuMzc4MjE2ZS0wMyksICBRVENGTExEKDYuMzM2NTcxZS0wMiksCisgICAgUVRDRkxMRCg5LjczNzkxNmUtMDEpLCAgUVRDRkxMRCg4LjQ5NzcxNWUtMDcpLCAgUVRDRkxMRCg3LjIxOTYyNGUtMDUpLAorICAgIFFUQ0ZMTEQoMS43MjQ1NDJlLTAzKSwgIFFUQ0ZMTEQoNi45MTgzMTFlLTAyKSwgIFFUQ0ZMTEQoOS44OTM4ODNlLTAxKSwKKyAgICBRVENGTExEKC0xLjY2MDk0NGUtMDcpLCBRVENGTExEKC02Ljg4NjY2NGUtMDUpLCBRVENGTExEKDkuMTgxMzU0ZS0wNCksCisgICAgUVRDRkxMRCg3LjUwOTEwNWUtMDIpLCAgUVRDRkxMRCgxLjAwMjk2OWUrMDApLCAgUVRDRkxMRCgtMS4xNDcyMzVlLTA1KSwKKyAgICBRVENGTExEKC01LjMwMTgyNmUtMDUpLCBRVENGTExEKDIuMDEzNzAxZS0wNCksICBRVENGTExEKDguMTAzNzY2ZS0wMiksCisgICAgUVRDRkxMRCgxLjAxNDQ4NGUrMDApLCAgUVRDRkxMRCgtMy40NjY4MjllLTA2KSwgUVRDRkxMRCgxLjIwNTU2NGUtMDQpLAorICAgIFFUQ0ZMTEQoNi4zNDg4OTJlLTA0KSwgIFFUQ0ZMTEQoOC42OTQ3NjVlLTAyKSwgIFFUQ0ZMTEQoMS4wMjM4ODNlKzAwKSwKKyAgICBRVENGTExEKDYuNzEzNjkyZS0wNyksICBRVENGTExEKDcuNzYyMjY4ZS0wNiksICBRVENGTExEKDcuMjY1MTEyZS0wNCksCisgICAgUVRDRkxMRCg5LjI3NzYwOGUtMDIpLCAgUVRDRkxMRCgxLjAzMTE1N2UrMDApLCAgUVRDRkxMRCgyLjI4MzIzOGUtMDcpLAorICAgIFFUQ0ZMTEQoLTkuODAxMjUzZS0wNiksIFFUQ0ZMTEQoNy4wNDIwMjJlLTA0KSwgIFFUQ0ZMTEQoOS44NDQwOTllLTAyKSwKKyAgICBRVENGTExEKDEuMDM2MzY3ZSswMCksICBRVENGTExEKDMuMTI4MTg5ZS0wNyksICBRVENGTExEKC0yLjYyMzI4NWUtMDUpLAorICAgIFFUQ0ZMTEQoNi44MjcwNTJlLTA0KSwgIFFUQ0ZMTEQoMS4wMzg1MjBlLTAxKSwgIFFUQ0ZMTEQoMS4wMzk2NjJlKzAwKSwKKyAgICBRVENGTExEKDEuOTA3NjUyZS0wNyksICBRVENGTExEKC00Ljk2OTY1NGUtMDUpLCBRVENGTExEKDYuMzIxOTc0ZS0wNCksCisgICAgUVRDRkxMRCgxLjA4OTA5NGUtMDEpLCAgUVRDRkxMRCgxLjA0MTIzOWUrMDApLCAgUVRDRkxMRCgzLjMwMTQ3OWUtMDcpLAorICAgIFFUQ0ZMTEQoLTYuOTA0MzU0ZS0wNSksIFFUQ0ZMTEQoMy45Njk2MzRlLTA0KSwgIFFUQ0ZMTEQoMS4xMzUxNjllLTAxKSwKKyAgICBRVENGTExEKDEuMDQxMjY1ZSswMCksICBRVENGTExEKDYuNTk2OTMxZS0wNyksICBRVENGTExEKC04Ljk3MzQzMWUtMDUpLAorICAgIFFUQ0ZMTEQoLTUuMzAzMjYwZS0wNiksIFFUQ0ZMTEQoMS4xNzU4MjFlLTAxKSwgIFFUQ0ZMTEQoMS4wMzk3ODllKzAwKSwKKyAgICBRVENGTExEKC00LjA0MDA5NGUtMDYpLCBRVENGTExEKC0yLjMxNjA5NmUtMDQpLCBRVENGTExEKC02LjAzNjU2MWUtMDQpLAorICAgIFFUQ0ZMTEQoMS4yMTAzNjVlLTAxKSwgIFFUQ0ZMTEQoMS4wMzY2ODllKzAwKSwgIFFUQ0ZMTEQoNi4wNzg5ODBlLTA3KSwKKyAgICBRVENGTExEKC0yLjEwMDk4NWUtMDQpLCBRVENGTExEKC0xLjM0MTI0OWUtMDMpLCBRVENGTExEKDEuMjM4MjAxZS0wMSksCisgICAgUVRDRkxMRCgxLjAzMTcwMmUrMDApLCAgUVRDRkxMRCg0LjI2OTcxMWUtMDYpLCAgUVRDRkxMRCgtMS44MDY5NzllLTA0KSwKKyAgICBRVENGTExEKC0yLjEwMzQ2NGUtMDMpLCBRVENGTExEKDEuMjU4ODAwZS0wMSksICBRVENGTExEKDEuMDI0NTQzZSswMCksCisgICAgUVRDRkxMRCg2LjExNzEwNWUtMDYpLCAgUVRDRkxMRCgtMS43NjQ1MTdlLTA0KSwgUVRDRkxMRCgtMi44MjkyMzJlLTAzKSwKKyAgICBRVENGTExEKDEuMjcxNTMyZS0wMSksICBRVENGTExEKDEuMDE1MTE5ZSswMCksICBRVENGTExEKDQuMjczMTUzZS0wNiksCisgICAgUVRDRkxMRCgtMi4xMDUxNDZlLTA0KSwgUVRDRkxMRCgtMy40NTgxNjdlLTAzKSwgUVRDRkxMRCgxLjI3NTA2NGUtMDEpLAorICAgIFFUQ0ZMTEQoMS4wMDQxNzhlKzAwKSwgIFFUQ0ZMTEQoNC43NzE0MjhlLTA2KSwgIFFUQ0ZMTEQoLTIuNjI2MzUzZS0wNSksCisgICAgUVRDRkxMRCgtNC4wMDI5OTFlLTAzKSwgUVRDRkxMRCgxLjI3MzA0NWUtMDEpLCAgUVRDRkxMRCg5Ljg2NzYxOGUtMDEpLAorICAgIFFUQ0ZMTEQoMy44MjU2NTBlLTA2KSwgIFFUQ0ZMTEQoLTguODgzNTQwZS0wNiksIFFUQ0ZMTEQoLTQuNDM0NDI5ZS0wMyksCisgICAgUVRDRkxMRCgxLjI2NDc3MWUtMDEpLCAgUVRDRkxMRCg5LjYyOTQ1MWUtMDEpLCAgUVRDRkxMRCgyLjY1MTk0MWUtMDYpLAorICAgIFFUQ0ZMTEQoMS44MTI1NzllLTA1KSwgIFFUQ0ZMTEQoLTQuNjcwMjc0ZS0wMyksIFFUQ0ZMTEQoMS4yNDUxNzNlLTAxKSwKKyAgICBRVENGTExEKDkuMzc4ODM5ZS0wMSksICBRVENGTExEKDEuMjI5MDQxZS0wNyksICBRVENGTExEKDMuNjUwNDQwZS0wNSksCisgICAgUVRDRkxMRCgtNC42OTI5MjJlLTAzKSwgUVRDRkxMRCgxLjIxNDExM2UtMDEpLCAgUVRDRkxMRCg5LjExMDQ3NmUtMDEpLAorICAgIFFUQ0ZMTEQoMy45ODQ3MzllLTA2KSwgIFFUQ0ZMTEQoNC41ODM4OTJlLTA1KSwgIFFUQ0ZMTEQoLTQuNDYyMTgzZS0wMyksCisgICAgUVRDRkxMRCgxLjE3MDc5NmUtMDEpLCAgUVRDRkxMRCg4LjgyNzA1N2UtMDEpLCAgUVRDRkxMRCgtMS43MzA2NjRlLTA5KSwKKyAgICBRVENGTExEKDIuNDYwODE4ZS0wNSksICBRVENGTExEKC0zLjk0MjcyOWUtMDMpLCBRVENGTExEKDEuMTE0MzY2ZS0wMSksCisgICAgUVRDRkxMRCg4LjUzMjk3MWUtMDEpLCAgUVRDRkxMRCgtNy41MTQ0MTNlLTA5KSwgUVRDRkxMRCgyLjkzNTAyOWUtMDUpLAorICAgIFFUQ0ZMTEQoLTMuMjYyMzM3ZS0wMyksIFFUQ0ZMTEQoMS4wNDQxMzBlLTAxKSwgIFFUQ0ZMTEQoOC4yMzIyODFlLTAxKSwKKyAgICBRVENGTExEKC00LjE5MzUwM2UtMDgpLCBRVENGTExEKDEuMDAwMDgxZS0wNSksICBRVENGTExEKC0yLjM3MzA5MmUtMDMpLAorICAgIFFUQ0ZMTEQoOS41OTc0NTJlLTAyKSwgIFFUQ0ZMTEQoNy45Mjc1ODllLTAxKSwgIFFUQ0ZMTEQoOS4yMzA3ODZlLTA4KSwKKyAgICBRVENGTExEKDguNTM5NTM4ZS0wNiksICBRVENGTExEKC0xLjMyODE4MGUtMDMpLCBRVENGTExEKDguNjExNDUzZS0wMiksCisgICAgUVRDRkxMRCg3LjYxOTY5NGUtMDEpLCAgUVRDRkxMRCg4Ljg3NzMxMmUtMDgpLCAgUVRDRkxMRCg3LjIwMjA2N2UtMDUpLAorICAgIFFUQ0ZMTEQoLTQuMDg3MzM5ZS0wNCksIFFUQ0ZMTEQoNy40ODM2ODdlLTAyKSwgIFFUQ0ZMTEQoNy4zMDgwNThlLTAxKSwKKyAgICBRVENGTExEKDIuNzEyODIyZS0wNyksICBRVENGTExEKDEuMDE3NDI5ZS0wNCksICBRVENGTExEKDMuODM1MTEwZS0wNCksCisgICAgUVRDRkxMRCg2LjIxNTc1M2UtMDIpLCAgUVRDRkxMRCg2Ljk5MTcxNWUtMDEpLCAgUVRDRkxMRCg0LjAxOTM0OWUtMDYpLAorICAgIFFUQ0ZMTEQoNi45Njg1NzBlLTA1KSwgIFFUQ0ZMTEQoMS4xNDEwMjdlLTAzKSwgIFFUQ0ZMTEQoNC44MDg4MjVlLTAyKSwKKyAgICBRVENGTExEKDYuNjcwMTc0ZS0wMSksICBRVENGTExEKDguODk4MjMzZS0wOCksICBRVENGTExEKDUuNDQxODUzZS0wNSksCisgICAgUVRDRkxMRCgxLjk5MjUyMWUtMDMpLCAgUVRDRkxMRCgzLjI2MjIzNmUtMDIpLCAgUVRDRkxMRCg2LjM0MzgzM2UtMDEpLAorICAgIFFUQ0ZMTEQoLTEuMDA3NjkwZS0wNyksIFFUQ0ZMTEQoMy45NzUwMjRlLTA1KSwgIFFUQ0ZMTEQoMS44NDE3MzllLTAzKSwKKyAgICBRVENGTExEKDEuNTcyMjgxZS0wMiksICBRVENGTExEKDYuMDEzODM2ZS0wMSksICBRVENGTExEKDYuNTY4ODY4ZS0wNyksCisgICAgUVRDRkxMRCg4LjE4MTA3NGUtMDUpLCAgUVRDRkxMRCgxLjM1MTY1MWUtMDMpLCAgUVRDRkxMRCgtMi41NTY5NzBlLTAzKSwKKyAgICBRVENGTExEKDUuNjgxMzkzZS0wMSksICBRVENGTExEKC01LjY5MDIyOGUtMDYpLCBRVENGTExEKDkuMTI2MDk4ZS0wNSksCisgICAgUVRDRkxMRCg3LjU3MDI4NmUtMDQpLCAgUVRDRkxMRCgtMi4yMTg5MDRlLTAyKSwgUVRDRkxMRCg1LjM0NzI3MmUtMDEpLAorICAgIFFUQ0ZMTEQoMS44ODQzODllLTA1KSwgIFFUQ0ZMTEQoLTIuNzA1NDQ2ZS0wNCksIFFUQ0ZMTEQoNS4zMzcxNDRlLTA0KSwKKyAgICBRVENGTExEKC00LjMxNzQ2N2UtMDIpLCBRVENGTExEKDUuMDExNTkzZS0wMSksICBRVENGTExEKC0xLjMyOTI1MmUtMDYpLAorICAgIFFUQ0ZMTEQoLTcuMTk4NjYwZS0wNSksIFFUQ0ZMTEQoMi45NDEyOTZlLTA1KSwgIFFUQ0ZMTEQoLTYuNTQ3MDQ5ZS0wMiksCisgICAgUVRDRkxMRCg0LjY3NDE2OGUtMDEpLCAgUVRDRkxMRCgtMS4zNTU1MjRlLTA3KSwgUVRDRkxMRCg1Ljk0MjQ3MmUtMDUpLAorICAgIFFUQ0ZMTEQoLTQuNDY4NjU3ZS0wNCksIFFUQ0ZMTEQoLTguOTAyNTM1ZS0wMiksIFFUQ0ZMTEQoNC4zMzUwNzllLTAxKSwKKyAgICBRVENGTExEKDEuMDQxNjMxZS0wNSksICBRVENGTExEKDYuMDkxODUzZS0wNSksICBRVENGTExEKC04LjcwNDA0N2UtMDQpLAorICAgIFFUQ0ZMTEQoLTEuMTM4MTMwZS0wMSksIFFUQ0ZMTEQoMy45OTUyMDBlLTAxKSwgIFFUQ0ZMTEQoLTEuMTcwOTExZS0wNSksCisgICAgUVRDRkxMRCgtMi42MjM4MzNlLTA1KSwgUVRDRkxMRCgtMS4yMDc1NzBlLTAzKSwgUVRDRkxMRCgtMS4zOTc5NjdlLTAxKSwKKyAgICBRVENGTExEKDMuNjU2MDg2ZS0wMSksICBRVENGTExEKC0xLjM2NDA3OWUtMDYpLCBRVENGTExEKDguMDk3MTczZS0wNiksCisgICAgUVRDRkxMRCgtMS41ODk4NTJlLTAzKSwgUVRDRkxMRCgtMS42NjkzMDJlLTAxKSwgUVRDRkxMRCgzLjMxOTE4N2UtMDEpLAorICAgIFFUQ0ZMTEQoLTUuMzQyMjYyZS0wNyksIFFUQ0ZMTEQoMy4wMDU4NThlLTA1KSwgIFFUQ0ZMTEQoLTIuMDM4NjEyZS0wMyksCisgICAgUVRDRkxMRCgtMS45NTE2MzBlLTAxKSwgUVRDRkxMRCgyLjk4NDgzOWUtMDEpLCAgUVRDRkxMRCgtMS4wOTkzMjBlLTA2KSwKKyAgICBRVENGTExEKDguOTc3ODcxZS0wNSksICBRVENGTExEKC0yLjUyNTExMWUtMDMpLCBRVENGTExEKC0yLjI0NDM3MWUtMDEpLAorICAgIFFUQ0ZMTEQoMi42NTE1NzdlLTAxKSwgIFFUQ0ZMTEQoLTcuMTIxNTg3ZS0wNyksIFFUQ0ZMTEQoMS44NDgxNTBlLTA0KSwKKyAgICBRVENGTExEKC0zLjA2ODEyNmUtMDMpLCBRVENGTExEKC0yLjU0NjkyNGUtMDEpLCBRVENGTExEKDIuMzE2NTIzZS0wMSksCisgICAgUVRDRkxMRCgtOS42MTcxOTllLTA3KSwgUVRDRkxMRCgyLjQzMzc5NGUtMDQpLCAgUVRDRkxMRCgtMy42NTg1NzJlLTAzKSwKKyAgICBRVENGTExEKC0yLjg1ODY4MWUtMDEpLCBRVENGTExEKDEuOTc3MDk4ZS0wMSksICBRVENGTExEKC0xLjg0ODQ2NGUtMDYpLAorICAgIFFUQ0ZMTEQoMi44NTcwNTdlLTA0KSwgIFFUQ0ZMTEQoLTQuMjkxMzE2ZS0wMyksIFFUQ0ZMTEQoLTMuMTc4OTI4ZS0wMSksCisgICAgUVRDRkxMRCgxLjYzMzU5NGUtMDEpLCAgUVRDRkxMRCgxLjUwOTAwNGUtMDUpLCAgUVRDRkxMRCg3LjAyNjc1OGUtMDQpLAorICAgIFFUQ0ZMTEQoLTQuOTA5MDIxZS0wMyksIFFUQ0ZMTEQoLTMuNTA2Nzg0ZS0wMSksIFFUQ0ZMTEQoMS4yOTE1MzdlLTAxKSwKKyAgICBRVENGTExEKC0yLjkwMTQyMmUtMDYpLCBRVENGTExEKDkuNzg0MzgxZS0wNCksICBRVENGTExEKC01LjU2NzgzN2UtMDMpLAorICAgIFFUQ0ZMTEQoLTMuODQxMTE2ZS0wMSksIFFUQ0ZMTEQoOS42MjUwMzhlLTAyKSwgIFFUQ0ZMTEQoLTIuMDM1MTQwZS0wNSksCisgICAgUVRDRkxMRCgxLjEwNTk2NmUtMDMpLCAgUVRDRkxMRCgtNi4zMDQ4NDFlLTAzKSwgUVRDRkxMRCgtNC4xODA1NTVlLTAxKSwKKyAgICBRVENGTExEKDYuNjIyMzI4ZS0wMiksICBRVENGTExEKC0zLjA3NzE0NmUtMDUpLCBRVENGTExEKDEuMjAxODE0ZS0wMyksCisgICAgUVRDRkxMRCgtNy4xNTI4NDJlLTAzKSwgUVRDRkxMRCgtNC41MjM2ODBlLTAxKSwgUVRDRkxMRCg0LjA0MjcwN2UtMDIpLAorICAgIFFUQ0ZMTEQoLTMuODM2MTUzZS0wNSksIFFUQ0ZMTEQoMS4yNzU2OTRlLTAzKSwgIFFUQ0ZMTEQoLTguMTQyMDcxZS0wMyksCisgICAgUVRDRkxMRCgtNC44Njk0MTNlLTAxKSwgUVRDRkxMRCgxLjc0MTMyMGUtMDIpLAogfTsKIAorUkFNX0FMSUdOCitjb25zdCBGSVhQX1BGVCBxbWZfY2xkZmJfMTYwW1FNRjE2MF9DTERGQl9QRlRfVEFCTEVfU0laRV0gPSB7CisgICAgUVRDRkxMRCg2LjExNDE1NmUtMDcpLCAgUVRDRkxMRCgtNC45MjkzNzhlLTA2KSwgUVRDRkxMRCgtMS4xNzMyNzBlLTAzKSwKKyAgICBRVENGTExEKDkuOTg1NzgxZS0wMyksICBRVENGTExEKDUuMzg1MDgxZS0wMSksICBRVENGTExEKDIuMTE5Mjk4ZS0wNyksCisgICAgUVRDRkxMRCg4LjAwMTE1MmUtMDYpLCAgUVRDRkxMRCgtOS41NzgzNDZlLTA0KSwgUVRDRkxMRCgxLjMxNTkxMGUtMDIpLAorICAgIFFUQ0ZMTEQoNi4wNjY0NTRlLTAxKSwgIFFUQ0ZMTEQoOC4wOTc4NDVlLTA3KSwgIFFUQ0ZMTEQoMS44NDkwMjdlLTA1KSwKKyAgICBRVENGTExEKC0xLjIxOTU2N2UtMDMpLCBRVENGTExEKDEuNzIxNzE4ZS0wMiksICBRVENGTExEKDYuNzM0NDg2ZS0wMSksCisgICAgUVRDRkxMRCgtMS4xMzU0NzhlLTA4KSwgUVRDRkxMRCg1LjYzMjk3NmUtMDYpLCAgUVRDRkxMRCgtNy4zOTIyNzhlLTA0KSwKKyAgICBRVENGTExEKDIuMjI2Mzg4ZS0wMiksICBRVENGTExEKDcuMzc2OTI5ZS0wMSksICBRVENGTExEKDYuMzQ3NzUxZS0wOCksCisgICAgUVRDRkxMRCgxLjQ1NDQyNWUtMDUpLCAgUVRDRkxMRCgtMS4xMDUyMzllLTA0KSwgUVRDRkxMRCgyLjg0NTgwOGUtMDIpLAorICAgIFFUQ0ZMTEQoNy45ODE4NDhlLTAxKSwgIFFUQ0ZMTEQoLTIuODM4MzI4ZS0wNiksIFFUQ0ZMTEQoMy40MTQ3NDllLTA2KSwKKyAgICBRVENGTExEKDEuMjcyMjU0ZS0wMyksICBRVENGTExEKDMuNTk0ODIxZS0wMiksICBRVENGTExEKDguNTM5MjY1ZS0wMSksCisgICAgUVRDRkxMRCg3LjExNjA0OWUtMDgpLCAgUVRDRkxMRCg0LjAzMTEyNWUtMDUpLCAgUVRDRkxMRCgyLjEzNjMwNGUtMDMpLAorICAgIFFUQ0ZMTEQoNC40NzczMThlLTAyKSwgIFFUQ0ZMTEQoOS4wMzgxMzVlLTAxKSwgIFFUQ0ZMTEQoNC4wOTgyMjdlLTA3KSwKKyAgICBRVENGTExEKDcuNDg0MjQwZS0wNSksICBRVENGTExEKDIuNzE2MDc4ZS0wMyksICBRVENGTExEKDUuNTAyNzY2ZS0wMiksCisgICAgUVRDRkxMRCg5LjQ2NjgyNWUtMDEpLCAgUVRDRkxMRCg0LjkzNDMyN2UtMDcpLCAgUVRDRkxMRCg3LjU1NzcyNWUtMDUpLAorICAgIFFUQ0ZMTEQoMi4wNTg3NDhlLTAzKSwgIFFUQ0ZMTEQoNi42MjYwNjJlLTAyKSwgIFFUQ0ZMTEQoOS44MTgzOTZlLTAxKSwKKyAgICBRVENGTExEKC00LjkzMzg5NmUtMDgpLCBRVENGTExEKC0zLjkwNzM2MGUtMDUpLCBRVENGTExEKDMuNzUzOTY0ZS0wNCksCisgICAgUVRDRkxMRCg3LjgwNjYxMGUtMDIpLCAgUVRDRkxMRCgxLjAwODk4OGUrMDApLCAgUVRDRkxMRCgtNy44NTYzNDFlLTA2KSwKKyAgICBRVENGTExEKDkuOTQ5NDgwZS0wNSksICBRVENGTExEKDcuMTc2MzMxZS0wNCksICBRVENGTExEKDguOTg3NzAyZS0wMiksCisgICAgUVRDRkxMRCgxLjAyNzc4NGUrMDApLCAgUVRDRkxMRCg0LjgyMjQ0OGUtMDcpLCAgUVRDRkxMRCgtMS4zMjc5MTRlLTA1KSwKKyAgICBRVENGTExEKDYuODU1MjIyZS0wNCksICBRVENGTExEKDEuMDExODQ3ZS0wMSksICBRVENGTExEKDEuMDM4MjQyZSswMCksCisgICAgUVRDRkxMRCg0LjQzMjY4NGUtMDcpLCAgUVRDRkxMRCgtNS42NjIwMDhlLTA1KSwgUVRDRkxMRCg1LjM2MDMxNGUtMDQpLAorICAgIFFUQ0ZMTEQoMS4xMTI3NTZlLTAxKSwgIFFUQ0ZMTEQoMS4wNDE0MzllKzAwKSwgIFFUQ0ZMTEQoLTEuODk0MjA0ZS0wNiksCisgICAgUVRDRkxMRCgtMS42MDM4OTRlLTA0KSwgUVRDRkxMRCgtMi43OTY0MzNlLTA0KSwgUVRDRkxMRCgxLjE5Mzg5NGUtMDEpLAorICAgIFFUQ0ZMTEQoMS4wMzg0NTZlKzAwKSwgIFFUQ0ZMTEQoMi4zNTA1NDFlLTA2KSwgIFFUQ0ZMTEQoLTEuOTgxNzkzZS0wNCksCisgICAgUVRDRkxMRCgtMS43MTk5NjdlLTAzKSwgUVRDRkxMRCgxLjI0OTQzN2UtMDEpLCAgUVRDRkxMRCgxLjAyODQwN2UrMDApLAorICAgIFFUQ0ZMTEQoNC44MzM3MTNlLTA2KSwgIFFUQ0ZMTEQoLTEuOTU3Nzk5ZS0wNCksIFFUQ0ZMTEQoLTMuMTU5NjQwZS0wMyksCisgICAgUVRDRkxMRCgxLjI3NDYwNWUtMDEpLCAgUVRDRkxMRCgxLjAwOTcwMWUrMDApLCAgUVRDRkxMRCg0LjcyNDI2M2UtMDYpLAorICAgIFFUQ0ZMTEQoLTEuMTgxNTE4ZS0wNSksIFFUQ0ZMTEQoLTQuMjQzMzk5ZS0wMyksIFFUQ0ZMTEQoMS4yNzAzOTBlLTAxKSwKKyAgICBRVENGTExEKDkuNzQ4ODU0ZS0wMSksICBRVENGTExEKDEuMDA3NzI0ZS0wNiksICBRVENGTExEKDIuNTg1NzQxZS0wNSksCisgICAgUVRDRkxMRCgtNC43MTM0NDVlLTAzKSwgUVRDRkxMRCgxLjIzMTEyMGUtMDEpLCAgUVRDRkxMRCg5LjI0Njc3MGUtMDEpLAorICAgIFFUQ0ZMTEQoMi45MDg0NTRlLTA2KSwgIFFUQ0ZMTEQoMy4xMzczNzRlLTA1KSwgIFFUQ0ZMTEQoLTQuMjMwMjkzZS0wMyksCisgICAgUVRDRkxMRCgxLjE0NDI2OWUtMDEpLCAgUVRDRkxMRCg4LjY4MTA2N2UtMDEpLCAgUVRDRkxMRCgtNC4xMjg4NzdlLTA4KSwKKyAgICBRVENGTExEKDEuODcwMzU4ZS0wNSksICBRVENGTExEKC0yLjg0MjkyNGUtMDMpLCBRVENGTExEKDEuMDAzNzE1ZS0wMSksCisgICAgUVRDRkxMRCg4LjA4MDM0NGUtMDEpLCAgUVRDRkxMRCgxLjgwNjY0OWUtMDcpLCAgUVRDRkxMRCgzLjU1NzA3MWUtMDUpLAorICAgIFFUQ0ZMTEQoLTguMzkyNDIyZS0wNCksIFFUQ0ZMTEQoOC4wNjUyMjVlLTAyKSwgIFFUQ0ZMTEQoNy40NjQ0MDVlLTAxKSwKKyAgICBRVENGTExEKDIuMzUyNjA5ZS0wNiksICBRVENGTExEKDEuMDkwMDc3ZS0wNCksICBRVENGTExEKDcuNDk3ODQ4ZS0wNCksCisgICAgUVRDRkxMRCg1LjUyOTYzMWUtMDIpLCAgUVRDRkxMRCg2LjgzMTU5MWUtMDEpLCAgUVRDRkxMRCgxLjE1OTY1N2UtMDcpLAorICAgIFFUQ0ZMTEQoNC41ODU5OTBlLTA1KSwgIFFUQ0ZMTEQoMi4wNzkzNDZlLTAzKSwgIFFUQ0ZMTEQoMi40MzQ4ODNlLTAyKSwKKyAgICBRVENGTExEKDYuMTc5MjA4ZS0wMSksICBRVENGTExEKDguODU5NjA2ZS0wNyksICBRVENGTExEKDEuNDAzMzQ1ZS0wNCksCisgICAgUVRDRkxMRCgxLjA2NTU4MGUtMDMpLCAgUVRDRkxMRCgtMS4yMjA1NzJlLTAyKSwgUVRDRkxMRCg1LjUxNDUyMWUtMDEpLAorICAgIFFUQ0ZMTEQoLTEuMDM4Mjc4ZS0wNiksIFFUQ0ZMTEQoLTEuMzY4MTYyZS0wNCksIFFUQ0ZMTEQoMi45MzIzMzllLTA0KSwKKyAgICBRVENGTExEKC01LjQxNjM3NGUtMDIpLCBRVENGTExEKDQuODQzMTA5ZS0wMSksICBRVENGTExEKDcuODIwMDMwZS0wOCksCisgICAgUVRDRkxMRCgzLjkzNDU0NGUtMDUpLCAgUVRDRkxMRCgtNi42Mzg0OTFlLTA0KSwgUVRDRkxMRCgtMS4wMTI2NjRlLTAxKSwKKyAgICBRVENGTExEKDQuMTY1MTUwZS0wMSksICBRVENGTExEKC04LjM5MzQzMmUtMDYpLCBRVENGTExEKC01LjA1MzY0NmUtMDUpLAorICAgIFFUQ0ZMTEQoLTEuMzgxOTEyZS0wMyksIFFUQ0ZMTEQoLTEuNTMyMjI1ZS0wMSksIFFUQ0ZMTEQoMy40ODczMDFlLTAxKSwKKyAgICBRVENGTExEKC0xLjQ1NTg5N2UtMDYpLCBRVENGTExEKDQuODgwOTYyZS0wNSksICBRVENGTExEKC0yLjI3NDM5MmUtMDMpLAorICAgIFFUQ0ZMTEQoLTIuMDk2NzM3ZS0wMSksIFFUQ0ZMTEQoMi44MTgyMzRlLTAxKSwgIFFUQ0ZMTEQoLTEuNDM0MzE3ZS0wNiksCisgICAgUVRDRkxMRCgyLjIwMzY4N2UtMDQpLCAgUVRDRkxMRCgtMy4zNTczMTJlLTAzKSwgUVRDRkxMRCgtMi43MDE2OTNlLTAxKSwKKyAgICBRVENGTExEKDIuMTQ3NDQxZS0wMSksICBRVENGTExEKDcuMDkyMTk5ZS0wNiksICBRVENGTExEKDQuNjgxNjcwZS0wNCksCisgICAgUVRDRkxMRCgtNC42MDE1OTNlLTAzKSwgUVRDRkxMRCgtMy4zNDE5NjhlLTAxKSwgUVRDRkxMRCgxLjQ2MTgwNWUtMDEpLAorICAgIFFUQ0ZMTEQoLTEuMTE2MTIzZS0wNSksIFFUQ0ZMTEQoMS4wNzIxOTZlLTAzKSwgIFFUQ0ZMTEQoLTUuOTI1MTQxZS0wMyksCisgICAgUVRDRkxMRCgtNC4wMTAyODVlLTAxKSwgUVRDRkxMRCg4LjA3Nzg2MmUtMDIpLCAgUVRDRkxMRCgtMy43NzUzODVlLTA1KSwKKyAgICBRVENGTExEKDEuMjQ0ODQxZS0wMyksICBRVENGTExEKC03LjYyODQ2OWUtMDMpLCBRVENGTExEKC00LjY5NjI0MGUtMDEpLAorICAgIFFUQ0ZMTEQoMi45MDE4ODllLTAyKSwKK307CiAKK1JBTV9BTElHTgorY29uc3QgRklYUF9QRlQgcW1mX2NsZGZiXzgwW1FNRjgwX0NMREZCX1BGVF9UQUJMRV9TSVpFXSA9IHsKKyAgICBRVENGTExEKDYuOTY2OTIxZS0wNyksICBRVENGTExEKDkuMDI1MTc2ZS0wNiksICBRVENGTExEKC0xLjA3MzMyOGUtMDMpLAorICAgIFFUQ0ZMTEQoMS4xNDY1ODVlLTAyKSwgIFFUQ0ZMTEQoNS43MjY3NThlLTAxKSwgIFFUQ0ZMTEQoLTIuMzIzMDQ2ZS0wOSksCisgICAgUVRDRkxMRCgxLjAxMjYzOGUtMDUpLCAgUVRDRkxMRCgtMS4wODQ2NTRlLTAzKSwgUVRDRkxMRCgxLjk2MDUxNWUtMDIpLAorICAgIFFUQ0ZMTEQoNy4wNTk3MTJlLTAxKSwgIFFUQ0ZMTEQoMS4yMzAxNTllLTA3KSwgIFFUQ0ZMTEQoNC42MzkxMjZlLTA1KSwKKyAgICBRVENGTExEKDYuMzk4OTExZS0wNCksICBRVENGTExEKDMuMjA0NTA2ZS0wMiksICBRVENGTExEKDguMjY3MTI1ZS0wMSksCisgICAgUVRDRkxMRCgyLjg2NTMzOWUtMDcpLCAgUVRDRkxMRCg2LjI3Mzc1OWUtMDUpLCAgUVRDRkxMRCgyLjU1MDQ2NGUtMDMpLAorICAgIFFUQ0ZMTEQoNC45Nzc0NTNlLTAyKSwgIFFUQ0ZMTEQoOS4yNjE4MThlLTAxKSwgIFFUQ0ZMTEQoMy43MzgyNTdlLTA3KSwKKyAgICBRVENGTExEKC0yLjQyOTAyMWUtMDYpLCBRVENGTExEKDEuMzc1OTIxZS0wMyksICBRVENGTExEKDcuMjEyNzU0ZS0wMiksCisgICAgUVRDRkxMRCg5Ljk2NDMzM2UtMDEpLCAgUVRDRkxMRCgxLjA3NzAzOWUtMDgpLCAgUVRDRkxMRCgtOC41MzI5NzZlLTA2KSwKKyAgICBRVENGTExEKDcuMTQ3MDIyZS0wNCksICBRVENGTExEKDkuNTYzNDMyZS0wMiksICBRVENGTExEKDEuMDM0MDEyZSswMCksCisgICAgUVRDRkxMRCgzLjA4NjA0NmUtMDcpLCAgUVRDRkxMRCgtNy45ODY4NzBlLTA1KSwgUVRDRkxMRCgyLjIwMzc4MWUtMDQpLAorICAgIFFUQ0ZMTEQoMS4xNTYyMjFlLTAxKSwgIFFUQ0ZMTEQoMS4wNDA3MThlKzAwKSwgIFFUQ0ZMTEQoNS41NDI4MDRlLTA2KSwKKyAgICBRVENGTExEKC0xLjczNjc1N2UtMDQpLCBRVENGTExEKC0yLjQ3NTQyOGUtMDMpLCBRVENGTExEKDEuMjY2MjA2ZS0wMSksCisgICAgUVRDRkxMRCgxLjAyMDEwMGUrMDApLCAgUVRDRkxMRCgzLjQxNTE2OGUtMDYpLCAgUVRDRkxMRCg2LjI5MDIwMWUtMDYpLAorICAgIFFUQ0ZMTEQoLTQuNTc2NzA5ZS0wMyksIFFUQ0ZMTEQoMS4yNTYzNzBlLTAxKSwgIFFUQ0ZMTEQoOS41MDYzNDRlLTAxKSwKKyAgICBRVENGTExEKC0xLjk5ODYzMmUtMDkpLCBRVENGTExEKDMuMDE3NTE0ZS0wNSksICBRVENGTExEKC0zLjYyNzM5NGUtMDMpLAorICAgIFFUQ0ZMTEQoMS4wODEwMDNlLTAxKSwgIFFUQ0ZMTEQoOC4zODMyNDVlLTAxKSwgIFFUQ0ZMTEQoMi41OTA5MDBlLTA3KSwKKyAgICBRVENGTExEKDkuNjE0MDA0ZS0wNSksICBRVENGTExEKDIuMTgzNzg2ZS0wNiksICBRVENGTExEKDYuODY3MTQxZS0wMiksCisgICAgUVRDRkxMRCg3LjE1MDUyM2UtMDEpLCAgUVRDRkxMRCgxLjQwODE3MmUtMDcpLCAgUVRDRkxMRCg1LjIwMzIxN2UtMDUpLAorICAgIFFUQ0ZMTEQoMS41ODQ0MTBlLTAzKSwgIFFUQ0ZMTEQoNi43NTM3NDllLTAzKSwgIFFUQ0ZMTEQoNS44NDc4NThlLTAxKSwKKyAgICBRVENGTExEKC05LjIzNDMyNmUtMDcpLCBRVENGTExEKDYuNDc3MTgzZS0wNiksICBRVENGTExEKC0yLjEyMzk2OWUtMDQpLAorICAgIFFUQ0ZMTEQoLTcuNzA5MjMwZS0wMiksIFFUQ0ZMTEQoNC41MDQ3OThlLTAxKSwgIFFUQ0ZMTEQoLTIuNDY0MDMzZS0wOCksCisgICAgUVRDRkxMRCgxLjg4ODYyNmUtMDUpLCAgUVRDRkxMRCgtMS44MTIwMDNlLTAzKSwgUVRDRkxMRCgtMS44MDkxMjdlLTAxKSwKKyAgICBRVENGTExEKDMuMTUxNzQzZS0wMSksICBRVENGTExEKC04LjM0NDg4MmUtMDcpLCBRVENGTExEKDIuNTM4NTI4ZS0wNCksCisgICAgUVRDRkxMRCgtMy45NzI2MjZlLTAzKSwgUVRDRkxMRCgtMy4wMTc3OTNlLTAxKSwgUVRDRkxMRCgxLjgwNTY1OGUtMDEpLAorICAgIFFUQ0ZMTEQoLTIuNzIwNTI2ZS0wNSksIFFUQ0ZMTEQoMS4xNTAwMDllLTAzKSwgIFFUQ0ZMTEQoLTYuNzEyODIyZS0wMyksCisgICAgUVRDRkxMRCgtNC4zNTE3NDBlLTAxKSwgUVRDRkxMRCg1LjI3NjY4N2UtMDIpLAorfTsKIAorI2lmIGRlZmluZWQoUU1GX0NPRUZGXzE2QklUKQorI2RlZmluZSBRVE1GTExEKHgpIEZMMkZYQ09OU1RfU0dMKHggLyAoZmxvYXQpKDEgPDwgUU1GX01QU0xERkJfUEZUX1NDQUxFKSkKKyNkZWZpbmUgUVRNRkxMRFQoeCkgRlhfREJMMkZYQ09OU1RfU0dMKHgpCisjZWxzZQorI2RlZmluZSBRVE1GTExEKHgpIEZMMkZYQ09OU1RfREJMKHggLyAoZmxvYXQpKDEgPDwgUU1GX01QU0xERkJfUEZUX1NDQUxFKSkKKyNkZWZpbmUgUVRNRkxMRFQoeCkgKEZJWFBfREJMKSh4KQorI2VuZGlmCiAKKy8qIQorICBcbmFtZSBRTUYKKyAgXGJyaWVmICBRTUYtVGFibGUKKyAgICAgICAgICAzMiBjaGFubmVscywgTiA9IDMyMCwKIAorICBUaGUgY29lZmZpY2llbnRzIGFyZSBkZXJpdmVkIGZyb20gdGhlIE1QUyBMb3cgRGVsYXkgY29lZmZpY2llbnQgc2V0CisgIHdpdGggNjQwIHNhbXBsZXMuIFRoZSBjb2VmZmljaWVudHMgYXJlIGludGVycG9sYXRlZCBhbmQgcmVhcnJhbmdlZAorICBpbiB0aGUgZm9sbG93aW5nIHdheSBjb21wYXJlZCB0byB0aGUgcmVmZXJlbmNlOgorCisgIHFtZl9tcHNsZGZiXzMyMFswXSAgID0gKHFtZl82NF9yZWZlcmVuY2VbICAwXSArIHFtZl82NF9yZWZlcmVuY2VbICAxXSkvMi4wOworICBxbWZfbXBzbGRmYl8zMjBbMV0gICA9IChxbWZfNjRfcmVmZXJlbmNlWzEyOF0gKyBxbWZfNjRfcmVmZXJlbmNlWzEyOV0pLzIuMDsKKyAgcW1mX21wc2xkZmJfMzIwWzJdICAgPSAocW1mXzY0X3JlZmVyZW5jZVsyNTZdICsgcW1mXzY0X3JlZmVyZW5jZVsyNTddKS8yLjA7CisgIHFtZl9tcHNsZGZiXzMyMFszXSAgID0gKHFtZl82NF9yZWZlcmVuY2VbMzg0XSArIHFtZl82NF9yZWZlcmVuY2VbMzg1XSkvMi4wOworICBxbWZfbXBzbGRmYl8zMjBbNF0gICA9IChxbWZfNjRfcmVmZXJlbmNlWzUxMl0gKyBxbWZfNjRfcmVmZXJlbmNlWzUxM10pLzIuMDsKKworICBxbWZfbXBzbGRmYl8zMjBbNV0gICA9IChxbWZfNjRfcmVmZXJlbmNlWyAgMl0gKyBxbWZfNjRfcmVmZXJlbmNlWyAgM10pLzIuMDsKKyAgcW1mX21wc2xkZmJfMzIwWzZdICAgPSAocW1mXzY0X3JlZmVyZW5jZVsxMzBdICsgcW1mXzY0X3JlZmVyZW5jZVsxMzFdKS8yLjA7CisgIHFtZl9tcHNsZGZiXzMyMFs3XSAgID0gKHFtZl82NF9yZWZlcmVuY2VbMjU4XSArIHFtZl82NF9yZWZlcmVuY2VbMjU5XSkvMi4wOworICBxbWZfbXBzbGRmYl8zMjBbOF0gICA9IChxbWZfNjRfcmVmZXJlbmNlWzM4Nl0gKyBxbWZfNjRfcmVmZXJlbmNlWzM4N10pLzIuMDsKKyAgcW1mX21wc2xkZmJfMzIwWzldICAgPSAocW1mXzY0X3JlZmVyZW5jZVs1MTRdICsgcW1mXzY0X3JlZmVyZW5jZVs1MTVdKS8yLjA7CisgIC4KKyAgLgorICAuCisgIHFtZl9tcHNsZGZiXzMyMFszMTVdID0gKHFtZl82NF9yZWZlcmVuY2VbMTI2XSArIHFtZl82NF9yZWZlcmVuY2VbMTI3XSkvMi4wOworICBxbWZfbXBzbGRmYl8zMjBbMzE2XSA9IChxbWZfNjRfcmVmZXJlbmNlWzI1NF0gKyBxbWZfNjRfcmVmZXJlbmNlWzI1NV0pLzIuMDsKKyAgcW1mX21wc2xkZmJfMzIwWzMxN10gPSAocW1mXzY0X3JlZmVyZW5jZVszODJdICsgcW1mXzY0X3JlZmVyZW5jZVszODNdKS8yLjA7CisgIHFtZl9tcHNsZGZiXzMyMFszMThdID0gKHFtZl82NF9yZWZlcmVuY2VbNTEwXSArIHFtZl82NF9yZWZlcmVuY2VbNTExXSkvMi4wOworICBxbWZfbXBzbGRmYl8zMjBbMzE5XSA9IChxbWZfNjRfcmVmZXJlbmNlWzYzOF0gKyBxbWZfNjRfcmVmZXJlbmNlWzYzOV0pLzIuMDsKKworICBUaGUgZmlsdGVyIG91dHB1dCBpcyByZXF1aXJlZCB0byBiZSBzY2FsZWQgYnkgMSBiaXQuCisKKyAgXHNob3dpbml0aWFsaXplcgorKi8KKy8vQHsKK2NvbnN0IEZJWFBfUEZUIHFtZl9tcHNsZGZiXzMyMFtRTUYzMjBfTVBTTERGQl9QRlRfVEFCTEVfU0laRV0gPSB7CisgICAgUVRNRkxMRCgxLjA3Nzc3MjU0MDJlLTAwNCksICBRVE1GTExEKC05LjQ3MDM4MDYwOTllLTAwNCksCisgICAgUVRNRkxMRCg2LjEyODY0MzYzOTRlLTAwMyksICBRVE1GTExEKC05LjAxNjE5NjQyOTdlLTAwMiksCisgICAgUVRNRkxMRCg1LjU1NTQ0MDE4NzVlLTAwMSksICBRVE1GTExEKDEuMjczMTMxNjM4M2UtMDA0KSwKKyAgICBRVE1GTExEKC0xLjIzMTEzMzQ3MjJlLTAwMyksIFFUTUZMTEQoNC45NDY4MjA5MDM2ZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuMTMwNTAyNjcxMGUtMDAxKSwgUVRNRkxMRCg1LjI5OTA0MTg2NzNlLTAwMSksCisgICAgUVRNRkxMRCgxLjE5Mjc0MTI1NjFlLTAwNCksICBRVE1GTExEKC0xLjUxMjgyMDM2NjhlLTAwMyksCisgICAgUVRNRkxMRCgzLjU3OTQ1MzMzMjNlLTAwMyksICBRVE1GTExEKC0xLjM2ODEyMDMxMjdlLTAwMSksCisgICAgUVRNRkxMRCg1LjA0MjMzMTIxODdlLTAwMSksICBRVE1GTExEKDEuMDAwNjM4MDc2MmUtMDA0KSwKKyAgICBRVE1GTExEKC0xLjc5MjUwNTg0OTJlLTAwMyksIFFUTUZMTEQoMi4wMTY0MDM0Nzk1ZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuNjEzOTY0MTQwNGUtMDAxKSwgUVRNRkxMRCg0Ljc4NjEwMjQ3MzdlLTAwMSksCisgICAgUVRNRkxMRCg3LjI4MjYyMDIwODZlLTAwNSksICBRVE1GTExEKC0yLjA2OTczNDAzNjllLTAwMyksCisgICAgUVRNRkxMRCgyLjQ4Mzg5Njk2OTRlLTAwNCksICBRVE1GTExEKC0xLjg2NzQ3NTY1ODdlLTAwMSksCisgICAgUVRNRkxMRCg0LjUzMTEzMzc3MDllLTAwMSksICBRVE1GTExEKDMuODgwODAxNTIzM2UtMDA1KSwKKyAgICBRVE1GTExEKC0yLjM0MjkwNDQ1MjJlLTAwMyksIFFUTUZMTEQoLTEuNzMzMTU0NjQwNWUtMDAzKSwKKyAgICBRVE1GTExEKC0yLjEyODA0ODgzNzJlLTAwMSksIFFUTUZMTEQoNC4yNzgxODAwMDMyZS0wMDEpLAorICAgIFFUTUZMTEQoLTUuNDM1OTU4ODgzMGUtMDA3KSwgUVRNRkxMRCgtMi42MTEyNjY5MTQ4ZS0wMDMpLAorICAgIFFUTUZMTEQoLTMuOTM1NzI0OTYyNWUtMDAzKSwgUVRNRkxMRCgtMi4zOTUwMzU5MjI1ZS0wMDEpLAorICAgIFFUTUZMTEQoNC4wMjc5ODAyNjgwZS0wMDEpLCAgUVRNRkxMRCgtNC4zNjE0NTQ5MjEzZS0wMDUpLAorICAgIFFUTUZMTEQoLTIuODc0MTQ1NTE3MWUtMDAzKSwgUVRNRkxMRCgtNi4zNjU1MDc4NDExZS0wMDMpLAorICAgIFFUTUZMTEQoLTIuNjY3NzQ3MTM5OWUtMDAxKSwgUVRNRkxMRCgzLjc4MTI1MDcxNTNlLTAwMSksCisgICAgUVRNRkxMRCgtOC45MDQwMTU3MDM2ZS0wMDUpLCBRVE1GTExEKC0zLjEzMDg4ODEwMDdlLTAwMyksCisgICAgUVRNRkxMRCgtOS4wMjc1NTU1ODQ5ZS0wMDMpLCBRVE1GTExEKC0yLjk0NTQ1NTAxNDdlLTAwMSksCisgICAgUVRNRkxMRCgzLjUzODY4MzA1NjhlLTAwMSksICBRVE1GTExEKC0xLjM1MTkwNDY0NzllLTAwNCksCisgICAgUVRNRkxMRCgtMy4zODA4NzMyNDA1ZS0wMDMpLCBRVE1GTExEKC0xLjE5MjU0MDY3NTRlLTAwMiksCisgICAgUVRNRkxMRCgtMy4yMjczOTQyMjMyZS0wMDEpLCBRVE1GTExEKDMuMzAwOTM5Nzk4NGUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjgwNDU1Nzk3ODJlLTAwNCksIFFUTUZMTEQoLTMuNjIzNjgzMDA1NmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjUwNjEzMTE0MjRlLTAwMiksIFFUTUZMTEQoLTMuNTEyNzcwNTMzNmUtMDAxKSwKKyAgICBRVE1GTExEKDMuMDY4NjUwOTYwOWUtMDAxKSwgIFFUTUZMTEQoLTIuMjM5NjgwMDM0MWUtMDA0KSwKKyAgICBRVE1GTExEKC0zLjg1ODc5NjA4ODBlLTAwMyksIFFUTUZMTEQoLTEuODQzNTgzNTgzOGUtMDAyKSwKKyAgICBRVE1GTExEKC0zLjgwMDc1Mjc1OTBlLTAwMSksIFFUTUZMTEQoMi44NDI0MDY5Mjg1ZS0wMDEpLAorICAgIFFUTUZMTEQoLTIuNjQxNjk3NjQ3MWUtMDA0KSwgUVRNRkxMRCgtNC4wODU5MDAyNjIwZS0wMDMpLAorICAgIFFUTUZMTEQoLTIuMjA0ODAyMjU5OGUtMDAyKSwgUVRNRkxMRCgtNC4wOTA0OTE1MzMzZS0wMDEpLAorICAgIFFUTUZMTEQoMi42MjI3NTc1NTQxZS0wMDEpLCAgUVRNRkxMRCgtMy4wMDAxODg3MzUzZS0wMDQpLAorICAgIFFUTUZMTEQoLTQuMzA0NTU4OTcwMGUtMDAzKSwgUVRNRkxMRCgtMi41ODk0OTg0NjAzZS0wMDIpLAorICAgIFFUTUZMTEQoLTQuMzgxMTA2NDk1OWUtMDAxKSwgUVRNRkxMRCgyLjQxMDIwNDQxMDZlLTAwMSksCisgICAgUVRNRkxMRCgtMy4zMDgzMTU2NDUwZS0wMDQpLCBRVE1GTExEKC00LjUxNDU0ODQ2MTllLTAwMyksCisgICAgUVRNRkxMRCgtMi45OTcyMTIxMTE5ZS0wMDIpLCBRVE1GTExEKC00LjY3MTcwMDAwMDhlLTAwMSksCisgICAgUVRNRkxMRCgyLjIwNTIwMDc5MTRlLTAwMSksICBRVE1GTExEKC0zLjU2MTQ0NDc1NTJlLTAwNCksCisgICAgUVRNRkxMRCgtNC43MTU1OTUzOTQ0ZS0wMDMpLCBRVE1GTExEKC0zLjQyNzI4OTQyNjNlLTAwMiksCisgICAgUVRNRkxMRCgtNC45NjEzNTc3MTI3ZS0wMDEpLCBRVE1GTExEKDIuMDA4MTQ0MjU5NWUtMDAxKSwKKyAgICBRVE1GTExEKC0zLjc1Nzk4MjYzMTJlLTAwNCksIFFUTUZMTEQoLTQuOTA3Mjk4ODMzMWUtMDAzKSwKKyAgICBRVE1GTExEKC0zLjg3ODg3ODA1NzBlLTAwMiksIFFUTUZMTEQoLTUuMjQ5MTUyNzc5NmUtMDAxKSwKKyAgICBRVE1GTExEKDEuODE5MzgwODE5OGUtMDAxKSwgIFFUTUZMTEQoLTMuODk5MzczOTg3MmUtMDA0KSwKKyAgICBRVE1GTExEKC01LjA4OTMzNTE0MzZlLTAwMyksIFFUTUZMTEQoLTQuMzUwOTAxMDIyNmUtMDAyKSwKKyAgICBRVE1GTExEKC01LjUzNDE0ODIxNjJlLTAwMSksIFFUTUZMTEQoMS42MzkxOTc0Njg4ZS0wMDEpLAorICAgIFFUTUZMTEQoLTMuOTkxMjg5OTk1NmUtMDA0KSwgUVRNRkxMRCgtNS4yNjE1Mzg1NTAzZS0wMDMpLAorICAgIFFUTUZMTEQoLTQuODQyMTE4NTQ2NGUtMDAyKSwgUVRNRkxMRCgtNS44MTU0MDM0NjE1ZS0wMDEpLAorICAgIFFUTUZMTEQoMS40Njc4MjA3MDQwZS0wMDEpLCAgUVRNRkxMRCgtNC4wNDIxOTY5NjA3ZS0wMDQpLAorICAgIFFUTUZMTEQoLTUuNDIzNjc5OTQ3OWUtMDAzKSwgUVRNRkxMRCgtNS4zNTEwNjA2Mjg5ZS0wMDIpLAorICAgIFFUTUZMTEQoLTYuMDkxOTc4NTUwMGUtMDAxKSwgUVRNRkxMRCgxLjMwNTQxNjUyNDRlLTAwMSksCisgICAgUVRNRkxMRCgtNC4wNjQ1NDc4MjkzZS0wMDQpLCBRVE1GTExEKC01LjU3NTY2NzEzNTRlLTAwMyksCisgICAgUVRNRkxMRCgtNS44NzYwMDU0NDEwZS0wMDIpLCBRVE1GTExEKC02LjM2MjkzODg4MDllLTAwMSksCisgICAgUVRNRkxMRCgxLjE1MjA5MjUxNjRlLTAwMSksICBRVE1GTExEKC00LjA3MjA5Mzg3MDVlLTAwNCksCisgICAgUVRNRkxMRCgtNS43MTczODM2OTc2ZS0wMDMpLCBRVE1GTExEKC02LjQxNDk5OTgxMjhlLTAwMiksCisgICAgUVRNRkxMRCgtNi42MjczNTgxOTgyZS0wMDEpLCBRVE1GTExEKDEuMDA3ODk2NTEyN2UtMDAxKSwKKyAgICBRVE1GTExEKC00LjA4MTI3MzgwMDdlLTAwNCksIFFUTUZMTEQoLTUuODQ4ODkxMTAxOGUtMDAzKSwKKyAgICBRVE1GTExEKC02Ljk2NTg1Njk5OTJlLTAwMiksIFFUTUZMTEQoLTYuODg0MzIyMTY2NGUtMDAxKSwKKyAgICBRVE1GTExEKDguNzI4MTU1NDkzN2UtMDAyKSwgIFFUTUZMTEQoLTQuMTEyMDkxMjY0N2UtMDA0KSwKKyAgICBRVE1GTExEKC01Ljk3MDM0MzAxNjFlLTAwMyksIFFUTUZMTEQoLTcuNTI2MTM1NDQ0NmUtMDAyKSwKKyAgICBRVE1GTExEKC03LjEzMjkzNzkwODJlLTAwMSksIFFUTUZMTEQoNy40Njc4MDMzNTkwZS0wMDIpLAorICAgIFFUTUZMTEQoLTQuMTgzODg1MTc1N2UtMDA0KSwgUVRNRkxMRCgtNi4wODIxMjg3MzM0ZS0wMDMpLAorICAgIFFUTUZMTEQoLTguMDkzMTc2NzgyMWUtMDAyKSwgUVRNRkxMRCgtNy4zNzIzMzYzODc2ZS0wMDEpLAorICAgIFFUTUZMTEQoNi4yOTY2MjQ5ODgzZS0wMDIpLCAgUVRNRkxMRCgtNC4zMTQ4MTIyNDk1ZS0wMDQpLAorICAgIFFUTUZMTEQoLTYuMTg0Nzk0MDA4N2UtMDAzKSwgUVRNRkxMRCgtOC42NjQwNzkwMTA1ZS0wMDIpLAorICAgIFFUTUZMTEQoLTcuNjAxNjc4MzcxNGUtMDAxKSwgUVRNRkxMRCg1LjIxMjgyNjI4MThlLTAwMiksCisgICAgUVRNRkxMRCgtNC41MjI5NTM4MjI3ZS0wMDQpLCBRVE1GTExEKC02LjI3OTE1NDY4MDdlLTAwMyksCisgICAgUVRNRkxMRCgtOS4yMzU3MTI4ODU5ZS0wMDIpLCBRVE1GTExEKC03LjgyMDE1ODYwMDhlLTAwMSksCisgICAgUVRNRkxMRCg0LjIxMzk5MTc2MTJlLTAwMiksICBRVE1GTExEKC00LjgyMTEyODA5NTVlLTAwNCksCisgICAgUVRNRkxMRCgtNi4zNjYxOTMyOTQ1ZS0wMDMpLCBRVE1GTExEKC05LjgwNDcxODE5NjRlLTAwMiksCisgICAgUVRNRkxMRCgtOC4wMjcwMTIzNDgyZS0wMDEpLCBRVE1GTExEKDMuMjk3MjM5NTQyMGUtMDAyKSwKKyAgICBRVE1GTExEKC01LjIxOTY2NzIxODZlLTAwNCksIFFUTUZMTEQoLTYuNDQ3MTIzMzYzNmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjAzNjc1MjYxMTRlLTAwMSksIFFUTUZMTEQoLTguMjIxNTIzMTY1N2UtMDAxKSwKKyAgICBRVE1GTExEKDIuNDU4OTgwMzA3MGUtMDAyKSwgIFFUTUZMTEQoLTUuNzI0Nzk0NDY0MmUtMDA0KSwKKyAgICBRVE1GTExEKC02LjUyMzI5NzE2ODNlLTAwMyksIFFUTUZMTEQoLTEuMDkyMDMzOTgyM2UtMDAxKSwKKyAgICBRVE1GTExEKC04LjQwMzAyMjg4NTNlLTAwMSksIFFUTUZMTEQoMS42OTUyMTU4ODgzZS0wMDIpLAorICAgIFFUTUZMTEQoLTYuMzM0Mzc4ODQ5N2UtMDA0KSwgUVRNRkxMRCgtNi41OTYzMzc1MzgyZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuMTQ1OTE5NDEyNGUtMDAxKSwgUVRNRkxMRCgtOC41NzA5MTE4ODQzZS0wMDEpLAorICAgIFFUTUZMTEQoMS4wMDA2MDc0Nzk0ZS0wMDIpLCAgUVRNRkxMRCgtNy4wNDQ5NDMwNDk2ZS0wMDQpLAorICAgIFFUTUZMTEQoLTYuNjY4MTg0ODgzOWUtMDAzKSwgUVRNRkxMRCgtMS4xOTc5OTY0Mzc1ZS0wMDEpLAorICAgIFFUTUZMTEQoLTguNzI0NjUxOTMyN2UtMDAxKSwgUVRNRkxMRCgzLjY5NjgwNTA5OTBlLTAwMyksCisgICAgUVRNRkxMRCgtNy45NjA5NTkzMzc3ZS0wMDQpLCBRVE1GTExEKC02Ljc0MDMwMTM4MThlLTAwMyksCisgICAgUVRNRkxMRCgtMS4yNDc4MTY1MzI5ZS0wMDEpLCBRVE1GTExEKC04Ljg2MzIzMjEzNThlLTAwMSksCisgICAgUVRNRkxMRCgtMS42MzQ0NDYwODkyZS0wMDMpLCBRVE1GTExEKC05LjAyMDA0NTk4MTdlLTAwNCksCisgICAgUVRNRkxMRCgtNi44MTUxMTQ5ODk5ZS0wMDMpLCBRVE1GTExEKC0xLjI5NDkyNTgwODllLTAwMSksCisgICAgUVRNRkxMRCgtOC45ODYwNzczMDg3ZS0wMDEpLCBRVE1GTExEKC01LjkyODM1NDMzNzhlLTAwMyksCisgICAgUVRNRkxMRCgtMS4wMTE2OTQzMTU4ZS0wMDMpLCBRVE1GTExEKC02Ljg5NTU4OTE3NjZlLTAwMyksCisgICAgUVRNRkxMRCgtMS4zMzg4ODA4MDcyZS0wMDEpLCBRVE1GTExEKC05LjA5MzM0MTgyNzRlLTAwMSksCisgICAgUVRNRkxMRCgtOS42NDY2NDg1NDExZS0wMDMpLCBRVE1GTExEKC0xLjEyNDQ5MzU0NDllLTAwMyksCisgICAgUVRNRkxMRCgtNi45ODM1MjEzOTQ0ZS0wMDMpLCBRVE1GTExEKC0xLjM3OTE5OTAyODBlLTAwMSksCisgICAgUVRNRkxMRCgtOS4xODQ2NzIyMzY0ZS0wMDEpLCBRVE1GTExEKC0xLjI4Mzg5NTAzODFlLTAwMiksCisgICAgUVRNRkxMRCgtMS4yMzkzOTA0NjE3ZS0wMDMpLCBRVE1GTExEKC03LjA4MDkyNDY5NzJlLTAwMyksCisgICAgUVRNRkxMRCgtMS40MTUzOTA1MjEzZS0wMDEpLCBRVE1GTExEKC05LjI1OTc2Mzk1NjFlLTAwMSksCisgICAgUVRNRkxMRCgtMS41NTM5OTIxODIwZS0wMDIpLCBRVE1GTExEKC0xLjM1NDIwMzMyNjZlLTAwMyksCisgICAgUVRNRkxMRCgtNy4xODk1MjQ4MjU3ZS0wMDMpLCBRVE1GTExEKC0xLjQ0Njk2MjY1NDZlLTAwMSksCisgICAgUVRNRkxMRCgtOS4zMTgzODUxMjQyZS0wMDEpLCBRVE1GTExEKC0xLjc3ODMyMzk0ODRlLTAwMiksCisgICAgUVRNRkxMRCgtMS40NjY5NTAxNjg4ZS0wMDMpLCBRVE1GTExEKC03LjMxMTAwMTQyMDBlLTAwMyksCisgICAgUVRNRkxMRCgtMS40NzM0MTY5ODQxZS0wMDEpLCBRVE1GTExEKC05LjM2MDM2NzA1OTdlLTAwMSksCisgICAgUVRNRkxMRCgtMS45NTk3NzM4OTgxZS0wMDIpLCBRVE1GTExEKC0xLjU3NTMyMjQ3MjVlLTAwMyksCisgICAgUVRNRkxMRCgtNy40NDY2MjIwMTAzZS0wMDMpLCBRVE1GTExEKC0xLjQ5NDI1NjU1NjBlLTAwMSksCisgICAgUVRNRkxMRCgtOS4zODU2MTMyMDMwZS0wMDEpLCBRVE1GTExEKC0yLjEwMTE1MzUwNzhlLTAwMiksCisgICAgUVRNRkxMRCgtMS42NzcxMTUyMTUwZS0wMDMpLCBRVE1GTExEKC03LjU5NzI5NTU2NzRlLTAwMyksCisgICAgUVRNRkxMRCgtMS41MDg5ODYzNTM5ZS0wMDEpLCBRVE1GTExEKC05LjM5NDA5NDk0NDBlLTAwMSksCisgICAgUVRNRkxMRCgtMi4yMDQ5ODE0NDYzZS0wMDIpLCBRVE1GTExEKC0xLjc2OTg2NzcyNTdlLTAwMyksCisgICAgUVRNRkxMRCgtNy43NjM0OTE5NDM1ZS0wMDMpLCBRVE1GTExEKC0xLjUxNzExODUxMzZlLTAwMSksCisgICAgUVRNRkxMRCgtOS4zODU4NTM0MDk4ZS0wMDEpLCBRVE1GTExEKC0yLjI3MzgyNzYwNDllLTAwMiksCisgICAgUVRNRkxMRCgtMS44NTEyOTYwNTIzZS0wMDMpLCBRVE1GTExEKC03Ljk0NTA2NDQ1NTNlLTAwMyksCisgICAgUVRNRkxMRCgtMS41MTgxNzQ3MDc5ZS0wMDEpLCBRVE1GTExEKC05LjM2MTAwMTI1MzFlLTAwMSksCisgICAgUVRNRkxMRCgtMi4zMTAxMDgwMjA5ZS0wMDIpLCBRVE1GTExEKC0xLjkxOTI2NTcyMDFlLTAwMyksCisgICAgUVRNRkxMRCgtOC4xNDEzNzA0OTAyZS0wMDMpLCBRVE1GTExEKC0xLjUxMTY4OTEyNjVlLTAwMSksCisgICAgUVRNRkxMRCgtOS4zMTk3MTkwNzYyZS0wMDEpLCBRVE1GTExEKC0yLjMxNjM0ODYyNzJlLTAwMiksCisgICAgUVRNRkxMRCgtMS45NzE2OTA0NDk5ZS0wMDMpLCBRVE1GTExEKC04LjM1MDk0MDQyMTJlLTAwMyksCisgICAgUVRNRkxMRCgtMS40OTcyMDk1MTkxZS0wMDEpLCBRVE1GTExEKC05LjI2MjI1MzA0NjBlLTAwMSksCisgICAgUVRNRkxMRCgtMi4yOTUwMDMwODYzZS0wMDIpLCBRVE1GTExEKC0yLjAwNjY2MjA3ODJlLTAwMyksCisgICAgUVRNRkxMRCgtOC41NzE1NzYzMjcxZS0wMDMpLCBRVE1GTExEKC0xLjQ3NDMwNTU0MDNlLTAwMSksCisgICAgUVRNRkxMRCgtOS4xODg5MTMxMDY5ZS0wMDEpLCBRVE1GTExEKC0yLjI0ODY2OTk3NDVlLTAwMiksCisgICAgUVRNRkxMRCgtMi4wMjI3MDU3Mzk0ZS0wMDMpLCBRVE1GTExEKC04LjgwMDU1NTk1MTllLTAwMyksCisgICAgUVRNRkxMRCgtMS40NDI1NjY5NjExZS0wMDEpLCBRVE1GTExEKC05LjEwMDA3MTE5MThlLTAwMSksCisgICAgUVRNRkxMRCgtMi4xNzk5MTM1OTUzZS0wMDIpLCBRVE1GTExEKC0yLjAxODU1MjczOTJlLTAwMyksCisgICAgUVRNRkxMRCgtOS4wMzQxMTY3NTI0ZS0wMDMpLCBRVE1GTExEKC0xLjQwMTYxMDY3MjVlLTAwMSksCisgICAgUVRNRkxMRCgtOC45OTYxNjEyMjI1ZS0wMDEpLCBRVE1GTExEKC0yLjA5MTQzODMyMzNlLTAwMiksCisgICAgUVRNRkxMRCgtMS45OTMyMzM4MDM3ZS0wMDMpLCBRVE1GTExEKC05LjI2NzQ0MTkyODRlLTAwMyksCisgICAgUVRNRkxMRCgtMS4zNTEwODE1Nzk5ZS0wMDEpLCBRVE1GTExEKC04Ljg3NzY2NDgwNDVlLTAwMSksCisgICAgUVRNRkxMRCgtMS45ODU5MDk0MTczZS0wMDIpLCBRVE1GTExEKC0xLjk0NjEwNjU1MzFlLTAwMyksCisgICAgUVRNRkxMRCgtOS40OTQ4NzI3NjM4ZS0wMDMpLCBRVE1GTExEKC0xLjI5MDY1NDI0MjBlLTAwMSksCisgICAgUVRNRkxMRCgtOC43NDUxMTU5OTU0ZS0wMDEpLCBRVE1GTExEKC0xLjg2NjA5MDI5NzdlLTAwMiksCisgICAgUVRNRkxMRCgtMS44NzcwMDUyMTIwZS0wMDMpLCBRVE1GTExEKC05LjcxMDAxMjkzNTFlLTAwMyksCisgICAgUVRNRkxMRCgtMS4yMjAwMzgwODYyZS0wMDEpLCBRVE1GTExEKC04LjU5OTEwMTMwNTBlLTAwMSksCisgICAgUVRNRkxMRCgtMS43MzQ2OTIyMzA4ZS0wMDIpLCBRVE1GTExEKC0xLjc4NTk4NjU5MTFlLTAwMyksCisgICAgUVRNRkxMRCgtOS45MDU2NDkzNDkxZS0wMDMpLCBRVE1GTExEKC0xLjEzODk3ODIyODBlLTAwMSksCisgICAgUVRNRkxMRCgtOC40NDAyNTYxMTg4ZS0wMDEpLCBRVE1GTExEKC0xLjU5NDQ5MzkxMDdlLTAwMiksCisgICAgUVRNRkxMRCgtMS42NzM0MTY5MzMwZS0wMDMpLCBRVE1GTExEKC0xLjAwNzM5ODk2MzBlLTAwMiksCisgICAgUVRNRkxMRCgtMS4wNDcyNTk4NjcyZS0wMDEpLCBRVE1GTExEKC04LjI2OTI1Mjc3NzFlLTAwMSksCisgICAgUVRNRkxMRCgtMS40NDgxNzQ3NTIzZS0wMDIpLCBRVE1GTExEKC0xLjUzOTk4MDI5NDJlLTAwMyksCisgICAgUVRNRkxMRCgtMS4wMjA1OTA2ODE2ZS0wMDIpLCBRVE1GTExEKC05LjQ0NzA4ODgzNzZlLTAwMiksCisgICAgUVRNRkxMRCgtOC4wODY4MDQxNTE1ZS0wMDEpLCBRVE1GTExEKC0xLjI5ODQyNDk3NDFlLTAwMiksCisgICAgUVRNRkxMRCgtMS4zODY1ODcyNzUyZS0wMDMpLCBRVE1GTExEKC0xLjAyOTE3MDM5NzdlLTAwMiksCisgICAgUVRNRkxMRCgtOC4zMTE5NTU2MzA4ZS0wMDIpLCBRVE1GTExEKC03Ljg5MzY1ODg3NjRlLTAwMSksCisgICAgUVRNRkxMRCgtMS4xNDc3OTg2MzUxZS0wMDIpLCBRVE1GTExEKC0xLjIxNDQzNDg1ODRlLTAwMyksCisgICAgUVRNRkxMRCgtMS4wMzIwOTYyNDA3ZS0wMDIpLCBRVE1GTExEKC03LjA2NjMzOTk5OTRlLTAwMiksCisgICAgUVRNRkxMRCgtNy42OTA1OTM2MDAzZS0wMDEpLCBRVE1GTExEKC05Ljk4ODQ4Njc2NjhlLTAwMyksCisgICAgUVRNRkxMRCgtMS4wMjQ4MjY2NjI2ZS0wMDMpLCBRVE1GTExEKC0xLjAyODI3NjQyMTFlLTAwMiksCisgICAgUVRNRkxMRCgtNS43MDk4NjA0NzM5ZS0wMDIpLCBRVE1GTExEKC03LjQ3ODQxNDc3MzllLTAwMSksCisgICAgUVRNRkxMRCgtOC41MzkzMjA5MDEwZS0wMDMpLCBRVE1GTExEKC04LjE5MTk4MDMwNTFlLTAwNCksCisgICAgUVRNRkxMRCgtMS4wMTY1NzE3NDUzZS0wMDIpLCBRVE1GTExEKC00LjI0MjYxOTg3MjFlLTAwMiksCisgICAgUVRNRkxMRCgtNy4yNTc5NDc5MjE4ZS0wMDEpLCBRVE1GTExEKC03LjE1MzM0MDYxNTNlLTAwMyksCisgICAgUVRNRkxMRCgtNS45OTE0Mjg2MjQ4ZS0wMDQpLCBRVE1GTExEKC05Ljk1Nzk3MjkxNDBlLTAwMyksCisgICAgUVRNRkxMRCgtMi42NjUyMDEyMDIwZS0wMDIpLCBRVE1GTExEKC03LjAzMDA0MTIxNzhlLTAwMSksCisgICAgUVRNRkxMRCgtNS44NTA4MTE0ODg5ZS0wMDMpLCBRVE1GTExEKC0zLjY2MjY4NzM3NzFlLTAwNCksCisgICAgUVRNRkxMRCgtOS42NDc1MDkwODMyZS0wMDMpLCBRVE1GTExEKC05Ljc4NzEyMTc4NzdlLTAwMyksCisgICAgUVRNRkxMRCgtNi43OTU1NTE3NzY5ZS0wMDEpLCBRVE1GTExEKC00LjY1MTI4Mzg0NTNlLTAwMyksCisgICAgUVRNRkxMRCgtMS4yMjI3MTgxMjg3ZS0wMDQpLCBRVE1GTExEKC05LjIyMjEzMjE1MzhlLTAwMyksCisgICAgUVRNRkxMRCg4LjE1MjMzOTYwNzVlLTAwMyksICBRVE1GTExEKC02LjU1NTM0OTIzMDhlLTAwMSksCisgICAgUVRNRkxMRCgtMy41Njk5NjgwNDQ4ZS0wMDMpLCBRVE1GTExEKDEuMzA5MDA3MjAyNWUtMDA0KSwKKyAgICBRVE1GTExEKC04LjY2OTUxNzkzNDNlLTAwMyksIFFUTUZMTEQoMi43MTQ1MTA2MzQ1ZS0wMDIpLAorICAgIFFUTUZMTEQoLTYuMzEwMzA0NDAzM2UtMDAxKSwgUVRNRkxMRCgtMi42MTgxMDcwMTM0ZS0wMDMpLAorICAgIFFUTUZMTEQoMy45MTI4Nzc4NzM1ZS0wMDQpLCAgUVRNRkxMRCgtNy45NzczNDk2ODM2ZS0wMDMpLAorICAgIFFUTUZMTEQoNC43MTY0ODQ5OTM3ZS0wMDIpLCAgUVRNRkxMRCgtNi4wNjEzMDAwMzkzZS0wMDEpLAorICAgIFFUTUZMTEQoLTEuNzkwODg3MjEwNWUtMDAzKSwgUVRNRkxMRCg2LjU3NjE5MTUxNzVlLTAwNCksCisgICAgUVRNRkxMRCgtNy4xMzM3OTE2ODg4ZS0wMDMpLCBRVE1GTExEKDYuODE4MTUzNzA5MmUtMDAyKSwKKyAgICBRVE1GTExEKC01LjgwOTI4MDg3MjNlLTAwMSksIFFUTUZMTEQoLTEuMDEzNTAwMTUwM2UtMDAzKX07CisKKy8qIQorICBcbmFtZSBRTUYKKyAgXGJyaWVmICBRTUYtVGFibGUKKyAgICAgICAgICA2NCBjaGFubmVscywgTiA9IDY0MCwKKworICBUaGUgY29lZmZzIGFyZSByZWFycmFuZ2VkIGNvbXBhcmVkIHdpdGggdGhlIHJlZmVyZW5jZSBpbiB0aGUgZm9sbG93aW5nCisgIHdheToKKworICBxbWZfNjRbMF0gICA9IHFtZl82NF9yZWZlcmVuY2VbMF07CisgIHFtZl82NFsxXSAgID0gcW1mXzY0X3JlZmVyZW5jZVsxMjhdOworICBxbWZfNjRbMl0gICA9IHFtZl82NF9yZWZlcmVuY2VbMjU2XTsKKyAgcW1mXzY0WzNdICAgPSBxbWZfNjRfcmVmZXJlbmNlWzM4NF07CisgIHFtZl82NFs0XSAgID0gcW1mXzY0X3JlZmVyZW5jZVs1MTJdOworCisgIHFtZl82NFs1XSAgID0gcW1mXzY0X3JlZmVyZW5jZVsxXTsKKyAgcW1mXzY0WzZdICAgPSBxbWZfNjRfcmVmZXJlbmNlWzEyOV07CisgIHFtZl82NFs3XSAgID0gcW1mXzY0X3JlZmVyZW5jZVsyNTddOworICBxbWZfNjRbOF0gICA9IHFtZl82NF9yZWZlcmVuY2VbMzg1XTsKKyAgcW1mXzY0WzldICAgPSBxbWZfNjRfcmVmZXJlbmNlWzUxM107CisgIC4KKyAgLgorICAuCisgIHFtZl82NFs2MzVdID0gcW1mXzY0X3JlZmVyZW5jZVsxMjddCisgIHFtZl82NFs2MzZdID0gcW1mXzY0X3JlZmVyZW5jZVsyNTVdOworICBxbWZfNjRbNjM3XSA9IHFtZl82NF9yZWZlcmVuY2VbMzgzXTsKKyAgcW1mXzY0WzYzOF0gPSBxbWZfNjRfcmVmZXJlbmNlWzUxMV07CisgIHFtZl82NFs2MzldID0gcW1mXzY0X3JlZmVyZW5jZVs2MzldOworCisgIFRoZSBmaWx0ZXIgb3V0cHV0IGlzIHJlcXVpcmVkIHRvIGJlIHNjYWxlZCBieSAxIGJpdC4KKworICBcc2hvd2luaXRpYWxpemVyCisqLworLy9AeworTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCitSQU1fQUxJR04KK2NvbnN0IEZJWFBfUEZUIHFtZl9tcHNsZGZiXzY0MFtRTUY2NDBfTVBTTERGQl9QRlRfVEFCTEVfU0laRV0gPSB7CisgICAgUVRNRkxMRCg5LjM4NjMwMTA5ODllLTAwNSksICBRVE1GTExEKC04Ljc1MzY1ODYyMTZlLTAwNCksCisgICAgUVRNRkxMRCg2LjQwMTYzNDMwOTRlLTAwMyksICBRVE1GTExEKC04LjQ1NTI4MTcwNDdlLTAwMiksCisgICAgUVRNRkxMRCg1LjYxOTQ0MDA3ODdlLTAwMSksICBRVE1GTExEKDEuMjE2OTE0OTcwNGUtMDA0KSwKKyAgICBRVE1GTExEKC0xLjAxODcxMDIwMTZlLTAwMyksIFFUTUZMTEQoNS44NTU2NTM0MzUwZS0wMDMpLAorICAgIFFUTUZMTEQoLTkuNTc3MTExODk5OWUtMDAyKSwgUVRNRkxMRCg1LjQ5MTQ0MDI5NjJlLTAwMSksCisgICAgUVRNRkxMRCgxLjI3OTM3NjczODJlLTAwNCksICBRVE1GTExEKC0xLjE2MDUzMTE4ODRlLTAwMyksCisgICAgUVRNRkxMRCg1LjI2NDk3NjUyNzVlLTAwMyksICBRVE1GTExEKC0xLjA3MjE2NzMwNzFlLTAwMSksCisgICAgUVRNRkxMRCg1LjM2MzIxODE4ODNlLTAwMSksICBRVE1GTExEKDEuMjY2ODg2MzkyOGUtMDA0KSwKKyAgICBRVE1GTExEKC0xLjMwMTczNTYzOTZlLTAwMyksIFFUTUZMTEQoNC42Mjg2NjUyNzk2ZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuMTg4ODM3OTYwNGUtMDAxKSwgUVRNRkxMRCg1LjIzNDg2NTU0NjJlLTAwMSksCisgICAgUVRNRkxMRCgxLjIyOTY1OTM5MjNlLTAwNCksICBRVE1GTExEKC0xLjQ0MjYzNTMxNTVlLTAwMyksCisgICAgUVRNRkxMRCgzLjk0NTMwMTI4NjllLTAwMyksICBRVE1GTExEKC0xLjMwNzY2MjEyOTRlLTAwMSksCisgICAgUVRNRkxMRCg1LjEwNjQ4MzY5NzllLTAwMSksICBRVE1GTExEKDEuMTU1ODIzMTE5OWUtMDA0KSwKKyAgICBRVE1GTExEKC0xLjU4MzAwNTMwMTdlLTAwMyksIFFUTUZMTEQoMy4yMTM2MDUzNzc4ZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuNDI4NTc4MzQ3MGUtMDAxKSwgUVRNRkxMRCg0Ljk3ODE3ODE0MzVlLTAwMSksCisgICAgUVRNRkxMRCgxLjA1ODI5ODUxMjRlLTAwNCksICBRVE1GTExEKC0xLjcyMjg1MDYwNDBlLTAwMyksCisgICAgUVRNRkxMRCgyLjQzMjM2NjYwMDNlLTAwMyksICBRVE1GTExEKC0xLjU1MTUxNzU0NjJlLTAwMSksCisgICAgUVRNRkxMRCg0Ljg1MDAzODI5MDBlLTAwMSksICBRVE1GTExEKDkuNDI5Nzc2NDAwOGUtMDA1KSwKKyAgICBRVE1GTExEKC0xLjg2MjE2MTA5NDNlLTAwMyksIFFUTUZMTEQoMS42MDA0NDAyNDIzZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuNjc2NDEwNTg1NmUtMDAxKSwgUVRNRkxMRCg0LjcyMjE2NjY1NzRlLTAwMSksCisgICAgUVRNRkxMRCg4LjA1MTQ1NjgyNTNlLTAwNSksICBRVE1GTExEKC0yLjAwMDg4MTgyNDZlLTAwMyksCisgICAgUVRNRkxMRCg3LjE2NzI2ODc3NzNlLTAwNCksICBRVE1GTExEKC0xLjgwMzE4NjA4ODhlLTAwMSksCisgICAgUVRNRkxMRCg0LjU5NDY1OTUwNzNlLTAwMSksICBRVE1GTExEKDYuNTEzNzgzNTkxOGUtMDA1KSwKKyAgICBRVE1GTExEKC0yLjEzODU4NjQ4MjBlLTAwMyksIFFUTUZMTEQoLTIuMTk5NDc0NjkzMGUtMDA0KSwKKyAgICBRVE1GTExEKC0xLjkzMTc2NTIyODVlLTAwMSksIFFUTUZMTEQoNC40Njc2MDgzMzI2ZS0wMDEpLAorICAgIFFUTUZMTEQoNC44MTAxMDY0NzQ5ZS0wMDUpLCAgUVRNRkxMRCgtMi4yNzUxOTA3ODE4ZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuMjEwNDU5Mjc1MmUtMDAzKSwgUVRNRkxMRCgtMi4wNjIwNzIwMDg4ZS0wMDEpLAorICAgIFFUTUZMTEQoNC4zNDExMDkwOTcwZS0wMDEpLCAgUVRNRkxMRCgyLjk1MTQ5Njc1MzdlLTAwNSksCisgICAgUVRNRkxMRCgtMi40MTA2MTc4ODk4ZS0wMDMpLCBRVE1GTExEKC0yLjI1NTg1MDAwNTllLTAwMyksCisgICAgUVRNRkxMRCgtMi4xOTQwMjU1MTY1ZS0wMDEpLCBRVE1GTExEKDQuMjE1MjUwOTA5M2UtMDAxKSwKKyAgICBRVE1GTExEKDkuODgxNDEwNzMzMmUtMDA2KSwgIFFUTUZMTEQoLTIuNTQ0ODMwNzg2MWUtMDAzKSwKKyAgICBRVE1GTExEKC0zLjM1Njk0Njg2NTFlLTAwMyksIFFUTUZMTEQoLTIuMzI3NTQwMDY5OGUtMDAxKSwKKyAgICBRVE1GTExEKDQuMDkwMTI5NDM1MWUtMDAxKSwgIFFUTUZMTEQoLTEuMDk2ODYwMjUxMGUtMDA1KSwKKyAgICBRVE1GTExEKC0yLjY3NzcwMzA0MzRlLTAwMyksIFFUTUZMTEQoLTQuNTE0NTAzMjkyN2UtMDAzKSwKKyAgICBRVE1GTExEKC0yLjQ2MjUzMTYyNjJlLTAwMSksIFFUTUZMTEQoMy45NjU4MzExMDA5ZS0wMDEpLAorICAgIFFUTUZMTEQoLTMuMjU1OTI1NTQ4N2UtMDA1KSwgUVRNRkxMRCgtMi44MDkxNTIwMDcxZS0wMDMpLAorICAgIFFUTUZMTEQoLTUuNzI5MjI1OTI5OGUtMDAzKSwgUVRNRkxMRCgtMi41OTg5MDk3MzU3ZS0wMDEpLAorICAgIFFUTUZMTEQoMy44NDI0NDQ0MTk5ZS0wMDEpLCAgUVRNRkxMRCgtNS40NjY5ODQyOTM5ZS0wMDUpLAorICAgIFFUTUZMTEQoLTIuOTM5MTM5MDI3MWUtMDAzKSwgUVRNRkxMRCgtNy4wMDE3ODk3NTI0ZS0wMDMpLAorICAgIFFUTUZMTEQoLTIuNzM2NTg0NTQ0MmUtMDAxKSwgUVRNRkxMRCgzLjcyMDA1NjcxMjZlLTAwMSksCisgICAgUVRNRkxMRCgtNy43NTA2NTYzNjg0ZS0wMDUpLCBRVE1GTExEKC0zLjA2NzUyNTgwMjJlLTAwMyksCisgICAgUVRNRkxMRCgtOC4zMzI3MDUxMjUyZS0wMDMpLCBRVE1GTExEKC0yLjg3NTQ2MjQ3MjRlLTAwMSksCisgICAgUVRNRkxMRCgzLjU5ODc1MjMxOThlLTAwMSksICBRVE1GTExEKC0xLjAwNTczNzQzMTFlLTAwNCksCisgICAgUVRNRkxMRCgtMy4xOTQyNTAzOTkyZS0wMDMpLCBRVE1GTExEKC05LjcyMjQwNTExMzNlLTAwMyksCisgICAgUVRNRkxMRCgtMy4wMTU0NDc1NTcwZS0wMDEpLCBRVE1GTExEKDMuNDc4NjE0MDkxOWUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjIzNjg1NTc1MDllLTAwNCksIFFUTUZMTEQoLTMuMzE5MjU2NDczM2UtMDAzKSwKKyAgICBRVE1GTExEKC0xLjExNzEyNTgwNTVlLTAwMiksIFFUTUZMTEQoLTMuMTU2NDQyMDQ2MmUtMDAxKSwKKyAgICBRVE1GTExEKDMuMzU5NzIyNzkzMWUtMDAxKSwgIFFUTUZMTEQoLTEuNDY2OTUzNTQ0OWUtMDA0KSwKKyAgICBRVE1GTExEKC0zLjQ0MjQ5MDAwNzdlLTAwMyksIFFUTUZMTEQoLTEuMjY3OTU1NTQ1M2UtMDAyKSwKKyAgICBRVE1GTExEKC0zLjI5ODM0NjY5ODNlLTAwMSksIFFUTUZMTEQoMy4yNDIxNTcxMDE2ZS0wMDEpLAorICAgIFFUTUZMTEQoLTEuNjkyODUxODAxNmUtMDA0KSwgUVRNRkxMRCgtMy41NjM5MTQ5MTM3ZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuNDI0NzUwNzc4OGUtMDAyKSwgUVRNRkxMRCgtMy40NDEwNjA3ODE1ZS0wMDEpLAorICAgIFFUTUZMTEQoMy4xMjU5OTQ4MDE1ZS0wMDEpLCAgUVRNRkxMRCgtMS45MTYyNjQwMDkyZS0wMDQpLAorICAgIFFUTUZMTEQoLTMuNjgzNDUxMDk3NWUtMDAzKSwgUVRNRkxMRCgtMS41ODc1MTE0MTI4ZS0wMDIpLAorICAgIFFUTUZMTEQoLTMuNTg0NDc5OTg3NmUtMDAxKSwgUVRNRkxMRCgzLjAxMTMwNzQxODNlLTAwMSksCisgICAgUVRNRkxMRCgtMi4xMzQ1NzUxODg0ZS0wMDQpLCBRVE1GTExEKC0zLjgwMDk5NDcxNjZlLTAwMyksCisgICAgUVRNRkxMRCgtMS43NTYyMzkzMDk5ZS0wMDIpLCBRVE1GTExEKC0zLjcyODQ5NzAyODRlLTAwMSksCisgICAgUVRNRkxMRCgyLjg5ODE2ODI2NThlLTAwMSksICBRVE1GTExEKC0yLjM0NDc4NTAyNTNlLTAwNCksCisgICAgUVRNRkxMRCgtMy45MTY1OTc0NTk1ZS0wMDMpLCBRVE1GTExEKC0xLjkzMDkyNzY3MTVlLTAwMiksCisgICAgUVRNRkxMRCgtMy44NzMwMDg3ODc2ZS0wMDEpLCBRVE1GTExEKDIuNzg2NjQ1NTkxM2UtMDAxKSwKKyAgICBRVE1GTExEKC0yLjU0NjI2Njc2OTFlLTAwNCksIFFUTUZMTEQoLTQuMDMwMTY1MjYyNWUtMDAzKSwKKyAgICBRVE1GTExEKC0yLjExMTU0NTc2MzllLTAwMiksIFFUTUZMTEQoLTQuMDE3OTA1ODkwOWUtMDAxKSwKKyAgICBRVE1GTExEKDIuNjc2ODA1MjU3OGUtMDAxKSwgIFFUTUZMTEQoLTIuNzM3MTI4NTI1MGUtMDA0KSwKKyAgICBRVE1GTExEKC00LjE0MTYzNDc5NThlLTAwMyksIFFUTUZMTEQoLTIuMjk4MDU4NTY5NGUtMDAyKSwKKyAgICBRVE1GTExEKC00LjE2MzA3NzQ3MzZlLTAwMSksIFFUTUZMTEQoMi41Njg3MDk1NTIzZS0wMDEpLAorICAgIFFUTUZMTEQoLTIuOTE2NTgwNDE1M2UtMDA0KSwgUVRNRkxMRCgtNC4yNTA5Njc0MDk1ZS0wMDMpLAorICAgIFFUTUZMTEQoLTIuNDkwNDIxNzU3MWUtMDAyKSwgUVRNRkxMRCgtNC4zMDg0MTI5NjkxZS0wMDEpLAorICAgIFFUTUZMTEQoMi40NjI0MTg4MjQ0ZS0wMDEpLCAgUVRNRkxMRCgtMy4wODM3OTczNDYzZS0wMDQpLAorICAgIFFUTUZMTEQoLTQuMzU4MTUwNTMwNmUtMDAzKSwgUVRNRkxMRCgtMi42ODg1NzUzNDk3ZS0wMDIpLAorICAgIFFUTUZMTEQoLTQuNDUzODAwMzIwNmUtMDAxKSwgUVRNRkxMRCgyLjM1Nzk4OTg0NzdlLTAwMSksCisgICAgUVRNRkxMRCgtMy4yMzc4MjAzNDY4ZS0wMDQpLCBRVE1GTExEKC00LjQ2MzE1MTA5NzNlLTAwMyksCisgICAgUVRNRkxMRCgtMi44OTI0NTMwMzcyZS0wMDIpLCBRVE1GTExEKC00LjU5OTEyNTA4NzNlLTAwMSksCisgICAgUVRNRkxMRCgyLjI1NTQ3NTUyMTFlLTAwMSksICBRVE1GTExEKC0zLjM3ODgxMDY1MjFlLTAwNCksCisgICAgUVRNRkxMRCgtNC41NjU5NDU4MjY1ZS0wMDMpLCBRVE1GTExEKC0zLjEwMTk3MTE4NjdlLTAwMiksCisgICAgUVRNRkxMRCgtNC43NDQyNzQ2MTYyZS0wMDEpLCBRVE1GTExEKDIuMTU0OTI1OTEyNmUtMDAxKSwKKyAgICBRVE1GTExEKC0zLjUwNTM0MDEzNzFlLTAwNCksIFFUTUZMTEQoLTQuNjY2NDY5NTI1NWUtMDAzKSwKKyAgICBRVE1GTExEKC0zLjMxNzAzNTM2MjFlLTAwMiksIFFUTUZMTEQoLTQuODg5MTMyMDgyNWUtMDAxKSwKKyAgICBRVE1GTExEKDIuMDU2Mzg2MzIxOGUtMDAxKSwgIFFUTUZMTEQoLTMuNjE3NTQ5MzczM2UtMDA0KSwKKyAgICBRVE1GTExEKC00Ljc2NDcyMDc5NzVlLTAwMyksIFFUTUZMTEQoLTMuNTM3NTQzODYzMWUtMDAyKSwKKyAgICBRVE1GTExEKC01LjAzMzU4MzA0NTBlLTAwMSksIFFUTUZMTEQoMS45NTk5MDIxOTcxZS0wMDEpLAorICAgIFFUTUZMTEQoLTMuNzE1OTcxODM0MGUtMDA0KSwgUVRNRkxMRCgtNC44NjA1ODg4MTUxZS0wMDMpLAorICAgIFFUTUZMTEQoLTMuNzYzMzcxMzMzNWUtMDAyKSwgUVRNRkxMRCgtNS4xNzc1MDk3ODQ3ZS0wMDEpLAorICAgIFFUTUZMTEQoMS44NjU1MTEzODc2ZS0wMDEpLCAgUVRNRkxMRCgtMy43OTk5OTM3MTk0ZS0wMDQpLAorICAgIFFUTUZMTEQoLTQuOTU0MDA4Mzg1NWUtMDAzKSwgUVRNRkxMRCgtMy45OTQzODQ3ODA1ZS0wMDIpLAorICAgIFFUTUZMTEQoLTUuMzIwNzk1Nzc0NWUtMDAxKSwgUVRNRkxMRCgxLjc3MzI1MDQwMTBlLTAwMSksCisgICAgUVRNRkxMRCgtMy44NzA1NjE3NzcxZS0wMDQpLCBRVE1GTExEKC01LjA0NTA0NjU2NDJlLTAwMyksCisgICAgUVRNRkxMRCgtNC4yMzA0MzgxNzI4ZS0wMDIpLCBRVE1GTExEKC01LjQ2MzMyMjQwMTBlLTAwMSksCisgICAgUVRNRkxMRCgxLjY4MzE1MTU3MjllLTAwMSksICBRVE1GTExEKC0zLjkyODE4NjE5NzNlLTAwNCksCisgICAgUVRNRkxMRCgtNS4xMzM2MjMyNTczZS0wMDMpLCBRVE1GTExEKC00LjQ3MTM2Mzg3MjNlLTAwMiksCisgICAgUVRNRkxMRCgtNS42MDQ5NzM0MzU0ZS0wMDEpLCBRVE1GTExEKDEuNTk1MjQzNTEzNmUtMDAxKSwKKyAgICBRVE1GTExEKC0zLjk3Mzc2OTQ4OTdlLTAwNCksIFFUTUZMTEQoLTUuMjE5NzM5ODYxOGUtMDAzKSwKKyAgICBRVE1GTExEKC00LjcxNzAyMzI5ODFlLTAwMiksIFFUTUZMTEQoLTUuNzQ1NjMwMjY0M2UtMDAxKSwKKyAgICBRVE1GTExEKDEuNTA5NTUwMzYyOGUtMDAxKSwgIFFUTUZMTEQoLTQuMDA4ODEwNzkyNmUtMDA0KSwKKyAgICBRVE1GTExEKC01LjMwMzMzNzIzODdlLTAwMyksIFFUTUZMTEQoLTQuOTY3MjEzNzk0NmUtMDAyKSwKKyAgICBRVE1GTExEKC01Ljg4NTE3NjY1ODZlLTAwMSksIFFUTUZMTEQoMS40MjYwOTEwNDUxZS0wMDEpLAorICAgIFFUTUZMTEQoLTQuMDMzODM4MzQwNWUtMDA0KSwgUVRNRkxMRCgtNS4zODQzOTYyOTYwZS0wMDMpLAorICAgIFFUTUZMTEQoLTUuMjIxNzM3OTIxMmUtMDAyKSwgUVRNRkxMRCgtNi4wMjM0OTM0MDkyZS0wMDEpLAorICAgIFFUTUZMTEQoMS4zNDQ4ODU1MjgxZS0wMDEpLCAgUVRNRkxMRCgtNC4wNTA1NTU1ODA4ZS0wMDQpLAorICAgIFFUTUZMTEQoLTUuNDYyOTYzMTM0MWUtMDAzKSwgUVRNRkxMRCgtNS40ODAzODI5NjQwZS0wMDIpLAorICAgIFFUTUZMTEQoLTYuMTYwNDY0Mjg2OGUtMDAxKSwgUVRNRkxMRCgxLjI2NTk0NzUyMDdlLTAwMSksCisgICAgUVRNRkxMRCgtNC4wNjE0ODgxNDM2ZS0wMDQpLCBRVE1GTExEKC01LjUzODk1ODEyNDhlLTAwMyksCisgICAgUVRNRkxMRCgtNS43NDI5MTk4MTc2ZS0wMDIpLCBRVE1GTExEKC02LjI5NTk3MzY1ODZlLTAwMSksCisgICAgUVRNRkxMRCgxLjE4OTI4NDI1MDFlLTAwMSksICBRVE1GTExEKC00LjA2NzYwNzUxNTBlLTAwNCksCisgICAgUVRNRkxMRCgtNS42MTIzNzYxNDYwZS0wMDMpLCBRVE1GTExEKC02LjAwOTA5MTQzNjllLTAwMiksCisgICAgUVRNRkxMRCgtNi40Mjk5MDQ2OTkzZS0wMDEpLCBRVE1GTExEKDEuMTE0OTAwNzgyN2UtMDAxKSwKKyAgICBRVE1GTExEKC00LjA3MDkzMzIwOTdlLTAwNCksIFFUTUZMTEQoLTUuNjgzMjMxMTY3NWUtMDAzKSwKKyAgICBRVE1GTExEKC02LjI3ODY1ODY1ODNlLTAwMiksIFFUTUZMTEQoLTYuNTYyMTQyOTY4MmUtMDAxKSwKKyAgICBRVE1GTExEKDEuMDQyODA0MDQ3NWUtMDAxKSwgIFFUTUZMTEQoLTQuMDczMjU0NTMxMmUtMDA0KSwKKyAgICBRVE1GTExEKC01Ljc1MTUzNjY5MzRlLTAwMyksIFFUTUZMTEQoLTYuNTUxMzQwOTY3NGUtMDAyKSwKKyAgICBRVE1GTExEKC02LjY5MjU3MzQyODJlLTAwMSksIFFUTUZMTEQoOS43Mjk4ODk3ODAzZS0wMDIpLAorICAgIFFUTUZMTEQoLTQuMDc3MDgwODExOGUtMDA0KSwgUVRNRkxMRCgtNS44MTcyODYyMDQ1ZS0wMDMpLAorICAgIFFUTUZMTEQoLTYuODI2ODQ3MDQ2NmUtMDAyKSwgUVRNRkxMRCgtNi44MjEwODM0MjY1ZS0wMDEpLAorICAgIFFUTUZMTEQoOS4wNTQ1MTYyNTU5ZS0wMDIpLCAgUVRNRkxMRCgtNC4wODU0NjY0OTg1ZS0wMDQpLAorICAgIFFUTUZMTEQoLTUuODgwNDk1OTk5MGUtMDAzKSwgUVRNRkxMRCgtNy4xMDQ4NjY5NTE3ZS0wMDIpLAorICAgIFFUTUZMTEQoLTYuOTQ3NTYxNTAyNWUtMDAxKSwgUVRNRkxMRCg4LjQwMTc5NDczMTZlLTAwMiksCisgICAgUVRNRkxMRCgtNC4xMDAyMjQxNzc4ZS0wMDQpLCBRVE1GTExEKC01Ljk0MTIxMTcxMTZlLTAwMyksCisgICAgUVRNRkxMRCgtNy4zODUwOTIyMjg3ZS0wMDIpLCBRVE1GTExEKC03LjA3MTg5NTU5OTRlLTAwMSksCisgICAgUVRNRkxMRCg3Ljc3MTY1NjY2MjJlLTAwMiksICBRVE1GTExEKC00LjEyMzk1ODY0MjZlLTAwNCksCisgICAgUVRNRkxMRCgtNS45OTk0NzM4NTQ5ZS0wMDMpLCBRVE1GTExEKC03LjY2NzE3NzkxNTZlLTAwMiksCisgICAgUVRNRkxMRCgtNy4xOTM5Nzk2MjA5ZS0wMDEpLCBRVE1GTExEKDcuMTYzOTUwODAwOWUtMDAyKSwKKyAgICBRVE1GTExEKC00LjE1OTQzNzA4NTBlLTAwNCksIFFUTUZMTEQoLTYuMDU1MzU1MDcyMGUtMDAzKSwKKyAgICBRVE1GTExEKC03Ljk1MDc5MDIyNjVlLTAwMiksIFFUTUZMTEQoLTcuMzEzNzA1MDg2N2UtMDAxKSwKKyAgICBRVE1GTExEKDYuNTc4NDE0ODg3MmUtMDAyKSwgIFFUTUZMTEQoLTQuMjA4MzMzNTU3NWUtMDA0KSwKKyAgICBRVE1GTExEKC02LjEwODkwMjM5NDhlLTAwMyksIFFUTUZMTEQoLTguMjM1NTYyNTkyN2UtMDAyKSwKKyAgICBRVE1GTExEKC03LjQzMDk2NzY4ODZlLTAwMSksIFFUTUZMTEQoNi4wMTQ4MzU0NjIwZS0wMDIpLAorICAgIFFUTUZMTEQoLTQuMjczMjQ3NjE0MGUtMDA0KSwgUVRNRkxMRCgtNi4xNjAyMTU5NDAzZS0wMDMpLAorICAgIFFUTUZMTEQoLTguNTIxMTA3NTg0MmUtMDAyKSwgUVRNRkxMRCgtNy41NDU2NjM3MTQ0ZS0wMDEpLAorICAgIFFUTUZMTEQoNS40NzMwMjY2MzMzZS0wMDIpLCAgUVRNRkxMRCgtNC4zNTYzNzcxNzYwZS0wMDQpLAorICAgIFFUTUZMTEQoLTYuMjA5MzcyMDc3MWUtMDAzKSwgUVRNRkxMRCgtOC44MDcwNTExODE4ZS0wMDIpLAorICAgIFFUTUZMTEQoLTcuNjU3NjkyNDMyNGUtMDAxKSwgUVRNRkxMRCg0Ljk1MjYyNTkzMDNlLTAwMiksCisgICAgUVRNRkxMRCgtNC40NjAwMzU5OTc5ZS0wMDQpLCBRVE1GTExEKC02LjI1NjU0MjYzNDJlLTAwMyksCisgICAgUVRNRkxMRCgtOS4wOTI5NzAxOTI0ZS0wMDIpLCBRVE1GTExEKC03Ljc2Njk1NjY4NzBlLTAwMSksCisgICAgUVRNRkxMRCg0LjQ1MzMwODEzNTNlLTAwMiksICBRVE1GTExEKC00LjU4NTg3MTY0NzZlLTAwNCksCisgICAgUVRNRkxMRCgtNi4zMDE3NjY3MjcxZS0wMDMpLCBRVE1GTExEKC05LjM3ODQ1NDgzNDJlLTAwMiksCisgICAgUVRNRkxMRCgtNy44NzMzNjA1MTQ2ZS0wMDEpLCBRVE1GTExEKDMuOTc0Njc1MDE0NmUtMDAyKSwKKyAgICBRVE1GTExEKC00LjczNDU4NzU2NDZlLTAwNCksIFFUTUZMTEQoLTYuMzQ1MjYyMjg1M2UtMDAzKSwKKyAgICBRVE1GTExEKC05LjY2MzA2OTI0ODJlLTAwMiksIFFUTUZMTEQoLTcuOTc2ODA5NzQwMWUtMDAxKSwKKyAgICBRVE1GTExEKDMuNTE2MzkxMjkyMmUtMDAyKSwgIFFUTUZMTEQoLTQuOTA3NjY4OTE3NGUtMDA0KSwKKyAgICBRVE1GTExEKC02LjM4NzEyNDMwMzdlLTAwMyksIFFUTUZMTEQoLTkuOTQ2MzY3MTQ0NmUtMDAyKSwKKyAgICBRVE1GTExEKC04LjA3NzIxNDk1NjNlLTAwMSksIFFUTUZMTEQoMy4wNzgwODc3OTE4ZS0wMDIpLAorICAgIFFUTUZMTEQoLTUuMTA2NzExMTc4MWUtMDA0KSwgUVRNRkxMRCgtNi40Mjc1NTY3NDIwZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuMDIyNzg5MTgwM2UtMDAxKSwgUVRNRkxMRCgtOC4xNzQ0OTE1MjQ3ZS0wMDEpLAorICAgIFFUTUZMTEQoMi42NTkwNjE1NTExZS0wMDIpLCAgUVRNRkxMRCgtNS4zMzI2MjMyNTkyZS0wMDQpLAorICAgIFFUTUZMTEQoLTYuNDY2NjkwNDUwOWUtMDAzKSwgUVRNRkxMRCgtMS4wNTA3MTYxMTcwZS0wMDEpLAorICAgIFFUTUZMTEQoLTguMjY4NTU0ODA2N2UtMDAxKSwgUVRNRkxMRCgyLjI1ODg5OTI0OTFlLTAwMiksCisgICAgUVRNRkxMRCgtNS41ODU1NjQ2NDk3ZS0wMDQpLCBRVE1GTExEKC02LjUwNDcyOTM5MDFlLTAwMyksCisgICAgUVRNRkxMRCgtMS4wNzgzNjkxNzA0ZS0wMDEpLCBRVE1GTExEKC04LjM1OTMyMjU0NzllLTAwMSksCisgICAgUVRNRkxMRCgxLjg3NzI2NDg2NDdlLTAwMiksICBRVE1GTExEKC01Ljg2NDAyMzY5NjZlLTAwNCksCisgICAgUVRNRkxMRCgtNi41NDE4NjU0MTIxZS0wMDMpLCBRVE1GTExEKC0xLjEwNTY5ODc5NDFlLTAwMSksCisgICAgUVRNRkxMRCgtOC40NDY3MjMyMjI3ZS0wMDEpLCBRVE1GTExEKDEuNTEzMTY2ODE4OGUtMDAyKSwKKyAgICBRVE1GTExEKC02LjE2OTI2NTI1MjVlLTAwNCksIFFUTUZMTEQoLTYuNTc4MzIwNjM3M2UtMDAzKSwKKyAgICBRVE1GTExEKC0xLjEzMjY1NDM5ODdlLTAwMSksIFFUTUZMTEQoLTguNTMwNjg0MTEzNWUtMDAxKSwKKyAgICBRVE1GTExEKDEuMTY2MTE4NDk1MmUtMDAyKSwgIFFUTUZMTEQoLTYuNDk5NDkzMDI5MGUtMDA0KSwKKyAgICBRVE1GTExEKC02LjYxNDM1NDQzOTFlLTAwMyksIFFUTUZMTEQoLTEuMTU5MTg0NDI2MWUtMDAxKSwKKyAgICBRVE1GTExEKC04LjYxMTE0MDI1MTJlLTAwMSksIFFUTUZMTEQoOC4zNTA5NjQ2MzU2ZS0wMDMpLAorICAgIFFUTUZMTEQoLTYuODQ5NDMyODI5OGUtMDA0KSwgUVRNRkxMRCgtNi42NTAyMjg1MTkwZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuMTg1MjM3MTY5M2UtMDAxKSwgUVRNRkxMRCgtOC42ODgwNDM5NTIwZS0wMDEpLAorICAgIFFUTUZMTEQoNS4xODMyOTQ4ODExZS0wMDMpLCAgUVRNRkxMRCgtNy4yNDA0NTM4NTE0ZS0wMDQpLAorICAgIFFUTUZMTEQoLTYuNjg2MTQwNzgzMWUtMDAzKSwgUVRNRkxMRCgtMS4yMTA3NTU3MDU4ZS0wMDEpLAorICAgIFFUTUZMTEQoLTguNzYxMjU5OTEzNGUtMDAxKSwgUVRNRkxMRCgyLjIxMDMxNTMxNjllLTAwMyksCisgICAgUVRNRkxMRCgtNy43MDYxMTQ1NTY2ZS0wMDQpLCBRVE1GTExEKC02LjcyMjEyNjE1NjFlLTAwMyksCisgICAgUVRNRkxMRCgtMS4yMzU2ODA4MDM3ZS0wMDEpLCBRVE1GTExEKC04LjgzMDU4MjQ5OTVlLTAwMSksCisgICAgUVRNRkxMRCgtNC42ODU1ODA3ODg2ZS0wMDQpLCBRVE1GTExEKC04LjIxNTgwNDExODdlLTAwNCksCisgICAgUVRNRkxMRCgtNi43NTg0NzY2MDc1ZS0wMDMpLCBRVE1GTExEKC0xLjI1OTk1MjE4NzVlLTAwMSksCisgICAgUVRNRkxMRCgtOC44OTU4ODIzNjgxZS0wMDEpLCBRVE1GTExEKC0yLjgwMDMzNDAxMjFlLTAwMyksCisgICAgUVRNRkxMRCgtOC43NDk4MTA1MTMxZS0wMDQpLCBRVE1GTExEKC02Ljc5NTc4NjMyMTJlLTAwMyksCisgICAgUVRNRkxMRCgtMS4yODM1MjA0NjAxZS0wMDEpLCBRVE1GTExEKC04Ljk1NzI5NTQxNzhlLTAwMSksCisgICAgUVRNRkxMRCgtNC45MjkzNzg2Mjg3ZS0wMDMpLCBRVE1GTExEKC05LjI5MDI4MTQ1MDRlLTAwNCksCisgICAgUVRNRkxMRCgtNi44MzQ0NDMxOTI5ZS0wMDMpLCBRVE1GTExEKC0xLjMwNjMzMTE1NzdlLTAwMSksCisgICAgUVRNRkxMRCgtOS4wMTQ4NTg2MDM1ZS0wMDEpLCBRVE1GTExEKC02LjkyNzMyOTU4MTJlLTAwMyksCisgICAgUVRNRkxMRCgtOS44MzgzNDYxNTkxZS0wMDQpLCBRVE1GTExEKC02Ljg3NDYyMzcwODRlLTAwMyksCisgICAgUVRNRkxMRCgtMS4zMjgzMjM5MzA1ZS0wMDEpLCBRVE1GTExEKC05LjA2ODUwMzM3OThlLTAwMSksCisgICAgUVRNRkxMRCgtOC43ODU3NDYwNjAzZS0wMDMpLCBRVE1GTExEKC0xLjAzOTU1Mzg5OTNlLTAwMyksCisgICAgUVRNRkxMRCgtNi45MTY1NTQ2NDQ3ZS0wMDMpLCBRVE1GTExEKC0xLjM0OTQzNzY4MzhlLTAwMSksCisgICAgUVRNRkxMRCgtOS4xMTgxODAyNzUwZS0wMDEpLCBRVE1GTExEKC0xLjA1MDc1NTE5NTNlLTAwMiksCisgICAgUVRNRkxMRCgtMS4wOTU5NjIwMTIyZS0wMDMpLCBRVE1GTExEKC02Ljk2MDQ1MTEzNzNlLTAwMyksCisgICAgUVRNRkxMRCgtMS4zNjk2MTIwNjc5ZS0wMDEpLCBRVE1GTExEKC05LjE2Mzg1NjUwNjNlLTAwMSksCisgICAgUVRNRkxMRCgtMS4yMTAzNzAyODczZS0wMDIpLCBRVE1GTExEKC0xLjE1MzAyNTA3NzdlLTAwMyksCisgICAgUVRNRkxMRCgtNy4wMDY1OTE2NTE2ZS0wMDMpLCBRVE1GTExEKC0xLjM4ODc4NTk4ODFlLTAwMSksCisgICAgUVRNRkxMRCgtOS4yMDU0ODc5NjY1ZS0wMDEpLCBRVE1GTExEKC0xLjM1NzQxOTc4ODhlLTAwMiksCisgICAgUVRNRkxMRCgtMS4yMTA1OTY2NDUzZS0wMDMpLCBRVE1GTExEKC03LjA1NTI0OTUzMDhlLTAwMyksCisgICAgUVRNRkxMRCgtMS40MDY4OTY4NTk0ZS0wMDEpLCBRVE1GTExEKC05LjI0MzA0MDY4MDllLTAwMSksCisgICAgUVRNRkxMRCgtMS40OTIzMzU4MzM2ZS0wMDIpLCBRVE1GTExEKC0xLjI2ODE4NDI3ODJlLTAwMyksCisgICAgUVRNRkxMRCgtNy4xMDY2MDAzMjkzZS0wMDMpLCBRVE1GTExEKC0xLjQyMzg4NDE4MzJlLTAwMSksCisgICAgUVRNRkxMRCgtOS4yNzY0ODc4MjczZS0wMDEpLCBRVE1GTExEKC0xLjYxNTY0ODUzMDRlLTAwMiksCisgICAgUVRNRkxMRCgtMS4zMjU2NDI5MjI5ZS0wMDMpLCBRVE1GTExEKC03LjE2MDg0MzM1MDBlLTAwMyksCisgICAgUVRNRkxMRCgtMS40Mzk2ODU5NzA1ZS0wMDEpLCBRVE1GTExEKC05LjMwNTgwMzE3OTdlLTAwMSksCisgICAgUVRNRkxMRCgtMS43Mjc3MTE3ODE5ZS0wMDIpLCBRVE1GTExEKC0xLjM4Mjc2Mzg0NjhlLTAwMyksCisgICAgUVRNRkxMRCgtNy4yMTgyMDYzMDEzZS0wMDMpLCBRVE1GTExEKC0xLjQ1NDIzOTE4OTZlLTAwMSksCisgICAgUVRNRkxMRCgtOS4zMzA5NjY0NzI2ZS0wMDEpLCBRVE1GTExEKC0xLjgyODkzNjExNDllLTAwMiksCisgICAgUVRNRkxMRCgtMS40MzkxOTA1ODYxZS0wMDMpLCBRVE1GTExEKC03LjI3ODkxODc1NDNlLTAwMyksCisgICAgUVRNRkxMRCgtMS40Njc0ODE4NTE2ZS0wMDEpLCBRVE1GTExEKC05LjM1MTk2MTAxNjdlLTAwMSksCisgICAgUVRNRkxMRCgtMS45MTk1NjYyODExZS0wMDIpLCBRVE1GTExEKC0xLjQ5NDcwOTc1MTZlLTAwMyksCisgICAgUVRNRkxMRCgtNy4zNDMwODQwODU3ZS0wMDMpLCBRVE1GTExEKC0xLjQ3OTM1MjExNjZlLTAwMSksCisgICAgUVRNRkxMRCgtOS4zNjg3NzMxMDI4ZS0wMDEpLCBRVE1GTExEKC0xLjk5OTk4MTMyODhlLTAwMiksCisgICAgUVRNRkxMRCgtMS41NDg5NTQwNTI5ZS0wMDMpLCBRVE1GTExEKC03LjQxMDg4MjUwNjVlLTAwMyksCisgICAgUVRNRkxMRCgtMS40ODk3ODcxMDE3ZS0wMDEpLCBRVE1GTExEKC05LjM4MTM5Nzk2MjZlLTAwMSksCisgICAgUVRNRkxMRCgtMi4wNzA2MTQ4ODE4ZS0wMDIpLCBRVE1GTExEKC0xLjYwMTY5MDg5MjFlLTAwMyksCisgICAgUVRNRkxMRCgtNy40ODIzNjE1MTQxZS0wMDMpLCBRVE1GTExEKC0xLjQ5ODcyNjAxMDNlLTAwMSksCisgICAgUVRNRkxMRCgtOS4zODk4MjkwMzk2ZS0wMDEpLCBRVE1GTExEKC0yLjEzMTY5MTk0NzZlLTAwMiksCisgICAgUVRNRkxMRCgtMS42NTI2ODk0MTc4ZS0wMDMpLCBRVE1GTExEKC03LjU1NzY5MjQ3MTllLTAwMyksCisgICAgUVRNRkxMRCgtMS41MDYxMDU5NTk0ZS0wMDEpLCBRVE1GTExEKC05LjM5NDA2ODEyMTllLTAwMSksCisgICAgUVRNRkxMRCgtMi4xODM1MTg3NDUwZS0wMDIpLCBRVE1GTExEKC0xLjcwMTU0MTAxMjJlLTAwMyksCisgICAgUVRNRkxMRCgtNy42MzY4OTkxMjg2ZS0wMDMpLCBRVE1GTExEKC0xLjUxMTg2Njc0ODNlLTAwMSksCisgICAgUVRNRkxMRCgtOS4zOTQxMjExNzAwZS0wMDEpLCBRVE1GTExEKC0yLjIyNjQ0NDMzMzhlLTAwMiksCisgICAgUVRNRkxMRCgtMS43NDc5Nzg3MzQ4ZS0wMDMpLCBRVE1GTExEKC03LjcyMDAwNTIzMjhlLTAwMyksCisgICAgUVRNRkxMRCgtMS41MTU5NDc3MjkzZS0wMDEpLCBRVE1GTExEKC05LjM4OTk5NzEyNDdlLTAwMSksCisgICAgUVRNRkxMRCgtMi4yNjA3OTA3NjUzZS0wMDIpLCBRVE1GTExEKC0xLjc5MTc1NjcxNjZlLTAwMyksCisgICAgUVRNRkxMRCgtNy44MDY5NzkxMTk4ZS0wMDMpLCBRVE1GTExEKC0xLjUxODI4OTE0ODhlLTAwMSksCisgICAgUVRNRkxMRCgtOS4zODE3MDk2OTQ5ZS0wMDEpLCBRVE1GTExEKC0yLjI4Njg2NDQ0NDZlLTAwMiksCisgICAgUVRNRkxMRCgtMS44MzI1MjAwMDcyZS0wMDMpLCBRVE1GTExEKC03Ljg5Nzc4NzcyNzRlLTAwMyksCisgICAgUVRNRkxMRCgtMS41MTg4MzE5OTgxZS0wMDEpLCBRVE1GTExEKC05LjM2OTI3ODU1MDFlLTAwMSksCisgICAgUVRNRkxMRCgtMi4zMDQ5MTgzMTkwZS0wMDIpLCBRVE1GTExEKC0xLjg3MDA3MjIxMzllLTAwMyksCisgICAgUVRNRkxMRCgtNy45OTIzNDAyNTE4ZS0wMDMpLCBRVE1GTExEKC0xLjUxNzUxNzU2NjdlLTAwMSksCisgICAgUVRNRkxMRCgtOS4zNTI3MjQ1NTIyZS0wMDEpLCBRVE1GTExEKC0yLjMxNTI5NzcyMjhlLTAwMiksCisgICAgUVRNRkxMRCgtMS45MDQxMjM1NzkyZS0wMDMpLCBRVE1GTExEKC04LjA5MDU1ODQ2MThlLTAwMyksCisgICAgUVRNRkxMRCgtMS41MTQyODkwODExZS0wMDEpLCBRVE1GTExEKC05LjMzMjA3NTExOTBlLTAwMSksCisgICAgUVRNRkxMRCgtMi4zMTgzNTI0NjA5ZS0wMDIpLCBRVE1GTExEKC0xLjkzNDQwNzg2MTBlLTAwMyksCisgICAgUVRNRkxMRCgtOC4xOTIxODE1ODcyZS0wMDMpLCBRVE1GTExEKC0xLjUwOTA4OTAyMjllLTAwMSksCisgICAgUVRNRkxMRCgtOS4zMDczNjI0MzcyZS0wMDEpLCBRVE1GTExEKC0yLjMxNDM0NDc5MzZlLTAwMiksCisgICAgUVRNRkxMRCgtMS45NjA2OTM4NTg2ZS0wMDMpLCBRVE1GTExEKC04LjI5NzA0NTcxNTJlLTAwMyksCisgICAgUVRNRkxMRCgtMS41MDE4NjI4NTM4ZS0wMDEpLCBRVE1GTExEKC05LjI3ODYxOTI4OTRlLTAwMSksCisgICAgUVRNRkxMRCgtMi4zMDM1ODk1MDc5ZS0wMDIpLCBRVE1GTExEKC0xLjk4MjY4NzA0MTJlLTAwMyksCisgICAgUVRNRkxMRCgtOC40MDQ4MzUxMjczZS0wMDMpLCBRVE1GTExEKC0xLjQ5MjU1NjE4NDVlLTAwMSksCisgICAgUVRNRkxMRCgtOS4yNDU4ODYyMDY2ZS0wMDEpLCBRVE1GTExEKC0yLjI4NjQxNjQ3ODVlLTAwMiksCisgICAgUVRNRkxMRCgtMi4wMDAyMTI2Njk0ZS0wMDMpLCBRVE1GTExEKC04LjUxNTIzNTk2NzllLTAwMyksCisgICAgUVRNRkxMRCgtMS40ODExMTcwMTAxZS0wMDEpLCBRVE1GTExEKC05LjIwOTIwNDMxNjFlLTAwMSksCisgICAgUVRNRkxMRCgtMi4yNjMxNzA4NTMzZS0wMDIpLCBRVE1GTExEKC0yLjAxMzExMTcxOTllLTAwMyksCisgICAgUVRNRkxMRCgtOC42Mjc5MTc2MTc2ZS0wMDMpLCBRVE1GTExEKC0xLjQ2NzQ5NDA3MDVlLTAwMSksCisgICAgUVRNRkxMRCgtOS4xNjg2MjEzMDE3ZS0wMDEpLCBRVE1GTExEKC0yLjIzNDE2OTA5NThlLTAwMiksCisgICAgUVRNRkxMRCgtMi4wMjExNTY3MTcxZS0wMDMpLCBRVE1GTExEKC04Ljc0MjU0NzU5NDBlLTAwMyksCisgICAgUVRNRkxMRCgtMS40NTE2MzYyNTQ4ZS0wMDEpLCBRVE1GTExEKC05LjEyNDE4NzIzMTFlLTAwMSksCisgICAgUVRNRkxMRCgtMi4xOTk2OTYxOTA3ZS0wMDIpLCBRVE1GTExEKC0yLjAyNDI1NDc2MTZlLTAwMyksCisgICAgUVRNRkxMRCgtOC44NTg1NjQzMDk4ZS0wMDMpLCBRVE1GTExEKC0xLjQzMzQ5NzY2NzNlLTAwMSksCisgICAgUVRNRkxMRCgtOS4wNzU5NTU3NDg2ZS0wMDEpLCBRVE1GTExEKC0yLjE2MDEzMDgxMzdlLTAwMiksCisgICAgUVRNRkxMRCgtMi4wMjIxODkzMjEwZS0wMDMpLCBRVE1GTExEKC04Ljk3NTUwMzk2NjJlLTAwMyksCisgICAgUVRNRkxMRCgtMS40MTMwMzAzMjY0ZS0wMDEpLCBRVE1GTExEKC05LjAyMzk4NTI2NjdlLTAwMSksCisgICAgUVRNRkxMRCgtMi4xMTU4MTQ3NjAzZS0wMDIpLCBRVE1GTExEKC0yLjAxNDkxNjM5MDJlLTAwMyksCisgICAgUVRNRkxMRCgtOS4wOTI3Mjk1Mzg3ZS0wMDMpLCBRVE1GTExEKC0xLjM5MDE5MDg2OTZlLTAwMSksCisgICAgUVRNRkxMRCgtOC45NjgzMzcxNzgyZS0wMDEpLCBRVE1GTExEKC0yLjA2NzA2MTY5OTllLTAwMiksCisgICAgUVRNRkxMRCgtMi4wMDIyODg4MjAyZS0wMDMpLCBRVE1GTExEKC05LjIwOTU3MTQwNjJlLTAwMyksCisgICAgUVRNRkxMRCgtMS4zNjQ5MzY1MzA2ZS0wMDEpLCBRVE1GTExEKC04LjkwOTA3MTY4MzllLTAwMSksCisgICAgUVRNRkxMRCgtMi4wMTQyMTMyNDE2ZS0wMDIpLCBRVE1GTExEKC0xLjk4NDE3ODU1NDNlLTAwMyksCisgICAgUVRNRkxMRCgtOS4zMjUzMTE1MTkyZS0wMDMpLCBRVE1GTExEKC0xLjMzNzIyNjYyOTNlLTAwMSksCisgICAgUVRNRkxMRCgtOC44NDYyNTc5MjUwZS0wMDEpLCBRVE1GTExEKC0xLjk1NzYwNTc3OTJlLTAwMiksCisgICAgUVRNRkxMRCgtMS45NjA2MjcwMzYyZS0wMDMpLCBRVE1GTExEKC05LjQzOTI0MDIwOThlLTAwMyksCisgICAgUVRNRkxMRCgtMS4zMDcwMjE5NzU1ZS0wMDEpLCBRVE1GTExEKC04Ljc3OTk2NTA0MzFlLTAwMSksCisgICAgUVRNRkxMRCgtMS44OTc2MTI1ODY2ZS0wMDIpLCBRVE1GTExEKC0xLjkzMTU4NTk1MzZlLTAwMyksCisgICAgUVRNRkxMRCgtOS41NTA1MDYyNDkxZS0wMDMpLCBRVE1GTExEKC0xLjI3NDI4NjUwODZlLTAwMSksCisgICAgUVRNRkxMRCgtOC43MTAyNjYzNTE3ZS0wMDEpLCBRVE1GTExEKC0xLjgzNDU2ODAwODhlLTAwMiksCisgICAgUVRNRkxMRCgtMS44OTcwMjg5OTY2ZS0wMDMpLCBRVE1GTExEKC05LjY1ODMzNTcwODFlLTAwMyksCisgICAgUVRNRkxMRCgtMS4yMzg5ODYxMDQ3ZS0wMDEpLCBRVE1GTExEKC04LjYzNzIzOTkzMzBlLTAwMSksCisgICAgUVRNRkxMRCgtMS43Njg3NzA2Mjc3ZS0wMDIpLCBRVE1GTExEKC0xLjg1Njk4MTU0MzhlLTAwMyksCisgICAgUVRNRkxMRCgtOS43NjE2OTAxNjIxZS0wMDMpLCBRVE1GTExEKC0xLjIwMTA4OTk5MzFlLTAwMSksCisgICAgUVRNRkxMRCgtOC41NjA5NjMyNzMwZS0wMDEpLCBRVE1GTExEKC0xLjcwMDYxNDAyMDJlLTAwMiksCisgICAgUVRNRkxMRCgtMS44MTE0NTg3MjkyZS0wMDMpLCBRVE1GTExEKC05Ljg1OTczNTE0NjJlLTAwMyksCisgICAgUVRNRkxMRCgtMS4xNjA1NjU1NDAyZS0wMDEpLCBRVE1GTExEKC04LjQ4MTUxOTgxODNlLTAwMSksCisgICAgUVRNRkxMRCgtMS42MzA0MzY4MTUzZS0wMDIpLCBRVE1GTExEKC0xLjc2MDUxNDMzNjZlLTAwMyksCisgICAgUVRNRkxMRCgtOS45NTE1NjQ0ODMzZS0wMDMpLCBRVE1GTExEKC0xLjExNzM5MDkxNThlLTAwMSksCisgICAgUVRNRkxMRCgtOC4zOTg5OTE4MjMyZS0wMDEpLCBRVE1GTExEKC0xLjU1ODU1MDkxMjllLTAwMiksCisgICAgUVRNRkxMRCgtMS43MDQyMDAyODczZS0wMDMpLCBRVE1GTExEKC0xLjAwMzYwMjYxMjhlLTAwMiksCisgICAgUVRNRkxMRCgtMS4wNzE1MzU4NzA0ZS0wMDEpLCBRVE1GTExEKC04LjMxMzQ2ODY5NDdlLTAwMSksCisgICAgUVRNRkxMRCgtMS40ODUzMTYyNjkxZS0wMDIpLCBRVE1GTExEKC0xLjY0MjYzMzU3ODdlLTAwMyksCisgICAgUVRNRkxMRCgtMS4wMTExOTUyMjAxZS0wMDIpLCBRVE1GTExEKC0xLjAyMjk4Mzg2MzllLTAwMSksCisgICAgUVRNRkxMRCgtOC4yMjUwMzY4NTk1ZS0wMDEpLCBRVE1GTExEKC0xLjQxMTAzMzE0MjRlLTAwMiksCisgICAgUVRNRkxMRCgtMS41NzU4ODA5MTY4ZS0wMDMpLCBRVE1GTExEKC0xLjAxNzgyMTAyMTRlLTAwMiksCisgICAgUVRNRkxMRCgtOS43MTcxMTg3NDAxZS0wMDIpLCBRVE1GTExEKC04LjEzMzc4OTg5NzBlLTAwMSksCisgICAgUVRNRkxMRCgtMS4zMzYwODA2NzQxZS0wMDIpLCBRVE1GTExEKC0xLjUwNDA3OTc4ODBlLTAwMyksCisgICAgUVRNRkxMRCgtMS4wMjMzNjAzNDE4ZS0wMDIpLCBRVE1GTExEKC05LjE3NzA1OTY4MDJlLTAwMiksCisgICAgUVRNRkxMRCgtOC4wMzk4MTg0MDYxZS0wMDEpLCBRVE1GTExEKC0xLjI2MDc2OTI3NDFlLTAwMiksCisgICAgUVRNRkxMRCgtMS40MjczMzk3MzkyZS0wMDMpLCBRVE1GTExEKC0xLjAyNzY4Mjc5NjFlLTAwMiksCisgICAgUVRNRkxMRCgtOC42MDk1MTc2NjM3ZS0wMDIpLCBRVE1GTExEKC03Ljk0MzIyMjUyMjdlLTAwMSksCisgICAgUVRNRkxMRCgtMS4xODUzNTg1OTUxZS0wMDIpLCBRVE1GTExEKC0xLjM0NTgzNDkyNzZlLTAwMyksCisgICAgUVRNRkxMRCgtMS4wMzA2NTc5OTkyZS0wMDIpLCBRVE1GTExEKC04LjAxNDM5Mjg1MjhlLTAwMiksCisgICAgUVRNRkxMRCgtNy44NDQwOTUyMzAxZS0wMDEpLCBRVE1GTExEKC0xLjExMDIzODU4MTllLTAwMiksCisgICAgUVRNRkxMRCgtMS4yNTk3MjU2NTczZS0wMDMpLCBRVE1GTExEKC0xLjAzMjE1NDYzNDZlLTAwMiksCisgICAgUVRNRkxMRCgtNy4zOTE1OTIxMTUyZS0wMDIpLCBRVE1GTExEKC03Ljc0MjUzNzg1NjFlLTAwMSksCisgICAgUVRNRkxMRCgtMS4wMzU2OTY4MjY5ZS0wMDIpLCBRVE1GTExEKC0xLjE2OTE0Mzk0MzFlLTAwMyksCisgICAgUVRNRkxMRCgtMS4wMzIwMzc4NDY3ZS0wMDIpLCBRVE1GTExEKC02Ljc0MTA4Nzg4MzdlLTAwMiksCisgICAgUVRNRkxMRCgtNy42Mzg2NDkzNDQ0ZS0wMDEpLCBRVE1GTExEKC05LjYyMDAwNDMzMzZlLTAwMyksCisgICAgUVRNRkxMRCgtMS4wNzQzMDAxNDc2ZS0wMDMpLCBRVE1GTExEKC0xLjAzMDE2MzAwMTNlLTAwMiksCisgICAgUVRNRkxMRCgtNi4wNjI4NDQ3NjgyZS0wMDIpLCBRVE1GTExEKC03LjUzMjUzNDU5OTNlLTAwMSksCisgICAgUVRNRkxMRCgtOC44OTQ5Mjk2NjIzZS0wMDMpLCBRVE1GTExEKC05Ljc1MzUzMTE5NDNlLTAwNCksCisgICAgUVRNRkxMRCgtMS4wMjYzODk4NDEwZS0wMDIpLCBRVE1GTExEKC01LjM1Njg3NTgwNzBlLTAwMiksCisgICAgUVRNRkxMRCgtNy40MjQyOTQ5NDg2ZS0wMDEpLCBRVE1GTExEKC04LjE4MzcxMTIwODRlLTAwMyksCisgICAgUVRNRkxMRCgtOC43MjQ4NTkyMTcyZS0wMDQpLCBRVE1GTExEKC0xLjAyMDU3NTk2NjdlLTAwMiksCisgICAgUVRNRkxMRCgtNC42MjMyNDUwNzUzZS0wMDIpLCBRVE1GTExEKC03LjMxNDAzNTI5NjRlLTAwMSksCisgICAgUVRNRkxMRCgtNy40OTAxMDIyMDE3ZS0wMDMpLCBRVE1GTExEKC03LjY1OTEwMTM5MzFlLTAwNCksCisgICAgUVRNRkxMRCgtMS4wMTI1Njc1MjM5ZS0wMDIpLCBRVE1GTExEKC0zLjg2MTk5NTA0MTRlLTAwMiksCisgICAgUVRNRkxMRCgtNy4yMDE4NTk5NTEwZS0wMDEpLCBRVE1GTExEKC02LjgxNjU3OTAyOTBlLTAwMyksCisgICAgUVRNRkxMRCgtNi41NTgwODQyNzg0ZS0wMDQpLCBRVE1GTExEKC0xLjAwMjIyMTgzMzllLTAwMiksCisgICAgUVRNRkxMRCgtMy4wNzMyNTQ3ODY0ZS0wMDIpLCBRVE1GTExEKC03LjA4Nzg4MTU2NTFlLTAwMSksCisgICAgUVRNRkxMRCgtNi4xNjQyNDIwNDc4ZS0wMDMpLCBRVE1GTExEKC01LjQyNDc3MzU1MzRlLTAwNCksCisgICAgUVRNRkxMRCgtOS44OTM3Mjg0MjAxZS0wMDMpLCBRVE1GTExEKC0yLjI1NzE0NzgwMzllLTAwMiksCisgICAgUVRNRkxMRCgtNi45NzIyMDE0NjY2ZS0wMDEpLCBRVE1GTExEKC01LjUzNzM4MTM5NTdlLTAwMyksCisgICAgUVRNRkxMRCgtNC4yNTk2NjE5NDYwZS0wMDQpLCBRVE1GTExEKC05LjczODkyOTU2OTdlLTAwMyksCisgICAgUVRNRkxMRCgtMS40MTM4NTcwOTg3ZS0wMDIpLCBRVE1GTExEKC02Ljg1NDkyOTkyNDBlLTAwMSksCisgICAgUVRNRkxMRCgtNC45MzcyNjA4NzczZS0wMDMpLCBRVE1GTExEKC0zLjA2NTcxMjgwODJlLTAwNCksCisgICAgUVRNRkxMRCgtOS41NTYwODk1Mjc5ZS0wMDMpLCBRVE1GTExEKC01LjQzNTY3MjU4ODZlLTAwMyksCisgICAgUVRNRkxMRCgtNi43MzYxNzQyMjU4ZS0wMDEpLCBRVE1GTExEKC00LjM2NTMwNzI3ODllLTAwMyksCisgICAgUVRNRkxMRCgtMS44NDUxNjMyMDU5ZS0wMDQpLCBRVE1GTExEKC05LjM0MzgxOTY5MjdlLTAwMyksCisgICAgUVRNRkxMRCgzLjUzNDY3MzAxNDdlLTAwMyksICBRVE1GTExEKC02LjYxNjA0NDA0NDVlLTAwMSksCisgICAgUVRNRkxMRCgtMy44MjUxODA5MzEwZS0wMDMpLCBRVE1GTExEKC02LjAwMjcyOTc4NzdlLTAwNSksCisgICAgUVRNRkxMRCgtOS4xMDA0NDQ2MTQ5ZS0wMDMpLCBRVE1GTExEKDEuMjc3MDAwNTUwMmUtMDAyKSwKKyAgICBRVE1GTExEKC02LjQ5NDY1NDQxNzBlLTAwMSksIFFUTUZMTEQoLTMuMzE0NzU1MzkxM2UtMDAzKSwKKyAgICBRVE1GTExEKDYuNjYxODE4MDQyNmUtMDA1KSwgIFFUTUZMTEQoLTguODI0NTI2MzMyM2UtMDAzKSwKKyAgICBRVE1GTExEKDIuMjI2NzIwMTkxNWUtMDAyKSwgIFFUTUZMTEQoLTYuMzcyMTAzMDk1MWUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjgzODcwOTE1ODhlLTAwMyksIFFUTUZMTEQoMS45NTE4MzI2NzM1ZS0wMDQpLAorICAgIFFUTUZMTEQoLTguNTE0NTEwNDY3NmUtMDAzKSwgUVRNRkxMRCgzLjIwMjMwMTI2MzhlLTAwMiksCisgICAgUVRNRkxMRCgtNi4yNDg1MDUxMTU1ZS0wMDEpLCBRVE1GTExEKC0yLjM5NzUwNDg2ODBlLTAwMyksCisgICAgUVRNRkxMRCgzLjI1NDUwNDQwODdlLTAwNCksICBRVE1GTExEKC04LjE2ODc4MTE3NjJlLTAwMyksCisgICAgUVRNRkxMRCg0LjIwMzM4MTAxNjllLTAwMiksICBRVE1GTExEKC02LjEyMzk4MDI4MzdlLTAwMSksCisgICAgUVRNRkxMRCgtMS45ODA3MjAzMjA3ZS0wMDMpLCBRVE1GTExEKDQuNTcxMjUxMDQ3M2UtMDA0KSwKKyAgICBRVE1GTExEKC03Ljc4NTkxNzI1OThlLTAwMyksIFFUTUZMTEQoNS4yMjk1ODkzNDMxZS0wMDIpLAorICAgIFFUTUZMTEQoLTUuOTk4NjE5MTk4OGUtMDAxKSwgUVRNRkxMRCgtMS42MDEwNTM5ODM5ZS0wMDMpLAorICAgIFFUTUZMTEQoNS45MDE1MTQwODY5ZS0wMDQpLCAgUVRNRkxMRCgtNy4zNjQ1MzcxMDEyZS0wMDMpLAorICAgIFFUTUZMTEQoNi4yODA1MTM4NTI4ZS0wMDIpLCAgUVRNRkxMRCgtNS44NzI1NTk1NDc0ZS0wMDEpLAorICAgIFFUTUZMTEQoLTEuMjMyMDc0MzQwOGUtMDAzKSwgUVRNRkxMRCg3LjI1MDg2ODk0ODJlLTAwNCksCisgICAgUVRNRkxMRCgtNi45MDMwNDYyNzY0ZS0wMDMpLCBRVE1GTExEKDcuMzU1NzkzNTY1NWUtMDAyKSwKKyAgICBRVE1GTExEKC01Ljc0NjAwMTYwMTJlLTAwMSksIFFUTUZMTEQoLTcuOTQ5MjYwNzYyMGUtMDA0KX07CiAKIC8vQHsKIC8qIQpAQCAtMTgzMyw5NSArNjQ3Niw2NCBAQAogLyohIHNpbiAoMy4xNDE1OTI2NTM1ODk3OTMyMyAvICgyKkwpICogbikgLCBMPTY0Ki8KIExOS19TRUNUSU9OX0NPTlNUREFUQQogUkFNX0FMSUdOCi1jb25zdCBGSVhQX1dUUCBzaW5fdHdpZGRsZV9MNjRbXT0KLXsKLSAgV1RDUCgweDdmZmZmZmZmLCAweDAwMDAwMDAwKSwgV1RDUCgweDdmZjYyMTgyLCAweDAzMjQyYWJmKSwgV1RDUCgweDdmZDg4NzhlLCAweDA2NDdkOTdjKSwgV1RDUCgweDdmYTczNmI0LCAweDA5NmE5MDQ5KSwKLSAgV1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwgV1RDUCgweDdmMDk5MWM0LCAweDBmYWIyNzJiKSwgV1RDUCgweDdlOWQ1NWZjLCAweDEyYzgxMDZmKSwgV1RDUCgweDdlMWQ5M2VhLCAweDE1ZTIxNDQ1KSwKLSAgV1RDUCgweDdkOGE1ZjQwLCAweDE4ZjhiODNjKSwgV1RDUCgweDdjZTNjZWIyLCAweDFjMGI4MjZhKSwgV1RDUCgweDdjMjlmYmVlLCAweDFmMTlmOTdiKSwgV1RDUCgweDdiNWQwMzllLCAweDIyMjNhNGM1KSwKLSAgV1RDUCgweDdhN2QwNTViLCAweDI1MjgwYzVlKSwgV1RDUCgweDc5OGEyM2IxLCAweDI4MjZiOTI4KSwgV1RDUCgweDc4ODQ4NDE0LCAweDJiMWYzNGViKSwgV1RDUCgweDc3NmM0ZWRiLCAweDJlMTEwYTYyKSwKLSAgV1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgV1RDUCgweDc1MDRkMzQ1LCAweDMzZGVmMjg3KSwgV1RDUCgweDczYjVlYmQxLCAweDM2YmEyMDE0KSwgV1RDUCgweDcyNTUyYzg1LCAweDM5OGNkZDMyKSwKLSAgV1RDUCgweDcwZTJjYmM2LCAweDNjNTZiYTcwKSwgV1RDUCgweDZmNWYwMmIyLCAweDNmMTc0OWI4KSwgV1RDUCgweDZkY2EwZDE0LCAweDQxY2UxZTY1KSwgV1RDUCgweDZjMjQyOTYwLCAweDQ0N2FjZDUwKSwKLSAgV1RDUCgweDZhNmQ5OGE0LCAweDQ3MWNlY2U3KSwgV1RDUCgweDY4YTY5ZTgxLCAweDQ5YjQxNTMzKSwgV1RDUCgweDY2Y2Y4MTIwLCAweDRjM2ZkZmY0KSwgV1RDUCgweDY0ZTg4OTI2LCAweDRlYmZlOGE1KSwKLSAgV1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwgV1RDUCgweDYwZWMzODMwLCAweDUzOWIyYWYwKSwgV1RDUCgweDVlZDc3YzhhLCAweDU1ZjVhNGQyKSwgV1RDUCgweDVjYjQyMGUwLCAweDU4NDJkZDU0KSwKLSAgV1RDUCgweDVhODI3OTlhLCAweDVhODI3OTlhKQotICAsIFdUQ1AoMHg1ODQyZGQ1NCwgMHg1Y2I0MjBlMCksIFdUQ1AoMHg1NWY1YTRkMiwgMHg1ZWQ3N2M4YSksIFdUQ1AoMHg1MzliMmFmMCwgMHg2MGVjMzgzMCksCi0gIFdUQ1AoMHg1MTMzY2M5NCwgMHg2MmYyMDFhYyksIFdUQ1AoMHg0ZWJmZThhNSwgMHg2NGU4ODkyNiksIFdUQ1AoMHg0YzNmZGZmNCwgMHg2NmNmODEyMCksIFdUQ1AoMHg0OWI0MTUzMywgMHg2OGE2OWU4MSksCi0gIFdUQ1AoMHg0NzFjZWNlNywgMHg2YTZkOThhNCksIFdUQ1AoMHg0NDdhY2Q1MCwgMHg2YzI0Mjk2MCksIFdUQ1AoMHg0MWNlMWU2NSwgMHg2ZGNhMGQxNCksIFdUQ1AoMHgzZjE3NDliOCwgMHg2ZjVmMDJiMiksCi0gIFdUQ1AoMHgzYzU2YmE3MCwgMHg3MGUyY2JjNiksIFdUQ1AoMHgzOThjZGQzMiwgMHg3MjU1MmM4NSksIFdUQ1AoMHgzNmJhMjAxNCwgMHg3M2I1ZWJkMSksIFdUQ1AoMHgzM2RlZjI4NywgMHg3NTA0ZDM0NSksCi0gIFdUQ1AoMHgzMGZiYzU0ZCwgMHg3NjQxYWYzZCksIFdUQ1AoMHgyZTExMGE2MiwgMHg3NzZjNGVkYiksIFdUQ1AoMHgyYjFmMzRlYiwgMHg3ODg0ODQxNCksIFdUQ1AoMHgyODI2YjkyOCwgMHg3OThhMjNiMSksCi0gIFdUQ1AoMHgyNTI4MGM1ZSwgMHg3YTdkMDU1YiksIFdUQ1AoMHgyMjIzYTRjNSwgMHg3YjVkMDM5ZSksIFdUQ1AoMHgxZjE5Zjk3YiwgMHg3YzI5ZmJlZSksIFdUQ1AoMHgxYzBiODI2YSwgMHg3Y2UzY2ViMiksCi0gIFdUQ1AoMHgxOGY4YjgzYywgMHg3ZDhhNWY0MCksIFdUQ1AoMHgxNWUyMTQ0NSwgMHg3ZTFkOTNlYSksIFdUQ1AoMHgxMmM4MTA2ZiwgMHg3ZTlkNTVmYyksIFdUQ1AoMHgwZmFiMjcyYiwgMHg3ZjA5OTFjNCksCi0gIFdUQ1AoMHgwYzhiZDM1ZSwgMHg3ZjYyMzY4ZiksIFdUQ1AoMHgwOTZhOTA0OSwgMHg3ZmE3MzZiNCksIFdUQ1AoMHgwNjQ3ZDk3YywgMHg3ZmQ4ODc4ZSksIFdUQ1AoMHgwMzI0MmFiZiwgMHg3ZmY2MjE4MikKLX07Citjb25zdCBGSVhQX1dUUCBzaW5fdHdpZGRsZV9MNjRbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmZmZmYsIDB4MDAwMDAwMDApLCBXVENQKDB4N2ZmNjIxODIsIDB4MDMyNDJhYmYpLAorICAgIFdUQ1AoMHg3ZmQ4ODc4ZSwgMHgwNjQ3ZDk3YyksIFdUQ1AoMHg3ZmE3MzZiNCwgMHgwOTZhOTA0OSksCisgICAgV1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwgV1RDUCgweDdmMDk5MWM0LCAweDBmYWIyNzJiKSwKKyAgICBXVENQKDB4N2U5ZDU1ZmMsIDB4MTJjODEwNmYpLCBXVENQKDB4N2UxZDkzZWEsIDB4MTVlMjE0NDUpLAorICAgIFdUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksIFdUQ1AoMHg3Y2UzY2ViMiwgMHgxYzBiODI2YSksCisgICAgV1RDUCgweDdjMjlmYmVlLCAweDFmMTlmOTdiKSwgV1RDUCgweDdiNWQwMzllLCAweDIyMjNhNGM1KSwKKyAgICBXVENQKDB4N2E3ZDA1NWIsIDB4MjUyODBjNWUpLCBXVENQKDB4Nzk4YTIzYjEsIDB4MjgyNmI5MjgpLAorICAgIFdUQ1AoMHg3ODg0ODQxNCwgMHgyYjFmMzRlYiksIFdUQ1AoMHg3NzZjNGVkYiwgMHgyZTExMGE2MiksCisgICAgV1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgV1RDUCgweDc1MDRkMzQ1LCAweDMzZGVmMjg3KSwKKyAgICBXVENQKDB4NzNiNWViZDEsIDB4MzZiYTIwMTQpLCBXVENQKDB4NzI1NTJjODUsIDB4Mzk4Y2RkMzIpLAorICAgIFdUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksIFdUQ1AoMHg2ZjVmMDJiMiwgMHgzZjE3NDliOCksCisgICAgV1RDUCgweDZkY2EwZDE0LCAweDQxY2UxZTY1KSwgV1RDUCgweDZjMjQyOTYwLCAweDQ0N2FjZDUwKSwKKyAgICBXVENQKDB4NmE2ZDk4YTQsIDB4NDcxY2VjZTcpLCBXVENQKDB4NjhhNjllODEsIDB4NDliNDE1MzMpLAorICAgIFdUQ1AoMHg2NmNmODEyMCwgMHg0YzNmZGZmNCksIFdUQ1AoMHg2NGU4ODkyNiwgMHg0ZWJmZThhNSksCisgICAgV1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwgV1RDUCgweDYwZWMzODMwLCAweDUzOWIyYWYwKSwKKyAgICBXVENQKDB4NWVkNzdjOGEsIDB4NTVmNWE0ZDIpLCBXVENQKDB4NWNiNDIwZTAsIDB4NTg0MmRkNTQpLAorICAgIFdUQ1AoMHg1YTgyNzk5YSwgMHg1YTgyNzk5YSksIFdUQ1AoMHg1ODQyZGQ1NCwgMHg1Y2I0MjBlMCksCisgICAgV1RDUCgweDU1ZjVhNGQyLCAweDVlZDc3YzhhKSwgV1RDUCgweDUzOWIyYWYwLCAweDYwZWMzODMwKSwKKyAgICBXVENQKDB4NTEzM2NjOTQsIDB4NjJmMjAxYWMpLCBXVENQKDB4NGViZmU4YTUsIDB4NjRlODg5MjYpLAorICAgIFdUQ1AoMHg0YzNmZGZmNCwgMHg2NmNmODEyMCksIFdUQ1AoMHg0OWI0MTUzMywgMHg2OGE2OWU4MSksCisgICAgV1RDUCgweDQ3MWNlY2U3LCAweDZhNmQ5OGE0KSwgV1RDUCgweDQ0N2FjZDUwLCAweDZjMjQyOTYwKSwKKyAgICBXVENQKDB4NDFjZTFlNjUsIDB4NmRjYTBkMTQpLCBXVENQKDB4M2YxNzQ5YjgsIDB4NmY1ZjAyYjIpLAorICAgIFdUQ1AoMHgzYzU2YmE3MCwgMHg3MGUyY2JjNiksIFdUQ1AoMHgzOThjZGQzMiwgMHg3MjU1MmM4NSksCisgICAgV1RDUCgweDM2YmEyMDE0LCAweDczYjVlYmQxKSwgV1RDUCgweDMzZGVmMjg3LCAweDc1MDRkMzQ1KSwKKyAgICBXVENQKDB4MzBmYmM1NGQsIDB4NzY0MWFmM2QpLCBXVENQKDB4MmUxMTBhNjIsIDB4Nzc2YzRlZGIpLAorICAgIFdUQ1AoMHgyYjFmMzRlYiwgMHg3ODg0ODQxNCksIFdUQ1AoMHgyODI2YjkyOCwgMHg3OThhMjNiMSksCisgICAgV1RDUCgweDI1MjgwYzVlLCAweDdhN2QwNTViKSwgV1RDUCgweDIyMjNhNGM1LCAweDdiNWQwMzllKSwKKyAgICBXVENQKDB4MWYxOWY5N2IsIDB4N2MyOWZiZWUpLCBXVENQKDB4MWMwYjgyNmEsIDB4N2NlM2NlYjIpLAorICAgIFdUQ1AoMHgxOGY4YjgzYywgMHg3ZDhhNWY0MCksIFdUQ1AoMHgxNWUyMTQ0NSwgMHg3ZTFkOTNlYSksCisgICAgV1RDUCgweDEyYzgxMDZmLCAweDdlOWQ1NWZjKSwgV1RDUCgweDBmYWIyNzJiLCAweDdmMDk5MWM0KSwKKyAgICBXVENQKDB4MGM4YmQzNWUsIDB4N2Y2MjM2OGYpLCBXVENQKDB4MDk2YTkwNDksIDB4N2ZhNzM2YjQpLAorICAgIFdUQ1AoMHgwNjQ3ZDk3YywgMHg3ZmQ4ODc4ZSksIFdUQ1AoMHgwMzI0MmFiZiwgMHg3ZmY2MjE4Mil9OwogCi1MTktfU0VDVElPTl9DT05TVERBVEEKLVJBTV9BTElHTgotY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzY0W10gPQotewotICBXVENQKDB4N2ZmZDg4NWEsIDB4MDE5MjFkMjApLCBXVENQKDB4N2ZlOWNiYzAsIDB4MDRiNjE5NWQpLCBXVENQKDB4N2ZjMjU1OTYsIDB4MDdkOTViOWUpLCBXVENQKDB4N2Y4NzJiZjMsIDB4MGFmYjY4MDUpLAotICBXVENQKDB4N2YzODU3ZjYsIDB4MGUxYmMyZTQpLCBXVENQKDB4N2VkNWU1YzYsIDB4MTEzOWYwY2YpLCBXVENQKDB4N2U1ZmU0OTMsIDB4MTQ1NTc2YjEpLCBXVENQKDB4N2RkNjY2OGYsIDB4MTc2ZGQ5ZGUpLAotICBXVENQKDB4N2QzOTgwZWMsIDB4MWE4MmEwMjYpLCBXVENQKDB4N2M4OTRiZGUsIDB4MWQ5MzRmZTUpLCBXVENQKDB4N2JjNWUyOTAsIDB4MjA5ZjcwMWMpLCBXVENQKDB4N2FlZjYzMjMsIDB4MjNhNjg4N2YpLAotICBXVENQKDB4N2EwNWVlYWQsIDB4MjZhODIxODYpLCBXVENQKDB4NzkwOWE5MmQsIDB4MjlhM2M0ODUpLCBXVENQKDB4NzdmYWI5ODksIDB4MmM5OGZiYmEpLCBXVENQKDB4NzZkOTQ5ODksIDB4MmY4NzUyNjIpLAotICBXVENQKDB4NzVhNTg1Y2YsIDB4MzI2ZTU0YzcpLCBXVENQKDB4NzQ1ZjlkZDEsIDB4MzU0ZDkwNTcpLCBXVENQKDB4NzMwN2MzZDAsIDB4MzgyNDkzYjApLCBXVENQKDB4NzE5ZTJjZDIsIDB4M2FmMmVlYjcpLAotICBXVENQKDB4NzAyMzEwOWEsIDB4M2RiODMyYTYpLCBXVENQKDB4NmU5NmE5OWQsIDB4NDA3M2YyMWQpLCBXVENQKDB4NmNmOTM0ZmMsIDB4NDMyNWMxMzUpLCBXVENQKDB4NmI0YWYyNzksIDB4NDVjZDM1OGYpLAotICBXVENQKDB4Njk4YzI0NmMsIDB4NDg2OWU2NjUpLCBXVENQKDB4NjdiZDBmYmQsIDB4NGFmYjZjOTgpLCBXVENQKDB4NjVkZGZiZDMsIDB4NGQ4MTYyYzQpLCBXVENQKDB4NjNlZjMyOTAsIDB4NGZmYjY1NGQpLAotICBXVENQKDB4NjFmMTAwM2YsIDB4NTI2OTEyNmUpLCBXVENQKDB4NWZlM2IzOGQsIDB4NTRjYTBhNGIpLCBXVENQKDB4NWRjNzlkN2MsIDB4NTcxZGVlZmEpLCBXVENQKDB4NWI5ZDExNTQsIDB4NTk2NDY0OTgpLAotfTsKLQotCi1MTktfU0VDVElPTl9DT05TVERBVEEKLVJBTV9BTElHTgotY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzMyW10gPQotewotICBXVENQKDB4N2ZmNjIxODIsIDB4MDMyNDJhYmYpLCBXVENQKDB4N2ZhNzM2YjQsIDB4MDk2YTkwNDkpLCBXVENQKDB4N2YwOTkxYzQsIDB4MGZhYjI3MmIpLCBXVENQKDB4N2UxZDkzZWEsIDB4MTVlMjE0NDUpLAotICBXVENQKDB4N2NlM2NlYjIsIDB4MWMwYjgyNmEpLCBXVENQKDB4N2I1ZDAzOWUsIDB4MjIyM2E0YzUpLCBXVENQKDB4Nzk4YTIzYjEsIDB4MjgyNmI5MjgpLCBXVENQKDB4Nzc2YzRlZGIsIDB4MmUxMTBhNjIpLAotICBXVENQKDB4NzUwNGQzNDUsIDB4MzNkZWYyODcpLCBXVENQKDB4NzI1NTJjODUsIDB4Mzk4Y2RkMzIpLCBXVENQKDB4NmY1ZjAyYjIsIDB4M2YxNzQ5YjgpLCBXVENQKDB4NmMyNDI5NjAsIDB4NDQ3YWNkNTApLAotICBXVENQKDB4NjhhNjllODEsIDB4NDliNDE1MzMpLCBXVENQKDB4NjRlODg5MjYsIDB4NGViZmU4YTUpLCBXVENQKDB4NjBlYzM4MzAsIDB4NTM5YjJhZjApLCBXVENQKDB4NWNiNDIwZTAsIDB4NTg0MmRkNTQpLAotfTsKLQotCi0KLQotCi0KLQotCi1jb25zdCBVU0hPUlQgc3FydF90YWJbNDldPXsKLTB4NWE4MiwgMHg1ZDRiLCAweDYwMDAsIDB4NjJhMSwKLTB4NjUzMSwgMHg2N2IxLCAweDZhMjEsIDB4NmM4NCwKLTB4NmVkOSwgMHg3MTIzLCAweDczNjAsIDB4NzU5MywKLTB4NzdiYiwgMHg3OWRhLCAweDdiZWYsIDB4N2RmYiwKLTB4ODAwMCwgMHg4MWZjLCAweDgzZjAsIDB4ODVkZCwKLTB4ODdjMywgMHg4OWEzLCAweDhiN2MsIDB4OGQ0ZSwKLTB4OGYxYiwgMHg5MGUyLCAweDkyYTQsIDB4OTQ2MCwKLTB4OTYxNywgMHg5N2NhLCAweDk5NzcsIDB4OWIyMCwKLTB4OWNjNCwgMHg5ZTY0LCAweGEwMDAsIDB4YTE5NywKLTB4YTMyYiwgMHhhNGJhLCAweGE2NDYsIDB4YTdjZiwKLTB4YTk1MywgMHhhYWQ1LCAweGFjNTMsIDB4YWRjZCwKLTB4YWY0NSwgMHhiMGI5LCAweGIyMmIsIDB4YjM5OSwKLTB4YjUwNH07Citjb25zdCBVU0hPUlQgc3FydF90YWJbNDldID0geworICAgIDB4NWE4MiwgMHg1ZDRiLCAweDYwMDAsIDB4NjJhMSwgMHg2NTMxLCAweDY3YjEsIDB4NmEyMSwgMHg2Yzg0LCAweDZlZDksCisgICAgMHg3MTIzLCAweDczNjAsIDB4NzU5MywgMHg3N2JiLCAweDc5ZGEsIDB4N2JlZiwgMHg3ZGZiLCAweDgwMDAsIDB4ODFmYywKKyAgICAweDgzZjAsIDB4ODVkZCwgMHg4N2MzLCAweDg5YTMsIDB4OGI3YywgMHg4ZDRlLCAweDhmMWIsIDB4OTBlMiwgMHg5MmE0LAorICAgIDB4OTQ2MCwgMHg5NjE3LCAweDk3Y2EsIDB4OTk3NywgMHg5YjIwLCAweDljYzQsIDB4OWU2NCwgMHhhMDAwLCAweGExOTcsCisgICAgMHhhMzJiLCAweGE0YmEsIDB4YTY0NiwgMHhhN2NmLCAweGE5NTMsIDB4YWFkNSwgMHhhYzUzLCAweGFkY2QsIDB4YWY0NSwKKyAgICAweGIwYjksIDB4YjIyYiwgMHhiMzk5LCAweGI1MDR9OwogCiBMTktfU0VDVElPTl9DT05TVERBVEFfTDEKLWNvbnN0IEZJWFBfREJMIGludkNvdW50WzgwXT0gIC8qIFRoaXMgY291bGQgYmUgMTYtYml0IHdpZGUgKi8KLXsKLSAgICAweDAwMDAwMDAwLCAweDdmZmZmZmZmLCAweDQwMDAwMDAwLCAweDJhYWFhYWFiLCAweDIwMDAwMDAwLAotICAgIDB4MTk5OTk5OWEsIDB4MTU1NTU1NTUsIDB4MTI0OTI0OTIsIDB4MTAwMDAwMDAsIDB4MGUzOGUzOGUsCi0gICAgMHgwY2NjY2NjZCwgMHgwYmEyZThiYSwgMHgwYWFhYWFhYiwgMHgwOWQ4OWQ4YSwgMHgwOTI0OTI0OSwKLSAgICAweDA4ODg4ODg5LCAweDA4MDAwMDAwLCAweDA3ODc4Nzg4LCAweDA3MWM3MWM3LCAweDA2YmNhMWFmLAotICAgIDB4MDY2NjY2NjYsIDB4MDYxODYxODYsIDB4MDVkMTc0NWQsIDB4MDU5MGIyMTYsIDB4MDU1NTU1NTUsCi0gICAgMHgwNTFlYjg1MiwgMHgwNGVjNGVjNSwgMHgwNGJkYTEyZiwgMHgwNDkyNDkyNSwgMHgwNDY5ZWU1OCwKLSAgICAweDA0NDQ0NDQ0LCAweDA0MjEwODQyLCAweDA0MDAwMDAwLCAweDAzZTBmODNlLCAweDAzYzNjM2M0LAotICAgIDB4MDNhODNhODQsIDB4MDM4ZTM4ZTQsIDB4MDM3NTlmMjMsIDB4MDM1ZTUwZDgsIDB4MDM0ODM0ODMsCi0gICAgMHgwMzMzMzMzMywgMHgwMzFmMzgzMiwgMHgwMzBjMzBjMywgMHgwMmZhMGJlOCwgMHgwMmU4YmEyZiwKLSAgICAweDAyZDgyZDgzLCAweDAyYzg1OTBiLCAweDAyYjkzMTA1LCAweDAyYWFhYWFiLCAweDAyOWNiYzE1LAotICAgIDB4MDI4ZjVjMjksIDB4MDI4MjgyODMsIDB4MDI3NjI3NjIsIDB4MDI2YTQzOWYsIDB4MDI1ZWQwOTgsCi0gICAgMHgwMjUzYzgyNSwgMHgwMjQ5MjQ5MiwgMHgwMjNlZTA5MCwgMHgwMjM0ZjcyYywgMHgwMjJiNjNjYywKLSAgICAweDAyMjIyMjIyLCAweDAyMTkyZTJhLCAweDAyMTA4NDIxLCAweDAyMDgyMDgyLCAweDAyMDAwMDAwLAotICAgIDB4MDFmODFmODIsIDB4MDFmMDdjMWYsIDB4MDFlOTEzMWIsIDB4MDFlMWUxZTIsIDB4MDFkYWU2MDcsCi0gICAgMHgwMWQ0MWQ0MiwgMHgwMWNkODU2OSwgMHgwMWM3MWM3MiwgMHgwMWMwZTA3MCwgMHgwMWJhY2Y5MSwKLSAgICAweDAxYjRlODFiLCAweDAxYWYyODZjLCAweDAxYTk4ZWY2LCAweDAxYTQxYTQyLCAweDAxOWVjOGU5Ci19OwotCitjb25zdCBGSVhQX0RCTCBpbnZDb3VudFs4MF0gPSAvKiBUaGlzIGNvdWxkIGJlIDE2LWJpdCB3aWRlICovCisgICAgezB4MDAwMDAwMDAsIDB4N2ZmZmZmZmYsIDB4NDAwMDAwMDAsIDB4MmFhYWFhYWIsIDB4MjAwMDAwMDAsIDB4MTk5OTk5OWEsCisgICAgIDB4MTU1NTU1NTUsIDB4MTI0OTI0OTIsIDB4MTAwMDAwMDAsIDB4MGUzOGUzOGUsIDB4MGNjY2NjY2QsIDB4MGJhMmU4YmEsCisgICAgIDB4MGFhYWFhYWIsIDB4MDlkODlkOGEsIDB4MDkyNDkyNDksIDB4MDg4ODg4ODksIDB4MDgwMDAwMDAsIDB4MDc4Nzg3ODgsCisgICAgIDB4MDcxYzcxYzcsIDB4MDZiY2ExYWYsIDB4MDY2NjY2NjYsIDB4MDYxODYxODYsIDB4MDVkMTc0NWQsIDB4MDU5MGIyMTYsCisgICAgIDB4MDU1NTU1NTUsIDB4MDUxZWI4NTIsIDB4MDRlYzRlYzUsIDB4MDRiZGExMmYsIDB4MDQ5MjQ5MjUsIDB4MDQ2OWVlNTgsCisgICAgIDB4MDQ0NDQ0NDQsIDB4MDQyMTA4NDIsIDB4MDQwMDAwMDAsIDB4MDNlMGY4M2UsIDB4MDNjM2MzYzQsIDB4MDNhODNhODQsCisgICAgIDB4MDM4ZTM4ZTQsIDB4MDM3NTlmMjMsIDB4MDM1ZTUwZDgsIDB4MDM0ODM0ODMsIDB4MDMzMzMzMzMsIDB4MDMxZjM4MzIsCisgICAgIDB4MDMwYzMwYzMsIDB4MDJmYTBiZTgsIDB4MDJlOGJhMmYsIDB4MDJkODJkODMsIDB4MDJjODU5MGIsIDB4MDJiOTMxMDUsCisgICAgIDB4MDJhYWFhYWIsIDB4MDI5Y2JjMTUsIDB4MDI4ZjVjMjksIDB4MDI4MjgyODMsIDB4MDI3NjI3NjIsIDB4MDI2YTQzOWYsCisgICAgIDB4MDI1ZWQwOTgsIDB4MDI1M2M4MjUsIDB4MDI0OTI0OTIsIDB4MDIzZWUwOTAsIDB4MDIzNGY3MmMsIDB4MDIyYjYzY2MsCisgICAgIDB4MDIyMjIyMjIsIDB4MDIxOTJlMmEsIDB4MDIxMDg0MjEsIDB4MDIwODIwODIsIDB4MDIwMDAwMDAsIDB4MDFmODFmODIsCisgICAgIDB4MDFmMDdjMWYsIDB4MDFlOTEzMWIsIDB4MDFlMWUxZTIsIDB4MDFkYWU2MDcsIDB4MDFkNDFkNDIsIDB4MDFjZDg1NjksCisgICAgIDB4MDFjNzFjNzIsIDB4MDFjMGUwNzAsIDB4MDFiYWNmOTEsIDB4MDFiNGU4MWIsIDB4MDFhZjI4NmMsIDB4MDFhOThlZjYsCisgICAgIDB4MDFhNDFhNDIsIDB4MDE5ZWM4ZTl9OwogCiAvKgogICogQml0c3RyZWFtIGRhdGEgbGlzdHMKQEAgLTE5MzMsNjM0ICs2NTQ1LDYwOCBAQAogICovCiAKIHN0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfc2NlW10gPSB7Ci0gIGFkdHNjcmNfc3RhcnRfcmVnMSwKLSAgZWxlbWVudF9pbnN0YW5jZV90YWcsCi0gIGdsb2JhbF9nYWluLAotICBpY3NfaW5mbywKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgcHVsc2UsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIHRuc19kYXRhLAotICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAotICAvKiBnYWluX2NvbnRyb2xfZGF0YSwgKi8KLSAgc3BlY3RyYWxfZGF0YSwKLSAgYWR0c2NyY19lbmRfcmVnMSwKLSAgZW5kX29mX3NlcXVlbmNlCi19OworICAgIGFkdHNjcmNfc3RhcnRfcmVnMSwgZWxlbWVudF9pbnN0YW5jZV90YWcsIGdsb2JhbF9nYWluLCBpY3NfaW5mbywKKyAgICBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBwdWxzZSwgdG5zX2RhdGFfcHJlc2VudCwgdG5zX2RhdGEsCisgICAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgICAvKiBnYWluX2NvbnRyb2xfZGF0YSwgKi8KKyAgICBzcGVjdHJhbF9kYXRhLCBhZHRzY3JjX2VuZF9yZWcxLCBlbmRfb2Zfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19zY2UgPSB7Ci0gIGVsX2FhY19zY2UsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfc2NlID0ge2VsX2FhY19zY2UsIHtOVUxMLCBOVUxMfX07CiAKLXN0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfY3BlW10gPSB7Ci0gIGFkdHNjcmNfc3RhcnRfcmVnMSwKLSAgZWxlbWVudF9pbnN0YW5jZV90YWcsCi0gIGNvbW1vbl93aW5kb3csCi0gIGxpbmtfc2VxdWVuY2UKLX07CisvKiBDQ0UgKi8KK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfY2NlW10gPSB7CisgICAgYWR0c2NyY19zdGFydF9yZWcxLCBlbGVtZW50X2luc3RhbmNlX3RhZywKKyAgICBjb3VwbGVkX2VsZW1lbnRzLCAvKiBDQ0Ugc3BlY2lmaWMgKi8KKyAgICBnbG9iYWxfZ2FpbiwgaWNzX2luZm8sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHB1bHNlLAorICAgIHRuc19kYXRhX3ByZXNlbnQsIHRuc19kYXRhLCBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAgIC8qIGdhaW5fY29udHJvbF9kYXRhLCAqLworICAgIHNwZWN0cmFsX2RhdGEsIGdhaW5fZWxlbWVudF9saXN0cywgLyogQ0NFIHNwZWNpZmljICovCisgICAgYWR0c2NyY19lbmRfcmVnMSwgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19jcGUwW10gPQotewotICAvKmNvbW1vbl93aW5kb3cgPSAwKi8KLSAgZ2xvYmFsX2dhaW4sCi0gIGljc19pbmZvLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgdG5zX2RhdGEsCi0gIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCi0gIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KLSAgc3BlY3RyYWxfZGF0YSwKLSAgbmV4dF9jaGFubmVsLAorc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfY2NlID0ge2VsX2FhY19jY2UsIHtOVUxMLCBOVUxMfX07CiAKLSAgYWR0c2NyY19zdGFydF9yZWcyLAotICBnbG9iYWxfZ2FpbiwKLSAgaWNzX2luZm8sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIHB1bHNlLAotICB0bnNfZGF0YV9wcmVzZW50LAotICB0bnNfZGF0YSwKLSAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKLSAgLypnYWluX2NvbnRyb2xfZGF0YSwqLwotICBzcGVjdHJhbF9kYXRhLAotICBhZHRzY3JjX2VuZF9yZWcxLAotICBhZHRzY3JjX2VuZF9yZWcyLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX2NwZVtdID0ge2FkdHNjcmNfc3RhcnRfcmVnMSwgZWxlbWVudF9pbnN0YW5jZV90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbl93aW5kb3csIGxpbmtfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX2NwZTFbXSA9Ci17Ci0gIC8qIGNvbW1vbl93aW5kb3cgPSAxICovCi0gIGljc19pbmZvLAotICBtcywKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfY3BlMFtdID0geworICAgIC8qY29tbW9uX3dpbmRvdyA9IDAqLworICAgIGdsb2JhbF9nYWluLCBpY3NfaW5mbywgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgcHVsc2UsCisgICAgdG5zX2RhdGFfcHJlc2VudCwgdG5zX2RhdGEsIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICAgIHNwZWN0cmFsX2RhdGEsIG5leHRfY2hhbm5lbCwKIAotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgcHVsc2UsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIHRuc19kYXRhLAotICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAotICAvKmdhaW5fY29udHJvbF9kYXRhLCovCi0gIHNwZWN0cmFsX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKKyAgICBhZHRzY3JjX3N0YXJ0X3JlZzIsIGdsb2JhbF9nYWluLCBpY3NfaW5mbywgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgICBwdWxzZSwgdG5zX2RhdGFfcHJlc2VudCwgdG5zX2RhdGEsIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICAgIHNwZWN0cmFsX2RhdGEsIGFkdHNjcmNfZW5kX3JlZzEsIGFkdHNjcmNfZW5kX3JlZzIsIGVuZF9vZl9zZXF1ZW5jZX07CiAKLSAgYWR0c2NyY19zdGFydF9yZWcyLAotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgcHVsc2UsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIHRuc19kYXRhLAotICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAotICAvKmdhaW5fY29udHJvbF9kYXRhLCovCi0gIHNwZWN0cmFsX2RhdGEsCi0gIGFkdHNjcmNfZW5kX3JlZzEsCi0gIGFkdHNjcmNfZW5kX3JlZzIsCi0gIGVuZF9vZl9zZXF1ZW5jZQotfTsKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfY3BlMVtdID0geworICAgIC8qIGNvbW1vbl93aW5kb3cgPSAxICovCisgICAgaWNzX2luZm8sIG1zLAogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jcGUwID0gewotICBlbF9hYWNfY3BlMCwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CisgICAgZ2xvYmFsX2dhaW4sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHB1bHNlLCB0bnNfZGF0YV9wcmVzZW50LAorICAgIHRuc19kYXRhLCBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAgIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KKyAgICBzcGVjdHJhbF9kYXRhLCBuZXh0X2NoYW5uZWwsCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX2NwZTEgPSB7Ci0gIGVsX2FhY19jcGUxLAotICB7IE5VTEwsIE5VTEwgfQotfTsKKyAgICBhZHRzY3JjX3N0YXJ0X3JlZzIsIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBwdWxzZSwKKyAgICB0bnNfZGF0YV9wcmVzZW50LCB0bnNfZGF0YSwgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgICAgc3BlY3RyYWxfZGF0YSwgYWR0c2NyY19lbmRfcmVnMSwgYWR0c2NyY19lbmRfcmVnMiwgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IGVsZW1lbnRfbGlzdF90IG5vZGVfYWFjX2NwZSA9IHsKLSAgZWxfYWFjX2NwZSwKLSAgeyAmbm9kZV9hYWNfY3BlMCwgJm5vZGVfYWFjX2NwZTEgfQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX2NwZTAgPSB7ZWxfYWFjX2NwZTAsIHtOVUxMLCBOVUxMfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX2NwZTEgPSB7ZWxfYWFjX2NwZTEsIHtOVUxMLCBOVUxMfX07CisKK3N0YXRpYyBjb25zdCBlbGVtZW50X2xpc3RfdCBub2RlX2FhY19jcGUgPSB7ZWxfYWFjX2NwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyZub2RlX2FhY19jcGUwLCAmbm9kZV9hYWNfY3BlMX19OwogCiAvKgogICogQU9UIEMtIHsxNywyM30KICAqIGVwQ29uZmlnID0gMCwxCiAgKi8KIHN0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfc2NlX2VwYzBbXSA9IHsKLSAgZWxlbWVudF9pbnN0YW5jZV90YWcsCi0gIGdsb2JhbF9nYWluLAotICBpY3NfaW5mbywKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgcHVsc2UsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCi0gIGdhaW5fY29udHJvbF9kYXRhLAotICBlc2MxX2hjciwgICAvKmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMsIGxlbmd0aF9vZl9ydmxjX3NmICovCi0gIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLwotICB0bnNfZGF0YSwKLSAgc3BlY3RyYWxfZGF0YSwKLSAgZW5kX29mX3NlcXVlbmNlCi19OworICAgIGVsZW1lbnRfaW5zdGFuY2VfdGFnLAorICAgIGdsb2JhbF9nYWluLAorICAgIGljc19pbmZvLAorICAgIHNlY3Rpb25fZGF0YSwKKyAgICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgICBwdWxzZSwKKyAgICB0bnNfZGF0YV9wcmVzZW50LAorICAgIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgZ2Fpbl9jb250cm9sX2RhdGEsCisgICAgZXNjMV9oY3IsICAvKmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMsIGxlbmd0aF9vZl9ydmxjX3NmICovCisgICAgZXNjMl9ydmxjLCAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKyAgICB0bnNfZGF0YSwKKyAgICBzcGVjdHJhbF9kYXRhLAorICAgIGVuZF9vZl9zZXF1ZW5jZX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX3NjZV9lcGMwID0gewotICBlbF9hYWNfc2NlX2VwYzAsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfc2NlX2VwYzAgPSB7ZWxfYWFjX3NjZV9lcGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKIAogc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19zY2VfZXBjMVtdID0gewotICBlbGVtZW50X2luc3RhbmNlX3RhZywKLSAgZ2xvYmFsX2dhaW4sCi0gIGljc19pbmZvLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKLSAgLypnYWluX2NvbnRyb2xfZGF0YSwqLwotICBlc2MxX2hjciwgICAvKmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMsIGxlbmd0aF9vZl9ydmxjX3NmICovCi0gIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLwotICB0bnNfZGF0YSwKLSAgc3BlY3RyYWxfZGF0YSwKLSAgZW5kX29mX3NlcXVlbmNlCi19OworICAgIGVsZW1lbnRfaW5zdGFuY2VfdGFnLCBnbG9iYWxfZ2FpbiwgaWNzX2luZm8sIHNlY3Rpb25fZGF0YSwKKyAgICBzY2FsZV9mYWN0b3JfZGF0YSwgcHVsc2UsIHRuc19kYXRhX3ByZXNlbnQsIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICAgIGVzYzFfaGNyLCAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLworICAgIGVzYzJfcnZsYywgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCisgICAgdG5zX2RhdGEsIHNwZWN0cmFsX2RhdGEsIGVuZF9vZl9zZXF1ZW5jZX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX3NjZV9lcGMxID0gewotICBlbF9hYWNfc2NlX2VwYzEsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfc2NlX2VwYzEgPSB7ZWxfYWFjX3NjZV9lcGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19jcGVfZXBjMFtdID0ge2VsZW1lbnRfaW5zdGFuY2VfdGFnLCBjb21tb25fd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfc2VxdWVuY2V9OwogCiBzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX2NwZTBfZXBjMFtdID0gewotICAvKiBjb21tb25fd2luZG93ID0gMCAqLwotICAvKiBFU0MgMTogKi8KLSAgZ2xvYmFsX2dhaW4sCi0gIGljc19pbmZvLAotICAvKiBsdHBfZGF0YV9wcmVzZW50LAotICAgICBsdHBfZGF0YSwKLSAgKi8KLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgcHVsc2UsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCi0gIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KLSAgZXNjMV9oY3IsICAvKmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMsIGxlbmd0aF9vZl9ydmxjX3NmICovCi0gIC8qIEVTQyAyOiAqLwotICBlc2MyX3J2bGMsIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLwotICAvKiBFU0MgMzogKi8KLSAgdG5zX2RhdGEsCi0gIC8qIEVTQyA0OiAqLwotICBzcGVjdHJhbF9kYXRhLAotICBuZXh0X2NoYW5uZWwsCisgICAgLyogY29tbW9uX3dpbmRvdyA9IDAgKi8KKyAgICAvKiBFU0MgMTogKi8KKyAgICBnbG9iYWxfZ2FpbiwgaWNzX2luZm8sCisgICAgLyogbHRwX2RhdGFfcHJlc2VudCwKKyAgICAgICBsdHBfZGF0YSwKKyAgICAqLworICAgIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHB1bHNlLCB0bnNfZGF0YV9wcmVzZW50LAorICAgIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICAgIGVzYzFfaGNyLCAvKmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMsIGxlbmd0aF9vZl9ydmxjX3NmICovCisgICAgLyogRVNDIDI6ICovCisgICAgZXNjMl9ydmxjLCAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKyAgICAvKiBFU0MgMzogKi8KKyAgICB0bnNfZGF0YSwKKyAgICAvKiBFU0MgNDogKi8KKyAgICBzcGVjdHJhbF9kYXRhLCBuZXh0X2NoYW5uZWwsCiAKLSAgLyogRVNDIDE6ICovCi0gIGdsb2JhbF9nYWluLAotICBpY3NfaW5mbywKLSAgLyogbHRwX2RhdGFfcHJlc2VudCwKLSAgICAgbHRwX2RhdGEsCi0gICovCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIHB1bHNlLAotICB0bnNfZGF0YV9wcmVzZW50LAotICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAotICAvKmdhaW5fY29udHJvbF9kYXRhLCovCi0gIGVzYzFfaGNyLCAgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KLSAgLyogRVNDIDI6ICovCi0gIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLwotICAvKiBFU0MgMzogKi8KLSAgdG5zX2RhdGEsCi0gIC8qIEVTQyA0OiAqLwotICBzcGVjdHJhbF9kYXRhLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CisgICAgLyogRVNDIDE6ICovCisgICAgZ2xvYmFsX2dhaW4sIGljc19pbmZvLAorICAgIC8qIGx0cF9kYXRhX3ByZXNlbnQsCisgICAgICAgbHRwX2RhdGEsCisgICAgKi8KKyAgICBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBwdWxzZSwgdG5zX2RhdGFfcHJlc2VudCwKKyAgICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAgIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KKyAgICBlc2MxX2hjciwgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLworICAgIC8qIEVTQyAyOiAqLworICAgIGVzYzJfcnZsYywgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCisgICAgLyogRVNDIDM6ICovCisgICAgdG5zX2RhdGEsCisgICAgLyogRVNDIDQ6ICovCisgICAgc3BlY3RyYWxfZGF0YSwgZW5kX29mX3NlcXVlbmNlfTsKIAogc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19jcGUxX2VwYzBbXSA9IHsKLSAgLyogY29tbW9uX3dpbmRvdyA9IDEgKi8KLSAgLyogRVNDIDA6ICovCi0gIGljc19pbmZvLAotICAvKiBsdHBfZGF0YV9wcmVzZW50LAotICAgICBsdHBfZGF0YSwKLSAgICAgbmV4dF9jaGFubmVsLAotICAgICBsdHBfZGF0YV9wcmVzZW50LAotICAgICBsdHBfZGF0YSwKLSAgICAgbmV4dF9jaGFubmVsLAotICAqLwotICBtcywKKyAgICAvKiBjb21tb25fd2luZG93ID0gMSAqLworICAgIC8qIEVTQyAwOiAqLworICAgIGljc19pbmZvLAorICAgIC8qIGx0cF9kYXRhX3ByZXNlbnQsCisgICAgICAgbHRwX2RhdGEsCisgICAgICAgbmV4dF9jaGFubmVsLAorICAgICAgIGx0cF9kYXRhX3ByZXNlbnQsCisgICAgICAgbHRwX2RhdGEsCisgICAgICAgbmV4dF9jaGFubmVsLAorICAgICovCisgICAgbXMsCiAKLSAgLyogRVNDIDE6ICovCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKLSAgLypnYWluX2NvbnRyb2xfZGF0YSwqLwotICBlc2MxX2hjciwgICAvKiBsZW5ndGhfb2ZfcmVvcmRlcmVkX3NwZWN0cmFsX2RhdGEsIGxlbmd0aF9vZl9sb25nZXN0X2NvZGV3b3JkICovCi0gIC8qIEVTQyAyOiAqLwotICBlc2MyX3J2bGMsICAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KLSAgLyogRVNDIDM6ICovCi0gIHRuc19kYXRhLAotICAvKiBFU0MgNDogKi8KLSAgc3BlY3RyYWxfZGF0YSwKLSAgbmV4dF9jaGFubmVsLAorICAgIC8qIEVTQyAxOiAqLworICAgIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBwdWxzZSwgdG5zX2RhdGFfcHJlc2VudCwKKyAgICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAgIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KKyAgICBlc2MxX2hjciwgLyogbGVuZ3RoX29mX3Jlb3JkZXJlZF9zcGVjdHJhbF9kYXRhLCBsZW5ndGhfb2ZfbG9uZ2VzdF9jb2Rld29yZAorICAgICAgICAgICAgICAgKi8KKyAgICAvKiBFU0MgMjogKi8KKyAgICBlc2MyX3J2bGMsIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLworICAgIC8qIEVTQyAzOiAqLworICAgIHRuc19kYXRhLAorICAgIC8qIEVTQyA0OiAqLworICAgIHNwZWN0cmFsX2RhdGEsIG5leHRfY2hhbm5lbCwKIAotICAvKiBFU0MgMTogKi8KLSAgZ2xvYmFsX2dhaW4sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIHB1bHNlLAotICB0bnNfZGF0YV9wcmVzZW50LAotICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAotICAvKmdhaW5fY29udHJvbF9kYXRhLCovCi0gIGVzYzFfaGNyLCAgIC8qIGxlbmd0aF9vZl9yZW9yZGVyZWRfc3BlY3RyYWxfZGF0YSwgbGVuZ3RoX29mX2xvbmdlc3RfY29kZXdvcmQgKi8KLSAgLyogRVNDIDI6ICovCi0gIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLwotICAvKiBFU0MgMzogKi8KLSAgdG5zX2RhdGEsCi0gIC8qIEVTQyA0OiAqLwotICBzcGVjdHJhbF9kYXRhLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CisgICAgLyogRVNDIDE6ICovCisgICAgZ2xvYmFsX2dhaW4sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHB1bHNlLCB0bnNfZGF0YV9wcmVzZW50LAorICAgIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICAgIGVzYzFfaGNyLCAvKiBsZW5ndGhfb2ZfcmVvcmRlcmVkX3NwZWN0cmFsX2RhdGEsIGxlbmd0aF9vZl9sb25nZXN0X2NvZGV3b3JkCisgICAgICAgICAgICAgICAqLworICAgIC8qIEVTQyAyOiAqLworICAgIGVzYzJfcnZsYywgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCisgICAgLyogRVNDIDM6ICovCisgICAgdG5zX2RhdGEsCisgICAgLyogRVNDIDQ6ICovCisgICAgc3BlY3RyYWxfZGF0YSwgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfY3BlMF9lcGMwID0gewotICBlbF9hYWNfY3BlMF9lcGMwLAotICB7IE5VTEwsIE5VTEwgfQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX2NwZTBfZXBjMCA9IHtlbF9hYWNfY3BlMF9lcGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBOVUxMfX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX2NwZTFfZXBjMCA9IHsKLSAgZWxfYWFjX2NwZTFfZXBjMCwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jcGUxX2VwYzAgPSB7ZWxfYWFjX2NwZTFfZXBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OwogCiBzdGF0aWMgY29uc3QgZWxlbWVudF9saXN0X3Qgbm9kZV9hYWNfY3BlX2VwYzAgPSB7Ci0gIGVsX2FhY19jcGUsCi0gIHsgJm5vZGVfYWFjX2NwZTBfZXBjMCwgJm5vZGVfYWFjX2NwZTFfZXBjMCB9Ci19OworICAgIGVsX2FhY19jcGVfZXBjMCwgeyZub2RlX2FhY19jcGUwX2VwYzAsICZub2RlX2FhY19jcGUxX2VwYzB9fTsKIAogc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19jcGUwX2VwYzFbXSA9IHsKLSAgZ2xvYmFsX2dhaW4sCi0gIGljc19pbmZvLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKLSAgLypnYWluX2NvbnRyb2xfZGF0YSwqLwotICBuZXh0X2NoYW5uZWwsCi0gIGdsb2JhbF9nYWluLAotICBpY3NfaW5mbywKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgcHVsc2UsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCi0gIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KLSAgbmV4dF9jaGFubmVsLAotICBlc2MxX2hjciwgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KLSAgbmV4dF9jaGFubmVsLAotICBlc2MxX2hjciwgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KLSAgbmV4dF9jaGFubmVsLAotICBlc2MyX3J2bGMsICAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KLSAgbmV4dF9jaGFubmVsLAotICBlc2MyX3J2bGMsICAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KLSAgbmV4dF9jaGFubmVsLAotICB0bnNfZGF0YSwKLSAgbmV4dF9jaGFubmVsLAotICB0bnNfZGF0YSwKLSAgbmV4dF9jaGFubmVsLAotICBzcGVjdHJhbF9kYXRhLAotICBuZXh0X2NoYW5uZWwsCi0gIHNwZWN0cmFsX2RhdGEsCi0gIGVuZF9vZl9zZXF1ZW5jZQotfTsKKyAgICBnbG9iYWxfZ2FpbiwgaWNzX2luZm8sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHB1bHNlLAorICAgIHRuc19kYXRhX3ByZXNlbnQsIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICAgIG5leHRfY2hhbm5lbCwgZ2xvYmFsX2dhaW4sIGljc19pbmZvLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBwdWxzZSwKKyAgICB0bnNfZGF0YV9wcmVzZW50LCBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAgIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KKyAgICBuZXh0X2NoYW5uZWwsIGVzYzFfaGNyLCAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLworICAgIG5leHRfY2hhbm5lbCwgZXNjMV9oY3IsICAvKmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMsIGxlbmd0aF9vZl9ydmxjX3NmICovCisgICAgbmV4dF9jaGFubmVsLCBlc2MyX3J2bGMsIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLworICAgIG5leHRfY2hhbm5lbCwgZXNjMl9ydmxjLCAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKyAgICBuZXh0X2NoYW5uZWwsIHRuc19kYXRhLCBuZXh0X2NoYW5uZWwsIHRuc19kYXRhLCBuZXh0X2NoYW5uZWwsIHNwZWN0cmFsX2RhdGEsCisgICAgbmV4dF9jaGFubmVsLCBzcGVjdHJhbF9kYXRhLCBlbmRfb2Zfc2VxdWVuY2V9OwogCiBzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX2NwZTFfZXBjMVtdID0gewotICBpY3NfaW5mbywKLSAgbXMsCi0gIGx0cF9kYXRhX3ByZXNlbnQsCi0gIC8qIGx0cF9kYXRhLCAqLwotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgcHVsc2UsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCi0gIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KLSAgbmV4dF9jaGFubmVsLAorICAgIGljc19pbmZvLCBtcywgbHRwX2RhdGFfcHJlc2VudCwKKyAgICAvKiBsdHBfZGF0YSwgKi8KKyAgICBnbG9iYWxfZ2Fpbiwgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgcHVsc2UsIHRuc19kYXRhX3ByZXNlbnQsCisgICAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgICAgbmV4dF9jaGFubmVsLAogCi0gIGx0cF9kYXRhX3ByZXNlbnQsCi0gIC8qIGx0cF9kYXRhLCAqLwotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgcHVsc2UsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCi0gIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KLSAgbmV4dF9jaGFubmVsLAotICBlc2MxX2hjciwgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KLSAgbmV4dF9jaGFubmVsLAotICBlc2MxX2hjciwgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KLSAgbmV4dF9jaGFubmVsLAotICBlc2MyX3J2bGMsICAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KLSAgbmV4dF9jaGFubmVsLAotICBlc2MyX3J2bGMsICAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKyAgICBsdHBfZGF0YV9wcmVzZW50LAorICAgIC8qIGx0cF9kYXRhLCAqLworICAgIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBwdWxzZSwgdG5zX2RhdGFfcHJlc2VudCwKKyAgICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAgIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KKyAgICBuZXh0X2NoYW5uZWwsIGVzYzFfaGNyLCAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLworICAgIG5leHRfY2hhbm5lbCwgZXNjMV9oY3IsICAvKmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMsIGxlbmd0aF9vZl9ydmxjX3NmICovCisgICAgbmV4dF9jaGFubmVsLCBlc2MyX3J2bGMsIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLworICAgIG5leHRfY2hhbm5lbCwgZXNjMl9ydmxjLCAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KIAotICBuZXh0X2NoYW5uZWwsCi0gIHRuc19kYXRhLAotICBuZXh0X2NoYW5uZWwsCi0gIHRuc19kYXRhLAotICBuZXh0X2NoYW5uZWwsCi0gIHNwZWN0cmFsX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgc3BlY3RyYWxfZGF0YSwKLSAgZW5kX29mX3NlcXVlbmNlCi19OworICAgIG5leHRfY2hhbm5lbCwgdG5zX2RhdGEsIG5leHRfY2hhbm5lbCwgdG5zX2RhdGEsIG5leHRfY2hhbm5lbCwgc3BlY3RyYWxfZGF0YSwKKyAgICBuZXh0X2NoYW5uZWwsIHNwZWN0cmFsX2RhdGEsIGVuZF9vZl9zZXF1ZW5jZX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX2NwZTBfZXBjMSA9IHsKLSAgZWxfYWFjX2NwZTBfZXBjMSwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jcGUwX2VwYzEgPSB7ZWxfYWFjX2NwZTBfZXBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jcGUxX2VwYzEgPSB7Ci0gIGVsX2FhY19jcGUxX2VwYzEsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfY3BlMV9lcGMxID0ge2VsX2FhY19jcGUxX2VwYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKIAogc3RhdGljIGNvbnN0IGVsZW1lbnRfbGlzdF90IG5vZGVfYWFjX2NwZV9lcGMxID0gewotICBlbF9hYWNfY3BlLAotICB7ICZub2RlX2FhY19jcGUwX2VwYzEsICZub2RlX2FhY19jcGUxX2VwYzEgfQotfTsKKyAgICBlbF9hYWNfY3BlLCB7Jm5vZGVfYWFjX2NwZTBfZXBjMSwgJm5vZGVfYWFjX2NwZTFfZXBjMX19OwogCiAvKgogICogQU9UID0gMjAKICAqIGVwQ29uZmlnID0gMAogICovCi1zdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfc2NhbF9zY2VfZXBjMFtdID0gewotICBpY3NfaW5mbywgICAgICAgICAgICAvKiBFU0MgMSAqLwotICB0bnNfZGF0YV9wcmVzZW50LAotICBsdHBfZGF0YV9wcmVzZW50LAotICAvKiBsdHBfZGF0YSwgKi8KLSAgZ2xvYmFsX2dhaW4sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIGVzYzFfaGNyLAotICBlc2MyX3J2bGMsICAgICAgICAgICAvKiBFU0MgMiAqLwotICB0bnNfZGF0YSwgICAgICAgICAgICAvKiBFU0MgMyAqLwotICBzcGVjdHJhbF9kYXRhLCAgICAgICAvKiBFU0MgNCAqLwotICBlbmRfb2Zfc2VxdWVuY2UKLX07CitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfc2NhbF9zY2VfZXBjMFtdID0ge2ljc19pbmZvLCAvKiBFU0MgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNfZGF0YV9wcmVzZW50LCBsdHBfZGF0YV9wcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsdHBfZGF0YSwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX2dhaW4sIHNlY3Rpb25fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmFjdG9yX2RhdGEsIGVzYzFfaGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2MyX3J2bGMsICAgICAvKiBFU0MgMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNfZGF0YSwgICAgICAvKiBFU0MgMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjdHJhbF9kYXRhLCAvKiBFU0MgNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfb2Zfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3NjYWxfc2NlX2VwYzAgPSB7Ci0gIGVsX3NjYWxfc2NlX2VwYzAsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9zY2FsX3NjZV9lcGMwID0ge2VsX3NjYWxfc2NlX2VwYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKIAogc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX3NjYWxfY3BlX2VwYzBbXSA9IHsKLSAgaWNzX2luZm8sICAgICAgICAgICAgLyogRVNDIDAgKi8KLSAgbXMsCi0gIHRuc19kYXRhX3ByZXNlbnQsICAgIC8qIEVTQyAxIChjaCAwKSAqLwotICBsdHBfZGF0YV9wcmVzZW50LAotICAvKiBsdHBfZGF0YSwgKi8KLSAgZ2xvYmFsX2dhaW4sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIGVzYzFfaGNyLAotICBlc2MyX3J2bGMsICAgICAgICAgICAvKiBFU0MgMiAoY2ggMCkgKi8KLSAgdG5zX2RhdGEsICAgICAgICAgICAgLyogRVNDIDMgKGNoIDApICovCi0gIHNwZWN0cmFsX2RhdGEsICAgICAgIC8qIEVTQyA0IChjaCAwKSAqLwotICBuZXh0X2NoYW5uZWwsCi0gIHRuc19kYXRhX3ByZXNlbnQsICAgIC8qIEVTQyAxIChjaCAxKSAqLwotICBsdHBfZGF0YV9wcmVzZW50LAotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgZXNjMV9oY3IsCi0gIGVzYzJfcnZsYywgICAgICAgICAgIC8qIEVTQyAyIChjaCAxKSAqLwotICB0bnNfZGF0YSwgICAgICAgICAgICAvKiBFU0MgMyAoY2ggMSkgKi8KLSAgc3BlY3RyYWxfZGF0YSwgICAgICAgLyogRVNDIDQgKGNoIDEpICovCi0gIGVuZF9vZl9zZXF1ZW5jZQotfTsKKyAgICBpY3NfaW5mbywgICAgICAgICAgICAgLyogRVNDIDAgKi8KKyAgICBtcywgdG5zX2RhdGFfcHJlc2VudCwgLyogRVNDIDEgKGNoIDApICovCisgICAgbHRwX2RhdGFfcHJlc2VudCwKKyAgICAvKiBsdHBfZGF0YSwgKi8KKyAgICBnbG9iYWxfZ2Fpbiwgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgZXNjMV9oY3IsCisgICAgZXNjMl9ydmxjLCAgICAgICAgICAgICAgICAgICAgICAvKiBFU0MgMiAoY2ggMCkgKi8KKyAgICB0bnNfZGF0YSwgICAgICAgICAgICAgICAgICAgICAgIC8qIEVTQyAzIChjaCAwKSAqLworICAgIHNwZWN0cmFsX2RhdGEsICAgICAgICAgICAgICAgICAgLyogRVNDIDQgKGNoIDApICovCisgICAgbmV4dF9jaGFubmVsLCB0bnNfZGF0YV9wcmVzZW50LCAvKiBFU0MgMSAoY2ggMSkgKi8KKyAgICBsdHBfZGF0YV9wcmVzZW50LCBnbG9iYWxfZ2Fpbiwgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgZXNjMV9oY3IsCisgICAgZXNjMl9ydmxjLCAgICAgLyogRVNDIDIgKGNoIDEpICovCisgICAgdG5zX2RhdGEsICAgICAgLyogRVNDIDMgKGNoIDEpICovCisgICAgc3BlY3RyYWxfZGF0YSwgLyogRVNDIDQgKGNoIDEpICovCisgICAgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9zY2FsX2NwZV9lcGMwID0gewotICBlbF9zY2FsX2NwZV9lcGMwLAotICB7IE5VTEwsIE5VTEwgfQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfc2NhbF9jcGVfZXBjMCA9IHtlbF9zY2FsX2NwZV9lcGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBOVUxMfX07CiAKIC8qCiAgKiBBT1QgPSAyMAogICogZXBDb25maWcgPSAxCiAgKi8KIHN0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9zY2FsX3NjZV9lcGMxW10gPSB7Ci0gIGljc19pbmZvLAotICB0bnNfZGF0YV9wcmVzZW50LAotICBsdHBfZGF0YV9wcmVzZW50LAotICAvKiBsdHBfZGF0YSwgKi8KLSAgZ2xvYmFsX2dhaW4sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIGVzYzFfaGNyLAotICB0bnNfZGF0YSwKLSAgc3BlY3RyYWxfZGF0YSwKLSAgZW5kX29mX3NlcXVlbmNlCi19OworICAgIGljc19pbmZvLCB0bnNfZGF0YV9wcmVzZW50LCBsdHBfZGF0YV9wcmVzZW50LAorICAgIC8qIGx0cF9kYXRhLCAqLworICAgIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBlc2MxX2hjciwgdG5zX2RhdGEsCisgICAgc3BlY3RyYWxfZGF0YSwgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9zY2FsX3NjZV9lcGMxID0gewotICBlbF9zY2FsX3NjZV9lcGMxLAotICB7IE5VTEwsIE5VTEwgfQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfc2NhbF9zY2VfZXBjMSA9IHtlbF9zY2FsX3NjZV9lcGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBOVUxMfX07CiAKIHN0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9zY2FsX2NwZV9lcGMxW10gPSB7Ci0gIGljc19pbmZvLAotICBtcywKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgbHRwX2RhdGFfcHJlc2VudCwKLSAgLyogbHRwX2RhdGEsICovCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBlc2MxX2hjciwKLSAgbmV4dF9jaGFubmVsLAotICB0bnNfZGF0YV9wcmVzZW50LAotICBsdHBfZGF0YV9wcmVzZW50LAotICAvKiBsdHBfZGF0YSwgKi8KLSAgZ2xvYmFsX2dhaW4sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIGVzYzFfaGNyLAotICBuZXh0X2NoYW5uZWwsCi0gIHRuc19kYXRhLAotICBuZXh0X2NoYW5uZWwsCi0gIHRuc19kYXRhLAotICBuZXh0X2NoYW5uZWwsCi0gIHNwZWN0cmFsX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgc3BlY3RyYWxfZGF0YSwKLSAgZW5kX29mX3NlcXVlbmNlCi19OworICAgIGljc19pbmZvLCBtcywgdG5zX2RhdGFfcHJlc2VudCwgbHRwX2RhdGFfcHJlc2VudCwKKyAgICAvKiBsdHBfZGF0YSwgKi8KKyAgICBnbG9iYWxfZ2Fpbiwgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgZXNjMV9oY3IsIG5leHRfY2hhbm5lbCwKKyAgICB0bnNfZGF0YV9wcmVzZW50LCBsdHBfZGF0YV9wcmVzZW50LAorICAgIC8qIGx0cF9kYXRhLCAqLworICAgIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBlc2MxX2hjciwgbmV4dF9jaGFubmVsLAorICAgIHRuc19kYXRhLCBuZXh0X2NoYW5uZWwsIHRuc19kYXRhLCBuZXh0X2NoYW5uZWwsIHNwZWN0cmFsX2RhdGEsIG5leHRfY2hhbm5lbCwKKyAgICBzcGVjdHJhbF9kYXRhLCBlbmRfb2Zfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3NjYWxfY3BlX2VwYzEgPSB7Ci0gIGVsX3NjYWxfY3BlX2VwYzEsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9zY2FsX2NwZV9lcGMxID0ge2VsX3NjYWxfY3BlX2VwYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKIAogLyoKICAqIFBzZXVkbyBBT1QgZm9yIERSTS9EUk0rIChzaW1pbGFyIHRvIEFPVCAyMCkKLSAqIERlcml2ZWQgZnJvbSBlcENvbmZpZyA9IDEKICAqLwogc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2RybV9zY2VbXSA9IHsKLSAgZHJtY3JjX3N0YXJ0X3JlZywKLSAgaWNzX2luZm8sCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGx0cF9kYXRhX3ByZXNlbnQsCi0gIC8qIGx0cF9kYXRhLCAqLwotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgZXNjMV9oY3IsCi0gIHRuc19kYXRhLAotICBkcm1jcmNfZW5kX3JlZywKLSAgc3BlY3RyYWxfZGF0YSwKLSAgZW5kX29mX3NlcXVlbmNlCi19OworICAgIGRybWNyY19zdGFydF9yZWcsIGljc19pbmZvLCB0bnNfZGF0YV9wcmVzZW50LCBsdHBfZGF0YV9wcmVzZW50LAorICAgIC8qIGx0cF9kYXRhLCAqLworICAgIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBlc2MxX2hjciwgdG5zX2RhdGEsCisgICAgZHJtY3JjX2VuZF9yZWcsIHNwZWN0cmFsX2RhdGEsIGVuZF9vZl9zZXF1ZW5jZX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfZHJtX3NjZSA9IHsKLSAgZWxfZHJtX3NjZSwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2RybV9zY2UgPSB7ZWxfZHJtX3NjZSwge05VTEwsIE5VTEx9fTsKIAogc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2RybV9jcGVbXSA9IHsKLSAgZHJtY3JjX3N0YXJ0X3JlZywKLSAgaWNzX2luZm8sCi0gIG1zLAotICB0bnNfZGF0YV9wcmVzZW50LAotICBsdHBfZGF0YV9wcmVzZW50LAotICAvKiBsdHBfZGF0YSwgKi8KLSAgZ2xvYmFsX2dhaW4sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIGVzYzFfaGNyLAotICBuZXh0X2NoYW5uZWwsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGx0cF9kYXRhX3ByZXNlbnQsCi0gIC8qIGx0cF9kYXRhLCAqLwotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgZXNjMV9oY3IsCi0gIG5leHRfY2hhbm5lbCwKLSAgdG5zX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgdG5zX2RhdGEsCi0gIGRybWNyY19lbmRfcmVnLAotICBuZXh0X2NoYW5uZWwsCi0gIHNwZWN0cmFsX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgc3BlY3RyYWxfZGF0YSwKLSAgZW5kX29mX3NlcXVlbmNlCi19OworICAgIGRybWNyY19zdGFydF9yZWcsIGljc19pbmZvLCBtcywgdG5zX2RhdGFfcHJlc2VudCwgbHRwX2RhdGFfcHJlc2VudCwKKyAgICAvKiBsdHBfZGF0YSwgKi8KKyAgICBnbG9iYWxfZ2Fpbiwgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgZXNjMV9oY3IsIG5leHRfY2hhbm5lbCwKKyAgICB0bnNfZGF0YV9wcmVzZW50LCBsdHBfZGF0YV9wcmVzZW50LAorICAgIC8qIGx0cF9kYXRhLCAqLworICAgIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBlc2MxX2hjciwgbmV4dF9jaGFubmVsLAorICAgIHRuc19kYXRhLCBuZXh0X2NoYW5uZWwsIHRuc19kYXRhLCBkcm1jcmNfZW5kX3JlZywgbmV4dF9jaGFubmVsLAorICAgIHNwZWN0cmFsX2RhdGEsIG5leHRfY2hhbm5lbCwgc3BlY3RyYWxfZGF0YSwgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9kcm1fY3BlID0gewotICBlbF9kcm1fY3BlLAotICB7IE5VTEwsIE5VTEwgfQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfZHJtX2NwZSA9IHtlbF9kcm1fY3BlLCB7TlVMTCwgTlVMTH19OwogCiAvKgogICogQU9UID0gMzkKICAqIGVwQ29uZmlnID0gMAogICovCiBzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfZWxkX3NjZV9lcGMwW10gPSB7Ci0gIGdsb2JhbF9nYWluLAotICBpY3NfaW5mbywKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgdG5zX2RhdGEsCi0gIGVzYzFfaGNyLAotICBlc2MyX3J2bGMsCi0gIHNwZWN0cmFsX2RhdGEsCi0gIGVuZF9vZl9zZXF1ZW5jZQotfTsKKyAgICBnbG9iYWxfZ2FpbiwgaWNzX2luZm8sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHRuc19kYXRhX3ByZXNlbnQsCisgICAgdG5zX2RhdGEsICAgIGVzYzFfaGNyLCBlc2MyX3J2bGMsICAgIHNwZWN0cmFsX2RhdGEsICAgICBlbmRfb2Zfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2VsZF9zY2VfZXBjMCA9IHsKLSAgZWxfZWxkX3NjZV9lcGMwLAotICB7IE5VTEwsIE5VTEwgfQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfZWxkX3NjZV9lcGMwID0ge2VsX2VsZF9zY2VfZXBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBOVUxMfX07CiAKICNkZWZpbmUgbm9kZV9lbGRfc2NlX2VwYzEgbm9kZV9lbGRfc2NlX2VwYzAKIAotc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2VsZF9jcGVfZXBjMFtdID0gewotICBpY3NfaW5mbywKLSAgbXMsCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICB0bnNfZGF0YV9wcmVzZW50LAotICB0bnNfZGF0YSwKLSAgZXNjMV9oY3IsCi0gIGVzYzJfcnZsYywKLSAgc3BlY3RyYWxfZGF0YSwKLSAgbmV4dF9jaGFubmVsLAotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgdG5zX2RhdGEsCi0gIGVzYzFfaGNyLAotICBlc2MyX3J2bGMsCi0gIHNwZWN0cmFsX2RhdGEsCi0gIGVuZF9vZl9zZXF1ZW5jZQotfTsKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9lbGRfY3BlX2VwYzBbXSA9IHtpY3NfaW5mbywgICAgICAgICAgbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX2dhaW4sICAgICAgIHNlY3Rpb25fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9mYWN0b3JfZGF0YSwgdG5zX2RhdGFfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNfZGF0YSwgICAgICAgICAgZXNjMV9oY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjMl9ydmxjLCAgICAgICAgIHNwZWN0cmFsX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9jaGFubmVsLCAgICAgIGdsb2JhbF9nYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25fZGF0YSwgICAgICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNfZGF0YV9wcmVzZW50LCAgdG5zX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjMV9oY3IsICAgICAgICAgIGVzYzJfcnZsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjdHJhbF9kYXRhLCAgICAgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2VsZF9jcGVfZXBjMVtdID0gewotICBpY3NfaW5mbywKLSAgbXMsCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICB0bnNfZGF0YV9wcmVzZW50LAotICBuZXh0X2NoYW5uZWwsCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICB0bnNfZGF0YV9wcmVzZW50LAotICBuZXh0X2NoYW5uZWwsCi0gIHRuc19kYXRhLAotICBuZXh0X2NoYW5uZWwsCi0gIHRuc19kYXRhLAotICBuZXh0X2NoYW5uZWwsCi0gIGVzYzFfaGNyLAotICBlc2MyX3J2bGMsCi0gIHNwZWN0cmFsX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgZXNjMV9oY3IsCi0gIGVzYzJfcnZsYywKLSAgc3BlY3RyYWxfZGF0YSwKLSAgZW5kX29mX3NlcXVlbmNlCi19Oworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2VsZF9jcGVfZXBjMVtdID0ge2ljc19pbmZvLCAgICAgICAgICBtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfZ2FpbiwgICAgICAgc2VjdGlvbl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZhY3Rvcl9kYXRhLCB0bnNfZGF0YV9wcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfY2hhbm5lbCwgICAgICBnbG9iYWxfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uX2RhdGEsICAgICAgc2NhbGVfZmFjdG9yX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zX2RhdGFfcHJlc2VudCwgIG5leHRfY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNfZGF0YSwgICAgICAgICAgbmV4dF9jaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc19kYXRhLCAgICAgICAgICBuZXh0X2NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjMV9oY3IsICAgICAgICAgIGVzYzJfcnZsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjdHJhbF9kYXRhLCAgICAgbmV4dF9jaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzYzFfaGNyLCAgICAgICAgICBlc2MyX3J2bGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY3RyYWxfZGF0YSwgICAgIGVuZF9vZl9zZXF1ZW5jZX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfZWxkX2NwZV9lcGMwID0gewotICBlbF9lbGRfY3BlX2VwYzAsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9lbGRfY3BlX2VwYzAgPSB7ZWxfZWxkX2NwZV9lcGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9lbGRfY3BlX2VwYzEgPSB7Ci0gIGVsX2VsZF9jcGVfZXBjMSwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2VsZF9jcGVfZXBjMSA9IHtlbF9lbGRfY3BlX2VwYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OwogCisvKgorICogQU9UID0gNDIKKyAqIGVwQ29uZmlnID0gMAorICovCiAKLWNvbnN0IGVsZW1lbnRfbGlzdF90ICogZ2V0Qml0c3RyZWFtRWxlbWVudExpc3QoQVVESU9fT0JKRUNUX1RZUEUgYW90LCBTQ0hBUiBlcENvbmZpZywgVUNIQVIgbkNoYW5uZWxzLCBVQ0hBUiBsYXllcikKLXsKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF91c2FjX2NvcmVtb2RlW10gPSB7Y29yZV9tb2RlLCBuZXh0X2NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfc2VxdWVuY2V9OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfdXNhY19zY2UwX2VwYzBbXSA9IHsKKyAgICB0bnNfZGF0YV9wcmVzZW50LAorICAgIC8qIGZkX2NoYW5uZWxfc3RyZWFtICovCisgICAgZ2xvYmFsX2dhaW4sIG5vaXNlLCBpY3NfaW5mbywgdHdfZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGFfdXNhYywgdG5zX2RhdGEsCisgICAgYWNfc3BlY3RyYWxfZGF0YSwgZmFjX2RhdGEsIGVuZF9vZl9zZXF1ZW5jZX07CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF91c2FjX2xmZV9lcGMwW10gPSB7CisgICAgLyogZmRfY2hhbm5lbF9zdHJlYW0gKi8KKyAgICBnbG9iYWxfZ2FpbiwgICAgICBpY3NfaW5mbywgc2NhbGVfZmFjdG9yX2RhdGFfdXNhYywKKyAgICBhY19zcGVjdHJhbF9kYXRhLCBmYWNfZGF0YSwgZW5kX29mX3NlcXVlbmNlfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX3VzYWNfbHBkX2VwYzBbXSA9IHtscGRfY2hhbm5lbF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vZl9zZXF1ZW5jZX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19zY2UwX2VwYzAgPSB7ZWxfdXNhY19zY2UwX2VwYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBOVUxMfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19zY2UxX2VwYzAgPSB7ZWxfdXNhY19scGRfZXBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX3NjZV9lcGMwID0geworICAgIGVsX3VzYWNfY29yZW1vZGUsIHsmbm9kZV91c2FjX3NjZTBfZXBjMCwgJm5vZGVfdXNhY19zY2UxX2VwYzB9fTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGxpc3RfdXNhY19jcGUwMF9lcGMwW10gPSB7dG5zX2FjdGl2ZSwgY29tbW9uX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfc2VxdWVuY2V9OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfdXNhY19jb21tb25fdHdbXSA9IHtjb21tb25fdHcsIGxpbmtfc2VxdWVuY2V9OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgbGlzdF91c2FjX2NwZTAwMDBfZXBjMFtdID0geworICAgIC8qIGNvcmVfbW9kZTAgPSAwICovCisgICAgLyogY29yZV9tb2RlMSA9IDAgKi8KKyAgICAvKiBjb21tb25fd2luZG93ID0gMCAqLworICAgIC8qIGNvbW1vbl90dyA9IDAgKi8KKyAgICB0bnNfZGF0YV9wcmVzZW50X3VzYWMsCisgICAgZ2xvYmFsX2dhaW4sCisgICAgbm9pc2UsCisgICAgaWNzX2luZm8sCisgICAgdHdfZGF0YSwKKyAgICBzY2FsZV9mYWN0b3JfZGF0YV91c2FjLAorICAgIHRuc19kYXRhLAorICAgIGFjX3NwZWN0cmFsX2RhdGEsCisgICAgZmFjX2RhdGEsCisgICAgbmV4dF9jaGFubmVsLAorICAgIGdsb2JhbF9nYWluLAorICAgIG5vaXNlLAorICAgIGljc19pbmZvLAorICAgIHR3X2RhdGEsCisgICAgc2NhbGVfZmFjdG9yX2RhdGFfdXNhYywKKyAgICB0bnNfZGF0YSwKKyAgICBhY19zcGVjdHJhbF9kYXRhLAorICAgIGZhY19kYXRhLAorICAgIGVuZF9vZl9zZXF1ZW5jZX07CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBsaXN0X3VzYWNfY3BlMDAwMV9lcGMwW10gPSB7CisgICAgLyoKKyAgICBjb3JlX21vZGUwID0gMAorICAgIGNvcmVfbW9kZTEgPSAwCisgICAgY29tbW9uX3dpbmRvdyA9IDAKKyAgICBjb21tb25fdHcgPSAxCisgICAgKi8KKyAgICB0d19kYXRhLCAgdG5zX2RhdGFfcHJlc2VudF91c2FjLCAgZ2xvYmFsX2dhaW4sIG5vaXNlLAorICAgIGljc19pbmZvLCBzY2FsZV9mYWN0b3JfZGF0YV91c2FjLCB0bnNfZGF0YSwgICAgYWNfc3BlY3RyYWxfZGF0YSwKKyAgICBmYWNfZGF0YSwgbmV4dF9jaGFubmVsLCAgICAgICAgICAgZ2xvYmFsX2dhaW4sIG5vaXNlLAorICAgIGljc19pbmZvLCBzY2FsZV9mYWN0b3JfZGF0YV91c2FjLCB0bnNfZGF0YSwgICAgYWNfc3BlY3RyYWxfZGF0YSwKKyAgICBmYWNfZGF0YSwgZW5kX29mX3NlcXVlbmNlfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGxpc3RfdXNhY19jcGUwMDFfZXBjMFtdID0geworICAgIC8qIGNvcmVfbW9kZTAgPSAwICovCisgICAgLyogY29yZV9tb2RlMSA9IDAgKi8KKyAgICAvKiBjb21tb25fd2luZG93ID0gMSAqLworICAgIGljc19pbmZvLCBjb21tb25fbWF4X3NmYiwgbXMsIGNvbW1vbl90dywgbGlua19zZXF1ZW5jZX07CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBsaXN0X3VzYWNfY3BlMDAxMF9lcGMwW10gPSB7CisgICAgLyogY29yZV9tb2RlMCA9IDAgKi8KKyAgICAvKiBjb3JlX21vZGUxID0gMCAqLworICAgIC8qIGNvbW1vbl93aW5kb3cgPSAxICovCisgICAgLyogY29tbW9uX3R3ID0gMCAqLworICAgIHRuc19kYXRhX3ByZXNlbnRfdXNhYywKKyAgICBnbG9iYWxfZ2FpbiwKKyAgICBub2lzZSwKKyAgICB0d19kYXRhLAorICAgIHNjYWxlX2ZhY3Rvcl9kYXRhX3VzYWMsCisgICAgdG5zX2RhdGEsCisgICAgYWNfc3BlY3RyYWxfZGF0YSwKKyAgICBmYWNfZGF0YSwKKyAgICBuZXh0X2NoYW5uZWwsCisgICAgZ2xvYmFsX2dhaW4sCisgICAgbm9pc2UsCisgICAgdHdfZGF0YSwKKyAgICBzY2FsZV9mYWN0b3JfZGF0YV91c2FjLAorICAgIHRuc19kYXRhLAorICAgIGFjX3NwZWN0cmFsX2RhdGEsCisgICAgZmFjX2RhdGEsCisgICAgZW5kX29mX3NlcXVlbmNlfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGxpc3RfdXNhY19jcGUwMDExX2VwYzBbXSA9IHsKKyAgICAvKiBjb3JlX21vZGUwID0gMCAqLworICAgIC8qIGNvcmVfbW9kZTEgPSAwICovCisgICAgLyogY29tbW9uX3dpbmRvdyA9IDEgKi8KKyAgICAvKiBjb21tb25fdHcgPSAxICovCisgICAgdHdfZGF0YSwKKyAgICB0bnNfZGF0YV9wcmVzZW50X3VzYWMsCisgICAgZ2xvYmFsX2dhaW4sCisgICAgbm9pc2UsCisgICAgc2NhbGVfZmFjdG9yX2RhdGFfdXNhYywKKyAgICB0bnNfZGF0YSwKKyAgICBhY19zcGVjdHJhbF9kYXRhLAorICAgIGZhY19kYXRhLAorICAgIG5leHRfY2hhbm5lbCwKKyAgICBnbG9iYWxfZ2FpbiwKKyAgICBub2lzZSwKKyAgICBzY2FsZV9mYWN0b3JfZGF0YV91c2FjLAorICAgIHRuc19kYXRhLAorICAgIGFjX3NwZWN0cmFsX2RhdGEsCisgICAgZmFjX2RhdGEsCisgICAgZW5kX29mX3NlcXVlbmNlfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGxpc3RfdXNhY19jcGUxMF9lcGMwW10gPSB7CisgICAgLyogY29yZV9tb2RlMCA9IDEgKi8KKyAgICAvKiBjb3JlX21vZGUxID0gMCAqLworICAgIGxwZF9jaGFubmVsX3N0cmVhbSwKKyAgICBuZXh0X2NoYW5uZWwsCisgICAgdG5zX2RhdGFfcHJlc2VudCwKKyAgICBnbG9iYWxfZ2FpbiwKKyAgICBub2lzZSwKKyAgICBpY3NfaW5mbywKKyAgICB0d19kYXRhLAorICAgIHNjYWxlX2ZhY3Rvcl9kYXRhX3VzYWMsCisgICAgdG5zX2RhdGEsCisgICAgYWNfc3BlY3RyYWxfZGF0YSwKKyAgICBmYWNfZGF0YSwKKyAgICBlbmRfb2Zfc2VxdWVuY2V9OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgbGlzdF91c2FjX2NwZTAxX2VwYzBbXSA9IHsKKyAgICAvKiBjb3JlX21vZGUwID0gMCAqLworICAgIC8qIGNvcmVfbW9kZTEgPSAxICovCisgICAgdG5zX2RhdGFfcHJlc2VudCwKKyAgICBnbG9iYWxfZ2FpbiwKKyAgICBub2lzZSwKKyAgICBpY3NfaW5mbywKKyAgICB0d19kYXRhLAorICAgIHNjYWxlX2ZhY3Rvcl9kYXRhX3VzYWMsCisgICAgdG5zX2RhdGEsCisgICAgYWNfc3BlY3RyYWxfZGF0YSwKKyAgICBmYWNfZGF0YSwKKyAgICBuZXh0X2NoYW5uZWwsCisgICAgbHBkX2NoYW5uZWxfc3RyZWFtLAorICAgIGVuZF9vZl9zZXF1ZW5jZX07CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBsaXN0X3VzYWNfY3BlMTFfZXBjMFtdID0geworICAgIC8qIGNvcmVfbW9kZTAgPSAxICovCisgICAgLyogY29yZV9tb2RlMSA9IDEgKi8KKyAgICBscGRfY2hhbm5lbF9zdHJlYW0sIG5leHRfY2hhbm5lbCwgbHBkX2NoYW5uZWxfc3RyZWFtLCBlbmRfb2Zfc2VxdWVuY2V9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3VzYWNfY3BlMDAwMF9lcGMwID0geworICAgIC8qIGNvcmVfbW9kZTAgPSAwICovCisgICAgLyogY29yZV9tb2RlMSA9IDAgKi8KKyAgICAvKiBjb21tb25fd2luZG93ID0gMCAqLworICAgIC8qIGNvbW1vbl90dyA9IDAgKi8KKyAgICBsaXN0X3VzYWNfY3BlMDAwMF9lcGMwLAorICAgIHtOVUxMLCBOVUxMfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19jcGUwMDEwX2VwYzAgPSB7CisgICAgLyogY29yZV9tb2RlMCA9IDAgKi8KKyAgICAvKiBjb3JlX21vZGUxID0gMCAqLworICAgIC8qIGNvbW1vbl93aW5kb3cgPSAxICovCisgICAgLyogY29tbW9uX3R3ID0gMCAqLworICAgIGxpc3RfdXNhY19jcGUwMDEwX2VwYzAsCisgICAge05VTEwsIE5VTEx9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX2NwZTAwMDFfZXBjMCA9IHsKKyAgICAvKiBjb3JlX21vZGUwID0gMCAqLworICAgIC8qIGNvcmVfbW9kZTEgPSAwICovCisgICAgLyogY29tbW9uX3dpbmRvdyA9IDAgKi8KKyAgICAvKiBjb21tb25fdHcgPSAxICovCisgICAgbGlzdF91c2FjX2NwZTAwMDFfZXBjMCwKKyAgICB7TlVMTCwgTlVMTH19OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3VzYWNfY3BlMDAxMV9lcGMwID0geworICAgIC8qIGNvcmVfbW9kZTAgPSAwICovCisgICAgLyogY29yZV9tb2RlMSA9IDAgKi8KKyAgICAvKiBjb21tb25fd2luZG93ID0gMSAqLworICAgIC8qIGNvbW1vbl90dyA9IDEgKi8KKyAgICBsaXN0X3VzYWNfY3BlMDAxMV9lcGMwLAorICAgIHtOVUxMLCBOVUxMfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19jcGUwMDBfZXBjMCA9IHsKKyAgICAvKiBjb3JlX21vZGUwID0gMCAqLworICAgIC8qIGNvcmVfbW9kZTEgPSAwICovCisgICAgLyogY29tbW9uX3dpbmRvdyA9IDAgKi8KKyAgICBlbF91c2FjX2NvbW1vbl90dywKKyAgICB7Jm5vZGVfdXNhY19jcGUwMDAwX2VwYzAsICZub2RlX3VzYWNfY3BlMDAwMV9lcGMwfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19jcGUwMDFfZXBjMCA9IHsKKyAgICBsaXN0X3VzYWNfY3BlMDAxX2VwYzAsIHsmbm9kZV91c2FjX2NwZTAwMTBfZXBjMCwgJm5vZGVfdXNhY19jcGUwMDExX2VwYzB9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX2NwZTAwX2VwYzAgPSB7CisgICAgLyogY29yZV9tb2RlMCA9IDAgKi8KKyAgICAvKiBjb3JlX21vZGUxID0gMCAqLworICAgIGxpc3RfdXNhY19jcGUwMF9lcGMwLAorICAgIHsmbm9kZV91c2FjX2NwZTAwMF9lcGMwLCAmbm9kZV91c2FjX2NwZTAwMV9lcGMwfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19jcGUxMF9lcGMwID0geworICAgIC8qIGNvcmVfbW9kZTAgPSAxICovCisgICAgLyogY29yZV9tb2RlMSA9IDAgKi8KKyAgICBsaXN0X3VzYWNfY3BlMTBfZXBjMCwKKyAgICB7TlVMTCwgTlVMTH19OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3VzYWNfY3BlMDFfZXBjMCA9IHtsaXN0X3VzYWNfY3BlMDFfZXBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBOVUxMfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19jcGUxMV9lcGMwID0ge2xpc3RfdXNhY19jcGUxMV9lcGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX2NwZTBfZXBjMCA9IHsKKyAgICAvKiBjb3JlX21vZGUwID0gMCAqLworICAgIGVsX3VzYWNfY29yZW1vZGUsCisgICAgeyZub2RlX3VzYWNfY3BlMDBfZXBjMCwgJm5vZGVfdXNhY19jcGUwMV9lcGMwfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19jcGUxX2VwYzAgPSB7CisgICAgLyogY29yZV9tb2RlMCA9IDEgKi8KKyAgICBlbF91c2FjX2NvcmVtb2RlLAorICAgIHsmbm9kZV91c2FjX2NwZTEwX2VwYzAsICZub2RlX3VzYWNfY3BlMTFfZXBjMH19OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3VzYWNfY3BlX2VwYzAgPSB7CisgICAgZWxfdXNhY19jb3JlbW9kZSwgeyZub2RlX3VzYWNfY3BlMF9lcGMwLCAmbm9kZV91c2FjX2NwZTFfZXBjMH19OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3VzYWNfbGZlX2VwYzAgPSB7ZWxfdXNhY19sZmVfZXBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OworCitjb25zdCBlbGVtZW50X2xpc3RfdCAqZ2V0Qml0c3RyZWFtRWxlbWVudExpc3QoQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGVwQ29uZmlnLCBVQ0hBUiBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbGF5ZXIsIFVJTlQgZWxGbGFncykgewogICBzd2l0Y2ggKGFvdCkgewogICAgIGNhc2UgQU9UX0FBQ19MQzoKICAgICBjYXNlIEFPVF9TQlI6CiAgICAgY2FzZSBBT1RfUFM6CiAgICAgICBGREtfQVNTRVJUKGVwQ29uZmlnID09IC0xKTsKLSAgICAgIGlmIChuQ2hhbm5lbHMgPT0gMSkgewotICAgICAgICByZXR1cm4gJm5vZGVfYWFjX3NjZTsKKyAgICAgIGlmIChlbEZsYWdzICYgQUNfRUxfR0FfQ0NFKSB7CisgICAgICAgIHJldHVybiAmbm9kZV9hYWNfY2NlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuICZub2RlX2FhY19jcGU7CisgICAgICAgIGlmIChuQ2hhbm5lbHMgPT0gMSkgeworICAgICAgICAgIHJldHVybiAmbm9kZV9hYWNfc2NlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAmbm9kZV9hYWNfY3BlOworICAgICAgICB9CiAgICAgICB9Ci0gICAgICBicmVhazsKICAgICBjYXNlIEFPVF9FUl9BQUNfTEM6CiAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgogICAgICAgaWYgKG5DaGFubmVscyA9PSAxKSB7CkBAIC0yNTc1LDcgKzcxNjEsMTYgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgIHJldHVybiAmbm9kZV9hYWNfY3BlX2VwYzE7CiAgICAgICB9Ci0gICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9VU0FDOgorICAgICAgaWYgKGVsRmxhZ3MgJiBBQ19FTF9VU0FDX0xGRSkgeworICAgICAgICBGREtfQVNTRVJUKG5DaGFubmVscyA9PSAxKTsKKyAgICAgICAgcmV0dXJuICZub2RlX3VzYWNfbGZlX2VwYzA7CisgICAgICB9CisgICAgICBpZiAobkNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgcmV0dXJuICZub2RlX3VzYWNfc2NlX2VwYzA7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gJm5vZGVfdXNhY19jcGVfZXBjMDsKKyAgICAgIH0KICAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKICAgICAgIGlmIChuQ2hhbm5lbHMgPT0gMSkgewogICAgICAgICBpZiAoZXBDb25maWcgPD0gMCkKQEAgLTI1ODgsNyArNzE4Myw2IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICByZXR1cm4gJm5vZGVfc2NhbF9jcGVfZXBjMTsKICAgICAgIH0KLSAgICAgIGJyZWFrOwogICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CiAgICAgICBpZiAobkNoYW5uZWxzID09IDEpIHsKICAgICAgICAgaWYgKGVwQ29uZmlnIDw9IDApCkBAIC0yNjA0LDE3ICs3MTk4LDc0IEBACiAgICAgY2FzZSBBT1RfRFJNX0FBQzoKICAgICBjYXNlIEFPVF9EUk1fU0JSOgogICAgIGNhc2UgQU9UX0RSTV9NUEVHX1BTOgorICAgIGNhc2UgQU9UX0RSTV9TVVJST1VORDoKICAgICAgIEZES19BU1NFUlQoZXBDb25maWcgPT0gMSk7CiAgICAgICBpZiAobkNoYW5uZWxzID09IDEpIHsKICAgICAgICAgcmV0dXJuICZub2RlX2RybV9zY2U7CiAgICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gJm5vZGVfZHJtX2NwZTsKICAgICAgIH0KLSAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBicmVhazsKICAgfQogICByZXR1cm4gTlVMTDsKIH0KIAorLyogSW52ZXJzZSBzcXVhcmUgcm9vdCB0YWJsZSBmb3Igb3BlcmFuZHMgcnVubmluZyBmcm9tIDAuNSB0byB+MS4wICovCisvKiAoSU5UKSAoMC41ICsgMS4wL3NxcnQoKG9wKS9GREtwb3coMi4wLDMxKSkpOyAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IEZpcnN0IHZhbHVlIGlzIHJub3Qgcm91bmRlZCBmb3IgYWNjdXJhY3kgcmVhc29ucyAgICAgICAgICAqLworLyogSW1wbGljaXQgZXhwb25lbnQgaXMgMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBFeGFtcGxlczogMHg1QTgyNzk5QSA9IGludlNxcnROb3JtMiAoMHg0MDAwLjAwMDApLCBleHA9MSAgICAgICAgKi8KKy8qICAgICAgICAgICAweDVBODI3OTlBID0gaW52U3FydE5vcm0yICgweDQwMDAuMDAwMCksIGV4cD0xICAgICAgICAqLwogCitMTktfU0VDVElPTl9DT05TVERBVEFfTDEKK2NvbnN0IEZJWFBfREJMIGludlNxcnRUYWJbU1FSVF9WQUxVRVNdID0geworICAgIDB4NUE4Mjc5OTksIDB4NUEyODdFMDMsIDB4NTlDRjhDQkMsIDB4NTk3N0EwQUMsIDB4NTkyMEI0REYsIDB4NThDQUM0ODAsCisgICAgMHg1ODc1Q0FERSwgMHg1ODIxQzM2NCwgMHg1N0NFQTk5RCwgMHg1NzdDNzkzMCwgMHg1NzJCMkRFMCwgMHg1NkRBQzM4RSwKKyAgICAweDU2OEIzNjMyLCAweDU2M0M4MUUwLCAweDU1RUVBMkM0LCAweDU1QTE5NTIyLCAweDU1NTU1NTU1LCAweDU1MDlERkQwLAorICAgIDB4NTRCRjMxMUEsIDB4NTQ3NTQ1RDAsIDB4NTQyQzFBQTQsIDB4NTNFM0FDNUIsIDB4NTM5QkY3Q0QsIDB4NTM1NEY5RTcsCisgICAgMHg1MzBFQUZBNSwgMHg1MkM5MTYxOCwgMHg1Mjg0MkE1RiwgMHg1MjNGRTlBQywgMHg1MUZDNTE0MCwgMHg1MUI5NUU2QiwKKyAgICAweDUxNzcwRThGLCAweDUxMzU1RjFBLCAweDUwRjQ0RDg5LCAweDUwQjNENzY4LCAweDUwNzNGQTUwLCAweDUwMzRCM0U3LAorICAgIDB4NEZGNjAxRTAsIDB4NEZCN0UxRkEsIDB4NEY3QTUyMDIsIDB4NEYzRDRGQ0YsIDB4NEYwMEQ5NDQsIDB4NEVDNEVDNEYsCisgICAgMHg0RTg5ODZFQSwgMHg0RTRFQTcxOCwgMHg0RTE0NEFFOSwgMHg0RERBNzA3MywgMHg0REExMTVEQSwgMHg0RDY4Mzk0OCwKKyAgICAweDREMkZEOEY0LCAweDRDRjdGMzFCLCAweDRDQzA4NjA1LCAweDRDODk5MDAwLCAweDRDNTMwRjY1LCAweDRDMUQwMjk0LAorICAgIDB4NEJFNzY3RjUsIDB4NEJCMjNERjksIDB4NEI3RDgzMTcsIDB4NEI0OTM1Q0YsIDB4NEIxNTU0QTYsIDB4NEFFMURFMkEsCisgICAgMHg0QUFFRDBGMCwgMHg0QTdDMkI5MywgMHg0QTQ5RUNCMywgMHg0QTE4MTJGQSwgMHg0OUU2OUQxNiwgMHg0OUI1ODlCQiwKKyAgICAweDQ5ODREN0E0LCAweDQ5NTQ4NTkyLCAweDQ5MjQ5MjQ5LCAweDQ4RjRGQzk3LCAweDQ4QzVDMzRCLCAweDQ4OTZFNTNELAorICAgIDB4NDg2ODYxNDgsIDB4NDgzQTM2NEQsIDB4NDgwQzYzMzIsIDB4NDdERUU2RTEsIDB4NDdCMUMwNDksIDB4NDc4NEVFNjAsCisgICAgMHg0NzU4NzAxQywgMHg0NzJDNDQ3QywgMHg0NzAwNkE4MSwgMHg0NkQ0RTEzMCwgMHg0NkE5QTc5NCwgMHg0NjdFQkNCQSwKKyAgICAweDQ2NTQxRkI0LCAweDQ2MjlDRjk4LCAweDQ1RkZDQjgwLCAweDQ1RDYxMjhBLCAweDQ1QUNBM0Q1LCAweDQ1ODM3RTg4LAorICAgIDB4NDU1QUExQ0IsIDB4NDUzMjBDQzgsIDB4NDUwOUJFQjAsIDB4NDRFMUI2QjQsIDB4NDRCOUY0MEIsIDB4NDQ5Mjc1RUQsCisgICAgMHg0NDZCM0I5NiwgMHg0NDQ0NDQ0NCwgMHg0NDFEOEYzQiwgMHg0M0Y3MUJCRiwgMHg0M0QwRTkxNywgMHg0M0FBRjY4RiwKKyAgICAweDQzODU0Mzc0LCAweDQzNUZDRjE1LCAweDQzM0E5OEM2LCAweDQzMTU5RkRDLCAweDQyRjBFM0FFLCAweDQyQ0M2Mzk4LAorICAgIDB4NDJBODFFRjYsIDB4NDI4NDE1MjcsIDB4NDI2MDQ1OEUsIDB4NDIzQ0FGOEQsIDB4NDIxOTUyOEIsIDB4NDFGNjJERjIsCisgICAgMHg0MUQzNDEyQSwgMHg0MUIwOEJBMiwgMHg0MThFMENDOCwgMHg0MTZCQzQwRCwgMHg0MTQ5QjBFNSwgMHg0MTI3RDJDMywKKyAgICAweDQxMDYyOTIwLCAweDQwRTRCMzc0LCAweDQwQzM3MTNCLCAweDQwQTI2MUVGLCAweDQwODE4NTEyLCAweDQwNjBEQTIyLAorICAgIDB4NDA0MDYwQTEsIDB4NDAyMDE4MTQsIDB4NDAwMDAwMDAsIDB4M0ZFMDE3RUMgLyogLCAweDNGQzA1RjYxICovCit9OworCisvKiBudW1iZXIgb2YgY2hhbm5lbHMgb2YgdGhlIGZvcm1hdHMgKi8KKworY29uc3QgSU5UIGZvcm1hdF9uY2hhbltGREtfTkZPUk1BVFMgKyA5IC0gMl0gPSB7CisgICAgMCwgIC8qIGFueSBzZXQtdXAsIENoQ29uZklkeCA9IDAgKi8KKyAgICAxLCAgLyogbW9ubyBDaENvbmZJZHggPSAxICovCisgICAgMiwgIC8qIHN0ZXJlbyBDaENvbmZJZHggPSAyICovCisgICAgMywgIC8qIDMvMC4wIENoQ29uZklkeCA9IDMgKi8KKyAgICA0LCAgLyogMy8xLjAgQ2hDb25mSWR4ID0gNCAqLworICAgIDUsICAvKiAzLzIuMCBDaENvbmZJZHggPSA1ICovCisgICAgNiwgIC8qIDUuMSBDaENvbmZJZHggPSA2ICovCisgICAgOCwgIC8qIDUvMi4xIEFMVCBDaENvbmZJZHggPSA3ICovCisgICAgMCwgIC8qIEVtcHR5IG4uYS4gQ2hDb25mSWR4ID0gOCAqLworICAgIDMsICAvKiAyLzEuMCBDaENvbmZJZHggPSA5ICovCisgICAgNCwgIC8qIDIvMi4wIENoQ29uZklkeCA9IDEwICovCisgICAgNywgIC8qIDMvMy4xIENoQ29uZklkeCA9IDExICovCisgICAgOCwgIC8qIDMvNC4xIENoQ29uZklkeCA9IDEyICovCisgICAgMjQsIC8qIDIyLjIgQ2hDb25mSWR4ID0gMTMgKi8KKyAgICA4LCAgLyogNS8yLjEgQ2hDb25mSWR4ID0gMTQgKi8KKyAgICAxMiwgLyogNS81LjIgQ2hDb25mSWR4ID0gMTUgKi8KKyAgICAxMCwgLyogNS80LjEgQ2hDb25mSWR4ID0gMTYgKi8KKyAgICAxMiwgLyogNi81LjEgQ2hDb25mSWR4ID0gMTcgKi8KKyAgICAxNCwgLyogNi83LjEgQ2hDb25mSWR4ID0gMTggKi8KKyAgICAxMiwgLyogNS82LjEgQ2hDb25mSWR4ID0gMTkgKi8KKyAgICAxNCAgLyogNy82LjEgQ2hDb25mSWR4ID0gMjAgKi8KK307CmRpZmYgLS1naXQgYS9saWJGREsvc3JjL0ZES190cmlnRmN0cy5jcHAgYi9saWJGREsvc3JjL0ZES190cmlnRmN0cy5jcHAKaW5kZXggMWYzYTAxNy4uNGJiNjI2MiAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9GREtfdHJpZ0ZjdHMuY3BwCisrKyBiL2xpYkZESy9zcmMvRkRLX3RyaWdGY3RzLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyNTIgKzkwLDI1MSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEhhcmljaGFyYW4gTGFrc2htYW4sIE1hbnVlbCBKYW5kZXIKKwogICAgRGVzY3JpcHRpb246IFRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIGZpeGVkIHBvaW50IGZyYWN0aW9uYWwgaW1wbGVtZW50YXRpb24uCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKIAogI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKIAotCi0KLQotI2RlZmluZSBJTVBST1ZFX0FUQU4yX0FDQ1VSQUNZICAxICAvLyAwIC0tPiA1OSBkQiBTTlIgICAgIDEgLS0+IDY1IGRCIFNOUgotI2RlZmluZSBNSU5TRlRBQiAgNworI2RlZmluZSBJTVBST1ZFX0FUQU4yX0FDQ1VSQUNZIDEgLyogMCAtLT4gNTkgZEIgU05SICAgICAxIC0tPiA2NSBkQiBTTlIgKi8KKyNkZWZpbmUgTUlOU0ZUQUIgNwogI2RlZmluZSBNQVhTRlRBQiAyNQogCiAjaWYgSU1QUk9WRV9BVEFOMl9BQ0NVUkFDWQotc3RhdGljIGNvbnN0IEZJWFBfREJMIGZfYXRhbl9leHBhbmRfcmFuZ2VbTUFYU0ZUQUItKE1JTlNGVEFCLTEpXSAgPQotewotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogIFRhYmxlIGhvbGRzIGZpeHBfYXRhbigpIG91dHB1dCB2YWx1ZXMgd2hpY2ggYXJlIG91dHNpZGUgb2YgaW5wdXQgcmFuZ2UKLSAgICogIG9mIGZpeHBfYXRhbigpIHRvIGltcHJvdmUgU05SIG9mIGZpeHBfYXRhbjIoKS4KLSAgICoKLSAgICogIFRoaXMgVGFibGUgbWlnaHQgYWxzbyBiZSB1c2VkIGluIGZpeHBfYXRhbigpIFt0b2RvXSBzbyB0aGVyZSBhIHdpZGVyIGlucHV0Ci0gICAqICByYW5nZSBjYW4gYmUgY292ZXJlZCwgdG9vLgotICAgKgotICAgKiAgTWF0bGFiIChnZW5lcmF0ZSB0YWJsZSk6Ci0gICAqICAgIGZvciBzY2wgPSA3OjI1ICAgICAgICAgICAgJSBNSU5TRlRBQiAuLiBNQVhTRlRBQgotICAgKiAgICAgIGF0PWF0YW4oMC41ICooMl5zY2wpKTsgICUgMC41IGJlY2F1c2UgZ2V0IGluICdtaWRkbGUnIGFyZWEgb2YgY3VycmVudCBzY2FsZSBsZXZlbCAnc2NsJwotICAgKiAgICAgIGF0LzIgICAgICAgICAgICAgICAgICAgICUgZGl2IGF0IGJ5IEFUT19TQ0FMRQotICAgKiAgICBlbmQKLSAgICoKLSAgICogIFRhYmxlIGRpdmlkZWQgYnkgMj1BVE9fU0NBTEUgIDwtLSAgU0Y9QVRPX1NGCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgIEZMMkZYQ09OU1RfREJMKDcuNzc1ODYyOTkwODcyMDk5ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3LjgxNDkxOTkyODY3Mzk3OGUtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44MzQ0NTA0ODMzMTQ2NDhlLTAwMSksCi0gICBGTDJGWENPTlNUX0RCTCg3Ljg0NDIxNjAyMTM5MjA4OWUtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44NDkwOTg4MjMwMjY2ODdlLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODUxNTQwMjI3OTE4NTA5ZS0wMDEpLAotICAgRkwyRlhDT05TVF9EQkwoNy44NTI3NjA5MzA4NzM3MzdlLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODUzMzcxMjgyNDE1MDE1ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3Ljg1MzY3NjQ1ODE5MzYxMmUtMDAxKSwKLSAgIEZMMkZYQ09OU1RfREJMKDcuODUzODI5MDQ2MDgzOTA2ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3Ljg1MzkwNTM0MDAyOTE3N2UtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44NTM5NDM0ODcwMDE4MjhlLTAwMSksCi0gICBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk2MjU2MDQ4ODE1NWUtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44NTM5NzIwOTcyMzEzMTllLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODUzOTc2ODY1NjAyOTAxZS0wMDEpLAotICAgRkwyRlhDT05TVF9EQkwoNy44NTM5NzkyNDk3ODg2OTJlLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODUzOTgwNDQxODgxNTg3ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk4MTAzNzkyODAzNWUtMDAxKSwKLSAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTgxMzM1OTUxMjU5ZS0wMDEpCi0gICAvLyAgICAgcGkvNCA9IDAuNzg1Mzk4MTYzMzk3NDQ4ID0gcGkvMi9BVE9fU0NBTEUKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBmX2F0YW5fZXhwYW5kX3JhbmdlW01BWFNGVEFCIC0gKE1JTlNGVEFCIC0gMSldID0geworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogIFRhYmxlIGhvbGRzIGZpeHBfYXRhbigpIG91dHB1dCB2YWx1ZXMgd2hpY2ggYXJlIG91dHNpZGUgb2YgaW5wdXQgcmFuZ2UKKyAgICAgKiAgb2YgZml4cF9hdGFuKCkgdG8gaW1wcm92ZSBTTlIgb2YgZml4cF9hdGFuMigpLgorICAgICAqCisgICAgICogIFRoaXMgVGFibGUgbWlnaHQgYWxzbyBiZSB1c2VkIGluIGZpeHBfYXRhbigpIHNvIHRoZXJlIGEgd2lkZXIgaW5wdXQKKyAgICAgKiAgcmFuZ2UgY2FuIGJlIGNvdmVyZWQsIHRvby4KKyAgICAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBGTDJGWENPTlNUX0RCTCg3Ljc3NTg2Mjk5MDg3MjA5OWUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3LjgxNDkxOTkyODY3Mzk3OGUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3LjgzNDQ1MDQ4MzMxNDY0OGUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg0NDIxNjAyMTM5MjA4OWUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg0OTA5ODgyMzAyNjY4N2UtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1MTU0MDIyNzkxODUwOWUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1Mjc2MDkzMDg3MzczN2UtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1MzM3MTI4MjQxNTAxNWUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1MzY3NjQ1ODE5MzYxMmUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1MzgyOTA0NjA4MzkwNmUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1MzkwNTM0MDAyOTE3N2UtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk0MzQ4NzAwMTgyOGUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk2MjU2MDQ4ODE1NWUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk3MjA5NzIzMTMxOWUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk3Njg2NTYwMjkwMWUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk3OTI0OTc4ODY5MmUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk4MDQ0MTg4MTU4N2UtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk4MTAzNzkyODAzNWUtMDAxKSwKKyAgICBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk4MTMzNTk1MTI1OWUtMDAxKQorICAgIC8qIHBpLzQgPSAwLjc4NTM5ODE2MzM5NzQ0OCA9IHBpLzIvQVRPX1NDQUxFICovCiB9OwogI2VuZGlmCiAKLUZJWFBfREJMIGZpeHBfYXRhbjIoRklYUF9EQkwgeSwgRklYUF9EQkwgeCkKLXsKLSAgICBGSVhQX0RCTCBxOwotICAgIEZJWFBfREJMIGF0OyAgLy8gYXRhbiAgb3V0Ci0gICAgRklYUF9EQkwgYXQyOyAvLyBhdGFuMiBvdXQKLSAgICBGSVhQX0RCTCByZXQgPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7Ci0gICAgSU5UIHNmLHNmbyxzdGY7CitGSVhQX0RCTCBmaXhwX2F0YW4yKEZJWFBfREJMIHksIEZJWFBfREJMIHgpIHsKKyAgRklYUF9EQkwgcTsKKyAgRklYUF9EQkwgYXQ7ICAvKiBhdGFuICBvdXQgKi8KKyAgRklYUF9EQkwgYXQyOyAvKiBhdGFuMiBvdXQgKi8KKyAgRklYUF9EQkwgcmV0ID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICBJTlQgc2YsIHNmbywgc3RmOwogCi0gICAgLy8gLS0tIGRpdmlzaW9uCisgIC8qIC0tLSBkaXZpc2lvbiAqLwogCi0gICAgaWYgICAgICAoeSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgIHsKLSAgICAgICAgaWYgICAgICAoeCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9ICBmRGl2Tm9ybUhpZ2hQcmVjKCB5LCB4LCAmc2YpOyAvLyBib3RoIHBvcy4KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh4IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gLWZEaXZOb3JtSGlnaFByZWMoIHksLXgsICZzZik7IC8vIHggbmVnLgotICAgICAgICB9Ci0gICAgICAgIGVsc2Ugey8vKHggPT1GTDJGWENPTlNUX0RCTCgwLjBmKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gIEZMMkZYQ09OU1RfREJMKCsxLjBmKTsgIC8vIHkveCA9IHBvcy96ZXJvID0gK0luZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmID0gMDsKLSAgICAgICAgfQorICBpZiAoeSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgaWYgKHggPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgcSA9IGZEaXZOb3JtSGlnaFByZWMoeSwgeCwgJnNmKTsgLyogYm90aCBwb3MuICovCisgICAgfSBlbHNlIGlmICh4IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIHEgPSAtZkRpdk5vcm1IaWdoUHJlYyh5LCAteCwgJnNmKTsgLyogeCBuZWcuICovCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICh4ID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAqLworICAgICAgcSA9IEZMMkZYQ09OU1RfREJMKCsxLjBmKTsgICAgICAgICAvKiB5L3ggPSBwb3MvemVybyA9ICtJbmYgKi8KKyAgICAgIHNmID0gMDsKICAgICB9Ci0gICAgZWxzZSBpZiAoeSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgIHsKLSAgICAgICAgaWYgICAgICAoeCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IC1mRGl2Tm9ybUhpZ2hQcmVjKC15LCB4LCAmc2YpOyAvLyB5IG5lZy4KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh4IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gIGZEaXZOb3JtSGlnaFByZWMoLXksLXgsICZzZik7IC8vIGJvdGggbmVnLgotICAgICAgICB9Ci0gICAgICAgIGVsc2Ugey8vKHggPT1GTDJGWENPTlNUX0RCTCgwLjBmKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gIEZMMkZYQ09OU1RfREJMKC0xLjBmKTsgIC8vIHkveCA9IG5lZy96ZXJvID0gLUluZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmID0gMDsKLSAgICAgICAgfQorICB9IGVsc2UgaWYgKHkgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgIGlmICh4ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIHEgPSAtZkRpdk5vcm1IaWdoUHJlYygteSwgeCwgJnNmKTsgLyogeSBuZWcuICovCisgICAgfSBlbHNlIGlmICh4IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIHEgPSBmRGl2Tm9ybUhpZ2hQcmVjKC15LCAteCwgJnNmKTsgLyogYm90aCBuZWcuICovCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICh4ID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAqLworICAgICAgcSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsgICAgICAgICAvKiB5L3ggPSBuZWcvemVybyA9IC1JbmYgKi8KKyAgICAgIHNmID0gMDsKICAgICB9Ci0gICAgZWxzZSB7IC8vICh5ID09RkwyRlhDT05TVF9EQkwoMC4wZikpCi0gICAgICAgIHEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgICAgc2YgPSAwOworICB9IGVsc2UgeyAvKiAoeSA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgKi8KKyAgICBxID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgc2YgPSAwOworICB9CisgIHNmbyA9IHNmOworCisgIC8qIC0tLSBhdGFuKCkgKi8KKworICBpZiAoc2ZvID4gQVRJX1NGKSB7CisgIC8qIC0tLSBjb3VsZCBub3QgY2FsYyBmaXhwX2F0YW4oKSBoZXJlIGJlYyBvZiBpbnB1dCBkYXRhIG91dCBvZiByYW5nZSAqLworICAvKiAgICAgPT0+IHRoZXJlZm9yZSBnaXZlIGJhY2sgYm91bmRhcnkgdmFsdWVzICovCisKKyNpZiBJTVBST1ZFX0FUQU4yX0FDQ1VSQUNZCisgICAgaWYgKHNmbyA+IE1BWFNGVEFCKSBzZm8gPSBNQVhTRlRBQjsKKyNlbmRpZgorCisgICAgaWYgKHEgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworI2lmIElNUFJPVkVfQVRBTjJfQUNDVVJBQ1kKKyAgICAgIGF0ID0gK2ZfYXRhbl9leHBhbmRfcmFuZ2Vbc2ZvIC0gQVRJX1NGIC0gMV07CisjZWxzZQorICAgICAgYXQgPSBGTDJGWENPTlNUX0RCTCgrTV9QSSAvIDIgLyBBVE9fU0NBTEUpOworI2VuZGlmCisgICAgfSBlbHNlIGlmIChxIDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyNpZiBJTVBST1ZFX0FUQU4yX0FDQ1VSQUNZCisgICAgICBhdCA9IC1mX2F0YW5fZXhwYW5kX3JhbmdlW3NmbyAtIEFUSV9TRiAtIDFdOworI2Vsc2UKKyAgICAgIGF0ID0gRkwyRlhDT05TVF9EQkwoLU1fUEkgLyAyIC8gQVRPX1NDQUxFKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7IC8qIHEgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikgKi8KKyAgICAgIGF0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgfQotICAgIHNmbyA9IHNmOwotCi0gICAgLy8gLS0tIGF0YW4oKQotCi0gICAgaWYgICggc2ZvID4gQVRJX1NGICkgewotICAgICAgICAvLyAtLS0gY291bGQgbm90IGNhbGMgZml4cF9hdGFuKCkgaGVyZSBiZWMgb2YgaW5wdXQgZGF0YSBvdXQgb2YgcmFuZ2UKLSAgICAgICAgLy8gICAgID09PiB0aGVyZWZvcmUgZ2l2ZSBiYWNrIGJvdW5kYXJ5IHZhbHVlcwotCi0gICAgICAgICNpZiBJTVBST1ZFX0FUQU4yX0FDQ1VSQUNZCi0gICAgICAgIGlmIChzZm8gPiBNQVhTRlRBQikgc2ZvID0gTUFYU0ZUQUI7Ci0gICAgICAgICNlbmRpZgotCi0gICAgICAgIGlmICAgICAgKCAgcSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotICAgICAgICAgICAjaWYgSU1QUk9WRV9BVEFOMl9BQ0NVUkFDWQotICAgICAgICAgICAgYXQgPSArZl9hdGFuX2V4cGFuZF9yYW5nZVtzZm8tQVRJX1NGLTFdOwotICAgICAgICAgICAjZWxzZQotICAgICAgICAgICAgYXQgPSBGTDJGWENPTlNUX0RCTCggK01fUEkvMiAvIEFUT19TQ0FMRSk7Ci0gICAgICAgICAgICNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAgcSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotICAgICAgICAgICAjaWYgSU1QUk9WRV9BVEFOMl9BQ0NVUkFDWQotICAgICAgICAgICAgYXQgPSAtZl9hdGFuX2V4cGFuZF9yYW5nZVtzZm8tQVRJX1NGLTFdOwotICAgICAgICAgICAjZWxzZQotICAgICAgICAgICAgYXQgPSBGTDJGWENPTlNUX0RCTCggLU1fUEkvMiAvIEFUT19TQ0FMRSk7Ci0gICAgICAgICAgICNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeyAgLy8gcT09IEZMMkZYQ09OU1RfREJMKDAuMGYpCi0gICAgICAgICAgICBhdCA9IEZMMkZYQ09OU1RfREJMKCAwLjBmICk7Ci0gICAgICAgIH0KLSAgICB9ZWxzZXsKLSAgICAgICAgLy8gLS0tIGNhbGMgb2YgZml4cF9hdGFuKCkgaXMgcG9zc2libGU7IGlucHV0IGRhdGEgd2l0aGluIHJhbmdlCi0gICAgICAgIC8vICAgICA9PT4gc2V0IHEgb24gZml4ZWQgc2NhbGUgbGV2ZWwgYXMgZGVzaXJlZCBmcm9tIGZpeHBfYXRhbigpCi0gICAgICAgIHN0ZiA9IHNmbyAtIEFUSV9TRjsKLSAgICAgICAgaWYgKHN0ZiA+IDApICBxID0gcSA8PCAoSU5UKWZNaW4oIHN0ZixERlJBQ1RfQklUUy0xKTsKLSAgICAgICAgZWxzZSAgICAgICAgICBxID0gcSA+PiAoSU5UKWZNaW4oLXN0ZixERlJBQ1RfQklUUy0xKTsKLSAgICAgICAgYXQgPSBmaXhwX2F0YW4ocSk7ICAvLyBBVE9fU0YKLSAgICB9Ci0KLSAgICAvLyAtLS0gYXRhbjIoKQotCi0gICAgYXQyID0gYXQgPj4gKEFUMk9fU0YgLSBBVE9fU0YpOyAvLyBub3cgQVQyT19TRiBmb3IgYXRhbjIKLSAgICBpZiAgICAgICggIHggPiBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKLSAgICAgICAgcmV0ID0gYXQyOwotICAgIH0KLSAgICBlbHNlIGlmICggIHggPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKLSAgICAgICAgaWYgKCAgeSA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKLSAgICAgICAgICAgIHJldCA9IGF0MiArIEZMMkZYQ09OU1RfREJMKCBNX1BJIC8gQVQyT19TQ0FMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBhdDIgLSBGTDJGWENPTlNUX0RCTCggTV9QSSAvIEFUMk9fU0NBTEUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvLyB4ID09IDAKLSAgICAgICAgaWYgICAgICAoIHkgPiAgRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7Ci0gICAgICAgICAgICByZXQgPSBGTDJGWENPTlNUX0RCTCggK01fUEkvMiAvIEFUMk9fU0NBTEUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCB5IDwgIEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotICAgICAgICAgICAgcmV0ID0gRkwyRlhDT05TVF9EQkwoIC1NX1BJLzIgLyBBVDJPX1NDQUxFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggeSA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKLSAgICAgICAgICAgIHJldCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLQotRklYUF9EQkwgZml4cF9hdGFuKEZJWFBfREJMIHgpCi17Ci0gICAgSU5UIHNpZ247Ci0gICAgRklYUF9EQkwgcmVzdWx0LCB0ZW1wOwotCi0gICAgLy8gU05SIG9mIGZpeHBfYXRhbigpID0gNTYgZEIKLSAgICBGSVhQX0RCTCBPTkVCWTNQNTYgID0gKEZJWFBfREJMKTB4MjY4MDAwMDA7IC8vIDEuMC8zLjU2IGluIHEzMQotICAgIEZJWFBfREJMIFAyODEgICAgICAgPSAoRklYUF9EQkwpMHgwMDAxMzAwMDsgLy8gMC4yODEgaW4gcTE4Ci0gICAgRklYUF9EQkwgT05FUDU3MSAgICA9IChGSVhQX0RCTCkweDY0ODdlZjAwOyAvLyAxLjU3MSBpbiBxMzAKLQotICAgIGlmICh4IDwgRklYUF9EQkwoMCkpIHsKLSAgICAgIHNpZ24gPSAxOwotICAgICAgeCA9IC0geCA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNpZ24gPSAwOwotICAgIH0KLQotICAgIC8qIGNhbGMgb2YgYXJjdGFuICovCi0gICAgaWYoeCA8ICggUShRX0FUQU5JTlApLUZMMkZYQ09OU1RfREJMKDAuMDAzOTUpKSApCi0gICAgewotICAgICAgICBJTlQgcmVzX2U7Ci0KLSAgICAgICAgdGVtcCA9IGZQb3cyKHgpOyAgICAgICAgICAgIC8vIHEyNSAqIHEyNSAtIChERlJBQ1RfQklUUy0xKSA9IHExOQotICAgICAgICB0ZW1wID0gZk11bHQodGVtcCwgT05FQlkzUDU2KTsgICAgICAvLyBxMTkgKiBxMzEgLSAoREZSQUNUX0JJVFMtMSkgPSBxMTkKLSAgICAgICAgdGVtcCA9IHRlbXAgKyBRKDE5KTsgICAgICAgICAgICAgICAgLy8gcTE5ICsgcTE5ID0gcTE5Ci0gICAgICAgIHJlc3VsdCA9IGZEaXZOb3JtKHgsIHRlbXAsICZyZXNfZSk7Ci0gICAgICAgIHJlc3VsdCA9IHNjYWxlVmFsdWUocmVzdWx0LCAoUV9BVEFOT1VULVFfQVRBTklOUCsxOS1ERlJBQ1RfQklUUysxKSArIHJlc19lICApOwotICAgIH0KLSAgICBlbHNlIGlmKCB4IDwgRkwyRlhDT05TVF9EQkwoMS4yOC82NC4wKSApCi0gICAgewotICAgICAgICBGSVhQX0RCTCBkZWx0YV9maXg7Ci0gICAgICAgIEZJWFBfREJMIFBJX0JZXzQgPSBGTDJGWENPTlNUX0RCTCgzLjE0MTU5MjYvNC4wKSA+PiAxOyAvKiBwaS80IGluIHEzMCAqLwotCi0gICAgICAgIGRlbHRhX2ZpeCA9ICh4IC0gRkwyRlhDT05TVF9EQkwoMS4wLzY0LjApKSA8PCA1OyAvKiBxMzAgKi8KLSAgICAgICAgcmVzdWx0ID0gUElfQllfNCArIChkZWx0YV9maXggPj4gMSkgLSAoZlBvdzJEaXYyKGRlbHRhX2ZpeCkpOwotICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiAtLS0gY2FsYyBvZiBmaXhwX2F0YW4oKSBpcyBwb3NzaWJsZTsgaW5wdXQgZGF0YSB3aXRoaW4gcmFuZ2UgKi8KKyAgICAvKiAgICAgPT0+IHNldCBxIG9uIGZpeGVkIHNjYWxlIGxldmVsIGFzIGRlc2lyZWQgZnJvbSBmaXhwX2F0YW4oKSAqLworICAgIHN0ZiA9IHNmbyAtIEFUSV9TRjsKKyAgICBpZiAoc3RmID4gMCkKKyAgICAgIHEgPSBxIDw8IChJTlQpZk1pbihzdGYsIERGUkFDVF9CSVRTIC0gMSk7CiAgICAgZWxzZQotICAgIHsKLSAgICAgICAgSU5UIHJlc19lOworICAgICAgcSA9IHEgPj4gKElOVClmTWluKC1zdGYsIERGUkFDVF9CSVRTIC0gMSk7CisgICAgYXQgPSBmaXhwX2F0YW4ocSk7IC8qIEFUT19TRiAqLworICB9CiAKLSAgICAgICAgdGVtcCA9IGZQb3cyRGl2Mih4KTsgICAgICAgIC8vIHEyNSAqIHEyNSAtIChERlJBQ1RfQklUUy0xKSAtIDEgPSBxMTgKLSAgICAgICAgdGVtcCA9IHRlbXAgKyBQMjgxOyAgICAgICAgICAgICAgICAgLy8gcTE4ICsgcTE4ID0gcTE4Ci0gICAgICAgIHJlc3VsdCA9IGZEaXZOb3JtKHgsIHRlbXAsICZyZXNfZSk7Ci0gICAgICAgIHJlc3VsdCA9IHNjYWxlVmFsdWUocmVzdWx0LCAoUV9BVEFOT1VULVFfQVRBTklOUCsxOC1ERlJBQ1RfQklUUysxKSArIHJlc19lICk7Ci0gICAgICAgIHJlc3VsdCA9IE9ORVA1NzEgLSByZXN1bHQ7ICAgICAgICAgIC8vIHEzMCArIHEzMCA9IHEzMAotICAgIH0KLSAgICBpZiAoc2lnbikgewotICAgICAgcmVzdWx0ID0gLXJlc3VsdDsKLSAgICB9CisgIC8vIC0tLSBhdGFuMigpCiAKLSAgICByZXR1cm4ocmVzdWx0KTsKKyAgYXQyID0gYXQgPj4gKEFUMk9fU0YgLSBBVE9fU0YpOyAgLy8gbm93IEFUMk9fU0YgZm9yIGF0YW4yCisgIGlmICh4ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICByZXQgPSBhdDI7CisgIH0gZWxzZSBpZiAoeCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgaWYgKHkgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIHJldCA9IGF0MiArIEZMMkZYQ09OU1RfREJMKE1fUEkgLyBBVDJPX1NDQUxFKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gYXQyIC0gRkwyRlhDT05TVF9EQkwoTV9QSSAvIEFUMk9fU0NBTEUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyB4ID09IDAKKyAgICBpZiAoeSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICByZXQgPSBGTDJGWENPTlNUX0RCTCgrTV9QSSAvIDIgLyBBVDJPX1NDQUxFKTsKKyAgICB9IGVsc2UgaWYgKHkgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgcmV0ID0gRkwyRlhDT05TVF9EQkwoLU1fUEkgLyAyIC8gQVQyT19TQ0FMRSk7CisgICAgfSBlbHNlIGlmICh5ID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICByZXQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKIH0KIAorRklYUF9EQkwgZml4cF9hdGFuKEZJWFBfREJMIHgpIHsKKyAgSU5UIHNpZ247CisgIEZJWFBfREJMIHJlc3VsdCwgdGVtcDsKIAorICAvKiBTTlIgb2YgZml4cF9hdGFuKCkgPSA1NiBkQiAqLworICBGSVhQX0RCTCBQMjgxID0gKEZJWFBfREJMKTB4MDAwMTMwMDA7ICAgICAvLyAwLjI4MSBpbiBxMTgKKyAgRklYUF9EQkwgT05FUDU3MSA9IChGSVhQX0RCTCkweDY0ODdlZjAwOyAgLy8gMS41NzEgaW4gcTMwCisKKyAgaWYgKHggPCBGSVhQX0RCTCgwKSkgeworICAgIHNpZ24gPSAxOworICAgIHggPSAteDsKKyAgfSBlbHNlIHsKKyAgICBzaWduID0gMDsKKyAgfQorICBGREtfQVNTRVJUKEZMMkZYQ09OU1RfREJMKDEuMCAvIDY0LjApID09IFEoUV9BVEFOSU5QKSk7CisgIC8qIGNhbGMgb2YgYXJjdGFuICovCisgIGlmICh4IDwgRkwyRlhDT05TVF9EQkwoMS4wIC8gNjQuMCkpCisgIC8qCisgICAgQ2hlYnlzaGV2IHBvbHlub21pYWwgYXBwcm94aW1hdGlvbiBvZiBhdGFuKHgpCisgICAgNXRoLW9yZGVyIGFwcHJveGltYXRpb246IGF0YW4oeCkgPSBhMSp4ICsgYTIqeF4zICsgYTMqeF41ID0geChhMSArIHheMiooYTIgKworICAgIGEzKnheMikpOyBhMSA9IDAuOTk0OTQ5MzY2MTE2NjU0MGYsIGEyID0gMC4yODcwNjA2MzU1MzI2NTIwZiwgYTMgPQorICAgIDAuMDc4MDM3MTc2NDQ2NDQxMGY7IDd0aC1vcmRlciBhcHByb3hpbWF0aW9uOiBhdGFuKHgpID0gYTEqeCArIGEyKnheMyArCisgICAgYTMqeF41ICsgYTMqeF43ID0geChhMSArIHheMiooYTIgKyB4XjIqKGEzICsgYTQqeF4yKSkpOyBhMSA9CisgICAgMC45OTkxMzM0NDgyMjI3ODAxLCBhMiA9IC0wLjMyMDUzMzI5MjM4MTY2NDAsIGEzID0gMC4xNDQ5ODI0OTAxNDQ0NjUwLCBhNCA9CisgICAgLTAuMDM4MjU0NDY0OTcwMjk5MDsgN3RoLW9yZGVyIGFwcHJveGltYXRpb24gaW4gdXNlICh0aGUgbW9zdCBhY2N1cmF0ZQorICAgIHNvbHV0aW9uKQorICAqLworICB7CisgICAgeCA8PD0gQVRJX1NGOworICAgIEZJWFBfREJMIHgyID0gZlBvdzIoeCk7CisgICAgdGVtcCA9IGZNdWx0QWRkRGl2MigoRkwyRlhDT05TVF9EQkwoMC4xNDQ5ODI0OTAxNDQ0NjUwZikgPj4gMSksIHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoLTAuMDM4MjU0NDY0OTcwMjk5MCkpOworICAgIHRlbXAgPSBmTXVsdEFkZERpdjIoKEZMMkZYQ09OU1RfREJMKC0wLjMyMDUzMzI5MjM4MTY2NDBmKSA+PiAyKSwgeDIsIHRlbXApOworICAgIHRlbXAgPSBmTXVsdEFkZERpdjIoKEZMMkZYQ09OU1RfREJMKDAuOTk5MTMzNDQ4MjIyNzgwMWYpID4+IDMpLCB4MiwgdGVtcCk7CisgICAgcmVzdWx0ID0gZk11bHQoeCwgKHRlbXAgPDwgMikpOworICB9IGVsc2UgaWYgKHggPCBGTDJGWENPTlNUX0RCTCgxLjI4IC8gNjQuMCkpIHsKKyAgICBGSVhQX0RCTCBkZWx0YV9maXg7CisgICAgRklYUF9EQkwgUElfQllfNCA9IEZMMkZYQ09OU1RfREJMKDMuMTQxNTkyNiAvIDQuMCkgPj4gMTsgLyogcGkvNCBpbiBxMzAgKi8KKworICAgIGRlbHRhX2ZpeCA9ICh4IC0gRkwyRlhDT05TVF9EQkwoMS4wIC8gNjQuMCkpIDw8IDU7IC8qIHEzMCAqLworICAgIHJlc3VsdCA9IFBJX0JZXzQgKyAoZGVsdGFfZml4ID4+IDEpIC0gKGZQb3cyRGl2MihkZWx0YV9maXgpKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBPdGhlciBhcHByb3hpbWF0aW9uIGZvciB8eHwgPiAxLjI4ICovCisgICAgSU5UIHJlc19lOworCisgICAgdGVtcCA9IGZQb3cyRGl2Mih4KTsgLyogcTI1ICogcTI1IC0gKERGUkFDVF9CSVRTLTEpIC0gMSA9IHExOCAqLworICAgIHRlbXAgPSB0ZW1wICsgUDI4MTsgIC8qIHExOCArIHExOCA9IHExOCAqLworICAgIHJlc3VsdCA9IGZEaXZOb3JtKHgsIHRlbXAsICZyZXNfZSk7CisgICAgcmVzdWx0ID0gc2NhbGVWYWx1ZShyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoUV9BVEFOT1VUIC0gUV9BVEFOSU5QICsgMTggLSBERlJBQ1RfQklUUyArIDEpICsgcmVzX2UpOworICAgIHJlc3VsdCA9IE9ORVA1NzEgLSByZXN1bHQ7IC8qIHEzMCArIHEzMCA9IHEzMCAqLworICB9CisgIGlmIChzaWduKSB7CisgICAgcmVzdWx0ID0gLXJlc3VsdDsKKyAgfQorCisgIHJldHVybiAocmVzdWx0KTsKK30KIAogI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKIAotRklYUF9EQkwgZml4cF9jb3MoRklYUF9EQkwgeCwgaW50IHNjYWxlKQotewotICAgIEZJWFBfREJMIHJlc2lkdWFsLCBlcnJvciwgc2luZSwgY29zaW5lOwotICAgIAotICAgIHJlc2lkdWFsID0gZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZSh4LCBzY2FsZSwgJnNpbmUsICZjb3NpbmUpOwotICAgIGVycm9yID0gZk11bHQoc2luZSwgcmVzaWR1YWwpOworRklYUF9EQkwgZml4cF9jb3MoRklYUF9EQkwgeCwgaW50IHNjYWxlKSB7CisgIEZJWFBfREJMIHJlc2lkdWFsLCBlcnJvciwgc2luZSwgY29zaW5lOwogCi0gICAgcmV0dXJuIGNvc2luZSAtIGVycm9yOworICByZXNpZHVhbCA9IGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUoeCwgc2NhbGUsICZzaW5lLCAmY29zaW5lKTsKKyAgZXJyb3IgPSBmTXVsdChzaW5lLCByZXNpZHVhbCk7CisKKyNpZmRlZiBTSU5FVEFCTEVfMTZCSVQKKyAgcmV0dXJuIGNvc2luZSAtIGVycm9yOworI2Vsc2UKKyAgLyogVW5kbyBkb3duc2NhbGluZyBieSAxIHdoaWNoIHdhcyBkb25lIGF0IGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUgKi8KKyAgcmV0dXJuIFNBVFVSQVRFX0xFRlRfU0hJRlQoY29zaW5lIC0gZXJyb3IsIDEsIERGUkFDVF9CSVRTKTsKKyNlbmRpZgogfQogCi1GSVhQX0RCTCBmaXhwX3NpbihGSVhQX0RCTCB4LCBpbnQgc2NhbGUpCi17Ci0gICAgRklYUF9EQkwgcmVzaWR1YWwsIGVycm9yLCBzaW5lLCBjb3NpbmU7Ci0gICAgCi0gICAgcmVzaWR1YWwgPSBmaXhwX3Npbl9jb3NfcmVzaWR1YWxfaW5saW5lKHgsIHNjYWxlLCAmc2luZSwgJmNvc2luZSk7Ci0gICAgZXJyb3IgPSBmTXVsdChjb3NpbmUsIHJlc2lkdWFsKTsKK0ZJWFBfREJMIGZpeHBfc2luKEZJWFBfREJMIHgsIGludCBzY2FsZSkgeworICBGSVhQX0RCTCByZXNpZHVhbCwgZXJyb3IsIHNpbmUsIGNvc2luZTsKIAotICAgIHJldHVybiBzaW5lICsgZXJyb3I7CisgIHJlc2lkdWFsID0gZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZSh4LCBzY2FsZSwgJnNpbmUsICZjb3NpbmUpOworICBlcnJvciA9IGZNdWx0KGNvc2luZSwgcmVzaWR1YWwpOworCisjaWZkZWYgU0lORVRBQkxFXzE2QklUCisgIHJldHVybiBzaW5lICsgZXJyb3I7CisjZWxzZQorICByZXR1cm4gU0FUVVJBVEVfTEVGVF9TSElGVChzaW5lICsgZXJyb3IsIDEsIERGUkFDVF9CSVRTKTsKKyNlbmRpZgogfQogCi12b2lkIGZpeHBfY29zX3NpbiAoRklYUF9EQkwgeCwgaW50IHNjYWxlLCBGSVhQX0RCTCAqY29zLCBGSVhQX0RCTCAqc2luKQotewotICAgIEZJWFBfREJMIHJlc2lkdWFsLCBlcnJvcjAsIGVycm9yMSwgc2luZSwgY29zaW5lOwotICAgIAotICAgIHJlc2lkdWFsID0gZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZSh4LCBzY2FsZSwgJnNpbmUsICZjb3NpbmUpOwotICAgIGVycm9yMCA9IGZNdWx0KHNpbmUsIHJlc2lkdWFsKTsKLSAgICBlcnJvcjEgPSBmTXVsdChjb3NpbmUsIHJlc2lkdWFsKTsKLSAgICAqY29zICA9IGNvc2luZSAtIGVycm9yMDsKLSAgICAqc2luICA9IHNpbmUgKyBlcnJvcjE7Cit2b2lkIGZpeHBfY29zX3NpbihGSVhQX0RCTCB4LCBpbnQgc2NhbGUsIEZJWFBfREJMICpjb3MsIEZJWFBfREJMICpzaW4pIHsKKyAgRklYUF9EQkwgcmVzaWR1YWwsIGVycm9yMCwgZXJyb3IxLCBzaW5lLCBjb3NpbmU7CisKKyAgcmVzaWR1YWwgPSBmaXhwX3Npbl9jb3NfcmVzaWR1YWxfaW5saW5lKHgsIHNjYWxlLCAmc2luZSwgJmNvc2luZSk7CisgIGVycm9yMCA9IGZNdWx0KHNpbmUsIHJlc2lkdWFsKTsKKyAgZXJyb3IxID0gZk11bHQoY29zaW5lLCByZXNpZHVhbCk7CisKKyNpZmRlZiBTSU5FVEFCTEVfMTZCSVQKKyAgKmNvcyA9IGNvc2luZSAtIGVycm9yMDsKKyAgKnNpbiA9IHNpbmUgKyBlcnJvcjE7CisjZWxzZQorICAqY29zID0gU0FUVVJBVEVfTEVGVF9TSElGVChjb3NpbmUgLSBlcnJvcjAsIDEsIERGUkFDVF9CSVRTKTsKKyAgKnNpbiA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoc2luZSArIGVycm9yMSwgMSwgREZSQUNUX0JJVFMpOworI2VuZGlmCiB9Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9hcm0vYXV0b2NvcnIybmQuY3BwIGIvbGliRkRLL3NyYy9hcm0vYXV0b2NvcnIybmQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzc2ZTMwLi4wMDAwMDAwCi0tLSBhL2xpYkZESy9zcmMvYXJtL2F1dG9jb3JyMm5kLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiEKLSAqCi0gKiBcYnJpZWYgQ2FsY3VsYXRlIHNlY29uZCBvcmRlciBhdXRvY29ycmVsYXRpb24KLSAqCi0gKi8KLQotCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL2FybS9kY3RfYXJtLmNwcCBiL2xpYkZESy9zcmMvYXJtL2RjdF9hcm0uY3BwCmluZGV4IDU5Yjc3M2UuLmRkNjYxMDkgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvYXJtL2RjdF9hcm0uY3BwCisrKyBiL2xpYkZESy9zcmMvYXJtL2RjdF9hcm0uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDkgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAorICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIEZVTkNUSU9OX2RjdF9JVl9mdW5jMQogCkBAIC05MSwxMTkgKzEwOCwxNjggQEAKICAgICAgICAgIFdpdGggdGhpcyB2ZXJzaW9uLCB3ZSBzYXZlIDIgY3ljbGVzIHBlciBsb29wIGl0ZXJhdGlvbi4KICovCiAKLV9fYXNtICB2b2lkIGRjdF9JVl9mdW5jMSgKLSAgICBpbnQgaSwKLSAgICBjb25zdCBGSVhQX1NQSyAqdHdpZGRsZSwKLSAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8wLAotICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzEpCi17Ci0gICAgLyogUmVnaXN0ZXIgbWFwOgotICAgICAgIHIwICAgaQotICAgICAgIHIxICAgdHdpZGRsZQotICAgICAgIHIyICAgcERhdF8wCi0gICAgICAgcjMgICBwRGF0XzEKLSAgICAgICByNCAgIGFjY3UxCi0gICAgICAgcjUgICBhY2N1MgotICAgICAgIHI2ICAgYWNjdTMKLSAgICAgICByNyAgIGFjY3U0Ci0gICAgICAgcjggICB2YWxfdHcKLSAgICAgICByOSAgIGFjY3VYCi0gICAgKi8KLSAgICBQVVNIICAgIHtyNC1yOX0KK19fYXNtIHZvaWQgZGN0X0lWX2Z1bmMxKGludCBpLCBjb25zdCBGSVhQX1NQSyAqdHdpZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzAsIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzEpIHsKKyAgLyogUmVnaXN0ZXIgbWFwOgorICAgICByMCAgIGkKKyAgICAgcjEgICB0d2lkZGxlCisgICAgIHIyICAgcERhdF8wCisgICAgIHIzICAgcERhdF8xCisgICAgIHI0ICAgYWNjdTEKKyAgICAgcjUgICBhY2N1MgorICAgICByNiAgIGFjY3UzCisgICAgIHI3ICAgYWNjdTQKKyAgICAgcjggICB2YWxfdHcKKyAgICAgcjkgICBhY2N1WAorICAqLworICBQVVNIe3I0IC0gcjl9CiAKLSAgICAgLyogNDQgY3ljbGVzIGZvciAyIGl0ZXJhdGlvbnMgPSAyMiBjeWNsZXMvaXRlcmF0aW9uICovCi1kY3RfSVZfbG9vcDFfc3RhcnQKLS8qICBGaXJzdCBpdGVyYXRpb24gKi8KLSAgICBMRFIgICAgIHI4LCBbcjFdLCAjNCAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrOwotICAgIExEUiAgICAgcjUsIFtyMiwgIzBdICAgIC8vIGFjY3UyID0gcERhdF8wWzBdCi0gICAgTERSICAgICByNCwgW3IzLCAjMF0gICAgLy8gYWNjdTEgPSBwRGF0XzFbMF0KKyAgLyogNDQgY3ljbGVzIGZvciAyIGl0ZXJhdGlvbnMgPSAyMiBjeWNsZXMvaXRlcmF0aW9uICovCisgIGRjdF9JVl9sb29wMV9zdGFydAorICAgICAgLyogIEZpcnN0IGl0ZXJhdGlvbiAqLworICAgICAgTERSIHI4LAorICAgICAgW3IxXSwKKyMgNCAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrOworICAgICAgTERSIHI1LAorICAgICAgWyByMiwgIzAgXSAgLy8gYWNjdTIgPSBwRGF0XzBbMF0KKyAgICAgIExEUiByNCwKKyAgICAgIFsgcjMsICMwIF0gIC8vIGFjY3UxID0gcERhdF8xWzBdCiAKLSAgICBTTVVMV1QgIHI5LCByNSwgcjggICAgICAvLyBhY2N1WCA9IGFjY3UyKnZhbF90dy5sCi0gICAgU01VTFdCICByNSwgcjUsIHI4ICAgICAgLy8gYWNjdTIgPSBhY2N1Mip2YWxfdHcuaAotICAgIFJTQiAgICAgcjksIHI5LCAjMCAgICAgIC8vIGFjY3VYID0tYWNjdTIqdmFsX3R3LmwKLSAgICBTTUxBV1QgIHI1LCByNCwgcjgsIHI1ICAvLyBhY2N1MiA9IGFjY3UyKnZhbF90dy5oICsgYWNjdTEqdmFsX3R3LmwKLSAgICBTTUxBV0IgIHI0LCByNCwgcjgsIHI5ICAvLyBhY2N1MSA9IGFjY3UxKnZhbF90dy5oIC0gYWNjdTIqdmFsX3R3LmwKKyAgICAgIFNNVUxXVCByOSwKKyAgICAgIHI1LAorICAgICAgcjggIC8vIGFjY3VYID0gYWNjdTIqdmFsX3R3LmwKKyAgICAgICAgICBTTVVMV0IgcjUsCisgICAgICByNSwKKyAgICAgIHI4ICAvLyBhY2N1MiA9IGFjY3UyKnZhbF90dy5oCisgICAgICAgICAgUlNCIHI5LAorICAgICAgcjksCisjIDAgLy8gYWNjdVggPS1hY2N1Mip2YWxfdHcubAorICAgICAgU01MQVdUIHI1LCByNCwgcjgsCisgICAgICByNSAgLy8gYWNjdTIgPSBhY2N1Mip2YWxfdHcuaCArIGFjY3UxKnZhbF90dy5sCisgICAgICAgICAgU01MQVdCIHI0LAorICAgICAgcjQsIHI4LAorICAgICAgcjkgIC8vIGFjY3UxID0gYWNjdTEqdmFsX3R3LmggLSBhY2N1Mip2YWxfdHcubAogCi0gICAgTERSICAgICByOCwgW3IxXSwgIzQgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGUrKzsKLSAgICBMRFIgICAgIHI3LCBbcjMsICMtNF0gICAvLyBhY2N1NCA9IHBEYXRfMVstMV0KLSAgICBMRFIgICAgIHI2LCBbcjIsICM0XSAgICAvLyBhY2N1MyA9IHBEYXRfMFsxXQorICAgICAgICAgIExEUiByOCwKKyAgICAgIFtyMV0sCisjIDQgLy8gdmFsX3R3ID0gKnR3aWRkbGUrKzsKKyAgICAgIExEUiByNywKKyAgICAgIFsgcjMsICMgLSA0IF0gIC8vIGFjY3U0ID0gcERhdF8xWy0xXQorICAgICAgTERSIHI2LAorICAgICAgWyByMiwgIzQgXSAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KIAotICAgIFNNVUxXQiAgcjksIHI3LCByOCAgICAgIC8vIGFjY3VYID0gYWNjdTQqdmFsX3R3LmgKLSAgICBTTVVMV1QgIHI3LCByNywgcjggICAgICAvLyBhY2N1NCA9IGFjY3U0KnZhbF90dy5sCi0gICAgUlNCICAgICByOSwgcjksICMwICAgICAgLy8gYWNjdVggPS1hY2N1NCp2YWxfdHcuaAotICAgIFNNTEFXQiAgcjcsIHI2LCByOCwgcjcgIC8vIGFjY3U0ID0gYWNjdTQqdmFsX3R3LmwrYWNjdTMqdmFsX3R3LmgKLSAgICBTTUxBV1QgIHI2LCByNiwgcjgsIHI5ICAvLyBhY2N1MyA9IGFjY3UzKnZhbF90dy5sLWFjY3U0KnZhbF90dy5oCisgICAgICBTTVVMV0IgcjksCisgICAgICByNywKKyAgICAgIHI4ICAvLyBhY2N1WCA9IGFjY3U0KnZhbF90dy5oCisgICAgICAgICAgU01VTFdUIHI3LAorICAgICAgcjcsCisgICAgICByOCAgLy8gYWNjdTQgPSBhY2N1NCp2YWxfdHcubAorICAgICAgICAgIFJTQiByOSwKKyAgICAgIHI5LAorIyAwIC8vIGFjY3VYID0tYWNjdTQqdmFsX3R3LmgKKyAgICAgIFNNTEFXQiByNywgcjYsIHI4LAorICAgICAgcjcgIC8vIGFjY3U0ID0gYWNjdTQqdmFsX3R3LmwrYWNjdTMqdmFsX3R3LmgKKyAgICAgICAgICBTTUxBV1QgcjYsCisgICAgICByNiwgcjgsCisgICAgICByOSAgLy8gYWNjdTMgPSBhY2N1Myp2YWxfdHcubC1hY2N1NCp2YWxfdHcuaAogCi0gICAgU1RSICAgICByNSwgW3IyXSwgIzQgICAgLy8gKnBEYXRfMCsrID0gYWNjdTIKLSAgICBTVFIgICAgIHI0LCBbcjJdLCAjNCAgICAvLyAqcERhdF8wKysgPSBhY2N1MQotICAgIFNUUiAgICAgcjYsIFtyM10sICMtNCAgIC8vICpwRGF0XzEtLSA9IGFjY3UzCi0gICAgU1RSICAgICByNywgW3IzXSwgIy00ICAgLy8gKnBEYXRfMS0tID0gYWNjdTQKKyAgICAgICAgICBTVFIgcjUsCisgICAgICBbcjJdLAorIyA0IC8vICpwRGF0XzArKyA9IGFjY3UyCisgICAgICBTVFIgcjQsIFtyMl0sCisjIDQgLy8gKnBEYXRfMCsrID0gYWNjdTEKKyAgICAgIFNUUiByNiwgW3IzXSwKKyMtIDQgLy8gKnBEYXRfMS0tID0gYWNjdTMKKyAgICAgIFNUUiByNywgW3IzXSwKKyMtIDQgLy8gKnBEYXRfMS0tID0gYWNjdTQKIAotLyogIFNlY29uZCBpdGVyYXRpb24gKi8KLSAgICBMRFIgICAgIHI4LCBbcjFdLCAjNCAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrOwotICAgIExEUiAgICAgcjUsIFtyMiwgIzBdICAgIC8vIGFjY3UyID0gcERhdF8wWzBdCi0gICAgTERSICAgICByNCwgW3IzLCAjMF0gICAgLy8gYWNjdTEgPSBwRGF0XzFbMF0KKyAgICAgIC8qICBTZWNvbmQgaXRlcmF0aW9uICovCisgICAgICBMRFIgcjgsIFtyMV0sCisjIDQgLy8gdmFsX3R3ID0gKnR3aWRkbGUrKzsKKyAgICAgIExEUiByNSwKKyAgICAgIFsgcjIsICMwIF0gIC8vIGFjY3UyID0gcERhdF8wWzBdCisgICAgICBMRFIgcjQsCisgICAgICBbIHIzLCAjMCBdICAvLyBhY2N1MSA9IHBEYXRfMVswXQogCi0gICAgU01VTFdUICByOSwgcjUsIHI4ICAgICAgLy8gYWNjdVggPSBhY2N1Mip2YWxfdHcubAotICAgIFNNVUxXQiAgcjUsIHI1LCByOCAgICAgIC8vIGFjY3UyID0gYWNjdTIqdmFsX3R3LmgKLSAgICBSU0IgICAgIHI5LCByOSwgIzAgICAgICAvLyBhY2N1WCA9LWFjY3UyKnZhbF90dy5sCi0gICAgU01MQVdUICByNSwgcjQsIHI4LCByNSAgLy8gYWNjdTIgPSBhY2N1Mip2YWxfdHcuaCArIGFjY3UxKnZhbF90dy5sCi0gICAgU01MQVdCICByNCwgcjQsIHI4LCByOSAgLy8gYWNjdTEgPSBhY2N1MSp2YWxfdHcuaCAtIGFjY3UyKnZhbF90dy5sCisgICAgICBTTVVMV1QgcjksCisgICAgICByNSwKKyAgICAgIHI4ICAvLyBhY2N1WCA9IGFjY3UyKnZhbF90dy5sCisgICAgICAgICAgU01VTFdCIHI1LAorICAgICAgcjUsCisgICAgICByOCAgLy8gYWNjdTIgPSBhY2N1Mip2YWxfdHcuaAorICAgICAgICAgIFJTQiByOSwKKyAgICAgIHI5LAorIyAwIC8vIGFjY3VYID0tYWNjdTIqdmFsX3R3LmwKKyAgICAgIFNNTEFXVCByNSwgcjQsIHI4LAorICAgICAgcjUgIC8vIGFjY3UyID0gYWNjdTIqdmFsX3R3LmggKyBhY2N1MSp2YWxfdHcubAorICAgICAgICAgIFNNTEFXQiByNCwKKyAgICAgIHI0LCByOCwKKyAgICAgIHI5ICAvLyBhY2N1MSA9IGFjY3UxKnZhbF90dy5oIC0gYWNjdTIqdmFsX3R3LmwKIAotICAgIExEUiAgICAgcjgsIFtyMV0sICM0ICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlKys7Ci0gICAgTERSICAgICByNywgW3IzLCAjLTRdICAgLy8gYWNjdTQgPSBwRGF0XzFbLTFdCi0gICAgTERSICAgICByNiwgW3IyLCAjNF0gICAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KKyAgICAgICAgICBMRFIgcjgsCisgICAgICBbcjFdLAorIyA0IC8vIHZhbF90dyA9ICp0d2lkZGxlKys7CisgICAgICBMRFIgcjcsCisgICAgICBbIHIzLCAjIC0gNCBdICAvLyBhY2N1NCA9IHBEYXRfMVstMV0KKyAgICAgIExEUiByNiwKKyAgICAgIFsgcjIsICM0IF0gIC8vIGFjY3UzID0gcERhdF8wWzFdCiAKLSAgICBTTVVMV0IgIHI5LCByNywgcjggICAgICAvLyBhY2N1WCA9IGFjY3U0KnZhbF90dy5oCi0gICAgU01VTFdUICByNywgcjcsIHI4ICAgICAgLy8gYWNjdTQgPSBhY2N1NCp2YWxfdHcubAotICAgIFJTQiAgICAgcjksIHI5LCAjMCAgICAgIC8vIGFjY3VYID0tYWNjdTQqdmFsX3R3LmgKLSAgICBTTUxBV0IgIHI3LCByNiwgcjgsIHI3ICAvLyBhY2N1NCA9IGFjY3U0KnZhbF90dy5sK2FjY3UzKnZhbF90dy5oCi0gICAgU01MQVdUICByNiwgcjYsIHI4LCByOSAgLy8gYWNjdTMgPSBhY2N1Myp2YWxfdHcubC1hY2N1NCp2YWxfdHcuaAorICAgICAgU01VTFdCIHI5LAorICAgICAgcjcsCisgICAgICByOCAgLy8gYWNjdVggPSBhY2N1NCp2YWxfdHcuaAorICAgICAgICAgIFNNVUxXVCByNywKKyAgICAgIHI3LAorICAgICAgcjggIC8vIGFjY3U0ID0gYWNjdTQqdmFsX3R3LmwKKyAgICAgICAgICBSU0IgcjksCisgICAgICByOSwKKyMgMCAvLyBhY2N1WCA9LWFjY3U0KnZhbF90dy5oCisgICAgICBTTUxBV0IgcjcsIHI2LCByOCwKKyAgICAgIHI3ICAvLyBhY2N1NCA9IGFjY3U0KnZhbF90dy5sK2FjY3UzKnZhbF90dy5oCisgICAgICAgICAgU01MQVdUIHI2LAorICAgICAgcjYsIHI4LAorICAgICAgcjkgIC8vIGFjY3UzID0gYWNjdTMqdmFsX3R3LmwtYWNjdTQqdmFsX3R3LmgKIAotICAgIFNUUiAgICAgcjUsIFtyMl0sICM0ICAgIC8vICpwRGF0XzArKyA9IGFjY3UyCi0gICAgU1RSICAgICByNCwgW3IyXSwgIzQgICAgLy8gKnBEYXRfMCsrID0gYWNjdTEKLSAgICBTVFIgICAgIHI2LCBbcjNdLCAjLTQgICAvLyAqcERhdF8xLS0gPSBhY2N1MwotICAgIFNUUiAgICAgcjcsIFtyM10sICMtNCAgIC8vICpwRGF0XzEtLSA9IGFjY3U0CisgICAgICAgICAgU1RSIHI1LAorICAgICAgW3IyXSwKKyMgNCAvLyAqcERhdF8wKysgPSBhY2N1MgorICAgICAgU1RSIHI0LCBbcjJdLAorIyA0IC8vICpwRGF0XzArKyA9IGFjY3UxCisgICAgICBTVFIgcjYsIFtyM10sCisjLSA0IC8vICpwRGF0XzEtLSA9IGFjY3UzCisgICAgICBTVFIgcjcsIFtyM10sCisjLSA0IC8vICpwRGF0XzEtLSA9IGFjY3U0CiAKLSAgICBTVUJTICAgIHIwLCByMCwgIzEKLSAgICBCTkUgICAgIGRjdF9JVl9sb29wMV9zdGFydAorICAgICAgU1VCUyByMCwgcjAsCisjIDEgQk5FIGRjdF9JVl9sb29wMV9zdGFydAogCi0gICAgUE9QICAgICB7cjQtcjl9CisgICAgICBQT1AgeyByNCAtIHI5IH0KIAotICAgIEJYICAgICAgbHIKKyAgQlggbHIKIH0KIAogI2VuZGlmIC8qIEZVTkNUSU9OX2RjdF9JVl9mdW5jMSAqLwogCi0KICNpZmRlZiBGVU5DVElPTl9kY3RfSVZfZnVuYzIKIAotRkRLX0lOTElORQogLyogX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSAqLwotc3RhdGljIHZvaWQgZGN0X0lWX2Z1bmMyKAotICAgIGludCBpLAotICAgIGNvbnN0IEZJWFBfU1BLICp0d2lkZGxlLAotICAgIEZJWFBfREJMICpwRGF0XzAsCi0gICAgRklYUF9EQkwgKnBEYXRfMSwKLSAgICBpbnQgaW5jKQoteworc3RhdGljIGlubGluZSB2b2lkIGRjdF9JVl9mdW5jMihpbnQgaSwgY29uc3QgRklYUF9TUEsgKnR3aWRkbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwRGF0XzAsIEZJWFBfREJMICpwRGF0XzEsIGludCBpbmMpIHsKICAgRklYUF9EQkwgYWNjdTEsIGFjY3UyLCBhY2N1MywgYWNjdTQsIGFjY3VYOwogICBMT05HIHZhbF90dzsKIAogICBhY2N1MSA9IHBEYXRfMVstMl07CiAgIGFjY3UyID0gcERhdF8xWy0xXTsKIAotICAqLS1wRGF0XzEgPSAtKHBEYXRfMFsxXT4+MSk7Ci0gICpwRGF0XzArKyA9IChwRGF0XzBbMF0+PjEpOworICAqLS1wRGF0XzEgPSAtKHBEYXRfMFsxXSA+PiAxKTsKKyAgKnBEYXRfMCsrID0gKHBEYXRfMFswXSA+PiAxKTsKIAogICB0d2lkZGxlICs9IGluYzsKIAotX19hc20KLSAgewotICAgIExEUiAgICAgdmFsX3R3LCBbdHdpZGRsZV0sIGluYywgTFNMICMyICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlOyB0d2lkZGxlICs9IGluYworICBfX2FzbSB7CisgICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgIC8vIHZhbF90dyA9ICp0d2lkZGxlOyB0d2lkZGxlICs9IGluYwogICAgIEIgICAgICAgZGN0X0lWX2xvb3AyXzJuZF9wYXJ0CiAKLSAgICAvKiA0MiBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDIxIGN5Y2xlcy9pdGVyYXRpb24gKi8KKyAgICAgICAgLyogNDIgY3ljbGVzIGZvciAyIGl0ZXJhdGlvbnMgPSAyMSBjeWNsZXMvaXRlcmF0aW9uICovCiBkY3RfSVZfbG9vcDI6CiAgICAgU01VTFdUICBhY2N1WCwgYWNjdTIsIHZhbF90dwogICAgIFNNVUxXQiAgYWNjdTIsIGFjY3UyLCB2YWxfdHcKQEAgLTIyNCw3ICsyOTAsNyBAQAogICAgIExEUiAgICAgYWNjdTEsIFtwRGF0XzEsICMtOF0KICAgICBMRFIgICAgIGFjY3UyLCBbcERhdF8xLCAjLTRdCiAKLSAgICBMRFIgICAgIHZhbF90dywgW3R3aWRkbGVdLCBpbmMsIExTTCAjMiAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZTsgdHdpZGRsZSArPSBpbmMKKyAgICBMRFIgICAgIHZhbF90dywgW3R3aWRkbGVdLCBpbmMsIExTTCAjMiAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCiAKICAgICBTVFIgICAgIGFjY3VYLCBbcERhdF8xLCAjLTRdICEKICAgICBTVFIgICAgIGFjY3U0LCBbcERhdF8wXSwgIzQKQEAgLTI1Miw3ICszMTgsNyBAQAogICAgIFNUUiAgICAgYWNjdVgsIFtwRGF0XzEsICMtNF0gIQogICAgIFNUUiAgICAgYWNjdTQsIFtwRGF0XzBdLCAjNAogCi0gICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCisgICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgIC8vIHZhbF90dyA9ICp0d2lkZGxlOyB0d2lkZGxlICs9IGluYwogCiAgICAgU1VCUyAgICBpLCBpLCAjMQogICAgIEJORSAgICAgZGN0X0lWX2xvb3AyCkBAIC0yNjcsOTYgKzMzMywxNDggQEAKIH0KICNlbmRpZiAvKiBGVU5DVElPTl9kY3RfSVZfZnVuYzIgKi8KIAotCiAjaWZkZWYgRlVOQ1RJT05fZHN0X0lWX2Z1bmMxCiAKLV9fYXNtIHZvaWQgZHN0X0lWX2Z1bmMxKAotICAgIGludCBpLAotICAgIGNvbnN0IEZJWFBfU1BLICp0d2lkZGxlLAotICAgIEZJWFBfREJMICpwRGF0XzAsCi0gICAgRklYUF9EQkwgKnBEYXRfMSkKLXsKLSAgICAvKiBSZWdpc3RlciBtYXA6Ci0gICAgICAgcjAgICBpCi0gICAgICAgcjEgICB0d2lkZGxlCi0gICAgICAgcjIgICBwRGF0XzAKLSAgICAgICByMyAgIHBEYXRfMQotICAgICAgIHI0ICAgYWNjdTEKLSAgICAgICByNSAgIGFjY3UyCi0gICAgICAgcjYgICBhY2N1MwotICAgICAgIHI3ICAgYWNjdTQKLSAgICAgICByOCAgIHZhbF90dwotICAgICAgIHI5ICAgYWNjdVgKLSAgICAqLwotICAgIFBVU0ggICAge3I0LXI5fQorX19hc20gdm9pZCBkc3RfSVZfZnVuYzEoaW50IGksIGNvbnN0IEZJWFBfU1BLICp0d2lkZGxlLCBGSVhQX0RCTCAqcERhdF8wLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBEYXRfMSkgeworICAvKiBSZWdpc3RlciBtYXA6CisgICAgIHIwICAgaQorICAgICByMSAgIHR3aWRkbGUKKyAgICAgcjIgICBwRGF0XzAKKyAgICAgcjMgICBwRGF0XzEKKyAgICAgcjQgICBhY2N1MQorICAgICByNSAgIGFjY3UyCisgICAgIHI2ICAgYWNjdTMKKyAgICAgcjcgICBhY2N1NAorICAgICByOCAgIHZhbF90dworICAgICByOSAgIGFjY3VYCisgICovCisgIFBVU0h7cjQgLSByOX0KIAotZHN0X0lWX2xvb3AxCi0gICAgTERSICAgICByOCwgW3IxXSwgIzQgICAgICAgICAgICAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrCi0gICAgTERSICAgICByNSwgW3IyXSAgICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IHBEYXRfMFswXQotICAgIExEUiAgICAgcjYsIFtyMiwgIzRdICAgICAgICAgICAgICAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KLSAgICBSU0IgICAgIHI1LCByNSwgIzAgICAgICAgICAgICAgICAgIC8vIGFjY3UyID0gLWFjY3UyCi0gICAgU01VTFdUICByOSwgcjUsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1WCA9ICgtYWNjdTIpKnZhbF90dy5sCi0gICAgTERSICAgICByNCwgW3IzLCAjLTRdICAgICAgICAgICAgICAvLyBhY2N1MSA9IHBEYXRfMVstMV0KLSAgICBSU0IgICAgIHI5LCByOSwgIzAgICAgICAgICAgICAgICAgIC8vIGFjY3VYID0gLSgtYWNjdTIpKnZhbF90dy5sCi0gICAgU01MQVdCICByOSwgcjQsIHI4LCByOSAgICAgICAgICAgICAvLyBhY2N1WCA9IGFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCi0gICAgU01VTFdUICByNCwgcjQsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1MSA9IGFjY3UxKnZhbF90dy5sCi0gICAgTERSICAgICByNywgW3IzLCAjLThdICAgICAgICAgICAgICAvLyBhY2N1NCA9IHBEYXRfMVstMl0KLSAgICBTTUxBV0IgIHI1LCByNSwgcjgsIHI0ICAgICAgICAgICAgIC8vIGFjY3UyID0gKC1hY2N1MikqdmFsX3R3LnQrYWNjdTEqdmFsX3R3LmwKLSAgICBMRFIgICAgIHI4LCBbcjFdLCAjNCAgICAgICAgICAgICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlKysKLSAgICBTVFIgICAgIHI1LCBbcjJdLCAjNCAgICAgICAgICAgICAgIC8vICpwRGF0XzArKyA9IGFjY3UyCi0gICAgU1RSICAgICByOSwgW3IyXSwgIzQgICAgICAgICAgICAgICAvLyAqcERhdF8wKysgPSBhY2N1MSAoYWNjdVgpCi0gICAgUlNCICAgICByNywgcjcsICMwICAgICAgICAgICAgICAgICAvLyBhY2N1NCA9IC1hY2N1NAotICAgIFNNVUxXQiAgcjUsIHI3LCByOCAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAoLWFjY3U0KSp2YWxfdHcuaAotICAgIFNNVUxXQiAgcjQsIHI2LCByOCAgICAgICAgICAgICAgICAgLy8gYWNjdTEgPSAoLWFjY3U0KSp2YWxfdHcubAotICAgIFJTQiAgICAgcjUsIHI1LCAjMCAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAtKC1hY2N1NCkqdmFsX3R3LmgKLSAgICBTTUxBV1QgIHI2LCByNiwgcjgsIHI1ICAgICAgICAgICAgIC8vIGFjY3UzID0gKC1hY2N1NCkqdmFsX3R3LmwtKC1hY2N1MykqdmFsX3R3LmgKLSAgICBTTUxBV1QgIHI3LCByNywgcjgsIHI0ICAgICAgICAgICAgIC8vIGFjY3U0ID0gKC1hY2N1MykqdmFsX3R3LmwrKC1hY2N1NCkqdmFsX3R3LmgKLSAgICBTVFIgICAgIHI2LCBbcjMsICMtNF0gISAgICAgICAgICAgIC8vICotLXBEYXRfMSA9IGFjY3UzCi0gICAgU1RSICAgICByNywgW3IzLCAjLTRdICEgICAgICAgICAgICAvLyAqLS1wRGF0XzEgPSBhY2N1NAorICBkc3RfSVZfbG9vcDEgTERSIHI4LAorICAgICAgW3IxXSwKKyMgNCAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrCisgICAgICBMRFIgcjUsCisgICAgICBbcjJdICAvLyBhY2N1MiA9IHBEYXRfMFswXQorICAgICAgTERSIHI2LAorICAgICAgWyByMiwgIzQgXSAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KKyAgICAgIFJTQiByNSwKKyAgICAgIHI1LAorIyAwIC8vIGFjY3UyID0gLWFjY3UyCisgICAgICBTTVVMV1QgcjksIHI1LAorICAgICAgcjggIC8vIGFjY3VYID0gKC1hY2N1MikqdmFsX3R3LmwKKyAgICAgICAgICBMRFIgcjQsCisgICAgICBbIHIzLCAjIC0gNCBdICAvLyBhY2N1MSA9IHBEYXRfMVstMV0KKyAgICAgIFJTQiByOSwKKyAgICAgIHI5LAorIyAwIC8vIGFjY3VYID0gLSgtYWNjdTIpKnZhbF90dy5sCisgICAgICBTTUxBV0IgcjksIHI0LCByOCwKKyAgICAgIHI5ICAvLyBhY2N1WCA9IGFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCisgICAgICAgICAgU01VTFdUIHI0LAorICAgICAgcjQsCisgICAgICByOCAgLy8gYWNjdTEgPSBhY2N1MSp2YWxfdHcubAorICAgICAgICAgIExEUiByNywKKyAgICAgIFsgcjMsICMgLSA4IF0gIC8vIGFjY3U0ID0gcERhdF8xWy0yXQorICAgICAgU01MQVdCIHI1LAorICAgICAgcjUsIHI4LAorICAgICAgcjQgIC8vIGFjY3UyID0gKC1hY2N1MikqdmFsX3R3LnQrYWNjdTEqdmFsX3R3LmwKKyAgICAgICAgICBMRFIgcjgsCisgICAgICBbcjFdLAorIyA0IC8vIHZhbF90dyA9ICp0d2lkZGxlKysKKyAgICAgIFNUUiByNSwgW3IyXSwKKyMgNCAvLyAqcERhdF8wKysgPSBhY2N1MgorICAgICAgU1RSIHI5LCBbcjJdLAorIyA0IC8vICpwRGF0XzArKyA9IGFjY3UxIChhY2N1WCkKKyAgICAgIFJTQiByNywgcjcsCisjIDAgLy8gYWNjdTQgPSAtYWNjdTQKKyAgICAgIFNNVUxXQiByNSwgcjcsCisgICAgICByOCAgLy8gYWNjdTIgPSAoLWFjY3U0KSp2YWxfdHcuaAorICAgICAgICAgIFNNVUxXQiByNCwKKyAgICAgIHI2LAorICAgICAgcjggIC8vIGFjY3UxID0gKC1hY2N1NCkqdmFsX3R3LmwKKyAgICAgICAgICBSU0IgcjUsCisgICAgICByNSwKKyMgMCAvLyBhY2N1MiA9IC0oLWFjY3U0KSp2YWxfdHcuaAorICAgICAgU01MQVdUIHI2LCByNiwgcjgsCisgICAgICByNSAgLy8gYWNjdTMgPSAoLWFjY3U0KSp2YWxfdHcubC0oLWFjY3UzKSp2YWxfdHcuaAorICAgICAgICAgIFNNTEFXVCByNywKKyAgICAgIHI3LCByOCwKKyAgICAgIHI0ICAvLyBhY2N1NCA9ICgtYWNjdTMpKnZhbF90dy5sKygtYWNjdTQpKnZhbF90dy5oCisgICAgICAgICAgU1RSIHI2LAorICAgICAgWyByMywgIyAtIDQgXSAhICAvLyAqLS1wRGF0XzEgPSBhY2N1MworICAgICAgU1RSIHI3LAorICAgICAgWyByMywgIyAtIDQgXSAhICAvLyAqLS1wRGF0XzEgPSBhY2N1NAogCi0gICAgTERSICAgICByOCwgW3IxXSwgIzQgICAgICAgICAgICAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrCi0gICAgTERSICAgICByNSwgW3IyXSAgICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IHBEYXRfMFswXQotICAgIExEUiAgICAgcjYsIFtyMiwgIzRdICAgICAgICAgICAgICAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KLSAgICBSU0IgICAgIHI1LCByNSwgIzAgICAgICAgICAgICAgICAgIC8vIGFjY3UyID0gLWFjY3UyCi0gICAgU01VTFdUICByOSwgcjUsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1WCA9ICgtYWNjdTIpKnZhbF90dy5sCi0gICAgTERSICAgICByNCwgW3IzLCAjLTRdICAgICAgICAgICAgICAvLyBhY2N1MSA9IHBEYXRfMVstMV0KLSAgICBSU0IgICAgIHI5LCByOSwgIzAgICAgICAgICAgICAgICAgIC8vIGFjY3VYID0gLSgtYWNjdTIpKnZhbF90dy5sCi0gICAgU01MQVdCICByOSwgcjQsIHI4LCByOSAgICAgICAgICAgICAvLyBhY2N1WCA9IGFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCi0gICAgU01VTFdUICByNCwgcjQsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1MSA9IGFjY3UxKnZhbF90dy5sCi0gICAgTERSICAgICByNywgW3IzLCAjLThdICAgICAgICAgICAgICAvLyBhY2N1NCA9IHBEYXRfMVstMl0KLSAgICBTTUxBV0IgIHI1LCByNSwgcjgsIHI0ICAgICAgICAgICAgIC8vIGFjY3UyID0gKC1hY2N1MikqdmFsX3R3LnQrYWNjdTEqdmFsX3R3LmwKLSAgICBMRFIgICAgIHI4LCBbcjFdLCAjNCAgICAgICAgICAgICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlKysKLSAgICBTVFIgICAgIHI1LCBbcjJdLCAjNCAgICAgICAgICAgICAgIC8vICpwRGF0XzArKyA9IGFjY3UyCi0gICAgU1RSICAgICByOSwgW3IyXSwgIzQgICAgICAgICAgICAgICAvLyAqcERhdF8wKysgPSBhY2N1MSAoYWNjdVgpCi0gICAgUlNCICAgICByNywgcjcsICMwICAgICAgICAgICAgICAgICAvLyBhY2N1NCA9IC1hY2N1NAotICAgIFNNVUxXQiAgcjUsIHI3LCByOCAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAoLWFjY3U0KSp2YWxfdHcuaAotICAgIFNNVUxXQiAgcjQsIHI2LCByOCAgICAgICAgICAgICAgICAgLy8gYWNjdTEgPSAoLWFjY3U0KSp2YWxfdHcubAotICAgIFJTQiAgICAgcjUsIHI1LCAjMCAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAtKC1hY2N1NCkqdmFsX3R3LmgKLSAgICBTTUxBV1QgIHI2LCByNiwgcjgsIHI1ICAgICAgICAgICAgIC8vIGFjY3UzID0gKC1hY2N1NCkqdmFsX3R3LmwtKC1hY2N1MykqdmFsX3R3LmgKLSAgICBTTUxBV1QgIHI3LCByNywgcjgsIHI0ICAgICAgICAgICAgIC8vIGFjY3U0ID0gKC1hY2N1MykqdmFsX3R3LmwrKC1hY2N1NCkqdmFsX3R3LmgKLSAgICBTVFIgICAgIHI2LCBbcjMsICMtNF0gISAgICAgICAgICAgIC8vICotLXBEYXRfMSA9IGFjY3UzCi0gICAgU1RSICAgICByNywgW3IzLCAjLTRdICEgICAgICAgICAgICAvLyAqLS1wRGF0XzEgPSBhY2N1NAorICAgICAgTERSIHI4LAorICAgICAgW3IxXSwKKyMgNCAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrCisgICAgICBMRFIgcjUsCisgICAgICBbcjJdICAvLyBhY2N1MiA9IHBEYXRfMFswXQorICAgICAgTERSIHI2LAorICAgICAgWyByMiwgIzQgXSAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KKyAgICAgIFJTQiByNSwKKyAgICAgIHI1LAorIyAwIC8vIGFjY3UyID0gLWFjY3UyCisgICAgICBTTVVMV1QgcjksIHI1LAorICAgICAgcjggIC8vIGFjY3VYID0gKC1hY2N1MikqdmFsX3R3LmwKKyAgICAgICAgICBMRFIgcjQsCisgICAgICBbIHIzLCAjIC0gNCBdICAvLyBhY2N1MSA9IHBEYXRfMVstMV0KKyAgICAgIFJTQiByOSwKKyAgICAgIHI5LAorIyAwIC8vIGFjY3VYID0gLSgtYWNjdTIpKnZhbF90dy5sCisgICAgICBTTUxBV0IgcjksIHI0LCByOCwKKyAgICAgIHI5ICAvLyBhY2N1WCA9IGFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCisgICAgICAgICAgU01VTFdUIHI0LAorICAgICAgcjQsCisgICAgICByOCAgLy8gYWNjdTEgPSBhY2N1MSp2YWxfdHcubAorICAgICAgICAgIExEUiByNywKKyAgICAgIFsgcjMsICMgLSA4IF0gIC8vIGFjY3U0ID0gcERhdF8xWy0yXQorICAgICAgU01MQVdCIHI1LAorICAgICAgcjUsIHI4LAorICAgICAgcjQgIC8vIGFjY3UyID0gKC1hY2N1MikqdmFsX3R3LnQrYWNjdTEqdmFsX3R3LmwKKyAgICAgICAgICBMRFIgcjgsCisgICAgICBbcjFdLAorIyA0IC8vIHZhbF90dyA9ICp0d2lkZGxlKysKKyAgICAgIFNUUiByNSwgW3IyXSwKKyMgNCAvLyAqcERhdF8wKysgPSBhY2N1MgorICAgICAgU1RSIHI5LCBbcjJdLAorIyA0IC8vICpwRGF0XzArKyA9IGFjY3UxIChhY2N1WCkKKyAgICAgIFJTQiByNywgcjcsCisjIDAgLy8gYWNjdTQgPSAtYWNjdTQKKyAgICAgIFNNVUxXQiByNSwgcjcsCisgICAgICByOCAgLy8gYWNjdTIgPSAoLWFjY3U0KSp2YWxfdHcuaAorICAgICAgICAgIFNNVUxXQiByNCwKKyAgICAgIHI2LAorICAgICAgcjggIC8vIGFjY3UxID0gKC1hY2N1NCkqdmFsX3R3LmwKKyAgICAgICAgICBSU0IgcjUsCisgICAgICByNSwKKyMgMCAvLyBhY2N1MiA9IC0oLWFjY3U0KSp2YWxfdHcuaAorICAgICAgU01MQVdUIHI2LCByNiwgcjgsCisgICAgICByNSAgLy8gYWNjdTMgPSAoLWFjY3U0KSp2YWxfdHcubC0oLWFjY3UzKSp2YWxfdHcuaAorICAgICAgICAgIFNNTEFXVCByNywKKyAgICAgIHI3LCByOCwKKyAgICAgIHI0ICAvLyBhY2N1NCA9ICgtYWNjdTMpKnZhbF90dy5sKygtYWNjdTQpKnZhbF90dy5oCisgICAgICAgICAgU1RSIHI2LAorICAgICAgWyByMywgIyAtIDQgXSAhICAvLyAqLS1wRGF0XzEgPSBhY2N1MworICAgICAgU1RSIHI3LAorICAgICAgWyByMywgIyAtIDQgXSAhICAvLyAqLS1wRGF0XzEgPSBhY2N1NAogCi0gICAgU1VCUyAgICByMCwgcjAsICM0ICAgICAgICAgICAgICAgICAvLyBpLT0gNAotICAgIEJORSAgICAgZHN0X0lWX2xvb3AxCisgICAgICBTVUJTIHIwLAorICAgICAgcjAsCisjIDQgLy8gaS09IDQKKyAgICAgIEJORSBkc3RfSVZfbG9vcDEKIAotICAgIFBPUCAgICAge3I0LXI5fQotICAgIEJYICAgICAgbHIKKyAgICAgICAgICBQT1B7cjQgLSByOX0gQlggbHIKIH0KICNlbmRpZiAvKiBGVU5DVElPTl9kc3RfSVZfZnVuYzEgKi8KIAogI2lmZGVmIEZVTkNUSU9OX2RzdF9JVl9mdW5jMgogCi1GREtfSU5MSU5FCiAvKiBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpICovCi1zdGF0aWMgdm9pZCBkc3RfSVZfZnVuYzIoCi0gICAgaW50IGksCi0gICAgY29uc3QgRklYUF9TUEsgKnR3aWRkbGUsCi0gICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMCwKLSAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8xLAotICAgIGludCBpbmMpCi17Ci0gIEZJWFBfREJMIGFjY3UxLGFjY3UyLGFjY3UzLGFjY3U0Oworc3RhdGljIGlubGluZSB2b2lkIGRzdF9JVl9mdW5jMihpbnQgaSwgY29uc3QgRklYUF9TUEsgKnR3aWRkbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzEsIGludCBpbmMpIHsKKyAgRklYUF9EQkwgYWNjdTEsIGFjY3UyLCBhY2N1MywgYWNjdTQ7CiAgIExPTkcgdmFsX3R3OwogCiAgIGFjY3U0ID0gcERhdF8wWzBdOwpAQCAtMzcxLDc2ICs0ODksNzQgQEAKICAgKnBEYXRfMCsrID0gYWNjdTM7CiAgICpwRGF0XzEtLSA9IGFjY3U0OwogCi0KLSAgX19hc20KLSAgeworICBfX2FzbSB7CiAgICAgQiAgICAgICBkc3RfSVZfbG9vcDJfMm5kX3BhcnQKIAotICAgIC8qIDUwIGN5Y2xlcyBmb3IgMiBpdGVyYXRpb25zID0gMjUgY3ljbGVzL2l0ZXJhdGlvbiAqLworICAgICAgICAvKiA1MCBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDI1IGN5Y2xlcy9pdGVyYXRpb24gKi8KIAogZHN0X0lWX2xvb3AyOgogCi0gICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCisgICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgIC8vIHZhbF90dyA9ICp0d2lkZGxlOyB0d2lkZGxlICs9IGluYwogCi0gICAgUlNCICAgICBhY2N1MiwgYWNjdTIsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAtYWNjdTIKLSAgICBSU0IgICAgIGFjY3UxLCBhY2N1MSwgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MSA9IC1hY2N1MQotICAgIFNNVUxXVCAgYWNjdTMsIGFjY3UyLCB2YWxfdHcgICAgICAgICAgICAgIC8vIGFjY3UzID0gKC1hY2N1MikqdmFsX3R3LmwKLSAgICBTTVVMV1QgIGFjY3U0LCBhY2N1MSwgdmFsX3R3ICAgICAgICAgICAgICAvLyBhY2N1NCA9ICgtYWNjdTEpKnZhbF90dy5sCi0gICAgUlNCICAgICBhY2N1MywgYWNjdTMsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTMgPSAtYWNjdTIqdmFsX3R3LmwKLSAgICBTTUxBV0IgIGFjY3UxLCBhY2N1MSwgdmFsX3R3LCBhY2N1MyAgICAgICAvLyBhY2N1MSA9IC1hY2N1MSp2YWxfdHcuaC0oLWFjY3UyKSp2YWxfdHcubAotICAgIFNNTEFXQiAgYWNjdTIsIGFjY3UyLCB2YWxfdHcsIGFjY3U0ICAgICAgIC8vIGFjY3UyID0gKC1hY2N1MSkqdmFsX3R3LmwrKC1hY2N1MikqdmFsX3R3LmgKLSAgICBTVFIgICAgIGFjY3UxLCBbcERhdF8xXSwgIy00ICAgICAgICAgICAgICAvLyAqcERhdF8xLS0gPSBhY2N1MQotICAJU1RSICAgICBhY2N1MiwgW3BEYXRfMF0sICM0ICAgICAgICAgICAgICAgLy8gKnBEYXRfMCsrID0gYWNjdTIKKyAgICBSU0IgICAgIGFjY3UyLCBhY2N1MiwgIzAgIC8vIGFjY3UyID0gLWFjY3UyCisgICAgUlNCICAgICBhY2N1MSwgYWNjdTEsICMwICAvLyBhY2N1MSA9IC1hY2N1MQorICAgIFNNVUxXVCAgYWNjdTMsIGFjY3UyLCB2YWxfdHcgIC8vIGFjY3UzID0gKC1hY2N1MikqdmFsX3R3LmwKKyAgICBTTVVMV1QgIGFjY3U0LCBhY2N1MSwgdmFsX3R3ICAvLyBhY2N1NCA9ICgtYWNjdTEpKnZhbF90dy5sCisgICAgUlNCICAgICBhY2N1MywgYWNjdTMsICMwICAvLyBhY2N1MyA9IC1hY2N1Mip2YWxfdHcubAorICAgIFNNTEFXQiAgYWNjdTEsIGFjY3UxLCB2YWxfdHcsIGFjY3UzICAvLyBhY2N1MSA9IC1hY2N1MSp2YWxfdHcuaC0oLWFjY3UyKSp2YWxfdHcubAorICAgIFNNTEFXQiAgYWNjdTIsIGFjY3UyLCB2YWxfdHcsIGFjY3U0ICAvLyBhY2N1MiA9ICgtYWNjdTEpKnZhbF90dy5sKygtYWNjdTIpKnZhbF90dy5oCisgICAgU1RSICAgICBhY2N1MSwgW3BEYXRfMV0sICMtNCAgLy8gKnBEYXRfMS0tID0gYWNjdTEKKyAgICBTVFIgICAgIGFjY3UyLCBbcERhdF8wXSwgIzQgIC8vICpwRGF0XzArKyA9IGFjY3UyCiAKLSAgCUxEUiAgICAgYWNjdTQsIFtwRGF0XzBdICAgICAgICAgICAgICAgICAgIC8vIGFjY3U0ID0gcERhdF8wWzBdCi0gIAlMRFIgICAgIGFjY3UzLCBbcERhdF8wLCAjNF0gICAgICAgICAgICAgICAvLyBhY2N1MyA9IHBEYXRfMFsxXQorICAgIExEUiAgICAgYWNjdTQsIFtwRGF0XzBdICAvLyBhY2N1NCA9IHBEYXRfMFswXQorICAgIExEUiAgICAgYWNjdTMsIFtwRGF0XzAsICM0XSAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KIAotICAgIFJTQiAgICAgYWNjdTQsIGFjY3U0LCAjMCAgICAgICAgICAgICAgICAgIC8vIGFjY3U0ID0gLWFjY3U0Ci0gICAgUlNCICAgICBhY2N1MywgYWNjdTMsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTMgPSAtYWNjdTMKKyAgICBSU0IgICAgIGFjY3U0LCBhY2N1NCwgIzAgIC8vIGFjY3U0ID0gLWFjY3U0CisgICAgUlNCICAgICBhY2N1MywgYWNjdTMsICMwICAvLyBhY2N1MyA9IC1hY2N1MwogCi0gICAgU01VTFdCICBhY2N1MSwgYWNjdTMsIHZhbF90dyAgICAgICAgICAgICAgLy8gYWNjdTEgPSAoLWFjY3UzKSp2YWxfdHcuaAotICAgIFNNVUxXVCAgYWNjdTIsIGFjY3UzLCB2YWxfdHcgICAgICAgICAgICAgIC8vIGFjY3UyID0gKC1hY2N1MykqdmFsX3R3LmwKLSAgICBSU0IgICAgIGFjY3UxLCBhY2N1MSwgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MSA9IC0oLWFjY3UzKSp2YWxfdHcuaAotICAgIFNNTEFXVCAgYWNjdTMsIGFjY3U0LCB2YWxfdHcsIGFjY3UxICAgICAgIC8vIGFjY3UzID0gKC1hY2N1NCkqdmFsX3R3LmwtKC1hY2N1MykqdmFsX3R3LmgKLSAgICBTTUxBV0IgIGFjY3U0LCBhY2N1NCwgdmFsX3R3LCBhY2N1MiAgICAgICAvLyBhY2N1NCA9ICgtYWNjdTMpKnZhbF90dy5sKygtYWNjdTQpKnZhbF90dy5oCisgICAgU01VTFdCICBhY2N1MSwgYWNjdTMsIHZhbF90dyAgLy8gYWNjdTEgPSAoLWFjY3UzKSp2YWxfdHcuaAorICAgIFNNVUxXVCAgYWNjdTIsIGFjY3UzLCB2YWxfdHcgIC8vIGFjY3UyID0gKC1hY2N1MykqdmFsX3R3LmwKKyAgICBSU0IgICAgIGFjY3UxLCBhY2N1MSwgIzAgIC8vIGFjY3UxID0gLSgtYWNjdTMpKnZhbF90dy5oCisgICAgU01MQVdUICBhY2N1MywgYWNjdTQsIHZhbF90dywgYWNjdTEgIC8vIGFjY3UzID0gKC1hY2N1NCkqdmFsX3R3LmwtKC1hY2N1MykqdmFsX3R3LmgKKyAgICBTTUxBV0IgIGFjY3U0LCBhY2N1NCwgdmFsX3R3LCBhY2N1MiAgLy8gYWNjdTQgPSAoLWFjY3UzKSp2YWxfdHcubCsoLWFjY3U0KSp2YWxfdHcuaAogCi0gICAgTERSICAgICBhY2N1MSwgW3BEYXRfMSwgIy00XSAgICAgICAgICAgICAgLy8gYWNjdTEgPSBwRGF0XzFbLTFdCi0gICAgTERSICAgICBhY2N1MiwgW3BEYXRfMV0gICAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSBwRGF0XzFbMF0KKyAgICBMRFIgICAgIGFjY3UxLCBbcERhdF8xLCAjLTRdICAvLyBhY2N1MSA9IHBEYXRfMVstMV0KKyAgICBMRFIgICAgIGFjY3UyLCBbcERhdF8xXSAgLy8gYWNjdTIgPSBwRGF0XzFbMF0KIAotICAgIFNUUiAgICAgYWNjdTMsIFtwRGF0XzBdLCAjNCAgICAgICAgICAgICAgIC8vICpwRGF0XzArKyA9IGFjY3UzCi0gICAgU1RSICAgICBhY2N1NCwgW3BEYXRfMV0sICMtNCAgICAgICAgICAgICAgLy8gKnBEYXRfMS0tID0gYWNjdTQKKyAgICBTVFIgICAgIGFjY3UzLCBbcERhdF8wXSwgIzQgIC8vICpwRGF0XzArKyA9IGFjY3UzCisgICAgU1RSICAgICBhY2N1NCwgW3BEYXRfMV0sICMtNCAgLy8gKnBEYXRfMS0tID0gYWNjdTQKIAogZHN0X0lWX2xvb3AyXzJuZF9wYXJ0OgogCi0gICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCisgICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgIC8vIHZhbF90dyA9ICp0d2lkZGxlOyB0d2lkZGxlICs9IGluYwogCi0gICAgUlNCICAgICBhY2N1MiwgYWNjdTIsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAtYWNjdTIKLSAgICBSU0IgICAgIGFjY3UxLCBhY2N1MSwgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MSA9IC1hY2N1MQotICAgIFNNVUxXVCAgYWNjdTMsIGFjY3UyLCB2YWxfdHcgICAgICAgICAgICAgIC8vIGFjY3UzID0gKC1hY2N1MikqdmFsX3R3LmwKLSAgICBTTVVMV1QgIGFjY3U0LCBhY2N1MSwgdmFsX3R3ICAgICAgICAgICAgICAvLyBhY2N1NCA9ICgtYWNjdTEpKnZhbF90dy5sCi0gICAgUlNCICAgICBhY2N1MywgYWNjdTMsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTMgPSAtYWNjdTIqdmFsX3R3LmwKLSAgICBTTUxBV0IgIGFjY3UxLCBhY2N1MSwgdmFsX3R3LCBhY2N1MyAgICAgICAvLyBhY2N1MSA9IC1hY2N1MSp2YWxfdHcuaC0oLWFjY3UyKSp2YWxfdHcubAotICAgIFNNTEFXQiAgYWNjdTIsIGFjY3UyLCB2YWxfdHcsIGFjY3U0ICAgICAgIC8vIGFjY3UyID0gKC1hY2N1MSkqdmFsX3R3LmwrKC1hY2N1MikqdmFsX3R3LmgKLSAgICBTVFIgICAgIGFjY3UxLCBbcERhdF8xXSwgIy00ICAgICAgICAgICAgICAvLyAqcERhdF8xLS0gPSBhY2N1MQotICAJU1RSICAgICBhY2N1MiwgW3BEYXRfMF0sICM0ICAgICAgICAgICAgICAgLy8gKnBEYXRfMCsrID0gYWNjdTIKKyAgICBSU0IgICAgIGFjY3UyLCBhY2N1MiwgIzAgIC8vIGFjY3UyID0gLWFjY3UyCisgICAgUlNCICAgICBhY2N1MSwgYWNjdTEsICMwICAvLyBhY2N1MSA9IC1hY2N1MQorICAgIFNNVUxXVCAgYWNjdTMsIGFjY3UyLCB2YWxfdHcgIC8vIGFjY3UzID0gKC1hY2N1MikqdmFsX3R3LmwKKyAgICBTTVVMV1QgIGFjY3U0LCBhY2N1MSwgdmFsX3R3ICAvLyBhY2N1NCA9ICgtYWNjdTEpKnZhbF90dy5sCisgICAgUlNCICAgICBhY2N1MywgYWNjdTMsICMwICAvLyBhY2N1MyA9IC1hY2N1Mip2YWxfdHcubAorICAgIFNNTEFXQiAgYWNjdTEsIGFjY3UxLCB2YWxfdHcsIGFjY3UzICAvLyBhY2N1MSA9IC1hY2N1MSp2YWxfdHcuaC0oLWFjY3UyKSp2YWxfdHcubAorICAgIFNNTEFXQiAgYWNjdTIsIGFjY3UyLCB2YWxfdHcsIGFjY3U0ICAvLyBhY2N1MiA9ICgtYWNjdTEpKnZhbF90dy5sKygtYWNjdTIpKnZhbF90dy5oCisgICAgU1RSICAgICBhY2N1MSwgW3BEYXRfMV0sICMtNCAgLy8gKnBEYXRfMS0tID0gYWNjdTEKKyAgICBTVFIgICAgIGFjY3UyLCBbcERhdF8wXSwgIzQgIC8vICpwRGF0XzArKyA9IGFjY3UyCiAKLSAgCUxEUiAgICAgYWNjdTQsIFtwRGF0XzBdICAgICAgICAgICAgICAgICAgIC8vIGFjY3U0ID0gcERhdF8wWzBdCi0gIAlMRFIgICAgIGFjY3UzLCBbcERhdF8wLCAjNF0gICAgICAgICAgICAgICAvLyBhY2N1MyA9IHBEYXRfMFsxXQorICAgIExEUiAgICAgYWNjdTQsIFtwRGF0XzBdICAvLyBhY2N1NCA9IHBEYXRfMFswXQorICAgIExEUiAgICAgYWNjdTMsIFtwRGF0XzAsICM0XSAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KIAotICAgIFJTQiAgICAgYWNjdTQsIGFjY3U0LCAjMCAgICAgICAgICAgICAgICAgIC8vIGFjY3U0ID0gLWFjY3U0Ci0gICAgUlNCICAgICBhY2N1MywgYWNjdTMsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTMgPSAtYWNjdTMKKyAgICBSU0IgICAgIGFjY3U0LCBhY2N1NCwgIzAgIC8vIGFjY3U0ID0gLWFjY3U0CisgICAgUlNCICAgICBhY2N1MywgYWNjdTMsICMwICAvLyBhY2N1MyA9IC1hY2N1MwogCi0gICAgU01VTFdCICBhY2N1MSwgYWNjdTMsIHZhbF90dyAgICAgICAgICAgICAgLy8gYWNjdTEgPSAoLWFjY3UzKSp2YWxfdHcuaAotICAgIFNNVUxXVCAgYWNjdTIsIGFjY3UzLCB2YWxfdHcgICAgICAgICAgICAgIC8vIGFjY3UyID0gKC1hY2N1MykqdmFsX3R3LmwKLSAgICBSU0IgICAgIGFjY3UxLCBhY2N1MSwgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MSA9IC0oLWFjY3UzKSp2YWxfdHcuaAotICAgIFNNTEFXVCAgYWNjdTMsIGFjY3U0LCB2YWxfdHcsIGFjY3UxICAgICAgIC8vIGFjY3UzID0gKC1hY2N1NCkqdmFsX3R3LmwtKC1hY2N1MykqdmFsX3R3LmgKLSAgICBTTUxBV0IgIGFjY3U0LCBhY2N1NCwgdmFsX3R3LCBhY2N1MiAgICAgICAvLyBhY2N1NCA9ICgtYWNjdTMpKnZhbF90dy5sKygtYWNjdTQpKnZhbF90dy5oCisgICAgU01VTFdCICBhY2N1MSwgYWNjdTMsIHZhbF90dyAgLy8gYWNjdTEgPSAoLWFjY3UzKSp2YWxfdHcuaAorICAgIFNNVUxXVCAgYWNjdTIsIGFjY3UzLCB2YWxfdHcgIC8vIGFjY3UyID0gKC1hY2N1MykqdmFsX3R3LmwKKyAgICBSU0IgICAgIGFjY3UxLCBhY2N1MSwgIzAgIC8vIGFjY3UxID0gLSgtYWNjdTMpKnZhbF90dy5oCisgICAgU01MQVdUICBhY2N1MywgYWNjdTQsIHZhbF90dywgYWNjdTEgIC8vIGFjY3UzID0gKC1hY2N1NCkqdmFsX3R3LmwtKC1hY2N1MykqdmFsX3R3LmgKKyAgICBTTUxBV0IgIGFjY3U0LCBhY2N1NCwgdmFsX3R3LCBhY2N1MiAgLy8gYWNjdTQgPSAoLWFjY3UzKSp2YWxfdHcubCsoLWFjY3U0KSp2YWxfdHcuaAogCi0gICAgTERSICAgICBhY2N1MSwgW3BEYXRfMSwgIy00XSAgICAgICAgICAgICAgLy8gYWNjdTEgPSBwRGF0XzFbLTFdCi0gICAgTERSICAgICBhY2N1MiwgW3BEYXRfMV0gICAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSBwRGF0XzFbMF0KKyAgICBMRFIgICAgIGFjY3UxLCBbcERhdF8xLCAjLTRdICAvLyBhY2N1MSA9IHBEYXRfMVstMV0KKyAgICBMRFIgICAgIGFjY3UyLCBbcERhdF8xXSAgLy8gYWNjdTIgPSBwRGF0XzFbMF0KIAotICAgIFNUUiAgICAgYWNjdTMsIFtwRGF0XzBdLCAjNCAgICAgICAgICAgICAgIC8vICpwRGF0XzArKyA9IGFjY3UzCi0gICAgU1RSICAgICBhY2N1NCwgW3BEYXRfMV0sICMtNCAgICAgICAgICAgICAgLy8gKnBEYXRfMS0tID0gYWNjdTQKKyAgICBTVFIgICAgIGFjY3UzLCBbcERhdF8wXSwgIzQgIC8vICpwRGF0XzArKyA9IGFjY3UzCisgICAgU1RSICAgICBhY2N1NCwgW3BEYXRfMV0sICMtNCAgLy8gKnBEYXRfMS0tID0gYWNjdTQKIAogICAgIFNVQlMgICAgaSwgaSwgIzEKICAgICBCTkUgICAgIGRzdF9JVl9sb29wMgpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9hcm0vZmZ0X3JhZDJfYXJtLmNwcCBiL2xpYkZESy9zcmMvYXJtL2ZmdF9yYWQyX2FybS5jcHAKaW5kZXggYTZlMmU0Mi4uMmMwM2IxMSAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9hcm0vZmZ0X3JhZDJfYXJtLmNwcAorKysgYi9saWJGREsvc3JjL2FybS9mZnRfcmFkMl9hcm0uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIzOSArOTAsMjI4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiBkaXRfZmZ0IEFSTSBhc3NlbWJsZXIgcmVwbGFjZW1lbnRzLgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBORU9OIG9wdGltaXplZCBGRlQgY3VycmVudGx5IGJ1aWxkcyBvbmx5IHdpdGggUlZDVCB0b29sY2hhaW4gKi8KKyNpZm5kZWYgX19GRlRfUkFEMl9DUFBfXworI2Vycm9yIFwKKyAgICAiRG8gbm90IGNvbXBpbGUgdGhpcyBmaWxlIHNlcGFyYXRlbHkuIEl0IGlzIGluY2x1ZGVkIG9uIGRlbWFuZCBmcm9tIGZmdF9yYWQyLmNwcCIKKyNlbmRpZgogCiAjaWZuZGVmIEZVTkNUSU9OX2RpdF9mZnQKLQotLyogSWYgZGl0X2ZmdCB3YXMgbm90IHlldCBkZWZpbmVkIGJ5IEFSTS1Db3J0ZXggLi4uICovCi0KICNpZiBkZWZpbmVkKFNJTkVUQUJMRV8xNkJJVCkKIAogI2RlZmluZSBGVU5DVElPTl9kaXRfZmZ0Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBkYXRlOiAgIDI4LjA3LjIwMDUgICBzcmwKLQotICAgQ29udGVudHMvZGVzY3JpcHRpb246IGRpdC10dWtleS1GRlQtYWxnb3JpdGhtCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogI2lmIGRlZmluZWQoRlVOQ1RJT05fZGl0X2ZmdCkKIAordm9pZCBkaXRfZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsCisgICAgICAgICAgICAgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSkgeworICBjb25zdCBJTlQgbiA9IDEgPDwgbGRuOworICBJTlQgaTsKIAotdm9pZCBkaXRfZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsIGNvbnN0IElOVCB0cmlnRGF0YVNpemUpCi17Ci0gICAgY29uc3QgSU5UIG49MTw8bGRuOwotICAgIElOVCBpOworICBzY3JhbWJsZSh4LCBuKTsKKyAgLyoKKyAgICogMSsyIHN0YWdlIHJhZGl4IDQKKyAgICovCiAKLSAgICBzY3JhbWJsZSh4LG4pOwotICAgIC8qCi0gICAgICogMSsyIHN0YWdlIHJhZGl4IDQKLSAgICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IG4gKiAyOyBpICs9IDgpIHsKKyAgICBGSVhQX0RCTCBhMDAsIGExMCwgYTIwLCBhMzA7CisgICAgYTAwID0gKHhbaSArIDBdICsgeFtpICsgMl0pID4+IDE7IC8qIFJlIEEgKyBSZSBCICovCisgICAgYTEwID0gKHhbaSArIDRdICsgeFtpICsgNl0pID4+IDE7IC8qIFJlIEMgKyBSZSBEICovCisgICAgYTIwID0gKHhbaSArIDFdICsgeFtpICsgM10pID4+IDE7IC8qIEltIEEgKyBJbSBCICovCisgICAgYTMwID0gKHhbaSArIDVdICsgeFtpICsgN10pID4+IDE7IC8qIEltIEMgKyBJbSBEICovCiAKLSAgICBmb3IgKGk9MDtpPG4qMjtpKz04KQorICAgIHhbaSArIDBdID0gYTAwICsgYTEwOyAvKiBSZSBBJyA9IFJlIEEgKyBSZSBCICsgUmUgQyArIFJlIEQgKi8KKyAgICB4W2kgKyA0XSA9IGEwMCAtIGExMDsgLyogUmUgQycgPSBSZSBBICsgUmUgQiAtIFJlIEMgLSBSZSBEICovCisgICAgeFtpICsgMV0gPSBhMjAgKyBhMzA7IC8qIEltIEEnID0gSW0gQSArIEltIEIgKyBJbSBDICsgSW0gRCAqLworICAgIHhbaSArIDVdID0gYTIwIC0gYTMwOyAvKiBJbSBDJyA9IEltIEEgKyBJbSBCIC0gSW0gQyAtIEltIEQgKi8KKworICAgIGEwMCA9IGEwMCAtIHhbaSArIDJdOyAvKiBSZSBBIC0gUmUgQiAqLworICAgIGExMCA9IGExMCAtIHhbaSArIDZdOyAvKiBSZSBDIC0gUmUgRCAqLworICAgIGEyMCA9IGEyMCAtIHhbaSArIDNdOyAvKiBJbSBBIC0gSW0gQiAqLworICAgIGEzMCA9IGEzMCAtIHhbaSArIDddOyAvKiBJbSBDIC0gSW0gRCAqLworCisgICAgeFtpICsgMl0gPSBhMDAgKyBhMzA7IC8qIFJlIEInID0gUmUgQSAtIFJlIEIgKyBJbSBDIC0gSW0gRCAqLworICAgIHhbaSArIDZdID0gYTAwIC0gYTMwOyAvKiBSZSBEJyA9IFJlIEEgLSBSZSBCIC0gSW0gQyArIEltIEQgKi8KKyAgICB4W2kgKyAzXSA9IGEyMCAtIGExMDsgLyogSW0gQicgPSBJbSBBIC0gSW0gQiAtIFJlIEMgKyBSZSBEICovCisgICAgeFtpICsgN10gPSBhMjAgKyBhMTA7IC8qIEltIEQnID0gSW0gQSAtIEltIEIgKyBSZSBDIC0gUmUgRCAqLworICB9CisKKyAgSU5UIG1oID0gMSA8PCAxOworICBJTlQgbGRtID0gbGRuIC0gMjsKKyAgSU5UIHRyaWdzdGVwID0gdHJpZ0RhdGFTaXplOworCisgIGRvIHsKKyAgICBjb25zdCBGSVhQX1NUUCAqcFRyaWdEYXRhID0gdHJpZ2RhdGE7CisgICAgSU5UIGo7CisKKyAgICBtaCA8PD0gMTsKKyAgICB0cmlnc3RlcCA+Pj0gMTsKKworICAgIEZES19BU1NFUlQodHJpZ3N0ZXAgPiAwKTsKKworICAgIC8qIERvIGZpcnN0IGl0ZXJhdGlvbiB3aXRoIGM9MS4wIGFuZCBzPTAuMCBzZXBhcmF0ZWx5IHRvIGF2b2lkIGxvb3NpbmcgdG8KKyAgICAgICBtdWNoIHByZWNpc2lvbi4gQmV3YXJlOiBUaGUgaW1wYWN0IG9uIHRoZSBvdmVyYWwgRkZUIHByZWNpc2lvbiBpcyByYXRoZXIKKyAgICAgICBsYXJnZS4gKi8KICAgICB7Ci0gICAgICBGSVhQX0RCTCBhMDAsIGExMCwgYTIwLCBhMzA7Ci0gICAgICBhMDAgPSAoeFtpICsgMF0gKyB4W2kgKyAyXSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwotICAgICAgYTEwID0gKHhbaSArIDRdICsgeFtpICsgNl0pPj4xOyAgLyogUmUgQyArIFJlIEQgKi8KLSAgICAgIGEyMCA9ICh4W2kgKyAxXSArIHhbaSArIDNdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCi0gICAgICBhMzAgPSAoeFtpICsgNV0gKyB4W2kgKyA3XSk+PjE7ICAvKiBJbSBDICsgSW0gRCAqLworICAgICAgRklYUF9EQkwgKnh0MSA9IHg7CisgICAgICBpbnQgciA9IG47CiAKLSAgICAgIHhbaSArIDBdID0gYTAwICsgYTEwOyAgICAgICAvKiBSZSBBJyA9IFJlIEEgKyBSZSBCICsgUmUgQyArIFJlIEQgKi8KLSAgICAgIHhbaSArIDRdID0gYTAwIC0gYTEwOyAgICAgICAvKiBSZSBDJyA9IFJlIEEgKyBSZSBCIC0gUmUgQyAtIFJlIEQgKi8KLSAgICAgIHhbaSArIDFdID0gYTIwICsgYTMwOyAgICAgICAvKiBJbSBBJyA9IEltIEEgKyBJbSBCICsgSW0gQyArIEltIEQgKi8KLSAgICAgIHhbaSArIDVdID0gYTIwIC0gYTMwOyAgICAgICAvKiBJbSBDJyA9IEltIEEgKyBJbSBCIC0gSW0gQyAtIEltIEQgKi8KKyAgICAgIGRvIHsKKyAgICAgICAgRklYUF9EQkwgKnh0MiA9IHh0MSArIChtaCA8PCAxKTsKKyAgICAgICAgLyoKKyAgICAgICAgRklYUF9EQkwgKnh0MSA9IHgrICgocik8PDEpOworICAgICAgICBGSVhQX0RCTCAqeHQyID0geHQxICsgKG1oPDwxKTsKKyAgICAgICAgKi8KKyAgICAgICAgRklYUF9EQkwgdnIsIHZpLCB1ciwgdWk7CiAKLSAgICAgIGEwMCA9IGEwMCAtIHhbaSArIDJdOyAgICAgICAvKiBSZSBBIC0gUmUgQiAqLwotICAgICAgYTEwID0gYTEwIC0geFtpICsgNl07ICAgICAgIC8qIFJlIEMgLSBSZSBEICovCi0gICAgICBhMjAgPSBhMjAgLSB4W2kgKyAzXTsgICAgICAgLyogSW0gQSAtIEltIEIgKi8KLSAgICAgIGEzMCA9IGEzMCAtIHhbaSArIDddOyAgICAgICAvKiBJbSBDIC0gSW0gRCAqLworICAgICAgICAvLyBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDIrMV0sIHhbdDJdLCAoRklYUF9TR0wpMS4wLCAoRklYUF9TR0wpMC4wKTsKKyAgICAgICAgdmkgPSB4dDJbMV0gPj4gMTsKKyAgICAgICAgdnIgPSB4dDJbMF0gPj4gMTsKIAotICAgICAgeFtpICsgMl0gPSBhMDAgKyBhMzA7ICAgICAgIC8qIFJlIEInID0gUmUgQSAtIFJlIEIgKyBJbSBDIC0gSW0gRCAqLwotICAgICAgeFtpICsgNl0gPSBhMDAgLSBhMzA7ICAgICAgIC8qIFJlIEQnID0gUmUgQSAtIFJlIEIgLSBJbSBDICsgSW0gRCAqLwotICAgICAgeFtpICsgM10gPSBhMjAgLSBhMTA7ICAgICAgIC8qIEltIEInID0gSW0gQSAtIEltIEIgLSBSZSBDICsgUmUgRCAqLwotICAgICAgeFtpICsgN10gPSBhMjAgKyBhMTA7ICAgICAgIC8qIEltIEQnID0gSW0gQSAtIEltIEIgKyBSZSBDIC0gUmUgRCAqLworICAgICAgICB1ciA9IHh0MVswXSA+PiAxOworICAgICAgICB1aSA9IHh0MVsxXSA+PiAxOworCisgICAgICAgIHh0MVswXSA9IHVyICsgdnI7CisgICAgICAgIHh0MVsxXSA9IHVpICsgdmk7CisKKyAgICAgICAgeHQyWzBdID0gdXIgLSB2cjsKKyAgICAgICAgeHQyWzFdID0gdWkgLSB2aTsKKworICAgICAgICB4dDEgKz0gbWg7CisgICAgICAgIHh0MiArPSBtaDsKKworICAgICAgICAvLyBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDIrMV0sIHhbdDJdLCAoRklYUF9TR0wpMS4wLCAoRklYUF9TR0wpMC4wKTsKKyAgICAgICAgdnIgPSB4dDJbMV0gPj4gMTsKKyAgICAgICAgdmkgPSB4dDJbMF0gPj4gMTsKKworICAgICAgICB1ciA9IHh0MVswXSA+PiAxOworICAgICAgICB1aSA9IHh0MVsxXSA+PiAxOworCisgICAgICAgIHh0MVswXSA9IHVyICsgdnI7CisgICAgICAgIHh0MVsxXSA9IHVpIC0gdmk7CisKKyAgICAgICAgeHQyWzBdID0gdXIgLSB2cjsKKyAgICAgICAgeHQyWzFdID0gdWkgKyB2aTsKKworICAgICAgICB4dDEgPSB4dDIgKyBtaDsKKyAgICAgIH0gd2hpbGUgKChyID0gciAtIChtaCA8PCAxKSkgIT0gMCk7CiAgICAgfQorICAgIGZvciAoaiA9IDQ7IGogPCBtaDsgaiArPSA0KSB7CisgICAgICBGSVhQX0RCTCAqeHQxID0geCArIChqID4+IDEpOworICAgICAgRklYUF9TUEsgY3M7CisgICAgICBpbnQgciA9IG47CiAKLSAgICBJTlQgbWggPSAxIDw8IDE7Ci0gICAgSU5UIGxkbSA9IGxkbiAtIDI7Ci0gICAgSU5UIHRyaWdzdGVwID0gdHJpZ0RhdGFTaXplOworICAgICAgcFRyaWdEYXRhICs9IHRyaWdzdGVwOworICAgICAgY3MgPSAqcFRyaWdEYXRhOwogCi0gICAgZG8KKyAgICAgIGRvIHsKKyAgICAgICAgRklYUF9EQkwgKnh0MiA9IHh0MSArIChtaCA8PCAxKTsKKyAgICAgICAgRklYUF9EQkwgdnIsIHZpLCB1ciwgdWk7CisKKyAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4dDJbMV0sIHh0MlswXSwgY3MpOworCisgICAgICAgIHVyID0geHQxWzBdID4+IDE7CisgICAgICAgIHVpID0geHQxWzFdID4+IDE7CisKKyAgICAgICAgeHQxWzBdID0gdXIgKyB2cjsKKyAgICAgICAgeHQxWzFdID0gdWkgKyB2aTsKKworICAgICAgICB4dDJbMF0gPSB1ciAtIHZyOworICAgICAgICB4dDJbMV0gPSB1aSAtIHZpOworCisgICAgICAgIHh0MSArPSBtaDsKKyAgICAgICAgeHQyICs9IG1oOworCisgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeHQyWzFdLCB4dDJbMF0sIGNzKTsKKworICAgICAgICB1ciA9IHh0MVswXSA+PiAxOworICAgICAgICB1aSA9IHh0MVsxXSA+PiAxOworCisgICAgICAgIHh0MVswXSA9IHVyICsgdnI7CisgICAgICAgIHh0MVsxXSA9IHVpIC0gdmk7CisKKyAgICAgICAgeHQyWzBdID0gdXIgLSB2cjsKKyAgICAgICAgeHQyWzFdID0gdWkgKyB2aTsKKworICAgICAgICAvKiBTYW1lIGFzIGFib3ZlIGJ1dCBmb3IgdDEsdDIgd2l0aCBqPm1oLzQgYW5kIHRodXMgY3Mgc3dhcHBlZCAqLworICAgICAgICB4dDEgPSB4dDEgLSAoaik7CisgICAgICAgIHh0MiA9IHh0MSArIChtaCA8PCAxKTsKKworICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHh0MlswXSwgeHQyWzFdLCBjcyk7CisKKyAgICAgICAgdXIgPSB4dDFbMF0gPj4gMTsKKyAgICAgICAgdWkgPSB4dDFbMV0gPj4gMTsKKworICAgICAgICB4dDFbMF0gPSB1ciArIHZyOworICAgICAgICB4dDFbMV0gPSB1aSAtIHZpOworCisgICAgICAgIHh0MlswXSA9IHVyIC0gdnI7CisgICAgICAgIHh0MlsxXSA9IHVpICsgdmk7CisKKyAgICAgICAgeHQxICs9IG1oOworICAgICAgICB4dDIgKz0gbWg7CisKKyAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4dDJbMF0sIHh0MlsxXSwgY3MpOworCisgICAgICAgIHVyID0geHQxWzBdID4+IDE7CisgICAgICAgIHVpID0geHQxWzFdID4+IDE7CisKKyAgICAgICAgeHQxWzBdID0gdXIgLSB2cjsKKyAgICAgICAgeHQxWzFdID0gdWkgLSB2aTsKKworICAgICAgICB4dDJbMF0gPSB1ciArIHZyOworICAgICAgICB4dDJbMV0gPSB1aSArIHZpOworCisgICAgICAgIHh0MSA9IHh0MiArIChqKTsKKyAgICAgIH0gd2hpbGUgKChyID0gciAtIChtaCA8PCAxKSkgIT0gMCk7CisgICAgfQogICAgIHsKLSAgICAgICAgY29uc3QgRklYUF9TVFAgKnBUcmlnRGF0YSA9IHRyaWdkYXRhOwotICAgICAgICBJTlQgajsKKyAgICAgIEZJWFBfREJMICp4dDEgPSB4ICsgKG1oID4+IDEpOworICAgICAgaW50IHIgPSBuOwogCi0gICAgICAgIG1oIDw8PSAxOwotICAgICAgICB0cmlnc3RlcCA+Pj0gMTsKKyAgICAgIGRvIHsKKyAgICAgICAgRklYUF9EQkwgKnh0MiA9IHh0MSArIChtaCA8PCAxKTsKKyAgICAgICAgRklYUF9EQkwgdnIsIHZpLCB1ciwgdWk7CiAKLSAgICAgICAgRkRLX0FTU0VSVCh0cmlnc3RlcCA+IDApOworICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHh0MlsxXSwgeHQyWzBdLCBTVEMoMHg1YTgyNzk5YSksCisgICAgICAgICAgICAgICAgICAgICBTVEMoMHg1YTgyNzk5YSkpOwogCi0gICAgICAgIC8qIERvIGZpcnN0IGl0ZXJhdGlvbiB3aXRoIGM9MS4wIGFuZCBzPTAuMCBzZXBhcmF0ZWx5IHRvIGF2b2lkIGxvb3NpbmcgdG8gbXVjaCBwcmVjaXNpb24uCi0gICAgICAgICAgIEJld2FyZTogVGhlIGltcGFjdCBvbiB0aGUgb3ZlcmFsIEZGVCBwcmVjaXNpb24gaXMgcmF0aGVyIGxhcmdlLiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBGSVhQX0RCTCAqeHQxID0geDsKLSAgICAgICAgICAgIGludCByID0gbjsKKyAgICAgICAgdXIgPSB4dDFbMF0gPj4gMTsKKyAgICAgICAgdWkgPSB4dDFbMV0gPj4gMTsKIAotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIEZJWFBfREJMICp4dDIgPSB4dDEgKyAobWg8PDEpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgRklYUF9EQkwgKnh0MSA9IHgrICgocik8PDEpOwotICAgICAgICAgICAgICAgIEZJWFBfREJMICp4dDIgPSB4dDEgKyAobWg8PDEpOwotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7ICAgICAgICAgICAgICAgICAKKyAgICAgICAgeHQxWzBdID0gdXIgKyB2cjsKKyAgICAgICAgeHQxWzFdID0gdWkgKyB2aTsKIAotICAgICAgICAgICAgICAgIC8vY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyKzFdLCB4W3QyXSwgKEZJWFBfU0dMKTEuMCwgKEZJWFBfU0dMKTAuMCk7Ci0gICAgICAgICAgICAgICAgdmkgPSB4dDJbMV0+PjE7Ci0gICAgICAgICAgICAgICAgdnIgPSB4dDJbMF0+PjE7CisgICAgICAgIHh0MlswXSA9IHVyIC0gdnI7CisgICAgICAgIHh0MlsxXSA9IHVpIC0gdmk7CiAKLSAgICAgICAgICAgICAgICB1ciA9IHh0MVswXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHh0MVsxXT4+MTsKKyAgICAgICAgeHQxICs9IG1oOworICAgICAgICB4dDIgKz0gbWg7CiAKLSAgICAgICAgICAgICAgICB4dDFbMF0gPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4dDFbMV0gPSB1aSt2aTsKKyAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4dDJbMV0sIHh0MlswXSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgICAgICAgICAgICAgICAgICAgU1RDKDB4NWE4Mjc5OWEpKTsKIAotICAgICAgICAgICAgICAgIHh0MlswXSA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHh0MlsxXSA9IHVpLXZpOworICAgICAgICB1ciA9IHh0MVswXSA+PiAxOworICAgICAgICB1aSA9IHh0MVsxXSA+PiAxOwogCi0gICAgICAgICAgICAgICAgeHQxICs9IG1oOwotICAgICAgICAgICAgICAgIHh0MiArPSBtaDsKKyAgICAgICAgeHQxWzBdID0gdXIgKyB2cjsKKyAgICAgICAgeHQxWzFdID0gdWkgLSB2aTsKIAotICAgICAgICAgICAgICAgIC8vY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyKzFdLCB4W3QyXSwgKEZJWFBfU0dMKTEuMCwgKEZJWFBfU0dMKTAuMCk7Ci0gICAgICAgICAgICAgICAgdnIgPSB4dDJbMV0+PjE7Ci0gICAgICAgICAgICAgICAgdmkgPSB4dDJbMF0+PjE7CisgICAgICAgIHh0MlswXSA9IHVyIC0gdnI7CisgICAgICAgIHh0MlsxXSA9IHVpICsgdmk7CiAKLSAgICAgICAgICAgICAgICB1ciA9IHh0MVswXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHh0MVsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHh0MVswXSA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHh0MVsxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgeHQyWzBdID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeHQyWzFdID0gdWkrdmk7Ci0KLSAgICAgICAgICAgICAgICB4dDEgPSB4dDIgKyBtaDsKLSAgICAgICAgICAgIH0gd2hpbGUgKChyPXItKG1oPDwxKSkgIT0gMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGo9NDsgajxtaDsgais9NCkKLSAgICAgICAgewotICAgICAgICAgICAgRklYUF9EQkwgKnh0MSA9IHggKyAoaj4+MSk7Ci0gICAgICAgICAgICBGSVhQX1NQSyBjczsKLSAgICAgICAgICAgIGludCByID0gbjsKLQotICAgICAgICAgICAgcFRyaWdEYXRhICs9IHRyaWdzdGVwOwotICAgICAgICAgICAgY3MgPSAqcFRyaWdEYXRhOwotCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZJWFBfREJMICp4dDIgPSB4dDEgKyAobWg8PDEpOwotICAgICAgICAgICAgICAgIEZJWFBfREJMIHZyLHZpLHVyLHVpOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4dDJbMV0sIHh0MlswXSwgY3MpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4dDFbMF0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4dDFbMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4dDFbMF0gPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4dDFbMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIHh0MlswXSA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHh0MlsxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgeHQxICs9IG1oOwotICAgICAgICAgICAgICAgIHh0MiArPSBtaDsKLQotICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeHQyWzFdLCB4dDJbMF0sIGNzKTsKLQotICAgICAgICAgICAgICAgIHVyID0geHQxWzBdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geHQxWzFdPj4xOwotCi0gICAgICAgICAgICAgICAgeHQxWzBdID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeHQxWzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB4dDJbMF0gPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4dDJbMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIC8qIFNhbWUgYXMgYWJvdmUgYnV0IGZvciB0MSx0MiB3aXRoIGo+bWgvNCBhbmQgdGh1cyBjcyBzd2FwcGVkICovCi0gICAgICAgICAgICAgICAgeHQxID0geHQxIC0gKGopOwotICAgICAgICAgICAgICAgIHh0MiA9IHh0MSArIChtaDw8MSk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHh0MlswXSwgeHQyWzFdLCBjcyk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHh0MVswXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHh0MVsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHh0MVswXSA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHh0MVsxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgeHQyWzBdID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeHQyWzFdID0gdWkrdmk7Ci0KLSAgICAgICAgICAgICAgICB4dDEgKz0gbWg7Ci0gICAgICAgICAgICAgICAgeHQyICs9IG1oOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4dDJbMF0sIHh0MlsxXSwgY3MpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4dDFbMF0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4dDFbMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4dDFbMF0gPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4dDFbMV0gPSB1aS12aTsKLQotICAgICAgICAgICAgICAgIHh0MlswXSA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHh0MlsxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgeHQxID0geHQyICsgKGopOwotICAgICAgICAgICAgfSAgd2hpbGUgKChyPXItKG1oPDwxKSkgIT0gMCk7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgRklYUF9EQkwgKnh0MSA9IHggKyAobWg+PjEpOwotICAgICAgICAgICAgaW50IHIgPSBuOwotCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZJWFBfREJMICp4dDIgPSB4dDEgKyAobWg8PDEpOwotICAgICAgICAgICAgICAgIEZJWFBfREJMIHZyLHZpLHVyLHVpOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4dDJbMV0sIHh0MlswXSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1YTgyNzk5YSkpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4dDFbMF0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4dDFbMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4dDFbMF0gPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4dDFbMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIHh0MlswXSA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHh0MlsxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgeHQxICs9IG1oOwotICAgICAgICAgICAgICAgIHh0MiArPSBtaDsKLQotICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeHQyWzFdLCB4dDJbMF0sIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NWE4Mjc5OWEpKTsKLQotICAgICAgICAgICAgICAgIHVyID0geHQxWzBdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geHQxWzFdPj4xOwotCi0gICAgICAgICAgICAgICAgeHQxWzBdID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeHQxWzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB4dDJbMF0gPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4dDJbMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIHh0MSA9IHh0MiArIG1oOwotICAgICAgICAgICAgfSAgd2hpbGUgKChyPXItKG1oPDwxKSkgIT0gMCk7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlICgtLWxkbSAhPSAwKTsKKyAgICAgICAgeHQxID0geHQyICsgbWg7CisgICAgICB9IHdoaWxlICgociA9IHIgLSAobWggPDwgMSkpICE9IDApOworICAgIH0KKyAgfSB3aGlsZSAoLS1sZG0gIT0gMCk7CiB9CiAKICNlbmRpZiAvKiBpZiBkZWZpbmVkKEZVTkNUSU9OX2RpdF9mZnQpICAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9hcm0vcW1mX2FybS5jcHAgYi9saWJGREsvc3JjL2FybS9xbWZfYXJtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlZWJmYi4uMDAwMDAwMAotLS0gYS9saWJGREsvc3JjL2FybS9xbWZfYXJtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2NiArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIChRTUZfTk9fUE9MWT09NSkKLQotI2RlZmluZSBGVU5DVElPTl9xbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZAotCi0jaWZkZWYgRlVOQ1RJT05fcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQKLXN0YXRpYyB2b2lkCi1xbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZCggSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBBbmFseXNpcyBCYW5rICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUU1GICp0aW1lSW4sICAgICAgICAvKiE8IFRpbWUgU2lnbmFsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKnJTdWJiYW5kICkgICAgICAgICAgIC8qITwgUmVhbCBPdXRwdXQgKi8KLXsKLSAgaW50IGk7Ci0gIGludCBMID0gYW5hUW1mLT5ub19jaGFubmVsczsKLSAgaW50IE0gPSBMPj4xOwotICBpbnQgc2hpZnQgPSAoYW5hUW1mLT5ub19jaGFubmVscz4+NikgKyAxOwotICBpbnQgclN1YmJhbmRfZSA9IDA7Ci0KLSAgRklYUF9RTUYgKnJTdWJiYW5kUHRyMCA9ICZyU3ViYmFuZFtNKzBdOyAgICAgICAgICAgICAgICAvKiBydW5zIHdpdGggaW5jcmVtZW50ICovCi0gIEZJWFBfUU1GICpyU3ViYmFuZFB0cjEgPSAmclN1YmJhbmRbTS0xXTsgICAgICAgICAgICAgICAgLyogcnVucyB3aXRoIGRlY3JlbWVudCAqLwotICBGSVhQX1FNRiAqdGltZUluMCA9IChGSVhQX0RCTCAqKSAmdGltZUluWzBdOyAgICAgICAgICAgIC8qIHJ1bnMgd2l0aCBpbmNyZW1lbnQgKi8KLSAgRklYUF9RTUYgKnRpbWVJbjEgPSAoRklYUF9EQkwgKikgJnRpbWVJbltMXTsgICAgICAgICAgICAvKiBydW5zIHdpdGggaW5jcmVtZW50ICovCi0gIEZJWFBfUU1GICp0aW1lSW4yID0gKEZJWFBfREJMICopICZ0aW1lSW5bTC0xXTsgICAgICAgICAgLyogcnVucyB3aXRoIGRlY3JlbWVudCAqLwotICBGSVhQX1FNRiAqdGltZUluMyA9IChGSVhQX0RCTCAqKSAmdGltZUluWzIqTC0xXTsgICAgICAgIC8qIHJ1bnMgd2l0aCBkZWNyZW1lbnQgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKQotICB7Ci0gICAgKnJTdWJiYW5kUHRyMCsrID0gKCp0aW1lSW4yLS0gPj4gMSkgLSAoKnRpbWVJbjArKyA+PiBzaGlmdCk7Ci0gICAgKnJTdWJiYW5kUHRyMS0tID0gKCp0aW1lSW4xKysgPj4gMSkgKyAoKnRpbWVJbjMtLSA+PiBzaGlmdCk7Ci0gIH0KLQotICBkY3RfSVYoclN1YmJhbmQsTCwgJnJTdWJiYW5kX2UpOwotfQotI2VuZGlmIC8qIEZVTkNUSU9OX3FtZkZvcndhcmRNb2R1bGF0aW9uTFBfb2RkICovCi0KLQotLyogTkVPTiBvcHRpbWl6ZWQgUU1GIGN1cnJlbnRseSBidWlsdHMgb25seSB3aXRoIFJWQ1QgdG9vbGNoYWluICovCi0KLSNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pCi0KLSNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCi0jZGVmaW5lIEZVTkNUSU9OX3FtZkFuYVByb3RvdHlwZUZpclNsb3QKLSNlbmRpZgotCi0jaWZkZWYgRlVOQ1RJT05fcW1mQW5hUHJvdG90eXBlRmlyU2xvdAotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotCi1pbmxpbmUgSU5UIFNNVUxCQiAoY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKQotewotICBJTlQgcmVzdWx0IDsKLSAgX19hc21fXyAoInNtdWxiYiAlMCwgJTEsICUyIgotICAgICA6ICI9ciIgKHJlc3VsdCkKLSAgICAgOiAiciIgKGEpLCAiciIgKGIpKSA7Ci0gIHJldHVybiByZXN1bHQgOwotfQotaW5saW5lIElOVCBTTVVMQlQgKGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKLXsKLSAgSU5UIHJlc3VsdCA7Ci0gIF9fYXNtX18gKCJzbXVsYnQgJTAsICUxLCAlMiIKLSAgICAgOiAiPXIiIChyZXN1bHQpCi0gICAgIDogInIiIChhKSwgInIiIChiKSkgOwotICByZXR1cm4gcmVzdWx0IDsKLX0KLQotaW5saW5lIElOVCBTTUxBQkIoY29uc3QgTE9ORyBhY2N1LCBjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpCi17Ci0gIElOVCByZXN1bHQgOwotICBfX2FzbV9fICgic21sYWJiICUwLCAlMSwgJTIsJTMiCi0gICAgIDogIj1yIiAocmVzdWx0KQotICAgICA6ICJyIiAoYSksICJyIiAoYiksICJyIiAoYWNjdSkpIDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLWlubGluZSBJTlQgU01MQUJUKGNvbnN0IExPTkcgYWNjdSwgY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKQotewotICBJTlQgcmVzdWx0IDsKLSAgX19hc21fXyAoInNtbGFidCAlMCwgJTEsICUyLCUzIgotICAgICA6ICI9ciIgKHJlc3VsdCkKLSAgICAgOiAiciIgKGEpLCAiciIgKGIpLCAiciIgKGFjY3UpKSA7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0jZW5kaWYgLyogY29tcGlsZXIgc2VsZWN0aW9uICAqLwotCi0KLXZvaWQgcW1mQW5hUHJvdG90eXBlRmlyU2xvdCggRklYUF9RTUYgKmFuYWx5c2lzQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9fY2hhbm5lbHMsICAgICAgICAgICAgIC8qITwgTnVtYmVyIGNoYW5uZWxzIG9mIGFuYWx5c2lzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1BGVCAqcF9maWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBwX3N0cmlkZSwgICAgICAgICAgICAgICAgLyohPCBTdGlkZSBvZiBhbmFseXNpcyBmaWx0ZXIgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RQVMgKlJFU1RSSUNUIHBGaWx0ZXJTdGF0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIExPTkcgKnBfZmx0ID0gKExPTkcgKikgcF9maWx0ZXI7Ci0gIExPTkcgZmx0OwotICBGSVhQX1FNRiAqUkVTVFJJQ1QgcERhdGFfMCA9IGFuYWx5c2lzQnVmZmVyICsgMipub19jaGFubmVscyAtIDE7Ci0gIEZJWFBfUU1GICpSRVNUUklDVCBwRGF0YV8xID0gYW5hbHlzaXNCdWZmZXI7Ci0KLSAgRklYUF9RQVMgKlJFU1RSSUNUIHN0YV8wID0gKEZJWFBfUUFTICopcEZpbHRlclN0YXRlczsKLSAgRklYUF9RQVMgKlJFU1RSSUNUIHN0YV8xID0gKEZJWFBfUUFTICopcEZpbHRlclN0YXRlcyArICgyKlFNRl9OT19QT0xZKm5vX2NoYW5uZWxzKSAtIDE7Ci0KLSAgRklYUF9EQkwgYWNjdTAsIGFjY3UxOwotICBGSVhQX1FBUyBzdGEwLCBzdGExOwotCi0gIGludCBzdGFTdGVwMSA9ICBub19jaGFubmVsczw8MTsKLSAgaW50IHN0YVN0ZXAyID0gKG5vX2NoYW5uZWxzPDwzKSAtIDE7IC8qIFJld2luZCBvbmUgbGVzcyAqLwotCi0gIGlmIChwX3N0cmlkZSA9PSAxKQotICB7Ci0gICAgLyogRklSIGZpbHRlciAwICovCi0gICAgZmx0ID0gKnBfZmx0Kys7Ci0gICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UxID0gU01VTEJCKCAgICAgICAgc3RhMSwgZmx0KTsKLSAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgZmx0ID0gKnBfZmx0Kys7Ci0gICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKLSAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgZmx0ID0gKnBfZmx0Kys7Ci0gICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xICs9IHN0YVN0ZXAyOwotICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKLSAgICAqcERhdGFfMSsrID0gRlhfREJMMkZYX1FNRihhY2N1MTw8MSk7Ci0KLSAgICAvKiBGSVIgZmlsdGVycyAxLi42MyAxMjcuLjY1IG9yIDEuLjMxIDYzLi4zMyAqLwotICAgIG5vX2NoYW5uZWxzID4+PSAxOwotICAgIGZvciAoOyAtLW5vX2NoYW5uZWxzOyApCi0gICAgewotICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7ICAvKiAxLDMsNSwgLi4uIDI5LzYxICovCi0gICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UwID0gU01VTEJUKCAgICAgICAgc3RhMCwgZmx0KTsKLSAgICAgIGFjY3UxID0gU01VTEJUKCAgICAgICAgc3RhMSwgZmx0KTsKLQotICAgICAgZmx0ID0gKnBfZmx0Kys7Ci0gICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgICBmbHQgPSAqcF9mbHQrKzsKLSAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wIC09IHN0YVN0ZXAyOwotICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgKz0gc3RhU3RlcDI7Ci0gICAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICAgICpwRGF0YV8wLS0gPSBGWF9EQkwyRlhfUU1GKGFjY3UwPDwxKTsKLSAgICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKLQotICAgICAgLyogU2FtZSBzZXF1ZW5jZSBhcyBhYm92ZSwgYnV0IG1peCBCPWJvdHRvbSB3aXRoIFQ9VG9wICovCi0KLSAgICAgIGZsdCA9ICpwX2ZsdCsrOwotICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7ICAvKiAyLDQsNiwgLi4uIDMwLzYyICovCi0gICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UwID0gU01VTEJCKCAgICAgICAgc3RhMCwgZmx0KTsKLSAgICAgIGFjY3UxID0gU01VTEJCKCAgICAgICAgc3RhMSwgZmx0KTsKLQotICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgICAgZmx0ID0gKnBfZmx0Kys7Ci0gICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgICBmbHQgPSAqcF9mbHQrKzsKLSAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wIC09IHN0YVN0ZXAyOwotICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgKz0gc3RhU3RlcDI7Ci0gICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICAgICpwRGF0YV8wLS0gPSBGWF9EQkwyRlhfUU1GKGFjY3UwPDwxKTsKLSAgICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKLSAgICB9Ci0KLSAgICAvKiBGSVIgZmlsdGVyIDMxLzYzIGFuZCAzMy82NSAqLwotICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UwID0gU01VTEJUKCAgICAgICAgc3RhMCwgZmx0KTsKLSAgICBhY2N1MSA9IFNNVUxCVCggICAgICAgIHN0YTEsIGZsdCk7Ci0KLSAgICBmbHQgPSAqcF9mbHQrKzsKLSAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgIGZsdCA9ICpwX2ZsdCsrOwotICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCAtPSBzdGFTdGVwMjsKLSAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKLSAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgKnBEYXRhXzAtLSA9IEZYX0RCTDJGWF9RTUYoYWNjdTA8PDEpOwotICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKLQotICAgIC8qIEZJUiBmaWx0ZXIgMzIvNjQgKi8KLSAgICBmbHQgPSAqcF9mbHQrKzsKLSAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1MCA9IFNNVUxCQiggICAgICAgIHN0YTAsIGZsdCk7Ci0gICAgYWNjdTEgPSBTTVVMQkIoICAgICAgICBzdGExLCBmbHQpOwotCi0gICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgIGZsdCA9ICpwX2ZsdCsrOwotICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgZmx0ID0gKnBfZmx0OwotICAgIHN0YTAgPSAqc3RhXzA7Ci0gICAgc3RhMSA9ICpzdGFfMTsKLSAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgKnBEYXRhXzAtLSA9IEZYX0RCTDJGWF9RTUYoYWNjdTA8PDEpOwotICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBpbnQgcGZsdFN0ZXAgPSBRTUZfTk9fUE9MWSAqIChwX3N0cmlkZS0xKTsKLQotICAgIGZsdCA9IHBfZmx0WzBdOwotICAgIHN0YTEgPSAqc3RhXzE7ICBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1MSA9IFNNVUxCQiggICAgICAgIHN0YTEsIGZsdCk7Ci0gICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgIGZsdCA9IHBfZmx0WzFdOwotICAgIHN0YTEgPSAqc3RhXzE7ICBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7Ci0gICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgIGZsdCA9IHBfZmx0WzJdOyBwX2ZsdCArPSBwZmx0U3RlcDsKLSAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgKz0gc3RhU3RlcDI7Ci0gICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwotICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKLQotICAgIC8qIEZJUiBmaWx0ZXJzIDEuLjYzIDEyNy4uNjUgb3IgMS4uMzEgNjMuLjMzICovCi0gICAgZm9yICg7IC0tbm9fY2hhbm5lbHM7ICkKLSAgICB7Ci0gICAgICBmbHQgPSBwX2ZsdFswXTsKLSAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgICBhY2N1MCA9IFNNVUxCQiggICAgICAgIHN0YTAsIGZsdCk7Ci0gICAgICBhY2N1MSA9IFNNVUxCQiggICAgICAgIHN0YTEsIGZsdCk7Ci0KLSAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICAgIGZsdCA9IHBfZmx0WzFdOwotICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgICAgZmx0ID0gcF9mbHRbMl07IHBfZmx0ICs9IHBmbHRTdGVwOwotICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgLT0gc3RhU3RlcDI7Ci0gICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKLSAgICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgICAgKnBEYXRhXzAtLSA9IEZYX0RCTDJGWF9RTUYoYWNjdTA8PDEpOwotICAgICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwotICAgIH0KLQotICAgIC8qIEZJUiBmaWx0ZXIgMzIvNjQgKi8KLSAgICBmbHQgPSBwX2ZsdFswXTsKLSAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICBhY2N1MCA9IFNNVUxCQiggICAgICAgIHN0YTAsIGZsdCk7Ci0gICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwotCi0gICAgZmx0ID0gcF9mbHRbMV07Ci0gICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKLQotICAgIGZsdCA9IHBfZmx0WzJdOwotICAgIHN0YTAgPSAqc3RhXzA7Ci0gICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgICpwRGF0YV8wLS0gPSBGWF9EQkwyRlhfUU1GKGFjY3UwPDwxKTsKLSAgfQotfQotI2VuZGlmIC8qIEZVTkNUSU9OX3FtZkFuYVByb3RvdHlwZUZpclNsb3QgKi8KLSNlbmRpZiAvKiAjaWYgZGVmaW5lZChfX0NDX0FSTSkgJiYgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykgKi8KLQotI2lmICggZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKSAmJiAoU0FNUExFX0JJVFMgPT0gMTYpICkgJiYgIWRlZmluZWQoUU1GX1RBQkxFX0ZVTEwpCi0KLSNkZWZpbmUgRlVOQ1RJT05fcW1mU3luUHJvdG90eXBlRmlyU2xvdAotCi0jaWYgZGVmaW5lZChGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90KQotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotCi1pbmxpbmUgSU5UIFNNVUxXQiAoY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpCi17Ci0gIElOVCByZXN1bHQgOwotICBfX2FzbV9fICgic211bHdiICUwLCAlMSwgJTIiCi0gICAgOiAiPXIiIChyZXN1bHQpCi0gICAgOiAiciIgKGEpLCAiciIgKGIpKSA7Ci0KLSAgcmV0dXJuIHJlc3VsdCA7Ci19Ci1pbmxpbmUgSU5UIFNNVUxXVCAoY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpCi17Ci0gIElOVCByZXN1bHQgOwotICBfX2FzbV9fICgic211bHd0ICUwLCAlMSwgJTIiCi0gICAgOiAiPXIiIChyZXN1bHQpCi0gICAgOiAiciIgKGEpLCAiciIgKGIpKSA7Ci0KLSAgcmV0dXJuIHJlc3VsdCA7Ci19Ci0KLWlubGluZSBJTlQgU01MQVdCKGNvbnN0IExPTkcgYWNjdSwgY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpCi17Ci0gIElOVCByZXN1bHQ7Ci0gIGFzbSgic21sYXdiICUwLCAlMSwgJTIsICUzICIKLSAgICAgICAgOiAiPXIiIChyZXN1bHQpCi0gICAgICAgIDogInIiIChhKSwgInIiIChiKSwgInIiIChhY2N1KSApOwotICByZXR1cm4gcmVzdWx0IDsKLX0KLQotaW5saW5lIElOVCBTTUxBV1QoY29uc3QgTE9ORyBhY2N1LCBjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikKLXsKLSAgSU5UIHJlc3VsdDsKLSAgYXNtKCJzbWxhd3QgJTAsICUxLCAlMiwgJTMgIgotICAgICAgICA6ICI9ciIgKHJlc3VsdCkKLSAgICAgICAgOiAiciIgKGEpLCAiciIgKGIpLCAiciIgKGFjY3UpICk7Ci0gIHJldHVybiByZXN1bHQgOwotfQotCi0jZW5kaWYgLyogQVJNIGNvbXBpbGVyIHNlbGVjdG9yICovCi0KLQotc3RhdGljIHZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdDFfZmlsdGVyKEZJWFBfUU1GICpSRVNUUklDVCByZWFsU2xvdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKlJFU1RSSUNUIGltYWdTbG90LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgcF9mbHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUVNTICpSRVNUUklDVCBzdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBNeVRpbWVPdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jaGFubmVscykKLXsKLSAgLyogVGhpcyBjb2RlIHdhcyB0aGUgYmFzZSBmb3IgdGhlIGFib3ZlIGxpc3RlZCBhc3NlbWJsZXIgc2VxdWVuY2UgKi8KLSAgLyogSXQgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlIG9yIGZ1cnRoZXIgb3B0aW1pemF0aW9ucyAgKi8KLSAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHBfZmx0bSA9IHBfZmx0ICsgMTU1OwotCi0gIGRvCi0gIHsKLSAgICAgRklYUF9EQkwgcmVzdWx0OwotICAgICBGSVhQX0RCTCBBLCBCLCByZWFsLCBpbWFnLCBzdGEwOwotCi0gICAgIHJlYWwgPSAqLS1yZWFsU2xvdDsKLSAgICAgaW1hZyA9ICotLWltYWdTbG90OwotICAgICBCID0gcF9mbHRbNF07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVs4XSBUb3A9WzldICAgICAqLwotICAgICBBID0gcF9mbHRtWzNdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVszMTZdIFRvcD1bMzE3XSAqLwotICAgICBzdGEwID0gc3RhWzBdOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSBzdGF0ZVswXSAgICAgICAgICAqLwotICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9OS4uLi4uLi4uLi4uMzE5ICAqLwotICAgICBzdGFbMF0gPSBTTUxBV0IoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9MzE2Li4uLi4uLi4uLi42ICAqLwotICAgICBzdGFbMF0gPSBTTUxBV0IoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9OCwxOCwgICAgLi4uMzE4ICAqLwotICAgICBCID0gcF9mbHRbM107ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVs2XSBUb3A9WzddICAgICAqLwotICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9MzE3Li4uLi4uLi4uLi43ICAqLwotICAgICBBID0gcF9mbHRtWzRdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVszMThdIFRvcD1bMzE5XSAqLwotICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9Ny4uLi4uLi4uLi4uMzE3ICAqLwotICAgICBzdGFbMF0gPSBTTUxBV0IoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9MzE4Li4uLi4uLi4uLi44ICAqLwotICAgICBzdGFbMF0gPSBTTUxBV0IoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9Ni4uLi4uLi4uLi4uMzE2ICAqLwotICAgICBCID0gcF9mbHRbMl07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVtYXSBUb3A9WzVdICAgICAqLwotICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9OS4uLi4uLi4uLi4uMzE5ICAqLwotICAgICBBID0gcF9mbHRtWzJdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVtYXSBUb3A9WzMxNV0gICAqLwotICAgICBzdGFbMF0gPSAgICAgICAgIFNNVUxXVCggaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9NSwxNSwgLi4uICAgMzE1ICAqLwotICAgICByZXN1bHQgPSBTTUxBV1QoIHN0YTAsICAgcmVhbCwgQSApOyAgLyogaW5kZXg9MzE1Li4uLi4uLi4uLi41ICAqLwotCi0gICAgIHBNeVRpbWVPdXRbMF0gPSByZXN1bHQ7IHBNeVRpbWVPdXQrKzsKLQotICAgICByZWFsID0gKi0tcmVhbFNsb3Q7Ci0gICAgIGltYWcgPSAqLS1pbWFnU2xvdDsKLSAgICAgQSA9IHBfZmx0bVswXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzEwXSBUb3A9WzMxMV0gKi8KLSAgICAgQiA9IHBfZmx0WzddOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMTRdICBUb3A9WzE1XSAgKi8KLSAgICAgcmVzdWx0ID0gU01MQVdCKCBzdGFbMF0sIHJlYWwsIEEgKTsgIC8qIGluZGV4PTMxMC4uLi4uLi4uLi4uMCAgKi8KLSAgICAgc3RhWzBdID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTE0Li4uLi4uLi4uLjMyNCAgKi8KLSAgICAgcE15VGltZU91dFswXSA9IHJlc3VsdDsgcE15VGltZU91dCsrOwotICAgICBCID0gcF9mbHRbNl07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVsxMl0gIFRvcD1bMTNdICAqLwotICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9MzExLi4uLi4uLi4uLi4xICAqLwotICAgICBBID0gcF9mbHRtWzFdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVszMTJdIFRvcD1bMzEzXSAqLwotICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9MTMuLi4uLi4uLi4uMzIzICAqLwotICAgICBzdGFbMF0gPSBTTUxBV0IoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9MzEyLi4uLi4uLi4uLi4yICAqLwotICAgICBzdGFbMF0gPSBTTUxBV0IoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9MTIuLi4uLi4uLi4uMzIyICAqLwotICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9MzEzLi4uLi4uLi4uLi4zICAqLwotICAgICBBID0gcF9mbHRtWzJdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVszMTRdIFRvcD1bMzE1XSAqLwotICAgICBCID0gcF9mbHRbNV07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVsxMF0gIFRvcD1bMTFdICAqLwotICAgICBzdGFbMF0gPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9MTEuLi4uLi4uLi4uMzIxICAqLwotICAgICBzdGFbMF0gPSBTTUxBV0IoIHN0YVsxXSwgcmVhbCwgQSApOyBzdGErKzsgLyogaW5kZXg9MzE0Li4uLi4uLi4uLi40ICAqLwotICAgICBzdGFbMF0gPSAgICAgICAgIFNNVUxXQiggaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9MTAuLi4uLi4uLi4uMzIwICAqLwotCi0KLSAgICAgcF9mbHQgICAgKz0gNTsKLSAgICAgcF9mbHRtICAgLT0gNTsKLSAgfSAKLSAgd2hpbGUgKCgtLW5vX2NoYW5uZWxzKSAhPSAwKTsKLQotfQotCi0KLQotSU5UIHFtZlN5blByb3RvdHlwZUZpclNsb3QyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKlJFU1RSSUNUIHJlYWxTbG90LCAgICAgICAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCBpbWFnU2xvdCwgICAgICAgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAqUkVTVFJJQ1QgdGltZU91dCwgICAgICAgICAgICAgLyohPCBUaW1lIGRvbWFpbiBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICBzdHJpZGUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWUgb3V0cHV0IGJ1ZmZlciBzdHJpZGUgZmFjdG9yKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIEZJWFBfUVNTICpSRVNUUklDVCBzdGEgPSAoRklYUF9RU1MqKXFtZi0+RmlsdGVyU3RhdGVzOwotICBpbnQgbm9fY2hhbm5lbHMgPSBxbWYtPm5vX2NoYW5uZWxzOwotICBpbnQgc2NhbGUgPSAoKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTKS0xLXFtZi0+b3V0U2NhbGVmYWN0b3IpOwotCi0gIC8qIFdlIG1hcCBhbiBhcnJ5IG9mIDE2LWJpdCB2YWx1ZXMgdXBvbiBhbiBhcnJheSBvZiAyKjE2LWJpdCB2YWx1ZXMgdG8gcmVhZCAyIHZhbHVlcyBpbiBvbmUgc2hvdCAqLwotICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgcF9mbHQgID0gKEZJWFBfREJMICopIHFtZi0+cF9maWx0ZXI7ICAgICAgICAgICAvKiBsb3c9WzBdLCAgIGhpZ2g9WzFdICAgKi8KLSAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHBfZmx0bSA9IChGSVhQX0RCTCAqKSBxbWYtPnBfZmlsdGVyICsgMTU1OyAgICAgLyogbG93PVszMTBdLCBoaWdoPVszMTFdICovCi0KLSAgRkRLX0FTU0VSVChTQU1QTEVfQklUUy0xLXFtZi0+b3V0U2NhbGVmYWN0b3IgPj0gMCk7IC8vICAgKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTKS0xLXFtZi0+b3V0U2NhbGVmYWN0b3IgPj0gMCk7Ci0gIEZES19BU1NFUlQocW1mLT5wX3N0cmlkZT09MiAmJiBxbWYtPm5vX2NoYW5uZWxzID09IDMyKTsKLQotICBGREtfQVNTRVJUKChub19jaGFubmVscyYzKSA9PSAwKTsgIC8qIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDQgKi8KLQotICByZWFsU2xvdCArPSBub19jaGFubmVscy0xOyAgICAvLyB+fiJ+fgotICBpbWFnU2xvdCArPSBub19jaGFubmVscy0xOyAgICAvLyBub19jaGFubmVscy0xIC4uIDAKLQotICBGSVhQX0RCTCBNeVRpbWVPdXRbMzJdOwotICBGSVhQX0RCTCAqcE15VGltZU91dCA9ICZNeVRpbWVPdXRbMF07Ci0KLSAgZm9yIChub19jaGFubmVscyA9IG5vX2NoYW5uZWxzOyBub19jaGFubmVscy0tOykKLSAgewotICAgICBGSVhQX0RCTCByZXN1bHQ7Ci0gICAgIEZJWFBfREJMIEEsIEIsIHJlYWwsIGltYWc7Ci0KLSAgICAgcmVhbCA9ICpyZWFsU2xvdC0tOwotICAgICBpbWFnID0gKmltYWdTbG90LS07Ci0gICAgIEEgPSBwX2ZsdG1bMF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxMF0gVG9wPVszMTFdICovCi0gICAgIEIgPSBwX2ZsdFs3XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzE0XSAgVG9wPVsxNV0gICovCi0gICAgIHJlc3VsdCA9IFNNTEFXQiggc3RhWzBdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTAuLi4uLi4uLi4uLjAgICovCi0gICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xNC4uLi4uLi4uLi4zMjQgICovCi0gICAgIEIgPSBwX2ZsdFs2XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzEyXSAgVG9wPVsxM10gICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTEuLi4uLi4uLi4uLjEgICovCi0gICAgIEEgPSBwX2ZsdG1bMV07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxMl0gVG9wPVszMTNdICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xMy4uLi4uLi4uLi4zMjMgICovCi0gICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTIuLi4uLi4uLi4uLjIgICovCi0gICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xMi4uLi4uLi4uLi4zMjIgICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTMuLi4uLi4uLi4uLjMgICovCi0gICAgIEEgPSBwX2ZsdG1bMl07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxNF0gVG9wPVszMTVdICovCi0gICAgIEIgPSBwX2ZsdFs1XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzEwXSAgVG9wPVsxMV0gICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xMS4uLi4uLi4uLi4zMjEgICovCi0gICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTQuLi4uLi4uLi4uLjQgICovCi0gICAgIHN0YVswXSA9ICAgICAgICAgU01VTFdCKCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xMC4uLi4uLi4uLi4zMjAgICovCi0KLSAgICAgcE15VGltZU91dFswXSA9IHJlc3VsdDsgcE15VGltZU91dCsrOwotCi0gICAgIHBfZmx0bSAgIC09IDU7Ci0gICAgIHBfZmx0ICAgICs9IDU7Ci0gIH0KLQotICBwTXlUaW1lT3V0ID0gJk15VGltZU91dFswXTsKLSNpZiAoU0FNUExFX0JJVFMgPT0gMTYpICAgICAgCi0gIGNvbnN0IEZJWFBfREJMIG1heF9wb3MgPSAoRklYUF9EQkwpIDB4MDAwMDdGRkYgPDwgc2NhbGU7Ci0gIGNvbnN0IEZJWFBfREJMIG1heF9uZWcgPSAoRklYUF9EQkwpIDB4RkZGRjgwMDEgPDwgc2NhbGU7Ci0jZWxzZQotICBzY2FsZSA9IC1zY2FsZTsKLSAgY29uc3QgRklYUF9EQkwgbWF4X3BvcyA9IChGSVhQX0RCTCkgMHg3RkZGRkZGRiA+PiBzY2FsZTsKLSAgY29uc3QgRklYUF9EQkwgbWF4X25lZyA9IChGSVhQX0RCTCkgMHg4MDAwMDAwMSA+PiBzY2FsZTsgIAotI2VuZGlmCi0gIGNvbnN0IEZJWFBfREJMIGFkZF9uZWcgPSAoMSA8PCBzY2FsZSkgLSAxOwotCi0gIG5vX2NoYW5uZWxzID0gcW1mLT5ub19jaGFubmVsczsKLQotICB0aW1lT3V0ICs9IG5vX2NoYW5uZWxzKnN0cmlkZTsKLQotICBGREtfQVNTRVJUKHNjYWxlID49IDApOwotCi0gIGlmIChxbWYtPm91dEdhaW4gIT0gMHg4MDAwMDAwMCkKLSAgewotICAgIEZJWFBfREJMIGdhaW4gPSBxbWYtPm91dEdhaW47Ci0gICAgZm9yIChub19jaGFubmVscz4+PTI7IG5vX2NoYW5uZWxzLS07KQotICAgIHsKLSAgICAgIEZJWFBfREJMIHJlc3VsdDEsIHJlc3VsdDI7Ci0KLSAgICAgIHJlc3VsdDEgPSBwTXlUaW1lT3V0WzBdOyBwTXlUaW1lT3V0Kys7Ci0gICAgICByZXN1bHQyID0gcE15VGltZU91dFswXTsgcE15VGltZU91dCsrOwotCi0gICAgICByZXN1bHQxID0gZk11bHQocmVzdWx0MSxnYWluKTsKLSAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwotICAgICAgaWYgKHJlc3VsdDEgPCAwKSAgICAgICAgcmVzdWx0MSArPSBhZGRfbmVnOwotICAgICAgaWYgKHJlc3VsdDEgPCBtYXhfbmVnKSAgcmVzdWx0MSA9IG1heF9uZWc7Ci0gICAgICBpZiAocmVzdWx0MSA+IG1heF9wb3MpICByZXN1bHQxID0gbWF4X3BvczsKLSNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA+PiBzY2FsZTsKLSNlbHNlCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA8PCBzY2FsZTsKLSNlbmRpZgotCi0gICAgICByZXN1bHQyID0gZk11bHQocmVzdWx0MixnYWluKTsKLSAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwotICAgICAgaWYgKHJlc3VsdDIgPCAwKSAgICAgICAgcmVzdWx0MiArPSBhZGRfbmVnOwotICAgICAgaWYgKHJlc3VsdDIgPCBtYXhfbmVnKSAgcmVzdWx0MiA9IG1heF9uZWc7Ci0gICAgICBpZiAocmVzdWx0MiA+IG1heF9wb3MpICByZXN1bHQyID0gbWF4X3BvczsKLSNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA+PiBzY2FsZTsKLSNlbHNlCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA8PCBzY2FsZTsKLSNlbmRpZgotCi0gICAgICByZXN1bHQxID0gcE15VGltZU91dFswXTsgcE15VGltZU91dCsrOwotICAgICAgcmVzdWx0MiA9IHBNeVRpbWVPdXRbMF07IHBNeVRpbWVPdXQrKzsKLQotICAgICAgcmVzdWx0MSA9IGZNdWx0KHJlc3VsdDEsZ2Fpbik7Ci0gICAgICB0aW1lT3V0IC09IHN0cmlkZTsKLSAgICAgIGlmIChyZXN1bHQxIDwgMCkgICAgICAgIHJlc3VsdDEgKz0gYWRkX25lZzsKLSAgICAgIGlmIChyZXN1bHQxIDwgbWF4X25lZykgIHJlc3VsdDEgPSBtYXhfbmVnOwotICAgICAgaWYgKHJlc3VsdDEgPiBtYXhfcG9zKSAgcmVzdWx0MSA9IG1heF9wb3M7Ci0jaWYgKFNBTVBMRV9CSVRTID09IDE2KQotICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPj4gc2NhbGU7Ci0jZWxzZQotICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPDwgc2NhbGU7Ci0jZW5kaWYKLQotICAgICAgcmVzdWx0MiA9IGZNdWx0KHJlc3VsdDIsZ2Fpbik7Ci0gICAgICB0aW1lT3V0IC09IHN0cmlkZTsKLSAgICAgIGlmIChyZXN1bHQyIDwgMCkgICAgICAgIHJlc3VsdDIgKz0gYWRkX25lZzsKLSAgICAgIGlmIChyZXN1bHQyIDwgbWF4X25lZykgIHJlc3VsdDIgPSBtYXhfbmVnOwotICAgICAgaWYgKHJlc3VsdDIgPiBtYXhfcG9zKSAgcmVzdWx0MiA9IG1heF9wb3M7Ci0jaWYgKFNBTVBMRV9CSVRTID09IDE2KQotICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPj4gc2NhbGU7Ci0jZWxzZQotICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPDwgc2NhbGU7Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgZm9yIChub19jaGFubmVscz4+PTI7IG5vX2NoYW5uZWxzLS07KQotICAgIHsKLSAgICAgIEZJWFBfREJMIHJlc3VsdDEsIHJlc3VsdDI7Ci0gICAgICByZXN1bHQxID0gcE15VGltZU91dFswXTsgcE15VGltZU91dCsrOwotICAgICAgcmVzdWx0MiA9IHBNeVRpbWVPdXRbMF07IHBNeVRpbWVPdXQrKzsKLSAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwotICAgICAgaWYgKHJlc3VsdDEgPCAwKSAgICAgICAgcmVzdWx0MSArPSBhZGRfbmVnOwotICAgICAgaWYgKHJlc3VsdDEgPCBtYXhfbmVnKSAgcmVzdWx0MSA9IG1heF9uZWc7Ci0gICAgICBpZiAocmVzdWx0MSA+IG1heF9wb3MpICByZXN1bHQxID0gbWF4X3BvczsKLSNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA+PiBzY2FsZTsKLSNlbHNlCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA8PCBzY2FsZTsKLSNlbmRpZgotICAgICAgCi0gICAgICB0aW1lT3V0IC09IHN0cmlkZTsKLSAgICAgIGlmIChyZXN1bHQyIDwgMCkgICAgICAgIHJlc3VsdDIgKz0gYWRkX25lZzsKLSAgICAgIGlmIChyZXN1bHQyIDwgbWF4X25lZykgIHJlc3VsdDIgPSBtYXhfbmVnOwotICAgICAgaWYgKHJlc3VsdDIgPiBtYXhfcG9zKSAgcmVzdWx0MiA9IG1heF9wb3M7Ci0jaWYgKFNBTVBMRV9CSVRTID09IDE2KQotICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPj4gc2NhbGU7Ci0jZWxzZQotICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPDwgc2NhbGU7Ci0jZW5kaWYKLSAgICAgIAotICAgICAgcmVzdWx0MSA9IHBNeVRpbWVPdXRbMF07IHBNeVRpbWVPdXQrKzsKLSAgICAgIHJlc3VsdDIgPSBwTXlUaW1lT3V0WzBdOyBwTXlUaW1lT3V0Kys7Ci0gICAgICB0aW1lT3V0IC09IHN0cmlkZTsKLSAgICAgIGlmIChyZXN1bHQxIDwgMCkgICAgICAgIHJlc3VsdDEgKz0gYWRkX25lZzsKLSAgICAgIGlmIChyZXN1bHQxIDwgbWF4X25lZykgIHJlc3VsdDEgPSBtYXhfbmVnOwotICAgICAgaWYgKHJlc3VsdDEgPiBtYXhfcG9zKSAgcmVzdWx0MSA9IG1heF9wb3M7Ci0jaWYgKFNBTVBMRV9CSVRTID09IDE2KQotICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPj4gc2NhbGU7Ci0jZWxzZQotICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPDwgc2NhbGU7Ci0jZW5kaWYKLSAgICAgIAotICAgICAgdGltZU91dCAtPSBzdHJpZGU7Ci0gICAgICBpZiAocmVzdWx0MiA8IDApICAgICAgICByZXN1bHQyICs9IGFkZF9uZWc7Ci0gICAgICBpZiAocmVzdWx0MiA8IG1heF9uZWcpICByZXN1bHQyID0gbWF4X25lZzsKLSAgICAgIGlmIChyZXN1bHQyID4gbWF4X3BvcykgIHJlc3VsdDIgPSBtYXhfcG9zOwotI2lmIChTQU1QTEVfQklUUyA9PSAxNikKLSAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyID4+IHNjYWxlOwotI2Vsc2UKLSAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyIDw8IHNjYWxlOwotI2VuZGlmCi0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMKLXZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdF9mYWxsYmFjayggSEFORExFX1FNRl9GSUxURVJfQkFOSyBxbWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpyZWFsU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIHJlYWwgU2xvdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaW1hZ1Nsb3QsICAgICAgLyohPCBJbnB1dDogUG9pbnRlciB0byBpbWFnIFNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgKnRpbWVPdXQsICAgICAgICAgICAgIC8qITwgVGltZSBkb21haW4gZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgc3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyohCi0gIFxicmllZiBQZXJmb3JtIFN5bnRoZXNpcyBQcm90b3R5cGUgRmlsdGVyaW5nIG9uIGEgc2luZ2xlIHNsb3Qgb2YgaW5wdXQgZGF0YS4KLQotICBUaGUgZmlsdGVyIHRha2VzIDIgKiAjTUFYX1NZTlRIRVNJU19DSEFOTkVMUyBvZiBpbnB1dCBkYXRhIGFuZAotICBnZW5lcmF0ZXMgI01BWF9TWU5USEVTSVNfQ0hBTk5FTFMgdGltZSBkb21haW4gb3V0cHV0IHNhbXBsZXMuCi0qLwotCi1zdGF0aWMKLXZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdCggSEFORExFX1FNRl9GSUxURVJfQkFOSyBxbWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpyZWFsU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIHJlYWwgU2xvdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaW1hZ1Nsb3QsICAgICAgLyohPCBJbnB1dDogUG9pbnRlciB0byBpbWFnIFNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgKnRpbWVPdXQsICAgICAgICAgICAgIC8qITwgVGltZSBkb21haW4gZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgc3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIElOVCBlcnIgPSAtMTsKLQotICAgIHN3aXRjaCAocW1mLT5wX3N0cmlkZSkgewotICAgIGNhc2UgMjoKLSAgICAgIGVyciA9IHFtZlN5blByb3RvdHlwZUZpclNsb3QyKHFtZiwgcmVhbFNsb3QsIGltYWdTbG90LCB0aW1lT3V0LCBzdHJpZGUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGVyciA9IC0xOwotICAgIH0KLQotICAgIC8qIGZhbGxiYWNrIGlmIGNvbmZpZ3VyYXRpb24gbm90IGF2YWlsYWJsZSBvciBmYWlsZWQgKi8KLSAgICBpZihlcnIhPTApIHsKLSAgICAgICAgcW1mU3luUHJvdG90eXBlRmlyU2xvdF9mYWxsYmFjayhxbWYsIHJlYWxTbG90LCBpbWFnU2xvdCwgdGltZU91dCwgc3RyaWRlKTsKLSAgICB9Ci19Ci0jZW5kaWYgLyogRlVOQ1RJT05fcW1mU3luUHJvdG90eXBlRmlyU2xvdCAqLwotCi0jZW5kaWYgIC8qICAoIGRlZmluZWQoX19DQ19BUk0pICYmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgJiYgKFNBTVBMRV9CSVRTID09IDE2KSApICYmICFkZWZpbmVkKFFNRl9UQUJMRV9GVUxMKSAqLwotCi0KLQotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCi0KLQotCi0jZW5kaWYgIC8qIChRTUZfTk9fUE9MWT09NSkgKi8KLQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9hcm0vc2NhbGVfYXJtLmNwcCBiL2xpYkZESy9zcmMvYXJtL3NjYWxlX2FybS5jcHAKaW5kZXggZTI4MzdlZi4uOTJjOWVkYyAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9hcm0vc2NhbGVfYXJtLmNwcAorKysgYi9saWJGREsvc3JjL2FybS9zY2FsZV9hcm0uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQwICs5MCwzNCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAotICAgQXV0aG9yKHMpOiBBcnRodXIgVHJpdHRoYXJ0CisgICBBdXRob3Iocyk6ICAgQXJ0aHVyIFRyaXR0aGFydAorCiAgICBEZXNjcmlwdGlvbjogU2NhbGluZyBvcGVyYXRpb25zIGZvciBBUk0KIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogcHJldmVudCBtdWx0aXBsZSBpbmNsdXNpb24gd2l0aCByZS1kZWZpbml0aW9ucyAqLwogI2lmbmRlZiBfX0lOQ0xVREVfU0NBTEVfQVJNX18KICNkZWZpbmUgX19JTkNMVURFX1NDQUxFX0FSTV9fCiAKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9zY2FsZVZhbHVlc1dpdGhGYWN0b3JfREJMKQogI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc1dpdGhGYWN0b3JfREJMCi0KIFNDQUxFX0lOTElORQotdm9pZCBzY2FsZVZhbHVlc1dpdGhGYWN0b3IoCi0gICAgICAgIEZJWFBfREJMICp2ZWN0b3IsCi0gICAgICAgIEZJWFBfREJMIGZhY3RvciwKLSAgICAgICAgSU5UIGxlbiwKLSAgICAgICAgSU5UIHNjYWxlZmFjdG9yCi0gICAgICAgICkKLXsKK3ZvaWQgc2NhbGVWYWx1ZXNXaXRoRmFjdG9yKEZJWFBfREJMICp2ZWN0b3IsIEZJWFBfREJMIGZhY3RvciwgSU5UIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvcikgewogICAvKiBUaGlzIGNvZGUgY29tYmluZXMgdGhlIGZNdWx0IHdpdGggdGhlIHNjYWxpbmcgICAgICAgICAgICAgKi8KICAgLyogSXQgcGVyZm9ybXMgYSBmTXVsdERpdjIgYW5kIGluY3JlbWVudHMgc2hpZnQgYnkgMSAgICAgICAgICovCiAgIGludCBzaGlmdCA9IHNjYWxlZmFjdG9yICsgMTsKICAgRklYUF9EQkwgKm15U3BlYyA9IHZlY3RvcjsKIAotICBzaGlmdCA9IGZpeG1pbl9JKHNoaWZ0LChJTlQpREZSQUNUX0JJVFMtMSk7CisgIHNoaWZ0ID0gZml4bWluX0koc2hpZnQsIChJTlQpREZSQUNUX0JJVFMgLSAxKTsKIAotICBpZiAoc2hpZnQgPj0gMCkKLSAgewotICAgIGZvciAoaW50IGk9MDsgaTwobGVuPj4yKTsgaSsrKQotICAgIHsKKyAgaWYgKHNoaWZ0ID49IDApIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChsZW4gPj4gMik7IGkrKykgewogICAgICAgRklYUF9EQkwgdG1wMCA9IG15U3BlY1swXTsKICAgICAgIEZJWFBfREJMIHRtcDEgPSBteVNwZWNbMV07CiAgICAgICBGSVhQX0RCTCB0bXAyID0gbXlTcGVjWzJdOwpAQCAtMTMwLDE5ICsxMzUsMTUgQEAKICAgICAgICpteVNwZWMrKyA9IHRtcDI7CiAgICAgICAqbXlTcGVjKysgPSB0bXAzOwogICAgIH0KLSAgICBmb3IgKGludCBpPWxlbiYzOyBpLS07KQotICAgIHsKKyAgICBmb3IgKGludCBpID0gbGVuICYgMzsgaS0tOykgewogICAgICAgRklYUF9EQkwgdG1wMCA9IG15U3BlY1swXTsKICAgICAgIHRtcDAgPSBmTXVsdERpdjIodG1wMCwgZmFjdG9yKTsKICAgICAgIHRtcDAgPDw9IHNoaWZ0OwogICAgICAgKm15U3BlYysrID0gdG1wMDsKICAgICB9Ci0gIH0KLSAgZWxzZQotICB7CisgIH0gZWxzZSB7CiAgICAgc2hpZnQgPSAtc2hpZnQ7Ci0gICAgZm9yIChpbnQgaT0wOyBpPChsZW4+PjIpOyBpKyspCi0gICAgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGxlbiA+PiAyKTsgaSsrKSB7CiAgICAgICBGSVhQX0RCTCB0bXAwID0gbXlTcGVjWzBdOwogICAgICAgRklYUF9EQkwgdG1wMSA9IG15U3BlY1sxXTsKICAgICAgIEZJWFBfREJMIHRtcDIgPSBteVNwZWNbMl07CkBAIC0xNjAsOCArMTYxLDcgQEAKICAgICAgICpteVNwZWMrKyA9IHRtcDI7CiAgICAgICAqbXlTcGVjKysgPSB0bXAzOwogICAgIH0KLSAgICBmb3IgKGludCBpPWxlbiYzOyBpLS07KQotICAgIHsKKyAgICBmb3IgKGludCBpID0gbGVuICYgMzsgaS0tOykgewogICAgICAgRklYUF9EQkwgdG1wMCA9IG15U3BlY1swXTsKICAgICAgIHRtcDAgPSBmTXVsdERpdjIodG1wMCwgZmFjdG9yKTsKICAgICAgIHRtcDAgPj49IHNoaWZ0OwpAQCAtMTY5LDUgKzE2OSw2IEBACiAgICAgfQogICB9CiB9CisjZW5kaWYgLyogI2lmICFkZWZpbmVkKEZVTkNUSU9OX3NjYWxlVmFsdWVzV2l0aEZhY3Rvcl9EQkwpICovCiAKICNlbmRpZiAvKiAjaWZuZGVmIF9fSU5DTFVERV9TQ0FMRV9BUk1fXyAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9hdXRvY29ycjJuZC5jcHAgYi9saWJGREsvc3JjL2F1dG9jb3JyMm5kLmNwcAppbmRleCBiN2VhZTdjLi43MThhNTU1IDEwMDY0NAotLS0gYS9saWJGREsvc3JjL2F1dG9jb3JyMm5kLmNwcAorKysgYi9saWJGREsvc3JjL2F1dG9jb3JyMm5kLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0MyArOTAsMzUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCisKICAgIERlc2NyaXB0aW9uOiBhdXRvLWNvcnJlbGF0aW9uIGZ1bmN0aW9ucwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYXV0b2NvcnIybmQuaCIKIAotCi0KIC8qICBJZiB0aGUgYWNjdW11bGF0b3IgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggb3ZlcmZsb3cgYml0cywKICAgICBwcm9kdWN0cyBoYXZlIHRvIGJlIHNoaWZ0ZWQgZG93biBpbiB0aGUgYXV0b2NvcnJlbGF0aW9uIGJlbG93LiAqLwogI2RlZmluZSBTSElGVF9GQUNUT1IgKDUpCiAjZGVmaW5lIFNISUZUID4+IChTSElGVF9GQUNUT1IpCiAKLQotI2lmIGRlZmluZWQoX19DQ19BUk0pIHx8IGRlZmluZWQoX19hcm1fXykKLSNpbmNsdWRlICJhcm0vYXV0b2NvcnIybmQuY3BwIgotI2VuZGlmCi0KLQogLyohCiAgKgogICogXGJyaWVmIENhbGN1bGF0ZSBzZWNvbmQgb3JkZXIgYXV0b2NvcnJlbGF0aW9uIHVzaW5nIDIgYWNjdW11bGF0b3JzCiAgKgogICovCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fYXV0b0NvcnIybmRfcmVhbCkKLUlOVAotYXV0b0NvcnIybmRfcmVhbCAoQUNPUlJfQ09FRlMgKmFjLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gYXV0b2NvcnJlbGF0aW9uIGNvZWZmcyAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnJlQnVmZmVyLCAvKiE8IFBvaW50ZXIgdG8gdG8gcmVhbCBwYXJ0IG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsZW4gICAgICAgICAgICAgLyohPCBOdW1iZXIgaW5wdXQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICApCi17Ci0gIGludCAgIGosIGF1dG9Db3JyU2NhbGluZywgbVNjYWxlOworSU5UIGF1dG9Db3JyMm5kX3JlYWwoCisgICAgQUNPUlJfQ09FRlMgKmFjLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gYXV0b2NvcnJlbGF0aW9uIGNvZWZmcyAqLworICAgIGNvbnN0IEZJWFBfREJMICpyZUJ1ZmZlciwgLyohPCBQb2ludGVyIHRvIHRvIHJlYWwgcGFydCBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgY29uc3QgaW50IGxlbiAgICAgICAgICAgICAvKiE8IE51bWJlciBpbnB1dCBzYW1wbGVzICovCispIHsKKyAgaW50IGosIGF1dG9Db3JyU2NhbGluZywgbVNjYWxlOwogCiAgIEZJWFBfREJMIGFjY3UxLCBhY2N1MiwgYWNjdTMsIGFjY3U0LCBhY2N1NTsKIApAQCAtMTI4LDI3ICsxMzEsMjQgQEAKICAgICByMDFyLHIxMnIKICAgICByMDJyCiAgICovCi0gIHBSZUJ1ZiA9IHJlYWxCdWYtMjsKLSAgYWNjdTUgPSAoIChmTXVsdERpdjIocFJlQnVmWzBdLCBwUmVCdWZbMl0pICsKLSAgICAgICAgICAgICBmTXVsdERpdjIocFJlQnVmWzFdLCBwUmVCdWZbM10pKSBTSElGVCk7CisgIHBSZUJ1ZiA9IHJlYWxCdWYgLSAyOworICBhY2N1NSA9ICgoZk11bHREaXYyKHBSZUJ1ZlswXSwgcFJlQnVmWzJdKSArIGZNdWx0RGl2MihwUmVCdWZbMV0sIHBSZUJ1ZlszXSkpCisgICAgICAgICAgICAgICBTSElGVCk7CiAgIHBSZUJ1ZisrOwogCi0gIC8vbGVuIG11c3QgYmUgZXZlbgorICAvKiBsZW4gbXVzdCBiZSBldmVuICovCiAgIGFjY3UxID0gZlBvdzJEaXYyKHBSZUJ1ZlswXSkgU0hJRlQ7CiAgIGFjY3UzID0gZk11bHREaXYyKHBSZUJ1ZlswXSwgcFJlQnVmWzFdKSBTSElGVDsKICAgcFJlQnVmKys7CiAKLSAgZm9yICggaiA9IChsZW4gLSAyKT4+MTsgaiAhPSAwOyBqLS0scFJlQnVmKz0yICkgeworICBmb3IgKGogPSAobGVuIC0gMikgPj4gMTsgaiAhPSAwOyBqLS0sIHBSZUJ1ZiArPSAyKSB7CisgICAgYWNjdTEgKz0gKChmUG93MkRpdjIocFJlQnVmWzBdKSArIGZQb3cyRGl2MihwUmVCdWZbMV0pKSBTSElGVCk7CiAKLSAgICBhY2N1MSArPSAoIChmUG93MkRpdjIocFJlQnVmWzBdKSArCi0gICAgICAgICAgICAgICAgZlBvdzJEaXYyKHBSZUJ1ZlsxXSkpIFNISUZUKTsKKyAgICBhY2N1MyArPSAoKGZNdWx0RGl2MihwUmVCdWZbMF0sIHBSZUJ1ZlsxXSkgKworICAgICAgICAgICAgICAgZk11bHREaXYyKHBSZUJ1ZlsxXSwgcFJlQnVmWzJdKSkgU0hJRlQpOwogCi0gICAgYWNjdTMgKz0gKCAoZk11bHREaXYyKHBSZUJ1ZlswXSwgcFJlQnVmWzFdKSArCi0gICAgICAgICAgICAgICAgZk11bHREaXYyKHBSZUJ1ZlsxXSwgcFJlQnVmWzJdKSkgU0hJRlQpOwotCi0gICAgYWNjdTUgKz0gKCAoZk11bHREaXYyKHBSZUJ1ZlswXSwgcFJlQnVmWzJdKSArCi0gICAgICAgICAgICAgICAgZk11bHREaXYyKHBSZUJ1ZlsxXSwgcFJlQnVmWzNdKSkgU0hJRlQpOwotCisgICAgYWNjdTUgKz0gKChmTXVsdERpdjIocFJlQnVmWzBdLCBwUmVCdWZbMl0pICsKKyAgICAgICAgICAgICAgIGZNdWx0RGl2MihwUmVCdWZbMV0sIHBSZUJ1ZlszXSkpIFNISUZUKTsKICAgfQogCiAgIGFjY3UyID0gKGZQb3cyRGl2MihyZWFsQnVmWy0yXSkgU0hJRlQpOwpAQCAtMTU2LDEyICsxNTYsMTQgQEAKIAogICBhY2N1MSArPSAoZlBvdzJEaXYyKHJlYWxCdWZbbGVuIC0gMl0pIFNISUZUKTsKIAotICBhY2N1NCAgPSAoZk11bHREaXYyKHJlYWxCdWZbLTFdLHJlYWxCdWZbLTJdKSBTSElGVCk7CisgIGFjY3U0ID0gKGZNdWx0RGl2MihyZWFsQnVmWy0xXSwgcmVhbEJ1ZlstMl0pIFNISUZUKTsKICAgYWNjdTQgKz0gYWNjdTM7CiAKLSAgYWNjdTMgKz0gKGZNdWx0RGl2MihyZWFsQnVmW2xlbiAtIDFdLHJlYWxCdWZbbGVuIC0gMl0pIFNISUZUKTsKKyAgYWNjdTMgKz0gKGZNdWx0RGl2MihyZWFsQnVmW2xlbiAtIDFdLCByZWFsQnVmW2xlbiAtIDJdKSBTSElGVCk7CiAKLSAgbVNjYWxlID0gQ250TGVhZGluZ1plcm9zKCAoYWNjdTEgfCBhY2N1MiB8IGZBYnMoYWNjdTMpIHwgZkFicyhhY2N1NCkgfCBmQWJzKGFjY3U1KSkgKSAtIDE7CisgIG1TY2FsZSA9IENudExlYWRpbmdaZXJvcygKKyAgICAgICAgICAgICAgIChhY2N1MSB8IGFjY3UyIHwgZkFicyhhY2N1MykgfCBmQWJzKGFjY3U0KSB8IGZBYnMoYWNjdTUpKSkgLQorICAgICAgICAgICAxOwogICBhdXRvQ29yclNjYWxpbmcgPSBtU2NhbGUgLSAxIC0gU0hJRlRfRkFDVE9SOyAvKiAtMSBiZWNhdXNlIG9mIGZNdWx0RGl2MiovCiAKICAgLyogU2NhbGUgdG8gY29tbW9uIHNjYWxlIGZhY3RvciAqLwpAQCAtMTcxLDM2ICsxNzMsMzMgQEAKICAgYWMtPnIxMnIgPSBhY2N1NCA8PCBtU2NhbGU7CiAgIGFjLT5yMDJyID0gYWNjdTUgPDwgbVNjYWxlOwogCi0gIGFjLT5kZXQgPSAoZk11bHREaXYyKGFjLT5yMTFyLGFjLT5yMjJyKSAtIGZNdWx0RGl2MihhYy0+cjEycixhYy0+cjEycikpIDsKLSAgbVNjYWxlICA9IENvdW50TGVhZGluZ0JpdHMoZkFicyhhYy0+ZGV0KSk7CisgIGFjLT5kZXQgPSAoZk11bHREaXYyKGFjLT5yMTFyLCBhYy0+cjIycikgLSBmTXVsdERpdjIoYWMtPnIxMnIsIGFjLT5yMTJyKSk7CisgIG1TY2FsZSA9IENvdW50TGVhZGluZ0JpdHMoZkFicyhhYy0+ZGV0KSk7CiAKLSAgYWMtPmRldCAgICAgPDw9IG1TY2FsZTsKKyAgYWMtPmRldCA8PD0gbVNjYWxlOwogICBhYy0+ZGV0X3NjYWxlID0gbVNjYWxlIC0gMTsKIAogICByZXR1cm4gYXV0b0NvcnJTY2FsaW5nOwogfQogI2VuZGlmCiAKLSNpZm5kZWYgTE9XX1BPV0VSX1NCUl9PTkxZCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fYXV0b0NvcnIybmRfY3BseCkKLUlOVAotYXV0b0NvcnIybmRfY3BseCAoQUNPUlJfQ09FRlMgKmFjLCAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGF1dG9jb3JyZWxhdGlvbiBjb2VmZnMgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpyZUJ1ZmZlciwgIC8qITwgUG9pbnRlciB0byByZWFsIHBhcnQgb2YgaW5wdXQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmltQnVmZmVyLCAgLyohPCBQb2ludGVyIHRvIGltYWcgcGFydCBvZiBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGVuICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICkKLXsKK0lOVCBhdXRvQ29ycjJuZF9jcGx4KAorICAgIEFDT1JSX0NPRUZTICphYywgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGF1dG9jb3JyZWxhdGlvbiBjb2VmZnMgKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqcmVCdWZmZXIsIC8qITwgUG9pbnRlciB0byByZWFsIHBhcnQgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgIGNvbnN0IEZJWFBfREJMICppbUJ1ZmZlciwgLyohPCBQb2ludGVyIHRvIGltYWcgcGFydCBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgY29uc3QgaW50IGxlbiAvKiE8IE51bWJlciBvZiBpbnB1dCBzYW1wbGVzIChzaG91bGQgYmUgc21hbGxlciB0aGFuIDEyOCkgKi8KKykgeworICBpbnQgaiwgYXV0b0NvcnJTY2FsaW5nLCBtU2NhbGUsIGxlbl9zY2FsZTsKIAotICBpbnQgICBqLCBhdXRvQ29yclNjYWxpbmcsIG1TY2FsZSwgbGVuX3NjYWxlOwotCi0gIEZJWFBfREJMIGFjY3UwLCBhY2N1MSxhY2N1MiwgYWNjdTMsIGFjY3U0LCBhY2N1NSwgYWNjdTYsIGFjY3U3LCBhY2N1ODsKKyAgRklYUF9EQkwgYWNjdTAsIGFjY3UxLCBhY2N1MiwgYWNjdTMsIGFjY3U0LCBhY2N1NSwgYWNjdTYsIGFjY3U3LCBhY2N1ODsKIAogICBjb25zdCBGSVhQX0RCTCAqcFJlQnVmLCAqcEltQnVmOwogCiAgIGNvbnN0IEZJWFBfREJMICpyZWFsQnVmID0gcmVCdWZmZXI7CiAgIGNvbnN0IEZJWFBfREJMICppbWFnQnVmID0gaW1CdWZmZXI7CiAKLSAgKGxlbj42NCkgPyAobGVuX3NjYWxlID0gNikgOiAobGVuX3NjYWxlID0gNSk7CisgIChsZW4gPiA2NCkgPyAobGVuX3NjYWxlID0gNikgOiAobGVuX3NjYWxlID0gNSk7CiAgIC8qCiAgICAgcjAwciwKICAgICByMTFyLHIyMnIKQEAgLTIxMCw0NiArMjA5LDYzIEBACiAgICovCiAgIGFjY3UxID0gYWNjdTMgPSBhY2N1NSA9IGFjY3U3ID0gYWNjdTggPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAotICBwUmVCdWYgID0gcmVhbEJ1Zi0yLCBwSW1CdWYgID0gaW1hZ0J1Zi0yOwotICBhY2N1NyArPSAoIChmTXVsdERpdjIocFJlQnVmWzJdLCBwUmVCdWZbMF0pICsgZk11bHREaXYyKHBJbUJ1ZlsyXSwgcEltQnVmWzBdKSkgPj4gbGVuX3NjYWxlKTsKLSAgYWNjdTggKz0gKCAoZk11bHREaXYyKHBJbUJ1ZlsyXSwgcFJlQnVmWzBdKSAtIGZNdWx0RGl2MihwUmVCdWZbMl0sIHBJbUJ1ZlswXSkpID4+IGxlbl9zY2FsZSk7CisgIHBSZUJ1ZiA9IHJlYWxCdWYgLSAyLCBwSW1CdWYgPSBpbWFnQnVmIC0gMjsKKyAgYWNjdTcgKz0KKyAgICAgICgoZk11bHREaXYyKHBSZUJ1ZlsyXSwgcFJlQnVmWzBdKSArIGZNdWx0RGl2MihwSW1CdWZbMl0sIHBJbUJ1ZlswXSkpID4+CisgICAgICAgbGVuX3NjYWxlKTsKKyAgYWNjdTggKz0KKyAgICAgICgoZk11bHREaXYyKHBJbUJ1ZlsyXSwgcFJlQnVmWzBdKSAtIGZNdWx0RGl2MihwUmVCdWZbMl0sIHBJbUJ1ZlswXSkpID4+CisgICAgICAgbGVuX3NjYWxlKTsKIAotICBwUmVCdWYgPSByZWFsQnVmLTEsIHBJbUJ1ZiA9IGltYWdCdWYtMTsKLSAgZm9yICggaiA9IChsZW4gLSAxKTsgaiAhPSAwOyBqLS0scFJlQnVmKysscEltQnVmKysgKXsKLSAgICBhY2N1MSArPSAoIChmUG93MkRpdjIocFJlQnVmWzBdICAgICAgICAgICApICsgZlBvdzJEaXYyKHBJbUJ1ZlswXSAgICAgICAgICAgKSkgPj4gbGVuX3NjYWxlKTsKLSAgICBhY2N1MyArPSAoIChmTXVsdERpdjIocFJlQnVmWzBdLCBwUmVCdWZbMV0pICsgZk11bHREaXYyKHBJbUJ1ZlswXSwgcEltQnVmWzFdKSkgPj4gbGVuX3NjYWxlKTsKLSAgICBhY2N1NSArPSAoIChmTXVsdERpdjIocEltQnVmWzFdLCBwUmVCdWZbMF0pIC0gZk11bHREaXYyKHBSZUJ1ZlsxXSwgcEltQnVmWzBdKSkgPj4gbGVuX3NjYWxlKTsKLSAgICBhY2N1NyArPSAoIChmTXVsdERpdjIocFJlQnVmWzJdLCBwUmVCdWZbMF0pICsgZk11bHREaXYyKHBJbUJ1ZlsyXSwgcEltQnVmWzBdKSkgPj4gbGVuX3NjYWxlKTsKLSAgICBhY2N1OCArPSAoIChmTXVsdERpdjIocEltQnVmWzJdLCBwUmVCdWZbMF0pIC0gZk11bHREaXYyKHBSZUJ1ZlsyXSwgcEltQnVmWzBdKSkgPj4gbGVuX3NjYWxlKTsKKyAgcFJlQnVmID0gcmVhbEJ1ZiAtIDEsIHBJbUJ1ZiA9IGltYWdCdWYgLSAxOworICBmb3IgKGogPSAobGVuIC0gMSk7IGogIT0gMDsgai0tLCBwUmVCdWYrKywgcEltQnVmKyspIHsKKyAgICBhY2N1MSArPSAoKGZQb3cyRGl2MihwUmVCdWZbMF0pICsgZlBvdzJEaXYyKHBJbUJ1ZlswXSkpID4+IGxlbl9zY2FsZSk7CisgICAgYWNjdTMgKz0KKyAgICAgICAgKChmTXVsdERpdjIocFJlQnVmWzBdLCBwUmVCdWZbMV0pICsgZk11bHREaXYyKHBJbUJ1ZlswXSwgcEltQnVmWzFdKSkgPj4KKyAgICAgICAgIGxlbl9zY2FsZSk7CisgICAgYWNjdTUgKz0KKyAgICAgICAgKChmTXVsdERpdjIocEltQnVmWzFdLCBwUmVCdWZbMF0pIC0gZk11bHREaXYyKHBSZUJ1ZlsxXSwgcEltQnVmWzBdKSkgPj4KKyAgICAgICAgIGxlbl9zY2FsZSk7CisgICAgYWNjdTcgKz0KKyAgICAgICAgKChmTXVsdERpdjIocFJlQnVmWzJdLCBwUmVCdWZbMF0pICsgZk11bHREaXYyKHBJbUJ1ZlsyXSwgcEltQnVmWzBdKSkgPj4KKyAgICAgICAgIGxlbl9zY2FsZSk7CisgICAgYWNjdTggKz0KKyAgICAgICAgKChmTXVsdERpdjIocEltQnVmWzJdLCBwUmVCdWZbMF0pIC0gZk11bHREaXYyKHBSZUJ1ZlsyXSwgcEltQnVmWzBdKSkgPj4KKyAgICAgICAgIGxlbl9zY2FsZSk7CiAgIH0KIAotICBhY2N1MiA9ICggKGZQb3cyRGl2MihyZWFsQnVmWy0yXSkgKyBmUG93MkRpdjIoaW1hZ0J1ZlstMl0pKSA+PiBsZW5fc2NhbGUpOworICBhY2N1MiA9ICgoZlBvdzJEaXYyKHJlYWxCdWZbLTJdKSArIGZQb3cyRGl2MihpbWFnQnVmWy0yXSkpID4+IGxlbl9zY2FsZSk7CiAgIGFjY3UyICs9IGFjY3UxOwogCi0gIGFjY3UxICs9ICggKGZQb3cyRGl2MihyZWFsQnVmW2xlbi0yXSkgKwotICAgICAgICAgICAgICBmUG93MkRpdjIoaW1hZ0J1ZltsZW4tMl0pKSA+PiBsZW5fc2NhbGUpOwotICBhY2N1MCA9ICggKGZQb3cyRGl2MihyZWFsQnVmW2xlbi0xXSkgKwotICAgICAgICAgICAgIGZQb3cyRGl2MihpbWFnQnVmW2xlbi0xXSkpID4+IGxlbl9zY2FsZSkgLQotICAgICAgICAgICggKGZQb3cyRGl2MihyZWFsQnVmWy0xXSkgKwotICAgICAgICAgICAgIGZQb3cyRGl2MihpbWFnQnVmWy0xXSkpID4+IGxlbl9zY2FsZSk7CisgIGFjY3UxICs9ICgoZlBvdzJEaXYyKHJlYWxCdWZbbGVuIC0gMl0pICsgZlBvdzJEaXYyKGltYWdCdWZbbGVuIC0gMl0pKSA+PgorICAgICAgICAgICAgbGVuX3NjYWxlKTsKKyAgYWNjdTAgPSAoKGZQb3cyRGl2MihyZWFsQnVmW2xlbiAtIDFdKSArIGZQb3cyRGl2MihpbWFnQnVmW2xlbiAtIDFdKSkgPj4KKyAgICAgICAgICAgbGVuX3NjYWxlKSAtCisgICAgICAgICAgKChmUG93MkRpdjIocmVhbEJ1ZlstMV0pICsgZlBvdzJEaXYyKGltYWdCdWZbLTFdKSkgPj4gbGVuX3NjYWxlKTsKICAgYWNjdTAgKz0gYWNjdTE7CiAKLSAgYWNjdTQgPSAoIChmTXVsdERpdjIocmVhbEJ1ZlstMV0sIHJlYWxCdWZbLTJdKSArCi0gICAgICAgICAgICAgZk11bHREaXYyKGltYWdCdWZbLTFdLCBpbWFnQnVmWy0yXSkpID4+IGxlbl9zY2FsZSk7CisgIGFjY3U0ID0gKChmTXVsdERpdjIocmVhbEJ1ZlstMV0sIHJlYWxCdWZbLTJdKSArCisgICAgICAgICAgICBmTXVsdERpdjIoaW1hZ0J1ZlstMV0sIGltYWdCdWZbLTJdKSkgPj4KKyAgICAgICAgICAgbGVuX3NjYWxlKTsKICAgYWNjdTQgKz0gYWNjdTM7CiAKLSAgYWNjdTMgKz0gKCAoZk11bHREaXYyKHJlYWxCdWZbbGVuLTFdLCByZWFsQnVmW2xlbi0yXSkgKwotICAgICAgICAgICAgICBmTXVsdERpdjIoaW1hZ0J1ZltsZW4tMV0sIGltYWdCdWZbbGVuLTJdKSkgPj4gbGVuX3NjYWxlKTsKKyAgYWNjdTMgKz0gKChmTXVsdERpdjIocmVhbEJ1ZltsZW4gLSAxXSwgcmVhbEJ1ZltsZW4gLSAyXSkgKworICAgICAgICAgICAgIGZNdWx0RGl2MihpbWFnQnVmW2xlbiAtIDFdLCBpbWFnQnVmW2xlbiAtIDJdKSkgPj4KKyAgICAgICAgICAgIGxlbl9zY2FsZSk7CiAKLSAgYWNjdTYgPSAoIChmTXVsdERpdjIoaW1hZ0J1ZlstMV0sIHJlYWxCdWZbLTJdKSAtCi0gICAgICAgICAgICAgZk11bHREaXYyKHJlYWxCdWZbLTFdLCBpbWFnQnVmWy0yXSkpID4+IGxlbl9zY2FsZSk7CisgIGFjY3U2ID0gKChmTXVsdERpdjIoaW1hZ0J1ZlstMV0sIHJlYWxCdWZbLTJdKSAtCisgICAgICAgICAgICBmTXVsdERpdjIocmVhbEJ1ZlstMV0sIGltYWdCdWZbLTJdKSkgPj4KKyAgICAgICAgICAgbGVuX3NjYWxlKTsKICAgYWNjdTYgKz0gYWNjdTU7CiAKLSAgYWNjdTUgKz0gKCAoZk11bHREaXYyKGltYWdCdWZbbGVuIC0gMV0sIHJlYWxCdWZbbGVuIC0gMl0pIC0KLSAgICAgICAgICAgICAgZk11bHREaXYyKHJlYWxCdWZbbGVuIC0gMV0sIGltYWdCdWZbbGVuIC0gMl0pKSA+PiBsZW5fc2NhbGUpOworICBhY2N1NSArPSAoKGZNdWx0RGl2MihpbWFnQnVmW2xlbiAtIDFdLCByZWFsQnVmW2xlbiAtIDJdKSAtCisgICAgICAgICAgICAgZk11bHREaXYyKHJlYWxCdWZbbGVuIC0gMV0sIGltYWdCdWZbbGVuIC0gMl0pKSA+PgorICAgICAgICAgICAgbGVuX3NjYWxlKTsKIAotICBtU2NhbGUgPSBDbnRMZWFkaW5nWmVyb3MoIChhY2N1MCB8IGFjY3UxIHwgYWNjdTIgfCBmQWJzKGFjY3UzKSB8IGZBYnMoYWNjdTQpIHwgZkFicyhhY2N1NSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQWJzKGFjY3U2KSB8IGZBYnMoYWNjdTcpIHwgZkFicyhhY2N1OCkpICkgLSAxOworICBtU2NhbGUgPQorICAgICAgQ250TGVhZGluZ1plcm9zKChhY2N1MCB8IGFjY3UxIHwgYWNjdTIgfCBmQWJzKGFjY3UzKSB8IGZBYnMoYWNjdTQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgZkFicyhhY2N1NSkgfCBmQWJzKGFjY3U2KSB8IGZBYnMoYWNjdTcpIHwgZkFicyhhY2N1OCkpKSAtCisgICAgICAxOwogICBhdXRvQ29yclNjYWxpbmcgPSBtU2NhbGUgLSAxIC0gbGVuX3NjYWxlOyAvKiAtMSBiZWNhdXNlIG9mIGZNdWx0RGl2MiovCiAKICAgLyogU2NhbGUgdG8gY29tbW9uIHNjYWxlIGZhY3RvciAqLwpAQCAtMjYzLDE2ICsyNzksMTUgQEAKICAgYWMtPnIwMnIgPSAoRklYUF9EQkwpYWNjdTcgPDwgbVNjYWxlOwogICBhYy0+cjAyaSA9IChGSVhQX0RCTClhY2N1OCA8PCBtU2NhbGU7CiAKLSAgYWMtPmRldCA9ICggZk11bHREaXYyKGFjLT5yMTFyLGFjLT5yMjJyKSA+PiAxICkgLQotICAgICAgICAgICAgKCAoZk11bHREaXYyKGFjLT5yMTJyLGFjLT5yMTJyKSArIGZNdWx0RGl2MihhYy0+cjEyaSxhYy0+cjEyaSkpID4+IDEgKTsKLSAgbVNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhmQWJzKGFjLT5kZXQpKTsKKyAgYWMtPmRldCA9CisgICAgICAoZk11bHREaXYyKGFjLT5yMTFyLCBhYy0+cjIycikgPj4gMSkgLQorICAgICAgKChmTXVsdERpdjIoYWMtPnIxMnIsIGFjLT5yMTJyKSArIGZNdWx0RGl2MihhYy0+cjEyaSwgYWMtPnIxMmkpKSA+PiAxKTsKKyAgbVNjYWxlID0gQ250TGVhZGluZ1plcm9zKGZBYnMoYWMtPmRldCkpIC0gMTsKIAogICBhYy0+ZGV0IDw8PSBtU2NhbGU7CiAgIGFjLT5kZXRfc2NhbGUgPSBtU2NhbGUgLSAyOwogCiAgIHJldHVybiBhdXRvQ29yclNjYWxpbmc7CiB9CisKICNlbmRpZiAvKiBGVU5DVElPTl9hdXRvQ29ycjJuZF9jcGx4ICovCi0jZW5kaWYgLyogTE9XX1BPV0VSX1NCUl9PTkxZICovCi0KLQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9kY3QuY3BwIGIvbGliRkRLL3NyYy9kY3QuY3BwCmluZGV4IDFlNWI5M2UuLmE0NTEzMzEgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvZGN0LmNwcAorKysgYi9saWJGREsvc3JjL2RjdC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksOTQgKzkwLDE2MyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZSAgIGRjdC5jcHAKLSAgXGJyaWVmICBEQ1QgSW1wbGVtZW50YXRpb25zICAgCi0gIExpYnJhcnkgZnVuY3Rpb25zIHRvIGNhbGN1bGF0ZSBzdGFuZGFyZCBEQ1RzLiBUaGlzIHdpbGwgbW9zdCBsaWtlbHkgYmUgcmVwbGFjZWQgYnkgaGFuZC1vcHRpbWl6ZWQKLSAgZnVuY3Rpb25zIGZvciB0aGUgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3Nvci4KKyAgXGJyaWVmICBEQ1QgSW1wbGVtZW50YXRpb25zCisgIExpYnJhcnkgZnVuY3Rpb25zIHRvIGNhbGN1bGF0ZSBzdGFuZGFyZCBEQ1RzLiBUaGlzIHdpbGwgbW9zdCBsaWtlbHkgYmUKKyAgcmVwbGFjZWQgYnkgaGFuZC1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciB0aGUgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3Nvci4KIAotICBUaHJlZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBkY3QgdHlwZSBJSSBhbmQgdGhlIGRjdCB0eXBlIElJSSB0cmFuc2Zvcm1zIGFyZSBwcm92aWRlZC4KKyAgVGhyZWUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZGN0IHR5cGUgSUkgYW5kIHRoZSBkY3QgdHlwZSBJSUkKKyAgdHJhbnNmb3JtcyBhcmUgcHJvdmlkZWQuCiAKLSAgQnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggYXJlIGJhc2VkIG9uIGEgc2luZ2xlLCBzdGFuZGFyZCBjb21wbGV4IEZGVC1rZXJuZWwgYXJlIHVzZWQgKGRjdElJX2YoKSBhbmQgZGN0SUlJX2YoKSkuCi0gIFRoZXNlIGFyZSBzcGVjaWZpY2FsbHkgaGVscGZ1bCBpbiBjYXNlcyB3aGVyZSBvcHRpbWl6ZWQgRkZUIGxpYnJhcmllcyBhcmUgYWxyZWFkeSBhdmFpbGFibGUuIFRoZSBGRlQgdXNlZCBpbiB0aGVzZQotICBpbXBsZW1lbnRhdGlvbiBpcyBGRlQgcmFkMiBmcm9tIEZES190b29scy4KKyAgQnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggYXJlIGJhc2VkIG9uIGEgc2luZ2xlLCBzdGFuZGFyZCBjb21wbGV4CisgIEZGVC1rZXJuZWwgYXJlIHVzZWQgKGRjdElJX2YoKSBhbmQgZGN0SUlJX2YoKSkuIFRoZXNlIGFyZSBzcGVjaWZpY2FsbHkgaGVscGZ1bAorICBpbiBjYXNlcyB3aGVyZSBvcHRpbWl6ZWQgRkZUIGxpYnJhcmllcyBhcmUgYWxyZWFkeSBhdmFpbGFibGUuIFRoZSBGRlQgdXNlZCBpbgorICB0aGVzZSBpbXBsZW1lbnRhdGlvbiBpcyBGRlQgcmFkMiBmcm9tIEZES190b29scy4KIAotICBPZiBjb3Vyc2UsIG9uZSBtaWdodCBhbHNvIHVzZSBEQ1QtbGlicmFyaWVzIHNob3VsZCB0aGV5IGJlIGF2YWlsYWJsZS4gVGhlIERDVCBhbmQgRFNUCi0gIHR5cGUgSVYgaW1wbGVtZW50YXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBhIHZlcnNpb24gYmFzZWQgb24gYSBjb21wbGV4IEZGVCBrZXJuZWwuCisgIE9mIGNvdXJzZSwgb25lIG1pZ2h0IGFsc28gdXNlIERDVC1saWJyYXJpZXMgc2hvdWxkIHRoZXkgYmUgYXZhaWxhYmxlLiBUaGUgRENUCisgIGFuZCBEU1QgdHlwZSBJViBpbXBsZW1lbnRhdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGEgdmVyc2lvbiBiYXNlZCBvbiBhCisgIGNvbXBsZXggRkZUIGtlcm5lbC4KICovCiAKICNpbmNsdWRlICJkY3QuaCIKIAotCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogI2luY2x1ZGUgImZmdC5oIgogCi0KICNpZiBkZWZpbmVkKF9fYXJtX18pCiAjaW5jbHVkZSAiYXJtL2RjdF9hcm0uY3BwIgogI2VuZGlmCiAKK3ZvaWQgZGN0X2dldFRhYmxlcyhjb25zdCBGSVhQX1dUUCAqKnB0d2lkZGxlLCBjb25zdCBGSVhQX1NUUCAqKnNpbl90d2lkZGxlLAorICAgICAgICAgICAgICAgICAgIGludCAqc2luX3N0ZXAsIGludCBsZW5ndGgpIHsKKyAgY29uc3QgRklYUF9XVFAgKnR3aWRkbGU7CisgIGludCBsZDJfbGVuZ3RoOworCisgIC8qIEdldCBsZDIgb2YgbGVuZ3RoIC0gMiArIDEKKyAgICAgIC0yOiBiZWNhdXNlIGZpcnN0IHRhYmxlIGVudHJ5IGlzIHdpbmRvdyBvZiBzaXplIDQKKyAgICAgICsxOiBiZWNhdXNlIHdlIGFscmVhZHkgaW5jbHVkZSArMSBiZWNhdXNlIG9mIGNlaWwobG9nMihsZW5ndGgpKSAqLworICBsZDJfbGVuZ3RoID0gREZSQUNUX0JJVFMgLSAxIC0gZk5vcm16KChGSVhQX0RCTClsZW5ndGgpIC0gMTsKKworICAvKiBFeHRyYWN0IHNvcnQgb2YgImVpZ2VudmFsdWUiICh0aGUgNCBsZWZ0IG1vc3QgYml0cykgb2YgbGVuZ3RoLiAqLworICBzd2l0Y2ggKChsZW5ndGgpID4+IChsZDJfbGVuZ3RoIC0gMSkpIHsKKyAgICBjYXNlIDB4NDogLyogcmFkaXggMiAqLworICAgICAgKnNpbl90d2lkZGxlID0gU2luZVRhYmxlMTAyNDsKKyAgICAgICpzaW5fc3RlcCA9IDEgPDwgKDEwIC0gbGQyX2xlbmd0aCk7CisgICAgICB0d2lkZGxlID0gd2luZG93U2xvcGVzWzBdWzBdW2xkMl9sZW5ndGggLSAxXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg3OiAvKiAxMCBtcyAqLworICAgICAgKnNpbl90d2lkZGxlID0gU2luZVRhYmxlNDgwOworICAgICAgKnNpbl9zdGVwID0gMSA8PCAoOCAtIGxkMl9sZW5ndGgpOworICAgICAgdHdpZGRsZSA9IHdpbmRvd1Nsb3Blc1swXVsxXVtsZDJfbGVuZ3RoXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2OiAvKiAzLzQgb2YgcmFkaXggMiAqLworICAgICAgKnNpbl90d2lkZGxlID0gU2luZVRhYmxlMzg0OworICAgICAgKnNpbl9zdGVwID0gMSA8PCAoOCAtIGxkMl9sZW5ndGgpOworICAgICAgdHdpZGRsZSA9IHdpbmRvd1Nsb3Blc1swXVsyXVtsZDJfbGVuZ3RoXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg1OiAvKiA1LzE2IG9mIHJhZGl4IDIqLworICAgICAgKnNpbl90d2lkZGxlID0gU2luZVRhYmxlODA7CisgICAgICAqc2luX3N0ZXAgPSAxIDw8ICg2IC0gbGQyX2xlbmd0aCk7CisgICAgICB0d2lkZGxlID0gd2luZG93U2xvcGVzWzBdWzNdW2xkMl9sZW5ndGhdOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICpzaW5fdHdpZGRsZSA9IE5VTEw7CisgICAgICAqc2luX3N0ZXAgPSAwOworICAgICAgdHdpZGRsZSA9IE5VTEw7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChwdHdpZGRsZSAhPSBOVUxMKSB7CisgICAgRkRLX0FTU0VSVCh0d2lkZGxlICE9IE5VTEwpOworICAgICpwdHdpZGRsZSA9IHR3aWRkbGU7CisgIH0KKworICBGREtfQVNTRVJUKCpzaW5fc3RlcCA+IDApOworfQogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZGN0X0lJSSkKIHZvaWQgZGN0X0lJSShGSVhQX0RCTCAqcERhdCwgLyohPCBwb2ludGVyIHRvIGlucHV0L291dHB1dCAqLwogICAgICAgICAgICAgIEZJWFBfREJMICp0bXAsICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KICAgICAgICAgICAgICBpbnQgTCwgICAgICAgICAgLyohPCBsZW5naHQgb2YgdHJhbnNmb3JtICovCi0gICAgICAgICAgICAgaW50ICpwRGF0X2UKLSAgICAgICAgICAgICApCi17Ci0gIEZES19BU1NFUlQoTCA9PSA2NCB8fCBMID09IDMyKTsKLSAgaW50ICBpOworICAgICAgICAgICAgIGludCAqcERhdF9lKSB7CisgIGNvbnN0IEZJWFBfV1RQICpzaW5fdHdpZGRsZTsKKyAgaW50IGk7CiAgIEZJWFBfREJMIHhyLCBhY2N1MSwgYWNjdTI7Ci0gIGludCBpbmM7Ci0gIGludCBNID0gTD4+MTsKLSAgaW50IGxkX007CisgIGludCBpbmMsIGluZGV4OworICBpbnQgTSA9IEwgPj4gMTsKIAotICBpZiAoTCA9PSA2NCkgIGxkX00gPSA1OwotICBlbHNlICAgICAgICAgIGxkX00gPSA0OwotCi0gIC8qIFRoaXMgbG9vcCBwZXJmb3JtcyBtdWx0aXBsaWNhdGlvbiBmb3IgaW5kZXggaSAoaSppbmMpICovCi0gIGluYyA9ICg2NC8yKSA+PiBsZF9NOyAvKiA2NC9MICovCisgIEZES19BU1NFUlQoTCAlIDQgPT0gMCk7CisgIGRjdF9nZXRUYWJsZXMoTlVMTCwgJnNpbl90d2lkZGxlLCAmaW5jLCBMKTsKKyAgaW5jID4+PSAxOwogCiAgIEZJWFBfREJMICpwVG1wXzAgPSAmdG1wWzJdOwotICBGSVhQX0RCTCAqcFRtcF8xID0gJnRtcFsoTS0xKSoyXTsKKyAgRklYUF9EQkwgKnBUbXBfMSA9ICZ0bXBbKE0gLSAxKSAqIDJdOwogCi0gIGZvcihpPTE7IGk8TT4+MTsgaSsrLHBUbXBfMCs9MixwVG1wXzEtPTIpIHsKKyAgaW5kZXggPSA0ICogaW5jOwogCi0gICAgRklYUF9EQkwgYWNjdTMsYWNjdTQsYWNjdTUsYWNjdTY7CisgIC8qIFRoaXMgbG9vcCBwZXJmb3JtcyBtdWx0aXBsaWNhdGlvbiBmb3IgaW5kZXggaSAoaSppbmMpICovCisgIGZvciAoaSA9IDE7IGk8TT4+IDE7IGkrKywgcFRtcF8wICs9IDIsIHBUbXBfMSAtPSAyKSB7CisgICAgRklYUF9EQkwgYWNjdTMsIGFjY3U0LCBhY2N1NSwgYWNjdTY7CiAKLSAgICBjcGx4TXVsdERpdjIoJmFjY3UyLCAmYWNjdTEsIHBEYXRbTCAtIGldLCBwRGF0W2ldLCBzaW5fdHdpZGRsZV9MNjRbaSppbmNdKTsKLSAgICBjcGx4TXVsdERpdjIoJmFjY3U0LCAmYWNjdTMsIHBEYXRbTStpXSwgcERhdFtNLWldLCBzaW5fdHdpZGRsZV9MNjRbKE0taSkqaW5jXSk7Ci0gICAgYWNjdTMgPj49IDE7IGFjY3U0ID4+PSAxOworICAgIGNwbHhNdWx0RGl2MigmYWNjdTIsICZhY2N1MSwgcERhdFtMIC0gaV0sIHBEYXRbaV0sIHNpbl90d2lkZGxlW2kgKiBpbmNdKTsKKyAgICBjcGx4TXVsdERpdjIoJmFjY3U0LCAmYWNjdTMsIHBEYXRbTSArIGldLCBwRGF0W00gLSBpXSwKKyAgICAgICAgICAgICAgICAgc2luX3R3aWRkbGVbKE0gLSBpKSAqIGluY10pOworICAgIGFjY3UzID4+PSAxOworICAgIGFjY3U0ID4+PSAxOwogCi0gICAgLyogVGhpcyBtZXRob2QgaXMgYmV0dGVyIGZvciBBUk05MjYsIHRoYXQgdXNlcyBvcGVyYW5kMiBzaGlmdGVkIHJpZ2h0IGJ5IDEgYWx3YXlzICovCi0gICAgY3BseE11bHREaXYyKCZhY2N1NiwgJmFjY3U1LCAoYWNjdTMgLSAoYWNjdTE+PjEpKSwgKChhY2N1Mj4+MSkgKyBhY2N1NCksIHNpbl90d2lkZGxlX0w2NFsoNCppKSppbmNdKTsKLSAgICB4ciA9IChhY2N1MT4+MSkgKyBhY2N1MzsKLSAgICBwVG1wXzBbMF0gPSAoeHI+PjEpIC0gYWNjdTU7Ci0gICAgcFRtcF8xWzBdID0gKHhyPj4xKSArIGFjY3U1OworICAgIC8qIFRoaXMgbWV0aG9kIGlzIGJldHRlciBmb3IgQVJNOTI2LCB0aGF0IHVzZXMgb3BlcmFuZDIgc2hpZnRlZCByaWdodCBieSAxCisgICAgICogYWx3YXlzICovCisgICAgaWYgKDIgKiBpIDwgKE0gLyAyKSkgeworICAgICAgY3BseE11bHREaXYyKCZhY2N1NiwgJmFjY3U1LCAoYWNjdTMgLSAoYWNjdTEgPj4gMSkpLAorICAgICAgICAgICAgICAgICAgICgoYWNjdTIgPj4gMSkgKyBhY2N1NCksIHNpbl90d2lkZGxlW2luZGV4XSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTYsICZhY2N1NSwgKChhY2N1MiA+PiAxKSArIGFjY3U0KSwKKyAgICAgICAgICAgICAgICAgICAoYWNjdTMgLSAoYWNjdTEgPj4gMSkpLCBzaW5fdHdpZGRsZVtpbmRleF0pOworICAgICAgYWNjdTYgPSAtYWNjdTY7CisgICAgfQorICAgIHhyID0gKGFjY3UxID4+IDEpICsgYWNjdTM7CisgICAgcFRtcF8wWzBdID0gKHhyID4+IDEpIC0gYWNjdTU7CisgICAgcFRtcF8xWzBdID0gKHhyID4+IDEpICsgYWNjdTU7CiAKLSAgICB4ciA9IChhY2N1Mj4+MSkgLSBhY2N1NDsKLSAgICBwVG1wXzBbMV0gPSAgKHhyPj4xKSAtIGFjY3U2OwotICAgIHBUbXBfMVsxXSA9IC0oKHhyPj4xKSArIGFjY3U2KTsKKyAgICB4ciA9IChhY2N1MiA+PiAxKSAtIGFjY3U0OworICAgIHBUbXBfMFsxXSA9ICh4ciA+PiAxKSAtIGFjY3U2OworICAgIHBUbXBfMVsxXSA9IC0oKHhyID4+IDEpICsgYWNjdTYpOwogCisgICAgLyogQ3JlYXRlIGluZGV4IGhlbHBlciB2YXJpYWJsZXMgZm9yICg0KmkpKmluYyBpbmRleGVkIGVxdWl2YWxlbnQgdmFsdWVzIG9mCisgICAgICogc2hvcnQgdGFibGVzLiAqLworICAgIGlmICgyICogaSA8ICgoTSAvIDIpIC0gMSkpIHsKKyAgICAgIGluZGV4ICs9IDQgKiBpbmM7CisgICAgfSBlbHNlIGlmICgyICogaSA+PSAoKE0gLyAyKSkpIHsKKyAgICAgIGluZGV4IC09IDQgKiBpbmM7CisgICAgfQogICB9CiAKLSAgeHIgICAgID0gZk11bHREaXYyKHBEYXRbTV0sIHNpbl90d2lkZGxlX0w2NFs2NC8yXS52LnJlICk7LyogY29zKChQSS8oMipMKSkqTSk7ICovCi0gIHRtcFswXSA9ICgocERhdFswXT4+MSkgKyB4cik+PjE7Ci0gIHRtcFsxXSA9ICgocERhdFswXT4+MSkgLSB4cik+PjE7CisgIHhyID0gZk11bHREaXYyKHBEYXRbTV0sIHNpbl90d2lkZGxlW00gKiBpbmNdLnYucmUpOyAvKiBjb3MoKFBJLygyKkwpKSpNKTsgKi8KKyAgdG1wWzBdID0gKChwRGF0WzBdID4+IDEpICsgeHIpID4+IDE7CisgIHRtcFsxXSA9ICgocERhdFswXSA+PiAxKSAtIHhyKSA+PiAxOwogCi0gIGNwbHhNdWx0RGl2MigmYWNjdTIsICZhY2N1MSwgcERhdFtMIC0gKE0vMildLCBwRGF0W00vMl0sIHNpbl90d2lkZGxlX0w2NFs2NC80XSk7Ci0gIHRtcFtNXSAgID0gYWNjdTE+PjE7Ci0gIHRtcFtNKzFdID0gYWNjdTI+PjE7CisgIGNwbHhNdWx0RGl2MigmYWNjdTIsICZhY2N1MSwgcERhdFtMIC0gKE0gLyAyKV0sIHBEYXRbTSAvIDJdLAorICAgICAgICAgICAgICAgc2luX3R3aWRkbGVbTSAqIGluYyAvIDJdKTsKKyAgdG1wW01dID0gYWNjdTEgPj4gMTsKKyAgdG1wW00gKyAxXSA9IGFjY3UyID4+IDE7CiAKICAgLyogZGl0X2ZmdCBleHBlY3RzIDEgYml0IHNjYWxlZCBpbnB1dCB2YWx1ZXMgKi8KICAgZmZ0KE0sIHRtcCwgcERhdF9lKTsKIAogICAvKiBBUk05MjY6IDEyIGN5Y2xlcyBwZXIgMi1pdGVyYXRpb24sIG5vIG92ZXJoZWFkIGNvZGUgYnkgY29tcGlsZXIgKi8KICAgcFRtcF8xID0gJnRtcFtMXTsKLSAgZm9yIChpID0gTT4+MTsgaS0tOykKLSAgeworICBmb3IgKGkgPSBNID4+IDE7IGktLTspIHsKICAgICBGSVhQX0RCTCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwogICAgIHRtcDEgPSAqdG1wKys7CiAgICAgdG1wMiA9ICp0bXArKzsKQEAgLTE4MCwxMzEgKzI2MCwxMjEgQEAKIAogICAqcERhdF9lICs9IDI7CiB9CisKK3ZvaWQgZHN0X0lJSShGSVhQX0RCTCAqcERhdCwgLyohPCBwb2ludGVyIHRvIGlucHV0L291dHB1dCAqLworICAgICAgICAgICAgIEZJWFBfREJMICp0bXAsICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KKyAgICAgICAgICAgICBpbnQgTCwgICAgICAgICAgLyohPCBsZW5naHQgb2YgdHJhbnNmb3JtICovCisgICAgICAgICAgICAgaW50ICpwRGF0X2UpIHsKKyAgaW50IEwyID0gTCA+PiAxOworICBpbnQgaTsKKyAgRklYUF9EQkwgdDsKKworICAvKiBub3RlOiBEQ1QgSUlJIGlzIHJldXNlZCBoZXJlLCBkaXJlY3QgRFNUIElJSSBpbXBsZW1lbnRhdGlvbiBtaWdodCBiZSBtb3JlCisgICAqIGVmZmljaWVudCAqLworCisgIC8qIG1pcnJvciBpbnB1dCAqLworICBmb3IgKGkgPSAwOyBpIDwgTDI7IGkrKykgeworICAgIHQgPSBwRGF0W2ldOworICAgIHBEYXRbaV0gPSBwRGF0W0wgLSAxIC0gaV07CisgICAgcERhdFtMIC0gMSAtIGldID0gdDsKKyAgfQorCisgIC8qIERDVC1JSUkgKi8KKyAgZGN0X0lJSShwRGF0LCB0bXAsIEwsIHBEYXRfZSk7CisKKyAgLyogZmxpcCBzaWducyBhdCBvZGQgaW5kaWNlcyAqLworICBmb3IgKGkgPSAxOyBpIDwgTDsgaSArPSAyKSBwRGF0W2ldID0gLXBEYXRbaV07Cit9CisKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZGN0X0lJKQotdm9pZCBkY3RfSUkoRklYUF9EQkwgKnBEYXQsIC8qITwgcG9pbnRlciB0byBpbnB1dC9vdXRwdXQgKi8KLSAgICAgICAgICAgIEZJWFBfREJMICp0bXAsICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KLSAgICAgICAgICAgIGludCBMLCAgICAgICAgICAvKiE8IGxlbmdodCBvZiB0cmFuc2Zvcm0gKi8KLSAgICAgICAgICAgIGludCAqcERhdF9lCi0gICAgICAgICAgICApCi17Ci0gICAgRkRLX0FTU0VSVChMID09IDY0IHx8IEwgPT0gMzIpOwotICAgIEZJWFBfREJMIGFjY3UxLGFjY3UyOwotICAgIEZJWFBfREJMICpwVG1wXzAsICpwVG1wXzE7Cit2b2lkIGRjdF9JSSgKKyAgICBGSVhQX0RCTCAqcERhdCwgLyohPCBwb2ludGVyIHRvIGlucHV0L291dHB1dCAqLworICAgIEZJWFBfREJMICp0bXAsICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KKyAgICBpbnQgTCwgLyohPCBsZW5naHQgb2YgdHJhbnNmb3JtIChoYXMgdG8gYmUgYSBtdWx0aXBsZSBvZiA4IChvciA0IGluIGNhc2UKKyAgICAgICAgICAgICAgRENUX0lJX0xfTVVMVElQTEVfT0ZfNF9TVVBQT1JUIGlzIGRlZmluZWQpICovCisgICAgaW50ICpwRGF0X2UpIHsKKyAgY29uc3QgRklYUF9XVFAgKnNpbl90d2lkZGxlOworICBGSVhQX0RCTCBhY2N1MSwgYWNjdTI7CisgIEZJWFBfREJMICpwVG1wXzAsICpwVG1wXzE7CiAKLSAgICBpbnQgaTsKLSAgICBpbnQgaW5jOwotICAgIGludCBNID0gIEw+PjE7Ci0gICAgaW50IGxkX007CisgIGludCBpOworICBpbnQgaW5jLCBpbmRleCA9IDA7CisgIGludCBNID0gTCA+PiAxOwogCi0gICAgRkRLX0FTU0VSVChMID09IDY0IHx8IEwgPT0gMzIpOwotICAgIGxkX00gPSA0ICsgKEwgPj4gNik7ICAvKiBMPTY0OiA1LCAgTD0zMjogNCAqLworICBGREtfQVNTRVJUKEwgJSA0ID09IDApOworICBkY3RfZ2V0VGFibGVzKE5VTEwsICZzaW5fdHdpZGRsZSwgJmluYywgTCk7CisgIGluYyA+Pj0gMTsKIAotICAgIGluYyA9ICg2NC8yKSA+PiBsZF9NOyAvKiBMPTY0OiAxLCAgTD0zMjogMiAqLworICB7CisgICAgZm9yIChpID0gMDsgaSA8IE07IGkrKykgeworICAgICAgdG1wW2ldID0gcERhdFsyICogaV0gPj4gMTsgLyogZGl0X2ZmdCBleHBlY3RzIDEgYml0IHNjYWxlZCBpbnB1dCB2YWx1ZXMgKi8KKyAgICAgIHRtcFtMIC0gMSAtIGldID0KKyAgICAgICAgICBwRGF0WzIgKiBpICsgMV0gPj4gMTsgLyogZGl0X2ZmdCBleHBlY3RzIDEgYml0IHNjYWxlZCBpbnB1dCB2YWx1ZXMgKi8KKyAgICB9CisgIH0KIAotICAgIEZJWFBfREJMICpwZGF0ICA9ICZwRGF0WzBdOworICBmZnQoTSwgdG1wLCBwRGF0X2UpOworCisgIHBUbXBfMCA9ICZ0bXBbMl07CisgIHBUbXBfMSA9ICZ0bXBbKE0gLSAxKSAqIDJdOworCisgIGluZGV4ID0gaW5jICogNDsKKworICBmb3IgKGkgPSAxOyBpPE0+PiAxOyBpKyssIHBUbXBfMCArPSAyLCBwVG1wXzEgLT0gMikgeworICAgIEZJWFBfREJMIGExLCBhMjsKICAgICBGSVhQX0RCTCBhY2N1MywgYWNjdTQ7Ci0gICAgcFRtcF8wID0gJnRtcFswXTsKLSAgICBwVG1wXzEgPSAmdG1wW0wtMV07Ci0gICAgZm9yIChpID0gTT4+MTsgaS0tOyApCi0gICAgewotICAgICAgYWNjdTEgPSAqcGRhdCsrOwotICAgICAgYWNjdTIgPSAqcGRhdCsrOwotICAgICAgYWNjdTMgPSAqcGRhdCsrOwotICAgICAgYWNjdTQgPSAqcGRhdCsrOwotICAgICAgYWNjdTEgPj49IDE7Ci0gICAgICBhY2N1MiA+Pj0gMTsKLSAgICAgIGFjY3UzID4+PSAxOwotICAgICAgYWNjdTQgPj49IDE7Ci0gICAgICAqcFRtcF8wKysgPSBhY2N1MTsKLSAgICAgICpwVG1wXzArKyA9IGFjY3UzOwotICAgICAgKnBUbXBfMS0tID0gYWNjdTI7Ci0gICAgICAqcFRtcF8xLS0gPSBhY2N1NDsKKworICAgIGExID0gKChwVG1wXzBbMV0gPj4gMSkgKyAocFRtcF8xWzFdID4+IDEpKTsKKyAgICBhMiA9ICgocFRtcF8xWzBdID4+IDEpIC0gKHBUbXBfMFswXSA+PiAxKSk7CisKKyAgICBpZiAoMiAqIGkgPCAoTSAvIDIpKSB7CisgICAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIGEyLCBhMSwgc2luX3R3aWRkbGVbaW5kZXhdKTsKKyAgICB9IGVsc2UgeworICAgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBhMSwgYTIsIHNpbl90d2lkZGxlW2luZGV4XSk7CisgICAgICBhY2N1MSA9IC1hY2N1MTsKICAgICB9CisgICAgYWNjdTEgPDw9IDE7CisgICAgYWNjdTIgPDw9IDE7CiAKKyAgICBhMSA9ICgocFRtcF8wWzBdID4+IDEpICsgKHBUbXBfMVswXSA+PiAxKSk7CisgICAgYTIgPSAoKHBUbXBfMFsxXSA+PiAxKSAtIChwVG1wXzFbMV0gPj4gMSkpOwogCi0gICAgZmZ0KE0sIHRtcCwgcERhdF9lKTsKKyAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIChhMSArIGFjY3UyKSwgLShhY2N1MSArIGEyKSwKKyAgICAgICAgICAgICAgICAgc2luX3R3aWRkbGVbaSAqIGluY10pOworICAgIHBEYXRbTCAtIGldID0gYWNjdTQ7CisgICAgcERhdFtpXSA9IGFjY3UzOwogCi0gICAgcFRtcF8wID0gJnRtcFsyXTsKLSAgICBwVG1wXzEgPSAmdG1wWyhNLTEpKjJdOworICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgKGExIC0gYWNjdTIpLCAtKGFjY3UxIC0gYTIpLAorICAgICAgICAgICAgICAgICBzaW5fdHdpZGRsZVsoTSAtIGkpICogaW5jXSk7CisgICAgcERhdFtNICsgaV0gPSBhY2N1NDsKKyAgICBwRGF0W00gLSBpXSA9IGFjY3UzOwogCi0gICAgZm9yIChpPTE7IGk8TT4+MTsgaSsrLHBUbXBfMCs9MixwVG1wXzEtPTIpIHsKLQotICAgICAgRklYUF9EQkwgYTEsYTI7Ci0gICAgICBGSVhQX0RCTCBhY2N1MywgYWNjdTQ7Ci0KLSAgICAgIGExID0gKChwVG1wXzBbMV0+PjEpICsgKHBUbXBfMVsxXT4+MSkpOwotICAgICAgYTIgPSAoKHBUbXBfMVswXT4+MSkgLSAocFRtcF8wWzBdPj4xKSk7Ci0KLSAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgYTIsIGExLCBzaW5fdHdpZGRsZV9MNjRbKDQqaSkqaW5jXSk7Ci0gICAgICBhY2N1MTw8PTE7IGFjY3UyPDw9MTsKLQotICAgICAgYTEgPSAoKHBUbXBfMFswXT4+MSkgKyAocFRtcF8xWzBdPj4xKSk7Ci0gICAgICBhMiA9ICgocFRtcF8wWzFdPj4xKSAtIChwVG1wXzFbMV0+PjEpKTsKLQotICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCAoYTEgKyBhY2N1MiksIC0oYWNjdTEgKyBhMiksIHNpbl90d2lkZGxlX0w2NFtpKmluY10pOwotICAgICAgcERhdFtMIC0gaV0gPSBhY2N1NDsKLSAgICAgIHBEYXRbaV0gICAgID0gYWNjdTM7Ci0KLSAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgKGExIC0gYWNjdTIpLCAtKGFjY3UxIC0gYTIpLCBzaW5fdHdpZGRsZV9MNjRbKE0taSkqaW5jXSk7Ci0gICAgICBwRGF0W00gKyBpXSA9IGFjY3U0OwotICAgICAgcERhdFtNIC0gaV0gPSBhY2N1MzsKLQorICAgIC8qIENyZWF0ZSBpbmRleCBoZWxwZXIgdmFyaWFibGVzIGZvciAoNCppKSppbmMgaW5kZXhlZCBlcXVpdmFsZW50IHZhbHVlcyBvZgorICAgICAqIHNob3J0IHRhYmxlcy4gKi8KKyAgICBpZiAoMiAqIGkgPCAoKE0gLyAyKSAtIDEpKSB7CisgICAgICBpbmRleCArPSA0ICogaW5jOworICAgIH0gZWxzZSBpZiAoMiAqIGkgPj0gKChNIC8gMikpKSB7CisgICAgICBpbmRleCAtPSA0ICogaW5jOwogICAgIH0KKyAgfQogCi0gICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCB0bXBbTV0sIHRtcFtNKzFdLCBzaW5fdHdpZGRsZV9MNjRbKE0vMikqaW5jXSk7Ci0gICAgcERhdFtMIC0gKE0vMildID0gYWNjdTI7Ci0gICAgcERhdFtNLzJdICAgICAgID0gYWNjdTE7CisgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgdG1wW01dLCB0bXBbTSArIDFdLCBzaW5fdHdpZGRsZVsoTSAvIDIpICogaW5jXSk7CisgIHBEYXRbTCAtIChNIC8gMildID0gYWNjdTI7CisgIHBEYXRbTSAvIDJdID0gYWNjdTE7CiAKLSAgICBwRGF0WzBdID0gKHRtcFswXT4+MSkrKHRtcFsxXT4+MSk7Ci0gICAgcERhdFtNXSA9ICBmTXVsdCgoKHRtcFswXT4+MSktKHRtcFsxXT4+MSkpLCBzaW5fdHdpZGRsZV9MNjRbNjQvMl0udi5yZSk7LyogY29zKChQSS8oMipMKSkqTSk7ICovCisgIHBEYXRbMF0gPSAodG1wWzBdID4+IDEpICsgKHRtcFsxXSA+PiAxKTsKKyAgcERhdFtNXSA9IGZNdWx0KCgodG1wWzBdID4+IDEpIC0gKHRtcFsxXSA+PiAxKSksCisgICAgICAgICAgICAgICAgICBzaW5fdHdpZGRsZVtNICogaW5jXS52LnJlKTsgLyogY29zKChQSS8oMipMKSkqTSk7ICovCiAKLSAgICAqcERhdF9lICs9IDI7CisgICpwRGF0X2UgKz0gMjsKIH0KICNlbmRpZgogCi1zdGF0aWMKLXZvaWQgZ2V0VGFibGVzKGNvbnN0IEZJWFBfV1RQICoqdHdpZGRsZSwgY29uc3QgRklYUF9TVFAgKipzaW5fdHdpZGRsZSwgaW50ICpzaW5fc3RlcCwgaW50IGxlbmd0aCkKLXsKLSAgaW50IGxkMl9sZW5ndGg7Ci0KLSAvKiBHZXQgbGQyIG9mIGxlbmd0aCAtIDIgKyAxCi0gICAgIC0yOiBiZWNhdXNlIGZpcnN0IHRhYmxlIGVudHJ5IGlzIHdpbmRvdyBvZiBzaXplIDQKLSAgICAgKzE6IGJlY2F1c2Ugd2UgYWxyZWFkeSBpbmNsdWRlICsxIGJlY2F1c2Ugb2YgY2VpbChsb2cyKGxlbmd0aCkpICovCi0gIGxkMl9sZW5ndGggPSBERlJBQ1RfQklUUy0xLWZOb3JteigoRklYUF9EQkwpbGVuZ3RoKSAtIDE7Ci0KLSAgLyogRXh0cmFjdCBzb3J0IG9mICJlaWdlbnZhbHVlIiAodGhlIDQgbGVmdCBtb3N0IGJpdHMpIG9mIGxlbmd0aC4gKi8KLSAgc3dpdGNoICggKGxlbmd0aCkgPj4gKGxkMl9sZW5ndGgtMSkgKSB7Ci0gICAgY2FzZSAweDQ6IC8qIHJhZGl4IDIgKi8KLSAgICAgICpzaW5fdHdpZGRsZSA9IFNpbmVUYWJsZTUxMjsKLSAgICAgICpzaW5fc3RlcCA9IDE8PCg5IC0gbGQyX2xlbmd0aCk7Ci0gICAgICAqdHdpZGRsZSA9IHdpbmRvd1Nsb3Blc1swXVswXVtsZDJfbGVuZ3RoLTFdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDc6IC8qIDEwIG1zICovCi0gICAgICAqc2luX3R3aWRkbGUgPSBTaW5lVGFibGU0ODA7Ci0gICAgICAqc2luX3N0ZXAgPSAxPDwoOCAtIGxkMl9sZW5ndGgpOwotICAgICAgKnR3aWRkbGUgPSB3aW5kb3dTbG9wZXNbMF1bMV1bbGQyX2xlbmd0aF07Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgKnNpbl90d2lkZGxlID0gTlVMTDsKLSAgICAgICpzaW5fc3RlcCA9IDA7Ci0gICAgICAqdHdpZGRsZSA9IE5VTEw7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIEZES19BU1NFUlQoKnR3aWRkbGUgIT0gTlVMTCk7Ci0KLSAgRkRLX0FTU0VSVCgqc2luX3N0ZXAgPiAwKTsKLQotfQotCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZGN0X0lWKQogCi12b2lkIGRjdF9JVihGSVhQX0RCTCAqcERhdCwKLSAgICAgICAgICAgIGludCBMLAotICAgICAgICAgICAgaW50ICpwRGF0X2UpCi17Cit2b2lkIGRjdF9JVihGSVhQX0RCTCAqcERhdCwgaW50IEwsIGludCAqcERhdF9lKSB7CiAgIGludCBzaW5fc3RlcCA9IDA7CiAgIGludCBNID0gTCA+PiAxOwogCkBAIC0zMTMsMTIgKzM4MywxNCBAQAogCiAgIEZES19BU1NFUlQoTCA+PSA0KTsKIAotICBnZXRUYWJsZXMoJnR3aWRkbGUsICZzaW5fdHdpZGRsZSwgJnNpbl9zdGVwLCBMKTsKKyAgRkRLX0FTU0VSVChMID49IDQpOworCisgIGRjdF9nZXRUYWJsZXMoJnR3aWRkbGUsICZzaW5fdHdpZGRsZSwgJnNpbl9zdGVwLCBMKTsKIAogI2lmZGVmIEZVTkNUSU9OX2RjdF9JVl9mdW5jMQotICBpZiAoTT49NCAmJiAoTSYzKSA9PSAwKSB7Ci0gICAgIC8qIEFSTTkyNjogNDQgY3ljbGVzIGZvciAyIGl0ZXJhdGlvbnMgPSAyMiBjeWNsZXMvaXRlcmF0aW9uICovCi0gICAgZGN0X0lWX2Z1bmMxKE0+PjIsIHR3aWRkbGUsICAmcERhdFswXSwgJnBEYXRbTC0xXSk7CisgIGlmIChNID49IDQgJiYgKE0gJiAzKSA9PSAwKSB7CisgICAgLyogQVJNOTI2OiA0NCBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDIyIGN5Y2xlcy9pdGVyYXRpb24gKi8KKyAgICBkY3RfSVZfZnVuYzEoTSA+PiAyLCB0d2lkZGxlLCAmcERhdFswXSwgJnBEYXRbTCAtIDFdKTsKICAgfSBlbHNlCiAjZW5kaWYgLyogRlVOQ1RJT05fZGN0X0lWX2Z1bmMxICovCiAgIHsKQEAgLTMyNyw2MyArMzk5LDY1IEBACiAgICAgaW50IGk7CiAKICAgICAvKiAyOSBjeWNsZXMgb24gQVJNOTI2ICovCi0gICAgZm9yIChpID0gMDsgaSA8IE0tMTsgaSs9MixwRGF0XzArPTIscERhdF8xLT0yKQotICAgIHsKLSAgICAgIEZJWFBfREJMIGFjY3UxLGFjY3UyLGFjY3UzLGFjY3U0OworICAgIGZvciAoaSA9IDA7IGkgPCBNIC0gMTsgaSArPSAyLCBwRGF0XzAgKz0gMiwgcERhdF8xIC09IDIpIHsKKyAgICAgIEZJWFBfREJMIGFjY3UxLCBhY2N1MiwgYWNjdTMsIGFjY3U0OwogCi0gICAgICBhY2N1MSA9IHBEYXRfMVsxXTsgYWNjdTIgPSBwRGF0XzBbMF07Ci0gICAgICBhY2N1MyA9IHBEYXRfMFsxXTsgYWNjdTQgPSBwRGF0XzFbMF07CisgICAgICBhY2N1MSA9IHBEYXRfMVsxXTsKKyAgICAgIGFjY3UyID0gcERhdF8wWzBdOworICAgICAgYWNjdTMgPSBwRGF0XzBbMV07CisgICAgICBhY2N1NCA9IHBEYXRfMVswXTsKIAogICAgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBhY2N1MSwgYWNjdTIsIHR3aWRkbGVbaV0pOwotICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBhY2N1NCwgYWNjdTMsIHR3aWRkbGVbaSsxXSk7CisgICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIGFjY3U0LCBhY2N1MywgdHdpZGRsZVtpICsgMV0pOwogCi0gICAgICBwRGF0XzBbMF0gPSBhY2N1MjsgcERhdF8wWzFdID0gYWNjdTE7Ci0gICAgICBwRGF0XzFbMF0gPSBhY2N1NDsgcERhdF8xWzFdID0gLWFjY3UzOworICAgICAgcERhdF8wWzBdID0gYWNjdTI7CisgICAgICBwRGF0XzBbMV0gPSBhY2N1MTsKKyAgICAgIHBEYXRfMVswXSA9IGFjY3U0OworICAgICAgcERhdF8xWzFdID0gLWFjY3UzOwogICAgIH0KLSAgICBpZiAoTSYxKQotICAgIHsKLSAgICAgIEZJWFBfREJMIGFjY3UxLGFjY3UyOworICAgIGlmIChNICYgMSkgeworICAgICAgRklYUF9EQkwgYWNjdTEsIGFjY3UyOwogCi0gICAgICBhY2N1MSA9IHBEYXRfMVsxXTsgYWNjdTIgPSBwRGF0XzBbMF07CisgICAgICBhY2N1MSA9IHBEYXRfMVsxXTsKKyAgICAgIGFjY3UyID0gcERhdF8wWzBdOwogCiAgICAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIGFjY3UxLCBhY2N1MiwgdHdpZGRsZVtpXSk7CiAKLSAgICAgIHBEYXRfMFswXSA9IGFjY3UyOyBwRGF0XzBbMV0gPSBhY2N1MTsKKyAgICAgIHBEYXRfMFswXSA9IGFjY3UyOworICAgICAgcERhdF8wWzFdID0gYWNjdTE7CiAgICAgfQogICB9CiAKICAgZmZ0KE0sIHBEYXQsIHBEYXRfZSk7CiAKICNpZmRlZiBGVU5DVElPTl9kY3RfSVZfZnVuYzIKLSAgaWYgKE0+PTQgJiYgKE0mMykgPT0gMCkgewotICAgICAvKiBBUk05MjY6IDQyIGN5Y2xlcyBmb3IgMiBpdGVyYXRpb25zID0gMjEgY3ljbGVzL2l0ZXJhdGlvbiAqLwotICAgIGRjdF9JVl9mdW5jMihNPj4yLCBzaW5fdHdpZGRsZSwgJnBEYXRbMF0sICZwRGF0W0xdLCBzaW5fc3RlcCk7CisgIGlmIChNID49IDQgJiYgKE0gJiAzKSA9PSAwKSB7CisgICAgLyogQVJNOTI2OiA0MiBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDIxIGN5Y2xlcy9pdGVyYXRpb24gKi8KKyAgICBkY3RfSVZfZnVuYzIoTSA+PiAyLCBzaW5fdHdpZGRsZSwgJnBEYXRbMF0sICZwRGF0W0xdLCBzaW5fc3RlcCk7CiAgIH0gZWxzZQogI2VuZGlmIC8qIEZVTkNUSU9OX2RjdF9JVl9mdW5jMiAqLwogICB7CiAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMCA9ICZwRGF0WzBdOwogICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzEgPSAmcERhdFtMIC0gMl07Ci0gICAgRklYUF9EQkwgYWNjdTEsYWNjdTIsYWNjdTMsYWNjdTQ7CisgICAgRklYUF9EQkwgYWNjdTEsIGFjY3UyLCBhY2N1MywgYWNjdTQ7CiAgICAgaW50IGlkeCwgaTsKIAogICAgIC8qIFNpbiBhbmQgQ29zIHZhbHVlcyBhcmUgMC4wZiBhbmQgMS4wZiAqLwogICAgIGFjY3UxID0gcERhdF8xWzBdOwogICAgIGFjY3UyID0gcERhdF8xWzFdOwogCi0gICAgcERhdF8xWzFdID0gLShwRGF0XzBbMV0+PjEpOwotICAgIHBEYXRfMFswXSA9IChwRGF0XzBbMF0+PjEpOwotCisgICAgcERhdF8xWzFdID0gLShwRGF0XzBbMV0gPj4gMSk7CisgICAgcERhdF8wWzBdID0gKHBEYXRfMFswXSA+PiAxKTsKIAogICAgIC8qIDI4IGN5Y2xlcyBmb3IgQVJNOTI2ICovCi0gICAgZm9yIChpZHggPSBzaW5fc3RlcCxpPTE7IGk8KE0rMSk+PjE7IGkrKywgaWR4Kz1zaW5fc3RlcCkKLSAgICB7CisgICAgZm9yIChpZHggPSBzaW5fc3RlcCwgaSA9IDE7IGk8KE0gKyAxKT4+IDE7IGkrKywgaWR4ICs9IHNpbl9zdGVwKSB7CiAgICAgICBGSVhQX1NUUCB0d2QgPSBzaW5fdHdpZGRsZVtpZHhdOwogICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBhY2N1MSwgYWNjdTIsIHR3ZCk7Ci0gICAgICBwRGF0XzBbMV0gPSAgYWNjdTM7Ci0gICAgICBwRGF0XzFbMF0gPSAgYWNjdTQ7CisgICAgICBwRGF0XzBbMV0gPSBhY2N1MzsKKyAgICAgIHBEYXRfMVswXSA9IGFjY3U0OwogCi0gICAgICBwRGF0XzArPTI7Ci0gICAgICBwRGF0XzEtPTI7CisgICAgICBwRGF0XzAgKz0gMjsKKyAgICAgIHBEYXRfMSAtPSAyOwogCiAgICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBEYXRfMFsxXSwgcERhdF8wWzBdLCB0d2QpOwogCkBAIC0zOTEsMTEgKzQ2NSwxMCBAQAogICAgICAgYWNjdTIgPSBwRGF0XzFbMV07CiAKICAgICAgIHBEYXRfMVsxXSA9IC1hY2N1MzsKLSAgICAgIHBEYXRfMFswXSA9ICBhY2N1NDsKKyAgICAgIHBEYXRfMFswXSA9IGFjY3U0OwogICAgIH0KIAotICAgIGlmICggKE0mMSkgPT0gMCApCi0gICAgeworICAgIGlmICgoTSAmIDEpID09IDApIHsKICAgICAgIC8qIExhc3QgU2luIGFuZCBDb3MgdmFsdWUgcGFpciBhcmUgdGhlIHNhbWUgKi8KICAgICAgIGFjY3UxID0gZk11bHREaXYyKGFjY3UxLCBXVEMoMHg1YTgyNzk5YSkpOwogICAgICAgYWNjdTIgPSBmTXVsdERpdjIoYWNjdTIsIFdUQygweDVhODI3OTlhKSk7CkBAIC00MTEsODQgKzQ4NCw3MSBAQAogI2VuZGlmIC8qIGRlZmluZWQgKEZVTkNUSU9OX2RjdF9JVikgKi8KIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2RzdF9JVikKLXZvaWQgZHN0X0lWKEZJWFBfREJMICpwRGF0LAotICAgICAgICAgICAgaW50IEwsCi0gICAgICAgICAgICBpbnQgKnBEYXRfZSApCi17Cit2b2lkIGRzdF9JVihGSVhQX0RCTCAqcERhdCwgaW50IEwsIGludCAqcERhdF9lKSB7CiAgIGludCBzaW5fc3RlcCA9IDA7CiAgIGludCBNID0gTCA+PiAxOwogCiAgIGNvbnN0IEZJWFBfV1RQICp0d2lkZGxlOwogICBjb25zdCBGSVhQX1NUUCAqc2luX3R3aWRkbGU7CiAKLSNpZmRlZiBEU1RJVjJfRU5BQkxFCi0gIGlmIChMID09IDIpIHsKLSAgICBjb25zdCBGSVhQX1NUUCB0YWIgPSBTVENQKDB4NzY0MUFGM0QsIDB4MzBGQjk0NTIpOwotICAgIEZJWFBfREJMIHRtcDEsIHRtcDI7Ci0KLSAgICBjcGx4TXVsdERpdjIoJnRtcDIsICZ0bXAxLCBwRGF0WzBdLCBwRGF0WzFdLCB0YWIpOwotCi0gICAgcERhdFswXSA9IHRtcDE7Ci0gICAgcERhdFsxXSA9IHRtcDI7Ci0KLSAgICAqcERhdF9lICs9IDE7Ci0KLSAgICByZXR1cm47Ci0gIH0KLSNlbHNlCiAgIEZES19BU1NFUlQoTCA+PSA0KTsKLSNlbmRpZgogCi0gIGdldFRhYmxlcygmdHdpZGRsZSwgJnNpbl90d2lkZGxlLCAmc2luX3N0ZXAsIEwpOworICBGREtfQVNTRVJUKEwgPj0gNCk7CisKKyAgZGN0X2dldFRhYmxlcygmdHdpZGRsZSwgJnNpbl90d2lkZGxlLCAmc2luX3N0ZXAsIEwpOwogCiAjaWZkZWYgRlVOQ1RJT05fZHN0X0lWX2Z1bmMxCi0gIGlmICggKE0+PTQpICYmICgoTSYzKSA9PSAwKSApIHsKKyAgaWYgKChNID49IDQpICYmICgoTSAmIDMpID09IDApKSB7CiAgICAgZHN0X0lWX2Z1bmMxKE0sIHR3aWRkbGUsICZwRGF0WzBdLCAmcERhdFtMXSk7CiAgIH0gZWxzZQogI2VuZGlmCiAgIHsKICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8wID0gJnBEYXRbMF07CiAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMSA9ICZwRGF0W0wgLSAyXTsKLQogICAgIGludCBpOwogCiAgICAgLyogMzQgY3ljbGVzIG9uIEFSTTkyNiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNLTE7IGkrPTIscERhdF8wKz0yLHBEYXRfMS09MikKLSAgICB7Ci0gICAgICBGSVhQX0RCTCBhY2N1MSxhY2N1MixhY2N1MyxhY2N1NDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTSAtIDE7IGkgKz0gMiwgcERhdF8wICs9IDIsIHBEYXRfMSAtPSAyKSB7CisgICAgICBGSVhQX0RCTCBhY2N1MSwgYWNjdTIsIGFjY3UzLCBhY2N1NDsKIAotICAgICAgYWNjdTEgPSAgcERhdF8xWzFdOyBhY2N1MiA9IC1wRGF0XzBbMF07Ci0gICAgICBhY2N1MyA9ICBwRGF0XzBbMV07IGFjY3U0ID0gLXBEYXRfMVswXTsKKyAgICAgIGFjY3UxID0gcERhdF8xWzFdOworICAgICAgYWNjdTIgPSAtcERhdF8wWzBdOworICAgICAgYWNjdTMgPSBwRGF0XzBbMV07CisgICAgICBhY2N1NCA9IC1wRGF0XzFbMF07CiAKICAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgYWNjdTEsIGFjY3UyLCB0d2lkZGxlW2ldKTsKLSAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgYWNjdTQsIGFjY3UzLCB0d2lkZGxlW2krMV0pOworICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBhY2N1NCwgYWNjdTMsIHR3aWRkbGVbaSArIDFdKTsKIAotICAgICAgcERhdF8wWzBdID0gYWNjdTI7IHBEYXRfMFsxXSA9IGFjY3UxOwotICAgICAgcERhdF8xWzBdID0gYWNjdTQ7IHBEYXRfMVsxXSA9IC1hY2N1MzsKKyAgICAgIHBEYXRfMFswXSA9IGFjY3UyOworICAgICAgcERhdF8wWzFdID0gYWNjdTE7CisgICAgICBwRGF0XzFbMF0gPSBhY2N1NDsKKyAgICAgIHBEYXRfMVsxXSA9IC1hY2N1MzsKICAgICB9Ci0gICAgaWYgKE0mMSkKLSAgICB7Ci0gICAgICBGSVhQX0RCTCBhY2N1MSxhY2N1MjsKKyAgICBpZiAoTSAmIDEpIHsKKyAgICAgIEZJWFBfREJMIGFjY3UxLCBhY2N1MjsKIAotICAgICAgYWNjdTEgPSAgcERhdF8xWzFdOyBhY2N1MiA9IC1wRGF0XzBbMF07CisgICAgICBhY2N1MSA9IHBEYXRfMVsxXTsKKyAgICAgIGFjY3UyID0gLXBEYXRfMFswXTsKIAogICAgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBhY2N1MSwgYWNjdTIsIHR3aWRkbGVbaV0pOwogCi0gICAgICBwRGF0XzBbMF0gPSBhY2N1MjsgcERhdF8wWzFdID0gYWNjdTE7CisgICAgICBwRGF0XzBbMF0gPSBhY2N1MjsKKyAgICAgIHBEYXRfMFsxXSA9IGFjY3UxOwogICAgIH0KICAgfQogCiAgIGZmdChNLCBwRGF0LCBwRGF0X2UpOwogCiAjaWZkZWYgRlVOQ1RJT05fZHN0X0lWX2Z1bmMyCi0gIGlmICggKE0+PTQpICYmICgoTSYzKSA9PSAwKSApIHsKLSAgICBkc3RfSVZfZnVuYzIoTT4+Miwgc2luX3R3aWRkbGUgKyBzaW5fc3RlcCwgJnBEYXRbMF0sICZwRGF0W0wgLSAxXSwgc2luX3N0ZXApOworICBpZiAoKE0gPj0gNCkgJiYgKChNICYgMykgPT0gMCkpIHsKKyAgICBkc3RfSVZfZnVuYzIoTSA+PiAyLCBzaW5fdHdpZGRsZSArIHNpbl9zdGVwLCAmcERhdFswXSwgJnBEYXRbTCAtIDFdLAorICAgICAgICAgICAgICAgICBzaW5fc3RlcCk7CiAgIH0gZWxzZQogI2VuZGlmIC8qIEZVTkNUSU9OX2RzdF9JVl9mdW5jMiAqLwogICB7CiAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMDsKICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8xOwotICAgIEZJWFBfREJMIGFjY3UxLGFjY3UyLGFjY3UzLGFjY3U0OworICAgIEZJWFBfREJMIGFjY3UxLCBhY2N1MiwgYWNjdTMsIGFjY3U0OwogICAgIGludCBpZHgsIGk7CiAKICAgICBwRGF0XzAgPSAmcERhdFswXTsKQEAgLTQ5OCwzNyArNTU4LDM1IEBACiAgICAgYWNjdTEgPSBwRGF0XzFbMF07CiAgICAgYWNjdTIgPSBwRGF0XzFbMV07CiAKLSAgICBwRGF0XzFbMV0gPSAtKHBEYXRfMFswXT4+MSk7Ci0gICAgcERhdF8wWzBdID0gKHBEYXRfMFsxXT4+MSk7CisgICAgcERhdF8xWzFdID0gLShwRGF0XzBbMF0gPj4gMSk7CisgICAgcERhdF8wWzBdID0gKHBEYXRfMFsxXSA+PiAxKTsKIAotICAgIGZvciAoaWR4ID0gc2luX3N0ZXAsaT0xOyBpPChNKzEpPj4xOyBpKyssIGlkeCs9c2luX3N0ZXApCi0gICAgeworICAgIGZvciAoaWR4ID0gc2luX3N0ZXAsIGkgPSAxOyBpPChNICsgMSk+PiAxOyBpKyssIGlkeCArPSBzaW5fc3RlcCkgewogICAgICAgRklYUF9TVFAgdHdkID0gc2luX3R3aWRkbGVbaWR4XTsKIAogICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBhY2N1MSwgYWNjdTIsIHR3ZCk7Ci0gICAgICBwRGF0XzFbMF0gPSAgLWFjY3UzOwotICAgICAgcERhdF8wWzFdID0gIC1hY2N1NDsKKyAgICAgIHBEYXRfMVswXSA9IC1hY2N1MzsKKyAgICAgIHBEYXRfMFsxXSA9IC1hY2N1NDsKIAotICAgICAgcERhdF8wKz0yOwotICAgICAgcERhdF8xLT0yOworICAgICAgcERhdF8wICs9IDI7CisgICAgICBwRGF0XzEgLT0gMjsKIAogICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwRGF0XzBbMV0sIHBEYXRfMFswXSwgdHdkKTsKIAogICAgICAgYWNjdTEgPSBwRGF0XzFbMF07CiAgICAgICBhY2N1MiA9IHBEYXRfMVsxXTsKIAotICAgICAgcERhdF8wWzBdID0gIGFjY3UzOworICAgICAgcERhdF8wWzBdID0gYWNjdTM7CiAgICAgICBwRGF0XzFbMV0gPSAtYWNjdTQ7CiAgICAgfQogCi0gICAgaWYgKCAoTSYxKSA9PSAwICkKLSAgICB7CisgICAgaWYgKChNICYgMSkgPT0gMCkgewogICAgICAgLyogTGFzdCBTaW4gYW5kIENvcyB2YWx1ZSBwYWlyIGFyZSB0aGUgc2FtZSAqLwogICAgICAgYWNjdTEgPSBmTXVsdERpdjIoYWNjdTEsIFdUQygweDVhODI3OTlhKSk7CiAgICAgICBhY2N1MiA9IGZNdWx0RGl2MihhY2N1MiwgV1RDKDB4NWE4Mjc5OWEpKTsKIAotICAgICAgcERhdF8wWzFdID0gLSBhY2N1MSAtIGFjY3UyOwotICAgICAgcERhdF8xWzBdID0gICBhY2N1MiAtIGFjY3UxOworICAgICAgcERhdF8wWzFdID0gLWFjY3UxIC0gYWNjdTI7CisgICAgICBwRGF0XzFbMF0gPSBhY2N1MiAtIGFjY3UxOwogICAgIH0KICAgfQogCkBAIC01MzYsNSArNTk0LDMgQEAKICAgKnBEYXRfZSArPSAyOwogfQogI2VuZGlmIC8qICFkZWZpbmVkKEZVTkNUSU9OX2RzdF9JVikgKi8KLQotCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL2ZmdC5jcHAgYi9saWJGREsvc3JjL2ZmdC5jcHAKaW5kZXggNjUzYTcxYS4uNGU2ZmRkMiAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9mZnQuY3BwCisrKyBiL2xpYkZESy9zcmMvZmZ0LmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0NSArOTAsMTMwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsLCBEU1AgU29sdXRpb25zCisKICAgIERlc2NyaXB0aW9uOiBGaXggcG9pbnQgRkZUCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImZmdC5oIgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImZmdF9yYWQyLmgiCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogCisjZGVmaW5lIFdfUGlGT1VSVEggU1RDKDB4NWE4Mjc5OWEpCisvLyNkZWZpbmUgV19QaUZPVVJUSCAoKEZJWFBfREJMKSgweDVhODI3OTlhKSkKKyNpZm5kZWYgU1VNRElGRl9QSUZPVVJUSAorI2RlZmluZSBTVU1ESUZGX1BJRk9VUlRIKGRpZmYsIHN1bSwgYSwgYikgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJWFBfREJMIHdhLCB3YjsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdhID0gZk11bHREaXYyKGEsIFdfUGlGT1VSVEgpOyAgICAgICAgXAorICAgIHdiID0gZk11bHREaXYyKGIsIFdfUGlGT1VSVEgpOyAgICAgICAgXAorICAgIGRpZmYgPSB3YiAtIHdhOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN1bSA9IHdiICsgd2E7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIFNVTURJRkZfUElGT1VSVEgxNihkaWZmLCBzdW0sIGEsIGIpICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJWFBfU0dMIHdhLCB3YjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2EgPSBGWF9EQkwyRlhfU0dMKGZNdWx0RGl2MihhLCBXX1BpRk9VUlRIKSk7IFwKKyAgICB3YiA9IEZYX0RCTDJGWF9TR0woZk11bHREaXYyKGIsIFdfUGlGT1VSVEgpKTsgXAorICAgIGRpZmYgPSB3YiAtIHdhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3VtID0gd2IgKyB3YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2VuZGlmCiAKKyNkZWZpbmUgU0NBTEVGQUNUT1IyMDQ4IDEwCisjZGVmaW5lIFNDQUxFRkFDVE9SMTAyNCA5CisjZGVmaW5lIFNDQUxFRkFDVE9SNTEyIDgKKyNkZWZpbmUgU0NBTEVGQUNUT1IyNTYgNworI2RlZmluZSBTQ0FMRUZBQ1RPUjEyOCA2CisjZGVmaW5lIFNDQUxFRkFDVE9SNjQgNQorI2RlZmluZSBTQ0FMRUZBQ1RPUjMyIDQKKyNkZWZpbmUgU0NBTEVGQUNUT1IxNiAzCisjZGVmaW5lIFNDQUxFRkFDVE9SOCAyCisjZGVmaW5lIFNDQUxFRkFDVE9SNCAxCisjZGVmaW5lIFNDQUxFRkFDVE9SMiAxCiAKKyNkZWZpbmUgU0NBTEVGQUNUT1IzIDEKKyNkZWZpbmUgU0NBTEVGQUNUT1I1IDEKKyNkZWZpbmUgU0NBTEVGQUNUT1I2IChTQ0FMRUZBQ1RPUjIgKyBTQ0FMRUZBQ1RPUjMgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjcgMgorI2RlZmluZSBTQ0FMRUZBQ1RPUjkgMgorI2RlZmluZSBTQ0FMRUZBQ1RPUjEwIDUKKyNkZWZpbmUgU0NBTEVGQUNUT1IxMiAzCisjZGVmaW5lIFNDQUxFRkFDVE9SMTUgMworI2RlZmluZSBTQ0FMRUZBQ1RPUjE4IChTQ0FMRUZBQ1RPUjIgKyBTQ0FMRUZBQ1RPUjkgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjIwIChTQ0FMRUZBQ1RPUjQgKyBTQ0FMRUZBQ1RPUjUgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjIxIChTQ0FMRUZBQ1RPUjMgKyBTQ0FMRUZBQ1RPUjcgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjI0IChTQ0FMRUZBQ1RPUjIgKyBTQ0FMRUZBQ1RPUjEyICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1IzMCAoU0NBTEVGQUNUT1IyICsgU0NBTEVGQUNUT1IxNSArIDIpCisjZGVmaW5lIFNDQUxFRkFDVE9SNDAgKFNDQUxFRkFDVE9SNSArIFNDQUxFRkFDVE9SOCArIDIpCisjZGVmaW5lIFNDQUxFRkFDVE9SNDggKFNDQUxFRkFDVE9SNCArIFNDQUxFRkFDVE9SMTIgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjYwIChTQ0FMRUZBQ1RPUjQgKyBTQ0FMRUZBQ1RPUjE1ICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1I4MCAoU0NBTEVGQUNUT1I1ICsgU0NBTEVGQUNUT1IxNiArIDIpCisjZGVmaW5lIFNDQUxFRkFDVE9SOTYgKFNDQUxFRkFDVE9SMyArIFNDQUxFRkFDVE9SMzIgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjEyMCAoU0NBTEVGQUNUT1I4ICsgU0NBTEVGQUNUT1IxNSArIDIpCisjZGVmaW5lIFNDQUxFRkFDVE9SMTYwIChTQ0FMRUZBQ1RPUjEwICsgU0NBTEVGQUNUT1IxNiArIDIpCisjZGVmaW5lIFNDQUxFRkFDVE9SMTY4IChTQ0FMRUZBQ1RPUjIxICsgU0NBTEVGQUNUT1I4ICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1IxOTIgKFNDQUxFRkFDVE9SMTIgKyBTQ0FMRUZBQ1RPUjE2ICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1IyNDAgKFNDQUxFRkFDVE9SMTYgKyBTQ0FMRUZBQ1RPUjE1ICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1IzMjAgKFNDQUxFRkFDVE9SMTAgKyBTQ0FMRUZBQ1RPUjMyICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1IzMzYgKFNDQUxFRkFDVE9SMjEgKyBTQ0FMRUZBQ1RPUjE2ICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1IzODQgKFNDQUxFRkFDVE9SMTIgKyBTQ0FMRUZBQ1RPUjMyICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1I0ODAgKFNDQUxFRkFDVE9SMzIgKyBTQ0FMRUZBQ1RPUjE1ICsgMikKIAorI2luY2x1ZGUgImZmdC5oIgogCi0jZGVmaW5lIEYzQyh4KSBTVEMoeCkKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0MgogCi0jZGVmaW5lICAgICBDMzEgICAgICAgKEYzQygweDkxMjYxNDY4KSkgICAgICAvKiBGTDJGWENPTlNUX0RCTCgtMC44NjYwMjU0MCkgICAqLworLyogUGVyZm9ybXMgdGhlIEZGVCBvZiBsZW5ndGggMi4gSW5wdXQgdmVjdG9yIHVuc2NhbGVkLCBvdXRwdXQgdmVjdG9yIHNjYWxlZAorICogd2l0aCBmYWN0b3IgMC41ICovCitzdGF0aWMgRkRLX0ZPUkNFSU5MSU5FIHZvaWQgZmZ0MihGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdCkgeworICBGSVhQX0RCTCByMSwgaTE7CisgIEZJWFBfREJMIHIyLCBpMjsKIAotLyogUGVyZm9ybXMgdGhlIEZGVCBvZiBsZW5ndGggMyBhY2NvcmRpbmcgdG8gdGhlIGFsZ29yaXRobSBhZnRlciB3aW5vZ3JhZC4KLSAgIE5vIHNjYWxpbmcgb2YgdGhlIGlucHV0IHZlY3RvciBiZWNhdXNlIHRoZSBzY2FsaW5nIGlzIGFscmVhZHkgZG9uZSBpbiB0aGUgcm90YXRpb24gdmVjdG9yLiAqLwotc3RhdGljIEZPUkNFSU5MSU5FIHZvaWQgZmZ0MyhGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdCkKLXsKLSAgRklYUF9EQkwgcjEscjI7Ci0gIEZJWFBfREJMIHMxLHMyOwogICAvKiByZWFsIHBhcnQgKi8KLSAgcjEgICAgICA9IHBEYXRbMl0gKyBwRGF0WzRdOwotICByMiAgICAgID0gZk11bHQoKHBEYXRbMl0gLSBwRGF0WzRdKSwgQzMxKTsKLSAgcERhdFswXSA9IHBEYXRbMF0gKyByMTsKLSAgcjEgICAgICA9IHBEYXRbMF0gLSByMSAtIChyMT4+MSk7CisgIHIxID0gcERhdFsyXTsKKyAgcjIgPSBwRGF0WzBdOwogCiAgIC8qIGltYWdpbmFyeSBwYXJ0ICovCi0gIHMxICAgICAgPSBwRGF0WzNdICsgcERhdFs1XTsKLSAgczIgICAgICA9IGZNdWx0KChwRGF0WzNdIC0gcERhdFs1XSksIEMzMSk7Ci0gIHBEYXRbMV0gPSBwRGF0WzFdICsgczE7Ci0gIHMxICAgICAgPSBwRGF0WzFdIC0gczEgLSAoczE+PjEpOworICBpMSA9IHBEYXRbM107CisgIGkyID0gcERhdFsxXTsKKworICAvKiByZWFsIHBhcnQgKi8KKyAgcERhdFswXSA9IChyMiArIHIxKSA+PiAxOworICBwRGF0WzJdID0gKHIyIC0gcjEpID4+IDE7CisKKyAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KKyAgcERhdFsxXSA9IChpMiArIGkxKSA+PiAxOworICBwRGF0WzNdID0gKGkyIC0gaTEpID4+IDE7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fZmZ0MiAqLworCisjZGVmaW5lIEMzMSAoU1RDKDB4OTEyNjE0NjgpKSAvKiBGTDJGWENPTlNUX0RCTCgtMC44NjYwMjU0MCkgPSAtc3FydCgzKS8yICAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDMKKy8qIFBlcmZvcm1zIHRoZSBGRlQgb2YgbGVuZ3RoIDMgYWNjb3JkaW5nIHRvIHRoZSBhbGdvcml0aG0gYWZ0ZXIgd2lub2dyYWQuICovCitzdGF0aWMgRkRLX0ZPUkNFSU5MSU5FIHZvaWQgZmZ0MyhGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdCkgeworICBGSVhQX0RCTCByMSwgcjI7CisgIEZJWFBfREJMIHMxLCBzMjsKKyAgRklYUF9EQkwgcEQ7CisKKyAgLyogcmVhbCBwYXJ0ICovCisgIHIxID0gcERhdFsyXSArIHBEYXRbNF07CisgIHIyID0gZk11bHREaXYyKChwRGF0WzJdIC0gcERhdFs0XSksIEMzMSk7CisgIHBEID0gcERhdFswXSA+PiAxOworICBwRGF0WzBdID0gcEQgKyAocjEgPj4gMSk7CisgIHIxID0gcEQgLSAocjEgPj4gMik7CisKKyAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KKyAgczEgPSBwRGF0WzNdICsgcERhdFs1XTsKKyAgczIgPSBmTXVsdERpdjIoKHBEYXRbM10gLSBwRGF0WzVdKSwgQzMxKTsKKyAgcEQgPSBwRGF0WzFdID4+IDE7CisgIHBEYXRbMV0gPSBwRCArIChzMSA+PiAxKTsKKyAgczEgPSBwRCAtIChzMSA+PiAyKTsKIAogICAvKiBjb21iaW5hdGlvbiAqLwogICBwRGF0WzJdID0gcjEgLSBzMjsKQEAgLTEyNSw2MCArMjIxLDYwIEBACiAgIHBEYXRbM10gPSBzMSArIHIyOwogICBwRGF0WzVdID0gczEgLSByMjsKIH0KLQorI2VuZGlmIC8qICNpZm5kZWYgRlVOQ1RJT05fZmZ0MyAqLwogCiAjZGVmaW5lIEY1Qyh4KSBTVEMoeCkKIAotI2RlZmluZSAgICAgQzUxICAgICAgIChGNUMoMHg3OWJjMzg1NCkpICAgICAgLyogRkwyRlhDT05TVF9EQkwoIDAuOTUxMDU2NTIpICAgKi8KLSNkZWZpbmUgICAgIEM1MiAgICAgICAoRjVDKDB4OWQ4MzlkYjApKSAgICAgIC8qIEZMMkZYQ09OU1RfREJMKC0xLjUzODg0MTgwLzIpICovCi0jZGVmaW5lICAgICBDNTMgICAgICAgKEY1QygweGQxODA1M2NlKSkgICAgICAvKiBGTDJGWENPTlNUX0RCTCgtMC4zNjMyNzEyNikgICAqLwotI2RlZmluZSAgICAgQzU0ICAgICAgIChGNUMoMHg0NzhkZGU2NCkpICAgICAgLyogRkwyRlhDT05TVF9EQkwoIDAuNTU5MDE2OTkpICAgKi8KLSNkZWZpbmUgICAgIEM1NSAgICAgICAoRjVDKDB4YjAwMDAwMDEpKSAgICAgIC8qIEZMMkZYQ09OU1RfREJMKC0xLjI1LzIpICAgICAgICovCisjZGVmaW5lIEM1MSAoRjVDKDB4NzliYzM4NTQpKSAvKiBGTDJGWENPTlNUX0RCTCggMC45NTEwNTY1MikgICAqLworI2RlZmluZSBDNTIgKEY1QygweDlkODM5ZGIwKSkgLyogRkwyRlhDT05TVF9EQkwoLTEuNTM4ODQxODAvMikgKi8KKyNkZWZpbmUgQzUzIChGNUMoMHhkMTgwNTNjZSkpIC8qIEZMMkZYQ09OU1RfREJMKC0wLjM2MzI3MTI2KSAgICovCisjZGVmaW5lIEM1NCAoRjVDKDB4NDc4ZGRlNjQpKSAvKiBGTDJGWENPTlNUX0RCTCggMC41NTkwMTY5OSkgICAqLworI2RlZmluZSBDNTUgKEY1QygweGIwMDAwMDAxKSkgLyogRkwyRlhDT05TVF9EQkwoLTEuMjUvMikgICAgICAgKi8KIAogLyogcGVyZm9ybXMgdGhlIEZGVCBvZiBsZW5ndGggNSBhY2NvcmRpbmcgdG8gdGhlIGFsZ29yaXRobSBhZnRlciB3aW5vZ3JhZCAqLwotc3RhdGljIEZPUkNFSU5MSU5FIHZvaWQgZmZ0NShGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdCkKLXsKLSAgRklYUF9EQkwgcjEscjIscjMscjQ7Ci0gIEZJWFBfREJMIHMxLHMyLHMzLHM0OworLyogVGhpcyB2ZXJzaW9uIHdvcmtzIHdpdGggYSBwcmVzY2FsZSBvZiAyIGluc3RlYWQgb2YgMyAqLworc3RhdGljIEZES19GT1JDRUlOTElORSB2b2lkIGZmdDUoRklYUF9EQkwgKlJFU1RSSUNUIHBEYXQpIHsKKyAgRklYUF9EQkwgcjEsIHIyLCByMywgcjQ7CisgIEZJWFBfREJMIHMxLCBzMiwgczMsIHM0OwogICBGSVhQX0RCTCB0OwogCiAgIC8qIHJlYWwgcGFydCAqLwotICByMSAgICAgID0gcERhdFsyXSArIHBEYXRbOF07Ci0gIHI0ICAgICAgPSBwRGF0WzJdIC0gcERhdFs4XTsKLSAgcjMgICAgICA9IHBEYXRbNF0gKyBwRGF0WzZdOwotICByMiAgICAgID0gcERhdFs0XSAtIHBEYXRbNl07Ci0gIHQgICAgICAgPSBmTXVsdCgocjEtcjMpLCBDNTQpOwotICByMSAgICAgID0gcjEgKyByMzsKLSAgcERhdFswXSA9IHBEYXRbMF0gKyByMTsKLSAgLyogQml0IHNoaWZ0IGxlZnQgYmVjYXVzZSBvZiB0aGUgY29uc3RhbnQgQzU1IHdoaWNoIHdhcyBzY2FsZWQgd2l0aCB0aGUgZmFjdG9yIDAuNSBiZWNhdXNlIG9mIHRoZSByZXByZXNlbnRhdGlvbiBvZgotICAgICB0aGUgdmFsdWVzIGFzIGZyYWN0cyAqLwotICByMSAgICAgID0gcERhdFswXSArIChmTXVsdERpdjIocjEsIEM1NSkgPDwoMikpOwotICByMyAgICAgID0gcjEgLSB0OwotICByMSAgICAgID0gcjEgKyB0OwotICB0ICAgICAgID0gZk11bHQoKHI0ICsgcjIpLCBDNTEpOwotICAvKiBCaXQgc2hpZnQgbGVmdCBiZWNhdXNlIG9mIHRoZSBjb25zdGFudCBDNTUgd2hpY2ggd2FzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IgMC41IGJlY2F1c2Ugb2YgdGhlIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgIHRoZSB2YWx1ZXMgYXMgZnJhY3RzICovCi0gIHI0ICAgICAgPSB0ICsgKGZNdWx0RGl2MihyNCwgQzUyKSA8PCgyKSk7Ci0gIHIyICAgICAgPSB0ICsgZk11bHQocjIsIEM1Myk7CisgIHIxID0gKHBEYXRbMl0gKyBwRGF0WzhdKSA+PiAxOworICByNCA9IChwRGF0WzJdIC0gcERhdFs4XSkgPj4gMTsKKyAgcjMgPSAocERhdFs0XSArIHBEYXRbNl0pID4+IDE7CisgIHIyID0gKHBEYXRbNF0gLSBwRGF0WzZdKSA+PiAxOworICB0ID0gZk11bHQoKHIxIC0gcjMpLCBDNTQpOworICByMSA9IHIxICsgcjM7CisgIHBEYXRbMF0gPSAocERhdFswXSA+PiAxKSArIHIxOworICAvKiBCaXQgc2hpZnQgbGVmdCBiZWNhdXNlIG9mIHRoZSBjb25zdGFudCBDNTUgd2hpY2ggd2FzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IKKyAgICAgMC41IGJlY2F1c2Ugb2YgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZXMgYXMgZnJhY3RzICovCisgIHIxID0gcERhdFswXSArIChmTXVsdERpdjIocjEsIEM1NSkgPDwgKDIpKTsKKyAgcjMgPSByMSAtIHQ7CisgIHIxID0gcjEgKyB0OworICB0ID0gZk11bHQoKHI0ICsgcjIpLCBDNTEpOworICAvKiBCaXQgc2hpZnQgbGVmdCBiZWNhdXNlIG9mIHRoZSBjb25zdGFudCBDNTUgd2hpY2ggd2FzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IKKyAgICAgMC41IGJlY2F1c2Ugb2YgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZXMgYXMgZnJhY3RzICovCisgIHI0ID0gdCArIChmTXVsdERpdjIocjQsIEM1MikgPDwgKDIpKTsKKyAgcjIgPSB0ICsgZk11bHQocjIsIEM1Myk7CiAKICAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KLSAgczEgICAgICA9IHBEYXRbM10gKyBwRGF0WzldOwotICBzNCAgICAgID0gcERhdFszXSAtIHBEYXRbOV07Ci0gIHMzICAgICAgPSBwRGF0WzVdICsgcERhdFs3XTsKLSAgczIgICAgICA9IHBEYXRbNV0gLSBwRGF0WzddOwotICB0ICAgICAgID0gZk11bHQoKHMxIC0gczMpLCBDNTQpOwotICBzMSAgICAgID0gczEgKyBzMzsKLSAgcERhdFsxXSA9IHBEYXRbMV0gKyBzMTsKLSAgLyogQml0IHNoaWZ0IGxlZnQgYmVjYXVzZSBvZiB0aGUgY29uc3RhbnQgQzU1IHdoaWNoIHdhcyBzY2FsZWQgd2l0aCB0aGUgZmFjdG9yIDAuNSBiZWNhdXNlIG9mIHRoZSByZXByZXNlbnRhdGlvbiBvZgotICAgICB0aGUgdmFsdWVzIGFzIGZyYWN0cyAqLwotICBzMSAgICAgID0gcERhdFsxXSArIChmTXVsdERpdjIoczEsIEM1NSkgPDwoMikpOwotICBzMyAgICAgID0gczEgLSB0OwotICBzMSAgICAgID0gczEgKyB0OwotICB0ICAgICAgID0gZk11bHQoKHM0ICsgczIpLCBDNTEpOwotICAvKiBCaXQgc2hpZnQgbGVmdCBiZWNhdXNlIG9mIHRoZSBjb25zdGFudCBDNTUgd2hpY2ggd2FzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IgMC41IGJlY2F1c2Ugb2YgdGhlIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgIHRoZSB2YWx1ZXMgYXMgZnJhY3RzICovCi0gIHM0ICAgICAgPSB0ICsgKGZNdWx0RGl2MihzNCwgQzUyKSA8PCgyKSk7Ci0gIHMyICAgICAgPSB0ICsgZk11bHQoczIsIEM1Myk7CisgIHMxID0gKHBEYXRbM10gKyBwRGF0WzldKSA+PiAxOworICBzNCA9IChwRGF0WzNdIC0gcERhdFs5XSkgPj4gMTsKKyAgczMgPSAocERhdFs1XSArIHBEYXRbN10pID4+IDE7CisgIHMyID0gKHBEYXRbNV0gLSBwRGF0WzddKSA+PiAxOworICB0ID0gZk11bHQoKHMxIC0gczMpLCBDNTQpOworICBzMSA9IHMxICsgczM7CisgIHBEYXRbMV0gPSAocERhdFsxXSA+PiAxKSArIHMxOworICAvKiBCaXQgc2hpZnQgbGVmdCBiZWNhdXNlIG9mIHRoZSBjb25zdGFudCBDNTUgd2hpY2ggd2FzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IKKyAgICAgMC41IGJlY2F1c2Ugb2YgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZXMgYXMgZnJhY3RzICovCisgIHMxID0gcERhdFsxXSArIChmTXVsdERpdjIoczEsIEM1NSkgPDwgKDIpKTsKKyAgczMgPSBzMSAtIHQ7CisgIHMxID0gczEgKyB0OworICB0ID0gZk11bHQoKHM0ICsgczIpLCBDNTEpOworICAvKiBCaXQgc2hpZnQgbGVmdCBiZWNhdXNlIG9mIHRoZSBjb25zdGFudCBDNTUgd2hpY2ggd2FzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IKKyAgICAgMC41IGJlY2F1c2Ugb2YgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZXMgYXMgZnJhY3RzICovCisgIHM0ID0gdCArIChmTXVsdERpdjIoczQsIEM1MikgPDwgKDIpKTsKKyAgczIgPSB0ICsgZk11bHQoczIsIEM1Myk7CiAKICAgLyogY29tYmluYXRpb24gKi8KICAgcERhdFsyXSA9IHIxICsgczI7CkBAIC0xOTIsMjAgKzI4OCwzMjIgQEAKICAgcERhdFs3XSA9IHMzIC0gcjQ7CiB9CiAKKyNkZWZpbmUgRjVDKHgpIFNUQyh4KQogCi0KLQotI2RlZmluZSBOMyAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBONSAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBONiAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBOMTUgICAgICAgICAgICAgICAgICAgMTUKLQotLyogUGVyZm9ybXMgdGhlIEZGVCBvZiBsZW5ndGggMTUuIEl0IGlzIHNwbGl0IGludG8gRkZUcyBvZiBsZW5ndGggMyBhbmQgbGVuZ3RoIDUuICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZmZ0MTUoRklYUF9EQkwgKnBJbnB1dCkKKyNkZWZpbmUgQzUxIChGNUMoMHg3OWJjMzg1NCkpIC8qIEZMMkZYQ09OU1RfREJMKCAwLjk1MTA1NjUyKSAgICovCisjZGVmaW5lIEM1MiAoRjVDKDB4OWQ4MzlkYjApKSAvKiBGTDJGWENPTlNUX0RCTCgtMS41Mzg4NDE4MC8yKSAqLworI2RlZmluZSBDNTMgKEY1QygweGQxODA1M2NlKSkgLyogRkwyRlhDT05TVF9EQkwoLTAuMzYzMjcxMjYpICAgKi8KKyNkZWZpbmUgQzU0IChGNUMoMHg0NzhkZGU2NCkpIC8qIEZMMkZYQ09OU1RfREJMKCAwLjU1OTAxNjk5KSAgICovCisjZGVmaW5lIEM1NSAoRjVDKDB4YjAwMDAwMDEpKSAvKiBGTDJGWENPTlNUX0RCTCgtMS4yNS8yKSAgICAgICAqLworLyoqCisgKiBcYnJpZWYgICAgRnVuY3Rpb24gcGVyZm9ybXMgYSBjb21wbGV4IDEwLXBvaW50IEZGVAorICogICAgICAgICAgIFRoZSBGRlQgaXMgcGVyZm9ybWVkIGlucGxhY2UuIFRoZSByZXN1bHQgb2YgdGhlIEZGVAorICogICAgICAgICAgIGlzIHNjYWxlZCBieSBTQ0FMRUZBQ1RPUjEwIGJpdHMuCisgKgorICogICAgICAgICAgIFdPUFMgRkxDIHZlcnNpb246ICAgICAgICAgICAgICAgICAgICAxMDkzIGN5Y2xlcworICogICAgICAgICAgIFdPUFMgd2l0aCAzMngxNiBiaXQgbXVsdGlwbGljYXRpb25zOiAgMTk2IGN5Y2xlcworICoKKyAqIFxwYXJhbSAgICBbaS9vXSByZSAgICByZWFsIGlucHV0IC8gb3V0cHV0CisgKiBccGFyYW0gICAgW2kvb10gaW0gICAgaW1hZyBpbnB1dCAvIG91dHB1dAorICogXHBhcmFtICAgIFtpICBdIHMgICAgIHN0cmlkZSByZWFsIGFuZCBpbWFnIGlucHV0IC8gb3V0cHV0CisgKgorICogXHJldHVybiAgIHZvaWQKKyAqLworc3RhdGljIHZvaWQgZmZ0MTAoRklYUF9EQkwgKngpICAvLyBGSVhQX0RCTCAqcmUsIEZJWFBfREJMICppbSwgRklYUF9TR0wgcykKIHsKLSAgRklYUF9EQkwgIGFEc3RbMipOMTVdOwotICBGSVhQX0RCTCAgYURzdDFbMipOMTVdOwotICBpbnQgICAgaSxrLGw7CisgIEZJWFBfREJMIHQ7CisgIEZJWFBfREJMIHgwLCB4MSwgeDIsIHgzLCB4NDsKKyAgRklYUF9EQkwgcjEsIHIyLCByMywgcjQ7CisgIEZJWFBfREJMIHMxLCBzMiwgczMsIHM0OworICBGSVhQX0RCTCB5MDAsIHkwMSwgeTAyLCB5MDMsIHkwNCwgeTA1LCB5MDYsIHkwNywgeTA4LCB5MDk7CisgIEZJWFBfREJMIHkxMCwgeTExLCB5MTIsIHkxMywgeTE0LCB5MTUsIHkxNiwgeTE3LCB5MTgsIHkxOTsKKworICBjb25zdCBpbnQgcyA9IDE7ICAvLyBzdHJpZGUgZmFjdG9yCisKKyAgLyogMiBmZnQ1IHN0YWdlcyAqLworCisgIC8qIHJlYWwgcGFydCAqLworICB4MCA9ICh4W3MgKiAwXSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKyAgeDEgPSAoeFtzICogNF0gPj4gU0NBTEVGQUNUT1IxMCk7CisgIHgyID0gKHhbcyAqIDhdID4+IFNDQUxFRkFDVE9SMTApOworICB4MyA9ICh4W3MgKiAxMl0gPj4gU0NBTEVGQUNUT1IxMCk7CisgIHg0ID0gKHhbcyAqIDE2XSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKworICByMSA9ICh4MyArIHgyKTsKKyAgcjQgPSAoeDMgLSB4Mik7CisgIHIzID0gKHgxICsgeDQpOworICByMiA9ICh4MSAtIHg0KTsKKyAgdCA9IGZNdWx0KChyMSAtIHIzKSwgQzU0KTsKKyAgcjEgPSAocjEgKyByMyk7CisgIHkwMCA9ICh4MCArIHIxKTsKKyAgcjEgPSAoeTAwICsgKChmTXVsdChyMSwgQzU1KSA8PCAxKSkpOworICByMyA9IChyMSAtIHQpOworICByMSA9IChyMSArIHQpOworICB0ID0gZk11bHQoKHI0ICsgcjIpLCBDNTEpOworICByNCA9ICh0ICsgKGZNdWx0KHI0LCBDNTIpIDw8IDEpKTsKKyAgcjIgPSAodCArIGZNdWx0KHIyLCBDNTMpKTsKKworICAvKiBpbWFnaW5hcnkgcGFydCAqLworICB4MCA9ICh4W3MgKiAwICsgMV0gPj4gU0NBTEVGQUNUT1IxMCk7CisgIHgxID0gKHhbcyAqIDQgKyAxXSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKyAgeDIgPSAoeFtzICogOCArIDFdID4+IFNDQUxFRkFDVE9SMTApOworICB4MyA9ICh4W3MgKiAxMiArIDFdID4+IFNDQUxFRkFDVE9SMTApOworICB4NCA9ICh4W3MgKiAxNiArIDFdID4+IFNDQUxFRkFDVE9SMTApOworCisgIHMxID0gKHgzICsgeDIpOworICBzNCA9ICh4MyAtIHgyKTsKKyAgczMgPSAoeDEgKyB4NCk7CisgIHMyID0gKHgxIC0geDQpOworICB0ID0gZk11bHQoKHMxIC0gczMpLCBDNTQpOworICBzMSA9IChzMSArIHMzKTsKKyAgeTAxID0gKHgwICsgczEpOworICBzMSA9ICh5MDEgKyAoZk11bHQoczEsIEM1NSkgPDwgMSkpOworICBzMyA9IChzMSAtIHQpOworICBzMSA9IChzMSArIHQpOworICB0ID0gZk11bHQoKHM0ICsgczIpLCBDNTEpOworICBzNCA9ICh0ICsgKGZNdWx0KHM0LCBDNTIpIDw8IDEpKTsKKyAgczIgPSAodCArIGZNdWx0KHMyLCBDNTMpKTsKKworICAvKiBjb21iaW5hdGlvbiAqLworICB5MDQgPSAocjEgKyBzMik7CisgIHkxNiA9IChyMSAtIHMyKTsKKyAgeTA4ID0gKHIzIC0gczQpOworICB5MTIgPSAocjMgKyBzNCk7CisKKyAgeTA1ID0gKHMxIC0gcjIpOworICB5MTcgPSAoczEgKyByMik7CisgIHkwOSA9IChzMyArIHI0KTsKKyAgeTEzID0gKHMzIC0gcjQpOworCisgIC8qIHJlYWwgcGFydCAqLworICB4MCA9ICh4W3MgKiAxMF0gPj4gU0NBTEVGQUNUT1IxMCk7CisgIHgxID0gKHhbcyAqIDJdID4+IFNDQUxFRkFDVE9SMTApOworICB4MiA9ICh4W3MgKiA2XSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKyAgeDMgPSAoeFtzICogMTRdID4+IFNDQUxFRkFDVE9SMTApOworICB4NCA9ICh4W3MgKiAxOF0gPj4gU0NBTEVGQUNUT1IxMCk7CisKKyAgcjEgPSAoeDEgKyB4NCk7CisgIHI0ID0gKHgxIC0geDQpOworICByMyA9ICh4MyArIHgyKTsKKyAgcjIgPSAoeDMgLSB4Mik7CisgIHQgPSBmTXVsdCgocjEgLSByMyksIEM1NCk7CisgIHIxID0gKHIxICsgcjMpOworICB5MDIgPSAoeDAgKyByMSk7CisgIHIxID0gKHkwMiArICgoZk11bHQocjEsIEM1NSkgPDwgMSkpKTsKKyAgcjMgPSAocjEgLSB0KTsKKyAgcjEgPSAocjEgKyB0KTsKKyAgdCA9IGZNdWx0KCgocjQgKyByMikpLCBDNTEpOworICByNCA9ICh0ICsgKGZNdWx0KHI0LCBDNTIpIDw8IDEpKTsKKyAgcjIgPSAodCArIGZNdWx0KHIyLCBDNTMpKTsKKworICAvKiBpbWFnaW5hcnkgcGFydCAqLworICB4MCA9ICh4W3MgKiAxMCArIDFdID4+IFNDQUxFRkFDVE9SMTApOworICB4MSA9ICh4W3MgKiAyICsgMV0gPj4gU0NBTEVGQUNUT1IxMCk7CisgIHgyID0gKHhbcyAqIDYgKyAxXSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKyAgeDMgPSAoeFtzICogMTQgKyAxXSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKyAgeDQgPSAoeFtzICogMTggKyAxXSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKworICBzMSA9ICh4MSArIHg0KTsKKyAgczQgPSAoeDEgLSB4NCk7CisgIHMzID0gKHgzICsgeDIpOworICBzMiA9ICh4MyAtIHgyKTsKKyAgdCA9IGZNdWx0KChzMSAtIHMzKSwgQzU0KTsKKyAgczEgPSAoczEgKyBzMyk7CisgIHkwMyA9ICh4MCArIHMxKTsKKyAgczEgPSAoeTAzICsgKGZNdWx0KHMxLCBDNTUpIDw8IDEpKTsKKyAgczMgPSAoczEgLSB0KTsKKyAgczEgPSAoczEgKyB0KTsKKyAgdCA9IGZNdWx0KChzNCArIHMyKSwgQzUxKTsKKyAgczQgPSAodCArIChmTXVsdChzNCwgQzUyKSA8PCAxKSk7CisgIHMyID0gKHQgKyBmTXVsdChzMiwgQzUzKSk7CisKKyAgLyogY29tYmluYXRpb24gKi8KKyAgeTA2ID0gKHIxICsgczIpOworICB5MTggPSAocjEgLSBzMik7CisgIHkxMCA9IChyMyAtIHM0KTsKKyAgeTE0ID0gKHIzICsgczQpOworCisgIHkwNyA9IChzMSAtIHIyKTsKKyAgeTE5ID0gKHMxICsgcjIpOworICB5MTEgPSAoczMgKyByNCk7CisgIHkxNSA9IChzMyAtIHI0KTsKKworICAvKiA1IGZmdDIgc3RhZ2VzICovCisgIHhbcyAqIDBdID0gKHkwMCArIHkwMik7CisgIHhbcyAqIDAgKyAxXSA9ICh5MDEgKyB5MDMpOworICB4W3MgKiAxMF0gPSAoeTAwIC0geTAyKTsKKyAgeFtzICogMTAgKyAxXSA9ICh5MDEgLSB5MDMpOworCisgIHhbcyAqIDRdID0gKHkwNCArIHkwNik7CisgIHhbcyAqIDQgKyAxXSA9ICh5MDUgKyB5MDcpOworICB4W3MgKiAxNF0gPSAoeTA0IC0geTA2KTsKKyAgeFtzICogMTQgKyAxXSA9ICh5MDUgLSB5MDcpOworCisgIHhbcyAqIDhdID0gKHkwOCArIHkxMCk7CisgIHhbcyAqIDggKyAxXSA9ICh5MDkgKyB5MTEpOworICB4W3MgKiAxOF0gPSAoeTA4IC0geTEwKTsKKyAgeFtzICogMTggKyAxXSA9ICh5MDkgLSB5MTEpOworCisgIHhbcyAqIDEyXSA9ICh5MTIgKyB5MTQpOworICB4W3MgKiAxMiArIDFdID0gKHkxMyArIHkxNSk7CisgIHhbcyAqIDJdID0gKHkxMiAtIHkxNCk7CisgIHhbcyAqIDIgKyAxXSA9ICh5MTMgLSB5MTUpOworCisgIHhbcyAqIDE2XSA9ICh5MTYgKyB5MTgpOworICB4W3MgKiAxNiArIDFdID0gKHkxNyArIHkxOSk7CisgIHhbcyAqIDZdID0gKHkxNiAtIHkxOCk7CisgIHhbcyAqIDYgKyAxXSA9ICh5MTcgLSB5MTkpOworfQorCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDEyCisjZGVmaW5lIEZVTkNUSU9OX2ZmdDEyCisKKyN1bmRlZiBDMzEKKyNkZWZpbmUgQzMxIChTVEMoMHg5MTI2MTQ2OCkpIC8qIEZMMkZYQ09OU1RfREJMKC0wLjg2NjAyNTQwKSA9IC1zcXJ0KDMpLzIgICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnQxMihGSVhQX0RCTCAqcElucHV0KSB7CisgIEZJWFBfREJMIGFEc3RbMjRdOworICBGSVhQX0RCTCAqcFNyYywgKnBEc3Q7CisgIGludCBpOworCisgIHBTcmMgPSBwSW5wdXQ7CisgIHBEc3QgPSBhRHN0OworICBGSVhQX0RCTCByMSwgcjIsIHMxLCBzMiwgcEQ7CisKKyAgLyogRmlyc3QgMyoyIHNhbXBsZXMgYXJlIHNoaWZ0ZWQgcmlnaHQgYnkgMiBiZWZvcmUgb3V0cHV0ICovCisgIHIxID0gcFNyY1s4XSArIHBTcmNbMTZdOworICByMiA9IGZNdWx0RGl2MigocFNyY1s4XSAtIHBTcmNbMTZdKSwgQzMxKTsKKyAgcEQgPSBwU3JjWzBdID4+IDE7CisgIHBEc3RbMF0gPSAocEQgKyAocjEgPj4gMSkpID4+IDE7CisgIHIxID0gcEQgLSAocjEgPj4gMik7CisKKyAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KKyAgczEgPSBwU3JjWzldICsgcFNyY1sxN107CisgIHMyID0gZk11bHREaXYyKChwU3JjWzldIC0gcFNyY1sxN10pLCBDMzEpOworICBwRCA9IHBTcmNbMV0gPj4gMTsKKyAgcERzdFsxXSA9IChwRCArIChzMSA+PiAxKSkgPj4gMTsKKyAgczEgPSBwRCAtIChzMSA+PiAyKTsKKworICAvKiBjb21iaW5hdGlvbiAqLworICBwRHN0WzJdID0gKHIxIC0gczIpID4+IDE7CisgIHBEc3RbM10gPSAoczEgKyByMikgPj4gMTsKKyAgcERzdFs0XSA9IChyMSArIHMyKSA+PiAxOworICBwRHN0WzVdID0gKHMxIC0gcjIpID4+IDE7CisgIHBTcmMgKz0gMjsKKyAgcERzdCArPSA2OworCisgIGNvbnN0IEZJWFBfU1RCICpwVmVjUmUgPSBSb3RWZWN0b3JSZWFsMTI7CisgIGNvbnN0IEZJWFBfU1RCICpwVmVjSW0gPSBSb3RWZWN0b3JJbWFnMTI7CisgIEZJWFBfREJMIHJlLCBpbTsKKyAgRklYUF9TVEIgdnJlLCB2aW07CisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAvKiBzYW1wbGUgMCwxIGFyZSBzaGlmdGVkIHJpZ2h0IGJ5IDIgYmVmb3JlIG91dHB1dCAqLworICAgIC8qIHNhbXBsZSAyLDMgNCw1IGFyZSBzaGlmdGVkIHJpZ2h0IGJ5IDEgYW5kIGNvbXBsZXggbXVsdGlwbGllZCBiZWZvcmUKKyAgICAgKiBvdXRwdXQgKi8KKworICAgIHIxID0gcFNyY1s4XSArIHBTcmNbMTZdOworICAgIHIyID0gZk11bHREaXYyKChwU3JjWzhdIC0gcFNyY1sxNl0pLCBDMzEpOworICAgIHBEID0gcFNyY1swXSA+PiAxOworICAgIHBEc3RbMF0gPSAocEQgKyAocjEgPj4gMSkpID4+IDE7CisgICAgcjEgPSBwRCAtIChyMSA+PiAyKTsKKworICAgIC8qIGltYWdpbmFyeSBwYXJ0ICovCisgICAgczEgPSBwU3JjWzldICsgcFNyY1sxN107CisgICAgczIgPSBmTXVsdERpdjIoKHBTcmNbOV0gLSBwU3JjWzE3XSksIEMzMSk7CisgICAgcEQgPSBwU3JjWzFdID4+IDE7CisgICAgcERzdFsxXSA9IChwRCArIChzMSA+PiAxKSkgPj4gMTsKKyAgICBzMSA9IHBEIC0gKHMxID4+IDIpOworCisgICAgLyogY29tYmluYXRpb24gKi8KKyAgICByZSA9IChyMSAtIHMyKSA+PiAwOworICAgIGltID0gKHMxICsgcjIpID4+IDA7CisgICAgdnJlID0gKnBWZWNSZSsrOworICAgIHZpbSA9ICpwVmVjSW0rKzsKKyAgICBjcGx4TXVsdERpdjIoJnBEc3RbM10sICZwRHN0WzJdLCBpbSwgcmUsIHZyZSwgdmltKTsKKworICAgIHJlID0gKHIxICsgczIpID4+IDA7CisgICAgaW0gPSAoczEgLSByMikgPj4gMDsKKyAgICB2cmUgPSAqcFZlY1JlKys7CisgICAgdmltID0gKnBWZWNJbSsrOworICAgIGNwbHhNdWx0RGl2MigmcERzdFs1XSwgJnBEc3RbNF0sIGltLCByZSwgdnJlLCB2aW0pOworCisgICAgcERzdCArPSA2OworICAgIHBTcmMgKz0gMjsKKyAgfQorICAvKiBzYW1wbGUgMCwxIGFyZSBzaGlmdGVkIHJpZ2h0IGJ5IDIgYmVmb3JlIG91dHB1dCAqLworICAvKiBzYW1wbGUgMiwzIGlzIHNoaWZ0ZWQgcmlnaHQgYnkgMSBhbmQgY29tcGxleCBtdWx0aXBsaWVkIHdpdGggKDAuMCwrMS4wKSAqLworICAvKiBzYW1wbGUgNCw1IGlzIHNoaWZ0ZWQgcmlnaHQgYnkgMSBhbmQgY29tcGxleCBtdWx0aXBsaWVkIHdpdGggKC0xLjAsMC4wKSAqLworICByMSA9IHBTcmNbOF0gKyBwU3JjWzE2XTsKKyAgcjIgPSBmTXVsdERpdjIoKHBTcmNbOF0gLSBwU3JjWzE2XSksIEMzMSk7CisgIHBEID0gcFNyY1swXSA+PiAxOworICBwRHN0WzBdID0gKHBEICsgKHIxID4+IDEpKSA+PiAxOworICByMSA9IHBEIC0gKHIxID4+IDIpOworCisgIC8qIGltYWdpbmFyeSBwYXJ0ICovCisgIHMxID0gcFNyY1s5XSArIHBTcmNbMTddOworICBzMiA9IGZNdWx0RGl2MigocFNyY1s5XSAtIHBTcmNbMTddKSwgQzMxKTsKKyAgcEQgPSBwU3JjWzFdID4+IDE7CisgIHBEc3RbMV0gPSAocEQgKyAoczEgPj4gMSkpID4+IDE7CisgIHMxID0gcEQgLSAoczEgPj4gMik7CisKKyAgLyogY29tYmluYXRpb24gKi8KKyAgcERzdFsyXSA9IChzMSArIHIyKSA+PiAxOworICBwRHN0WzNdID0gKHMyIC0gcjEpID4+IDE7CisgIHBEc3RbNF0gPSAtKChyMSArIHMyKSA+PiAxKTsKKyAgcERzdFs1XSA9IChyMiAtIHMxKSA+PiAxOworCisgIC8qIFBlcmZvcm0gMyB0aW1lcyB0aGUgZmZ0IG9mIGxlbmd0aCA0LiBUaGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlIGFkZHJlc3MKKyAgb2YgYURzdCBhbmQgdGhlIG91dHB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwSW5wdXQuIFRoZSBpbnB1dCB2ZWN0b3IKKyAgZm9yIHRoZSBmZnQgb2YgbGVuZ3RoIDQgaXMgYnVpbHQgb2YgdGhlIGludGVybGVhdmVkIHNhbXBsZXMgaW4gYURzdCwgdGhlCisgIG91dHB1dCBzYW1wbGVzIGFyZSBzdG9yZWQgY29uc2VjdXRpdmVseSBhdCB0aGUgYWRkcmVzcyBvZiBwSW5wdXQuCisgICovCisgIHBTcmMgPSBhRHN0OworICBwRHN0ID0gcElucHV0OworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgLyogaW5saW5lIEZGVDQgbWVyZ2VkIHdpdGggaW5jb21pbmcgcmVzb3J0aW5nIGxvb3AgKi8KKyAgICBGSVhQX0RCTCBhMDAsIGExMCwgYTIwLCBhMzAsIHRtcDAsIHRtcDE7CisKKyAgICBhMDAgPSAocFNyY1swXSArIHBTcmNbMTJdKSA+PiAxOyAvKiBSZSBBICsgUmUgQiAqLworICAgIGExMCA9IChwU3JjWzZdICsgcFNyY1sxOF0pID4+IDE7IC8qIFJlIEMgKyBSZSBEICovCisgICAgYTIwID0gKHBTcmNbMV0gKyBwU3JjWzEzXSkgPj4gMTsgLyogSW0gQSArIEltIEIgKi8KKyAgICBhMzAgPSAocFNyY1s3XSArIHBTcmNbMTldKSA+PiAxOyAvKiBJbSBDICsgSW0gRCAqLworCisgICAgcERzdFswXSA9IGEwMCArIGExMDsgLyogUmUgQScgPSBSZSBBICsgUmUgQiArIFJlIEMgKyBSZSBEICovCisgICAgcERzdFsxXSA9IGEyMCArIGEzMDsgLyogSW0gQScgPSBJbSBBICsgSW0gQiArIEltIEMgKyBJbSBEICovCisKKyAgICB0bXAwID0gYTAwIC0gcFNyY1sxMl07IC8qIFJlIEEgLSBSZSBCICovCisgICAgdG1wMSA9IGEyMCAtIHBTcmNbMTNdOyAvKiBJbSBBIC0gSW0gQiAqLworCisgICAgcERzdFsxMl0gPSBhMDAgLSBhMTA7IC8qIFJlIEMnID0gUmUgQSArIFJlIEIgLSBSZSBDIC0gUmUgRCAqLworICAgIHBEc3RbMTNdID0gYTIwIC0gYTMwOyAvKiBJbSBDJyA9IEltIEEgKyBJbSBCIC0gSW0gQyAtIEltIEQgKi8KKworICAgIGExMCA9IGExMCAtIHBTcmNbMThdOyAvKiBSZSBDIC0gUmUgRCAqLworICAgIGEzMCA9IGEzMCAtIHBTcmNbMTldOyAvKiBJbSBDIC0gSW0gRCAqLworCisgICAgcERzdFs2XSA9IHRtcDAgKyBhMzA7ICAvKiBSZSBCJyA9IFJlIEEgLSBSZSBCICsgSW0gQyAtIEltIEQgKi8KKyAgICBwRHN0WzE4XSA9IHRtcDAgLSBhMzA7IC8qIFJlIEQnID0gUmUgQSAtIFJlIEIgLSBJbSBDICsgSW0gRCAqLworICAgIHBEc3RbN10gPSB0bXAxIC0gYTEwOyAgLyogSW0gQicgPSBJbSBBIC0gSW0gQiAtIFJlIEMgKyBSZSBEICovCisgICAgcERzdFsxOV0gPSB0bXAxICsgYTEwOyAvKiBJbSBEJyA9IEltIEEgLSBJbSBCICsgUmUgQyAtIFJlIEQgKi8KKworICAgIHBTcmMgKz0gMjsKKyAgICBwRHN0ICs9IDI7CisgIH0KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9mZnQxMiAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDE1CisKKyNkZWZpbmUgTjMgMworI2RlZmluZSBONSA1CisjZGVmaW5lIE42IDYKKyNkZWZpbmUgTjE1IDE1CisKKy8qIFBlcmZvcm1zIHRoZSBGRlQgb2YgbGVuZ3RoIDE1LiBJdCBpcyBzcGxpdCBpbnRvIEZGVHMgb2YgbGVuZ3RoIDMgYW5kCisgKiBsZW5ndGggNS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnQxNShGSVhQX0RCTCAqcElucHV0KSB7CisgIEZJWFBfREJMIGFEc3RbMiAqIE4xNV07CisgIEZJWFBfREJMIGFEc3QxWzIgKiBOMTVdOworICBpbnQgaSwgaywgbDsKIAogICAvKiBTb3J0IGlucHV0IHZlY3RvciBmb3IgZmZ0J3Mgb2YgbGVuZ3RoIDMKICAgaW5wdXQzKDA6MikgICA9IFtpbnB1dCgwKSBpbnB1dCg1KSBpbnB1dCgxMCldOwpAQCAtMjE3LDQ3ICs2MTUsNDMgQEAKICAgICBjb25zdCBGSVhQX0RCTCAqcFNyYyA9IHBJbnB1dDsKICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERzdCA9IGFEc3Q7CiAgICAgLyogTWVyZ2UgMyBsb29wcyBpbnRvIG9uZSwgc2tpcCBjYWxsIG9mIGZmdDMgKi8KLSAgICBmb3IoaT0wLGw9MCxrPTA7IGk8TjU7IGkrKywgays9NikKLSAgICB7Ci0gICAgICBwRHN0W2srMF0gPSBwU3JjW2xdOwotICAgICAgcERzdFtrKzFdID0gcFNyY1tsKzFdOwotICAgICAgbCArPSAyKk41OwotICAgICAgaWYgKGwgPj0gKDIqTjE1KSkKLSAgICAgICAgICBsIC09ICgyKk4xNSk7CisgICAgZm9yIChpID0gMCwgbCA9IDAsIGsgPSAwOyBpIDwgTjU7IGkrKywgayArPSA2KSB7CisgICAgICBwRHN0W2sgKyAwXSA9IHBTcmNbbF07CisgICAgICBwRHN0W2sgKyAxXSA9IHBTcmNbbCArIDFdOworICAgICAgbCArPSAyICogTjU7CisgICAgICBpZiAobCA+PSAoMiAqIE4xNSkpIGwgLT0gKDIgKiBOMTUpOwogCi0gICAgICBwRHN0W2srMl0gPSBwU3JjW2xdOwotICAgICAgcERzdFtrKzNdID0gcFNyY1tsKzFdOwotICAgICAgbCArPSAyKk41OwotICAgICAgaWYgKGwgPj0gKDIqTjE1KSkKLSAgICAgICAgICBsIC09ICgyKk4xNSk7Ci0gICAgICBwRHN0W2srNF0gPSBwU3JjW2xdOwotICAgICAgcERzdFtrKzVdID0gcFNyY1tsKzFdOwotICAgICAgbCArPSAoMipONSkgKyAoMipOMyk7Ci0gICAgICBpZiAobCA+PSAoMipOMTUpKQotICAgICAgICAgIGwgLT0gKDIqTjE1KTsKKyAgICAgIHBEc3RbayArIDJdID0gcFNyY1tsXTsKKyAgICAgIHBEc3RbayArIDNdID0gcFNyY1tsICsgMV07CisgICAgICBsICs9IDIgKiBONTsKKyAgICAgIGlmIChsID49ICgyICogTjE1KSkgbCAtPSAoMiAqIE4xNSk7CisgICAgICBwRHN0W2sgKyA0XSA9IHBTcmNbbF07CisgICAgICBwRHN0W2sgKyA1XSA9IHBTcmNbbCArIDFdOworICAgICAgbCArPSAoMiAqIE41KSArICgyICogTjMpOworICAgICAgaWYgKGwgPj0gKDIgKiBOMTUpKSBsIC09ICgyICogTjE1KTsKIAogICAgICAgLyogZmZ0MyBtZXJnZWQgd2l0aCBzaGlmdCByaWdodCBieSAyIGxvb3AgKi8KLSAgICAgIEZJWFBfREJMIHIxLHIyLHIzOwotICAgICAgRklYUF9EQkwgczEsczI7CisgICAgICBGSVhQX0RCTCByMSwgcjIsIHIzOworICAgICAgRklYUF9EQkwgczEsIHMyOwogICAgICAgLyogcmVhbCBwYXJ0ICovCi0gICAgICByMSAgICAgID0gcERzdFtrKzJdICsgcERzdFtrKzRdOwotICAgICAgcjIgICAgICA9IGZNdWx0KChwRHN0W2srMl0gLSBwRHN0W2srNF0pLCBDMzEpOwotICAgICAgczEgICAgICA9IHBEc3RbayswXTsKLSAgICAgIHBEc3RbayswXSA9IChzMSArIHIxKT4+MjsKLSAgICAgIHIxICAgICAgPSBzMSAtIChyMT4+MSk7CisgICAgICByMSA9IHBEc3RbayArIDJdICsgcERzdFtrICsgNF07CisgICAgICByMiA9IGZNdWx0KChwRHN0W2sgKyAyXSAtIHBEc3RbayArIDRdKSwgQzMxKTsKKyAgICAgIHMxID0gcERzdFtrICsgMF07CisgICAgICBwRHN0W2sgKyAwXSA9IChzMSArIHIxKSA+PiAyOworICAgICAgcjEgPSBzMSAtIChyMSA+PiAxKTsKIAogICAgICAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KLSAgICAgIHMxICAgICAgPSBwRHN0W2srM10gKyBwRHN0W2srNV07Ci0gICAgICBzMiAgICAgID0gZk11bHQoKHBEc3RbayszXSAtIHBEc3Rbays1XSksIEMzMSk7Ci0gICAgICByMyAgICAgID0gcERzdFtrKzFdOwotICAgICAgcERzdFtrKzFdID0gKHIzICsgczEpPj4yOwotICAgICAgczEgICAgICA9IHIzIC0gKHMxPj4xKTsKKyAgICAgIHMxID0gcERzdFtrICsgM10gKyBwRHN0W2sgKyA1XTsKKyAgICAgIHMyID0gZk11bHQoKHBEc3RbayArIDNdIC0gcERzdFtrICsgNV0pLCBDMzEpOworICAgICAgcjMgPSBwRHN0W2sgKyAxXTsKKyAgICAgIHBEc3RbayArIDFdID0gKHIzICsgczEpID4+IDI7CisgICAgICBzMSA9IHIzIC0gKHMxID4+IDEpOwogCiAgICAgICAvKiBjb21iaW5hdGlvbiAqLwotICAgICAgcERzdFtrKzJdID0gKHIxIC0gczIpPj4yOwotICAgICAgcERzdFtrKzRdID0gKHIxICsgczIpPj4yOwotICAgICAgcERzdFtrKzNdID0gKHMxICsgcjIpPj4yOwotICAgICAgcERzdFtrKzVdID0gKHMxIC0gcjIpPj4yOworICAgICAgcERzdFtrICsgMl0gPSAocjEgLSBzMikgPj4gMjsKKyAgICAgIHBEc3RbayArIDRdID0gKHIxICsgczIpID4+IDI7CisgICAgICBwRHN0W2sgKyAzXSA9IChzMSArIHIyKSA+PiAyOworICAgICAgcERzdFtrICsgNV0gPSAoczEgLSByMikgPj4gMjsKICAgICB9CiAgIH0KICAgLyogU29ydCBpbnB1dCB2ZWN0b3IgZm9yIGZmdCdzIG9mIGxlbmd0aCA1CkBAIC0yNjgsMTkgKzY2MiwxOCBAQAogICB7CiAgICAgY29uc3QgRklYUF9EQkwgKnBTcmMgPSBhRHN0OwogICAgIEZJWFBfREJMICpSRVNUUklDVCBwRHN0ID0gYURzdDE7Ci0gICAgZm9yKGk9MCxsPTAsaz0wOyBpPE4zOyBpKyssIGsrPTEwKQotICAgIHsKLSAgICAgIGwgPSAyKmk7Ci0gICAgICBwRHN0W2srMF0gPSBwU3JjW2wrMF07Ci0gICAgICBwRHN0W2srMV0gPSBwU3JjW2wrMV07Ci0gICAgICBwRHN0W2srMl0gPSBwU3JjW2wrMCsoMipOMyldOwotICAgICAgcERzdFtrKzNdID0gcFNyY1tsKzErKDIqTjMpXTsKLSAgICAgIHBEc3Rbays0XSA9IHBTcmNbbCswKyg0Kk4zKV07Ci0gICAgICBwRHN0W2srNV0gPSBwU3JjW2wrMSsoNCpOMyldOwotICAgICAgcERzdFtrKzZdID0gcFNyY1tsKzArKDYqTjMpXTsKLSAgICAgIHBEc3Rbays3XSA9IHBTcmNbbCsxKyg2Kk4zKV07Ci0gICAgICBwRHN0W2srOF0gPSBwU3JjW2wrMCsoOCpOMyldOwotICAgICAgcERzdFtrKzldID0gcFNyY1tsKzErKDgqTjMpXTsKKyAgICBmb3IgKGkgPSAwLCBsID0gMCwgayA9IDA7IGkgPCBOMzsgaSsrLCBrICs9IDEwKSB7CisgICAgICBsID0gMiAqIGk7CisgICAgICBwRHN0W2sgKyAwXSA9IHBTcmNbbCArIDBdOworICAgICAgcERzdFtrICsgMV0gPSBwU3JjW2wgKyAxXTsKKyAgICAgIHBEc3RbayArIDJdID0gcFNyY1tsICsgMCArICgyICogTjMpXTsKKyAgICAgIHBEc3RbayArIDNdID0gcFNyY1tsICsgMSArICgyICogTjMpXTsKKyAgICAgIHBEc3RbayArIDRdID0gcFNyY1tsICsgMCArICg0ICogTjMpXTsKKyAgICAgIHBEc3RbayArIDVdID0gcFNyY1tsICsgMSArICg0ICogTjMpXTsKKyAgICAgIHBEc3RbayArIDZdID0gcFNyY1tsICsgMCArICg2ICogTjMpXTsKKyAgICAgIHBEc3RbayArIDddID0gcFNyY1tsICsgMSArICg2ICogTjMpXTsKKyAgICAgIHBEc3RbayArIDhdID0gcFNyY1tsICsgMCArICg4ICogTjMpXTsKKyAgICAgIHBEc3RbayArIDldID0gcFNyY1tsICsgMSArICg4ICogTjMpXTsKICAgICAgIGZmdDUoJnBEc3Rba10pOwogICAgIH0KICAgfQpAQCAtMjkyLDExMTIgKzY4NSwxMjM4IEBACiAgIHsKICAgICBjb25zdCBGSVhQX0RCTCAqcFNyYyA9IGFEc3QxOwogICAgIEZJWFBfREJMICpSRVNUUklDVCBwRHN0ID0gcElucHV0OwotICAgIGZvcihpPTAsbD0wLGs9MDsgaTxOMzsgaSsrLCBrKz0xMCkKLSAgICB7Ci0gICAgICBwRHN0W2srMF0gPSBwU3JjW2xdOwotICAgICAgcERzdFtrKzFdID0gcFNyY1tsKzFdOwotICAgICAgbCArPSAoMipONik7Ci0gICAgICBpZiAobCA+PSAoMipOMTUpKQotICAgICAgICAgIGwgLT0gKDIqTjE1KTsKLSAgICAgIHBEc3RbaysyXSA9IHBTcmNbbF07Ci0gICAgICBwRHN0W2srM10gPSBwU3JjW2wrMV07Ci0gICAgICBsICs9ICgyKk42KTsKLSAgICAgIGlmIChsID49ICgyKk4xNSkpCi0gICAgICAgICAgbCAtPSAoMipOMTUpOwotICAgICAgcERzdFtrKzRdID0gcFNyY1tsXTsKLSAgICAgIHBEc3Rbays1XSA9IHBTcmNbbCsxXTsKLSAgICAgIGwgKz0gKDIqTjYpOwotICAgICAgaWYgKGwgPj0gKDIqTjE1KSkKLSAgICAgICAgICBsIC09ICgyKk4xNSk7Ci0gICAgICBwRHN0W2srNl0gPSBwU3JjW2xdOwotICAgICAgcERzdFtrKzddID0gcFNyY1tsKzFdOwotICAgICAgbCArPSAoMipONik7Ci0gICAgICBpZiAobCA+PSAoMipOMTUpKQotICAgICAgICAgIGwgLT0gKDIqTjE1KTsKLSAgICAgIHBEc3Rbays4XSA9IHBTcmNbbF07Ci0gICAgICBwRHN0W2srOV0gPSBwU3JjW2wrMV07Ci0gICAgICBsICs9IDI7ICAgIC8qIG5vIG1vZHVsbyBjaGVjayBuZWVkZWQsIGl0IGNhbm5vdCBvY2N1ciAqLworICAgIGZvciAoaSA9IDAsIGwgPSAwLCBrID0gMDsgaSA8IE4zOyBpKyssIGsgKz0gMTApIHsKKyAgICAgIHBEc3RbayArIDBdID0gcFNyY1tsXTsKKyAgICAgIHBEc3RbayArIDFdID0gcFNyY1tsICsgMV07CisgICAgICBsICs9ICgyICogTjYpOworICAgICAgaWYgKGwgPj0gKDIgKiBOMTUpKSBsIC09ICgyICogTjE1KTsKKyAgICAgIHBEc3RbayArIDJdID0gcFNyY1tsXTsKKyAgICAgIHBEc3RbayArIDNdID0gcFNyY1tsICsgMV07CisgICAgICBsICs9ICgyICogTjYpOworICAgICAgaWYgKGwgPj0gKDIgKiBOMTUpKSBsIC09ICgyICogTjE1KTsKKyAgICAgIHBEc3RbayArIDRdID0gcFNyY1tsXTsKKyAgICAgIHBEc3RbayArIDVdID0gcFNyY1tsICsgMV07CisgICAgICBsICs9ICgyICogTjYpOworICAgICAgaWYgKGwgPj0gKDIgKiBOMTUpKSBsIC09ICgyICogTjE1KTsKKyAgICAgIHBEc3RbayArIDZdID0gcFNyY1tsXTsKKyAgICAgIHBEc3RbayArIDddID0gcFNyY1tsICsgMV07CisgICAgICBsICs9ICgyICogTjYpOworICAgICAgaWYgKGwgPj0gKDIgKiBOMTUpKSBsIC09ICgyICogTjE1KTsKKyAgICAgIHBEc3RbayArIDhdID0gcFNyY1tsXTsKKyAgICAgIHBEc3RbayArIDldID0gcFNyY1tsICsgMV07CisgICAgICBsICs9IDI7IC8qIG5vIG1vZHVsbyBjaGVjayBuZWVkZWQsIGl0IGNhbm5vdCBvY2N1ciAqLwogICAgIH0KICAgfQogfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZmdDE1ICovCiAKLSNkZWZpbmUgV19QaUZPVVJUSCBTVEMoMHg1YTgyNzk5YSkKLSNpZm5kZWYgU1VNRElGRl9QSUZPVVJUSAotI2RlZmluZSBTVU1ESUZGX1BJRk9VUlRIKGRpZmYsc3VtLGEsYikgXAotICB7IFwKLSAgICBGSVhQX0RCTCB3YSwgd2I7XAotICAgIHdhID0gZk11bHREaXYyKGEsIFdfUGlGT1VSVEgpO1wKLSAgICB3YiA9IGZNdWx0RGl2MihiLCBXX1BpRk9VUlRIKTtcCi0gICAgZGlmZiA9IHdiIC0gd2E7XAotICAgIHN1bSAgPSB3YiArIHdhO1wKLSAgfQorLyoKKyBTZWxlY3Qgc2hpZnQgcGxhY2VtZW50LgorIFNvbWUgcHJvY2Vzc29ycyBsaWtlIEFSTSBtYXkgc2hpZnQgImZvciBmcmVlIiBpbiBjb21iaW5hdGlvbiB3aXRoIGFuIGFkZGl0aW9uCisgb3Igc3Vic3RyYWN0aW9uLCBidXQgb3RoZXJzIGRvbid0IHNvIGVpdGhlciBjb21iaW5pbmcgc2hpZnQgd2l0aCArLy0gb3IgcmVkdWNlCisgdGhlIHRvdGFsIGFtb3VudCBvciBzaGlmdCBvcGVyYXRpb25zIGlzIG9wdGltYWwKKyAqLworI2lmICFkZWZpbmVkKF9fYXJtX18pCisjZGVmaW5lIFNISUZUX0EgPj4gMQorI2RlZmluZSBTSElGVF9CCisjZWxzZQorI2RlZmluZSBTSElGVF9BCisjZGVmaW5lIFNISUZUX0IgPj4gMQogI2VuZGlmCiAKLS8qIFRoaXMgdmVyc2lvbiBpcyBtb3JlIG92ZXJmbG93IHNhdmUsIGJ1dCBsZXNzIGN5Y2xlIG9wdGltYWwuICovCi0jZGVmaW5lIFNVTURJRkZfRUlHVEgoeCwgeSwgaXgsIGl5LCB2ciwgdmksIHVyLCB1aSkgXAotICB2ciA9ICh4WyAwICsgaXhdPj4xKSArICh4WzE2ICsgaXhdPj4xKTsgIC8qIFJlIEEgKyBSZSBCICovIFwKLSAgdmkgPSAoeFsgOCArIGl4XT4+MSkgKyAoeFsyNCArIGl4XT4+MSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLyBcCi0gIHVyID0gKHhbIDEgKyBpeF0+PjEpICsgKHhbMTcgKyBpeF0+PjEpOyAgLyogSW0gQSArIEltIEIgKi8gXAotICB1aSA9ICh4WyA5ICsgaXhdPj4xKSArICh4WzI1ICsgaXhdPj4xKTsgICAgIC8qIEltIEMgKyBJbSBEICovIFwKLSAgeVsgMCArIGl5XSA9IHZyICsgdmk7ICAgICAvKiBSZSBBJyA9IFJlQSArIFJlQiArUmVDICsgUmVEICovICAgIFwKLSAgeVsgNCArIGl5XSA9IHZyIC0gdmk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8gIFwKLSAgeVsgMSArIGl5XSA9IHVyICsgdWk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLyAgICAgIFwKLSAgeVsgNSArIGl5XSA9IHVyIC0gdWk7ICAgICAvKiBJbSBDJyA9IC1JbSBDIC1JbSBEICtJbSBBICtJbSBCICovIFwKLSAgdnIgLT0geFsxNiArIGl4XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovIFwKLSAgdmkgPSB2aSAtIHhbMjQgKyBpeF07ICAgICAgICAgIC8qIFJlIEMgLSBSZSBEICovIFwKLSAgdXIgLT0geFsxNyArIGl4XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovIFwKLSAgdWkgPSB1aSAtIHhbMjUgKyBpeF07ICAgICAgICAgIC8qIEltIEMgLSBJbSBEICovIFwKLSAgeVsgMiArIGl5XSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8gXAotICB5WyA2ICsgaXldID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLyBcCi0gIHlbIDMgKyBpeV0gPSB1ciAtIHZpOyAgICAgICAgICAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8gIFwKLSAgeVsgNyArIGl5XSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisjaWZuZGVmIEZVTkNUSU9OX2ZmdF8xNiAvKiB3ZSBjaGVjaywgaWYgZmZ0XzE2IChGSVhQX0RCTCAqKSBpcyBub3QgeWV0IGRlZmluZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLXN0YXRpYyBjb25zdCBGSVhQX1NUUCBmZnQxNl93MTZbMl0gPSAgeyBTVENQKDB4NzY0MWFmM2QsIDB4MzBmYmM1NGQpLCBTVENQKDB4MzBmYmM1NGQsIDB4NzY0MWFmM2QpIH07CisvKiBUaGlzIGRlZmluZXMgcHJldmVudHMgdGhpcyBhcnJheSB0byBiZSBkZWNsYXJlZCB0d2ljZSwgaWYgMTYtYml0IGZmdCBpcworICogZW5hYmxlZCB0b28gKi8KKyNkZWZpbmUgRlVOQ1RJT05fREFUQV9mZnRfMTZfdzE2CitzdGF0aWMgY29uc3QgRklYUF9TVFAgZmZ0MTZfdzE2WzJdID0ge1NUQ1AoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQ1AoMHgzMGZiYzU0ZCwgMHg3NjQxYWYzZCl9OwogCiBMTktfU0VDVElPTl9DT0RFX0wxCi1pbmxpbmUgdm9pZCBmZnRfMTYoRklYUF9EQkwgKlJFU1RSSUNUIHgpCi17Ci0gIEZJWFBfREJMIHZyLCB2aSwgdXIsIHVpOwotICBGSVhQX0RCTCB5WzMyXTsKK2lubGluZSB2b2lkIGZmdF8xNihGSVhQX0RCTCAqUkVTVFJJQ1QgeCkgeworICBGSVhQX0RCTCB2ciwgdXI7CisgIEZJWFBfREJMIHZyMiwgdXIyOworICBGSVhQX0RCTCB2cjMsIHVyMzsKKyAgRklYUF9EQkwgdnI0LCB1cjQ7CisgIEZJWFBfREJMIHZpLCB1aTsKKyAgRklYUF9EQkwgdmkyLCB1aTI7CisgIEZJWFBfREJMIHZpMywgdWkzOwogCi0gIFNVTURJRkZfRUlHVEgoeCwgeSwgMCwgIDAsIHZyLCB2aSwgdXIsIHVpKTsKLSAgU1VNRElGRl9FSUdUSCh4LCB5LCA0LCAgOCwgdnIsIHZpLCB1ciwgdWkpOwotICBTVU1ESUZGX0VJR1RIKHgsIHksIDIsIDE2LCB2ciwgdmksIHVyLCB1aSk7Ci0gIFNVTURJRkZfRUlHVEgoeCwgeSwgNiwgMjQsIHZyLCB2aSwgdXIsIHVpKTsKKyAgdnIgPSAoeFswXSA+PiAxKSArICh4WzE2XSA+PiAxKTsgICAgICAgLyogUmUgQSArIFJlIEIgKi8KKyAgdXIgPSAoeFsxXSA+PiAxKSArICh4WzE3XSA+PiAxKTsgICAgICAgLyogSW0gQSArIEltIEIgKi8KKyAgdmkgPSAoeFs4XSBTSElGVF9BKSArICh4WzI0XSBTSElGVF9BKTsgLyogUmUgQyArIFJlIEQgKi8KKyAgdWkgPSAoeFs5XSBTSElGVF9BKSArICh4WzI1XSBTSElGVF9BKTsgLyogSW0gQyArIEltIEQgKi8KKyAgeFswXSA9IHZyICsgKHZpIFNISUZUX0IpOyAgICAgICAgICAgICAgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLworICB4WzFdID0gdXIgKyAodWkgU0hJRlRfQik7ICAgICAgICAgICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLwogCi0vLyB4dDEgPSAgMAotLy8geHQyID0gIDgKLSAgdnIgPSB5WyA4XTsKLSAgdmkgPSB5WyA5XTsKLSAgdXIgPSB5WyAwXT4+MTsKLSAgdWkgPSB5WyAxXT4+MTsKLSAgeFsgMF0gPSB1ciArICh2cj4+MSk7Ci0gIHhbIDFdID0gdWkgKyAodmk+PjEpOwotICB4WyA4XSA9IHVyIC0gKHZyPj4xKTsKLSAgeFsgOV0gPSB1aSAtICh2aT4+MSk7CisgIHZyMiA9ICh4WzRdID4+IDEpICsgKHhbMjBdID4+IDEpOyAvKiBSZSBBICsgUmUgQiAqLworICB1cjIgPSAoeFs1XSA+PiAxKSArICh4WzIxXSA+PiAxKTsgLyogSW0gQSArIEltIEIgKi8KIAotLy8geHQxID0gIDQKLS8vIHh0MiA9IDEyCi0gIHZyID0geVsxM107Ci0gIHZpID0geVsxMl07Ci0gIHVyID0geVsgNF0+PjE7Ci0gIHVpID0geVsgNV0+PjE7Ci0gIHhbIDRdID0gdXIgKyAodnI+PjEpOwotICB4WyA1XSA9IHVpIC0gKHZpPj4xKTsKLSAgeFsxMl0gPSB1ciAtICh2cj4+MSk7Ci0gIHhbMTNdID0gdWkgKyAodmk+PjEpOworICB4WzRdID0gdnIgLSAodmkgU0hJRlRfQik7IC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLworICB4WzVdID0gdXIgLSAodWkgU0hJRlRfQik7IC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKyAgdnIgLT0geFsxNl07ICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLworICB2aSA9ICh2aSBTSElGVF9CKS14WzI0XTsgIC8qIFJlIEMgLSBSZSBEICovCisgIHVyIC09IHhbMTddOyAgICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8KKyAgdWkgPSAodWkgU0hJRlRfQikteFsyNV07ICAvKiBJbSBDIC0gSW0gRCAqLwogCi0vLyB4dDEgPSAxNgotLy8geHQyID0gMjQKLSAgdnIgPSB5WzI0XTsKLSAgdmkgPSB5WzI1XTsKLSAgdXIgPSB5WzE2XT4+MTsKLSAgdWkgPSB5WzE3XT4+MTsKLSAgeFsxNl0gPSB1ciArICh2cj4+MSk7Ci0gIHhbMTddID0gdWkgKyAodmk+PjEpOwotICB4WzI0XSA9IHVyIC0gKHZyPj4xKTsKLSAgeFsyNV0gPSB1aSAtICh2aT4+MSk7CisgIHZyMyA9ICh4WzJdID4+IDEpICsgKHhbMThdID4+IDEpOyAvKiBSZSBBICsgUmUgQiAqLworICB1cjMgPSAoeFszXSA+PiAxKSArICh4WzE5XSA+PiAxKTsgLyogSW0gQSArIEltIEIgKi8KIAotLy8geHQxID0gMjAKLS8vIHh0MiA9IDI4Ci0gIHZyID0geVsyOV07Ci0gIHZpID0geVsyOF07Ci0gIHVyID0geVsyMF0+PjE7Ci0gIHVpID0geVsyMV0+PjE7Ci0gIHhbMjBdID0gdXIgKyAodnI+PjEpOwotICB4WzIxXSA9IHVpIC0gKHZpPj4xKTsKLSAgeFsyOF0gPSB1ciAtICh2cj4+MSk7Ci0gIHhbMjldID0gdWkgKyAodmk+PjEpOworICB4WzJdID0gdWkgKyB2cjsgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLworICB4WzNdID0gdXIgLSB2aTsgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgdnI0ID0gKHhbNl0gPj4gMSkgKyAoeFsyMl0gPj4gMSk7IC8qIFJlIEEgKyBSZSBCICovCisgIHVyNCA9ICh4WzddID4+IDEpICsgKHhbMjNdID4+IDEpOyAvKiBJbSBBICsgSW0gQiAqLworCisgIHhbNl0gPSB2ciAtIHVpOyAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCisgIHhbN10gPSB2aSArIHVyOyAvKiBJbSBEJz0gUmUgQyAtIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworCisgIHZpMiA9ICh4WzEyXSBTSElGVF9BKSArICh4WzI4XSBTSElGVF9BKTsgLyogUmUgQyArIFJlIEQgKi8KKyAgdWkyID0gKHhbMTNdIFNISUZUX0EpICsgKHhbMjldIFNISUZUX0EpOyAvKiBJbSBDICsgSW0gRCAqLworICB4WzhdID0gdnIyICsgKHZpMiBTSElGVF9CKTsgICAgICAgICAgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgeFs5XSA9IHVyMiArICh1aTIgU0hJRlRfQik7ICAgICAgICAgICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICB4WzEyXSA9IHZyMiAtICh2aTIgU0hJRlRfQik7ICAgICAgICAgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLworICB4WzEzXSA9IHVyMiAtICh1aTIgU0hJRlRfQik7ICAgICAgICAgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKyAgdnIyIC09IHhbMjBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLworICB1cjIgLT0geFsyMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCisgIHZpMiA9ICh2aTIgU0hJRlRfQikteFsyOF07ICAgICAgICAgICAgICAgLyogUmUgQyAtIFJlIEQgKi8KKyAgdWkyID0gKHVpMiBTSElGVF9CKS14WzI5XTsgICAgICAgICAgICAgICAvKiBJbSBDIC0gSW0gRCAqLworCisgIHZpID0gKHhbMTBdIFNISUZUX0EpICsgKHhbMjZdIFNISUZUX0EpOyAvKiBSZSBDICsgUmUgRCAqLworICB1aSA9ICh4WzExXSBTSElGVF9BKSArICh4WzI3XSBTSElGVF9BKTsgLyogSW0gQyArIEltIEQgKi8KKworICB4WzEwXSA9IHVpMiArIHZyMjsgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLworICB4WzExXSA9IHVyMiAtIHZpMjsgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgdmkzID0gKHhbMTRdIFNISUZUX0EpICsgKHhbMzBdIFNISUZUX0EpOyAvKiBSZSBDICsgUmUgRCAqLworICB1aTMgPSAoeFsxNV0gU0hJRlRfQSkgKyAoeFszMV0gU0hJRlRfQSk7IC8qIEltIEMgKyBJbSBEICovCisKKyAgeFsxNF0gPSB2cjIgLSB1aTI7IC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KKyAgeFsxNV0gPSB2aTIgKyB1cjI7IC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgeFsxNl0gPSB2cjMgKyAodmkgU0hJRlRfQik7IC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgeFsxN10gPSB1cjMgKyAodWkgU0hJRlRfQik7IC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCisgIHhbMjBdID0gdnIzIC0gKHZpIFNISUZUX0IpOyAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgeFsyMV0gPSB1cjMgLSAodWkgU0hJRlRfQik7IC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKyAgdnIzIC09IHhbMThdOyAgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgIHVyMyAtPSB4WzE5XTsgICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICB2aSA9ICh2aSBTSElGVF9CKS14WzI2XTsgICAgLyogUmUgQyAtIFJlIEQgKi8KKyAgdWkgPSAodWkgU0hJRlRfQikteFsyN107ICAgIC8qIEltIEMgLSBJbSBEICovCisgIHhbMThdID0gdWkgKyB2cjM7ICAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgIHhbMTldID0gdXIzIC0gdmk7ICAgICAgICAgICAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8KKworICB4WzI0XSA9IHZyNCArICh2aTMgU0hJRlRfQik7IC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgeFsyOF0gPSB2cjQgLSAodmkzIFNISUZUX0IpOyAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgeFsyNV0gPSB1cjQgKyAodWkzIFNISUZUX0IpOyAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICB4WzI5XSA9IHVyNCAtICh1aTMgU0hJRlRfQik7IC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKyAgdnI0IC09IHhbMjJdOyAgICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLworICB1cjQgLT0geFsyM107ICAgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCisKKyAgeFsyMl0gPSB2cjMgLSB1aTsgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICB4WzIzXSA9IHZpICsgdXIzOyAvKiBJbSBEJz0gUmUgQyAtIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworCisgIHZpMyA9ICh2aTMgU0hJRlRfQikteFszMF07IC8qIFJlIEMgLSBSZSBEICovCisgIHVpMyA9ICh1aTMgU0hJRlRfQikteFszMV07IC8qIEltIEMgLSBJbSBEICovCisgIHhbMjZdID0gdWkzICsgdnI0OyAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KKyAgeFszMF0gPSB2cjQgLSB1aTM7ICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICB4WzI3XSA9IHVyNCAtIHZpMzsgICAgICAgICAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8KKyAgeFszMV0gPSB2aTMgKyB1cjQ7ICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KKworICAvLyB4dDEgPSAgMAorICAvLyB4dDIgPSAgOAorICB2ciA9IHhbOF07CisgIHZpID0geFs5XTsKKyAgdXIgPSB4WzBdID4+IDE7CisgIHVpID0geFsxXSA+PiAxOworICB4WzBdID0gdXIgKyAodnIgPj4gMSk7CisgIHhbMV0gPSB1aSArICh2aSA+PiAxKTsKKyAgeFs4XSA9IHVyIC0gKHZyID4+IDEpOworICB4WzldID0gdWkgLSAodmkgPj4gMSk7CisKKyAgLy8geHQxID0gIDQKKyAgLy8geHQyID0gMTIKKyAgdnIgPSB4WzEzXTsKKyAgdmkgPSB4WzEyXTsKKyAgdXIgPSB4WzRdID4+IDE7CisgIHVpID0geFs1XSA+PiAxOworICB4WzRdID0gdXIgKyAodnIgPj4gMSk7CisgIHhbNV0gPSB1aSAtICh2aSA+PiAxKTsKKyAgeFsxMl0gPSB1ciAtICh2ciA+PiAxKTsKKyAgeFsxM10gPSB1aSArICh2aSA+PiAxKTsKKworICAvLyB4dDEgPSAxNgorICAvLyB4dDIgPSAyNAorICB2ciA9IHhbMjRdOworICB2aSA9IHhbMjVdOworICB1ciA9IHhbMTZdID4+IDE7CisgIHVpID0geFsxN10gPj4gMTsKKyAgeFsxNl0gPSB1ciArICh2ciA+PiAxKTsKKyAgeFsxN10gPSB1aSArICh2aSA+PiAxKTsKKyAgeFsyNF0gPSB1ciAtICh2ciA+PiAxKTsKKyAgeFsyNV0gPSB1aSAtICh2aSA+PiAxKTsKKworICAvLyB4dDEgPSAyMAorICAvLyB4dDIgPSAyOAorICB2ciA9IHhbMjldOworICB2aSA9IHhbMjhdOworICB1ciA9IHhbMjBdID4+IDE7CisgIHVpID0geFsyMV0gPj4gMTsKKyAgeFsyMF0gPSB1ciArICh2ciA+PiAxKTsKKyAgeFsyMV0gPSB1aSAtICh2aSA+PiAxKTsKKyAgeFsyOF0gPSB1ciAtICh2ciA+PiAxKTsKKyAgeFsyOV0gPSB1aSArICh2aSA+PiAxKTsKIAogICAvLyB4dDEgPSAgMgotLy8geHQyID0gMTAKLSAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHlbMTBdLCB5WzExXSkKLSAgLy92ciA9IGZNdWx0RGl2MigoeVsxMV0gKyB5WzEwXSksV19QaUZPVVJUSCk7Ci0gIC8vdmkgPSBmTXVsdERpdjIoKHlbMTFdIC0geVsxMF0pLFdfUGlGT1VSVEgpOwotICB1ciA9IHlbIDJdOwotICB1aSA9IHlbIDNdOwotICB4WyAyXSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsgM10gPSAodWk+PjEpICsgdmk7Ci0gIHhbMTBdID0gKHVyPj4xKSAtIHZyOwotICB4WzExXSA9ICh1aT4+MSkgLSB2aTsKKyAgLy8geHQyID0gMTAKKyAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHhbMTBdLCB4WzExXSkKKyAgLy8gdnIgPSBmTXVsdERpdjIoKHhbMTFdICsgeFsxMF0pLFdfUGlGT1VSVEgpOworICAvLyB2aSA9IGZNdWx0RGl2MigoeFsxMV0gLSB4WzEwXSksV19QaUZPVVJUSCk7CisgIHVyID0geFsyXTsKKyAgdWkgPSB4WzNdOworICB4WzJdID0gKHVyID4+IDEpICsgdnI7CisgIHhbM10gPSAodWkgPj4gMSkgKyB2aTsKKyAgeFsxMF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgeFsxMV0gPSAodWkgPj4gMSkgLSB2aTsKIAotLy8geHQxID0gIDYKLS8vIHh0MiA9IDE0Ci0gIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB5WzE0XSwgeVsxNV0pCi0gIHVyID0geVsgNl07Ci0gIHVpID0geVsgN107Ci0gIHhbIDZdID0gKHVyPj4xKSArIHZyOwotICB4WyA3XSA9ICh1aT4+MSkgLSB2aTsKLSAgeFsxNF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMTVdID0gKHVpPj4xKSArIHZpOworICAvLyB4dDEgPSAgNgorICAvLyB4dDIgPSAxNAorICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeFsxNF0sIHhbMTVdKQorICB1ciA9IHhbNl07CisgIHVpID0geFs3XTsKKyAgeFs2XSA9ICh1ciA+PiAxKSArIHZyOworICB4WzddID0gKHVpID4+IDEpIC0gdmk7CisgIHhbMTRdID0gKHVyID4+IDEpIC0gdnI7CisgIHhbMTVdID0gKHVpID4+IDEpICsgdmk7CiAKLS8vIHh0MSA9IDE4Ci0vLyB4dDIgPSAyNgotICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeVsyNl0sIHlbMjddKQotICB1ciA9IHlbMThdOwotICB1aSA9IHlbMTldOwotICB4WzE4XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsxOV0gPSAodWk+PjEpICsgdmk7Ci0gIHhbMjZdID0gKHVyPj4xKSAtIHZyOwotICB4WzI3XSA9ICh1aT4+MSkgLSB2aTsKKyAgLy8geHQxID0gMTgKKyAgLy8geHQyID0gMjYKKyAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHhbMjZdLCB4WzI3XSkKKyAgdXIgPSB4WzE4XTsKKyAgdWkgPSB4WzE5XTsKKyAgeFsxOF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgeFsxOV0gPSAodWkgPj4gMSkgKyB2aTsKKyAgeFsyNl0gPSAodXIgPj4gMSkgLSB2cjsKKyAgeFsyN10gPSAodWkgPj4gMSkgLSB2aTsKIAotLy8geHQxID0gMjIKLS8vIHh0MiA9IDMwCi0gIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB5WzMwXSwgeVszMV0pCi0gIHVyID0geVsyMl07Ci0gIHVpID0geVsyM107Ci0gIHhbMjJdID0gKHVyPj4xKSArIHZyOwotICB4WzIzXSA9ICh1aT4+MSkgLSB2aTsKLSAgeFszMF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMzFdID0gKHVpPj4xKSArIHZpOworICAvLyB4dDEgPSAyMgorICAvLyB4dDIgPSAzMAorICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeFszMF0sIHhbMzFdKQorICB1ciA9IHhbMjJdOworICB1aSA9IHhbMjNdOworICB4WzIyXSA9ICh1ciA+PiAxKSArIHZyOworICB4WzIzXSA9ICh1aSA+PiAxKSAtIHZpOworICB4WzMwXSA9ICh1ciA+PiAxKSAtIHZyOworICB4WzMxXSA9ICh1aSA+PiAxKSArIHZpOwogCi0vLyB4dDEgPSAgMAotLy8geHQyID0gMTYKKyAgLy8geHQxID0gIDAKKyAgLy8geHQyID0gMTYKICAgdnIgPSB4WzE2XTsKICAgdmkgPSB4WzE3XTsKLSAgdXIgPSB4WyAwXT4+MTsKLSAgdWkgPSB4WyAxXT4+MTsKLSAgeFsgMF0gPSB1ciArICh2cj4+MSk7Ci0gIHhbIDFdID0gdWkgKyAodmk+PjEpOwotICB4WzE2XSA9IHVyIC0gKHZyPj4xKTsKLSAgeFsxN10gPSB1aSAtICh2aT4+MSk7CisgIHVyID0geFswXSA+PiAxOworICB1aSA9IHhbMV0gPj4gMTsKKyAgeFswXSA9IHVyICsgKHZyID4+IDEpOworICB4WzFdID0gdWkgKyAodmkgPj4gMSk7CisgIHhbMTZdID0gdXIgLSAodnIgPj4gMSk7CisgIHhbMTddID0gdWkgLSAodmkgPj4gMSk7CiAKLS8vIHh0MSA9ICA4Ci0vLyB4dDIgPSAyNAorICAvLyB4dDEgPSAgOAorICAvLyB4dDIgPSAyNAogICB2aSA9IHhbMjRdOwogICB2ciA9IHhbMjVdOwotICB1ciA9IHhbIDhdPj4xOwotICB1aSA9IHhbIDldPj4xOwotICB4WyA4XSA9IHVyICsgKHZyPj4xKTsKLSAgeFsgOV0gPSB1aSAtICh2aT4+MSk7Ci0gIHhbMjRdID0gdXIgLSAodnI+PjEpOwotICB4WzI1XSA9IHVpICsgKHZpPj4xKTsKKyAgdXIgPSB4WzhdID4+IDE7CisgIHVpID0geFs5XSA+PiAxOworICB4WzhdID0gdXIgKyAodnIgPj4gMSk7CisgIHhbOV0gPSB1aSAtICh2aSA+PiAxKTsKKyAgeFsyNF0gPSB1ciAtICh2ciA+PiAxKTsKKyAgeFsyNV0gPSB1aSArICh2aSA+PiAxKTsKIAotLy8geHQxID0gIDIKLS8vIHh0MiA9IDE4CisgIC8vIHh0MSA9ICAyCisgIC8vIHh0MiA9IDE4CiAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFsxOV0sIHhbMThdLCBmZnQxNl93MTZbMF0pOwotICB1ciA9IHhbIDJdOwotICB1aSA9IHhbIDNdOwotICB4WyAyXSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsgM10gPSAodWk+PjEpICsgdmk7Ci0gIHhbMThdID0gKHVyPj4xKSAtIHZyOwotICB4WzE5XSA9ICh1aT4+MSkgLSB2aTsKKyAgdXIgPSB4WzJdOworICB1aSA9IHhbM107CisgIHhbMl0gPSAodXIgPj4gMSkgKyB2cjsKKyAgeFszXSA9ICh1aSA+PiAxKSArIHZpOworICB4WzE4XSA9ICh1ciA+PiAxKSAtIHZyOworICB4WzE5XSA9ICh1aSA+PiAxKSAtIHZpOwogCi0vLyB4dDEgPSAxMAotLy8geHQyID0gMjYKKyAgLy8geHQxID0gMTAKKyAgLy8geHQyID0gMjYKICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzI3XSwgeFsyNl0sIGZmdDE2X3cxNlswXSk7CiAgIHVyID0geFsxMF07CiAgIHVpID0geFsxMV07Ci0gIHhbMTBdID0gKHVyPj4xKSArIHZyOwotICB4WzExXSA9ICh1aT4+MSkgLSB2aTsKLSAgeFsyNl0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMjddID0gKHVpPj4xKSArIHZpOworICB4WzEwXSA9ICh1ciA+PiAxKSArIHZyOworICB4WzExXSA9ICh1aSA+PiAxKSAtIHZpOworICB4WzI2XSA9ICh1ciA+PiAxKSAtIHZyOworICB4WzI3XSA9ICh1aSA+PiAxKSArIHZpOwogCi0vLyB4dDEgPSAgNAotLy8geHQyID0gMjAKKyAgLy8geHQxID0gIDQKKyAgLy8geHQyID0gMjAKICAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHhbMjBdLCB4WzIxXSkKLSAgdXIgPSB4WyA0XTsKLSAgdWkgPSB4WyA1XTsKLSAgeFsgNF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbIDVdID0gKHVpPj4xKSArIHZpOwotICB4WzIwXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFsyMV0gPSAodWk+PjEpIC0gdmk7CisgIHVyID0geFs0XTsKKyAgdWkgPSB4WzVdOworICB4WzRdID0gKHVyID4+IDEpICsgdnI7CisgIHhbNV0gPSAodWkgPj4gMSkgKyB2aTsKKyAgeFsyMF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgeFsyMV0gPSAodWkgPj4gMSkgLSB2aTsKIAotLy8geHQxID0gMTIKLS8vIHh0MiA9IDI4CisgIC8vIHh0MSA9IDEyCisgIC8vIHh0MiA9IDI4CiAgIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB4WzI4XSwgeFsyOV0pCiAgIHVyID0geFsxMl07CiAgIHVpID0geFsxM107Ci0gIHhbMTJdID0gKHVyPj4xKSArIHZyOwotICB4WzEzXSA9ICh1aT4+MSkgLSB2aTsKLSAgeFsyOF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMjldID0gKHVpPj4xKSArIHZpOworICB4WzEyXSA9ICh1ciA+PiAxKSArIHZyOworICB4WzEzXSA9ICh1aSA+PiAxKSAtIHZpOworICB4WzI4XSA9ICh1ciA+PiAxKSAtIHZyOworICB4WzI5XSA9ICh1aSA+PiAxKSArIHZpOwogCi0vLyB4dDEgPSAgNgotLy8geHQyID0gMjIKKyAgLy8geHQxID0gIDYKKyAgLy8geHQyID0gMjIKICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzIzXSwgeFsyMl0sIGZmdDE2X3cxNlsxXSk7Ci0gIHVyID0geFsgNl07Ci0gIHVpID0geFsgN107Ci0gIHhbIDZdID0gKHVyPj4xKSArIHZyOwotICB4WyA3XSA9ICh1aT4+MSkgKyB2aTsKLSAgeFsyMl0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMjNdID0gKHVpPj4xKSAtIHZpOworICB1ciA9IHhbNl07CisgIHVpID0geFs3XTsKKyAgeFs2XSA9ICh1ciA+PiAxKSArIHZyOworICB4WzddID0gKHVpID4+IDEpICsgdmk7CisgIHhbMjJdID0gKHVyID4+IDEpIC0gdnI7CisgIHhbMjNdID0gKHVpID4+IDEpIC0gdmk7CiAKLS8vIHh0MSA9IDE0Ci0vLyB4dDIgPSAzMAorICAvLyB4dDEgPSAxNAorICAvLyB4dDIgPSAzMAogICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbMzFdLCB4WzMwXSwgZmZ0MTZfdzE2WzFdKTsKICAgdXIgPSB4WzE0XTsKICAgdWkgPSB4WzE1XTsKLSAgeFsxNF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMTVdID0gKHVpPj4xKSAtIHZpOwotICB4WzMwXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFszMV0gPSAodWk+PjEpICsgdmk7CisgIHhbMTRdID0gKHVyID4+IDEpICsgdnI7CisgIHhbMTVdID0gKHVpID4+IDEpIC0gdmk7CisgIHhbMzBdID0gKHVyID4+IDEpIC0gdnI7CisgIHhbMzFdID0gKHVpID4+IDEpICsgdmk7CiB9CisjZW5kaWYgLyogRlVOQ1RJT05fZmZ0XzE2ICovCiAKICNpZm5kZWYgRlVOQ1RJT05fZmZ0XzMyCi1zdGF0aWMgY29uc3QgRklYUF9TVFAgZmZ0MzJfdzMyWzZdID0KLXsKLSAgU1RDUCAoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksIFNUQ1AoMHgzMGZiYzU0ZCwgMHg3NjQxYWYzZCksIFNUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksCi0gIFNUQ1AgKDB4NmE2ZDk4YTQsIDB4NDcxY2VjZTcpLCBTVENQKDB4NDcxY2VjZTcsIDB4NmE2ZDk4YTQpLCBTVENQKDB4MThmOGI4M2MsIDB4N2Q4YTVmNDApCi19OwotCi1MTktfU0VDVElPTl9DT0RFX0wxCi1pbmxpbmUgdm9pZCBmZnRfMzIoRklYUF9EQkwgKngpCi17Ci0KK3N0YXRpYyBjb25zdCBGSVhQX1NUUCBmZnQzMl93MzJbNl0gPSB7CisgICAgU1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgU1RDUCgweDMwZmJjNTRkLCAweDc2NDFhZjNkKSwKKyAgICBTVENQKDB4N2Q4YTVmNDAsIDB4MThmOGI4M2MpLCBTVENQKDB4NmE2ZDk4YTQsIDB4NDcxY2VjZTcpLAorICAgIFNUQ1AoMHg0NzFjZWNlNywgMHg2YTZkOThhNCksIFNUQ1AoMHgxOGY4YjgzYywgMHg3ZDhhNWY0MCl9OwogI2RlZmluZSBXX1BpRk9VUlRIIFNUQygweDVhODI3OTlhKQogCi0gIEZJWFBfREJMIHZyLHZpLHVyLHVpOwotICBGSVhQX0RCTCB5WzY0XTsKLQorTE5LX1NFQ1RJT05fQ09ERV9MMQoraW5saW5lIHZvaWQgZmZ0XzMyKEZJWFBfREJMICpjb25zdCBfeCkgewogICAvKgogICAgKiAxKzIgc3RhZ2UgcmFkaXggNAogICAgKi8KIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAvLyBpID0gMAotICB2ciA9ICh4WyAwXSArIHhbMzJdKT4+MTsgIC8qIFJlIEEgKyBSZSBCICovCi0gIHZpID0gKHhbMTZdICsgeFs0OF0pOyAgICAgLyogUmUgQyArIFJlIEQgKi8KLSAgdXIgPSAoeFsgMV0gKyB4WzMzXSk+PjE7ICAvKiBJbSBBICsgSW0gQiAqLwotICB1aSA9ICh4WzE3XSArIHhbNDldKTsgICAgIC8qIEltIEMgKyBJbSBEICovCi0KLSAgeVsgMF0gPSB2ciArICh2aT4+MSk7ICAgICAvKiBSZSBBJyA9IFJlQSArIFJlQiArUmVDICsgUmVEICovCi0gIHlbIDRdID0gdnIgLSAodmk+PjEpOyAgICAgLyogUmUgQycgPSAtKFJlQytSZUQpICsgKFJlQStSZUIpICovCi0gIHlbIDFdID0gdXIgKyAodWk+PjEpOyAgICAgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KLSAgeVsgNV0gPSB1ciAtICh1aT4+MSk7ICAgICAvKiBJbSBDJyA9IC1JbSBDIC1JbSBEICtJbSBBICtJbSBCICovCi0KLSAgdnIgLT0geFszMl07ICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLwotICB2aSA9ICh2aT4+MSkgLSB4WzQ4XTsgICAgIC8qIFJlIEMgLSBSZSBEICovCi0gIHVyIC09IHhbMzNdOyAgICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8KLSAgdWkgPSAodWk+PjEpIC0geFs0OV07ICAgICAvKiBJbSBDIC0gSW0gRCAqLwotCi0gIHlbIDJdID0gdWkgKyB2cjsgICAgICAgICAgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLwotICB5WyA2XSA9IHZyIC0gdWk7ICAgICAgICAgIC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KLSAgeVsgM10gPSB1ciAtIHZpOyAgICAgICAgICAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8KLSAgeVsgN10gPSB2aSArIHVyOyAgICAgICAgICAvKiBJbSBEJz0gUmUgQyAtIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwotCi0gIC8vaT04Ci0gIHZyID0gKHhbIDhdICsgeFs0MF0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KLSAgdmkgPSAoeFsyNF0gKyB4WzU2XSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLwotICB1ciA9ICh4WyA5XSArIHhbNDFdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCi0gIHVpID0gKHhbMjVdICsgeFs1N10pOyAgICAgLyogSW0gQyArIEltIEQgKi8KLQotICB5WyA4XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KLSAgeVsxMl0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KLSAgeVsgOV0gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLwotICB5WzEzXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KLQotICB2ciAtPSB4WzQwXTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCi0gIHZpID0gKHZpPj4xKSAtIHhbNTZdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgdXIgLT0geFs0MV07ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwotICB1aSA9ICh1aT4+MSkgLSB4WzU3XTsgICAgIC8qIEltIEMgLSBJbSBEICovCi0KLSAgeVsxMF0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCi0gIHlbMTRdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLwotICB5WzExXSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwotICB5WzE1XSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCi0KLSAgLy9pPTE2Ci0gIHZyID0gKHhbIDRdICsgeFszNl0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KLSAgdmkgPSAoeFsyMF0gKyB4WzUyXSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLwotICB1ciA9ICh4WyA1XSArIHhbMzddKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCi0gIHVpID0gKHhbMjFdICsgeFs1M10pOyAgICAgLyogSW0gQyArIEltIEQgKi8KLQotICB5WzE2XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KLSAgeVsyMF0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KLSAgeVsxN10gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLwotICB5WzIxXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KLQotICB2ciAtPSB4WzM2XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCi0gIHZpID0gKHZpPj4xKSAtIHhbNTJdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgdXIgLT0geFszN107ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwotICB1aSA9ICh1aT4+MSkgLSB4WzUzXTsgICAgIC8qIEltIEMgLSBJbSBEICovCi0KLSAgeVsxOF0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCi0gIHlbMjJdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLwotICB5WzE5XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwotICB5WzIzXSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCi0KLSAgLy9pPTI0Ci0gIHZyID0gKHhbMTJdICsgeFs0NF0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KLSAgdmkgPSAoeFsyOF0gKyB4WzYwXSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLwotICB1ciA9ICh4WzEzXSArIHhbNDVdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCi0gIHVpID0gKHhbMjldICsgeFs2MV0pOyAgICAgLyogSW0gQyArIEltIEQgKi8KLQotICB5WzI0XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KLSAgeVsyOF0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KLSAgeVsyNV0gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLwotICB5WzI5XSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KLQotICB2ciAtPSB4WzQ0XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCi0gIHZpID0gKHZpPj4xKSAtIHhbNjBdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgdXIgLT0geFs0NV07ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwotICB1aSA9ICh1aT4+MSkgLSB4WzYxXTsgICAgIC8qIEltIEMgLSBJbSBEICovCi0KLSAgeVsyNl0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCi0gIHlbMzBdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLwotICB5WzI3XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwotICB5WzMxXSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCi0KLSAgLy8gaSA9IDMyCi0gIHZyID0gKHhbIDJdICsgeFszNF0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KLSAgdmkgPSAoeFsxOF0gKyB4WzUwXSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLwotICB1ciA9ICh4WyAzXSArIHhbMzVdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCi0gIHVpID0gKHhbMTldICsgeFs1MV0pOyAgICAgLyogSW0gQyArIEltIEQgKi8KLQotICB5WzMyXSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KLSAgeVszNl0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KLSAgeVszM10gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLwotICB5WzM3XSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KLQotICB2ciAtPSB4WzM0XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCi0gIHZpID0gKHZpPj4xKSAtIHhbNTBdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgdXIgLT0geFszNV07ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwotICB1aSA9ICh1aT4+MSkgLSB4WzUxXTsgICAgIC8qIEltIEMgLSBJbSBEICovCi0KLSAgeVszNF0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCi0gIHlbMzhdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLwotICB5WzM1XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwotICB5WzM5XSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCi0KLSAgLy9pPTQwCi0gIHZyID0gKHhbMTBdICsgeFs0Ml0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KLSAgdmkgPSAoeFsyNl0gKyB4WzU4XSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLwotICB1ciA9ICh4WzExXSArIHhbNDNdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCi0gIHVpID0gKHhbMjddICsgeFs1OV0pOyAgICAgLyogSW0gQyArIEltIEQgKi8KLQotICB5WzQwXSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KLSAgeVs0NF0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KLSAgeVs0MV0gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLwotICB5WzQ1XSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KLQotICB2ciAtPSB4WzQyXTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCi0gIHZpID0gKHZpPj4xKSAtIHhbNThdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgdXIgLT0geFs0M107ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwotICB1aSA9ICh1aT4+MSkgLSB4WzU5XTsgICAgIC8qIEltIEMgLSBJbSBEICovCi0KLSAgeVs0Ml0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCi0gIHlbNDZdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLwotICB5WzQzXSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwotICB5WzQ3XSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCi0KLSAgLy9pPTQ4Ci0gIHZyID0gKHhbIDZdICsgeFszOF0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KLSAgdmkgPSAoeFsyMl0gKyB4WzU0XSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLwotICB1ciA9ICh4WyA3XSArIHhbMzldKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCi0gIHVpID0gKHhbMjNdICsgeFs1NV0pOyAgICAgLyogSW0gQyArIEltIEQgKi8KLQotICB5WzQ4XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KLSAgeVs1Ml0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KLSAgeVs0OV0gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLwotICB5WzUzXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KLQotICB2ciAtPSB4WzM4XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCi0gIHZpID0gKHZpPj4xKSAtIHhbNTRdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgdXIgLT0geFszOV07ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwotICB1aSA9ICh1aT4+MSkgLSB4WzU1XTsgICAgIC8qIEltIEMgLSBJbSBEICovCi0KLSAgeVs1MF0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCi0gIHlbNTRdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLwotICB5WzUxXSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwotICB5WzU1XSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCi0KLSAgLy9pPTU2Ci0gIHZyID0gKHhbMTRdICsgeFs0Nl0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KLSAgdmkgPSAoeFszMF0gKyB4WzYyXSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLwotICB1ciA9ICh4WzE1XSArIHhbNDddKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCi0gIHVpID0gKHhbMzFdICsgeFs2M10pOyAgICAgLyogSW0gQyArIEltIEQgKi8KLQotICB5WzU2XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KLSAgeVs2MF0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KLSAgeVs1N10gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLwotICB5WzYxXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KLQotICB2ciAtPSB4WzQ2XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCi0gIHZpID0gKHZpPj4xKSAtIHhbNjJdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgdXIgLT0geFs0N107ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwotICB1aSA9ICh1aT4+MSkgLSB4WzYzXTsgICAgIC8qIEltIEMgLSBJbSBEICovCi0KLSAgeVs1OF0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCi0gIHlbNjJdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLwotICB5WzU5XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwotICB5WzYzXSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCi0KLQotICBGSVhQX0RCTCAqeHQgPSAmeFswXTsKLSAgRklYUF9EQkwgKnl0ID0gJnlbMF07Ci0KLSAgaW50IGogPSA0OwotICBkbworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICB7Ci0gICAgdnIgPSB5dFs4XTsKLSAgICB2aSA9IHl0WzldOwotICAgIHVyID0geXRbMF0+PjE7Ci0gICAgdWkgPSB5dFsxXT4+MTsKLSAgICB4dFsgMF0gPSB1ciArICh2cj4+MSk7Ci0gICAgeHRbIDFdID0gdWkgKyAodmk+PjEpOwotICAgIHh0WyA4XSA9IHVyIC0gKHZyPj4xKTsKLSAgICB4dFsgOV0gPSB1aSAtICh2aT4+MSk7CisgICAgRklYUF9EQkwgKmNvbnN0IHggPSBfeDsKKyAgICBGSVhQX0RCTCB2aSwgdWk7CisgICAgRklYUF9EQkwgdmkyLCB1aTI7CisgICAgRklYUF9EQkwgdmkzLCB1aTM7CisgICAgRklYUF9EQkwgdnIsIHVyOworICAgIEZJWFBfREJMIHZyMiwgdXIyOworICAgIEZJWFBfREJMIHZyMywgdXIzOworICAgIEZJWFBfREJMIHZyNCwgdXI0OwogCi0gICAgdnIgPSB5dFsxM107Ci0gICAgdmkgPSB5dFsxMl07Ci0gICAgdXIgPSB5dFs0XT4+MTsKLSAgICB1aSA9IHl0WzVdPj4xOwotICAgIHh0WyA0XSA9IHVyICsgKHZyPj4xKTsKLSAgICB4dFsgNV0gPSB1aSAtICh2aT4+MSk7Ci0gICAgeHRbMTJdID0gdXIgLSAodnI+PjEpOwotICAgIHh0WzEzXSA9IHVpICsgKHZpPj4xKTsKKyAgICAvLyBpID0gMAorICAgIHZyID0gKHhbMF0gKyB4WzMyXSkgPj4gMTsgICAgIC8qIFJlIEEgKyBSZSBCICovCisgICAgdXIgPSAoeFsxXSArIHhbMzNdKSA+PiAxOyAgICAgLyogSW0gQSArIEltIEIgKi8KKyAgICB2aSA9ICh4WzE2XSArIHhbNDhdKSBTSElGVF9BOyAvKiBSZSBDICsgUmUgRCAqLworICAgIHVpID0gKHhbMTddICsgeFs0OV0pIFNISUZUX0E7IC8qIEltIEMgKyBJbSBEICovCiAKLSAgICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeXRbMTBdLCB5dFsxMV0pCi0gICAgdXIgPSB5dFsyXTsKLSAgICB1aSA9IHl0WzNdOwotICAgIHh0WyAyXSA9ICh1cj4+MSkgKyB2cjsKLSAgICB4dFsgM10gPSAodWk+PjEpICsgdmk7Ci0gICAgeHRbMTBdID0gKHVyPj4xKSAtIHZyOwotICAgIHh0WzExXSA9ICh1aT4+MSkgLSB2aTsKKyAgICB4WzBdID0gdnIgKyAodmkgU0hJRlRfQik7IC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgICB4WzFdID0gdXIgKyAodWkgU0hJRlRfQik7IC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCiAKLSAgICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeXRbMTRdLCB5dFsxNV0pCi0gICAgdXIgPSB5dFs2XTsKLSAgICB1aSA9IHl0WzddOworICAgIHZyMiA9ICh4WzRdICsgeFszNl0pID4+IDE7IC8qIFJlIEEgKyBSZSBCICovCisgICAgdXIyID0gKHhbNV0gKyB4WzM3XSkgPj4gMTsgLyogSW0gQSArIEltIEIgKi8KIAotICAgIHh0WyA2XSA9ICh1cj4+MSkgKyB2cjsKLSAgICB4dFsgN10gPSAodWk+PjEpIC0gdmk7Ci0gICAgeHRbMTRdID0gKHVyPj4xKSAtIHZyOwotICAgIHh0WzE1XSA9ICh1aT4+MSkgKyB2aTsKLSAgICB4dCArPSAxNjsKLSAgICB5dCArPSAxNjsKLSAgfSB3aGlsZSAoLS1qICE9IDApOworICAgIHhbNF0gPSB2ciAtICh2aSBTSElGVF9CKTsgLyogUmUgQycgPSAtKFJlQytSZUQpICsgKFJlQStSZUIpICovCisgICAgeFs1XSA9IHVyIC0gKHVpIFNISUZUX0IpOyAvKiBJbSBDJyA9IC1JbSBDIC1JbSBEICtJbSBBICtJbSBCICovCiAKLSAgdnIgPSB4WzE2XTsKLSAgdmkgPSB4WzE3XTsKLSAgdXIgPSB4WyAwXT4+MTsKLSAgdWkgPSB4WyAxXT4+MTsKLSAgeFsgMF0gPSB1ciArICh2cj4+MSk7Ci0gIHhbIDFdID0gdWkgKyAodmk+PjEpOwotICB4WzE2XSA9IHVyIC0gKHZyPj4xKTsKLSAgeFsxN10gPSB1aSAtICh2aT4+MSk7CisgICAgdnIgLT0geFszMl07ICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgICAgdXIgLT0geFszM107ICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCisgICAgdmkgPSAodmkgU0hJRlRfQikteFs0OF07IC8qIFJlIEMgLSBSZSBEICovCisgICAgdWkgPSAodWkgU0hJRlRfQikteFs0OV07IC8qIEltIEMgLSBJbSBEICovCiAKLSAgdmkgPSB4WzI0XTsKLSAgdnIgPSB4WzI1XTsKLSAgdXIgPSB4WyA4XT4+MTsKLSAgdWkgPSB4WyA5XT4+MTsKLSAgeFsgOF0gPSB1ciArICh2cj4+MSk7Ci0gIHhbIDldID0gdWkgLSAodmk+PjEpOwotICB4WzI0XSA9IHVyIC0gKHZyPj4xKTsKLSAgeFsyNV0gPSB1aSArICh2aT4+MSk7CisgICAgdnIzID0gKHhbMl0gKyB4WzM0XSkgPj4gMTsgLyogUmUgQSArIFJlIEIgKi8KKyAgICB1cjMgPSAoeFszXSArIHhbMzVdKSA+PiAxOyAvKiBJbSBBICsgSW0gQiAqLwogCi0gIHZyID0geFs0OF07Ci0gIHZpID0geFs0OV07Ci0gIHVyID0geFszMl0+PjE7Ci0gIHVpID0geFszM10+PjE7Ci0gIHhbMzJdID0gdXIgKyAodnI+PjEpOwotICB4WzMzXSA9IHVpICsgKHZpPj4xKTsKLSAgeFs0OF0gPSB1ciAtICh2cj4+MSk7Ci0gIHhbNDldID0gdWkgLSAodmk+PjEpOworICAgIHhbMl0gPSB1aSArIHZyOyAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgICAgeFszXSA9IHVyIC0gdmk7IC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogCi0gIHZpID0geFs1Nl07Ci0gIHZyID0geFs1N107Ci0gIHVyID0geFs0MF0+PjE7Ci0gIHVpID0geFs0MV0+PjE7Ci0gIHhbNDBdID0gdXIgKyAodnI+PjEpOwotICB4WzQxXSA9IHVpIC0gKHZpPj4xKTsKLSAgeFs1Nl0gPSB1ciAtICh2cj4+MSk7Ci0gIHhbNTddID0gdWkgKyAodmk+PjEpOworICAgIHZyNCA9ICh4WzZdICsgeFszOF0pID4+IDE7IC8qIFJlIEEgKyBSZSBCICovCisgICAgdXI0ID0gKHhbN10gKyB4WzM5XSkgPj4gMTsgLyogSW0gQSArIEltIEIgKi8KIAotICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbMTldLCB4WzE4XSwgZmZ0MzJfdzMyWzBdKTsKLSAgdXIgPSB4WyAyXTsKLSAgdWkgPSB4WyAzXTsKLSAgeFsgMl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbIDNdID0gKHVpPj4xKSArIHZpOwotICB4WzE4XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFsxOV0gPSAodWk+PjEpIC0gdmk7CisgICAgeFs2XSA9IHZyIC0gdWk7IC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KKyAgICB4WzddID0gdmkgKyB1cjsgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KIAotICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbMjddLCB4WzI2XSwgZmZ0MzJfdzMyWzBdKTsKLSAgdXIgPSB4WzEwXTsKLSAgdWkgPSB4WzExXTsKLSAgeFsxMF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMTFdID0gKHVpPj4xKSAtIHZpOwotICB4WzI2XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFsyN10gPSAodWk+PjEpICsgdmk7CisgICAgLy8gaT0xNgorICAgIHZpID0gKHhbMjBdICsgeFs1Ml0pIFNISUZUX0E7IC8qIFJlIEMgKyBSZSBEICovCisgICAgdWkgPSAoeFsyMV0gKyB4WzUzXSkgU0hJRlRfQTsgLyogSW0gQyArIEltIEQgKi8KIAotICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbNTFdLCB4WzUwXSwgZmZ0MzJfdzMyWzBdKTsKLSAgdXIgPSB4WzM0XTsKLSAgdWkgPSB4WzM1XTsKLSAgeFszNF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMzVdID0gKHVpPj4xKSArIHZpOwotICB4WzUwXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs1MV0gPSAodWk+PjEpIC0gdmk7CisgICAgeFsxNl0gPSB2cjIgKyAodmkgU0hJRlRfQik7IC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgICB4WzE3XSA9IHVyMiArICh1aSBTSElGVF9CKTsgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KKyAgICB4WzIwXSA9IHZyMiAtICh2aSBTSElGVF9CKTsgLyogUmUgQycgPSAtKFJlQytSZUQpICsgKFJlQStSZUIpICovCisgICAgeFsyMV0gPSB1cjIgLSAodWkgU0hJRlRfQik7IC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KIAotICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNTldLCB4WzU4XSwgZmZ0MzJfdzMyWzBdKTsKLSAgdXIgPSB4WzQyXTsKLSAgdWkgPSB4WzQzXTsKLSAgeFs0Ml0gPSAodXI+PjEpICsgdnI7Ci0gIHhbNDNdID0gKHVpPj4xKSAtIHZpOwotICB4WzU4XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs1OV0gPSAodWk+PjEpICsgdmk7CisgICAgdnIyIC09IHhbMzZdOyAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgICAgdXIyIC09IHhbMzddOyAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCisgICAgdmkgPSAodmkgU0hJRlRfQikteFs1Ml07IC8qIFJlIEMgLSBSZSBEICovCisgICAgdWkgPSAodWkgU0hJRlRfQikteFs1M107IC8qIEltIEMgLSBJbSBEICovCiAKLSAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHhbMjBdLCB4WzIxXSkKLSAgdXIgPSB4WyA0XTsKLSAgdWkgPSB4WyA1XTsKLSAgeFsgNF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbIDVdID0gKHVpPj4xKSArIHZpOwotICB4WzIwXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFsyMV0gPSAodWk+PjEpIC0gdmk7CisgICAgdmkyID0gKHhbMThdICsgeFs1MF0pIFNISUZUX0E7IC8qIFJlIEMgKyBSZSBEICovCisgICAgdWkyID0gKHhbMTldICsgeFs1MV0pIFNISUZUX0E7IC8qIEltIEMgKyBJbSBEICovCiAKLSAgU1VNRElGRl9QSUZPVVJUSCh2ciwgdmksIHhbMjhdLCB4WzI5XSkKLSAgdXIgPSB4WzEyXTsKLSAgdWkgPSB4WzEzXTsKLSAgeFsxMl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMTNdID0gKHVpPj4xKSAtIHZpOwotICB4WzI4XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFsyOV0gPSAodWk+PjEpICsgdmk7CisgICAgeFsxOF0gPSB1aSArIHZyMjsgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbMTldID0gdXIyIC0gdmk7IC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogCi0gIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB4WzUyXSwgeFs1M10pCi0gIHVyID0geFszNl07Ci0gIHVpID0geFszN107Ci0gIHhbMzZdID0gKHVyPj4xKSArIHZyOwotICB4WzM3XSA9ICh1aT4+MSkgKyB2aTsKLSAgeFs1Ml0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNTNdID0gKHVpPj4xKSAtIHZpOworICAgIHZpMyA9ICh4WzIyXSArIHhbNTRdKSBTSElGVF9BOyAvKiBSZSBDICsgUmUgRCAqLworICAgIHVpMyA9ICh4WzIzXSArIHhbNTVdKSBTSElGVF9BOyAvKiBJbSBDICsgSW0gRCAqLwogCi0gIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB4WzYwXSwgeFs2MV0pCi0gIHVyID0geFs0NF07Ci0gIHVpID0geFs0NV07Ci0gIHhbNDRdID0gKHVyPj4xKSArIHZyOwotICB4WzQ1XSA9ICh1aT4+MSkgLSB2aTsKLSAgeFs2MF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNjFdID0gKHVpPj4xKSArIHZpOworICAgIHhbMjJdID0gdnIyIC0gdWk7IC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KKyAgICB4WzIzXSA9IHZpICsgdXIyOyAvKiBJbSBEJz0gUmUgQyAtIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogCisgICAgLy8gaSA9IDMyCiAKLSAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzIzXSwgeFsyMl0sIGZmdDMyX3czMlsxXSk7Ci0gIHVyID0geFsgNl07Ci0gIHVpID0geFsgN107Ci0gIHhbIDZdID0gKHVyPj4xKSArIHZyOwotICB4WyA3XSA9ICh1aT4+MSkgKyB2aTsKLSAgeFsyMl0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMjNdID0gKHVpPj4xKSAtIHZpOworICAgIHhbMzJdID0gdnIzICsgKHZpMiBTSElGVF9CKTsgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLworICAgIHhbMzNdID0gdXIzICsgKHVpMiBTSElGVF9CKTsgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KKyAgICB4WzM2XSA9IHZyMyAtICh2aTIgU0hJRlRfQik7IC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLworICAgIHhbMzddID0gdXIzIC0gKHVpMiBTSElGVF9CKTsgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLwogCi0gIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFszMV0sIHhbMzBdLCBmZnQzMl93MzJbMV0pOwotICB1ciA9IHhbMTRdOwotICB1aSA9IHhbMTVdOwotICB4WzE0XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsxNV0gPSAodWk+PjEpIC0gdmk7Ci0gIHhbMzBdID0gKHVyPj4xKSAtIHZyOwotICB4WzMxXSA9ICh1aT4+MSkgKyB2aTsKKyAgICB2cjMgLT0geFszNF07ICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLworICAgIHVyMyAtPSB4WzM1XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCisgICAgdmkyID0gKHZpMiBTSElGVF9CKS14WzUwXTsgLyogUmUgQyAtIFJlIEQgKi8KKyAgICB1aTIgPSAodWkyIFNISUZUX0IpLXhbNTFdOyAvKiBJbSBDIC0gSW0gRCAqLwogCi0gIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFs1NV0sIHhbNTRdLCBmZnQzMl93MzJbMV0pOwotICB1ciA9IHhbMzhdOwotICB1aSA9IHhbMzldOwotICB4WzM4XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFszOV0gPSAodWk+PjEpICsgdmk7Ci0gIHhbNTRdID0gKHVyPj4xKSAtIHZyOwotICB4WzU1XSA9ICh1aT4+MSkgLSB2aTsKKyAgICB4WzM0XSA9IHVpMiArIHZyMzsgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbMzVdID0gdXIzIC0gdmkyOyAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8KIAotICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNjNdLCB4WzYyXSwgZmZ0MzJfdzMyWzFdKTsKLSAgdXIgPSB4WzQ2XTsKLSAgdWkgPSB4WzQ3XTsKKyAgICAvLyBpPTQ4CiAKLSAgeFs0Nl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbNDddID0gKHVpPj4xKSAtIHZpOwotICB4WzYyXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs2M10gPSAodWk+PjEpICsgdmk7CisgICAgeFs0OF0gPSB2cjQgKyAodmkzIFNISUZUX0IpOyAvKiBSZSBBJyA9IFJlQSArIFJlQiArUmVDICsgUmVEICovCisgICAgeFs1Ml0gPSB2cjQgLSAodmkzIFNISUZUX0IpOyAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgICB4WzQ5XSA9IHVyNCArICh1aTMgU0hJRlRfQik7IC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCisgICAgeFs1M10gPSB1cjQgLSAodWkzIFNISUZUX0IpOyAvKiBJbSBDJyA9IC1JbSBDIC1JbSBEICtJbSBBICtJbSBCICovCiAKLSAgdnIgPSB4WzMyXTsKLSAgdmkgPSB4WzMzXTsKLSAgdXIgPSB4WyAwXT4+MTsKLSAgdWkgPSB4WyAxXT4+MTsKLSAgeFsgMF0gPSB1ciArICh2cj4+MSk7Ci0gIHhbIDFdID0gdWkgKyAodmk+PjEpOwotICB4WzMyXSA9IHVyIC0gKHZyPj4xKTsKLSAgeFszM10gPSB1aSAtICh2aT4+MSk7CisgICAgdnI0IC09IHhbMzhdOyAvKiBSZSBBIC0gUmUgQiAqLworICAgIHVyNCAtPSB4WzM5XTsgLyogSW0gQSAtIEltIEIgKi8KIAotICB2aSA9IHhbNDhdOwotICB2ciA9IHhbNDldOwotICB1ciA9IHhbMTZdPj4xOwotICB1aSA9IHhbMTddPj4xOwotICB4WzE2XSA9IHVyICsgKHZyPj4xKTsKLSAgeFsxN10gPSB1aSAtICh2aT4+MSk7Ci0gIHhbNDhdID0gdXIgLSAodnI+PjEpOwotICB4WzQ5XSA9IHVpICsgKHZpPj4xKTsKKyAgICB4WzM4XSA9IHZyMyAtIHVpMjsgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbMzldID0gdmkyICsgdXIzOyAvKiBJbSBEJz0gUmUgQyAtIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogCi0gIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFszNV0sIHhbMzRdLCBmZnQzMl93MzJbMl0pOwotICB1ciA9IHhbIDJdOwotICB1aSA9IHhbIDNdOwotICB4WyAyXSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsgM10gPSAodWk+PjEpICsgdmk7Ci0gIHhbMzRdID0gKHVyPj4xKSAtIHZyOwotICB4WzM1XSA9ICh1aT4+MSkgLSB2aTsKKyAgICB2aTMgPSAodmkzIFNISUZUX0IpLXhbNTRdOyAvKiBSZSBDIC0gUmUgRCAqLworICAgIHVpMyA9ICh1aTMgU0hJRlRfQikteFs1NV07IC8qIEltIEMgLSBJbSBEICovCiAKLSAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzUxXSwgeFs1MF0sIGZmdDMyX3czMlsyXSk7Ci0gIHVyID0geFsxOF07Ci0gIHVpID0geFsxOV07Ci0gIHhbMThdID0gKHVyPj4xKSArIHZyOwotICB4WzE5XSA9ICh1aT4+MSkgLSB2aTsKLSAgeFs1MF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNTFdID0gKHVpPj4xKSArIHZpOworICAgIHhbNTBdID0gdWkzICsgdnI0OyAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgICAgeFs1NF0gPSB2cjQgLSB1aTM7IC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KKyAgICB4WzUxXSA9IHVyNCAtIHZpMzsgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCisgICAgeFs1NV0gPSB2aTMgKyB1cjQ7IC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCiAKLSAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzM3XSwgeFszNl0sIGZmdDMyX3czMlswXSk7Ci0gIHVyID0geFsgNF07Ci0gIHVpID0geFsgNV07Ci0gIHhbIDRdID0gKHVyPj4xKSArIHZyOwotICB4WyA1XSA9ICh1aT4+MSkgKyB2aTsKLSAgeFszNl0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMzddID0gKHVpPj4xKSAtIHZpOworICAgIC8vIGk9OAorICAgIHZyID0gKHhbOF0gKyB4WzQwXSkgPj4gMTsgICAgIC8qIFJlIEEgKyBSZSBCICovCisgICAgdXIgPSAoeFs5XSArIHhbNDFdKSA+PiAxOyAgICAgLyogSW0gQSArIEltIEIgKi8KKyAgICB2aSA9ICh4WzI0XSArIHhbNTZdKSBTSElGVF9BOyAvKiBSZSBDICsgUmUgRCAqLworICAgIHVpID0gKHhbMjVdICsgeFs1N10pIFNISUZUX0E7IC8qIEltIEMgKyBJbSBEICovCiAKLSAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzUzXSwgeFs1Ml0sIGZmdDMyX3czMlswXSk7Ci0gIHVyID0geFsyMF07Ci0gIHVpID0geFsyMV07Ci0gIHhbMjBdID0gKHVyPj4xKSArIHZyOwotICB4WzIxXSA9ICh1aT4+MSkgLSB2aTsKLSAgeFs1Ml0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNTNdID0gKHVpPj4xKSArIHZpOworICAgIHhbOF0gPSB2ciArICh2aSBTSElGVF9CKTsgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLworICAgIHhbOV0gPSB1ciArICh1aSBTSElGVF9CKTsgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KIAotICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbMzldLCB4WzM4XSwgZmZ0MzJfdzMyWzNdKTsKLSAgdXIgPSB4WyA2XTsKLSAgdWkgPSB4WyA3XTsKLSAgeFsgNl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbIDddID0gKHVpPj4xKSArIHZpOwotICB4WzM4XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFszOV0gPSAodWk+PjEpIC0gdmk7CisgICAgdnIyID0gKHhbMTJdICsgeFs0NF0pID4+IDE7IC8qIFJlIEEgKyBSZSBCICovCisgICAgdXIyID0gKHhbMTNdICsgeFs0NV0pID4+IDE7IC8qIEltIEEgKyBJbSBCICovCiAKLSAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzU1XSwgeFs1NF0sIGZmdDMyX3czMlszXSk7Ci0gIHVyID0geFsyMl07Ci0gIHVpID0geFsyM107Ci0gIHhbMjJdID0gKHVyPj4xKSArIHZyOwotICB4WzIzXSA9ICh1aT4+MSkgLSB2aTsKLSAgeFs1NF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNTVdID0gKHVpPj4xKSArIHZpOworICAgIHhbMTJdID0gdnIgLSAodmkgU0hJRlRfQik7IC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLworICAgIHhbMTNdID0gdXIgLSAodWkgU0hJRlRfQik7IC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KIAotICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeFs0MF0sIHhbNDFdKQotICB1ciA9IHhbIDhdOwotICB1aSA9IHhbIDldOwotICB4WyA4XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsgOV0gPSAodWk+PjEpICsgdmk7Ci0gIHhbNDBdID0gKHVyPj4xKSAtIHZyOwotICB4WzQxXSA9ICh1aT4+MSkgLSB2aTsKKyAgICB2ciAtPSB4WzQwXTsgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KKyAgICB1ciAtPSB4WzQxXTsgICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8KKyAgICB2aSA9ICh2aSBTSElGVF9CKS14WzU2XTsgLyogUmUgQyAtIFJlIEQgKi8KKyAgICB1aSA9ICh1aSBTSElGVF9CKS14WzU3XTsgLyogSW0gQyAtIEltIEQgKi8KIAotICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeFs1Nl0sIHhbNTddKQotICB1ciA9IHhbMjRdOwotICB1aSA9IHhbMjVdOwotICB4WzI0XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsyNV0gPSAodWk+PjEpIC0gdmk7Ci0gIHhbNTZdID0gKHVyPj4xKSAtIHZyOwotICB4WzU3XSA9ICh1aT4+MSkgKyB2aTsKKyAgICB2cjMgPSAoeFsxMF0gKyB4WzQyXSkgPj4gMTsgLyogUmUgQSArIFJlIEIgKi8KKyAgICB1cjMgPSAoeFsxMV0gKyB4WzQzXSkgPj4gMTsgLyogSW0gQSArIEltIEIgKi8KIAotICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbNDNdLCB4WzQyXSwgZmZ0MzJfdzMyWzRdKTsKLSAgdXIgPSB4WzEwXTsKLSAgdWkgPSB4WzExXTsKKyAgICB4WzEwXSA9IHVpICsgdnI7IC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KKyAgICB4WzExXSA9IHVyIC0gdmk7IC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogCi0gIHhbMTBdID0gKHVyPj4xKSArIHZyOwotICB4WzExXSA9ICh1aT4+MSkgKyB2aTsKLSAgeFs0Ml0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNDNdID0gKHVpPj4xKSAtIHZpOworICAgIHZyNCA9ICh4WzE0XSArIHhbNDZdKSA+PiAxOyAvKiBSZSBBICsgUmUgQiAqLworICAgIHVyNCA9ICh4WzE1XSArIHhbNDddKSA+PiAxOyAvKiBJbSBBICsgSW0gQiAqLwogCi0gIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs1OV0sIHhbNThdLCBmZnQzMl93MzJbNF0pOwotICB1ciA9IHhbMjZdOwotICB1aSA9IHhbMjddOwotICB4WzI2XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsyN10gPSAodWk+PjEpIC0gdmk7Ci0gIHhbNThdID0gKHVyPj4xKSAtIHZyOwotICB4WzU5XSA9ICh1aT4+MSkgKyB2aTsKKyAgICB4WzE0XSA9IHZyIC0gdWk7IC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KKyAgICB4WzE1XSA9IHZpICsgdXI7IC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCiAKLSAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzQ1XSwgeFs0NF0sIGZmdDMyX3czMlsxXSk7Ci0gIHVyID0geFsxMl07Ci0gIHVpID0geFsxM107Ci0gIHhbMTJdID0gKHVyPj4xKSArIHZyOwotICB4WzEzXSA9ICh1aT4+MSkgKyB2aTsKLSAgeFs0NF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNDVdID0gKHVpPj4xKSAtIHZpOworICAgIC8vIGk9MjQKKyAgICB2aSA9ICh4WzI4XSArIHhbNjBdKSBTSElGVF9BOyAvKiBSZSBDICsgUmUgRCAqLworICAgIHVpID0gKHhbMjldICsgeFs2MV0pIFNISUZUX0E7IC8qIEltIEMgKyBJbSBEICovCiAKLSAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzYxXSwgeFs2MF0sIGZmdDMyX3czMlsxXSk7Ci0gIHVyID0geFsyOF07Ci0gIHVpID0geFsyOV07Ci0gIHhbMjhdID0gKHVyPj4xKSArIHZyOwotICB4WzI5XSA9ICh1aT4+MSkgLSB2aTsKLSAgeFs2MF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNjFdID0gKHVpPj4xKSArIHZpOworICAgIHhbMjRdID0gdnIyICsgKHZpIFNISUZUX0IpOyAvKiBSZSBBJyA9IFJlQSArIFJlQiArUmVDICsgUmVEICovCisgICAgeFsyOF0gPSB2cjIgLSAodmkgU0hJRlRfQik7IC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLworICAgIHhbMjVdID0gdXIyICsgKHVpIFNISUZUX0IpOyAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICAgIHhbMjldID0gdXIyIC0gKHVpIFNISUZUX0IpOyAvKiBJbSBDJyA9IC1JbSBDIC1JbSBEICtJbSBBICtJbSBCICovCiAKLSAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzQ3XSwgeFs0Nl0sIGZmdDMyX3czMls1XSk7Ci0gIHVyID0geFsxNF07Ci0gIHVpID0geFsxNV07Ci0gIHhbMTRdID0gKHVyPj4xKSArIHZyOwotICB4WzE1XSA9ICh1aT4+MSkgKyB2aTsKLSAgeFs0Nl0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNDddID0gKHVpPj4xKSAtIHZpOworICAgIHZyMiAtPSB4WzQ0XTsgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLworICAgIHVyMiAtPSB4WzQ1XTsgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICAgIHZpID0gKHZpIFNISUZUX0IpLXhbNjBdOyAvKiBSZSBDIC0gUmUgRCAqLworICAgIHVpID0gKHVpIFNISUZUX0IpLXhbNjFdOyAvKiBJbSBDIC0gSW0gRCAqLwogCi0gIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs2M10sIHhbNjJdLCBmZnQzMl93MzJbNV0pOwotICB1ciA9IHhbMzBdOwotICB1aSA9IHhbMzFdOwotICB4WzMwXSA9ICh1cj4+MSkgKyB2cjsKLSAgeFszMV0gPSAodWk+PjEpIC0gdmk7Ci0gIHhbNjJdID0gKHVyPj4xKSAtIHZyOwotICB4WzYzXSA9ICh1aT4+MSkgKyB2aTsKKyAgICB2aTIgPSAoeFsyNl0gKyB4WzU4XSkgU0hJRlRfQTsgLyogUmUgQyArIFJlIEQgKi8KKyAgICB1aTIgPSAoeFsyN10gKyB4WzU5XSkgU0hJRlRfQTsgLyogSW0gQyArIEltIEQgKi8KKworICAgIHhbMjZdID0gdWkgKyB2cjI7IC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KKyAgICB4WzI3XSA9IHVyMiAtIHZpOyAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8KKworICAgIHZpMyA9ICh4WzMwXSArIHhbNjJdKSBTSElGVF9BOyAvKiBSZSBDICsgUmUgRCAqLworICAgIHVpMyA9ICh4WzMxXSArIHhbNjNdKSBTSElGVF9BOyAvKiBJbSBDICsgSW0gRCAqLworCisgICAgeFszMF0gPSB2cjIgLSB1aTsgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbMzFdID0gdmkgKyB1cjI7IC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgICAvLyBpPTQwCisKKyAgICB4WzQwXSA9IHZyMyArICh2aTIgU0hJRlRfQik7IC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgICB4WzQ0XSA9IHZyMyAtICh2aTIgU0hJRlRfQik7IC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLworICAgIHhbNDFdID0gdXIzICsgKHVpMiBTSElGVF9CKTsgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KKyAgICB4WzQ1XSA9IHVyMyAtICh1aTIgU0hJRlRfQik7IC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KKworICAgIHZyMyAtPSB4WzQyXTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgICAgdXIzIC09IHhbNDNdOyAgICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8KKyAgICB2aTIgPSAodmkyIFNISUZUX0IpLXhbNThdOyAvKiBSZSBDIC0gUmUgRCAqLworICAgIHVpMiA9ICh1aTIgU0hJRlRfQikteFs1OV07IC8qIEltIEMgLSBJbSBEICovCisKKyAgICB4WzQyXSA9IHVpMiArIHZyMzsgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbNDNdID0gdXIzIC0gdmkyOyAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8KKworICAgIC8vIGk9NTYKKworICAgIHhbNTZdID0gdnI0ICsgKHZpMyBTSElGVF9CKTsgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLworICAgIHhbNjBdID0gdnI0IC0gKHZpMyBTSElGVF9CKTsgLyogUmUgQycgPSAtKFJlQytSZUQpICsgKFJlQStSZUIpICovCisgICAgeFs1N10gPSB1cjQgKyAodWkzIFNISUZUX0IpOyAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICAgIHhbNjFdID0gdXI0IC0gKHVpMyBTSElGVF9CKTsgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLworCisgICAgdnI0IC09IHhbNDZdOyAvKiBSZSBBIC0gUmUgQiAqLworICAgIHVyNCAtPSB4WzQ3XTsgLyogSW0gQSAtIEltIEIgKi8KKworICAgIHhbNDZdID0gdnIzIC0gdWkyOyAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCisgICAgeFs0N10gPSB2aTIgKyB1cjM7IC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgICB2aTMgPSAodmkzIFNISUZUX0IpLXhbNjJdOyAvKiBSZSBDIC0gUmUgRCAqLworICAgIHVpMyA9ICh1aTMgU0hJRlRfQikteFs2M107IC8qIEltIEMgLSBJbSBEICovCisKKyAgICB4WzU4XSA9IHVpMyArIHZyNDsgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbNjJdID0gdnI0IC0gdWkzOyAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCisgICAgeFs1OV0gPSB1cjQgLSB2aTM7IC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworICAgIHhbNjNdID0gdmkzICsgdXI0OyAvKiBJbSBEJz0gUmUgQyAtIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworICB9CisKKyAgeworICAgIEZJWFBfREJMICp4dCA9IF94OworCisgICAgaW50IGogPSA0OworICAgIGRvIHsKKyAgICAgIEZJWFBfREJMIHZpLCB1aSwgdnIsIHVyOworCisgICAgICB2ciA9IHh0WzhdOworICAgICAgdmkgPSB4dFs5XTsKKyAgICAgIHVyID0geHRbMF0gPj4gMTsKKyAgICAgIHVpID0geHRbMV0gPj4gMTsKKyAgICAgIHh0WzBdID0gdXIgKyAodnIgPj4gMSk7CisgICAgICB4dFsxXSA9IHVpICsgKHZpID4+IDEpOworICAgICAgeHRbOF0gPSB1ciAtICh2ciA+PiAxKTsKKyAgICAgIHh0WzldID0gdWkgLSAodmkgPj4gMSk7CisKKyAgICAgIHZyID0geHRbMTNdOworICAgICAgdmkgPSB4dFsxMl07CisgICAgICB1ciA9IHh0WzRdID4+IDE7CisgICAgICB1aSA9IHh0WzVdID4+IDE7CisgICAgICB4dFs0XSA9IHVyICsgKHZyID4+IDEpOworICAgICAgeHRbNV0gPSB1aSAtICh2aSA+PiAxKTsKKyAgICAgIHh0WzEyXSA9IHVyIC0gKHZyID4+IDEpOworICAgICAgeHRbMTNdID0gdWkgKyAodmkgPj4gMSk7CisKKyAgICAgIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB4dFsxMF0sIHh0WzExXSkKKyAgICAgIHVyID0geHRbMl07CisgICAgICB1aSA9IHh0WzNdOworICAgICAgeHRbMl0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICAgIHh0WzNdID0gKHVpID4+IDEpICsgdmk7CisgICAgICB4dFsxMF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICAgIHh0WzExXSA9ICh1aSA+PiAxKSAtIHZpOworCisgICAgICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeHRbMTRdLCB4dFsxNV0pCisgICAgICB1ciA9IHh0WzZdOworICAgICAgdWkgPSB4dFs3XTsKKworICAgICAgeHRbNl0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICAgIHh0WzddID0gKHVpID4+IDEpIC0gdmk7CisgICAgICB4dFsxNF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICAgIHh0WzE1XSA9ICh1aSA+PiAxKSArIHZpOworICAgICAgeHQgKz0gMTY7CisgICAgfSB3aGlsZSAoLS1qICE9IDApOworICB9CisKKyAgeworICAgIEZJWFBfREJMICpjb25zdCB4ID0gX3g7CisgICAgRklYUF9EQkwgdmksIHVpLCB2ciwgdXI7CisKKyAgICB2ciA9IHhbMTZdOworICAgIHZpID0geFsxN107CisgICAgdXIgPSB4WzBdID4+IDE7CisgICAgdWkgPSB4WzFdID4+IDE7CisgICAgeFswXSA9IHVyICsgKHZyID4+IDEpOworICAgIHhbMV0gPSB1aSArICh2aSA+PiAxKTsKKyAgICB4WzE2XSA9IHVyIC0gKHZyID4+IDEpOworICAgIHhbMTddID0gdWkgLSAodmkgPj4gMSk7CisKKyAgICB2aSA9IHhbMjRdOworICAgIHZyID0geFsyNV07CisgICAgdXIgPSB4WzhdID4+IDE7CisgICAgdWkgPSB4WzldID4+IDE7CisgICAgeFs4XSA9IHVyICsgKHZyID4+IDEpOworICAgIHhbOV0gPSB1aSAtICh2aSA+PiAxKTsKKyAgICB4WzI0XSA9IHVyIC0gKHZyID4+IDEpOworICAgIHhbMjVdID0gdWkgKyAodmkgPj4gMSk7CisKKyAgICB2ciA9IHhbNDhdOworICAgIHZpID0geFs0OV07CisgICAgdXIgPSB4WzMyXSA+PiAxOworICAgIHVpID0geFszM10gPj4gMTsKKyAgICB4WzMyXSA9IHVyICsgKHZyID4+IDEpOworICAgIHhbMzNdID0gdWkgKyAodmkgPj4gMSk7CisgICAgeFs0OF0gPSB1ciAtICh2ciA+PiAxKTsKKyAgICB4WzQ5XSA9IHVpIC0gKHZpID4+IDEpOworCisgICAgdmkgPSB4WzU2XTsKKyAgICB2ciA9IHhbNTddOworICAgIHVyID0geFs0MF0gPj4gMTsKKyAgICB1aSA9IHhbNDFdID4+IDE7CisgICAgeFs0MF0gPSB1ciArICh2ciA+PiAxKTsKKyAgICB4WzQxXSA9IHVpIC0gKHZpID4+IDEpOworICAgIHhbNTZdID0gdXIgLSAodnIgPj4gMSk7CisgICAgeFs1N10gPSB1aSArICh2aSA+PiAxKTsKKworICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFsxOV0sIHhbMThdLCBmZnQzMl93MzJbMF0pOworICAgIHVyID0geFsyXTsKKyAgICB1aSA9IHhbM107CisgICAgeFsyXSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbM10gPSAodWkgPj4gMSkgKyB2aTsKKyAgICB4WzE4XSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbMTldID0gKHVpID4+IDEpIC0gdmk7CisKKyAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbMjddLCB4WzI2XSwgZmZ0MzJfdzMyWzBdKTsKKyAgICB1ciA9IHhbMTBdOworICAgIHVpID0geFsxMV07CisgICAgeFsxMF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzExXSA9ICh1aSA+PiAxKSAtIHZpOworICAgIHhbMjZdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFsyN10gPSAodWkgPj4gMSkgKyB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFs1MV0sIHhbNTBdLCBmZnQzMl93MzJbMF0pOworICAgIHVyID0geFszNF07CisgICAgdWkgPSB4WzM1XTsKKyAgICB4WzM0XSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMzVdID0gKHVpID4+IDEpICsgdmk7CisgICAgeFs1MF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzUxXSA9ICh1aSA+PiAxKSAtIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzU5XSwgeFs1OF0sIGZmdDMyX3czMlswXSk7CisgICAgdXIgPSB4WzQyXTsKKyAgICB1aSA9IHhbNDNdOworICAgIHhbNDJdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFs0M10gPSAodWkgPj4gMSkgLSB2aTsKKyAgICB4WzU4XSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNTldID0gKHVpID4+IDEpICsgdmk7CisKKyAgICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeFsyMF0sIHhbMjFdKQorICAgIHVyID0geFs0XTsKKyAgICB1aSA9IHhbNV07CisgICAgeFs0XSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbNV0gPSAodWkgPj4gMSkgKyB2aTsKKyAgICB4WzIwXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbMjFdID0gKHVpID4+IDEpIC0gdmk7CisKKyAgICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeFsyOF0sIHhbMjldKQorICAgIHVyID0geFsxMl07CisgICAgdWkgPSB4WzEzXTsKKyAgICB4WzEyXSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMTNdID0gKHVpID4+IDEpIC0gdmk7CisgICAgeFsyOF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzI5XSA9ICh1aSA+PiAxKSArIHZpOworCisgICAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHhbNTJdLCB4WzUzXSkKKyAgICB1ciA9IHhbMzZdOworICAgIHVpID0geFszN107CisgICAgeFszNl0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzM3XSA9ICh1aSA+PiAxKSArIHZpOworICAgIHhbNTJdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFs1M10gPSAodWkgPj4gMSkgLSB2aTsKKworICAgIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB4WzYwXSwgeFs2MV0pCisgICAgdXIgPSB4WzQ0XTsKKyAgICB1aSA9IHhbNDVdOworICAgIHhbNDRdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFs0NV0gPSAodWkgPj4gMSkgLSB2aTsKKyAgICB4WzYwXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNjFdID0gKHVpID4+IDEpICsgdmk7CisKKyAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbMjNdLCB4WzIyXSwgZmZ0MzJfdzMyWzFdKTsKKyAgICB1ciA9IHhbNl07CisgICAgdWkgPSB4WzddOworICAgIHhbNl0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzddID0gKHVpID4+IDEpICsgdmk7CisgICAgeFsyMl0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzIzXSA9ICh1aSA+PiAxKSAtIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzMxXSwgeFszMF0sIGZmdDMyX3czMlsxXSk7CisgICAgdXIgPSB4WzE0XTsKKyAgICB1aSA9IHhbMTVdOworICAgIHhbMTRdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFsxNV0gPSAodWkgPj4gMSkgLSB2aTsKKyAgICB4WzMwXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbMzFdID0gKHVpID4+IDEpICsgdmk7CisKKyAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbNTVdLCB4WzU0XSwgZmZ0MzJfdzMyWzFdKTsKKyAgICB1ciA9IHhbMzhdOworICAgIHVpID0geFszOV07CisgICAgeFszOF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzM5XSA9ICh1aSA+PiAxKSArIHZpOworICAgIHhbNTRdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFs1NV0gPSAodWkgPj4gMSkgLSB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs2M10sIHhbNjJdLCBmZnQzMl93MzJbMV0pOworICAgIHVyID0geFs0Nl07CisgICAgdWkgPSB4WzQ3XTsKKworICAgIHhbNDZdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFs0N10gPSAodWkgPj4gMSkgLSB2aTsKKyAgICB4WzYyXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNjNdID0gKHVpID4+IDEpICsgdmk7CisKKyAgICB2ciA9IHhbMzJdOworICAgIHZpID0geFszM107CisgICAgdXIgPSB4WzBdID4+IDE7CisgICAgdWkgPSB4WzFdID4+IDE7CisgICAgeFswXSA9IHVyICsgKHZyID4+IDEpOworICAgIHhbMV0gPSB1aSArICh2aSA+PiAxKTsKKyAgICB4WzMyXSA9IHVyIC0gKHZyID4+IDEpOworICAgIHhbMzNdID0gdWkgLSAodmkgPj4gMSk7CisKKyAgICB2aSA9IHhbNDhdOworICAgIHZyID0geFs0OV07CisgICAgdXIgPSB4WzE2XSA+PiAxOworICAgIHVpID0geFsxN10gPj4gMTsKKyAgICB4WzE2XSA9IHVyICsgKHZyID4+IDEpOworICAgIHhbMTddID0gdWkgLSAodmkgPj4gMSk7CisgICAgeFs0OF0gPSB1ciAtICh2ciA+PiAxKTsKKyAgICB4WzQ5XSA9IHVpICsgKHZpID4+IDEpOworCisgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzM1XSwgeFszNF0sIGZmdDMyX3czMlsyXSk7CisgICAgdXIgPSB4WzJdOworICAgIHVpID0geFszXTsKKyAgICB4WzJdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFszXSA9ICh1aSA+PiAxKSArIHZpOworICAgIHhbMzRdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFszNV0gPSAodWkgPj4gMSkgLSB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs1MV0sIHhbNTBdLCBmZnQzMl93MzJbMl0pOworICAgIHVyID0geFsxOF07CisgICAgdWkgPSB4WzE5XTsKKyAgICB4WzE4XSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMTldID0gKHVpID4+IDEpIC0gdmk7CisgICAgeFs1MF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzUxXSA9ICh1aSA+PiAxKSArIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzM3XSwgeFszNl0sIGZmdDMyX3czMlswXSk7CisgICAgdXIgPSB4WzRdOworICAgIHVpID0geFs1XTsKKyAgICB4WzRdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFs1XSA9ICh1aSA+PiAxKSArIHZpOworICAgIHhbMzZdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFszN10gPSAodWkgPj4gMSkgLSB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs1M10sIHhbNTJdLCBmZnQzMl93MzJbMF0pOworICAgIHVyID0geFsyMF07CisgICAgdWkgPSB4WzIxXTsKKyAgICB4WzIwXSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMjFdID0gKHVpID4+IDEpIC0gdmk7CisgICAgeFs1Ml0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzUzXSA9ICh1aSA+PiAxKSArIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzM5XSwgeFszOF0sIGZmdDMyX3czMlszXSk7CisgICAgdXIgPSB4WzZdOworICAgIHVpID0geFs3XTsKKyAgICB4WzZdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFs3XSA9ICh1aSA+PiAxKSArIHZpOworICAgIHhbMzhdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFszOV0gPSAodWkgPj4gMSkgLSB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs1NV0sIHhbNTRdLCBmZnQzMl93MzJbM10pOworICAgIHVyID0geFsyMl07CisgICAgdWkgPSB4WzIzXTsKKyAgICB4WzIyXSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMjNdID0gKHVpID4+IDEpIC0gdmk7CisgICAgeFs1NF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzU1XSA9ICh1aSA+PiAxKSArIHZpOworCisgICAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHhbNDBdLCB4WzQxXSkKKyAgICB1ciA9IHhbOF07CisgICAgdWkgPSB4WzldOworICAgIHhbOF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzldID0gKHVpID4+IDEpICsgdmk7CisgICAgeFs0MF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzQxXSA9ICh1aSA+PiAxKSAtIHZpOworCisgICAgU1VNRElGRl9QSUZPVVJUSCh2ciwgdmksIHhbNTZdLCB4WzU3XSkKKyAgICB1ciA9IHhbMjRdOworICAgIHVpID0geFsyNV07CisgICAgeFsyNF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzI1XSA9ICh1aSA+PiAxKSAtIHZpOworICAgIHhbNTZdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFs1N10gPSAodWkgPj4gMSkgKyB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFs0M10sIHhbNDJdLCBmZnQzMl93MzJbNF0pOworICAgIHVyID0geFsxMF07CisgICAgdWkgPSB4WzExXTsKKworICAgIHhbMTBdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFsxMV0gPSAodWkgPj4gMSkgKyB2aTsKKyAgICB4WzQyXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNDNdID0gKHVpID4+IDEpIC0gdmk7CisKKyAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNTldLCB4WzU4XSwgZmZ0MzJfdzMyWzRdKTsKKyAgICB1ciA9IHhbMjZdOworICAgIHVpID0geFsyN107CisgICAgeFsyNl0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzI3XSA9ICh1aSA+PiAxKSAtIHZpOworICAgIHhbNThdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFs1OV0gPSAodWkgPj4gMSkgKyB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFs0NV0sIHhbNDRdLCBmZnQzMl93MzJbMV0pOworICAgIHVyID0geFsxMl07CisgICAgdWkgPSB4WzEzXTsKKyAgICB4WzEyXSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMTNdID0gKHVpID4+IDEpICsgdmk7CisgICAgeFs0NF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzQ1XSA9ICh1aSA+PiAxKSAtIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzYxXSwgeFs2MF0sIGZmdDMyX3czMlsxXSk7CisgICAgdXIgPSB4WzI4XTsKKyAgICB1aSA9IHhbMjldOworICAgIHhbMjhdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFsyOV0gPSAodWkgPj4gMSkgLSB2aTsKKyAgICB4WzYwXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNjFdID0gKHVpID4+IDEpICsgdmk7CisKKyAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbNDddLCB4WzQ2XSwgZmZ0MzJfdzMyWzVdKTsKKyAgICB1ciA9IHhbMTRdOworICAgIHVpID0geFsxNV07CisgICAgeFsxNF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzE1XSA9ICh1aSA+PiAxKSArIHZpOworICAgIHhbNDZdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFs0N10gPSAodWkgPj4gMSkgLSB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs2M10sIHhbNjJdLCBmZnQzMl93MzJbNV0pOworICAgIHVyID0geFszMF07CisgICAgdWkgPSB4WzMxXTsKKyAgICB4WzMwXSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMzFdID0gKHVpID4+IDEpIC0gdmk7CisgICAgeFs2Ml0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzYzXSA9ICh1aSA+PiAxKSArIHZpOworICB9CiB9CiAjZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9mZnRfMzIgKi8KIAotCiAvKioKICAqIFxicmllZiBBcHBseSByb3RhdGlvbiB2ZWN0b3JzIHRvIGEgZGF0YSBidWZmZXIuCiAgKiBccGFyYW0gY2wgbGVuZ3RoIG9mIGVhY2ggcm93IG9mIGlucHV0IGRhdGEuCiAgKiBccGFyYW0gbCB0b3RhbCBsZW5ndGggb2YgaW5wdXQgZGF0YS4KLSAqIFxwYXJhbSBwVmVjUmUgcmVhbCBwYXJ0IG9mIHJvdGF0aW9uIGNlb2ZmaWNpZW50IHZlY3Rvci4KLSAqIFxwYXJhbSBwVmVjSW0gaW1hZ2luYXJ5IHBhcnQgb2Ygcm90YXRpb24gY2VvZmZpY2llbnQgdmVjdG9yLgorICogXHBhcmFtIHBWZWNSZSByZWFsIHBhcnQgb2Ygcm90YXRpb24gY29lZmZpY2llbnQgdmVjdG9yLgorICogXHBhcmFtIHBWZWNJbSBpbWFnaW5hcnkgcGFydCBvZiByb3RhdGlvbiBjb2VmZmljaWVudCB2ZWN0b3IuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmZnRfYXBwbHlfcm90X3ZlY3RvcihGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdGEsIGNvbnN0IGludCBjbCwgY29uc3QgaW50IGwsIGNvbnN0IEZJWFBfU1RCICpwVmVjUmUsIGNvbnN0IEZJWFBfU1RCICpwVmVjSW0pCi17CisKKy8qCisgICBUaGlzIGRlZmluZXMgcGF0Y2hlcyBlYWNoIGluYWNjdXJhdGUgMHg3RkZGIGkuZS4gMC45OTk5IGFuZCB1c2VzIDB4ODAwMAorICAgKC0xLjApIGluc3RlYWQuIEF0IHRoZSBlbmQsIHRoZSBzaWduIG9mIHRoZSByZXN1bHQgaXMgaW52ZXJ0ZWQKKyovCisjZGVmaW5lIG5vRkZUX0FQUExZX1JPVF9WRUNUT1JfSFEKKworI2lmbmRlZiBGVU5DVElPTl9mZnRfYXBwbHlfcm90X3ZlY3Rvcl9fRklYUF9EQkwKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnRfYXBwbHlfcm90X3ZlY3RvcihGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdGEsIGNvbnN0IGludCBjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbCwgY29uc3QgRklYUF9TVEIgKnBWZWNSZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NUQiAqcFZlY0ltKSB7CiAgIEZJWFBfREJMIHJlLCBpbTsKICAgRklYUF9TVEIgdnJlLCB2aW07CiAKICAgaW50IGksIGM7CiAKLSAgZm9yKGk9MDsgaTxjbDsgaSsrKSB7Ci0gICAgcmUgID0gcERhdGFbMippXTsKLSAgICBpbSAgPSBwRGF0YVsyKmkrMV07CisgIGZvciAoaSA9IDA7IGkgPCBjbDsgaSsrKSB7CisgICAgcmUgPSBwRGF0YVsyICogaV07CisgICAgaW0gPSBwRGF0YVsyICogaSArIDFdOwogCi0gICAgcERhdGFbMippXSAgID0gcmU+PjI7IC8qICogMC4yNSAqLwotICAgIHBEYXRhWzIqaSsxXSA9IGltPj4yOyAvKiAqIDAuMjUgKi8KKyAgICBwRGF0YVsyICogaV0gPSByZSA+PiAyOyAgICAgLyogKiAwLjI1ICovCisgICAgcERhdGFbMiAqIGkgKyAxXSA9IGltID4+IDI7IC8qICogMC4yNSAqLwogICB9Ci0gIGZvcig7IGk8bDsgaSs9Y2wpCi0gIHsKLSAgICByZSAgPSBwRGF0YVsyKmldOwotICAgIGltICA9IHBEYXRhWzIqaSsxXTsKKyAgZm9yICg7IGkgPCBsOyBpICs9IGNsKSB7CisgICAgcmUgPSBwRGF0YVsyICogaV07CisgICAgaW0gPSBwRGF0YVsyICogaSArIDFdOwogCi0gICAgcERhdGFbMippXSAgID0gcmU+PjI7IC8qICogMC4yNSAqLwotICAgIHBEYXRhWzIqaSsxXSA9IGltPj4yOyAvKiAqIDAuMjUgKi8KKyAgICBwRGF0YVsyICogaV0gPSByZSA+PiAyOyAgICAgLyogKiAwLjI1ICovCisgICAgcERhdGFbMiAqIGkgKyAxXSA9IGltID4+IDI7IC8qICogMC4yNSAqLwogCi0gICAgZm9yIChjPWkrMTsgYzxpK2NsOyBjKyspCi0gICAgewotICAgICAgcmUgID0gcERhdGFbMipjXT4+MTsKLSAgICAgIGltICA9IHBEYXRhWzIqYysxXT4+MTsKKyAgICBmb3IgKGMgPSBpICsgMTsgYyA8IGkgKyBjbDsgYysrKSB7CisgICAgICByZSA9IHBEYXRhWzIgKiBjXSA+PiAxOworICAgICAgaW0gPSBwRGF0YVsyICogYyArIDFdID4+IDE7CiAgICAgICB2cmUgPSAqcFZlY1JlKys7CiAgICAgICB2aW0gPSAqcFZlY0ltKys7CiAKLSAgICAgIGNwbHhNdWx0RGl2MigmcERhdGFbMipjKzFdLCAmcERhdGFbMipjXSwgaW0sIHJlLCB2cmUsIHZpbSk7CisgICAgICBjcGx4TXVsdERpdjIoJnBEYXRhWzIgKiBjICsgMV0sICZwRGF0YVsyICogY10sIGltLCByZSwgdnJlLCB2aW0pOwogICAgIH0KICAgfQogfQotCi0jZGVmaW5lIEZGVF9UV09fU1RBR0VfTUFDUk9fRU5BQkxFCi0KLQotI2lmZGVmIEZGVF9UV09fU1RBR0VfTUFDUk9fRU5BQkxFCi0KLSNkZWZpbmUgZmZ0TjIocElucHV0LCBsZW5ndGgsIGRpbTEsIGRpbTIsIGZmdF9mdW5jMSwgZmZ0X2Z1bmMyLCBSb3RWZWN0b3JSZWFsLCBSb3RWZWN0b3JJbWFnKSBcCi17IFwKLSAgaW50ICAgICAgIGksIGo7IFwKLSBcCi0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhRHN0LCBGSVhQX0RCTCwgbGVuZ3RoKjIpOyBcCi0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhRHN0MiwgRklYUF9EQkwsIGRpbTIqMik7IFwKLSBcCi0gIEZES19BU1NFUlQobGVuZ3RoID09IGRpbTEqZGltMik7IFwKLSBcCi0gIC8qIFBlcmZvcm0gZGltMiB0aW1lcyB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xLiBUaGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlIGFkZHJlc3Mgb2YgcFNyYyBhbmQgdGhlIFwKLSAgb3V0cHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBEc3QuIFRoZSBpbnB1dCB2ZWN0b3IgZm9yIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTEgaXMgYnVpbHQgXAotICBvZiB0aGUgaW50ZXJsZWF2ZWQgc2FtcGxlcyBpbiBwU3JjLCB0aGUgb3V0cHV0IHNhbXBsZXMgYXJlIHN0b3JlZCBjb25zZWN1dGl2ZWx5LiBcCi0gICovIFwKLSAgeyBcCi0gICAgY29uc3QgRklYUF9EQkwqIHBTcmMgPSBwSW5wdXQ7IFwKLSAgICBGSVhQX0RCTCAgKlJFU1RSSUNUIHBEc3QgPSBhRHN0OyBcCi0gICAgXAotICAgIGZvcihpPTA7IGk8ZGltMjsgaSsrKSBcCi0gICAgeyBcCi0gICAgICBmb3Ioaj0wOyBqPGRpbTE7IGorKykgXAotICAgICAgeyBcCi0gICAgICAgIHBEc3RbMipqXSAgID0gcFNyY1syKmoqZGltMl07IFwKLSAgICAgICAgcERzdFsyKmorMV0gPSBwU3JjWzIqaipkaW0yKzFdOyBcCi0gICAgICB9IFwKLSAgICAgIFwKLSAgICAgIGZmdF9mdW5jMShwRHN0KTsgXAotICAgICAgcFNyYyArPSAyOyBcCi0gICAgICBwRHN0ID0gcERzdCArIDIqZGltMTsgXAotICAgIH0gXAotICB9IFwKLSAgXAotICAvKiBQZXJmb3JtIHRoZSBtb2R1bGF0aW9uIG9mIHRoZSBvdXRwdXQgb2YgdGhlIGZmdCBvZiBsZW5ndGggZGltMSAqLyBcCi0gIGZmdF9hcHBseV9yb3RfdmVjdG9yKGFEc3QsIGRpbTEsIGxlbmd0aCwgUm90VmVjdG9yUmVhbCwgUm90VmVjdG9ySW1hZyk7IFwKLSAgXAotICAvKiBQZXJmb3JtIGRpbTEgdGltZXMgdGhlIGZmdCBvZiBsZW5ndGggZGltMi4gVGhlIGlucHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIGFEc3QgYW5kIHRoZSBcCi0gIG91dHB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwSW5wdXQuIFRoZSBpbnB1dCB2ZWN0b3IgZm9yIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTIgaXMgYnVpbHQgXAotICBvZiB0aGUgaW50ZXJsZWF2ZWQgc2FtcGxlcyBpbiBhRHN0LCB0aGUgb3V0cHV0IHNhbXBsZXMgYXJlIHN0b3JlZCBjb25zZWN1dGl2ZWx5IGF0IHRoZSBhZGRyZXNzIFwKLSAgb2YgcElucHV0LiBcCi0gICovIFwKLSAgeyBcCi0gICAgY29uc3QgRklYUF9EQkwqIHBTcmMgICAgICAgPSBhRHN0OyBcCi0gICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEc3QgICAgPSBhRHN0MjsgXAotICAgIEZJWFBfREJMICpSRVNUUklDVCBwRHN0T3V0ID0gcElucHV0OyBcCi0gICAgXAotICAgIGZvcihpPTA7IGk8ZGltMTsgaSsrKSBcCi0gICAgeyBcCi0gICAgICBmb3Ioaj0wOyBqPGRpbTI7IGorKykgXAotICAgICAgeyBcCi0gICAgICAgIHBEc3RbMipqXSAgID0gcFNyY1syKmoqZGltMV07IFwKLSAgICAgICAgcERzdFsyKmorMV0gPSBwU3JjWzIqaipkaW0xKzFdOyBcCi0gICAgICB9IFwKLSAgICAgIFwKLSAgICAgIGZmdF9mdW5jMihwRHN0KTsgXAotICAgICAgXAotICAgICAgZm9yKGo9MDsgajxkaW0yOyBqKyspIFwKLSAgICAgIHsgXAotICAgICAgICBwRHN0T3V0WzIqaipkaW0xXSAgID0gcERzdFsyKmpdOyBcCi0gICAgICAgIHBEc3RPdXRbMipqKmRpbTErMV0gPSBwRHN0WzIqaisxXTsgXAotICAgICAgfSBcCi0gICAgICBwU3JjICs9IDI7IFwKLSAgICAgIHBEc3RPdXQgKz0gMjsgXAotICAgIH0gXAotICB9IFwKLSAgXAotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFEc3QyLCBGSVhQX0RCTCwgZGltMioyKTsgXAotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFEc3QsIEZJWFBfREJMLCBsZW5ndGgqMik7IFwKLX0gXAotCi0jZWxzZSAvKiBGRlRfVFdPX1NUQUdFX01BQ1JPX0VOQUJMRSAqLworI2VuZGlmIC8qIEZVTkNUSU9OX2ZmdF9hcHBseV9yb3RfdmVjdG9yX19GSVhQX0RCTCAqLwogCiAvKiBzZWxlY3QgZWl0aGVyIHN3aXRjaCBjYXNlIG9mIGZ1bmN0aW9uIHBvaW50ZXIuICovCiAvLyNkZWZpbmUgRkZUX1RXT19TVEFHRV9TV0lUQ0hfQ0FTRQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmZ0TjIoCi0gICAgICAgIEZJWFBfREJMICpwSW5wdXQsCi0gICAgICAgIGNvbnN0IGludCBsZW5ndGgsCi0gICAgICAgIGNvbnN0IGludCBkaW0xLAotICAgICAgICBjb25zdCBpbnQgZGltMiwKLSAgICAgICAgdm9pZCAoKiBjb25zdCBmZnQxKShGSVhQX0RCTCAqKSwKLSAgICAgICAgdm9pZCAoKiBjb25zdCBmZnQyKShGSVhQX0RCTCAqKSwKLSAgICAgICAgY29uc3QgRklYUF9TVEIgKlJvdFZlY3RvclJlYWwsCi0gICAgICAgIGNvbnN0IEZJWFBfU1RCICpSb3RWZWN0b3JJbWFnCi0gICAgICAgICkKLXsKLSAgLyogVGhlIHJlYWwgcGFydCBvZiB0aGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlIGFkZHJlc3NlcyB3aXRoIGV2ZW4gaW5kaWNlcyBhbmQgdGhlIGltYWdpbmFyeQotICBwYXJ0IG9mIHRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzc2VzIHdpdGggb2RkIGluZGljZXMuIFRoZSBvdXRwdXQgc2FtcGxlcyBhcmUgc3RvcmVkCi0gIGF0IHRoZSBhZGRyZXNzIG9mIHBJbnB1dAorI2lmbmRlZiBGVU5DVElPTl9mZnROMl9mdW5jCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0TjJfZnVuYyhGSVhQX0RCTCAqcElucHV0LCBjb25zdCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRpbTEsIGNvbnN0IGludCBkaW0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmNvbnN0IGZmdDEpKEZJWFBfREJMICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmNvbnN0IGZmdDIpKEZJWFBfREJMICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TVEIgKlJvdFZlY3RvclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NUQiAqUm90VmVjdG9ySW1hZywgRklYUF9EQkwgKmFEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqYURzdDIpIHsKKyAgLyogVGhlIHJlYWwgcGFydCBvZiB0aGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlIGFkZHJlc3NlcyB3aXRoIGV2ZW4gaW5kaWNlcworICBhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzc2VzIHdpdGggb2RkCisgIGluZGljZXMuIFRoZSBvdXRwdXQgc2FtcGxlcyBhcmUgc3RvcmVkIGF0IHRoZSBhZGRyZXNzIG9mIHBJbnB1dAogICAqLwotICBGSVhQX0RCTCAgKnBTcmMsICpwRHN0LCAqcERzdE91dDsKLSAgaW50ICAgICAgIGksIGo7CisgIEZJWFBfREJMICpwU3JjLCAqcERzdCwgKnBEc3RPdXQ7CisgIGludCBpOwogCi0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhRHN0LCBGSVhQX0RCTCwgbGVuZ3RoKjIpOwotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoYURzdDIsIEZJWFBfREJMLCBkaW0yKjIpOwotICAgICAKLSAgRkRLX0FTU0VSVChsZW5ndGggPT0gZGltMSpkaW0yKTsKKyAgRkRLX0FTU0VSVChsZW5ndGggPT0gZGltMSAqIGRpbTIpOwogCi0gIC8qIFBlcmZvcm0gZGltMiB0aW1lcyB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xLiBUaGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlIGFkZHJlc3Mgb2YgcFNyYyBhbmQgdGhlCi0gIG91dHB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwRHN0LiBUaGUgaW5wdXQgdmVjdG9yIGZvciB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xIGlzIGJ1aWx0Ci0gIG9mIHRoZSBpbnRlcmxlYXZlZCBzYW1wbGVzIGluIHBTcmMsIHRoZSBvdXRwdXQgc2FtcGxlcyBhcmUgc3RvcmVkIGNvbnNlY3V0aXZlbHkuCisgIC8qIFBlcmZvcm0gZGltMiB0aW1lcyB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xLiBUaGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlCisgIGFkZHJlc3Mgb2YgcFNyYyBhbmQgdGhlIG91dHB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwRHN0LiBUaGUgaW5wdXQKKyAgdmVjdG9yIGZvciB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xIGlzIGJ1aWx0IG9mIHRoZSBpbnRlcmxlYXZlZCBzYW1wbGVzIGluIHBTcmMsCisgIHRoZSBvdXRwdXQgc2FtcGxlcyBhcmUgc3RvcmVkIGNvbnNlY3V0aXZlbHkuCiAgICovCiAgIHBTcmMgPSBwSW5wdXQ7CiAgIHBEc3QgPSBhRHN0OwotICBmb3IoaT0wOyBpPGxlbmd0aC9kaW0xOyBpKyspCi0gIHsKLSAgICBmb3Ioaj0wOyBqPGxlbmd0aC9kaW0yOyBqKyspCi0gICAgewotICAgICAgcERzdFsyKmpdICAgPSBwU3JjWzIqaipkaW0yXTsKLSAgICAgIHBEc3RbMipqKzFdID0gcFNyY1syKmoqZGltMisxXTsKKyAgZm9yIChpID0gMDsgaSA8IGRpbTI7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGltMTsgaisrKSB7CisgICAgICBwRHN0WzIgKiBqXSA9IHBTcmNbMiAqIGogKiBkaW0yXTsKKyAgICAgIHBEc3RbMiAqIGogKyAxXSA9IHBTcmNbMiAqIGogKiBkaW0yICsgMV07CiAgICAgfQogCi0gICAgLyogZmZ0IG9mIHNpemUgZGltMSAqLworICAgICAgLyogZmZ0IG9mIHNpemUgZGltMSAqLwogI2lmbmRlZiBGRlRfVFdPX1NUQUdFX1NXSVRDSF9DQVNFCiAgICAgZmZ0MShwRHN0KTsKICNlbHNlCiAgICAgc3dpdGNoIChkaW0xKSB7Ci0gICAgICBjYXNlIDM6IGZmdDMocERzdCk7IGJyZWFrOwotICAgICAgY2FzZSA0OiBmZnRfNChwRHN0KTsgYnJlYWs7Ci0gICAgICBjYXNlIDU6IGZmdDUocERzdCk7IGJyZWFrOwotICAgICAgY2FzZSA4OiBmZnRfOChwRHN0KTsgYnJlYWs7Ci0gICAgICBjYXNlIDE1OiBmZnQxNShwRHN0KTsgYnJlYWs7Ci0gICAgICBjYXNlIDE2OiBmZnRfMTYocERzdCk7IGJyZWFrOwotICAgICAgY2FzZSAzMjogZmZ0XzMyKHBEc3QpOyBicmVhazsKLSAgICAgIC8qY2FzZSA2NDogZmZ0XzY0KHBEc3QpOyBicmVhazsqLwotICAgICAgY2FzZSAxMjg6IGZmdF8xMjgocERzdCk7IGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBmZnQyKHBEc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgZmZ0MyhwRHN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGZmdF80KHBEc3QpOworICAgICAgICBicmVhazsKKyAgICAgIC8qIGNhc2UgNTogZmZ0NShwRHN0KTsgYnJlYWs7ICovCisgICAgICAvKiBjYXNlIDg6IGZmdF84KHBEc3QpOyBicmVhazsgKi8KKyAgICAgIGNhc2UgMTI6CisgICAgICAgIGZmdDEyKHBEc3QpOworICAgICAgICBicmVhazsKKyAgICAgIC8qIGNhc2UgMTU6IGZmdDE1KHBEc3QpOyBicmVhazsgKi8KKyAgICAgIGNhc2UgMTY6CisgICAgICAgIGZmdF8xNihwRHN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMyOgorICAgICAgICBmZnRfMzIocERzdCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAvKmNhc2UgNjQ6IGZmdF82NChwRHN0KTsgYnJlYWs7Ki8KKyAgICAgICAgLyogY2FzZSAxMjg6IGZmdF8xMjgocERzdCk7IGJyZWFrOyAqLwogICAgIH0KICNlbmRpZgogICAgIHBTcmMgKz0gMjsKLSAgICBwRHN0ID0gcERzdCArIDIqbGVuZ3RoL2RpbTI7CisgICAgcERzdCA9IHBEc3QgKyAyICogZGltMTsKICAgfQogCiAgIC8qIFBlcmZvcm0gdGhlIG1vZHVsYXRpb24gb2YgdGhlIG91dHB1dCBvZiB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xICovCi0gIHBTcmM9YURzdDsKLSAgZmZ0X2FwcGx5X3JvdF92ZWN0b3IocFNyYywgbGVuZ3RoL2RpbTIsIGxlbmd0aCwgUm90VmVjdG9yUmVhbCwgUm90VmVjdG9ySW1hZyk7CisgIHBTcmMgPSBhRHN0OworICBmZnRfYXBwbHlfcm90X3ZlY3RvcihwU3JjLCBkaW0xLCBsZW5ndGgsIFJvdFZlY3RvclJlYWwsIFJvdFZlY3RvckltYWcpOwogCi0gIC8qIFBlcmZvcm0gZGltMSB0aW1lcyB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0yLiBUaGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlIGFkZHJlc3Mgb2YgYURzdCBhbmQgdGhlCi0gIG91dHB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwSW5wdXQuIFRoZSBpbnB1dCB2ZWN0b3IgZm9yIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTIgaXMgYnVpbHQKLSAgb2YgdGhlIGludGVybGVhdmVkIHNhbXBsZXMgaW4gYURzdCwgdGhlIG91dHB1dCBzYW1wbGVzIGFyZSBzdG9yZWQgY29uc2VjdXRpdmVseSBhdCB0aGUgYWRkcmVzcwotICBvZiBwSW5wdXQuCisgIC8qIFBlcmZvcm0gZGltMSB0aW1lcyB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0yLiBUaGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlCisgIGFkZHJlc3Mgb2YgYURzdCBhbmQgdGhlIG91dHB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwSW5wdXQuIFRoZSBpbnB1dAorICB2ZWN0b3IgZm9yIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTIgaXMgYnVpbHQgb2YgdGhlIGludGVybGVhdmVkIHNhbXBsZXMgaW4gYURzdCwKKyAgdGhlIG91dHB1dCBzYW1wbGVzIGFyZSBzdG9yZWQgY29uc2VjdXRpdmVseSBhdCB0aGUgYWRkcmVzcyBvZiBwSW5wdXQuCiAgICovCi0gIHBTcmMgICAgPSBhRHN0OwotICBwRHN0ICAgID0gYURzdDI7CisgIHBTcmMgPSBhRHN0OworICBwRHN0ID0gYURzdDI7CiAgIHBEc3RPdXQgPSBwSW5wdXQ7Ci0gIGZvcihpPTA7IGk8bGVuZ3RoL2RpbTI7IGkrKykKLSAgewotICAgIGZvcihqPTA7IGo8bGVuZ3RoL2RpbTE7IGorKykKLSAgICB7Ci0gICAgICBwRHN0WzIqal0gICA9IHBTcmNbMipqKmRpbTFdOwotICAgICAgcERzdFsyKmorMV0gPSBwU3JjWzIqaipkaW0xKzFdOworICBmb3IgKGkgPSAwOyBpIDwgZGltMTsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkaW0yOyBqKyspIHsKKyAgICAgIHBEc3RbMiAqIGpdID0gcFNyY1syICogaiAqIGRpbTFdOworICAgICAgcERzdFsyICogaiArIDFdID0gcFNyY1syICogaiAqIGRpbTEgKyAxXTsKICAgICB9CiAKICNpZm5kZWYgRkZUX1RXT19TVEFHRV9TV0lUQ0hfQ0FTRQogICAgIGZmdDIocERzdCk7CiAjZWxzZQogICAgIHN3aXRjaCAoZGltMikgewotICAgICAgY2FzZSAzOiBmZnQzKHBEc3QpOyBicmVhazsKLSAgICAgIGNhc2UgNDogZmZ0XzQocERzdCk7IGJyZWFrOwotICAgICAgY2FzZSA1OiBmZnQ1KHBEc3QpOyBicmVhazsKLSAgICAgIGNhc2UgODogZmZ0XzgocERzdCk7IGJyZWFrOwotICAgICAgY2FzZSAxNTogZmZ0MTUocERzdCk7IGJyZWFrOwotICAgICAgY2FzZSAxNjogZmZ0XzE2KHBEc3QpOyBicmVhazsKLSAgICAgIGNhc2UgMzI6IGZmdF8zMihwRHN0KTsgYnJlYWs7Ci0gICAgICAvKmNhc2UgNjQ6IGZmdF82NChwRHN0KTsgYnJlYWs7Ki8KLSAgICAgIGNhc2UgMTI4OiBmZnRfMTI4KHBEc3QpOyBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZmZ0XzQocERzdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5OgorICAgICAgICBmZnQ5KHBEc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTI6CisgICAgICAgIGZmdDEyKHBEc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTU6CisgICAgICAgIGZmdDE1KHBEc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIGZmdF8xNihwRHN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMyOgorICAgICAgICBmZnRfMzIocERzdCk7CisgICAgICAgIGJyZWFrOwogICAgIH0KICNlbmRpZgogCi0gICAgZm9yKGo9MDsgajxsZW5ndGgvZGltMTsgaisrKQotICAgIHsKLSAgICAgIHBEc3RPdXRbMipqKmRpbTFdICAgPSBwRHN0WzIqal07Ci0gICAgICBwRHN0T3V0WzIqaipkaW0xKzFdID0gcERzdFsyKmorMV07CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkaW0yOyBqKyspIHsKKyAgICAgIHBEc3RPdXRbMiAqIGogKiBkaW0xXSA9IHBEc3RbMiAqIGpdOworICAgICAgcERzdE91dFsyICogaiAqIGRpbTEgKyAxXSA9IHBEc3RbMiAqIGogKyAxXTsKICAgICB9CiAgICAgcFNyYyArPSAyOwogICAgIHBEc3RPdXQgKz0gMjsKICAgfQotCi0gIENfQUxMT0NfU0NSQVRDSF9FTkQoYURzdDIsIEZJWFBfREJMLCBkaW0yKjIpOwotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFEc3QsIEZJWFBfREJMLCBsZW5ndGgqMik7CiB9CisjZW5kaWYgLyogRlVOQ1RJT05fZmZ0TjJfZnVuY3Rpb24gKi8KIAotI2VuZGlmIC8qIEZGVF9UV09fU1RBR0VfTUFDUk9fRU5BQkxFICovCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0jZGVmaW5lIFNDQUxFRkFDVE9SNjAgICAgICAgICA1Ci0vKioKLVRoZSBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgZmZ0IG9mIGxlbmd0aCA2MC4gSXQgaXMgc3BsaXR0ZXQgaW50byBmZnQncyBvZiBsZW5ndGggNCBhbmQgZmZ0J3Mgb2YKLWxlbmd0aCAxNS4gQmV0d2VlbiB0aGUgZmZ0J3MgYSBtb2RvbGF0aW9uIGlzIGNhbGN1bGF0ZWQuCi0qLwotc3RhdGljIGlubGluZSB2b2lkIGZmdDYwKEZJWFBfREJMICpwSW5wdXQsIElOVCAqcFNjYWxlZmFjdG9yKQotewotICBmZnROMigKLSAgICAgICAgICBwSW5wdXQsIDYwLCA0LCAxNSwgCi0gICAgICAgICAgZmZ0XzQsIGZmdDE1LAotICAgICAgICAgIFJvdFZlY3RvclJlYWw2MCwgUm90VmVjdG9ySW1hZzYwCi0gICAgICAgICAgKTsKLSAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjYwOwotfQotCi0KLQotLyogRmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaW4gY2FzZSBvZiBubyBiZXR0ZXIgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlLiAqLwotCi0jZGVmaW5lIFNDQUxFRkFDVE9SMjQwICAgICAgICA3Ci0KLS8qKgotVGhlIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBmZnQgb2YgbGVuZ3RoIDI0MC4gSXQgaXMgc3BsaXR0ZXQgaW50byBmZnQncyBvZiBsZW5ndGggMTYgYW5kIGZmdCdzIG9mCi1sZW5ndGggMTUuIEJldHdlZW4gdGhlIGZmdCdzIGEgbW9kdWxhdGlvbiBpcyBjYWxjdWxhdGVkLgotKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmZnQyNDAoRklYUF9EQkwgKnBJbnB1dCwgSU5UICpwU2NhbGVmYWN0b3IpCi17Ci0gIGZmdE4yKAotICAgICAgICAgIHBJbnB1dCwgMjQwLCAxNiwgMTUsIAotICAgICAgICAgIGZmdF8xNiwgZmZ0MTUsCi0gICAgICAgICAgUm90VmVjdG9yUmVhbDI0MCwgUm90VmVjdG9ySW1hZzI0MAotICAgICAgICAgICk7Ci0gICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IyNDA7Ci19Ci0KLQotI2RlZmluZSBTQ0FMRUZBQ1RPUjQ4MCAgICAgICAgOAotI2RlZmluZSBOMzIgICAgICAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgVEFCTEVfU0laRV8xNiAgICAgICAgKDMyLzIpCi0KLS8qKgotVGhlIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBmZnQgb2YgbGVuZ3RoIDQ4MC4gSXQgaXMgc3BsaXR0ZXQgaW50byBmZnQncyBvZiBsZW5ndGggMzIgYW5kIGZmdCdzIG9mCi1sZW5ndGggMTUuIEJldHdlZW4gdGhlIGZmdCdzIGEgbW9kdWxhdGlvbiBpcyBjYWxjdWxhdGVkLgotKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmZnQ0ODAoRklYUF9EQkwgKnBJbnB1dCwgSU5UICpwU2NhbGVmYWN0b3IpCi17Ci0gIGZmdE4yKAotICAgICAgICAgIHBJbnB1dCwgNDgwLCAzMiwgMTUsIAotICAgICAgICAgIGZmdF8zMiwgZmZ0MTUsCi0gICAgICAgICAgUm90VmVjdG9yUmVhbDQ4MCwgUm90VmVjdG9ySW1hZzQ4MAotICAgICAgICAgICk7Ci0gICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I0ODA7Ci19Ci0KLXZvaWQgZmZ0KGludCBsZW5ndGgsIEZJWFBfREJMICpwSW5wdXQsIElOVCAqcFNjYWxlZmFjdG9yKQotewotICBpZiAobGVuZ3RoID09IDMyKQotICB7Ci0gICAgICBmZnRfMzIocElucHV0KTsKLSAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IzMjsKKyNkZWZpbmUgZmZ0TjIoREFUQV9UWVBFLCBwSW5wdXQsIGxlbmd0aCwgZGltMSwgZGltMiwgZmZ0X2Z1bmMxLCBmZnRfZnVuYzIsIFwKKyAgICAgICAgICAgICAgUm90VmVjdG9yUmVhbCwgUm90VmVjdG9ySW1hZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKGFEc3QsIERBVEFfVFlQRSwgMiAqIGxlbmd0aCkgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKGFEc3QyLCBEQVRBX1RZUEUsIDIgKiBkaW0yKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZnROMl9mdW5jKHBJbnB1dCwgbGVuZ3RoLCBkaW0xLCBkaW0yLCBmZnRfZnVuYzEsIGZmdF9mdW5jMiwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIFJvdFZlY3RvclJlYWwsIFJvdFZlY3RvckltYWcsIGFEc3QsIGFEc3QyKTsgICAgICAgICAgICAgICAgIFwKKyAgICBDX0FBTExPQ19TQ1JBVENIX0VORChhRHN0MiwgREFUQV9UWVBFLCAyICogZGltMikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDX0FBTExPQ19TQ1JBVENIX0VORChhRHN0LCBEQVRBX1RZUEUsIDIgKiBsZW5ndGgpICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQotICBlbHNlCi0gIHsKLSAgCi0gIHN3aXRjaCAobGVuZ3RoKSB7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGZmdF8xNihwSW5wdXQpOwotICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgZmZ0XzgocElucHV0KTsKLSAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgZmZ0MyhwSW5wdXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgZmZ0XzQocElucHV0KTsKLSAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgZmZ0NShwSW5wdXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNToKLSAgICAgIGZmdDE1KHBJbnB1dCk7Ci0gICAgICAqcFNjYWxlZmFjdG9yICs9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDYwOgotICAgICAgZmZ0NjAocElucHV0LCBwU2NhbGVmYWN0b3IpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2NDoKLSAgICAgIGRpdF9mZnQocElucHV0LCA2LCBTaW5lVGFibGU1MTIsIDUxMik7Ci0gICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0MDoKLSAgICAgIGZmdDI0MChwSW5wdXQsIHBTY2FsZWZhY3Rvcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI1NjoKLSAgICAgIGRpdF9mZnQocElucHV0LCA4LCBTaW5lVGFibGU1MTIsIDUxMik7Ci0gICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMjU2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0ODA6Ci0gICAgICBmZnQ0ODAocElucHV0LCBwU2NhbGVmYWN0b3IpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1MTI6Ci0gICAgICBkaXRfZmZ0KHBJbnB1dCwgOSwgU2luZVRhYmxlNTEyLCA1MTIpOwotICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjUxMjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBGREtfQVNTRVJUKDApOyAvKiBGRlQgbGVuZ3RoIG5vdCBzdXBwb3J0ZWQhICovCi0gICAgICBicmVhazsKLSAgfQorCisgIC8qIQorICAgKgorICAgKiAgXGJyaWVmICBjb21wbGV4IEZGVCBvZiBsZW5ndGggMTIsMTgsMjQsMzAsNDgsNjAsOTYsIDE5MiwgMjQwLCAzODQsIDQ4MAorICAgKiAgXHBhcmFtICBwSW5wdXQgY29udGFpbnMgdGhlIGlucHV0IHNpZ25hbCBwcmVzY2FsZWQgcmlnaHQgYnkgMgorICAgKiAgICAgICAgICBwSW5wdXQgY29udGFpbnMgdGhlIG91dHB1dCBzaWduYWwgc2NhbGVkIGJ5IFNDQUxFRkFDVE9SPCNsZW5ndGg+CisgICAqICAgICAgICAgIFRoZSBvdXRwdXQgc2lnbmFsIGRvZXMgbm90IGhhdmUgYW55IGZpeGVkIGhlYWRyb29tCisgICAqICBccmV0dXJuIHZvaWQKKyAgICoKKyAgICovCisKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0Ngorc3RhdGljIGlubGluZSB2b2lkIGZmdDYoRklYUF9EQkwgKnBJbnB1dCkgeworICBmZnROMihGSVhQX0RCTCwgcElucHV0LCA2LCAyLCAzLCBmZnQyLCBmZnQzLCBSb3RWZWN0b3JSZWFsNiwgUm90VmVjdG9ySW1hZzYpOworfQorI2VuZGlmIC8qICNpZm5kZWYgRlVOQ1RJT05fZmZ0NiAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDEyCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0MTIoRklYUF9EQkwgKnBJbnB1dCkgeworICBmZnROMihGSVhQX0RCTCwgcElucHV0LCAxMiwgMywgNCwgZmZ0MywgZmZ0XzQsIFJvdFZlY3RvclJlYWwxMiwKKyAgICAgICAgUm90VmVjdG9ySW1hZzEyKTsgLyogMTYsNTggKi8KK30KKyNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX2ZmdDEyICovCisKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0MjAKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnQyMChGSVhQX0RCTCAqcElucHV0KSB7CisgIGZmdE4yKEZJWFBfREJMLCBwSW5wdXQsIDIwLCA0LCA1LCBmZnRfNCwgZmZ0NSwgUm90VmVjdG9yUmVhbDIwLAorICAgICAgICBSb3RWZWN0b3JJbWFnMjApOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZmdDIwICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnQyNChGSVhQX0RCTCAqcElucHV0KSB7CisgIGZmdE4yKEZJWFBfREJMLCBwSW5wdXQsIDI0LCAyLCAxMiwgZmZ0MiwgZmZ0MTIsIFJvdFZlY3RvclJlYWwyNCwKKyAgICAgICAgUm90VmVjdG9ySW1hZzI0KTsgLyogMTYsNzMgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIGZmdDQ4KEZJWFBfREJMICpwSW5wdXQpIHsKKyAgZmZ0TjIoRklYUF9EQkwsIHBJbnB1dCwgNDgsIDQsIDEyLCBmZnRfNCwgZmZ0MTIsIFJvdFZlY3RvclJlYWw0OCwKKyAgICAgICAgUm90VmVjdG9ySW1hZzQ4KTsgLyogMTYsMzIgKi8KK30KKworI2lmbmRlZiBGVU5DVElPTl9mZnQ2MAorc3RhdGljIGlubGluZSB2b2lkIGZmdDYwKEZJWFBfREJMICpwSW5wdXQpIHsKKyAgZmZ0TjIoRklYUF9EQkwsIHBJbnB1dCwgNjAsIDQsIDE1LCBmZnRfNCwgZmZ0MTUsIFJvdFZlY3RvclJlYWw2MCwKKyAgICAgICAgUm90VmVjdG9ySW1hZzYwKTsgLyogMTUsNTEgKi8KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9mZnQ2MCAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDgwCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0ODAoRklYUF9EQkwgKnBJbnB1dCkgeworICBmZnROMihGSVhQX0RCTCwgcElucHV0LCA4MCwgNSwgMTYsIGZmdDUsIGZmdF8xNiwgUm90VmVjdG9yUmVhbDgwLAorICAgICAgICBSb3RWZWN0b3JJbWFnODApOyAvKiAgKi8KK30KKyNlbmRpZgorCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDk2CitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0OTYoRklYUF9EQkwgKnBJbnB1dCkgeworICBmZnROMihGSVhQX0RCTCwgcElucHV0LCA5NiwgMywgMzIsIGZmdDMsIGZmdF8zMiwgUm90VmVjdG9yUmVhbDk2LAorICAgICAgICBSb3RWZWN0b3JJbWFnOTYpOyAvKiAxNSw0NyAqLworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZmdDk2Ki8KKworI2lmbmRlZiBGVU5DVElPTl9mZnQxMjAKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnQxMjAoRklYUF9EQkwgKnBJbnB1dCkgeworICBmZnROMihGSVhQX0RCTCwgcElucHV0LCAxMjAsIDgsIDE1LCBmZnRfOCwgZmZ0MTUsIFJvdFZlY3RvclJlYWwxMjAsCisgICAgICAgIFJvdFZlY3RvckltYWcxMjApOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZmdDEyMCAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDE5Mgorc3RhdGljIGlubGluZSB2b2lkIGZmdDE5MihGSVhQX0RCTCAqcElucHV0KSB7CisgIGZmdE4yKEZJWFBfREJMLCBwSW5wdXQsIDE5MiwgMTYsIDEyLCBmZnRfMTYsIGZmdDEyLCBSb3RWZWN0b3JSZWFsMTkyLAorICAgICAgICBSb3RWZWN0b3JJbWFnMTkyKTsgLyogMTUsNTAgKi8KK30KKyNlbmRpZgorCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDI0MAorc3RhdGljIGlubGluZSB2b2lkIGZmdDI0MChGSVhQX0RCTCAqcElucHV0KSB7CisgIGZmdE4yKEZJWFBfREJMLCBwSW5wdXQsIDI0MCwgMTYsIDE1LCBmZnRfMTYsIGZmdDE1LCBSb3RWZWN0b3JSZWFsMjQwLAorICAgICAgICBSb3RWZWN0b3JJbWFnMjQwKTsgLyogMTUuNDQgKi8KK30KKyNlbmRpZgorCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDM4NAorc3RhdGljIGlubGluZSB2b2lkIGZmdDM4NChGSVhQX0RCTCAqcElucHV0KSB7CisgIGZmdE4yKEZJWFBfREJMLCBwSW5wdXQsIDM4NCwgMTIsIDMyLCBmZnQxMiwgZmZ0XzMyLCBSb3RWZWN0b3JSZWFsMzg0LAorICAgICAgICBSb3RWZWN0b3JJbWFnMzg0KTsgLyogMTYuMDIgKi8KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9mZnQzODQgKi8KKworI2lmbmRlZiBGVU5DVElPTl9mZnQ0ODAKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnQ0ODAoRklYUF9EQkwgKnBJbnB1dCkgeworICBmZnROMihGSVhQX0RCTCwgcElucHV0LCA0ODAsIDMyLCAxNSwgZmZ0XzMyLCBmZnQxNSwgUm90VmVjdG9yUmVhbDQ4MCwKKyAgICAgICAgUm90VmVjdG9ySW1hZzQ4MCk7IC8qIDE1Ljg0ICovCit9CisjZW5kaWYgLyogRlVOQ1RJT05fZmZ0NDgwICovCisKK3ZvaWQgZmZ0KGludCBsZW5ndGgsIEZJWFBfREJMICpwSW5wdXQsIElOVCAqcFNjYWxlZmFjdG9yKSB7CisgIC8qIEVuc3VyZSwgdGhhdCB0aGUgaW8tcHRyIGlzIGFsd2F5cyAoYXQgbGVhc3QgOC1ieXRlKSBhbGlnbmVkICovCisgIENfQUxMT0NfQUxJR05FRF9DSEVDSyhwSW5wdXQpOworCisgIGlmIChsZW5ndGggPT0gMzIpIHsKKyAgICBmZnRfMzIocElucHV0KTsKKyAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMzI7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChsZW5ndGgpIHsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIGZmdF8xNihwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMTY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4OgorICAgICAgICBmZnRfOChwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SODsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGZmdDIocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBmZnQzKHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZmZ0XzQocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OgorICAgICAgICBmZnQ1KHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I1OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgZmZ0NihwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwOgorICAgICAgICBmZnQxMChwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMTA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMjoKKyAgICAgICAgZmZ0MTIocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjEyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTU6CisgICAgICAgIGZmdDE1KHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IxNTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIwOgorICAgICAgICBmZnQyMChwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMjA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyNDoKKyAgICAgICAgZmZ0MjQocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjI0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDg6CisgICAgICAgIGZmdDQ4KHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I0ODsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYwOgorICAgICAgICBmZnQ2MChwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNjA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2NDoKKyAgICAgICAgZGl0X2ZmdChwSW5wdXQsIDYsIFNpbmVUYWJsZTUxMiwgNTEyKTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjY0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgODA6CisgICAgICAgIGZmdDgwKHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I4MDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDk2OgorICAgICAgICBmZnQ5NihwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SOTY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMjA6CisgICAgICAgIGZmdDEyMChwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMTIwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTI4OgorICAgICAgICBkaXRfZmZ0KHBJbnB1dCwgNywgU2luZVRhYmxlNTEyLCA1MTIpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMTI4OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTkyOgorICAgICAgICBmZnQxOTIocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjE5MjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI0MDoKKyAgICAgICAgZmZ0MjQwKHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IyNDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyNTY6CisgICAgICAgIGRpdF9mZnQocElucHV0LCA4LCBTaW5lVGFibGU1MTIsIDUxMik7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IyNTY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzODQ6CisgICAgICAgIGZmdDM4NChwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMzg0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDgwOgorICAgICAgICBmZnQ0ODAocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjQ4MDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDUxMjoKKyAgICAgICAgZGl0X2ZmdChwSW5wdXQsIDksIFNpbmVUYWJsZTUxMiwgNTEyKTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjUxMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBGREtfQVNTRVJUKDApOyAvKiBGRlQgbGVuZ3RoIG5vdCBzdXBwb3J0ZWQhICovCisgICAgICAgIGJyZWFrOworICAgIH0KICAgfQogfQogCi0KLXZvaWQgaWZmdChpbnQgbGVuZ3RoLCBGSVhQX0RCTCAqcElucHV0LCBJTlQgKnNjYWxlZmFjdG9yKQotewordm9pZCBpZmZ0KGludCBsZW5ndGgsIEZJWFBfREJMICpwSW5wdXQsIElOVCAqc2NhbGVmYWN0b3IpIHsKICAgc3dpdGNoIChsZW5ndGgpIHsKICAgICBkZWZhdWx0OgogICAgICAgRkRLX0FTU0VSVCgwKTsgLyogSUZGVCBsZW5ndGggbm90IHN1cHBvcnRlZCEgKi8KICAgICAgIGJyZWFrOwogICB9CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9mZnRfcmFkMi5jcHAgYi9saWJGREsvc3JjL2ZmdF9yYWQyLmNwcAppbmRleCA5Y2RhZGI1Li4yN2YzYWEwIDEwMDY0NAotLS0gYS9saWJGREsvc3JjL2ZmdF9yYWQyLmNwcAorKysgYi9saWJGREsvc3JjL2ZmdF9yYWQyLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIsIE0uIEdheWVyCisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiZmZ0X3JhZDIuaCIKIApAQCAtOTQsMTYgKzEwNiwxNCBAQAogCiAjZGVmaW5lIF9fRkZUX1JBRDJfQ1BQX18KIAotI2lmIGRlZmluZWQoX19hcm1fXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2lmIGRlZmluZWQoX19hcm1fXykKICNpbmNsdWRlICJhcm0vZmZ0X3JhZDJfYXJtLmNwcCIKIAotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX21pcHNfXykgJiYgZGVmaW5lZChfX21pcHNfZHNwKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fbWlwc19kc3ApCiAjaW5jbHVkZSAibWlwcy9mZnRfcmFkMl9taXBzLmNwcCIKIAogI2VuZGlmCiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogZGl0X2ZmdCAoYW5hbHlzaXMpCkBAIC0xMTgsMzk1ICsxMjgsMTk3IEBACiAKICNpZm5kZWYgRlVOQ1RJT05fZGl0X2ZmdAogCi12b2lkIGRpdF9mZnQoRklYUF9EQkwgKngsIGNvbnN0IElOVCBsZG4sIGNvbnN0IEZJWFBfU1RQICp0cmlnZGF0YSwgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSkKLXsKLSAgICBjb25zdCBJTlQgbj0xPDxsZG47Ci0gICAgSU5UIHRyaWdzdGVwLGksbGRtOwordm9pZCBkaXRfZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsCisgICAgICAgICAgICAgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSkgeworICBjb25zdCBJTlQgbiA9IDEgPDwgbGRuOworICBJTlQgdHJpZ3N0ZXAsIGksIGxkbTsKIAotICAgIHNjcmFtYmxlKHgsbik7Ci0gICAgLyoKLSAgICAgKiAxKzIgc3RhZ2UgcmFkaXggNAotICAgICAqLworICBDX0FMTE9DX0FMSUdORURfQ0hFQ0soeCk7CiAKLSAgICBmb3IgKGk9MDtpPG4qMjtpKz04KQotICAgIHsKLSAgICAgIEZJWFBfREJMIGEwMCwgYTEwLCBhMjAsIGEzMDsKLSAgICAgIGEwMCA9ICh4W2kgKyAwXSArIHhbaSArIDJdKT4+MTsgIC8qIFJlIEEgKyBSZSBCICovCi0gICAgICBhMTAgPSAoeFtpICsgNF0gKyB4W2kgKyA2XSk+PjE7ICAvKiBSZSBDICsgUmUgRCAqLwotICAgICAgYTIwID0gKHhbaSArIDFdICsgeFtpICsgM10pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KLSAgICAgIGEzMCA9ICh4W2kgKyA1XSArIHhbaSArIDddKT4+MTsgIC8qIEltIEMgKyBJbSBEICovCisgIHNjcmFtYmxlKHgsIG4pOworICAvKgorICAgKiAxKzIgc3RhZ2UgcmFkaXggNAorICAgKi8KIAotICAgICAgeFtpICsgMF0gPSBhMDAgKyBhMTA7ICAgICAgIC8qIFJlIEEnID0gUmUgQSArIFJlIEIgKyBSZSBDICsgUmUgRCAqLwotICAgICAgeFtpICsgNF0gPSBhMDAgLSBhMTA7ICAgICAgIC8qIFJlIEMnID0gUmUgQSArIFJlIEIgLSBSZSBDIC0gUmUgRCAqLwotICAgICAgeFtpICsgMV0gPSBhMjAgKyBhMzA7ICAgICAgIC8qIEltIEEnID0gSW0gQSArIEltIEIgKyBJbSBDICsgSW0gRCAqLwotICAgICAgeFtpICsgNV0gPSBhMjAgLSBhMzA7ICAgICAgIC8qIEltIEMnID0gSW0gQSArIEltIEIgLSBJbSBDIC0gSW0gRCAqLworICBmb3IgKGkgPSAwOyBpIDwgbiAqIDI7IGkgKz0gOCkgeworICAgIEZJWFBfREJMIGEwMCwgYTEwLCBhMjAsIGEzMDsKKyAgICBhMDAgPSAoeFtpICsgMF0gKyB4W2kgKyAyXSkgPj4gMTsgLyogUmUgQSArIFJlIEIgKi8KKyAgICBhMTAgPSAoeFtpICsgNF0gKyB4W2kgKyA2XSkgPj4gMTsgLyogUmUgQyArIFJlIEQgKi8KKyAgICBhMjAgPSAoeFtpICsgMV0gKyB4W2kgKyAzXSkgPj4gMTsgLyogSW0gQSArIEltIEIgKi8KKyAgICBhMzAgPSAoeFtpICsgNV0gKyB4W2kgKyA3XSkgPj4gMTsgLyogSW0gQyArIEltIEQgKi8KIAotICAgICAgYTAwID0gYTAwIC0geFtpICsgMl07ICAgICAgIC8qIFJlIEEgLSBSZSBCICovCi0gICAgICBhMTAgPSBhMTAgLSB4W2kgKyA2XTsgICAgICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgICAgIGEyMCA9IGEyMCAtIHhbaSArIDNdOyAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwotICAgICAgYTMwID0gYTMwIC0geFtpICsgN107ICAgICAgIC8qIEltIEMgLSBJbSBEICovCisgICAgeFtpICsgMF0gPSBhMDAgKyBhMTA7IC8qIFJlIEEnID0gUmUgQSArIFJlIEIgKyBSZSBDICsgUmUgRCAqLworICAgIHhbaSArIDRdID0gYTAwIC0gYTEwOyAvKiBSZSBDJyA9IFJlIEEgKyBSZSBCIC0gUmUgQyAtIFJlIEQgKi8KKyAgICB4W2kgKyAxXSA9IGEyMCArIGEzMDsgLyogSW0gQScgPSBJbSBBICsgSW0gQiArIEltIEMgKyBJbSBEICovCisgICAgeFtpICsgNV0gPSBhMjAgLSBhMzA7IC8qIEltIEMnID0gSW0gQSArIEltIEIgLSBJbSBDIC0gSW0gRCAqLwogCi0gICAgICB4W2kgKyAyXSA9IGEwMCArIGEzMDsgICAgICAgLyogUmUgQicgPSBSZSBBIC0gUmUgQiArIEltIEMgLSBJbSBEICovCi0gICAgICB4W2kgKyA2XSA9IGEwMCAtIGEzMDsgICAgICAgLyogUmUgRCcgPSBSZSBBIC0gUmUgQiAtIEltIEMgKyBJbSBEICovCi0gICAgICB4W2kgKyAzXSA9IGEyMCAtIGExMDsgICAgICAgLyogSW0gQicgPSBJbSBBIC0gSW0gQiAtIFJlIEMgKyBSZSBEICovCi0gICAgICB4W2kgKyA3XSA9IGEyMCArIGExMDsgICAgICAgLyogSW0gRCcgPSBJbSBBIC0gSW0gQiArIFJlIEMgLSBSZSBEICovCisgICAgYTAwID0gYTAwIC0geFtpICsgMl07IC8qIFJlIEEgLSBSZSBCICovCisgICAgYTEwID0gYTEwIC0geFtpICsgNl07IC8qIFJlIEMgLSBSZSBEICovCisgICAgYTIwID0gYTIwIC0geFtpICsgM107IC8qIEltIEEgLSBJbSBCICovCisgICAgYTMwID0gYTMwIC0geFtpICsgN107IC8qIEltIEMgLSBJbSBEICovCisKKyAgICB4W2kgKyAyXSA9IGEwMCArIGEzMDsgLyogUmUgQicgPSBSZSBBIC0gUmUgQiArIEltIEMgLSBJbSBEICovCisgICAgeFtpICsgNl0gPSBhMDAgLSBhMzA7IC8qIFJlIEQnID0gUmUgQSAtIFJlIEIgLSBJbSBDICsgSW0gRCAqLworICAgIHhbaSArIDNdID0gYTIwIC0gYTEwOyAvKiBJbSBCJyA9IEltIEEgLSBJbSBCIC0gUmUgQyArIFJlIEQgKi8KKyAgICB4W2kgKyA3XSA9IGEyMCArIGExMDsgLyogSW0gRCcgPSBJbSBBIC0gSW0gQiArIFJlIEMgLSBSZSBEICovCisgIH0KKworICBmb3IgKGxkbSA9IDM7IGxkbSA8PSBsZG47ICsrbGRtKSB7CisgICAgSU5UIG0gPSAoMSA8PCBsZG0pOworICAgIElOVCBtaCA9IChtID4+IDEpOworICAgIElOVCBqLCByOworCisgICAgdHJpZ3N0ZXAgPSAoKHRyaWdEYXRhU2l6ZSA8PCAyKSA+PiBsZG0pOworCisgICAgRkRLX0FTU0VSVCh0cmlnc3RlcCA+IDApOworCisgICAgLyogRG8gZmlyc3QgaXRlcmF0aW9uIHdpdGggYz0xLjAgYW5kIHM9MC4wIHNlcGFyYXRlbHkgdG8gYXZvaWQgbG9vc2luZyB0bworICAgICAgIG11Y2ggcHJlY2lzaW9uLiBCZXdhcmU6IFRoZSBpbXBhY3Qgb24gdGhlIG92ZXJhbCBGRlQgcHJlY2lzaW9uIGlzIHJhdGhlcgorICAgICAgIGxhcmdlLiAqLworICAgIHsgLyogYmxvY2sgMSAqLworCisgICAgICBqID0gMDsKKworICAgICAgZm9yIChyID0gMDsgciA8IG47IHIgKz0gbSkgeworICAgICAgICBJTlQgdDEgPSAociArIGopIDw8IDE7CisgICAgICAgIElOVCB0MiA9IHQxICsgKG1oIDw8IDEpOworICAgICAgICBGSVhQX0RCTCB2ciwgdmksIHVyLCB1aTsKKworICAgICAgICAvLyBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDIrMV0sIHhbdDJdLCAoRklYUF9TR0wpMS4wLCAoRklYUF9TR0wpMC4wKTsKKyAgICAgICAgdmkgPSB4W3QyICsgMV0gPj4gMTsKKyAgICAgICAgdnIgPSB4W3QyXSA+PiAxOworCisgICAgICAgIHVyID0geFt0MV0gPj4gMTsKKyAgICAgICAgdWkgPSB4W3QxICsgMV0gPj4gMTsKKworICAgICAgICB4W3QxXSA9IHVyICsgdnI7CisgICAgICAgIHhbdDEgKyAxXSA9IHVpICsgdmk7CisKKyAgICAgICAgeFt0Ml0gPSB1ciAtIHZyOworICAgICAgICB4W3QyICsgMV0gPSB1aSAtIHZpOworCisgICAgICAgIHQxICs9IG1oOworICAgICAgICB0MiA9IHQxICsgKG1oIDw8IDEpOworCisgICAgICAgIC8vIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0MisxXSwgeFt0Ml0sIChGSVhQX1NHTCkxLjAsIChGSVhQX1NHTCkwLjApOworICAgICAgICB2ciA9IHhbdDIgKyAxXSA+PiAxOworICAgICAgICB2aSA9IHhbdDJdID4+IDE7CisKKyAgICAgICAgdXIgPSB4W3QxXSA+PiAxOworICAgICAgICB1aSA9IHhbdDEgKyAxXSA+PiAxOworCisgICAgICAgIHhbdDFdID0gdXIgKyB2cjsKKyAgICAgICAgeFt0MSArIDFdID0gdWkgLSB2aTsKKworICAgICAgICB4W3QyXSA9IHVyIC0gdnI7CisgICAgICAgIHhbdDIgKyAxXSA9IHVpICsgdmk7CisgICAgICB9CisKKyAgICB9IC8qIGVuZCBvZiAgYmxvY2sgMSAqLworCisgICAgZm9yIChqID0gMTsgaiA8IG1oIC8gNDsgKytqKSB7CisgICAgICBGSVhQX1NUUCBjczsKKworICAgICAgY3MgPSB0cmlnZGF0YVtqICogdHJpZ3N0ZXBdOworCisgICAgICBmb3IgKHIgPSAwOyByIDwgbjsgciArPSBtKSB7CisgICAgICAgIElOVCB0MSA9IChyICsgaikgPDwgMTsKKyAgICAgICAgSU5UIHQyID0gdDEgKyAobWggPDwgMSk7CisgICAgICAgIEZJWFBfREJMIHZyLCB2aSwgdXIsIHVpOworCisgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0MiArIDFdLCB4W3QyXSwgY3MpOworCisgICAgICAgIHVyID0geFt0MV0gPj4gMTsKKyAgICAgICAgdWkgPSB4W3QxICsgMV0gPj4gMTsKKworICAgICAgICB4W3QxXSA9IHVyICsgdnI7CisgICAgICAgIHhbdDEgKyAxXSA9IHVpICsgdmk7CisKKyAgICAgICAgeFt0Ml0gPSB1ciAtIHZyOworICAgICAgICB4W3QyICsgMV0gPSB1aSAtIHZpOworCisgICAgICAgIHQxICs9IG1oOworICAgICAgICB0MiA9IHQxICsgKG1oIDw8IDEpOworCisgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0MiArIDFdLCB4W3QyXSwgY3MpOworCisgICAgICAgIHVyID0geFt0MV0gPj4gMTsKKyAgICAgICAgdWkgPSB4W3QxICsgMV0gPj4gMTsKKworICAgICAgICB4W3QxXSA9IHVyICsgdnI7CisgICAgICAgIHhbdDEgKyAxXSA9IHVpIC0gdmk7CisKKyAgICAgICAgeFt0Ml0gPSB1ciAtIHZyOworICAgICAgICB4W3QyICsgMV0gPSB1aSArIHZpOworCisgICAgICAgIC8qIFNhbWUgYXMgYWJvdmUgYnV0IGZvciB0MSx0MiB3aXRoIGo+bWgvNCBhbmQgdGh1cyBjcyBzd2FwcGVkICovCisgICAgICAgIHQxID0gKHIgKyBtaCAvIDIgLSBqKSA8PCAxOworICAgICAgICB0MiA9IHQxICsgKG1oIDw8IDEpOworCisgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0Ml0sIHhbdDIgKyAxXSwgY3MpOworCisgICAgICAgIHVyID0geFt0MV0gPj4gMTsKKyAgICAgICAgdWkgPSB4W3QxICsgMV0gPj4gMTsKKworICAgICAgICB4W3QxXSA9IHVyICsgdnI7CisgICAgICAgIHhbdDEgKyAxXSA9IHVpIC0gdmk7CisKKyAgICAgICAgeFt0Ml0gPSB1ciAtIHZyOworICAgICAgICB4W3QyICsgMV0gPSB1aSArIHZpOworCisgICAgICAgIHQxICs9IG1oOworICAgICAgICB0MiA9IHQxICsgKG1oIDw8IDEpOworCisgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0Ml0sIHhbdDIgKyAxXSwgY3MpOworCisgICAgICAgIHVyID0geFt0MV0gPj4gMTsKKyAgICAgICAgdWkgPSB4W3QxICsgMV0gPj4gMTsKKworICAgICAgICB4W3QxXSA9IHVyIC0gdnI7CisgICAgICAgIHhbdDEgKyAxXSA9IHVpIC0gdmk7CisKKyAgICAgICAgeFt0Ml0gPSB1ciArIHZyOworICAgICAgICB4W3QyICsgMV0gPSB1aSArIHZpOworICAgICAgfQogICAgIH0KIAotICAgIGZvcihsZG09MzsgbGRtPD1sZG47ICsrbGRtKQotICAgIHsKLSAgICAgICAgSU5UIG09KDE8PGxkbSk7Ci0gICAgICAgIElOVCBtaD0obT4+MSk7Ci0gICAgICAgIElOVCBqLHI7CisgICAgeyAvKiBibG9jayAyICovCisgICAgICBqID0gbWggLyA0OwogCi0gICAgICAgIHRyaWdzdGVwPSgodHJpZ0RhdGFTaXplIDw8IDIpPj5sZG0pOworICAgICAgZm9yIChyID0gMDsgciA8IG47IHIgKz0gbSkgeworICAgICAgICBJTlQgdDEgPSAociArIGopIDw8IDE7CisgICAgICAgIElOVCB0MiA9IHQxICsgKG1oIDw8IDEpOworICAgICAgICBGSVhQX0RCTCB2ciwgdmksIHVyLCB1aTsKIAotICAgICAgICBGREtfQVNTRVJUKHRyaWdzdGVwID4gMCk7CisgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0MiArIDFdLCB4W3QyXSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgICAgICAgICAgICAgICAgICAgU1RDKDB4NWE4Mjc5OWEpKTsKIAotICAgICAgICAvKiBEbyBmaXJzdCBpdGVyYXRpb24gd2l0aCBjPTEuMCBhbmQgcz0wLjAgc2VwYXJhdGVseSB0byBhdm9pZCBsb29zaW5nIHRvIG11Y2ggcHJlY2lzaW9uLgotICAgICAgICAgICBCZXdhcmU6IFRoZSBpbXBhY3Qgb24gdGhlIG92ZXJhbCBGRlQgcHJlY2lzaW9uIGlzIHJhdGhlciBsYXJnZS4gKi8KLSAgICAgICAgewotICAgICAgICAgICAgaiA9IDA7CisgICAgICAgIHVyID0geFt0MV0gPj4gMTsKKyAgICAgICAgdWkgPSB4W3QxICsgMV0gPj4gMTsKIAotICAgICAgICAgICAgZm9yKHI9MDsgcjxuOyByKz1tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElOVCB0MSA9IChyK2opPDwxOwotICAgICAgICAgICAgICAgIElOVCB0MiA9IHQxICsgKG1oPDwxKTsKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCB2cix2aSx1cix1aTsKKyAgICAgICAgeFt0MV0gPSB1ciArIHZyOworICAgICAgICB4W3QxICsgMV0gPSB1aSArIHZpOwogCi0gICAgICAgICAgICAgICAgLy9jcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDIrMV0sIHhbdDJdLCAoRklYUF9TR0wpMS4wLCAoRklYUF9TR0wpMC4wKTsKLSAgICAgICAgICAgICAgICB2aSA9IHhbdDIrMV0+PjE7Ci0gICAgICAgICAgICAgICAgdnIgPSB4W3QyXT4+MTsKKyAgICAgICAgeFt0Ml0gPSB1ciAtIHZyOworICAgICAgICB4W3QyICsgMV0gPSB1aSAtIHZpOwogCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CisgICAgICAgIHQxICs9IG1oOworICAgICAgICB0MiA9IHQxICsgKG1oIDw8IDEpOwogCi0gICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKKyAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyICsgMV0sIHhbdDJdLCBTVEMoMHg1YTgyNzk5YSksCisgICAgICAgICAgICAgICAgICAgICBTVEMoMHg1YTgyNzk5YSkpOwogCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aS12aTsKKyAgICAgICAgdXIgPSB4W3QxXSA+PiAxOworICAgICAgICB1aSA9IHhbdDEgKyAxXSA+PiAxOwogCi0gICAgICAgICAgICAgICAgdDEgKz0gbWg7Ci0gICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOworICAgICAgICB4W3QxXSA9IHVyICsgdnI7CisgICAgICAgIHhbdDEgKyAxXSA9IHVpIC0gdmk7CiAKLSAgICAgICAgICAgICAgICAvL2NwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0MisxXSwgeFt0Ml0sIChGSVhQX1NHTCkxLjAsIChGSVhQX1NHTCkwLjApOwotICAgICAgICAgICAgICAgIHZyID0geFt0MisxXT4+MTsKLSAgICAgICAgICAgICAgICB2aSA9IHhbdDJdPj4xOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3Ioaj0xOyBqPG1oLzQ7ICsraikKLSAgICAgICAgewotICAgICAgICAgICAgRklYUF9TVFAgY3M7Ci0KLSAgICAgICAgICAgIGNzID0gdHJpZ2RhdGFbaip0cmlnc3RlcF07Ci0KLSAgICAgICAgICAgIGZvcihyPTA7IHI8bjsgcis9bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJTlQgdDEgPSAocitqKTw8MTsKLSAgICAgICAgICAgICAgICBJTlQgdDIgPSB0MSArIChtaDw8MSk7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDIrMV0sIHhbdDJdLCBjcyk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgdDEgKz0gbWg7Ci0gICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyKzFdLCB4W3QyXSwgY3MpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIC8qIFNhbWUgYXMgYWJvdmUgYnV0IGZvciB0MSx0MiB3aXRoIGo+bWgvNCBhbmQgdGh1cyBjcyBzd2FwcGVkICovCi0gICAgICAgICAgICAgICAgdDEgPSAocittaC8yLWopPDwxOwotICAgICAgICAgICAgICAgIHQyID0gdDEgKyAobWg8PDEpOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyXSwgeFt0MisxXSwgY3MpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIHQxICs9IG1oOwotICAgICAgICAgICAgICAgIHQyID0gdDErKG1oPDwxKTsKLQotICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0Ml0sIHhbdDIrMV0sIGNzKTsKLQotICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwotCi0gICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aS12aTsKLQotICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWkrdmk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgaiA9IG1oLzQ7Ci0KLSAgICAgICAgICAgIGZvcihyPTA7IHI8bjsgcis9bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJTlQgdDEgPSAocitqKTw8MTsKLSAgICAgICAgICAgICAgICBJTlQgdDIgPSB0MSArIChtaDw8MSk7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDIrMV0sIHhbdDJdLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVhODI3OTlhKSk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgdDEgKz0gbWg7Ci0gICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyKzFdLCB4W3QyXSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1YTgyNzk5YSkpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKyAgICAgICAgeFt0Ml0gPSB1ciAtIHZyOworICAgICAgICB4W3QyICsgMV0gPSB1aSArIHZpOworICAgICAgfQorICAgIH0gLyogZW5kIG9mIGJsb2NrIDIgKi8KKyAgfQogfQorCiAjZW5kaWYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIGZ1bmN0aW9ubmFtZTogZGl0X2lmZnQgKHN5bnRoZXNpcykKLSAgICBkZXNjcmlwdGlvbjogIGRpdC10dWtleS1hbGdvcml0aG0KLSAgICAgICAgICAgICAgICAgIHNjcmFtYmxlcyBkYXRhIGF0IGVudHJ5Ci0gICAgICAgICAgICAgICAgICBpLmUuIGxvb3AgaXMgbWFkZSB3aXRoIHNjcmFtYmxlZCBkYXRhCi0gICAgcmV0dXJuczoKLSAgICBpbnB1dDoKLSAgICBvdXRwdXQ6Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgIWRlZmluZWQoRlVOQ1RJT05fZGl0X2lmZnQpCi12b2lkIGRpdF9pZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsIGNvbnN0IElOVCB0cmlnRGF0YVNpemUpCi17Ci0gICAgY29uc3QgSU5UIG49MTw8bGRuOwotICAgIElOVCB0cmlnc3RlcCxpLGxkbTsKLQotICAgIHNjcmFtYmxlKHgsbik7Ci0KLSAgICAvKgotICAgICAgMSsyIHN0YWdlIHJhZGl4IDQKLSAgICAqLwotCi0gICAgZm9yIChpPTA7aTxuKjI7aSs9OCkKLSAgICB7Ci0gICAgICBGSVhQX0RCTCBhMCwgYTEsIGEyLCBhMywgYTAwLCBhMTAsIGEyMCwgYTMwOwotCi0gICAgICBhMDAgPSAoeFtpICsgMF0gKyB4W2kgKyAyXSk+PjE7ICAgLyogUmUgQSArIFJlIEIgKi8KLSAgICAgIGExMCA9ICh4W2kgKyA0XSArIHhbaSArIDZdKT4+MTsgICAvKiBSZSBDICsgUmUgRCAqLwotICAgICAgYTIwID0gKHhbaSArIDFdICsgeFtpICsgM10pPj4xOyAgIC8qIEltIEEgKyBJbSBCICovCi0gICAgICBhMzAgPSAoeFtpICsgNV0gKyB4W2kgKyA3XSk+PjE7ICAgLyogSW0gQyArIEltIEQgKi8KLSAgICAgIGEwICA9ICh4W2kgKyAwXSAtIHhbaSArIDJdKT4+MTsgICAvKiBSZSBBIC0gUmUgQiAqLwotICAgICAgYTIgID0gKHhbaSArIDRdIC0geFtpICsgNl0pPj4xOyAgIC8qIFJlIEMgLSBSZSBEICovCi0gICAgICBhMyAgPSAoeFtpICsgMV0gLSB4W2kgKyAzXSk+PjE7ICAgLyogSW0gQSAtIEltIEIgKi8KLSAgICAgIGExICA9ICh4W2kgKyA1XSAtIHhbaSArIDddKT4+MTsgICAvKiBJbSBDIC0gSW0gRCAqLwotCi0gICAgICB4W2kgKyAwXSA9IGEwMCArIGExMDsgICAgLyogUmUgQScgPSBSZSBBICsgUmUgQiArIFJlIEMgKyBSZSBEICovCi0gICAgICB4W2kgKyA0XSA9IGEwMCAtIGExMDsgICAgLyogUmUgQycgPSBSZSBBICsgUmUgQiAtIFJlIEMgLSBSZSBEICovCi0gICAgICB4W2kgKyAxXSA9IGEyMCArIGEzMDsgICAgLyogSW0gQScgPSBJbSBBICsgSW0gQiArIEltIEMgKyBJbSBEICovCi0gICAgICB4W2kgKyA1XSA9IGEyMCAtIGEzMDsgICAgLyogSW0gQycgPSBJbSBBICsgSW0gQiAtIEltIEMgLSBJbSBEICovCi0gICAgICB4W2kgKyAyXSA9IGEwIC0gYTE7ICAgICAgLyogUmUgQicgPSBSZSBBIC0gUmUgQiAtIEltIEMgKyBJbSBEICovCi0gICAgICB4W2kgKyA2XSA9IGEwICsgYTE7ICAgICAgLyogUmUgRCcgPSBSZSBBIC0gUmUgQiArIEltIEMgLSBJbSBEICovCi0gICAgICB4W2kgKyAzXSA9IGEzICsgYTI7ICAgICAgLyogSW0gQicgPSBJbSBBIC0gSW0gQiArIFJlIEMgLSBSZSBEICovCi0gICAgICB4W2kgKyA3XSA9IGEzIC0gYTI7ICAgICAgLyogSW0gRCcgPSBJbSBBIC0gSW0gQiAtIFJlIEMgKyBSZSBEICovCi0gICAgfQotCi0gICAgZm9yKGxkbT0zOyBsZG08PWxkbjsgKytsZG0pCi0gICAgewotICAgICAgICBjb25zdCBJTlQgbT0oMTw8bGRtKTsKLSAgICAgICAgY29uc3QgSU5UIG1oPShtPj4xKTsKLQotICAgICAgICBJTlQgaixyOwotCi0gICAgICAgIHRyaWdzdGVwPSgodHJpZ0RhdGFTaXplIDw8IDIpPj5sZG0pOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSAwOwotCi0gICAgICAgICAgICBmb3Iocj0wOyByPG47IHIrPW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSU5UIHQxID0gKHIraik8PDE7Ci0gICAgICAgICAgICAgICAgSU5UIHQyID0gdDEgKyAobWg8PDEpOwotICAgICAgICAgICAgICAgIEZJWFBfREJMIHZyLHZpLHVyLHVpOwotCi0gICAgICAgICAgICAgICAgLy9jcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDJdLCB4W3QyKzFdLCBGTDJGWENPTlNUX1NHTCgxLjApLCAoRklYUF9TR0wpMC4wKTsKLSAgICAgICAgICAgICAgICB2aSA9IHhbdDIrMV0+PjE7Ci0gICAgICAgICAgICAgICAgdnIgPSB4W3QyXT4+MTsKLQotICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwotCi0gICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB0MSArPSBtaDsKLSAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7Ci0KLSAgICAgICAgICAgICAgICAvL2NwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0Ml0sIHhbdDIrMV0sIEZMMkZYQ09OU1RfU0dMKDEuMCksIEZMMkZYQ09OU1RfU0dMKDAuMCkpOwotICAgICAgICAgICAgICAgIHZyID0geFt0MisxXT4+MTsKLSAgICAgICAgICAgICAgICB2aSA9IHhbdDJdPj4xOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aS12aTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3Ioaj0xOyBqPG1oLzQ7ICsraikKLSAgICAgICAgewotICAgICAgICAgICAgRklYUF9TVFAgY3M7Ci0KLSAgICAgICAgICAgIGNzID0gdHJpZ2RhdGFbaip0cmlnc3RlcF07Ci0KLSAgICAgICAgICAgIGZvcihyPTA7IHI8bjsgcis9bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJTlQgdDEgPSAocitqKTw8MTsKLSAgICAgICAgICAgICAgICBJTlQgdDIgPSB0MSArIChtaDw8MSk7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDJdLCB4W3QyKzFdLCBjcyk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgdDEgKz0gbWg7Ci0gICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyXSwgeFt0MisxXSwgY3MpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aS12aTsKLQotICAgICAgICAgICAgICAgIC8qIFNhbWUgYXMgYWJvdmUgYnV0IGZvciB0MSx0MiB3aXRoIGo+bWgvNCBhbmQgdGh1cyBjcyBzd2FwcGVkICovCi0gICAgICAgICAgICAgICAgdDEgPSAocittaC8yLWopPDwxOwotICAgICAgICAgICAgICAgIHQyID0gdDEgKyAobWg8PDEpOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyKzFdLCB4W3QyXSwgY3MpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aS12aTsKLQotICAgICAgICAgICAgICAgIHQxICs9IG1oOwotICAgICAgICAgICAgICAgIHQyID0gdDErKG1oPDwxKTsKLQotICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0MisxXSwgeFt0Ml0sIGNzKTsKLQotICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwotCi0gICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aS12aTsKLQotICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWkrdmk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgaiA9IG1oLzQ7Ci0gICAgICAgICAgICBmb3Iocj0wOyByPG47IHIrPW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSU5UIHQxID0gKHIrbWgvMi1qKTw8MTsKLSAgICAgICAgICAgICAgICBJTlQgdDIgPSB0MSArIChtaDw8MSk7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDJdLCB4W3QyKzFdLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVhODI3OTlhKSk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgdDEgKz0gbWg7Ci0gICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyXSwgeFt0MisxXSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1YTgyNzk5YSkpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aS12aTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL2ZpeHBvaW50X21hdGguY3BwIGIvbGliRkRLL3NyYy9maXhwb2ludF9tYXRoLmNwcAppbmRleCAxYmY5MzY2Li42YzY1NmZhIDEwMDY0NAotLS0gYS9saWJGREsvc3JjL2ZpeHBvaW50X21hdGguY3BwCisrKyBiL2xpYkZESy9zcmMvZml4cG9pbnRfbWF0aC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksOTMgKzkwLDQyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTS4gR2F5ZXIKKwogICAgRGVzY3JpcHRpb246IEZpeGVkIHBvaW50IHNwZWNpZmljIG1hdGhlbWF0aWNhbCBmdW5jdGlvbnMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKIAorLyoKKyAqIEhhcmR3YXJlIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucworICovCiAKLSNkZWZpbmUgTUFYX0xEX1BSRUNJU0lPTiAxMAotI2RlZmluZSBMRF9QUkVDSVNJT04gICAgIDEwCi0KLS8qIFRheWxvciBzZXJpZXMgY29lZmZjaWVudHMgZm9yIGxuKDEteCksIGNlbnRlcmVkIGF0IDAgKE1hY0xhdXJpbiBwb2xpbm9taWFsKS4gKi8KLSNpZm5kZWYgTERDT0VGRl8xNkJJVAotTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgbGRDb2VmZltNQVhfTERfUFJFQ0lTSU9OXSA9IHsKLSAgICBGTDJGWENPTlNUX0RCTCgtMS4wKSwKLSAgICBGTDJGWENPTlNUX0RCTCgtMS4wLzIuMCksCi0gICAgRkwyRlhDT05TVF9EQkwoLTEuMC8zLjApLAotICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNC4wKSwKLSAgICBGTDJGWENPTlNUX0RCTCgtMS4wLzUuMCksCi0gICAgRkwyRlhDT05TVF9EQkwoLTEuMC82LjApLAotICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNy4wKSwKLSAgICBGTDJGWENPTlNUX0RCTCgtMS4wLzguMCksCi0gICAgRkwyRlhDT05TVF9EQkwoLTEuMC85LjApLAotICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvMTAuMCkKLX07Ci0jZWxzZQotTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCi1zdGF0aWMgY29uc3QgRklYUF9TR0wgbGRDb2VmZltNQVhfTERfUFJFQ0lTSU9OXSA9IHsKLSAgICBGTDJGWENPTlNUX1NHTCgtMS4wKSwKLSAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzIuMCksCi0gICAgRkwyRlhDT05TVF9TR0woLTEuMC8zLjApLAotICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAvNC4wKSwKLSAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzUuMCksCi0gICAgRkwyRlhDT05TVF9TR0woLTEuMC82LjApLAotICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAvNy4wKSwKLSAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzguMCksCi0gICAgRkwyRlhDT05TVF9TR0woLTEuMC85LjApLAotICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAvMTAuMCkKLX07Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgZnVuY3Rpb25uYW1lOiBDYWxjTGREYXRhCi0gIGRlc2NyaXB0aW9uOiAgRGVsaXZlcnMgdGhlIExvZ2FyaXRobSBEdWFsaXMgbGQob3ApL0xEX0RBVEFfU0NBTElORyB3aXRoIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbi4KLSAgaW5wdXQ6ICAgICAgICBJbnB1dCBvcCBpcyBhc3N1bWVkIHRvIGJlIGRvdWJsZSBwcmVjaXNpb24gZnJhY3Rpb25hbCAwIDwgb3AgPCAxLjAKLSAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VwdCBuZWdhdGl2ZSB2YWx1ZXMuCi0gIG91dHB1dDogICAgICAgRm9yIG9wID09IDAsIHRoZSByZXN1bHQgaXMgc2F0dXJhdGVkIHRvIC0xLjAKLSAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBwb3NpdGl2ZSB2YWx1ZXMgc2luY2UgaW5wdXQgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGZyYWN0aW9uYWwgdmFsdWVzLgotICAgICAgICAgICAgICAgIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gaW5wdXQgYW4gaW50ZWdlciB2YWx1ZSBpbnRvIHRoaXMgZnVuY3Rpb24gKGFuZCBleHBlY3QgYSBwb3NpdGl2ZSBvdXRwdXQgdmFsdWUpCi0gICAgICAgICAgICAgICAgc2luY2UgaW5wdXQgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGZyYWN0aW9uYWwgdmFsdWVzLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTE5LX1NFQ1RJT05fQ09ERV9MMQotRklYUF9EQkwgQ2FsY0xkRGF0YShGSVhQX0RCTCBvcCkKLXsKLSAgcmV0dXJuIGZMb2cyKG9wLCAwKTsKLX0KLQorLyoKKyAqIEZhbGxiYWNrIGltcGxlbWVudGF0aW9ucworICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICBmdW5jdGlvbm5hbWU6IExkRGF0YVZlY3RvcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBMTktfU0VDVElPTl9DT0RFX0wxCi12b2lkIExkRGF0YVZlY3RvciggIEZJWFBfREJMICAgICpzcmNWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpkZXN0VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBuKQotewotICAgIElOVCBpOwotICAgIGZvciAoIGk9MDsgaTxuOyBpKyspIHsKLSAgICAgICAgZGVzdFZlY3RvcltpXSA9IENhbGNMZERhdGEoc3JjVmVjdG9yW2ldKTsKLSAgICB9Cit2b2lkIExkRGF0YVZlY3RvcihGSVhQX0RCTCAqc3JjVmVjdG9yLCBGSVhQX0RCTCAqZGVzdFZlY3RvciwgSU5UIG4pIHsKKyAgSU5UIGk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBkZXN0VmVjdG9yW2ldID0gZkxvZzIoc3JjVmVjdG9yW2ldLCAwKTsKKyAgfQogfQogCi0KLQogI2RlZmluZSBNQVhfUE9XMl9QUkVDSVNJT04gOAogI2lmbmRlZiBTSU5FVEFCTEVfMTZCSVQKLQkjZGVmaW5lIFBPVzJfUFJFQ0lTSU9OIE1BWF9QT1cyX1BSRUNJU0lPTgorI2RlZmluZSBQT1cyX1BSRUNJU0lPTiBNQVhfUE9XMl9QUkVDSVNJT04KICNlbHNlCi0JI2RlZmluZSBQT1cyX1BSRUNJU0lPTiA1CisjZGVmaW5lIFBPVzJfUFJFQ0lTSU9OIDUKICNlbmRpZgogCiAvKgpAQCAtMTczLDYyICsxMzMsMzcgQEAKICAgb21taXRlZCAoZXF1YWwgdG8gMS4wKS4KIAogICBwb3cyQ29lZmZbaS0xXSA9ICgxL2khKSBkXmkoMl54KS9keF5pLCBpPTEuLk1BWF9QT1cyX1BSRUNJU0lPTgotICBUbyBldmFsdWF0ZSB0aGUgdGF5bG9yIHNlcmllcyBhcm91bmQgeCA9IDAsIHRoZSBjb2VmZmljaWVudHMgYXJlOiAxLyFpICogbG4oMileaQorICBUbyBldmFsdWF0ZSB0aGUgdGF5bG9yIHNlcmllcyBhcm91bmQgeCA9IDAsIHRoZSBjb2VmZmljaWVudHMgYXJlOiAxLyFpICoKKyAgbG4oMileaQogICovCiAjaWZuZGVmIFBPVzJDT0VGRl8xNkJJVAorUkFNX0FMSUdOCiBMTktfU0VDVElPTl9DT05TVERBVEFfTDEKIHN0YXRpYyBjb25zdCBGSVhQX0RCTCBwb3cyQ29lZmZbTUFYX1BPVzJfUFJFQ0lTSU9OXSA9IHsKLSAgICBGTDJGWENPTlNUX0RCTCgwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NyksICAgIC8qIGxuKDIpXjEgLzEhICovCi0gICAgRkwyRlhDT05TVF9EQkwoMC4yNDAyMjY1MDY5NTkxMDA3MTIzMzM1NTEyNjMxNjMzMzIpLCAgICAvKiBsbigyKV4yIC8yISAqLwotICAgIEZMMkZYQ09OU1RfREJMKDAuMDU1NTA0MTA4NjY0ODIxNTc5OTUzMTQyMjYzNzY4NjIxOCksICAgLyogbG4oMileMyAvMyEgKi8KLSAgICBGTDJGWENPTlNUX0RCTCgwLjAwOTYxODEyOTEwNzYyODQ3NzE2MTk3OTA3MTU3MzY1ODg3KSwgIC8qIGxuKDIpXjQgLzQhICovCi0gICAgRkwyRlhDT05TVF9EQkwoMC4wMDEzMzMzNTU4MTQ2NDI4NDQzNDIzNDEyMjIxOTg3OTk2MiksICAvKiBsbigyKV41IC81ISAqLwotICAgIEZMMkZYQ09OU1RfREJMKDEuNTQwMzUzMDM5MzM4MTYwOTk1NDQzNzA5NzMzMjc0MjNlLTQpLCAgLyogbG4oMileNiAvNiEgKi8KLSAgICBGTDJGWENPTlNUX0RCTCgxLjUyNTI3MzM4MDQwNTk4NDAyODAwMjU0MzkwMTIwMDk2ZS01KSwgIC8qIGxuKDIpXjcgLzchICovCi0gICAgRkwyRlhDT05TVF9EQkwoMS4zMjE1NDg2NzkwMTQ0MzA5NDg4NDAzNzU4MjI4Mjg4NGUtNikgICAvKiBsbigyKV44IC84ISAqLworICAgIEZMMkZYQ09OU1RfREJMKDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc3KSwgICAvKiBsbigyKV4xIC8xISAqLworICAgIEZMMkZYQ09OU1RfREJMKDAuMjQwMjI2NTA2OTU5MTAwNzEyMzMzNTUxMjYzMTYzMzMyKSwgICAvKiBsbigyKV4yIC8yISAqLworICAgIEZMMkZYQ09OU1RfREJMKDAuMDU1NTA0MTA4NjY0ODIxNTc5OTUzMTQyMjYzNzY4NjIxOCksICAvKiBsbigyKV4zIC8zISAqLworICAgIEZMMkZYQ09OU1RfREJMKDAuMDA5NjE4MTI5MTA3NjI4NDc3MTYxOTc5MDcxNTczNjU4ODcpLCAvKiBsbigyKV40IC80ISAqLworICAgIEZMMkZYQ09OU1RfREJMKDAuMDAxMzMzMzU1ODE0NjQyODQ0MzQyMzQxMjIyMTk4Nzk5NjIpLCAvKiBsbigyKV41IC81ISAqLworICAgIEZMMkZYQ09OU1RfREJMKDEuNTQwMzUzMDM5MzM4MTYwOTk1NDQzNzA5NzMzMjc0MjNlLTQpLCAvKiBsbigyKV42IC82ISAqLworICAgIEZMMkZYQ09OU1RfREJMKDEuNTI1MjczMzgwNDA1OTg0MDI4MDAyNTQzOTAxMjAwOTZlLTUpLCAvKiBsbigyKV43IC83ISAqLworICAgIEZMMkZYQ09OU1RfREJMKDEuMzIxNTQ4Njc5MDE0NDMwOTQ4ODQwMzc1ODIyODI4ODRlLTYpICAvKiBsbigyKV44IC84ISAqLwogfTsKICNlbHNlCitSQU1fQUxJR04KIExOS19TRUNUSU9OX0NPTlNUREFUQV9MMQogc3RhdGljIGNvbnN0IEZJWFBfU0dMIHBvdzJDb2VmZltNQVhfUE9XMl9QUkVDSVNJT05dID0gewotICAgIEZMMkZYQ09OU1RfU0dMKDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc3KSwgICAgLyogbG4oMileMSAvMSEgKi8KLSAgICBGTDJGWENPTlNUX1NHTCgwLjI0MDIyNjUwNjk1OTEwMDcxMjMzMzU1MTI2MzE2MzMzMiksICAgIC8qIGxuKDIpXjIgLzIhICovCi0gICAgRkwyRlhDT05TVF9TR0woMC4wNTU1MDQxMDg2NjQ4MjE1Nzk5NTMxNDIyNjM3Njg2MjE4KSwgICAvKiBsbigyKV4zIC8zISAqLwotICAgIEZMMkZYQ09OU1RfU0dMKDAuMDA5NjE4MTI5MTA3NjI4NDc3MTYxOTc5MDcxNTczNjU4ODcpLCAgLyogbG4oMileNCAvNCEgKi8KLSAgICBGTDJGWENPTlNUX1NHTCgwLjAwMTMzMzM1NTgxNDY0Mjg0NDM0MjM0MTIyMjE5ODc5OTYyKSwgIC8qIGxuKDIpXjUgLzUhICovCi0gICAgRkwyRlhDT05TVF9TR0woMS41NDAzNTMwMzkzMzgxNjA5OTU0NDM3MDk3MzMyNzQyM2UtNCksICAvKiBsbigyKV42IC82ISAqLwotICAgIEZMMkZYQ09OU1RfU0dMKDEuNTI1MjczMzgwNDA1OTg0MDI4MDAyNTQzOTAxMjAwOTZlLTUpLCAgLyogbG4oMileNyAvNyEgKi8KLSAgICBGTDJGWENPTlNUX1NHTCgxLjMyMTU0ODY3OTAxNDQzMDk0ODg0MDM3NTgyMjgyODg0ZS02KSAgIC8qIGxuKDIpXjggLzghICovCisgICAgRkwyRlhDT05TVF9TR0woMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzcpLCAgIC8qIGxuKDIpXjEgLzEhICovCisgICAgRkwyRlhDT05TVF9TR0woMC4yNDAyMjY1MDY5NTkxMDA3MTIzMzM1NTEyNjMxNjMzMzIpLCAgIC8qIGxuKDIpXjIgLzIhICovCisgICAgRkwyRlhDT05TVF9TR0woMC4wNTU1MDQxMDg2NjQ4MjE1Nzk5NTMxNDIyNjM3Njg2MjE4KSwgIC8qIGxuKDIpXjMgLzMhICovCisgICAgRkwyRlhDT05TVF9TR0woMC4wMDk2MTgxMjkxMDc2Mjg0NzcxNjE5NzkwNzE1NzM2NTg4NyksIC8qIGxuKDIpXjQgLzQhICovCisgICAgRkwyRlhDT05TVF9TR0woMC4wMDEzMzMzNTU4MTQ2NDI4NDQzNDIzNDEyMjIxOTg3OTk2MiksIC8qIGxuKDIpXjUgLzUhICovCisgICAgRkwyRlhDT05TVF9TR0woMS41NDAzNTMwMzkzMzgxNjA5OTU0NDM3MDk3MzMyNzQyM2UtNCksIC8qIGxuKDIpXjYgLzYhICovCisgICAgRkwyRlhDT05TVF9TR0woMS41MjUyNzMzODA0MDU5ODQwMjgwMDI1NDM5MDEyMDA5NmUtNSksIC8qIGxuKDIpXjcgLzchICovCisgICAgRkwyRlhDT05TVF9TR0woMS4zMjE1NDg2NzkwMTQ0MzA5NDg4NDAzNzU4MjI4Mjg4NGUtNikgIC8qIGxuKDIpXjggLzghICovCiB9OwogI2VuZGlmCiAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIGZ1bmN0aW9ubmFtZTogbXVsX2RibF9zZ2xfcm5kCi0gICAgZGVzY3JpcHRpb246ICBNdWx0aXBseSB3aXRoIHJvdW5kLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGZvciByb3VuZGluZyBhIGRmcmFjdCB0byBmcmFjdCAqLwotI2RlZmluZSBBQ0NVX1IgKExPTkcpIDB4MDAwMDgwMDAKLQotTE5LX1NFQ1RJT05fQ09ERV9MMQotRklYUF9EQkwgbXVsX2RibF9zZ2xfcm5kIChjb25zdCBGSVhQX0RCTCBvcDEsIGNvbnN0IEZJWFBfU0dMIG9wMikKLXsKLSAgRklYUF9EQkwgcHJvZDsKLSAgTE9ORyB2ID0gKExPTkcpKG9wMSk7Ci0gIFNIT1JUIHUgPSAoU0hPUlQpKG9wMik7Ci0KLSAgTE9ORyBsb3cgPSB1Kih2JlNHTF9NQVNLKTsKLSAgbG93ID0gKGxvdysoQUNDVV9SPj4xKSkgPj4gKEZSQUNUX0JJVFMtMSk7ICAvKiByb3VuZCAqLwotICBMT05HIGhpZ2ggPSB1ICogKCh2Pj5GUkFDVF9CSVRTKTw8MSk7Ci0KLSAgcHJvZCA9IChMT05HKShoaWdoK2xvdyk7Ci0KLSAgcmV0dXJuKChGSVhQX0RCTClwcm9kKTsKLX0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBmdW5jdGlvbm5hbWU6IENhbGNJbnZMZERhdGEKQEAgLTIzNiwyNDYgKzE3MSwyMjUgQEAKICAgICAgICAgICAgICAgICBEZWxpdmVycyAyXihvcCpMRF9EQVRBX1NDQUxJTkcpCiAgIGlucHV0OiAgICAgICAgSW5wdXQgb3AgaXMgYXNzdW1lZCB0byBiZSBmcmFjdGlvbmFsIC0xLjAgPCBvcCA8IDEuMAogICBvdXRwdXQ6ICAgICAgIEZvciBvcCA9PSAwLCB0aGUgcmVzdWx0IGlzIE1BWFZBTF9EQkwgKGFsbW9zdCAxLjApLgotICAgICAgICAgICAgICAgIEZvciBuZWdhdGl2ZSBpbnB1dCB2YWx1ZXMgdGhlIG91dHB1dCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHBvc2l0aXZlIGZyYWN0aW9uYWwgdmFsdWUuCi0gICAgICAgICAgICAgICAgRm9yIHBvc2l0aXZlIGlucHV0IHZhbHVlcyB0aGUgb3V0cHV0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZS4KLSAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG91dHB1dCBuZWdhdGl2ZSB2YWx1ZXMuCisgICAgICAgICAgICAgICAgRm9yIG5lZ2F0aXZlIGlucHV0IHZhbHVlcyB0aGUgb3V0cHV0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEKK3Bvc2l0aXZlIGZyYWN0aW9uYWwgdmFsdWUuIEZvciBwb3NpdGl2ZSBpbnB1dCB2YWx1ZXMgdGhlIG91dHB1dCBzaG91bGQgYmUKK3RyZWF0ZWQgYXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG91dHB1dCBuZWdhdGl2ZQordmFsdWVzLgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxOS19TRUNUSU9OX0NPREVfTDEKKy8qIERhdGU6IDA2LUpVTFktMjAxMiBBcnRodXIgVHJpdHRoYXJ0LCBJSVMgRnJhdW5ob2ZlciBFcmxhbmdlbiAqLworLyogVmVyc2lvbiB3aXRoIDMgdGFibGUgbG9va3VwIGFuZCAxIGxpbmVhciBpbnRlcnBvbGF0aW9ucyAgICAgICovCisvKiBBbGdvcml0aG06IGNvbXB1dGUgcG93ZXIgb2YgMiwgYXJndW1lbnQgeCBpcyBpbiBRNy4yNSBmb3JtYXQgKi8KKy8qICByZXN1bHQgPSAyXih4LzY0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdlIHNwbGl0IGV4cG9uZW50ICh4LzY0KSBpbnRvIDUgY29tcG9uZW50czogICAgICAgICAgICAgICAgICovCisvKiAgaW50ZWdlciBwYXJ0OiAgICAgIHJlcHJlc2VudGVkIGJ5IGIzMS4uYjI1ICAoZXhwKSAgICAgICAgICAgKi8KKy8qICBmcmFjdGlvbmFsIHBhcnQgMTogcmVwcmVzZW50ZWQgYnkgYjI0Li5iMjAgIChsb29rdXAxKSAgICAgICAqLworLyogIGZyYWN0aW9uYWwgcGFydCAyOiByZXByZXNlbnRlZCBieSBiMTkuLmIxNSAgKGxvb2t1cDIpICAgICAgICovCisvKiAgZnJhY3Rpb25hbCBwYXJ0IDM6IHJlcHJlc2VudGVkIGJ5IGIxNC4uYjEwICAobG9va3VwMykgICAgICAgKi8KKy8qICBmcmFjdGlvbmFsIHBhcnQgNDogcmVwcmVzZW50ZWQgYnkgYjA5Li5iMDAgIChmcmFjKSAgICAgICAgICAqLworLyogID0+IHJlc3VsdCA9IChsb29rdXAxKmxvb2t1cDIqKGxvb2t1cDMrQzEqZnJhYyk8PDMpPj5leHAgICAgICovCisvKiBEdWUgdG8gdGhlIGZhY3QsIHRoYXQgYWxsIGxvb2t1cCB2YWx1ZXMgY29udGFpbiBhIGZhY3RvciAwLjUgKi8KKy8qIHRoZSByZXN1bHQgaGFzIHRvIGJlIHNoaWZ0ZWQgYnkgMyB0byB0aGUgcmlnaHQgYWxzby4gICAgICAgICAqLworLyogVGFibGUgZXhwMl90YWJfbG9uZyBjb250YWlucyB0aGUgbG9nMiBmb3IgMCB0byAxLjAgaW4gc3RlcHMgICovCisvKiBvZiAxLzMyLCB0YWJsZSBleHAyd190YWJfbG9uZyB0aGUgbG9nMiBmb3IgMCB0byAxLzMyIGluIHN0ZXBzKi8KKy8qIG9mIDEvMTAyNCwgdGFibGUgZXhwMnhfdGFiX2xvbmcgdGhlIGxvZzIgZm9yIDAgdG8gMS8xMDI0IGluICAqLworLyogc3RlcHMgb2YgMS8zMjc2OC4gU2luY2UgdGhlIDItbG9nYXJpdGhtIG9mIHZlcnkgdmVyeSBzbWFsbCAgICovCisvKiBuZWdhdGl2ZSB2YWx1ZSBpcyByYXRoZXIgbGluZWFyLCB3ZSBjYW4gdXNlIGludGVycG9sYXRpb24uICAgKi8KKy8qIExpbWl0YXRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRm9yIHggPD0gMCwgdGhlIHJlc3VsdCBpcyBmcmFjdGlvbmFsIHBvc2l0aXZlICAgICAgICAgICAgICAgICovCisvKiBGb3IgeCA+IDAsIHRoZSByZXN1bHQgaXMgaW50ZWdlciBpbiByYW5nZSAxLi4uN0ZGRi5GRkZGICAgICAgKi8KKy8qIEZvciB4IDwgLTMxLzY0LCB3ZSBoYXZlIHRvIGNsZWFyIHRoZSByZXN1bHQgICAgICAgICAgICAgICAgICAqLworLyogRm9yIHggPSAwLCB0aGUgcmVzdWx0IGlzIH4xLjAgKDB4N0ZGRi5GRkZGKSAgICAgICAgICAgICAgICAgICovCisvKiBGb3IgeCA+PSAzMS82NCwgdGhlIHJlc3VsdCBpcyAweDdGRkYuRkZGRiAgICAgICAgICAgICAgICAgICAgKi8KKwogLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBsb29rdXAgMl54IHdpdGggICAqLwogLyogeCBpbiByYW5nZSBbMC4uLjEuMFsgaW4gc3RlcHMgb2YgMS8zMiAqLwotTE5LX1NFQ1RJT05fREFUQV9MMSBzdGF0aWMgY29uc3QgVUlOVCBleHAyX3RhYl9sb25nWzMyXT17Ci0weDQwMDAwMDAwLDB4NDE2NkMzNEMsMHg0MkQ1NjFCNCwweDQ0NEMwNzQwLAotMHg0NUNBRTBGMiwweDQ3NTIxQ0M2LDB4NDhFMUU5QkEsMHg0QTdBNzdENCwKLTB4NEMxQkY4MjksMHg0REM2OUNERCwweDRGN0E5OTMwLDB4NTEzODIxODIsCi0weDUyRkY2QjU1LDB4NTREMEFENUEsMHg1NkFDMUY3NSwweDU4OTFGQUMxLAotMHg1QTgyNzk5QSwweDVDN0REN0E0LDB4NUU4NDUxRDAsMHg2MDk2MjY2NSwKLTB4NjJCMzk1MDksMHg2NERDREVDMywweDY3MTI0NjBCLDB4Njk1NDBFQzksCi0weDZCQTI3RTY1LDB4NkRGRERCQ0MsMHg3MDY2NkY3NiwweDcyREM4Mzc0LAotMHg3NTYwNjM3NCwweDc3RjI1Q0NFLDB4N0E5MkJFOEIsMHg3RDQxRDk2RQotLy8gMHg4MDAwMDAwMAorTE5LX1NFQ1RJT05fREFUQV9MMQorY29uc3QgVUlOVCBleHAyX3RhYl9sb25nWzMyXSA9IHsKKyAgICAweDQwMDAwMDAwLCAweDQxNjZDMzRDLCAweDQyRDU2MUI0LCAweDQ0NEMwNzQwLCAweDQ1Q0FFMEYyLCAweDQ3NTIxQ0M2LAorICAgIDB4NDhFMUU5QkEsIDB4NEE3QTc3RDQsIDB4NEMxQkY4MjksIDB4NERDNjlDREQsIDB4NEY3QTk5MzAsIDB4NTEzODIxODIsCisgICAgMHg1MkZGNkI1NSwgMHg1NEQwQUQ1QSwgMHg1NkFDMUY3NSwgMHg1ODkxRkFDMSwgMHg1QTgyNzk5QSwgMHg1QzdERDdBNCwKKyAgICAweDVFODQ1MUQwLCAweDYwOTYyNjY1LCAweDYyQjM5NTA5LCAweDY0RENERUMzLCAweDY3MTI0NjBCLCAweDY5NTQwRUM5LAorICAgIDB4NkJBMjdFNjUsIDB4NkRGRERCQ0MsIDB4NzA2NjZGNzYsIDB4NzJEQzgzNzQsIDB4NzU2MDYzNzQsIDB4NzdGMjVDQ0UsCisgICAgMHg3QTkyQkU4QiwgMHg3RDQxRDk2RQorICAgIC8vIDB4ODAwMDAwMDAKIH07CiAKIC8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgbG9va3VwIDJeeCB3aXRoICAgKi8KIC8qIHggaW4gcmFuZ2UgWzAuLi4xLzMyWyBpbiBzdGVwcyBvZiAxLzEwMjQgKi8KLUxOS19TRUNUSU9OX0RBVEFfTDEgc3RhdGljIGNvbnN0IFVJTlQgZXhwMndfdGFiX2xvbmdbMzJdPXsKLTB4NDAwMDAwMDAsMHg0MDBCMTgxOCwweDQwMTYzMjFCLDB4NDAyMTRFMEMsCi0weDQwMkM2QkU5LDB4NDAzNzhCQjQsMHg0MDQyQUQ2RCwweDQwNEREMTEzLAotMHg0MDU4RjZBOCwweDQwNjQxRTJCLDB4NDA2RjQ3OUUsMHg0MDdBNzMwMCwKLTB4NDA4NUEwNTEsMHg0MDkwQ0Y5MiwweDQwOUMwMEM0LDB4NDBBNzMzRTYsCi0weDQwQjI2OEZBLDB4NDBCRDlGRkYsMHg0MEM4RDhGNSwweDQwRDQxM0RELAotMHg0MERGNTBCOCwweDQwRUE4Rjg2LDB4NDBGNUQwNDYsMHg0MTAxMTJGQSwKLTB4NDEwQzU3QTIsMHg0MTE3OUUzRCwweDQxMjJFNkNELDB4NDEyRTMxNTIsCi0weDQxMzk3RENDLDB4NDE0NENDM0IsMHg0MTUwMUNBMCwweDQxNUI2RUZCLAotLy8gMHg0MTY2QzM0QywKK0xOS19TRUNUSU9OX0RBVEFfTDEKK2NvbnN0IFVJTlQgZXhwMndfdGFiX2xvbmdbMzJdID0geworICAgIDB4NDAwMDAwMDAsIDB4NDAwQjE4MTgsIDB4NDAxNjMyMUIsIDB4NDAyMTRFMEMsIDB4NDAyQzZCRTksIDB4NDAzNzhCQjQsCisgICAgMHg0MDQyQUQ2RCwgMHg0MDRERDExMywgMHg0MDU4RjZBOCwgMHg0MDY0MUUyQiwgMHg0MDZGNDc5RSwgMHg0MDdBNzMwMCwKKyAgICAweDQwODVBMDUxLCAweDQwOTBDRjkyLCAweDQwOUMwMEM0LCAweDQwQTczM0U2LCAweDQwQjI2OEZBLCAweDQwQkQ5RkZGLAorICAgIDB4NDBDOEQ4RjUsIDB4NDBENDEzREQsIDB4NDBERjUwQjgsIDB4NDBFQThGODYsIDB4NDBGNUQwNDYsIDB4NDEwMTEyRkEsCisgICAgMHg0MTBDNTdBMiwgMHg0MTE3OUUzRCwgMHg0MTIyRTZDRCwgMHg0MTJFMzE1MiwgMHg0MTM5N0RDQywgMHg0MTQ0Q0MzQiwKKyAgICAweDQxNTAxQ0EwLCAweDQxNUI2RUZCLAorICAgIC8vIDB4NDE2NkMzNEMsCiB9OwogLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBsb29rdXAgMl54IHdpdGggICAqLwogLyogeCBpbiByYW5nZSBbMC4uLjEvMTAyNFsgaW4gc3RlcHMgb2YgMS8zMjc2OCAqLwotTE5LX1NFQ1RJT05fREFUQV9MMSBzdGF0aWMgY29uc3QgVUlOVCBleHAyeF90YWJfbG9uZ1szMl09ewotMHg0MDAwMDAwMCwweDQwMDA1OEI5LDB4NDAwMEIxNzMsMHg0MDAxMEEyRCwKLTB4NDAwMTYyRTgsMHg0MDAxQkJBMywweDQwMDIxNDVGLDB4NDAwMjZEMUIsCi0weDQwMDJDNUQ4LDB4NDAwMzFFOTUsMHg0MDAzNzc1MiwweDQwMDNEMDExLAotMHg0MDA0MjhDRiwweDQwMDQ4MThFLDB4NDAwNERBNEUsMHg0MDA1MzMwRSwKLTB4NDAwNThCQ0UsMHg0MDA1RTQ4RiwweDQwMDYzRDUxLDB4NDAwNjk2MTMsCi0weDQwMDZFRUQ1LDB4NDAwNzQ3OTgsMHg0MDA3QTA1QiwweDQwMDdGOTFGLAotMHg0MDA4NTFFNCwweDQwMDhBQUE4LDB4NDAwOTAzNkUsMHg0MDA5NUMzMywKLTB4NDAwOUI0RkEsMHg0MDBBMERDMCwweDQwMEE2Njg4LDB4NDAwQUJGNEYsCi0vLzB4NDAwQjE4MTgKK0xOS19TRUNUSU9OX0RBVEFfTDEKK2NvbnN0IFVJTlQgZXhwMnhfdGFiX2xvbmdbMzJdID0geworICAgIDB4NDAwMDAwMDAsIDB4NDAwMDU4QjksIDB4NDAwMEIxNzMsIDB4NDAwMTBBMkQsIDB4NDAwMTYyRTgsIDB4NDAwMUJCQTMsCisgICAgMHg0MDAyMTQ1RiwgMHg0MDAyNkQxQiwgMHg0MDAyQzVEOCwgMHg0MDAzMUU5NSwgMHg0MDAzNzc1MiwgMHg0MDAzRDAxMSwKKyAgICAweDQwMDQyOENGLCAweDQwMDQ4MThFLCAweDQwMDREQTRFLCAweDQwMDUzMzBFLCAweDQwMDU4QkNFLCAweDQwMDVFNDhGLAorICAgIDB4NDAwNjNENTEsIDB4NDAwNjk2MTMsIDB4NDAwNkVFRDUsIDB4NDAwNzQ3OTgsIDB4NDAwN0EwNUIsIDB4NDAwN0Y5MUYsCisgICAgMHg0MDA4NTFFNCwgMHg0MDA4QUFBOCwgMHg0MDA5MDM2RSwgMHg0MDA5NUMzMywgMHg0MDA5QjRGQSwgMHg0MDBBMERDMCwKKyAgICAweDQwMEE2Njg4LCAweDQwMEFCRjRGLAorICAgIC8vIDB4NDAwQjE4MTgKIH07CiAKLUxOS19TRUNUSU9OX0NPREVfTDEgRklYUF9EQkwgQ2FsY0ludkxkRGF0YShGSVhQX0RCTCB4KQotewotICBpbnQgc2V0X3plcm8gPSAoeCA8ICBGTDJGWENPTlNUX0RCTCgtMzEuMC82NC4wKSk/IDAgOiAxOwotICBpbnQgc2V0X21heCAgPSAoeCA+PSBGTDJGWENPTlNUX0RCTCggMzEuMC82NC4wKSkgfCAoeCA9PSBGTDJGWENPTlNUX0RCTCgwLjApKTsKLQotICBGSVhQX1NHTCBmcmFjID0gKEZJWFBfU0dMKShMT05HKSh4ICYgMHgzRkYpOwotICBVSU5UIGluZGV4MyA9IChVSU5UKShMT05HKSh4ID4+IDEwKSAmIDB4MUY7Ci0gIFVJTlQgaW5kZXgyID0gKFVJTlQpKExPTkcpKHggPj4gMTUpICYgMHgxRjsgCi0gIFVJTlQgaW5kZXgxID0gKFVJTlQpKExPTkcpKHggPj4gMjApICYgMHgxRjsKLSAgaW50IGV4cCAgPSAoeCA+ICBGTDJGWENPTlNUX0RCTCgwLjBmKSkgPyAoMzEgLSAoaW50KSh4Pj4yNSkpIDogKGludCkoLSh4Pj4yNSkpOwotCi0gIFVJTlQgbG9va3VwMSA9IGV4cDJfdGFiX2xvbmdbaW5kZXgxXSpzZXRfemVybzsKLSAgVUlOVCBsb29rdXAyID0gZXhwMndfdGFiX2xvbmdbaW5kZXgyXTsKLSAgVUlOVCBsb29rdXAzID0gZXhwMnhfdGFiX2xvbmdbaW5kZXgzXTsKLSAgVUlOVCBsb29rdXAzZiA9IGxvb2t1cDMgKyAoVUlOVCkoTE9ORylmTXVsdERpdjIoKEZJWFBfREJMKSgweDAwMTYzMDJGKSwoRklYUF9TR0wpZnJhYyk7Ci0gIAotICBVSU5UIGxvb2t1cDEyID0gKFVJTlQpKExPTkcpZk11bHQoKEZJWFBfREJMKWxvb2t1cDEsICAoRklYUF9EQkwpIGxvb2t1cDIpOwotICBVSU5UIGxvb2t1cCAgID0gKFVJTlQpKExPTkcpZk11bHQoKEZJWFBfREJMKWxvb2t1cDEyLCAoRklYUF9EQkwpIGxvb2t1cDNmKTsKLQotICBGSVhQX0RCTCByZXRWYWwgPSAobG9va3VwPDwzKSA+PiBleHA7Ci0KLSAgaWYgKHNldF9tYXgpCi0gICAgcmV0VmFsPUZMMkZYQ09OU1RfREJMKDEuMGYpOwotCi0gIHJldHVybiByZXRWYWw7Ci19Ci0KLQotCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgZnVuY3Rpb25uYW1lOiBJbml0TGRJbnQgYW5kIENhbGNMZEludAotICAgIGRlc2NyaXB0aW9uOiAgQ3JlYXRlIGFuZCBhY2Nlc3MgdGFibGUgd2l0aCBpbnRlZ2VyIExkRGF0YSAoMCB0byAxOTMpCisgICAgZGVzY3JpcHRpb246ICBDcmVhdGUgYW5kIGFjY2VzcyB0YWJsZSB3aXRoIGludGVnZXIgTGREYXRhICgwIHRvCitMRF9JTlRfVEFCX0xFTikKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBMRF9JTlRfVEFCX0xFTgorI2RlZmluZSBMRF9JTlRfVEFCX0xFTiBcCisgIDE5MyAvKiBEZWZhdWx0IHRhYiBsZW5ndGguIExvd2VyIHZhbHVlIHNob3VsZCBiZSBzZXQgaW4gZml4LmggKi8KKyNlbmRpZgogCisjaWYgKExEX0lOVF9UQUJfTEVOIDw9IDEyMCkKK0xOS19TRUNUSU9OX0NPTlNUREFUQV9MMQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGxkSW50Q29lZmZbXSA9IHsKKyAgICAoRklYUF9EQkwpMHg4MDAwMDAwMSwgKEZJWFBfREJMKTB4MDAwMDAwMDAsIChGSVhQX0RCTCkweDAyMDAwMDAwLAorICAgIChGSVhQX0RCTCkweDAzMmI4MDM0LCAoRklYUF9EQkwpMHgwNDAwMDAwMCwgKEZJWFBfREJMKTB4MDRhNGQzYzIsCisgICAgKEZJWFBfREJMKTB4MDUyYjgwMzQsIChGSVhQX0RCTCkweDA1OWQ1ZGEwLCAoRklYUF9EQkwpMHgwNjAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHgwNjU3MDA2OSwgKEZJWFBfREJMKTB4MDZhNGQzYzIsIChGSVhQX0RCTCkweDA2ZWIzYTlmLAorICAgIChGSVhQX0RCTCkweDA3MmI4MDM0LCAoRklYUF9EQkwpMHgwNzY2YTAwOSwgKEZJWFBfREJMKTB4MDc5ZDVkYTAsCisgICAgKEZJWFBfREJMKTB4MDdkMDUzZjcsIChGSVhQX0RCTCkweDA4MDAwMDAwLCAoRklYUF9EQkwpMHgwODJjYzdlZSwKKyAgICAoRklYUF9EQkwpMHgwODU3MDA2OSwgKEZJWFBfREJMKTB4MDg3ZWYwNWIsIChGSVhQX0RCTCkweDA4YTRkM2MyLAorICAgIChGSVhQX0RCTCkweDA4YzhkZGQ0LCAoRklYUF9EQkwpMHgwOGViM2E5ZiwgKEZJWFBfREJMKTB4MDkwYzEwNTAsCisgICAgKEZJWFBfREJMKTB4MDkyYjgwMzQsIChGSVhQX0RCTCkweDA5NDlhNzg1LCAoRklYUF9EQkwpMHgwOTY2YTAwOSwKKyAgICAoRklYUF9EQkwpMHgwOTgyODA5ZCwgKEZJWFBfREJMKTB4MDk5ZDVkYTAsIChGSVhQX0RCTCkweDA5Yjc0OTQ5LAorICAgIChGSVhQX0RCTCkweDA5ZDA1M2Y3LCAoRklYUF9EQkwpMHgwOWU4OGM2YiwgKEZJWFBfREJMKTB4MGEwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4MGExNmJhZDMsIChGSVhQX0RCTCkweDBhMmNjN2VlLCAoRklYUF9EQkwpMHgwYTQyMzE2MiwKKyAgICAoRklYUF9EQkwpMHgwYTU3MDA2OSwgKEZJWFBfREJMKTB4MGE2YjNkNzksIChGSVhQX0RCTCkweDBhN2VmMDViLAorICAgIChGSVhQX0RCTCkweDBhOTIyMDNkLCAoRklYUF9EQkwpMHgwYWE0ZDNjMiwgKEZJWFBfREJMKTB4MGFiNzExMGUsCisgICAgKEZJWFBfREJMKTB4MGFjOGRkZDQsIChGSVhQX0RCTCkweDBhZGEzZjYwLCAoRklYUF9EQkwpMHgwYWViM2E5ZiwKKyAgICAoRklYUF9EQkwpMHgwYWZiZDQyYiwgKEZJWFBfREJMKTB4MGIwYzEwNTAsIChGSVhQX0RCTCkweDBiMWJmMzEyLAorICAgIChGSVhQX0RCTCkweDBiMmI4MDM0LCAoRklYUF9EQkwpMHgwYjNhYmI0MCwgKEZJWFBfREJMKTB4MGI0OWE3ODUsCisgICAgKEZJWFBfREJMKTB4MGI1ODQ4MjIsIChGSVhQX0RCTCkweDBiNjZhMDA5LCAoRklYUF9EQkwpMHgwYjc0YjFmZCwKKyAgICAoRklYUF9EQkwpMHgwYjgyODA5ZCwgKEZJWFBfREJMKTB4MGI5MDBlNjEsIChGSVhQX0RCTCkweDBiOWQ1ZGEwLAorICAgIChGSVhQX0RCTCkweDBiYWE3MDhmLCAoRklYUF9EQkwpMHgwYmI3NDk0OSwgKEZJWFBfREJMKTB4MGJjM2U5Y2EsCisgICAgKEZJWFBfREJMKTB4MGJkMDUzZjcsIChGSVhQX0RCTCkweDBiZGM4OTliLCAoRklYUF9EQkwpMHgwYmU4OGM2YiwKKyAgICAoRklYUF9EQkwpMHgwYmY0NWUwOSwgKEZJWFBfREJMKTB4MGMwMDAwMDAsIChGSVhQX0RCTCkweDBjMGI3M2NiLAorICAgIChGSVhQX0RCTCkweDBjMTZiYWQzLCAoRklYUF9EQkwpMHgwYzIxZDY3MSwgKEZJWFBfREJMKTB4MGMyY2M3ZWUsCisgICAgKEZJWFBfREJMKTB4MGMzNzkwODUsIChGSVhQX0RCTCkweDBjNDIzMTYyLCAoRklYUF9EQkwpMHgwYzRjYWJhOCwKKyAgICAoRklYUF9EQkwpMHgwYzU3MDA2OSwgKEZJWFBfREJMKTB4MGM2MTMwYWYsIChGSVhQX0RCTCkweDBjNmIzZDc5LAorICAgIChGSVhQX0RCTCkweDBjNzUyN2I5LCAoRklYUF9EQkwpMHgwYzdlZjA1YiwgKEZJWFBfREJMKTB4MGM4ODk4M2YsCisgICAgKEZJWFBfREJMKTB4MGM5MjIwM2QsIChGSVhQX0RCTCkweDBjOWI4OTI2LCAoRklYUF9EQkwpMHgwY2E0ZDNjMiwKKyAgICAoRklYUF9EQkwpMHgwY2FlMDBkMiwgKEZJWFBfREJMKTB4MGNiNzExMGUsIChGSVhQX0RCTCkweDBjYzAwNTJiLAorICAgIChGSVhQX0RCTCkweDBjYzhkZGQ0LCAoRklYUF9EQkwpMHgwY2QxOWJiMCwgKEZJWFBfREJMKTB4MGNkYTNmNjAsCisgICAgKEZJWFBfREJMKTB4MGNlMmM5N2QsIChGSVhQX0RCTCkweDBjZWIzYTlmLCAoRklYUF9EQkwpMHgwY2YzOTM1NSwKKyAgICAoRklYUF9EQkwpMHgwY2ZiZDQyYiwgKEZJWFBfREJMKTB4MGQwM2ZkYTksIChGSVhQX0RCTCkweDBkMGMxMDUwLAorICAgIChGSVhQX0RCTCkweDBkMTQwY2EwLCAoRklYUF9EQkwpMHgwZDFiZjMxMiwgKEZJWFBfREJMKTB4MGQyM2M0MWQsCisgICAgKEZJWFBfREJMKTB4MGQyYjgwMzQsIChGSVhQX0RCTCkweDBkMzMyN2M3LCAoRklYUF9EQkwpMHgwZDNhYmI0MCwKKyAgICAoRklYUF9EQkwpMHgwZDQyM2IwOCwgKEZJWFBfREJMKTB4MGQ0OWE3ODUsIChGSVhQX0RCTCkweDBkNTEwMTE4LAorICAgIChGSVhQX0RCTCkweDBkNTg0ODIyLCAoRklYUF9EQkwpMHgwZDVmN2NmZiwgKEZJWFBfREJMKTB4MGQ2NmEwMDksCisgICAgKEZJWFBfREJMKTB4MGQ2ZGIxOTcsIChGSVhQX0RCTCkweDBkNzRiMWZkLCAoRklYUF9EQkwpMHgwZDdiYTE5MCwKKyAgICAoRklYUF9EQkwpMHgwZDgyODA5ZCwgKEZJWFBfREJMKTB4MGQ4OTRmNzUsIChGSVhQX0RCTCkweDBkOTAwZTYxLAorICAgIChGSVhQX0RCTCkweDBkOTZiZGFkLCAoRklYUF9EQkwpMHgwZDlkNWRhMCwgKEZJWFBfREJMKTB4MGRhM2VlN2YsCisgICAgKEZJWFBfREJMKTB4MGRhYTcwOGYsIChGSVhQX0RCTCkweDBkYjBlNDEyLCAoRklYUF9EQkwpMHgwZGI3NDk0OSwKKyAgICAoRklYUF9EQkwpMHgwZGJkYTA3MiwgKEZJWFBfREJMKTB4MGRjM2U5Y2EsIChGSVhQX0RCTCkweDBkY2EyNThlfTsKIAotICAgIExOS19TRUNUSU9OX0NPTlNUREFUQV9MMQotICAgIHN0YXRpYyBjb25zdCBGSVhQX0RCTCBsZEludENvZWZmW10gPSB7Ci0gICAgICAoRklYUF9EQkwpMHg4MDAwMDAwMSwgKEZJWFBfREJMKTB4MDAwMDAwMDAsIChGSVhQX0RCTCkweDAyMDAwMDAwLCAoRklYUF9EQkwpMHgwMzJiODAzNCwgKEZJWFBfREJMKTB4MDQwMDAwMDAsIChGSVhQX0RCTCkweDA0YTRkM2MyLCAoRklYUF9EQkwpMHgwNTJiODAzNCwgKEZJWFBfREJMKTB4MDU5ZDVkYTAsCi0gICAgICAoRklYUF9EQkwpMHgwNjAwMDAwMCwgKEZJWFBfREJMKTB4MDY1NzAwNjksIChGSVhQX0RCTCkweDA2YTRkM2MyLCAoRklYUF9EQkwpMHgwNmViM2E5ZiwgKEZJWFBfREJMKTB4MDcyYjgwMzQsIChGSVhQX0RCTCkweDA3NjZhMDA5LCAoRklYUF9EQkwpMHgwNzlkNWRhMCwgKEZJWFBfREJMKTB4MDdkMDUzZjcsCi0gICAgICAoRklYUF9EQkwpMHgwODAwMDAwMCwgKEZJWFBfREJMKTB4MDgyY2M3ZWUsIChGSVhQX0RCTCkweDA4NTcwMDY5LCAoRklYUF9EQkwpMHgwODdlZjA1YiwgKEZJWFBfREJMKTB4MDhhNGQzYzIsIChGSVhQX0RCTCkweDA4YzhkZGQ0LCAoRklYUF9EQkwpMHgwOGViM2E5ZiwgKEZJWFBfREJMKTB4MDkwYzEwNTAsCi0gICAgICAoRklYUF9EQkwpMHgwOTJiODAzNCwgKEZJWFBfREJMKTB4MDk0OWE3ODUsIChGSVhQX0RCTCkweDA5NjZhMDA5LCAoRklYUF9EQkwpMHgwOTgyODA5ZCwgKEZJWFBfREJMKTB4MDk5ZDVkYTAsIChGSVhQX0RCTCkweDA5Yjc0OTQ5LCAoRklYUF9EQkwpMHgwOWQwNTNmNywgKEZJWFBfREJMKTB4MDllODhjNmIsCi0gICAgICAoRklYUF9EQkwpMHgwYTAwMDAwMCwgKEZJWFBfREJMKTB4MGExNmJhZDMsIChGSVhQX0RCTCkweDBhMmNjN2VlLCAoRklYUF9EQkwpMHgwYTQyMzE2MiwgKEZJWFBfREJMKTB4MGE1NzAwNjksIChGSVhQX0RCTCkweDBhNmIzZDc5LCAoRklYUF9EQkwpMHgwYTdlZjA1YiwgKEZJWFBfREJMKTB4MGE5MjIwM2QsCi0gICAgICAoRklYUF9EQkwpMHgwYWE0ZDNjMiwgKEZJWFBfREJMKTB4MGFiNzExMGUsIChGSVhQX0RCTCkweDBhYzhkZGQ0LCAoRklYUF9EQkwpMHgwYWRhM2Y2MCwgKEZJWFBfREJMKTB4MGFlYjNhOWYsIChGSVhQX0RCTCkweDBhZmJkNDJiLCAoRklYUF9EQkwpMHgwYjBjMTA1MCwgKEZJWFBfREJMKTB4MGIxYmYzMTIsCi0gICAgICAoRklYUF9EQkwpMHgwYjJiODAzNCwgKEZJWFBfREJMKTB4MGIzYWJiNDAsIChGSVhQX0RCTCkweDBiNDlhNzg1LCAoRklYUF9EQkwpMHgwYjU4NDgyMiwgKEZJWFBfREJMKTB4MGI2NmEwMDksIChGSVhQX0RCTCkweDBiNzRiMWZkLCAoRklYUF9EQkwpMHgwYjgyODA5ZCwgKEZJWFBfREJMKTB4MGI5MDBlNjEsCi0gICAgICAoRklYUF9EQkwpMHgwYjlkNWRhMCwgKEZJWFBfREJMKTB4MGJhYTcwOGYsIChGSVhQX0RCTCkweDBiYjc0OTQ5LCAoRklYUF9EQkwpMHgwYmMzZTljYSwgKEZJWFBfREJMKTB4MGJkMDUzZjcsIChGSVhQX0RCTCkweDBiZGM4OTliLCAoRklYUF9EQkwpMHgwYmU4OGM2YiwgKEZJWFBfREJMKTB4MGJmNDVlMDksCi0gICAgICAoRklYUF9EQkwpMHgwYzAwMDAwMCwgKEZJWFBfREJMKTB4MGMwYjczY2IsIChGSVhQX0RCTCkweDBjMTZiYWQzLCAoRklYUF9EQkwpMHgwYzIxZDY3MSwgKEZJWFBfREJMKTB4MGMyY2M3ZWUsIChGSVhQX0RCTCkweDBjMzc5MDg1LCAoRklYUF9EQkwpMHgwYzQyMzE2MiwgKEZJWFBfREJMKTB4MGM0Y2FiYTgsCi0gICAgICAoRklYUF9EQkwpMHgwYzU3MDA2OSwgKEZJWFBfREJMKTB4MGM2MTMwYWYsIChGSVhQX0RCTCkweDBjNmIzZDc5LCAoRklYUF9EQkwpMHgwYzc1MjdiOSwgKEZJWFBfREJMKTB4MGM3ZWYwNWIsIChGSVhQX0RCTCkweDBjODg5ODNmLCAoRklYUF9EQkwpMHgwYzkyMjAzZCwgKEZJWFBfREJMKTB4MGM5Yjg5MjYsCi0gICAgICAoRklYUF9EQkwpMHgwY2E0ZDNjMiwgKEZJWFBfREJMKTB4MGNhZTAwZDIsIChGSVhQX0RCTCkweDBjYjcxMTBlLCAoRklYUF9EQkwpMHgwY2MwMDUyYiwgKEZJWFBfREJMKTB4MGNjOGRkZDQsIChGSVhQX0RCTCkweDBjZDE5YmIwLCAoRklYUF9EQkwpMHgwY2RhM2Y2MCwgKEZJWFBfREJMKTB4MGNlMmM5N2QsCi0gICAgICAoRklYUF9EQkwpMHgwY2ViM2E5ZiwgKEZJWFBfREJMKTB4MGNmMzkzNTUsIChGSVhQX0RCTCkweDBjZmJkNDJiLCAoRklYUF9EQkwpMHgwZDAzZmRhOSwgKEZJWFBfREJMKTB4MGQwYzEwNTAsIChGSVhQX0RCTCkweDBkMTQwY2EwLCAoRklYUF9EQkwpMHgwZDFiZjMxMiwgKEZJWFBfREJMKTB4MGQyM2M0MWQsCi0gICAgICAoRklYUF9EQkwpMHgwZDJiODAzNCwgKEZJWFBfREJMKTB4MGQzMzI3YzcsIChGSVhQX0RCTCkweDBkM2FiYjQwLCAoRklYUF9EQkwpMHgwZDQyM2IwOCwgKEZJWFBfREJMKTB4MGQ0OWE3ODUsIChGSVhQX0RCTCkweDBkNTEwMTE4LCAoRklYUF9EQkwpMHgwZDU4NDgyMiwgKEZJWFBfREJMKTB4MGQ1ZjdjZmYsCi0gICAgICAoRklYUF9EQkwpMHgwZDY2YTAwOSwgKEZJWFBfREJMKTB4MGQ2ZGIxOTcsIChGSVhQX0RCTCkweDBkNzRiMWZkLCAoRklYUF9EQkwpMHgwZDdiYTE5MCwgKEZJWFBfREJMKTB4MGQ4MjgwOWQsIChGSVhQX0RCTCkweDBkODk0Zjc1LCAoRklYUF9EQkwpMHgwZDkwMGU2MSwgKEZJWFBfREJMKTB4MGQ5NmJkYWQsCi0gICAgICAoRklYUF9EQkwpMHgwZDlkNWRhMCwgKEZJWFBfREJMKTB4MGRhM2VlN2YsIChGSVhQX0RCTCkweDBkYWE3MDhmLCAoRklYUF9EQkwpMHgwZGIwZTQxMiwgKEZJWFBfREJMKTB4MGRiNzQ5NDksIChGSVhQX0RCTCkweDBkYmRhMDcyLCAoRklYUF9EQkwpMHgwZGMzZTljYSwgKEZJWFBfREJMKTB4MGRjYTI1OGUsCi0gICAgICAoRklYUF9EQkwpMHgwZGQwNTNmNywgKEZJWFBfREJMKTB4MGRkNjc1M2UsIChGSVhQX0RCTCkweDBkZGM4OTliLCAoRklYUF9EQkwpMHgwZGUyOTE0MywgKEZJWFBfREJMKTB4MGRlODhjNmIsIChGSVhQX0RCTCkweDBkZWU3YjQ3LCAoRklYUF9EQkwpMHgwZGY0NWUwOSwgKEZJWFBfREJMKTB4MGRmYTM0ZTEsCi0gICAgICAoRklYUF9EQkwpMHgwZTAwMDAwMCwgKEZJWFBfREJMKTB4MGUwNWJmOTQsIChGSVhQX0RCTCkweDBlMGI3M2NiLCAoRklYUF9EQkwpMHgwZTExMWNkMiwgKEZJWFBfREJMKTB4MGUxNmJhZDMsIChGSVhQX0RCTCkweDBlMWM0ZGZiLCAoRklYUF9EQkwpMHgwZTIxZDY3MSwgKEZJWFBfREJMKTB4MGUyNzU0NjAsCi0gICAgICAoRklYUF9EQkwpMHgwZTJjYzdlZSwgKEZJWFBfREJMKTB4MGUzMjMxNDMsIChGSVhQX0RCTCkweDBlMzc5MDg1LCAoRklYUF9EQkwpMHgwZTNjZTVkOCwgKEZJWFBfREJMKTB4MGU0MjMxNjIsIChGSVhQX0RCTCkweDBlNDc3MzQ2LCAoRklYUF9EQkwpMHgwZTRjYWJhOCwgKEZJWFBfREJMKTB4MGU1MWRhYTgsCi0gICAgICAoRklYUF9EQkwpMHgwZTU3MDA2OSwgKEZJWFBfREJMKTB4MGU1YzFkMGIsIChGSVhQX0RCTCkweDBlNjEzMGFmLCAoRklYUF9EQkwpMHgwZTY2M2I3NCwgKEZJWFBfREJMKTB4MGU2YjNkNzksIChGSVhQX0RCTCkweDBlNzAzNmRiLCAoRklYUF9EQkwpMHgwZTc1MjdiOSwgKEZJWFBfREJMKTB4MGU3YTEwMzAsCi0gICAgICAoRklYUF9EQkwpMHgwZTdlZjA1YiwgKEZJWFBfREJMKTB4MGU4M2M4NTcsIChGSVhQX0RCTCkweDBlODg5ODNmLCAoRklYUF9EQkwpMHgwZThkNjAyZSwgKEZJWFBfREJMKTB4MGU5MjIwM2QsIChGSVhQX0RCTCkweDBlOTZkODg4LCAoRklYUF9EQkwpMHgwZTliODkyNiwgKEZJWFBfREJMKTB4MGVhMDMyMzIsCi0gICAgICAoRklYUF9EQkwpMHgwZWE0ZDNjMiwgKEZJWFBfREJMKTB4MGVhOTZkZjAsIChGSVhQX0RCTCkweDBlYWUwMGQyLCAoRklYUF9EQkwpMHgwZWIyOGM3ZiwgKEZJWFBfREJMKTB4MGViNzExMGUsIChGSVhQX0RCTCkweDBlYmI4ZTk2LCAoRklYUF9EQkwpMHgwZWMwMDUyYiwgKEZJWFBfREJMKTB4MGVjNDc0ZTQsCi0gICAgICAoRklYUF9EQkwpMHgwZWM4ZGRkNCwgKEZJWFBfREJMKTB4MGVjZDQwMTIsIChGSVhQX0RCTCkweDBlZDE5YmIwLCAoRklYUF9EQkwpMHgwZWQ1ZjBjNCwgKEZJWFBfREJMKTB4MGVkYTNmNjAsIChGSVhQX0RCTCkweDBlZGU4Nzk3LCAoRklYUF9EQkwpMHgwZWUyYzk3ZCwgKEZJWFBfREJMKTB4MGVlNzA1MjUsCi0gICAgICAoRklYUF9EQkwpMHgwZWViM2E5ZiwgKEZJWFBfREJMKTB4MGVlZjY5ZmYsIChGSVhQX0RCTCkweDBlZjM5MzU1LCAoRklYUF9EQkwpMHgwZWY3YjZiNCwgKEZJWFBfREJMKTB4MGVmYmQ0MmIsIChGSVhQX0RCTCkweDBlZmZlYmNkLCAoRklYUF9EQkwpMHgwZjAzZmRhOSwgKEZJWFBfREJMKTB4MGYwODA5Y2YsCi0gICAgICAoRklYUF9EQkwpMHgwZjBjMTA1MCwgKEZJWFBfREJMKTB4MGYxMDExM2IsIChGSVhQX0RCTCkweDBmMTQwY2EwLCAoRklYUF9EQkwpMHgwZjE4MDI4ZCwgKEZJWFBfREJMKTB4MGYxYmYzMTIsIChGSVhQX0RCTCkweDBmMWZkZTNkLCAoRklYUF9EQkwpMHgwZjIzYzQxZCwgKEZJWFBfREJMKTB4MGYyN2E0YzAsCi0gICAgICAoRklYUF9EQkwpMHgwZjJiODAzNAotICAgIH07CisjZWxpZiAoTERfSU5UX1RBQl9MRU4gPD0gMTkzKQorTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbGRJbnRDb2VmZltdID0geworICAgIChGSVhQX0RCTCkweDgwMDAwMDAxLCAoRklYUF9EQkwpMHgwMDAwMDAwMCwgKEZJWFBfREJMKTB4MDIwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4MDMyYjgwMzQsIChGSVhQX0RCTCkweDA0MDAwMDAwLCAoRklYUF9EQkwpMHgwNGE0ZDNjMiwKKyAgICAoRklYUF9EQkwpMHgwNTJiODAzNCwgKEZJWFBfREJMKTB4MDU5ZDVkYTAsIChGSVhQX0RCTCkweDA2MDAwMDAwLAorICAgIChGSVhQX0RCTCkweDA2NTcwMDY5LCAoRklYUF9EQkwpMHgwNmE0ZDNjMiwgKEZJWFBfREJMKTB4MDZlYjNhOWYsCisgICAgKEZJWFBfREJMKTB4MDcyYjgwMzQsIChGSVhQX0RCTCkweDA3NjZhMDA5LCAoRklYUF9EQkwpMHgwNzlkNWRhMCwKKyAgICAoRklYUF9EQkwpMHgwN2QwNTNmNywgKEZJWFBfREJMKTB4MDgwMDAwMDAsIChGSVhQX0RCTCkweDA4MmNjN2VlLAorICAgIChGSVhQX0RCTCkweDA4NTcwMDY5LCAoRklYUF9EQkwpMHgwODdlZjA1YiwgKEZJWFBfREJMKTB4MDhhNGQzYzIsCisgICAgKEZJWFBfREJMKTB4MDhjOGRkZDQsIChGSVhQX0RCTCkweDA4ZWIzYTlmLCAoRklYUF9EQkwpMHgwOTBjMTA1MCwKKyAgICAoRklYUF9EQkwpMHgwOTJiODAzNCwgKEZJWFBfREJMKTB4MDk0OWE3ODUsIChGSVhQX0RCTCkweDA5NjZhMDA5LAorICAgIChGSVhQX0RCTCkweDA5ODI4MDlkLCAoRklYUF9EQkwpMHgwOTlkNWRhMCwgKEZJWFBfREJMKTB4MDliNzQ5NDksCisgICAgKEZJWFBfREJMKTB4MDlkMDUzZjcsIChGSVhQX0RCTCkweDA5ZTg4YzZiLCAoRklYUF9EQkwpMHgwYTAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHgwYTE2YmFkMywgKEZJWFBfREJMKTB4MGEyY2M3ZWUsIChGSVhQX0RCTCkweDBhNDIzMTYyLAorICAgIChGSVhQX0RCTCkweDBhNTcwMDY5LCAoRklYUF9EQkwpMHgwYTZiM2Q3OSwgKEZJWFBfREJMKTB4MGE3ZWYwNWIsCisgICAgKEZJWFBfREJMKTB4MGE5MjIwM2QsIChGSVhQX0RCTCkweDBhYTRkM2MyLCAoRklYUF9EQkwpMHgwYWI3MTEwZSwKKyAgICAoRklYUF9EQkwpMHgwYWM4ZGRkNCwgKEZJWFBfREJMKTB4MGFkYTNmNjAsIChGSVhQX0RCTCkweDBhZWIzYTlmLAorICAgIChGSVhQX0RCTCkweDBhZmJkNDJiLCAoRklYUF9EQkwpMHgwYjBjMTA1MCwgKEZJWFBfREJMKTB4MGIxYmYzMTIsCisgICAgKEZJWFBfREJMKTB4MGIyYjgwMzQsIChGSVhQX0RCTCkweDBiM2FiYjQwLCAoRklYUF9EQkwpMHgwYjQ5YTc4NSwKKyAgICAoRklYUF9EQkwpMHgwYjU4NDgyMiwgKEZJWFBfREJMKTB4MGI2NmEwMDksIChGSVhQX0RCTCkweDBiNzRiMWZkLAorICAgIChGSVhQX0RCTCkweDBiODI4MDlkLCAoRklYUF9EQkwpMHgwYjkwMGU2MSwgKEZJWFBfREJMKTB4MGI5ZDVkYTAsCisgICAgKEZJWFBfREJMKTB4MGJhYTcwOGYsIChGSVhQX0RCTCkweDBiYjc0OTQ5LCAoRklYUF9EQkwpMHgwYmMzZTljYSwKKyAgICAoRklYUF9EQkwpMHgwYmQwNTNmNywgKEZJWFBfREJMKTB4MGJkYzg5OWIsIChGSVhQX0RCTCkweDBiZTg4YzZiLAorICAgIChGSVhQX0RCTCkweDBiZjQ1ZTA5LCAoRklYUF9EQkwpMHgwYzAwMDAwMCwgKEZJWFBfREJMKTB4MGMwYjczY2IsCisgICAgKEZJWFBfREJMKTB4MGMxNmJhZDMsIChGSVhQX0RCTCkweDBjMjFkNjcxLCAoRklYUF9EQkwpMHgwYzJjYzdlZSwKKyAgICAoRklYUF9EQkwpMHgwYzM3OTA4NSwgKEZJWFBfREJMKTB4MGM0MjMxNjIsIChGSVhQX0RCTCkweDBjNGNhYmE4LAorICAgIChGSVhQX0RCTCkweDBjNTcwMDY5LCAoRklYUF9EQkwpMHgwYzYxMzBhZiwgKEZJWFBfREJMKTB4MGM2YjNkNzksCisgICAgKEZJWFBfREJMKTB4MGM3NTI3YjksIChGSVhQX0RCTCkweDBjN2VmMDViLCAoRklYUF9EQkwpMHgwYzg4OTgzZiwKKyAgICAoRklYUF9EQkwpMHgwYzkyMjAzZCwgKEZJWFBfREJMKTB4MGM5Yjg5MjYsIChGSVhQX0RCTCkweDBjYTRkM2MyLAorICAgIChGSVhQX0RCTCkweDBjYWUwMGQyLCAoRklYUF9EQkwpMHgwY2I3MTEwZSwgKEZJWFBfREJMKTB4MGNjMDA1MmIsCisgICAgKEZJWFBfREJMKTB4MGNjOGRkZDQsIChGSVhQX0RCTCkweDBjZDE5YmIwLCAoRklYUF9EQkwpMHgwY2RhM2Y2MCwKKyAgICAoRklYUF9EQkwpMHgwY2UyYzk3ZCwgKEZJWFBfREJMKTB4MGNlYjNhOWYsIChGSVhQX0RCTCkweDBjZjM5MzU1LAorICAgIChGSVhQX0RCTCkweDBjZmJkNDJiLCAoRklYUF9EQkwpMHgwZDAzZmRhOSwgKEZJWFBfREJMKTB4MGQwYzEwNTAsCisgICAgKEZJWFBfREJMKTB4MGQxNDBjYTAsIChGSVhQX0RCTCkweDBkMWJmMzEyLCAoRklYUF9EQkwpMHgwZDIzYzQxZCwKKyAgICAoRklYUF9EQkwpMHgwZDJiODAzNCwgKEZJWFBfREJMKTB4MGQzMzI3YzcsIChGSVhQX0RCTCkweDBkM2FiYjQwLAorICAgIChGSVhQX0RCTCkweDBkNDIzYjA4LCAoRklYUF9EQkwpMHgwZDQ5YTc4NSwgKEZJWFBfREJMKTB4MGQ1MTAxMTgsCisgICAgKEZJWFBfREJMKTB4MGQ1ODQ4MjIsIChGSVhQX0RCTCkweDBkNWY3Y2ZmLCAoRklYUF9EQkwpMHgwZDY2YTAwOSwKKyAgICAoRklYUF9EQkwpMHgwZDZkYjE5NywgKEZJWFBfREJMKTB4MGQ3NGIxZmQsIChGSVhQX0RCTCkweDBkN2JhMTkwLAorICAgIChGSVhQX0RCTCkweDBkODI4MDlkLCAoRklYUF9EQkwpMHgwZDg5NGY3NSwgKEZJWFBfREJMKTB4MGQ5MDBlNjEsCisgICAgKEZJWFBfREJMKTB4MGQ5NmJkYWQsIChGSVhQX0RCTCkweDBkOWQ1ZGEwLCAoRklYUF9EQkwpMHgwZGEzZWU3ZiwKKyAgICAoRklYUF9EQkwpMHgwZGFhNzA4ZiwgKEZJWFBfREJMKTB4MGRiMGU0MTIsIChGSVhQX0RCTCkweDBkYjc0OTQ5LAorICAgIChGSVhQX0RCTCkweDBkYmRhMDcyLCAoRklYUF9EQkwpMHgwZGMzZTljYSwgKEZJWFBfREJMKTB4MGRjYTI1OGUsCisgICAgKEZJWFBfREJMKTB4MGRkMDUzZjcsIChGSVhQX0RCTCkweDBkZDY3NTNlLCAoRklYUF9EQkwpMHgwZGRjODk5YiwKKyAgICAoRklYUF9EQkwpMHgwZGUyOTE0MywgKEZJWFBfREJMKTB4MGRlODhjNmIsIChGSVhQX0RCTCkweDBkZWU3YjQ3LAorICAgIChGSVhQX0RCTCkweDBkZjQ1ZTA5LCAoRklYUF9EQkwpMHgwZGZhMzRlMSwgKEZJWFBfREJMKTB4MGUwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4MGUwNWJmOTQsIChGSVhQX0RCTCkweDBlMGI3M2NiLCAoRklYUF9EQkwpMHgwZTExMWNkMiwKKyAgICAoRklYUF9EQkwpMHgwZTE2YmFkMywgKEZJWFBfREJMKTB4MGUxYzRkZmIsIChGSVhQX0RCTCkweDBlMjFkNjcxLAorICAgIChGSVhQX0RCTCkweDBlMjc1NDYwLCAoRklYUF9EQkwpMHgwZTJjYzdlZSwgKEZJWFBfREJMKTB4MGUzMjMxNDMsCisgICAgKEZJWFBfREJMKTB4MGUzNzkwODUsIChGSVhQX0RCTCkweDBlM2NlNWQ4LCAoRklYUF9EQkwpMHgwZTQyMzE2MiwKKyAgICAoRklYUF9EQkwpMHgwZTQ3NzM0NiwgKEZJWFBfREJMKTB4MGU0Y2FiYTgsIChGSVhQX0RCTCkweDBlNTFkYWE4LAorICAgIChGSVhQX0RCTCkweDBlNTcwMDY5LCAoRklYUF9EQkwpMHgwZTVjMWQwYiwgKEZJWFBfREJMKTB4MGU2MTMwYWYsCisgICAgKEZJWFBfREJMKTB4MGU2NjNiNzQsIChGSVhQX0RCTCkweDBlNmIzZDc5LCAoRklYUF9EQkwpMHgwZTcwMzZkYiwKKyAgICAoRklYUF9EQkwpMHgwZTc1MjdiOSwgKEZJWFBfREJMKTB4MGU3YTEwMzAsIChGSVhQX0RCTCkweDBlN2VmMDViLAorICAgIChGSVhQX0RCTCkweDBlODNjODU3LCAoRklYUF9EQkwpMHgwZTg4OTgzZiwgKEZJWFBfREJMKTB4MGU4ZDYwMmUsCisgICAgKEZJWFBfREJMKTB4MGU5MjIwM2QsIChGSVhQX0RCTCkweDBlOTZkODg4LCAoRklYUF9EQkwpMHgwZTliODkyNiwKKyAgICAoRklYUF9EQkwpMHgwZWEwMzIzMiwgKEZJWFBfREJMKTB4MGVhNGQzYzIsIChGSVhQX0RCTCkweDBlYTk2ZGYwLAorICAgIChGSVhQX0RCTCkweDBlYWUwMGQyLCAoRklYUF9EQkwpMHgwZWIyOGM3ZiwgKEZJWFBfREJMKTB4MGViNzExMGUsCisgICAgKEZJWFBfREJMKTB4MGViYjhlOTYsIChGSVhQX0RCTCkweDBlYzAwNTJiLCAoRklYUF9EQkwpMHgwZWM0NzRlNCwKKyAgICAoRklYUF9EQkwpMHgwZWM4ZGRkNCwgKEZJWFBfREJMKTB4MGVjZDQwMTIsIChGSVhQX0RCTCkweDBlZDE5YmIwLAorICAgIChGSVhQX0RCTCkweDBlZDVmMGM0LCAoRklYUF9EQkwpMHgwZWRhM2Y2MCwgKEZJWFBfREJMKTB4MGVkZTg3OTcsCisgICAgKEZJWFBfREJMKTB4MGVlMmM5N2QsIChGSVhQX0RCTCkweDBlZTcwNTI1LCAoRklYUF9EQkwpMHgwZWViM2E5ZiwKKyAgICAoRklYUF9EQkwpMHgwZWVmNjlmZiwgKEZJWFBfREJMKTB4MGVmMzkzNTUsIChGSVhQX0RCTCkweDBlZjdiNmI0LAorICAgIChGSVhQX0RCTCkweDBlZmJkNDJiLCAoRklYUF9EQkwpMHgwZWZmZWJjZCwgKEZJWFBfREJMKTB4MGYwM2ZkYTksCisgICAgKEZJWFBfREJMKTB4MGYwODA5Y2YsIChGSVhQX0RCTCkweDBmMGMxMDUwLCAoRklYUF9EQkwpMHgwZjEwMTEzYiwKKyAgICAoRklYUF9EQkwpMHgwZjE0MGNhMCwgKEZJWFBfREJMKTB4MGYxODAyOGQsIChGSVhQX0RCTCkweDBmMWJmMzEyLAorICAgIChGSVhQX0RCTCkweDBmMWZkZTNkLCAoRklYUF9EQkwpMHgwZjIzYzQxZCwgKEZJWFBfREJMKTB4MGYyN2E0YzAsCisgICAgKEZJWFBfREJMKTB4MGYyYjgwMzR9OwogCisjZWxzZQorI2Vycm9yICJsZEludCB0YWJsZSBzaXplIHRvbyBzbWFsbCIKIAotICBMTktfU0VDVElPTl9JTklUQ09ERQotICB2b2lkIEluaXRMZEludCgpCi0gIHsKLSAgICAvKiBub3RoaW5nIHRvIGRvISBVc2UgcHJlaW5pdGlhbGl6ZWQgbG9nYXJpdGhtIHRhYmxlICovCi0gIH0KKyNlbmRpZgogCitMTktfU0VDVElPTl9JTklUQ09ERQordm9pZCBJbml0TGRJbnQoKSB7IC8qIG5vdGhpbmcgdG8gZG8hIFVzZSBwcmVpbml0aWFsaXplZCBsb2dhcml0aG0gdGFibGUgKi8KK30KIAorI2lmIChMRF9JTlRfVEFCX0xFTiAhPSAwKQogCiBMTktfU0VDVElPTl9DT0RFX0wxCi1GSVhQX0RCTCBDYWxjTGRJbnQoSU5UIGkpCi17CitGSVhQX0RCTCBDYWxjTGRJbnQoSU5UIGkpIHsKICAgLyogY2FsY3VsYXRlcyBsZChvcCkvTERfREFUQV9TQ0FMSU5HICovCi0gIC8qIG9wIGlzIGFzc3VtZWQgdG8gYmUgYW4gaW50ZWdlciB2YWx1ZSBiZXR3ZWVuIDEgYW5kIDE5MyAqLworICAvKiBvcCBpcyBhc3N1bWVkIHRvIGJlIGFuIGludGVnZXIgdmFsdWUgYmV0d2VlbiAxIGFuZCBMRF9JTlRfVEFCX0xFTiAqLwogCi0gIEZES19BU1NFUlQoKDE5Mz4wKSAmJiAoKEZJWFBfREJMKWxkSW50Q29lZmZbMF09PShGSVhQX0RCTCkweDgwMDAwMDAxKSk7IC8qIHRhYiBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQgKi8KKyAgRkRLX0FTU0VSVCgoTERfSU5UX1RBQl9MRU4gPiAwKSAmJgorICAgICAgICAgICAgICgoRklYUF9EQkwpbGRJbnRDb2VmZlswXSA9PQorICAgICAgICAgICAgICAoRklYUF9EQkwpMHg4MDAwMDAwMSkpOyAvKiB0YWIgaGFzIHRvIGJlIGluaXRpYWxpemVkICovCiAKLSAgaWYgKChpPjApJiYoaTwxOTMpKQorICBpZiAoKGkgPiAwKSAmJiAoaSA8IExEX0lOVF9UQUJfTEVOKSkKICAgICByZXR1cm4gbGRJbnRDb2VmZltpXTsKLSAgZWxzZQotICB7CisgIGVsc2UgewogICAgIHJldHVybiAoMCk7CiAgIH0KIH0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIGZ1bmN0aW9ubmFtZTogaW52U3FydE5vcm0yCi0gICAgZGVzY3JpcHRpb246ICBkZWxpdmVycyAxL3NxcnQob3ApIG5vcm1hbGl6ZWQgdG8gLjUuLi4xIGFuZCB0aGUgc2hpZnQgdmFsdWUgb2YgdGhlIE9VVFBVVAotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU1FSVF9CSVRTICAgICAgICAgICA3Ci0jZGVmaW5lIFNRUlRfVkFMVUVTICAgICAgIDEyOAotI2RlZmluZSBTUVJUX0JJVFNfTUFTSyAgIDB4N2YKLQotTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgaW52U3FydFRhYltTUVJUX1ZBTFVFU10gPSB7Ci0gIDB4NWE4Mjc5OTksIDB4NWEyODdlMDMsIDB4NTljZjhjYmIsIDB4NTk3N2EwYWIsIDB4NTkyMGI0ZGUsIDB4NThjYWM0ODAsIDB4NTg3NWNhZGUsIDB4NTgyMWMzNjQsCi0gIDB4NTdjZWE5OWMsIDB4NTc3Yzc5MmYsIDB4NTcyYjJkZGYsIDB4NTZkYWMzOGQsIDB4NTY4YjM2MzEsIDB4NTYzYzgxZGYsIDB4NTVlZWEyYzMsIDB4NTVhMTk1MjEsCi0gIDB4NTU1NTU1NTUsIDB4NTUwOWRmZDAsIDB4NTRiZjMxMWEsIDB4NTQ3NTQ1ZDAsIDB4NTQyYzFhYTMsIDB4NTNlM2FjNWEsIDB4NTM5YmY3Y2MsIDB4NTM1NGY5ZTYsCi0gIDB4NTMwZWFmYTQsIDB4NTJjOTE2MTcsIDB4NTI4NDJhNWUsIDB4NTIzZmU5YWIsIDB4NTFmYzUxM2YsIDB4NTFiOTVlNmIsIDB4NTE3NzBlOGUsIDB4NTEzNTVmMTksCi0gIDB4NTBmNDRkODgsIDB4NTBiM2Q3NjgsIDB4NTA3M2ZhNGYsIDB4NTAzNGIzZTYsIDB4NGZmNjAxZGYsIDB4NGZiN2UxZjksIDB4NGY3YTUyMDEsIDB4NGYzZDRmY2UsCi0gIDB4NGYwMGQ5NDMsIDB4NGVjNGVjNGUsIDB4NGU4OTg2ZTksIDB4NGU0ZWE3MTgsIDB4NGUxNDRhZTgsIDB4NGRkYTcwNzIsIDB4NGRhMTE1ZDksIDB4NGQ2ODM5NDgsCi0gIDB4NGQyZmQ4ZjQsIDB4NGNmN2YzMWIsIDB4NGNjMDg2MDQsIDB4NGM4OThmZmYsIDB4NGM1MzBmNjQsIDB4NGMxZDAyOTMsIDB4NGJlNzY3ZjUsIDB4NGJiMjNkZjksCi0gIDB4NGI3ZDgzMTcsIDB4NGI0OTM1Y2UsIDB4NGIxNTU0YTYsIDB4NGFlMWRlMmEsIDB4NGFhZWQwZjAsIDB4NGE3YzJiOTIsIDB4NGE0OWVjYjMsIDB4NGExODEyZmEsCi0gIDB4NDllNjlkMTYsIDB4NDliNTg5YmIsIDB4NDk4NGQ3YTQsIDB4NDk1NDg1OTEsIDB4NDkyNDkyNDksIDB4NDhmNGZjOTYsIDB4NDhjNWMzNGEsIDB4NDg5NmU1M2MsCi0gIDB4NDg2ODYxNDcsIDB4NDgzYTM2NGMsIDB4NDgwYzYzMzEsIDB4NDdkZWU2ZTAsIDB4NDdiMWMwNDksIDB4NDc4NGVlNWYsIDB4NDc1ODcwMWMsIDB4NDcyYzQ0N2MsCi0gIDB4NDcwMDZhODAsIDB4NDZkNGUxMzAsIDB4NDZhOWE3OTMsIDB4NDY3ZWJjYjksIDB4NDY1NDFmYjMsIDB4NDYyOWNmOTgsIDB4NDVmZmNiODAsIDB4NDVkNjEyODksCi0gIDB4NDVhY2EzZDUsIDB4NDU4MzdlODgsIDB4NDU1YWExY2EsIDB4NDUzMjBjYzgsIDB4NDUwOWJlYjAsIDB4NDRlMWI2YjQsIDB4NDRiOWY0MGIsIDB4NDQ5Mjc1ZWMsCi0gIDB4NDQ2YjNiOTUsIDB4NDQ0NDQ0NDQsIDB4NDQxZDhmM2IsIDB4NDNmNzFiYmUsIDB4NDNkMGU5MTcsIDB4NDNhYWY2OGUsIDB4NDM4NTQzNzMsIDB4NDM1ZmNmMTQsCi0gIDB4NDMzYTk4YzUsIDB4NDMxNTlmZGIsIDB4NDJmMGUzYWUsIDB4NDJjYzYzOTcsIDB4NDJhODFlZjUsIDB4NDI4NDE1MjcsIDB4NDI2MDQ1OGQsIDB4NDIzY2FmOGMsCi0gIDB4NDIxOTUyOGIsIDB4NDFmNjJkZjEsIDB4NDFkMzQxMmEsIDB4NDFiMDhiYTEsIDB4NDE4ZTBjYzcsIDB4NDE2YmM0MGQsIDB4NDE0OWIwZTQsIDB4NDEyN2QyYzMsCi0gIDB4NDEwNjI5MjAsIDB4NDBlNGIzNzQsIDB4NDBjMzcxM2EsIDB4NDBhMjYxZWYsIDB4NDA4MTg1MTEsIDB4NDA2MGRhMjEsIDB4NDA0MDYwYTEsIDB4NDAyMDE4MTQKLX07Ci0KLUxOS19TRUNUSU9OX0lOSVRDT0RFCi12b2lkIEluaXRJbnZTcXJ0VGFiKCkKLXsKLSAgLyogbm90aGluZyB0byBkbyAhCi0gICAgIHVzZSBwcmVpbml0aWFsaXplZCBzcXVhcmUgcm9vdCB0YWJsZQotICAqLwotfQotCi0KLQotI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ludlNxcnROb3JtMikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBkZWxpdmVycyAxL3NxcnQob3ApIG5vcm1hbGl6ZWQgdG8gLjUuLi4xIGFuZCB0aGUgc2hpZnQgdmFsdWUgb2YgdGhlIE9VVFBVVCwKLSAgaS5lLiB0aGUgZGVub3JtYWxpemVkIHJlc3VsdCBpcyAxL3NxcnQob3ApID0gaW52U3FydE5vcm0ob3ApICogMl4oc2hpZnQpCi0gIHVzZXMgTmV3dG9uLWl0ZXJhdGlvbiBmb3IgYXBwcm94aW1hdGlvbgotICAgICAgUShuKzEpID0gUShuKSArIFEobikgKiAoMC41IC0gMiAqIFYgKiBRKG4pXjIpCi0gICAgICB3aXRoIFEgPSAwLjUqIFYgXi0wLjU7IDAuNSA8PSBWIDwgMS4wCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUZJWFBfREJMIGludlNxcnROb3JtMihGSVhQX0RCTCBvcCwgSU5UICpzaGlmdCkKLXsKLQotICBGSVhQX0RCTCB2YWwgPSBvcCA7Ci0gIEZJWFBfREJMIHJlZzEsIHJlZzIsIHJlZ3RtcCA7Ci0KLSAgaWYgKHZhbCA9PSBGTDJGWENPTlNUX0RCTCgwLjApKSB7Ci0gICAgKnNoaWZ0ID0gMSA7Ci0gICAgcmV0dXJuKChMT05HKTEpOyAgLyogbWluaW11bSBwb3NpdGl2ZSB2YWx1ZSAqLwotICB9Ci0KLQotICAvKiBub3JtYWxpemUgaW5wdXQsIGNhbGN1bGF0ZSBzaGlmdCB2YWx1ZSAqLwotICBGREtfQVNTRVJUKHZhbCA+IEZMMkZYQ09OU1RfREJMKDAuMCkpOwotICAqc2hpZnQgPSBmTm9ybXoodmFsKSAtIDE7ICAvKiBDb3VudExlYWRpbmdCaXRzKCkgaXMgbm90IG5lY2Vzc2FyeSBoZXJlIHNpbmNlIHRlc3QgdmFsdWUgaXMgYWx3YXlzID4gMCAqLwotICB2YWwgPDw9KnNoaWZ0IDsgIC8qIG5vcm1hbGl6ZWQgaW5wdXQgViAqLwotICAqc2hpZnQrPTIgOyAgICAgIC8qIGJpYXMgZm9yIGV4cG9uZW50ICovCi0KLSAgLyogTmV3dG9uIGl0ZXJhdGlvbiBvZiAxL3NxcnQoVikgKi8KLSAgcmVnMSA9IGludlNxcnRUYWJbIChJTlQpKHZhbD4+KERGUkFDVF9CSVRTLTEtKFNRUlRfQklUUysxKSkpICYgU1FSVF9CSVRTX01BU0sgXTsKLSAgcmVnMiA9IEZMMkZYQ09OU1RfREJMKDAuMDYyNWYpOyAgIC8qIDAuNSA+PiAzICovCi0KLSAgcmVndG1wPSBmUG93MkRpdjIocmVnMSk7ICAgICAgICAgICAgICAvKiBhID0gUV4yICovCi0gIHJlZ3RtcD0gcmVnMiAtIGZNdWx0RGl2MihyZWd0bXAsIHZhbCk7ICAgICAgLyogYiA9IDAuNSAtIDIgKiBWICogUV4yICovCi0gIHJlZzEgKz0gKGZNdWx0RGl2MihyZWd0bXAsIHJlZzEpPDw0KTsgICAgICAgLyogUSA9IFEgKyBRKmIgKi8KLQotICAvKiBjYWxjdWxhdGUgdGhlIG91dHB1dCBleHBvbmVudCA9IGlucHV0IGV4cC8yICovCi0gIGlmICgqc2hpZnQgJiAweDAwMDAwMDAxKSB7IC8qIG9kZCBzaGlmdCB2YWx1ZXMgPyAqLwotICAgIHJlZzIgPSBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU0NzUyNDQwMDg0NDM2MjEwNDg0OWYpOyAvKiAxL3NxcnQoMik7ICovCi0gICAgcmVnMSA9IGZNdWx0RGl2MihyZWcxLCByZWcyKSA8PCAyOwotICB9Ci0KLSAgKnNoaWZ0ID0gKnNoaWZ0Pj4xOwotCi0gIHJldHVybihyZWcxKTsKLX0KLSNlbmRpZiAvKiAhZGVmaW5lZChGVU5DVElPTl9pbnZTcXJ0Tm9ybTIpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgZnVuY3Rpb25uYW1lOiBzcXJ0Rml4cAotICAgIGRlc2NyaXB0aW9uOiAgZGVsaXZlcnMgc3FydChvcCkKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1GSVhQX0RCTCBzcXJ0Rml4cChGSVhQX0RCTCBvcCkKLXsKLSAgSU5UIHRtcF9leHAgPSAwOwotICBGSVhQX0RCTCB0bXBfaW52ID0gaW52U3FydE5vcm0yKG9wLCAmdG1wX2V4cCk7Ci0KLSAgRkRLX0FTU0VSVCh0bXBfZXhwID4gMCkgOwotICByZXR1cm4oIChGSVhQX0RCTCkgKCBmTXVsdERpdjIoIChvcDw8KHRtcF9leHAtMSkpLCB0bXBfaW52ICkgPDwgMiApKTsKLX0KLQorI2VuZGlmIC8qIChMRF9JTlRfVEFCX0xFTiE9MCkgICovCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9zY2h1cl9kaXYpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ4NSwyODEgKzM5OSwzMDQgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK0ZJWFBfREJMIHNjaHVyX2RpdihGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbnVtLCBJTlQgY291bnQpIHsKKyAgSU5UIExfbnVtID0gKExPTkcpbnVtID4+IDE7CisgIElOVCBMX2RlbnVtID0gKExPTkcpZGVudW0gPj4gMTsKKyAgSU5UIGRpdiA9IDA7CisgIElOVCBrID0gY291bnQ7CiAKLUZJWFBfREJMIHNjaHVyX2RpdihGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbnVtLCBJTlQgY291bnQpCi17Ci0gICAgSU5UIExfbnVtICAgPSAoTE9ORyludW0+PjE7Ci0gICAgSU5UIExfZGVudW0gPSAoTE9ORylkZW51bT4+MTsKLSAgICBJTlQgZGl2ICAgICA9IDA7Ci0gICAgSU5UIGsgICAgICAgPSBjb3VudDsKKyAgRkRLX0FTU0VSVChudW0gPj0gKEZJWFBfREJMKTApOworICBGREtfQVNTRVJUKGRlbnVtID4gKEZJWFBfREJMKTApOworICBGREtfQVNTRVJUKG51bSA8PSBkZW51bSk7CiAKLSAgICBGREtfQVNTRVJUIChudW0+PShGSVhQX0RCTCkwKTsKLSAgICBGREtfQVNTRVJUIChkZW51bT4oRklYUF9EQkwpMCk7Ci0gICAgRkRLX0FTU0VSVCAobnVtIDw9IGRlbnVtKTsKLQotICAgIGlmIChMX251bSAhPSAwKQotICAgICAgICB3aGlsZSAoLS1rKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXYgICA8PD0gMTsKLSAgICAgICAgICAgIExfbnVtIDw8PSAxOwotICAgICAgICAgICAgaWYgKExfbnVtID49IExfZGVudW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTF9udW0gLT0gTF9kZW51bTsKLSAgICAgICAgICAgICAgICBkaXYrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHJldHVybiAoRklYUF9EQkwpKGRpdiA8PCAoREZSQUNUX0JJVFMgLSBjb3VudCkpOworICBpZiAoTF9udW0gIT0gMCkKKyAgICB3aGlsZSAoLS1rKSB7CisgICAgICBkaXYgPDw9IDE7CisgICAgICBMX251bSA8PD0gMTsKKyAgICAgIGlmIChMX251bSA+PSBMX2RlbnVtKSB7CisgICAgICAgIExfbnVtIC09IExfZGVudW07CisgICAgICAgIGRpdisrOworICAgICAgfQorICAgIH0KKyAgcmV0dXJuIChGSVhQX0RCTCkoZGl2IDw8IChERlJBQ1RfQklUUyAtIGNvdW50KSk7CiB9CiAKLQogI2VuZGlmIC8qICFkZWZpbmVkKEZVTkNUSU9OX3NjaHVyX2RpdikgKi8KIAotCiAjaWZuZGVmIEZVTkNUSU9OX2ZNdWx0Tm9ybQotRklYUF9EQkwgZk11bHROb3JtKEZJWFBfREJMIGYxLCBGSVhQX0RCTCBmMiwgSU5UICpyZXN1bHRfZSkKLXsKLSAgICBJTlQgICAgcHJvZHVjdCA9IDA7Ci0gICAgSU5UICAgIG5vcm1fZjEsIG5vcm1fZjI7CitGSVhQX0RCTCBmTXVsdE5vcm0oRklYUF9EQkwgZjEsIEZJWFBfREJMIGYyLCBJTlQgKnJlc3VsdF9lKSB7CisgIElOVCBwcm9kdWN0ID0gMDsKKyAgSU5UIG5vcm1fZjEsIG5vcm1fZjI7CiAKLSAgICBpZiAoICAoZjEgPT0gKEZJWFBfREJMKTApIHx8IChmMiA9PSAoRklYUF9EQkwpMCkgKSB7Ci0gICAgICAgICpyZXN1bHRfZSA9IDA7Ci0gICAgICAgIHJldHVybiAoRklYUF9EQkwpMDsKLSAgICB9Ci0gICAgbm9ybV9mMSA9IENvdW50TGVhZGluZ0JpdHMoZjEpOwotICAgIGYxID0gZjEgPDwgbm9ybV9mMTsKLSAgICBub3JtX2YyID0gQ291bnRMZWFkaW5nQml0cyhmMik7Ci0gICAgZjIgPSBmMiA8PCBub3JtX2YyOworICBpZiAoKGYxID09IChGSVhQX0RCTCkwKSB8fCAoZjIgPT0gKEZJWFBfREJMKTApKSB7CisgICAgKnJlc3VsdF9lID0gMDsKKyAgICByZXR1cm4gKEZJWFBfREJMKTA7CisgIH0KKyAgbm9ybV9mMSA9IENvdW50TGVhZGluZ0JpdHMoZjEpOworICBmMSA9IGYxIDw8IG5vcm1fZjE7CisgIG5vcm1fZjIgPSBDb3VudExlYWRpbmdCaXRzKGYyKTsKKyAgZjIgPSBmMiA8PCBub3JtX2YyOwogCisgIGlmICgoZjEgPT0gKEZJWFBfREJMKU1JTlZBTF9EQkwpICYmIChmMiA9PSAoRklYUF9EQkwpTUlOVkFMX0RCTCkpIHsKKyAgICBwcm9kdWN0ID0gLSgoRklYUF9EQkwpTUlOVkFMX0RCTCA+PiAxKTsKKyAgICAqcmVzdWx0X2UgPSAtKG5vcm1fZjEgKyBub3JtX2YyIC0gMSk7CisgIH0gZWxzZSB7CiAgICAgcHJvZHVjdCA9IGZNdWx0KGYxLCBmMik7Ci0gICAgKnJlc3VsdF9lICA9IC0gKG5vcm1fZjEgKyBub3JtX2YyKTsKKyAgICAqcmVzdWx0X2UgPSAtKG5vcm1fZjEgKyBub3JtX2YyKTsKKyAgfQogCi0gICAgcmV0dXJuIChGSVhQX0RCTClwcm9kdWN0OworICByZXR1cm4gKEZJWFBfREJMKXByb2R1Y3Q7CiB9CiAjZW5kaWYKIAogI2lmbmRlZiBGVU5DVElPTl9mRGl2Tm9ybQotRklYUF9EQkwgZkRpdk5vcm0oRklYUF9EQkwgTF9udW0sIEZJWFBfREJMIExfZGVudW0sIElOVCAqcmVzdWx0X2UpCi17Ci0gICAgRklYUF9EQkwgZGl2OwotICAgIElOVCBub3JtX251bSwgbm9ybV9kZW47CitGSVhQX0RCTCBmRGl2Tm9ybShGSVhQX0RCTCBMX251bSwgRklYUF9EQkwgTF9kZW51bSwgSU5UICpyZXN1bHRfZSkgeworICBGSVhQX0RCTCBkaXY7CisgIElOVCBub3JtX251bSwgbm9ybV9kZW47CiAKLSAgICBGREtfQVNTRVJUIChMX251bSAgID49IChGSVhQX0RCTCkwKTsKLSAgICBGREtfQVNTRVJUIChMX2RlbnVtID4gIChGSVhQX0RCTCkwKTsKKyAgRkRLX0FTU0VSVChMX251bSA+PSAoRklYUF9EQkwpMCk7CisgIEZES19BU1NFUlQoTF9kZW51bSA+IChGSVhQX0RCTCkwKTsKIAotICAgIGlmKExfbnVtID09IChGSVhQX0RCTCkwKQotICAgIHsKLSAgICAgICAgKnJlc3VsdF9lID0gMDsKLSAgICAgICAgcmV0dXJuICgoRklYUF9EQkwpMCk7Ci0gICAgfQorICBpZiAoTF9udW0gPT0gKEZJWFBfREJMKTApIHsKKyAgICAqcmVzdWx0X2UgPSAwOworICAgIHJldHVybiAoKEZJWFBfREJMKTApOworICB9CiAKLSAgICBub3JtX251bSA9IENvdW50TGVhZGluZ0JpdHMoTF9udW0pOwotICAgIExfbnVtID0gTF9udW0gPDwgbm9ybV9udW07Ci0gICAgTF9udW0gPSBMX251bSA+PiAxOwotICAgICpyZXN1bHRfZSA9IC0gbm9ybV9udW0gKyAxOworICBub3JtX251bSA9IENvdW50TGVhZGluZ0JpdHMoTF9udW0pOworICBMX251bSA9IExfbnVtIDw8IG5vcm1fbnVtOworICBMX251bSA9IExfbnVtID4+IDE7CisgICpyZXN1bHRfZSA9IC1ub3JtX251bSArIDE7CiAKLSAgICBub3JtX2RlbiA9IENvdW50TGVhZGluZ0JpdHMoTF9kZW51bSk7Ci0gICAgTF9kZW51bSA9IExfZGVudW0gPDwgbm9ybV9kZW47Ci0gICAgKnJlc3VsdF9lIC09IC0gbm9ybV9kZW47CisgIG5vcm1fZGVuID0gQ291bnRMZWFkaW5nQml0cyhMX2RlbnVtKTsKKyAgTF9kZW51bSA9IExfZGVudW0gPDwgbm9ybV9kZW47CisgICpyZXN1bHRfZSAtPSAtbm9ybV9kZW47CiAKLSAgICBkaXYgPSBzY2h1cl9kaXYoTF9udW0sIExfZGVudW0sIEZSQUNUX0JJVFMpOworICBkaXYgPSBzY2h1cl9kaXYoTF9udW0sIExfZGVudW0sIEZSQUNUX0JJVFMpOwogCi0gICAgcmV0dXJuIGRpdjsKKyAgcmV0dXJuIGRpdjsKIH0KICNlbmRpZiAvKiAhRlVOQ1RJT05fZkRpdk5vcm0gKi8KIAogI2lmbmRlZiBGVU5DVElPTl9mRGl2Tm9ybQotRklYUF9EQkwgZkRpdk5vcm0oRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSkKLXsKLSAgICBJTlQgZTsKLSAgICBGSVhQX0RCTCByZXM7CitGSVhQX0RCTCBmRGl2Tm9ybShGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tKSB7CisgIElOVCBlOworICBGSVhQX0RCTCByZXM7CiAKLSAgICBGREtfQVNTRVJUIChkZW5vbSA+PSBudW0pOworICBGREtfQVNTRVJUKGRlbm9tID49IG51bSk7CiAKLSAgICByZXMgPSBmRGl2Tm9ybShudW0sIGRlbm9tLCAmZSk7CisgIHJlcyA9IGZEaXZOb3JtKG51bSwgZGVub20sICZlKTsKIAotICAgIC8qIEF2b2lkIG92ZXJmbG93IHNpbmNlIHdlIG11c3Qgb3V0cHV0IGEgdmFsdWUgd2l0aCBleHBvbmVudCAwCi0gICAgICAgdGhlcmUgaXMgbm8gb3RoZXIgY2hvaWNlIHRoYW4gc2F0dXJhdGluZyB0byBhbG1vc3QgMS4wZiAqLwotICAgIGlmKHJlcyA9PSAoRklYUF9EQkwpKDE8PChERlJBQ1RfQklUUy0yKSkgJiYgZSA9PSAxKQotICAgIHsKLSAgICAgICAgcmVzID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlcyA9IHNjYWxlVmFsdWUocmVzLCBlKTsKLSAgICB9CisgIC8qIEF2b2lkIG92ZXJmbG93IHNpbmNlIHdlIG11c3Qgb3V0cHV0IGEgdmFsdWUgd2l0aCBleHBvbmVudCAwCisgICAgIHRoZXJlIGlzIG5vIG90aGVyIGNob2ljZSB0aGFuIHNhdHVyYXRpbmcgdG8gYWxtb3N0IDEuMGYgKi8KKyAgaWYgKHJlcyA9PSAoRklYUF9EQkwpKDEgPDwgKERGUkFDVF9CSVRTIC0gMikpICYmIGUgPT0gMSkgeworICAgIHJlcyA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICB9IGVsc2UgeworICAgIHJlcyA9IHNjYWxlVmFsdWUocmVzLCBlKTsKKyAgfQogCi0gICAgcmV0dXJuIHJlczsKKyAgcmV0dXJuIHJlczsKIH0KICNlbmRpZiAvKiAhRlVOQ1RJT05fZkRpdk5vcm0gKi8KIAotI2lmbmRlZiBGVU5DVElPTl9mRGl2Tm9ybUhpZ2hQcmVjCi1GSVhQX0RCTCBmRGl2Tm9ybUhpZ2hQcmVjKEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20sIElOVCAqcmVzdWx0X2UpCi17Ci0gICAgRklYUF9EQkwgZGl2OwotICAgIElOVCBub3JtX251bSwgbm9ybV9kZW47CisjaWZuZGVmIEZVTkNUSU9OX2ZEaXZOb3JtU2lnbmVkCitGSVhQX0RCTCBmRGl2Tm9ybVNpZ25lZChGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tKSB7CisgIElOVCBlOworICBGSVhQX0RCTCByZXM7CisgIGludCBzaWduOwogCi0gICAgRkRLX0FTU0VSVCAobnVtICAgPj0gKEZJWFBfREJMKTApOwotICAgIEZES19BU1NFUlQgKGRlbm9tID4gIChGSVhQX0RCTCkwKTsKKyAgaWYgKGRlbm9tID09IChGSVhQX0RCTCkwKSB7CisgICAgcmV0dXJuIChGSVhQX0RCTClNQVhWQUxfREJMOworICB9CiAKLSAgICBpZihudW0gPT0gKEZJWFBfREJMKTApCi0gICAgewotICAgICAgICAqcmVzdWx0X2UgPSAwOwotICAgICAgICByZXR1cm4gKChGSVhQX0RCTCkwKTsKKyAgc2lnbiA9ICgobnVtID49IChGSVhQX0RCTCkwKSAhPSAoZGVub20gPj0gKEZJWFBfREJMKTApKTsKKyAgcmVzID0gZkRpdk5vcm1TaWduZWQobnVtLCBkZW5vbSwgJmUpOworCisgIC8qIFNhdHVyYXRlIHNpbmNlIHdlIG11c3Qgb3V0cHV0IGEgdmFsdWUgd2l0aCBleHBvbmVudCAwICovCisgIGlmICgoZSA+IDApICYmIChmQWJzKHJlcykgPj0gRkwyRlhDT05TVF9EQkwoMC41KSkpIHsKKyAgICBpZiAoc2lnbikgeworICAgICAgcmVzID0gKEZJWFBfREJMKU1JTlZBTF9EQkw7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcyA9IChGSVhQX0RCTClNQVhWQUxfREJMOwogICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXMgPSBzY2FsZVZhbHVlKHJlcywgZSk7CisgIH0KIAotICAgIG5vcm1fbnVtID0gQ291bnRMZWFkaW5nQml0cyhudW0pOwotICAgIG51bSA9IG51bSA8PCBub3JtX251bTsKLSAgICBudW0gPSBudW0gPj4gMTsKLSAgICAqcmVzdWx0X2UgPSAtIG5vcm1fbnVtICsgMTsKKyAgcmV0dXJuIHJlczsKK30KK0ZJWFBfREJMIGZEaXZOb3JtU2lnbmVkKEZJWFBfREJMIExfbnVtLCBGSVhQX0RCTCBMX2RlbnVtLCBJTlQgKnJlc3VsdF9lKSB7CisgIEZJWFBfREJMIGRpdjsKKyAgSU5UIG5vcm1fbnVtLCBub3JtX2RlbjsKKyAgaW50IHNpZ247CiAKLSAgICBub3JtX2RlbiA9IENvdW50TGVhZGluZ0JpdHMoZGVub20pOwotICAgIGRlbm9tID0gZGVub20gPDwgbm9ybV9kZW47Ci0gICAgKnJlc3VsdF9lIC09ICAtIG5vcm1fZGVuOworICBzaWduID0gKChMX251bSA+PSAoRklYUF9EQkwpMCkgIT0gKExfZGVudW0gPj0gKEZJWFBfREJMKTApKTsKIAotICAgIGRpdiA9IHNjaHVyX2RpdihudW0sIGRlbm9tLCAzMSk7Ci0gICAgcmV0dXJuIGRpdjsKKyAgaWYgKExfbnVtID09IChGSVhQX0RCTCkwKSB7CisgICAgKnJlc3VsdF9lID0gMDsKKyAgICByZXR1cm4gKChGSVhQX0RCTCkwKTsKKyAgfQorICBpZiAoTF9kZW51bSA9PSAoRklYUF9EQkwpMCkgeworICAgICpyZXN1bHRfZSA9IDE0OworICAgIHJldHVybiAoKEZJWFBfREJMKU1BWFZBTF9EQkwpOworICB9CisKKyAgbm9ybV9udW0gPSBDb3VudExlYWRpbmdCaXRzKExfbnVtKTsKKyAgTF9udW0gPSBMX251bSA8PCBub3JtX251bTsKKyAgTF9udW0gPSBMX251bSA+PiAyOworICBMX251bSA9IGZBYnMoTF9udW0pOworICAqcmVzdWx0X2UgPSAtbm9ybV9udW0gKyAxOworCisgIG5vcm1fZGVuID0gQ291bnRMZWFkaW5nQml0cyhMX2RlbnVtKTsKKyAgTF9kZW51bSA9IExfZGVudW0gPDwgbm9ybV9kZW47CisgIExfZGVudW0gPSBMX2RlbnVtID4+IDE7CisgIExfZGVudW0gPSBmQWJzKExfZGVudW0pOworICAqcmVzdWx0X2UgLT0gLW5vcm1fZGVuOworCisgIGRpdiA9IHNjaHVyX2RpdihMX251bSwgTF9kZW51bSwgRlJBQ1RfQklUUyk7CisKKyAgaWYgKHNpZ24pIHsKKyAgICBkaXYgPSAtZGl2OworICB9CisKKyAgcmV0dXJuIGRpdjsKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9mRGl2Tm9ybVNpZ25lZCAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZEaXZOb3JtSGlnaFByZWMKK0ZJWFBfREJMIGZEaXZOb3JtSGlnaFByZWMoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSwgSU5UICpyZXN1bHRfZSkgeworICBGSVhQX0RCTCBkaXY7CisgIElOVCBub3JtX251bSwgbm9ybV9kZW47CisKKyAgRkRLX0FTU0VSVChudW0gPj0gKEZJWFBfREJMKTApOworICBGREtfQVNTRVJUKGRlbm9tID4gKEZJWFBfREJMKTApOworCisgIGlmIChudW0gPT0gKEZJWFBfREJMKTApIHsKKyAgICAqcmVzdWx0X2UgPSAwOworICAgIHJldHVybiAoKEZJWFBfREJMKTApOworICB9CisKKyAgbm9ybV9udW0gPSBDb3VudExlYWRpbmdCaXRzKG51bSk7CisgIG51bSA9IG51bSA8PCBub3JtX251bTsKKyAgbnVtID0gbnVtID4+IDE7CisgICpyZXN1bHRfZSA9IC1ub3JtX251bSArIDE7CisKKyAgbm9ybV9kZW4gPSBDb3VudExlYWRpbmdCaXRzKGRlbm9tKTsKKyAgZGVub20gPSBkZW5vbSA8PCBub3JtX2RlbjsKKyAgKnJlc3VsdF9lIC09IC1ub3JtX2RlbjsKKworICBkaXYgPSBzY2h1cl9kaXYobnVtLCBkZW5vbSwgMzEpOworICByZXR1cm4gZGl2OwogfQogI2VuZGlmIC8qICFGVU5DVElPTl9mRGl2Tm9ybUhpZ2hQcmVjICovCiAKLQotCi1GSVhQX0RCTCBDYWxjTG9nMihGSVhQX0RCTCBiYXNlX20sIElOVCBiYXNlX2UsIElOVCAqcmVzdWx0X2UpCi17Ci0gIHJldHVybiBmTG9nMihiYXNlX20sIGJhc2VfZSwgcmVzdWx0X2UpOwotfQotCi1GSVhQX0RCTCBmMlBvdygKLSAgICAgICAgY29uc3QgRklYUF9EQkwgZXhwX20sIGNvbnN0IElOVCBleHBfZSwKLSAgICAgICAgSU5UICpyZXN1bHRfZQotICAgICAgICApCi17CisjaWZuZGVmIEZVTkNUSU9OX2ZQb3cKK0ZJWFBfREJMIGYyUG93KGNvbnN0IEZJWFBfREJMIGV4cF9tLCBjb25zdCBJTlQgZXhwX2UsIElOVCAqcmVzdWx0X2UpIHsKICAgRklYUF9EQkwgZnJhY19wYXJ0LCByZXN1bHRfbTsKICAgSU5UIGludF9wYXJ0OwogCi0gIGlmIChleHBfZSA+IDApCi0gIHsKLSAgICAgIElOVCBleHBfYml0cyA9IERGUkFDVF9CSVRTLTEgLSBleHBfZTsKLSAgICAgIGludF9wYXJ0ID0gZXhwX20gPj4gZXhwX2JpdHM7Ci0gICAgICBmcmFjX3BhcnQgPSBleHBfbSAtIChGSVhQX0RCTCkoaW50X3BhcnQgPDwgZXhwX2JpdHMpOwotICAgICAgZnJhY19wYXJ0ID0gZnJhY19wYXJ0IDw8IGV4cF9lOwotICB9Ci0gIGVsc2UKLSAgewotICAgICAgaW50X3BhcnQgPSAwOwotICAgICAgZnJhY19wYXJ0ID0gZXhwX20gPj4gLWV4cF9lOworICBpZiAoZXhwX2UgPiAwKSB7CisgICAgSU5UIGV4cF9iaXRzID0gREZSQUNUX0JJVFMgLSAxIC0gZXhwX2U7CisgICAgaW50X3BhcnQgPSBleHBfbSA+PiBleHBfYml0czsKKyAgICBmcmFjX3BhcnQgPSBleHBfbSAtIChGSVhQX0RCTCkoaW50X3BhcnQgPDwgZXhwX2JpdHMpOworICAgIGZyYWNfcGFydCA9IGZyYWNfcGFydCA8PCBleHBfZTsKKyAgfSBlbHNlIHsKKyAgICBpbnRfcGFydCA9IDA7CisgICAgZnJhY19wYXJ0ID0gZXhwX20gPj4gLWV4cF9lOwogICB9CiAKICAgLyogQmVzdCBhY2N1cmFjeSBpcyBhcm91bmQgMCwgc28gdHJ5IHRvIGdldCB0aGVyZSB3aXRoIHRoZSBmcmFjdGlvbmFsIHBhcnQuICovCi0gIGlmKCBmcmFjX3BhcnQgPiBGTDJGWENPTlNUX0RCTCgwLjVmKSApCi0gIHsKLSAgICAgIGludF9wYXJ0ID0gaW50X3BhcnQgKyAxOwotICAgICAgZnJhY19wYXJ0ID0gZnJhY19wYXJ0ICsgRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICBpZiAoZnJhY19wYXJ0ID4gRkwyRlhDT05TVF9EQkwoMC41ZikpIHsKKyAgICBpbnRfcGFydCA9IGludF9wYXJ0ICsgMTsKKyAgICBmcmFjX3BhcnQgPSBmcmFjX3BhcnQgKyBGTDJGWENPTlNUX0RCTCgtMS4wZik7CiAgIH0KLSAgaWYoIGZyYWNfcGFydCA8IEZMMkZYQ09OU1RfREJMKC0wLjVmKSApCi0gIHsKLSAgICAgIGludF9wYXJ0ID0gaW50X3BhcnQgLSAxOwotICAgICAgZnJhY19wYXJ0ID0gLShGTDJGWENPTlNUX0RCTCgtMS4wZikgLSBmcmFjX3BhcnQpOworICBpZiAoZnJhY19wYXJ0IDwgRkwyRlhDT05TVF9EQkwoLTAuNWYpKSB7CisgICAgaW50X3BhcnQgPSBpbnRfcGFydCAtIDE7CisgICAgZnJhY19wYXJ0ID0gLShGTDJGWENPTlNUX0RCTCgtMS4wZikgLSBmcmFjX3BhcnQpOwogICB9CiAKKyAgLyogIisgMSIgY29tcGVuc2F0ZXMgZk11bHRBZGREaXYyKCkgb2YgdGhlIHBvbHlub21pYWwgZXZhbHVhdGlvbiBiZWxvdy4gKi8KKyAgKnJlc3VsdF9lID0gaW50X3BhcnQgKyAxOworCiAgIC8qIEV2YWx1YXRlIHRheWxvciBwb2x5bm9taWFsIHdoaWNoIGFwcHJveGltYXRlcyAyXnggKi8KICAgewogICAgIEZJWFBfREJMIHA7CiAKICAgICAvKiByZXN1bHRfbSB+PSAyXmZyYWNfcGFydCAqLwogICAgIHAgPSBmcmFjX3BhcnQ7Ci0gICAgLyogRmlyc3QgdGF5bG9yIHNlcmllcyBjb2VmZmljaWVudCBhXzAgPSAxLjAsIHNjYWxlZCBieSAwLjUgZHVlIHRvIGZNdWx0RGl2MigpLiAqLwotICAgIHJlc3VsdF9tID0gRkwyRlhDT05TVF9EQkwoMS4wZi8yLjBmKTsKKyAgICAvKiBGaXJzdCB0YXlsb3Igc2VyaWVzIGNvZWZmaWNpZW50IGFfMCA9IDEuMCwgc2NhbGVkIGJ5IDAuNSBkdWUgdG8KKyAgICAgKiBmTXVsdERpdjIoKS4gKi8KKyAgICByZXN1bHRfbSA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAyLjBmKTsKICAgICBmb3IgKElOVCBpID0gMDsgaSA8IFBPVzJfUFJFQ0lTSU9OOyBpKyspIHsKICAgICAgIC8qIG5leHQgdGF5bG9yIHNlcmllcyB0ZXJtOiBhX2kgKiB4XmksIHg9MCAqLwogICAgICAgcmVzdWx0X20gPSBmTXVsdEFkZERpdjIocmVzdWx0X20sIHBvdzJDb2VmZltpXSwgcCk7Ci0gICAgICBwICA9IGZNdWx0KHAsIGZyYWNfcGFydCk7CisgICAgICBwID0gZk11bHQocCwgZnJhY19wYXJ0KTsKICAgICB9CiAgIH0KLQotICAvKiAiKyAxIiBjb21wZW5zYXRlcyBmTXVsdEFkZERpdjIoKSBvZiB0aGUgcG9seW5vbWlhbCBldmFsdWF0aW9uIGFib3ZlLiAqLwotICAqcmVzdWx0X2UgPSBpbnRfcGFydCArIDE7Ci0KICAgcmV0dXJuIHJlc3VsdF9tOwogfQogCi1GSVhQX0RCTCBmMlBvdygKLSAgICAgICAgY29uc3QgRklYUF9EQkwgZXhwX20sIGNvbnN0IElOVCBleHBfZQotICAgICAgICApCi17CitGSVhQX0RCTCBmMlBvdyhjb25zdCBGSVhQX0RCTCBleHBfbSwgY29uc3QgSU5UIGV4cF9lKSB7CiAgIEZJWFBfREJMIHJlc3VsdF9tOwogICBJTlQgcmVzdWx0X2U7CiAKICAgcmVzdWx0X20gPSBmMlBvdyhleHBfbSwgZXhwX2UsICZyZXN1bHRfZSk7Ci0gIHJlc3VsdF9lID0gZml4TWluKERGUkFDVF9CSVRTLTEsZml4TWF4KC0oREZSQUNUX0JJVFMtMSkscmVzdWx0X2UpKTsKKyAgcmVzdWx0X2UgPSBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCBmaXhNYXgoLShERlJBQ1RfQklUUyAtIDEpLCByZXN1bHRfZSkpOwogCiAgIHJldHVybiBzY2FsZVZhbHVlKHJlc3VsdF9tLCByZXN1bHRfZSk7CiB9CiAKLUZJWFBfREJMIGZQb3coCi0gICAgICAgIEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwKLSAgICAgICAgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSwKLSAgICAgICAgSU5UICpyZXN1bHRfZQotICAgICAgICApCi17Ci0gICAgSU5UIGFuc19sZzJfZSwgYmFzZWxnMl9lOwotICAgIEZJWFBfREJMIGJhc2VfbGcyLCBhbnNfbGcyLCByZXN1bHQ7CitGSVhQX0RCTCBmUG93KEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSwKKyAgICAgICAgICAgICAgSU5UICpyZXN1bHRfZSkgeworICBJTlQgYW5zX2xnMl9lLCBiYXNlbGcyX2U7CisgIEZJWFBfREJMIGJhc2VfbGcyLCBhbnNfbGcyLCByZXN1bHQ7CiAKLSAgICAvKiBDYWxjIGxvZzIgb2YgYmFzZSAqLwotICAgIGJhc2VfbGcyID0gZkxvZzIoYmFzZV9tLCBiYXNlX2UsICZiYXNlbGcyX2UpOworICAvKiBDYWxjIGxvZzIgb2YgYmFzZSAqLworICBiYXNlX2xnMiA9IGZMb2cyKGJhc2VfbSwgYmFzZV9lLCAmYmFzZWxnMl9lKTsKIAotICAgIC8qIFByZXBhcmUgZXhwICovCi0gICAgewotICAgICAgSU5UIGxlYWRpbmdCaXRzOworICAvKiBQcmVwYXJlIGV4cCAqLworICB7CisgICAgSU5UIGxlYWRpbmdCaXRzOwogCi0gICAgICBsZWFkaW5nQml0cyA9IENvdW50TGVhZGluZ0JpdHMoZkFicyhleHBfbSkpOwotICAgICAgZXhwX20gPSBleHBfbSA8PCBsZWFkaW5nQml0czsKLSAgICAgIGV4cF9lIC09IGxlYWRpbmdCaXRzOwotICAgIH0KKyAgICBsZWFkaW5nQml0cyA9IENvdW50TGVhZGluZ0JpdHMoZkFicyhleHBfbSkpOworICAgIGV4cF9tID0gZXhwX20gPDwgbGVhZGluZ0JpdHM7CisgICAgZXhwX2UgLT0gbGVhZGluZ0JpdHM7CisgIH0KIAotICAgIC8qIENhbGMgYmFzZSBwb3cgZXhwICovCi0gICAgYW5zX2xnMiA9IGZNdWx0KGJhc2VfbGcyLCBleHBfbSk7Ci0gICAgYW5zX2xnMl9lID0gZXhwX2UgKyBiYXNlbGcyX2U7CisgIC8qIENhbGMgYmFzZSBwb3cgZXhwICovCisgIGFuc19sZzIgPSBmTXVsdChiYXNlX2xnMiwgZXhwX20pOworICBhbnNfbGcyX2UgPSBleHBfZSArIGJhc2VsZzJfZTsKIAotICAgIC8qIENhbGMgYW50aWxvZyAqLwotICAgIHJlc3VsdCA9IGYyUG93KGFuc19sZzIsIGFuc19sZzJfZSwgcmVzdWx0X2UpOworICAvKiBDYWxjIGFudGlsb2cgKi8KKyAgcmVzdWx0ID0gZjJQb3coYW5zX2xnMiwgYW5zX2xnMl9lLCByZXN1bHRfZSk7CiAKLSAgICByZXR1cm4gcmVzdWx0OworICByZXR1cm4gcmVzdWx0OwogfQogCi1GSVhQX0RCTCBmTGRQb3coCi0gICAgICAgIEZJWFBfREJMIGJhc2VMZF9tLAotICAgICAgICBJTlQgYmFzZUxkX2UsCi0gICAgICAgIEZJWFBfREJMIGV4cF9tLCBJTlQgZXhwX2UsCi0gICAgICAgIElOVCAqcmVzdWx0X2UKLSAgICAgICAgKQotewotICAgIElOVCBhbnNfbGcyX2U7Ci0gICAgRklYUF9EQkwgYW5zX2xnMiwgcmVzdWx0OworRklYUF9EQkwgZkxkUG93KEZJWFBfREJMIGJhc2VMZF9tLCBJTlQgYmFzZUxkX2UsIEZJWFBfREJMIGV4cF9tLCBJTlQgZXhwX2UsCisgICAgICAgICAgICAgICAgSU5UICpyZXN1bHRfZSkgeworICBJTlQgYW5zX2xnMl9lOworICBGSVhQX0RCTCBhbnNfbGcyLCByZXN1bHQ7CiAKLSAgICAvKiBQcmVwYXJlIGV4cCAqLwotICAgIHsKLSAgICAgIElOVCBsZWFkaW5nQml0czsKKyAgLyogUHJlcGFyZSBleHAgKi8KKyAgeworICAgIElOVCBsZWFkaW5nQml0czsKIAotICAgICAgbGVhZGluZ0JpdHMgPSBDb3VudExlYWRpbmdCaXRzKGZBYnMoZXhwX20pKTsKLSAgICAgIGV4cF9tID0gZXhwX20gPDwgbGVhZGluZ0JpdHM7Ci0gICAgICBleHBfZSAtPSBsZWFkaW5nQml0czsKLSAgICB9CisgICAgbGVhZGluZ0JpdHMgPSBDb3VudExlYWRpbmdCaXRzKGZBYnMoZXhwX20pKTsKKyAgICBleHBfbSA9IGV4cF9tIDw8IGxlYWRpbmdCaXRzOworICAgIGV4cF9lIC09IGxlYWRpbmdCaXRzOworICB9CiAKLSAgICAvKiBDYWxjIGJhc2UgcG93IGV4cCAqLwotICAgIGFuc19sZzIgPSBmTXVsdChiYXNlTGRfbSwgZXhwX20pOwotICAgIGFuc19sZzJfZSA9IGV4cF9lICsgYmFzZUxkX2U7CisgIC8qIENhbGMgYmFzZSBwb3cgZXhwICovCisgIGFuc19sZzIgPSBmTXVsdChiYXNlTGRfbSwgZXhwX20pOworICBhbnNfbGcyX2UgPSBleHBfZSArIGJhc2VMZF9lOwogCi0gICAgLyogQ2FsYyBhbnRpbG9nICovCi0gICAgcmVzdWx0ID0gZjJQb3coYW5zX2xnMiwgYW5zX2xnMl9lLCByZXN1bHRfZSk7CisgIC8qIENhbGMgYW50aWxvZyAqLworICByZXN1bHQgPSBmMlBvdyhhbnNfbGcyLCBhbnNfbGcyX2UsIHJlc3VsdF9lKTsKIAotICAgIHJldHVybiByZXN1bHQ7CisgIHJldHVybiByZXN1bHQ7CiB9CiAKLUZJWFBfREJMIGZMZFBvdygKLSAgICAgICAgRklYUF9EQkwgYmFzZUxkX20sIElOVCBiYXNlTGRfZSwKLSAgICAgICAgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZQotICAgICAgICApCi17CitGSVhQX0RCTCBmTGRQb3coRklYUF9EQkwgYmFzZUxkX20sIElOVCBiYXNlTGRfZSwgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSkgewogICBGSVhQX0RCTCByZXN1bHRfbTsKICAgaW50IHJlc3VsdF9lOwogCkBAIC03NjgsMTIgKzcwNSw3IEBACiAgIHJldHVybiBTQVRVUkFURV9TSElGVChyZXN1bHRfbSwgLXJlc3VsdF9lLCBERlJBQ1RfQklUUyk7CiB9CiAKLUZJWFBfREJMIGZQb3dJbnQoCi0gICAgICAgIEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwKLSAgICAgICAgSU5UIGV4cCwKLSAgICAgICAgSU5UICpwUmVzdWx0X2UKLSAgICAgICAgKQoteworRklYUF9EQkwgZlBvd0ludChGSVhQX0RCTCBiYXNlX20sIElOVCBiYXNlX2UsIElOVCBleHAsIElOVCAqcFJlc3VsdF9lKSB7CiAgIEZJWFBfREJMIHJlc3VsdDsKIAogICBpZiAoZXhwICE9IDApIHsKQEAgLTc4Miw3ICs3MTQsNyBAQAogICAgIGlmIChiYXNlX20gIT0gKEZJWFBfREJMKTApIHsKICAgICAgIHsKICAgICAgICAgSU5UIGxlYWRpbmdCaXRzOwotICAgICAgICBsZWFkaW5nQml0cyA9IENvdW50TGVhZGluZ0JpdHMoIGJhc2VfbSApOworICAgICAgICBsZWFkaW5nQml0cyA9IENvdW50TGVhZGluZ0JpdHMoYmFzZV9tKTsKICAgICAgICAgYmFzZV9tIDw8PSBsZWFkaW5nQml0czsKICAgICAgICAgYmFzZV9lIC09IGxlYWRpbmdCaXRzOwogICAgICAgfQpAQCAtNzk4LDEwICs3MzAsMTAgQEAKIAogICAgICAgaWYgKGV4cCA8IDApIHsKICAgICAgICAgLyogMS4wIC8gYW5zICovCi0gICAgICAgIHJlc3VsdCA9IGZEaXZOb3JtKCBGTDJGWENPTlNUX0RCTCgwLjVmKSwgcmVzdWx0LCAmcmVzdWx0X2UgKTsKKyAgICAgICAgcmVzdWx0ID0gZkRpdk5vcm0oRkwyRlhDT05TVF9EQkwoMC41ZiksIHJlc3VsdCwgJnJlc3VsdF9lKTsKICAgICAgICAgcmVzdWx0X2UrKzsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBhbnNTY2FsZSA9IENvdW50TGVhZGluZ0JpdHMoIHJlc3VsdCApOworICAgICAgICBpbnQgYW5zU2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKHJlc3VsdCk7CiAgICAgICAgIHJlc3VsdCA8PD0gYW5zU2NhbGU7CiAgICAgICAgIHJlc3VsdF9lIC09IGFuc1NjYWxlOwogICAgICAgfQpAQCAtODEyLDg0ICs3NDQsMTU3IEBACiAgICAgICByZXN1bHQgPSAoRklYUF9EQkwpMDsKICAgICB9CiAgICAgKnBSZXN1bHRfZSA9IHJlc3VsdF9lOwotICB9Ci0gIGVsc2UgewotICAgIHJlc3VsdCA9ICBGTDJGWENPTlNUX0RCTCgwLjVmKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKICAgICAqcFJlc3VsdF9lID0gMTsKICAgfQogCiAgIHJldHVybiByZXN1bHQ7CiB9CisjZW5kaWYgLyogRlVOQ1RJT05fZlBvdyAqLwogCi1GSVhQX0RCTCBmTG9nMihGSVhQX0RCTCB4X20sIElOVCB4X2UsIElOVCAqcmVzdWx0X2UpCi17Ci0gIEZJWFBfREJMIHJlc3VsdF9tOworI2lmbmRlZiBGVU5DVElPTl9mTG9nMgorRklYUF9EQkwgQ2FsY0xvZzIoRklYUF9EQkwgYmFzZV9tLCBJTlQgYmFzZV9lLCBJTlQgKnJlc3VsdF9lKSB7CisgIHJldHVybiBmTG9nMihiYXNlX20sIGJhc2VfZSwgcmVzdWx0X2UpOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZMb2cyICovCiAKLSAgLyogU2hvcnQgY3V0IGZvciB6ZXJvIGFuZCBuZWdhdGl2ZSBudW1iZXJzLiAqLwotICBpZiAoIHhfbSA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKLSAgICAqcmVzdWx0X2UgPSBERlJBQ1RfQklUUy0xOwotICAgIHJldHVybiBGTDJGWENPTlNUX0RCTCgtMS4wZik7Ci0gIH0KLQotICAvKiBDYWxjdWxhdGUgbG9nMigpICovCi0gIHsKLSAgICBGSVhQX0RCTCBweDJfbSwgeDJfbTsKLQotICAgIC8qIE1vdmUgaW5wdXQgdmFsdWUgeF9tICogMl54X2UgdG93YXJkIDEuMCwgd2hlcmUgdGhlIHRheWxvciBhcHByb3hpbWF0aW9uCi0gICAgICAgb2YgdGhlIGZ1bmN0aW9uIGxvZygxLXgpIGNlbnRlcmVkIGF0IDAgaXMgbW9zdCBhY2N1cmF0ZS4gKi8KLSAgICB7Ci0gICAgICBJTlQgYl9ub3JtOwotCi0gICAgICBiX25vcm0gPSBmTm9ybXooeF9tKS0xOwotICAgICAgeDJfbSA9IHhfbSA8PCBiX25vcm07Ci0gICAgICB4X2UgPSB4X2UgLSBiX25vcm07Ci0gICAgfQotCi0gICAgLyogbWFwIHggZnJvbSBsb2coeCkgZG9tYWluIHRvIGxvZygxLXgpIGRvbWFpbi4gKi8KLSAgICB4Ml9tID0gLSAoeDJfbSArIEZMMkZYQ09OU1RfREJMKC0xLjApICk7Ci0KLSAgICAvKiBUYXlsb3IgcG9saW5vbWlhbCBhcHByb3hpbWF0aW9uIG9mIGxuKDEteCkgKi8KLSAgICByZXN1bHRfbSAgPSBGTDJGWENPTlNUX0RCTCgwLjApOwotICAgIHB4Ml9tID0geDJfbTsKLSAgICBmb3IgKGludCBpPTA7IGk8TERfUFJFQ0lTSU9OOyBpKyspIHsKLSAgICAgIHJlc3VsdF9tID0gZk11bHRBZGREaXYyKHJlc3VsdF9tLCBsZENvZWZmW2ldLCBweDJfbSk7Ci0gICAgICBweDJfbSA9IGZNdWx0KHB4Ml9tLCB4Ml9tKTsKLSAgICB9Ci0gICAgLyogTXVsdGlwbHkgcmVzdWx0IHdpdGggMS9sbigyKSA9IDEuMCArIDAuNDQyNjk1MDQwODg4IChnZXQgbG9nMih4KSBmcm9tIGxuKHgpIHJlc3VsdCkuICovCi0gICAgcmVzdWx0X20gPSBmTXVsdEFkZERpdjIocmVzdWx0X20sIHJlc3VsdF9tLCBGTDJGWENPTlNUX0RCTCgyLjAqMC40NDI2OTUwNDA4ODg5NjM0MDczNTk5MjQ2ODEwMDE5KSk7Ci0KLSAgICAvKiBBZGQgZXhwb25lbnQgcGFydC4gbG9nMih4X20gKiAyXnhfZSkgPSBsb2cyKHhfbSkgKyB4X2UgKi8KLSAgICBpZiAoeF9lICE9IDApCi0gICAgewotICAgICAgaW50IGVub3JtOwotCi0gICAgICBlbm9ybSA9IERGUkFDVF9CSVRTIC0gZk5vcm0oKEZJWFBfREJMKXhfZSk7Ci0gICAgICAvKiBUaGUgLTEgaW4gdGhlIHJpZ2h0IHNoaWZ0IG9mIHJlc3VsdF9tIGNvbXBlbnNhdGVzIHRoZSBmTXVsdERpdjIoKSBhYm92ZSBpbiB0aGUgdGF5bG9yIHBvbGlub21pYWwgZXZhbHVhdGlvbiBsb29wLiovCi0gICAgICByZXN1bHRfbSA9IChyZXN1bHRfbSA+PiAoZW5vcm0tMSkpICsgKChGSVhQX0RCTCl4X2UgPDwgKERGUkFDVF9CSVRTLTEtZW5vcm0pKTsKLQotICAgICAgKnJlc3VsdF9lID0gZW5vcm07Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIDEgY29tcGVuc2F0ZXMgdGhlIGZNdWx0RGl2MigpIGFib3ZlIGluIHRoZSB0YXlsb3IgcG9saW5vbWlhbCBldmFsdWF0aW9uIGxvb3AuKi8KLSAgICAgICpyZXN1bHRfZSA9IDE7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdF9tOworSU5UIGZpeHBfZmxvb3JUb0ludChGSVhQX0RCTCBmX2lucCwgSU5UIHNmKSB7CisgIEZES19BU1NFUlQoc2YgPj0gMCk7CisgIElOVCBmbG9vckludCA9IChJTlQpKGZfaW5wID4+ICgoREZSQUNUX0JJVFMgLSAxKSAtIHNmKSk7CisgIHJldHVybiBmbG9vckludDsKIH0KIAotRklYUF9EQkwgZkxvZzIoRklYUF9EQkwgeF9tLCBJTlQgeF9lKQotewotICBpZiAoIHhfbSA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKLSAgICB4X20gPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgSU5UIHJlc3VsdF9lOwotICAgIHhfbSA9IGZMb2cyKHhfbSwgeF9lLCAmcmVzdWx0X2UpOwotICAgIHhfbSA9IHNjYWxlVmFsdWUoeF9tLCByZXN1bHRfZS1MRF9EQVRBX1NISUZUKTsKLSAgfQotICByZXR1cm4gIHhfbTsKK0ZJWFBfREJMIGZpeHBfZmxvb3IoRklYUF9EQkwgZl9pbnAsIElOVCBzZikgeworICBGREtfQVNTRVJUKHNmID49IDApOworICBJTlQgZmxvb3JJbnQgPSBmaXhwX2Zsb29yVG9JbnQoZl9pbnAsIHNmKTsKKyAgRklYUF9EQkwgZl9mbG9vciA9IChGSVhQX0RCTCkoZmxvb3JJbnQgPDwgKChERlJBQ1RfQklUUyAtIDEpIC0gc2YpKTsKKyAgcmV0dXJuIGZfZmxvb3I7CiB9CiAKK0lOVCBmaXhwX2NlaWxUb0ludChGSVhQX0RCTCBmX2lucCwgSU5UIHNmKSAgLy8gc2YgIG1hbnRpc3NhQml0cyBsZWZ0IG9mIGRvdAoreworICBGREtfQVNTRVJUKHNmID49IDApOworICBJTlQgc3ggPSAoREZSQUNUX0JJVFMgLSAxKSAtIHNmOyAgLy8gc3ggIG1hbnRpc3NhQml0cyByaWdodCBvZiBkb3QKKyAgSU5UIGlucElOVCA9IChJTlQpZl9pbnA7CiAKKyAgSU5UIG1hc2sgPSAoMHgxIDw8IHN4KSAtIDE7CisgIElOVCBjZWlsSW50ID0gKElOVCkoZl9pbnAgPj4gc3gpOwogCisgIGlmIChpbnBJTlQgJiBtYXNrKSB7CisgICAgY2VpbEludCsrOyAgLy8gaW5jcmVtZW50IG9ubHksIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBzZXQgbWFudGlzc2FCaXQKKyAgICAgICAgICAgICAgICAvLyByaWdodCBvZiBkb3QgW2luIGlucElOVF0KKyAgfQogCisgIHJldHVybiBjZWlsSW50OworfQorCitGSVhQX0RCTCBmaXhwX2NlaWwoRklYUF9EQkwgZl9pbnAsIElOVCBzZikgeworICBGREtfQVNTRVJUKHNmID49IDApOworICBJTlQgc3ggPSAoREZSQUNUX0JJVFMgLSAxKSAtIHNmOworICBJTlQgY2VpbEludCA9IGZpeHBfY2VpbFRvSW50KGZfaW5wLCBzZik7CisgIFVMT05HIG1hc2sgPSAoVUxPTkcpMHgxIDw8IChERlJBQ1RfQklUUyAtIDEpOyAgLy8gMHg4MDAwMDAwMAorICBjZWlsSW50ID0gY2VpbEludAorICAgICAgICAgICAgPDwgc3g7ICAvLyBubyBmcmFjdCB3YXJuIGJlYy4gc2hpZnQgaW50byBzYXR1cmF0aW9uIGRvbmUgb24gaW50IHNpZGUKKworICBpZiAoKGZfaW5wID4gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChjZWlsSW50ICYgbWFzaykpIHsKKyAgICAtLWNlaWxJbnQ7CisgIH0KKyAgRklYUF9EQkwgZl9jZWlsID0gKEZJWFBfREJMKWNlaWxJbnQ7CisKKyAgcmV0dXJuIGZfY2VpbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBmaXhwX3RydW5jYXRlVG9JbnQoKQorICAgICBKdXN0IHJlbW92ZSB0aGUgZnJhY3Rpb25hbCBwYXJ0IHdoaWNoIGlzIGxvY2F0ZWQgcmlnaHQgb2YgZGVjaW1hbCBwb2ludAorICAgICBTYW1lIGFzIHdoaWNoIGlzIGRvbmUgd2hlbiBhIGZsb2F0IGlzIGNhc3RlZCB0byAoSU5UKSA6CisgICAgIHJlc3VsdF9JTlR0eXBlID0gKElOVCliX2Zsb2F0VHlwZUlucHV0OworCisgICByZXR1cm5zIElOVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQgZml4cF90cnVuY2F0ZVRvSW50KEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpICAvLyBzZiAgbWFudGlzc2FCaXRzIGxlZnQgIG9mIGRvdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHdpdGhvdXQgc2lnbikgIGUuZy4gYXQgd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMyIHRoaXMgd291bGQgYmUgW3NpZ25dNy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvc2VkIHNmIGVxdWFscyA4LgoreworICBGREtfQVNTRVJUKHNmID49IDApOworICBJTlQgc3ggPSAoREZSQUNUX0JJVFMgLSAxKSAtIHNmOyAgLy8gc3ggIG1hbnRpc3NhQml0cyByaWdodCBvZiBkb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHdpZHRoIDMyIHRoaXMgd291bGQgYmUgICAgICAgIC4yNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9zZWQgc2YgZXF1YWxzIDguCisgIElOVCBmYmFjY3UgPSAoSU5UKWZfaW5wOworICBJTlQgbWFzayA9ICgweDEgPDwgc3gpOworCisgIGlmICgoZmJhY2N1IDwgMCkgJiYgKGZiYWNjdSAmIChtYXNrIC0gMSkpKSB7CisgICAgZmJhY2N1ID0gZmJhY2N1ICsgbWFzazsKKyAgfQorCisgIGZiYWNjdSA9IGZiYWNjdSA+PiBzeDsKKyAgcmV0dXJuIGZiYWNjdTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBmaXhwX3RydW5jYXRlKCkKKyAgICAgSnVzdCByZW1vdmUgdGhlIGZyYWN0aW9uYWwgcGFydCB3aGljaCBpcyBsb2NhdGVkIHJpZ2h0IG9mIGRlY2ltYWwgcG9pbnQKKworICAgcmV0dXJucyBGSVhQX0RCTAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGSVhQX0RCTCBmaXhwX3RydW5jYXRlKEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpIHsKKyAgRkRLX0FTU0VSVChzZiA+PSAwKTsKKyAgSU5UIHRydW5jYXRlSW50ID0gZml4cF90cnVuY2F0ZVRvSW50KGZfaW5wLCBzZik7CisgIEZJWFBfREJMIGZfdHJ1bmNhdGUgPSAoRklYUF9EQkwpKHRydW5jYXRlSW50IDw8ICgoREZSQUNUX0JJVFMgLSAxKSAtIHNmKSk7CisgIHJldHVybiBmX3RydW5jYXRlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgZml4cF9yb3VuZFRvSW50KCkKKyAgICByb3VuZCBbdHlwaWNhbCByb3VuZGluZ10KKworICAgIFNlZSBmY3Qgcm91bmRSZWYoKSBbd2hpY2ggaXMgdGhlIHJlZmVyZW5jZV0KKyAgcmV0dXJucyBJTlQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UIGZpeHBfcm91bmRUb0ludChGSVhQX0RCTCBmX2lucCwgSU5UIHNmKSB7CisgIEZES19BU1NFUlQoc2YgPj0gMCk7CisgIElOVCBzeCA9IERGUkFDVF9CSVRTIC0gMSAtIHNmOworICBJTlQgaW5wID0gKElOVClmX2lucDsKKyAgSU5UIG1hc2sxID0gKDB4MSA8PCAoc3ggLSAxKSk7CisgIElOVCBtYXNrMiA9ICgweDEgPDwgKHN4KSkgLSAxOworICBJTlQgbWFzazMgPSAweDdGRkZGRkZGOworICBJTlQgaWFtID0gaW5wICYgbWFzazI7CisgIElOVCBybmQ7CisKKyAgaWYgKChpbnAgPCAwKSAmJiAhKGlhbSA9PSBtYXNrMSkpCisgICAgcm5kID0gaW5wICsgbWFzazE7CisgIGVsc2UgaWYgKChpbnAgPiAwKSAmJiAhKGlucCA9PSBtYXNrMykpCisgICAgcm5kID0gaW5wICsgbWFzazE7CisgIGVsc2UKKyAgICBybmQgPSBpbnA7CisKKyAgcm5kID0gcm5kID4+IHN4OworCisgIGlmIChpbnAgPT0gbWFzazMpIHJuZCsrOworCisgIHJldHVybiBybmQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBmaXhwX3JvdW5kKCkKKyAgICByb3VuZCBbdHlwaWNhbCByb3VuZGluZ10KKworICAgIFNlZSBmY3Qgcm91bmRSZWYoKSBbd2hpY2ggaXMgdGhlIHJlZmVyZW5jZV0KKyAgcmV0dXJucyBGSVhQX0RCTAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGSVhQX0RCTCBmaXhwX3JvdW5kKEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpIHsKKyAgRkRLX0FTU0VSVChzZiA+PSAwKTsKKyAgSU5UIHN4ID0gREZSQUNUX0JJVFMgLSAxIC0gc2Y7CisgIElOVCByID0gZml4cF9yb3VuZFRvSW50KGZfaW5wLCBzZik7CisgIFVMT05HIG1hc2sgPSAoVUxPTkcpMHgxIDw8IChERlJBQ1RfQklUUyAtIDEpOyAgLy8gMHg4MDAwMDAwMAorICByID0gciA8PCBzeDsKKworICBpZiAoKGZfaW5wID4gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChyICYgbWFzaykpIHsKKyAgICAtLXI7CisgIH0KKworICBGSVhQX0RCTCBmX3JvdW5kID0gKEZJWFBfREJMKXI7CisgIHJldHVybiBmX3JvdW5kOworfQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9odWZmX25vZGVzLmNwcCBiL2xpYkZESy9zcmMvaHVmZl9ub2Rlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkYzkwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkZESy9zcmMvaHVmZl9ub2Rlcy5jcHAKQEAgLTAsMCArMSwxMDg0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBPbWVyIE9zbWFuCisKKyAgIERlc2NyaXB0aW9uOiBNUEVHLUQgU0FDL1VTQUMvU0FPQyBIdWZmbWFuIFBhcnQwIFRhYmxlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaHVmZl9ub2Rlcy5oIgorCitjb25zdCBIVUZGX1BUMF9OT0RFUyBGREtfaHVmZlBhcnQwTm9kZXMgPSB7CisgICAge3syLCAxfSwgICAgIHs0LCAzfSwgICAgIHs2LCA1fSwgICAgIHs4LCA3fSwgICAgezEwLCA5fSwgICAgezEyLCAxMX0sCisgICAgIHsxNCwgMTN9LCAgIHstOCwgMTV9LCAgIHstOSwgMTZ9LCAgIHstMTAsIDE3fSwgey0xOCwgMTh9LCAgey0xNywgLTE5fSwKKyAgICAgey0xNiwgMTl9LCAgey0xMSwgLTIwfSwgey0xNSwgLTIxfSwgey03LCAyMH0sICB7LTIyLCAyMX0sICB7LTEyLCAtMTR9LAorICAgICB7LTEzLCAtMjN9LCB7MjMsIDIyfSwgICB7LTI0LCAtMzF9LCB7LTYsIDI0fSwgIHstMjUsIC0yNn0sIHsyNiwgMjV9LAorICAgICB7LTUsIC0yN30sICB7LTI4LCAyN30sICB7LTQsIDI4fSwgICB7LTI5LCAyOX0sIHstMSwgLTMwfSwgIHstMiwgLTN9fSwKKyAgICB7ezIsIDF9LCB7LTUsIDN9LCB7LTQsIC02fSwgey0zLCA0fSwgey0yLCA1fSwgey0xLCA2fSwgey03LCAtOH19LAorICAgIHt7LTEsIDF9LCB7LTgsIDJ9LCB7LTIsIDN9LCB7NSwgNH0sIHstNywgNn0sIHstMywgLTV9LCB7LTQsIC02fX0sCisgICAge3stMSwgMX0sCisgICAgIHszLCAyfSwKKyAgICAgey04LCA0fSwKKyAgICAgezYsIDV9LAorICAgICB7LTE2LCA3fSwKKyAgICAgezksIDh9LAorICAgICB7MTEsIDEwfSwKKyAgICAgey0yLCAtN30sCisgICAgIHstNiwgMTJ9LAorICAgICB7LTQsIC01fSwKKyAgICAgey0zLCAxM30sCisgICAgIHstMTAsIDE0fSwKKyAgICAgey0xMSwgLTEyfSwKKyAgICAgey0xNCwgLTE1fSwKKyAgICAgey05LCAtMTN9fSwKKyAgICB7ezIsIDF9LCAgICAgezQsIDN9LCAgICAgezYsIDV9LCAgICAgezgsIDd9LCAgICB7MTAsIDl9LCAgICB7MTIsIDExfSwKKyAgICAgezE0LCAxM30sICAgezE2LCAxNX0sICAgezE4LCAxN30sICAgezIwLCAxOX0sICB7MjIsIDIxfSwgICB7MjQsIDIzfSwKKyAgICAgezI2LCAyNX0sICAgezI4LCAyN30sICAgezMwLCAyOX0sICAgezMyLCAzMX0sICB7LTQ3LCAzM30sICB7LTU0LCAzNH0sCisgICAgIHstNDYsIDM1fSwgIHstNDgsIDM2fSwgIHstMjMsIC0yN30sIHstNDUsIDM3fSwgey01NSwgMzh9LCAgey0yMiwgLTQ5fSwKKyAgICAgey0yNCwgLTUzfSwgey00NCwgMzl9LCAgey01NywgNDB9LCAgey0yOCwgNDF9LCB7LTUyLCAtNTZ9LCB7LTQzLCA0Mn0sCisgICAgIHstNTAsIDQzfSwgIHstMjUsIC0yNn0sIHstMjksIC02NH0sIHstNjIsIDQ0fSwgey0yMSwgLTUxfSwgey01OCwgNDV9LAorICAgICB7LTMyLCA0Nn0sICB7LTMxLCAtNDJ9LCB7LTYwLCA0N30sICB7LTMwLCA0OH0sIHstMjAsIC02MX0sIHstNDEsIC02M30sCisgICAgIHstMTksIC01OX0sIHstNDAsIDQ5fSwgIHstMTgsIC0zOH0sIHstMzksIDUwfSwgey0zNiwgLTM3fSwgey0zNSwgNTF9LAorICAgICB7LTE3LCA1Mn0sICB7LTE2LCAtMzR9LCB7LTMzLCA1M30sICB7LTE1LCA1NH0sIHstMTQsIDU1fSwgIHstMTMsIDU2fSwKKyAgICAgey0xMiwgNTd9LCAgey0xMSwgNTh9LCAgey0xMCwgNTl9LCAgey05LCA2MH0sICB7LTcsIDYxfSwgICB7LTEsIC00fSwKKyAgICAgey02LCA2Mn0sICAgey01LCAtOH0sICAgey0yLCAtM319fTsKKworY29uc3QgSFVGRl9MQVZfTk9ERVMgRkRLX2h1ZmZMYXZJZHhOb2RlcyA9IHt7ey0xLCAxfSwgey0yLCAyfSwgey0zLCAtNH19fTsKKworc3RhdGljIGNvbnN0IEhVRkZfSUNDX05PRF8xRCBGREtfaHVmZklDQ05vZGVzX2gxRF8wID0geworICAgIHt7LTEsIDF9LCB7LTIsIDJ9LCB7LTMsIDN9LCB7LTQsIDR9LCB7LTUsIDV9LCB7LTYsIDZ9LCB7LTcsIC04fX19OworCitzdGF0aWMgY29uc3QgSFVGRl9JQ0NfTk9EXzJEIEZES19odWZmSUNDTm9kZXNfaDJEXzBfMCA9IHsKKyAgICB7ey0xLCAxfSwgey0xOCwgMn0sIHstMiwgLTE3fX0sCisgICAge3syLCAxfSwKKyAgICAgey0xLCAtNTJ9LAorICAgICB7LTIsIDN9LAorICAgICB7NSwgNH0sCisgICAgIHstNTEsIDZ9LAorICAgICB7LTE4LCA3fSwKKyAgICAgey0xNywgOH0sCisgICAgIHstMywgOX0sCisgICAgIHstMzYsIDEwfSwKKyAgICAgey0xOSwgLTUwfSwKKyAgICAgey0zNSwgMTF9LAorICAgICB7LTQsIDEyfSwKKyAgICAgey0zNCwgMTN9LAorICAgICB7LTMzLCAxNH0sCisgICAgIHstMjAsIC00OX19LAorICAgIHt7MiwgMX0sICAgICB7LTg2LCAzfSwgIHstMSwgNH0sICAgezYsIDV9LCAgICAgey0yLCA3fSwgICAgey04NSwgOH0sCisgICAgIHstMTgsIDl9LCAgIHsxMSwgMTB9LCAgey0xNywgMTJ9LCB7MTQsIDEzfSwgICB7LTcwLCAxNX0sICB7LTMsIC0xOX0sCisgICAgIHstNjksIDE2fSwgIHstODQsIDE3fSwgey02OCwgMTh9LCB7LTIwLCAtMzV9LCB7LTM0LCAtODN9LCB7MjAsIDE5fSwKKyAgICAgey00LCAyMX0sICAgey0zMywgMjJ9LCB7LTUsIDIzfSwgIHstNTMsIDI0fSwgIHstMzYsIC01Mn0sIHstNjcsIDI1fSwKKyAgICAgey0yMSwgLTgyfSwgey01NCwgMjZ9LCB7LTYsIDI3fSwgIHstNTEsIDI4fSwgIHstNTAsIDI5fSwgIHstNDksIDMwfSwKKyAgICAgey0zNywgMzF9LCAgey0zOCwgMH0sICB7MCwgMH0sICAgIHswLCAwfSwgICAgIHswLCAwfX0sCisgICAge3syLCAxfSwgICAgIHs0LCAzfSwgICAgIHstMSwgLTEyMH0sIHs2LCA1fSwgICAgICB7OCwgN30sICAgICB7LTE4LCA5fSwKKyAgICAgey0yLCAxMH0sICAgezEyLCAxMX0sICAgezE0LCAxM30sICAgey0xNywgLTExOX0sIHsxNiwgMTV9LCAgIHstMTAzLCAxN30sCisgICAgIHstMTA0LCAxOH0sIHstNTIsIDE5fSwgIHsyMSwgMjB9LCAgIHstNjksIDIyfSwgICB7MjQsIDIzfSwgICB7LTMsIC0zNX0sCisgICAgIHstMTksIDI1fSwgIHstMzQsIC04NX0sIHsyNywgMjZ9LCAgIHstODYsIDI4fSwgICB7LTExOCwgMjl9LCB7LTM3LCAzMH0sCisgICAgIHszMiwgMzF9LCAgIHstMTAyLCAzM30sIHstMjAsIC0yMn0sIHstNCwgLTExN30sICB7LTg3LCAzNH0sICB7LTEwMCwgMzV9LAorICAgICB7LTMzLCAtMzZ9LCB7MzcsIDM2fSwgICB7LTcwLCAtODh9LCB7LTEwMSwgMzh9LCAgey01LCAzOX0sICAgey01MSwgLTUzfSwKKyAgICAgey01MCwgNDB9LCAgey0xMTUsIDQxfSwgey0yMSwgNDJ9LCAgey0xMTYsIDQzfSwgIHstMzgsIDQ0fSwgIHstMjMsIC04NH0sCisgICAgIHstNDksIC05OX0sIHs0NiwgNDV9LCAgIHstNiwgLTExNH0sIHstNywgLTcyfSwgICB7LTcxLCA0N30sICB7LTgsIDB9LAorICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICAgezAsIDB9LCAgICAgezAsIDB9LAorICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICAgezAsIDB9LCAgICAgezAsIDB9LAorICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH19fTsKK3N0YXRpYyBjb25zdCBIVUZGX0lDQ19OT0RfMkQgRkRLX2h1ZmZJQ0NOb2Rlc19oMkRfMF8xID0geworICAgIHt7LTEsIDF9LCB7LTE4LCAyfSwgey0yLCAtMTd9fSwKKyAgICB7ezIsIDF9LAorICAgICB7LTEsIC01Mn0sCisgICAgIHstMTcsIDN9LAorICAgICB7NSwgNH0sCisgICAgIHstMzYsIDZ9LAorICAgICB7LTIsIDd9LAorICAgICB7LTE4LCAtMzN9LAorICAgICB7OSwgOH0sCisgICAgIHstMjAsIDEwfSwKKyAgICAgey0zNCwgLTUxfSwKKyAgICAgey00OSwgMTF9LAorICAgICB7LTM1LCAxMn0sCisgICAgIHstMTksIDEzfSwKKyAgICAgey0zLCAxNH0sCisgICAgIHstNCwgLTUwfX0sCisgICAge3syLCAxfSwgICAgIHstODYsIDN9LCAgIHstMSwgNH0sICAgey0xNywgNX0sICAgezcsIDZ9LCAgICB7LTcwLCA4fSwKKyAgICAgey0zMywgOX0sICAgey0xOCwgMTB9LCAgey0yLCAxMX0sICB7LTU0LCAxMn0sICB7LTQ5LCAxM30sIHstMzgsIDE0fSwKKyAgICAgey0zNCwgLTY1fSwgey04NSwgMTV9LCAgey01MCwgMTZ9LCB7LTY5LCAxN30sICB7LTIyLCAxOH0sIHstNTMsIDE5fSwKKyAgICAgezIxLCAyMH0sICAgey0xOSwgLTgxfSwgey02NiwgMjJ9LCB7LTMsIC0zNX0sICB7MjQsIDIzfSwgIHstMzcsIDI1fSwKKyAgICAgey02OCwgLTg0fSwgey01MSwgMjZ9LCAgezI4LCAyN30sICB7LTIwLCAtNTJ9LCB7MzAsIDI5fSwgIHstNCwgLTM2fSwKKyAgICAgey04MywgMzF9LCAgey02NywgMzJ9LCAgey04MiwgMzN9LCB7LTIxLCAzNH0sICB7LTUsIC02fX0sCisgICAge3syLCAxfSwgICAgIHstMSwgM30sICAgICB7LTEyMCwgNH0sICB7LTE3LCA1fSwgICAgezcsIDZ9LCAgICAgIHstMTA0LCA4fSwKKyAgICAgey0zMywgOX0sICAgezExLCAxMH0sICAgIHsxMywgMTJ9LCAgIHstNDksIDE0fSwgICB7LTg4LCAxNX0sICAgey0xOCwgLTk3fSwKKyAgICAgey02NSwgMTZ9LCAgey00MCwgMTd9LCAgIHstMiwgLTcyfSwgIHsxOSwgMTh9LCAgICB7LTExMywgMjB9LCAgey0zNCwgMjF9LAorICAgICB7LTU2LCAtODF9LCB7MjMsIDIyfSwgICAgey01MCwgMjR9LCAgey04MiwgLTExOX0sIHstMjQsIC0xMDN9LCB7MjYsIDI1fSwKKyAgICAgezI4LCAyN30sICAgezMwLCAyOX0sICAgIHstNTUsIC04N30sIHstNjYsIDMxfSwgICB7MzMsIDMyfSwgICAgey05OCwgMzR9LAorICAgICB7LTM1LCAtNjd9LCB7LTE5LCAzNX0sICAgey03MCwgMzZ9LCAgey03MSwgMzd9LCAgIHstNTEsIC01Mn0sICB7LTMsIDM4fSwKKyAgICAgezQwLCAzOX0sICAgey04NiwgLTExOH0sIHs0MiwgNDF9LCAgIHstMzksIC02OX0sICB7LTU0LCAtODN9LCAgezQ0LCA0M30sCisgICAgIHstMTAyLCA0NX0sIHstMTAxLCA0Nn0sICB7LTY4LCAtODV9LCB7LTM2LCAtNTN9LCAgey01LCAwfSwgICAgIHswLCAwfSwKKyAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgICB7MCwgMH0sICAgICAgezAsIDB9LAorICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgIHswLCAwfSwgICAgICB7MCwgMH0sCisgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgICB7MCwgMH19fTsKK3N0YXRpYyBjb25zdCBIVUZGX0lDQ19OT0RfMkQgRkRLX2h1ZmZJQ0NOb2Rlc19oMkRfMV8wID0geworICAgIHt7LTEsIDF9LCB7LTE4LCAyfSwgey0yLCAtMTd9fSwKKyAgICB7ey01MiwgMX0sCisgICAgIHstMSwgMn0sCisgICAgIHs0LCAzfSwKKyAgICAgey0yLCAtMTd9LAorICAgICB7LTE4LCA1fSwKKyAgICAgey0zNiwgNn0sCisgICAgIHstNTEsIDd9LAorICAgICB7OSwgOH0sCisgICAgIHstMzMsIDEwfSwKKyAgICAgey0zNCwgMTF9LAorICAgICB7LTM1LCAxMn0sCisgICAgIHstMTksIC0yMH0sCisgICAgIHstMywgMTN9LAorICAgICB7LTQ5LCAxNH0sCisgICAgIHstNCwgLTUwfX0sCisgICAge3stMSwgMX0sICAgIHstODYsIDJ9LCAgezQsIDN9LCAgICAgey0xNywgNX0sICB7LTIsIDZ9LCAgICB7LTE4LCA3fSwKKyAgICAgey03MCwgOH0sICAgey04NSwgOX0sICB7MTEsIDEwfSwgICB7MTMsIDEyfSwgIHstMzMsIDE0fSwgIHsxNiwgMTV9LAorICAgICB7LTM0LCAtNTR9LCB7LTY5LCAxN30sIHstMzgsIDE4fSwgIHstNTAsIDE5fSwgey0zNSwgLTUzfSwgey00OSwgMjB9LAorICAgICB7LTE5LCAyMX0sICB7LTMsIDIyfSwgIHstNjUsIDIzfSwgIHstNjgsIDI0fSwgey0yMiwgMjV9LCAgey04MSwgLTg0fSwKKyAgICAgey02NiwgMjZ9LCAgey0zNywgMjd9LCB7LTIwLCAtNTF9LCB7MjksIDI4fSwgIHstNTIsIDMwfSwgIHstNCwgLTgzfSwKKyAgICAgey0zNiwgMzF9LCAgey02NywgMzJ9LCB7LTUsIDMzfSwgICB7LTgyLCAzNH0sIHstMjEsIDB9fSwKKyAgICB7ey0xLCAxfSwgICAgey0xMjAsIDJ9LCAgezQsIDN9LCAgICAgey0xNywgNX0sICAgey0yLCA2fSwgICAgIHs4LCA3fSwKKyAgICAgey0xOCwgOX0sICAgey0xMDQsIDEwfSwgezEyLCAxMX0sICAgezE0LCAxM30sICAgezE2LCAxNX0sICAgIHstMTE5LCAxN30sCisgICAgIHstODEsIDE4fSwgIHsyMCwgMTl9LCAgIHstMzMsIDIxfSwgIHstODgsIDIyfSwgIHstMTAzLCAyM30sICB7LTM0LCAyNH0sCisgICAgIHstNTYsIDI1fSwgIHstNzIsIDI2fSwgIHstNDksIDI3fSwgIHstODIsIDI4fSwgIHstNTAsIDI5fSwgICB7LTY1LCAzMH0sCisgICAgIHstNTUsIC04N30sIHstMTksIDMxfSwgIHstNjcsIDMyfSwgIHstMzUsIC00MH0sIHszNCwgMzN9LCAgICB7LTUyLCAtNzF9LAorICAgICB7LTY2LCAzNX0sICB7LTcwLCAzNn0sICB7MzgsIDM3fSwgICB7LTUxLCAtOTd9LCB7LTg2LCAtMTAyfSwgey0zLCAzOX0sCisgICAgIHstMTE4LCA0MH0sIHs0MiwgNDF9LCAgIHstMjQsIC04NX0sIHstNTQsIDQzfSwgIHstMzksIDQ0fSwgICB7LTk4LCAtMTEzfSwKKyAgICAgey0zNiwgLTM3fSwgey0yMCwgLTY5fSwgey00LCA0NX0sICAgey01LCA0Nn0sICAgey0yMSwgMH0sICAgIHswLCAwfSwKKyAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgIHswLCAwfSwKKyAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgIHswLCAwfSwKKyAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9fX07CitzdGF0aWMgY29uc3QgSFVGRl9JQ0NfTk9EXzJEIEZES19odWZmSUNDTm9kZXNfaDJEXzFfMSA9IHsKKyAgICB7ey0xLCAxfSwgey0xOCwgMn0sIHstMiwgLTE3fX0sCisgICAge3stNTIsIDF9LAorICAgICB7LTEsIDJ9LAorICAgICB7NCwgM30sCisgICAgIHstMiwgNX0sCisgICAgIHstMTcsIC0xOH0sCisgICAgIHstNTEsIDZ9LAorICAgICB7LTM2LCA3fSwKKyAgICAgezksIDh9LAorICAgICB7LTM1LCAxMH0sCisgICAgIHstMywgMTF9LAorICAgICB7LTE5LCAtMzR9LAorICAgICB7LTMzLCAxMn0sCisgICAgIHstNTAsIDEzfSwKKyAgICAgey0yMCwgMTR9LAorICAgICB7LTQsIC00OX19LAorICAgIHt7MiwgMX0sICAgIHstODYsIDN9LCAgIHstMSwgNH0sICAgIHs2LCA1fSwgICAgIHstMTgsIDd9LCAgey0yLCAtMTd9LAorICAgICB7OSwgOH0sICAgIHstNzAsIDEwfSwgIHstNjksIC04NX0sIHstMzUsIDExfSwgIHsxMywgMTJ9LCAgey0zNCwgMTR9LAorICAgICB7LTE5LCAxNX0sIHstNTMsIDE2fSwgIHstNjgsIDE3fSwgIHstMzMsIDE4fSwgIHstMywgLTUyfSwgezIwLCAxOX0sCisgICAgIHstNTQsIDIxfSwgey04NCwgMjJ9LCAgey01MCwgMjN9LCAgey0yMCwgLTUxfSwgey0zNiwgMjR9LCB7MjYsIDI1fSwKKyAgICAgey04MywgMjd9LCB7LTQsIC0zOH0sICB7LTQ5LCAyOH0sICB7LTM3LCAyOX0sICB7LTY3LCAzMH0sIHstNSwgMzF9LAorICAgICB7LTIxLCAzMn0sIHstNjUsIC02Nn0sIHstODIsIDMzfSwgIHstMjIsIDM0fSwgIHstNiwgLTgxfX0sCisgICAge3syLCAxfSwgICAgIHstMSwgLTEyMH0sIHs0LCAzfSwgICAgIHs2LCA1fSwgICAgIHstMTgsIDd9LCAgICB7OSwgOH0sCisgICAgIHstMTcsIDEwfSwgIHstMiwgMTF9LCAgIHstMTAzLCAxMn0sIHstNTIsIDEzfSwgIHstMzUsIC0xMDR9LCB7LTExOSwgMTR9LAorICAgICB7MTYsIDE1fSwgICB7LTY5LCAtODZ9LCB7MTgsIDE3fSwgICB7LTM0LCAxOX0sICB7LTE5LCAyMH0sICAgezIyLCAyMX0sCisgICAgIHstNzAsIDIzfSwgIHstODcsIDI0fSwgIHstMTAyLCAyNX0sIHstODUsIDI2fSwgIHstMzMsIDI3fSwgICB7LTM2LCAyOH0sCisgICAgIHstMywgMjl9LCAgIHstODgsIDMwfSwgIHstNTEsIDMxfSwgIHstMTE4LCAzMn0sIHszNCwgMzN9LCAgICB7LTY4LCAzNX0sCisgICAgIHstNTMsIDM2fSwgIHstNjcsIDM3fSwgIHstMjAsIDM4fSwgIHstMTAxLCAzOX0sIHstNTAsIDQwfSwgICB7NDIsIDQxfSwKKyAgICAgey0zNywgNDN9LCAgey0xMTYsIDQ0fSwgey0xMTcsIDQ1fSwgey00OSwgNDZ9LCAgey0yMSwgLTEwMH0sIHs0OCwgNDd9LAorICAgICB7LTU1LCAtNzF9LCB7LTQsIDQ5fSwgICB7LTIyLCAtODR9LCB7LTExNSwgNTB9LCB7LTY2LCAtODJ9LCAgey03MiwgNTF9LAorICAgICB7LTUsIC02fSwgICB7LTU0LCA1Mn0sICB7LTM4LCA1M30sICB7LTgzLCA1NH0sICB7LTQwLCA1NX0sICAgey0zOSwgNTZ9LAorICAgICB7LTk5LCA1N30sICB7LTIzLCAtNTZ9LCB7LTcsIDU4fSwgICB7LTY1LCAtOTd9LCB7LTgsIDB9LCAgICAgezAsIDB9LAorICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH19fTsKKworY29uc3QgSFVGRl9JQ0NfTk9ERVMgRkRLX2h1ZmZJQ0NOb2RlcyA9IHsKKyAgICB7JkZES19odWZmSUNDTm9kZXNfaDFEXzAsICZGREtfaHVmZklDQ05vZGVzX2gxRF8wLCAmRkRLX2h1ZmZJQ0NOb2Rlc19oMURfMH0sCisgICAge3smRkRLX2h1ZmZJQ0NOb2Rlc19oMkRfMF8wLCAmRkRLX2h1ZmZJQ0NOb2Rlc19oMkRfMF8xfSwKKyAgICAgeyZGREtfaHVmZklDQ05vZGVzX2gyRF8xXzAsICZGREtfaHVmZklDQ05vZGVzX2gyRF8xXzF9LAorICAgICB7JkZES19odWZmSUNDTm9kZXNfaDJEXzBfMSwgJkZES19odWZmSUNDTm9kZXNfaDJEXzBfMX19fTsKKworc3RhdGljIGNvbnN0IEhVRkZfQ0xEX05PRF8xRCBGREtfaHVmZkNMRE5vZGVzX2gxRF8wID0geworICAgIHt7LTEsIDF9LCAgIHstMiwgMn0sICAgey0zLCAzfSwgICAgey00LCA0fSwgICAgey01LCA1fSwgICAgey02LCA2fSwKKyAgICAgey03LCA3fSwgICB7LTgsIDh9LCAgIHstOSwgOX0sICAgIHstMTAsIDEwfSwgIHstMTEsIDExfSwgIHstMTIsIDEyfSwKKyAgICAgey0xMywgMTN9LCB7MTUsIDE0fSwgIHstMTQsIDE2fSwgIHstMTUsIDE3fSwgIHstMTYsIDE4fSwgIHstMTcsIDE5fSwKKyAgICAgey0xOCwgMjB9LCB7LTE5LCAyMX0sIHstMjAsIC0yMX0sIHstMjMsIDIyfSwgIHstMjIsIDIzfSwgIHstMjQsIDI0fSwKKyAgICAgey0yNSwgMjV9LCB7MjcsIDI2fSwgIHsyOSwgMjh9LCAgIHstMzAsIC0zMX0sIHstMjgsIC0yOX0sIHstMjYsIC0yN319fTsKK3N0YXRpYyBjb25zdCBIVUZGX0NMRF9OT0RfMUQgRkRLX2h1ZmZDTEROb2Rlc19oMURfMSA9IHsKKyAgICB7ey0xLCAxfSwgICB7LTIsIDJ9LCAgICB7LTMsIDN9LCAgIHstNCwgNH0sICAgIHstNSwgNX0sICAgIHstNiwgNn0sCisgICAgIHstNywgN30sICAgezksIDh9LCAgICAgey04LCAxMH0sICB7LTksIDExfSwgICB7LTEwLCAxMn0sICB7LTExLCAxM30sCisgICAgIHstMTIsIDE0fSwgey0xMywgMTV9LCAgey0xNCwgMTZ9LCB7LTE1LCAxN30sICB7LTE2LCAxOH0sICB7LTE3LCAxOX0sCisgICAgIHstMTgsIDIwfSwgey0xOSwgLTIwfSwgey0yMSwgMjF9LCB7LTIyLCAyMn0sICB7LTIzLCAyM30sICB7MjUsIDI0fSwKKyAgICAgey0yNCwgMjZ9LCB7LTI1LCAyN30sICB7MjksIDI4fSwgIHstMjYsIC0zMX0sIHstMjksIC0zMH0sIHstMjcsIC0yOH19fTsKKworc3RhdGljIGNvbnN0IEhVRkZfQ0xEX05PRF8yRCBGREtfaHVmZkNMRE5vZGVzX2gyXzBfMCA9IHsKKyAgICB7ezIsIDF9LAorICAgICB7LTEsIC01Mn0sCisgICAgIHs0LCAzfSwKKyAgICAgey0yLCA1fSwKKyAgICAgey01MSwgNn0sCisgICAgIHstMTcsIC0xOH0sCisgICAgIHs4LCA3fSwKKyAgICAgezEwLCA5fSwKKyAgICAgey0zLCAtMzZ9LAorICAgICB7LTE5LCAxMX0sCisgICAgIHstMzUsIC01MH0sCisgICAgIHstMzQsIDEyfSwKKyAgICAgey00LCAxM30sCisgICAgIHstMzMsIDE0fSwKKyAgICAgey0yMCwgLTQ5fX0sCisgICAge3syLCAxfSwgICAgIHs0LCAzfSwgICAgIHstODYsIDV9LCAgezcsIDZ9LCAgICB7OSwgOH0sICAgICB7LTEsIC0yfSwKKyAgICAgey04NSwgMTB9LCAgey0xOCwgMTF9LCAgey0xNywgMTJ9LCB7MTQsIDEzfSwgIHstNzAsIDE1fSwgIHsxNywgMTZ9LAorICAgICB7LTE5LCAtNjl9LCB7LTg0LCAxOH0sICB7LTMsIDE5fSwgIHsyMSwgMjB9LCAgey0zNCwgLTY4fSwgey0yMCwgMjJ9LAorICAgICB7LTM1LCAyM30sICB7LTgzLCAyNH0sICB7LTMzLCAyNX0sIHstNCwgMjZ9LCAgey01MywgMjd9LCAgey01NCwgLTY3fSwKKyAgICAgey0zNiwgMjh9LCAgey0yMSwgLTUyfSwgey04MiwgMjl9LCB7LTUsIC01MH0sIHstNTEsIDMwfSwgIHstMzgsIDMxfSwKKyAgICAgey0zNywgLTQ5fSwgey02LCAzMn0sICAgey02NiwgMzN9LCB7LTY1LCAzNH0sIHstMjIsIC04MX19LAorICAgIHt7MiwgMX0sICAgICAgezQsIDN9LCAgICAgIHstMTIwLCA1fSwgIHs3LCA2fSwgICAgICB7OSwgOH0sICAgICB7MTEsIDEwfSwKKyAgICAgey0xLCAxMn0sICAgIHstMTgsIC0xMTl9LCB7LTIsIDEzfSwgICB7MTUsIDE0fSwgICAgey0xNywgMTZ9LCAgey0xMDQsIDE3fSwKKyAgICAgezE5LCAxOH0sICAgIHstMTksIDIwfSwgICB7LTEwMywgMjF9LCB7LTExOCwgMjJ9LCAgezI0LCAyM30sICAgey0zLCAyNX0sCisgICAgIHsyNywgMjZ9LCAgICB7LTM0LCAyOH0sICAgey0xMDIsIDI5fSwgey0yMCwgMzB9LCAgIHstMzUsIDMxfSwgIHszMywgMzJ9LAorICAgICB7LTExNywgMzR9LCAgey0zMywgMzV9LCAgIHstODgsIDM2fSwgIHstNCwgMzd9LCAgICB7LTg3LCAzOH0sICB7NDAsIDM5fSwKKyAgICAgey0zNiwgLTEwMX0sIHstODYsIDQxfSwgICB7LTIxLCAtMzd9LCB7LTg1LCAtMTAwfSwgey01MiwgNDJ9LCAgey0yMiwgNDN9LAorICAgICB7LTExNiwgNDR9LCAgey01MCwgNDV9LCAgIHs0NywgNDZ9LCAgIHstNSwgLTUxfSwgICB7LTExNSwgNDh9LCB7LTcwLCA0OX0sCisgICAgIHstODQsIDUwfSwgICB7LTM4LCAtNDl9LCAgey03MiwgLTk5fSwgey01MywgNTF9LCAgIHstNjksIC03MX0sIHstMjMsIDUyfSwKKyAgICAgey02LCAtNjd9LCAgIHstMTE0LCA1M30sICB7LTcsIDU0fSwgICB7LTY2LCAtNjh9LCAgey01NSwgNTV9LCAgezU3LCA1Nn0sCisgICAgIHstNTQsIC02NX0sICB7LTgsIC01Nn0sICAgey04MiwgLTgzfSwgezU5LCA1OH0sICAgIHstMzksIC00MH0sIHstODEsIDYwfSwKKyAgICAgey05OCwgNjF9LCAgIHstOTcsIDYyfSwgICB7LTI0LCAtMTEzfX0sCisgICAge3syLCAxfSwgICAgICB7NCwgM30sICAgICAgezYsIDV9LCAgICAgIHstMTU0LCA3fSwgICAgezksIDh9LAorICAgICB7MTEsIDEwfSwgICAgezEzLCAxMn0sICAgIHsxNSwgMTR9LCAgICB7LTE4LCAxNn0sICAgIHstMTUzLCAxN30sCisgICAgIHstMSwgLTJ9LCAgICB7MTksIDE4fSwgICAgey0xMzgsIDIwfSwgIHstMTcsIDIxfSwgICAgezIzLCAyMn0sCisgICAgIHsyNSwgMjR9LCAgICB7LTE5LCAtMTM3fSwgezI3LCAyNn0sICAgIHstMTUyLCAyOH0sICAgezMwLCAyOX0sCisgICAgIHstMywgLTM0fSwgICB7MzIsIDMxfSwgICAgezM0LCAzM30sICAgIHszNiwgMzV9LCAgICAgey0xMzYsIDM3fSwKKyAgICAgey0zNSwgMzh9LCAgIHstMjAsIDM5fSwgICB7LTEyMiwgNDB9LCAgey0xNTEsIDQxfSwgICB7LTMzLCA0Mn0sCisgICAgIHstMTIxLCA0M30sICB7NDUsIDQ0fSwgICAgezQ3LCA0Nn0sICAgIHstNCwgNDh9LCAgICAgey0zNiwgLTEyMH0sCisgICAgIHstMTM1LCA0OX0sICB7NTEsIDUwfSwgICAgey0yMSwgNTJ9LCAgIHs1NCwgNTN9LCAgICAgezU2LCA1NX0sCisgICAgIHstNTAsIC0xNTB9LCB7NTgsIDU3fSwgICAgey01MSwgNTl9LCAgIHs2MSwgNjB9LCAgICAgey0xMTksIDYyfSwKKyAgICAgey01MiwgNjN9LCAgIHstNSwgNjR9LCAgICB7LTM3LCA2NX0sICAgey0xMTcsIC0xMzR9LCB7LTM5LCAtNTR9LAorICAgICB7LTIyLCA2Nn0sICAgey0xMDYsIDY3fSwgIHstNjksIC0xMDJ9LCB7LTEzMiwgNjh9LCAgIHstMTA1LCA2OX0sCisgICAgIHstNDksIDcwfSwgICB7LTE0OSwgNzF9LCAgey0yNCwgLTEwNH0sIHs3MywgNzJ9LCAgICAgey01MywgNzR9LAorICAgICB7LTM4LCAtMTE4fSwgey0xMDMsIDc1fSwgIHstNiwgNzZ9LCAgICB7LTY2LCAtODd9LCAgIHstMTMzLCAtMTQ3fSwKKyAgICAgey0yMywgNzd9LCAgIHstNjcsIDc4fSwgICB7LTY4LCAtODZ9LCAgey03MCwgLTEwMX0sICB7LTQwLCAtMTQ4fSwKKyAgICAgey0xMTYsIDc5fSwgIHstNTUsIDgwfSwgICB7LTg0LCAtMTMxfSwgezgyLCA4MX0sICAgICB7LTg5LCAtOTB9LAorICAgICB7LTcsIC0yNX0sICAgey04NSwgLTg4fSwgIHstNjUsIDgzfSwgICB7LTcyLCAtMTQ2fSwgIHs4NSwgODR9LAorICAgICB7LTksIC03MX0sICAgey04MywgODZ9LCAgIHstODIsIDg3fSwgICB7LTgsIDg4fSwgICAgIHstMTAwLCA4OX0sCisgICAgIHstNzQsIC05OX0sICB7LTczLCA5MH0sICAgey0xMCwgLTgxfSwgIHstNTYsIDkxfSwgICAgey01NywgLTk4fSwKKyAgICAgezkzLCA5Mn0sICAgIHstNTgsIC0xMTR9LCB7LTk3LCAtMTE1fSwgezk1LCA5NH0sICAgICB7LTQxLCA5Nn0sCisgICAgIHstNDIsIDk3fSwgICB7LTI2LCAtMTI5fSwgey0xMTMsIDk4fSwgIHstMTMwLCAtMTQ1fX19Oworc3RhdGljIGNvbnN0IEhVRkZfQ0xEX05PRF8yRCBGREtfaHVmZkNMRE5vZGVzX2gyXzBfMSA9IHsKKyAgICB7ey0xLCAxfSwKKyAgICAgey01MiwgMn0sCisgICAgIHstMTcsIDN9LAorICAgICB7NSwgNH0sCisgICAgIHstMzYsIDZ9LAorICAgICB7LTMzLCA3fSwKKyAgICAgey0yLCAtMTh9LAorICAgICB7LTIwLCA4fSwKKyAgICAgezEwLCA5fSwKKyAgICAgey0zNCwgLTQ5fSwKKyAgICAgey01MSwgMTF9LAorICAgICB7LTM1LCAxMn0sCisgICAgIHstMTksIDEzfSwKKyAgICAgey0zLCAxNH0sCisgICAgIHstNCwgLTUwfX0sCisgICAge3syLCAxfSwgICAgezQsIDN9LCAgICAgey04NiwgNX0sICB7LTEsIDZ9LCAgIHstMTcsIDd9LCAgIHstNzAsIDh9LAorICAgICB7MTAsIDl9LCAgIHstMTgsIDExfSwgIHstMzMsIDEyfSwgey01NCwgMTN9LCB7LTIsIDE0fSwgICB7LTM0LCAxNX0sCisgICAgIHstMzgsIDE2fSwgey00OSwgMTd9LCAgey04NSwgMTh9LCB7LTUwLCAxOX0sIHstNjksIDIwfSwgIHstNTMsIC02NX0sCisgICAgIHstMjIsIDIxfSwgey02NiwgMjJ9LCAgey0xOSwgMjN9LCB7LTM3LCAyNH0sIHstMzUsIC04MX0sIHstMywgMjV9LAorICAgICB7LTUxLCAyNn0sIHstNjgsIC04NH0sIHstNTIsIDI3fSwgezI5LCAyOH0sICB7LTIwLCAzMH0sICB7LTQsIC0zNn0sCisgICAgIHstODMsIDMxfSwgey02NywgMzJ9LCAgey0yMSwgMzN9LCB7LTUsIDM0fSwgIHstNiwgLTgyfX0sCisgICAge3syLCAxfSwgICAgIHs0LCAzfSwgICAgIHs2LCA1fSwgICAgIHstMTIwLCA3fSwgIHstMTcsIDh9LCAgIHstMSwgLTEwNH0sCisgICAgIHsxMCwgOX0sICAgIHsxMiwgMTF9LCAgIHstMTgsIDEzfSwgIHstMzMsIC04OH0sIHsxNSwgMTR9LCAgIHsxNywgMTZ9LAorICAgICB7LTIsIDE4fSwgICB7LTM0LCAxOX0sICB7LTcyLCAyMH0sICB7LTQ5LCAyMX0sICB7LTExOSwgMjJ9LCB7LTUwLCAyM30sCisgICAgIHstMTAzLCAyNH0sIHstNTYsIDI1fSwgIHstNjUsIDI2fSwgIHsyOCwgMjd9LCAgIHstNDAsIC04N30sIHstNjYsIDI5fSwKKyAgICAgey04MiwgMzB9LCAgezMyLCAzMX0sICAgey0xOSwgLTgxfSwgey03MSwgMzN9LCAgey05NywgMzR9LCAgey0zNSwgLTU1fSwKKyAgICAgey0yNCwgMzV9LCAgezM3LCAzNn0sICAgey0zLCAtOTh9LCAgey01MSwgMzh9LCAgey02NywgMzl9LCAgey0zOSwgLTExOH0sCisgICAgIHstMTEzLCA0MH0sIHstMTAyLCA0MX0sIHstODYsIDQyfSwgIHstNzAsIC04M30sIHs0NCwgNDN9LCAgIHstMjAsIC01NH0sCisgICAgIHstNTIsIDQ1fSwgIHstMzYsIDQ2fSwgIHstNCwgNDd9LCAgIHstNjgsIDQ4fSwgIHstODUsIDQ5fSwgIHstMTAxLCAtMTE3fSwKKyAgICAgey02OSwgNTB9LCAgezUyLCA1MX0sICAgey0yMSwgLTM3fSwgey01MywgNTN9LCAgezU1LCA1NH0sICAgey01LCAtMTAwfSwKKyAgICAgey0xMTYsIDU2fSwgey04NCwgNTd9LCAgey0zOCwgNTh9LCAgey0yMiwgLTk5fSwgey0xMTUsIDU5fSwgey02LCA2MH0sCisgICAgIHstMjMsIDYxfSwgIHstNywgNjJ9LCAgIHstMTE0LCAwfX0sCisgICAge3syLCAxfSwgICAgICB7NCwgM30sICAgICAgIHs2LCA1fSwgICAgICAgey0xNTQsIDd9LCAgICB7OSwgOH0sCisgICAgIHstMTcsIDEwfSwgICB7LTEzOCwgMTF9LCAgIHstMSwgMTJ9LCAgICAgezE0LCAxM30sICAgICB7MTYsIDE1fSwKKyAgICAgey0zMywgLTEyMn0sIHstMTgsIDE3fSwgICAgezE5LCAxOH0sICAgICB7LTM0LCAyMH0sICAgIHstMiwgMjF9LAorICAgICB7LTEwNiwgMjJ9LCAgey00OSwgMjN9LCAgICB7MjUsIDI0fSwgICAgIHstNTAsIDI2fSwgICAgey0xNTMsIDI3fSwKKyAgICAgey05MCwgMjh9LCAgIHstMTM3LCAyOX0sICAgey02NSwgMzB9LCAgICB7MzIsIDMxfSwgICAgIHstNjYsIDMzfSwKKyAgICAgey0xMjEsIDM0fSwgIHstNzQsIDM1fSwgICAgey04MSwgMzZ9LCAgICB7MzgsIDM3fSwgICAgIHstNDIsIDM5fSwKKyAgICAgey04MiwgNDB9LCAgIHstMTA1LCA0MX0sICAgey0xOSwgLTExNH0sICB7LTU4LCA0Mn0sICAgIHstMzUsIDQzfSwKKyAgICAgey05NywgNDR9LCAgIHs0NiwgNDV9LCAgICAgey0xMjksIDQ3fSwgICB7LTI2LCAtODl9LCAgIHstNTcsIC05OH0sCisgICAgIHstNTEsIDQ4fSwgICB7LTMsIDQ5fSwgICAgIHstMTEzLCA1MH0sICAgey0xMzAsIDUxfSwgICB7LTE1MiwgNTJ9LAorICAgICB7LTY3LCAtNzN9LCAgey05OSwgLTEzNn0sICB7LTE0NSwgNTN9LCAgIHstMTIwLCA1NH0sICAgey00MSwgNTV9LAorICAgICB7LTgzLCA1Nn0sICAgey03MiwgNTd9LCAgICB7LTEwNCwgNTh9LCAgIHstMTE1LCA1OX0sICAgey0yMCwgNjB9LAorICAgICB7NjIsIDYxfSwgICAgey0zNiwgLTg4fSwgICB7LTg0LCA2M30sICAgIHstNTIsIC01Nn0sICAgezY1LCA2NH0sCisgICAgIHstNCwgLTg3fSwgICB7LTY4LCA2Nn0sICAgIHstMTUxLCA2N30sICAgey0xMDAsIC0xMzV9LCB7NjksIDY4fSwKKyAgICAgey02OSwgLTExOX0sIHstMTAzLCA3MH0sICAgey03MSwgNzF9LCAgICB7NzMsIDcyfSwgICAgIHstMjEsIDc0fSwKKyAgICAgey04NSwgNzV9LCAgIHstMzcsIC01M30sICAgey04NiwgNzZ9LCAgICB7NzgsIDc3fSwgICAgIHstMTAyLCAtMTUwfSwKKyAgICAgey01LCA3OX0sICAgIHstMTM0LCA4MH0sICAgey0xMTgsIDgxfSwgICB7LTU0LCAtMTE3fSwgIHs4MywgODJ9LAorICAgICB7LTM4LCAtNzB9LCAgey0yMiwgODR9LCAgICB7LTYsIDg1fSwgICAgIHs4NywgODZ9LCAgICAgey01NSwgODh9LAorICAgICB7LTEwMSwgODl9LCAgey0xMzMsIC0xNDl9LCB7LTI0LCAtMzl9LCAgIHs5MSwgOTB9LCAgICAgey0xMzIsIDkyfSwKKyAgICAgey0yMywgOTN9LCAgIHstNywgOTR9LCAgICAgey0xNDcsIC0xNDh9LCB7LTExNiwgLTEzMX0sIHstMjUsIDk1fSwKKyAgICAgey00MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgICB7MCwgMH19fTsKK3N0YXRpYyBjb25zdCBIVUZGX0NMRF9OT0RfMkQgRkRLX2h1ZmZDTEROb2Rlc19oMl8xXzAgPSB7CisgICAge3stMSwgMX0sCisgICAgIHstNTIsIDJ9LAorICAgICB7LTE3LCAzfSwKKyAgICAgezUsIDR9LAorICAgICB7LTIsIC0zNn0sCisgICAgIHstMTgsIDZ9LAorICAgICB7OCwgN30sCisgICAgIHstNTEsIDl9LAorICAgICB7LTMzLCAxMH0sCisgICAgIHstMzQsIDExfSwKKyAgICAgey0yMCwgLTM1fSwKKyAgICAgey0xOSwgMTJ9LAorICAgICB7LTMsIDEzfSwKKyAgICAgey00OSwgMTR9LAorICAgICB7LTQsIC01MH19LAorICAgIHt7MiwgMX0sICAgICB7LTg2LCAzfSwgICB7LTEsIDR9LCAgIHstMTcsIDV9LCAgIHs3LCA2fSwgICAgey03MCwgOH0sCisgICAgIHstMiwgLTE4fSwgIHsxMCwgOX0sICAgIHsxMiwgMTF9LCAgey04NSwgMTN9LCAgey0zMywgMTR9LCB7LTM0LCAtNTR9LAorICAgICB7MTYsIDE1fSwgICB7LTY5LCAxN30sICB7MTksIDE4fSwgIHstNTAsIC01M30sIHstMTksIDIwfSwgey0zOCwgMjF9LAorICAgICB7LTM1LCAtNDl9LCB7LTMsIDIyfSwgICB7MjQsIDIzfSwgIHstNjgsIDI1fSwgIHstODQsIDI2fSwgey02NSwgMjd9LAorICAgICB7LTUxLCAtNjZ9LCB7LTIyLCAtMzd9LCB7LTUyLCAyOH0sIHstMjAsIDI5fSwgIHstMzYsIDMwfSwgey04MSwgMzF9LAorICAgICB7LTQsIC04M30sICB7LTY3LCAzMn0sICB7LTIxLCAzM30sIHstNSwgMzR9LCAgIHstNiwgLTgyfX0sCisgICAge3syLCAxfSwgICAgIHstMTIwLCAzfSwgICB7LTEsIDR9LCAgICAgezYsIDV9LCAgICAgIHstMTcsIDd9LCAgIHstMTA0LCA4fSwKKyAgICAgey0xOCwgOX0sICAgey0yLCAxMH0sICAgIHsxMiwgMTF9LCAgICB7MTQsIDEzfSwgICAgey0xMTksIDE1fSwgey0zMywgMTZ9LAorICAgICB7LTM0LCAtODh9LCB7LTEwMywgMTd9LCAgezE5LCAxOH0sICAgIHsyMSwgMjB9LCAgICB7MjMsIDIyfSwgICB7MjUsIDI0fSwKKyAgICAgey0xOSwgLTcyfSwgey01MCwgMjZ9LCAgIHstNDksIDI3fSwgICB7LTg3LCAyOH0sICAgezMwLCAyOX0sICAgezMyLCAzMX0sCisgICAgIHstMywgLTM1fSwgIHszNCwgMzN9LCAgICB7LTU2LCAzNX0sICAgey02NSwgLTY2fSwgIHstNDAsIDM2fSwgIHstODIsIC0xMTh9LAorICAgICB7LTcxLCAzN30sICB7LTU1LCAzOH0sICAgey02NywgLTEwMn0sIHstNTEsIDM5fSwgICB7LTcwLCA0MH0sICB7NDIsIDQxfSwKKyAgICAgey04MSwgNDN9LCAgey04NiwgNDR9LCAgIHstNTIsIC05N30sICB7LTk4LCA0NX0sICAgey0yNCwgLTM5fSwgey0yMCwgNDZ9LAorICAgICB7LTU0LCAtODN9LCB7LTM2LCA0N30sICAgey04NSwgNDh9LCAgIHstNjgsIDQ5fSwgICB7LTQsIDUwfSwgICB7LTY5LCAtMTEzfSwKKyAgICAgey0xMTcsIDUxfSwgey0zNywgLTEwMX0sIHstNTMsIDUyfSwgICB7LTIxLCA1M30sICAgezU1LCA1NH0sICAgey04NCwgLTEwMH0sCisgICAgIHstNSwgNTZ9LCAgIHstMTE2LCA1N30sICB7LTIyLCA1OH0sICAgey0zOCwgLTExNX0sIHs2MCwgNTl9LCAgIHstNiwgLTk5fSwKKyAgICAgey0yMywgNjF9LCAgey0xMTQsIDYyfSwgIHstNywgLTh9fSwKKyAgICB7ezIsIDF9LCAgICAgey0xNTQsIDN9LCAgICB7NSwgNH0sICAgICAgey0xLCA2fSwgICAgICB7OCwgN30sCisgICAgIHstMTcsIDl9LCAgIHstMTM4LCAxMH0sICAgey0xOCwgMTF9LCAgIHstMiwgMTJ9LCAgICAgezE0LCAxM30sCisgICAgIHsxNiwgMTV9LCAgIHstMTUzLCAxN30sICAgey0zNCwgMTh9LCAgIHstMzMsIC0xMjJ9LCAgezIwLCAxOX0sCisgICAgIHsyMiwgMjF9LCAgIHstMTM3LCAyM30sICAgezI1LCAyNH0sICAgIHsyNywgMjZ9LCAgICAgey0xMDYsIDI4fSwKKyAgICAgezMwLCAyOX0sICAgey01MCwgMzF9LCAgICB7LTE5LCAzMn0sICAgey00OSwgLTEyMX0sICB7MzQsIDMzfSwKKyAgICAgezM2LCAzNX0sICAgey0zNSwgMzd9LCAgICB7LTkwLCAzOH0sICAgey02NiwgMzl9LCAgICB7LTMsIDQwfSwKKyAgICAgezQyLCA0MX0sICAgey02NSwgNDN9LCAgICB7LTEwNSwgNDR9LCAgezQ2LCA0NX0sICAgICB7LTc0LCA0N30sCisgICAgIHstNTEsIDQ4fSwgIHstODIsIC0xNTJ9LCAgey0xMzYsIDQ5fSwgIHstODEsIDUwfSwgICAgey00MiwgLTg5fSwKKyAgICAgey0xMTQsIDUxfSwgezUzLCA1Mn0sICAgICB7LTU3LCAtNTh9LCAgey0xMjAsIDU0fSwgICB7LTk4LCA1NX0sCisgICAgIHstNjcsIDU2fSwgIHstOTcsIDU3fSwgICAgezU5LCA1OH0sICAgIHstOTksIDYwfSwgICAgey03MywgLTEwNH0sCisgICAgIHstNzIsIDYxfSwgIHstMTEzLCA2Mn0sICAgey0yMCwgLTgzfSwgIHstODQsIC0xMzB9LCAgey0zNiwgNjN9LAorICAgICB7LTI2LCA2NH0sICB7LTQxLCA2NX0sICAgIHstNTIsIC0xMjl9LCB7LTg3LCAtODh9LCAgIHs2NywgNjZ9LAorICAgICB7LTExNSwgNjh9LCB7LTY4LCA2OX0sICAgIHstNTYsIC02OX0sICB7LTQsIC0xMDB9LCAgIHstMTUxLCA3MH0sCisgICAgIHstMTM1LCA3MX0sIHstMTAzLCAtMTE5fSwgezczLCA3Mn0sICAgIHstNzEsIC0xNDV9LCAgey0xMDIsIDc0fSwKKyAgICAgezc2LCA3NX0sICAgey01MywgLTg1fSwgICB7LTM3LCA3N30sICAgey0yMSwgLTg2fSwgICB7NzksIDc4fSwKKyAgICAgey01LCA4MH0sICAgey01NCwgLTEzNH0sICB7LTE1MCwgODF9LCAgey0xMTgsIDgyfSwgICB7LTcwLCA4M30sCisgICAgIHstMTE3LCA4NH0sIHstMjIsIC0zOH0sICAgey0xMDEsIDg1fSwgIHstNTUsIDg2fSwgICAgey0xNDksIDg3fSwKKyAgICAgey0zOSwgODh9LCAgey0xMzMsIDg5fSwgICB7LTYsIDkwfSwgICAgey0xMTYsIDkxfSwgICB7LTI0LCA5Mn0sCisgICAgIHstNywgLTEzMn0sIHstMjMsIDkzfSwgICAgey00MCwgOTR9LCAgIHstMTMxLCAtMTQ4fSwgey0yNSwgOTV9LAorICAgICB7LTE0NywgOTZ9LCB7LTE0NiwgOTd9LCAgIHstOCwgMH0sICAgICB7MCwgMH19fTsKK3N0YXRpYyBjb25zdCBIVUZGX0NMRF9OT0RfMkQgRkRLX2h1ZmZDTEROb2Rlc19oMl8xXzEgPSB7CisgICAge3stMSwgMX0sCisgICAgIHstNTIsIDJ9LAorICAgICB7NCwgM30sCisgICAgIHstMiwgNX0sCisgICAgIHstMTcsIDZ9LAorICAgICB7LTE4LCA3fSwKKyAgICAgey0zNiwgLTUxfSwKKyAgICAgezksIDh9LAorICAgICB7LTM1LCAxMH0sCisgICAgIHstMzQsIDExfSwKKyAgICAgey0xOSwgLTMzfSwKKyAgICAgey0zLCAxMn0sCisgICAgIHstMjAsIDEzfSwKKyAgICAgey01MCwgMTR9LAorICAgICB7LTQsIC00OX19LAorICAgIHt7MiwgMX0sICAgIHstODYsIDN9LCAgIHs1LCA0fSwgICAgIHstMSwgNn0sICAgezgsIDd9LCAgICB7LTE3LCAtMTh9LAorICAgICB7LTIsIDl9LCAgIHstNzAsIDEwfSwgIHstODUsIDExfSwgIHsxMywgMTJ9LCAgey02OSwgMTR9LCB7LTM0LCAxNX0sCisgICAgIHsxNywgMTZ9LCAgey0xOSwgMTh9LCAgey0zMywgLTM1fSwgey01NCwgMTl9LCB7LTUzLCAyMH0sIHstMywgMjF9LAorICAgICB7LTY4LCAyMn0sIHstODQsIDIzfSwgIHstNTAsIDI0fSwgIHstNTIsIDI1fSwgey01MSwgMjZ9LCB7LTIwLCAtMzZ9LAorICAgICB7LTQ5LCAyN30sIHstMzgsIDI4fSwgIHstMzcsIDI5fSwgIHstNCwgLTgzfSwgey02NywgMzB9LCB7LTY2LCAzMX0sCisgICAgIHstMjEsIDMyfSwgey0yMiwgLTY1fSwgey01LCAzM30sICAgey04MiwgMzR9LCB7LTYsIC04MX19LAorICAgIHt7MiwgMX0sICAgICB7NCwgM30sICAgICAgey0xMjAsIDV9LCAgIHs3LCA2fSwgICAgICB7OSwgOH0sICAgICB7LTEsIDEwfSwKKyAgICAgey0xOCwgMTF9LCAgey0xNywgMTJ9LCAgIHstMiwgLTEwNH0sICB7LTExOSwgMTN9LCAgezE1LCAxNH0sICAgey0xMDMsIDE2fSwKKyAgICAgezE4LCAxN30sICAgey0zNCwgMTl9LCAgIHstMTksIDIwfSwgICB7MjIsIDIxfSwgICAgey0zNSwgMjN9LCAgey0zMywgMjR9LAorICAgICB7LTg4LCAyNX0sICB7LTg3LCAyNn0sICAgezI4LCAyN30sICAgIHstMywgLTEwMn0sICB7LTg2LCAyOX0sICB7LTUyLCAtMTE4fSwKKyAgICAgezMxLCAzMH0sICAgey01MCwgMzJ9LCAgIHstNTEsIDMzfSwgICB7LTcwLCAzNH0sICAgey0zNiwgMzV9LCAgey04NSwgMzZ9LAorICAgICB7LTIwLCAzN30sICB7MzksIDM4fSwgICAgey02OSwgLTcxfSwgIHstNzIsIDQwfSwgICB7LTQ5LCAtNjd9LCB7NDIsIDQxfSwKKyAgICAgey02OCwgNDN9LCAgey00LCAtMTAxfSwgIHstNTMsIC0xMTd9LCB7LTM3LCA0NH0sICAgey02NiwgNDV9LCAgey01NSwgNDZ9LAorICAgICB7NDgsIDQ3fSwgICB7LTU0LCA0OX0sICAgey0yMSwgNTB9LCAgIHstODQsIC0xMDB9LCB7LTU2LCAtNjV9LCB7NTIsIDUxfSwKKyAgICAgey04MiwgLTgzfSwgezU0LCA1M30sICAgIHstNSwgLTExNn0sICB7LTIyLCA1NX0sICAgey0zOCwgNTZ9LCAgey0zOSwgLTQwfSwKKyAgICAgezU4LCA1N30sICAgey04MSwgLTExNX0sIHstOTgsIC05OX0sICB7LTYsIDU5fSwgICAgey0yMywgNjB9LCAgey0yNCwgNjF9LAorICAgICB7LTcsIC05N30sICB7LTExNCwgNjJ9LCAgey04LCAtMTEzfX0sCisgICAge3syLCAxfSwgICAgICAgezQsIDN9LCAgICAgIHstMTU0LCA1fSwgICAgezcsIDZ9LCAgICAgIHs5LCA4fSwKKyAgICAgezExLCAxMH0sICAgICB7LTEsIDEyfSwgICAgey0xOCwgMTN9LCAgICB7LTE3LCAxNH0sICAgey0yLCAtMTM4fSwKKyAgICAgezE2LCAxNX0sICAgICB7LTE1MywgMTd9LCAgey0xMzcsIDE4fSwgICB7MjAsIDE5fSwgICAgezIyLCAyMX0sCisgICAgIHstMzQsIDIzfSwgICAgey0xOSwgMjR9LCAgIHstMzUsIDI1fSwgICAgezI3LCAyNn0sICAgIHsyOSwgMjh9LAorICAgICB7LTEyMSwgMzB9LCAgIHstMTIwLCAzMX0sICB7LTEzNiwgMzJ9LCAgIHstMzMsIC0xMjJ9LCB7MzQsIDMzfSwKKyAgICAgey0xNTIsIDM1fSwgICB7LTMsIDM2fSwgICAgey01MSwgMzd9LCAgICB7LTUyLCAzOH0sICAgey02OSwgMzl9LAorICAgICB7LTM2LCA0MH0sICAgIHstNTAsIDQxfSwgICB7NDMsIDQyfSwgICAgIHstMjAsIDQ0fSwgICB7LTEwNCwgNDV9LAorICAgICB7LTEwMywgNDZ9LCAgIHstODcsIDQ3fSwgICB7LTExOSwgNDh9LCAgIHstMTA1LCA0OX0sICB7LTg2LCA1MH0sCisgICAgIHstMTAyLCA1MX0sICAgey0xMDYsIDUyfSwgIHstNDksIC0xMzV9LCAgey02OCwgNTN9LCAgIHs1NSwgNTR9LAorICAgICB7LTUzLCA1Nn0sICAgIHstNjcsIC0xNTF9LCB7LTQsIDU3fSwgICAgIHstODQsIDU4fSwgICB7LTg1LCA1OX0sCisgICAgIHstNjYsIDYwfSwgICAgey0zNywgNjF9LCAgIHstNzAsIDYyfSwgICAgey01NCwgLTg4fSwgIHstMjEsIDYzfSwKKyAgICAgezY1LCA2NH0sICAgICB7LTg5LCA2Nn0sICAgey0xMTgsIDY3fSwgICB7LTcyLCA2OH0sICAgey05MCwgNjl9LAorICAgICB7LTcxLCA3MH0sICAgIHstNjUsIC0xMzR9LCB7LTE1MCwgNzF9LCAgIHstODMsIDcyfSwgICB7LTUsIDczfSwKKyAgICAgey0xMDEsIC0xMTd9LCB7LTgyLCA3NH0sICAgezc2LCA3NX0sICAgICB7LTk5LCA3N30sICAgey0zOCwgNzh9LAorICAgICB7LTEwMCwgNzl9LCAgIHstMjIsIDgwfSwgICB7LTczLCA4MX0sICAgIHstMzksIC03NH0sICB7ODMsIDgyfSwKKyAgICAgey01NSwgLTgxfSwgICB7LTU3LCA4NH0sICAgey0xMzMsIC0xNDl9LCB7LTU2LCA4NX0sICAgey02LCA4Nn0sCisgICAgIHstOTgsIDg3fSwgICAgey0xMzIsIDg4fSwgIHstMjMsIDg5fSwgICAgey0xMTQsIDkwfSwgIHstMTE2LCA5MX0sCisgICAgIHstNTgsIC0xMTV9LCAgey0yNCwgOTJ9LCAgIHstOTcsIC0xNDh9LCAgey00MCwgLTQxfSwgIHstNywgLTQyfSwKKyAgICAgey0xNDcsIDkzfSwgICB7OTUsIDk0fSwgICAgey0xMzEsIDk2fSwgICB7LTgsIC0xMzB9LCAgey0yNSwgLTExM30sCisgICAgIHstOSwgOTd9LCAgICAgey0yNiwgLTEyOX0sIHstMTQ2LCA5OH0sICAgey0xMCwgLTE0NX19fTsKKworY29uc3QgSFVGRl9DTERfTk9ERVMgRkRLX2h1ZmZDTEROb2RlcyA9IHsKKyAgICB7JkZES19odWZmQ0xETm9kZXNfaDFEXzAsICZGREtfaHVmZkNMRE5vZGVzX2gxRF8xLCAmRkRLX2h1ZmZDTEROb2Rlc19oMURfMX0sCisgICAge3smRkRLX2h1ZmZDTEROb2Rlc19oMl8wXzAsICZGREtfaHVmZkNMRE5vZGVzX2gyXzBfMX0sCisgICAgIHsmRkRLX2h1ZmZDTEROb2Rlc19oMl8xXzAsICZGREtfaHVmZkNMRE5vZGVzX2gyXzFfMX0sCisgICAgIHsmRkRLX2h1ZmZDTEROb2Rlc19oMl8wXzEsICZGREtfaHVmZkNMRE5vZGVzX2gyXzBfMX19fTsKKworY29uc3QgSFVGRl9SRVNfTk9ERVMgRkRLX2h1ZmZSZXNoYXBlTm9kZXMgPSB7CisgICAge3syLCAxfSwgICAgezQsIDN9LCAgICAgezYsIDV9LCAgICAgey0zMywgN30sICB7LTE3LCA4fSwgIHstNDksIDl9LAorICAgICB7LTM0LCAxMH0sIHsxMiwgMTF9LCAgIHstMTgsIC0zNX0sIHstNTAsIDEzfSwgezE1LCAxNH0sICB7LTQwLCAxNn0sCisgICAgIHstMzYsIDE3fSwgey0xOSwgMTh9LCAgey0xLCAtMzd9LCAgey01MSwgMTl9LCB7MjEsIDIwfSwgIHstMzgsIC02NX0sCisgICAgIHstMiwgLTM5fSwgey0yMCwgMjJ9LCAgey01MiwgMjN9LCAgezI1LCAyNH0sICB7LTIxLCAyNn0sIHstNjYsIDI3fSwKKyAgICAgey01MywgMjh9LCB7LTMsIDI5fSwgICB7MzEsIDMwfSwgICB7LTIyLCAzMn0sIHstNTQsIDMzfSwgey00LCAzNH0sCisgICAgIHstNTYsIDM1fSwgey0yNCwgLTY3fSwgey0yMywgLTU1fSwgey04LCAtNzJ9LCB7LTUsIDM2fSwgIHstNjgsIDM3fSwKKyAgICAgey02LCAzOH0sICB7LTcsIC02OX0sICB7LTcwLCAtNzF9fX07CisKK2NvbnN0IEhVRkZfSVBEX05PREVTIEZES19odWZmSVBETm9kZXMgPSB7CisgICAge3t7ey0xLCAxfSwgey04LCAyfSwgey0yLCAzfSwgezUsIDR9LCB7LTMsIC03fSwgey02LCA2fSwgey00LCAtNX19fSwKKyAgICAge3t7LTEsIDF9LCB7LTIsIDJ9LCB7LTgsIDN9LCB7LTMsIDR9LCB7LTcsIDV9LCB7LTQsIDZ9LCB7LTUsIC02fX19LAorICAgICB7e3stMSwgMX0sIHstOCwgMn0sIHstMiwgM30sIHs1LCA0fSwgey0zLCAtN30sIHstNiwgNn0sIHstNCwgLTV9fX19LAorICAgIHt7e3t7LTEsIDF9LCB7LTE4LCAyfSwgey0xNywgMH19LAorICAgICAgIHt7LTEsIDF9LAorICAgICAgICB7LTM2LCAyfSwKKyAgICAgICAgey0xOCwgM30sCisgICAgICAgIHstMzUsIDR9LAorICAgICAgICB7LTUyLCA1fSwKKyAgICAgICAgezcsIDZ9LAorICAgICAgICB7LTM0LCA4fSwKKyAgICAgICAgey0zMywgLTQ5fSwKKyAgICAgICAgey0yMCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH19LAorICAgICAgIHt7LTEsIDF9LCAgICB7MywgMn0sICAgIHs1LCA0fSwgICAgIHstODYsIDZ9LCAgIHstNjYsIDd9LCAgezksIDh9LAorICAgICAgICB7MTEsIDEwfSwgICB7LTE4LCAxMn0sIHstNTEsIDEzfSwgIHstMzcsIC01Mn0sIHstNjksIDE0fSwgey0zOCwgMTV9LAorICAgICAgICB7LTUzLCAxNn0sICB7LTM1LCAxN30sIHstNTAsIC03MH0sIHstMjIsIC00OX0sIHstMzMsIDE4fSwgey0xNywgMTl9LAorICAgICAgICB7LTM0LCAtNjV9LCB7LTgxLCAyMH0sIHstNTQsIDB9LCAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfX0sCisgICAgICAge3syLCAxfSwgICAgezQsIDN9LCAgICAgICB7LTEsIDV9LCAgICB7LTY5LCA2fSwgICB7LTEyMCwgN30sIHstNjgsIDh9LAorICAgICAgICB7MTAsIDl9LCAgIHsxMiwgMTF9LCAgICAgezE0LCAxM30sICAgey01MiwgLTU0fSwgey0xOCwgMTV9LCB7LTcwLCAxNn0sCisgICAgICAgIHstNjcsIDE3fSwgezE5LCAxOH0sICAgICB7LTE3LCAyMH0sICB7LTExMywgMjF9LCB7MjMsIDIyfSwgIHstODMsIDI0fSwKKyAgICAgICAgey0yNCwgMjV9LCB7LTEwMywgLTEwNH0sIHstNTEsIC01NX0sIHsyNywgMjZ9LCAgIHstNzEsIDI4fSwgey04NiwgMjl9LAorICAgICAgICB7LTM1LCAzMH0sIHstNjYsIDMxfSwgICAgey0zOSwgLTUwfSwgey04MiwgLTk4fSwgey03MiwgMzJ9LCB7LTU2LCAtODd9LAorICAgICAgICB7LTM0LCAzM30sIHstMzMsIC04OH0sICAgey00MCwgLTk3fSwgey02NSwgMzR9LCAgey00OSwgMzV9LCB7LTgxLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9fX0sCisgICAgICB7e3stMSwgMX0sIHstMTgsIDJ9LCB7LTE3LCAwfX0sCisgICAgICAge3stMSwgMX0sCisgICAgICAgIHstMzYsIDJ9LAorICAgICAgICB7LTE4LCAzfSwKKyAgICAgICAgey0zNSwgNH0sCisgICAgICAgIHstNTIsIDV9LAorICAgICAgICB7NywgNn0sCisgICAgICAgIHstMzQsIDh9LAorICAgICAgICB7LTMzLCAtNDl9LAorICAgICAgICB7LTIwLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfX0sCisgICAgICAge3stMSwgMX0sICAgIHszLCAyfSwgICAgezUsIDR9LCAgICAgey04NiwgNn0sICAgey02NiwgN30sICB7OSwgOH0sCisgICAgICAgIHsxMSwgMTB9LCAgIHstMTgsIDEyfSwgey01MSwgMTN9LCAgey0zNywgLTUyfSwgey02OSwgMTR9LCB7LTM4LCAxNX0sCisgICAgICAgIHstNTMsIDE2fSwgIHstMzUsIDE3fSwgey01MCwgLTcwfSwgey0yMiwgLTQ5fSwgey0zMywgMTh9LCB7LTE3LCAxOX0sCisgICAgICAgIHstMzQsIC02NX0sIHstODEsIDIwfSwgey01NCwgMH0sICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9fSwKKyAgICAgICB7ezIsIDF9LCAgICB7NCwgM30sICAgICAgIHstMSwgNX0sICAgIHstNjksIDZ9LCAgIHstMTIwLCA3fSwgey02OCwgOH0sCisgICAgICAgIHsxMCwgOX0sICAgezEyLCAxMX0sICAgICB7MTQsIDEzfSwgICB7LTUyLCAtNTR9LCB7LTE4LCAxNX0sIHstNzAsIDE2fSwKKyAgICAgICAgey02NywgMTd9LCB7MTksIDE4fSwgICAgIHstMTcsIDIwfSwgIHstMTEzLCAyMX0sIHsyMywgMjJ9LCAgey04MywgMjR9LAorICAgICAgICB7LTI0LCAyNX0sIHstMTAzLCAtMTA0fSwgey01MSwgLTU1fSwgezI3LCAyNn0sICAgey03MSwgMjh9LCB7LTg2LCAyOX0sCisgICAgICAgIHstMzUsIDMwfSwgey02NiwgMzF9LCAgICB7LTM5LCAtNTB9LCB7LTgyLCAtOTh9LCB7LTcyLCAzMn0sIHstNTYsIC04N30sCisgICAgICAgIHstMzQsIDMzfSwgey0zMywgLTg4fSwgICB7LTQwLCAtOTd9LCB7LTY1LCAzNH0sICB7LTQ5LCAzNX0sIHstODEsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH19fX0sCisgICAgIHt7e3stMSwgMX0sIHstMTgsIDJ9LCB7LTE3LCAwfX0sCisgICAgICAge3stMSwgMX0sCisgICAgICAgIHszLCAyfSwKKyAgICAgICAgey0xOCwgNH0sCisgICAgICAgIHstNTIsIDV9LAorICAgICAgICB7LTM0LCAtMzZ9LAorICAgICAgICB7LTM1LCA2fSwKKyAgICAgICAgey0xNywgN30sCisgICAgICAgIHstMzMsIDh9LAorICAgICAgICB7LTIwLCA5fSwKKyAgICAgICAgey00OSwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9fSwKKyAgICAgICB7ey0xLCAxfSwgICAgezMsIDJ9LCAgIHstNTIsIDR9LCAgIHstODYsIDV9LCB7LTM1LCA2fSwgICB7LTUzLCA3fSwKKyAgICAgICAgey03MCwgOH0sICAgey0xNywgOX0sIHstMzcsIDEwfSwgIHsxMiwgMTF9LCB7LTM4LCAtNjZ9LCB7LTE4LCAxM30sCisgICAgICAgIHstNTEsIDE0fSwgIHsxNiwgMTV9LCB7LTM0LCAtNjl9LCB7MTgsIDE3fSwgey01NCwgLTY1fSwgey01MCwgMTl9LAorICAgICAgICB7LTMzLCAtNDl9LCB7LTIyLCAwfSwgezAsIDB9LCAgICAgezAsIDB9LCAgIHswLCAwfSwgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgIHswLCAwfSwgICAgIHswLCAwfSwgICB7MCwgMH0sICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICB7MCwgMH0sICAgICB7MCwgMH0sICAgezAsIDB9fSwKKyAgICAgICB7ey0xLCAxfSwgICAgey02OSwgMn0sICAgezQsIDN9LCAgICAgey0xMjAsIDV9LCAgezcsIDZ9LCAgICAgey0xMTMsIDh9LAorICAgICAgICB7LTY4LCA5fSwgICB7MTEsIDEwfSwgICB7LTE3LCAxMn0sICB7LTUyLCAxM30sICB7LTI0LCAxNH0sICB7LTE4LCAxNX0sCisgICAgICAgIHsxNywgMTZ9LCAgIHstMTA0LCAxOH0sIHsyMCwgMTl9LCAgIHstNTQsIC03MH0sIHsyMiwgMjF9LCAgIHsyNCwgMjN9LAorICAgICAgICB7LTg2LCAtOTd9LCB7LTEwMywgMjV9LCB7LTgzLCAyNn0sICB7LTM1LCAyN30sICB7LTM0LCAtOTh9LCB7LTQwLCAyOH0sCisgICAgICAgIHstMzksIC02N30sIHszMCwgMjl9LCAgIHstMzMsIC01MX0sIHstODcsIDMxfSwgIHstODgsIDMyfSwgIHstODIsIDMzfSwKKyAgICAgICAgey01NSwgLTgxfSwgey01NiwgLTcxfSwgey03MiwgMzR9LCAgey01MCwgLTY2fSwgey02NSwgMzV9LCAgey00OSwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9fX0sCisgICAgICB7e3stMSwgMX0sIHstMTgsIDJ9LCB7LTE3LCAwfX0sCisgICAgICAge3stMSwgMX0sCisgICAgICAgIHszLCAyfSwKKyAgICAgICAgey0xOCwgNH0sCisgICAgICAgIHstNTIsIDV9LAorICAgICAgICB7LTM0LCAtMzZ9LAorICAgICAgICB7LTM1LCA2fSwKKyAgICAgICAgey0xNywgN30sCisgICAgICAgIHstMzMsIDh9LAorICAgICAgICB7LTIwLCA5fSwKKyAgICAgICAgey00OSwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9fSwKKyAgICAgICB7ey0xLCAxfSwgICAgezMsIDJ9LCAgIHstNTIsIDR9LCAgIHstODYsIDV9LCB7LTM1LCA2fSwgICB7LTUzLCA3fSwKKyAgICAgICAgey03MCwgOH0sICAgey0xNywgOX0sIHstMzcsIDEwfSwgIHsxMiwgMTF9LCB7LTM4LCAtNjZ9LCB7LTE4LCAxM30sCisgICAgICAgIHstNTEsIDE0fSwgIHsxNiwgMTV9LCB7LTM0LCAtNjl9LCB7MTgsIDE3fSwgey01NCwgLTY1fSwgey01MCwgMTl9LAorICAgICAgICB7LTMzLCAtNDl9LCB7LTIyLCAwfSwgezAsIDB9LCAgICAgezAsIDB9LCAgIHswLCAwfSwgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgIHswLCAwfSwgICAgIHswLCAwfSwgICB7MCwgMH0sICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICB7MCwgMH0sICAgICB7MCwgMH0sICAgezAsIDB9fSwKKyAgICAgICB7ey0xLCAxfSwgICAgey02OSwgMn0sICAgezQsIDN9LCAgICAgey0xMjAsIDV9LCAgezcsIDZ9LCAgICAgey0xMTMsIDh9LAorICAgICAgICB7LTY4LCA5fSwgICB7MTEsIDEwfSwgICB7LTE3LCAxMn0sICB7LTUyLCAxM30sICB7LTI0LCAxNH0sICB7LTE4LCAxNX0sCisgICAgICAgIHsxNywgMTZ9LCAgIHstMTA0LCAxOH0sIHsyMCwgMTl9LCAgIHstNTQsIC03MH0sIHsyMiwgMjF9LCAgIHsyNCwgMjN9LAorICAgICAgICB7LTg2LCAtOTd9LCB7LTEwMywgMjV9LCB7LTgzLCAyNn0sICB7LTM1LCAyN30sICB7LTM0LCAtOTh9LCB7LTQwLCAyOH0sCisgICAgICAgIHstMzksIC02N30sIHszMCwgMjl9LCAgIHstMzMsIC01MX0sIHstODcsIDMxfSwgIHstODgsIDMyfSwgIHstODIsIDMzfSwKKyAgICAgICAgey01NSwgLTgxfSwgey01NiwgLTcxfSwgey03MiwgMzR9LCAgey01MCwgLTY2fSwgey02NSwgMzV9LCAgey00OSwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9fX19LAorICAgICB7e3t7LTEsIDF9LCB7LTE4LCAyfSwgey0xNywgMH19LAorICAgICAgIHt7LTEsIDF9LAorICAgICAgICB7LTM2LCAyfSwKKyAgICAgICAgey0xOCwgM30sCisgICAgICAgIHstMzUsIDR9LAorICAgICAgICB7LTUyLCA1fSwKKyAgICAgICAgezcsIDZ9LAorICAgICAgICB7LTM0LCA4fSwKKyAgICAgICAgey0zMywgLTQ5fSwKKyAgICAgICAgey0yMCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH19LAorICAgICAgIHt7LTEsIDF9LCAgICB7MywgMn0sICAgIHs1LCA0fSwgICAgIHstODYsIDZ9LCAgIHstNjYsIDd9LCAgezksIDh9LAorICAgICAgICB7MTEsIDEwfSwgICB7LTE4LCAxMn0sIHstNTEsIDEzfSwgIHstMzcsIC01Mn0sIHstNjksIDE0fSwgey0zOCwgMTV9LAorICAgICAgICB7LTUzLCAxNn0sICB7LTM1LCAxN30sIHstNTAsIC03MH0sIHstMjIsIC00OX0sIHstMzMsIDE4fSwgey0xNywgMTl9LAorICAgICAgICB7LTM0LCAtNjV9LCB7LTgxLCAyMH0sIHstNTQsIDB9LCAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfX0sCisgICAgICAge3syLCAxfSwgICAgezQsIDN9LCAgICAgICB7LTEsIDV9LCAgICB7LTY5LCA2fSwgICB7LTEyMCwgN30sIHstNjgsIDh9LAorICAgICAgICB7MTAsIDl9LCAgIHsxMiwgMTF9LCAgICAgezE0LCAxM30sICAgey01MiwgLTU0fSwgey0xOCwgMTV9LCB7LTcwLCAxNn0sCisgICAgICAgIHstNjcsIDE3fSwgezE5LCAxOH0sICAgICB7LTE3LCAyMH0sICB7LTExMywgMjF9LCB7MjMsIDIyfSwgIHstODMsIDI0fSwKKyAgICAgICAgey0yNCwgMjV9LCB7LTEwMywgLTEwNH0sIHstNTEsIC01NX0sIHsyNywgMjZ9LCAgIHstNzEsIDI4fSwgey04NiwgMjl9LAorICAgICAgICB7LTM1LCAzMH0sIHstNjYsIDMxfSwgICAgey0zOSwgLTUwfSwgey04MiwgLTk4fSwgey03MiwgMzJ9LCB7LTU2LCAtODd9LAorICAgICAgICB7LTM0LCAzM30sIHstMzMsIC04OH0sICAgey00MCwgLTk3fSwgey02NSwgMzR9LCAgey00OSwgMzV9LCB7LTgxLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9fX0sCisgICAgICB7e3stMSwgMX0sIHstMTgsIDJ9LCB7LTE3LCAwfX0sCisgICAgICAge3stMSwgMX0sCisgICAgICAgIHstMzYsIDJ9LAorICAgICAgICB7LTE4LCAzfSwKKyAgICAgICAgey0zNSwgNH0sCisgICAgICAgIHstNTIsIDV9LAorICAgICAgICB7NywgNn0sCisgICAgICAgIHstMzQsIDh9LAorICAgICAgICB7LTMzLCAtNDl9LAorICAgICAgICB7LTIwLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfX0sCisgICAgICAge3stMSwgMX0sICAgIHszLCAyfSwgICAgezUsIDR9LCAgICAgey04NiwgNn0sICAgey02NiwgN30sICB7OSwgOH0sCisgICAgICAgIHsxMSwgMTB9LCAgIHstMTgsIDEyfSwgey01MSwgMTN9LCAgey0zNywgLTUyfSwgey02OSwgMTR9LCB7LTM4LCAxNX0sCisgICAgICAgIHstNTMsIDE2fSwgIHstMzUsIDE3fSwgey01MCwgLTcwfSwgey0yMiwgLTQ5fSwgey0zMywgMTh9LCB7LTE3LCAxOX0sCisgICAgICAgIHstMzQsIC02NX0sIHstODEsIDIwfSwgey01NCwgMH0sICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9fSwKKyAgICAgICB7ezIsIDF9LCAgICB7NCwgM30sICAgICAgIHstMSwgNX0sICAgIHstNjksIDZ9LCAgIHstMTIwLCA3fSwgey02OCwgOH0sCisgICAgICAgIHsxMCwgOX0sICAgezEyLCAxMX0sICAgICB7MTQsIDEzfSwgICB7LTUyLCAtNTR9LCB7LTE4LCAxNX0sIHstNzAsIDE2fSwKKyAgICAgICAgey02NywgMTd9LCB7MTksIDE4fSwgICAgIHstMTcsIDIwfSwgIHstMTEzLCAyMX0sIHsyMywgMjJ9LCAgey04MywgMjR9LAorICAgICAgICB7LTI0LCAyNX0sIHstMTAzLCAtMTA0fSwgey01MSwgLTU1fSwgezI3LCAyNn0sICAgey03MSwgMjh9LCB7LTg2LCAyOX0sCisgICAgICAgIHstMzUsIDMwfSwgey02NiwgMzF9LCAgICB7LTM5LCAtNTB9LCB7LTgyLCAtOTh9LCB7LTcyLCAzMn0sIHstNTYsIC04N30sCisgICAgICAgIHstMzQsIDMzfSwgey0zMywgLTg4fSwgICB7LTQwLCAtOTd9LCB7LTY1LCAzNH0sICB7LTQ5LCAzNX0sIHstODEsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH19fX19fTsKKworc3RhdGljIGNvbnN0IEhVRkZfT0xEX05PRF8xRCBodWZmT0xETm9kZXNfaDFEXzAgPSB7e3stMSwgMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsIDJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMiwgNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0zLCA1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTQsIDZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstNSwgN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey02LCAtOH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey03LCA4fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAsIDl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMiwgMTF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstOSwgLTExfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTEwLCAxM30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xMiwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMTMsIC0xNn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xNCwgLTE1fX19OworCitzdGF0aWMgY29uc3QgSFVGRl9PTERfTk9EXzFEIGh1ZmZPTEROb2Rlc19oMURfMSA9IHt7ey0xLCAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTIsIDJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0LCAzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTMsIDV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstNCwgNn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey01LCA3fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTYsIC04fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTcsIDh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMCwgOX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEyLCAxMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey05LCAxM30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xNiwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMTAsIC0xNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xMSwgLTEyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTEzLCAtMTR9fX07CisKK3N0YXRpYyBjb25zdCBIVUZGX09MRF9OT0RfMkQgaHVmZk9MRE5vZGVzX2gyRF8wXzAgPSB7CisgICAge3syLCAxfSwKKyAgICAgey0xLCAzfSwKKyAgICAgezUsIDR9LAorICAgICB7LTIsIDZ9LAorICAgICB7LTMsIC00fSwKKyAgICAgey0xNywgN30sCisgICAgIHstMTgsIDh9LAorICAgICB7LTE5LCA5fSwKKyAgICAgey0yMCwgMTB9LAorICAgICB7LTUyLCAxMX0sCisgICAgIHstMzMsIDEyfSwKKyAgICAgey0zNCwgLTM1fSwKKyAgICAgey0zNiwgMTN9LAorICAgICB7LTUxLCAxNH0sCisgICAgIHstNDksIC01MH19LAorICAgIHt7LTEsIDF9LCAgICB7MywgMn0sICAgICB7NSwgNH0sICAgICB7NywgNn0sICAgICAgey0xMDMsIDh9LCB7MTAsIDl9LAorICAgICB7MTIsIDExfSwgICB7LTE4LCAxM30sICB7MTUsIDE0fSwgICB7LTIsIDE2fSwgICAgey04NiwgMTd9LCB7LTM1LCAxOH0sCisgICAgIHsyMCwgMTl9LCAgIHstMTAyLCAyMX0sIHsyMywgMjJ9LCAgIHstNjksIDI0fSwgICB7LTg3LCAyNX0sIHstMywgMjZ9LAorICAgICB7LTE3LCAyN30sICB7LTE5LCAyOH0sICB7LTUyLCAyOX0sICB7LTM0LCAtMTAxfSwgezMxLCAzMH0sICB7LTg1LCAzMn0sCisgICAgIHszNCwgMzN9LCAgIHstMjAsIC03MH0sIHstNCwgMzV9LCAgIHstNzEsIC0xMDB9LCB7LTUsIC0zM30sIHstNTAsIDM2fSwKKyAgICAgey0zNiwgLTU1fSwgey01NCwgLTg0fSwgezM4LCAzN30sICAgey01MSwgLTUzfSwgIHstMjEsIDM5fSwgey02LCAtOTl9LAorICAgICB7LTM3LCAtNjh9LCB7LTgzLCA0MH0sICB7LTcsIC00OX0sICB7LTIyLCAtOTh9LCAgezQyLCA0MX0sICB7NDQsIDQzfSwKKyAgICAgey02NiwgNDV9LCAgey02NywgNDZ9LCAgey0zOCwgLTM5fSwgey02NSwgLTgyfSwgIHstMjMsIDQ3fSwgey04MSwgLTk3fX0sCisgICAge3stMSwgMX0sICAgICB7MywgMn0sICAgICAgIHs1LCA0fSwgICAgICB7NywgNn0sICAgICAgezksIDh9LAorICAgICB7MTEsIDEwfSwgICAgezEzLCAxMn0sICAgICB7MTUsIDE0fSwgICAgey0xNTQsIDE2fSwgIHstMTAzLCAxN30sCisgICAgIHsxOSwgMTh9LCAgICB7MjEsIDIwfSwgICAgIHstMTgsIDIyfSwgICB7MjQsIDIzfSwgICAgezI2LCAyNX0sCisgICAgIHsyOCwgMjd9LCAgICB7LTEzNywgMjl9LCAgIHszMSwgMzB9LCAgICB7LTIsIC01MX0sICAgezMzLCAzMn0sCisgICAgIHstMzUsIDM0fSwgICB7LTI2LCAzNX0sICAgIHszNywgMzZ9LCAgICB7LTgsIDM4fSwgICAgey03MCwgLTE1M30sCisgICAgIHs0MCwgMzl9LCAgICB7LTEyMCwgNDF9LCAgIHstNTIsIDQyfSwgICB7NDQsIDQzfSwgICAgey0zLCAtMTM4fSwKKyAgICAgezQ2LCA0NX0sICAgIHs0OCwgNDd9LCAgICAgey0zNCwgNDl9LCAgIHstNywgNTB9LCAgICB7LTE5LCA1MX0sCisgICAgIHstMTcsIDUyfSwgICB7LTE1MiwgNTN9LCAgIHstNCwgLTE1MX0sICB7LTMzLCA1NH0sICAgey0xMDYsIDU1fSwKKyAgICAgey01MywgLTEyMn0sIHstMTA1LCAtMTM2fSwgey0xMjEsIDU2fSwgIHstMTA0LCA1N30sICB7LTUwLCAtMTE4fSwKKyAgICAgey0yMCwgNTh9LCAgIHstNSwgNTl9LCAgICAgey0zOCwgNjB9LCAgIHstMTMzLCA2MX0sICB7LTE0OCwgNjJ9LAorICAgICB7LTIzLCAtMTM1fSwgey0zNiwgNjN9LCAgICB7LTYsIDY0fSwgICAgezY2LCA2NX0sICAgIHstMjEsIC0xNTB9LAorICAgICB7NjgsIDY3fSwgICAgey00OSwgNjl9LCAgICB7LTEzNCwgNzB9LCAgey0xMTksIDcxfSwgIHstMzcsIDcyfSwKKyAgICAgey0xNDksIDczfSwgIHstOSwgNzR9LCAgICAgey02OSwgNzV9LCAgIHstODYsIDc2fSwgICB7LTIyLCA3N30sCisgICAgIHstNjgsIDc4fSwgICB7ODAsIDc5fSwgICAgIHs4MiwgODF9LCAgICB7ODQsIDgzfSwgICAgey04OCwgODV9LAorICAgICB7LTEzMiwgODZ9LCAgey05MCwgODd9LCAgICB7LTEwLCAtMTE3fSwgey02NywgODh9LCAgIHstNzEsIDg5fSwKKyAgICAgey04NywgOTB9LCAgIHstNTQsIC02Nn0sICAgey0yNSwgOTF9LCAgIHstODksIDkyfSwgICB7LTcyLCA5M30sCisgICAgIHstMTMxLCA5NH0sICB7LTExMywgLTExNX0sIHstOTksIDk1fSwgICB7LTczLCAtMTE2fSwgey0yNCwgLTg1fSwKKyAgICAgey04NCwgLTEwMn0sIHstMzksIDk2fSwgICAgey01NSwgLTk4fSwgIHstODEsIC05N30sICB7LTgyLCAtODN9LAorICAgICB7LTExNCwgOTd9LCAgey0xNDYsIC0xNDd9LCB7LTQyLCAtMTAxfSwgey01NywgLTEwMH0sIHstNjUsIC0xMzB9LAorICAgICB7LTc0LCA5OH0sICAgey01NiwgLTU4fSwgICB7LTQwLCAtMTI5fSwgey00MSwgLTE0NX19LAorICAgIHt7MiwgMX0sICAgICAgIHs0LCAzfSwgICAgICAgezYsIDV9LCAgICAgICB7OCwgN30sICAgICAgIHsxMCwgOX0sCisgICAgIHsxMiwgMTF9LCAgICAgey00LCAxM30sICAgICB7LTExLCAtMjh9LCAgIHstMjEsIDE0fSwgICAgey0xLCAxNX0sCisgICAgIHsxNywgMTZ9LCAgICAgezE5LCAxOH0sICAgICB7LTM4LCAyMH0sICAgIHsyMiwgMjF9LCAgICAgezI0LCAyM30sCisgICAgIHsyNiwgMjV9LCAgICAgezI4LCAyN30sICAgICB7LTU0LCAyOX0sICAgIHszMSwgMzB9LCAgICAgey00NCwgMzJ9LAorICAgICB7LTQ1LCAzM30sICAgIHstMzcsIDM0fSwgICAgey01LCAzNX0sICAgICB7LTI3LCAzNn0sICAgIHszOCwgMzd9LAorICAgICB7NDAsIDM5fSwgICAgIHstNTMsIDQxfSwgICAgey0xMiwgNDJ9LCAgICB7LTIyLCA0M30sICAgIHstMjAsIDQ0fSwKKyAgICAgey0zNiwgNDV9LCAgICB7LTQzLCA0Nn0sICAgIHstNiwgNDd9LCAgICAgey0yMDUsIDQ4fSwgICB7LTUxLCAtNTJ9LAorICAgICB7LTM1LCA0OX0sICAgIHstMzQsIDUwfSwgICAgey0xMywgNTF9LCAgICB7LTQyLCA1Mn0sICAgIHstMjksIDUzfSwKKyAgICAgey0xOCwgLTQxfSwgICB7NTUsIDU0fSwgICAgIHstMTcsIC0yNn0sICAgey0xOSwgNTZ9LCAgICB7LTcsIDU3fSwKKyAgICAgey0yMywgLTE4OH0sICB7NTksIDU4fSwgICAgIHstMTAsIDYwfSwgICAgezYyLCA2MX0sICAgICB7LTM5LCA2M30sCisgICAgIHstMzMsIDY0fSwgICAgey0yLCA2NX0sICAgICB7LTIwNCwgNjZ9LCAgIHs2OCwgNjd9LCAgICAgey0xODksIDY5fSwKKyAgICAgey0xNzEsIDcwfSwgICB7NzIsIDcxfSwgICAgIHs3NCwgNzN9LCAgICAgey0yMDMsIDc1fSwgICB7LTMsIC0yNX0sCisgICAgIHstMjQsIDc2fSwgICAgezc4LCA3N30sICAgICB7ODAsIDc5fSwgICAgIHs4MiwgODF9LCAgICAgey0xNzMsIDgzfSwKKyAgICAgey0xNzIsIC0xODd9LCB7ODUsIDg0fSwgICAgIHstODYsIDg2fSwgICAgey01MCwgODd9LCAgICB7LTIwMiwgODh9LAorICAgICB7OTAsIDg5fSwgICAgIHstMTU0LCA5MX0sICAgezkzLCA5Mn0sICAgICB7LTEyMCwgOTR9LCAgIHs5NiwgOTV9LAorICAgICB7LTE4NiwgOTd9LCAgIHs5OSwgOTh9LCAgICAgey02OSwgMTAwfSwgICB7LTE1NiwgLTE1N30sIHsxMDIsIDEwMX0sCisgICAgIHsxMDQsIDEwM30sICAgey0xNzAsIC0yMDF9LCB7LTEwMywgMTA1fSwgIHsxMDcsIDEwNn0sICAgey0xNTUsIDEwOH0sCisgICAgIHstMTM3LCAxMDl9LCAgey0xODUsIDExMH0sICB7LTQ5LCAxMTF9LCAgIHstOCwgMTEyfSwgICAgey02NiwgMTEzfSwKKyAgICAgey02NywgMTE0fSwgICB7MTE2LCAxMTV9LCAgIHstMTY5LCAxMTd9LCAgey0xNDEsIDExOH0sICB7MTIwLCAxMTl9LAorICAgICB7MTIyLCAxMjF9LCAgIHstMjAwLCAxMjN9LCAgey02OCwgLTEyMX0sICB7MTI1LCAxMjR9LCAgIHstMTM2LCAxMjZ9LAorICAgICB7LTE0MCwgMTI3fSwgIHstNzEsIDEyOH0sICAgey0xMzksIDEyOX0sICB7LTE1MSwgLTE4NH0sIHstODIsIDEzMH0sCisgICAgIHstNTYsIC0xMDF9LCAgezEzMiwgMTMxfSwgICB7LTksIC0xNTN9LCAgIHstNDAsIDEzM30sICAgey0xMzgsIDEzNH0sCisgICAgIHstODMsIC0xOTl9LCAgey04NCwgMTM1fSwgICB7LTkwLCAtMTY4fSwgIHstNjUsIC05MX0sICAgey0xMDIsIDEzNn0sCisgICAgIHstMTM1LCAtMTY2fSwgey03MiwgLTE4M30sICB7LTg3LCAtMTUwfSwgIHstMTgxLCAxMzd9LCAgey0xMjUsIDEzOH0sCisgICAgIHstNTUsIC03MH0sICAgey04NSwgLTE1Mn0sICB7LTEwNiwgLTEyNH0sIHstODksIC0xMjN9LCAgey0xOTgsIDEzOX0sCisgICAgIHstNTcsIDE0MH0sICAgey0xMDUsIDE0MX0sICB7LTE2NywgLTE5Nn0sIHstODEsIC0xMjJ9LCAgey0xODIsIDE0Mn0sCisgICAgIHstOTksIC0xODB9LCAgey0xMDAsIC0xMDR9LCB7LTExNiwgLTE2NX0sIHstOTgsIDE0M30sICAgey0xMTcsIC0xMTl9LAorICAgICB7LTg4LCAtMTM0fSwgIHstMTk3LCAxNDR9LCAgey03MywgLTE5NX0sICB7LTkyLCAtMTQ5fSwgIHstMTE4LCAtMTY0fSwKKyAgICAgey01OCwgLTEwOH0sICB7LTEwNywgLTE3OX0sIHstMTA5LCAxNDV9LCAgey05MywgLTk3fSwgICB7LTExNSwgLTE5NH0sCisgICAgIHstMTE0LCAxNDZ9LCAgey0xMTMsIDE0N30sICB7MTQ5LCAxNDh9LCAgIHsxNTEsIDE1MH0sICAgezE1MywgMTUyfSwKKyAgICAgezE1NSwgMTU0fSwgICB7MTU3LCAxNTZ9LCAgIHsxNTksIDE1OH0sICAgezE2MSwgMTYwfSwgICB7MTYzLCAxNjJ9LAorICAgICB7MTY1LCAxNjR9LCAgIHsxNjcsIDE2Nn0sICAgey0xNzgsIC0xOTN9LCB7LTE2MywgLTE3N30sIHstMTYxLCAtMTYyfSwKKyAgICAgey0xNDcsIC0xNDh9LCB7LTE0NSwgLTE0Nn0sIHstMTMyLCAtMTMzfSwgey0xMzAsIC0xMzF9LCB7LTc3LCAtMTI5fSwKKyAgICAgey03NSwgLTc2fSwgICB7LTYxLCAtNzR9LCAgIHstNTksIC02MH19fTsKKworc3RhdGljIGNvbnN0IEhVRkZfT0xEX05PRF8yRCBodWZmT0xETm9kZXNfaDJEXzBfMSA9IHsKKyAgICB7ey0xLCAxfSwKKyAgICAgezMsIDJ9LAorICAgICB7NSwgNH0sCisgICAgIHstNTIsIDZ9LAorICAgICB7LTQ5LCA3fSwKKyAgICAgezksIDh9LAorICAgICB7LTE3LCAxMH0sCisgICAgIHstMzYsIDExfSwKKyAgICAgey0xOCwgMTJ9LAorICAgICB7LTIsIC0zfSwKKyAgICAgey0zNSwgMTN9LAorICAgICB7LTM0LCAtNTB9LAorICAgICB7LTQsIC0zM30sCisgICAgIHstMjAsIDE0fSwKKyAgICAgey0xOSwgLTUxfX0sCisgICAge3stMSwgMX0sICAgICB7MywgMn0sICAgIHstMTAzLCA0fSwgICB7NiwgNX0sICAgICB7OCwgN30sICAgIHstMTgsIDl9LAorICAgICB7MTEsIDEwfSwgICAgey04NywgMTJ9LCB7LTE3LCAxM30sICAgezE1LCAxNH0sICAgey04NiwgMTZ9LCB7MTgsIDE3fSwKKyAgICAgey03MSwgMTl9LCAgIHsyMSwgMjB9LCAgey0zMywgLTM1fSwgIHstMzQsIDIyfSwgIHstNTUsIDIzfSwgey0yLCAyNH0sCisgICAgIHstNTAsIC0xMDJ9LCB7MjYsIDI1fSwgIHstNDksIDI3fSwgICB7LTY5LCAtNzB9LCB7LTM5LCAyOH0sIHstNjUsIDI5fSwKKyAgICAgey02NiwgMzB9LCAgIHstNTQsIDMxfSwgey0xOSwgMzJ9LCAgIHstMjMsIC01Mn0sIHstNTEsIDMzfSwgey04MSwgMzR9LAorICAgICB7LTgyLCAzNX0sICAgey0zLCAtMzh9LCB7LTg1LCAtMTAxfSwgey02NywgLTk3fSwgezM3LCAzNn0sICB7LTIwLCAtNTN9LAorICAgICB7LTM2LCAzOH0sICAgezQwLCAzOX0sICB7LTEwMCwgNDF9LCAgey00LCAtODR9LCAgey02OCwgNDJ9LCB7LTIxLCA0M30sCisgICAgIHstMzcsIDQ0fSwgICB7LTk5LCA0NX0sIHstNSwgLTgzfSwgICB7LTIyLCA0Nn0sICB7LTk4LCA0N30sIHstNiwgLTd9fSwKKyAgICB7ey0xLCAxfSwgICAgezMsIDJ9LCAgICAgICB7NSwgNH0sICAgICAgIHs3LCA2fSwgICAgICAgezksIDh9LAorICAgICB7LTE1NCwgMTB9LCB7MTIsIDExfSwgICAgIHsxNCwgMTN9LCAgICAgey0xOCwgMTV9LCAgICB7MTcsIDE2fSwKKyAgICAgezE5LCAxOH0sICAgezIxLCAyMH0sICAgICB7LTE3LCAyMn0sICAgIHstMTM3LCAyM30sICAgey0zNSwgMjR9LAorICAgICB7LTEzOCwgMjV9LCB7MjcsIDI2fSwgICAgIHstMTEzLCAyOH0sICAgey0zNCwgMjl9LCAgICB7MzEsIDMwfSwKKyAgICAgezMzLCAzMn0sICAgey0xMjIsIDM0fSwgICB7LTMzLCAzNX0sICAgIHstNzMsIDM2fSwgICAgezM4LCAzN30sCisgICAgIHs0MCwgMzl9LCAgIHstMTA2LCA0MX0sICAgey01MiwgNDJ9LCAgICB7LTU4LCAtMTIwfSwgIHstNTAsIDQzfSwKKyAgICAgezQ1LCA0NH0sICAgey00OSwgNDZ9LCAgICB7LTEwLCAtMTAzfSwgIHstMzYsIDQ3fSwgICAgey01NCwgLTkwfSwKKyAgICAgey01MywgNDh9LCAgey0yLCA0OX0sICAgICB7LTk4LCAtMTUzfSwgIHstMTIxLCA1MH0sICAgey02NiwgNTF9LAorICAgICB7LTY1LCAtNzJ9LCB7LTUxLCA1Mn0sICAgIHstNzQsIDUzfSwgICAgey05LCA1NH0sICAgICB7LTEwNSwgNTV9LAorICAgICB7LTcxLCAtODJ9LCB7LTE5LCAtNTV9LCAgIHstODEsIDU2fSwgICAgezU4LCA1N30sICAgICB7LTgzLCA1OX0sCisgICAgIHstNjgsIC04OH0sIHstODksIC05N30sICAgey03MCwgNjB9LCAgICB7LTMsIDYxfSwgICAgIHstNjcsIDYyfSwKKyAgICAgezY0LCA2M30sICAgey02OSwgNjV9LCAgICB7LTEwNCwgNjZ9LCAgIHstMTM2LCAtMTUyfSwgezY4LCA2N30sCisgICAgIHstOCwgLTI2fSwgIHstMzcsIDY5fSwgICAgey00LCA3MH0sICAgICB7NzIsIDcxfSwgICAgIHstMjIsIDczfSwKKyAgICAgey00MiwgNzR9LCAgey03LCAtMjB9LCAgICB7NzYsIDc1fSwgICAgIHs3OCwgNzd9LCAgICAgey02LCA3OX0sCisgICAgIHstMTE0LCA4MH0sIHstMjUsIC0xMzV9LCAgey0xMTksIC0xNTF9LCB7LTI0LCA4MX0sICAgIHstNTcsIDgyfSwKKyAgICAgey01LCA4M30sICAgey05OSwgODR9LCAgICB7LTIzLCAtMTMwfSwgIHstMTI5LCA4NX0sICAgey0xMTgsIDg2fSwKKyAgICAgey0yMSwgLTQxfSwgey04NiwgODd9LCAgICB7LTExNSwgLTE0NX0sIHstODQsIDg4fSwgICAgey04NywgLTE1MH0sCisgICAgIHstMzgsIC01Nn0sIHstMTM0LCA4OX0sICAgey0xMDAsIDkwfSwgICB7LTg1LCAtMTMzfSwgIHstMTQ5LCA5MX0sCisgICAgIHstMTAyLCA5Mn0sIHstMTE3LCAtMTQ4fSwgezk0LCA5M30sICAgICB7LTM5LCA5NX0sICAgIHstMTAxLCA5Nn0sCisgICAgIHstMTE2LCA5N30sIHstMTMxLCAtMTMyfSwgey00MCwgOTh9LCAgICB7LTE0NiwgLTE0N319LAorICAgIHt7MiwgMX0sICAgICAgIHstMSwgM30sICAgICAgezUsIDR9LCAgICAgICB7NywgNn0sICAgICAgezksIDh9LAorICAgICB7LTIwNSwgMTB9LCAgIHsxMiwgMTF9LCAgICAgezE0LCAxM30sICAgICB7MTYsIDE1fSwgICAgey0xOCwgMTd9LAorICAgICB7MTksIDE4fSwgICAgIHsyMSwgMjB9LCAgICAgezIzLCAyMn0sICAgICB7LTE4OSwgMjR9LCAgey0xODgsIDI1fSwKKyAgICAgezI3LCAyNn0sICAgICB7LTE3LCAyOH0sICAgIHstMTczLCAyOX0sICAgezMxLCAzMH0sICAgIHszMywgMzJ9LAorICAgICB7LTM0LCAtMTU3fSwgIHstMzUsIDM0fSwgICAgey0zMywgMzV9LCAgICB7MzcsIDM2fSwgICAgezM5LCAzOH0sCisgICAgIHs0MSwgNDB9LCAgICAgey01MCwgNDJ9LCAgICB7LTQ5LCA0M30sICAgIHstMTQxLCA0NH0sICB7LTIwNCwgNDV9LAorICAgICB7LTIsIC0xNzF9LCAgIHstMTcyLCA0Nn0sICAgey02NiwgNDd9LCAgICB7NDksIDQ4fSwgICAgezUxLCA1MH0sCisgICAgIHstNjUsIDUyfSwgICAgey0xMjUsIDUzfSwgICB7LTE1NiwgNTR9LCAgIHstODIsIDU1fSwgICB7NTcsIDU2fSwKKyAgICAgezU5LCA1OH0sICAgICB7LTE5LCAtNTJ9LCAgIHs2MSwgNjB9LCAgICAgey04MSwgNjJ9LCAgIHs2NCwgNjN9LAorICAgICB7LTEwOSwgLTE0MH0sIHstNTEsIDY1fSwgICAgezY3LCA2Nn0sICAgICB7LTk4LCA2OH0sICAgezcwLCA2OX0sCisgICAgIHs3MiwgNzF9LCAgICAgey02NywgLTkzfSwgICB7NzQsIDczfSwgICAgIHstMjAzLCA3NX0sICB7LTE1NCwgNzZ9LAorICAgICB7LTEyNCwgNzd9LCAgIHstOTcsIC0xODd9LCAgey0xMTQsIDc4fSwgICB7LTYxLCA3OX0sICAgey0xNTUsIDgwfSwKKyAgICAgezgyLCA4MX0sICAgICB7LTExMywgODN9LCAgIHstMywgLTE0Nn0sICAgey04MywgODR9LCAgIHstMTA4LCA4NX0sCisgICAgIHstMjAsIDg2fSwgICAgey03NiwgODd9LCAgICB7LTQ1LCAtNzd9LCAgIHstMTM5LCA4OH0sICB7OTAsIDg5fSwKKyAgICAgey02OSwgLTEzMH0sICB7LTEyOSwgOTF9LCAgIHstMzYsIDkyfSwgICAgey05OSwgLTE2MX0sIHs5NCwgOTN9LAorICAgICB7LTkyLCAtMTYyfSwgIHstNjgsIDk1fSwgICAgey0yOSwgOTZ9LCAgICB7LTg2LCA5N30sICAgey02MCwgOTh9LAorICAgICB7LTEyMywgLTE3N30sIHstMTQ1LCA5OX0sICAgey05MSwgLTEzMX0sICB7MTAxLCAxMDB9LCAgey0xMzcsIC0xNzh9LAorICAgICB7LTExNSwgMTAyfSwgIHstODQsIC0xMTZ9LCAgey0xNDcsIDEwM30sICB7LTQsIDEwNH0sICAgey0xMDYsIC0yMDJ9LAorICAgICB7MTA2LCAxMDV9LCAgIHstMTMyLCAtMTg2fSwgey0xMDcsIDEwN30sICB7LTE5MywgMTA4fSwgey0xMDAsIC0xMjB9LAorICAgICB7LTc1LCAtMTcwfSwgIHstNDQsIDEwOX0sICAgey0xMjIsIC0xNjN9LCB7LTEzOCwgMTEwfSwgey05MCwgMTExfSwKKyAgICAgey0zNywgMTEyfSwgICB7LTEwMSwgMTEzfSwgIHstMTIxLCAxMTR9LCAgezExNiwgMTE1fSwgIHstMTAzLCAxMTd9LAorICAgICB7LTc0LCAtMjAxfSwgIHstMjEsIC04NX0sICAgey01MywgLTU5fSwgICB7LTExNywgMTE4fSwgey0xNDgsIDExOX0sCisgICAgIHstNSwgMTIwfSwgICAgey0xNjksIDEyMX0sICB7LTEwNSwgLTE4NX0sIHsxMjMsIDEyMn0sICB7LTEwMiwgLTEzM30sCisgICAgIHstMTM2LCAxMjR9LCAgey0xNTMsIDEyNX0sICB7MTI3LCAxMjZ9LCAgIHstNTQsIDEyOH0sICB7MTMwLCAxMjl9LAorICAgICB7LTIyLCAtMTA0fSwgIHstMzgsIDEzMX0sICAgey04OSwgLTExOH0sICB7LTE4NCwgMTMyfSwgey03MSwgMTMzfSwKKyAgICAgey04NywgMTM0fSwgICB7LTcwLCAxMzV9LCAgIHstMjAwLCAxMzZ9LCAgey0xNjgsIDEzN30sIHstMTUyLCAxMzh9LAorICAgICB7LTYsIC0yM30sICAgIHstMzksIDEzOX0sICAgey0xMTksIC0xOTl9LCB7MTQxLCAxNDB9LCAgey01NSwgMTQyfSwKKyAgICAgey03LCAtMTUxfSwgICB7LTE4MywgMTQzfSwgIHsxNDUsIDE0NH0sICAgey0xMzUsIDE0Nn0sIHstNTYsIDE0N30sCisgICAgIHstMTUwLCAxNDh9LCAgey00MCwgMTQ5fSwgICB7LTcyLCAtMTk4fSwgIHstODgsIDE1MH0sICB7LTU3LCAtMTM0fSwKKyAgICAgey00MSwgMTUxfSwgICB7LTE2NiwgLTE2N30sIHstMjUsIC0xNjV9LCAgey05LCAxNTJ9LCAgIHstOCwgLTI0fSwKKyAgICAgey03MywgLTE4MX0sICB7LTE4MiwgMTUzfSwgIHsxNTUsIDE1NH0sICAgey0xOTcsIDE1Nn0sIHstNDIsIC0xODB9LAorICAgICB7MTU4LCAxNTd9LCAgIHstNDMsIC0xNDl9LCAgey0xOTYsIDE1OX0sICB7LTU4LCAtMTY0fSwgey0yNiwgMTYwfSwKKyAgICAgezE2MiwgMTYxfSwgICB7MTY0LCAxNjN9LCAgIHsxNjYsIDE2NX0sICAgey0xOTUsIDE2N30sIHstMTc5LCAtMTk0fSwKKyAgICAgey0yNywgLTI4fSwgICB7LTEyLCAtMTN9LCAgIHstMTAsIC0xMX19fTsKKworc3RhdGljIGNvbnN0IEhVRkZfT0xEX05PRF8yRCBodWZmT0xETm9kZXNfaDJEXzFfMCA9IHsKKyAgICB7ey0xLCAxfSwKKyAgICAgey01MiwgMn0sCisgICAgIHs0LCAzfSwKKyAgICAgey0xOCwgNX0sCisgICAgIHs3LCA2fSwKKyAgICAgey0xNywgOH0sCisgICAgIHstMzYsIDl9LAorICAgICB7LTM1LCAxMH0sCisgICAgIHstMiwgMTF9LAorICAgICB7LTE5LCAxMn0sCisgICAgIHstMzMsIC01MX0sCisgICAgIHstMjAsIC0zNH0sCisgICAgIHsxNCwgMTN9LAorICAgICB7LTMsIC00OX0sCisgICAgIHstNCwgLTUwfX0sCisgICAge3stMSwgMX0sICAgIHszLCAyfSwgICAgezUsIDR9LCAgICAgey0xMDMsIDZ9LCAgezgsIDd9LCAgICAgIHstMTgsIDl9LAorICAgICB7MTEsIDEwfSwgICB7MTMsIDEyfSwgIHstODYsIDE0fSwgIHstODcsIDE1fSwgIHsxNywgMTZ9LCAgICB7LTM1LCAxOH0sCisgICAgIHstMTcsIDE5fSwgIHsyMSwgMjB9LCAgey0zNCwgLTcxfSwgezIzLCAyMn0sICAgey01MCwgLTU1fSwgIHstMzMsIDI0fSwKKyAgICAgey02OSwgMjV9LCAgey0yLCAtNzB9LCB7MjcsIDI2fSwgICB7LTEwMiwgMjh9LCB7LTQ5LCAyOX0sICAgey02NiwgMzB9LAorICAgICB7LTM5LCAtNTR9LCB7LTUyLCAzMX0sIHstNTEsIDMyfSwgIHstNjUsIDMzfSwgIHstMTksIDM0fSwgICB7LTM4LCAtODJ9LAorICAgICB7LTIzLCAtODV9LCB7LTY3LCAzNX0sIHstODEsIDM2fSwgIHstMywgMzd9LCAgIHstNTMsIC0xMDF9LCB7LTIwLCAtOTd9LAorICAgICB7MzksIDM4fSwgICB7LTM2LCA0MH0sIHstODQsIDQxfSwgIHstMTAwLCA0Mn0sIHstNCwgLTY4fSwgICB7LTIxLCA0M30sCisgICAgIHstMzcsIDQ0fSwgIHstODMsIDQ1fSwgey01LCAtOTl9LCAgey0yMiwgNDZ9LCAgey05OCwgNDd9LCAgIHstNiwgLTd9fSwKKyAgICB7ey0xLCAxfSwgICAgICB7MywgMn0sICAgICAgezUsIDR9LCAgICAgIHs3LCA2fSwgICAgICB7OSwgOH0sCisgICAgIHstMTU0LCAxMH0sICAgezEyLCAxMX0sICAgIHsxNCwgMTN9LCAgICB7LTE4LCAxNX0sICAgezE3LCAxNn0sCisgICAgIHstMTEzLCAxOH0sICAgezIwLCAxOX0sICAgIHstMTM3LCAyMX0sICB7MjMsIDIyfSwgICAgezI1LCAyNH0sCisgICAgIHsyNywgMjZ9LCAgICAgey0zNSwgMjh9LCAgIHstMTM4LCAyOX0sICB7LTU4LCAzMH0sICAgey0xMDMsIDMxfSwKKyAgICAgey05OCwgMzJ9LCAgICB7MzQsIDMzfSwgICAgey0xMjIsIDM1fSwgIHstMTIwLCAzNn0sICB7LTE3LCAtNzN9LAorICAgICB7LTM0LCAzN30sICAgIHstMTA2LCAzOH0sICB7LTUwLCAzOX0sICAgey04MywgLTkwfSwgIHstNzQsIDQwfSwKKyAgICAgey01MiwgNDF9LCAgICB7LTY2LCAtMTIxfSwgey0zMywgLTg4fSwgIHs0MywgNDJ9LCAgICB7LTgyLCAtMTA1fSwKKyAgICAgey00OSwgNDR9LCAgICB7LTY4LCAtMTUzfSwgey0yLCAtODl9LCAgIHstNTEsIC02NX0sICB7LTY3LCA0NX0sCisgICAgIHstODEsIC05N30sICAgezQ3LCA0Nn0sICAgIHstMTA0LCA0OH0sICB7LTE5LCA0OX0sICAgezUxLCA1MH0sCisgICAgIHs1MywgNTJ9LCAgICAgezU1LCA1NH0sICAgIHstMTM2LCA1Nn0sICB7LTE1MiwgNTd9LCAgey0zLCA1OH0sCisgICAgIHs2MCwgNTl9LCAgICAgezYyLCA2MX0sICAgIHs2NCwgNjN9LCAgICB7LTM2LCA2NX0sICAgey0yMCwgNjZ9LAorICAgICB7LTUzLCA2N30sICAgIHstMTE0LCA2OH0sICB7LTU3LCAtOTl9LCAgey03MiwgNjl9LCAgIHstNjksIDcwfSwKKyAgICAgey00MiwgNzF9LCAgICB7LTE1MSwgNzJ9LCAgey0xMTksIDczfSwgIHstODQsIC0xMTh9LCB7LTEzNSwgNzR9LAorICAgICB7LTQsIC0xMzB9LCAgIHstMTE1LCA3NX0sICB7LTI2LCAtNDF9LCAgey04NywgNzZ9LCAgIHstNTYsIC04Nn0sCisgICAgIHstMTAwLCA3N30sICAgey0zNywgLTEyOX0sIHstMjEsIDc4fSwgICB7LTM4LCA3OX0sICAgey03MSwgLTE0NX0sCisgICAgIHstMTM0LCA4MH0sICAgey04NSwgODF9LCAgIHstMTUwLCA4Mn0sICB7LTUsIDgzfSwgICAgey0xMzMsIDg0fSwKKyAgICAgey0xMDIsIDg1fSwgICB7LTIyLCA4Nn0sICAgey0yMywgODd9LCAgIHstNTQsIDg4fSwgICB7LTE0OSwgODl9LAorICAgICB7LTExNywgLTE0OH0sIHstNzAsIDkwfSwgICB7LTYsIC0xMDF9LCAgezkyLCA5MX0sICAgIHstOCwgLTU1fSwKKyAgICAgey03LCA5M30sICAgICB7LTEzMiwgOTR9LCAgey0zOSwgLTExNn0sIHstMjQsIDk1fSwgICB7LTE0NywgOTZ9LAorICAgICB7LTQwLCA5N30sICAgIHstMTAsIC0xMzF9LCB7LTE0NiwgOTh9LCAgey05LCAtMjV9fSwKKyAgICB7ezIsIDF9LCAgICAgICB7LTEsIDN9LCAgICAgIHs1LCA0fSwgICAgICAgezcsIDZ9LCAgICAgICB7OSwgOH0sCisgICAgIHsxMSwgMTB9LCAgICAgezEzLCAxMn0sICAgICB7LTIwNSwgMTR9LCAgIHsxNiwgMTV9LCAgICAgezE4LCAxN30sCisgICAgIHsyMCwgMTl9LCAgICAgey0xOCwgMjF9LCAgICB7MjMsIDIyfSwgICAgIHsyNSwgMjR9LCAgICAgezI3LCAyNn0sCisgICAgIHsyOSwgMjh9LCAgICAgey0xODgsIDMwfSwgICB7MzIsIDMxfSwgICAgIHszNCwgMzN9LCAgICAgezM2LCAzNX0sCisgICAgIHstMTg5LCAzN30sICAgezM5LCAzOH0sICAgICB7LTM1LCA0MH0sICAgIHs0MiwgNDF9LCAgICAgezQ0LCA0M30sCisgICAgIHs0NiwgNDV9LCAgICAgey0xNzMsIDQ3fSwgICB7NDksIDQ4fSwgICAgIHstMzQsIDUwfSwgICAgey0xNywgNTF9LAorICAgICB7NTMsIDUyfSwgICAgIHstMTU3LCA1NH0sICAgezU2LCA1NX0sICAgICB7NTgsIDU3fSwgICAgIHstMTcxLCA1OX0sCisgICAgIHstNTAsIDYwfSwgICAgezYyLCA2MX0sICAgICB7LTY2LCAtMTQxfSwgIHstMTcyLCA2M30sICAgey0xMjUsIDY0fSwKKyAgICAgezY2LCA2NX0sICAgICB7LTMzLCA2N30sICAgIHstNTIsIDY4fSwgICAgey0yMDQsIDY5fSwgICB7LTgyLCA3MH0sCisgICAgIHstMTU2LCA3MX0sICAgey0yLCA3Mn0sICAgICB7NzQsIDczfSwgICAgIHstMTA5LCA3NX0sICAgey01MSwgLTk4fSwKKyAgICAgezc3LCA3Nn0sICAgICB7LTQ5LCAtMTQwfSwgIHs3OSwgNzh9LCAgICAgey0xNDYsIDgwfSwgICB7LTEyNCwgODF9LAorICAgICB7LTYxLCAtOTN9LCAgIHstMTksIC03Nn0sICAgey04MSwgLTE1NH0sICB7LTY1LCAtMTE0fSwgIHs4MywgODJ9LAorICAgICB7LTgzLCAtMTA4fSwgIHstNjcsIDg0fSwgICAgey03NywgODV9LCAgICB7LTEzMCwgODZ9LCAgIHstOTksIC0xNTV9LAorICAgICB7ODgsIDg3fSwgICAgIHstOTcsIDg5fSwgICAgey02OSwgLTkxfSwgICB7LTkyLCA5MH0sICAgIHstMTMxLCA5MX0sCisgICAgIHs5MywgOTJ9LCAgICAgey0xMTYsIC0xODd9LCB7LTEyMywgOTR9LCAgIHstNjAsIDk1fSwgICAgey04NiwgLTEzOX0sCisgICAgIHs5NywgOTZ9LCAgICAgey02OCwgLTE2Mn0sICB7OTksIDk4fSwgICAgIHstNDUsIC0xMTN9LCAgey0xNDcsIC0yMDN9LAorICAgICB7LTExNSwgMTAwfSwgIHstNzUsIDEwMX0sICAgey04NCwgLTEwNn0sICB7LTEyOSwgMTAyfSwgIHstMywgMTAzfSwKKyAgICAgey0xMzcsIDEwNH0sICB7LTEzMiwgMTA1fSwgIHstNDQsIC0xMjB9LCAgey0xMDcsIDEwNn0sICB7LTIwLCAtMTAwfSwKKyAgICAgey0zNiwgMTA3fSwgICB7LTkwLCAtMTYzfSwgIHstMTYxLCAxMDh9LCAgey01OSwgLTE0NX0sICB7LTEwMSwgMTA5fSwKKyAgICAgey0yOSwgLTEzOH0sICB7LTEyMSwgMTEwfSwgIHstMTc3LCAtMTc4fSwgey0xODYsIDExMX0sICB7LTEyMiwgLTE0OH0sCisgICAgIHstMTE3LCAxMTJ9LCAgey04NSwgLTE3MH0sICB7LTIwMiwgMTEzfSwgIHstNCwgMTE0fSwgICAgey0zNywgLTEwNX0sCisgICAgIHstNzQsIDExNX0sICAgey0xMzMsIDExNn0sICB7LTEwMiwgMTE3fSwgIHsxMTksIDExOH0sICAgey04OSwgLTE5M30sCisgICAgIHstMTAzLCAxMjB9LCAgey0yMSwgLTUzfSwgICB7LTE1MywgMTIxfSwgIHsxMjMsIDEyMn0sICAgezEyNSwgMTI0fSwKKyAgICAgey0xODUsIDEyNn0sICB7LTEwNCwgLTE2OX0sIHstMjAxLCAxMjd9LCAgey0xMzYsIDEyOH0sICB7LTExOCwgMTI5fSwKKyAgICAgey04NywgMTMwfSwgICB7LTUsIDEzMX0sICAgIHstMzgsIDEzMn0sICAgey01NCwgMTMzfSwgICB7LTcwLCAtMTg0fSwKKyAgICAgey03MSwgLTE2OH0sICB7LTIyLCAxMzR9LCAgIHsxMzYsIDEzNX0sICAgey0xNTEsIC0xNTJ9LCB7LTU1LCAxMzd9LAorICAgICB7LTYsIDEzOH0sICAgIHstMzksIC03Mn0sICAgey0yMDAsIDEzOX0sICB7LTE2NywgMTQwfSwgIHsxNDIsIDE0MX0sCisgICAgIHstMTE5LCAtMTY2fSwgey04OCwgMTQzfSwgICB7LTIzLCAtMTM1fSwgIHstMTk5LCAxNDR9LCAgey0xNjUsIDE0NX0sCisgICAgIHstNTYsIC0xNTB9LCAgey01NywgLTE4M30sICB7LTcsIDE0Nn0sICAgIHstNDEsIDE0N30sICAgey0xODEsIDE0OH0sCisgICAgIHstMTM0LCAxNDl9LCAgey0yNCwgLTI1fSwgICB7LTQwLCAxNTB9LCAgIHstNzMsIDE1MX0sICAgey05LCAxNTJ9LAorICAgICB7LTQzLCAxNTN9LCAgIHstMTgyLCAtMTk3fSwgey04LCAtMTk1fSwgICB7LTE5OCwgMTU0fSwgIHstMTQ5LCAxNTV9LAorICAgICB7MTU3LCAxNTZ9LCAgIHsxNTksIDE1OH0sICAgezE2MSwgMTYwfSwgICB7MTYzLCAxNjJ9LCAgIHsxNjUsIDE2NH0sCisgICAgIHsxNjcsIDE2Nn0sICAgey0xOTQsIC0xOTZ9LCB7LTE3OSwgLTE4MH0sIHstNTgsIC0xNjR9LCAgey0yOCwgLTQyfSwKKyAgICAgey0yNiwgLTI3fSwgICB7LTEyLCAtMTN9LCAgIHstMTAsIC0xMX19fTsKKworc3RhdGljIGNvbnN0IEhVRkZfT0xEX05PRF8yRCBodWZmT0xETm9kZXNfaDJEXzFfMSA9IHsKKyAgICB7ey0xLCAxfSwKKyAgICAgey01MiwgMn0sCisgICAgIHs0LCAzfSwKKyAgICAgezYsIDV9LAorICAgICB7LTE4LCA3fSwKKyAgICAgey0yLCA4fSwKKyAgICAgey0xNywgOX0sCisgICAgIHstMzUsIDEwfSwKKyAgICAgey0zNiwgLTUxfSwKKyAgICAgey0zNCwgMTF9LAorICAgICB7LTMzLCAxMn0sCisgICAgIHstMTksIDEzfSwKKyAgICAgey0zLCAtMjB9LAorICAgICB7LTUwLCAxNH0sCisgICAgIHstNCwgLTQ5fX0sCisgICAge3stMSwgMX0sICAgezMsIDJ9LCAgICAgIHs1LCA0fSwgICAgIHstMTAzLCA2fSwgIHs4LCA3fSwgICAgIHstMTgsIDl9LAorICAgICB7MTEsIDEwfSwgIHsxMywgMTJ9LCAgICB7LTg2LCAxNH0sICB7MTYsIDE1fSwgICB7LTIsIC0zNX0sICB7LTE3LCAxN30sCisgICAgIHstODcsIDE4fSwgey0xMDIsIDE5fSwgIHsyMSwgMjB9LCAgIHstNjksIDIyfSwgIHstMzQsIDIzfSwgIHstMTksIDI0fSwKKyAgICAgezI2LCAyNX0sICB7LTMsIDI3fSwgICAgey01MiwgLTcwfSwgey0zMywgLTcxfSwgey04NSwgMjh9LCAgey0xMDEsIDI5fSwKKyAgICAgezMxLCAzMH0sICB7LTUwLCAzMn0sICAgey01MSwgMzN9LCAgey0yMCwgMzR9LCAgey0zNiwgMzV9LCAgey00LCAtNTV9LAorICAgICB7LTU0LCAzNn0sIHstNDksIC0xMDB9LCB7LTUzLCAzN30sICB7LTg0LCAzOH0sICB7LTY4LCAzOX0sICB7NDEsIDQwfSwKKyAgICAgey01LCA0Mn0sICB7LTIxLCA0M30sICAgey02NSwgLTY2fSwgey02NywgNDR9LCAgey0zNywgLTk5fSwgey0zOSwgNDV9LAorICAgICB7LTYsIDQ2fSwgIHstMzgsIC04M30sICB7LTIyLCA0N30sICB7LTgxLCAtODJ9LCB7LTcsIC05OH0sICB7LTIzLCAtOTd9fSwKKyAgICB7ey0xLCAxfSwgICAgICB7MywgMn0sICAgICAgezUsIDR9LCAgICAgIHs3LCA2fSwgICAgICB7OSwgOH0sCisgICAgIHstMTU0LCAxMH0sICAgey0xMDMsIDExfSwgIHsxMywgMTJ9LCAgICB7LTE4LCAxNH0sICAgezE2LCAxNX0sCisgICAgIHstMTM3LCAxN30sICAgezE5LCAxOH0sICAgIHstMzUsIDIwfSwgICB7MjIsIDIxfSwgICAgey0xMjAsIDIzfSwKKyAgICAgezI1LCAyNH0sICAgICB7LTUyLCAyNn0sICAgey0yLCAyN30sICAgIHstMTM4LCAyOH0sICB7LTE1MywgMjl9LAorICAgICB7LTE3LCAzMH0sICAgIHszMiwgMzF9LCAgICB7MzQsIDMzfSwgICAgey0zNCwgMzV9LCAgIHstMTksIDM2fSwKKyAgICAgezM4LCAzN30sICAgICB7NDAsIDM5fSwgICAgey0zLCA0MX0sICAgIHstMTIxLCA0Mn0sICB7LTEyMiwgNDN9LAorICAgICB7LTEzNiwgLTE1Mn0sIHstMzMsIDQ0fSwgICB7LTEwNCwgNDV9LCAgey0xMDUsIDQ2fSwgIHstNTEsIC0xMDZ9LAorICAgICB7LTUwLCA0N30sICAgIHstMzYsIDQ4fSwgICB7LTIwLCA0OX0sICAgey01MywgLTExOX0sIHstNCwgNTB9LAorICAgICB7LTEzNSwgLTE1MX0sIHstNjgsIDUxfSwgICB7NTMsIDUyfSwgICAgey00OSwgNTR9LCAgIHs1NiwgNTV9LAorICAgICB7LTExOCwgNTd9LCAgIHstODgsIDU4fSwgICB7NjAsIDU5fSwgICAgey01LCAtOH0sICAgIHstMzgsIDYxfSwKKyAgICAgezYzLCA2Mn0sICAgICB7LTIxLCA2NH0sICAgey0zNywgLTgzfSwgIHstNjcsIDY1fSwgICB7LTY2LCAtMTMzfSwKKyAgICAgey02LCA2Nn0sICAgICB7LTE1MCwgNjd9LCAgey0xMzQsIDY4fSwgIHstMjMsIC02NX0sICB7LTczLCAtOTB9LAorICAgICB7LTY5LCAtODl9LCAgIHstMTQ4LCA2OX0sICB7LTcsIC0yMn0sICAgey05OCwgLTExM30sIHs3MSwgNzB9LAorICAgICB7LTgyLCA3Mn0sICAgIHstODYsIC0xNDl9LCB7LTU4LCAtODF9LCAgey03NCwgNzN9LCAgIHs3NSwgNzR9LAorICAgICB7NzcsIDc2fSwgICAgIHstODcsIC05N30sICB7LTEwMiwgNzh9LCAgezgwLCA3OX0sICAgIHstODQsIDgxfSwKKyAgICAgey04NSwgODJ9LCAgICB7LTU0LCA4M30sICAgey03MCwgODR9LCAgIHstNzIsIDg1fSwgICB7LTExNywgODZ9LAorICAgICB7LTcxLCA4N30sICAgIHstOTksIDg4fSwgICB7LTEwMSwgODl9LCAgey0zOSwgLTEwMH0sIHstNTUsIDkwfSwKKyAgICAgey01NywgOTF9LCAgICB7LTEzMiwgOTJ9LCAgey01NiwgOTN9LCAgIHstMjQsIC0xMTR9LCB7LTExNSwgOTR9LAorICAgICB7LTQwLCAtMTE2fSwgIHstNDIsIC0xNDd9LCB7LTksIC00MX0sICAgey0xMzEsIDk1fSwgIHs5NywgOTZ9LAorICAgICB7LTEyOSwgOTh9LCAgIHstMjUsIC0xMzB9LCB7LTI2LCAtMTQ2fSwgey0xMCwgLTE0NX19LAorICAgIHt7MiwgMX0sICAgICAgIHstMSwgM30sICAgICAgezUsIDR9LCAgICAgICB7NywgNn0sICAgICAgIHs5LCA4fSwKKyAgICAgezExLCAxMH0sICAgICB7MTMsIDEyfSwgICAgIHstMjA1LCAxNH0sICAgezE2LCAxNX0sICAgICB7MTgsIDE3fSwKKyAgICAgey0xOCwgMTl9LCAgICB7MjEsIDIwfSwgICAgIHsyMywgMjJ9LCAgICAgey0xODgsIDI0fSwgICB7MjYsIDI1fSwKKyAgICAgezI4LCAyN30sICAgICB7MzAsIDI5fSwgICAgIHstMzUsIDMxfSwgICAgezMzLCAzMn0sICAgICB7MzUsIDM0fSwKKyAgICAgey0xNzEsIDM2fSwgICB7LTE4OSwgMzd9LCAgIHstMjA0LCAzOH0sICAgezQwLCAzOX0sICAgICB7LTIsIDQxfSwKKyAgICAgezQzLCA0Mn0sICAgICB7LTE3LCA0NH0sICAgIHstNTIsIDQ1fSwgICAgey0zNCwgNDZ9LCAgICB7LTE5LCA0N30sCisgICAgIHs0OSwgNDh9LCAgICAgey0xNTQsIDUwfSwgICB7NTIsIDUxfSwgICAgIHs1NCwgNTN9LCAgICAgey0xNzIsIDU1fSwKKyAgICAgey0xNzMsIDU2fSwgICB7LTY5LCAtMTg3fSwgIHstMjAzLCA1N30sICAgezU5LCA1OH0sICAgICB7LTg2LCA2MH0sCisgICAgIHstMywgNjF9LCAgICAgezYzLCA2Mn0sICAgICB7LTMzLCAtNTB9LCAgIHstNTEsIDY0fSwgICAgey0zNiwgNjV9LAorICAgICB7LTEzNywgNjZ9LCAgIHstMjAsIDY3fSwgICAgezY5LCA2OH0sICAgICB7LTEyMCwgNzB9LCAgIHs3MiwgNzF9LAorICAgICB7LTE1NiwgLTE1N30sIHstMTU1LCA3M30sICAgey0xNzAsIDc0fSwgICB7NzYsIDc1fSwgICAgIHstMTg2LCAtMjAyfSwKKyAgICAgezc4LCA3N30sICAgICB7ODAsIDc5fSwgICAgIHs4MiwgODF9LCAgICAgey00LCAtNjd9LCAgICB7LTQ5LCAtMTAzfSwKKyAgICAgey02NiwgODN9LCAgICB7LTY4LCA4NH0sICAgIHstNTMsIDg1fSwgICAgey0yMSwgODZ9LCAgICB7LTM3LCA4N30sCisgICAgIHs4OSwgODh9LCAgICAgezkxLCA5MH0sICAgICB7OTMsIDkyfSwgICAgIHstMTM4LCA5NH0sICAgey0xNDAsIDk1fSwKKyAgICAgey0xNDEsIC0xNTN9LCB7LTEzOSwgOTZ9LCAgIHstMjAxLCA5N30sICAgey0xODUsIDk4fSwgICB7LTEyMSwgOTl9LAorICAgICB7LTE2OSwgMTAwfSwgIHstNSwgMTAxfSwgICAgey0xMzYsIDEwMn0sICB7LTY1LCAtODR9LCAgIHstODMsIC04NX0sCisgICAgIHstODIsIDEwM30sICAgey03MCwgMTA0fSwgICB7LTU0LCAxMDV9LCAgIHstMzgsIDEwNn0sICAgezEwOCwgMTA3fSwKKyAgICAgey0xMDEsIDEwOX0sICB7LTIyLCAtMTAyfSwgIHstMTIyLCAtMTIzfSwgezExMSwgMTEwfSwgICB7MTEzLCAxMTJ9LAorICAgICB7LTEyNSwgMTE0fSwgIHstODcsIC0xMjR9LCAgey03MSwgMTE1fSwgICB7LTE2OCwgMTE2fSwgIHstNiwgLTIwMH0sCisgICAgIHstMTg0LCAxMTd9LCAgey0xNTIsIDExOH0sICB7LTgxLCAxMTl9LCAgIHsxMjEsIDEyMH0sICAgey0xMDUsIDEyMn0sCisgICAgIHstMTA2LCAxMjN9LCAgey05OSwgMTI0fSwgICB7LTk4LCAtMTAwfSwgIHstMjMsIDEyNX0sICAgey0xMDQsIDEyNn0sCisgICAgIHstMzksIDEyN30sICAgey0xMzUsIDEyOH0sICB7LTU1LCAtMTUxfSwgIHsxMzAsIDEyOX0sICAgey05MSwgLTExOX0sCisgICAgIHstNywgLTE5OX0sICAgey0xODMsIDEzMX0sICB7LTEwNywgLTEwOH0sIHstMTE2LCAxMzJ9LCAgey0xMDksIC0xMTd9LAorICAgICB7LTU2LCAtMTY3fSwgIHstOTcsIDEzM30sICAgey05MCwgMTM0fSwgICB7LTcyLCAxMzV9LCAgIHstMTE1LCAtMTE4fSwKKyAgICAgey05MiwgMTM2fSwgICB7LTkzLCAtMTY2fSwgIHstMjQsIC0xMTR9LCAgey04OSwgMTM3fSwgICB7LTg4LCAtMTUwfSwKKyAgICAgezEzOSwgMTM4fSwgICB7LTgsIDE0MH0sICAgIHstNDAsIDE0MX0sICAgey0xOTgsIDE0Mn0sICB7LTEzNCwgMTQzfSwKKyAgICAgey0xMTMsIDE0NH0sICB7LTE4MiwgMTQ1fSwgIHsxNDcsIDE0Nn0sICAgey00MSwgMTQ4fSwgICB7LTU3LCAtMTgxfSwKKyAgICAgey0xMzEsIDE0OX0sICB7MTUxLCAxNTB9LCAgIHstMjUsIDE1Mn0sICAgey0xMzIsIDE1M30sICB7MTU1LCAxNTR9LAorICAgICB7LTksIC03Nn0sICAgIHstNDIsIC0xNjV9LCAgey03MywgLTEzM30sICB7LTc3LCAxNTZ9LCAgIHstMTMwLCAxNTd9LAorICAgICB7LTc1LCAtMTQ5fSwgIHstMTAsIC0xNDZ9LCAgey0yNiwgMTU4fSwgICB7LTE5NywgMTU5fSwgIHstMTgwLCAxNjB9LAorICAgICB7LTE0NywgLTE5Nn0sIHstNTgsIC03NH0sICAgey0yNywgMTYxfSwgICB7LTEyOSwgLTE0OH0sIHstMTEsIC02MX0sCisgICAgIHstNjAsIDE2Mn0sICAgey01OSwgMTYzfSwgICB7LTQzLCAtMTQ1fSwgIHstMTIsIC0xNjR9LCAgey0xNjEsIDE2NH0sCisgICAgIHstMTYzLCAxNjV9LCAgey0xNjIsIC0xOTV9LCB7LTE3OSwgMTY2fSwgIHstMTc3LCAxNjd9LCAgey0yOCwgLTE3OH0sCisgICAgIHstNDUsIC0xOTR9LCAgey0yOSwgLTQ0fSwgICB7LTEzLCAtMTkzfX19OworCitjb25zdCBIVUZGX09MRF9OT0RFUyBodWZmT0xETm9kZXMgPSB7CisgICAgeyZodWZmT0xETm9kZXNfaDFEXzAsICZodWZmT0xETm9kZXNfaDFEXzEsICZodWZmT0xETm9kZXNfaDFEXzF9LAorICAgIHt7Jmh1ZmZPTEROb2Rlc19oMkRfMF8wLCAmaHVmZk9MRE5vZGVzX2gyRF8wXzF9LAorICAgICB7Jmh1ZmZPTEROb2Rlc19oMkRfMV8wLCAmaHVmZk9MRE5vZGVzX2gyRF8xXzF9LAorICAgICB7Jmh1ZmZPTEROb2Rlc19oMkRfMF8xLCAmaHVmZk9MRE5vZGVzX2gyRF8wXzF9fX07CmRpZmYgLS1naXQgYS9saWJGREsvc3JjL21kY3QuY3BwIGIvbGliRkRLL3NyYy9tZGN0LmNwcAppbmRleCA5YTI5YWExLi5kNjk3Y2ZiIDEwMDY0NAotLS0gYS9saWJGREsvc3JjL21kY3QuY3BwCisrKyBiL2xpYkZESy9zcmMvbWRjdC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNTAgKzkwLDIwNiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAotICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbCwgTWFudWVsIEphbmRlcgotICAgRGVzY3JpcHRpb246IE1EQ1Qgcm91dGluZXMKKyAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwsIE1hbnVlbCBKYW5kZXIsIFlvdWxpeSBOaW5vdiwgRGFuaWVsIEhhZ2VsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBNRENUL01EU1Qgcm91dGluZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgIm1kY3QuaCIKIAotCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogI2luY2x1ZGUgImRjdC5oIgogI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKIAotCi12b2lkIG1kY3RfaW5pdCggSF9NRENUIGhNZGN0LAotICAgICAgICAgICAgICAgIEZJWFBfREJMICpvdmVybGFwLAotICAgICAgICAgICAgICAgIElOVCBvdmVybGFwQnVmZmVyU2l6ZSApCi17Cit2b2lkIG1kY3RfaW5pdChIX01EQ1QgaE1kY3QsIEZJWFBfREJMICpvdmVybGFwLCBJTlQgb3ZlcmxhcEJ1ZmZlclNpemUpIHsKICAgaE1kY3QtPm92ZXJsYXAuZnJlcSA9IG92ZXJsYXA7Ci0gIC8vRkRLbWVtY2xlYXIob3ZlcmxhcCwgb3ZlcmxhcEJ1ZmZlclNpemUqc2l6ZW9mKEZJWFBfREJMKSk7CisgIC8vIEZES21lbWNsZWFyKG92ZXJsYXAsIG92ZXJsYXBCdWZmZXJTaXplKnNpemVvZihGSVhQX0RCTCkpOwogICBoTWRjdC0+cHJldl9mciA9IDA7CiAgIGhNZGN0LT5wcmV2X25yID0gMDsKICAgaE1kY3QtPnByZXZfdGwgPSAwOwogICBoTWRjdC0+b3Zfc2l6ZSA9IG92ZXJsYXBCdWZmZXJTaXplOworICBoTWRjdC0+cHJldkFsaWFzU3ltbWV0cnkgPSAwOworICBoTWRjdC0+cHJldlByZXZBbGlhc1N5bW1ldHJ5ID0gMDsKKyAgaE1kY3QtPnBGYWNaaXIgPSBOVUxMOworICBoTWRjdC0+cEFzeW1PdmxwID0gTlVMTDsKIH0KIAorLyoKK1RoaXMgcHJvZ3JhbSBpbXBsZW1lbnRzIHRoZSBmb3J3YXJkIE1EQ1QgdHJhbnNmb3JtIG9uIGFuIGlucHV0IGJsb2NrIG9mIGRhdGEuCitUaGUgaW5wdXQgYmxvY2sgaXMgaW4gYSBmb3JtIChBLEIsQyxEKSB3aGVyZSBBLEIsQyBhbmQgRCBhcmUgdGhlIHJlc3BlY3RpdmUKKzEvNHRoIHNlZ21lbnRzIG9mIHRoZSBibG9jay4gVGhlIHByb2dyYW0gdGFrZXMgdGhlIGlucHV0IGJsb2NrIGFuZCBmb2xkcyBpdCBpbgordGhlIGZvcm06CisoLUQtQ3IsQS1CcikuIFRoaXMgYmxvY2sgaXMgdHdpY2Ugc2hvcnRlciBhbmQgaGVyZSB0aGUgJ3InIHN1ZmZpeCBkZW5vdGVzCitmbGlwcGluZyBvZiB0aGUgc2VxdWVuY2UgKHJldmVyc2luZyB0aGUgb3JkZXIgb2YgdGhlIHNhbXBsZXMpLiBXaGlsZSBmb2xkaW5nIHRoZQoraW5wdXQgYmxvY2sgaW4gdGhlIGFib3ZlIG1lbnRpb25lZCBzaG9ydGVyIGJsb2NrIHRoZSBwcm9ncmFtIHdpbmRvd3MgdGhlIGRhdGEuCitCZWNhdXNlIHRoZSB0d28gb3BlcmF0aW9ucyAod2luZG93aW5nIGFuZCBmb2xkaW5nKSBhcmUgbm90IGltcGxlbWVudGVkCitzZXF1ZW50aWFsbHksIGJ1dCB0b2dldGhlciB0aGUgcHJvZ3JhbSdzIHN0cnVjdHVyZSBpcyBub3QgZWFzeSB0byB1bmRlcnN0YW5kLgorT25jZSB0aGUgb3V0cHV0IChhbHJlYWR5IHdpbmRvd2VkKSBibG9jayAoLUQtQ3IsQS1CcikgaXMgcmVhZHkgaXQgaXMgcGFzc2VkIHRvCit0aGUgRENUIElWIGZvciBwcm9jZXNzaW5nLgorKi8KK0lOVCBtZGN0X2Jsb2NrKEhfTURDVCBoTWRjdCwgY29uc3QgSU5UX1BDTSAqUkVTVFJJQ1QgdGltZURhdGEsCisgICAgICAgICAgICAgICBjb25zdCBJTlQgbm9JblNhbXBsZXMsIEZJWFBfREJMICpSRVNUUklDVCBtZGN0RGF0YSwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCBuU3BlYywgY29uc3QgSU5UIHRsLCBjb25zdCBGSVhQX1dUUCAqcFJpZ2h0V2luZG93UGFydCwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCBmciwgU0hPUlQgKnBNZGN0RGF0YV9lKSB7CisgIGludCBpLCBuOworICAvKiB0bDogdHJhbnNmb3JtIGxlbmd0aAorICAgICBmbDogbGVmdCB3aW5kb3cgc2xvcGUgbGVuZ3RoCisgICAgIG5sOiBsZWZ0IHdpbmRvdyBzbG9wZSBvZmZzZXQKKyAgICAgZnI6IHJpZ2h0IHdpbmRvdyBzbG9wZSBsZW5ndGgKKyAgICAgbnI6IHJpZ2h0IHdpbmRvdyBzbG9wZSBvZmZzZXQKKyAgICAgU2VlIEZES190b29scy9kb2MvaW50ZXJuL21kY3QudGV4IGZvciBtb3JlIGRldGFpbC4gKi8KKyAgaW50IGZsLCBubCwgbnI7CisgIGNvbnN0IEZJWFBfV1RQICp3bHMsICp3cnM7CiAKLXZvaWQgaW1kY3RfZ2FpbihGSVhQX0RCTCAqcEdhaW5fbSwgaW50ICpwR2Fpbl9lLCBpbnQgdGwpCi17CisgIHdycyA9IHBSaWdodFdpbmRvd1BhcnQ7CisKKyAgLyogRGV0ZWN0IEZScHJldmlvdXMgLyBGTCBtaXNtYXRjaGVzIGFuZCBvdmVycmlkZSBwYXJhbWV0ZXJzIGFjY29yZGluZ2x5ICovCisgIGlmIChoTWRjdC0+cHJldl9mciA9PQorICAgICAgMCkgeyAvKiBBdCBzdGFydCBqdXN0IGluaXRpYWxpemUgYW5kIHBhc3MgcGFyYW1ldGVycyBhcyB0aGV5IGFyZSAqLworICAgIGhNZGN0LT5wcmV2X2ZyID0gZnI7CisgICAgaE1kY3QtPnByZXZfd3JzID0gd3JzOworICAgIGhNZGN0LT5wcmV2X3RsID0gdGw7CisgIH0KKworICAvKiBEZXJpdmUgTlIgKi8KKyAgbnIgPSAodGwgLSBmcikgPj4gMTsKKworICAvKiBTa2lwIGlucHV0IHNhbXBsZXMgaWYgdGwgaXMgc21hbGxlciB0aGFuIGJsb2NrIHNpemUgKi8KKyAgdGltZURhdGEgKz0gKG5vSW5TYW1wbGVzIC0gdGwpID4+IDE7CisKKyAgLyogd2luZG93aW5nICovCisgIGZvciAobiA9IDA7IG4gPCBuU3BlYzsgbisrKSB7CisgICAgLyoKKyAgICAgKiBNRENUIHNjYWxlOgorICAgICAqICsgMTogZk11bHREaXYyKCkgaW4gd2luZG93aW5nLgorICAgICAqICsgMTogQmVjYXVzZSBvZiBmYWN0b3IgMS8yIGluIFByaW5jZW4tQnJhZGxleSBjb21wbGlhbnQgd2luZG93ZWQgVERBQy4KKyAgICAgKi8KKyAgICBJTlQgbWRjdERhdGFfZSA9IDEgKyAxOworCisgICAgLyogRGVyaXZlIGxlZnQgcGFyYW1ldGVycyAqLworICAgIHdscyA9IGhNZGN0LT5wcmV2X3dyczsKKyAgICBmbCA9IGhNZGN0LT5wcmV2X2ZyOworICAgIG5sID0gKHRsIC0gZmwpID4+IDE7CisKKyAgICAvKiBIZXJlIHdlIGltcGxlbWVudCBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB3aGF0IGhhcHBlbnMgYWZ0ZXIgdGhlIHRoaXMKKyAgICBwaWVjZSBvZiBjb2RlIChzZWUgdGhlIGNvbW1lbnRzIGJlbG93KS4gV2UgaW1wbGVtZW50IHRoZSBmb2xkaW5nIG9mIEEgYW5kIEIKKyAgICBzZWdtZW50cyB0byAoQS1CcikgYnV0IEEgaXMgemVybywgYmVjYXVzZSBpbiB0aGlzIHBhcnQgb2YgdGhlIE1EQ1Qgc2VxdWVuY2UKKyAgICB0aGUgd2luZG93IGNvZWZmaWNpZW50cyB3aXRoIHdoaWNoIEEgbXVzdCBiZSBtdWx0aXBsaWVkIGFyZSB6ZXJvLiAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBubDsgaSsrKSB7CisjaWYgU0FNUExFX0JJVFMgPT0gREZSQUNUX0JJVFMgLyogU1BDX0JJVFMgYW5kIERGUkFDVF9CSVRTIHNob3VsZCBiZSBlcXVhbC4gKi8KKyAgICAgIG1kY3REYXRhWyh0bCAvIDIpICsgaV0gPSAtKChGSVhQX0RCTCl0aW1lRGF0YVt0bCAtIGkgLSAxXSA+PiAoMSkpOworI2Vsc2UKKyAgICAgIG1kY3REYXRhWyh0bCAvIDIpICsgaV0gPSAtKEZJWFBfREJMKXRpbWVEYXRhW3RsIC0gaSAtIDFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMgLSAxKTsgLyogMChBKS1CciAqLworI2VuZGlmCisgICAgfQorCisgICAgLyogSW1wbGVtZW50cyB0aGUgZm9sZGluZyBhbmQgd2luZG93aW5nIG9mIHRoZSBsZWZ0IHBhcnQgb2YgdGhlIHNlcXVlbmNlLAorICAgIHRoYXQgaXMgc2VnbWVudHMgQSBhbmQgQi4gVGhlIEEgc2VnbWVudCBpcyBtdWx0aXBsaWVkIGJ5IHRoZSByZXNwZWN0aXZlIGxlZnQKKyAgICB3aW5kb3cgY29lZmZpY2llbnQgYW5kIHBsYWNlZCBpbiBhIHRlbXBvcmFyeSB2YXJpYWJsZS4KKworICAgIHRtcDAgPSBmTXVsdERpdjIoKEZJWFBfUENNKXRpbWVEYXRhW2krbmxdLCBwTGVmdFdpbmRvd1BhcnRbaV0udi5pbSk7CisKKyAgICBBZnRlciB0aGlzIHRoZSBCIHNlZ21lbnQgdGFrZW4gaW4gcmV2ZXJzZSBvcmRlciBpcyBtdWx0aXBsaWVkIGJ5IHRoZSBsZWZ0CisgICAgd2luZG93IGFuZCBzdWJ0cmFjdGVkIGZyb20gdGhlIHByZXZpb3VzbHkgZGVyaXZlZCB0ZW1wb3JhcnkgdmFyaWFibGUsIHNvCisgICAgdGhhdCBmaW5hbGx5IHdlIGltcGxlbWVudCB0aGUgQS1CciBvcGVyYXRpb24uIFRoaXMgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gdGhlCisgICAgcmlnaHQgcGFydCBvZiB0aGUgTURDVCBvdXRwdXQgOiAoLUQtQ3IsQS1CcikuCisKKyAgICBtZGN0RGF0YVsodGwvMikraStubF0gPSBmTXVsdFN1YkRpdjIodG1wMCwgKEZJWFBfUENNKXRpbWVEYXRhW3RsLW5sLWktMV0sCisgICAgcExlZnRXaW5kb3dQYXJ0W2ldLnYucmUpOy8vQSp3aW5kb3ctQnIqd2luZG93CisKKyAgICBUaGUgKEEtQnIpIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGJ1ZmZlciAobWRjdERhdGEpIHdpdGhvdXQgYmVpbmcKKyAgICBmbGlwcGVkLiAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZmwgLyAyOyBpKyspIHsKKyAgICAgIEZJWFBfREJMIHRtcDA7CisgICAgICB0bXAwID0gZk11bHREaXYyKChGSVhQX1BDTSl0aW1lRGF0YVtpICsgbmxdLCB3bHNbaV0udi5pbSk7IC8qIGEqd2luZG93ICovCisgICAgICBtZGN0RGF0YVsodGwgLyAyKSArIGkgKyBubF0gPQorICAgICAgICAgIGZNdWx0U3ViRGl2Mih0bXAwLCAoRklYUF9QQ00pdGltZURhdGFbdGwgLSBubCAtIGkgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgd2xzW2ldLnYucmUpOyAvKiBBKndpbmRvdy1Ccip3aW5kb3cgKi8KKyAgICB9CisKKyAgICAvKiBSaWdodCB3aW5kb3cgc2xvcGUgb2Zmc2V0ICovCisgICAgLyogSGVyZSB3ZSBpbXBsZW1lbnQgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2Ygd2hhdCBoYXBwZW5zIGFmdGVyIHRoZSB0aGlzCisgICAgcGllY2Ugb2YgY29kZSAoc2VlIHRoZSBjb21tZW50cyBiZWxvdykuIFdlIGltcGxlbWVudCB0aGUgZm9sZGluZyBvZiBDIGFuZCBECisgICAgc2VnbWVudHMgdG8gKC1ELUNyKSBidXQgRCBpcyB6ZXJvLCBiZWNhdXNlIGluIHRoaXMgcGFydCBvZiB0aGUgTURDVCBzZXF1ZW5jZQorICAgIHRoZSB3aW5kb3cgY29lZmZpY2llbnRzIHdpdGggd2hpY2ggRCBtdXN0IGJlIG11bHRpcGxpZWQgYXJlIHplcm8uICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKyNpZiBTQU1QTEVfQklUUyA9PSBcCisgICAgREZSQUNUX0JJVFMgLyogVGhpcyBzaG91bGQgYmUgU1BDX0JJVFMgaW5zdGVhZCBvZiBERlJBQ1RfQklUUy4gKi8KKyAgICAgIG1kY3REYXRhWyh0bCAvIDIpIC0gMSAtIGldID0gLSgoRklYUF9EQkwpdGltZURhdGFbdGwgKyBpXSA+PiAoMSkpOworI2Vsc2UKKyAgICAgIG1kY3REYXRhWyh0bCAvIDIpIC0gMSAtIGldID0KKyAgICAgICAgICAtKEZJWFBfREJMKXRpbWVEYXRhW3RsICsgaV0KKyAgICAgICAgICA8PCAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyAtIDEpOyAvKiAtQyBmbGlwcGVkIGF0IHBsYWNpbmcgKi8KKyNlbmRpZgorICAgIH0KKworICAgIC8qIEltcGxlbWVudHMgdGhlIGZvbGRpbmcgYW5kIHdpbmRvd2luZyBvZiB0aGUgcmlnaHQgcGFydCBvZiB0aGUgc2VxdWVuY2UsCisgICAgdGhhdCBpcywgc2VnbWVudHMgQyBhbmQgRC4gVGhlIEMgc2VnbWVudCBpcyBtdWx0aXBsaWVkIGJ5IHRoZSByZXNwZWN0aXZlCisgICAgcmlnaHQgd2luZG93IGNvZWZmaWNpZW50IGFuZCBwbGFjZWQgaW4gYSB0ZW1wb3JhcnkgdmFyaWFibGUuCisKKyAgICB0bXAxID0gZk11bHREaXYyKChGSVhQX1BDTSl0aW1lRGF0YVt0bCtucitpXSwgcFJpZ2h0V2luZG93UGFydFtpXS52LnJlKTsKKworICAgIEFmdGVyIHRoaXMgdGhlIEQgc2VnbWVudCB0YWtlbiBpbiByZXZlcnNlIG9yZGVyIGlzIG11bHRpcGxpZWQgYnkgdGhlIHJpZ2h0CisgICAgd2luZG93IGFuZCBhZGRlZCBmcm9tIHRoZSBwcmV2aW91c2x5IGRlcml2ZWQgdGVtcG9yYXJ5IHZhcmlhYmxlLCBzbyB0aGF0IHdlCisgICAgZ2V0IChDK0RyKSBvcGVyYXRpb24uIFRoaXMgb3V0cHV0IGlzIG5lZ2F0ZWQgdG8gZ2V0ICgtQy1EcikgYW5kIHdyaXR0ZW4gdG8KKyAgICB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBNRENUIG91dHB1dCB3aGlsZSBiZWluZyByZXZlcnNlZCAoZmxpcHBlZCkgYXQgdGhlIHNhbWUKKyAgICB0aW1lLCBzbyB0aGF0IGZyb20gKC1DLURyKSB3ZSBnZXQgKC1ELUNyKT0+ICgtRC1DcixBLUJyKS4KKworICAgIG1kY3REYXRhWyh0bC8yKS1uci1pLTFdID0gLWZNdWx0QWRkRGl2Mih0bXAxLAorICAgIChGSVhQX1BDTSl0aW1lRGF0YVsodGwqMiktbnItaS0xXSwgcFJpZ2h0V2luZG93UGFydFtpXS52LmltKTsqLworICAgIGZvciAoaSA9IDA7IGkgPCBmciAvIDI7IGkrKykgeworICAgICAgRklYUF9EQkwgdG1wMTsKKyAgICAgIHRtcDEgPSBmTXVsdERpdjIoKEZJWFBfUENNKXRpbWVEYXRhW3RsICsgbnIgKyBpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgd3JzW2ldLnYucmUpOyAvKiBDKndpbmRvdyAqLworICAgICAgbWRjdERhdGFbKHRsIC8gMikgLSBuciAtIGkgLSAxXSA9CisgICAgICAgICAgLWZNdWx0QWRkRGl2Mih0bXAxLCAoRklYUF9QQ00pdGltZURhdGFbKHRsICogMikgLSBuciAtIGkgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyc1tpXS52LmltKTsgLyogLShDKndpbmRvdytEcip3aW5kb3cpIGFuZCBmbGlwIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjaW5nIC0+IC1DciAtIEQgKi8KKyAgICB9CisKKyAgICAvKiBXZSBwYXNzIHRoZSBzaG9ydGVuZWQgZm9sZGVkIGRhdGEgKC1ELUNyLEEtQnIpIHRvIHRoZSBNRENUIGZ1bmN0aW9uICovCisgICAgZGN0X0lWKG1kY3REYXRhLCB0bCwgJm1kY3REYXRhX2UpOworCisgICAgcE1kY3REYXRhX2Vbbl0gPSAoU0hPUlQpbWRjdERhdGFfZTsKKworICAgIHRpbWVEYXRhICs9IHRsOworICAgIG1kY3REYXRhICs9IHRsOworCisgICAgaE1kY3QtPnByZXZfd3JzID0gd3JzOworICAgIGhNZGN0LT5wcmV2X2ZyID0gZnI7CisgICAgaE1kY3QtPnByZXZfdGwgPSB0bDsKKyAgfQorCisgIHJldHVybiBuU3BlYyAqIHRsOworfQorCit2b2lkIGltZGN0X2dhaW4oRklYUF9EQkwgKnBHYWluX20sIGludCAqcEdhaW5fZSwgaW50IHRsKSB7CiAgIEZJWFBfREJMIGdhaW5fbSA9ICpwR2Fpbl9tOwogICBpbnQgZ2Fpbl9lID0gKnBHYWluX2U7CiAgIGludCBsb2cyX3RsOwogCi0gIGxvZzJfdGwgPSBERlJBQ1RfQklUUy0xLWZOb3JteigoRklYUF9EQkwpdGwpOworICBnYWluX2UgKz0gLU1EQ1RfT1VUUFVUX0dBSU4gLSBNRENUX09VVF9IRUFEUk9PTSArIDE7CisgIGlmICh0bCA9PSAwKSB7CisgICAgLyogRG9udCByZWdhcmQgdGhlIDIvTiBmYWN0b3IgZnJvbSB0aGUgSURDVC4gSXQgaXMgY29tcGVuc2F0ZWQgZm9yIHNvbWV3aGVyZQorICAgICAqIGVsc2UuICovCisgICAgKnBHYWluX2UgPSBnYWluX2U7CisgICAgcmV0dXJuOworICB9CiAKLSAgZ2Fpbl9lICs9IC1NRENUX09VVFBVVF9HQUlOIC0gbG9nMl90bCAtIE1EQ1RfT1VUX0hFQURST09NICsgMTsKKyAgbG9nMl90bCA9IERGUkFDVF9CSVRTIC0gMSAtIGZOb3JteigoRklYUF9EQkwpdGwpOworICBnYWluX2UgKz0gLWxvZzJfdGw7CiAKICAgLyogRGV0ZWN0IG5vbi1yYWRpeCAyIHRyYW5zZm9ybSBsZW5ndGggYW5kIGFkZCBhbXBsaXR1ZGUgY29tcGVuc2F0aW9uIGZhY3RvcgogICAgICB3aGljaCBjYW5ub3QgYmUgaW5jbHVkZWQgaW50byB0aGUgZXhwb25lbnQgYWJvdmUgKi8KLSAgc3dpdGNoICggKHRsKSA+PiAobG9nMl90bCAtIDIpICkgewotICAgIGNhc2UgMHg3OiAvKiAxMCBtcywgMS90bCA9IDEuMC8oRkRLcG93KDIuMCwgLWxvZzJfdGwpICogMC41MzMzMzMzMzMzMzMzMzMzMzMzMykgKi8KKyAgc3dpdGNoICgodGwpID4+IChsb2cyX3RsIC0gMikpIHsKKyAgICBjYXNlIDB4NzogLyogMTAgbXMsIDEvdGwgPSAxLjAvKEZES3BvdygyLjAsIC1sb2cyX3RsKSAqCisgICAgICAgICAgICAgICAgIDAuNTMzMzMzMzMzMzMzMzMzMzMzMzMpICovCiAgICAgICBpZiAoZ2Fpbl9tID09IChGSVhQX0RCTCkwKSB7CiAgICAgICAgIGdhaW5fbSA9IEZMMkZYQ09OU1RfREJMKDAuNTMzMzMzMzMzMzMzMzMzMzMzMzNmKTsKICAgICAgIH0gZWxzZSB7CkBAIC0xMzEsOSArMjk4LDE3IEBACiAgICAgICBicmVhazsKICAgICBjYXNlIDB4NjogLyogMy80IG9mIHJhZGl4IDIsIDEvdGwgPSAxLjAvKEZES3BvdygyLjAsIC1sb2cyX3RsKSAqIDIuMC8zLjApICovCiAgICAgICBpZiAoZ2Fpbl9tID09IChGSVhQX0RCTCkwKSB7Ci0gICAgICAgIGdhaW5fbSA9IEZMMkZYQ09OU1RfREJMKDIuMC8zLjBmKTsKKyAgICAgICAgZ2Fpbl9tID0gRkwyRlhDT05TVF9EQkwoMi4wIC8gMy4wZik7CiAgICAgICB9IGVsc2UgewotICAgICAgICBnYWluX20gPSBmTXVsdChnYWluX20sIEZMMkZYQ09OU1RfREJMKDIuMC8zLjBmKSk7CisgICAgICAgIGdhaW5fbSA9IGZNdWx0KGdhaW5fbSwgRkwyRlhDT05TVF9EQkwoMi4wIC8gMy4wZikpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAweDU6IC8qIDAuOCBvZiByYWRpeCAyIChlLmcuIHRsIDE2MCksIDEvdGwgPSAxLjAvKEZES3BvdygyLjAsIC1sb2cyX3RsKQorICAgICAgICAgICAgICAgKiAwLjgvMS41KSAqLworICAgICAgaWYgKGdhaW5fbSA9PSAoRklYUF9EQkwpMCkgeworICAgICAgICBnYWluX20gPSBGTDJGWENPTlNUX0RCTCgwLjUzMzMzMzMzMzMzMzMzMzMzMzMzZik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnYWluX20gPSBmTXVsdChnYWluX20sIEZMMkZYQ09OU1RfREJMKDAuNTMzMzMzMzMzMzMzMzMzMzMzMzNmKSk7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICBjYXNlIDB4NDoKQEAgLTE0OSwxMiArMzI0LDcgQEAKICAgKnBHYWluX2UgPSBnYWluX2U7CiB9CiAKLUlOVCBpbWRjdF9kcmFpbigKLSAgICAgICAgSF9NRENUIGhNZGN0LAotICAgICAgICBGSVhQX0RCTCAqb3V0cHV0LAotICAgICAgICBJTlQgbnJTYW1wbGVzUm9vbQotICAgICAgICApCi17CitJTlQgaW1kY3RfZHJhaW4oSF9NRENUIGhNZGN0LCBGSVhQX0RCTCAqb3V0cHV0LCBJTlQgbnJTYW1wbGVzUm9vbSkgewogICBpbnQgYnVmZmVyZWRfc2FtcGxlcyA9IDA7CiAKICAgaWYgKG5yU2FtcGxlc1Jvb20gPiAwKSB7CkBAIC0xNjIsNjEgKzMzMiw2NiBAQAogCiAgICAgRkRLX0FTU0VSVChidWZmZXJlZF9zYW1wbGVzIDw9IG5yU2FtcGxlc1Jvb20pOwogCi0gICAgaWYgKGJ1ZmZlcmVkX3NhbXBsZXMgPiAwKSAgewotICAgICAgRkRLbWVtY3B5KG91dHB1dCwgaE1kY3QtPm92ZXJsYXAudGltZSwgYnVmZmVyZWRfc2FtcGxlcypzaXplb2YoRklYUF9EQkwpKTsKKyAgICBpZiAoYnVmZmVyZWRfc2FtcGxlcyA+IDApIHsKKyAgICAgIEZES21lbWNweShvdXRwdXQsIGhNZGN0LT5vdmVybGFwLnRpbWUsCisgICAgICAgICAgICAgICAgYnVmZmVyZWRfc2FtcGxlcyAqIHNpemVvZihGSVhQX0RCTCkpOwogICAgICAgaE1kY3QtPm92X29mZnNldCA9IDA7CiAgICAgfQogICB9CiAgIHJldHVybiBidWZmZXJlZF9zYW1wbGVzOwogfQogCi1JTlQgaW1kY3RfY29weV9vdl9hbmRfbnIoCi0gICAgICAgIEhfTURDVCBoTWRjdCwKLSAgICAgICAgRklYUF9EQkwgKiBwVGltZURhdGEsCi0gICAgICAgIElOVCBuclNhbXBsZXMKLSAgICAgICAgKQoteworSU5UIGltZGN0X2NvcHlfb3ZfYW5kX25yKEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKnBUaW1lRGF0YSwgSU5UIG5yU2FtcGxlcykgewogICBGSVhQX0RCTCAqcE92bDsKICAgaW50IG50LCBuZiwgaTsKIAogICBudCA9IGZNaW4oaE1kY3QtPm92X29mZnNldCwgbnJTYW1wbGVzKTsKICAgbnJTYW1wbGVzIC09IG50OwogICBuZiA9IGZNaW4oaE1kY3QtPnByZXZfbnIsIG5yU2FtcGxlcyk7Ci0gIG5yU2FtcGxlcyAtPSBuZjsKLSAgRkRLbWVtY3B5KHBUaW1lRGF0YSwgaE1kY3QtPm92ZXJsYXAudGltZSwgbnQqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNweShwVGltZURhdGEsIGhNZGN0LT5vdmVybGFwLnRpbWUsIG50ICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgIHBUaW1lRGF0YSArPSBudDsKIAogICBwT3ZsID0gaE1kY3QtPm92ZXJsYXAuZnJlcSArIGhNZGN0LT5vdl9zaXplIC0gMTsKLSAgZm9yIChpPTA7IGk8bmY7IGkrKykgewotICAgIEZJWFBfREJMIHggPSAtICgqcE92bC0tKTsKLSAgICAqcFRpbWVEYXRhID0gSU1EQ1RfU0NBTEVfREJMKHgpOwotICAgIHBUaW1lRGF0YSArKzsKKyAgaWYgKGhNZGN0LT5wcmV2UHJldkFsaWFzU3ltbWV0cnkgPT0gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBuZjsgaSsrKSB7CisgICAgICBGSVhQX0RCTCB4ID0gLSgqcE92bC0tKTsKKyAgICAgICpwVGltZURhdGEgPSBJTURDVF9TQ0FMRV9EQkwoeCk7CisgICAgICBwVGltZURhdGErKzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IG5mOyBpKyspIHsKKyAgICAgIEZJWFBfREJMIHggPSAoKnBPdmwtLSk7CisgICAgICAqcFRpbWVEYXRhID0gSU1EQ1RfU0NBTEVfREJMKHgpOworICAgICAgcFRpbWVEYXRhKys7CisgICAgfQogICB9CiAKLSAgcmV0dXJuIChudCtuZik7CisgIHJldHVybiAobnQgKyBuZik7CiB9CiAKLXZvaWQgaW1kY3RfYWRhcHRfcGFyYW1ldGVycyhIX01EQ1QgaE1kY3QsIGludCAqcGZsLCBpbnQgKnBubCwgaW50IHRsLCBjb25zdCBGSVhQX1dUUCAqd2xzLCBpbnQgbm9PdXRTYW1wbGVzKQotewordm9pZCBpbWRjdF9hZGFwdF9wYXJhbWV0ZXJzKEhfTURDVCBoTWRjdCwgaW50ICpwZmwsIGludCAqcG5sLCBpbnQgdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9XVFAgKndscywgaW50IG5vT3V0U2FtcGxlcykgewogICBpbnQgZmwgPSAqcGZsLCBubCA9ICpwbmw7CiAgIGludCB3aW5kb3dfZGlmZiwgdXNlX2N1cnJlbnQgPSAwLCB1c2VfcHJldmlvdXMgPSAwOwogICBpZiAoaE1kY3QtPnByZXZfdGwgPT0gMCkgewotICAgIGhNZGN0LT5wcmV2X3dycyAgICA9IHdsczsKLSAgICBoTWRjdC0+cHJldl9mciAgICAgPSBmbDsKLSAgICBoTWRjdC0+cHJldl9uciAgICAgPSAobm9PdXRTYW1wbGVzLWZsKT4+MTsKLSAgICBoTWRjdC0+cHJldl90bCAgICAgPSBub091dFNhbXBsZXM7Ci0gICAgaE1kY3QtPm92X29mZnNldCAgID0gMDsKKyAgICBoTWRjdC0+cHJldl93cnMgPSB3bHM7CisgICAgaE1kY3QtPnByZXZfZnIgPSBmbDsKKyAgICBoTWRjdC0+cHJldl9uciA9IChub091dFNhbXBsZXMgLSBmbCkgPj4gMTsKKyAgICBoTWRjdC0+cHJldl90bCA9IG5vT3V0U2FtcGxlczsKKyAgICBoTWRjdC0+b3Zfb2Zmc2V0ID0gMDsKICAgICB1c2VfY3VycmVudCA9IDE7CiAgIH0KIAotICB3aW5kb3dfZGlmZiA9IChoTWRjdC0+cHJldl9mciAtIGZsKT4+MTsKKyAgd2luZG93X2RpZmYgPSAoaE1kY3QtPnByZXZfZnIgLSBmbCkgPj4gMTsKIAotICAvKiBjaGVjayBpZiB0aGUgcHJldmlvdXMgd2luZG93IHNsb3BlIGNhbiBiZSBhZGp1c3RlZCB0byBtYXRjaCB0aGUgY3VycmVudCB3aW5kb3cgc2xvcGUgKi8KKyAgLyogY2hlY2sgaWYgdGhlIHByZXZpb3VzIHdpbmRvdyBzbG9wZSBjYW4gYmUgYWRqdXN0ZWQgdG8gbWF0Y2ggdGhlIGN1cnJlbnQKKyAgICogd2luZG93IHNsb3BlICovCiAgIGlmIChoTWRjdC0+cHJldl9uciArIHdpbmRvd19kaWZmID4gMCkgewogICAgIHVzZV9jdXJyZW50ID0gMTsKICAgfQotICAvKiBjaGVjayBpZiB0aGUgY3VycmVudCB3aW5kb3cgc2xvcGUgY2FuIGJlIGFkanVzdGVkIHRvIG1hdGNoIHRoZSBwcmV2aW91cyB3aW5kb3cgc2xvcGUgKi8KLSAgaWYgKG5sIC0gd2luZG93X2RpZmYgPiAwICkgeworICAvKiBjaGVjayBpZiB0aGUgY3VycmVudCB3aW5kb3cgc2xvcGUgY2FuIGJlIGFkanVzdGVkIHRvIG1hdGNoIHRoZSBwcmV2aW91cworICAgKiB3aW5kb3cgc2xvcGUgKi8KKyAgaWYgKG5sIC0gd2luZG93X2RpZmYgPiAwKSB7CiAgICAgdXNlX3ByZXZpb3VzID0gMTsKICAgfQogCkBAIC0yMjQsMTMgKzM5OSwxMSBAQAogICBpZiAodXNlX2N1cnJlbnQgJiYgdXNlX3ByZXZpb3VzKSB7CiAgICAgaWYgKGZsIDwgaE1kY3QtPnByZXZfZnIpIHsKICAgICAgIHVzZV9jdXJyZW50ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgdXNlX3ByZXZpb3VzID0gMDsKICAgICB9CiAgIH0KICAgLyoKLSAgICogSWYgdGhlIHByZXZpb3VzIHRyYW5zZm9ybSBibG9jayBpcyBiaWcgZW5vdWdoLCBlbmxhcmdlIHByZXZpb3VzIHdpbmRvdyBvdmVybGFwLAotICAgKiBpZiBub3QsIHRoZW4gc2hyaW5rIGN1cnJlbnQgd2luZG93IG92ZXJsYXAuCisgICAqIElmIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm0gYmxvY2sgaXMgYmlnIGVub3VnaCwgZW5sYXJnZSBwcmV2aW91cyB3aW5kb3cKKyAgICogb3ZlcmxhcCwgaWYgbm90LCB0aGVuIHNocmluayBjdXJyZW50IHdpbmRvdyBvdmVybGFwLgogICAgKi8KICAgaWYgKHVzZV9jdXJyZW50KSB7CiAgICAgaE1kY3QtPnByZXZfbnIgKz0gd2luZG93X2RpZmY7CkBAIC0yNDUsMjkgKzQxOCw2NCBAQAogICAqcG5sID0gbmw7CiB9CiAKLUlOVCAgaW1kY3RfYmxvY2soCi0gICAgICAgIEhfTURDVCBoTWRjdCwKLSAgICAgICAgRklYUF9EQkwgKm91dHB1dCwKLSAgICAgICAgRklYUF9EQkwgKnNwZWN0cnVtLAotICAgICAgICBjb25zdCBTSE9SVCBzY2FsZWZhY3RvcltdLAotICAgICAgICBjb25zdCBJTlQgblNwZWMsCi0gICAgICAgIGNvbnN0IElOVCBub091dFNhbXBsZXMsCi0gICAgICAgIGNvbnN0IElOVCB0bCwKLSAgICAgICAgY29uc3QgRklYUF9XVFAgKndscywKLSAgICAgICAgSU5UIGZsLAotICAgICAgICBjb25zdCBGSVhQX1dUUCAqd3JzLAotICAgICAgICBjb25zdCBJTlQgZnIsCi0gICAgICAgIEZJWFBfREJMIGdhaW4KLSAgICAgICAgKQoteworLyoKK1RoaXMgcHJvZ3JhbSBpbXBsZW1lbnRzIHRoZSBpbnZlcnNlIG1vZHVsYXRlZCBsYXBwZWQgdHJhbnNmb3JtLCBhIGdlbmVyYWxpemVkCit2ZXJzaW9uIG9mIHRoZSBpbnZlcnNlIE1EQ1QgdHJhbnNmb3JtLiBTZXR0aW5nIG5vbmUgb2YgdGhlIE1MVF8qX0FMSUFTX0ZMQUcKK2ZsYWdzIGNvbXB1dGVzIHRoZSBJTURDVCwgc2V0dGluZyBhbGwgb2YgdGhlbSBjb21wdXRlcyB0aGUgSU1EU1QuIE90aGVyCitjb21iaW5hdGlvbnMgb2YgdGhlc2UgZmxhZ3MgY29tcHV0ZSB0eXBlIElJSSB0cmFuc2Zvcm1zIHVzZWQgYnkgdGhlIFJTVkQ2MAorbXVsdGljaGFubmVsIHRvb2wgZm9yIHRyYW5zaXRpb25zIGJldHdlZW4gTURDVC9NRFNULiBUaGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uCityZWxhdGVzIHRvIHRoZSBJTURDVCBvbmx5LgorCitJZiB3ZSBwYXNzIHRoZSBkYXRhIGJsb2NrIChBLEIsQyxELEUsRikgdG8gdGhlIEZPUldBUkQgTURDVCBpdCB3aWxsIHByb2R1Y2UgdHdvCitvdXRwdXRzLiBUaGUgZmlyc3Qgb25lIHdpbGwgYmUgb3ZlciB0aGUgKEEsQixDLEQpIHBhcnQgPT4oLUQtQ3IsQS1CcikgYW5kIHRoZQorc2Vjb25kIG9uZSB3aWxsIGJlIG92ZXIgdGhlIChDLEQsRSxGKSBwYXJ0ID0+ICgtRi1FcixDLURyKSwgc2luY2UgdGhlcmUgaXMgYQorb3ZlcmxhcCBiZXR3ZWVuIGNvbnNlcXV0aXZlIHBhc3NlcyBvZiB0aGUgYWxnb3JpdGhtLiBUaGlzIG92ZXJsYXAgaXMgb3ZlciB0aGUKKyhDLEQpIHNlZ21lbnRzLiBUaGUgdHdvIG91dHB1dHMgd2lsbCBiZSBnaXZlbiBzZXF1ZW50aWFsbHkgdG8gdGhlIERDVCBJVgorYWxnb3JpdGhtLiBBdCB0aGUgSU5WRVJTRSBNRENUIHNpZGUgd2UgZ2V0IHR3byBjb25zZWN1dGl2ZSBvdXRwdXRzIGZyb20gdGhlIElEQ1QKK0lWIGFsZ29yaXRobSwgbmFtZWx5IHRoZSBzYW1lIGJsb2NrczogKC1ELUNyLEEtQnIpIGFuZCAoLUYtRXIsQy1EcikuIFRoZSBmaXJzdAorb2YgdGhlbSBsYW5kcyBpbiB0aGUgT3ZlcmxhcCBidWZmZXIgYW5kIHRoZSBzZWNvbmQgaXMgaW4gdGhlIHdvcmtpbmcgb25lLCB3aGljaCwKK29uZSBhbGdvcml0aG0gcGFzcyBsYXRlciB3aWxsIHN1YnN0aXR1dGUgdGhlIG9uZSByZXNpZGluZyBpbiB0aGUgb3ZlcmxhcAorcmVnaXN0ZXIuIFRoZSBJTURDVCBhbGdvcml0aG0gaGFzIHRvIHByb2R1Y2UgdGhlIEMgYW5kIEQgc2VnbWVudHMgZnJvbSB0aGUgdHdvCitidWZmZXJzLiBJbiBvcmRlciB0byBkbyB0aGlzIHdlIHRha2UgdGhlIGxlZnQgcGFydCBvZiB0aGUgb3ZlcmxhcAorYnVmZmVyKC1ELUNyLEEtQnIpLCBuYW1lbHkgKC1ELUNyKSBhbmQgYWRkIGl0IGFwcHJvcHJpYXRlbHkgdG8gdGhlIHJpZ2h0IHBhcnQgb2YKK3RoZSB3b3JraW5nIGJ1ZmZlciAoLUYtRXIsQy1EciksIG5hbWVseSAoQy1EciksIHNvIHRoYXQgd2UgZ2V0IGZpcnN0IHRoZSBDCitzZWdtZW50IGFuZCBsYXRlciB0aGUgRCBzZWdtZW50LiBXZSBkbyB0aGlzIGluIHRoZSBmb2xsb3dpbmcgd2F5OiBGcm9tIHRoZSByaWdodAorcGFydCBvZiB0aGUgd29ya2luZyBidWZmZXIoQy1Ecikgd2Ugc3VidHJhY3QgdGhlIGZsaXBwZWQgbGVmdCBwYXJ0IG9mIHRoZQorb3ZlcmxhcCBidWZmZXIoLUQtQ3IpOgorCitSZXN1bHQgPSAoQy1EcikgLSBmbGlwcGVkKC1ELUNyKSA9IEMgLURyICsgRHIgKyBDID0gMkMKK1dlIGRpdmlkZSBieSB0d28gYW5kIGdldCB0aGUgQyBzZWdtZW50LiBXaGF0IHdlIGRpZCBpcyBhZGRpbmcgdGhlIHJpZ2h0IHBhcnQgb2YKK3RoZSBmaXJzdCBmcmFtZSB0byB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBzZWNvbmQgb25lLiAgIFdoaWxlIGFwcGx5aW5nIHRoZXNlCitvcGVyYXRpb24gd2UgbXVsdGlwbHkgdGhlIHJlc3BlY3RpdmUgc2VnbWVudHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgd2luZG93CitmdW5jdGlvbnMuCisKK0luIG9yZGVyIHRvIGdldCB0aGUgRCBzZWdtZW50IHdlIGRvIHRoZSBmb2xsb3dpbmc6CitGcm9tIHRoZSBuZWdhdGVkIHNlY29uZCBwYXJ0IG9mIHRoZSB3b3JraW5nIGJ1ZmZlcihDLURyKSB3ZSBzdWJ0cmFjdCB0aGUgZmxpcHBlZAorZmlyc3QgcGFydCBvZiB0aGUgb3ZlcmxhcCBidWZmZXIgKC1ELUNyKToKKworUmVzdWx0PSAtIChDIC1EcikgLSBmbGlwcGVkKC1ELUNyKT0gLUMgK0RyICtEciArQyA9IDJEci4KK0FmdGVyIGRpdmlkaW5nIGJ5IHR3byBhbmQgZmxpcHBpbmcgd2UgZ2V0IHRoZSBEIHNlZ21lbnQuV2hhdCB3ZSBkaWQgaXMgYWRkaW5nCit0aGUgcmlnaHQgcGFydCBvZiB0aGUgZmlyc3QgZnJhbWUgdG8gdGhlIGxlZnQgcGFydCBvZiB0aGUgc2Vjb25kIG9uZS4gICBXaGlsZQorYXBwbHlpbmcgdGhlc2Ugb3BlcmF0aW9uIHdlIG11bHRpcGx5IHRoZSByZXNwZWN0aXZlIHNlZ21lbnRzIHdpdGggdGhlCithcHByb3ByaWF0ZSB3aW5kb3cgZnVuY3Rpb25zLgorCitPbmNlIHdlIGhhdmUgb2J0YWluZWQgdGhlIEMgYW5kIEQgc2VnbWVudHMgdGhlIG92ZXJsYXAgYnVmZmVyIGlzIGVtcHRpZWQgYW5kIHRoZQorY3VycmVudCBidWZmZXIgaXMgc2VudCBpbiBpdCwgc28gdGhhdCB0aGUgRSBhbmQgRiBzZWdtZW50cyBhcmUgYXZhaWxhYmxlIGZvcgorZGVjb2RpbmcgaW4gdGhlIG5leHQgYWxnb3JpdGhtIHBhc3MuKi8KK0lOVCBpbWx0X2Jsb2NrKEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKm91dHB1dCwgRklYUF9EQkwgKnNwZWN0cnVtLAorICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgc2NhbGVmYWN0b3JbXSwgY29uc3QgSU5UIG5TcGVjLAorICAgICAgICAgICAgICAgY29uc3QgSU5UIG5vT3V0U2FtcGxlcywgY29uc3QgSU5UIHRsLCBjb25zdCBGSVhQX1dUUCAqd2xzLAorICAgICAgICAgICAgICAgSU5UIGZsLCBjb25zdCBGSVhQX1dUUCAqd3JzLCBjb25zdCBJTlQgZnIsIEZJWFBfREJMIGdhaW4sCisgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKICAgRklYUF9EQkwgKnBPdmw7CiAgIEZJWFBfREJMICpwT3V0MCA9IG91dHB1dCwgKnBPdXQxOwogICBJTlQgbmwsIG5yOwogICBpbnQgdywgaSwgbnJTYW1wbGVzID0gMCwgc3BlY1NoaWZ0U2NhbGUsIHRyYW5zZm9ybV9nYWluX2UgPSAwOworICBpbnQgY3VyckFsaWFzU3ltbWV0cnkgPSAoZmxhZ3MgJiBNTFRfRkxBR19DVVJSX0FMSUFTX1NZTU1FVFJZKTsKIAogICAvKiBEZXJpdmUgTlIgYW5kIE5MICovCi0gIG5yID0gKHRsIC0gZnIpPj4xOwotICBubCA9ICh0bCAtIGZsKT4+MTsKKyAgbnIgPSAodGwgLSBmcikgPj4gMTsKKyAgbmwgPSAodGwgLSBmbCkgPj4gMTsKIAogICAvKiBJbmNsdWRlIDIvTiBJTURDVCBnYWluIGludG8gZ2FpbiBmYWN0b3IgYW5kIGV4cG9uZW50LiAqLwogICBpbWRjdF9nYWluKCZnYWluLCAmdHJhbnNmb3JtX2dhaW5fZSwgdGwpOwpAQCAtMjc5LDEwNyArNDg3LDI0MSBAQAogCiAgIHBPdmwgPSBoTWRjdC0+b3ZlcmxhcC5mcmVxICsgaE1kY3QtPm92X3NpemUgLSAxOwogCi0gIGlmICggbm9PdXRTYW1wbGVzID4gbnJTYW1wbGVzICkgeworICBpZiAobm9PdXRTYW1wbGVzID4gbnJTYW1wbGVzKSB7CiAgICAgLyogUHVyZ2UgYnVmZmVyZWQgb3V0cHV0LiAqLwotICAgIGZvciAoaT0wOyBpPGhNZGN0LT5vdl9vZmZzZXQ7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBoTWRjdC0+b3Zfb2Zmc2V0OyBpKyspIHsKICAgICAgICpwT3V0MCA9IGhNZGN0LT5vdmVybGFwLnRpbWVbaV07Ci0gICAgICBwT3V0MCArKzsKKyAgICAgIHBPdXQwKys7CiAgICAgfQogICAgIG5yU2FtcGxlcyA9IGhNZGN0LT5vdl9vZmZzZXQ7CiAgICAgaE1kY3QtPm92X29mZnNldCA9IDA7CiAgIH0KIAotICBmb3IgKHc9MDsgdzxuU3BlYzsgdysrKQotICB7CisgIGZvciAodyA9IDA7IHcgPCBuU3BlYzsgdysrKSB7CiAgICAgRklYUF9EQkwgKnBTcGVjLCAqcEN1cnI7CiAgICAgY29uc3QgRklYUF9XVFAgKnBXaW5kb3c7CiAKKyAgICAvKiBEZXRlY3QgRlJwcmV2aW91cyAvIEZMIG1pc21hdGNoZXMgYW5kIG92ZXJyaWRlIHBhcmFtZXRlcnMgYWNjb3JkaW5nbHkgKi8KKyAgICBpZiAoaE1kY3QtPnByZXZfZnIgIT0gZmwpIHsKKyAgICAgIGltZGN0X2FkYXB0X3BhcmFtZXRlcnMoaE1kY3QsICZmbCwgJm5sLCB0bCwgd2xzLCBub091dFNhbXBsZXMpOworICAgIH0KKwogICAgIHNwZWNTaGlmdFNjYWxlID0gdHJhbnNmb3JtX2dhaW5fZTsKIAogICAgIC8qIFNldHVwIHdpbmRvdyBwb2ludGVycyAqLwogICAgIHBXaW5kb3cgPSBoTWRjdC0+cHJldl93cnM7CiAKICAgICAvKiBDdXJyZW50IHNwZWN0cnVtICovCi0gICAgcFNwZWMgPSBzcGVjdHJ1bSt3KnRsOworICAgIHBTcGVjID0gc3BlY3RydW0gKyB3ICogdGw7CiAKICAgICAvKiBEQ1QgSVYgb2YgY3VycmVudCBzcGVjdHJ1bS4gKi8KLSAgICBkY3RfSVYocFNwZWMsIHRsLCAmc3BlY1NoaWZ0U2NhbGUpOwotCi0gICAgLyogT3B0aW9uYWwgc2NhbGluZyBvZiB0aW1lIGRvbWFpbiAtIG5vIHlldCB3aW5kb3dlZCAtIG9mIGN1cnJlbnQgc3BlY3RydW0gKi8KLSAgICAvKiBhbmQgZGUtc2NhbGUgY3VycmVudCBzcGVjdHJ1bSBzaWduYWwgKHRpbWUgZG9tYWluLCBubyB5ZXQgd2luZG93ZWQpICovCQotICAgIGlmIChnYWluICE9IChGSVhQX0RCTCkwKSB7Ci0gICAgICBzY2FsZVZhbHVlc1dpdGhGYWN0b3IocFNwZWMsIGdhaW4sIHRsLCBzY2FsZWZhY3Rvclt3XSArIHNwZWNTaGlmdFNjYWxlKTsKKyAgICBpZiAoY3VyckFsaWFzU3ltbWV0cnkgPT0gMCkgeworICAgICAgaWYgKGhNZGN0LT5wcmV2QWxpYXNTeW1tZXRyeSA9PSAwKSB7CisgICAgICAgIGRjdF9JVihwU3BlYywgdGwsICZzcGVjU2hpZnRTY2FsZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBGSVhQX0RCTCBfdG1wWzEwMjQgKyBBTElHTk1FTlRfREVGQVVMVCAvIHNpemVvZihGSVhQX0RCTCldOworICAgICAgICBGSVhQX0RCTCAqdG1wID0gKEZJWFBfREJMICopQUxJR05fUFRSKF90bXApOworICAgICAgICBDX0FMTE9DX0FMSUdORURfUkVHSVNURVIodG1wLCBzaXplb2YoX3RtcCkpOworICAgICAgICBkY3RfSUlJKHBTcGVjLCB0bXAsIHRsLCAmc3BlY1NoaWZ0U2NhbGUpOworICAgICAgICBDX0FMTE9DX0FMSUdORURfVU5SRUdJU1RFUih0bXApOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICBzY2FsZVZhbHVlcyhwU3BlYywgdGwsIHNjYWxlZmFjdG9yW3ddICsgc3BlY1NoaWZ0U2NhbGUpOworICAgICAgaWYgKGhNZGN0LT5wcmV2QWxpYXNTeW1tZXRyeSA9PSAwKSB7CisgICAgICAgIEZJWFBfREJMIF90bXBbMTAyNCArIEFMSUdOTUVOVF9ERUZBVUxUIC8gc2l6ZW9mKEZJWFBfREJMKV07CisgICAgICAgIEZJWFBfREJMICp0bXAgPSAoRklYUF9EQkwgKilBTElHTl9QVFIoX3RtcCk7CisgICAgICAgIENfQUxMT0NfQUxJR05FRF9SRUdJU1RFUih0bXAsIHNpemVvZihfdG1wKSk7CisgICAgICAgIGRzdF9JSUkocFNwZWMsIHRtcCwgdGwsICZzcGVjU2hpZnRTY2FsZSk7CisgICAgICAgIENfQUxMT0NfQUxJR05FRF9VTlJFR0lTVEVSKHRtcCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkc3RfSVYocFNwZWMsIHRsLCAmc3BlY1NoaWZ0U2NhbGUpOworICAgICAgfQogICAgIH0KIAotICAgIGlmICggbm9PdXRTYW1wbGVzIDw9IG5yU2FtcGxlcyApIHsKLSAgICAgIC8qIERpdmVydCBvdXRwdXQgZmlyc3QgaGFsZiB0byBvdmVybGFwIGJ1ZmZlciBpZiB3ZSBhbHJlYWR5IGdvdCBlbm91Z2ggb3V0cHV0IHNhbXBsZXMuICovCisgICAgLyogT3B0aW9uYWwgc2NhbGluZyBvZiB0aW1lIGRvbWFpbiAtIG5vIHlldCB3aW5kb3dlZCAtIG9mIGN1cnJlbnQgc3BlY3RydW0KKyAgICAgKi8KKyAgICAvKiBhbmQgZGUtc2NhbGUgY3VycmVudCBzcGVjdHJ1bSBzaWduYWwgKHRpbWUgZG9tYWluLCBubyB5ZXQgd2luZG93ZWQpICovCisgICAgaWYgKGdhaW4gIT0gKEZJWFBfREJMKTApIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0bDsgaSsrKSB7CisgICAgICAgIHBTcGVjW2ldID0gZk11bHQocFNwZWNbaV0sIGdhaW4pOworICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgIGludCBsb2Nfc2NhbGUgPQorICAgICAgICAgIGZpeG1pbl9JKHNjYWxlZmFjdG9yW3ddICsgc3BlY1NoaWZ0U2NhbGUsIChJTlQpREZSQUNUX0JJVFMgLSAxKTsKKyAgICAgIERXT1JEX0FMSUdORUQocFNwZWMpOworICAgICAgc2NhbGVWYWx1ZXNTYXR1cmF0ZShwU3BlYywgdGwsIGxvY19zY2FsZSk7CisgICAgfQorCisgICAgaWYgKG5vT3V0U2FtcGxlcyA8PSBuclNhbXBsZXMpIHsKKyAgICAgIC8qIERpdmVydCBvdXRwdXQgZmlyc3QgaGFsZiB0byBvdmVybGFwIGJ1ZmZlciBpZiB3ZSBhbHJlYWR5IGdvdCBlbm91Z2gKKyAgICAgICAqIG91dHB1dCBzYW1wbGVzLiAqLwogICAgICAgcE91dDAgPSBoTWRjdC0+b3ZlcmxhcC50aW1lICsgaE1kY3QtPm92X29mZnNldDsKLSAgICAgIGhNZGN0LT5vdl9vZmZzZXQgKz0gaE1kY3QtPnByZXZfbnIgKyBmbC8yOworICAgICAgaE1kY3QtPm92X29mZnNldCArPSBoTWRjdC0+cHJldl9uciArIGZsIC8gMjsKICAgICB9IGVsc2UgewogICAgICAgLyogQWNjb3VudCBvdXRwdXQgc2FtcGxlcyAqLwotICAgICAgbnJTYW1wbGVzICs9IGhNZGN0LT5wcmV2X25yICsgZmwvMjsKKyAgICAgIG5yU2FtcGxlcyArPSBoTWRjdC0+cHJldl9uciArIGZsIC8gMjsKICAgICB9CiAKICAgICAvKiBOUiBvdXRwdXQgc2FtcGxlcyAwIC4uIE5SLiAtb3ZlcmxhcFtUTC8yLi5UTC8yLU5SXSAqLwotICAgIGZvciAoaT0wOyBpPGhNZGN0LT5wcmV2X25yOyBpKyspIHsKLSAgICAgIEZJWFBfREJMIHggPSAtICgqcE92bC0tKTsKLSAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTCh4KTsKLSAgICAgIHBPdXQwICsrOworICAgIGlmICgoaE1kY3QtPnBGYWNaaXIgIT0gMCkgJiYgKGhNZGN0LT5wcmV2X25yID09IGZsIC8gMikpIHsKKyAgICAgIC8qIEluIHRoZSBjYXNlIG9mIEFDRUxQIC0+IFRDWDIwIC0+IEZEIHNob3J0IGFkZCBGQUMgWklSIG9uIG5yIHNpZ25hbCBwYXJ0CisgICAgICAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoTWRjdC0+cHJldl9ucjsgaSsrKSB7CisgICAgICAgIEZJWFBfREJMIHggPSAtKCpwT3ZsLS0pOworICAgICAgICAqcE91dDAgPSBJTURDVF9TQ0FMRV9EQkwoeCArIGhNZGN0LT5wRmFjWmlyW2ldKTsKKyAgICAgICAgcE91dDArKzsKKyAgICAgIH0KKyAgICAgIGhNZGN0LT5wRmFjWmlyID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgLyogSGVyZSB3ZSBpbXBsZW1lbnQgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2Ygd2hhdCBoYXBwZW5zIGFmdGVyIHRoZSB0aGlzCisgICAgICBwaWVjZSBvZiBjb2RlIChzZWUgdGhlIGNvbW1lbnRzIGJlbG93KS4gV2UgaW1wbGVtZW50IHRoZSBmb2xkaW5nIG9mIEMgYW5kCisgICAgICBEIHNlZ21lbnRzIGZyb20gKC1ELUNyKSBidXQgRCBpcyB6ZXJvLCBiZWNhdXNlIGluIHRoaXMgcGFydCBvZiB0aGUgTURDVAorICAgICAgc2VxdWVuY2UgdGhlIHdpbmRvdyBjb2VmZmljaWVudHMgd2l0aCB3aGljaCBEIG11c3QgYmUgbXVsdGlwbGllZCBhcmUgemVyby4KKyAgICAgICJwT3V0MCIgd3JpdGVzIHNlcXVlbnRpYWxseSB0aGUgQyBibG9jayBmcm9tIGxlZnQgdG8gcmlnaHQuICAgKi8KKyAgICAgIGlmIChoTWRjdC0+cHJldlByZXZBbGlhc1N5bW1ldHJ5ID09IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhNZGN0LT5wcmV2X25yOyBpKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCB4ID0gLSgqcE92bC0tKTsKKyAgICAgICAgICAqcE91dDAgPSBJTURDVF9TQ0FMRV9EQkwoeCk7CisgICAgICAgICAgcE91dDArKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhNZGN0LT5wcmV2X25yOyBpKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCB4ID0gKnBPdmwtLTsKKyAgICAgICAgICAqcE91dDAgPSBJTURDVF9TQ0FMRV9EQkwoeCk7CisgICAgICAgICAgcE91dDArKzsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KIAotICAgIGlmICggbm9PdXRTYW1wbGVzIDw9IG5yU2FtcGxlcyApIHsKLSAgICAgIC8qIERpdmVydCBvdXRwdXQgc2Vjb25kIGhhbGYgdG8gb3ZlcmxhcCBidWZmZXIgaWYgd2UgYWxyZWFkeSBnb3QgZW5vdWdoIG91dHB1dCBzYW1wbGVzLiAqLwotICAgICAgcE91dDEgPSBoTWRjdC0+b3ZlcmxhcC50aW1lICsgaE1kY3QtPm92X29mZnNldCArIGZsLzIgLSAxOwotICAgICAgaE1kY3QtPm92X29mZnNldCArPSBmbC8yICsgbmw7CisgICAgaWYgKG5vT3V0U2FtcGxlcyA8PSBuclNhbXBsZXMpIHsKKyAgICAgIC8qIERpdmVydCBvdXRwdXQgc2Vjb25kIGhhbGYgdG8gb3ZlcmxhcCBidWZmZXIgaWYgd2UgYWxyZWFkeSBnb3QgZW5vdWdoCisgICAgICAgKiBvdXRwdXQgc2FtcGxlcy4gKi8KKyAgICAgIHBPdXQxID0gaE1kY3QtPm92ZXJsYXAudGltZSArIGhNZGN0LT5vdl9vZmZzZXQgKyBmbCAvIDIgLSAxOworICAgICAgaE1kY3QtPm92X29mZnNldCArPSBmbCAvIDIgKyBubDsKICAgICB9IGVsc2UgewogICAgICAgcE91dDEgPSBwT3V0MCArIChmbCAtIDEpOwotICAgICAgbnJTYW1wbGVzICs9IGZsLzIgKyBubDsKKyAgICAgIG5yU2FtcGxlcyArPSBmbCAvIDIgKyBubDsKICAgICB9CiAKLSAgICAvKiBvdXRwdXQgc2FtcGxlcyBiZWZvcmUgd2luZG93IGNyb3NzaW5nIHBvaW50IE5SIC4uIFRMLzIuIC1vdmVybGFwW1RMLzItTlIuLlRMLzItTlItRkwvMl0gKyBjdXJyZW50W05SLi5UTC8yXSAqLwotICAgIC8qIG91dHB1dCBzYW1wbGVzIGFmdGVyIHdpbmRvdyBjcm9zc2luZyBwb2ludCBUTC8yIC4uIFRMLzIrRkwvMi4gLW92ZXJsYXBbMC4uRkwvMl0gLSBjdXJyZW50W1RMLzIuLkZMLzJdICovCi0gICAgcEN1cnIgPSBwU3BlYyArIHRsIC0gZmwvMjsKLSAgICBmb3IgKGk9MDsgaTxmbC8yOyBpKyspIHsKLSAgICAgIEZJWFBfREJMIHgwLCB4MTsKKyAgICAvKiBvdXRwdXQgc2FtcGxlcyBiZWZvcmUgd2luZG93IGNyb3NzaW5nIHBvaW50IE5SIC4uIFRMLzIuCisgICAgICogLW92ZXJsYXBbVEwvMi1OUi4uVEwvMi1OUi1GTC8yXSArIGN1cnJlbnRbTlIuLlRMLzJdICovCisgICAgLyogb3V0cHV0IHNhbXBsZXMgYWZ0ZXIgd2luZG93IGNyb3NzaW5nIHBvaW50IFRMLzIgLi4gVEwvMitGTC8yLgorICAgICAqIC1vdmVybGFwWzAuLkZMLzJdIC0gY3VycmVudFtUTC8yLi5GTC8yXSAqLworICAgIHBDdXJyID0gcFNwZWMgKyB0bCAtIGZsIC8gMjsKKyAgICBEV09SRF9BTElHTkVEKHBDdXJyKTsKKyAgICBDX0FMTE9DX0FMSUdORURfUkVHSVNURVIocFdpbmRvdywgZmwpOworICAgIERXT1JEX0FMSUdORUQocFdpbmRvdyk7CisgICAgQ19BTExPQ19BTElHTkVEX1VOUkVHSVNURVIocFdpbmRvdyk7CiAKLSAgICAgIGNwbHhNdWx0KCZ4MSwgJngwLCAqcEN1cnIrKywgLSAqcE92bC0tLCBwV2luZG93W2ldKTsKLSAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTCh4MCk7Ci0gICAgICAqcE91dDEgPSBJTURDVF9TQ0FMRV9EQkwoLXgxKTsKLSAgICAgIHBPdXQwICsrOwotICAgICAgcE91dDEgLS07CisgICAgaWYgKGhNZGN0LT5wcmV2UHJldkFsaWFzU3ltbWV0cnkgPT0gMCkgeworICAgICAgaWYgKGhNZGN0LT5wcmV2QWxpYXNTeW1tZXRyeSA9PSAwKSB7CisgICAgICAgIGlmICghaE1kY3QtPnBBc3ltT3ZscCkgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgICAgICAgRklYUF9EQkwgeDAsIHgxOworICAgICAgICAgICAgY3BseE11bHREaXYyKCZ4MSwgJngwLCAqcEN1cnIrKywgLSpwT3ZsLS0sIHBXaW5kb3dbaV0pOworICAgICAgICAgICAgKnBPdXQwID0gSU1EQ1RfU0NBTEVfREJMX0xTSDEoeDApOworICAgICAgICAgICAgKnBPdXQxID0gSU1EQ1RfU0NBTEVfREJMX0xTSDEoLXgxKTsKKyAgICAgICAgICAgIHBPdXQwKys7CisgICAgICAgICAgICBwT3V0MS0tOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGSVhQX0RCTCAqcEFzeW1PdmwgPSBoTWRjdC0+cEFzeW1PdmxwICsgZmwgLyAyIC0gMTsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmwgLyAyOyBpKyspIHsKKyAgICAgICAgICAgIEZJWFBfREJMIHgwLCB4MTsKKyAgICAgICAgICAgIHgxID0gLWZNdWx0RGl2MigqcEN1cnIsIHBXaW5kb3dbaV0udi5yZSkgKworICAgICAgICAgICAgICAgICBmTXVsdERpdjIoKnBBc3ltT3ZsLCBwV2luZG93W2ldLnYuaW0pOworICAgICAgICAgICAgeDAgPSBmTXVsdERpdjIoKnBDdXJyLCBwV2luZG93W2ldLnYuaW0pIC0KKyAgICAgICAgICAgICAgICAgZk11bHREaXYyKCpwT3ZsLCBwV2luZG93W2ldLnYucmUpOworICAgICAgICAgICAgcEN1cnIrKzsKKyAgICAgICAgICAgIHBPdmwtLTsKKyAgICAgICAgICAgIHBBc3ltT3ZsLS07CisgICAgICAgICAgICAqcE91dDArKyA9IElNRENUX1NDQUxFX0RCTF9MU0gxKHgwKTsKKyAgICAgICAgICAgICpwT3V0MS0tID0gSU1EQ1RfU0NBTEVfREJMX0xTSDEoeDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBoTWRjdC0+cEFzeW1PdmxwID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsgLyogcHJldkFsaWFzaW5nU3ltbWV0cnkgPT0gMSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmwgLyAyOyBpKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCB4MCwgeDE7CisgICAgICAgICAgY3BseE11bHREaXYyKCZ4MSwgJngwLCAqcEN1cnIrKywgLSpwT3ZsLS0sIHBXaW5kb3dbaV0pOworICAgICAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTF9MU0gxKHgwKTsKKyAgICAgICAgICAqcE91dDEgPSBJTURDVF9TQ0FMRV9EQkxfTFNIMSh4MSk7CisgICAgICAgICAgcE91dDArKzsKKyAgICAgICAgICBwT3V0MS0tOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsgLyogcHJldlByZXZBbGlhc2luZ1N5bW1ldHJ5ID09IDEgKi8KKyAgICAgIGlmIChoTWRjdC0+cHJldkFsaWFzU3ltbWV0cnkgPT0gMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmwgLyAyOyBpKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCB4MCwgeDE7CisgICAgICAgICAgY3BseE11bHREaXYyKCZ4MSwgJngwLCAqcEN1cnIrKywgKnBPdmwtLSwgcFdpbmRvd1tpXSk7CisgICAgICAgICAgKnBPdXQwID0gSU1EQ1RfU0NBTEVfREJMX0xTSDEoeDApOworICAgICAgICAgICpwT3V0MSA9IElNRENUX1NDQUxFX0RCTF9MU0gxKC14MSk7CisgICAgICAgICAgcE91dDArKzsKKyAgICAgICAgICBwT3V0MS0tOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvKiBwcmV2QWxpYXNpbmdTeW1tZXRyeSA9PSAxICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgICAgIEZJWFBfREJMIHgwLCB4MTsKKyAgICAgICAgICBjcGx4TXVsdERpdjIoJngxLCAmeDAsICpwQ3VycisrLCAqcE92bC0tLCBwV2luZG93W2ldKTsKKyAgICAgICAgICAqcE91dDAgPSBJTURDVF9TQ0FMRV9EQkxfTFNIMSh4MCk7CisgICAgICAgICAgKnBPdXQxID0gSU1EQ1RfU0NBTEVfREJMX0xTSDEoeDEpOworICAgICAgICAgIHBPdXQwKys7CisgICAgICAgICAgcE91dDEtLTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBwT3V0MCArPSAoZmwvMik7CisKKyAgICBpZiAoaE1kY3QtPnBGYWNaaXIgIT0gMCkgeworICAgICAgLyogYWRkIEZBQyBaSVIgb2YgcHJldmlvdXMgQUNFTFAgLT4gbWRjdCB0cmFuc2l0aW9uICovCisgICAgICBGSVhQX0RCTCAqcE91dCA9IHBPdXQwIC0gZmwgLyAyOworICAgICAgRkRLX0FTU0VSVChmbCAvIDIgPD0gMTI4KTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgICBwT3V0W2ldICs9IElNRENUX1NDQUxFX0RCTChoTWRjdC0+cEZhY1ppcltpXSk7CisgICAgICB9CisgICAgICBoTWRjdC0+cEZhY1ppciA9IE5VTEw7CisgICAgfQorICAgIHBPdXQwICs9IChmbCAvIDIpICsgbmw7CiAKICAgICAvKiBOTCBvdXRwdXQgc2FtcGxlcyBUTC8yK0ZMLzIuLlRMLiAtIGN1cnJlbnRbRkwvMi4uMF0gKi8KLSAgICBwT3V0MSArPSAoZmwvMikgKyAxOwotICAgIHBDdXJyID0gcFNwZWMgKyB0bCAtIGZsLzIgLSAxOwotICAgIGZvciAoaT0wOyBpPG5sOyBpKyspIHsKLSAgICAgIEZJWFBfREJMIHggPSAtICgqcEN1cnItLSk7Ci0gICAgICAqcE91dDEgPSBJTURDVF9TQ0FMRV9EQkwoeCk7Ci0gICAgICBwT3V0MSArKzsKKyAgICBwT3V0MSArPSAoZmwgLyAyKSArIDE7CisgICAgcEN1cnIgPSBwU3BlYyArIHRsIC0gZmwgLyAyIC0gMTsKKyAgICAvKiBIZXJlIHdlIGltcGxlbWVudCBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB3aGF0IGhhcHBlbnMgYWJvdmUgdGhlIHRoaXMKKyAgICBwaWVjZSBvZiBjb2RlIChzZWUgdGhlIGNvbW1lbnRzIGFib3ZlKS4gV2UgaW1wbGVtZW50IHRoZSBmb2xkaW5nIG9mIEMgYW5kIEQKKyAgICBzZWdtZW50cyBmcm9tIChDLURyKSBidXQgQyBpcyB6ZXJvLCBiZWNhdXNlIGluIHRoaXMgcGFydCBvZiB0aGUgTURDVAorICAgIHNlcXVlbmNlIHRoZSB3aW5kb3cgY29lZmZpY2llbnRzIHdpdGggd2hpY2ggQyBtdXN0IGJlIG11bHRpcGxpZWQgYXJlIHplcm8uCisgICAgInBPdXQxIiB3cml0ZXMgc2VxdWVudGlhbGx5IHRoZSBEIGJsb2NrIGZyb20gbGVmdCB0byByaWdodC4gICAqLworICAgIGlmIChoTWRjdC0+cHJldkFsaWFzU3ltbWV0cnkgPT0gMCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IG5sOyBpKyspIHsKKyAgICAgICAgRklYUF9EQkwgeCA9IC0oKnBDdXJyLS0pOworICAgICAgICAqcE91dDErKyA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMDsgaSA8IG5sOyBpKyspIHsKKyAgICAgICAgRklYUF9EQkwgeCA9ICpwQ3Vyci0tOworICAgICAgICAqcE91dDErKyA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICAgIH0KICAgICB9CiAKICAgICAvKiBTZXQgb3ZlcmxhcCBzb3VyY2UgcG9pbnRlciBmb3IgbmV4dCB3aW5kb3cgcE92bCA9IHBTcGVjICsgdGwvMiAtIDE7ICovCi0gICAgcE92bCA9IHBTcGVjICsgdGwvMiAtIDE7CisgICAgcE92bCA9IHBTcGVjICsgdGwgLyAyIC0gMTsKIAogICAgIC8qIFByZXZpb3VzIHdpbmRvdyB2YWx1ZXMuICovCiAgICAgaE1kY3QtPnByZXZfbnIgPSBucjsKICAgICBoTWRjdC0+cHJldl9mciA9IGZyOwogICAgIGhNZGN0LT5wcmV2X3RsID0gdGw7CiAgICAgaE1kY3QtPnByZXZfd3JzID0gd3JzOworCisgICAgLyogUHJldmlvdXMgYWxpYXNpbmcgc3ltbWV0cnkgKi8KKyAgICBoTWRjdC0+cHJldlByZXZBbGlhc1N5bW1ldHJ5ID0gaE1kY3QtPnByZXZBbGlhc1N5bW1ldHJ5OworICAgIGhNZGN0LT5wcmV2QWxpYXNTeW1tZXRyeSA9IGN1cnJBbGlhc1N5bW1ldHJ5OwogICB9CiAKICAgLyogU2F2ZSBvdmVybGFwICovCi0gIAotICBwT3ZsID0gaE1kY3QtPm92ZXJsYXAuZnJlcSArIGhNZGN0LT5vdl9zaXplIC0gdGwvMjsKLSAgRkRLX0FTU0VSVChwT3ZsID49IGhNZGN0LT5vdmVybGFwLnRpbWUgKyBoTWRjdC0+b3Zfb2Zmc2V0KTsKLSAgRkRLX0FTU0VSVCh0bC8yIDw9IGhNZGN0LT5vdl9zaXplKTsKLSAgZm9yIChpPTA7IGk8dGwvMjsgaSsrKSB7Ci0gICAgcE92bFtpXSA9IHNwZWN0cnVtW2krKG5TcGVjLTEpKnRsXTsKLSAgfQorCisgIHBPdmwgPSBoTWRjdC0+b3ZlcmxhcC5mcmVxICsgaE1kY3QtPm92X3NpemUgLSB0bCAvIDI7CisgIEZES21lbWNweShwT3ZsLCAmc3BlY3RydW1bKG5TcGVjIC0gMSkgKiB0bF0sICh0bCAvIDIpICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKICAgcmV0dXJuIG5yU2FtcGxlczsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9taXBzL2ZmdF9yYWQyX21pcHMuY3BwIGIvbGliRkRLL3NyYy9taXBzL2ZmdF9yYWQyX21pcHMuY3BwCmluZGV4IGY5M2VlOTguLjdkYjhiNGUgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvbWlwcy9mZnRfcmFkMl9taXBzLmNwcAorKysgYi9saWJGREsvc3JjL21pcHMvZmZ0X3JhZDJfbWlwcy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDIwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiBkaXRfZmZ0IE1JUFMgYXNzZW1ibGVyIHJlcGxhY2VtZW50cy4KIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0ZGVF9SQUQyX0NQUF9fCisjZXJyb3IgXAorICAgICJEbyBub3QgY29tcGlsZSB0aGlzIGZpbGUgc2VwYXJhdGVseS4gSXQgaXMgaW5jbHVkZWQgb24gZGVtYW5kIGZyb20gZmZ0X3JhZDIuY3BwIgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKE1JUFNfRFNQX0xJQikKIApAQCAtOTksMzYgKzExNiw1MCBAQAogCiAjaW5jbHVkZSAibWlwc19mZnRfdHdpZGRsZXMuY3BwIgogCi12b2lkIGRpdF9mZnQoRklYUF9EQkwgKngsIGNvbnN0IElOVCBsZG4sIGNvbnN0IEZJWFBfU1RQICp0cmlnZGF0YSwgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSkKLXsKLSAgICBpbnQgaTsKK3ZvaWQgZGl0X2ZmdChGSVhQX0RCTCAqeCwgY29uc3QgSU5UIGxkbiwgY29uc3QgRklYUF9TVFAgKnRyaWdkYXRhLAorICAgICAgICAgICAgIGNvbnN0IElOVCB0cmlnRGF0YVNpemUpIHsKKyAgaW50IGk7CiAKLSAgICBpbnQzMmMgKmRpbiA9IChpbnQzMmMqKXg7Ci0gICAgaW50MzJjICpkb3V0ID0gKGludDMyYyopeDsKKyAgaW50MzJjICpkaW4gPSAoaW50MzJjICopeDsKKyAgaW50MzJjICpkb3V0ID0gKGludDMyYyAqKXg7CiAKLSAgICBpbnQzMmMgc2NyYXRjaFsxMDI0XTsKLSAgICBpbnQzMmMgKnR3aWRkbGVzOworICBpbnQzMmMgc2NyYXRjaFsxMDI0XTsKKyAgaW50MzJjICp0d2lkZGxlczsKIAotICAgIHN3aXRjaCAobGRuKSB7Ci0gICAgICAgICAgICBjYXNlIDQ6ICB0d2lkZGxlcyA9IChpbnQzMmMqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl8xNjsgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNTogIHR3aWRkbGVzID0gKGludDMyYyopX190d2lkZGxlc19taXBzX2ZmdDMyXzMyOyAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA2OiAgdHdpZGRsZXMgPSAoaW50MzJjKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfNjQ7ICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDc6ICB0d2lkZGxlcyA9IChpbnQzMmMqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl8xMjg7ICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgODogIHR3aWRkbGVzID0gKGludDMyYyopX190d2lkZGxlc19taXBzX2ZmdDMyXzI1NjsgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA5OiAgdHdpZGRsZXMgPSAoaW50MzJjKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfNTEyOyAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwOiB0d2lkZGxlcyA9IChpbnQzMmMqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl8xMDI0OyBicmVhazsKLSAgICAgICAgICAgIC8vY2FzZSAxMTogdHdpZGRsZXMgPSAoaW50MzJjKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMjA0ODsgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiBGREtfQVNTRVJUKDApOyBicmVhazsKLSAgICB9CisgIHN3aXRjaCAobGRuKSB7CisgICAgY2FzZSA0OgorICAgICAgdHdpZGRsZXMgPSAoaW50MzJjICopX190d2lkZGxlc19taXBzX2ZmdDMyXzE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgdHdpZGRsZXMgPSAoaW50MzJjICopX190d2lkZGxlc19taXBzX2ZmdDMyXzMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgdHdpZGRsZXMgPSAoaW50MzJjICopX190d2lkZGxlc19taXBzX2ZmdDMyXzY0OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgdHdpZGRsZXMgPSAoaW50MzJjICopX190d2lkZGxlc19taXBzX2ZmdDMyXzEyODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIHR3aWRkbGVzID0gKGludDMyYyAqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl8yNTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDk6CisgICAgICB0d2lkZGxlcyA9IChpbnQzMmMgKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfNTEyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIHR3aWRkbGVzID0gKGludDMyYyAqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl8xMDI0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICBicmVhazsKKyAgfQogCi0gICAgbWlwc19mZnQzMihkb3V0LCBkaW4sIHR3aWRkbGVzLCBzY3JhdGNoLCBsZG4pOworICBtaXBzX2ZmdDMyKGRvdXQsIGRpbiwgdHdpZGRsZXMsIHNjcmF0Y2gsIGxkbik7CiAKLSAgICBmb3IoaT0wO2k8KDE8PGxkbik7aSsrKSB7Ci0gICAgICAgIHhbMippXSAgID0gZG91dFtpXS5yZTw8MTsKLSAgICAgICAgeFsyKmkrMV0gPSBkb3V0W2ldLmltPDwxOwotICAgIH0KKyAgZm9yIChpID0gMDsgaSA8ICgxIDw8IGxkbik7IGkrKykgeworICAgIHhbMiAqIGldID0gZG91dFtpXS5yZSA8PCAxOworICAgIHhbMiAqIGkgKyAxXSA9IGRvdXRbaV0uaW0gPDwgMTsKKyAgfQogfQogI2VuZGlmCiAKLQogI2VuZGlmIC8qIGRlZmluZWQoTUlQU19EU1BfTElCKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9taXBzL21pcHNfZmZ0X3R3aWRkbGVzLmNwcCBiL2xpYkZESy9zcmMvbWlwcy9taXBzX2ZmdF90d2lkZGxlcy5jcHAKaW5kZXggZTE1YTA5Yi4uZjkwNWY4NiAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9taXBzL21pcHNfZmZ0X3R3aWRkbGVzLmNwcAorKysgYi9saWJGREsvc3JjL21pcHMvbWlwc19mZnRfdHdpZGRsZXMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDUwMSArOTAsODQyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBBdXRob3Iocyk6CiAKLXN0YXRpYyBjb25zdCBJTlQgX190d2lkZGxlc19taXBzX2ZmdDMyXzE2W10gPQotewotKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLCAoMHg1QTgyNzk3OCksICgweEE1N0Q4NjQ2KSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLCAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4QTU3RDg2NUUpLCAoMHhBNTdEODY3MCksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKLSgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApCi19OworICAgRGVzY3JpcHRpb246CiAKLXN0YXRpYyBjb25zdCBJTlQgX190d2lkZGxlc19taXBzX2ZmdDMyXzMyW10gPQotewotKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdEOEE1RjNDKSwgKDB4RTcwNzQ3QjkpLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwgKDB4NkE2RDk4QTEpLCAoMHhCOEUzMTMxOCksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHg0NzFDRUQwNSksICgweDk1OTI2NzcyKSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksICgweDE4RjhCODg4KSwgKDB4ODI3NUEwRDEpLCAoMHhGRkZGRkZBMyksICgweDgwMDAwMDAyKSwKLSgweEU3MDc0N0JCKSwgKDB4ODI3NUEwQzMpLCAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4QjhFMzEzOUUpLCAoMHg5NTkyNjcwNSksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwgKDB4ODlCRTUxMDApLCAoMHhDRjA0M0EyNCksICgweDgyNzVBMEJFKSwgKDB4RTcwNzQ3RDQpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDM3MDAwMDAwKSwgKDB4MDAwMDgwQTMpLAotKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApCi19OworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfNjRbXSA9Ci17Ci0oMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0Y2MjM2OEQpLCAoMHhGMzc0MkM5RCksICgweDdEOEE1RjNDKSwgKDB4RTcwNzQ3QjkpLCAoMHg3QTdEMDU1OSksICgweERBRDdGM0EyKSwgKDB4NzY0MUFGMzIpLCAoMHhDRjA0M0E5RSksICgweDcwRTJDQkNEKSwgKDB4QzNBOTQ1QTEpLCAoMHg2QTZEOThBMSksICgweEI4RTMxMzE4KSwgKDB4NjJGMjAxQzQpLCAoMHhBRUNDMzM4QiksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLAotKDB4NTEzM0NDOEYpLCAoMHg5RDBERkU1MiksICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLCAoMHgzQzU2QkFCNSksICgweDhGMUQzNDYxKSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksICgweDI1MjgwQzA1KSwgKDB4ODU4MkZBOEMpLCAoMHgxOEY4Qjg4OCksICgweDgyNzVBMEQxKSwgKDB4MEM4QkQzNTYpLCAoMHg4MDlEQzk3MSksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLCAoMHhGMzc0MkNFRSksICgweDgwOURDOTZCKSwKLSgweEU3MDc0N0JCKSwgKDB4ODI3NUEwQzMpLCAoMHhEQUQ3RjM0OCksICgweDg1ODJGQUMyKSwgKDB4Q0YwNDNBRjgpLCAoMHg4OUJFNTBBOCksICgweEMzQTk0NjY5KSwgKDB4OEYxRDMzQzgpLCAoMHhCOEUzMTM5RSksICgweDk1OTI2NzA1KSwgKDB4QUVDQzMzQTUpLCAoMHg5RDBERkUyNyksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLCAoMHg5RDBERkUxNiksICgweEFFQ0MzM0I5KSwgKDB4OTU5MjY2RjcpLCAoMHhCOEUzMTNCNCksCi0oMHg4RjFEMzRBRCksICgweEMzQTk0NEJDKSwgKDB4ODlCRTUxMDApLCAoMHhDRjA0M0EyNCksICgweDg1ODJGQUJCKSwgKDB4REFEN0YzNjApLCAoMHg4Mjc1QTBCRSksICgweEU3MDc0N0Q0KSwgKDB4ODA5REM5NjgpLCAoMHhGMzc0MkQwOCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEZGN0IwMDAwKSwgKDB4MkU4MDUwRjEpLCAoMHgxMDIxNDQ4MiksICgweDFCQTAwMDA1KSwgKDB4MDAwMEMwRkYpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKLSgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCkKLX07CitzdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl8xNltdID0geworICAgICgweDdGRkZGRkZGKSwgKDB4MDAwMDAwMDApLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwgKDB4NUE4Mjc5NzgpLAorICAgICgweEE1N0Q4NjQ2KSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLAorICAgICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwgKDB4ODlCRTUxMDApLAorICAgICgweENGMDQzQTI0KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApfTsKIAotc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMTI4W10gPQotewotKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdGRDg4NzhDKSwgKDB4RjlCODI2ODEpLCAoMHg3RjYyMzY4RCksICgweEYzNzQyQzlEKSwgKDB4N0U5RDU1RkIpLCAoMHhFRDM3RUY5MSksICgweDdEOEE1RjNDKSwgKDB4RTcwNzQ3QjkpLCAoMHg3QzI5RkJFRiksICgweEUwRTYwNjhGKSwgKDB4N0E3RDA1NTkpLCAoMHhEQUQ3RjNBMiksICgweDc4ODQ4NDE5KSwgKDB4RDRFMENCMjgpLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwKLSgweDczQjVFQkNGKSwgKDB4Qzk0NURGRUIpLCAoMHg3MEUyQ0JDRCksICgweEMzQTk0NUExKSwgKDB4NkRDQTBEMjcpLCAoMHhCRTMxRTFCRiksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLCAoMHg2NkNGODEwMyksICgweEIzQzAxRkU5KSwgKDB4NjJGMjAxQzQpLCAoMHhBRUNDMzM4QiksICgweDVFRDc3Qzg2KSwgKDB4QUEwQTVCMkMpLCAoMHg1QTgyNzk3OCksICgweEE1N0Q4NjQ2KSwgKDB4NTVGNUE0RUQpLCAoMHhBMTI4ODM5MSksCi0oMHg1MTMzQ0M4RiksICgweDlEMERGRTUyKSwgKDB4NEMzRkRGQ0MpLCAoMHg5OTMwN0VDNSksICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLCAoMHg0MUNFMUVDRCksICgweDkyMzVGMzJDKSwgKDB4M0M1NkJBQjUpLCAoMHg4RjFEMzQ2MSksICgweDM2QkEyMDM0KSwgKDB4OEM0QTE0NDApLCAoMHgzMEZCQzU0NyksICgweDg5QkU1MEMyKSwgKDB4MkIxRjM0QkMpLCAoMHg4NzdCN0JERCksICgweDI1MjgwQzA1KSwgKDB4ODU4MkZBOEMpLAotKDB4MUYxOUY5RjApLCAoMHg4M0Q2MDQzMSksICgweDE4RjhCODg4KSwgKDB4ODI3NUEwRDEpLCAoMHgxMkM4MTA5MCksICgweDgxNjJBQTBBKSwgKDB4MEM4QkQzNTYpLCAoMHg4MDlEQzk3MSksICgweDA2NDdEOTQ5KSwgKDB4ODAyNzc4NzEpLCAoMHhGRkZGRkZBMyksICgweDgwMDAwMDAyKSwgKDB4RjlCODI2RkIpLCAoMHg4MDI3Nzg2RSksICgweEYzNzQyQ0VFKSwgKDB4ODA5REM5NkIpLCAoMHhFRDM3RUZCMyksICgweDgxNjJBQTAwKSwKLSgweEU3MDc0N0JCKSwgKDB4ODI3NUEwQzMpLCAoMHhFMEU2MDY1MyksICgweDgzRDYwNDIwKSwgKDB4REFEN0YzNDgpLCAoMHg4NTgyRkFDMiksICgweEQ0RTBDQjg0KSwgKDB4ODc3QjdCQzYpLCAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4Qzk0NUUwMEEpLCAoMHg4QzRBMTQyMyksICgweEMzQTk0NjY5KSwgKDB4OEYxRDMzQzgpLCAoMHhCRTMxRTE2RSksICgweDkyMzVGMzA5KSwgKDB4QjhFMzEzOUUpLCAoMHg5NTkyNjcwNSksCi0oMHhCM0MwMUY5RCksICgweDk5MzA3RjM1KSwgKDB4QUVDQzMzQTUpLCAoMHg5RDBERkUyNyksICgweEFBMEE1QTg4KSwgKDB4QTEyODg0MEYpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwgKDB4QTEyODgzRkUpLCAoMHhBQTBBNUE5QiksICgweDlEMERGRTE2KSwgKDB4QUVDQzMzQjkpLCAoMHg5OTMwN0YyNiksICgweEIzQzAxRkIyKSwgKDB4OTU5MjY2RjcpLCAoMHhCOEUzMTNCNCksICgweDkyMzVGMkZDKSwgKDB4QkUzMUUxODQpLAotKDB4OEYxRDM0QUQpLCAoMHhDM0E5NDRCQyksICgweDhDNEExNDE4KSwgKDB4Qzk0NUUwMjEpLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwgKDB4ODc3QjdCQkQpLCAoMHhENEUwQ0I5QyksICgweDg1ODJGQUJCKSwgKDB4REFEN0YzNjApLCAoMHg4M0Q2MDNEQyksICgweEUwRTYwNzY0KSwgKDB4ODI3NUEwQkUpLCAoMHhFNzA3NDdENCksICgweDgxNjJBQTIyKSwgKDB4RUQzN0VFQ0YpLCAoMHg4MDlEQzk2OCksICgweEYzNzQyRDA4KSwKLSgweDgwMjc3ODc5KSwgKDB4RjlCODI2MTUpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0oMHgwMDAwMDAwMCksICgweEE0MzcwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEZGNzcwMDAwKSwgKDB4MkU4MDUwRjEpLCAoMHgxQTIxNDQ2MiksICgweDA0RDZENTgzKSwgKDB4NDAwMzEyODIpLCAoMHg2NDY5QTczNSksICgweDBCNEM5OUEzKSwgKDB4MEFGODg1OTQpLCAoMHhGOTA5NjlENyksICgweDk2MTMxQzkyKSwgKDB4MDI1RUVBMTApLCAoMHgzQTFGRTQyMSksICgweDYxNEZGMzkwKSwKLSgweDFDRkRDMzI3KSwgKDB4QzE3N0UwNEYpLCAoMHhGNEQ4N0U4MiksICgweDc4MjUzRjM5KSwgKDB4QkI4MzlGOTQpLCAoMHg5OThCM0VCMSksICgweDBDQkNDMDIxKSwgKDB4NDFCRUM4NDMpLCAoMHhBQzBFRTEyMSksICgweDUyNzE5NjQzKSwgKDB4OTA5QTJCMUQpLCAoMHhGMzg5MzFFMSksICgweEY0MTMyN0ZGKSwgKDB4RjYwOTk4NDcpLCAoMHhBNzBEMjE5QyksICgweDdCRDUyMTM1KSwgKDB4NzgwNjBGNzEpLCAoMHhFQTNDODdEOCksCi0oMHgzRkFGM0EyNCksICgweEU0QjJDNDIxKSwgKDB4Qjk5RDE0NTMpLCAoMHgyNzQxRTI2NCksICgweDIyMzk4MTNBKSwgKDB4Mjk0NERBMjApLCAoMHg0NDFFRjdDNCksICgweDBCRDBCNzIwKSwgKDB4RUQ4NEVBMjYpLCAoMHg3M0UwQzBEMiksICgweDY3OEUzMDM5KSwgKDB4MjE0MjAxMDkpLCAoMHg4NjA3NDkyRSksICgweDI4Q0VGNDQwKSwgKDB4MDIyNzY4QzgpLCAoMHhGNjhFMzYxMSksICgweDg0RTg0RDU1KSwgKDB4NzMwMDRDMDQpLAotKDB4RjlCNjYzMEUpLCAoMHg2NzdGRkE4RiksICgweDUzMENCMThGKSwgKDB4MkM0RUUzMTApLCAoMHhBQkM3NTM3QyksICgweDgyQ0ZEQkNCKSwgKDB4MTAwQzYzQTIpLCAoMHg4NzZENzVCQSksICgweEM2ODNGODg4KSwgKDB4MENEQzFFMUUpLCAoMHhBNjAwRTgzMyksICgweDMzMDM2MDY2KSwgKDB4NDMwNTA0OUMpLCAoMHg0MDg5MDcxMyksICgweDlEMTI1MzJFKSwgKDB4N0I2RTJGRTIpLCAoMHhFMjQ0Q0MwOSksICgweDlGRkIyMDgyKSwKLSgweEFCMzczNUQzKSwgKDB4MDAwMDAwODApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCkKLX07CitzdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl8zMltdID0geworICAgICgweDdGRkZGRkZGKSwgKDB4MDAwMDAwMDApLCAoMHg3RDhBNUYzQyksICgweEU3MDc0N0I5KSwgKDB4NzY0MUFGMzIpLAorICAgICgweENGMDQzQTlFKSwgKDB4NkE2RDk4QTEpLCAoMHhCOEUzMTMxOCksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLAorICAgICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLCAoMHgzMEZCQzU0NyksICgweDg5QkU1MEMyKSwgKDB4MThGOEI4ODgpLAorICAgICgweDgyNzVBMEQxKSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksICgweEU3MDc0N0JCKSwgKDB4ODI3NUEwQzMpLAorICAgICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhCOEUzMTM5RSksICgweDk1OTI2NzA1KSwgKDB4QTU3RDg2NUUpLAorICAgICgweEE1N0Q4NjcwKSwgKDB4OTU5MjY2RjcpLCAoMHhCOEUzMTNCNCksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLAorICAgICgweDgyNzVBMEJFKSwgKDB4RTcwNzQ3RDQpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgzNzAwMDAwMCksICgweDAwMDA4MEEzKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKX07CiAKK3N0YXRpYyBjb25zdCBJTlQgX190d2lkZGxlc19taXBzX2ZmdDMyXzY0W10gPSB7CisgICAgKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdGNjIzNjhEKSwgKDB4RjM3NDJDOUQpLCAoMHg3RDhBNUYzQyksCisgICAgKDB4RTcwNzQ3QjkpLCAoMHg3QTdEMDU1OSksICgweERBRDdGM0EyKSwgKDB4NzY0MUFGMzIpLCAoMHhDRjA0M0E5RSksCisgICAgKDB4NzBFMkNCQ0QpLCAoMHhDM0E5NDVBMSksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLCAoMHg2MkYyMDFDNCksCisgICAgKDB4QUVDQzMzOEIpLCAoMHg1QTgyNzk3OCksICgweEE1N0Q4NjQ2KSwgKDB4NTEzM0NDOEYpLCAoMHg5RDBERkU1MiksCisgICAgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDNDNTZCQUI1KSwgKDB4OEYxRDM0NjEpLCAoMHgzMEZCQzU0NyksCisgICAgKDB4ODlCRTUwQzIpLCAoMHgyNTI4MEMwNSksICgweDg1ODJGQThDKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksCisgICAgKDB4MEM4QkQzNTYpLCAoMHg4MDlEQzk3MSksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLCAoMHhGMzc0MkNFRSksCisgICAgKDB4ODA5REM5NkIpLCAoMHhFNzA3NDdCQiksICgweDgyNzVBMEMzKSwgKDB4REFEN0YzNDgpLCAoMHg4NTgyRkFDMiksCisgICAgKDB4Q0YwNDNBRjgpLCAoMHg4OUJFNTBBOCksICgweEMzQTk0NjY5KSwgKDB4OEYxRDMzQzgpLCAoMHhCOEUzMTM5RSksCisgICAgKDB4OTU5MjY3MDUpLCAoMHhBRUNDMzNBNSksICgweDlEMERGRTI3KSwgKDB4QTU3RDg2NUUpLCAoMHhBNTdEODY3MCksCisgICAgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksICgweDk1OTI2NkY3KSwgKDB4QjhFMzEzQjQpLCAoMHg4RjFEMzRBRCksCisgICAgKDB4QzNBOTQ0QkMpLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwgKDB4ODU4MkZBQkIpLCAoMHhEQUQ3RjM2MCksCisgICAgKDB4ODI3NUEwQkUpLCAoMHhFNzA3NDdENCksICgweDgwOURDOTY4KSwgKDB4RjM3NDJEMDgpLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHhGRjdCMDAwMCksCisgICAgKDB4MkU4MDUwRjEpLCAoMHgxMDIxNDQ4MiksICgweDFCQTAwMDA1KSwgKDB4MDAwMEMwRkYpLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKX07CiAKLXN0YXRpYyBjb25zdCBJTlQgX190d2lkZGxlc19taXBzX2ZmdDMyXzI1NltdID0KLXsKLSgweDdGRkZGRkZGKSwgKDB4MDAwMDAwMDApLCAoMHg3RkY2MjE4MSksICgweEZDREJENTQwKSwgKDB4N0ZEODg3OEMpLCAoMHhGOUI4MjY4MSksICgweDdGQTczNkIyKSwgKDB4RjY5NTZGQjcpLCAoMHg3RjYyMzY4RCksICgweEYzNzQyQzlEKSwgKDB4N0YwOTkxQzMpLCAoMHhGMDU0RDhEQSksICgweDdFOUQ1NUZCKSwgKDB4RUQzN0VGOTEpLCAoMHg3RTFEOTNFQSksICgweEVBMURFQkM2KSwgKDB4N0Q4QTVGM0MpLCAoMHhFNzA3NDdCOSksCi0oMHg3Q0UzQ0VCMCksICgweEUzRjQ3RDk1KSwgKDB4N0MyOUZCRUYpLCAoMHhFMEU2MDY4RiksICgweDdCNUQwM0ExKSwgKDB4REREQzVCNEYpLCAoMHg3QTdEMDU1OSksICgweERBRDdGM0EyKSwgKDB4Nzk4QTIzQTgpLCAoMHhEN0Q5NDZDMyksICgweDc4ODQ4NDE5KSwgKDB4RDRFMENCMjgpLCAoMHg3NzZDNEVEOSksICgweEQxRUVGNTlEKSwgKDB4NzY0MUFGMzIpLCAoMHhDRjA0M0E5RSksICgweDc1MDREMzRDKSwgKDB4Q0MyMTBEOEIpLAotKDB4NzNCNUVCQ0YpLCAoMHhDOTQ1REZFQiksICgweDcyNTUyQzc5KSwgKDB4QzY3MzIyQjkpLCAoMHg3MEUyQ0JDRCksICgweEMzQTk0NUExKSwgKDB4NkY1RjAyQ0YpLCAoMHhDMEU4QjY3RSksICgweDZEQ0EwRDI3KSwgKDB4QkUzMUUxQkYpLCAoMHg2QzI0Mjk2OSksICgweEJCODUzMkMwKSwgKDB4NkE2RDk4QTEpLCAoMHhCOEUzMTMxOCksICgweDY4QTY5RTcyKSwgKDB4QjY0QkVBQjkpLCAoMHg2NkNGODEwMyksICgweEIzQzAxRkU5KSwKLSgweDY0RTg4OTRBKSwgKDB4QjE0MDE3OEMpLCAoMHg2MkYyMDFDNCksICgweEFFQ0MzMzhCKSwgKDB4NjBFQzM4M0EpLCAoMHhBQzY0RDUxRiksICgweDVFRDc3Qzg2KSwgKDB4QUEwQTVCMkMpLCAoMHg1Q0I0MjBDRCksICgweEE3QkQyMjlBKSwgKDB4NUE4Mjc5NzgpLCAoMHhBNTdEODY0NiksICgweDU4NDJERDdFKSwgKDB4QTM0QkRGNEIpLCAoMHg1NUY1QTRFRCksICgweEExMjg4MzkxKSwgKDB4NTM5QjJBRkIpLCAoMHg5RjEzQzdEQyksCi0oMHg1MTMzQ0M4RiksICgweDlEMERGRTUyKSwgKDB4NEVCRkU4OEYpLCAoMHg5QjE3NzZDQiksICgweDRDM0ZERkNDKSwgKDB4OTkzMDdFQzUpLCAoMHg0OUI0MTU2MiksICgweDk3NTk2MUEyKSwgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDQ0N0FDRDVEKSwgKDB4OTNEQkQ2QUEpLCAoMHg0MUNFMUVDRCksICgweDkyMzVGMzJDKSwgKDB4M0YxNzQ5OUYpLCAoMHg5MEEwRkQ0MiksICgweDNDNTZCQUI1KSwgKDB4OEYxRDM0NjEpLAotKDB4Mzk4Q0RDRjMpLCAoMHg4REFBRDM1RCksICgweDM2QkEyMDM0KSwgKDB4OEM0QTE0NDApLCAoMHgzM0RFRjIxRiksICgweDhBRkIyQzhFKSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksICgweDJFMTEwQUJGKSwgKDB4ODg5M0IxNEEpLCAoMHgyQjFGMzRCQyksICgweDg3N0I3QkREKSwgKDB4MjgyNkI5NUUpLCAoMHg4Njc1REM2MiksICgweDI1MjgwQzA1KSwgKDB4ODU4MkZBOEMpLCAoMHgyMjIzQTREMiksICgweDg0QTJGQzY4KSwKLSgweDFGMTlGOUYwKSwgKDB4ODNENjA0MzEpLCAoMHgxQzBCODI0RSksICgweDgzMUMzMTRBKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksICgweDE1RTIxM0ZEKSwgKDB4ODFFMjZDMEIpLCAoMHgxMkM4MTA5MCksICgweDgxNjJBQTBBKSwgKDB4MEZBQjI2QjkpLCAoMHg4MEY2NkUzMCksICgweDBDOEJEMzU2KSwgKDB4ODA5REM5NzEpLCAoMHgwOTZBOTBBQiksICgweDgwNThDOTU1KSwgKDB4MDY0N0Q5NDkpLCAoMHg4MDI3Nzg3MSksCi0oMHgwMzI0MkFGNiksICgweDgwMDlERTgxKSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksICgweEZDREJENTRFKSwgKDB4ODAwOURFN0YpLCAoMHhGOUI4MjZGQiksICgweDgwMjc3ODZFKSwgKDB4RjY5NTZGOTkpLCAoMHg4MDU4Qzk1MCksICgweEYzNzQyQ0VFKSwgKDB4ODA5REM5NkIpLCAoMHhGMDU0RDg4RCksICgweDgwRjY2RTQ3KSwgKDB4RUQzN0VGQjMpLCAoMHg4MTYyQUEwMCksICgweEVBMURFQjRBKSwgKDB4ODFFMjZDMkMpLAotKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksICgweEUzRjQ3REY1KSwgKDB4ODMxQzMxM0IpLCAoMHhFMEU2MDY1MyksICgweDgzRDYwNDIwKSwgKDB4REREQzVCNkYpLCAoMHg4NEEyRkM1NSksICgweERBRDdGMzQ4KSwgKDB4ODU4MkZBQzIpLCAoMHhEN0Q5NDZFMyksICgweDg2NzVEQzREKSwgKDB4RDRFMENCODQpLCAoMHg4NzdCN0JDNiksICgweEQxRUVGNTgxKSwgKDB4ODg5M0IxMzIpLCAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwKLSgweENDMjEwRDM1KSwgKDB4OEFGQjJDREIpLCAoMHhDOTQ1RTAwQSksICgweDhDNEExNDIzKSwgKDB4QzY3MzIyNjUpLCAoMHg4REFBRDNCMiksICgweEMzQTk0NjY5KSwgKDB4OEYxRDMzQzgpLCAoMHhDMEU4QjY5QyksICgweDkwQTBGRDIxKSwgKDB4QkUzMUUxNkUpLCAoMHg5MjM1RjMwOSksICgweEJCODUzMjA1KSwgKDB4OTNEQkQ3MEUpLCAoMHhCOEUzMTM5RSksICgweDk1OTI2NzA1KSwgKDB4QjY0QkVBRDUpLCAoMHg5NzU5NjE3QiksCi0oMHhCM0MwMUY5RCksICgweDk5MzA3RjM1KSwgKDB4QjE0MDE4MEMpLCAoMHg5QjE3NzY1MiksICgweEFFQ0MzM0E1KSwgKDB4OUQwREZFMjcpLCAoMHhBQzY0RDREOCksICgweDlGMTNDODAzKSwgKDB4QUEwQTVBODgpLCAoMHhBMTI4ODQwRiksICgweEE3QkQyMzEwKSwgKDB4QTM0QkRFQzMpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwgKDB4QTM0QkRFQjIpLCAoMHhBN0JEMjMyMiksICgweEExMjg4M0ZFKSwgKDB4QUEwQTVBOUIpLAotKDB4OUYxM0M3RjIpLCAoMHhBQzY0RDRFQiksICgweDlEMERGRTE2KSwgKDB4QUVDQzMzQjkpLCAoMHg5QjE3NzY0MiksICgweEIxNDAxODIwKSwgKDB4OTkzMDdGMjYpLCAoMHhCM0MwMUZCMiksICgweDk3NTk2MTZDKSwgKDB4QjY0QkVBRUEpLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwgKDB4OTNEQkQ3MDApLCAoMHhCQjg1MzIxQSksICgweDkyMzVGMkZDKSwgKDB4QkUzMUUxODQpLCAoMHg5MEEwRkQxNCksICgweEMwRThCNkIyKSwKLSgweDhGMUQzNEFEKSwgKDB4QzNBOTQ0QkMpLCAoMHg4REFBRDNBNiksICgweEM2NzMyMjdDKSwgKDB4OEM0QTE0MTgpLCAoMHhDOTQ1RTAyMSksICgweDhBRkIyQzY4KSwgKDB4Q0MyMTBFMzcpLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwgKDB4ODg5M0IxMjgpLCAoMHhEMUVFRjU5OSksICgweDg3N0I3QkJEKSwgKDB4RDRFMENCOUMpLCAoMHg4Njc1REM5NSksICgweEQ3RDk0NjA4KSwgKDB4ODU4MkZBQkIpLCAoMHhEQUQ3RjM2MCksCi0oMHg4NEEyRkM0RiksICgweEREREM1Qjg4KSwgKDB4ODNENjAzREMpLCAoMHhFMEU2MDc2NCksICgweDgzMUMzMTZEKSwgKDB4RTNGNDdEMTQpLCAoMHg4Mjc1QTBCRSksICgweEU3MDc0N0Q0KSwgKDB4ODFFMjZCRkIpLCAoMHhFQTFERUM1RiksICgweDgxNjJBQTIyKSwgKDB4RUQzN0VFQ0YpLCAoMHg4MEY2NkU0NCksICgweEYwNTREOEE2KSwgKDB4ODA5REM5NjgpLCAoMHhGMzc0MkQwOCksICgweDgwNThDOTNCKSwgKDB4RjY5NTcwQjIpLAotKDB4ODAyNzc4NzkpLCAoMHhGOUI4MjYxNSksICgweDgwMDlERTdFKSwgKDB4RkNEQkQ1NjgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEYxRkY3QTAwKSwgKDB4RTIzQTgwNTApLCAoMHg4NDFBMjExNCksICgweEM1ODhEQTc1KSwgKDB4MDI0MDAxNDMpLCAoMHhBRUQ2QUFENyksICgweDk0QzI1NDVCKSwgKDB4M0U0NjE1NkMpLCAoMHgwNUJGREYyNyksICgweEIwODIyMDc1KSwKLSgweEQyNEM3QkM0KSwgKDB4NjIxMjIwNTQpLCAoMHg4Q0M0MUM0OSksICgweDJDNDE0OTcyKSwgKDB4NzE4RDdDNUUpLCAoMHhERUUyQTNEOCksICgweDQ1NDRDMTM1KSwgKDB4NjQyOTI1NzMpLCAoMHg3NkI1MUY4QSksICgweDRCN0Q2NTU3KSwgKDB4ODcxNjQ5MDcpLCAoMHhGNTlEQkZFQyksICgweDA0Q0VFOURFKSwgKDB4QjRCQzRDOTApLCAoMHg5QUZDQ0QzMCksICgweDhDN0EzMTZGKSwgKDB4OTBGREFDQTcpLCAoMHg0RTBENjM4MyksCi0oMHhBRUYxNkMwQiksICgweDA2MjIwMjBBKSwgKDB4MzdCNkE3MzgpLCAoMHhGRkJCN0Q3MSksICgweDVGRUREMTJGKSwgKDB4RUU0N0ZEQzgpLCAoMHgzREM3OTEzRiksICgweEVBRUVGN0ZEKSwgKDB4MjE5REFERUMpLCAoMHhGOUU1M0Y1RiksICgweEIzRDgyRDlFKSwgKDB4QkJCNzlCQ0IpLCAoMHg0M0FEMkFBQiksICgweDBFN0FEQkMwKSwgKDB4QUJCRDA5NTIpLCAoMHgxQTZFRjQzQSksICgweENEOUIyQTlEKSwgKDB4NzIyMkIzNjYpLAotKDB4OTc5RTg5RTkpLCAoMHgwMkM5MTEzRiksICgweDFENTExNDY2KSwgKDB4NTdBOTIyMDYpLCAoMHg0QTQxMjA3NSksICgweEZEMzFENzgzKSwgKDB4QTc1NDJFRkMpLCAoMHgyNEI3Njk3NSksICgweEI5OTk2MkM3KSwgKDB4MTlGMUQzNTYpLCAoMHg5RDEyQzNDQiksICgweDZEMzdENTQyKSwgKDB4MjlFNzIxNEQpLCAoMHg4OTAwRjY0NSksICgweEIxNTRBRDRBKSwgKDB4RjA0N0Q5ODgpLCAoMHgzRjJFNUU3NyksICgweEFGQjY4QzQ5KSwKLSgweEM5RjE5RTUxKSwgKDB4NjE5MkY1M0EpLCAoMHg1QUUzRDA4MCksICgweDFEQTZDNjc3KSwgKDB4RDQ4NUQ1MEMpLCAoMHg5QUE3RThCMiksICgweEY1NUVFMUQ1KSwgKDB4QzAwQjY5MzIpLCAoMHg4NUFDRTkxMiksICgweDgyMDhCMUI5KSwgKDB4ODBFMTQxNzApLCAoMHhBMUQ2N0MzRiksICgweDA1ODAzNUIzKSwgKDB4QTRGRTM2Q0EpLCAoMHhCRUU1NDdFNCksICgweEVGMjc2MDUyKSwgKDB4NDJBQTQzODgpLCAoMHg5QzExQTJFRCksCi0oMHgxMDIwMjU0MSksICgweDJENDgwOTEwKSwgKDB4QjA5QjFBQzQpLCAoMHgxOUU3RDE3RCksICgweDUyMDgyNDUwKSwgKDB4M0VFRDE3MDUpLCAoMHhGMjBGRjhBMSksICgweDg5RjZFMTdGKSwgKDB4MTdEN0RDMDApLCAoMHgwOUI5RjJDMyksICgweDYzNzg5NjhDKSwgKDB4QUYwNjA3RjYpLCAoMHhGREZERTBDOSksICgweDNDRTNERkVFKSwgKDB4NTE2ODIyOUUpLCAoMHg3Q0Y3OTczNCksICgweEY1RkZGNTZGKSwgKDB4MzA3MDAwOTMpLAotKDB4MTM1RjVDNzUpLCAoMHhFNkQ3M0VFRSksICgweDZFNDAwREY5KSwgKDB4NTgyNTJBQ0IpLCAoMHg1NTczMTFDQSksICgweDU1MzlCMzAzKSwgKDB4NTY1NTczNTUpLCAoMHhCNkJEQUNFRiksICgweDU5Rjk0MjhEKSwgKDB4OUFFNjMwMjApLCAoMHg1NThGRjdFNyksICgweDc5NTU4MDZEKSwgKDB4MDlENTQ5RjMpLCAoMHg2MDNCRjVCNyksICgweDMxMzQ0MTNCKSwgKDB4QkNBN0MxQUEpLCAoMHhBOThEMTMzOSksICgweDU3QjI5Qzk3KSwKLSgweDUwRjFGRjA3KSwgKDB4RTRBMTM5ODApLCAoMHhEMDg4MUEyMSksICgweEMxRkZFMzBBKSwgKDB4QjBBNjZDMTkpLCAoMHgxODQxNjQ5MCksICgweDE2MEUwMjE0KSwgKDB4QTU4NENCQjUpLCAoMHgwMkFBQTgyQSksICgweDczOTgxMzQwKSwgKDB4OTY0QTI0REUpLCAoMHg2RTgyOUZDNCksICgweERGRDYyMzYwKSwgKDB4NEMzQkYxNTIpLCAoMHgzODcyMTU3NCksICgweEQ0NkJDOTEyKSwgKDB4MUVCN0ZERDgpLCAoMHgxQ0E2Q0JDMCksCi0oMHhCQkNCQzExMSksICgweEE2RkQxNDAzKSwgKDB4NzZDNjg4RDkpLCAoMHhCNDcxODZDQiksICgweDVFOTg5MzZEKSwgKDB4OUJCRjdFMkUpLCAoMHg4QjdGQkNFQyksICgweDlEQUY3RUY1KSwgKDB4N0UzQTc5RjEpLCAoMHg5Qzg5NkFDRCksICgweDYyOEYyNDlBKSwgKDB4REQ2RTUxQUYpLCAoMHhBRjczOTk0QiksICgweDU5NjY5OTVEKSwgKDB4Qjc2MjA1OTcpLCAoMHgzNjlCMUU1NCksICgweDdDRURDNzg3KSwgKDB4RTdCMTVCMUYpLAotKDB4QjM2RjVGN0QpLCAoMHhCNUI3M0VGNiksICgweEQ3NkVFRUUyKSwgKDB4MTRFODYxODYpLCAoMHhDQzE1OTI5MSksICgweDRFQzg1Q0EzKSwgKDB4RUMzQzcwNEUpLCAoMHgwQjY2MzNCMyksICgweDREOTkyRDRCKSwgKDB4RUIxQjU3NzQpLCAoMHhERkI5RDUwOCksICgweDExNzgzNzE5KSwgKDB4NzdCQjEwQjApLCAoMHhGQ0RGODM1MCksICgweEQzNEE3QzY1KSwgKDB4RUY2RTU3QkIpLCAoMHhFQ0Q1NkM2OCksICgweDhFQjdDQTM2KSwKLSgweDJGMjZCMTM2KSwgKDB4NTU2MzEyNjkpLCAoMHhFRjEyMTNFMSksICgweEE1NkFCODQ0KSwgKDB4QUE0QjFENjQpLCAoMHg2NDM0MUVBOSksICgweDBDRTlEQjQ4KSwgKDB4NDYwQzIxNDQpLCAoMHhBREM1MDIwNSksICgweDUxNUM0NzJGKSwgKDB4MzA0QzI5QkQpLCAoMHg3NkFGODcxMSksICgweDU1N0NBREI3KSwgKDB4MkE5QkJDOEUpLCAoMHhFNTBFMTQ1QiksICgweDlDMjAzMUZEKSwgKDB4RDkxMjFBOEMpLCAoMHhGNTFBOTZGRCksCi0oMHg0NUNDQkVCRiksICgweDVGODg0ODcxKSwgKDB4NjZEQUUyOTEpLCAoMHg5NUFEQzlFNSksICgweDMzQ0YzMDREKSwgKDB4MjNDODdEQ0UpLCAoMHhBNzAxNEZCMyksICgweEZCMzUxRTcxKSwgKDB4OEQ2MEY2NkYpLCAoMHhCRkQ2RERENSksICgweDE1MUZFNkYxKSwgKDB4RENDNzkzNUEpLCAoMHgwQ0FDRkJGMCksICgweEVFNTVBMzcxKSwgKDB4QkU0NkI3NTUpLCAoMHgwRjc5RENEMiksICgweDIzREZGNzZEKSwgKDB4ODNERTc2RDcpLAotKDB4OEIwRTNBRUUpLCAoMHhCMDFCRkI0NCksICgweDRFMzYxOUZBKSwgKDB4QTE5RjlFNjQpLCAoMHhCRDQ5MkFEOSksICgweDA4OTlFNDVGKSwgKDB4ODE1NkU0MUQpLCAoMHg1REE1MzlCQSksICgweDBBRjM1QjJDKSwgKDB4REI4OUJBQUUpLCAoMHhBMTI4Qzk2NiksICgweEEwMkNFQUVFKSwgKDB4QzVBMUIyOTEpLCAoMHgwOENCQTkzRSksICgweDkwRkQ4ODdBKSwgKDB4NjAzMDQzODYpLCAoMHg2QTU5RjFFQSksICgweEE0NjFFNjdCKSwKLSgweEMxNjIyQjc2KSwgKDB4NkZBMkY5MDYpLCAoMHhBQTNBNDAxQSksICgweEI2OEVBNDdCKSwgKDB4QzYxN0E4ODkpLCAoMHg2MDI0QTU3QiksICgweDJERDUzNTU1KSwgKDB4RjFGRkVBMzApLCAoMHg4MTNBODA1MCksICgweDhEMUEyMUI0KSwgKDB4RkZFNzJDRjcpLCAoMHhBMzc0MTVFMSksICgweDMwQTJDODMwKSwgKDB4QTNBMUNBMjgpLCAoMHg0QzVFMzU4NiksICgweDMwOTg2MUI5KSwgKDB4MUY0OTg1MEQpLCAoMHg2MTY0Qzc0OCksCi0oMHg5RDcwNDhFNSksICgweEMxMjQ1NjlFKSwgKDB4Q0NCMEUxMTEpLCAoMHgxNUIyQkI4NiksICgweDE4MzcxRDlDKSwgKDB4QjJBQkQ5NEQpLCAoMHg4RUM2NTZCMyksICgweEJGMDEwOTk1KQotfTsKK3N0YXRpYyBjb25zdCBJTlQgX190d2lkZGxlc19taXBzX2ZmdDMyXzEyOFtdID0geworICAgICgweDdGRkZGRkZGKSwgKDB4MDAwMDAwMDApLCAoMHg3RkQ4ODc4QyksICgweEY5QjgyNjgxKSwgKDB4N0Y2MjM2OEQpLAorICAgICgweEYzNzQyQzlEKSwgKDB4N0U5RDU1RkIpLCAoMHhFRDM3RUY5MSksICgweDdEOEE1RjNDKSwgKDB4RTcwNzQ3QjkpLAorICAgICgweDdDMjlGQkVGKSwgKDB4RTBFNjA2OEYpLCAoMHg3QTdEMDU1OSksICgweERBRDdGM0EyKSwgKDB4Nzg4NDg0MTkpLAorICAgICgweEQ0RTBDQjI4KSwgKDB4NzY0MUFGMzIpLCAoMHhDRjA0M0E5RSksICgweDczQjVFQkNGKSwgKDB4Qzk0NURGRUIpLAorICAgICgweDcwRTJDQkNEKSwgKDB4QzNBOTQ1QTEpLCAoMHg2RENBMEQyNyksICgweEJFMzFFMUJGKSwgKDB4NkE2RDk4QTEpLAorICAgICgweEI4RTMxMzE4KSwgKDB4NjZDRjgxMDMpLCAoMHhCM0MwMUZFOSksICgweDYyRjIwMUM0KSwgKDB4QUVDQzMzOEIpLAorICAgICgweDVFRDc3Qzg2KSwgKDB4QUEwQTVCMkMpLCAoMHg1QTgyNzk3OCksICgweEE1N0Q4NjQ2KSwgKDB4NTVGNUE0RUQpLAorICAgICgweEExMjg4MzkxKSwgKDB4NTEzM0NDOEYpLCAoMHg5RDBERkU1MiksICgweDRDM0ZERkNDKSwgKDB4OTkzMDdFQzUpLAorICAgICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLCAoMHg0MUNFMUVDRCksICgweDkyMzVGMzJDKSwgKDB4M0M1NkJBQjUpLAorICAgICgweDhGMUQzNDYxKSwgKDB4MzZCQTIwMzQpLCAoMHg4QzRBMTQ0MCksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLAorICAgICgweDJCMUYzNEJDKSwgKDB4ODc3QjdCREQpLCAoMHgyNTI4MEMwNSksICgweDg1ODJGQThDKSwgKDB4MUYxOUY5RjApLAorICAgICgweDgzRDYwNDMxKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksICgweDEyQzgxMDkwKSwgKDB4ODE2MkFBMEEpLAorICAgICgweDBDOEJEMzU2KSwgKDB4ODA5REM5NzEpLCAoMHgwNjQ3RDk0OSksICgweDgwMjc3ODcxKSwgKDB4RkZGRkZGQTMpLAorICAgICgweDgwMDAwMDAyKSwgKDB4RjlCODI2RkIpLCAoMHg4MDI3Nzg2RSksICgweEYzNzQyQ0VFKSwgKDB4ODA5REM5NkIpLAorICAgICgweEVEMzdFRkIzKSwgKDB4ODE2MkFBMDApLCAoMHhFNzA3NDdCQiksICgweDgyNzVBMEMzKSwgKDB4RTBFNjA2NTMpLAorICAgICgweDgzRDYwNDIwKSwgKDB4REFEN0YzNDgpLCAoMHg4NTgyRkFDMiksICgweEQ0RTBDQjg0KSwgKDB4ODc3QjdCQzYpLAorICAgICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhDOTQ1RTAwQSksICgweDhDNEExNDIzKSwgKDB4QzNBOTQ2NjkpLAorICAgICgweDhGMUQzM0M4KSwgKDB4QkUzMUUxNkUpLCAoMHg5MjM1RjMwOSksICgweEI4RTMxMzlFKSwgKDB4OTU5MjY3MDUpLAorICAgICgweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhBRUNDMzNBNSksICgweDlEMERGRTI3KSwgKDB4QUEwQTVBODgpLAorICAgICgweEExMjg4NDBGKSwgKDB4QTU3RDg2NUUpLCAoMHhBNTdEODY3MCksICgweEExMjg4M0ZFKSwgKDB4QUEwQTVBOUIpLAorICAgICgweDlEMERGRTE2KSwgKDB4QUVDQzMzQjkpLCAoMHg5OTMwN0YyNiksICgweEIzQzAxRkIyKSwgKDB4OTU5MjY2RjcpLAorICAgICgweEI4RTMxM0I0KSwgKDB4OTIzNUYyRkMpLCAoMHhCRTMxRTE4NCksICgweDhGMUQzNEFEKSwgKDB4QzNBOTQ0QkMpLAorICAgICgweDhDNEExNDE4KSwgKDB4Qzk0NUUwMjEpLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwgKDB4ODc3QjdCQkQpLAorICAgICgweEQ0RTBDQjlDKSwgKDB4ODU4MkZBQkIpLCAoMHhEQUQ3RjM2MCksICgweDgzRDYwM0RDKSwgKDB4RTBFNjA3NjQpLAorICAgICgweDgyNzVBMEJFKSwgKDB4RTcwNzQ3RDQpLCAoMHg4MTYyQUEyMiksICgweEVEMzdFRUNGKSwgKDB4ODA5REM5NjgpLAorICAgICgweEYzNzQyRDA4KSwgKDB4ODAyNzc4NzkpLCAoMHhGOUI4MjYxNSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweEE0MzcwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHhGRjc3MDAwMCksICgweDJFODA1MEYxKSwgKDB4MUEyMTQ0NjIpLAorICAgICgweDA0RDZENTgzKSwgKDB4NDAwMzEyODIpLCAoMHg2NDY5QTczNSksICgweDBCNEM5OUEzKSwgKDB4MEFGODg1OTQpLAorICAgICgweEY5MDk2OUQ3KSwgKDB4OTYxMzFDOTIpLCAoMHgwMjVFRUExMCksICgweDNBMUZFNDIxKSwgKDB4NjE0RkYzOTApLAorICAgICgweDFDRkRDMzI3KSwgKDB4QzE3N0UwNEYpLCAoMHhGNEQ4N0U4MiksICgweDc4MjUzRjM5KSwgKDB4QkI4MzlGOTQpLAorICAgICgweDk5OEIzRUIxKSwgKDB4MENCQ0MwMjEpLCAoMHg0MUJFQzg0MyksICgweEFDMEVFMTIxKSwgKDB4NTI3MTk2NDMpLAorICAgICgweDkwOUEyQjFEKSwgKDB4RjM4OTMxRTEpLCAoMHhGNDEzMjdGRiksICgweEY2MDk5ODQ3KSwgKDB4QTcwRDIxOUMpLAorICAgICgweDdCRDUyMTM1KSwgKDB4NzgwNjBGNzEpLCAoMHhFQTNDODdEOCksICgweDNGQUYzQTI0KSwgKDB4RTRCMkM0MjEpLAorICAgICgweEI5OUQxNDUzKSwgKDB4Mjc0MUUyNjQpLCAoMHgyMjM5ODEzQSksICgweDI5NDREQTIwKSwgKDB4NDQxRUY3QzQpLAorICAgICgweDBCRDBCNzIwKSwgKDB4RUQ4NEVBMjYpLCAoMHg3M0UwQzBEMiksICgweDY3OEUzMDM5KSwgKDB4MjE0MjAxMDkpLAorICAgICgweDg2MDc0OTJFKSwgKDB4MjhDRUY0NDApLCAoMHgwMjI3NjhDOCksICgweEY2OEUzNjExKSwgKDB4ODRFODRENTUpLAorICAgICgweDczMDA0QzA0KSwgKDB4RjlCNjYzMEUpLCAoMHg2NzdGRkE4RiksICgweDUzMENCMThGKSwgKDB4MkM0RUUzMTApLAorICAgICgweEFCQzc1MzdDKSwgKDB4ODJDRkRCQ0IpLCAoMHgxMDBDNjNBMiksICgweDg3NkQ3NUJBKSwgKDB4QzY4M0Y4ODgpLAorICAgICgweDBDREMxRTFFKSwgKDB4QTYwMEU4MzMpLCAoMHgzMzAzNjA2NiksICgweDQzMDUwNDlDKSwgKDB4NDA4OTA3MTMpLAorICAgICgweDlEMTI1MzJFKSwgKDB4N0I2RTJGRTIpLCAoMHhFMjQ0Q0MwOSksICgweDlGRkIyMDgyKSwgKDB4QUIzNzM1RDMpLAorICAgICgweDAwMDAwMDgwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweDAwMDAwMDAwKX07CiAKK3N0YXRpYyBjb25zdCBJTlQgX190d2lkZGxlc19taXBzX2ZmdDMyXzI1NltdID0geworICAgICgweDdGRkZGRkZGKSwgKDB4MDAwMDAwMDApLCAoMHg3RkY2MjE4MSksICgweEZDREJENTQwKSwgKDB4N0ZEODg3OEMpLAorICAgICgweEY5QjgyNjgxKSwgKDB4N0ZBNzM2QjIpLCAoMHhGNjk1NkZCNyksICgweDdGNjIzNjhEKSwgKDB4RjM3NDJDOUQpLAorICAgICgweDdGMDk5MUMzKSwgKDB4RjA1NEQ4REEpLCAoMHg3RTlENTVGQiksICgweEVEMzdFRjkxKSwgKDB4N0UxRDkzRUEpLAorICAgICgweEVBMURFQkM2KSwgKDB4N0Q4QTVGM0MpLCAoMHhFNzA3NDdCOSksICgweDdDRTNDRUIwKSwgKDB4RTNGNDdEOTUpLAorICAgICgweDdDMjlGQkVGKSwgKDB4RTBFNjA2OEYpLCAoMHg3QjVEMDNBMSksICgweEREREM1QjRGKSwgKDB4N0E3RDA1NTkpLAorICAgICgweERBRDdGM0EyKSwgKDB4Nzk4QTIzQTgpLCAoMHhEN0Q5NDZDMyksICgweDc4ODQ4NDE5KSwgKDB4RDRFMENCMjgpLAorICAgICgweDc3NkM0RUQ5KSwgKDB4RDFFRUY1OUQpLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwgKDB4NzUwNEQzNEMpLAorICAgICgweENDMjEwRDhCKSwgKDB4NzNCNUVCQ0YpLCAoMHhDOTQ1REZFQiksICgweDcyNTUyQzc5KSwgKDB4QzY3MzIyQjkpLAorICAgICgweDcwRTJDQkNEKSwgKDB4QzNBOTQ1QTEpLCAoMHg2RjVGMDJDRiksICgweEMwRThCNjdFKSwgKDB4NkRDQTBEMjcpLAorICAgICgweEJFMzFFMUJGKSwgKDB4NkMyNDI5NjkpLCAoMHhCQjg1MzJDMCksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLAorICAgICgweDY4QTY5RTcyKSwgKDB4QjY0QkVBQjkpLCAoMHg2NkNGODEwMyksICgweEIzQzAxRkU5KSwgKDB4NjRFODg5NEEpLAorICAgICgweEIxNDAxNzhDKSwgKDB4NjJGMjAxQzQpLCAoMHhBRUNDMzM4QiksICgweDYwRUMzODNBKSwgKDB4QUM2NEQ1MUYpLAorICAgICgweDVFRDc3Qzg2KSwgKDB4QUEwQTVCMkMpLCAoMHg1Q0I0MjBDRCksICgweEE3QkQyMjlBKSwgKDB4NUE4Mjc5NzgpLAorICAgICgweEE1N0Q4NjQ2KSwgKDB4NTg0MkREN0UpLCAoMHhBMzRCREY0QiksICgweDU1RjVBNEVEKSwgKDB4QTEyODgzOTEpLAorICAgICgweDUzOUIyQUZCKSwgKDB4OUYxM0M3REMpLCAoMHg1MTMzQ0M4RiksICgweDlEMERGRTUyKSwgKDB4NEVCRkU4OEYpLAorICAgICgweDlCMTc3NkNCKSwgKDB4NEMzRkRGQ0MpLCAoMHg5OTMwN0VDNSksICgweDQ5QjQxNTYyKSwgKDB4OTc1OTYxQTIpLAorICAgICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLCAoMHg0NDdBQ0Q1RCksICgweDkzREJENkFBKSwgKDB4NDFDRTFFQ0QpLAorICAgICgweDkyMzVGMzJDKSwgKDB4M0YxNzQ5OUYpLCAoMHg5MEEwRkQ0MiksICgweDNDNTZCQUI1KSwgKDB4OEYxRDM0NjEpLAorICAgICgweDM5OENEQ0YzKSwgKDB4OERBQUQzNUQpLCAoMHgzNkJBMjAzNCksICgweDhDNEExNDQwKSwgKDB4MzNERUYyMUYpLAorICAgICgweDhBRkIyQzhFKSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksICgweDJFMTEwQUJGKSwgKDB4ODg5M0IxNEEpLAorICAgICgweDJCMUYzNEJDKSwgKDB4ODc3QjdCREQpLCAoMHgyODI2Qjk1RSksICgweDg2NzVEQzYyKSwgKDB4MjUyODBDMDUpLAorICAgICgweDg1ODJGQThDKSwgKDB4MjIyM0E0RDIpLCAoMHg4NEEyRkM2OCksICgweDFGMTlGOUYwKSwgKDB4ODNENjA0MzEpLAorICAgICgweDFDMEI4MjRFKSwgKDB4ODMxQzMxNEEpLCAoMHgxOEY4Qjg4OCksICgweDgyNzVBMEQxKSwgKDB4MTVFMjEzRkQpLAorICAgICgweDgxRTI2QzBCKSwgKDB4MTJDODEwOTApLCAoMHg4MTYyQUEwQSksICgweDBGQUIyNkI5KSwgKDB4ODBGNjZFMzApLAorICAgICgweDBDOEJEMzU2KSwgKDB4ODA5REM5NzEpLCAoMHgwOTZBOTBBQiksICgweDgwNThDOTU1KSwgKDB4MDY0N0Q5NDkpLAorICAgICgweDgwMjc3ODcxKSwgKDB4MDMyNDJBRjYpLCAoMHg4MDA5REU4MSksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLAorICAgICgweEZDREJENTRFKSwgKDB4ODAwOURFN0YpLCAoMHhGOUI4MjZGQiksICgweDgwMjc3ODZFKSwgKDB4RjY5NTZGOTkpLAorICAgICgweDgwNThDOTUwKSwgKDB4RjM3NDJDRUUpLCAoMHg4MDlEQzk2QiksICgweEYwNTREODhEKSwgKDB4ODBGNjZFNDcpLAorICAgICgweEVEMzdFRkIzKSwgKDB4ODE2MkFBMDApLCAoMHhFQTFERUI0QSksICgweDgxRTI2QzJDKSwgKDB4RTcwNzQ3QkIpLAorICAgICgweDgyNzVBMEMzKSwgKDB4RTNGNDdERjUpLCAoMHg4MzFDMzEzQiksICgweEUwRTYwNjUzKSwgKDB4ODNENjA0MjApLAorICAgICgweEREREM1QjZGKSwgKDB4ODRBMkZDNTUpLCAoMHhEQUQ3RjM0OCksICgweDg1ODJGQUMyKSwgKDB4RDdEOTQ2RTMpLAorICAgICgweDg2NzVEQzREKSwgKDB4RDRFMENCODQpLCAoMHg4NzdCN0JDNiksICgweEQxRUVGNTgxKSwgKDB4ODg5M0IxMzIpLAorICAgICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhDQzIxMEQzNSksICgweDhBRkIyQ0RCKSwgKDB4Qzk0NUUwMEEpLAorICAgICgweDhDNEExNDIzKSwgKDB4QzY3MzIyNjUpLCAoMHg4REFBRDNCMiksICgweEMzQTk0NjY5KSwgKDB4OEYxRDMzQzgpLAorICAgICgweEMwRThCNjlDKSwgKDB4OTBBMEZEMjEpLCAoMHhCRTMxRTE2RSksICgweDkyMzVGMzA5KSwgKDB4QkI4NTMyMDUpLAorICAgICgweDkzREJENzBFKSwgKDB4QjhFMzEzOUUpLCAoMHg5NTkyNjcwNSksICgweEI2NEJFQUQ1KSwgKDB4OTc1OTYxN0IpLAorICAgICgweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhCMTQwMTgwQyksICgweDlCMTc3NjUyKSwgKDB4QUVDQzMzQTUpLAorICAgICgweDlEMERGRTI3KSwgKDB4QUM2NEQ0RDgpLCAoMHg5RjEzQzgwMyksICgweEFBMEE1QTg4KSwgKDB4QTEyODg0MEYpLAorICAgICgweEE3QkQyMzEwKSwgKDB4QTM0QkRFQzMpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwgKDB4QTM0QkRFQjIpLAorICAgICgweEE3QkQyMzIyKSwgKDB4QTEyODgzRkUpLCAoMHhBQTBBNUE5QiksICgweDlGMTNDN0YyKSwgKDB4QUM2NEQ0RUIpLAorICAgICgweDlEMERGRTE2KSwgKDB4QUVDQzMzQjkpLCAoMHg5QjE3NzY0MiksICgweEIxNDAxODIwKSwgKDB4OTkzMDdGMjYpLAorICAgICgweEIzQzAxRkIyKSwgKDB4OTc1OTYxNkMpLCAoMHhCNjRCRUFFQSksICgweDk1OTI2NkY3KSwgKDB4QjhFMzEzQjQpLAorICAgICgweDkzREJENzAwKSwgKDB4QkI4NTMyMUEpLCAoMHg5MjM1RjJGQyksICgweEJFMzFFMTg0KSwgKDB4OTBBMEZEMTQpLAorICAgICgweEMwRThCNkIyKSwgKDB4OEYxRDM0QUQpLCAoMHhDM0E5NDRCQyksICgweDhEQUFEM0E2KSwgKDB4QzY3MzIyN0MpLAorICAgICgweDhDNEExNDE4KSwgKDB4Qzk0NUUwMjEpLCAoMHg4QUZCMkM2OCksICgweENDMjEwRTM3KSwgKDB4ODlCRTUxMDApLAorICAgICgweENGMDQzQTI0KSwgKDB4ODg5M0IxMjgpLCAoMHhEMUVFRjU5OSksICgweDg3N0I3QkJEKSwgKDB4RDRFMENCOUMpLAorICAgICgweDg2NzVEQzk1KSwgKDB4RDdEOTQ2MDgpLCAoMHg4NTgyRkFCQiksICgweERBRDdGMzYwKSwgKDB4ODRBMkZDNEYpLAorICAgICgweEREREM1Qjg4KSwgKDB4ODNENjAzREMpLCAoMHhFMEU2MDc2NCksICgweDgzMUMzMTZEKSwgKDB4RTNGNDdEMTQpLAorICAgICgweDgyNzVBMEJFKSwgKDB4RTcwNzQ3RDQpLCAoMHg4MUUyNkJGQiksICgweEVBMURFQzVGKSwgKDB4ODE2MkFBMjIpLAorICAgICgweEVEMzdFRUNGKSwgKDB4ODBGNjZFNDQpLCAoMHhGMDU0RDhBNiksICgweDgwOURDOTY4KSwgKDB4RjM3NDJEMDgpLAorICAgICgweDgwNThDOTNCKSwgKDB4RjY5NTcwQjIpLCAoMHg4MDI3Nzg3OSksICgweEY5QjgyNjE1KSwgKDB4ODAwOURFN0UpLAorICAgICgweEZDREJENTY4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAorICAgICgweEYxRkY3QTAwKSwgKDB4RTIzQTgwNTApLCAoMHg4NDFBMjExNCksICgweEM1ODhEQTc1KSwgKDB4MDI0MDAxNDMpLAorICAgICgweEFFRDZBQUQ3KSwgKDB4OTRDMjU0NUIpLCAoMHgzRTQ2MTU2QyksICgweDA1QkZERjI3KSwgKDB4QjA4MjIwNzUpLAorICAgICgweEQyNEM3QkM0KSwgKDB4NjIxMjIwNTQpLCAoMHg4Q0M0MUM0OSksICgweDJDNDE0OTcyKSwgKDB4NzE4RDdDNUUpLAorICAgICgweERFRTJBM0Q4KSwgKDB4NDU0NEMxMzUpLCAoMHg2NDI5MjU3MyksICgweDc2QjUxRjhBKSwgKDB4NEI3RDY1NTcpLAorICAgICgweDg3MTY0OTA3KSwgKDB4RjU5REJGRUMpLCAoMHgwNENFRTlERSksICgweEI0QkM0QzkwKSwgKDB4OUFGQ0NEMzApLAorICAgICgweDhDN0EzMTZGKSwgKDB4OTBGREFDQTcpLCAoMHg0RTBENjM4MyksICgweEFFRjE2QzBCKSwgKDB4MDYyMjAyMEEpLAorICAgICgweDM3QjZBNzM4KSwgKDB4RkZCQjdENzEpLCAoMHg1RkVERDEyRiksICgweEVFNDdGREM4KSwgKDB4M0RDNzkxM0YpLAorICAgICgweEVBRUVGN0ZEKSwgKDB4MjE5REFERUMpLCAoMHhGOUU1M0Y1RiksICgweEIzRDgyRDlFKSwgKDB4QkJCNzlCQ0IpLAorICAgICgweDQzQUQyQUFCKSwgKDB4MEU3QURCQzApLCAoMHhBQkJEMDk1MiksICgweDFBNkVGNDNBKSwgKDB4Q0Q5QjJBOUQpLAorICAgICgweDcyMjJCMzY2KSwgKDB4OTc5RTg5RTkpLCAoMHgwMkM5MTEzRiksICgweDFENTExNDY2KSwgKDB4NTdBOTIyMDYpLAorICAgICgweDRBNDEyMDc1KSwgKDB4RkQzMUQ3ODMpLCAoMHhBNzU0MkVGQyksICgweDI0Qjc2OTc1KSwgKDB4Qjk5OTYyQzcpLAorICAgICgweDE5RjFEMzU2KSwgKDB4OUQxMkMzQ0IpLCAoMHg2RDM3RDU0MiksICgweDI5RTcyMTREKSwgKDB4ODkwMEY2NDUpLAorICAgICgweEIxNTRBRDRBKSwgKDB4RjA0N0Q5ODgpLCAoMHgzRjJFNUU3NyksICgweEFGQjY4QzQ5KSwgKDB4QzlGMTlFNTEpLAorICAgICgweDYxOTJGNTNBKSwgKDB4NUFFM0QwODApLCAoMHgxREE2QzY3NyksICgweEQ0ODVENTBDKSwgKDB4OUFBN0U4QjIpLAorICAgICgweEY1NUVFMUQ1KSwgKDB4QzAwQjY5MzIpLCAoMHg4NUFDRTkxMiksICgweDgyMDhCMUI5KSwgKDB4ODBFMTQxNzApLAorICAgICgweEExRDY3QzNGKSwgKDB4MDU4MDM1QjMpLCAoMHhBNEZFMzZDQSksICgweEJFRTU0N0U0KSwgKDB4RUYyNzYwNTIpLAorICAgICgweDQyQUE0Mzg4KSwgKDB4OUMxMUEyRUQpLCAoMHgxMDIwMjU0MSksICgweDJENDgwOTEwKSwgKDB4QjA5QjFBQzQpLAorICAgICgweDE5RTdEMTdEKSwgKDB4NTIwODI0NTApLCAoMHgzRUVEMTcwNSksICgweEYyMEZGOEExKSwgKDB4ODlGNkUxN0YpLAorICAgICgweDE3RDdEQzAwKSwgKDB4MDlCOUYyQzMpLCAoMHg2Mzc4OTY4QyksICgweEFGMDYwN0Y2KSwgKDB4RkRGREUwQzkpLAorICAgICgweDNDRTNERkVFKSwgKDB4NTE2ODIyOUUpLCAoMHg3Q0Y3OTczNCksICgweEY1RkZGNTZGKSwgKDB4MzA3MDAwOTMpLAorICAgICgweDEzNUY1Qzc1KSwgKDB4RTZENzNFRUUpLCAoMHg2RTQwMERGOSksICgweDU4MjUyQUNCKSwgKDB4NTU3MzExQ0EpLAorICAgICgweDU1MzlCMzAzKSwgKDB4NTY1NTczNTUpLCAoMHhCNkJEQUNFRiksICgweDU5Rjk0MjhEKSwgKDB4OUFFNjMwMjApLAorICAgICgweDU1OEZGN0U3KSwgKDB4Nzk1NTgwNkQpLCAoMHgwOUQ1NDlGMyksICgweDYwM0JGNUI3KSwgKDB4MzEzNDQxM0IpLAorICAgICgweEJDQTdDMUFBKSwgKDB4QTk4RDEzMzkpLCAoMHg1N0IyOUM5NyksICgweDUwRjFGRjA3KSwgKDB4RTRBMTM5ODApLAorICAgICgweEQwODgxQTIxKSwgKDB4QzFGRkUzMEEpLCAoMHhCMEE2NkMxOSksICgweDE4NDE2NDkwKSwgKDB4MTYwRTAyMTQpLAorICAgICgweEE1ODRDQkI1KSwgKDB4MDJBQUE4MkEpLCAoMHg3Mzk4MTM0MCksICgweDk2NEEyNERFKSwgKDB4NkU4MjlGQzQpLAorICAgICgweERGRDYyMzYwKSwgKDB4NEMzQkYxNTIpLCAoMHgzODcyMTU3NCksICgweEQ0NkJDOTEyKSwgKDB4MUVCN0ZERDgpLAorICAgICgweDFDQTZDQkMwKSwgKDB4QkJDQkMxMTEpLCAoMHhBNkZEMTQwMyksICgweDc2QzY4OEQ5KSwgKDB4QjQ3MTg2Q0IpLAorICAgICgweDVFOTg5MzZEKSwgKDB4OUJCRjdFMkUpLCAoMHg4QjdGQkNFQyksICgweDlEQUY3RUY1KSwgKDB4N0UzQTc5RjEpLAorICAgICgweDlDODk2QUNEKSwgKDB4NjI4RjI0OUEpLCAoMHhERDZFNTFBRiksICgweEFGNzM5OTRCKSwgKDB4NTk2Njk5NUQpLAorICAgICgweEI3NjIwNTk3KSwgKDB4MzY5QjFFNTQpLCAoMHg3Q0VEQzc4NyksICgweEU3QjE1QjFGKSwgKDB4QjM2RjVGN0QpLAorICAgICgweEI1QjczRUY2KSwgKDB4RDc2RUVFRTIpLCAoMHgxNEU4NjE4NiksICgweENDMTU5MjkxKSwgKDB4NEVDODVDQTMpLAorICAgICgweEVDM0M3MDRFKSwgKDB4MEI2NjMzQjMpLCAoMHg0RDk5MkQ0QiksICgweEVCMUI1Nzc0KSwgKDB4REZCOUQ1MDgpLAorICAgICgweDExNzgzNzE5KSwgKDB4NzdCQjEwQjApLCAoMHhGQ0RGODM1MCksICgweEQzNEE3QzY1KSwgKDB4RUY2RTU3QkIpLAorICAgICgweEVDRDU2QzY4KSwgKDB4OEVCN0NBMzYpLCAoMHgyRjI2QjEzNiksICgweDU1NjMxMjY5KSwgKDB4RUYxMjEzRTEpLAorICAgICgweEE1NkFCODQ0KSwgKDB4QUE0QjFENjQpLCAoMHg2NDM0MUVBOSksICgweDBDRTlEQjQ4KSwgKDB4NDYwQzIxNDQpLAorICAgICgweEFEQzUwMjA1KSwgKDB4NTE1QzQ3MkYpLCAoMHgzMDRDMjlCRCksICgweDc2QUY4NzExKSwgKDB4NTU3Q0FEQjcpLAorICAgICgweDJBOUJCQzhFKSwgKDB4RTUwRTE0NUIpLCAoMHg5QzIwMzFGRCksICgweEQ5MTIxQThDKSwgKDB4RjUxQTk2RkQpLAorICAgICgweDQ1Q0NCRUJGKSwgKDB4NUY4ODQ4NzEpLCAoMHg2NkRBRTI5MSksICgweDk1QURDOUU1KSwgKDB4MzNDRjMwNEQpLAorICAgICgweDIzQzg3RENFKSwgKDB4QTcwMTRGQjMpLCAoMHhGQjM1MUU3MSksICgweDhENjBGNjZGKSwgKDB4QkZENkRERDUpLAorICAgICgweDE1MUZFNkYxKSwgKDB4RENDNzkzNUEpLCAoMHgwQ0FDRkJGMCksICgweEVFNTVBMzcxKSwgKDB4QkU0NkI3NTUpLAorICAgICgweDBGNzlEQ0QyKSwgKDB4MjNERkY3NkQpLCAoMHg4M0RFNzZENyksICgweDhCMEUzQUVFKSwgKDB4QjAxQkZCNDQpLAorICAgICgweDRFMzYxOUZBKSwgKDB4QTE5RjlFNjQpLCAoMHhCRDQ5MkFEOSksICgweDA4OTlFNDVGKSwgKDB4ODE1NkU0MUQpLAorICAgICgweDVEQTUzOUJBKSwgKDB4MEFGMzVCMkMpLCAoMHhEQjg5QkFBRSksICgweEExMjhDOTY2KSwgKDB4QTAyQ0VBRUUpLAorICAgICgweEM1QTFCMjkxKSwgKDB4MDhDQkE5M0UpLCAoMHg5MEZEODg3QSksICgweDYwMzA0Mzg2KSwgKDB4NkE1OUYxRUEpLAorICAgICgweEE0NjFFNjdCKSwgKDB4QzE2MjJCNzYpLCAoMHg2RkEyRjkwNiksICgweEFBM0E0MDFBKSwgKDB4QjY4RUE0N0IpLAorICAgICgweEM2MTdBODg5KSwgKDB4NjAyNEE1N0IpLCAoMHgyREQ1MzU1NSksICgweEYxRkZFQTMwKSwgKDB4ODEzQTgwNTApLAorICAgICgweDhEMUEyMUI0KSwgKDB4RkZFNzJDRjcpLCAoMHhBMzc0MTVFMSksICgweDMwQTJDODMwKSwgKDB4QTNBMUNBMjgpLAorICAgICgweDRDNUUzNTg2KSwgKDB4MzA5ODYxQjkpLCAoMHgxRjQ5ODUwRCksICgweDYxNjRDNzQ4KSwgKDB4OUQ3MDQ4RTUpLAorICAgICgweEMxMjQ1NjlFKSwgKDB4Q0NCMEUxMTEpLCAoMHgxNUIyQkI4NiksICgweDE4MzcxRDlDKSwgKDB4QjJBQkQ5NEQpLAorICAgICgweDhFQzY1NkIzKSwgKDB4QkYwMTA5OTUpfTsKIAorc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfNTEyW10gPSB7CisgICAgKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdGRkQ4ODU5KSwgKDB4RkU2REUyRTApLCAoMHg3RkY2MjE4MSksCisgICAgKDB4RkNEQkQ1NDApLCAoMHg3RkU5Q0JCRSksICgweEZCNDlFNkEzKSwgKDB4N0ZEODg3OEMpLCAoMHhGOUI4MjY4MSksCisgICAgKDB4N0ZDMjU1OTUpLCAoMHhGODI2QTQ2NCksICgweDdGQTczNkIyKSwgKDB4RjY5NTZGQjcpLCAoMHg3Rjg3MkJGMiksCisgICAgKDB4RjUwNDk4MDApLCAoMHg3RjYyMzY4RCksICgweEYzNzQyQzlEKSwgKDB4N0YzODU3RjQpLCAoMHhGMUU0M0QxQyksCisgICAgKDB4N0YwOTkxQzMpLCAoMHhGMDU0RDhEQSksICgweDdFRDVFNUM2KSwgKDB4RUVDNjBGM0MpLCAoMHg3RTlENTVGQiksCisgICAgKDB4RUQzN0VGOTEpLCAoMHg3RTVGRTQ5MCksICgweEVCQUE4OTQ0KSwgKDB4N0UxRDkzRUEpLCAoMHhFQTFERUJDNiksCisgICAgKDB4N0RENjY2OEQpLCAoMHhFODkyMjYyMSksICgweDdEOEE1RjNDKSwgKDB4RTcwNzQ3QjkpLCAoMHg3RDM5ODBFRCksCisgICAgKDB4RTU3RDVGRTQpLCAoMHg3Q0UzQ0VCMCksICgweEUzRjQ3RDk1KSwgKDB4N0M4OTRCREEpLCAoMHhFMjZDQjAxMCksCisgICAgKDB4N0MyOUZCRUYpLCAoMHhFMEU2MDY4RiksICgweDdCQzVFMjk2KSwgKDB4REY2MDkwMDIpLCAoMHg3QjVEMDNBMSksCisgICAgKDB4REREQzVCNEYpLCAoMHg3QUVGNjMyNSksICgweERDNTk3NzhCKSwgKDB4N0E3RDA1NTkpLCAoMHhEQUQ3RjNBMiksCisgICAgKDB4N0EwNUVFQTgpLCAoMHhEOTU3REU2RiksICgweDc5OEEyM0E4KSwgKDB4RDdEOTQ2QzMpLCAoMHg3OTA5QTkzNSksCisgICAgKDB4RDY1QzNCOTgpLCAoMHg3ODg0ODQxOSksICgweEQ0RTBDQjI4KSwgKDB4NzdGQUI5OEEpLCAoMHhEMzY3MDQ0RiksCisgICAgKDB4Nzc2QzRFRDkpLCAoMHhEMUVFRjU5RCksICgweDc2RDk0OTgzKSwgKDB4RDA3OEFEOTMpLCAoMHg3NjQxQUYzMiksCisgICAgKDB4Q0YwNDNBOUUpLCAoMHg3NUE1ODVEOSksICgweENEOTFBQjU1KSwgKDB4NzUwNEQzNEMpLCAoMHhDQzIxMEQ4QiksCisgICAgKDB4NzQ1RjlERDMpLCAoMHhDQUIyNkZCMiksICgweDczQjVFQkNGKSwgKDB4Qzk0NURGRUIpLCAoMHg3MzA3QzNDOSksCisgICAgKDB4QzdEQjZDNDUpLCAoMHg3MjU1MkM3OSksICgweEM2NzMyMkI5KSwgKDB4NzE5RTJDREUpLCAoMHhDNTBEMTE2NCksCisgICAgKDB4NzBFMkNCQ0QpLCAoMHhDM0E5NDVBMSksICgweDcwMjMxMDlDKSwgKDB4QzI0N0NENjIpLCAoMHg2RjVGMDJDRiksCisgICAgKDB4QzBFOEI2N0UpLCAoMHg2RTk2QTk5NSksICgweEJGOEMwREQ4KSwgKDB4NkRDQTBEMjcpLCAoMHhCRTMxRTFCRiksCisgICAgKDB4NkNGOTM0RTgpLCAoMHhCQ0RBM0VBRSksICgweDZDMjQyOTY5KSwgKDB4QkI4NTMyQzApLCAoMHg2QjRBRjI1OCksCisgICAgKDB4QkEzMkNBNDIpLCAoMHg2QTZEOThBMSksICgweEI4RTMxMzE4KSwgKDB4Njk4QzI0ODcpLCAoMHhCNzk2MTlDNiksCisgICAgKDB4NjhBNjlFNzIpLCAoMHhCNjRCRUFCOSksICgweDY3QkQwRkNDKSwgKDB4QjUwNDkzODApLCAoMHg2NkNGODEwMyksCisgICAgKDB4QjNDMDFGRTkpLCAoMHg2NURERkJENiksICgweEIyN0U5RDQzKSwgKDB4NjRFODg5NEEpLCAoMHhCMTQwMTc4QyksCisgICAgKDB4NjNFRjMyODYpLCAoMHhCMDA0OUFBOSksICgweDYyRjIwMUM0KSwgKDB4QUVDQzMzOEIpLCAoMHg2MUYxMDAyNyksCisgICAgKDB4QUQ5NkVENzcpLCAoMHg2MEVDMzgzQSksICgweEFDNjRENTFGKSwgKDB4NUZFM0IzNjYpLCAoMHhBQjM1RjU4QyksCisgICAgKDB4NUVENzdDODYpLCAoMHhBQTBBNUIyQyksICgweDVEQzc5RDlDKSwgKDB4QThFMjExMkMpLCAoMHg1Q0I0MjBDRCksCisgICAgKDB4QTdCRDIyOUEpLCAoMHg1QjlEMTE2NiksICgweEE2OUI5QjdEKSwgKDB4NUE4Mjc5NzgpLCAoMHhBNTdEODY0NiksCisgICAgKDB4NTk2NDY0OUIpLCAoMHhBNDYyRUVCMiksICgweDU4NDJERDdFKSwgKDB4QTM0QkRGNEIpLCAoMHg1NzFERUVFRCksCisgICAgKDB4QTIzODYyN0IpLCAoMHg1NUY1QTRFRCksICgweEExMjg4MzkxKSwgKDB4NTRDQTBBMkUpLCAoMHhBMDFDNEM1QyksCisgICAgKDB4NTM5QjJBRkIpLCAoMHg5RjEzQzdEQyksICgweDUyNjkxMjQxKSwgKDB4OUUwRUZGOUQpLCAoMHg1MTMzQ0M4RiksCisgICAgKDB4OUQwREZFNTIpLCAoMHg0RkZCNjU3MiksICgweDlDMTBDRDkwKSwgKDB4NEVCRkU4OEYpLCAoMHg5QjE3NzZDQiksCisgICAgKDB4NEQ4MTYyRDgpLCAoMHg5QTIyMDQzRiksICgweDRDM0ZERkNDKSwgKDB4OTkzMDdFQzUpLCAoMHg0QUZCNkM5QiksCisgICAgKDB4OTg0MkYwNDgpLCAoMHg0OUI0MTU2MiksICgweDk3NTk2MUEyKSwgKDB4NDg2OUU2NTcpLCAoMHg5NjczREI4QyksCisgICAgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDQ1Q0QzNTZGKSwgKDB4OTRCNTBENzQpLCAoMHg0NDdBQ0Q1RCksCisgICAgKDB4OTNEQkQ2QUEpLCAoMHg0MzI1QzEwMiksICgweDkzMDZDQUU3KSwgKDB4NDFDRTFFQ0QpLCAoMHg5MjM1RjMyQyksCisgICAgKDB4NDA3M0YyNDUpLCAoMHg5MTY5NTY3RCksICgweDNGMTc0OTlGKSwgKDB4OTBBMEZENDIpLCAoMHgzREI4MzI0QyksCisgICAgKDB4OEZEQ0VGMzcpLCAoMHgzQzU2QkFCNSksICgweDhGMUQzNDYxKSwgKDB4M0FGMkVFQkEpLCAoMHg4RTYxRDMzMSksCisgICAgKDB4Mzk4Q0RDRjMpLCAoMHg4REFBRDM1RCksICgweDM4MjQ5NDEzKSwgKDB4OENGODNDNjIpLCAoMHgzNkJBMjAzNCksCisgICAgKDB4OEM0QTE0NDApLCAoMHgzNTREOTAzMyksICgweDhCQTA2MjIxKSwgKDB4MzNERUYyMUYpLCAoMHg4QUZCMkM4RSksCisgICAgKDB4MzI2RTU1MDUpLCAoMHg4QTVBN0E0RCksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLCAoMHgyRjg3NTIxNiksCisgICAgKDB4ODkyNkI2NUEpLCAoMHgyRTExMEFCRiksICgweDg4OTNCMTRBKSwgKDB4MkM5OEZCRDEpLCAoMHg4ODA1NDY4MiksCisgICAgKDB4MkIxRjM0QkMpLCAoMHg4NzdCN0JERCksICgweDI5QTNDNDBGKSwgKDB4ODZGNjU2QUMpLCAoMHgyODI2Qjk1RSksCisgICAgKDB4ODY3NURDNjIpLCAoMHgyNkE4MjE3NCksICgweDg1RkExMTRGKSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksCisgICAgKDB4MjNBNjg4RDMpLCAoMHg4NTEwOUNGNyksICgweDIyMjNBNEQyKSwgKDB4ODRBMkZDNjgpLCAoMHgyMDlGNkZFMSksCisgICAgKDB4ODQzQTFENjIpLCAoMHgxRjE5RjlGMCksICgweDgzRDYwNDMxKSwgKDB4MUQ5MzUwMTEpLCAoMHg4Mzc2QjQyRSksCisgICAgKDB4MUMwQjgyNEUpLCAoMHg4MzFDMzE0QSksICgweDFBODI5RkMwKSwgKDB4ODJDNjdGMDApLCAoMHgxOEY4Qjg4OCksCisgICAgKDB4ODI3NUEwRDEpLCAoMHgxNzZERDlFMSksICgweDgyMjk5OTc0KSwgKDB4MTVFMjEzRkQpLCAoMHg4MUUyNkMwQiksCisgICAgKDB4MTQ1NTc3MUQpLCAoMHg4MUEwMUI4MCksICgweDEyQzgxMDkwKSwgKDB4ODE2MkFBMEEpLCAoMHgxMTM5RjBBNyksCisgICAgKDB4ODEyQTFBMzYpLCAoMHgwRkFCMjZCOSksICgweDgwRjY2RTMwKSwgKDB4MEUxQkMzMjYpLCAoMHg4MEM3QTgxMyksCisgICAgKDB4MEM4QkQzNTYpLCAoMHg4MDlEQzk3MSksICgweDBBRkI2N0IyKSwgKDB4ODA3OEQ0MDcpLCAoMHgwOTZBOTBBQiksCisgICAgKDB4ODA1OEM5NTUpLCAoMHgwN0Q5NUJCNiksICgweDgwM0RBQTZEKSwgKDB4MDY0N0Q5NDkpLCAoMHg4MDI3Nzg3MSksCisgICAgKDB4MDRCNjE4REYpLCAoMHg4MDE2MzQzRCksICgweDAzMjQyQUY2KSwgKDB4ODAwOURFODEpLCAoMHgwMTkyMUQwQyksCisgICAgKDB4ODAwMjc3QTcpLCAoMHhGRkZGRkZBMyksICgweDgwMDAwMDAyKSwgKDB4RkU2REUzMzgpLCAoMHg4MDAyNzdBNiksCisgICAgKDB4RkNEQkQ1NEUpLCAoMHg4MDA5REU3RiksICgweEZCNDlFNjY1KSwgKDB4ODAxNjM0NDQpLCAoMHhGOUI4MjZGQiksCisgICAgKDB4ODAyNzc4NkUpLCAoMHhGODI2QTQ4RSksICgweDgwM0RBQTY5KSwgKDB4RjY5NTZGOTkpLCAoMHg4MDU4Qzk1MCksCisgICAgKDB4RjUwNDk3OTMpLCAoMHg4MDc4RDQxOCksICgweEYzNzQyQ0VFKSwgKDB4ODA5REM5NkIpLCAoMHhGMUU0M0QxRSksCisgICAgKDB4ODBDN0E4MEMpLCAoMHhGMDU0RDg4RCksICgweDgwRjY2RTQ3KSwgKDB4RUVDNjBGOUQpLCAoMHg4MTJBMUEyRCksCisgICAgKDB4RUQzN0VGQjMpLCAoMHg4MTYyQUEwMCksICgweEVCQUE4OTI3KSwgKDB4ODFBMDFCNzUpLCAoMHhFQTFERUI0QSksCisgICAgKDB4ODFFMjZDMkMpLCAoMHhFODkyMjY2MiksICgweDgyMjk5OTY3KSwgKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksCisgICAgKDB4RTU3RDVGODkpLCAoMHg4MkM2N0YyNyksICgweEUzRjQ3REY1KSwgKDB4ODMxQzMxM0IpLCAoMHhFMjZDQjAzMSksCisgICAgKDB4ODM3NkI0MUUpLCAoMHhFMEU2MDY1MyksICgweDgzRDYwNDIwKSwgKDB4REY2MDhGNjkpLCAoMHg4NDNBMUQ5MiksCisgICAgKDB4REREQzVCNkYpLCAoMHg4NEEyRkM1NSksICgweERDNTk3NzZFKSwgKDB4ODUxMDlDRTQpLCAoMHhEQUQ3RjM0OCksCisgICAgKDB4ODU4MkZBQzIpLCAoMHhEOTU3REVDRCksICgweDg1RkExMTNBKSwgKDB4RDdEOTQ2RTMpLCAoMHg4Njc1REM0RCksCisgICAgKDB4RDY1QzNCNDApLCAoMHg4NkY2NTZFOSksICgweEQ0RTBDQjg0KSwgKDB4ODc3QjdCQzYpLCAoMHhEMzY3MDQ2RiksCisgICAgKDB4ODgwNTQ2NkEpLCAoMHhEMUVFRjU4MSksICgweDg4OTNCMTMyKSwgKDB4RDA3OEFEM0MpLCAoMHg4OTI2QjZBMCksCisgICAgKDB4Q0YwNDNBRjgpLCAoMHg4OUJFNTBBOCksICgweENEOTFBQjM5KSwgKDB4OEE1QTdBMzIpLCAoMHhDQzIxMEQzNSksCisgICAgKDB4OEFGQjJDREIpLCAoMHhDQUIyNzAwQiksICgweDhCQTA2MjA0KSwgKDB4Qzk0NUUwMEEpLCAoMHg4QzRBMTQyMyksCisgICAgKDB4QzdEQjZDMkEpLCAoMHg4Q0Y4M0M0NCksICgweEM2NzMyMjY1KSwgKDB4OERBQUQzQjIpLCAoMHhDNTBEMTA5RiksCisgICAgKDB4OEU2MUQzODgpLCAoMHhDM0E5NDY2OSksICgweDhGMUQzM0M4KSwgKDB4QzI0N0NERjApLCAoMHg4RkRDRUYxNiksCisgICAgKDB4QzBFOEI2OUMpLCAoMHg5MEEwRkQyMSksICgweEJGOEMwREY2KSwgKDB4OTE2OTU2NUEpLCAoMHhCRTMxRTE2RSksCisgICAgKDB4OTIzNUYzMDkpLCAoMHhCQ0RBM0U1RSksICgweDkzMDZDQjQ5KSwgKDB4QkI4NTMyMDUpLCAoMHg5M0RCRDcwRSksCisgICAgKDB4QkEzMkNCMzUpLCAoMHg5NEI1MEQwOSksICgweEI4RTMxMzlFKSwgKDB4OTU5MjY3MDUpLCAoMHhCNzk2MTlFMiksCisgICAgKDB4OTY3M0RCNjYpLCAoMHhCNjRCRUFENSksICgweDk3NTk2MTdCKSwgKDB4QjUwNDkzMzQpLCAoMHg5ODQyRjA2QiksCisgICAgKDB4QjNDMDFGOUQpLCAoMHg5OTMwN0YzNSksICgweEIyN0U5QzkyKSwgKDB4OUEyMjA0QjApLCAoMHhCMTQwMTgwQyksCisgICAgKDB4OUIxNzc2NTIpLCAoMHhCMDA0OUIyNyksICgweDlDMTBDRDE1KSwgKDB4QUVDQzMzQTUpLCAoMHg5RDBERkUyNyksCisgICAgKDB4QUQ5NkVEOTEpLCAoMHg5RTBFRkZDMyksICgweEFDNjRENEQ4KSwgKDB4OUYxM0M4MDMpLCAoMHhBQjM1RjU0NSksCisgICAgKDB4QTAxQzRDRDgpLCAoMHhBQTBBNUE4OCksICgweEExMjg4NDBGKSwgKDB4QThFMjExQTIpLCAoMHhBMjM4NjFGNSksCisgICAgKDB4QTdCRDIzMTApLCAoMHhBMzRCREVDMyksICgweEE2OUI5Qjk2KSwgKDB4QTQ2MkVFODIpLCAoMHhBNTdEODY1RSksCisgICAgKDB4QTU3RDg2NzApLCAoMHhBNDYyRUU3MCksICgweEE2OUI5QkE4KSwgKDB4QTM0QkRFQjIpLCAoMHhBN0JEMjMyMiksCisgICAgKDB4QTIzODYxRTQpLCAoMHhBOEUyMTFCNSksICgweEExMjg4M0ZFKSwgKDB4QUEwQTVBOUIpLCAoMHhBMDFDNENDNyksCisgICAgKDB4QUIzNUY1NTkpLCAoMHg5RjEzQzdGMiksICgweEFDNjRENEVCKSwgKDB4OUUwRUZGQjMpLCAoMHhBRDk2RURBNSksCisgICAgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksICgweDlDMTBDRDA1KSwgKDB4QjAwNDlCM0IpLCAoMHg5QjE3NzY0MiksCisgICAgKDB4QjE0MDE4MjApLCAoMHg5QTIyMDRBMSksICgweEIyN0U5Q0E2KSwgKDB4OTkzMDdGMjYpLCAoMHhCM0MwMUZCMiksCisgICAgKDB4OTg0MkYwNUMpLCAoMHhCNTA0OTM0OSksICgweDk3NTk2MTZDKSwgKDB4QjY0QkVBRUEpLCAoMHg5NjczREI1NyksCisgICAgKDB4Qjc5NjE5RjcpLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwgKDB4OTRCNTBFMTMpLCAoMHhCQTMyQzk5RSksCisgICAgKDB4OTNEQkQ3MDApLCAoMHhCQjg1MzIxQSksICgweDkzMDZDQjNDKSwgKDB4QkNEQTNFNzQpLCAoMHg5MjM1RjJGQyksCisgICAgKDB4QkUzMUUxODQpLCAoMHg5MTY5NTY0RCksICgweEJGOEMwRTBDKSwgKDB4OTBBMEZEMTQpLCAoMHhDMEU4QjZCMiksCisgICAgKDB4OEZEQ0VGMDkpLCAoMHhDMjQ3Q0UwNyksICgweDhGMUQzNEFEKSwgKDB4QzNBOTQ0QkMpLCAoMHg4RTYxRDM3QyksCisgICAgKDB4QzUwRDEwQjYpLCAoMHg4REFBRDNBNiksICgweEM2NzMyMjdDKSwgKDB4OENGODNDMzkpLCAoMHhDN0RCNkM0MSksCisgICAgKDB4OEM0QTE0MTgpLCAoMHhDOTQ1RTAyMSksICgweDhCQTA2MUY5KSwgKDB4Q0FCMjcwMjIpLCAoMHg4QUZCMkM2OCksCisgICAgKDB4Q0MyMTBFMzcpLCAoMHg4QTVBN0E4RCksICgweENEOTFBQTY2KSwgKDB4ODlCRTUxMDApLCAoMHhDRjA0M0EyNCksCisgICAgKDB4ODkyNkI2OTcpLCAoMHhEMDc4QUQ1MyksICgweDg4OTNCMTI4KSwgKDB4RDFFRUY1OTkpLCAoMHg4ODA1NDY2MSksCisgICAgKDB4RDM2NzA0ODcpLCAoMHg4NzdCN0JCRCksICgweEQ0RTBDQjlDKSwgKDB4ODZGNjU2OEUpLCAoMHhENjVDM0M0QSksCisgICAgKDB4ODY3NURDOTUpLCAoMHhEN0Q5NDYwOCksICgweDg1RkExMTgwKSwgKDB4RDk1N0RERjEpLCAoMHg4NTgyRkFCQiksCisgICAgKDB4REFEN0YzNjApLCAoMHg4NTEwOUNERCksICgweERDNTk3Nzg3KSwgKDB4ODRBMkZDNEYpLCAoMHhERERDNUI4OCksCisgICAgKDB4ODQzQTFENEIpLCAoMHhERjYwOTA3QSksICgweDgzRDYwM0RDKSwgKDB4RTBFNjA3NjQpLCAoMHg4Mzc2QjQ1NCksCisgICAgKDB4RTI2Q0FGNTEpLCAoMHg4MzFDMzE2RCksICgweEUzRjQ3RDE0KSwgKDB4ODJDNjdGMjEpLCAoMHhFNTdENUZBMiksCisgICAgKDB4ODI3NUEwQkUpLCAoMHhFNzA3NDdENCksICgweDgyMjk5OTYyKSwgKDB4RTg5MjI2N0MpLCAoMHg4MUUyNkJGQiksCisgICAgKDB4RUExREVDNUYpLCAoMHg4MUEwMUI0OCksICgweEVCQUE4QTNEKSwgKDB4ODE2MkFBMjIpLCAoMHhFRDM3RUVDRiksCisgICAgKDB4ODEyQTFBNEMpLCAoMHhFRUM2MEVCOSksICgweDgwRjY2RTQ0KSwgKDB4RjA1NEQ4QTYpLCAoMHg4MEM3QTgwOSksCisgICAgKDB4RjFFNDNEMzgpLCAoMHg4MDlEQzk2OCksICgweEYzNzQyRDA4KSwgKDB4ODA3OEQzRkYpLCAoMHhGNTA0OThBQiksCisgICAgKDB4ODA1OEM5M0IpLCAoMHhGNjk1NzBCMiksICgweDgwM0RBQTc3KSwgKDB4RjgyNkEzQTgpLCAoMHg4MDI3Nzg3OSksCisgICAgKDB4RjlCODI2MTUpLCAoMHg4MDE2MzQ0MyksICgweEZCNDlFNjdGKSwgKDB4ODAwOURFN0UpLCAoMHhGQ0RCRDU2OCksCisgICAgKDB4ODAwMjc3QTYpLCAoMHhGRTZERTM1MiksICgweDQ2NTIyMEJCKSwgKDB4QzY2RTFGRkMpLCAoMHgyQzYxRDM1NiksCisgICAgKDB4QUZGQjE3NkQpLCAoMHg4ODA2N0UyMyksICgweDM3OTZGMDA4KSwgKDB4QzhEMTI4RjMpLCAoMHhCNjYxQTVGQSksCisgICAgKDB4RjE5Q0U0RjApLCAoMHgzRjdEMDM0NSksICgweEU5N0U2MDMwKSwgKDB4NEFCQTkxQ0YpLCAoMHhERUVEQUIwQyksCisgICAgKDB4MzVGRDFENzcpLCAoMHhERDYzNjQzOSksICgweDJGOEI3OTRDKSwgKDB4NzY0RTFEMzIpLCAoMHg3QThEMEIxQiksCisgICAgKDB4OEVBQ0IyN0YpLCAoMHg1NzdBRDY3QiksICgweDJCM0ZFMkM1KSwgKDB4OEFDRDAyNEEpLCAoMHhFREY1QzQyQyksCisgICAgKDB4RjFDQTk1MUMpLCAoMHhCOThCNkQwNCksICgweDZEMTJCODY0KSwgKDB4NTBFNzREMDgpLCAoMHg3M0QxNTAzQiksCisgICAgKDB4QzdEM0Y2QTkpLCAoMHgxRjM2NUU5NyksICgweEUxMzQwRTU5KSwgKDB4ODlEMjFCOUQpLCAoMHg5Qjc1NjczMyksCisgICAgKDB4OTAyNENENTApLCAoMHhFMkM3RkY1MiksICgweEQ5RjA2MUVGKSwgKDB4NzcxNTEzOTIpLCAoMHhBMEU0QTAwNCksCisgICAgKDB4NjBCRTgyMEYpLCAoMHhDNzYwM0JBRiksICgweEE2MkUzREE5KSwgKDB4QTQwMEUxMUYpLCAoMHgxNTUxMTFENCksCisgICAgKDB4OTAzMEEzNzQpLCAoMHgxNDE4NTEyNCksICgweDhEMDQzQTAwKSwgKDB4NTA5NDUyNTgpLCAoMHgyMEE2NjUzRSksCisgICAgKDB4QTE5QkE4QjkpLCAoMHgzQ0ZCRTY5MiksICgweDkxNDcxRDk4KSwgKDB4MEI5RDAzRkYpLCAoMHhBNUJBOEUyOSksCisgICAgKDB4RkZDOEVCMjIpLCAoMHgxNDJDQjFCMCksICgweDU1MzE3MzE5KSwgKDB4MzNBREM3N0MpLCAoMHhGNjlCQURDRSksCisgICAgKDB4Nzg0MjNEM0MpLCAoMHhCRTY3QkJGMCksICgweDdEODhCRDE1KSwgKDB4MUU5RUY2NzMpLCAoMHg1MTIwOThCMyksCisgICAgKDB4MzI2QTNEM0QpLCAoMHgxNjFFRjNCNiksICgweDBFNEM0RUQ1KSwgKDB4NEU5Rjk5ODIpLCAoMHhEMEFCNkEzNiksCisgICAgKDB4RjE3REQzNzcpLCAoMHg1RTUzRjMxQyksICgweEJFOTExMkVBKSwgKDB4M0RFMUIwRkYpLCAoMHhEN0YzOUFFNyksCisgICAgKDB4QTM0Qjk2MzUpLCAoMHg0OUNGRUU2QyksICgweDhBMDYzQUM2KSwgKDB4QkE3OUJDMEQpLCAoMHg2QTU4ODc4MiksCisgICAgKDB4NDM5QkU1OTMpLCAoMHgwQTVGN0U4RCksICgweEQyRkMyNTYxKSwgKDB4NDY5OEFDOEYpLCAoMHgyNDdDM0JDMiksCisgICAgKDB4NTgyNjUyM0QpLCAoMHg0RDJCRDc1MyksICgweDRCOEJDQzE3KSwgKDB4OUI3NDM1MDMpLCAoMHg5Rjg0RTQzNCksCisgICAgKDB4OEI5N0I0MUEpLCAoMHgzQ0ZDRTc1RiksICgweDMyRDJENDg3KSwgKDB4M0U4MEI0QUYpLCAoMHg0MkY4QjBFQSksCisgICAgKDB4RUMwQzgxRUUpLCAoMHgxNzI3OTMwOSksICgweDY4MUZBMEYzKSwgKDB4OEJBRDIwOEUpLCAoMHhEMTE3OTJDNiksCisgICAgKDB4RjFGRjA3QjMpLCAoMHgyMTMzODA1MCksICgweDhBMUEyMUE0KSwgKDB4RkYwMzU4RDgpLCAoMHg0MTZDMTNDMSksCisgICAgKDB4NDYzNDg4NTgpLCAoMHg4MzgyMDUxOSksICgweEFCQzA4ODIyKSwgKDB4NkExQTUyMDApLCAoMHgwQzgzMTIyQSksCisgICAgKDB4QTY3RkRGMDYpLCAoMHgwNjI5Rjk3MCksICgweEVGQUEyNzQzKSwgKDB4MEMwMEFEOTUpLCAoMHhGRjA5RjVDRiksCisgICAgKDB4Qzc4NERCOEIpLCAoMHhDQjAwQkE3RCksICgweDYyMjA5MDlGKSwgKDB4NzE0OUI3REYpLCAoMHg1QkQzRUJFQyksCisgICAgKDB4MDQ4NUVGNzEpLCAoMHgwN0ZFMjNCMSksICgweDgwNzM3NjY4KSwgKDB4NDJBMzI2NDUpLCAoMHhENkVEQkIxOCksCisgICAgKDB4NDA3RTcyQzUpLCAoMHg5MDE0MDJFMCksICgweDBDMUI3OTA1KSwgKDB4MDFDRTExRkMpLCAoMHgwMEM2NDkxNCksCisgICAgKDB4MzAzNzk3OEEpLCAoMHhGQUJDOTE5MCksICgweDQzQTBBQzg5KSwgKDB4Qjk5OTgzNzApLCAoMHhENkQ2OTIwOSksCisgICAgKDB4RjEzMjQ1NUUpLCAoMHg5REFGRjQ4MiksICgweEEyRDYzNUMyKSwgKDB4QkQ5NzZCNUUpLCAoMHg3OUVEOTNFRCksCisgICAgKDB4N0Q0MkNBMjIpLCAoMHgyRTIzRjlDMSksICgweENGMEU3NTIxKSwgKDB4OTZEODhBQzEpLCAoMHg0MjBDMjg0NSksCisgICAgKDB4MUUxOTU3M0QpLCAoMHhGOEZFOTI3OSksICgweEMxNDk1MTAwKSwgKDB4MjAxMjQ5QzIpLCAoMHg4QjE4MzcyMyksCisgICAgKDB4NDUwNjE1QTUpLCAoMHgwMDRDMDExMiksICgweDg1RUI1MjM1KSwgKDB4MUJEOEJENDgpLCAoMHhBMjkxNEYwMyksCisgICAgKDB4NTE0MjBFQUMpLCAoMHhDRTc4ODQ3MCksICgweDA1MDgwMzBCKSwgKDB4QTRDRDJBNkMpLCAoMHg5NjI2QzA2MiksCisgICAgKDB4Rjg4RDJERTUpLCAoMHhBOUQ2QjM5OSksICgweEIzQzU3QkZEKSwgKDB4Q0IxRTlDNEMpLCAoMHgwMDRBNTA5NCksCisgICAgKDB4RDBDQkM0MkEpLCAoMHgzQkUxQTY5NCksICgweDNDMzUzRkE3KSwgKDB4QTU2OTdDNTcpLCAoMHhGRTk2MTY2NSksCisgICAgKDB4RUQ2QjdDN0QpLCAoMHg0MzNEQ0Y4RCksICgweERBN0Q2QzI0KSwgKDB4NDA3MTEyQzEpLCAoMHg0QjlEMjg1RCksCisgICAgKDB4NkM5QTJGNTcpLCAoMHgxQkY5RkFFRiksICgweDRFRTNFMkU5KSwgKDB4RTVBRTdFOTIpLCAoMHg2MEExMUQzRiksCisgICAgKDB4NEI0NDFCNjMpLCAoMHhDODQxOUJCMSksICgweDJDNEY2REREKSwgKDB4Q0VDM0NGNkQpLCAoMHgzMjVBNjVDQSksCisgICAgKDB4ODE4RkM2QTQpLCAoMHhDNTVFNUU1QiksICgweDI3NzQ0NUEzKSwgKDB4NkIzMjg5RjcpLCAoMHgwOTE0N0Q1NSksCisgICAgKDB4NEYzNzhENTMpLCAoMHg1ODhCMERDOCksICgweEY3MEJBMzQ3KSwgKDB4Q0JDNDNGQUUpLCAoMHhEOThFNjYzOSksCisgICAgKDB4MDdBRjlFRDApLCAoMHhFMkU2MzA1QSksICgweDVFMDAzNTcxKSwgKDB4MTg1MjNFN0EpLCAoMHhGNzBEMUUyNyksCisgICAgKDB4RDcyODg5NTApLCAoMHgxMkMxMTEzMiksICgweEZGMUM5RDE3KSwgKDB4MzE4MDUwRjEpLCAoMHgxQTIxOTgyMSksCisgICAgKDB4QkYyMTk5OEEpLCAoMHg2QzEzQzFGRiksICgweDhDNjA1ODYxKSwgKDB4MEExODM5NTQpLCAoMHg3QkU0QzFCNiksCisgICAgKDB4QTJDQkM0MTApLCAoMHg3Q0MwMEE1NSksICgweDVFNThBOTczKSwgKDB4MTEyMkVGODYpLCAoMHg4MDU2OEUzOSksCisgICAgKDB4MjMxMEMzMDApLCAoMHgwRTE1MkQwRSksICgweDlFMDE3QzFDKSwgKDB4ODUxREZDMjYpLCAoMHhEMUIxRTY2MiksCisgICAgKDB4ODFCQTEwQjApLCAoMHg5NkMyRTk3NyksICgweDg2ODhFNDE5KSwgKDB4OTdDOTQ5ODkpLCAoMHgyNTBENTM1RSksCisgICAgKDB4MzVGREU3MzIpLCAoMHgxNDdBRDE4MyksICgweENGOUQ3NUMwKSwgKDB4NkIyQzE4M0MpLCAoMHgxRDMyNjQ4OSksCisgICAgKDB4QzA4MDdEOTgpLCAoMHhDMDgxNjIyRSksICgweDE1Qzg3Qjg3KSwgKDB4NzQwNDU5OEMpLCAoMHhGQzNDN0ZBNiksCisgICAgKDB4MjhCQThDRjUpLCAoMHhFMzExRUE5QiksICgweEVBQkZENEE1KSwgKDB4ODc2ODgzNEEpLCAoMHgwRjdENzQ0MCksCisgICAgKDB4NDA1OTMxNTIpLCAoMHhDRjFFOEJGNSksICgweEUzMjAxN0I2KSwgKDB4MzlFNjYwNzApLCAoMHg1NjBFQ0U5RCksCisgICAgKDB4RjQxMzJDNzcpLCAoMHg3MjI5NDVDMSksICgweDk2RUNCNUQ1KSwgKDB4MEMxMDBDMDYpLCAoMHgzMEU5NkMwMiksCisgICAgKDB4RTBCMDE1OUIpLCAoMHgxNjNBNDBDQiksICgweDFCMjhCNzUwKSwgKDB4MTE0MjBFMTEpLCAoMHgzNERDNTk4MSksCisgICAgKDB4RDI3NjlDM0MpLCAoMHg1Njk0MDJEMCksICgweEU0RjE1N0MwKSwgKDB4MTIwREYyNEMpLCAoMHg0MEQ4NjE1MyksCisgICAgKDB4MTk0MkNEMTEpLCAoMHgyMjQ4NEMzQiksICgweDhCMjk5MTQ0KSwgKDB4NThGMUFBRjgpLCAoMHhCMkNENDc3NyksCisgICAgKDB4NEE1M0FCMDIpLCAoMHg1NUE1REFENCksICgweEM4RDU4RDc5KSwgKDB4NkNBRUMwMTEpLCAoMHgxQzk1NUM4NCksCisgICAgKDB4REUwOEE2QzYpLCAoMHhENDAyQUY3RCksICgweDY5NUU2RkE0KSwgKDB4NERBODYzQjkpLCAoMHg1MTE4MDcwQyksCisgICAgKDB4NUE5N0VGMUMpLCAoMHg4ODgwQjM4OCksICgweDRENTk2QjJEKSwgKDB4MzdENzREQ0YpLCAoMHg1ODEzOEIzOCksCisgICAgKDB4NUI3QkNENEUpLCAoMHhBRTZDNDQyMiksICgweDRFNUQxQUYxKSwgKDB4REU3Mzk2QTUpLCAoMHhCNDQyRjIxNyksCisgICAgKDB4MERGN0EwMDYpLCAoMHg5NkVFRjhBMiksICgweEUyODQ3QjI2KSwgKDB4NjhCOUY2N0IpLCAoMHg4RkUxRkE2NSksCisgICAgKDB4RTBBODdFNTYpLCAoMHgxQkU4RkM0QyksICgweEJCRDY1RjlEKSwgKDB4RTZGMDJDOUQpLCAoMHg4NjdDNkVFQyksCisgICAgKDB4NDNGQUI3MjUpLCAoMHhBNDE0NDQxOSksICgweDY5QkI2QUFGKSwgKDB4Q0UyN0I3NDQpLCAoMHgwMjIyNDFBOSksCisgICAgKDB4QzA1REYxNEUpLCAoMHg4MDUwRjFGRiksICgweDIxOEMyMTMxKSwgKDB4QkUyNTk0MUEpLCAoMHg5MDQxQ0QwNiksCisgICAgKDB4MUVFOEE5QzApLCAoMHhENTMwRkVERCksICgweDc0OTVDODA4KSwgKDB4MDUwOTE4QTYpLCAoMHgzQ0U3MzJFOSksCisgICAgKDB4Rjg3MjYyRkMpLCAoMHgwMUI4MTJGMSksICgweDFGQkE0ODQyKSwgKDB4M0U4NkM3RjIpLCAoMHgyNzBEQjM1OCksCisgICAgKDB4RjlEMjI4MzQpLCAoMHg3NEQ0RjQ2OSksICgweDlBNkU4N0QyKSwgKDB4OENCQjBBNTApLCAoMHhDMDc4NEI5MiksCisgICAgKDB4Mjc4REE1ODEpLCAoMHg5MjIxQTdENSksICgweERFODAxQjU0KSwgKDB4NEI1MzFGREEpLCAoMHhDOEI5MUY5MSksCisgICAgKDB4N0E5MERBNDApLCAoMHgyOTY3QTQyOSksICgweDUwQ0MxRDhEKSwgKDB4OUFFOTExMEUpLCAoMHg1MEYyNTBFRSksCisgICAgKDB4RDY5NUIwNzIpLCAoMHhGQzdBNTcxOCksICgweDFGMUEyNkU2KSwgKDB4N0Q1QURENEQpLCAoMHhDODk3ODU5NyksCisgICAgKDB4RUIzMjZEQzMpLCAoMHgzODRFOTgyNCksICgweEMzQjlENzhDKSwgKDB4RDhEMkUyMTQpLCAoMHhFRkZCQjA0OCksCisgICAgKDB4MDBBQjc3MTQpLCAoMHg5RDg5Q0ExMyksICgweEY3MDY4OEQwKSwgKDB4QUREQTNBMzcpLCAoMHg1RkJFNTk0MyksCisgICAgKDB4NEVEOUQ2MTMpLCAoMHg4QTlEQ0M5MyksICgweDE5ODE0MjM2KSwgKDB4MDlBNjhCQ0MpLCAoMHhDRUFDMzNBQyksCisgICAgKDB4MEJBNzBCQjMpLCAoMHgzMjYyNzJFMSksICgweDJBOEM2RDIwKSwgKDB4MjMwODNEMEIpLCAoMHhGQTgwOUMwMiksCisgICAgKDB4NTgyNUM2QzIpLCAoMHgwNjFCNDY5NSksICgweDhEQjk3NzQ4KSwgKDB4NTA3MUU1ODQpLCAoMHgwODc2MDk1OSksCisgICAgKDB4NDRFQThEMDQpLCAoMHg1Q0U2RTJBQSksICgweDAwOUFEMTc2KSwgKDB4QUVDNjRGMTkpLCAoMHhDQUREQTYzMiksCisgICAgKDB4OEQ3OTU0NDUpLCAoMHgxNkUzRUEyNCksICgweEYxMjY0OENBKSwgKDB4RDVDQzM1MEMpLCAoMHg2MTVFQkFENyksCisgICAgKDB4NEU3NjlGQjYpLCAoMHg2QzVFQjM4MCksICgweDVCQjQ2NDI1KSwgKDB4RUFCNkM3N0MpLCAoMHgxMDk0NTQwOCksCisgICAgKDB4QzEyOTFCODYpLCAoMHg5MTNCNzFBNSksICgweDAwM0JBMzI5KSwgKDB4OTE4MTI4NTQpLCAoMHhFMjAwQ0IxMiksCisgICAgKDB4N0E0Njk2QTgpLCAoMHg3NkU1NUQyNSksICgweEQ2RDNDNTc3KSwgKDB4OEIxQjc5QjEpLCAoMHgyOTZCMDRDRCksCisgICAgKDB4QTAyNENDMzUpLCAoMHgzMzQxQTQ3NyksICgweDhFQzEyMzU4KSwgKDB4RjU5ODJCMkYpLCAoMHgzNkYxMjBDOSksCisgICAgKDB4NzlEQkU3OTkpLCAoMHhFRDc0RjA5MiksICgweEExMDMxQUUzKSwgKDB4QjJEOThDNkIpLCAoMHgzNThDQUI3MyksCisgICAgKDB4NDExNTNDMTkpLCAoMHg0NzRENDU0OCksICgweEE3RTgzNEE5KSwgKDB4OTk5NzM4QUUpLCAoMHg1MEYxRkZFOCksCisgICAgKDB4ODg2MTJGODApLCAoMHhGRDkzMUEyMSksICgweDIzODM5QUJEKSwgKDB4QkU2MDQ3MDEpLCAoMHg4MTIyNzRCOSksCisgICAgKDB4NENBOUVBMzIpLCAoMHhFNUYyRDIwNyksICgweEMxQ0Y0NjUzKSwgKDB4NDM1NjFCMjMpLCAoMHg1M0IyRTI3NyksCisgICAgKDB4NEYyQjAwRUMpLCAoMHhGMkIzQkE4MCksICgweEZDNzA4Q0M1KSwgKDB4RTdGNjNGMDApLCAoMHgyNjEyMDM0MiksCisgICAgKDB4MUE0OUM3QTgpLCAoMHhBOTM1MEE3QyksICgweEU1MzBBMDZDKSwgKDB4NUNCOUU1NTApLCAoMHhCMTY3MjkxMyksCisgICAgKDB4NjVGQTc2RjkpLCAoMHhDOUY5MkRDQSksICgweDdENEU5MTk1KSwgKDB4NERCQjgyNjUpLCAoMHgyMDM2RTI2QyksCisgICAgKDB4RURDMDI2RTYpLCAoMHhCOUE2MTdFMCksICgweDY0NjlGMEVFKSwgKDB4RTlEQUFCQjIpLCAoMHgyNjA2MzIxMCksCisgICAgKDB4QUM1NDVERjQpLCAoMHgxMzRFMDM1QSksICgweDIxNkVERTEwKSwgKDB4RUM4MTE1OEQpLCAoMHgxMjJBMkNBRSksCisgICAgKDB4QTI2M0QwRTEpLCAoMHg2Q0ExRkIyOCksICgweEJFMjg3REYwKSwgKDB4NTQ4MTA0RTgpLCAoMHgzNTk4N0Q5MyksCisgICAgKDB4QkMzRTU0OUMpLCAoMHgzQUNFRkQ2NCksICgweDMzNDhDRDkyKSwgKDB4OTE0NDcyRkQpLCAoMHg4MEYyODA5OCksCisgICAgKDB4REYzRkFCQ0QpLCAoMHgyNEQ4NDBBQyksICgweEJBOTUzMjFDKSwgKDB4REMyMTFEMjApLCAoMHgxNTA0MTk0MiksCisgICAgKDB4NjE4NThBQkQpLCAoMHg1NDYwODRBMSksICgweENFREMwN0Y0KSwgKDB4RUFCMkRFMDApLCAoMHgwNDVCQzFFOCksCisgICAgKDB4ODJCMkFFODYpLCAoMHhFNEJGMjgyMyksICgweDlBMDFCNDdBKSwgKDB4MTc2OTQzOEUpLCAoMHgwMTVDNzk4NiksCisgICAgKDB4NUZERkY5N0QpLCAoMHg1RjI4RDYyQyksICgweDgzQzg0QzhDKSwgKDB4REJBQzYwMUEpLCAoMHgxQUUyODQ0RiksCisgICAgKDB4NzlGOURDMUMpLCAoMHgwMUMzQUI1QyksICgweEM5NzFEODM5KSwgKDB4NDRERUEzOTgpLCAoMHhDMEE2NEVBMSksCisgICAgKDB4Mzg3RTI0QTUpLCAoMHgwNjAwRDU5RiksICgweDUxNjlCMzcxKSwgKDB4RUM3ODJCNkIpLCAoMHhGN0ZGNzY5RCksCisgICAgKDB4MzE3QjBBRTgpLCAoMHhFMzM4NDZDNyksICgweDJGRTA1ODQ5KSwgKDB4MDMyNzM4NTMpLCAoMHgyRUQyN0E4OCksCisgICAgKDB4MjRERjQzNDMpLCAoMHhGQjAzQzcwRiksICgweDgyNzgzMjMxKSwgKDB4RDMxQzBEMjkpLCAoMHhBREM1QkQ4QiksCisgICAgKDB4N0QwMjRGMUIpLCAoMHg5MUMxOEQxOSksICgweEE4RUU1OEUyKSwgKDB4NEMyM0E1OUYpLCAoMHhDNjFEQ0E5RiksCisgICAgKDB4MDNCQzkxRUMpLCAoMHg1MTk4NjE0NyksICgweDA1QjhCRTI0KSwgKDB4ODcyQUM5MTgpLCAoMHg4MDUwRjFGRiksCisgICAgKDB4MjE4NDgxMkYpLCAoMHhCMjBEOTQxQSksICgweDkxNDFDQjBDKSwgKDB4RjYwMEEzNDApLCAoMHg4MEU4MkFDMiksCisgICAgKDB4NjYwMjg2MzEpLCAoMHgxMjBGRkE0NSksICgweDg4OUYyNENCKSwgKDB4ODFGMEJCMjcpLCAoMHgzMTAwRDUxQSksCisgICAgKDB4MjMwOUEwQjMpLCAoMHhBRTAwNDcxOCksICgweEFBNTg0QThEKSwgKDB4OTQzMkREMkUpLCAoMHhERDBFOTNGQSksCisgICAgKDB4QzEyOTkzQTYpLCAoMHg2RTI4MDM1RCksICgweDlCRjc3NzJCKSwgKDB4MUQ2MDhDMzIpfTsKIAotc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfNTEyW10gPQotewotKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdGRkQ4ODU5KSwgKDB4RkU2REUyRTApLCAoMHg3RkY2MjE4MSksICgweEZDREJENTQwKSwgKDB4N0ZFOUNCQkUpLCAoMHhGQjQ5RTZBMyksICgweDdGRDg4NzhDKSwgKDB4RjlCODI2ODEpLCAoMHg3RkMyNTU5NSksICgweEY4MjZBNDY0KSwgKDB4N0ZBNzM2QjIpLCAoMHhGNjk1NkZCNyksICgweDdGODcyQkYyKSwgKDB4RjUwNDk4MDApLCAoMHg3RjYyMzY4RCksICgweEYzNzQyQzlEKSwKLSgweDdGMzg1N0Y0KSwgKDB4RjFFNDNEMUMpLCAoMHg3RjA5OTFDMyksICgweEYwNTREOERBKSwgKDB4N0VENUU1QzYpLCAoMHhFRUM2MEYzQyksICgweDdFOUQ1NUZCKSwgKDB4RUQzN0VGOTEpLCAoMHg3RTVGRTQ5MCksICgweEVCQUE4OTQ0KSwgKDB4N0UxRDkzRUEpLCAoMHhFQTFERUJDNiksICgweDdERDY2NjhEKSwgKDB4RTg5MjI2MjEpLCAoMHg3RDhBNUYzQyksICgweEU3MDc0N0I5KSwgKDB4N0QzOTgwRUQpLCAoMHhFNTdENUZFNCksCi0oMHg3Q0UzQ0VCMCksICgweEUzRjQ3RDk1KSwgKDB4N0M4OTRCREEpLCAoMHhFMjZDQjAxMCksICgweDdDMjlGQkVGKSwgKDB4RTBFNjA2OEYpLCAoMHg3QkM1RTI5NiksICgweERGNjA5MDAyKSwgKDB4N0I1RDAzQTEpLCAoMHhERERDNUI0RiksICgweDdBRUY2MzI1KSwgKDB4REM1OTc3OEIpLCAoMHg3QTdEMDU1OSksICgweERBRDdGM0EyKSwgKDB4N0EwNUVFQTgpLCAoMHhEOTU3REU2RiksICgweDc5OEEyM0E4KSwgKDB4RDdEOTQ2QzMpLAotKDB4NzkwOUE5MzUpLCAoMHhENjVDM0I5OCksICgweDc4ODQ4NDE5KSwgKDB4RDRFMENCMjgpLCAoMHg3N0ZBQjk4QSksICgweEQzNjcwNDRGKSwgKDB4Nzc2QzRFRDkpLCAoMHhEMUVFRjU5RCksICgweDc2RDk0OTgzKSwgKDB4RDA3OEFEOTMpLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwgKDB4NzVBNTg1RDkpLCAoMHhDRDkxQUI1NSksICgweDc1MDREMzRDKSwgKDB4Q0MyMTBEOEIpLCAoMHg3NDVGOUREMyksICgweENBQjI2RkIyKSwKLSgweDczQjVFQkNGKSwgKDB4Qzk0NURGRUIpLCAoMHg3MzA3QzNDOSksICgweEM3REI2QzQ1KSwgKDB4NzI1NTJDNzkpLCAoMHhDNjczMjJCOSksICgweDcxOUUyQ0RFKSwgKDB4QzUwRDExNjQpLCAoMHg3MEUyQ0JDRCksICgweEMzQTk0NUExKSwgKDB4NzAyMzEwOUMpLCAoMHhDMjQ3Q0Q2MiksICgweDZGNUYwMkNGKSwgKDB4QzBFOEI2N0UpLCAoMHg2RTk2QTk5NSksICgweEJGOEMwREQ4KSwgKDB4NkRDQTBEMjcpLCAoMHhCRTMxRTFCRiksCi0oMHg2Q0Y5MzRFOCksICgweEJDREEzRUFFKSwgKDB4NkMyNDI5NjkpLCAoMHhCQjg1MzJDMCksICgweDZCNEFGMjU4KSwgKDB4QkEzMkNBNDIpLCAoMHg2QTZEOThBMSksICgweEI4RTMxMzE4KSwgKDB4Njk4QzI0ODcpLCAoMHhCNzk2MTlDNiksICgweDY4QTY5RTcyKSwgKDB4QjY0QkVBQjkpLCAoMHg2N0JEMEZDQyksICgweEI1MDQ5MzgwKSwgKDB4NjZDRjgxMDMpLCAoMHhCM0MwMUZFOSksICgweDY1RERGQkQ2KSwgKDB4QjI3RTlENDMpLAotKDB4NjRFODg5NEEpLCAoMHhCMTQwMTc4QyksICgweDYzRUYzMjg2KSwgKDB4QjAwNDlBQTkpLCAoMHg2MkYyMDFDNCksICgweEFFQ0MzMzhCKSwgKDB4NjFGMTAwMjcpLCAoMHhBRDk2RUQ3NyksICgweDYwRUMzODNBKSwgKDB4QUM2NEQ1MUYpLCAoMHg1RkUzQjM2NiksICgweEFCMzVGNThDKSwgKDB4NUVENzdDODYpLCAoMHhBQTBBNUIyQyksICgweDVEQzc5RDlDKSwgKDB4QThFMjExMkMpLCAoMHg1Q0I0MjBDRCksICgweEE3QkQyMjlBKSwKLSgweDVCOUQxMTY2KSwgKDB4QTY5QjlCN0QpLCAoMHg1QTgyNzk3OCksICgweEE1N0Q4NjQ2KSwgKDB4NTk2NDY0OUIpLCAoMHhBNDYyRUVCMiksICgweDU4NDJERDdFKSwgKDB4QTM0QkRGNEIpLCAoMHg1NzFERUVFRCksICgweEEyMzg2MjdCKSwgKDB4NTVGNUE0RUQpLCAoMHhBMTI4ODM5MSksICgweDU0Q0EwQTJFKSwgKDB4QTAxQzRDNUMpLCAoMHg1MzlCMkFGQiksICgweDlGMTNDN0RDKSwgKDB4NTI2OTEyNDEpLCAoMHg5RTBFRkY5RCksCi0oMHg1MTMzQ0M4RiksICgweDlEMERGRTUyKSwgKDB4NEZGQjY1NzIpLCAoMHg5QzEwQ0Q5MCksICgweDRFQkZFODhGKSwgKDB4OUIxNzc2Q0IpLCAoMHg0RDgxNjJEOCksICgweDlBMjIwNDNGKSwgKDB4NEMzRkRGQ0MpLCAoMHg5OTMwN0VDNSksICgweDRBRkI2QzlCKSwgKDB4OTg0MkYwNDgpLCAoMHg0OUI0MTU2MiksICgweDk3NTk2MUEyKSwgKDB4NDg2OUU2NTcpLCAoMHg5NjczREI4QyksICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLAotKDB4NDVDRDM1NkYpLCAoMHg5NEI1MEQ3NCksICgweDQ0N0FDRDVEKSwgKDB4OTNEQkQ2QUEpLCAoMHg0MzI1QzEwMiksICgweDkzMDZDQUU3KSwgKDB4NDFDRTFFQ0QpLCAoMHg5MjM1RjMyQyksICgweDQwNzNGMjQ1KSwgKDB4OTE2OTU2N0QpLCAoMHgzRjE3NDk5RiksICgweDkwQTBGRDQyKSwgKDB4M0RCODMyNEMpLCAoMHg4RkRDRUYzNyksICgweDNDNTZCQUI1KSwgKDB4OEYxRDM0NjEpLCAoMHgzQUYyRUVCQSksICgweDhFNjFEMzMxKSwKLSgweDM5OENEQ0YzKSwgKDB4OERBQUQzNUQpLCAoMHgzODI0OTQxMyksICgweDhDRjgzQzYyKSwgKDB4MzZCQTIwMzQpLCAoMHg4QzRBMTQ0MCksICgweDM1NEQ5MDMzKSwgKDB4OEJBMDYyMjEpLCAoMHgzM0RFRjIxRiksICgweDhBRkIyQzhFKSwgKDB4MzI2RTU1MDUpLCAoMHg4QTVBN0E0RCksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLCAoMHgyRjg3NTIxNiksICgweDg5MjZCNjVBKSwgKDB4MkUxMTBBQkYpLCAoMHg4ODkzQjE0QSksCi0oMHgyQzk4RkJEMSksICgweDg4MDU0NjgyKSwgKDB4MkIxRjM0QkMpLCAoMHg4NzdCN0JERCksICgweDI5QTNDNDBGKSwgKDB4ODZGNjU2QUMpLCAoMHgyODI2Qjk1RSksICgweDg2NzVEQzYyKSwgKDB4MjZBODIxNzQpLCAoMHg4NUZBMTE0RiksICgweDI1MjgwQzA1KSwgKDB4ODU4MkZBOEMpLCAoMHgyM0E2ODhEMyksICgweDg1MTA5Q0Y3KSwgKDB4MjIyM0E0RDIpLCAoMHg4NEEyRkM2OCksICgweDIwOUY2RkUxKSwgKDB4ODQzQTFENjIpLAotKDB4MUYxOUY5RjApLCAoMHg4M0Q2MDQzMSksICgweDFEOTM1MDExKSwgKDB4ODM3NkI0MkUpLCAoMHgxQzBCODI0RSksICgweDgzMUMzMTRBKSwgKDB4MUE4MjlGQzApLCAoMHg4MkM2N0YwMCksICgweDE4RjhCODg4KSwgKDB4ODI3NUEwRDEpLCAoMHgxNzZERDlFMSksICgweDgyMjk5OTc0KSwgKDB4MTVFMjEzRkQpLCAoMHg4MUUyNkMwQiksICgweDE0NTU3NzFEKSwgKDB4ODFBMDFCODApLCAoMHgxMkM4MTA5MCksICgweDgxNjJBQTBBKSwKLSgweDExMzlGMEE3KSwgKDB4ODEyQTFBMzYpLCAoMHgwRkFCMjZCOSksICgweDgwRjY2RTMwKSwgKDB4MEUxQkMzMjYpLCAoMHg4MEM3QTgxMyksICgweDBDOEJEMzU2KSwgKDB4ODA5REM5NzEpLCAoMHgwQUZCNjdCMiksICgweDgwNzhENDA3KSwgKDB4MDk2QTkwQUIpLCAoMHg4MDU4Qzk1NSksICgweDA3RDk1QkI2KSwgKDB4ODAzREFBNkQpLCAoMHgwNjQ3RDk0OSksICgweDgwMjc3ODcxKSwgKDB4MDRCNjE4REYpLCAoMHg4MDE2MzQzRCksCi0oMHgwMzI0MkFGNiksICgweDgwMDlERTgxKSwgKDB4MDE5MjFEMEMpLCAoMHg4MDAyNzdBNyksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLCAoMHhGRTZERTMzOCksICgweDgwMDI3N0E2KSwgKDB4RkNEQkQ1NEUpLCAoMHg4MDA5REU3RiksICgweEZCNDlFNjY1KSwgKDB4ODAxNjM0NDQpLCAoMHhGOUI4MjZGQiksICgweDgwMjc3ODZFKSwgKDB4RjgyNkE0OEUpLCAoMHg4MDNEQUE2OSksICgweEY2OTU2Rjk5KSwgKDB4ODA1OEM5NTApLAotKDB4RjUwNDk3OTMpLCAoMHg4MDc4RDQxOCksICgweEYzNzQyQ0VFKSwgKDB4ODA5REM5NkIpLCAoMHhGMUU0M0QxRSksICgweDgwQzdBODBDKSwgKDB4RjA1NEQ4OEQpLCAoMHg4MEY2NkU0NyksICgweEVFQzYwRjlEKSwgKDB4ODEyQTFBMkQpLCAoMHhFRDM3RUZCMyksICgweDgxNjJBQTAwKSwgKDB4RUJBQTg5MjcpLCAoMHg4MUEwMUI3NSksICgweEVBMURFQjRBKSwgKDB4ODFFMjZDMkMpLCAoMHhFODkyMjY2MiksICgweDgyMjk5OTY3KSwKLSgweEU3MDc0N0JCKSwgKDB4ODI3NUEwQzMpLCAoMHhFNTdENUY4OSksICgweDgyQzY3RjI3KSwgKDB4RTNGNDdERjUpLCAoMHg4MzFDMzEzQiksICgweEUyNkNCMDMxKSwgKDB4ODM3NkI0MUUpLCAoMHhFMEU2MDY1MyksICgweDgzRDYwNDIwKSwgKDB4REY2MDhGNjkpLCAoMHg4NDNBMUQ5MiksICgweEREREM1QjZGKSwgKDB4ODRBMkZDNTUpLCAoMHhEQzU5Nzc2RSksICgweDg1MTA5Q0U0KSwgKDB4REFEN0YzNDgpLCAoMHg4NTgyRkFDMiksCi0oMHhEOTU3REVDRCksICgweDg1RkExMTNBKSwgKDB4RDdEOTQ2RTMpLCAoMHg4Njc1REM0RCksICgweEQ2NUMzQjQwKSwgKDB4ODZGNjU2RTkpLCAoMHhENEUwQ0I4NCksICgweDg3N0I3QkM2KSwgKDB4RDM2NzA0NkYpLCAoMHg4ODA1NDY2QSksICgweEQxRUVGNTgxKSwgKDB4ODg5M0IxMzIpLCAoMHhEMDc4QUQzQyksICgweDg5MjZCNkEwKSwgKDB4Q0YwNDNBRjgpLCAoMHg4OUJFNTBBOCksICgweENEOTFBQjM5KSwgKDB4OEE1QTdBMzIpLAotKDB4Q0MyMTBEMzUpLCAoMHg4QUZCMkNEQiksICgweENBQjI3MDBCKSwgKDB4OEJBMDYyMDQpLCAoMHhDOTQ1RTAwQSksICgweDhDNEExNDIzKSwgKDB4QzdEQjZDMkEpLCAoMHg4Q0Y4M0M0NCksICgweEM2NzMyMjY1KSwgKDB4OERBQUQzQjIpLCAoMHhDNTBEMTA5RiksICgweDhFNjFEMzg4KSwgKDB4QzNBOTQ2NjkpLCAoMHg4RjFEMzNDOCksICgweEMyNDdDREYwKSwgKDB4OEZEQ0VGMTYpLCAoMHhDMEU4QjY5QyksICgweDkwQTBGRDIxKSwKLSgweEJGOEMwREY2KSwgKDB4OTE2OTU2NUEpLCAoMHhCRTMxRTE2RSksICgweDkyMzVGMzA5KSwgKDB4QkNEQTNFNUUpLCAoMHg5MzA2Q0I0OSksICgweEJCODUzMjA1KSwgKDB4OTNEQkQ3MEUpLCAoMHhCQTMyQ0IzNSksICgweDk0QjUwRDA5KSwgKDB4QjhFMzEzOUUpLCAoMHg5NTkyNjcwNSksICgweEI3OTYxOUUyKSwgKDB4OTY3M0RCNjYpLCAoMHhCNjRCRUFENSksICgweDk3NTk2MTdCKSwgKDB4QjUwNDkzMzQpLCAoMHg5ODQyRjA2QiksCi0oMHhCM0MwMUY5RCksICgweDk5MzA3RjM1KSwgKDB4QjI3RTlDOTIpLCAoMHg5QTIyMDRCMCksICgweEIxNDAxODBDKSwgKDB4OUIxNzc2NTIpLCAoMHhCMDA0OUIyNyksICgweDlDMTBDRDE1KSwgKDB4QUVDQzMzQTUpLCAoMHg5RDBERkUyNyksICgweEFEOTZFRDkxKSwgKDB4OUUwRUZGQzMpLCAoMHhBQzY0RDREOCksICgweDlGMTNDODAzKSwgKDB4QUIzNUY1NDUpLCAoMHhBMDFDNENEOCksICgweEFBMEE1QTg4KSwgKDB4QTEyODg0MEYpLAotKDB4QThFMjExQTIpLCAoMHhBMjM4NjFGNSksICgweEE3QkQyMzEwKSwgKDB4QTM0QkRFQzMpLCAoMHhBNjlCOUI5NiksICgweEE0NjJFRTgyKSwgKDB4QTU3RDg2NUUpLCAoMHhBNTdEODY3MCksICgweEE0NjJFRTcwKSwgKDB4QTY5QjlCQTgpLCAoMHhBMzRCREVCMiksICgweEE3QkQyMzIyKSwgKDB4QTIzODYxRTQpLCAoMHhBOEUyMTFCNSksICgweEExMjg4M0ZFKSwgKDB4QUEwQTVBOUIpLCAoMHhBMDFDNENDNyksICgweEFCMzVGNTU5KSwKLSgweDlGMTNDN0YyKSwgKDB4QUM2NEQ0RUIpLCAoMHg5RTBFRkZCMyksICgweEFEOTZFREE1KSwgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksICgweDlDMTBDRDA1KSwgKDB4QjAwNDlCM0IpLCAoMHg5QjE3NzY0MiksICgweEIxNDAxODIwKSwgKDB4OUEyMjA0QTEpLCAoMHhCMjdFOUNBNiksICgweDk5MzA3RjI2KSwgKDB4QjNDMDFGQjIpLCAoMHg5ODQyRjA1QyksICgweEI1MDQ5MzQ5KSwgKDB4OTc1OTYxNkMpLCAoMHhCNjRCRUFFQSksCi0oMHg5NjczREI1NyksICgweEI3OTYxOUY3KSwgKDB4OTU5MjY2RjcpLCAoMHhCOEUzMTNCNCksICgweDk0QjUwRTEzKSwgKDB4QkEzMkM5OUUpLCAoMHg5M0RCRDcwMCksICgweEJCODUzMjFBKSwgKDB4OTMwNkNCM0MpLCAoMHhCQ0RBM0U3NCksICgweDkyMzVGMkZDKSwgKDB4QkUzMUUxODQpLCAoMHg5MTY5NTY0RCksICgweEJGOEMwRTBDKSwgKDB4OTBBMEZEMTQpLCAoMHhDMEU4QjZCMiksICgweDhGRENFRjA5KSwgKDB4QzI0N0NFMDcpLAotKDB4OEYxRDM0QUQpLCAoMHhDM0E5NDRCQyksICgweDhFNjFEMzdDKSwgKDB4QzUwRDEwQjYpLCAoMHg4REFBRDNBNiksICgweEM2NzMyMjdDKSwgKDB4OENGODNDMzkpLCAoMHhDN0RCNkM0MSksICgweDhDNEExNDE4KSwgKDB4Qzk0NUUwMjEpLCAoMHg4QkEwNjFGOSksICgweENBQjI3MDIyKSwgKDB4OEFGQjJDNjgpLCAoMHhDQzIxMEUzNyksICgweDhBNUE3QThEKSwgKDB4Q0Q5MUFBNjYpLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwKLSgweDg5MjZCNjk3KSwgKDB4RDA3OEFENTMpLCAoMHg4ODkzQjEyOCksICgweEQxRUVGNTk5KSwgKDB4ODgwNTQ2NjEpLCAoMHhEMzY3MDQ4NyksICgweDg3N0I3QkJEKSwgKDB4RDRFMENCOUMpLCAoMHg4NkY2NTY4RSksICgweEQ2NUMzQzRBKSwgKDB4ODY3NURDOTUpLCAoMHhEN0Q5NDYwOCksICgweDg1RkExMTgwKSwgKDB4RDk1N0RERjEpLCAoMHg4NTgyRkFCQiksICgweERBRDdGMzYwKSwgKDB4ODUxMDlDREQpLCAoMHhEQzU5Nzc4NyksCi0oMHg4NEEyRkM0RiksICgweEREREM1Qjg4KSwgKDB4ODQzQTFENEIpLCAoMHhERjYwOTA3QSksICgweDgzRDYwM0RDKSwgKDB4RTBFNjA3NjQpLCAoMHg4Mzc2QjQ1NCksICgweEUyNkNBRjUxKSwgKDB4ODMxQzMxNkQpLCAoMHhFM0Y0N0QxNCksICgweDgyQzY3RjIxKSwgKDB4RTU3RDVGQTIpLCAoMHg4Mjc1QTBCRSksICgweEU3MDc0N0Q0KSwgKDB4ODIyOTk5NjIpLCAoMHhFODkyMjY3QyksICgweDgxRTI2QkZCKSwgKDB4RUExREVDNUYpLAotKDB4ODFBMDFCNDgpLCAoMHhFQkFBOEEzRCksICgweDgxNjJBQTIyKSwgKDB4RUQzN0VFQ0YpLCAoMHg4MTJBMUE0QyksICgweEVFQzYwRUI5KSwgKDB4ODBGNjZFNDQpLCAoMHhGMDU0RDhBNiksICgweDgwQzdBODA5KSwgKDB4RjFFNDNEMzgpLCAoMHg4MDlEQzk2OCksICgweEYzNzQyRDA4KSwgKDB4ODA3OEQzRkYpLCAoMHhGNTA0OThBQiksICgweDgwNThDOTNCKSwgKDB4RjY5NTcwQjIpLCAoMHg4MDNEQUE3NyksICgweEY4MjZBM0E4KSwKLSgweDgwMjc3ODc5KSwgKDB4RjlCODI2MTUpLCAoMHg4MDE2MzQ0MyksICgweEZCNDlFNjdGKSwgKDB4ODAwOURFN0UpLCAoMHhGQ0RCRDU2OCksICgweDgwMDI3N0E2KSwgKDB4RkU2REUzNTIpLCAoMHg0NjUyMjBCQiksICgweEM2NkUxRkZDKSwgKDB4MkM2MUQzNTYpLCAoMHhBRkZCMTc2RCksICgweDg4MDY3RTIzKSwgKDB4Mzc5NkYwMDgpLCAoMHhDOEQxMjhGMyksICgweEI2NjFBNUZBKSwgKDB4RjE5Q0U0RjApLCAoMHgzRjdEMDM0NSksCi0oMHhFOTdFNjAzMCksICgweDRBQkE5MUNGKSwgKDB4REVFREFCMEMpLCAoMHgzNUZEMUQ3NyksICgweERENjM2NDM5KSwgKDB4MkY4Qjc5NEMpLCAoMHg3NjRFMUQzMiksICgweDdBOEQwQjFCKSwgKDB4OEVBQ0IyN0YpLCAoMHg1NzdBRDY3QiksICgweDJCM0ZFMkM1KSwgKDB4OEFDRDAyNEEpLCAoMHhFREY1QzQyQyksICgweEYxQ0E5NTFDKSwgKDB4Qjk4QjZEMDQpLCAoMHg2RDEyQjg2NCksICgweDUwRTc0RDA4KSwgKDB4NzNEMTUwM0IpLAotKDB4QzdEM0Y2QTkpLCAoMHgxRjM2NUU5NyksICgweEUxMzQwRTU5KSwgKDB4ODlEMjFCOUQpLCAoMHg5Qjc1NjczMyksICgweDkwMjRDRDUwKSwgKDB4RTJDN0ZGNTIpLCAoMHhEOUYwNjFFRiksICgweDc3MTUxMzkyKSwgKDB4QTBFNEEwMDQpLCAoMHg2MEJFODIwRiksICgweEM3NjAzQkFGKSwgKDB4QTYyRTNEQTkpLCAoMHhBNDAwRTExRiksICgweDE1NTExMUQ0KSwgKDB4OTAzMEEzNzQpLCAoMHgxNDE4NTEyNCksICgweDhEMDQzQTAwKSwKLSgweDUwOTQ1MjU4KSwgKDB4MjBBNjY1M0UpLCAoMHhBMTlCQThCOSksICgweDNDRkJFNjkyKSwgKDB4OTE0NzFEOTgpLCAoMHgwQjlEMDNGRiksICgweEE1QkE4RTI5KSwgKDB4RkZDOEVCMjIpLCAoMHgxNDJDQjFCMCksICgweDU1MzE3MzE5KSwgKDB4MzNBREM3N0MpLCAoMHhGNjlCQURDRSksICgweDc4NDIzRDNDKSwgKDB4QkU2N0JCRjApLCAoMHg3RDg4QkQxNSksICgweDFFOUVGNjczKSwgKDB4NTEyMDk4QjMpLCAoMHgzMjZBM0QzRCksCi0oMHgxNjFFRjNCNiksICgweDBFNEM0RUQ1KSwgKDB4NEU5Rjk5ODIpLCAoMHhEMEFCNkEzNiksICgweEYxN0REMzc3KSwgKDB4NUU1M0YzMUMpLCAoMHhCRTkxMTJFQSksICgweDNERTFCMEZGKSwgKDB4RDdGMzlBRTcpLCAoMHhBMzRCOTYzNSksICgweDQ5Q0ZFRTZDKSwgKDB4OEEwNjNBQzYpLCAoMHhCQTc5QkMwRCksICgweDZBNTg4NzgyKSwgKDB4NDM5QkU1OTMpLCAoMHgwQTVGN0U4RCksICgweEQyRkMyNTYxKSwgKDB4NDY5OEFDOEYpLAotKDB4MjQ3QzNCQzIpLCAoMHg1ODI2NTIzRCksICgweDREMkJENzUzKSwgKDB4NEI4QkNDMTcpLCAoMHg5Qjc0MzUwMyksICgweDlGODRFNDM0KSwgKDB4OEI5N0I0MUEpLCAoMHgzQ0ZDRTc1RiksICgweDMyRDJENDg3KSwgKDB4M0U4MEI0QUYpLCAoMHg0MkY4QjBFQSksICgweEVDMEM4MUVFKSwgKDB4MTcyNzkzMDkpLCAoMHg2ODFGQTBGMyksICgweDhCQUQyMDhFKSwgKDB4RDExNzkyQzYpLCAoMHhGMUZGMDdCMyksICgweDIxMzM4MDUwKSwKLSgweDhBMUEyMUE0KSwgKDB4RkYwMzU4RDgpLCAoMHg0MTZDMTNDMSksICgweDQ2MzQ4ODU4KSwgKDB4ODM4MjA1MTkpLCAoMHhBQkMwODgyMiksICgweDZBMUE1MjAwKSwgKDB4MEM4MzEyMkEpLCAoMHhBNjdGREYwNiksICgweDA2MjlGOTcwKSwgKDB4RUZBQTI3NDMpLCAoMHgwQzAwQUQ5NSksICgweEZGMDlGNUNGKSwgKDB4Qzc4NERCOEIpLCAoMHhDQjAwQkE3RCksICgweDYyMjA5MDlGKSwgKDB4NzE0OUI3REYpLCAoMHg1QkQzRUJFQyksCi0oMHgwNDg1RUY3MSksICgweDA3RkUyM0IxKSwgKDB4ODA3Mzc2NjgpLCAoMHg0MkEzMjY0NSksICgweEQ2RURCQjE4KSwgKDB4NDA3RTcyQzUpLCAoMHg5MDE0MDJFMCksICgweDBDMUI3OTA1KSwgKDB4MDFDRTExRkMpLCAoMHgwMEM2NDkxNCksICgweDMwMzc5NzhBKSwgKDB4RkFCQzkxOTApLCAoMHg0M0EwQUM4OSksICgweEI5OTk4MzcwKSwgKDB4RDZENjkyMDkpLCAoMHhGMTMyNDU1RSksICgweDlEQUZGNDgyKSwgKDB4QTJENjM1QzIpLAotKDB4QkQ5NzZCNUUpLCAoMHg3OUVEOTNFRCksICgweDdENDJDQTIyKSwgKDB4MkUyM0Y5QzEpLCAoMHhDRjBFNzUyMSksICgweDk2RDg4QUMxKSwgKDB4NDIwQzI4NDUpLCAoMHgxRTE5NTczRCksICgweEY4RkU5Mjc5KSwgKDB4QzE0OTUxMDApLCAoMHgyMDEyNDlDMiksICgweDhCMTgzNzIzKSwgKDB4NDUwNjE1QTUpLCAoMHgwMDRDMDExMiksICgweDg1RUI1MjM1KSwgKDB4MUJEOEJENDgpLCAoMHhBMjkxNEYwMyksICgweDUxNDIwRUFDKSwKLSgweENFNzg4NDcwKSwgKDB4MDUwODAzMEIpLCAoMHhBNENEMkE2QyksICgweDk2MjZDMDYyKSwgKDB4Rjg4RDJERTUpLCAoMHhBOUQ2QjM5OSksICgweEIzQzU3QkZEKSwgKDB4Q0IxRTlDNEMpLCAoMHgwMDRBNTA5NCksICgweEQwQ0JDNDJBKSwgKDB4M0JFMUE2OTQpLCAoMHgzQzM1M0ZBNyksICgweEE1Njk3QzU3KSwgKDB4RkU5NjE2NjUpLCAoMHhFRDZCN0M3RCksICgweDQzM0RDRjhEKSwgKDB4REE3RDZDMjQpLCAoMHg0MDcxMTJDMSksCi0oMHg0QjlEMjg1RCksICgweDZDOUEyRjU3KSwgKDB4MUJGOUZBRUYpLCAoMHg0RUUzRTJFOSksICgweEU1QUU3RTkyKSwgKDB4NjBBMTFEM0YpLCAoMHg0QjQ0MUI2MyksICgweEM4NDE5QkIxKSwgKDB4MkM0RjZEREQpLCAoMHhDRUMzQ0Y2RCksICgweDMyNUE2NUNBKSwgKDB4ODE4RkM2QTQpLCAoMHhDNTVFNUU1QiksICgweDI3NzQ0NUEzKSwgKDB4NkIzMjg5RjcpLCAoMHgwOTE0N0Q1NSksICgweDRGMzc4RDUzKSwgKDB4NTg4QjBEQzgpLAotKDB4RjcwQkEzNDcpLCAoMHhDQkM0M0ZBRSksICgweEQ5OEU2NjM5KSwgKDB4MDdBRjlFRDApLCAoMHhFMkU2MzA1QSksICgweDVFMDAzNTcxKSwgKDB4MTg1MjNFN0EpLCAoMHhGNzBEMUUyNyksICgweEQ3Mjg4OTUwKSwgKDB4MTJDMTExMzIpLCAoMHhGRjFDOUQxNyksICgweDMxODA1MEYxKSwgKDB4MUEyMTk4MjEpLCAoMHhCRjIxOTk4QSksICgweDZDMTNDMUZGKSwgKDB4OEM2MDU4NjEpLCAoMHgwQTE4Mzk1NCksICgweDdCRTRDMUI2KSwKLSgweEEyQ0JDNDEwKSwgKDB4N0NDMDBBNTUpLCAoMHg1RTU4QTk3MyksICgweDExMjJFRjg2KSwgKDB4ODA1NjhFMzkpLCAoMHgyMzEwQzMwMCksICgweDBFMTUyRDBFKSwgKDB4OUUwMTdDMUMpLCAoMHg4NTFERkMyNiksICgweEQxQjFFNjYyKSwgKDB4ODFCQTEwQjApLCAoMHg5NkMyRTk3NyksICgweDg2ODhFNDE5KSwgKDB4OTdDOTQ5ODkpLCAoMHgyNTBENTM1RSksICgweDM1RkRFNzMyKSwgKDB4MTQ3QUQxODMpLCAoMHhDRjlENzVDMCksCi0oMHg2QjJDMTgzQyksICgweDFEMzI2NDg5KSwgKDB4QzA4MDdEOTgpLCAoMHhDMDgxNjIyRSksICgweDE1Qzg3Qjg3KSwgKDB4NzQwNDU5OEMpLCAoMHhGQzNDN0ZBNiksICgweDI4QkE4Q0Y1KSwgKDB4RTMxMUVBOUIpLCAoMHhFQUJGRDRBNSksICgweDg3Njg4MzRBKSwgKDB4MEY3RDc0NDApLCAoMHg0MDU5MzE1MiksICgweENGMUU4QkY1KSwgKDB4RTMyMDE3QjYpLCAoMHgzOUU2NjA3MCksICgweDU2MEVDRTlEKSwgKDB4RjQxMzJDNzcpLAotKDB4NzIyOTQ1QzEpLCAoMHg5NkVDQjVENSksICgweDBDMTAwQzA2KSwgKDB4MzBFOTZDMDIpLCAoMHhFMEIwMTU5QiksICgweDE2M0E0MENCKSwgKDB4MUIyOEI3NTApLCAoMHgxMTQyMEUxMSksICgweDM0REM1OTgxKSwgKDB4RDI3NjlDM0MpLCAoMHg1Njk0MDJEMCksICgweEU0RjE1N0MwKSwgKDB4MTIwREYyNEMpLCAoMHg0MEQ4NjE1MyksICgweDE5NDJDRDExKSwgKDB4MjI0ODRDM0IpLCAoMHg4QjI5OTE0NCksICgweDU4RjFBQUY4KSwKLSgweEIyQ0Q0Nzc3KSwgKDB4NEE1M0FCMDIpLCAoMHg1NUE1REFENCksICgweEM4RDU4RDc5KSwgKDB4NkNBRUMwMTEpLCAoMHgxQzk1NUM4NCksICgweERFMDhBNkM2KSwgKDB4RDQwMkFGN0QpLCAoMHg2OTVFNkZBNCksICgweDREQTg2M0I5KSwgKDB4NTExODA3MEMpLCAoMHg1QTk3RUYxQyksICgweDg4ODBCMzg4KSwgKDB4NEQ1OTZCMkQpLCAoMHgzN0Q3NERDRiksICgweDU4MTM4QjM4KSwgKDB4NUI3QkNENEUpLCAoMHhBRTZDNDQyMiksCi0oMHg0RTVEMUFGMSksICgweERFNzM5NkE1KSwgKDB4QjQ0MkYyMTcpLCAoMHgwREY3QTAwNiksICgweDk2RUVGOEEyKSwgKDB4RTI4NDdCMjYpLCAoMHg2OEI5RjY3QiksICgweDhGRTFGQTY1KSwgKDB4RTBBODdFNTYpLCAoMHgxQkU4RkM0QyksICgweEJCRDY1RjlEKSwgKDB4RTZGMDJDOUQpLCAoMHg4NjdDNkVFQyksICgweDQzRkFCNzI1KSwgKDB4QTQxNDQ0MTkpLCAoMHg2OUJCNkFBRiksICgweENFMjdCNzQ0KSwgKDB4MDIyMjQxQTkpLAotKDB4QzA1REYxNEUpLCAoMHg4MDUwRjFGRiksICgweDIxOEMyMTMxKSwgKDB4QkUyNTk0MUEpLCAoMHg5MDQxQ0QwNiksICgweDFFRThBOUMwKSwgKDB4RDUzMEZFREQpLCAoMHg3NDk1QzgwOCksICgweDA1MDkxOEE2KSwgKDB4M0NFNzMyRTkpLCAoMHhGODcyNjJGQyksICgweDAxQjgxMkYxKSwgKDB4MUZCQTQ4NDIpLCAoMHgzRTg2QzdGMiksICgweDI3MERCMzU4KSwgKDB4RjlEMjI4MzQpLCAoMHg3NEQ0RjQ2OSksICgweDlBNkU4N0QyKSwKLSgweDhDQkIwQTUwKSwgKDB4QzA3ODRCOTIpLCAoMHgyNzhEQTU4MSksICgweDkyMjFBN0Q1KSwgKDB4REU4MDFCNTQpLCAoMHg0QjUzMUZEQSksICgweEM4QjkxRjkxKSwgKDB4N0E5MERBNDApLCAoMHgyOTY3QTQyOSksICgweDUwQ0MxRDhEKSwgKDB4OUFFOTExMEUpLCAoMHg1MEYyNTBFRSksICgweEQ2OTVCMDcyKSwgKDB4RkM3QTU3MTgpLCAoMHgxRjFBMjZFNiksICgweDdENUFERDREKSwgKDB4Qzg5Nzg1OTcpLCAoMHhFQjMyNkRDMyksCi0oMHgzODRFOTgyNCksICgweEMzQjlENzhDKSwgKDB4RDhEMkUyMTQpLCAoMHhFRkZCQjA0OCksICgweDAwQUI3NzE0KSwgKDB4OUQ4OUNBMTMpLCAoMHhGNzA2ODhEMCksICgweEFEREEzQTM3KSwgKDB4NUZCRTU5NDMpLCAoMHg0RUQ5RDYxMyksICgweDhBOURDQzkzKSwgKDB4MTk4MTQyMzYpLCAoMHgwOUE2OEJDQyksICgweENFQUMzM0FDKSwgKDB4MEJBNzBCQjMpLCAoMHgzMjYyNzJFMSksICgweDJBOEM2RDIwKSwgKDB4MjMwODNEMEIpLAotKDB4RkE4MDlDMDIpLCAoMHg1ODI1QzZDMiksICgweDA2MUI0Njk1KSwgKDB4OERCOTc3NDgpLCAoMHg1MDcxRTU4NCksICgweDA4NzYwOTU5KSwgKDB4NDRFQThEMDQpLCAoMHg1Q0U2RTJBQSksICgweDAwOUFEMTc2KSwgKDB4QUVDNjRGMTkpLCAoMHhDQUREQTYzMiksICgweDhENzk1NDQ1KSwgKDB4MTZFM0VBMjQpLCAoMHhGMTI2NDhDQSksICgweEQ1Q0MzNTBDKSwgKDB4NjE1RUJBRDcpLCAoMHg0RTc2OUZCNiksICgweDZDNUVCMzgwKSwKLSgweDVCQjQ2NDI1KSwgKDB4RUFCNkM3N0MpLCAoMHgxMDk0NTQwOCksICgweEMxMjkxQjg2KSwgKDB4OTEzQjcxQTUpLCAoMHgwMDNCQTMyOSksICgweDkxODEyODU0KSwgKDB4RTIwMENCMTIpLCAoMHg3QTQ2OTZBOCksICgweDc2RTU1RDI1KSwgKDB4RDZEM0M1NzcpLCAoMHg4QjFCNzlCMSksICgweDI5NkIwNENEKSwgKDB4QTAyNENDMzUpLCAoMHgzMzQxQTQ3NyksICgweDhFQzEyMzU4KSwgKDB4RjU5ODJCMkYpLCAoMHgzNkYxMjBDOSksCi0oMHg3OURCRTc5OSksICgweEVENzRGMDkyKSwgKDB4QTEwMzFBRTMpLCAoMHhCMkQ5OEM2QiksICgweDM1OENBQjczKSwgKDB4NDExNTNDMTkpLCAoMHg0NzRENDU0OCksICgweEE3RTgzNEE5KSwgKDB4OTk5NzM4QUUpLCAoMHg1MEYxRkZFOCksICgweDg4NjEyRjgwKSwgKDB4RkQ5MzFBMjEpLCAoMHgyMzgzOUFCRCksICgweEJFNjA0NzAxKSwgKDB4ODEyMjc0QjkpLCAoMHg0Q0E5RUEzMiksICgweEU1RjJEMjA3KSwgKDB4QzFDRjQ2NTMpLAotKDB4NDM1NjFCMjMpLCAoMHg1M0IyRTI3NyksICgweDRGMkIwMEVDKSwgKDB4RjJCM0JBODApLCAoMHhGQzcwOENDNSksICgweEU3RjYzRjAwKSwgKDB4MjYxMjAzNDIpLCAoMHgxQTQ5QzdBOCksICgweEE5MzUwQTdDKSwgKDB4RTUzMEEwNkMpLCAoMHg1Q0I5RTU1MCksICgweEIxNjcyOTEzKSwgKDB4NjVGQTc2RjkpLCAoMHhDOUY5MkRDQSksICgweDdENEU5MTk1KSwgKDB4NERCQjgyNjUpLCAoMHgyMDM2RTI2QyksICgweEVEQzAyNkU2KSwKLSgweEI5QTYxN0UwKSwgKDB4NjQ2OUYwRUUpLCAoMHhFOURBQUJCMiksICgweDI2MDYzMjEwKSwgKDB4QUM1NDVERjQpLCAoMHgxMzRFMDM1QSksICgweDIxNkVERTEwKSwgKDB4RUM4MTE1OEQpLCAoMHgxMjJBMkNBRSksICgweEEyNjNEMEUxKSwgKDB4NkNBMUZCMjgpLCAoMHhCRTI4N0RGMCksICgweDU0ODEwNEU4KSwgKDB4MzU5ODdEOTMpLCAoMHhCQzNFNTQ5QyksICgweDNBQ0VGRDY0KSwgKDB4MzM0OENEOTIpLCAoMHg5MTQ0NzJGRCksCi0oMHg4MEYyODA5OCksICgweERGM0ZBQkNEKSwgKDB4MjREODQwQUMpLCAoMHhCQTk1MzIxQyksICgweERDMjExRDIwKSwgKDB4MTUwNDE5NDIpLCAoMHg2MTg1OEFCRCksICgweDU0NjA4NEExKSwgKDB4Q0VEQzA3RjQpLCAoMHhFQUIyREUwMCksICgweDA0NUJDMUU4KSwgKDB4ODJCMkFFODYpLCAoMHhFNEJGMjgyMyksICgweDlBMDFCNDdBKSwgKDB4MTc2OTQzOEUpLCAoMHgwMTVDNzk4NiksICgweDVGREZGOTdEKSwgKDB4NUYyOEQ2MkMpLAotKDB4ODNDODRDOEMpLCAoMHhEQkFDNjAxQSksICgweDFBRTI4NDRGKSwgKDB4NzlGOURDMUMpLCAoMHgwMUMzQUI1QyksICgweEM5NzFEODM5KSwgKDB4NDRERUEzOTgpLCAoMHhDMEE2NEVBMSksICgweDM4N0UyNEE1KSwgKDB4MDYwMEQ1OUYpLCAoMHg1MTY5QjM3MSksICgweEVDNzgyQjZCKSwgKDB4RjdGRjc2OUQpLCAoMHgzMTdCMEFFOCksICgweEUzMzg0NkM3KSwgKDB4MkZFMDU4NDkpLCAoMHgwMzI3Mzg1MyksICgweDJFRDI3QTg4KSwKLSgweDI0REY0MzQzKSwgKDB4RkIwM0M3MEYpLCAoMHg4Mjc4MzIzMSksICgweEQzMUMwRDI5KSwgKDB4QURDNUJEOEIpLCAoMHg3RDAyNEYxQiksICgweDkxQzE4RDE5KSwgKDB4QThFRTU4RTIpLCAoMHg0QzIzQTU5RiksICgweEM2MURDQTlGKSwgKDB4MDNCQzkxRUMpLCAoMHg1MTk4NjE0NyksICgweDA1QjhCRTI0KSwgKDB4ODcyQUM5MTgpLCAoMHg4MDUwRjFGRiksICgweDIxODQ4MTJGKSwgKDB4QjIwRDk0MUEpLCAoMHg5MTQxQ0IwQyksCi0oMHhGNjAwQTM0MCksICgweDgwRTgyQUMyKSwgKDB4NjYwMjg2MzEpLCAoMHgxMjBGRkE0NSksICgweDg4OUYyNENCKSwgKDB4ODFGMEJCMjcpLCAoMHgzMTAwRDUxQSksICgweDIzMDlBMEIzKSwgKDB4QUUwMDQ3MTgpLCAoMHhBQTU4NEE4RCksICgweDk0MzJERDJFKSwgKDB4REQwRTkzRkEpLCAoMHhDMTI5OTNBNiksICgweDZFMjgwMzVEKSwgKDB4OUJGNzc3MkIpLCAoMHgxRDYwOEMzMikKLX07Ci0KLQotc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMTAyNFtdID0KLXsKLSgweDdGRkZGRkZGKSwgKDB4MDAwMDAwMDApLCAoMHg3RkZGNjIxNSksICgweEZGMzZGMDc4KSwgKDB4N0ZGRDg4NTkpLCAoMHhGRTZERTJFMCksICgweDdGRkE3MkQwKSwgKDB4RkRBNEQ5MjkpLCAoMHg3RkY2MjE4MSksICgweEZDREJENTQwKSwgKDB4N0ZGMDk0NzYpLCAoMHhGQzEyRDkxQiksICgweDdGRTlDQkJFKSwgKDB4RkI0OUU2QTMpLCAoMHg3RkUxQzc2QSksICgweEZBODBGRkNFKSwgKDB4N0ZEODg3OEMpLCAoMHhGOUI4MjY4MSksCi0oMHg3RkNFMEMzRCksICgweEY4RUY1Q0JDKSwgKDB4N0ZDMjU1OTUpLCAoMHhGODI2QTQ2NCksICgweDdGQjU2M0IyKSwgKDB4Rjc1REZGNkIpLCAoMHg3RkE3MzZCMiksICgweEY2OTU2RkI3KSwgKDB4N0Y5N0NFQkIpLCAoMHhGNUNDRjczRSksICgweDdGODcyQkYyKSwgKDB4RjUwNDk4MDApLCAoMHg3Rjc1NEU3RSksICgweEY0M0M1M0NCKSwgKDB4N0Y2MjM2OEQpLCAoMHhGMzc0MkM5RCksICgweDdGNERFNDUwKSwgKDB4RjJBQzI0NzMpLAotKDB4N0YzODU3RjQpLCAoMHhGMUU0M0QxQyksICgweDdGMjE5MUIyKSwgKDB4RjExQzc4OTUpLCAoMHg3RjA5OTFDMyksICgweEYwNTREOERBKSwgKDB4N0VGMDU4NjApLCAoMHhFRjhENUZDOCksICgweDdFRDVFNUM2KSwgKDB4RUVDNjBGM0MpLCAoMHg3RUJBM0EzOCksICgweEVERkVFOTMwKSwgKDB4N0U5RDU1RkIpLCAoMHhFRDM3RUY5MSksICgweDdFN0YzOTU0KSwgKDB4RUM3MTI0NEEpLCAoMHg3RTVGRTQ5MCksICgweEVCQUE4OTQ0KSwKLSgweDdFM0Y1ODAwKSwgKDB4RUFFNDIwOEEpLCAoMHg3RTFEOTNFQSksICgweEVBMURFQkM2KSwgKDB4N0RGQTk4QTcpLCAoMHhFOTU3RUQwMCksICgweDdERDY2NjhEKSwgKDB4RTg5MjI2MjEpLCAoMHg3REIwRkRGNSksICgweEU3Q0M5OTEyKSwgKDB4N0Q4QTVGM0MpLCAoMHhFNzA3NDdCOSksICgweDdENjI4QUM3KSwgKDB4RTY0MjM0MUMpLCAoMHg3RDM5ODBFRCksICgweEU1N0Q1RkU0KSwgKDB4N0QwRjQyMTcpLCAoMHhFNEI4Q0QxNiksCi0oMHg3Q0UzQ0VCMCksICgweEUzRjQ3RDk1KSwgKDB4N0NCNzI3MjEpLCAoMHhFMzMwNzM0NyksICgweDdDODk0QkRBKSwgKDB4RTI2Q0IwMTApLCAoMHg3QzVBM0Q1MiksICgweEUxQTkzNUYxKSwgKDB4N0MyOUZCRUYpLCAoMHhFMEU2MDY4RiksICgweDdCRjg4ODMwKSwgKDB4RTAyMzIzRUEpLCAoMHg3QkM1RTI5NiksICgweERGNjA5MDAyKSwgKDB4N0I5MjBCODYpLCAoMHhERTlFNEM1QiksICgweDdCNUQwM0ExKSwgKDB4REREQzVCNEYpLAotKDB4N0IyNkNCNDkpLCAoMHhERDFBQkU0MSksICgweDdBRUY2MzI1KSwgKDB4REM1OTc3OEIpLCAoMHg3QUI2Q0I5QSksICgweERCOTg4ODhFKSwgKDB4N0E3RDA1NTkpLCAoMHhEQUQ3RjNBMiksICgweDdBNDIxMERFKSwgKDB4REExN0JBNjMpLCAoMHg3QTA1RUVBOCksICgweEQ5NTdERTZGKSwgKDB4NzlDODlGNzEpLCAoMHhEODk4NjIxQSksICgweDc5OEEyM0E4KSwgKDB4RDdEOTQ2QzMpLCAoMHg3OTRBN0MxMSksICgweEQ3MUE4RUJBKSwKLSgweDc5MDlBOTM1KSwgKDB4RDY1QzNCOTgpLCAoMHg3OEM3QUI5RSksICgweEQ1OUU0RUY5KSwgKDB4Nzg4NDg0MTkpLCAoMHhENEUwQ0IyOCksICgweDc4NDAzMzIxKSwgKDB4RDQyM0IxODEpLCAoMHg3N0ZBQjk4QSksICgweEQzNjcwNDRGKSwgKDB4NzdCNDE3RDQpLCAoMHhEMkFBQzRFQiksICgweDc3NkM0RUQ5KSwgKDB4RDFFRUY1OUQpLCAoMHg3NzIzNUYzNSksICgweEQxMzM5N0ZBKSwgKDB4NzZEOTQ5ODMpLCAoMHhEMDc4QUQ5MyksCi0oMHg3NjhFMEVBOSksICgweENGQkUzOEFEKSwgKDB4NzY0MUFGMzIpLCAoMHhDRjA0M0E5RSksICgweDc1RjQyQzBCKSwgKDB4Q0U0QUI1QTYpLCAoMHg3NUE1ODVEOSksICgweENEOTFBQjU1KSwgKDB4NzU1NUJENDcpLCAoMHhDQ0Q5MUQzNyksICgweDc1MDREMzRDKSwgKDB4Q0MyMTBEOEIpLCAoMHg3NEIyQzg3QiksICgweENCNjk3REEwKSwgKDB4NzQ1RjlERDMpLCAoMHhDQUIyNkZCMiksICgweDc0MEI1M0VEKSwgKDB4QzlGQkU1MEUpLAotKDB4NzNCNUVCQ0YpLCAoMHhDOTQ1REZFQiksICgweDczNUY2NjJGKSwgKDB4Qzg5MDYxRDEpLCAoMHg3MzA3QzNDOSksICgweEM3REI2QzQ1KSwgKDB4NzJBRjA1QUIpLCAoMHhDNzI3MDE3QSksICgweDcyNTUyQzc5KSwgKDB4QzY3MzIyQjkpLCAoMHg3MUZBMzk0OCksICgweEM1QkZEMjMyKSwgKDB4NzE5RTJDREUpLCAoMHhDNTBEMTE2NCksICgweDcxNDEwODAwKSwgKDB4QzQ1QUUxRDEpLCAoMHg3MEUyQ0JDRCksICgweEMzQTk0NUExKSwKLSgweDcwODM3OEY0KSwgKDB4QzJGODNFMUIpLCAoMHg3MDIzMTA5QyksICgweEMyNDdDRDYyKSwgKDB4NkZDMTkzNzYpLCAoMHhDMTk3RjRCQiksICgweDZGNUYwMkNGKSwgKDB4QzBFOEI2N0UpLCAoMHg2RUZCNUYxRCksICgweEMwM0ExMzdFKSwgKDB4NkU5NkE5OTUpLCAoMHhCRjhDMEREOCksICgweDZFMzBFMzJGKSwgKDB4QkVERUE3M0EpLCAoMHg2RENBMEQyNyksICgweEJFMzFFMUJGKSwgKDB4NkQ2MjI3RkEpLCAoMHhCRDg1QkUzMyksCi0oMHg2Q0Y5MzRFOCksICgweEJDREEzRUFFKSwgKDB4NkM4RjM1MzgpLCAoMHhCQzJGNjU0NCksICgweDZDMjQyOTY5KSwgKDB4QkI4NTMyQzApLCAoMHg2QkI4MTJDNSksICgweEJBREJBOTM0KSwgKDB4NkI0QUYyNTgpLCAoMHhCQTMyQ0E0MiksICgweDZBRENDOTc2KSwgKDB4Qjk4QTk3RjYpLCAoMHg2QTZEOThBMSksICgweEI4RTMxMzE4KSwgKDB4NjlGRDYxMzIpLCAoMHhCODNDM0RCMSksICgweDY5OEMyNDg3KSwgKDB4Qjc5NjE5QzYpLAotKDB4NjkxOUUzMjYpLCAoMHhCNkYwQTgxRCksICgweDY4QTY5RTcyKSwgKDB4QjY0QkVBQjkpLCAoMHg2ODMyNTc4NiksICgweEI1QTdFMzMxKSwgKDB4NjdCRDBGQ0MpLCAoMHhCNTA0OTM4MCksICgweDY3NDZDN0QxKSwgKDB4QjQ2MUZDNkEpLCAoMHg2NkNGODEwMyksICgweEIzQzAxRkU5KSwgKDB4NjY1NzNDRDUpLCAoMHhCMzFFRkZGMCksICgweDY1RERGQkQ2KSwgKDB4QjI3RTlENDMpLCAoMHg2NTYzQkY3RSksICgweEIxREVGOUQyKSwKLSgweDY0RTg4OTRBKSwgKDB4QjE0MDE3OEMpLCAoMHg2NDZDNTlDQyksICgweEIwQTFGNzMwKSwgKDB4NjNFRjMyODYpLCAoMHhCMDA0OUFBOSksICgweDYzNzExNEFCKSwgKDB4QUY2ODAzN0IpLCAoMHg2MkYyMDFDNCksICgweEFFQ0MzMzhCKSwgKDB4NjI3MUZBNjkpLCAoMHhBRTMxMkI5NCksICgweDYxRjEwMDI3KSwgKDB4QUQ5NkVENzcpLCAoMHg2MTZGMTQ4RSksICgweEFDRkQ3QjEzKSwgKDB4NjBFQzM4M0EpLCAoMHhBQzY0RDUxRiksCi0oMHg2MDY4NkNDMCksICgweEFCQ0NGRDc1KSwgKDB4NUZFM0IzNjYpLCAoMHhBQjM1RjU4QyksICgweDVGNUUwREM4KSwgKDB4QUE5RkJGMzgpLCAoMHg1RUQ3N0M4NiksICgweEFBMEE1QjJDKSwgKDB4NUU1MDAxNDApLCAoMHhBOTc1Q0IzOSksICgweDVEQzc5RDlDKSwgKDB4QThFMjExMkMpLCAoMHg1RDNFNTIzRSksICgweEE4NEYyREI0KSwgKDB4NUNCNDIwQ0QpLCAoMHhBN0JEMjI5QSksICgweDVDMjkwQUEwKSwgKDB4QTcyQkYxNDgpLAotKDB4NUI5RDExNjYpLCAoMHhBNjlCOUI3RCksICgweDVCMTAzNUM3KSwgKDB4QTYwQzIxRTgpLCAoMHg1QTgyNzk3OCksICgweEE1N0Q4NjQ2KSwgKDB4NTlGM0RFMzApLCAoMHhBNEVGQ0E1MSksICgweDU5NjQ2NDlCKSwgKDB4QTQ2MkVFQjIpLCAoMHg1OEQ0MEU3NSksICgweEEzRDZGNTFGKSwgKDB4NTg0MkREN0UpLCAoMHhBMzRCREY0QiksICgweDU3QjBEMjY1KSwgKDB4QTJDMUFEREEpLCAoMHg1NzFERUVFRCksICgweEEyMzg2MjdCKSwKLSgweDU2OEEzNDgyKSwgKDB4QTFBRkZFODEpLCAoMHg1NUY1QTRFRCksICgweEExMjg4MzkxKSwgKDB4NTU2MDQwRTIpLCAoMHhBMEExRjI0RiksICgweDU0Q0EwQTJFKSwgKDB4QTAxQzRDNUMpLCAoMHg1NDMzMDJBNSksICgweDlGOTc5MzU2KSwgKDB4NTM5QjJBRkIpLCAoMHg5RjEzQzdEQyksICgweDUzMDI4NTA3KSwgKDB4OUU5MEVCODgpLCAoMHg1MjY5MTI0MSksICgweDlFMEVGRjlEKSwgKDB4NTFDRUQ0ODYpLCAoMHg5RDhFMDVBRCksCi0oMHg1MTMzQ0M4RiksICgweDlEMERGRTUyKSwgKDB4NTA5N0ZDM0MpLCAoMHg5QzhFRUIxQSksICgweDRGRkI2NTcyKSwgKDB4OUMxMENEOTApLCAoMHg0RjVFMDhFQiksICgweDlCOTNBNjQ5KSwgKDB4NEVCRkU4OEYpLCAoMHg5QjE3NzZDQiksICgweDRFMjEwNUU0KSwgKDB4OUE5QzQwNDgpLCAoMHg0RDgxNjJEOCksICgweDlBMjIwNDNGKSwgKDB4NENFMTAwMkIpLCAoMHg5OUE4QzM0MCksICgweDRDM0ZERkNDKSwgKDB4OTkzMDdFQzUpLAotKDB4NEI5RTAzQjEpLCAoMHg5OEI5Mzg0MyksICgweDRBRkI2QzlCKSwgKDB4OTg0MkYwNDgpLCAoMHg0QTU4MUM4MyksICgweDk3Q0RBODQ0KSwgKDB4NDlCNDE1NjIpLCAoMHg5NzU5NjFBMiksICgweDQ5MEY1N0ZGKSwgKDB4OTZFNjFDRUQpLCAoMHg0ODY5RTY1NyksICgweDk2NzNEQjhDKSwgKDB4NDdDM0MyMDIpLCAoMHg5NjAyOUU5OSksICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLCAoMHg0Njc1NjgyNyksICgweDk1MjMzNjlEKSwKLSgweDQ1Q0QzNTZGKSwgKDB4OTRCNTBENzQpLCAoMHg0NTI0NTZFOSksICgweDk0NDdFRDREKSwgKDB4NDQ3QUNENUQpLCAoMHg5M0RCRDZBQSksICgweDQzRDA5QUQ5KSwgKDB4OTM3MENBREEpLCAoMHg0MzI1QzEwMiksICgweDkzMDZDQUU3KSwgKDB4NDI3QTQxN0QpLCAoMHg5MjlERDdENSksICgweDQxQ0UxRUNEKSwgKDB4OTIzNUYzMkMpLCAoMHg0MTIxNThFMyksICgweDkxQ0YxQ0UzKSwgKDB4NDA3M0YyNDUpLCAoMHg5MTY5NTY3RCksCi0oMHgzRkM1RUNBMCksICgweDkxMDRBMEY0KSwgKDB4M0YxNzQ5OUYpLCAoMHg5MEEwRkQ0MiksICgweDNFNjgwQUYzKSwgKDB4OTAzRTZDNUQpLCAoMHgzREI4MzI0QyksICgweDhGRENFRjM3KSwgKDB4M0QwN0MyM0MpLCAoMHg4RjdDODczQSksICgweDNDNTZCQUI1KSwgKDB4OEYxRDM0NjEpLCAoMHgzQkE1MUU0RCksICgweDhFQkVGODEwKSwgKDB4M0FGMkVFQkEpLCAoMHg4RTYxRDMzMSksICgweDNBNDAyREI0KSwgKDB4OEUwNUM2QUEpLAotKDB4Mzk4Q0RDRjMpLCAoMHg4REFBRDM1RCksICgweDM4RDhGRTMyKSwgKDB4OEQ1MEZBMkIpLCAoMHgzODI0OTQxMyksICgweDhDRjgzQzYyKSwgKDB4Mzc2RjlFODgpLCAoMHg4Q0EwOTlGQiksICgweDM2QkEyMDM0KSwgKDB4OEM0QTE0NDApLCAoMHgzNjA0MUFENyksICgweDhCRjRBQzA2KSwgKDB4MzU0RDkwMzMpLCAoMHg4QkEwNjIyMSksICgweDM0OTY4MjBBKSwgKDB4OEI0RDM3NUYpLCAoMHgzM0RFRjIxRiksICgweDhBRkIyQzhFKSwKLSgweDMzMjZFMzIzKSwgKDB4OEFBQTQyRTApLCAoMHgzMjZFNTUwNSksICgweDhBNUE3QTREKSwgKDB4MzFCNTRBNzkpLCAoMHg4QTBCRDQwMyksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLCAoMHgzMDQxQzczNyksICgweDg5NzFGMTRCKSwgKDB4MkY4NzUyMTYpLCAoMHg4OTI2QjY1QSksICgweDJFQ0M2N0FGKSwgKDB4ODhEQ0EwQTkpLCAoMHgyRTExMEFCRiksICgweDg4OTNCMTRBKSwgKDB4MkQ1NTNCMzUpLCAoMHg4ODRCRTgzOCksCi0oMHgyQzk4RkJEMSksICgweDg4MDU0NjgyKSwgKDB4MkJEQzRFNjMpLCAoMHg4N0JGQ0NENSksICgweDJCMUYzNEJDKSwgKDB4ODc3QjdCREQpLCAoMHgyQTYxQjBBRiksICgweDg3Mzg1NDQzKSwgKDB4MjlBM0M0MEYpLCAoMHg4NkY2NTZBQyksICgweDI4RTU3MUEzKSwgKDB4ODZCNTg0MEUpLCAoMHgyODI2Qjk1RSksICgweDg2NzVEQzYyKSwgKDB4Mjc2NzlFMDYpLCAoMHg4NjM3NjA5QSksICgweDI2QTgyMTc0KSwgKDB4ODVGQTExNEYpLAotKDB4MjVFODQ1ODEpLCAoMHg4NUJERUYxOSksICgweDI1MjgwQzA1KSwgKDB4ODU4MkZBOEMpLCAoMHgyNDY3NzdEMCksICgweDg1NDkzNDgyKSwgKDB4MjNBNjg4RDMpLCAoMHg4NTEwOUNGNyksICgweDIyRTU0MUUwKSwgKDB4ODREOTM0QzApLCAoMHgyMjIzQTREMiksICgweDg0QTJGQzY4KSwgKDB4MjE2MUIzODkpLCAoMHg4NDZERjQ3MiksICgweDIwOUY2RkUxKSwgKDB4ODQzQTFENjIpLCAoMHgxRkRDREJCQiksICgweDg0MDc3N0I5KSwKLSgweDFGMTlGOUYwKSwgKDB4ODNENjA0MzEpLCAoMHgxRTU2Q0E2RSksICgweDgzQTVDMkM1KSwgKDB4MUQ5MzUwMTEpLCAoMHg4Mzc2QjQyRSksICgweDFDQ0Y4Q0JCKSwgKDB4ODM0OEQ4REYpLCAoMHgxQzBCODI0RSksICgweDgzMUMzMTRBKSwgKDB4MUI0NzMyQUUpLCAoMHg4MkYwQkREQiksICgweDFBODI5RkMwKSwgKDB4ODJDNjdGMDApLCAoMHgxOUJEQ0M2MyksICgweDgyOUQ3NTUzKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksCi0oMHgxODMzNjcxMCksICgweDgyNEYwMjExKSwgKDB4MTc2REQ5RTEpLCAoMHg4MjI5OTk3NCksICgweDE2QTgxMkUzKSwgKDB4ODIwNTY3NTQpLCAoMHgxNUUyMTNGRCksICgweDgxRTI2QzBCKSwgKDB4MTUxQkRGMTkpLCAoMHg4MUMwQTdGMSksICgweDE0NTU3NzFEKSwgKDB4ODFBMDFCODApLCAoMHgxMzhFREJGOCksICgweDgxODBDNkI2KSwgKDB4MTJDODEwOTApLCAoMHg4MTYyQUEwQSksICgweDEyMDExNkQyKSwgKDB4ODE0NUM1QzgpLAotKDB4MTEzOUYwQTcpLCAoMHg4MTJBMUEzNiksICgweDEwNzI5RkZCKSwgKDB4ODEwRkE3OTgpLCAoMHgwRkFCMjZCOSksICgweDgwRjY2RTMwKSwgKDB4MEVFMzg3Q0QpLCAoMHg4MERFNkU1QSksICgweDBFMUJDMzI2KSwgKDB4ODBDN0E4MTMpLCAoMHgwRDUzREJBRiksICgweDgwQjIxQkI0KSwgKDB4MEM4QkQzNTYpLCAoMHg4MDlEQzk3MSksICgweDBCQzNBQzA3KSwgKDB4ODA4QUIxN0UpLCAoMHgwQUZCNjdCMiksICgweDgwNzhENDA3KSwKLSgweDBBMzMwODQ0KSwgKDB4ODA2ODMxM0IpLCAoMHgwOTZBOTBBQiksICgweDgwNThDOTU1KSwgKDB4MDhBMjAwRDcpLCAoMHg4MDRBOUM1MyksICgweDA3RDk1QkI2KSwgKDB4ODAzREFBNkQpLCAoMHgwNzEwQTMzNyksICgweDgwMzFGM0MzKSwgKDB4MDY0N0Q5NDkpLCAoMHg4MDI3Nzg3MSksICgweDA1N0VGRkRDKSwgKDB4ODAxRTM4OTIpLCAoMHgwNEI2MThERiksICgweDgwMTYzNDNEKSwgKDB4MDNFRDI3NDMpLCAoMHg4MDBGNkI4RCksCi0oMHgwMzI0MkFGNiksICgweDgwMDlERTgxKSwgKDB4MDI1QjI2RTkpLCAoMHg4MDA1OEQzMSksICgweDAxOTIxRDBDKSwgKDB4ODAwMjc3QTcpLCAoMHgwMEM5MEY0RiksICgweDgwMDA5REVCKSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksICgweEZGMzZGMEY1KSwgKDB4ODAwMDlERUIpLCAoMHhGRTZERTMzOCksICgweDgwMDI3N0E2KSwgKDB4RkRBNEQ5NUIpLCAoMHg4MDA1OEQyRiksICgweEZDREJENTRFKSwgKDB4ODAwOURFN0YpLAotKDB4RkMxMkQ5MDIpLCAoMHg4MDBGNkI4QSksICgweEZCNDlFNjY1KSwgKDB4ODAxNjM0NDQpLCAoMHhGQTgwRkY2OSksICgweDgwMUUzODlBKSwgKDB4RjlCODI2RkIpLCAoMHg4MDI3Nzg2RSksICgweEY4RUY1RDBFKSwgKDB4ODAzMUYzQkYpLCAoMHhGODI2QTQ4RSksICgweDgwM0RBQTY5KSwgKDB4Rjc1REZGNkQpLCAoMHg4MDRBOUM0RSksICgweEY2OTU2Rjk5KSwgKDB4ODA1OEM5NTApLCAoMHhGNUNDRjcwMSksICgweDgwNjgzMTRBKSwKLSgweEY1MDQ5NzkzKSwgKDB4ODA3OEQ0MTgpLCAoMHhGNDNDNTQzRCksICgweDgwOEFCMTc3KSwgKDB4RjM3NDJDRUUpLCAoMHg4MDlEQzk2QiksICgweEYyQUMyNDk1KSwgKDB4ODBCMjFCQUQpLCAoMHhGMUU0M0QxRSksICgweDgwQzdBODBDKSwgKDB4RjExQzc4NzcpLCAoMHg4MERFNkU1MiksICgweEYwNTREODhEKSwgKDB4ODBGNjZFNDcpLCAoMHhFRjhENUY0QiksICgweDgxMEZBN0IwKSwgKDB4RUVDNjBGOUQpLCAoMHg4MTJBMUEyRCksCi0oMHhFREZFRTk3MiksICgweDgxNDVDNUJFKSwgKDB4RUQzN0VGQjMpLCAoMHg4MTYyQUEwMCksICgweEVDNzEyNDRDKSwgKDB4ODE4MEM2QUIpLCAoMHhFQkFBODkyNyksICgweDgxQTAxQjc1KSwgKDB4RUFFNDIwMkQpLCAoMHg4MUMwQTgxMCksICgweEVBMURFQjRBKSwgKDB4ODFFMjZDMkMpLCAoMHhFOTU3RUQ2MSksICgweDgyMDU2NzQ4KSwgKDB4RTg5MjI2NjIpLCAoMHg4MjI5OTk2NyksICgweEU3Q0M5OTMzKSwgKDB4ODI0RjAyMDQpLAotKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksICgweEU2NDIzM0UwKSwgKDB4ODI5RDc1NDUpLCAoMHhFNTdENUY4OSksICgweDgyQzY3RjI3KSwgKDB4RTRCOENDOUIpLCAoMHg4MkYwQkUwMyksICgweEUzRjQ3REY1KSwgKDB4ODMxQzMxM0IpLCAoMHhFMzMwNzM4OCksICgweDgzNDhEOEQwKSwgKDB4RTI2Q0IwMzEpLCAoMHg4Mzc2QjQxRSksICgweEUxQTkzNUQ0KSwgKDB4ODNBNUMyQjUpLCAoMHhFMEU2MDY1MyksICgweDgzRDYwNDIwKSwKLSgweEUwMjMyMzhGKSwgKDB4ODQwNzc3RTgpLCAoMHhERjYwOEY2OSksICgweDg0M0ExRDkyKSwgKDB4REU5RTRDQjkpLCAoMHg4NDZERjQ2MCksICgweEREREM1QjZGKSwgKDB4ODRBMkZDNTUpLCAoMHhERDFBQkU2MiksICgweDg0RDkzNEFFKSwgKDB4REM1OTc3NkUpLCAoMHg4NTEwOUNFNCksICgweERCOTg4ODcyKSwgKDB4ODU0OTM0NkUpLCAoMHhEQUQ3RjM0OCksICgweDg1ODJGQUMyKSwgKDB4REExN0JBQzEpLCAoMHg4NUJERUYwNSksCi0oMHhEOTU3REVDRCksICgweDg1RkExMTNBKSwgKDB4RDg5ODYyM0IpLCAoMHg4NjM3NjA4NSksICgweEQ3RDk0NkUzKSwgKDB4ODY3NURDNEQpLCAoMHhENzFBOEU5RCksICgweDg2QjU4M0Y4KSwgKDB4RDY1QzNCNDApLCAoMHg4NkY2NTZFOSksICgweEQ1OUU0RUEwKSwgKDB4ODczODU0ODEpLCAoMHhENEUwQ0I4NCksICgweDg3N0I3QkM2KSwgKDB4RDQyM0IxREQpLCAoMHg4N0JGQ0NCRCksICgweEQzNjcwNDZGKSwgKDB4ODgwNTQ2NkEpLAotKDB4RDJBQUM1MEEpLCAoMHg4ODRCRTgyMCksICgweEQxRUVGNTgxKSwgKDB4ODg5M0IxMzIpLCAoMHhEMTMzOTdBMiksICgweDg4RENBMEVFKSwgKDB4RDA3OEFEM0MpLCAoMHg4OTI2QjZBMCksICgweENGQkUzOTA4KSwgKDB4ODk3MUYxMzIpLCAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4Q0U0QUI1QzYpLCAoMHg4QTBCRDNFOCksICgweENEOTFBQjM5KSwgKDB4OEE1QTdBMzIpLCAoMHhDQ0Q5MUQxQyksICgweDhBQUE0MkM1KSwKLSgweENDMjEwRDM1KSwgKDB4OEFGQjJDREIpLCAoMHhDQjY5N0Q0QiksICgweDhCNEQzN0FDKSwgKDB4Q0FCMjcwMEIpLCAoMHg4QkEwNjIwNCksICgweEM5RkJFNTY3KSwgKDB4OEJGNEFCRTkpLCAoMHhDOTQ1RTAwQSksICgweDhDNEExNDIzKSwgKDB4Qzg5MDYxQjYpLCAoMHg4Q0EwOTlERSksICgweEM3REI2QzJBKSwgKDB4OENGODNDNDQpLCAoMHhDNzI3MDEyNiksICgweDhENTBGQTdGKSwgKDB4QzY3MzIyNjUpLCAoMHg4REFBRDNCMiksCi0oMHhDNUJGRDFBNSksICgweDhFMDVDNkZGKSwgKDB4QzUwRDEwOUYpLCAoMHg4RTYxRDM4OCksICgweEM0NUFFMTBEKSwgKDB4OEVCRUY4NjgpLCAoMHhDM0E5NDY2OSksICgweDhGMUQzM0M4KSwgKDB4QzJGODNFRTEpLCAoMHg4RjdDODZBMCksICgweEMyNDdDREYwKSwgKDB4OEZEQ0VGMTYpLCAoMHhDMTk3RjU0OCksICgweDkwM0U2QzNCKSwgKDB4QzBFOEI2OUMpLCAoMHg5MEEwRkQyMSksICgweEMwM0ExMzlCKSwgKDB4OTEwNEEwRDIpLAotKDB4QkY4QzBERjYpLCAoMHg5MTY5NTY1QSksICgweEJFREVBNzU4KSwgKDB4OTFDRjFDQzApLCAoMHhCRTMxRTE2RSksICgweDkyMzVGMzA5KSwgKDB4QkQ4NUJERTIpLCAoMHg5MjlERDgzNyksICgweEJDREEzRTVFKSwgKDB4OTMwNkNCNDkpLCAoMHhCQzJGNjQ4NyksICgweDkzNzBDQjNEKSwgKDB4QkI4NTMyMDUpLCAoMHg5M0RCRDcwRSksICgweEJBREJBODc5KSwgKDB4OTQ0N0VEQjMpLCAoMHhCQTMyQ0IzNSksICgweDk0QjUwRDA5KSwKLSgweEI5OEE5ODdEKSwgKDB4OTUyMzM2MzEpLCAoMHhCOEUzMTM5RSksICgweDk1OTI2NzA1KSwgKDB4QjgzQzNFMzcpLCAoMHg5NjAyOUU3MyksICgweEI3OTYxOUUyKSwgKDB4OTY3M0RCNjYpLCAoMHhCNkYwQTgzOSksICgweDk2RTYxQ0M2KSwgKDB4QjY0QkVBRDUpLCAoMHg5NzU5NjE3QiksICgweEI1QTdFMzREKSwgKDB4OTdDREE4NjcpLCAoMHhCNTA0OTMzNCksICgweDk4NDJGMDZCKSwgKDB4QjQ2MUZDMUYpLCAoMHg5OEI5Mzg2NiksCi0oMHhCM0MwMUY5RCksICgweDk5MzA3RjM1KSwgKDB4QjMxRUZGM0YpLCAoMHg5OUE4QzNCMCksICgweEIyN0U5QzkyKSwgKDB4OUEyMjA0QjApLCAoMHhCMURFRjkyMiksICgweDlBOUM0MTA5KSwgKDB4QjE0MDE4MEMpLCAoMHg5QjE3NzY1MiksICgweEIwQTFGN0FGKSwgKDB4OUI5M0E1Q0YpLCAoMHhCMDA0OUIyNyksICgweDlDMTBDRDE1KSwgKDB4QUY2ODAzRjkpLCAoMHg5QzhFRUFFRiksICgweEFFQ0MzM0E1KSwgKDB4OUQwREZFMjcpLAotKDB4QUUzMTJCQUUpLCAoMHg5RDhFMDU4MSksICgweEFEOTZFRDkxKSwgKDB4OUUwRUZGQzMpLCAoMHhBQ0ZEN0FDQyksICgweDlFOTBFQkFGKSwgKDB4QUM2NEQ0RDgpLCAoMHg5RjEzQzgwMyksICgweEFCQ0NGRDJFKSwgKDB4OUY5NzkzN0QpLCAoMHhBQjM1RjU0NSksICgweEEwMUM0Q0Q4KSwgKDB4QUE5RkJFOTIpLCAoMHhBMEExRjJDQyksICgweEFBMEE1QTg4KSwgKDB4QTEyODg0MEYpLCAoMHhBOTc1Q0MwRiksICgweEExQUZGREZDKSwKLSgweEE4RTIxMUEyKSwgKDB4QTIzODYxRjUpLCAoMHhBODRGMkUyQSksICgweEEyQzFBRDUzKSwgKDB4QTdCRDIzMTApLCAoMHhBMzRCREVDMyksICgweEE3MkJGMUJDKSwgKDB4QTNENkY0RjApLCAoMHhBNjlCOUI5NiksICgweEE0NjJFRTgyKSwgKDB4QTYwQzIyMDApLCAoMHhBNEVGQ0EyMSksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLCAoMHhBNEVGQ0EwRiksICgweEE2MEMyMjEzKSwgKDB4QTQ2MkVFNzApLCAoMHhBNjlCOUJBOCksCi0oMHhBM0Q2RjRERSksICgweEE3MkJGMUNGKSwgKDB4QTM0QkRFQjIpLCAoMHhBN0JEMjMyMiksICgweEEyQzFBRDQyKSwgKDB4QTg0RjJFM0QpLCAoMHhBMjM4NjFFNCksICgweEE4RTIxMUI1KSwgKDB4QTFBRkZGNDUpLCAoMHhBOTc1Q0FBOSksICgweEExMjg4M0ZFKSwgKDB4QUEwQTVBOUIpLCAoMHhBMEExRjJCQiksICgweEFBOUZCRUE1KSwgKDB4QTAxQzRDQzcpLCAoMHhBQjM1RjU1OSksICgweDlGOTc5MzZDKSwgKDB4QUJDQ0ZENDEpLAotKDB4OUYxM0M3RjIpLCAoMHhBQzY0RDRFQiksICgweDlFOTBFQjlFKSwgKDB4QUNGRDdBREYpLCAoMHg5RTBFRkZCMyksICgweEFEOTZFREE1KSwgKDB4OUQ4RTA1NzEpLCAoMHhBRTMxMkJDMiksICgweDlEMERGRTE2KSwgKDB4QUVDQzMzQjkpLCAoMHg5QzhFRUFERiksICgweEFGNjgwNDBEKSwgKDB4OUMxMENEMDUpLCAoMHhCMDA0OUIzQiksICgweDlCOTNBNUJGKSwgKDB4QjBBMUY3QzMpLCAoMHg5QjE3NzY0MiksICgweEIxNDAxODIwKSwKLSgweDlBOUM0MEY5KSwgKDB4QjFERUY5MzYpLCAoMHg5QTIyMDRBMSksICgweEIyN0U5Q0E2KSwgKDB4OTlBOEMzQTEpLCAoMHhCMzFFRkY1NCksICgweDk5MzA3RjI2KSwgKDB4QjNDMDFGQjIpLCAoMHg5OEI5Mzg1NyksICgweEI0NjFGQzMzKSwgKDB4OTg0MkYwNUMpLCAoMHhCNTA0OTM0OSksICgweDk3Q0RBODU4KSwgKDB4QjVBN0UzNjIpLCAoMHg5NzU5NjE2QyksICgweEI2NEJFQUVBKSwgKDB4OTZFNjFDQjgpLCAoMHhCNkYwQTg0RSksCi0oMHg5NjczREI1NyksICgweEI3OTYxOUY3KSwgKDB4OTYwMjlFNjQpLCAoMHhCODNDM0U0QyksICgweDk1OTI2NkY3KSwgKDB4QjhFMzEzQjQpLCAoMHg5NTIzMzYyMyksICgweEI5OEE5ODkzKSwgKDB4OTRCNTBFMTMpLCAoMHhCQTMyQzk5RSksICgweDk0NDdFREE1KSwgKDB4QkFEQkE4OEYpLCAoMHg5M0RCRDcwMCksICgweEJCODUzMjFBKSwgKDB4OTM3MENCMzApLCAoMHhCQzJGNjQ5RCksICgweDkzMDZDQjNDKSwgKDB4QkNEQTNFNzQpLAotKDB4OTI5REQ4MjkpLCAoMHhCRDg1QkRGOCksICgweDkyMzVGMkZDKSwgKDB4QkUzMUUxODQpLCAoMHg5MUNGMUNCMyksICgweEJFREVBNzZFKSwgKDB4OTE2OTU2NEQpLCAoMHhCRjhDMEUwQyksICgweDkxMDRBMEM1KSwgKDB4QzAzQTEzQjIpLCAoMHg5MEEwRkQxNCksICgweEMwRThCNkIyKSwgKDB4OTAzRTZDMkYpLCAoMHhDMTk3RjU1RiksICgweDhGRENFRjA5KSwgKDB4QzI0N0NFMDcpLCAoMHg4RjdDODY5NCksICgweEMyRjgzRUY4KSwKLSgweDhGMUQzNEFEKSwgKDB4QzNBOTQ0QkMpLCAoMHg4RUJFRjg1QyksICgweEM0NUFFMTIzKSwgKDB4OEU2MUQzN0MpLCAoMHhDNTBEMTBCNiksICgweDhFMDVDNkY0KSwgKDB4QzVCRkQxQkMpLCAoMHg4REFBRDNBNiksICgweEM2NzMyMjdDKSwgKDB4OEQ1MEZBNzMpLCAoMHhDNzI3MDEzRCksICgweDhDRjgzQzM5KSwgKDB4QzdEQjZDNDEpLCAoMHg4Q0EwOTlEMyksICgweEM4OTA2MUNEKSwgKDB4OEM0QTE0MTgpLCAoMHhDOTQ1RTAyMSksCi0oMHg4QkY0QUJERiksICgweEM5RkJFNTdFKSwgKDB4OEJBMDYxRjkpLCAoMHhDQUIyNzAyMiksICgweDhCNEQzNzM4KSwgKDB4Q0I2OTdFNEMpLCAoMHg4QUZCMkM2OCksICgweENDMjEwRTM3KSwgKDB4OEFBQTQyNTQpLCAoMHhDQ0Q5MUUxRSksICgweDhBNUE3QThEKSwgKDB4Q0Q5MUFBNjYpLCAoMHg4QTBCRDQ0MiksICgweENFNEFCNEYxKSwgKDB4ODlCRTUxMDApLCAoMHhDRjA0M0EyNCksICgweDg5NzFGMTg4KSwgKDB4Q0ZCRTM4MzMpLAotKDB4ODkyNkI2OTcpLCAoMHhEMDc4QUQ1MyksICgweDg4RENBMEU0KSwgKDB4RDEzMzk3QkEpLCAoMHg4ODkzQjEyOCksICgweEQxRUVGNTk5KSwgKDB4ODg0QkU4MTcpLCAoMHhEMkFBQzUyMiksICgweDg4MDU0NjYxKSwgKDB4RDM2NzA0ODcpLCAoMHg4N0JGQ0NCNSksICgweEQ0MjNCMUY1KSwgKDB4ODc3QjdCQkQpLCAoMHhENEUwQ0I5QyksICgweDg3Mzg1NDI0KSwgKDB4RDU5RTRGQUEpLCAoMHg4NkY2NTY4RSksICgweEQ2NUMzQzRBKSwKLSgweDg2QjU4MzlFKSwgKDB4RDcxQThGQTgpLCAoMHg4Njc1REM5NSksICgweEQ3RDk0NjA4KSwgKDB4ODYzNzYwQ0MpLCAoMHhEODk4NjE2MCksICgweDg1RkExMTgwKSwgKDB4RDk1N0RERjEpLCAoMHg4NUJERUY0OSksICgweERBMTdCOUU1KSwgKDB4ODU4MkZBQkIpLCAoMHhEQUQ3RjM2MCksICgweDg1NDkzNDY3KSwgKDB4REI5ODg4OEEpLCAoMHg4NTEwOUNERCksICgweERDNTk3Nzg3KSwgKDB4ODREOTM0QTcpLCAoMHhERDFBQkU3QSksCi0oMHg4NEEyRkM0RiksICgweEREREM1Qjg4KSwgKDB4ODQ2REY0NUEpLCAoMHhERTlFNENEMiksICgweDg0M0ExRDRCKSwgKDB4REY2MDkwN0EpLCAoMHg4NDA3NzdBMiksICgweEUwMjMyNEEwKSwgKDB4ODNENjAzREMpLCAoMHhFMEU2MDc2NCksICgweDgzQTVDMkVDKSwgKDB4RTFBOTM0RjQpLCAoMHg4Mzc2QjQ1NCksICgweEUyNkNBRjUxKSwgKDB4ODM0OEQ5MDQpLCAoMHhFMzMwNzJBNyksICgweDgzMUMzMTZEKSwgKDB4RTNGNDdEMTQpLAotKDB4ODJGMEJERkUpLCAoMHhFNEI4Q0NCNCksICgweDgyQzY3RjIxKSwgKDB4RTU3RDVGQTIpLCAoMHg4MjlENzU0MCksICgweEU2NDIzM0Y5KSwgKDB4ODI3NUEwQkUpLCAoMHhFNzA3NDdENCksICgweDgyNEYwMjAwKSwgKDB4RTdDQzk5NEMpLCAoMHg4MjI5OTk2MiksICgweEU4OTIyNjdDKSwgKDB4ODIwNTY3NDMpLCAoMHhFOTU3RUQ3QSksICgweDgxRTI2QkZCKSwgKDB4RUExREVDNUYpLCAoMHg4MUMwQTdFMSksICgweEVBRTQyMTQzKSwKLSgweDgxQTAxQjQ4KSwgKDB4RUJBQThBM0QpLCAoMHg4MTgwQzZDRiksICgweEVDNzEyMzY4KSwgKDB4ODE2MkFBMjIpLCAoMHhFRDM3RUVDRiksICgweDgxNDVDNURGKSwgKDB4RURGRUU4OEUpLCAoMHg4MTJBMUE0QyksICgweEVFQzYwRUI5KSwgKDB4ODEwRkE3QUQpLCAoMHhFRjhENUY2NSksICgweDgwRjY2RTQ0KSwgKDB4RjA1NEQ4QTYpLCAoMHg4MERFNkU0RiksICgweEYxMUM3ODkxKSwgKDB4ODBDN0E4MDkpLCAoMHhGMUU0M0QzOCksCi0oMHg4MEIyMUJBQSksICgweEYyQUMyNEFGKSwgKDB4ODA5REM5NjgpLCAoMHhGMzc0MkQwOCksICgweDgwOEFCMTc1KSwgKDB4RjQzQzU0NTYpLCAoMHg4MDc4RDNGRiksICgweEY1MDQ5OEFCKSwgKDB4ODA2ODMxMzQpLCAoMHhGNUNDRjgxOSksICgweDgwNThDOTNCKSwgKDB4RjY5NTcwQjIpLCAoMHg4MDRBOUM1RSksICgweEY3NURGRTg3KSwgKDB4ODAzREFBNzcpLCAoMHhGODI2QTNBOCksICgweDgwMzFGM0NCKSwgKDB4RjhFRjVDMjgpLAotKDB4ODAyNzc4NzkpLCAoMHhGOUI4MjYxNSksICgweDgwMUUzODk5KSwgKDB4RkE4MEZGODIpLCAoMHg4MDE2MzQ0MyksICgweEZCNDlFNjdGKSwgKDB4ODAwRjZCOEEpLCAoMHhGQzEyRDkxQiksICgweDgwMDlERTdFKSwgKDB4RkNEQkQ1NjgpLCAoMHg4MDA1OEQyRiksICgweEZEQTREOTc1KSwgKDB4ODAwMjc3QTYpLCAoMHhGRTZERTM1MiksICgweDgwMDA5REVBKSwgKDB4RkYzNkYxMEYpLCAoMHg2NTZEQkNDOCksICgweDdBOTEwOENBKSwKLSgweEJBMzY3MEYwKSwgKDB4Njk5MTk1QTIpLCAoMHgxNzJEMkZEMCksICgweEJFMzg2RDUxKSwgKDB4QzRBRUE1MUMpLCAoMHgyQUE3N0Q3RCksICgweDhCNTFEM0I0KSwgKDB4Q0Y0OTBGRDkpLCAoMHg0QTdCRUJDQSksICgweDkxMDcyRTA0KSwgKDB4QTE3NTg3MkQpLCAoMHg1NDQ2NEE5RSksICgweDY3QTZDRDAyKSwgKDB4OUU4MjA0QTgpLCAoMHgxMEMxNEJGNiksICgweDc1QUNEQTE2KSwgKDB4Rjc4RDdCM0UpLCAoMHg2QUIzQ0Y2OSksCi0oMHhBNEQ4Qzc1NiksICgweENCOEZDRDI0KSwgKDB4NzVDQzU3MTMpLCAoMHhDMTNFNUFFMyksICgweEE4QzMxNzZEKSwgKDB4NUVFNkQ0MTYpLCAoMHg4MEM1REEwRSksICgweEQ4NEEwMDdDKSwgKDB4NzE5RTczQzApLCAoMHg3NjUwMTRCMCksICgweDBBMzkxQkM4KSwgKDB4NjBBNzAyMjMpLCAoMHg1NENEQTQ2QiksICgweDQ2MDZENDU1KSwgKDB4QTYwNkZCMkEpLCAoMHhFNENFMTU1NyksICgweDczMjQwODIwKSwgKDB4ODAzN0E4QjQpLAotKDB4QTFEODgwMzIpLCAoMHg3NUEzRjFDNyksICgweDMyQkIwMzcwKSwgKDB4NUY4NTAyNDIpLCAoMHg4NUVDOEY1QiksICgweDhBQTJCMzNDKSwgKDB4OTFCMzcwQzIpLCAoMHg5MzhFOUREQiksICgweEU2QjY5ODNFKSwgKDB4NDk2MDJBQTkpLCAoMHg2QzJEOTk2NSksICgweDVCMTZBRTcyKSwgKDB4Njk1NzlCNkIpLCAoMHhDRDNBQjQxNSksICgweDVCN0NGMDNDKSwgKDB4RDdCMjc2MzcpLCAoMHgyRDY5Qjc5QSksICgweDMyMzdCNDY4KSwKLSgweDVGOTRENjUwKSwgKDB4QUIzNzEwNkQpLCAoMHgwQjgzMTQ1NyksICgweEFGRDgwMzM0KSwgKDB4QjVBMEIyN0IpLCAoMHgxNkI3NjNFOSksICgweDNCNDU0NzU2KSwgKDB4MzE2N0NEOTgpLCAoMHg3MDcyMzlBRiksICgweDBBNEYxMzJBKSwgKDB4Mjc4MkM4Q0EpLCAoMHgxQUMxREQ0RSksICgweDEyMUNBREZFKSwgKDB4OUE5MTFEOTApLCAoMHgwMTU3QURENiksICgweDE1NTlCQjk1KSwgKDB4Mjg1NEM4NEEpLCAoMHhEOTdFMzY4NSksCi0oMHg3NjMwOEFBMCksICgweDgwNTBGMUZGKSwgKDB4MjE4MDYxMkYpLCAoMHhGRkZCOEExQSksICgweDBCQzFGRkZGKSwgKDB4MTAzMjg0NkMpLCAoMHgwMDJBMzBDMiksICgweDY1NEM1OEYyKSwgKDB4QTU4QUJBQ0MpLCAoMHhDM0U5ODMxQyksICgweDI3NTMxQjhDKSwgKDB4QURCQjg2OTgpLCAoMHgwNjgwMUMxMiksICgweEFGQUVFQzhFKSwgKDB4QzMyNjkyOTEpLCAoMHg1QzJFMDFBMCksICgweDRBNjEwODdDKSwgKDB4NjBGMjFFN0IpLAotKDB4NkI5MkM2NzApLCAoMHhDOTg3MjM2NCksICgweDQ4NDY0Qzk3KSwgKDB4MzQyRTY0OTkpLCAoMHhBNjg0OUE0OCksICgweEYwMzQwMDJEKSwgKDB4NDQyQjQ0ODgpLCAoMHgxNjBCMDQ0MiksICgweEVENTJDRjUwKSwgKDB4NEQ0MzZDMDUpLCAoMHg2ODQxQzYwMiksICgweEExNEY4QTgyKSwgKDB4OUFDMjBEREUpLCAoMHg1QjkyNTFFRSksICgweDhFRDk5OEQ1KSwgKDB4OTJCNkVBMjIpLCAoMHg1QjEzNkM0QiksICgweDk3QzBBNDVCKSwKLSgweDQ1OUM5NEE0KSwgKDB4Q0Q5NTgzQzApLCAoMHg2QzU4OURGOCksICgweDNDOUExN0NEKSwgKDB4OTA2NjAxQkYpLCAoMHg4NEQ2MTJFMSksICgweDY3MTc2RjVGKSwgKDB4RTQ3RDVBNDQpLCAoMHgzNzM4NkQ1RSksICgweDkyQTRENjFCKSwgKDB4MjhDNTEzRkIpLCAoMHg2RTkxNTk5QSksICgweDY1M0RBMTZEKSwgKDB4QTE5QzM5QzApLCAoMHg0Mjc2OTBBRCksICgweDcwMDU0NjFDKSwgKDB4QUI2QzFFRTQpLCAoMHg4MEJBQ0MyRCksCi0oMHg3ODBBMThDNSksICgweDgyMkRDNzc0KSwgKDB4QjYwNDMwMzYpLCAoMHgwMDc4OUMxOCksICgweDEwNkM5NTA3KSwgKDB4NDEwM0E4NjQpLCAoMHhDNTExNTg1QiksICgweEYzRTlCN0Y4KSwgKDB4MjRENzlDNEQpLCAoMHgzMUIyMEVCNSksICgweEIxQzA0ODNFKSwgKDB4RTI1QzU2QjkpLCAoMHg5Njk5MTA5NiksICgweDdDRDQxMjFGKSwgKDB4OEEzQjgzRjQpLCAoMHg3MDQyNzFDMiksICgweEI1QzI2QUNDKSwgKDB4MkIxMzFBRjApLAotKDB4NTQ5Q0IxNkMpLCAoMHg3NDY0OUU2OSksICgweEQ4RDQ4QURFKSwgKDB4MTI1M0FFREQpLCAoMHg4MDQxMEZEMiksICgweDVCMzY4ODlEKSwgKDB4ODgwQ0UxRTcpLCAoMHg1NkM0OThFNyksICgweEZBMkJBQUIyKSwgKDB4RDQxNTRGNUMpLCAoMHg3OTUxNkVFRCksICgweEE0MkZEQTdEKSwgKDB4Mjc4RDI4NzMpLCAoMHgxOTEyMTUzNSksICgweDlDNkVDNkM3KSwgKDB4NDAyMzQwQ0IpLCAoMHg1QTZBMzJCMyksICgweEU0MzQ1RjI3KSwKLSgweDhEQzJEOTAxKSwgKDB4MDJFN0Y4OEUpLCAoMHg3QjNDNkJFQiksICgweEUwOTQ2QTRGKSwgKDB4OTQ1Mjg4NkMpLCAoMHhGRjJGNjE4NyksICgweDJGODA1MEYxKSwgKDB4MkEyMTdDNjEpLCAoMHgwQUIyMTU5NCksICgweDgwMTE0NUM0KSwgKDB4MUNGMjAwQTUpLCAoMHg4MkM1NDRGMSksICgweENGM0M1MEIwKSwgKDB4RDU3N0ZFRjcpLCAoMHg2MEFEM0M2RSksICgweDkxQUZGNzlFKSwgKDB4MDcwNzIzQjMpLCAoMHg1ODcwRUNGNiksCi0oMHg2NEMyMjRFMiksICgweDI0RkIxRUM4KSwgKDB4QzM0ODEwNDgpLCAoMHgxNTFBQkYzQyksICgweDEzNkFDMjE5KSwgKDB4NDcxNkNFRDEpLCAoMHhDOEI4Q0U0RSksICgweDFEMTY4MjEwKSwgKDB4OTIzMzRBODEpLCAoMHg5MERDOTEwQyksICgweDQ5QTAwMjIwKSwgKDB4RTVGMkM4MzEpLCAoMHhCNjdEQzc4NSksICgweDNDNDk1MTc0KSwgKDB4MEQxRjRDMkEpLCAoMHgzQUQ3ODdGRCksICgweEU5QzlGQjI3KSwgKDB4N0RGQzI3MTMpLAotKDB4RUIzOUM0QjMpLCAoMHg5NkY3NUYxOCksICgweDg4M0NDQzQ3KSwgKDB4OTEzOTBCRDEpLCAoMHgwRUUyNUY2RCksICgweDZCNjg4RUYwKSwgKDB4MkM4NTU3REMpLCAoMHhFODBDOTE3MiksICgweERFNjNERTA2KSwgKDB4M0UxQjcwN0IpLCAoMHhCMkNGMkU3NiksICgweDQ5MEQxREYzKSwgKDB4Q0QxQjUxRTEpLCAoMHhDMjI4RjBGOSksICgweEVFRTJBMDBBKSwgKDB4MDgxRDgzNEEpLCAoMHgxRDJDMTQwMyksICgweDA4M0ZFOTQwKSwKLSgweDc2MTRFREEwKSwgKDB4ODI4MjA5NUEpLCAoMHhBN0MwODgyMSksICgweDRDRDQ3RDIwKSwgKDB4MzIyOTkxOTEpLCAoMHg1MkEwMzBFNiksICgweERGN0NCNzZFKSwgKDB4MjMyRUQ0NEIpLCAoMHg4REFBMTUwQSksICgweDFCNTkzQzUxKSwgKDB4NDQ5Q0JBODIpLCAoMHhBQkU2RDNDNCksICgweENDRjZGNUMzKSwgKDB4OTA2NEMxQzIpLCAoMHgwMzFGRjU5QyksICgweDQxNTlGRTRFKSwgKDB4NDIxNDgyQzApLCAoMHgyMEY2RjAwQSksCi0oMHhCODY2Q0E0OSksICgweDc1QTY2RkFBKSwgKDB4NTQ1MzUxNUYpLCAoMHhCNTQ1RDQ4NiksICgweDg4NUQ5NDkzKSwgKDB4RUVDNEVFQjQpLCAoMHg4OEY5Qzg5MyksICgweEJCQUEzOEI0KSwgKDB4NUE1N0JBODMpLCAoMHgxMkU4NDhDQyksICgweDJGQjYyMTYwKSwgKDB4ODQwQTFBNTQpLCAoMHgyQTdBRURENiksICgweDg5QUYyREJEKSwgKDB4QzhCQUFFMkUpLCAoMHg1NkVFQkQ3NSksICgweEU1OTVCODZEKSwgKDB4RUVCMTIzQzYpLAotKDB4M0Y5NEVCQzEpLCAoMHg3OENGQkVFMiksICgweENGOTAxRjExKSwgKDB4NUEzNUEzNTApLCAoMHhEQTIyQ0I1OCksICgweEJFNEI4Mjg3KSwgKDB4MjVFMDc4QzApLCAoMHgyQkQ0RjBEMyksICgweDZBNDY0Qjk5KSwgKDB4NDg4NEIxNTYpLCAoMHhGMUZGNzYzMCksICgweEMxMzI4MDUwKSwgKDB4RDg0QzIxNkMpLCAoMHg4NEE0RDk0MiksICgweDIxNTdBMEEwKSwgKDB4RjMwQTE0MTIpLCAoMHg1NEFGNjAxMSksICgweDAwRDcwNTQyKSwKLSgweEJEQUJFN0RCKSwgKDB4MUZGMzUzNEMpLCAoMHhEODY3MkI0RSksICgweDdCRTNCQjNBKSwgKDB4QzU1OTU1NDApLCAoMHgxNjFFMUJGRiksICgweEQ0MzcyMzA5KSwgKDB4N0JDMkVENTIpLCAoMHhDMUM2MzZFRCksICgweDRERDMyQUE0KSwgKDB4ODYxNjMyNDYpLCAoMHg2MTRFRjY4OCksICgweDRFQjQ0MjcwKSwgKDB4ODhFRDA3N0MpLCAoMHgyRjIyOTQ2NiksICgweDFBNTg1MjAxKSwgKDB4NjVCQjJFRTIpLCAoMHhEQkFEQTBERCksCi0oMHhFNTA5OTVDQiksICgweENBMUUyNzYwKSwgKDB4NTgzRkQ4MUYpLCAoMHhFNDhENDg1OSksICgweEMyMDA2MTUyKSwgKDB4OEYxRjc3MEMpLCAoMHgyN0NBQTg2RiksICgweDk2MTBCODQ1KSwgKDB4RkMyNUJDRTMpLCAoMHgzN0I4QjM5RiksICgweDEwRENDREQxKSwgKDB4RDU3QTRDQUIpLCAoMHg3RDU0M0RFOCksICgweDZGNDVCOTU4KSwgKDB4MTJGMEI5NzkpLCAoMHg4MThFNzlGOSksICgweEI0QjJCMDFGKSwgKDB4RjMwMzU5MDEpLAotKDB4MzcyRjdCRDkpLCAoMHg1RDU5MkU2NyksICgweERCNUE1NTJGKSwgKDB4NkU2MUU2MjUpLCAoMHg0RThBNkE0MiksICgweDI0NThBREI4KSwgKDB4NUYxMjUyOEMpLCAoMHgyNzJCM0FERSksICgweERFNjY2QTgzKSwgKDB4N0YxOENGRDcpLCAoMHgyRjg3N0REOCksICgweEQ3M0ZGRkI2KSwgKDB4Nzk4Njc5NTYpLCAoMHg0RTA1RkNBRCksICgweDE5RTc4RUVFKSwgKDB4RTFCQTY1MTIpLCAoMHg5OUY2RjA5MSksICgweDkxNjkwNTE2KSwKLSgweDE2QUU0MDQxKSwgKDB4MDRCOTY4MDUpLCAoMHg3Q0EwNTJGQyksICgweEE0RDA1RUZEKSwgKDB4NDEzRDFGMDQpLCAoMHg1M0U5MUNDMCksICgweDZGODdBMDgyKSwgKDB4NjA0RkQyMDIpLCAoMHgwQjM2OEQ5RiksICgweEQ1RjIyRTVDKSwgKDB4MkJFNUE3NEUpLCAoMHgyRjY5RUFERSksICgweDhCRTUzN0UxKSwgKDB4OTY5NzU3ODkpLCAoMHgzNjc1QTNBMCksICgweDBBMjcyQjcxKSwgKDB4NzU0QjFENjEpLCAoMHg5ODYwMDU4MSksCi0oMHg2NTlBMkJFMyksICgweEIyMUJFRjU0KSwgKDB4RjI2MzUxQjApLCAoMHgxQzU5OTU3MyksICgweDZCNDIzQjU5KSwgKDB4RUEzNzFDOTYpLCAoMHhDOUJEQTQ5OSksICgweERERjI1RjM3KSwgKDB4RkJDQUM0QUQpLCAoMHg0MENBNzg4QiksICgweDEzQkMzOTgxKSwgKDB4NDE3NkRBNTgpLCAoMHhEODQ4REE3NCksICgweDk0NzQwNjQyKSwgKDB4NTRGRDU0NzkpLCAoMHg3MTUwMjM2MiksICgweDI1RTgxQ0Y5KSwgKDB4NTMyNDk1NjIpLAotKDB4NTI4MTQ4MjcpLCAoMHg1NURDNUYyQyksICgweDg4MjVCQzUwKSwgKDB4OEU0RDA0RDkpLCAoMHg4MDUwRjFGRiksICgweDIxMkNDMTNFKSwgKDB4MDBDMEQ4NEMpLCAoMHgwNzcxMTAwMyksICgweDQwNkE1RjQ1KSwgKDB4RUQwQTk4REUpLCAoMHg4QTYxOTczMSksICgweDc5NkEzQjA0KSwgKDB4N0VBRUNGNzEpLCAoMHg3REYzREFCRSksICgweDJCMEZGQjRBKSwgKDB4QkE4QTNGQjgpLCAoMHg2MjAyRjhGMiksICgweDYzMkMzN0IyKSwKLSgweDIwNTI3MUFBKSwgKDB4QkExQzQzOEMpLCAoMHhBQTFDMTE4MiksICgweEU2NDQyQTY1KSwgKDB4RDczNkUwNDMpLCAoMHg5NTcxNUM1QyksICgweDNENjA0QzI4KSwgKDB4RDIxRDBENzQpLCAoMHhBMUZCMEMyMSksICgweENFOEYwNjVEKSwgKDB4QjhCMzY0NjMpLCAoMHg3Rjc4OEMzMyksICgweDg0QUI1M0E1KSwgKDB4NEIzM0FGNDYpLCAoMHg0MEMyNzM2QSksICgweDBENjU3MUI3KSwgKDB4RkM4RDgyOTIpLCAoMHg5RDFDNTE4MiksCi0oMHhGN0I2NzBFMiksICgweEJCMkI5RTkxKSwgKDB4MTM3ODUxRDUpLCAoMHhCQ0Y4N0NBOCksICgweEUwODJBN0E2KSwgKDB4NTAyNDA0RTUpLCAoMHg1MDI1QTZFMCksICgweDI1NDk0RUE2KSwgKDB4NUE2QThBMTQpLCAoMHhFMzAxQTY4OSksICgweDcwQ0JFRTZCKSwgKDB4QzgwNjQ0QzEpLCAoMHhFOTkxNENFNiksICgweDk0ODFGMUU2KSwgKDB4QjlFNERBMzQpLCAoMHg1ODRCMUVEOCksICgweEFDQzM5NjQ4KSwgKDB4MzFFRkNENjIpLAotKDB4MDdDODJBRTkpLCAoMHhFRTlEOTBFNSksICgweDU5QkFFQzc1KSwgKDB4NDAxNzhCMEUpLCAoMHg5RkRDMUM5QyksICgweEYzQTY0ODhGKSwgKDB4NEI2QzEzNjcpLCAoMHg5RjdERjEwOSksICgweENCREY4RURGKSwgKDB4QkE3NkVEMzMpLCAoMHhGMTVEQkI5RiksICgweEQ0OEExOTdGKSwgKDB4RjExRTc1RUUpLCAoMHhBNzZCNDc5QiksICgweDcwNkRFNzhCKSwgKDB4NjU1OUFDNjUpLCAoMHhDMDEzQzE4MiksICgweDQ2MUU5M0M3KSwKLSgweEE5ODlFQUYxKSwgKDB4NTk0NDhDMDApLCAoMHg3MjFGQUMzOCksICgweDU0NkRFQTc5KSwgKDB4MjIzRjY3QzApLCAoMHg1NDM0NjQ3QyksICgweEIzRUY0RjBBKSwgKDB4RDRGQUYxRjEpLCAoMHgwQkQ0RTM4QSksICgweEZGNjE1MjdFKSwgKDB4RDZFQTVERDIpLCAoMHg2NDRDNzEwNSksICgweDMxQUUyMTg5KSwgKDB4MTFFQzBBMUEpLCAoMHgxOEIzQUQ4MCksICgweDQ3RDBFODBBKSwgKDB4NzczRDhCQjIpLCAoMHhFRkE2NzQ3RSksCi0oMHhGMjNERThCMCksICgweDAyNkJCMUU3KSwgKDB4MDNDMTQwNjApLCAoMHhDMTk5N0RGNyksICgweDk1OTg2QjlDKSwgKDB4OEE1RDYxNzApLCAoMHg1NERCM0E1NiksICgweDIyOTYxRDQxKSwgKDB4NDY4MTM0NzEpLCAoMHhBQkVEMTZBNCksICgweEQxRjgzRThDKSwgKDB4MjU5NEFDQUMpLCAoMHgxRDU1NjBFQSksICgweDA0MzJFRkY0KSwgKDB4QTM4OUQ3RTgpLCAoMHhBRkU5MkM2MiksICgweEZCQkFGMUU3KSwgKDB4NDJEMEQwQTEpLAotKDB4QTJDM0VDQjIpLCAoMHg2MDNERDYzNSksICgweEVCQkM1OTE1KSwgKDB4NUIwQzdDRTApLCAoMHg4RDAzNjQwQyksICgweDIyRTI5OERCKSwgKDB4MzhDRTNCREMpLCAoMHgyMUU2QjZCNCksICgweEM5NzQyQzNGKSwgKDB4NEJERjc0NDgpLCAoMHhCQUQwOUQwMCksICgweEVENkE4Mzk3KSwgKDB4RjZGODAwMUEpLCAoMHgzMUUzNTkxRSksICgweEFFQzM3RUZFKSwgKDB4MjJEOUFEMDYpLCAoMHg1RTI1NEFFQyksICgweEQ4NTJEMzJFKSwKLSgweEUxQzk2OEFFKSwgKDB4QTNDM0MyNjUpLCAoMHhENjdCRDc4QSksICgweEYxRkY5RDhDKSwgKDB4QzAzQTgwNTApLCAoMHg4NDdBMjFGQyksICgweDgxMEVEQTVEKSwgKDB4NjM4MDg5NTEpLCAoMHhDOEZFOUU5RSksICgweEZCNkREM0U1KSwgKDB4NzdCRDdBMDMpLCAoMHg2REMxNDY3NyksICgweEZGODFEODMxKSwgKDB4NDMyMDExMDApLCAoMHhBNzhFMTZGRSksICgweDM5M0NEMEEwKSwgKDB4NTE0RjZEREQpLCAoMHg0MjdCQTRCQyksCi0oMHhFQkU3QTY3NiksICgweEI3NzE2MzlCKSwgKDB4OERBQkI5RTcpLCAoMHg4MTJGQTVBRCksICgweDNGMTAyMTIwKSwgKDB4NjBFNDI0NTQpLCAoMHhFRkZCRkZDNSksICgweEJFQjFENUREKSwgKDB4N0E1OURERkQpLCAoMHhFODk2OEQ3QSksICgweDhBQUQzNDYyKSwgKDB4QUI2NTMyN0QpLCAoMHgwQ0YyRUNGQiksICgweEZBMzI0OUE0KSwgKDB4OTdGQzNBNDIpLCAoMHgzMTRBNzA4OSksICgweDI5OTFFNkRDKSwgKDB4QTk4NjkzQzQpLAotKDB4NjVFQjIwMTEpLCAoMHhDQjREODU5NCksICgweDFBQUZGMTRFKSwgKDB4MUQwRDA0OTIpLCAoMHgyRTVBNzg0RCksICgweEFFNEVDNzM4KSwgKDB4RjE2RDY2N0EpLCAoMHhCMEMyNjAzMCksICgweEFEQTNERkM5KSwgKDB4NEVEODc0RTUpLCAoMHhENDQxQTZBRSksICgweDE5RTNBQzA1KSwgKDB4QzZCODY1REMpLCAoMHhFOEU0Mjg1QSksICgweDk5MjQ4QzJCKSwgKDB4QzI5ODExMjIpLCAoMHgxQjAxNDI4OCksICgweDQ0MkEwNTgwKSwKLSgweDg0QTBBMUMxKSwgKDB4MjE2RjAyNDgpLCAoMHgyMDJFNTYwMiksICgweEVBRUJBQUNBKSwgKDB4REQ1QUJFRTcpLCAoMHg4QjlDNEI0MyksICgweDVENUQ0NkQ3KSwgKDB4OEZCRTdDMUQpLCAoMHg2RjlDQUI4NyksICgweEIwQUIwQUFFKSwgKDB4OThCQzc5MzYpLCAoMHhGMjUxQjkxMSksICgweDQ0NjlGMkQxKSwgKDB4QTkwOTkwODgpLCAoMHhEMjE5QkQ2NiksICgweDc0OTBBRTIyKSwgKDB4QkMwQTk4MjApLCAoMHgxMTlEMDEzNiksCi0oMHg4NTkyNjYxQyksICgweDI2MEMwRDE4KSwgKDB4QjlBMUM1QjEpLCAoMHhBNjg1OTFFNCksICgweEZDQkQ0RjI5KSwgKDB4NTk2NUEzQzcpLCAoMHg3RDFFRDY2NCksICgweDlCRERFRUUzKSwgKDB4OTIyMzdENUEpLCAoMHhCNzMzMkRBNiksICgweEVBNTYzMkU1KSwgKDB4OUJGRTE2MjQpLCAoMHg2QTJCQjE4QSksICgweDhDMERENzJDKSwgKDB4NEYzMTlGNTYpLCAoMHhFRThCNUIwMyksICgweDYwOTY3QkM4KSwgKDB4QjQ5MThGNzUpLAotKDB4RjI5NUQ1RjYpLCAoMHg2NTJBRDgwRCksICgweDBDQ0U5NTUyKSwgKDB4MEJDQUEwQTYpLCAoMHgzQ0YyRDI4RSksICgweDE4NTM5NTZFKSwgKDB4N0IzOERFQUEpLCAoMHhFQUFCOTcwQiksICgweDY0MDg2RDFGKSwgKDB4M0U3NjQ1REQpLCAoMHg5ODZGMTM0MiksICgweEJCQjBFMTg4KSwgKDB4N0Q2RDU2NDIpLCAoMHg2ODIxODI3RCksICgweEZDQkM0NzI5KSwgKDB4M0QxMTRGQjkpLCAoMHgyRDI1NDJFNSksICgweDY1NENDMUYwKSwKLSgweDA0RjFCNzVFKSwgKDB4MjkwQjU0QUYpLCAoMHg3RDc5QUIxQSksICgweEYzNEUzMUEyKSwgKDB4NzNBOUYzMDApLCAoMHg3QUJDQTg5RSksICgweEI1NkRBOTc0KSwgKDB4Q0FDREIwN0MpLCAoMHg0RUUxQURENCksICgweEVGODU5QjM0KSwgKDB4ODlGNDdCNDcpLCAoMHg1MTVDMTU1QSksICgweDM4RDA2NzU3KSwgKDB4ODA1MEYxRkYpLCAoMHgyMUM4RTAzQSksICgweEIxNTU4NDFBKSwgKDB4MzA3MTY2ODUpLCAoMHgwQTJCNDhBQyksCi0oMHg3MDQxQzQwQSksICgweDEwNEM0NEQwKSwgKDB4MUY1MUI2MTgpLCAoMHhGMEQ0RjM5QiksICgweEZDQUVCQTUyKSwgKDB4MzBFQTYyQ0QpLCAoMHhBMjk0Qjc3MiksICgweDIyMUUwNDE3KSwgKDB4QUE4RUYxOTIpLCAoMHgzRTU2OEM3OCksICgweEQzODZFRjlBKSwgKDB4MTNCNTRGQjEpLCAoMHg4NDgxOEVDMyksICgweEI4NzY2OUY4KSwgKDB4Q0Q5MDU2NUEpLCAoMHg3M0Q3Qzg3NiksICgweEQ2MTkxNTEyKSwgKDB4QUMyMjg3MDQpLAotKDB4QTc3ODVENDgpLCAoMHgxN0NGMzRERCksICgweDhBRjVBQjQwKSwgKDB4MzY1QzZBRkEpLCAoMHgxN0RGRDU5RSksICgweEI5MjRDMjZFKSwgKDB4RTlERTU4NDQpLCAoMHgzRENERENEOSksICgweENEQTJERkI0KSwgKDB4OEE1QjUzNEUpLCAoMHhBMkQ5REFDQSksICgweDExNjc5NTY5KSwgKDB4QUVGNkU3RTkpLCAoMHhDOUQyNDE3QyksICgweDUxNURDOUMzKSwgKDB4MTU3QTVCMTIpLCAoMHg0Qzk2MERENiksICgweEQ0MTNDQzAxKSwKLSgweDY1MzE5NTQ1KSwgKDB4NkNGMTMwOUQpLCAoMHgwMDAzMzhDNyksICgweDQ2MEFBN0ZDKSwgKDB4QzFGQTQ0NDApLCAoMHgwRTNBRTA0OCksICgweEY0QjIxMkI1KSwgKDB4Qzc4OTVEMkIpLCAoMHg2NzZBRkFGMyksICgweEVGNDA0Rjc1KSwgKDB4QkZDREIxN0MpLCAoMHhBMzdGRTZDNiksICgweDIwMTIzREQ1KSwgKDB4RUU5NkJEM0IpLCAoMHgzRUI4QTYyRSksICgweDA2ODg0NUUxKSwgKDB4QzQ5NjAyMTYpLCAoMHg3QkIxMUQ4RCksCi0oMHgyRDY1NzQ2NyksICgweEZDNkZBQ0M1KSwgKDB4QzIxQUFEMzEpLCAoMHg2NDI3NDVGNCksICgweDQ1MDdFMTM5KSwgKDB4RjczNjlEQzkpLCAoMHg2MTk4QURFQiksICgweDYzQjk4QjEwKSwgKDB4REVFNTg1QUIpLCAoMHhBMzhFRkZBQyksICgweDMwQUUxRTQxKSwgKDB4ODIwNjY3QTkpLCAoMHg2Qjc3QTAwNyksICgweDI0MDA0MEE3KSwgKDB4Qjc3QTdEOTUpLCAoMHgyMDg4OTNDQSksICgweDA4NUI0NjEwKSwgKDB4MTQyMzQ4NTQpLAotKDB4QUMwMjI3ODYpLCAoMHgyRDU3MzQ2RiksICgweEI2NEExQTY3KSwgKDB4NjA1RDQ1QjIpLCAoMHhFMDUxQzAwMSksICgweDkxNzZDMTFEKSwgKDB4MjNCQkU5NDUpLCAoMHgyQzAzRTI2QSksICgweEMyODExQkFEKSwgKDB4MUREODE0RDQpLCAoMHgzQzY3NEI2OCksICgweDI4RUMzM0M3KSwgKDB4RDlFREU1RTQpLCAoMHg1QzQ2QzI0OCksICgweDQwOTg4OThGKSwgKDB4NUJBOTYyODApLCAoMHhFRkY3N0I5MSksICgweDMzMzJDQTVCKSwKLSgweDY2MUNBRjZCKSwgKDB4NkUwRDU2NEUpLCAoMHhCNzBEMDg2MyksICgweDI0MDI4NUMwKSwgKDB4QkJCRDNFQTcpLCAoMHhDQTJFNTY4RCksICgweEQxRDNGNjEyKSwgKDB4QzkxNjExNUUpLCAoMHhCN0ZDMEE2QyksICgweDE5NjFBRTlBKSwgKDB4QjVERjM5NjUpLCAoMHhDMUI5NTA2NSksICgweDg5RTI5NjY1KSwgKDB4M0YyOUZCRUQpLCAoMHgzRjFCRUQ3MyksICgweEMxNTVCRTFEKSwgKDB4NzI1NkFFNEMpLCAoMHg0QTU5Nzk3QiksCi0oMHg2MDA5RDEzQiksICgweDkxODUwMzg1KSwgKDB4RTQ1NDU5MjApLCAoMHgxNUVDQ0RBMSksICgweEZGQzdCQTIwKSwgKDB4MkI4MDUwRjEpLCAoMHgxQTIxRDRDMCksICgweDMwMDhCRTg5KSwgKDB4NkMwRkYzMTcpLCAoMHg3NDQ0RDg1MiksICgweDA1ODQxNDExKSwgKDB4ODRDODAwMjIpLCAoMHgwN0M2MzBFMCksICgweDdFNkY4RkEzKSwgKDB4RjNCREYzQzcpLCAoMHg0QzU1REZGNyksICgweEUwQjFDOEQxKSwgKDB4QzNGNUNGNEQpLAotKDB4MUMyMkE4MzYpLCAoMHhCMjlEMzMxNSksICgweEQ0OTY2NTQxKSwgKDB4NDVDODU4MDApLCAoMHhBRDhEQkQ0NiksICgweDJDMTlDRkFBKSwgKDB4NTQwRkE2NzQpLCAoMHhDM0M5MTNEOCksICgweEQyMTgzNzUzKSwgKDB4Q0I5RkNGMjYpLCAoMHg4MzQ2RkM4OSksICgweEEzNDA4MDc4KSwgKDB4Q0ZEODRDQzEpLCAoMHhGNTgwRjAzNSksICgweDdGRDA2N0E3KSwgKDB4ODdFN0ZDQjgpLCAoMHgwOUMwOTQwNiksICgweEREQkIzMTMxKSwKLSgweEZGNzlGRkUxKSwgKDB4RUFGQkVFRjEpLCAoMHhCNjYwQkNFOCksICgweDk5ODk5QzMxKSwgKDB4OUZFQjIyQzEpLCAoMHhDNzVFRjY4RiksICgweDEzODAwQjk5KSwgKDB4Q0Q3RjMxMDApLCAoMHgwOTUwMkFEQyksICgweDEwMUUwMEU4KSwgKDB4NDA2Q0I5NDUpLCAoMHg4MjBBMUIyQiksICgweDY4QTBCMDgyKSwgKDB4MEMxQjE4NjQpLCAoMHhCMzY5MDM1NCksICgweDYzQzVCNUEzKSwgKDB4NTM1RUI0QzgpLCAoMHhGN0Q4NjkxOCksCi0oMHhEMUJBNThGQyksICgweEY0MjkxMEZBKSwgKDB4RkJEQjE5MjkpLCAoMHhDN0MwQzJBNCksICgweEQyMDc0NzUyKSwgKDB4Qjk2ODAzQjQpLCAoMHg4NDA2NUUzOCksICgweDgxOUFGNDhFKSwgKDB4RTk4NjRGRjMpLCAoMHhBNkU0MUQwRSksICgweDUwRTc0NDJCKSwgKDB4Qzc1NzREN0IpLCAoMHgxOTZCNkFCMyksICgweDA0MUQ1ODU0KSwgKDB4NjI5MTYyRDMpLCAoMHgwNDI3MTNFMCksICgweDlBRTMxMjk3KSwgKDB4NEIyRjRFMzYpLAotKDB4Q0I4Q0UwRTApLCAoMHhCMkYwNjgyQSksICgweEFCMzNENkY1KSwgKDB4MkY1M0Q4MkUpLCAoMHg2NkE0MzgxNSksICgweDQ0MzNBQUE4KSwgKDB4ODJFQTBFRDUpLCAoMHg0NTc4NzZGMiksICgweEQzMEJEMzZDKSwgKDB4OEQ0OUQyOEMpLCAoMHgwRTY4MjYwRSksICgweEQwNTY1MTJDKSwgKDB4N0I4NkRCMTEpLCAoMHg2NDYzMzY2MSksICgweDgyNjVGRjI1KSwgKDB4NkQyQjcxNDgpLCAoMHg1MjlEQTBEOCksICgweEJDMTgwMDE3KSwKLSgweDE5QUI4MDNCKSwgKDB4ODNGMDAwMjApLCAoMHg1MEYxRkYwNyksICgweEQ0QzAyRDgwKSwgKDB4RkM4ODFBMjEpLCAoMHhDMUJGMDEwMCksICgweDU4NDE2ODBCKSwgKDB4MTAzQjJDQzApLCAoMHhCMDQyQzI4QSksICgweDIzMjRFOEE4KSwgKDB4MzE1MzE0MzApLCAoMHhFRjcxREQwRSksICgweDdDMUI5RDhFKSwgKDB4MDk5OEMyMjgpLCAoMHhEOUVDNjU0OCksICgweDhFRUY4NDQ4KSwgKDB4MEM1NjFDQUYpLCAoMHg0QkEzOURGRCksCi0oMHg1ODk0N0ZFMiksICgweDk1OUIxMkEyKSwgKDB4NkQ1MkVBRUMpLCAoMHgxRDk1RERENSksICgweDMxMEMyMjJCKSwgKDB4NjM2MzRCMTgpLCAoMHg0REU2QzVCOCksICgweDUyNkM5MTA2KSwgKDB4NDlCNUU4Q0MpLCAoMHhDM0MzMzAwNCksICgweDYwNUNEMjg3KSwgKDB4MDlBNjM5MEMpLCAoMHgzNTBDMzNCQyksICgweDk1MzA1MENDKSwgKDB4OTYwNTUyQTMpLCAoMHg1NEYwMTE4NiksICgweDBFOEQ3Q0ZFKSwgKDB4NDU5QTAwMjIpLAotKDB4QzM1NzY5NjYpLCAoMHhCMEQ2RjZFOCksICgweEI4RjEzQUFDKSwgKDB4RTQ0MDAzNEMpLCAoMHgzNjExODg1MSksICgweEY1MUJFNzI3KSwgKDB4MkUxNjg5QTApLCAoMHhFODJDQ0Y1NSksICgweDZERjRFM0NCKSwgKDB4RUE2NjU2NjMpLCAoMHhDMkU1M0Q2RiksICgweDlEQzFGMDZCKSwgKDB4RkNDMkU4NzgpLCAoMHg0MjkyRDE2MiksICgweDQ4NDBDNDMzKSwgKDB4QjYxOERCNDMpLCAoMHgwNjA5MkMxNSksICgweDUwMDEzNEMxKSwKLSgweEE2REI4OTU1KSwgKDB4RDVFOEE1QkIpLCAoMHgxNDJCNzgyOSksICgweDc1RjQyOTM5KSwgKDB4MEVCRjREMTApLCAoMHgxQTJCMDc4QyksICgweDdDMkE1QTQ2KSwgKDB4M0VBMUI5QTcpLCAoMHgzMUFBQzg5OCksICgweDEzMjdCODUyKSwgKDB4Mjc3QzY1QTEpLCAoMHg1MjgwQ0UyNyksICgweEZGNTEyMjEzKSwgKDB4MzlCNDdFQkYpLCAoMHgxNTRDQTAwMCksICgweDEwNkU3REEyKSwgKDB4QUZBNEM5MjUpLCAoMHhDNDhDRTM3OSksCi0oMHhBQjJFNDU3MyksICgweDVFNDRCOEZEKSwgKDB4RUNEMkE0MjQpLCAoMHg4QzUzMDBBQSksICgweEU0MjVBMTgwKSwgKDB4NkQ1RDBEM0IpLCAoMHhBNzA1NDBBOCksICgweEY4RUNGNDMyKSwgKDB4ODg0Njk2QjApLCAoMHhCNzk3NTVCRiksICgweDYyQ0FENDE5KSwgKDB4NEJCQjM4QjYpLCAoMHhDRDVDNzlENyksICgweDgyRDRFMjlCKSwgKDB4NkRENDhFOTEpLCAoMHhBMTI4QTNBOSksICgweEYyRUQ2NzI2KSwgKDB4MzM5QTYzRjYpLAotKDB4MzVENkY0RUEpLCAoMHg4REM4QjQ5MSksICgweENBMDREMDlDKSwgKDB4RkYwNzRGRDApLCAoMHgyRDgwNTBGMSksICgweDFBMjFEODgwKSwgKDB4MTkwMEZFODgpLCAoMHg2QzA5RDFCRiksICgweDU2NDgzMDAxKSwgKDB4QzIwQTFBMjkpLCAoMHg0NDkxODBBMyksICgweDAyOEM1MTYwKSwgKDB4NzVGQUVDREQpLCAoMHg2MjUwNzA1QiksICgweDg5RUEwMTBBKSwgKDB4N0I5Rjk4NTEpLCAoMHg5RDZDNTk5NCksICgweDg2MDJDM0U0KSwKLSgweDAzRDBFODYzKSwgKDB4MDQzMjIyNTEpLCAoMHgxMTYwOTVCNyksICgweDc4OTI3NkNBKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDk3OCksICgweDgwMDBDNjg4KSwgKDB4ODAwMEJDRDgpLCAoMHg4MDAxMDAwMCksICgweDlGQzNGN0I4KSwgKDB4REU0N0JDMUIpLCAoMHhFNjBGQjRGOCksICgweEVBMjc0NjlEKSwgKDB4Q0NBMUU2NkQpLCAoMHg4RkZGNzAxMCksICgweDgwMDBCQ0Q4KSwgKDB4MDAwMDAwRDApLCAoMHg4MDAwQjRCMCksCi0oMHg4RkZGRkIyNCksICgweDlGQzNGN0I4KSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwQjQxOCksICgweDhGRkY3MDEwKSwgKDB4ODAwMEM2ODgpLCAoMHgwMDAwMDBEMCksICgweDlGQzNGRDNDKSwgKDB4RDYyNUY4QzApLCAoMHg0NzhEODMyQSksICgweEY2OTNEOTIyKSwgKDB4MzYxN0Q4MTYpLCAoMHg4MDAwMDY0OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDMpLCAoMHgwMDAwMDAxMiksICgweDlGQzQ5OTY0KSwgKDB4NDYxNDE5MjQpLAotKDB4NEQ4MzQyMDUpLCAoMHgxNkI3OTlBNiksICgweEEzOTQ5NEE2KSwgKDB4Q0NGMjNDNjApLCAoMHgwMDAwMDAwMSksICgweDlGQzQ3NDY4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDA3MiksICgweDAwMDA4MDAxKSwgKDB4OEZGRkZCNTgpLCAoMHgwMDAwMDAwMyksICgweDQwMkM3NDEzKSwgKDB4MDAwMDAwMTYpLCAoMHg0MDJDNzQxMyksICgweDlGQzQ4NDk4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMiksICgweDAwMDAwMDAxKSwKLSgweDAwMDAwMDcyKSwgKDB4OUZDNDc4M0MpLCAoMHg4MDAwQzY5MCksICgweDAzNThDREQ1KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwODAwMSksICgweDAwMDAwMDcyKSwgKDB4ODAwMDA2NDgpLCAoMHgwMDAwMDAwMCksICgweDAwMDA4MDAxKSwgKDB4ODAwMEJENDApLCAoMHgxQTE5RjhEOCksICgweDAwMDA4MDAxKSwgKDB4ODAwMDAzQzApLCAoMHgwMDAwMDAwMyksICgweDlGQzQyOENDKSwgKDB4RjYxOTIwMTUpLCAoMHhGQkI3N0Y5MiksCi0oMHg4RjJDOEJGQyksICgweDNDMzkxOTIzKSwgKDB4NDAxNDQyOEMpLCAoMHgxNDAwNDVBRSksICgweEZGRkQyQkI2KSwgKDB4MkQ4MDUwRjEpLCAoMHg4MDAwQkQ0MCksICgweDAwMDAwMDAzKSwgKDB4MDAwMDAwMDApLCAoMHgyQ0MwNTgxMSksICgweDAwMDA4MDAxKSwgKDB4ODAwMDAzQzApLCAoMHg4MDAwMDY0OCksICgweDgwMDAwNjQ4KSwgKDB4OUZDNDIwNkMpLCAoMHg4RkZGRkQ3OCksICgweDhGRkZGRUVDKSwgKDB4ODAwMEM2NjgpLAotKDB4ODAwMDA2NDgpLCAoMHg4RkZGRkQ3OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDMwNDApLCAoMHg4MDAwRkZDMCksICgweDgwMDBCQ0Q4KSwgKDB4ODAwMTAwMDApLCAoMHg5RkMzRjdCOCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDJDQzApLCAoMHg4MDAxMzM0MCksICgweDgwMDBCQ0Q4KSwgKDB4ODAwMTBGRDApLCAoMHg4MDAxMjU0OCkKLX07Ci0KLS8vc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMjA0OFtdID0KLS8vewotLy8oMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0ZGRkQ4ODQpLCAoMHhGRjlCNzgxRCksICgweDdGRkY2MjE1KSwgKDB4RkYzNkYwNzgpLCAoMHg3RkZFOUNCMSksICgweEZFRDI2OTUwKSwgKDB4N0ZGRDg4NTkpLCAoMHhGRTZERTJFMCksICgweDdGRkMyNTBFKSwgKDB4RkUwOTVENkEpLCAoMHg3RkZBNzJEMCksICgweEZEQTREOTI5KSwgKDB4N0ZGODcxQTApLCAoMHhGRDQwNTY1RCksICgweDdGRjYyMTgxKSwgKDB4RkNEQkQ1NDApLAotLy8oMHg3RkYzODI3MiksICgweEZDNzc1NjE3KSwgKDB4N0ZGMDk0NzYpLCAoMHhGQzEyRDkxQiksICgweDdGRUQ1NzhGKSwgKDB4RkJBRTVFOEMpLCAoMHg3RkU5Q0JCRSksICgweEZCNDlFNkEzKSwgKDB4N0ZFNUYxMDcpLCAoMHhGQUU1NzFBMiksICgweDdGRTFDNzZBKSwgKDB4RkE4MEZGQ0UpLCAoMHg3RkRENEVFQiksICgweEZBMUM5MTU3KSwgKDB4N0ZEODg3OEMpLCAoMHhGOUI4MjY4MSksICgweDdGRDM3MTUxKSwgKDB4Rjk1M0JGOTQpLAotLy8oMHg3RkNFMEMzRCksICgweEY4RUY1Q0JDKSwgKDB4N0ZDODU4NTIpLCAoMHhGODhBRkUzRiksICgweDdGQzI1NTk1KSwgKDB4RjgyNkE0NjQpLCAoMHg3RkJDMDQwOSksICgweEY3QzI0RjYxKSwgKDB4N0ZCNTYzQjIpLCAoMHhGNzVERkY2QiksICgweDdGQUU3NDkzKSwgKDB4RjZGOUI0QzgpLCAoMHg3RkE3MzZCMiksICgweEY2OTU2RkI3KSwgKDB4N0Y5RkFBMTMpLCAoMHhGNjMxMzA3NCksICgweDdGOTdDRUJCKSwgKDB4RjVDQ0Y3M0UpLAotLy8oMHg3RjhGQTRBRiksICgweEY1NjhDNDYzKSwgKDB4N0Y4NzJCRjIpLCAoMHhGNTA0OTgwMCksICgweDdGN0U2NDhCKSwgKDB4RjRBMDcyNjQpLCAoMHg3Rjc1NEU3RSksICgweEY0M0M1M0NCKSwgKDB4N0Y2QkU5RDMpLCAoMHhGM0Q4M0M3NCksICgweDdGNjIzNjhEKSwgKDB4RjM3NDJDOUQpLCAoMHg3RjU4MzRCNiksICgweEYzMTAyNDkyKSwgKDB4N0Y0REU0NTApLCAoMHhGMkFDMjQ3MyksICgweDdGNDM0NTYyKSwgKDB4RjI0ODJDOEQpLAotLy8oMHg3RjM4NTdGNCksICgweEYxRTQzRDFDKSwgKDB4N0YyRDFDMEMpLCAoMHhGMTgwNTY2MCksICgweDdGMjE5MUIyKSwgKDB4RjExQzc4OTUpLCAoMHg3RjE1QjhFRCksICgweEYwQjhBNDA5KSwgKDB4N0YwOTkxQzMpLCAoMHhGMDU0RDhEQSksICgweDdFRkQxQzNCKSwgKDB4RUZGMTE3NTUpLCAoMHg3RUYwNTg2MCksICgweEVGOEQ1RkM4KSwgKDB4N0VFMzQ2MzQpLCAoMHhFRjI5QjI0MSksICgweDdFRDVFNUM2KSwgKDB4RUVDNjBGM0MpLAotLy8oMHg3RUM4MzcxNyksICgweEVFNjI3NkI3KSwgKDB4N0VCQTNBMzgpLCAoMHhFREZFRTkzMCksICgweDdFQUJFRjI5KSwgKDB4RUQ5QjY2QTUpLCAoMHg3RTlENTVGQiksICgweEVEMzdFRjkxKSwgKDB4N0U4RTZFQjIpLCAoMHhFQ0Q0ODQxNCksICgweDdFN0YzOTU0KSwgKDB4RUM3MTI0NEEpLCAoMHg3RTZGQjVGNCksICgweEVDMEREMEIwKSwgKDB4N0U1RkU0OTApLCAoMHhFQkFBODk0NCksICgweDdFNEZDNTNEKSwgKDB4RUI0NzRFODMpLAotLy8oMHg3RTNGNTgwMCksICgweEVBRTQyMDhBKSwgKDB4N0UyRTlDREQpLCAoMHhFQTgwRkY3NyksICgweDdFMUQ5M0VBKSwgKDB4RUExREVCQzYpLCAoMHg3RTBDM0QyNiksICgweEU5QkFFNTc1KSwgKDB4N0RGQTk4QTcpLCAoMHhFOTU3RUQwMCksICgweDdERThBNjZDKSwgKDB4RThGNTAyNjYpLCAoMHg3REQ2NjY4RCksICgweEU4OTIyNjIxKSwgKDB4N0RDM0Q5MEUpLCAoMHhFODJGNTg1MSksICgweDdEQjBGREY1KSwgKDB4RTdDQzk5MTIpLAotLy8oMHg3RDlERDU1QSksICgweEU3NjlFOEUwKSwgKDB4N0Q4QTVGM0MpLCAoMHhFNzA3NDdCOSksICgweDdENzY5QkI0KSwgKDB4RTZBNEI2MTkpLCAoMHg3RDYyOEFDNyksICgweEU2NDIzNDFDKSwgKDB4N0Q0RTJDN0MpLCAoMHhFNURGQzFFMiksICgweDdEMzk4MEVEKSwgKDB4RTU3RDVGRTQpLCAoMHg3RDI0ODgxOCksICgweEU1MUIwRTIyKSwgKDB4N0QwRjQyMTcpLCAoMHhFNEI4Q0QxNiksICgweDdDRjlBRUVDKSwgKDB4RTQ1NjlDQkUpLAotLy8oMHg3Q0UzQ0VCMCksICgweEUzRjQ3RDk1KSwgKDB4N0NDREExNkEpLCAoMHhFMzkyNkZCOSksICgweDdDQjcyNzIxKSwgKDB4RTMzMDczNDcpLCAoMHg3Q0EwNUZGMSksICgweEUyQ0U4OEJBKSwgKDB4N0M4OTRCREEpLCAoMHhFMjZDQjAxMCksICgweDdDNzFFQUY3KSwgKDB4RTIwQUU5QzMpLCAoMHg3QzVBM0Q1MiksICgweEUxQTkzNUYxKSwgKDB4N0M0MjQyRjApLCAoMHhFMTQ3OTRCNyksICgweDdDMjlGQkVGKSwgKDB4RTBFNjA2OEYpLAotLy8oMHg3QzExNjg0RiksICgweEUwODQ4Qjc3KSwgKDB4N0JGODg4MzApLCAoMHhFMDIzMjNFQSksICgweDdCREY1QjhGKSwgKDB4REZDMUNGRTUpLCAoMHg3QkM1RTI5NiksICgweERGNjA5MDAyKSwgKDB4N0JBQzFEMzMpLCAoMHhERUZGNjQwMCksICgweDdCOTIwQjg2KSwgKDB4REU5RTRDNUIpLCAoMHg3Qjc3QURBMCksICgweERFM0Q0OTRDKSwgKDB4N0I1RDAzQTEpLCAoMHhERERDNUI0RiksICgweDdCNDIwRDc5KSwgKDB4REQ3QjgyMjIpLAotLy8oMHg3QjI2Q0I0OSksICgweEREMUFCRTQxKSwgKDB4N0IwQjNEMzMpLCAoMHhEQ0JBMTAyNCksICgweDdBRUY2MzI1KSwgKDB4REM1OTc3OEIpLCAoMHg3QUQzM0Q0MSksICgweERCRjhGNEYwKSwgKDB4N0FCNkNCOUEpLCAoMHhEQjk4ODg4RSksICgweDdBOUEwRTUzKSwgKDB4REIzODMyREUpLCAoMHg3QTdEMDU1OSksICgweERBRDdGM0EyKSwgKDB4N0E1RkIwRDEpLCAoMHhEQTc3Q0I1MCksICgweDdBNDIxMERFKSwgKDB4REExN0JBNjMpLAotLy8oMHg3QTI0MjU2RiksICgweEQ5QjdDMDlBKSwgKDB4N0EwNUVFQTgpLCAoMHhEOTU3REU2RiksICgweDc5RTc2QzlDKSwgKDB4RDhGODE0MUQpLCAoMHg3OUM4OUY3MSksICgweEQ4OTg2MjFBKSwgKDB4NzlBOTg3MTMpLCAoMHhEODM4QzgyQSksICgweDc5OEEyM0E4KSwgKDB4RDdEOTQ2QzMpLCAoMHg3OTZBNzU1QSksICgweEQ3NzlERTVEKSwgKDB4Nzk0QTdDMTEpLCAoMHhENzFBOEVCQSksICgweDc5MkEzN0Y4KSwgKDB4RDZCQjU4NTApLAotLy8oMHg3OTA5QTkzNSksICgweEQ2NUMzQjk4KSwgKDB4NzhFOENGQjQpLCAoMHhENUZEMzg1NCksICgweDc4QzdBQjlFKSwgKDB4RDU5RTRFRjkpLCAoMHg3OEE2M0QwNyksICgweEQ1M0Y3RkMzKSwgKDB4Nzg4NDg0MTkpLCAoMHhENEUwQ0IyOCksICgweDc4NjI4MEJFKSwgKDB4RDQ4MjMwRUEpLCAoMHg3ODQwMzMyMSksICgweEQ0MjNCMTgxKSwgKDB4NzgxRDlCNkQpLCAoMHhEM0M1NEQ2MiksICgweDc3RkFCOThBKSwgKDB4RDM2NzA0NEYpLAotLy8oMHg3N0Q3OERBNiksICgweEQzMDhENkJFKSwgKDB4NzdCNDE3RDQpLCAoMHhEMkFBQzRFQiksICgweDc3OTA1ODQyKSwgKDB4RDI0Q0NGNDkpLCAoMHg3NzZDNEVEOSksICgweEQxRUVGNTlEKSwgKDB4Nzc0N0ZCQzUpLCAoMHhEMTkxMzg1QiksICgweDc3MjM1RjM1KSwgKDB4RDEzMzk3RkEpLCAoMHg3NkZFNzkwRiksICgweEQwRDYxNDNBKSwgKDB4NzZEOTQ5ODMpLCAoMHhEMDc4QUQ5MyksICgweDc2QjNEMEE2KSwgKDB4RDAxQjY0M0QpLAotLy8oMHg3NjhFMEVBOSksICgweENGQkUzOEFEKSwgKDB4NzY2ODAzNzMpLCAoMHhDRjYxMkFBNyksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLCAoMHg3NjFCMTIxOCksICgweENFQTc2OTA3KSwgKDB4NzVGNDJDMEIpLCAoMHhDRTRBQjVBNiksICgweDc1Q0NGRDNCKSwgKDB4Q0RFRTIwRUYpLCAoMHg3NUE1ODVEOSksICgweENEOTFBQjU1KSwgKDB4NzU3REM1Q0QpLCAoMHhDRDM1NTQ5QyksICgweDc1NTVCRDQ3KSwgKDB4Q0NEOTFEMzcpLAotLy8oMHg3NTJENkM2MCksICgweENDN0QwNTYxKSwgKDB4NzUwNEQzNEMpLCAoMHhDQzIxMEQ4QiksICgweDc0REJGMUVFKSwgKDB4Q0JDNTM1N0EpLCAoMHg3NEIyQzg3QiksICgweENCNjk3REEwKSwgKDB4NzQ4OTU3MjUpLCAoMHhDQjBERTY3MiksICgweDc0NUY5REQzKSwgKDB4Q0FCMjZGQjIpLCAoMHg3NDM1OUNCOCksICgweENBNTcxOUQzKSwgKDB4NzQwQjUzRUQpLCAoMHhDOUZCRTUwRSksICgweDczRTBDM0E5KSwgKDB4QzlBMEQxRDQpLAotLy8oMHg3M0I1RUJDRiksICgweEM5NDVERkVCKSwgKDB4NzM4QUNDOTQpLCAoMHhDOEVCMEZDNCksICgweDczNUY2NjJGKSwgKDB4Qzg5MDYxRDEpLCAoMHg3MzMzQjg4NCksICgweEM4MzVENUQ2KSwgKDB4NzMwN0MzQzkpLCAoMHhDN0RCNkM0NSksICgweDcyREI4ODE5KSwgKDB4Qzc4MTI1NTYpLCAoMHg3MkFGMDVBQiksICgweEM3MjcwMTdBKSwgKDB4NzI4MjNDNjMpLCAoMHhDNkNEMDA3NSksICgweDcyNTUyQzc5KSwgKDB4QzY3MzIyQjkpLAotLy8oMHg3MjI3RDYyNCksICgweEM2MTk2OEI2KSwgKDB4NzFGQTM5NDgpLCAoMHhDNUJGRDIzMiksICgweDcxQ0M1NjFFKSwgKDB4QzU2NjVGOUIpLCAoMHg3MTlFMkNERSksICgweEM1MEQxMTY0KSwgKDB4NzE2RkJENkMpLCAoMHhDNEIzRTc1MSksICgweDcxNDEwODAwKSwgKDB4QzQ1QUUxRDEpLCAoMHg3MTEyMENCNyksICgweEM0MDIwMTFDKSwgKDB4NzBFMkNCQ0QpLCAoMHhDM0E5NDVBMSksICgweDcwQjM0NTIzKSwgKDB4QzM1MEFGMjYpLAotLy8oMHg3MDgzNzhGNCksICgweEMyRjgzRTFCKSwgKDB4NzA1MzY3N0MpLCAoMHhDMjlGRjJFQyksICgweDcwMjMxMDlDKSwgKDB4QzI0N0NENjIpLCAoMHg2RkYyNzQ5MCksICgweEMxRUZDREVBKSwgKDB4NkZDMTkzNzYpLCAoMHhDMTk3RjRCQiksICgweDZGOTA2RDZCKSwgKDB4QzE0MDQyMEEpLCAoMHg2RjVGMDJDRiksICgweEMwRThCNjdFKSwgKDB4NkYyRDUzNDApLCAoMHhDMDkxNTE2RSksICgweDZFRkI1RjFEKSwgKDB4QzAzQTEzN0UpLAotLy8oMHg2RUM5MjY4NCksICgweEJGRTJGQ0U1KSwgKDB4NkU5NkE5OTUpLCAoMHhCRjhDMEREOCksICgweDZFNjNFODZFKSwgKDB4QkYzNTQ2OEUpLCAoMHg2RTMwRTMyRiksICgweEJFREVBNzNBKSwgKDB4NkRGRDlBMzgpLCAoMHhCRTg4MzA4MiksICgweDZEQ0EwRDI3KSwgKDB4QkUzMUUxQkYpLCAoMHg2RDk2M0M1RCksICgweEJEREJCQjkyKSwgKDB4NkQ2MjI3RkEpLCAoMHhCRDg1QkUzMyksICgweDZEMkREMDFFKSwgKDB4QkQyRkU5RDUpLAotLy8oMHg2Q0Y5MzRFOCksICgweEJDREEzRUFFKSwgKDB4NkNDNDU2N0EpLCAoMHhCQzg0QkNGMiksICgweDZDOEYzNTM4KSwgKDB4QkMyRjY1NDQpLCAoMHg2QzU5RDBCQyksICgweEJCREEzNkZEKSwgKDB4NkMyNDI5NjkpLCAoMHhCQjg1MzJDMCksICgweDZCRUUzRjYxKSwgKDB4QkIzMDU4QzEpLCAoMHg2QkI4MTJDNSksICgweEJBREJBOTM0KSwgKDB4NkI4MUEzQjcpLCAoMHhCQTg3MjQ0RSksICgweDZCNEFGMjU4KSwgKDB4QkEzMkNBNDIpLAotLy8oMHg2QjEzRkYxMSksICgweEI5REU5QkIwKSwgKDB4NkFEQ0M5NzYpLCAoMHhCOThBOTdGNiksICgweDZBQTU1MUYwKSwgKDB4QjkzNkJGQjIpLCAoMHg2QTZEOThBMSksICgweEI4RTMxMzE4KSwgKDB4NkEzNTlEQUMpLCAoMHhCODhGOTI1QiksICgweDY5RkQ2MTMyKSwgKDB4QjgzQzNEQjEpLCAoMHg2OUM0RTM1OCksICgweEI3RTkxNTRBKSwgKDB4Njk4QzI0ODcpLCAoMHhCNzk2MTlDNiksICgweDY5NTMyNDUzKSwgKDB4Qjc0MzRBODIpLAotLy8oMHg2OTE5RTMyNiksICgweEI2RjBBODFEKSwgKDB4NjhFMDYxMjUpLCAoMHhCNjlFMzJDOSksICgweDY4QTY5RTcyKSwgKDB4QjY0QkVBQjkpLCAoMHg2ODZDOUIzMSksICgweEI1RjlEMDIxKSwgKDB4NjgzMjU3ODYpLCAoMHhCNUE3RTMzMSksICgweDY3RjdEM0RGKSwgKDB4QjU1NjI0ODYpLCAoMHg2N0JEMEZDQyksICgweEI1MDQ5MzgwKSwgKDB4Njc4MjBCQkIpLCAoMHhCNEIzMzBCQyksICgweDY3NDZDN0QxKSwgKDB4QjQ2MUZDNkEpLAotLy8oMHg2NzBCNDQzMiksICgweEI0MTBGNkJFKSwgKDB4NjZDRjgxMDMpLCAoMHhCM0MwMUZFOSksICgweDY2OTM3RUI1KSwgKDB4QjM2Rjc4ODMpLCAoMHg2NjU3M0NENSksICgweEIzMUVGRkYwKSwgKDB4NjYxQUJCRDMpLCAoMHhCMkNFQjZDQiksICgweDY1RERGQkQ2KSwgKDB4QjI3RTlENDMpLCAoMHg2NUEwRkQwMyksICgweEIyMkVCMzhBKSwgKDB4NjU2M0JGN0UpLCAoMHhCMURFRjlEMiksICgweDY1MjY0MzZGKSwgKDB4QjE4RjcwNEIpLAotLy8oMHg2NEU4ODk0QSksICgweEIxNDAxNzhDKSwgKDB4NjRBQTkwOTgpLCAoMHhCMEYwRUVGQyksICgweDY0NkM1OUNDKSwgKDB4QjBBMUY3MzApLCAoMHg2NDJERTUwRiksICgweEIwNTMzMDVBKSwgKDB4NjNFRjMyODYpLCAoMHhCMDA0OUFBOSksICgweDYzQjA0MjU3KSwgKDB4QUZCNjM2NEUpLCAoMHg2MzcxMTRBQiksICgweEFGNjgwMzdCKSwgKDB4NjMzMUE5RjgpLCAoMHhBRjFBMDJDMSksICgweDYyRjIwMUM0KSwgKDB4QUVDQzMzOEIpLAotLy8oMHg2MkIyMUM4NyksICgweEFFN0U5NjZDKSwgKDB4NjI3MUZBNjkpLCAoMHhBRTMxMkI5NCksICgweDYyMzE5QjkxKSwgKDB4QURFM0YzMzMpLCAoMHg2MUYxMDAyNyksICgweEFEOTZFRDc3KSwgKDB4NjFCMDI4NTIpLCAoMHhBRDRBMUE5MiksICgweDYxNkYxNDhFKSwgKDB4QUNGRDdCMTMpLCAoMHg2MTJEQzQ1RCksICgweEFDQjEwRTY3KSwgKDB4NjBFQzM4M0EpLCAoMHhBQzY0RDUxRiksICgweDYwQUE3MDRFKSwgKDB4QUMxOENGNjkpLAotLy8oMHg2MDY4NkNDMCksICgweEFCQ0NGRDc1KSwgKDB4NjAyNjJEQkIpLCAoMHhBQjgxNUY3MSksICgweDVGRTNCMzY2KSwgKDB4QUIzNUY1OEMpLCAoMHg1RkEwRkU0MCksICgweEFBRUFDMDU0KSwgKDB4NUY1RTBEQzgpLCAoMHhBQTlGQkYzOCksICgweDVGMUFFMjdDKSwgKDB4QUE1NEYyQzYpLCAoMHg1RUQ3N0M4NiksICgweEFBMEE1QjJDKSwgKDB4NUU5M0RDMEUpLCAoMHhBOUJGRjg5OSksICgweDVFNTAwMTQwKSwgKDB4QTk3NUNCMzkpLAotLy8oMHg1RTBCRUM0NCksICgweEE5MkJEMzNDKSwgKDB4NURDNzlEOUMpLCAoMHhBOEUyMTEyQyksICgweDVEODMxNEM0KSwgKDB4QTg5ODg0N0IpLCAoMHg1RDNFNTIzRSksICgweEE4NEYyREI0KSwgKDB4NUNGOTU2MzIpLCAoMHhBODA2MEQwNSksICgweDVDQjQyMENEKSwgKDB4QTdCRDIyOUEpLCAoMHg1QzZFQjIzOCksICgweEE3NzQ2RUEyKSwgKDB4NUMyOTBBQTApLCAoMHhBNzJCRjE0OCksICgweDVCRTMyQTg2KSwgKDB4QTZFM0FCMTUpLAotLy8oMHg1QjlEMTE2NiksICgweEE2OUI5QjdEKSwgKDB4NUI1NkJGQzIpLCAoMHhBNjUzQzMwQSksICgweDVCMTAzNUM3KSwgKDB4QTYwQzIxRTgpLCAoMHg1QUM5NzNBMCksICgweEE1QzRCODQzKSwgKDB4NUE4Mjc5NzgpLCAoMHhBNTdEODY0NiksICgweDVBM0I0N0Q2KSwgKDB4QTUzNjhDNzgpLCAoMHg1OUYzREUzMCksICgweEE0RUZDQTUxKSwgKDB4NTlBQzNEMEUpLCAoMHhBNEE5NDA1NiksICgweDU5NjQ2NDlCKSwgKDB4QTQ2MkVFQjIpLAotLy8oMHg1OTFDNTUwNCksICgweEE0MUNENTkxKSwgKDB4NThENDBFNzUpLCAoMHhBM0Q2RjUxRiksICgweDU4OEI5MTFCKSwgKDB4QTM5MTREODcpLCAoMHg1ODQyREQ3RSksICgweEEzNEJERjRCKSwgKDB4NTdGOUYzMTQpLCAoMHhBMzA2QTlFNSksICgweDU3QjBEMjY1KSwgKDB4QTJDMUFEREEpLCAoMHg1NzY3N0I5RSksICgweEEyN0NFQjUzKSwgKDB4NTcxREVFRUQpLCAoMHhBMjM4NjI3QiksICgweDU2RDQyQzdGKSwgKDB4QTFGNDEzN0MpLAotLy8oMHg1NjhBMzQ4MiksICgweEExQUZGRTgxKSwgKDB4NTY0MDA3ODEpLCAoMHhBMTZDMjQwOSksICgweDU1RjVBNEVEKSwgKDB4QTEyODgzOTEpLCAoMHg1NUFCMEQ1NCksICgweEEwRTUxRDlCKSwgKDB4NTU2MDQwRTIpLCAoMHhBMEExRjI0RiksICgweDU1MTUzRkM2KSwgKDB4QTA1RjAxRDcpLCAoMHg1NENBMEEyRSksICgweEEwMUM0QzVDKSwgKDB4NTQ3RUEwNDkpLCAoMHg5RkQ5RDIwNyksICgweDU0MzMwMkE1KSwgKDB4OUY5NzkzNTYpLAotLy8oMHg1M0U3MzBCMSksICgweDlGNTU4RkM5KSwgKDB4NTM5QjJBRkIpLCAoMHg5RjEzQzdEQyksICgweDUzNEVGMUIzKSwgKDB4OUVEMjNCQjkpLCAoMHg1MzAyODUwNyksICgweDlFOTBFQjg4KSwgKDB4NTJCNUU1MjYpLCAoMHg5RTRGRDc3MSksICgweDUyNjkxMjQxKSwgKDB4OUUwRUZGOUQpLCAoMHg1MjFDMENFOCksICgweDlEQ0U2NDg1KSwgKDB4NTFDRUQ0ODYpLCAoMHg5RDhFMDVBRCksICgweDUxODE2OUFFKSwgKDB4OUQ0REUzOEYpLAotLy8oMHg1MTMzQ0M4RiksICgweDlEMERGRTUyKSwgKDB4NTBFNUZENTkpLCAoMHg5Q0NFNTYxRSksICgweDUwOTdGQzNDKSwgKDB4OUM4RUVCMUEpLCAoMHg1MDQ5Qzk2OCksICgweDlDNEZCRDZFKSwgKDB4NEZGQjY1NzIpLCAoMHg5QzEwQ0Q5MCksICgweDRGQUNDRkMxKSwgKDB4OUJEMjFCMDYpLCAoMHg0RjVFMDhFQiksICgweDlCOTNBNjQ5KSwgKDB4NEYwRjExMUYpLCAoMHg5QjU1NkY3RSksICgweDRFQkZFODhGKSwgKDB4OUIxNzc2Q0IpLAotLy8oMHg0RTcwOEY2QiksICgweDlBRDlCQzU3KSwgKDB4NEUyMTA1RTQpLCAoMHg5QTlDNDA0OCksICgweDRERDE0QzkxKSwgKDB4OUE1RjAzMTIpLCAoMHg0RDgxNjJEOCksICgweDlBMjIwNDNGKSwgKDB4NEQzMTQ5NTEpLCAoMHg5OUU1NDQ0MSksICgweDRDRTEwMDJCKSwgKDB4OTlBOEMzNDApLCAoMHg0QzkwODc5OSksICgweDk5NkM4MTVGKSwgKDB4NEMzRkRGQ0MpLCAoMHg5OTMwN0VDNSksICgweDRCRUYwOTVFKSwgKDB4OThGNEJCRTIpLAotLy8oMHg0QjlFMDNCMSksICgweDk4QjkzODQzKSwgKDB4NEI0Q0NGNjApLCAoMHg5ODdERjQ1OSksICgweDRBRkI2QzlCKSwgKDB4OTg0MkYwNDgpLCAoMHg0QUE5REI5NiksICgweDk4MDgyQzM1KSwgKDB4NEE1ODFDODMpLCAoMHg5N0NEQTg0NCksICgweDRBMDYyRjkzKSwgKDB4OTc5MzY0OTkpLCAoMHg0OUI0MTU2MiksICgweDk3NTk2MUEyKSwgKDB4NDk2MUNENTMpLCAoMHg5NzFGOUVFRiksICgweDQ5MEY1N0ZGKSwgKDB4OTZFNjFDRUQpLAotLy8oMHg0OEJDQjU5QSksICgweDk2QUNEQkMxKSwgKDB4NDg2OUU2NTcpLCAoMHg5NjczREI4QyksICgweDQ4MTZFQTY4KSwgKDB4OTYzQjFDNzMpLCAoMHg0N0MzQzIwMiksICgweDk2MDI5RTk5KSwgKDB4NDc3MDZEQzEpLCAoMHg5NUNBNjI2NyksICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLCAoMHg0NkM5NDA2QiksICgweDk1NUFBRTIzKSwgKDB4NDY3NTY4MjcpLCAoMHg5NTIzMzY5RCksICgweDQ2MjE2NDZDKSwgKDB4OTRFQzAxMDIpLAotLy8oMHg0NUNEMzU2RiksICgweDk0QjUwRDc0KSwgKDB4NDU3OERCNjMpLCAoMHg5NDdFNUMxNiksICgweDQ1MjQ1NkU5KSwgKDB4OTQ0N0VENEQpLCAoMHg0NENGQTc1QyksICgweDk0MTFDMEIxKSwgKDB4NDQ3QUNENUQpLCAoMHg5M0RCRDZBQSksICgweDQ0MjVDOTIwKSwgKDB4OTNBNjJGNTcpLCAoMHg0M0QwOUFEOSksICgweDkzNzBDQURBKSwgKDB4NDM3QjQyQkUpLCAoMHg5MzNCQTk1NCksICgweDQzMjVDMTAyKSwgKDB4OTMwNkNBRTcpLAotLy8oMHg0MkQwMTVEQiksICgweDkyRDIyRkIxKSwgKDB4NDI3QTQxN0QpLCAoMHg5MjlERDdENSksICgweDQyMjQ0NDFEKSwgKDB4OTI2OUMzNzIpLCAoMHg0MUNFMUVDRCksICgweDkyMzVGMzJDKSwgKDB4NDE3N0QwMDkpLCAoMHg5MjAyNjYxQiksICgweDQxMjE1OEUzKSwgKDB4OTFDRjFDRTMpLCAoMHg0MENBQjk5MCksICgweDkxOUMxN0E0KSwgKDB4NDA3M0YyNDUpLCAoMHg5MTY5NTY3RCksICgweDQwMUQwMzM5KSwgKDB4OTEzNkQ5OEQpLAotLy8oMHgzRkM1RUNBMCksICgweDkxMDRBMEY0KSwgKDB4M0Y2RUFFQjApLCAoMHg5MEQyQUNEMSksICgweDNGMTc0OTlGKSwgKDB4OTBBMEZENDIpLCAoMHgzRUJGQkRBNCksICgweDkwNkY5MjY3KSwgKDB4M0U2ODBBRjMpLCAoMHg5MDNFNkM1RCksICgweDNFMTAzMUM0KSwgKDB4OTAwRDhCNDMpLCAoMHgzREI4MzI0QyksICgweDhGRENFRjM3KSwgKDB4M0Q2MDBDQzEpLCAoMHg4RkFDOTg1NyksICgweDNEMDdDMjNDKSwgKDB4OEY3Qzg3M0EpLAotLy8oMHgzQ0FGNTEzMCksICgweDhGNENCQjBCKSwgKDB4M0M1NkJBQjUpLCAoMHg4RjFEMzQ2MSksICgweDNCRkRGRjAyKSwgKDB4OEVFREYzNTkpLCAoMHgzQkE1MUU0RCksICgweDhFQkVGODEwKSwgKDB4M0I0QzE4Q0UpLCAoMHg4RTkwNDJBNCksICgweDNBRjJFRUJBKSwgKDB4OEU2MUQzMzEpLCAoMHgzQTk5QTA0QSksICgweDhFMzNBOUQ1KSwgKDB4M0E0MDJEQjQpLCAoMHg4RTA1QzZBQSksICgweDM5RTY5NzJGKSwgKDB4OEREODI5Q0UpLAotLy8oMHgzOThDRENGMyksICgweDhEQUFEMzVEKSwgKDB4MzkzMkZGMzcpLCAoMHg4RDdEQzM3MyksICgweDM4RDhGRTMyKSwgKDB4OEQ1MEZBMkIpLCAoMHgzODdFREExQyksICgweDhEMjQ3N0EyKSwgKDB4MzgyNDk0MTMpLCAoMHg4Q0Y4M0M2MiksICgweDM3Q0EyQTgyKSwgKDB4OENDQzQ3QTcpLCAoMHgzNzZGOUU4OCksICgweDhDQTA5OUZCKSwgKDB4MzcxNEYwNUIpLCAoMHg4Qzc1MzM3QiksICgweDM2QkEyMDM0KSwgKDB4OEM0QTE0NDApLAotLy8oMHgzNjVGMkU0QiksICgweDhDMUYzQzY2KSwgKDB4MzYwNDFBRDcpLCAoMHg4QkY0QUMwNiksICgweDM1QThFNjEyKSwgKDB4OEJDQTYzM0MpLCAoMHgzNTREOTAzMyksICgweDhCQTA2MjIxKSwgKDB4MzRGMjE5NzMpLCAoMHg4Qjc2QThDRSksICgweDM0OTY4MjBBKSwgKDB4OEI0RDM3NUYpLCAoMHgzNDNBQ0EzMCksICgweDhCMjQwREVDKSwgKDB4MzNERUYyMUYpLCAoMHg4QUZCMkM4RSksICgweDMzODJGQUY5KSwgKDB4OEFEMjkzQzcpLAotLy8oMHgzMzI2RTMyMyksICgweDhBQUE0MkUwKSwgKDB4MzJDQUFCQkUpLCAoMHg4QTgyM0E1QSksICgweDMyNkU1NTA1KSwgKDB4OEE1QTdBNEQpLCAoMHgzMjExREYzMSksICgweDhBMzMwMkQzKSwgKDB4MzFCNTRBNzkpLCAoMHg4QTBCRDQwMyksICgweDMxNTg5NzE4KSwgKDB4ODlFNEVERjUpLCAoMHgzMEZCQzU0NyksICgweDg5QkU1MEMyKSwgKDB4MzA5RUQ1M0UpLCAoMHg4OTk3RkM4MiksICgweDMwNDFDNzM3KSwgKDB4ODk3MUYxNEIpLAotLy8oMHgyRkU0OUI2QyksICgweDg5NEMyRjM2KSwgKDB4MkY4NzUyMTYpLCAoMHg4OTI2QjY1QSksICgweDJGMjlFQjZFKSwgKDB4ODkwMTg2Q0UpLCAoMHgyRUNDNjdBRiksICgweDg4RENBMEE5KSwgKDB4MkU2RUM4MDApLCAoMHg4OEI4MDQ1RSksICgweDJFMTEwQUJGKSwgKDB4ODg5M0IxNEEpLCAoMHgyREIzMzExMiksICgweDg4NkZBN0UxKSwgKDB4MkQ1NTNCMzUpLCAoMHg4ODRCRTgzOCksICgweDJDRjcyOTYyKSwgKDB4ODgyODcyNjYpLAotLy8oMHgyQzk4RkJEMSksICgweDg4MDU0NjgyKSwgKDB4MkMzQUIyQkYpLCAoMHg4N0UyNjQ5RiksICgweDJCREM0RTYzKSwgKDB4ODdCRkNDRDUpLCAoMHgyQjdEQ0VGQSksICgweDg3OUQ3RjM4KSwgKDB4MkIxRjM0QkMpLCAoMHg4NzdCN0JERCksICgweDJBQzA3RkU1KSwgKDB4ODc1OUMyREEpLCAoMHgyQTYxQjBBRiksICgweDg3Mzg1NDQzKSwgKDB4MkEwMkM3NTQpLCAoMHg4NzE3MzAyRCksICgweDI5QTNDNDBGKSwgKDB4ODZGNjU2QUMpLAotLy8oMHgyOTQ0QTgwRCksICgweDg2RDVDODI4KSwgKDB4MjhFNTcxQTMpLCAoMHg4NkI1ODQwRSksICgweDI4ODYyMjAwKSwgKDB4ODY5NThBQzUpLCAoMHgyODI2Qjk1RSksICgweDg2NzVEQzYyKSwgKDB4MjdDNzM3RjcpLCAoMHg4NjU2NzhGOCksICgweDI3Njc5RTA2KSwgKDB4ODYzNzYwOUEpLCAoMHgyNzA3RUJDNyksICgweDg2MTg5MzVCKSwgKDB4MjZBODIxNzQpLCAoMHg4NUZBMTE0RiksICgweDI2NDgzRjQ5KSwgKDB4ODVEQkRBODgpLAotLy8oMHgyNUU4NDU4MSksICgweDg1QkRFRjE5KSwgKDB4MjU4ODM0NTYpLCAoMHg4NUEwNEYxNCksICgweDI1MjgwQzA1KSwgKDB4ODU4MkZBOEMpLCAoMHgyNEM3Q0NDOCksICgweDg1NjVGMTkyKSwgKDB4MjQ2Nzc3RDApLCAoMHg4NTQ5MzQ4MiksICgweDI0MDcwQjZFKSwgKDB4ODUyQ0MyREEpLCAoMHgyM0E2ODhEMyksICgweDg1MTA5Q0Y3KSwgKDB4MjM0NUYwM0IpLCAoMHg4NEY0QzJFOCksICgweDIyRTU0MUUwKSwgKDB4ODREOTM0QzApLAotLy8oMHgyMjg0N0RGRiksICgweDg0QkRGMjkwKSwgKDB4MjIyM0E0RDIpLCAoMHg4NEEyRkM2OCksICgweDIxQzJCNjk3KSwgKDB4ODQ4ODUyNTgpLCAoMHgyMTYxQjM4OSksICgweDg0NkRGNDcyKSwgKDB4MjEwMDlCRTMpLCAoMHg4NDUzRTJDNSksICgweDIwOUY2RkUxKSwgKDB4ODQzQTFENjIpLCAoMHgyMDNFMkZDMCksICgweDg0MjBBNDU5KSwgKDB4MUZEQ0RCQkIpLCAoMHg4NDA3NzdCOSksICgweDFGN0I3NDBGKSwgKDB4ODNFRTk3OTIpLAotLy8oMHgxRjE5RjlGMCksICgweDgzRDYwNDMxKSwgKDB4MUVCODZCQTkpLCAoMHg4M0JEQkQyOCksICgweDFFNTZDQTZFKSwgKDB4ODNBNUMyQzUpLCAoMHgxREY1MTY3RCksICgweDgzOEUxNTE4KSwgKDB4MUQ5MzUwMTEpLCAoMHg4Mzc2QjQyRSksICgweDFEMzE3NzY3KSwgKDB4ODM1RkEwMTcpLCAoMHgxQ0NGOENCQiksICgweDgzNDhEOERGKSwgKDB4MUM2RDkwNDkpLCAoMHg4MzMyNUU5NiksICgweDFDMEI4MjRFKSwgKDB4ODMxQzMxNEEpLAotLy8oMHgxQkE5NjMwNiksICgweDgzMDY1MTA3KSwgKDB4MUI0NzMyQUUpLCAoMHg4MkYwQkREQiksICgweDFBRTRGMTgyKSwgKDB4ODJEQjc3RDUpLCAoMHgxQTgyOUZDMCksICgweDgyQzY3RjAwKSwgKDB4MUEyMDNEQTMpLCAoMHg4MkIxRDM2QSksICgweDE5QkRDQzYzKSwgKDB4ODI5RDc1NTMpLCAoMHgxOTVCNEE0OCksICgweDgyODk2NDYwKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksICgweDE4OTYxNzYxKSwgKDB4ODI2MjJBQjMpLAotLy8oMHgxODMzNjcxMCksICgweDgyNEYwMjExKSwgKDB4MTdEMEE3RDEpLCAoMHg4MjNDMjZGOCksICgweDE3NkREOUUxKSwgKDB4ODIyOTk5NzQpLCAoMHgxNzBBRkQ3RCksICgweDgyMTc1OThFKSwgKDB4MTZBODEyRTMpLCAoMHg4MjA1Njc1NCksICgweDE2NDUxQTRFKSwgKDB4ODFGM0MyQ0YpLCAoMHgxNUUyMTNGRCksICgweDgxRTI2QzBCKSwgKDB4MTU3RjAwMkQpLCAoMHg4MUQxNjMxMyksICgweDE1MUJERjE5KSwgKDB4ODFDMEE3RjEpLAotLy8oMHgxNEI4QjEwMSksICgweDgxQjAzQUFGKSwgKDB4MTQ1NTc3MUQpLCAoMHg4MUEwMUI4MCksICgweDEzRjIyRkIxKSwgKDB4ODE5MDRBMUMpLCAoMHgxMzhFREJGOCksICgweDgxODBDNkI2KSwgKDB4MTMyQjdDMkUpLCAoMHg4MTcxOTE1OCksICgweDEyQzgxMDkwKSwgKDB4ODE2MkFBMEEpLCAoMHgxMjY0OTk1RCksICgweDgxNTQxMEQ4KSwgKDB4MTIwMTE2RDIpLCAoMHg4MTQ1QzVDOCksICgweDExOUQ4OTJCKSwgKDB4ODEzN0M4RTUpLAotLy8oMHgxMTM5RjBBNyksICgweDgxMkExQTM2KSwgKDB4MTBENjREODIpLCAoMHg4MTFDQjlDNCksICgweDEwNzI5RkZCKSwgKDB4ODEwRkE3OTgpLCAoMHgxMDBFRTg0RSksICgweDgxMDJFM0I5KSwgKDB4MEZBQjI2QjkpLCAoMHg4MEY2NkUzMCksICgweDBGNDc1Qzc4KSwgKDB4ODBFQTQ3MjIpLCAoMHgwRUUzODdDRCksICgweDgwREU2RTVBKSwgKDB4MEU3RkE5RjIpLCAoMHg4MEQyRTNGRCksICgweDBFMUJDMzI2KSwgKDB4ODBDN0E4MTMpLAotLy8oMHgwREI3RDNBNSksICgweDgwQkNCQUEzKSwgKDB4MEQ1M0RCQUYpLCAoMHg4MEIyMUJCNCksICgweDBDRUZEQjgwKSwgKDB4ODBBN0NCNEMpLCAoMHgwQzhCRDM1NiksICgweDgwOURDOTcxKSwgKDB4MEMyN0MzNkUpLCAoMHg4MDk0MTYyQiksICgweDBCQzNBQzA3KSwgKDB4ODA4QUIxN0UpLCAoMHgwQjVGOEQ1RiksICgweDgwODE5QjcwKSwgKDB4MEFGQjY3QjIpLCAoMHg4MDc4RDQwNyksICgweDBBOTczQjNGKSwgKDB4ODA3MDVCNDkpLAotLy8oMHgwQTMzMDg0NCksICgweDgwNjgzMTNCKSwgKDB4MDlDRUNGRkUpLCAoMHg4MDYwNTVGNSksICgweDA5NkE5MEFCKSwgKDB4ODA1OEM5NTUpLCAoMHgwOTA2NEI4QSksICgweDgwNTE4QjcyKSwgKDB4MDhBMjAwRDcpLCAoMHg4MDRBOUM1MyksICgweDA4M0RCMEQxKSwgKDB4ODA0M0ZCRkEpLCAoMHgwN0Q5NUJCNiksICgweDgwM0RBQTZEKSwgKDB4MDc3NTAxQzMpLCAoMHg4MDM3QTdBRSksICgweDA3MTBBMzM3KSwgKDB4ODAzMUYzQzMpLAotLy8oMHgwNkFDNDA0RiksICgweDgwMkM4RUFEKSwgKDB4MDY0N0Q5NDkpLCAoMHg4MDI3Nzg3MSksICgweDA1RTM2RTYzKSwgKDB4ODAyMkIxMTIpLCAoMHgwNTdFRkZEQyksICgweDgwMUUzODkyKSwgKDB4MDUxQThERjEpLCAoMHg4MDFBMEVGNSksICgweDA0QjYxOERGKSwgKDB4ODAxNjM0M0QpLCAoMHgwNDUxQTFFNiksICgweDgwMTJBODc1KSwgKDB4MDNFRDI3NDMpLCAoMHg4MDBGNkI4RCksICgweDAzODhBQTMzKSwgKDB4ODAwQzdEOTApLAotLy8oMHgwMzI0MkFGNiksICgweDgwMDlERTgxKSwgKDB4MDJCRkE5QzkpLCAoMHg4MDA3OEU2MSksICgweDAyNUIyNkU5KSwgKDB4ODAwNThEMzEpLCAoMHgwMUY2QTI5NiksICgweDgwMDNEQUYyKSwgKDB4MDE5MjFEMEMpLCAoMHg4MDAyNzdBNyksICgweDAxMkQ5NjhCKSwgKDB4ODAwMTYzNEYpLCAoMHgwMEM5MEY0RiksICgweDgwMDA5REVCKSwgKDB4MDA2NDg3OTcpLCAoMHg4MDAwMjc3QyksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLAotLy8oMHhGRjlCNzdBRCksICgweDgwMDAyNzdDKSwgKDB4RkYzNkYwRjUpLCAoMHg4MDAwOURFQiksICgweEZFRDI2OUJBKSwgKDB4ODAwMTYzNEUpLCAoMHhGRTZERTMzOCksICgweDgwMDI3N0E2KSwgKDB4RkUwOTVEQUYpLCAoMHg4MDAzREFGMSksICgweEZEQTREOTVCKSwgKDB4ODAwNThEMkYpLCAoMHhGRDQwNTY3QyksICgweDgwMDc4RTVGKSwgKDB4RkNEQkQ1NEUpLCAoMHg4MDA5REU3RiksICgweEZDNzc1NjExKSwgKDB4ODAwQzdEOEUpLAotLy8oMHhGQzEyRDkwMiksICgweDgwMEY2QjhBKSwgKDB4RkJBRTVFNUUpLCAoMHg4MDEyQTg3MiksICgweEZCNDlFNjY1KSwgKDB4ODAxNjM0NDQpLCAoMHhGQUU1NzE1NCksICgweDgwMUEwRUZEKSwgKDB4RkE4MEZGNjkpLCAoMHg4MDFFMzg5QSksICgweEZBMUM5MEUxKSwgKDB4ODAyMkIxMUIpLCAoMHhGOUI4MjZGQiksICgweDgwMjc3ODZFKSwgKDB4Rjk1M0JGRjYpLCAoMHg4MDJDOEVBOSksICgweEY4RUY1RDBFKSwgKDB4ODAzMUYzQkYpLAotLy8oMHhGODhBRkU4MSksICgweDgwMzdBN0FBKSwgKDB4RjgyNkE0OEUpLCAoMHg4MDNEQUE2OSksICgweEY3QzI0RjczKSwgKDB4ODA0M0ZCRjYpLCAoMHhGNzVERkY2RCksICgweDgwNEE5QzRFKSwgKDB4RjZGOUI0QkIpLCAoMHg4MDUxOEI2RSksICgweEY2OTU2Rjk5KSwgKDB4ODA1OEM5NTApLCAoMHhGNjMxMzA0NiksICgweDgwNjA1NUYwKSwgKDB4RjVDQ0Y3MDEpLCAoMHg4MDY4MzE0QSksICgweEY1NjhDNDA1KSwgKDB4ODA3MDVCNTkpLAotLy8oMHhGNTA0OTc5MyksICgweDgwNzhENDE4KSwgKDB4RjRBMDcxRTYpLCAoMHg4MDgxOUI4MSksICgweEY0M0M1NDNEKSwgKDB4ODA4QUIxNzcpLCAoMHhGM0Q4M0NENiksICgweDgwOTQxNjI0KSwgKDB4RjM3NDJDRUUpLCAoMHg4MDlEQzk2QiksICgweEYzMTAyNEM0KSwgKDB4ODBBN0NCNDUpLCAoMHhGMkFDMjQ5NSksICgweDgwQjIxQkFEKSwgKDB4RjI0ODJDOUYpLCAoMHg4MEJDQkE5QyksICgweEYxRTQzRDFFKSwgKDB4ODBDN0E4MEMpLAotLy8oMHhGMTgwNTY1MiksICgweDgwRDJFM0Y1KSwgKDB4RjExQzc4NzcpLCAoMHg4MERFNkU1MiksICgweEYwQjhBM0NDKSwgKDB4ODBFQTQ3MUEpLCAoMHhGMDU0RDg4RCksICgweDgwRjY2RTQ3KSwgKDB4RUZGMTE2RjgpLCAoMHg4MTAyRTNEMSksICgweEVGOEQ1RjRCKSwgKDB4ODEwRkE3QjApLCAoMHhFRjI5QjJDMiksICgweDgxMUNCOUJCKSwgKDB4RUVDNjBGOUQpLCAoMHg4MTJBMUEyRCksICgweEVFNjI3NzE4KSwgKDB4ODEzN0M4REIpLAotLy8oMHhFREZFRTk3MiksICgweDgxNDVDNUJFKSwgKDB4RUQ5QjY2RTYpLCAoMHg4MTU0MTBDRSksICgweEVEMzdFRkIzKSwgKDB4ODE2MkFBMDApLCAoMHhFQ0Q0ODQxNiksICgweDgxNzE5MTREKSwgKDB4RUM3MTI0NEMpLCAoMHg4MTgwQzZBQiksICgweEVDMEREMDkyKSwgKDB4ODE5MDRBMTEpLCAoMHhFQkFBODkyNyksICgweDgxQTAxQjc1KSwgKDB4RUI0NzRFNDYpLCAoMHg4MUIwM0FDRCksICgweEVBRTQyMDJEKSwgKDB4ODFDMEE4MTApLAotLy8oMHhFQTgwRkYxQSksICgweDgxRDE2MzMzKSwgKDB4RUExREVCNEEpLCAoMHg4MUUyNkMyQyksICgweEU5QkFFNUY1KSwgKDB4ODFGM0MyQzMpLCAoMHhFOTU3RUQ2MSksICgweDgyMDU2NzQ4KSwgKDB4RThGNTAyQzYpLCAoMHg4MjE3NTk4MiksICgweEU4OTIyNjYyKSwgKDB4ODIyOTk5NjcpLCAoMHhFODJGNTg3MiksICgweDgyM0MyNkVDKSwgKDB4RTdDQzk5MzMpLCAoMHg4MjRGMDIwNCksICgweEU3NjlFOEUyKSwgKDB4ODI2MjJBQTYpLAotLy8oMHhFNzA3NDdCQiksICgweDgyNzVBMEMzKSwgKDB4RTZBNEI1RkIpLCAoMHg4Mjg5NjQ1MiksICgweEU2NDIzM0UwKSwgKDB4ODI5RDc1NDUpLCAoMHhFNURGQzFBNSksICgweDgyQjFEMzkwKSwgKDB4RTU3RDVGODkpLCAoMHg4MkM2N0YyNyksICgweEU1MUIwREM2KSwgKDB4ODJEQjc3RkMpLCAoMHhFNEI4Q0M5QiksICgweDgyRjBCRTAzKSwgKDB4RTQ1NjlEM0QpLCAoMHg4MzA2NTBGOCksICgweEUzRjQ3REY1KSwgKDB4ODMxQzMxM0IpLAotLy8oMHhFMzkyNkZGQSksICgweDgzMzI1RTg3KSwgKDB4RTMzMDczODgpLCAoMHg4MzQ4RDhEMCksICgweEUyQ0U4OERCKSwgKDB4ODM1RkEwMDcpLCAoMHhFMjZDQjAzMSksICgweDgzNzZCNDFFKSwgKDB4RTIwQUU5QzUpLCAoMHg4MzhFMTUwOCksICgweEUxQTkzNUQ0KSwgKDB4ODNBNUMyQjUpLCAoMHhFMTQ3OTQ5QSksICgweDgzQkRCRDE3KSwgKDB4RTBFNjA2NTMpLCAoMHg4M0Q2MDQyMCksICgweEUwODQ4QjNCKSwgKDB4ODNFRTk3QzApLAotLy8oMHhFMDIzMjM4RiksICgweDg0MDc3N0U4KSwgKDB4REZDMUNGOEEpLCAoMHg4NDIwQTQ4OCksICgweERGNjA4RjY5KSwgKDB4ODQzQTFEOTIpLCAoMHhERUZGNjQ1RiksICgweDg0NTNFMkI0KSwgKDB4REU5RTRDQjkpLCAoMHg4NDZERjQ2MCksICgweERFM0Q0OUFCKSwgKDB4ODQ4ODUyNDYpLCAoMHhERERDNUI2RiksICgweDg0QTJGQzU1KSwgKDB4REQ3QjgyNDMpLCAoMHg4NEJERjI3RSksICgweEREMUFCRTYyKSwgKDB4ODREOTM0QUUpLAotLy8oMHhEQ0JBMTAwNyksICgweDg0RjRDMkQ2KSwgKDB4REM1OTc3NkUpLCAoMHg4NTEwOUNFNCksICgweERCRjhGNEQzKSwgKDB4ODUyQ0MyQzcpLCAoMHhEQjk4ODg3MiksICgweDg1NDkzNDZFKSwgKDB4REIzODMyODUpLCAoMHg4NTY1RjFDOCksICgweERBRDdGMzQ4KSwgKDB4ODU4MkZBQzIpLCAoMHhEQTc3Q0FGNiksICgweDg1QTA0RjRCKSwgKDB4REExN0JBQzEpLCAoMHg4NUJERUYwNSksICgweEQ5QjdDMEY4KSwgKDB4ODVEQkRBNzMpLAotLy8oMHhEOTU3REVDRCksICgweDg1RkExMTNBKSwgKDB4RDhGODE0N0EpLCAoMHg4NjE4OTM0NiksICgweEQ4OTg2MjNCKSwgKDB4ODYzNzYwODUpLCAoMHhEODM4Qzg0QSksICgweDg2NTY3OEUzKSwgKDB4RDdEOTQ2RTMpLCAoMHg4Njc1REM0RCksICgweEQ3NzlERTQxKSwgKDB4ODY5NThBQjApLCAoMHhENzFBOEU5RCksICgweDg2QjU4M0Y4KSwgKDB4RDZCQjU4MzQpLCAoMHg4NkQ1QzgxMiksICgweEQ2NUMzQjQwKSwgKDB4ODZGNjU2RTkpLAotLy8oMHhENUZEMzdGQiksICgweDg3MTczMDZCKSwgKDB4RDU5RTRFQTApLCAoMHg4NzM4NTQ4MSksICgweEQ1M0Y3RjZBKSwgKDB4ODc1OUMzMTkpLCAoMHhENEUwQ0I4NCksICgweDg3N0I3QkM2KSwgKDB4RDQ4MjMxNDcpLCAoMHg4NzlEN0YyMCksICgweEQ0MjNCMUREKSwgKDB4ODdCRkNDQkQpLCAoMHhEM0M1NEQ4MiksICgweDg3RTI2NDg4KSwgKDB4RDM2NzA0NkYpLCAoMHg4ODA1NDY2QSksICgweEQzMDhENkRFKSwgKDB4ODgyODcyNEYpLAotLy8oMHhEMkFBQzUwQSksICgweDg4NEJFODIwKSwgKDB4RDI0Q0NGMkQpLCAoMHg4ODZGQTdDOCksICgweEQxRUVGNTgxKSwgKDB4ODg5M0IxMzIpLCAoMHhEMTkxMzgzRiksICgweDg4QjgwNDQ2KSwgKDB4RDEzMzk3QTIpLCAoMHg4OERDQTBFRSksICgweEQwRDYxM0UzKSwgKDB4ODkwMTg3MTMpLCAoMHhEMDc4QUQzQyksICgweDg5MjZCNkEwKSwgKDB4RDAxQjYzRTYpLCAoMHg4OTRDMkY3RCksICgweENGQkUzOTA4KSwgKDB4ODk3MUYxMzIpLAotLy8oMHhDRjYxMkIwMSksICgweDg5OTdGQzY4KSwgKDB4Q0YwNDNBRjgpLCAoMHg4OUJFNTBBOCksICgweENFQTc2OTI3KSwgKDB4ODlFNEVEREIpLCAoMHhDRTRBQjVDNiksICgweDhBMEJEM0U4KSwgKDB4Q0RFRTIxMEUpLCAoMHg4QTMzMDJCOCksICgweENEOTFBQjM5KSwgKDB4OEE1QTdBMzIpLCAoMHhDRDM1NTQ4MCksICgweDhBODIzQTNGKSwgKDB4Q0NEOTFEMUMpLCAoMHg4QUFBNDJDNSksICgweENDN0QwNTQ1KSwgKDB4OEFEMjkzQUMpLAotLy8oMHhDQzIxMEQzNSksICgweDhBRkIyQ0RCKSwgKDB4Q0JDNTM1MjQpLCAoMHg4QjI0MEUzOCksICgweENCNjk3RDRCKSwgKDB4OEI0RDM3QUMpLCAoMHhDQjBERTZDQiksICgweDhCNzZBOEIyKSwgKDB4Q0FCMjcwMEIpLCAoMHg4QkEwNjIwNCksICgweENBNTcxQTJDKSwgKDB4OEJDQTYzMUYpLCAoMHhDOUZCRTU2NyksICgweDhCRjRBQkU5KSwgKDB4QzlBMEQxRjMpLCAoMHg4QzFGM0M0OSksICgweEM5NDVFMDBBKSwgKDB4OEM0QTE0MjMpLAotLy8oMHhDOEVCMEZFMyksICgweDhDNzUzMzVEKSwgKDB4Qzg5MDYxQjYpLCAoMHg4Q0EwOTlERSksICgweEM4MzVENUJCKSwgKDB4OENDQzQ3ODkpLCAoMHhDN0RCNkMyQSksICgweDhDRjgzQzQ0KSwgKDB4Qzc4MTI1M0IpLCAoMHg4RDI0NzdGNSksICgweEM3MjcwMTI2KSwgKDB4OEQ1MEZBN0YpLCAoMHhDNkNEMDAyMSksICgweDhEN0RDM0M3KSwgKDB4QzY3MzIyNjUpLCAoMHg4REFBRDNCMiksICgweEM2MTk2ODJBKSwgKDB4OEREODJBMjMpLAotLy8oMHhDNUJGRDFBNSksICgweDhFMDVDNkZGKSwgKDB4QzU2NjVGMEYpLCAoMHg4RTMzQUEyQSksICgweEM1MEQxMDlGKSwgKDB4OEU2MUQzODgpLCAoMHhDNEIzRTY4QyksICgweDhFOTA0MkZCKSwgKDB4QzQ1QUUxMEQpLCAoMHg4RUJFRjg2OCksICgweEM0MDIwMDU4KSwgKDB4OEVFREYzQjEpLCAoMHhDM0E5NDY2OSksICgweDhGMUQzM0M4KSwgKDB4QzM1MEFGRUUpLCAoMHg4RjRDQkE3MSksICgweEMyRjgzRUUxKSwgKDB4OEY3Qzg2QTApLAotLy8oMHhDMjlGRjM3QiksICgweDhGQUM5ODM2KSwgKDB4QzI0N0NERjApLCAoMHg4RkRDRUYxNiksICgweEMxRUZDRTc4KSwgKDB4OTAwRDhCMjEpLCAoMHhDMTk3RjU0OCksICgweDkwM0U2QzNCKSwgKDB4QzE0MDQyOTgpLCAoMHg5MDZGOTI0NSksICgweEMwRThCNjlDKSwgKDB4OTBBMEZEMjEpLCAoMHhDMDkxNTE4QiksICgweDkwRDJBQ0FGKSwgKDB4QzAzQTEzOUIpLCAoMHg5MTA0QTBEMiksICgweEJGRTJGRDAyKSwgKDB4OTEzNkQ5NkIpLAotLy8oMHhCRjhDMERGNiksICgweDkxNjk1NjVBKSwgKDB4QkYzNTQ2QUIpLCAoMHg5MTlDMTc4MSksICgweEJFREVBNzU4KSwgKDB4OTFDRjFDQzApLCAoMHhCRTg4MzAzMiksICgweDkyMDI2NUY4KSwgKDB4QkUzMUUxNkUpLCAoMHg5MjM1RjMwOSksICgweEJEREJCQjQyKSwgKDB4OTI2OUMzRDMpLCAoMHhCRDg1QkRFMiksICgweDkyOUREODM3KSwgKDB4QkQyRkU5ODUpLCAoMHg5MkQyMzAxMyksICgweEJDREEzRTVFKSwgKDB4OTMwNkNCNDkpLAotLy8oMHhCQzg0QkNBMiksICgweDkzM0JBOUI3KSwgKDB4QkMyRjY0ODcpLCAoMHg5MzcwQ0IzRCksICgweEJCREEzNjQxKSwgKDB4OTNBNjJGQkIpLCAoMHhCQjg1MzIwNSksICgweDkzREJENzBFKSwgKDB4QkIzMDU4MDYpLCAoMHg5NDExQzExNiksICgweEJBREJBODc5KSwgKDB4OTQ0N0VEQjMpLCAoMHhCQTg3MjU0MiksICgweDk0N0U1QkFCKSwgKDB4QkEzMkNCMzUpLCAoMHg5NEI1MEQwOSksICgweEI5REU5QzM4KSwgKDB4OTRFQzAwOTcpLAotLy8oMHhCOThBOTg3RCksICgweDk1MjMzNjMxKSwgKDB4QjkzNkMwMzkpLCAoMHg5NTVBQURCNiksICgweEI4RTMxMzlFKSwgKDB4OTU5MjY3MDUpLCAoMHhCODhGOTJFMiksICgweDk1Q0E2MUZBKSwgKDB4QjgzQzNFMzcpLCAoMHg5NjAyOUU3MyksICgweEI3RTkxNUQwKSwgKDB4OTYzQjFDNEQpLCAoMHhCNzk2MTlFMiksICgweDk2NzNEQjY2KSwgKDB4Qjc0MzRBOUUpLCAoMHg5NkFDREI5QSksICgweEI2RjBBODM5KSwgKDB4OTZFNjFDQzYpLAotLy8oMHhCNjlFMzJFNSksICgweDk3MUY5RUM4KSwgKDB4QjY0QkVBRDUpLCAoMHg5NzU5NjE3QiksICgweEI1RjlEMDNDKSwgKDB4OTc5MzY0QkMpLCAoMHhCNUE3RTM0RCksICgweDk3Q0RBODY3KSwgKDB4QjU1NjI0MzkpLCAoMHg5ODA4MkM1OCksICgweEI1MDQ5MzM0KSwgKDB4OTg0MkYwNkIpLCAoMHhCNEIzMzA3MCksICgweDk4N0RGNDdDKSwgKDB4QjQ2MUZDMUYpLCAoMHg5OEI5Mzg2NiksICgweEI0MTBGNjcyKSwgKDB4OThGNEJDMDYpLAotLy8oMHhCM0MwMUY5RCksICgweDk5MzA3RjM1KSwgKDB4QjM2Rjc3RDEpLCAoMHg5OTZDODFEMCksICgweEIzMUVGRjNGKSwgKDB4OTlBOEMzQjApLCAoMHhCMkNFQjYxQSksICgweDk5RTU0NEIyKSwgKDB4QjI3RTlDOTIpLCAoMHg5QTIyMDRCMCksICgweEIyMkVCMkRBKSwgKDB4OUE1RjAzODQpLCAoMHhCMURFRjkyMiksICgweDlBOUM0MTA5KSwgKDB4QjE4RjcxMzApLCAoMHg5QUQ5QkJERiksICgweEIxNDAxODBDKSwgKDB4OUIxNzc2NTIpLAotLy8oMHhCMEYwRUY3QiksICgweDlCNTU2RjA0KSwgKDB4QjBBMUY3QUYpLCAoMHg5QjkzQTVDRiksICgweEIwNTMzMEQ4KSwgKDB4OUJEMjFBOEMpLCAoMHhCMDA0OUIyNyksICgweDlDMTBDRDE1KSwgKDB4QUZCNjM2Q0QpLCAoMHg5QzRGQkQ0MyksICgweEFGNjgwM0Y5KSwgKDB4OUM4RUVBRUYpLCAoMHhBRjFBMDJEQyksICgweDlDQ0U1NUYzKSwgKDB4QUVDQzMzQTUpLCAoMHg5RDBERkUyNyksICgweEFFN0U5Njg2KSwgKDB4OUQ0REUzNjMpLAotLy8oMHhBRTMxMkJBRSksICgweDlEOEUwNTgxKSwgKDB4QURFM0YzNEQpLCAoMHg5RENFNjQ1OSksICgweEFEOTZFRDkxKSwgKDB4OUUwRUZGQzMpLCAoMHhBRDRBMUFBQyksICgweDlFNEZENzk4KSwgKDB4QUNGRDdBQ0MpLCAoMHg5RTkwRUJBRiksICgweEFDQjEwRTIwKSwgKDB4OUVEMjNCRTApLCAoMHhBQzY0RDREOCksICgweDlGMTNDODAzKSwgKDB4QUMxOENGMjIpLCAoMHg5RjU1OEZGMCksICgweEFCQ0NGRDJFKSwgKDB4OUY5NzkzN0QpLAotLy8oMHhBQjgxNUYyQSksICgweDlGRDlEMjgzKSwgKDB4QUIzNUY1NDUpLCAoMHhBMDFDNENEOCksICgweEFBRUFCRkFFKSwgKDB4QTA1RjAyNTMpLCAoMHhBQTlGQkU5MiksICgweEEwQTFGMkNDKSwgKDB4QUE1NEYyMjEpLCAoMHhBMEU1MUUxOCksICgweEFBMEE1QTg4KSwgKDB4QTEyODg0MEYpLCAoMHhBOUJGRjdGNSksICgweEExNkMyNDg3KSwgKDB4QTk3NUNDMEYpLCAoMHhBMUFGRkRGQyksICgweEE5MkJENDExKSwgKDB4QTFGNDEyRjcpLAotLy8oMHhBOEUyMTFBMiksICgweEEyMzg2MUY1KSwgKDB4QTg5ODg0RjEpLCAoMHhBMjdDRUFDRCksICgweEE4NEYyRTJBKSwgKDB4QTJDMUFENTMpLCAoMHhBODA2MEQ3QSksICgweEEzMDZBOTVFKSwgKDB4QTdCRDIzMTApLCAoMHhBMzRCREVDMyksICgweEE3NzQ2RjE3KSwgKDB4QTM5MTRENTcpLCAoMHhBNzJCRjFCQyksICgweEEzRDZGNEYwKSwgKDB4QTZFM0FCMkQpLCAoMHhBNDFDRDU2MiksICgweEE2OUI5Qjk2KSwgKDB4QTQ2MkVFODIpLAotLy8oMHhBNjUzQzMyMyksICgweEE0QTk0MDI2KSwgKDB4QTYwQzIyMDApLCAoMHhBNEVGQ0EyMSksICgweEE1QzRCODVCKSwgKDB4QTUzNjhDNDgpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwgKDB4QTUzNjhDMzYpLCAoMHhBNUM0Qjg2RCksICgweEE0RUZDQTBGKSwgKDB4QTYwQzIyMTMpLCAoMHhBNEE5NDAxNCksICgweEE2NTNDMzM1KSwgKDB4QTQ2MkVFNzApLCAoMHhBNjlCOUJBOCksICgweEE0MUNENTUwKSwgKDB4QTZFM0FCM0YpLAotLy8oMHhBM0Q2RjRERSksICgweEE3MkJGMUNGKSwgKDB4QTM5MTRENDYpLCAoMHhBNzc0NkYyOSksICgweEEzNEJERUIyKSwgKDB4QTdCRDIzMjIpLCAoMHhBMzA2QTk0RCksICgweEE4MDYwRDhEKSwgKDB4QTJDMUFENDIpLCAoMHhBODRGMkUzRCksICgweEEyN0NFQUJCKSwgKDB4QTg5ODg1MDQpLCAoMHhBMjM4NjFFNCksICgweEE4RTIxMUI1KSwgKDB4QTFGNDEyRTYpLCAoMHhBOTJCRDQyNCksICgweEExQUZGRjQ1KSwgKDB4QTk3NUNBQTkpLAotLy8oMHhBMTZDMjQ3NiksICgweEE5QkZGODA4KSwgKDB4QTEyODgzRkUpLCAoMHhBQTBBNUE5QiksICgweEEwRTUxRTA3KSwgKDB4QUE1NEYyMzQpLCAoMHhBMEExRjJCQiksICgweEFBOUZCRUE1KSwgKDB4QTA1RjAyNDIpLCAoMHhBQUVBQkZDMSksICgweEEwMUM0Q0M3KSwgKDB4QUIzNUY1NTkpLCAoMHg5RkQ5RDI3MiksICgweEFCODE1RjNFKSwgKDB4OUY5NzkzNkMpLCAoMHhBQkNDRkQ0MSksICgweDlGNTU4RkRGKSwgKDB4QUMxOENGMzUpLAotLy8oMHg5RjEzQzdGMiksICgweEFDNjRENEVCKSwgKDB4OUVEMjNCQ0YpLCAoMHhBQ0IxMEUzMyksICgweDlFOTBFQjlFKSwgKDB4QUNGRDdBREYpLCAoMHg5RTRGRDc4NyksICgweEFENEExQUMwKSwgKDB4OUUwRUZGQjMpLCAoMHhBRDk2RURBNSksICgweDlEQ0U2NDQ5KSwgKDB4QURFM0YzNjApLCAoMHg5RDhFMDU3MSksICgweEFFMzEyQkMyKSwgKDB4OUQ0REUzNTMpLCAoMHhBRTdFOTY5QSksICgweDlEMERGRTE2KSwgKDB4QUVDQzMzQjkpLAotLy8oMHg5Q0NFNTVFMyksICgweEFGMUEwMkVGKSwgKDB4OUM4RUVBREYpLCAoMHhBRjY4MDQwRCksICgweDlDNEZCRDMzKSwgKDB4QUZCNjM2RTEpLCAoMHg5QzEwQ0QwNSksICgweEIwMDQ5QjNCKSwgKDB4OUJEMjFBN0MpLCAoMHhCMDUzMzBFQyksICgweDlCOTNBNUJGKSwgKDB4QjBBMUY3QzMpLCAoMHg5QjU1NkVGNCksICgweEIwRjBFRjkwKSwgKDB4OUIxNzc2NDIpLCAoMHhCMTQwMTgyMCksICgweDlBRDlCRDA5KSwgKDB4QjE4RjZGQjApLAotLy8oMHg5QTlDNDBGOSksICgweEIxREVGOTM2KSwgKDB4OUE1RjAzNzUpLCAoMHhCMjJFQjJFRSksICgweDlBMjIwNEExKSwgKDB4QjI3RTlDQTYpLCAoMHg5OUU1NDRBMyksICgweEIyQ0VCNjJFKSwgKDB4OTlBOEMzQTEpLCAoMHhCMzFFRkY1NCksICgweDk5NkM4MUMwKSwgKDB4QjM2Rjc3RTUpLCAoMHg5OTMwN0YyNiksICgweEIzQzAxRkIyKSwgKDB4OThGNEJCRjYpLCAoMHhCNDEwRjY4NyksICgweDk4QjkzODU3KSwgKDB4QjQ2MUZDMzMpLAotLy8oMHg5ODdERjQ2RCksICgweEI0QjMzMDg1KSwgKDB4OTg0MkYwNUMpLCAoMHhCNTA0OTM0OSksICgweDk4MDgyQzQ5KSwgKDB4QjU1NjI0NEUpLCAoMHg5N0NEQTg1OCksICgweEI1QTdFMzYyKSwgKDB4OTc5MzY0QUQpLCAoMHhCNUY5RDA1MSksICgweDk3NTk2MTZDKSwgKDB4QjY0QkVBRUEpLCAoMHg5NzFGOUVCOSksICgweEI2OUUzMkZBKSwgKDB4OTZFNjFDQjgpLCAoMHhCNkYwQTg0RSksICgweDk2QUNEQjhCKSwgKDB4Qjc0MzRBQjMpLAotLy8oMHg5NjczREI1NyksICgweEI3OTYxOUY3KSwgKDB4OTYzQjFDM0YpLCAoMHhCN0U5MTVFNSksICgweDk2MDI5RTY0KSwgKDB4QjgzQzNFNEMpLCAoMHg5NUNBNjFFQiksICgweEI4OEY5MkY3KSwgKDB4OTU5MjY2RjcpLCAoMHhCOEUzMTNCNCksICgweDk1NUFBREE4KSwgKDB4QjkzNkMwNEUpLCAoMHg5NTIzMzYyMyksICgweEI5OEE5ODkzKSwgKDB4OTRFQzAwODkpLCAoMHhCOURFOUM0RCksICgweDk0QjUwRTEzKSwgKDB4QkEzMkM5OUUpLAotLy8oMHg5NDdFNUNCMyksICgweEJBODcyM0E5KSwgKDB4OTQ0N0VEQTUpLCAoMHhCQURCQTg4RiksICgweDk0MTFDMTA5KSwgKDB4QkIzMDU4MUIpLCAoMHg5M0RCRDcwMCksICgweEJCODUzMjFBKSwgKDB4OTNBNjJGQUQpLCAoMHhCQkRBMzY1NyksICgweDkzNzBDQjMwKSwgKDB4QkMyRjY0OUQpLCAoMHg5MzNCQTlBQSksICgweEJDODRCQ0I4KSwgKDB4OTMwNkNCM0MpLCAoMHhCQ0RBM0U3NCksICgweDkyRDIzMDA2KSwgKDB4QkQyRkU5OUIpLAotLy8oMHg5MjlERDgyOSksICgweEJEODVCREY4KSwgKDB4OTI2OUMzQzYpLCAoMHhCRERCQkI1OCksICgweDkyMzVGMkZDKSwgKDB4QkUzMUUxODQpLCAoMHg5MjAyNjVFQiksICgweEJFODgzMDQ4KSwgKDB4OTFDRjFDQjMpLCAoMHhCRURFQTc2RSksICgweDkxOUMxNzc0KSwgKDB4QkYzNTQ2QzEpLCAoMHg5MTY5NTY0RCksICgweEJGOEMwRTBDKSwgKDB4OTEzNkQ5NUUpLCAoMHhCRkUyRkQxOCksICgweDkxMDRBMEM1KSwgKDB4QzAzQTEzQjIpLAotLy8oMHg5MEQyQUNBMiksICgweEMwOTE1MUEyKSwgKDB4OTBBMEZEMTQpLCAoMHhDMEU4QjZCMiksICgweDkwNkY5MjM5KSwgKDB4QzE0MDQyQUUpLCAoMHg5MDNFNkMyRiksICgweEMxOTdGNTVGKSwgKDB4OTAwRDhCMTUpLCAoMHhDMUVGQ0U4RSksICgweDhGRENFRjA5KSwgKDB4QzI0N0NFMDcpLCAoMHg4RkFDOTgyOSksICgweEMyOUZGMzkxKSwgKDB4OEY3Qzg2OTQpLCAoMHhDMkY4M0VGOCksICgweDhGNENCQTY1KSwgKDB4QzM1MEIwMDQpLAotLy8oMHg4RjFEMzRBRCksICgweEMzQTk0NEJDKSwgKDB4OEVFREYzQTUpLCAoMHhDNDAyMDA2RiksICgweDhFQkVGODVDKSwgKDB4QzQ1QUUxMjMpLCAoMHg4RTkwNDJFRiksICgweEM0QjNFNkEzKSwgKDB4OEU2MUQzN0MpLCAoMHhDNTBEMTBCNiksICgweDhFMzNBQTFGKSwgKDB4QzU2NjVGMjYpLCAoMHg4RTA1QzZGNCksICgweEM1QkZEMUJDKSwgKDB4OEREODJBMTcpLCAoMHhDNjE5Njg0MCksICgweDhEQUFEM0E2KSwgKDB4QzY3MzIyN0MpLAotLy8oMHg4RDdEQzNCQiksICgweEM2Q0QwMDM4KSwgKDB4OEQ1MEZBNzMpLCAoMHhDNzI3MDEzRCksICgweDhEMjQ3N0U5KSwgKDB4Qzc4MTI1NTIpLCAoMHg4Q0Y4M0MzOSksICgweEM3REI2QzQxKSwgKDB4OENDQzQ3N0UpLCAoMHhDODM1RDVEMiksICgweDhDQTA5OUQzKSwgKDB4Qzg5MDYxQ0QpLCAoMHg4Qzc1MzM1MiksICgweEM4RUIwRkZBKSwgKDB4OEM0QTE0MTgpLCAoMHhDOTQ1RTAyMSksICgweDhDMUYzQzNFKSwgKDB4QzlBMEQyMEEpLAotLy8oMHg4QkY0QUJERiksICgweEM5RkJFNTdFKSwgKDB4OEJDQTYzMTQpLCAoMHhDQTU3MUE0MyksICgweDhCQTA2MUY5KSwgKDB4Q0FCMjcwMjIpLCAoMHg4Qjc2QThBNyksICgweENCMERFNkUyKSwgKDB4OEI0RDM3MzgpLCAoMHhDQjY5N0U0QyksICgweDhCMjQwREM1KSwgKDB4Q0JDNTM2MjUpLCAoMHg4QUZCMkM2OCksICgweENDMjEwRTM3KSwgKDB4OEFEMjkzM0EpLCAoMHhDQzdEMDY0NyksICgweDhBQUE0MjU0KSwgKDB4Q0NEOTFFMUUpLAotLy8oMHg4QTgyM0E5QSksICgweENEMzU1M0FEKSwgKDB4OEE1QTdBOEQpLCAoMHhDRDkxQUE2NiksICgweDhBMzMwMzEyKSwgKDB4Q0RFRTIwM0EpLCAoMHg4QTBCRDQ0MiksICgweENFNEFCNEYxKSwgKDB4ODlFNEVFMzQpLCAoMHhDRUE3Njg1MiksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLCAoMHg4OTk3RkNCRiksICgweENGNjEyQTJDKSwgKDB4ODk3MUYxODgpLCAoMHhDRkJFMzgzMyksICgweDg5NEMyRjczKSwgKDB4RDAxQjYzRkUpLAotLy8oMHg4OTI2QjY5NyksICgweEQwNzhBRDUzKSwgKDB4ODkwMTg3MEEpLCAoMHhEMEQ2MTNGQiksICgweDg4RENBMEU0KSwgKDB4RDEzMzk3QkEpLCAoMHg4OEI4MDQzQyksICgweEQxOTEzODU3KSwgKDB4ODg5M0IxMjgpLCAoMHhEMUVFRjU5OSksICgweDg4NkZBN0JGKSwgKDB4RDI0Q0NGNDUpLCAoMHg4ODRCRTgxNyksICgweEQyQUFDNTIyKSwgKDB4ODgyODcyNDYpLCAoMHhEMzA4RDZGNiksICgweDg4MDU0NjYxKSwgKDB4RDM2NzA0ODcpLAotLy8oMHg4N0UyNjQ3RiksICgweEQzQzU0RDlBKSwgKDB4ODdCRkNDQjUpLCAoMHhENDIzQjFGNSksICgweDg3OUQ3RjE4KSwgKDB4RDQ4MjMxNUYpLCAoMHg4NzdCN0JCRCksICgweEQ0RTBDQjlDKSwgKDB4ODc1OUMyQkEpLCAoMHhENTNGODA3NCksICgweDg3Mzg1NDI0KSwgKDB4RDU5RTRGQUEpLCAoMHg4NzE3MzAwRSksICgweEQ1RkQzOTA1KSwgKDB4ODZGNjU2OEUpLCAoMHhENjVDM0M0QSksICgweDg2RDVDN0I3KSwgKDB4RDZCQjU5M0YpLAotLy8oMHg4NkI1ODM5RSksICgweEQ3MUE4RkE4KSwgKDB4ODY5NThBRjkpLCAoMHhENzc5REQ2NiksICgweDg2NzVEQzk1KSwgKDB4RDdEOTQ2MDgpLCAoMHg4NjU2NzkyQSksICgweEQ4MzhDNzZGKSwgKDB4ODYzNzYwQ0MpLCAoMHhEODk4NjE2MCksICgweDg2MTg5MzhEKSwgKDB4RDhGODEzOUYpLCAoMHg4NUZBMTE4MCksICgweEQ5NTdEREYxKSwgKDB4ODVEQkRBQjgpLCAoMHhEOUI3QzAxQyksICgweDg1QkRFRjQ5KSwgKDB4REExN0I5RTUpLAotLy8oMHg4NUEwNEY0MyksICgweERBNzdDQjBGKSwgKDB4ODU4MkZBQkIpLCAoMHhEQUQ3RjM2MCksICgweDg1NjVGMUMxKSwgKDB4REIzODMyOUQpLCAoMHg4NTQ5MzQ2NyksICgweERCOTg4ODhBKSwgKDB4ODUyQ0MyQzApLCAoMHhEQkY4RjRFQyksICgweDg1MTA5Q0REKSwgKDB4REM1OTc3ODcpLCAoMHg4NEY0QzJDRiksICgweERDQkExMDIwKSwgKDB4ODREOTM0QTcpLCAoMHhERDFBQkU3QSksICgweDg0QkRGMjc3KSwgKDB4REQ3QjgyNUMpLAotLy8oMHg4NEEyRkM0RiksICgweEREREM1Qjg4KSwgKDB4ODQ4ODUyM0YpLCAoMHhERTNENDlDMyksICgweDg0NkRGNDVBKSwgKDB4REU5RTRDRDIpLCAoMHg4NDUzRTJBRCksICgweERFRkY2NDc4KSwgKDB4ODQzQTFENEIpLCAoMHhERjYwOTA3QSksICgweDg0MjBBNDQxKSwgKDB4REZDMUQwOUIpLCAoMHg4NDA3NzdBMiksICgweEUwMjMyNEEwKSwgKDB4ODNFRTk3N0EpLCAoMHhFMDg0OEM0QyksICgweDgzRDYwM0RDKSwgKDB4RTBFNjA3NjQpLAotLy8oMHg4M0JEQkNENCksICgweEUxNDc5NUFCKSwgKDB4ODNBNUMyRUMpLCAoMHhFMUE5MzRGNCksICgweDgzOEUxNTNFKSwgKDB4RTIwQUU4RTUpLCAoMHg4Mzc2QjQ1NCksICgweEUyNkNBRjUxKSwgKDB4ODM1RkEwM0MpLCAoMHhFMkNFODdGQiksICgweDgzNDhEOTA0KSwgKDB4RTMzMDcyQTcpLCAoMHg4MzMyNUVCQSksICgweEUzOTI2RjE5KSwgKDB4ODMxQzMxNkQpLCAoMHhFM0Y0N0QxNCksICgweDgzMDY1MTJBKSwgKDB4RTQ1NjlDNUMpLAotLy8oMHg4MkYwQkRGRSksICgweEU0QjhDQ0I0KSwgKDB4ODJEQjc3RjcpLCAoMHhFNTFCMERERiksICgweDgyQzY3RjIxKSwgKDB4RTU3RDVGQTIpLCAoMHg4MkIxRDM4QiksICgweEU1REZDMUJFKSwgKDB4ODI5RDc1NDApLCAoMHhFNjQyMzNGOSksICgweDgyODk2NDREKSwgKDB4RTZBNEI2MTQpLCAoMHg4Mjc1QTBCRSksICgweEU3MDc0N0Q0KSwgKDB4ODI2MjJBQTEpLCAoMHhFNzY5RThGQiksICgweDgyNEYwMjAwKSwgKDB4RTdDQzk5NEMpLAotLy8oMHg4MjNDMjZFNyksICgweEU4MkY1ODhDKSwgKDB4ODIyOTk5NjIpLCAoMHhFODkyMjY3QyksICgweDgyMTc1OTdEKSwgKDB4RThGNTAyREYpLCAoMHg4MjA1Njc0MyksICgweEU5NTdFRDdBKSwgKDB4ODFGM0MyQkYpLCAoMHhFOUJBRTYwRSksICgweDgxRTI2QkZCKSwgKDB4RUExREVDNUYpLCAoMHg4MUQxNjMwMyksICgweEVBODEwMDMwKSwgKDB4ODFDMEE3RTEpLCAoMHhFQUU0MjE0MyksICgweDgxQjAzQUEwKSwgKDB4RUI0NzRGNUMpLAotLy8oMHg4MUEwMUI0OCksICgweEVCQUE4QTNEKSwgKDB4ODE5MDRBMzUpLCAoMHhFQzBEQ0ZBRiksICgweDgxODBDNkNGKSwgKDB4RUM3MTIzNjgpLCAoMHg4MTcxOTE3MCksICgweEVDRDQ4MzMyKSwgKDB4ODE2MkFBMjIpLCAoMHhFRDM3RUVDRiksICgweDgxNTQxMEVGKSwgKDB4RUQ5QjY2MDIpLCAoMHg4MTQ1QzVERiksICgweEVERkVFODhFKSwgKDB4ODEzN0M4RkIpLCAoMHhFRTYyNzYzNCksICgweDgxMkExQTRDKSwgKDB4RUVDNjBFQjkpLAotLy8oMHg4MTFDQjlEQSksICgweEVGMjlCMUREKSwgKDB4ODEwRkE3QUQpLCAoMHhFRjhENUY2NSksICgweDgxMDJFM0NFKSwgKDB4RUZGMTE3MTEpLCAoMHg4MEY2NkU0NCksICgweEYwNTREOEE2KSwgKDB4ODBFQTQ3MTcpLCAoMHhGMEI4QTNFNSksICgweDgwREU2RTRGKSwgKDB4RjExQzc4OTEpLCAoMHg4MEQyRTNGMiksICgweEYxODA1NjZCKSwgKDB4ODBDN0E4MDkpLCAoMHhGMUU0M0QzOCksICgweDgwQkNCQTk5KSwgKDB4RjI0ODJDQjgpLAotLy8oMHg4MEIyMUJBQSksICgweEYyQUMyNEFGKSwgKDB4ODBBN0NCNDIpLCAoMHhGMzEwMjRERSksICgweDgwOURDOTY4KSwgKDB4RjM3NDJEMDgpLCAoMHg4MDk0MTYyMiksICgweEYzRDgzQ0VGKSwgKDB4ODA4QUIxNzUpLCAoMHhGNDNDNTQ1NiksICgweDgwODE5QjY4KSwgKDB4RjRBMDcyRkYpLCAoMHg4MDc4RDNGRiksICgweEY1MDQ5OEFCKSwgKDB4ODA3MDVCNDIpLCAoMHhGNTY4QzUxRSksICgweDgwNjgzMTM0KSwgKDB4RjVDQ0Y4MTkpLAotLy8oMHg4MDYwNTVEQiksICgweEY2MzEzMTVGKSwgKDB4ODA1OEM5M0IpLCAoMHhGNjk1NzBCMiksICgweDgwNTE4QjdFKSwgKDB4RjZGOUIzRDUpLCAoMHg4MDRBOUM1RSksICgweEY3NURGRTg3KSwgKDB4ODA0M0ZDMDUpLCAoMHhGN0MyNEU4RCksICgweDgwM0RBQTc3KSwgKDB4RjgyNkEzQTgpLCAoMHg4MDM3QTdCOCksICgweEY4OEFGRDlCKSwgKDB4ODAzMUYzQ0IpLCAoMHhGOEVGNUMyOCksICgweDgwMkM4RUI1KSwgKDB4Rjk1M0JGMTApLAotLy8oMHg4MDI3Nzg3OSksICgweEY5QjgyNjE1KSwgKDB4ODAyMkIxMTkpLCAoMHhGQTFDOTBGQiksICgweDgwMUUzODk5KSwgKDB4RkE4MEZGODIpLCAoMHg4MDFBMEVGQyksICgweEZBRTU3MTZEKSwgKDB4ODAxNjM0NDMpLCAoMHhGQjQ5RTY3RiksICgweDgwMTJBODcyKSwgKDB4RkJBRTVFNzgpLCAoMHg4MDBGNkI4QSksICgweEZDMTJEOTFCKSwgKDB4ODAwQzdEOEQpLCAoMHhGQzc3NTYyQSksICgweDgwMDlERTdFKSwgKDB4RkNEQkQ1NjgpLAotLy8oMHg4MDA3OEU1RiksICgweEZENDA1Njk1KSwgKDB4ODAwNThEMkYpLCAoMHhGREE0RDk3NSksICgweDgwMDNEQUYxKSwgKDB4RkUwOTVEQzgpLCAoMHg4MDAyNzdBNiksICgweEZFNkRFMzUyKSwgKDB4ODAwMTYzNEUpLCAoMHhGRUQyNjlEMyksICgweDgwMDA5REVBKSwgKDB4RkYzNkYxMEYpLCAoMHg4MDAwMjc3QiksICgweEZGOUI3OEM3KSwgKDB4MDAwMDAwMDkpLCAoMHg5RkM1QUMyOCksICgweDAwMDAwMDAxKSwgKDB4MDAwMDAyMDApLAotLy8oMHgwMDAwMDQwMCksICgweDgwMDBGRkQwKSwgKDB4MDAwMDAwMEEpLCAoMHgwMDAwMDAwOSksICgweDlGQzVFMUQ4KSwgKDB4OUZDNTZEQ0MpLCAoMHg4MDAwMjJEOCksICgweDlGQzJDQ0VDKSwgKDB4ODAwMEZGRDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMEEwKSwgKDB4ODAwMEZGNjgpLCAoMHgwMDAwMDAwMCksICgweEZGRkZGRkZGKSwgKDB4OEZGRkZDNjApLCAoMHgwMDAwMDQwMCksICgweDgwMDEyQjA4KSwgKDB4ODAwMEZGRDApLAotLy8oMHg4MDAwRjNBMCksICgweDgwMDEyOTkwKSwgKDB4OUZDNTdGQ0MpLCAoMHg5RkMxODFFOCksICgweDAwMDAwMDA0KSwgKDB4ODAwMEYzQzQpLCAoMHg4MDAxMjdEOSksICgweDgwMDEwRkQwKSwgKDB4MDAwMDAwMDkpLCAoMHhGRkZGRkZGRiksICgweDgwMDEyMEU4KSwgKDB4OUZDMEU5RTApLCAoMHg4MDAwRjNDOCksICgweDAwMDAwMDAyKSwgKDB4ODAwMTIzNzgpLCAoMHg4MDAwRjNDNCksICgweDgwMDBGM0EwKSwgKDB4RkZGRkZGRkYpLAotLy8oMHg4MDAwQzc3NCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg5RkMxMzRBNCksICgweDAwMDAwMDAyKSwgKDB4OUZDNUFDMjgpLCAoMHg4MDAwRjNBMCksICgweDAwMDAwMDAyKSwgKDB4ODAwMDIyRDgpLCAoMHgwMDAwMDAwMSksICgweDgwMDBGM0EwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAxMkFGOCksICgweDAwMDAwMDAyKSwgKDB4MDAwMDAwMDEpLCAoMHg5RkMwRDNCQyksICgweDgwMDBDNzc0KSwgKDB4OUZDMDc2MDApLAotLy8oMHgwMDAwMDAwMyksICgweDhGRkZGQ0IwKSwgKDB4MDAwMDAwMDIpLCAoMHg4MDAwQzlBMCksICgweDhGRkZGQzAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMTAxMDAwMCksICgweDAwMDAwMDAwKSwgKDB4ODAwMEY0MjApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAxKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwRkZDOCksICgweDAwMDAwMDA3KSwgKDB4ODAwMEYzRTgpLCAoMHg4MDAwNDJEOCksICgweDAwMDAwMDAwKSwgKDB4ODAwMEM3NkMpLAotLy8oMHg4MDAwRjNBMCksICgweDgwMDBDNzc0KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAxMDAwMCksICgweDAwMDAwMDAxKSwgKDB4ODAwMDIyRDgpLCAoMHg4MDAwMDU0OCksICgweDlGQzA2RTE4KSwgKDB4OUZDMDYzODApLCAoMHgwMDAwMDAwMCksICgweDgwMDAyMkQ4KSwgKDB4MDAwMDAwMDEpLCAoMHg4MDAwRjNBMCksICgweDhGRkZGRDYwKSwgKDB4ODAwMEYzQTApLCAoMHg4MDAwQzc2MCksICgweDAwMDAwMDAwKSwgKDB4ODAwMDA2NDgpLAotLy8oMHg4MDAwRjNBMCksICgweDhGRkZGRjg4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMjAwMCksICgweDgwMDA0MkQ4KSwgKDB4ODAwMDIyRDgpLCAoMHg5RkMwMzg2QyksICgweDlGQzAzODVDKSwgKDB4MDAwMDAwMDUpLCAoMHg4RkZGRkY4OCksICgweDlGQzYwQjk5KSwgKDB4ODAwMDA1NDgpLCAoMHg4MDAwMjEwOCksICgweDgwMDAyMTAwKSwgKDB4ODAwMDIxMDQpLCAoMHg4RkZGRkVFOCksICgweDgwMDAwNjQ4KSwgKDB4OUZDM0ZEM0MpLAotLy8oMHgwMDAwMDAwMCksICgweDgwMDAxNjk4KSwgKDB4OUZDNDdENDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDA0KSwgKDB4ODAwMDE4QzApLCAoMHg4RkZGRkUwMCksICgweDgwMDAxOEM0KSwgKDB4OUZDNjBBNTApLCAoMHgwMTA0MDIwMCksICgweDJFMzQyRTMxKSwgKDB4MDAwMDAwMzIpLCAoMHgwMDAwMDAxMSksICgweDhGRkZGRTAwKSwgKDB4OUZDNTI5ODQpLCAoMHg5RkM2MEE1QyksICgweDAwMDAwMDAwKSwgKDB4OEZGRkZFMDApLAotLy8oMHg5RkM1Mjk3OCksICgweDAxMDQwNDAwKSwgKDB4MkUzNDJFMzEpLCAoMHg5RkM2MDAzNCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg5RkM1Mjk4NCksICgweDlGQzUyOTkwKSwgKDB4MDAwMUYzMUYpLCAoMHg5RkM2MzBDNCksICgweDlGQzQ5NTI0KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDlGQzYzMTBDKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OUZDNEEyMTQpLCAoMHg4MDAwMThDMCksICgweDAwMDAwMDAxKSwgKDB4OUZDNDc0NjgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDEpLCAoMHg4RkZGRkVDOCksICgweDAwMDAwMDAwKSwgKDB4ODAwMDE5NzgpLAotLy8oMHg5RkM0N0Q0MCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OUZDNDc4M0MpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4ODAwMDE5NzgpLCAoMHgwMDAwMDAwMyksICgweDlGQzYzMDMwKSwgKDB4OUZDNjAwMDApLCAoMHgwMDAwMDAwMCksICgweDEwMDAwMDAwKSwgKDB4ODAwMDE2MTQpLCAoMHg4MDAwMTY5OCksICgweDlGQzQ4QjA4KSwgKDB4OUZDNjMwMTApLAotLy8oMHg5RkM2MzA3QyksICgweDlGQzYzMDAxKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OUZDNjM3MkMpLCAoMHgwMDAwMDAwNyksICgweDgwMDBCRDY4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwNSksICgweDhGRkZGRjg4KSwgKDB4MDAwMDAwMDApLCAoMHg5RkM0RDVFQyksICgweDAwMDAwMDAwKSwgKDB4MTAwMDAwMDApLAotLy8oMHg5RkM0OTI2NCksICgweDlGQzQ5MjU4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMiksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMSksICgweEZGRkZGRkZGKSwgKDB4MDAwMDAwMDUpLCAoMHg4RkZGRkY4OCksICgweDAwMDAwMDAwKSwgKDB4MTAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDIwMDAwMDAwKSwgKDB4OUZDMDE0QkMpLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4RkZGRkZBMSksICgweDhGRkZGRkREKSwgKDB4OEZGRkZGRTEpLCAoMHg4RkZGRkZGNCksICgweDhGRkZGRkY4KSwgKDB4MDAwMDAwMDApLCAoMHg2RjY4MkYwMCksICgweDZDMkY2NTZEKSwgKDB4NkQyRjY4NkYpLCAoMHg1MzJGNzQ2RSksICgweDczMkY0RTU2KSwgKDB4NDMyRjY1NjQpLAotLy8oMHg2ODVGNEI0NCksICgweDYzNjE2MTY1KSwgKDB4MkY2MzY1NjQpLCAoMHgyRjZFNjk2MiksICgweDQ0NjM2MTYxKSwgKDB4NjQ2RjYzNjUpLCAoMHg3MzVGNzI2NSksICgweDRDNUY2NTY0KSwgKDB4Nzg3NTZFNjkpLCAoMHg2NjY5MkQwMCksICgweDY1Njg3NDAwKSwgKDB4NzQ3MzY1NzQpLCAoMHg1RjMxMzQzNCksICgweDYxMkU2MzZDKSwgKDB4MDA3Mzc0NjQpLCAoMHgwMDY2NkYyRCksICgweDJFNzA2RDc0KSwgKDB4MDA3NjYxNzcpLAotLy8oMHg4RkI0MDA2MCksICgweDEwMDAwMDA4KSwgKDB4OEZCNTAwNjQpLCAoMHgwMjQwMzAyMSksICgweDBGRjEzRTQyKSwgKDB4MDI2MDM4MjEpLCAoMHgwMDQwQTAyMSksICgweDAwNjBBODIxKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDE1MDAwMDA3KSwgKDB4MDAwMDAwMDApLAotLy8oMHgxMDZCMDAwNyksICgweDAwMDAwMDAwKSwgKDB4MEJGMTQzNzkpLCAoMHgwMDAwMDAwMCksICgweDEwODBGRkY3KSwgKDB4MDAwMDAwMDApLCAoMHgwMkUwMzgyMSksICgweDAyQzAyMDIxKSwgKDB4MTQ0MEZGOTYpLCAoMHgwMkUwMjgyMSksICgweDAyODAyMDIxKSwgKDB4MTAwMEZGOTMpLCAoMHgwMkEwMjgyMSksICgweDhGQTYwMDI4KSwgKDB4OEZBNjAwMjgpLCAoMHg4RkE3MDAyQyksICgweDAwNDAyMDIxKSwgKDB4MDA2MDI4MjEpLAotLy8oMHgwMDQwOTAyMSksICgweDAwNjA5ODIxKSwgKDB4QUZBMjAwNjApLCAoMHgwRkYxNDFFRSksICgweDhDQzQyRDQ4KSwgKDB4OENDNTJENEMpLCAoMHgwRkYxNDRBRSksICgweDI0MDYwMDM2KSwgKDB4OEZBNDAwNjgpLCAoMHg4RkE1MDA2QyksICgweDAwNDAzMDIxKSwgKDB4MDA2MDM4MjEpLCAoMHg4RkIyMDA0MCksICgweDhGQjEwMDNDKSwgKDB4OEZCMDAwMzgpLCAoMHgwMDgwMTAyMSksICgweDAwQTAxODIxKSwgKDB4MDNFMDAwMDgpLAotLy8oMHgyN0JEMDA2MCksICgweDAwMDAyODIxKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4ODAwMEM2NjgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDUyMDgyNDUwKSwgKDB4M0VFRDE3MDUpLCAoMHhGMjBGRjhBMSksICgweDg5RjZFMTdGKSwgKDB4MTdEN0RDMDApLCAoMHgwOUI5RjJDMyksICgweDYzNzg5NjhDKSwgKDB4QUYwNjA3RjYpLAotLy8oMHhGREZERTBDOSksICgweDNDRTNERkVFKSwgKDB4NTE2ODIyOUUpLCAoMHg3Q0Y3OTczNCksICgweEY1RkZGNTZGKSwgKDB4MzA3MDAwOTMpLCAoMHgxMzVGNUM3NSksICgweEU2RDczRUVFKSwgKDB4NkU0MDBERjkpLCAoMHg1ODI1MkFDQiksICgweDU1NzMxMUNBKSwgKDB4NTUzOUIzMDMpLCAoMHg1NjU1NzM1NSksICgweEI2QkRBQ0VGKSwgKDB4NTlGOTQyOEQpLCAoMHg5QUU2MzAyMCksICgweDU1OEZGN0U3KSwgKDB4Nzk1NTgwNkQpLAotLy8oMHgwOUQ1NDlGMyksICgweDYwM0JGNUI3KSwgKDB4MzEzNDQxM0IpLCAoMHhCQ0E3QzFBQSksICgweEE5OEQxMzM5KSwgKDB4NTdCMjlDOTcpLCAoMHg1MEYxRkYwNyksICgweEU0QTEzOTgwKSwgKDB4RDA4ODFBMjEpLCAoMHhDMUZGRTMwQSksICgweEIwQTY2QzE5KSwgKDB4MTg0MTY0OTApLCAoMHgxNjBFMDIxNCksICgweEE1ODRDQkI1KSwgKDB4MDJBQUE4MkEpLCAoMHg3Mzk4MTM0MCksICgweDk2NEEyNERFKSwgKDB4NkU4MjlGQzQpLAotLy8oMHhERkQ2MjM2MCksICgweDRDM0JGMTUyKSwgKDB4Mzg3MjE1NzQpLCAoMHhENDZCQzkxMiksICgweEJCRDY1RjlEKSwgKDB4RTZGMDJDOUQpLCAoMHg4NjdDNkVFQyksICgweDQzRkFCNzI1KSwgKDB4QTQxNDQ0MTkpLCAoMHg2OUJCNkFBRiksICgweENFMjdCNzQ0KSwgKDB4MDIyMjQxQTkpLCAoMHgxRUI3RkREOCksICgweDFDQTZDQkMwKSwgKDB4QkJDQkMxMTEpLCAoMHhBNkZEMTQwMyksICgweDc2QzY4OEQ5KSwgKDB4QjQ3MTg2Q0IpLAotLy8oMHg1RTk4OTM2RCksICgweDlCQkY3RTJFKSwgKDB4OEI3RkJDRUMpLCAoMHg5REFGN0VGNSksICgweDdFM0E3OUYxKSwgKDB4OUM4OTZBQ0QpLCAoMHg2MjhGMjQ5QSksICgweERENkU1MUFGKSwgKDB4QUY3Mzk5NEIpLCAoMHg1OTY2OTk1RCksICgweEI3NjIwNTk3KSwgKDB4MzY5QjFFNTQpLCAoMHg3Q0VEQzc4NyksICgweEU3QjE1QjFGKSwgKDB4QjM2RjVGN0QpLCAoMHhCNUI3M0VGNiksICgweEQ3NkVFRUUyKSwgKDB4MTRFODYxODYpLAotLy8oMHhDMDVERjE0RSksICgweDgwNTBGMUZGKSwgKDB4MjE4QzIxMzEpLCAoMHhCRTI1OTQxQSksICgweDkwNDFDRDA2KSwgKDB4MUVFOEE5QzApLCAoMHhENTMwRkVERCksICgweDc0OTVDODA4KSwgKDB4Q0MxNTkyOTEpLCAoMHg0RUM4NUNBMyksICgweEVDM0M3MDRFKSwgKDB4MEI2NjMzQjMpLCAoMHg0RDk5MkQ0QiksICgweEVCMUI1Nzc0KSwgKDB4REZCOUQ1MDgpLCAoMHgxMTc4MzcxOSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MzcwMDAwMDApLCAoMHgwMDAwODBBMyksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OEM4NzJGMjQpLCAoMHgwRkYxMUIxMyksICgweDAyMDAyMDIxKSwgKDB4M0MwNjlGQzYpLAotLy8oMHgwMDYwMjgyMSksICgweDAwNjBBODIxKSwgKDB4MjRDMzJENDgpLCAoMHg4QzY2MDAwMCksICgweDAwODAzMDIxKSwgKDB4MEZGMTNBQTApLCAoMHgwMEEwMzgyMSksICgweDEwMDBGRkVDKSwgKDB4MDA0MDIwMjEpLCAoMHg4RkE2MDA2OCksICgweDBGRjEzRTQyKSwgKDB4OEZBNzAwNkMpLCAoMHgwMjAwMjAyMSksICgweDAwNjAyODIxKSwgKDB4MEZGMTQxRUUpLCAoMHgwMDYwODgyMSksICgweDA0NDAwMDE2KSwgKDB4MDIwMDIwMjEpLAotLy8oMHgzQzA1OUZDNiksICgweDhDQTYyRTc4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDVDNUQ0QTdGKSwgKDB4NUM4MDE2RkYpLCAoMHg1Q0EyQ0E3RiksICgweDVDQzU3NUZGKSwgKDB4NUNFODBGRkYpLCAoMHg1RDBBOTk3RiksICgweDVEMkQxQUZGKSwgKDB4NUQ0RjhCN0YpLAotLy8oMHg4Rjg3ODE1QyksICgweDAwNDAyMDIxKSwgKDB4MEZGMTNCRDApLCAoMHgwMDYwMjgyMSksICgweDAwNDAyMDIxKSwgKDB4MEZGMTNFNDUpLCAoMHgwMDYwMjgyMSksICgweDAyNzYyMDJBKSwgKDB4MDA0QjUwMEIpLCAoMHgyNDAzMDAwMSksICgweDE1NDNGRkU5KSwgKDB4NzE0QjU4MjApLCAoMHgwMDBGM0QwMCksICgweDAwMDAzMDIxKSwgKDB4MDBDMDEwMjEpLCAoMHgwM0UwMDAwOCksICgweDAxNEI2ODI1KSwgKDB4MDAwODYwQzApLAotLy8oMHgwMDAwNzAyMSksICgweDAwMDA3ODIxKSwgKDB4MDAwMDUwMjEpLCAoMHgxMDAwMDAxMyksICgweDNDMEIwMDQwKSwgKDB4MDA4QzE4MkIpLCAoMHg4RkZGNzU3MCksICgweEFFMjkwMDk0KSwgKDB4QUUxMTAwQTgpLCAoMHgxNTA3MDAyMyksICgweDhGRkY3NTgwKSwgKDB4OEUwRjAwOTgpLCAoMHg4REU1MDAyMCksICgweDUwQTAwMDIwKSwgKDB4QUZCMjAwMjApLCAoMHhBRkIxMDAxQyksICgweEFGQkYwMDI4KSwgKDB4QUZCMDAwMTgpLAotLy8oMHg4QzkwMDAyMCksICgweDAwQTA4ODIxKSwgKDB4OEUwMjAwMDgpLCAoMHg4Q0E1MDAwOCksICgweDBGRjAwM0E0KSwgKDB4MDAwMDMwMjEpLCAoMHgwNDQwMDAzMSksICgweDI0MDMwMDFEKSwgKDB4OEUyNjAwMDgpLCAoMHg4RTI1MDAwQyksICgweEFFMDYwMDA4KSwgKDB4QUUwNTAwMEMpLCAoMHgwRkYxMjNBQiksICgweDAwMDAwMDAwKSwgKDB4MDA0MDkwMjEpLCAoMHg4RTJBMDAxMCksICgweDJFNDkwMDAxKSwgKDB4MDAwQTQwMkIpLAotLy8oMHgxMDAwRkZFQSksICgweDAxMDkxMDI0KSwgKDB4OEUyNDAwMDgpLCAoMHg4RTI1MDAwQyksICgweDhFNjYwMDE4KSwgKDB4QUUwNTAwMEMpLCAoMHhBRTA0MDAwOCksICgweDhFMDcwMDBDKSwgKDB4OENDMzAwOTQpLCAoMHgwMDY3NTgyQSksICgweDhGQkYwMDI4KSwgKDB4QUNDNDAwOTApLCAoMHhBQ0M1MDA5NCksICgweDAyNDAxODIxKSwgKDB4OEZCRjAwMjgpLCAoMHg4RkIzMDAyNCksICgweDhGQjIwMDIwKSwgKDB4OEZCMTAwMUMpLAotLy8oMHgyN0E0MDA3MCksICgweDEyMDAwMDA1KSwgKDB4OEZBMjAwOTQpLCAoMHgwRkYxMUNEQiksICgweDAwMDAwMDAwKSwgKDB4QUM1MDAwMDApLCAoMHgyNDAyRkZGRiksICgweDhGQkYwMEJDKSwgKDB4MDAwMDAwMDApLCAoMHgxMDAwMDAwOSksICgweDhFNDMwMDAwKSwgKDB4MTIyMDAwMDYpLCAoMHgwMDAwMDAwMCksICgweDk2NEUwMDEwKSwgKDB4MjQwM0ZGRkYpLCAoMHgzNUNEMDA0MCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHhGRjdCMDAwMCksICgweDJFODA1MEYxKSwgKDB4MTAyMTQ0ODIpLCAoMHgxQkEwMDAwNSksICgweDAwMDBDMEZGKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MjQ2M0ZGRjgpLCAoMHgxMDYwMDAwRSksICgweDI3MDcwM0ZGKSwgKDB4MDA2MDEwMjcpLCAoMHgwMDY5MjgwNCksICgweDAwNDgxMDA2KSwgKDB4MDA2ODIwMDQpLCAoMHgwMDAyMTA0MiksICgweEI1NkRBOTc0KSwgKDB4Q0FDREIwN0MpLCAoMHg0RUUxQURENCksICgweEVGODU5QjM0KSwgKDB4ODlGNDdCNDcpLCAoMHg1MTVDMTU1QSksICgweDM4RDA2NzU3KSwgKDB4ODA1MEYxRkYpLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OEZGRjZGNTApLCAoMHg1NDQxNEMyMCksICgweDc1NzMyMDREKSwgKDB4NzI2RjcwNzApLCAoMHg4RkZGNkY2MCksICgweDAwMDAwMDBBKSwgKDB4MkQyRDIwMkEpLCAoMHg1NzQxNTIyMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwNjAyODIxKSwgKDB4MDI0MDMwMjEpLCAoMHgwRkYxM0QwMSksICgweDAyNjAzODIxKSwgKDB4MTAwMEZFRUYpLCAoMHgwMDQwMjAyMSksICgweDAyMDAyMDIxKSwgKDB4MDIyMDI4MjEpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHhBNDM3MDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEZGNzcwMDAwKSwgKDB4MkU4MDUwRjEpLCAoMHgxQTIxNDQ2MiksICgweDA0RDZENTgzKSwgKDB4NDAwMzEyODIpLAotLy8oMHg2NDY5QTczNSksICgweDBCNEM5OUEzKSwgKDB4MEFGODg1OTQpLCAoMHhGOTA5NjlENyksICgweDk2MTMxQzkyKSwgKDB4MDI1RUVBMTApLCAoMHgzQTFGRTQyMSksICgweDYxNEZGMzkwKSwgKDB4MUNGREMzMjcpLCAoMHhDMTc3RTA0RiksICgweEY0RDg3RTgyKSwgKDB4NzgyNTNGMzkpLCAoMHhCQjgzOUY5NCksICgweDk5OEIzRUIxKSwgKDB4ODBGMjgwOTgpLCAoMHhERjNGQUJDRCksICgweDI0RDg0MEFDKSwgKDB4QkE5NTMyMUMpLAotLy8oMHhEQzIxMUQyMCksICgweDE1MDQxOTQyKSwgKDB4NjE4NThBQkQpLCAoMHg1NDYwODRBMSksICgweEE3MEQyMTlDKSwgKDB4N0JENTIxMzUpLCAoMHg3ODA2MEY3MSksICgweEVBM0M4N0Q4KSwgKDB4M0ZBRjNBMjQpLCAoMHhFNEIyQzQyMSksICgweEI5OUQxNDUzKSwgKDB4Mjc0MUUyNjQpLCAoMHgyMjM5ODEzQSksICgweDI5NDREQTIwKSwgKDB4NDQxRUY3QzQpLCAoMHgwQkQwQjcyMCksICgweEVEODRFQTI2KSwgKDB4NzNFMEMwRDIpLAotLy8oMHg2NzhFMzAzOSksICgweDIxNDIwMTA5KSwgKDB4ODYwNzQ5MkUpLCAoMHgyOENFRjQ0MCksICgweDAyMjc2OEM4KSwgKDB4RjY4RTM2MTEpLCAoMHg4NEU4NEQ1NSksICgweDczMDA0QzA0KSwgKDB4RjlCNjYzMEUpLCAoMHg2NzdGRkE4RiksICgweDUzMENCMThGKSwgKDB4MkM0RUUzMTApLCAoMHhBQkM3NTM3QyksICgweDgyQ0ZEQkNCKSwgKDB4MTAwQzYzQTIpLCAoMHg4NzZENzVCQSksICgweEM2ODNGODg4KSwgKDB4MENEQzFFMUUpLAotLy8oMHhBNjAwRTgzMyksICgweDMzMDM2MDY2KSwgKDB4NDMwNTA0OUMpLCAoMHg0MDg5MDcxMyksICgweDlEMTI1MzJFKSwgKDB4N0I2RTJGRTIpLCAoMHhFMjQ0Q0MwOSksICgweDlGRkIyMDgyKSwgKDB4QUIzNzM1RDMpLCAoMHgwMDAwMDA4MCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OEQwNjJGOTApLCAoMHg4RDA3MkY5NCksICgweDAwNDAyMDIxKSwgKDB4MEZGMTNEMDEpLAotLy8oMHgwMDYwMjgyMSksICgweDAwNDAzMDIxKSwgKDB4MDIwMDIwMjEpLCAoMHgwMjIwMjgyMSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHhGMUZGN0EwMCksICgweEUyM0E4MDUwKSwgKDB4ODQxQTIxMTQpLCAoMHhDNTg4REE3NSksICgweDAyNDAwMTQzKSwgKDB4QUVENkFBRDcpLCAoMHg5NEMyNTQ1QiksICgweDNFNDYxNTZDKSwgKDB4MDVCRkRGMjcpLCAoMHhCMDgyMjA3NSksICgweEQyNEM3QkM0KSwgKDB4NjIxMjIwNTQpLAotLy8oMHg4Q0M0MUM0OSksICgweDJDNDE0OTcyKSwgKDB4ODBDNURBMEUpLCAoMHhEODRBMDA3QyksICgweDcxOUU3M0MwKSwgKDB4NzY1MDE0QjApLCAoMHgwQTM5MUJDOCksICgweDYwQTcwMjIzKSwgKDB4NTRDREE0NkIpLCAoMHg0NjA2RDQ1NSksICgweDM3QjZBNzM4KSwgKDB4RkZCQjdENzEpLCAoMHg1RkVERDEyRiksICgweEVFNDdGREM4KSwgKDB4M0RDNzkxM0YpLCAoMHhFQUVFRjdGRCksICgweDIxOURBREVDKSwgKDB4RjlFNTNGNUYpLAotLy8oMHhCM0Q4MkQ5RSksICgweEJCQjc5QkNCKSwgKDB4NDNBRDJBQUIpLCAoMHgwRTdBREJDMCksICgweEFCQkQwOTUyKSwgKDB4MUE2RUY0M0EpLCAoMHhDRDlCMkE5RCksICgweDcyMjJCMzY2KSwgKDB4OTc5RTg5RTkpLCAoMHgwMkM5MTEzRiksICgweDFENTExNDY2KSwgKDB4NTdBOTIyMDYpLCAoMHg0QTQxMjA3NSksICgweEZEMzFENzgzKSwgKDB4QTc1NDJFRkMpLCAoMHgyNEI3Njk3NSksICgweEI5OTk2MkM3KSwgKDB4MTlGMUQzNTYpLAotLy8oMHg5RDEyQzNDQiksICgweDZEMzdENTQyKSwgKDB4MjlFNzIxNEQpLCAoMHg4OTAwRjY0NSksICgweEIxNTRBRDRBKSwgKDB4RjA0N0Q5ODgpLCAoMHhGNTVFRTFENSksICgweEMwMEI2OTMyKSwgKDB4ODVBQ0U5MTIpLCAoMHg4MjA4QjFCOSksICgweDgwRTE0MTcwKSwgKDB4QTFENjdDM0YpLCAoMHgwNTgwMzVCMyksICgweEE0RkUzNkNBKSwgKDB4QTU4QUJBQ0MpLCAoMHhDM0U5ODMxQyksICgweDI3NTMxQjhDKSwgKDB4QURCQjg2OTgpLAotLy8oMHgwNjgwMUMxMiksICgweEFGQUVFQzhFKSwgKDB4QzMyNjkyOTEpLCAoMHg1QzJFMDFBMCksICgweDRBNjEwODdDKSwgKDB4NjBGMjFFN0IpLCAoMHg2QjkyQzY3MCksICgweEM5ODcyMzY0KSwgKDB4NDg0NjRDOTcpLCAoMHgzNDJFNjQ5OSksICgweEE2ODQ5QTQ4KSwgKDB4RjAzNDAwMkQpLCAoMHg0NDJCNDQ4OCksICgweDE2MEIwNDQyKSwgKDB4RUQ1MkNGNTApLCAoMHg0RDQzNkMwNSksICgweDY4NDFDNjAyKSwgKDB4QTE0RjhBODIpLAotLy8oMHg5QUMyMERERSksICgweDVCOTI1MUVFKSwgKDB4OEVEOTk4RDUpLCAoMHg5MkI2RUEyMiksICgweDVCMTM2QzRCKSwgKDB4OTdDMEE0NUIpLCAoMHg0NTlDOTRBNCksICgweENEOTU4M0MwKSwgKDB4NkM1ODlERjgpLCAoMHgzQzlBMTdDRCksICgweDkwNjYwMUJGKSwgKDB4ODRENjEyRTEpLCAoMHg2NzE3NkY1RiksICgweEU0N0Q1QTQ0KSwgKDB4MzczODZENUUpLCAoMHg5MkE0RDYxQiksICgweDI4QzUxM0ZCKSwgKDB4NkU5MTU5OUEpLAotLy8oMHg2NTNEQTE2RCksICgweEExOUMzOUMwKSwgKDB4NDI3NjkwQUQpLCAoMHg3MDA1NDYxQyksICgweEFCNkMxRUU0KSwgKDB4ODBCQUNDMkQpLCAoMHg3ODBBMThDNSksICgweDgyMkRDNzc0KSwgKDB4QjYwNDMwMzYpLCAoMHgwMDc4OUMxOCksICgweDEwNkM5NTA3KSwgKDB4NDEwM0E4NjQpLCAoMHhDNTExNTg1QiksICgweEYzRTlCN0Y4KSwgKDB4MjRENzlDNEQpLCAoMHgzMUIyMEVCNSksICgweEIxQzA0ODNFKSwgKDB4RTI1QzU2QjkpLAotLy8oMHg5Njk5MTA5NiksICgweDdDRDQxMjFGKSwgKDB4OEEzQjgzRjQpLCAoMHg3MDQyNzFDMiksICgweEI1QzI2QUNDKSwgKDB4MkIxMzFBRjApLCAoMHg4QjdGQkNFQyksICgweDlEQUY3RUY1KSwgKDB4N0UzQTc5RjEpLCAoMHg5Qzg5NkFDRCksICgweDYyOEYyNDlBKSwgKDB4REQ2RTUxQUYpLCAoMHhBRjczOTk0QiksICgweDU5NjY5OTVEKSwgKDB4Qjc2MjA1OTcpLCAoMHgzNjlCMUU1NCksICgweDdDRURDNzg3KSwgKDB4RTdCMTVCMUYpLAotLy8oMHhCMzZGNUY3RCksICgweEI1QjczRUY2KSwgKDB4RDc2RUVFRTIpLCAoMHgxNEU4NjE4NiksICgweENDMTU5MjkxKSwgKDB4NEVDODVDQTMpLCAoMHhFQzNDNzA0RSksICgweDBCNjYzM0IzKSwgKDB4NEQ5OTJENEIpLCAoMHhFQjFCNTc3NCksICgweERGQjlENTA4KSwgKDB4MTE3ODM3MTkpLCAoMHg3N0JCMTBCMCksICgweEZDREY4MzUwKSwgKDB4RDM0QTdDNjUpLCAoMHhFRjZFNTdCQiksICgweEVDRDU2QzY4KSwgKDB4OEVCN0NBMzYpLAotLy8oMHgyRjI2QjEzNiksICgweDU1NjMxMjY5KSwgKDB4RUYxMjEzRTEpLCAoMHhBNTZBQjg0NCksICgweEFBNEIxRDY0KSwgKDB4NjQzNDFFQTkpLCAoMHgwQ0U5REI0OCksICgweDQ2MEMyMTQ0KSwgKDB4QURDNTAyMDUpLCAoMHg1MTVDNDcyRiksICgweDEzNkFDMjE5KSwgKDB4NDcxNkNFRDEpLCAoMHhDOEI4Q0U0RSksICgweDFEMTY4MjEwKSwgKDB4OTIzMzRBODEpLCAoMHg5MERDOTEwQyksICgweDQ5QTAwMjIwKSwgKDB4RTVGMkM4MzEpLAotLy8oMHhCNjdEQzc4NSksICgweDNDNDk1MTc0KSwgKDB4MEQxRjRDMkEpLCAoMHgzQUQ3ODdGRCksICgweEU5QzlGQjI3KSwgKDB4N0RGQzI3MTMpLCAoMHhFQjM5QzRCMyksICgweDk2Rjc1RjE4KSwgKDB4QUNDM0I0MTApLCAoMHgwRkYxMjdDMyksICgweDAwMDAwMDAwKSwgKDB4OEUyQUIzRkMpLCAoMHgwMDBBNDgyNyksICgweDAwNEE0MDIxKSwgKDB4MDEwOTI4MjQpLCAoMHgwMEEyODgyMyksICgweEFGQkYwMDM0KSwgKDB4QUZCNzAwMkMpLAotLy8oMHhBRkI2MDAyOCksICgweEFGQjUwMDI0KSwgKDB4QUZCNDAwMjApLCAoMHhBRkIzMDAxQyksICgweEFGQjIwMDE4KSwgKDB4M0MxRTlGQzYpLCAoMHgwMDZCNTAyQiksICgweDUxNDAwMDAyKSwgKDB4QUUyM0JEQTApLCAoMHgyNDEyMDAxNiksICgweDBGRjAwN0U4KSwgKDB4MDI4MDIwMjEpLCAoMHgxMjQwMDAwNSksICgweDAyMDAxMDIxKSwgKDB4MDIxMTgwMjEpLCAoMHgwRkYxMjdDMyksICgweDAyMDAyMDIxKSwgKDB4MjQwN0ZGRkYpLAotLy8oMHgwMDUwMjAyMSksICgweDEwNDcwMDA0KSwgKDB4MDAwMDI4MjEpLCAoMHgzQzBCODAwMSksICgweDhDNjMwMDA0KSwgKDB4QUM4NjAwMDApLCAoMHgwMEMwMjAyMSksICgweDEwMDBGRkVCKSwgKDB4OENDNjAwMDApLCAoMHhBQzgwMDAwMCksICgweDBGRjBGRDI1KSwgKDB4MjQwNDAwMDIpLCAoMHgxQzBCODI2MCksICgweDAwMDAwMDAwKSwgKDB4MzNDN0Y3ODApLCAoMHgzM0Y1RTg0MCksICgweDM0MjNEOTQwKSwgKDB4MzQ1MUI5NDApLAotLy8oMHgzNDdGOTk0MCksICgweDM0QUQ2ODgwKSwgKDB4OEUwODAwMDgpLCAoMHhBRTA4MDAwNCksICgweDk2MEMwMDEwKSwgKDB4QUUwNDAwMDApLCAoMHgzNThBMDAwMiksICgweDMxNEJGRkZGKSwgKDB4MzE2OTEwMDApLCAoMHgzMTY0MDAwOCksICgweDk2MEQwMDEwKSwgKDB4MzFBNEZGRjcpLCAoMHhBNjA0MDAxMCksICgweDk2MEYwMDEwKSwgKDB4MzFFRUVGRkYpLCAoMHhBNjBFMDAxMCksICgweDhGQkYwMDE0KSwgKDB4OEZCMDAwMTApLAotLy8oMHg5NjRFMDAxMCksICgweDhFNEEwMDAwKSwgKDB4MTU0MDAwMUYpLCAoMHgwMEMwODgyMSksICgweDhFNTMwMDA4KSwgKDB4QUU1MzAwMDQpLCAoMHhBRTQ2MDAwMCksICgweDg2NDQwMDEyKSwgKDB4MTAwMDAwMTMpLCAoMHhBNjREMDAxMCksICgweDhFNDMwMDAwKSwgKDB4OEU1MTAwMDQpLCAoMHgyNDYyRkZGRiksICgweEFFNDIwMDAwKSwgKDB4QTIzNDAwMDApLCAoMHg5NjVGMDAxMCksICgweDUyOURBMEQ4KSwgKDB4QkMxODAwMTcpLAotLy8oMHgxOUFCODAzQiksICgweDgzRjAwMDIwKSwgKDB4NTBGMUZGMDcpLCAoMHhENEMwMkQ4MCksICgweEZDODgxQTIxKSwgKDB4QzFCRjAxMDApLCAoMHg1ODQxNjgwQiksICgweDEwM0IyQ0MwKSwgKDB4QjA0MkMyOEEpLCAoMHgyMzI0RThBOCksICgweDMxNTMxNDMwKSwgKDB4RUY3MUREMEUpLCAoMHg3QzFCOUQ4RSksICgweDA5OThDMjI4KSwgKDB4OEZGRjc2RjApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHg4RkZGNzcwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAzRTAwMDA4KSwgKDB4MjQwMkZGRkYpLCAoMHgxNTgwRkZGRCksICgweDAwMDAwMDAwKSwgKDB4MEJGMTQzNzkpLCAoMHgwMDAwMDAwMCksICgweDNDMEY3RkZGKSwgKDB4MzVFRkZGRkYpLCAoMHgxMjAwMDAyNCksICgweDhGQUEwNDlDKSwgKDB4MjdBNDAwMjApLCAoMHg4RkI1MDQ5OCksICgweDAyNDQ5ODIzKSwgKDB4MDJCMzI4MjEpLAotLy8oMHgzMTExMDAwOCksICgweDEyMjAwMDBDKSwgKDB4QjU2REE5NzQpLCAoMHhDQUNEQjA3QyksICgweDRFRTFBREQ0KSwgKDB4RUY4NTlCMzQpLCAoMHg4OUY0N0I0NyksICgweDUxNUMxNTVBKSwgKDB4MzhEMDY3NTcpLCAoMHg4MDUwRjFGRiksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHg4RkZGNzZCMCksICgweDAwNjAxMDIxKSwgKDB4MDNFMDAwMDgpLCAoMHgyN0JEMDAyOCksICgweDhGRkY3NkMwKSwgKDB4MDBBMDQwMjEpLCAoMHgwMEMwMzgyMSksICgweDE0NjAwMDNBKSwgKDB4OEZCNDAwMjApLCAoMHg4RkIzMDAxQyksICgweDhGQjIwMDE4KSwgKDB4OEZCMTAwMTQpLCAoMHg4RkIwMDAxMCksICgweDAzRTAwMDA4KSwgKDB4MjdCRDAwMjgpLCAoMHgyN0JERkZFMCksICgweDAyNDAyMDIxKSwgKDB4MDI2MDI4MjEpLAotLy8oMHgwRkYwMTE3OCksICgweDI2MzFGRkZGKSwgKDB4MTYyMEZGRjkpLCAoMHgyNjEwMDAwOCksICgweDI2OTQwMDAxKSwgKDB4MkE4MzAwMEMpLCAoMHg4MDAwMDk0OCksICgweDNGRkZGRkZGKSwgKDB4N0ZGRkZGRkQpLCAoMHg4MDAwMDc0OCksICgweDlGQzVERkM4KSwgKDB4NzY0MjMwRkMpLCAoMHgzMEZDNzY0MiksICgweDAwMDAwMDAwKSwgKDB4OEZCMzA0RUMpLCAoMHgyNkIyMDAwMyksICgweDI2NzEwMDAxKSwgKDB4MjQxNEZGRkMpLAotLy8oMHgwMjU0ODAyNCksICgweEFGQjEwNEVDKSwgKDB4OTIzMjAwMDApLCAoMHg4RTA2MDAwMCksICgweDcwQzNGODAyKSwgKDB4MjQ1OTAwMDEpLCAoMHhBRkI5MDRFQyksICgweDAzRjJDMDIxKSwgKDB4OTMzMjAwMDApLCAoMHgyNjVFRkZEMCksICgweDJGRDcwMDBBKSwgKDB4MTZFMEZGRjcpLCAoMHg5RkM0MDlEQyksICgweDlGQzQxQUU0KSwgKDB4OUZDNDFBRTQpLCAoMHg5RkM0MUFFNCksICgweDlGQzQxQUU0KSwgKDB4OUZDNDFBRTQpLAotLy8oMHg5RkM0MUFFNCksICgweDlGQzQxQUU0KSwgKDB4QTYwMEU4MzMpLCAoMHgzMzAzNjA2NiksICgweDQzMDUwNDlDKSwgKDB4NDA4OTA3MTMpLCAoMHg5RDEyNTMyRSksICgweDdCNkUyRkUyKSwgKDB4RTI0NENDMDkpLCAoMHg5RkZCMjA4MiksICgweDE0NjBGRkU5KSwgKDB4MDJBMDIwMjEpLCAoMHgwRkYwMTIxRSksICgweDAyNDAyMDIxKSwgKDB4MEZGMDExOEMpLCAoMHgwMDAwMjAyMSksICgweDhGQTU0MDE4KSwgKDB4MEZGMTQ0NUUpLAotLy8oMHgwMDAwNDgxMiksICgweDAwMDA4ODEwKSwgKDB4MDAwRDZBQzApLCAoMHgwMDgzMDAxOSksICgweDAxQTg4MDI1KSwgKDB4MDAxMDYwMDIpLCAoMHgwMDAwMzgxMCksICgweDAwMDAxMDEyKSwgKDB4NzE4MzAwMDEpLCAoMHgwMTYyNTAyMSksICgweDAxNEUyODIxKSwgKDB4MDAwMDg4MTIpLCAoMHgwMTRCNDAyQiksICgweDAwQUEzMDJCKSwgKDB4MDAwRjcwMDIpLCAoMHgwMDAwNTAxMCksICgweEJBMzY3MEYwKSwgKDB4Njk5MTk1QTIpLAotLy8oMHgxNzJEMkZEMCksICgweEJFMzg2RDUxKSwgKDB4QzRBRUE1MUMpLCAoMHgyQUE3N0Q3RCksICgweDhCNTFEM0I0KSwgKDB4Q0Y0OTBGRDkpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4ODg4MEIzODgpLCAoMHg0RDU5NkIyRCksICgweDM3RDc0RENGKSwgKDB4NTgxMzhCMzgpLAotLy8oMHg1QjdCQ0Q0RSksICgweEFFNkM0NDIyKSwgKDB4NEU1RDFBRjEpLCAoMHhERTczOTZBNSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMTAwRkVGNyksICgweDAwMDAwMEM4KSwgKDB4ODAwMEMwQzApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDEpLCAoMHgwMDAwMjFCMiksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDlGQzYzMDdDKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDA2MDAwMSksICgweDAwMDAwMDAxKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwQzBEMCksICgweDgwMDBDMDA4KSwgKDB4MDAwMDAwMDApLCAoMHg3MzZFNkY2MyksICgweDAwNjU2QzZGKSwgKDB4MDEwMEZFRjcpLCAoMHgwMDAwMDBDOCksICgweDgwMDBDMTg4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDA0MDIwMjEpLCAoMHgwMDYwMjgyMSksICgweDAyQzAzMDIxKSwgKDB4MEZGMTFBQkYpLAotLy8oMHgwMkUwMzgyMSksICgweDAwNDA4MDIxKSwgKDB4M0MwMjlGQzYpLCAoMHg4QzQ2MkU3MCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDgwMDBDNjY4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg1MjA4MjQ1MCksICgweDNFRUQxNzA1KSwgKDB4RjIwRkY4QTEpLCAoMHg4OUY2RTE3RiksICgweDE3RDdEQzAwKSwgKDB4MDlCOUYyQzMpLAotLy8oMHg2Mzc4OTY4QyksICgweEFGMDYwN0Y2KSwgKDB4RkRGREUwQzkpLCAoMHgzQ0UzREZFRSksICgweDUxNjgyMjlFKSwgKDB4N0NGNzk3MzQpLCAoMHhGNUZGRjU2RiksICgweDMwNzAwMDkzKSwgKDB4MTM1RjVDNzUpLCAoMHhFNkQ3M0VFRSksICgweDZFNDAwREY5KSwgKDB4NTgyNTJBQ0IpLCAoMHg1NTczMTFDQSksICgweDU1MzlCMzAzKSwgKDB4NTY1NTczNTUpLCAoMHhCNkJEQUNFRiksICgweDU5Rjk0MjhEKSwgKDB4OUFFNjMwMjApLAotLy8oMHg4MDAwQzBEMCksICgweDAwMDAwMDAwKSwgKDB4MDA3OTc0NzQpLCAoMHgyNDAzMDAwMSksICgweDAxMDBGRUY3KSwgKDB4MDAwMDAwQzgpLCAoMHg4MDAwQzI1MCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAyMUIyKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OUZDNjMwN0MpLCAoMHgwMDAwMDAwMCksICgweDAwMDgwMDAxKSwgKDB4MDAwMDAwMDEpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4ODAwMEMxOTgpLCAoMHgwMDAwMDAwMCksICgweDMwNzk3NDc0KSwgKDB4MTA0NzAwMDApLAotLy8oMHgwMTAwRkVGNyksICgweDAwMDAwNDA4KSwgKDB4MkEyQTJBMkEpLCAoMHgyQTJBMkEyQSksICgweDJBMkEyQTJBKSwgKDB4MkEyQTJBMkEpLCAoMHgyQTJBMkEyQSksICgweDJBMkEyQTJBKSwgKDB4MkEyQTJBMkEpLCAoMHgyQTJBMkEyQSksICgweDc3QkIxMEIwKSwgKDB4RkNERjgzNTApLCAoMHhEMzRBN0M2NSksICgweEVGNkU1N0JCKSwgKDB4RUNENTZDNjgpLCAoMHg4RUI3Q0EzNiksICgweDJGMjZCMTM2KSwgKDB4NTU2MzEyNjkpLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDM3MDAwMDAwKSwgKDB4MDAwMDgwQTMpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDhDODcyRjI0KSwgKDB4MEZGMTFCMTMpLAotLy8oMHgwMjAwMjAyMSksICgweDNDMDY5RkM2KSwgKDB4MDA2MDI4MjEpLCAoMHgwMDYwQTgyMSksICgweDI0QzMyRDQ4KSwgKDB4OEM2NjAwMDApLCAoMHgwMDgwMzAyMSksICgweDBGRjEzQUEwKSwgKDB4MDBBMDM4MjEpLCAoMHgxMDAwRkZFQyksICgweDAwNDAyMDIxKSwgKDB4OEZBNjAwNjgpLCAoMHgwRkYxM0U0MiksICgweDhGQTcwMDZDKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMSksICgweDAwMDAwMDAxKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMSksICgweDEwODAwMDA0KSwgKDB4MDEwMEZFRjcpLCAoMHgwMDAwMDE2OCksICgweDgwMDEyNTM4KSwgKDB4ODAwMTI1NDgpLCAoMHg4MDAxMjY0OCksICgweDgwMDEyNzQ4KSwgKDB4ODAwMTBGRDApLCAoMHg4MDAxMEZEMCksICgweDgwMDExMUQwKSwgKDB4ODAwMTEzRDApLCAoMHg4MDAxMTVEMCksICgweDgwMDExN0QwKSwgKDB4ODAwMTE5RDApLCAoMHg4MDAxMUJEMCksICgweDgwMDExREQwKSwgKDB4ODAwMTI3QzgpLAotLy8oMHg4MDAxMjdEOSksICgweDgwMDEyOTdBKSwgKDB4ODAwMTI5ODUpLCAoMHg4MDAwRkY3OCksICgweDgwMDBGRjA4KSwgKDB4ODAwMTFGRTApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgzNzAwMDAwMCksICgweDAwMDA4MEEzKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4RTA0MDAwMCksICgweDhDRTUwMDAwKSwgKDB4OENFNjAwMDQpLCAoMHgwRkYwMDNBMiksICgweDI0MTIwMDA1KSwgKDB4MDA0MDIwMjEpLCAoMHgxMDQwMDAwNCksICgweDAyMjAyODIxKSwgKDB4MEZGMTIzQUIpLCAoMHgwMDAwMDAwMCksICgweDAwNDA5MDIxKSwgKDB4OEUyQTAwMTApLAotLy8oMHgyRTQ5MDAwMSksICgweDAwMEE0MDJCKSwgKDB4MTAwMEZGRUEpLCAoMHgwMTA5MTAyNCksICgweDhFMjQwMDA4KSwgKDB4OEUyNTAwMEMpLCAoMHg4RTY2MDAxOCksICgweEFFMDUwMDBDKSwgKDB4QUUwNDAwMDgpLCAoMHg4RTA3MDAwQyksICgweDhDQzMwMDk0KSwgKDB4MDA2NzU4MkEpLCAoMHg4RkJGMDAyOCksICgweEFDQzQwMDkwKSwgKDB4QUNDNTAwOTQpLCAoMHgwMjQwMTgyMSksICgweDhGQkYwMDI4KSwgKDB4OEZCMzAwMjQpLAotLy8oMHg4RkIyMDAyMCksICgweDhGQjEwMDFDKSwgKDB4MjdBNDAwNzApLCAoMHgxMjAwMDAwNSksICgweDhGQTIwMDk0KSwgKDB4MEZGMTFDREIpLCAoMHgwMDAwMDAwMCksICgweEFDNTAwMDAwKSwgKDB4MjQwMkZGRkYpLCAoMHg4RkJGMDBCQyksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHhBNDM3MDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweEZGNzcwMDAwKSwgKDB4MDIyMDM4MjEpLCAoMHgwRkYxM0JEMCksICgweDAwNjAyODIxKSwgKDB4M0MwNDlGQzYpLCAoMHg4Qzg2MkY0MCksICgweDhDODcyRjQ0KSwgKDB4MDA2MDI4MjEpLCAoMHgwRkYxM0QwMSksICgweDhGRkY2RjUwKSwgKDB4NTQ0MTRDMjApLCAoMHg3NTczMjA0RCksICgweDcyNkY3MDcwKSwgKDB4OEZGRjZGNjApLCAoMHgwMDAwMDAwQSksICgweDJEMkQyMDJBKSwgKDB4NTc0MTUyMjApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg2NzhFMzAzOSksICgweDIxNDIwMTA5KSwgKDB4ODYwNzQ5MkUpLCAoMHgyOENFRjQ0MCksICgweDAyMjc2OEM4KSwgKDB4RjY4RTM2MTEpLCAoMHg4NEU4NEQ1NSksICgweDczMDA0QzA0KSwgKDB4RjlCNjYzMEUpLCAoMHg2NzdGRkE4RiksICgweDUzMENCMThGKSwgKDB4MkM0RUUzMTApLAotLy8oMHhBQkM3NTM3QyksICgweDgyQ0ZEQkNCKSwgKDB4MTAwQzYzQTIpLCAoMHg4NzZENzVCQSksICgweEM2ODNGODg4KSwgKDB4MENEQzFFMUUpLCAoMHhBNjAwRTgzMyksICgweDMzMDM2MDY2KSwgKDB4NDMwNTA0OUMpLCAoMHg0MDg5MDcxMyksICgweDlEMTI1MzJFKSwgKDB4N0I2RTJGRTIpLCAoMHhFMjQ0Q0MwOSksICgweDlGRkIyMDgyKSwgKDB4QUIzNzM1RDMpLCAoMHgwMDAwMDA4MCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEYxRkY3QTAwKSwgKDB4RTIzQTgwNTApLCAoMHg4NDFBMjExNCksICgweEM1ODhEQTc1KSwgKDB4MDI0MDAxNDMpLCAoMHhBRUQ2QUFENyksICgweDk0QzI1NDVCKSwgKDB4M0U0NjE1NkMpLCAoMHgwNUJGREYyNyksICgweEIwODIyMDc1KSwgKDB4RDI0QzdCQzQpLCAoMHg2MjEyMjA1NCksICgweENFREMwN0Y0KSwgKDB4RUFCMkRFMDApLAotLy8oMHgwNDVCQzFFOCksICgweDgyQjJBRTg2KSwgKDB4RTRCRjI4MjMpLCAoMHg5QTAxQjQ3QSksICgweDE3Njk0MzhFKSwgKDB4MDE1Qzc5ODYpLCAoMHhBNzBEMjE5QyksICgweDdCRDUyMTM1KSwgKDB4NzgwNjBGNzEpLCAoMHhFQTNDODdEOCksICgweDNGQUYzQTI0KSwgKDB4RTRCMkM0MjEpLCAoMHhCOTlEMTQ1MyksICgweDI3NDFFMjY0KSwgKDB4MjIzOTgxM0EpLCAoMHgyOTQ0REEyMCksICgweDQ0MUVGN0M0KSwgKDB4MEJEMEI3MjApLAotLy8oMHhFRDg0RUEyNiksICgweDczRTBDMEQyKSwgKDB4Njc4RTMwMzkpLCAoMHgyMTQyMDEwOSksICgweDg2MDc0OTJFKSwgKDB4MjhDRUY0NDApLCAoMHgwMjI3NjhDOCksICgweEY2OEUzNjExKSwgKDB4ODRFODRENTUpLCAoMHg3MzAwNEMwNCksICgweEY5QjY2MzBFKSwgKDB4Njc3RkZBOEYpLCAoMHg1MzBDQjE4RiksICgweDJDNEVFMzEwKSwgKDB4QUJDNzUzN0MpLCAoMHg4MkNGREJDQiksICgweDEwMEM2M0EyKSwgKDB4ODc2RDc1QkEpLAotLy8oMHhDNjgzRjg4OCksICgweDBDREMxRTFFKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEE2MDZGQjJBKSwgKDB4RTRDRTE1NTcpLCAoMHg3MzI0MDgyMCksICgweDgwMzdBOEI0KSwgKDB4QTFEODgwMzIpLCAoMHg3NUEzRjFDNyksICgweDMyQkIwMzcwKSwgKDB4NUY4NTAyNDIpLCAoMHgzN0I2QTczOCksICgweEZGQkI3RDcxKSwgKDB4NUZFREQxMkYpLCAoMHhFRTQ3RkRDOCksICgweDNEQzc5MTNGKSwgKDB4RUFFRUY3RkQpLAotLy8oMHgyMTlEQURFQyksICgweEY5RTUzRjVGKSwgKDB4QjNEODJEOUUpLCAoMHhCQkI3OUJDQiksICgweDQzQUQyQUFCKSwgKDB4MEU3QURCQzApLCAoMHhBQkJEMDk1MiksICgweDFBNkVGNDNBKSwgKDB4Q0Q5QjJBOUQpLCAoMHg3MjIyQjM2NiksICgweDk3OUU4OUU5KSwgKDB4MDJDOTExM0YpLCAoMHgxRDUxMTQ2NiksICgweDU3QTkyMjA2KSwgKDB4NEE0MTIwNzUpLCAoMHhGRDMxRDc4MyksICgweEE3NTQyRUZDKSwgKDB4MjRCNzY5NzUpLAotLy8oMHhCOTk5NjJDNyksICgweDE5RjFEMzU2KSwgKDB4OUQxMkMzQ0IpLCAoMHg2RDM3RDU0MiksICgweDI5RTcyMTREKSwgKDB4ODkwMEY2NDUpLCAoMHhCMTU0QUQ0QSksICgweEYwNDdEOTg4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAxMDEwMCksICgweDAwMDAwMDAwKSwgKDB4ODAwMEM5RTgpLCAoMHg4MDAwQ0JGMCksICgweDgwMDBDQ0QwKSwgKDB4ODAwMENEQjApLCAoMHg4MDAwQ0U5MCksICgweDAwMDAwMDAwKSwgKDB4MkYyNkIxMzYpLCAoMHg1NTYzMTI2OSksICgweEVGMTIxM0UxKSwgKDB4QTU2QUI4NDQpLAotLy8oMHhBQTRCMUQ2NCksICgweDY0MzQxRUE5KSwgKDB4MENFOURCNDgpLCAoMHg0NjBDMjE0NCksICgweEFEQzUwMjA1KSwgKDB4NTE1QzQ3MkYpLCAoMHgzMDRDMjlCRCksICgweDc2QUY4NzExKSwgKDB4NTU3Q0FEQjcpLCAoMHgyQTlCQkM4RSksICgweEU1MEUxNDVCKSwgKDB4OUMyMDMxRkQpLCAoMHhEOTEyMUE4QyksICgweEY1MUE5NkZEKSwgKDB4NDVDQ0JFQkYpLCAoMHg1Rjg4NDg3MSksICgweDY2REFFMjkxKSwgKDB4OTVBREM5RTUpLAotLy8oMHgzM0NGMzA0RCksICgweDIzQzg3RENFKSwgKDB4QTcwMTRGQjMpLCAoMHhGQjM1MUU3MSksICgweDhENjBGNjZGKSwgKDB4QkZENkRERDUpLCAoMHgxNTFGRTZGMSksICgweERDQzc5MzVBKSwgKDB4MENBQ0ZCRjApLCAoMHhFRTU1QTM3MSksICgweEJFNDZCNzU1KSwgKDB4MEY3OURDRDIpLCAoMHgyM0RGRjc2RCksICgweDgzREU3NkQ3KSwgKDB4OEIwRTNBRUUpLCAoMHhCMDFCRkI0NCksICgweDRFMzYxOUZBKSwgKDB4QTE5RjlFNjQpLAotLy8oMHg1NDlDQjE2QyksICgweDc0NjQ5RTY5KSwgKDB4RDhENDhBREUpLCAoMHgxMjUzQUVERCksICgweDgwNDEwRkQyKSwgKDB4NUIzNjg4OUQpLCAoMHg4ODBDRTFFNyksICgweDU2QzQ5OEU3KSwgKDB4QkQ0OTJBRDkpLCAoMHgwODk5RTQ1RiksICgweDgxNTZFNDFEKSwgKDB4NURBNTM5QkEpLCAoMHgwQUYzNUIyQyksICgweERCODlCQUFFKSwgKDB4QTEyOEM5NjYpLCAoMHhBMDJDRUFFRSksICgweDhCN0ZCQ0VDKSwgKDB4OURBRjdFRjUpLAotLy8oMHg3RTNBNzlGMSksICgweDlDODk2QUNEKSwgKDB4NjI4RjI0OUEpLCAoMHhERDZFNTFBRiksICgweEFGNzM5OTRCKSwgKDB4NTk2Njk5NUQpLCAoMHhCNzYyMDU5NyksICgweDM2OUIxRTU0KSwgKDB4N0NFREM3ODcpLCAoMHhFN0IxNUIxRiksICgweEIzNkY1RjdEKSwgKDB4QjVCNzNFRjYpLCAoMHhENzZFRUVFMiksICgweDE0RTg2MTg2KSwgKDB4Q0MxNTkyOTEpLCAoMHg0RUM4NUNBMyksICgweEVDM0M3MDRFKSwgKDB4MEI2NjMzQjMpLAotLy8oMHg0RDk5MkQ0QiksICgweEVCMUI1Nzc0KSwgKDB4REZCOUQ1MDgpLCAoMHgxMTc4MzcxOSksICgweDlENzA0OEU1KSwgKDB4QzEyNDU2OUUpLCAoMHhDQ0IwRTExMSksICgweDE1QjJCQjg2KSwgKDB4MTgzNzFEOUMpLCAoMHhCMkFCRDk0RCksICgweDhFQzY1NkIzKSwgKDB4QkYwMTA5OTUpLCAoMHg0NjUyMjBCQiksICgweEM2NkUxRkZDKSwgKDB4MkM2MUQzNTYpLCAoMHhBRkZCMTc2RCksICgweDg4MDY3RTIzKSwgKDB4Mzc5NkYwMDgpLAotLy8oMHhDOEQxMjhGMyksICgweEI2NjFBNUZBKSwgKDB4RjE5Q0U0RjApLCAoMHgzRjdEMDM0NSksICgweEU5N0U2MDMwKSwgKDB4NEFCQTkxQ0YpLCAoMHhERUVEQUIwQyksICgweDM1RkQxRDc3KSwgKDB4REQ2MzY0MzkpLCAoMHgyRjhCNzk0QyksICgweDc2NEUxRDMyKSwgKDB4N0E4RDBCMUIpLCAoMHg4RUFDQjI3RiksICgweDU3N0FENjdCKSwgKDB4MkIzRkUyQzUpLCAoMHg4QUNEMDI0QSksICgweEVERjVDNDJDKSwgKDB4RjFDQTk1MUMpLAotLy8oMHhCOThCNkQwNCksICgweDZEMTJCODY0KSwgKDB4NTBFNzREMDgpLCAoMHg3M0QxNTAzQiksICgweEM3RDNGNkE5KSwgKDB4MUYzNjVFOTcpLCAoMHhFMTM0MEU1OSksICgweDg5RDIxQjlEKSwgKDB4OUI3NTY3MzMpLCAoMHg5MDI0Q0Q1MCksICgweEUyQzdGRjUyKSwgKDB4RDlGMDYxRUYpLCAoMHg3NzE1MTM5MiksICgweEEwRTRBMDA0KSwgKDB4NjBCRTgyMEYpLCAoMHhDNzYwM0JBRiksICgweEE2MkUzREE5KSwgKDB4QTQwMEUxMUYpLAotLy8oMHgxNTUxMTFENCksICgweDkwMzBBMzc0KSwgKDB4MTQxODUxMjQpLCAoMHg4RDA0M0EwMCksICgweDUwOTQ1MjU4KSwgKDB4MjBBNjY1M0UpLCAoMHg4MjBEMDIwOCksICgweDAyMDI4MjA3KSwgKDB4MDEwMEZFRjcpLCAoMHgwMDAwMDBFMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDcpLCAoMHgwMDAwMDAzOCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMzgpLCAoMHgwMDAxMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotLy8oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDU0NDQyRDE4KSwgKDB4NDAxOTIxRkIpLCAoMHg4NkIyQTUyRSksICgweEJEQThCRDU5KSwgKDB4NjBERERDOEMpLCAoMHgzRTIxRUUzQikKLS8vfTsKK3N0YXRpYyBjb25zdCBJTlQgX190d2lkZGxlc19taXBzX2ZmdDMyXzEwMjRbXSA9IHsKKyAgICAoMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0ZGRjYyMTUpLCAoMHhGRjM2RjA3OCksICgweDdGRkQ4ODU5KSwKKyAgICAoMHhGRTZERTJFMCksICgweDdGRkE3MkQwKSwgKDB4RkRBNEQ5MjkpLCAoMHg3RkY2MjE4MSksICgweEZDREJENTQwKSwKKyAgICAoMHg3RkYwOTQ3NiksICgweEZDMTJEOTFCKSwgKDB4N0ZFOUNCQkUpLCAoMHhGQjQ5RTZBMyksICgweDdGRTFDNzZBKSwKKyAgICAoMHhGQTgwRkZDRSksICgweDdGRDg4NzhDKSwgKDB4RjlCODI2ODEpLCAoMHg3RkNFMEMzRCksICgweEY4RUY1Q0JDKSwKKyAgICAoMHg3RkMyNTU5NSksICgweEY4MjZBNDY0KSwgKDB4N0ZCNTYzQjIpLCAoMHhGNzVERkY2QiksICgweDdGQTczNkIyKSwKKyAgICAoMHhGNjk1NkZCNyksICgweDdGOTdDRUJCKSwgKDB4RjVDQ0Y3M0UpLCAoMHg3Rjg3MkJGMiksICgweEY1MDQ5ODAwKSwKKyAgICAoMHg3Rjc1NEU3RSksICgweEY0M0M1M0NCKSwgKDB4N0Y2MjM2OEQpLCAoMHhGMzc0MkM5RCksICgweDdGNERFNDUwKSwKKyAgICAoMHhGMkFDMjQ3MyksICgweDdGMzg1N0Y0KSwgKDB4RjFFNDNEMUMpLCAoMHg3RjIxOTFCMiksICgweEYxMUM3ODk1KSwKKyAgICAoMHg3RjA5OTFDMyksICgweEYwNTREOERBKSwgKDB4N0VGMDU4NjApLCAoMHhFRjhENUZDOCksICgweDdFRDVFNUM2KSwKKyAgICAoMHhFRUM2MEYzQyksICgweDdFQkEzQTM4KSwgKDB4RURGRUU5MzApLCAoMHg3RTlENTVGQiksICgweEVEMzdFRjkxKSwKKyAgICAoMHg3RTdGMzk1NCksICgweEVDNzEyNDRBKSwgKDB4N0U1RkU0OTApLCAoMHhFQkFBODk0NCksICgweDdFM0Y1ODAwKSwKKyAgICAoMHhFQUU0MjA4QSksICgweDdFMUQ5M0VBKSwgKDB4RUExREVCQzYpLCAoMHg3REZBOThBNyksICgweEU5NTdFRDAwKSwKKyAgICAoMHg3REQ2NjY4RCksICgweEU4OTIyNjIxKSwgKDB4N0RCMEZERjUpLCAoMHhFN0NDOTkxMiksICgweDdEOEE1RjNDKSwKKyAgICAoMHhFNzA3NDdCOSksICgweDdENjI4QUM3KSwgKDB4RTY0MjM0MUMpLCAoMHg3RDM5ODBFRCksICgweEU1N0Q1RkU0KSwKKyAgICAoMHg3RDBGNDIxNyksICgweEU0QjhDRDE2KSwgKDB4N0NFM0NFQjApLCAoMHhFM0Y0N0Q5NSksICgweDdDQjcyNzIxKSwKKyAgICAoMHhFMzMwNzM0NyksICgweDdDODk0QkRBKSwgKDB4RTI2Q0IwMTApLCAoMHg3QzVBM0Q1MiksICgweEUxQTkzNUYxKSwKKyAgICAoMHg3QzI5RkJFRiksICgweEUwRTYwNjhGKSwgKDB4N0JGODg4MzApLCAoMHhFMDIzMjNFQSksICgweDdCQzVFMjk2KSwKKyAgICAoMHhERjYwOTAwMiksICgweDdCOTIwQjg2KSwgKDB4REU5RTRDNUIpLCAoMHg3QjVEMDNBMSksICgweEREREM1QjRGKSwKKyAgICAoMHg3QjI2Q0I0OSksICgweEREMUFCRTQxKSwgKDB4N0FFRjYzMjUpLCAoMHhEQzU5Nzc4QiksICgweDdBQjZDQjlBKSwKKyAgICAoMHhEQjk4ODg4RSksICgweDdBN0QwNTU5KSwgKDB4REFEN0YzQTIpLCAoMHg3QTQyMTBERSksICgweERBMTdCQTYzKSwKKyAgICAoMHg3QTA1RUVBOCksICgweEQ5NTdERTZGKSwgKDB4NzlDODlGNzEpLCAoMHhEODk4NjIxQSksICgweDc5OEEyM0E4KSwKKyAgICAoMHhEN0Q5NDZDMyksICgweDc5NEE3QzExKSwgKDB4RDcxQThFQkEpLCAoMHg3OTA5QTkzNSksICgweEQ2NUMzQjk4KSwKKyAgICAoMHg3OEM3QUI5RSksICgweEQ1OUU0RUY5KSwgKDB4Nzg4NDg0MTkpLCAoMHhENEUwQ0IyOCksICgweDc4NDAzMzIxKSwKKyAgICAoMHhENDIzQjE4MSksICgweDc3RkFCOThBKSwgKDB4RDM2NzA0NEYpLCAoMHg3N0I0MTdENCksICgweEQyQUFDNEVCKSwKKyAgICAoMHg3NzZDNEVEOSksICgweEQxRUVGNTlEKSwgKDB4NzcyMzVGMzUpLCAoMHhEMTMzOTdGQSksICgweDc2RDk0OTgzKSwKKyAgICAoMHhEMDc4QUQ5MyksICgweDc2OEUwRUE5KSwgKDB4Q0ZCRTM4QUQpLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwKKyAgICAoMHg3NUY0MkMwQiksICgweENFNEFCNUE2KSwgKDB4NzVBNTg1RDkpLCAoMHhDRDkxQUI1NSksICgweDc1NTVCRDQ3KSwKKyAgICAoMHhDQ0Q5MUQzNyksICgweDc1MDREMzRDKSwgKDB4Q0MyMTBEOEIpLCAoMHg3NEIyQzg3QiksICgweENCNjk3REEwKSwKKyAgICAoMHg3NDVGOUREMyksICgweENBQjI2RkIyKSwgKDB4NzQwQjUzRUQpLCAoMHhDOUZCRTUwRSksICgweDczQjVFQkNGKSwKKyAgICAoMHhDOTQ1REZFQiksICgweDczNUY2NjJGKSwgKDB4Qzg5MDYxRDEpLCAoMHg3MzA3QzNDOSksICgweEM3REI2QzQ1KSwKKyAgICAoMHg3MkFGMDVBQiksICgweEM3MjcwMTdBKSwgKDB4NzI1NTJDNzkpLCAoMHhDNjczMjJCOSksICgweDcxRkEzOTQ4KSwKKyAgICAoMHhDNUJGRDIzMiksICgweDcxOUUyQ0RFKSwgKDB4QzUwRDExNjQpLCAoMHg3MTQxMDgwMCksICgweEM0NUFFMUQxKSwKKyAgICAoMHg3MEUyQ0JDRCksICgweEMzQTk0NUExKSwgKDB4NzA4Mzc4RjQpLCAoMHhDMkY4M0UxQiksICgweDcwMjMxMDlDKSwKKyAgICAoMHhDMjQ3Q0Q2MiksICgweDZGQzE5Mzc2KSwgKDB4QzE5N0Y0QkIpLCAoMHg2RjVGMDJDRiksICgweEMwRThCNjdFKSwKKyAgICAoMHg2RUZCNUYxRCksICgweEMwM0ExMzdFKSwgKDB4NkU5NkE5OTUpLCAoMHhCRjhDMEREOCksICgweDZFMzBFMzJGKSwKKyAgICAoMHhCRURFQTczQSksICgweDZEQ0EwRDI3KSwgKDB4QkUzMUUxQkYpLCAoMHg2RDYyMjdGQSksICgweEJEODVCRTMzKSwKKyAgICAoMHg2Q0Y5MzRFOCksICgweEJDREEzRUFFKSwgKDB4NkM4RjM1MzgpLCAoMHhCQzJGNjU0NCksICgweDZDMjQyOTY5KSwKKyAgICAoMHhCQjg1MzJDMCksICgweDZCQjgxMkM1KSwgKDB4QkFEQkE5MzQpLCAoMHg2QjRBRjI1OCksICgweEJBMzJDQTQyKSwKKyAgICAoMHg2QURDQzk3NiksICgweEI5OEE5N0Y2KSwgKDB4NkE2RDk4QTEpLCAoMHhCOEUzMTMxOCksICgweDY5RkQ2MTMyKSwKKyAgICAoMHhCODNDM0RCMSksICgweDY5OEMyNDg3KSwgKDB4Qjc5NjE5QzYpLCAoMHg2OTE5RTMyNiksICgweEI2RjBBODFEKSwKKyAgICAoMHg2OEE2OUU3MiksICgweEI2NEJFQUI5KSwgKDB4NjgzMjU3ODYpLCAoMHhCNUE3RTMzMSksICgweDY3QkQwRkNDKSwKKyAgICAoMHhCNTA0OTM4MCksICgweDY3NDZDN0QxKSwgKDB4QjQ2MUZDNkEpLCAoMHg2NkNGODEwMyksICgweEIzQzAxRkU5KSwKKyAgICAoMHg2NjU3M0NENSksICgweEIzMUVGRkYwKSwgKDB4NjVEREZCRDYpLCAoMHhCMjdFOUQ0MyksICgweDY1NjNCRjdFKSwKKyAgICAoMHhCMURFRjlEMiksICgweDY0RTg4OTRBKSwgKDB4QjE0MDE3OEMpLCAoMHg2NDZDNTlDQyksICgweEIwQTFGNzMwKSwKKyAgICAoMHg2M0VGMzI4NiksICgweEIwMDQ5QUE5KSwgKDB4NjM3MTE0QUIpLCAoMHhBRjY4MDM3QiksICgweDYyRjIwMUM0KSwKKyAgICAoMHhBRUNDMzM4QiksICgweDYyNzFGQTY5KSwgKDB4QUUzMTJCOTQpLCAoMHg2MUYxMDAyNyksICgweEFEOTZFRDc3KSwKKyAgICAoMHg2MTZGMTQ4RSksICgweEFDRkQ3QjEzKSwgKDB4NjBFQzM4M0EpLCAoMHhBQzY0RDUxRiksICgweDYwNjg2Q0MwKSwKKyAgICAoMHhBQkNDRkQ3NSksICgweDVGRTNCMzY2KSwgKDB4QUIzNUY1OEMpLCAoMHg1RjVFMERDOCksICgweEFBOUZCRjM4KSwKKyAgICAoMHg1RUQ3N0M4NiksICgweEFBMEE1QjJDKSwgKDB4NUU1MDAxNDApLCAoMHhBOTc1Q0IzOSksICgweDVEQzc5RDlDKSwKKyAgICAoMHhBOEUyMTEyQyksICgweDVEM0U1MjNFKSwgKDB4QTg0RjJEQjQpLCAoMHg1Q0I0MjBDRCksICgweEE3QkQyMjlBKSwKKyAgICAoMHg1QzI5MEFBMCksICgweEE3MkJGMTQ4KSwgKDB4NUI5RDExNjYpLCAoMHhBNjlCOUI3RCksICgweDVCMTAzNUM3KSwKKyAgICAoMHhBNjBDMjFFOCksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHg1OUYzREUzMCksICgweEE0RUZDQTUxKSwKKyAgICAoMHg1OTY0NjQ5QiksICgweEE0NjJFRUIyKSwgKDB4NThENDBFNzUpLCAoMHhBM0Q2RjUxRiksICgweDU4NDJERDdFKSwKKyAgICAoMHhBMzRCREY0QiksICgweDU3QjBEMjY1KSwgKDB4QTJDMUFEREEpLCAoMHg1NzFERUVFRCksICgweEEyMzg2MjdCKSwKKyAgICAoMHg1NjhBMzQ4MiksICgweEExQUZGRTgxKSwgKDB4NTVGNUE0RUQpLCAoMHhBMTI4ODM5MSksICgweDU1NjA0MEUyKSwKKyAgICAoMHhBMEExRjI0RiksICgweDU0Q0EwQTJFKSwgKDB4QTAxQzRDNUMpLCAoMHg1NDMzMDJBNSksICgweDlGOTc5MzU2KSwKKyAgICAoMHg1MzlCMkFGQiksICgweDlGMTNDN0RDKSwgKDB4NTMwMjg1MDcpLCAoMHg5RTkwRUI4OCksICgweDUyNjkxMjQxKSwKKyAgICAoMHg5RTBFRkY5RCksICgweDUxQ0VENDg2KSwgKDB4OUQ4RTA1QUQpLCAoMHg1MTMzQ0M4RiksICgweDlEMERGRTUyKSwKKyAgICAoMHg1MDk3RkMzQyksICgweDlDOEVFQjFBKSwgKDB4NEZGQjY1NzIpLCAoMHg5QzEwQ0Q5MCksICgweDRGNUUwOEVCKSwKKyAgICAoMHg5QjkzQTY0OSksICgweDRFQkZFODhGKSwgKDB4OUIxNzc2Q0IpLCAoMHg0RTIxMDVFNCksICgweDlBOUM0MDQ4KSwKKyAgICAoMHg0RDgxNjJEOCksICgweDlBMjIwNDNGKSwgKDB4NENFMTAwMkIpLCAoMHg5OUE4QzM0MCksICgweDRDM0ZERkNDKSwKKyAgICAoMHg5OTMwN0VDNSksICgweDRCOUUwM0IxKSwgKDB4OThCOTM4NDMpLCAoMHg0QUZCNkM5QiksICgweDk4NDJGMDQ4KSwKKyAgICAoMHg0QTU4MUM4MyksICgweDk3Q0RBODQ0KSwgKDB4NDlCNDE1NjIpLCAoMHg5NzU5NjFBMiksICgweDQ5MEY1N0ZGKSwKKyAgICAoMHg5NkU2MUNFRCksICgweDQ4NjlFNjU3KSwgKDB4OTY3M0RCOEMpLCAoMHg0N0MzQzIwMiksICgweDk2MDI5RTk5KSwKKyAgICAoMHg0NzFDRUQwNSksICgweDk1OTI2NzcyKSwgKDB4NDY3NTY4MjcpLCAoMHg5NTIzMzY5RCksICgweDQ1Q0QzNTZGKSwKKyAgICAoMHg5NEI1MEQ3NCksICgweDQ1MjQ1NkU5KSwgKDB4OTQ0N0VENEQpLCAoMHg0NDdBQ0Q1RCksICgweDkzREJENkFBKSwKKyAgICAoMHg0M0QwOUFEOSksICgweDkzNzBDQURBKSwgKDB4NDMyNUMxMDIpLCAoMHg5MzA2Q0FFNyksICgweDQyN0E0MTdEKSwKKyAgICAoMHg5MjlERDdENSksICgweDQxQ0UxRUNEKSwgKDB4OTIzNUYzMkMpLCAoMHg0MTIxNThFMyksICgweDkxQ0YxQ0UzKSwKKyAgICAoMHg0MDczRjI0NSksICgweDkxNjk1NjdEKSwgKDB4M0ZDNUVDQTApLCAoMHg5MTA0QTBGNCksICgweDNGMTc0OTlGKSwKKyAgICAoMHg5MEEwRkQ0MiksICgweDNFNjgwQUYzKSwgKDB4OTAzRTZDNUQpLCAoMHgzREI4MzI0QyksICgweDhGRENFRjM3KSwKKyAgICAoMHgzRDA3QzIzQyksICgweDhGN0M4NzNBKSwgKDB4M0M1NkJBQjUpLCAoMHg4RjFEMzQ2MSksICgweDNCQTUxRTREKSwKKyAgICAoMHg4RUJFRjgxMCksICgweDNBRjJFRUJBKSwgKDB4OEU2MUQzMzEpLCAoMHgzQTQwMkRCNCksICgweDhFMDVDNkFBKSwKKyAgICAoMHgzOThDRENGMyksICgweDhEQUFEMzVEKSwgKDB4MzhEOEZFMzIpLCAoMHg4RDUwRkEyQiksICgweDM4MjQ5NDEzKSwKKyAgICAoMHg4Q0Y4M0M2MiksICgweDM3NkY5RTg4KSwgKDB4OENBMDk5RkIpLCAoMHgzNkJBMjAzNCksICgweDhDNEExNDQwKSwKKyAgICAoMHgzNjA0MUFENyksICgweDhCRjRBQzA2KSwgKDB4MzU0RDkwMzMpLCAoMHg4QkEwNjIyMSksICgweDM0OTY4MjBBKSwKKyAgICAoMHg4QjREMzc1RiksICgweDMzREVGMjFGKSwgKDB4OEFGQjJDOEUpLCAoMHgzMzI2RTMyMyksICgweDhBQUE0MkUwKSwKKyAgICAoMHgzMjZFNTUwNSksICgweDhBNUE3QTREKSwgKDB4MzFCNTRBNzkpLCAoMHg4QTBCRDQwMyksICgweDMwRkJDNTQ3KSwKKyAgICAoMHg4OUJFNTBDMiksICgweDMwNDFDNzM3KSwgKDB4ODk3MUYxNEIpLCAoMHgyRjg3NTIxNiksICgweDg5MjZCNjVBKSwKKyAgICAoMHgyRUNDNjdBRiksICgweDg4RENBMEE5KSwgKDB4MkUxMTBBQkYpLCAoMHg4ODkzQjE0QSksICgweDJENTUzQjM1KSwKKyAgICAoMHg4ODRCRTgzOCksICgweDJDOThGQkQxKSwgKDB4ODgwNTQ2ODIpLCAoMHgyQkRDNEU2MyksICgweDg3QkZDQ0Q1KSwKKyAgICAoMHgyQjFGMzRCQyksICgweDg3N0I3QkREKSwgKDB4MkE2MUIwQUYpLCAoMHg4NzM4NTQ0MyksICgweDI5QTNDNDBGKSwKKyAgICAoMHg4NkY2NTZBQyksICgweDI4RTU3MUEzKSwgKDB4ODZCNTg0MEUpLCAoMHgyODI2Qjk1RSksICgweDg2NzVEQzYyKSwKKyAgICAoMHgyNzY3OUUwNiksICgweDg2Mzc2MDlBKSwgKDB4MjZBODIxNzQpLCAoMHg4NUZBMTE0RiksICgweDI1RTg0NTgxKSwKKyAgICAoMHg4NUJERUYxOSksICgweDI1MjgwQzA1KSwgKDB4ODU4MkZBOEMpLCAoMHgyNDY3NzdEMCksICgweDg1NDkzNDgyKSwKKyAgICAoMHgyM0E2ODhEMyksICgweDg1MTA5Q0Y3KSwgKDB4MjJFNTQxRTApLCAoMHg4NEQ5MzRDMCksICgweDIyMjNBNEQyKSwKKyAgICAoMHg4NEEyRkM2OCksICgweDIxNjFCMzg5KSwgKDB4ODQ2REY0NzIpLCAoMHgyMDlGNkZFMSksICgweDg0M0ExRDYyKSwKKyAgICAoMHgxRkRDREJCQiksICgweDg0MDc3N0I5KSwgKDB4MUYxOUY5RjApLCAoMHg4M0Q2MDQzMSksICgweDFFNTZDQTZFKSwKKyAgICAoMHg4M0E1QzJDNSksICgweDFEOTM1MDExKSwgKDB4ODM3NkI0MkUpLCAoMHgxQ0NGOENCQiksICgweDgzNDhEOERGKSwKKyAgICAoMHgxQzBCODI0RSksICgweDgzMUMzMTRBKSwgKDB4MUI0NzMyQUUpLCAoMHg4MkYwQkREQiksICgweDFBODI5RkMwKSwKKyAgICAoMHg4MkM2N0YwMCksICgweDE5QkRDQzYzKSwgKDB4ODI5RDc1NTMpLCAoMHgxOEY4Qjg4OCksICgweDgyNzVBMEQxKSwKKyAgICAoMHgxODMzNjcxMCksICgweDgyNEYwMjExKSwgKDB4MTc2REQ5RTEpLCAoMHg4MjI5OTk3NCksICgweDE2QTgxMkUzKSwKKyAgICAoMHg4MjA1Njc1NCksICgweDE1RTIxM0ZEKSwgKDB4ODFFMjZDMEIpLCAoMHgxNTFCREYxOSksICgweDgxQzBBN0YxKSwKKyAgICAoMHgxNDU1NzcxRCksICgweDgxQTAxQjgwKSwgKDB4MTM4RURCRjgpLCAoMHg4MTgwQzZCNiksICgweDEyQzgxMDkwKSwKKyAgICAoMHg4MTYyQUEwQSksICgweDEyMDExNkQyKSwgKDB4ODE0NUM1QzgpLCAoMHgxMTM5RjBBNyksICgweDgxMkExQTM2KSwKKyAgICAoMHgxMDcyOUZGQiksICgweDgxMEZBNzk4KSwgKDB4MEZBQjI2QjkpLCAoMHg4MEY2NkUzMCksICgweDBFRTM4N0NEKSwKKyAgICAoMHg4MERFNkU1QSksICgweDBFMUJDMzI2KSwgKDB4ODBDN0E4MTMpLCAoMHgwRDUzREJBRiksICgweDgwQjIxQkI0KSwKKyAgICAoMHgwQzhCRDM1NiksICgweDgwOURDOTcxKSwgKDB4MEJDM0FDMDcpLCAoMHg4MDhBQjE3RSksICgweDBBRkI2N0IyKSwKKyAgICAoMHg4MDc4RDQwNyksICgweDBBMzMwODQ0KSwgKDB4ODA2ODMxM0IpLCAoMHgwOTZBOTBBQiksICgweDgwNThDOTU1KSwKKyAgICAoMHgwOEEyMDBENyksICgweDgwNEE5QzUzKSwgKDB4MDdEOTVCQjYpLCAoMHg4MDNEQUE2RCksICgweDA3MTBBMzM3KSwKKyAgICAoMHg4MDMxRjNDMyksICgweDA2NDdEOTQ5KSwgKDB4ODAyNzc4NzEpLCAoMHgwNTdFRkZEQyksICgweDgwMUUzODkyKSwKKyAgICAoMHgwNEI2MThERiksICgweDgwMTYzNDNEKSwgKDB4MDNFRDI3NDMpLCAoMHg4MDBGNkI4RCksICgweDAzMjQyQUY2KSwKKyAgICAoMHg4MDA5REU4MSksICgweDAyNUIyNkU5KSwgKDB4ODAwNThEMzEpLCAoMHgwMTkyMUQwQyksICgweDgwMDI3N0E3KSwKKyAgICAoMHgwMEM5MEY0RiksICgweDgwMDA5REVCKSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksICgweEZGMzZGMEY1KSwKKyAgICAoMHg4MDAwOURFQiksICgweEZFNkRFMzM4KSwgKDB4ODAwMjc3QTYpLCAoMHhGREE0RDk1QiksICgweDgwMDU4RDJGKSwKKyAgICAoMHhGQ0RCRDU0RSksICgweDgwMDlERTdGKSwgKDB4RkMxMkQ5MDIpLCAoMHg4MDBGNkI4QSksICgweEZCNDlFNjY1KSwKKyAgICAoMHg4MDE2MzQ0NCksICgweEZBODBGRjY5KSwgKDB4ODAxRTM4OUEpLCAoMHhGOUI4MjZGQiksICgweDgwMjc3ODZFKSwKKyAgICAoMHhGOEVGNUQwRSksICgweDgwMzFGM0JGKSwgKDB4RjgyNkE0OEUpLCAoMHg4MDNEQUE2OSksICgweEY3NURGRjZEKSwKKyAgICAoMHg4MDRBOUM0RSksICgweEY2OTU2Rjk5KSwgKDB4ODA1OEM5NTApLCAoMHhGNUNDRjcwMSksICgweDgwNjgzMTRBKSwKKyAgICAoMHhGNTA0OTc5MyksICgweDgwNzhENDE4KSwgKDB4RjQzQzU0M0QpLCAoMHg4MDhBQjE3NyksICgweEYzNzQyQ0VFKSwKKyAgICAoMHg4MDlEQzk2QiksICgweEYyQUMyNDk1KSwgKDB4ODBCMjFCQUQpLCAoMHhGMUU0M0QxRSksICgweDgwQzdBODBDKSwKKyAgICAoMHhGMTFDNzg3NyksICgweDgwREU2RTUyKSwgKDB4RjA1NEQ4OEQpLCAoMHg4MEY2NkU0NyksICgweEVGOEQ1RjRCKSwKKyAgICAoMHg4MTBGQTdCMCksICgweEVFQzYwRjlEKSwgKDB4ODEyQTFBMkQpLCAoMHhFREZFRTk3MiksICgweDgxNDVDNUJFKSwKKyAgICAoMHhFRDM3RUZCMyksICgweDgxNjJBQTAwKSwgKDB4RUM3MTI0NEMpLCAoMHg4MTgwQzZBQiksICgweEVCQUE4OTI3KSwKKyAgICAoMHg4MUEwMUI3NSksICgweEVBRTQyMDJEKSwgKDB4ODFDMEE4MTApLCAoMHhFQTFERUI0QSksICgweDgxRTI2QzJDKSwKKyAgICAoMHhFOTU3RUQ2MSksICgweDgyMDU2NzQ4KSwgKDB4RTg5MjI2NjIpLCAoMHg4MjI5OTk2NyksICgweEU3Q0M5OTMzKSwKKyAgICAoMHg4MjRGMDIwNCksICgweEU3MDc0N0JCKSwgKDB4ODI3NUEwQzMpLCAoMHhFNjQyMzNFMCksICgweDgyOUQ3NTQ1KSwKKyAgICAoMHhFNTdENUY4OSksICgweDgyQzY3RjI3KSwgKDB4RTRCOENDOUIpLCAoMHg4MkYwQkUwMyksICgweEUzRjQ3REY1KSwKKyAgICAoMHg4MzFDMzEzQiksICgweEUzMzA3Mzg4KSwgKDB4ODM0OEQ4RDApLCAoMHhFMjZDQjAzMSksICgweDgzNzZCNDFFKSwKKyAgICAoMHhFMUE5MzVENCksICgweDgzQTVDMkI1KSwgKDB4RTBFNjA2NTMpLCAoMHg4M0Q2MDQyMCksICgweEUwMjMyMzhGKSwKKyAgICAoMHg4NDA3NzdFOCksICgweERGNjA4RjY5KSwgKDB4ODQzQTFEOTIpLCAoMHhERTlFNENCOSksICgweDg0NkRGNDYwKSwKKyAgICAoMHhERERDNUI2RiksICgweDg0QTJGQzU1KSwgKDB4REQxQUJFNjIpLCAoMHg4NEQ5MzRBRSksICgweERDNTk3NzZFKSwKKyAgICAoMHg4NTEwOUNFNCksICgweERCOTg4ODcyKSwgKDB4ODU0OTM0NkUpLCAoMHhEQUQ3RjM0OCksICgweDg1ODJGQUMyKSwKKyAgICAoMHhEQTE3QkFDMSksICgweDg1QkRFRjA1KSwgKDB4RDk1N0RFQ0QpLCAoMHg4NUZBMTEzQSksICgweEQ4OTg2MjNCKSwKKyAgICAoMHg4NjM3NjA4NSksICgweEQ3RDk0NkUzKSwgKDB4ODY3NURDNEQpLCAoMHhENzFBOEU5RCksICgweDg2QjU4M0Y4KSwKKyAgICAoMHhENjVDM0I0MCksICgweDg2RjY1NkU5KSwgKDB4RDU5RTRFQTApLCAoMHg4NzM4NTQ4MSksICgweEQ0RTBDQjg0KSwKKyAgICAoMHg4NzdCN0JDNiksICgweEQ0MjNCMUREKSwgKDB4ODdCRkNDQkQpLCAoMHhEMzY3MDQ2RiksICgweDg4MDU0NjZBKSwKKyAgICAoMHhEMkFBQzUwQSksICgweDg4NEJFODIwKSwgKDB4RDFFRUY1ODEpLCAoMHg4ODkzQjEzMiksICgweEQxMzM5N0EyKSwKKyAgICAoMHg4OERDQTBFRSksICgweEQwNzhBRDNDKSwgKDB4ODkyNkI2QTApLCAoMHhDRkJFMzkwOCksICgweDg5NzFGMTMyKSwKKyAgICAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4Q0U0QUI1QzYpLCAoMHg4QTBCRDNFOCksICgweENEOTFBQjM5KSwKKyAgICAoMHg4QTVBN0EzMiksICgweENDRDkxRDFDKSwgKDB4OEFBQTQyQzUpLCAoMHhDQzIxMEQzNSksICgweDhBRkIyQ0RCKSwKKyAgICAoMHhDQjY5N0Q0QiksICgweDhCNEQzN0FDKSwgKDB4Q0FCMjcwMEIpLCAoMHg4QkEwNjIwNCksICgweEM5RkJFNTY3KSwKKyAgICAoMHg4QkY0QUJFOSksICgweEM5NDVFMDBBKSwgKDB4OEM0QTE0MjMpLCAoMHhDODkwNjFCNiksICgweDhDQTA5OURFKSwKKyAgICAoMHhDN0RCNkMyQSksICgweDhDRjgzQzQ0KSwgKDB4QzcyNzAxMjYpLCAoMHg4RDUwRkE3RiksICgweEM2NzMyMjY1KSwKKyAgICAoMHg4REFBRDNCMiksICgweEM1QkZEMUE1KSwgKDB4OEUwNUM2RkYpLCAoMHhDNTBEMTA5RiksICgweDhFNjFEMzg4KSwKKyAgICAoMHhDNDVBRTEwRCksICgweDhFQkVGODY4KSwgKDB4QzNBOTQ2NjkpLCAoMHg4RjFEMzNDOCksICgweEMyRjgzRUUxKSwKKyAgICAoMHg4RjdDODZBMCksICgweEMyNDdDREYwKSwgKDB4OEZEQ0VGMTYpLCAoMHhDMTk3RjU0OCksICgweDkwM0U2QzNCKSwKKyAgICAoMHhDMEU4QjY5QyksICgweDkwQTBGRDIxKSwgKDB4QzAzQTEzOUIpLCAoMHg5MTA0QTBEMiksICgweEJGOEMwREY2KSwKKyAgICAoMHg5MTY5NTY1QSksICgweEJFREVBNzU4KSwgKDB4OTFDRjFDQzApLCAoMHhCRTMxRTE2RSksICgweDkyMzVGMzA5KSwKKyAgICAoMHhCRDg1QkRFMiksICgweDkyOUREODM3KSwgKDB4QkNEQTNFNUUpLCAoMHg5MzA2Q0I0OSksICgweEJDMkY2NDg3KSwKKyAgICAoMHg5MzcwQ0IzRCksICgweEJCODUzMjA1KSwgKDB4OTNEQkQ3MEUpLCAoMHhCQURCQTg3OSksICgweDk0NDdFREIzKSwKKyAgICAoMHhCQTMyQ0IzNSksICgweDk0QjUwRDA5KSwgKDB4Qjk4QTk4N0QpLCAoMHg5NTIzMzYzMSksICgweEI4RTMxMzlFKSwKKyAgICAoMHg5NTkyNjcwNSksICgweEI4M0MzRTM3KSwgKDB4OTYwMjlFNzMpLCAoMHhCNzk2MTlFMiksICgweDk2NzNEQjY2KSwKKyAgICAoMHhCNkYwQTgzOSksICgweDk2RTYxQ0M2KSwgKDB4QjY0QkVBRDUpLCAoMHg5NzU5NjE3QiksICgweEI1QTdFMzREKSwKKyAgICAoMHg5N0NEQTg2NyksICgweEI1MDQ5MzM0KSwgKDB4OTg0MkYwNkIpLCAoMHhCNDYxRkMxRiksICgweDk4QjkzODY2KSwKKyAgICAoMHhCM0MwMUY5RCksICgweDk5MzA3RjM1KSwgKDB4QjMxRUZGM0YpLCAoMHg5OUE4QzNCMCksICgweEIyN0U5QzkyKSwKKyAgICAoMHg5QTIyMDRCMCksICgweEIxREVGOTIyKSwgKDB4OUE5QzQxMDkpLCAoMHhCMTQwMTgwQyksICgweDlCMTc3NjUyKSwKKyAgICAoMHhCMEExRjdBRiksICgweDlCOTNBNUNGKSwgKDB4QjAwNDlCMjcpLCAoMHg5QzEwQ0QxNSksICgweEFGNjgwM0Y5KSwKKyAgICAoMHg5QzhFRUFFRiksICgweEFFQ0MzM0E1KSwgKDB4OUQwREZFMjcpLCAoMHhBRTMxMkJBRSksICgweDlEOEUwNTgxKSwKKyAgICAoMHhBRDk2RUQ5MSksICgweDlFMEVGRkMzKSwgKDB4QUNGRDdBQ0MpLCAoMHg5RTkwRUJBRiksICgweEFDNjRENEQ4KSwKKyAgICAoMHg5RjEzQzgwMyksICgweEFCQ0NGRDJFKSwgKDB4OUY5NzkzN0QpLCAoMHhBQjM1RjU0NSksICgweEEwMUM0Q0Q4KSwKKyAgICAoMHhBQTlGQkU5MiksICgweEEwQTFGMkNDKSwgKDB4QUEwQTVBODgpLCAoMHhBMTI4ODQwRiksICgweEE5NzVDQzBGKSwKKyAgICAoMHhBMUFGRkRGQyksICgweEE4RTIxMUEyKSwgKDB4QTIzODYxRjUpLCAoMHhBODRGMkUyQSksICgweEEyQzFBRDUzKSwKKyAgICAoMHhBN0JEMjMxMCksICgweEEzNEJERUMzKSwgKDB4QTcyQkYxQkMpLCAoMHhBM0Q2RjRGMCksICgweEE2OUI5Qjk2KSwKKyAgICAoMHhBNDYyRUU4MiksICgweEE2MEMyMjAwKSwgKDB4QTRFRkNBMjEpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwKKyAgICAoMHhBNEVGQ0EwRiksICgweEE2MEMyMjEzKSwgKDB4QTQ2MkVFNzApLCAoMHhBNjlCOUJBOCksICgweEEzRDZGNERFKSwKKyAgICAoMHhBNzJCRjFDRiksICgweEEzNEJERUIyKSwgKDB4QTdCRDIzMjIpLCAoMHhBMkMxQUQ0MiksICgweEE4NEYyRTNEKSwKKyAgICAoMHhBMjM4NjFFNCksICgweEE4RTIxMUI1KSwgKDB4QTFBRkZGNDUpLCAoMHhBOTc1Q0FBOSksICgweEExMjg4M0ZFKSwKKyAgICAoMHhBQTBBNUE5QiksICgweEEwQTFGMkJCKSwgKDB4QUE5RkJFQTUpLCAoMHhBMDFDNENDNyksICgweEFCMzVGNTU5KSwKKyAgICAoMHg5Rjk3OTM2QyksICgweEFCQ0NGRDQxKSwgKDB4OUYxM0M3RjIpLCAoMHhBQzY0RDRFQiksICgweDlFOTBFQjlFKSwKKyAgICAoMHhBQ0ZEN0FERiksICgweDlFMEVGRkIzKSwgKDB4QUQ5NkVEQTUpLCAoMHg5RDhFMDU3MSksICgweEFFMzEyQkMyKSwKKyAgICAoMHg5RDBERkUxNiksICgweEFFQ0MzM0I5KSwgKDB4OUM4RUVBREYpLCAoMHhBRjY4MDQwRCksICgweDlDMTBDRDA1KSwKKyAgICAoMHhCMDA0OUIzQiksICgweDlCOTNBNUJGKSwgKDB4QjBBMUY3QzMpLCAoMHg5QjE3NzY0MiksICgweEIxNDAxODIwKSwKKyAgICAoMHg5QTlDNDBGOSksICgweEIxREVGOTM2KSwgKDB4OUEyMjA0QTEpLCAoMHhCMjdFOUNBNiksICgweDk5QThDM0ExKSwKKyAgICAoMHhCMzFFRkY1NCksICgweDk5MzA3RjI2KSwgKDB4QjNDMDFGQjIpLCAoMHg5OEI5Mzg1NyksICgweEI0NjFGQzMzKSwKKyAgICAoMHg5ODQyRjA1QyksICgweEI1MDQ5MzQ5KSwgKDB4OTdDREE4NTgpLCAoMHhCNUE3RTM2MiksICgweDk3NTk2MTZDKSwKKyAgICAoMHhCNjRCRUFFQSksICgweDk2RTYxQ0I4KSwgKDB4QjZGMEE4NEUpLCAoMHg5NjczREI1NyksICgweEI3OTYxOUY3KSwKKyAgICAoMHg5NjAyOUU2NCksICgweEI4M0MzRTRDKSwgKDB4OTU5MjY2RjcpLCAoMHhCOEUzMTNCNCksICgweDk1MjMzNjIzKSwKKyAgICAoMHhCOThBOTg5MyksICgweDk0QjUwRTEzKSwgKDB4QkEzMkM5OUUpLCAoMHg5NDQ3RURBNSksICgweEJBREJBODhGKSwKKyAgICAoMHg5M0RCRDcwMCksICgweEJCODUzMjFBKSwgKDB4OTM3MENCMzApLCAoMHhCQzJGNjQ5RCksICgweDkzMDZDQjNDKSwKKyAgICAoMHhCQ0RBM0U3NCksICgweDkyOUREODI5KSwgKDB4QkQ4NUJERjgpLCAoMHg5MjM1RjJGQyksICgweEJFMzFFMTg0KSwKKyAgICAoMHg5MUNGMUNCMyksICgweEJFREVBNzZFKSwgKDB4OTE2OTU2NEQpLCAoMHhCRjhDMEUwQyksICgweDkxMDRBMEM1KSwKKyAgICAoMHhDMDNBMTNCMiksICgweDkwQTBGRDE0KSwgKDB4QzBFOEI2QjIpLCAoMHg5MDNFNkMyRiksICgweEMxOTdGNTVGKSwKKyAgICAoMHg4RkRDRUYwOSksICgweEMyNDdDRTA3KSwgKDB4OEY3Qzg2OTQpLCAoMHhDMkY4M0VGOCksICgweDhGMUQzNEFEKSwKKyAgICAoMHhDM0E5NDRCQyksICgweDhFQkVGODVDKSwgKDB4QzQ1QUUxMjMpLCAoMHg4RTYxRDM3QyksICgweEM1MEQxMEI2KSwKKyAgICAoMHg4RTA1QzZGNCksICgweEM1QkZEMUJDKSwgKDB4OERBQUQzQTYpLCAoMHhDNjczMjI3QyksICgweDhENTBGQTczKSwKKyAgICAoMHhDNzI3MDEzRCksICgweDhDRjgzQzM5KSwgKDB4QzdEQjZDNDEpLCAoMHg4Q0EwOTlEMyksICgweEM4OTA2MUNEKSwKKyAgICAoMHg4QzRBMTQxOCksICgweEM5NDVFMDIxKSwgKDB4OEJGNEFCREYpLCAoMHhDOUZCRTU3RSksICgweDhCQTA2MUY5KSwKKyAgICAoMHhDQUIyNzAyMiksICgweDhCNEQzNzM4KSwgKDB4Q0I2OTdFNEMpLCAoMHg4QUZCMkM2OCksICgweENDMjEwRTM3KSwKKyAgICAoMHg4QUFBNDI1NCksICgweENDRDkxRTFFKSwgKDB4OEE1QTdBOEQpLCAoMHhDRDkxQUE2NiksICgweDhBMEJENDQyKSwKKyAgICAoMHhDRTRBQjRGMSksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLCAoMHg4OTcxRjE4OCksICgweENGQkUzODMzKSwKKyAgICAoMHg4OTI2QjY5NyksICgweEQwNzhBRDUzKSwgKDB4ODhEQ0EwRTQpLCAoMHhEMTMzOTdCQSksICgweDg4OTNCMTI4KSwKKyAgICAoMHhEMUVFRjU5OSksICgweDg4NEJFODE3KSwgKDB4RDJBQUM1MjIpLCAoMHg4ODA1NDY2MSksICgweEQzNjcwNDg3KSwKKyAgICAoMHg4N0JGQ0NCNSksICgweEQ0MjNCMUY1KSwgKDB4ODc3QjdCQkQpLCAoMHhENEUwQ0I5QyksICgweDg3Mzg1NDI0KSwKKyAgICAoMHhENTlFNEZBQSksICgweDg2RjY1NjhFKSwgKDB4RDY1QzNDNEEpLCAoMHg4NkI1ODM5RSksICgweEQ3MUE4RkE4KSwKKyAgICAoMHg4Njc1REM5NSksICgweEQ3RDk0NjA4KSwgKDB4ODYzNzYwQ0MpLCAoMHhEODk4NjE2MCksICgweDg1RkExMTgwKSwKKyAgICAoMHhEOTU3RERGMSksICgweDg1QkRFRjQ5KSwgKDB4REExN0I5RTUpLCAoMHg4NTgyRkFCQiksICgweERBRDdGMzYwKSwKKyAgICAoMHg4NTQ5MzQ2NyksICgweERCOTg4ODhBKSwgKDB4ODUxMDlDREQpLCAoMHhEQzU5Nzc4NyksICgweDg0RDkzNEE3KSwKKyAgICAoMHhERDFBQkU3QSksICgweDg0QTJGQzRGKSwgKDB4REREQzVCODgpLCAoMHg4NDZERjQ1QSksICgweERFOUU0Q0QyKSwKKyAgICAoMHg4NDNBMUQ0QiksICgweERGNjA5MDdBKSwgKDB4ODQwNzc3QTIpLCAoMHhFMDIzMjRBMCksICgweDgzRDYwM0RDKSwKKyAgICAoMHhFMEU2MDc2NCksICgweDgzQTVDMkVDKSwgKDB4RTFBOTM0RjQpLCAoMHg4Mzc2QjQ1NCksICgweEUyNkNBRjUxKSwKKyAgICAoMHg4MzQ4RDkwNCksICgweEUzMzA3MkE3KSwgKDB4ODMxQzMxNkQpLCAoMHhFM0Y0N0QxNCksICgweDgyRjBCREZFKSwKKyAgICAoMHhFNEI4Q0NCNCksICgweDgyQzY3RjIxKSwgKDB4RTU3RDVGQTIpLCAoMHg4MjlENzU0MCksICgweEU2NDIzM0Y5KSwKKyAgICAoMHg4Mjc1QTBCRSksICgweEU3MDc0N0Q0KSwgKDB4ODI0RjAyMDApLCAoMHhFN0NDOTk0QyksICgweDgyMjk5OTYyKSwKKyAgICAoMHhFODkyMjY3QyksICgweDgyMDU2NzQzKSwgKDB4RTk1N0VEN0EpLCAoMHg4MUUyNkJGQiksICgweEVBMURFQzVGKSwKKyAgICAoMHg4MUMwQTdFMSksICgweEVBRTQyMTQzKSwgKDB4ODFBMDFCNDgpLCAoMHhFQkFBOEEzRCksICgweDgxODBDNkNGKSwKKyAgICAoMHhFQzcxMjM2OCksICgweDgxNjJBQTIyKSwgKDB4RUQzN0VFQ0YpLCAoMHg4MTQ1QzVERiksICgweEVERkVFODhFKSwKKyAgICAoMHg4MTJBMUE0QyksICgweEVFQzYwRUI5KSwgKDB4ODEwRkE3QUQpLCAoMHhFRjhENUY2NSksICgweDgwRjY2RTQ0KSwKKyAgICAoMHhGMDU0RDhBNiksICgweDgwREU2RTRGKSwgKDB4RjExQzc4OTEpLCAoMHg4MEM3QTgwOSksICgweEYxRTQzRDM4KSwKKyAgICAoMHg4MEIyMUJBQSksICgweEYyQUMyNEFGKSwgKDB4ODA5REM5NjgpLCAoMHhGMzc0MkQwOCksICgweDgwOEFCMTc1KSwKKyAgICAoMHhGNDNDNTQ1NiksICgweDgwNzhEM0ZGKSwgKDB4RjUwNDk4QUIpLCAoMHg4MDY4MzEzNCksICgweEY1Q0NGODE5KSwKKyAgICAoMHg4MDU4QzkzQiksICgweEY2OTU3MEIyKSwgKDB4ODA0QTlDNUUpLCAoMHhGNzVERkU4NyksICgweDgwM0RBQTc3KSwKKyAgICAoMHhGODI2QTNBOCksICgweDgwMzFGM0NCKSwgKDB4RjhFRjVDMjgpLCAoMHg4MDI3Nzg3OSksICgweEY5QjgyNjE1KSwKKyAgICAoMHg4MDFFMzg5OSksICgweEZBODBGRjgyKSwgKDB4ODAxNjM0NDMpLCAoMHhGQjQ5RTY3RiksICgweDgwMEY2QjhBKSwKKyAgICAoMHhGQzEyRDkxQiksICgweDgwMDlERTdFKSwgKDB4RkNEQkQ1NjgpLCAoMHg4MDA1OEQyRiksICgweEZEQTREOTc1KSwKKyAgICAoMHg4MDAyNzdBNiksICgweEZFNkRFMzUyKSwgKDB4ODAwMDlERUEpLCAoMHhGRjM2RjEwRiksICgweDY1NkRCQ0M4KSwKKyAgICAoMHg3QTkxMDhDQSksICgweEJBMzY3MEYwKSwgKDB4Njk5MTk1QTIpLCAoMHgxNzJEMkZEMCksICgweEJFMzg2RDUxKSwKKyAgICAoMHhDNEFFQTUxQyksICgweDJBQTc3RDdEKSwgKDB4OEI1MUQzQjQpLCAoMHhDRjQ5MEZEOSksICgweDRBN0JFQkNBKSwKKyAgICAoMHg5MTA3MkUwNCksICgweEExNzU4NzJEKSwgKDB4NTQ0NjRBOUUpLCAoMHg2N0E2Q0QwMiksICgweDlFODIwNEE4KSwKKyAgICAoMHgxMEMxNEJGNiksICgweDc1QUNEQTE2KSwgKDB4Rjc4RDdCM0UpLCAoMHg2QUIzQ0Y2OSksICgweEE0RDhDNzU2KSwKKyAgICAoMHhDQjhGQ0QyNCksICgweDc1Q0M1NzEzKSwgKDB4QzEzRTVBRTMpLCAoMHhBOEMzMTc2RCksICgweDVFRTZENDE2KSwKKyAgICAoMHg4MEM1REEwRSksICgweEQ4NEEwMDdDKSwgKDB4NzE5RTczQzApLCAoMHg3NjUwMTRCMCksICgweDBBMzkxQkM4KSwKKyAgICAoMHg2MEE3MDIyMyksICgweDU0Q0RBNDZCKSwgKDB4NDYwNkQ0NTUpLCAoMHhBNjA2RkIyQSksICgweEU0Q0UxNTU3KSwKKyAgICAoMHg3MzI0MDgyMCksICgweDgwMzdBOEI0KSwgKDB4QTFEODgwMzIpLCAoMHg3NUEzRjFDNyksICgweDMyQkIwMzcwKSwKKyAgICAoMHg1Rjg1MDI0MiksICgweDg1RUM4RjVCKSwgKDB4OEFBMkIzM0MpLCAoMHg5MUIzNzBDMiksICgweDkzOEU5RERCKSwKKyAgICAoMHhFNkI2OTgzRSksICgweDQ5NjAyQUE5KSwgKDB4NkMyRDk5NjUpLCAoMHg1QjE2QUU3MiksICgweDY5NTc5QjZCKSwKKyAgICAoMHhDRDNBQjQxNSksICgweDVCN0NGMDNDKSwgKDB4RDdCMjc2MzcpLCAoMHgyRDY5Qjc5QSksICgweDMyMzdCNDY4KSwKKyAgICAoMHg1Rjk0RDY1MCksICgweEFCMzcxMDZEKSwgKDB4MEI4MzE0NTcpLCAoMHhBRkQ4MDMzNCksICgweEI1QTBCMjdCKSwKKyAgICAoMHgxNkI3NjNFOSksICgweDNCNDU0NzU2KSwgKDB4MzE2N0NEOTgpLCAoMHg3MDcyMzlBRiksICgweDBBNEYxMzJBKSwKKyAgICAoMHgyNzgyQzhDQSksICgweDFBQzFERDRFKSwgKDB4MTIxQ0FERkUpLCAoMHg5QTkxMUQ5MCksICgweDAxNTdBREQ2KSwKKyAgICAoMHgxNTU5QkI5NSksICgweDI4NTRDODRBKSwgKDB4RDk3RTM2ODUpLCAoMHg3NjMwOEFBMCksICgweDgwNTBGMUZGKSwKKyAgICAoMHgyMTgwNjEyRiksICgweEZGRkI4QTFBKSwgKDB4MEJDMUZGRkYpLCAoMHgxMDMyODQ2QyksICgweDAwMkEzMEMyKSwKKyAgICAoMHg2NTRDNThGMiksICgweEE1OEFCQUNDKSwgKDB4QzNFOTgzMUMpLCAoMHgyNzUzMUI4QyksICgweEFEQkI4Njk4KSwKKyAgICAoMHgwNjgwMUMxMiksICgweEFGQUVFQzhFKSwgKDB4QzMyNjkyOTEpLCAoMHg1QzJFMDFBMCksICgweDRBNjEwODdDKSwKKyAgICAoMHg2MEYyMUU3QiksICgweDZCOTJDNjcwKSwgKDB4Qzk4NzIzNjQpLCAoMHg0ODQ2NEM5NyksICgweDM0MkU2NDk5KSwKKyAgICAoMHhBNjg0OUE0OCksICgweEYwMzQwMDJEKSwgKDB4NDQyQjQ0ODgpLCAoMHgxNjBCMDQ0MiksICgweEVENTJDRjUwKSwKKyAgICAoMHg0RDQzNkMwNSksICgweDY4NDFDNjAyKSwgKDB4QTE0RjhBODIpLCAoMHg5QUMyMERERSksICgweDVCOTI1MUVFKSwKKyAgICAoMHg4RUQ5OThENSksICgweDkyQjZFQTIyKSwgKDB4NUIxMzZDNEIpLCAoMHg5N0MwQTQ1QiksICgweDQ1OUM5NEE0KSwKKyAgICAoMHhDRDk1ODNDMCksICgweDZDNTg5REY4KSwgKDB4M0M5QTE3Q0QpLCAoMHg5MDY2MDFCRiksICgweDg0RDYxMkUxKSwKKyAgICAoMHg2NzE3NkY1RiksICgweEU0N0Q1QTQ0KSwgKDB4MzczODZENUUpLCAoMHg5MkE0RDYxQiksICgweDI4QzUxM0ZCKSwKKyAgICAoMHg2RTkxNTk5QSksICgweDY1M0RBMTZEKSwgKDB4QTE5QzM5QzApLCAoMHg0Mjc2OTBBRCksICgweDcwMDU0NjFDKSwKKyAgICAoMHhBQjZDMUVFNCksICgweDgwQkFDQzJEKSwgKDB4NzgwQTE4QzUpLCAoMHg4MjJEQzc3NCksICgweEI2MDQzMDM2KSwKKyAgICAoMHgwMDc4OUMxOCksICgweDEwNkM5NTA3KSwgKDB4NDEwM0E4NjQpLCAoMHhDNTExNTg1QiksICgweEYzRTlCN0Y4KSwKKyAgICAoMHgyNEQ3OUM0RCksICgweDMxQjIwRUI1KSwgKDB4QjFDMDQ4M0UpLCAoMHhFMjVDNTZCOSksICgweDk2OTkxMDk2KSwKKyAgICAoMHg3Q0Q0MTIxRiksICgweDhBM0I4M0Y0KSwgKDB4NzA0MjcxQzIpLCAoMHhCNUMyNkFDQyksICgweDJCMTMxQUYwKSwKKyAgICAoMHg1NDlDQjE2QyksICgweDc0NjQ5RTY5KSwgKDB4RDhENDhBREUpLCAoMHgxMjUzQUVERCksICgweDgwNDEwRkQyKSwKKyAgICAoMHg1QjM2ODg5RCksICgweDg4MENFMUU3KSwgKDB4NTZDNDk4RTcpLCAoMHhGQTJCQUFCMiksICgweEQ0MTU0RjVDKSwKKyAgICAoMHg3OTUxNkVFRCksICgweEE0MkZEQTdEKSwgKDB4Mjc4RDI4NzMpLCAoMHgxOTEyMTUzNSksICgweDlDNkVDNkM3KSwKKyAgICAoMHg0MDIzNDBDQiksICgweDVBNkEzMkIzKSwgKDB4RTQzNDVGMjcpLCAoMHg4REMyRDkwMSksICgweDAyRTdGODhFKSwKKyAgICAoMHg3QjNDNkJFQiksICgweEUwOTQ2QTRGKSwgKDB4OTQ1Mjg4NkMpLCAoMHhGRjJGNjE4NyksICgweDJGODA1MEYxKSwKKyAgICAoMHgyQTIxN0M2MSksICgweDBBQjIxNTk0KSwgKDB4ODAxMTQ1QzQpLCAoMHgxQ0YyMDBBNSksICgweDgyQzU0NEYxKSwKKyAgICAoMHhDRjNDNTBCMCksICgweEQ1NzdGRUY3KSwgKDB4NjBBRDNDNkUpLCAoMHg5MUFGRjc5RSksICgweDA3MDcyM0IzKSwKKyAgICAoMHg1ODcwRUNGNiksICgweDY0QzIyNEUyKSwgKDB4MjRGQjFFQzgpLCAoMHhDMzQ4MTA0OCksICgweDE1MUFCRjNDKSwKKyAgICAoMHgxMzZBQzIxOSksICgweDQ3MTZDRUQxKSwgKDB4QzhCOENFNEUpLCAoMHgxRDE2ODIxMCksICgweDkyMzM0QTgxKSwKKyAgICAoMHg5MERDOTEwQyksICgweDQ5QTAwMjIwKSwgKDB4RTVGMkM4MzEpLCAoMHhCNjdEQzc4NSksICgweDNDNDk1MTc0KSwKKyAgICAoMHgwRDFGNEMyQSksICgweDNBRDc4N0ZEKSwgKDB4RTlDOUZCMjcpLCAoMHg3REZDMjcxMyksICgweEVCMzlDNEIzKSwKKyAgICAoMHg5NkY3NUYxOCksICgweDg4M0NDQzQ3KSwgKDB4OTEzOTBCRDEpLCAoMHgwRUUyNUY2RCksICgweDZCNjg4RUYwKSwKKyAgICAoMHgyQzg1NTdEQyksICgweEU4MEM5MTcyKSwgKDB4REU2M0RFMDYpLCAoMHgzRTFCNzA3QiksICgweEIyQ0YyRTc2KSwKKyAgICAoMHg0OTBEMURGMyksICgweENEMUI1MUUxKSwgKDB4QzIyOEYwRjkpLCAoMHhFRUUyQTAwQSksICgweDA4MUQ4MzRBKSwKKyAgICAoMHgxRDJDMTQwMyksICgweDA4M0ZFOTQwKSwgKDB4NzYxNEVEQTApLCAoMHg4MjgyMDk1QSksICgweEE3QzA4ODIxKSwKKyAgICAoMHg0Q0Q0N0QyMCksICgweDMyMjk5MTkxKSwgKDB4NTJBMDMwRTYpLCAoMHhERjdDQjc2RSksICgweDIzMkVENDRCKSwKKyAgICAoMHg4REFBMTUwQSksICgweDFCNTkzQzUxKSwgKDB4NDQ5Q0JBODIpLCAoMHhBQkU2RDNDNCksICgweENDRjZGNUMzKSwKKyAgICAoMHg5MDY0QzFDMiksICgweDAzMUZGNTlDKSwgKDB4NDE1OUZFNEUpLCAoMHg0MjE0ODJDMCksICgweDIwRjZGMDBBKSwKKyAgICAoMHhCODY2Q0E0OSksICgweDc1QTY2RkFBKSwgKDB4NTQ1MzUxNUYpLCAoMHhCNTQ1RDQ4NiksICgweDg4NUQ5NDkzKSwKKyAgICAoMHhFRUM0RUVCNCksICgweDg4RjlDODkzKSwgKDB4QkJBQTM4QjQpLCAoMHg1QTU3QkE4MyksICgweDEyRTg0OENDKSwKKyAgICAoMHgyRkI2MjE2MCksICgweDg0MEExQTU0KSwgKDB4MkE3QUVERDYpLCAoMHg4OUFGMkRCRCksICgweEM4QkFBRTJFKSwKKyAgICAoMHg1NkVFQkQ3NSksICgweEU1OTVCODZEKSwgKDB4RUVCMTIzQzYpLCAoMHgzRjk0RUJDMSksICgweDc4Q0ZCRUUyKSwKKyAgICAoMHhDRjkwMUYxMSksICgweDVBMzVBMzUwKSwgKDB4REEyMkNCNTgpLCAoMHhCRTRCODI4NyksICgweDI1RTA3OEMwKSwKKyAgICAoMHgyQkQ0RjBEMyksICgweDZBNDY0Qjk5KSwgKDB4NDg4NEIxNTYpLCAoMHhGMUZGNzYzMCksICgweEMxMzI4MDUwKSwKKyAgICAoMHhEODRDMjE2QyksICgweDg0QTREOTQyKSwgKDB4MjE1N0EwQTApLCAoMHhGMzBBMTQxMiksICgweDU0QUY2MDExKSwKKyAgICAoMHgwMEQ3MDU0MiksICgweEJEQUJFN0RCKSwgKDB4MUZGMzUzNEMpLCAoMHhEODY3MkI0RSksICgweDdCRTNCQjNBKSwKKyAgICAoMHhDNTU5NTU0MCksICgweDE2MUUxQkZGKSwgKDB4RDQzNzIzMDkpLCAoMHg3QkMyRUQ1MiksICgweEMxQzYzNkVEKSwKKyAgICAoMHg0REQzMkFBNCksICgweDg2MTYzMjQ2KSwgKDB4NjE0RUY2ODgpLCAoMHg0RUI0NDI3MCksICgweDg4RUQwNzdDKSwKKyAgICAoMHgyRjIyOTQ2NiksICgweDFBNTg1MjAxKSwgKDB4NjVCQjJFRTIpLCAoMHhEQkFEQTBERCksICgweEU1MDk5NUNCKSwKKyAgICAoMHhDQTFFMjc2MCksICgweDU4M0ZEODFGKSwgKDB4RTQ4RDQ4NTkpLCAoMHhDMjAwNjE1MiksICgweDhGMUY3NzBDKSwKKyAgICAoMHgyN0NBQTg2RiksICgweDk2MTBCODQ1KSwgKDB4RkMyNUJDRTMpLCAoMHgzN0I4QjM5RiksICgweDEwRENDREQxKSwKKyAgICAoMHhENTdBNENBQiksICgweDdENTQzREU4KSwgKDB4NkY0NUI5NTgpLCAoMHgxMkYwQjk3OSksICgweDgxOEU3OUY5KSwKKyAgICAoMHhCNEIyQjAxRiksICgweEYzMDM1OTAxKSwgKDB4MzcyRjdCRDkpLCAoMHg1RDU5MkU2NyksICgweERCNUE1NTJGKSwKKyAgICAoMHg2RTYxRTYyNSksICgweDRFOEE2QTQyKSwgKDB4MjQ1OEFEQjgpLCAoMHg1RjEyNTI4QyksICgweDI3MkIzQURFKSwKKyAgICAoMHhERTY2NkE4MyksICgweDdGMThDRkQ3KSwgKDB4MkY4NzdERDgpLCAoMHhENzNGRkZCNiksICgweDc5ODY3OTU2KSwKKyAgICAoMHg0RTA1RkNBRCksICgweDE5RTc4RUVFKSwgKDB4RTFCQTY1MTIpLCAoMHg5OUY2RjA5MSksICgweDkxNjkwNTE2KSwKKyAgICAoMHgxNkFFNDA0MSksICgweDA0Qjk2ODA1KSwgKDB4N0NBMDUyRkMpLCAoMHhBNEQwNUVGRCksICgweDQxM0QxRjA0KSwKKyAgICAoMHg1M0U5MUNDMCksICgweDZGODdBMDgyKSwgKDB4NjA0RkQyMDIpLCAoMHgwQjM2OEQ5RiksICgweEQ1RjIyRTVDKSwKKyAgICAoMHgyQkU1QTc0RSksICgweDJGNjlFQURFKSwgKDB4OEJFNTM3RTEpLCAoMHg5Njk3NTc4OSksICgweDM2NzVBM0EwKSwKKyAgICAoMHgwQTI3MkI3MSksICgweDc1NEIxRDYxKSwgKDB4OTg2MDA1ODEpLCAoMHg2NTlBMkJFMyksICgweEIyMUJFRjU0KSwKKyAgICAoMHhGMjYzNTFCMCksICgweDFDNTk5NTczKSwgKDB4NkI0MjNCNTkpLCAoMHhFQTM3MUM5NiksICgweEM5QkRBNDk5KSwKKyAgICAoMHhEREYyNUYzNyksICgweEZCQ0FDNEFEKSwgKDB4NDBDQTc4OEIpLCAoMHgxM0JDMzk4MSksICgweDQxNzZEQTU4KSwKKyAgICAoMHhEODQ4REE3NCksICgweDk0NzQwNjQyKSwgKDB4NTRGRDU0NzkpLCAoMHg3MTUwMjM2MiksICgweDI1RTgxQ0Y5KSwKKyAgICAoMHg1MzI0OTU2MiksICgweDUyODE0ODI3KSwgKDB4NTVEQzVGMkMpLCAoMHg4ODI1QkM1MCksICgweDhFNEQwNEQ5KSwKKyAgICAoMHg4MDUwRjFGRiksICgweDIxMkNDMTNFKSwgKDB4MDBDMEQ4NEMpLCAoMHgwNzcxMTAwMyksICgweDQwNkE1RjQ1KSwKKyAgICAoMHhFRDBBOThERSksICgweDhBNjE5NzMxKSwgKDB4Nzk2QTNCMDQpLCAoMHg3RUFFQ0Y3MSksICgweDdERjNEQUJFKSwKKyAgICAoMHgyQjBGRkI0QSksICgweEJBOEEzRkI4KSwgKDB4NjIwMkY4RjIpLCAoMHg2MzJDMzdCMiksICgweDIwNTI3MUFBKSwKKyAgICAoMHhCQTFDNDM4QyksICgweEFBMUMxMTgyKSwgKDB4RTY0NDJBNjUpLCAoMHhENzM2RTA0MyksICgweDk1NzE1QzVDKSwKKyAgICAoMHgzRDYwNEMyOCksICgweEQyMUQwRDc0KSwgKDB4QTFGQjBDMjEpLCAoMHhDRThGMDY1RCksICgweEI4QjM2NDYzKSwKKyAgICAoMHg3Rjc4OEMzMyksICgweDg0QUI1M0E1KSwgKDB4NEIzM0FGNDYpLCAoMHg0MEMyNzM2QSksICgweDBENjU3MUI3KSwKKyAgICAoMHhGQzhEODI5MiksICgweDlEMUM1MTgyKSwgKDB4RjdCNjcwRTIpLCAoMHhCQjJCOUU5MSksICgweDEzNzg1MUQ1KSwKKyAgICAoMHhCQ0Y4N0NBOCksICgweEUwODJBN0E2KSwgKDB4NTAyNDA0RTUpLCAoMHg1MDI1QTZFMCksICgweDI1NDk0RUE2KSwKKyAgICAoMHg1QTZBOEExNCksICgweEUzMDFBNjg5KSwgKDB4NzBDQkVFNkIpLCAoMHhDODA2NDRDMSksICgweEU5OTE0Q0U2KSwKKyAgICAoMHg5NDgxRjFFNiksICgweEI5RTREQTM0KSwgKDB4NTg0QjFFRDgpLCAoMHhBQ0MzOTY0OCksICgweDMxRUZDRDYyKSwKKyAgICAoMHgwN0M4MkFFOSksICgweEVFOUQ5MEU1KSwgKDB4NTlCQUVDNzUpLCAoMHg0MDE3OEIwRSksICgweDlGREMxQzlDKSwKKyAgICAoMHhGM0E2NDg4RiksICgweDRCNkMxMzY3KSwgKDB4OUY3REYxMDkpLCAoMHhDQkRGOEVERiksICgweEJBNzZFRDMzKSwKKyAgICAoMHhGMTVEQkI5RiksICgweEQ0OEExOTdGKSwgKDB4RjExRTc1RUUpLCAoMHhBNzZCNDc5QiksICgweDcwNkRFNzhCKSwKKyAgICAoMHg2NTU5QUM2NSksICgweEMwMTNDMTgyKSwgKDB4NDYxRTkzQzcpLCAoMHhBOTg5RUFGMSksICgweDU5NDQ4QzAwKSwKKyAgICAoMHg3MjFGQUMzOCksICgweDU0NkRFQTc5KSwgKDB4MjIzRjY3QzApLCAoMHg1NDM0NjQ3QyksICgweEIzRUY0RjBBKSwKKyAgICAoMHhENEZBRjFGMSksICgweDBCRDRFMzhBKSwgKDB4RkY2MTUyN0UpLCAoMHhENkVBNUREMiksICgweDY0NEM3MTA1KSwKKyAgICAoMHgzMUFFMjE4OSksICgweDExRUMwQTFBKSwgKDB4MThCM0FEODApLCAoMHg0N0QwRTgwQSksICgweDc3M0Q4QkIyKSwKKyAgICAoMHhFRkE2NzQ3RSksICgweEYyM0RFOEIwKSwgKDB4MDI2QkIxRTcpLCAoMHgwM0MxNDA2MCksICgweEMxOTk3REY3KSwKKyAgICAoMHg5NTk4NkI5QyksICgweDhBNUQ2MTcwKSwgKDB4NTREQjNBNTYpLCAoMHgyMjk2MUQ0MSksICgweDQ2ODEzNDcxKSwKKyAgICAoMHhBQkVEMTZBNCksICgweEQxRjgzRThDKSwgKDB4MjU5NEFDQUMpLCAoMHgxRDU1NjBFQSksICgweDA0MzJFRkY0KSwKKyAgICAoMHhBMzg5RDdFOCksICgweEFGRTkyQzYyKSwgKDB4RkJCQUYxRTcpLCAoMHg0MkQwRDBBMSksICgweEEyQzNFQ0IyKSwKKyAgICAoMHg2MDNERDYzNSksICgweEVCQkM1OTE1KSwgKDB4NUIwQzdDRTApLCAoMHg4RDAzNjQwQyksICgweDIyRTI5OERCKSwKKyAgICAoMHgzOENFM0JEQyksICgweDIxRTZCNkI0KSwgKDB4Qzk3NDJDM0YpLCAoMHg0QkRGNzQ0OCksICgweEJBRDA5RDAwKSwKKyAgICAoMHhFRDZBODM5NyksICgweEY2RjgwMDFBKSwgKDB4MzFFMzU5MUUpLCAoMHhBRUMzN0VGRSksICgweDIyRDlBRDA2KSwKKyAgICAoMHg1RTI1NEFFQyksICgweEQ4NTJEMzJFKSwgKDB4RTFDOTY4QUUpLCAoMHhBM0MzQzI2NSksICgweEQ2N0JENzhBKSwKKyAgICAoMHhGMUZGOUQ4QyksICgweEMwM0E4MDUwKSwgKDB4ODQ3QTIxRkMpLCAoMHg4MTBFREE1RCksICgweDYzODA4OTUxKSwKKyAgICAoMHhDOEZFOUU5RSksICgweEZCNkREM0U1KSwgKDB4NzdCRDdBMDMpLCAoMHg2REMxNDY3NyksICgweEZGODFEODMxKSwKKyAgICAoMHg0MzIwMTEwMCksICgweEE3OEUxNkZFKSwgKDB4MzkzQ0QwQTApLCAoMHg1MTRGNkRERCksICgweDQyN0JBNEJDKSwKKyAgICAoMHhFQkU3QTY3NiksICgweEI3NzE2MzlCKSwgKDB4OERBQkI5RTcpLCAoMHg4MTJGQTVBRCksICgweDNGMTAyMTIwKSwKKyAgICAoMHg2MEU0MjQ1NCksICgweEVGRkJGRkM1KSwgKDB4QkVCMUQ1REQpLCAoMHg3QTU5RERGRCksICgweEU4OTY4RDdBKSwKKyAgICAoMHg4QUFEMzQ2MiksICgweEFCNjUzMjdEKSwgKDB4MENGMkVDRkIpLCAoMHhGQTMyNDlBNCksICgweDk3RkMzQTQyKSwKKyAgICAoMHgzMTRBNzA4OSksICgweDI5OTFFNkRDKSwgKDB4QTk4NjkzQzQpLCAoMHg2NUVCMjAxMSksICgweENCNEQ4NTk0KSwKKyAgICAoMHgxQUFGRjE0RSksICgweDFEMEQwNDkyKSwgKDB4MkU1QTc4NEQpLCAoMHhBRTRFQzczOCksICgweEYxNkQ2NjdBKSwKKyAgICAoMHhCMEMyNjAzMCksICgweEFEQTNERkM5KSwgKDB4NEVEODc0RTUpLCAoMHhENDQxQTZBRSksICgweDE5RTNBQzA1KSwKKyAgICAoMHhDNkI4NjVEQyksICgweEU4RTQyODVBKSwgKDB4OTkyNDhDMkIpLCAoMHhDMjk4MTEyMiksICgweDFCMDE0Mjg4KSwKKyAgICAoMHg0NDJBMDU4MCksICgweDg0QTBBMUMxKSwgKDB4MjE2RjAyNDgpLCAoMHgyMDJFNTYwMiksICgweEVBRUJBQUNBKSwKKyAgICAoMHhERDVBQkVFNyksICgweDhCOUM0QjQzKSwgKDB4NUQ1RDQ2RDcpLCAoMHg4RkJFN0MxRCksICgweDZGOUNBQjg3KSwKKyAgICAoMHhCMEFCMEFBRSksICgweDk4QkM3OTM2KSwgKDB4RjI1MUI5MTEpLCAoMHg0NDY5RjJEMSksICgweEE5MDk5MDg4KSwKKyAgICAoMHhEMjE5QkQ2NiksICgweDc0OTBBRTIyKSwgKDB4QkMwQTk4MjApLCAoMHgxMTlEMDEzNiksICgweDg1OTI2NjFDKSwKKyAgICAoMHgyNjBDMEQxOCksICgweEI5QTFDNUIxKSwgKDB4QTY4NTkxRTQpLCAoMHhGQ0JENEYyOSksICgweDU5NjVBM0M3KSwKKyAgICAoMHg3RDFFRDY2NCksICgweDlCRERFRUUzKSwgKDB4OTIyMzdENUEpLCAoMHhCNzMzMkRBNiksICgweEVBNTYzMkU1KSwKKyAgICAoMHg5QkZFMTYyNCksICgweDZBMkJCMThBKSwgKDB4OEMwREQ3MkMpLCAoMHg0RjMxOUY1NiksICgweEVFOEI1QjAzKSwKKyAgICAoMHg2MDk2N0JDOCksICgweEI0OTE4Rjc1KSwgKDB4RjI5NUQ1RjYpLCAoMHg2NTJBRDgwRCksICgweDBDQ0U5NTUyKSwKKyAgICAoMHgwQkNBQTBBNiksICgweDNDRjJEMjhFKSwgKDB4MTg1Mzk1NkUpLCAoMHg3QjM4REVBQSksICgweEVBQUI5NzBCKSwKKyAgICAoMHg2NDA4NkQxRiksICgweDNFNzY0NUREKSwgKDB4OTg2RjEzNDIpLCAoMHhCQkIwRTE4OCksICgweDdENkQ1NjQyKSwKKyAgICAoMHg2ODIxODI3RCksICgweEZDQkM0NzI5KSwgKDB4M0QxMTRGQjkpLCAoMHgyRDI1NDJFNSksICgweDY1NENDMUYwKSwKKyAgICAoMHgwNEYxQjc1RSksICgweDI5MEI1NEFGKSwgKDB4N0Q3OUFCMUEpLCAoMHhGMzRFMzFBMiksICgweDczQTlGMzAwKSwKKyAgICAoMHg3QUJDQTg5RSksICgweEI1NkRBOTc0KSwgKDB4Q0FDREIwN0MpLCAoMHg0RUUxQURENCksICgweEVGODU5QjM0KSwKKyAgICAoMHg4OUY0N0I0NyksICgweDUxNUMxNTVBKSwgKDB4MzhEMDY3NTcpLCAoMHg4MDUwRjFGRiksICgweDIxQzhFMDNBKSwKKyAgICAoMHhCMTU1ODQxQSksICgweDMwNzE2Njg1KSwgKDB4MEEyQjQ4QUMpLCAoMHg3MDQxQzQwQSksICgweDEwNEM0NEQwKSwKKyAgICAoMHgxRjUxQjYxOCksICgweEYwRDRGMzlCKSwgKDB4RkNBRUJBNTIpLCAoMHgzMEVBNjJDRCksICgweEEyOTRCNzcyKSwKKyAgICAoMHgyMjFFMDQxNyksICgweEFBOEVGMTkyKSwgKDB4M0U1NjhDNzgpLCAoMHhEMzg2RUY5QSksICgweDEzQjU0RkIxKSwKKyAgICAoMHg4NDgxOEVDMyksICgweEI4NzY2OUY4KSwgKDB4Q0Q5MDU2NUEpLCAoMHg3M0Q3Qzg3NiksICgweEQ2MTkxNTEyKSwKKyAgICAoMHhBQzIyODcwNCksICgweEE3Nzg1RDQ4KSwgKDB4MTdDRjM0REQpLCAoMHg4QUY1QUI0MCksICgweDM2NUM2QUZBKSwKKyAgICAoMHgxN0RGRDU5RSksICgweEI5MjRDMjZFKSwgKDB4RTlERTU4NDQpLCAoMHgzRENERENEOSksICgweENEQTJERkI0KSwKKyAgICAoMHg4QTVCNTM0RSksICgweEEyRDlEQUNBKSwgKDB4MTE2Nzk1NjkpLCAoMHhBRUY2RTdFOSksICgweEM5RDI0MTdDKSwKKyAgICAoMHg1MTVEQzlDMyksICgweDE1N0E1QjEyKSwgKDB4NEM5NjBERDYpLCAoMHhENDEzQ0MwMSksICgweDY1MzE5NTQ1KSwKKyAgICAoMHg2Q0YxMzA5RCksICgweDAwMDMzOEM3KSwgKDB4NDYwQUE3RkMpLCAoMHhDMUZBNDQ0MCksICgweDBFM0FFMDQ4KSwKKyAgICAoMHhGNEIyMTJCNSksICgweEM3ODk1RDJCKSwgKDB4Njc2QUZBRjMpLCAoMHhFRjQwNEY3NSksICgweEJGQ0RCMTdDKSwKKyAgICAoMHhBMzdGRTZDNiksICgweDIwMTIzREQ1KSwgKDB4RUU5NkJEM0IpLCAoMHgzRUI4QTYyRSksICgweDA2ODg0NUUxKSwKKyAgICAoMHhDNDk2MDIxNiksICgweDdCQjExRDhEKSwgKDB4MkQ2NTc0NjcpLCAoMHhGQzZGQUNDNSksICgweEMyMUFBRDMxKSwKKyAgICAoMHg2NDI3NDVGNCksICgweDQ1MDdFMTM5KSwgKDB4RjczNjlEQzkpLCAoMHg2MTk4QURFQiksICgweDYzQjk4QjEwKSwKKyAgICAoMHhERUU1ODVBQiksICgweEEzOEVGRkFDKSwgKDB4MzBBRTFFNDEpLCAoMHg4MjA2NjdBOSksICgweDZCNzdBMDA3KSwKKyAgICAoMHgyNDAwNDBBNyksICgweEI3N0E3RDk1KSwgKDB4MjA4ODkzQ0EpLCAoMHgwODVCNDYxMCksICgweDE0MjM0ODU0KSwKKyAgICAoMHhBQzAyMjc4NiksICgweDJENTczNDZGKSwgKDB4QjY0QTFBNjcpLCAoMHg2MDVENDVCMiksICgweEUwNTFDMDAxKSwKKyAgICAoMHg5MTc2QzExRCksICgweDIzQkJFOTQ1KSwgKDB4MkMwM0UyNkEpLCAoMHhDMjgxMUJBRCksICgweDFERDgxNEQ0KSwKKyAgICAoMHgzQzY3NEI2OCksICgweDI4RUMzM0M3KSwgKDB4RDlFREU1RTQpLCAoMHg1QzQ2QzI0OCksICgweDQwOTg4OThGKSwKKyAgICAoMHg1QkE5NjI4MCksICgweEVGRjc3QjkxKSwgKDB4MzMzMkNBNUIpLCAoMHg2NjFDQUY2QiksICgweDZFMEQ1NjRFKSwKKyAgICAoMHhCNzBEMDg2MyksICgweDI0MDI4NUMwKSwgKDB4QkJCRDNFQTcpLCAoMHhDQTJFNTY4RCksICgweEQxRDNGNjEyKSwKKyAgICAoMHhDOTE2MTE1RSksICgweEI3RkMwQTZDKSwgKDB4MTk2MUFFOUEpLCAoMHhCNURGMzk2NSksICgweEMxQjk1MDY1KSwKKyAgICAoMHg4OUUyOTY2NSksICgweDNGMjlGQkVEKSwgKDB4M0YxQkVENzMpLCAoMHhDMTU1QkUxRCksICgweDcyNTZBRTRDKSwKKyAgICAoMHg0QTU5Nzk3QiksICgweDYwMDlEMTNCKSwgKDB4OTE4NTAzODUpLCAoMHhFNDU0NTkyMCksICgweDE1RUNDREExKSwKKyAgICAoMHhGRkM3QkEyMCksICgweDJCODA1MEYxKSwgKDB4MUEyMUQ0QzApLCAoMHgzMDA4QkU4OSksICgweDZDMEZGMzE3KSwKKyAgICAoMHg3NDQ0RDg1MiksICgweDA1ODQxNDExKSwgKDB4ODRDODAwMjIpLCAoMHgwN0M2MzBFMCksICgweDdFNkY4RkEzKSwKKyAgICAoMHhGM0JERjNDNyksICgweDRDNTVERkY3KSwgKDB4RTBCMUM4RDEpLCAoMHhDM0Y1Q0Y0RCksICgweDFDMjJBODM2KSwKKyAgICAoMHhCMjlEMzMxNSksICgweEQ0OTY2NTQxKSwgKDB4NDVDODU4MDApLCAoMHhBRDhEQkQ0NiksICgweDJDMTlDRkFBKSwKKyAgICAoMHg1NDBGQTY3NCksICgweEMzQzkxM0Q4KSwgKDB4RDIxODM3NTMpLCAoMHhDQjlGQ0YyNiksICgweDgzNDZGQzg5KSwKKyAgICAoMHhBMzQwODA3OCksICgweENGRDg0Q0MxKSwgKDB4RjU4MEYwMzUpLCAoMHg3RkQwNjdBNyksICgweDg3RTdGQ0I4KSwKKyAgICAoMHgwOUMwOTQwNiksICgweEREQkIzMTMxKSwgKDB4RkY3OUZGRTEpLCAoMHhFQUZCRUVGMSksICgweEI2NjBCQ0U4KSwKKyAgICAoMHg5OTg5OUMzMSksICgweDlGRUIyMkMxKSwgKDB4Qzc1RUY2OEYpLCAoMHgxMzgwMEI5OSksICgweENEN0YzMTAwKSwKKyAgICAoMHgwOTUwMkFEQyksICgweDEwMUUwMEU4KSwgKDB4NDA2Q0I5NDUpLCAoMHg4MjBBMUIyQiksICgweDY4QTBCMDgyKSwKKyAgICAoMHgwQzFCMTg2NCksICgweEIzNjkwMzU0KSwgKDB4NjNDNUI1QTMpLCAoMHg1MzVFQjRDOCksICgweEY3RDg2OTE4KSwKKyAgICAoMHhEMUJBNThGQyksICgweEY0MjkxMEZBKSwgKDB4RkJEQjE5MjkpLCAoMHhDN0MwQzJBNCksICgweEQyMDc0NzUyKSwKKyAgICAoMHhCOTY4MDNCNCksICgweDg0MDY1RTM4KSwgKDB4ODE5QUY0OEUpLCAoMHhFOTg2NEZGMyksICgweEE2RTQxRDBFKSwKKyAgICAoMHg1MEU3NDQyQiksICgweEM3NTc0RDdCKSwgKDB4MTk2QjZBQjMpLCAoMHgwNDFENTg1NCksICgweDYyOTE2MkQzKSwKKyAgICAoMHgwNDI3MTNFMCksICgweDlBRTMxMjk3KSwgKDB4NEIyRjRFMzYpLCAoMHhDQjhDRTBFMCksICgweEIyRjA2ODJBKSwKKyAgICAoMHhBQjMzRDZGNSksICgweDJGNTNEODJFKSwgKDB4NjZBNDM4MTUpLCAoMHg0NDMzQUFBOCksICgweDgyRUEwRUQ1KSwKKyAgICAoMHg0NTc4NzZGMiksICgweEQzMEJEMzZDKSwgKDB4OEQ0OUQyOEMpLCAoMHgwRTY4MjYwRSksICgweEQwNTY1MTJDKSwKKyAgICAoMHg3Qjg2REIxMSksICgweDY0NjMzNjYxKSwgKDB4ODI2NUZGMjUpLCAoMHg2RDJCNzE0OCksICgweDUyOURBMEQ4KSwKKyAgICAoMHhCQzE4MDAxNyksICgweDE5QUI4MDNCKSwgKDB4ODNGMDAwMjApLCAoMHg1MEYxRkYwNyksICgweEQ0QzAyRDgwKSwKKyAgICAoMHhGQzg4MUEyMSksICgweEMxQkYwMTAwKSwgKDB4NTg0MTY4MEIpLCAoMHgxMDNCMkNDMCksICgweEIwNDJDMjhBKSwKKyAgICAoMHgyMzI0RThBOCksICgweDMxNTMxNDMwKSwgKDB4RUY3MUREMEUpLCAoMHg3QzFCOUQ4RSksICgweDA5OThDMjI4KSwKKyAgICAoMHhEOUVDNjU0OCksICgweDhFRUY4NDQ4KSwgKDB4MEM1NjFDQUYpLCAoMHg0QkEzOURGRCksICgweDU4OTQ3RkUyKSwKKyAgICAoMHg5NTlCMTJBMiksICgweDZENTJFQUVDKSwgKDB4MUQ5NURERDUpLCAoMHgzMTBDMjIyQiksICgweDYzNjM0QjE4KSwKKyAgICAoMHg0REU2QzVCOCksICgweDUyNkM5MTA2KSwgKDB4NDlCNUU4Q0MpLCAoMHhDM0MzMzAwNCksICgweDYwNUNEMjg3KSwKKyAgICAoMHgwOUE2MzkwQyksICgweDM1MEMzM0JDKSwgKDB4OTUzMDUwQ0MpLCAoMHg5NjA1NTJBMyksICgweDU0RjAxMTg2KSwKKyAgICAoMHgwRThEN0NGRSksICgweDQ1OUEwMDIyKSwgKDB4QzM1NzY5NjYpLCAoMHhCMEQ2RjZFOCksICgweEI4RjEzQUFDKSwKKyAgICAoMHhFNDQwMDM0QyksICgweDM2MTE4ODUxKSwgKDB4RjUxQkU3MjcpLCAoMHgyRTE2ODlBMCksICgweEU4MkNDRjU1KSwKKyAgICAoMHg2REY0RTNDQiksICgweEVBNjY1NjYzKSwgKDB4QzJFNTNENkYpLCAoMHg5REMxRjA2QiksICgweEZDQzJFODc4KSwKKyAgICAoMHg0MjkyRDE2MiksICgweDQ4NDBDNDMzKSwgKDB4QjYxOERCNDMpLCAoMHgwNjA5MkMxNSksICgweDUwMDEzNEMxKSwKKyAgICAoMHhBNkRCODk1NSksICgweEQ1RThBNUJCKSwgKDB4MTQyQjc4MjkpLCAoMHg3NUY0MjkzOSksICgweDBFQkY0RDEwKSwKKyAgICAoMHgxQTJCMDc4QyksICgweDdDMkE1QTQ2KSwgKDB4M0VBMUI5QTcpLCAoMHgzMUFBQzg5OCksICgweDEzMjdCODUyKSwKKyAgICAoMHgyNzdDNjVBMSksICgweDUyODBDRTI3KSwgKDB4RkY1MTIyMTMpLCAoMHgzOUI0N0VCRiksICgweDE1NENBMDAwKSwKKyAgICAoMHgxMDZFN0RBMiksICgweEFGQTRDOTI1KSwgKDB4QzQ4Q0UzNzkpLCAoMHhBQjJFNDU3MyksICgweDVFNDRCOEZEKSwKKyAgICAoMHhFQ0QyQTQyNCksICgweDhDNTMwMEFBKSwgKDB4RTQyNUExODApLCAoMHg2RDVEMEQzQiksICgweEE3MDU0MEE4KSwKKyAgICAoMHhGOEVDRjQzMiksICgweDg4NDY5NkIwKSwgKDB4Qjc5NzU1QkYpLCAoMHg2MkNBRDQxOSksICgweDRCQkIzOEI2KSwKKyAgICAoMHhDRDVDNzlENyksICgweDgyRDRFMjlCKSwgKDB4NkRENDhFOTEpLCAoMHhBMTI4QTNBOSksICgweEYyRUQ2NzI2KSwKKyAgICAoMHgzMzlBNjNGNiksICgweDM1RDZGNEVBKSwgKDB4OERDOEI0OTEpLCAoMHhDQTA0RDA5QyksICgweEZGMDc0RkQwKSwKKyAgICAoMHgyRDgwNTBGMSksICgweDFBMjFEODgwKSwgKDB4MTkwMEZFODgpLCAoMHg2QzA5RDFCRiksICgweDU2NDgzMDAxKSwKKyAgICAoMHhDMjBBMUEyOSksICgweDQ0OTE4MEEzKSwgKDB4MDI4QzUxNjApLCAoMHg3NUZBRUNERCksICgweDYyNTA3MDVCKSwKKyAgICAoMHg4OUVBMDEwQSksICgweDdCOUY5ODUxKSwgKDB4OUQ2QzU5OTQpLCAoMHg4NjAyQzNFNCksICgweDAzRDBFODYzKSwKKyAgICAoMHgwNDMyMjI1MSksICgweDExNjA5NUI3KSwgKDB4Nzg5Mjc2Q0EpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwOTc4KSwKKyAgICAoMHg4MDAwQzY4OCksICgweDgwMDBCQ0Q4KSwgKDB4ODAwMTAwMDApLCAoMHg5RkMzRjdCOCksICgweERFNDdCQzFCKSwKKyAgICAoMHhFNjBGQjRGOCksICgweEVBMjc0NjlEKSwgKDB4Q0NBMUU2NkQpLCAoMHg4RkZGNzAxMCksICgweDgwMDBCQ0Q4KSwKKyAgICAoMHgwMDAwMDBEMCksICgweDgwMDBCNEIwKSwgKDB4OEZGRkZCMjQpLCAoMHg5RkMzRjdCOCksICgweDAwMDAwMDAwKSwKKyAgICAoMHg4MDAwQjQxOCksICgweDhGRkY3MDEwKSwgKDB4ODAwMEM2ODgpLCAoMHgwMDAwMDBEMCksICgweDlGQzNGRDNDKSwKKyAgICAoMHhENjI1RjhDMCksICgweDQ3OEQ4MzJBKSwgKDB4RjY5M0Q5MjIpLCAoMHgzNjE3RDgxNiksICgweDgwMDAwNjQ4KSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAzKSwgKDB4MDAwMDAwMTIpLCAoMHg5RkM0OTk2NCksICgweDQ2MTQxOTI0KSwKKyAgICAoMHg0RDgzNDIwNSksICgweDE2Qjc5OUE2KSwgKDB4QTM5NDk0QTYpLCAoMHhDQ0YyM0M2MCksICgweDAwMDAwMDAxKSwKKyAgICAoMHg5RkM0NzQ2OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwNzIpLCAoMHgwMDAwODAwMSksICgweDhGRkZGQjU4KSwKKyAgICAoMHgwMDAwMDAwMyksICgweDQwMkM3NDEzKSwgKDB4MDAwMDAwMTYpLCAoMHg0MDJDNzQxMyksICgweDlGQzQ4NDk4KSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAyKSwgKDB4MDAwMDAwMDEpLCAoMHgwMDAwMDA3MiksICgweDlGQzQ3ODNDKSwKKyAgICAoMHg4MDAwQzY5MCksICgweDAzNThDREQ1KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwODAwMSksICgweDAwMDAwMDcyKSwKKyAgICAoMHg4MDAwMDY0OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDgwMDEpLCAoMHg4MDAwQkQ0MCksICgweDFBMTlGOEQ4KSwKKyAgICAoMHgwMDAwODAwMSksICgweDgwMDAwM0MwKSwgKDB4MDAwMDAwMDMpLCAoMHg5RkM0MjhDQyksICgweEY2MTkyMDE1KSwKKyAgICAoMHhGQkI3N0Y5MiksICgweDhGMkM4QkZDKSwgKDB4M0MzOTE5MjMpLCAoMHg0MDE0NDI4QyksICgweDE0MDA0NUFFKSwKKyAgICAoMHhGRkZEMkJCNiksICgweDJEODA1MEYxKSwgKDB4ODAwMEJENDApLCAoMHgwMDAwMDAwMyksICgweDAwMDAwMDAwKSwKKyAgICAoMHgyQ0MwNTgxMSksICgweDAwMDA4MDAxKSwgKDB4ODAwMDAzQzApLCAoMHg4MDAwMDY0OCksICgweDgwMDAwNjQ4KSwKKyAgICAoMHg5RkM0MjA2QyksICgweDhGRkZGRDc4KSwgKDB4OEZGRkZFRUMpLCAoMHg4MDAwQzY2OCksICgweDgwMDAwNjQ4KSwKKyAgICAoMHg4RkZGRkQ3OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDMwNDApLCAoMHg4MDAwRkZDMCksICgweDgwMDBCQ0Q4KSwKKyAgICAoMHg4MDAxMDAwMCksICgweDlGQzNGN0I4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMkNDMCksICgweDgwMDEzMzQwKSwKKyAgICAoMHg4MDAwQkNEOCksICgweDgwMDEwRkQwKSwgKDB4ODAwMTI1NDgpfTsKZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvbWlwcy9zY2FsZS5jcHAgYi9saWJGREsvc3JjL21pcHMvc2NhbGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGEzYTAwLi4wMDAwMDAwCi0tLSBhL2xpYkZESy9zcmMvbWlwcy9zY2FsZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6Ci0gICBEZXNjcmlwdGlvbjoKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZChfX21pcHNfZHNwKQotCi0jaWZuZGVmIEZVTkNUSU9OX2dldFNjYWxlZmFjdG9yX0RCTAotI2RlZmluZSBGVU5DVElPTl9nZXRTY2FsZWZhY3Rvcl9EQkwKLS8qIQotICoKLSAqICBcYnJpZWYgQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBzY2FsZSBmYWN0b3IgZm9yIGlucHV0IHZlY3RvcgotICoKLSAqICBccmV0dXJuIE1heGltdW0gc2NhbGUgZmFjdG9yCi0gKgotICogIFRoaXMgZnVuY3Rpb24gY2FuIGNvbnN0aXR1dGUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgY29tcHV0YXRpb25hbCBjb21wbGV4aXR5IC0gdmVyeSBtdWNoIGRlcGVuZGluZyBvbiB0aGUKLSAqICBiaXRyYXRlLiBTaW5jZSBpdCBpcyBhIHJhdGhlciBzbWFsbCBmdW5jdGlvbiwgZWZmZWN0aXZlIGFzc2VtYmxlciBvcHRpbWl6YXRpb24gbWlnaHQgYmUgcG9zc2libGUuCi0gKgotICovCi1pbmxpbmUgSU5UIGdldFNjYWxlZmFjdG9yKGNvbnN0IEZJWFBfREJMICp2ZWN0b3IsIC8qITwgUG9pbnRlciB0byBpbnB1dCB2ZWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbikgICAgICAgICAgICAgICAgLyohPCBMZW5ndGggb2YgaW5wdXQgdmVjdG9yICovCi17Ci0gIElOVCBpOwotICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWF9EQkwoMC4wZik7Ci0KLSAgZm9yKGk9bGVuO2khPTA7aS0tKXsKLSAgICBtYXhWYWwgfD0gX19idWlsdGluX21pcHNfYWJzcV9zX3coKnZlY3RvcisrKTsKLSAgfQotCi0gIHJldHVybiBmaXhNYXgoKElOVCkwLChDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSAtIDEpKTsKLX0KLSNlbmRpZgotCi0jZW5kaWYgLypfX21pcHNfZHNwICovCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL21pcHMvc2NhbGVfbWlwcy5jcHAgYi9saWJGREsvc3JjL21pcHMvc2NhbGVfbWlwcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzZDMzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYkZESy9zcmMvbWlwcy9zY2FsZV9taXBzLmNwcApAQCAtMCwwICsxLDEzMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChfX21pcHNfZHNwKQorCisjaWZuZGVmIEZVTkNUSU9OX2dldFNjYWxlZmFjdG9yX0RCTAorI2RlZmluZSBGVU5DVElPTl9nZXRTY2FsZWZhY3Rvcl9EQkwKKy8qIQorICoKKyAqICBcYnJpZWYgQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBzY2FsZSBmYWN0b3IgZm9yIGlucHV0IHZlY3RvcgorICoKKyAqICBccmV0dXJuIE1heGltdW0gc2NhbGUgZmFjdG9yCisgKgorICogIFRoaXMgZnVuY3Rpb24gY2FuIGNvbnN0aXR1dGUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgY29tcHV0YXRpb25hbAorICogY29tcGxleGl0eSAtIHZlcnkgbXVjaCBkZXBlbmRpbmcgb24gdGhlIGJpdHJhdGUuIFNpbmNlIGl0IGlzIGEgcmF0aGVyIHNtYWxsCisgKiBmdW5jdGlvbiwgZWZmZWN0aXZlIGFzc2VtYmxlciBvcHRpbWl6YXRpb24gbWlnaHQgYmUgcG9zc2libGUuCisgKgorICovCitTQ0FMRV9JTkxJTkUKK0lOVCBnZXRTY2FsZWZhY3Rvcihjb25zdCBGSVhQX0RCTCAqdmVjdG9yLCAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgdmVjdG9yICovCisgICAgICAgICAgICAgICAgICAgSU5UIGxlbikgICAgICAgICAgICAgICAgLyohPCBMZW5ndGggb2YgaW5wdXQgdmVjdG9yICovCit7CisgIElOVCBpOworICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWF9EQkwoMC4wZik7CisKKyAgZm9yIChpID0gbGVuOyBpICE9IDA7IGktLSkgeworICAgIG1heFZhbCB8PSBfX2J1aWx0aW5fbWlwc19hYnNxX3NfdygqdmVjdG9yKyspOworICB9CisKKyAgcmV0dXJuIGZpeE1heCgoSU5UKTAsIChDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSAtIDEpKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLypfX21pcHNfZHNwICovCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL25sY19kZWMuY3BwIGIvbGliRkRLL3NyYy9ubGNfZGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YThjY2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL3NyYy9ubGNfZGVjLmNwcApAQCAtMCwwICsxLDEwNjMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE9tZXIgT3NtYW4KKworICAgRGVzY3JpcHRpb246IFNBQy9TQU9DIERlYyBOb2lzZWxlc3MgQ29kaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJubGNfZGVjLmgiCisjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorCisvKiBNQVhfUEFSQU1FVEVSX0JBTkRTIGRlZmluZXMgYXJyYXkgbGVuZ3RoIGluIGh1ZmZkZWMgKi8KKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsIGIpICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCitFUlJPUl90IHN5bV9yZXN0b3JlSVBEKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sIGludCBsYXYsIFNDSEFSIGRhdGFbMl0pIHsKKyAgaW50IHN1bV92YWwgPSBkYXRhWzBdICsgZGF0YVsxXTsKKyAgaW50IGRpZmZfdmFsID0gZGF0YVswXSAtIGRhdGFbMV07CisKKyAgaWYgKHN1bV92YWwgPiBsYXYpIHsKKyAgICBkYXRhWzBdID0gLXN1bV92YWwgKyAoMiAqIGxhdiArIDEpOworICAgIGRhdGFbMV0gPSAtZGlmZl92YWw7CisgIH0gZWxzZSB7CisgICAgZGF0YVswXSA9IHN1bV92YWw7CisgICAgZGF0YVsxXSA9IGRpZmZfdmFsOworICB9CisKKyAgaWYgKGRhdGFbMF0gLSBkYXRhWzFdICE9IDApIHsKKyAgICBVTE9ORyBzeW1fYml0OworICAgIHN5bV9iaXQgPSBGREtyZWFkQml0cyhzdHJtLCAxKTsKKyAgICBpZiAoc3ltX2JpdCkgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IGRhdGFbMF07CisgICAgICBkYXRhWzBdID0gZGF0YVsxXTsKKyAgICAgIGRhdGFbMV0gPSB0bXA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhVRkZERUNfT0s7Cit9CisKK3N0YXRpYyBpbnQgaWxvZzIodW5zaWduZWQgaW50IGkpIHsKKyAgaW50IGwgPSAwOworCisgIGlmIChpKSBpLS07CisgIHdoaWxlIChpID4gMCkgeworICAgIGkgPj49IDE7CisgICAgbCsrOworICB9CisKKyAgcmV0dXJuIGw7Cit9CisKK3N0YXRpYyBFUlJPUl90IHBjbV9kZWNvZGUoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwgU0NIQVIqIG91dF9kYXRhXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSKiBvdXRfZGF0YV8yLCBpbnQgb2Zmc2V0LCBpbnQgbnVtX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9sZXZlbHMpIHsKKyAgaW50IGkgPSAwLCBqID0gMCwgaWR4ID0gMDsKKyAgaW50IG1heF9ncnBfbGVuID0gMCwgbmV4dF92YWwgPSAwOworICBVTE9ORyB0bXA7CisKKyAgaW50IHBjbV9jaHVua19zaXplWzddID0gezB9OworCisgIHN3aXRjaCAobnVtX2xldmVscykgeworICAgIGNhc2UgMzoKKyAgICAgIG1heF9ncnBfbGVuID0gNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIG1heF9ncnBfbGVuID0gNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6CisgICAgICBtYXhfZ3JwX2xlbiA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgbWF4X2dycF9sZW4gPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOToKKyAgICAgIG1heF9ncnBfbGVuID0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjU6CisgICAgICBtYXhfZ3JwX2xlbiA9IDM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDUxOgorICAgICAgbWF4X2dycF9sZW4gPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgIGNhc2UgODoKKyAgICBjYXNlIDE1OgorICAgIGNhc2UgMTY6CisgICAgY2FzZSAyNjoKKyAgICBjYXNlIDMxOgorICAgICAgbWF4X2dycF9sZW4gPSAxOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBIVUZGREVDX05PVE9LOworICB9CisKKyAgdG1wID0gMTsKKyAgZm9yIChpID0gMTsgaSA8PSBtYXhfZ3JwX2xlbjsgaSsrKSB7CisgICAgdG1wICo9IG51bV9sZXZlbHM7CisgICAgcGNtX2NodW5rX3NpemVbaV0gPSBpbG9nMih0bXApOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV92YWw7IGkgKz0gbWF4X2dycF9sZW4pIHsKKyAgICBpbnQgZ3JwX2xlbiwgZ3JwX3ZhbCwgZGF0YTsKKyAgICBncnBfbGVuID0gbWluKG1heF9ncnBfbGVuLCBudW1fdmFsIC0gaSk7CisgICAgZGF0YSA9IEZES3JlYWRCaXRzKHN0cm0sIHBjbV9jaHVua19zaXplW2dycF9sZW5dKTsKKworICAgIGdycF92YWwgPSBkYXRhOworCisgICAgZm9yIChqID0gMDsgaiA8IGdycF9sZW47IGorKykgeworICAgICAgaWR4ID0gaSArIChncnBfbGVuIC0gaiAtIDEpOworICAgICAgbmV4dF92YWwgPSBncnBfdmFsICUgbnVtX2xldmVsczsKKworICAgICAgaWYgKG91dF9kYXRhXzIgPT0gTlVMTCkgeworICAgICAgICBvdXRfZGF0YV8xW2lkeF0gPSBuZXh0X3ZhbCAtIG9mZnNldDsKKyAgICAgIH0gZWxzZSBpZiAob3V0X2RhdGFfMSA9PSBOVUxMKSB7CisgICAgICAgIG91dF9kYXRhXzJbaWR4XSA9IG5leHRfdmFsIC0gb2Zmc2V0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlkeCAlIDIpIHsKKyAgICAgICAgICBvdXRfZGF0YV8yW2lkeCAvIDJdID0gbmV4dF92YWwgLSBvZmZzZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0X2RhdGFfMVtpZHggLyAyXSA9IG5leHRfdmFsIC0gb2Zmc2V0OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGdycF92YWwgPSAoZ3JwX3ZhbCAtIG5leHRfdmFsKSAvIG51bV9sZXZlbHM7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhVRkZERUNfT0s7Cit9CisKK3N0YXRpYyBFUlJPUl90IGh1ZmZfcmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICgqbm9kZVRhYilbTUFYX0VOVFJJRVNdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0X2RhdGEpIHsKKyAgaW50IG5vZGUgPSAwOworICBpbnQgbGVuID0gMDsKKworICBkbyB7CisgICAgVUxPTkcgbmV4dF9iaXQ7CisgICAgbmV4dF9iaXQgPSBGREtyZWFkQml0cyhzdHJtLCAxKTsKKyAgICBsZW4rKzsKKyAgICBub2RlID0gKCpub2RlVGFiKVtub2RlXVtuZXh0X2JpdF07CisgIH0gd2hpbGUgKG5vZGUgPiAwKTsKKworICAqb3V0X2RhdGEgPSBub2RlOworCisgIHJldHVybiBIVUZGREVDX09LOworfQorCitzdGF0aWMgRVJST1JfdCBodWZmX3JlYWRfMkQoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAoKm5vZGVUYWIpW01BWF9FTlRSSUVTXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBvdXRfZGF0YVsyXSwgaW50KiBlc2NhcGUpIHsKKyAgRVJST1JfdCBlcnIgPSBIVUZGREVDX09LOworCisgIGludCBodWZmXzJEXzhiaXQgPSAwOworICBpbnQgbm9kZSA9IDA7CisKKyAgaWYgKChlcnIgPSBodWZmX3JlYWQoc3RybSwgbm9kZVRhYiwgJm5vZGUpKSAhPSBIVUZGREVDX09LKSB7CisgICAgZ290byBiYWlsOworICB9CisgICplc2NhcGUgPSAobm9kZSA9PSAwKTsKKworICBpZiAoKmVzY2FwZSkgeworICAgIG91dF9kYXRhWzBdID0gMDsKKyAgICBvdXRfZGF0YVsxXSA9IDE7CisgIH0gZWxzZSB7CisgICAgaHVmZl8yRF84Yml0ID0gLShub2RlICsgMSk7CisgICAgb3V0X2RhdGFbMF0gPSBodWZmXzJEXzhiaXQgPj4gNDsKKyAgICBvdXRfZGF0YVsxXSA9IGh1ZmZfMkRfOGJpdCAmIDB4ZjsKKyAgfQorCitiYWlsOgorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRVJST1JfdCBzeW1fcmVzdG9yZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLCBpbnQgbGF2LCBTQ0hBUiBkYXRhWzJdKSB7CisgIFVMT05HIHN5bV9iaXQgPSAwOworCisgIGludCBzdW1fdmFsID0gZGF0YVswXSArIGRhdGFbMV07CisgIGludCBkaWZmX3ZhbCA9IGRhdGFbMF0gLSBkYXRhWzFdOworCisgIGlmIChzdW1fdmFsID4gbGF2KSB7CisgICAgZGF0YVswXSA9IC1zdW1fdmFsICsgKDIgKiBsYXYgKyAxKTsKKyAgICBkYXRhWzFdID0gLWRpZmZfdmFsOworICB9IGVsc2UgeworICAgIGRhdGFbMF0gPSBzdW1fdmFsOworICAgIGRhdGFbMV0gPSBkaWZmX3ZhbDsKKyAgfQorCisgIGlmIChkYXRhWzBdICsgZGF0YVsxXSAhPSAwKSB7CisgICAgc3ltX2JpdCA9IEZES3JlYWRCaXRzKHN0cm0sIDEpOworICAgIGlmIChzeW1fYml0KSB7CisgICAgICBkYXRhWzBdID0gLWRhdGFbMF07CisgICAgICBkYXRhWzFdID0gLWRhdGFbMV07CisgICAgfQorICB9CisKKyAgaWYgKGRhdGFbMF0gLSBkYXRhWzFdICE9IDApIHsKKyAgICBzeW1fYml0ID0gRkRLcmVhZEJpdHMoc3RybSwgMSk7CisgICAgaWYgKHN5bV9iaXQpIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSBkYXRhWzBdOworICAgICAgZGF0YVswXSA9IGRhdGFbMV07CisgICAgICBkYXRhWzFdID0gdG1wOworICAgIH0KKyAgfQorCisgIHJldHVybiBIVUZGREVDX09LOworfQorCitzdGF0aWMgRVJST1JfdCBodWZmX2RlY18xRChIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLCBjb25zdCBEQVRBX1RZUEUgZGF0YV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRpbTEsIFNDSEFSKiBvdXRfZGF0YSwgY29uc3QgSU5UIG51bV92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgcDBfZmxhZykKKworeworICBFUlJPUl90IGVyciA9IEhVRkZERUNfT0s7CisgIGludCBpID0gMCwgbm9kZSA9IDAsIG9mZnNldCA9IDA7CisgIGludCBvZCA9IDAsIG9kX3NpZ24gPSAwOworICBVTE9ORyBkYXRhID0gMDsKKyAgaW50IGJpdHNBdmFpbCA9IDA7CisKKyAgY29uc3QgU0hPUlQoKnBhcnRUYWIpW01BWF9FTlRSSUVTXVsyXSA9IE5VTEw7CisgIGNvbnN0IFNIT1JUKCpub2RlVGFiKVtNQVhfRU5UUklFU11bMl0gPSBOVUxMOworCisgIHN3aXRjaCAoZGF0YV90eXBlKSB7CisgICAgY2FzZSB0X0NMRDoKKyAgICAgIHBhcnRUYWIgPSAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZQYXJ0ME5vZGVzLmNsZFswXVswXTsKKyAgICAgIG5vZGVUYWIgPSAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZDTEROb2Rlcy5oMURbZGltMV0tPm5vZGVUYWJbMF1bMF07CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfSUNDOgorICAgICAgcGFydFRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZlBhcnQwTm9kZXMuaWNjWzBdWzBdOworICAgICAgbm9kZVRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZklDQ05vZGVzLmgxRFtkaW0xXS0+bm9kZVRhYlswXVswXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9PTEQ6CisgICAgICBwYXJ0VGFiID0gKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmUGFydDBOb2Rlcy5vbGRbMF1bMF07CisgICAgICBub2RlVGFiID0gKEhBTkRMRV9IVUZGX05PREUpJmh1ZmZPTEROb2Rlcy5oMURbZGltMV0tPm5vZGVUYWJbMF1bMF07CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfSVBEOgorICAgICAgcGFydFRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZlBhcnQwTm9kZXMuaXBkWzBdWzBdOworICAgICAgbm9kZVRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZklQRE5vZGVzLmgxRFtkaW0xXS5ub2RlVGFiWzBdWzBdOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICBlcnIgPSBIVUZGREVDX05PVE9LOworICAgICAgZ290byBiYWlsOworICB9CisKKyAgaWYgKHAwX2ZsYWcpIHsKKyAgICBpZiAoKGVyciA9IGh1ZmZfcmVhZChzdHJtLCBwYXJ0VGFiLCAmbm9kZSkpICE9IEhVRkZERUNfT0spIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBvdXRfZGF0YVswXSA9IC0obm9kZSArIDEpOworICAgIG9mZnNldCA9IDE7CisgIH0KKworICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBudW1fdmFsOyBpKyspIHsKKyAgICBiaXRzQXZhaWwgPSBGREtnZXRWYWxpZEJpdHMoc3RybSk7CisgICAgaWYgKGJpdHNBdmFpbCA8IDEpIHsKKyAgICAgIGVyciA9IEhVRkZERUNfTk9UT0s7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBodWZmX3JlYWQoc3RybSwgbm9kZVRhYiwgJm5vZGUpKSAhPSBIVUZGREVDX09LKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIG9kID0gLShub2RlICsgMSk7CisKKyAgICBpZiAoZGF0YV90eXBlICE9IHRfSVBEKSB7CisgICAgICBpZiAob2QgIT0gMCkgeworICAgICAgICBiaXRzQXZhaWwgPSBGREtnZXRWYWxpZEJpdHMoc3RybSk7CisgICAgICAgIGlmIChiaXRzQXZhaWwgPCAxKSB7CisgICAgICAgICAgZXJyID0gSFVGRkRFQ19OT1RPSzsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKworICAgICAgICBkYXRhID0gRkRLcmVhZEJpdHMoc3RybSwgMSk7CisgICAgICAgIG9kX3NpZ24gPSBkYXRhOworCisgICAgICAgIGlmIChvZF9zaWduKSBvZCA9IC1vZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGF0YVtpXSA9IG9kOworICB9CisKK2JhaWw6CisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBFUlJPUl90IGh1ZmZfZGVjXzJEKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sIGNvbnN0IERBVEFfVFlQRSBkYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZGltMSwgY29uc3QgSU5UIGRpbTIsIFNDSEFSIG91dF9kYXRhW11bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtX3ZhbCwgY29uc3QgSU5UIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSKiBwMF9kYXRhWzJdKSB7CisgIEVSUk9SX3QgZXJyID0gSFVGRkRFQ19PSzsKKyAgaW50IGkgPSAwLCBsYXYgPSAwLCBlc2NhcGUgPSAwLCBlc2NDbnRyID0gMDsKKyAgaW50IG5vZGUgPSAwOworICB1bnNpZ25lZCBsb25nIGRhdGEgPSAwOworCisgIFNDSEFSIGVzY19kYXRhWzJdWzI4XSA9IHt7MH19OworICBpbnQgZXNjSWR4WzI4XSA9IHswfTsKKyAgY29uc3QgU0hPUlQoKm5vZGVUYWIpW01BWF9FTlRSSUVTXVsyXSA9IE5VTEw7CisKKyAgLyogTEFWICovCisgIGlmICgoZXJyID0KKyAgICAgICAgICAgaHVmZl9yZWFkKHN0cm0sIChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZkxhdklkeE5vZGVzLm5vZGVUYWJbMF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAmbm9kZSkpICE9IEhVRkZERUNfT0spIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgZGF0YSA9IC0obm9kZSArIDEpOworCisgIHN3aXRjaCAoZGF0YV90eXBlKSB7CisgICAgY2FzZSB0X0NMRDoKKyAgICAgIGxhdiA9IDIgKiBkYXRhICsgMzsgLyogMywgNSwgNywgOSAqLworICAgICAgbm9kZVRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZlBhcnQwTm9kZXMuY2xkWzBdWzBdOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X0lDQzoKKyAgICAgIGxhdiA9IDIgKiBkYXRhICsgMTsgLyogMSwgMywgNSwgNyAqLworICAgICAgbm9kZVRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZlBhcnQwTm9kZXMuaWNjWzBdWzBdOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X09MRDoKKyAgICAgIGxhdiA9IDMgKiBkYXRhICsgMzsKKyAgICAgIG5vZGVUYWIgPSAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZQYXJ0ME5vZGVzLm9sZFswXVswXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9JUEQ6CisgICAgICBpZiAoZGF0YSA9PSAwKQorICAgICAgICBkYXRhID0gMzsKKyAgICAgIGVsc2UKKyAgICAgICAgZGF0YS0tOworICAgICAgbGF2ID0gMiAqIGRhdGEgKyAxOyAvKiAxLCAzLCA1LCA3ICovCisgICAgICBub2RlVGFiID0gKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmUGFydDBOb2Rlcy5pcGRbMF1bMF07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIGVyciA9IEhVRkZERUNfTk9UT0s7CisgICAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBQYXJ0aXRpb24gMCAqLworICBpZiAocDBfZGF0YVswXSAhPSBOVUxMKSB7CisgICAgaWYgKChlcnIgPSBodWZmX3JlYWQoc3RybSwgbm9kZVRhYiwgJm5vZGUpKSAhPSBIVUZGREVDX09LKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgICpwMF9kYXRhWzBdID0gLShub2RlICsgMSk7CisgIH0KKyAgaWYgKHAwX2RhdGFbMV0gIT0gTlVMTCkgeworICAgIGlmICgoZXJyID0gaHVmZl9yZWFkKHN0cm0sIG5vZGVUYWIsICZub2RlKSkgIT0gSFVGRkRFQ19PSykgeworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICAqcDBfZGF0YVsxXSA9IC0obm9kZSArIDEpOworICB9CisKKyAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICBjYXNlIHRfQ0xEOgorICAgICAgc3dpdGNoIChsYXYpIHsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIG5vZGVUYWIgPQorICAgICAgICAgICAgICAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZDTEROb2Rlcy5oMkRbZGltMV1bZGltMl0tPmxhdjNbMF1bMF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICBub2RlVGFiID0KKyAgICAgICAgICAgICAgKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmQ0xETm9kZXMuaDJEW2RpbTFdW2RpbTJdLT5sYXY1WzBdWzBdOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgbm9kZVRhYiA9CisgICAgICAgICAgICAgIChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZkNMRE5vZGVzLmgyRFtkaW0xXVtkaW0yXS0+bGF2N1swXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA5OgorICAgICAgICAgIG5vZGVUYWIgPQorICAgICAgICAgICAgICAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZDTEROb2Rlcy5oMkRbZGltMV1bZGltMl0tPmxhdjlbMF1bMF07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfSUNDOgorICAgICAgc3dpdGNoIChsYXYpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIG5vZGVUYWIgPQorICAgICAgICAgICAgICAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZJQ0NOb2Rlcy5oMkRbZGltMV1bZGltMl0tPmxhdjFbMF1bMF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBub2RlVGFiID0KKyAgICAgICAgICAgICAgKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmSUNDTm9kZXMuaDJEW2RpbTFdW2RpbTJdLT5sYXYzWzBdWzBdOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgbm9kZVRhYiA9CisgICAgICAgICAgICAgIChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZklDQ05vZGVzLmgyRFtkaW0xXVtkaW0yXS0+bGF2NVswXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgIG5vZGVUYWIgPQorICAgICAgICAgICAgICAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZJQ0NOb2Rlcy5oMkRbZGltMV1bZGltMl0tPmxhdjdbMF1bMF07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfT0xEOgorICAgICAgc3dpdGNoIChsYXYpIHsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIG5vZGVUYWIgPSAoSEFORExFX0hVRkZfTk9ERSkmaHVmZk9MRE5vZGVzLmgyRFtkaW0xXVtkaW0yXS0+bGF2M1swXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgIG5vZGVUYWIgPSAoSEFORExFX0hVRkZfTk9ERSkmaHVmZk9MRE5vZGVzLmgyRFtkaW0xXVtkaW0yXS0+bGF2NlswXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA5OgorICAgICAgICAgIG5vZGVUYWIgPSAoSEFORExFX0hVRkZfTk9ERSkmaHVmZk9MRE5vZGVzLmgyRFtkaW0xXVtkaW0yXS0+bGF2OVswXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICBub2RlVGFiID0KKyAgICAgICAgICAgICAgKEhBTkRMRV9IVUZGX05PREUpJmh1ZmZPTEROb2Rlcy5oMkRbZGltMV1bZGltMl0tPmxhdjEyWzBdWzBdOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X0lQRDoKKyAgICAgIHN3aXRjaCAobGF2KSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBub2RlVGFiID0KKyAgICAgICAgICAgICAgKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmSVBETm9kZXMuaDJEW2RpbTFdW2RpbTJdLmxhdjFbMF1bMF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBub2RlVGFiID0KKyAgICAgICAgICAgICAgKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmSVBETm9kZXMuaDJEW2RpbTFdW2RpbTJdLmxhdjNbMF1bMF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICBub2RlVGFiID0KKyAgICAgICAgICAgICAgKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmSVBETm9kZXMuaDJEW2RpbTFdW2RpbTJdLmxhdjVbMF1bMF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICBub2RlVGFiID0KKyAgICAgICAgICAgICAgKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmSVBETm9kZXMuaDJEW2RpbTFdW2RpbTJdLmxhdjdbMF1bMF07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbDsgaSArPSBzdHJpZGUpIHsKKyAgICBpZiAoKGVyciA9IGh1ZmZfcmVhZF8yRChzdHJtLCBub2RlVGFiLCBvdXRfZGF0YVtpXSwgJmVzY2FwZSkpICE9CisgICAgICAgIEhVRkZERUNfT0spIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoZXNjYXBlKSB7CisgICAgICBlc2NJZHhbZXNjQ250cisrXSA9IGk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChkYXRhX3R5cGUgPT0gdF9JUEQpIHsKKyAgICAgICAgaWYgKChlcnIgPSBzeW1fcmVzdG9yZUlQRChzdHJtLCBsYXYsIG91dF9kYXRhW2ldKSkgIT0gSFVGRkRFQ19PSykgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChlcnIgPSBzeW1fcmVzdG9yZShzdHJtLCBsYXYsIG91dF9kYXRhW2ldKSkgIT0gSFVGRkRFQ19PSykgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSAvKiBpICovCisKKyAgaWYgKGVzY0NudHIgPiAwKSB7CisgICAgaWYgKChlcnIgPSBwY21fZGVjb2RlKHN0cm0sIGVzY19kYXRhWzBdLCBlc2NfZGF0YVsxXSwgMCwgMiAqIGVzY0NudHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICgyICogbGF2ICsgMSkpKSAhPSBIVUZGREVDX09LKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGVzY0NudHI7IGkrKykgeworICAgICAgb3V0X2RhdGFbZXNjSWR4W2ldXVswXSA9IGVzY19kYXRhWzBdW2ldIC0gbGF2OworICAgICAgb3V0X2RhdGFbZXNjSWR4W2ldXVsxXSA9IGVzY19kYXRhWzFdW2ldIC0gbGF2OworICAgIH0KKyAgfQorYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIEVSUk9SX3QgaHVmZl9kZWNvZGUoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwgU0NIQVIqIG91dF9kYXRhXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiogb3V0X2RhdGFfMiwgREFUQV9UWVBFIGRhdGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfVFlQRSBkaWZmX3R5cGVfMSwgRElGRl9UWVBFIGRpZmZfdHlwZV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV92YWwsIENPRElOR19TQ0hFTUUqIGNkZ19zY2hlbWUsIGludCBsZE1vZGUpIHsKKyAgRVJST1JfdCBlcnIgPSBIVUZGREVDX09LOworICBESUZGX1RZUEUgZGlmZl90eXBlOworCisgIGludCBpID0gMDsKKyAgVUxPTkcgZGF0YSA9IDA7CisKKyAgU0NIQVIgcGFpcl92ZWNbMjhdWzJdOworCisgIFNDSEFSKiBwMF9kYXRhXzFbMl0gPSB7TlVMTCwgTlVMTH07CisgIFNDSEFSKiBwMF9kYXRhXzJbMl0gPSB7TlVMTCwgTlVMTH07CisKKyAgaW50IHAwX2ZsYWdbMl07CisKKyAgaW50IG51bV92YWxfMV9pbnQgPSBudW1fdmFsOworICBpbnQgbnVtX3ZhbF8yX2ludCA9IG51bV92YWw7CisKKyAgU0NIQVIqIG91dF9kYXRhXzFfaW50ID0gb3V0X2RhdGFfMTsKKyAgU0NIQVIqIG91dF9kYXRhXzJfaW50ID0gb3V0X2RhdGFfMjsKKworICBpbnQgZGZfcmVzdF9mbGFnXzEgPSAwOworICBpbnQgZGZfcmVzdF9mbGFnXzIgPSAwOworCisgIGludCBodWZZWTE7CisgIGludCBodWZZWTI7CisgIGludCBodWZZWTsKKworICAvKiBDb2Rpbmcgc2NoZW1lICovCisgIGRhdGEgPSBGREtyZWFkQml0cyhzdHJtLCAxKTsKKyAgKmNkZ19zY2hlbWUgPSAoQ09ESU5HX1NDSEVNRSkoZGF0YSA8PCBQQUlSX1NISUZUKTsKKworICBpZiAoKmNkZ19zY2hlbWUgPj4gUEFJUl9TSElGVCA9PSBIVUZGXzJEKSB7CisgICAgaWYgKChvdXRfZGF0YV8xICE9IE5VTEwpICYmIChvdXRfZGF0YV8yICE9IE5VTEwpICYmIChsZE1vZGUgPT0gMCkpIHsKKyAgICAgIGRhdGEgPSBGREtyZWFkQml0cyhzdHJtLCAxKTsKKyAgICAgICpjZGdfc2NoZW1lID0gKENPRElOR19TQ0hFTUUpKCpjZGdfc2NoZW1lIHwgZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICpjZGdfc2NoZW1lID0gKENPRElOR19TQ0hFTUUpKCpjZGdfc2NoZW1lIHwgRlJFUV9QQUlSKTsKKyAgICB9CisgIH0KKworICB7CisgICAgaHVmWVkxID0gZGlmZl90eXBlXzE7CisgICAgaHVmWVkyID0gZGlmZl90eXBlXzI7CisgIH0KKworICBzd2l0Y2ggKCpjZGdfc2NoZW1lID4+IFBBSVJfU0hJRlQpIHsKKyAgICBjYXNlIEhVRkZfMUQ6CisgICAgICBwMF9mbGFnWzBdID0gKGRpZmZfdHlwZV8xID09IERJRkZfRlJFUSk7CisgICAgICBwMF9mbGFnWzFdID0gKGRpZmZfdHlwZV8yID09IERJRkZfRlJFUSk7CisgICAgICBpZiAob3V0X2RhdGFfMSAhPSBOVUxMKSB7CisgICAgICAgIGlmICgoZXJyID0gaHVmZl9kZWNfMUQoc3RybSwgZGF0YV90eXBlLCBodWZZWTEsIG91dF9kYXRhXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbF8xX2ludCwgcDBfZmxhZ1swXSkpICE9IEhVRkZERUNfT0spIHsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChvdXRfZGF0YV8yICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKChlcnIgPSBodWZmX2RlY18xRChzdHJtLCBkYXRhX3R5cGUsIGh1ZllZMiwgb3V0X2RhdGFfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFsXzJfaW50LCBwMF9mbGFnWzFdKSkgIT0gSFVGRkRFQ19PSykgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBicmVhazsgLyogSFVGRl8xRCAqLworCisgICAgY2FzZSBIVUZGXzJEOgorCisgICAgICBzd2l0Y2ggKCpjZGdfc2NoZW1lICYgUEFJUl9NQVNLKSB7CisgICAgICAgIGNhc2UgRlJFUV9QQUlSOgorCisgICAgICAgICAgaWYgKG91dF9kYXRhXzEgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGRpZmZfdHlwZV8xID09IERJRkZfRlJFUSkgeworICAgICAgICAgICAgICBwMF9kYXRhXzFbMF0gPSAmb3V0X2RhdGFfMVswXTsKKyAgICAgICAgICAgICAgcDBfZGF0YV8xWzFdID0gTlVMTDsKKworICAgICAgICAgICAgICBudW1fdmFsXzFfaW50IC09IDE7CisgICAgICAgICAgICAgIG91dF9kYXRhXzFfaW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZl9yZXN0X2ZsYWdfMSA9IG51bV92YWxfMV9pbnQgJSAyOworICAgICAgICAgICAgaWYgKGRmX3Jlc3RfZmxhZ18xKSBudW1fdmFsXzFfaW50IC09IDE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChvdXRfZGF0YV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChkaWZmX3R5cGVfMiA9PSBESUZGX0ZSRVEpIHsKKyAgICAgICAgICAgICAgcDBfZGF0YV8yWzBdID0gTlVMTDsKKyAgICAgICAgICAgICAgcDBfZGF0YV8yWzFdID0gJm91dF9kYXRhXzJbMF07CisKKyAgICAgICAgICAgICAgbnVtX3ZhbF8yX2ludCAtPSAxOworICAgICAgICAgICAgICBvdXRfZGF0YV8yX2ludCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGZfcmVzdF9mbGFnXzIgPSBudW1fdmFsXzJfaW50ICUgMjsKKyAgICAgICAgICAgIGlmIChkZl9yZXN0X2ZsYWdfMikgbnVtX3ZhbF8yX2ludCAtPSAxOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChvdXRfZGF0YV8xICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICgoZXJyID0gaHVmZl9kZWNfMkQoc3RybSwgZGF0YV90eXBlLCBodWZZWTEsIEZSRVFfUEFJUiwgcGFpcl92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YWxfMV9pbnQsIDIsIHAwX2RhdGFfMSkpICE9CisgICAgICAgICAgICAgICAgSFVGRkRFQ19PSykgeworICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGZfcmVzdF9mbGFnXzEpIHsKKyAgICAgICAgICAgICAgaWYgKChlcnIgPSBodWZmX2RlY18xRChzdHJtLCBkYXRhX3R5cGUsIGh1ZllZMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZGF0YV8xX2ludCArIG51bV92YWxfMV9pbnQsIDEsIDApKSAhPQorICAgICAgICAgICAgICAgICAgSFVGRkRFQ19PSykgeworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAob3V0X2RhdGFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoKGVyciA9IGh1ZmZfZGVjXzJEKHN0cm0sIGRhdGFfdHlwZSwgaHVmWVkyLCBGUkVRX1BBSVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJfdmVjICsgMSwgbnVtX3ZhbF8yX2ludCwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDBfZGF0YV8yKSkgIT0gSFVGRkRFQ19PSykgeworICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGZfcmVzdF9mbGFnXzIpIHsKKyAgICAgICAgICAgICAgaWYgKChlcnIgPSBodWZmX2RlY18xRChzdHJtLCBkYXRhX3R5cGUsIGh1ZllZMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZGF0YV8yX2ludCArIG51bV92YWxfMl9pbnQsIDEsIDApKSAhPQorICAgICAgICAgICAgICAgICAgSFVGRkRFQ19PSykgeworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChvdXRfZGF0YV8xICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsXzFfaW50IC0gMTsgaSArPSAyKSB7CisgICAgICAgICAgICAgIG91dF9kYXRhXzFfaW50W2ldID0gcGFpcl92ZWNbaV1bMF07CisgICAgICAgICAgICAgIG91dF9kYXRhXzFfaW50W2kgKyAxXSA9IHBhaXJfdmVjW2ldWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAob3V0X2RhdGFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbF8yX2ludCAtIDE7IGkgKz0gMikgeworICAgICAgICAgICAgICBvdXRfZGF0YV8yX2ludFtpXSA9IHBhaXJfdmVjW2kgKyAxXVswXTsKKyAgICAgICAgICAgICAgb3V0X2RhdGFfMl9pbnRbaSArIDFdID0gcGFpcl92ZWNbaSArIDFdWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsgLyogRlJFUV9QQUlSICovCisKKyAgICAgICAgY2FzZSBUSU1FX1BBSVI6CisgICAgICAgICAgaWYgKCgoZGlmZl90eXBlXzEgPT0gRElGRl9GUkVRKSB8fCAoZGlmZl90eXBlXzIgPT0gRElGRl9GUkVRKSkpIHsKKyAgICAgICAgICAgIHAwX2RhdGFfMVswXSA9ICZvdXRfZGF0YV8xWzBdOworICAgICAgICAgICAgcDBfZGF0YV8xWzFdID0gJm91dF9kYXRhXzJbMF07CisKKyAgICAgICAgICAgIG91dF9kYXRhXzFfaW50ICs9IDE7CisgICAgICAgICAgICBvdXRfZGF0YV8yX2ludCArPSAxOworCisgICAgICAgICAgICBudW1fdmFsXzFfaW50IC09IDE7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKChkaWZmX3R5cGVfMSA9PSBESUZGX1RJTUUpIHx8IChkaWZmX3R5cGVfMiA9PSBESUZGX1RJTUUpKSB7CisgICAgICAgICAgICBkaWZmX3R5cGUgPSBESUZGX1RJTUU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpZmZfdHlwZSA9IERJRkZfRlJFUTsKKyAgICAgICAgICB9CisgICAgICAgICAgeyBodWZZWSA9IGRpZmZfdHlwZTsgfQorCisgICAgICAgICAgaWYgKChlcnIgPSBodWZmX2RlY18yRChzdHJtLCBkYXRhX3R5cGUsIGh1ZllZLCBUSU1FX1BBSVIsIHBhaXJfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbF8xX2ludCwgMSwgcDBfZGF0YV8xKSkgIT0gSFVGRkRFQ19PSykgeworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsXzFfaW50OyBpKyspIHsKKyAgICAgICAgICAgIG91dF9kYXRhXzFfaW50W2ldID0gcGFpcl92ZWNbaV1bMF07CisgICAgICAgICAgICBvdXRfZGF0YV8yX2ludFtpXSA9IHBhaXJfdmVjW2ldWzFdOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOyAvKiBUSU1FX1BBSVIgKi8KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBicmVhazsgLyogSFVGRl8yRCAqLworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CitiYWlsOgorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBkaWZmX2ZyZXFfZGVjb2RlKGNvbnN0IFNDSEFSKiBjb25zdCBkaWZmX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSKiBjb25zdCBvdXRfZGF0YSwgY29uc3QgaW50IG51bV92YWwpIHsKKyAgaW50IGkgPSAwOworICBvdXRfZGF0YVswXSA9IGRpZmZfZGF0YVswXTsKKworICBmb3IgKGkgPSAxOyBpIDwgbnVtX3ZhbDsgaSsrKSB7CisgICAgb3V0X2RhdGFbaV0gPSBvdXRfZGF0YVtpIC0gMV0gKyBkaWZmX2RhdGFbaV07CisgIH0KK30KKworc3RhdGljIHZvaWQgZGlmZl90aW1lX2RlY29kZV9iYWNrd2FyZHMoY29uc3QgU0NIQVIqIGNvbnN0IHByZXZfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSKiBjb25zdCBkaWZmX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiogY29uc3Qgb3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWl4ZWRfZGlmZl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bV92YWwpIHsKKyAgaW50IGkgPSAwOyAvKiBkZWZhdWx0IHN0YXJ0IHZhbHVlKi8KKworICBpZiAobWl4ZWRfZGlmZl90eXBlKSB7CisgICAgb3V0X2RhdGFbMF0gPSBkaWZmX2RhdGFbMF07CisgICAgaSA9IDE7IC8qIG5ldyBzdGFydCB2YWx1ZSAqLworICB9CisgIGZvciAoOyBpIDwgbnVtX3ZhbDsgaSsrKSB7CisgICAgb3V0X2RhdGFbaV0gPSBwcmV2X2RhdGFbaV0gKyBkaWZmX2RhdGFbaV07CisgIH0KK30KKworc3RhdGljIHZvaWQgZGlmZl90aW1lX2RlY29kZV9mb3J3YXJkcyhjb25zdCBTQ0hBUiogY29uc3QgcHJldl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiogY29uc3QgZGlmZl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiogY29uc3Qgb3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBtaXhlZF9kaWZmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1fdmFsKSB7CisgIGludCBpID0gMDsgLyogZGVmYXVsdCBzdGFydCB2YWx1ZSovCisKKyAgaWYgKG1peGVkX2RpZmZfdHlwZSkgeworICAgIG91dF9kYXRhWzBdID0gZGlmZl9kYXRhWzBdOworICAgIGkgPSAxOyAvKiBuZXcgc3RhcnQgdmFsdWUgKi8KKyAgfQorICBmb3IgKDsgaSA8IG51bV92YWw7IGkrKykgeworICAgIG91dF9kYXRhW2ldID0gcHJldl9kYXRhW2ldIC0gZGlmZl9kYXRhW2ldOworICB9Cit9CisKK3N0YXRpYyBFUlJPUl90IGF0dGFjaF9sc2IoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwgU0NIQVIqIGluX2RhdGFfbXNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbnVtX2xzYiwgaW50IG51bV92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSKiBvdXRfZGF0YSkgeworICBpbnQgaSA9IDAsIGxzYiA9IDA7CisgIFVMT05HIGRhdGEgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsOyBpKyspIHsKKyAgICBpbnQgbXNiOworICAgIG1zYiA9IGluX2RhdGFfbXNiW2ldOworCisgICAgaWYgKG51bV9sc2IgPiAwKSB7CisgICAgICBkYXRhID0gRkRLcmVhZEJpdHMoc3RybSwgbnVtX2xzYik7CisgICAgICBsc2IgPSBkYXRhOworCisgICAgICBvdXRfZGF0YVtpXSA9ICgobXNiIDw8IG51bV9sc2IpIHwgbHNiKSAtIG9mZnNldDsKKyAgICB9IGVsc2UKKyAgICAgIG91dF9kYXRhW2ldID0gbXNiIC0gb2Zmc2V0OworICB9CisKKyAgcmV0dXJuIEhVRkZERUNfT0s7IC8qIGR1bW15ICovCit9CisKK0VSUk9SX3QgRWNEYXRhUGFpckRlYyhERUNPREVSX1RZUEUgREVDT0RFUiwgSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiogYWFPdXREYXRhMSwgU0NIQVIqIGFhT3V0RGF0YTIsIFNDSEFSKiBhSGlzdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRBX1RZUEUgZGF0YV90eXBlLCBpbnQgc3RhcnRCYW5kLCBpbnQgZGF0YUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBwYWlyX2ZsYWcsIGludCBjb2Fyc2VfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dEaWZmVGltZUJhY2tfZmxhZykKKworeworICBFUlJPUl90IGVyciA9IEhVRkZERUNfT0s7CisKKyAgLy8gaW50IGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcgPSAhaW5kZXBlbmRlbmN5X2ZsYWcgfHwgKHNldElkeCA+IDApOworICBpbnQgYXR0YWNoTHNiX2ZsYWcgPSAwOworICBpbnQgcGNtQ29kaW5nX2ZsYWcgPSAwOworCisgIGludCBtaXhlZF90aW1lX3BhaXIgPSAwLCBudW1WYWxQY20gPSAwOworICBpbnQgcXVhbnRfbGV2ZWxzID0gMCwgcXVhbnRfb2Zmc2V0ID0gMDsKKyAgVUxPTkcgZGF0YSA9IDA7CisKKyAgU0NIQVIgYWFEYXRhUGFpclsyXVsyOF0gPSB7ezB9fTsKKyAgU0NIQVIgYWFEYXRhRGlmZlsyXVsyOF0gPSB7ezB9fTsKKworICBTQ0hBUiBhSGlzdG9yeU1zYlsyOF0gPSB7MH07CisKKyAgU0NIQVIqIHBEYXRhVmVjWzJdID0ge05VTEwsIE5VTEx9OworCisgIERJRkZfVFlQRSBkaWZmX3R5cGVbMl0gPSB7RElGRl9GUkVRLCBESUZGX0ZSRVF9OworICBDT0RJTkdfU0NIRU1FIGNkZ19zY2hlbWUgPSBIVUZGXzFEOworICBESVJFQ1RJT04gZGlyZWN0aW9uID0gQkFDS1dBUkRTOworCisgIHN3aXRjaCAoZGF0YV90eXBlKSB7CisgICAgY2FzZSB0X0NMRDoKKyAgICAgIGlmIChjb2Fyc2VfZmxhZykgeworICAgICAgICBhdHRhY2hMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDE1OworICAgICAgICBxdWFudF9vZmZzZXQgPSA3OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXR0YWNoTHNiX2ZsYWcgPSAwOworICAgICAgICBxdWFudF9sZXZlbHMgPSAzMTsKKyAgICAgICAgcXVhbnRfb2Zmc2V0ID0gMTU7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSB0X0lDQzoKKyAgICAgIGlmIChjb2Fyc2VfZmxhZykgeworICAgICAgICBhdHRhY2hMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDQ7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBhdHRhY2hMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDg7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSB0X09MRDoKKyAgICAgIGlmIChjb2Fyc2VfZmxhZykgeworICAgICAgICBhdHRhY2hMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDg7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBhdHRhY2hMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDE2OworICAgICAgICBxdWFudF9vZmZzZXQgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfTlJHOgorICAgICAgaWYgKGNvYXJzZV9mbGFnKSB7CisgICAgICAgIGF0dGFjaExzYl9mbGFnID0gMDsKKyAgICAgICAgcXVhbnRfbGV2ZWxzID0gMzI7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBhdHRhY2hMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDY0OworICAgICAgICBxdWFudF9vZmZzZXQgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfSVBEOgorICAgICAgaWYgKCFjb2Fyc2VfZmxhZykgeworICAgICAgICBhdHRhY2hMc2JfZmxhZyA9IDE7CisgICAgICAgIHF1YW50X2xldmVscyA9IDE2OworICAgICAgICBxdWFudF9vZmZzZXQgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXR0YWNoTHNiX2ZsYWcgPSAwOworICAgICAgICBxdWFudF9sZXZlbHMgPSA4OworICAgICAgICBxdWFudF9vZmZzZXQgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEhVRkZERUNfTk9UT0s7CisgIH0KKworICBkYXRhID0gRkRLcmVhZEJpdHMoc3RybSwgMSk7CisgIHBjbUNvZGluZ19mbGFnID0gZGF0YTsKKworICBpZiAocGNtQ29kaW5nX2ZsYWcpIHsKKyAgICBpZiAocGFpcl9mbGFnKSB7CisgICAgICBwRGF0YVZlY1swXSA9IGFhRGF0YVBhaXJbMF07CisgICAgICBwRGF0YVZlY1sxXSA9IGFhRGF0YVBhaXJbMV07CisgICAgICBudW1WYWxQY20gPSAyICogZGF0YUJhbmRzOworICAgIH0gZWxzZSB7CisgICAgICBwRGF0YVZlY1swXSA9IGFhRGF0YVBhaXJbMF07CisgICAgICBwRGF0YVZlY1sxXSA9IE5VTEw7CisgICAgICBudW1WYWxQY20gPSBkYXRhQmFuZHM7CisgICAgfQorCisgICAgZXJyID0gcGNtX2RlY29kZShzdHJtLCBwRGF0YVZlY1swXSwgcERhdGFWZWNbMV0sIHF1YW50X29mZnNldCwgbnVtVmFsUGNtLAorICAgICAgICAgICAgICAgICAgICAgcXVhbnRfbGV2ZWxzKTsKKyAgICBpZiAoZXJyICE9IEhVRkZERUNfT0spIHJldHVybiBIVUZGREVDX05PVE9LOworCisgIH0gZWxzZSB7IC8qIERpZmZlcmVudGlhbC9IdWZmbWFuL0xTQiBDb2RpbmcgKi8KKworICAgIGlmIChwYWlyX2ZsYWcpIHsKKyAgICAgIHBEYXRhVmVjWzBdID0gYWFEYXRhRGlmZlswXTsKKyAgICAgIHBEYXRhVmVjWzFdID0gYWFEYXRhRGlmZlsxXTsKKyAgICB9IGVsc2UgeworICAgICAgcERhdGFWZWNbMF0gPSBhYURhdGFEaWZmWzBdOworICAgICAgcERhdGFWZWNbMV0gPSBOVUxMOworICAgIH0KKworICAgIGRpZmZfdHlwZVswXSA9IERJRkZfRlJFUTsKKyAgICBkaWZmX3R5cGVbMV0gPSBESUZGX0ZSRVE7CisKKyAgICBkaXJlY3Rpb24gPSBCQUNLV0FSRFM7CisgICAgeworICAgICAgaWYgKHBhaXJfZmxhZyB8fCBhbGxvd0RpZmZUaW1lQmFja19mbGFnKSB7CisgICAgICAgIGRhdGEgPSBGREtyZWFkQml0cyhzdHJtLCAxKTsKKyAgICAgICAgZGlmZl90eXBlWzBdID0gKERJRkZfVFlQRSlkYXRhOworICAgICAgfQorCisgICAgICBpZiAocGFpcl9mbGFnICYmCisgICAgICAgICAgKChkaWZmX3R5cGVbMF0gPT0gRElGRl9GUkVRKSB8fCBhbGxvd0RpZmZUaW1lQmFja19mbGFnKSkgeworICAgICAgICBkYXRhID0gRkRLcmVhZEJpdHMoc3RybSwgMSk7CisgICAgICAgIGRpZmZfdHlwZVsxXSA9IChESUZGX1RZUEUpZGF0YTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogSHVmZm1hbiBkZWNvZGluZyAqLworICAgIGVyciA9IGh1ZmZfZGVjb2RlKHN0cm0sIHBEYXRhVmVjWzBdLCBwRGF0YVZlY1sxXSwgZGF0YV90eXBlLCBkaWZmX3R5cGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgZGlmZl90eXBlWzFdLCBkYXRhQmFuZHMsICZjZGdfc2NoZW1lLAorICAgICAgICAgICAgICAgICAgICAgIChERUNPREVSID09IFNBT0NfREVDT0RFUikpOworICAgIGlmIChlcnIgIT0gSFVGRkRFQ19PSykgeworICAgICAgcmV0dXJuIEhVRkZERUNfTk9UT0s7CisgICAgfQorCisgICAgeworICAgICAgLyogRGlmZmVyZW50aWFsIGRlY29kaW5nICovCisgICAgICBpZiAoKGRpZmZfdHlwZVswXSA9PSBESUZGX1RJTUUpIHx8IChkaWZmX3R5cGVbMV0gPT0gRElGRl9USU1FKSkgeworICAgICAgICBpZiAoREVDT0RFUiA9PSBTQU9DX0RFQ09ERVIpIHsKKyAgICAgICAgICBkaXJlY3Rpb24gPSBCQUNLV0FSRFM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHBhaXJfZmxhZykgeworICAgICAgICAgICAgaWYgKChkaWZmX3R5cGVbMF0gPT0gRElGRl9USU1FKSAmJiAhYWxsb3dEaWZmVGltZUJhY2tfZmxhZykgeworICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBGT1JXQVJEUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZl90eXBlWzFdID09IERJRkZfVElNRSkgeworICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBCQUNLV0FSRFM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBkYXRhID0gRkRLcmVhZEJpdHMoc3RybSwgMSk7CisgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IChESVJFQ1RJT04pZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlyZWN0aW9uID0gQkFDS1dBUkRTOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBtaXhlZF90aW1lX3BhaXIgPSAoZGlmZl90eXBlWzBdICE9IGRpZmZfdHlwZVsxXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgoY2RnX3NjaGVtZSAmIFBBSVJfTUFTSykgPT0gVElNRV9QQUlSKTsKKworICAgICAgaWYgKGRpcmVjdGlvbiA9PSBCQUNLV0FSRFMpIHsKKyAgICAgICAgaWYgKGRpZmZfdHlwZVswXSA9PSBESUZGX0ZSRVEpIHsKKyAgICAgICAgICBkaWZmX2ZyZXFfZGVjb2RlKGFhRGF0YURpZmZbMF0sIGFhRGF0YVBhaXJbMF0sIGRhdGFCYW5kcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFCYW5kczsgaSsrKSB7CisgICAgICAgICAgICBhSGlzdG9yeU1zYltpXSA9IGFIaXN0b3J5W2kgKyBzdGFydEJhbmRdICsgcXVhbnRfb2Zmc2V0OworICAgICAgICAgICAgaWYgKGF0dGFjaExzYl9mbGFnKSB7CisgICAgICAgICAgICAgIGFIaXN0b3J5TXNiW2ldID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBkaWZmX3RpbWVfZGVjb2RlX2JhY2t3YXJkcyhhSGlzdG9yeU1zYiwgYWFEYXRhRGlmZlswXSwgYWFEYXRhUGFpclswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZF90aW1lX3BhaXIsIGRhdGFCYW5kcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpZmZfdHlwZVsxXSA9PSBESUZGX0ZSRVEpIHsKKyAgICAgICAgICBkaWZmX2ZyZXFfZGVjb2RlKGFhRGF0YURpZmZbMV0sIGFhRGF0YVBhaXJbMV0sIGRhdGFCYW5kcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGlmZl90aW1lX2RlY29kZV9iYWNrd2FyZHMoYWFEYXRhUGFpclswXSwgYWFEYXRhRGlmZlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYURhdGFQYWlyWzFdLCBtaXhlZF90aW1lX3BhaXIsIGRhdGFCYW5kcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGRpZmZfdHlwZVsxXSBNVVNUIEJFIERJRkZfRlJFUSAqLworICAgICAgICBkaWZmX2ZyZXFfZGVjb2RlKGFhRGF0YURpZmZbMV0sIGFhRGF0YVBhaXJbMV0sIGRhdGFCYW5kcyk7CisKKyAgICAgICAgaWYgKGRpZmZfdHlwZVswXSA9PSBESUZGX0ZSRVEpIHsKKyAgICAgICAgICBkaWZmX2ZyZXFfZGVjb2RlKGFhRGF0YURpZmZbMF0sIGFhRGF0YVBhaXJbMF0sIGRhdGFCYW5kcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGlmZl90aW1lX2RlY29kZV9mb3J3YXJkcyhhYURhdGFQYWlyWzFdLCBhYURhdGFEaWZmWzBdLCBhYURhdGFQYWlyWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWRfdGltZV9wYWlyLCBkYXRhQmFuZHMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogTFNCIGRlY29kaW5nICovCisgICAgZXJyID0gYXR0YWNoX2xzYihzdHJtLCBhYURhdGFQYWlyWzBdLCBxdWFudF9vZmZzZXQsIGF0dGFjaExzYl9mbGFnID8gMSA6IDAsCisgICAgICAgICAgICAgICAgICAgICBkYXRhQmFuZHMsIGFhRGF0YVBhaXJbMF0pOworICAgIGlmIChlcnIgIT0gSFVGRkRFQ19PSykgZ290byBiYWlsOworCisgICAgaWYgKHBhaXJfZmxhZykgeworICAgICAgZXJyID0gYXR0YWNoX2xzYihzdHJtLCBhYURhdGFQYWlyWzFdLCBxdWFudF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaExzYl9mbGFnID8gMSA6IDAsIGRhdGFCYW5kcywgYWFEYXRhUGFpclsxXSk7CisgICAgICBpZiAoZXJyICE9IEhVRkZERUNfT0spIGdvdG8gYmFpbDsKKyAgICB9CisgIH0gLyogRW5kOiBEaWZmZXJlbnRpYWwvSHVmZm1hbi9MU0IgQ29kaW5nICovCisKKyAgLyogQ29weSBkYXRhIHRvIG91dHB1dCBhcnJheXMgKi8KKyAgRkRLbWVtY3B5KGFhT3V0RGF0YTEgKyBzdGFydEJhbmQsIGFhRGF0YVBhaXJbMF0sIHNpemVvZihTQ0hBUikgKiBkYXRhQmFuZHMpOworICBpZiAocGFpcl9mbGFnKSB7CisgICAgRkRLbWVtY3B5KGFhT3V0RGF0YTIgKyBzdGFydEJhbmQsIGFhRGF0YVBhaXJbMV0sIHNpemVvZihTQ0hBUikgKiBkYXRhQmFuZHMpOworICB9CisKK2JhaWw6CisgIHJldHVybiBlcnI7Cit9CisKK0VSUk9SX3QgaHVmZl9kZWNfcmVzaGFwZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLCBpbnQqIG91dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fdmFsKSB7CisgIEVSUk9SX3QgZXJyID0gSFVGRkRFQ19PSzsKKyAgaW50IHZhbF9yY3ZkID0gMCwgZHVtbXkgPSAwLCBpID0gMCwgdmFsID0gMCwgbGVuID0gMDsKKyAgU0NIQVIgcmxfZGF0YVsyXSA9IHswfTsKKworICB3aGlsZSAodmFsX3JjdmQgPCBudW1fdmFsKSB7CisgICAgZXJyID0gaHVmZl9yZWFkXzJEKHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgIChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZlJlc2hhcGVOb2Rlcy5ub2RlVGFiWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBybF9kYXRhLCAmZHVtbXkpOworICAgIGlmIChlcnIgIT0gSFVGRkRFQ19PSykgZ290byBiYWlsOworICAgIHZhbCA9IHJsX2RhdGFbMF07CisgICAgbGVuID0gcmxfZGF0YVsxXSArIDE7CisgICAgaWYgKHZhbF9yY3ZkICsgbGVuID4gbnVtX3ZhbCkgeworICAgICAgZXJyID0gSFVGRkRFQ19OT1RPSzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgZm9yIChpID0gdmFsX3JjdmQ7IGkgPCB2YWxfcmN2ZCArIGxlbjsgaSsrKSB7CisgICAgICBvdXRfZGF0YVtpXSA9IHZhbDsKKyAgICB9CisgICAgdmFsX3JjdmQgKz0gbGVuOworICB9CitiYWlsOgorICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9xbWYuY3BwIGIvbGliRkRLL3NyYy9xbWYuY3BwCmluZGV4IDU0NTI2ZGQuLjZmY2EwNDMgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvcW1mLmNwcAorKysgYi9saWJGREsvc3JjL3FtZi5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzE3ICs5MCwxMjkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNYXJrdXMgTG9od2Fzc2VyLCBKb3NlZiBIb2VwZmwsIE1hbnVlbCBKYW5kZXIKKwogICAgRGVzY3JpcHRpb246IFFNRiBmaWx0ZXJiYW5rCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIENvbXBsZXggcW1mIGFuYWx5c2lzL3N5bnRoZXNpcywgIAotICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgcW1mIGZpbHRlcmJhbmsgZm9yIGFuYWx5c2lzIFsgY3BseEFuYWx5c2lzUW1mRmlsdGVyaW5nKCkgXSBhbmQKLSAgc3ludGhlc2lzIFsgY3BseFN5bnRoZXNpc1FtZkZpbHRlcmluZygpIF0uIEl0IGlzIGEgcG9seXBoYXNlIGltcGxlbWVudGF0aW9uIG9mIGEgY29tcGxleAotICBleHBvbmVudGlhbCBtb2R1bGF0ZWQgZmlsdGVyIGJhbmsuIFRoZSBhbmFseXNpcyBwYXJ0IHVzdWFsbHkgcnVucyBhdCBoYWxmIHRoZSBzYW1wbGUgcmF0ZQotICB0aGFuIHRoZSBzeW50aGVzaXMgcGFydC4gKFNvIGNhbGxlZCAiZHVhbC1yYXRlIiBtb2RlLikKKyAgXGJyaWVmICBDb21wbGV4IHFtZiBhbmFseXNpcy9zeW50aGVzaXMKKyAgVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIHFtZiBmaWx0ZXJiYW5rIGZvciBhbmFseXNpcyBbCisgIGNwbHhBbmFseXNpc1FtZkZpbHRlcmluZygpIF0gYW5kIHN5bnRoZXNpcyBbIGNwbHhTeW50aGVzaXNRbWZGaWx0ZXJpbmcoKSBdLiBJdAorICBpcyBhIHBvbHlwaGFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvbXBsZXggZXhwb25lbnRpYWwgbW9kdWxhdGVkIGZpbHRlciBiYW5rLgorICBUaGUgYW5hbHlzaXMgcGFydCB1c3VhbGx5IHJ1bnMgYXQgaGFsZiB0aGUgc2FtcGxlIHJhdGUgdGhhbiB0aGUgc3ludGhlc2lzCisgIHBhcnQuIChTbyBjYWxsZWQgImR1YWwtcmF0ZSIgbW9kZS4pCiAKLSAgVGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgcHJvdG90eXBlIGZpbHRlciBhcmUgc3BlY2lmaWVkIGluICNzYnJfcW1mXzY0XzY0MCAoaW4gc2JyX3JvbS5jcHApLgotICBUaHVzIG9ubHkgYSA2NCBjaGFubmVsIHZlcnNpb24gKDMyIG9uIHRoZSBhbmFseXNpcyBzaWRlKSB3aXRoIGEgNjQwIHRhcCBwcm90b3R5cGUgZmlsdGVyCi0gIGFyZSB1c2VkLgorICBUaGUgY29lZmZpY2llbnRzIG9mIHRoZSBwcm90b3R5cGUgZmlsdGVyIGFyZSBzcGVjaWZpZWQgaW4gI3FtZl9wZmlsdDY0MCAoaW4KKyAgc2JyX3JvbS5jcHApLiBUaHVzIG9ubHkgYSA2NCBjaGFubmVsIHZlcnNpb24gKDMyIG9uIHRoZSBhbmFseXNpcyBzaWRlKSB3aXRoIGEKKyAgNjQwIHRhcCBwcm90b3R5cGUgZmlsdGVyIGFyZSB1c2VkLgogCiAgIFxhbmNob3IgUG9seXBoYXNlRmlsdGVyaW5nIDxoMj5BYm91dCBwb2x5cGhhc2UgZmlsdGVyaW5nPC9oMj4KLSAgVGhlIHBvbHlwaGFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGZpbHRlcmJhbmsgcmVxdWlyZXMgZmlsdGVyaW5nIGF0IHRoZSBpbnB1dCBhbmQgb3V0cHV0LgotICBUaGlzIGlzIGltcGxlbWVudGVkIGFzIHBhcnQgb2YgY3BseEFuYWx5c2lzUW1mRmlsdGVyaW5nKCkgYW5kIGNwbHhTeW50aGVzaXNRbWZGaWx0ZXJpbmcoKS4KLSAgVGhlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGluIGEgc3BlY2lmaWMgc3RydWN0dXJlIGFzIGRlc2NyaWJlZCBpbgotICAjc2JyX3FtZl82NF82NDBfcW1mIChpbiBzYnJfcm9tLmNwcCkuCisgIFRoZSBwb2x5cGhhc2UgaW1wbGVtZW50YXRpb24gb2YgYSBmaWx0ZXJiYW5rIHJlcXVpcmVzIGZpbHRlcmluZyBhdCB0aGUgaW5wdXQKKyAgYW5kIG91dHB1dC4gVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIGNwbHhBbmFseXNpc1FtZkZpbHRlcmluZygpIGFuZAorICBjcGx4U3ludGhlc2lzUW1mRmlsdGVyaW5nKCkuIFRoZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGUgZmlsdGVyCisgIGNvZWZmaWNpZW50cyBpbiBhIHNwZWNpZmljIHN0cnVjdHVyZSBhcyBkZXNjcmliZWQgaW4gI3Nicl9xbWZfNjRfNjQwX3FtZiAoaW4KKyAgc2JyX3JvbS5jcHApLgogCi0gIFRoaXMgbW9kdWxlIGNvbXByaXNlcyB0aGUgY29tcHV0YXRpb25hbGx5IG1vc3QgZXhwZW5zaXZlIGZ1bmN0aW9ucyBvZiB0aGUgU0JSIGRlY29kZXIuIFRoZSBhY2N1cmFjeSBvZgotICBjb21wdXRhdGlvbnMgaXMgYWxzbyBpbXBvcnRhbnQgYW5kIGhhcyBhIGRpcmVjdCBpbXBhY3Qgb24gdGhlIG92ZXJhbGwgc291bmQgcXVhbGl0eS4gVGhlcmVmb3JlIGEgc3BlY2lhbAotICB0ZXN0IHByb2dyYW0gaXMgYXZhaWxhYmxlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG9ubHkgdGVzdCB0aGUgZmlsdGVyYmFuazogbWFpbl9hdWRpby5jcHAKKyAgVGhpcyBtb2R1bGUgY29tcHJpc2VzIHRoZSBjb21wdXRhdGlvbmFsbHkgbW9zdCBleHBlbnNpdmUgZnVuY3Rpb25zIG9mIHRoZSBTQlIKKyAgZGVjb2Rlci4gVGhlIGFjY3VyYWN5IG9mIGNvbXB1dGF0aW9ucyBpcyBhbHNvIGltcG9ydGFudCBhbmQgaGFzIGEgZGlyZWN0CisgIGltcGFjdCBvbiB0aGUgb3ZlcmFsbCBzb3VuZCBxdWFsaXR5LiBUaGVyZWZvcmUgYSBzcGVjaWFsIHRlc3QgcHJvZ3JhbSBpcworICBhdmFpbGFibGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gb25seSB0ZXN0IHRoZSBmaWx0ZXJiYW5rOiBtYWluX2F1ZGlvLmNwcAogCi0gIFRoaXMgbW9kdWxlcyBhbHNvIHVzZXMgc2NhbGluZyBvZiBkYXRhIHRvIHByb3ZpZGUgYmV0dGVyIFNOUiBvbiBmaXhlZC1wb2ludCBwcm9jZXNzb3JzLiBTZWUgI1FNRl9TQ0FMRV9GQUNUT1IgKGluIHNicl9zY2FsZS5oKSBmb3IgZGV0YWlscy4KLSAgQW4gaW50ZXJlc3Rpbmcgbm90ZTogVGhlIGZ1bmN0aW9uIGdldFNjYWxlZmFjdG9yKCkgY2FuIGNvbnN0aXR1dGUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgY29tcHV0YXRpb25hbCBjb21wbGV4aXR5IC0gdmVyeSBtdWNoIGRlcGVuZGluZyBvbiB0aGUKLSAgYml0cmF0ZS4gU2luY2UgaXQgaXMgYSByYXRoZXIgc21hbGwgZnVuY3Rpb24sIGVmZmVjdGl2ZSBhc3NlbWJsZXIgb3B0aW1pemF0aW9uIG1pZ2h0IGJlIHBvc3NpYmxlLgorICBUaGlzIG1vZHVsZXMgYWxzbyB1c2VzIHNjYWxpbmcgb2YgZGF0YSB0byBwcm92aWRlIGJldHRlciBTTlIgb24gZml4ZWQtcG9pbnQKKyAgcHJvY2Vzc29ycy4gU2VlICNRTUZfU0NBTEVfRkFDVE9SIChpbiBzYnJfc2NhbGUuaCkgZm9yIGRldGFpbHMuIEFuIGludGVyZXN0aW5nCisgIG5vdGU6IFRoZSBmdW5jdGlvbiBnZXRTY2FsZWZhY3RvcigpIGNhbiBjb25zdGl0dXRlIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mCisgIGNvbXB1dGF0aW9uYWwgY29tcGxleGl0eSAtIHZlcnkgbXVjaCBkZXBlbmRpbmcgb24gdGhlIGJpdHJhdGUuIFNpbmNlIGl0IGlzIGEKKyAgcmF0aGVyIHNtYWxsIGZ1bmN0aW9uLCBlZmZlY3RpdmUgYXNzZW1ibGVyIG9wdGltaXphdGlvbiBtaWdodCBiZSBwb3NzaWJsZS4KIAogKi8KIAogI2luY2x1ZGUgInFtZi5oIgogCi0KKyNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKICNpbmNsdWRlICJmaXhwb2ludF9tYXRoLmgiCiAjaW5jbHVkZSAiZGN0LmgiCiAKLSNpZmRlZiBRTUZTWU5fU1RBVEVTXzE2QklUCi0jZGVmaW5lIFFTU0NBTEUgKDcpCi0jZGVmaW5lIEZYX0RCTDJGWF9RU1MoeCkgKChGSVhQX1FTUykgKCh4KT4+KERGUkFDVF9CSVRTLVFTU19CSVRTLVFTU0NBTEUpICkpCi0jZGVmaW5lIEZYX1FTUzJGWF9EQkwoeCkgKChGSVhQX0RCTCkoKExPTkcpeCk8PChERlJBQ1RfQklUUy1RU1NfQklUUy1RU1NDQUxFKSkKLSNlbHNlCiAjZGVmaW5lIFFTU0NBTEUgKDApCiAjZGVmaW5lIEZYX0RCTDJGWF9RU1MoeCkgKHgpCiAjZGVmaW5lIEZYX1FTUzJGWF9EQkwoeCkgKHgpCi0jZW5kaWYKIAotCi0jaWYgZGVmaW5lZChfX2FybV9fKQotI2luY2x1ZGUgImFybS9xbWZfYXJtLmNwcCIKLQotI2VuZGlmCi0KLS8qIQotICogXGJyaWVmIEFsZ29yaXRobWljIHNjYWxpbmcgaW4gc2JyRm9yd2FyZE1vZHVsYXRpb24oKQotICoKLSAqIFRoZSBzY2FsaW5nIGluIHNickZvcndhcmRNb2R1bGF0aW9uKCkgaXMgY2F1c2VkIGJ5OgotICoKLSAqICAgXGxpIDEgUl9TSElGVCBpbiBzYnJGb3J3YXJkTW9kdWxhdGlvbigpCi0gKiAgIFxsaSA1LzYgUl9TSElGVCBpbiBkY3QzKCkgaWYgdXNpbmcgMzIvNjQgQmFuZHMKLSAqICAgXGxpIDEgb21taXRlZCBnYWluIG9mIDIuMCBpbiBxbWZGb3J3YXJkTW9kdWxhdGlvbigpCi0gKi8KLSNkZWZpbmUgQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LIDcKLQotLyohCi0gKiBcYnJpZWYgQWxnb3JpdGhtaWMgc2NhbGluZyBpbiBjcGx4U3ludGhlc2lzUW1mRmlsdGVyaW5nKCkKLSAqCi0gKiBUaGUgc2NhbGluZyBpbiBjcGx4U3ludGhlc2lzUW1mRmlsdGVyaW5nKCkgaXMgY2F1c2VkIGJ5OgotICoKLSAqICAgXGxpICA1LzYgUl9TSElGVCBpbiBkY3QyKCkgaWYgdXNpbmcgMzIvNjQgQmFuZHMKLSAqICAgXGxpICAxIG9tbWl0ZWQgZ2FpbiBvZiAyLjAgaW4gcW1mSW52ZXJzZU1vZHVsYXRpb24oKQotICogICBcbGkgLTYgZGl2aXNpb24gYnkgNjQgaW4gc3ludGhlc2lzIGZpbHRlcmJhbmsKLSAqICAgXGxpIHggYml0cyBleHRlcm5hbCBpbmZsdWVuY2UKLSAqLwotI2RlZmluZSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LIDEKLQotCi0vKiEKLSAgXGJyaWVmIFBlcmZvcm0gU3ludGhlc2lzIFByb3RvdHlwZSBGaWx0ZXJpbmcgb24gYSBzaW5nbGUgc2xvdCBvZiBpbnB1dCBkYXRhLgotCi0gIFRoZSBmaWx0ZXIgdGFrZXMgMiAqIHFtZi0+bm9fY2hhbm5lbHMgb2YgaW5wdXQgZGF0YSBhbmQKLSAgZ2VuZXJhdGVzIHFtZi0+bm9fY2hhbm5lbHMgdGltZSBkb21haW4gb3V0cHV0IHNhbXBsZXMuCi0qLwotc3RhdGljCi0jaWZuZGVmIEZVTkNUSU9OX3FtZlN5blByb3RvdHlwZUZpclNsb3QKLXZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdCgKLSNlbHNlCi12b2lkIHFtZlN5blByb3RvdHlwZUZpclNsb3RfZmFsbGJhY2soCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBxbWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCByZWFsU2xvdCwgICAgICAgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIHJlYWwgU2xvdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgaW1hZ1Nsb3QsICAgICAgICAgICAgLyohPCBJbnB1dDogUG9pbnRlciB0byBpbWFnIFNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgKlJFU1RSSUNUIHRpbWVPdXQsICAgICAgICAgICAgIC8qITwgVGltZSBkb21haW4gZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICBGSVhQX1FTUyogRmlsdGVyU3RhdGVzID0gKEZJWFBfUVNTKilxbWYtPkZpbHRlclN0YXRlczsKLSAgaW50ICAgICAgIG5vX2NoYW5uZWxzID0gcW1mLT5ub19jaGFubmVsczsKLSAgY29uc3QgRklYUF9QRlQgKnBfRmlsdGVyID0gcW1mLT5wX2ZpbHRlcjsKLSAgaW50IHBfc3RyaWRlID0gcW1mLT5wX3N0cmlkZTsKLSAgaW50IGo7Ci0gIEZJWFBfUVNTICpSRVNUUklDVCBzdGEgPSBGaWx0ZXJTdGF0ZXM7Ci0gIGNvbnN0IEZJWFBfUEZUICpSRVNUUklDVCBwX2ZsdCwgKlJFU1RSSUNUIHBfZmx0bTsKLSAgaW50IHNjYWxlID0gKChERlJBQ1RfQklUUy1TQU1QTEVfQklUUyktMS1xbWYtPm91dFNjYWxlZmFjdG9yKTsKLQotICBwX2ZsdCAgPSBwX0ZpbHRlcitwX3N0cmlkZSpRTUZfTk9fUE9MWTsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICA1LXRlciB2b24gMzMwICovCi0gIHBfZmx0bSA9IHBfRmlsdGVyKyhxbWYtPkZpbHRlclNpemUvMiktcF9zdHJpZGUqUU1GX05PX1BPTFk7ICAvKiA1ICsgKDMyMCAtIDIqNSkgPSAzMTUtdGVyIHZvbiAzMzAgKi8KLQotICBGREtfQVNTRVJUKFNBTVBMRV9CSVRTLTEtcW1mLT5vdXRTY2FsZWZhY3RvciA+PSAwKTsgLy8gICAoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMpLTEtcW1mLT5vdXRTY2FsZWZhY3RvciA+PSAwKTsKLQotICBmb3IgKGogPSBub19jaGFubmVscy0xOyBqID49IDA7IGotLSkgeyAgLyogLS0tLSBs5HVmdCB1ZWJlciBhbGxlIExpbmllbiBlaW5lcyBTbG90cyAtLS0tICovCi0gICAgRklYUF9RTUYgaW1hZyAgPSAgaW1hZ1Nsb3Rbal07ICAvLyBub19jaGFubmVscy0xIC4uIDAKLSAgICBGSVhQX1FNRiByZWFsICA9ICByZWFsU2xvdFtqXTsgIC8vIH5+In5+Ci0gICAgewotICAgICAgSU5UX1BDTSB0bXA7Ci0gICAgICBGSVhQX0RCTCBBcmUgPSBGWF9RU1MyRlhfREJMKHN0YVswXSkgKyBmTXVsdERpdjIoIHBfZmx0bVswXSAsIHJlYWwpOwotCi0gICAgICBpZiAocW1mLT5vdXRHYWluIT0oRklYUF9EQkwpMHg4MDAwMDAwMCkgewotICAgICAgICBBcmUgPSBmTXVsdChBcmUscW1mLT5vdXRHYWluKTsKLSAgICAgIH0KLQotICAjaWYgU0FNUExFX0JJVFMgPiAxNgotICAgICAgdG1wID0gKElOVF9QQ00pKFNBVFVSQVRFX1NISUZUKGZBYnMoQXJlKSwgc2NhbGUsIFNBTVBMRV9CSVRTKSk7Ci0gICNlbHNlCi0gICAgICB0bXAgPSAoSU5UX1BDTSkoU0FUVVJBVEVfUklHSFRfU0hJRlQoZkFicyhBcmUpLCBzY2FsZSwgU0FNUExFX0JJVFMpKTsKLSAgI2VuZGlmCi0gICAgICBpZiAoQXJlIDwgKEZJWFBfUU1GKTApIHsKLSAgICAgICAgdG1wID0gLXRtcDsKLSAgICAgIH0KLSAgICAgIHRpbWVPdXRbIChqKSpzdHJpZGUgXSA9IHRtcDsKLSAgICB9Ci0KLSAgICBzdGFbMF0gPSBzdGFbMV0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHQgWzRdICwgaW1hZyApKTsKLSAgICBzdGFbMV0gPSBzdGFbMl0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHRtWzFdICwgcmVhbCApKTsKLSAgICBzdGFbMl0gPSBzdGFbM10gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHQgWzNdICwgaW1hZyApKTsKLSAgICBzdGFbM10gPSBzdGFbNF0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHRtWzJdICwgcmVhbCApKTsKLSAgICBzdGFbNF0gPSBzdGFbNV0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHQgWzJdICwgaW1hZyApKTsKLSAgICBzdGFbNV0gPSBzdGFbNl0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHRtWzNdICwgcmVhbCApKTsKLSAgICBzdGFbNl0gPSBzdGFbN10gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHQgWzFdICwgaW1hZyApKTsKLSAgICBzdGFbN10gPSBzdGFbOF0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHRtWzRdICwgcmVhbCApKTsKLSAgICBzdGFbOF0gPSAgICAgICAgICBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHQgWzBdICwgaW1hZyApKTsKLQotICAgIHBfZmx0ICArPSAocF9zdHJpZGUqUU1GX05PX1BPTFkpOwotICAgIHBfZmx0bSAtPSAocF9zdHJpZGUqUU1GX05PX1BPTFkpOwotICAgIHN0YSAgICArPSA5OyAvLyA9ICgyKlFNRl9OT19QT0xZLTEpOwotICB9Ci19Ci0KLSNpZm5kZWYgRlVOQ1RJT05fcW1mU3luUHJvdG90eXBlRmlyU2xvdF9Ob25TeW1tZXRyaWMKLS8qIQotICBcYnJpZWYgUGVyZm9ybSBTeW50aGVzaXMgUHJvdG90eXBlIEZpbHRlcmluZyBvbiBhIHNpbmdsZSBzbG90IG9mIGlucHV0IGRhdGEuCi0KLSAgVGhlIGZpbHRlciB0YWtlcyAyICogcW1mLT5ub19jaGFubmVscyBvZiBpbnB1dCBkYXRhIGFuZAotICBnZW5lcmF0ZXMgcW1mLT5ub19jaGFubmVscyB0aW1lIGRvbWFpbiBvdXRwdXQgc2FtcGxlcy4KLSovCi1zdGF0aWMKLXZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdF9Ob25TeW1tZXRyaWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgcW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgcmVhbFNsb3QsICAgICAgICAgICAgLyohPCBJbnB1dDogUG9pbnRlciB0byByZWFsIFNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKlJFU1RSSUNUIGltYWdTbG90LCAgICAgICAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gaW1hZyBTbG90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICpSRVNUUklDVCB0aW1lT3V0LCAgICAgICAgICAgICAvKiE8IFRpbWUgZG9tYWluIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgRklYUF9RU1MqIEZpbHRlclN0YXRlcyA9IChGSVhQX1FTUyopcW1mLT5GaWx0ZXJTdGF0ZXM7Ci0gIGludCAgICAgICBub19jaGFubmVscyA9IHFtZi0+bm9fY2hhbm5lbHM7Ci0gIGNvbnN0IEZJWFBfUEZUICpwX0ZpbHRlciA9IHFtZi0+cF9maWx0ZXI7Ci0gIGludCBwX3N0cmlkZSA9IHFtZi0+cF9zdHJpZGU7Ci0gIGludCBqOwotICBGSVhQX1FTUyAqUkVTVFJJQ1Qgc3RhID0gRmlsdGVyU3RhdGVzOwotICBjb25zdCBGSVhQX1BGVCAqUkVTVFJJQ1QgcF9mbHQsICpSRVNUUklDVCBwX2ZsdG07Ci0gIGludCBzY2FsZSA9ICgoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMpLTEtcW1mLT5vdXRTY2FsZWZhY3Rvcik7Ci0KLSAgcF9mbHQgID0gcF9GaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGZpcnN0IGhhbGYgb2YgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotICBwX2ZsdG0gPSAmcF9mbHRbcW1mLT5GaWx0ZXJTaXplLzJdOyAgLyogYXQgaW5kZXggMzIwLCBvdmVyYWxsIDY0MCBjb2VmZmljaWVudHMgKi8KLQotICBGREtfQVNTRVJUKFNBTVBMRV9CSVRTLTEtcW1mLT5vdXRTY2FsZWZhY3RvciA+PSAwKTsgLy8gICAoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMpLTEtcW1mLT5vdXRTY2FsZWZhY3RvciA+PSAwKTsKLQotICBmb3IgKGogPSBub19jaGFubmVscy0xOyBqID49IDA7IGotLSkgeyAgLyogLS0tLSBs5HVmdCB1ZWJlciBhbGxlIExpbmllbiBlaW5lcyBTbG90cyAtLS0tICovCi0KLSAgICBGSVhQX1FNRiBpbWFnICA9ICBpbWFnU2xvdFtqXTsgIC8vIG5vX2NoYW5uZWxzLTEgLi4gMAotICAgIEZJWFBfUU1GIHJlYWwgID0gIHJlYWxTbG90W2pdOyAgLy8gfn4ifn4KLSAgICB7Ci0gICAgICBJTlRfUENNIHRtcDsKLSAgICAgIEZJWFBfUU1GIEFyZSA9IHN0YVswXSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdG1bNF0gLCByZWFsICkpOwotCi0gICNpZiBTQU1QTEVfQklUUyA+IDE2Ci0gICAgICB0bXAgPSAoSU5UX1BDTSkoU0FUVVJBVEVfU0hJRlQoZkFicyhBcmUpLCBzY2FsZSwgU0FNUExFX0JJVFMpKTsKLSAgI2Vsc2UKLSAgICAgIHRtcCA9IChJTlRfUENNKShTQVRVUkFURV9SSUdIVF9TSElGVChmQWJzKEFyZSksIHNjYWxlLCBTQU1QTEVfQklUUykpOwotICAjZW5kaWYKLSAgICAgIGlmIChBcmUgPCAoRklYUF9RTUYpMCkgewotICAgICAgICB0bXAgPSAtdG1wOwotICAgICAgfQotICAgICAgdGltZU91dFtqKnN0cmlkZV0gPSB0bXA7Ci0gICAgfQotCi0gICAgc3RhWzBdID0gc3RhWzFdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0IFs0XSAsIGltYWcgKSk7Ci0gICAgc3RhWzFdID0gc3RhWzJdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0bVszXSAsIHJlYWwgKSk7Ci0gICAgc3RhWzJdID0gc3RhWzNdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0IFszXSAsIGltYWcgKSk7Ci0KLSAgICBzdGFbM10gPSBzdGFbNF0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHRtWzJdICwgcmVhbCApKTsKLSAgICBzdGFbNF0gPSBzdGFbNV0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHQgWzJdICwgaW1hZyApKTsKLSAgICBzdGFbNV0gPSBzdGFbNl0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHRtWzFdICwgcmVhbCApKTsKLSAgICBzdGFbNl0gPSBzdGFbN10gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHQgWzFdICwgaW1hZyApKTsKLQotICAgIHN0YVs3XSA9IHN0YVs4XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdG1bMF0gLCByZWFsICkpOwotICAgIHN0YVs4XSA9ICAgICAgICAgIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdCBbMF0gLCBpbWFnICkpOwotCi0gICAgcF9mbHQgICs9IChwX3N0cmlkZSpRTUZfTk9fUE9MWSk7Ci0gICAgcF9mbHRtICs9IChwX3N0cmlkZSpRTUZfTk9fUE9MWSk7Ci0gICAgc3RhICAgICs9IDk7IC8vID0gKDIqUU1GX05PX1BPTFktMSk7Ci0gIH0KLQotfQotI2VuZGlmIC8qIEZVTkNUSU9OX3FtZlN5blByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljICovCisvKiBtb3ZlZCB0byBxbWZfcGNtLmg6IC0+IHFtZlN5blByb3RvdHlwZUZpclNsb3QgKi8KKy8qIG1vdmVkIHRvIHFtZl9wY20uaDogLT4gcW1mU3luUHJvdG90eXBlRmlyU2xvdF9Ob25TeW1tZXRyaWMgKi8KKy8qIG1vdmVkIHRvIHFtZl9wY20uaDogLT4gcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdCAqLwogCiAjaWZuZGVmIEZVTkNUSU9OX3FtZkFuYVByb3RvdHlwZUZpclNsb3QKIC8qIQogICBcYnJpZWYgUGVyZm9ybSBBbmFseXNpcyBQcm90b3R5cGUgRmlsdGVyaW5nIG9uIGEgc2luZ2xlIHNsb3Qgb2YgaW5wdXQgZGF0YS4KICovCi1zdGF0aWMKLXZvaWQgcW1mQW5hUHJvdG90eXBlRmlyU2xvdCggRklYUF9RTUYgKmFuYWx5c2lzQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9fY2hhbm5lbHMsICAgICAgICAgICAgIC8qITwgTnVtYmVyIGNoYW5uZWxzIG9mIGFuYWx5c2lzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1BGVCAqcF9maWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBwX3N0cmlkZSwgICAgICAgICAgICAgICAgLyohPCBTdGlkZSBvZiBhbmFseXNpcyBmaWx0ZXIgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RQVMgKlJFU1RSSUNUIHBGaWx0ZXJTdGF0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgaW50IGs7CitzdGF0aWMgdm9pZCBxbWZBbmFQcm90b3R5cGVGaXJTbG90KAorICAgIEZJWFBfREJMICphbmFseXNpc0J1ZmZlciwKKyAgICBJTlQgbm9fY2hhbm5lbHMsIC8qITwgTnVtYmVyIGNoYW5uZWxzIG9mIGFuYWx5c2lzIGZpbHRlciAqLworICAgIGNvbnN0IEZJWFBfUEZUICpwX2ZpbHRlciwgSU5UIHBfc3RyaWRlLCAvKiE8IFN0cmlkZSBvZiBhbmFseXNpcyBmaWx0ZXIgICAgKi8KKyAgICBGSVhQX1FBUyAqUkVTVFJJQ1QgcEZpbHRlclN0YXRlcykgeworICBJTlQgazsKIAotICAgIEZJWFBfREJMIGFjY3U7Ci0gICAgY29uc3QgRklYUF9QRlQgKlJFU1RSSUNUIHBfZmx0ID0gcF9maWx0ZXI7Ci0gICAgRklYUF9RTUYgKlJFU1RSSUNUIHBEYXRhXzAgPSBhbmFseXNpc0J1ZmZlciArIDIqbm9fY2hhbm5lbHMgLSAxOwotICAgIEZJWFBfUU1GICpSRVNUUklDVCBwRGF0YV8xID0gYW5hbHlzaXNCdWZmZXI7CisgIEZJWFBfREJMIGFjY3U7CisgIGNvbnN0IEZJWFBfUEZUICpSRVNUUklDVCBwX2ZsdCA9IHBfZmlsdGVyOworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdGFfMCA9IGFuYWx5c2lzQnVmZmVyICsgMiAqIG5vX2NoYW5uZWxzIC0gMTsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRhXzEgPSBhbmFseXNpc0J1ZmZlcjsKIAotICAgIEZJWFBfUUFTICpSRVNUUklDVCBzdGFfMCA9IChGSVhQX1FBUyAqKXBGaWx0ZXJTdGF0ZXM7Ci0gICAgRklYUF9RQVMgKlJFU1RSSUNUIHN0YV8xID0gKEZJWFBfUUFTICopcEZpbHRlclN0YXRlcyArICgyKlFNRl9OT19QT0xZKm5vX2NoYW5uZWxzKSAtIDE7Ci0gICAgaW50IHBmbHRTdGVwID0gUU1GX05PX1BPTFkgKiAocF9zdHJpZGUpOwotICAgIGludCBzdGFTdGVwMSA9IG5vX2NoYW5uZWxzPDwxOwotICAgIGludCBzdGFTdGVwMiA9IChub19jaGFubmVsczw8MykgLSAxOyAvKiBSZXdpbmQgb25lIGxlc3MgKi8KKyAgRklYUF9RQVMgKlJFU1RSSUNUIHN0YV8wID0gKEZJWFBfUUFTICopcEZpbHRlclN0YXRlczsKKyAgRklYUF9RQVMgKlJFU1RSSUNUIHN0YV8xID0KKyAgICAgIChGSVhQX1FBUyAqKXBGaWx0ZXJTdGF0ZXMgKyAoMiAqIFFNRl9OT19QT0xZICogbm9fY2hhbm5lbHMpIC0gMTsKKyAgSU5UIHBmbHRTdGVwID0gUU1GX05PX1BPTFkgKiAocF9zdHJpZGUpOworICBJTlQgc3RhU3RlcDEgPSBub19jaGFubmVscyA8PCAxOworICBJTlQgc3RhU3RlcDIgPSAobm9fY2hhbm5lbHMgPDwgMykgLSAxOyAvKiBSZXdpbmQgb25lIGxlc3MgKi8KIAotICAgIC8qIEZJUiBmaWx0ZXIgMCAqLwotICAgIGFjY3UgPSAgIGZNdWx0RGl2MiggcF9mbHRbMF0sICpzdGFfMSk7ICBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzFdLCAqc3RhXzEpOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdSArPSAgZk11bHREaXYyKCBwX2ZsdFsyXSwgKnN0YV8xKTsgIHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UgKz0gIGZNdWx0RGl2MiggcF9mbHRbM10sICpzdGFfMSk7ICBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzRdLCAqc3RhXzEpOwotICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3U8PDEpOworICAvKiBGSVIgZmlsdGVycyAxMjcuLjY0IDAuLjYzICovCisgIGZvciAoayA9IDA7IGsgPCBub19jaGFubmVsczsgaysrKSB7CisgICAgYWNjdSA9IGZNdWx0RGl2MihwX2ZsdFswXSwgKnN0YV8xKTsKKyAgICBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1ICs9IGZNdWx0RGl2MihwX2ZsdFsxXSwgKnN0YV8xKTsKKyAgICBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1ICs9IGZNdWx0RGl2MihwX2ZsdFsyXSwgKnN0YV8xKTsKKyAgICBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1ICs9IGZNdWx0RGl2MihwX2ZsdFszXSwgKnN0YV8xKTsKKyAgICBzdGFfMSAtPSBzdGFTdGVwMTsKKyAgICBhY2N1ICs9IGZNdWx0RGl2MihwX2ZsdFs0XSwgKnN0YV8xKTsKKyAgICAqcERhdGFfMSsrID0gKGFjY3UgPDwgMSk7CiAgICAgc3RhXzEgKz0gc3RhU3RlcDI7CiAKICAgICBwX2ZsdCArPSBwZmx0U3RlcDsKLQotICAgIC8qIEZJUiBmaWx0ZXJzIDEuLjYzIDEyNy4uNjUgKi8KLSAgICBmb3IgKGs9MDsgazxub19jaGFubmVscy0xOyBrKyspCi0gICAgewotICAgICAgYWNjdSA9ICBmTXVsdERpdjIoIHBfZmx0WzBdLCAqc3RhXzApOyAgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgICBhY2N1ICs9IGZNdWx0RGl2MiggcF9mbHRbMV0sICpzdGFfMCk7ICBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFsyXSwgKnN0YV8wKTsgIHN0YV8wICs9IHN0YVN0ZXAxOwotICAgICAgYWNjdSArPSBmTXVsdERpdjIoIHBfZmx0WzNdLCAqc3RhXzApOyAgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgICBhY2N1ICs9IGZNdWx0RGl2MiggcF9mbHRbNF0sICpzdGFfMCk7Ci0gICAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1PDwxKTsKLSAgICAgIHN0YV8wIC09IHN0YVN0ZXAyOwotCi0gICAgICBhY2N1ID0gICBmTXVsdERpdjIoIHBfZmx0WzBdLCAqc3RhXzEpOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzFdLCAqc3RhXzEpOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzJdLCAqc3RhXzEpOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzNdLCAqc3RhXzEpOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzRdLCAqc3RhXzEpOwotICAgICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTw8MSk7Ci0gICAgICBzdGFfMSArPSBzdGFTdGVwMjsKLQotICAgICAgcF9mbHQgKz0gcGZsdFN0ZXA7Ci0gICAgfQotCi0gICAgLyogRklSIGZpbHRlciA2NCAqLwotICAgIGFjY3UgPSAgZk11bHREaXYyKCBwX2ZsdFswXSwgKnN0YV8wKTsgIHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFsxXSwgKnN0YV8wKTsgIHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFsyXSwgKnN0YV8wKTsgIHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFszXSwgKnN0YV8wKTsgIHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFs0XSwgKnN0YV8wKTsKLSAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1PDwxKTsKKyAgICBhY2N1ID0gZk11bHREaXYyKHBfZmx0WzBdLCAqc3RhXzApOworICAgIHN0YV8wICs9IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKHBfZmx0WzFdLCAqc3RhXzApOworICAgIHN0YV8wICs9IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKHBfZmx0WzJdLCAqc3RhXzApOworICAgIHN0YV8wICs9IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKHBfZmx0WzNdLCAqc3RhXzApOworICAgIHN0YV8wICs9IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKHBfZmx0WzRdLCAqc3RhXzApOworICAgICpwRGF0YV8wLS0gPSAoYWNjdSA8PCAxKTsKICAgICBzdGFfMCAtPSBzdGFTdGVwMjsKKyAgfQogfQogI2VuZGlmIC8qICFkZWZpbmVkKEZVTkNUSU9OX3FtZkFuYVByb3RvdHlwZUZpclNsb3QpICovCiAKLQogI2lmbmRlZiBGVU5DVElPTl9xbWZBbmFQcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYwogLyohCiAgIFxicmllZiBQZXJmb3JtIEFuYWx5c2lzIFByb3RvdHlwZSBGaWx0ZXJpbmcgb24gYSBzaW5nbGUgc2xvdCBvZiBpbnB1dCBkYXRhLgogKi8KLXN0YXRpYwotdm9pZCBxbWZBbmFQcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqYW5hbHlzaXNCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAvKiE8IE51bWJlciBjaGFubmVscyBvZiBhbmFseXNpcyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1BGVCAqcF9maWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHBfc3RyaWRlLCAgICAgICAgICAgICAgICAvKiE8IFN0aWRlIG9mIGFuYWx5c2lzIGZpbHRlciAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUUFTICpSRVNUUklDVCBwRmlsdGVyU3RhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitzdGF0aWMgdm9pZCBxbWZBbmFQcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYygKKyAgICBGSVhQX0RCTCAqYW5hbHlzaXNCdWZmZXIsCisgICAgaW50IG5vX2NoYW5uZWxzLCAvKiE8IE51bWJlciBjaGFubmVscyBvZiBhbmFseXNpcyBmaWx0ZXIgKi8KKyAgICBjb25zdCBGSVhQX1BGVCAqcF9maWx0ZXIsIGludCBwX3N0cmlkZSwgLyohPCBTdHJpZGUgb2YgYW5hbHlzaXMgZmlsdGVyICAgICovCisgICAgRklYUF9RQVMgKlJFU1RSSUNUIHBGaWx0ZXJTdGF0ZXMpIHsKICAgY29uc3QgRklYUF9QRlQgKlJFU1RSSUNUIHBfZmx0ID0gcF9maWx0ZXI7Ci0gIGludCAgcCwgazsKKyAgaW50IHAsIGs7CiAKLSAgZm9yIChrID0gMDsgayA8IDIqbm9fY2hhbm5lbHM7IGsrKykKLSAgeworICBmb3IgKGsgPSAwOyBrIDwgMiAqIG5vX2NoYW5uZWxzOyBrKyspIHsKICAgICBGSVhQX0RCTCBhY2N1ID0gKEZJWFBfREJMKTA7CiAKICAgICBwX2ZsdCArPSBRTUZfTk9fUE9MWSAqIChwX3N0cmlkZSAtIDEpOwpAQCAtMzk4LDkgKzIyMSw5IEBACiAgICAgICBQZXJmb3JtIEZJUi1GaWx0ZXIKICAgICAqLwogICAgIGZvciAocCA9IDA7IHAgPCBRTUZfTk9fUE9MWTsgcCsrKSB7Ci0gICAgICBhY2N1ICs9ICBmTXVsdERpdjIoKnBfZmx0KyssIHBGaWx0ZXJTdGF0ZXNbMipub19jaGFubmVscyAqIHBdKTsKKyAgICAgIGFjY3UgKz0gZk11bHREaXYyKCpwX2ZsdCsrLCBwRmlsdGVyU3RhdGVzWzIgKiBub19jaGFubmVscyAqIHBdKTsKICAgICB9Ci0gICAgYW5hbHlzaXNCdWZmZXJbMipub19jaGFubmVscyAtIDEgLSBrXSA9IEZYX0RCTDJGWF9RTUYoYWNjdTw8MSk7CisgICAgYW5hbHlzaXNCdWZmZXJbMiAqIG5vX2NoYW5uZWxzIC0gMSAtIGtdID0gKGFjY3UgPDwgMSk7CiAgICAgcEZpbHRlclN0YXRlcysrOwogICB9CiB9CkBAIC00MTMsMjQgKzIzNiwyNCBAQAogICogICAgICAgIHNhbXBsZXMgaW4gclN1YmJhbmQKICAqCiAgKi8KLXN0YXRpYyB2b2lkCi1xbWZGb3J3YXJkTW9kdWxhdGlvbkxQX2V2ZW4oIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgQW5hbHlzaXMgQmFuayAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKnRpbWVJbiwgICAgICAgICAgICAgIC8qITwgVGltZSBTaWduYWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKnJTdWJiYW5kICkgICAgICAgICAgIC8qITwgUmVhbCBPdXRwdXQgKi8KK3N0YXRpYyB2b2lkIHFtZkZvcndhcmRNb2R1bGF0aW9uTFBfZXZlbigKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgICovCisgICAgRklYUF9EQkwgKnRpbWVJbiwgICAgICAgICAgICAgIC8qITwgVGltZSBTaWduYWwgKi8KKyAgICBGSVhQX0RCTCAqclN1YmJhbmQpICAgICAgICAgICAgLyohPCBSZWFsIE91dHB1dCAqLwogewogICBpbnQgaTsKICAgaW50IEwgPSBhbmFRbWYtPm5vX2NoYW5uZWxzOwotICBpbnQgTSA9IEw+PjE7CisgIGludCBNID0gTCA+PiAxOwogICBpbnQgc2NhbGU7Ci0gIEZJWFBfUU1GIGFjY3U7CisgIEZJWFBfREJMIGFjY3U7CiAKLSAgY29uc3QgRklYUF9RTUYgKnRpbWVJblRtcDEgPSAoRklYUF9RTUYgKikgJnRpbWVJblszICogTV07Ci0gIGNvbnN0IEZJWFBfUU1GICp0aW1lSW5UbXAyID0gdGltZUluVG1wMTsKLSAgRklYUF9RTUYgKnJTdWJiYW5kVG1wID0gclN1YmJhbmQ7CisgIGNvbnN0IEZJWFBfREJMICp0aW1lSW5UbXAxID0gKEZJWFBfREJMICopJnRpbWVJblszICogTV07CisgIGNvbnN0IEZJWFBfREJMICp0aW1lSW5UbXAyID0gdGltZUluVG1wMTsKKyAgRklYUF9EQkwgKnJTdWJiYW5kVG1wID0gclN1YmJhbmQ7CiAKICAgclN1YmJhbmRbMF0gPSB0aW1lSW5bMyAqIE1dID4+IDE7CiAKLSAgZm9yIChpID0gTS0xOyBpICE9IDA7IGktLSkgeworICBmb3IgKGkgPSBNIC0gMTsgaSAhPSAwOyBpLS0pIHsKICAgICBhY2N1ID0gKCgqLS10aW1lSW5UbXAxKSA+PiAxKSArICgoKisrdGltZUluVG1wMikgPj4gMSk7CiAgICAgKisrclN1YmJhbmRUbXAgPSBhY2N1OwogICB9CkBAIC00MzksNyArMjYyLDcgQEAKICAgdGltZUluVG1wMiA9ICZ0aW1lSW5bMF07CiAgIHJTdWJiYW5kVG1wID0gJnJTdWJiYW5kW01dOwogCi0gIGZvciAoaSA9IEwtTTsgaSAhPSAwOyBpLS0pIHsKKyAgZm9yIChpID0gTCAtIE07IGkgIT0gMDsgaS0tKSB7CiAgICAgYWNjdSA9ICgoKnRpbWVJblRtcDEtLSkgPj4gMSkgLSAoKCp0aW1lSW5UbXAyKyspID4+IDEpOwogICAgICpyU3ViYmFuZFRtcCsrID0gYWNjdTsKICAgfQpAQCAtNDQ4LDE2NSArMjcxLDI0NiBAQAogfQogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQpCi1zdGF0aWMgdm9pZAotcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgQW5hbHlzaXMgQmFuayAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqdGltZUluLCAgICAgICAgLyohPCBUaW1lIFNpZ25hbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpyU3ViYmFuZCApICAgICAgICAgICAvKiE8IFJlYWwgT3V0cHV0ICovCitzdGF0aWMgdm9pZCBxbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZCgKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgICovCisgICAgY29uc3QgRklYUF9EQkwgKnRpbWVJbiwgICAgICAgIC8qITwgVGltZSBTaWduYWwgKi8KKyAgICBGSVhQX0RCTCAqclN1YmJhbmQpICAgICAgICAgICAgLyohPCBSZWFsIE91dHB1dCAqLwogewogICBpbnQgaTsKICAgaW50IEwgPSBhbmFRbWYtPm5vX2NoYW5uZWxzOwotICBpbnQgTSA9IEw+PjE7Ci0gIGludCBzaGlmdCA9IChhbmFRbWYtPm5vX2NoYW5uZWxzPj42KSArIDE7CisgIGludCBNID0gTCA+PiAxOworICBpbnQgc2hpZnQgPSAoYW5hUW1mLT5ub19jaGFubmVscyA+PiA2KSArIDE7CiAKICAgZm9yIChpID0gMDsgaSA8IE07IGkrKykgewotICAgIHJTdWJiYW5kW00gKyBpXSAgICAgPSAodGltZUluW0wgLSAxIC0gaV0+PjEpIC0gKHRpbWVJbltpXT4+c2hpZnQpOwotICAgIHJTdWJiYW5kW00gLSAxIC0gaV0gPSAodGltZUluW0wgKyBpXT4+MSkgICAgICsgKHRpbWVJblsyICogTCAtIDEgLSBpXT4+c2hpZnQpOworICAgIHJTdWJiYW5kW00gKyBpXSA9ICh0aW1lSW5bTCAtIDEgLSBpXSA+PiAxKSAtICh0aW1lSW5baV0gPj4gc2hpZnQpOworICAgIHJTdWJiYW5kW00gLSAxIC0gaV0gPQorICAgICAgICAodGltZUluW0wgKyBpXSA+PiAxKSArICh0aW1lSW5bMiAqIEwgLSAxIC0gaV0gPj4gc2hpZnQpOwogICB9CiAKICAgZGN0X0lWKHJTdWJiYW5kLCBMLCAmc2hpZnQpOwogfQogI2VuZGlmIC8qICFkZWZpbmVkKEZVTkNUSU9OX3FtZkZvcndhcmRNb2R1bGF0aW9uTFBfb2RkKSAqLwogCi0KLQogLyohCiAgKgogICogXGJyaWVmIFBlcmZvcm0gY29tcGxleC12YWx1ZWQgZm9yd2FyZCBtb2R1bGF0aW9uIG9mIHRoZSB0aW1lIGRvbWFpbgogICogICAgICAgIGRhdGEgb2YgdGltZUluIGFuZCBzdG9yZXMgdGhlIHJlYWwgcGFydCBvZiB0aGUgc3ViYmFuZAogICogICAgICAgIHNhbXBsZXMgaW4gclN1YmJhbmQsIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgaW4gaVN1YmJhbmQKICAqCi0gKiAgICAgICAgT25seSB0aGUgbG93ZXIgYmFuZHMgYXJlIG9idGFpbmVkICh1cHRvIGFuYVFtZi0+bHNiKS4gRm9yCi0gKiAgICAgICAgYSBmdWxsIGJhbmR3aWR0aCBhbmFseXNpcyBpdCBpcyByZXF1aXJlZCB0byBzZXQgYm90aCBhbmFRbWYtPmxzYgotICogICAgICAgIGFuZCBhbmFRbWYtPnVzYiB0byB0aGUgYW1vdW50IG9mIFFNRiBiYW5kcy4KICAqCiAgKi8KLXN0YXRpYyB2b2lkCi1xbWZGb3J3YXJkTW9kdWxhdGlvbkhRKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgICAgIC8qITwgSGFuZGxlIG9mIFFtZiBBbmFseXNpcyBCYW5rICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9RTUYgKlJFU1RSSUNUIHRpbWVJbiwgICAvKiE8IFRpbWUgU2lnbmFsICovCi0gICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgclN1YmJhbmQsICAgICAgIC8qITwgUmVhbCBPdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCBpU3ViYmFuZCAgICAgICAgLyohPCBJbWFnaW5hcnkgT3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICkKLXsKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9xbWZGb3J3YXJkTW9kdWxhdGlvbkhRKQorc3RhdGljIHZvaWQgcW1mRm9yd2FyZE1vZHVsYXRpb25IUSgKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgICAvKiE8IEhhbmRsZSBvZiBRbWYgQW5hbHlzaXMgQmFuayAgKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgdGltZUluLCAvKiE8IFRpbWUgU2lnbmFsICovCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHJTdWJiYW5kLCAgICAgLyohPCBSZWFsIE91dHB1dCAqLworICAgIEZJWFBfREJMICpSRVNUUklDVCBpU3ViYmFuZCAgICAgIC8qITwgSW1hZ2luYXJ5IE91dHB1dCAqLworKSB7CiAgIGludCBpOwogICBpbnQgTCA9IGFuYVFtZi0+bm9fY2hhbm5lbHM7Ci0gIGludCBMMiA9IEw8PDE7CisgIGludCBMMiA9IEwgPDwgMTsKICAgaW50IHNoaWZ0ID0gMDsKIAotICBmb3IgKGkgPSAwOyBpIDwgTDsgaSs9MikgewotICAgIEZJWFBfUU1GIHgwLCB4MSwgeTAsIHkxOworICAvKiBUaW1lIGFkdmFuY2UgYnkgb25lIHNhbXBsZSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgY29tcGxleAorICAgICByb3RhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhbmFseXNpcy4gV29ya3Mgb25seSBmb3IgU1REIG1vZGUuICovCisgIGlmICgoTCA9PSA2NCkgJiYgIShhbmFRbWYtPmZsYWdzICYgKFFNRl9GTEFHX0NMREZCIHwgUU1GX0ZMQUdfTVBTTERGQikpKSB7CisgICAgRklYUF9EQkwgeCwgeTsKIAotICAgIHgwID0gdGltZUluW2ldID4+IDE7Ci0gICAgeDEgPSB0aW1lSW5baSsxXSA+PiAxOwotICAgIHkwID0gdGltZUluW0wyIC0gMSAtIGldID4+IDE7Ci0gICAgeTEgPSB0aW1lSW5bTDIgLSAyIC0gaV0gPj4gMTsKKyAgICAvKnJTdWJiYW5kWzBdID0gdVsxXSArIHVbMF0qLworICAgIC8qaVN1YmJhbmRbMF0gPSB1WzFdIC0gdVswXSovCisgICAgeCA9IHRpbWVJblsxXSA+PiAxOworICAgIHkgPSB0aW1lSW5bMF07CisgICAgclN1YmJhbmRbMF0gPSB4ICsgKHkgPj4gMSk7CisgICAgaVN1YmJhbmRbMF0gPSB4IC0gKHkgPj4gMSk7CiAKLSAgICByU3ViYmFuZFtpXSA9IHgwIC0geTA7Ci0gICAgclN1YmJhbmRbaSsxXSA9IHgxIC0geTE7Ci0gICAgaVN1YmJhbmRbaV0gPSB4MCArIHkwOwotICAgIGlTdWJiYW5kW2krMV0gPSB4MSArIHkxOworICAgIC8qclN1YmJhbmRbbl0gPSB1W24rMV0gLSB1WzJNLW5dLCBuPTEsLi4uLE0tMSovCisgICAgLyppU3ViYmFuZFtuXSA9IHVbbisxXSArIHVbMk0tbl0sIG49MSwuLi4sTS0xKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgTDsgaSsrKSB7CisgICAgICB4ID0gdGltZUluW2kgKyAxXSA+PiAxOyAvKnVbbisxXSAgKi8KKyAgICAgIHkgPSB0aW1lSW5bTDIgLSBpXTsgICAgIC8qdVsyTS1uXSAqLworICAgICAgclN1YmJhbmRbaV0gPSB4IC0gKHkgPj4gMSk7CisgICAgICBpU3ViYmFuZFtpXSA9IHggKyAoeSA+PiAxKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IEw7IGkgKz0gMikgeworICAgICAgRklYUF9EQkwgeDAsIHgxLCB5MCwgeTE7CisKKyAgICAgIHgwID0gdGltZUluW2kgKyAwXSA+PiAxOworICAgICAgeDEgPSB0aW1lSW5baSArIDFdID4+IDE7CisgICAgICB5MCA9IHRpbWVJbltMMiAtIDEgLSBpXTsKKyAgICAgIHkxID0gdGltZUluW0wyIC0gMiAtIGldOworCisgICAgICByU3ViYmFuZFtpICsgMF0gPSB4MCAtICh5MCA+PiAxKTsKKyAgICAgIHJTdWJiYW5kW2kgKyAxXSA9IHgxIC0gKHkxID4+IDEpOworICAgICAgaVN1YmJhbmRbaSArIDBdID0geDAgKyAoeTAgPj4gMSk7CisgICAgICBpU3ViYmFuZFtpICsgMV0gPSB4MSArICh5MSA+PiAxKTsKKyAgICB9CiAgIH0KIAogICBkY3RfSVYoclN1YmJhbmQsIEwsICZzaGlmdCk7CiAgIGRzdF9JVihpU3ViYmFuZCwgTCwgJnNoaWZ0KTsKIAotICB7Ci0gICAgewotICAgICAgY29uc3QgRklYUF9RVFcgKlJFU1RSSUNUIHNicl90X2NvczsKLSAgICAgIGNvbnN0IEZJWFBfUVRXICpSRVNUUklDVCBzYnJfdF9zaW47CisgIC8qIERvIHRoZSBjb21wbGV4IHJvdGF0aW9uIGV4Y2VwdCBmb3IgdGhlIGNhc2Ugb2YgNjQgYmFuZHMgKGluIFNURCBtb2RlKS4gKi8KKyAgaWYgKChMICE9IDY0KSB8fCAoYW5hUW1mLT5mbGFncyAmIChRTUZfRkxBR19DTERGQiB8IFFNRl9GTEFHX01QU0xERkIpKSkgeworICAgIGlmIChhbmFRbWYtPmZsYWdzICYgUU1GX0ZMQUdfTVBTTERGQl9PUFRJTUlaRV9NT0RVTEFUSU9OKSB7CisgICAgICBGSVhQX0RCTCBpQmFuZDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmTWluKGFuYVFtZi0+bHNiLCBMKTsgaSArPSAyKSB7CisgICAgICAgIGlCYW5kID0gclN1YmJhbmRbaV07CisgICAgICAgIHJTdWJiYW5kW2ldID0gLWlTdWJiYW5kW2ldOworICAgICAgICBpU3ViYmFuZFtpXSA9IGlCYW5kOworCisgICAgICAgIGlCYW5kID0gLXJTdWJiYW5kW2kgKyAxXTsKKyAgICAgICAgclN1YmJhbmRbaSArIDFdID0gaVN1YmJhbmRbaSArIDFdOworICAgICAgICBpU3ViYmFuZFtpICsgMV0gPSBpQmFuZDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgRklYUF9RVFcgKnNicl90X2NvczsKKyAgICAgIGNvbnN0IEZJWFBfUVRXICpzYnJfdF9zaW47CisgICAgICBjb25zdCBpbnQgbGVuID0gTDsgLyogd2FzIGxlbiA9IGZNaW4oYW5hUW1mLT5sc2IsIEwpIGJ1dCBpbiBjYXNlIG9mIFVTQUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2lnbmFsIGFib3ZlIGxzYiBpcyBhY3R1YWxseSBuZWVkZWQgaW4gc29tZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VzIChIQkU/KSAqLwogICAgICAgc2JyX3RfY29zID0gYW5hUW1mLT50X2NvczsKICAgICAgIHNicl90X3NpbiA9IGFuYVFtZi0+dF9zaW47CiAKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhbmFRbWYtPmxzYjsgaSsrKSB7Ci0gICAgICAgIGNwbHhNdWx0KCZpU3ViYmFuZFtpXSwgJnJTdWJiYW5kW2ldLCBpU3ViYmFuZFtpXSwgclN1YmJhbmRbaV0sIHNicl90X2Nvc1tpXSwgc2JyX3Rfc2luW2ldKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBjcGx4TXVsdCgmaVN1YmJhbmRbaV0sICZyU3ViYmFuZFtpXSwgaVN1YmJhbmRbaV0sIHJTdWJiYW5kW2ldLAorICAgICAgICAgICAgICAgICBzYnJfdF9jb3NbaV0sIHNicl90X3NpbltpXSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CisjZW5kaWYgLyogRlVOQ1RJT05fcW1mRm9yd2FyZE1vZHVsYXRpb25IUSAqLwogCiAvKgogICogXGJyaWVmIFBlcmZvcm0gb25lIFFNRiBzbG90IGFuYWx5c2lzIG9mIHRoZSB0aW1lIGRvbWFpbiBkYXRhIG9mIHRpbWVJbgogICogICAgICAgIHdpdGggc3BlY2lmaWVkIHN0cmlkZSBhbmQgc3RvcmVzIHRoZSByZWFsIHBhcnQgb2YgdGhlIHN1YmJhbmQKICAqICAgICAgICBzYW1wbGVzIGluIHJTdWJiYW5kLCBhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IGluIGlTdWJiYW5kCiAgKgotICogICAgICAgIE9ubHkgdGhlIGxvd2VyIGJhbmRzIGFyZSBvYnRhaW5lZCAodXB0byBhbmFRbWYtPmxzYikuIEZvcgotICogICAgICAgIGEgZnVsbCBiYW5kd2lkdGggYW5hbHlzaXMgaXQgaXMgcmVxdWlyZWQgdG8gc2V0IGJvdGggYW5hUW1mLT5sc2IKLSAqICAgICAgICBhbmQgYW5hUW1mLT51c2IgdG8gdGhlIGFtb3VudCBvZiBRTUYgYmFuZHMuCisgKiAgICAgICAgTm90ZTogYW5hUW1mLT5sc2IgY2FuIGJlIGdyZWF0ZXIgdGhhbiBhbmFRbWYtPm5vX2NoYW5uZWxzIGluIGNhc2UKKyAqICAgICAgICBvZiBpbXBsaWNpdCByZXNhbXBsaW5nIChVU0FDIHdpdGggcmVkdWNlZCAzLzQgY29yZSBmcmFtZSBsZW5ndGgpLgogICovCi12b2lkCi1xbWZBbmFseXNpc0ZpbHRlcmluZ1Nsb3QoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgICAgICpxbWZSZWFsLCAgICAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIHJlYWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICAgICAqcW1mSW1hZywgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCBpbWFnICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00gKlJFU1RSSUNUIHRpbWVJbiwgLyohPCBQb2ludGVyIHRvIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgIHN0cmlkZSwgICAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAgICAgKnBXb3JrQnVmZmVyICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIGludCBpOwotICAgIGludCBvZmZzZXQgPSBhbmFRbWYtPm5vX2NoYW5uZWxzKihRTUZfTk9fUE9MWSoyLTEpOwotICAgIC8qCi0gICAgICBGZWVkIHRpbWUgc2lnbmFsIGludG8gb2xkZXN0IGFuYVFtZi0+bm9fY2hhbm5lbHMgc3RhdGVzCi0gICAgKi8KLSAgICB7Ci0gICAgICBGSVhQX1FBUyAqUkVTVFJJQ1QgRmlsdGVyU3RhdGVzQW5hVG1wID0gKChGSVhQX1FBUyopYW5hUW1mLT5GaWx0ZXJTdGF0ZXMpK29mZnNldDsKKyNpZiAoU0FNUExFX0JJVFMgIT0gREZSQUNUX0JJVFMpICYmIChRQVNfQklUUyA9PSBERlJBQ1RfQklUUykKK3ZvaWQgcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCisgICAgRklYUF9EQkwgKnFtZlJlYWwsICAgICAgICAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIHJlYWwgKi8KKyAgICBGSVhQX0RCTCAqcW1mSW1hZywgICAgICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgaW1hZyAqLworICAgIGNvbnN0IExPTkcgKlJFU1RSSUNUIHRpbWVJbiwgICAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgKi8KKyAgICBjb25zdCBpbnQgc3RyaWRlLCAgICAgICAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIGlucHV0ICovCisgICAgRklYUF9EQkwgKnBXb3JrQnVmZmVyICAgICAgICAgIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLworKSB7CisgIGludCBvZmZzZXQgPSBhbmFRbWYtPm5vX2NoYW5uZWxzICogKFFNRl9OT19QT0xZICogMiAtIDEpOworICAvKgorICAgIEZlZWQgdGltZSBzaWduYWwgaW50byBvbGRlc3QgYW5hUW1mLT5ub19jaGFubmVscyBzdGF0ZXMKKyAgKi8KKyAgeworICAgIEZJWFBfREJMICpGaWx0ZXJTdGF0ZXNBbmFUbXAgPSAoKEZJWFBfREJMICopYW5hUW1mLT5GaWx0ZXJTdGF0ZXMpICsgb2Zmc2V0OwogCi0gICAgICAvKiBGZWVkIGFuZCBzY2FsZSBhY3R1YWwgdGltZSBpbiBzbG90ICovCi0gICAgICBmb3IoaT1hbmFRbWYtPm5vX2NoYW5uZWxzPj4xOyBpIT0wOyBpLS0pIHsKLSAgICAgICAgLyogUGxhY2UgSU5UX1BDTSB2YWx1ZSBsZWZ0IGFsaWduZWQgaW4gc2NhbGVkVGltZUluICovCi0jaWYgKFFBU19CSVRTPT1TQU1QTEVfQklUUykKLSAgICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSp0aW1lSW47IHRpbWVJbiArPSBzdHJpZGU7Ci0gICAgICAgICpGaWx0ZXJTdGF0ZXNBbmFUbXArKyA9IChGSVhQX1FBUykqdGltZUluOyB0aW1lSW4gKz0gc3RyaWRlOwotI2VsaWYgKFFBU19CSVRTPlNBTVBMRV9CSVRTKQotICAgICAgICAqRmlsdGVyU3RhdGVzQW5hVG1wKysgPSAoRklYUF9RQVMpKCgqdGltZUluKTw8KFFBU19CSVRTLVNBTVBMRV9CSVRTKSk7IHRpbWVJbiArPSBzdHJpZGU7Ci0gICAgICAgICpGaWx0ZXJTdGF0ZXNBbmFUbXArKyA9IChGSVhQX1FBUykoKCp0aW1lSW4pPDwoUUFTX0JJVFMtU0FNUExFX0JJVFMpKTsgdGltZUluICs9IHN0cmlkZTsKLSNlbHNlCi0gICAgICAgICpGaWx0ZXJTdGF0ZXNBbmFUbXArKyA9IChGSVhQX1FBUykoKCp0aW1lSW4pPj4oU0FNUExFX0JJVFMtUUFTX0JJVFMpKTsgdGltZUluICs9IHN0cmlkZTsKLSAgICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSgoKnRpbWVJbik+PihTQU1QTEVfQklUUy1RQVNfQklUUykpOyB0aW1lSW4gKz0gc3RyaWRlOwotI2VuZGlmCi0gICAgICB9CisgICAgLyogRmVlZCBhbmQgc2NhbGUgYWN0dWFsIHRpbWUgaW4gc2xvdCAqLworICAgIGZvciAoaW50IGkgPSBhbmFRbWYtPm5vX2NoYW5uZWxzID4+IDE7IGkgIT0gMDsgaS0tKSB7CisgICAgICAvKiBQbGFjZSBJTlRfUENNIHZhbHVlIGxlZnQgYWxpZ25lZCBpbiBzY2FsZWRUaW1lSW4gKi8KKworICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSp0aW1lSW47CisgICAgICB0aW1lSW4gKz0gc3RyaWRlOworICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSp0aW1lSW47CisgICAgICB0aW1lSW4gKz0gc3RyaWRlOwogICAgIH0KKyAgfQogCi0gICAgaWYgKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19OT05TWU1NRVRSSUMpIHsKLSAgICAgIHFtZkFuYVByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFRbWYtPm5vX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hUW1mLT5wX2ZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYVFtZi0+cF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9RQVMqKWFuYVFtZi0+RmlsdGVyU3RhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB9IGVsc2UgewotICAgICAgcW1mQW5hUHJvdG90eXBlRmlyU2xvdCggcFdvcmtCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFRbWYtPm5vX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hUW1mLT5wX2ZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYVFtZi0+cF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9RQVMqKWFuYVFtZi0+RmlsdGVyU3RhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB9CisgIGlmIChhbmFRbWYtPmZsYWdzICYgUU1GX0ZMQUdfTk9OU1lNTUVUUklDKSB7CisgICAgcW1mQW5hUHJvdG90eXBlRmlyU2xvdF9Ob25TeW1tZXRyaWMocFdvcmtCdWZmZXIsIGFuYVFtZi0+bm9fY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hUW1mLT5wX2ZpbHRlciwgYW5hUW1mLT5wX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9RQVMgKilhbmFRbWYtPkZpbHRlclN0YXRlcyk7CisgIH0gZWxzZSB7CisgICAgcW1mQW5hUHJvdG90eXBlRmlyU2xvdChwV29ya0J1ZmZlciwgYW5hUW1mLT5ub19jaGFubmVscywgYW5hUW1mLT5wX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYVFtZi0+cF9zdHJpZGUsIChGSVhQX1FBUyAqKWFuYVFtZi0+RmlsdGVyU3RhdGVzKTsKKyAgfQogCi0gICAgaWYgKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19MUCkgewotICAgICAgaWYgKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19DTERGQikKLSAgICAgICAgcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQoIGFuYVFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mUmVhbCApOwotICAgICAgZWxzZQotICAgICAgICBxbWZGb3J3YXJkTW9kdWxhdGlvbkxQX2V2ZW4oIGFuYVFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZSZWFsICk7CisgIGlmIChhbmFRbWYtPmZsYWdzICYgUU1GX0ZMQUdfTFApIHsKKyAgICBpZiAoYW5hUW1mLT5mbGFncyAmIFFNRl9GTEFHX0NMREZCKQorICAgICAgcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQoYW5hUW1mLCBwV29ya0J1ZmZlciwgcW1mUmVhbCk7CisgICAgZWxzZQorICAgICAgcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9ldmVuKGFuYVFtZiwgcFdvcmtCdWZmZXIsIHFtZlJlYWwpOwogCi0gICAgfSBlbHNlIHsKLSAgICAgIHFtZkZvcndhcmRNb2R1bGF0aW9uSFEoIGFuYVFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZkltYWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgIFNoaWZ0IGZpbHRlciBzdGF0ZXMKKyAgfSBlbHNlIHsKKyAgICBxbWZGb3J3YXJkTW9kdWxhdGlvbkhRKGFuYVFtZiwgcFdvcmtCdWZmZXIsIHFtZlJlYWwsIHFtZkltYWcpOworICB9CisgIC8qCisgICAgU2hpZnQgZmlsdGVyIHN0YXRlcwogCi0gICAgICBTaG91bGQgYmUgcmVhbGl6ZWQgd2l0aCBtb2R1bG8gYWRyZXNzaW5nIG9uIGEgRFNQIGluc3RlYWQgb2YgYSB0cnVlIGJ1ZmZlciBzaGlmdAotICAgICovCi0gICAgRkRLbWVtbW92ZSAoKEZJWFBfUUFTKilhbmFRbWYtPkZpbHRlclN0YXRlcywgKEZJWFBfUUFTKilhbmFRbWYtPkZpbHRlclN0YXRlcythbmFRbWYtPm5vX2NoYW5uZWxzLCBvZmZzZXQqc2l6ZW9mKEZJWFBfUUFTKSk7CisgICAgU2hvdWxkIGJlIHJlYWxpemVkIHdpdGggbW9kdWxvIGFkcmVzc2luZyBvbiBhIERTUCBpbnN0ZWFkIG9mIGEgdHJ1ZSBidWZmZXIKKyAgICBzaGlmdAorICAqLworICBGREttZW1tb3ZlKGFuYVFtZi0+RmlsdGVyU3RhdGVzLAorICAgICAgICAgICAgIChGSVhQX1FBUyAqKWFuYVFtZi0+RmlsdGVyU3RhdGVzICsgYW5hUW1mLT5ub19jaGFubmVscywKKyAgICAgICAgICAgICBvZmZzZXQgKiBzaXplb2YoRklYUF9RQVMpKTsKIH0KKyNlbmRpZgogCit2b2lkIHFtZkFuYWx5c2lzRmlsdGVyaW5nU2xvdCgKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgKi8KKyAgICBGSVhQX0RCTCAqcW1mUmVhbCwgICAgICAgICAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIHJlYWwgKi8KKyAgICBGSVhQX0RCTCAqcW1mSW1hZywgICAgICAgICAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIGltYWcgKi8KKyAgICBjb25zdCBJTlRfUENNICpSRVNUUklDVCB0aW1lSW4sIC8qITwgUG9pbnRlciB0byBpbnB1dCAqLworICAgIGNvbnN0IGludCBzdHJpZGUsICAgICAgICAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIGlucHV0ICovCisgICAgRklYUF9EQkwgKnBXb3JrQnVmZmVyICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KKykgeworICBpbnQgb2Zmc2V0ID0gYW5hUW1mLT5ub19jaGFubmVscyAqIChRTUZfTk9fUE9MWSAqIDIgLSAxKTsKKyAgLyoKKyAgICBGZWVkIHRpbWUgc2lnbmFsIGludG8gb2xkZXN0IGFuYVFtZi0+bm9fY2hhbm5lbHMgc3RhdGVzCisgICovCisgIHsKKyAgICBGSVhQX1FBUyAqRmlsdGVyU3RhdGVzQW5hVG1wID0gKChGSVhQX1FBUyAqKWFuYVFtZi0+RmlsdGVyU3RhdGVzKSArIG9mZnNldDsKKworICAgIC8qIEZlZWQgYW5kIHNjYWxlIGFjdHVhbCB0aW1lIGluIHNsb3QgKi8KKyAgICBmb3IgKGludCBpID0gYW5hUW1mLT5ub19jaGFubmVscyA+PiAxOyBpICE9IDA7IGktLSkgeworICAgIC8qIFBsYWNlIElOVF9QQ00gdmFsdWUgbGVmdCBhbGlnbmVkIGluIHNjYWxlZFRpbWVJbiAqLworI2lmIChRQVNfQklUUyA9PSBTQU1QTEVfQklUUykKKyAgICAgICpGaWx0ZXJTdGF0ZXNBbmFUbXArKyA9IChGSVhQX1FBUykqdGltZUluOworICAgICAgdGltZUluICs9IHN0cmlkZTsKKyAgICAgICpGaWx0ZXJTdGF0ZXNBbmFUbXArKyA9IChGSVhQX1FBUykqdGltZUluOworICAgICAgdGltZUluICs9IHN0cmlkZTsKKyNlbGlmIChRQVNfQklUUyA+IFNBTVBMRV9CSVRTKQorICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKChGSVhQX1FBUykqdGltZUluKSA8PCAoUUFTX0JJVFMgLSBTQU1QTEVfQklUUyk7CisgICAgICB0aW1lSW4gKz0gc3RyaWRlOworICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKChGSVhQX1FBUykqdGltZUluKSA8PCAoUUFTX0JJVFMgLSBTQU1QTEVfQklUUyk7CisgICAgICB0aW1lSW4gKz0gc3RyaWRlOworI2Vsc2UKKyAgICAgICpGaWx0ZXJTdGF0ZXNBbmFUbXArKyA9IChGSVhQX1FBUykoKCp0aW1lSW4pID4+IChTQU1QTEVfQklUUyAtIFFBU19CSVRTKSk7CisgICAgICB0aW1lSW4gKz0gc3RyaWRlOworICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSgoKnRpbWVJbikgPj4gKFNBTVBMRV9CSVRTIC0gUUFTX0JJVFMpKTsKKyAgICAgIHRpbWVJbiArPSBzdHJpZGU7CisjZW5kaWYKKyAgICB9CisgIH0KKworICBpZiAoYW5hUW1mLT5mbGFncyAmIFFNRl9GTEFHX05PTlNZTU1FVFJJQykgeworICAgIHFtZkFuYVByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljKHBXb3JrQnVmZmVyLCBhbmFRbWYtPm5vX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYVFtZi0+cF9maWx0ZXIsIGFuYVFtZi0+cF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUUFTICopYW5hUW1mLT5GaWx0ZXJTdGF0ZXMpOworICB9IGVsc2UgeworICAgIHFtZkFuYVByb3RvdHlwZUZpclNsb3QocFdvcmtCdWZmZXIsIGFuYVFtZi0+bm9fY2hhbm5lbHMsIGFuYVFtZi0+cF9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFRbWYtPnBfc3RyaWRlLCAoRklYUF9RQVMgKilhbmFRbWYtPkZpbHRlclN0YXRlcyk7CisgIH0KKworICBpZiAoYW5hUW1mLT5mbGFncyAmIFFNRl9GTEFHX0xQKSB7CisgICAgaWYgKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19DTERGQikKKyAgICAgIHFtZkZvcndhcmRNb2R1bGF0aW9uTFBfb2RkKGFuYVFtZiwgcFdvcmtCdWZmZXIsIHFtZlJlYWwpOworICAgIGVsc2UKKyAgICAgIHFtZkZvcndhcmRNb2R1bGF0aW9uTFBfZXZlbihhbmFRbWYsIHBXb3JrQnVmZmVyLCBxbWZSZWFsKTsKKworICB9IGVsc2UgeworICAgIHFtZkZvcndhcmRNb2R1bGF0aW9uSFEoYW5hUW1mLCBwV29ya0J1ZmZlciwgcW1mUmVhbCwgcW1mSW1hZyk7CisgIH0KKyAgLyoKKyAgICBTaGlmdCBmaWx0ZXIgc3RhdGVzCisKKyAgICBTaG91bGQgYmUgcmVhbGl6ZWQgd2l0aCBtb2R1bG8gYWRyZXNzaW5nIG9uIGEgRFNQIGluc3RlYWQgb2YgYSB0cnVlIGJ1ZmZlcgorICAgIHNoaWZ0CisgICovCisgIEZES21lbW1vdmUoYW5hUW1mLT5GaWx0ZXJTdGF0ZXMsCisgICAgICAgICAgICAgKEZJWFBfUUFTICopYW5hUW1mLT5GaWx0ZXJTdGF0ZXMgKyBhbmFRbWYtPm5vX2NoYW5uZWxzLAorICAgICAgICAgICAgIG9mZnNldCAqIHNpemVvZihGSVhQX1FBUykpOworfQogCiAvKiEKICAqCkBAIC02MTcsNDAgKzUyMSw2NyBAQAogICogc2hyaW5raW5nIHRoZSBjb2VmZmljaWVudCB0YWJsZSB0byBoYWxmIHRoZSBzaXplLiBUaGUgYWRkcmVzc2luZyBtb2RlCiAgKiB0YWtlcyBjYXJlIG9mIHRoZSBzeW1tZXRyaWVzLgogICoKLSAqIE9ubHkgdGhlIGxvd2VyIGJhbmRzIGFyZSBvYnRhaW5lZCAodXB0byBhbmFRbWYtPmxzYikuIEZvcgotICogYSBmdWxsIGJhbmR3aWR0aCBhbmFseXNpcyBpdCBpcyByZXF1aXJlZCB0byBzZXQgYm90aCBhbmFRbWYtPmxzYgotICogYW5kIGFuYVFtZi0+dXNiIHRvIHRoZSBhbW91bnQgb2YgUU1GIGJhbmRzLgogICoKICAqIFxzYSBQb2x5cGhhc2VGaWx0ZXJpbmcKICAqLwotCi12b2lkCi1xbWZBbmFseXNpc0ZpbHRlcmluZyggSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsICAgIC8qITwgSGFuZGxlIG9mIFFtZiBBbmFseXNpcyBCYW5rICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKipxbWZSZWFsLCAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byByZWFsIHN1YmJhbmQgc2xvdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqKnFtZkltYWcsICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGltYWcgc3ViYmFuZCBzbG90cyAqLwotICAgICAgICAgICAgICAgICAgICAgIFFNRl9TQ0FMRV9GQUNUT1IgKnNjYWxlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00gKnRpbWVJbiwgICAgICAgICAgICAvKiE8IFRpbWUgc2lnbmFsICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICpwV29ya0J1ZmZlciAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICkKLXsKKyNpZiAoU0FNUExFX0JJVFMgIT0gREZSQUNUX0JJVFMpICYmIChRQVNfQklUUyA9PSBERlJBQ1RfQklUUykKK3ZvaWQgcW1mQW5hbHlzaXNGaWx0ZXJpbmcoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBBbmFseXNpcyBCYW5rICovCisgICAgRklYUF9EQkwgKipxbWZSZWFsLCAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byByZWFsIHN1YmJhbmQgc2xvdHMgKi8KKyAgICBGSVhQX0RCTCAqKnFtZkltYWcsICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGltYWcgc3ViYmFuZCBzbG90cyAqLworICAgIFFNRl9TQ0FMRV9GQUNUT1IgKnNjYWxlRmFjdG9yLCBjb25zdCBMT05HICp0aW1lSW4sIC8qITwgVGltZSBzaWduYWwgKi8KKyAgICBjb25zdCBpbnQgdGltZUluX2UsIGNvbnN0IGludCBzdHJpZGUsCisgICAgRklYUF9EQkwgKnBXb3JrQnVmZmVyIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLworKSB7CiAgIGludCBpOwogICBpbnQgbm9fY2hhbm5lbHMgPSBhbmFRbWYtPm5vX2NoYW5uZWxzOwogCi0gIHNjYWxlRmFjdG9yLT5sYl9zY2FsZSA9IC1BTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTks7CisgIHNjYWxlRmFjdG9yLT5sYl9zY2FsZSA9CisgICAgICAtQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LIC0gdGltZUluX2U7CiAgIHNjYWxlRmFjdG9yLT5sYl9zY2FsZSAtPSBhbmFRbWYtPmZpbHRlclNjYWxlOwogCi0gIGZvciAoaSA9IDA7IGkgPCBhbmFRbWYtPm5vX2NvbDsgaSsrKQotICB7Ci0gICAgICBGSVhQX1FNRiAqcW1mSW1hZ1Nsb3QgPSBOVUxMOworICBmb3IgKGkgPSAwOyBpIDwgYW5hUW1mLT5ub19jb2w7IGkrKykgeworICAgIEZJWFBfREJMICpxbWZJbWFnU2xvdCA9IE5VTEw7CiAKLSAgICAgIGlmICghKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19MUCkpIHsKLSAgICAgICAgcW1mSW1hZ1Nsb3QgPSBxbWZJbWFnW2ldOwotICAgICAgfQorICAgIGlmICghKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19MUCkpIHsKKyAgICAgIHFtZkltYWdTbG90ID0gcW1mSW1hZ1tpXTsKKyAgICB9CiAKLSAgICAgIHFtZkFuYWx5c2lzRmlsdGVyaW5nU2xvdCggYW5hUW1mLCBxbWZSZWFsW2ldLCBxbWZJbWFnU2xvdCwgdGltZUluICwgc3RyaWRlLCBwV29ya0J1ZmZlciApOworICAgIHFtZkFuYWx5c2lzRmlsdGVyaW5nU2xvdChhbmFRbWYsIHFtZlJlYWxbaV0sIHFtZkltYWdTbG90LCB0aW1lSW4sIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIpOwogCi0gICAgICB0aW1lSW4gKz0gbm9fY2hhbm5lbHMqc3RyaWRlOworICAgIHRpbWVJbiArPSBub19jaGFubmVscyAqIHN0cmlkZTsKKworICB9IC8qIG5vX2NvbCBsb29wICBpICAqLworfQorI2VuZGlmCisKK3ZvaWQgcW1mQW5hbHlzaXNGaWx0ZXJpbmcoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBBbmFseXNpcyBCYW5rICovCisgICAgRklYUF9EQkwgKipxbWZSZWFsLCAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byByZWFsIHN1YmJhbmQgc2xvdHMgKi8KKyAgICBGSVhQX0RCTCAqKnFtZkltYWcsICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGltYWcgc3ViYmFuZCBzbG90cyAqLworICAgIFFNRl9TQ0FMRV9GQUNUT1IgKnNjYWxlRmFjdG9yLCBjb25zdCBJTlRfUENNICp0aW1lSW4sIC8qITwgVGltZSBzaWduYWwgKi8KKyAgICBjb25zdCBpbnQgdGltZUluX2UsIGNvbnN0IGludCBzdHJpZGUsCisgICAgRklYUF9EQkwgKnBXb3JrQnVmZmVyIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLworKSB7CisgIGludCBpOworICBpbnQgbm9fY2hhbm5lbHMgPSBhbmFRbWYtPm5vX2NoYW5uZWxzOworCisgIHNjYWxlRmFjdG9yLT5sYl9zY2FsZSA9CisgICAgICAtQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LIC0gdGltZUluX2U7CisgIHNjYWxlRmFjdG9yLT5sYl9zY2FsZSAtPSBhbmFRbWYtPmZpbHRlclNjYWxlOworCisgIGZvciAoaSA9IDA7IGkgPCBhbmFRbWYtPm5vX2NvbDsgaSsrKSB7CisgICAgRklYUF9EQkwgKnFtZkltYWdTbG90ID0gTlVMTDsKKworICAgIGlmICghKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19MUCkpIHsKKyAgICAgIHFtZkltYWdTbG90ID0gcW1mSW1hZ1tpXTsKKyAgICB9CisKKyAgICBxbWZBbmFseXNpc0ZpbHRlcmluZ1Nsb3QoYW5hUW1mLCBxbWZSZWFsW2ldLCBxbWZJbWFnU2xvdCwgdGltZUluLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyKTsKKworICAgIHRpbWVJbiArPSBub19jaGFubmVscyAqIHN0cmlkZTsKIAogICB9IC8qIG5vX2NvbCBsb29wICBpICAqLwogfQpAQCAtNjYyLDkxICs1OTMsODggQEAKICAqICAgICAgICBwYXJ0KSBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gcFdvcmtCdWZmZXIuCiAgKgogICovCi1pbmxpbmUKLXN0YXRpYyB2b2lkCi1xbWZJbnZlcnNlTW9kdWxhdGlvbkxQX2V2ZW4oIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9RTUYgKnFtZlJlYWwsICAgICAgICAgLyohPCBQb2ludGVyIHRvIHFtZiByZWFsIHN1YmJhbmQgc2xvdCAoaW5wdXQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIHNjYWxlRmFjdG9yTG93QmFuZCwgIC8qITwgU2NhbGVmYWN0b3IgZm9yIExvdyBiYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsIC8qITwgU2NhbGVmYWN0b3IgZm9yIEhpZ2ggYmFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqcFRpbWVPdXQgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcW1mIHN1YmJhbmQgc2xvdCAob3V0cHV0KSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitpbmxpbmUgc3RhdGljIHZvaWQgcW1mSW52ZXJzZU1vZHVsYXRpb25MUF9ldmVuKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCisgICAgY29uc3QgRklYUF9EQkwgKnFtZlJlYWwsIC8qITwgUG9pbnRlciB0byBxbWYgcmVhbCBzdWJiYW5kIHNsb3QgKGlucHV0KSAqLworICAgIGNvbnN0IGludCBzY2FsZUZhY3Rvckxvd0JhbmQsICAvKiE8IFNjYWxlZmFjdG9yIGZvciBMb3cgYmFuZCAqLworICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckhpZ2hCYW5kLCAvKiE8IFNjYWxlZmFjdG9yIGZvciBIaWdoIGJhbmQgKi8KKyAgICBGSVhQX0RCTCAqcFRpbWVPdXQgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHFtZiBzdWJiYW5kIHNsb3QgKG91dHB1dCkqLworKSB7CiAgIGludCBpOwogICBpbnQgTCA9IHN5blFtZi0+bm9fY2hhbm5lbHM7Ci0gIGludCBNID0gTD4+MTsKKyAgaW50IE0gPSBMID4+IDE7CiAgIGludCBzY2FsZTsKLSAgRklYUF9RTUYgdG1wOwotICBGSVhQX1FNRiAqUkVTVFJJQ1QgdFJlYWwgPSBwVGltZU91dDsKLSAgRklYUF9RTUYgKlJFU1RSSUNUIHRJbWFnID0gcFRpbWVPdXQgKyBMOworICBGSVhQX0RCTCB0bXA7CisgIEZJWFBfREJMICpSRVNUUklDVCB0UmVhbCA9IHBUaW1lT3V0OworICBGSVhQX0RCTCAqUkVTVFJJQ1QgdEltYWcgPSBwVGltZU91dCArIEw7CiAKICAgLyogTW92ZSBpbnB1dCB0byBvdXRwdXQgdmVjdG9yIHdpdGggb2Zmc2V0ICovCi0gIHNjYWxlVmFsdWVzKCZ0UmVhbFswXSwgICAgICAgICAgICAgJnFtZlJlYWxbMF0sICAgICAgICAgICAgIHN5blFtZi0+bHNiLCAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQpOwotICBzY2FsZVZhbHVlcygmdFJlYWxbMCtzeW5RbWYtPmxzYl0sICZxbWZSZWFsWzArc3luUW1mLT5sc2JdLCBzeW5RbWYtPnVzYi1zeW5RbWYtPmxzYiwgc2NhbGVGYWN0b3JIaWdoQmFuZCk7Ci0gIEZES21lbWNsZWFyKCZ0UmVhbFswK3N5blFtZi0+dXNiXSwgKEwtc3luUW1mLT51c2IpKnNpemVvZihGSVhQX1FNRikpOworICBzY2FsZVZhbHVlcygmdFJlYWxbMF0sICZxbWZSZWFsWzBdLCBzeW5RbWYtPmxzYiwgKGludClzY2FsZUZhY3Rvckxvd0JhbmQpOworICBzY2FsZVZhbHVlcygmdFJlYWxbMCArIHN5blFtZi0+bHNiXSwgJnFtZlJlYWxbMCArIHN5blFtZi0+bHNiXSwKKyAgICAgICAgICAgICAgc3luUW1mLT51c2IgLSBzeW5RbWYtPmxzYiwgKGludClzY2FsZUZhY3RvckhpZ2hCYW5kKTsKKyAgRkRLbWVtY2xlYXIoJnRSZWFsWzAgKyBzeW5RbWYtPnVzYl0sIChMIC0gc3luUW1mLT51c2IpICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKICAgLyogRGN0IHR5cGUtMiB0cmFuc2Zvcm0gKi8KICAgZGN0X0lJKHRSZWFsLCB0SW1hZywgTCwgJnNjYWxlKTsKIAogICAvKiBFeHBhbmQgb3V0cHV0IGFuZCByZXBsYWNlIGlucGxhY2UgdGhlIG91dHB1dCBidWZmZXJzICovCiAgIHRJbWFnWzBdID0gdFJlYWxbTV07Ci0gIHRJbWFnW01dID0gKEZJWFBfUU1GKTA7Ci0gIHRtcCA9IHRSZWFsIFswXTsKLSAgdFJlYWwgWzBdID0gdFJlYWxbTV07Ci0gIHRSZWFsIFtNXSA9IHRtcDsKKyAgdEltYWdbTV0gPSAoRklYUF9EQkwpMDsKKyAgdG1wID0gdFJlYWxbMF07CisgIHRSZWFsWzBdID0gdFJlYWxbTV07CisgIHRSZWFsW01dID0gdG1wOwogCi0gIGZvciAoaSA9IDE7IGkgPCBNLzI7IGkrKykgeworICBmb3IgKGkgPSAxOyBpIDwgTSAvIDI7IGkrKykgewogICAgIC8qIEltYWcgKi8KICAgICB0bXAgPSB0UmVhbFtMIC0gaV07Ci0gICAgdEltYWdbTSAtIGldID0gIHRtcDsKKyAgICB0SW1hZ1tNIC0gaV0gPSB0bXA7CiAgICAgdEltYWdbaSArIE1dID0gLXRtcDsKIAogICAgIHRtcCA9IHRSZWFsW00gKyBpXTsKLSAgICB0SW1hZ1tpXSA9ICB0bXA7CisgICAgdEltYWdbaV0gPSB0bXA7CiAgICAgdEltYWdbTCAtIGldID0gLXRtcDsKIAogICAgIC8qIFJlYWwgKi8KLSAgICB0UmVhbCBbTSArIGldID0gdFJlYWxbaV07Ci0gICAgdFJlYWwgW0wgLSBpXSA9IHRSZWFsW00gLSBpXTsKKyAgICB0UmVhbFtNICsgaV0gPSB0UmVhbFtpXTsKKyAgICB0UmVhbFtMIC0gaV0gPSB0UmVhbFtNIC0gaV07CiAgICAgdG1wID0gdFJlYWxbaV07Ci0gICAgdFJlYWxbaV0gPSB0UmVhbCBbTSAtIGldOwotICAgIHRSZWFsIFtNIC0gaV0gPSB0bXA7Ci0KKyAgICB0UmVhbFtpXSA9IHRSZWFsW00gLSBpXTsKKyAgICB0UmVhbFtNIC0gaV0gPSB0bXA7CiAgIH0KICAgLyogUmVtYWluaW5nIG9kZCB0ZXJtcyAqLwotICB0bXAgPSB0UmVhbFtNICsgTS8yXTsKLSAgdEltYWdbTS8yXSAgICAgPSAgdG1wOwotICB0SW1hZ1tNLzIgKyBNXSA9IC10bXA7CisgIHRtcCA9IHRSZWFsW00gKyBNIC8gMl07CisgIHRJbWFnW00gLyAyXSA9IHRtcDsKKyAgdEltYWdbTSAvIDIgKyBNXSA9IC10bXA7CiAKLSAgdFJlYWwgW00gKyBNLzJdID0gdFJlYWxbTS8yXTsKKyAgdFJlYWxbTSArIE0gLyAyXSA9IHRSZWFsW00gLyAyXTsKIH0KIAotaW5saW5lCi1zdGF0aWMgdm9pZAotcW1mSW52ZXJzZU1vZHVsYXRpb25MUF9vZGQoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqcW1mUmVhbCwgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcW1mIHJlYWwgc3ViYmFuZCBzbG90IChpbnB1dCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JMb3dCYW5kLCAgICAvKiE8IFNjYWxlZmFjdG9yIGZvciBMb3cgYmFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckhpZ2hCYW5kLCAgIC8qITwgU2NhbGVmYWN0b3IgZm9yIEhpZ2ggYmFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpwVGltZU91dCAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBxbWYgc3ViYmFuZCBzbG90IChvdXRwdXQpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworaW5saW5lIHN0YXRpYyB2b2lkIHFtZkludmVyc2VNb2R1bGF0aW9uTFBfb2RkKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCisgICAgY29uc3QgRklYUF9EQkwgKnFtZlJlYWwsIC8qITwgUG9pbnRlciB0byBxbWYgcmVhbCBzdWJiYW5kIHNsb3QgKGlucHV0KSAqLworICAgIGNvbnN0IGludCBzY2FsZUZhY3Rvckxvd0JhbmQsICAvKiE8IFNjYWxlZmFjdG9yIGZvciBMb3cgYmFuZCAqLworICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckhpZ2hCYW5kLCAvKiE8IFNjYWxlZmFjdG9yIGZvciBIaWdoIGJhbmQgKi8KKyAgICBGSVhQX0RCTCAqcFRpbWVPdXQgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHFtZiBzdWJiYW5kIHNsb3QgKG91dHB1dCkqLworKSB7CiAgIGludCBpOwogICBpbnQgTCA9IHN5blFtZi0+bm9fY2hhbm5lbHM7Ci0gIGludCBNID0gTD4+MTsKKyAgaW50IE0gPSBMID4+IDE7CiAgIGludCBzaGlmdCA9IDA7CiAKICAgLyogTW92ZSBpbnB1dCB0byBvdXRwdXQgdmVjdG9yIHdpdGggb2Zmc2V0ICovCi0gIHNjYWxlVmFsdWVzKHBUaW1lT3V0K00sICAgICAgICAgICAgICBxbWZSZWFsLCAgICAgICAgICAgICBzeW5RbWYtPmxzYiwgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kKTsKLSAgc2NhbGVWYWx1ZXMocFRpbWVPdXQrTStzeW5RbWYtPmxzYiwgIHFtZlJlYWwrc3luUW1mLT5sc2IsIHN5blFtZi0+dXNiLXN5blFtZi0+bHNiLCBzY2FsZUZhY3RvckhpZ2hCYW5kKTsKLSAgRkRLbWVtY2xlYXIocFRpbWVPdXQrTStzeW5RbWYtPnVzYiwgKEwtc3luUW1mLT51c2IpKnNpemVvZihGSVhQX1FNRikpOworICBzY2FsZVZhbHVlcyhwVGltZU91dCArIE0sIHFtZlJlYWwsIHN5blFtZi0+bHNiLCBzY2FsZUZhY3Rvckxvd0JhbmQpOworICBzY2FsZVZhbHVlcyhwVGltZU91dCArIE0gKyBzeW5RbWYtPmxzYiwgcW1mUmVhbCArIHN5blFtZi0+bHNiLAorICAgICAgICAgICAgICBzeW5RbWYtPnVzYiAtIHN5blFtZi0+bHNiLCBzY2FsZUZhY3RvckhpZ2hCYW5kKTsKKyAgRkRLbWVtY2xlYXIocFRpbWVPdXQgKyBNICsgc3luUW1mLT51c2IsIChMIC0gc3luUW1mLT51c2IpICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgZGN0X0lWKHBUaW1lT3V0K00sIEwsICZzaGlmdCk7CisgIGRjdF9JVihwVGltZU91dCArIE0sIEwsICZzaGlmdCk7CiAgIGZvciAoaSA9IDA7IGkgPCBNOyBpKyspIHsKLSAgICBwVGltZU91dFtpXSAgICAgICAgICAgICA9ICBwVGltZU91dFtMIC0gMSAtIGldOworICAgIHBUaW1lT3V0W2ldID0gcFRpbWVPdXRbTCAtIDEgLSBpXTsKICAgICBwVGltZU91dFsyICogTCAtIDEgLSBpXSA9IC1wVGltZU91dFtMICsgaV07CiAgIH0KIH0KIAotCisjaWZuZGVmIEZVTkNUSU9OX3FtZkludmVyc2VNb2R1bGF0aW9uSFEKIC8qIQogICoKICAqIFxicmllZiBQZXJmb3JtIGNvbXBsZXgtdmFsdWVkIGludmVyc2UgbW9kdWxhdGlvbiBvZiB0aGUgc3ViYmFuZApAQCAtNzU0LDIwOCArNjgyLDg0IEBACiAgKiAgICAgICAgcGFydCkgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHBXb3JrQnVmZmVyLgogICoKICAqLwotaW5saW5lCi1zdGF0aWMgdm9pZAotcW1mSW52ZXJzZU1vZHVsYXRpb25IUSggSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqcW1mUmVhbCwgICAgICAgIC8qITwgUG9pbnRlciB0byBxbWYgcmVhbCBzdWJiYW5kIHNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUU1GICpxbWZJbWFnLCAgICAgICAgLyohPCBQb2ludGVyIHRvIHFtZiBpbWFnIHN1YmJhbmQgc2xvdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgc2NhbGVGYWN0b3JMb3dCYW5kLCAvKiE8IFNjYWxlZmFjdG9yIGZvciBMb3cgYmFuZCAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICBzY2FsZUZhY3RvckhpZ2hCYW5kLC8qITwgU2NhbGVmYWN0b3IgZm9yIEhpZ2ggYmFuZCAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAqcFdvcmtCdWZmZXIgICAgICAgICAgLyohPCBXb3JrQnVmZmVyIChvdXRwdXQpICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICkKLXsKK2lubGluZSBzdGF0aWMgdm9pZCBxbWZJbnZlcnNlTW9kdWxhdGlvbkhRKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICAgICovCisgICAgY29uc3QgRklYUF9EQkwgKnFtZlJlYWwsICAgICAgIC8qITwgUG9pbnRlciB0byBxbWYgcmVhbCBzdWJiYW5kIHNsb3QgKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqcW1mSW1hZywgICAgICAgLyohPCBQb2ludGVyIHRvIHFtZiBpbWFnIHN1YmJhbmQgc2xvdCAqLworICAgIGNvbnN0IGludCBzY2FsZUZhY3Rvckxvd0JhbmQsICAvKiE8IFNjYWxlZmFjdG9yIGZvciBMb3cgYmFuZCAgICAgICAgICovCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9ySGlnaEJhbmQsIC8qITwgU2NhbGVmYWN0b3IgZm9yIEhpZ2ggYmFuZCAgICAgICAgKi8KKyAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIgICAgICAgICAgLyohPCBXb3JrQnVmZmVyIChvdXRwdXQpICAgICAgICAgICAgICAqLworKSB7CiAgIGludCBpOwogICBpbnQgTCA9IHN5blFtZi0+bm9fY2hhbm5lbHM7Ci0gIGludCBNID0gTD4+MTsKKyAgaW50IE0gPSBMID4+IDE7CiAgIGludCBzaGlmdCA9IDA7Ci0gIEZJWFBfUU1GICpSRVNUUklDVCB0UmVhbCA9IHBXb3JrQnVmZmVyOwotICBGSVhQX1FNRiAqUkVTVFJJQ1QgdEltYWcgPSBwV29ya0J1ZmZlcitMOworICBGSVhQX0RCTCAqUkVTVFJJQ1QgdFJlYWwgPSBwV29ya0J1ZmZlcjsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIHRJbWFnID0gcFdvcmtCdWZmZXIgKyBMOwogCi0gIGlmIChzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpeworICBpZiAoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX0NMREZCKSB7CiAgICAgZm9yIChpID0gMDsgaSA8IHN5blFtZi0+bHNiOyBpKyspIHsKLSAgICAgIGNwbHhNdWx0KCZ0SW1hZ1tpXSwgJnRSZWFsW2ldLAotICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUocW1mSW1hZ1tpXSxzY2FsZUZhY3Rvckxvd0JhbmQpLCBzY2FsZVZhbHVlKHFtZlJlYWxbaV0sc2NhbGVGYWN0b3JMb3dCYW5kKSwKLSAgICAgICAgICAgICAgICBzeW5RbWYtPnRfY29zW2ldLCBzeW5RbWYtPnRfc2luW2ldKTsKKyAgICAgIGNwbHhNdWx0KCZ0SW1hZ1tpXSwgJnRSZWFsW2ldLCBzY2FsZVZhbHVlKHFtZkltYWdbaV0sIHNjYWxlRmFjdG9yTG93QmFuZCksCisgICAgICAgICAgICAgICBzY2FsZVZhbHVlKHFtZlJlYWxbaV0sIHNjYWxlRmFjdG9yTG93QmFuZCksIHN5blFtZi0+dF9jb3NbaV0sCisgICAgICAgICAgICAgICBzeW5RbWYtPnRfc2luW2ldKTsKICAgICB9CiAgICAgZm9yICg7IGkgPCBzeW5RbWYtPnVzYjsgaSsrKSB7CiAgICAgICBjcGx4TXVsdCgmdEltYWdbaV0sICZ0UmVhbFtpXSwKLSAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKHFtZkltYWdbaV0sc2NhbGVGYWN0b3JIaWdoQmFuZCksIHNjYWxlVmFsdWUocW1mUmVhbFtpXSxzY2FsZUZhY3RvckhpZ2hCYW5kKSwKLSAgICAgICAgICAgICAgICBzeW5RbWYtPnRfY29zW2ldLCBzeW5RbWYtPnRfc2luW2ldKTsKKyAgICAgICAgICAgICAgIHNjYWxlVmFsdWUocW1mSW1hZ1tpXSwgc2NhbGVGYWN0b3JIaWdoQmFuZCksCisgICAgICAgICAgICAgICBzY2FsZVZhbHVlKHFtZlJlYWxbaV0sIHNjYWxlRmFjdG9ySGlnaEJhbmQpLCBzeW5RbWYtPnRfY29zW2ldLAorICAgICAgICAgICAgICAgc3luUW1mLT50X3NpbltpXSk7CiAgICAgfQogICB9CiAKLSAgaWYgKCAoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX0NMREZCKSA9PSAwKSB7Ci0gICAgc2NhbGVWYWx1ZXMoJnRSZWFsWzBdLCAgICAgICAgICAgICAmcW1mUmVhbFswXSwgICAgICAgICAgICAgc3luUW1mLT5sc2IsICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCk7Ci0gICAgc2NhbGVWYWx1ZXMoJnRSZWFsWzArc3luUW1mLT5sc2JdLCAmcW1mUmVhbFswK3N5blFtZi0+bHNiXSwgc3luUW1mLT51c2Itc3luUW1mLT5sc2IsIHNjYWxlRmFjdG9ySGlnaEJhbmQpOwotICAgIHNjYWxlVmFsdWVzKCZ0SW1hZ1swXSwgICAgICAgICAgICAgJnFtZkltYWdbMF0sICAgICAgICAgICAgIHN5blFtZi0+bHNiLCAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQpOwotICAgIHNjYWxlVmFsdWVzKCZ0SW1hZ1swK3N5blFtZi0+bHNiXSwgJnFtZkltYWdbMCtzeW5RbWYtPmxzYl0sIHN5blFtZi0+dXNiLXN5blFtZi0+bHNiLCBzY2FsZUZhY3RvckhpZ2hCYW5kKTsKKyAgaWYgKChzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpID09IDApIHsKKyAgICBzY2FsZVZhbHVlcygmdFJlYWxbMF0sICZxbWZSZWFsWzBdLCBzeW5RbWYtPmxzYiwgKGludClzY2FsZUZhY3Rvckxvd0JhbmQpOworICAgIHNjYWxlVmFsdWVzKCZ0UmVhbFswICsgc3luUW1mLT5sc2JdLCAmcW1mUmVhbFswICsgc3luUW1mLT5sc2JdLAorICAgICAgICAgICAgICAgIHN5blFtZi0+dXNiIC0gc3luUW1mLT5sc2IsIChpbnQpc2NhbGVGYWN0b3JIaWdoQmFuZCk7CisgICAgc2NhbGVWYWx1ZXMoJnRJbWFnWzBdLCAmcW1mSW1hZ1swXSwgc3luUW1mLT5sc2IsIChpbnQpc2NhbGVGYWN0b3JMb3dCYW5kKTsKKyAgICBzY2FsZVZhbHVlcygmdEltYWdbMCArIHN5blFtZi0+bHNiXSwgJnFtZkltYWdbMCArIHN5blFtZi0+bHNiXSwKKyAgICAgICAgICAgICAgICBzeW5RbWYtPnVzYiAtIHN5blFtZi0+bHNiLCAoaW50KXNjYWxlRmFjdG9ySGlnaEJhbmQpOwogICB9CiAKLSAgRkRLbWVtY2xlYXIoJnRSZWFsW3N5blFtZi0+dXNiXSwgKHN5blFtZi0+bm9fY2hhbm5lbHMtc3luUW1mLT51c2IpKnNpemVvZihGSVhQX1FNRikpOwotICBGREttZW1jbGVhcigmdEltYWdbc3luUW1mLT51c2JdLCAoc3luUW1mLT5ub19jaGFubmVscy1zeW5RbWYtPnVzYikqc2l6ZW9mKEZJWFBfUU1GKSk7CisgIEZES21lbWNsZWFyKCZ0UmVhbFtzeW5RbWYtPnVzYl0sCisgICAgICAgICAgICAgIChzeW5RbWYtPm5vX2NoYW5uZWxzIC0gc3luUW1mLT51c2IpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKCZ0SW1hZ1tzeW5RbWYtPnVzYl0sCisgICAgICAgICAgICAgIChzeW5RbWYtPm5vX2NoYW5uZWxzIC0gc3luUW1mLT51c2IpICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKICAgZGN0X0lWKHRSZWFsLCBMLCAmc2hpZnQpOwogICBkc3RfSVYodEltYWcsIEwsICZzaGlmdCk7CiAKLSAgaWYgKHN5blFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19DTERGQil7CisgIGlmIChzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpIHsKICAgICBmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKSB7Ci0gICAgICBGSVhQX1FNRiByMSwgaTEsIHIyLCBpMjsKKyAgICAgIEZJWFBfREJMIHIxLCBpMSwgcjIsIGkyOwogICAgICAgcjEgPSB0UmVhbFtpXTsKICAgICAgIGkyID0gdEltYWdbTCAtIDEgLSBpXTsKICAgICAgIHIyID0gdFJlYWxbTCAtIGkgLSAxXTsKICAgICAgIGkxID0gdEltYWdbaV07CiAKLSAgICAgIHRSZWFsW2ldID0gKHIxIC0gaTEpPj4xOwotICAgICAgdEltYWdbTCAtIDEgLSBpXSA9IC0ocjEgKyBpMSk+PjE7Ci0gICAgICB0UmVhbFtMIC0gaSAtIDFdID0gIChyMiAtIGkyKT4+MTsKLSAgICAgIHRJbWFnW2ldID0gLShyMiArIGkyKT4+MTsKKyAgICAgIHRSZWFsW2ldID0gKHIxIC0gaTEpID4+IDE7CisgICAgICB0SW1hZ1tMIC0gMSAtIGldID0gLShyMSArIGkxKSA+PiAxOworICAgICAgdFJlYWxbTCAtIGkgLSAxXSA9IChyMiAtIGkyKSA+PiAxOworICAgICAgdEltYWdbaV0gPSAtKHIyICsgaTIpID4+IDE7CiAgICAgfQotICB9IGVsc2UKLSAgewotICAgIC8qIFRoZSBhcnJheSBhY2Nlc3NlcyBhcmUgbmVnYXRpdmUgdG8gY29tcGVuc2F0ZSB0aGUgbWlzc2luZyBtaW51cyBzaWduIGluIHRoZSBsb3cgYW5kIGhpIGJhbmQgZ2Fpbi4gKi8KKyAgfSBlbHNlIHsKKyAgICAvKiBUaGUgYXJyYXkgYWNjZXNzZXMgYXJlIG5lZ2F0aXZlIHRvIGNvbXBlbnNhdGUgdGhlIG1pc3NpbmcgbWludXMgc2lnbiBpbgorICAgICAqIHRoZSBsb3cgYW5kIGhpIGJhbmQgZ2Fpbi4gKi8KICAgICAvKiAyNiBjeWNsZXMgb24gQVJNOTI2ICovCiAgICAgZm9yIChpID0gMDsgaSA8IE07IGkrKykgewotICAgICAgRklYUF9RTUYgcjEsIGkxLCByMiwgaTI7CisgICAgICBGSVhQX0RCTCByMSwgaTEsIHIyLCBpMjsKICAgICAgIHIxID0gLXRSZWFsW2ldOwogICAgICAgaTIgPSAtdEltYWdbTCAtIDEgLSBpXTsKICAgICAgIHIyID0gLXRSZWFsW0wgLSBpIC0gMV07CiAgICAgICBpMSA9IC10SW1hZ1tpXTsKIAotICAgICAgdFJlYWxbaV0gPSAocjEgLSBpMSk+PjE7Ci0gICAgICB0SW1hZ1tMIC0gMSAtIGldID0gLShyMSArIGkxKT4+MTsKLSAgICAgIHRSZWFsW0wgLSBpIC0gMV0gPSAgKHIyIC0gaTIpPj4xOwotICAgICAgdEltYWdbaV0gPSAtKHIyICsgaTIpPj4xOworICAgICAgdFJlYWxbaV0gPSAocjEgLSBpMSkgPj4gMTsKKyAgICAgIHRJbWFnW0wgLSAxIC0gaV0gPSAtKHIxICsgaTEpID4+IDE7CisgICAgICB0UmVhbFtMIC0gaSAtIDFdID0gKHIyIC0gaTIpID4+IDE7CisgICAgICB0SW1hZ1tpXSA9IC0ocjIgKyBpMikgPj4gMTsKICAgICB9CiAgIH0KIH0KLQotdm9pZCBxbWZTeW50aGVzaXNGaWx0ZXJpbmdTbG90KCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LICBzeW5RbWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUU1GICAqcmVhbFNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUU1GICAqaW1hZ1Nsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAqdGltZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAgICAgICAqcFdvcmtCdWZmZXIpCi17Ci0gICAgaWYgKCEoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX0xQKSkKLSAgICAgIHFtZkludmVyc2VNb2R1bGF0aW9uSFEgKCBzeW5RbWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ1Nsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHN5blFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19DTERGQikgewotICAgICAgICBxbWZJbnZlcnNlTW9kdWxhdGlvbkxQX29kZCAoIHN5blFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxTbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHFtZkludmVyc2VNb2R1bGF0aW9uTFBfZXZlbiAoIHN5blFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxTbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX05PTlNZTU1FVFJJQykgewotICAgICAgICBxbWZTeW5Qcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYyAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5RbWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyK3N5blFtZi0+bm9fY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB9IGVsc2UgewotICAgICAgICBxbWZTeW5Qcm90b3R5cGVGaXJTbG90ICggc3luUW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlcitzeW5RbWYtPm5vX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgfQotfQotCi0KLS8qIQotICoKLSAqCi0gKiBcYnJpZWYgUGVyZm9ybSBjb21wbGV4LXZhbHVlZCBzdWJiYW5kIHN5bnRoZXNpcyBvZiB0aGUKLSAqICAgICAgICBsb3cgYmFuZCBhbmQgdGhlIGhpZ2ggYmFuZCBhbmQgc3RvcmUgdGhlCi0gKiAgICAgICAgdGltZSBkb21haW4gZGF0YSBpbiB0aW1lT3V0Ci0gKgotICogRmlyc3Qgc3RlcDogQ2FsY3VsYXRlIHRoZSBwcm9wZXIgc2NhbGluZyBmYWN0b3Igb2YgY3VycmVudAotICogc3BlY3RyYWwgZGF0YSBpbiBxbWZSZWFsL3FtZkltYWcsIG9sZCBzcGVjdHJhbCBkYXRhIGluIHRoZSBvdmVybGFwCi0gKiByYW5nZSBhbmQgZmlsdGVyIHN0YXRlcy4KLSAqCi0gKiBTZWNvbmQgc3RlcDogUGVyZm9ybSBGcmVxdWVuY3ktdG8tVGltZSBtYXBwaW5nIHdpdGggaW52ZXJzZQotICogTW9kdWxhdGlvbiBzbG90LXdpc2UuCi0gKgotICogVGhpcmQgc3RlcDogUGVyZm9ybSBGSVItZmlsdGVyIHNsb3Qtd2lzZS4gVG8gc2F2ZSBzcGFjZSBmb3IgZmlsdGVyCi0gKiBzdGF0ZXMsIHRoZSBNQUMgb3BlcmF0aW9ucyBhcmUgZXhlY3V0ZWQgZGlyZWN0bHkgb24gdGhlIGZpbHRlciBzdGF0ZXMKLSAqIGluc3RlYWQgb2YgYWNjdW11bGF0aW5nIHNldmVyYWwgcHJvZHVjdHMgaW4gdGhlIGFjY3VtdWxhdG9yLiBUaGUKLSAqIGJ1ZmZlciBzaGlmdCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYQotICogbW9kdWxvIG9wZXJhdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIG9uIHNvbWUgRFNQcy4KLSAqCi0gKiBMYXN0IHN0ZXA6IENvcHkgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHNwZWN0cmFsIGRhdGEgdG8gdGhlIG92ZXJsYXAgYnVmZmVyLgotICoKLSAqIFRoZSBxbWYgY29lZmZpY2llbnQgdGFibGUgaXMgc3ltbWV0cmljLiBUaGUgc3ltbWV0cnkgaXMgZXhwbG9pdGVkIGJ5Ci0gKiBzaHJpbmtpbmcgdGhlIGNvZWZmaWNpZW50IHRhYmxlIHRvIGhhbGYgdGhlIHNpemUuIFRoZSBhZGRyZXNzaW5nIG1vZGUKLSAqIHRha2VzIGNhcmUgb2YgdGhlIHN5bW1ldHJpZXMuICBJZiB0aGUgI2RlZmluZSAjUU1GVEFCTEVfRlVMTCBpcyBzZXQsCi0gKiBjb2VmZmljaWVudCBhZGRyZXNzaW5nIHdvcmtzIG9uIHRoZSBmdWxsIHRhYmxlIHNpemUuIFRoZSBjb2RlIHdpbGwgYmUKLSAqIHNsaWdodGx5IGZhc3RlciBhbmQgc2xpZ2h0bHkgbW9yZSBjb21wYWN0LgotICoKLSAqIFdvcmtidWZmZXIgcmVxdWlyZW1lbnQ6IDIgeCBzaXplb2YoKipRbWZCdWZmZXJSZWFsKSAqIHN5blFtZi0+bm9fY2hhbm5lbHMKLSAqLwotdm9pZAotcW1mU3ludGhlc2lzRmlsdGVyaW5nKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwgICAgICAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICAqLwotICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgKipRbWZCdWZmZXJSZWFsLCAgICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgcmVhbCAqLwotICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgKipRbWZCdWZmZXJJbWFnLCAgICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgaW1hZyAqLwotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRTUZfU0NBTEVfRkFDVE9SICpzY2FsZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgb3ZfbGVuLCAgICAgICAgICAgICAgICAgIC8qITwgc3BsaXQgU2xvdCBvZiBvdmVybGFwIGFuZCBhY3R1YWwgc2xvdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAqdGltZU91dCwgICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgc3RyaWRlLCAgICAgICAgICAgICAgICAgIC8qITwgc3RyaWRlIGZhY3RvciBvZiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICAqcFdvcmtCdWZmZXIgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgaW50IGk7Ci0gIGludCBMID0gc3luUW1mLT5ub19jaGFubmVsczsKLSAgU0NIQVIgc2NhbGVGYWN0b3JIaWdoQmFuZDsKLSAgU0NIQVIgc2NhbGVGYWN0b3JMb3dCYW5kX292LCBzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3Y7Ci0KLSAgLyogYWRhcHQgc2NhbGluZyAqLwotICBzY2FsZUZhY3RvckhpZ2hCYW5kID0gLUFMR09SSVRITUlDX1NDQUxJTkdfSU5fQU5BTFlTSVNfRklMVEVSQkFOSyAtIHNjYWxlRmFjdG9yLT5oYl9zY2FsZTsKLSAgc2NhbGVGYWN0b3JMb3dCYW5kX292ID0gLSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgLSBzY2FsZUZhY3Rvci0+b3ZfbGJfc2NhbGU7Ci0gIHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdiA9IC0gQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LIC0gc2NhbGVGYWN0b3ItPmxiX3NjYWxlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzeW5RbWYtPm5vX2NvbDsgaSsrKSAgLyogLS0tLS0gbm9fY29sIGxvb3AgLS0tLS0gKi8KLSAgewotICAgIGNvbnN0IEZJWFBfREJMICpRbWZCdWZmZXJJbWFnU2xvdCA9IE5VTEw7Ci0KLSAgICBTQ0hBUiBzY2FsZUZhY3Rvckxvd0JhbmQgPSAoaTxvdl9sZW4pID8gc2NhbGVGYWN0b3JMb3dCYW5kX292IDogc2NhbGVGYWN0b3JMb3dCYW5kX25vX292OwotCi0gICAgaWYgKCEoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX0xQKSkKLSAgICAgICAgUW1mQnVmZmVySW1hZ1Nsb3QgPSBRbWZCdWZmZXJJbWFnW2ldOwotCi0gICAgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdCggIHN5blFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVyUmVhbFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVySW1hZ1Nsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dCsoaSpMKnN0cmlkZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIpOwotICB9IC8qIG5vX2NvbCBsb29wICBpICAqLwotCi19Ci0KKyNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX3FtZkludmVyc2VNb2R1bGF0aW9uSFEgKi8KIAogLyohCiAgKgpAQCAtOTY0LDI0ICs3NjgsNDIgQEAKICAqIFxyZXR1cm4gMCBpZiBzdWNjZXNzZnVsCiAgKgogICovCi1zdGF0aWMgaW50Ci1xbWZJbml0RmlsdGVyQmFuayAoSEFORExFX1FNRl9GSUxURVJfQkFOSyBoX1FtZiwgICAgIC8qITwgSGFuZGxlIHRvIHJldHVybiAqLwotICAgICAgICAgICAgICAgICAgIHZvaWQgKnBGaWx0ZXJTdGF0ZXMsICAgICAgICAgICAgICAvKiE8IEhhbmRsZSB0byBmaWx0ZXIgc3RhdGVzICovCi0gICAgICAgICAgICAgICAgICAgaW50IG5vQ29scywgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWVzbG90cyBwZXIgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMb3dlciBlbmQgb2YgUU1GIGZyZXF1ZW5jeSByYW5nZSAqLwotICAgICAgICAgICAgICAgICAgIGludCB1c2IsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVwcGVyIGVuZCBvZiBRTUYgZnJlcXVlbmN5IHJhbmdlICovCi0gICAgICAgICAgICAgICAgICAgaW50IG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNoYW5uZWxzIChiYW5kcykgKi8KLSAgICAgICAgICAgICAgICAgICBVSU5UIGZsYWdzKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmbGFncyAqLworc3RhdGljIGludCBxbWZJbml0RmlsdGVyQmFuaygKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGhfUW1mLCAvKiE8IEhhbmRsZSB0byByZXR1cm4gKi8KKyAgICB2b2lkICpwRmlsdGVyU3RhdGVzLCAgICAgICAgICAvKiE8IEhhbmRsZSB0byBmaWx0ZXIgc3RhdGVzICovCisgICAgaW50IG5vQ29scywgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZXNsb3RzIHBlciBmcmFtZSAqLworICAgIGludCBsc2IsICAgICAgICAgICAgICAgICAgICAgIC8qITwgTG93ZXIgZW5kIG9mIFFNRiBmcmVxdWVuY3kgcmFuZ2UgKi8KKyAgICBpbnQgdXNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVwcGVyIGVuZCBvZiBRTUYgZnJlcXVlbmN5IHJhbmdlICovCisgICAgaW50IG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY2hhbm5lbHMgKGJhbmRzKSAqLworICAgIFVJTlQgZmxhZ3MsICAgICAgICAgICAgICAgICAgIC8qITwgZmxhZ3MgKi8KKyAgICBpbnQgc3luZmxhZykgICAgICAgICAgICAgICAgICAvKiE8IDE6IHN5bnRoZXNpczsgMDogYW5hbHlzaXMgKi8KIHsKLSAgRkRLbWVtY2xlYXIoaF9RbWYsc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOworICBGREttZW1jbGVhcihoX1FtZiwgc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOwogCi0gIGlmIChmbGFncyAmIFFNRl9GTEFHX01QU0xERkIpCi0gIHsKLSAgICByZXR1cm4gLTE7CisgIGlmIChmbGFncyAmIFFNRl9GTEFHX01QU0xERkIpIHsKKyAgICBmbGFncyB8PSBRTUZfRkxBR19OT05TWU1NRVRSSUM7CisgICAgZmxhZ3MgfD0gUU1GX0ZMQUdfTVBTTERGQl9PUFRJTUlaRV9NT0RVTEFUSU9OOworCisgICAgaF9RbWYtPnRfY29zID0gTlVMTDsKKyAgICBoX1FtZi0+dF9zaW4gPSBOVUxMOworICAgIGhfUW1mLT5maWx0ZXJTY2FsZSA9IFFNRl9NUFNMREZCX1BGVF9TQ0FMRTsKKyAgICBoX1FtZi0+cF9zdHJpZGUgPSAxOworCisgICAgc3dpdGNoIChub19jaGFubmVscykgeworICAgICAgY2FzZSA2NDoKKyAgICAgICAgaF9RbWYtPnBfZmlsdGVyID0gcW1mX21wc2xkZmJfNjQwOworICAgICAgICBoX1FtZi0+RmlsdGVyU2l6ZSA9IDY0MDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDMyOgorICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfbXBzbGRmYl8zMjA7CisgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gMzIwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgIH0KIAotICBpZiAoICEoZmxhZ3MgJiBRTUZfRkxBR19NUFNMREZCKSAmJiAoZmxhZ3MgJiBRTUZfRkxBR19DTERGQikgKQotICB7CisgIGlmICghKGZsYWdzICYgUU1GX0ZMQUdfTVBTTERGQikgJiYgKGZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpKSB7CiAgICAgZmxhZ3MgfD0gUU1GX0ZMQUdfTk9OU1lNTUVUUklDOwogICAgIGhfUW1mLT5maWx0ZXJTY2FsZSA9IFFNRl9DTERGQl9QRlRfU0NBTEU7CiAKQEAgLTk5NCw2MyArODE2LDE1OCBAQAogICAgICAgICBoX1FtZi0+RmlsdGVyU2l6ZSA9IDY0MDsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIDMyOgotICAgICAgICBoX1FtZi0+dF9jb3MgPSBxbWZfcGhhc2VzaGlmdF9jb3MzMl9jbGRmYjsKKyAgICAgICAgaF9RbWYtPnRfY29zID0gKHN5bmZsYWcpID8gcW1mX3BoYXNlc2hpZnRfY29zMzJfY2xkZmJfc3luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHFtZl9waGFzZXNoaWZ0X2NvczMyX2NsZGZiX2FuYTsKICAgICAgICAgaF9RbWYtPnRfc2luID0gcW1mX3BoYXNlc2hpZnRfc2luMzJfY2xkZmI7CiAgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl9jbGRmYl8zMjA7CiAgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gMzIwOwogICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIGhfUW1mLT50X2NvcyA9IChzeW5mbGFnKSA/IHFtZl9waGFzZXNoaWZ0X2NvczE2X2NsZGZiX3N5bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBxbWZfcGhhc2VzaGlmdF9jb3MxNl9jbGRmYl9hbmE7CisgICAgICAgIGhfUW1mLT50X3NpbiA9IHFtZl9waGFzZXNoaWZ0X3NpbjE2X2NsZGZiOworICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfY2xkZmJfMTYwOworICAgICAgICBoX1FtZi0+RmlsdGVyU2l6ZSA9IDE2MDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIGhfUW1mLT50X2NvcyA9IChzeW5mbGFnKSA/IHFtZl9waGFzZXNoaWZ0X2NvczhfY2xkZmJfc3luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHFtZl9waGFzZXNoaWZ0X2NvczhfY2xkZmJfYW5hOworICAgICAgICBoX1FtZi0+dF9zaW4gPSBxbWZfcGhhc2VzaGlmdF9zaW44X2NsZGZiOworICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfY2xkZmJfODA7CisgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gODA7CisgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgfQogCi0gIGlmICggIShmbGFncyAmIFFNRl9GTEFHX01QU0xERkIpICYmICgoZmxhZ3MgJiBRTUZfRkxBR19DTERGQikgPT0gMCkgKQotICB7CisgIGlmICghKGZsYWdzICYgUU1GX0ZMQUdfTVBTTERGQikgJiYgKChmbGFncyAmIFFNRl9GTEFHX0NMREZCKSA9PSAwKSkgewogICAgIHN3aXRjaCAobm9fY2hhbm5lbHMpIHsKICAgICAgIGNhc2UgNjQ6Ci0gICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl82NDsKKyAgICAgICAgaF9RbWYtPnBfZmlsdGVyID0gcW1mX3BmaWx0NjQwOwogICAgICAgICBoX1FtZi0+dF9jb3MgPSBxbWZfcGhhc2VzaGlmdF9jb3M2NDsKICAgICAgICAgaF9RbWYtPnRfc2luID0gcW1mX3BoYXNlc2hpZnRfc2luNjQ7CiAgICAgICAgIGhfUW1mLT5wX3N0cmlkZSA9IDE7CiAgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gNjQwOwogICAgICAgICBoX1FtZi0+ZmlsdGVyU2NhbGUgPSAwOwogICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDA6CisgICAgICAgIGlmIChzeW5mbGFnKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaF9RbWYtPnBfZmlsdGVyID0gcW1mX3BmaWx0NDAwOyAvKiBTY2FsaW5nIGZhY3RvciAwLjggKi8KKyAgICAgICAgICBoX1FtZi0+dF9jb3MgPSBxbWZfcGhhc2VzaGlmdF9jb3M0MDsKKyAgICAgICAgICBoX1FtZi0+dF9zaW4gPSBxbWZfcGhhc2VzaGlmdF9zaW40MDsKKyAgICAgICAgICBoX1FtZi0+ZmlsdGVyU2NhbGUgPSAxOworICAgICAgICAgIGhfUW1mLT5wX3N0cmlkZSA9IDE7CisgICAgICAgICAgaF9RbWYtPkZpbHRlclNpemUgPSBub19jaGFubmVscyAqIDEwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAzMjoKLSAgICAgICAgaF9RbWYtPnBfZmlsdGVyID0gcW1mXzY0OworICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfcGZpbHQ2NDA7CiAgICAgICAgIGlmIChmbGFncyAmIFFNRl9GTEFHX0RPV05TQU1QTEVEKSB7CiAgICAgICAgICAgaF9RbWYtPnRfY29zID0gcW1mX3BoYXNlc2hpZnRfY29zX2Rvd25zYW1wMzI7CiAgICAgICAgICAgaF9RbWYtPnRfc2luID0gcW1mX3BoYXNlc2hpZnRfc2luX2Rvd25zYW1wMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIGhfUW1mLT50X2NvcyA9IHFtZl9waGFzZXNoaWZ0X2NvczMyOwotICAgICAgICBoX1FtZi0+dF9zaW4gPSBxbWZfcGhhc2VzaGlmdF9zaW4zMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoX1FtZi0+dF9jb3MgPSBxbWZfcGhhc2VzaGlmdF9jb3MzMjsKKyAgICAgICAgICBoX1FtZi0+dF9zaW4gPSBxbWZfcGhhc2VzaGlmdF9zaW4zMjsKICAgICAgICAgfQogICAgICAgICBoX1FtZi0+cF9zdHJpZGUgPSAyOwogICAgICAgICBoX1FtZi0+RmlsdGVyU2l6ZSA9IDY0MDsKICAgICAgICAgaF9RbWYtPmZpbHRlclNjYWxlID0gMDsKICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIwOgorICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfcGZpbHQyMDA7CisgICAgICAgIGhfUW1mLT5wX3N0cmlkZSA9IDE7CisgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gMjAwOworICAgICAgICBoX1FtZi0+ZmlsdGVyU2NhbGUgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTI6CisgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl9wZmlsdDEyMDsKKyAgICAgICAgaF9RbWYtPnBfc3RyaWRlID0gMTsKKyAgICAgICAgaF9RbWYtPkZpbHRlclNpemUgPSAxMjA7CisgICAgICAgIGhfUW1mLT5maWx0ZXJTY2FsZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4OgorICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfcGZpbHQ2NDA7CisgICAgICAgIGhfUW1mLT5wX3N0cmlkZSA9IDg7CisgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gNjQwOworICAgICAgICBoX1FtZi0+ZmlsdGVyU2NhbGUgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl9wZmlsdDY0MDsKKyAgICAgICAgaF9RbWYtPnRfY29zID0gcW1mX3BoYXNlc2hpZnRfY29zMTY7CisgICAgICAgIGhfUW1mLT50X3NpbiA9IHFtZl9waGFzZXNoaWZ0X3NpbjE2OworICAgICAgICBoX1FtZi0+cF9zdHJpZGUgPSA0OworICAgICAgICBoX1FtZi0+RmlsdGVyU2l6ZSA9IDY0MDsKKyAgICAgICAgaF9RbWYtPmZpbHRlclNjYWxlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI0OgorICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfcGZpbHQyNDA7CisgICAgICAgIGhfUW1mLT50X2NvcyA9IHFtZl9waGFzZXNoaWZ0X2NvczI0OworICAgICAgICBoX1FtZi0+dF9zaW4gPSBxbWZfcGhhc2VzaGlmdF9zaW4yNDsKKyAgICAgICAgaF9RbWYtPnBfc3RyaWRlID0gMTsKKyAgICAgICAgaF9RbWYtPkZpbHRlclNpemUgPSAyNDA7CisgICAgICAgIGhfUW1mLT5maWx0ZXJTY2FsZSA9IDE7CisgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgfQogCisgIGhfUW1mLT5zeW5TY2FsZWZhY3RvciA9IGhfUW1mLT5maWx0ZXJTY2FsZTsKKyAgLy8gRENUfERTVCBkZXBlbmRlbmN5CisgIHN3aXRjaCAobm9fY2hhbm5lbHMpIHsKKyAgICBjYXNlIDEyODoKKyAgICAgIGhfUW1mLT5zeW5TY2FsZWZhY3RvciArPSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LICsgMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDA6IHsKKyAgICAgIGhfUW1mLT5zeW5TY2FsZWZhY3RvciArPSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LIC0gMTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgNjQ6CisgICAgICBoX1FtZi0+c3luU2NhbGVmYWN0b3IgKz0gQUxHT1JJVEhNSUNfU0NBTElOR19JTl9TWU5USEVTSVNfRklMVEVSQkFOSzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIGhfUW1mLT5zeW5TY2FsZWZhY3RvciArPSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LIC0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6CisgICAgICBoX1FtZi0+c3luU2NhbGVmYWN0b3IgKz0gQUxHT1JJVEhNSUNfU0NBTElOR19JTl9TWU5USEVTSVNfRklMVEVSQkFOSzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjA6CisgICAgICBoX1FtZi0+c3luU2NhbGVmYWN0b3IgKz0gQUxHT1JJVEhNSUNfU0NBTElOR19JTl9TWU5USEVTSVNfRklMVEVSQkFOSyArIDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgaF9RbWYtPnN5blNjYWxlZmFjdG9yICs9IEFMR09SSVRITUlDX1NDQUxJTkdfSU5fU1lOVEhFU0lTX0ZJTFRFUkJBTksgLSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgIGhfUW1mLT5zeW5TY2FsZWZhY3RvciArPSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LIC0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICBoX1FtZi0+c3luU2NhbGVmYWN0b3IgKz0gQUxHT1JJVEhNSUNfU0NBTElOR19JTl9TWU5USEVTSVNfRklMVEVSQkFOSyAtIDE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0xOworICB9CisKICAgaF9RbWYtPmZsYWdzID0gZmxhZ3M7CiAKICAgaF9RbWYtPm5vX2NoYW5uZWxzID0gbm9fY2hhbm5lbHM7CiAgIGhfUW1mLT5ub19jb2wgPSBub0NvbHM7CiAKLSAgaF9RbWYtPmxzYiA9IGxzYjsKLSAgaF9RbWYtPnVzYiA9IGZNaW4odXNiLCBoX1FtZi0+bm9fY2hhbm5lbHMpOworICBoX1FtZi0+bHNiID0gZk1pbihsc2IsIGhfUW1mLT5ub19jaGFubmVscyk7CisgIGhfUW1mLT51c2IgPSBzeW5mbGFnCisgICAgICAgICAgICAgICAgICAgPyBmTWluKHVzYiwgaF9RbWYtPm5vX2NoYW5uZWxzKQorICAgICAgICAgICAgICAgICAgIDogdXNiOyAvKiB3YXM6IGhfUW1mLT51c2IgPSBmTWluKHVzYiwgaF9RbWYtPm5vX2NoYW5uZWxzKTsgKi8KIAotICBoX1FtZi0+RmlsdGVyU3RhdGVzID0gKHZvaWQqKXBGaWx0ZXJTdGF0ZXM7CisgIGhfUW1mLT5GaWx0ZXJTdGF0ZXMgPSAodm9pZCAqKXBGaWx0ZXJTdGF0ZXM7CiAKLSAgaF9RbWYtPm91dFNjYWxlZmFjdG9yID0gQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LICsgQUxHT1JJVEhNSUNfU0NBTElOR19JTl9TWU5USEVTSVNfRklMVEVSQkFOSyArIGhfUW1mLT5maWx0ZXJTY2FsZTsKKyAgaF9RbWYtPm91dFNjYWxlZmFjdG9yID0KKyAgICAgIChBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgKyBoX1FtZi0+ZmlsdGVyU2NhbGUpICsKKyAgICAgIGhfUW1mLT5zeW5TY2FsZWZhY3RvcjsKIAotICBpZiAoIChoX1FtZi0+cF9zdHJpZGUgPT0gMikKLSAgICB8fCAoKGZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpICYmIChub19jaGFubmVscyA9PSAzMikpICkgewotICAgIGhfUW1mLT5vdXRTY2FsZWZhY3RvciAtPSAxOwotICB9Ci0gIGhfUW1mLT5vdXRHYWluID0gKEZJWFBfREJMKTB4ODAwMDAwMDA7IC8qIGRlZmF1bHQgaW5pdCB2YWx1ZSB3aWxsIGJlIG5vdCBhcHBsaWVkICovCisgIGhfUW1mLT5vdXRHYWluX20gPQorICAgICAgKEZJWFBfREJMKTB4ODAwMDAwMDA7IC8qIGRlZmF1bHQgaW5pdCB2YWx1ZSB3aWxsIGJlIG5vdCBhcHBsaWVkICovCisgIGhfUW1mLT5vdXRHYWluX2UgPSAwOwogCiAgIHJldHVybiAoMCk7CiB9CkBAIC0xMDYyLDQxICs5NzksNDkgQEAKICAqIFxyZXR1cm4gdm9pZAogICoKICAqLwotc3RhdGljIGlubGluZSB2b2lkCi1xbWZBZGFwdEZpbHRlclN0YXRlcyAoSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgRmlsdGVyIEJhbmsgKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NhbGVGYWN0b3JEaWZmKSAgICAgICAgICAgICAgIC8qITwgU2NhbGUgZmFjdG9yIGRpZmZlcmVuY2UgdG8gYmUgYXBwbGllZCAqLworc3RhdGljIGlubGluZSB2b2lkIHFtZkFkYXB0RmlsdGVyU3RhdGVzKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgRmlsdGVyIEJhbmsgKi8KKyAgICBpbnQgc2NhbGVGYWN0b3JEaWZmKSAgICAgICAgICAgLyohPCBTY2FsZSBmYWN0b3IgZGlmZmVyZW5jZSB0byBiZSBhcHBsaWVkICovCiB7CiAgIGlmIChzeW5RbWYgPT0gTlVMTCB8fCBzeW5RbWYtPkZpbHRlclN0YXRlcyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIHNjYWxlVmFsdWVzKChGSVhQX1FTUyopc3luUW1mLT5GaWx0ZXJTdGF0ZXMsIHN5blFtZi0+bm9fY2hhbm5lbHMqKFFNRl9OT19QT0xZKjIgLSAxKSwgc2NhbGVGYWN0b3JEaWZmKTsKKyAgaWYgKHNjYWxlRmFjdG9yRGlmZiA+IDApIHsKKyAgICBzY2FsZVZhbHVlc1NhdHVyYXRlKChGSVhQX1FTUyAqKXN5blFtZi0+RmlsdGVyU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3luUW1mLT5ub19jaGFubmVscyAqIChRTUZfTk9fUE9MWSAqIDIgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yRGlmZik7CisgIH0gZWxzZSB7CisgICAgc2NhbGVWYWx1ZXMoKEZJWFBfUVNTICopc3luUW1mLT5GaWx0ZXJTdGF0ZXMsCisgICAgICAgICAgICAgICAgc3luUW1mLT5ub19jaGFubmVscyAqIChRTUZfTk9fUE9MWSAqIDIgLSAxKSwgc2NhbGVGYWN0b3JEaWZmKTsKKyAgfQogfQogCiAvKiEKICAqCiAgKiBcYnJpZWYgQ3JlYXRlIFFNRiBmaWx0ZXIgYmFuayBpbnN0YW5jZQogICoKLSAqIE9ubHkgdGhlIGxvd2VyIGJhbmRzIGFyZSBvYnRhaW5lZCAodXB0byBhbmFRbWYtPmxzYikuIEZvcgotICogYSBmdWxsIGJhbmR3aWR0aCBhbmFseXNpcyBpdCBpcyByZXF1aXJlZCB0byBzZXQgYm90aCBhbmFRbWYtPmxzYgotICogYW5kIGFuYVFtZi0+dXNiIHRvIHRoZSBhbW91bnQgb2YgUU1GIGJhbmRzLgogICoKICAqIFxyZXR1cm4gMCBpZiBzdWNjZXNmdWwKICAqCiAgKi8KLWludAotcW1mSW5pdEFuYWx5c2lzRmlsdGVyQmFuayAoSEFORExFX1FNRl9GSUxURVJfQkFOSyBoX1FtZiwgICAvKiE8IFJldHVybnMgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FBUyAqcEZpbHRlclN0YXRlcywgICAgICAgIC8qITwgSGFuZGxlIHRvIGZpbHRlciBzdGF0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbHMsICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZXNsb3RzIHBlciBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxzYiwgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGxvd2VyIGVuZCBvZiBRTUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2IsICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB1cHBlciBlbmQgb2YgUU1GICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9fY2hhbm5lbHMsICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNoYW5uZWxzIChiYW5kcykgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgICAgICAgICAgICAgICAgICAgICAgLyohPCBMb3cgUG93ZXIgZmxhZyAqLworaW50IHFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBoX1FtZiwgLyohPCBSZXR1cm5zIGhhbmRsZSAqLworICAgIEZJWFBfUUFTICpwRmlsdGVyU3RhdGVzLCAgICAgIC8qITwgSGFuZGxlIHRvIGZpbHRlciBzdGF0ZXMgKi8KKyAgICBpbnQgbm9Db2xzLCAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lc2xvdHMgcGVyIGZyYW1lICovCisgICAgaW50IGxzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCBsb3dlciBlbmQgb2YgUU1GICovCisgICAgaW50IHVzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCB1cHBlciBlbmQgb2YgUU1GICovCisgICAgaW50IG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY2hhbm5lbHMgKGJhbmRzKSAqLworICAgIGludCBmbGFncykgICAgICAgICAgICAgICAgICAgIC8qITwgTG93IFBvd2VyIGZsYWcgKi8KIHsKLSAgaW50IGVyciA9IHFtZkluaXRGaWx0ZXJCYW5rKGhfUW1mLCBwRmlsdGVyU3RhdGVzLCBub0NvbHMsIGxzYiwgdXNiLCBub19jaGFubmVscywgZmxhZ3MpOwotICBpZiAoICEoZmxhZ3MgJiBRTUZfRkxBR19LRUVQX1NUQVRFUykgJiYgKGhfUW1mLT5GaWx0ZXJTdGF0ZXMgIT0gTlVMTCkgKSB7Ci0gICAgRkRLbWVtY2xlYXIoaF9RbWYtPkZpbHRlclN0YXRlcywgKDIqUU1GX05PX1BPTFktMSkqaF9RbWYtPm5vX2NoYW5uZWxzKnNpemVvZihGSVhQX1FBUykpOworICBpbnQgZXJyID0gcW1mSW5pdEZpbHRlckJhbmsoaF9RbWYsIHBGaWx0ZXJTdGF0ZXMsIG5vQ29scywgbHNiLCB1c2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub19jaGFubmVscywgZmxhZ3MsIDApOworICBpZiAoIShmbGFncyAmIFFNRl9GTEFHX0tFRVBfU1RBVEVTKSAmJiAoaF9RbWYtPkZpbHRlclN0YXRlcyAhPSBOVUxMKSkgeworICAgIEZES21lbWNsZWFyKGhfUW1mLT5GaWx0ZXJTdGF0ZXMsCisgICAgICAgICAgICAgICAgKDIgKiBRTUZfTk9fUE9MWSAtIDEpICogaF9RbWYtPm5vX2NoYW5uZWxzICogc2l6ZW9mKEZJWFBfUUFTKSk7CiAgIH0KIAorICBGREtfQVNTRVJUKGhfUW1mLT5ub19jaGFubmVscyA+PSBoX1FtZi0+bHNiKTsKKwogICByZXR1cm4gZXJyOwogfQogCkBAIC0xMTA0LDM3ICsxMDI5LDM4IEBACiAgKgogICogXGJyaWVmIENyZWF0ZSBRTUYgZmlsdGVyIGJhbmsgaW5zdGFuY2UKICAqCi0gKiBPbmx5IHRoZSBsb3dlciBiYW5kcyBhcmUgb2J0YWluZWQgKHVwdG8gYW5hUW1mLT5sc2IpLiBGb3IKLSAqIGEgZnVsbCBiYW5kd2lkdGggYW5hbHlzaXMgaXQgaXMgcmVxdWlyZWQgdG8gc2V0IGJvdGggYW5hUW1mLT5sc2IKLSAqIGFuZCBhbmFRbWYtPnVzYiB0byB0aGUgYW1vdW50IG9mIFFNRiBiYW5kcy4KICAqCiAgKiBccmV0dXJuIDAgaWYgc3VjY2VzZnVsCiAgKgogICovCi1pbnQKLXFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rIChIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGhfUW1mLCAgIC8qITwgUmV0dXJucyBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FTUyAqcEZpbHRlclN0YXRlcywgICAgICAgIC8qITwgSGFuZGxlIHRvIGZpbHRlciBzdGF0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9Db2xzLCAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWVzbG90cyBwZXIgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgbG93ZXIgZW5kIG9mIFFNRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2IsICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB1cHBlciBlbmQgb2YgUU1GICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjaGFubmVscyAoYmFuZHMpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IExvdyBQb3dlciBmbGFnICovCitpbnQgcW1mSW5pdFN5bnRoZXNpc0ZpbHRlckJhbmsoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBoX1FtZiwgLyohPCBSZXR1cm5zIGhhbmRsZSAqLworICAgIEZJWFBfUVNTICpwRmlsdGVyU3RhdGVzLCAgICAgIC8qITwgSGFuZGxlIHRvIGZpbHRlciBzdGF0ZXMgKi8KKyAgICBpbnQgbm9Db2xzLCAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lc2xvdHMgcGVyIGZyYW1lICovCisgICAgaW50IGxzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCBsb3dlciBlbmQgb2YgUU1GICovCisgICAgaW50IHVzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCB1cHBlciBlbmQgb2YgUU1GICovCisgICAgaW50IG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY2hhbm5lbHMgKGJhbmRzKSAqLworICAgIGludCBmbGFncykgICAgICAgICAgICAgICAgICAgIC8qITwgTG93IFBvd2VyIGZsYWcgKi8KIHsKICAgaW50IG9sZE91dFNjYWxlID0gaF9RbWYtPm91dFNjYWxlZmFjdG9yOwotICBpbnQgZXJyID0gcW1mSW5pdEZpbHRlckJhbmsoaF9RbWYsIHBGaWx0ZXJTdGF0ZXMsIG5vQ29scywgbHNiLCB1c2IsIG5vX2NoYW5uZWxzLCBmbGFncyk7Ci0gIGlmICggaF9RbWYtPkZpbHRlclN0YXRlcyAhPSBOVUxMICkgewotICAgIGlmICggIShmbGFncyAmIFFNRl9GTEFHX0tFRVBfU1RBVEVTKSApIHsKLSAgICAgIEZES21lbWNsZWFyKGhfUW1mLT5GaWx0ZXJTdGF0ZXMsICgyKlFNRl9OT19QT0xZLTEpKmhfUW1mLT5ub19jaGFubmVscypzaXplb2YoRklYUF9RU1MpKTsKKyAgaW50IGVyciA9IHFtZkluaXRGaWx0ZXJCYW5rKGhfUW1mLCBwRmlsdGVyU3RhdGVzLCBub0NvbHMsIGxzYiwgdXNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fY2hhbm5lbHMsIGZsYWdzLCAxKTsKKyAgaWYgKGhfUW1mLT5GaWx0ZXJTdGF0ZXMgIT0gTlVMTCkgeworICAgIGlmICghKGZsYWdzICYgUU1GX0ZMQUdfS0VFUF9TVEFURVMpKSB7CisgICAgICBGREttZW1jbGVhcigKKyAgICAgICAgICBoX1FtZi0+RmlsdGVyU3RhdGVzLAorICAgICAgICAgICgyICogUU1GX05PX1BPTFkgLSAxKSAqIGhfUW1mLT5ub19jaGFubmVscyAqIHNpemVvZihGSVhQX1FTUykpOwogICAgIH0gZWxzZSB7Ci0gICAgICBxbWZBZGFwdEZpbHRlclN0YXRlcyhoX1FtZiwgb2xkT3V0U2NhbGUtaF9RbWYtPm91dFNjYWxlZmFjdG9yKTsKKyAgICAgIHFtZkFkYXB0RmlsdGVyU3RhdGVzKGhfUW1mLCBvbGRPdXRTY2FsZSAtIGhfUW1mLT5vdXRTY2FsZWZhY3Rvcik7CiAgICAgfQogICB9CisKKyAgRkRLX0FTU0VSVChoX1FtZi0+bm9fY2hhbm5lbHMgPj0gaF9RbWYtPmxzYik7CisgIEZES19BU1NFUlQoaF9RbWYtPm5vX2NoYW5uZWxzID49IGhfUW1mLT51c2IpOworCiAgIHJldHVybiBlcnI7CiB9CiAKLQotCi0KIC8qIQogICoKICAqIFxicmllZiBDaGFuZ2Ugc2NhbGUgZmFjdG9yIGZvciBvdXRwdXQgZGF0YSBhbmQgYWRqdXN0IHFtZiBmaWx0ZXIgc3RhdGVzCkBAIC0xMTQyLDM0ICsxMDY4LDIzIEBACiAgKiBccmV0dXJuIHZvaWQKICAqCiAgKi8KLXZvaWQKLXFtZkNoYW5nZU91dFNjYWxlZmFjdG9yIChIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwgICAgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRTY2FsZWZhY3RvciAgICAgICAgICAgICAgICAgLyohPCBOZXcgc2NhbGluZyBmYWN0b3IgZm9yIG91dHB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIGlmIChzeW5RbWYgPT0gTlVMTCB8fCBzeW5RbWYtPkZpbHRlclN0YXRlcyA9PSBOVUxMKSB7Cit2b2lkIHFtZkNoYW5nZU91dFNjYWxlZmFjdG9yKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgKi8KKyAgICBpbnQgb3V0U2NhbGVmYWN0b3IgICAgICAgICAgICAgLyohPCBOZXcgc2NhbGluZyBmYWN0b3IgZm9yIG91dHB1dCBkYXRhICovCispIHsKKyAgaWYgKHN5blFtZiA9PSBOVUxMKSB7CiAgICAgcmV0dXJuOwogICB9CiAKICAgLyogQWRkIGludGVybmFsIGZpbHRlcmJhbmsgc2NhbGUgKi8KLSAgb3V0U2NhbGVmYWN0b3IgKz0gQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LICsgQUxHT1JJVEhNSUNfU0NBTElOR19JTl9TWU5USEVTSVNfRklMVEVSQkFOSyArIHN5blFtZi0+ZmlsdGVyU2NhbGU7Ci0KLSAgaWYgKCAoc3luUW1mLT5wX3N0cmlkZSA9PSAyKQotICAgIHx8ICgoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX0NMREZCKSAmJiAoc3luUW1mLT5ub19jaGFubmVscyA9PSAzMikpICkgewotICAgIG91dFNjYWxlZmFjdG9yIC09IDE7Ci0gIH0KKyAgb3V0U2NhbGVmYWN0b3IgKz0KKyAgICAgIChBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgKyBzeW5RbWYtPmZpbHRlclNjYWxlKSArCisgICAgICBzeW5RbWYtPnN5blNjYWxlZmFjdG9yOwogCiAgIC8qIGFkanVzdCBmaWx0ZXIgc3RhdGVzIHdoZW4gc2NhbGUgZmFjdG9yIGhhcyBiZWVuIGNoYW5nZWQgKi8KLSAgaWYgKHN5blFtZi0+b3V0U2NhbGVmYWN0b3IgIT0gb3V0U2NhbGVmYWN0b3IpCi0gIHsKKyAgaWYgKHN5blFtZi0+b3V0U2NhbGVmYWN0b3IgIT0gb3V0U2NhbGVmYWN0b3IpIHsKICAgICBpbnQgZGlmZjsKIAotICAgIGlmIChvdXRTY2FsZWZhY3RvciA+IChTQU1QTEVfQklUUyAtIDEpKSB7Ci0gICAgICBvdXRTY2FsZWZhY3RvciA9IFNBTVBMRV9CSVRTIC0gMTsKLSAgICB9IGVsc2UgaWYgKG91dFNjYWxlZmFjdG9yIDwgKDEgLSBTQU1QTEVfQklUUykpIHsKLSAgICAgIG91dFNjYWxlZmFjdG9yID0gMSAtIFNBTVBMRV9CSVRTOwotICAgIH0KLQogICAgIGRpZmYgPSBzeW5RbWYtPm91dFNjYWxlZmFjdG9yIC0gb3V0U2NhbGVmYWN0b3I7CiAKICAgICBxbWZBZGFwdEZpbHRlclN0YXRlcyhzeW5RbWYsIGRpZmYpOwpAQCAtMTE4MSwxNiArMTA5Niw0MCBAQAogCiAvKiEKICAqCisgKiBcYnJpZWYgR2V0IHNjYWxlIGZhY3RvciBjaGFuZ2Ugd2hpY2ggd2FzIHNldCBieSBxbWZDaGFuZ2VPdXRTY2FsZWZhY3RvcigpCisgKgorICogXHJldHVybiBzY2FsZUZhY3RvcgorICoKKyAqLworaW50IHFtZkdldE91dFNjYWxlZmFjdG9yKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mKSAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgKi8KK3sKKyAgaW50IHNjYWxlRmFjdG9yID0gc3luUW1mLT5vdXRTY2FsZWZhY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgPyAoc3luUW1mLT5vdXRTY2FsZWZhY3RvciAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5RbWYtPmZpbHRlclNjYWxlICsgc3luUW1mLT5zeW5TY2FsZWZhY3RvcikpCisgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgIHJldHVybiBzY2FsZUZhY3RvcjsKK30KKworLyohCisgKgogICogXGJyaWVmIENoYW5nZSBnYWluIGZvciBvdXRwdXQgZGF0YQogICoKICAqIFxyZXR1cm4gdm9pZAogICoKICAqLwotdm9pZAotcW1mQ2hhbmdlT3V0R2FpbiAoSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgKi8KLSAgICAgICAgICAgICAgICAgIEZJWFBfREJMIG91dHB1dEdhaW4gICAgICAgICAgICAgICAgLyohPCBOZXcgZ2FpbiBmb3Igb3V0cHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgKQotewotICBzeW5RbWYtPm91dEdhaW4gPSBvdXRwdXRHYWluOwordm9pZCBxbWZDaGFuZ2VPdXRHYWluKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgKi8KKyAgICBGSVhQX0RCTCBvdXRwdXRHYWluLCAgICAgICAgICAgLyohPCBOZXcgZ2FpbiBmb3Igb3V0cHV0IGRhdGEgKG1hbnRpc3NhKSAqLworICAgIGludCBvdXRwdXRHYWluU2NhbGUgICAgICAgICAgICAvKiE8IE5ldyBnYWluIGZvciBvdXRwdXQgZGF0YSAoZXhwb25lbnQpICovCispIHsKKyAgc3luUW1mLT5vdXRHYWluX20gPSBvdXRwdXRHYWluOworICBzeW5RbWYtPm91dEdhaW5fZSA9IG91dHB1dEdhaW5TY2FsZTsKIH0KIAorLyogV2hlbiBRTUZfMTZJTl8zMk9VVCBpcyBzZXQsIHN5bnRoZXNpcyBmdW5jdGlvbnMgZm9yIDE2IGFuZCAzMiBiaXQgcGFyYWxsZWwKKyAqIG91dHB1dCBpcyBjb21waWxlZCAqLworI2RlZmluZSBJTlRfUENNX1FNRk9VVCBJTlRfUENNCisjZGVmaW5lIFNBTVBMRV9CSVRTX1FNRk9VVCBTQU1QTEVfQklUUworI2luY2x1ZGUgInFtZl9wY20uaCIKZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvc2NhbGUuY3BwIGIvbGliRkRLL3NyYy9zY2FsZS5jcHAKaW5kZXggNTgyOTQ0My4uMjRhOGE1YiAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9zY2FsZS5jcHAKKysrIGIvbGliRkRLL3NyYy9zY2FsZS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiBTY2FsaW5nIG9wZXJhdGlvbnMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIApAQCAtOTYsMTEgKzEwOCwxMCBAQAogICogSW5saW5lIGRlZmluaXRpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgU0NBTEVfSU5MSU5FIGlubGluZQorI2luY2x1ZGUgInNjYWxlLmgiCiAKLQotI2lmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KLSNpbmNsdWRlICJtaXBzL3NjYWxlLmNwcCIKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorI2luY2x1ZGUgIm1pcHMvc2NhbGVfbWlwcy5jcHAiCiAKICNlbGlmIGRlZmluZWQoX19hcm1fXykKICNpbmNsdWRlICJhcm0vc2NhbGVfYXJtLmNwcCIKQEAgLTExNiwzOCArMTI3LDMyIEBACiAgKgogICovCiAjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVzX1NHTAotU0NBTEVfSU5MSU5FCi12b2lkIHNjYWxlVmFsdWVzKEZJWFBfU0dMICp2ZWN0b3IsICAvKiE8IFZlY3RvciAqLwotICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgICAgIC8qITwgTGVuZ3RoICovCi0gICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgICAgLyohPCBTY2FsZWZhY3RvciAqLwotICAgICAgICAgICAgICAgICApCi17Cit2b2lkIHNjYWxlVmFsdWVzKEZJWFBfU0dMICp2ZWN0b3IsIC8qITwgVmVjdG9yICovCisgICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAgIC8qITwgTGVuZ3RoICovCisgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgIC8qITwgU2NhbGVmYWN0b3IgKi8KKykgewogICBJTlQgaTsKIAogICAvKiBSZXR1cm4gaWYgc2NhbGVmYWN0b3IgaXMgWmVybyAqLwotICBpZiAoc2NhbGVmYWN0b3I9PTApIHJldHVybjsKKyAgaWYgKHNjYWxlZmFjdG9yID09IDApIHJldHVybjsKIAotICBpZihzY2FsZWZhY3RvciA+IDApewotICAgIHNjYWxlZmFjdG9yID0gZml4bWluX0koc2NhbGVmYWN0b3IsKElOVCkoREZSQUNUX0JJVFMtMSkpOwotICAgIGZvciAoaSA9IGxlbiYzOyBpLS07ICkKLSAgICB7CisgIGlmIChzY2FsZWZhY3RvciA+IDApIHsKKyAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLCAoSU5UKShGUkFDVF9CSVRTIC0gMSkpOworICAgIGZvciAoaSA9IGxlbiAmIDM7IGktLTspIHsKICAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKICAgICB9Ci0gICAgZm9yIChpID0gbGVuPj4yOyBpLS07ICkKLSAgICB7CisgICAgZm9yIChpID0gbGVuID4+IDI7IGktLTspIHsKICAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKICAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKICAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKICAgICAgICoodmVjdG9yKyspIDw8PSBzY2FsZWZhY3RvcjsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgSU5UIG5lZ1NjYWxlZmFjdG9yID0gZml4bWluX0koLXNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7Ci0gICAgZm9yIChpID0gbGVuJjM7IGktLTsgKQotICAgIHsKKyAgICBJTlQgbmVnU2NhbGVmYWN0b3IgPSBmaXhtaW5fSSgtc2NhbGVmYWN0b3IsIChJTlQpRlJBQ1RfQklUUyAtIDEpOworICAgIGZvciAoaSA9IGxlbiAmIDM7IGktLTspIHsKICAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgICB9Ci0gICAgZm9yIChpID0gbGVuPj4yOyBpLS07ICkKLSAgICB7CisgICAgZm9yIChpID0gbGVuID4+IDI7IGktLTspIHsKICAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKQEAgLTE2NywzNyArMTcyLDMyIEBACiAgKi8KICNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZXNfREJMCiBTQ0FMRV9JTkxJTkUKLXZvaWQgc2NhbGVWYWx1ZXMoRklYUF9EQkwgKnZlY3RvciwgICAgLyohPCBWZWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAgICAgLyohPCBMZW5ndGggKi8KLSAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yICAgICAgLyohPCBTY2FsZWZhY3RvciAqLwotICAgICAgICAgICAgICAgICkKLXsKK3ZvaWQgc2NhbGVWYWx1ZXMoRklYUF9EQkwgKnZlY3RvciwgLyohPCBWZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAgLyohPCBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yICAgLyohPCBTY2FsZWZhY3RvciAqLworKSB7CiAgIElOVCBpOwogCiAgIC8qIFJldHVybiBpZiBzY2FsZWZhY3RvciBpcyBaZXJvICovCi0gIGlmIChzY2FsZWZhY3Rvcj09MCkgcmV0dXJuOworICBpZiAoc2NhbGVmYWN0b3IgPT0gMCkgcmV0dXJuOwogCi0gIGlmKHNjYWxlZmFjdG9yID4gMCl7Ci0gICAgc2NhbGVmYWN0b3IgPSBmaXhtaW5fSShzY2FsZWZhY3RvciwoSU5UKURGUkFDVF9CSVRTLTEpOwotICAgIGZvciAoaSA9IGxlbiYzOyBpLS07ICkKLSAgICB7CisgIGlmIChzY2FsZWZhY3RvciA+IDApIHsKKyAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSk7CisgICAgZm9yIChpID0gbGVuICYgMzsgaS0tOykgewogICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgIH0KLSAgICBmb3IgKGkgPSBsZW4+PjI7IGktLTsgKQotICAgIHsKKyAgICBmb3IgKGkgPSBsZW4gPj4gMjsgaS0tOykgewogICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBJTlQgbmVnU2NhbGVmYWN0b3IgPSBmaXhtaW5fSSgtc2NhbGVmYWN0b3IsKElOVClERlJBQ1RfQklUUy0xKTsKLSAgICBmb3IgKGkgPSBsZW4mMzsgaS0tOyApCi0gICAgeworICAgIElOVCBuZWdTY2FsZWZhY3RvciA9IGZpeG1pbl9JKC1zY2FsZWZhY3RvciwgKElOVClERlJBQ1RfQklUUyAtIDEpOworICAgIGZvciAoaSA9IGxlbiAmIDM7IGktLTspIHsKICAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgICB9Ci0gICAgZm9yIChpID0gbGVuPj4yOyBpLS07ICkKLSAgICB7CisgICAgZm9yIChpID0gbGVuID4+IDI7IGktLTspIHsKICAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKICAgICAgICoodmVjdG9yKyspID4+PSBuZWdTY2FsZWZhY3RvcjsKQEAgLTIwNyw2ICsyMDcsMTY3IEBACiB9CiAjZW5kaWYKIAorI2lmbmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlc1NhdHVyYXRlX0RCTAorLyohCisgKgorICogIFxicmllZiAgTXVsdGlwbHkgaW5wdXQgdmVjdG9yIGJ5IFxmJCAyXntzY2FsZWZhY3Rvcn0gXGYkCisgKiAgXHBhcmFtIHZlY3RvciAgICAgIHNvdXJjZS9kZXN0aW5hdGlvbiBidWZmZXIKKyAqICBccGFyYW0gbGVuICAgICAgICAgbGVuZ3RoIG9mIHZlY3RvcgorICogIFxwYXJhbSBzY2FsZWZhY3RvciBhbW91bnQgb2Ygc2hpZnRzIHRvIGJlIGFwcGxpZWQKKyAqICBccmV0dXJuIHZvaWQKKyAqCisgKi8KKyNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZXNTYXR1cmF0ZV9EQkwKK1NDQUxFX0lOTElORQordm9pZCBzY2FsZVZhbHVlc1NhdHVyYXRlKEZJWFBfREJMICp2ZWN0b3IsIC8qITwgVmVjdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAgLyohPCBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAvKiE8IFNjYWxlZmFjdG9yICovCispIHsKKyAgSU5UIGk7CisKKyAgLyogUmV0dXJuIGlmIHNjYWxlZmFjdG9yIGlzIFplcm8gKi8KKyAgaWYgKHNjYWxlZmFjdG9yID09IDApIHJldHVybjsKKworICBzY2FsZWZhY3RvciA9IGZpeG1heF9JKGZpeG1pbl9JKHNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCkgLSAoREZSQUNUX0JJVFMgLSAxKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgdmVjdG9yW2ldID0gc2NhbGVWYWx1ZVNhdHVyYXRlKHZlY3RvcltpXSwgc2NhbGVmYWN0b3IpOworICB9Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fc2NhbGVWYWx1ZXNTYXR1cmF0ZV9EQkwgKi8KKworI2lmbmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlc1NhdHVyYXRlX0RCTF9EQkwKKy8qIQorICoKKyAqICBcYnJpZWYgIE11bHRpcGx5IGlucHV0IHZlY3RvciBieSBcZiQgMl57c2NhbGVmYWN0b3J9IFxmJAorICogIFxwYXJhbSBkc3QgICAgICAgICBkZXN0aW5hdGlvbiBidWZmZXIKKyAqICBccGFyYW0gc3JjICAgICAgICAgc291cmNlIGJ1ZmZlcgorICogIFxwYXJhbSBsZW4gICAgICAgICBsZW5ndGggb2YgdmVjdG9yCisgKiAgXHBhcmFtIHNjYWxlZmFjdG9yIGFtb3VudCBvZiBzaGlmdHMgdG8gYmUgYXBwbGllZAorICogIFxyZXR1cm4gdm9pZAorICoKKyAqLworI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc1NhdHVyYXRlX0RCTF9EQkwKK1NDQUxFX0lOTElORQordm9pZCBzY2FsZVZhbHVlc1NhdHVyYXRlKEZJWFBfREJMICpkc3QsICAvKiE8IE91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzcmMsICAvKiE8IElucHV0ICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgLyohPCBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgLyohPCBTY2FsZWZhY3RvciAqLworKSB7CisgIElOVCBpOworCisgIC8qIFJldHVybiBpZiBzY2FsZWZhY3RvciBpcyBaZXJvICovCisgIGlmIChzY2FsZWZhY3RvciA9PSAwKSB7CisgICAgRkRLbWVtbW92ZShkc3QsIHNyYywgbGVuICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgc2NhbGVmYWN0b3IgPSBmaXhtYXhfSShmaXhtaW5fSShzY2FsZWZhY3RvciwgKElOVClERlJBQ1RfQklUUyAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpIC0gKERGUkFDVF9CSVRTIC0gMSkpOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGRzdFtpXSA9IHNjYWxlVmFsdWVTYXR1cmF0ZShzcmNbaV0sIHNjYWxlZmFjdG9yKTsKKyAgfQorfQorI2VuZGlmIC8qIEZVTkNUSU9OX3NjYWxlVmFsdWVzU2F0dXJhdGVfREJMX0RCTCAqLworCisjaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVzU2F0dXJhdGVfU0dMX0RCTAorLyohCisgKgorICogIFxicmllZiAgTXVsdGlwbHkgaW5wdXQgdmVjdG9yIGJ5IFxmJCAyXntzY2FsZWZhY3Rvcn0gXGYkCisgKiAgXHBhcmFtIGRzdCAgICAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlciAoRklYUF9TR0wpCisgKiAgXHBhcmFtIHNyYyAgICAgICAgIHNvdXJjZSBidWZmZXIgKEZJWFBfREJMKQorICogIFxwYXJhbSBsZW4gICAgICAgICBsZW5ndGggb2YgdmVjdG9yCisgKiAgXHBhcmFtIHNjYWxlZmFjdG9yIGFtb3VudCBvZiBzaGlmdHMgdG8gYmUgYXBwbGllZAorICogIFxyZXR1cm4gdm9pZAorICoKKyAqLworI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc1NhdHVyYXRlX1NHTF9EQkwKK1NDQUxFX0lOTElORQordm9pZCBzY2FsZVZhbHVlc1NhdHVyYXRlKEZJWFBfU0dMICpkc3QsICAgLyohPCBPdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc3JjLCAgIC8qITwgSW5wdXQgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAgLyohPCBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IpIC8qITwgU2NhbGVmYWN0b3IgKi8KK3sKKyAgSU5UIGk7CisgIHNjYWxlZmFjdG9yID0gZml4bWF4X0koZml4bWluX0koc2NhbGVmYWN0b3IsIChJTlQpREZSQUNUX0JJVFMgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKSAtIChERlJBQ1RfQklUUyAtIDEpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBkc3RbaV0gPSBGWF9EQkwyRlhfU0dMKGZBZGRTYXR1cmF0ZShzY2FsZVZhbHVlU2F0dXJhdGUoc3JjW2ldLCBzY2FsZWZhY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKTB4ODAwMCkpOworICB9Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fc2NhbGVWYWx1ZXNTYXR1cmF0ZV9TR0xfREJMICovCisKKyNpZm5kZWYgRlVOQ1RJT05fc2NhbGVWYWx1ZXNTYXR1cmF0ZV9TR0wKKy8qIQorICoKKyAqICBcYnJpZWYgIE11bHRpcGx5IGlucHV0IHZlY3RvciBieSBcZiQgMl57c2NhbGVmYWN0b3J9IFxmJAorICogIFxwYXJhbSB2ZWN0b3IgICAgICBzb3VyY2UvZGVzdGluYXRpb24gYnVmZmVyCisgKiAgXHBhcmFtIGxlbiAgICAgICAgIGxlbmd0aCBvZiB2ZWN0b3IKKyAqICBccGFyYW0gc2NhbGVmYWN0b3IgYW1vdW50IG9mIHNoaWZ0cyB0byBiZSBhcHBsaWVkCisgKiAgXHJldHVybiB2b2lkCisgKgorICovCisjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVzU2F0dXJhdGVfU0dMCitTQ0FMRV9JTkxJTkUKK3ZvaWQgc2NhbGVWYWx1ZXNTYXR1cmF0ZShGSVhQX1NHTCAqdmVjdG9yLCAvKiE8IFZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAgIC8qITwgTGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yICAgLyohPCBTY2FsZWZhY3RvciAqLworKSB7CisgIElOVCBpOworCisgIC8qIFJldHVybiBpZiBzY2FsZWZhY3RvciBpcyBaZXJvICovCisgIGlmIChzY2FsZWZhY3RvciA9PSAwKSByZXR1cm47CisKKyAgc2NhbGVmYWN0b3IgPSBmaXhtYXhfSShmaXhtaW5fSShzY2FsZWZhY3RvciwgKElOVClERlJBQ1RfQklUUyAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpIC0gKERGUkFDVF9CSVRTIC0gMSkpOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIHZlY3RvcltpXSA9IEZYX0RCTDJGWF9TR0woCisgICAgICAgIHNjYWxlVmFsdWVTYXR1cmF0ZShGWF9TR0wyRlhfREJMKHZlY3RvcltpXSksIHNjYWxlZmFjdG9yKSk7CisgIH0KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9zY2FsZVZhbHVlc1NhdHVyYXRlX1NHTCAqLworCisjaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVzU2F0dXJhdGVfU0dMX1NHTAorLyohCisgKgorICogIFxicmllZiAgTXVsdGlwbHkgaW5wdXQgdmVjdG9yIGJ5IFxmJCAyXntzY2FsZWZhY3Rvcn0gXGYkCisgKiAgXHBhcmFtIGRzdCAgICAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogIFxwYXJhbSBzcmMgICAgICAgICBzb3VyY2UgYnVmZmVyCisgKiAgXHBhcmFtIGxlbiAgICAgICAgIGxlbmd0aCBvZiB2ZWN0b3IKKyAqICBccGFyYW0gc2NhbGVmYWN0b3IgYW1vdW50IG9mIHNoaWZ0cyB0byBiZSBhcHBsaWVkCisgKiAgXHJldHVybiB2b2lkCisgKgorICovCisjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVzU2F0dXJhdGVfU0dMX1NHTAorU0NBTEVfSU5MSU5FCit2b2lkIHNjYWxlVmFsdWVzU2F0dXJhdGUoRklYUF9TR0wgKmRzdCwgIC8qITwgT3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgKnNyYywgIC8qITwgSW5wdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgLyohPCBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgLyohPCBTY2FsZWZhY3RvciAqLworKSB7CisgIElOVCBpOworCisgIC8qIFJldHVybiBpZiBzY2FsZWZhY3RvciBpcyBaZXJvICovCisgIGlmIChzY2FsZWZhY3RvciA9PSAwKSB7CisgICAgRkRLbWVtbW92ZShkc3QsIHNyYywgbGVuICogc2l6ZW9mKEZJWFBfU0dMKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgc2NhbGVmYWN0b3IgPSBmaXhtYXhfSShmaXhtaW5fSShzY2FsZWZhY3RvciwgKElOVClERlJBQ1RfQklUUyAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpIC0gKERGUkFDVF9CSVRTIC0gMSkpOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGRzdFtpXSA9CisgICAgICAgIEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZVNhdHVyYXRlKEZYX1NHTDJGWF9EQkwoc3JjW2ldKSwgc2NhbGVmYWN0b3IpKTsKKyAgfQorfQorI2VuZGlmIC8qIEZVTkNUSU9OX3NjYWxlVmFsdWVzU2F0dXJhdGVfU0dMX1NHTCAqLworCiAjaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVzX0RCTERCTAogLyohCiAgKgpAQCAtMjI1LDM4ICszODYsMTM2IEBACiAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpzcmMsIC8qITwgc3JjIFZlY3RvciAqLwogICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgICAgICAvKiE8IExlbmd0aCAqLwogICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAgICAvKiE8IFNjYWxlZmFjdG9yICovCi0gICAgICAgICAgICAgICAgKQoteworKSB7CiAgIElOVCBpOwogCiAgIC8qIFJldHVybiBpZiBzY2FsZWZhY3RvciBpcyBaZXJvICovCi0gIGlmIChzY2FsZWZhY3Rvcj09MCkgewotCWlmIChkc3QgIT0gc3JjKQotICAgICAgRkRLbWVtbW92ZShkc3QsIHNyYywgbGVuKnNpemVvZihGSVhQX0RCTCkpOwotICB9Ci0gIGVsc2UgewotCi0gICAgaWYoc2NhbGVmYWN0b3IgPiAwKXsKLSAgICAgIHNjYWxlZmFjdG9yID0gZml4bWluX0koc2NhbGVmYWN0b3IsKElOVClERlJBQ1RfQklUUy0xKTsKLSAgICAgIGZvciAoaSA9IGxlbiYzOyBpLS07ICkKLSAgICAgIHsKKyAgaWYgKHNjYWxlZmFjdG9yID09IDApIHsKKyAgICBpZiAoZHN0ICE9IHNyYykgRkRLbWVtbW92ZShkc3QsIHNyYywgbGVuICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIH0gZWxzZSB7CisgICAgaWYgKHNjYWxlZmFjdG9yID4gMCkgeworICAgICAgc2NhbGVmYWN0b3IgPSBmaXhtaW5fSShzY2FsZWZhY3RvciwgKElOVClERlJBQ1RfQklUUyAtIDEpOworICAgICAgZm9yIChpID0gbGVuICYgMzsgaS0tOykgewogICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspIDw8IHNjYWxlZmFjdG9yOwogICAgICAgfQotICAgICAgZm9yIChpID0gbGVuPj4yOyBpLS07ICkKLSAgICAgIHsKKyAgICAgIGZvciAoaSA9IGxlbiA+PiAyOyBpLS07KSB7CiAgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CiAgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CiAgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CiAgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIElOVCBuZWdTY2FsZWZhY3RvciA9IGZpeG1pbl9JKC1zY2FsZWZhY3RvciwoSU5UKURGUkFDVF9CSVRTLTEpOwotICAgICAgZm9yIChpID0gbGVuJjM7IGktLTsgKQotICAgICAgeworICAgICAgSU5UIG5lZ1NjYWxlZmFjdG9yID0gZml4bWluX0koLXNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSk7CisgICAgICBmb3IgKGkgPSBsZW4gJiAzOyBpLS07KSB7CiAgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3I7CiAgICAgICB9Ci0gICAgICBmb3IgKGkgPSBsZW4+PjI7IGktLTsgKQotICAgICAgeworICAgICAgZm9yIChpID0gbGVuID4+IDI7IGktLTspIHsKKyAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3RvcjsKKyAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3RvcjsKKyAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3RvcjsKKyAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3RvcjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisjaWYgKFNBTVBMRV9CSVRTID09IDE2KQorI2lmbmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlc19QQ01EQkwKKy8qIQorICoKKyAqICBcYnJpZWYgIE11bHRpcGx5IGlucHV0IHZlY3RvciBzcmMgYnkgXGYkIDJee3NjYWxlZmFjdG9yfSBcZiQKKyAqICAgICAgICAgIGFuZCBwbGFjZSByZXN1bHQgaW50byBkc3QKKyAqICBccGFyYW0gZHN0IGRldGluYXRpb24gYnVmZmVyCisgKiAgXHBhcmFtIHNyYyBzb3VyY2UgYnVmZmVyCisgKiAgXHBhcmFtIGxlbiBtdXN0IGJlIGxhcmdlciB0aGFuIDQKKyAqICBccGFyYW0gc2NhbGVmYWN0b3IgYW1vdW50IG9mIGxlZnQgc2hpZnRzIHRvIGJlIGFwcGxpZWQKKyAqICBccmV0dXJuIHZvaWQKKyAqCisgKi8KKyNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZXNfUENNREJMCitTQ0FMRV9JTkxJTkUKK3ZvaWQgc2NhbGVWYWx1ZXMoRklYUF9QQ00gKmRzdCwgICAgICAgLyohPCBkc3QgVmVjdG9yICovCisgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpzcmMsIC8qITwgc3JjIFZlY3RvciAqLworICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgICAgICAvKiE8IExlbmd0aCAqLworICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAgICAvKiE8IFNjYWxlZmFjdG9yICovCispIHsKKyAgSU5UIGk7CisKKyAgc2NhbGVmYWN0b3IgLT0gREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUzsKKworICAvKiBSZXR1cm4gaWYgc2NhbGVmYWN0b3IgaXMgWmVybyAqLworICB7CisgICAgaWYgKHNjYWxlZmFjdG9yID4gMCkgeworICAgICAgc2NhbGVmYWN0b3IgPSBmaXhtaW5fSShzY2FsZWZhY3RvciwgKElOVClERlJBQ1RfQklUUyAtIDEpOworICAgICAgZm9yIChpID0gbGVuICYgMzsgaS0tOykgeworICAgICAgICAqKGRzdCsrKSA9IChGSVhQX1BDTSkoKihzcmMrKykgPDwgc2NhbGVmYWN0b3IpOworICAgICAgfQorICAgICAgZm9yIChpID0gbGVuID4+IDI7IGktLTspIHsKKyAgICAgICAgKihkc3QrKykgPSAoRklYUF9QQ00pKCooc3JjKyspIDw8IHNjYWxlZmFjdG9yKTsKKyAgICAgICAgKihkc3QrKykgPSAoRklYUF9QQ00pKCooc3JjKyspIDw8IHNjYWxlZmFjdG9yKTsKKyAgICAgICAgKihkc3QrKykgPSAoRklYUF9QQ00pKCooc3JjKyspIDw8IHNjYWxlZmFjdG9yKTsKKyAgICAgICAgKihkc3QrKykgPSAoRklYUF9QQ00pKCooc3JjKyspIDw8IHNjYWxlZmFjdG9yKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgSU5UIG5lZ1NjYWxlZmFjdG9yID0gZml4bWluX0koLXNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSk7CisgICAgICBmb3IgKGkgPSBsZW4gJiAzOyBpLS07KSB7CisgICAgICAgICooZHN0KyspID0gKEZJWFBfUENNKSgqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3Rvcik7CisgICAgICB9CisgICAgICBmb3IgKGkgPSBsZW4gPj4gMjsgaS0tOykgeworICAgICAgICAqKGRzdCsrKSA9IChGSVhQX1BDTSkoKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3IpOworICAgICAgICAqKGRzdCsrKSA9IChGSVhQX1BDTSkoKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3IpOworICAgICAgICAqKGRzdCsrKSA9IChGSVhQX1BDTSkoKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3IpOworICAgICAgICAqKGRzdCsrKSA9IChGSVhQX1BDTSkoKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3IpOworICAgICAgfQorICAgIH0KKyAgfQorfQorI2VuZGlmCisjZW5kaWYgLyogKFNBTVBMRV9CSVRTID09IDE2KSAqLworCisjaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVzX1NHTFNHTAorLyohCisgKgorICogIFxicmllZiAgTXVsdGlwbHkgaW5wdXQgdmVjdG9yIHNyYyBieSBcZiQgMl57c2NhbGVmYWN0b3J9IFxmJAorICogICAgICAgICAgYW5kIHBsYWNlIHJlc3VsdCBpbnRvIGRzdAorICogIFxwYXJhbSBkc3QgZGV0aW5hdGlvbiBidWZmZXIKKyAqICBccGFyYW0gc3JjIHNvdXJjZSBidWZmZXIKKyAqICBccGFyYW0gbGVuIG11c3QgYmUgbGFyZ2VyIHRoYW4gNAorICogIFxwYXJhbSBzY2FsZWZhY3RvciBhbW91bnQgb2YgbGVmdCBzaGlmdHMgdG8gYmUgYXBwbGllZAorICogIFxyZXR1cm4gdm9pZAorICoKKyAqLworI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc19TR0xTR0wKK1NDQUxFX0lOTElORQordm9pZCBzY2FsZVZhbHVlcyhGSVhQX1NHTCAqZHN0LCAgICAgICAvKiE8IGRzdCBWZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgKnNyYywgLyohPCBzcmMgVmVjdG9yICovCisgICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAgICAgIC8qITwgTGVuZ3RoICovCisgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgICAgIC8qITwgU2NhbGVmYWN0b3IgKi8KKykgeworICBJTlQgaTsKKworICAvKiBSZXR1cm4gaWYgc2NhbGVmYWN0b3IgaXMgWmVybyAqLworICBpZiAoc2NhbGVmYWN0b3IgPT0gMCkgeworICAgIGlmIChkc3QgIT0gc3JjKSBGREttZW1tb3ZlKGRzdCwgc3JjLCBsZW4gKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoc2NhbGVmYWN0b3IgPiAwKSB7CisgICAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSk7CisgICAgICBmb3IgKGkgPSBsZW4gJiAzOyBpLS07KSB7CisgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CisgICAgICB9CisgICAgICBmb3IgKGkgPSBsZW4gPj4gMjsgaS0tOykgeworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspIDw8IHNjYWxlZmFjdG9yOworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspIDw8IHNjYWxlZmFjdG9yOworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspIDw8IHNjYWxlZmFjdG9yOworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspIDw8IHNjYWxlZmFjdG9yOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBJTlQgbmVnU2NhbGVmYWN0b3IgPSBmaXhtaW5fSSgtc2NhbGVmYWN0b3IsIChJTlQpREZSQUNUX0JJVFMgLSAxKTsKKyAgICAgIGZvciAoaSA9IGxlbiAmIDM7IGktLTspIHsKKyAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3RvcjsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IGxlbiA+PiAyOyBpLS07KSB7CiAgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3I7CiAgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3I7CiAgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPj4gbmVnU2NhbGVmYWN0b3I7CkBAIC0yNzcsNjIgKzUzNiw1OSBAQAogICovCiAjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVzV2l0aEZhY3Rvcl9EQkwKIFNDQUxFX0lOTElORQotdm9pZCBzY2FsZVZhbHVlc1dpdGhGYWN0b3IoCi0gICAgICAgIEZJWFBfREJMICp2ZWN0b3IsCi0gICAgICAgIEZJWFBfREJMIGZhY3RvciwKLSAgICAgICAgSU5UIGxlbiwKLSAgICAgICAgSU5UIHNjYWxlZmFjdG9yCi0gICAgICAgICkKLXsKK3ZvaWQgc2NhbGVWYWx1ZXNXaXRoRmFjdG9yKEZJWFBfREJMICp2ZWN0b3IsIEZJWFBfREJMIGZhY3RvciwgSU5UIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvcikgewogICBJTlQgaTsKIAogICAvKiBDb21wZW5zYXRlIGZNdWx0RGl2MiAqLwogICBzY2FsZWZhY3RvcisrOwogCi0gIGlmKHNjYWxlZmFjdG9yID4gMCl7Ci0gICAgc2NhbGVmYWN0b3IgPSBmaXhtaW5fSShzY2FsZWZhY3RvciwoSU5UKURGUkFDVF9CSVRTLTEpOwotICAgIGZvciAoaSA9IGxlbiYzOyBpLS07ICkKLSAgICB7CisgIGlmIChzY2FsZWZhY3RvciA+IDApIHsKKyAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSk7CisgICAgZm9yIChpID0gbGVuICYgMzsgaS0tOykgewogICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpIDw8IHNjYWxlZmFjdG9yOwogICAgICAgdmVjdG9yKys7CiAgICAgfQotICAgIGZvciAoaSA9IGxlbj4+MjsgaS0tOyApCi0gICAgewotICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpIDw8IHNjYWxlZmFjdG9yOyB2ZWN0b3IrKzsKLSAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA8PCBzY2FsZWZhY3RvcjsgdmVjdG9yKys7Ci0gICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7IHZlY3RvcisrOwotICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpIDw8IHNjYWxlZmFjdG9yOyB2ZWN0b3IrKzsKKyAgICBmb3IgKGkgPSBsZW4gPj4gMjsgaS0tOykgeworICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpIDw8IHNjYWxlZmFjdG9yOworICAgICAgdmVjdG9yKys7CisgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7CisgICAgICB2ZWN0b3IrKzsKKyAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA8PCBzY2FsZWZhY3RvcjsKKyAgICAgIHZlY3RvcisrOworICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpIDw8IHNjYWxlZmFjdG9yOworICAgICAgdmVjdG9yKys7CiAgICAgfQogICB9IGVsc2UgewotICAgIElOVCBuZWdTY2FsZWZhY3RvciA9IGZpeG1pbl9JKC1zY2FsZWZhY3RvciwoSU5UKURGUkFDVF9CSVRTLTEpOwotICAgIGZvciAoaSA9IGxlbiYzOyBpLS07ICkKLSAgICB7CisgICAgSU5UIG5lZ1NjYWxlZmFjdG9yID0gZml4bWluX0koLXNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSk7CisgICAgZm9yIChpID0gbGVuICYgMzsgaS0tOykgewogICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpID4+IG5lZ1NjYWxlZmFjdG9yOwogICAgICAgdmVjdG9yKys7CiAgICAgfQotICAgIGZvciAoaSA9IGxlbj4+MjsgaS0tOyApCi0gICAgewotICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpID4+IG5lZ1NjYWxlZmFjdG9yOyB2ZWN0b3IrKzsKLSAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA+PiBuZWdTY2FsZWZhY3RvcjsgdmVjdG9yKys7Ci0gICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPj4gbmVnU2NhbGVmYWN0b3I7IHZlY3RvcisrOwotICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpID4+IG5lZ1NjYWxlZmFjdG9yOyB2ZWN0b3IrKzsKKyAgICBmb3IgKGkgPSBsZW4gPj4gMjsgaS0tOykgeworICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpID4+IG5lZ1NjYWxlZmFjdG9yOworICAgICAgdmVjdG9yKys7CisgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPj4gbmVnU2NhbGVmYWN0b3I7CisgICAgICB2ZWN0b3IrKzsKKyAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA+PiBuZWdTY2FsZWZhY3RvcjsKKyAgICAgIHZlY3RvcisrOworICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpID4+IG5lZ1NjYWxlZmFjdG9yOworICAgICAgdmVjdG9yKys7CiAgICAgfQogICB9CiB9CiAjZW5kaWYgLyogRlVOQ1RJT05fc2NhbGVWYWx1ZXNXaXRoRmFjdG9yX0RCTCAqLwogCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIElNUE9SVEFOVCBOT1RFIGZvciB1c2FnZSBvZiBnZXRTY2FsZWZhY3RvcigpCiAKLUlNUE9SVEFOVCBOT1RFIGZvciB1c2FnZSBvZiBnZXRTY2FsZWZhY3RvcigpCisgIElmIHRoZSBpbnB1dCBhcnJheSBjb250YWlucyBuZWdhdGl2ZSB2YWx1ZXMgdG9vLCB0aGVuIHRoZXNlIGZ1bmN0aW9ucyBtYXkKKyAgc29tZXRpbWVzIHJldHVybiB0aGUgYWN0dWFsIG1heGltdW0gdmFsdWUgbWludXMgMSwgZHVlIHRvIHRoZSBuYXR1cmUgb2YgdGhlCisgIGFwcGxpZWQgYWxnb3JpdGhtLiBTbyBiZSBjYXJlZnVsIHdpdGggcG9zc2libGUgZnJhY3Rpb25hbCAtMSB2YWx1ZXMgdGhhdCBtYXkKKyAgbGVhZCB0byBvdmVyZmxvd3Mgd2hlbiBiZWluZyBmUG93MigpJ2VkLgogCi1JZiB0aGUgaW5wdXQgYXJyYXkgY29udGFpbnMgbmVnYXRpdmUgdmFsdWVzIHRvbywgdGhlbiB0aGVzZSBmdW5jdGlvbnMgbWF5IHNvbWV0aW1lcyByZXR1cm4KLXRoZSBhY3R1YWwgbWF4aW11bSB2YWx1ZSBtaW51cyAxLCBkdWUgdG8gdGhlIG5hdHVyZSBvZiB0aGUgYXBwbGllZCBhbGdvcml0aG0uCi1TbyBiZSBjYXJlZnVsIHdpdGggcG9zc2libGUgZnJhY3Rpb25hbCAtMSB2YWx1ZXMgdGhhdCBtYXkgbGVhZCB0byBvdmVyZmxvd3Mgd2hlbiBiZWluZyBmUG93MigpJ2VkLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIEZVTkNUSU9OX2dldFNjYWxlZmFjdG9yU2hvcnQKIC8qIQpAQCAtMzQ2LDE3ICs2MDIsMTcgQEAKIFNDQUxFX0lOTElORQogSU5UIGdldFNjYWxlZmFjdG9yU2hvcnQoY29uc3QgU0hPUlQgKnZlY3RvciwgLyohPCBQb2ludGVyIHRvIGlucHV0IHZlY3RvciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbiAgICAgICAgICAgICAgLyohPCBMZW5ndGggb2YgaW5wdXQgdmVjdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICkKLXsKKykgewogICBJTlQgaTsKICAgU0hPUlQgdGVtcCwgbWF4VmFsID0gMDsKIAotICBmb3IoaT1sZW47aSE9MDtpLS0peworICBmb3IgKGkgPSBsZW47IGkgIT0gMDsgaS0tKSB7CiAgICAgdGVtcCA9IChTSE9SVCkoKnZlY3RvcisrKTsKLSAgICBtYXhWYWwgfD0gKHRlbXBeKHRlbXA+PihTSE9SVF9CSVRTLTEpKSk7CisgICAgbWF4VmFsIHw9ICh0ZW1wIF4gKHRlbXAgPj4gKFNIT1JUX0JJVFMgLSAxKSkpOwogICB9CiAKLSAgcmV0dXJuIGZpeG1heF9JKChJTlQpMCwoSU5UKShmaXhub3Jtel9EKChJTlQpbWF4VmFsKSAtIChJTlQpMSAtIChJTlQpKERGUkFDVF9CSVRTIC0gU0hPUlRfQklUUykpKTsKKyAgcmV0dXJuIGZpeG1heF9JKChJTlQpMCwgKElOVCkoZml4bm9ybXpfRCgoSU5UKW1heFZhbCkgLSAoSU5UKTEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKShERlJBQ1RfQklUUyAtIFNIT1JUX0JJVFMpKSk7CiB9CiAjZW5kaWYKIApAQCAtMzcyLDE3ICs2MjgsMTcgQEAKIFNDQUxFX0lOTElORQogSU5UIGdldFNjYWxlZmFjdG9yUENNKGNvbnN0IElOVF9QQ00gKnZlY3RvciwgLyohPCBQb2ludGVyIHRvIGlucHV0IHZlY3RvciAqLwogICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAgICAgICAgLyohPCBMZW5ndGggb2YgaW5wdXQgdmVjdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIHN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICkKLXsKKyAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RyaWRlKSB7CiAgIElOVCBpOwogICBJTlRfUENNIHRlbXAsIG1heFZhbCA9IDA7CiAKLSAgZm9yKGk9bGVuO2khPTA7aS0tKXsKLSAgICB0ZW1wID0gKElOVF9QQ00pKCp2ZWN0b3IpOyB2ZWN0b3IrPXN0cmlkZTsKLSAgICBtYXhWYWwgfD0gKHRlbXBeKHRlbXA+Pigoc2l6ZW9mKElOVF9QQ00pKjgpLTEpKSk7CisgIGZvciAoaSA9IGxlbjsgaSAhPSAwOyBpLS0pIHsKKyAgICB0ZW1wID0gKElOVF9QQ00pKCp2ZWN0b3IpOworICAgIHZlY3RvciArPSBzdHJpZGU7CisgICAgbWF4VmFsIHw9ICh0ZW1wIF4gKHRlbXAgPj4gKChzaXplb2YoSU5UX1BDTSkgKiA4KSAtIDEpKSk7CiAgIH0KLSAgcmV0dXJuIGZpeG1heF9JKChJTlQpMCwoSU5UKShmaXhub3Jtel9EKChJTlQpbWF4VmFsKSAtIChJTlQpMSAtIChJTlQpKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMpKSk7CisgIHJldHVybiBmaXhtYXhfSSgoSU5UKTAsIChJTlQpKGZpeG5vcm16X0QoKElOVCltYXhWYWwpIC0gKElOVCkxIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCkoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUykpKTsKIH0KICNlbmRpZgogCkBAIC0zOTgsMTggKzY1NCwxOCBAQAogU0NBTEVfSU5MSU5FCiBJTlQgZ2V0U2NhbGVmYWN0b3JTaG9ydChjb25zdCBTSE9SVCAqdmVjdG9yLCAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgdmVjdG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBpbnB1dCB2ZWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgKQoteworICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0cmlkZSkgewogICBJTlQgaTsKICAgU0hPUlQgdGVtcCwgbWF4VmFsID0gMDsKIAotICBmb3IoaT1sZW47aSE9MDtpLS0pewotICAgIHRlbXAgPSAoU0hPUlQpKCp2ZWN0b3IpOyB2ZWN0b3IrPXN0cmlkZTsKLSAgICBtYXhWYWwgfD0gKHRlbXBeKHRlbXA+PihTSE9SVF9CSVRTLTEpKSk7CisgIGZvciAoaSA9IGxlbjsgaSAhPSAwOyBpLS0pIHsKKyAgICB0ZW1wID0gKFNIT1JUKSgqdmVjdG9yKTsKKyAgICB2ZWN0b3IgKz0gc3RyaWRlOworICAgIG1heFZhbCB8PSAodGVtcCBeICh0ZW1wID4+IChTSE9SVF9CSVRTIC0gMSkpKTsKICAgfQogCi0gIHJldHVybiBmaXhtYXhfSSgoSU5UKTAsKElOVCkoZml4bm9ybXpfRCgoSU5UKW1heFZhbCkgLSAoSU5UKTEgLSAoSU5UKShERlJBQ1RfQklUUyAtIFNIT1JUX0JJVFMpKSk7CisgIHJldHVybiBmaXhtYXhfSSgoSU5UKTAsIChJTlQpKGZpeG5vcm16X0QoKElOVCltYXhWYWwpIC0gKElOVCkxIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCkoREZSQUNUX0JJVFMgLSBTSE9SVF9CSVRTKSkpOwogfQogI2VuZGlmCiAKQEAgLTQyMCw4ICs2NzYsMTIgQEAKICAqCiAgKiAgXHJldHVybiBNYXhpbXVtIHNjYWxlIGZhY3RvcgogICoKLSAqICBUaGlzIGZ1bmN0aW9uIGNhbiBjb25zdGl0dXRlIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGNvbXB1dGF0aW9uYWwgY29tcGxleGl0eSAtIHZlcnkgbXVjaCBkZXBlbmRpbmcgb24gdGhlCi0gKiAgYml0cmF0ZS4gU2luY2UgaXQgaXMgYSByYXRoZXIgc21hbGwgZnVuY3Rpb24sIGVmZmVjdGl2ZSBhc3NlbWJsZXIgb3B0aW1pemF0aW9uIG1pZ2h0IGJlIHBvc3NpYmxlLgorICogIFRoaXMgZnVuY3Rpb24gY2FuIGNvbnN0aXR1dGUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgY29tcHV0YXRpb25hbAorICogY29tcGxleGl0eSAtIHZlcnkgbXVjaCBkZXBlbmRpbmcgb24gdGhlIGJpdHJhdGUuIFNpbmNlIGl0IGlzIGEgcmF0aGVyIHNtYWxsCisgKiBmdW5jdGlvbiwgZWZmZWN0aXZlIGFzc2VtYmxlciBvcHRpbWl6YXRpb24gbWlnaHQgYmUgcG9zc2libGUuCisgKgorICogIElmIGFsbCBkYXRhIGlzIDB4RkZGRi5GRkZGIG9yIDB4MDAwMC4wMDAwIGZ1bmN0aW9uIHJldHVybnMgMzEKKyAqICBOb3RlOiBZb3UgY2FuIHNraXAgZGF0YSBub3JtYWxpemF0aW9uIG9ubHkgaWYgcmV0dXJuIHZhbHVlIGlzIDAKICAqCiAgKi8KICNkZWZpbmUgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JfREJMCkBAIC00MzIsMTIgKzY5MiwxMiBAQAogICBJTlQgaTsKICAgRklYUF9EQkwgdGVtcCwgbWF4VmFsID0gKEZJWFBfREJMKTA7CiAKLSAgZm9yKGk9bGVuO2khPTA7aS0tKXsKKyAgZm9yIChpID0gbGVuOyBpICE9IDA7IGktLSkgewogICAgIHRlbXAgPSAoTE9ORykoKnZlY3RvcisrKTsKLSAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORyl0ZW1wXihMT05HKSh0ZW1wPj4oREZSQUNUX0JJVFMtMSkpKTsKKyAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORyl0ZW1wIF4gKExPTkcpKHRlbXAgPj4gKERGUkFDVF9CSVRTIC0gMSkpKTsKICAgfQogCi0gIHJldHVybiBmaXhtYXhfSSgoSU5UKTAsKElOVCkoZml4bm9ybXpfRChtYXhWYWwpIC0gMSkpOworICByZXR1cm4gZml4bWF4X0koKElOVCkwLCAoSU5UKShmaXhub3Jtel9EKG1heFZhbCkgLSAxKSk7CiB9CiAjZW5kaWYKIApAQCAtNDUwLDEyICs3MTAsMTEgQEAKICAgSU5UIGk7CiAgIFNIT1JUIHRlbXAsIG1heFZhbCA9IChGSVhQX1NHTCkwOwogCi0gIGZvcihpPWxlbjtpIT0wO2ktLSl7CisgIGZvciAoaSA9IGxlbjsgaSAhPSAwOyBpLS0pIHsKICAgICB0ZW1wID0gKFNIT1JUKSgqdmVjdG9yKyspOwotICAgIG1heFZhbCB8PSAodGVtcF4odGVtcD4+KEZSQUNUX0JJVFMtMSkpKTsKKyAgICBtYXhWYWwgfD0gKHRlbXAgXiAodGVtcCA+PiAoRlJBQ1RfQklUUyAtIDEpKSk7CiAgIH0KIAotICByZXR1cm4gZml4bWF4X0koKElOVCkwLChJTlQpKGZpeG5vcm16X0QoRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpbWF4VmFsKSkgLSAxKSk7CisgIHJldHVybiBmaXhtYXhfSSgoSU5UKTAsIChJTlQpKGZpeG5vcm16X1MoKEZJWFBfU0dMKW1heFZhbCkpIC0gMSk7CiB9CiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL2luY2x1ZGUvbXBlZ0ZpbGVSZWFkLmggYi9saWJNcGVnVFBEZWMvaW5jbHVkZS9tcGVnRmlsZVJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiZmI1OC4uMDAwMDAwMAotLS0gYS9saWJNcGVnVFBEZWMvaW5jbHVkZS9tcGVnRmlsZVJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCi0gICBEZXNjcmlwdGlvbjogQml0c3RyZWFtIGRhdGEgcHJvdmlkZXIgZm9yIE1QNCBkZWNvZGVycwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKLSNpbmNsdWRlICJGREtfYXVkaW8uaCIKLQotI2RlZmluZSBNUEZSRUFEX01QNEZGX0RJU0FCTEUKLQotI2lmbmRlZiBNUEZSRUFEX01QNEZGX0RJU0FCTEUKLSAgLyohPCBJZiBNUEZSRUFEX01QNEZGX0VOQUJMRSBpcyBzZXQsIGluY2x1ZGUgc3VwcG9ydCBmb3IgTVBFRyBJU08gZmlsZWZvcm1hdC4KLSAgICAgICBJZiBub3Qgc2V0LCBubyAubXA0LCAubTRhIGFuZCAuM2dwIGZpbGVzIGNhbiBiZSB1c2VkIGZvciBpbnB1dC4gKi8KLSAgI2RlZmluZSBNUEZSRUFEX01QNEZGX0VOQUJMRQotI2VuZGlmCi0KLS8qIG1heGltdW0gbnVtYmVyIG9mIGxheWVycyB3aGljaCBjYW4gYmUgcmVhZCAgICAgICAgKi8KLS8qIHNoYWxsIGVxdWFsIG1heCBudW1iZXIgb2YgbGF5ZXJzIHJlYWQgYnkgaWlzaXNvZmYgKi8KLSNkZWZpbmUgRklMRVJFQURfTUFYX0xBWUVSUyAoMikKLQotdHlwZWRlZiBzdHJ1Y3QgU1RSVUNUX0ZJTEVSRUFEICpIQU5ETEVfRklMRVJFQUQ7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiBcYnJpZWYgICAgICAgICAgIE9wZW4gYW4gTVBFRyBhdWRpbyBmaWxlIGFuZCB0cnkgdG8gZGV0ZWN0IGl0cyBmb3JtYXQuCi0gKiBccGFyYW0gZmlsZW5hbWUgIFN0cmluZyBvZiB0aGUgZmlsZW5hbWUgdG8gYmUgb3BlbmVkLgotICogXHBhcmFtIGZpbGVGb3JtYXQgU2tpcCBmaWxlIGZvcm1hdCBkZXRlY3Rpb24gYW5kIHVzZSBnaXZlbiBmb3JtYXQgaWYgZmlsZUZvcm1hdCAhPSBGRl9VTktOT1dOLgotICAgICAgICAgICAgICAgICAgICBFbHNlIHN0b3JlIGRldGVjdGVkIGZvcm1hdCBpbnRvICpmaWxlRm10LgotICogXHBhcmFtIHRyYW5zcG9ydFR5cGUgU2tpcCB0cmFuc3BvcnQgdHlwZSBkZXRlY3Rpb24gYW5kIHVzZSBnaXZlbiBmb3JtYXQgaWYgdHJhbnNwb3J0VHlwZSAhPSBUVF9VTktOT1dOLgotICAgICAgICAgICAgICAgICAgICBFbHNlIHN0b3JlIGRldGVjdGVkIGZvcm1hdCBpbnRvICpmaWxlRm10LgotICogXHBhcmFtIGNvbmYgICAgICBQb2ludGVyIHRvIHVuc2lnbmVkIGNoYXIgdG8gaG9sZCB0aGUgQXVkaW9TcGVjaWZpY0NvbmZpZyBvZiB0aGUgaW5wdXQgZmlsZSwgaWYKLSAgICAgICAgICAgICAgICAgICAgYW55IChNUEVHIDQgZmlsZSBmb3JtYXQpLiBJbiBjYXNlIG9mIFJBVyBMQVRNIGl0IGhvbGRzIHRoZSBTdHJlYW1NdXhDb25maWcuCi0gKiBccGFyYW0gY29uZlNpemUgIFBvaW50ZXIgdG8gYW4gaW50ZWdlciwgd2hlcmUgdGhlIGxlbmd0aCBvZiB0aGUgQVNDIG9yIFNNQyAoaW4gY2FzZSBvZiBSQVcgTEFUTSkKLSAgICAgICAgICAgICAgICAgICAgaXMgc3RvcmVkIHRvLgotICogXHJldHVybiAgICAgICAgICBNUEVHIGZpbGUgcmVhZCBoYW5kbGUuCi0gKi8KLUhBTkRMRV9GSUxFUkVBRCBtcGVnRmlsZVJlYWRfT3BlbiggY29uc3QgY2hhciAgICAgKmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0ZPUk1BVCAgICAgZmlsZUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1RZUEUgIHRyYW5zcG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICpjb25mW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICBjb25mU2l6ZVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqbm9PZkxheWVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBcYnJpZWYgICAgICAgICAgIEdldCB0aGUgZmlsZSBmb3JtYXQgb2YgdGhlIGlucHV0IGZpbGUuCi0gKiBccGFyYW0gaERhdGFTcmMgIE1QRUcgZmlsZSByZWFkIGhhbmRsZS4KLSAqIFxyZXR1cm4gICAgICAgICAgRmlsZSBmb3JtYXQgb2YgdGhlIGlucHV0IGZpbGUuCi0gKi8KLUZJTEVfRk9STUFUIG1wZWdGaWxlUmVhZF9HZXRGaWxlRm9ybWF0KEhBTkRMRV9GSUxFUkVBRCBoRGF0YVNyYyk7Ci0KLS8qKgotICogXGJyaWVmICAgICAgICAgICBHZXQgdGhlIHRyYW5zcG9ydCB0eXBlIG9mIHRoZSBpbnB1dCBmaWxlLgotICogXHBhcmFtIGhEYXRhU3JjICBNUEVHIGZpbGUgcmVhZCBoYW5kbGUuCi0gKiBccmV0dXJuICAgICAgICAgIFRyYW5zcG9ydCB0eXBlIG9mIHRoZSBpbnB1dCBmaWxlLgotICovCi1UUkFOU1BPUlRfVFlQRSBtcGVnRmlsZVJlYWRfR2V0VHJhbnNwb3J0VHlwZShIQU5ETEVfRklMRVJFQUQgaERhdGFTcmMpOwotCi0vKioKLSAqIFxicmllZiBSZWFkIGRhdGEgZnJvbSBNUEVHIGZpbGUuIEluIGNhc2Ugb2YgcGFja2V0IGZpbGUsIHJlYWQgb25lIHBhY2tldCwgaW4gY2FzZQotICogICAgICAgIG9mIHN0cmVhbWluZyBmaWxlIHdpdGggZW1iZWRkZWQgc3luY2hyb25pc2F0aW9uIGxheWVyIChMT0FTL0FEVFMuLi4pLCBqdXN0Ci0gKiAgICAgICAgZmlsbCB0aGUgYnVmZmVyLgotICoKLSAqIFxwYXJhbSBoTXBlZ0ZpbGUgICBNUEVHIGZpbGUgcmVhZCBoYW5kbGUuCi0gKiBccGFyYW0gaW5CdWZmZXIgICAgUG9pbnRlciB0byBpbnB1dCBidWZmZXIuCi0gKiBccGFyYW0gYnVmZmVyU2l6ZSAgU2l6ZSBvZiBpbnB1dCBidWZmZXIuCi0gKiBccGFyYW0gYnl0ZXNWYWxpZCAgTnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2VyZSByZWFkLgotICogXHJldHVybiAgICAgICAgICAgIDAgb24gc3VjY2VzcywgLTEgaWYgdW5zdXBwb3J0ZWQgZmlsZSBmb3JtYXQgb3IgZmlsZSByZWFkIGVycm9yLgotICovCi1pbnQgbXBlZ0ZpbGVSZWFkX1JlYWQoIEhBTkRMRV9GSUxFUkVBRCAgIGhNcGVnRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAqaW5CdWZmZXJbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAqYnl0ZXNWYWxpZAotICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBcYnJpZWYgICAgICAgICAgICBTZWVrIGluIGZpbGUgZnJvbSBvcmlnaW4gYnkgZ2l2ZW4gb2Zmc2V0IGluIGZyYW1lcy4KLSAqIFxwYXJhbSBoTXBlZ0ZpbGUgIE1QRUcgZmlsZSByZWFkIGhhbmRsZS4KLSAqIFxwYXJhbSBvcmlnaW4gICAgIElmIDAsIHRoZSBvcmlnaW4gaXMgdGhlIGZpbGUgYmVnaW5uaW5nIChhYnNvbHV0ZSBzZWVrKS4KLSAqICAgICAgICAgICAgICAgICAgIElmIDEsIHRoZSBvcmlnaW4gaXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gKHJlbGF0aXZlIHNlZWspLgotICogXHBhcmFtIG9mZnNldCAgICAgVGhlIGFtb3VudCBvZiBmcmFtZXMgdG8gc2VlayBmcm9tIHRoZSBnaXZlbiBvcmlnaW4uCi0gKiBccmV0dXJuICAgICAgICAgICAwIG9uIHN1Y2VzcywgLTEgaWYgb2Zmc2V0IDwgMCBvciBmaWxlIHJlYWQgZXJyb3IuCi0gKi8KLWludCBtcGVnRmlsZVJlYWRfc2VlayggSEFORExFX0ZJTEVSRUFEICAgaE1wZWdGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICBvcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIG9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogXGJyaWVmICAgICAgICAgICAgR2V0IGZpbGUgcG9zaXRpb24gaW4gcGVyY2VudC4KLSAqIFxwYXJhbSBoTXBlZ0ZpbGUgIE1QRUcgZmlsZSByZWFkIGhhbmRsZS4KLSAqIFxyZXR1cm4gICAgICAgICAgIEZpbGUgcG9zaXRpb24gaW4gcGVyY2VudC4KLSAqLwotaW50IG1wZWdGaWxlUmVhZF9nZXRQZXJjZW50KEhBTkRMRV9GSUxFUkVBRCBoTXBlZ0ZpbGUpOwotCi0KLS8qKgotICogXGJyaWVmICAgICAgICAgICBDbG9zZSBNUEVHIGF1ZGlvIGZpbGUuCi0gKiBccGFyYW0gaE1wZWdGaWxlIE1wZWcgZmlsZSByZWFkIGhhbmRsZS4KLSAqIFxyZXR1cm4gICAgICAgICAgMCBvbiBzdWNlc3MuCi0gKi8KLWludCBtcGVnRmlsZVJlYWRfQ2xvc2UoSEFORExFX0ZJTEVSRUFEICpoTXBlZ0ZpbGUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL2luY2x1ZGUvdHBfZGF0YS5oIGIvbGliTXBlZ1RQRGVjL2luY2x1ZGUvdHBfZGF0YS5oCmluZGV4IGM2ZTg5YjUuLmI0YWI4MDIgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9pbmNsdWRlL3RwX2RhdGEuaAorKysgYi9saWJNcGVnVFBEZWMvaW5jbHVkZS90cF9kYXRhLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTcgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6IE1hbnVlbCBKYW5kZXIKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKICAgIERlc2NyaXB0aW9uOiBNUEVHIFRyYW5zcG9ydCBkYXRhIHRhYmxlcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fVFBfREFUQV9IX18KLSNkZWZpbmUgX19UUF9EQVRBX0hfXworI2lmbmRlZiBUUF9EQVRBX0gKKyNkZWZpbmUgVFBfREFUQV9ICiAKICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKICNpbmNsdWRlICJGREtfYXVkaW8uaCIKQEAgLTk4LDE3ICsxMTAsMzUgQEAKIC8qCiAgKiBDb25maWd1cmF0aW9uCiAgKi8KLSNkZWZpbmUgVFBfR0FfRU5BQkxFCi0vKiAjZGVmaW5lIFRQX0NFTFBfRU5BQkxFICovCi0vKiAjZGVmaW5lIFRQX0hWWENfRU5BQkxFICovCi0vKiAjZGVmaW5lIFRQX1NMU19FTkFCTEUgKi8KLSNkZWZpbmUgVFBfRUxEX0VOQUJMRQotLyogI2RlZmluZSBUUF9VU0FDX0VOQUJMRSAqLwotLyogI2RlZmluZSBUUF9SU1ZENTBfRU5BQkxFICovCiAKLSNpZiBkZWZpbmVkKFRQX0dBX0VOQUJMRSkgfHwgZGVmaW5lZChUUF9TTFNfRU5BQkxFKQotI2RlZmluZSBUUF9QQ0VfRU5BQkxFICAgICAgIC8qKjwgRW5hYmxlIGZ1bGwgUENFIHN1cHBvcnQgKi8KLSNlbmRpZgorI2RlZmluZSBUUF9VU0FDX01BWF9TUEVBS0VSUyAoMjQpCisKKyNkZWZpbmUgVFBfVVNBQ19NQVhfRVhUX0VMRU1FTlRTICgoMjQpKQorCisjZGVmaW5lIFRQX1VTQUNfTUFYX0VMRU1FTlRTICgoMjQpICsgVFBfVVNBQ19NQVhfRVhUX0VMRU1FTlRTKQorCisjZGVmaW5lIFRQX1VTQUNfTUFYX0NPTkZJR19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgNTEyIC8qIG5leHQgcG93ZXIgb2YgdHdvIG9mIG1heGltdW0gb2YgZXNjYXBlZFZhbHVlKGhCcywgNCwgNCwgOCkgaW4gXAorICAgICAgICAgQXVkaW9QcmVSb2xsKCkgKDI4NSkgKi8KKworI2RlZmluZSBUUERFQ19VU0FDX05VTV9DT05GSUdfQ0hBTkdFX0ZSQU1FUyBcCisgICgxKSAvKiBOdW1iZXIgb2YgZnJhbWVzIGZvciBjb25maWcgY2hhbmdlIGluIFVTQUMgKi8KKworZW51bSB7CisgIFRQREVDX0ZMVVNIX09GRiA9IDAsCisgIFRQREVDX1JTVjYwX0NGR19DSEFOR0VfQVRTQ19GTFVTSF9PTiA9IDEsCisgIFRQREVDX1JTVjYwX0RBU0hfSVBGX0FUU0NfRkxVU0hfT04gPSAyLAorICBUUERFQ19VU0FDX0RBU0hfSVBGX0ZMVVNIX09OID0gMworfTsKKworZW51bSB7CisgIFRQREVDX0JVSUxEX1VQX09GRiA9IDAsCisgIFRQREVDX1JTVjYwX0JVSUxEX1VQX09OID0gMSwKKyAgVFBERUNfUlNWNjBfQlVJTERfVVBfT05fSU5fQkFORCA9IDIsCisgIFRQREVDX1VTQUNfQlVJTERfVVBfT04gPSAzLAorICBUUERFQ19SU1Y2MF9CVUlMRF9VUF9JRExFID0gNCwKKyAgVFBERUNfUlNWNjBfQlVJTERfVVBfSURMRV9JTl9CQU5EID0gNQorfTsKIAogLyoqCiAgKiBQcm9ncmFtQ29uZmlnIHN0cnVjdC4KQEAgLTExNiwxMyArMTQ2LDEyIEBACiAvKiBJU08vSUVDIDE0NDk2LTMgNC40LjEuMSBUYWJsZSA0LjIgUHJvZ3JhbSBjb25maWcgZWxlbWVudCAqLwogI2RlZmluZSBQQ19GU0JfQ0hBTk5FTFNfTUFYIDE2IC8qIEZyb250L1NpZGUvQmFjayBjaGFubmVscyAqLwogI2RlZmluZSBQQ19MRkVfQ0hBTk5FTFNfTUFYIDQKLSNkZWZpbmUgUENfQVNTT0NEQVRBX01BWCAgICA4Ci0jZGVmaW5lIFBDX0NDRUxfTUFYICAgICAgICAgMTYgLyogQ0MgZWxlbWVudHMgKi8KLSNkZWZpbmUgUENfQ09NTUVOVExFTkdUSCAgICAyNTYKKyNkZWZpbmUgUENfQVNTT0NEQVRBX01BWCA4CisjZGVmaW5lIFBDX0NDRUxfTUFYIDE2IC8qIENDIGVsZW1lbnRzICovCisjZGVmaW5lIFBDX0NPTU1FTlRMRU5HVEggMjU2CisjZGVmaW5lIFBDX05VTV9IRUlHSFRfTEFZRVIgMwogCi10eXBlZGVmIHN0cnVjdAotewotI2lmZGVmIFRQX1BDRV9FTkFCTEUKK3R5cGVkZWYgc3RydWN0IHsKICAgLyogUENFIGJpdHN0cmVhbSBlbGVtZW50czogKi8KICAgVUNIQVIgRWxlbWVudEluc3RhbmNlVGFnOwogICBVQ0hBUiBQcm9maWxlOwpAQCAtMTY1LDU0ICsxOTQsNTAgQEAKIAogICBVQ0hBUiBDb21tZW50RmllbGRCeXRlczsKICAgVUNIQVIgQ29tbWVudFtQQ19DT01NRU5UTEVOR1RIXTsKLSNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCiAKICAgLyogSGVscGVyIHZhcmlhYmxlcyBmb3IgYWRtaW5pc3RyYXRpb246ICovCi0gIFVDSEFSIGlzVmFsaWQ7ICAgICAgICAgICAgICAgLyohPCBGbGFnIHNob3dpbmcgaWYgUENFIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LiAqLwotICBVQ0hBUiBOdW1DaGFubmVsczsgICAgICAgICAgIC8qITwgQW1vdW50IG9mIGF1ZGlvIGNoYW5uZWxzIHN1bW1pbmcgYWxsIGNoYW5uZWwgZWxlbWVudHMgaW5jbHVkaW5nIExGRXMgKi8KLSAgVUNIQVIgTnVtRWZmZWN0aXZlQ2hhbm5lbHM7ICAvKiE8IEFtb3VudCBvZiBhdWRpbyBjaGFubmVscyBzdW1taW5nIG9ubHkgU0NFcyBhbmQgQ1BFcyAqLworICBVQ0hBUiBpc1ZhbGlkOyAvKiE8IEZsYWcgc2hvd2luZyBpZiBQQ0UgaGFzIGJlZW4gcmVhZCBzdWNjZXNzZnVsbHkuICovCisgIFVDSEFSCisgIE51bUNoYW5uZWxzOyAvKiE8IEFtb3VudCBvZiBhdWRpbyBjaGFubmVscyBzdW1taW5nIGFsbCBjaGFubmVsIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgTEZFcyAqLworICBVQ0hBUiBOdW1FZmZlY3RpdmVDaGFubmVsczsgLyohPCBBbW91bnQgb2YgYXVkaW8gY2hhbm5lbHMgc3VtbWluZyBvbmx5IFNDRXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBDUEVzICovCiAgIFVDSEFSIGVsQ291bnRlcjsKIAogfSBDUHJvZ3JhbUNvbmZpZzsKIAogdHlwZWRlZiBlbnVtIHsKICAgQVNDRVhUX1VOS09XTiA9IC0xLAotICBBU0NFWFRfU0JSICAgID0gMHgyYjcsCi0gIEFTQ0VYVF9QUyAgICAgPSAweDU0OCwKLSAgQVNDRVhUX01QUyAgICA9IDB4NzZhLAotICBBU0NFWFRfU0FPQyAgID0gMHg3Y2IsCi0gIEFTQ0VYVF9MRE1QUyAgPSAweDdjYworICBBU0NFWFRfU0JSID0gMHgyYjcsCisgIEFTQ0VYVF9QUyA9IDB4NTQ4LAorICBBU0NFWFRfTVBTID0gMHg3NmEsCisgIEFTQ0VYVF9TQU9DID0gMHg3Y2IsCisgIEFTQ0VYVF9MRE1QUyA9IDB4N2NjCiAKIH0gVFBfQVNDX0VYVEVOU0lPTl9JRDsKIAotI2lmZGVmIFRQX0dBX0VOQUJMRQogLyoqCiAgKiBHYVNwZWNpZmljQ29uZmlnIHN0cnVjdAogICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIFVJTlQgbV9mcmFtZUxlbmd0aEZsYWcgOwotICBVSU5UIG1fZGVwZW5kc09uQ29yZUNvZGVyIDsKLSAgVUlOVCBtX2NvcmVDb2RlckRlbGF5IDsKKyAgVUlOVCBtX2ZyYW1lTGVuZ3RoRmxhZzsKKyAgVUlOVCBtX2RlcGVuZHNPbkNvcmVDb2RlcjsKKyAgVUlOVCBtX2NvcmVDb2RlckRlbGF5OwogCi0gIFVJTlQgbV9leHRlbnNpb25GbGFnIDsKLSAgVUlOVCBtX2V4dGVuc2lvbkZsYWczIDsKKyAgVUlOVCBtX2V4dGVuc2lvbkZsYWc7CisgIFVJTlQgbV9leHRlbnNpb25GbGFnMzsKIAogICBVSU5UIG1fbGF5ZXI7CiAgIFVJTlQgbV9udW1PZlN1YkZyYW1lOwogICBVSU5UIG1fbGF5ZXJMZW5ndGg7CiAKIH0gQ1NHYVNwZWNpZmljQ29uZmlnOwotI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLwotCi0KLQotCi0jaWZkZWYgVFBfRUxEX0VOQUJMRQogCiB0eXBlZGVmIGVudW0gewotICBFTERFWFRfVEVSTSAgPSAweDAsICAgLyogVGVybWluYXRpb24gdGFnICovCi0gIEVMREVYVF9TQU9DICA9IDB4MSwgICAvKiBTQU9DIGNvbmZpZyAqLwotICBFTERFWFRfTERTQUMgPSAweDIgICAgLyogTEQgTVBFRyBTdXJyb3VuZCBjb25maWcgKi8KKyAgRUxERVhUX1RFUk0gPSAweDAsICAgICAgICAgLyogVGVybWluYXRpb24gdGFnICovCisgIEVMREVYVF9TQU9DID0gMHgxLCAgICAgICAgIC8qIFNBT0MgY29uZmlnICovCisgIEVMREVYVF9MRFNBQyA9IDB4MiwgICAgICAgIC8qIExEIE1QRUcgU3Vycm91bmQgY29uZmlnICovCisgIEVMREVYVF9ET1dOU0NBTEVJTkZPID0gMHgzIC8qIEVMRCBzYW1wbGUgcmF0ZSBhZGFwdGF0aW9uICovCiAgIC8qIHJlc2VydmVkICovCiB9IEFTQ19FTERfRVhUX1RZUEU7CiAKQEAgLTIyMCwxMDMgKzI0NSwxODYgQEAKICAgVUNIQVIgbV9mcmFtZUxlbmd0aEZsYWc7CiAKICAgVUNIQVIgbV9zYnJQcmVzZW50RmxhZzsKLSAgVUNIQVIgbV91c2VMZFFtZlRpbWVBbGlnbjsgIC8qIFVzZSBMRC1NUFMgUU1GIGluIFNCUiB0byBhY2hpdmUgdGltZSBhbGlnbm1lbnQgKi8KKyAgVUNIQVIKKyAgbV91c2VMZFFtZlRpbWVBbGlnbjsgLyogVXNlIExELU1QUyBRTUYgaW4gU0JSIHRvIGFjaGl2ZSB0aW1lIGFsaWdubWVudCAqLwogICBVQ0hBUiBtX3NiclNhbXBsaW5nUmF0ZTsKICAgVUNIQVIgbV9zYnJDcmNGbGFnOworICBVSU5UIG1fZG93bnNjYWxlZFNhbXBsaW5nRnJlcXVlbmN5OwogCiB9IENTRWxkU3BlY2lmaWNDb25maWc7Ci0jZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLwogCit0eXBlZGVmIHN0cnVjdCB7CisgIFVTQUNfRVhUX0VMRU1FTlRfVFlQRSB1c2FjRXh0RWxlbWVudFR5cGU7CisgIFVTSE9SVCB1c2FjRXh0RWxlbWVudENvbmZpZ0xlbmd0aDsKKyAgVVNIT1JUIHVzYWNFeHRFbGVtZW50RGVmYXVsdExlbmd0aDsKKyAgVUNIQVIgdXNhY0V4dEVsZW1lbnRQYXlsb2FkRnJhZzsKKyAgVUNIQVIgdXNhY0V4dEVsZW1lbnRIYXNBdWRpb1ByZVJvbGw7Cit9IENTVXNhY0V4dEVsZW1lbnRDb25maWc7CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgTVA0X0VMRU1FTlRfSUQgdXNhY0VsZW1lbnRUeXBlOworICBVQ0hBUiBtX25vaXNlRmlsbGluZzsKKyAgVUNIQVIgbV9oYXJtb25pY1NCUjsKKyAgVUNIQVIgbV9pbnRlclRlczsKKyAgVUNIQVIgbV9wdmM7CisgIFVDSEFSIG1fc3RlcmVvQ29uZmlnSW5kZXg7CisgIENTVXNhY0V4dEVsZW1lbnRDb25maWcgZXh0RWxlbWVudDsKK30gQ1NVc2FjRWxlbWVudENvbmZpZzsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBtX2ZyYW1lTGVuZ3RoRmxhZzsKKyAgVUNIQVIgbV9jb3JlU2JyRnJhbWVMZW5ndGhJbmRleDsKKyAgVUNIQVIgbV9zYnJSYXRpb0luZGV4OworICBVQ0hBUiBtX25Vc2FjQ2hhbm5lbHM7IC8qIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyBzaWduYWxlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzYWNEZWNvZGVyQ29uZmlnKCkgLyByc3Y2MDNkYURlY29kZXJDb25maWcoKSB2aWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1FbGVtZW50cyBhbmQgdXNhY0VsZW1lbnRUeXBlICovCisgIFVDSEFSIG1fY2hhbm5lbENvbmZpZ3VyYXRpb25JbmRleDsKKyAgVUlOVCBtX3VzYWNOdW1FbGVtZW50czsKKyAgQ1NVc2FjRWxlbWVudENvbmZpZyBlbGVtZW50W1RQX1VTQUNfTUFYX0VMRU1FTlRTXTsKKworICBVQ0hBUiBudW1BdWRpb0NoYW5uZWxzOworICBVQ0hBUiBtX3VzYWNDb25maWdFeHRlbnNpb25QcmVzZW50OworICBVQ0hBUiBlbGVtZW50TGVuZ3RoUHJlc2VudDsKKyAgVUNIQVIgVXNhY0NvbmZpZ1tUUF9VU0FDX01BWF9DT05GSUdfTEVOXTsKKyAgVVNIT1JUIFVzYWNDb25maWdCaXRzOworfSBDU1VzYWNDb25maWc7CiAKIC8qKgogICogQXVkaW8gY29uZmlndXJhdGlvbiBzdHJ1Y3QsIHN1aXRhYmxlIGZvciBlbmNvZGVyIGFuZCBkZWNvZGVyIGNvbmZpZ3VyYXRpb24uCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQogICAvKiBYWVogU3BlY2lmaWMgRGF0YSAqLwogICB1bmlvbiB7Ci0jaWZkZWYgVFBfR0FfRU5BQkxFCi0gICAgQ1NHYVNwZWNpZmljQ29uZmlnICAgIG1fZ2FTcGVjaWZpY0NvbmZpZzsgICAgICAgLyoqPCBHZW5lcmFsIGF1ZGlvIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICAgICAgICAgKi8KLSNlbmRpZiAvKiBUUF9HQV9FTkFCTEUgKi8KLSNpZmRlZiBUUF9FTERfRU5BQkxFCi0gICAgQ1NFbGRTcGVjaWZpY0NvbmZpZyAgIG1fZWxkU3BlY2lmaWNDb25maWc7ICAgICAgLyoqPCBFTEQgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAgICAgKi8KLSNlbmRpZiAvKiBUUF9FTERfRU5BQkxFICovCisgICAgQ1NHYVNwZWNpZmljQ29uZmlnCisgICAgICAgIG1fZ2FTcGVjaWZpY0NvbmZpZzsgLyoqPCBHZW5lcmFsIGF1ZGlvIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICovCisgICAgQ1NFbGRTcGVjaWZpY0NvbmZpZyBtX2VsZFNwZWNpZmljQ29uZmlnOyAvKio8IEVMRCBzcGVjaWZpYyBjb25maWd1cmF0aW9uLiAqLworICAgIENTVXNhY0NvbmZpZyBtX3VzYWNDb25maWc7IC8qKjwgVVNBQyBzcGVjaWZpYyBjb25maWd1cmF0aW9uICAgICAgICAgICAgICAgKi8KICAgfSBtX3NjOwotICAKKwogICAvKiBDb21tb24gQVNDIHBhcmFtZXRlcnMgKi8KLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCi0gIENQcm9ncmFtQ29uZmlnICAgICAgICBtX3Byb2dyQ29uZmlnRWxlbWVudDsgICAgIC8qKjwgUHJvZ3JhbSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCisgIENQcm9ncmFtQ29uZmlnIG1fcHJvZ3JDb25maWdFbGVtZW50OyAvKio8IFByb2dyYW0gY29uZmlndXJhdGlvbi4gKi8KIAotICBBVURJT19PQkpFQ1RfVFlQRSAgICAgbV9hb3Q7ICAgICAgICAgICAgICAgICAgICAvKio8IEF1ZGlvIE9iamVjdCBUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFVJTlQgICAgICAgICAgICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5OyAgICAgIC8qKjwgU2FtcGxlcmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVUlOVCAgICAgICAgICAgICAgICAgIG1fc2FtcGxlc1BlckZyYW1lOyAgICAgICAgLyoqPCBBbW91bnQgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuICAgICAgICAgICAgICAgICAgICAqLwotICBVSU5UICAgICAgICAgICAgICAgICAgbV9kaXJlY3RNYXBwaW5nOyAgICAgICAgICAvKio8IERvY3VtZW50IHRoaXMgcGxlYXNlICEhICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFVRElPX09CSkVDVF9UWVBFIG1fYW90OyAgLyoqPCBBdWRpbyBPYmplY3QgVHlwZS4gICovCisgIFVJTlQgbV9zYW1wbGluZ0ZyZXF1ZW5jeTsgLyoqPCBTYW1wbGVyYXRlLiAqLworICBVSU5UIG1fc2FtcGxlc1BlckZyYW1lOyAgIC8qKjwgQW1vdW50IG9mIHNhbXBsZXMgcGVyIGZyYW1lLiAgICovCisgIFVJTlQgbV9kaXJlY3RNYXBwaW5nOyAvKio8IERvY3VtZW50IHRoaXMgcGxlYXNlICEhICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgQVVESU9fT0JKRUNUX1RZUEUgICAgIG1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlOyAgICAgICAgLyoqPCBBdWRpbyBvYmplY3QgdHlwZSAgICAgICAgICAgICAgICAgICAgICAqLwotICBVSU5UICAgICAgICAgICAgICAgICAgbV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeTsgICAgICAvKio8IFNhbXBsZXJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAKKyAgQVVESU9fT0JKRUNUX1RZUEUgbV9leHRlbnNpb25BdWRpb09iamVjdFR5cGU7IC8qKjwgQXVkaW8gb2JqZWN0IHR5cGUgKi8KKyAgVUlOVCBtX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5OyAgICAgICAgICAgIC8qKjwgU2FtcGxlcmF0ZSAgICAgICAgICAgICovCiAKLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fY2hhbm5lbENvbmZpZ3VyYXRpb247ICAgLyoqPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXggICAgICAgICAgICAgICAgICAgICAqLworICBTQ0hBUiBtX2NoYW5uZWxDb25maWd1cmF0aW9uOyAvKio8IENoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCAqLwogCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX2VwQ29uZmlnOyAgICAgICAgICAgICAgIC8qKjwgRXJyb3IgcHJvdGVjdGlvbiBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX3ZjYjExRmxhZzsgICAgICAgICAgICAgIC8qKjwgYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgICAgICovCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX3J2bGNGbGFnOyAgICAgICAgICAgICAgIC8qKjwgYWFjU2NhbGVmYWN0b3JEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICovCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX2hjckZsYWc7ICAgICAgICAgICAgICAgIC8qKjwgYWFjU3BlY3RyYWxEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSIG1fZXBDb25maWc7ICAvKio8IEVycm9yIHByb3RlY3Rpb24gaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTQ0hBUiBtX3ZjYjExRmxhZzsgLyoqPCBhYWNTZWN0aW9uRGF0YVJlc2lsaWVuY2VGbGFnICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0NIQVIgbV9ydmxjRmxhZzsgIC8qKjwgYWFjU2NhbGVmYWN0b3JEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICovCisgIFNDSEFSIG1faGNyRmxhZzsgICAvKio8IGFhY1NwZWN0cmFsRGF0YVJlc2lsaWVuY2VGbGFnICAgICAgICAgICAgICAgICAgICAqLwogCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX3NiclByZXNlbnRGbGFnOyAgICAgICAgIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiBTQlIgZGF0YSBpbiB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgKi8KLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fcHNQcmVzZW50RmxhZzsgICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIHBhcmFtZXRyaWMgc3RlcmVvIGRhdGEgaW4gdGhlIGJpdHN0cmVhbSAqLwotICBVQ0hBUiAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4OyAvKio8IFNhbXBsZXJhdGUgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBVQ0hBUiAgICAgICAgICAgICAgICAgbV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4OyAvKio8IFNhbXBsZXJhdGUgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAqLwotICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9leHRlbnNpb25DaGFubmVsQ29uZmlndXJhdGlvbjsgICAvKio8IENoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCAgICAgICAgICAgICAqLworICBTQ0hBUiBtX3NiclByZXNlbnRGbGFnOyAvKio8IEZsYWcgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YgU0JSIGRhdGEgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbSAgICAgICAgICAgICAgICovCisgIFNDSEFSCisgIG1fcHNQcmVzZW50RmxhZzsgLyoqPCBGbGFnIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIHBhcmFtZXRyaWMgc3RlcmVvCisgICAgICAgICAgICAgICAgICAgICAgZGF0YSBpbiB0aGUgYml0c3RyZWFtICovCisgIFVDSEFSIG1fc2FtcGxpbmdGcmVxdWVuY3lJbmRleDsgICAgICAgICAgLyoqPCBTYW1wbGVyYXRlIGluZGV4ICAgICAgICAgICovCisgIFVDSEFSIG1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3lJbmRleDsgLyoqPCBTYW1wbGVyYXRlIGluZGV4ICovCisgIFNDSEFSIG1fZXh0ZW5zaW9uQ2hhbm5lbENvbmZpZ3VyYXRpb247ICAgLyoqPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXggICAqLworCisgIFVDSEFSCisgIGNvbmZpZ01vZGU7IC8qKjwgVGhlIGZsYWcgaW5kaWNhdGVzIGlmIHRoZSBjYWxsYmFjayBzaGFsbCB3b3JrIGluIG1lbW9yeQorICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uIG1vZGUgb3IgaW4gY29uZmlnIGNoYW5nZSBkZXRlY3Rpb24gbW9kZSAqLworICBVQ0hBUiBBYWNDb25maWdDaGFuZ2VkOyAvKio8IFRoZSBmbGFnIHdpbGwgYmUgc2V0IGlmIGF0IGxlYXN0IG9uZSBhYWMgY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBoYXMgY2hhbmdlZCB0aGF0IHJlcXVpcmVzIGEgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgY2xlYXJlZCAqLworICBVQ0hBUiBTYnJDb25maWdDaGFuZ2VkOyAvKio8IFRoZSBmbGFnIHdpbGwgYmUgc2V0IGlmIGF0IGxlYXN0IG9uZSBzYnIgY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBoYXMgY2hhbmdlZCB0aGF0IHJlcXVpcmVzIGEgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgY2xlYXJlZCAqLworICBVQ0hBUiBTYWNDb25maWdDaGFuZ2VkOyAvKio8IFRoZSBmbGFnIHdpbGwgYmUgc2V0IGlmIGF0IGxlYXN0IG9uZSBzYWMgY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBoYXMgY2hhbmdlZCB0aGF0IHJlcXVpcmVzIGEgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgY2xlYXJlZCAqLworCisgIFVDSEFSCisgIGNvbmZpZ1tUUF9VU0FDX01BWF9DT05GSUdfTEVOXTsgLyoqPCBDb25maWd1cmF0aW9uIHN0b3JlZCBhcyBiaXRzdHJlYW0gKi8KKyAgVUlOVCBjb25maWdCaXRzOyAgICAgICAgICAgICAgICAvKio8IENvbmZpZ3VyYXRpb24gbGVuZ3RoIGluIGJpdHMgKi8KIAogfSBDU0F1ZGlvU3BlY2lmaWNDb25maWc7CiAKLXR5cGVkZWYgSU5UICgqY2JVcGRhdGVDb25maWdfdCkodm9pZCosIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyopOwotdHlwZWRlZiBJTlQgKCpjYlNzY190KSgKLSAgICAgICAgdm9pZCosIEhBTkRMRV9GREtfQklUU1RSRUFNLAotICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ0ZyZXF1ZW5jeSwKLSAgICAgICAgY29uc3QgSU5UIG11eE1vZGUsCi0gICAgICAgIGNvbnN0IElOVCBjb25maWdCeXRlcwotICAgICAgICApOwotdHlwZWRlZiBJTlQgKCpjYlNicl90KSgKLSAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgaEJzLAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUluLAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZU91dCwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAotICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCAgICBlbGVtZW50SUQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgIGVsZW1lbnRJbmRleAotICAgICAgICApOwordHlwZWRlZiBzdHJ1Y3QgeworICBTQ0hBUiBmbHVzaENudDsgICAgICAvKio8IEZsdXNoIGZyYW1lIGNvdW50ZXIgKi8KKyAgVUNIQVIgZmx1c2hTdGF0dXM7ICAgLyoqPCBGbGFnIGluZGljYXRlcyBmbHVzaCBtb2RlOiBvbnxvZmYgKi8KKyAgU0NIQVIgYnVpbGRVcENudDsgICAgLyoqPCBCdWlsZCB1cCBmcmFtZSBjb3VudGVyICovCisgIFVDSEFSIGJ1aWxkVXBTdGF0dXM7IC8qKjwgRmxhZyBpbmRpY2F0ZXMgYnVpbGQgdXAgbW9kZTogb258b2ZmICovCisgIFVDSEFSIGNmZ0NoYW5nZWQ7IC8qKjwgRmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29uZmlnIGNoYW5nZWQgYW5kIHRoZSBkZWNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGFnYWluIHZpYSBjYWxsYmFjay4gTWFrZSBzdXJlCisgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVtb3J5IGlzIGZyZWVkIGJlZm9yZSBpbml0aWFsaXphdGlvbi4gKi8KKyAgVUNIQVIgY29udGVudENoYW5nZWQ7IC8qKjwgRmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29udGVudCBjaGFuZ2VkIGkuZS4gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgdHJ1bmNhdGlvbiBvY2N1cmVkIGJlZm9yZSAqLworICBVQ0hBUiBmb3JjZUNmZ0NoYW5nZTsgLyoqPCBGbGFnIGluZGljYXRlcyBpZiBjb25maWcgY2hhbmdlIGhhcyB0byBiZSBmb3JjZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW4gaWYgbmV3IGNvbmZpZyBpcyB0aGUgc2FtZSAqLworfSBDQ3RybENGR0NoYW5nZTsKIAotdHlwZWRlZiBzdHJ1Y3QgIHsKLSAgY2JVcGRhdGVDb25maWdfdCBjYlVwZGF0ZUNvbmZpZzsgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBDb25maWcgY2hhbmdlIG5vdGlmeSBjYWxsYmFjay4gICovCi0gIHZvaWQgKmNiVXBkYXRlQ29uZmlnRGF0YTsgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2Ugbm90aWZ5IGNhbGxiYWNrLiAqLwotICBjYlNzY190IGNiU3NjOyAgICAgICAgICAgICAgICAgICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCi0gIHZvaWQgKmNiU3NjRGF0YTsgICAgICAgICAgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCi0gIGNiU2JyX3QgY2JTYnI7ICAgICAgICAgICAgICAgICAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCi0gIHZvaWQgKmNiU2JyRGF0YTsgICAgICAgICAgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIFNCUiBoZWFkZXIgcGFyc2VyIGNhbGxiYWNrLiAqLwordHlwZWRlZiBJTlQgKCpjYlVwZGF0ZUNvbmZpZ190KSh2b2lkICosIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBjb25maWdNb2RlLCBVQ0hBUiAqY29uZmlnQ2hhbmdlZCk7Cit0eXBlZGVmIElOVCAoKmNiRnJlZU1lbV90KSh2b2lkICosIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqKTsKK3R5cGVkZWYgSU5UICgqY2JDdHJsQ0ZHQ2hhbmdlX3QpKHZvaWQgKiwgY29uc3QgQ0N0cmxDRkdDaGFuZ2UgKik7Cit0eXBlZGVmIElOVCAoKmNiU3NjX3QpKHZvaWQgKiwgSEFORExFX0ZES19CSVRTVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwgY29uc3QgSU5UIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY29yZVNickZyYW1lTGVuZ3RoSW5kZXgsIGNvbnN0IElOVCBjb25maWdCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY29uZmlnTW9kZSwgVUNIQVIgKmNvbmZpZ0NoYW5nZWQpOworCit0eXBlZGVmIElOVCAoKmNiU2JyX3QpKHZvaWQgKnNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVJbiwgY29uc3QgSU5UIHNhbXBsZVJhdGVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxlbWVudElELCBjb25zdCBJTlQgZWxlbWVudEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBoYXJtb25pY1NiciwgY29uc3QgVUNIQVIgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZG93bnNjYWxlRmFjdG9yKTsKKwordHlwZWRlZiBJTlQgKCpjYlVzYWNfdCkodm9pZCAqc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKTsKKwordHlwZWRlZiBJTlQgKCpjYlVuaURyY190KSh2b2lkICpzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBmdWxsUGF5bG9hZExlbmd0aCwgY29uc3QgSU5UIHBheWxvYWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3ViU3RyZWFtSW5kZXgsIGNvbnN0IElOVCBwYXlsb2FkU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjYlVwZGF0ZUNvbmZpZ190IGNiVXBkYXRlQ29uZmlnOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5IGNhbGxiYWNrLiAgKi8KKyAgdm9pZCAqY2JVcGRhdGVDb25maWdEYXRhOyAvKiE8IFVzZXIgZGF0YSBwb2ludGVyIGZvciBDb25maWcgY2hhbmdlIG5vdGlmeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLiAqLworICBjYkZyZWVNZW1fdCBjYkZyZWVNZW07ICAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgZnJlZSBtZW1vcnkgY2FsbGJhY2suICAqLworICB2b2lkICpjYkZyZWVNZW1EYXRhOyAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIGZyZWUgbWVtb3J5IGNhbGxiYWNrLiAqLworICBjYkN0cmxDRkdDaGFuZ2VfdCBjYkN0cmxDRkdDaGFuZ2U7IC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgY29uZmlnIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgY2FsbGJhY2suICovCisgIHZvaWQgKmNiQ3RybENGR0NoYW5nZURhdGE7IC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIGNvbmZpZyBjaGFuZ2UgY29udHJvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay4gKi8KKyAgY2JTc2NfdCBjYlNzYzsgICAgICAgICAgICAgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBTU0MgcGFyc2VyIGNhbGxiYWNrLiAqLworICB2b2lkICpjYlNzY0RhdGE7ICAgICAgICAgICAvKiE8IFVzZXIgZGF0YSBwb2ludGVyIGZvciBTU0MgcGFyc2VyIGNhbGxiYWNrLiAqLworICBjYlNicl90IGNiU2JyOyAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCisgIHZvaWQgKmNiU2JyRGF0YTsgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCisgIGNiVXNhY190IGNiVXNhYzsKKyAgdm9pZCAqY2JVc2FjRGF0YTsKKyAgY2JVbmlEcmNfdCBjYlVuaURyYzsgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciB1bmlEcmNDb25maWcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdWRuZXNzSW5mb1NldCBwYXJzZXIgY2FsbGJhY2suICovCisgIHZvaWQgKmNiVW5pRHJjRGF0YTsgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIHVuaURyY0NvbmZpZyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG91ZG5lc3NJbmZvU2V0IHBhcnNlciBjYWxsYmFjay4gKi8KIH0gQ1NUcENhbGxCYWNrczsKIAotc3RhdGljIGNvbnN0IFVJTlQgU2FtcGxpbmdSYXRlVGFibGVbXSA9IAoteyA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAsIDAsIDAsCi0gIDAKLX07CitzdGF0aWMgY29uc3QgVUlOVCBTYW1wbGluZ1JhdGVUYWJsZVtdID0geworICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwKKyAgICA4MDAwLCAgNzM1MCwgIDAsICAgICAwLCAgICAgNTc2MDAsIDUxMjAwLCA0MDAwMCwgMzg0MDAsIDM0MTUwLCAyODgwMCwgMjU2MDAsCisgICAgMjAwMDAsIDE5MjAwLCAxNzA3NSwgMTQ0MDAsIDEyODAwLCA5NjAwLCAgMCwgICAgIDAsICAgICAwLCAgICAgMH07CiAKLXN0YXRpYyBpbmxpbmUKLWludCBnZXRTYW1wbGluZ1JhdGVJbmRleCggVUlOVCBzYW1wbGluZ1JhdGUgKQotewotICBVSU5UIHNmX2luZGV4LCB0YWJsZVNpemU9c2l6ZW9mKFNhbXBsaW5nUmF0ZVRhYmxlKS9zaXplb2YoVUlOVCk7CitzdGF0aWMgaW5saW5lIGludCBnZXRTYW1wbGluZ1JhdGVJbmRleChVSU5UIHNhbXBsaW5nUmF0ZSwgVUlOVCBuQml0cykgeworICBVSU5UIHNmX2luZGV4OworICBVSU5UIHRhYmxlU2l6ZSA9ICgxIDw8IG5CaXRzKSAtIDE7CiAKLSAgZm9yIChzZl9pbmRleD0wOyBzZl9pbmRleDx0YWJsZVNpemU7IHNmX2luZGV4KyspIHsKLSAgICBpZiggU2FtcGxpbmdSYXRlVGFibGVbc2ZfaW5kZXhdID09IHNhbXBsaW5nUmF0ZSApIGJyZWFrOworICBmb3IgKHNmX2luZGV4ID0gMDsgc2ZfaW5kZXggPCB0YWJsZVNpemU7IHNmX2luZGV4KyspIHsKKyAgICBpZiAoU2FtcGxpbmdSYXRlVGFibGVbc2ZfaW5kZXhdID09IHNhbXBsaW5nUmF0ZSkgYnJlYWs7CiAgIH0KIAotICBpZiAoc2ZfaW5kZXg+dGFibGVTaXplLTEpIHsKLSAgICByZXR1cm4gdGFibGVTaXplLTE7CisgIGlmIChzZl9pbmRleCA+IHRhYmxlU2l6ZSkgeworICAgIHJldHVybiB0YWJsZVNpemUgLSAxOwogICB9CiAKICAgcmV0dXJuIHNmX2luZGV4OwpAQCAtMzI1LDI2ICs0MzMsMzMgQEAKIC8qCiAgKiBHZXQgQ2hhbm5lbCBjb3VudCBmcm9tIGNoYW5uZWwgY29uZmlndXJhdGlvbgogICovCi1zdGF0aWMgaW5saW5lIGludCBnZXROdW1iZXJPZlRvdGFsQ2hhbm5lbHMoaW50IGNoYW5uZWxDb25maWcpCi17CitzdGF0aWMgaW5saW5lIGludCBnZXROdW1iZXJPZlRvdGFsQ2hhbm5lbHMoaW50IGNoYW5uZWxDb25maWcpIHsKICAgc3dpdGNoIChjaGFubmVsQ29uZmlnKSB7Ci0gIGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6Ci0gIGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6Ci0gICAgcmV0dXJuIGNoYW5uZWxDb25maWc7Ci0gIGNhc2UgNzogY2FzZSAxMjogY2FzZSAxNDoKLSAgICByZXR1cm4gODsKLSAgY2FzZSAxMToKLSAgICByZXR1cm4gNzsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gMDsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgIGNhc2UgMzoKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA1OgorICAgIGNhc2UgNjoKKyAgICAgIHJldHVybiBjaGFubmVsQ29uZmlnOworICAgIGNhc2UgNzoKKyAgICBjYXNlIDEyOgorICAgIGNhc2UgMTQ6CisgICAgICByZXR1cm4gODsKKyAgICBjYXNlIDExOgorICAgICAgcmV0dXJuIDc7CisgICAgY2FzZSAxMzoKKyAgICAgIHJldHVybiAyNDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CiAgIH0KIH0KIAotc3RhdGljIGlubGluZQotaW50IGdldE51bWJlck9mRWZmZWN0aXZlQ2hhbm5lbHMoY29uc3QgaW50IGNoYW5uZWxDb25maWcpCi17ICAgICAgICAvKiBpbmRleDogMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSAqLwotICBjb25zdCBpbnQgbltdID0gezAsMSwyLDMsNCw1LDUsNywwLDAsIDAsIDYsIDcsIDAsIDcsIDB9Oworc3RhdGljIGlubGluZSBpbnQgZ2V0TnVtYmVyT2ZFZmZlY3RpdmVDaGFubmVscygKKyAgICBjb25zdCBpbnQKKyAgICAgICAgY2hhbm5lbENvbmZpZykgeyAvKiBpbmRleDogMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSAqLworICBjb25zdCBpbnQgbltdID0gezAsIDEsIDIsIDMsIDQsIDUsIDUsIDcsIDAsIDAsIDAsIDYsIDcsIDIyLCA3LCAwfTsKICAgcmV0dXJuIG5bY2hhbm5lbENvbmZpZ107CiB9CiAKLSNlbmRpZiAvKiBfX1RQX0RBVEFfSF9fICovCisjZW5kaWYgLyogVFBfREFUQV9IICovCmRpZmYgLS1naXQgYS9saWJNcGVnVFBEZWMvaW5jbHVkZS90cGRlY19saWIuaCBiL2xpYk1wZWdUUERlYy9pbmNsdWRlL3RwZGVjX2xpYi5oCmluZGV4IDJhZDM5N2QuLjMwZTUzYzEgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9pbmNsdWRlL3RwZGVjX2xpYi5oCisrKyBiL2xpYk1wZWdUUERlYy9pbmNsdWRlL3RwZGVjX2xpYi5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDExNCArOTAsMTE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgVHJhbnNwb3J0IERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6IE1hbnVlbCBKYW5kZXIKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKICAgIERlc2NyaXB0aW9uOiBNUEVHIFRyYW5zcG9ydCBkZWNvZGVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX19UUERFQ19MSUJfSF9fCi0jZGVmaW5lIF9fVFBERUNfTElCX0hfXworI2lmbmRlZiBUUERFQ19MSUJfSAorI2RlZmluZSBUUERFQ19MSUJfSAogCiAjaW5jbHVkZSAidHBfZGF0YS5oIgogCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCi0jZGVmaW5lIFRSQU5TUE9SVERFQ19JTkJVRl9TSVpFICAoIDgxOTIgKSAgIC8qITwgU2l6ZSBpcyBpbiBieXRlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIHRyYW5zcG9ydCBpbnB1dCBidWZmZXIgc2l6ZSBjYXJlZnVsbHkgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzdXJlIHRoYXQgaXQgZnVsZmlsbHMgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgdHJhbnNwb3J0IGZvcm1hdChzKS4gICAgICAgICAgICAgICAgICAgICovCi0KIHR5cGVkZWYgZW51bSB7Ci0gIFRSQU5TUE9SVERFQ19PSyA9IDAsICAgICAgICAgICAgIC8qITwgQWxsIGZpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRERUNfT0sgPSAwLCAvKiE8IEFsbCBmaW5lLiAqLwogCiAgIC8qIFN5bmNocm9uaXphdGlvbiBlcnJvcnMuIFdhaXQgZm9yIG5ldyBpbnB1dCBkYXRhIGFuZCB0cnkgYWdhaW4uICovCi0gIHRwZGVjX3N5bmNfZXJyb3Jfc3RhcnQgICA9IDB4MTAwLAotICBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTLCAgICAvKiE8IE91dCBvZiBiaXRzLiBQcm92aWRlIG1vcmUgYml0cyBhbmQgdHJ5IGFnYWluLiAgICAgICAgICAgICAgKi8KLSAgVFJBTlNQT1JUREVDX1NZTkNfRVJST1IsICAgICAgICAgLyohPCBObyBzeW5jIHdhcyBmb3VuZCBvciBzeW5jIGdvdCBsb3N0LiBLZWVwIHRyeWluZy4gICAgICAgICAgICovCisgIHRwZGVjX3N5bmNfZXJyb3Jfc3RhcnQgPSAweDEwMCwKKyAgVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUywgLyohPCBPdXQgb2YgYml0cy4gUHJvdmlkZSBtb3JlIGJpdHMgYW5kIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2Fpbi4gICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SLCAvKiE8IE5vIHN5bmMgd2FzIGZvdW5kIG9yIHN5bmMgZ290IGxvc3QuIEtlZXAgdHJ5aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHRwZGVjX3N5bmNfZXJyb3JfZW5kLAogCiAgIC8qIERlY29kZSBlcnJvcnMuIE1vc3RseSBjYXVzZWQgZHVlIHRvIGJpdCBlcnJvcnMuICovCiAgIHRwZGVjX2RlY29kZV9lcnJvcl9zdGFydCA9IDB4NDAwLAotICBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1IsICAgICAgICAvKiE8IEJpdHN0cmVhbSBkYXRhIHNob3dlZCBpbmNvbnNpc3RlbmNpZXMgKHdyb25nIHN5bnRheCkuICAgICAgKi8KLSAgVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVCwgLyohPCBVbnN1cHBvcnRlZCBmb3JtYXQgb3IgZmVhdHVyZSBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIGRhdGEuICovCi0gIFRSQU5TUE9SVERFQ19DUkNfRVJST1IsICAgICAgICAgIC8qITwgQ1JDIGVycm9yIGVuY291bnRlcmVkIGluIGJpdHN0cmVhbSBkYXRhLiAgICAgICAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1IsIC8qITwgQml0c3RyZWFtIGRhdGEgc2hvd2VkIGluY29uc2lzdGVuY2llcyAod3JvbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXgpLiAgICAgICovCisgIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQsIC8qITwgVW5zdXBwb3J0ZWQgZm9ybWF0IG9yIGZlYXR1cmUgZm91bmQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBkYXRhLiAqLworICBUUkFOU1BPUlRERUNfQ1JDX0VSUk9SLCAvKiE8IENSQyBlcnJvciBlbmNvdW50ZXJlZCBpbiBiaXRzdHJlYW0gZGF0YS4gKi8KICAgdHBkZWNfZGVjb2RlX2Vycm9yX2VuZCwKIAogICAvKiBGYXRhbCBlcnJvcnMuIFN0b3AgaW1tZWRpYXRlbHkgb24gb25lIG9mIHRoZXNlIGVycm9ycyEgKi8KLSAgdHBkZWNfZmF0YWxfZXJyb3Jfc3RhcnQgID0gMHgyMDAsCi0gIFRSQU5TUE9SVERFQ19VTktPV05fRVJST1IsICAgICAgIC8qITwgQW4gdW5rbm93biBlcnJvciBvY2N1cmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBUUkFOU1BPUlRERUNfSU5WQUxJRF9QQVJBTUVURVIsICAvKiE8IEFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQgdG8gYSBmdW5jdGlvbi4gICAgICAgICAgICAgKi8KLSAgVFJBTlNQT1JUREVDX05FRURfVE9fUkVTVEFSVCwgICAgLyohPCBUaGUgZGVjb2RlciBuZWVkcyB0byBiZSByZXN0YXJ0ZWQsIHNpbmNlIHRoZSByZXF1aWVyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGNoYW5nZSBjYW5ub3QgYmUgcGVyZm9ybWVkLiAgICAgICAgICAgICAgICAgICovCisgIHRwZGVjX2ZhdGFsX2Vycm9yX3N0YXJ0ID0gMHgyMDAsCisgIFRSQU5TUE9SVERFQ19VTktPV05fRVJST1IsICAgICAgLyohPCBBbiB1bmtub3duIGVycm9yIG9jY3VyZWQuICAgICAgKi8KKyAgVFJBTlNQT1JUREVDX0lOVkFMSURfUEFSQU1FVEVSLCAvKiE8IEFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQgdG8gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLiAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJULCAgIC8qITwgVGhlIGRlY29kZXIgbmVlZHMgdG8gYmUgcmVzdGFydGVkLCBzaW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXF1aWVyZWQgICBjb25maWd1cmF0aW9uIGNoYW5nZSBjYW5ub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSAgIHBlcmZvcm1lZC4gICAgICAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRERUNfVE9PX01BTllfQklUUywgICAgIC8qITwgSW4gY2FzZSBvZiBwYWNrZXQgYmFzZWQgZm9ybWF0czogU3VwcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgYml0cyAgICAgZXhjZWVkIHRoZSBzaXplIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICAgICBiaXQgYnVmZmVyLiAgICAgICAgICAgICAgICAqLwogICB0cGRlY19mYXRhbF9lcnJvcl9lbmQKIAogfSBUUkFOU1BPUlRERUNfRVJST1I7CiAKLQogLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGRlY29kZSBlcnJvcnMuICovCi0jZGVmaW5lIFRQREVDX0lTX0RFQ09ERV9FUlJPUihlcnIpICggKChlcnI+PXRwZGVjX2RlY29kZV9lcnJvcl9zdGFydCkgJiYgKGVycjw9dHBkZWNfZGVjb2RlX2Vycm9yX2VuZCkpID8gMSA6IDApCisjZGVmaW5lIFRQREVDX0lTX0RFQ09ERV9FUlJPUihlcnIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKGVyciA+PSB0cGRlY19kZWNvZGVfZXJyb3Jfc3RhcnQpICYmIChlcnIgPD0gdHBkZWNfZGVjb2RlX2Vycm9yX2VuZCkpID8gMSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCkKIC8qKiBNYWNybyB0byBpZGVudGlmeSBmYXRhbCBlcnJvcnMuICovCi0jZGVmaW5lIFRQREVDX0lTX0ZBVEFMX0VSUk9SKGVycikgICggKChlcnI+PXRwZGVjX2ZhdGFsX2Vycm9yX3N0YXJ0KSAgJiYgKGVycjw9dHBkZWNfZmF0YWxfZXJyb3JfZW5kKSkgID8gMSA6IDApCi0KKyNkZWZpbmUgVFBERUNfSVNfRkFUQUxfRVJST1IoZXJyKSBcCisgICgoKGVyciA+PSB0cGRlY19mYXRhbF9lcnJvcl9zdGFydCkgJiYgKGVyciA8PSB0cGRlY19mYXRhbF9lcnJvcl9lbmQpKSA/IDEgOiAwKQogCiAvKioKICAqIFxicmllZiBQYXJhbWV0ZXIgaWRlbnRpZmllcnMgZm9yIHRyYW5zcG9ydERlY19TZXRQYXJhbSgpCiAgKi8KIHR5cGVkZWYgZW51bSB7Ci0gIFRQREVDX1BBUkFNX01JTklNSVpFX0RFTEFZID0gMSwgICAgICAgIC8qKiBEZWxheSBtaW5pbWl6YXRpb24gc3RyYXRlZ3kuIDA6IG5vbmUsIDE6IGRpc2NhcmQgYXMgbWFueSBmcmFtZXMgYXMgcG9zc2libGUuICovCi0gIFRQREVDX1BBUkFNX0VBUkxZX0NPTkZJRywgICAgICAgICAgICAgIC8qKiBFbmFibGUgZWFybHkgY29uZmlnIGRpc2NvdmVyeS4gKi8KLSAgVFBERUNfUEFSQU1fSUdOT1JFX0JVRkZFUkZVTExORVNTLCAgICAgLyoqIElnbm9yZSBidWZmZXIgZnVsbG5lc3MuICovCi0gIFRQREVDX1BBUkFNX1NFVF9CSVRSQVRFLCAgICAgICAgICAgICAgIC8qKiBTZXQgYXZlcmFnZSBiaXQgcmF0ZSBmb3IgYml0IHN0cmVhbSBpbnRlcnJ1cHRpb24gZnJhbWUgbWlzc2VzIGVzdGltYXRpb24uICovCi0gIFRQREVDX1BBUkFNX1JFU0VULCAgICAgICAgICAgICAgICAgICAgIC8qKiBSZXNldCB0cmFuc3BvcnQgZGVjb2RlciBpbnN0YW5jZSBzdGF0dXMuICovCi0gIFRQREVDX1BBUkFNX0JVUlNUX1BFUklPRCAgICAgICAgICAgICAgIC8qKiBTZXQgZGF0YSByZWNlcHRpb24gYnVyc3QgcGVyaW9kIGluIG1pbGkgc2Vjb25kcy4gKi8KKyAgVFBERUNfUEFSQU1fTUlOSU1JWkVfREVMQVkgPSAxLCAvKiogRGVsYXkgbWluaW1pemF0aW9uIHN0cmF0ZWd5LiAwOiBub25lLCAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgYXMgbWFueSBmcmFtZXMgYXMgcG9zc2libGUuICovCisgIFRQREVDX1BBUkFNX0VBUkxZX0NPTkZJRywgICAgICAgLyoqIEVuYWJsZSBlYXJseSBjb25maWcgZGlzY292ZXJ5LiAqLworICBUUERFQ19QQVJBTV9JR05PUkVfQlVGRkVSRlVMTE5FU1MsIC8qKiBJZ25vcmUgYnVmZmVyIGZ1bGxuZXNzLiAqLworICBUUERFQ19QQVJBTV9TRVRfQklUUkFURSwgIC8qKiBTZXQgYXZlcmFnZSBiaXQgcmF0ZSBmb3IgYml0IHN0cmVhbSBpbnRlcnJ1cHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBtaXNzZXMgZXN0aW1hdGlvbi4gKi8KKyAgVFBERUNfUEFSQU1fUkVTRVQsICAgICAgICAvKiogUmVzZXQgdHJhbnNwb3J0IGRlY29kZXIgaW5zdGFuY2Ugc3RhdHVzLiAqLworICBUUERFQ19QQVJBTV9CVVJTVF9QRVJJT0QsIC8qKiBTZXQgZGF0YSByZWNlcHRpb24gYnVyc3QgcGVyaW9kIGluIG1pbGkgc2Vjb25kcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVFBERUNfUEFSQU1fVEFSR0VUTEFZT1VULCAvKiogU2V0IENJQ1AgdGFyZ2V0IGxheW91dCAqLworICBUUERFQ19QQVJBTV9GT1JDRV9DT05GSUdfQ0hBTkdFLCAvKiogRm9yY2UgY29uZmlnIGNoYW5nZSBmb3IgbmV4dCByZWNlaXZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgKi8KKyAgVFBERUNfUEFSQU1fVVNFX0VMRU1fU0tJUFBJTkcKIH0gVFBERUNfUEFSQU07CiAKLS8qIElTTy9JRUMgMTQ0OTYtMyA0LjQuMS4xIFRhYmxlIDQuMiBQcm9ncmFtIGNvbmZpZyBlbGVtZW50ICovCi0jZGVmaW5lIFBDX0ZTQl9DSEFOTkVMU19NQVggMTYgLyogRnJvbnQvU2lkZS9CYWNrIGNoYW5uZWxzICovCi0jZGVmaW5lIFBDX0xGRV9DSEFOTkVMU19NQVggNAotI2RlZmluZSBQQ19BU1NPQ0RBVEFfTUFYICAgIDgKLSNkZWZpbmUgUENfQ0NFTF9NQVggICAgICAgICAxNiAvKiBDQyBlbGVtZW50cyAqLwotI2RlZmluZSBQQ19DT01NRU5UTEVOR1RIICAgIDI1NgotI2RlZmluZSBQQ19OVU1fSEVJR0hUX0xBWUVSIDMKLQotCiAvKiEKICAgXGJyaWVmICAgICAgICAgICAgICAgUmVzZXQgUHJvZ3JhbSBDb25maWcgRWxlbWVudC4KICAgXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCiAgIFxyZXR1cm4gICAgICAgICAgICAgIHZvaWQKICovCi12b2lkICBDUHJvZ3JhbUNvbmZpZ19SZXNldCAoIENQcm9ncmFtQ29uZmlnICpwUGNlICk7Cit2b2lkIENQcm9ncmFtQ29uZmlnX1Jlc2V0KENQcm9ncmFtQ29uZmlnICpwUGNlKTsKIAogLyohCiAgIFxicmllZiAgICAgICAgICAgICAgIEluaXRpYWxpemUgUHJvZ3JhbSBDb25maWcgRWxlbWVudC4KICAgXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCiAgIFxyZXR1cm4gICAgICAgICAgICAgIHZvaWQKICovCi12b2lkICBDUHJvZ3JhbUNvbmZpZ19Jbml0ICggQ1Byb2dyYW1Db25maWcgKnBQY2UgKTsKK3ZvaWQgQ1Byb2dyYW1Db25maWdfSW5pdChDUHJvZ3JhbUNvbmZpZyAqcFBjZSk7CiAKIC8qIQotICBcYnJpZWYgICAgICAgICAgICAgICBJbnF1aXJlIHN0YXRlIG9mIHByZXNlbnQgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCi0gIFxwYXJhbSBwUGNlICAgICAgICAgIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgc3RydWN0dXJlLgotICBccmV0dXJuICAgICAgICAgICAgICAxIGlmIHRoZSBQQ0Ugc3RydWN0dXJlIGlzIGZpbGxlZCBjb3JyZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vIHZhbGlkIFBDRSBwcmVzZW50LgorICBcYnJpZWYgICAgICAgICAgICAgICBJbnF1aXJlIHN0YXRlIG9mIHByZXNlbnQgUHJvZ3JhbSBDb25maWcgRWxlbWVudAorICBzdHJ1Y3R1cmUuIFxwYXJhbSBwUGNlICAgICAgICAgIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgc3RydWN0dXJlLiBccmV0dXJuCisgIDEgaWYgdGhlIFBDRSBzdHJ1Y3R1cmUgaXMgZmlsbGVkIGNvcnJlY3QsIDAgaWYgbm8gdmFsaWQgUENFIHByZXNlbnQuCiAqLwotaW50ICBDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkICggY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UgKTsKK2ludCBDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkKGNvbnN0IENQcm9ncmFtQ29uZmlnICpwUGNlKTsKIAotI2lmZGVmIFRQX1BDRV9FTkFCTEUKIC8qIQogICBcYnJpZWYgICAgICAgICAgICAgICBSZWFkIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQuCiAgIFxwYXJhbSBwUGNlICAgICAgICAgIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgc3RydWN0dXJlLgogICBccGFyYW0gYnMgICAgICAgICAgICBCaXRzdHJlYW0gYnVmZmVyIHRvIHJlYWQgZnJvbS4KLSAgXHBhcmFtIGFsaWduQW5jaG9yICAgQWxpZ24gYml0c3RyZWFtIHRvIGFsaWduQW5jaG9yIGJpdHMgYWZ0ZXIgYWxsIHJlYWQgb3BlcmF0aW9ucy4KLSAgXHJldHVybiAgICAgICAgICAgICAgdm9pZAorICBccGFyYW0gYWxpZ25BbmNob3IgICBBbGlnbiBiaXRzdHJlYW0gdG8gYWxpZ25BbmNob3IgYml0cyBhZnRlciBhbGwgcmVhZAorICBvcGVyYXRpb25zLiBccmV0dXJuICAgICAgICAgICAgICB2b2lkCiAqLwotdm9pZCAgQ1Byb2dyYW1Db25maWdfUmVhZCAoIENQcm9ncmFtQ29uZmlnICAgICAgICpwUGNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IgKTsKK3ZvaWQgQ1Byb2dyYW1Db25maWdfUmVhZChDUHJvZ3JhbUNvbmZpZyAqcFBjZSwgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhbGlnbkFuY2hvcik7CiAKIC8qIQogICBcYnJpZWYgICAgICAgICAgICAgICBDb21wYXJlIHR3byBQcm9ncmFtIENvbmZpZyBFbGVtZW50cy4KQEAgLTE5NCw1MCArMjA2LDU3IEBACiAgIFxwYXJhbSBwUGNlMiAgICAgICAgIFBvaW50ZXIgdG8gc2Vjb25kIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgc3RydWN0dXJlLgogICBccmV0dXJuICAgICAgICAgICAgICAtMSBpZiBQQ0VzIGFyZSBjb21wbGV0ZWx5IGRpZmZlcmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgIDAgaWYgUENFcyBhcmUgY29tcGxldGVseSBlcXVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgUENFcyBhcmUgZGlmZmVyZW50IGJ1dCBoYXZlIHRoZSBzYW1lIGNoYW5uZWwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgMiBpZiBQQ0VzIGhhdmUgZGlmZmVyZW50IGNoYW5uZWwgY29uZmlnIGJ1dCBzYW1lIG51bWJlciBvZiBjaGFubmVscy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgUENFcyBhcmUgZGlmZmVyZW50IGJ1dCBoYXZlIHRoZSBzYW1lIGNoYW5uZWwKKyAgY29uZmlnLCAyIGlmIFBDRXMgaGF2ZSBkaWZmZXJlbnQgY2hhbm5lbCBjb25maWcgYnV0IHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzLgogKi8KLWludCBDUHJvZ3JhbUNvbmZpZ19Db21wYXJlICggY29uc3QgQ1Byb2dyYW1Db25maWcgKiBjb25zdCBwUGNlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1Byb2dyYW1Db25maWcgKiBjb25zdCBwUGNlMiApOworaW50IENQcm9ncmFtQ29uZmlnX0NvbXBhcmUoY29uc3QgQ1Byb2dyYW1Db25maWcgKmNvbnN0IHBQY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1Byb2dyYW1Db25maWcgKmNvbnN0IHBQY2UyKTsKIAogLyohCi0gIFxicmllZiAgICAgICAgICAgICAgIEdldCBhIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBwcmVkZWZpbmVkIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIDEtMTQuCi0gIFxwYXJhbSBwUGNlICAgICAgICAgIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgc3RydWN0dXJlLgotICBccGFyYW0gY2hhbm5lbENvbmZpZyBNUEVHLTQgY2hhbm5lbCBjb25maWd1cmF0aW9uLgotICBccmV0dXJuICAgICAgICAgICAgICB2b2lkCisgIFxicmllZiAgICAgICAgICAgICAgIEdldCBhIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBwcmVkZWZpbmVkCisgIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIDEtMTQuIFxwYXJhbSBwUGNlICAgICAgICAgIFByb2dyYW0gQ29uZmlnCisgIEVsZW1lbnQgc3RydWN0dXJlLiBccGFyYW0gY2hhbm5lbENvbmZpZyBNUEVHLTQgY2hhbm5lbCBjb25maWd1cmF0aW9uLiBccmV0dXJuCisgIHZvaWQKICovCi12b2lkIENQcm9ncmFtQ29uZmlnX0dldERlZmF1bHQgKCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbENvbmZpZyApOwotI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KK3ZvaWQgQ1Byb2dyYW1Db25maWdfR2V0RGVmYXVsdChDUHJvZ3JhbUNvbmZpZyAqcFBjZSwgY29uc3QgVUlOVCBjaGFubmVsQ29uZmlnKTsKIAogLyoqCiAgKiBcYnJpZWYgTG9va3VwIGFuZCB2ZXJpZnkgYSBnaXZlbiBlbGVtZW50LiBUaGUgZGVjb2RlciBjYWxscyB0aGlzCiAgKiAgICAgICAgbWV0aG9kIHdpdGggZXZlcnkgbmV3IGVsZW1lbnQgSUQgZm91bmQgaW4gdGhlIGJpdHN0cmVhbS4KICAqCiAgKiBccGFyYW0gcFBjZSAgICAgICAgQSB2YWxpZCBQcm9ncmFtIGNvbmZpZyBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gY2hDb25maWcgICAgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbi4KICAqIFxwYXJhbSB0YWcgICAgICAgICBUYWcgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCB0byBiZSBsb29rZWQgdXAuCiAgKiBccGFyYW0gY2hhbm5lbElkeCAgVGhlIGN1cnJlbnQgY2hhbm5lbCBjb3VudCBvZiB0aGUgZGVjb2RlciBwYXJzZXIuCiAgKiBccGFyYW0gY2hNYXBwaW5nICAgQXJyYXkgdG8gc3RvcmUgdGhlIGNhbm9uaWNhbCBjaGFubmVsIG1hcHBpbmcgaW5kZXhlcy4KICAqIFxwYXJhbSBjaFR5cGUgICAgICBBcnJheSB0byBzdG9yZSB0aGUgYXVkaW8gY2hhbm5lbCB0eXBlLgogICogXHBhcmFtIGNoSW5kZXggICAgIEFycmF5IHRvIHN0b3JlIHRoZSBpbmRpdmlkdWFsIGF1ZGlvIGNoYW5uZWwgdHlwZSBpbmRleC4KKyAqIFxwYXJhbSBjaERlc2NyTGVuICBMZW5ndGggb2YgdGhlIG91dHB1dCBjaGFubmVsIGRlc2NyaXB0aW9uIGFycmF5LgogICogXHBhcmFtIGVsTWFwcGluZyAgIFBvaW50ZXIgd2hlcmUgdGhlIGNhbm9uaWNhbCBlbGVtZW50IGluZGV4IGlzIHN0b3JlZC4KICAqIFxwYXJhbSBlbFR5cGUgICAgICBUaGUgZWxlbWVudCBpZCBvZiB0aGUgY3VycmVudCBlbGVtZW50IHRvIGJlIGxvb2tlZCB1cC4KICAqCi0gKiBccmV0dXJuICAgICAgICAgICAgTm9uLXplcm8gaWYgdGhlIGVsZW1lbnQgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9ncmFtLCB6ZXJvCi0gKiAgICAgICAgICAgICAgICAgICAgaWYgaXQgZG9lcyBub3QuCisgKiBccmV0dXJuICAgICAgICAgICAgTm9uLXplcm8gaWYgdGhlIGVsZW1lbnQgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9ncmFtLAorICogemVybyBpZiBpdCBkb2VzIG5vdC4KICAqLwotaW50IENQcm9ncmFtQ29uZmlnX0xvb2t1cEVsZW1lbnQoCi0gICAgICAgIENQcm9ncmFtQ29uZmlnICpwUGNlLAotICAgICAgICBVSU5UICAgICAgICAgICAgY2hhbm5lbENvbmZpZywKLSAgICAgICAgY29uc3QgVUlOVCAgICAgIHRhZywKLSAgICAgICAgY29uc3QgVUlOVCAgICAgIGNoYW5uZWxJZHgsCi0gICAgICAgIFVDSEFSICAgICAgICAgICBjaE1hcHBpbmdbXSwKLSAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoVHlwZVtdLAotICAgICAgICBVQ0hBUiAgICAgICAgICAgY2hJbmRleFtdLAotICAgICAgICBVQ0hBUiAgICAgICAgICAqZWxNYXBwaW5nLAotICAgICAgICBNUDRfRUxFTUVOVF9JRCAgZWxMaXN0W10sCi0gICAgICAgIE1QNF9FTEVNRU5UX0lEICBlbFR5cGUKLSAgICAgICAgKTsKK2ludCBDUHJvZ3JhbUNvbmZpZ19Mb29rdXBFbGVtZW50KENQcm9ncmFtQ29uZmlnICpwUGNlLCBVSU5UIGNoQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCB0YWcsIGNvbnN0IFVJTlQgY2hhbm5lbElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGNoTWFwcGluZ1tdLCBBVURJT19DSEFOTkVMX1RZUEUgY2hUeXBlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBjaEluZGV4W10sIGNvbnN0IFVJTlQgY2hEZXNjckxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICplbE1hcHBpbmcsIE1QNF9FTEVNRU5UX0lEIGVsTGlzdFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVA0X0VMRU1FTlRfSUQgZWxUeXBlKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgR2V0IHRhYmxlIG9mIGNoYW5uZWwgaW5kaWNlcyBpbiB0aGUgb3JkZXIgb2YgdGhlaXIKKyAqIGFwcGVhcmFuY2UgaW4gYnkgdGhlIHByb2dyYW0gY29uZmlnIGZpZWxkLgorICogXHBhcmFtIHBQY2UgICAgICAgIEEgdmFsaWQgcHJvZ3JhbSBjb25maWcgc3RydWN0dXJlLgorICogXHBhcmFtIHBjZUNoTWFwICAgIEFycmF5IHRvIHN0b3JlIHRoZSBjaGFubmVsIG1hcHBpbmcgaW5kaWNlcyBsaWtlIHRoZXkKKyAqIGFwcGVhciBpbiB0aGUgUENFLgorICogXHBhcmFtIHBjZUNoTWFwTGVuIExlbmdodCBvZiB0aGUgY2hhbm5lbCBtYXBwaW5nIGluZGV4IGFycmF5IChwY2VDaE1hcCkuCisgKgorICogXHJldHVybiAgICAgICAgICAgIE5vbi16ZXJvIGlmIGFueSBlcnJvciBvY2N1cmVkIG90aGVyd2lzZSB6ZXJvLgorICovCitpbnQgQ1Byb2dyYW1Db25maWdfR2V0UGNlQ2hNYXAoY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UsIFVDSEFSIHBjZUNoTWFwW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBwY2VDaE1hcExlbik7CiAKIC8qKgogICogXGJyaWVmICAgICAgICAgICAgIEdldCB0YWJsZSBvZiBlbGVtZW50cyBpbiBjYW5vbmljYWwgb3JkZXIgZnJvbSBhCkBAIC0yNTAsMTAgKzI2OSwyMiBAQAogICogICAgICAgICAgICAgICAgICAgIFBDRS4gSWYgbm9uZSBjYW4gYmUgZm91bmQgaXQgcmVjZWl2ZXMgdGhlIHZhbHVlIDAuCiAgKiBccmV0dXJuICAgICAgICAgICAgVG90YWwgZWxlbWVudCBjb3VudCBpbmNsdWRpbmcgYWxsIFNDRSwgQ1BFIGFuZCBMRkUuCiAgKi8KLWludCBDUHJvZ3JhbUNvbmZpZ19HZXRFbGVtZW50VGFibGUoIGNvbnN0IENQcm9ncmFtQ29uZmlnICpwUGNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVA0X0VMRU1FTlRfSUQgIHRhYmxlW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZWxMaXN0U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwQ2hNYXBJZHggKTsKK2ludCBDUHJvZ3JhbUNvbmZpZ19HZXRFbGVtZW50VGFibGUoY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNF9FTEVNRU5UX0lEIHRhYmxlW10sIGNvbnN0IElOVCBlbExpc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcENoTWFwSWR4KTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgR2V0IGNoYW5uZWwgZGVzY3JpcHRpb24gKHR5cGUgYW5kIGluZGV4KSBmb3IgaW1wbGljaXQKKyAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9ucyAoY2hDb25maWcgPiAwKSBpbiBNUEVHIGNhbm9uaWNhbCBvcmRlci4KKyAqIFxwYXJhbSBjaENvbmZpZyBNUEVHLTQgY2hhbm5lbCBjb25maWd1cmF0aW9uLgorICogXHBhcmFtIGNoVHlwZSAgIEFycmF5IHRvIHN0b3JlIHRoZSBhdWRpbyBjaGFubmVsIHR5cGUuCisgKiBccGFyYW0gY2hJbmRleCAgQXJyYXkgdG8gc3RvcmUgdGhlIGluZGl2aWR1YWwgYXVkaW8gY2hhbm5lbCB0eXBlIGluZGV4LgorICogXHJldHVybiAgICAgICAgIHZvaWQKKyAqLwordm9pZCBDUHJvZ3JhbUNvbmZpZ19HZXRDaGFubmVsRGVzY3JpcHRpb24oY29uc3QgVUlOVCBjaENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQcm9ncmFtQ29uZmlnICpwUGNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoVHlwZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY2hJbmRleFtdKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgSW5pdGlhbGl6ZSBhIGdpdmVuIEF1ZGlvU3BlY2lmaWNDb25maWcgc3RydWN0dXJlLgpAQCAtMjY1LDQ1ICsyOTYsNTAgQEAKIC8qKgogICogXGJyaWVmICAgUGFyc2UgYSBBdWRpb1NwZWNpZmljQ29uZmlnIGZyb20gYSBnaXZlbiBiaXRzdHJlYW0gaGFuZGxlLgogICoKLSAqIFxwYXJhbSBwQXNjICAgICAgICAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgQ1NBdWRpb1NwZWNpZmljQ29uZmlnIHN0cnVjdC4KKyAqIFxwYXJhbSBwQXNjICAgICAgICAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBhbiBhbGxvY2F0ZWQKKyAqIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBzdHJ1Y3QuCiAgKiBccGFyYW0gaEJzICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW0gaGFuZGxlLgotICogXHBhcmFtIGZFeHBsaWNpdEJhY2t3YXJkQ29tcGF0aWJsZSAgRG8gZXhwbGljaXQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBwYXJzaW5nIGlmIHNldCAoZmxhZykuCisgKiBccGFyYW0gZkV4cGxpY2l0QmFja3dhcmRDb21wYXRpYmxlICBEbyBleHBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgKiBwYXJzaW5nIGlmIHNldCAoZmxhZykuCiAgKiBccGFyYW0gY2IgcG9pbnRlciB0byBzdHJ1Y3R1cmUgaG9sZGluZyBjYWxsYmFjayBpbmZvcm1hdGlvbgorICogXHBhcmFtIGNvbmZpZ01vZGUgQ29uZmlnIG1vZGVzOiBtZW1vcnkgYWxsb2NhdGlvbiBtb2RlIG9yIGNvbmZpZyBjaGFuZ2UKKyAqIGRldGVjdGlvbiBtb2RlLgorICogXHBhcmFtIGNvbmZpZ0NoYW5nZWQgSW5kaWNhdGVzIGEgY29uZmlnIGNoYW5nZS4KKyAqIFxwYXJhbSBtX2FvdCBpbiBjYXNlIG9mIHVuZXF1YWwgQU9UX05VTExfT0JKRUNUIG9ubHkgdGhlIHNwZWNpZmljIGNvbmZpZyBpcworICogcGFyc2VkLgogICoKICAqIFxyZXR1cm4gIFRvdGFsIGVsZW1lbnQgY291bnQgaW5jbHVkaW5nIGFsbCBTQ0UsIENQRSBhbmQgTEZFLgogICovCiBUUkFOU1BPUlRERUNfRVJST1IgQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgKLSAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIGludCBmRXhwbGljaXRCYWNrd2FyZENvbXBhdGlibGUsCi0gICAgICAgIENTVHBDYWxsQmFja3MgKmNiCi0gICAgICAgICk7CisgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgaW50IGZFeHBsaWNpdEJhY2t3YXJkQ29tcGF0aWJsZSwgQ1NUcENhbGxCYWNrcyAqY2IsIFVDSEFSIGNvbmZpZ01vZGUsCisgICAgVUNIQVIgY29uZmlnQ2hhbmdlZCwgQVVESU9fT0JKRUNUX1RZUEUgbV9hb3QpOwogCiAvKiBDRUxQIHN0dWZmICovCi1lbnVtIHsKLSAgTVBFICAgICA9IDAsCi0gIFJQRSAgICAgPSAxLAotICBmczhLSHogID0gMCwKLSAgZnMxNktIeiA9IDEKLX07CitlbnVtIHsgTVBFID0gMCwgUlBFID0gMSwgZnM4S0h6ID0gMCwgZnMxNktIeiA9IDEgfTsKIAogLyogRGVmaW50aW9uIG9mIGZsYWdzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0cmFuc3BvcnREZWNPcGVuKCkgKi8KICNkZWZpbmUgVFBfRkxBR19NUEVHNCAxCiAKIC8qIENhcGFiaWxpdHkgZmxhZ3MgKi8KLSNkZWZpbmUgQ0FQRl9UUERFQ19BRElGICAgICAgICAweDAwMDAxMDAwICAvKio8IEZsYWcgaW5kaWNhdGluZyBzdXBwb3J0IGZvciBBRElGIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLwotI2RlZmluZSBDQVBGX1RQREVDX0FEVFMgICAgICAgIDB4MDAwMDIwMDAgIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIEFEVFMgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCi0jZGVmaW5lIENBUEZfVFBERUNfTE9BUyAgICAgICAgMHgwMDAwNDAwMCAgLyoqPCBGbGFnIGluZGljYXRpbmcgc3VwcG9ydCBmb3IgTE9BUyB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9UUERFQ19MQVRNICAgICAgICAweDAwMDA4MDAwICAvKio8IEZsYWcgaW5kaWNhdGluZyBzdXBwb3J0IGZvciBMQVRNIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLwotI2RlZmluZSBDQVBGX1RQREVDX1JBV1BBQ0tFVFMgIDB4MDAwMTAwMDAgIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIHJhdyBwYWNrZXRzIHRyYW5zcG9ydCBmb3JtYXQuICovCisjZGVmaW5lIENBUEZfVFBERUNfQURJRiBcCisgIDB4MDAwMDEwMDAgLyoqPCBGbGFnIGluZGljYXRpbmcgc3VwcG9ydCBmb3IgQURJRiB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9UUERFQ19BRFRTIFwKKyAgMHgwMDAwMjAwMCAvKio8IEZsYWcgaW5kaWNhdGluZyBzdXBwb3J0IGZvciBBRFRTIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLworI2RlZmluZSBDQVBGX1RQREVDX0xPQVMgXAorICAweDAwMDA0MDAwIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIExPQVMgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCisjZGVmaW5lIENBUEZfVFBERUNfTEFUTSBcCisgIDB4MDAwMDgwMDAgLyoqPCBGbGFnIGluZGljYXRpbmcgc3VwcG9ydCBmb3IgTEFUTSB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9UUERFQ19SQVdQQUNLRVRTIFwKKyAgMHgwMDAxMDAwMCAvKio8IEZsYWcgaW5kaWNhdGluZyBzdXBwb3J0IGZvciByYXcgcGFja2V0cyB0cmFuc3BvcnQgZm9ybWF0LiAqLwogCiB0eXBlZGVmIHN0cnVjdCBUUkFOU1BPUlRERUMgKkhBTkRMRV9UUkFOU1BPUlRERUM7CiAKLQogLyoqCi0gKiBcYnJpZWYgQ29uZmlndXJlIFRyYW5zcG9ydCBEZWNvZGVyIHZpYSBhIGJpbmFyeSBjb2RlZCBBdWRpb1NwZWNpZmljQ29uZmlnIG9yIFN0cmVhbU11eENvbmZpZy4KLSAqICAgICAgICBUaGUgcHJldmlvdXNseSByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhcyB3ZWxsLiBUaGUgYnVmZmVyIGNvbmYKLSAqICAgICAgICBtdXN0IGNvbnRhaW50IGEgU01DIGluIGNhc2Ugb2YgTE9BUy9MQVRNIHRyYW5zcG9ydCBmb3JtYXQsIGFuZCBhbiBBU0MgZWxzZXdheXMuCisgKiBcYnJpZWYgQ29uZmlndXJlIFRyYW5zcG9ydCBEZWNvZGVyIHZpYSBhIGJpbmFyeSBjb2RlZCBBdWRpb1NwZWNpZmljQ29uZmlnIG9yCisgKiBTdHJlYW1NdXhDb25maWcuIFRoZSBwcmV2aW91c2x5IHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIGNhbGxiYWNrIHdpbGwgYmUKKyAqIGNhbGxlZCBhcyB3ZWxsLiBUaGUgYnVmZmVyIGNvbmYgbXVzdCBjb250YWludCBhIFNNQyBpbiBjYXNlIG9mCisgKiBMT0FTL0xBVE0gdHJhbnNwb3J0IGZvcm1hdCwgYW5kIGFuIEFTQyBlbHNld2F5cy4KICAqCiAgKiBccGFyYW0gaFRwICAgICBIYW5kbGUgb2YgYSB0cmFuc3BvcnQgZGVjb2Rlci4KICAqIFxwYXJhbSBjb25mICAgIFVDSEFSIGJ1ZmZlciBvZiB0aGUgYmluYXJ5IGNvZGVkIGNvbmZpZyAoQVNDIG9yIFNNQykuCkBAIC0zMTEsOTYgKzM0NywxNzQgQEAKICAqCiAgKiBccmV0dXJuICAgICAgICBFcnJvciBjb2RlLgogICovCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX091dE9mQmFuZENvbmZpZyggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICpjb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgbGF5ZXIgKTsKK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfT3V0T2ZCYW5kQ29uZmlnKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmNvbmYsIGNvbnN0IFVJTlQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsYXllcik7CisKKy8qKgorICogXGJyaWVmIENvbmZpZ3VyZSBUcmFuc3BvcnQgRGVjb2RlciB2aWEgYSBiaW5hcnkgY29kZWQgVVNBQy9SU1Y2MDNEQSBDb25maWcuCisgKiAgICAgICAgVGhlIGJ1ZmZlciBuZXdDb25maWcgY29udGFpbnMgYSBiaW5hcnkgY29kZWQgVVNBQy9SU1Y2MDNEQSBjb25maWcgb2YKKyAqIGxlbmd0aCBuZXdDb25maWdMZW5ndGggYnl0ZXMuIElmIHRoZSBuZXcgY29uZmlnIGFuZCB0aGUgcHJldmlvdXMgY29uZmlnIGFyZQorICogZGlmZmVyZW50IGNvbmZpZ0NoYW5nZWQgaXMgc2V0IHRvIDEgb3RoZXJ3aXNlIGl0IGlzIHNldCB0byAwLgorICoKKyAqIFxwYXJhbSBoVHAgICAgICAgICAgICAgIEhhbmRsZSBvZiBhIHRyYW5zcG9ydCBkZWNvZGVyLgorICogXHBhcmFtIG5ld0NvbmZpZyAgICAgICAgYnVmZmVyIG9mIHRoZSBiaW5hcnkgY29kZWQgY29uZmlnLgorICogXHBhcmFtIG5ld0NvbmZpZ0xlbmd0aCAgTGVuZ3RoIG9mIG5ldyBjb25maWcgaW4gYnl0ZXMuCisgKiBccGFyYW0gYnVpbGRVcFN0YXR1cyAgICBJbmRpY2F0ZXMgYnVpbGQgdXAgc3RhdHVzOiBvZmZ8b258aWRsZS4KKyAqIFxwYXJhbSBjb25maWdDaGFuZ2VkICAgIEluZGljYXRlcyBpZiBjb25maWcgY2hhbmdlZC4KKyAqIFxwYXJhbSBsYXllciAgICAgICAgICAgIEluc3RhbmNlIGxheWVyLgorICoKKyAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCisgKi8KK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfSW5CYW5kQ29uZmlnKAorICAgIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBVQ0hBUiAqbmV3Q29uZmlnLCBjb25zdCBVSU5UIG5ld0NvbmZpZ0xlbmd0aCwKKyAgICBjb25zdCBVQ0hBUiBidWlsZFVwU3RhdHVzLCBVQ0hBUiAqY29uZmlnQ2hhbmdlZCwgY29uc3QgVUlOVCBsYXllciwKKyAgICBVQ0hBUiAqaW1wbGljaXRFeHBsaWNpdENmZ0RpZmYpOwogCiAvKioKICAqIFxicmllZiBPcGVuIFRyYW5zcG9ydCBtZWRpdW0gZm9yIHJlYWRpbmcuCiAgKgogICogXHBhcmFtIHRyYW5zcG9ydERlY0ZtdCBGb3JtYXQgb2YgdGhlIHRyYW5zcG9ydCBkZWNvZGVyIG1lZGl1bSB0byBiZSBhY2Nlc3NlZC4KLSAqIFxwYXJhbSBmbGFncyAgICAgICAgICAgVHJhbnNwb3J0IGRlY29kZXIgZmxhZ3MuIEN1cnJlbnRseSBvbmx5IFRQX0ZMQUdfTVBFRzQsIHdoaWNoIHNpZ25hbHMgYQotICogICAgICAgICAgICAgICAgICAgICAgICBNUEVHNCBjYXBhYmxlIGRlY29kZXIgKHJlbGV2YW50IGZvciBBRFRTIG9ubHkpLgorICogXHBhcmFtIGZsYWdzICAgICAgICAgICBUcmFuc3BvcnQgZGVjb2RlciBmbGFncy4gQ3VycmVudGx5IG9ubHkgVFBfRkxBR19NUEVHNCwKKyAqIHdoaWNoIHNpZ25hbHMgYSBNUEVHNCBjYXBhYmxlIGRlY29kZXIgKHJlbGV2YW50IGZvciBBRFRTIG9ubHkpLgogICoKLSAqIFxyZXR1cm4gICBBIHBvaW50ZXIgdG8gYSB2YWxpZCBhbmQgYWxsb2NhdGVkIEhBTkRMRV9UUkFOU1BPUlRERUMgb3IgYSBudWxsIHBvaW50ZXIgb24gZmFpbHVyZS4KKyAqIFxyZXR1cm4gICBBIHBvaW50ZXIgdG8gYSB2YWxpZCBhbmQgYWxsb2NhdGVkIEhBTkRMRV9UUkFOU1BPUlRERUMgb3IgYSBudWxsCisgKiBwb2ludGVyIG9uIGZhaWx1cmUuCiAgKi8KLUhBTkRMRV9UUkFOU1BPUlRERUMgdHJhbnNwb3J0RGVjX09wZW4oIFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydERlY0ZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MgKTsKK0hBTkRMRV9UUkFOU1BPUlRERUMgdHJhbnNwb3J0RGVjX09wZW4oVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0RGVjRm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBVSU5UIG5yT2ZMYXllcik7CiAKIC8qKgogICogXGJyaWVmICAgICAgICAgICAgICAgIFJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNhbGxiYWNrLgogICogXHBhcmFtIGhUcCAgICAgICAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnQgZGVjb2Rlci4KLSAqIFxwYXJhbSBjYlVwZGF0ZUNvbmZpZyBQb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGF1ZGlvIGNvbmZpZyBjaGFuZ2VzLgotICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMgZmlyc3QgcGFyYW1ldGVyLgorICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgYXVkaW8gY29uZmlnCisgKiBjaGFuZ2VzLgorICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMKKyAqIGZpcnN0IHBhcmFtZXRlci4KICAqIFxyZXR1cm4gICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MuCiAgKi8KLWludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJBc2NDYWxsYmFjayAoCi0gICAgICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAotICAgICAgICBjb25zdCBjYlVwZGF0ZUNvbmZpZ190IGNiVXBkYXRlQ29uZmlnLAotICAgICAgICB2b2lkKiB1c2VyX2RhdGEgKTsKK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJBc2NDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlVwZGF0ZUNvbmZpZ190IGNiVXBkYXRlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgIFJlZ2lzdGVyIGZyZWUgbWVtb3J5IGNhbGxiYWNrLgorICogXHBhcmFtIGhUcCAgICAgICAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnQgZGVjb2Rlci4KKyAqIFxwYXJhbSBjYkZyZWVNZW0gICAgICBQb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZnJlZSBjb25maWcgZGVwZW5kZW50CisgKiBtZW1vcnkuCisgKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcworICogZmlyc3QgcGFyYW1ldGVyLgorICogXHJldHVybiAgICAgICAgICAgICAgIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHRyYW5zcG9ydERlY19SZWdpc3RlckZyZWVNZW1DYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JGcmVlTWVtX3QgY2JGcmVlTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgY29uZmlnIGNoYW5nZSBjb250cm9sIGNhbGxiYWNrLgorICogXHBhcmFtIGhUcCAgICAgICAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0IGRlY29kZXIuCisgKiBccGFyYW0gY2JDdHJsQ0ZHQ2hhbmdlIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgY29uZmlnIGNoYW5nZQorICogY29udHJvbC4KKyAqIFxwYXJhbSB1c2VyX2RhdGEgICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcworICogZmlyc3QgcGFyYW1ldGVyLgorICogXHJldHVybiAgICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJDdHJsQ0ZHQ2hhbmdlQ2FsbGJhY2soCisgICAgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IGNiQ3RybENGR0NoYW5nZV90IGNiQ3RybENGR0NoYW5nZSwKKyAgICB2b2lkICp1c2VyX2RhdGEpOwogCiAvKioKICAqIFxicmllZiAgICAgICAgICAgICAgICBSZWdpc3RlciBTU0MgcGFyc2VyIGNhbGxiYWNrLgogICogXHBhcmFtIGhUcCAgICAgICAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnQgZGVjb2Rlci4KICAqIFxwYXJhbSBjYlVwZGF0ZUNvbmZpZyBQb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIFNTQyBwYXJzaW5nLgotICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMgZmlyc3QgcGFyYW1ldGVyLgorICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMKKyAqIGZpcnN0IHBhcmFtZXRlci4KICAqIFxyZXR1cm4gICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MuCiAgKi8KLWludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTc2NDYWxsYmFjayAoCi0gICAgICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAotICAgICAgICBjb25zdCBjYlNzY190IGNiU3NjUGFyc2UsCi0gICAgICAgIHZvaWQqIHVzZXJfZGF0YSApOworaW50IHRyYW5zcG9ydERlY19SZWdpc3RlclNzY0NhbGxiYWNrKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiU3NjX3QgY2JTc2NQYXJzZSwgdm9pZCAqdXNlcl9kYXRhKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgICAgUmVnaXN0ZXIgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suCiAgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgotICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgU0JSIGhlYWRlciBwYXJzaW5nLgotICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMgZmlyc3QgcGFyYW1ldGVyLgotICogXHJldHVybiAgICAgICAgICAgICAgIDAgb24gc3VjY2Vzcy4gCisgKiBccGFyYW0gY2JVcGRhdGVDb25maWcgUG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBTQlIgaGVhZGVyCisgKiBwYXJzaW5nLgorICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMKKyAqIGZpcnN0IHBhcmFtZXRlci4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MuCiAgKi8KLWludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTYnJDYWxsYmFjayggSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsIGNvbnN0IGNiU2JyX3QgY2JTYnIsIHZvaWQqIHVzZXJfZGF0YSk7CitpbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyU2JyQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JTYnJfdCBjYlNiciwgdm9pZCAqdXNlcl9kYXRhKTsKIAogLyoqCi0gKiBcYnJpZWYgRmlsbCBpbnRlcm5hbCBpbnB1dCBidWZmZXIgd2l0aCBiaXRzdHJlYW0gZGF0YSBmcm9tIHRoZSBleHRlcm5hbCBpbnB1dCBidWZmZXIuCi0gKiAgVGhlIGZ1bmN0aW9uIG9ubHkgY29waWVzIHN1Y2ggZGF0YSBhcyBsb25nIGFzIHRoZSBkZWNvZGVyLWludGVybmFsIGlucHV0IGJ1ZmZlciBpcyBub3QgZnVsbC4KLSAqICBTbyBpdCBncmFicyB3aGF0ZXZlciBpdCBjYW4gZnJvbSBwQnVmZmVyIGFuZCByZXR1cm5zIGluZm9ybWF0aW9uIChieXRlc1ZhbGlkKSBzbyB0aGF0IGF0IGEKLSAqICBzdWJzZXF1ZW50IGNhbGwgb2YgJXRyYW5zcG9ydERlY19GaWxsRGF0YSgpLCB0aGUgcmlnaHQgcG9zaXRpb24gaW4gcEJ1ZmZlciBjYW4gYmUgZGV0ZXJtaW5lZCB0bworICogXGJyaWVmICAgICAgICAgICAgICAgIFJlZ2lzdGVyIFVTQUMgU0MgcGFyc2VyIGNhbGxiYWNrLgorICogXHBhcmFtIGhUcCAgICAgICAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnQgZGVjb2Rlci4KKyAqIFxwYXJhbSBjYlVwZGF0ZUNvbmZpZyBQb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIFVTQUMgU0MKKyAqIHBhcnNpbmcuCisgKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcworICogZmlyc3QgcGFyYW1ldGVyLgorICogXHJldHVybiAgICAgICAgICAgICAgIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHRyYW5zcG9ydERlY19SZWdpc3RlclVzYWNDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JVc2FjX3QgY2JVc2FjLCB2b2lkICp1c2VyX2RhdGEpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICAgICBSZWdpc3RlciB1bmlEcmNDb25maWcgYW5kIGxvdWRuZXNzSW5mb1NldCBwYXJzZXIKKyAqIGNhbGxiYWNrLgorICogXHBhcmFtIGhUcCAgICAgICAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnQgZGVjb2Rlci4KKyAqIFxwYXJhbSBjYlVwZGF0ZUNvbmZpZyBQb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIHVuaURyY0NvbmZpZworICogYW5kIGxvdWRuZXNzSW5mb1NldCBwYXJzaW5nLgorICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMKKyAqIGZpcnN0IHBhcmFtZXRlci4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJVbmlEcmNDb25maWdDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlVuaURyY190IGNiVW5pRHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwTG91ZG5lc3NJbmZvU2V0UG9zaXRpb24pOworCisvKioKKyAqIFxicmllZiBGaWxsIGludGVybmFsIGlucHV0IGJ1ZmZlciB3aXRoIGJpdHN0cmVhbSBkYXRhIGZyb20gdGhlIGV4dGVybmFsIGlucHV0CisgKiBidWZmZXIuIFRoZSBmdW5jdGlvbiBvbmx5IGNvcGllcyBzdWNoIGRhdGEgYXMgbG9uZyBhcyB0aGUgZGVjb2Rlci1pbnRlcm5hbAorICogaW5wdXQgYnVmZmVyIGlzIG5vdCBmdWxsLiBTbyBpdCBncmFicyB3aGF0ZXZlciBpdCBjYW4gZnJvbSBwQnVmZmVyIGFuZAorICogcmV0dXJucyBpbmZvcm1hdGlvbiAoYnl0ZXNWYWxpZCkgc28gdGhhdCBhdCBhIHN1YnNlcXVlbnQgY2FsbCBvZgorICogJXRyYW5zcG9ydERlY19GaWxsRGF0YSgpLCB0aGUgcmlnaHQgcG9zaXRpb24gaW4gcEJ1ZmZlciBjYW4gYmUgZGV0ZXJtaW5lZCB0bwogICogIGdyYWIgdGhlIG5leHQgZGF0YS4KICAqCiAgKiBccGFyYW0gaFRwICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydERlYy4KICAqIFxwYXJhbSBwQnVmZmVyICAgICBQb2ludGVyIHRvIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4KLSAqIFxwYXJhbSBidWZmZXJTaXplICBTaXplIG9mIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4gVGhpcyBhcmd1bWVudCBpcyByZXF1aXJlZCBiZWNhdXNlIGRlY29kZXItaW50ZXJuYWxseQotICogICAgICAgICAgICAgICAgICAgIHdlIG5lZWQgdGhlIGluZm9ybWF0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IHRvIHBCdWZmZXIsIHdoZXJlIHRoZSBuZXh0Ci0gKiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGRhdGEgaXMsIHdoaWNoIGlzIHRoZW4gZmVkIGludG8gdGhlIGRlY29kZXItaW50ZXJuYWwgYnVmZmVyIChhcyBtdWNoCi0gKiAgICAgICAgICAgICAgICAgICAgYXMgcG9zc2libGUpLiBPdXIgZXhhbXBsZSBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb24gZmlsbHMgdGhlIGJ1ZmZlciBhdCBwQnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgYWdhaW4sIG9uY2UgaXQgY29udGFpbnMgbm8gYXZhaWxhYmxlIHZhbGlkIGJ5dGVzIGFueW1vcmUgKG1lYW5pbmcgYnl0ZXNWYWxpZCBlcXVhbCAwKS4KLSAqIFxwYXJhbSBieXRlc1ZhbGlkICBOdW1iZXIgb2YgYml0c3RyZWFtIGJ5dGVzIGluIHRoZSBleHRlcm5hbCBiaXRzdHJlYW0gYnVmZmVyIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4KLSAqICAgICAgICAgICAgICAgICAgICBjb3BpZWQgaW50byB0aGUgZGVjb2RlcidzIGludGVybmFsIGJpdHN0cmVhbSBidWZmZXIgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBpcyB1cGRhdGVkIGFjY29yZGluZyB0byB0aGUgYW1vdW50IG9mIG5ld2x5IGNvcGllZCBieXRlcy4KKyAqIFxwYXJhbSBidWZmZXJTaXplICBTaXplIG9mIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4gVGhpcyBhcmd1bWVudCBpcyByZXF1aXJlZAorICogYmVjYXVzZSBkZWNvZGVyLWludGVybmFsbHkgd2UgbmVlZCB0aGUgaW5mb3JtYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgdG8KKyAqIHBCdWZmZXIsIHdoZXJlIHRoZSBuZXh0IGF2YWlsYWJsZSBkYXRhIGlzLCB3aGljaCBpcyB0aGVuCisgKiBmZWQgaW50byB0aGUgZGVjb2Rlci1pbnRlcm5hbCBidWZmZXIgKGFzIG11Y2ggYXMKKyAqIHBvc3NpYmxlKS4gT3VyIGV4YW1wbGUgZnJhbWV3b3JrIGltcGxlbWVudGF0aW9uIGZpbGxzIHRoZQorICogYnVmZmVyIGF0IHBCdWZmZXIgYWdhaW4sIG9uY2UgaXQgY29udGFpbnMgbm8gYXZhaWxhYmxlIHZhbGlkIGJ5dGVzIGFueW1vcmUKKyAqIChtZWFuaW5nIGJ5dGVzVmFsaWQgZXF1YWwgMCkuCisgKiBccGFyYW0gYnl0ZXNWYWxpZCAgTnVtYmVyIG9mIGJpdHN0cmVhbSBieXRlcyBpbiB0aGUgZXh0ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlcgorICogdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb3BpZWQgaW50byB0aGUgZGVjb2RlcidzIGludGVybmFsIGJpdHN0cmVhbSBidWZmZXIgYnkKKyAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gVGhlIHZhbHVlIGlzIHVwZGF0ZWQgYWNjb3JkaW5nIHRvCisgKiB0aGUgYW1vdW50IG9mIG5ld2x5IGNvcGllZCBieXRlcy4KICAqIFxwYXJhbSBsYXllciAgICAgICBUaGUgbGF5ZXIgdGhlIGJpdHN0cmVhbSBiZWxvbmdzIHRvLgogICogXHJldHVybiAgICAgICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfRmlsbERhdGEoCi0gICAgICAgIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgIGhUcCwKLSAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAqcEJ1ZmZlciwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAqcEJ5dGVzVmFsaWQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGxheWVyICk7CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0ZpbGxEYXRhKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcEJ1ZmZlciwgY29uc3QgVUlOVCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwQnl0ZXNWYWxpZCwgY29uc3QgSU5UIGxheWVyKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICBHZXQgdHJhbnNwb3J0RGVjIGJpdHN0cmVhbSBoYW5kbGUuCiAgKiBccGFyYW0gaFRwICBQb2ludGVyIHRvIGEgdHJhbnNwb3J0IGRlY29kZXIgaGFuZGxlLgogICogXHJldHVybiAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYml0c3RyZWFtIGhhbmRsZS4KICAqLwotSEFORExFX0ZES19CSVRTVFJFQU0gdHJhbnNwb3J0RGVjX0dldEJpdHN0cmVhbSAoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBjb25zdCBVSU5UIGxheWVyICk7CitIQU5ETEVfRkRLX0JJVFNUUkVBTSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxheWVyKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICBHZXQgdHJhbnNwb3J0IGZvcm1hdC4KICAqIFxwYXJhbSBoVHAgIFBvaW50ZXIgdG8gYSB0cmFuc3BvcnQgZGVjb2RlciBoYW5kbGUuCiAgKiBccmV0dXJuICAgICBUaGUgdHJhbnNwb3J0IGZvcm1hdC4KICAqLwotVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0RGVjX0dldEZvcm1hdCAoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwICk7CitUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnREZWNfR2V0Rm9ybWF0KGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKTsKIAogLyoqCiAgKiBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IGJ1ZmZlciBmdWxsbmVzcyB2YWx1ZS4KQEAgLTQwOSw2MCArNTIzLDc2IEBACiAgKgogICogXHJldHVybiAgICAgICAgQnVmZmVyIGZ1bGxuZXNzCiAgKi8KLUlOVCB0cmFuc3BvcnREZWNfR2V0QnVmZmVyRnVsbG5lc3MoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwICk7CitJTlQgdHJhbnNwb3J0RGVjX0dldEJ1ZmZlckZ1bGxuZXNzKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgQ2xvc2UgYW5kIGRlYWxsb2NhdGUgdHJhbnNwb3J0RGVjLgogICogXHBhcmFtIHBoVHAgIFBvaW50ZXIgdG8gYSBwcmV2aW91c2x5IGFsbG9jYXRlZCB0cmFuc3BvcnQgZGVjb2RlciBoYW5kbGUuCiAgKiBccmV0dXJuICAgICAgdm9pZAogICovCi12b2lkIHRyYW5zcG9ydERlY19DbG9zZSAoIEhBTkRMRV9UUkFOU1BPUlRERUMgKnBoVHAgKTsKK3ZvaWQgdHJhbnNwb3J0RGVjX0Nsb3NlKEhBTkRMRV9UUkFOU1BPUlRERUMgKnBoVHApOwogCiAvKioKICAqIFxicmllZiAgICAgICAgIFJlYWQgb25lIGFjY2VzcyB1bml0IGZyb20gdGhlIHRyYW5zcG9ydERlYyBtZWRpdW0uCiAgKiBccGFyYW0gaFRwICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0RGVjLgotICogXHBhcmFtIGxlbmd0aCAgT24gcmV0dXJuLCB0aGlzIHZhbHVlIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIGFjdHVhbCBhY2Nlc3MgdW5pdCBsZW5ndGggaW4gYml0cy4KLSAqICAgICAgICAgICAgICAgIFNldCB0byAtMSBpZiBsZW5ndGggaXMgdW5rbm93bi4KKyAqIFxwYXJhbSBsZW5ndGggIE9uIHJldHVybiwgdGhpcyB2YWx1ZSBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBhY3R1YWwgYWNjZXNzCisgKiB1bml0IGxlbmd0aCBpbiBiaXRzLiBTZXQgdG8gLTEgaWYgbGVuZ3RoIGlzIHVua25vd24uCiAgKiBccmV0dXJuICAgICAgICBFcnJvciBjb2RlLgogICovCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX1JlYWRBY2Nlc3NVbml0ICggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IFVJTlQgbGF5ZXIgKTsKK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfUmVhZEFjY2Vzc1VuaXQoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGF5ZXIpOwogCiAvKioKLSAqIFxicmllZiBHZXQgdGhlIHJlbWFpbmluZyBhbW91bnQgb2YgYml0cyBvZiB0aGUgY3VycmVudCBhY2Nlc3MgdW5pdC4gVGhlIHJlc3VsdAotICogICAgICAgIGNhbiBiZSBiZWxvdyB6ZXJvLCBtZWFuaW5nIHRoYXQgdG9vIG1hbnkgYml0cyBoYXZlIGJlZW4gcmVhZC4KKyAqIFxicmllZiAgICAgICAgICBHZXQgQXVkaW9TcGVjaWZpY0NvbmZpZy4KKyAqIFxwYXJhbSBoVHAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0RGVjLgorICogXHBhcmFtIGxheWVyICAgIFRyYW5zcG9ydCBsYXllci4KKyAqIFxwYXJhbSBhc2MgICAgICBQb2ludGVyIHRvIEF1ZGlvU3BlY2lmaWNDb25maWcuCisgKiBccmV0dXJuICAgICAgICAgRXJyb3IgY29kZS4KKyAqLworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19HZXRBc2MoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MpOworCisvKioKKyAqIFxicmllZiBHZXQgdGhlIHJlbWFpbmluZyBhbW91bnQgb2YgYml0cyBvZiB0aGUgY3VycmVudCBhY2Nlc3MgdW5pdC4gVGhlCisgKiByZXN1bHQgY2FuIGJlIGJlbG93IHplcm8sIG1lYW5pbmcgdGhhdCB0b28gbWFueSBiaXRzIGhhdmUgYmVlbiByZWFkLgogICogXHBhcmFtIGhUcCAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydERlYy4KICAqIFxyZXR1cm4gYW1vdW50IG9mIHJlbWFpbmluZyBiaXRzLgogICovCi1JTlQgdHJhbnNwb3J0RGVjX0dldEF1Qml0c1JlbWFpbmluZyggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IFVJTlQgbGF5ZXIgKTsKK0lOVCB0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsYXllcik7CiAKIC8qKgogICogXGJyaWVmIEdldCB0aGUgdG90YWwgYW1vdW50IG9mIGJpdHMgb2YgdGhlIGN1cnJlbnQgYWNjZXNzIHVuaXQuCiAgKiBccGFyYW0gaFRwICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0RGVjLgogICogXHJldHVybiBhbW91bnQgb2YgdG90YWwgYml0cy4KICAqLwotSU5UIHRyYW5zcG9ydERlY19HZXRBdUJpdHNUb3RhbCggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IFVJTlQgbGF5ZXIgKTsKK0lOVCB0cmFuc3BvcnREZWNfR2V0QXVCaXRzVG90YWwoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGF5ZXIpOwogCiAvKioKLSAqIFxicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGRlY29kZXIgaGFzIGZpbmlzaGVkIHBhcnNpbmcKLSAqICAgICAgICAgICAgIG9uZSBBY2Nlc3MgVW5pdCBmb3IgYml0c3RyZWFtIGhvdXNla2VlcGluZy4KKyAqIFxicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGRlY29kZXIgaGFzCisgKiBmaW5pc2hlZCBwYXJzaW5nIG9uZSBBY2Nlc3MgVW5pdCBmb3IgYml0c3RyZWFtIGhvdXNla2VlcGluZy4KICAqIFxwYXJhbSBoVHAgIFRyYW5zcG9ydCBIYW5kbGUuCiAgKiBccmV0dXJuICAgICBFcnJvciBjb2RlLgogICovCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0VuZEFjY2Vzc1VuaXQgKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCApOworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19FbmRBY2Nlc3NVbml0KGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKTsKIAogLyoqCi0gKiBcYnJpZWYgICAgICBPYnRhaW4gdGhlIGFtb3VudCBvZiBtaXNzaW5nIGFjY2VzcyB1bml0cyBpZiBhcHBsaWNhYmxlIGluIGNhc2Ugb2YgCi0gKiAgICAgICAgICAgICBhIGJpdCBzdHJlYW0gc3luY2hyb25pemF0aW9uIGVycm9yLiBFYWNoIHRpbWUgdHJhbnNwb3J0RGVjX1JlYWRBY2Nlc3NVbml0KCkKLSAqICAgICAgICAgICAgIHJldHVybnMgVFJBTlNQT1JUREVDX1NZTkNfRVJST1IgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHRvIHJldHJpZXZlIGFuIGVzdGltYXRlCi0gKiAgICAgICAgICAgICBvZiB0aGUgYW1vdW50IG9mIG1pc3NpbmcgYWNjZXNzIHVuaXRzLiBUaGlzIHdvcmtzIG9ubHkgaW4gY2FzZSBvZiBjb25zdGFudCBhdmVyYWdlCi0gKiAgICAgICAgICAgICBiaXQgcmF0ZSAoaGFzIHRvIGJlIGtub3duKSBhbmQgaWYgdGhlIHBhcmFtZXRlciBUUERFQ19QQVJBTV9TRVRfQklUUkFURSBoYXMgYmVlbiBzZXQKLSAqICAgICAgICAgICAgIGFjY29yZGluZ2x5LgorICogXGJyaWVmICAgICAgT2J0YWluIHRoZSBhbW91bnQgb2YgbWlzc2luZyBhY2Nlc3MgdW5pdHMgaWYgYXBwbGljYWJsZSBpbiBjYXNlCisgKiBvZiBhIGJpdCBzdHJlYW0gc3luY2hyb25pemF0aW9uIGVycm9yLiBFYWNoIHRpbWUKKyAqIHRyYW5zcG9ydERlY19SZWFkQWNjZXNzVW5pdCgpIHJldHVybnMgVFJBTlNQT1JUREVDX1NZTkNfRVJST1IKKyAqIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB0byByZXRyaWV2ZSBhbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50CisgKiBvZiBtaXNzaW5nIGFjY2VzcyB1bml0cy4gVGhpcyB3b3JrcyBvbmx5IGluIGNhc2Ugb2YgY29uc3RhbnQKKyAqIGF2ZXJhZ2UgYml0IHJhdGUgKGhhcyB0byBiZSBrbm93bikgYW5kIGlmIHRoZSBwYXJhbWV0ZXIKKyAqIFRQREVDX1BBUkFNX1NFVF9CSVRSQVRFIGhhcyBiZWVuIHNldCBhY2NvcmRpbmdseS4KICAqIFxwYXJhbSBoVHAgIFRyYW5zcG9ydCBIYW5kbGUuCi0gKiBccGFyYW0gcE5BY2Nlc3NVbml0cyBwb2ludGVyIHRvIGEgbWVtb3J5IGxvY2F0aW9uIHdoZXJlIHRoZSBlc3RpbWF0ZWQgbG9zdCBmcmFtZSBjb3VudCB3aWxsIGJlIHN0b3JlZCBpbnRvLiAgICAgIAorICogXHBhcmFtIHBOQWNjZXNzVW5pdHMgcG9pbnRlciB0byBhIG1lbW9yeSBsb2NhdGlvbiB3aGVyZSB0aGUgZXN0aW1hdGVkIGxvc3QKKyAqIGZyYW1lIGNvdW50IHdpbGwgYmUgc3RvcmVkIGludG8uCiAgKiBccmV0dXJuICAgICBFcnJvciBjb2RlLgogICovCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0dldE1pc3NpbmdBY2Nlc3NVbml0Q291bnQgKCBJTlQgKnBOQWNjZXNzVW5pdHMsIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwICk7Ci0KK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfR2V0TWlzc2luZ0FjY2Vzc1VuaXRDb3VudCgKKyAgICBJTlQgKnBOQWNjZXNzVW5pdHMsIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgIFNldCBhIGdpdmVuIHNldHRpbmcuCkBAIC00NzEsMzUgKzYwMSwzNiBAQAogICogXHBhcmFtIHZhbHVlICBWYWx1ZSBmb3IgdGhlIHBhcmFtZXRlciB0byBiZSBjaGFuZ2VkLgogICogXHJldHVybiAgICAgICBFcnJvciBjb2RlLgogICovCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX1NldFBhcmFtICggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFBERUNfUEFSQU0gICAgICAgICBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHZhbHVlICk7CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX1NldFBhcmFtKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUUERFQ19QQVJBTSBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHZhbHVlKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgIEdldCBudW1iZXIgb2Ygc3ViZnJhbWVzIChmb3IgTEFUTSBvciBBRFRTKQogICogXHBhcmFtIGhUcCAgICBUcmFuc3BvcnQgSGFuZGxlLgotICogXHJldHVybiAgICAgICBOdW1iZXIgb2YgQURUUy9MQVRNIHN1YmZyYW1lcyAocmV0dXJuIDEgZm9yIGFsbCBvdGhlciB0cmFuc3BvcnQgdHlwZXMpLgorICogXHJldHVybiAgICAgICBOdW1iZXIgb2YgQURUUy9MQVRNIHN1YmZyYW1lcyAocmV0dXJuIDEgZm9yIGFsbCBvdGhlciB0cmFuc3BvcnQKKyAqIHR5cGVzKS4KICAqLwogVUlOVCB0cmFuc3BvcnREZWNfR2V0TnJPZlN1YkZyYW1lcyhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCk7CiAKLQogLyoqCiAgKiBcYnJpZWYgICAgICAgR2V0IGluZm8gc3RydWN0dXJlIG9mIHRyYW5zcG9ydCBkZWNvZGVyIGxpYnJhcnkuCiAgKiBccGFyYW0gaW5mbyAgQSBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3QuCiAgKiBccmV0dXJuICAgICAgRXJyb3IgY29kZS4KICAqLwotVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19HZXRMaWJJbmZvKCBMSUJfSU5GTyAqaW5mbyApOworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19HZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKTsKIAogLyogQURUUyBDUkMgc3VwcG9ydCAqLwogCiAvKioKICAqIFxicmllZiAgICAgICAgU2V0IGN1cnJlbnQgYml0c3RyZWFtIHBvc2l0aW9uIGFzIHN0YXJ0IG9mIGEgbmV3IGRhdGEgcmVnaW9uLgogICogXHBhcmFtIGhUcCAgICBUcmFuc3BvcnQgaGFuZGxlLgotICogXHBhcmFtIG1CaXRzICBTaXplIGluIGJpdHMgb2YgdGhlIGRhdGEgcmVnaW9uLiBTZXQgdG8gMCBpZiBpdCBzaG91bGQgbm90IGJlIG9mIGEgZml4ZWQgc2l6ZS4KLSAqIFxyZXR1cm4gICAgICAgRGF0YSByZWdpb24gSUQsIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gY2FsbGluZyB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKCkuCisgKiBccGFyYW0gbUJpdHMgIFNpemUgaW4gYml0cyBvZiB0aGUgZGF0YSByZWdpb24uIFNldCB0byAwIGlmIGl0IHNob3VsZCBub3QgYmUKKyAqIG9mIGEgZml4ZWQgc2l6ZS4KKyAqIFxyZXR1cm4gICAgICAgRGF0YSByZWdpb24gSUQsIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gY2FsbGluZworICogdHJhbnNwb3J0RGVjX0NyY0VuZFJlZygpLgogICovCi1pbnQgdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnICggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1CaXRzICk7CitpbnQgdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBjb25zdCBJTlQgbUJpdHMpOwogCiAvKioKICAqIFxicmllZiAgICAgICAgU2V0IGVuZCBvZiBkYXRhIHJlZ2lvbi4KQEAgLTUwNywxNSArNjM4LDI3IEBACiAgKiBccGFyYW0gcmVnICAgIERhdGEgcmVnaW9uIElELCBvcGJ0YWluZWQgZnJvbSB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcoKS4KICAqIFxyZXR1cm4gICAgICAgdm9pZAogICovCi12b2lkIHRyYW5zcG9ydERlY19DcmNFbmRSZWcgKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCByZWcgKTsKK3ZvaWQgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgSU5UIHJlZyk7CiAKIC8qKgotICogXGJyaWVmICAgICAgQ2FsY3VsYXRlIEFEVFMgY3JjIGFuZCBjaGVjayBpZiBpdCBpcyBjb3JyZWN0LiBUaGUgQURUUyBjaGVja3N1bSBpcyBoZWxkIGludGVybmFsbHkuCisgKiBcYnJpZWYgICAgICBDYWxjdWxhdGUgQURUUyBjcmMgYW5kIGNoZWNrIGlmIGl0IGlzIGNvcnJlY3QuIFRoZSBBRFRTIGNoZWNrc3VtCisgKiBpcyBoZWxkIGludGVybmFsbHkuCiAgKiBccGFyYW0gaFRwICBUcmFuc3BvcnQgaGFuZGxlLgotICogXHJldHVybiAgICAgUmV0dXJuIFRSQU5TUE9SVERFQ19PSyBpZiB0aGUgQ1JDIGlzIG9rLCBvciBlcnJvciBpZiBDUkMgaXMgbm90IGNvcnJlY3QuCisgKiBccmV0dXJuICAgICBSZXR1cm4gVFJBTlNQT1JUREVDX09LIGlmIHRoZSBDUkMgaXMgb2ssIG9yIGVycm9yIGlmIENSQyBpcyBub3QKKyAqIGNvcnJlY3QuCiAgKi8KLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfQ3JjQ2hlY2sgKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCApOworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19DcmNDaGVjayhjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCk7CiAKKy8qKgorICogXGJyaWVmIE9ubHkgY2hlY2sgd2hldGhlciBhIGdpdmVuIGNvbmZpZyBzZWVtcyB0byBiZSB2YWxpZCB3aXRob3V0IG1vZGlmeWluZworICogaW50ZXJuYWwgc3RhdGVzLgorICoKKyAqIFxwYXJhbSBjb25mICAgIFVDSEFSIGJ1ZmZlciBvZiB0aGUgYmluYXJ5IGNvZGVkIGNvbmZpZyAoU0RDIHR5cGUgOSkuCisgKiBccGFyYW0gbGVuZ3RoICBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjb25mIGJ1ZmZlci4KKyAqCisgKiBccmV0dXJuICAgICAgICBFcnJvciBjb2RlLgorICovCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0RybVJhd1NkY0F1ZGlvQ29uZmlnX0NoZWNrKFVDSEFSICpjb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCk7CiAKLSNlbmRpZiAvKiAjaWZuZGVmIF9fVFBERUNfTElCX0hfXyAqLworI2VuZGlmIC8qICNpZm5kZWYgVFBERUNfTElCX0ggKi8KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvbXBlZ0ZpbGVGb3JtYXQuaCBiL2xpYk1wZWdUUERlYy9zcmMvbXBlZ0ZpbGVGb3JtYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjZmU5ZS4uMDAwMDAwMAotLS0gYS9saWJNcGVnVFBEZWMvc3JjL21wZWdGaWxlRm9ybWF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOiAgIE9saXZlciBNb3NlcgotICAgRGVzY3JpcHRpb246IGJpdHN0cmVhbSBmb3JtYXQgZGV0ZWN0aW9uIHJvdXRpbmVzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmICFkZWZpbmVkKF9fQklUU1RSRUFNX0ZPUk1BVF9IX18pCi0jZGVmaW5lIF9fQklUU1RSRUFNX0ZPUk1BVF9IX18KLQotI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgotI2luY2x1ZGUgIkZES19hdWRpby5oIgotCi0vKioKLSAqIFxicmllZiBUcnkgdG8gZmluZCBvdXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUsIGdpdmVuIHRoZSBmZXcgZmlyc3QgYnl0ZXMuCi0gKiBccGFyYW0gZmlsZURhdGEgcG9pbnRlciB0byBhIGJ1ZmZlciBob2xkaW5nIHRoZSBmaXJzdCBieXRlcyBvZiBhIGZpbGUuCi0gKiBccGFyYW0gcEF1IHBvaW50ZXIgdG8gVUNIQVIqLCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBBVSBmb3VuZCBvciBOVUxMLgotICogXHBhcmFtIGxlbmd0aCBwb2ludGVyIHRvIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBmaWxlRGF0YS4gUmV0dXJuIGxlbmd0aCBvZiBmaXJzdCBBVS4KLSAqIFxyZXR1cm4gdGhlIGRldGVjdGVkIGZpbGUgZm9ybWF0LCBvciBGRl9VTktOT1dOIGluIGNhc2Ugb2YgZmFpbHVyZS4KLSAqLwotRklMRV9GT1JNQVQgR2V0RmlsZUZvcm1hdChVQ0hBUiAqZmlsZURhdGEsIFVDSEFSICoqcEF1LCBVSU5UICpsZW5ndGgpOwotCi0vKioKLSAqIFxicmllZiBUcnkgdG8gZmluZCBvdXQgdGhlIHRyYW5zcG9ydCB0eXBlIGNvbnRhaW5lZCBpbiBhIGdpdmVuIGZpbGUuCi0gKiBccGFyYW0gZmlsZW5hbWUgbmFtZSBvZiB0aGUgZmlsZSB0byBiZSBhbmFseXNlZC4KLSAqIFxwYXJhbSBmaWxlRm9ybWF0IHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB3aGVyZSB0aGUgZGV0ZWN0ZWQgZmlsZSBmb3JtYXQgaXMgc3RvcmVkIGludG8uCi0gKiBccmV0dXJuIHRoZSBkZXRlY3RlZCB0cmFuc3BvcnQgdHlwZSBvciBUVF9VTktOT1dOIGluIGNhc2Ugb2YgZmFpbHVyZS4KLSAqLwotVFJBTlNQT1JUX1RZUEUgR2V0VHJhbnNwb3J0VHlwZShjb25zdCBjaGFyKiBmaWxlbmFtZSwgRklMRV9GT1JNQVQgKmZpbGVGb3JtYXQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvdHBfdmVyc2lvbi5oIGIvbGliTXBlZ1RQRGVjL3NyYy90cF92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhZWQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYk1wZWdUUERlYy9zcmMvdHBfdmVyc2lvbi5oCkBAIC0wLDAgKzEsMTE4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChUUF9WRVJTSU9OX0gpCisjZGVmaW5lIFRQX1ZFUlNJT05fSAorCisvKiBsaWJyYXJ5IGluZm8gKi8KKyNkZWZpbmUgVFBfTElCX1ZMMCAzCisjZGVmaW5lIFRQX0xJQl9WTDEgMAorI2RlZmluZSBUUF9MSUJfVkwyIDAKKyNkZWZpbmUgVFBfTElCX1RJVExFICJNUEVHIFRyYW5zcG9ydCIKKyNpZmRlZiBfX0FORFJPSURfXworI2RlZmluZSBUUF9MSUJfQlVJTERfREFURSAiIgorI2RlZmluZSBUUF9MSUJfQlVJTERfVElNRSAiIgorI2Vsc2UKKyNkZWZpbmUgVFBfTElCX0JVSUxEX0RBVEUgX19EQVRFX18KKyNkZWZpbmUgVFBfTElCX0JVSUxEX1RJTUUgX19USU1FX18KKyNlbmRpZgorI2VuZGlmIC8qICFkZWZpbmVkKFRQX1ZFUlNJT05fSCkgKi8KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYWRpZi5jcHAgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkaWYuY3BwCmluZGV4IDIzN2U4ODEuLmVjMjBiOWIgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYWRpZi5jcHAKKysrIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyNyArOTAsMjQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IEFESUYgcmVhZGVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0cGRlY19hZGlmLmgiCiAKLQogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCi1UUkFOU1BPUlRERUNfRVJST1IgYWRpZlJlYWRfRGVjb2RlSGVhZGVyKAotICAgICAgICBDQWRpZkhlYWRlciAgICAgICAgICAqcEFkaWZIZWFkZXIsCi0gICAgICAgIENQcm9ncmFtQ29uZmlnICAgICAgICpwUGNlLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMKLSAgICAgICAgKQoteworVFJBTlNQT1JUREVDX0VSUk9SIGFkaWZSZWFkX0RlY29kZUhlYWRlcihDQWRpZkhlYWRlciAqcEFkaWZIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQcm9ncmFtQ29uZmlnICpwUGNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicykgewogICBpbnQgaTsKICAgVFJBTlNQT1JUREVDX0VSUk9SIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX09LOwogICBVSU5UIHN0YXJ0QW5jaG9yID0gRkRLZ2V0VmFsaWRCaXRzKGJzKTsKQEAgLTEwOCw0MSArMTE2LDM5IEBACiAgICAgcmV0dXJuIChUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTKTsKICAgfQogCi0gIGlmIChGREtyZWFkQml0cyhicyw4KSAhPSAnQScpIHsKKyAgaWYgKEZES3JlYWRCaXRzKGJzLCA4KSAhPSAnQScpIHsKICAgICByZXR1cm4gKFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SKTsKICAgfQotICBpZiAoRkRLcmVhZEJpdHMoYnMsOCkgIT0gJ0QnKSB7CisgIGlmIChGREtyZWFkQml0cyhicywgOCkgIT0gJ0QnKSB7CiAgICAgcmV0dXJuIChUUkFOU1BPUlRERUNfU1lOQ19FUlJPUik7CiAgIH0KLSAgaWYgKEZES3JlYWRCaXRzKGJzLDgpICE9ICdJJykgeworICBpZiAoRkRLcmVhZEJpdHMoYnMsIDgpICE9ICdJJykgewogICAgIHJldHVybiAoVFJBTlNQT1JUREVDX1NZTkNfRVJST1IpOwogICB9Ci0gIGlmIChGREtyZWFkQml0cyhicyw4KSAhPSAnRicpIHsKKyAgaWYgKEZES3JlYWRCaXRzKGJzLCA4KSAhPSAnRicpIHsKICAgICByZXR1cm4gKFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SKTsKICAgfQogCi0gIGlmICggKHBBZGlmSGVhZGVyLT5Db3B5cmlnaHRJZFByZXNlbnQgPSBGREtyZWFkQml0cyhicywxKSkgIT0gMCApCi0gICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsNzIpOyAgLyogQ29weXJpZ2h0SWQgKi8KKyAgaWYgKChwQWRpZkhlYWRlci0+Q29weXJpZ2h0SWRQcmVzZW50ID0gRkRLcmVhZEJpdHMoYnMsIDEpKSAhPSAwKQorICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCA3Mik7IC8qIENvcHlyaWdodElkICovCiAKLQotICBwQWRpZkhlYWRlci0+T3JpZ2luYWxDb3B5ID0gRkRLcmVhZEJpdHMoYnMsMSk7Ci0gIHBBZGlmSGVhZGVyLT5Ib21lID0gRkRLcmVhZEJpdHMoYnMsMSk7Ci0gIHBBZGlmSGVhZGVyLT5CaXRzdHJlYW1UeXBlID0gRkRLcmVhZEJpdHMoYnMsMSk7CisgIHBBZGlmSGVhZGVyLT5PcmlnaW5hbENvcHkgPSBGREtyZWFkQml0cyhicywgMSk7CisgIHBBZGlmSGVhZGVyLT5Ib21lID0gRkRLcmVhZEJpdHMoYnMsIDEpOworICBwQWRpZkhlYWRlci0+Qml0c3RyZWFtVHlwZSA9IEZES3JlYWRCaXRzKGJzLCAxKTsKIAogICAvKiBwQWRpZkhlYWRlci0+Qml0UmF0ZSA9IEZES3JlYWRCaXRzKGJzLCAyMyk7ICovCi0gIHBBZGlmSGVhZGVyLT5CaXRSYXRlID0gRkRLcmVhZEJpdHMoYnMsMTYpOworICBwQWRpZkhlYWRlci0+Qml0UmF0ZSA9IEZES3JlYWRCaXRzKGJzLCAxNik7CiAgIHBBZGlmSGVhZGVyLT5CaXRSYXRlIDw8PSA3OwotICBwQWRpZkhlYWRlci0+Qml0UmF0ZSB8PSBGREtyZWFkQml0cyhicyw3KTsKKyAgcEFkaWZIZWFkZXItPkJpdFJhdGUgfD0gRkRLcmVhZEJpdHMoYnMsIDcpOwogCi0gIHBBZGlmSGVhZGVyLT5OdW1Qcm9ncmFtQ29uZmlnRWxlbWVudHMgPSBGREtyZWFkQml0cyhicyw0KSArIDE7CisgIHBBZGlmSGVhZGVyLT5OdW1Qcm9ncmFtQ29uZmlnRWxlbWVudHMgPSBGREtyZWFkQml0cyhicywgNCkgKyAxOwogCiAgIGlmIChwQWRpZkhlYWRlci0+Qml0c3RyZWFtVHlwZSA9PSAwKSB7Ci0gICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsMjApOyAgLyogYWRpZl9idWZmZXJfZnVsbG5lc3MgKi8KKyAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgMjApOyAvKiBhZGlmX2J1ZmZlcl9mdWxsbmVzcyAqLwogICB9CiAKICAgLyogUGFyc2UgYWxsIFBDRXMgYnV0IGtlZXAgb25seSBvbmUgKi8KLSAgZm9yIChpPTA7IGkgPCBwQWRpZkhlYWRlci0+TnVtUHJvZ3JhbUNvbmZpZ0VsZW1lbnRzOyBpKyspCi0gIHsKKyAgZm9yIChpID0gMDsgaSA8IHBBZGlmSGVhZGVyLT5OdW1Qcm9ncmFtQ29uZmlnRWxlbWVudHM7IGkrKykgewogICAgIENQcm9ncmFtQ29uZmlnX1JlYWQocFBjZSwgYnMsIHN0YXJ0QW5jaG9yKTsKICAgfQogCkBAIC0xNTAsNiArMTU2LDMgQEAKIAogICByZXR1cm4gKEVycm9yU3RhdHVzKTsKIH0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYWRpZi5oIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmgKaW5kZXggZDY3ODBhNy4uNzJjY2M2YSAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmgKKysrIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjQgKzkwLDI0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBBRElGIHJlYWRlcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFRQREVDX0FESUZfSAogI2RlZmluZSBUUERFQ19BRElGX0gKIAogI2luY2x1ZGUgInRwZGVjX2xpYi5oIgogCi0jZGVmaW5lIE1JTl9BRElGX0hFQURFUkxFTkdUSCAgNjMgIC8qIGluIGJpdHMgKi8KKyNkZWZpbmUgTUlOX0FESUZfSEVBREVSTEVOR1RIIDYzIC8qIGluIGJpdHMgKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgSU5UIE51bVByb2dyYW1Db25maWdFbGVtZW50czsKICAgVUlOVCBCaXRSYXRlOwogICBVQ0hBUiBDb3B5cmlnaHRJZFByZXNlbnQ7CkBAIC0xMDYsMTggKzExNywxOCBAQAogfSBDQWRpZkhlYWRlcjsKIAogLyoqCi0gKiBcYnJpZWYgUGFyc2UgYSBBRElGIGhlYWRlciBhdCB0aGUgZ2l2ZW4gYml0c3RyZWFtIGFuZCBzdG9yZSB0aGUgcGFyc2VkIGRhdGEgaW50byBhIGdpdmVuIENBZGlmSGVhZGVyCi0gKiAgICAgICAgYW5kIENQcm9ncmFtQ29uZmlnIHN0cnVjdAorICogXGJyaWVmIFBhcnNlIGEgQURJRiBoZWFkZXIgYXQgdGhlIGdpdmVuIGJpdHN0cmVhbSBhbmQgc3RvcmUgdGhlIHBhcnNlZCBkYXRhCisgKiBpbnRvIGEgZ2l2ZW4gQ0FkaWZIZWFkZXIgYW5kIENQcm9ncmFtQ29uZmlnIHN0cnVjdAogICoKLSAqIFxwYXJhbSBwQWRpZkhlYWRlciBwb2ludGVyIHRvIGEgQ0FkaWZIZWFkZXIgc3RydWN0dXJlIHRvIGhvbGQgdGhlIHBhcnNlZCBBRElGIGhlYWRlciBkYXRhLgotICogXHBhcmFtIHBQY2UgcG9pbnRlciB0byBhIENQcm9ncmFtQ29uZmlnIHN0cnVjdHVyZSB3aGVyZSB0aGUgbGFzdCBQQ0Ugd2lsbCByZW1haW4uCisgKiBccGFyYW0gcEFkaWZIZWFkZXIgcG9pbnRlciB0byBhIENBZGlmSGVhZGVyIHN0cnVjdHVyZSB0byBob2xkIHRoZSBwYXJzZWQgQURJRgorICogaGVhZGVyIGRhdGEuCisgKiBccGFyYW0gcFBjZSBwb2ludGVyIHRvIGEgQ1Byb2dyYW1Db25maWcgc3RydWN0dXJlIHdoZXJlIHRoZSBsYXN0IFBDRSB3aWxsCisgKiByZW1haW4uCiAgKgogICogXHJldHVybiBUUkFOU1BPUlRERUNfRVJST1IgZXJyb3IgY29kZQogICovCi1UUkFOU1BPUlRERUNfRVJST1IgYWRpZlJlYWRfRGVjb2RlSGVhZGVyKAotICAgICAgICBDQWRpZkhlYWRlciAgICAgICAgICpwQWRpZkhlYWRlciwKLSAgICAgICAgQ1Byb2dyYW1Db25maWcgICAgICAqcFBjZSwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMKLSAgICAgICAgKTsKK1RSQU5TUE9SVERFQ19FUlJPUiBhZGlmUmVhZF9EZWNvZGVIZWFkZXIoQ0FkaWZIZWFkZXIgKnBBZGlmSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUHJvZ3JhbUNvbmZpZyAqcFBjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpOwogCiAjZW5kaWYgLyogVFBERUNfQURJRl9IICovCmRpZmYgLS1naXQgYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkdHMuY3BwIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZHRzLmNwcAppbmRleCBjNDU1NjgxLi42ZGMwMjc1IDEwMDY0NAotLS0gYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkdHMuY3BwCisrKyBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYWR0cy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksOTYgKzkwLDgzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBBRFRTIGludGVyZmFjZQogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidHBkZWNfYWR0cy5oIgogCi0KICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKLQotCi12b2lkIGFkdHNSZWFkX0NyY0luaXQoSEFORExFX0FEVFMgcEFkdHMpIC8qITwgcG9pbnRlciB0byBhZHRzIGNyYyBpbmZvIHN0dWN0dXJlICovCit2b2lkIGFkdHNSZWFkX0NyY0luaXQoCisgICAgSEFORExFX0FEVFMgcEFkdHMpIC8qITwgcG9pbnRlciB0byBhZHRzIGNyYyBpbmZvIHN0dWN0dXJlICovCiB7CiAgIEZES2NyY0luaXQoJnBBZHRzLT5jcmNJbmZvLCAweDgwMDUsIDB4RkZGRiwgMTYpOwogfQogCiBpbnQgYWR0c1JlYWRfQ3JjU3RhcnRSZWcoCi0gICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQURUUyBwQWR0cywgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGFkdHMgc3R1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAvKiE8IGhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbUJpdHMgICAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgYml0cyBpbiBjcmMgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICAgKQoteworICAgIEhBTkRMRV9BRFRTIHBBZHRzLCAgICAgICAgLyohPCBwb2ludGVyIHRvIGFkdHMgc3R1Y3R1cmUgKi8KKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgbUJpdHMgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGJpdHMgaW4gY3JjIHJlZ2lvbiAqLworKSB7CiAgIGlmIChwQWR0cy0+YnMucHJvdGVjdGlvbl9hYnNlbnQpIHsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIHJldHVybiAoIEZES2NyY1N0YXJ0UmVnKCZwQWR0cy0+Y3JjSW5mbywgaEJzLCBtQml0cykgKTsKLQorICByZXR1cm4gKEZES2NyY1N0YXJ0UmVnKCZwQWR0cy0+Y3JjSW5mbywgaEJzLCBtQml0cykpOwogfQogCiB2b2lkIGFkdHNSZWFkX0NyY0VuZFJlZygKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsIC8qITwgcG9pbnRlciB0byBhZHRzIGNyYyBpbmZvIHN0dWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAvKiE8IGhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgIGludCByZWcgICAgICAgICAgICAgICAgICAgIC8qITwgY3JjIHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgKQotewotICBpZiAocEFkdHMtPmJzLnByb3RlY3Rpb25fYWJzZW50ID09IDApCi0gIHsKKyAgICBIQU5ETEVfQURUUyBwQWR0cywgICAgICAgIC8qITwgcG9pbnRlciB0byBhZHRzIGNyYyBpbmZvIHN0dWN0dXJlICovCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAvKiE8IGhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlICovCisgICAgaW50IHJlZyAgICAgICAgICAgICAgICAgICAvKiE8IGNyYyByZWdpb24gKi8KKykgeworICBpZiAocEFkdHMtPmJzLnByb3RlY3Rpb25fYWJzZW50ID09IDApIHsKICAgICBGREtjcmNFbmRSZWcoJnBBZHRzLT5jcmNJbmZvLCBoQnMsIHJlZyk7CiAgIH0KIH0KIAotVFJBTlNQT1JUREVDX0VSUk9SIGFkdHNSZWFkX0NyY0NoZWNrKCBIQU5ETEVfQURUUyBwQWR0cyApCi17CitUUkFOU1BPUlRERUNfRVJST1IgYWR0c1JlYWRfQ3JjQ2hlY2soSEFORExFX0FEVFMgcEFkdHMpIHsKICAgVFJBTlNQT1JUREVDX0VSUk9SIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX09LOwogICBVU0hPUlQgY3JjOwogCi0gIGlmIChwQWR0cy0+YnMucHJvdGVjdGlvbl9hYnNlbnQpCi0gICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKKyAgaWYgKHBBZHRzLT5icy5wcm90ZWN0aW9uX2Fic2VudCkgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKIAogICBjcmMgPSBGREtjcmNHZXRDUkMoJnBBZHRzLT5jcmNJbmZvKTsKLSAgaWYgKGNyYyAhPSBwQWR0cy0+Y3JjUmVhZFZhbHVlKQotICB7CisgIGlmIChjcmMgIT0gcEFkdHMtPmNyY1JlYWRWYWx1ZSkgewogICAgIHJldHVybiAoVFJBTlNQT1JUREVDX0NSQ19FUlJPUik7CiAgIH0KIAogICByZXR1cm4gKEVycm9yU3RhdHVzKTsKIH0KIAorI2RlZmluZSBBZHRzX0xlbmd0aF9TeW5jV29yZCAxMgorI2RlZmluZSBBZHRzX0xlbmd0aF9JZCAxCisjZGVmaW5lIEFkdHNfTGVuZ3RoX0xheWVyIDIKKyNkZWZpbmUgQWR0c19MZW5ndGhfUHJvdGVjdGlvbkFic2VudCAxCisjZGVmaW5lIEFkdHNfTGVuZ3RoX1Byb2ZpbGUgMgorI2RlZmluZSBBZHRzX0xlbmd0aF9TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4IDQKKyNkZWZpbmUgQWR0c19MZW5ndGhfUHJpdmF0ZUJpdCAxCisjZGVmaW5lIEFkdHNfTGVuZ3RoX0NoYW5uZWxDb25maWd1cmF0aW9uIDMKKyNkZWZpbmUgQWR0c19MZW5ndGhfT3JpZ2luYWxDb3B5IDEKKyNkZWZpbmUgQWR0c19MZW5ndGhfSG9tZSAxCisjZGVmaW5lIEFkdHNfTGVuZ3RoX0NvcHlyaWdodElkZW50aWZpY2F0aW9uQml0IDEKKyNkZWZpbmUgQWR0c19MZW5ndGhfQ29weXJpZ2h0SWRlbnRpZmljYXRpb25TdGFydCAxCisjZGVmaW5lIEFkdHNfTGVuZ3RoX0ZyYW1lTGVuZ3RoIDEzCisjZGVmaW5lIEFkdHNfTGVuZ3RoX0J1ZmZlckZ1bGxuZXNzIDExCisjZGVmaW5lIEFkdHNfTGVuZ3RoX051bWJlck9mUmF3RGF0YUJsb2Nrc0luRnJhbWUgMgorI2RlZmluZSBBZHRzX0xlbmd0aF9DcmNDaGVjayAxNgogCi0KLSNkZWZpbmUgQWR0c19MZW5ndGhfU3luY1dvcmQgICAgICAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBBZHRzX0xlbmd0aF9JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFkdHNfTGVuZ3RoX0xheWVyICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQWR0c19MZW5ndGhfUHJvdGVjdGlvbkFic2VudCAgICAgICAgICAgICAgMQotI2RlZmluZSBBZHRzX0xlbmd0aF9Qcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEFkdHNfTGVuZ3RoX1NhbXBsaW5nRnJlcXVlbmN5SW5kZXggICAgICAgIDQKLSNkZWZpbmUgQWR0c19MZW5ndGhfUHJpdmF0ZUJpdCAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBZHRzX0xlbmd0aF9DaGFubmVsQ29uZmlndXJhdGlvbiAgICAgICAgICAzCi0jZGVmaW5lIEFkdHNfTGVuZ3RoX09yaWdpbmFsQ29weSAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQWR0c19MZW5ndGhfSG9tZSAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBZHRzX0xlbmd0aF9Db3B5cmlnaHRJZGVudGlmaWNhdGlvbkJpdCAgICAxCi0jZGVmaW5lIEFkdHNfTGVuZ3RoX0NvcHlyaWdodElkZW50aWZpY2F0aW9uU3RhcnQgIDEKLSNkZWZpbmUgQWR0c19MZW5ndGhfRnJhbWVMZW5ndGggICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBBZHRzX0xlbmd0aF9CdWZmZXJGdWxsbmVzcyAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIEFkdHNfTGVuZ3RoX051bWJlck9mUmF3RGF0YUJsb2Nrc0luRnJhbWUgIDIKLSNkZWZpbmUgQWR0c19MZW5ndGhfQ3JjQ2hlY2sgICAgICAgICAgICAgICAgICAgICAxNgotCi1UUkFOU1BPUlRERUNfRVJST1IgYWR0c1JlYWRfRGVjb2RlSGVhZGVyKAotICAgICAgICBIQU5ETEVfQURUUyAgICAgICAgICAgcEFkdHMsCi0gICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzCi0gICAgICAgICkKLXsKK1RSQU5TUE9SVERFQ19FUlJPUiBhZHRzUmVhZF9EZWNvZGVIZWFkZXIoSEFORExFX0FEVFMgcEFkdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaWdub3JlQnVmZmVyRnVsbG5lc3MpIHsKICAgSU5UIGNyY1JlZzsKIAogICBJTlQgdmFsQml0czsKQEAgLTE3Nyw1OCArMTc1LDU4IEBACiAKICAgU1RSVUNUX0FEVFNfQlMgYnM7CiAKLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCiAgIENQcm9ncmFtQ29uZmlnIG9sZFBjZTsKICAgLyogU3RvcmUgdGhlIG9sZCBQQ0UgdGVtcG9yYXJpbHkuIE1heWJlIHdlJ2xsIG5lZWQgaXQgbGF0ZXIgaWYgd2UKICAgICAgaGF2ZSBjaGFubmVsQ29uZmlnPTAgYW5kIG5vIFBDRSBpbiB0aGlzIGZyYW1lLiAqLwogICBGREttZW1jcHkoJm9sZFBjZSwgJnBBc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50LCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsKLSNlbmRpZgogCiAgIHZhbEJpdHMgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKIAogICAvKiBhZHRzX2ZpeGVkX2hlYWRlciAqLwotICBicy5tcGVnX2lkICAgICAgICAgICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfSWQpOwotICBicy5sYXllciAgICAgICAgICAgICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfTGF5ZXIpOworICBicy5tcGVnX2lkID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9JZCk7CisgIGJzLmxheWVyID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9MYXllcik7CiAgIGJzLnByb3RlY3Rpb25fYWJzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9Qcm90ZWN0aW9uQWJzZW50KTsKLSAgYnMucHJvZmlsZSAgICAgICAgICAgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX1Byb2ZpbGUpOworICBicy5wcm9maWxlID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9Qcm9maWxlKTsKICAgYnMuc2FtcGxlX2ZyZXFfaW5kZXggPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX1NhbXBsaW5nRnJlcXVlbmN5SW5kZXgpOwotICBicy5wcml2YXRlX2JpdCAgICAgICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfUHJpdmF0ZUJpdCk7Ci0gIGJzLmNoYW5uZWxfY29uZmlnICAgID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9DaGFubmVsQ29uZmlndXJhdGlvbik7Ci0gIGJzLm9yaWdpbmFsICAgICAgICAgID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9PcmlnaW5hbENvcHkpOwotICBicy5ob21lICAgICAgICAgICAgICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfSG9tZSk7CisgIGJzLnByaXZhdGVfYml0ID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9Qcml2YXRlQml0KTsKKyAgYnMuY2hhbm5lbF9jb25maWcgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0NoYW5uZWxDb25maWd1cmF0aW9uKTsKKyAgYnMub3JpZ2luYWwgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX09yaWdpbmFsQ29weSk7CisgIGJzLmhvbWUgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0hvbWUpOwogCiAgIC8qIGFkdHNfdmFyaWFibGVfaGVhZGVyICovCi0gIGJzLmNvcHlyaWdodF9pZCAgICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfQ29weXJpZ2h0SWRlbnRpZmljYXRpb25CaXQpOwotICBicy5jb3B5cmlnaHRfc3RhcnQgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0NvcHlyaWdodElkZW50aWZpY2F0aW9uU3RhcnQpOwotICBicy5mcmFtZV9sZW5ndGggICAgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0ZyYW1lTGVuZ3RoKTsKLSAgYnMuYWR0c19mdWxsbmVzcyAgID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9CdWZmZXJGdWxsbmVzcyk7Ci0gIGJzLm51bV9yYXdfYmxvY2tzICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfTnVtYmVyT2ZSYXdEYXRhQmxvY2tzSW5GcmFtZSk7Ci0gIGJzLm51bV9wY2VfYml0cyAgICA9IDA7CisgIGJzLmNvcHlyaWdodF9pZCA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfQ29weXJpZ2h0SWRlbnRpZmljYXRpb25CaXQpOworICBicy5jb3B5cmlnaHRfc3RhcnQgPQorICAgICAgRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9Db3B5cmlnaHRJZGVudGlmaWNhdGlvblN0YXJ0KTsKKyAgYnMuZnJhbWVfbGVuZ3RoID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9GcmFtZUxlbmd0aCk7CisgIGJzLmFkdHNfZnVsbG5lc3MgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0J1ZmZlckZ1bGxuZXNzKTsKKyAgYnMubnVtX3Jhd19ibG9ja3MgPQorICAgICAgRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9OdW1iZXJPZlJhd0RhdGFCbG9ja3NJbkZyYW1lKTsKKyAgYnMubnVtX3BjZV9iaXRzID0gMDsKIAogICBhZHRzSGVhZGVyTGVuZ3RoID0gQURUU19IRUFERVJMRU5HVEg7CiAKICAgaWYgKCFicy5wcm90ZWN0aW9uX2Fic2VudCkgewogICAgIEZES2NyY1Jlc2V0KCZwQWR0cy0+Y3JjSW5mbyk7Ci0gICAgRkRLcHVzaEJhY2soaEJzLCA1Nik7ICAgLyogY29tcGxldGUgZml4ZWQgYW5kIHZhcmlhYmxlIGhlYWRlciEgKi8KKyAgICBGREtwdXNoQmFjayhoQnMsIDU2KTsgLyogY29tcGxldGUgZml4ZWQgYW5kIHZhcmlhYmxlIGhlYWRlciEgKi8KICAgICBjcmNSZWcgPSBGREtjcmNTdGFydFJlZygmcEFkdHMtPmNyY0luZm8sIGhCcywgMCk7CiAgICAgRkRLcHVzaEZvcihoQnMsIDU2KTsKICAgfQogCi0gIGlmICghIGJzLnByb3RlY3Rpb25fYWJzZW50ICYmIGJzLm51bV9yYXdfYmxvY2tzPjApIHsKLSAgICBmb3IgKGk9MDsgaTxicy5udW1fcmF3X2Jsb2NrczsgaSsrKSB7CisgIGlmICghYnMucHJvdGVjdGlvbl9hYnNlbnQgJiYgYnMubnVtX3Jhd19ibG9ja3MgPiAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGJzLm51bV9yYXdfYmxvY2tzOyBpKyspIHsKICAgICAgIHBBZHRzLT5yYXdEYXRhQmxvY2tEaXN0W2ldID0gKFVTSE9SVClGREtyZWFkQml0cyhoQnMsIDE2KTsKICAgICAgIGFkdHNIZWFkZXJMZW5ndGggKz0gMTY7CiAgICAgfQogICAgIC8qIENoYW5nZSByYXcgZGF0YSBibG9ja3MgdG8gZGVsdGEgdmFsdWVzICovCi0gICAgcEFkdHMtPnJhd0RhdGFCbG9ja0Rpc3RbYnMubnVtX3Jhd19ibG9ja3NdID0gYnMuZnJhbWVfbGVuZ3RoIC0gNyAtIGJzLm51bV9yYXdfYmxvY2tzKjIgLSAyIDsKLSAgICBmb3IgKGk9YnMubnVtX3Jhd19ibG9ja3M7IGk+MDsgaS0tKSB7Ci0gICAgICBwQWR0cy0+cmF3RGF0YUJsb2NrRGlzdFtpXSAtPSBwQWR0cy0+cmF3RGF0YUJsb2NrRGlzdFtpLTFdOworICAgIHBBZHRzLT5yYXdEYXRhQmxvY2tEaXN0W2JzLm51bV9yYXdfYmxvY2tzXSA9CisgICAgICAgIGJzLmZyYW1lX2xlbmd0aCAtIDcgLSBicy5udW1fcmF3X2Jsb2NrcyAqIDIgLSAyOworICAgIGZvciAoaSA9IGJzLm51bV9yYXdfYmxvY2tzOyBpID4gMDsgaS0tKSB7CisgICAgICBwQWR0cy0+cmF3RGF0YUJsb2NrRGlzdFtpXSAtPSBwQWR0cy0+cmF3RGF0YUJsb2NrRGlzdFtpIC0gMV07CiAgICAgfQogICB9CiAKICAgLyogYWR0c19lcnJvcl9jaGVjayAqLwotICBpZiAoIWJzLnByb3RlY3Rpb25fYWJzZW50KQotICB7CisgIGlmICghYnMucHJvdGVjdGlvbl9hYnNlbnQpIHsKICAgICBVU0hPUlQgY3JjX2NoZWNrOwogCiAgICAgRkRLY3JjRW5kUmVnKCZwQWR0cy0+Y3JjSW5mbywgaEJzLCBjcmNSZWcpOwpAQCAtMjQ2LDc1ICsyNDQsNjMgQEAKICAgICB9CiAgIH0KIAotCiAgIC8qIGNoZWNrIGlmIHZhbGlkIGhlYWRlciAqLwotICBpZiAoCi0gICAgICAoYnMubGF5ZXIgIT0gMCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBNUEVHIEFEVFMKLSAgICAgIChicy5zYW1wbGVfZnJlcV9pbmRleCA+PSAxMykgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IDk2a0h6IC0gNzM1MGtIegotICAgICAgKSB7Ci0gICAgRkRLcHVzaEZvcihoQnMsIGJzLmZyYW1lX2xlbmd0aCAqIDgpOyAgIC8vIHRyeSBhZ2FpbiBvbmUgZnJhbWUgbGF0ZXIKKyAgaWYgKChicy5sYXllciAhPSAwKSB8fCAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBNUEVHIEFEVFMKKyAgICAgIChicy5zYW1wbGVfZnJlcV9pbmRleCA+PSAxMykgIC8vIHdlIG9ubHkgc3VwcG9ydCA5NmtIeiAtIDczNTBrSHoKKyAgKSB7CisgICAgRkRLcHVzaEZvcihoQnMsIGJzLmZyYW1lX2xlbmd0aCAqIDgpOyAgLy8gdHJ5IGFnYWluIG9uZSBmcmFtZSBsYXRlcgogICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOwogICB9CiAKICAgLyogc3BlY2lhbCB0cmVhdG1lbnQgb2YgaWQtYml0ICovCi0gIGlmICggKGJzLm1wZWdfaWQgPT0gMCkgJiYgKHBBZHRzLT5kZWNvZGVyQ2FuRG9NcGVnNCA9PSAwKSApCi0gIHsKKyAgaWYgKChicy5tcGVnX2lkID09IDApICYmIChwQWR0cy0+ZGVjb2RlckNhbkRvTXBlZzQgPT0gMCkpIHsKICAgICAvKiBNUEVHLTIgZGVjb2RlciBjYW5ub3QgcGxheSBNUEVHLTQgYml0c3RyZWFtcyAqLwogCi0KICAgICBGREtwdXNoRm9yKGhCcywgYnMuZnJhbWVfbGVuZ3RoICogOCk7ICAvLyB0cnkgYWdhaW4gb25lIGZyYW1lIGxhdGVyCiAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CiAgIH0KIAotICBpZiAoIWlnbm9yZUJ1ZmZlckZ1bGxuZXNzKQotICB7Ci0gICAgY21wX2J1ZmZlcl9mdWxsbmVzcyA9IGJzLmZyYW1lX2xlbmd0aCo4ICsgYnMuYWR0c19mdWxsbmVzcyozMipnZXROdW1iZXJPZkVmZmVjdGl2ZUNoYW5uZWxzKGJzLmNoYW5uZWxfY29uZmlnKTsKLQorICBpZiAoIWlnbm9yZUJ1ZmZlckZ1bGxuZXNzKSB7CisgICAgY21wX2J1ZmZlcl9mdWxsbmVzcyA9CisgICAgICAgIGJzLmZyYW1lX2xlbmd0aCAqIDggKworICAgICAgICBicy5hZHRzX2Z1bGxuZXNzICogMzIgKiBnZXROdW1iZXJPZkVmZmVjdGl2ZUNoYW5uZWxzKGJzLmNoYW5uZWxfY29uZmlnKTsKIAogICAgIC8qIEV2YWx1YXRlIGJ1ZmZlciBmdWxsbmVzcyAqLwotICAgIGlmIChicy5hZHRzX2Z1bGxuZXNzICE9IDB4N0ZGKQotICAgIHsKLSAgICAgIGlmIChwQWR0cy0+QnVmZmVyRnVsbG5lc1N0YXJ0RmxhZykKLSAgICAgIHsKLSAgICAgICAgaWYgKCB2YWxCaXRzIDwgY21wX2J1ZmZlcl9mdWxsbmVzcyApCi0gICAgICAgIHsKKyAgICBpZiAoYnMuYWR0c19mdWxsbmVzcyAhPSAweDdGRikgeworICAgICAgaWYgKHBBZHRzLT5CdWZmZXJGdWxsbmVzU3RhcnRGbGFnKSB7CisgICAgICAgIGlmICh2YWxCaXRzIDwgY21wX2J1ZmZlcl9mdWxsbmVzcykgewogICAgICAgICAgIC8qIENvbmRpdGlvbiBmb3Igc3RhcnQgb2YgZGVjb2RpbmcgaXMgbm90IGZ1bGZpbGxlZCAqLwogCiAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgZnJhbWUgd2lsbCBub3QgYmUgZGVjb2RlZCAqLwogICAgICAgICAgIEZES3B1c2hCYWNrKGhCcywgYWR0c0hlYWRlckxlbmd0aCk7CiAKLSAgICAgICAgICBpZiAoIChjbXBfYnVmZmVyX2Z1bGxuZXNzK2FkdHNIZWFkZXJMZW5ndGgpID4gKChUUkFOU1BPUlRERUNfSU5CVUZfU0laRTw8MyktNykgKSB7CisgICAgICAgICAgaWYgKChjbXBfYnVmZmVyX2Z1bGxuZXNzICsgYWR0c0hlYWRlckxlbmd0aCkgPgorICAgICAgICAgICAgICAoKCg4MTkyICogNCkgPDwgMykgLSA3KSkgewogICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOwogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUzsKICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgcEFkdHMtPkJ1ZmZlckZ1bGxuZXNTdGFydEZsYWcgPSAwOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiAKLQogICAvKiBHZXQgaW5mbyBmcm9tIEFEVFMgaGVhZGVyICovCiAgIEF1ZGlvU3BlY2lmaWNDb25maWdfSW5pdChwQXNjKTsKLSAgcEFzYy0+bV9hb3QgICAgICAgICAgICAgICAgICAgID0gKEFVRElPX09CSkVDVF9UWVBFKShicy5wcm9maWxlICsgMSk7CisgIHBBc2MtPm1fYW90ID0gKEFVRElPX09CSkVDVF9UWVBFKShicy5wcm9maWxlICsgMSk7CiAgIHBBc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3lJbmRleCA9IGJzLnNhbXBsZV9mcmVxX2luZGV4OwotICBwQXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5ICAgICAgPSBTYW1wbGluZ1JhdGVUYWJsZVticy5zYW1wbGVfZnJlcV9pbmRleF07Ci0gIHBBc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gICA9IGJzLmNoYW5uZWxfY29uZmlnOwotICBwQXNjLT5tX3NhbXBsZXNQZXJGcmFtZSAgICAgICAgPSAxMDI0OworICBwQXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0gU2FtcGxpbmdSYXRlVGFibGVbYnMuc2FtcGxlX2ZyZXFfaW5kZXhdOworICBwQXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gYnMuY2hhbm5lbF9jb25maWc7CisgIHBBc2MtPm1fc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKIAotI2lmZGVmIFRQX1BDRV9FTkFCTEUKLSAgaWYgKGJzLmNoYW5uZWxfY29uZmlnID09IDApCi0gIHsKKyAgaWYgKGJzLmNoYW5uZWxfY29uZmlnID09IDApIHsKICAgICBpbnQgcGNlQml0cyA9IDA7CiAgICAgVUlOVCBhbGlnbkFuY2hvciA9IEZES2dldFZhbGlkQml0cyhoQnMpOwotICAgIAotICAgIGlmIChGREtyZWFkQml0cyhoQnMsMykgPT0gSURfUENFKSB7CisKKyAgICBpZiAoRkRLcmVhZEJpdHMoaEJzLCAzKSA9PSBJRF9QQ0UpIHsKICAgICAgIC8qIEdvdCBsdWNrISBQYXJzZSB0aGUgUENFICovCi0gICAgICBpbnQgY3JjUmVnOwogICAgICAgY3JjUmVnID0gYWR0c1JlYWRfQ3JjU3RhcnRSZWcocEFkdHMsIGhCcywgMCk7CiAKICAgICAgIENQcm9ncmFtQ29uZmlnX1JlYWQoJnBBc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50LCBoQnMsIGFsaWduQW5jaG9yKTsKQEAgLTMyMywyNSArMzA5LDI2IEBACiAgICAgICBwY2VCaXRzID0gYWxpZ25BbmNob3IgLSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKICAgICAgIC8qIHN0b3JlIHRoZSBudW1iZXIgb2YgUENFIGJpdHMgKi8KICAgICAgIGJzLm51bV9wY2VfYml0cyA9IHBjZUJpdHM7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICAvKiBObyBQQ0UgaW4gdGhpcyBmcmFtZSEgUHVzaCBiYWNrIHRoZSBJRCB0YWcgYml0cy4gKi8KLSAgICAgIEZES3B1c2hCYWNrKGhCcywzKTsKKyAgICAgIEZES3B1c2hCYWNrKGhCcywgMyk7CiAKICAgICAgIC8qIEVuY29kZXJzIGRvIG5vdCBoYXZlIHRvIHdyaXRlIGEgUENFIGluIGVhY2ggZnJhbWUuCiAgICAgICAgICBTbyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSB2YWxpZCBQQ0Ugd2UgaGF2ZSB0byB1c2UgaXQuICovCi0gICAgICBpZiAoICBvbGRQY2UuaXNWYWxpZAotICAgICAgICAmJiAoYnMuc2FtcGxlX2ZyZXFfaW5kZXggPT0gcEFkdHMtPmJzLnNhbXBsZV9mcmVxX2luZGV4KSAgLyogd2UgY291bGQgY29tcGFyZSB0aGUgY29tcGxldGUgZml4ZWQgaGVhZGVyIChieXRlcykgaGVyZSEgKi8KLSAgICAgICAgJiYgKGJzLmNoYW5uZWxfY29uZmlnICAgID09IHBBZHRzLT5icy5jaGFubmVsX2NvbmZpZykgLyogPT0gMCAqLwotICAgICAgICAmJiAoYnMubXBlZ19pZCAgICAgICAgICAgPT0gcEFkdHMtPmJzLm1wZWdfaWQpICkKLSAgICAgIHsgLyogUmVzdG9yZSBwcmV2aW91cyBQQ0Ugd2hpY2ggaXMgc3RpbGwgdmFsaWQgKi8KKyAgICAgIGlmIChvbGRQY2UuaXNWYWxpZCAmJgorICAgICAgICAgIChicy5zYW1wbGVfZnJlcV9pbmRleCA9PQorICAgICAgICAgICBwQWR0cy0+YnMuc2FtcGxlX2ZyZXFfaW5kZXgpIC8qIHdlIGNvdWxkIGNvbXBhcmUgdGhlIGNvbXBsZXRlIGZpeGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyIChieXRlcykgaGVyZSEgKi8KKyAgICAgICAgICAmJiAoYnMuY2hhbm5lbF9jb25maWcgPT0gcEFkdHMtPmJzLmNoYW5uZWxfY29uZmlnKSAvKiA9PSAwICovCisgICAgICAgICAgJiYKKyAgICAgICAgICAoYnMubXBlZ19pZCA9PQorICAgICAgICAgICBwQWR0cy0+YnMubXBlZ19pZCkpIHsgLyogUmVzdG9yZSBwcmV2aW91cyBQQ0Ugd2hpY2ggaXMgc3RpbGwgdmFsaWQgKi8KICAgICAgICAgRkRLbWVtY3B5KCZwQXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudCwgJm9sZFBjZSwgc2l6ZW9mKENQcm9ncmFtQ29uZmlnKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChicy5tcGVnX2lkID09IDApIHsKKyAgICAgIH0gZWxzZSBpZiAoYnMubXBlZ19pZCA9PSAwKSB7CiAgICAgICAgIC8qIElmIG5vdCBpdCBzZWVtcyB0aGF0IHdlIGhhdmUgYSBpbXBsaWNpdCBjaGFubmVsIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgIFRoaXMgbW9kZSBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY29udGV4dCBvZiBJU08vSUVDIDE0NDk2LTMuCiAgICAgICAgICAgIFNraXAgdGhpcyBmcmFtZSBhbmQgdHJ5IHRoZSBuZXh0IG9uZS4gKi8KLSAgICAgICAgRkRLcHVzaEZvcihoQnMsIChicy5mcmFtZV9sZW5ndGg8PDMpIC0gYWR0c0hlYWRlckxlbmd0aCAtIDMpOworICAgICAgICBGREtwdXNoRm9yKGhCcywgKGJzLmZyYW1lX2xlbmd0aCA8PCAzKSAtIGFkdHNIZWFkZXJMZW5ndGggLSAzKTsKICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CiAgICAgICB9CiAgICAgICAvKiBlbHNlIHsKQEAgLTM1MCwzMyArMzM3LDMyIEBACiAgICAgICB9ICovCiAgICAgfQogICB9Ci0jZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLwogCi0gIC8qIENvcHkgYml0IHN0cmVhbSBkYXRhIHN0cnVjdCB0byBwZXJzaXN0ZW50IG1lbW9yeSBub3csIG9uY2Ugd2UgcGFzc2VkIGFsbCBzYW5pdHkgY2hlY2tzIGFib3ZlLiAqLworICAvKiBDb3B5IGJpdCBzdHJlYW0gZGF0YSBzdHJ1Y3QgdG8gcGVyc2lzdGVudCBtZW1vcnkgbm93LCBvbmNlIHdlIHBhc3NlZCBhbGwKKyAgICogc2FuaXR5IGNoZWNrcyBhYm92ZS4gKi8KICAgRkRLbWVtY3B5KCZwQWR0cy0+YnMsICZicywgc2l6ZW9mKFNUUlVDVF9BRFRTX0JTKSk7CiAKICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKIH0KIAotaW50IGFkdHNSZWFkX0dldFJhd0RhdGFCbG9ja0xlbmd0aCgKLSAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsCi0gICAgICAgIElOVCAgICAgICAgIGJsb2NrTnVtCi0gICAgICAgICkKLXsKK2ludCBhZHRzUmVhZF9HZXRSYXdEYXRhQmxvY2tMZW5ndGgoSEFORExFX0FEVFMgcEFkdHMsIElOVCBibG9ja051bSkgewogICBpbnQgbGVuZ3RoOwogCiAgIGlmIChwQWR0cy0+YnMubnVtX3Jhd19ibG9ja3MgPT0gMCkgewotICAgIGxlbmd0aCA9IChwQWR0cy0+YnMuZnJhbWVfbGVuZ3RoIC0gNykgPDwgMzsgICAgLyogYWFjX2ZyYW1lX2xlbmd0aCBzdWJ0cmFjdGVkIGJ5IHRoZSBoZWFkZXIgc2l6ZSAoNyBieXRlcykuICovCisgICAgbGVuZ3RoID0KKyAgICAgICAgKHBBZHRzLT5icy5mcmFtZV9sZW5ndGggLSA3KQorICAgICAgICA8PCAzOyAvKiBhYWNfZnJhbWVfbGVuZ3RoIHN1YnRyYWN0ZWQgYnkgdGhlIGhlYWRlciBzaXplICg3IGJ5dGVzKS4gKi8KICAgICBpZiAocEFkdHMtPmJzLnByb3RlY3Rpb25fYWJzZW50ID09IDApCi0gICAgICBsZW5ndGggLT0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1YnN0cmFjdCAxNiBiaXQgQ1JDICovCisgICAgICBsZW5ndGggLT0gMTY7IC8qIHN1YnN0cmFjdCAxNiBiaXQgQ1JDICovCiAgIH0gZWxzZSB7CiAgICAgaWYgKHBBZHRzLT5icy5wcm90ZWN0aW9uX2Fic2VudCkgewogICAgICAgbGVuZ3RoID0gLTE7IC8qIHJhdyBkYXRhIGJsb2NrIGxlbmd0aCBpcyB1bmtub3duICovCiAgICAgfSBlbHNlIHsKICAgICAgIGlmIChibG9ja051bSA8IDAgfHwgYmxvY2tOdW0gPiAzKSB7CiAgICAgICAgIGxlbmd0aCA9IC0xOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGVuZ3RoID0gKHBBZHRzLT5yYXdEYXRhQmxvY2tEaXN0W2Jsb2NrTnVtXSA8PCAzKSAtIDE2OwogICAgICAgfQotICAgICAgbGVuZ3RoID0gKHBBZHRzLT5yYXdEYXRhQmxvY2tEaXN0W2Jsb2NrTnVtXSA8PCAzKSAtIDE2OwogICAgIH0KICAgfQogICBpZiAoYmxvY2tOdW0gPT0gMCAmJiBsZW5ndGggPiAwKSB7CkBAIC0zODQsNSArMzcwLDMgQEAKICAgfQogICByZXR1cm4gbGVuZ3RoOwogfQotCi0KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYWR0cy5oIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZHRzLmgKaW5kZXggYTNiODNhNS4uNjhmM2Y2MyAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZHRzLmgKKysrIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZHRzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzEgKzkwLDMxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBBRFRTIGludGVyZmFjZQogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFRQREVDX0FEVFNfSAogI2RlZmluZSBUUERFQ19BRFRTX0gKIAogI2luY2x1ZGUgInRwZGVjX2xpYi5oIgogCi0KLSNkZWZpbmUgQURUU19TWU5DV09SRCAgICAgICAgICAgICAgICggMHhmZmYgKQotI2RlZmluZSBBRFRTX1NZTkNMRU5HVEggICAgICAgICAgICAgKCAxMiApICAgICAvKiBpbiBiaXRzICovCi0jZGVmaW5lIEFEVFNfSEVBREVSTEVOR1RIICAgICAgICAgICAoIDU2ICkgICAgIC8qIG1pbmltdW0gaGVhZGVyIHNpemUgaW4gYml0cyAqLwotI2RlZmluZSBBRFRTX0ZJWEVEX0hFQURFUkxFTkdUSCAgICAgKCAyOCApICAgICAvKiBpbiBiaXRzICovCi0jZGVmaW5lIEFEVFNfVkFSSUFCTEVfSEVBREVSTEVOR1RIICAoIEFEVFNfSEVBREVSTEVOR1RIIC0gQURUU19GSVhFRF9IRUFERVJMRU5HVEggKQorI2RlZmluZSBBRFRTX1NZTkNXT1JEICgweGZmZikKKyNkZWZpbmUgQURUU19TWU5DTEVOR1RIICgxMikgICAgICAgICAvKiBpbiBiaXRzICovCisjZGVmaW5lIEFEVFNfSEVBREVSTEVOR1RIICg1NikgICAgICAgLyogbWluaW11bSBoZWFkZXIgc2l6ZSBpbiBiaXRzICovCisjZGVmaW5lIEFEVFNfRklYRURfSEVBREVSTEVOR1RIICgyOCkgLyogaW4gYml0cyAqLworI2RlZmluZSBBRFRTX1ZBUklBQkxFX0hFQURFUkxFTkdUSCAoQURUU19IRUFERVJMRU5HVEggLSBBRFRTX0ZJWEVEX0hFQURFUkxFTkdUSCkKIAogI2lmZGVmIENIRUNLX1RXT19TWU5DUwotICNkZWZpbmUgQURUU19NSU5fVFBfQlVGX1NJWkUgICAgICAgKCA4MTkxICsgMiApCisjZGVmaW5lIEFEVFNfTUlOX1RQX0JVRl9TSVpFICg4MTkxICsgMikKICNlbHNlCi0gI2RlZmluZSBBRFRTX01JTl9UUF9CVUZfU0laRSAgICAgICAoIDgxOTEgKQorI2RlZmluZSBBRFRTX01JTl9UUF9CVUZfU0laRSAoODE5MSkKICNlbmRpZgogCiAjaW5jbHVkZSAiRkRLX2NyYy5oIgpAQCAtMTI4LDE2ICsxMzksMTYgQEAKIH0gU1RSVUNUX0FEVFNfQlM7CiAKIHN0cnVjdCBTVFJVQ1RfQURUUyB7Ci0KICAgU1RSVUNUX0FEVFNfQlMgYnM7CiAKICAgVUNIQVIgZGVjb2RlckNhbkRvTXBlZzQ7CiAgIFVDSEFSIEJ1ZmZlckZ1bGxuZXNTdGFydEZsYWc7CiAKLSAgRkRLX0NSQ0lORk8gY3JjSW5mbzsgICAgICAgICAgICAgLyogQ1JDIHN0YXRlIGluZm8gKi8KLSAgVVNIT1JUICAgICAgY3JjUmVhZFZhbHVlOyAgICAgICAgLyogQ1JDIHZhbHVlIHJlYWQgZnJvbSBiaXRzdHJlYW0gZGF0YSAqLwotICBVU0hPUlQgICAgICByYXdEYXRhQmxvY2tEaXN0WzRdOyAvKiBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcmF3IGRhdGEgYmxvY2suIE5vdCB0aGUgc2FtZSBhcyBmb3VuZCBpbiB0aGUgYml0c3RyZWFtICovCi19IDsKKyAgRkRLX0NSQ0lORk8gY3JjSW5mbzsgICAgICAgIC8qIENSQyBzdGF0ZSBpbmZvICovCisgIFVTSE9SVCBjcmNSZWFkVmFsdWU7ICAgICAgICAvKiBDUkMgdmFsdWUgcmVhZCBmcm9tIGJpdHN0cmVhbSBkYXRhICovCisgIFVTSE9SVCByYXdEYXRhQmxvY2tEaXN0WzRdOyAvKiBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcmF3IGRhdGEgYmxvY2suIE5vdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSAqLworfTsKIAogdHlwZWRlZiBzdHJ1Y3QgU1RSVUNUX0FEVFMgKkhBTkRMRV9BRFRTOwogCkBAIC0xNDgsMTUgKzE1OSwxNCBAQAogCiAgIFxyZXR1cm4gIG5vbmUKICovCi12b2lkIGFkdHNSZWFkX0NyY0luaXQoIEhBTkRMRV9BRFRTIHBBZHRzICk7Cit2b2lkIGFkdHNSZWFkX0NyY0luaXQoSEFORExFX0FEVFMgcEFkdHMpOwogCiAvKioKICAqIFxicmllZiBTdGFydHMgQ1JDIHJlZ2lvbiB3aXRoIGEgbWF4aW11bSBudW1iZXIgb2YgYml0cwotICogICAgICAgIElmIG1CaXRzIGlzIHBvc2l0aXZlIHplcm8gcGFkZGluZyB3aWxsIGJlIHVzZWQgZm9yIENSQyBjYWxjdWxhdGlvbiwgaWYgdGhlcmUKLSAqICAgICAgICBhcmUgbGVzcyB0aGFuIG1CaXRzIGJpdHMgYXZhaWxhYmxlLgotICogICAgICAgIElmIG1CaXRzIGlzIG5lZ2F0aXZlIG5vIHplcm8gcGFkZGluZyBpcyBkb25lLgotICogICAgICAgIElmIG1CaXRzIGlzIHplcm8gdGhlIG1lbW9yeSBmb3IgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgZHluYW1pY2FsbHksIHRoZQotICogICAgICAgIG51bWJlciBvZiBiaXRzIGlzIG5vdCBsaW1pdGVkLgorICogICAgICAgIElmIG1CaXRzIGlzIHBvc2l0aXZlIHplcm8gcGFkZGluZyB3aWxsIGJlIHVzZWQgZm9yIENSQyBjYWxjdWxhdGlvbiwgaWYKKyAqIHRoZXJlIGFyZSBsZXNzIHRoYW4gbUJpdHMgYml0cyBhdmFpbGFibGUuIElmIG1CaXRzIGlzIG5lZ2F0aXZlIG5vIHplcm8KKyAqIHBhZGRpbmcgaXMgZG9uZS4gSWYgbUJpdHMgaXMgemVybyB0aGUgbWVtb3J5IGZvciB0aGUgYnVmZmVyIGlzCisgKiBhbGxvY2F0ZWQgZHluYW1pY2FsbHksIHRoZSBudW1iZXIgb2YgYml0cyBpcyBub3QgbGltaXRlZC4KICAqCiAgKiBccGFyYW0gcEFkdHMgQURUUyBkYXRhIGhhbmRsZQogICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlLCBvbiB3aGljaCB0aGUgQ1JDIHJlZ2lvbiByZWZlcmVzIHRvCkBAIC0xNjQsMTEgKzE3NCw4IEBACiAgKgogICogXHJldHVybiAgSUQgZm9yIHRoZSBjcmVhdGVkIHJlZ2lvbiwgLTEgaW4gY2FzZSBvZiBhbiBlcnJvcgogICovCi1pbnQgYWR0c1JlYWRfQ3JjU3RhcnRSZWcoCi0gICAgICAgIEhBTkRMRV9BRFRTIHBBZHRzLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIGludCBtQml0cwotICAgICAgICApOworaW50IGFkdHNSZWFkX0NyY1N0YXJ0UmVnKEhBTkRMRV9BRFRTIHBBZHRzLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1CaXRzKTsKIAogLyoqCiAgKiBcYnJpZWYgRW5kcyBDUkMgcmVnaW9uIGlkZW50aWZpZWQgYnkgcmVnCkBAIC0xNzksNTggKzE4Niw0OSBAQAogICoKICAqIFxyZXR1cm4gIG5vbmUKICAqLwotdm9pZCBhZHRzUmVhZF9DcmNFbmRSZWcoCi0gICAgICAgIEhBTkRMRV9BRFRTIHBBZHRzLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIGludCByZWcKLSAgICAgICAgKTsKK3ZvaWQgYWR0c1JlYWRfQ3JjRW5kUmVnKEhBTkRMRV9BRFRTIHBBZHRzLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGludCByZWcpOwogCiAvKioKICAqIFxicmllZiBDaGVjayBDUkMKICAqCi0gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnRseSBjYWxjdWxhdGVkIENSQyBtYXRjaGVzIHRoZSBDUkMgZmllbGQgcmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqIERlbGV0ZXMgYWxsIENSQyByZWdpb25zLgorICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50bHkgY2FsY3VsYXRlZCBDUkMgbWF0Y2hlcyB0aGUgQ1JDIGZpZWxkIHJlYWQgZnJvbSB0aGUKKyAqIGJpdHN0cmVhbSBEZWxldGVzIGFsbCBDUkMgcmVnaW9ucy4KICAqCiAgKiBccGFyYW0gcEFkdHMgQURUUyBkYXRhIGhhbmRsZQogICoKICAqIFxyZXR1cm4gUmV0dXJucyAwIGlmIHRoZXkgYXJlIGlkZW50aWNhbCBvdGhlcndpc2UgMQogICovCi1UUkFOU1BPUlRERUNfRVJST1IgYWR0c1JlYWRfQ3JjQ2hlY2soIEhBTkRMRV9BRFRTIHBBZHRzICk7Ci0KK1RSQU5TUE9SVERFQ19FUlJPUiBhZHRzUmVhZF9DcmNDaGVjayhIQU5ETEVfQURUUyBwQWR0cyk7CiAKIC8qKgogICogXGJyaWVmIENoZWNrIGlmIHdlIGhhdmUgYSB2YWxpZCBBRFRTIGZyYW1lIGF0IHRoZSBjdXJyZW50IGJpdGJ1ZmZlciBwb3NpdGlvbgogICoKICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyBlbm91Z2ggYml0cyBpbiBidWZmZXIgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgogICogSXQgcmVhZHMgb3V0IHRoZSBoZWFkZXIgYml0cyB0byBwcmVwYXJlIHRoZSBiaXRidWZmZXIgZm9yIHRoZSBkZWNvZGUgbG9vcC4KLSAqIEluIGNhc2UgdGhlIGhlYWRlciBiaXRzIHNob3cgYW4gaW52YWxpZCBiaXRzdHJlYW0vZnJhbWUsIHRoZSB3aG9sZSBmcmFtZSBpcyBza2lwcGVkLgorICogSW4gY2FzZSB0aGUgaGVhZGVyIGJpdHMgc2hvdyBhbiBpbnZhbGlkIGJpdHN0cmVhbS9mcmFtZSwgdGhlIHdob2xlIGZyYW1lIGlzCisgKiBza2lwcGVkLgogICoKICAqIFxwYXJhbSBwQWR0cyBBRFRTIGRhdGEgaGFuZGxlIHdoaWNoIGlzIGZpbGxlZCB3aXRoIHBhcnNlZCBBRFRTIGhlYWRlciBkYXRhCiAgKiBccGFyYW0gYnMgaGFuZGxlIG9mIGJpdHN0cmVhbSBmcm9tIHdob20gdGhlIEFEVFMgaGVhZGVyIGlzIHJlYWQKICAqCiAgKiBccmV0dXJuICBlcnJvciBzdGF0dXMKICAqLwotVFJBTlNQT1JUREVDX0VSUk9SIGFkdHNSZWFkX0RlY29kZUhlYWRlcigKLSAgICAgICAgSEFORExFX0FEVFMgICAgICAgICAgIHBBZHRzLAotICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzCi0gICAgICAgICk7CitUUkFOU1BPUlRERUNfRVJST1IgYWR0c1JlYWRfRGVjb2RlSGVhZGVyKEhBTkRMRV9BRFRTIHBBZHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaWdub3JlQnVmZmVyRnVsbG5lc3MpOwogCiAvKioKICAqIFxicmllZiBHZXQgdGhlIHJhdyBkYXRhIGJsb2NrIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gYmxvY2sgbnVtYmVyLgogICoKICAqIFxwYXJhbSBwQWR0cyBBRFRTIGRhdGEgaGFuZGxlCiAgKiBccGFyYW0gYmxvY2tOdW0gY3VycmVudCByYXcgZGF0YSBibG9jayBpbmRleAotICogXHBhcmFtIHBMZW5ndGggcG9pbnRlciB0byBhbiBJTlQgd2hlcmUgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gcmF3IGRhdGEgYmxvY2sgaXMgc3RvcmVkIGludG8KLSAqICAgICAgICAgICAgICAgIHRoZSByZXR1cm5lZCB2YWx1ZSBtaWdodCBiZSAtMSwgaW4gd2hpY2ggY2FzZSB0aGUgcmF3IGRhdGEgYmxvY2sgbGVuZ3RoIGlzIHVua25vd24uCisgKiBccGFyYW0gcExlbmd0aCBwb2ludGVyIHRvIGFuIElOVCB3aGVyZSB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiByYXcgZGF0YSBibG9jaworICogaXMgc3RvcmVkIGludG8gdGhlIHJldHVybmVkIHZhbHVlIG1pZ2h0IGJlIC0xLCBpbiB3aGljaCBjYXNlIHRoZSByYXcgZGF0YQorICogYmxvY2sgbGVuZ3RoIGlzIHVua25vd24uCiAgKgogICogXHJldHVybiAgZXJyb3Igc3RhdHVzCiAgKi8KLWludCBhZHRzUmVhZF9HZXRSYXdEYXRhQmxvY2tMZW5ndGgoCi0gICAgICAgIEhBTkRMRV9BRFRTIHBBZHRzLAotICAgICAgICBJTlQgICAgICAgICBibG9ja051bQotICAgICAgICApOwotCitpbnQgYWR0c1JlYWRfR2V0UmF3RGF0YUJsb2NrTGVuZ3RoKEhBTkRMRV9BRFRTIHBBZHRzLCBJTlQgYmxvY2tOdW0pOwogCiAjZW5kaWYgLyogVFBERUNfQURUU19IICovCmRpZmYgLS1naXQgYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FzYy5jcHAgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FzYy5jcHAKaW5kZXggZTgwZDBlNS4uOGQ0MTFlOCAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hc2MuY3BwCisrKyBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYXNjLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0MiArOTAsMTA5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgRGFuaWVsIEhvbW0KKwogICAgRGVzY3JpcHRpb246CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0cGRlY19saWIuaCIKICNpbmNsdWRlICJ0cF9kYXRhLmgiCi0jaWZkZWYgVFBfUENFX0VOQUJMRQorCiAjaW5jbHVkZSAiRkRLX2NyYy5oIgotI2VuZGlmCiAKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKLXZvaWQgQ1Byb2dyYW1Db25maWdfUmVzZXQoQ1Byb2dyYW1Db25maWcgKnBQY2UpCi17Ci0gIHBQY2UtPmVsQ291bnRlciA9IDA7Ci19CisvKioKKyAqIFRoZSBmb2xsb3dpbmcgYXJyYXlzIHByb3ZpZGUgdGhlIElEcyBvZiB0aGUgY29uc2VjdXRpdmUgZWxlbWVudHMgZm9yIGVhY2gKKyAqIGNoYW5uZWwgY29uZmlndXJhdGlvbi4gRXZlcnkgY2hhbm5lbF9jb25maWd1cmF0aW9uIGhhcyB0byBiZSBmaW5hbGl6ZWQgd2l0aAorICogSURfTk9ORS4KKyAqLworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGNoYW5uZWxfY29uZmlndXJhdGlvbl8wW10gPSB7SURfTk9ORX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgY2hhbm5lbF9jb25maWd1cmF0aW9uXzFbXSA9IHtJRF9TQ0UsIElEX05PTkV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGNoYW5uZWxfY29uZmlndXJhdGlvbl8yW10gPSB7SURfQ1BFLCBJRF9OT05FfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fM1tdID0ge0lEX1NDRSwgSURfQ1BFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfTk9ORX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgY2hhbm5lbF9jb25maWd1cmF0aW9uXzRbXSA9IHtJRF9TQ0UsIElEX0NQRSwgSURfU0NFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfTk9ORX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgY2hhbm5lbF9jb25maWd1cmF0aW9uXzVbXSA9IHtJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfTk9ORX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgY2hhbm5lbF9jb25maWd1cmF0aW9uXzZbXSA9IHtJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfTEZFLCBJRF9OT05FfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fN1tdID0geworICAgIElEX1NDRSwgSURfQ1BFLCBJRF9DUEUsIElEX0NQRSwgSURfTEZFLCBJRF9OT05FfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fOFtdID0geworICAgIElEX05PTkV9OyAvKiByZXNlcnZlZCAqLworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGNoYW5uZWxfY29uZmlndXJhdGlvbl85W10gPSB7CisgICAgSURfTk9ORX07IC8qIHJlc2VydmVkICovCitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgY2hhbm5lbF9jb25maWd1cmF0aW9uXzEwW10gPSB7CisgICAgSURfTk9ORX07IC8qIHJlc2VydmVkICovCitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgY2hhbm5lbF9jb25maWd1cmF0aW9uXzExW10gPSB7CisgICAgSURfU0NFLCBJRF9DUEUsIElEX0NQRSwgSURfU0NFLCBJRF9MRkUsIElEX05PTkV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGNoYW5uZWxfY29uZmlndXJhdGlvbl8xMltdID0geworICAgIElEX1NDRSwgSURfQ1BFLCBJRF9DUEUsIElEX0NQRSwgSURfTEZFLCBJRF9OT05FfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMTNbXSA9IHsKKyAgICBJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLCBJRF9DUEUsIElEX0NQRSwgSURfU0NFLCBJRF9MRkUsIElEX0xGRSwgSURfU0NFLAorICAgIElEX0NQRSwgSURfQ1BFLCBJRF9TQ0UsIElEX0NQRSwgSURfU0NFLCBJRF9TQ0UsIElEX0NQRSwgSURfTk9ORX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgY2hhbm5lbF9jb25maWd1cmF0aW9uXzE0W10gPSB7CisgICAgSURfU0NFLCBJRF9DUEUsIElEX0NQRSwgSURfTEFTVCwgSURfQ1BFLCBJRF9OT05FfTsKIAotdm9pZCBDUHJvZ3JhbUNvbmZpZ19Jbml0KENQcm9ncmFtQ29uZmlnICpwUGNlKQoteworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEICpjaGFubmVsX2NvbmZpZ3VyYXRpb25fYXJyYXlbXSA9IHsKKyAgICBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMCwgIGNoYW5uZWxfY29uZmlndXJhdGlvbl8xLAorICAgIGNoYW5uZWxfY29uZmlndXJhdGlvbl8yLCAgY2hhbm5lbF9jb25maWd1cmF0aW9uXzMsCisgICAgY2hhbm5lbF9jb25maWd1cmF0aW9uXzQsICBjaGFubmVsX2NvbmZpZ3VyYXRpb25fNSwKKyAgICBjaGFubmVsX2NvbmZpZ3VyYXRpb25fNiwgIGNoYW5uZWxfY29uZmlndXJhdGlvbl83LAorICAgIGNoYW5uZWxfY29uZmlndXJhdGlvbl84LCAgY2hhbm5lbF9jb25maWd1cmF0aW9uXzksCisgICAgY2hhbm5lbF9jb25maWd1cmF0aW9uXzEwLCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMTEsCisgICAgY2hhbm5lbF9jb25maWd1cmF0aW9uXzEyLCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMTMsCisgICAgY2hhbm5lbF9jb25maWd1cmF0aW9uXzE0fTsKKworI2RlZmluZSBUUF9VU0FDX01BWF9DSEFOTkVMX0NPTkZJR1VSQVRJT05fSU5ERVggKDEzKQorI2RlZmluZSBTQ19DSEFOTkVMX0NPTkZJR19UQUJfU0laRSAoVFBfVVNBQ19NQVhfQ0hBTk5FTF9DT05GSUdVUkFUSU9OX0lOREVYICsgMSkKKworLyogY2hhbm5lbCBjb25maWcgc3RydWN0dXJlIHVzZWQgZm9yIHNhbml0eSBjaGVjayAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBTQ0hBUiBuQ2g7ICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgU0NIQVIgblNDRTsgLyogbnVtYmVyIG9mIFNDRSdzICovCisgIFNDSEFSIG5DUEU7IC8qIG51bWJlciBvZiBDUEUncyAqLworICBTQ0hBUiBuTEZFOyAvKiBudW1iZXIgb2YgTEZFJ3MgKi8KK30gU0NfQ0hBTk5FTF9DT05GSUc7CisKK3N0YXRpYyBjb25zdCBTQ19DSEFOTkVMX0NPTkZJRyBzY19jaGFuX2NvbmZpZ190YWJbU0NfQ0hBTk5FTF9DT05GSUdfVEFCX1NJWkVdID0KKyAgICB7CisgICAgICAgIC8qIG5DaCwgblNDRSwgbkNQRSwgbkxGRSwgICAgIGNjaSAqLworICAgICAgICB7MCwgMCwgMCwgMH0sIC8qICAwICovCisgICAgICAgIHsxLCAxLCAwLCAwfSwgLyogIDEgKi8KKyAgICAgICAgezIsIDAsIDEsIDB9LCAvKiAgMiAqLworICAgICAgICB7MywgMSwgMSwgMH0sIC8qICAzICovCisgICAgICAgIHs0LCAyLCAxLCAwfSwgLyogIDQgKi8KKyAgICAgICAgezUsIDEsIDIsIDB9LCAvKiAgNSAqLworICAgICAgICB7NiwgMSwgMiwgMX0sIC8qICA2ICovCisgICAgICAgIHs4LCAxLCAzLCAxfSwgLyogIDcgKi8KKyAgICAgICAgezIsIDIsIDAsIDB9LCAvKiAgOCAqLworICAgICAgICB7MywgMSwgMSwgMH0sIC8qICA5ICovCisgICAgICAgIHs0LCAwLCAyLCAwfSwgLyogMTAgKi8KKyAgICAgICAgezcsIDIsIDIsIDF9LCAvKiAxMSAqLworICAgICAgICB7OCwgMSwgMywgMX0sIC8qIDEyICovCisgICAgICAgIHsyNCwgNiwgOCwgMn0gLyogMTMgKi8KK307CisKK3ZvaWQgQ1Byb2dyYW1Db25maWdfUmVzZXQoQ1Byb2dyYW1Db25maWcgKnBQY2UpIHsgcFBjZS0+ZWxDb3VudGVyID0gMDsgfQorCit2b2lkIENQcm9ncmFtQ29uZmlnX0luaXQoQ1Byb2dyYW1Db25maWcgKnBQY2UpIHsKICAgRkRLbWVtY2xlYXIocFBjZSwgc2l6ZW9mKENQcm9ncmFtQ29uZmlnKSk7Ci0jaWZkZWYgVFBfUENFX0VOQUJMRQogICBwUGNlLT5TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gMHhmOwotI2VuZGlmCiB9CiAKLWludCAgQ1Byb2dyYW1Db25maWdfSXNWYWxpZCAoIGNvbnN0IENQcm9ncmFtQ29uZmlnICpwUGNlICkKLXsKLSAgcmV0dXJuICggKHBQY2UtPmlzVmFsaWQpID8gMSA6IDApOworaW50IENQcm9ncmFtQ29uZmlnX0lzVmFsaWQoY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UpIHsKKyAgcmV0dXJuICgocFBjZS0+aXNWYWxpZCkgPyAxIDogMCk7CiB9CiAKLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCi0jZGVmaW5lIFBDRV9IRUlHSFRfRVhUX1NZTkMgICggMHhBQyApCisjZGVmaW5lIFBDRV9IRUlHSFRfRVhUX1NZTkMgKDB4QUMpCiAKIC8qCiAgKiBSZWFkIHRoZSBleHRlbnNpb24gZm9yIGhlaWdodCBpbmZvLgpAQCAtMTIyLDE2ICsyMDAsMTIgQEAKICAqICAgICAgIC0xIGlmIHRoZSBDUkMgZmFpbGVkLAogICogICAgICAgLTIgaWYgaW52YWxpZCBIZWlnaHRJbmZvLgogICovCi1zdGF0aWMKLWludCBDUHJvZ3JhbUNvbmZpZ19SZWFkSGVpZ2h0RXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQcm9ncmFtQ29uZmlnICpwUGNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqIGNvbnN0IGJ5dGVzQXZhaWxhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgYWxpZ25tZW50QW5jaG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK3N0YXRpYyBpbnQgQ1Byb2dyYW1Db25maWdfUmVhZEhlaWdodEV4dChDUHJvZ3JhbUNvbmZpZyAqcFBjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvbnN0IGJ5dGVzQXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgYWxpZ25tZW50QW5jaG9yKSB7CiAgIGludCBlcnIgPSAwOwotICBGREtfQ1JDSU5GTyBjcmNJbmZvOyAgICAvKiBDUkMgc3RhdGUgaW5mbyAqLworICBGREtfQ1JDSU5GTyBjcmNJbmZvOyAvKiBDUkMgc3RhdGUgaW5mbyAqLwogICBJTlQgY3JjUmVnOwogICBGREtjcmNJbml0KCZjcmNJbmZvLCAweDA3LCAweEZGLCA4KTsKICAgY3JjUmVnID0gRkRLY3JjU3RhcnRSZWcoJmNyY0luZm8sIGJzLCAwKTsKQEAgLTE0MSwxNDggKzIxNSwxMzUgQEAKICAgRkRLX0FTU0VSVChicyAhPSBOVUxMKTsKICAgRkRLX0FTU0VSVChieXRlc0F2YWlsYWJsZSAhPSBOVUxMKTsKIAotICBpZiAoIChzdGFydEFuY2hvciA+PSAyNCkgJiYgKCpieXRlc0F2YWlsYWJsZSA+PSAzKQotICAgICYmIChGREtyZWFkQml0cyhicyw4KSA9PSBQQ0VfSEVJR0hUX0VYVF9TWU5DKSApCi0gIHsKKyAgaWYgKChzdGFydEFuY2hvciA+PSAyNCkgJiYgKCpieXRlc0F2YWlsYWJsZSA+PSAzKSAmJgorICAgICAgKEZES3JlYWRCaXRzKGJzLCA4KSA9PSBQQ0VfSEVJR0hUX0VYVF9TWU5DKSkgewogICAgIGludCBpOwogCi0gICAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKQotICAgIHsKLSAgICAgIGlmICgocFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMikpID49IFBDX05VTV9IRUlHSFRfTEFZRVIpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgaWYgKChwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvW2ldID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAyKSkgPj0KKyAgICAgICAgICBQQ19OVU1fSEVJR0hUX0xBWUVSKSB7CiAgICAgICAgIGVyciA9IC0yOyAvKiBoZWlnaHQgaW5mb3JtYXRpb24gaXMgb3V0IG9mIHRoZSB2YWxpZCByYW5nZSAqLwogICAgICAgfQogICAgIH0KLSAgICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoKHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMikpID49IFBDX05VTV9IRUlHSFRfTEFZRVIpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICBpZiAoKHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMikpID49CisgICAgICAgICAgUENfTlVNX0hFSUdIVF9MQVlFUikgewogICAgICAgICBlcnIgPSAtMjsgLyogaGVpZ2h0IGluZm9ybWF0aW9uIGlzIG91dCBvZiB0aGUgdmFsaWQgcmFuZ2UgKi8KICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspCi0gICAgewotICAgICAgaWYgKChwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9baV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDIpKSA+PSBQQ19OVU1fSEVJR0hUX0xBWUVSKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgaWYgKChwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9baV0gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDIpKSA+PQorICAgICAgICAgIFBDX05VTV9IRUlHSFRfTEFZRVIpIHsKICAgICAgICAgZXJyID0gLTI7IC8qIGhlaWdodCBpbmZvcm1hdGlvbiBpcyBvdXQgb2YgdGhlIHZhbGlkIHJhbmdlICovCiAgICAgICB9CiAgICAgfQogICAgIEZES2J5dGVBbGlnbihicywgYWxpZ25tZW50QW5jaG9yKTsKIAogICAgIEZES2NyY0VuZFJlZygmY3JjSW5mbywgYnMsIGNyY1JlZyk7Ci0gICAgaWYgKChVU0hPUlQpRkRLcmVhZEJpdHMoYnMsOCkgIT0gRkRLY3JjR2V0Q1JDKCZjcmNJbmZvKSkgeworICAgIGlmICgoVVNIT1JUKUZES3JlYWRCaXRzKGJzLCA4KSAhPSBGREtjcmNHZXRDUkMoJmNyY0luZm8pKSB7CiAgICAgICAvKiBDUkMgZmFpbGVkICovCiAgICAgICBlcnIgPSAtMTsKICAgICB9Ci0gICAgaWYgKGVyciE9MCkgewotICAgICAgLyogUmVzZXQgd2hvbGUgaGVpZ2h0IGluZm9ybWF0aW9uIGluIGNhc2UgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgcGFyc2luZy4gVGhlIHJldHVybgotICAgICAgICAgdmFsdWUgZW5zdXJlcyB0aGF0IHBQY2UtPmlzVmFsaWQgaXMgc2V0IHRvIDAgYW5kIGltcGxpY2l0IGNoYW5uZWwgbWFwcGluZyBpcyB1c2VkLiAqLwotICAgICAgRkRLbWVtY2xlYXIocFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mbywgc2l6ZW9mKHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm8pKTsKLSAgICAgIEZES21lbWNsZWFyKHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mbywgc2l6ZW9mKHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mbykpOwotICAgICAgRkRLbWVtY2xlYXIocFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvLCBzaXplb2YocFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvKSk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAvKiBSZXNldCB3aG9sZSBoZWlnaHQgaW5mb3JtYXRpb24gaW4gY2FzZSBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyBwYXJzaW5nLgorICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBlbnN1cmVzIHRoYXQgcFBjZS0+aXNWYWxpZCBpcyBzZXQgdG8gMCBhbmQgaW1wbGljaXQKKyAgICAgICAgIGNoYW5uZWwgbWFwcGluZyBpcyB1c2VkLiAqLworICAgICAgRkRLbWVtY2xlYXIocFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mbywKKyAgICAgICAgICAgICAgICAgIHNpemVvZihwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvKSk7CisgICAgICBGREttZW1jbGVhcihwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm8sCisgICAgICAgICAgICAgICAgICBzaXplb2YocFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvKSk7CisgICAgICBGREttZW1jbGVhcihwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm8sCisgICAgICAgICAgICAgICAgICBzaXplb2YocFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvKSk7CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIC8qIE5vIHZhbGlkIGV4dGVuc2lvbiBkYXRhIGZvdW5kIC0+IHJlc3RvcmUgdGhlIGluaXRpYWwgYml0YnVmZmVyIHN0YXRlICovCi0gICAgRkRLcHVzaEJhY2soYnMsIHN0YXJ0QW5jaG9yIC0gRkRLZ2V0VmFsaWRCaXRzKGJzKSk7CisgICAgRkRLcHVzaEJhY2soYnMsIChJTlQpc3RhcnRBbmNob3IgLSAoSU5UKUZES2dldFZhbGlkQml0cyhicykpOwogICB9CiAKICAgLyogQWx3YXlzIHJlcG9ydCB0aGUgYnl0ZXMgcmVhZC4gKi8KLSAgKmJ5dGVzQXZhaWxhYmxlIC09IChzdGFydEFuY2hvciAtIEZES2dldFZhbGlkQml0cyhicykpID4+IDM7CisgICpieXRlc0F2YWlsYWJsZSAtPSAoKElOVClzdGFydEFuY2hvciAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSkgPj4gMzsKIAogICByZXR1cm4gKGVycik7CiB9CiAKLXZvaWQgQ1Byb2dyYW1Db25maWdfUmVhZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Byb2dyYW1Db25maWcgKnBQY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFsaWdubWVudEFuY2hvcgotICAgICAgICAgICAgICAgICAgICAgICAgKQotewordm9pZCBDUHJvZ3JhbUNvbmZpZ19SZWFkKENQcm9ncmFtQ29uZmlnICpwUGNlLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFsaWdubWVudEFuY2hvcikgewogICBpbnQgaSwgZXJyID0gMDsKICAgaW50IGNvbW1lbnRCeXRlczsKIAogICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyA9IDA7CiAgIHBQY2UtPk51bUNoYW5uZWxzID0gMDsKLSAgcFBjZS0+RWxlbWVudEluc3RhbmNlVGFnID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw0KTsKLSAgcFBjZS0+UHJvZmlsZSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMik7Ci0gIHBQY2UtPlNhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOwotICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7Ci0gIHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOwotICBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw0KTsKLSAgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKLSAgcFBjZS0+TnVtQXNzb2NEYXRhRWxlbWVudHMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDMpOwotICBwUGNlLT5OdW1WYWxpZENjRWxlbWVudHMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICBwUGNlLT5FbGVtZW50SW5zdGFuY2VUYWcgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDQpOworICBwUGNlLT5Qcm9maWxlID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAyKTsKKyAgcFBjZS0+U2FtcGxpbmdGcmVxdWVuY3lJbmRleCA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CisgIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA0KTsKKyAgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50cyA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CisgIHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHMgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDQpOworICBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHMgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDIpOworICBwUGNlLT5OdW1Bc3NvY0RhdGFFbGVtZW50cyA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMyk7CisgIHBQY2UtPk51bVZhbGlkQ2NFbGVtZW50cyA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CiAKLSAgaWYgKChwUGNlLT5Nb25vTWl4ZG93blByZXNlbnQgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpKSAhPSAwKQotICB7Ci0gICAgcFBjZS0+TW9ub01peGRvd25FbGVtZW50TnVtYmVyID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw0KTsKKyAgaWYgKChwUGNlLT5Nb25vTWl4ZG93blByZXNlbnQgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDEpKSAhPSAwKSB7CisgICAgcFBjZS0+TW9ub01peGRvd25FbGVtZW50TnVtYmVyID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA0KTsKICAgfQogCi0gIGlmICgocFBjZS0+U3RlcmVvTWl4ZG93blByZXNlbnQgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpKSAhPSAwKQotICB7Ci0gICAgcFBjZS0+U3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXIgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICBpZiAoKHBQY2UtPlN0ZXJlb01peGRvd25QcmVzZW50ID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKSkgIT0gMCkgeworICAgIHBQY2UtPlN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA0KTsKICAgfQogCi0gIGlmICgocFBjZS0+TWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSkpICE9IDApCi0gIHsKLSAgICBwUGNlLT5NYXRyaXhNaXhkb3duSW5kZXggPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDIpOwotICAgIHBQY2UtPlBzZXVkb1N1cnJvdW5kRW5hYmxlID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywxKTsKKyAgaWYgKChwUGNlLT5NYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKSkgIT0gMCkgeworICAgIHBQY2UtPk1hdHJpeE1peGRvd25JbmRleCA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMik7CisgICAgcFBjZS0+UHNldWRvU3Vycm91bmRFbmFibGUgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDEpOwogICB9CiAKLSAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKQotICB7Ci0gICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpOwotICAgIHBQY2UtPkZyb250RWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDEpOworICAgIHBQY2UtPkZyb250RWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CiAgICAgcFBjZS0+TnVtQ2hhbm5lbHMgKz0gcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0gPyAyIDogMTsKICAgfQogCi0gIGZvciAoaT0wOyBpIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKQotICB7Ci0gICAgcFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSk7Ci0gICAgcFBjZS0+U2lkZUVsZW1lbnRUYWdTZWxlY3RbaV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgcFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMSk7CisgICAgcFBjZS0+U2lkZUVsZW1lbnRUYWdTZWxlY3RbaV0gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDQpOwogICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbaV0gPyAyIDogMTsKICAgfQogCi0gIGZvciAoaT0wOyBpIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKQotICB7Ci0gICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSk7Ci0gICAgcFBjZS0+QmFja0VsZW1lbnRUYWdTZWxlY3RbaV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMSk7CisgICAgcFBjZS0+QmFja0VsZW1lbnRUYWdTZWxlY3RbaV0gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDQpOwogICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbaV0gPyAyIDogMTsKICAgfQogCiAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzID0gcFBjZS0+TnVtQ2hhbm5lbHM7CiAKLSAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7IGkrKykKLSAgewotICAgIHBQY2UtPkxmZUVsZW1lbnRUYWdTZWxlY3RbaV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICBwUGNlLT5MZmVFbGVtZW50VGFnU2VsZWN0W2ldID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA0KTsKICAgICBwUGNlLT5OdW1DaGFubmVscyArPSAxOwogICB9CiAKLSAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1Bc3NvY0RhdGFFbGVtZW50czsgaSsrKQotICB7Ci0gICAgcFBjZS0+QXNzb2NEYXRhRWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1Bc3NvY0RhdGFFbGVtZW50czsgaSsrKSB7CisgICAgcFBjZS0+QXNzb2NEYXRhRWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CiAgIH0KIAotICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bVZhbGlkQ2NFbGVtZW50czsgaSsrKQotICB7Ci0gICAgcFBjZS0+Q2NFbGVtZW50SXNJbmRTd1tpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSk7Ci0gICAgcFBjZS0+VmFsaWRDY0VsZW1lbnRUYWdTZWxlY3RbaV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtVmFsaWRDY0VsZW1lbnRzOyBpKyspIHsKKyAgICBwUGNlLT5DY0VsZW1lbnRJc0luZFN3W2ldID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICBwUGNlLT5WYWxpZENjRWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CiAgIH0KIAogICBGREtieXRlQWxpZ24oYnMsIGFsaWdubWVudEFuY2hvcik7CiAKLSAgcFBjZS0+Q29tbWVudEZpZWxkQnl0ZXMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDgpOworICBwUGNlLT5Db21tZW50RmllbGRCeXRlcyA9IChVQ0hBUilGREtyZWFkQml0cyhicywgOCk7CiAgIGNvbW1lbnRCeXRlcyA9IHBQY2UtPkNvbW1lbnRGaWVsZEJ5dGVzOwogCiAgIC8qIFNlYXJjaCBmb3IgaGVpZ2h0IGluZm8gZXh0ZW5zaW9uIGFuZCByZWFkIGl0IGlmIGF2YWlsYWJsZSAqLwotICBlcnIgPSBDUHJvZ3JhbUNvbmZpZ19SZWFkSGVpZ2h0RXh0KCBwUGNlLCBicywgJmNvbW1lbnRCeXRlcywgYWxpZ25tZW50QW5jaG9yICk7CisgIGVyciA9IENQcm9ncmFtQ29uZmlnX1JlYWRIZWlnaHRFeHQocFBjZSwgYnMsICZjb21tZW50Qnl0ZXMsIGFsaWdubWVudEFuY2hvcik7CiAKLSAgZm9yIChpPTA7IGkgPCBjb21tZW50Qnl0ZXM7IGkrKykKLSAgeworICBmb3IgKGkgPSAwOyBpIDwgY29tbWVudEJ5dGVzOyBpKyspIHsKICAgICBVQ0hBUiB0ZXh0OwogCi0gICAgdGV4dCA9IChVQ0hBUilGREtyZWFkQml0cyhicyw4KTsKKyAgICB0ZXh0ID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA4KTsKIAotICAgIGlmIChpIDwgUENfQ09NTUVOVExFTkdUSCkKLSAgICB7CisgICAgaWYgKGkgPCBQQ19DT01NRU5UTEVOR1RIKSB7CiAgICAgICBwUGNlLT5Db21tZW50W2ldID0gdGV4dDsKICAgICB9CiAgIH0KQEAgLTI5OCwyOCArMzU5LDI5IEBACiAgKiAgIDEgLSBkaWZmZXJlbnQgYnV0IHNhbWUgY2hhbm5lbCBjb25maWd1cmF0aW9uCiAgKiAgIDIgLSBkaWZmZXJlbnQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGJ1dCBzYW1lIG51bWJlciBvZiBjaGFubmVscwogICovCi1pbnQgQ1Byb2dyYW1Db25maWdfQ29tcGFyZSAoIGNvbnN0IENQcm9ncmFtQ29uZmlnICogY29uc3QgcFBjZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQcm9ncmFtQ29uZmlnICogY29uc3QgcFBjZTIgKQotewotICBpbnQgcmVzdWx0ID0gMDsgIC8qIElubm9jZW50IHVudGlsIHByb3ZlbiBmYWxzZS4gKi8KK2ludCBDUHJvZ3JhbUNvbmZpZ19Db21wYXJlKGNvbnN0IENQcm9ncmFtQ29uZmlnICpjb25zdCBwUGNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQcm9ncmFtQ29uZmlnICpjb25zdCBwUGNlMikgeworICBpbnQgcmVzdWx0ID0gMDsgLyogSW5ub2NlbnQgdW50aWwgcHJvdmVuIGZhbHNlLiAqLwogCi0gIGlmIChGREttZW1jbXAocFBjZTEsIHBQY2UyLCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKSAhPSAwKQotICB7IC8qIENvbmZpZ3VyYXRpb25zIGFyZSBub3QgY29tcGxldGVseSBkaWZmZXJlbnQuCi0gICAgICAgU28gbG9vayBpbnRvIGRldGFpbHMgYW5kIGFuYWx5c2UgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbnM6ICovCisgIGlmIChGREttZW1jbXAocFBjZTEsIHBQY2UyLCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKSAhPQorICAgICAgMCkgeyAvKiBDb25maWd1cmF0aW9ucyBhcmUgbm90IGNvbXBsZXRlbHkgZXF1YWwuCisgICAgICAgICAgICAgIFNvIGxvb2sgaW50byBkZXRhaWxzIGFuZCBhbmFseXNlIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb25zOiAqLwogICAgIHJlc3VsdCA9IC0xOwogCi0gICAgaWYgKHBQY2UxLT5OdW1DaGFubmVscyA9PSBwUGNlMi0+TnVtQ2hhbm5lbHMpCi0gICAgeyAvKiBOb3cgdGhlIGxvZ2ljIGNoYW5nZXMuIFdlIGZpcnN0IGFzc3VtZSB0byBoYXZlIHRoZSBzYW1lIGNoYW5uZWwgY29uZmlndXJhdGlvbgotICAgICAgICAgYW5kIHRoZW4gcHJvdmUgaWYgdGhpcyBhc3N1bXB0aW9uIGlzIHRydWUuICovCisgICAgaWYgKHBQY2UxLT5OdW1DaGFubmVscyA9PQorICAgICAgICBwUGNlMi0+TnVtQ2hhbm5lbHMpIHsgLyogTm93IHRoZSBsb2dpYyBjaGFuZ2VzLiBXZSBmaXJzdCBhc3N1bWUgdG8gaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgY2hhbm5lbCBjb25maWd1cmF0aW9uIGFuZCB0aGVuIHByb3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGlzIGFzc3VtcHRpb24gaXMgdHJ1ZS4gKi8KICAgICAgIHJlc3VsdCA9IDE7CiAKICAgICAgIC8qIEZyb250IGNoYW5uZWxzICovCiAgICAgICBpZiAocFBjZTEtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzICE9IHBQY2UyLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cykgewotICAgICAgICByZXN1bHQgPSAyOyAgLyogZGlmZmVyZW50IG51bWJlciBvZiBmcm9udCBjaGFubmVsIGVsZW1lbnRzICovCisgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBudW1iZXIgb2YgZnJvbnQgY2hhbm5lbCBlbGVtZW50cyAqLwogICAgICAgfSBlbHNlIHsKICAgICAgICAgaW50IGVsLCBudW1DaDEgPSAwLCBudW1DaDIgPSAwOwogICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlMS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKLSAgICAgICAgICBpZiAocFBjZTEtPkZyb250RWxlbWVudEhlaWdodEluZm9bZWxdICE9IHBQY2UyLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvW2VsXSkgeworICAgICAgICAgIGlmIChwUGNlMS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tlbF0gIT0KKyAgICAgICAgICAgICAgcFBjZTItPkZyb250RWxlbWVudEhlaWdodEluZm9bZWxdKSB7CiAgICAgICAgICAgICByZXN1bHQgPSAyOyAvKiBkaWZmZXJlbnQgaGVpZ2h0IGluZm8gKi8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KQEAgLTMyNywxNiArMzg5LDE3IEBACiAgICAgICAgICAgbnVtQ2gyICs9IHBQY2UyLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0gPyAyIDogMTsKICAgICAgICAgfQogICAgICAgICBpZiAobnVtQ2gxICE9IG51bUNoMikgewotICAgICAgICAgIHJlc3VsdCA9IDI7ICAvKiBkaWZmZXJlbnQgbnVtYmVyIG9mIGZyb250IGNoYW5uZWxzICovCisgICAgICAgICAgcmVzdWx0ID0gMjsgLyogZGlmZmVyZW50IG51bWJlciBvZiBmcm9udCBjaGFubmVscyAqLwogICAgICAgICB9CiAgICAgICB9CiAgICAgICAvKiBTaWRlIGNoYW5uZWxzICovCiAgICAgICBpZiAocFBjZTEtPk51bVNpZGVDaGFubmVsRWxlbWVudHMgIT0gcFBjZTItPk51bVNpZGVDaGFubmVsRWxlbWVudHMpIHsKLSAgICAgICAgcmVzdWx0ID0gMjsgIC8qIGRpZmZlcmVudCBudW1iZXIgb2Ygc2lkZSBjaGFubmVsIGVsZW1lbnRzICovCisgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBudW1iZXIgb2Ygc2lkZSBjaGFubmVsIGVsZW1lbnRzICovCiAgICAgICB9IGVsc2UgewogICAgICAgICBpbnQgZWwsIG51bUNoMSA9IDAsIG51bUNoMiA9IDA7CiAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UxLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7Ci0gICAgICAgICAgaWYgKHBQY2UxLT5TaWRlRWxlbWVudEhlaWdodEluZm9bZWxdICE9IHBQY2UyLT5TaWRlRWxlbWVudEhlaWdodEluZm9bZWxdKSB7CisgICAgICAgICAgaWYgKHBQY2UxLT5TaWRlRWxlbWVudEhlaWdodEluZm9bZWxdICE9CisgICAgICAgICAgICAgIHBQY2UyLT5TaWRlRWxlbWVudEhlaWdodEluZm9bZWxdKSB7CiAgICAgICAgICAgICByZXN1bHQgPSAyOyAvKiBkaWZmZXJlbnQgaGVpZ2h0IGluZm8gKi8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KQEAgLTM0NCwxNiArNDA3LDE3IEBACiAgICAgICAgICAgbnVtQ2gyICs9IHBQY2UyLT5TaWRlRWxlbWVudElzQ3BlW2VsXSA/IDIgOiAxOwogICAgICAgICB9CiAgICAgICAgIGlmIChudW1DaDEgIT0gbnVtQ2gyKSB7Ci0gICAgICAgICAgcmVzdWx0ID0gMjsgIC8qIGRpZmZlcmVudCBudW1iZXIgb2Ygc2lkZSBjaGFubmVscyAqLworICAgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBudW1iZXIgb2Ygc2lkZSBjaGFubmVscyAqLwogICAgICAgICB9CiAgICAgICB9CiAgICAgICAvKiBCYWNrIGNoYW5uZWxzICovCiAgICAgICBpZiAocFBjZTEtPk51bUJhY2tDaGFubmVsRWxlbWVudHMgIT0gcFBjZTItPk51bUJhY2tDaGFubmVsRWxlbWVudHMpIHsKLSAgICAgICAgcmVzdWx0ID0gMjsgIC8qIGRpZmZlcmVudCBudW1iZXIgb2YgYmFjayBjaGFubmVsIGVsZW1lbnRzICovCisgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBudW1iZXIgb2YgYmFjayBjaGFubmVsIGVsZW1lbnRzICovCiAgICAgICB9IGVsc2UgewogICAgICAgICBpbnQgZWwsIG51bUNoMSA9IDAsIG51bUNoMiA9IDA7CiAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UxLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7Ci0gICAgICAgICAgaWYgKHBQY2UxLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxdICE9IHBQY2UyLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxdKSB7CisgICAgICAgICAgaWYgKHBQY2UxLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxdICE9CisgICAgICAgICAgICAgIHBQY2UyLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxdKSB7CiAgICAgICAgICAgICByZXN1bHQgPSAyOyAvKiBkaWZmZXJlbnQgaGVpZ2h0IGluZm8gKi8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KQEAgLTM2MSwxMiArNDI1LDEyIEBACiAgICAgICAgICAgbnVtQ2gyICs9IHBQY2UyLT5CYWNrRWxlbWVudElzQ3BlW2VsXSA/IDIgOiAxOwogICAgICAgICB9CiAgICAgICAgIGlmIChudW1DaDEgIT0gbnVtQ2gyKSB7Ci0gICAgICAgICAgcmVzdWx0ID0gMjsgIC8qIGRpZmZlcmVudCBudW1iZXIgb2YgYmFjayBjaGFubmVscyAqLworICAgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBudW1iZXIgb2YgYmFjayBjaGFubmVscyAqLwogICAgICAgICB9CiAgICAgICB9CiAgICAgICAvKiBMRkUgY2hhbm5lbHMgKi8KICAgICAgIGlmIChwUGNlMS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzICE9IHBQY2UyLT5OdW1MZmVDaGFubmVsRWxlbWVudHMpIHsKLSAgICAgICAgcmVzdWx0ID0gMjsgIC8qIGRpZmZlcmVudCBudW1iZXIgb2YgbGZlIGNoYW5uZWxzICovCisgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBudW1iZXIgb2YgbGZlIGNoYW5uZWxzICovCiAgICAgICB9CiAgICAgICAvKiBMRkVzIGFyZSBhbHdheXMgU0NFcyBzbyB3ZSBkb24ndCBuZWVkIHRvIGNvdW50IHRoZSBjaGFubmVscy4gKi8KICAgICB9CkBAIC0zNzUsODggKzQzOSw4NyBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi12b2lkIENQcm9ncmFtQ29uZmlnX0dldERlZmF1bHQoIENQcm9ncmFtQ29uZmlnICpwUGNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxDb25maWcgKQotewordm9pZCBDUHJvZ3JhbUNvbmZpZ19HZXREZWZhdWx0KENQcm9ncmFtQ29uZmlnICpwUGNlLCBjb25zdCBVSU5UIGNoYW5uZWxDb25maWcpIHsKICAgRkRLX0FTU0VSVChwUGNlICE9IE5VTEwpOwogCiAgIC8qIEluaXQgUENFICovCiAgIENQcm9ncmFtQ29uZmlnX0luaXQocFBjZSk7Ci0gIHBQY2UtPlByb2ZpbGUgPSAxOyAgLyogU2V0IEFBQyBMQyBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBvYmplY3QgdHlwZS4gKi8KKyAgcFBjZS0+UHJvZmlsZSA9CisgICAgICAxOyAvKiBTZXQgQUFDIExDIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgc3VwcG9ydGVkIG9iamVjdCB0eXBlLiAqLwogCiAgIHN3aXRjaCAoY2hhbm5lbENvbmZpZykgewotICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCi0gIGNhc2UgMzI6IC8qIDcuMSBzaWRlIGNoYW5uZWwgY29uZmlndXJhdGlvbiBhcyBkZWZpbmVkIGluIEZES19hdWRpby5oICovCi0gICAgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgID0gMjsKLSAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVswXSAgICAgPSAwOwotICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzFdICAgICA9IDE7Ci0gICAgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50cyAgID0gMTsKLSAgICBwUGNlLT5TaWRlRWxlbWVudElzQ3BlWzBdICAgICAgPSAxOwotICAgIHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHMgICA9IDE7Ci0gICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVswXSAgICAgID0gMTsKLSAgICBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHMgICAgPSAxOwotICAgIHBQY2UtPk51bUNoYW5uZWxzICAgICAgICAgICAgICA9IDg7Ci0gICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgICAgID0gNzsKLSAgICBwUGNlLT5pc1ZhbGlkICAgICAgICAgICAgICAgICAgPSAxOwotICAgIGJyZWFrOwotICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCi0gIGNhc2UgMTI6ICAvKiAzLzAvNC4xY2ggc3Vycm91bmQgYmFjayAqLwotICAgIHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbMV0gICAgICA9IDE7Ci0gICAgcFBjZS0+TnVtQ2hhbm5lbHMgICAgICAgICAgICAgKz0gMTsKLSAgICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyAgICArPSAxOwotICBjYXNlIDExOiAgLyogMy8wLzMuMWNoICovCi0gICAgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgKz0gMjsKLSAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVswXSAgICAgPSAwOwotICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzFdICAgICA9IDE7Ci0gICAgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50cyAgKz0gMjsKLSAgICBwUGNlLT5CYWNrRWxlbWVudElzQ3BlWzBdICAgICAgPSAxOwotICAgIHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbMV0gICAgICs9IDA7Ci0gICAgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzICAgKz0gMTsKLSAgICBwUGNlLT5OdW1DaGFubmVscyAgICAgICAgICAgICArPSA3OwotICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICAgICs9IDY7Ci0gICAgcFBjZS0+aXNWYWxpZCAgICAgICAgICAgICAgICAgID0gMTsKLSAgICBicmVhazsKLSAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwotICBjYXNlIDE0OiAgLyogMi8wLzAtMy8wLzItMC4xY2ggZnJvbnQgaGVpZ2h0ICovCi0gICAgcFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1syXSA9IDE7ICAgICAgLyogVG9wIHNwZWFrZXIgKi8KLSAgY2FzZSA3OiAgIC8qIDUvMC8yLjFjaCBmcm9udCAqLwotICAgIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzICs9IDE7Ci0gICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbMl0gICAgID0gMTsKLSAgICBwUGNlLT5OdW1DaGFubmVscyAgICAgICAgICAgICArPSAyOwotICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICAgICs9IDI7Ci0gIGNhc2UgNjogICAvKiAzLzAvMi4xY2ggKi8KLSAgICBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHMgICArPSAxOwotICAgIHBQY2UtPk51bUNoYW5uZWxzICAgICAgICAgICAgICs9IDE7Ci0gIGNhc2UgNTogICAvKiAzLzAvMi4wY2ggKi8KLSAgY2FzZSA0OiAgIC8qIDMvMC8xLjBjaCAqLwotICAgIHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHMgICs9IDE7Ci0gICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVswXSAgICAgID0gKGNoYW5uZWxDb25maWc+NCkgPyAxIDogMDsKLSAgICBwUGNlLT5OdW1DaGFubmVscyAgICAgICAgICAgICArPSAoY2hhbm5lbENvbmZpZz40KSA/IDIgOiAxOwotICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICAgICs9IChjaGFubmVsQ29uZmlnPjQpID8gMiA6IDE7Ci0gIGNhc2UgMzogICAvKiAzLzAvMC4wY2ggKi8KLSAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyArPSAxOwotICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzFdICAgICA9IDE7Ci0gICAgcFBjZS0+TnVtQ2hhbm5lbHMgICAgICAgICAgICAgKz0gMjsKLSAgICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyAgICArPSAyOwotICBjYXNlIDE6ICAgLyogMS8wLzAuMGNoICovCi0gICAgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgKz0gMTsKLSAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVswXSAgICAgPSAwOwotICAgIHBQY2UtPk51bUNoYW5uZWxzICAgICAgICAgICAgICs9IDE7Ci0gICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgICAgKz0gMTsKLSAgICBwUGNlLT5pc1ZhbGlkICAgICAgICAgICAgICAgICAgPSAxOwotICAgIGJyZWFrOwotICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCi0gIGNhc2UgMjogICAvKiAyLzAvMC5jaCAqLwotICAgIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzICA9IDE7Ci0gICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbMF0gICAgID0gMTsKLSAgICBwUGNlLT5OdW1DaGFubmVscyAgICAgICAgICAgICArPSAyOwotICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICAgICs9IDI7Ci0gICAgcFBjZS0+aXNWYWxpZCAgICAgICAgICAgICAgICAgID0gMTsKLSAgICBicmVhazsKLSAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwotICBkZWZhdWx0OgotICAgIHBQY2UtPmlzVmFsaWQgICAgICAgICAgICAgICAgICA9IDA7ICAgLyogVG8gYmUgZXhwbGljaXQhICovCi0gICAgYnJlYWs7CisgICAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworICAgIGNhc2UgMzI6IC8qIDcuMSBzaWRlIGNoYW5uZWwgY29uZmlndXJhdGlvbiBhcyBkZWZpbmVkIGluIEZES19hdWRpby5oICovCisgICAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyA9IDI7CisgICAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVswXSA9IDA7CisgICAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVsxXSA9IDE7CisgICAgICBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzID0gMTsKKyAgICAgIHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbMF0gPSAxOworICAgICAgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50cyA9IDE7CisgICAgICBwUGNlLT5CYWNrRWxlbWVudElzQ3BlWzBdID0gMTsKKyAgICAgIHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50cyA9IDE7CisgICAgICBwUGNlLT5OdW1DaGFubmVscyA9IDg7CisgICAgICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyA9IDc7CisgICAgICBwUGNlLT5pc1ZhbGlkID0gMTsKKyAgICAgIGJyZWFrOworICAgIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgICBjYXNlIDEyOiAvKiAzLzAvNC4xY2ggc3Vycm91bmQgYmFjayAqLworICAgICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVsxXSA9IDE7CisgICAgICBwUGNlLT5OdW1DaGFubmVscyArPSAxOworICAgICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgKz0gMTsKKyAgICBjYXNlIDExOiAvKiAzLzAvMy4xY2ggKi8KKyAgICAgIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzICs9IDI7CisgICAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVswXSA9IDA7CisgICAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVsxXSA9IDE7CisgICAgICBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzICs9IDI7CisgICAgICBwUGNlLT5CYWNrRWxlbWVudElzQ3BlWzBdID0gMTsKKyAgICAgIHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbMV0gKz0gMDsKKyAgICAgIHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50cyArPSAxOworICAgICAgcFBjZS0+TnVtQ2hhbm5lbHMgKz0gNzsKKyAgICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICs9IDY7CisgICAgICBwUGNlLT5pc1ZhbGlkID0gMTsKKyAgICAgIGJyZWFrOworICAgIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgICBjYXNlIDE0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyLzAvMC0zLzAvMi0wLjFjaCBmcm9udCBoZWlnaHQgKi8KKyAgICAgIHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9bMl0gPSAxOyAvKiBUb3Agc3BlYWtlciAqLworICAgIGNhc2UgNzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUvMC8yLjFjaCBmcm9udCAqLworICAgICAgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgKz0gMTsKKyAgICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzJdID0gMTsKKyAgICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IDI7CisgICAgICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyArPSAyOworICAgIGNhc2UgNjogLyogMy8wLzIuMWNoICovCisgICAgICBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHMgKz0gMTsKKyAgICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IDE7CisgICAgY2FzZSA1OiAvKiAzLzAvMi4wY2ggKi8KKyAgICBjYXNlIDQ6IC8qIDMvMC8xLjBjaCAqLworICAgICAgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50cyArPSAxOworICAgICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVswXSA9IChjaGFubmVsQ29uZmlnID4gNCkgPyAxIDogMDsKKyAgICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IChjaGFubmVsQ29uZmlnID4gNCkgPyAyIDogMTsKKyAgICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICs9IChjaGFubmVsQ29uZmlnID4gNCkgPyAyIDogMTsKKyAgICBjYXNlIDM6IC8qIDMvMC8wLjBjaCAqLworICAgICAgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgKz0gMTsKKyAgICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzFdID0gMTsKKyAgICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IDI7CisgICAgICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyArPSAyOworICAgIGNhc2UgMTogLyogMS8wLzAuMGNoICovCisgICAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyArPSAxOworICAgICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbMF0gPSAwOworICAgICAgcFBjZS0+TnVtQ2hhbm5lbHMgKz0gMTsKKyAgICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICs9IDE7CisgICAgICBwUGNlLT5pc1ZhbGlkID0gMTsKKyAgICAgIGJyZWFrOworICAgIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgICBjYXNlIDI6IC8qIDIvMC8wLmNoICovCisgICAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyA9IDE7CisgICAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVswXSA9IDE7CisgICAgICBwUGNlLT5OdW1DaGFubmVscyArPSAyOworICAgICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgKz0gMjsKKyAgICAgIHBQY2UtPmlzVmFsaWQgPSAxOworICAgICAgYnJlYWs7CisgICAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworICAgIGRlZmF1bHQ6CisgICAgICBwUGNlLT5pc1ZhbGlkID0gMDsgLyogVG8gYmUgZXhwbGljaXQhICovCisgICAgICBicmVhazsKICAgfQogCiAgIGlmIChwUGNlLT5pc1ZhbGlkKSB7CkBAIC00NjQsMTMgKzUyNywxNiBAQAogICAgIGludCBlbCwgZWxUYWdTY2UgPSAwLCBlbFRhZ0NwZSA9IDA7CiAKICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgZWwgKz0gMSkgewotICAgICAgcFBjZS0+RnJvbnRFbGVtZW50VGFnU2VsZWN0W2VsXSA9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0pID8gZWxUYWdDcGUrKyA6IGVsVGFnU2NlKys7CisgICAgICBwUGNlLT5Gcm9udEVsZW1lbnRUYWdTZWxlY3RbZWxdID0KKyAgICAgICAgICAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbZWxdKSA/IGVsVGFnQ3BlKysgOiBlbFRhZ1NjZSsrOwogICAgIH0KICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7Ci0gICAgICBwUGNlLT5TaWRlRWxlbWVudFRhZ1NlbGVjdFtlbF0gPSAocFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtlbF0pID8gZWxUYWdDcGUrKyA6IGVsVGFnU2NlKys7CisgICAgICBwUGNlLT5TaWRlRWxlbWVudFRhZ1NlbGVjdFtlbF0gPQorICAgICAgICAgIChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2VsXSkgPyBlbFRhZ0NwZSsrIDogZWxUYWdTY2UrKzsKICAgICB9CiAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgZWwgKz0gMSkgewotICAgICAgcFBjZS0+QmFja0VsZW1lbnRUYWdTZWxlY3RbZWxdID0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbZWxdKSA/IGVsVGFnQ3BlKysgOiBlbFRhZ1NjZSsrOworICAgICAgcFBjZS0+QmFja0VsZW1lbnRUYWdTZWxlY3RbZWxdID0KKyAgICAgICAgICAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtlbF0pID8gZWxUYWdDcGUrKyA6IGVsVGFnU2NlKys7CiAgICAgfQogICAgIGVsVGFnU2NlID0gMDsKICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKQEAgLTQ3OCwzMCArNTQ0LDI2IEBACiAgICAgfQogICB9CiB9Ci0jZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLwogCiAvKioKLSAqIFxicmllZiBnZXQgaW1wbGljaXQgYXVkaW8gY2hhbm5lbCB0eXBlIGZvciBnaXZlbiBjaGFubmVsQ29uZmlnIGFuZCBNUEVHIG9yZGVyZWQgY2hhbm5lbCBpbmRleAorICogXGJyaWVmIGdldCBpbXBsaWNpdCBhdWRpbyBjaGFubmVsIHR5cGUgZm9yIGdpdmVuIGNoYW5uZWxDb25maWcgYW5kIE1QRUcKKyAqIG9yZGVyZWQgY2hhbm5lbCBpbmRleAogICogXHBhcmFtIGNoYW5uZWxDb25maWcgTVBFRyBjaGFubmVsQ29uZmlndXJhdGlvbiBmcm9tIDEgdXB0byAxNAogICogXHBhcmFtIGluZGV4IE1QRUcgY2hhbm5lbCBvcmRlciBpbmRleAogICogXHJldHVybiBhdWRpbyBjaGFubmVsIHR5cGUuCiAgKi8KLXN0YXRpYwotdm9pZCBnZXRJbXBsaWNpdEF1ZGlvQ2hhbm5lbFR5cGVBbmRJbmRleCgKLSAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFICpjaFR5cGUsCi0gICAgICAgIFVDSEFSICpjaEluZGV4LAotICAgICAgICBVSU5UIGNoYW5uZWxDb25maWcsCi0gICAgICAgIFVJTlQgaW5kZXgKLSAgICAgICAgKQoteworc3RhdGljIHZvaWQgZ2V0SW1wbGljaXRBdWRpb0NoYW5uZWxUeXBlQW5kSW5kZXgoQVVESU9fQ0hBTk5FTF9UWVBFICpjaFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqY2hJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgY2hhbm5lbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgaW5kZXgpIHsKICAgaWYgKGluZGV4IDwgMykgewogICAgICpjaFR5cGUgPSBBQ1RfRlJPTlQ7CiAgICAgKmNoSW5kZXggPSBpbmRleDsKICAgfSBlbHNlIHsKICAgICBzd2l0Y2ggKGNoYW5uZWxDb25maWcpIHsKLSAgICAgIGNhc2UgNDogIC8qIFNDRSwgQ1BFLCBTQ0UgKi8KLSAgICAgIGNhc2UgNTogIC8qIFNDRSwgQ1BFLCBDUEUgKi8KLSAgICAgIGNhc2UgNjogIC8qIFNDRSwgQ1BFLCBDUEUsIExGRSAqLworICAgICAgY2FzZSA0OiAvKiBTQ0UsIENQRSwgU0NFICovCisgICAgICBjYXNlIDU6IC8qIFNDRSwgQ1BFLCBDUEUgKi8KKyAgICAgIGNhc2UgNjogLyogU0NFLCBDUEUsIENQRSwgTEZFICovCiAgICAgICAgIHN3aXRjaCAoaW5kZXgpIHsKICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgY2FzZSA0OgpAQCAtNTE0LDcgKzU3Niw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNzogIC8qIFNDRSxDUEUsQ1BFLENQRSxMRkUgKi8KKyAgICAgIGNhc2UgNzogLyogU0NFLENQRSxDUEUsQ1BFLExGRSAqLwogICAgICAgICBzd2l0Y2ggKGluZGV4KSB7CiAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgIGNhc2UgNDoKQEAgLTUzMiw3ICs1OTQsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExOiAgLyogU0NFLENQRSxDUEUsU0NFLExGRSAqLworICAgICAgY2FzZSAxMTogLyogU0NFLENQRSxDUEUsU0NFLExGRSAqLwogICAgICAgICBpZiAoaW5kZXggPCA2KSB7CiAgICAgICAgICAgKmNoVHlwZSA9IEFDVF9CQUNLOwogICAgICAgICAgICpjaEluZGV4ID0gaW5kZXggLSAzOwpAQCAtNTQxLDcgKzYwMyw3IEBACiAgICAgICAgICAgKmNoSW5kZXggPSAwOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMjogIC8qIFNDRSxDUEUsQ1BFLENQRSxMRkUgKi8KKyAgICAgIGNhc2UgMTI6IC8qIFNDRSxDUEUsQ1BFLENQRSxMRkUgKi8KICAgICAgICAgaWYgKGluZGV4IDwgNykgewogICAgICAgICAgICpjaFR5cGUgPSBBQ1RfQkFDSzsKICAgICAgICAgICAqY2hJbmRleCA9IGluZGV4IC0gMzsKQEAgLTU1MCw3ICs2MTIsNyBAQAogICAgICAgICAgICpjaEluZGV4ID0gMDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTQ6ICAvKiBTQ0UsQ1BFLENQRSxMRkUsQ1BFICovCisgICAgICBjYXNlIDE0OiAvKiBTQ0UsQ1BFLENQRSxMRkUsQ1BFICovCiAgICAgICAgIHN3aXRjaCAoaW5kZXgpIHsKICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgY2FzZSA0OgpAQCAtNTY0LDcgKzYyNiw3IEBACiAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICpjaFR5cGUgPSBBQ1RfRlJPTlRfVE9QOwotICAgICAgICAgICAgKmNoSW5kZXggPSBpbmRleCAtIDY7ICAvKiBoYW5kbGUgdGhlIHRvcCBsYXllciBpbmRlcGVuZGVudGx5ICovCisgICAgICAgICAgICAqY2hJbmRleCA9IGluZGV4IC0gNjsgLyogaGFuZGxlIHRoZSB0b3AgbGF5ZXIgaW5kZXBlbmRlbnRseSAqLwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC01NzUsNDM2ICs2MzcsNTc0IEBACiAgIH0KIH0KIAotaW50IENQcm9ncmFtQ29uZmlnX0xvb2t1cEVsZW1lbnQoCi0gICAgICAgIENQcm9ncmFtQ29uZmlnICpwUGNlLAotICAgICAgICBVSU5UICAgICAgICAgICAgY2hhbm5lbENvbmZpZywKLSAgICAgICAgY29uc3QgVUlOVCAgICAgIHRhZywKLSAgICAgICAgY29uc3QgVUlOVCAgICAgIGNoYW5uZWxJZHgsCi0gICAgICAgIFVDSEFSICAgICAgICAgICBjaE1hcHBpbmdbXSwKLSAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoVHlwZVtdLAotICAgICAgICBVQ0hBUiAgICAgICAgICAgY2hJbmRleFtdLAotICAgICAgICBVQ0hBUiAgICAgICAgICAqZWxNYXBwaW5nLAotICAgICAgICBNUDRfRUxFTUVOVF9JRCAgZWxMaXN0W10sCi0gICAgICAgIE1QNF9FTEVNRU5UX0lEICBlbFR5cGUKLSAgICAgICApCi17Ci0gIGlmIChjaGFubmVsQ29uZmlnID4gMCkKLSAgeworaW50IENQcm9ncmFtQ29uZmlnX0xvb2t1cEVsZW1lbnQoQ1Byb2dyYW1Db25maWcgKnBQY2UsIFVJTlQgY2hhbm5lbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgdGFnLCBjb25zdCBVSU5UIGNoYW5uZWxJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBjaE1hcHBpbmdbXSwgQVVESU9fQ0hBTk5FTF9UWVBFIGNoVHlwZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY2hJbmRleFtdLCBjb25zdCBVSU5UIGNoRGVzY3JMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZWxNYXBwaW5nLCBNUDRfRUxFTUVOVF9JRCBlbExpc3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNF9FTEVNRU5UX0lEIGVsVHlwZSkgeworICBpZiAoY2hhbm5lbENvbmZpZyA+IDApIHsKICAgICAvKiBDb25zdGFudCBjaGFubmVsIG1hcHBpbmcgbXVzdCBoYXZlCiAgICAgICAgYmVlbiBzZXQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAqLwotICAgIGlmICggZWxUeXBlID09IElEX1NDRQotICAgICAgfHwgZWxUeXBlID09IElEX0NQRQotICAgICAgfHwgZWxUeXBlID09IElEX0xGRSApCi0gICAgeworICAgIGlmIChJU19DSEFOTkVMX0VMRU1FTlQoZWxUeXBlKSkgewogICAgICAgKmVsTWFwcGluZyA9IHBQY2UtPmVsQ291bnRlcjsKLSAgICAgIGlmIChlbExpc3RbcFBjZS0+ZWxDb3VudGVyXSAhPSBlbFR5cGUpIHsKKyAgICAgIGlmIChlbExpc3RbcFBjZS0+ZWxDb3VudGVyXSAhPSBlbFR5cGUgJiYKKyAgICAgICAgICAhSVNfVVNBQ19DSEFOTkVMX0VMRU1FTlQoZWxUeXBlKSkgewogICAgICAgICAvKiBOb3QgaW4gdGhlIGxpc3QgKi8KLSAgICAgICAgaWYgKCAoY2hhbm5lbENvbmZpZyA9PSAyKSAmJiAoZWxUeXBlID09IElEX1NDRSkgKQotICAgICAgICB7IC8qIFRoaXMgc2NlbmFyaW8gb2NjdXJzIHdpdGggSEUtQUFDIHYyIHN0cmVhbXMgb2YgYnVnZ3kgZW5jb2RlcnMuCi0gICAgICAgICAgICAgRHVlIHRvIG90aGVyIGRlY29kZXIgaW1wbGVtZW50YXRpb25zIGRlY29kaW5nIG9mIHRoZXNlIGtpbmQgb2Ygc3RyZWFtcyBpcyBkZXNpcmVkLiAqLworICAgICAgICBpZiAoKGNoYW5uZWxDb25maWcgPT0gMikgJiYKKyAgICAgICAgICAgIChlbFR5cGUgPT0gSURfU0NFKSkgeyAvKiBUaGlzIHNjZW5hcmlvIG9jY3VycyB3aXRoIEhFLUFBQyB2MiBzdHJlYW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYnVnZ3kgZW5jb2RlcnMuIEluIG90aGVyIGRlY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgZGVjb2Rpbmcgb2YgdGhpcyBraW5kIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtcyBpcyBkZXNpcmVkLiAqLwogICAgICAgICAgIGNoYW5uZWxDb25maWcgPSAxOworICAgICAgICB9IGVsc2UgaWYgKChlbExpc3RbcFBjZS0+ZWxDb3VudGVyXSA9PSBJRF9MRkUpICYmCisgICAgICAgICAgICAgICAgICAgKGVsVHlwZSA9PQorICAgICAgICAgICAgICAgICAgICBJRF9TQ0UpKSB7IC8qIERlY29kZSBiaXRzdHJlYW1zIHdoaWNoIHdyb25nbHkgdXNlIElEX1NDRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgSURfTEZFIGVsZW1lbnQgdHlwZS4gKi8KKyAgICAgICAgICA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIC8qIEFzc3VtZSBhbGwgZnJvbnQgY2hhbm5lbHMgKi8KLSAgICAgIGdldEltcGxpY2l0QXVkaW9DaGFubmVsVHlwZUFuZEluZGV4KCZjaFR5cGVbY2hhbm5lbElkeF0sICZjaEluZGV4W2NoYW5uZWxJZHhdLCBjaGFubmVsQ29uZmlnLCBjaGFubmVsSWR4KTsKLSAgICAgIGlmIChlbFR5cGUgPT0gSURfQ1BFKSB7Ci0gICAgICAgIGNoVHlwZVtjaGFubmVsSWR4KzFdID0gY2hUeXBlW2NoYW5uZWxJZHhdOwotICAgICAgICBjaEluZGV4W2NoYW5uZWxJZHgrMV0gPSBjaEluZGV4W2NoYW5uZWxJZHhdKzE7CisgICAgICBnZXRJbXBsaWNpdEF1ZGlvQ2hhbm5lbFR5cGVBbmRJbmRleCgKKyAgICAgICAgICAmY2hUeXBlW2NoYW5uZWxJZHhdLCAmY2hJbmRleFtjaGFubmVsSWR4XSwgY2hhbm5lbENvbmZpZywgY2hhbm5lbElkeCk7CisgICAgICBpZiAoZWxUeXBlID09IElEX0NQRSB8fCBlbFR5cGUgPT0gSURfVVNBQ19DUEUpIHsKKyAgICAgICAgY2hUeXBlW2NoYW5uZWxJZHggKyAxXSA9IGNoVHlwZVtjaGFubmVsSWR4XTsKKyAgICAgICAgY2hJbmRleFtjaGFubmVsSWR4ICsgMV0gPSBjaEluZGV4W2NoYW5uZWxJZHhdICsgMTsKICAgICAgIH0KICAgICAgIHBQY2UtPmVsQ291bnRlcisrOwogICAgIH0KICAgICAvKiBBY2NlcHQgYWxsIG5vbi1jaGFubmVsIGVsZW1lbnRzLCB0b28uICovCiAgICAgcmV0dXJuIDE7Ci0gIH0KLSAgZWxzZQotICB7Ci0jaWZkZWYgVFBfUENFX0VOQUJMRQotICAgIGlmICghcFBjZS0+aXNWYWxpZCkKLSNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCi0gICAgeworICB9IGVsc2UgeworICAgIGlmICgoIXBQY2UtPmlzVmFsaWQpIHx8IChwUGNlLT5OdW1DaGFubmVscyA+IGNoRGVzY3JMZW4pKSB7CiAgICAgICAvKiBJbXBsaWNpdCBjaGFubmVsIG1hcHBpbmcuICovCi0gICAgICBpZiAoIGVsVHlwZSA9PSBJRF9TQ0UKLSAgICAgICAgfHwgZWxUeXBlID09IElEX0NQRQotICAgICAgICB8fCBlbFR5cGUgPT0gSURfTEZFICkKLSAgICAgIHsKKyAgICAgIGlmIChJU19VU0FDX0NIQU5ORUxfRUxFTUVOVChlbFR5cGUpKSB7CisgICAgICAgICplbE1hcHBpbmcgPSBwUGNlLT5lbENvdW50ZXIrKzsKKyAgICAgIH0gZWxzZSBpZiAoSVNfTVA0X0NIQU5ORUxfRUxFTUVOVChlbFR5cGUpKSB7CiAgICAgICAgIC8qIFN0b3JlIGFsbCBjaGFubmVsIGVsZW1lbnQgSURzICovCiAgICAgICAgIGVsTGlzdFtwUGNlLT5lbENvdW50ZXJdID0gZWxUeXBlOwogICAgICAgICAqZWxNYXBwaW5nID0gcFBjZS0+ZWxDb3VudGVyKys7CiAgICAgICB9Ci0gICAgfQotI2lmZGVmICBUUF9QQ0VfRU5BQkxFCi0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIC8qIEFjY2VwdCB0aGUgYWRkaXRpb25hbCBjaGFubmVsKHMpLCBvbmx5IGlmIHRoZSB0YWcgaXMgaW4gdGhlIGxpc3RzICovCiAgICAgICBpbnQgaXNDcGUgPSAwLCBpOwogICAgICAgLyogRWxlbWVudCBjb3VudGVyICovCiAgICAgICBpbnQgZWNbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07CiAgICAgICAvKiBDaGFubmVsIGNvdW50ZXJzICovCiAgICAgICBpbnQgY2NbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07Ci0gICAgICBpbnQgZmNbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07Ci0gICAgICBpbnQgc2NbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07Ci0gICAgICBpbnQgYmNbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07Ci0gICAgICBpbnQgbGMgPSAwOzsKKyAgICAgIGludCBmY1tQQ19OVU1fSEVJR0hUX0xBWUVSXSA9IHswfTsgLyogZnJvbnQgY2hhbm5lbCBjb3VudGVyICovCisgICAgICBpbnQgc2NbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07IC8qIHNpZGUgY2hhbm5lbCBjb3VudGVyICovCisgICAgICBpbnQgYmNbUENfTlVNX0hFSUdIVF9MQVlFUl0gPSB7MH07IC8qIGJhY2sgY2hhbm5lbCBjb3VudGVyICovCisgICAgICBpbnQgbGMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxmZSBjaGFubmVsIGNvdW50ZXIgKi8KIAogICAgICAgLyogR2VuZXJhbCBNUEVHIChQQ0UpIGNvbXBvc2l0aW9uIHJ1bGVzOgogICAgICAgICAgLSBPdmVyIGFsbDoKLSAgICAgICAgICAgICA8bm9ybWFsIGhlaWdodCBjaGFubmVscz48dG9wIGhlaWdodCBjaGFubmVscz48Ym90dG9tIGhlaWdodCBjaGFubmVscz4KKyAgICAgICAgICAgICA8bm9ybWFsIGhlaWdodCBjaGFubmVscz48dG9wIGhlaWdodCBjaGFubmVscz48Ym90dG9tIGhlaWdodAorICAgICAgICAgY2hhbm5lbHM+CiAgICAgICAgICAtIFdpdGhpbiBlYWNoIGhlaWdodCBsYXllcjoKICAgICAgICAgICAgICA8ZnJvbnQgY2hhbm5lbHM+PHNpZGUgY2hhbm5lbHM+PGJhY2sgY2hhbm5lbHM+CiAgICAgICAgICAtIEV4Y2VwdGlvbjoKLSAgICAgICAgICAgICBUaGUgTEZFIGNoYW5uZWxzIGhhdmUgbm8gaGVpZ2h0IGluZm8gYW5kIHRodXMgdGhleSBhcmUgYXJyYW5nZWQgYXQgdGhlIHZlcnkKLSAgICAgICAgICAgICBlbmQgb2YgdGhlIG5vcm1hbCBoZWlnaHQgbGF5ZXIgY2hhbm5lbHMuCisgICAgICAgICAgICAgVGhlIExGRSBjaGFubmVscyBoYXZlIG5vIGhlaWdodCBpbmZvIGFuZCB0aHVzIHRoZXkgYXJlIGFycmFuZ2VkIGF0CisgICAgICAgICB0aGUgdmVyeSBlbmQgb2YgdGhlIG5vcm1hbCBoZWlnaHQgbGF5ZXIgY2hhbm5lbHMuCiAgICAgICAgKi8KIAotICAgICAgc3dpdGNoIChlbFR5cGUpCi0gICAgICB7Ci0gICAgICBjYXNlIElEX0NQRToKLSAgICAgICAgaXNDcGUgPSAxOwotICAgICAgY2FzZSBJRF9TQ0U6Ci0gICAgICAgIC8qIHNlYXJjaCBpbiBmcm9udCBjaGFubmVscyAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkrKykgewotICAgICAgICAgIGludCBoZWlnaHRMYXllciA9IHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9baV07Ci0gICAgICAgICAgaWYgKGlzQ3BlID09IHBQY2UtPkZyb250RWxlbWVudElzQ3BlW2ldICYmIHBQY2UtPkZyb250RWxlbWVudFRhZ1NlbGVjdFtpXSA9PSB0YWcpIHsKLSAgICAgICAgICAgIGludCBoLCBlbElkeCA9IGVjW2hlaWdodExheWVyXSwgY2hJZHggPSBjY1toZWlnaHRMYXllcl07Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgYUNoVHlwZSA9IChBVURJT19DSEFOTkVMX1RZUEUpKChoZWlnaHRMYXllcjw8NCkgfCBBQ1RfRlJPTlQpOwotICAgICAgICAgICAgZm9yIChoID0gaGVpZ2h0TGF5ZXItMTsgaCA+PSAwOyBoLT0xKSB7Ci0gICAgICAgICAgICAgIGludCBlbDsKLSAgICAgICAgICAgICAgLyogQ291bnQgZnJvbnQgY2hhbm5lbHMvZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGVsKz0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKLSAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7Ci0gICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgc3dpdGNoIChlbFR5cGUpIHsKKyAgICAgICAgY2FzZSBJRF9DUEU6CisgICAgICAgICAgaXNDcGUgPSAxOworICAgICAgICBjYXNlIElEX1NDRToKKyAgICAgICAgICAvKiBzZWFyY2ggaW4gZnJvbnQgY2hhbm5lbHMgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgaW50IGhlaWdodExheWVyID0gcFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tpXTsKKyAgICAgICAgICAgIGlmIChpc0NwZSA9PSBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtpXSAmJgorICAgICAgICAgICAgICAgIHBQY2UtPkZyb250RWxlbWVudFRhZ1NlbGVjdFtpXSA9PSB0YWcpIHsKKyAgICAgICAgICAgICAgaW50IGgsIGVsSWR4ID0gZWNbaGVpZ2h0TGF5ZXJdLCBjaElkeCA9IGNjW2hlaWdodExheWVyXTsKKyAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGFDaFR5cGUgPQorICAgICAgICAgICAgICAgICAgKEFVRElPX0NIQU5ORUxfVFlQRSkoKGhlaWdodExheWVyIDw8IDQpIHwgQUNUX0ZST05UKTsKKyAgICAgICAgICAgICAgZm9yIChoID0gaGVpZ2h0TGF5ZXIgLSAxOyBoID49IDA7IGggLT0gMSkgeworICAgICAgICAgICAgICAgIGludCBlbDsKKyAgICAgICAgICAgICAgICAvKiBDb3VudCBmcm9udCBjaGFubmVscy9lbGVtZW50cyAqLworICAgICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7CisgICAgICAgICAgICAgICAgICBpZiAocFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgeworICAgICAgICAgICAgICAgICAgICBlbElkeCArPSAxOworICAgICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBDb3VudCBzaWRlIGNoYW5uZWxzL2VsZW1lbnRzICovCisgICAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgZWwgKz0gMSkgeworICAgICAgICAgICAgICAgICAgaWYgKHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgeworICAgICAgICAgICAgICAgICAgICBlbElkeCArPSAxOworICAgICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIENvdW50IGJhY2sgY2hhbm5lbHMvZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7CisgICAgICAgICAgICAgICAgICBpZiAocFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7CisgICAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5CYWNrRWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGggPT0gMCkgeyAvKiBub3JtYWwgaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICBlbElkeCArPSBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7CisgICAgICAgICAgICAgICAgICBjaElkeCArPSBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8qIENvdW50IHNpZGUgY2hhbm5lbHMvZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgZWwrPTEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7Ci0gICAgICAgICAgICAgICAgICBlbElkeCArPSAxOwotICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2hNYXBwaW5nW2NoSWR4XSA9IGNoYW5uZWxJZHg7CisgICAgICAgICAgICAgIGNoVHlwZVtjaElkeF0gPSBhQ2hUeXBlOworICAgICAgICAgICAgICBjaEluZGV4W2NoSWR4XSA9IGZjW2hlaWdodExheWVyXTsKKyAgICAgICAgICAgICAgaWYgKGlzQ3BlKSB7CisgICAgICAgICAgICAgICAgY2hNYXBwaW5nW2NoSWR4ICsgMV0gPSBjaGFubmVsSWR4ICsgMTsKKyAgICAgICAgICAgICAgICBjaFR5cGVbY2hJZHggKyAxXSA9IGFDaFR5cGU7CisgICAgICAgICAgICAgICAgY2hJbmRleFtjaElkeCArIDFdID0gZmNbaGVpZ2h0TGF5ZXJdICsgMTsKICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAvKiBDb3VudCBiYWNrIGNoYW5uZWxzL2VsZW1lbnRzICovCi0gICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGVsKz0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBQY2UtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgewotICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKLSAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5CYWNrRWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGggPT0gMCkgeyAgLyogbm9ybWFsIGhlaWdodCAqLwotICAgICAgICAgICAgICAgIGVsSWR4ICs9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKLSAgICAgICAgICAgICAgICBjaElkeCArPSBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7Ci0gICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKmVsTWFwcGluZyA9IGVsSWR4OworICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoTWFwcGluZ1tjaElkeF0gPSBjaGFubmVsSWR4OwotICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IGFDaFR5cGU7Ci0gICAgICAgICAgICBjaEluZGV4W2NoSWR4XSA9IGZjW2hlaWdodExheWVyXTsKLSAgICAgICAgICAgIGlmIChpc0NwZSkgewotICAgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHgrMV0gPSBjaGFubmVsSWR4KzE7Ci0gICAgICAgICAgICAgIGNoVHlwZVtjaElkeCsxXSA9IGFDaFR5cGU7Ci0gICAgICAgICAgICAgIGNoSW5kZXhbY2hJZHgrMV0gPSBmY1toZWlnaHRMYXllcl0rMTsKKyAgICAgICAgICAgIGVjW2hlaWdodExheWVyXSArPSAxOworICAgICAgICAgICAgaWYgKHBQY2UtPkZyb250RWxlbWVudElzQ3BlW2ldKSB7CisgICAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAyOworICAgICAgICAgICAgICBmY1toZWlnaHRMYXllcl0gKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAxOworICAgICAgICAgICAgICBmY1toZWlnaHRMYXllcl0gKz0gMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICplbE1hcHBpbmcgPSBlbElkeDsKLSAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgIH0KLSAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKLSAgICAgICAgICBpZiAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0pIHsKLSAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAyOwotICAgICAgICAgICAgZmNbaGVpZ2h0TGF5ZXJdICs9IDI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAxOwotICAgICAgICAgICAgZmNbaGVpZ2h0TGF5ZXJdICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIHNlYXJjaCBpbiBzaWRlIGNoYW5uZWxzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKLSAgICAgICAgICBpbnQgaGVpZ2h0TGF5ZXIgPSBwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm9baV07Ci0gICAgICAgICAgaWYgKGlzQ3BlID09IHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbaV0gJiYgcFBjZS0+U2lkZUVsZW1lbnRUYWdTZWxlY3RbaV0gPT0gdGFnKSB7Ci0gICAgICAgICAgICBpbnQgaCwgZWxJZHggPSBlY1toZWlnaHRMYXllcl0sIGNoSWR4ID0gY2NbaGVpZ2h0TGF5ZXJdOwotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGFDaFR5cGUgPSAoQVVESU9fQ0hBTk5FTF9UWVBFKSgoaGVpZ2h0TGF5ZXI8PDQpIHwgQUNUX1NJREUpOwotICAgICAgICAgICAgZm9yIChoID0gaGVpZ2h0TGF5ZXItMTsgaCA+PSAwOyBoLT0xKSB7Ci0gICAgICAgICAgICAgIGludCBlbDsKLSAgICAgICAgICAgICAgLyogQ291bnQgZnJvbnQgY2hhbm5lbHMvZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGVsKz0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKLSAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7Ci0gICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgICAgIC8qIHNlYXJjaCBpbiBzaWRlIGNoYW5uZWxzICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgaW50IGhlaWdodExheWVyID0gcFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvW2ldOworICAgICAgICAgICAgaWYgKGlzQ3BlID09IHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbaV0gJiYKKyAgICAgICAgICAgICAgICBwUGNlLT5TaWRlRWxlbWVudFRhZ1NlbGVjdFtpXSA9PSB0YWcpIHsKKyAgICAgICAgICAgICAgaW50IGgsIGVsSWR4ID0gZWNbaGVpZ2h0TGF5ZXJdLCBjaElkeCA9IGNjW2hlaWdodExheWVyXTsKKyAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGFDaFR5cGUgPQorICAgICAgICAgICAgICAgICAgKEFVRElPX0NIQU5ORUxfVFlQRSkoKGhlaWdodExheWVyIDw8IDQpIHwgQUNUX1NJREUpOworICAgICAgICAgICAgICBmb3IgKGggPSBoZWlnaHRMYXllciAtIDE7IGggPj0gMDsgaCAtPSAxKSB7CisgICAgICAgICAgICAgICAgaW50IGVsOworICAgICAgICAgICAgICAgIC8qIENvdW50IGZyb250IGNoYW5uZWxzL2VsZW1lbnRzICovCisgICAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7CisgICAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIENvdW50IHNpZGUgY2hhbm5lbHMvZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7CisgICAgICAgICAgICAgICAgICBpZiAocFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7CisgICAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogQ291bnQgYmFjayBjaGFubmVscy9lbGVtZW50cyAqLworICAgICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaCA9PQorICAgICAgICAgICAgICAgICAgICAwKSB7IC8qIExGRSBjaGFubmVscyBiZWxvbmcgdG8gdGhlIG5vcm1hbCBoZWlnaHQgbGF5ZXIgKi8KKyAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKKyAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLyogQ291bnQgc2lkZSBjaGFubmVscy9lbGVtZW50cyAqLwotICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBlbCs9MSkgewotICAgICAgICAgICAgICAgIGlmIChwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKLSAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7Ci0gICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHhdID0gY2hhbm5lbElkeDsKKyAgICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IGFDaFR5cGU7CisgICAgICAgICAgICAgIGNoSW5kZXhbY2hJZHhdID0gc2NbaGVpZ2h0TGF5ZXJdOworICAgICAgICAgICAgICBpZiAoaXNDcGUpIHsKKyAgICAgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHggKyAxXSA9IGNoYW5uZWxJZHggKyAxOworICAgICAgICAgICAgICAgIGNoVHlwZVtjaElkeCArIDFdID0gYUNoVHlwZTsKKyAgICAgICAgICAgICAgICBjaEluZGV4W2NoSWR4ICsgMV0gPSBzY1toZWlnaHRMYXllcl0gKyAxOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8qIENvdW50IGJhY2sgY2hhbm5lbHMvZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgZWwrPTEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7Ci0gICAgICAgICAgICAgICAgICBlbElkeCArPSAxOwotICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoaCA9PSAwKSB7ICAvKiBMRkUgY2hhbm5lbHMgYmVsb25nIHRvIHRoZSBub3JtYWwgaGVpZ2h0IGxheWVyICovCi0gICAgICAgICAgICAgICAgZWxJZHggKz0gcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOwotICAgICAgICAgICAgICAgIGNoSWR4ICs9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKLSAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqZWxNYXBwaW5nID0gZWxJZHg7CisgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hNYXBwaW5nW2NoSWR4XSA9IGNoYW5uZWxJZHg7Ci0gICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gYUNoVHlwZTsKLSAgICAgICAgICAgIGNoSW5kZXhbY2hJZHhdID0gc2NbaGVpZ2h0TGF5ZXJdOwotICAgICAgICAgICAgaWYgKGlzQ3BlKSB7Ci0gICAgICAgICAgICAgIGNoTWFwcGluZ1tjaElkeCsxXSA9IGNoYW5uZWxJZHgrMTsKLSAgICAgICAgICAgICAgY2hUeXBlW2NoSWR4KzFdID0gYUNoVHlwZTsKLSAgICAgICAgICAgICAgY2hJbmRleFtjaElkeCsxXSA9IHNjW2hlaWdodExheWVyXSsxOworICAgICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgICBpZiAocFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtpXSkgeworICAgICAgICAgICAgICBjY1toZWlnaHRMYXllcl0gKz0gMjsKKyAgICAgICAgICAgICAgc2NbaGVpZ2h0TGF5ZXJdICs9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjY1toZWlnaHRMYXllcl0gKz0gMTsKKyAgICAgICAgICAgICAgc2NbaGVpZ2h0TGF5ZXJdICs9IDE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZWxNYXBwaW5nID0gZWxJZHg7Ci0gICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7Ci0gICAgICAgICAgaWYgKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbaV0pIHsKLSAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAyOwotICAgICAgICAgICAgc2NbaGVpZ2h0TGF5ZXJdICs9IDI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAxOwotICAgICAgICAgICAgc2NbaGVpZ2h0TGF5ZXJdICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIHNlYXJjaCBpbiBiYWNrIGNoYW5uZWxzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKLSAgICAgICAgICBpbnQgaGVpZ2h0TGF5ZXIgPSBwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9baV07Ci0gICAgICAgICAgaWYgKGlzQ3BlID09IHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbaV0gJiYgcFBjZS0+QmFja0VsZW1lbnRUYWdTZWxlY3RbaV0gPT0gdGFnKSB7Ci0gICAgICAgICAgICBpbnQgaCwgZWxJZHggPSBlY1toZWlnaHRMYXllcl0sIGNoSWR4ID0gY2NbaGVpZ2h0TGF5ZXJdOwotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGFDaFR5cGUgPSAoQVVESU9fQ0hBTk5FTF9UWVBFKSgoaGVpZ2h0TGF5ZXI8PDQpIHwgQUNUX0JBQ0spOwotICAgICAgICAgICAgZm9yIChoID0gaGVpZ2h0TGF5ZXItMTsgaCA+PSAwOyBoLT0xKSB7Ci0gICAgICAgICAgICAgIGludCBlbDsKLSAgICAgICAgICAgICAgLyogQ291bnQgZnJvbnQgY2hhbm5lbHMvZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGVsKz0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKLSAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7Ci0gICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgICAgIC8qIHNlYXJjaCBpbiBiYWNrIGNoYW5uZWxzICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgaW50IGhlaWdodExheWVyID0gcFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvW2ldOworICAgICAgICAgICAgaWYgKGlzQ3BlID09IHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbaV0gJiYKKyAgICAgICAgICAgICAgICBwUGNlLT5CYWNrRWxlbWVudFRhZ1NlbGVjdFtpXSA9PSB0YWcpIHsKKyAgICAgICAgICAgICAgaW50IGgsIGVsSWR4ID0gZWNbaGVpZ2h0TGF5ZXJdLCBjaElkeCA9IGNjW2hlaWdodExheWVyXTsKKyAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGFDaFR5cGUgPQorICAgICAgICAgICAgICAgICAgKEFVRElPX0NIQU5ORUxfVFlQRSkoKGhlaWdodExheWVyIDw8IDQpIHwgQUNUX0JBQ0spOworICAgICAgICAgICAgICBmb3IgKGggPSBoZWlnaHRMYXllciAtIDE7IGggPj0gMDsgaCAtPSAxKSB7CisgICAgICAgICAgICAgICAgaW50IGVsOworICAgICAgICAgICAgICAgIC8qIENvdW50IGZyb250IGNoYW5uZWxzL2VsZW1lbnRzICovCisgICAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7CisgICAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIENvdW50IHNpZGUgY2hhbm5lbHMvZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7CisgICAgICAgICAgICAgICAgICBpZiAocFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7CisgICAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogQ291bnQgYmFjayBjaGFubmVscy9lbGVtZW50cyAqLworICAgICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaCA9PSAwKSB7IC8qIG5vcm1hbCBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKKyAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLyogQ291bnQgc2lkZSBjaGFubmVscy9lbGVtZW50cyAqLwotICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBlbCs9MSkgewotICAgICAgICAgICAgICAgIGlmIChwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKLSAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7Ci0gICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHhdID0gY2hhbm5lbElkeDsKKyAgICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IGFDaFR5cGU7CisgICAgICAgICAgICAgIGNoSW5kZXhbY2hJZHhdID0gYmNbaGVpZ2h0TGF5ZXJdOworICAgICAgICAgICAgICBpZiAoaXNDcGUpIHsKKyAgICAgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHggKyAxXSA9IGNoYW5uZWxJZHggKyAxOworICAgICAgICAgICAgICAgIGNoVHlwZVtjaElkeCArIDFdID0gYUNoVHlwZTsKKyAgICAgICAgICAgICAgICBjaEluZGV4W2NoSWR4ICsgMV0gPSBiY1toZWlnaHRMYXllcl0gKyAxOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8qIENvdW50IGJhY2sgY2hhbm5lbHMvZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgZWwrPTEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7Ci0gICAgICAgICAgICAgICAgICBlbElkeCArPSAxOwotICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoaCA9PSAwKSB7ICAvKiBub3JtYWwgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgZWxJZHggKz0gcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOwotICAgICAgICAgICAgICAgIGNoSWR4ICs9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKLSAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqZWxNYXBwaW5nID0gZWxJZHg7CisgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hNYXBwaW5nW2NoSWR4XSA9IGNoYW5uZWxJZHg7Ci0gICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gYUNoVHlwZTsKLSAgICAgICAgICAgIGNoSW5kZXhbY2hJZHhdID0gYmNbaGVpZ2h0TGF5ZXJdOwotICAgICAgICAgICAgaWYgKGlzQ3BlKSB7Ci0gICAgICAgICAgICAgIGNoTWFwcGluZ1tjaElkeCsxXSA9IGNoYW5uZWxJZHgrMTsKLSAgICAgICAgICAgICAgY2hUeXBlW2NoSWR4KzFdID0gYUNoVHlwZTsKLSAgICAgICAgICAgICAgY2hJbmRleFtjaElkeCsxXSA9IGJjW2hlaWdodExheWVyXSsxOworICAgICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgICBpZiAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSkgeworICAgICAgICAgICAgICBjY1toZWlnaHRMYXllcl0gKz0gMjsKKyAgICAgICAgICAgICAgYmNbaGVpZ2h0TGF5ZXJdICs9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjY1toZWlnaHRMYXllcl0gKz0gMTsKKyAgICAgICAgICAgICAgYmNbaGVpZ2h0TGF5ZXJdICs9IDE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZWxNYXBwaW5nID0gZWxJZHg7Ci0gICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7Ci0gICAgICAgICAgaWYgKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbaV0pIHsKLSAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAyOwotICAgICAgICAgICAgYmNbaGVpZ2h0TGF5ZXJdICs9IDI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAxOwotICAgICAgICAgICAgYmNbaGVpZ2h0TGF5ZXJdICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIElEX0xGRToKLSAgICAgIHsgLyogVW5mb3J0dW5hdGVseSB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggYWxsIG5vcm1hbCBoZWlnaHQKLSAgICAgICAgICAgbGF5ZXIgZWxlbWVudHMgdG8gZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgTEZFIGNoYW5uZWxzLgotICAgICAgICAgICBTdGFydCB3aXRoIGNvdW50aW5nIHRoZSBmcm9udCBjaGFubmVscy9lbGVtZW50cyBhdCBub3JtYWwgaGVpZ2h0ICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSs9MSkgewotICAgICAgICAgIGludCBoZWlnaHRMYXllciA9IHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9baV07Ci0gICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7Ci0gICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtpXSkgPyAyIDogMTsKLSAgICAgICAgfQotICAgICAgICAvKiBDb3VudCBzaWRlIGNoYW5uZWxzL2VsZW1lbnRzIGF0IG5vcm1hbCBoZWlnaHQgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrPTEpIHsKLSAgICAgICAgICBpbnQgaGVpZ2h0TGF5ZXIgPSBwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm9baV07Ci0gICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7Ci0gICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2ldKSA/IDIgOiAxOwotICAgICAgICB9Ci0gICAgICAgIC8qIENvdW50IGJhY2sgY2hhbm5lbHMvZWxlbWVudHMgYXQgbm9ybWFsIGhlaWdodCAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSs9MSkgewotICAgICAgICAgIGludCBoZWlnaHRMYXllciA9IHBQY2UtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tpXTsKLSAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKLSAgICAgICAgICBjY1toZWlnaHRMYXllcl0gKz0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbaV0pID8gMiA6IDE7Ci0gICAgICAgIH0KKyAgICAgICAgY2FzZSBJRF9MRkU6IHsgLyogVW5mb3J0dW5hdGVseSB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggYWxsIG5vcm1hbCBoZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIgZWxlbWVudHMgdG8gZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgTEZFCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLiBTdGFydCB3aXRoIGNvdW50aW5nIHRoZSBmcm9udAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscy9lbGVtZW50cyBhdCBub3JtYWwgaGVpZ2h0ICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpICs9IDEpIHsKKyAgICAgICAgICAgIGludCBoZWlnaHRMYXllciA9IHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9baV07CisgICAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKKyAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0pID8gMiA6IDE7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIENvdW50IHNpZGUgY2hhbm5lbHMvZWxlbWVudHMgYXQgbm9ybWFsIGhlaWdodCAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpICs9IDEpIHsKKyAgICAgICAgICAgIGludCBoZWlnaHRMYXllciA9IHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tpXTsKKyAgICAgICAgICAgIGVjW2hlaWdodExheWVyXSArPSAxOworICAgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2ldKSA/IDIgOiAxOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBDb3VudCBiYWNrIGNoYW5uZWxzL2VsZW1lbnRzIGF0IG5vcm1hbCBoZWlnaHQgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSArPSAxKSB7CisgICAgICAgICAgICBpbnQgaGVpZ2h0TGF5ZXIgPSBwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9baV07CisgICAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKKyAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSkgPyAyIDogMTsKKyAgICAgICAgICB9CiAKLSAgICAgICAgLyogc2VhcmNoIGluIGxmZSBjaGFubmVscyAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKLSAgICAgICAgICBpbnQgZWxJZHggPSBlY1swXTsgIC8qIExGRSBjaGFubmVscyBiZWxvbmcgdG8gdGhlIG5vcm1hbCBoZWlnaHQgbGF5ZXIgKi8KLSAgICAgICAgICBpbnQgY2hJZHggPSBjY1swXTsKLSAgICAgICAgICBpZiAoIHBQY2UtPkxmZUVsZW1lbnRUYWdTZWxlY3RbaV0gPT0gdGFnICkgewotICAgICAgICAgICAgY2hNYXBwaW5nW2NoSWR4XSA9IGNoYW5uZWxJZHg7Ci0gICAgICAgICAgICAqZWxNYXBwaW5nID0gZWxJZHg7Ci0gICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gQUNUX0xGRTsKLSAgICAgICAgICAgIGNoSW5kZXhbY2hJZHhdID0gbGM7Ci0gICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAvKiBzZWFyY2ggaW4gbGZlIGNoYW5uZWxzICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICBpbnQgZWxJZHggPQorICAgICAgICAgICAgICAgIGVjWzBdOyAvKiBMRkUgY2hhbm5lbHMgYmVsb25nIHRvIHRoZSBub3JtYWwgaGVpZ2h0IGxheWVyICovCisgICAgICAgICAgICBpbnQgY2hJZHggPSBjY1swXTsKKyAgICAgICAgICAgIGlmIChwUGNlLT5MZmVFbGVtZW50VGFnU2VsZWN0W2ldID09IHRhZykgeworICAgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHhdID0gY2hhbm5lbElkeDsKKyAgICAgICAgICAgICAgKmVsTWFwcGluZyA9IGVsSWR4OworICAgICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gQUNUX0xGRTsKKyAgICAgICAgICAgICAgY2hJbmRleFtjaElkeF0gPSBsYzsKKyAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlY1swXSArPSAxOworICAgICAgICAgICAgY2NbMF0gKz0gMTsKKyAgICAgICAgICAgIGxjICs9IDE7CiAgICAgICAgICAgfQotICAgICAgICAgIGVjWzBdICs9IDE7Ci0gICAgICAgICAgY2NbMF0gKz0gMTsKLSAgICAgICAgICBsYyArPSAxOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOworICAgICAgICB9IGJyZWFrOwogCi0gICAgICAvKiBOb24gYXVkaW8gZWxlbWVudHMgKi8KLSAgICAgIGNhc2UgSURfQ0NFOgotICAgICAgICAvKiBzZWFyY2ggaW4gY2NlIGNoYW5uZWxzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1WYWxpZENjRWxlbWVudHM7IGkrKykgewotICAgICAgICAgIGlmIChwUGNlLT5WYWxpZENjRWxlbWVudFRhZ1NlbGVjdFtpXSA9PSB0YWcpIHsKLSAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAvKiBOb24gYXVkaW8gZWxlbWVudHMgKi8KKyAgICAgICAgY2FzZSBJRF9DQ0U6CisgICAgICAgICAgLyogc2VhcmNoIGluIGNjZSBjaGFubmVscyAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1WYWxpZENjRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgaWYgKHBQY2UtPlZhbGlkQ2NFbGVtZW50VGFnU2VsZWN0W2ldID09IHRhZykgeworICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElEX0RTRToKLSAgICAgICAgLyogc2VhcmNoIGFzc29jaWF0ZWQgZGF0YSBlbGVtZW50cyAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtQXNzb2NEYXRhRWxlbWVudHM7IGkrKykgewotICAgICAgICAgIGlmIChwUGNlLT5Bc3NvY0RhdGFFbGVtZW50VGFnU2VsZWN0W2ldID09IHRhZykgewotICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSURfRFNFOgorICAgICAgICAgIC8qIHNlYXJjaCBhc3NvY2lhdGVkIGRhdGEgZWxlbWVudHMgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtQXNzb2NEYXRhRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgaWYgKHBQY2UtPkFzc29jRGF0YUVsZW1lbnRUYWdTZWxlY3RbaV0gPT0gdGFnKSB7CisgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiAwOwogICAgICAgfQotICAgICAgcmV0dXJuIDA7ICAvKiBub3QgZm91bmQgaW4gYW55IGxpc3QgKi8KKyAgICAgIHJldHVybiAwOyAvKiBub3QgZm91bmQgaW4gYW55IGxpc3QgKi8KICAgICB9Ci0jZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLwogICB9CiAKICAgcmV0dXJuIDE7CiB9CiAKLSNpZmRlZiAgVFBfUENFX0VOQUJMRQotaW50IENQcm9ncmFtQ29uZmlnX0dldEVsZW1lbnRUYWJsZSgKLSAgICAgICAgY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UsCi0gICAgICAgIE1QNF9FTEVNRU5UX0lEICBlbExpc3RbXSwKLSAgICAgICAgY29uc3QgSU5UIGVsTGlzdFNpemUsCi0gICAgICAgIFVDSEFSICpwQ2hNYXBJZHgKLSAgICAgICApCi17CisjZGVmaW5lIFNQRUFLRVJfUExBTkVfTk9STUFMIDAKKyNkZWZpbmUgU1BFQUtFUl9QTEFORV9UT1AgMQorI2RlZmluZSBTUEVBS0VSX1BMQU5FX0JPVFRPTSAyCisKK3ZvaWQgQ1Byb2dyYW1Db25maWdfR2V0Q2hhbm5lbERlc2NyaXB0aW9uKGNvbnN0IFVJTlQgY2hDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBjaFR5cGVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGNoSW5kZXhbXSkgeworICBGREtfQVNTRVJUKGNoVHlwZSAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChjaEluZGV4ICE9IE5VTEwpOworCisgIGlmICgoY2hDb25maWcgPT0gMCkgJiYgKHBQY2UgIT0gTlVMTCkpIHsKKyAgICBpZiAocFBjZS0+aXNWYWxpZCkgeworICAgICAgaW50IHNwa1BsYW5lLCBjaElkeCA9IDA7CisgICAgICBmb3IgKHNwa1BsYW5lID0gU1BFQUtFUl9QTEFORV9OT1JNQUw7IHNwa1BsYW5lIDw9IFNQRUFLRVJfUExBTkVfQk9UVE9NOworICAgICAgICAgICBzcGtQbGFuZSArPSAxKSB7CisgICAgICAgIGludCBlbElkeCwgZ3JwQ2hJZHggPSAwOworICAgICAgICBmb3IgKGVsSWR4ID0gMDsgZWxJZHggPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgZWxJZHggKz0gMSkgeworICAgICAgICAgIGlmIChwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvW2VsSWR4XSA9PSBzcGtQbGFuZSkgeworICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IChBVURJT19DSEFOTkVMX1RZUEUpKChzcGtQbGFuZSA8PCA0KSB8IEFDVF9GUk9OVCk7CisgICAgICAgICAgICBjaEluZGV4W2NoSWR4KytdID0gZ3JwQ2hJZHgrKzsKKyAgICAgICAgICAgIGlmIChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtlbElkeF0pIHsKKyAgICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IChBVURJT19DSEFOTkVMX1RZUEUpKChzcGtQbGFuZSA8PCA0KSB8IEFDVF9GUk9OVCk7CisgICAgICAgICAgICAgIGNoSW5kZXhbY2hJZHgrK10gPSBncnBDaElkeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBncnBDaElkeCA9IDA7CisgICAgICAgIGZvciAoZWxJZHggPSAwOyBlbElkeCA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGVsSWR4ICs9IDEpIHsKKyAgICAgICAgICBpZiAocFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvW2VsSWR4XSA9PSBzcGtQbGFuZSkgeworICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IChBVURJT19DSEFOTkVMX1RZUEUpKChzcGtQbGFuZSA8PCA0KSB8IEFDVF9TSURFKTsKKyAgICAgICAgICAgIGNoSW5kZXhbY2hJZHgrK10gPSBncnBDaElkeCsrOworICAgICAgICAgICAgaWYgKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbZWxJZHhdKSB7CisgICAgICAgICAgICAgIGNoVHlwZVtjaElkeF0gPSAoQVVESU9fQ0hBTk5FTF9UWVBFKSgoc3BrUGxhbmUgPDwgNCkgfCBBQ1RfU0lERSk7CisgICAgICAgICAgICAgIGNoSW5kZXhbY2hJZHgrK10gPSBncnBDaElkeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBncnBDaElkeCA9IDA7CisgICAgICAgIGZvciAoZWxJZHggPSAwOyBlbElkeCA8IHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGVsSWR4ICs9IDEpIHsKKyAgICAgICAgICBpZiAocFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvW2VsSWR4XSA9PSBzcGtQbGFuZSkgeworICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IChBVURJT19DSEFOTkVMX1RZUEUpKChzcGtQbGFuZSA8PCA0KSB8IEFDVF9CQUNLKTsKKyAgICAgICAgICAgIGNoSW5kZXhbY2hJZHgrK10gPSBncnBDaElkeCsrOworICAgICAgICAgICAgaWYgKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbZWxJZHhdKSB7CisgICAgICAgICAgICAgIGNoVHlwZVtjaElkeF0gPSAoQVVESU9fQ0hBTk5FTF9UWVBFKSgoc3BrUGxhbmUgPDwgNCkgfCBBQ1RfQkFDSyk7CisgICAgICAgICAgICAgIGNoSW5kZXhbY2hJZHgrK10gPSBncnBDaElkeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBncnBDaElkeCA9IDA7CisgICAgICAgIGlmIChzcGtQbGFuZSA9PSBTUEVBS0VSX1BMQU5FX05PUk1BTCkgeworICAgICAgICAgIGZvciAoZWxJZHggPSAwOyBlbElkeCA8IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsgZWxJZHggKz0gMSkgeworICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IEFDVF9MRkU7CisgICAgICAgICAgICBjaEluZGV4W2NoSWR4KytdID0gZ3JwQ2hJZHgrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IGNoSWR4OworICAgIGZvciAoY2hJZHggPSAwOyBjaElkeCA8IGdldE51bWJlck9mVG90YWxDaGFubmVscyhjaENvbmZpZyk7IGNoSWR4ICs9IDEpIHsKKyAgICAgIGdldEltcGxpY2l0QXVkaW9DaGFubmVsVHlwZUFuZEluZGV4KCZjaFR5cGVbY2hJZHhdLCAmY2hJbmRleFtjaElkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENvbmZpZywgY2hJZHgpOworICAgIH0KKyAgfQorfQorCitpbnQgQ1Byb2dyYW1Db25maWdfR2V0UGNlQ2hNYXAoY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UsIFVDSEFSIHBjZUNoTWFwW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBwY2VDaE1hcExlbikgeworICBjb25zdCBVQ0hBUiAqbkVsZW1lbnRzID0gJnBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOworICBjb25zdCBVQ0hBUiAqZWxIZWlnaHRbM10sICplbElzQ3BlWzNdOworICB1bnNpZ25lZCBjaElkeCwgcGxhbmUsIGdycCwgb2Zmc2V0LCB0b3RDaFszXSwgbnVtQ2hbM11bNF07CisKKyAgRkRLX0FTU0VSVChwUGNlICE9IE5VTEwpOworICBGREtfQVNTRVJUKHBjZUNoTWFwICE9IE5VTEwpOworCisgIC8qIEluaXQgY291bnRlcjogKi8KKyAgRkRLbWVtY2xlYXIodG90Q2gsIDMgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgRkRLbWVtY2xlYXIobnVtQ2gsIDMgKiA0ICogc2l6ZW9mKHVuc2lnbmVkKSk7CisKKyAgLyogQW5hbHlzZSBQQ0U6ICovCisgIGVsSGVpZ2h0WzBdID0gcFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mbzsKKyAgZWxJc0NwZVswXSA9IHBQY2UtPkZyb250RWxlbWVudElzQ3BlOworICBlbEhlaWdodFsxXSA9IHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mbzsKKyAgZWxJc0NwZVsxXSA9IHBQY2UtPlNpZGVFbGVtZW50SXNDcGU7CisgIGVsSGVpZ2h0WzJdID0gcFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvOworICBlbElzQ3BlWzJdID0gcFBjZS0+QmFja0VsZW1lbnRJc0NwZTsKKworICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPD0gU1BFQUtFUl9QTEFORV9CT1RUT007IHBsYW5lICs9IDEpIHsKKyAgICBmb3IgKGdycCA9IDA7IGdycCA8IDM7IGdycCArPSAxKSB7IC8qIGZyb250LCBzaWRlLCBiYWNrICovCisgICAgICB1bnNpZ25lZCBlbDsKKyAgICAgIGZvciAoZWwgPSAwOyBlbCA8IG5FbGVtZW50c1tncnBdOyBlbCArPSAxKSB7CisgICAgICAgIGlmIChlbEhlaWdodFtncnBdW2VsXSA9PSBwbGFuZSkgeworICAgICAgICAgIHVuc2lnbmVkIGVsQ2ggPSBlbElzQ3BlW2dycF1bZWxdID8gMiA6IDE7CisgICAgICAgICAgbnVtQ2hbcGxhbmVdW2dycF0gKz0gZWxDaDsKKyAgICAgICAgICB0b3RDaFtwbGFuZV0gKz0gZWxDaDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAocGxhbmUgPT0gU1BFQUtFUl9QTEFORV9OT1JNQUwpIHsKKyAgICAgIHVuc2lnbmVkIGVsQ2ggPSBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7CisgICAgICBudW1DaFtwbGFuZV1bZ3JwXSArPSBlbENoOworICAgICAgdG90Q2hbcGxhbmVdICs9IGVsQ2g7CisgICAgfQorICB9CisgIC8qIFNhbml0eSBjaGVja3M6ICovCisgIGNoSWR4ID0gdG90Q2hbU1BFQUtFUl9QTEFORV9OT1JNQUxdICsgdG90Q2hbU1BFQUtFUl9QTEFORV9UT1BdICsKKyAgICAgICAgICB0b3RDaFtTUEVBS0VSX1BMQU5FX0JPVFRPTV07CisgIGlmIChjaElkeCA+IHBjZUNoTWFwTGVuKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogQ3JlYXRlIG1hcDogKi8KKyAgb2Zmc2V0ID0gZ3JwID0gMDsKKyAgdW5zaWduZWQgZ3JwVGhyZXNoID0gbnVtQ2hbU1BFQUtFUl9QTEFORV9OT1JNQUxdW2dycF07CisgIGZvciAoY2hJZHggPSAwOyBjaElkeCA8IHRvdENoW1NQRUFLRVJfUExBTkVfTk9STUFMXTsgY2hJZHggKz0gMSkgeworICAgIHdoaWxlICgoY2hJZHggPj0gZ3JwVGhyZXNoKSAmJiAoZ3JwIDwgMykpIHsKKyAgICAgIG9mZnNldCArPSBudW1DaFsxXVtncnBdICsgbnVtQ2hbMl1bZ3JwXTsKKyAgICAgIGdycCArPSAxOworICAgICAgZ3JwVGhyZXNoICs9IG51bUNoW1NQRUFLRVJfUExBTkVfTk9STUFMXVtncnBdOworICAgIH0KKyAgICBwY2VDaE1hcFtjaElkeF0gPSBjaElkeCArIG9mZnNldDsKKyAgfQorICBvZmZzZXQgPSAwOworICBmb3IgKGdycCA9IDA7IGdycCA8IDQ7IGdycCArPSAxKSB7IC8qIGZyb250LCBzaWRlLCBiYWNrIGFuZCBsZmUgKi8KKyAgICBvZmZzZXQgKz0gbnVtQ2hbU1BFQUtFUl9QTEFORV9OT1JNQUxdW2dycF07CisgICAgZm9yIChwbGFuZSA9IFNQRUFLRVJfUExBTkVfVE9QOyBwbGFuZSA8PSBTUEVBS0VSX1BMQU5FX0JPVFRPTTsgcGxhbmUgKz0gMSkgeworICAgICAgdW5zaWduZWQgbWFwQ2g7CisgICAgICBmb3IgKG1hcENoID0gMDsgbWFwQ2ggPCBudW1DaFtwbGFuZV1bZ3JwXTsgbWFwQ2ggKz0gMSkgeworICAgICAgICBwY2VDaE1hcFtjaElkeCsrXSA9IG9mZnNldDsKKyAgICAgICAgb2Zmc2V0ICs9IDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitpbnQgQ1Byb2dyYW1Db25maWdfR2V0RWxlbWVudFRhYmxlKGNvbnN0IENQcm9ncmFtQ29uZmlnICpwUGNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUDRfRUxFTUVOVF9JRCBlbExpc3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGVsTGlzdFNpemUsIFVDSEFSICpwQ2hNYXBJZHgpIHsKICAgaW50IGksIGVsID0gMDsKIAogICBGREtfQVNTRVJUKGVsTGlzdCAhPSBOVUxMKTsKICAgRkRLX0FTU0VSVChwQ2hNYXBJZHggIT0gTlVMTCk7CisgIEZES19BU1NFUlQocFBjZSAhPSBOVUxMKTsKIAogICAqcENoTWFwSWR4ID0gMDsKIAotICBpZiAoIGVsTGlzdFNpemUKLSAgICA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzICsgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50cyArIHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHMgKyBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHMKLSAgICApCi0gIHsKKyAgaWYgKChlbExpc3RTaXplIDwKKyAgICAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyArIHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHMgKworICAgICAgICAgICBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzICsgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzKSB8fAorICAgICAgKHBQY2UtPk51bUNoYW5uZWxzID09IDApKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspCi0gIHsKLSAgICBlbExpc3RbZWwrK10gPSAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0pID8gIElEX0NQRSA6IElEX1NDRTsKKyAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpICs9IDEpIHsKKyAgICBlbExpc3RbZWwrK10gPSAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0pID8gSURfQ1BFIDogSURfU0NFOwogICB9CiAKLSAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspCi0gIHsKLSAgICBlbExpc3RbZWwrK10gPSAocFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtpXSkgPyAgSURfQ1BFIDogSURfU0NFOworICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSArPSAxKSB7CisgICAgZWxMaXN0W2VsKytdID0gKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbaV0pID8gSURfQ1BFIDogSURfU0NFOwogICB9CiAKLSAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspCi0gIHsKLSAgICBlbExpc3RbZWwrK10gPSAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSkgPyAgSURfQ1BFIDogSURfU0NFOworICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSArPSAxKSB7CisgICAgZWxMaXN0W2VsKytdID0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbaV0pID8gSURfQ1BFIDogSURfU0NFOwogICB9CiAKLSAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7IGkrKykKLSAgeworICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpICs9IDEpIHsKICAgICBlbExpc3RbZWwrK10gPSBJRF9MRkU7CiAgIH0KIAotCiAgIC8qIEZpbmQgYW4gY29ycmVzcG9uZGluZyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaWYgcG9zc2libGUgKi8KICAgc3dpdGNoIChwUGNlLT5OdW1DaGFubmVscykgewotICBjYXNlIDE6IGNhc2UgMjogY2FzZSAzOiBjYXNlIDQ6IGNhc2UgNTogY2FzZSA2OgotICAgIC8qIE9uZSBhbmQgdHdvIGNoYW5uZWxzIGhhdmUgbm8gYWx0ZXJuYXRpdmVzLiBUaGUgb3RoZXIgb25lcyBhcmUgbWFwcGVkIGRpcmVjdGx5IHRvIHRoZQotICAgICAgIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBjb25maWcuIEJlY2F1c2Ugb2YgbGVnYWN5IHJlYXNvbnMgb3IgZm9yIGxhY2sgb2YgYWx0ZXJuYXRpdmUgbWFwcGluZ3MuICovCi0gICAgKnBDaE1hcElkeCA9IHBQY2UtPk51bUNoYW5uZWxzOwotICAgIGJyZWFrOwotICBjYXNlIDc6Ci0gICAgeworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgICAvKiBPbmUgYW5kIHR3byBjaGFubmVscyBoYXZlIG5vIGFsdGVybmF0aXZlcy4gKi8KKyAgICAgICpwQ2hNYXBJZHggPSBwUGNlLT5OdW1DaGFubmVsczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA1OgorICAgIGNhc2UgNjogeyAvKiBUZXN0IGlmIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgY2FuIGJlIHVzZWQgYXMgY2hhbm5lbCBjb25maWc6CisgICAgICAgICAgICAgICAqLworICAgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcFBjZSwgQ1Byb2dyYW1Db25maWcsIDEpOworICAgICAgLyogQ3JlYXRlIGEgUENFIGZvciB0aGUgY29uZmlnIHRvIHRlc3QgLi4uICovCisgICAgICBDUHJvZ3JhbUNvbmZpZ19HZXREZWZhdWx0KHRtcFBjZSwgcFBjZS0+TnVtQ2hhbm5lbHMpOworICAgICAgLyogLi4uIGFuZCBjb21wYXJlIGl0IHdpdGggdGhlIGdpdmVuIG9uZS4gKi8KKyAgICAgICpwQ2hNYXBJZHggPSAoIShDUHJvZ3JhbUNvbmZpZ19Db21wYXJlKHBQY2UsIHRtcFBjZSkgJiAweEUpKQorICAgICAgICAgICAgICAgICAgICAgICA/IHBQY2UtPk51bUNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgIC8qIElmIGNvbXBhcmUgcmVzdWx0IGlzIDAgb3IgMSB3ZSBjYW4gYmUgc3VyZSB0aGF0IGl0IGlzIGNoYW5uZWwKKyAgICAgICAqIGNvbmZpZyAxMS4gKi8KKyAgICAgIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wUGNlLCBDUHJvZ3JhbUNvbmZpZywgMSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIDc6IHsKICAgICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBQY2UsIENQcm9ncmFtQ29uZmlnLCAxKTsKICAgICAgIC8qIENyZWF0ZSBhIFBDRSBmb3IgdGhlIGNvbmZpZyB0byB0ZXN0IC4uLiAqLwogICAgICAgQ1Byb2dyYW1Db25maWdfR2V0RGVmYXVsdCh0bXBQY2UsIDExKTsKICAgICAgIC8qIC4uLiBhbmQgY29tcGFyZSBpdCB3aXRoIHRoZSBnaXZlbiBvbmUuICovCi0gICAgICAqcENoTWFwSWR4ID0gKCEoQ1Byb2dyYW1Db25maWdfQ29tcGFyZShwUGNlLCB0bXBQY2UpJjB4RSkpID8gMTEgOiAwOwotICAgICAgLyogSWYgY29tcGFyZSByZXN1bHQgaXMgMCBvciAxIHdlIGNhbiBiZSBzdXJlIHRoYXQgaXQgaXMgY2hhbm5lbCBjb25maWcgMTEuICovCisgICAgICAqcENoTWFwSWR4ID0gKCEoQ1Byb2dyYW1Db25maWdfQ29tcGFyZShwUGNlLCB0bXBQY2UpICYgMHhFKSkgPyAxMSA6IDA7CisgICAgICAvKiBJZiBjb21wYXJlIHJlc3VsdCBpcyAwIG9yIDEgd2UgY2FuIGJlIHN1cmUgdGhhdCBpdCBpcyBjaGFubmVsCisgICAgICAgKiBjb25maWcgMTEuICovCiAgICAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcFBjZSwgQ1Byb2dyYW1Db25maWcsIDEpOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSA4OgotICAgIHsgLyogVHJ5IHRoZSBmb3VyIHBvc3NpYmxlIDcuMWNoIGNvbmZpZ3VyYXRpb25zLiBPbmUgYWZ0ZXIgdGhlIG90aGVyLiAqLwotICAgICAgVUNIQVIgdGVzdENmZ1s0XSA9IHsgMzIsIDE0LCAxMiwgN307CisgICAgfSBicmVhazsKKyAgICBjYXNlIDg6IHsgLyogVHJ5IHRoZSBmb3VyIHBvc3NpYmxlIDcuMWNoIGNvbmZpZ3VyYXRpb25zLiBPbmUgYWZ0ZXIgdGhlCisgICAgICAgICAgICAgICAgIG90aGVyLiAqLworICAgICAgVUNIQVIgdGVzdENmZ1s0XSA9IHszMiwgMTQsIDEyLCA3fTsKICAgICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBQY2UsIENQcm9ncmFtQ29uZmlnLCAxKTsKLSAgICAgIGZvciAoaT0wOyBpPDQ7IGkrPTEpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpICs9IDEpIHsKICAgICAgICAgLyogQ3JlYXRlIGEgUENFIGZvciB0aGUgY29uZmlnIHRvIHRlc3QgLi4uICovCiAgICAgICAgIENQcm9ncmFtQ29uZmlnX0dldERlZmF1bHQodG1wUGNlLCB0ZXN0Q2ZnW2ldKTsKICAgICAgICAgLyogLi4uIGFuZCBjb21wYXJlIGl0IHdpdGggdGhlIGdpdmVuIG9uZS4gKi8KLSAgICAgICAgaWYgKCEoQ1Byb2dyYW1Db25maWdfQ29tcGFyZShwUGNlLCB0bXBQY2UpJjB4RSkpIHsKLSAgICAgICAgICAvKiBJZiB0aGUgY29tcGFyZSByZXN1bHQgaXMgMCBvciAxIHRoYW4gdGhlIHR3byBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIG1hdGNoLiAqLwotICAgICAgICAgIC8qIEV4cGxpY2l0IG1hcHBpbmcgb2YgNy4xIHNpZGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIHRvIDcuMSByZWFyIGNoYW5uZWwgbWFwcGluZy4gKi8KLSAgICAgICAgICAqcENoTWFwSWR4ID0gKHRlc3RDZmdbaV09PTMyKSA/IDEyIDogdGVzdENmZ1tpXTsKKyAgICAgICAgaWYgKCEoQ1Byb2dyYW1Db25maWdfQ29tcGFyZShwUGNlLCB0bXBQY2UpICYgMHhFKSkgeworICAgICAgICAgIC8qIElmIHRoZSBjb21wYXJlIHJlc3VsdCBpcyAwIG9yIDEgdGhhbiB0aGUgdHdvIGNoYW5uZWwgY29uZmlndXJhdGlvbnMKKyAgICAgICAgICAgKiBtYXRjaC4gKi8KKyAgICAgICAgICAvKiBFeHBsaWNpdCBtYXBwaW5nIG9mIDcuMSBzaWRlIGNoYW5uZWwgY29uZmlndXJhdGlvbiB0byA3LjEgcmVhcgorICAgICAgICAgICAqIGNoYW5uZWwgbWFwcGluZy4gKi8KKyAgICAgICAgICAqcENoTWFwSWR4ID0gKHRlc3RDZmdbaV0gPT0gMzIpID8gMTIgOiB0ZXN0Q2ZnW2ldOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcFBjZSwgQ1Byb2dyYW1Db25maWcsIDEpOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICAvKiBUaGUgUENFIGRvZXMgbm90IG1hdGNoIGFueSBwcmVkZWZpbmVkIGNoYW5uZWwgY29uZmlndXJhdGlvbi4gKi8KLSAgICAqcENoTWFwSWR4ID0gMDsKLSAgICBicmVhazsKKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBUaGUgUENFIGRvZXMgbm90IG1hdGNoIGFueSBwcmVkZWZpbmVkIGNoYW5uZWwgY29uZmlndXJhdGlvbi4gKi8KKyAgICAgICpwQ2hNYXBJZHggPSAwOworICAgICAgYnJlYWs7CiAgIH0KIAogICByZXR1cm4gZWw7CiB9Ci0jZW5kaWYKIAotc3RhdGljIEFVRElPX09CSkVDVF9UWVBFIGdldEFPVChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicykKLXsKK3N0YXRpYyBBVURJT19PQkpFQ1RfVFlQRSBnZXRBT1QoSEFORExFX0ZES19CSVRTVFJFQU0gYnMpIHsKICAgaW50IHRtcCA9IDA7CiAKLSAgdG1wID0gRkRLcmVhZEJpdHMoYnMsNSk7CisgIHRtcCA9IEZES3JlYWRCaXRzKGJzLCA1KTsKICAgaWYgKHRtcCA9PSBBT1RfRVNDQVBFKSB7Ci0gICAgaW50IHRtcDIgPSBGREtyZWFkQml0cyhicyw2KTsKKyAgICBpbnQgdG1wMiA9IEZES3JlYWRCaXRzKGJzLCA2KTsKICAgICB0bXAgPSAzMiArIHRtcDI7CiAgIH0KIAogICByZXR1cm4gKEFVRElPX09CSkVDVF9UWVBFKXRtcDsKIH0KIAotc3RhdGljIElOVCBnZXRTYW1wbGVSYXRlKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBVQ0hBUiAqaW5kZXgsIGludCBuQml0cykKLXsKK3N0YXRpYyBJTlQgZ2V0U2FtcGxlUmF0ZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgVUNIQVIgKmluZGV4LCBpbnQgbkJpdHMpIHsKICAgSU5UIHNhbXBsZVJhdGU7CiAgIGludCBpZHg7CiAKICAgaWR4ID0gRkRLcmVhZEJpdHMoYnMsIG5CaXRzKTsKLSAgaWYoIGlkeCA9PSAoMTw8bkJpdHMpLTEgKSB7Ci0gICAgaWYoRkRLZ2V0VmFsaWRCaXRzKGJzKSA8IDI0KSB7CisgIGlmIChpZHggPT0gKDEgPDwgbkJpdHMpIC0gMSkgeworICAgIGlmIChGREtnZXRWYWxpZEJpdHMoYnMpIDwgMjQpIHsKICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBzYW1wbGVSYXRlID0gRkRLcmVhZEJpdHMoYnMsMjQpOworICAgIHNhbXBsZVJhdGUgPSBGREtyZWFkQml0cyhicywgMjQpOwogICB9IGVsc2UgewogICAgIHNhbXBsZVJhdGUgPSBTYW1wbGluZ1JhdGVUYWJsZVtpZHhdOwogICB9CkBAIC0xMDE0LDEzMiArMTIxNCwxNjQgQEAKICAgcmV0dXJuIHNhbXBsZVJhdGU7CiB9CiAKLSNpZmRlZiBUUF9HQV9FTkFCTEUKLXN0YXRpYwotVFJBTlNQT1JUREVDX0VSUk9SIEdhU3BlY2lmaWNDb25maWdfUGFyc2UoIENTR2FTcGVjaWZpY0NvbmZpZyAgICAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgYXNjU3RhcnRBbmNob3IgKQoteworc3RhdGljIFRSQU5TUE9SVERFQ19FUlJPUiBHYVNwZWNpZmljQ29uZmlnX1BhcnNlKENTR2FTcGVjaWZpY0NvbmZpZyAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFzY1N0YXJ0QW5jaG9yKSB7CiAgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKIAotICBzZWxmLT5tX2ZyYW1lTGVuZ3RoRmxhZyA9IEZES3JlYWRCaXRzKGJzLDEpOworICBzZWxmLT5tX2ZyYW1lTGVuZ3RoRmxhZyA9IEZES3JlYWRCaXRzKGJzLCAxKTsKIAotICBzZWxmLT5tX2RlcGVuZHNPbkNvcmVDb2RlciA9IEZES3JlYWRCaXRzKGJzLDEpOworICBzZWxmLT5tX2RlcGVuZHNPbkNvcmVDb2RlciA9IEZES3JlYWRCaXRzKGJzLCAxKTsKIAotICBpZiggc2VsZi0+bV9kZXBlbmRzT25Db3JlQ29kZXIgKQotICAgIHNlbGYtPm1fY29yZUNvZGVyRGVsYXkgPSBGREtyZWFkQml0cyhicywxNCk7CisgIGlmIChzZWxmLT5tX2RlcGVuZHNPbkNvcmVDb2Rlcikgc2VsZi0+bV9jb3JlQ29kZXJEZWxheSA9IEZES3JlYWRCaXRzKGJzLCAxNCk7CiAKLSAgc2VsZi0+bV9leHRlbnNpb25GbGFnID0gRkRLcmVhZEJpdHMoYnMsMSk7CisgIHNlbGYtPm1fZXh0ZW5zaW9uRmxhZyA9IEZES3JlYWRCaXRzKGJzLCAxKTsKIAotICBpZiggYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID09IDAgKSB7CisgIGlmIChhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPT0gMCkgewogICAgIENQcm9ncmFtQ29uZmlnX1JlYWQoJmFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQsIGJzLCBhc2NTdGFydEFuY2hvcik7CiAgIH0KIAogICBpZiAoKGFzYy0+bV9hb3QgPT0gQU9UX0FBQ19TQ0FMKSB8fCAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX1NDQUwpKSB7Ci0gICAgc2VsZi0+bV9sYXllciA9IEZES3JlYWRCaXRzKGJzLDMpOworICAgIHNlbGYtPm1fbGF5ZXIgPSBGREtyZWFkQml0cyhicywgMyk7CiAgIH0KIAogICBpZiAoc2VsZi0+bV9leHRlbnNpb25GbGFnKSB7CiAgICAgaWYgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0JTQUMpIHsKLSAgICAgIHNlbGYtPm1fbnVtT2ZTdWJGcmFtZSA9IEZES3JlYWRCaXRzKGJzLDUpOwotICAgICAgc2VsZi0+bV9sYXllckxlbmd0aCAgID0gRkRLcmVhZEJpdHMoYnMsMTEpOworICAgICAgc2VsZi0+bV9udW1PZlN1YkZyYW1lID0gRkRLcmVhZEJpdHMoYnMsIDUpOworICAgICAgc2VsZi0+bV9sYXllckxlbmd0aCA9IEZES3JlYWRCaXRzKGJzLCAxMSk7CiAgICAgfQogCi0gICAgaWYgKChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfTEMpICAgfHwgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19MVFApICB8fAotICAgICAgICAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX1NDQUwpIHx8IChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfTEQpKQotICAgIHsKLSAgICAgIGFzYy0+bV92Y2IxMUZsYWcgPSBGREtyZWFkQml0cyhicywxKTsgLyogYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAqLwotICAgICAgYXNjLT5tX3J2bGNGbGFnICA9IEZES3JlYWRCaXRzKGJzLDEpOyAvKiBhYWNTY2FsZWZhY3RvckRhdGFSZXNpbGllbmNlRmxhZyAqLwotICAgICAgYXNjLT5tX2hjckZsYWcgICA9IEZES3JlYWRCaXRzKGJzLDEpOyAvKiBhYWNTcGVjdHJhbERhdGFSZXNpbGllbmNlRmxhZyAqLworICAgIGlmICgoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0xDKSB8fCAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0xUUCkgfHwKKyAgICAgICAgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSB8fCAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0xEKSkgeworICAgICAgYXNjLT5tX3ZjYjExRmxhZyA9IEZES3JlYWRCaXRzKGJzLCAxKTsgLyogYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAqLworICAgICAgYXNjLT5tX3J2bGNGbGFnID0KKyAgICAgICAgICBGREtyZWFkQml0cyhicywgMSk7IC8qIGFhY1NjYWxlZmFjdG9yRGF0YVJlc2lsaWVuY2VGbGFnICovCisgICAgICBhc2MtPm1faGNyRmxhZyA9IEZES3JlYWRCaXRzKGJzLCAxKTsgLyogYWFjU3BlY3RyYWxEYXRhUmVzaWxpZW5jZUZsYWcgKi8KICAgICB9CiAKLSAgICBzZWxmLT5tX2V4dGVuc2lvbkZsYWczID0gRkRLcmVhZEJpdHMoYnMsMSk7Ci0KKyAgICBzZWxmLT5tX2V4dGVuc2lvbkZsYWczID0gRkRLcmVhZEJpdHMoYnMsIDEpOwogICB9CiAgIHJldHVybiAoRXJyb3JTdGF0dXMpOwogfQotI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLwogCitzdGF0aWMgSU5UIHNraXBTYnJIZWFkZXIoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBpbnQgaXNVc2FjKSB7CisgIC8qIER1bW15IHBhcnNlIFNickRmbHRIZWFkZXIoKSAqLworICBJTlQgZGZsdF9oZWFkZXJfZXh0cmExLCBkZmx0X2hlYWRlcl9leHRyYTIsIGJpdHNUb1NraXAgPSAwOwogCisgIGlmICghaXNVc2FjKSB7CisgICAgYml0c1RvU2tpcCA9IDY7CisgICAgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiBhbXAgcmVzIDEsIHhvdmVyIGZyZXEgMywgcmVzZXJ2ZWQgMiAqLworICB9CisgIGJpdHNUb1NraXAgKz0gODsKKyAgRkRLcHVzaEZvcihoQnMsIDgpOyAvKiBzdGFydCAvIHN0b3AgZnJlcSAqLworICBiaXRzVG9Ta2lwICs9IDI7CisgIGRmbHRfaGVhZGVyX2V4dHJhMSA9IEZES3JlYWRCaXQoaEJzKTsKKyAgZGZsdF9oZWFkZXJfZXh0cmEyID0gRkRLcmVhZEJpdChoQnMpOworICBiaXRzVG9Ta2lwICs9IDUgKiBkZmx0X2hlYWRlcl9leHRyYTEgKyA2ICogZGZsdF9oZWFkZXJfZXh0cmEyOworICBGREtwdXNoRm9yKGhCcywgNSAqIGRmbHRfaGVhZGVyX2V4dHJhMSArIDYgKiBkZmx0X2hlYWRlcl9leHRyYTIpOwogCisgIHJldHVybiBiaXRzVG9Ta2lwOworfQogCi0KLSNpZmRlZiBUUF9FTERfRU5BQkxFCi0KLXN0YXRpYyBJTlQgbGRfc2JyX2hlYWRlciggY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYiApCi17CitzdGF0aWMgSU5UIGxkX3Nicl9oZWFkZXIoQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MsIGNvbnN0IElOVCBkc0ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIENTVHBDYWxsQmFja3MgKmNiKSB7CiAgIGNvbnN0IGludCBjaGFubmVsQ29uZmlndXJhdGlvbiA9IGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbjsKLSAgaW50IGkgPSAwOworICBpbnQgaSA9IDAsIGogPSAwOwogICBJTlQgZXJyb3IgPSAwOworICBNUDRfRUxFTUVOVF9JRCBlbGVtZW50ID0gSURfTk9ORTsKIAotICBpZiAoY2hhbm5lbENvbmZpZ3VyYXRpb24gPT0gMikgewotICAgIGVycm9yID0gY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIEFPVF9FUl9BQUNfRUxELCBJRF9DUEUsIGkrKyk7Ci0gIH0gZWxzZSB7Ci0gICAgZXJyb3IgPSBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgQU9UX0VSX0FBQ19FTEQsIElEX1NDRSwgaSsrKTsKKyAgLyogY2hlY2sgd2hldGhlciB0aGUgY2hhbm5lbENvbmZpZ3VyYXRpb24gaXMgZGVmaW5lZCBpbgorICAgKiBjaGFubmVsX2NvbmZpZ3VyYXRpb25fYXJyYXkgKi8KKyAgaWYgKGNoYW5uZWxDb25maWd1cmF0aW9uIDwgMCB8fAorICAgICAgY2hhbm5lbENvbmZpZ3VyYXRpb24gPiAoSU5UKShzaXplb2YoY2hhbm5lbF9jb25maWd1cmF0aW9uX2FycmF5KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTVA0X0VMRU1FTlRfSUQgKiopIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOwogICB9CiAKLSAgc3dpdGNoICggY2hhbm5lbENvbmZpZ3VyYXRpb24gKSB7Ci0gICAgY2FzZSAxNDoKLSAgICBjYXNlIDEyOgotICAgIGNhc2UgNzoKLSAgICAgIGVycm9yIHw9IGNiLT5jYlNicihjYi0+Y2JTYnJEYXRhLCBoQnMsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBBT1RfRVJfQUFDX0VMRCwgSURfQ1BFLCBpKyspOwotICAgIGNhc2UgNjoKLSAgICBjYXNlIDU6Ci0gICAgICBlcnJvciB8PSBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgQU9UX0VSX0FBQ19FTEQsIElEX0NQRSwgaSsrKTsKLSAgICBjYXNlIDM6Ci0gICAgICBlcnJvciB8PSBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgQU9UX0VSX0FBQ19FTEQsIElEX0NQRSwgaSsrKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMToKLSAgICAgIGVycm9yIHw9IGNiLT5jYlNicihjYi0+Y2JTYnJEYXRhLCBoQnMsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBBT1RfRVJfQUFDX0VMRCwgSURfQ1BFLCBpKyspOwotICAgIGNhc2UgNDoKLSAgICAgIGVycm9yIHw9IGNiLT5jYlNicihjYi0+Y2JTYnJEYXRhLCBoQnMsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBBT1RfRVJfQUFDX0VMRCwgSURfQ1BFLCBpKyspOwotICAgICAgZXJyb3IgfD0gY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIEFPVF9FUl9BQUNfRUxELCBJRF9TQ0UsIGkrKyk7Ci0gICAgICBicmVhazsKKyAgLyogcmVhZCBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGNoYW5uZWxfY29uZmlndXJhdGlvbiB1bnRpbCB0aGVyZSBpcyBJRF9OT05FICovCisgIHdoaWxlICgoZWxlbWVudCA9IGNoYW5uZWxfY29uZmlndXJhdGlvbl9hcnJheVtjaGFubmVsQ29uZmlndXJhdGlvbl1bal0pICE9CisgICAgICAgICBJRF9OT05FKSB7CisgICAgaWYgKGVsZW1lbnQgPT0gSURfU0NFIHx8IGVsZW1lbnQgPT0gSURfQ1BFKSB7CisgICAgICBlcnJvciB8PSBjYi0+Y2JTYnIoCisgICAgICAgICAgY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgLyBkc0ZhY3RvciwKKyAgICAgICAgICBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3kgLyBkc0ZhY3RvciwKKyAgICAgICAgICBhc2MtPm1fc2FtcGxlc1BlckZyYW1lIC8gZHNGYWN0b3IsIEFPVF9FUl9BQUNfRUxELCBlbGVtZW50LCBpKyssIDAsIDAsCisgICAgICAgICAgYXNjLT5jb25maWdNb2RlLCAmYXNjLT5TYnJDb25maWdDaGFuZ2VkLCBkc0ZhY3Rvcik7CisgICAgICBpZiAoZXJyb3IgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisgICAgaisrOwogICB9Ci0KK2JhaWw6CiAgIHJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljCi1UUkFOU1BPUlRERUNfRVJST1IgRWxkU3BlY2lmaWNDb25maWdfUGFyc2UoCi0gICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIENTVHBDYWxsQmFja3MgKmNiCi0gICAgICAgICkKLXsKK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgRWxkU3BlY2lmaWNDb25maWdfUGFyc2UoQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IpIHsKICAgVFJBTlNQT1JUREVDX0VSUk9SIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX09LOwogICBDU0VsZFNwZWNpZmljQ29uZmlnICplc2MgPSAmYXNjLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWc7CiAgIEFTQ19FTERfRVhUX1RZUEUgZWxkRXh0VHlwZTsKLSAgaW50IGVsZEV4dExlbiwgbGVuLCBjbnQ7CisgIGludCBlbGRFeHRMZW4sIGxlbiwgY250LCBsZFNickxlbiA9IDAsIGVsZEV4dExlblN1bSwgbnVtU2JySGVhZGVyID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickluZGV4OworCisgIHVuc2lnbmVkIGNoYXIgZG93bnNjYWxlX2ZpbGxfbmliYmxlOwogCiAgIEZES21lbWNsZWFyKGVzYywgc2l6ZW9mKENTRWxkU3BlY2lmaWNDb25maWcpKTsKIAotICBlc2MtPm1fZnJhbWVMZW5ndGhGbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxICk7CisgIGVzYy0+bV9mcmFtZUxlbmd0aEZsYWcgPSBGREtyZWFkQml0cyhoQnMsIDEpOwogICBpZiAoZXNjLT5tX2ZyYW1lTGVuZ3RoRmxhZykgewogICAgIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUgPSA0ODA7CiAgIH0gZWxzZSB7CiAgICAgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSA9IDUxMjsKICAgfQogCi0gIGFzYy0+bV92Y2IxMUZsYWcgPSBGREtyZWFkQml0cyhoQnMsIDEgKTsKLSAgYXNjLT5tX3J2bGNGbGFnICA9IEZES3JlYWRCaXRzKGhCcywgMSApOwotICBhc2MtPm1faGNyRmxhZyAgID0gRkRLcmVhZEJpdHMoaEJzLCAxICk7CisgIGFzYy0+bV92Y2IxMUZsYWcgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBhc2MtPm1fcnZsY0ZsYWcgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBhc2MtPm1faGNyRmxhZyA9IEZES3JlYWRCaXRzKGhCcywgMSk7CiAKLSAgZXNjLT5tX3NiclByZXNlbnRGbGFnICAgICA9IEZES3JlYWRCaXRzKGhCcywgMSApOworICBlc2MtPm1fc2JyUHJlc2VudEZsYWcgPSBGREtyZWFkQml0cyhoQnMsIDEpOwogCiAgIGlmIChlc2MtPm1fc2JyUHJlc2VudEZsYWcgPT0gMSkgewotICAgIGVzYy0+bV9zYnJTYW1wbGluZ1JhdGUgICAgPSBGREtyZWFkQml0cyhoQnMsIDEgKTsgLyogMDogc2luZ2xlIHJhdGUsIDE6IGR1YWwgcmF0ZSAqLwotICAgIGVzYy0+bV9zYnJDcmNGbGFnICAgICAgICAgPSBGREtyZWFkQml0cyhoQnMsIDEgKTsKKyAgICBlc2MtPm1fc2JyU2FtcGxpbmdSYXRlID0KKyAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCAxKTsgLyogMDogc2luZ2xlIHJhdGUsIDE6IGR1YWwgcmF0ZSAqLworICAgIGVzYy0+bV9zYnJDcmNGbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKIAotICAgIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9IGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA8PCBlc2MtPm1fc2JyU2FtcGxpbmdSYXRlOworICAgIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9IGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVzYy0+bV9zYnJTYW1wbGluZ1JhdGU7CiAKLSAgICBpZiAoY2ItPmNiU2JyICE9IE5VTEwpewotICAgICAgaWYgKCAwICE9IGxkX3Nicl9oZWFkZXIoYXNjLCBoQnMsIGNiKSApIHsKLSAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICBpZiAoY2ItPmNiU2JyICE9IE5VTEwpIHsKKyAgICAgIC8qIEVMRCByZWR1Y2VkIGRlbGF5IG1vZGU6IExELVNCUiBpbml0aWFsaXphdGlvbiBoYXMgdG8ga25vdyB0aGUgZG93bnNjYWxlCisgICAgICAgICBpbmZvcm1hdGlvbi4gUG9zdHBvbmUgTEQtU0JSIGluaXRpYWxpemF0aW9uIGFuZCByZWFkIEVMRCBleHRlbnNpb24KKyAgICAgICAgIGluZm9ybWF0aW9uIGZpcnN0LiAqLworICAgICAgc3dpdGNoIChhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDI6CisgICAgICAgICAgbnVtU2JySGVhZGVyID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIG51bVNickhlYWRlciA9IDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA1OgorICAgICAgICBjYXNlIDY6CisgICAgICAgICAgbnVtU2JySGVhZGVyID0gMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICBjYXNlIDExOgorICAgICAgICBjYXNlIDEyOgorICAgICAgICBjYXNlIDE0OgorICAgICAgICAgIG51bVNickhlYWRlciA9IDQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgbnVtU2JySGVhZGVyID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZvciAoc2JySW5kZXggPSAwOyBzYnJJbmRleCA8IG51bVNickhlYWRlcjsgc2JySW5kZXgrKykgeworICAgICAgICBsZFNickxlbiArPSBza2lwU2JySGVhZGVyKGhCcywgMCk7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOwpAQCAtMTE0OCw4NSArMTM4MCw2ODYgQEAKICAgZXNjLT5tX3VzZUxkUW1mVGltZUFsaWduID0gMDsKIAogICAvKiBuZXcgRUxEIHN5bnRheCAqLworICBlbGRFeHRMZW5TdW0gPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgZXNjLT5tX2Rvd25zY2FsZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKICAgLyogcGFyc2UgRXh0VHlwZUNvbmZpZ0RhdGEgKi8KLSAgd2hpbGUgKChlbGRFeHRUeXBlID0gKEFTQ19FTERfRVhUX1RZUEUpRkRLcmVhZEJpdHMoaEJzLCA0ICkpICE9IEVMREVYVF9URVJNKSB7Ci0gICAgZWxkRXh0TGVuID0gbGVuID0gRkRLcmVhZEJpdHMoaEJzLCA0ICk7Ci0gICAgaWYgKCBsZW4gPT0gMHhmICkgewotICAgICAgbGVuID0gRkRLcmVhZEJpdHMoaEJzLCA4ICk7CisgIHdoaWxlICgKKyAgICAgICgoZWxkRXh0VHlwZSA9IChBU0NfRUxEX0VYVF9UWVBFKUZES3JlYWRCaXRzKGhCcywgNCkpICE9IEVMREVYVF9URVJNKSAmJgorICAgICAgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgPj0gMCkpIHsKKyAgICBlbGRFeHRMZW4gPSBsZW4gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgIGlmIChsZW4gPT0gMHhmKSB7CisgICAgICBsZW4gPSBGREtyZWFkQml0cyhoQnMsIDgpOwogICAgICAgZWxkRXh0TGVuICs9IGxlbjsKIAotICAgICAgaWYgKCBsZW4gPT0gMHhmZiApIHsKLSAgICAgICAgbGVuID0gRkRLcmVhZEJpdHMoaEJzLCAxNiApOworICAgICAgaWYgKGxlbiA9PSAweGZmKSB7CisgICAgICAgIGxlbiA9IEZES3JlYWRCaXRzKGhCcywgMTYpOwogICAgICAgICBlbGRFeHRMZW4gKz0gbGVuOwogICAgICAgfQogICAgIH0KIAogICAgIHN3aXRjaCAoZWxkRXh0VHlwZSkgeworICAgICAgY2FzZSBFTERFWFRfTERTQUM6CisgICAgICAgIGVzYy0+bV91c2VMZFFtZlRpbWVBbGlnbiA9IDE7CisgICAgICAgIGlmIChjYi0+Y2JTc2MgIT0gTlVMTCkgeworICAgICAgICAgIEVycm9yU3RhdHVzID0gKFRSQU5TUE9SVERFQ19FUlJPUiljYi0+Y2JTc2MoCisgICAgICAgICAgICAgIGNiLT5jYlNzY0RhdGEsIGhCcywgYXNjLT5tX2FvdCwgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAxLCAgLyogc3RlcmVvQ29uZmlnSW5kZXggKi8KKyAgICAgICAgICAgICAgLTEsIC8qIG5UaW1lU2xvdHM6IHJlYWQgZnJvbSBiaXRzdHJlYW0gKi8KKyAgICAgICAgICAgICAgZWxkRXh0TGVuLCBhc2MtPmNvbmZpZ01vZGUsICZhc2MtPlNhY0NvbmZpZ0NoYW5nZWQpOworICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLwogICAgICAgZGVmYXVsdDoKLSAgICAgICAgZm9yKGNudD0wOyBjbnQ8ZWxkRXh0TGVuOyBjbnQrKykgewotICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgOCApOworICAgICAgICBmb3IgKGNudCA9IDA7IGNudCA8IGVsZEV4dExlbjsgY250KyspIHsKKyAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDgpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwotICAgICAgLyogYWRkIGZ1dHVyZSBlbGQgZXh0ZW5zaW9uIGNvbmZpZ3MgaGVyZSAqLworCisgICAgICBjYXNlIEVMREVYVF9ET1dOU0NBTEVJTkZPOgorICAgICAgICBVQ0hBUiB0bXBEb3duc2NhbGVGcmVxSWR4OworICAgICAgICBlc2MtPm1fZG93bnNjYWxlZFNhbXBsaW5nRnJlcXVlbmN5ID0KKyAgICAgICAgICAgIGdldFNhbXBsZVJhdGUoaEJzLCAmdG1wRG93bnNjYWxlRnJlcUlkeCwgNCk7CisgICAgICAgIGlmIChlc2MtPm1fZG93bnNjYWxlZFNhbXBsaW5nRnJlcXVlbmN5ID09IDApIHsKKyAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGRvd25zY2FsZV9maWxsX25pYmJsZSA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICAgIGlmIChkb3duc2NhbGVfZmlsbF9uaWJibGUgIT0gMHgwKSB7CisgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICB9CiAgIH0KLWJhaWw6CisKKyAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgPCAwKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgfQorCisgIGlmIChlc2MtPm1fc2JyUHJlc2VudEZsYWcgPT0gMSAmJiBudW1TYnJIZWFkZXIgIT0gMCkgeworICAgIElOVCBkc0ZhY3RvciA9IDE7IC8qIERvd25zY2FsZSBmYWN0b3IgbXVzdCBiZSAxIG9yIGV2ZW4gZm9yIFNCUiAqLworICAgIGlmIChlc2MtPm1fZG93bnNjYWxlZFNhbXBsaW5nRnJlcXVlbmN5ICE9IDApIHsKKyAgICAgIGlmIChhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgJSBlc2MtPm1fZG93bnNjYWxlZFNhbXBsaW5nRnJlcXVlbmN5ICE9IDApIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICB9CisgICAgICBkc0ZhY3RvciA9IGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSAvIGVzYy0+bV9kb3duc2NhbGVkU2FtcGxpbmdGcmVxdWVuY3k7CisgICAgICBpZiAoZHNGYWN0b3IgIT0gMSAmJiAoZHNGYWN0b3IpJjEpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7IC8qIFNCUiBuZWVkcyBhbiBldmVuIGRvd25zY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yICovCisgICAgICB9CisgICAgICBpZiAoZHNGYWN0b3IgIT0gMSAmJiBkc0ZhY3RvciAhPSAyICYmIGRzRmFjdG9yICE9IDQpIHsKKyAgICAgICAgZHNGYWN0b3IgPSAxOyAvKiBkb24ndCBhcHBseSBkc2YgZm9yIG5vdCB5ZXQgc3VwcG9ydGVkIGV2ZW4gZHNmcyAqLworICAgICAgfQorICAgICAgaWYgKChJTlQpYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSAlIGRzRmFjdG9yICE9IDApIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7IC8qIGZyYW1lU2l6ZS9kc2YgbXVzdCBiZSBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlciBudW1iZXIgKi8KKyAgICAgIH0KKyAgICB9CisgICAgZWxkRXh0TGVuU3VtID0gZWxkRXh0TGVuU3VtIC0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgICAgRkRLcHVzaEJhY2soaEJzLCBlbGRFeHRMZW5TdW0gKyBsZFNickxlbik7CisgICAgaWYgKDAgIT0gbGRfc2JyX2hlYWRlcihhc2MsIGRzRmFjdG9yLCBoQnMsIGNiKSkgeworICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgRkRLcHVzaEZvcihoQnMsIGVsZEV4dExlblN1bSk7CisgIH0KICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CiB9Ci0jZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLwogCisvKgorU3Vicm91dGluZSB0byBzdG9yZSBjb25maWcgaW4gVUNIQVIgYnVmZmVyLiBCaXQgc3RyZWFtIHBvc2l0aW9uIGRvZXMgbm90IGNoYW5nZS4KKyovCitzdGF0aWMgVUlOVCBTdG9yZUNvbmZpZ0FzQml0c3RyZWFtKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgY29uc3QgSU5UIGNvbmZpZ1NpemVfYml0cywgLyogSWYgPCAwICg+IDApIGNvbmZpZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVhZCBpcyBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZnRlcikgY3VycmVudCBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBwb3NpdGlvbi4gKi8KKyAgICBVQ0hBUiAqY29uZmlnVGFyZ2V0QnVmZmVyLCBjb25zdCBVU0hPUlQgY29uZmlnVGFyZ2V0QnVmZmVyU2l6ZV9ieXRlcykgeworICBGREtfQklUU1RSRUFNIHVzYWNDb25mOworICBVSU5UIGNvbnN0IG5CaXRzID0gZkFicyhjb25maWdTaXplX2JpdHMpOworICBVSU5UIGosIHRtcDsKIAotc3RhdGljCi1UUkFOU1BPUlRERUNfRVJST1IgQXVkaW9TcGVjaWZpY0NvbmZpZ19FeHRlbnNpb25QYXJzZShDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDU1RwQ2FsbEJhY2tzICpjYikKLXsKLSAgVFBfQVNDX0VYVEVOU0lPTl9JRCAgbGFzdEFzY0V4dCwgYXNjRXh0SWQgPSBBU0NFWFRfVU5LT1dOOwotICBJTlQgIGJpdHNBdmFpbGFibGUgPSAoSU5UKUZES2dldFZhbGlkQml0cyhicyk7CisgIGlmIChuQml0cyA+IDggKiAoVUlOVCljb25maWdUYXJnZXRCdWZmZXJTaXplX2J5dGVzKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgRkRLbWVtY2xlYXIoY29uZmlnVGFyZ2V0QnVmZmVyLCBjb25maWdUYXJnZXRCdWZmZXJTaXplX2J5dGVzKTsKIAotICB3aGlsZSAoYml0c0F2YWlsYWJsZSA+PSAxMSkKKyAgRkRLaW5pdEJpdFN0cmVhbSgmdXNhY0NvbmYsIGNvbmZpZ1RhcmdldEJ1ZmZlciwgY29uZmlnVGFyZ2V0QnVmZmVyU2l6ZV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICBuQml0cywgQlNfV1JJVEVSKTsKKyAgaWYgKGNvbmZpZ1NpemVfYml0cyA8IDApIHsKKyAgICBGREtwdXNoQmFjayhoQnMsIG5CaXRzKTsKKyAgfQorICBmb3IgKGogPSBuQml0czsgaiA+IDMxOyBqIC09IDMyKSB7CisgICAgdG1wID0gRkRLcmVhZEJpdHMoaEJzLCAzMik7CisgICAgRkRLd3JpdGVCaXRzKCZ1c2FjQ29uZiwgdG1wLCAzMik7CisgIH0KKyAgaWYgKGogPiAwKSB7CisgICAgdG1wID0gRkRLcmVhZEJpdHMoaEJzLCBqKTsKKyAgICBGREt3cml0ZUJpdHMoJnVzYWNDb25mLCB0bXAsIGopOworICB9CisgIEZES3N5bmNDYWNoZSgmdXNhY0NvbmYpOworICBpZiAoY29uZmlnU2l6ZV9iaXRzID4gMCkgeworICAgIEZES3B1c2hCYWNrKGhCcywgbkJpdHMpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIG1hcHMgY29yZVNickZyYW1lTGVuZ3RoSW5kZXggdG8gY29yZUNvZGVyRnJhbWVMZW5ndGggKi8KK3N0YXRpYyBjb25zdCBVU0hPUlQgdXNhY0ZyYW1lTGVuZ3RoWzhdID0gezc2OCwgMTAyNCwgMjA0OCwgMjA0OCwgNDA5NiwgMCwgMCwgMH07CisvKiBtYXBzIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4IHRvIHNiclJhdGlvSW5kZXggKi8KK3N0YXRpYyBjb25zdCBVQ0hBUiBzYnJSYXRpb0luZGV4WzhdID0gezAsIDAsIDIsIDMsIDEsIDAsIDAsIDB9OworCisvKgorICBzdWJyb3V0aW5lIGZvciBwYXJzaW5nIGV4dGVuc2lvbiBlbGVtZW50IGNvbmZpZ3VyYXRpb246CisgIFVzYWNFeHRFbGVtZW50Q29uZmlnKCkgcS52LiBJU08vSUVDIEZESVMgMjMwMDMtMzoyMDExKEUpIFRhYmxlIDE0CisgIHJzdjYwM2RhRXh0RWxlbWVudENvbmZpZygpIHEudi4gSVNPL0lFQyBESVMgMjMwMDgtMyBUYWJsZSAxMworKi8KK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgZXh0RWxlbWVudENvbmZpZyhDU1VzYWNFeHRFbGVtZW50Q29uZmlnICpleHRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDU1RwQ2FsbEJhY2tzICpjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBudW1TaWduYWxzSW5Hcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNvcmVGcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3ViU3RyZWFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYW90KSB7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKworICBVU0FDX0VYVF9FTEVNRU5UX1RZUEUgdXNhY0V4dEVsZW1lbnRUeXBlID0KKyAgICAgIChVU0FDX0VYVF9FTEVNRU5UX1RZUEUpZXNjYXBlZFZhbHVlKGhCcywgNCwgOCwgMTYpOworCisgIC8qIHJlY3VydmUgZXh0ZW5zaW9uIGVsZW1lbnRzIHdoaWNoIGFyZSBpbnZhbGlkIGZvciBVU0FDICovCisgIGlmIChhb3QgPT0gQU9UX1VTQUMpIHsKKyAgICBzd2l0Y2ggKHVzYWNFeHRFbGVtZW50VHlwZSkgeworICAgICAgY2FzZSBJRF9FWFRfRUxFX0ZJTEw6CisgICAgICBjYXNlIElEX0VYVF9FTEVfTVBFR1M6CisgICAgICBjYXNlIElEX0VYVF9FTEVfU0FPQzoKKyAgICAgIGNhc2UgSURfRVhUX0VMRV9BVURJT1BSRVJPTEw6CisgICAgICBjYXNlIElEX0VYVF9FTEVfVU5JX0RSQzoKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB1c2FjRXh0RWxlbWVudFR5cGUgPSBJRF9FWFRfRUxFX1VOS05PV047CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGV4dEVsZW1lbnQtPnVzYWNFeHRFbGVtZW50VHlwZSA9IHVzYWNFeHRFbGVtZW50VHlwZTsKKyAgaW50IHVzYWNFeHRFbGVtZW50Q29uZmlnTGVuZ3RoID0gZXNjYXBlZFZhbHVlKGhCcywgNCwgOCwgMTYpOworICBleHRFbGVtZW50LT51c2FjRXh0RWxlbWVudENvbmZpZ0xlbmd0aCA9IChVU0hPUlQpdXNhY0V4dEVsZW1lbnRDb25maWdMZW5ndGg7CisgIElOVCBic0FuY2hvcjsKKworICBpZiAoRkRLcmVhZEJpdChoQnMpKSAvKiB1c2FjRXh0RWxlbWVudERlZmF1bHRMZW5ndGhQcmVzZW50ICovCisgICAgZXh0RWxlbWVudC0+dXNhY0V4dEVsZW1lbnREZWZhdWx0TGVuZ3RoID0gZXNjYXBlZFZhbHVlKGhCcywgOCwgMTYsIDApICsgMTsKKyAgZWxzZQorICAgIGV4dEVsZW1lbnQtPnVzYWNFeHRFbGVtZW50RGVmYXVsdExlbmd0aCA9IDA7CisKKyAgZXh0RWxlbWVudC0+dXNhY0V4dEVsZW1lbnRQYXlsb2FkRnJhZyA9IEZES3JlYWRCaXQoaEJzKTsKKworICBic0FuY2hvciA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgc3dpdGNoICh1c2FjRXh0RWxlbWVudFR5cGUpIHsKKyAgICBjYXNlIElEX0VYVF9FTEVfVU5LTk9XTjoKKyAgICBjYXNlIElEX0VYVF9FTEVfRklMTDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSURfRVhUX0VMRV9BVURJT1BSRVJPTEw6CisgICAgICAvKiBObyBjb25maWd1cmF0aW9uIGVsZW1lbnQgKi8KKyAgICAgIGV4dEVsZW1lbnQtPnVzYWNFeHRFbGVtZW50SGFzQXVkaW9QcmVSb2xsID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSURfRVhUX0VMRV9VTklfRFJDOiB7CisgICAgICBpZiAoY2ItPmNiVW5pRHJjICE9IE5VTEwpIHsKKyAgICAgICAgRXJyb3JTdGF0dXMgPSAoVFJBTlNQT1JUREVDX0VSUk9SKWNiLT5jYlVuaURyYygKKyAgICAgICAgICAgIGNiLT5jYlVuaURyY0RhdGEsIGhCcywgdXNhY0V4dEVsZW1lbnRDb25maWdMZW5ndGgsCisgICAgICAgICAgICAwLCAvKiB1bmlEcmNDb25maWcgKi8KKyAgICAgICAgICAgIHN1YlN0cmVhbUluZGV4LCAwLCBhb3QpOworICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworICAgICAgICB9CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBBZGp1c3QgYml0IHN0cmVhbSBwb3NpdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIG9mIGJ5dGUgYWxpZ25tZW50IGFuZAorICAgKiB1bmhhbmRsZWQgZXh0ZW5zaW9ucy4gKi8KICAgewotICAgIGxhc3RBc2NFeHQgPSBhc2NFeHRJZDsKLSAgICBhc2NFeHRJZCAgID0gKFRQX0FTQ19FWFRFTlNJT05fSUQpRkRLcmVhZEJpdHMoYnMsIDExKTsKLSAgICBiaXRzQXZhaWxhYmxlIC09IDExOworICAgIElOVCBsZWZ0X2JpdHMgPSAodXNhY0V4dEVsZW1lbnRDb25maWdMZW5ndGggPDwgMykgLQorICAgICAgICAgICAgICAgICAgICAoYnNBbmNob3IgLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpKTsKKyAgICBpZiAobGVmdF9iaXRzID49IDApIHsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCBsZWZ0X2JpdHMpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBwYXJzZWQgdG9vIG1hbnkgYml0cyAqLworICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgfQorICB9CiAKLSAgICBzd2l0Y2ggKGFzY0V4dElkKSB7Ci0gICAgY2FzZSBBU0NFWFRfU0JSOiAgICAvKiAweDJiNyAqLwotICAgICAgaWYgKCAoc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgIT0gQU9UX1NCUikgJiYgKGJpdHNBdmFpbGFibGUgPj0gNSkgKSB7Ci0gICAgICAgIHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID0gZ2V0QU9UKGJzKTsKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQogCi0gICAgICAgIGlmICggKHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID09IEFPVF9TQlIpCi0gICAgICAgICAgfHwgKHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9CU0FDKSApCi0gICAgICAgIHsgLyogR2V0IFNCUiBleHRlbnNpb24gY29uZmlndXJhdGlvbiAqLwotICAgICAgICAgIHNlbGYtPm1fc2JyUHJlc2VudEZsYWcgPSBGREtyZWFkQml0cyhicywgMSk7Ci0gICAgICAgICAgYml0c0F2YWlsYWJsZSAtPSAxOworLyoKKyAgc3Vicm91dGluZSBmb3IgcGFyc2luZyB0aGUgVVNBQyAvIFJTVkQ2MCBjb25maWd1cmF0aW9uIGV4dGVuc2lvbjoKKyAgVXNhY0NvbmZpZ0V4dGVuc2lvbigpIHEudi4gSVNPL0lFQyBGRElTIDIzMDAzLTM6MjAxMShFKSBUYWJsZSAxNQorICByc3Y2MDNkYUNvbmZpZ0V4dGVuc2lvbigpIHEudi4gSVNPL0lFQyBESVMgMjMwMDgtMyBUYWJsZSAxNAorKi8KK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgY29uZmlnRXh0ZW5zaW9uKENTVXNhY0NvbmZpZyAqdXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1NUcENhbGxCYWNrcyAqY2IpIHsKKyAgVFJBTlNQT1JUREVDX0VSUk9SIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX09LOwogCi0gICAgICAgICAgaWYgKCBzZWxmLT5tX3NiclByZXNlbnRGbGFnID09IDEgKSB7Ci0gICAgICAgICAgICBzZWxmLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5ID0gZ2V0U2FtcGxlUmF0ZShicywgJnNlbGYtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3lJbmRleCwgNCk7CisgIGludCBudW1Db25maWdFeHRlbnNpb25zOworICBDT05GSUdfRVhUX0lEIHVzYWNDb25maWdFeHRUeXBlOworICBpbnQgdXNhY0NvbmZpZ0V4dExlbmd0aDsKIAotICAgICAgICAgICAgaWYgKChJTlQpc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA8PSAwKSB7CisgIG51bUNvbmZpZ0V4dGVuc2lvbnMgPSAoaW50KWVzY2FwZWRWYWx1ZShoQnMsIDIsIDQsIDgpICsgMTsKKyAgZm9yIChpbnQgY29uZkV4dElkeCA9IDA7IGNvbmZFeHRJZHggPCBudW1Db25maWdFeHRlbnNpb25zOyBjb25mRXh0SWR4KyspIHsKKyAgICBJTlQgbmJpdHM7CisgICAgaW50IGxvdWRuZXNzSW5mb1NldENvbmZpZ0V4dGVuc2lvblBvc2l0aW9uID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgICAgdXNhY0NvbmZpZ0V4dFR5cGUgPSAoQ09ORklHX0VYVF9JRCllc2NhcGVkVmFsdWUoaEJzLCA0LCA4LCAxNik7CisgICAgdXNhY0NvbmZpZ0V4dExlbmd0aCA9IChpbnQpZXNjYXBlZFZhbHVlKGhCcywgNCwgOCwgMTYpOworCisgICAgLyogU3RhcnQgYml0IHBvc2l0aW9uIG9mIGNvbmZpZyBleHRlbnNpb24gKi8KKyAgICBuYml0cyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgICAvKiBSZXR1cm4gYW4gZXJyb3IgaW4gY2FzZSB0aGUgYml0YnVmZmVyIGZpbGwgbGV2ZWwgaXMgdG9vIGxvdy4gKi8KKyAgICBpZiAobmJpdHMgPCB1c2FjQ29uZmlnRXh0TGVuZ3RoICogOCkgeworICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHVzYWNDb25maWdFeHRUeXBlKSB7CisgICAgICBjYXNlIElEX0NPTkZJR19FWFRfRklMTDoKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1c2FjQ29uZmlnRXh0TGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBpZiAoRkRLcmVhZEJpdHMoaEJzLCA4KSAhPSAweGE1KSB7CisgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSURfQ09ORklHX0VYVF9MT1VETkVTU19JTkZPOiB7CisgICAgICAgIGlmIChjYi0+Y2JVbmlEcmMgIT0gTlVMTCkgeworICAgICAgICAgIEVycm9yU3RhdHVzID0gKFRSQU5TUE9SVERFQ19FUlJPUiljYi0+Y2JVbmlEcmMoCisgICAgICAgICAgICAgIGNiLT5jYlVuaURyY0RhdGEsIGhCcywgdXNhY0NvbmZpZ0V4dExlbmd0aCwKKyAgICAgICAgICAgICAgMSwgLyogbG91ZG5lc3NJbmZvU2V0ICovCisgICAgICAgICAgICAgIDAsIGxvdWRuZXNzSW5mb1NldENvbmZpZ0V4dGVuc2lvblBvc2l0aW9uLCBBT1RfVVNBQyk7CisgICAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFNraXAgcmVtYWluaW5nIGJpdHMuIElmIHRvbyBtYW55IGJpdHMgd2VyZSBwYXJzZWQsIGFzc3VtZSBlcnJvci4gKi8KKyAgICB1c2FjQ29uZmlnRXh0TGVuZ3RoID0KKyAgICAgICAgOCAqIHVzYWNDb25maWdFeHRMZW5ndGggLSAobmJpdHMgLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpKTsKKyAgICBpZiAodXNhY0NvbmZpZ0V4dExlbmd0aCA8IDApIHsKKyAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgfQorICAgIEZES3B1c2hGb3IoaEJzLCB1c2FjQ29uZmlnRXh0TGVuZ3RoKTsKKyAgfQorCisgIHJldHVybiBFcnJvclN0YXR1czsKK30KKworLyogVGhpcyBmdW5jdGlvbiB1bmlmaWVzIGRlY29kZXIgY29uZmlnIHBhcnNpbmcgb2YgVVNBQyBhbmQgUlNWNjA6CisgICByc3Y2MDNkYURlY29kZXJDb25maWcoKSBJU08vSUVDIERJUyAyMzAwOC0zICAgVGFibGUgOAorICAgVXNhY0RlY29kZXJDb25maWcoKSAgICAgSVNPL0lFQyBGRElTIDIzMDAzLTMgIFRhYmxlIDYKKyAgKi8KK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgVXNhY1JzdjYwRGVjb2RlckNvbmZpZ19QYXJzZSgKKyAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgIGNvbnN0IENTVHBDYWxsQmFja3MgKmNiKSB7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKyAgQ1NVc2FjQ29uZmlnICp1c2MgPSAmYXNjLT5tX3NjLm1fdXNhY0NvbmZpZzsKKyAgaW50IGksIG51bWJlck9mRWxlbWVudHM7CisgIGludCBjaGFubmVsRWxlbWVudElkeCA9CisgICAgICAwOyAvKiBpbmRleCBmb3IgZWxlbWVudHMgd2hpY2ggY29udGFpbiBhdWRpbyBjaGFubmVscyAoc2NlLCBjcGUsIGxmZSkgKi8KKyAgU0NfQ0hBTk5FTF9DT05GSUcgc2NfY2hhbl9jb25maWcgPSB7MCwgMCwgMCwgMH07CisKKyAgbnVtYmVyT2ZFbGVtZW50cyA9IChpbnQpZXNjYXBlZFZhbHVlKGhCcywgNCwgOCwgMTYpICsgMTsKKyAgdXNjLT5tX3VzYWNOdW1FbGVtZW50cyA9IG51bWJlck9mRWxlbWVudHM7CisgIGlmIChudW1iZXJPZkVsZW1lbnRzID4gVFBfVVNBQ19NQVhfRUxFTUVOVFMpIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgfQorICB1c2MtPm1fblVzYWNDaGFubmVscyA9IDA7CisgIHVzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbkluZGV4ID0gYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uOworCisgIGlmIChhc2MtPm1fYW90ID09IEFPVF9VU0FDKSB7CisgICAgc2NfY2hhbl9jb25maWcgPSBzY19jaGFuX2NvbmZpZ190YWJbdXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uSW5kZXhdOworCisgICAgaWYgKHNjX2NoYW5fY29uZmlnLm5DaCA+IChTQ0hBUilUUF9VU0FDX01BWF9TUEVBS0VSUykgeworICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyT2ZFbGVtZW50czsgaSsrKSB7CisgICAgTVA0X0VMRU1FTlRfSUQgdXNhY0VsZW1lbnRUeXBlID0gKE1QNF9FTEVNRU5UX0lEKSgKKyAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCAyKSB8IFVTQUNfSURfQklUKTsgLyogc2V0IFVTQUNfSURfQklUIHRvIG1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FjRWxlbWVudFR5cGUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVA0X0VMRU1FTlRfSUQgZW51bSAqLworICAgIHVzYy0+ZWxlbWVudFtpXS51c2FjRWxlbWVudFR5cGUgPSB1c2FjRWxlbWVudFR5cGU7CisKKyAgICAvKiBzYW5pdHkgY2hlY2s6IHVwZGF0ZSBlbGVtZW50IGNvdW50ZXIgKi8KKyAgICBpZiAoYXNjLT5tX2FvdCA9PSBBT1RfVVNBQykgeworICAgICAgc3dpdGNoICh1c2FjRWxlbWVudFR5cGUpIHsKKyAgICAgICAgY2FzZSBJRF9VU0FDX1NDRToKKyAgICAgICAgICBzY19jaGFuX2NvbmZpZy5uU0NFLS07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSURfVVNBQ19DUEU6CisgICAgICAgICAgc2NfY2hhbl9jb25maWcubkNQRS0tOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElEX1VTQUNfTEZFOgorICAgICAgICAgIHNjX2NoYW5fY29uZmlnLm5MRkUtLTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmICh1c2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb25JbmRleCkgeworICAgICAgICAvKiBzYW5pdHkgY2hlY2s6IG5vIGVsZW1lbnQgY291bnRlciBtYXkgYmUgc21hbGxlciB6ZXJvICovCisgICAgICAgIGlmIChzY19jaGFuX2NvbmZpZy5uQ1BFIDwgMCB8fCBzY19jaGFuX2NvbmZpZy5uU0NFIDwgMCB8fAorICAgICAgICAgICAgc2NfY2hhbl9jb25maWcubkxGRSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoICh1c2FjRWxlbWVudFR5cGUpIHsKKyAgICAgIGNhc2UgSURfVVNBQ19TQ0U6CisgICAgICAgIC8qIFVzYWNDb3JlQ29uZmlnKCkgSVNPL0lFQyBGRElTIDIzMDAzLTMgIFRhYmxlIDEwICovCisgICAgICAgIGlmIChGREtyZWFkQml0KGhCcykpIHsgLyogdHdfbWRjdCAqLworICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgICB9CisgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX25vaXNlRmlsbGluZyA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICAgIC8qIGVuZCBvZiBVc2FjQ29yZUNvbmZpZygpICovCisgICAgICAgIGlmICh1c2MtPm1fc2JyUmF0aW9JbmRleCA+IDApIHsKKyAgICAgICAgICBpZiAoY2ItPmNiU2JyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBTYnJDb25maWcoKSBJU08vSUVDIEZESVMgMjMwMDMtMyAgVGFibGUgMTEgKi8KKyAgICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9oYXJtb25pY1NCUiA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9pbnRlclRlcyA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9wdmMgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgICAgaWYgKGNiLT5jYlNicihjYi0+Y2JTYnJEYXRhLCBoQnMsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIGFzYy0+bV9hb3QsIElEX1NDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxFbGVtZW50SWR4LCB1c2MtPmVsZW1lbnRbaV0ubV9oYXJtb25pY1NCUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX3N0ZXJlb0NvbmZpZ0luZGV4LCBhc2MtPmNvbmZpZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAmYXNjLT5TYnJDb25maWdDaGFuZ2VkLCAxKSkgeworICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogZW5kIG9mIFNickNvbmZpZygpICovCisgICAgICAgIH0KKyAgICAgICAgdXNjLT5tX25Vc2FjQ2hhbm5lbHMgKz0gMTsKKyAgICAgICAgY2hhbm5lbEVsZW1lbnRJZHgrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSURfVVNBQ19DUEU6CisgICAgICAgIC8qIFVzYWNDb3JlQ29uZmlnKCkgSVNPL0lFQyBGRElTIDIzMDAzLTMgIFRhYmxlIDEwICovCisgICAgICAgIGlmIChGREtyZWFkQml0KGhCcykpIHsgLyogdHdfbWRjdCAqLworICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgICB9CisgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX25vaXNlRmlsbGluZyA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICAgIC8qIGVuZCBvZiBVc2FjQ29yZUNvbmZpZygpICovCisgICAgICAgIGlmICh1c2MtPm1fc2JyUmF0aW9JbmRleCA+IDApIHsKKyAgICAgICAgICBpZiAoY2ItPmNiU2JyID09IE5VTEwpIHJldHVybiBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICAgICAgICAgIC8qIFNickNvbmZpZygpIElTTy9JRUMgRkRJUyAyMzAwMy0zICovCisgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1faGFybW9uaWNTQlIgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1faW50ZXJUZXMgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1fcHZjID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIElOVCBiaXRzVG9Ta2lwID0gc2tpcFNickhlYWRlcihoQnMsIDEpOworICAgICAgICAgICAgLyogcmVhZCBzdGVyZW9Db25maWdJbmRleCAqLworICAgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1fc3RlcmVvQ29uZmlnSW5kZXggPSBGREtyZWFkQml0cyhoQnMsIDIpOworICAgICAgICAgICAgLyogcmV3aW5kICovCisgICAgICAgICAgICBGREtwdXNoQmFjayhoQnMsIGJpdHNUb1NraXAgKyAyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgeworICAgICAgICAgICAgTVA0X0VMRU1FTlRfSUQgZWxfdHlwZSA9CisgICAgICAgICAgICAgICAgKHVzYy0+ZWxlbWVudFtpXS5tX3N0ZXJlb0NvbmZpZ0luZGV4ID09IDEgfHwKKyAgICAgICAgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1fc3RlcmVvQ29uZmlnSW5kZXggPT0gMikKKyAgICAgICAgICAgICAgICAgICAgPyBJRF9TQ0UKKyAgICAgICAgICAgICAgICAgICAgOiBJRF9DUEU7CisgICAgICAgICAgICBpZiAoY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIGFzYy0+bV9hb3QsIGVsX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxFbGVtZW50SWR4LCB1c2MtPmVsZW1lbnRbaV0ubV9oYXJtb25pY1NCUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1fc3RlcmVvQ29uZmlnSW5kZXgsIGFzYy0+Y29uZmlnTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzYy0+U2JyQ29uZmlnQ2hhbmdlZCwgMSkpIHsKICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCBzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQlNBQyApIHsKLSAgICAgICAgICAgIHNlbGYtPm1fZXh0ZW5zaW9uQ2hhbm5lbENvbmZpZ3VyYXRpb24gPSBGREtyZWFkQml0cyhicywgNCk7Ci0gICAgICAgICAgICBiaXRzQXZhaWxhYmxlIC09IDQ7CisgICAgICAgICAgLyogZW5kIG9mIFNickNvbmZpZygpICovCisKKyAgICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9zdGVyZW9Db25maWdJbmRleCA9CisgICAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgMik7IC8qIE5lZWRlZCBpbiBSTTUgc3ludGF4ICovCisKKyAgICAgICAgICBpZiAodXNjLT5lbGVtZW50W2ldLm1fc3RlcmVvQ29uZmlnSW5kZXggPiAwKSB7CisgICAgICAgICAgICBpZiAoY2ItPmNiU3NjICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgLyogTXBzMjEyQ29uZmlnKCkgSVNPL0lFQyBGRElTIDIzMDAzLTMgKi8KKyAgICAgICAgICAgICAgaWYgKGNiLT5jYlNzYyhjYi0+Y2JTc2NEYXRhLCBoQnMsIGFzYy0+bV9hb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX3N0ZXJlb0NvbmZpZ0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYy0+bV9jb3JlU2JyRnJhbWVMZW5ndGhJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBkb24ndCBrbm93IHRoZSBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPmNvbmZpZ01vZGUsICZhc2MtPlNhY0NvbmZpZ0NoYW5nZWQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvKiBlbmQgb2YgTXBzMjEyQ29uZmlnKCkgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9zdGVyZW9Db25maWdJbmRleCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgdXNjLT5tX25Vc2FjQ2hhbm5lbHMgKz0gMjsKKworICAgICAgICBjaGFubmVsRWxlbWVudElkeCsrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJRF9VU0FDX0xGRToKKyAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1fbm9pc2VGaWxsaW5nID0gMDsKKyAgICAgICAgdXNjLT5tX25Vc2FjQ2hhbm5lbHMgKz0gMTsKKyAgICAgICAgaWYgKHVzYy0+bV9zYnJSYXRpb0luZGV4ID4gMCkgeworICAgICAgICAgIC8qIFVzZSBTQlIgZm9yIHVwc2FtcGxpbmcgKi8KKyAgICAgICAgICBpZiAoY2ItPmNiU2JyID09IE5VTEwpIHJldHVybiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19VTktPV05fRVJST1I7CisgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1faGFybW9uaWNTQlIgPSAoVUNIQVIpMDsKKyAgICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9pbnRlclRlcyA9IChVQ0hBUikwOworICAgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX3B2YyA9IChVQ0hBUikwOworICAgICAgICAgIGlmIChjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBhc2MtPm1fYW90LCBJRF9MRkUsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRWxlbWVudElkeCwgdXNjLT5lbGVtZW50W2ldLm1faGFybW9uaWNTQlIsCisgICAgICAgICAgICAgICAgICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9zdGVyZW9Db25maWdJbmRleCwgYXNjLT5jb25maWdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgJmFzYy0+U2JyQ29uZmlnQ2hhbmdlZCwgMSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLyogVXBkYXRlIGNvdW50ZXIgYmVjYXVzZSBvZiB2YXJpYWJsZSBsZW5ndGggZmllbGRzIChBT1QgYW5kIHNhbXBsaW5nIHJhdGUpICovCi0gICAgICAgIGJpdHNBdmFpbGFibGUgPSAoSU5UKUZES2dldFZhbGlkQml0cyhicyk7CisgICAgICAgIGNoYW5uZWxFbGVtZW50SWR4Kys7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElEX1VTQUNfRVhUOgorICAgICAgICBFcnJvclN0YXR1cyA9IGV4dEVsZW1lbnRDb25maWcoJnVzYy0+ZWxlbWVudFtpXS5leHRFbGVtZW50LCBoQnMsIGNiLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgMCwgYXNjLT5tX2FvdCk7CisKKyAgICAgICAgaWYgKEVycm9yU3RhdHVzKSB7CisgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBub24gVVNBQy1lbGVtZW50IGVuY291bnRlcmVkICovCisgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgfQorICB9CisKKyAgaWYgKGFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICBpZiAodXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uSW5kZXgpIHsKKyAgICAgIC8qIHNhbml0eSBjaGVjazogYWxsIGVsZW1lbnQgY291bnRlciBtdXN0IGJlIHplcm8gKi8KKyAgICAgIGlmIChzY19jaGFuX2NvbmZpZy5uQ1BFIHwgc2NfY2hhbl9jb25maWcublNDRSB8IHNjX2NoYW5fY29uZmlnLm5MRkUpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVNDRVhUX1BTOiAgICAgLyogMHg1NDggKi8KLSAgICAgIGlmICggKGxhc3RBc2NFeHQgPT0gQVNDRVhUX1NCUikKLSAgICAgICAgJiYgKHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID09IEFPVF9TQlIpCi0gICAgICAgICYmIChiaXRzQXZhaWxhYmxlID4gMCkgKQotICAgICAgeyAvKiBHZXQgUFMgZXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24gKi8KLSAgICAgICAgc2VsZi0+bV9wc1ByZXNlbnRGbGFnID0gRkRLcmVhZEJpdHMoYnMsIDEpOwotICAgICAgICBiaXRzQXZhaWxhYmxlIC09IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHNhbml0eSBjaGVjazogbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHNoYWxsIGJlIGVxdWFsIHRvIG9yIHNtYWxsZXIKKyAgICAgICAqIHRoYW4gdGhlIGFjY3VtdWxhdGVkIHN1bSBvZiBhbGwgY2hhbm5lbHMgKi8KKyAgICAgIGlmICgoSU5UKSgtMiAqIHNjX2NoYW5fY29uZmlnLm5DUEUgLSBzY19jaGFuX2NvbmZpZy5uU0NFIC0KKyAgICAgICAgICAgICAgICBzY19jaGFuX2NvbmZpZy5uTEZFKSA8IChJTlQpdXNjLT5udW1BdWRpb0NoYW5uZWxzKSB7CisgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CiAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogSnVzdCBpZ25vcmUgYW55dGhpbmcuICovCi0gICAgICByZXR1cm4gVFJBTlNQT1JUREVDX09LOworICAgIH0KKyAgfQorCisgIHJldHVybiBFcnJvclN0YXR1czsKK30KKworLyogTWFwcGluZyBvZiBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCBkZWZpbmVkIGJ5IFRhYmxlIDcwIGluIElTTy9JRUMgMjMwMDMtMyAqLworc3RhdGljIFRSQU5TUE9SVERFQ19FUlJPUiBVc2FjQ29uZmlnX1NldENvcmVTYnJGcmFtZUxlbmd0aEluZGV4KAorICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjLCBpbnQgY29yZVNickZyYW1lTGVuZ3RoSW5kZXgpIHsKKyAgaW50IHNiclJhdGlvSW5kZXhfdmFsOworCisgIGlmIChjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCA+IDQpIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOyAvKiByZXNlcnZlZCB2YWx1ZXMgKi8KKyAgfQorICBhc2MtPm1fc2MubV91c2FjQ29uZmlnLm1fY29yZVNickZyYW1lTGVuZ3RoSW5kZXggPSBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleDsKKyAgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSA9IHVzYWNGcmFtZUxlbmd0aFtjb3JlU2JyRnJhbWVMZW5ndGhJbmRleF07CisgIHNiclJhdGlvSW5kZXhfdmFsID0gc2JyUmF0aW9JbmRleFtjb3JlU2JyRnJhbWVMZW5ndGhJbmRleF07CisgIGFzYy0+bV9zYy5tX3VzYWNDb25maWcubV9zYnJSYXRpb0luZGV4ID0gc2JyUmF0aW9JbmRleF92YWw7CisKKyAgaWYgKHNiclJhdGlvSW5kZXhfdmFsID4gMCkgeworICAgIGFzYy0+bV9zYnJQcmVzZW50RmxhZyA9IDE7CisgICAgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5ID0gYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5OworICAgIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXg7CisgICAgc3dpdGNoIChzYnJSYXRpb0luZGV4X3ZhbCkgeworICAgICAgY2FzZSAxOiAvKiBzYnJSYXRpbyA9IDQ6MSAqLworICAgICAgICBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgPj49IDI7CisgICAgICAgIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUgPj49IDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOiAvKiBzYnJSYXRpbyA9IDg6MyAqLworICAgICAgICBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSAoYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5ICogMykgLyA4OworICAgICAgICBhc2MtPm1fc2FtcGxlc1BlckZyYW1lID0gKGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUgKiAzKSAvIDg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAvKiBzYnJSYXRpbyA9IDI6MSAqLworICAgICAgICBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgPj49IDE7CisgICAgICAgIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUgPj49IDE7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXggPQorICAgICAgICBnZXRTYW1wbGluZ1JhdGVJbmRleChhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksIDQpOworICB9CisKKyAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKK30KKworc3RhdGljIFRSQU5TUE9SVERFQ19FUlJPUiBVc2FjQ29uZmlnX1BhcnNlKENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYikgeworICBpbnQgdXNhY1NhbXBsaW5nRnJlcXVlbmN5LCBjaGFubmVsQ29uZmlndXJhdGlvbkluZGV4LCBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleDsKKyAgVFJBTlNQT1JUREVDX0VSUk9SIGVyciA9IFRSQU5TUE9SVERFQ19PSzsKKworICAvKiBTdGFydCBiaXQgcG9zaXRpb24gb2YgdXNhY0NvbmZpZyAqLworICBJTlQgbmJpdHMgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOworCisgIHVzYWNTYW1wbGluZ0ZyZXF1ZW5jeSA9IGdldFNhbXBsZVJhdGUoaEJzLCAmYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXgsIDUpOworICBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSAoVUlOVCl1c2FjU2FtcGxpbmdGcmVxdWVuY3k7CisKKyAgY29yZVNickZyYW1lTGVuZ3RoSW5kZXggPSBGREtyZWFkQml0cyhoQnMsIDMpOworICBpZiAoVXNhY0NvbmZpZ19TZXRDb3JlU2JyRnJhbWVMZW5ndGhJbmRleChhc2MsIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4KSAhPQorICAgICAgVFJBTlNQT1JUREVDX09LKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgfQorCisgIGNoYW5uZWxDb25maWd1cmF0aW9uSW5kZXggPSBGREtyZWFkQml0cyhoQnMsIDUpOworICBpZiAoY2hhbm5lbENvbmZpZ3VyYXRpb25JbmRleCA+IDIpIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOyAvKiBvbmx5IGNoYW5uZWxDb25maWd1cmF0aW9uSW5kZXggPSBbMSwyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBzdXBwb3J0ZWQgKi8KKyAgfQorCisgIGlmIChjaGFubmVsQ29uZmlndXJhdGlvbkluZGV4ID09IDApIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOyAvKiBvbmx5IGNoYW5uZWxDb25maWd1cmF0aW9uSW5kZXggPSBbMSwyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBzdXBwb3J0ZWQgKi8KKyAgfQorICBhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPSBjaGFubmVsQ29uZmlndXJhdGlvbkluZGV4OworCisgIGVyciA9IFVzYWNSc3Y2MERlY29kZXJDb25maWdfUGFyc2UoYXNjLCBoQnMsIGNiKTsKKyAgaWYgKGVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICByZXR1cm4gZXJyOworICB9CisKKyAgaWYgKEZES3JlYWRCaXRzKGhCcywgMSkpIHsgLyogdXNhY0NvbmZpZ0V4dGVuc2lvblByZXNlbnQgKi8KKyAgICBlcnIgPSBjb25maWdFeHRlbnNpb24oJmFzYy0+bV9zYy5tX3VzYWNDb25maWcsIGhCcywgY2IpOworICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgfQorCisgIC8qIHNhbml0eSBjaGVjayB3aGV0aGVyIG51bWJlciBvZiBjaGFubmVscyBzaWduYWxlZCBpbiBVc2FjRGVjb2RlckNvbmZpZygpCisgICAgIG1hdGNoZXMgdGhlIG51bWJlciBvZiBjaGFubmVscyByZXF1aXJlZCBieSBjaGFubmVsQ29uZmlndXJhdGlvbkluZGV4ICovCisgIGlmICgoY2hhbm5lbENvbmZpZ3VyYXRpb25JbmRleCA+IDApICYmCisgICAgICAoc2NfY2hhbl9jb25maWdfdGFiW2NoYW5uZWxDb25maWd1cmF0aW9uSW5kZXhdLm5DaCAhPQorICAgICAgIGFzYy0+bV9zYy5tX3VzYWNDb25maWcubV9uVXNhY0NoYW5uZWxzKSkgeworICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgIH0KKworICAvKiBDb3B5IFVzYWNDb25maWcoKSB0byBhc2MtPm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWdbXSBidWZmZXIuICovCisgIElOVCBjb25maWdTaXplX2JpdHMgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpIC0gbmJpdHM7CisgIFN0b3JlQ29uZmlnQXNCaXRzdHJlYW0oaEJzLCBjb25maWdTaXplX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRQX1VTQUNfTUFYX0NPTkZJR19MRU4pOworICBhc2MtPm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWdCaXRzID0gZkFicyhjb25maWdTaXplX2JpdHMpOworCisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgQXVkaW9TcGVjaWZpY0NvbmZpZ19FeHRlbnNpb25QYXJzZSgKKyAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDU1RwQ2FsbEJhY2tzICpjYikgeworICBUUF9BU0NfRVhURU5TSU9OX0lEIGxhc3RBc2NFeHQsIGFzY0V4dElkID0gQVNDRVhUX1VOS09XTjsKKyAgSU5UIGJpdHNBdmFpbGFibGUgPSAoSU5UKUZES2dldFZhbGlkQml0cyhicyk7CisKKyAgd2hpbGUgKGJpdHNBdmFpbGFibGUgPj0gMTEpIHsKKyAgICBsYXN0QXNjRXh0ID0gYXNjRXh0SWQ7CisgICAgYXNjRXh0SWQgPSAoVFBfQVNDX0VYVEVOU0lPTl9JRClGREtyZWFkQml0cyhicywgMTEpOworICAgIGJpdHNBdmFpbGFibGUgLT0gMTE7CisKKyAgICBzd2l0Y2ggKGFzY0V4dElkKSB7CisgICAgICBjYXNlIEFTQ0VYVF9TQlI6IC8qIDB4MmI3ICovCisgICAgICAgIGlmICgoc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgIT0gQU9UX1NCUikgJiYKKyAgICAgICAgICAgIChiaXRzQXZhaWxhYmxlID49IDUpKSB7CisgICAgICAgICAgc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPSBnZXRBT1QoYnMpOworCisgICAgICAgICAgaWYgKChzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfU0JSKSB8fAorICAgICAgICAgICAgICAoc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPT0KKyAgICAgICAgICAgICAgIEFPVF9FUl9CU0FDKSkgeyAvKiBHZXQgU0JSIGV4dGVuc2lvbiBjb25maWd1cmF0aW9uICovCisgICAgICAgICAgICBzZWxmLT5tX3NiclByZXNlbnRGbGFnID0gRkRLcmVhZEJpdHMoYnMsIDEpOworICAgICAgICAgICAgaWYgKHNlbGYtPm1fYW90ID09IEFPVF9VU0FDICYmIHNlbGYtPm1fc2JyUHJlc2VudEZsYWcgPiAwICYmCisgICAgICAgICAgICAgICAgc2VsZi0+bV9zYy5tX3VzYWNDb25maWcubV9zYnJSYXRpb0luZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNlbGYtPm1fc2JyUHJlc2VudEZsYWcgPT0gMSkgeworICAgICAgICAgICAgICBzZWxmLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5ID0gZ2V0U2FtcGxlUmF0ZSgKKyAgICAgICAgICAgICAgICAgIGJzLCAmc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4LCA0KTsKKworICAgICAgICAgICAgICBpZiAoKElOVClzZWxmLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5IDw9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMpIHsKKyAgICAgICAgICAgICAgc2VsZi0+bV9leHRlbnNpb25DaGFubmVsQ29uZmlndXJhdGlvbiA9IEZES3JlYWRCaXRzKGJzLCA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgLyogVXBkYXRlIGNvdW50ZXIgYmVjYXVzZSBvZiB2YXJpYWJsZSBsZW5ndGggZmllbGRzIChBT1QgYW5kIHNhbXBsaW5nCisgICAgICAgICAgICogcmF0ZSkgKi8KKyAgICAgICAgICBiaXRzQXZhaWxhYmxlID0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBU0NFWFRfUFM6IC8qIDB4NTQ4ICovCisgICAgICAgIGlmICgobGFzdEFzY0V4dCA9PSBBU0NFWFRfU0JSKSAmJgorICAgICAgICAgICAgKHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID09IEFPVF9TQlIpICYmCisgICAgICAgICAgICAoYml0c0F2YWlsYWJsZSA+IDApKSB7IC8qIEdldCBQUyBleHRlbnNpb24gY29uZmlndXJhdGlvbiAqLworICAgICAgICAgIHNlbGYtPm1fcHNQcmVzZW50RmxhZyA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICAgICAgICBiaXRzQXZhaWxhYmxlIC09IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFTQ0VYVF9NUFM6IC8qIDB4NzZhICovCisgICAgICAgIGlmIChzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfTVBFR1MpIGJyZWFrOworICAgICAgY2FzZSBBU0NFWFRfTERNUFM6IC8qIDB4N2NjICovCisgICAgICAgIGlmICgoYXNjRXh0SWQgPT0gQVNDRVhUX0xETVBTKSAmJgorICAgICAgICAgICAgKHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID09IEFPVF9MRF9NUEVHUykpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChiaXRzQXZhaWxhYmxlID49IDEpIHsKKyAgICAgICAgICBiaXRzQXZhaWxhYmxlIC09IDE7CisgICAgICAgICAgaWYgKEZES3JlYWRCaXRzKGJzLCAxKSkgeyAvKiBzZWxmLT5tX21wc1ByZXNlbnRGbGFnICovCisgICAgICAgICAgICBpbnQgc3NjTGVuID0gRkRLcmVhZEJpdHMoYnMsIDgpOworICAgICAgICAgICAgYml0c0F2YWlsYWJsZSAtPSA4OworICAgICAgICAgICAgaWYgKHNzY0xlbiA9PSAweEZGKSB7CisgICAgICAgICAgICAgIHNzY0xlbiArPSBGREtyZWFkQml0cyhicywgMTYpOworICAgICAgICAgICAgICBiaXRzQXZhaWxhYmxlIC09IDE2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgRkRLcHVzaEZvcihicywgc3NjTGVuKTsgLyogU2tpcCBTU0MgdG8gYmUgYWJsZSB0byByZWFkIHRoZSBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gaWYgdGhlcmUgaXMgb25lLiAqLworCisgICAgICAgICAgICBiaXRzQXZhaWxhYmxlIC09IHNzY0xlbiAqIDg7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBU0NFWFRfU0FPQzoKKyAgICAgICAgaWYgKChhc2NFeHRJZCA9PSBBU0NFWFRfU0FPQykgJiYKKyAgICAgICAgICAgIChzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfU0FPQykpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChGREtyZWFkQml0cyhicywgMSkpIHsgLyogc2FvY1ByZXNlbnQgKi8KKyAgICAgICAgICBpbnQgc2FvY3NjTGVuID0gRkRLcmVhZEJpdHMoYnMsIDgpOworICAgICAgICAgIGJpdHNBdmFpbGFibGUgLT0gODsKKyAgICAgICAgICBpZiAoc2FvY3NjTGVuID09IDB4RkYpIHsKKyAgICAgICAgICAgIHNhb2NzY0xlbiArPSBGREtyZWFkQml0cyhicywgMTYpOworICAgICAgICAgICAgYml0c0F2YWlsYWJsZSAtPSAxNjsKKyAgICAgICAgICB9CisgICAgICAgICAgRkRLcHVzaEZvcihicywgc2FvY3NjTGVuKTsKKyAgICAgICAgICBiaXRzQXZhaWxhYmxlIC09IHNhb2NzY0xlbiAqIDg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBKdXN0IGlnbm9yZSBhbnl0aGluZy4gKi8KKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKICAgICB9CiAgIH0KIApAQCAtMTIzNywxMzQgKzIwNzAsMTUxIEBACiAgKiBBUEkgRnVuY3Rpb25zCiAgKi8KIAotdm9pZCBBdWRpb1NwZWNpZmljQ29uZmlnX0luaXQoQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MpCi17Cit2b2lkIEF1ZGlvU3BlY2lmaWNDb25maWdfSW5pdChDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYykgewogICBGREttZW1jbGVhcihhc2MsIHNpemVvZihDU0F1ZGlvU3BlY2lmaWNDb25maWcpKTsKIAogICAvKiBJbml0IGFsbCB2YWx1ZXMgdGhhdCBzaG91bGQgbm90IGJlIHplcm8uICovCi0gIGFzYy0+bV9hb3QgICAgICAgICAgICAgICAgICAgID0gQU9UX05PTkU7CisgIGFzYy0+bV9hb3QgPSBBT1RfTk9ORTsKICAgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSAweGY7Ci0gIGFzYy0+bV9lcENvbmZpZyAgICAgICAgICAgICAgID0gLTE7Ci0gIGFzYy0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgICAgICAgID0gQU9UX05VTExfT0JKRUNUOwotI2lmZGVmIFRQX1BDRV9FTkFCTEUKKyAgYXNjLT5tX2VwQ29uZmlnID0gLTE7CisgIGFzYy0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPSBBT1RfTlVMTF9PQkpFQ1Q7CiAgIENQcm9ncmFtQ29uZmlnX0luaXQoJmFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQpOwotI2VuZGlmCiB9CiAKIFRSQU5TUE9SVERFQ19FUlJPUiBBdWRpb1NwZWNpZmljQ29uZmlnX1BhcnNlKAotICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnNlbGYsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgYnMsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgZkV4cGxpY2l0QmFja3dhcmRDb21wYXRpYmxlLAotICAgICAgICBDU1RwQ2FsbEJhY2tzICAgICAgKmNiCi0gICAgICAgICkKLXsKKyAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgIGludCBmRXhwbGljaXRCYWNrd2FyZENvbXBhdGlibGUsIENTVHBDYWxsQmFja3MgKmNiLCBVQ0hBUiBjb25maWdNb2RlLAorICAgIFVDSEFSIGNvbmZpZ0NoYW5nZWQsIEFVRElPX09CSkVDVF9UWVBFIG1fYW90KSB7CiAgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKICAgVUlOVCBhc2NTdGFydEFuY2hvciA9IEZES2dldFZhbGlkQml0cyhicyk7CiAgIGludCBmcmFtZUxlbmd0aEZsYWcgPSAtMTsKIAogICBBdWRpb1NwZWNpZmljQ29uZmlnX0luaXQoc2VsZik7CiAKLSAgc2VsZi0+bV9hb3QgPSBnZXRBT1QoYnMpOwotICBzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0gZ2V0U2FtcGxlUmF0ZShicywgJnNlbGYtPm1fc2FtcGxpbmdGcmVxdWVuY3lJbmRleCwgNCk7Ci0gIGlmIChzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5IDw9IDApIHsKLSAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOwotICB9CisgIHNlbGYtPmNvbmZpZ01vZGUgPSBjb25maWdNb2RlOworICBzZWxmLT5BYWNDb25maWdDaGFuZ2VkID0gY29uZmlnQ2hhbmdlZDsKKyAgc2VsZi0+U2JyQ29uZmlnQ2hhbmdlZCA9IGNvbmZpZ0NoYW5nZWQ7CisgIHNlbGYtPlNhY0NvbmZpZ0NoYW5nZWQgPSBjb25maWdDaGFuZ2VkOwogCi0gIHNlbGYtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPSBGREtyZWFkQml0cyhicyw0KTsKLQotICAvKiBTQlIgZXh0ZW5zaW9uICggZXhwbGljaXQgbm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIG1vZGUgKSAqLwotICBzZWxmLT5tX3NiclByZXNlbnRGbGFnID0gMDsKLSAgc2VsZi0+bV9wc1ByZXNlbnRGbGFnICA9IDA7Ci0KLSAgaWYgKCBzZWxmLT5tX2FvdCA9PSBBT1RfU0JSIHx8IHNlbGYtPm1fYW90ID09IEFPVF9QUyApIHsKLSAgICBzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9IEFPVF9TQlI7Ci0KLSAgICBzZWxmLT5tX3NiclByZXNlbnRGbGFnID0gMTsKLSAgICBpZiAoIHNlbGYtPm1fYW90ID09IEFPVF9QUyApIHsKLSAgICAgIHNlbGYtPm1fcHNQcmVzZW50RmxhZyA9IDE7CisgIGlmIChtX2FvdCAhPSBBT1RfTlVMTF9PQkpFQ1QpIHsKKyAgICBzZWxmLT5tX2FvdCA9IG1fYW90OworICB9IGVsc2UgeworICAgIHNlbGYtPm1fYW90ID0gZ2V0QU9UKGJzKTsKKyAgICBzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0KKyAgICAgICAgZ2V0U2FtcGxlUmF0ZShicywgJnNlbGYtPm1fc2FtcGxpbmdGcmVxdWVuY3lJbmRleCwgNCk7CisgICAgaWYgKHNlbGYtPm1fc2FtcGxpbmdGcmVxdWVuY3kgPD0gMCB8fAorICAgICAgICAoc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA+IDk2MDAwICYmIHNlbGYtPm1fYW90ICE9IDM5KSB8fAorICAgICAgICBzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID4gNCAqIDk2MDAwKSB7CisgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOwogICAgIH0KIAotICAgIHNlbGYtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3kgPSBnZXRTYW1wbGVSYXRlKGJzLCAmc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4LCA0KTsKLSAgICBzZWxmLT5tX2FvdCA9IGdldEFPVChicyk7CisgICAgc2VsZi0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IEZES3JlYWRCaXRzKGJzLCA0KTsKIAotICB9IGVsc2UgewotICAgIHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID0gQU9UX05VTExfT0JKRUNUOworICAgIC8qIFNCUiBleHRlbnNpb24gKCBleHBsaWNpdCBub24tYmFja3dhcmRzIGNvbXBhdGlibGUgbW9kZSApICovCisgICAgc2VsZi0+bV9zYnJQcmVzZW50RmxhZyA9IDA7CisgICAgc2VsZi0+bV9wc1ByZXNlbnRGbGFnID0gMDsKKworICAgIGlmIChzZWxmLT5tX2FvdCA9PSBBT1RfU0JSIHx8IHNlbGYtPm1fYW90ID09IEFPVF9QUykgeworICAgICAgc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPSBBT1RfU0JSOworCisgICAgICBzZWxmLT5tX3NiclByZXNlbnRGbGFnID0gMTsKKyAgICAgIGlmIChzZWxmLT5tX2FvdCA9PSBBT1RfUFMpIHsKKyAgICAgICAgc2VsZi0+bV9wc1ByZXNlbnRGbGFnID0gMTsKKyAgICAgIH0KKworICAgICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9CisgICAgICAgICAgZ2V0U2FtcGxlUmF0ZShicywgJnNlbGYtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3lJbmRleCwgNCk7CisgICAgICBzZWxmLT5tX2FvdCA9IGdldEFPVChicyk7CisKKyAgICAgIHN3aXRjaCAoc2VsZi0+bV9hb3QpIHsKKyAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFPVF9FUl9CU0FDOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgfQorCisgICAgICBpZiAoc2VsZi0+bV9hb3QgPT0gQU9UX0VSX0JTQUMpIHsKKyAgICAgICAgc2VsZi0+bV9leHRlbnNpb25DaGFubmVsQ29uZmlndXJhdGlvbiA9IEZES3JlYWRCaXRzKGJzLCA0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPSBBT1RfTlVMTF9PQkpFQ1Q7CisgICAgfQogICB9CiAKICAgLyogUGFyc2Ugd2hhdGV2ZXIgc3BlY2lmaWMgY29uZmlncyAqLwotICBzd2l0Y2ggKHNlbGYtPm1fYW90KQotICB7Ci0jaWZkZWYgVFBfR0FfRU5BQkxFCisgIHN3aXRjaCAoc2VsZi0+bV9hb3QpIHsKICAgICBjYXNlIEFPVF9BQUNfTEM6CisgICAgY2FzZSBBT1RfQUFDX1NDQUw6CiAgICAgY2FzZSBBT1RfRVJfQUFDX0xDOgogICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKICAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKICAgICBjYXNlIEFPVF9FUl9CU0FDOgotICAgICAgaWYgKChFcnJvclN0YXR1cyA9IEdhU3BlY2lmaWNDb25maWdfUGFyc2UoJnNlbGYtPm1fc2MubV9nYVNwZWNpZmljQ29uZmlnLCBzZWxmLCBicywgYXNjU3RhcnRBbmNob3IpKSAhPSBUUkFOU1BPUlRERUNfT0sgKSB7CisgICAgICBpZiAoKEVycm9yU3RhdHVzID0gR2FTcGVjaWZpY0NvbmZpZ19QYXJzZSgmc2VsZi0+bV9zYy5tX2dhU3BlY2lmaWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBicywgYXNjU3RhcnRBbmNob3IpKSAhPQorICAgICAgICAgIFRSQU5TUE9SVERFQ19PSykgewogICAgICAgICByZXR1cm4gKEVycm9yU3RhdHVzKTsKICAgICAgIH0KICAgICAgIGZyYW1lTGVuZ3RoRmxhZyA9IHNlbGYtPm1fc2MubV9nYVNwZWNpZmljQ29uZmlnLm1fZnJhbWVMZW5ndGhGbGFnOwogICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogVFBfR0FfRU5BQkxFICovCiAgICAgY2FzZSBBT1RfTVBFR1M6CiAgICAgICBpZiAoY2ItPmNiU3NjICE9IE5VTEwpIHsKLSAgICAgICAgY2ItPmNiU3NjKAotICAgICAgICAgICAgICAgIGNiLT5jYlNzY0RhdGEsCi0gICAgICAgICAgICAgICAgYnMsCi0gICAgICAgICAgICAgICAgc2VsZi0+bV9hb3QsCi0gICAgICAgICAgICAgICAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSwKLSAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgIDAgIC8qIGRvbid0IGtub3cgdGhlIGxlbmd0aCAqLwotICAgICAgICAgICAgICAgICk7CisgICAgICAgIGlmIChjYi0+Y2JTc2MoY2ItPmNiU3NjRGF0YSwgYnMsIHNlbGYtPm1fYW90LCBzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgIDEsIC0xLCAvKiBuVGltZVNsb3RzOiByZWFkIGZyb20gYml0c3RyZWFtICovCisgICAgICAgICAgICAgICAgICAgICAgMCwgICAgIC8qIGRvbid0IGtub3cgdGhlIGxlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNvbmZpZ01vZGUsICZzZWxmLT5TYWNDb25maWdDaGFuZ2VkKSkgeworICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgICB9CiAgICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKICAgICAgIH0KICAgICAgIGJyZWFrOwotI2lmZGVmIFRQX0VMRF9FTkFCTEUKICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgotICAgICAgaWYgKChFcnJvclN0YXR1cyA9IEVsZFNwZWNpZmljQ29uZmlnX1BhcnNlKHNlbGYsIGJzLCBjYikpICE9IFRSQU5TUE9SVERFQ19PSyApIHsKKyAgICAgIGlmICgoRXJyb3JTdGF0dXMgPSBFbGRTcGVjaWZpY0NvbmZpZ19QYXJzZShzZWxmLCBicywgY2IpKSAhPQorICAgICAgICAgIFRSQU5TUE9SVERFQ19PSykgewogICAgICAgICByZXR1cm4gKEVycm9yU3RhdHVzKTsKICAgICAgIH0KICAgICAgIGZyYW1lTGVuZ3RoRmxhZyA9IHNlbGYtPm1fc2MubV9lbGRTcGVjaWZpY0NvbmZpZy5tX2ZyYW1lTGVuZ3RoRmxhZzsKICAgICAgIHNlbGYtPm1fc2JyUHJlc2VudEZsYWcgPSBzZWxmLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV9zYnJQcmVzZW50RmxhZzsKLSAgICAgIHNlbGYtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3kgPSAoc2VsZi0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fc2JyU2FtcGxpbmdSYXRlKzEpICogc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKKyAgICAgIHNlbGYtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3kgPQorICAgICAgICAgIChzZWxmLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV9zYnJTYW1wbGluZ1JhdGUgKyAxKSAqCisgICAgICAgICAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIFRQX0VMRF9FTkFCTEUgKi8KKyAgICBjYXNlIEFPVF9VU0FDOgorICAgICAgaWYgKChFcnJvclN0YXR1cyA9IFVzYWNDb25maWdfUGFyc2Uoc2VsZiwgYnMsIGNiKSkgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgIHJldHVybiAoRXJyb3JTdGF0dXMpOworICAgICAgfQorICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7Ci0gICAgICBicmVhazsKICAgfQogCiAgIC8qIEZyYW1lIGxlbmd0aCAqLwotICBzd2l0Y2ggKHNlbGYtPm1fYW90KQotICB7Ci0jaWYgZGVmaW5lZChUUF9HQV9FTkFCTEUpIHx8IGRlZmluZWQoVFBfVVNBQ19FTkFCTEUpCisgIHN3aXRjaCAoc2VsZi0+bV9hb3QpIHsKICAgICBjYXNlIEFPVF9BQUNfTEM6CisgICAgY2FzZSBBT1RfQUFDX1NDQUw6CiAgICAgY2FzZSBBT1RfRVJfQUFDX0xDOgogICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgogICAgIGNhc2UgQU9UX0VSX0JTQUM6Ci0gICAgLypjYXNlIEFPVF9VU0FDOiovCisgICAgICAvKmNhc2UgQU9UX1VTQUM6Ki8KICAgICAgIGlmICghZnJhbWVMZW5ndGhGbGFnKQogICAgICAgICBzZWxmLT5tX3NhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7CiAgICAgICBlbHNlCiAgICAgICAgIHNlbGYtPm1fc2FtcGxlc1BlckZyYW1lID0gOTYwOwogICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogVFBfR0FfRU5BQkxFICovCi0jaWYgZGVmaW5lZChUUF9HQV9FTkFCTEUpCiAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgogICAgICAgaWYgKCFmcmFtZUxlbmd0aEZsYWcpCiAgICAgICAgIHNlbGYtPm1fc2FtcGxlc1BlckZyYW1lID0gNTEyOwogICAgICAgZWxzZQogICAgICAgICBzZWxmLT5tX3NhbXBsZXNQZXJGcmFtZSA9IDQ4MDsKICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIGRlZmluZWQoVFBfR0FfRU5BQkxFKSAqLwogICAgIGRlZmF1bHQ6CiAgICAgICBicmVhazsKICAgfQogCi0gIHN3aXRjaCAoc2VsZi0+bV9hb3QpCi0gIHsKKyAgc3dpdGNoIChzZWxmLT5tX2FvdCkgewogICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CiAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKQEAgLTEzNzIsNDAgKzIyMjIsMTk2IEBACiAgICAgY2FzZSBBT1RfRVJfQ0VMUDoKICAgICBjYXNlIEFPVF9FUl9IVlhDOgogICAgIGNhc2UgQU9UX0VSX0JTQUM6Ci0gICAgICBzZWxmLT5tX2VwQ29uZmlnID0gRkRLcmVhZEJpdHMoYnMsMik7CisgICAgICBzZWxmLT5tX2VwQ29uZmlnID0gRkRLcmVhZEJpdHMoYnMsIDIpOwogCiAgICAgICBpZiAoc2VsZi0+bV9lcENvbmZpZyA+IDEpIHsKLSAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7IC8vIEVQQ09ORklHOworICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsgIC8vIEVQQ09ORklHOwogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwogICB9CiAKLSAgaWYgKGZFeHBsaWNpdEJhY2t3YXJkQ29tcGF0aWJsZSkgeworICBpZiAoZkV4cGxpY2l0QmFja3dhcmRDb21wYXRpYmxlICYmCisgICAgICAoc2VsZi0+bV9hb3QgPT0gQU9UX0FBQ19MQyB8fCBzZWxmLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0xEIHx8CisgICAgICAgc2VsZi0+bV9hb3QgPT0gQU9UX0VSX0JTQUMpKSB7CiAgICAgRXJyb3JTdGF0dXMgPSBBdWRpb1NwZWNpZmljQ29uZmlnX0V4dGVuc2lvblBhcnNlKHNlbGYsIGJzLCBjYik7CiAgIH0KIAorICAvKiBDb3B5IGNvbmZpZygpIHRvIGFzYy0+Y29uZmlnW10gYnVmZmVyLiAqLworICBpZiAoKEVycm9yU3RhdHVzID09IFRSQU5TUE9SVERFQ19PSykgJiYgKHNlbGYtPm1fYW90ID09IEFPVF9VU0FDKSkgeworICAgIElOVCBjb25maWdTaXplX2JpdHMgPSAoSU5UKUZES2dldFZhbGlkQml0cyhicykgLSAoSU5UKWFzY1N0YXJ0QW5jaG9yOworICAgIFN0b3JlQ29uZmlnQXNCaXRzdHJlYW0oYnMsIGNvbmZpZ1NpemVfYml0cywgc2VsZi0+Y29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBfVVNBQ19NQVhfQ09ORklHX0xFTik7CisgICAgc2VsZi0+Y29uZmlnQml0cyA9IGZBYnMoY29uZmlnU2l6ZV9iaXRzKTsKKyAgfQorCiAgIHJldHVybiAoRXJyb3JTdGF0dXMpOwogfQogCitzdGF0aWMgVFJBTlNQT1JUREVDX0VSUk9SIERybV94SEVBQUNEZWNvZGVyQ29uZmlnKAorICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGludCBhdWRpb01vZGUsCisgICAgQ1NUcENhbGxCYWNrcyAqY2IgLyogdXNlIGNiID09IE5VTEwgdG8gc2lnbmFsIGNvbmZpZyBjaGVjayBvbmx5IG1vZGUgKi8KKykgeworICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CisgIENTVXNhY0NvbmZpZyAqdXNjID0gJmFzYy0+bV9zYy5tX3VzYWNDb25maWc7CisgIGludCBlbGVtSWR4ID0gMDsKKworICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9zdGVyZW9Db25maWdJbmRleCA9IDA7CisKKyAgdXNjLT5tX3VzYWNOdW1FbGVtZW50cyA9IDE7IC8qIEN1cnJlbnRseSBhbGwgZXh0ZW5zaW9uIGVsZW1lbnRzIGFyZSBza2lwcGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBvbmx5IG9uZSBTQ0Ugb3IgQ1BFLiAqLworCisgIHN3aXRjaCAoYXVkaW9Nb2RlKSB7CisgICAgY2FzZSAwOiAvKiBtb25vOiBJRF9VU0FDX1NDRSAqLworICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLnVzYWNFbGVtZW50VHlwZSA9IElEX1VTQUNfU0NFOworICAgICAgdXNjLT5tX25Vc2FjQ2hhbm5lbHMgPSAxOworICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1fbm9pc2VGaWxsaW5nID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgIGlmICh1c2MtPm1fc2JyUmF0aW9JbmRleCA+IDApIHsKKyAgICAgICAgaWYgKGNiID09IE5VTEwpIHsKKyAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNiLT5jYlNiciAhPSBOVUxMKSB7CisgICAgICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1faGFybW9uaWNTQlIgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1faW50ZXJUZXMgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1fcHZjID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICAgIGlmIChjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBhc2MtPm1fYW90LCBJRF9TQ0UsIGVsZW1JZHgsCisgICAgICAgICAgICAgICAgICAgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9oYXJtb25pY1NCUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX3N0ZXJlb0NvbmZpZ0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5jb25maWdNb2RlLCAmYXNjLT5TYnJDb25maWdDaGFuZ2VkLCAxKSkgeworICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvKiBzdGVyZW86IElEX1VTQUNfQ1BFICovCisgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0udXNhY0VsZW1lbnRUeXBlID0gSURfVVNBQ19DUEU7CisgICAgICB1c2MtPm1fblVzYWNDaGFubmVscyA9IDI7CisgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9ub2lzZUZpbGxpbmcgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgaWYgKHVzYy0+bV9zYnJSYXRpb0luZGV4ID4gMCkgeworICAgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9oYXJtb25pY1NCUiA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1faW50ZXJUZXMgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgIHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX3B2YyA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgeworICAgICAgICAgIElOVCBiaXRzVG9Ta2lwID0gc2tpcFNickhlYWRlcihoQnMsIDEpOworICAgICAgICAgIC8qIHJlYWQgc3RlcmVvQ29uZmlnSW5kZXggKi8KKyAgICAgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9zdGVyZW9Db25maWdJbmRleCA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgICAgICAgICAgLyogcmV3aW5kICovCisgICAgICAgICAgRkRLcHVzaEJhY2soaEJzLCBiaXRzVG9Ta2lwICsgMik7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdG9vbHMgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHBlciBhdWRpbworICAgICAgICBzdHJlYW0gY29uZmlndXJhdGlvbiAoc2VlIGNsYXVzZSA1LjMuMiwgeEhFLUFBQyBjb2RlYyBjb25maWd1cmF0aW9uKToKKyAgICAgICAgLSBNUFMyMTIgcGFyYW1ldHJpYyBzdGVyZW8gdG9vbCB3aXRoIHJlc2lkdWFsIGNvZGluZworICAgICAgICAoc3RlcmVvQ29uZmlnSW5kZXg+MSk7IGFuZAorICAgICAgICAtIFFNRiBiYXNlZCBIYXJtb25pYyBUcmFuc3Bvc2VyIChoYXJtb25pY1NCUj09MSkuCisgICAgICAgICovCisgICAgICAgIGlmICgodXNjLT5lbGVtZW50W2VsZW1JZHhdLm1fc3RlcmVvQ29uZmlnSW5kZXggPiAxKSAmJgorICAgICAgICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1faGFybW9uaWNTQlIpIHsKKyAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgVGhlIDQ6MSBzYnJSYXRpbyAoc2JyUmF0aW9JbmRleD09MSBpbiBbMTFdKSBtYXkgb25seSBiZSBlbXBsb3llZDoKKyAgICAgICAgLSBpbiBtb25vIG9wZXJhdGlvbjsgb3IKKyAgICAgICAgLSBpbiBzdGVyZW8gb3BlcmF0aW9uIGlmIHBhcmFtZXRyaWMgc3RlcmVvIChNUFMyMTIpIHdpdGhvdXQgcmVzaWR1YWwKKyAgICAgICAgY29kaW5nIGlzIGFwcGxpZWQsIGkuZS4gaWYgc3RlcmVvQ29uZmlnSW5kZXg9PTEgKHNlZSBjbGF1c2UgNS4zLjIsCisgICAgICAgIHhIRS1BQUMgY29kZWMgY29uZmlndXJhdGlvbikuCisgICAgICAgICovCisgICAgICAgIGlmICgodXNjLT5tX3NiclJhdGlvSW5kZXggPT0gMSkgJiYKKyAgICAgICAgICAgICh1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9zdGVyZW9Db25maWdJbmRleCAhPSAxKSkgeworICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2IgPT0gTlVMTCkgeworICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgTVA0X0VMRU1FTlRfSUQgZWxfdHlwZSA9CisgICAgICAgICAgICAgICh1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9zdGVyZW9Db25maWdJbmRleCA9PSAxIHx8CisgICAgICAgICAgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9zdGVyZW9Db25maWdJbmRleCA9PSAyKQorICAgICAgICAgICAgICAgICAgPyBJRF9TQ0UKKyAgICAgICAgICAgICAgICAgIDogSURfQ1BFOworICAgICAgICAgIGlmIChjYi0+Y2JTYnIgPT0gTlVMTCkgcmV0dXJuIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1VOS09XTl9FUlJPUjsKKyAgICAgICAgICBpZiAoY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgYXNjLT5tX2FvdCwgZWxfdHlwZSwgZWxlbUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX2hhcm1vbmljU0JSLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1fc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPmNvbmZpZ01vZGUsICZhc2MtPlNickNvbmZpZ0NoYW5nZWQsIDEpKSB7CisgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1fc3RlcmVvQ29uZmlnSW5kZXggPSovRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICAgICAgaWYgKHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX3N0ZXJlb0NvbmZpZ0luZGV4ID4gMCkgeworICAgICAgICAgIGlmIChjYi0+Y2JTc2MgIT0gTlVMTCkgeworICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSAoVFJBTlNQT1JUREVDX0VSUk9SKWNiLT5jYlNzYygKKyAgICAgICAgICAgICAgICBjYi0+Y2JTc2NEYXRhLCBoQnMsCisgICAgICAgICAgICAgICAgQU9UX0RSTV9VU0FDLCAvKiBzeW50YXggZGlmZmVycyBmcm9tIE1QRUcgTXBzMjEyQ29uZmlnKCkgKi8KKyAgICAgICAgICAgICAgICBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1fc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICAgICAgdXNjLT5tX2NvcmVTYnJGcmFtZUxlbmd0aEluZGV4LCAwLCAvKiBkb24ndCBrbm93IHRoZSBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICBhc2MtPmNvbmZpZ01vZGUsICZhc2MtPlNhY0NvbmZpZ0NoYW5nZWQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7ICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgfQorCisgIHJldHVybiBFcnJvclN0YXR1czsKK30KKworVFJBTlNQT1JUREVDX0VSUk9SIERybV94SEVBQUNTdGF0aWNDb25maWcoCisgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBpbnQgYXVkaW9Nb2RlLAorICAgIENTVHBDYWxsQmFja3MgKmNiIC8qIHVzZSBjYiA9PSBOVUxMIHRvIHNpZ25hbCBjb25maWcgY2hlY2sgb25seSBtb2RlICovCispIHsKKyAgaW50IGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4RHJtID0gRkRLcmVhZEJpdHMoYnMsIDIpOworICBpZiAoVXNhY0NvbmZpZ19TZXRDb3JlU2JyRnJhbWVMZW5ndGhJbmRleCgKKyAgICAgICAgICBhc2MsIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4RHJtICsgMSkgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgfQorCisgIGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IChhdWRpb01vZGUpID8gMiA6IDE7CisKKyAgaWYgKERybV94SEVBQUNEZWNvZGVyQ29uZmlnKGFzYywgYnMsIGF1ZGlvTW9kZSwgY2IpICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgIH0KKworICByZXR1cm4gVFJBTlNQT1JUREVDX09LOworfQorCisvKiBNYXBwaW5nIG9mIERSTSBhdWRpbyBzYW1wbGluZyByYXRlIGZpZWxkIHRvIE1QRUcgdXNhY1NhbXBsaW5nRnJlcXVlbmN5SW5kZXgKKyAqLworY29uc3QgVUNIQVIgbWFwU3IyTVBFR0lkeFs4XSA9IHsKKyAgICAweDFiLCAvKiAgOS42IGtIeiAqLworICAgIDB4MDksIC8qIDEyLjAga0h6ICovCisgICAgMHgwOCwgLyogMTYuMCBrSHogKi8KKyAgICAweDE3LCAvKiAxOS4yIGtIeiAqLworICAgIDB4MDYsIC8qIDI0LjAga0h6ICovCisgICAgMHgwNSwgLyogMzIuMCBrSHogKi8KKyAgICAweDEyLCAvKiAzOC40IGtIeiAqLworICAgIDB4MDMgIC8qIDQ4LjAga0h6ICovCit9OworCiBUUkFOU1BPUlRERUNfRVJST1IgRHJtUmF3U2RjQXVkaW9Db25maWdfUGFyc2UoCi0gICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqc2VsZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBicwotICAgICAgICApCi17CisgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICBDU1RwQ2FsbEJhY2tzICpjYiwgLyogdXNlIGNiID09IE5VTEwgdG8gc2lnbmFsIGNvbmZpZyBjaGVjayBvbmx5IG1vZGUgKi8KKyAgICBVQ0hBUiBjb25maWdNb2RlLCBVQ0hBUiBjb25maWdDaGFuZ2VkKSB7CiAgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKIAogICBBdWRpb1NwZWNpZmljQ29uZmlnX0luaXQoc2VsZik7CiAKLSAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSA8IDIwKSB7CisgIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhicykgPCAxNikgewogICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOwogICAgIGdvdG8gYmFpbDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICAvKiBEUk0gLSBBdWRpbyBpbmZvcm1hdGlvbiBkYXRhIGVudGl0eSAtIHR5cGUgOQotICAgICAgIC0gU2hvcnQgSWQgICAgICAgICAgICAyIGJpdHMKLSAgICAgICAtIFN0cmVhbSBJZCAgICAgICAgICAgMiBiaXRzCisgICAgICAgLSBTaG9ydCBJZCAgICAgICAgICAgIDIgYml0cyAobm90IHBhcnQgb2YgdGhlIGNvbmZpZyBidWZmZXIpCisgICAgICAgLSBTdHJlYW0gSWQgICAgICAgICAgIDIgYml0cyAobm90IHBhcnQgb2YgdGhlIGNvbmZpZyBidWZmZXIpCiAgICAgICAgLSBhdWRpbyBjb2RpbmcgICAgICAgIDIgYml0cwogICAgICAgIC0gU0JSIGZsYWcgICAgICAgICAgICAxIGJpdAogICAgICAgIC0gYXVkaW8gbW9kZSAgICAgICAgICAyIGJpdHMKQEAgLTE0MTcsNTQgKzI0MjMsNjQgQEAKIAogICAgIGludCBhdWRpb0NvZGluZywgYXVkaW9Nb2RlLCBjU2FtcGxpbmdGcmVxLCBjb2RlckZpZWxkLCBzZklkeCwgc2JyRmxhZzsKIAorICAgIHNlbGYtPmNvbmZpZ01vZGUgPSBjb25maWdNb2RlOworICAgIHNlbGYtPkFhY0NvbmZpZ0NoYW5nZWQgPSBjb25maWdDaGFuZ2VkOworICAgIHNlbGYtPlNickNvbmZpZ0NoYW5nZWQgPSBjb25maWdDaGFuZ2VkOworICAgIHNlbGYtPlNhY0NvbmZpZ0NoYW5nZWQgPSBjb25maWdDaGFuZ2VkOworCiAgICAgLyogUmVhZCB0aGUgU0RDIGZpZWxkICovCi0gICAgRkRLcmVhZEJpdHMoYnMsNCk7ICAgLyogU2hvcnQgYW5kIFN0cmVhbSBJZCAqLworICAgIGF1ZGlvQ29kaW5nID0gRkRLcmVhZEJpdHMoYnMsIDIpOworICAgIHNickZsYWcgPSBGREtyZWFkQml0cyhicywgMSk7CisgICAgYXVkaW9Nb2RlID0gRkRLcmVhZEJpdHMoYnMsIDIpOworICAgIGNTYW1wbGluZ0ZyZXEgPSBGREtyZWFkQml0cyhicywgMyk7IC8qIGF1ZGlvIHNhbXBsaW5nIHJhdGUgKi8KIAotICAgIGF1ZGlvQ29kaW5nICAgPSBGREtyZWFkQml0cyhicywgMik7Ci0gICAgc2JyRmxhZyAgICAgICA9IEZES3JlYWRCaXRzKGJzLCAxKTsKLSAgICBhdWRpb01vZGUgICAgID0gRkRLcmVhZEJpdHMoYnMsIDIpOwotICAgIGNTYW1wbGluZ0ZyZXEgPSBGREtyZWFkQml0cyhicywgMyk7ICAgIC8qIGF1ZGlvIHNhbXBsaW5nIHJhdGUgKi8KLQotICAgIEZES3JlYWRCaXRzKGJzLCAyKTsgIC8qIFRleHQgYW5kIGVuaGFuY2VtZW50IGZsYWcgKi8KLSAgICBjb2RlckZpZWxkICAgPSBGREtyZWFkQml0cyhicywgNSk7Ci0gICAgRkRLcmVhZEJpdHMoYnMsIDEpOyAgLyogcmZhICovCisgICAgRkRLcmVhZEJpdHMoYnMsIDIpOyAvKiBUZXh0IGFuZCBlbmhhbmNlbWVudCBmbGFnICovCisgICAgY29kZXJGaWVsZCA9IEZES3JlYWRCaXRzKGJzLCA1KTsKKyAgICBGREtyZWFkQml0cyhicywgMSk7IC8qIHJmYSAqLwogCiAgICAgLyogRXZhbHVhdGUgY29uZmlndXJhdGlvbiBhbmQgZmlsbCB0aGUgQVNDICovCi0gICAgc3dpdGNoIChjU2FtcGxpbmdGcmVxKSB7Ci0gICAgY2FzZSAwOiAvKiAgOCBrSHogKi8KLSAgICAgIHNmSWR4ID0gMTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6IC8qIDEyIGtIeiAqLwotICAgICAgc2ZJZHggPSA5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOiAvKiAxNiBrSHogKi8KLSAgICAgIHNmSWR4ID0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzogLyogMjQga0h6ICovCi0gICAgICBzZklkeCA9IDY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDU6IC8qIDQ4IGtIeiAqLwotICAgICAgc2ZJZHggPSAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OiAvKiByZXNlcnZlZCAqLwotICAgIGNhc2UgNjogLyogcmVzZXJ2ZWQgKi8KLSAgICBjYXNlIDc6IC8qIHJlc2VydmVkICovCi0gICAgZGVmYXVsdDoKLSAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOwotICAgICAgZ290byBiYWlsOworICAgIGlmIChhdWRpb0NvZGluZyA9PSAzKSB7CisgICAgICBzZklkeCA9IChpbnQpbWFwU3IyTVBFR0lkeFtjU2FtcGxpbmdGcmVxXTsKKyAgICAgIHNickZsYWcgPSAwOyAvKiByZmEgKi8KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChjU2FtcGxpbmdGcmVxKSB7CisgICAgICAgIGNhc2UgMDogLyogIDgga0h6ICovCisgICAgICAgICAgc2ZJZHggPSAxMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvKiAxMiBrSHogKi8KKyAgICAgICAgICBzZklkeCA9IDk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogMTYga0h6ICovCisgICAgICAgICAgc2ZJZHggPSA4OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6IC8qIDI0IGtIeiAqLworICAgICAgICAgIHNmSWR4ID0gNjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OiAvKiA0OCBrSHogKi8KKyAgICAgICAgICBzZklkeCA9IDM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDogLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgY2FzZSA2OiAvKiByZXNlcnZlZCAqLworICAgICAgICBjYXNlIDc6IC8qIHJlc2VydmVkICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgfQogICAgIH0KIAogICAgIHNlbGYtPm1fc2FtcGxpbmdGcmVxdWVuY3lJbmRleCA9IHNmSWR4OwogICAgIHNlbGYtPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBTYW1wbGluZ1JhdGVUYWJsZVtzZklkeF07CiAKLSAgICBpZiAoIHNickZsYWcgKSB7CisgICAgaWYgKHNickZsYWcpIHsKICAgICAgIFVJTlQgaTsKICAgICAgIGludCB0bXAgPSAtMTsKICAgICAgIHNlbGYtPm1fc2JyUHJlc2VudEZsYWcgPSAxOwogICAgICAgc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPSBBT1RfU0JSOwogICAgICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9IHNlbGYtPm1fc2FtcGxpbmdGcmVxdWVuY3kgPDwgMTsKLSAgICAgIGZvciAoaT0wOyBpPChzaXplb2YoU2FtcGxpbmdSYXRlVGFibGUpL3NpemVvZihTYW1wbGluZ1JhdGVUYWJsZVswXSkpOyBpKyspewotICAgICAgICBpZiAoU2FtcGxpbmdSYXRlVGFibGVbaV0gPT0gc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSl7CisgICAgICBmb3IgKGkgPSAwOworICAgICAgICAgICBpIDwgKHNpemVvZihTYW1wbGluZ1JhdGVUYWJsZSkgLyBzaXplb2YoU2FtcGxpbmdSYXRlVGFibGVbMF0pKTsKKyAgICAgICAgICAgaSsrKSB7CisgICAgICAgIGlmIChTYW1wbGluZ1JhdGVUYWJsZVtpXSA9PSBzZWxmLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5KSB7CiAgICAgICAgICAgdG1wID0gaTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTQ3NCwyMCArMjQ5MCwyMyBAQAogCiAgICAgc3dpdGNoIChhdWRpb0NvZGluZykgewogICAgICAgY2FzZSAwOiAvKiBBQUMgKi8KLSAgICAgICAgICBzZWxmLT5tX2FvdCA9IEFPVF9EUk1fQUFDICAgICA7ICAvKiBTZXQgcHNldWRvIEFPVCBmb3IgRHJtIEFBQyAqLwotCisgICAgICAgIGlmICgoY29kZXJGaWVsZCA+PiAyKSAmJiAoYXVkaW9Nb2RlICE9IDEpKSB7CisgICAgICAgICAgc2VsZi0+bV9hb3QgPSBBT1RfRFJNX1NVUlJPVU5EOyAvKiBTZXQgcHNldWRvIEFPVCBmb3IgRHJtIFN1cnJvdW5kICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VsZi0+bV9hb3QgPSBBT1RfRFJNX0FBQzsgLyogU2V0IHBzZXVkbyBBT1QgZm9yIERybSBBQUMgKi8KKyAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKGF1ZGlvTW9kZSkgewotICAgICAgICBjYXNlIDE6IC8qIHBhcmFtZXRyaWMgc3RlcmVvICovCi0gICAgICAgICAgc2VsZi0+bV9wc1ByZXNlbnRGbGFnID0gMTsKLSAgICAgICAgY2FzZSAwOiAvKiBtb25vICovCi0gICAgICAgICAgc2VsZi0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogLyogc3RlcmVvICovCi0gICAgICAgICAgc2VsZi0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IDI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7Ci0gICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIGNhc2UgMTogLyogcGFyYW1ldHJpYyBzdGVyZW8gKi8KKyAgICAgICAgICAgIHNlbGYtPm1fcHNQcmVzZW50RmxhZyA9IDE7CisgICAgICAgICAgY2FzZSAwOiAvKiBtb25vICovCisgICAgICAgICAgICBzZWxmLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjogLyogc3RlcmVvICovCisgICAgICAgICAgICBzZWxmLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgfQogICAgICAgICBzZWxmLT5tX3ZjYjExRmxhZyA9IDE7CiAgICAgICAgIHNlbGYtPm1faGNyRmxhZyA9IDE7CkBAIC0xNTAyLDcgKzI1MjEsMjIgQEAKICAgICAgICAgc2VsZi0+bV9hb3QgPSBBT1RfRVJfSFZYQzsKICAgICAgICAgc2VsZi0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IDE7CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzOiAvKiByZXNlcnZlZCAqLworICAgICAgY2FzZSAzOiAvKiB4SEUtQUFDICovCisgICAgICB7CisgICAgICAgIC8qIHBheWxvYWQgaXMgTVBFRyBjb25mb3JtIC0+IG5vIHBzZXVkbyBEUk0gQU9UIG5lZWRlZCAqLworICAgICAgICBzZWxmLT5tX2FvdCA9IEFPVF9VU0FDOworICAgICAgfQorICAgICAgICBzd2l0Y2ggKGF1ZGlvTW9kZSkgeworICAgICAgICAgIGNhc2UgMDogLyogbW9ubyAqLworICAgICAgICAgIGNhc2UgMjogLyogc3RlcmVvICovCisgICAgICAgICAgICAvKiBjb2RlYyBzcGVjaWZpYyBjb25maWcgOG4gYml0cyAqLworICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBEcm1feEhFQUFDU3RhdGljQ29uZmlnKHNlbGYsIGJzLCBhdWRpb01vZGUsIGNiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOwogICAgICAgICBzZWxmLT5tX2FvdCA9IEFPVF9OT05FOwpAQCAtMTUxOCw0ICsyNTUyLDMgQEAKIGJhaWw6CiAgIHJldHVybiAoRXJyb3JTdGF0dXMpOwogfQotCmRpZmYgLS1naXQgYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2RybS5jcHAgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2RybS5jcHAKaW5kZXggZGYzMTllNS4uMjdjMWMxZCAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19kcm0uY3BwCisrKyBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfZHJtLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyMyArOTAsMjEgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAorCiAgICBEZXNjcmlwdGlvbjogRFJNIHRyYW5zcG9ydCBzdHVmZgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidHBkZWNfZHJtLmgiCiAKLQogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKIAotCi0KLXZvaWQgZHJtUmVhZF9DcmNJbml0KEhBTkRMRV9EUk0gcERybSkgICAgICAvKiE8IHBvaW50ZXIgdG8gZHJtIGNyYyBpbmZvIHN0dWN0dXJlICovCit2b2lkIGRybVJlYWRfQ3JjSW5pdChIQU5ETEVfRFJNIHBEcm0pIC8qITwgcG9pbnRlciB0byBkcm0gY3JjIGluZm8gc3R1Y3R1cmUgKi8KIHsKICAgRkRLX0FTU0VSVChwRHJtICE9IE5VTEwpOwogCkBAIC0xMDMsNDQgKzExMiwzNyBAQAogfQogCiBpbnQgZHJtUmVhZF9DcmNTdGFydFJlZygKLSAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9EUk0gcERybSwgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gZHJtIHN0dWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsICAgLyohPCBoYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgaW50IG1CaXRzICAgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGJpdHMgaW4gY3JjIHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICkKLXsKKyAgICBIQU5ETEVfRFJNIHBEcm0sICAgICAgICAgIC8qITwgcG9pbnRlciB0byBkcm0gc3R1Y3R1cmUgKi8KKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgbUJpdHMgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGJpdHMgaW4gY3JjIHJlZ2lvbiAqLworKSB7CiAgIEZES19BU1NFUlQocERybSAhPSBOVUxMKTsKIAogICBGREtjcmNSZXNldCgmcERybS0+Y3JjSW5mbyk7CiAKICAgcERybS0+Y3JjUmVhZFZhbHVlID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKIAotICByZXR1cm4gKCBGREtjcmNTdGFydFJlZygmcERybS0+Y3JjSW5mbywgaEJzLCBtQml0cykgKTsKLQorICByZXR1cm4gKEZES2NyY1N0YXJ0UmVnKCZwRHJtLT5jcmNJbmZvLCBoQnMsIG1CaXRzKSk7CiB9CiAKIHZvaWQgZHJtUmVhZF9DcmNFbmRSZWcoCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9EUk0gcERybSwgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGRybSBjcmMgaW5mbyBzdHVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsICAgIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgaW50IHJlZyAgICAgICAgICAgICAgICAgICAgICAvKiE8IGNyYyByZWdpb24gKi8KLSAgICAgICAgICAgICAgICAgICkKLXsKKyAgICBIQU5ETEVfRFJNIHBEcm0sICAgICAgICAgIC8qITwgcG9pbnRlciB0byBkcm0gY3JjIGluZm8gc3R1Y3R1cmUgKi8KKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgcmVnICAgICAgICAgICAgICAgICAgIC8qITwgY3JjIHJlZ2lvbiAqLworKSB7CiAgIEZES19BU1NFUlQocERybSAhPSBOVUxMKTsKIAogICBGREtjcmNFbmRSZWcoJnBEcm0tPmNyY0luZm8sIGhCcywgcmVnKTsKIH0KIAotVFJBTlNQT1JUREVDX0VSUk9SIGRybVJlYWRfQ3JjQ2hlY2soIEhBTkRMRV9EUk0gcERybSApCi17CitUUkFOU1BPUlRERUNfRVJST1IgZHJtUmVhZF9DcmNDaGVjayhIQU5ETEVfRFJNIHBEcm0pIHsKICAgVFJBTlNQT1JUREVDX0VSUk9SIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX09LOwogICBVU0hPUlQgY3JjOwogCiAgIGNyYyA9IEZES2NyY0dldENSQygmcERybS0+Y3JjSW5mbykgXiAweEZGOwotICBpZiAoY3JjICE9IHBEcm0tPmNyY1JlYWRWYWx1ZSkKLSAgeworICBpZiAoY3JjICE9IHBEcm0tPmNyY1JlYWRWYWx1ZSkgewogICAgIHJldHVybiAoVFJBTlNQT1JUREVDX0NSQ19FUlJPUik7CiAgIH0KIAogICByZXR1cm4gKEVycm9yU3RhdHVzKTsKIH0KLQotCmRpZmYgLS1naXQgYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2RybS5oIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19kcm0uaAppbmRleCAyMTYxYjRjLi4wOTgyMmRjIDEwMDY0NAotLS0gYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2RybS5oCisrKyBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfZHJtLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjcgKzkwLDI2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBEUk0gaW50ZXJmYWNlCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgVFBERUNfRFJNX0gKICNkZWZpbmUgVFBERUNfRFJNX0gKIAogI2luY2x1ZGUgInRwZGVjX2xpYi5oIgogCi0KICNpbmNsdWRlICJGREtfY3JjLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKLQotICBGREtfQ1JDSU5GTyBjcmNJbmZvOyAgICAgICAgICAgICAvKiBDUkMgc3RhdGUgaW5mbyAqLwotICBVU0hPUlQgICAgICBjcmNSZWFkVmFsdWU7ICAgICAgICAvKiBDUkMgdmFsdWUgcmVhZCBmcm9tIGJpdHN0cmVhbSBkYXRhICovCisgIEZES19DUkNJTkZPIGNyY0luZm87IC8qIENSQyBzdGF0ZSBpbmZvICovCisgIFVTSE9SVCBjcmNSZWFkVmFsdWU7IC8qIENSQyB2YWx1ZSByZWFkIGZyb20gYml0c3RyZWFtIGRhdGEgKi8KIAogfSBTVFJVQ1RfRFJNOwogCkBAIC0xMTIsMTUgKzEyMiwxNCBAQAogCiAgIFxyZXR1cm4gIG5vbmUKICovCi12b2lkIGRybVJlYWRfQ3JjSW5pdCggSEFORExFX0RSTSBwRHJtICk7Cit2b2lkIGRybVJlYWRfQ3JjSW5pdChIQU5ETEVfRFJNIHBEcm0pOwogCiAvKioKICAqIFxicmllZiBTdGFydHMgQ1JDIHJlZ2lvbiB3aXRoIGEgbWF4aW11bSBudW1iZXIgb2YgYml0cwotICogICAgICAgIElmIG1CaXRzIGlzIHBvc2l0aXZlIHplcm8gcGFkZGluZyB3aWxsIGJlIHVzZWQgZm9yIENSQyBjYWxjdWxhdGlvbiwgaWYgdGhlcmUKLSAqICAgICAgICBhcmUgbGVzcyB0aGFuIG1CaXRzIGJpdHMgYXZhaWxhYmxlLgotICogICAgICAgIElmIG1CaXRzIGlzIG5lZ2F0aXZlIG5vIHplcm8gcGFkZGluZyBpcyBkb25lLgotICogICAgICAgIElmIG1CaXRzIGlzIHplcm8gdGhlIG1lbW9yeSBmb3IgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgZHluYW1pY2FsbHksIHRoZQotICogICAgICAgIG51bWJlciBvZiBiaXRzIGlzIG5vdCBsaW1pdGVkLgorICogICAgICAgIElmIG1CaXRzIGlzIHBvc2l0aXZlIHplcm8gcGFkZGluZyB3aWxsIGJlIHVzZWQgZm9yIENSQyBjYWxjdWxhdGlvbiwgaWYKKyAqIHRoZXJlIGFyZSBsZXNzIHRoYW4gbUJpdHMgYml0cyBhdmFpbGFibGUuIElmIG1CaXRzIGlzIG5lZ2F0aXZlIG5vIHplcm8KKyAqIHBhZGRpbmcgaXMgZG9uZS4gSWYgbUJpdHMgaXMgemVybyB0aGUgbWVtb3J5IGZvciB0aGUgYnVmZmVyIGlzCisgKiBhbGxvY2F0ZWQgZHluYW1pY2FsbHksIHRoZSBudW1iZXIgb2YgYml0cyBpcyBub3QgbGltaXRlZC4KICAqCiAgKiBccGFyYW0gcERybSBEUk0gZGF0YSBoYW5kbGUKICAqIFxwYXJhbSBoQnMgYml0c3RyZWFtIGhhbmRsZSwgb24gd2hpY2ggdGhlIENSQyByZWdpb24gcmVmZXJlcyB0bwpAQCAtMTI4LDExICsxMzcsNyBAQAogICoKICAqIFxyZXR1cm4gIElEIGZvciB0aGUgY3JlYXRlZCByZWdpb24sIC0xIGluIGNhc2Ugb2YgYW4gZXJyb3IKICAqLwotaW50IGRybVJlYWRfQ3JjU3RhcnRSZWcoCi0gICAgICAgIEhBTkRMRV9EUk0gcERybSwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICBpbnQgbUJpdHMKLSAgICAgICAgKTsKK2ludCBkcm1SZWFkX0NyY1N0YXJ0UmVnKEhBTkRMRV9EUk0gcERybSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBpbnQgbUJpdHMpOwogCiAvKioKICAqIFxicmllZiBFbmRzIENSQyByZWdpb24gaWRlbnRpZmllZCBieSByZWcKQEAgLTE0Myw1MiArMTQ4LDU1IEBACiAgKgogICogXHJldHVybiAgbm9uZQogICovCi12b2lkIGRybVJlYWRfQ3JjRW5kUmVnKAotICAgICAgICBIQU5ETEVfRFJNIHBEcm0sCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgaW50IHJlZwotICAgICAgICApOwordm9pZCBkcm1SZWFkX0NyY0VuZFJlZyhIQU5ETEVfRFJNIHBEcm0sIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IHJlZyk7CiAKIC8qKgogICogXGJyaWVmIENoZWNrIENSQwogICoKLSAqIENoZWNrcyBpZiB0aGUgY3VycmVudGx5IGNhbGN1bGF0ZWQgQ1JDIG1hdGNoZXMgdGhlIENSQyBmaWVsZCByZWFkIGZyb20gdGhlIGJpdHN0cmVhbQotICogRGVsZXRlcyBhbGwgQ1JDIHJlZ2lvbnMuCisgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnRseSBjYWxjdWxhdGVkIENSQyBtYXRjaGVzIHRoZSBDUkMgZmllbGQgcmVhZCBmcm9tIHRoZQorICogYml0c3RyZWFtIERlbGV0ZXMgYWxsIENSQyByZWdpb25zLgogICoKICAqIFxwYXJhbSBwRHJtIERSTSBkYXRhIGhhbmRsZQogICoKICAqIFxyZXR1cm4gUmV0dXJucyAwIGlmIHRoZXkgYXJlIGlkZW50aWNhbCBvdGhlcndpc2UgMQogICovCi1UUkFOU1BPUlRERUNfRVJST1IgZHJtUmVhZF9DcmNDaGVjayggSEFORExFX0RSTSBwRHJtICk7CitUUkFOU1BPUlRERUNfRVJST1IgZHJtUmVhZF9DcmNDaGVjayhIQU5ETEVfRFJNIHBEcm0pOwogCiAvKioKICAqIFxicmllZiBDaGVjayBpZiB3ZSBoYXZlIGEgdmFsaWQgRFJNIGZyYW1lIGF0IHRoZSBjdXJyZW50IGJpdGJ1ZmZlciBwb3NpdGlvbgogICoKICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyBlbm91Z2ggYml0cyBpbiBidWZmZXIgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgogICogSXQgcmVhZHMgb3V0IHRoZSBoZWFkZXIgYml0cyB0byBwcmVwYXJlIHRoZSBiaXRidWZmZXIgZm9yIHRoZSBkZWNvZGUgbG9vcC4KLSAqIEluIGNhc2UgdGhlIGhlYWRlciBiaXRzIHNob3cgYW4gaW52YWxpZCBiaXRzdHJlYW0vZnJhbWUsIHRoZSB3aG9sZSBmcmFtZSBpcyBza2lwcGVkLgorICogSW4gY2FzZSB0aGUgaGVhZGVyIGJpdHMgc2hvdyBhbiBpbnZhbGlkIGJpdHN0cmVhbS9mcmFtZSwgdGhlIHdob2xlIGZyYW1lIGlzCisgKiBza2lwcGVkLgogICoKICAqIFxwYXJhbSBwRHJtIERSTSBkYXRhIGhhbmRsZSB3aGljaCBpcyBmaWxsZWQgd2l0aCBwYXJzZWQgRFJNIGhlYWRlciBkYXRhCiAgKiBccGFyYW0gYnMgaGFuZGxlIG9mIGJpdHN0cmVhbSBmcm9tIHdob20gdGhlIERSTSBoZWFkZXIgaXMgcmVhZAogICoKICAqIFxyZXR1cm4gIGVycm9yIHN0YXR1cwogICovCi1UUkFOU1BPUlRERUNfRVJST1IgZHJtUmVhZF9EZWNvZGVIZWFkZXIoCi0gICAgICAgIEhBTkRMRV9EUk0gICAgICAgICAgICBwRHJtLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMKLSAgICAgICAgKTsKK1RSQU5TUE9SVERFQ19FUlJPUiBkcm1SZWFkX0RlY29kZUhlYWRlcihIQU5ETEVfRFJNIHBEcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpOwogCiAvKioKICAqIFxicmllZiAgIFBhcnNlIGEgRHJtIHNwZWNpZmljIFNEQyBhdWRpbyBjb25maWcgZnJvbSBhIGdpdmVuIGJpdHN0cmVhbSBoYW5kbGUuCiAgKgotICogXHBhcmFtIHBBc2MgICAgICAgICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgc3RydWN0LgorICogXHBhcmFtIHBBc2MgICAgICAgICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZAorICogQ1NBdWRpb1NwZWNpZmljQ29uZmlnIHN0cnVjdC4KICAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbSBoYW5kbGUuCisgKiBccGFyYW0gY2IgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gc3RydWN0dXJlIGhvbGRpbmcgY2FsbGJhY2sKKyAqIGluZm9ybWF0aW9uIE5vdGU6IEEgTlVMTCBwb2ludGVyIGZvciBjYiBjYW4gYmUgdXNlZCB0byBzaWduYWwgYSAiQ2hlY2sgQ29uZmlnCisgKiBvbmx5IGZ1bmN0aW9uYWxpdHkiCisgKiBccGFyYW0gY29uZmlnTW9kZSAgICAgICAgICAgICAgICAgICBDb25maWcgbW9kZXM6IG1lbW9yeSBhbGxvY2F0aW9uIG1vZGUgb3IKKyAqIGNvbmZpZyBjaGFuZ2UgZGV0ZWN0aW9uIG1vZGUKKyAqIFxwYXJhbSBjb25maWdDaGFuZ2VkICAgICAgICAgICAgICAgIEluZGljYXRlcyBhIGNvbmZpZyBjaGFuZ2UKICAqCiAgKiBccmV0dXJuICBUb3RhbCBlbGVtZW50IGNvdW50IGluY2x1ZGluZyBhbGwgU0NFLCBDUEUgYW5kIExGRS4KICAqLwotVFJBTlNQT1JUREVDX0VSUk9SIERybVJhd1NkY0F1ZGlvQ29uZmlnX1BhcnNlKCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyApOwotCi0KK1RSQU5TUE9SVERFQ19FUlJPUiBEcm1SYXdTZGNBdWRpb0NvbmZpZ19QYXJzZShDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTVHBDYWxsQmFja3MgKmNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY29uZmlnQ2hhbmdlZCk7CiAKICNlbmRpZiAvKiBUUERFQ19EUk1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19sYXRtLmNwcCBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGF0bS5jcHAKaW5kZXggNTcxMGQ3Ny4uMmVkZjA1NSAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19sYXRtLmNwcAorKysgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2xhdG0uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDkxICs5MCwxNTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBEYW5pZWwgSG9tbQorCiAgICBEZXNjcmlwdGlvbjoKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInRwZGVjX2xhdG0uaCIKIAotCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCisjZGVmaW5lIFRQREVDX1RSQUNLSU5ERVgocCwgbCkgKDEgKiAocCkgKyAobCkpCiAKLSNkZWZpbmUgVFBERUNfVFJBQ0tJTkRFWChwLGwpICgyKihwKSArIChsKSkKLQotc3RhdGljCi1VSU5UIENMYXRtRGVtdXhfR2V0VmFsdWUoSEFORExFX0ZES19CSVRTVFJFQU0gYnMpCi17CitzdGF0aWMgVUlOVCBDTGF0bURlbXV4X0dldFZhbHVlKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CiAgIFVDSEFSIGJ5dGVzRm9yVmFsdWUgPSAwLCB0bXAgPSAwOwogICBpbnQgdmFsdWUgPSAwOwogCi0gIGJ5dGVzRm9yVmFsdWUgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDIpOworICBieXRlc0ZvclZhbHVlID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAyKTsKIAotICBmb3IgKFVJTlQgaT0wOyBpPD1ieXRlc0ZvclZhbHVlOyBpKyspIHsKKyAgZm9yIChVSU5UIGkgPSAwOyBpIDw9IGJ5dGVzRm9yVmFsdWU7IGkrKykgewogICAgIHZhbHVlIDw8PSA4OwotICAgIHRtcCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsOCk7CisgICAgdG1wID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA4KTsKICAgICB2YWx1ZSArPSB0bXA7CiAgIH0KIAogICByZXR1cm4gdmFsdWU7CiB9CiAKLQotc3RhdGljCi1UUkFOU1BPUlRERUNfRVJST1IgQ0xhdG1EZW11eF9SZWFkQXVkaW9NdXhFbGVtZW50KAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgQ0xhdG1EZW11eCAqcExhdG1EZW11eCwKLSAgICAgICAgaW50IG1fbXV4Q29uZmlnUHJlc2VudCwKLSAgICAgICAgQ1NUcENhbGxCYWNrcyAqcFRwRGVjQ2FsbGJhY2tzLAotICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCi0gICAgICAgIGludCAqcGZDb25maWdGb3VuZAotICAgICAgICApCi17CitzdGF0aWMgVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZEF1ZGlvTXV4RWxlbWVudCgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0xhdG1EZW11eCAqcExhdG1EZW11eCwgaW50IG1fbXV4Q29uZmlnUHJlc2VudCwKKyAgICBDU1RwQ2FsbEJhY2tzICpwVHBEZWNDYWxsYmFja3MsIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKKyAgICBpbnQgKnBmQ29uZmlnRm91bmQpIHsKICAgVFJBTlNQT1JUREVDX0VSUk9SIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX09LOwogCiAgIGlmIChtX211eENvbmZpZ1ByZXNlbnQpIHsKLSAgICBwTGF0bURlbXV4LT5tX3VzZVNhbWVTdHJlYW1NdXggPSBGREtyZWFkQml0cyhicywxKTsKKyAgICBwTGF0bURlbXV4LT5tX3VzZVNhbWVTdHJlYW1NdXggPSBGREtyZWFkQml0cyhicywgMSk7CiAKICAgICBpZiAoIXBMYXRtRGVtdXgtPm1fdXNlU2FtZVN0cmVhbU11eCkgewotICAgICAgaWYgKChFcnJvclN0YXR1cyA9IENMYXRtRGVtdXhfUmVhZFN0cmVhbU11eENvbmZpZyhicywgcExhdG1EZW11eCwgcFRwRGVjQ2FsbGJhY2tzLCBwQXNjLCBwZkNvbmZpZ0ZvdW5kKSkpIHsKLSAgICAgICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CisgICAgICBpbnQgaTsKKyAgICAgIFVDSEFSIGNvbmZpZ0NoYW5nZWQgPSAwOworICAgICAgVUNIQVIgY29uZmlnTW9kZSA9IDA7CisKKyAgICAgIEZES19CSVRTVFJFQU0gYnNBbmNob3I7CisKKyAgICAgIEZES19CSVRTVFJFQU0gYnNBbmNob3JEdW1teVBhcnNlOworCisgICAgICBpZiAoIXBMYXRtRGVtdXgtPmFwcGx5QXNjKSB7CisgICAgICAgIGJzQW5jaG9yRHVtbXlQYXJzZSA9ICpiczsKKyAgICAgICAgcExhdG1EZW11eC0+bmV3Q2ZnSGFzQXVkaW9QcmVSb2xsID0gMDsKKyAgICAgICAgLyogZG8gZHVtbXktcGFyc2luZyBvZiBBU0MgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGFuIGF1ZGlvUHJlUm9sbCAqLworICAgICAgICBjb25maWdNb2RlIHw9IEFDX0NNX0RFVF9DRkdfQ0hBTkdFOworICAgICAgICBpZiAoVFJBTlNQT1JUREVDX09LICE9CisgICAgICAgICAgICAoRXJyb3JTdGF0dXMgPSBDTGF0bURlbXV4X1JlYWRTdHJlYW1NdXhDb25maWcoCisgICAgICAgICAgICAgICAgIGJzLCBwTGF0bURlbXV4LCBwVHBEZWNDYWxsYmFja3MsIHBBc2MsIHBmQ29uZmlnRm91bmQsCisgICAgICAgICAgICAgICAgIGNvbmZpZ01vZGUsIGNvbmZpZ0NoYW5nZWQpKSkgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFsbG93IGZsdXNoaW5nIG9ubHkgd2hlbiBhdWRpb1ByZXJvbGwgZnVuY3Rpb25hbGl0eSBpcyBlbmFibGVkIGluCisgICAgICAgICAqIGN1cnJlbnQgYW5kIG5ldyBjb25maWcgb3RoZXJ3aXNlIHRoZSBuZXcgY29uZmlnIGNhbiBiZSBhcHBsaWVkCisgICAgICAgICAqIGltbWVkaWF0ZWx5LiAqLworICAgICAgICBpZiAocEFzYy0+bV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFswXQorICAgICAgICAgICAgICAgIC5leHRFbGVtZW50LnVzYWNFeHRFbGVtZW50SGFzQXVkaW9QcmVSb2xsICYmCisgICAgICAgICAgICBwTGF0bURlbXV4LT5uZXdDZmdIYXNBdWRpb1ByZVJvbGwpIHsKKyAgICAgICAgICBwTGF0bURlbXV4LT5uZXdDZmdIYXNBdWRpb1ByZVJvbGwgPSAwOworICAgICAgICAgIC8qIHdpdGggYXVkaW9QcmVSb2xsIHdlIG11c3QgZmx1c2ggYmVmb3JlIGFwcGx5aW5nIG5ldyBjZmcgKi8KKyAgICAgICAgICBwTGF0bURlbXV4LT5hcHBseUFzYyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmJzID0gYnNBbmNob3JEdW1teVBhcnNlOworICAgICAgICAgIHBMYXRtRGVtdXgtPmFwcGx5QXNjID0gMTsgLyogYXBwbHkgbmV3IGNvbmZpZyBpbW1lZGlhdGUgKi8KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAocExhdG1EZW11eC0+YXBwbHlBc2MpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgIGNvbmZpZ01vZGUgPSAwOworCisgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgY29uZmlnTW9kZSB8PSBBQ19DTV9ERVRfQ0ZHX0NIQU5HRTsKKyAgICAgICAgICAgIGJzQW5jaG9yID0gKmJzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWdNb2RlIHw9IEFDX0NNX0FMTE9DX01FTTsKKyAgICAgICAgICAgICpicyA9IGJzQW5jaG9yOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChUUkFOU1BPUlRERUNfT0sgIT0KKyAgICAgICAgICAgICAgKEVycm9yU3RhdHVzID0gQ0xhdG1EZW11eF9SZWFkU3RyZWFtTXV4Q29uZmlnKAorICAgICAgICAgICAgICAgICAgIGJzLCBwTGF0bURlbXV4LCBwVHBEZWNDYWxsYmFja3MsIHBBc2MsIHBmQ29uZmlnRm91bmQsCisgICAgICAgICAgICAgICAgICAgY29uZmlnTW9kZSwgY29uZmlnQ2hhbmdlZCkpKSB7CisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKEVycm9yU3RhdHVzID09IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICAgICAgaWYgKChpID09IDApICYmIChwQXNjLT5BYWNDb25maWdDaGFuZ2VkIHx8IHBBc2MtPlNickNvbmZpZ0NoYW5nZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFzYy0+U2FjQ29uZmlnQ2hhbmdlZCkpIHsKKyAgICAgICAgICAgICAgaW50IGVyckM7CisKKyAgICAgICAgICAgICAgY29uZmlnQ2hhbmdlZCA9IDE7CisgICAgICAgICAgICAgIGVyckMgPSBwVHBEZWNDYWxsYmFja3MtPmNiRnJlZU1lbShwVHBEZWNDYWxsYmFja3MtPmNiRnJlZU1lbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNjKTsKKyAgICAgICAgICAgICAgaWYgKGVyckMgIT0gMCkgeworICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCi0gIC8qIElmIHRoZXJlIHdhcyBubyBjb25maWd1cmF0aW9uIHJlYWQsIGl0cyBub3QgcG9zc2libGUgdG8gcGFyc2UgUGF5bG9hZExlbmd0aEluZm8gYmVsb3cuICovCi0gIGlmICghICpwZkNvbmZpZ0ZvdW5kKSB7Ci0gICAgcmV0dXJuIFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOworICAvKiBJZiB0aGVyZSB3YXMgbm8gY29uZmlndXJhdGlvbiByZWFkLCBpdHMgbm90IHBvc3NpYmxlIHRvIHBhcnNlCisgICAqIFBheWxvYWRMZW5ndGhJbmZvIGJlbG93LiAqLworICBpZiAoISpwZkNvbmZpZ0ZvdW5kKSB7CisgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUjsKKyAgICBnb3RvIGJhaWw7CiAgIH0KIAogICBpZiAocExhdG1EZW11eC0+bV9BdWRpb011eFZlcnNpb25BID09IDApIHsKICAgICAvKiBEbyBvbmx5IG9uY2UgcGVyIGNhbGwsIGJlY2F1c2UgcGFyc2luZyBhbmQgZGVjb2RpbmcgaXMgZG9uZSBpbi1saW5lLiAqLwotICAgIGlmICgoRXJyb3JTdGF0dXMgPSBDTGF0bURlbXV4X1JlYWRQYXlsb2FkTGVuZ3RoSW5mbyhicyxwTGF0bURlbXV4KSkpIHsKLSAgICAgIHJldHVybiAoRXJyb3JTdGF0dXMpOworICAgIGlmIChUUkFOU1BPUlRERUNfT0sgIT0KKyAgICAgICAgKEVycm9yU3RhdHVzID0gQ0xhdG1EZW11eF9SZWFkUGF5bG9hZExlbmd0aEluZm8oYnMsIHBMYXRtRGVtdXgpKSkgeworICAgICAgKnBmQ29uZmlnRm91bmQgPSAwOworICAgICAgZ290byBiYWlsOwogICAgIH0KICAgfSBlbHNlIHsKICAgICAvKiBhdWRpb011eFZlcnNpb25BID4gMCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgKi8KICAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgKnBmQ29uZmlnRm91bmQgPSAwOworICAgIGdvdG8gYmFpbDsKKyAgfQorCitiYWlsOgorICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgcExhdG1EZW11eC0+YXBwbHlBc2MgPSAxOwogICB9CiAKICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CiB9CiAKLVRSQU5TUE9SVERFQ19FUlJPUiBDTGF0bURlbXV4X1JlYWQoCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICBDTGF0bURlbXV4ICpwTGF0bURlbXV4LAotICAgICAgICBUUkFOU1BPUlRfVFlQRSB0dCwKLSAgICAgICAgQ1NUcENhbGxCYWNrcyAqcFRwRGVjQ2FsbGJhY2tzLAotICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCi0gICAgICAgIGludCAqcGZDb25maWdGb3VuZCwKLSAgICAgICAgY29uc3QgSU5UIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzCi0gICAgICAgICkKLXsKK1RSQU5TUE9SVERFQ19FUlJPUiBDTGF0bURlbXV4X1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMYXRtRGVtdXggKnBMYXRtRGVtdXgsIFRSQU5TUE9SVF9UWVBFIHR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1RwQ2FsbEJhY2tzICpwVHBEZWNDYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwZkNvbmZpZ0ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaWdub3JlQnVmZmVyRnVsbG5lc3MpIHsKICAgVUlOVCBjbnRCaXRzOwogICBVSU5UIGNtcEJ1ZmZlckZ1bGxuZXNzOwogICBVSU5UIGF1ZGlvTXV4TGVuZ3RoQnl0ZXNMYXN0ID0gMDsKQEAgLTE3NSwyOSArMjUwLDI3IEBACiAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM7CiAgIH0KIAotICBpZiAoKEVycm9yU3RhdHVzID0gQ0xhdG1EZW11eF9SZWFkQXVkaW9NdXhFbGVtZW50KGJzLCBwTGF0bURlbXV4LCAodHQgIT0gVFRfTVA0X0xBVE1fTUNQMCksIHBUcERlY0NhbGxiYWNrcywgcEFzYywgcGZDb25maWdGb3VuZCkpKQorICBpZiAoVFJBTlNQT1JUREVDX09LICE9IChFcnJvclN0YXR1cyA9IENMYXRtRGVtdXhfUmVhZEF1ZGlvTXV4RWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzLCBwTGF0bURlbXV4LCAodHQgIT0gVFRfTVA0X0xBVE1fTUNQMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHBEZWNDYWxsYmFja3MsIHBBc2MsIHBmQ29uZmlnRm91bmQpKSkKICAgICByZXR1cm4gKEVycm9yU3RhdHVzKTsKIAotICBpZiAoIWlnbm9yZUJ1ZmZlckZ1bGxuZXNzKQotICB7Ci0gICAgY21wQnVmZmVyRnVsbG5lc3MgPSAgIDI0K2F1ZGlvTXV4TGVuZ3RoQnl0ZXNMYXN0KjgKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcExhdG1EZW11eC0+bV9saW5mb1swXVswXS5tX2J1ZmZlckZ1bGxuZXNzKiBwQXNjW1RQREVDX1RSQUNLSU5ERVgoMCwwKV0ubV9jaGFubmVsQ29uZmlndXJhdGlvbiozMjsKKyAgaWYgKCFpZ25vcmVCdWZmZXJGdWxsbmVzcykgeworICAgIGNtcEJ1ZmZlckZ1bGxuZXNzID0KKyAgICAgICAgMjQgKyBhdWRpb011eExlbmd0aEJ5dGVzTGFzdCAqIDggKworICAgICAgICBwTGF0bURlbXV4LT5tX2xpbmZvWzBdWzBdLm1fYnVmZmVyRnVsbG5lc3MgKgorICAgICAgICAgICAgcEFzY1tUUERFQ19UUkFDS0lOREVYKDAsIDApXS5tX2NoYW5uZWxDb25maWd1cmF0aW9uICogMzI7CiAKICAgICAvKiBldmFsdWF0ZSBidWZmZXIgZnVsbG5lc3MgKi8KIAotICAgIGlmIChwTGF0bURlbXV4LT5tX2xpbmZvWzBdWzBdLm1fYnVmZmVyRnVsbG5lc3MgIT0gMHhGRikKLSAgICB7Ci0gICAgICBpZiAoIXBMYXRtRGVtdXgtPkJ1ZmZlckZ1bGxuZXNzQWNoaWV2ZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChjbnRCaXRzIDwgY21wQnVmZmVyRnVsbG5lc3MpCi0gICAgICAgIHsKKyAgICBpZiAocExhdG1EZW11eC0+bV9saW5mb1swXVswXS5tX2J1ZmZlckZ1bGxuZXNzICE9IDB4RkYpIHsKKyAgICAgIGlmICghcExhdG1EZW11eC0+QnVmZmVyRnVsbG5lc3NBY2hpZXZlZCkgeworICAgICAgICBpZiAoY250Qml0cyA8IGNtcEJ1ZmZlckZ1bGxuZXNzKSB7CiAgICAgICAgICAgLyogY29uZGl0aW9uIGZvciBzdGFydCBvZiBkZWNvZGluZyBpcyBub3QgZnVsZmlsbGVkICovCiAKICAgICAgICAgICAvKiB0aGUgY3VycmVudCBmcmFtZSB3aWxsIG5vdCBiZSBkZWNvZGVkICovCiAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgcExhdG1EZW11eC0+QnVmZmVyRnVsbG5lc3NBY2hpZXZlZCA9IDE7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTIwNywyMjcgKzI4MCwzOTcgQEAKICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CiB9CiAKLQogVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZFN0cmVhbU11eENvbmZpZygKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgIENMYXRtRGVtdXggKnBMYXRtRGVtdXgsCi0gICAgICAgIENTVHBDYWxsQmFja3MgKnBUcERlY0NhbGxiYWNrcywKLSAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAotICAgICAgICBpbnQgKiBwZkNvbmZpZ0ZvdW5kCi0gICAgICAgICkKLXsKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0xhdG1EZW11eCAqcExhdG1EZW11eCwKKyAgICBDU1RwQ2FsbEJhY2tzICpwVHBEZWNDYWxsYmFja3MsIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKKyAgICBpbnQgKnBmQ29uZmlnRm91bmQsIFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSIGNvbmZpZ0NoYW5nZWQpIHsKKyAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnIGFzY0R1bW15OyAvKiB0aGUgYWN0dWFsIGNvbmZpZyBpcyBuZWVkZWQgZm9yIGZsdXNoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoYXQgbmV3IGNvbmZpZyBjYW4gYmUgcGFyc2VkICovCisgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzY0R1bW15OworICBwQXNjRHVtbXkgPSAmYXNjRHVtbXk7CisgIHBMYXRtRGVtdXgtPnVzYWNFeHBsaWNpdENmZ0NoYW5nZWQgPSAwOwogICBMQVRNX0xBWUVSX0lORk8gKnBfbGluZm8gPSBOVUxMOwogICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CisgIFVDSEFSIHVwZGF0ZUNvbmZpZ1sxICogMV0gPSB7MH07CiAKLSAgcExhdG1EZW11eC0+bV9BdWRpb011eFZlcnNpb24gPSBGREtyZWFkQml0cyhicywxKTsKKyAgcExhdG1EZW11eC0+bV9BdWRpb011eFZlcnNpb24gPSBGREtyZWFkQml0cyhicywgMSk7CiAKICAgaWYgKHBMYXRtRGVtdXgtPm1fQXVkaW9NdXhWZXJzaW9uID09IDApIHsKICAgICBwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbkEgPSAwOwogICB9IGVsc2UgewotICAgIHBMYXRtRGVtdXgtPm1fQXVkaW9NdXhWZXJzaW9uQSA9IEZES3JlYWRCaXRzKGJzLDEpOworICAgIHBMYXRtRGVtdXgtPm1fQXVkaW9NdXhWZXJzaW9uQSA9IEZES3JlYWRCaXRzKGJzLCAxKTsKICAgfQogCiAgIGlmIChwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbkEgPT0gMCkgewogICAgIGlmIChwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbiA9PSAxKSB7CiAgICAgICBwTGF0bURlbXV4LT5tX3RhcmFCdWZmZXJGdWxsbmVzcyA9IENMYXRtRGVtdXhfR2V0VmFsdWUoYnMpOwogICAgIH0KLSAgICBwTGF0bURlbXV4LT5tX2FsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgPSBGREtyZWFkQml0cyhicywxKTsKLSAgICBwTGF0bURlbXV4LT5tX25vU3ViRnJhbWVzID0gRkRLcmVhZEJpdHMoYnMsNikgKyAxOwotICAgIHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbSAgPSBGREtyZWFkQml0cyhicyw0KSArIDE7CisgICAgcExhdG1EZW11eC0+bV9hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nID0gRkRLcmVhZEJpdHMoYnMsIDEpOworICAgIHBMYXRtRGVtdXgtPm1fbm9TdWJGcmFtZXMgPSBGREtyZWFkQml0cyhicywgNikgKyAxOworICAgIHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbSA9IEZES3JlYWRCaXRzKGJzLCA0KSArIDE7CiAKLSAgICBpZiAocExhdG1EZW11eC0+bV9udW1Qcm9ncmFtID4gMSkgewotICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgaWYgKHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbSA+IExBVE1fTUFYX1BST0cpIHsKKyAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgIGdvdG8gYmFpbDsKICAgICB9CiAKICAgICBpbnQgaWRDbnQgPSAwOwogICAgIGZvciAoVUlOVCBwcm9nID0gMDsgcHJvZyA8IHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbTsgcHJvZysrKSB7Ci0gICAgICBwTGF0bURlbXV4LT5tX251bUxheWVyID0gRkRLcmVhZEJpdHMoYnMsMykgKyAxOwotICAgICAgaWYgKHBMYXRtRGVtdXgtPm1fbnVtTGF5ZXIgPiAyKSB7Ci0gICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgcExhdG1EZW11eC0+bV9udW1MYXllcltwcm9nXSA9IEZES3JlYWRCaXRzKGJzLCAzKSArIDE7CisgICAgICBpZiAocExhdG1EZW11eC0+bV9udW1MYXllcltwcm9nXSA+IExBVE1fTUFYX0xBWUVSKSB7CisgICAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgICAgZ290byBiYWlsOwogICAgICAgfQogCi0gICAgICBmb3IgKFVJTlQgbGF5ID0gMDsgbGF5IDwgcExhdG1EZW11eC0+bV9udW1MYXllcjsgbGF5KyspIHsKKyAgICAgIGZvciAoVUlOVCBsYXkgPSAwOyBsYXkgPCBwTGF0bURlbXV4LT5tX251bUxheWVyW3Byb2ddOyBsYXkrKykgeworICAgICAgICBpbnQgdXNlU2FtZUNvbmZpZzsKICAgICAgICAgcF9saW5mbyA9ICZwTGF0bURlbXV4LT5tX2xpbmZvW3Byb2ddW2xheV07CiAKICAgICAgICAgcF9saW5mby0+bV9zdHJlYW1JRCA9IGlkQ250Kys7CiAgICAgICAgIHBfbGluZm8tPm1fZnJhbWVMZW5ndGhJbkJpdHMgPSAwOwogCi0gICAgICAgIGlmKCAocHJvZyA9PSAwKSAmJiAobGF5ID09IDApICkgewotICAgICAgICAgIHBMYXRtRGVtdXgtPm1fdXNlU2FtZUNvbmZpZyA9IDA7CisgICAgICAgIGlmICgocHJvZyA9PSAwKSAmJiAobGF5ID09IDApKSB7CisgICAgICAgICAgdXNlU2FtZUNvbmZpZyA9IDA7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcExhdG1EZW11eC0+bV91c2VTYW1lQ29uZmlnID0gRkRLcmVhZEJpdHMoYnMsMSk7CisgICAgICAgICAgdXNlU2FtZUNvbmZpZyA9IEZES3JlYWRCaXRzKGJzLCAxKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChwTGF0bURlbXV4LT5tX3VzZVNhbWVDb25maWcpIHsKLSAgICAgICAgICBpZiAobGF5ID4gMSkgewotICAgICAgICAgICAgRkRLbWVtY3B5KCZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZyxsYXkpXSwgJnBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLGxheS0xKV0sIHNpemVvZihDU0F1ZGlvU3BlY2lmaWNDb25maWcpKTsKKyAgICAgICAgaWYgKHVzZVNhbWVDb25maWcpIHsKKyAgICAgICAgICBpZiAobGF5ID4gMCkgeworICAgICAgICAgICAgRkRLbWVtY3B5KCZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0sCisgICAgICAgICAgICAgICAgICAgICAgJnBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkgLSAxKV0sCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENTQXVkaW9TcGVjaWZpY0NvbmZpZykpOwogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbiA9PSAxKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZES19CSVRTVFJFQU0gdG1wQnM7Ci0gICAgICAgICAgICBVSU5UIGFzY1N0YXJ0UG9zLCBhc2NMZW49MDsKKyAgICAgICAgICBVSU5UIHVzYWNDb25maWdMZW5ndGhQcmV2ID0gMDsKKyAgICAgICAgICBVQ0hBUiB1c2FjQ29uZmlnUHJldltUUF9VU0FDX01BWF9DT05GSUdfTEVOXTsKIAotICAgICAgICAgICAgYXNjTGVuID0gQ0xhdG1EZW11eF9HZXRWYWx1ZShicyk7Ci0gICAgICAgICAgICBhc2NTdGFydFBvcyA9IEZES2dldFZhbGlkQml0cyhicyk7Ci0gICAgICAgICAgICB0bXBCcyA9ICpiczsKLSAgICAgICAgICAgIEZES3N5bmNDYWNoZSgmdG1wQnMpOwotICAgICAgICAgICAgdG1wQnMuaEJpdEJ1Zi5WYWxpZEJpdHMgPSBhc2NMZW47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFJlYWQgQVNDICovCi0gICAgICAgICAgICBpZiAoKEVycm9yU3RhdHVzID0gQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csbGF5KV0sICZ0bXBCcywgMSwgcFRwRGVjQ2FsbGJhY2tzKSkpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CisgICAgICAgICAgaWYgKCEocExhdG1EZW11eC0+YXBwbHlBc2MpICYmCisgICAgICAgICAgICAgIChwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0ubV9hb3QgPT0gQU9UX1VTQUMpKSB7CisgICAgICAgICAgICB1c2FjQ29uZmlnTGVuZ3RoUHJldiA9CisgICAgICAgICAgICAgICAgKFVJTlQpKHBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWdCaXRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgNykgPj4KKyAgICAgICAgICAgICAgICAzOyAvKiBzdG9yZSBwcmV2aW91cyBVU0FDIGNvbmZpZyBsZW5ndGggKi8KKyAgICAgICAgICAgIGlmICh1c2FjQ29uZmlnTGVuZ3RoUHJldiA+IFRQX1VTQUNfTUFYX0NPTkZJR19MRU4pIHsKKyAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpwZkNvbmZpZ0ZvdW5kID0gMTsKKyAgICAgICAgICAgIEZES21lbWNsZWFyKHVzYWNDb25maWdQcmV2LCBUUF9VU0FDX01BWF9DT05GSUdfTEVOKTsKKyAgICAgICAgICAgIEZES21lbWNweSgKKyAgICAgICAgICAgICAgICB1c2FjQ29uZmlnUHJldiwKKyAgICAgICAgICAgICAgICAmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldLm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWcsCisgICAgICAgICAgICAgICAgdXNhY0NvbmZpZ0xlbmd0aFByZXYpOyAvKiBzdG9yZSBwcmV2aW91cyBVU0FDIGNvbmZpZyAqLworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocExhdG1EZW11eC0+bV9BdWRpb011eFZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgRkRLX0JJVFNUUkVBTSB0bXBCczsKKyAgICAgICAgICAgIFVJTlQgYXNjTGVuID0gMDsKKyAgICAgICAgICAgIGFzY0xlbiA9IENMYXRtRGVtdXhfR2V0VmFsdWUoYnMpOworICAgICAgICAgICAgLyogVGhlIGFzY0xlbiBjb3VsZCBiZSB3cm9uZywgc28gY2hlY2sgaWYgdmFsaWRCaXRzPD1idWZCaXRzKi8KKyAgICAgICAgICAgIGlmIChhc2NMZW4gPiBGREtnZXRWYWxpZEJpdHMoYnMpKSB7CisgICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGREtzeW5jQ2FjaGUoYnMpOworICAgICAgICAgICAgdG1wQnMgPSAqYnM7CisgICAgICAgICAgICB0bXBCcy5oQml0QnVmLlZhbGlkQml0cyA9IGFzY0xlbjsKKworICAgICAgICAgICAgLyogUmVhZCBBU0MgKi8KKyAgICAgICAgICAgIGlmIChwTGF0bURlbXV4LT5hcHBseUFzYykgeworICAgICAgICAgICAgICBpZiAoVFJBTlNQT1JUREVDX09LICE9CisgICAgICAgICAgICAgICAgICAoRXJyb3JTdGF0dXMgPSBBdWRpb1NwZWNpZmljQ29uZmlnX1BhcnNlKAorICAgICAgICAgICAgICAgICAgICAgICAmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldLCAmdG1wQnMsIDEsCisgICAgICAgICAgICAgICAgICAgICAgIHBUcERlY0NhbGxiYWNrcywgY29uZmlnTW9kZSwgY29uZmlnQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQU9UX05VTExfT0JKRUNUKSkpCisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKFRSQU5TUE9SVERFQ19PSyAhPQorICAgICAgICAgICAgICAgICAgKEVycm9yU3RhdHVzID0gQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgcEFzY0R1bW15LCAmdG1wQnMsIDEsIHBUcERlY0NhbGxiYWNrcywgY29uZmlnTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ2hhbmdlZCwgQU9UX05VTExfT0JKRUNUKSkpCisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiBUaGUgZmllbGQgcF9saW5mby0+bV9hc2NMZW4gY291bGQgYmUgd3JvbmcsIHNvIGNoZWNrIGlmICovCi0gICAgICAgICAgICBpZiAoIDAgPiAoSU5UKUZES2dldFZhbGlkQml0cygmdG1wQnMpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICBpZiAoMCA+IChJTlQpRkRLZ2V0VmFsaWRCaXRzKCZ0bXBCcykpIHsKKyAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEZES3B1c2hGb3IoYnMsIGFzY0xlbik7IC8qIHBvc2l0aW9uIGJpdHN0cmVhbSBhZnRlciBBU0MgKi8KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIFJlYWQgQVNDICovCi0gICAgICAgICAgICBpZiAoKEVycm9yU3RhdHVzID0gQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csbGF5KV0sIGJzLCAwLCBwVHBEZWNDYWxsYmFja3MpKSkgewotICAgICAgICAgICAgICByZXR1cm4gKEVycm9yU3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChwTGF0bURlbXV4LT5hcHBseUFzYykgeworICAgICAgICAgICAgICBpZiAoVFJBTlNQT1JUREVDX09LICE9IChFcnJvclN0YXR1cyA9IEF1ZGlvU3BlY2lmaWNDb25maWdfUGFyc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnMsIDAsIHBUcERlY0NhbGxiYWNrcywgY29uZmlnTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NoYW5nZWQsIEFPVF9OVUxMX09CSkVDVCkpKQorICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChUUkFOU1BPUlRERUNfT0sgIT0KKyAgICAgICAgICAgICAgICAgIChFcnJvclN0YXR1cyA9IEF1ZGlvU3BlY2lmaWNDb25maWdfUGFyc2UoCisgICAgICAgICAgICAgICAgICAgICAgIHBBc2NEdW1teSwgYnMsIDAsIHBUcERlY0NhbGxiYWNrcywgY29uZmlnTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ2hhbmdlZCwgQU9UX05VTExfT0JKRUNUKSkpCisgICAgICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2JFcnJvcjsKKyAgICAgICAgICBpZiAoIXBMYXRtRGVtdXgtPmFwcGx5QXNjKSB7CisgICAgICAgICAgICB1cGRhdGVDb25maWdbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkpXSA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldID0gMTsKKyAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNiRXJyb3IgPSBwVHBEZWNDYWxsYmFja3MtPmNiVXBkYXRlQ29uZmlnKHBUcERlY0NhbGxiYWNrcy0+Y2JVcGRhdGVDb25maWdEYXRhLCAmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csbGF5KV0pOwotICAgICAgICAgICAgaWYgKGNiRXJyb3IgIT0gMCkgewotICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOS09XTl9FUlJPUjsKKyAgICAgICAgICBpZiAoIXBMYXRtRGVtdXgtPmFwcGx5QXNjKSB7CisgICAgICAgICAgICBpZiAocEFzY0R1bW15W1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0ubV9hb3QgPT0KKyAgICAgICAgICAgICAgICBBT1RfVVNBQykgeyAvKiBmbHVzaCBpbiBjYXNlIFNNQyBoYXMgY2hhbmdlZCAqLworICAgICAgICAgICAgICBjb25zdCBVSU5UIHVzYWNDb25maWdMZW5ndGggPQorICAgICAgICAgICAgICAgICAgKFVJTlQpKHBBc2NEdW1teS0+bV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZ0JpdHMgKyA3KSA+PiAzOworICAgICAgICAgICAgICBpZiAodXNhY0NvbmZpZ0xlbmd0aCA+IFRQX1VTQUNfTUFYX0NPTkZJR19MRU4pIHsKKyAgICAgICAgICAgICAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHVzYWNDb25maWdMZW5ndGggIT0gdXNhY0NvbmZpZ0xlbmd0aFByZXYpIHsKKyAgICAgICAgICAgICAgICBGREttZW1jbGVhcigmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUF9VU0FDX01BWF9DT05GSUdfTEVOKTsKKyAgICAgICAgICAgICAgICBGREttZW1jcHkoJnBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFzY0R1bW15LT5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FjQ29uZmlnTGVuZ3RoKTsgLyogc3RvcmUgbmV3IFVTQUMgY29uZmlnICovCisgICAgICAgICAgICAgICAgcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldCisgICAgICAgICAgICAgICAgICAgIC5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnQml0cyA9CisgICAgICAgICAgICAgICAgICAgIHBBc2NEdW1teS0+bV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZ0JpdHM7CisgICAgICAgICAgICAgICAgcExhdG1EZW11eC0+dXNhY0V4cGxpY2l0Q2ZnQ2hhbmdlZCA9IDE7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKEZES21lbWNtcCh1c2FjQ29uZmlnUHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc2NEdW1teS0+bV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWNDb25maWdMZW5ndGhQcmV2KSkgeworICAgICAgICAgICAgICAgICAgRkRLbWVtY2xlYXIoJnBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQX1VTQUNfTUFYX0NPTkZJR19MRU4pOworICAgICAgICAgICAgICAgICAgRkRLbWVtY3B5KCZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXNjRHVtbXktPm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhY0NvbmZpZ0xlbmd0aCk7IC8qIHN0b3JlIG5ldyBVU0FDIGNvbmZpZyAqLworICAgICAgICAgICAgICAgICAgcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldCisgICAgICAgICAgICAgICAgICAgICAgLm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWdCaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICBwQXNjRHVtbXktPm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWdCaXRzOworICAgICAgICAgICAgICAgICAgcExhdG1EZW11eC0+dXNhY0V4cGxpY2l0Q2ZnQ2hhbmdlZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHBBc2NEdW1teVtUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldCisgICAgICAgICAgICAgICAgICAgICAgLm1fc2MubV91c2FjQ29uZmlnLm1fdXNhY051bUVsZW1lbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHBBc2NEdW1teVtUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldCisgICAgICAgICAgICAgICAgICAgICAgICAubV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFswXQorICAgICAgICAgICAgICAgICAgICAgICAgLmV4dEVsZW1lbnQudXNhY0V4dEVsZW1lbnRIYXNBdWRpb1ByZVJvbGwpIHsKKyAgICAgICAgICAgICAgICAgIHBMYXRtRGVtdXgtPm5ld0NmZ0hhc0F1ZGlvUHJlUm9sbCA9CisgICAgICAgICAgICAgICAgICAgICAgMTsgLyogaWYgZHVtbXkgcGFyc2VkIGNmZyBoYXMgYXVkaW9QcmVSb2xsIHdlIGZpcnN0IGZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGFwcGx5aW5nIG5ldyBjZmcgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpwZkNvbmZpZ0ZvdW5kID0gMTsKICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoVHlwZSA9IEZES3JlYWRCaXRzKGJzLDMpOwotICAgICAgICBzd2l0Y2goIHBfbGluZm8tPm1fZnJhbWVMZW5ndGhUeXBlICkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgcF9saW5mby0+bV9idWZmZXJGdWxsbmVzcyA9IEZES3JlYWRCaXRzKGJzLDgpOworICAgICAgICBwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoVHlwZSA9IEZES3JlYWRCaXRzKGJzLCAzKTsKKyAgICAgICAgc3dpdGNoIChwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoVHlwZSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHBfbGluZm8tPm1fYnVmZmVyRnVsbG5lc3MgPSBGREtyZWFkQml0cyhicywgOCk7CiAKLSAgICAgICAgICBpZiAoIXBMYXRtRGVtdXgtPm1fYWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZykgewotICAgICAgICAgICAgaWYgKChsYXkgPiAwKSAmJiAocEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csbGF5KV0ubV9hb3QgPT0gQU9UX0FBQ19TQ0FMIHx8IHBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLGxheSldLm1fYW90ID09IEFPVF9FUl9BQUNfU0NBTCkpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICAgICAgICBpZiAoIXBMYXRtRGVtdXgtPm1fYWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZykgeworICAgICAgICAgICAgICBpZiAoKGxheSA+IDApICYmCisgICAgICAgICAgICAgICAgICAocEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldLm1fYW90ID09IEFPVF9BQUNfU0NBTCB8fAorICAgICAgICAgICAgICAgICAgIHBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkpXS5tX2FvdCA9PQorICAgICAgICAgICAgICAgICAgICAgICBBT1RfRVJfQUFDX1NDQUwpICYmCisgICAgICAgICAgICAgICAgICAocEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSAtIDEpXS5tX2FvdCA9PSBBT1RfQ0VMUCB8fAorICAgICAgICAgICAgICAgICAgIHBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkgLSAxKV0ubV9hb3QgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgQU9UX0VSX0NFTFApKSB7IC8qIFRoZSBsYXllciBtYXliZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlZCBsYXRlciBzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBpdCBhbnl3YXk6ICovCisgICAgICAgICAgICAgICAgLyogY29yZUZyYW1lT2Zmc2V0ID0gKi8gRkRLcmVhZEJpdHMoYnMsIDYpOworICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgLyogZnJhbWVMZW5ndGggPSBGREtyZWFkQml0cyhicyw5KTsgKi8KLSAgICAgICAgY2FzZSAzOgotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAvKiBDRUxQICovCi0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgY2FzZSA3OgotICAgICAgICAgIC8qIEhWWEMgKi8KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOyAvL19MQVRNX0lOVkFMSURGUkFNRUxFTkdUSFRZUEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoSW5CaXRzID0gRkRLcmVhZEJpdHMoYnMsIDkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAvKiBDRUxQICovCisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIC8qIEhWWEMgKi8KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0gLyogc3dpdGNoIGZyYW1lbGVuZ3RodHlwZSovCiAKLSAgICAgICAgfSAgLyogc3dpdGNoIGZyYW1lbGVuZ3RodHlwZSovCisgICAgICB9IC8qIGxheWVyIGxvb3AgKi8KKyAgICB9ICAgLyogcHJvZyBsb29wICovCiAKLSAgICAgIH0gIC8qIGxheWVyIGxvb3AgKi8KLSAgICB9ICAvKiBwcm9nIGxvb3AgKi8KLQotICAgIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLDEpOwotICAgIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhTGVuZ3RoICA9IDA7CisgICAgcExhdG1EZW11eC0+bV9vdGhlckRhdGFQcmVzZW50ID0gRkRLcmVhZEJpdHMoYnMsIDEpOworICAgIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhTGVuZ3RoID0gMDsKIAogICAgIGlmIChwTGF0bURlbXV4LT5tX290aGVyRGF0YVByZXNlbnQpIHsKLSAgICAgIGludCBvdGhlckRhdGFMZW5Fc2MgID0gMDsKLSAgICAgIGRvIHsKLSAgICAgICAgcExhdG1EZW11eC0+bV9vdGhlckRhdGFMZW5ndGggPDw9IDg7ICAgLy8gKj0gMjU2Ci0gICAgICAgIG90aGVyRGF0YUxlbkVzYyA9IEZES3JlYWRCaXRzKGJzLDEpOwotICAgICAgICBwTGF0bURlbXV4LT5tX290aGVyRGF0YUxlbmd0aCArPSBGREtyZWFkQml0cyhicyw4KTsKLSAgICAgIH0gd2hpbGUgKG90aGVyRGF0YUxlbkVzYyk7CisgICAgICBpZiAocExhdG1EZW11eC0+bV9BdWRpb011eFZlcnNpb24gPT0gMSkgeworICAgICAgICBwTGF0bURlbXV4LT5tX290aGVyRGF0YUxlbmd0aCA9IENMYXRtRGVtdXhfR2V0VmFsdWUoYnMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IG90aGVyRGF0YUxlbkVzYyA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBwTGF0bURlbXV4LT5tX290aGVyRGF0YUxlbmd0aCA8PD0gODsgIC8vICo9IDI1NgorICAgICAgICAgIG90aGVyRGF0YUxlbkVzYyA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICAgICAgICBwTGF0bURlbXV4LT5tX290aGVyRGF0YUxlbmd0aCArPSBGREtyZWFkQml0cyhicywgOCk7CisgICAgICAgIH0gd2hpbGUgKG90aGVyRGF0YUxlbkVzYyk7CisgICAgICB9CisgICAgICBpZiAocExhdG1EZW11eC0+bV9hdWRpb011eExlbmd0aEJ5dGVzIDwKKyAgICAgICAgICAocExhdG1EZW11eC0+bV9vdGhlckRhdGFMZW5ndGggPj4gMykpIHsKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KICAgICB9CiAKLSAgICBwTGF0bURlbXV4LT5tX2NyY0NoZWNrUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLDEpOwotICAgIHBMYXRtRGVtdXgtPm1fY3JjQ2hlY2tTdW0gICAgID0gMDsKKyAgICBwTGF0bURlbXV4LT5tX2NyY0NoZWNrUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLCAxKTsKIAogICAgIGlmIChwTGF0bURlbXV4LT5tX2NyY0NoZWNrUHJlc2VudCkgewotICAgICAgcExhdG1EZW11eC0+bV9jcmNDaGVja1N1bSA9IEZES3JlYWRCaXRzKGJzLDgpOworICAgICAgRkRLcmVhZEJpdHMoYnMsIDgpOwogICAgIH0KIAotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIC8qIGF1ZGlvTXV4VmVyc2lvbkEgPiAwIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyAqLwogICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKICAgfQotICByZXR1cm4gKEVycm9yU3RhdHVzKTsKLX0KIAotVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZFBheWxvYWRMZW5ndGhJbmZvKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDTGF0bURlbXV4ICpwTGF0bURlbXV4KQotewotICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7Ci0gIGludCB0b3RhbFBheWxvYWRCaXRzID0gMDsKLQotICBpZiggcExhdG1EZW11eC0+bV9hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nID09IDEgKSB7Ci0gICAgZm9yIChVSU5UIHByb2c9MDsgcHJvZzxwTGF0bURlbXV4LT5tX251bVByb2dyYW07IHByb2crKyApIHsKLSAgICAgIGZvciAoVUlOVCBsYXk9MDsgbGF5PHBMYXRtRGVtdXgtPm1fbnVtTGF5ZXI7IGxheSsrICkgewotICAgICAgICBMQVRNX0xBWUVSX0lORk8gKnBfbGluZm8gPSAmcExhdG1EZW11eC0+bV9saW5mb1twcm9nXVtsYXldOwotCi0gICAgICAgIHN3aXRjaCAocF9saW5mby0+bV9mcmFtZUxlbmd0aFR5cGUgKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICBwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoSW5CaXRzID0gQ0xhdG1EZW11eF9SZWFkQXVDaHVua0xlbmd0aEluZm8oYnMpOwotICAgICAgICAgIHRvdGFsUGF5bG9hZEJpdHMgKz0gcF9saW5mby0+bV9mcmFtZUxlbmd0aEluQml0czsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICBjYXNlIDU6Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOyAvL0FBQ19ERUNfTEFUTV9JTlZBTElERlJBTUVMRU5HVEhUWVBFOworICAvKiBDb25maWd1cmUgc291cmNlIGRlY29kZXI6ICovCisgIGlmIChFcnJvclN0YXR1cyA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICBVSU5UIHByb2c7CisgICAgZm9yIChwcm9nID0gMDsgcHJvZyA8IHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbTsgcHJvZysrKSB7CisgICAgICBVSU5UIGxheTsKKyAgICAgIGZvciAobGF5ID0gMDsgbGF5IDwgcExhdG1EZW11eC0+bV9udW1MYXllcltwcm9nXTsgbGF5KyspIHsKKyAgICAgICAgaWYgKHVwZGF0ZUNvbmZpZ1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldICE9IDApIHsKKyAgICAgICAgICBpbnQgY2JFcnJvcjsKKyAgICAgICAgICBjYkVycm9yID0gcFRwRGVjQ2FsbGJhY2tzLT5jYlVwZGF0ZUNvbmZpZygKKyAgICAgICAgICAgICAgcFRwRGVjQ2FsbGJhY2tzLT5jYlVwZGF0ZUNvbmZpZ0RhdGEsCisgICAgICAgICAgICAgICZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0sCisgICAgICAgICAgICAgIHBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkpXS5jb25maWdNb2RlLAorICAgICAgICAgICAgICAmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldLkFhY0NvbmZpZ0NoYW5nZWQpOworICAgICAgICAgIGlmIChjYkVycm9yID09IFRSQU5TUE9SVERFQ19ORUVEX1RPX1JFU1RBUlQpIHsKKyAgICAgICAgICAgICpwZkNvbmZpZ0ZvdW5kID0gMDsKKyAgICAgICAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX05FRURfVE9fUkVTVEFSVDsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGNiRXJyb3IgIT0gMCkgeworICAgICAgICAgICAgKnBmQ29uZmlnRm91bmQgPSAwOworICAgICAgICAgICAgaWYgKGxheSA9PSAwKSB7CisgICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnBmQ29uZmlnRm91bmQgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqcGZDb25maWdGb3VuZCA9IDE7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KLSAgZWxzZSB7Ci0gICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7IC8vQUFDX0RFQ19MQVRNX1RJTUVGUkFNSU5HOworCitiYWlsOgorICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgVUNIQVIgYXBwbHlBc2MgPSBwTGF0bURlbXV4LT5hcHBseUFzYzsKKyAgICBGREttZW1jbGVhcihwTGF0bURlbXV4LCBzaXplb2YoQ0xhdG1EZW11eCkpOyAvKiByZXNldCBzdHJ1Y3R1cmUgKi8KKyAgICBwTGF0bURlbXV4LT5hcHBseUFzYyA9IGFwcGx5QXNjOworICB9IGVsc2UgeworICAgIC8qIG5vIGVycm9yIGFuZCBjb25maWcgcGFyc2luZyBpcyBmaW5pc2hlZCAqLworICAgIGlmIChjb25maWdNb2RlID09IEFDX0NNX0FMTE9DX01FTSkgcExhdG1EZW11eC0+YXBwbHlBc2MgPSAwOwogICB9Ci0gIGlmIChwTGF0bURlbXV4LT5tX2F1ZGlvTXV4TGVuZ3RoQnl0ZXMgPiAoVUlOVCkwICYmIHRvdGFsUGF5bG9hZEJpdHMgPiAoaW50KXBMYXRtRGVtdXgtPm1fYXVkaW9NdXhMZW5ndGhCeXRlcyo4KSB7Ci0gICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKLSAgfQorCiAgIHJldHVybiAoRXJyb3JTdGF0dXMpOwogfQogCi1pbnQgQ0xhdG1EZW11eF9SZWFkQXVDaHVua0xlbmd0aEluZm8oSEFORExFX0ZES19CSVRTVFJFQU0gYnMpCi17CitUUkFOU1BPUlRERUNfRVJST1IgQ0xhdG1EZW11eF9SZWFkUGF5bG9hZExlbmd0aEluZm8oSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xhdG1EZW11eCAqcExhdG1EZW11eCkgeworICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CisgIGludCB0b3RhbFBheWxvYWRCaXRzID0gMDsKKworICBpZiAocExhdG1EZW11eC0+bV9hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nID09IDEpIHsKKyAgICBGREtfQVNTRVJUKHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbSA8PSBMQVRNX01BWF9QUk9HKTsKKyAgICBmb3IgKFVJTlQgcHJvZyA9IDA7IHByb2cgPCBwTGF0bURlbXV4LT5tX251bVByb2dyYW07IHByb2crKykgeworICAgICAgRkRLX0FTU0VSVChwTGF0bURlbXV4LT5tX251bUxheWVyW3Byb2ddIDw9IExBVE1fTUFYX0xBWUVSKTsKKyAgICAgIGZvciAoVUlOVCBsYXkgPSAwOyBsYXkgPCBwTGF0bURlbXV4LT5tX251bUxheWVyW3Byb2ddOyBsYXkrKykgeworICAgICAgICBMQVRNX0xBWUVSX0lORk8gKnBfbGluZm8gPSAmcExhdG1EZW11eC0+bV9saW5mb1twcm9nXVtsYXldOworCisgICAgICAgIHN3aXRjaCAocF9saW5mby0+bV9mcmFtZUxlbmd0aFR5cGUpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoSW5CaXRzID0gQ0xhdG1EZW11eF9SZWFkQXVDaHVua0xlbmd0aEluZm8oYnMpOworICAgICAgICAgICAgdG90YWxQYXlsb2FkQml0cyArPSBwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoSW5CaXRzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7ICAvLyBBQUNfREVDX0xBVE1fSU5WQUxJREZSQU1FTEVOR1RIVFlQRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsgIC8vIEFBQ19ERUNfTEFUTV9USU1FRlJBTUlORzsKKyAgfQorICBpZiAocExhdG1EZW11eC0+bV9hdWRpb011eExlbmd0aEJ5dGVzID4gKFVJTlQpMCAmJgorICAgICAgdG90YWxQYXlsb2FkQml0cyA+IChpbnQpcExhdG1EZW11eC0+bV9hdWRpb011eExlbmd0aEJ5dGVzICogOCkgeworICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgIH0KKworICByZXR1cm4gKEVycm9yU3RhdHVzKTsKK30KKworaW50IENMYXRtRGVtdXhfUmVhZEF1Q2h1bmtMZW5ndGhJbmZvKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CiAgIFVDSEFSIGVuZEZsYWc7CiAgIGludCBsZW4gPSAwOwogCiAgIGRvIHsKLSAgICBVQ0hBUiB0bXAgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDgpOworICAgIFVDSEFSIHRtcCA9IChVQ0hBUilGREtyZWFkQml0cyhicywgOCk7CiAgICAgZW5kRmxhZyA9ICh0bXAgPCAyNTUpOwogCiAgICAgbGVuICs9IHRtcDsKIAotICB9IHdoaWxlKCBlbmRGbGFnID09IDAgKTsKKyAgfSB3aGlsZSAoZW5kRmxhZyA9PSAwKTsKIAotICBsZW4gPDw9IDM7ICAvKiBjb252ZXJ0IGZyb20gYnl0ZXMgdG8gYml0cyAqLworICBsZW4gPDw9IDM7IC8qIGNvbnZlcnQgZnJvbSBieXRlcyB0byBiaXRzICovCiAKICAgcmV0dXJuIGxlbjsKIH0KIAotaW50IENMYXRtRGVtdXhfR2V0RnJhbWVMZW5ndGhJbkJpdHMoQ0xhdG1EZW11eCAqcExhdG1EZW11eCkKLXsKLSAgcmV0dXJuIHBMYXRtRGVtdXgtPm1fbGluZm9bMF1bMF0ubV9mcmFtZUxlbmd0aEluQml0czsKK1VJTlQgQ0xhdG1EZW11eF9HZXRGcmFtZUxlbmd0aEluQml0cyhDTGF0bURlbXV4ICpwTGF0bURlbXV4LCBjb25zdCBVSU5UIHByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsYXllcikgeworICBVSU5UIG5GcmFtZUxlbkJpdHMgPSAwOworICBpZiAocHJvZyA8IHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbSkgeworICAgIGlmIChsYXllciA8IHBMYXRtRGVtdXgtPm1fbnVtTGF5ZXJbcHJvZ10pIHsKKyAgICAgIG5GcmFtZUxlbkJpdHMgPSBwTGF0bURlbXV4LT5tX2xpbmZvW3Byb2ddW2xheWVyXS5tX2ZyYW1lTGVuZ3RoSW5CaXRzOworICAgIH0KKyAgfQorICByZXR1cm4gbkZyYW1lTGVuQml0czsKIH0KIAotaW50IENMYXRtRGVtdXhfR2V0T3RoZXJEYXRhUHJlc2VudEZsYWcoQ0xhdG1EZW11eCAqcExhdG1EZW11eCkKLXsKK1VJTlQgQ0xhdG1EZW11eF9HZXRPdGhlckRhdGFQcmVzZW50RmxhZyhDTGF0bURlbXV4ICpwTGF0bURlbXV4KSB7CiAgIHJldHVybiBwTGF0bURlbXV4LT5tX290aGVyRGF0YVByZXNlbnQgPyAxIDogMDsKIH0KIAotaW50IENMYXRtRGVtdXhfR2V0T3RoZXJEYXRhTGVuZ3RoKENMYXRtRGVtdXggKnBMYXRtRGVtdXgpCi17CitVSU5UIENMYXRtRGVtdXhfR2V0T3RoZXJEYXRhTGVuZ3RoKENMYXRtRGVtdXggKnBMYXRtRGVtdXgpIHsKICAgcmV0dXJuIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhTGVuZ3RoOwogfQogCi1VSU5UIENMYXRtRGVtdXhfR2V0TnJPZlN1YkZyYW1lcyhDTGF0bURlbXV4ICpwTGF0bURlbXV4KQoteworVUlOVCBDTGF0bURlbXV4X0dldE5yT2ZTdWJGcmFtZXMoQ0xhdG1EZW11eCAqcExhdG1EZW11eCkgewogICByZXR1cm4gcExhdG1EZW11eC0+bV9ub1N1YkZyYW1lczsKIH0KIAorVUlOVCBDTGF0bURlbXV4X0dldE5yT2ZMYXllcnMoQ0xhdG1EZW11eCAqcExhdG1EZW11eCwgY29uc3QgVUlOVCBwcm9nKSB7CisgIFVJTlQgbnVtTGF5ZXIgPSAwOworICBpZiAocHJvZyA8IHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbSkgeworICAgIG51bUxheWVyID0gcExhdG1EZW11eC0+bV9udW1MYXllcltwcm9nXTsKKyAgfQorICByZXR1cm4gbnVtTGF5ZXI7Cit9CmRpZmYgLS1naXQgYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2xhdG0uaCBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGF0bS5oCmluZGV4IDZkYzEzZTguLjZhZjU1M2QgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGF0bS5oCisrKyBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGF0bS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDMyICs5MCwzMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIERhbmllbCBIb21tCisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIExBVE1fREVNVVhfSAotI2RlZmluZSBMQVRNX0RFTVVYX0gKKyNpZm5kZWYgVFBERUNfTEFUTV9ICisjZGVmaW5lIFRQREVDX0xBVE1fSAogCiAjaW5jbHVkZSAidHBkZWNfbGliLmgiCiAKLQogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKIAotI2RlZmluZSBNSU5fTEFUTV9IRUFERVJMRU5HVEggIDkKLSNkZWZpbmUgTUlOX0xPQVNfSEVBREVSTEVOR1RIICBNSU5fTEFUTV9IRUFERVJMRU5HVEggKyAyNCAgIC8qIGJvdGggaW4gYml0cyAqLwotICNkZWZpbmUgTUlOX1RQX0JVRl9TSVpFX0xPQVMgICAoIDgxOTQgKQorI2RlZmluZSBNSU5fTEFUTV9IRUFERVJMRU5HVEggOQorI2RlZmluZSBNSU5fTE9BU19IRUFERVJMRU5HVEggTUlOX0xBVE1fSEVBREVSTEVOR1RIICsgMjQgLyogYm90aCBpbiBiaXRzICovCisjZGVmaW5lIE1JTl9UUF9CVUZfU0laRV9MT0FTICg4MTk0KQogCiBlbnVtIHsKICAgTEFUTV9NQVhfUFJPRyA9IDEsCi0gIExBVE1fTUFYX0xBWUVSID0gMiwKLSAgTEFUTV9NQVhfVkFSX0NIVU5LUz0xNiwKLSAgTEFUTV9NQVhfSUQ9MTYKKyAgTEFUTV9NQVhfTEFZRVIgPSAxLAorICBMQVRNX01BWF9WQVJfQ0hVTktTID0gMTYsCisgIExBVE1fTUFYX0lEID0gMTYKIH07CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTExOCw3ICsxMjksNyBAQAogICBMQVRNX0xBWUVSX0lORk8gbV9saW5mb1tMQVRNX01BWF9QUk9HXVtMQVRNX01BWF9MQVlFUl07CiAgIFVJTlQgbV90YXJhQnVmZmVyRnVsbG5lc3M7CiAgIFVJTlQgbV9vdGhlckRhdGFMZW5ndGg7Ci0gIFVJTlQgbV9hdWRpb011eExlbmd0aEJ5dGVzOyAgICAgICAgICAvKiBMZW5ndGggb2YgTE9BUyBwYXlsb2FkICovCisgIFVJTlQgbV9hdWRpb011eExlbmd0aEJ5dGVzOyAvKiBMZW5ndGggb2YgTE9BUyBwYXlsb2FkICovCiAKICAgVUNIQVIgbV91c2VTYW1lU3RyZWFtTXV4OwogICBVQ0hBUiBtX0F1ZGlvTXV4VmVyc2lvbjsKQEAgLTEyNiwyNyArMTM3LDI4IEBACiAgIFVDSEFSIG1fYWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZzsKICAgVUNIQVIgbV9ub1N1YkZyYW1lczsKICAgVUNIQVIgbV9udW1Qcm9ncmFtOwotICBVQ0hBUiBtX251bUxheWVyOwotICBVQ0hBUiBtX3VzZVNhbWVDb25maWc7CisgIFVDSEFSIG1fbnVtTGF5ZXJbTEFUTV9NQVhfUFJPR107CiAKICAgVUNIQVIgbV9vdGhlckRhdGFQcmVzZW50OwogICBVQ0hBUiBtX2NyY0NoZWNrUHJlc2VudDsKLSAgVUNIQVIgbV9jcmNDaGVja1N1bTsKIAogICBTQ0hBUiBCdWZmZXJGdWxsbmVzc0FjaGlldmVkOworICBVQ0hBUgorICB1c2FjRXhwbGljaXRDZmdDaGFuZ2VkOyAgICAgIC8qIGV4cGxpY2l0IGNvbmZpZyBpbiBjYXNlIG9mIFVTQUMgYW5kIExPQVMvTEFUTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgY29tcGFyZWQgdG8gSVBGIGNmZyAqLworICBVQ0hBUiBhcHBseUFzYzsgICAgICAgICAgICAgIC8qIGFwcGx5IEFTQyBpbW1lZGlhdGUgd2l0aG91dCBmbHVzaGluZyAqLworICBVQ0hBUiBuZXdDZmdIYXNBdWRpb1ByZVJvbGw7IC8qIHRoZSBuZXcgKGR1bW15IHBhcnNlZCkgY29uZmlnIGhhcyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJlUm9sbCAqLwogfSBDTGF0bURlbXV4OwogCiBpbnQgQ0xhdG1EZW11eF9SZWFkQXVDaHVua0xlbmd0aEluZm8oSEFORExFX0ZES19CSVRTVFJFQU0gYnMpOwogCi1UUkFOU1BPUlRERUNfRVJST1IgQ0xhdG1EZW11eF9SZWFkKAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgQ0xhdG1EZW11eCAqcExhdG1EZW11eCwKLSAgICAgICAgVFJBTlNQT1JUX1RZUEUgdHQsCi0gICAgICAgIENTVHBDYWxsQmFja3MgKnBUcERlY0NhbGxiYWNrcywKLSAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAotICAgICAgICBpbnQgKnBmQ29uZmlnRm91bmQsCi0gICAgICAgIGNvbnN0IElOVCBpZ25vcmVCdWZmZXJGdWxsbmVzcwotICAgICAgICApOworVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xhdG1EZW11eCAqcExhdG1EZW11eCwgVFJBTlNQT1JUX1RZUEUgdHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTVHBDYWxsQmFja3MgKnBUcERlY0NhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBmQ29uZmlnRm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpZ25vcmVCdWZmZXJGdWxsbmVzcyk7CiAKIC8qKgogICogXGJyaWVmIFJlYWQgU3RyZWFtTXV4Q29uZmlnCkBAIC0xNTQsMjMgKzE2NiwyNiBAQAogICogXHBhcmFtIHBMYXRtRGVtdXggcG9pbnRlciB0byBDTGF0bURlbXV4IHN0cnVjdCBvZiBjdXJyZW50IExBVE0gY29udGV4dAogICogXHBhcmFtIHBUcERlY0NhbGxiYWNrcyBDYWxsIGJhY2sgc3RydWN0dXJlIGZvciBjb25maWd1cmF0aW9uIGNhbGxiYWNrcwogICogXHBhcmFtIHBBc2MgcG9pbnRlciB0byBhIEFTQyBmb3IgY29uZmlndXJhdGlvbiBzdG9yYWdlCi0gKiBccGFyYW0gcGZDb25maWdGb3VuZCBwb2ludGVyIHRvIGEgZmxhZyB3aGljaCBpcyBzZXQgdG8gMSBpZiBhIGNvbmZpZ3VyYXRpb24gd2FzIGZvdW5kIGFuZCBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5CisgKiBccGFyYW0gcGZDb25maWdGb3VuZCBwb2ludGVyIHRvIGEgZmxhZyB3aGljaCBpcyBzZXQgdG8gMSBpZiBhIGNvbmZpZ3VyYXRpb24KKyAqIHdhcyBmb3VuZCBhbmQgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseQorICogXHBhcmFtIGNvbmZpZ01vZGUgQ29uZmlnIG1vZGVzOiBtZW1vcnkgYWxsb2NhdGlvbiBtb2RlIG9yIGNvbmZpZyBjaGFuZ2UKKyAqIGRldGVjdGlvbiBtb2RlCisgKiBccGFyYW0gY29uZmlnQ2hhbmdlZCBJbmRpY2F0ZXMgYSBjb25maWcgY2hhbmdlCiAgKiBccmV0dXJuIGVycm9yIGNvZGUKICAqLwogVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZFN0cmVhbU11eENvbmZpZygKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgIENMYXRtRGVtdXggKnBMYXRtRGVtdXgsCi0gICAgICAgIENTVHBDYWxsQmFja3MgKnBUcERlY0NhbGxiYWNrcywKLSAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAotICAgICAgICBpbnQgKiBwZkNvbmZpZ0ZvdW5kCi0gICAgICAgICk7CisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENMYXRtRGVtdXggKnBMYXRtRGVtdXgsCisgICAgQ1NUcENhbGxCYWNrcyAqcFRwRGVjQ2FsbGJhY2tzLCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCisgICAgaW50ICpwZkNvbmZpZ0ZvdW5kLCBVQ0hBUiBjb25maWdNb2RlLCBVQ0hBUiBjb25maWdDaGFuZ2VkKTsKIAotVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZFBheWxvYWRMZW5ndGhJbmZvKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDTGF0bURlbXV4ICpwTGF0bURlbXV4KTsKK1RSQU5TUE9SVERFQ19FUlJPUiBDTGF0bURlbXV4X1JlYWRQYXlsb2FkTGVuZ3RoSW5mbyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTGF0bURlbXV4ICpwTGF0bURlbXV4KTsKIAotaW50ICBDTGF0bURlbXV4X0dldEZyYW1lTGVuZ3RoSW5CaXRzKENMYXRtRGVtdXggKnBMYXRtRGVtdXgpOwotaW50ICBDTGF0bURlbXV4X0dldE90aGVyRGF0YVByZXNlbnRGbGFnKENMYXRtRGVtdXggKnBMYXRtRGVtdXgpOwotaW50ICBDTGF0bURlbXV4X0dldE90aGVyRGF0YUxlbmd0aChDTGF0bURlbXV4ICpwTGF0bURlbXV4KTsKK1VJTlQgQ0xhdG1EZW11eF9HZXRGcmFtZUxlbmd0aEluQml0cyhDTGF0bURlbXV4ICpwTGF0bURlbXV4LCBjb25zdCBVSU5UIHByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsYXllcik7CitVSU5UIENMYXRtRGVtdXhfR2V0T3RoZXJEYXRhUHJlc2VudEZsYWcoQ0xhdG1EZW11eCAqcExhdG1EZW11eCk7CitVSU5UIENMYXRtRGVtdXhfR2V0T3RoZXJEYXRhTGVuZ3RoKENMYXRtRGVtdXggKnBMYXRtRGVtdXgpOwogVUlOVCBDTGF0bURlbXV4X0dldE5yT2ZTdWJGcmFtZXMoQ0xhdG1EZW11eCAqcExhdG1EZW11eCk7CitVSU5UIENMYXRtRGVtdXhfR2V0TnJPZkxheWVycyhDTGF0bURlbXV4ICpwTGF0bURlbXV4LCBjb25zdCBVSU5UIHByb2dyYW0pOwogCi0KLSNlbmRpZiAvKiBMQVRNX0RFTVVYX0ggKi8KKyNlbmRpZiAvKiBUUERFQ19MQVRNX0ggKi8KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGliLmNwcCBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGliLmNwcAppbmRleCAyNGY3NTViLi4xZDhiN2IzIDEwMDY0NAotLS0gYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2xpYi5jcHAKKysrIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19saWIuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIwICs5MCwyMCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IFRyYW5zcG9ydCBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgorICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKwogICAgRGVzY3JpcHRpb246IE1QRUcgVHJhbnNwb3J0IGRlY29kZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInRwZGVjX2xpYi5oIgogCiAvKiBsaWJyYXJ5IHZlcnNpb24gKi8KLSNpbmNsdWRlICJ2ZXJzaW9uIgotCisjaW5jbHVkZSAidHBfdmVyc2lvbi5oIgogCiAjaW5jbHVkZSAidHBfZGF0YS5oIgogCkBAIC0xMDQsNiArMTE1LDcgQEAKIAogI2luY2x1ZGUgInRwZGVjX2RybS5oIgogCisjaW5jbHVkZSAiRkRLX2NyYy5oIgogCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJ0cmFuc3BvcnREZWMiCiAKQEAgLTExOCw1MSArMTMwLDcwIEBACiAKIH0gdHJhbnNwb3J0ZGVjX3BhcnNlcl90OwogCi1zdHJ1Y3QgVFJBTlNQT1JUREVDCi17Ci0gIFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdDsgICAgIC8qITwgTVBFRzQgdHJhbnNwb3J0RGVjIHR5cGUuICovCisjZGVmaW5lIE1IQVNfQ09ORklHX1BSRVNFTlQgMHgwMDEKKyNkZWZpbmUgTUhBU19VSV9QUkVTRU5UIDB4MDAyCiAKLSAgQ1NUcENhbGxCYWNrcyBjYWxsYmFja3M7ICAgICAgICAgLyohPCBTdHJ1Y3QgaG9sZGluZyBjYWxsYmFjayBhbmQgaXRzIGRhdGEgKi8KK3N0cnVjdCBUUkFOU1BPUlRERUMgeworICBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQ7IC8qITwgTVBFRzQgdHJhbnNwb3J0RGVjIHR5cGUuICovCiAKLSAgRkRLX0JJVFNUUkVBTSBiaXRTdHJlYW1bMl07IC8qIEJpdHN0cmVhbSByZWFkZXIgKi8KLSAgVUNIQVIgKmJzQnVmZmVyOyAgICAgICAgICAgICAgICAgLyogSW50ZXJuYWwgYml0c3RyZWFtZCBkYXRhIGJ1ZmZlciAodW5hbGxvY2F0ZWQgaW4gY2FzZSBvZiBUVF9NUDRfUkFXUEFDS0VUUykgKi8KKyAgQ1NUcENhbGxCYWNrcyBjYWxsYmFja3M7IC8qITwgU3RydWN0IGhvbGRpbmcgY2FsbGJhY2sgYW5kIGl0cyBkYXRhICovCiAKLSAgdHJhbnNwb3J0ZGVjX3BhcnNlcl90IHBhcnNlcjsgICAgLyogRm9ybWF0IHNwZWNpZmljIHBhcnNlciBzdHJ1Y3RzLiAqLworICBGREtfQklUU1RSRUFNIGJpdFN0cmVhbVsxXTsgLyogQml0c3RyZWFtIHJlYWRlciAqLworICBVQ0hBUiAqYnNCdWZmZXI7ICAgICAgICAgICAgLyogSW50ZXJuYWwgYml0c3RyZWFtZCBkYXRhIGJ1ZmZlciAqLwogCi0gIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBhc2NbKDEqMildOyAvKiBBdWRpbyBzcGVjaWZpYyBjb25maWcgZnJvbSB0aGUgbGFzdCBjb25maWcgZm91bmQuICovCi0gIFVJTlQgIGdsb2JhbEZyYW1lUG9zOyAgICAgICAgICAgIC8qIEdsb2JhbCB0cmFuc3BvcnQgZnJhbWUgcmVmZXJlbmNlIGJpdCBwb3NpdGlvbi4gKi8KLSAgVUlOVCAgYWNjZXNzVW5pdEFuY2hvclsyXTsgICAgLyogQ3VycmVudCBhY2Nlc3MgdW5pdCBzdGFydCBiaXQgcG9zaXRpb24uICovCi0gIElOVCAgIGF1TGVuZ3RoWzJdOyAgICAgICAgICAgIC8qIExlbmd0aCBvZiBjdXJyZW50IGFjY2VzcyB1bml0LiAqLwotICBJTlQgICBudW1iZXJPZlJhd0RhdGFCbG9ja3M7ICAgICAvKiBDdXJyZW50IG51bWJlciBvZiByYXcgZGF0YSBibG9ja3MgY29udGFpbmVkIHJlbWFpbmluZyBmcm9tIHRoZSBjdXJyZW50IHRyYW5zcG9ydCBmcmFtZS4gKi8KLSAgVUlOVCAgYXZnQml0UmF0ZTsgICAgICAgICAgICAgICAgLyogQXZlcmFnZSBiaXQgcmF0ZSB1c2VkIGZvciBmcmFtZSBsb3NzIGVzdGltYXRpb24uICovCi0gIFVJTlQgIGxhc3RWYWxpZEJ1ZmZlckZ1bGxuZXNzOyAgIC8qIExhc3QgdmFsaWQgYnVmZmVyIGZ1bGxuZXNzIHZhbHVlIGZvciBmcmFtZSBsb3NzIGVzdGltYXRpb24gKi8KLSAgSU5UICAgcmVtYWluZGVyOyAgICAgICAgICAgICAgICAgLyogUmVtaW5kZXIgaW4gZGl2aXNpb24gZHVyaW5nIGxvc3QgYWNjZXNzIHVuaXQgZXN0aW1hdGlvbi4gKi8KLSAgSU5UICAgbWlzc2luZ0FjY2Vzc1VuaXRzOyAgICAgICAgLyogRXN0aW1hdGVkIG1pc3NpbmcgYWNjZXNzIHVuaXRzLiAqLwotICBVSU5UICBidXJzdFBlcmlvZDsgICAgICAgICAgICAgICAvKiBEYXRhIGJ1cnN0IHBlcmlvZCBpbiBtaWxpIHNlY29uZHMuICovCi0gIFVJTlQgIGhvbGRPZmZGcmFtZXM7ICAgICAgICAgICAgIC8qIEFtb3VudCBvZiBmcmFtZXMgdGhhdCB3ZXJlIGFscmVhZHkgaG9sZCBvZmYgZHVlIHRvIGJ1ZmZlciBmdWxsbmVzcyBjb25kaXRpb24gbm90IGJlaW5nIG1ldC4gKi8KLSAgVUlOVCAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgLyogRmxhZ3MuICovCisgIHRyYW5zcG9ydGRlY19wYXJzZXJfdCBwYXJzZXI7IC8qIEZvcm1hdCBzcGVjaWZpYyBwYXJzZXIgc3RydWN0cy4gKi8KKworICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgYXNjWygxICogMSkgKyAxXTsgLyogQXVkaW8gc3BlY2lmaWMgY29uZmlnIGZyb20gdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyBmb3VuZC4gT25lIGFkZGl0aW9uYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBpcyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcmlseSBmb3IgcGFyc2luZy4gKi8KKyAgQ0N0cmxDRkdDaGFuZ2UgY3RybENGR0NoYW5nZVsoMSAqIDEpXTsgIC8qIENvbnRyb2xzIGNvbmZpZyBjaGFuZ2UgKi8KKworICBVSU5UIGdsb2JhbEZyYW1lUG9zOyAgICAgIC8qIEdsb2JhbCB0cmFuc3BvcnQgZnJhbWUgcmVmZXJlbmNlIGJpdCBwb3NpdGlvbi4gKi8KKyAgVUlOVCBhY2Nlc3NVbml0QW5jaG9yWzFdOyAvKiBDdXJyZW50IGFjY2VzcyB1bml0IHN0YXJ0IGJpdCBwb3NpdGlvbi4gKi8KKyAgSU5UIGF1TGVuZ3RoWzFdOyAgICAgICAgICAvKiBMZW5ndGggb2YgY3VycmVudCBhY2Nlc3MgdW5pdC4gKi8KKyAgSU5UIG51bWJlck9mUmF3RGF0YUJsb2NrczsgLyogQ3VycmVudCBudW1iZXIgb2YgcmF3IGRhdGEgYmxvY2tzIGNvbnRhaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgZnJvbSB0aGUgY3VycmVudCB0cmFuc3BvcnQgZnJhbWUuICovCisgIFVJTlQgYXZnQml0UmF0ZTsgLyogQXZlcmFnZSBiaXQgcmF0ZSB1c2VkIGZvciBmcmFtZSBsb3NzIGVzdGltYXRpb24uICovCisgIFVJTlQgbGFzdFZhbGlkQnVmZmVyRnVsbG5lc3M7IC8qIExhc3QgdmFsaWQgYnVmZmVyIGZ1bGxuZXNzIHZhbHVlIGZvciBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzIGVzdGltYXRpb24gKi8KKyAgSU5UIHJlbWFpbmRlcjsgLyogUmVtaW5kZXIgaW4gZGl2aXNpb24gZHVyaW5nIGxvc3QgYWNjZXNzIHVuaXQgZXN0aW1hdGlvbi4gKi8KKyAgSU5UIG1pc3NpbmdBY2Nlc3NVbml0czsgLyogRXN0aW1hdGVkIG1pc3NpbmcgYWNjZXNzIHVuaXRzLiAqLworICBVSU5UIGJ1cnN0UGVyaW9kOyAgICAgICAvKiBEYXRhIGJ1cnN0IHBlcmlvZCBpbiBtaWxpIHNlY29uZHMuICovCisgIFVJTlQgaG9sZE9mZkZyYW1lczsgICAgIC8qIEFtb3VudCBvZiBmcmFtZXMgdGhhdCB3ZXJlIGFscmVhZHkgaG9sZCBvZmYgZHVlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBmdWxsbmVzcyBjb25kaXRpb24gbm90IGJlaW5nIG1ldC4gKi8KKyAgVUlOVCBmbGFnczsgICAgICAgICAgICAgLyogRmxhZ3MuICovCisgIElOVCB0YXJnZXRMYXlvdXQ7ICAgICAgIC8qIENJQ1AgdGFyZ2V0IGxheW91dC4gKi8KKyAgVUlOVCAqcExvdWRuZXNzSW5mb1NldFBvc2l0aW9uOyAvKiBSZWZlcmVuY2UgYW5kIHN0YXJ0IHBvc2l0aW9uIChiaXRzKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggKGJ5dGVzKSBvZiBsb3VkbmVzc0luZm9TZXQgd2l0aGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnN2NjAzZGFDb25maWcuICAqLwogfTsKIAogLyogRmxhZyBiaXRtYXNrcyBmb3IgImZsYWdzIiBtZW1iZXIgb2Ygc3RydWN0IFRSQU5TUE9SVERFQyAqLwotI2RlZmluZSBUUERFQ19TWU5DT0sgICAgICAgICAgICAgICAgMQotI2RlZmluZSBUUERFQ19NSU5JTUlaRV9ERUxBWSAgICAgICAgMgorI2RlZmluZSBUUERFQ19TWU5DT0sgMQorI2RlZmluZSBUUERFQ19NSU5JTUlaRV9ERUxBWSAyCiAjZGVmaW5lIFRQREVDX0lHTk9SRV9CVUZGRVJGVUxMTkVTUyA0Ci0jZGVmaW5lIFRQREVDX0VBUkxZX0NPTkZJRyAgICAgICAgICA4Ci0jZGVmaW5lIFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkcgIDE2Ci0jZGVmaW5lIFRQREVDX0NPTkZJR19GT1VORCAgICAgICAgIDMyCisjZGVmaW5lIFRQREVDX0VBUkxZX0NPTkZJRyA4CisjZGVmaW5lIFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkcgMTYKKyNkZWZpbmUgVFBERUNfQ09ORklHX0ZPVU5EIDMyCisjZGVmaW5lIFRQREVDX1VTRV9FTEVNX1NLSVBQSU5HIDY0CiAKLUNfQUxMT0NfTUVNKFJhbV9UcmFuc3BvcnREZWNvZGVyLCBUUkFOU1BPUlRERUMsIDEpCi1DX0FMTE9DX01FTShSYW1fVHJhbnNwb3J0RGVjb2RlckJ1ZmZlciwgVUNIQVIsIFRSQU5TUE9SVERFQ19JTkJVRl9TSVpFKQorLyogZm9yY2UgY29uZmlnL2NvbnRlbnQgY2hhbmdlICovCisjZGVmaW5lIFRQREVDX0ZPUkNFX0NPTkZJR19DSEFOR0UgMQorI2RlZmluZSBUUERFQ19GT1JDRV9DT05URU5UX0NIQU5HRSAyCiAKKy8qIHNraXAgcGFja2V0ICovCisjZGVmaW5lIFRQREVDX1NLSVBfUEFDS0VUIDEKIAorQ19BTExPQ19NRU0oUmFtX1RyYW5zcG9ydERlY29kZXIsIHN0cnVjdCBUUkFOU1BPUlRERUMsIDEpCitDX0FMTE9DX01FTShSYW1fVHJhbnNwb3J0RGVjb2RlckJ1ZmZlciwgVUNIQVIsICg4MTkyICogNCkpCiAKLQotSEFORExFX1RSQU5TUE9SVERFQyB0cmFuc3BvcnREZWNfT3BlbiggY29uc3QgVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10LCBjb25zdCBVSU5UIGZsYWdzKQoteworSEFORExFX1RSQU5TUE9SVERFQyB0cmFuc3BvcnREZWNfT3Blbihjb25zdCBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IFVJTlQgbnJPZkxheWVycykgewogICBIQU5ETEVfVFJBTlNQT1JUREVDIGhJbnB1dDsKIAogICBoSW5wdXQgPSBHZXRSYW1fVHJhbnNwb3J0RGVjb2RlcigwKTsKLSAgaWYgKCBoSW5wdXQgPT0gTlVMTCApIHsKKyAgaWYgKGhJbnB1dCA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMTcwLDEwNiArMjAxLDE1NiBAQAogICBoSW5wdXQtPnRyYW5zcG9ydEZtdCA9IHRyYW5zcG9ydEZtdDsKIAogICBzd2l0Y2ggKHRyYW5zcG9ydEZtdCkgeworICAgIGNhc2UgVFRfTVA0X0FESUY6CisgICAgICBicmVhazsKIAotICBjYXNlIFRUX01QNF9BRElGOgotICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgICBpZiAoZmxhZ3MgJiBUUF9GTEFHX01QRUc0KQorICAgICAgICBoSW5wdXQtPnBhcnNlci5hZHRzLmRlY29kZXJDYW5Eb01wZWc0ID0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgaElucHV0LT5wYXJzZXIuYWR0cy5kZWNvZGVyQ2FuRG9NcGVnNCA9IDA7CisgICAgICBhZHRzUmVhZF9DcmNJbml0KCZoSW5wdXQtPnBhcnNlci5hZHRzKTsKKyAgICAgIGhJbnB1dC0+cGFyc2VyLmFkdHMuQnVmZmVyRnVsbG5lc1N0YXJ0RmxhZyA9IDE7CisgICAgICBoSW5wdXQtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9IDA7CisgICAgICBicmVhazsKIAotICBjYXNlIFRUX01QNF9BRFRTOgotICAgIGlmIChmbGFncyAmIFRQX0ZMQUdfTVBFRzQpCi0gICAgICBoSW5wdXQtPnBhcnNlci5hZHRzLmRlY29kZXJDYW5Eb01wZWc0ID0gMTsKLSAgICBlbHNlCi0gICAgICBoSW5wdXQtPnBhcnNlci5hZHRzLmRlY29kZXJDYW5Eb01wZWc0ID0gMDsKLSAgICBhZHRzUmVhZF9DcmNJbml0KCZoSW5wdXQtPnBhcnNlci5hZHRzKTsKLSAgICBoSW5wdXQtPnBhcnNlci5hZHRzLkJ1ZmZlckZ1bGxuZXNTdGFydEZsYWcgPSAxOwotICAgIGhJbnB1dC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0gMDsKLSAgICBicmVhazsKKyAgICBjYXNlIFRUX0RSTToKKyAgICAgIGRybVJlYWRfQ3JjSW5pdCgmaElucHV0LT5wYXJzZXIuZHJtKTsKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgVFRfRFJNOgotICAgIGRybVJlYWRfQ3JjSW5pdCgmaElucHV0LT5wYXJzZXIuZHJtKTsKLSAgICBicmVhazsKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CisgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgorICAgICAgaElucHV0LT5wYXJzZXIubGF0bS51c2FjRXhwbGljaXRDZmdDaGFuZ2VkID0gMDsKKyAgICAgIGhJbnB1dC0+cGFyc2VyLmxhdG0uYXBwbHlBc2MgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgICAgIGhJbnB1dC0+cGFyc2VyLmxhdG0udXNhY0V4cGxpY2l0Q2ZnQ2hhbmdlZCA9IDA7CisgICAgICBoSW5wdXQtPnBhcnNlci5sYXRtLmFwcGx5QXNjID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X1JBVzoKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKLSAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgotICBjYXNlIFRUX01QNF9MT0FTOgotICBjYXNlIFRUX01QNF9SQVc6Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBGcmVlUmFtX1RyYW5zcG9ydERlY29kZXIoJmhJbnB1dCk7Ci0gICAgaElucHV0ID0gTlVMTDsKLSAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRnJlZVJhbV9UcmFuc3BvcnREZWNvZGVyKCZoSW5wdXQpOworICAgICAgaElucHV0ID0gTlVMTDsKKyAgICAgIGJyZWFrOwogICB9CiAKICAgaWYgKGhJbnB1dCAhPSBOVUxMKSB7CiAgICAgLyogQ3JlYXRlIGJpdHN0cmVhbSAqLwotICAgIGlmICggVFRfSVNfUEFDS0VUKHRyYW5zcG9ydEZtdCkgKSB7Ci0gICAgICBoSW5wdXQtPmJzQnVmZmVyID0gTlVMTDsKLSAgICB9IGVsc2UgeworICAgIHsKICAgICAgIGhJbnB1dC0+YnNCdWZmZXIgPSBHZXRSYW1fVHJhbnNwb3J0RGVjb2RlckJ1ZmZlcigwKTsKICAgICAgIGlmIChoSW5wdXQtPmJzQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICB0cmFuc3BvcnREZWNfQ2xvc2UoICZoSW5wdXQgKTsKLSAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdHJhbnNwb3J0RGVjX0Nsb3NlKCZoSW5wdXQpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgIH0KLSAgICAgIEZES2luaXRCaXRTdHJlYW0oJmhJbnB1dC0+Yml0U3RyZWFtWzBdLCBoSW5wdXQtPmJzQnVmZmVyLCBUUkFOU1BPUlRERUNfSU5CVUZfU0laRSwgMCwgQlNfUkVBREVSKTsKKyAgICAgIGlmIChuck9mTGF5ZXJzID4gMSkgeworICAgICAgICB0cmFuc3BvcnREZWNfQ2xvc2UoJmhJbnB1dCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgZm9yIChVSU5UIGkgPSAwOyBpIDwgbnJPZkxheWVyczsgaSsrKSB7CisgICAgICAgIEZES2luaXRCaXRTdHJlYW0oJmhJbnB1dC0+Yml0U3RyZWFtW2ldLCBoSW5wdXQtPmJzQnVmZmVyLCAoODE5MiAqIDQpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJTX1JFQURFUik7CisgICAgICB9CiAgICAgfQotCiAgICAgaElucHV0LT5idXJzdFBlcmlvZCA9IDA7CiAgIH0KIAogICByZXR1cm4gaElucHV0OwogfQogCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX091dE9mQmFuZENvbmZpZyhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgVUNIQVIgKmNvbmYsIGNvbnN0IFVJTlQgbGVuZ3RoLCBVSU5UIGxheWVyICkKLXsKLSAgVFJBTlNQT1JUREVDX0VSUk9SICAgICBlcnIgICAgICAgID0gVFJBTlNQT1JUREVDX09LOworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19PdXRPZkJhbmRDb25maWcoSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqY29uZiwgY29uc3QgVUlOVCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGxheWVyKSB7CisgIGludCBpOworCisgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnIgPSBUUkFOU1BPUlRERUNfT0s7CiAKICAgRkRLX0JJVFNUUkVBTSBiczsKLSAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcyAgICAgICAgPSAmYnM7Ci0KLSAgRkRLaW5pdEJpdFN0cmVhbShoQnMsIGNvbmYsIDB4MTAwMDAwMDAsIGxlbmd0aDw8MywgQlNfUkVBREVSKTsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gJmJzOwogCiAgIGludCBmQ29uZmlnRm91bmQgPSAwOwogCi0gIC8qIGNvbmZpZyB0cmFuc3BvcnQgZGVjb2RlciAqLwotICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7Ci0gICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgotICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKLSAgICBjYXNlIFRUX01QNF9MT0FTOgotICAgICAgeworICBVQ0hBUiBjb25maWdDaGFuZ2VkID0gMDsKKyAgVUNIQVIgY29uZmlnTW9kZSA9IEFDX0NNX0RFVF9DRkdfQ0hBTkdFOworCisgIFVDSEFSIHRtcENvbmZbMTAyNF07CisgIGlmIChsZW5ndGggPiAxMDI0KSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgIH0KKyAgRkRLbWVtY3B5KHRtcENvbmYsIGNvbmYsIGxlbmd0aCk7CisgIEZES2luaXRCaXRTdHJlYW0oaEJzLCB0bXBDb25mLCAxMDI0LCBsZW5ndGggPDwgMywgQlNfUkVBREVSKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICBGREtwdXNoQmFjayhoQnMsIChJTlQpbGVuZ3RoICogOCAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykpOworICAgICAgY29uZmlnTW9kZSA9IEFDX0NNX0FMTE9DX01FTTsKKyAgICB9CisKKyAgICAvKiBjb25maWcgdHJhbnNwb3J0IGRlY29kZXIgKi8KKyAgICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CisgICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CisgICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgICBjYXNlIFRUX01QNF9MT0FTOiB7CiAgICAgICAgIGlmIChsYXllciAhPSAwKSB7CiAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICAgfQogICAgICAgICBDTGF0bURlbXV4ICpwTGF0bURlbXV4ID0gJmhUcC0+cGFyc2VyLmxhdG07Ci0gICAgICAgIGVyciA9IENMYXRtRGVtdXhfUmVhZFN0cmVhbU11eENvbmZpZyhoQnMsIHBMYXRtRGVtdXgsICZoVHAtPmNhbGxiYWNrcywgaFRwLT5hc2MsICZmQ29uZmlnRm91bmQpOworICAgICAgICBlcnIgPSBDTGF0bURlbXV4X1JlYWRTdHJlYW1NdXhDb25maWcoaEJzLCBwTGF0bURlbXV4LCAmaFRwLT5jYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVHAtPmFzYywgJmZDb25maWdGb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ01vZGUsIGNvbmZpZ0NoYW5nZWQpOwogICAgICAgICBpZiAoZXJyICE9IFRSQU5TUE9SVERFQ19PSykgewogICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmQ29uZmlnRm91bmQgPSAxOwotICAgICAgZXJyID0gQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgmaFRwLT5hc2NbbGF5ZXJdLCBoQnMsIDEsICZoVHAtPmNhbGxiYWNrcyk7Ci0gICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgfSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZDb25maWdGb3VuZCA9IDE7CisgICAgICAgIGVyciA9IEF1ZGlvU3BlY2lmaWNDb25maWdfUGFyc2UoJmhUcC0+YXNjWygxICogMSldLCBoQnMsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUcC0+Y2FsbGJhY2tzLCBjb25maWdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NoYW5nZWQsIEFPVF9OVUxMX09CSkVDVCk7CisgICAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgaW50IGVyckM7CisKKyAgICAgICAgICBoVHAtPmFzY1tsYXllcl0gPSBoVHAtPmFzY1soMSAqIDEpXTsKKyAgICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWcoCisgICAgICAgICAgICAgIGhUcC0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnRGF0YSwgJmhUcC0+YXNjW2xheWVyXSwKKyAgICAgICAgICAgICAgaFRwLT5hc2NbbGF5ZXJdLmNvbmZpZ01vZGUsICZoVHAtPmFzY1tsYXllcl0uQWFjQ29uZmlnQ2hhbmdlZCk7CisgICAgICAgICAgaWYgKGVyckMgIT0gMCkgeworICAgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVFRfRFJNOgorICAgICAgICBmQ29uZmlnRm91bmQgPSAxOworICAgICAgICBlcnIgPSBEcm1SYXdTZGNBdWRpb0NvbmZpZ19QYXJzZSgmaFRwLT5hc2NbbGF5ZXJdLCBoQnMsICZoVHAtPmNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnTW9kZSwgY29uZmlnQ2hhbmdlZCk7CisgICAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgaW50IGVyckM7CisKKyAgICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWcoCisgICAgICAgICAgICAgIGhUcC0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnRGF0YSwgJmhUcC0+YXNjW2xheWVyXSwKKyAgICAgICAgICAgICAgaFRwLT5hc2NbbGF5ZXJdLmNvbmZpZ01vZGUsICZoVHAtPmFzY1tsYXllcl0uQWFjQ29uZmlnQ2hhbmdlZCk7CisgICAgICAgICAgaWYgKGVyckMgIT0gMCkgeworICAgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgaWYgKChpID09IDApICYmIChoVHAtPmFzY1tsYXllcl0uQWFjQ29uZmlnQ2hhbmdlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICBoVHAtPmFzY1tsYXllcl0uU2JyQ29uZmlnQ2hhbmdlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICBoVHAtPmFzY1tsYXllcl0uU2FjQ29uZmlnQ2hhbmdlZCkpIHsKICAgICAgICAgaW50IGVyckM7CiAKLSAgICAgICAgZXJyQyA9IGhUcC0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnKGhUcC0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnRGF0YSwgJmhUcC0+YXNjW2xheWVyXSk7CisgICAgICAgIGNvbmZpZ0NoYW5nZWQgPSAxOworICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JGcmVlTWVtKGhUcC0+Y2FsbGJhY2tzLmNiRnJlZU1lbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUcC0+YXNjW2xheWVyXSk7CiAgICAgICAgIGlmIChlcnJDICE9IDApIHsKICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFRfRFJNOgotICAgICAgZkNvbmZpZ0ZvdW5kID0gMTsKLSAgICAgIGVyciA9IERybVJhd1NkY0F1ZGlvQ29uZmlnX1BhcnNlKCZoVHAtPmFzY1tsYXllcl0sIGhCcyk7Ci0gICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSykgewotICAgICAgICBpbnQgZXJyQzsKLQotICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWcoaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWdEYXRhLCAmaFRwLT5hc2NbbGF5ZXJdKTsKLSAgICAgICAgaWYgKGVyckMgIT0gMCkgewotICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7CisgICAgfQogICB9CiAKICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0sgJiYgZkNvbmZpZ0ZvdW5kKSB7CkBAIC0yNzksOCArMzYwLDIwOCBAQAogICByZXR1cm4gZXJyOwogfQogCi1pbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyQXNjQ2FsbGJhY2soIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwRGVjLCBjb25zdCBjYlVwZGF0ZUNvbmZpZ190IGNiVXBkYXRlQ29uZmlnLCB2b2lkKiB1c2VyX2RhdGEpCi17CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0luQmFuZENvbmZpZyhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpuZXdDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG5ld0NvbmZpZ0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGJ1aWxkVXBTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqY29uZmlnQ2hhbmdlZCwgVUlOVCBsYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICppbXBsaWNpdEV4cGxpY2l0Q2ZnRGlmZikgeworICBpbnQgZXJyQzsKKyAgRkRLX0JJVFNUUkVBTSBiczsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gJmJzOworICBUUkFOU1BPUlRERUNfRVJST1IgZXJyID0gVFJBTlNQT1JUREVDX09LOworICBpbnQgZkNvbmZpZ0ZvdW5kID0gMDsKKyAgVUNIQVIgY29uZmlnTW9kZSA9IEFDX0NNX0FMTE9DX01FTTsKKyAgKmltcGxpY2l0RXhwbGljaXRDZmdEaWZmID0gMDsKKworICBGREtfQVNTRVJUKGhUcC0+YXNjLT5tX2FvdCA9PSBBT1RfVVNBQyk7CisKKyAgRkRLaW5pdEJpdFN0cmVhbShoQnMsIG5ld0NvbmZpZywgVFBfVVNBQ19NQVhfQ09ORklHX0xFTiwgbmV3Q29uZmlnTGVuZ3RoIDw8IDMsCisgICAgICAgICAgICAgICAgICAgQlNfUkVBREVSKTsKKworICBpZiAoKGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hTdGF0dXMgPT0gVFBERUNfRkxVU0hfT0ZGKSAmJgorICAgICAgKGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uYnVpbGRVcFN0YXR1cyAhPQorICAgICAgIFRQREVDX1JTVjYwX0JVSUxEX1VQX0lETEVfSU5fQkFORCkpIHsKKyAgICBpZiAoaFRwLT5hc2MtPm1fYW90ID09IEFPVF9VU0FDKSB7CisgICAgICBpZiAoKFVJTlQpKGhUcC0+YXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnQml0cyArIDcpID4+IDMgPT0KKyAgICAgICAgICBuZXdDb25maWdMZW5ndGgpIHsKKyAgICAgICAgaWYgKDAgPT0gRkRLbWVtY21wKG5ld0NvbmZpZywgaFRwLT5hc2MtPm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb25maWdMZW5ndGgpKSB7CisgICAgICAgICAgaWYgKGhUcC0+cGFyc2VyLmxhdG0udXNhY0V4cGxpY2l0Q2ZnQ2hhbmdlZCkgeyAvKiBjb25maWdDaGFuZ2UgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9BUy9MQVRNIHBhcnNlciAqLworICAgICAgICAgICAgaFRwLT5wYXJzZXIubGF0bS51c2FjRXhwbGljaXRDZmdDaGFuZ2VkID0gMDsKKyAgICAgICAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hDbnQgPSAwOworICAgICAgICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaFN0YXR1cyA9CisgICAgICAgICAgICAgICAgVFBERUNfVVNBQ19EQVNIX0lQRl9GTFVTSF9PTjsKKyAgICAgICAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uYnVpbGRVcENudCA9IDA7CisgICAgICAgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmJ1aWxkVXBTdGF0dXMgPSBUUERFQ19CVUlMRF9VUF9PRkY7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpjb25maWdDaGFuZ2VkID0gMDsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICppbXBsaWNpdEV4cGxpY2l0Q2ZnRGlmZiA9IDE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICppbXBsaWNpdEV4cGxpY2l0Q2ZnRGlmZiA9IDE7CisgICAgICB9CisgICAgICAvKiBJU08vSUVDIDIzMDAzLTM6MjAxMi9GREFNIDM6MjAxNihFKSBBbm5leCBGLjI6IGV4cGxpY2l0IGFuZCBpbXBsaWNpdAorICAgICAgICogY29uZmlnIHNoYWxsIGJlIGlkZW50aWNhbC4gKi8KKyAgICAgIGlmICgqaW1wbGljaXRFeHBsaWNpdENmZ0RpZmYpIHsKKyAgICAgICAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgeworICAgICAgICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICAgICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgICAgICAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgICAgICAgICAgIC8qIHJlc2V0IGRlY29kZXIgdG8gaW5pdGlhbCBzdGF0ZSB0byBhY2hpZXZlIGRlZmluaXRlIGJlaGF2aW9yIGFmdGVyCisgICAgICAgICAgICAgKiBlcnJvciBpbiBjb25maWcgKi8KKyAgICAgICAgICAgIGhUcC0+Y2FsbGJhY2tzLmNiRnJlZU1lbShoVHAtPmNhbGxiYWNrcy5jYkZyZWVNZW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVHAtPmFzY1tsYXllcl0pOworICAgICAgICAgICAgaFRwLT5wYXJzZXIubGF0bS51c2FjRXhwbGljaXRDZmdDaGFuZ2VkID0gMDsKKyAgICAgICAgICAgIGhUcC0+cGFyc2VyLmxhdG0uYXBwbHlBc2MgPSAxOworICAgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHsKKyAgICBpZiAoKGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hTdGF0dXMgPT0gVFBERUNfRkxVU0hfT0ZGKSAmJgorICAgICAgICAoaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5idWlsZFVwU3RhdHVzICE9CisgICAgICAgICBUUERFQ19SU1Y2MF9CVUlMRF9VUF9JRExFX0lOX0JBTkQpKSB7CisgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmZsdXNoQ250ID0gMDsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uYnVpbGRVcENudCA9IDA7CisgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmJ1aWxkVXBTdGF0dXMgPSBUUERFQ19CVUlMRF9VUF9PRkY7CisgICAgICBpZiAoaFRwLT5hc2MtPm1fYW90ID09IEFPVF9VU0FDKSB7CisgICAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hTdGF0dXMgPSBUUERFQ19VU0FDX0RBU0hfSVBGX0ZMVVNIX09OOworICAgICAgfQorICAgIH0KKworICAgIGlmICgoaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaFN0YXR1cyA9PQorICAgICAgICAgVFBERUNfUlNWNjBfREFTSF9JUEZfQVRTQ19GTFVTSF9PTikgfHwKKyAgICAgICAgKGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hTdGF0dXMgPT0KKyAgICAgICAgIFRQREVDX1VTQUNfREFTSF9JUEZfRkxVU0hfT04pKSB7CisgICAgICBTQ0hBUiBjb3VudGVyID0gMDsKKyAgICAgIGlmIChoVHAtPmFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICAgICAgY291bnRlciA9IFRQREVDX1VTQUNfTlVNX0NPTkZJR19DSEFOR0VfRlJBTUVTOworICAgICAgfQorICAgICAgaWYgKGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hDbnQgPj0gY291bnRlcikgeworICAgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmZsdXNoQ250ID0gMDsKKyAgICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaFN0YXR1cyA9IFRQREVDX0ZMVVNIX09GRjsKKyAgICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mb3JjZUNmZ0NoYW5nZSA9IDA7CisgICAgICAgIGlmIChoVHAtPmFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICAgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmJ1aWxkVXBDbnQgPQorICAgICAgICAgICAgICBUUERFQ19VU0FDX05VTV9DT05GSUdfQ0hBTkdFX0ZSQU1FUyAtIDE7CisgICAgICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5idWlsZFVwU3RhdHVzID0gVFBERUNfVVNBQ19CVUlMRF9VUF9PTjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBBY3RpdmF0ZSBmbHVzaCBtb2RlLiBBZnRlciB0aGF0IGNvbnRpbnVlIHdpdGggYnVpbGQgdXAgbW9kZSBpbiBjb3JlICovCisgICAgICBpZiAoaFRwLT5jYWxsYmFja3MuY2JDdHJsQ0ZHQ2hhbmdlKGhUcC0+Y2FsbGJhY2tzLmNiQ3RybENGR0NoYW5nZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdKSAhPSAwKSB7CisgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgIH0KKworICAgICAgaWYgKChoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmZsdXNoU3RhdHVzID09CisgICAgICAgICAgIFRQREVDX1JTVjYwX0RBU0hfSVBGX0FUU0NfRkxVU0hfT04pIHx8CisgICAgICAgICAgKGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hTdGF0dXMgPT0KKyAgICAgICAgICAgVFBERUNfVVNBQ19EQVNIX0lQRl9GTFVTSF9PTikpIHsKKyAgICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaENudCsrOworICAgICAgICByZXR1cm4gZXJyOworICAgICAgfQorICAgIH0KKworICAgIGlmIChoVHAtPmFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICAgIGZDb25maWdGb3VuZCA9IDE7CisKKyAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICpjb25maWdDaGFuZ2VkID0gMDsKKyAgICAgICAgY29uZmlnTW9kZSA9IEFDX0NNX0RFVF9DRkdfQ0hBTkdFOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBGREtwdXNoQmFjayhoQnMsIG5ld0NvbmZpZ0xlbmd0aCAqIDggLSBGREtnZXRWYWxpZEJpdHMoaEJzKSk7CisgICAgICAgICAgICBjb25maWdNb2RlID0gQUNfQ01fQUxMT0NfTUVNOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBjb25maWcgdHJhbnNwb3J0IGRlY29kZXIgKi8KKyAgICAgICAgICBlcnIgPSBBdWRpb1NwZWNpZmljQ29uZmlnX1BhcnNlKAorICAgICAgICAgICAgICAmaFRwLT5hc2NbKDEgKiAxKV0sIGhCcywgMCwgJmhUcC0+Y2FsbGJhY2tzLCBjb25maWdNb2RlLAorICAgICAgICAgICAgICAqY29uZmlnQ2hhbmdlZCwgaFRwLT5hc2NbbGF5ZXJdLm1fYW90KTsKKyAgICAgICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICAgICAgaFRwLT5hc2NbbGF5ZXJdID0gaFRwLT5hc2NbKDEgKiAxKV07CisgICAgICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWcoCisgICAgICAgICAgICAgICAgaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWdEYXRhLCAmaFRwLT5hc2NbbGF5ZXJdLAorICAgICAgICAgICAgICAgIGhUcC0+YXNjW2xheWVyXS5jb25maWdNb2RlLCAmaFRwLT5hc2NbbGF5ZXJdLkFhY0NvbmZpZ0NoYW5nZWQpOworICAgICAgICAgICAgaWYgKGVyckMgIT0gMCkgeworICAgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgICAgIGlmICgoaSA9PSAwKSAmJiAoaFRwLT5hc2NbbGF5ZXJdLkFhY0NvbmZpZ0NoYW5nZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRwLT5hc2NbbGF5ZXJdLlNickNvbmZpZ0NoYW5nZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRwLT5hc2NbbGF5ZXJdLlNhY0NvbmZpZ0NoYW5nZWQpKSB7CisgICAgICAgICAgICAgICpjb25maWdDaGFuZ2VkID0gMTsKKyAgICAgICAgICAgICAgZXJyQyA9IGhUcC0+Y2FsbGJhY2tzLmNiRnJlZU1lbShoVHAtPmNhbGxiYWNrcy5jYkZyZWVNZW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVHAtPmFzY1tsYXllcl0pOworICAgICAgICAgICAgICBpZiAoZXJyQyAhPSAwKSB7CisgICAgICAgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQgdGVybWluYXRlIGNvbmZpZyBwYXJzaW5nIHRvIGF2b2lkIHRoYXQgYW4KKyAgICAgICAgICAgKiBpbnZhbGlkIGNvbmZpZyBpcyBhY2NlcHRlZCBpbiB0aGUgc2Vjb25kIHBhc3MgKi8KKyAgICAgICAgICBpZiAoZXJyICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIGJhaWw6CisgICAgLyogc2F2ZSBuZXcgY29uZmlnICovCisgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgIGlmIChoVHAtPmFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICAgICAgaFRwLT5hc2MtPm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWdCaXRzID0gbmV3Q29uZmlnTGVuZ3RoIDw8IDM7CisgICAgICAgIEZES21lbWNweShoVHAtPmFzYy0+bV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZywgbmV3Q29uZmlnLAorICAgICAgICAgICAgICAgICAgbmV3Q29uZmlnTGVuZ3RoKTsKKyAgICAgICAgLyogaW4gY2FzZSBvZiBVU0FDIHJlc2V0IHRyYW5zcG9ydERlY29kZXIgdmFyaWFibGVzIGhlcmUgYmVjYXVzZQorICAgICAgICAgKiBvdGhlcndpc2Ugd2l0aG91dCBJUEYgdGhleSBhcmUgbm90IHJlc2V0ICovCisgICAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hDbnQgPSAwOworICAgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmZsdXNoU3RhdHVzID0gVFBERUNfRkxVU0hfT0ZGOworICAgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmJ1aWxkVXBDbnQgPSAwOworICAgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmJ1aWxkVXBTdGF0dXMgPSBUUERFQ19CVUlMRF9VUF9PRkY7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0gMDsKKworICAgICAgLyogSWYgcGFyc2luZyBlcnJvciB3aGlsZSBjb25maWcgZm91bmQsIGNsZWFyIGN0cmxDRkdDaGFuZ2Utc3RydWN0ICovCisgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmZsdXNoQ250ID0gMDsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hTdGF0dXMgPSBUUERFQ19GTFVTSF9PRkY7CisgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmJ1aWxkVXBDbnQgPSAwOworICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5idWlsZFVwU3RhdHVzID0gVFBERUNfQlVJTERfVVBfT0ZGOworICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5jZmdDaGFuZ2VkID0gMDsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uY29udGVudENoYW5nZWQgPSAwOworICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mb3JjZUNmZ0NoYW5nZSA9IDA7CisKKyAgICAgIGhUcC0+Y2FsbGJhY2tzLmNiQ3RybENGR0NoYW5nZShoVHAtPmNhbGxiYWNrcy5jYkN0cmxDRkdDaGFuZ2VEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdKTsKKyAgICB9CisgIH0KKworICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSyAmJiBmQ29uZmlnRm91bmQpIHsKKyAgICBoVHAtPmZsYWdzIHw9IFRQREVDX0NPTkZJR19GT1VORDsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJBc2NDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlVwZGF0ZUNvbmZpZ190IGNiVXBkYXRlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgewogICBpZiAoaFRwRGVjID09IE5VTEwpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTI4OSw4ICs1NzAsMzAgQEAKICAgcmV0dXJuIDA7CiB9CiAKLWludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTc2NDYWxsYmFjayggSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsIGNvbnN0IGNiU3NjX3QgY2JTc2MsIHZvaWQqIHVzZXJfZGF0YSkKLXsKK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJGcmVlTWVtQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiRnJlZU1lbV90IGNiRnJlZU1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGlmIChoVHBEZWMgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBoVHBEZWMtPmNhbGxiYWNrcy5jYkZyZWVNZW0gPSBjYkZyZWVNZW07CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiRnJlZU1lbURhdGEgPSB1c2VyX2RhdGE7CisgIHJldHVybiAwOworfQorCitpbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyQ3RybENGR0NoYW5nZUNhbGxiYWNrKAorICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwRGVjLCBjb25zdCBjYkN0cmxDRkdDaGFuZ2VfdCBjYkN0cmxDRkdDaGFuZ2UsCisgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGlmIChoVHBEZWMgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBoVHBEZWMtPmNhbGxiYWNrcy5jYkN0cmxDRkdDaGFuZ2UgPSBjYkN0cmxDRkdDaGFuZ2U7CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiQ3RybENGR0NoYW5nZURhdGEgPSB1c2VyX2RhdGE7CisgIHJldHVybiAwOworfQorCitpbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyU3NjQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JTc2NfdCBjYlNzYywgdm9pZCAqdXNlcl9kYXRhKSB7CiAgIGlmIChoVHBEZWMgPT0gTlVMTCkgewogICAgIHJldHVybiAtMTsKICAgfQpAQCAtMjk5LDggKzYwMiw4IEBACiAgIHJldHVybiAwOwogfQogCi1pbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyU2JyQ2FsbGJhY2soIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwRGVjLCBjb25zdCBjYlNicl90IGNiU2JyLCB2b2lkKiB1c2VyX2RhdGEpCi17CitpbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyU2JyQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JTYnJfdCBjYlNiciwgdm9pZCAqdXNlcl9kYXRhKSB7CiAgIGlmIChoVHBEZWMgPT0gTlVMTCkgewogICAgIHJldHVybiAtMTsKICAgfQpAQCAtMzA5LDY1ICs2MTIsODYgQEAKICAgcmV0dXJuIDA7CiB9CiAKLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfRmlsbERhdGEoCi0gICAgICAgIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgIGhUcCwKLSAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAqcEJ1ZmZlciwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAqcEJ5dGVzVmFsaWQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGxheWVyICkKLXsKLSAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzOworaW50IHRyYW5zcG9ydERlY19SZWdpc3RlclVzYWNDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JVc2FjX3QgY2JVc2FjLCB2b2lkICp1c2VyX2RhdGEpIHsKKyAgaWYgKGhUcERlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiVXNhYyA9IGNiVXNhYzsKKyAgaFRwRGVjLT5jYWxsYmFja3MuY2JVc2FjRGF0YSA9IHVzZXJfZGF0YTsKKyAgcmV0dXJuIDA7Cit9CiAKLSAgaWYgKCAoaFRwID09IE5VTEwpCi0gICAgfHwgKGxheWVyID49IDIpICkgewotICAgIHJldHVybiBUUkFOU1BPUlRERUNfSU5WQUxJRF9QQVJBTUVURVI7CitpbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyVW5pRHJjQ29uZmlnQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JVbmlEcmNfdCBjYlVuaURyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqcExvdWRuZXNzSW5mb1NldFBvc2l0aW9uKSB7CisgIGlmIChoVHBEZWMgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKICAgfQogCi0gIGlmICgqcEJ5dGVzVmFsaWQgPT0gMCkgewotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgICByZXR1cm4gVFJBTlNQT1JUREVDX09LOworICBoVHBEZWMtPmNhbGxiYWNrcy5jYlVuaURyYyA9IGNiVW5pRHJjOworICBoVHBEZWMtPmNhbGxiYWNrcy5jYlVuaURyY0RhdGEgPSB1c2VyX2RhdGE7CisKKyAgaFRwRGVjLT5wTG91ZG5lc3NJbmZvU2V0UG9zaXRpb24gPSBwTG91ZG5lc3NJbmZvU2V0UG9zaXRpb247CisgIHJldHVybiAwOworfQorCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0ZpbGxEYXRhKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcEJ1ZmZlciwgY29uc3QgVUlOVCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwQnl0ZXNWYWxpZCwgY29uc3QgSU5UIGxheWVyKSB7CisgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCczsKKworICBpZiAoKGhUcCA9PSBOVUxMKSB8fCAobGF5ZXIgPj0gMSkpIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX0lOVkFMSURfUEFSQU1FVEVSOwogICB9CiAKICAgLyogc2V0IGJpdGJ1ZmZlciBzaG9ydGN1dCAqLwogICBoQnMgPSAmaFRwLT5iaXRTdHJlYW1bbGF5ZXJdOwogCi0gIGlmICggVFRfSVNfUEFDS0VUKGhUcC0+dHJhbnNwb3J0Rm10KSApIHsKKyAgaWYgKFRUX0lTX1BBQ0tFVChoVHAtPnRyYW5zcG9ydEZtdCkpIHsKICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPT0gMCkgewotICAgIC8qIEZvciBwYWNrZXQgYmFzZWQgdHJhbnNwb3J0LCBwYXNzIGlucHV0IGJ1ZmZlciB0byBiaXRidWZmZXIgd2l0aG91dCBjb3B5aW5nIHRoZSBkYXRhLgotICAgICAgIFVuZm9ydHVuYXRlbHkgd2UgZG8gbm90IGtub3cgdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gQW5kIHRoZSBGREsgYml0IGJ1ZmZlciBpbXBsZW1lbnRhdGlvbgotICAgICAgIG5lZWRzIGEgbnVtYmVyIDJeeC4gU28gd2UgYXNzdW1lIHRoZSBtYXhpbXVtIG9mIDQ4IGNoYW5uZWxzIHdpdGggNjE0NCBiaXRzIHBlciBjaGFubmVsCi0gICAgICAgYW5kIHJvdW5kIGl0IHVwIHRvIHRoZSBuZXh0IHBvd2VyIG9mIDIgPT4gNjU1MzYgYnl0ZXMgKi8KLSAgICBGREtpbml0Qml0U3RyZWFtKGhCcywgcEJ1ZmZlciwgMHgxMDAwMCwgKCpwQnl0ZXNWYWxpZCk8PDMsIEJTX1JFQURFUik7Ci0gICAgKnBCeXRlc1ZhbGlkID0gMDsKKyAgICAgIEZES3Jlc2V0Qml0YnVmZmVyKGhCcyk7CisgICAgICBGREtmZWVkQnVmZmVyKGhCcywgcEJ1ZmZlciwgYnVmZmVyU2l6ZSwgcEJ5dGVzVmFsaWQpOworICAgICAgaWYgKCpwQnl0ZXNWYWxpZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVE9PX01BTllfQklUUzsKKyAgICAgIH0KICAgICB9CiAgIH0gZWxzZSB7CiAgICAgLyogLi4uIGVsc2UgZmVlZCBiaXRidWZmZXIgd2l0aCBuZXcgc3RyZWFtIGRhdGEgKGFwcGVuZCkuICovCisKKyAgICBpZiAoKnBCeXRlc1ZhbGlkID09IDApIHsKKyAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7CisgICAgfQorCiAgICAgaWYgKGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzIDw9IDApIHsKLSAgICAgIEZES2ZlZWRCdWZmZXIgKGhCcywgcEJ1ZmZlciwgYnVmZmVyU2l6ZSwgcEJ5dGVzVmFsaWQpIDsKKyAgICAgIEZES2ZlZWRCdWZmZXIoaEJzLCBwQnVmZmVyLCBidWZmZXJTaXplLCBwQnl0ZXNWYWxpZCk7CiAgICAgfQogICB9CiAKICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKIH0KIAotSEFORExFX0ZES19CSVRTVFJFQU0gdHJhbnNwb3J0RGVjX0dldEJpdHN0cmVhbSggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IFVJTlQgbGF5ZXIgKQoteworSEFORExFX0ZES19CSVRTVFJFQU0gdHJhbnNwb3J0RGVjX0dldEJpdHN0cmVhbShjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsYXllcikgewogICByZXR1cm4gJmhUcC0+Yml0U3RyZWFtW2xheWVyXTsKIH0KIAotVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0RGVjX0dldEZvcm1hdCggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAgKQoteworVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0RGVjX0dldEZvcm1hdChjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCkgewogICByZXR1cm4gaFRwLT50cmFuc3BvcnRGbXQ7CiB9CiAKLUlOVCB0cmFuc3BvcnREZWNfR2V0QnVmZmVyRnVsbG5lc3MoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwICkKLXsKK0lOVCB0cmFuc3BvcnREZWNfR2V0QnVmZmVyRnVsbG5lc3MoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHApIHsKICAgSU5UIGJ1ZmZlckZ1bGxuZXNzID0gLTE7CiAKICAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgewogICAgIGNhc2UgVFRfTVA0X0FEVFM6CiAgICAgICBpZiAoaFRwLT5wYXJzZXIuYWR0cy5icy5hZHRzX2Z1bGxuZXNzICE9IDB4N2ZmKSB7Ci0gICAgICAgIGJ1ZmZlckZ1bGxuZXNzID0gaFRwLT5wYXJzZXIuYWR0cy5icy5mcmFtZV9sZW5ndGgqOCArIGhUcC0+cGFyc2VyLmFkdHMuYnMuYWR0c19mdWxsbmVzcyAqIDMyICogZ2V0TnVtYmVyT2ZFZmZlY3RpdmVDaGFubmVscyhoVHAtPnBhcnNlci5hZHRzLmJzLmNoYW5uZWxfY29uZmlnKTsKKyAgICAgICAgYnVmZmVyRnVsbG5lc3MgPSBoVHAtPnBhcnNlci5hZHRzLmJzLmZyYW1lX2xlbmd0aCAqIDggKworICAgICAgICAgICAgICAgICAgICAgICAgIGhUcC0+cGFyc2VyLmFkdHMuYnMuYWR0c19mdWxsbmVzcyAqIDMyICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TnVtYmVyT2ZFZmZlY3RpdmVDaGFubmVscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUcC0+cGFyc2VyLmFkdHMuYnMuY2hhbm5lbF9jb25maWcpOwogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgY2FzZSBUVF9NUDRfTE9BUzoKQEAgLTM4OSwzMSArNzEzLDM3IEBACiAgKiBccGFyYW0gaFRwIHRyYW5zcG9ydCBkZWNvZGVyIGhhbmRsZS4KICAqIFxyZXR1cm4gZXJyb3IgY29kZS4KICAqLwotc3RhdGljCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0FkanVzdEVuZE9mQWNjZXNzVW5pdChIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCkKLXsKK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0FkanVzdEVuZE9mQWNjZXNzVW5pdCgKKyAgICBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCkgewogICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmaFRwLT5iaXRTdHJlYW1bMF07CiAgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnIgPSBUUkFOU1BPUlRERUNfT0s7CiAKICAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgeworICAgIGNhc2UgVFRfTVA0X0FESUY6CisgICAgICAvKiBEbyBieXRlIGFsaWduIGF0IHRoZSBlbmQgb2YgcmF3X2RhdGFfYmxvY2soKSBiZWNhdXNlIFVzYWNGcmFtZSgpIGlzIG5vdAorICAgICAgICogYnl0ZSBhbGlnbmVkLiAqLworICAgICAgRkRLYnl0ZUFsaWduKGhCcywgaFRwLT5hY2Nlc3NVbml0QW5jaG9yWzBdKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgVFRfTVA0X0xPQVM6CiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgogICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKLSAgICAgIGlmICggaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPT0gMCApCi0gICAgICB7CisgICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPT0gMCkgewogICAgICAgICAvKiBEbyBieXRlIGFsaWduIGF0IHRoZSBlbmQgb2YgQXVkaW9NdXhFbGVtZW50LiAqLwogICAgICAgICBGREtieXRlQWxpZ24oaEJzLCBoVHAtPmdsb2JhbEZyYW1lUG9zKTsKIAogICAgICAgICAvKiBDaGVjayBnbG9iYWwgZnJhbWUgbGVuZ3RoICovCi0gICAgICAgIGlmIChoVHAtPnRyYW5zcG9ydEZtdCA9PSBUVF9NUDRfTE9BUyAmJiBoVHAtPnBhcnNlci5sYXRtLm1fYXVkaW9NdXhMZW5ndGhCeXRlcyA+IDApCi0gICAgICAgIHsKKyAgICAgICAgaWYgKGhUcC0+dHJhbnNwb3J0Rm10ID09IFRUX01QNF9MT0FTICYmCisgICAgICAgICAgICBoVHAtPnBhcnNlci5sYXRtLm1fYXVkaW9NdXhMZW5ndGhCeXRlcyA+IDApIHsKICAgICAgICAgICBpbnQgbG9hc09mZnNldDsKIAotICAgICAgICAgIGxvYXNPZmZzZXQgPSAoaFRwLT5wYXJzZXIubGF0bS5tX2F1ZGlvTXV4TGVuZ3RoQnl0ZXMqOCArIEZES2dldFZhbGlkQml0cyhoQnMpKSAtIGhUcC0+Z2xvYmFsRnJhbWVQb3M7CisgICAgICAgICAgbG9hc09mZnNldCA9IChoVHAtPnBhcnNlci5sYXRtLm1fYXVkaW9NdXhMZW5ndGhCeXRlcyAqIDggKworICAgICAgICAgICAgICAgICAgICAgICAgRkRLZ2V0VmFsaWRCaXRzKGhCcykpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgaFRwLT5nbG9iYWxGcmFtZVBvczsKICAgICAgICAgICBpZiAobG9hc09mZnNldCAhPSAwKSB7CiAgICAgICAgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsIGxvYXNPZmZzZXQpOwotICAgICAgICAgICAgLyogRm9yIEVMRCBhbmQgb3RoZXIgcGF5bG9hZHMgdGhlcmUgaXMgYW4gdW5rbm93biBhbW91bnQgb2YgcGFkZGluZywgc28gaWdub3JlIHVucmVhZCBiaXRzLCBidXQKLSAgICAgICAgICAgICAgIHRocm93IGFuIGVycm9yIG9ubHkgaWYgdG9vIG1hbnkgYml0cyB3aGVyZSByZWFkLiAqLworICAgICAgICAgICAgLyogRm9yIEVMRCBhbmQgb3RoZXIgcGF5bG9hZHMgdGhlcmUgaXMgYW4gdW5rbm93biBhbW91bnQgb2YgcGFkZGluZywKKyAgICAgICAgICAgICAgIHNvIGlnbm9yZSB1bnJlYWQgYml0cywgYnV0IHRocm93IGFuIGVycm9yIG9ubHkgaWYgdG9vIG1hbnkgYml0cworICAgICAgICAgICAgICAgd2hlcmUgcmVhZC4gKi8KICAgICAgICAgICAgIGlmIChsb2FzT2Zmc2V0IDwgMCkgewogICAgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CiAgICAgICAgICAgICB9CkBAIC00MjMsMjggKzc1MywzNCBAQAogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFRUX01QNF9BRFRTOgotICAgICAgaWYgKGhUcC0+cGFyc2VyLmFkdHMuYnMucHJvdGVjdGlvbl9hYnNlbnQgPT0gMCkKLSAgICAgIHsKKyAgICAgIGlmIChoVHAtPnBhcnNlci5hZHRzLmJzLnByb3RlY3Rpb25fYWJzZW50ID09IDApIHsKICAgICAgICAgaW50IG9mZnNldDsKIAogICAgICAgICAvKiBDYWxjdWxhdGUgb2Zmc2V0IHRvIGVuZCBvZiBBVSAqLwotICAgICAgICBvZmZzZXQgID0gaFRwLT5wYXJzZXIuYWR0cy5yYXdEYXRhQmxvY2tEaXN0W2hUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3Jhd19ibG9ja3MtaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3NdPDwzOwotICAgICAgICAvKiBDQVVUSU9OOiBUaGUgUENFIChpZiBhdmFpbGFibGUpIGlzIGRlY2xhcmVkIHRvIGJlIGEgcGFydCBvZiB0aGUgaGVhZGVyISAqLwotICAgICAgICBvZmZzZXQgLT0gaFRwLT5hY2Nlc3NVbml0QW5jaG9yWzBdIC0gRkRLZ2V0VmFsaWRCaXRzKGhCcykgKyAxNiArIGhUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3BjZV9iaXRzOworICAgICAgICBvZmZzZXQgPSBoVHAtPnBhcnNlci5hZHRzCisgICAgICAgICAgICAgICAgICAgICAucmF3RGF0YUJsb2NrRGlzdFtoVHAtPnBhcnNlci5hZHRzLmJzLm51bV9yYXdfYmxvY2tzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzXQorICAgICAgICAgICAgICAgICA8PCAzOworICAgICAgICAvKiBDQVVUSU9OOiBUaGUgUENFIChpZiBhdmFpbGFibGUpIGlzIGRlY2xhcmVkIHRvIGJlIGEgcGFydCBvZiB0aGUKKyAgICAgICAgICogaGVhZGVyISAqLworICAgICAgICBvZmZzZXQgLT0gKElOVCloVHAtPmFjY2Vzc1VuaXRBbmNob3JbMF0gLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpICsKKyAgICAgICAgICAgICAgICAgIDE2ICsgaFRwLT5wYXJzZXIuYWR0cy5icy5udW1fcGNlX2JpdHM7CiAgICAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgb2Zmc2V0KTsKICAgICAgIH0KLSAgICAgIGlmIChoVHAtPnBhcnNlci5hZHRzLmJzLm51bV9yYXdfYmxvY2tzID4gMCAmJiBoVHAtPnBhcnNlci5hZHRzLmJzLnByb3RlY3Rpb25fYWJzZW50ID09IDApIHsKLSAgICAgICAgLyogTm90ZSB0aGlzIENSQyByZWFkIGN1cnJlbnRseSBoYXBwZW5zIHR3aWNlIGJlY2F1c2Ugb2YgdHJhbnNwb3J0RGVjX0NyY0NoZWNrKCkgKi8KKyAgICAgIGlmIChoVHAtPnBhcnNlci5hZHRzLmJzLm51bV9yYXdfYmxvY2tzID4gMCAmJgorICAgICAgICAgIGhUcC0+cGFyc2VyLmFkdHMuYnMucHJvdGVjdGlvbl9hYnNlbnQgPT0gMCkgeworICAgICAgICAvKiBOb3RlIHRoaXMgQ1JDIHJlYWQgY3VycmVudGx5IGhhcHBlbnMgdHdpY2UgYmVjYXVzZSBvZgorICAgICAgICAgKiB0cmFuc3BvcnREZWNfQ3JjQ2hlY2soKSAqLwogICAgICAgICBoVHAtPnBhcnNlci5hZHRzLmNyY1JlYWRWYWx1ZSA9IEZES3JlYWRCaXRzKGhCcywgMTYpOwogICAgICAgfQotICAgICAgaWYgKCBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9PSAwICkKLSAgICAgIHsKKyAgICAgIGlmIChoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9PSAwKSB7CiAgICAgICAgIC8qIENoZWNrIGdsb2JhbCBmcmFtZSBsZW5ndGggKi8KLSAgICAgICAgaWYgKGhUcC0+cGFyc2VyLmFkdHMuYnMucHJvdGVjdGlvbl9hYnNlbnQgPT0gMCkKLSAgICAgICAgeworICAgICAgICBpZiAoaFRwLT5wYXJzZXIuYWR0cy5icy5wcm90ZWN0aW9uX2Fic2VudCA9PSAwKSB7CiAgICAgICAgICAgaW50IG9mZnNldDsKIAotICAgICAgICAgIG9mZnNldCA9IChoVHAtPnBhcnNlci5hZHRzLmJzLmZyYW1lX2xlbmd0aCo4IC0gQURUU19TWU5DTEVOR1RIICsgRkRLZ2V0VmFsaWRCaXRzKGhCcykpIC0gaFRwLT5nbG9iYWxGcmFtZVBvczsKKyAgICAgICAgICBvZmZzZXQgPSAoaFRwLT5wYXJzZXIuYWR0cy5icy5mcmFtZV9sZW5ndGggKiA4IC0gQURUU19TWU5DTEVOR1RIICsKKyAgICAgICAgICAgICAgICAgICAgKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSkgLQorICAgICAgICAgICAgICAgICAgIChJTlQpaFRwLT5nbG9iYWxGcmFtZVBvczsKICAgICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKICAgICAgICAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgb2Zmc2V0KTsKICAgICAgICAgICB9CkBAIC00NTksNDEgKzc5NSwzOSBAQAogICByZXR1cm4gZXJyOwogfQogCi0KIC8qKgotICogXGJyaWVmIERldGVybWluZSBhZGRpdGlvbmFsIGJ1ZmZlciBmdWxsbmVzcyBjb250cmFpbnQgZHVlIHRvIGJ1cnN0IGRhdGEgcmVjZXB0aW9uLgotICogICAgICAgIFRoZSBwYXJhbWV0ZXIgVFBERUNfUEFSQU1fQlVSU1RQRVJJT0QgbXVzdCBoYXZlIGJlZW4gc2V0IGFzIGEgcHJlY29uZGl0aW9uLgorICogXGJyaWVmIERldGVybWluZSBhZGRpdGlvbmFsIGJ1ZmZlciBmdWxsbmVzcyBjb250cmFpbnQgZHVlIHRvIGJ1cnN0IGRhdGEKKyAqIHJlY2VwdGlvbi4gVGhlIHBhcmFtZXRlciBUUERFQ19QQVJBTV9CVVJTVFBFUklPRCBtdXN0IGhhdmUgYmVlbiBzZXQgYXMgYQorICogcHJlY29uZGl0aW9uLgogICogXHBhcmFtIGhUcCB0cmFuc3BvcnQgZGVjb2RlciBoYW5kbGUuCi0gKiBccGFyYW0gYnVmZmVyRnVsbG5lc3MgdGhlIGJ1ZmZlciBmdWxsbmVzcyB2YWx1ZSBvZiB0aGUgZmlyc3QgZnJhbWUgdG8gYmUgZGVjb2RlZC4KLSAqIFxwYXJhbSBiaXRzQXZhaWwgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgYml0cyBhdCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBmcmFtZSB0byBiZSBkZWNvZGVkLgorICogXHBhcmFtIGJ1ZmZlckZ1bGxuZXNzIHRoZSBidWZmZXIgZnVsbG5lc3MgdmFsdWUgb2YgdGhlIGZpcnN0IGZyYW1lIHRvIGJlCisgKiBkZWNvZGVkLgorICogXHBhcmFtIGJpdHNBdmFpbCB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBiaXRzIGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IGZyYW1lCisgKiB0byBiZSBkZWNvZGVkLgogICogXHJldHVybiBlcnJvciBjb2RlCiAgKi8KLXN0YXRpYyAKLVRSQU5TUE9SVERFQ19FUlJPUiBhZGRpdGlvbmFsSG9sZE9mZk5lZWRlZCgKLSAgICAgICAgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgYnVmZmVyRnVsbG5lc3MsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgYml0c0F2YWlsCi0gICAgICAgICkKLXsKK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgYWRkaXRpb25hbEhvbGRPZmZOZWVkZWQoSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBidWZmZXJGdWxsbmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHNBdmFpbCkgewogICBJTlQgY2hlY2tMZW5ndGhCaXRzLCBhdmdCaXRzUGVyRnJhbWU7CiAgIElOVCBtYXhBVTsgLyogbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHBlciBNYXN0ZXIgRnJhbWUgKi8KICAgSU5UIHNhbXBsZXNQZXJGcmFtZSA9IGhUcC0+YXNjLT5tX3NhbXBsZXNQZXJGcmFtZTsKICAgSU5UIHNhbXBsaW5nRnJlcXVlbmN5ID0gKElOVCloVHAtPmFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKIAotICBpZiAoIChoVHAtPmF2Z0JpdFJhdGUgPT0gMCkgfHwgKGhUcC0+YnVyc3RQZXJpb2QgPT0gMCkgKSB7CisgIGlmICgoaFRwLT5hdmdCaXRSYXRlID09IDApIHx8IChoVHAtPmJ1cnN0UGVyaW9kID09IDApKSB7CiAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKICAgfQotICBpZiAoIChzYW1wbGVzUGVyRnJhbWUgPT0gMCApIHx8IChzYW1wbGluZ0ZyZXF1ZW5jeSA9PSAwKSApIHsKKyAgaWYgKChzYW1wbGVzUGVyRnJhbWUgPT0gMCkgfHwgKHNhbXBsaW5nRnJlcXVlbmN5ID09IDApKSB7CiAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM7CiAgIH0KIAogICAvKiBPbmUgTWFzdGVyIEZyYW1lIGlzIHNlbnQgZXZlcnkgaFRwLT5idXJzdFBlcmlvZCBtcyAqLwotICBtYXhBVSA9IGhUcC0+YnVyc3RQZXJpb2QgKiBzYW1wbGluZ0ZyZXF1ZW5jeSArIChzYW1wbGVzUGVyRnJhbWUqMTAwMCAtIDEpOwotICBtYXhBVSA9IG1heEFVIC8gKHNhbXBsZXNQZXJGcmFtZSoxMDAwKTsKKyAgbWF4QVUgPSBoVHAtPmJ1cnN0UGVyaW9kICogc2FtcGxpbmdGcmVxdWVuY3kgKyAoc2FtcGxlc1BlckZyYW1lICogMTAwMCAtIDEpOworICBtYXhBVSA9IG1heEFVIC8gKHNhbXBsZXNQZXJGcmFtZSAqIDEwMDApOwogICAvKiBTdWJ0cmFjdCBudW1iZXIgb2YgZnJhbWVzIHdoaWNoIHdlcmUgYWxyZWFkeSBoZWxkIG9mZi4gKi8KICAgbWF4QVUgLT0gaFRwLT5ob2xkT2ZmRnJhbWVzOwogCi0gIGF2Z0JpdHNQZXJGcmFtZSA9IGhUcC0+YXZnQml0UmF0ZSAqIHNhbXBsZXNQZXJGcmFtZSArIChzYW1wbGluZ0ZyZXF1ZW5jeS0xKTsKKyAgYXZnQml0c1BlckZyYW1lID0gaFRwLT5hdmdCaXRSYXRlICogc2FtcGxlc1BlckZyYW1lICsgKHNhbXBsaW5nRnJlcXVlbmN5IC0gMSk7CiAgIGF2Z0JpdHNQZXJGcmFtZSA9IGF2Z0JpdHNQZXJGcmFtZSAvIHNhbXBsaW5nRnJlcXVlbmN5OwogCiAgIC8qIENvbnNpZGVyIHdvcnN0IGNhc2Ugb2YgYnVmZmVyRnVsbG5lc3MgcXVhbnRpemF0aW9uLiAqLwpAQCAtNTA1LDQxICs4MzksMzUgQEAKICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CiAgICAgICBidWZmZXJGdWxsbmVzcyArPSAzMTsKICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAvKiBhZGRlZCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nICovCisgICAgICBicmVhazsgLyogYWRkZWQgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyAqLwogICB9CiAKLSAgY2hlY2tMZW5ndGhCaXRzID0gYnVmZmVyRnVsbG5lc3MgKyAobWF4QVUtMSkqYXZnQml0c1BlckZyYW1lOworICBjaGVja0xlbmd0aEJpdHMgPSBidWZmZXJGdWxsbmVzcyArIChtYXhBVSAtIDEpICogYXZnQml0c1BlckZyYW1lOwogCiAgIC8qIENoZWNrIGlmIGJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIGZ1bGxmaWxsIGJ1ZmZlciBmdWxsbmVzcyBjb25kaXRpb24gKi8KLSAgaWYgKCAoY2hlY2tMZW5ndGhCaXRzIC8qK2hlYWRlckJpdHMqLykgPiAoKFRSQU5TUE9SVERFQ19JTkJVRl9TSVpFPDwzKS03KSApIHsKKyAgaWYgKChjaGVja0xlbmd0aEJpdHMgLyoraGVhZGVyQml0cyovKSA+ICgoKDgxOTIgKiA0KSA8PCAzKSAtIDcpKSB7CiAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOwogICB9CiAKLSAgaWYgKCBiaXRzQXZhaWwgPCBjaGVja0xlbmd0aEJpdHMgKSB7CisgIGlmIChiaXRzQXZhaWwgPCBjaGVja0xlbmd0aEJpdHMpIHsKICAgICByZXR1cm4gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUzsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICByZXR1cm4gVFJBTlNQT1JUREVDX09LOwogICB9CiB9CiAKIHN0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX3JlYWRIZWFkZXIoCi0gICAgICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIGludCBzeW5jTGVuZ3RoLAotICAgICAgICBpbnQgaWdub3JlQnVmZmVyRnVsbG5lc3MsCi0gICAgICAgIGludCAqcFJhd0RhdGFCbG9ja0xlbmd0aCwKLSAgICAgICAgaW50ICpwZlRyYXZlcnNlTW9yZUZyYW1lcywKLSAgICAgICAgaW50ICpwU3luY0xheWVyRnJhbWVCaXRzLAotICAgICAgICBpbnQgKnBmQ29uZmlnRm91bmQsCi0gICAgICAgIGludCAqcEhlYWRlckJpdHMKLSAgICAgICAgKQoteworICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGludCBzeW5jTGVuZ3RoLAorICAgIGludCBpZ25vcmVCdWZmZXJGdWxsbmVzcywgaW50ICpwUmF3RGF0YUJsb2NrTGVuZ3RoLAorICAgIGludCAqcGZUcmF2ZXJzZU1vcmVGcmFtZXMsIGludCAqcFN5bmNMYXllckZyYW1lQml0cywgaW50ICpwZkNvbmZpZ0ZvdW5kLAorICAgIGludCAqcEhlYWRlckJpdHMpIHsKICAgVFJBTlNQT1JUREVDX0VSUk9SIGVyciA9IFRSQU5TUE9SVERFQ19PSzsKICAgaW50IHJhd0RhdGFCbG9ja0xlbmd0aCA9ICpwUmF3RGF0YUJsb2NrTGVuZ3RoOwotICBpbnQgZlRyYXZlcnNlTW9yZUZyYW1lcyA9IChwZlRyYXZlcnNlTW9yZUZyYW1lcyAhPSBOVUxMKSA/ICpwZlRyYXZlcnNlTW9yZUZyYW1lcyA6IDA7Ci0gIGludCBzeW5jTGF5ZXJGcmFtZUJpdHMgPSAocFN5bmNMYXllckZyYW1lQml0cyAhPSBOVUxMKSA/ICpwU3luY0xheWVyRnJhbWVCaXRzIDogMDsKKyAgaW50IGZUcmF2ZXJzZU1vcmVGcmFtZXMgPQorICAgICAgKHBmVHJhdmVyc2VNb3JlRnJhbWVzICE9IE5VTEwpID8gKnBmVHJhdmVyc2VNb3JlRnJhbWVzIDogMDsKKyAgaW50IHN5bmNMYXllckZyYW1lQml0cyA9CisgICAgICAocFN5bmNMYXllckZyYW1lQml0cyAhPSBOVUxMKSA/ICpwU3luY0xheWVyRnJhbWVCaXRzIDogMDsKICAgaW50IGZDb25maWdGb3VuZCA9IChwZkNvbmZpZ0ZvdW5kICE9IE5VTEwpID8gKnBmQ29uZmlnRm91bmQgOiAwOwogICBpbnQgc3RhcnRQb3M7CiAKQEAgLTU0Nyw0NiArODc1LDc0IEBACiAKICAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgewogICAgIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPD0gMCkKLSAgICAgIHsKLSAgICAgICAgaW50IGVyckM7CisgICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPD0gMCkgeworICAgICAgICBpbnQgaSwgZXJyQzsKIAogICAgICAgICBoVHAtPmdsb2JhbEZyYW1lUG9zID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAKLSAgICAgICAgLyogUGFyc2UgQURUUyBoZWFkZXIgKi8KLSAgICAgICAgZXJyID0gYWR0c1JlYWRfRGVjb2RlSGVhZGVyKCAmaFRwLT5wYXJzZXIuYWR0cywgJmhUcC0+YXNjWzBdLCBoQnMsIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzICk7Ci0gICAgICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7Ci0gICAgICAgICAgaWYgKGVyciAhPSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTKSB7Ci0gICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUjsKKyAgICAgICAgVUNIQVIgY29uZmlnQ2hhbmdlZCA9IDA7CisgICAgICAgIFVDSEFSIGNvbmZpZ01vZGUgPSBBQ19DTV9ERVRfQ0ZHX0NIQU5HRTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBGREtwdXNoQmFjayhoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKWhUcC0+Z2xvYmFsRnJhbWVQb3MgLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpKTsKKyAgICAgICAgICAgIGNvbmZpZ01vZGUgPSBBQ19DTV9BTExPQ19NRU07CiAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGVyckMgPSBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZyhoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZ0RhdGEsICZoVHAtPmFzY1swXSk7Ci0gICAgICAgICAgaWYgKGVyckMgIT0gMCkgewotICAgICAgICAgICAgaWYgKGVyckMgPT0gVFJBTlNQT1JUREVDX05FRURfVE9fUkVTVEFSVCkgewotICAgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUOwotICAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgLyogUGFyc2UgQURUUyBoZWFkZXIgKi8KKyAgICAgICAgICBlcnIgPSBhZHRzUmVhZF9EZWNvZGVIZWFkZXIoJmhUcC0+cGFyc2VyLmFkdHMsICZoVHAtPmFzY1swXSwgaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVCdWZmZXJGdWxsbmVzcyk7CisgICAgICAgICAgaWYgKGVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUykgewogICAgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZkNvbmZpZ0ZvdW5kID0gMTsKLSAgICAgICAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0gaFRwLT5wYXJzZXIuYWR0cy5icy5udW1fcmF3X2Jsb2NrcysxOworICAgICAgICAgICAgZXJyQyA9IGhUcC0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnKAorICAgICAgICAgICAgICAgIGhUcC0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnRGF0YSwgJmhUcC0+YXNjWzBdLCBjb25maWdNb2RlLAorICAgICAgICAgICAgICAgICZjb25maWdDaGFuZ2VkKTsKKyAgICAgICAgICAgIGlmIChlcnJDICE9IDApIHsKKyAgICAgICAgICAgICAgaWYgKGVyckMgPT0gVFJBTlNQT1JUREVDX05FRURfVE9fUkVTVEFSVCkgeworICAgICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19ORUVEX1RPX1JFU1RBUlQ7CisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBmQ29uZmlnRm91bmQgPSAxOworICAgICAgICAgICAgICBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9CisgICAgICAgICAgICAgICAgICBoVHAtPnBhcnNlci5hZHRzLmJzLm51bV9yYXdfYmxvY2tzICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICAgICAgaWYgKChpID09IDApICYmIGNvbmZpZ0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgZXJyQyA9IGhUcC0+Y2FsbGJhY2tzLmNiRnJlZU1lbShoVHAtPmNhbGxiYWNrcy5jYkZyZWVNZW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVHAtPmFzY1swXSk7CisgICAgICAgICAgICAgIGlmIChlcnJDICE9IDApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAvKiBSZXNldCBDUkMgYmVjYXVzZSB0aGUgbmV4dCBiaXRzIGFyZSB0aGUgYmVnaW5uaW5nIG9mIGEgcmF3X2RhdGFfYmxvY2soKSAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUmVzZXQgQ1JDIGJlY2F1c2UgdGhlIG5leHQgYml0cyBhcmUgdGhlIGJlZ2lubmluZyBvZiBhCisgICAgICAgICAqIHJhd19kYXRhX2Jsb2NrKCkgKi8KICAgICAgICAgRkRLY3JjUmVzZXQoJmhUcC0+cGFyc2VyLmFkdHMuY3JjSW5mbyk7CiAgICAgICAgIGhUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3BjZV9iaXRzID0gMDsKICAgICAgIH0KICAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CiAgICAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzLS07Ci0gICAgICAgIHJhd0RhdGFCbG9ja0xlbmd0aCA9IGFkdHNSZWFkX0dldFJhd0RhdGFCbG9ja0xlbmd0aCgmaFRwLT5wYXJzZXIuYWR0cywgKGhUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3Jhd19ibG9ja3MtaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MpKTsKKyAgICAgICAgcmF3RGF0YUJsb2NrTGVuZ3RoID0gYWR0c1JlYWRfR2V0UmF3RGF0YUJsb2NrTGVuZ3RoKAorICAgICAgICAgICAgJmhUcC0+cGFyc2VyLmFkdHMsCisgICAgICAgICAgICAoaFRwLT5wYXJzZXIuYWR0cy5icy5udW1fcmF3X2Jsb2NrcyAtIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzKSk7CiAgICAgICAgIGlmIChyYXdEYXRhQmxvY2tMZW5ndGggPD0gMCkgewogICAgICAgICAgIC8qIE5vIGZ1cnRoZXIgZnJhbWUgdHJhdmVyc2FsIHBvc3NpYmxlLiAqLwogICAgICAgICAgIGZUcmF2ZXJzZU1vcmVGcmFtZXMgPSAwOwogICAgICAgICB9Ci0gICAgICAgIHN5bmNMYXllckZyYW1lQml0cyA9IChoVHAtPnBhcnNlci5hZHRzLmJzLmZyYW1lX2xlbmd0aDw8MykgLSAoc3RhcnRQb3MgLSBGREtnZXRWYWxpZEJpdHMoaEJzKSkgLSBzeW5jTGVuZ3RoOworICAgICAgICBzeW5jTGF5ZXJGcmFtZUJpdHMgPSAoaFRwLT5wYXJzZXIuYWR0cy5icy5mcmFtZV9sZW5ndGggPDwgMykgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElOVClzdGFydFBvcyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY0xlbmd0aDsKICAgICAgICAgaWYgKHN5bmNMYXllckZyYW1lQml0cyA8PSAwKSB7CiAgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CiAgICAgICAgIH0KQEAgLTU5NSwzNSArOTUxLDMwIEBACiAgICAgICB9CiAgICAgICBicmVhazsKICAgICBjYXNlIFRUX01QNF9MT0FTOgotICAgICAgaWYgKGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzIDw9IDApCi0gICAgICB7CisgICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPD0gMCkgewogICAgICAgICBzeW5jTGF5ZXJGcmFtZUJpdHMgPSBGREtyZWFkQml0cyhoQnMsIDEzKTsKICAgICAgICAgaFRwLT5wYXJzZXIubGF0bS5tX2F1ZGlvTXV4TGVuZ3RoQnl0ZXMgPSBzeW5jTGF5ZXJGcmFtZUJpdHM7CiAgICAgICAgIHN5bmNMYXllckZyYW1lQml0cyA8PD0gMzsKICAgICAgIH0KICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgotICAgICAgaWYgKGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzIDw9IDApCi0gICAgICB7CisgICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPD0gMCkgewogICAgICAgICBoVHAtPmdsb2JhbEZyYW1lUG9zID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAKLSAgICAgICAgZXJyID0gQ0xhdG1EZW11eF9SZWFkKAotICAgICAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgICAgICZoVHAtPnBhcnNlci5sYXRtLAotICAgICAgICAgICAgICAgIGhUcC0+dHJhbnNwb3J0Rm10LAotICAgICAgICAgICAgICAgJmhUcC0+Y2FsbGJhY2tzLAotICAgICAgICAgICAgICAgIGhUcC0+YXNjLAotICAgICAgICAgICAgICAgJmZDb25maWdGb3VuZCwKLSAgICAgICAgICAgICAgICBpZ25vcmVCdWZmZXJGdWxsbmVzcyk7CisgICAgICAgIGVyciA9IENMYXRtRGVtdXhfUmVhZChoQnMsICZoVHAtPnBhcnNlci5sYXRtLCBoVHAtPnRyYW5zcG9ydEZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVHAtPmNhbGxiYWNrcywgaFRwLT5hc2MsICZmQ29uZmlnRm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVCdWZmZXJGdWxsbmVzcyk7CiAKICAgICAgICAgaWYgKGVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKLSAgICAgICAgICBpZiAoZXJyICE9IFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMpIHsKKyAgICAgICAgICBpZiAoKGVyciAhPSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTKSAmJgorICAgICAgICAgICAgICAhVFBERUNfSVNfRkFUQUxfRVJST1IoZXJyKSkgewogICAgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CiAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0gQ0xhdG1EZW11eF9HZXROck9mU3ViRnJhbWVzKCZoVHAtPnBhcnNlci5sYXRtKTsKKyAgICAgICAgICBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9CisgICAgICAgICAgICAgIENMYXRtRGVtdXhfR2V0TnJPZlN1YkZyYW1lcygmaFRwLT5wYXJzZXIubGF0bSk7CiAgICAgICAgICAgaWYgKGhUcC0+dHJhbnNwb3J0Rm10ID09IFRUX01QNF9MT0FTKSB7Ci0gICAgICAgICAgICBzeW5jTGF5ZXJGcmFtZUJpdHMgLT0gc3RhcnRQb3MgLSBGREtnZXRWYWxpZEJpdHMoaEJzKSAtICgxMyk7ICAgICAgICAgICAgCisgICAgICAgICAgICBzeW5jTGF5ZXJGcmFtZUJpdHMgLT0gc3RhcnRQb3MgLSBGREtnZXRWYWxpZEJpdHMoaEJzKSAtICgxMyk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGVsc2UgewpAQCAtNjMzLDE3ICs5ODQsMjAgQEAKICAgICAgICAgfQogICAgICAgfQogICAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKLSAgICAgICAgcmF3RGF0YUJsb2NrTGVuZ3RoID0gQ0xhdG1EZW11eF9HZXRGcmFtZUxlbmd0aEluQml0cygmaFRwLT5wYXJzZXIubGF0bSk7CisgICAgICAgIGludCBsYXllcjsKKyAgICAgICAgcmF3RGF0YUJsb2NrTGVuZ3RoID0gMDsKKyAgICAgICAgZm9yIChsYXllciA9IDA7CisgICAgICAgICAgICAgbGF5ZXIgPCAoaW50KUNMYXRtRGVtdXhfR2V0TnJPZkxheWVycygmaFRwLT5wYXJzZXIubGF0bSwgMCk7CisgICAgICAgICAgICAgbGF5ZXIgKz0gMSkgeworICAgICAgICAgIHJhd0RhdGFCbG9ja0xlbmd0aCArPQorICAgICAgICAgICAgICBDTGF0bURlbXV4X0dldEZyYW1lTGVuZ3RoSW5CaXRzKCZoVHAtPnBhcnNlci5sYXRtLCAwLCBsYXllcik7CisgICAgICAgIH0KICAgICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MtLTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0gMDsKICAgICAgIH0KICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0gICAgICAgIHN5bmNMYXllckZyYW1lQml0cyA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKyAgICBkZWZhdWx0OiB7IHN5bmNMYXllckZyYW1lQml0cyA9IDA7IH0gYnJlYWs7CiAgIH0KIAogYmFpbDoKQEAgLTY1Myw2ICsxMDA3LDI0IEBACiAgIGlmIChwSGVhZGVyQml0cyAhPSBOVUxMKSB7CiAgICAgKnBIZWFkZXJCaXRzICs9IHN0YXJ0UG9zIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKICAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgKDEgKiAxKTsgaSsrKSB7CisgICAgLyogSWYgcGFyc2luZyBlcnJvciB3aGlsZSBjb25maWcgZm91bmQsIGNsZWFyIGN0cmxDRkdDaGFuZ2Utc3RydWN0ICovCisgICAgaWYgKGhUcC0+Y3RybENGR0NoYW5nZVtpXS5jZmdDaGFuZ2VkICYmIGVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0gMDsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtpXS5mbHVzaENudCA9IDA7CisgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbaV0uZmx1c2hTdGF0dXMgPSBUUERFQ19GTFVTSF9PRkY7CisgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbaV0uYnVpbGRVcENudCA9IDA7CisgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbaV0uYnVpbGRVcFN0YXR1cyA9IFRQREVDX0JVSUxEX1VQX09GRjsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtpXS5jZmdDaGFuZ2VkID0gMDsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtpXS5jb250ZW50Q2hhbmdlZCA9IDA7CisgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbaV0uZm9yY2VDZmdDaGFuZ2UgPSAwOworCisgICAgICBoVHAtPmNhbGxiYWNrcy5jYkN0cmxDRkdDaGFuZ2UoaFRwLT5jYWxsYmFja3MuY2JDdHJsQ0ZHQ2hhbmdlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFRwLT5jdHJsQ0ZHQ2hhbmdlW2ldKTsKKyAgICB9CisgIH0KKwogICBpZiAocGZDb25maWdGb3VuZCAhPSBOVUxMKSB7CiAgICAgKnBmQ29uZmlnRm91bmQgPSBmQ29uZmlnRm91bmQ7CiAgIH0KQEAgLTY2MCwxMiArMTAzMiw5IEBACiAgIGlmIChwZlRyYXZlcnNlTW9yZUZyYW1lcyAhPSBOVUxMKSB7CiAgICAgKnBmVHJhdmVyc2VNb3JlRnJhbWVzID0gZlRyYXZlcnNlTW9yZUZyYW1lczsKICAgfQotICBpZiAgKHBTeW5jTGF5ZXJGcmFtZUJpdHMgIT0gTlVMTCkgeworICBpZiAocFN5bmNMYXllckZyYW1lQml0cyAhPSBOVUxMKSB7CiAgICAgKnBTeW5jTGF5ZXJGcmFtZUJpdHMgPSBzeW5jTGF5ZXJGcmFtZUJpdHM7CiAgIH0KLSAgaWYgKHBmQ29uZmlnRm91bmQgIT0gTlVMTCkgewotICAgICpwZkNvbmZpZ0ZvdW5kID0gZkNvbmZpZ0ZvdW5kOwotICB9CiAKICAgcmV0dXJuIGVycjsKIH0KQEAgLTY3MywxMiArMTA0Miw4IEBACiAvKiBIb3cgbWFueSBiaXRzIHRvIGFkdmFuY2UgZm9yIHN5bmNocm9uaXphdGlvbiBzZWFyY2guICovCiAjZGVmaW5lIFRQREVDX1NZTkNTS0lQIDgKIAotc3RhdGljCi1UUkFOU1BPUlRERUNfRVJST1Igc3luY2hyb25pemF0aW9uKAotICAgICAgICBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICpwSGVhZGVyQml0cwotICAgICAgICApCi17CitzdGF0aWMgVFJBTlNQT1JUREVDX0VSUk9SIHN5bmNocm9uaXphdGlvbihIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcEhlYWRlckJpdHMpIHsKICAgVFJBTlNQT1JUREVDX0VSUk9SIGVyciA9IFRSQU5TUE9SVERFQ19PSywgZXJyRmlyc3RGcmFtZSA9IFRSQU5TUE9SVERFQ19PSzsKICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gJmhUcC0+Yml0U3RyZWFtWzBdOwogCkBAIC02ODYsMTQgKzEwNTEsMjAgQEAKICAgSU5UIHJhd0RhdGFCbG9ja0xlbmd0aCA9IDAsIHJhd0RhdGFCbG9ja0xlbmd0aFByZXZpb3VzOwogICBJTlQgdG90YWxCaXRzOwogICBJTlQgaGVhZGVyQml0cyA9IDAsIGhlYWRlckJpdHNGaXJzdEZyYW1lID0gMCwgaGVhZGVyQml0c1ByZXZpb3VzOwotICBJTlQgbnVtRnJhbWVzVHJhdmVyc2VkID0gMCwgZlRyYXZlcnNlTW9yZUZyYW1lcywgZkNvbmZpZ0ZvdW5kID0gKGhUcC0+ZmxhZ3MgJiBUUERFQ19DT05GSUdfRk9VTkQpLCBzdGFydFBvc0ZpcnN0RnJhbWUgPSAtMTsKLSAgSU5UIG51bVJhd0RhdGFCbG9ja3NGaXJzdEZyYW1lID0gMCwgbnVtUmF3RGF0YUJsb2Nrc1ByZXZpb3VzLCBnbG9iYWxGcmFtZVBvc0ZpcnN0RnJhbWUgPSAwLCByYXdEYXRhQmxvY2tMZW5ndGhGaXJzdEZyYW1lID0gMDsKLSAgSU5UIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzID0gaFRwLT5mbGFncyAmIChUUERFQ19MT1NUX0ZSQU1FU19QRU5ESU5HfFRQREVDX0lHTk9SRV9CVUZGRVJGVUxMTkVTU3xUUERFQ19TWU5DT0spOworICBJTlQgbnVtRnJhbWVzVHJhdmVyc2VkID0gMCwgZlRyYXZlcnNlTW9yZUZyYW1lcywKKyAgICAgIGZDb25maWdGb3VuZCA9IChoVHAtPmZsYWdzICYgVFBERUNfQ09ORklHX0ZPVU5EKSwgc3RhcnRQb3NGaXJzdEZyYW1lID0gLTE7CisgIElOVCBudW1SYXdEYXRhQmxvY2tzRmlyc3RGcmFtZSA9IDAsIG51bVJhd0RhdGFCbG9ja3NQcmV2aW91cywKKyAgICAgIGdsb2JhbEZyYW1lUG9zRmlyc3RGcmFtZSA9IDAsIHJhd0RhdGFCbG9ja0xlbmd0aEZpcnN0RnJhbWUgPSAwOworICBJTlQgaWdub3JlQnVmZmVyRnVsbG5lc3MgPQorICAgICAgaFRwLT5mbGFncyAmCisgICAgICAoVFBERUNfTE9TVF9GUkFNRVNfUEVORElORyB8IFRQREVDX0lHTk9SRV9CVUZGRVJGVUxMTkVTUyB8IFRQREVDX1NZTkNPSyk7CisgIFVJTlQgZW5kVHBGcmFtZUJpdHNQcmV2aW91cyA9IDA7CiAKICAgLyogU3luY2ggcGFyYW1ldGVycyAqLwotICBJTlQgc3luY0xlbmd0aDsgICAgICAvKiBMZW5ndGggb2Ygc3luYyB3b3JkIGluIGJpdHMgKi8KLSAgVUlOVCBzeW5jV29yZDsgICAgICAgLyogU3luYyB3b3JkIHRvIGJlIGZvdW5kICovCi0gIFVJTlQgc3luY01hc2s7ICAgICAgIC8qIE1hc2sgZm9yIHN5bmMgd29yZCAoZm9yIGFkZGluZyBvbmUgYml0LCBzbyBjb21wcmlzaW5nIG9uZSBiaXQgbGVzcykgKi8KKyAgSU5UIHN5bmNMZW5ndGg7IC8qIExlbmd0aCBvZiBzeW5jIHdvcmQgaW4gYml0cyAqLworICBVSU5UIHN5bmNXb3JkOyAgLyogU3luYyB3b3JkIHRvIGJlIGZvdW5kICovCisgIFVJTlQgc3luY01hc2s7ICAvKiBNYXNrIGZvciBzeW5jIHdvcmQgKGZvciBhZGRpbmcgb25lIGJpdCwgc28gY29tcHJpc2luZyBvbmUKKyAgICAgICAgICAgICAgICAgICAgIGJpdCBsZXNzKSAqLwogICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoY29udGV4dEZpcnN0RnJhbWUsIHRyYW5zcG9ydGRlY19wYXJzZXJfdCwgMSk7CiAKICAgdG90YWxCaXRzID0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKQEAgLTcwMyw3ICsxMDc0LDkgQEAKICAgICBnb3RvIGJhaWw7CiAgIH0KIAotICBmVHJhdmVyc2VNb3JlRnJhbWVzID0gKGhUcC0+ZmxhZ3MgJiAoVFBERUNfTUlOSU1JWkVfREVMQVl8VFBERUNfRUFSTFlfQ09ORklHKSkgJiYgISAoaFRwLT5mbGFncyAmIFRQREVDX1NZTkNPSyk7CisgIGZUcmF2ZXJzZU1vcmVGcmFtZXMgPQorICAgICAgKGhUcC0+ZmxhZ3MgJiAoVFBERUNfTUlOSU1JWkVfREVMQVkgfCBUUERFQ19FQVJMWV9DT05GSUcpKSAmJgorICAgICAgIShoVHAtPmZsYWdzICYgVFBERUNfU1lOQ09LKTsKIAogICAvKiBTZXQgdHJhbnNwb3J0IHNwZWNpZmljIHN5bmMgcGFyYW1ldGVycyAqLwogICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CkBAIC03MjEsMTIgKzEwOTQsMTMgQEAKICAgICAgIGJyZWFrOwogICB9CiAKLSAgc3luY01hc2sgPSAoMTw8c3luY0xlbmd0aCktMTsKKyAgc3luY01hc2sgPSAoMSA8PCBzeW5jTGVuZ3RoKSAtIDE7CiAKICAgZG8gewotICAgIElOVCBiaXRzQXZhaWwgPSAwOyAgICAgLyogQml0cyBhdmFpbGFibGUgaW4gYml0c3RyZWFtIGJ1ZmZlciAgICAqLwotICAgIElOVCBjaGVja0xlbmd0aEJpdHM7ICAgLyogSGVscGVyIHRvIGNoZWNrIHJlbWFpbmluZyBiaXRzIGFuZCBidWZmZXIgYm91bmRhcmllcyAqLwotICAgIFVJTlQgc3luY2g7ICAgICAgICAgICAgLyogQ3VycmVudCBzeW5jIHdvcmQgcmVhZCBmcm9tIGJpdHN0cmVhbSAqLworICAgIElOVCBiaXRzQXZhaWwgPSAwOyAgIC8qIEJpdHMgYXZhaWxhYmxlIGluIGJpdHN0cmVhbSBidWZmZXIgICAgKi8KKyAgICBJTlQgY2hlY2tMZW5ndGhCaXRzOyAvKiBIZWxwZXIgdG8gY2hlY2sgcmVtYWluaW5nIGJpdHMgYW5kIGJ1ZmZlciBib3VuZGFyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUlOVCBzeW5jaDsgICAgICAgICAgLyogQ3VycmVudCBzeW5jIHdvcmQgcmVhZCBmcm9tIGJpdHN0cmVhbSAqLwogCiAgICAgaGVhZGVyQml0c1ByZXZpb3VzID0gaGVhZGVyQml0czsKIApAQCAtNzM1LDIxICsxMTA5LDIyIEBACiAgICAgaWYgKGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID09IDApIHsKICAgICAgIC8qIHNlYXJjaCBzeW5jaHdvcmQgKi8KIAotICAgICAgRkRLX0FTU0VSVCggKGJpdHNBdmFpbCAlIFRQREVDX1NZTkNTS0lQKSA9PSAwKTsKKyAgICAgIEZES19BU1NFUlQoKGJpdHNBdmFpbCAlIFRQREVDX1NZTkNTS0lQKSA9PSAwKTsKIAotICAgICAgaWYgKChiaXRzQXZhaWwtc3luY0xlbmd0aCkgPCBUUERFQ19TWU5DU0tJUCkgeworICAgICAgaWYgKChiaXRzQXZhaWwgLSBzeW5jTGVuZ3RoKSA8IFRQREVDX1NZTkNTS0lQKSB7CiAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM7CiAgICAgICAgIGhlYWRlckJpdHMgPSAwOwogICAgICAgfSBlbHNlIHsKLQogICAgICAgICBzeW5jaCA9IEZES3JlYWRCaXRzKGhCcywgc3luY0xlbmd0aCk7CiAKLSAgICAgICAgaWYgKCAhKGhUcC0+ZmxhZ3MgJiBUUERFQ19TWU5DT0spICkgewotICAgICAgICAgIGZvciAoOyAoYml0c0F2YWlsLXN5bmNMZW5ndGgpID49IFRQREVDX1NZTkNTS0lQOyBiaXRzQXZhaWwtPVRQREVDX1NZTkNTS0lQKSB7CisgICAgICAgIGlmICghKGhUcC0+ZmxhZ3MgJiBUUERFQ19TWU5DT0spKSB7CisgICAgICAgICAgZm9yICg7IChiaXRzQXZhaWwgLSBzeW5jTGVuZ3RoKSA+PSBUUERFQ19TWU5DU0tJUDsKKyAgICAgICAgICAgICAgIGJpdHNBdmFpbCAtPSBUUERFQ19TWU5DU0tJUCkgewogICAgICAgICAgICAgaWYgKHN5bmNoID09IHN5bmNXb3JkKSB7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2ggPSAoKHN5bmNoIDw8IFRQREVDX1NZTkNTS0lQKSAmIHN5bmNNYXNrKSB8IEZES3JlYWRCaXRzKGhCcywgVFBERUNfU1lOQ1NLSVApOworICAgICAgICAgICAgc3luY2ggPSAoKHN5bmNoIDw8IFRQREVDX1NZTkNTS0lQKSAmIHN5bmNNYXNrKSB8CisgICAgICAgICAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgVFBERUNfU1lOQ1NLSVApOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoc3luY2ggIT0gc3luY1dvcmQpIHsKQEAgLTc3MCw0NCArMTE0NSw0NiBAQAogCiAgICAgLyogUGFyc2UgdHJhbnNwb3J0IGhlYWRlciAocmF3IGRhdGEgYmxvY2sgZ3JhbnVsYXJpdHkpICovCiAKLSAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSyApCi0gICAgewotICAgICAgZXJyID0gdHJhbnNwb3J0RGVjX3JlYWRIZWFkZXIoCi0gICAgICAgICAgICAgIGhUcCwKLSAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICBzeW5jTGVuZ3RoLAotICAgICAgICAgICAgICBpZ25vcmVCdWZmZXJGdWxsbmVzcywKLSAgICAgICAgICAgICAmcmF3RGF0YUJsb2NrTGVuZ3RoLAotICAgICAgICAgICAgICZmVHJhdmVyc2VNb3JlRnJhbWVzLAotICAgICAgICAgICAgICZzeW5jTGF5ZXJGcmFtZUJpdHMsCi0gICAgICAgICAgICAgJmZDb25maWdGb3VuZCwKLSAgICAgICAgICAgICAmaGVhZGVyQml0cwotICAgICAgICAgICAgICApOworICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICBlcnIgPSB0cmFuc3BvcnREZWNfcmVhZEhlYWRlcihoVHAsIGhCcywgc3luY0xlbmd0aCwgaWdub3JlQnVmZmVyRnVsbG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmF3RGF0YUJsb2NrTGVuZ3RoLCAmZlRyYXZlcnNlTW9yZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW5jTGF5ZXJGcmFtZUJpdHMsICZmQ29uZmlnRm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyQml0cyk7CisgICAgICBpZiAoVFBERUNfSVNfRkFUQUxfRVJST1IoZXJyKSkgeworICAgICAgICAvKiBSZXdpbmQgLSBUUERFQ19TWU5DU0tJUCwgaW4gb3JkZXIgdG8gbG9vayBmb3IgYSBzeW5jaCBvbmUgYml0IGFoZWFkCisgICAgICAgICAqIG5leHQgdGltZS4gRW5zdXJlIHRoYXQgdGhlIGJpdCBhbW91bnQgbGFuZHMgYXQgYSBtdWx0aXBsZSBvZgorICAgICAgICAgKiBUUERFQ19TWU5DU0tJUC4gKi8KKyAgICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoCisgICAgICAgICAgICBoQnMsIC1oZWFkZXJCaXRzICsgVFBERUNfU1lOQ1NLSVAgKyAoYml0c0F2YWlsICUgVFBERUNfU1lOQ1NLSVApKTsKKworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CiAgICAgfQogCiAgICAgYml0c0F2YWlsIC09IGhlYWRlckJpdHM7CiAKLSAgICBjaGVja0xlbmd0aEJpdHMgID0gc3luY0xheWVyRnJhbWVCaXRzOworICAgIGNoZWNrTGVuZ3RoQml0cyA9IHN5bmNMYXllckZyYW1lQml0czsKIAogICAgIC8qIENoZWNrIGlmIHRoZSB3aG9sZSBmcmFtZSB3b3VsZCBmaXQgdGhlIGJpdHN0cmVhbSBidWZmZXIgKi8KICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSykgewotICAgICAgaWYgKCAoY2hlY2tMZW5ndGhCaXRzK2hlYWRlckJpdHMpID4gKChUUkFOU1BPUlRERUNfSU5CVUZfU0laRTw8MyktNykgKSB7CisgICAgICBpZiAoKGNoZWNrTGVuZ3RoQml0cyArIGhlYWRlckJpdHMpID4gKCgoODE5MiAqIDQpIDw8IDMpIC0gNykpIHsKICAgICAgICAgLyogV2UgYXNzdW1lIHRoYXQgdGhlIHNpemUgb2YgdGhlIHRyYW5zcG9ydCBiaXQgYnVmZmVyIGhhcyBiZWVuCiAgICAgICAgICAgIGNob3NlbiB0byBtZWV0IGFsbCBzeXN0ZW0gcmVxdWlyZW1lbnRzLCB0aHVzIHRoaXMgY29uZGl0aW9uCiAgICAgICAgICAgIGlzIGNvbnNpZGVyZWQgYSBzeW5jaHJvbmlzYXRpb24gZXJyb3IuICovCiAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCBiaXRzQXZhaWwgPCBjaGVja0xlbmd0aEJpdHMgKSB7CisgICAgICAgIGlmIChiaXRzQXZhaWwgPCBjaGVja0xlbmd0aEJpdHMpIHsKICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTKSB7CisgICAgICAvKiBFbmZvcmNlIHJlYWRpbmcgb2YgbmV3IGRhdGEgKi8KKyAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0gMDsKICAgICAgIGJyZWFrOwogICAgIH0KIAotCiAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUikgewogICAgICAgaW50IGJpdHM7CiAKQEAgLTgxNiwzOCArMTE5MywzOSBAQAogCiAgICAgICAvKiBFbnN1cmUgdGhhdCB0aGUgYml0IGFtb3VudCBsYW5kcyBhdCBhIG11bHRpcGxlIG9mIFRQREVDX1NZTkNTS0lQICovCiAgICAgICBiaXRzID0gKGJpdHNBdmFpbCArIGhlYWRlckJpdHMpICUgVFBERUNfU1lOQ1NLSVA7Ci0gICAgICAvKiBSZXdpbmQgLSBUUERFQ19TWU5DU0tJUCwgaW4gb3JkZXIgdG8gbG9vayBmb3IgYSBzeW5jaCBvbmUgYml0IGFoZWFkIG5leHQgdGltZS4gKi8KKyAgICAgIC8qIFJld2luZCAtIFRQREVDX1NZTkNTS0lQLCBpbiBvcmRlciB0byBsb29rIGZvciBhIHN5bmNoIG9uZSBiaXQgYWhlYWQKKyAgICAgICAqIG5leHQgdGltZS4gKi8KICAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgLShoZWFkZXJCaXRzIC0gVFBERUNfU1lOQ1NLSVApICsgYml0cyk7Ci0gICAgICBiaXRzQXZhaWwgKz0gaGVhZGVyQml0cyAtIFRQREVDX1NZTkNTS0lQIC0gYml0czsKICAgICAgIGhlYWRlckJpdHMgPSAwOwogICAgIH0KIAogICAgIC8qIEZyYW1lIHRyYXZlcnNhbCAqLwotICAgIGlmICggZlRyYXZlcnNlTW9yZUZyYW1lcyApCi0gICAgeworICAgIGlmIChmVHJhdmVyc2VNb3JlRnJhbWVzKSB7CiAgICAgICAvKiBTYXZlIHBhcnNlciBjb250ZXh0IGZvciBlYXJseSBjb25maWcgZGlzY292ZXJ5ICJyZXdpbmQgYWxsIGZyYW1lcyIgKi8KLSAgICAgIGlmICggKGhUcC0+ZmxhZ3MgJiBUUERFQ19FQVJMWV9DT05GSUcpICYmICEoaFRwLT5mbGFncyAmIFRQREVDX01JTklNSVpFX0RFTEFZKSkKLSAgICAgIHsKLSAgICAgICAgLyogaWdub3JlIGJ1ZmZlciBmdWxsbmVzcyBpZiBqdXN0IHRyYXZlcnNpbmcgYWRkaXRpb25hbCBmcmFtZXMgZm9yIEVDRCAqLworICAgICAgaWYgKChoVHAtPmZsYWdzICYgVFBERUNfRUFSTFlfQ09ORklHKSAmJgorICAgICAgICAgICEoaFRwLT5mbGFncyAmIFRQREVDX01JTklNSVpFX0RFTEFZKSkgeworICAgICAgICAvKiBpZ25vcmUgYnVmZmVyIGZ1bGxuZXNzIGlmIGp1c3QgdHJhdmVyc2luZyBhZGRpdGlvbmFsIGZyYW1lcyBmb3IgRUNECisgICAgICAgICAqLwogICAgICAgICBpZ25vcmVCdWZmZXJGdWxsbmVzcyA9IDE7CiAKICAgICAgICAgLyogU2F2ZSBjb250ZXh0IGluIG9yZGVyIHRvIHJldHVybiBsYXRlciAqLwotICAgICAgICBpZiAoIGVyciA9PSBUUkFOU1BPUlRERUNfT0sgJiYgc3RhcnRQb3NGaXJzdEZyYW1lID09IC0xICkgeworICAgICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSyAmJiBzdGFydFBvc0ZpcnN0RnJhbWUgPT0gLTEpIHsKICAgICAgICAgICBzdGFydFBvc0ZpcnN0RnJhbWUgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKICAgICAgICAgICBudW1SYXdEYXRhQmxvY2tzRmlyc3RGcmFtZSA9IGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzOwogICAgICAgICAgIGdsb2JhbEZyYW1lUG9zRmlyc3RGcmFtZSA9IGhUcC0+Z2xvYmFsRnJhbWVQb3M7CiAgICAgICAgICAgcmF3RGF0YUJsb2NrTGVuZ3RoRmlyc3RGcmFtZSA9IHJhd0RhdGFCbG9ja0xlbmd0aDsKICAgICAgICAgICBoZWFkZXJCaXRzRmlyc3RGcmFtZSA9IGhlYWRlckJpdHM7CiAgICAgICAgICAgZXJyRmlyc3RGcmFtZSA9IGVycjsKLSAgICAgICAgICBGREttZW1jcHkoY29udGV4dEZpcnN0RnJhbWUsICZoVHAtPnBhcnNlciwgc2l6ZW9mKHRyYW5zcG9ydGRlY19wYXJzZXJfdCkpOworICAgICAgICAgIEZES21lbWNweShjb250ZXh0Rmlyc3RGcmFtZSwgJmhUcC0+cGFyc2VyLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhbnNwb3J0ZGVjX3BhcnNlcl90KSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKiBCcmVhayB3aGVuIGNvbmZpZyB3YXMgZm91bmQgb3IgaXQgaXMgbm90IHBvc3NpYmxlIGFueW1vcmUgdG8gZmluZCBhIGNvbmZpZyAqLwotICAgICAgICBpZiAoc3RhcnRQb3NGaXJzdEZyYW1lICE9IC0xICYmIChmQ29uZmlnRm91bmQgfHwgZXJyICE9IFRSQU5TUE9SVERFQ19PSykpCi0gICAgICAgIHsKKyAgICAgICAgLyogQnJlYWsgd2hlbiBjb25maWcgd2FzIGZvdW5kIG9yIGl0IGlzIG5vdCBwb3NzaWJsZSBhbnltb3JlIHRvIGZpbmQgYQorICAgICAgICAgKiBjb25maWcgKi8KKyAgICAgICAgaWYgKHN0YXJ0UG9zRmlyc3RGcmFtZSAhPSAtMSAmJgorICAgICAgICAgICAgKGZDb25maWdGb3VuZCB8fCBlcnIgIT0gVFJBTlNQT1JUREVDX09LKSkgewogICAgICAgICAgIC8qIEluIGNhc2Ugb2YgRUNEIGFuZCBzeW5jIGVycm9yLCBkbyBub3QgcmV3aW5kIGFueXdoZXJlLiAqLwotICAgICAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1IpCi0gICAgICAgICAgeworICAgICAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1IpIHsKICAgICAgICAgICAgIHN0YXJ0UG9zRmlyc3RGcmFtZSA9IC0xOwogICAgICAgICAgICAgZkNvbmZpZ0ZvdW5kID0gMDsKICAgICAgICAgICAgIG51bUZyYW1lc1RyYXZlcnNlZCA9IDA7CkBAIC04NTgsMTYgKzEyMzYsMTggQEAKIAogICAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKICAgICAgICAgRkRLcHVzaEZvcihoQnMsIHJhd0RhdGFCbG9ja0xlbmd0aCk7Ci0gICAgICAgIGJpdHNBdmFpbCAtPSByYXdEYXRhQmxvY2tMZW5ndGg7CiAgICAgICAgIG51bUZyYW1lc1RyYXZlcnNlZCsrOworICAgICAgICBlbmRUcEZyYW1lQml0c1ByZXZpb3VzID0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKICAgICAgICAgLyogSWdub3JlIGVycm9yIGhlcmUgaXRlbnRpb25hbGx5LiAqLwogICAgICAgICB0cmFuc3BvcnREZWNfQWRqdXN0RW5kT2ZBY2Nlc3NVbml0KGhUcCk7CisgICAgICAgIGVuZFRwRnJhbWVCaXRzUHJldmlvdXMgLT0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAgICAgICB9CiAgICAgfQotICB9IHdoaWxlICggZlRyYXZlcnNlTW9yZUZyYW1lcyB8fCAoZXJyID09IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SICYmICEoaFRwLT5mbGFncyAmIFRQREVDX1NZTkNPSykpKTsKKyAgfSB3aGlsZSAoZlRyYXZlcnNlTW9yZUZyYW1lcyB8fAorICAgICAgICAgICAoZXJyID09IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SICYmICEoaFRwLT5mbGFncyAmIFRQREVDX1NZTkNPSykpKTsKIAogICAvKiBSZXN0b3JlIGNvbnRleHQgaW4gY2FzZSBvZiBFQ0QgZnJhbWUgdHJhdmVyc2FsICovCi0gIGlmICggc3RhcnRQb3NGaXJzdEZyYW1lICE9IC0xICYmIChmQ29uZmlnRm91bmQgfHwgZXJyICE9IFRSQU5TUE9SVERFQ19PSykgKSB7CisgIGlmIChzdGFydFBvc0ZpcnN0RnJhbWUgIT0gLTEgJiYgKGZDb25maWdGb3VuZCB8fCBlcnIgIT0gVFJBTlNQT1JUREVDX09LKSkgewogICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgRkRLZ2V0VmFsaWRCaXRzKGhCcykgLSBzdGFydFBvc0ZpcnN0RnJhbWUpOwogICAgIEZES21lbWNweSgmaFRwLT5wYXJzZXIsIGNvbnRleHRGaXJzdEZyYW1lLCBzaXplb2YodHJhbnNwb3J0ZGVjX3BhcnNlcl90KSk7CiAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSBudW1SYXdEYXRhQmxvY2tzRmlyc3RGcmFtZTsKQEAgLTg3NiwzMiArMTI1NiwzNSBAQAogICAgIGhlYWRlckJpdHMgPSBoZWFkZXJCaXRzRmlyc3RGcmFtZTsKICAgICBlcnIgPSBlcnJGaXJzdEZyYW1lOwogICAgIG51bUZyYW1lc1RyYXZlcnNlZCA9IDA7Ci0gIH0gCisgIH0KIAogICAvKiBBZGRpdGlvbmFsIGJ1cnN0IGRhdGEgbW9kZSBidWZmZXIgZnVsbG5lc3MgY2hlY2suICovCi0gIGlmICggIShoVHAtPmZsYWdzICYgKFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkd8VFBERUNfSUdOT1JFX0JVRkZFUkZVTExORVNTfFRQREVDX1NZTkNPSykpICYmIGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKLSAgICBlcnIgPSBhZGRpdGlvbmFsSG9sZE9mZk5lZWRlZChoVHAsIHRyYW5zcG9ydERlY19HZXRCdWZmZXJGdWxsbmVzcyhoVHApLCBGREtnZXRWYWxpZEJpdHMoaEJzKSAtIHN5bmNMYXllckZyYW1lQml0cyk7CisgIGlmICghKGhUcC0+ZmxhZ3MgJiAoVFBERUNfTE9TVF9GUkFNRVNfUEVORElORyB8IFRQREVDX0lHTk9SRV9CVUZGRVJGVUxMTkVTUyB8CisgICAgICAgICAgICAgICAgICAgICAgVFBERUNfU1lOQ09LKSkgJiYKKyAgICAgIGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICBlcnIgPSBhZGRpdGlvbmFsSG9sZE9mZk5lZWRlZChoVHAsIHRyYW5zcG9ydERlY19HZXRCdWZmZXJGdWxsbmVzcyhoVHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES2dldFZhbGlkQml0cyhoQnMpIC0gc3luY0xheWVyRnJhbWVCaXRzKTsKICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMpIHsKICAgICAgIGhUcC0+aG9sZE9mZkZyYW1lcysrOwogICAgIH0KICAgfQotICAKKwogICAvKiBSZXdpbmQgZm9yIHJldHJ5IGJlY2F1c2Ugb2Ygbm90IGVub3VnaCBiaXRzICovCiAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUykgewogICAgIEZES3B1c2hCYWNrKGhCcywgaGVhZGVyQml0cyk7CiAgICAgaGVhZGVyQml0cyA9IDA7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgLyogcmVzZXQgaG9sZCBvZmYgZnJhbWUgY291bnRlciAqLwogICAgIGhUcC0+aG9sZE9mZkZyYW1lcyA9IDA7CiAgIH0KIAogICAvKiBSZXR1cm4gdG8gbGFzdCBnb29kIGZyYW1lIGluIGNhc2Ugb2YgZnJhbWUgdHJhdmVyc2FsIGJ1dCBub3QgRUNELiAqLwogICBpZiAobnVtRnJhbWVzVHJhdmVyc2VkID4gMCkgewotICAgIEZES3B1c2hCYWNrKGhCcywgcmF3RGF0YUJsb2NrTGVuZ3RoUHJldmlvdXMpOworICAgIEZES3B1c2hCYWNrKGhCcywgcmF3RGF0YUJsb2NrTGVuZ3RoUHJldmlvdXMgKyBlbmRUcEZyYW1lQml0c1ByZXZpb3VzKTsKICAgICBpZiAoZXJyICE9IFRSQU5TUE9SVERFQ19PSykgewogICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSBudW1SYXdEYXRhQmxvY2tzUHJldmlvdXM7CiAgICAgICBoZWFkZXJCaXRzID0gaGVhZGVyQml0c1ByZXZpb3VzOworICAgICAgcmF3RGF0YUJsb2NrTGVuZ3RoID0gcmF3RGF0YUJsb2NrTGVuZ3RoUHJldmlvdXM7CiAgICAgfQogICAgIGVyciA9IFRSQU5TUE9SVERFQ19PSzsKICAgfQpAQCAtOTA5LDEwICsxMjkyLDEzIEBACiBiYWlsOgogICBoVHAtPmF1TGVuZ3RoWzBdID0gcmF3RGF0YUJsb2NrTGVuZ3RoOwogCi0gIC8qIERldGVjdCBwb2ludGxlc3MgVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUyBlcnJvciBjYXNlLCB3ZXJlIHRoZSBiaXQgYnVmZmVyIGlzIGFscmVhZHkgZnVsbCwKLSAgICAgb3Igbm8gbmV3IGJ1cnN0IHBhY2tldCBmaXRzLiBSZWNvdmVyIGJ5IGFkdmFuY2luZyB0aGUgYml0IGJ1ZmZlci4gKi8KLSAgaWYgKCAoVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUyA9PSBlcnIpICYmICAoRkRLZ2V0VmFsaWRCaXRzKGhCcykgPj0gKChUUkFOU1BPUlRERUNfSU5CVUZfU0laRSo4IC0gKChoVHAtPmF2Z0JpdFJhdGUqaFRwLT5idXJzdFBlcmlvZCkvMTAwMCkpIC0gNykpICkKLSAgeworICAvKiBEZXRlY3QgcG9pbnRsZXNzIFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMgZXJyb3IgY2FzZSwgd2hlcmUgdGhlIGJpdAorICAgICBidWZmZXIgaXMgYWxyZWFkeSBmdWxsLCBvciBubyBuZXcgYnVyc3QgcGFja2V0IGZpdHMuIFJlY292ZXIgYnkgYWR2YW5jaW5nCisgICAgIHRoZSBiaXQgYnVmZmVyLiAqLworICBpZiAoKHRvdGFsQml0cyA+IDApICYmIChUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTID09IGVycikgJiYKKyAgICAgIChGREtnZXRWYWxpZEJpdHMoaEJzKSA+PQorICAgICAgICgoKDgxOTIgKiA0KSAqIDggLSAoKGhUcC0+YXZnQml0UmF0ZSAqIGhUcC0+YnVyc3RQZXJpb2QpIC8gMTAwMCkpIC0KKyAgICAgICAgNykpKSB7CiAgICAgRkRLcHVzaEZvcihoQnMsIFRQREVDX1NZTkNTS0lQKTsKICAgICBlcnIgPSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUjsKICAgfQpAQCAtOTM5LDM0ICsxMzI1LDMyIEBACiB9CiAKIC8qKgotICogXGJyaWVmIFN5bmNocm9uaXplIHRvIHN0cmVhbSBhbmQgZXN0aW1hdGUgdGhlIGFtb3VudCBvZiBtaXNzaW5nIGFjY2VzcyB1bml0cyBkdWUKLSAqICAgICAgICB0byBhIGN1cnJlbnQgc3luY2hyb25pemF0aW9uIGVycm9yIGluIGNhc2Ugb2YgY29uc3RhbnQgYXZlcmFnZSBiaXQgcmF0ZS4KKyAqIFxicmllZiBTeW5jaHJvbml6ZSB0byBzdHJlYW0gYW5kIGVzdGltYXRlIHRoZSBhbW91bnQgb2YgbWlzc2luZyBhY2Nlc3MgdW5pdHMKKyAqIGR1ZSB0byBhIGN1cnJlbnQgc3luY2hyb25pemF0aW9uIGVycm9yIGluIGNhc2Ugb2YgY29uc3RhbnQgYXZlcmFnZSBiaXQgcmF0ZS4KICAqLwotc3RhdGljCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX3JlYWRTdHJlYW0gKCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApCi17Ci0KK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX3JlYWRTdHJlYW0oSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGF5ZXIpIHsKICAgVFJBTlNQT1JUREVDX0VSUk9SIGVycm9yID0gVFJBTlNQT1JUREVDX09LOwogICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmaFRwLT5iaXRTdHJlYW1bbGF5ZXJdOwotICBJTlQgbkFVID0gLTE7CisKICAgSU5UIGhlYWRlckJpdHM7CiAgIElOVCBiaXREaXN0YW5jZSwgYmZEZWx0YTsKIAogICAvKiBPYnRhaW4gZGlzdGFuY2UgdG8gbmV4dCBzeW5jaCB3b3JkICovCi0gIGJpdERpc3RhbmNlID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgIGJpdERpc3RhbmNlID0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKICAgZXJyb3IgPSBzeW5jaHJvbml6YXRpb24oaFRwLCAmaGVhZGVyQml0cyk7Ci0gIGJpdERpc3RhbmNlIC09IEZES2dldFZhbGlkQml0cyhoQnMpOwotCisgIGJpdERpc3RhbmNlIC09IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAKICAgRkRLX0FTU0VSVChiaXREaXN0YW5jZSA+PSAwKTsKIAotICBpZiAoZXJyb3IgPT0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1IgfHwgKGhUcC0+ZmxhZ3MgJiBUUERFQ19MT1NUX0ZSQU1FU19QRU5ESU5HKSkKLSAgeworICBJTlQgbkFVID0gLTE7CisKKyAgaWYgKGVycm9yID09IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SIHx8CisgICAgICAoaFRwLT5mbGFncyAmIFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkcpKSB7CiAgICAgLyogQ2hlY2sgaWYgZXN0aW1hdGluZyBsb3N0IGFjY2VzcyB1bml0cyBpcyBmZWFzaWJsZS4gKi8KLSAgICBpZiAoaFRwLT5hdmdCaXRSYXRlID4gMCAmJiBoVHAtPmFzY1swXS5tX3NhbXBsZXNQZXJGcmFtZSA+IDAgJiYgaFRwLT5hc2NbMF0ubV9zYW1wbGluZ0ZyZXF1ZW5jeSA+IDApCi0gICAgewotICAgICAgaWYgKGVycm9yID09IFRSQU5TUE9SVERFQ19PSykKLSAgICAgIHsKKyAgICBpZiAoaFRwLT5hdmdCaXRSYXRlID4gMCAmJiBoVHAtPmFzY1swXS5tX3NhbXBsZXNQZXJGcmFtZSA+IDAgJiYKKyAgICAgICAgaFRwLT5hc2NbMF0ubV9zYW1wbGluZ0ZyZXF1ZW5jeSA+IDApIHsKKyAgICAgIGlmIChlcnJvciA9PSBUUkFOU1BPUlRERUNfT0spIHsKICAgICAgICAgaW50IGFqOwogCiAgICAgICAgIGFqID0gdHJhbnNwb3J0RGVjX0dldEJ1ZmZlckZ1bGxuZXNzKGhUcCk7CkBAIC05NzgsMTUgKzEzNjIsMTUgQEAKICAgICAgICAgLyogc3luYyB3YXMgb2s6IGxhc3Qgb2YgYSBzZXJpZXMgb2YgYmFkIGFjY2VzcyB1bml0cy4gKi8KICAgICAgICAgaFRwLT5mbGFncyAmPSB+VFBERUNfTE9TVF9GUkFNRVNfUEVORElORzsKICAgICAgICAgLyogQWRkIHVwIGJpdERpc3RhbmNlIHVudGlsIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZS4gTGF0ZXIgd2Ugc3Vic3RyYWN0Ci0gICAgICAgICAgIHRoaXMgZnJhbWUgZnJvbSB0aGUgZ3JhbmQgdG90YWwsIHNpbmNlIHRoaXMgY3VycmVudCBzdWNjZXNzZnVsbHkgc3luY2hyb25pemVkCi0gICAgICAgICAgIGZyYW1lIHNob3VsZCBub3QgYmUgc2tpcHBlZCBvZiBjb3Vyc2U7IGJ1dCBpdCBtdXN0IGJlIGFjY291bnRlZCBpbnRvIHRoZQotICAgICAgICAgICBidWZmZXJmdWxuZXNzIG1hdGguICovCisgICAgICAgICAgIHRoaXMgZnJhbWUgZnJvbSB0aGUgZ3JhbmQgdG90YWwsIHNpbmNlIHRoaXMgY3VycmVudCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICAgc3luY2hyb25pemVkIGZyYW1lIHNob3VsZCBub3QgYmUgc2tpcHBlZCBvZiBjb3Vyc2U7IGJ1dCBpdCBtdXN0IGJlCisgICAgICAgICAgIGFjY291bnRlZCBpbnRvIHRoZSBidWZmZXJmdWxuZXNzIG1hdGguICovCiAgICAgICAgIGJpdERpc3RhbmNlICs9IGhUcC0+YXVMZW5ndGhbMF07CiAgICAgICB9IGVsc2UgewotICAgICAgICBpZiAoICEoaFRwLT5mbGFncyAmIFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkcpICkgeworICAgICAgICBpZiAoIShoVHAtPmZsYWdzICYgVFBERUNfTE9TVF9GUkFNRVNfUEVORElORykpIHsKICAgICAgICAgICAvKiBzeW5jIG5vdCBvazogb25lIG9mIG1hbnkgYmFkIGFjY2VzcyB1bml0cy4gKi8KICAgICAgICAgICBoVHAtPmZsYWdzIHw9IFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkc7Ci0gICAgICAgICAgYmZEZWx0YSA9IC0gKElOVCloVHAtPmxhc3RWYWxpZEJ1ZmZlckZ1bGxuZXNzOworICAgICAgICAgIGJmRGVsdGEgPSAtKElOVCloVHAtPmxhc3RWYWxpZEJ1ZmZlckZ1bGxuZXNzOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGJmRGVsdGEgPSAwOwogICAgICAgICB9CkBAIC05OTYsNyArMTM4MCw4IEBACiAgICAgICAgIGludCBudW0sIGRlbm9tOwogCiAgICAgICAgIC8qIE9idGFpbiBlc3RpbWF0ZSBvZiBudW1iZXIgb2YgbG9zdCBmcmFtZXMgKi8KLSAgICAgICAgbnVtID0gaFRwLT5hc2NbMF0ubV9zYW1wbGluZ0ZyZXF1ZW5jeSAqIChiZkRlbHRhICsgYml0RGlzdGFuY2UpICsgaFRwLT5yZW1haW5kZXI7CisgICAgICAgIG51bSA9IChJTlQpaFRwLT5hc2NbMF0ubV9zYW1wbGluZ0ZyZXF1ZW5jeSAqIChiZkRlbHRhICsgYml0RGlzdGFuY2UpICsKKyAgICAgICAgICAgICAgaFRwLT5yZW1haW5kZXI7CiAgICAgICAgIGRlbm9tID0gaFRwLT5hdmdCaXRSYXRlICogaFRwLT5hc2NbMF0ubV9zYW1wbGVzUGVyRnJhbWU7CiAgICAgICAgIGlmIChudW0gPiAwKSB7CiAgICAgICAgICAgbkFVID0gbnVtIC8gZGVub207CkBAIC0xMDA1LDIzICsxMzkwLDIwIEBACiAgICAgICAgICAgaFRwLT5yZW1haW5kZXIgPSBudW07CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZXJyb3IgPT0gVFJBTlNQT1JUREVDX09LKQotICAgICAgICB7Ci0gICAgICAgICAgLyogRmluYWwgYWRqdXN0bWVudCBvZiByZW1haW5kZXIsIHRha2VuIC0xIGludG8gYWNjb3VudCBiZWNhdXNlIGN1cnJlbnQKLSAgICAgICAgICAgICBmcmFtZSBzaG91bGQgbm90IGJlIHNraXBwZWQsIHRodXMgc3Vic3RyYWN0IC0xIG9yIGRvIG5vdGhpbmcgaW5zdGVhZAotICAgICAgICAgICAgIG9mICsxLTEgYWNjb3JkaW5nbHkuICovCi0gICAgICAgICAgaWYgKCAoZGVub20gLSBoVHAtPnJlbWFpbmRlcikgPj0gaFRwLT5yZW1haW5kZXIgKSB7CisgICAgICAgIGlmIChlcnJvciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgICAvKiBGaW5hbCBhZGp1c3RtZW50IG9mIHJlbWFpbmRlciwgdGFrZW4gLTEgaW50byBhY2NvdW50IGJlY2F1c2UKKyAgICAgICAgICAgICBjdXJyZW50IGZyYW1lIHNob3VsZCBub3QgYmUgc2tpcHBlZCwgdGh1cyBzdWJzdHJhY3QgLTEgb3IgZG8KKyAgICAgICAgICAgICBub3RoaW5nIGluc3RlYWQgb2YgKzEtMSBhY2NvcmRpbmdseS4gKi8KKyAgICAgICAgICBpZiAoKGRlbm9tIC0gaFRwLT5yZW1haW5kZXIpID49IGhUcC0+cmVtYWluZGVyKSB7CiAgICAgICAgICAgICBuQVUtLTsKICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgIGlmIChuQVUgPCAwKSB7Ci0gICAgICAgICAgICAvKiBUaGVyZSB3YXMgb25lIGZyYW1lIHRvbyBtdWNoIGNvbmNlYWxlZCwgc28gdW5mb3J0dW5hdGVseSB3ZSB3aWxsIGhhdmUgdG8gc2tpcCBvbmUgZ29vZCBmcmFtZS4gKi8KKyAgICAgICAgICAgIC8qIFRoZXJlIHdhcyBvbmUgZnJhbWUgdG9vIG11Y2ggY29uY2VhbGVkLCBzbyB1bmZvcnR1bmF0ZWx5IHdlIHdpbGwKKyAgICAgICAgICAgICAqIGhhdmUgdG8gc2tpcCBvbmUgZ29vZCBmcmFtZS4gKi8KICAgICAgICAgICAgIHRyYW5zcG9ydERlY19FbmRBY2Nlc3NVbml0KGhUcCk7Ci0gICAgICAgICAgICBlcnJvciA9IHN5bmNocm9uaXphdGlvbihoVHAsICZoZWFkZXJCaXRzKTsgICAgICAgICAgICAgCisgICAgICAgICAgICBlcnJvciA9IHN5bmNocm9uaXphdGlvbihoVHAsICZoZWFkZXJCaXRzKTsKICAgICAgICAgICAgIG5BVSA9IC0xOwotI2lmZGVmIERFQlVHCi0gICAgICAgICAgICBGREtwcmludGYoIkVSUk9SOiBCdWZmZXJmdWxsbmVzcyBhY2NvdW50aW5nIGZhaWxlZC4gcmVtYWluZGVyPSVkLCBuQVU9JWRcbiIsIGhUcC0+cmVtYWluZGVyLCBuQVUpOwotI2VuZGlmCiAgICAgICAgICAgfQogICAgICAgICAgIGhUcC0+cmVtYWluZGVyID0gMDsKICAgICAgICAgICAvKiBFbmZvcmNlIGxhc3QgbWlzc2VkIGZyYW1lcyB0byBiZSBjb25jZWFsZWQuICovCkBAIC0xMDMzLDkgKzE0MTUsMTAgQEAKICAgICB9CiAgIH0KIAotICAvKiBCZSBzdXJlIHRoYXQgbG9zdCBmcmFtZXMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LiBUaGlzIGlzIG5lY2Vzc2FyeSBkdWUgdG8gc29tZQotICAgICBzeW5jIGVycm9yIHNlcXVlbmNlcyB3aGVyZSBsYXRlciBpdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEsIGJ1dAotICAgICB0aGUgYml0cyB1cHRvIHRoZSBzeW5jIHdvcmQgYXJlIGRpc2NhcmRlZCwgdGh1cyBjYXVzaW5nIGEgdmFsdWUgb2YgbkFVID4gMCAqLworICAvKiBCZSBzdXJlIHRoYXQgbG9zdCBmcmFtZXMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LiBUaGlzIGlzIG5lY2Vzc2FyeSBkdWUgdG8KKyAgICAgc29tZSBzeW5jIGVycm9yIHNlcXVlbmNlcyB3aGVyZSBsYXRlciBpdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBpcyBub3QgZW5vdWdoCisgICAgIGRhdGEsIGJ1dCB0aGUgYml0cyB1cHRvIHRoZSBzeW5jIHdvcmQgYXJlIGRpc2NhcmRlZCwgdGh1cyBjYXVzaW5nIGEgdmFsdWUKKyAgICAgb2YgbkFVID4gMCAqLwogICBpZiAobkFVID4gMCkgewogICAgIGVycm9yID0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CiAgIH0KQEAgLTEwNDYsOCArMTQyOSw4IEBACiB9CiAKIC8qIHJldHVybnMgZXJyb3IgY29kZSAqLwotVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19SZWFkQWNjZXNzVW5pdCggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IFVJTlQgbGF5ZXIgKQoteworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19SZWFkQWNjZXNzVW5pdChjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsYXllcikgewogICBUUkFOU1BPUlRERUNfRVJST1IgZXJyID0gVFJBTlNQT1JUREVDX09LOwogICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnM7CiAKQEAgLTEwNTgsNDEgKzE0NDEsNjYgQEAKICAgaEJzID0gJmhUcC0+Yml0U3RyZWFtW2xheWVyXTsKIAogICBpZiAoKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSA8PSAwKSB7CisgICAgLyogVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBSQVcgYW5kIEFESUYgY2FzZXMuCisgICAgICogRm9yIHN0cmVhbWluZyBmb3JtYXRzIGVyciB3aWxsIGdldCBvdmVyd3JpdHRlbi4gKi8KICAgICBlcnIgPSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTOworICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0gMDsKICAgfQogCiAgIHN3aXRjaCAoaFRwLT50cmFuc3BvcnRGbXQpIHsKLQogICAgIGNhc2UgVFRfTVA0X0FESUY6CiAgICAgICAvKiBSZWFkIGhlYWRlciBpZiBub3QgYWxyZWFkeSBkb25lICovCi0gICAgICBpZiAoIShoVHAtPmZsYWdzICYgVFBERUNfQ09ORklHX0ZPVU5EKSkKLSAgICAgIHsKKyAgICAgIGlmICghKGhUcC0+ZmxhZ3MgJiBUUERFQ19DT05GSUdfRk9VTkQpKSB7CisgICAgICAgIGludCBpOwogICAgICAgICBDUHJvZ3JhbUNvbmZpZyAqcGNlOworICAgICAgICBJTlQgYnNTdGFydCA9IEZES2dldFZhbGlkQml0cyhoQnMpOworICAgICAgICBVQ0hBUiBjb25maWdDaGFuZ2VkID0gMDsKKyAgICAgICAgVUNIQVIgY29uZmlnTW9kZSA9IEFDX0NNX0RFVF9DRkdfQ0hBTkdFOwogCi0gICAgICAgIEF1ZGlvU3BlY2lmaWNDb25maWdfSW5pdCgmaFRwLT5hc2NbMF0pOwotICAgICAgICBwY2UgPSAmaFRwLT5hc2NbMF0ubV9wcm9nckNvbmZpZ0VsZW1lbnQ7Ci0gICAgICAgIGVyciA9IGFkaWZSZWFkX0RlY29kZUhlYWRlcigmaFRwLT5wYXJzZXIuYWRpZiwgcGNlLCBoQnMpOwotICAgICAgICBpZiAoZXJyKQotICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgRkRLcHVzaEJhY2soaEJzLCBic1N0YXJ0IC0gRkRLZ2V0VmFsaWRCaXRzKGhCcykpOworICAgICAgICAgICAgY29uZmlnTW9kZSA9IEFDX0NNX0FMTE9DX01FTTsKKyAgICAgICAgICB9CiAKLSAgICAgICAgLyogTWFwIGFkaWYgaGVhZGVyIHRvIEFTQyAqLwotICAgICAgICBoVHAtPmFzY1swXS5tX2FvdCAgICAgICAgICAgICAgICAgICAgPSAoQVVESU9fT0JKRUNUX1RZUEUpKHBjZS0+UHJvZmlsZSArIDEpOwotICAgICAgICBoVHAtPmFzY1swXS5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSBwY2UtPlNhbXBsaW5nRnJlcXVlbmN5SW5kZXg7Ci0gICAgICAgIGhUcC0+YXNjWzBdLm1fc2FtcGxpbmdGcmVxdWVuY3kgICAgICA9IFNhbXBsaW5nUmF0ZVRhYmxlW3BjZS0+U2FtcGxpbmdGcmVxdWVuY3lJbmRleF07Ci0gICAgICAgIGhUcC0+YXNjWzBdLm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gICA9IDA7Ci0gICAgICAgIGhUcC0+YXNjWzBdLm1fc2FtcGxlc1BlckZyYW1lICAgICAgICA9IDEwMjQ7Ci0gICAgICAgIGhUcC0+YXZnQml0UmF0ZSAgICAgICAgICAgICAgICAgICAgICA9IGhUcC0+cGFyc2VyLmFkaWYuQml0UmF0ZTsKKyAgICAgICAgICBBdWRpb1NwZWNpZmljQ29uZmlnX0luaXQoJmhUcC0+YXNjWzBdKTsKKyAgICAgICAgICBwY2UgPSAmaFRwLT5hc2NbMF0ubV9wcm9nckNvbmZpZ0VsZW1lbnQ7CisgICAgICAgICAgZXJyID0gYWRpZlJlYWRfRGVjb2RlSGVhZGVyKCZoVHAtPnBhcnNlci5hZGlmLCBwY2UsIGhCcyk7CisgICAgICAgICAgaWYgKGVycikgZ290byBiYWlsOwogCi0gICAgICAgIC8qIENhbGwgY2FsbGJhY2sgdG8gZGVjb2Rlci4gKi8KLSAgICAgICAgewotICAgICAgICAgIGludCBlcnJDOworICAgICAgICAgIC8qIE1hcCBhZGlmIGhlYWRlciB0byBBU0MgKi8KKyAgICAgICAgICBoVHAtPmFzY1swXS5tX2FvdCA9IChBVURJT19PQkpFQ1RfVFlQRSkocGNlLT5Qcm9maWxlICsgMSk7CisgICAgICAgICAgaFRwLT5hc2NbMF0ubV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gcGNlLT5TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4OworICAgICAgICAgIGhUcC0+YXNjWzBdLm1fc2FtcGxpbmdGcmVxdWVuY3kgPQorICAgICAgICAgICAgICBTYW1wbGluZ1JhdGVUYWJsZVtwY2UtPlNhbXBsaW5nRnJlcXVlbmN5SW5kZXhdOworICAgICAgICAgIGhUcC0+YXNjWzBdLm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPSAwOworICAgICAgICAgIGhUcC0+YXNjWzBdLm1fc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICAgICAgICBoVHAtPmF2Z0JpdFJhdGUgPSBoVHAtPnBhcnNlci5hZGlmLkJpdFJhdGU7CiAKLSAgICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWcoaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWdEYXRhLCAmaFRwLT5hc2NbMF0pOwotICAgICAgICAgIGlmIChlcnJDID09IDApIHsKLSAgICAgICAgICAgIGhUcC0+ZmxhZ3MgfD0gVFBERUNfQ09ORklHX0ZPVU5EOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7Ci0gICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgLyogQ2FsbCBjYWxsYmFjayB0byBkZWNvZGVyLiAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBlcnJDOworCisgICAgICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWcoCisgICAgICAgICAgICAgICAgaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWdEYXRhLCAmaFRwLT5hc2NbMF0sIGNvbmZpZ01vZGUsCisgICAgICAgICAgICAgICAgJmNvbmZpZ0NoYW5nZWQpOworICAgICAgICAgICAgaWYgKGVyckMgPT0gMCkgeworICAgICAgICAgICAgICBoVHAtPmZsYWdzIHw9IFRQREVDX0NPTkZJR19GT1VORDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgICBpZiAoKGkgPT0gMCkgJiYgY29uZmlnQ2hhbmdlZCkgeworICAgICAgICAgICAgICBpbnQgZXJyQzsKKyAgICAgICAgICAgICAgZXJyQyA9IGhUcC0+Y2FsbGJhY2tzLmNiRnJlZU1lbShoVHAtPmNhbGxiYWNrcy5jYkZyZWVNZW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVHAtPmFzY1swXSk7CisgICAgICAgICAgICAgIGlmIChlcnJDICE9IDApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTExMDksOSArMTUxNywxMCBAQAogCiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgogICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKLSAgICAgIHsKKyAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CiAgICAgICAgIGludCBmQ29uZmlnRm91bmQgPSBoVHAtPmZsYWdzICYgVFBERUNfQ09ORklHX0ZPVU5EOwotICAgICAgICBlcnIgPSB0cmFuc3BvcnREZWNfcmVhZEhlYWRlcihoVHAsIGhCcywgMCwgMSwgJmhUcC0+YXVMZW5ndGhbbGF5ZXJdLCBOVUxMLCBOVUxMLCAmZkNvbmZpZ0ZvdW5kLCBOVUxMKTsKKyAgICAgICAgZXJyID0gdHJhbnNwb3J0RGVjX3JlYWRIZWFkZXIoaFRwLCBoQnMsIDAsIDEsICZoVHAtPmF1TGVuZ3RoW2xheWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgJmZDb25maWdGb3VuZCwgTlVMTCk7CiAgICAgICAgIGlmIChmQ29uZmlnRm91bmQpIHsKICAgICAgICAgICBoVHAtPmZsYWdzIHw9IFRQREVDX0NPTkZJR19GT1VORDsKICAgICAgICAgfQpAQCAtMTEzOCwxMiArMTU0NywyOSBAQAogICByZXR1cm4gZXJyOwogfQogCi1JTlQgdHJhbnNwb3J0RGVjX0dldEF1Qml0c1JlbWFpbmluZyggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IFVJTlQgbGF5ZXIgKQoteworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19HZXRBc2MoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MpIHsKKyAgVFJBTlNQT1JUREVDX0VSUk9SIGVyciA9IFRSQU5TUE9SVERFQ19PSzsKKworICBpZiAoaFRwICE9IE5VTEwpIHsKKyAgICAqYXNjID0gaFRwLT5hc2NbbGF5ZXJdOworICAgIGVyciA9IFRSQU5TUE9SVERFQ19PSzsKKyAgfSBlbHNlIHsKKyAgICBlcnIgPSBUUkFOU1BPUlRERUNfSU5WQUxJRF9QQVJBTUVURVI7CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKworSU5UIHRyYW5zcG9ydERlY19HZXRBdUJpdHNSZW1haW5pbmcoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxheWVyKSB7CiAgIElOVCBiaXRzOwogCiAgIGlmIChoVHAtPmFjY2Vzc1VuaXRBbmNob3JbbGF5ZXJdID4gMCAmJiBoVHAtPmF1TGVuZ3RoW2xheWVyXSA+IDApIHsKLSAgICBiaXRzID0gaFRwLT5hdUxlbmd0aFtsYXllcl0gLSAoaFRwLT5hY2Nlc3NVbml0QW5jaG9yW2xheWVyXSAtIEZES2dldFZhbGlkQml0cygmaFRwLT5iaXRTdHJlYW1bbGF5ZXJdKSk7CisgICAgYml0cyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKCZoVHAtPmJpdFN0cmVhbVtsYXllcl0pOworICAgIGlmIChiaXRzID49IDApIHsKKyAgICAgIGJpdHMgPSBoVHAtPmF1TGVuZ3RoW2xheWVyXSAtICgoSU5UKWhUcC0+YWNjZXNzVW5pdEFuY2hvcltsYXllcl0gLSBiaXRzKTsKKyAgICB9CiAgIH0gZWxzZSB7CiAgICAgYml0cyA9IEZES2dldFZhbGlkQml0cygmaFRwLT5iaXRTdHJlYW1bbGF5ZXJdKTsKICAgfQpAQCAtMTE1MSwyMyArMTU3Nyw1NSBAQAogICByZXR1cm4gYml0czsKIH0KIAotSU5UIHRyYW5zcG9ydERlY19HZXRBdUJpdHNUb3RhbCggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IFVJTlQgbGF5ZXIgKQoteworSU5UIHRyYW5zcG9ydERlY19HZXRBdUJpdHNUb3RhbChjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsYXllcikgewogICByZXR1cm4gaFRwLT5hdUxlbmd0aFtsYXllcl07CiB9CiAKLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfR2V0TWlzc2luZ0FjY2Vzc1VuaXRDb3VudCAoIElOVCAqcE5BY2Nlc3NVbml0cywgSEFORExFX1RSQU5TUE9SVERFQyBoVHAgKQoteworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19HZXRNaXNzaW5nQWNjZXNzVW5pdENvdW50KAorICAgIElOVCAqcE5BY2Nlc3NVbml0cywgSEFORExFX1RSQU5TUE9SVERFQyBoVHApIHsKICAgKnBOQWNjZXNzVW5pdHMgPSBoVHAtPm1pc3NpbmdBY2Nlc3NVbml0czsKIAogICByZXR1cm4gVFJBTlNQT1JUREVDX09LOwogfQogCiAvKiBJbmZvcm0gdGhlIHRyYW5zcG9ydERlYyBsYXllciB0aGF0IHJlYWRpbmcgb2YgYWNjZXNzIHVuaXQgaGFzIGZpbmlzaGVkLiAqLwotVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19FbmRBY2Nlc3NVbml0KEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKQoteworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19FbmRBY2Nlc3NVbml0KEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKSB7CiAgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnIgPSBUUkFOU1BPUlRERUNfT0s7CiAKKyAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgeworICAgIGNhc2UgVFRfTVA0X0xPQVM6CisgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgorICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMTogeworICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gJmhUcC0+Yml0U3RyZWFtWzBdOworICAgICAgaWYgKGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID09IDApIHsKKyAgICAgICAgLyogUmVhZCBvdGhlciBkYXRhIGlmIGF2YWlsYWJsZS4gKi8KKyAgICAgICAgaWYgKENMYXRtRGVtdXhfR2V0T3RoZXJEYXRhUHJlc2VudEZsYWcoJmhUcC0+cGFyc2VyLmxhdG0pKSB7CisgICAgICAgICAgaW50IG90aGVyRGF0YUxlbiA9IENMYXRtRGVtdXhfR2V0T3RoZXJEYXRhTGVuZ3RoKCZoVHAtPnBhcnNlci5sYXRtKTsKKworICAgICAgICAgIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpID49IG90aGVyRGF0YUxlbikgeworICAgICAgICAgICAgRkRLcHVzaEZvcihoQnMsIG90aGVyRGF0YUxlbik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIERvIGJ5dGUgYWxpZ24gYXQgdGhlIGVuZCBvZiBBdWRpb011eEVsZW1lbnQuICovCisgICAgICAgICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPT0gMCkgeworICAgICAgICAgICAgICBGREtieXRlQWxpZ24oaEJzLCBoVHAtPmdsb2JhbEZyYW1lUG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSWYgYml0IGJ1ZmZlciBoYXMgbm90IG1vcmUgYml0cyBidXQgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPiAwCisgICAgICAgICAgIHRoZW4gdG9vIG1hbnkgYml0cyB3ZXJlIHJlYWQgYW5kIG9idmlvdXNseSBubyBtb3JlIFJhd0RhdGFCbG9ja3MgY2FuCisgICAgICAgICAgIGJlIHJlYWQuIFNldCBudW1iZXJPZlJhd0RhdGFCbG9ja3MgdG8gemVybyB0byBhdHRlbXB0IGEgbmV3IHN5bmMKKyAgICAgICAgICAgYXR0ZW1wdC4gKi8KKyAgICAgICAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgPD0gMCkgeworICAgICAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiAKICAgZXJyID0gdHJhbnNwb3J0RGVjX0FkanVzdEVuZE9mQWNjZXNzVW5pdChoVHApOwogCkBAIC0xMTc5LDEyICsxNjM3LDE1IEBACiAgIHJldHVybiBlcnI7CiB9CiAKLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfU2V0UGFyYW0gKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUUERFQ19QQVJBTSAgICAgICAgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIHZhbHVlKQoteworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19TZXRQYXJhbShjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFBERUNfUEFSQU0gcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB2YWx1ZSkgewogICBUUkFOU1BPUlRERUNfRVJST1IgZXJyb3IgPSBUUkFOU1BPUlRERUNfT0s7CiAKKyAgaWYgKGhUcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19JTlZBTElEX1BBUkFNRVRFUjsKKyAgfQorCiAgIHN3aXRjaCAocGFyYW0pIHsKICAgICBjYXNlIFRQREVDX1BBUkFNX01JTklNSVpFX0RFTEFZOgogICAgICAgaWYgKHZhbHVlKSB7CkBAIC0xMjEzLDI1ICsxNjc0LDM2IEBACiAgICAgY2FzZSBUUERFQ19QQVJBTV9CVVJTVF9QRVJJT0Q6CiAgICAgICBoVHAtPmJ1cnN0UGVyaW9kID0gdmFsdWU7CiAgICAgICBicmVhazsKLSAgICBjYXNlIFRQREVDX1BBUkFNX1JFU0VUOgotICAgICAgewotICAgICAgICBpbnQgaTsKKyAgICBjYXNlIFRQREVDX1BBUkFNX1JFU0VUOiB7CisgICAgICBpbnQgaTsKIAotICAgICAgICBmb3IgKGk9MDsgaTwoMSoyKTsgaSsrKSB7Ci0gICAgICAgICAgRkRLcmVzZXRCaXRidWZmZXIoJmhUcC0+Yml0U3RyZWFtW2ldKTsKLSAgICAgICAgICBoVHAtPmF1TGVuZ3RoW2ldID0gMDsKLSAgICAgICAgICBoVHAtPmFjY2Vzc1VuaXRBbmNob3JbaV0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGhUcC0+ZmxhZ3MgJj0gfihUUERFQ19TWU5DT0t8VFBERUNfTE9TVF9GUkFNRVNfUEVORElORyk7Ci0gICAgICAgIGlmIChoVHAtPnRyYW5zcG9ydEZtdCAhPSBUVF9NUDRfQURJRikgewotICAgICAgICAgIGhUcC0+ZmxhZ3MgJj0gflRQREVDX0NPTkZJR19GT1VORDsKLSAgICAgICAgfQotICAgICAgICBoVHAtPnJlbWFpbmRlciA9IDA7Ci0gICAgICAgIGhUcC0+YXZnQml0UmF0ZSA9IDA7Ci0gICAgICAgIGhUcC0+bWlzc2luZ0FjY2Vzc1VuaXRzID0gMDsKLSAgICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOwotICAgICAgICBoVHAtPmdsb2JhbEZyYW1lUG9zID0gMDsKLSAgICAgICAgaFRwLT5ob2xkT2ZmRnJhbWVzID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoMSAqIDEpOyBpKyspIHsKKyAgICAgICAgRkRLcmVzZXRCaXRidWZmZXIoJmhUcC0+Yml0U3RyZWFtW2ldKTsKKyAgICAgICAgaFRwLT5hdUxlbmd0aFtpXSA9IDA7CisgICAgICAgIGhUcC0+YWNjZXNzVW5pdEFuY2hvcltpXSA9IDA7CisgICAgICB9CisgICAgICBoVHAtPmZsYWdzICY9IH4oVFBERUNfU1lOQ09LIHwgVFBERUNfTE9TVF9GUkFNRVNfUEVORElORyk7CisgICAgICBpZiAoaFRwLT50cmFuc3BvcnRGbXQgIT0gVFRfTVA0X0FESUYpIHsKKyAgICAgICAgaFRwLT5mbGFncyAmPSB+VFBERUNfQ09ORklHX0ZPVU5EOworICAgICAgfQorICAgICAgaFRwLT5yZW1haW5kZXIgPSAwOworICAgICAgaFRwLT5hdmdCaXRSYXRlID0gMDsKKyAgICAgIGhUcC0+bWlzc2luZ0FjY2Vzc1VuaXRzID0gMDsKKyAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0gMDsKKyAgICAgIGhUcC0+Z2xvYmFsRnJhbWVQb3MgPSAwOworICAgICAgaFRwLT5ob2xkT2ZmRnJhbWVzID0gMDsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgVFBERUNfUEFSQU1fVEFSR0VUTEFZT1VUOgorICAgICAgaFRwLT50YXJnZXRMYXlvdXQgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFBERUNfUEFSQU1fRk9SQ0VfQ09ORklHX0NIQU5HRToKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVt2YWx1ZV0uZm9yY2VDZmdDaGFuZ2UgPSBUUERFQ19GT1JDRV9DT05GSUdfQ0hBTkdFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUUERFQ19QQVJBTV9VU0VfRUxFTV9TS0lQUElORzoKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICBoVHAtPmZsYWdzIHw9IFRQREVDX1VTRV9FTEVNX1NLSVBQSU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaFRwLT5mbGFncyAmPSB+VFBERUNfVVNFX0VMRU1fU0tJUFBJTkc7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgfQpAQCAtMTIzOSwzOCArMTcxMSwzMCBAQAogICByZXR1cm4gZXJyb3I7CiB9CiAKLVVJTlQgdHJhbnNwb3J0RGVjX0dldE5yT2ZTdWJGcmFtZXMoSEFORExFX1RSQU5TUE9SVERFQyBoVHApCi17CitVSU5UIHRyYW5zcG9ydERlY19HZXROck9mU3ViRnJhbWVzKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKSB7CiAgIFVJTlQgblN1YkZyYW1lcyA9IDA7CiAKLSAgaWYgKGhUcCA9PSBOVUxMKQotICAgIHJldHVybiAwOworICBpZiAoaFRwID09IE5VTEwpIHJldHVybiAwOwogCi0gIGlmIChoVHAtPnRyYW5zcG9ydEZtdD09VFRfTVA0X0xBVE1fTUNQMSB8fCBoVHAtPnRyYW5zcG9ydEZtdD09VFRfTVA0X0xBVE1fTUNQMCB8fCBoVHAtPnRyYW5zcG9ydEZtdD09VFRfTVA0X0xPQVMpCisgIGlmIChoVHAtPnRyYW5zcG9ydEZtdCA9PSBUVF9NUDRfTEFUTV9NQ1AxIHx8CisgICAgICBoVHAtPnRyYW5zcG9ydEZtdCA9PSBUVF9NUDRfTEFUTV9NQ1AwIHx8IGhUcC0+dHJhbnNwb3J0Rm10ID09IFRUX01QNF9MT0FTKQogICAgIG5TdWJGcmFtZXMgPSBDTGF0bURlbXV4X0dldE5yT2ZTdWJGcmFtZXMoJmhUcC0+cGFyc2VyLmxhdG0pOwotICBlbHNlIGlmIChoVHAtPnRyYW5zcG9ydEZtdD09VFRfTVA0X0FEVFMpCisgIGVsc2UgaWYgKGhUcC0+dHJhbnNwb3J0Rm10ID09IFRUX01QNF9BRFRTKQogICAgIG5TdWJGcmFtZXMgPSBoVHAtPnBhcnNlci5hZHRzLmJzLm51bV9yYXdfYmxvY2tzOwogCiAgIHJldHVybiBuU3ViRnJhbWVzOwogfQogCi12b2lkIHRyYW5zcG9ydERlY19DbG9zZShIQU5ETEVfVFJBTlNQT1JUREVDICpwaFRwKQotewotICBpZiAocGhUcCAhPSBOVUxMKQotICB7Cit2b2lkIHRyYW5zcG9ydERlY19DbG9zZShIQU5ETEVfVFJBTlNQT1JUREVDICpwaFRwKSB7CisgIGlmIChwaFRwICE9IE5VTEwpIHsKICAgICBpZiAoKnBoVHAgIT0gTlVMTCkgewotICAgICAgaWYgKCAhIFRUX0lTX1BBQ0tFVCgoKnBoVHApLT50cmFuc3BvcnRGbXQpICkgewotICAgICAgICBGcmVlUmFtX1RyYW5zcG9ydERlY29kZXJCdWZmZXIoJigqcGhUcCktPmJzQnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGlmICgqcGhUcCAhPSBOVUxMKSB7Ci0gICAgICAgIEZyZWVSYW1fVHJhbnNwb3J0RGVjb2RlcihwaFRwKTsKLSAgICAgIH0KKyAgICAgIEZyZWVSYW1fVHJhbnNwb3J0RGVjb2RlckJ1ZmZlcigmKCpwaFRwKS0+YnNCdWZmZXIpOworICAgICAgRnJlZVJhbV9UcmFuc3BvcnREZWNvZGVyKHBoVHApOwogICAgIH0KICAgfQogfQogCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICkKLXsKK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykgewogICBpbnQgaTsKIAogICBpZiAoaW5mbyA9PSBOVUxMKSB7CkBAIC0xMjg0LDcgKzE3NDgsNyBAQAogICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpIHJldHVybiBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOwogICBpbmZvICs9IGk7CiAKLSAgaW5mby0+bW9kdWxlX2lkICA9IEZES19UUERFQzsKKyAgaW5mby0+bW9kdWxlX2lkID0gRkRLX1RQREVDOwogI2lmZGVmIF9fQU5EUk9JRF9fCiAgIGluZm8tPmJ1aWxkX2RhdGUgPSAiIjsKICAgaW5mby0+YnVpbGRfdGltZSA9ICIiOwpAQCAtMTI5Miw2MyArMTc1Niw2NCBAQAogICBpbmZvLT5idWlsZF9kYXRlID0gX19EQVRFX187CiAgIGluZm8tPmJ1aWxkX3RpbWUgPSBfX1RJTUVfXzsKICNlbmRpZgotICBpbmZvLT50aXRsZSAgICAgID0gVFBfTElCX1RJVExFOwotICBpbmZvLT52ZXJzaW9uICAgID0gTElCX1ZFUlNJT04oVFBfTElCX1ZMMCwgVFBfTElCX1ZMMSwgVFBfTElCX1ZMMik7CisgIGluZm8tPnRpdGxlID0gVFBfTElCX1RJVExFOworICBpbmZvLT52ZXJzaW9uID0gTElCX1ZFUlNJT04oVFBfTElCX1ZMMCwgVFBfTElCX1ZMMSwgVFBfTElCX1ZMMik7CiAgIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKTsKLSAgaW5mby0+ZmxhZ3MgPSAwCi0gICAgfCBDQVBGX0FESUYKLSAgICB8IENBUEZfQURUUwotICAgIHwgQ0FQRl9MQVRNCi0gICAgfCBDQVBGX0xPQVMKLSAgICB8IENBUEZfUkFXUEFDS0VUUwotICAgIHwgQ0FQRl9EUk0KLSAgICA7CisgIGluZm8tPmZsYWdzID0gMCB8IENBUEZfQURJRiB8IENBUEZfQURUUyB8IENBUEZfTEFUTSB8IENBUEZfTE9BUyB8CisgICAgICAgICAgICAgICAgQ0FQRl9SQVdQQUNLRVRTIHwgQ0FQRl9EUk07CiAKICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsgLyogRkRLRVJSX05PRVJST1I7ICovCiB9CiAKLQotaW50ICB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcoSEFORExFX1RSQU5TUE9SVERFQyBwVHAsIElOVCBtQml0cykKLXsKK2ludCB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcoSEFORExFX1RSQU5TUE9SVERFQyBwVHAsIElOVCBtQml0cykgewogICBzd2l0Y2ggKHBUcC0+dHJhbnNwb3J0Rm10KSB7Ci0gIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgcmV0dXJuIGFkdHNSZWFkX0NyY1N0YXJ0UmVnKCZwVHAtPnBhcnNlci5hZHRzLCAmcFRwLT5iaXRTdHJlYW1bMF0sIG1CaXRzKTsKLSAgY2FzZSBUVF9EUk06Ci0gICAgcmV0dXJuIGRybVJlYWRfQ3JjU3RhcnRSZWcoJnBUcC0+cGFyc2VyLmRybSwgJnBUcC0+Yml0U3RyZWFtWzBdLCBtQml0cyk7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIDA7CisgICAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICAgIHJldHVybiBhZHRzUmVhZF9DcmNTdGFydFJlZygmcFRwLT5wYXJzZXIuYWR0cywgJnBUcC0+Yml0U3RyZWFtWzBdLCBtQml0cyk7CisgICAgY2FzZSBUVF9EUk06CisgICAgICByZXR1cm4gZHJtUmVhZF9DcmNTdGFydFJlZygmcFRwLT5wYXJzZXIuZHJtLCAmcFRwLT5iaXRTdHJlYW1bMF0sIG1CaXRzKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0xOwogICB9CiB9CiAKLXZvaWQgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhIQU5ETEVfVFJBTlNQT1JUREVDIHBUcCwgSU5UIHJlZykKLXsKK3ZvaWQgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhIQU5ETEVfVFJBTlNQT1JUREVDIHBUcCwgSU5UIHJlZykgewogICBzd2l0Y2ggKHBUcC0+dHJhbnNwb3J0Rm10KSB7Ci0gIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgYWR0c1JlYWRfQ3JjRW5kUmVnKCZwVHAtPnBhcnNlci5hZHRzLCAmcFRwLT5iaXRTdHJlYW1bMF0sIHJlZyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFRfRFJNOgotICAgIGRybVJlYWRfQ3JjRW5kUmVnKCZwVHAtPnBhcnNlci5kcm0sICZwVHAtPmJpdFN0cmVhbVswXSwgcmVnKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBicmVhazsKKyAgICBjYXNlIFRUX01QNF9BRFRTOgorICAgICAgYWR0c1JlYWRfQ3JjRW5kUmVnKCZwVHAtPnBhcnNlci5hZHRzLCAmcFRwLT5iaXRTdHJlYW1bMF0sIHJlZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRUX0RSTToKKyAgICAgIGRybVJlYWRfQ3JjRW5kUmVnKCZwVHAtPnBhcnNlci5kcm0sICZwVHAtPmJpdFN0cmVhbVswXSwgcmVnKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgfQogfQogCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0NyY0NoZWNrKEhBTkRMRV9UUkFOU1BPUlRERUMgcFRwKQoteworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19DcmNDaGVjayhIQU5ETEVfVFJBTlNQT1JUREVDIHBUcCkgewogICBzd2l0Y2ggKHBUcC0+dHJhbnNwb3J0Rm10KSB7Ci0gIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgaWYgKCAocFRwLT5wYXJzZXIuYWR0cy5icy5udW1fcmF3X2Jsb2NrcyA+IDApICYmIChwVHAtPnBhcnNlci5hZHRzLmJzLnByb3RlY3Rpb25fYWJzZW50ID09IDApICkKLSAgICB7Ci0gICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmcFRwLT5iaXRTdHJlYW1bMF07Ci0gICAgICAKLSAgICAgIHRyYW5zcG9ydERlY19BZGp1c3RFbmRPZkFjY2Vzc1VuaXQocFRwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFkdHNSZWFkX0NyY0NoZWNrKCZwVHAtPnBhcnNlci5hZHRzKTsKLSAgY2FzZSBUVF9EUk06Ci0gICAgcmV0dXJuIGRybVJlYWRfQ3JjQ2hlY2soJnBUcC0+cGFyc2VyLmRybSk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKKyAgICBjYXNlIFRUX01QNF9BRFRTOgorICAgICAgaWYgKChwVHAtPnBhcnNlci5hZHRzLmJzLm51bV9yYXdfYmxvY2tzID4gMCkgJiYKKyAgICAgICAgICAocFRwLT5wYXJzZXIuYWR0cy5icy5wcm90ZWN0aW9uX2Fic2VudCA9PSAwKSkgeworICAgICAgICB0cmFuc3BvcnREZWNfQWRqdXN0RW5kT2ZBY2Nlc3NVbml0KHBUcCk7CisgICAgICB9CisgICAgICByZXR1cm4gYWR0c1JlYWRfQ3JjQ2hlY2soJnBUcC0+cGFyc2VyLmFkdHMpOworICAgIGNhc2UgVFRfRFJNOgorICAgICAgcmV0dXJuIGRybVJlYWRfQ3JjQ2hlY2soJnBUcC0+cGFyc2VyLmRybSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7CiAgIH0KIH0KKworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19Ecm1SYXdTZGNBdWRpb0NvbmZpZ19DaGVjayhVQ0hBUiAqY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsZW5ndGgpIHsKKyAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnIGFzYzsKKyAgRkRLX0JJVFNUUkVBTSBiczsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gJmJzOworCisgIEZES2luaXRCaXRTdHJlYW0oaEJzLCBjb25mLCBCVUZTSVpFX0RVTU1ZX1ZBTFVFLCBsZW5ndGggPDwgMywgQlNfUkVBREVSKTsKKworICBUUkFOU1BPUlRERUNfRVJST1IgZXJyID0KKyAgICAgIERybVJhd1NkY0F1ZGlvQ29uZmlnX1BhcnNlKCZhc2MsIGhCcywgTlVMTCwgKFVDSEFSKUFDX0NNX0FMTE9DX01FTSwgMCk7CisKKyAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvdmVyc2lvbiBiL2xpYk1wZWdUUERlYy9zcmMvdmVyc2lvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlMjJjOS4uMDAwMDAwMAotLS0gYS9saWJNcGVnVFBEZWMvc3JjL3ZlcnNpb24KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLS8qIGxpYnJhcnkgaW5mbyAqLwotI2RlZmluZSBUUF9MSUJfVkwwIDIKLSNkZWZpbmUgVFBfTElCX1ZMMSAzCi0jZGVmaW5lIFRQX0xJQl9WTDIgNwotI2RlZmluZSBUUF9MSUJfVElUTEUgIk1QRUcgVHJhbnNwb3J0IgotI2lmZGVmIF9fQU5EUk9JRF9fCi0jZGVmaW5lIFRQX0xJQl9CVUlMRF9EQVRFICIiCi0jZGVmaW5lIFRQX0xJQl9CVUlMRF9USU1FICIiCi0jZWxzZQotI2RlZmluZSBUUF9MSUJfQlVJTERfREFURSBfX0RBVEVfXwotI2RlZmluZSBUUF9MSUJfQlVJTERfVElNRSBfX1RJTUVfXwotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJNcGVnVFBFbmMvaW5jbHVkZS9tcGVnRmlsZVdyaXRlLmggYi9saWJNcGVnVFBFbmMvaW5jbHVkZS9tcGVnRmlsZVdyaXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODZhMGIuLjAwMDAwMDAKLS0tIGEvbGliTXBlZ1RQRW5jL2luY2x1ZGUvbXBlZ0ZpbGVXcml0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKLSAgIERlc2NyaXB0aW9uOiBCaXRzdHJlYW0gZGF0YSBwcm92aWRlciBmb3IgTVA0IGRlY29kZXJzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgotI2luY2x1ZGUgIkZES19hdWRpby5oIgotCi0vKiE8IElmIE1QRldSSVRFX01QNEZGX0VOQUJMRSBpcyBzZXQsIGluY2x1ZGUgc3VwcG9ydCBmb3IgTVBFRyBJU08gZmlsZWZvcm1hdC4KLSAgICAgSWYgbm90IHNldCwgbm8gLm1wNCwgLm00YSBhbmQgLjNncCBmaWxlcyBjYW4gYmUgdXNlZCBmb3IgaW5wdXQuICAqLwotLyogI2RlZmluZSBNUEZXUklURV9NUDRGRl9FTkFCTEUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgU1RSVUNUX0ZJTEVXUklURSAqSEFORExFX0ZJTEVXUklURTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqIFxicmllZiAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuIGFuIE1QRUcgYXVkaW8gZmlsZS4KLSAqIFxwYXJhbSBtcGVnRmlsZVdyaXRlX0ZpbGVuYW1lICBTdHJpbmcgb2YgdGhlIGZpbGVuYW1lIHRvIGJlIG9wZW5lZC4KLSAqIFxwYXJhbSBmaWxlRm10ICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgZm9ybWF0IHRvIHVzZS4KLSAqIFxwYXJhbSBjb25mCi0gKiBccGFyYW0gY29uZlNpemUKLSAqIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICBNUEVHIGZpbGUgd3JpdGUgaGFuZGxlLgotICovCi1IQU5ETEVfRklMRVdSSVRFIG1wZWdGaWxlV3JpdGVfT3BlbiggY2hhciAgICAgICAgICAgKm1wZWdGaWxlV3JpdGVfRmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9GT1JNQVQgICAgIGZpbGVGbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1RZUEUgIHRyYW5zcG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgKmNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgIGNvbmZTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogXGJyaWVmICAgICAgICAgICAgIFdyaXRlIHRvIGFuIE1QRUcgYXVkaW8gZmlsZS4KLSAqIFxwYXJhbSBpbkJ1ZmZlciAgICBCdWZmZXIgdG8gd3JpdGUuCi0gKiBccGFyYW0gYnVmZmVyU2l6ZSAgU2l6ZSBvZiBidWZmZXIgdG8gd3JpdGUgaW4gYnl0ZXMuCi0gKiBccmV0dXJuICAgICAgICAgICAgMCBvbiBzdWNlc3MsIC0xIG9uIHVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0IG9yIHdyaXRlIGVycm9yLgotICovCi1pbnQgbXBlZ0ZpbGVXcml0ZV9Xcml0ZSggSEFORExFX0ZJTEVXUklURSAgaEZpbGVXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICppbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGJ1ZmZlclNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBcYnJpZWYgICAgICAgICAgICAgRGVhbGxvY2F0ZSBtZW1vcnkgYW5kIGNsb3NlIGZpbGUuCi0gKiBccGFyYW0gaEZpbGVXcml0ZSAgTVBFRyBmaWxlIHdyaXRlIGhhbmRsZS4KLSAqIFxyZXR1cm4gICAgICAgICAgICAwIG9uIHN1Y2Vzcy4KLSAqLwotaW50IG1wZWdGaWxlV3JpdGVfQ2xvc2UoIEhBTkRMRV9GSUxFV1JJVEUgKmhGaWxlV3JpdGUgKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRW5jL2luY2x1ZGUvdHBfZGF0YS5oIGIvbGliTXBlZ1RQRW5jL2luY2x1ZGUvdHBfZGF0YS5oCmluZGV4IGM2ZTg5YjUuLjZmMDMyZDEgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUEVuYy9pbmNsdWRlL3RwX2RhdGEuaAorKysgYi9saWJNcGVnVFBFbmMvaW5jbHVkZS90cF9kYXRhLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTcgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6IE1hbnVlbCBKYW5kZXIKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKICAgIERlc2NyaXB0aW9uOiBNUEVHIFRyYW5zcG9ydCBkYXRhIHRhYmxlcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fVFBfREFUQV9IX18KLSNkZWZpbmUgX19UUF9EQVRBX0hfXworI2lmbmRlZiBUUF9EQVRBX0gKKyNkZWZpbmUgVFBfREFUQV9ICiAKICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKICNpbmNsdWRlICJGREtfYXVkaW8uaCIKQEAgLTk4LDE3ICsxMTAsMzUgQEAKIC8qCiAgKiBDb25maWd1cmF0aW9uCiAgKi8KLSNkZWZpbmUgVFBfR0FfRU5BQkxFCi0vKiAjZGVmaW5lIFRQX0NFTFBfRU5BQkxFICovCi0vKiAjZGVmaW5lIFRQX0hWWENfRU5BQkxFICovCi0vKiAjZGVmaW5lIFRQX1NMU19FTkFCTEUgKi8KLSNkZWZpbmUgVFBfRUxEX0VOQUJMRQotLyogI2RlZmluZSBUUF9VU0FDX0VOQUJMRSAqLwotLyogI2RlZmluZSBUUF9SU1ZENTBfRU5BQkxFICovCiAKLSNpZiBkZWZpbmVkKFRQX0dBX0VOQUJMRSkgfHwgZGVmaW5lZChUUF9TTFNfRU5BQkxFKQotI2RlZmluZSBUUF9QQ0VfRU5BQkxFICAgICAgIC8qKjwgRW5hYmxlIGZ1bGwgUENFIHN1cHBvcnQgKi8KLSNlbmRpZgorI2RlZmluZSBUUF9VU0FDX01BWF9TUEVBS0VSUyAoMjQpCisKKyNkZWZpbmUgVFBfVVNBQ19NQVhfRVhUX0VMRU1FTlRTICgoMjQpKQorCisjZGVmaW5lIFRQX1VTQUNfTUFYX0VMRU1FTlRTICgoMjQpICsgVFBfVVNBQ19NQVhfRVhUX0VMRU1FTlRTKQorCisjZGVmaW5lIFRQX1VTQUNfTUFYX0NPTkZJR19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgNTEyIC8qIG5leHQgcG93ZXIgb2YgdHdvIG9mIG1heGltdW0gb2YgZXNjYXBlZFZhbHVlKGhCcywgNCwgNCwgOCkgaW4gXAorICAgICAgICAgQXVkaW9QcmVSb2xsKCkgKDI4NSkgKi8KKworI2RlZmluZSBUUERFQ19VU0FDX05VTV9DT05GSUdfQ0hBTkdFX0ZSQU1FUyBcCisgICgxKSAvKiBOdW1iZXIgb2YgZnJhbWVzIGZvciBjb25maWcgY2hhbmdlIGluIFVTQUMgKi8KKworZW51bSB7CisgIFRQREVDX0ZMVVNIX09GRiA9IDAsCisgIFRQREVDX1JTVjYwX0NGR19DSEFOR0VfQVRTQ19GTFVTSF9PTiA9IDEsCisgIFRQREVDX1JTVjYwX0RBU0hfSVBGX0FUU0NfRkxVU0hfT04gPSAyLAorICBUUERFQ19VU0FDX0RBU0hfSVBGX0ZMVVNIX09OID0gMworfTsKKworZW51bSB7CisgIFRQREVDX0JVSUxEX1VQX09GRiA9IDAsCisgIFRQREVDX1JTVjYwX0JVSUxEX1VQX09OID0gMSwKKyAgVFBERUNfUlNWNjBfQlVJTERfVVBfT05fSU5fQkFORCA9IDIsCisgIFRQREVDX1VTQUNfQlVJTERfVVBfT04gPSAzLAorICBUUERFQ19SU1Y2MF9CVUlMRF9VUF9JRExFID0gNCwKKyAgVFBERUNfUlNWNjBfQlVJTERfVVBfSURMRV9JTl9CQU5EID0gNQorfTsKIAogLyoqCiAgKiBQcm9ncmFtQ29uZmlnIHN0cnVjdC4KQEAgLTExNiwxMyArMTQ2LDEyIEBACiAvKiBJU08vSUVDIDE0NDk2LTMgNC40LjEuMSBUYWJsZSA0LjIgUHJvZ3JhbSBjb25maWcgZWxlbWVudCAqLwogI2RlZmluZSBQQ19GU0JfQ0hBTk5FTFNfTUFYIDE2IC8qIEZyb250L1NpZGUvQmFjayBjaGFubmVscyAqLwogI2RlZmluZSBQQ19MRkVfQ0hBTk5FTFNfTUFYIDQKLSNkZWZpbmUgUENfQVNTT0NEQVRBX01BWCAgICA4Ci0jZGVmaW5lIFBDX0NDRUxfTUFYICAgICAgICAgMTYgLyogQ0MgZWxlbWVudHMgKi8KLSNkZWZpbmUgUENfQ09NTUVOVExFTkdUSCAgICAyNTYKKyNkZWZpbmUgUENfQVNTT0NEQVRBX01BWCA4CisjZGVmaW5lIFBDX0NDRUxfTUFYIDE2IC8qIENDIGVsZW1lbnRzICovCisjZGVmaW5lIFBDX0NPTU1FTlRMRU5HVEggMjU2CisjZGVmaW5lIFBDX05VTV9IRUlHSFRfTEFZRVIgMwogCi10eXBlZGVmIHN0cnVjdAotewotI2lmZGVmIFRQX1BDRV9FTkFCTEUKK3R5cGVkZWYgc3RydWN0IHsKICAgLyogUENFIGJpdHN0cmVhbSBlbGVtZW50czogKi8KICAgVUNIQVIgRWxlbWVudEluc3RhbmNlVGFnOwogICBVQ0hBUiBQcm9maWxlOwpAQCAtMTY1LDU0ICsxOTQsNTAgQEAKIAogICBVQ0hBUiBDb21tZW50RmllbGRCeXRlczsKICAgVUNIQVIgQ29tbWVudFtQQ19DT01NRU5UTEVOR1RIXTsKLSNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCiAKICAgLyogSGVscGVyIHZhcmlhYmxlcyBmb3IgYWRtaW5pc3RyYXRpb246ICovCi0gIFVDSEFSIGlzVmFsaWQ7ICAgICAgICAgICAgICAgLyohPCBGbGFnIHNob3dpbmcgaWYgUENFIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LiAqLwotICBVQ0hBUiBOdW1DaGFubmVsczsgICAgICAgICAgIC8qITwgQW1vdW50IG9mIGF1ZGlvIGNoYW5uZWxzIHN1bW1pbmcgYWxsIGNoYW5uZWwgZWxlbWVudHMgaW5jbHVkaW5nIExGRXMgKi8KLSAgVUNIQVIgTnVtRWZmZWN0aXZlQ2hhbm5lbHM7ICAvKiE8IEFtb3VudCBvZiBhdWRpbyBjaGFubmVscyBzdW1taW5nIG9ubHkgU0NFcyBhbmQgQ1BFcyAqLworICBVQ0hBUiBpc1ZhbGlkOyAvKiE8IEZsYWcgc2hvd2luZyBpZiBQQ0UgaGFzIGJlZW4gcmVhZCBzdWNjZXNzZnVsbHkuICovCisgIFVDSEFSCisgIE51bUNoYW5uZWxzOyAvKiE8IEFtb3VudCBvZiBhdWRpbyBjaGFubmVscyBzdW1taW5nIGFsbCBjaGFubmVsIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgTEZFcyAqLworICBVQ0hBUiBOdW1FZmZlY3RpdmVDaGFubmVsczsgLyohPCBBbW91bnQgb2YgYXVkaW8gY2hhbm5lbHMgc3VtbWluZyBvbmx5IFNDRXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBDUEVzICovCiAgIFVDSEFSIGVsQ291bnRlcjsKIAogfSBDUHJvZ3JhbUNvbmZpZzsKIAogdHlwZWRlZiBlbnVtIHsKICAgQVNDRVhUX1VOS09XTiA9IC0xLAotICBBU0NFWFRfU0JSICAgID0gMHgyYjcsCi0gIEFTQ0VYVF9QUyAgICAgPSAweDU0OCwKLSAgQVNDRVhUX01QUyAgICA9IDB4NzZhLAotICBBU0NFWFRfU0FPQyAgID0gMHg3Y2IsCi0gIEFTQ0VYVF9MRE1QUyAgPSAweDdjYworICBBU0NFWFRfU0JSID0gMHgyYjcsCisgIEFTQ0VYVF9QUyA9IDB4NTQ4LAorICBBU0NFWFRfTVBTID0gMHg3NmEsCisgIEFTQ0VYVF9TQU9DID0gMHg3Y2IsCisgIEFTQ0VYVF9MRE1QUyA9IDB4N2NjCiAKIH0gVFBfQVNDX0VYVEVOU0lPTl9JRDsKIAotI2lmZGVmIFRQX0dBX0VOQUJMRQogLyoqCiAgKiBHYVNwZWNpZmljQ29uZmlnIHN0cnVjdAogICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIFVJTlQgbV9mcmFtZUxlbmd0aEZsYWcgOwotICBVSU5UIG1fZGVwZW5kc09uQ29yZUNvZGVyIDsKLSAgVUlOVCBtX2NvcmVDb2RlckRlbGF5IDsKKyAgVUlOVCBtX2ZyYW1lTGVuZ3RoRmxhZzsKKyAgVUlOVCBtX2RlcGVuZHNPbkNvcmVDb2RlcjsKKyAgVUlOVCBtX2NvcmVDb2RlckRlbGF5OwogCi0gIFVJTlQgbV9leHRlbnNpb25GbGFnIDsKLSAgVUlOVCBtX2V4dGVuc2lvbkZsYWczIDsKKyAgVUlOVCBtX2V4dGVuc2lvbkZsYWc7CisgIFVJTlQgbV9leHRlbnNpb25GbGFnMzsKIAogICBVSU5UIG1fbGF5ZXI7CiAgIFVJTlQgbV9udW1PZlN1YkZyYW1lOwogICBVSU5UIG1fbGF5ZXJMZW5ndGg7CiAKIH0gQ1NHYVNwZWNpZmljQ29uZmlnOwotI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLwotCi0KLQotCi0jaWZkZWYgVFBfRUxEX0VOQUJMRQogCiB0eXBlZGVmIGVudW0gewotICBFTERFWFRfVEVSTSAgPSAweDAsICAgLyogVGVybWluYXRpb24gdGFnICovCi0gIEVMREVYVF9TQU9DICA9IDB4MSwgICAvKiBTQU9DIGNvbmZpZyAqLwotICBFTERFWFRfTERTQUMgPSAweDIgICAgLyogTEQgTVBFRyBTdXJyb3VuZCBjb25maWcgKi8KKyAgRUxERVhUX1RFUk0gPSAweDAsICAgICAgICAgLyogVGVybWluYXRpb24gdGFnICovCisgIEVMREVYVF9TQU9DID0gMHgxLCAgICAgICAgIC8qIFNBT0MgY29uZmlnICovCisgIEVMREVYVF9MRFNBQyA9IDB4MiwgICAgICAgIC8qIExEIE1QRUcgU3Vycm91bmQgY29uZmlnICovCisgIEVMREVYVF9ET1dOU0NBTEVJTkZPID0gMHgzIC8qIEVMRCBzYW1wbGUgcmF0ZSBhZGFwdGF0aW9uICovCiAgIC8qIHJlc2VydmVkICovCiB9IEFTQ19FTERfRVhUX1RZUEU7CiAKQEAgLTIyMCwxMDMgKzI0NSwxODYgQEAKICAgVUNIQVIgbV9mcmFtZUxlbmd0aEZsYWc7CiAKICAgVUNIQVIgbV9zYnJQcmVzZW50RmxhZzsKLSAgVUNIQVIgbV91c2VMZFFtZlRpbWVBbGlnbjsgIC8qIFVzZSBMRC1NUFMgUU1GIGluIFNCUiB0byBhY2hpdmUgdGltZSBhbGlnbm1lbnQgKi8KKyAgVUNIQVIKKyAgbV91c2VMZFFtZlRpbWVBbGlnbjsgLyogVXNlIExELU1QUyBRTUYgaW4gU0JSIHRvIGFjaGl2ZSB0aW1lIGFsaWdubWVudCAqLwogICBVQ0hBUiBtX3NiclNhbXBsaW5nUmF0ZTsKICAgVUNIQVIgbV9zYnJDcmNGbGFnOworICBVSU5UIG1fZG93bnNjYWxlZFNhbXBsaW5nRnJlcXVlbmN5OwogCiB9IENTRWxkU3BlY2lmaWNDb25maWc7Ci0jZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLwogCit0eXBlZGVmIHN0cnVjdCB7CisgIFVTQUNfRVhUX0VMRU1FTlRfVFlQRSB1c2FjRXh0RWxlbWVudFR5cGU7CisgIFVTSE9SVCB1c2FjRXh0RWxlbWVudENvbmZpZ0xlbmd0aDsKKyAgVVNIT1JUIHVzYWNFeHRFbGVtZW50RGVmYXVsdExlbmd0aDsKKyAgVUNIQVIgdXNhY0V4dEVsZW1lbnRQYXlsb2FkRnJhZzsKKyAgVUNIQVIgdXNhY0V4dEVsZW1lbnRIYXNBdWRpb1ByZVJvbGw7Cit9IENTVXNhY0V4dEVsZW1lbnRDb25maWc7CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgTVA0X0VMRU1FTlRfSUQgdXNhY0VsZW1lbnRUeXBlOworICBVQ0hBUiBtX25vaXNlRmlsbGluZzsKKyAgVUNIQVIgbV9oYXJtb25pY1NCUjsKKyAgVUNIQVIgbV9pbnRlclRlczsKKyAgVUNIQVIgbV9wdmM7CisgIFVDSEFSIG1fc3RlcmVvQ29uZmlnSW5kZXg7CisgIENTVXNhY0V4dEVsZW1lbnRDb25maWcgZXh0RWxlbWVudDsKK30gQ1NVc2FjRWxlbWVudENvbmZpZzsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBtX2ZyYW1lTGVuZ3RoRmxhZzsKKyAgVUNIQVIgbV9jb3JlU2JyRnJhbWVMZW5ndGhJbmRleDsKKyAgVUNIQVIgbV9zYnJSYXRpb0luZGV4OworICBVQ0hBUiBtX25Vc2FjQ2hhbm5lbHM7IC8qIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyBzaWduYWxlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzYWNEZWNvZGVyQ29uZmlnKCkgLyByc3Y2MDNkYURlY29kZXJDb25maWcoKSB2aWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1FbGVtZW50cyBhbmQgdXNhY0VsZW1lbnRUeXBlICovCisgIFVDSEFSIG1fY2hhbm5lbENvbmZpZ3VyYXRpb25JbmRleDsKKyAgVUlOVCBtX3VzYWNOdW1FbGVtZW50czsKKyAgQ1NVc2FjRWxlbWVudENvbmZpZyBlbGVtZW50W1RQX1VTQUNfTUFYX0VMRU1FTlRTXTsKKworICBVQ0hBUiBudW1BdWRpb0NoYW5uZWxzOworICBVQ0hBUiBtX3VzYWNDb25maWdFeHRlbnNpb25QcmVzZW50OworICBVQ0hBUiBlbGVtZW50TGVuZ3RoUHJlc2VudDsKKyAgVUNIQVIgVXNhY0NvbmZpZ1tUUF9VU0FDX01BWF9DT05GSUdfTEVOXTsKKyAgVVNIT1JUIFVzYWNDb25maWdCaXRzOworfSBDU1VzYWNDb25maWc7CiAKIC8qKgogICogQXVkaW8gY29uZmlndXJhdGlvbiBzdHJ1Y3QsIHN1aXRhYmxlIGZvciBlbmNvZGVyIGFuZCBkZWNvZGVyIGNvbmZpZ3VyYXRpb24uCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQogICAvKiBYWVogU3BlY2lmaWMgRGF0YSAqLwogICB1bmlvbiB7Ci0jaWZkZWYgVFBfR0FfRU5BQkxFCi0gICAgQ1NHYVNwZWNpZmljQ29uZmlnICAgIG1fZ2FTcGVjaWZpY0NvbmZpZzsgICAgICAgLyoqPCBHZW5lcmFsIGF1ZGlvIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICAgICAgICAgKi8KLSNlbmRpZiAvKiBUUF9HQV9FTkFCTEUgKi8KLSNpZmRlZiBUUF9FTERfRU5BQkxFCi0gICAgQ1NFbGRTcGVjaWZpY0NvbmZpZyAgIG1fZWxkU3BlY2lmaWNDb25maWc7ICAgICAgLyoqPCBFTEQgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAgICAgKi8KLSNlbmRpZiAvKiBUUF9FTERfRU5BQkxFICovCisgICAgQ1NHYVNwZWNpZmljQ29uZmlnCisgICAgICAgIG1fZ2FTcGVjaWZpY0NvbmZpZzsgLyoqPCBHZW5lcmFsIGF1ZGlvIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICovCisgICAgQ1NFbGRTcGVjaWZpY0NvbmZpZyBtX2VsZFNwZWNpZmljQ29uZmlnOyAvKio8IEVMRCBzcGVjaWZpYyBjb25maWd1cmF0aW9uLiAqLworICAgIENTVXNhY0NvbmZpZyBtX3VzYWNDb25maWc7IC8qKjwgVVNBQyBzcGVjaWZpYyBjb25maWd1cmF0aW9uICAgICAgICAgICAgICAgKi8KICAgfSBtX3NjOwotICAKKwogICAvKiBDb21tb24gQVNDIHBhcmFtZXRlcnMgKi8KLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCi0gIENQcm9ncmFtQ29uZmlnICAgICAgICBtX3Byb2dyQ29uZmlnRWxlbWVudDsgICAgIC8qKjwgUHJvZ3JhbSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCisgIENQcm9ncmFtQ29uZmlnIG1fcHJvZ3JDb25maWdFbGVtZW50OyAvKio8IFByb2dyYW0gY29uZmlndXJhdGlvbi4gKi8KIAotICBBVURJT19PQkpFQ1RfVFlQRSAgICAgbV9hb3Q7ICAgICAgICAgICAgICAgICAgICAvKio8IEF1ZGlvIE9iamVjdCBUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFVJTlQgICAgICAgICAgICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5OyAgICAgIC8qKjwgU2FtcGxlcmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVUlOVCAgICAgICAgICAgICAgICAgIG1fc2FtcGxlc1BlckZyYW1lOyAgICAgICAgLyoqPCBBbW91bnQgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuICAgICAgICAgICAgICAgICAgICAqLwotICBVSU5UICAgICAgICAgICAgICAgICAgbV9kaXJlY3RNYXBwaW5nOyAgICAgICAgICAvKio8IERvY3VtZW50IHRoaXMgcGxlYXNlICEhICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFVRElPX09CSkVDVF9UWVBFIG1fYW90OyAgLyoqPCBBdWRpbyBPYmplY3QgVHlwZS4gICovCisgIFVJTlQgbV9zYW1wbGluZ0ZyZXF1ZW5jeTsgLyoqPCBTYW1wbGVyYXRlLiAqLworICBVSU5UIG1fc2FtcGxlc1BlckZyYW1lOyAgIC8qKjwgQW1vdW50IG9mIHNhbXBsZXMgcGVyIGZyYW1lLiAgICovCisgIFVJTlQgbV9kaXJlY3RNYXBwaW5nOyAvKio8IERvY3VtZW50IHRoaXMgcGxlYXNlICEhICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgQVVESU9fT0JKRUNUX1RZUEUgICAgIG1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlOyAgICAgICAgLyoqPCBBdWRpbyBvYmplY3QgdHlwZSAgICAgICAgICAgICAgICAgICAgICAqLwotICBVSU5UICAgICAgICAgICAgICAgICAgbV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeTsgICAgICAvKio8IFNhbXBsZXJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAKKyAgQVVESU9fT0JKRUNUX1RZUEUgbV9leHRlbnNpb25BdWRpb09iamVjdFR5cGU7IC8qKjwgQXVkaW8gb2JqZWN0IHR5cGUgKi8KKyAgVUlOVCBtX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5OyAgICAgICAgICAgIC8qKjwgU2FtcGxlcmF0ZSAgICAgICAgICAgICovCiAKLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fY2hhbm5lbENvbmZpZ3VyYXRpb247ICAgLyoqPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXggICAgICAgICAgICAgICAgICAgICAqLworICBTQ0hBUiBtX2NoYW5uZWxDb25maWd1cmF0aW9uOyAvKio8IENoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCAqLwogCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX2VwQ29uZmlnOyAgICAgICAgICAgICAgIC8qKjwgRXJyb3IgcHJvdGVjdGlvbiBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX3ZjYjExRmxhZzsgICAgICAgICAgICAgIC8qKjwgYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgICAgICovCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX3J2bGNGbGFnOyAgICAgICAgICAgICAgIC8qKjwgYWFjU2NhbGVmYWN0b3JEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICovCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX2hjckZsYWc7ICAgICAgICAgICAgICAgIC8qKjwgYWFjU3BlY3RyYWxEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSIG1fZXBDb25maWc7ICAvKio8IEVycm9yIHByb3RlY3Rpb24gaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTQ0hBUiBtX3ZjYjExRmxhZzsgLyoqPCBhYWNTZWN0aW9uRGF0YVJlc2lsaWVuY2VGbGFnICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0NIQVIgbV9ydmxjRmxhZzsgIC8qKjwgYWFjU2NhbGVmYWN0b3JEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICovCisgIFNDSEFSIG1faGNyRmxhZzsgICAvKio8IGFhY1NwZWN0cmFsRGF0YVJlc2lsaWVuY2VGbGFnICAgICAgICAgICAgICAgICAgICAqLwogCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX3NiclByZXNlbnRGbGFnOyAgICAgICAgIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiBTQlIgZGF0YSBpbiB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgKi8KLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fcHNQcmVzZW50RmxhZzsgICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIHBhcmFtZXRyaWMgc3RlcmVvIGRhdGEgaW4gdGhlIGJpdHN0cmVhbSAqLwotICBVQ0hBUiAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4OyAvKio8IFNhbXBsZXJhdGUgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBVQ0hBUiAgICAgICAgICAgICAgICAgbV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4OyAvKio8IFNhbXBsZXJhdGUgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAqLwotICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9leHRlbnNpb25DaGFubmVsQ29uZmlndXJhdGlvbjsgICAvKio8IENoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCAgICAgICAgICAgICAqLworICBTQ0hBUiBtX3NiclByZXNlbnRGbGFnOyAvKio8IEZsYWcgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YgU0JSIGRhdGEgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbSAgICAgICAgICAgICAgICovCisgIFNDSEFSCisgIG1fcHNQcmVzZW50RmxhZzsgLyoqPCBGbGFnIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIHBhcmFtZXRyaWMgc3RlcmVvCisgICAgICAgICAgICAgICAgICAgICAgZGF0YSBpbiB0aGUgYml0c3RyZWFtICovCisgIFVDSEFSIG1fc2FtcGxpbmdGcmVxdWVuY3lJbmRleDsgICAgICAgICAgLyoqPCBTYW1wbGVyYXRlIGluZGV4ICAgICAgICAgICovCisgIFVDSEFSIG1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3lJbmRleDsgLyoqPCBTYW1wbGVyYXRlIGluZGV4ICovCisgIFNDSEFSIG1fZXh0ZW5zaW9uQ2hhbm5lbENvbmZpZ3VyYXRpb247ICAgLyoqPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXggICAqLworCisgIFVDSEFSCisgIGNvbmZpZ01vZGU7IC8qKjwgVGhlIGZsYWcgaW5kaWNhdGVzIGlmIHRoZSBjYWxsYmFjayBzaGFsbCB3b3JrIGluIG1lbW9yeQorICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uIG1vZGUgb3IgaW4gY29uZmlnIGNoYW5nZSBkZXRlY3Rpb24gbW9kZSAqLworICBVQ0hBUiBBYWNDb25maWdDaGFuZ2VkOyAvKio8IFRoZSBmbGFnIHdpbGwgYmUgc2V0IGlmIGF0IGxlYXN0IG9uZSBhYWMgY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBoYXMgY2hhbmdlZCB0aGF0IHJlcXVpcmVzIGEgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgY2xlYXJlZCAqLworICBVQ0hBUiBTYnJDb25maWdDaGFuZ2VkOyAvKio8IFRoZSBmbGFnIHdpbGwgYmUgc2V0IGlmIGF0IGxlYXN0IG9uZSBzYnIgY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBoYXMgY2hhbmdlZCB0aGF0IHJlcXVpcmVzIGEgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgY2xlYXJlZCAqLworICBVQ0hBUiBTYWNDb25maWdDaGFuZ2VkOyAvKio8IFRoZSBmbGFnIHdpbGwgYmUgc2V0IGlmIGF0IGxlYXN0IG9uZSBzYWMgY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBoYXMgY2hhbmdlZCB0aGF0IHJlcXVpcmVzIGEgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgY2xlYXJlZCAqLworCisgIFVDSEFSCisgIGNvbmZpZ1tUUF9VU0FDX01BWF9DT05GSUdfTEVOXTsgLyoqPCBDb25maWd1cmF0aW9uIHN0b3JlZCBhcyBiaXRzdHJlYW0gKi8KKyAgVUlOVCBjb25maWdCaXRzOyAgICAgICAgICAgICAgICAvKio8IENvbmZpZ3VyYXRpb24gbGVuZ3RoIGluIGJpdHMgKi8KIAogfSBDU0F1ZGlvU3BlY2lmaWNDb25maWc7CiAKLXR5cGVkZWYgSU5UICgqY2JVcGRhdGVDb25maWdfdCkodm9pZCosIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyopOwotdHlwZWRlZiBJTlQgKCpjYlNzY190KSgKLSAgICAgICAgdm9pZCosIEhBTkRMRV9GREtfQklUU1RSRUFNLAotICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ0ZyZXF1ZW5jeSwKLSAgICAgICAgY29uc3QgSU5UIG11eE1vZGUsCi0gICAgICAgIGNvbnN0IElOVCBjb25maWdCeXRlcwotICAgICAgICApOwotdHlwZWRlZiBJTlQgKCpjYlNicl90KSgKLSAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgaEJzLAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUluLAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZU91dCwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAotICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCAgICBlbGVtZW50SUQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgIGVsZW1lbnRJbmRleAotICAgICAgICApOwordHlwZWRlZiBzdHJ1Y3QgeworICBTQ0hBUiBmbHVzaENudDsgICAgICAvKio8IEZsdXNoIGZyYW1lIGNvdW50ZXIgKi8KKyAgVUNIQVIgZmx1c2hTdGF0dXM7ICAgLyoqPCBGbGFnIGluZGljYXRlcyBmbHVzaCBtb2RlOiBvbnxvZmYgKi8KKyAgU0NIQVIgYnVpbGRVcENudDsgICAgLyoqPCBCdWlsZCB1cCBmcmFtZSBjb3VudGVyICovCisgIFVDSEFSIGJ1aWxkVXBTdGF0dXM7IC8qKjwgRmxhZyBpbmRpY2F0ZXMgYnVpbGQgdXAgbW9kZTogb258b2ZmICovCisgIFVDSEFSIGNmZ0NoYW5nZWQ7IC8qKjwgRmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29uZmlnIGNoYW5nZWQgYW5kIHRoZSBkZWNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGFnYWluIHZpYSBjYWxsYmFjay4gTWFrZSBzdXJlCisgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVtb3J5IGlzIGZyZWVkIGJlZm9yZSBpbml0aWFsaXphdGlvbi4gKi8KKyAgVUNIQVIgY29udGVudENoYW5nZWQ7IC8qKjwgRmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29udGVudCBjaGFuZ2VkIGkuZS4gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgdHJ1bmNhdGlvbiBvY2N1cmVkIGJlZm9yZSAqLworICBVQ0hBUiBmb3JjZUNmZ0NoYW5nZTsgLyoqPCBGbGFnIGluZGljYXRlcyBpZiBjb25maWcgY2hhbmdlIGhhcyB0byBiZSBmb3JjZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW4gaWYgbmV3IGNvbmZpZyBpcyB0aGUgc2FtZSAqLworfSBDQ3RybENGR0NoYW5nZTsKIAotdHlwZWRlZiBzdHJ1Y3QgIHsKLSAgY2JVcGRhdGVDb25maWdfdCBjYlVwZGF0ZUNvbmZpZzsgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBDb25maWcgY2hhbmdlIG5vdGlmeSBjYWxsYmFjay4gICovCi0gIHZvaWQgKmNiVXBkYXRlQ29uZmlnRGF0YTsgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2Ugbm90aWZ5IGNhbGxiYWNrLiAqLwotICBjYlNzY190IGNiU3NjOyAgICAgICAgICAgICAgICAgICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCi0gIHZvaWQgKmNiU3NjRGF0YTsgICAgICAgICAgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCi0gIGNiU2JyX3QgY2JTYnI7ICAgICAgICAgICAgICAgICAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCi0gIHZvaWQgKmNiU2JyRGF0YTsgICAgICAgICAgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIFNCUiBoZWFkZXIgcGFyc2VyIGNhbGxiYWNrLiAqLwordHlwZWRlZiBJTlQgKCpjYlVwZGF0ZUNvbmZpZ190KSh2b2lkICosIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBjb25maWdNb2RlLCBVQ0hBUiAqY29uZmlnQ2hhbmdlZCk7Cit0eXBlZGVmIElOVCAoKmNiRnJlZU1lbV90KSh2b2lkICosIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqKTsKK3R5cGVkZWYgSU5UICgqY2JDdHJsQ0ZHQ2hhbmdlX3QpKHZvaWQgKiwgY29uc3QgQ0N0cmxDRkdDaGFuZ2UgKik7Cit0eXBlZGVmIElOVCAoKmNiU3NjX3QpKHZvaWQgKiwgSEFORExFX0ZES19CSVRTVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSwgY29uc3QgSU5UIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY29yZVNickZyYW1lTGVuZ3RoSW5kZXgsIGNvbnN0IElOVCBjb25maWdCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY29uZmlnTW9kZSwgVUNIQVIgKmNvbmZpZ0NoYW5nZWQpOworCit0eXBlZGVmIElOVCAoKmNiU2JyX3QpKHZvaWQgKnNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVJbiwgY29uc3QgSU5UIHNhbXBsZVJhdGVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxlbWVudElELCBjb25zdCBJTlQgZWxlbWVudEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBoYXJtb25pY1NiciwgY29uc3QgVUNIQVIgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZG93bnNjYWxlRmFjdG9yKTsKKwordHlwZWRlZiBJTlQgKCpjYlVzYWNfdCkodm9pZCAqc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKTsKKwordHlwZWRlZiBJTlQgKCpjYlVuaURyY190KSh2b2lkICpzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBmdWxsUGF5bG9hZExlbmd0aCwgY29uc3QgSU5UIHBheWxvYWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3ViU3RyZWFtSW5kZXgsIGNvbnN0IElOVCBwYXlsb2FkU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjYlVwZGF0ZUNvbmZpZ190IGNiVXBkYXRlQ29uZmlnOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5IGNhbGxiYWNrLiAgKi8KKyAgdm9pZCAqY2JVcGRhdGVDb25maWdEYXRhOyAvKiE8IFVzZXIgZGF0YSBwb2ludGVyIGZvciBDb25maWcgY2hhbmdlIG5vdGlmeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLiAqLworICBjYkZyZWVNZW1fdCBjYkZyZWVNZW07ICAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgZnJlZSBtZW1vcnkgY2FsbGJhY2suICAqLworICB2b2lkICpjYkZyZWVNZW1EYXRhOyAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIGZyZWUgbWVtb3J5IGNhbGxiYWNrLiAqLworICBjYkN0cmxDRkdDaGFuZ2VfdCBjYkN0cmxDRkdDaGFuZ2U7IC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgY29uZmlnIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgY2FsbGJhY2suICovCisgIHZvaWQgKmNiQ3RybENGR0NoYW5nZURhdGE7IC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIGNvbmZpZyBjaGFuZ2UgY29udHJvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay4gKi8KKyAgY2JTc2NfdCBjYlNzYzsgICAgICAgICAgICAgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBTU0MgcGFyc2VyIGNhbGxiYWNrLiAqLworICB2b2lkICpjYlNzY0RhdGE7ICAgICAgICAgICAvKiE8IFVzZXIgZGF0YSBwb2ludGVyIGZvciBTU0MgcGFyc2VyIGNhbGxiYWNrLiAqLworICBjYlNicl90IGNiU2JyOyAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCisgIHZvaWQgKmNiU2JyRGF0YTsgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCisgIGNiVXNhY190IGNiVXNhYzsKKyAgdm9pZCAqY2JVc2FjRGF0YTsKKyAgY2JVbmlEcmNfdCBjYlVuaURyYzsgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciB1bmlEcmNDb25maWcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdWRuZXNzSW5mb1NldCBwYXJzZXIgY2FsbGJhY2suICovCisgIHZvaWQgKmNiVW5pRHJjRGF0YTsgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIHVuaURyY0NvbmZpZyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG91ZG5lc3NJbmZvU2V0IHBhcnNlciBjYWxsYmFjay4gKi8KIH0gQ1NUcENhbGxCYWNrczsKIAotc3RhdGljIGNvbnN0IFVJTlQgU2FtcGxpbmdSYXRlVGFibGVbXSA9IAoteyA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAsIDAsIDAsCi0gIDAKLX07CitzdGF0aWMgY29uc3QgVUlOVCBTYW1wbGluZ1JhdGVUYWJsZVtdID0geworICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwKKyAgICA4MDAwLCAgNzM1MCwgIDAsICAgICAwLCAgICAgNTc2MDAsIDUxMjAwLCA0MDAwMCwgMzg0MDAsIDM0MTUwLCAyODgwMCwgMjU2MDAsCisgICAgMjAwMDAsIDE5MjAwLCAxNzA3NSwgMTQ0MDAsIDEyODAwLCA5NjAwLCAgMCwgICAgIDAsICAgICAwLCAgICAgMH07CiAKLXN0YXRpYyBpbmxpbmUKLWludCBnZXRTYW1wbGluZ1JhdGVJbmRleCggVUlOVCBzYW1wbGluZ1JhdGUgKQotewotICBVSU5UIHNmX2luZGV4LCB0YWJsZVNpemU9c2l6ZW9mKFNhbXBsaW5nUmF0ZVRhYmxlKS9zaXplb2YoVUlOVCk7CitzdGF0aWMgaW5saW5lIGludCBnZXRTYW1wbGluZ1JhdGVJbmRleChVSU5UIHNhbXBsaW5nUmF0ZSwgVUlOVCBuQml0cykgeworICBVSU5UIHNmX2luZGV4OworICBVSU5UIHRhYmxlU2l6ZSA9ICgxIDw8IG5CaXRzKSAtIDE7CiAKLSAgZm9yIChzZl9pbmRleD0wOyBzZl9pbmRleDx0YWJsZVNpemU7IHNmX2luZGV4KyspIHsKLSAgICBpZiggU2FtcGxpbmdSYXRlVGFibGVbc2ZfaW5kZXhdID09IHNhbXBsaW5nUmF0ZSApIGJyZWFrOworICBmb3IgKHNmX2luZGV4ID0gMDsgc2ZfaW5kZXggPCB0YWJsZVNpemU7IHNmX2luZGV4KyspIHsKKyAgICBpZiAoU2FtcGxpbmdSYXRlVGFibGVbc2ZfaW5kZXhdID09IHNhbXBsaW5nUmF0ZSkgYnJlYWs7CiAgIH0KIAotICBpZiAoc2ZfaW5kZXg+dGFibGVTaXplLTEpIHsKLSAgICByZXR1cm4gdGFibGVTaXplLTE7CisgIGlmIChzZl9pbmRleCA+IHRhYmxlU2l6ZSkgeworICAgIHJldHVybiB0YWJsZVNpemUgLSAxOwogICB9CiAKICAgcmV0dXJuIHNmX2luZGV4OwpAQCAtMzI1LDI2ICs0MzMsMzMgQEAKIC8qCiAgKiBHZXQgQ2hhbm5lbCBjb3VudCBmcm9tIGNoYW5uZWwgY29uZmlndXJhdGlvbgogICovCi1zdGF0aWMgaW5saW5lIGludCBnZXROdW1iZXJPZlRvdGFsQ2hhbm5lbHMoaW50IGNoYW5uZWxDb25maWcpCi17CitzdGF0aWMgaW5saW5lIGludCBnZXROdW1iZXJPZlRvdGFsQ2hhbm5lbHMoaW50IGNoYW5uZWxDb25maWcpIHsKICAgc3dpdGNoIChjaGFubmVsQ29uZmlnKSB7Ci0gIGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6Ci0gIGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6Ci0gICAgcmV0dXJuIGNoYW5uZWxDb25maWc7Ci0gIGNhc2UgNzogY2FzZSAxMjogY2FzZSAxNDoKLSAgICByZXR1cm4gODsKLSAgY2FzZSAxMToKLSAgICByZXR1cm4gNzsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gMDsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgIGNhc2UgMzoKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA1OgorICAgIGNhc2UgNjoKKyAgICAgIHJldHVybiBjaGFubmVsQ29uZmlnOworICAgIGNhc2UgNzoKKyAgICBjYXNlIDEyOgorICAgIGNhc2UgMTQ6CisgICAgICByZXR1cm4gODsKKyAgICBjYXNlIDExOgorICAgICAgcmV0dXJuIDc7CisgICAgY2FzZSAxMzoKKyAgICAgIHJldHVybiAyNDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CiAgIH0KIH0KIAotc3RhdGljIGlubGluZQotaW50IGdldE51bWJlck9mRWZmZWN0aXZlQ2hhbm5lbHMoY29uc3QgaW50IGNoYW5uZWxDb25maWcpCi17ICAgICAgICAvKiBpbmRleDogMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSAqLwotICBjb25zdCBpbnQgbltdID0gezAsMSwyLDMsNCw1LDUsNywwLDAsIDAsIDYsIDcsIDAsIDcsIDB9Oworc3RhdGljIGlubGluZSBpbnQgZ2V0TnVtYmVyT2ZFZmZlY3RpdmVDaGFubmVscygKKyAgICBjb25zdCBpbnQKKyAgICAgICAgY2hhbm5lbENvbmZpZykgeyAvKiBpbmRleDogMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSAqLworICBjb25zdCBpbnQgbltdID0gezAsIDEsIDIsIDMsIDQsIDUsIDUsIDcsIDAsIDAsIDAsIDYsIDcsIDIyLCA3LCAwfTsKICAgcmV0dXJuIG5bY2hhbm5lbENvbmZpZ107CiB9CiAKLSNlbmRpZiAvKiBfX1RQX0RBVEFfSF9fICovCisjZW5kaWYgLyogVFBfREFUQV9IICovCmRpZmYgLS1naXQgYS9saWJNcGVnVFBFbmMvaW5jbHVkZS90cGVuY19saWIuaCBiL2xpYk1wZWdUUEVuYy9pbmNsdWRlL3RwZW5jX2xpYi5oCmluZGV4IDI4MzNlODIuLjRlYjg5YTcgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUEVuYy9pbmNsdWRlL3RwZW5jX2xpYi5oCisrKyBiL2xpYk1wZWdUUEVuYy9pbmNsdWRlL3RwZW5jX2xpYi5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE3ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IFRyYW5zcG9ydCBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgorICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKwogICAgRGVzY3JpcHRpb246IE1QRUcgVHJhbnNwb3J0IGVuY29kZQogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fVFBFTkNfTElCX0hfXwotI2RlZmluZSBfX1RQRU5DX0xJQl9IX18KKyNpZm5kZWYgVFBFTkNfTElCX0gKKyNkZWZpbmUgVFBFTkNfTElCX0gKIAogI2luY2x1ZGUgInRwX2RhdGEuaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCkBAIC05Nyw2MSArMTA5LDc4IEBACiAjZGVmaW5lIFRSQU5TUE9SVEVOQ19JTkJVRl9TSVpFIDgxOTIKIAogdHlwZWRlZiBlbnVtIHsKLSAgVFJBTlNQT1JURU5DX09LID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBbGwgZmluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBUUkFOU1BPUlRFTkNfTk9fTUVNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE91dCBvZiBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFRSQU5TUE9SVEVOQ19VTktPV05fRVJST1IgPSAxLCAgICAgICAgICAgICAgICAgIC8qITwgVW5rbm93biBlcnJvciAoZW1iYXJyYXNpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSLCAgICAgICAgICAgICAgICAgLyohPCBBbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkIHRvIGEgZnVuY3Rpb24gLiAgICAgICAgICAqLwotICBUUkFOU1BPUlRFTkNfUEFSU0VfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJpdHN0cmVhbSBkYXRhIGNvbnRhaW5lZCBpbmNvbnNpc3RlbmNpZXMgKHdyb25nIHN5bnRheCkuICovCi0gIFRSQU5TUE9SVEVOQ19VTlNVUFBPUlRFRF9GT1JNQVQsICAgICAgICAgICAgICAgIC8qITwgVW5zdXBwb3J0ZWQgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVFJBTlNQT1JURU5DX05PVF9FTk9VR0hfQklUUywgICAgICAgICAgICAgICAgICAgLyohPCBPdXQgb2YgYml0cy4gUHJvdmlkZSBtb3JlIGJpdHMgYW5kIHRyeSBhZ2Fpbi4gICAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfT0sgPSAwLCAgICAgICAgICAgICAvKiE8IEFsbCBmaW5lLiAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfTk9fTUVNLCAgICAgICAgICAgICAvKiE8IE91dCBvZiBtZW1vcnkuICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVEVOQ19VTktPV05fRVJST1IgPSAxLCAgIC8qITwgVW5rbm93biBlcnJvciAoZW1iYXJyYXNpbmcpLiAgICovCisgIFRSQU5TUE9SVEVOQ19JTlZBTElEX1BBUkFNRVRFUiwgIC8qITwgQW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZCB0byBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIC4gICAgICAgICAgKi8KKyAgVFJBTlNQT1JURU5DX1VOU1VQUE9SVEVEX0ZPUk1BVCwgLyohPCBVbnN1cHBvcnRlZCB0cmFuc3BvcnQgZm9ybWF0LiAqLworICBUUkFOU1BPUlRFTkNfTk9UX0VOT1VHSF9CSVRTLCAgICAvKiE8IE91dCBvZiBiaXRzLiBQcm92aWRlIG1vcmUgYml0cyBhbmQgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnYWluLiAgICAgICAgICAgICovCiAKLSAgVFJBTlNQT1JURU5DX0lOVkFMSURfQ09ORklHLCAgICAgICAgICAgICAgICAgICAgLyohPCBFcnJvciBpbiBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBUUkFOU1BPUlRFTkNfTEFUTV9JTlZBTElEX05SX09GX1NVQkZSQU1FUywgICAgICAvKiE8IExBVE06IG51bWJlciBvZiBzdWJmcmFtZXMgb3V0IG9mIHJhbmdlLiAgICAgICAgICAgICAgICAgICovCi0gIFRSQU5TUE9SVEVOQ19MT0FTX05PVF9BVkFJTEFCTEUsICAgICAgICAgICAgICAgIC8qITwgTE9BUyBmb3JtYXQgbm90IHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVFJBTlNQT1JURU5DX0lOVkFMSURfTEFUTV9BTElHTk1FTlQsICAgICAgICAgICAgLyohPCBBdWRpb011eEVsZW1lbnQgbGVuZ3RoIG5vdCBhbGlnbmVkIHRvIDEgYnl0ZS4gICAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9DT05GSUcsIC8qITwgRXJyb3IgaW4gY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfTEFUTV9JTlZBTElEX05SX09GX1NVQkZSQU1FUywgLyohPCBMQVRNOiBudW1iZXIgb2Ygc3ViZnJhbWVzIG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgcmFuZ2UuICAgICAgICAgICAgICAgICAgKi8KKyAgVFJBTlNQT1JURU5DX0xPQVNfTk9UX0FWQUlMQUJMRSwgLyohPCBMT0FTIGZvcm1hdCBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgKi8KKyAgVFJBTlNQT1JURU5DX0lOVkFMSURfTEFUTV9BTElHTk1FTlQsIC8qITwgQXVkaW9NdXhFbGVtZW50IGxlbmd0aCBub3QgYWxpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gMSBieXRlLiAgICAgICAgICAgICovCiAKLSAgVFJBTlNQT1JURU5DX0lOVkFMSURfVFJBTlNNSVNTSU9OX0ZSQU1FX0xFTkdUSCwgLyohPCBJbnZhbGlkIHRyYW5zbWlzc2lvbiBmcmFtZSBsZW5ndGggKDwgMCkuICAgICAgICAgICAgICAgICAqLwotICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9DRUxQX0ZSQU1FX0xFTkdUSCwgICAgICAgICAvKiE8IEludmFsaWQgQ0VMUCBmcmFtZSBsZW5ndGggZm91bmQgKD49IDYyKS4gICAgICAgICAgICAgICAgICovCi0gIFRSQU5TUE9SVEVOQ19JTlZBTElEX0ZSQU1FX0JJVFMsICAgICAgICAgICAgICAgIC8qITwgRnJhbWUgYml0cyBpcyBub3QgNDAgYW5kIG5vdCA4MC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVFJBTlNQT1JURU5DX0lOVkFMSURfQU9ULCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVbmtub3duIEFPVCBmb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9BVV9MRU5HVEggICAgICAgICAgICAgICAgICAvKiE8IEludmFsaWQgQWNjZXNzIFVuaXQgbGVuZ3RoIChub3QgYnl0ZS1hbGlnbmVkKS4gICAgICAgICAgICovCisgIFRSQU5TUE9SVEVOQ19JTlZBTElEX1RSQU5TTUlTU0lPTl9GUkFNRV9MRU5HVEgsIC8qITwgSW52YWxpZCB0cmFuc21pc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgbGVuZ3RoICg8IDApLiAqLworICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9DRUxQX0ZSQU1FX0xFTkdUSCwgLyohPCBJbnZhbGlkIENFTFAgZnJhbWUgbGVuZ3RoIGZvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPj0gNjIpLiAgICAgICAgICAgICAgICAgKi8KKyAgVFJBTlNQT1JURU5DX0lOVkFMSURfRlJBTUVfQklUUywgLyohPCBGcmFtZSBiaXRzIGlzIG5vdCA0MCBhbmQgbm90IDgwLiAqLworICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9BT1QsICAgICAgICAvKiE8IFVua25vd24gQU9UIGZvdW5kLiAgICAgICAgKi8KKyAgVFJBTlNQT1JURU5DX0lOVkFMSURfQVVfTEVOR1RIICAgLyohPCBJbnZhbGlkIEFjY2VzcyBVbml0IGxlbmd0aCAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUtYWxpZ25lZCkuICAgICAgICAgICAqLwogCiB9IFRSQU5TUE9SVEVOQ19FUlJPUjsKIAogdHlwZWRlZiBzdHJ1Y3QgVFJBTlNQT1JURU5DICpIQU5ETEVfVFJBTlNQT1JURU5DOwogCiAvKioKLSAqIFxicmllZiAgICAgICAgICAgICBEZXRlcm1pbmUgYSByZWFzb25hYmxlIGNoYW5uZWwgY29uZmlndXJhdGlvbiBvbiB0aGUgYmFzaXMgb2YgY2hhbm5lbF9tb2RlLgorICogXGJyaWVmICAgICAgICAgICAgIERldGVybWluZSBhIHJlYXNvbmFibGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIG9uIHRoZSBiYXNpcworICogb2YgY2hhbm5lbF9tb2RlLgogICogXHBhcmFtIG5vQ2hhbm5lbHMgIE51bWJlciBvZiBhdWRpbyBjaGFubmVscy4KLSAqIFxyZXR1cm4gICAgICAgICAgICBDSEFOTkVMX01PREUgdmFsdWUgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBhbW91bnQgb2YgYXVkaW8gY2hhbm5lbHMuCisgKiBccmV0dXJuICAgICAgICAgICAgQ0hBTk5FTF9NT0RFIHZhbHVlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gYW1vdW50IG9mIGF1ZGlvCisgKiBjaGFubmVscy4KICAqLwotQ0hBTk5FTF9NT0RFIHRyYW5zcG9ydEVuY19HZXRDaGFubmVsTW9kZSggaW50IG5vQ2hhbm5lbHMgKTsKK0NIQU5ORUxfTU9ERSB0cmFuc3BvcnRFbmNfR2V0Q2hhbm5lbE1vZGUoaW50IG5vQ2hhbm5lbHMpOwogCiAvKioKICAqIFxicmllZiAgICAgICAgICAgICAgICBSZWdpc3RlciBTQlIgaGVhcWRlciB3cml0ZXIgY2FsbGJhY2suCiAgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgotICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgU0JSIGhlYWRlciB3cml0aW5nLgotICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMgZmlyc3QgcGFyYW1ldGVyLgorICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgU0JSIGhlYWRlcgorICogd3JpdGluZy4KKyAqIFxwYXJhbSB1c2VyX2RhdGEgICAgICB2b2lkIHBvaW50ZXIgZm9yIHVzZXIgZGF0YSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGFzCisgKiBmaXJzdCBwYXJhbWV0ZXIuCiAgKiBccmV0dXJuICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLgogICovCi1pbnQgdHJhbnNwb3J0RW5jX1JlZ2lzdGVyU2JyQ2FsbGJhY2sgKAotICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKLSAgICAgICAgY29uc3QgY2JTYnJfdCBjYlNiciwKLSAgICAgICAgdm9pZCogdXNlcl9kYXRhCi0gICAgICAgICk7CitpbnQgdHJhbnNwb3J0RW5jX1JlZ2lzdGVyU2JyQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JTYnJfdCBjYlNiciwgdm9pZCAqdXNlcl9kYXRhKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICAgUmVnaXN0ZXIgVVNBQyBTQyB3cml0ZXIgY2FsbGJhY2suCisgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgorICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgVVNBQworICogU0N3cml0aW5nLgorICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMKKyAqIGZpcnN0IHBhcmFtZXRlci4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCB0cmFuc3BvcnRFbmNfUmVnaXN0ZXJVc2FjQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiVXNhY190IGNiVXNhYywgdm9pZCAqdXNlcl9kYXRhKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgICAgUmVnaXN0ZXIgU1NDIHdyaXRlciBjYWxsYmFjay4KICAqIFxwYXJhbSBoVHAgICAgICAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0IGRlY29kZXIuCiAgKiBccGFyYW0gY2JVcGRhdGVDb25maWcgUG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBTU0Mgd3JpdGluZy4KLSAqIFxwYXJhbSB1c2VyX2RhdGEgICAgICB2b2lkIHBvaW50ZXIgZm9yIHVzZXIgZGF0YSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGFzIGZpcnN0IHBhcmFtZXRlci4KKyAqIFxwYXJhbSB1c2VyX2RhdGEgICAgICB2b2lkIHBvaW50ZXIgZm9yIHVzZXIgZGF0YSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGFzCisgKiBmaXJzdCBwYXJhbWV0ZXIuCiAgKiBccmV0dXJuICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLgogICovCi1pbnQgdHJhbnNwb3J0RW5jX1JlZ2lzdGVyU3NjQ2FsbGJhY2sgKAotICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKLSAgICAgICAgY29uc3QgY2JTc2NfdCBjYlNzYywKLSAgICAgICAgdm9pZCogdXNlcl9kYXRhCi0gICAgICAgICk7CitpbnQgdHJhbnNwb3J0RW5jX1JlZ2lzdGVyU3NjQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JTc2NfdCBjYlNzYywgdm9pZCAqdXNlcl9kYXRhKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgICBXcml0ZSBBU0MgZnJvbSBnaXZlbiBwYXJhbWV0ZXJzLgpAQCAtMTYwLDI0ICsxODksMjAgQEAKICAqIFxwYXJhbSBjYiBjYWxsYmFjayBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCiAgKiBccmV0dXJuICAgICAgICAwIG9uIHN1Y2Nlc3MuCiAgKi8KLWludCB0cmFuc3BvcnRFbmNfd3JpdGVBU0MgKAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBhc2MsCi0gICAgICAgIENPREVSX0NPTkZJRyAqY29uZmlnLAotICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgotICAgICAgICApOwotCitpbnQgdHJhbnNwb3J0RW5jX3dyaXRlQVNDKEhBTkRMRV9GREtfQklUU1RSRUFNIGFzYywgQ09ERVJfQ09ORklHICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENTVHBDYWxsQmFja3MgKmNiKTsKIAogLyogRGVmaW50aW9uIG9mIGZsYWdzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0cmFuc3BvcnRFbmNfT3BlbigpICovCi0jZGVmaW5lIFRQX0ZMQUdfTVBFRzQgICAgICAxICAvKiogTVBFRzQgKGluc3RlYWQgb2YgTVBFRzIpICovCi0jZGVmaW5lIFRQX0ZMQUdfTEFUTV9BTVYgICAyICAvKiogTEFUTSBBdWRpb011eFZlcnNpb24gICovCi0jZGVmaW5lIFRQX0ZMQUdfTEFUTV9BTVZBICA0ICAvKiogTEFUTSBBdWRpb011eFZlcnNpb25BICovCisjZGVmaW5lIFRQX0ZMQUdfTVBFRzQgMSAgICAgLyoqIE1QRUc0IChpbnN0ZWFkIG9mIE1QRUcyKSAqLworI2RlZmluZSBUUF9GTEFHX0xBVE1fQU1WIDIgIC8qKiBMQVRNIEF1ZGlvTXV4VmVyc2lvbiAgKi8KKyNkZWZpbmUgVFBfRkxBR19MQVRNX0FNVkEgNCAvKiogTEFUTSBBdWRpb011eFZlcnNpb25BICovCiAKIC8qKgogICogXGJyaWVmICAgICAgICAgICAgICAgQWxsb2NhdGUgdHJhbnNwb3J0IGVuY29kZXIuCiAgKiBccGFyYW0gcGhUcEVuYyAgICAgICBQb2ludGVyIHRvIHRyYW5zcG9ydCBlbmNvZGVyIGhhbmRsZS4KICAqIFxyZXR1cm4gICAgICAgICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfT3BlbiggSEFORExFX1RSQU5TUE9SVEVOQyAqcGhUcEVuYyApOworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19PcGVuKEhBTkRMRV9UUkFOU1BPUlRFTkMgKnBoVHBFbmMpOwogCiAvKioKICAqIFxicmllZiAgICAgICAgICAgICAgIEluaXQgdHJhbnNwb3J0IGVuY29kZXIuCkBAIC0xODksMjEgKzIxNCwyNiBAQAogICogXHBhcmFtIGZsYWdzICAgICAgICAgVHJhbnNwb3J0IGVuY29kZXIgZmxhZ3MuCiAgKiBccmV0dXJuICAgICAgICAgICAgICBFcnJvciBjb2RlLgogICovCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0luaXQoCi0gICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAotICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgKmJzQnVmZmVyLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgIGJzQnVmZmVyU2l6ZSwKLSAgICAgICAgVFJBTlNQT1JUX1RZUEUgICAgIHRyYW5zcG9ydEZtdCwKLSAgICAgICAgQ09ERVJfQ09ORklHICAgICAgKmNvbmZpZywKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgIGZsYWdzCi0gICAgICAgICk7CitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0luaXQoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmJzQnVmZmVyLCBJTlQgYnNCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKmNvbmZpZywgVUlOVCBmbGFncyk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgV3JpdGUgYWRkaXRpb25hbCBiaXRzIGluIHRyYW5zcG9ydCBlbmNvZGVyLgorICogXHBhcmFtIGNvbmZpZyAgICAgICAgUG9pbnRlciB0byBhIHZhbGlkIENPREVSX0NPTkZJRyBzdHJ1Y3QuCisgKiBccGFyYW0gbkJpdHMgICAgICAgICBOdW1iZXIgb2YgYWRkaXRpb25hbCBiaXRzLgorICogXHJldHVybiAgICAgICAgICAgICAgRXJyb3IgY29kZS4KKyAqLworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19BZGRPdGhlckRhdGFCaXRzKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuQml0cyk7CiAKIC8qKgogICogXGJyaWVmICAgICAgR2V0IHRyYW5zcG9ydCBlbmNvZGVyIGJpdHN0cmVhbS4KICAqIFxwYXJhbSBoVHAgIFBvaW50ZXIgdG8gYSB0cmFuc3BvcnQgZW5jb2RlciBoYW5kbGUuCiAgKiBccmV0dXJuICAgICBUaGUgaGFuZGxlIHRvIHRoZSByZXF1ZXN0ZWQgRkRLIGJpdHN0cmVhbS4KICAqLwotSEFORExFX0ZES19CSVRTVFJFQU0gdHJhbnNwb3J0RW5jX0dldEJpdHN0cmVhbSggSEFORExFX1RSQU5TUE9SVEVOQyBoVHAgKTsKK0hBTkRMRV9GREtfQklUU1RSRUFNIHRyYW5zcG9ydEVuY19HZXRCaXRzdHJlYW0oSEFORExFX1RSQU5TUE9SVEVOQyBoVHApOwogCiAvKioKICAqIFxicmllZiAgICAgICAgIEdldCBhbW91bnQgb2YgYml0cyByZXF1aXJlZCBieSB0aGUgdHJhbnNwb3J0IGhlYWRlcnMuCkBAIC0yMTEsNTcgKzI0MSw2NiBAQAogICogXHBhcmFtIGF1Qml0cyAgQW1vdW50IG9mIHBheWxvYWQgYml0cyByZXF1aXJlZCBmb3IgdGhlIGN1cnJlbnQgc3ViZnJhbWUuCiAgKiBccmV0dXJuICAgICAgICBFcnJvciBjb2RlLgogICovCi1JTlQgdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwLCBpbnQgYXVCaXRzICk7CitJTlQgdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsIGludCBhdUJpdHMpOwogCiAvKioKLSAqIFxicmllZiAgICAgICBDbG9zZSB0cmFuc3BvcnQgZW5jb2Rlci4gVGhpcyBmdW5jdGlvbiBhc3N1cmVzIHRoYXQgYWxsIGFsbG9jYXRlZCBtZW1vcnkgaXMgZnJlZWQuCisgKiBcYnJpZWYgICAgICAgQ2xvc2UgdHJhbnNwb3J0IGVuY29kZXIuIFRoaXMgZnVuY3Rpb24gYXNzdXJlcyB0aGF0IGFsbAorICogYWxsb2NhdGVkIG1lbW9yeSBpcyBmcmVlZC4KICAqIFxwYXJhbSBwaFRwICBQb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgdHJhbnNwb3J0IGVuY29kZXIgaGFuZGxlLgogICovCi12b2lkIHRyYW5zcG9ydEVuY19DbG9zZSggSEFORExFX1RSQU5TUE9SVEVOQyAqcGhUcCApOwordm9pZCB0cmFuc3BvcnRFbmNfQ2xvc2UoSEFORExFX1RSQU5TUE9SVEVOQyAqcGhUcCk7CiAKIC8qKgogICogXGJyaWVmICAgICAgICAgICAgICAgICAgICAgICBXcml0ZSBvbmUgYWNjZXNzIHVuaXQuCiAgKiBccGFyYW0gaFRwICAgICAgICAgICAgICAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnQgZW5jb2Rlci4KICAqIFxwYXJhbSB0b3RhbF9iaXRzICAgICAgICAgICAgQW1vdW50IG9mIHRvdGFsIGFjY2VzcyB1bml0IGJpdHMuCiAgKiBccGFyYW0gYnVmZmVyRnVsbG5lc3MgICAgICAgIFZhbHVlIG9mIGN1cnJlbnQgYnVmZmVyIGZ1bGxuZXNzIGluIGJpdHMuCi0gKiBccGFyYW0gbm9Db25zaWRlcmVkQ2hhbm5lbHMgIE51bWJlciBvZiBiaXRyYXRlIHdpc2UgY29uc2lkZXJlZCBjaGFubmVscyAoYWxsIG1pbnVzIExGRSBjaGFubmVscykuCisgKiBccGFyYW0gbm9Db25zaWRlcmVkQ2hhbm5lbHMgIE51bWJlciBvZiBiaXRyYXRlIHdpc2UgY29uc2lkZXJlZCBjaGFubmVscyAoYWxsCisgKiBtaW51cyBMRkUgY2hhbm5lbHMpLgogICogXHJldHVybiAgICAgICAgICAgICAgICAgICAgICBFcnJvciBjb2RlLgogICovCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX1dyaXRlQWNjZXNzVW5pdCggSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRvdGFsX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckZ1bGxuZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbnNpZGVyZWRDaGFubmVscyApOworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19Xcml0ZUFjY2Vzc1VuaXQoSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdG90YWxfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJGdWxsbmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbnNpZGVyZWRDaGFubmVscyk7CiAKIC8qKgotICogXGJyaWVmICAgICAgICBJbmZvcm0gdGhlIHRyYW5zcG9ydEVuYyBsYXllciB0aGF0IHdyaXRpbmcgb2YgYWNjZXNzIHVuaXQgaGFzIGZpbmlzaGVkLiBUaGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBlbmNvZGVyIGhhcyBmaW5pc2hlZCB3cml0aW5nIG9uZSBBY2Nlc3MKLSAqICAgICAgICAgICAgICAgb25lIEFjY2VzcyBVbml0IGZvciBiaXRzdHJlYW0gaG91c2VrZWVwaW5nLgorICogXGJyaWVmICAgICAgICBJbmZvcm0gdGhlIHRyYW5zcG9ydEVuYyBsYXllciB0aGF0IHdyaXRpbmcgb2YgYWNjZXNzIHVuaXQgaGFzCisgKiBmaW5pc2hlZC4gVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZW5jb2RlciBoYXMKKyAqIGZpbmlzaGVkIHdyaXRpbmcgb25lIEFjY2VzcyBvbmUgQWNjZXNzIFVuaXQgZm9yIGJpdHN0cmVhbQorICogaG91c2VrZWVwaW5nLgogICogXHBhcmFtIGhUcCAgICBUcmFuc3BvcnQgaGFuZGxlLgotICogXHBhcmFtIHBCaXRzICBQb2ludGVyIHRvIGFuIGludCwgd2hlcmUgdGhlIGN1cnJlbnQgYW1vdW50IG9mIGZyYW1lIGJpdHMgaXMgcGFzc2VkCi0gKiAgICAgICAgICAgICAgIGFuZCB3aGVyZSB0aGUgY3VycmVudCBhbW91bnQgb2Ygc3ViZnJhbWUgYml0cyBpcyByZXR1cm5lZC4KKyAqIFxwYXJhbSBwQml0cyAgUG9pbnRlciB0byBhbiBpbnQsIHdoZXJlIHRoZSBjdXJyZW50IGFtb3VudCBvZiBmcmFtZSBiaXRzIGlzCisgKiBwYXNzZWQgYW5kIHdoZXJlIHRoZSBjdXJyZW50IGFtb3VudCBvZiBzdWJmcmFtZSBiaXRzIGlzIHJldHVybmVkLgogICoKLSAqIE9SOiAgVGhpcyBpbnRlZ2VyIGlzIG1vZGlmaWVkIGJ5IHRoZSBhbW91bnQgb2YgZXh0cmEgYml0IGFsaWdubWVudCB0aGF0IG1heSBvY2N1cnIuCisgKiBPUjogIFRoaXMgaW50ZWdlciBpcyBtb2RpZmllZCBieSB0aGUgYW1vdW50IG9mIGV4dHJhIGJpdCBhbGlnbm1lbnQgdGhhdCBtYXkKKyAqIG9jY3Vyci4KICAqCiAgKiBccmV0dXJuICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfRW5kQWNjZXNzVW5pdCggSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsIGludCAqcEJpdHMpOworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19FbmRBY2Nlc3NVbml0KEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcEJpdHMpOwogCiAvKgogICogXGJyaWVmICAgICAgICAgR2V0IGEgcGF5bG9hZCBmcmFtZS4KICAqIFxwYXJhbSBoVHBFbmMgIFRyYW5zcG9ydCBlbmNvZGVyIGhhbmRsZS4KLSAqIFxwYXJhbSBuQnl0ZXMgIFBvaW50ZXIgdG8gYW4gaW50IHRvIGhvbGQgdGhlIGZyYW1lIHNpemUgaW4gYnl0ZXMuIFJldHVybnMgemVybwotICogICAgICAgICAgICAgICAgaWYgY3VycmVudGx5IHRoZXJlIGlzIG5vIGNvbXBsZXRlIGZyYW1lIGZvciBvdXRwdXQgKG51bWJlciBvZiBzdWIgZnJhbWVzID4gMSkuCisgKiBccGFyYW0gbkJ5dGVzICBQb2ludGVyIHRvIGFuIGludCB0byBob2xkIHRoZSBmcmFtZSBzaXplIGluIGJ5dGVzLiBSZXR1cm5zCisgKiB6ZXJvIGlmIGN1cnJlbnRseSB0aGVyZSBpcyBubyBjb21wbGV0ZSBmcmFtZSBmb3Igb3V0cHV0IChudW1iZXIgb2Ygc3ViIGZyYW1lcworICogPiAxKS4KICAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0RnJhbWUoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsIGludCAqbmJ5dGVzKTsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0RnJhbWUoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbmJ5dGVzKTsKIAogLyogQURUUyBDUkMgc3VwcG9ydCAqLwogCiAvKioKICAqIFxicmllZiAgICAgICAgIFNldCBjdXJyZW50IGJpdHN0cmVhbSBwb3NpdGlvbiBhcyBzdGFydCBvZiBhIG5ldyBkYXRhIHJlZ2lvbi4KICAqIFxwYXJhbSBoVHBFbmMgIFRyYW5zcG9ydCBlbmNvZGVyIGhhbmRsZS4KLSAqIFxwYXJhbSBtQml0cyAgIFNpemUgaW4gYml0cyBvZiB0aGUgZGF0YSByZWdpb24uIFNldCB0byAwIGlmIGl0IHNob3VsZCBub3QgYmUgb2YgYSBmaXhlZCBzaXplLgotICogXHJldHVybiAgICAgICAgRGF0YSByZWdpb24gSUQsIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gY2FsbGluZyB0cmFuc3BvcnRFbmNfQ3JjRW5kUmVnKCkuCisgKiBccGFyYW0gbUJpdHMgICBTaXplIGluIGJpdHMgb2YgdGhlIGRhdGEgcmVnaW9uLiBTZXQgdG8gMCBpZiBpdCBzaG91bGQgbm90IGJlCisgKiBvZiBhIGZpeGVkIHNpemUuCisgKiBccmV0dXJuICAgICAgICBEYXRhIHJlZ2lvbiBJRCwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBjYWxsaW5nCisgKiB0cmFuc3BvcnRFbmNfQ3JjRW5kUmVnKCkuCiAgKi8KIGludCB0cmFuc3BvcnRFbmNfQ3JjU3RhcnRSZWcoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsIGludCBtQml0cyk7CiAKQEAgLTI3NCwyMyArMzEzLDI3IEBACiB2b2lkIHRyYW5zcG9ydEVuY19DcmNFbmRSZWcoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsIGludCByZWcpOwogCiAvKioKLSAqIFxicmllZiAgICAgICAgICAgICBHZXQgQXVkaW9TcGVjaWZpY0NvbmZpZyBvciBTdHJlYW1NdXhDb25maWcgZnJvbSB0cmFuc3BvcnQgZW5jb2RlciBoYW5kbGUgYW5kIHdyaXRlIGl0IHRvIGRhdGFCdWZmZXIuCisgKiBcYnJpZWYgICAgICAgICAgICAgR2V0IEF1ZGlvU3BlY2lmaWNDb25maWcgb3IgU3RyZWFtTXV4Q29uZmlnIGZyb20gdHJhbnNwb3J0CisgKiBlbmNvZGVyIGhhbmRsZSBhbmQgd3JpdGUgaXQgdG8gZGF0YUJ1ZmZlci4KICAqIFxwYXJhbSBoVHBFbmMgICAgICBUcmFuc3BvcnQgZW5jb2RlciBoYW5kbGUuCi0gKiBccGFyYW0gY2MgICAgICAgICAgUG9pbnRlciB0byB0aGUgY3VycmVudCBhbmQgdmFsaWQgY29uZmlndXJhdGlvbiBjb250YWluZWQgaW4gYSBDT0RFUl9DT05GSUcgc3RydWN0LgorICogXHBhcmFtIGNjICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYW5kIHZhbGlkIGNvbmZpZ3VyYXRpb24gY29udGFpbmVkCisgKiBpbiBhIENPREVSX0NPTkZJRyBzdHJ1Y3QuCiAgKiBccGFyYW0gZGF0YUJ1ZmZlciAgQml0YnVmZmVyIGhvbGRpbmcgYmluYXJ5IGNvbmZpZ3VyYXRpb24uCi0gKiBccGFyYW0gY29uZlR5cGUgICAgUG9pbnRlciB0byBhbiBVSU5UIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIHR5cGUgaXMgcmV0dXJuZWQgKDA6QVNDLCAxOlNNQykuCisgKiBccGFyYW0gY29uZlR5cGUgICAgUG9pbnRlciB0byBhbiBVSU5UIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIHR5cGUgaXMKKyAqIHJldHVybmVkICgwOkFTQywgMTpTTUMpLgogICogXHJldHVybiAgICAgICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0Q29uZiggSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgICAgICAgICpjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLX0JJVFNUUkVBTSAgICAgICAqZGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAqY29uZlR5cGUgKTsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0Q29uZihIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKmNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES19CSVRTVFJFQU0gKmRhdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqY29uZlR5cGUpOwogCiAvKioKLSAqIFxicmllZiAgICAgICBHZXQgaW5mb3JtYXRpb24gKHZlcnNpb24gYW1vbmcgb3RoZXIgdGhpbmdzKSBvZiB0aGUgdHJhbnNwb3J0IGVuY29kZXIgbGlicmFyeS4KKyAqIFxicmllZiAgICAgICBHZXQgaW5mb3JtYXRpb24gKHZlcnNpb24gYW1vbmcgb3RoZXIgdGhpbmdzKSBvZiB0aGUgdHJhbnNwb3J0CisgKiBlbmNvZGVyIGxpYnJhcnkuCiAgKiBccGFyYW0gaW5mbyAgUG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgTElCX0lORk8gc3RydWN0LgogICogXHJldHVybiAgICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKTsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbyk7CiAKLSNlbmRpZiAvKiAjaWZuZGVmIF9fVFBFTkNfTElCX0hfXyAqLworI2VuZGlmIC8qICNpZm5kZWYgVFBFTkNfTElCX0ggKi8KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9zcmMvdHBfdmVyc2lvbi5oIGIvbGliTXBlZ1RQRW5jL3NyYy90cF92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxYWEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYk1wZWdUUEVuYy9zcmMvdHBfdmVyc2lvbi5oCkBAIC0wLDAgKzEsMTE4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChUUF9WRVJTSU9OX0gpCisjZGVmaW5lIFRQX1ZFUlNJT05fSAorCisvKiBsaWJyYXJ5IGluZm8gKi8KKyNkZWZpbmUgVFBfTElCX1ZMMCAzCisjZGVmaW5lIFRQX0xJQl9WTDEgMAorI2RlZmluZSBUUF9MSUJfVkwyIDAKKyNkZWZpbmUgVFBfTElCX1RJVExFICJNUEVHIFRyYW5zcG9ydCIKKyNpZmRlZiBfX0FORFJPSURfXworI2RlZmluZSBUUF9MSUJfQlVJTERfREFURSAiIgorI2RlZmluZSBUUF9MSUJfQlVJTERfVElNRSAiIgorI2Vsc2UKKyNkZWZpbmUgVFBfTElCX0JVSUxEX0RBVEUgX19EQVRFX18KKyNkZWZpbmUgVFBfTElCX0JVSUxEX1RJTUUgX19USU1FX18KKyNlbmRpZgorI2VuZGlmIC8qICFkZWZpbmVkKFRQX1ZFUlNJT05fSCkgKi8KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWRpZi5jcHAgYi9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkaWYuY3BwCmluZGV4IGI0OGEzMmUuLmIyODFlZmYgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWRpZi5jcHAKKysrIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZGlmLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMDQgKzkwLDk3IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAotICAgY29udGVudHMvZGVzY3JpcHRpb246IEFESUYgVHJhbnNwb3J0IEhlYWRlcnMgd3JpdGluZworICAgQXV0aG9yKHMpOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogQURJRiBUcmFuc3BvcnQgSGVhZGVycyB3cml0aW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0cGVuY19hZGlmLmgiCiAKICNpbmNsdWRlICJ0cGVuY19saWIuaCIKICNpbmNsdWRlICJ0cGVuY19hc2MuaCIKIAotCi0KLWludCBhZGlmV3JpdGVfRW5jb2RlSGVhZGVyKEFESUZfSU5GTyAqYWRpZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhZGlmX2J1ZmZlcl9mdWxsbmVzcykKLXsKK2ludCBhZGlmV3JpdGVfRW5jb2RlSGVhZGVyKEFESUZfSU5GTyAqYWRpZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFkaWZfYnVmZmVyX2Z1bGxuZXNzKSB7CiAgIC8qIEFESUYvUENFL0FEVFMgZGVmaW5pdGlvbnMgKi8KLSAgY29uc3QgY2hhciBhZGlmSWRbNV09IkFESUYiOwotICBjb25zdCBpbnQgIGNvcHlSaWdodElkUHJlc2VudD0wOwotICBjb25zdCBpbnQgIG9yaWdpbmFsQ29weT0wOwotICBjb25zdCBpbnQgIGhvbWU9MDsKKyAgY29uc3QgY2hhciBhZGlmSWRbNV0gPSAiQURJRiI7CisgIGNvbnN0IGludCBjb3B5UmlnaHRJZFByZXNlbnQgPSAwOworICBjb25zdCBpbnQgb3JpZ2luYWxDb3B5ID0gMDsKKyAgY29uc3QgaW50IGhvbWUgPSAwOworICBpbnQgZXJyID0gMDsKIAogICBpbnQgaTsKIAotICBJTlQgc2FtcGxlUmF0ZSA9IGFkaWYtPnNhbXBsaW5nUmF0ZTsKICAgSU5UIHRvdGFsQml0UmF0ZSA9IGFkaWYtPmJpdFJhdGU7CiAKLSAgaWYgKGFkaWYtPmhlYWRlcldyaXR0ZW4pCi0gICAgcmV0dXJuIDA7CisgIGlmIChhZGlmLT5oZWFkZXJXcml0dGVuKSByZXR1cm4gMDsKIAogICAvKiBBbGlnbiBpbnNpZGUgUENFIHdpdGggcmVzcGVjdCB0byB0aGUgZmlyc3QgYml0IG9mIHRoZSBoZWFkZXIgKi8KICAgVUlOVCBhbGlnbkFuY2hvciA9IEZES2dldFZhbGlkQml0cyhoQnMpOwogCiAgIC8qIFNpZ25hbCB2YXJpYWJsZSBiaXRyYXRlIGlmIGJ1ZmZlciBmdWxsbmVzIGV4Y2VlZHMgMjAgYml0ICovCi0gIGFkaWYtPmJWYXJpYWJsZVJhdGUgPSAoIGFkaWZfYnVmZmVyX2Z1bGxuZXNzID49IChJTlQpKDB4MTw8MjApICkgPyAxIDogMDsKKyAgYWRpZi0+YlZhcmlhYmxlUmF0ZSA9IChhZGlmX2J1ZmZlcl9mdWxsbmVzcyA+PSAoSU5UKSgweDEgPDwgMjApKSA/IDEgOiAwOwogCi0gIEZES3dyaXRlQml0cyhoQnMsIGFkaWZJZFswXSw4KTsKLSAgRkRLd3JpdGVCaXRzKGhCcywgYWRpZklkWzFdLDgpOwotICBGREt3cml0ZUJpdHMoaEJzLCBhZGlmSWRbMl0sOCk7Ci0gIEZES3dyaXRlQml0cyhoQnMsIGFkaWZJZFszXSw4KTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgYWRpZklkWzBdLCA4KTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgYWRpZklkWzFdLCA4KTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgYWRpZklkWzJdLCA4KTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgYWRpZklkWzNdLCA4KTsKIAorICBGREt3cml0ZUJpdHMoaEJzLCBjb3B5UmlnaHRJZFByZXNlbnQgPyAxIDogMCwgMSk7CiAKLSAgRkRLd3JpdGVCaXRzKGhCcywgY29weVJpZ2h0SWRQcmVzZW50ID8gMTowLDEpOwotCi0gIGlmKGNvcHlSaWdodElkUHJlc2VudCkgewotICAgIGZvcihpPTA7aTw3MjtpKyspIHsKLSAgICAgIEZES3dyaXRlQml0cyhoQnMsMCwxKTsKKyAgaWYgKGNvcHlSaWdodElkUHJlc2VudCkgeworICAgIGZvciAoaSA9IDA7IGkgPCA3MjsgaSsrKSB7CisgICAgICBGREt3cml0ZUJpdHMoaEJzLCAwLCAxKTsKICAgICB9CiAgIH0KLSAgRkRLd3JpdGVCaXRzKGhCcywgb3JpZ2luYWxDb3B5ID8gMTowLDEpOwotICBGREt3cml0ZUJpdHMoaEJzLCBob21lID8gMTowLDEpOwotICBGREt3cml0ZUJpdHMoaEJzLCBhZGlmLT5iVmFyaWFibGVSYXRlPzE6MCwgMSk7Ci0gIEZES3dyaXRlQml0cyhoQnMsIHRvdGFsQml0UmF0ZSwyMyk7CisgIEZES3dyaXRlQml0cyhoQnMsIG9yaWdpbmFsQ29weSA/IDEgOiAwLCAxKTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgaG9tZSA/IDEgOiAwLCAxKTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgYWRpZi0+YlZhcmlhYmxlUmF0ZSA/IDEgOiAwLCAxKTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgdG90YWxCaXRSYXRlLCAyMyk7CiAKICAgLyogd2Ugd3JpdGUgb25seSBvbmUgUENFIGF0IHRoZSBtb21lbnQgKi8KICAgRkRLd3JpdGVCaXRzKGhCcywgMCwgNCk7CiAKLSAgaWYoIWFkaWYtPmJWYXJpYWJsZVJhdGUpIHsKKyAgaWYgKCFhZGlmLT5iVmFyaWFibGVSYXRlKSB7CiAgICAgRkRLd3JpdGVCaXRzKGhCcywgYWRpZl9idWZmZXJfZnVsbG5lc3MsIDIwKTsKICAgfQotCiAgIC8qIFdyaXRlIFBDRSAqLwotICB0cmFuc3BvcnRFbmNfd3JpdGVQQ0UoaEJzLCBhZGlmLT5jbSwgc2FtcGxlUmF0ZSwgYWRpZi0+aW5zdGFuY2VUYWcsIGFkaWYtPnByb2ZpbGUsIDAsIDAsIGFsaWduQW5jaG9yKTsKKyAgdHJhbnNwb3J0RW5jX3dyaXRlUENFKGhCcywgYWRpZi0+Y20sIGFkaWYtPnNhbXBsaW5nUmF0ZSwgYWRpZi0+aW5zdGFuY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBhZGlmLT5wcm9maWxlLCBhZGlmLT5tYXRyaXhNaXhkb3duQSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChhZGlmLT5wc2V1ZG9TdXJyb3VuZEVuYWJsZSkgPyAxIDogMCwgYWxpZ25BbmNob3IpOwogCi0gIHJldHVybiAwOworICByZXR1cm4gZXJyOwogfQogCi1pbnQgYWRpZldyaXRlX0dldEhlYWRlckJpdHMoQURJRl9JTkZPICphZGlmKQoteworaW50IGFkaWZXcml0ZV9HZXRIZWFkZXJCaXRzKEFESUZfSU5GTyAqYWRpZikgewogICAvKiBBRElGIGRlZmluaXRpb25zICovCi0gIGNvbnN0IGludCAgY29weVJpZ2h0SWRQcmVzZW50PTA7CisgIGNvbnN0IGludCBjb3B5UmlnaHRJZFByZXNlbnQgPSAwOwogCi0gIGlmIChhZGlmLT5oZWFkZXJXcml0dGVuKQotICAgIHJldHVybiAwOworICBpZiAoYWRpZi0+aGVhZGVyV3JpdHRlbikgcmV0dXJuIDA7CiAKICAgaW50IGJpdHMgPSAwOwogCi0gIGJpdHMgKz0gOCo0OyAvKiBBRElGIElEICovCisgIGJpdHMgKz0gOCAqIDQ7IC8qIEFESUYgSUQgKi8KIAogICBiaXRzICs9IDE7IC8qIENvcHlyaWdodCBwcmVzZW50ICovCiAKLSAgaWYgKGNvcHlSaWdodElkUHJlc2VudCkKLSAgICBiaXRzICs9IDcyOyAgICAgICAgICAvKiBDb3B5cmlnaHQgSUQgKi8KKyAgaWYgKGNvcHlSaWdodElkUHJlc2VudCkgYml0cyArPSA3MjsgLyogQ29weXJpZ2h0IElEICovCiAKICAgYml0cyArPSAyNjsKIAogICBiaXRzICs9IDQ7IC8qIE51bWJlciBvZiBQQ0UncyAqLwogCi0gIGlmKCFhZGlmLT5iVmFyaWFibGVSYXRlKSB7CisgIGlmICghYWRpZi0+YlZhcmlhYmxlUmF0ZSkgewogICAgIGJpdHMgKz0gMjA7CiAgIH0KIAogICAvKiB3cml0ZSBQQ0UgKi8KLSAgYml0cyA9IHRyYW5zcG9ydEVuY19HZXRQQ0VCaXRzKGFkaWYtPmNtLCAwLCBiaXRzKTsKKyAgYml0cyA9IHRyYW5zcG9ydEVuY19HZXRQQ0VCaXRzKGFkaWYtPmNtLCBhZGlmLT5tYXRyaXhNaXhkb3duQSwgYml0cyk7CiAKICAgcmV0dXJuIGJpdHM7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWRpZi5oIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZGlmLmgKaW5kZXggZDU5MDM1NC4uZTAwMWFmYyAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZGlmLmgKKysrIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZGlmLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIEFsZXggR29lc2NoZWwKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBUcmFuc3BvcnQgSGVhZGVycyBzdXBwb3J0CisgICBBdXRob3Iocyk6ICAgQWxleCBHb2VzY2hlbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogVHJhbnNwb3J0IEhlYWRlcnMgc3VwcG9ydAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFRQRU5DX0FESUZfSAogI2RlZmluZSBUUEVOQ19BRElGX0gKQEAgLTEwNCw2ICsxMTYsOSBAQAogICBpbnQgYlZhcmlhYmxlUmF0ZTsKICAgaW50IGluc3RhbmNlVGFnOwogICBpbnQgaGVhZGVyV3JpdHRlbjsKKyAgaW50IG1hdHJpeE1peGRvd25BOworICBpbnQgcHNldWRvU3Vycm91bmRFbmFibGU7CisKIH0gQURJRl9JTkZPOwogCiAvKioKQEAgLTExNSwyMSArMTMwLDE3IEBACiAgKgogICogXHJldHVybiAwIG9uIHN1Y2Nlc3MKICAqLwotaW50IGFkaWZXcml0ZV9FbmNvZGVIZWFkZXIoCi0gICAgICAgIEFESUZfSU5GTyAgICAgICAgICAgKmFkaWYsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgIGFkaWZfYnVmZmVyX2Z1bGxuZXNzCi0gICAgICAgICk7CitpbnQgYWRpZldyaXRlX0VuY29kZUhlYWRlcihBRElGX0lORk8gKmFkaWYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYWRpZl9idWZmZXJfZnVsbG5lc3MpOwogCiAvKioKICAqIFxicmllZiBHZXQgYml0IGRlbWFuZCBvZiBhIEFESUYgaGVhZGVyCiAgKgogICogXHBhcmFtIGFkaWYgcG9pbnRlciB0byBBRElGX0lORk8gc3RydWN0dXJlCiAgKgotICogXHJldHVybiBhbW91bnQgb2YgYml0cyByZXF1aXJlZCB0byB3cml0ZSB0aGUgQURJRiBoZWFkZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhCi0gKiAgICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgYWRpZiBwYXJhbWV0ZXIKKyAqIFxyZXR1cm4gYW1vdW50IG9mIGJpdHMgcmVxdWlyZWQgdG8gd3JpdGUgdGhlIEFESUYgaGVhZGVyIGFjY29yZGluZyB0byB0aGUKKyAqIGRhdGEgY29udGFpbmVkIGluIHRoZSBhZGlmIHBhcmFtZXRlcgogICovCi1pbnQgYWRpZldyaXRlX0dldEhlYWRlckJpdHMoIEFESUZfSU5GTyAqYWRpZiApOworaW50IGFkaWZXcml0ZV9HZXRIZWFkZXJCaXRzKEFESUZfSU5GTyAqYWRpZik7CiAKICNlbmRpZiAvKiBUUEVOQ19BRElGX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZHRzLmNwcCBiL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWR0cy5jcHAKaW5kZXggZjRmMzE3OC4uM2Y3ZTYyYyAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZHRzLmNwcAorKysgYi9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkdHMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQ4ICs5MCw0MyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBbGV4IEdyb2VzY2hlbAotICAgY29udGVudHMvZGVzY3JpcHRpb246IEFEVFMgVHJhbnNwb3J0IEhlYWRlcnMgc3VwcG9ydAorICAgQXV0aG9yKHMpOiAgIEFsZXggR3JvZXNjaGVsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBBRFRTIFRyYW5zcG9ydCBIZWFkZXJzIHN1cHBvcnQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInRwZW5jX2FkdHMuaCIKIAotCiAjaW5jbHVkZSAidHBlbmNfbGliLmgiCiAjaW5jbHVkZSAidHBlbmNfYXNjLmgiCiAKLQogaW50IGFkdHNXcml0ZV9DcmNTdGFydFJlZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9BRFRTIHBBZHRzLCAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYWR0cyBzdHVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtQml0cyAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIGluIGNyYyByZWdpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworICAgIEhBTkRMRV9BRFRTIHBBZHRzLCAgICAgICAgLyohPCBwb2ludGVyIHRvIGFkdHMgc3R1Y3R1cmUgKi8KKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgbUJpdHMgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGJpdHMgaW4gY3JjIHJlZ2lvbiAqLworKSB7CiAgIGlmIChwQWR0cy0+cHJvdGVjdGlvbl9hYnNlbnQpIHsKICAgICByZXR1cm4gMDsKICAgfQotICByZXR1cm4gKCBGREtjcmNTdGFydFJlZygmcEFkdHMtPmNyY0luZm8sIGhCcywgbUJpdHMpICk7CisgIHJldHVybiAoRkRLY3JjU3RhcnRSZWcoJnBBZHRzLT5jcmNJbmZvLCBoQnMsIG1CaXRzKSk7CiB9CiAKIHZvaWQgYWR0c1dyaXRlX0NyY0VuZFJlZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsIC8qITwgcG9pbnRlciB0byBhZHRzIGNyYyBpbmZvIHN0dWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAvKiE8IGhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWcgICAgICAgICAgICAgICAgICAgIC8qITwgY3JjIHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgaWYgKHBBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCA9PSAwKQotICB7CisgICAgSEFORExFX0FEVFMgcEFkdHMsICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYWR0cyBjcmMgaW5mbyBzdHVjdHVyZSAqLworICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgLyohPCBoYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZSAqLworICAgIGludCByZWcgICAgICAgICAgICAgICAgICAgLyohPCBjcmMgcmVnaW9uICovCispIHsKKyAgaWYgKHBBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCA9PSAwKSB7CiAgICAgRkRLY3JjRW5kUmVnKCZwQWR0cy0+Y3JjSW5mbywgaEJzLCByZWcpOwogICB9CiB9CiAKLWludCBhZHRzV3JpdGVfR2V0SGVhZGVyQml0cyggSEFORExFX0FEVFMgaEFkdHMgKQoteworaW50IGFkdHNXcml0ZV9HZXRIZWFkZXJCaXRzKEhBTkRMRV9BRFRTIGhBZHRzKSB7CiAgIGludCBiaXRzID0gMDsKIAogICBpZiAoaEFkdHMtPmN1cnJlbnRCbG9jayA9PSAwKSB7CkBAIC0xMjksMTQgKzEzNSwxNSBAQAogICAgIGlmICghaEFkdHMtPnByb3RlY3Rpb25fYWJzZW50KSB7CiAgICAgICAvKiBBZGQgaGVhZGVyLyBzaW5nbGUgcmF3IGRhdGEgYmxvY2sgQ1JDIGJpdHMgKi8KICAgICAgIGJpdHMgKz0gMTY7Ci0gICAgICBpZiAoaEFkdHMtPm51bV9yYXdfYmxvY2tzPjApIHsKKyAgICAgIGlmIChoQWR0cy0+bnVtX3Jhd19ibG9ja3MgPiAwKSB7CiAgICAgICAgIC8qIEFkZCBiaXRzIG9mIHJhdyBkYXRhIGJsb2NrIHBvc2l0aW9uIG1hcmtlcnMgKi8KLSAgICAgICAgYml0cyArPSAoaEFkdHMtPm51bV9yYXdfYmxvY2tzKSoxNjsKKyAgICAgICAgYml0cyArPSAoaEFkdHMtPm51bV9yYXdfYmxvY2tzKSAqIDE2OwogICAgICAgfQogICAgIH0KICAgfQotICBpZiAoIWhBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCAmJiBoQWR0cy0+bnVtX3Jhd19ibG9ja3M+MCkgewotICAgIC8qIEFkZCByYXcgZGF0YSBibG9jayBDUkMgYml0cy4gTm90IHJlYWxseSBwYXJ0IG9mIHRoZSBoZWFkZXIsIHB1dCB0aGV5IGNhdXNlIGJpdCBvdmVyaGVhZCB0byBiZSBhY2NvdW50ZWQuICovCisgIGlmICghaEFkdHMtPnByb3RlY3Rpb25fYWJzZW50ICYmIGhBZHRzLT5udW1fcmF3X2Jsb2NrcyA+IDApIHsKKyAgICAvKiBBZGQgcmF3IGRhdGEgYmxvY2sgQ1JDIGJpdHMuIE5vdCByZWFsbHkgcGFydCBvZiB0aGUgaGVhZGVyLCBwdXQgdGhleQorICAgICAqIGNhdXNlIGJpdCBvdmVyaGVhZCB0byBiZSBhY2NvdW50ZWQuICovCiAgICAgYml0cyArPSAxNjsKICAgfQogCkBAIC0xNDUsMTMgKzE1MiwxMCBAQAogICByZXR1cm4gYml0czsKIH0KIAotSU5UIGFkdHNXcml0ZV9Jbml0KEhBTkRMRV9BRFRTIGhBZHRzLCBDT0RFUl9DT05GSUcgKmNvbmZpZykKLXsKK0lOVCBhZHRzV3JpdGVfSW5pdChIQU5ETEVfQURUUyBoQWR0cywgQ09ERVJfQ09ORklHICpjb25maWcpIHsKICAgLyogU2FuaXR5IGNoZWNrcyAqLwotICBpZiAoIGNvbmZpZy0+blN1YkZyYW1lcyA8IDEKLSAgICB8fCBjb25maWctPm5TdWJGcmFtZXMgPiA0Ci0gICAgfHwgKGludCljb25maWctPmFvdCA+IDQKLSAgICB8fCAoaW50KWNvbmZpZy0+YW90IDwgMSApIHsKKyAgaWYgKGNvbmZpZy0+blN1YkZyYW1lcyA8IDEgfHwgY29uZmlnLT5uU3ViRnJhbWVzID4gNCB8fAorICAgICAgKGludCljb25maWctPmFvdCA+IDQgfHwgKGludCljb25maWctPmFvdCA8IDEpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KIApAQCAtMTYxLDQxICsxNjUsMzggQEAKICAgfSBlbHNlIHsKICAgICBoQWR0cy0+bXBlZ19pZCA9IDE7IC8qIE1QRUcgMiAqLwogICB9Ci0gIGhBZHRzLT5sYXllcj0wOwotICBoQWR0cy0+cHJvdGVjdGlvbl9hYnNlbnQgPSAhIChjb25maWctPmZsYWdzICYgQ0NfUFJPVEVDVElPTik7CisgIGhBZHRzLT5sYXllciA9IDA7CisgIGhBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCA9ICEoY29uZmlnLT5mbGFncyAmIENDX1BST1RFQ1RJT04pOwogICBoQWR0cy0+cHJvZmlsZSA9ICgoaW50KWNvbmZpZy0+YW90KSAtIDE7Ci0gIGhBZHRzLT5zYW1wbGVfZnJlcV9pbmRleCA9IGdldFNhbXBsaW5nUmF0ZUluZGV4KGNvbmZpZy0+c2FtcGxpbmdSYXRlKTsKKyAgaEFkdHMtPnNhbXBsZV9mcmVxX2luZGV4ID0gZ2V0U2FtcGxpbmdSYXRlSW5kZXgoY29uZmlnLT5zYW1wbGluZ1JhdGUsIDQpOwogICBoQWR0cy0+c2FtcGxlX2ZyZXEgPSBjb25maWctPnNhbXBsaW5nUmF0ZTsKLSAgaEFkdHMtPnByaXZhdGVfYml0PTA7CisgIGhBZHRzLT5wcml2YXRlX2JpdCA9IDA7CiAgIGhBZHRzLT5jaGFubmVsX21vZGUgPSBjb25maWctPmNoYW5uZWxNb2RlOwotICBoQWR0cy0+b3JpZ2luYWw9MDsKLSAgaEFkdHMtPmhvbWU9MDsKKyAgaEFkdHMtPm9yaWdpbmFsID0gMDsKKyAgaEFkdHMtPmhvbWUgPSAwOwogICAvKiB2YXJpYWJsZSBoZWFkZXIgKi8KLSAgaEFkdHMtPmNvcHlyaWdodF9pZD0wOwotICBoQWR0cy0+Y29weXJpZ2h0X3N0YXJ0PTA7CisgIGhBZHRzLT5jb3B5cmlnaHRfaWQgPSAwOworICBoQWR0cy0+Y29weXJpZ2h0X3N0YXJ0ID0gMDsKIAotICBoQWR0cy0+bnVtX3Jhd19ibG9ja3M9Y29uZmlnLT5uU3ViRnJhbWVzLTE7IC8qIDAgbWVhbnMgMSByYXcgZGF0YSBibG9jayAqLworICBoQWR0cy0+bnVtX3Jhd19ibG9ja3MgPSBjb25maWctPm5TdWJGcmFtZXMgLSAxOyAvKiAwIG1lYW5zIDEgcmF3IGRhdGEgYmxvY2sgKi8KKworICBoQWR0cy0+Y2hhbm5lbF9jb25maWdfemVybyA9IGNvbmZpZy0+Y2hhbm5lbENvbmZpZ1plcm87CiAKICAgRkRLY3JjSW5pdCgmaEFkdHMtPmNyY0luZm8sIDB4ODAwNSwgMHhGRkZGLCAxNik7CiAKICAgaEFkdHMtPmN1cnJlbnRCbG9jayA9IDA7CiAKLQogICByZXR1cm4gMDsKIH0KIAotaW50IGFkdHNXcml0ZV9FbmNvZGVIZWFkZXIoSEFORExFX0FEVFMgaEFkdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9mdWxsbmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9sZW5ndGgpCi17CitpbnQgYWR0c1dyaXRlX0VuY29kZUhlYWRlcihIQU5ETEVfQURUUyBoQWR0cywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJfZnVsbG5lc3MsIGludCBmcmFtZV9sZW5ndGgpIHsKICAgSU5UIGNyY0luZGV4ID0gMDsKIAotCiAgIGhBZHRzLT5oZWFkZXJCaXRzID0gYWR0c1dyaXRlX0dldEhlYWRlckJpdHMoaEFkdHMpOwogCi0gIEZES19BU1NFUlQoKChmcmFtZV9sZW5ndGgraEFkdHMtPmhlYWRlckJpdHMpLzgpPDB4MjAwMCk7ICAgICAgLyoxMyBiaXQqLwotICBGREtfQVNTRVJUKGJ1ZmZlcl9mdWxsbmVzczwweDgwMCk7ICAgIC8qIDExIGJpdCAgICovCisgIEZES19BU1NFUlQoKChmcmFtZV9sZW5ndGggKyBoQWR0cy0+aGVhZGVyQml0cykgLyA4KSA8IDB4MjAwMCk7IC8qMTMgYml0Ki8KKyAgRkRLX0FTU0VSVChidWZmZXJfZnVsbG5lc3MgPCAweDgwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTEgYml0ICAgKi8KIAogICBpZiAoIWhBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCkgewogICAgIEZES2NyY1Jlc2V0KCZoQWR0cy0+Y3JjSW5mbyk7CkBAIC0yMDgsOCArMjA5LDcgQEAKICAgaEFkdHMtPnN1YkZyYW1lU3RhcnRCaXQgPSBGREtnZXRWYWxpZEJpdHMoaEJpdFN0cmVhbSk7CiAKICAgLyogU2tpcCBuZXcgaGVhZGVyIGlmIHRoaXMgaXMgcmF3IGRhdGEgYmxvY2sgMS4ubiAqLwotICBpZiAoaEFkdHMtPmN1cnJlbnRCbG9jayA9PSAwKQotICB7CisgIGlmIChoQWR0cy0+Y3VycmVudEJsb2NrID09IDApIHsKICAgICBGREtyZXNldEJpdGJ1ZmZlcihoQml0U3RyZWFtLCBCU19XUklURVIpOwogCiAgICAgaWYgKGhBZHRzLT5udW1fcmF3X2Jsb2NrcyA9PSAwKSB7CkBAIC0yMjQsMjQgKzIyNCwyNyBAQAogICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBoQWR0cy0+cHJvZmlsZSwgMik7CiAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGhBZHRzLT5zYW1wbGVfZnJlcV9pbmRleCwgNCk7CiAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGhBZHRzLT5wcml2YXRlX2JpdCwgMSk7Ci0gICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGdldENoYW5uZWxDb25maWcoaEFkdHMtPmNoYW5uZWxfbW9kZSksIDMpOworICAgIEZES3dyaXRlQml0cygKKyAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgZ2V0Q2hhbm5lbENvbmZpZyhoQWR0cy0+Y2hhbm5lbF9tb2RlLCBoQWR0cy0+Y2hhbm5lbF9jb25maWdfemVybyksIDMpOwogICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBoQWR0cy0+b3JpZ2luYWwsIDEpOwogICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBoQWR0cy0+aG9tZSwgMSk7CiAgICAgLyogdmFyaWFibGUgaGVhZGVyICovCiAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGhBZHRzLT5jb3B5cmlnaHRfaWQsIDEpOwogICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBoQWR0cy0+Y29weXJpZ2h0X3N0YXJ0LCAxKTsKLSAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgKGZyYW1lX2xlbmd0aCArIGhBZHRzLT5oZWFkZXJCaXRzKT4+MywgMTMpOworICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAoZnJhbWVfbGVuZ3RoICsgaEFkdHMtPmhlYWRlckJpdHMpID4+IDMsIDEzKTsKICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgYnVmZmVyX2Z1bGxuZXNzLCAxMSk7CiAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGhBZHRzLT5udW1fcmF3X2Jsb2NrcywgMik7CiAKICAgICBpZiAoIWhBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCkgewogICAgICAgaW50IGk7CiAKLSAgICAgIC8qIEVuZCBoZWFkZXIgQ1JDIHBvcnRpb24gZm9yIHNpbmdsZSByYXcgZGF0YSBibG9jayBhbmQgd3JpdGUgZHVtbXkgemVybyB2YWx1ZXMgZm9yIHVua25vd24gZmllbGRzLiAqLworICAgICAgLyogRW5kIGhlYWRlciBDUkMgcG9ydGlvbiBmb3Igc2luZ2xlIHJhdyBkYXRhIGJsb2NrIGFuZCB3cml0ZSBkdW1teSB6ZXJvCisgICAgICAgKiB2YWx1ZXMgZm9yIHVua25vd24gZmllbGRzLiAqLwogICAgICAgaWYgKGhBZHRzLT5udW1fcmF3X2Jsb2NrcyA9PSAwKSB7CiAgICAgICAgIGFkdHNXcml0ZV9DcmNFbmRSZWcoaEFkdHMsIGhCaXRTdHJlYW0sIGNyY0luZGV4KTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaT0wOyBpPGhBZHRzLT5udW1fcmF3X2Jsb2NrczsgaSsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoQWR0cy0+bnVtX3Jhd19ibG9ja3M7IGkrKykgewogICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxNik7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTI1MiwxNCArMjU1LDEzIEBACiAgIHJldHVybiAwOwogfQogCi12b2lkIGFkdHNXcml0ZV9FbmRSYXdEYXRhQmxvY2soSEFORExFX0FEVFMgaEFkdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwQml0cykKLXsKK3ZvaWQgYWR0c1dyaXRlX0VuZFJhd0RhdGFCbG9jayhIQU5ETEVfQURUUyBoQWR0cywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcEJpdHMpIHsKICAgaWYgKCFoQWR0cy0+cHJvdGVjdGlvbl9hYnNlbnQpIHsKICAgICBGREtfQklUU1RSRUFNIGJzV3JpdGVyOwogCi0gICAgRkRLaW5pdEJpdFN0cmVhbSgmYnNXcml0ZXIsIGhCcy0+aEJpdEJ1Zi5CdWZmZXIsIGhCcy0+aEJpdEJ1Zi5idWZTaXplLCAwLCBCU19XUklURVIpOworICAgIEZES2luaXRCaXRTdHJlYW0oJmJzV3JpdGVyLCBoQnMtPmhCaXRCdWYuQnVmZmVyLCBoQnMtPmhCaXRCdWYuYnVmU2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgIEJTX1dSSVRFUik7CiAgICAgRkRLcHVzaEZvcigmYnNXcml0ZXIsIDU2KTsKIAogICAgIGlmIChoQWR0cy0+bnVtX3Jhd19ibG9ja3MgPT0gMCkgewpAQCAtMjcyLDMyICsyNzQsMzUgQEAKIAogICAgICAgLyogV3JpdGUgZGlzdGFuY2UgdG8gY3VycmVudCBkYXRhIGJsb2NrICovCiAgICAgICBpZiAoaEFkdHMtPmN1cnJlbnRCbG9jayA8IGhBZHRzLT5udW1fcmF3X2Jsb2NrcykgewotICAgICAgICBGREtwdXNoRm9yKCZic1dyaXRlciwgaEFkdHMtPmN1cnJlbnRCbG9jayoxNik7Ci0gICAgICAgIGRpc3RhbmNlID0gRkRLZ2V0VmFsaWRCaXRzKGhCcykgLSAoNTYgKyAoaEFkdHMtPm51bV9yYXdfYmxvY2tzKSoxNiArIDE2KTsKLSAgICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgZGlzdGFuY2U+PjMsIDE2KTsKKyAgICAgICAgRkRLcHVzaEZvcigmYnNXcml0ZXIsIGhBZHRzLT5jdXJyZW50QmxvY2sgKiAxNik7CisgICAgICAgIGRpc3RhbmNlID0KKyAgICAgICAgICAgIEZES2dldFZhbGlkQml0cyhoQnMpIC0gKDU2ICsgKGhBZHRzLT5udW1fcmF3X2Jsb2NrcykgKiAxNiArIDE2KTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgZGlzdGFuY2UgPj4gMywgMTYpOwogICAgICAgfQogICAgIH0KICAgICBGREtzeW5jQ2FjaGUoJmJzV3JpdGVyKTsKICAgfQogCiAgIC8qIFdyaXRlIHRvdGFsIGZyYW1lIGxlbnRoIGZvciBtdWx0aXBsZSByYXcgZGF0YSBibG9ja3MgYW5kIGhlYWRlciBDUkMgKi8KLSAgaWYgKGhBZHRzLT5udW1fcmF3X2Jsb2NrcyA+IDAgJiYgaEFkdHMtPmN1cnJlbnRCbG9jayA9PSBoQWR0cy0+bnVtX3Jhd19ibG9ja3MpIHsKKyAgaWYgKGhBZHRzLT5udW1fcmF3X2Jsb2NrcyA+IDAgJiYKKyAgICAgIGhBZHRzLT5jdXJyZW50QmxvY2sgPT0gaEFkdHMtPm51bV9yYXdfYmxvY2tzKSB7CiAgICAgRkRLX0JJVFNUUkVBTSBic1dyaXRlcjsKICAgICBpbnQgY3JjSW5kZXggPSAwOwogCi0gICAgRkRLaW5pdEJpdFN0cmVhbSgmYnNXcml0ZXIsIGhCcy0+aEJpdEJ1Zi5CdWZmZXIsIGhCcy0+aEJpdEJ1Zi5idWZTaXplLCAwLCBCU19XUklURVIpOworICAgIEZES2luaXRCaXRTdHJlYW0oJmJzV3JpdGVyLCBoQnMtPmhCaXRCdWYuQnVmZmVyLCBoQnMtPmhCaXRCdWYuYnVmU2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgIEJTX1dSSVRFUik7CiAKICAgICBpZiAoIWhBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCkgewogICAgICAgRkRLY3JjUmVzZXQoJmhBZHRzLT5jcmNJbmZvKTsKICAgICAgIGNyY0luZGV4ID0gRkRLY3JjU3RhcnRSZWcoJmhBZHRzLT5jcmNJbmZvLCAmYnNXcml0ZXIsIDApOwogICAgIH0KICAgICAvKiBXcml0ZSB0b3RhbCBmcmFtZSBsZW5ndGggKi8KLSAgICBGREtwdXNoRm9yKCZic1dyaXRlciwgNTYtMjgrMik7Ci0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgRkRLZ2V0VmFsaWRCaXRzKGhCcyk+PjMsIDEzKTsKKyAgICBGREtwdXNoRm9yKCZic1dyaXRlciwgNTYgLSAyOCArIDIpOworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIEZES2dldFZhbGlkQml0cyhoQnMpID4+IDMsIDEzKTsKIAogICAgIC8qIFdyaXRlIGhlYWRlciBDUkMgKi8KICAgICBpZiAoIWhBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCkgewotICAgICAgRkRLcHVzaEZvcigmYnNXcml0ZXIsIDExKzIgKyAoaEFkdHMtPm51bV9yYXdfYmxvY2tzKSoxNik7CisgICAgICBGREtwdXNoRm9yKCZic1dyaXRlciwgMTEgKyAyICsgKGhBZHRzLT5udW1fcmF3X2Jsb2NrcykgKiAxNik7CiAgICAgICBGREtjcmNFbmRSZWcoJmhBZHRzLT5jcmNJbmZvLCAmYnNXcml0ZXIsIGNyY0luZGV4KTsKICAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIEZES2NyY0dldENSQygmaEFkdHMtPmNyY0luZm8pLCAxNik7CiAgICAgfQpAQCAtMzEyLDQgKzMxNywzIEBACiAgIH0KICAgaEFkdHMtPmN1cnJlbnRCbG9jaysrOwogfQotCmRpZmYgLS1naXQgYS9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkdHMuaCBiL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWR0cy5oCmluZGV4IGMxMmM3YzcuLmZlODYzMDYgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWR0cy5oCisrKyBiL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWR0cy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIwICs5MCwxOSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBbGV4IEdyb2VzY2hlbAotICAgY29udGVudHMvZGVzY3JpcHRpb246IEFEVFMgVHJhbnNwb3J0IHdyaXRlcgorICAgQXV0aG9yKHMpOiAgIEFsZXggR3JvZXNjaGVsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBBRFRTIFRyYW5zcG9ydCB3cml0ZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBUUEVOQ19BRFRTX0gKICNkZWZpbmUgVFBFTkNfQURUU19ICiAKLQotCiAjaW5jbHVkZSAidHBfZGF0YS5oIgogCiAjaW5jbHVkZSAiRkRLX2NyYy5oIgpAQCAtMTE0LDkgKzEyNCwxMSBAQAogICBVU0hPUlQgZnJhbWVfbGVuZ3RoOwogICBVQ0hBUiBudW1fcmF3X2Jsb2NrczsKICAgVUNIQVIgQnVmZmVyRnVsbG5lc1N0YXJ0RmxhZzsKLSAgaW50IGhlYWRlckJpdHM7ICAgICAgICAgICAgICAgIC8qITwgSGVhZGVyIGJpdCBkZW1hbmQgZm9yIHRoZSBjdXJyZW50IHJhdyBkYXRhIGJsb2NrICovCi0gIGludCBjdXJyZW50QmxvY2s7ICAgICAgICAgICAgICAvKiE8IEluZGV4IG9mIGN1cnJlbnQgcmF3IGRhdGEgYmxvY2sgKi8KLSAgaW50IHN1YkZyYW1lU3RhcnRCaXQ7ICAgICAgICAgIC8qITwgQml0IHBvc2l0aW9uIHdoZXJlIHRoZSBjdXJyZW50IHJhdyBkYXRhIGJsb2NrIGJlZ2lucyAqLworICBVQ0hBUiBjaGFubmVsX2NvbmZpZ196ZXJvOworICBpbnQgaGVhZGVyQml0czsgICAgICAgLyohPCBIZWFkZXIgYml0IGRlbWFuZCBmb3IgdGhlIGN1cnJlbnQgcmF3IGRhdGEgYmxvY2sgKi8KKyAgaW50IGN1cnJlbnRCbG9jazsgICAgIC8qITwgSW5kZXggb2YgY3VycmVudCByYXcgZGF0YSBibG9jayAqLworICBpbnQgc3ViRnJhbWVTdGFydEJpdDsgLyohPCBCaXQgcG9zaXRpb24gd2hlcmUgdGhlIGN1cnJlbnQgcmF3IGRhdGEgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2lucyAqLwogICBGREtfQ1JDSU5GTyBjcmNJbmZvOwogfSBTVFJVQ1RfQURUUzsKIApAQCAtMTMxLDEwICsxNDMsNyBAQAogICoKICAqIFxyZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCiAgKi8KLUlOVCBhZHRzV3JpdGVfSW5pdCgKLSAgICAgICAgSEFORExFX0FEVFMgICBoQWR0cywKLSAgICAgICAgQ09ERVJfQ09ORklHICpjb25maWcKLSAgICAgICAgKTsKK0lOVCBhZHRzV3JpdGVfSW5pdChIQU5ETEVfQURUUyBoQWR0cywgQ09ERVJfQ09ORklHICpjb25maWcpOwogCiAvKioKICAqIFxicmllZiBHZXQgdGhlIHRvdGFsIGJpdCBvdmVyaGVhZCBjYXVzZWQgYnkgQURUUwpAQCAtMTQzLDcgKzE1Miw3IEBACiAgKgogICogXHJldHVybiBBbW91bnQgb2YgYWRkaXRpb25hbCBiaXRzIHJlcXVpcmVkIGZvciB0aGUgY3VycmVudCByYXcgZGF0YSBibG9jawogICovCi1pbnQgYWR0c1dyaXRlX0dldEhlYWRlckJpdHMoIEhBTkRMRV9BRFRTIGhBZHRzICk7CitpbnQgYWR0c1dyaXRlX0dldEhlYWRlckJpdHMoSEFORExFX0FEVFMgaEFkdHMpOwogCiAvKioKICAqIFxicmllZiBXcml0ZSBhbiBBRFRTIGhlYWRlciBpbnRvIHRoZSBnaXZlbiBiaXRzdHJlYW0uIE1heSBub3Qgd3JpdGUgYSBoZWFkZXIKQEAgLTE1Niw0NyArMTY1LDM2IEBACiAgKgogICogXHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KICAqLwotSU5UIGFkdHNXcml0ZV9FbmNvZGVIZWFkZXIoCi0gICAgICAgIEhBTkRMRV9BRFRTICAgICAgICAgIGhBZHRzLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBidWZmZXJGdWxsbmVzcywKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgZnJhbWVfbGVuZ3RoCi0gICAgICAgICk7CitJTlQgYWR0c1dyaXRlX0VuY29kZUhlYWRlcihIQU5ETEVfQURUUyBoQWR0cywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJGdWxsbmVzcywgaW50IGZyYW1lX2xlbmd0aCk7CiAvKioKICAqIFxicmllZiBGaW5pc2ggYSBBRFRTIHJhdyBkYXRhIGJsb2NrCiAgKgogICogXHBhcmFtIGhBZHRzIEFEVFMgZGF0YSBoYW5kbGUKICAqIFxwYXJhbSBoQnMgYml0c3RyZWFtIGhhbmRsZSBpbnRvIHdoaWNoIHRoZSBBRFRTIG1heSBiZSB3cml0dGVuIGludG8KLSAqIFxwYXJhbSBwQml0cyBhIHBvaW50ZXIgdG8gYSBpbnRlZ2VyIGhvbGRpbmcgdGhlIGN1cnJlbnQgYml0c3RyZWFtIGJ1ZmZlciBiaXQgY291bnQsCi0gKiAgICAgICAgICAgICAgd2hpY2ggaXMgY29ycmVjdGVkIHRvIHRoZSBjdXJyZW50IHJhdyBkYXRhIGJsb2NrIGJvdW5kYXJ5LgorICogXHBhcmFtIHBCaXRzIGEgcG9pbnRlciB0byBhIGludGVnZXIgaG9sZGluZyB0aGUgY3VycmVudCBiaXRzdHJlYW0gYnVmZmVyIGJpdAorICogY291bnQsIHdoaWNoIGlzIGNvcnJlY3RlZCB0byB0aGUgY3VycmVudCByYXcgZGF0YSBibG9jayBib3VuZGFyeS4KICAqCiAgKi8KLXZvaWQgYWR0c1dyaXRlX0VuZFJhd0RhdGFCbG9jaygKLSAgICAgICAgSEFORExFX0FEVFMgICAgICAgICAgaEFkdHMsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqYml0cwotICAgICAgICApOwotCit2b2lkIGFkdHNXcml0ZV9FbmRSYXdEYXRhQmxvY2soSEFORExFX0FEVFMgaEFkdHMsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpOwogCiAvKioKICAqIFxicmllZiBTdGFydCBDUkMgcmVnaW9uIHdpdGggYSBtYXhpbXVtIG51bWJlciBvZiBiaXRzCi0gKiAgICAgICAgSWYgbUJpdHMgaXMgcG9zaXRpdmUgemVybyBwYWRkaW5nIHdpbGwgYmUgdXNlZCBmb3IgQ1JDIGNhbGN1bGF0aW9uLCBpZiB0aGVyZQotICogICAgICAgIGFyZSBsZXNzIHRoYW4gbUJpdHMgYml0cyBhdmFpbGFibGUuCi0gKiAgICAgICAgSWYgbUJpdHMgaXMgbmVnYXRpdmUgbm8gemVybyBwYWRkaW5nIGlzIGRvbmUuCi0gKiAgICAgICAgSWYgbUJpdHMgaXMgemVybyB0aGUgbWVtb3J5IGZvciB0aGUgYnVmZmVyIGlzIGFsbG9jYXRlZCBkeW5hbWljYWxseSwgdGhlCi0gKiAgICAgICAgbnVtYmVyIG9mIGJpdHMgaXMgbm90IGxpbWl0ZWQuCisgKiAgICAgICAgSWYgbUJpdHMgaXMgcG9zaXRpdmUgemVybyBwYWRkaW5nIHdpbGwgYmUgdXNlZCBmb3IgQ1JDIGNhbGN1bGF0aW9uLCBpZgorICogdGhlcmUgYXJlIGxlc3MgdGhhbiBtQml0cyBiaXRzIGF2YWlsYWJsZS4gSWYgbUJpdHMgaXMgbmVnYXRpdmUgbm8gemVybworICogcGFkZGluZyBpcyBkb25lLiBJZiBtQml0cyBpcyB6ZXJvIHRoZSBtZW1vcnkgZm9yIHRoZSBidWZmZXIgaXMKKyAqIGFsbG9jYXRlZCBkeW5hbWljYWxseSwgdGhlIG51bWJlciBvZiBiaXRzIGlzIG5vdCBsaW1pdGVkLgogICoKICAqIFxwYXJhbSBwQWR0cyBBRFRTIGRhdGEgaGFuZGxlCiAgKiBccGFyYW0gaEJzIGJpdHN0cmVhbSBoYW5kbGUgb2Ygd2hpY2ggdGhlIENSQyByZWdpb24gZW5kcwotICogXHBhcmFtIG1CaXRzIGxpbWl0IG9mIG51bWJlciBvZiBiaXRzIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSByZXF1ZXN0ZWQgQ1JDIHJlZ2lvbgorICogXHBhcmFtIG1CaXRzIGxpbWl0IG9mIG51bWJlciBvZiBiaXRzIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSByZXF1ZXN0ZWQgQ1JDCisgKiByZWdpb24KICAqCiAgKiBccmV0dXJuIElEIGZvciB0aGUgY3JlYXRlZCByZWdpb24sIC0xIGluIGNhc2Ugb2YgYW4gZXJyb3IKICAqLwotaW50IGFkdHNXcml0ZV9DcmNTdGFydFJlZygKLSAgICAgICAgSEFORExFX0FEVFMgICAgICAgICAgcEFkdHMsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbUJpdHMKLSAgICAgICAgKTsKK2ludCBhZHRzV3JpdGVfQ3JjU3RhcnRSZWcoSEFORExFX0FEVFMgcEFkdHMsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1CaXRzKTsKIAogLyoqCiAgKiBcYnJpZWYgRW5kcyBDUkMgcmVnaW9uIGlkZW50aWZpZWQgYnkgcmVnCkBAIC0yMDUsMTQgKzIwMyw2IEBACiAgKiBccGFyYW0gaEJzIGJpdHN0cmVhbSBoYW5kbGUgb2Ygd2hpY2ggdGhlIENSQyByZWdpb24gZW5kcwogICogXHBhcmFtIHJlZyBhIENSQyByZWdpb24gSUQgcmV0dXJuZWQgcHJldmlvdXNseSBieSBhZHRzV3JpdGVfQ3JjU3RhcnRSZWcoKQogICovCi12b2lkIGFkdHNXcml0ZV9DcmNFbmRSZWcoCi0gICAgICAgIEhBTkRMRV9BRFRTICAgICAgICAgIHBBZHRzLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIHJlZwotICAgICAgICApOwotCi0KLQordm9pZCBhZHRzV3JpdGVfQ3JjRW5kUmVnKEhBTkRMRV9BRFRTIHBBZHRzLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGludCByZWcpOwogCiAjZW5kaWYgLyogVFBFTkNfQURUU19IICovCi0KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYXNjLmNwcCBiL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYXNjLmNwcAppbmRleCBiYzQzMDJlLi5jZTRlMzY0IDEwMDY0NAotLS0gYS9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FzYy5jcHAKKysrIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hc2MuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOgorCiAgICBEZXNjcmlwdGlvbjoKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInRwX2RhdGEuaCIKIApAQCAtOTUsNzAgKzEwNywxNjIgQEAKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAotI2RlZmluZSBQQ0VfTUFYX0VMRU1FTlRTIDgKKyNpbmNsdWRlICJGREtfY3JjLmgiCisKKyNkZWZpbmUgUENFX0hFSUdIVF9FWFRfU1lOQyAoMHhBQykKKyNkZWZpbmUgSEVJR0hUX05PUk1BTCAwCisjZGVmaW5lIEhFSUdIVF9UT1AgMQorI2RlZmluZSBIRUlHSFRfQk9UVE9NIDIKKyNkZWZpbmUgTUFYX0ZST05UX0VMRU1FTlRTIDgKKyNkZWZpbmUgTUFYX1NJREVfRUxFTUVOVFMgMworI2RlZmluZSBNQVhfQkFDS19FTEVNRU5UUyA0CisKKy8qKgorICogIERlc2NyaWJlIGFkZGl0aW9uYWwgUENFIGhlaWdodCBpbmZvcm1hdGlvbiBmb3IgZnJvbnQsIHNpZGUgYW5kIGJhY2sgY2hhbm5lbAorICogZWxlbWVudHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIKKyAgbnVtX2Zyb250X2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzJdOyAgICAgIC8qITwgTnVtYmVyIG9mIGZyb250IGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGluIHRvcCBbMF0gYW5kIGJvdHRvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzFdIHBsYW5lLiAqLworICBVQ0hBUiBudW1fc2lkZV9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1syXTsgLyohPCBOdW1iZXIgb2Ygc2lkZSBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyBpbiB0b3AgWzBdIGFuZCBib3R0b20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXSBwbGFuZS4gKi8KKyAgVUNIQVIgbnVtX2JhY2tfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMl07IC8qITwgTnVtYmVyIG9mIGJhY2sgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgaW4gdG9wIFswXSBhbmQgYm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV0gcGxhbmUuICovCit9IFBDRV9IRUlHSFRfTlVNOwogCiAvKioKICAqICBEZXNjcmliZSBhIFBDRSBiYXNlZCBvbiBwbGFjZWQgY2hhbm5lbCBlbGVtZW50cyBhbmQgZWxlbWVudCB0eXBlIHNlcXVlbmNlLgogICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBVQ0hBUiAgICBudW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50czsgICAgIC8qITwgTnVtYmVyIG9mIGZyb250IGNoYW5uZWwgZWxlbWVudHMuICovCi0gICAgVUNIQVIgICAgbnVtX3NpZGVfY2hhbm5lbF9lbGVtZW50czsgICAgICAvKiE8IE51bWJlciBvZiBzaWRlIGNoYW5uZWwgZWxlbWVudHMuICovCi0gICAgVUNIQVIgICAgbnVtX2JhY2tfY2hhbm5lbF9lbGVtZW50czsgICAgICAvKiE8IE51bWJlciBvZiBiYWNrIGNoYW5uZWwgZWxlbWVudHMuICovCi0gICAgVUNIQVIgICAgbnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzOyAgICAgICAvKiE8IE51bWJlciBvZiBsZmUgY2hhbm5lbCBlbGVtZW50cy4gKi8KLSAgICBNUDRfRUxFTUVOVF9JRCBlbF9saXN0W1BDRV9NQVhfRUxFTUVOVFNdOy8qITwgTGlzdCBjb250YWlucyBzZXF1ZW5jZSBkZXNjcmliaW5nIHRoZSBlbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBwcmVzZW50IGNoYW5uZWwgbW9kZS4gKE1QRUcgb3JkZXIpICovCisgIFVDSEFSIG51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzOyAvKiE8IE51bWJlciBvZiBmcm9udCBjaGFubmVsIGVsZW1lbnRzLiAqLworICBVQ0hBUiBudW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzOyAgLyohPCBOdW1iZXIgb2Ygc2lkZSBjaGFubmVsIGVsZW1lbnRzLiAqLworICBVQ0hBUiBudW1fYmFja19jaGFubmVsX2VsZW1lbnRzOyAgLyohPCBOdW1iZXIgb2YgYmFjayBjaGFubmVsIGVsZW1lbnRzLiAqLworICBVQ0hBUiBudW1fbGZlX2NoYW5uZWxfZWxlbWVudHM7ICAgLyohPCBOdW1iZXIgb2YgbGZlIGNoYW5uZWwgZWxlbWVudHMuICovCisgIGNvbnN0IE1QNF9FTEVNRU5UX0lECisgICAgICAqcEVsX3R5cGU7IC8qITwgTGlzdCBjb250YWlucyBzZXF1ZW5jZSBkZXNjcmliaW5nIHRoZSBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgIGluIHByZXNlbnQgY2hhbm5lbCBtb2RlLiAoTVBFRyBvcmRlcikgKi8KKyAgY29uc3QgUENFX0hFSUdIVF9OVU0gKnBIZWlnaHRfbnVtOwogfSBQQ0VfQ09ORklHVVJBVElPTjsKIAotCiAvKioKICAqICBNYXAgYW4gaW5jb21pbmcgY2hhbm5lbCBtb2RlIHRvIGEgZXhpc3RpbmcgUENFIGNvbmZpZ3VyYXRpb24gZW50cnkuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQotICAgIENIQU5ORUxfTU9ERSAgICAgICAgY2hhbm5lbF9tb2RlOyAgICAgICAgLyohPCBQcmVzZW50IGNoYW5uZWwgbW9kZS4gKi8KLSAgICBQQ0VfQ09ORklHVVJBVElPTiAgIHBjZV9jb25maWd1cmF0aW9uOyAgIC8qITwgUHJvZ3JhbSBjb25maWcgZWxlbWVudCBkZXNjcmlwdGlvbi4gKi8KKyAgQ0hBTk5FTF9NT0RFIGNoYW5uZWxfbW9kZTsgLyohPCBQcmVzZW50IGNoYW5uZWwgbW9kZS4gKi8KKyAgUENFX0NPTkZJR1VSQVRJT04KKyAgcGNlX2NvbmZpZ3VyYXRpb247IC8qITwgUHJvZ3JhbSBjb25maWcgZWxlbWVudCBkZXNjcmlwdGlvbi4gKi8KIAogfSBDSEFOTkVMX0NPTkZJR1VSQVRJT047CiAKKy8qKgorICogVGhlIGZvbGxvd2luZyBhcnJheXMgcHJvdmlkZSB0aGUgSURzIG9mIHRoZSBjb25zZWN1dGl2ZSBlbGVtZW50cyBmb3IgZWFjaAorICogbW9kZS4KKyAqLworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsVHlwZV8xW10gPSB7SURfU0NFfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbFR5cGVfMltdID0ge0lEX0NQRX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxUeXBlXzFfMltdID0ge0lEX1NDRSwgSURfQ1BFfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbFR5cGVfMV8yXzFbXSA9IHtJRF9TQ0UsIElEX0NQRSwgSURfU0NFfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbFR5cGVfMV8yXzJbXSA9IHtJRF9TQ0UsIElEX0NQRSwgSURfQ1BFfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbFR5cGVfMV8yXzJfMVtdID0ge0lEX1NDRSwgSURfQ1BFLCBJRF9DUEUsIElEX0xGRX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxUeXBlXzFfMl8yXzJfMVtdID0ge0lEX1NDRSwgSURfQ1BFLCBJRF9DUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX0NQRSwgSURfTEZFfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbFR5cGVfNl8xW10gPSB7SURfU0NFLCBJRF9DUEUsIElEX0NQRSwgSURfU0NFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9MRkV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsVHlwZV83XzFfYmFja1tdID0ge0lEX1NDRSwgSURfQ1BFLCBJRF9DUEUsIElEX0NQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9MRkV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsVHlwZV83XzFfdG9wX2Zyb250W10gPSB7SURfU0NFLCBJRF9DUEUsIElEX0NQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX0xGRSwgSURfQ1BFfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbFR5cGVfN18xX3JlYXJfc3Vycm91bmRbXSA9IHsKKyAgICBJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLCBJRF9DUEUsIElEX0xGRX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxUeXBlXzdfMV9mcm9udF9jZW50ZXJbXSA9IHtJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfQ1BFLCBJRF9MRkV9OwogCiAvKioKLSAqIFxicmllZiBUYWJsZSBjb250YWlucyBhbGwgc3VwcG9ydGVkIGNoYW5uZWwgbW9kZXMgYW5kIGFjY29yZGluZyBQQ0UgY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbi4KLSAqCi0gKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWwgZWxlbWVudCBwYXJhbWV0ZXIgZGVzY3JpYmVzIHRoZSBraW5kIG9mIGNvbnNlY3V0aXZlbHkgZWxlbWVudHMuCi0gKiBFLmcuIE1PREVfMV8yXzJfMl8xIG1lYW5zOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gRmlyc3QgMyBlbGVtZW50cyAoU0NFLENQRSxDUEUpIGFyZSBmcm9udCBjaGFubmVsIGVsZW1lbnRzLgotICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gTmV4dCBlbGVtZW50IChDUEUpIGlzIGEgYmFjayBjaGFubmVsIGVsZW1lbnQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBMYXN0IGVsZW1lbnQgKExGRSkgaXMgYSBsZmUgY2hhbm5lbCBlbGVtZW50LgorICogVGhlIGZvbGxvd2luZyBhcnJheXMgcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBob3cgbWFueSBmcm9udCwgc2lkZSBhbmQgYmFjaworICogZWxlbWVudHMgYXJlIGFzc2lnbmVkIHRvIHRoZSB0b3Agb3IgYm90dG9tIHBsYW5lIGZvciBlYWNoIG1vZGUgdGhhdCBjb21wcmlzZXMKKyAqIGhlaWdodCBpbmZvcm1hdGlvbi4KICAqLwotc3RhdGljIGNvbnN0IENIQU5ORUxfQ09ORklHVVJBVElPTiBwY2VDb25maWdUYWJbXSA9Ci17Ci0gIHsgTU9ERV8xLCAgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDAsIDAsIDAsIHsgSURfU0NFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKLSAgeyBNT0RFXzIsICAgICAgICAgICAgICAgICAgICAgICAgeyAgMSwgMCwgMCwgMCwgeyBJRF9DUEUsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAotICB7IE1PREVfMV8yLCAgICAgICAgICAgICAgICAgICAgICB7ICAyLCAwLCAwLCAwLCB7IElEX1NDRSwgIElEX0NQRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCi0gIHsgTU9ERV8xXzJfMSwgICAgICAgICAgICAgICAgICAgIHsgIDIsIDAsIDEsIDAsIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfU0NFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKLSAgeyBNT0RFXzFfMl8yLCAgICAgICAgICAgICAgICAgICAgeyAgMiwgMCwgMSwgMCwgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAotICB7IE1PREVfMV8yXzJfMSwgICAgICAgICAgICAgICAgICB7ICAyLCAwLCAxLCAxLCB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0xGRSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKLSAgeyBNT0RFXzFfMl8yXzJfMSwgICAgICAgICAgICAgICAgeyAgMywgMCwgMSwgMSwgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9DUEUsICBJRF9MRkUsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAorc3RhdGljIGNvbnN0IFBDRV9IRUlHSFRfTlVNIGhlaWdodE51bV83XzFfdG9wX2Zyb250ID0ge3sxLCAwfSwgezAsIDB9LCB7MCwgMH19OwogCisvKioKKyAqIFxicmllZiBUYWJsZSBjb250YWlucyBhbGwgc3VwcG9ydGVkIGNoYW5uZWwgbW9kZXMgYW5kIGFjY29yZGluZyBQQ0UKKyBjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uLgorICoKKyAqIFRoZSBtb2RlIGlkZW50aWZpZXIgaXMgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZiBmcm9udCwgc2lkZSwgYmFjaywgYW5kIExGRQorIGVsZW1lbnRzLgorICogVGhlc2UgYXJlIGZvbGxvd2VkIGJ5IGEgcG9pbnRlciB0byB0aGUgSURzIG9mIHRoZSBjb25zZWN1dGl2ZSBlbGVtZW50cworIChJRF9TQ0UsIElEX0NQRSwgSURfTEZFKS4KKyAqCisgKiBGb3Igc29tZSBtb2RlcyAoTU9ERV83XzFfVE9QX0ZST05UIGFuZCBNT0RFXzIyXzIpIGFkZGl0aW9uYWwgaGVpZ2h0CisgaW5mb3JtYXRpb24gaXMgdHJhbnNtaXR0ZWQuCisgKiBJbiB0aGlzIGNhc2UgdGhlIGFkZGl0aW9uYWwgcG9pbnRlciBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBob3cgbWFueSBmcm9udCwKKyBzaWRlIGFuZCBiYWNrIGVsZW1lbnRzCisgKiBhcmUgYXNzaWduZWQgdG8gdGhlIHRvcCBvciBib3R0b20gcGxhbmUuVGhlIGVsZW1lbnRzIGFyZSBhcnJhbmdlZCBpbiB0aGUKKyBmb2xsb3dpbmcgb3JkZXI6IG5vcm1hbCBoZWlnaHQgKGZyb250LCBzaWRlLCBiYWNrLCBMRkUpLCB0b3AgaGVpZ2h0IChmcm9udCwKKyBzaWRlLCBiYWNrKSwgYm90dG9tIGhlaWdodCAoZnJvbnQsIHNpZGUsIGJhY2spLgorICoKKyAqCisgKiBFLmcuIE1PREVfN18xX1RPUF9GUk9OVCBtZWFuczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAtIDMgZWxlbWVudHMgYXJlIGZyb250IGNoYW5uZWwgZWxlbWVudHMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwIGVsZW1lbnRzIGFyZSBzaWRlIGNoYW5uZWwgZWxlbWVudHMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIGVsZW1lbnQgaXMgYmFjayBjaGFubmVsIGVsZW1lbnQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIGVsZW1lbnQgaXMgYW4gTEZFIGNoYW5uZWwgZWxlbWVudC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBlbGVtZW50IG9yZGVyIGlzIElEX1NDRSwgSURfQ1BFLCBJRF9DUEUsCisgSURfTEZFLCBJRF9DUEUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIG9mIHRoZSBmcm9udCBlbGVtZW50cyBpcyBpbiB0aGUgdG9wIHBsYW5lLgorICoKKyAqIFRoaXMgbGVhZHMgdG8gdGhlIGZvbGxvd2luZyBtYXBwaW5nIGZvciB0aGUgY2NvbnNlY3V0aXZlIGVsZW1lbnRzIGluIHRoZQorIE1PREVfN18xX1RPUF9GUk9OVCBiaXRzdHJlYW06CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJRF9TQ0UgLT4gbm9ybWFsIGhlaWdodCBmcm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIElEX0NQRSAtPiBub3JtYWwgaGVpZ2h0IGZyb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSURfQ1BFIC0+IG5vcm1hbCBoZWlnaHQgYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIElEX0xGRSAtPiBub3JtYWwgaGVpZ2h0IExGRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIElEX0NQRSAtPiB0b3AgaGVpZ2h0IGZyb250LgorICovCitzdGF0aWMgY29uc3QgQ0hBTk5FTF9DT05GSUdVUkFUSU9OIHBjZUNvbmZpZ1RhYltdID0geworICAgIHtNT0RFXzEsCisgICAgIHsxLCAwLCAwLCAwLCBlbFR5cGVfMSwKKyAgICAgIE5VTEx9fSwgLyogZG9uJ3QgdHJhbnNtaXQgaGVpZ2h0IGluZm9ybWF0aW9uIGluIHRoaXMgbW9kZSAqLworICAgIHtNT0RFXzIsCisgICAgIHsxLCAwLCAwLCAwLCBlbFR5cGVfMiwKKyAgICAgIE5VTEx9fSwgLyogZG9uJ3QgdHJhbnNtaXQgaGVpZ2h0IGluZm9ybWF0aW9uIGluIHRoaXMgbW9kZSAqLworICAgIHtNT0RFXzFfMiwKKyAgICAgezIsIDAsIDAsIDAsIGVsVHlwZV8xXzIsCisgICAgICBOVUxMfX0sIC8qIGRvbid0IHRyYW5zbWl0IGhlaWdodCBpbmZvcm1hdGlvbiBpbiB0aGlzIG1vZGUgKi8KKyAgICB7TU9ERV8xXzJfMSwKKyAgICAgezIsIDAsIDEsIDAsIGVsVHlwZV8xXzJfMSwKKyAgICAgIE5VTEx9fSwgLyogZG9uJ3QgdHJhbnNtaXQgaGVpZ2h0IGluZm9ybWF0aW9uIGluIHRoaXMgbW9kZSAqLworICAgIHtNT0RFXzFfMl8yLAorICAgICB7MiwgMCwgMSwgMCwgZWxUeXBlXzFfMl8yLAorICAgICAgTlVMTH19LCAvKiBkb24ndCB0cmFuc21pdCBoZWlnaHQgaW5mb3JtYXRpb24gaW4gdGhpcyBtb2RlICovCisgICAge01PREVfMV8yXzJfMSwKKyAgICAgezIsIDAsIDEsIDEsIGVsVHlwZV8xXzJfMl8xLAorICAgICAgTlVMTH19LCAvKiBkb24ndCB0cmFuc21pdCBoZWlnaHQgaW5mb3JtYXRpb24gaW4gdGhpcyBtb2RlICovCisgICAge01PREVfMV8yXzJfMl8xLAorICAgICB7MywgMCwgMSwgMSwgZWxUeXBlXzFfMl8yXzJfMSwKKyAgICAgIE5VTEx9fSwgLyogZG9uJ3QgdHJhbnNtaXQgaGVpZ2h0IGluZm9ybWF0aW9uIGluIHRoaXMgbW9kZSAqLwogCi0gIHsgTU9ERV8xXzEsICAgICAgICAgICAgICAgICAgICAgIHsgIDIsIDAsIDAsIDAsIHsgSURfU0NFLCAgSURfU0NFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKLSAgeyBNT0RFXzFfMV8xXzEsICAgICAgICAgICAgICAgICAgeyAgMiwgMiwgMCwgMCwgeyBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAotICB7IE1PREVfMV8xXzFfMV8xXzEsICAgICAgICAgICAgICB7ICAyLCAyLCAyLCAwLCB7IElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX05PTkUsIElEX05PTkUgfSB9IH0sCi0gIHsgTU9ERV8xXzFfMV8xXzFfMV8xXzEsICAgICAgICAgIHsgIDMsIDIsIDMsIDAsIHsgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFIH0gfSB9LAorICAgIHtNT0RFXzZfMSwKKyAgICAgezIsIDAsIDIsIDEsIGVsVHlwZV82XzEsCisgICAgICBOVUxMfX0sIC8qIGRvbid0IHRyYW5zbWl0IGhlaWdodCBpbmZvcm1hdGlvbiBpbiB0aGlzIG1vZGUgKi8KKyAgICB7TU9ERV83XzFfQkFDSywKKyAgICAgezIsIDAsIDIsIDEsIGVsVHlwZV83XzFfYmFjaywKKyAgICAgIE5VTEx9fSwgLyogZG9uJ3QgdHJhbnNtaXQgaGVpZ2h0IGluZm9ybWF0aW9uIGluIHRoaXMgbW9kZSAqLworICAgIHtNT0RFXzdfMV9UT1BfRlJPTlQsCisgICAgIHszLCAwLCAxLCAxLCBlbFR5cGVfN18xX3RvcF9mcm9udCwgJmhlaWdodE51bV83XzFfdG9wX2Zyb250fX0sCiAKLSAgeyBNT0RFXzJfMiwgICAgICAgICAgICAgICAgICAgICAgeyAgMSwgMCwgMSwgMCwgeyBJRF9DUEUsICBJRF9DUEUsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAotICB7IE1PREVfMl8yXzIsICAgICAgICAgICAgICAgICAgICB7ICAxLCAxLCAxLCAwLCB7IElEX0NQRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCi0gIHsgTU9ERV8yXzJfMl8yLCAgICAgICAgICAgICAgICAgIHsgIDQsIDAsIDAsIDAsIHsgSURfQ1BFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKLQotICB7IE1PREVfMl8xLCAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAwLCAxLCAwLCB7IElEX0NQRSwgIElEX1NDRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCi0KLSAgeyBNT0RFXzdfMV9SRUFSX1NVUlJPVU5ELCAgICAgICAgeyAgMiwgMCwgMiwgMSwgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9DUEUsICBJRF9MRkUsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAotICB7IE1PREVfN18xX0ZST05UX0NFTlRFUiwgICAgICAgICB7ICAzLCAwLCAxLCAxLCB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0xGRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCi0KKyAgICB7TU9ERV83XzFfUkVBUl9TVVJST1VORCwKKyAgICAgezIsIDAsIDIsIDEsIGVsVHlwZV83XzFfcmVhcl9zdXJyb3VuZCwKKyAgICAgIE5VTEx9fSwgLyogZG9uJ3QgdHJhbnNtaXQgaGVpZ2h0IGluZm9ybWF0aW9uIGluIHRoaXMgbW9kZSAqLworICAgIHtNT0RFXzdfMV9GUk9OVF9DRU5URVIsCisgICAgIHszLCAwLCAxLCAxLCBlbFR5cGVfN18xX2Zyb250X2NlbnRlciwKKyAgICAgIE5VTEx9fSAvKiBkb24ndCB0cmFuc21pdCBoZWlnaHQgaW5mb3JtYXRpb24gaW4gdGhpcyBtb2RlICovCiB9OwogCi0KIC8qKgogICogXGJyaWVmICBHZXQgcHJvZ3JhbSBjb25maWcgZWxlbWVudCBkZXNjcmlwdGlvbiBmb3IgZXhpc3RpbmcgY2hhbm5lbCBtb2RlLgogICoKQEAgLTE2OCwxMjMgKzI3MiwyNjAgQEAKICAqICAgICAgICAgIC0gUG9pbnRlciB0byBQQ0VfQ09ORklHVVJBVElPTiBlbnRyeSwgb24gc3VjY2Vzcy4KICAqICAgICAgICAgIC0gTlVMTCwgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIGNvbnN0IFBDRV9DT05GSUdVUkFUSU9OKiBnZXRQY2VFbnRyeSgKLSAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxfbW9kZQotICAgICAgICApCi17CitzdGF0aWMgY29uc3QgUENFX0NPTkZJR1VSQVRJT04gKmdldFBjZUVudHJ5KGNvbnN0IENIQU5ORUxfTU9ERSBjaGFubmVsX21vZGUpIHsKICAgVUlOVCBpOwogICBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiAqcGNlX2NvbmZpZyA9IE5VTEw7CiAKLSAgZm9yIChpPTA7IGkgPCAoc2l6ZW9mKHBjZUNvbmZpZ1RhYikvc2l6ZW9mKENIQU5ORUxfQ09ORklHVVJBVElPTikpOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IChzaXplb2YocGNlQ29uZmlnVGFiKSAvIHNpemVvZihDSEFOTkVMX0NPTkZJR1VSQVRJT04pKTsgaSsrKSB7CiAgICAgaWYgKHBjZUNvbmZpZ1RhYltpXS5jaGFubmVsX21vZGUgPT0gY2hhbm5lbF9tb2RlKSB7CiAgICAgICBwY2VfY29uZmlnID0gJnBjZUNvbmZpZ1RhYltpXS5wY2VfY29uZmlndXJhdGlvbjsKKyAgICAgIGJyZWFrOwogICAgIH0KICAgfQogCiAgIHJldHVybiBwY2VfY29uZmlnOwogfQogCi1pbnQgZ2V0Q2hhbm5lbENvbmZpZyggQ0hBTk5FTF9NT0RFIGNoYW5uZWxfbW9kZSApCi17CitpbnQgZ2V0Q2hhbm5lbENvbmZpZyhjb25zdCBDSEFOTkVMX01PREUgY2hhbm5lbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY2hhbm5lbF9jb25maWdfemVybykgewogICBJTlQgY2hhbl9jb25maWcgPSAwOwogCi0gIHN3aXRjaChjaGFubmVsX21vZGUpIHsKLSAgICBjYXNlIE1PREVfMTogICAgICAgICBjaGFuX2NvbmZpZyA9IDE7IGJyZWFrOwotICAgIGNhc2UgTU9ERV8yOiAgICAgICAgIGNoYW5fY29uZmlnID0gMjsgYnJlYWs7Ci0gICAgY2FzZSBNT0RFXzFfMjogICAgICAgY2hhbl9jb25maWcgPSAzOyBicmVhazsKLSAgICBjYXNlIE1PREVfMV8yXzE6ICAgICBjaGFuX2NvbmZpZyA9IDQ7IGJyZWFrOwotICAgIGNhc2UgTU9ERV8xXzJfMjogICAgIGNoYW5fY29uZmlnID0gNTsgYnJlYWs7Ci0gICAgY2FzZSBNT0RFXzFfMl8yXzE6ICAgY2hhbl9jb25maWcgPSA2OyBicmVhazsKLSAgICBjYXNlIE1PREVfMV8yXzJfMl8xOiBjaGFuX2NvbmZpZyA9IDc7IGJyZWFrOwotCi0gICAgZGVmYXVsdDogICAgICAgICAgICAgY2hhbl9jb25maWcgPSAwOworICBpZiAoY2hhbm5lbF9jb25maWdfemVybyAhPSAwKSB7CisgICAgY2hhbl9jb25maWcgPSAwOworICB9IGVsc2UgeworICAgIHN3aXRjaCAoY2hhbm5lbF9tb2RlKSB7CisgICAgICBjYXNlIE1PREVfMToKKyAgICAgICAgY2hhbl9jb25maWcgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTU9ERV8yOgorICAgICAgICBjaGFuX2NvbmZpZyA9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNT0RFXzFfMjoKKyAgICAgICAgY2hhbl9jb25maWcgPSAzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTU9ERV8xXzJfMToKKyAgICAgICAgY2hhbl9jb25maWcgPSA0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTU9ERV8xXzJfMjoKKyAgICAgICAgY2hhbl9jb25maWcgPSA1OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTU9ERV8xXzJfMl8xOgorICAgICAgICBjaGFuX2NvbmZpZyA9IDY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgICAgICAgY2hhbl9jb25maWcgPSA3OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTU9ERV82XzE6CisgICAgICAgIGNoYW5fY29uZmlnID0gMTE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNT0RFXzdfMV9CQUNLOgorICAgICAgICBjaGFuX2NvbmZpZyA9IDEyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTU9ERV83XzFfVE9QX0ZST05UOgorICAgICAgICBjaGFuX2NvbmZpZyA9IDE0OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNoYW5fY29uZmlnID0gMDsKKyAgICB9CiAgIH0KIAogICByZXR1cm4gY2hhbl9jb25maWc7CiB9CiAKLUNIQU5ORUxfTU9ERSB0cmFuc3BvcnRFbmNfR2V0Q2hhbm5lbE1vZGUoIGludCBub0NoYW5uZWxzICkKLXsKK0NIQU5ORUxfTU9ERSB0cmFuc3BvcnRFbmNfR2V0Q2hhbm5lbE1vZGUoaW50IG5vQ2hhbm5lbHMpIHsKICAgQ0hBTk5FTF9NT0RFIGNoTW9kZTsKIAogICBpZiAobm9DaGFubmVscyA8PSA4ICYmIG5vQ2hhbm5lbHMgPiAwKQotICAgIGNoTW9kZSA9IChDSEFOTkVMX01PREUpKChub0NoYW5uZWxzID09IDgpID8gNyA6IG5vQ2hhbm5lbHMpOyAvKiBzZWUgOiBpc28vbXBlZzQgdjEgYXVkaW8gc3VicGFydDEqLworICAgIGNoTW9kZSA9IChDSEFOTkVMX01PREUpKAorICAgICAgICAobm9DaGFubmVscyA9PSA4KSA/IDcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBub0NoYW5uZWxzKTsgLyogc2VlIDogaXNvL21wZWc0IHYxIGF1ZGlvIHN1YnBhcnQxKi8KICAgZWxzZQogICAgIGNoTW9kZSA9IE1PREVfVU5LTk9XTjsKIAogICByZXR1cm4gY2hNb2RlOwogfQogCi0jaWZkZWYgVFBfUENFX0VOQUJMRQotaW50IHRyYW5zcG9ydEVuY193cml0ZVBDRShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnN0YW5jZVRhZ1BDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhNaXhkb3duQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBzZXVkb1N1cnJvdW5kRW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFsaWduQW5jaG9yKQoteworaW50IHRyYW5zcG9ydEVuY193cml0ZVBDRShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsIGludCBpbnN0YW5jZVRhZ1BDRSwgaW50IHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhNaXhkb3duQSwgaW50IHBzZXVkb1N1cnJvdW5kRW5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFsaWduQW5jaG9yKSB7CiAgIGludCBzYW1wbGVSYXRlSW5kZXgsIGk7Ci0gIGNvbnN0IFBDRV9DT05GSUdVUkFUSU9OKiBjb25maWcgPSBOVUxMOwotICBjb25zdCBNUDRfRUxFTUVOVF9JRCogcEVsX2xpc3QgPSBOVUxMOwotICBVQ0hBUiBjcGVDbnQ9MCwgc2NlQ250PTAsIGxmZUNudD0wOworICBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiAqY29uZmlnID0gTlVMTDsKKyAgY29uc3QgTVA0X0VMRU1FTlRfSUQgKnBFbF9saXN0ID0gTlVMTDsKKyAgVUNIQVIgY3BlQ250ID0gMCwgc2NlQ250ID0gMCwgbGZlQ250ID0gMCwgZnJudENudCA9IDAsIHNkQ250ID0gMCwgYmNrQ250ID0gMCwKKyAgICAgICAgaXNDcGUgPSAwLCB0YWcgPSAwLCBub3JtYWxGcm9udEVuZCA9IDAsIG5vcm1hbFNpZGVFbmQgPSAwLAorICAgICAgICBub3JtYWxCYWNrRW5kID0gMCwgdG9wRnJvbnRFbmQgPSAwLCB0b3BTaWRlRW5kID0gMCwgdG9wQmFja0VuZCA9IDAsCisgICAgICAgIGJvdHRvbUZyb250RW5kID0gMCwgYm90dG9tU2lkZUVuZCA9IDA7CisjaWZkZWYgRkRLX0FTU0VSVF9FTkFCTEUKKyAgVUNIQVIgYm90dG9tQmFja0VuZCA9IDA7CisjZW5kaWYKKyAgZW51bSBlbGVtZW50RGVwdGggeyBGUk9OVCwgU0lERSwgQkFDSyB9IGVsRGVwdGg7CiAKLSAgc2FtcGxlUmF0ZUluZGV4ID0gZ2V0U2FtcGxpbmdSYXRlSW5kZXgoc2FtcGxlUmF0ZSk7CisgIHNhbXBsZVJhdGVJbmRleCA9IGdldFNhbXBsaW5nUmF0ZUluZGV4KHNhbXBsZVJhdGUsIDQpOwogICBpZiAoc2FtcGxlUmF0ZUluZGV4ID09IDE1KSB7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKLSAgaWYgKChjb25maWc9Z2V0UGNlRW50cnkoY2hhbm5lbE1vZGUpKT09TlVMTCkgeworICBpZiAoKGNvbmZpZyA9IGdldFBjZUVudHJ5KGNoYW5uZWxNb2RlKSkgPT0gTlVMTCkgewogICAgIHJldHVybiAtMTsKICAgfQogCi0gIC8qIFBvaW50ZXIgdG8gZmlyc3QgZWxlbWVudCBpbiBlbGVtZW50IGxpc3QuICovCi0gIHBFbF9saXN0ID0gJmNvbmZpZy0+ZWxfbGlzdFswXTsKKyAgRkRLX0FTU0VSVChjb25maWctPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzIDw9IE1BWF9GUk9OVF9FTEVNRU5UUyk7CisgIEZES19BU1NFUlQoY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzIDw9IE1BWF9TSURFX0VMRU1FTlRTKTsKKyAgRkRLX0FTU0VSVChjb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHMgPD0gTUFYX0JBQ0tfRUxFTUVOVFMpOwogCi0gIEZES3dyaXRlQml0cyhoQnMsIGluc3RhbmNlVGFnUENFLCAgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRWxlbWVudCBpbnN0YW5jZSB0YWcgKi8KLSAgRkRLd3JpdGVCaXRzKGhCcywgcHJvZmlsZSwgICAgICAgICAyKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPYmplY3QgdHlwZSAqLwotICBGREt3cml0ZUJpdHMoaEJzLCBzYW1wbGVSYXRlSW5kZXgsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIGluZGV4Ki8KKyAgVUNIQVIgZnJvbnRJc0NwZVtNQVhfRlJPTlRfRUxFTUVOVFNdID0gezB9LAorICAgICAgICBmcm9udFRhZ1tNQVhfRlJPTlRfRUxFTUVOVFNdID0gezB9LCBzaWRlSXNDcGVbTUFYX1NJREVfRUxFTUVOVFNdID0gezB9LAorICAgICAgICBzaWRlVGFnW01BWF9TSURFX0VMRU1FTlRTXSA9IHswfSwgYmFja0lzQ3BlW01BWF9CQUNLX0VMRU1FTlRTXSA9IHswfSwKKyAgICAgICAgYmFja1RhZ1tNQVhfQkFDS19FTEVNRU5UU10gPSB7MH07CiAKLSAgRkRLd3JpdGVCaXRzKGhCcywgY29uZmlnLT5udW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50cywgNCk7ICAgICAvKiBGcm9udCBjaGFubmVsIEVsZW1lbnRzICovCi0gIEZES3dyaXRlQml0cyhoQnMsIGNvbmZpZy0+bnVtX3NpZGVfY2hhbm5lbF9lbGVtZW50cyAsIDQpOyAgICAgLyogTm8gU2lkZSBDaGFubmVsIEVsZW1lbnRzICovCi0gIEZES3dyaXRlQml0cyhoQnMsIGNvbmZpZy0+bnVtX2JhY2tfY2hhbm5lbF9lbGVtZW50cyAsIDQpOyAgICAgLyogTm8gQmFjayBjaGFubmVsIEVsZW1lbnRzICovCi0gIEZES3dyaXRlQml0cyhoQnMsIGNvbmZpZy0+bnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzICAsIDIpOyAgICAgLyogTm8gTGZlIGNoYW5uZWwgZWxlbWVudHMgKi8KKyAgLyogV3JpdGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiAqLwogCi0gIEZES3dyaXRlQml0cyhoQnMsIDAsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gYXNzb2MgZGF0YSBlbGVtZW50cyAqLwotICBGREt3cml0ZUJpdHMoaEJzLCAwLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHZhbGlkIGNjIGVsZW1lbnRzICovCi0gIEZES3dyaXRlQml0cyhoQnMsIDAsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBtaXhkb3duIHByZXNlbnQgKi8KLSAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gbWl4ZG93biBwcmVzZW50ICovCisgIEZES3dyaXRlQml0cyhoQnMsIGluc3RhbmNlVGFnUENFLCA0KTsgIC8qIEVsZW1lbnQgaW5zdGFuY2UgdGFnICovCisgIEZES3dyaXRlQml0cyhoQnMsIHByb2ZpbGUsIDIpOyAgICAgICAgIC8qIE9iamVjdCB0eXBlICovCisgIEZES3dyaXRlQml0cyhoQnMsIHNhbXBsZVJhdGVJbmRleCwgNCk7IC8qIFNhbXBsZSByYXRlIGluZGV4Ki8KIAotICBpZiAoIG1hdHJpeE1peGRvd25BIT0wICYmICgoY2hhbm5lbE1vZGU9PU1PREVfMV8yXzIpfHwoY2hhbm5lbE1vZGU9PU1PREVfMV8yXzJfMSkpICkgewotICAgICAgRkRLd3JpdGVCaXRzKGhCcywgMSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdHJpeCBtaXhkb3duIHByZXNlbnQgKi8KLSAgICAgIEZES3dyaXRlQml0cyhoQnMsIChtYXRyaXhNaXhkb3duQS0xKSYweDMsIDIpOyAgICAgICAgICAgICAvKiBtYXRyaXhfbWl4ZG93bl9pZHggKi8KLSAgICAgIEZES3dyaXRlQml0cyhoQnMsIChwc2V1ZG9TdXJyb3VuZEVuYWJsZSk/MTowLCAxKTsgICAgICAgICAvKiBwc2V1ZG9fc3Vycm91bmRfZW5hYmxlICovCi0gIH0KLSAgZWxzZSB7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJzLCAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF0cml4IG1peGRvd24gbm90IHByZXNlbnQgKi8KKyAgRkRLd3JpdGVCaXRzKGhCcywgY29uZmlnLT5udW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50cywKKyAgICAgICAgICAgICAgIDQpOyAvKiBGcm9udCBjaGFubmVsIEVsZW1lbnRzICovCisgIEZES3dyaXRlQml0cyhoQnMsIGNvbmZpZy0+bnVtX3NpZGVfY2hhbm5lbF9lbGVtZW50cywKKyAgICAgICAgICAgICAgIDQpOyAvKiBObyBTaWRlIENoYW5uZWwgRWxlbWVudHMgKi8KKyAgRkRLd3JpdGVCaXRzKGhCcywgY29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgNCk7IC8qIE5vIEJhY2sgY2hhbm5lbCBFbGVtZW50cyAqLworICBGREt3cml0ZUJpdHMoaEJzLCBjb25maWctPm51bV9sZmVfY2hhbm5lbF9lbGVtZW50cywKKyAgICAgICAgICAgICAgIDIpOyAvKiBObyBMZmUgY2hhbm5lbCBlbGVtZW50cyAqLworCisgIEZES3dyaXRlQml0cyhoQnMsIDAsIDMpOyAvKiBObyBhc3NvYyBkYXRhIGVsZW1lbnRzICovCisgIEZES3dyaXRlQml0cyhoQnMsIDAsIDQpOyAvKiBObyB2YWxpZCBjYyBlbGVtZW50cyAqLworICBGREt3cml0ZUJpdHMoaEJzLCAwLCAxKTsgLyogTW9ubyBtaXhkb3duIHByZXNlbnQgKi8KKyAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMSk7IC8qIFN0ZXJlbyBtaXhkb3duIHByZXNlbnQgKi8KKworICBpZiAobWF0cml4TWl4ZG93bkEgIT0gMCAmJgorICAgICAgKChjaGFubmVsTW9kZSA9PSBNT0RFXzFfMl8yKSB8fCAoY2hhbm5lbE1vZGUgPT0gTU9ERV8xXzJfMl8xKSkpIHsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCAxLCAxKTsgLyogTWF0cml4IG1peGRvd24gcHJlc2VudCAqLworICAgIEZES3dyaXRlQml0cyhoQnMsIChtYXRyaXhNaXhkb3duQSAtIDEpICYgMHgzLCAyKTsgLyogbWF0cml4X21peGRvd25faWR4ICovCisgICAgRkRLd3JpdGVCaXRzKGhCcywgKHBzZXVkb1N1cnJvdW5kRW5hYmxlKSA/IDEgOiAwLAorICAgICAgICAgICAgICAgICAxKTsgLyogcHNldWRvX3N1cnJvdW5kX2VuYWJsZSAqLworICB9IGVsc2UgeworICAgIEZES3dyaXRlQml0cyhoQnMsIDAsIDEpOyAvKiBNYXRyaXggbWl4ZG93biBub3QgcHJlc2VudCAqLwogICB9CiAKLSAgZm9yKGk9MDsgaTxjb25maWctPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzOyBpKyspIHsKLSAgICAgIFVDSEFSIGlzQ3BlID0gKCpwRWxfbGlzdCsrPT1JRF9DUEUpID8gMSA6IDA7Ci0gICAgICBVQ0hBUiB0YWcgICA9IChpc0NwZSkgPyBjcGVDbnQrKyA6IHNjZUNudCsrOwotICAgICAgRkRLd3JpdGVCaXRzKGhCcywgaXNDcGUsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb250IGNoYW5uZWwgRWxlbWVudHMgaXMgQ1BFPyAqLwotICAgICAgRkRLd3JpdGVCaXRzKGhCcywgdGFnLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb250IGNoYW5uZWwgSW5zdGFuY2UgVGFnLiovCisgIGlmIChjb25maWctPnBIZWlnaHRfbnVtICE9IE5VTEwpIHsKKyAgICAvKiB3ZSBoYXZlIHVwIHRvIHRocmVlIGRpZmZlcmVudCBoZWlnaHQgbGV2ZWxzLCBhbmQgaW4gZWFjaCBoZWlnaHQgbGV2ZWwgd2UKKyAgICAgKiBtYXkgaGF2ZSBmcm9udCwgc2lkZSBhbmQgYmFjayBjaGFubmVscy4gV2UgbmVlZCB0byBrbm93IHdoZXJlIGVhY2gKKyAgICAgKiBzZWN0aW9uIGVuZHMgdG8gY29ycmVjdGx5IGNvdW50IHRoZSB0YWdzICovCisgICAgbm9ybWFsRnJvbnRFbmQgPSBjb25maWctPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzIC0KKyAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9mcm9udF9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1swXSAtCisgICAgICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fZnJvbnRfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMV07CisgICAgbm9ybWFsU2lkZUVuZCA9IG5vcm1hbEZyb250RW5kICsgY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzIC0KKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX3NpZGVfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMF0gLQorICAgICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fc2lkZV9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKyAgICBub3JtYWxCYWNrRW5kID0gbm9ybWFsU2lkZUVuZCArIGNvbmZpZy0+bnVtX2JhY2tfY2hhbm5lbF9lbGVtZW50cyAtCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9iYWNrX2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzBdIC0KKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX2JhY2tfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMV07CisKKyAgICB0b3BGcm9udEVuZCA9CisgICAgICAgIG5vcm1hbEJhY2tFbmQgKyBjb25maWctPm51bV9sZmVfY2hhbm5lbF9lbGVtZW50cyArCisgICAgICAgIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9mcm9udF9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1swXTsgLyogb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExGRXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWVkICovCisgICAgdG9wU2lkZUVuZCA9CisgICAgICAgIHRvcEZyb250RW5kICsgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX3NpZGVfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMF07CisgICAgdG9wQmFja0VuZCA9CisgICAgICAgIHRvcFNpZGVFbmQgKyBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fYmFja19oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1swXTsKKworICAgIGJvdHRvbUZyb250RW5kID0KKyAgICAgICAgdG9wQmFja0VuZCArIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9mcm9udF9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKyAgICBib3R0b21TaWRlRW5kID0gYm90dG9tRnJvbnRFbmQgKworICAgICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fc2lkZV9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKyNpZmRlZiBGREtfQVNTRVJUX0VOQUJMRQorICAgIGJvdHRvbUJhY2tFbmQgPSBib3R0b21TaWRlRW5kICsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX2JhY2tfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMV07CisjZW5kaWYKKworICB9IGVsc2UgeworICAgIC8qIHdlIGhhdmUgb25seSBvbmUgaGVpZ2h0IGxldmVsLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRvcCBvciBib3R0b20gKi8KKyAgICBub3JtYWxGcm9udEVuZCA9IGNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHM7CisgICAgbm9ybWFsU2lkZUVuZCA9IG5vcm1hbEZyb250RW5kICsgY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzOworICAgIG5vcm1hbEJhY2tFbmQgPSBub3JtYWxTaWRlRW5kICsgY29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzOwogICB9Ci0gIGZvcihpPTA7IGk8Y29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzOyBpKyspIHsKLSAgICAgIFVDSEFSIGlzQ3BlID0gKCpwRWxfbGlzdCsrPT1JRF9DUEUpID8gMSA6IDA7Ci0gICAgICBVQ0hBUiB0YWcgICA9IChpc0NwZSkgPyBjcGVDbnQrKyA6IHNjZUNudCsrOwotICAgICAgRkRLd3JpdGVCaXRzKGhCcywgaXNDcGUsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb250IGNoYW5uZWwgRWxlbWVudHMgaXMgQ1BFPyAqLwotICAgICAgRkRLd3JpdGVCaXRzKGhCcywgdGFnLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb250IGNoYW5uZWwgSW5zdGFuY2UgVGFnLiovCisKKyAgLyogYXNzaWduIGNwZSBhbmQgdGFnIGluZm9ybWF0aW9uIHRvIGVpdGhlciBmcm9udCwgc2lkZSBvciBiYWNrIGNoYW5uZWxzICovCisKKyAgcEVsX2xpc3QgPSBjb25maWctPnBFbF90eXBlOworCisgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzICsKKyAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHMgKworICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bnVtX2JhY2tfY2hhbm5lbF9lbGVtZW50cyArCisgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5udW1fbGZlX2NoYW5uZWxfZWxlbWVudHM7CisgICAgICAgaSsrKSB7CisgICAgaWYgKCpwRWxfbGlzdCA9PSBJRF9MRkUpIHsKKyAgICAgIHBFbF9saXN0Kys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaXNDcGUgPSAoKnBFbF9saXN0KysgPT0gSURfQ1BFKSA/IDEgOiAwOworICAgIHRhZyA9IChpc0NwZSkgPyBjcGVDbnQrKyA6IHNjZUNudCsrOworCisgICAgaWYgKGkgPCBub3JtYWxGcm9udEVuZCkKKyAgICAgIGVsRGVwdGggPSBGUk9OVDsKKyAgICBlbHNlIGlmIChpIDwgbm9ybWFsU2lkZUVuZCkKKyAgICAgIGVsRGVwdGggPSBTSURFOworICAgIGVsc2UgaWYgKGkgPCBub3JtYWxCYWNrRW5kKQorICAgICAgZWxEZXB0aCA9IEJBQ0s7CisgICAgZWxzZSBpZiAoaSA8IHRvcEZyb250RW5kKQorICAgICAgZWxEZXB0aCA9IEZST05UOworICAgIGVsc2UgaWYgKGkgPCB0b3BTaWRlRW5kKQorICAgICAgZWxEZXB0aCA9IFNJREU7CisgICAgZWxzZSBpZiAoaSA8IHRvcEJhY2tFbmQpCisgICAgICBlbERlcHRoID0gQkFDSzsKKyAgICBlbHNlIGlmIChpIDwgYm90dG9tRnJvbnRFbmQpCisgICAgICBlbERlcHRoID0gRlJPTlQ7CisgICAgZWxzZSBpZiAoaSA8IGJvdHRvbVNpZGVFbmQpCisgICAgICBlbERlcHRoID0gU0lERTsKKyAgICBlbHNlIHsKKyAgICAgIGVsRGVwdGggPSBCQUNLOworICAgICAgRkRLX0FTU0VSVChpIDwgYm90dG9tQmFja0VuZCk7IC8qIHdvbid0IGZhaWwgaWYgaW1wbGVtZW50YXRpb24gb2YgcGNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiB0YWJsZSBpcyBjb3JyZWN0ICovCisgICAgfQorCisgICAgc3dpdGNoIChlbERlcHRoKSB7CisgICAgICBjYXNlIEZST05UOgorICAgICAgICBGREtfQVNTRVJUKGZybnRDbnQgPCBjb25maWctPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzKTsKKyAgICAgICAgZnJvbnRJc0NwZVtmcm50Q250XSA9IGlzQ3BlOworICAgICAgICBmcm9udFRhZ1tmcm50Q250KytdID0gdGFnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0lERToKKyAgICAgICAgRkRLX0FTU0VSVChzZENudCA8IGNvbmZpZy0+bnVtX3NpZGVfY2hhbm5lbF9lbGVtZW50cyk7CisgICAgICAgIHNpZGVJc0NwZVtzZENudF0gPSBpc0NwZTsKKyAgICAgICAgc2lkZVRhZ1tzZENudCsrXSA9IHRhZzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJBQ0s6CisgICAgICAgIEZES19BU1NFUlQoYmNrQ250IDwgY29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzKTsKKyAgICAgICAgYmFja0lzQ3BlW2Jja0NudF0gPSBpc0NwZTsKKyAgICAgICAgYmFja1RhZ1tiY2tDbnQrK10gPSB0YWc7CisgICAgICAgIGJyZWFrOworICAgIH0KICAgfQotICBmb3IoaT0wOyBpPGNvbmZpZy0+bnVtX2JhY2tfY2hhbm5lbF9lbGVtZW50czsgaSsrKSB7Ci0gICAgICBVQ0hBUiBpc0NwZSA9ICgqcEVsX2xpc3QrKz09SURfQ1BFKSA/IDEgOiAwOwotICAgICAgVUNIQVIgdGFnICAgPSAoaXNDcGUpID8gY3BlQ250KysgOiBzY2VDbnQrKzsKLSAgICAgIEZES3dyaXRlQml0cyhoQnMsIGlzQ3BlLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9udCBjaGFubmVsIEVsZW1lbnRzIGlzIENQRT8gKi8KLSAgICAgIEZES3dyaXRlQml0cyhoQnMsIHRhZywgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9udCBjaGFubmVsIEluc3RhbmNlIFRhZy4qLworCisgIC8qIFdyaXRlIGZyb250IGNoYW5uZWwgaXNDcGUgYW5kIHRhZ3MgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHM7IGkrKykgeworICAgIEZES3dyaXRlQml0cyhoQnMsIGZyb250SXNDcGVbaV0sIDEpOworICAgIEZES3dyaXRlQml0cyhoQnMsIGZyb250VGFnW2ldLCA0KTsKICAgfQotICBmb3IoaT0wOyBpPGNvbmZpZy0+bnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzOyBpKyspIHsKLSAgICAgIEZES3dyaXRlQml0cyhoQnMsIGxmZUNudCsrLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMRkUgY2hhbm5lbCBJbnN0YW5jZSBUYWcuICovCisgIC8qIFdyaXRlIHNpZGUgY2hhbm5lbCBpc0NwZSBhbmQgdGFncyAqLworICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzOyBpKyspIHsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCBzaWRlSXNDcGVbaV0sIDEpOworICAgIEZES3dyaXRlQml0cyhoQnMsIHNpZGVUYWdbaV0sIDQpOworICB9CisgIC8qIFdyaXRlIGJhY2sgY2hhbm5lbCBpc0NwZSBhbmQgdGFncyAqLworICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzOyBpKyspIHsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCBiYWNrSXNDcGVbaV0sIDEpOworICAgIEZES3dyaXRlQml0cyhoQnMsIGJhY2tUYWdbaV0sIDQpOworICB9CisgIC8qIFdyaXRlIExGRSBpbmZvcm1hdGlvbiAqLworICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5udW1fbGZlX2NoYW5uZWxfZWxlbWVudHM7IGkrKykgeworICAgIEZES3dyaXRlQml0cyhoQnMsIGxmZUNudCsrLCA0KTsgLyogTEZFIGNoYW5uZWwgSW5zdGFuY2UgVGFnLiAqLwogICB9CiAKICAgLyogLSBudW1fdmFsaWRfY2NfZWxlbWVudHMgYWx3YXlzIDAuCkBAIC0yOTQsMTY3ICs1MzUsMzQ4IEBACiAgICAgICAgQURUUzogYWxpZ24gd2l0aCByZXNwZWN0IHRvIHRoZSBmaXJzdCBiaXQgb2YgdGhlIHJhd19kYXRhX2Jsb2NrKCkKICAgICAgICBBRElGOiBhbGlnbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGZpcnN0IGJpdCBvZiB0aGUgaGVhZGVyCiAgICAgICAgTEFUTTogYWxpZ24gd2l0aCByZXNwZWN0IHRvIHRoZSBmaXJzdCBiaXQgb2YgdGhlIEFTQyAqLwotICBGREtieXRlQWxpZ24oaEJzLCBhbGlnbkFuY2hvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsaWdubWVudCAqLworICBGREtieXRlQWxpZ24oaEJzLCBhbGlnbkFuY2hvcik7IC8qIEFsaWdubWVudCAqLwogCi0gIEZES3dyaXRlQml0cyhoQnMsIDAgLDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG8gbm8gd3JpdGUgYW55IGNvbW1lbnQuICovCisgIC8qIFdyaXRlIGNvbW1lbnQgaW5mb3JtYXRpb24gKi8KIAotICAvKiAtIGNvbW1lbnRfZmllbGRfYnl0ZXMgYWx3YXlzIDAuICovCisgIGlmIChjb25maWctPnBIZWlnaHRfbnVtICE9IE5VTEwpIHsKKyAgICAvKiBlbWJlZCBoZWlnaHQgaW5mb3JtYXRpb24gaW4gY29tbWVudCBmaWVsZCAqLworCisgICAgSU5UIGNvbW1lbnRCeXRlcyA9CisgICAgICAgIDEgLyogUENFX0hFSUdIVF9FWFRfU1lOQyAqLworICAgICAgICArICgoKChjb25maWctPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzICsKKyAgICAgICAgICAgICAgY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzICsKKyAgICAgICAgICAgICAgY29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzKQorICAgICAgICAgICAgIDw8IDEpICsKKyAgICAgICAgICAgIDcpID4+CisgICAgICAgICAgIDMpIC8qIDIgYml0IGhlaWdodCBpbmZvIHBlciBlbGVtZW50LCByb3VuZCB1cCB0byBmdWxsIGJ5dGVzICovCisgICAgICAgICsgMTsgIC8qIENSQyAqLworCisgICAgRkRLd3JpdGVCaXRzKGhCcywgY29tbWVudEJ5dGVzLCA4KTsgLyogY29tbWVudCBzaXplLiAqLworCisgICAgRkRLX0NSQ0lORk8gY3JjSW5mbzsgLyogQ1JDIHN0YXRlIGluZm8gKi8KKyAgICBJTlQgY3JjUmVnOworCisgICAgRkRLY3JjSW5pdCgmY3JjSW5mbywgMHgwNywgMHhGRiwgOCk7CisgICAgY3JjUmVnID0gRkRLY3JjU3RhcnRSZWcoJmNyY0luZm8sIGhCcywgMCk7CisKKyAgICBGREt3cml0ZUJpdHMoaEJzLCBQQ0VfSEVJR0hUX0VYVF9TWU5DLCA4KTsgLyogaW5kaWNhdGUgaGVpZ2h0IGV4dGVuc2lvbiAqLworCisgICAgLyogZnJvbnQgY2hhbm5lbCBoZWlnaHQgaW5mb3JtYXRpb24gKi8KKyAgICBmb3IgKGkgPSAwOworICAgICAgICAgaSA8IGNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHMgLQorICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fZnJvbnRfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMF0gLQorICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fZnJvbnRfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMV07CisgICAgICAgICBpKyspCisgICAgICBGREt3cml0ZUJpdHMoaEJzLCBIRUlHSFRfTk9STUFMLCAyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX2Zyb250X2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzBdOworICAgICAgICAgaSsrKQorICAgICAgRkRLd3JpdGVCaXRzKGhCcywgSEVJR0hUX1RPUCwgMik7CisgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9mcm9udF9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKyAgICAgICAgIGkrKykKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIEhFSUdIVF9CT1RUT00sIDIpOworCisgICAgLyogc2lkZSBjaGFubmVsIGhlaWdodCBpbmZvcm1hdGlvbiAqLworICAgIGZvciAoaSA9IDA7CisgICAgICAgICBpIDwgY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzIC0KKyAgICAgICAgICAgICAgICAgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX3NpZGVfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMF0gLQorICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fc2lkZV9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKyAgICAgICAgIGkrKykKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIEhFSUdIVF9OT1JNQUwsIDIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fc2lkZV9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1swXTsKKyAgICAgICAgIGkrKykKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIEhFSUdIVF9UT1AsIDIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fc2lkZV9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKyAgICAgICAgIGkrKykKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIEhFSUdIVF9CT1RUT00sIDIpOworCisgICAgLyogYmFjayBjaGFubmVsIGhlaWdodCBpbmZvcm1hdGlvbiAqLworICAgIGZvciAoaSA9IDA7CisgICAgICAgICBpIDwgY29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzIC0KKyAgICAgICAgICAgICAgICAgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX2JhY2tfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMF0gLQorICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fYmFja19oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKyAgICAgICAgIGkrKykKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIEhFSUdIVF9OT1JNQUwsIDIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fYmFja19oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1swXTsKKyAgICAgICAgIGkrKykKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIEhFSUdIVF9UT1AsIDIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fYmFja19oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKyAgICAgICAgIGkrKykKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIEhFSUdIVF9CT1RUT00sIDIpOworCisgICAgRkRLYnl0ZUFsaWduKGhCcywgYWxpZ25BbmNob3IpOyAvKiBBbGlnbm1lbnQgKi8KKworICAgIEZES2NyY0VuZFJlZygmY3JjSW5mbywgaEJzLCBjcmNSZWcpOworICAgIEZES3dyaXRlQml0cyhoQnMsIEZES2NyY0dldENSQygmY3JjSW5mbyksIDgpOworCisgIH0gZWxzZSB7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgMCwKKyAgICAgICAgICAgICAgICAgOCk7IC8qIERvIG5vIHdyaXRlIGFueSBjb21tZW50IG9yIGhlaWdodCBpbmZvcm1hdGlvbi4gKi8KKyAgfQogCiAgIHJldHVybiAwOwogfQogCi1pbnQgdHJhbnNwb3J0RW5jX0dldFBDRUJpdHMoQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhNaXhkb3duQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cykKLXsKLSAgY29uc3QgUENFX0NPTkZJR1VSQVRJT04qIGNvbmZpZyA9IE5VTEw7CitpbnQgdHJhbnNwb3J0RW5jX0dldFBDRUJpdHMoQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLCBpbnQgbWF0cml4TWl4ZG93bkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMpIHsKKyAgY29uc3QgUENFX0NPTkZJR1VSQVRJT04gKmNvbmZpZyA9IE5VTEw7CiAKLSAgaWYgKChjb25maWc9Z2V0UGNlRW50cnkoY2hhbm5lbE1vZGUpKT09TlVMTCkgewotICAgIHJldHVybiAtMTsgIC8qIHVuc3VwcG9ydGVkIGNoYW5uZWxtYXBwaW5nICovCisgIGlmICgoY29uZmlnID0gZ2V0UGNlRW50cnkoY2hhbm5lbE1vZGUpKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOyAvKiB1bnN1cHBvcnRlZCBjaGFubmVsbWFwcGluZyAqLwogICB9CiAKLSAgYml0cyArPSA0ICsgMiArIDQ7ICAgICAgICAvKiBFbGVtZW50IGluc3RhbmNlIHRhZyAgKyBPYmplY3QgdHlwZSArIFNhbXBsZSByYXRlIGluZGV4ICovCi0gIGJpdHMgKz0gNCArIDQgKyA0ICsgMjsgICAgLyogTm8gKGZyb250ICsgc2lkZSArIGJhY2sgKyBsZmUgY2hhbm5lbCkgZWxlbWVudHMgKi8KLSAgYml0cyArPSAzICsgNDsgICAgICAgICAgICAvKiBObyAoYXNzb2MgZGF0YSArIHZhbGlkIGNjKSBlbGVtZW50cyAqLwotICBiaXRzICs9IDEgKyAxICsgMSA7ICAgICAgIC8qIE1vbm8gKyBTdGVyZW8gKyBNYXRyaXggbWl4ZG93biBwcmVzZW50ICovCisgIGJpdHMgKz0KKyAgICAgIDQgKyAyICsgNDsgLyogRWxlbWVudCBpbnN0YW5jZSB0YWcgICsgT2JqZWN0IHR5cGUgKyBTYW1wbGUgcmF0ZSBpbmRleCAqLworICBiaXRzICs9IDQgKyA0ICsgNCArIDI7IC8qIE5vIChmcm9udCArIHNpZGUgKyBiYWNrICsgbGZlIGNoYW5uZWwpIGVsZW1lbnRzICovCisgIGJpdHMgKz0gMyArIDQ7ICAgICAgICAgLyogTm8gKGFzc29jIGRhdGEgKyB2YWxpZCBjYykgZWxlbWVudHMgKi8KKyAgYml0cyArPSAxICsgMSArIDE7ICAgICAvKiBNb25vICsgU3RlcmVvICsgTWF0cml4IG1peGRvd24gcHJlc2VudCAqLwogCi0gIGlmICggbWF0cml4TWl4ZG93bkEhPTAgJiYgKChjaGFubmVsTW9kZT09TU9ERV8xXzJfMil8fChjaGFubmVsTW9kZT09TU9ERV8xXzJfMl8xKSkgKSB7Ci0gICAgYml0cyArPTM7ICAgICAgICAgICAgICAgLyogbWF0cml4X21peGRvd25faWR4ICsgcHNldWRvX3N1cnJvdW5kX2VuYWJsZSAqLworICBpZiAobWF0cml4TWl4ZG93bkEgIT0gMCAmJgorICAgICAgKChjaGFubmVsTW9kZSA9PSBNT0RFXzFfMl8yKSB8fCAoY2hhbm5lbE1vZGUgPT0gTU9ERV8xXzJfMl8xKSkpIHsKKyAgICBiaXRzICs9IDM7IC8qIG1hdHJpeF9taXhkb3duX2lkeCArIHBzZXVkb19zdXJyb3VuZF9lbmFibGUgKi8KICAgfQogCi0gIGJpdHMgKz0gKDErNCkgKiAoSU5UKWNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHM7Ci0gIGJpdHMgKz0gKDErNCkgKiAoSU5UKWNvbmZpZy0+bnVtX3NpZGVfY2hhbm5lbF9lbGVtZW50czsKLSAgYml0cyArPSAoMSs0KSAqIChJTlQpY29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzOwotICBiaXRzICs9ICAgKDQpICogKElOVCljb25maWctPm51bV9sZmVfY2hhbm5lbF9lbGVtZW50czsKKyAgYml0cyArPSAoMSArIDQpICogKElOVCljb25maWctPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzOworICBiaXRzICs9ICgxICsgNCkgKiAoSU5UKWNvbmZpZy0+bnVtX3NpZGVfY2hhbm5lbF9lbGVtZW50czsKKyAgYml0cyArPSAoMSArIDQpICogKElOVCljb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHM7CisgIGJpdHMgKz0gKDQpICogKElOVCljb25maWctPm51bV9sZmVfY2hhbm5lbF9lbGVtZW50czsKIAogICAvKiAtIG51bV92YWxpZF9jY19lbGVtZW50cyBhbHdheXMgMC4KICAgICAgLSBudW1fYXNzb2NfZGF0YV9lbGVtZW50cyBhbHdheXMgMC4gKi8KIAotICBpZiAoKGJpdHMlOCkgIT0gMCkgewotICAgIGJpdHMgKz0gKDggLSAoYml0cyU4KSk7IC8qIEFsaWdubWVudCAqLworICBpZiAoKGJpdHMgJSA4KSAhPSAwKSB7CisgICAgYml0cyArPSAoOCAtIChiaXRzICUgOCkpOyAvKiBBbGlnbm1lbnQgKi8KICAgfQogCi0gIGJpdHMgKz0gODsgICAgICAgICAgICAgICAgLyogQ29tbWVudCBmaWVsZCAgYnl0ZXMgKi8KKyAgYml0cyArPSA4OyAvKiBDb21tZW50IGZpZWxkICBieXRlcyAqLwogCi0gIC8qIC0gY29tbWVudF9maWVsZF9ieXRlcyBhbHd5cyAwLiAqLworICBpZiAoY29uZmlnLT5wSGVpZ2h0X251bSAhPSBOVUxMKSB7CisgICAgLyogQ29tbWVudCBmaWVsZCAoaGVpZ2h0IGV4dGVuc2lvbikgKi8KKworICAgIGJpdHMgKz0KKyAgICAgICAgOCAvKiBQQ0VfSEVJR0hUX0VYVF9TWU5DICovCisgICAgICAgICsKKyAgICAgICAgKChjb25maWctPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzICsKKyAgICAgICAgICBjb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHMgKyBjb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHMpCisgICAgICAgICA8PCAxKSAvKiAyIGJpdCBoZWlnaHQgaW5mbyBwZXIgZWxlbWVudCAqLworICAgICAgICArIDg7ICAgLyogQ1JDICovCisKKyAgICBpZiAoKGJpdHMgJSA4KSAhPSAwKSB7CisgICAgICBiaXRzICs9ICg4IC0gKGJpdHMgJSA4KSk7IC8qIEFsaWdubWVudCAqLworICAgIH0KKyAgfQogCiAgIHJldHVybiBiaXRzOwogfQotI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KIAotc3RhdGljIHZvaWQgd3JpdGVBb3QoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbUJ1ZmZlciwgQVVESU9fT0JKRUNUX1RZUEUgYW90KQotewotICAgIGludCB0bXAgPSAoaW50KSBhb3Q7CitzdGF0aWMgdm9pZCB3cml0ZUFvdChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90KSB7CisgIGludCB0bXAgPSAoaW50KWFvdDsKIAotICAgIGlmICh0bXAgPiAzMSkgewotICAgICAgICBGREt3cml0ZUJpdHMoIGhCaXRzdHJlYW1CdWZmZXIsIEFPVF9FU0NBUEUsIDUgKTsKLSAgICAgICAgRkRLd3JpdGVCaXRzKCBoQml0c3RyZWFtQnVmZmVyLCB0bXAtMzIsIDYgKTsgICAvKiBBdWRpb09iamVjdFR5cGUgKi8KLSAgICB9IGVsc2UgewotICAgICAgICBGREt3cml0ZUJpdHMoIGhCaXRzdHJlYW1CdWZmZXIsIHRtcCwgNSApOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgd3JpdGVTYW1wbGVSYXRlKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW1CdWZmZXIsIGludCBzYW1wbGVSYXRlKQotewotICBpbnQgc2FtcGxlUmF0ZUluZGV4ID0gZ2V0U2FtcGxpbmdSYXRlSW5kZXgoc2FtcGxlUmF0ZSk7Ci0KLSAgRkRLd3JpdGVCaXRzKCBoQml0c3RyZWFtQnVmZmVyLCBzYW1wbGVSYXRlSW5kZXgsIDQgKTsKLSAgaWYoIHNhbXBsZVJhdGVJbmRleCA9PSAxNSApIHsKLSAgICBGREt3cml0ZUJpdHMoIGhCaXRzdHJlYW1CdWZmZXIsIHNhbXBsZVJhdGUsIDI0ICk7CisgIGlmICh0bXAgPiAzMSkgeworICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtQnVmZmVyLCBBT1RfRVNDQVBFLCA1KTsKKyAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbUJ1ZmZlciwgdG1wIC0gMzIsIDYpOyAvKiBBdWRpb09iamVjdFR5cGUgKi8KKyAgfSBlbHNlIHsKKyAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbUJ1ZmZlciwgdG1wLCA1KTsKICAgfQogfQogCi0jaWZkZWYgVFBfR0FfRU5BQkxFCi1zdGF0aWMKLWludCB0cmFuc3BvcnRFbmNfd3JpdGVHQVNwZWNpZmljQ29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGFzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgZXh0RmxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICBhbGlnbkFuY2hvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworc3RhdGljIHZvaWQgd3JpdGVTYW1wbGVSYXRlKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5CaXRzKSB7CisgIGludCBzcklkeCA9IGdldFNhbXBsaW5nUmF0ZUluZGV4KHNhbXBsZVJhdGUsIG5CaXRzKTsKKworICBGREt3cml0ZUJpdHMoaEJzLCBzcklkeCwgbkJpdHMpOworICBpZiAoc3JJZHggPT0gKDEgPDwgbkJpdHMpIC0gMSkgeworICAgIEZES3dyaXRlQml0cyhoQnMsIHNhbXBsZVJhdGUsIDI0KTsKKyAgfQorfQorCitzdGF0aWMgaW50IHRyYW5zcG9ydEVuY193cml0ZUdBU3BlY2lmaWNDb25maWcoSEFORExFX0ZES19CSVRTVFJFQU0gYXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAqY29uZmlnLCBpbnQgZXh0RmxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYWxpZ25BbmNob3IpIHsKICAgaW50IGFvdCA9IGNvbmZpZy0+YW90OwogICBpbnQgc2FtcGxlc1BlckZyYW1lID0gY29uZmlnLT5zYW1wbGVzUGVyRnJhbWU7CiAKICAgLyogc3RhcnQgb2YgR0FTcGVjaWZpY0NvbmZpZyBhY2NvcmRpbmcgdG8gSVNPL0lFQyAxNDQ5Ni0zIFN1YnBhcnQgNCwgNC40LjEgKi8KLSAgRkRLd3JpdGVCaXRzKCBhc2MsICgoc2FtcGxlc1BlckZyYW1lPT05NjAgfHwgc2FtcGxlc1BlckZyYW1lPT00ODApPzE6MCksIDEpOyAgLyogZnJhbWVMZW5ndGhGbGFnOiAxIGZvciBhIDk2MC80ODAgKEkpTURDVCwgMCBmb3IgYSAxMDI0LzUxMiAoSSlNRENUKi8KLSAgRkRLd3JpdGVCaXRzKCBhc2MsIDAsIDEpOyAgLyogZGVwZW5kc09uQ29yZUNvZGVyOiBTYW1wbGluZyBSYXRlIENvZGVyIFNwZWNpZmljLCBzZWUgaW4gSVNPL0lFQyAxNDQ5Ni0zIFN1YnBhcnQgNCwgNC40LjEgKi8KLSAgRkRLd3JpdGVCaXRzKCBhc2MsIGV4dEZsZywgMSApOyAvKiBFeHRlbnNpb24gRmxhZzogU2hhbGwgYmUgMSBmb3IgYW90ID0gMTcsMTksMjAsMjEsMjIsMjMgKi8KKyAgRkRLd3JpdGVCaXRzKGFzYywKKyAgICAgICAgICAgICAgICgoc2FtcGxlc1BlckZyYW1lID09IDk2MCB8fCBzYW1wbGVzUGVyRnJhbWUgPT0gNDgwKSA/IDEgOiAwKSwKKyAgICAgICAgICAgICAgIDEpOyAvKiBmcmFtZUxlbmd0aEZsYWc6IDEgZm9yIGEgOTYwLzQ4MCAoSSlNRENULCAwIGZvciBhIDEwMjQvNTEyCisgICAgICAgICAgICAgICAgICAgICAgKEkpTURDVCovCisgIEZES3dyaXRlQml0cyhhc2MsIDAsCisgICAgICAgICAgICAgICAxKTsgLyogZGVwZW5kc09uQ29yZUNvZGVyOiBTYW1wbGluZyBSYXRlIENvZGVyIFNwZWNpZmljLCBzZWUgaW4KKyAgICAgICAgICAgICAgICAgICAgICBJU08vSUVDIDE0NDk2LTMgU3VicGFydCA0LCA0LjQuMSAqLworICBGREt3cml0ZUJpdHMoYXNjLCBleHRGbGcsCisgICAgICAgICAgICAgICAxKTsgLyogRXh0ZW5zaW9uIEZsYWc6IFNoYWxsIGJlIDEgZm9yIGFvdCA9IDE3LDE5LDIwLDIxLDIyLDIzICovCiAKICAgLyogV3JpdGUgUENFIGlmIGNoYW5uZWwgY29uZmlnIGlzIG5vdCAxLTcgKi8KLSAgaWYgKGdldENoYW5uZWxDb25maWcoY29uZmlnLT5jaGFubmVsTW9kZSkgPT0gMCkgewotICAgICAgdHJhbnNwb3J0RW5jX3dyaXRlUENFKGFzYywgY29uZmlnLT5jaGFubmVsTW9kZSwgY29uZmlnLT5zYW1wbGluZ1JhdGUsIDAsIDEsIGNvbmZpZy0+bWF0cml4TWl4ZG93bkEsIChjb25maWctPmZsYWdzJkNDX1BTRVVET19TVVJST1VORCk/MTowLCBhbGlnbkFuY2hvcik7CisgIGlmIChnZXRDaGFubmVsQ29uZmlnKGNvbmZpZy0+Y2hhbm5lbE1vZGUsIGNvbmZpZy0+Y2hhbm5lbENvbmZpZ1plcm8pID09IDApIHsKKyAgICB0cmFuc3BvcnRFbmNfd3JpdGVQQ0UoYXNjLCBjb25maWctPmNoYW5uZWxNb2RlLCBjb25maWctPnNhbXBsaW5nUmF0ZSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tYXRyaXhNaXhkb3duQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19QU0VVRE9fU1VSUk9VTkQpID8gMSA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduQW5jaG9yKTsKKyAgfQorICBpZiAoKGFvdCA9PSBBT1RfQUFDX1NDQUwpIHx8IChhb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSkgeworICAgIEZES3dyaXRlQml0cyhhc2MsIDAsIDMpOyAvKiBsYXllck5yICovCiAgIH0KICAgaWYgKGV4dEZsZykgewogICAgIGlmIChhb3QgPT0gQU9UX0VSX0JTQUMpIHsKLSAgICAgIEZES3dyaXRlQml0cyggYXNjLCBjb25maWctPkJTQUNudW1PZlN1YkZyYW1lLCA1ICk7IC8qIG51bU9mU3ViRnJhbWUgKi8KLSAgICAgIEZES3dyaXRlQml0cyggYXNjLCBjb25maWctPkJTQUNsYXllckxlbmd0aCwgMTEgKTsgIC8qIGxheWVyX2xlbmd0aCAqLworICAgICAgRkRLd3JpdGVCaXRzKGFzYywgY29uZmlnLT5CU0FDbnVtT2ZTdWJGcmFtZSwgNSk7IC8qIG51bU9mU3ViRnJhbWUgKi8KKyAgICAgIEZES3dyaXRlQml0cyhhc2MsIGNvbmZpZy0+QlNBQ2xheWVyTGVuZ3RoLCAxMSk7ICAvKiBsYXllcl9sZW5ndGggKi8KICAgICB9Ci0gICAgaWYgKChhb3QgPT0gQU9UX0VSX0FBQ19MQykgICB8fCAoYW90ID09IEFPVF9FUl9BQUNfTFRQKSAgfHwKLSAgICAgICAgKGFvdCA9PSBBT1RfRVJfQUFDX1NDQUwpIHx8IChhb3QgPT0gQU9UX0VSX0FBQ19MRCkpCi0gICAgewotICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIChjb25maWctPmZsYWdzICYgQ0NfVkNCMTEpID8gMSA6IDAsIDEgKTsgLyogYWFjU2VjdGlvbkRhdGFSZXNpbGxpZW5jZUZsYWcgKi8KLSAgICAgIEZES3dyaXRlQml0cyggYXNjLCAoY29uZmlnLT5mbGFncyAmIENDX1JWTEMpID8gMSA6IDAsICAxICk7IC8qIGFhY1NjYWxlRmFjdG9yRGF0YVJlc2lsbGllbmNlRmxhZyAqLwotICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIChjb25maWctPmZsYWdzICYgQ0NfSENSKSA/IDEgOiAwLCAgIDEgKTsgLyogYWFjU3BlY3RyYWxEYXRhUmVzaWxsaWVuY2VGbGFnICovCisgICAgaWYgKChhb3QgPT0gQU9UX0VSX0FBQ19MQykgfHwgKGFvdCA9PSBBT1RfRVJfQUFDX0xUUCkgfHwKKyAgICAgICAgKGFvdCA9PSBBT1RfRVJfQUFDX1NDQUwpIHx8IChhb3QgPT0gQU9UX0VSX0FBQ19MRCkpIHsKKyAgICAgIEZES3dyaXRlQml0cyhhc2MsIChjb25maWctPmZsYWdzICYgQ0NfVkNCMTEpID8gMSA6IDAsCisgICAgICAgICAgICAgICAgICAgMSk7IC8qIGFhY1NlY3Rpb25EYXRhUmVzaWxsaWVuY2VGbGFnICovCisgICAgICBGREt3cml0ZUJpdHMoYXNjLCAoY29uZmlnLT5mbGFncyAmIENDX1JWTEMpID8gMSA6IDAsCisgICAgICAgICAgICAgICAgICAgMSk7IC8qIGFhY1NjYWxlRmFjdG9yRGF0YVJlc2lsbGllbmNlRmxhZyAqLworICAgICAgRkRLd3JpdGVCaXRzKGFzYywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19IQ1IpID8gMSA6IDAsCisgICAgICAgICAgICAgICAgICAgMSk7IC8qIGFhY1NwZWN0cmFsRGF0YVJlc2lsbGllbmNlRmxhZyAqLwogICAgIH0KLSAgICBGREt3cml0ZUJpdHMoIGFzYywgMCwgMSApOyAvKiBleHRlbnNpb25GbGFnMzogcmVzZXJ2ZWQuIFNoYWxsIGJlICcwJyAqLworICAgIEZES3dyaXRlQml0cyhhc2MsIDAsIDEpOyAvKiBleHRlbnNpb25GbGFnMzogcmVzZXJ2ZWQuIFNoYWxsIGJlICcwJyAqLwogICB9CiAgIHJldHVybiAwOwogfQotI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLwogCi0jaWZkZWYgVFBfRUxEX0VOQUJMRQotCi1zdGF0aWMKLWludCB0cmFuc3BvcnRFbmNfd3JpdGVFTERTcGVjaWZpY0NvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBlcENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIC8qIEVMRCBzcGVjaWZpYyBjb25maWcgKi8KLSAgaWYgKGNvbmZpZy0+Y2hhbm5lbE1vZGUgPT0gTU9ERV8xXzEpIHsKLSAgICByZXR1cm4gLTE7CitzdGF0aWMgaW50IHRyYW5zcG9ydEVuY193cml0ZUVMRFNwZWNpZmljQ29uZmlnKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERVJfQ09ORklHICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IpIHsKKyAgVUlOVCBmcmFtZUxlbmd0aEZsYWcgPSAwOworICBzd2l0Y2ggKGNvbmZpZy0+c2FtcGxlc1BlckZyYW1lKSB7CisgICAgY2FzZSA1MTI6CisgICAgY2FzZSAyNTY6CisgICAgY2FzZSAxMjg6CisgICAgY2FzZSA2NDoKKyAgICAgIGZyYW1lTGVuZ3RoRmxhZyA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDoKKyAgICBjYXNlIDI0MDoKKyAgICBjYXNlIDE2MDoKKyAgICBjYXNlIDEyMDoKKyAgICBjYXNlIDYwOgorICAgICAgZnJhbWVMZW5ndGhGbGFnID0gMTsKKyAgICAgIGJyZWFrOwogICB9Ci0gIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPnNhbXBsZXNQZXJGcmFtZSA9PSA0ODApID8gMSA6IDAsIDEpOwogCi0gIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPmZsYWdzICYgQ0NfVkNCMTEgKSA/IDE6MCwgMSk7Ci0gIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPmZsYWdzICYgQ0NfUlZMQyApID8gMTowLCAxKTsKLSAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19IQ1IgICkgPyAxOjAsIDEpOworICBGREt3cml0ZUJpdHMoaEJzLCBmcmFtZUxlbmd0aEZsYWcsIDEpOwogCi0gIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPmZsYWdzICYgQ0NfU0JSKSA/IDE6MCwgMSk7IC8qIFNCUiBoZWFkZXIgZmxhZyAqLwotICBpZiAoIChjb25maWctPmZsYWdzICYgQ0NfU0JSKSApIHsKLSAgICBGREt3cml0ZUJpdHMoaEJzLCAoY29uZmlnLT5zYW1wbGluZ1JhdGUgPT0gY29uZmlnLT5leHRTYW1wbGluZ1JhdGUpID8gMDoxLCAxKTsgLyogU2FtcGxlcmF0ZSBGbGFnICovCi0gICAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19TQlJDUkMpID8gMTowLCAxKTsgLyogU0JSIENSQyBmbGFnKi8KKyAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19WQ0IxMSkgPyAxIDogMCwgMSk7CisgIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPmZsYWdzICYgQ0NfUlZMQykgPyAxIDogMCwgMSk7CisgIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPmZsYWdzICYgQ0NfSENSKSA/IDEgOiAwLCAxKTsKKworICBGREt3cml0ZUJpdHMoaEJzLCAoY29uZmlnLT5mbGFncyAmIENDX1NCUikgPyAxIDogMCwgMSk7IC8qIFNCUiBoZWFkZXIgZmxhZyAqLworICBpZiAoKGNvbmZpZy0+ZmxhZ3MgJiBDQ19TQlIpKSB7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+c2FtcGxpbmdSYXRlID09IGNvbmZpZy0+ZXh0U2FtcGxpbmdSYXRlKSA/IDAgOiAxLAorICAgICAgICAgICAgICAgICAxKTsgLyogU2FtcGxlcmF0ZSBGbGFnICovCisgICAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19TQlJDUkMpID8gMSA6IDAsIDEpOyAvKiBTQlIgQ1JDIGZsYWcqLwogCiAgICAgaWYgKGNiLT5jYlNiciAhPSBOVUxMKSB7CiAgICAgICBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiAqcFBjZTsKLSAgICAgIGludCBlOworICAgICAgaW50IGUsIHNickVsZW1lbnRJbmRleCA9IDA7CiAKICAgICAgIHBQY2UgPSBnZXRQY2VFbnRyeShjb25maWctPmNoYW5uZWxNb2RlKTsKIAotICAgICAgZm9yIChlPTA7IGU8UENFX01BWF9FTEVNRU5UUyAmJiBwUGNlLT5lbF9saXN0W2VdICE9IElEX05PTkU7IGUrKyAgKSB7Ci0gICAgICAgIGlmICggKHBQY2UtPmVsX2xpc3RbZV0gPT0gSURfU0NFKSB8fCAocFBjZS0+ZWxfbGlzdFtlXSA9PSBJRF9DUEUpICkgewotICAgICAgICAgIGNiLT5jYlNicihjYi0+Y2JTYnJEYXRhLCBoQnMsIDAsIDAsIDAsIGNvbmZpZy0+YW90LCBwUGNlLT5lbF9saXN0W2VdLCBlKTsKKyAgICAgIGZvciAoZSA9IDA7IGUgPCBwUGNlLT5udW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBQY2UtPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICBwUGNlLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFBjZS0+bnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzOworICAgICAgICAgICBlKyspIHsKKyAgICAgICAgaWYgKChwUGNlLT5wRWxfdHlwZVtlXSA9PSBJRF9TQ0UpIHx8IChwUGNlLT5wRWxfdHlwZVtlXSA9PSBJRF9DUEUpKSB7CisgICAgICAgICAgY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgMCwgMCwgMCwgY29uZmlnLT5hb3QsIHBQY2UtPnBFbF90eXBlW2VdLAorICAgICAgICAgICAgICAgICAgICBzYnJFbGVtZW50SW5kZXgsIDAsIDAsIDAsIE5VTEwsIDEpOworICAgICAgICAgIHNickVsZW1lbnRJbmRleCsrOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgRkRLd3JpdGVCaXRzKGhCcywgMCwgNCk7IC8qIEVMREVYVF9URVJNICovCisgIGlmICgoY29uZmlnLT5mbGFncyAmIENDX1NBQykgJiYgKGNiLT5jYlNzYyAhPSBOVUxMKSkgeworICAgIEZES3dyaXRlQml0cyhoQnMsIEVMREVYVF9MRFNBQywgNCk7CisKKyAgICBjb25zdCBJTlQgZWxkRXh0TGVuID0KKyAgICAgICAgKGNiLT5jYlNzYyhjYi0+Y2JTc2NEYXRhLCBOVUxMLCBjb25maWctPmFvdCwgY29uZmlnLT5leHRTYW1wbGluZ1JhdGUsIDAsCisgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgTlVMTCkgKworICAgICAgICAgNykgPj4KKyAgICAgICAgMzsKKyAgICBJTlQgY250ID0gZWxkRXh0TGVuOworCisgICAgaWYgKGNudCA8IDB4RikgeworICAgICAgRkRLd3JpdGVCaXRzKGhCcywgY250LCA0KTsKKyAgICB9IGVsc2UgeworICAgICAgRkRLd3JpdGVCaXRzKGhCcywgMHhGLCA0KTsKKyAgICAgIGNudCAtPSAweEY7CisKKyAgICAgIGlmIChjbnQgPCAweEZGKSB7CisgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIGNudCwgOCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBGREt3cml0ZUJpdHMoaEJzLCAweEZGLCA4KTsKKyAgICAgICAgY250IC09IDB4RkY7CisKKyAgICAgICAgRkRLX0FTU0VSVChjbnQgPD0gMHhGRkZGKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCcywgY250LCAxNik7CisgICAgICB9CisgICAgfQorCisgICAgY2ItPmNiU3NjKGNiLT5jYlNzY0RhdGEsIGhCcywgY29uZmlnLT5hb3QsIGNvbmZpZy0+ZXh0U2FtcGxpbmdSYXRlLCAwLCAwLCAwLAorICAgICAgICAgICAgICAwLCBOVUxMKTsKKyAgfQorCisgIGlmIChjb25maWctPmRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSAwICYmCisgICAgICBjb25maWctPmRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSBjb25maWctPmV4dFNhbXBsaW5nUmF0ZSkgeworICAgIC8qIGRvd25zY2FsZSBhY3RpdmUgKi8KKworICAgIC8qIGVsZEV4dExlbkRzYzogTnVtYmVyIG9mIGJ5dGVzIGZvciB0aGUgRUxEIGRvd25zY2FsZSBleHRlbnNpb24gKHNySWR4CisgICAgICAgbmVlZHMgMSBieXRlCisgICAgICAgKyBkb3duc2NhbGVTYW1wbGluZ1JhdGUgbmVlZHMgYWRkaXRpb25hbCAzIGJ5dGVzKSAqLworICAgIGludCBlbGRFeHRMZW5Ec2MgPSAxOworICAgIGludCBkb3duc2NhbGVTYW1wbGluZ1JhdGUgPSBjb25maWctPmRvd25zY2FsZVNhbXBsaW5nUmF0ZTsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCBFTERFWFRfRE9XTlNDQUxFSU5GTywgNCk7IC8qIEVMREVYVF9ET1dOU0NBTEVJTkZPICovCisKKyAgICBpZiAoKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSA5NjAwMCkgJiYgKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSA4ODIwMCkgJiYKKyAgICAgICAgKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSA2NDAwMCkgJiYgKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSA0ODAwMCkgJiYKKyAgICAgICAgKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSA0NDEwMCkgJiYgKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSAzMjAwMCkgJiYKKyAgICAgICAgKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSAyNDAwMCkgJiYgKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSAyMjA1MCkgJiYKKyAgICAgICAgKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSAxNjAwMCkgJiYgKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSAxMjAwMCkgJiYKKyAgICAgICAgKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSAxMTAyNSkgJiYgKGRvd25zY2FsZVNhbXBsaW5nUmF0ZSAhPSA4MDAwKSAmJgorICAgICAgICAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDczNTApKSB7CisgICAgICBlbGRFeHRMZW5Ec2MgPSA0OyAvKiBsZW5ndGggZXh0ZW5kcyB0byA0IGlmIGRvd25zY2FsZVNhbXBsaW5nUmF0ZSdzIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3Qgb25lIG9mIHRoZSBsaXN0ZWQgdmFsdWVzICovCisgICAgfQorCisgICAgRkRLd3JpdGVCaXRzKGhCcywgZWxkRXh0TGVuRHNjLCA0KTsKKyAgICB3cml0ZVNhbXBsZVJhdGUoaEJzLCBkb3duc2NhbGVTYW1wbGluZ1JhdGUsIDQpOworICAgIEZES3dyaXRlQml0cyhoQnMsIDB4MCwgNCk7IC8qIGZpbGxfbmliYmxlICovCisgIH0KKworICBGREt3cml0ZUJpdHMoaEJzLCBFTERFWFRfVEVSTSwgNCk7IC8qIEVMREVYVF9URVJNICovCiAKICAgcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLwogCitzdGF0aWMgaW50IHRyYW5zcG9ydEVuY193cml0ZVVzYWNTcGVjaWZpY0NvbmZpZyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0RmxhZywgQ09ERVJfQ09ORklHICpjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTVHBDYWxsQmFja3MgKmNiKSB7CisgIEZES19CSVRTVFJFQU0gdXNhY0NvbmY7CisgIGludCB1c2FjQ29uZmlnQml0cyA9IGNjLT5yYXdDb25maWdCaXRzOwogCi1pbnQgdHJhbnNwb3J0RW5jX3dyaXRlQVNDICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBhc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERVJfQ09ORklHICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKKyAgaWYgKCh1c2FjQ29uZmlnQml0cyA8PSAwKSB8fAorICAgICAgKCh1c2FjQ29uZmlnQml0cyArIDcpIC8gOCA+IChpbnQpc2l6ZW9mKGNjLT5yYXdDb25maWcpKSkgeworICAgIHJldHVybiBUUkFOU1BPUlRFTkNfVU5TVVBQT1JURURfRk9STUFUOworICB9CisgIEZES2luaXRCaXRTdHJlYW0oJnVzYWNDb25mLCBjYy0+cmF3Q29uZmlnLCBCVUZTSVpFX0RVTU1ZX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgIHVzYWNDb25maWdCaXRzLCBCU19SRUFERVIpOworCisgIGZvciAoOyB1c2FjQ29uZmlnQml0cyA+IDA7IHVzYWNDb25maWdCaXRzLS0pIHsKKyAgICBVSU5UIHRtcCA9IEZES3JlYWRCaXQoJnVzYWNDb25mKTsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCB0bXAsIDEpOworICB9CisgIEZES3N5bmNDYWNoZShoQnMpOworCisgIHJldHVybiBUUkFOU1BPUlRFTkNfT0s7Cit9CisKK2ludCB0cmFuc3BvcnRFbmNfd3JpdGVBU0MoSEFORExFX0ZES19CSVRTVFJFQU0gYXNjLCBDT0RFUl9DT05GSUcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IpIHsKICAgVUlOVCBleHRGbGFnID0gMDsKICAgaW50IGVycjsKICAgaW50IGVwQ29uZmlnID0gMDsKQEAgLTQ3MiwzNyArODk0LDM1IEBACiAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgogICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CiAgICAgY2FzZSBBT1RfVVNBQzoKLSAgICAgICAgZXh0RmxhZyA9IDE7Ci0gICAgICAgIGJyZWFrOworICAgICAgZXh0RmxhZyA9IDE7CisgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKKyAgICAgIGJyZWFrOwogICB9CiAKLSAgaWYgKGNvbmZpZy0+c2JyU2lnbmFsaW5nPT1TSUdfRVhQTElDSVRfSElFUkFSQ0hJQ0FMICYmIGNvbmZpZy0+c2JyUHJlc2VudCkKKyAgaWYgKGNvbmZpZy0+c2JyU2lnbmFsaW5nID09IFNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUwgJiYgY29uZmlnLT5zYnJQcmVzZW50KQogICAgIHdyaXRlQW90KGFzYywgY29uZmlnLT5leHRBT1QpOwogICBlbHNlCiAgICAgd3JpdGVBb3QoYXNjLCBjb25maWctPmFvdCk7CiAKLSAgewotICAgIHdyaXRlU2FtcGxlUmF0ZShhc2MsIGNvbmZpZy0+c2FtcGxpbmdSYXRlKTsKLSAgfQorICAvKiBJbiBjYXNlIG9mIFVTQUMgaXQgaXMgdGhlIG91dHB1dCBub3QgdGhlIGNvcmUgc2FtcGxpbmcgcmF0ZSAqLworICB3cml0ZVNhbXBsZVJhdGUoYXNjLCBjb25maWctPnNhbXBsaW5nUmF0ZSwgNCk7CiAKICAgLyogVHJ5IHRvIGd1ZXNzIGEgcmVhc29uYWJsZSBjaGFubmVsIG1vZGUgaWYgbm90IGdpdmVuICovCiAgIGlmIChjb25maWctPmNoYW5uZWxNb2RlID09IE1PREVfSU5WQUxJRCkgewogICAgIGNvbmZpZy0+Y2hhbm5lbE1vZGUgPSB0cmFuc3BvcnRFbmNfR2V0Q2hhbm5lbE1vZGUoY29uZmlnLT5ub0NoYW5uZWxzKTsKLSAgICBpZiAoY29uZmlnLT5jaGFubmVsTW9kZSA9PSBNT0RFX0lOVkFMSUQpCi0gICAgICByZXR1cm4gLTE7CisgICAgaWYgKGNvbmZpZy0+Y2hhbm5lbE1vZGUgPT0gTU9ERV9JTlZBTElEKSByZXR1cm4gLTE7CiAgIH0KIAotICBGREt3cml0ZUJpdHMoIGFzYywgZ2V0Q2hhbm5lbENvbmZpZyhjb25maWctPmNoYW5uZWxNb2RlKSwgNCApOworICBGREt3cml0ZUJpdHMoCisgICAgICBhc2MsIGdldENoYW5uZWxDb25maWcoY29uZmlnLT5jaGFubmVsTW9kZSwgY29uZmlnLT5jaGFubmVsQ29uZmlnWmVybyksIDQpOwogCi0gIGlmIChjb25maWctPnNiclNpZ25hbGluZz09U0lHX0VYUExJQ0lUX0hJRVJBUkNISUNBTCAmJiBjb25maWctPnNiclByZXNlbnQpIHsKLSAgICB3cml0ZVNhbXBsZVJhdGUoYXNjLCBjb25maWctPmV4dFNhbXBsaW5nUmF0ZSk7CisgIGlmIChjb25maWctPnNiclNpZ25hbGluZyA9PSBTSUdfRVhQTElDSVRfSElFUkFSQ0hJQ0FMICYmIGNvbmZpZy0+c2JyUHJlc2VudCkgeworICAgIHdyaXRlU2FtcGxlUmF0ZShhc2MsIGNvbmZpZy0+ZXh0U2FtcGxpbmdSYXRlLCA0KTsKICAgICB3cml0ZUFvdChhc2MsIGNvbmZpZy0+YW90KTsKICAgfQogCiAgIHN3aXRjaCAoY29uZmlnLT5hb3QpIHsKLSNpZmRlZiBUUF9HQV9FTkFCTEUKICAgICBjYXNlIEFPVF9BQUNfTUFJTjoKICAgICBjYXNlIEFPVF9BQUNfTEM6CiAgICAgY2FzZSBBT1RfQUFDX1NTUjoKQEAgLTUxNSwxOCArOTM1LDIwIEBACiAgICAgY2FzZSBBT1RfRVJfVFdJTl9WUToKICAgICBjYXNlIEFPVF9FUl9CU0FDOgogICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKLSAgICAgIGVyciA9IHRyYW5zcG9ydEVuY193cml0ZUdBU3BlY2lmaWNDb25maWcoYXNjLCBjb25maWcsIGV4dEZsYWcsIGFsaWduQW5jaG9yKTsKLSAgICAgIGlmIChlcnIpCi0gICAgICAgIHJldHVybiBlcnI7CisgICAgICBlcnIgPQorICAgICAgICAgIHRyYW5zcG9ydEVuY193cml0ZUdBU3BlY2lmaWNDb25maWcoYXNjLCBjb25maWcsIGV4dEZsYWcsIGFsaWduQW5jaG9yKTsKKyAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CiAgICAgICBicmVhazsKLSNlbmRpZiAvKiBUUF9HQV9FTkFCTEUgKi8KLSNpZmRlZiBUUF9FTERfRU5BQkxFCiAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKICAgICAgIGVyciA9IHRyYW5zcG9ydEVuY193cml0ZUVMRFNwZWNpZmljQ29uZmlnKGFzYywgY29uZmlnLCBlcENvbmZpZywgY2IpOwotICAgICAgaWYgKGVycikKLSAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CiAgICAgICBicmVhazsKLSNlbmRpZiAvKiBUUF9FTERfRU5BQkxFICovCisgICAgY2FzZSBBT1RfVVNBQzoKKyAgICAgIGVyciA9IHRyYW5zcG9ydEVuY193cml0ZVVzYWNTcGVjaWZpY0NvbmZpZyhhc2MsIGV4dEZsYWcsIGNvbmZpZywgY2IpOworICAgICAgaWYgKGVycikgeworICAgICAgICByZXR1cm4gZXJyOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiAtMTsKICAgfQpAQCAtNTQzLDM0ICs5NjUsMzIgQEAKICAgICBjYXNlIEFPVF9FUl9ISUxOOgogICAgIGNhc2UgQU9UX0VSX1BBUkE6CiAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKLSAgICAgIEZES3dyaXRlQml0cyggYXNjLCAwLCAyICk7IC8qIGVwY29uZmlnIDAgKi8KKyAgICAgIEZES3dyaXRlQml0cyhhc2MsIDAsIDIpOyAvKiBlcGNvbmZpZyAwICovCiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CiAgIH0KIAogICAvKiBiYWNrd2FyZCBjb21wYXRpYmxlIGV4cGxpY2l0IHNpZ25hbGluZyBvZiBleHRlbnNpb24gQU9UICovCi0gIGlmIChjb25maWctPnNiclNpZ25hbGluZz09U0lHX0VYUExJQ0lUX0JXX0NPTVBBVElCTEUpCi0gIHsKKyAgaWYgKGNvbmZpZy0+c2JyU2lnbmFsaW5nID09IFNJR19FWFBMSUNJVF9CV19DT01QQVRJQkxFKSB7CiAgICAgVFBfQVNDX0VYVEVOU0lPTl9JRCBhc2NFeHRJZCA9IEFTQ0VYVF9VTktPV047CiAKICAgICBpZiAoY29uZmlnLT5zYnJQcmVzZW50KSB7Ci0gICAgICBhc2NFeHRJZD1BU0NFWFRfU0JSOwotICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIGFzY0V4dElkLCAxMSApOworICAgICAgYXNjRXh0SWQgPSBBU0NFWFRfU0JSOworICAgICAgRkRLd3JpdGVCaXRzKGFzYywgYXNjRXh0SWQsIDExKTsKICAgICAgIHdyaXRlQW90KGFzYywgY29uZmlnLT5leHRBT1QpOwotICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIDEsIDEgKTsgLyogc2JyUHJlc2VudEZsYWc9MSAqLwotICAgICAgd3JpdGVTYW1wbGVSYXRlKGFzYywgY29uZmlnLT5leHRTYW1wbGluZ1JhdGUpOworICAgICAgRkRLd3JpdGVCaXRzKGFzYywgMSwgMSk7IC8qIHNiclByZXNlbnRGbGFnPTEgKi8KKyAgICAgIHdyaXRlU2FtcGxlUmF0ZShhc2MsIGNvbmZpZy0+ZXh0U2FtcGxpbmdSYXRlLCA0KTsKICAgICAgIGlmIChjb25maWctPnBzUHJlc2VudCkgewotICAgICAgICBhc2NFeHRJZD1BU0NFWFRfUFM7Ci0gICAgICAgIEZES3dyaXRlQml0cyggYXNjLCBhc2NFeHRJZCwgMTEgKTsKLSAgICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIDEsIDEgKTsgLyogcHNQcmVzZW50RmxhZz0xICovCisgICAgICAgIGFzY0V4dElkID0gQVNDRVhUX1BTOworICAgICAgICBGREt3cml0ZUJpdHMoYXNjLCBhc2NFeHRJZCwgMTEpOworICAgICAgICBGREt3cml0ZUJpdHMoYXNjLCAxLCAxKTsgLyogcHNQcmVzZW50RmxhZz0xICovCiAgICAgICB9CiAgICAgfQotCiAgIH0KIAogICAvKiBNYWtlIHN1cmUgYWxsIGJpdHMgYXJlIHN5bmMnZWQgKi8KLSAgRkRLc3luY0NhY2hlKCBhc2MgKTsKKyAgRkRLc3luY0NhY2hlKGFzYyk7CiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FzYy5oIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hc2MuaAppbmRleCA0N2ZlN2ExLi41ZjU2MjFlIDEwMDY0NAotLS0gYS9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FzYy5oCisrKyBiL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYXNjLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6IE1hbnVlbCBKYW5kZXIKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKICAgIERlc2NyaXB0aW9uOiBBdWRpbyBTcGVjaWZpYyBDb25maWcgd3JpdGVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgVFBFTkNfQVNDX0gKICNkZWZpbmUgVFBFTkNfQVNDX0gKQEAgLTk1LDEwICsxMDcsMTIgQEAKICAqIFxicmllZiBHZXQgY2hhbm5lbCBjb25maWcgZnJvbSBjaGFubmVsIG1vZGUuCiAgKgogICogXHBhcmFtIGNoYW5uZWxfbW9kZSBjaGFubmVsIG1vZGUKKyAqIFxwYXJhbSBjaGFubmVsX2NvbmZpZ196ZXJvIG5vIHN0YW5kYXJkIGNoYW5uZWwgY29uZmlndXJhdGlvbgogICoKICAqIFxyZXR1cm4gY2hhbmVsIGNvbmZpZwogICovCi1pbnQgZ2V0Q2hhbm5lbENvbmZpZyggQ0hBTk5FTF9NT0RFIGNoYW5uZWxfbW9kZSApOworaW50IGdldENoYW5uZWxDb25maWcoY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNoYW5uZWxfY29uZmlnX3plcm8pOwogCiAvKioKICAqIFxicmllZiBXcml0ZSBhIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQuCkBAIC0xMTMsMTYgKzEyNywxMCBAQAogICogXHBhcmFtIHJlZmVyZW5jZSBiaXRzdHJlYW0gcG9zaXRpb24gZm9yIGFsaWdubWVudAogICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUuCiAgKi8KLWludCB0cmFuc3BvcnRFbmNfd3JpdGVQQ0UoCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgQ0hBTk5FTF9NT0RFICAgICAgICAgY2hhbm5lbE1vZGUsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIGluc3RhbmNlVGFnUENFLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBwcm9maWxlLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBtYXRyaXhNaXhkb3duQSwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgcHNldWRvU3Vycm91bmRFbmFibGUsCi0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIGFsaWduQW5jaG9yCi0gICAgICAgICk7CitpbnQgdHJhbnNwb3J0RW5jX3dyaXRlUENFKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwgaW50IGluc3RhbmNlVGFnUENFLCBpbnQgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeE1peGRvd25BLCBpbnQgcHNldWRvU3Vycm91bmRFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYWxpZ25BbmNob3IpOwogCiAvKioKICAqIFxicmllZiBHZXQgdGhlIGJpdCBjb3VudCByZXF1aXJlZCBieSBhIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQKQEAgLTEzMCwxMyArMTM4LDEwIEBACiAgKiBccGFyYW0gY2hhbm5lbE1vZGUgdGhlIGNoYW5uZWwgbW9kZSB0byBiZSB1c2VkCiAgKiBccGFyYW0gbWF0cml4IG1peGRvd24gZ2FpbgogICogXHBhcmFtIGJpdCBvZmZzZXQgYXQgd2hpY2ggdGhlIFBDRSB3b3VsZCBzdGFydAotICogXHJldHVybiB0aGUgYW1vdW50IG9mIGJpdHMgcmVxdWlyZWQgZm9yIHRoZSBQQ0UgaW5jbHVkaW5nIHRoZSBnaXZlbiBiaXQgb2Zmc2V0LgorICogXHJldHVybiB0aGUgYW1vdW50IG9mIGJpdHMgcmVxdWlyZWQgZm9yIHRoZSBQQ0UgaW5jbHVkaW5nIHRoZSBnaXZlbiBiaXQKKyAqIG9mZnNldC4KICAqLwotaW50IHRyYW5zcG9ydEVuY19HZXRQQ0VCaXRzKAotICAgICAgICBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsCi0gICAgICAgIGludCAgICAgICAgICBtYXRyaXhNaXhkb3duQSwKLSAgICAgICAgaW50ICAgICAgICAgIGJpdHMKLSAgICAgICAgKTsKK2ludCB0cmFuc3BvcnRFbmNfR2V0UENFQml0cyhDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsIGludCBtYXRyaXhNaXhkb3duQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cyk7CiAKICNlbmRpZiAvKiBUUEVOQ19BU0NfSCAqLwotCmRpZmYgLS1naXQgYS9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xhdG0uY3BwIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19sYXRtLmNwcAppbmRleCBmMjkyMDE5Li4yZDM1ZDQ4IDEwMDY0NAotLS0gYS9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xhdG0uY3BwCisrKyBiL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfbGF0bS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNzggKzkwLDY5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidHBlbmNfbGF0bS5oIgogCi0KICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCiBzdGF0aWMgY29uc3Qgc2hvcnQgY2VscEZyYW1lTGVuZ3RoVGFibGVbNjRdID0gewotIDE1NCwgMTcwLCAxODYsIDE0NywgMTU2LCAxNjUsIDExNCwgMTIwLAotIDE4NiwgMTI2LCAxMzIsIDEzOCwgMTQyLCAxNDYsIDE1NCwgMTY2LAotIDE3NCwgMTgyLCAxOTAsIDE5OCwgMjA2LCAyMTAsIDIxNCwgMTEwLAotIDExNCwgMTE4LCAxMjAsIDEyMiwgMjE4LCAyMzAsIDI0MiwgMjU0LAotIDI2NiwgMjc4LCAyODYsIDI5NCwgMzE4LCAzNDIsIDM1OCwgMzc0LAotIDM5MCwgNDA2LCA0MjIsIDEzNiwgMTQyLCAxNDgsIDE1NCwgMTYwLAotIDE2NiwgMTcwLCAxNzQsIDE4NiwgMTk4LCAyMDYsIDIxNCwgMjIyLAotIDIzMCwgMjM4LCAyMTYsIDE2MCwgMjgwLCAzMzgsIDAsICAgMAotfTsKKyAgICAxNTQsIDE3MCwgMTg2LCAxNDcsIDE1NiwgMTY1LCAxMTQsIDEyMCwgMTg2LCAxMjYsIDEzMiwgMTM4LCAxNDIsCisgICAgMTQ2LCAxNTQsIDE2NiwgMTc0LCAxODIsIDE5MCwgMTk4LCAyMDYsIDIxMCwgMjE0LCAxMTAsIDExNCwgMTE4LAorICAgIDEyMCwgMTIyLCAyMTgsIDIzMCwgMjQyLCAyNTQsIDI2NiwgMjc4LCAyODYsIDI5NCwgMzE4LCAzNDIsIDM1OCwKKyAgICAzNzQsIDM5MCwgNDA2LCA0MjIsIDEzNiwgMTQyLCAxNDgsIDE1NCwgMTYwLCAxNjYsIDE3MCwgMTc0LCAxODYsCisgICAgMTk4LCAyMDYsIDIxNCwgMjIyLCAyMzAsIDIzOCwgMjE2LCAxNjAsIDI4MCwgMzM4LCAwLCAgIDB9OwogCiAvKioqKioqKgogIHdyaXRlIHZhbHVlIHRvIHRyYW5zcG9ydCBzdHJlYW0KICBmaXJzdCB0d28gYml0cyBkZWZpbmUgdGhlIHNpemUgb2YgdGhlIHZhbHVlIGl0c2VsZgogIHRoZW4gdGhlIHZhbHVlIGl0c2VsZiwgd2l0aCBhIHNpemUgb2YgMC0zIGJ5dGVzCiAqKioqKioqLwotc3RhdGljCi1VSU5UIHRyYW5zcG9ydEVuY19MYXRtV3JpdGVWYWx1ZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGludCB2YWx1ZSkKLXsKK3N0YXRpYyBVSU5UIHRyYW5zcG9ydEVuY19MYXRtV3JpdGVWYWx1ZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGludCB2YWx1ZSkgewogICBVQ0hBUiB2YWx1ZUJ5dGVzID0gNDsKICAgdW5zaWduZWQgaW50IGJpdHNXcml0dGVuID0gMDsKICAgaW50IGk7CiAKLSAgaWYgKCB2YWx1ZSA8ICgxPDw4KSApIHsKKyAgaWYgKHZhbHVlIDwgKDEgPDwgOCkpIHsKICAgICB2YWx1ZUJ5dGVzID0gMTsKLSAgfSBlbHNlIGlmICggdmFsdWUgPCAoMTw8MTYpICkgeworICB9IGVsc2UgaWYgKHZhbHVlIDwgKDEgPDwgMTYpKSB7CiAgICAgdmFsdWVCeXRlcyA9IDI7Ci0gIH0gZWxzZSBpZiAoIHZhbHVlIDwgKDE8PDI0KSApIHsKKyAgfSBlbHNlIGlmICh2YWx1ZSA8ICgxIDw8IDI0KSkgewogICAgIHZhbHVlQnl0ZXMgPSAzOwogICB9IGVsc2UgewogICAgIHZhbHVlQnl0ZXMgPSA0OwogICB9CiAKLSAgRkRLd3JpdGVCaXRzKGhCcywgdmFsdWVCeXRlcy0xLCAyICk7IC8qIHNpemUgb2YgdmFsdWUgaW4gQnl0ZXMgKi8KLSAgZm9yIChpPTA7IGk8dmFsdWVCeXRlczsgaSsrKSB7CisgIEZES3dyaXRlQml0cyhoQnMsIHZhbHVlQnl0ZXMgLSAxLCAyKTsgLyogc2l6ZSBvZiB2YWx1ZSBpbiBCeXRlcyAqLworICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVCeXRlczsgaSsrKSB7CiAgICAgLyogd3JpdGUgbW9zdCBzaWduaWZpY2FudCBCeXRlIGZpcnN0ICovCi0gICAgRkRLd3JpdGVCaXRzKGhCcywgKFVDSEFSKSh2YWx1ZT4+KCh2YWx1ZUJ5dGVzLTEtaSk8PDMpKSwgOCk7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgKFVDSEFSKSh2YWx1ZSA+PiAoKHZhbHVlQnl0ZXMgLSAxIC0gaSkgPDwgMykpLCA4KTsKICAgfQogCi0gIGJpdHNXcml0dGVuID0gKHZhbHVlQnl0ZXM8PDMpKzI7CisgIGJpdHNXcml0dGVuID0gKHZhbHVlQnl0ZXMgPDwgMykgKyAyOwogCiAgIHJldHVybiBiaXRzV3JpdHRlbjsKIH0KIAotc3RhdGljCi1VSU5UIHRyYW5zcG9ydEVuY19MYXRtQ291bnRGaXhCaXREZW1hbmRIZWFkZXIgKCBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcyApCi17CitzdGF0aWMgVUlOVCB0cmFuc3BvcnRFbmNfTGF0bUNvdW50Rml4Qml0RGVtYW5kSGVhZGVyKEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzKSB7CiAgIGludCBiaXREZW1hbmQgPSAwOwotICBpbnQgaW5zZXJ0U2V0dXBEYXRhID0gMCA7CisgIGludCBpbnNlcnRTZXR1cERhdGEgPSAwOwogCiAgIC8qIG9ubHkgaWYgc3RhcnQgb2YgbmV3IGxhdG0gZnJhbWUgKi8KLSAgaWYgKGhBc3MtPnN1YkZyYW1lQ250PT0wKQotICB7CisgIGlmIChoQXNzLT5zdWJGcmFtZUNudCA9PSAwKSB7CiAgICAgLyogQXVkaW9TeW5jU3RyZWFtICovCiAKICAgICBpZiAoaEFzcy0+dHQgPT0gVFRfTVA0X0xPQVMpIHsKLSAgICAgIGJpdERlbWFuZCArPSAxMSA7ICAgICAgICAgICAgIC8qIHN5bmN3b3JkICovCi0gICAgICBiaXREZW1hbmQgKz0gMTMgOyAgICAgICAgICAgICAvKiBhdWRpb011eExlbmd0aEJ5dGVzICovCisgICAgICBiaXREZW1hbmQgKz0gMTE7IC8qIHN5bmN3b3JkICovCisgICAgICBiaXREZW1hbmQgKz0gMTM7IC8qIGF1ZGlvTXV4TGVuZ3RoQnl0ZXMgKi8KICAgICB9CiAKICAgICAvKiBBdWRpb011eEVsZW1lbnQqLwpAQCAtMTY0LDE5MSArMTY2LDE4NCBAQAogCiAgICAgaWYgKGhBc3MtPnR0ICE9IFRUX01QNF9MQVRNX01DUDApIHsKICAgICAgIC8qIEF1ZGlvTXV4RWxlbWVudDo6dXNlU2FtZVN0cmVhbU11eCBGbGFnICovCi0gICAgICBiaXREZW1hbmQrPTE7CisgICAgICBiaXREZW1hbmQgKz0gMTsKIAotICAgICAgaWYoIGluc2VydFNldHVwRGF0YSApIHsKKyAgICAgIGlmIChpbnNlcnRTZXR1cERhdGEpIHsKICAgICAgICAgYml0RGVtYW5kICs9IGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHM7CiAgICAgICB9CiAgICAgfQogCiAgICAgLyogQXVkaW9NdXhFbGVtZW50OjpvdGhlckRhdGFCaXRzICovCi0gICAgYml0RGVtYW5kICs9IDgqaEFzcy0+b3RoZXJEYXRhTGVuQnl0ZXM7CisgICAgYml0RGVtYW5kICs9IGhBc3MtPm90aGVyRGF0YUxlbkJpdHM7CiAKICAgICAvKiBBdWRpb011eEVsZW1lbnQ6OkJ5dGVBbGlnbiAqLwotICAgIGlmICggYml0RGVtYW5kICUgOCApIHsKLSAgICAgICBoQXNzLT5maWxsQml0cyA9IDggLSAoYml0RGVtYW5kICUgOCk7Ci0gICAgICAgYml0RGVtYW5kICs9IGhBc3MtPmZpbGxCaXRzIDsKKyAgICBpZiAoYml0RGVtYW5kICUgOCkgeworICAgICAgaEFzcy0+ZmlsbEJpdHMgPSA4IC0gKGJpdERlbWFuZCAlIDgpOworICAgICAgYml0RGVtYW5kICs9IGhBc3MtPmZpbGxCaXRzOwogICAgIH0gZWxzZSB7CiAgICAgICBoQXNzLT5maWxsQml0cyA9IDA7CiAgICAgfQogICB9CiAKLSAgcmV0dXJuIGJpdERlbWFuZCA7CisgIHJldHVybiBiaXREZW1hbmQ7CiB9CiAKLXN0YXRpYwotVUlOVCB0cmFuc3BvcnRFbmNfTGF0bUNvdW50VmFyQml0RGVtYW5kSGVhZGVyICggSEFORExFX0xBVE1fU1RSRUFNIGhBc3MgLCB1bnNpZ25lZCBpbnQgc3RyZWFtRGF0YUxlbmd0aCApCi17CitzdGF0aWMgVUlOVCB0cmFuc3BvcnRFbmNfTGF0bUNvdW50VmFyQml0RGVtYW5kSGVhZGVyKAorICAgIEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLCB1bnNpZ25lZCBpbnQgc3RyZWFtRGF0YUxlbmd0aCkgewogICBpbnQgYml0RGVtYW5kID0gMDsKLSAgaW50ICBwcm9nLCBsYXllcjsKKyAgaW50IHByb2csIGxheWVyOwogCiAgIC8qIFBheWxvYWQgTGVuZ3RoIEluZm8qLwotICBpZiggaEFzcy0+YWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyApIHsKLSAgICBmb3IoIHByb2c9MDsgcHJvZzxoQXNzLT5ub1Byb2dyYW07IHByb2crKyApIHsKLSAgICAgIGZvciggbGF5ZXI9MDsgbGF5ZXI8TEFUTV9NQVhfTEFZRVJTOyBsYXllcisrICkgeworICBpZiAoaEFzcy0+YWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZykgeworICAgIGZvciAocHJvZyA9IDA7IHByb2cgPCBoQXNzLT5ub1Byb2dyYW07IHByb2crKykgeworICAgICAgZm9yIChsYXllciA9IDA7IGxheWVyIDwgTEFUTV9NQVhfTEFZRVJTOyBsYXllcisrKSB7CiAgICAgICAgIExBVE1fTEFZRVJfSU5GTyAqcF9saW5mbyA9ICYoaEFzcy0+bV9saW5mb1twcm9nXVtsYXllcl0pOwogCi0gICAgICAgIGlmKCBwX2xpbmZvLT5zdHJlYW1JRCA+PSAwICkgewotICAgICAgICAgIHN3aXRjaCggcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlICkgewotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGlmICggc3RyZWFtRGF0YUxlbmd0aCA+IDAgKSB7Ci0gICAgICAgICAgICAgIHN0cmVhbURhdGFMZW5ndGggLT0gYml0RGVtYW5kIDsKLSAgICAgICAgICAgICAgd2hpbGUoIHN0cmVhbURhdGFMZW5ndGggPj0gKDI1NTw8MykgKSB7Ci0gICAgICAgICAgICAgICAgYml0RGVtYW5kKz04OwotICAgICAgICAgICAgICAgIHN0cmVhbURhdGFMZW5ndGggLT0gKDI1NTw8Myk7CisgICAgICAgIGlmIChwX2xpbmZvLT5zdHJlYW1JRCA+PSAwKSB7CisgICAgICAgICAgc3dpdGNoIChwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgaWYgKHN0cmVhbURhdGFMZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtRGF0YUxlbmd0aCAtPSBiaXREZW1hbmQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKHN0cmVhbURhdGFMZW5ndGggPj0gKDI1NSA8PCAzKSkgeworICAgICAgICAgICAgICAgICAgYml0RGVtYW5kICs9IDg7CisgICAgICAgICAgICAgICAgICBzdHJlYW1EYXRhTGVuZ3RoIC09ICgyNTUgPDwgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJpdERlbWFuZCArPSA4OwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJpdERlbWFuZCArPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgY2FzZSAxOgotICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBiaXREZW1hbmQgKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICBiaXREZW1hbmQgKz0gMjsKKyAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0gZWxzZSB7CiAgICAgLyogdGhlcmUgYXJlIG1hbnkgcG9zc2liaWxpdGllcyB0byB1c2UgdGhpcyBtZWNoYW5pc20uICAqLwotICAgIHN3aXRjaCggaEFzcy0+dmFyTW9kZSApIHsKLSAgICBjYXNlIExBVE1WQVJfU0lNUExFX1NFUVVFTkNFOiB7Ci0gICAgICAvKiBVc2UgdGhlIHNlcXVlbmNlIGdlbmVyYXRlZCBieSB0aGUgZW5jb2RlciAqLwotICAgICAgLy9pbnQgc3RyZWFtQ250UG9zaXRpb24gPSB0cmFuc3BvcnRFbmNfU2V0V3JpdGVQb2ludGVyKCBoQXNzLT5oQXNzZW1ibGUsIDAgKTsKLSAgICAgIC8vaW50IHN0cmVhbUNudFBvc2l0aW9uID0gRkRLZ2V0VmFsaWRCaXRzKCBoQXNzLT5oQXNzZW1ibGUgKTsKLSAgICAgIGJpdERlbWFuZCs9NDsKKyAgICBzd2l0Y2ggKGhBc3MtPnZhck1vZGUpIHsKKyAgICAgIGNhc2UgTEFUTVZBUl9TSU1QTEVfU0VRVUVOQ0U6IHsKKyAgICAgICAgLyogVXNlIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZWQgYnkgdGhlIGVuY29kZXIgKi8KKyAgICAgICAgLy8gaW50IHN0cmVhbUNudFBvc2l0aW9uID0gdHJhbnNwb3J0RW5jX1NldFdyaXRlUG9pbnRlcigKKyAgICAgICAgLy8gaEFzcy0+aEFzc2VtYmxlLCAwICk7ICBpbnQgc3RyZWFtQ250UG9zaXRpb24gPSBGREtnZXRWYWxpZEJpdHMoCisgICAgICAgIC8vIGhBc3MtPmhBc3NlbWJsZSApOworICAgICAgICBiaXREZW1hbmQgKz0gNDsKIAotICAgICAgaEFzcy0+dmFyU3RyZWFtQ250ID0gMDsKLSAgICAgIGZvciggcHJvZz0wOyBwcm9nPGhBc3MtPm5vUHJvZ3JhbTsgcHJvZysrICkgewotICAgICAgICBmb3IoIGxheWVyPTA7IGxheWVyPExBVE1fTUFYX0xBWUVSUzsgbGF5ZXIrKyApIHsKLSAgICAgICAgICBMQVRNX0xBWUVSX0lORk8gKnBfbGluZm8gPSAmKGhBc3MtPm1fbGluZm9bcHJvZ11bbGF5ZXJdKTsKKyAgICAgICAgaEFzcy0+dmFyU3RyZWFtQ250ID0gMDsKKyAgICAgICAgZm9yIChwcm9nID0gMDsgcHJvZyA8IGhBc3MtPm5vUHJvZ3JhbTsgcHJvZysrKSB7CisgICAgICAgICAgZm9yIChsYXllciA9IDA7IGxheWVyIDwgTEFUTV9NQVhfTEFZRVJTOyBsYXllcisrKSB7CisgICAgICAgICAgICBMQVRNX0xBWUVSX0lORk8gKnBfbGluZm8gPSAmKGhBc3MtPm1fbGluZm9bcHJvZ11bbGF5ZXJdKTsKIAotICAgICAgICAgIGlmKCBwX2xpbmZvLT5zdHJlYW1JRCA+PSAwICkgeworICAgICAgICAgICAgaWYgKHBfbGluZm8tPnN0cmVhbUlEID49IDApIHsKKyAgICAgICAgICAgICAgYml0RGVtYW5kICs9IDQ7IC8qIHN0cmVhbUlEICovCisgICAgICAgICAgICAgIHN3aXRjaCAocF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgc3RyZWFtRGF0YUxlbmd0aCAtPSBiaXREZW1hbmQ7CisgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RyZWFtRGF0YUxlbmd0aCA+PSAoMjU1IDw8IDMpKSB7CisgICAgICAgICAgICAgICAgICAgIGJpdERlbWFuZCArPSA4OworICAgICAgICAgICAgICAgICAgICBzdHJlYW1EYXRhTGVuZ3RoIC09ICgyNTUgPDwgMyk7CisgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJpdERlbWFuZCs9NDsgLyogc3RyZWFtSUQgKi8KLSAgICAgICAgICAgIHN3aXRjaCggcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlICkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzdHJlYW1EYXRhTGVuZ3RoIC09IGJpdERlbWFuZCA7Ci0gICAgICAgICAgICAgIHdoaWxlKCBzdHJlYW1EYXRhTGVuZ3RoID49ICgyNTU8PDMpICkgewotICAgICAgICAgICAgICAgIGJpdERlbWFuZCs9ODsKLSAgICAgICAgICAgICAgICBzdHJlYW1EYXRhTGVuZ3RoIC09ICgyNTU8PDMpOworICAgICAgICAgICAgICAgICAgYml0RGVtYW5kICs9IDg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIC8qYml0RGVtYW5kICs9IDE7IGVuZEZsYWcKKyAgICAgICAgICAgICAgICAgIGJyZWFrOyovCisKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGNhc2UgNjoKKworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBiaXREZW1hbmQgKz0gODsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIC8qYml0RGVtYW5kICs9IDE7IGVuZEZsYWcKLSAgICAgICAgICAgICAgYnJlYWs7Ki8KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgY2FzZSA2OgotCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICByZXR1cm4gIDA7CisgICAgICAgICAgICAgIGhBc3MtPnZhclN0cmVhbUNudCsrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaEFzcy0+dmFyU3RyZWFtQ250Kys7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBiaXREZW1hbmQrPTQ7Ci0gICAgICAvL3RyYW5zcG9ydEVuY19VcGRhdGVCaXRzdHJlYW1GaWVsZCggaEFzcy0+aEFzc2VtYmxlLCBzdHJlYW1DbnRQb3NpdGlvbiwgaEFzcy0+dmFyU3RyZWFtQ250LTEsIDQgKTsKLSAgICAgIC8vVUlOVCBwb3MgPSBzdHJlYW1DbnRQb3NpdGlvbi1GREtnZXRWYWxpZEJpdHMoaEFzcy0+aEFzc2VtYmxlKTsKLSAgICAgIC8vRkRLcHVzaEJhY2soIGhBc3MtPmhBc3NlbWJsZSwgIHBvcyk7Ci0gICAgICAvL0ZES3dyaXRlQml0cyggaEFzcy0+aEFzc2VtYmxlLCBoQXNzLT52YXJTdHJlYW1DbnQtMSwgNCk7Ci0gICAgICAvL0ZES3B1c2hGb3IoIGhBc3MtPmhBc3NlbWJsZSwgcG9zLTQpOwotICAgIH0KLSAgICBicmVhazsKKyAgICAgICAgYml0RGVtYW5kICs9IDQ7CisgICAgICAgIC8vIHRyYW5zcG9ydEVuY19VcGRhdGVCaXRzdHJlYW1GaWVsZCggaEFzcy0+aEFzc2VtYmxlLAorICAgICAgICAvLyBzdHJlYW1DbnRQb3NpdGlvbiwgaEFzcy0+dmFyU3RyZWFtQ250LTEsIDQgKTsgIFVJTlQgcG9zID0KKyAgICAgICAgLy8gc3RyZWFtQ250UG9zaXRpb24tRkRLZ2V0VmFsaWRCaXRzKGhBc3MtPmhBc3NlbWJsZSk7ICBGREtwdXNoQmFjaygKKyAgICAgICAgLy8gaEFzcy0+aEFzc2VtYmxlLCAgcG9zKTsgIEZES3dyaXRlQml0cyggaEFzcy0+aEFzc2VtYmxlLAorICAgICAgICAvLyBoQXNzLT52YXJTdHJlYW1DbnQtMSwgNCk7ICBGREtwdXNoRm9yKCBoQXNzLT5oQXNzZW1ibGUsIHBvcy00KTsKKyAgICAgIH0gYnJlYWs7CiAKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICAwOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9CiAKLSAgcmV0dXJuIGJpdERlbWFuZCA7CisgIHJldHVybiBiaXREZW1hbmQ7CiB9CiAKIFRSQU5TUE9SVEVOQ19FUlJPUgotQ3JlYXRlU3RyZWFtTXV4Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLAotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyRnVsbG5lc3MsCi0gICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IKLSAgICAgICAgICAgICAgICAgICAgICkKLXsKK0NyZWF0ZVN0cmVhbU11eENvbmZpZyhIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJGdWxsbmVzcywgQ1NUcENhbGxCYWNrcyAqY2IpIHsKICAgSU5UIHN0cmVhbUlEY250LCB0bXA7CiAgIGludCBsYXllciwgcHJvZzsKIAotICBVU0hPUlQgY29yZUZyYW1lT2Zmc2V0PTA7CisgIFVTSE9SVCBjb3JlRnJhbWVPZmZzZXQgPSAwOwogCi0gIGhBc3MtPnRhcmFCdWZmZXJGdWxsbmVzcyAgPSAweEZGOwotICBoQXNzLT5hdWRpb011eFZlcnNpb25BICAgID0gMDsgLyogZm9yIGZ1dHVyZSBleHRlbnNpb25zICovCisgIGhBc3MtPnRhcmFCdWZmZXJGdWxsbmVzcyA9IDB4RkY7CisgIGhBc3MtPmF1ZGlvTXV4VmVyc2lvbkEgPSAwOyAvKiBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgKi8KICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyA9IDA7CiAKLSAgRkRLd3JpdGVCaXRzKCBoQnMsIGhBc3MtPmF1ZGlvTXV4VmVyc2lvbiwgMSApOyAgICAgICAgICAgICAgICAgICAvKiBhdWRpb011eFZlcnNpb24gKi8KKyAgRkRLd3JpdGVCaXRzKGhCcywgaEFzcy0+YXVkaW9NdXhWZXJzaW9uLCAxKTsgLyogYXVkaW9NdXhWZXJzaW9uICovCiAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMgKz0gMTsKIAotICBpZiAoIGhBc3MtPmF1ZGlvTXV4VmVyc2lvbiA9PSAxICkgewotICAgIEZES3dyaXRlQml0cyggaEJzLCBoQXNzLT5hdWRpb011eFZlcnNpb25BLCAxICk7ICAgICAgICAgICAgICAgIC8qIGF1ZGlvTXV4VmVyc2lvbkEgKi8KLSAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0xOworICBpZiAoaEFzcy0+YXVkaW9NdXhWZXJzaW9uID09IDEpIHsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCBoQXNzLT5hdWRpb011eFZlcnNpb25BLCAxKTsgLyogYXVkaW9NdXhWZXJzaW9uQSAqLworICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMgKz0gMTsKICAgfQogCi0gIGlmICggaEFzcy0+YXVkaW9NdXhWZXJzaW9uQSA9PSAwICkKLSAgewotICAgIGlmICggaEFzcy0+YXVkaW9NdXhWZXJzaW9uID09IDEgKSB7Ci0gICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0gdHJhbnNwb3J0RW5jX0xhdG1Xcml0ZVZhbHVlKCBoQnMsIGhBc3MtPnRhcmFCdWZmZXJGdWxsbmVzcyApOy8qIHRhcmFCdWZmZXJGdWxsbmVzcyAqLworICBpZiAoaEFzcy0+YXVkaW9NdXhWZXJzaW9uQSA9PSAwKSB7CisgICAgaWYgKGhBc3MtPmF1ZGlvTXV4VmVyc2lvbiA9PSAxKSB7CisgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IHRyYW5zcG9ydEVuY19MYXRtV3JpdGVWYWx1ZSgKKyAgICAgICAgICBoQnMsIGhBc3MtPnRhcmFCdWZmZXJGdWxsbmVzcyk7IC8qIHRhcmFCdWZmZXJGdWxsbmVzcyAqLwogICAgIH0KLSAgICBGREt3cml0ZUJpdHMoIGhCcywgaEFzcy0+YWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyA/IDE6MCwgMSApOyAvKiBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nICovCi0gICAgRkRLd3JpdGVCaXRzKCBoQnMsIGhBc3MtPm5vU3ViZnJhbWVzLTEsIDYgKTsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFN1YmZyYW1lcyAqLwotICAgIEZES3dyaXRlQml0cyggaEJzLCBoQXNzLT5ub1Byb2dyYW0tMSwgNCApOyAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBQcm9ncmFtcyAqLworICAgIEZES3dyaXRlQml0cyhoQnMsIGhBc3MtPmFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nICovCisgICAgRkRLd3JpdGVCaXRzKGhCcywgaEFzcy0+bm9TdWJmcmFtZXMgLSAxLCA2KTsgLyogTnVtYmVyIG9mIFN1YmZyYW1lcyAqLworICAgIEZES3dyaXRlQml0cyhoQnMsIGhBc3MtPm5vUHJvZ3JhbSAtIDEsIDQpOyAgIC8qIE51bWJlciBvZiBQcm9ncmFtcyAqLwogCi0gICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MTE7CisgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSAxMTsKIAogICAgIHN0cmVhbUlEY250ID0gMDsKLSAgICBmb3IoIHByb2c9MDsgcHJvZzxoQXNzLT5ub1Byb2dyYW07IHByb2crKyApIHsKKyAgICBmb3IgKHByb2cgPSAwOyBwcm9nIDwgaEFzcy0+bm9Qcm9ncmFtOyBwcm9nKyspIHsKICAgICAgIGludCB0cmFuc0xheWVyID0gMDsKIAotICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIGhBc3MtPm5vTGF5ZXJbcHJvZ10tMSwgMyApOwotICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MzsKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIGhBc3MtPm5vTGF5ZXJbcHJvZ10gLSAxLCAzKTsKKyAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMgKz0gMzsKIAotICAgICAgZm9yKCBsYXllcj0wOyBsYXllcjxMQVRNX01BWF9MQVlFUlM7IGxheWVyKysgKSB7Ci0gICAgICAgIExBVE1fTEFZRVJfSU5GTyAgICpwX2xpbmZvID0gJihoQXNzLT5tX2xpbmZvW3Byb2ddW2xheWVyXSk7Ci0gICAgICAgIENPREVSX0NPTkZJRyAqcF9sY2kgICA9IGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl07CisgICAgICBmb3IgKGxheWVyID0gMDsgbGF5ZXIgPCBMQVRNX01BWF9MQVlFUlM7IGxheWVyKyspIHsKKyAgICAgICAgTEFUTV9MQVlFUl9JTkZPICpwX2xpbmZvID0gJihoQXNzLT5tX2xpbmZvW3Byb2ddW2xheWVyXSk7CisgICAgICAgIENPREVSX0NPTkZJRyAqcF9sY2kgPSBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdOwogCiAgICAgICAgIHBfbGluZm8tPnN0cmVhbUlEID0gLTE7CiAKLSAgICAgICAgaWYoIGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0gIT0gTlVMTCApIHsKKyAgICAgICAgaWYgKGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0gIT0gTlVMTCkgewogICAgICAgICAgIGludCB1c2VTYW1lQ29uZmlnID0gMDsKIAotICAgICAgICAgIGlmKCB0cmFuc0xheWVyID4gMCApIHsKLSAgICAgICAgICAgIEZES3dyaXRlQml0cyggaEJzLCB1c2VTYW1lQ29uZmlnID8gMSA6IDAsIDEgKTsKLSAgICAgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTE7CisgICAgICAgICAgaWYgKHRyYW5zTGF5ZXIgPiAwKSB7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJzLCB1c2VTYW1lQ29uZmlnID8gMSA6IDAsIDEpOworICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSAxOwogICAgICAgICAgIH0KLSAgICAgICAgICBpZiggKHVzZVNhbWVDb25maWcgPT0gMCkgfHwgKHRyYW5zTGF5ZXI9PTApICkgeworICAgICAgICAgIGlmICgodXNlU2FtZUNvbmZpZyA9PSAwKSB8fCAodHJhbnNMYXllciA9PSAwKSkgewogICAgICAgICAgICAgY29uc3QgVUlOVCBhbGlnbkFuY2hvciA9IEZES2dldFZhbGlkQml0cyhoQnMpOwogCi0gICAgICAgICAgICB0cmFuc3BvcnRFbmNfd3JpdGVBU0MoCi0gICAgICAgICAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgICAgICAgICAgaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXSwKLSAgICAgICAgICAgICAgICAgICAgY2IKLSAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmICgwICE9CisgICAgICAgICAgICAgICAgKHRyYW5zcG9ydEVuY193cml0ZUFTQyhoQnMsIGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0sIGNiKSkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19VTktPV05fRVJST1I7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICggaEFzcy0+YXVkaW9NdXhWZXJzaW9uID09IDEgKSB7CisgICAgICAgICAgICBpZiAoaEFzcy0+YXVkaW9NdXhWZXJzaW9uID09IDEpIHsKICAgICAgICAgICAgICAgVUlOVCBhc2NMZW4gPSB0cmFuc3BvcnRFbmNfTGF0bVdyaXRlVmFsdWUoaEJzLCAwKTsKICAgICAgICAgICAgICAgRkRLYnl0ZUFsaWduKGhCcywgYWxpZ25BbmNob3IpOwogICAgICAgICAgICAgICBhc2NMZW4gPSBGREtnZXRWYWxpZEJpdHMoaEJzKSAtIGFsaWduQW5jaG9yIC0gYXNjTGVuOwpAQCAtMzU2LDE4MCArMzUxLDE2MCBAQAogCiAgICAgICAgICAgICAgIHRyYW5zcG9ydEVuY19MYXRtV3JpdGVWYWx1ZShoQnMsIGFzY0xlbik7CiAKLSAgICAgICAgICAgICAgdHJhbnNwb3J0RW5jX3dyaXRlQVNDKAotICAgICAgICAgICAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdLAotICAgICAgICAgICAgICAgICAgICAgIGNiCi0gICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgaWYgKDAgIT0KKyAgICAgICAgICAgICAgICAgICh0cmFuc3BvcnRFbmNfd3JpdGVBU0MoaEJzLCBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdLCBjYikpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19VTktPV05fRVJST1I7CisgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICBGREtieXRlQWxpZ24oaEJzLCBhbGlnbkFuY2hvcik7IC8qIGFzYyBsZW5ndGggZmlsbGJpdHMgKi8KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSBGREtnZXRWYWxpZEJpdHMoaEJzKSAtIGFsaWduQW5jaG9yOyAvKiBhZGQgYXNjIGxlbmd0aCB0byBzbWMgc3VtbWFyeSAqLworICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPQorICAgICAgICAgICAgICAgIEZES2dldFZhbGlkQml0cyhoQnMpIC0KKyAgICAgICAgICAgICAgICBhbGlnbkFuY2hvcjsgLyogYWRkIGFzYyBsZW5ndGggdG8gc21jIHN1bW1hcnkgKi8KICAgICAgICAgICB9CiAgICAgICAgICAgdHJhbnNMYXllcisrOwogCi0gICAgICAgICAgaWYoICFoQXNzLT5hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nICkgewotICAgICAgICAgICAgaWYoIHN0cmVhbUlEY250ID49IExBVE1fTUFYX1NUUkVBTV9JRCApCisgICAgICAgICAgaWYgKCFoQXNzLT5hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtSURjbnQgPj0gTEFUTV9NQVhfU1RSRUFNX0lEKQogICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfQ09ORklHOwogICAgICAgICAgIH0KICAgICAgICAgICBwX2xpbmZvLT5zdHJlYW1JRCA9IHN0cmVhbUlEY250Kys7CiAKLSAgICAgICAgICBzd2l0Y2goIHBfbGNpLT5hb3QgKSB7Ci0gICAgICAgICAgY2FzZSBBT1RfQUFDX01BSU4gICAgICA6Ci0gICAgICAgICAgY2FzZSBBT1RfQUFDX0xDICAgICAgICA6Ci0gICAgICAgICAgY2FzZSBBT1RfQUFDX1NTUiAgICAgICA6Ci0gICAgICAgICAgY2FzZSBBT1RfQUFDX0xUUCAgICAgICA6Ci0gICAgICAgICAgY2FzZSBBT1RfQUFDX1NDQUwgICAgICA6Ci0gICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0xEICAgICA6Ci0gICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRCAgICA6Ci0gICAgICAgICAgY2FzZSBBT1RfVVNBQzoKLSAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSA9IDA7CisgICAgICAgICAgc3dpdGNoIChwX2xjaS0+YW90KSB7CisgICAgICAgICAgICBjYXNlIEFPVF9BQUNfTUFJTjoKKyAgICAgICAgICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICAgICAgICAgIGNhc2UgQU9UX0FBQ19TU1I6CisgICAgICAgICAgICBjYXNlIEFPVF9BQUNfTFRQOgorICAgICAgICAgICAgY2FzZSBBT1RfQUFDX1NDQUw6CisgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgICAgICAgY2FzZSBBT1RfVVNBQzoKKyAgICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlID0gMDsKIAotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSwgMyApOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyYW1lTGVuZ3RoVHlwZSAqLwotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIGJ1ZmZlckZ1bGxuZXNzLCA4ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVmZmVyRnVsbG5lc3MgKi8KLSAgICAgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTExOworICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJzLCBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsgICAgICAgICAgICAgICAgICAgICAgLyogZnJhbWVMZW5ndGhUeXBlICovCisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIGJ1ZmZlckZ1bGxuZXNzLCA4KTsgLyogYnVmZmVyRnVsbG5lc3MgKi8KKyAgICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSAxMTsKIAotICAgICAgICAgICAgaWYgKCAhaEFzcy0+YWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyApIHsKLSAgICAgICAgICAgICAgQ09ERVJfQ09ORklHICpwX2xjaV9wcmV2ID0gaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyLTFdOwotICAgICAgICAgICAgICBpZiAoICgocF9sY2ktPmFvdCA9PSBBT1RfQUFDX1NDQUwpIHx8IChwX2xjaS0+YW90ID09IEFPVF9FUl9BQUNfU0NBTCkpICYmCi0gICAgICAgICAgICAgICAgICAgKChwX2xjaV9wcmV2LT5hb3QgPT0gQU9UX0NFTFApIHx8IChwX2xjaV9wcmV2LT5hb3QgPT0gQU9UX0VSX0NFTFApKSApIHsKLSAgICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgY29yZUZyYW1lT2Zmc2V0LCA2ICk7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcmVGcmFtZU9mZnNldCAqLwotICAgICAgICAgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTY7CisgICAgICAgICAgICAgIGlmICghaEFzcy0+YWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZykgeworICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAqcF9sY2lfcHJldiA9IGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllciAtIDFdOworICAgICAgICAgICAgICAgIGlmICgoKHBfbGNpLT5hb3QgPT0gQU9UX0FBQ19TQ0FMKSB8fAorICAgICAgICAgICAgICAgICAgICAgKHBfbGNpLT5hb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKChwX2xjaV9wcmV2LT5hb3QgPT0gQU9UX0NFTFApIHx8CisgICAgICAgICAgICAgICAgICAgICAocF9sY2lfcHJldi0+YW90ID09IEFPVF9FUl9DRUxQKSkpIHsKKyAgICAgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIGNvcmVGcmFtZU9mZnNldCwgNik7IC8qIGNvcmVGcmFtZU9mZnNldCAqLworICAgICAgICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSA2OworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgY2FzZSBBT1RfVFdJTl9WUToKLSAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSA9IDE7Ci0gICAgICAgICAgICB0bXAgPSAoIChwX2xjaS0+Yml0c0ZyYW1lKzcpID4+IDMgKSAtIDIwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc21pc3Npb24gZnJhbWUgbGVuZ3RoIGluIGJ5dGVzICovCi0gICAgICAgICAgICBpZiggKHRtcCA8IDApICkgewotICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfVFJBTlNNSVNTSU9OX0ZSQU1FX0xFTkdUSDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZES3dyaXRlQml0cyggaEJzLCBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUsIDMgKTsgICAgICAgICAgLyogZnJhbWVMZW5ndGhUeXBlICovCi0gICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgdG1wLCA5ICk7Ci0gICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0xMjsKLQotICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhCaXRzID0gKHRtcCsyMCkgPDwgMzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBBT1RfQ0VMUDoKLSAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSA9IDQ7Ci0gICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlLCAzICk7ICAgICAgICAgIC8qIGZyYW1lTGVuZ3RoVHlwZSAqLwotICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MzsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgIGZvciggaT0wOyBpPDYyOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgaWYoIGNlbHBGcmFtZUxlbmd0aFRhYmxlW2ldID09IHBfbGNpLT5iaXRzRnJhbWUgKQotICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFPVF9UV0lOX1ZROgorICAgICAgICAgICAgICBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUgPSAxOworICAgICAgICAgICAgICB0bXAgPSAoKHBfbGNpLT5iaXRzRnJhbWUgKyA3KSA+PiAzKSAtCisgICAgICAgICAgICAgICAgICAgIDIwOyAvKiB0cmFuc21pc3Npb24gZnJhbWUgbGVuZ3RoIGluIGJ5dGVzICovCisgICAgICAgICAgICAgIGlmICgodG1wIDwgMCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfVFJBTlNNSVNTSU9OX0ZSQU1FX0xFTkdUSDsKICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiggaT49NjIgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX0NFTFBfRlJBTUVfTEVOR1RIOworICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJzLCBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsgLyogZnJhbWVMZW5ndGhUeXBlICovCisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIHRtcCwgOSk7CisgICAgICAgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMgKz0gMTI7CisKKyAgICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhCaXRzID0gKHRtcCArIDIwKSA8PCAzOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBT1RfQ0VMUDoKKyAgICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlID0gNDsKKyAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCcywgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7IC8qIGZyYW1lTGVuZ3RoVHlwZSAqLworICAgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDM7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjI7IGkrKykgeworICAgICAgICAgICAgICAgICAgaWYgKGNlbHBGcmFtZUxlbmd0aFRhYmxlW2ldID09IHBfbGNpLT5iaXRzRnJhbWUpIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaSA+PSA2MikgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX0NFTFBfRlJBTUVfTEVOR1RIOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIGksIDYpOyAvKiBDRUxQZnJhbWVMZW5ndGhUYWJlbEluZGV4ICovCisgICAgICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSA2OwogICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoQml0cyA9IHBfbGNpLT5iaXRzRnJhbWU7CisgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgIEZES3dyaXRlQml0cyggaEJzLCBpLCA2ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDRUxQZnJhbWVMZW5ndGhUYWJlbEluZGV4ICovCi0gICAgICAgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2xpbmZvLT5mcmFtZUxlbmd0aEJpdHMgPSBwX2xjaS0+Yml0c0ZyYW1lOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFPVF9IVlhDOgorICAgICAgICAgICAgICBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUgPSA2OworICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJzLCBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsgLyogZnJhbWVMZW5ndGhUeXBlICovCisgICAgICAgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMgKz0gMzsKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOwogCi0gICAgICAgICAgY2FzZSBBT1RfSFZYQzoKLSAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSA9IDY7Ci0gICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlLCAzICk7ICAgICAgICAgIC8qIGZyYW1lTGVuZ3RoVHlwZSAqLwotICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MzsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgICAgaWYoIHBfbGNpLT5iaXRzRnJhbWUgPT0gNDAgKSB7Ci0gICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICAgIH0gZWxzZSBpZiggcF9sY2ktPmJpdHNGcmFtZSA9PSA4MCApIHsKLSAgICAgICAgICAgICAgICBpID0gMTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfRlJBTUVfQklUUzsKKyAgICAgICAgICAgICAgICBpZiAocF9sY2ktPmJpdHNGcmFtZSA9PSA0MCkgeworICAgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwX2xjaS0+Yml0c0ZyYW1lID09IDgwKSB7CisgICAgICAgICAgICAgICAgICBpID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX0ZSQU1FX0JJVFM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIGksIDEpOyAvKiBIVlhDZnJhbWVMZW5ndGhUYWJsZUluZGV4ICovCisgICAgICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSAxOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIEZES3dyaXRlQml0cyggaEJzLCBpLCAxICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIVlhDZnJhbWVMZW5ndGhUYWJsZUluZGV4ICovCi0gICAgICAgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2xpbmZvLT5mcmFtZUxlbmd0aEJpdHMgPSBwX2xjaS0+Yml0c0ZyYW1lOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoQml0cyA9IHBfbGNpLT5iaXRzRnJhbWU7CisgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgY2FzZSBBT1RfTlVMTF9PQkpFQ1Q6Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9BT1Q7CisgICAgICAgICAgICBjYXNlIEFPVF9OVUxMX09CSkVDVDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9BT1Q7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogCi0gICAgRkRLd3JpdGVCaXRzKCBoQnMsIChoQXNzLT5vdGhlckRhdGFMZW5CeXRlcz4wKSA/IDE6MCwgMSApOyAgICAgIC8qIG90aGVyRGF0YVByZXNlbnQgKi8KLSAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0xOworICAgIEZES3dyaXRlQml0cyhoQnMsIChoQXNzLT5vdGhlckRhdGFMZW5CaXRzID4gMCkgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgMSk7IC8qIG90aGVyRGF0YVByZXNlbnQgKi8KKyAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDE7CiAKLSAgICBpZiggaEFzcy0+b3RoZXJEYXRhTGVuQnl0ZXMgPiAwICkgewotCi0gICAgICBJTlQgb3RoZXJEYXRhTGVuVG1wID0gaEFzcy0+b3RoZXJEYXRhTGVuQnl0ZXM7Ci0gICAgICBJTlQgZXNjQ250ID0gMDsKLSAgICAgIElOVCBvdGhlckRhdGFMZW5Fc2MgPSAxOwotCi0gICAgICB3aGlsZShvdGhlckRhdGFMZW5UbXApIHsKLSAgICAgICAgb3RoZXJEYXRhTGVuVG1wID4+PSA4OwotICAgICAgICBlc2NDbnQgKys7Ci0gICAgICB9Ci0KLSAgICAgIGRvIHsKLSAgICAgICAgb3RoZXJEYXRhTGVuVG1wID0gKGhBc3MtPm90aGVyRGF0YUxlbkJ5dGVzPj4oZXNjQ250KjgpKSAmIDB4RkY7Ci0gICAgICAgIGVzY0NudC0tOwotICAgICAgICBvdGhlckRhdGFMZW5Fc2MgPSBlc2NDbnQ+MDsKLQotICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgb3RoZXJEYXRhTGVuRXNjLCAxICk7Ci0gICAgICAgIEZES3dyaXRlQml0cyggaEJzLCBvdGhlckRhdGFMZW5UbXAsIDggKTsKLSAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9OTsKLSAgICAgIH0gd2hpbGUob3RoZXJEYXRhTGVuRXNjKTsKKyAgICBpZiAoaEFzcy0+b3RoZXJEYXRhTGVuQml0cyA+IDApIHsKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIDAsIDEpOworICAgICAgRkRLd3JpdGVCaXRzKGhCcywgaEFzcy0+b3RoZXJEYXRhTGVuQml0cywgOCk7CisgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDk7CiAgICAgfQogCi0gICAgewotICAgICAgVVNIT1JUIGNyY0NoZWNrUHJlc2VudD0wOwotICAgICAgVVNIT1JUIGNyY0NoZWNrU3VtPTA7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMSk7IC8qIGNyY0NoZWNrUHJlc2VudD0wICovCisgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSAxOwogCi0gICAgICBGREt3cml0ZUJpdHMoIGhCcywgY3JjQ2hlY2tQcmVzZW50LCAxICk7ICAgICAgICAgICAgICAgLyogY3JjQ2hlY2tQcmVzZW50ICovCi0gICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0xOwotICAgICAgaWYgKCBjcmNDaGVja1ByZXNlbnQgKXsKLSAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIGNyY0NoZWNrU3VtLCA4ICk7ICAgICAgICAgICAgICAgICAvKiBjcmNDaGVja1N1bSAqLwotICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz04OwotICAgICAgfQotICAgIH0KLQotICB9IGVsc2UgeyAgLyogaWYgKCBhdWRpb011eFZlcnNpb25BID09IDAgKSAqLworICB9IGVsc2UgeyAvKiBpZiAoIGF1ZGlvTXV4VmVyc2lvbkEgPT0gMCApICovCiAKICAgICAvKiBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgKi8KLQogICB9CiAKICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19PSzsKIH0KIAotCi1zdGF0aWMgVFJBTlNQT1JURU5DX0VSUk9SCi1Xcml0ZUF1UGF5bG9hZExlbmd0aEluZm8oIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGludCBBdUxlbmd0aEJpdHMgKQoteworc3RhdGljIFRSQU5TUE9SVEVOQ19FUlJPUiBXcml0ZUF1UGF5bG9hZExlbmd0aEluZm8oCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgaW50IEF1TGVuZ3RoQml0cykgewogICBpbnQgcmVzdEJ5dGVzOwogCi0gIGlmKCBBdUxlbmd0aEJpdHMgJSA4ICkKLSAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfQVVfTEVOR1RIOworICBpZiAoQXVMZW5ndGhCaXRzICUgOCkgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX0FVX0xFTkdUSDsKIAotICB3aGlsZSggQXVMZW5ndGhCaXRzID49IDI1NSo4ICkgewotICAgIEZES3dyaXRlQml0cyggaEJpdFN0cmVhbSwgMjU1LCA4ICk7ICAvKiAyNTUgc2hvd3MgaW5jb21wbGV0ZSBBVSAqLwotICAgIEF1TGVuZ3RoQml0cyAtPSAoMjU1KjgpOworICB3aGlsZSAoQXVMZW5ndGhCaXRzID49IDI1NSAqIDgpIHsKKyAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMjU1LCA4KTsgLyogMjU1IHNob3dzIGluY29tcGxldGUgQVUgKi8KKyAgICBBdUxlbmd0aEJpdHMgLT0gKDI1NSAqIDgpOwogICB9CiAKICAgcmVzdEJ5dGVzID0gKEF1TGVuZ3RoQml0cykgPj4gMzsKLSAgRkRLd3JpdGVCaXRzKCBoQml0U3RyZWFtLCByZXN0Qnl0ZXMsIDggKTsKKyAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHJlc3RCeXRlcywgOCk7CiAKICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19PSzsKIH0KIAotc3RhdGljCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0xhdG1TZXROck9mU3ViZnJhbWVzKCBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub1N1YmZyYW1lc19uZXh0KSAgICAvKiBuciBvZiBhY2Nlc3MgdW5pdHMgLyBwYXlsb2FkcyB3aXRoaW4gYSBsYXRtIGZyYW1lICovCitzdGF0aWMgVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19MYXRtU2V0TnJPZlN1YmZyYW1lcygKKyAgICBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywgSU5UIG5vU3ViZnJhbWVzX25leHQpIC8qIG5yIG9mIGFjY2VzcyB1bml0cyAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkcyB3aXRoaW4gYSBsYXRtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSAqLwogewogICAvKiBzYW5pdHkgY2hrICovCiAgIGlmIChub1N1YmZyYW1lc19uZXh0IDwgMSB8fCBub1N1YmZyYW1lc19uZXh0ID4gTUFYX05SX09GX1NVQkZSQU1FUykgewpAQCAtNTM4LDQ4ICs1MTMsNTAgQEAKIAogICBoQXNzLT5ub1N1YmZyYW1lc19uZXh0ID0gbm9TdWJmcmFtZXNfbmV4dDsKIAotICAvKiBpZiBhdCBzdGFydCB0aGVuIHdlIGNhbiB0YWtlIG92ZXIgdGhlIHZhbHVlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2Ugd2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgbmV4dCBTTUMgKi8KLSAgaWYgKCAoaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkgJiYgKGhBc3MtPmxhdG1GcmFtZUNvdW50ZXIgPT0gMCkgKSB7CisgIC8qIGlmIGF0IHN0YXJ0IHRoZW4gd2UgY2FuIHRha2Ugb3ZlciB0aGUgdmFsdWUgaW1tZWRpYXRlbHksIG90aGVyd2lzZSB3ZSBoYXZlCisgICAqIHRvIHdhaXQgZm9yIHRoZSBuZXh0IFNNQyAqLworICBpZiAoKGhBc3MtPnN1YkZyYW1lQ250ID09IDApICYmIChoQXNzLT5sYXRtRnJhbWVDb3VudGVyID09IDApKSB7CiAgICAgaEFzcy0+bm9TdWJmcmFtZXMgPSBub1N1YmZyYW1lc19uZXh0OwogICB9CiAKICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19PSzsKIH0KIAotc3RhdGljCi1pbnQgYWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyggSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsIFVDSEFSIG5vUHJvZ3JhbSwgVUNIQVIgbm9MYXllcltdIC8qIHJldHVybiAqLyApCi17CitzdGF0aWMgaW50IGFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcoSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsIFVDSEFSIG5vUHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBub0xheWVyW10gLyogcmV0dXJuICovKSB7CiAgIGludCBwcm9nLCBsYXllcjsKIAotICBzaWduZWQgaW50IGxhc3ROb1NhbXBsZXMgICA9IC0xOworICBzaWduZWQgaW50IGxhc3ROb1NhbXBsZXMgPSAtMTsKICAgc2lnbmVkIGludCBtaW5GcmFtZVNhbXBsZXMgPSBGREtfSU5UX01BWDsKICAgc2lnbmVkIGludCBtYXhGcmFtZVNhbXBsZXMgPSAwOwogCiAgIHNpZ25lZCBpbnQgaGlnaGVzdFNhbXBsaW5nUmF0ZSA9IC0xOwogCi0gIGZvciggcHJvZz0wOyBwcm9nPG5vUHJvZ3JhbTsgcHJvZysrICkgeworICBmb3IgKHByb2cgPSAwOyBwcm9nIDwgbm9Qcm9ncmFtOyBwcm9nKyspIHsKICAgICBub0xheWVyW3Byb2ddID0gMDsKIAotICAgIGZvciggbGF5ZXI9MDsgbGF5ZXI8TEFUTV9NQVhfTEFZRVJTOyBsYXllcisrICkKLSAgICB7Ci0gICAgICBpZiggaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXSAhPSBOVUxMICkKLSAgICAgIHsKKyAgICBmb3IgKGxheWVyID0gMDsgbGF5ZXIgPCBMQVRNX01BWF9MQVlFUlM7IGxheWVyKyspIHsKKyAgICAgIGlmIChoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdICE9IE5VTEwpIHsKICAgICAgICAgSU5UIGhzZlNhbXBsZXNGcmFtZTsKIAogICAgICAgICBub0xheWVyW3Byb2ddKys7CiAKLSAgICAgICAgaWYoIGhpZ2hlc3RTYW1wbGluZ1JhdGUgPCAwICkKKyAgICAgICAgaWYgKGhpZ2hlc3RTYW1wbGluZ1JhdGUgPCAwKQogICAgICAgICAgIGhpZ2hlc3RTYW1wbGluZ1JhdGUgPSBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdLT5zYW1wbGluZ1JhdGU7CiAKLSAgICAgICAgaHNmU2FtcGxlc0ZyYW1lID0gaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXS0+c2FtcGxlc1BlckZyYW1lICAqIGhpZ2hlc3RTYW1wbGluZ1JhdGUgLyBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdLT5zYW1wbGluZ1JhdGU7CisgICAgICAgIGhzZlNhbXBsZXNGcmFtZSA9IGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0tPnNhbXBsZXNQZXJGcmFtZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlc3RTYW1wbGluZ1JhdGUgLworICAgICAgICAgICAgICAgICAgICAgICAgICBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdLT5zYW1wbGluZ1JhdGU7CiAKLSAgICAgICAgaWYoIGhzZlNhbXBsZXNGcmFtZSA8PSBtaW5GcmFtZVNhbXBsZXMgKSBtaW5GcmFtZVNhbXBsZXMgPSBoc2ZTYW1wbGVzRnJhbWU7Ci0gICAgICAgIGlmKCBoc2ZTYW1wbGVzRnJhbWUgPj0gbWF4RnJhbWVTYW1wbGVzICkgbWF4RnJhbWVTYW1wbGVzID0gaHNmU2FtcGxlc0ZyYW1lOworICAgICAgICBpZiAoaHNmU2FtcGxlc0ZyYW1lIDw9IG1pbkZyYW1lU2FtcGxlcykKKyAgICAgICAgICBtaW5GcmFtZVNhbXBsZXMgPSBoc2ZTYW1wbGVzRnJhbWU7CisgICAgICAgIGlmIChoc2ZTYW1wbGVzRnJhbWUgPj0gbWF4RnJhbWVTYW1wbGVzKQorICAgICAgICAgIG1heEZyYW1lU2FtcGxlcyA9IGhzZlNhbXBsZXNGcmFtZTsKIAotICAgICAgICBpZiggbGFzdE5vU2FtcGxlcyA9PSAtMSApIHsKLSAgICAgICAgICBsYXN0Tm9TYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGhzZlNhbXBsZXNGcmFtZTsKKyAgICAgICAgaWYgKGxhc3ROb1NhbXBsZXMgPT0gLTEpIHsKKyAgICAgICAgICBsYXN0Tm9TYW1wbGVzID0gaHNmU2FtcGxlc0ZyYW1lOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmKCBoc2ZTYW1wbGVzRnJhbWUgIT0gbGFzdE5vU2FtcGxlcyApIHsKKyAgICAgICAgICBpZiAoaHNmU2FtcGxlc0ZyYW1lICE9IGxhc3ROb1NhbXBsZXMpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTkzLDE4ICs1NzAsMTQgQEAKIC8qKgogICogSW5pdGlhbGl6ZSBMQVRNL0xPQVMgU3RyZWFtIGFuZCBhZGQgbGF5ZXIgMCBhdCBwcm9ncmFtIDAuCiAgKi8KLXN0YXRpYwotVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19Jbml0TGF0bVN0cmVhbSggSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZnJhY3REZWxheVByZXNlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgaW50ICAgICAgICAgbXV4Q29uZmlnUGVyaW9kLCAvKiBpbnNlcnQgc2V0dXAgZGF0YSBldmVyeSBtdXhDb25maWdQZXJpb2QgZnJhbWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgYXVkaW9NdXhWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1RZUEUgICAgIHR0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworc3RhdGljIFRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfSW5pdExhdG1TdHJlYW0oCisgICAgSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsIGludCBmcmFjdERlbGF5UHJlc2VudCwKKyAgICBzaWduZWQgaW50CisgICAgICAgIG11eENvbmZpZ1BlcmlvZCwgLyogaW5zZXJ0IHNldHVwIGRhdGEgZXZlcnkgbXV4Q29uZmlnUGVyaW9kIGZyYW1lcyAqLworICAgIFVJTlQgYXVkaW9NdXhWZXJzaW9uLCBUUkFOU1BPUlRfVFlQRSB0dCkgewogICBUUkFOU1BPUlRFTkNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRFTkNfT0s7CiAKLSAgaWYgKGhBc3MgPT0gTlVMTCkKLSAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSOworICBpZiAoaEFzcyA9PSBOVUxMKSByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSOwogCiAgIGhBc3MtPnR0ID0gdHQ7CiAKQEAgLTYxMyw4MiArNTg2LDc4IEBACiAgIGhBc3MtPmF1ZGlvTXV4VmVyc2lvbiA9IGF1ZGlvTXV4VmVyc2lvbjsKIAogICAvKiBGaWxsIG5vTGF5ZXIgYXJyYXkgdXNpbmcgaEFzcy0+Y29uZmlnICovCi0gIGhBc3MtPmFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgPSBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nKCBoQXNzLCBoQXNzLT5ub1Byb2dyYW0sIGhBc3MtPm5vTGF5ZXIgKTsKKyAgaEFzcy0+YWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyA9CisgICAgICBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nKGhBc3MsIGhBc3MtPm5vUHJvZ3JhbSwgaEFzcy0+bm9MYXllcik7CiAgIC8qIE9ubHkgYWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZz09MSBpcyBzdXBwb3J0ZWQgKi8KICAgRkRLX0FTU0VSVChoQXNzLT5hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nKTsKIAogICBoQXNzLT5mcmFjdERlbGF5UHJlc2VudCA9IGZyYWN0RGVsYXlQcmVzZW50OwotICBoQXNzLT5vdGhlckRhdGFMZW5CeXRlcyA9IDA7CisgIGhBc3MtPm90aGVyRGF0YUxlbkJpdHMgPSAwOwogCiAgIGhBc3MtPnZhck1vZGUgPSBMQVRNVkFSX1NJTVBMRV9TRVFVRU5DRTsKIAogICAvKiBpbml0aWFsaXplIGNvdW50ZXJzICovCi0gIGhBc3MtPnN1YkZyYW1lQ250ICAgICAgICAgICAgICAgICAgPSAwOwotICBoQXNzLT5ub1N1YmZyYW1lcyAgICAgICAgICAgICAgICAgID0gREVGQVVMVF9MQVRNX05SX09GX1NVQkZSQU1FUzsKLSAgaEFzcy0+bm9TdWJmcmFtZXNfbmV4dCAgICAgICAgICAgICA9IERFRkFVTFRfTEFUTV9OUl9PRl9TVUJGUkFNRVM7CisgIGhBc3MtPnN1YkZyYW1lQ250ID0gMDsKKyAgaEFzcy0+bm9TdWJmcmFtZXMgPSBERUZBVUxUX0xBVE1fTlJfT0ZfU1VCRlJBTUVTOworICBoQXNzLT5ub1N1YmZyYW1lc19uZXh0ID0gREVGQVVMVF9MQVRNX05SX09GX1NVQkZSQU1FUzsKIAogICAvKiBzeW5jIGxheWVyIHJlbGF0ZWQgKi8KLSAgaEFzcy0+YXVkaW9NdXhMZW5ndGhCeXRlcyAgICAgPSAwOworICBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzID0gMDsKIAotICBoQXNzLT5sYXRtRnJhbWVDb3VudGVyICAgICAgICA9IDA7CisgIGhBc3MtPmxhdG1GcmFtZUNvdW50ZXIgPSAwOwogICBoQXNzLT5tdXhDb25maWdQZXJpb2QgPSBtdXhDb25maWdQZXJpb2Q7CiAKICAgcmV0dXJuIEVycm9yU3RhdHVzOwogfQogCi0KIC8qKgogICoKICAqLwotVUlOVCB0cmFuc3BvcnRFbmNfTGF0bUNvdW50VG90YWxCaXREZW1hbmRIZWFkZXIgKCBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcyAsIHVuc2lnbmVkIGludCBzdHJlYW1EYXRhTGVuZ3RoICkKLXsKK1VJTlQgdHJhbnNwb3J0RW5jX0xhdG1Db3VudFRvdGFsQml0RGVtYW5kSGVhZGVyKEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN0cmVhbURhdGFMZW5ndGgpIHsKICAgVUlOVCBiaXREZW1hbmQgPSAwOwogCiAgIHN3aXRjaCAoaEFzcy0+dHQpIHsKLSAgY2FzZSBUVF9NUDRfTE9BUzoKLSAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgotICBjYXNlIFRUX01QNF9MQVRNX01DUDE6Ci0gICAgaWYgKGhBc3MtPnN1YkZyYW1lQ250ID09IDApIHsKLSAgICAgIGJpdERlbWFuZCAgPSB0cmFuc3BvcnRFbmNfTGF0bUNvdW50Rml4Qml0RGVtYW5kSGVhZGVyICggaEFzcyApOwotICAgIH0KLSAgICBiaXREZW1hbmQgKz0gdHJhbnNwb3J0RW5jX0xhdG1Db3VudFZhckJpdERlbWFuZEhlYWRlciAoIGhBc3MgLCBzdHJlYW1EYXRhTGVuZ3RoIC8qLSBiaXREZW1hbmQqLyk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CisgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgorICAgICAgaWYgKGhBc3MtPnN1YkZyYW1lQ250ID09IDApIHsKKyAgICAgICAgYml0RGVtYW5kID0gdHJhbnNwb3J0RW5jX0xhdG1Db3VudEZpeEJpdERlbWFuZEhlYWRlcihoQXNzKTsKKyAgICAgIH0KKyAgICAgIGJpdERlbWFuZCArPSB0cmFuc3BvcnRFbmNfTGF0bUNvdW50VmFyQml0RGVtYW5kSGVhZGVyKAorICAgICAgICAgIGhBc3MsIHN0cmVhbURhdGFMZW5ndGggLyotIGJpdERlbWFuZCovKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgfQogCiAgIHJldHVybiBiaXREZW1hbmQ7CiB9CiAKLXN0YXRpYyBUUkFOU1BPUlRFTkNfRVJST1IKLUFkdmFuY2VBdWRpb011eEVsZW1lbnQgKAotICAgICAgICBIQU5ETEVfTEFUTV9TVFJFQU0gICBoQXNzLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIGF1Qml0cywKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnVmZmVyRnVsbG5lc3MsCi0gICAgICAgIENTVHBDYWxsQmFja3MgICAgKmNiCi0gICAgICAgICkKLXsKK3N0YXRpYyBUUkFOU1BPUlRFTkNfRVJST1IgQWR2YW5jZUF1ZGlvTXV4RWxlbWVudChIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1Qml0cywgaW50IGJ1ZmZlckZ1bGxuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTVHBDYWxsQmFja3MgKmNiKSB7CiAgIFRSQU5TUE9SVEVOQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVEVOQ19PSzsKICAgaW50IGluc2VydE11eFNldHVwOwogCiAgIC8qIEluc2VydCBzZXR1cCBkYXRhIHRvIGFzc2VtYmxlIEJ1ZmZlciAqLwotICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkKLSAgeworICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkgewogICAgIGlmIChoQXNzLT5tdXhDb25maWdQZXJpb2QgPiAwKSB7CiAgICAgICBpbnNlcnRNdXhTZXR1cCA9IChoQXNzLT5sYXRtRnJhbWVDb3VudGVyID09IDApOwotICAgIH0gZWxzZSAgeworICAgIH0gZWxzZSB7CiAgICAgICBpbnNlcnRNdXhTZXR1cCA9IDA7CiAgICAgfQogCiAgICAgaWYgKGhBc3MtPnR0ICE9IFRUX01QNF9MQVRNX01DUDApIHsKLSAgICAgIGlmKCBpbnNlcnRNdXhTZXR1cCApIHsKLSAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIDAsIDEgKTsgIC8qIHVzZVNhbWVTdHJlYW1NdXggdXNlTmV3U3RyZWFtTXV4ICovCi0gICAgICAgIENyZWF0ZVN0cmVhbU11eENvbmZpZyhoQXNzLCBoQnMsIGJ1ZmZlckZ1bGxuZXNzLCBjYik7Ci0gICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBUUkFOU1BPUlRFTkNfT0spCisgICAgICBpZiAoaW5zZXJ0TXV4U2V0dXApIHsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMSk7IC8qIHVzZVNhbWVTdHJlYW1NdXggdXNlTmV3U3RyZWFtTXV4ICovCisgICAgICAgIGlmIChUUkFOU1BPUlRFTkNfT0sgIT0gKEVycm9yU3RhdHVzID0gQ3JlYXRlU3RyZWFtTXV4Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFzcywgaEJzLCBidWZmZXJGdWxsbmVzcywgY2IpKSkgewogICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgICAgfQogICAgICAgfSBlbHNlIHsKLSAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIDEsIDEgKTsgICAvKiB1c2VTYW1lU3RyZWFtTXV4ICovCisgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIDEsIDEpOyAvKiB1c2VTYW1lU3RyZWFtTXV4ICovCiAgICAgICB9CiAgICAgfQogICB9CkBAIC02OTksOSArNjY4LDggQEAKIAogICAgIGZvciAocHJvZyA9IDA7IHByb2cgPCBoQXNzLT5ub1Byb2dyYW07IHByb2crKykgewogICAgICAgZm9yIChsYXllciA9IDA7IGxheWVyIDwgaEFzcy0+bm9MYXllcltwcm9nXTsgbGF5ZXIrKykgewotICAgICAgICBFcnJvclN0YXR1cyA9IFdyaXRlQXVQYXlsb2FkTGVuZ3RoSW5mbyggaEJzLCBhdUJpdHMgKTsKLSAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IFRSQU5TUE9SVEVOQ19PSykKLSAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgICAgICAgIEVycm9yU3RhdHVzID0gV3JpdGVBdVBheWxvYWRMZW5ndGhJbmZvKGhCcywgYXVCaXRzKTsKKyAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IFRSQU5TUE9SVEVOQ19PSykgcmV0dXJuIEVycm9yU3RhdHVzOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNzExLDE0ICs2NzksOCBAQAogfQogCiBUUkFOU1BPUlRFTkNfRVJST1IKLXRyYW5zcG9ydEVuY19MYXRtV3JpdGUgKAotICAgICAgICBIQU5ETEVfTEFUTV9TVFJFQU0gICAgaEFzcywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGF1Qml0cywKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGJ1ZmZlckZ1bGxuZXNzLAotICAgICAgICBDU1RwQ2FsbEJhY2tzICAgICAqY2IKLSAgICAgICAgKQotewordHJhbnNwb3J0RW5jX0xhdG1Xcml0ZShIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVCaXRzLCBpbnQgYnVmZmVyRnVsbG5lc3MsIENTVHBDYWxsQmFja3MgKmNiKSB7CiAgIFRSQU5TUE9SVEVOQ19FUlJPUiBFcnJvclN0YXR1czsKIAogICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkgewpAQCAtNzMyLDgxICs2OTQsNzYgQEAKICAgICAgLSBvbmx5IGlmIGxvYXMKICAgICAgLSB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3luY3dvcmQgZGlzdGFuY2UgKD1hdWRpb211eGxlbmd0aGJ5dGVzKSBsYXRlcgogICAgKi8KLSAgaWYoIGhBc3MtPnR0ID09IFRUX01QNF9MT0FTICYmIGhBc3MtPnN1YkZyYW1lQ250ID09IDApCi0gIHsKKyAgaWYgKGhBc3MtPnR0ID09IFRUX01QNF9MT0FTICYmIGhBc3MtPnN1YkZyYW1lQ250ID09IDApIHsKICAgICAvKiBTdGFydCBuZXcgTE9BUyBmcmFtZSAqLwotICAgIEZES3dyaXRlQml0cyggaEJzLCAweDJCNywgMTEgKTsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCAweDJCNywgMTEpOwogICAgIGhBc3MtPmF1ZGlvTXV4TGVuZ3RoQnl0ZXMgPSAwOwotICAgIGhBc3MtPmF1ZGlvTXV4TGVuZ3RoQnl0ZXNQb3MgPSBGREtnZXRWYWxpZEJpdHMoIGhCcyApOyAgLyogc3RvcmUgcmVhZCBwb2ludGVyIHBvc2l0aW9uICovCi0gICAgRkRLd3JpdGVCaXRzKCBoQnMsIGhBc3MtPmF1ZGlvTXV4TGVuZ3RoQnl0ZXMsIDEzICk7CisgICAgaEFzcy0+YXVkaW9NdXhMZW5ndGhCeXRlc1BvcyA9CisgICAgICAgIEZES2dldFZhbGlkQml0cyhoQnMpOyAvKiBzdG9yZSByZWFkIHBvaW50ZXIgcG9zaXRpb24gKi8KKyAgICBGREt3cml0ZUJpdHMoaEJzLCBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzLCAxMyk7CiAgIH0KIAotICBFcnJvclN0YXR1cyA9IEFkdmFuY2VBdWRpb011eEVsZW1lbnQoCi0gICAgICAgICAgaEFzcywKLSAgICAgICAgICBoQnMsCi0gICAgICAgICAgYXVCaXRzLAotICAgICAgICAgIGJ1ZmZlckZ1bGxuZXNzLAotICAgICAgICAgIGNiCi0gICAgICAgICAgKTsKKyAgRXJyb3JTdGF0dXMgPSBBZHZhbmNlQXVkaW9NdXhFbGVtZW50KGhBc3MsIGhCcywgYXVCaXRzLCBidWZmZXJGdWxsbmVzcywgY2IpOwogCi0gIGlmIChFcnJvclN0YXR1cyAhPSBUUkFOU1BPUlRFTkNfT0spCi0gICAgcmV0dXJuIEVycm9yU3RhdHVzOworICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JURU5DX09LKSByZXR1cm4gRXJyb3JTdGF0dXM7CiAKICAgcmV0dXJuIEVycm9yU3RhdHVzOwogfQogCi12b2lkIHRyYW5zcG9ydEVuY19MYXRtQWRqdXN0U3ViZnJhbWVCaXRzKEhBTkRMRV9MQVRNX1NUUkVBTSAgICBoQXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqYml0cykKLXsKK3ZvaWQgdHJhbnNwb3J0RW5jX0xhdG1BZGp1c3RTdWJmcmFtZUJpdHMoSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsIGludCAqYml0cykgewogICAvKiBTdWJzdHJhY3QgYml0cyBmcm9tIHBvc3NpYmxlIHByZXZpb3VzIHN1YmZyYW1lICovCiAgICpiaXRzIC09IGhBc3MtPmxhdG1TdWJmcmFtZVN0YXJ0OwogICAvKiBBZGQgZmlsbCBiaXRzICovCi0gIGlmIChoQXNzLT5zdWJGcmFtZUNudCA9PSAwKQorICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkgeworICAgICpiaXRzICs9IGhBc3MtPm90aGVyRGF0YUxlbkJpdHM7CiAgICAgKmJpdHMgKz0gaEFzcy0+ZmlsbEJpdHM7CisgIH0KIH0KIAotCi12b2lkIHRyYW5zcG9ydEVuY19MYXRtR2V0RnJhbWUoSEFORExFX0xBVE1fU1RSRUFNICAgIGhBc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqYnl0ZXMpCi17CitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0xhdG1HZXRGcmFtZShIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcEJ5dGVzKSB7CisgIFRSQU5TUE9SVEVOQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVEVOQ19PSzsKIAogICBoQXNzLT5zdWJGcmFtZUNudCsrOwotICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQgPj0gaEFzcy0+bm9TdWJmcmFtZXMpCi0gIHsKLQorICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQgPj0gaEFzcy0+bm9TdWJmcmFtZXMpIHsKICAgICAvKiBBZGQgTE9BUyBmcmFtZSBsZW5ndGggaWYgcmVxdWlyZWQuICovCi0gICAgaWYgKGhBc3MtPnR0ID09IFRUX01QNF9MT0FTKQotICAgIHsKLSAgICAgIGludCBsYXRtQnl0ZXM7CisgICAgaWYgKGhBc3MtPnR0ID09IFRUX01QNF9MT0FTKSB7CisgICAgICBGREtfQklUU1RSRUFNIHRtcEJ1ZjsKIAotICAgICAgbGF0bUJ5dGVzID0gKEZES2dldFZhbGlkQml0cyhoQnMpKzcpID4+IDM7CisgICAgICAvKiBEZXRlcm1pbmUgZnJhbWUgbGVuZ3RoIGluZm8gKi8KKyAgICAgIGhBc3MtPmF1ZGlvTXV4TGVuZ3RoQnl0ZXMgPQorICAgICAgICAgICgoRkRLZ2V0VmFsaWRCaXRzKGhCcykgKyBoQXNzLT5vdGhlckRhdGFMZW5CaXRzICsgNykgPj4gMykgLQorICAgICAgICAgIDM7IC8qIDM9U3luY3dvcmQgKyBsZW5ndGggKi8KIAotICAgICAgLyogd3JpdGUgbGVuZ3RoIGluZm8gaW50byBhc3NlbWJsZXIgYnVmZmVyICovCi0gICAgICBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzID0gbGF0bUJ5dGVzIC0gMzsgLyogMz1TeW5jd29yZCArIGxlbmd0aCAqLwotICAgICAgewotICAgICAgICBGREtfQklUU1RSRUFNIHRtcEJ1ZjsKLQotICAgICAgICBGREtpbml0Qml0U3RyZWFtKCAmdG1wQnVmLCBoQnMtPmhCaXRCdWYuQnVmZmVyLCBoQnMtPmhCaXRCdWYuYnVmU2l6ZSwgMCwgQlNfV1JJVEVSICkgOwotICAgICAgICBGREtwdXNoRm9yKCAmdG1wQnVmLCBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzUG9zICk7Ci0gICAgICAgIEZES3dyaXRlQml0cyggJnRtcEJ1ZiwgaEFzcy0+YXVkaW9NdXhMZW5ndGhCeXRlcywgMTMgKTsKLSAgICAgICAgRkRLc3luY0NhY2hlKCAmdG1wQnVmICk7CisgICAgICAvKiBDaGVjayBmcmFtZSBsZW5ndGggaW5mbyAqLworICAgICAgaWYgKGhBc3MtPmF1ZGlvTXV4TGVuZ3RoQnl0ZXMgPj0gKDEgPDwgMTMpKSB7CisgICAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JURU5DX0lOVkFMSURfQVVfTEVOR1RIOworICAgICAgICBnb3RvIGJhaWw7CiAgICAgICB9CisKKyAgICAgIC8qIFdyaXRlIGxlbmd0aCBpbmZvIGludG8gYXNzZW1ibGVyIGJ1ZmZlciAqLworICAgICAgRkRLaW5pdEJpdFN0cmVhbSgmdG1wQnVmLCBoQnMtPmhCaXRCdWYuQnVmZmVyLCBoQnMtPmhCaXRCdWYuYnVmU2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgQlNfV1JJVEVSKTsKKyAgICAgIEZES3B1c2hGb3IoJnRtcEJ1ZiwgaEFzcy0+YXVkaW9NdXhMZW5ndGhCeXRlc1Bvcyk7CisgICAgICBGREt3cml0ZUJpdHMoJnRtcEJ1ZiwgaEFzcy0+YXVkaW9NdXhMZW5ndGhCeXRlcywgMTMpOworICAgICAgRkRLc3luY0NhY2hlKCZ0bXBCdWYpOwogICAgIH0KIAorICAgIC8qIFdyaXRlIEF1ZGlvTXV4RWxlbWVudCBvdGhlciBkYXRhIGJpdHMgKi8KKyAgICBGREt3cml0ZUJpdHMoaEJzLCAwLCBoQXNzLT5vdGhlckRhdGFMZW5CaXRzKTsKKwogICAgIC8qIFdyaXRlIEF1ZGlvTXV4RWxlbWVudCBieXRlIGFsaWdubWVudCBmaWxsIGJpdHMgKi8KICAgICBGREt3cml0ZUJpdHMoaEJzLCAwLCBoQXNzLT5maWxsQml0cyk7CiAKLSAgICBGREtfQVNTRVJUKCAoRkRLZ2V0VmFsaWRCaXRzKGhCcykgJSA4KSA9PSAwKTsKKyAgICBGREtfQVNTRVJUKChGREtnZXRWYWxpZEJpdHMoaEJzKSAlIDgpID09IDApOwogCiAgICAgaEFzcy0+c3ViRnJhbWVDbnQgPSAwOwogCiAgICAgRkRLc3luY0NhY2hlKGhCcyk7Ci0gICAgKmJ5dGVzID0gKEZES2dldFZhbGlkQml0cyhoQnMpICsgNyk+PjM7Ci0gICAgLy9GREtmZXRjaEJ1ZmZlcihoQnMsIGJ1ZmZlciwgKFVJTlQqKWJ5dGVzKTsKKyAgICAqcEJ5dGVzID0gKEZES2dldFZhbGlkQml0cyhoQnMpICsgNykgPj4gMzsKIAotICAgIGlmIChoQXNzLT5tdXhDb25maWdQZXJpb2QgPiAwKQotICAgIHsKKyAgICBpZiAoaEFzcy0+bXV4Q29uZmlnUGVyaW9kID4gMCkgewogICAgICAgaEFzcy0+bGF0bUZyYW1lQ291bnRlcisrOwogCiAgICAgICBpZiAoaEFzcy0+bGF0bUZyYW1lQ291bnRlciA+PSBoQXNzLT5tdXhDb25maWdQZXJpb2QpIHsKQEAgLTgxNiwzMiArNzczLDMyIEBACiAgICAgfQogICB9IGVsc2UgewogICAgIC8qIE5vIGRhdGEgdGhpcyB0aW1lICovCi0gICAgKmJ5dGVzID0gMDsKKyAgICAqcEJ5dGVzID0gMDsKICAgfQorCitiYWlsOgorICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CiAKIC8qKgogICogSW5pdCBMQVRNL0xPQVMKICAqLwotVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19MYXRtX0luaXQoCi0gICAgICAgIEhBTkRMRV9MQVRNX1NUUkVBTSAgaEFzcywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICBDT0RFUl9DT05GSUcgICpsYXllckNvbmZpZywKLSAgICAgICAgVUlOVCBhdWRpb011eFZlcnNpb24sCi0gICAgICAgIFRSQU5TUE9SVF9UWVBFIHR0LAotICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgotICAgICAgICApCi17CitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0xhdG1fSW5pdChIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAqbGF5ZXJDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGF1ZGlvTXV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9UWVBFIHR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IpIHsKICAgVFJBTlNQT1JURU5DX0VSUk9SIEVycm9yU3RhdHVzOwogICBpbnQgZnJhY3REZWxheVByZXNlbnQgPSAwOwogICBpbnQgcHJvZywgbGF5ZXI7CiAKICAgaW50IHNldHVwRGF0YURpc3RhbmNlRnJhbWVzID0gbGF5ZXJDb25maWctPmhlYWRlclBlcmlvZDsKIAotICBGREtfQVNTRVJUKHNldHVwRGF0YURpc3RhbmNlRnJhbWVzPj0wKTsKKyAgRkRLX0FTU0VSVChzZXR1cERhdGFEaXN0YW5jZUZyYW1lcyA+PSAwKTsKIAotICBmb3IgKHByb2c9MDsgcHJvZzxMQVRNX01BWF9QUk9HUkFNUzsgcHJvZysrKSB7Ci0gICAgZm9yIChsYXllcj0wOyBsYXllcjxMQVRNX01BWF9MQVlFUlM7IGxheWVyKyspIHsKKyAgZm9yIChwcm9nID0gMDsgcHJvZyA8IExBVE1fTUFYX1BST0dSQU1TOyBwcm9nKyspIHsKKyAgICBmb3IgKGxheWVyID0gMDsgbGF5ZXIgPCBMQVRNX01BWF9MQVlFUlM7IGxheWVyKyspIHsKICAgICAgIGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0gPSBOVUxMOwogICAgICAgaEFzcy0+bV9saW5mb1twcm9nXVtsYXllcl0uc3RyZWFtSUQgPSAtMTsKICAgICB9CkBAIC04NTAsMzIgKzgwNyw0NCBAQAogICBoQXNzLT5jb25maWdbMF1bMF0gPSBsYXllckNvbmZpZzsKICAgaEFzcy0+bV9saW5mb1swXVswXS5zdHJlYW1JRCA9IDA7CiAKLSAgRXJyb3JTdGF0dXMgPSB0cmFuc3BvcnRFbmNfSW5pdExhdG1TdHJlYW0oIGhBc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFjdERlbGF5UHJlc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwRGF0YURpc3RhbmNlRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvTXV4VmVyc2lvbik/MTowLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gIGlmIChFcnJvclN0YXR1cyAhPSBUUkFOU1BPUlRFTkNfT0spCi0gICAgZ290byBiYWlsOworICBFcnJvclN0YXR1cyA9IHRyYW5zcG9ydEVuY19Jbml0TGF0bVN0cmVhbShoQXNzLCBmcmFjdERlbGF5UHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXBEYXRhRGlzdGFuY2VGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb011eFZlcnNpb24pID8gMSA6IDAsIHR0KTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IFRSQU5TUE9SVEVOQ19PSykgZ290byBiYWlsOwogCi0gIEVycm9yU3RhdHVzID0gdHJhbnNwb3J0RW5jX0xhdG1TZXROck9mU3ViZnJhbWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyQ29uZmlnLT5uU3ViRnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gIGlmIChFcnJvclN0YXR1cyAhPSBUUkFOU1BPUlRFTkNfT0spCi0gICAgZ290byBiYWlsOworICBFcnJvclN0YXR1cyA9CisgICAgICB0cmFuc3BvcnRFbmNfTGF0bVNldE5yT2ZTdWJmcmFtZXMoaEFzcywgbGF5ZXJDb25maWctPm5TdWJGcmFtZXMpOworICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JURU5DX09LKSBnb3RvIGJhaWw7CiAKICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBTdHJlYW1NdXhDb25maWcgc29tZWhvdyAqLwotICBBZHZhbmNlQXVkaW9NdXhFbGVtZW50KGhBc3MsIGhCcywgMCwgMCwgY2IpOwotICAvL0NyZWF0ZVN0cmVhbU11eENvbmZpZyhoQXNzLCBoQnMsIDApOworICBpZiAoVFJBTlNQT1JURU5DX09LICE9CisgICAgICAoRXJyb3JTdGF0dXMgPSBBZHZhbmNlQXVkaW9NdXhFbGVtZW50KGhBc3MsIGhCcywgMCwgMCwgY2IpKSkgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8vIENyZWF0ZVN0cmVhbU11eENvbmZpZyhoQXNzLCBoQnMsIDApOwogCiBiYWlsOgogICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CiAKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfTGF0bUFkZE90aGVyRGF0YUJpdHMoSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdGhlckRhdGFCaXRzKSB7CisgIFRSQU5TUE9SVEVOQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVEVOQ19PSzsKIAorICBpZiAoKGhBc3MtPm90aGVyRGF0YUxlbkJpdHMgIT0gMCkgfHwgKG90aGVyRGF0YUJpdHMgJSA4ICE9IDApKSB7CisgICAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgdG8gYWRkIG90aGVyIGRhdGEgYml0cyBvbmx5IG9uY2UuCisgICAgICAgVG8ga2VlcCBleGlzdGluZyBhbGlnbm1lbnQgb25seSB3aG9sZSBieXRlcyBhcmUgYWxsb3dlZC4gKi8KKyAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVEVOQ19VTktPV05fRVJST1I7CisgIH0gZWxzZSB7CisgICAgLyogRW5zdXJlIGNvcnJlY3QgYWRkaW9uYWwgYml0cyBpbiBwYXlsb2FkLiAqLworICAgIGlmIChoQXNzLT50dCA9PSBUVF9NUDRfTEFUTV9NQ1AwKSB7CisgICAgICBoQXNzLT5vdGhlckRhdGFMZW5CaXRzID0gb3RoZXJEYXRhQml0czsKKyAgICB9IGVsc2UgeworICAgICAgaEFzcy0+b3RoZXJEYXRhTGVuQml0cyA9IG90aGVyRGF0YUJpdHMgLSA5OworICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSA5OworICAgIH0KKyAgfQogCi0KLQotCisgIHJldHVybiBFcnJvclN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfbGF0bS5oIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19sYXRtLmgKaW5kZXggMzRlZWE1OC4uZDY1MDM1NyAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19sYXRtLmgKKysrIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19sYXRtLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzUgKzkwLDM1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFRQRU5DX0xBVE1fSAogI2RlZmluZSBUUEVOQ19MQVRNX0gKIAotCi0KICNpbmNsdWRlICJ0cGVuY19saWIuaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKLQogI2RlZmluZSBERUZBVUxUX0xBVE1fTlJfT0ZfU1VCRlJBTUVTIDEKLSNkZWZpbmUgREVGQVVMVF9MQVRNX1NNQ19SRVBFQVQgICAgICA4CisjZGVmaW5lIERFRkFVTFRfTEFUTV9TTUNfUkVQRUFUIDgKIAotI2RlZmluZSBNQVhfQUFDX0xBWUVSUyAgICAgICAgOQorI2RlZmluZSBNQVhfQUFDX0xBWUVSUyA5CiAKLSNkZWZpbmUgTEFUTV9NQVhfUFJPR1JBTVMgICAgIDEKLSNkZWZpbmUgTEFUTV9NQVhfU1RSRUFNX0lEICAgMTYKKyNkZWZpbmUgTEFUTV9NQVhfUFJPR1JBTVMgMQorI2RlZmluZSBMQVRNX01BWF9TVFJFQU1fSUQgMTYKIAotI2RlZmluZSBMQVRNX01BWF9MQVlFUlMgICAgICAgMSAvKk1BWF9BQUNfTEFZRVJTKi8KKyNkZWZpbmUgTEFUTV9NQVhfTEFZRVJTIDEgLypNQVhfQUFDX0xBWUVSUyovCiAKLSNkZWZpbmUgTUFYX05SX09GX1NVQkZSQU1FUyAgIDIgICAgICAgICAgIC8qIHNldCB0aGlzIGNhcmVmdWxseSB0byBhdm9pZCBidWZmZXIgb3ZlcmZsb3dzICovCisjZGVmaW5lIE1BWF9OUl9PRl9TVUJGUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAyIC8qIHNldCB0aGlzIGNhcmVmdWxseSB0byBhdm9pZCBidWZmZXIgb3ZlcmZsb3dzIFwKKyAgICAgKi8KIAogdHlwZWRlZiBlbnVtIHsgTEFUTVZBUl9TSU1QTEVfU0VRVUVOQ0UgfSBMQVRNX1ZBUl9NT0RFOwogCkBAIC0xMTgsNjcgKzEyOSw4MCBAQAogICBzaWduZWQgaW50IHN0cmVhbUlEOwogfSBMQVRNX0xBWUVSX0lORk87CiAKLQogdHlwZWRlZiBzdHJ1Y3QgewotICBMQVRNX0xBWUVSX0lORk8gICAgICBtX2xpbmZvW0xBVE1fTUFYX1BST0dSQU1TXVtMQVRNX01BWF9MQVlFUlNdOwotICBDT0RFUl9DT05GSUcgICAgICAgICpjb25maWdbTEFUTV9NQVhfUFJPR1JBTVNdW0xBVE1fTUFYX0xBWUVSU107CisgIExBVE1fTEFZRVJfSU5GTyBtX2xpbmZvW0xBVE1fTUFYX1BST0dSQU1TXVtMQVRNX01BWF9MQVlFUlNdOworICBDT0RFUl9DT05GSUcgKmNvbmZpZ1tMQVRNX01BWF9QUk9HUkFNU11bTEFUTV9NQVhfTEFZRVJTXTsKIAotICBMQVRNX1ZBUl9NT0RFICAgICAgICB2YXJNb2RlOwotICBUUkFOU1BPUlRfVFlQRSAgICAgICB0dDsKKyAgTEFUTV9WQVJfTU9ERSB2YXJNb2RlOworICBUUkFOU1BPUlRfVFlQRSB0dDsKIAotICBpbnQgICAgICAgICAgICAgICAgICBhdWRpb011eExlbmd0aEJ5dGVzOworICBpbnQgYXVkaW9NdXhMZW5ndGhCeXRlczsKIAotICBpbnQgICAgICAgICAgICAgICAgICBhdWRpb011eExlbmd0aEJ5dGVzUG9zOwotICBpbnQgICAgICAgICAgICAgICAgICB0YXJhQnVmZmVyRnVsbG5lc3M7IC8qIHN0YXRlIG9mIHRoZSBiaXQgcmVzZXJ2b2lyICovCi0gIGludCAgICAgICAgICAgICAgICAgIHZhclN0cmVhbUNudDsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgb3RoZXJEYXRhTGVuQnl0ZXM7CisgIGludCBhdWRpb011eExlbmd0aEJ5dGVzUG9zOworICBpbnQgdGFyYUJ1ZmZlckZ1bGxuZXNzOyAvKiBzdGF0ZSBvZiB0aGUgYml0IHJlc2Vydm9pciAqLworICBpbnQgdmFyU3RyZWFtQ250OwogCi0gIFVDSEFSICAgICAgICAgICAgICAgIGxhdG1GcmFtZUNvdW50ZXI7ICAgLyogQ3VycmVudCBmcmFtZSBudW1iZXIuIENvdW50cyBtb2R1bG8gbXV4Q29uZmlnUGVyaW9kICovCi0gIFVDSEFSICAgICAgICAgICAgICAgIG11eENvbmZpZ1BlcmlvZDsgICAgLyogRGlzdGFuY2UgaW4gZnJhbWVzIGJldHdlZW4gTXV4Q29uZmlnICovCisgIFVDSEFSCisgIGxhdG1GcmFtZUNvdW50ZXI7ICAgICAgLyogQ3VycmVudCBmcmFtZSBudW1iZXIuIENvdW50cyBtb2R1bG8gbXV4Q29uZmlnUGVyaW9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVDSEFSIG11eENvbmZpZ1BlcmlvZDsgLyogRGlzdGFuY2UgaW4gZnJhbWVzIGJldHdlZW4gTXV4Q29uZmlnICovCiAKLSAgVUNIQVIgICAgICAgICAgICAgICAgYXVkaW9NdXhWZXJzaW9uOyAgICAvKiBBTVYxIHN1cHBvcnRzIHRyYW5zbWlzc2lvbiBvZiB0YXJhQnVmZmVyRnVsbG5lc3MgYW5kIEFTQyBsZW5ndGhzICovCi0gIFVDSEFSICAgICAgICAgICAgICAgIGF1ZGlvTXV4VmVyc2lvbkE7ICAgLyogZm9yIGZ1dHVyZSBleHRlbnNpb25zICovCisgIFVDSEFSCisgIGF1ZGlvTXV4VmVyc2lvbjsgLyogQU1WMSBzdXBwb3J0cyB0cmFuc21pc3Npb24gb2YgdGFyYUJ1ZmZlckZ1bGxuZXNzIGFuZAorICAgICAgICAgICAgICAgICAgICAgIEFTQyBsZW5ndGhzICovCisgIFVDSEFSIGF1ZGlvTXV4VmVyc2lvbkE7IC8qIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyAqLwogCi0gIFVDSEFSICAgICAgICAgICAgICAgIG5vUHJvZ3JhbTsKLSAgVUNIQVIgICAgICAgICAgICAgICAgbm9MYXllcltMQVRNX01BWF9QUk9HUkFNU107Ci0gIFVDSEFSICAgICAgICAgICAgICAgIGZyYWN0RGVsYXlQcmVzZW50OworICBVQ0hBUiBub1Byb2dyYW07CisgIFVDSEFSIG5vTGF5ZXJbTEFUTV9NQVhfUFJPR1JBTVNdOworICBVQ0hBUiBmcmFjdERlbGF5UHJlc2VudDsKIAotICBVQ0hBUiAgICAgICAgICAgICAgICBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nOwotICBVQ0hBUiAgICAgICAgICAgICAgICBzdWJGcmFtZUNudDsgICAgICAgIC8qIEN1cnJlbnQgU3ViZnJhbWUgZnJhbWUgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICAgbm9TdWJmcmFtZXM7ICAgICAgICAvKiBOdW1iZXIgb2Ygc3ViZnJhbWVzICAgICovCi0gIFVJTlQgICAgICAgICAgICAgICAgIGxhdG1TdWJmcmFtZVN0YXJ0OyAgLyogUG9zaXRpb24gb2YgY3VycmVudCBzdWJmcmFtZSBzdGFydCAqLwotICBVQ0hBUiAgICAgICAgICAgICAgICBub1N1YmZyYW1lc19uZXh0OworICBVQ0hBUiBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nOworICBVQ0hBUiBzdWJGcmFtZUNudDsgICAgICAvKiBDdXJyZW50IFN1YmZyYW1lIGZyYW1lICovCisgIFVDSEFSIG5vU3ViZnJhbWVzOyAgICAgIC8qIE51bWJlciBvZiBzdWJmcmFtZXMgICAgKi8KKyAgVUlOVCBsYXRtU3ViZnJhbWVTdGFydDsgLyogUG9zaXRpb24gb2YgY3VycmVudCBzdWJmcmFtZSBzdGFydCAqLworICBVQ0hBUiBub1N1YmZyYW1lc19uZXh0OwogCi0gIFVDSEFSICAgICAgICAgICAgICAgIGZpbGxCaXRzOyAgICAgICAgICAgLyogQXVkaW9NdXhFbGVtZW50IGZpbGwgYml0cyAqLwotICBVQ0hBUiAgICAgICAgICAgICAgICBzdHJlYW1NdXhDb25maWdCaXRzOworICBVQ0hBUiBvdGhlckRhdGFMZW5CaXRzOyAvKiBBdWRpb011eEVsZW1lbnQgb3RoZXIgZGF0YSBiaXRzICovCisgIFVDSEFSIGZpbGxCaXRzOyAgICAgICAgIC8qIEF1ZGlvTXV4RWxlbWVudCBmaWxsIGJpdHMgKi8KKyAgVUlOVCBzdHJlYW1NdXhDb25maWdCaXRzOwogCiB9IExBVE1fU1RSRUFNOwogCiB0eXBlZGVmIExBVE1fU1RSRUFNICpIQU5ETEVfTEFUTV9TVFJFQU07CiAKIC8qKgotICogXGJyaWVmIEluaXRpYWxpemUgTEFUTV9TVFJFQU0gSGFuZGxlLiBDcmVhdGVzIGF1dG9tYXRpY2FsbHkgb25lIHByb2dyYW0gd2l0aCBvbmUgbGF5ZXIgd2l0aAotICogICAgICAgIHRoZSBnaXZlbiBsYXllckNvbmZpZy4gVGhlIGxheWVyQ29uZmlnIG11c3QgYmUgcGVyc2lzdGVuIGJlY2F1c2UgcmVmZXJlbmNlcyB0byB0aGlzIHBvaW50ZXIKLSAqICAgICAgICBhcmUgbWFkZSBhdCBhbnkgdGltZSBhZ2Fpbi4KLSAqICAgICAgICBVc2UgdHJhbnNwb3J0RW5jX0xhdG1fQWRkTGF5ZXIoKSB0byBhZGQgbW9yZSBwcm9ncmFtcy9sYXllcnMuCisgKiBcYnJpZWYgSW5pdGlhbGl6ZSBMQVRNX1NUUkVBTSBIYW5kbGUuIENyZWF0ZXMgYXV0b21hdGljYWxseSBvbmUgcHJvZ3JhbSB3aXRoCisgKiBvbmUgbGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gbGF5ZXJDb25maWcuIFRoZSBsYXllckNvbmZpZyBtdXN0IGJlIHBlcnNpc3RlbgorICogYmVjYXVzZSByZWZlcmVuY2VzIHRvIHRoaXMgcG9pbnRlciBhcmUgbWFkZSBhdCBhbnkgdGltZSBhZ2Fpbi4gVXNlCisgKiB0cmFuc3BvcnRFbmNfTGF0bV9BZGRMYXllcigpIHRvIGFkZCBtb3JlIHByb2dyYW1zL2xheWVycy4KICAqCiAgKiBccGFyYW0gaExhdG1TdHJlYW1JbmZvIEhBTkRMRV9MQVRNX1NUUkVBTSBoYW5kbGUKICAqIFxwYXJhbSBoQnMgQml0c3RyZWFtIGhhbmRsZQotICogXHBhcmFtIGxheWVyQ29uZmlnIGEgdmFsaWQgQ09ERVJfQ09ORklHIHN0cnVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IGF1ZGlvIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICogXHBhcmFtIGxheWVyQ29uZmlnIGEgdmFsaWQgQ09ERVJfQ09ORklHIHN0cnVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IGF1ZGlvCisgKiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAqIFxwYXJhbSBhdWRpb011eFZlcnNpb24gdGhlIExBVE0gYXVkaW9NdXhWZXJzaW9uIHRvIGJlIHVzZWQKLSAqIFxwYXJhbSB0dCB0aGUgc3BlY2lmaWMgVFJBTlNQT1JUX1RZUEUgdG8gYmUgdXNlZCwgZWl0aGVyIFRUX01QNF9MT0FTLCBUVF9NUDRfTEFUTV9NQ1AxIG9yIFRUX01QNF9MQVRNX01DUDAgTE9BUworICogXHBhcmFtIHR0IHRoZSBzcGVjaWZpYyBUUkFOU1BPUlRfVFlQRSB0byBiZSB1c2VkLCBlaXRoZXIgVFRfTVA0X0xPQVMsCisgKiBUVF9NUDRfTEFUTV9NQ1AxIG9yIFRUX01QNF9MQVRNX01DUDAgTE9BUwogICogXHBhcmFtIGNiIGNhbGxiYWNrIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KICAqCiAgKiBccmV0dXJuIGFuIFRSQU5TUE9SVEVOQ19FUlJPUiBlcnJvciBjb2RlCiAgKi8KLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfTGF0bV9Jbml0KAotICAgICAgICBIQU5ETEVfTEFUTV9TVFJFQU0gaExhdG1TdHJlYW1JbmZvLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIENPREVSX0NPTkZJRyAqbGF5ZXJDb25maWcsCi0gICAgICAgIFVJTlQgYXVkaW9NdXhWZXJzaW9uLAotICAgICAgICBUUkFOU1BPUlRfVFlQRSB0dCwKLSAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IKLSAgICAgICAgKTsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfTGF0bV9Jbml0KEhBTkRMRV9MQVRNX1NUUkVBTSBoTGF0bVN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKmxheWVyQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhdWRpb011eFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfVFlQRSB0dCwgQ1NUcENhbGxCYWNrcyAqY2IpOworCisvKioKKyAqIFxicmllZiBXcml0ZSBhZGRpb25hbCBvdGhlciBkYXRhIGJpdHMgaW4gQXVkaW9NdXhFbGVtZW50CisgKgorICogXHBhcmFtIGhBc3MgSEFORExFX0xBVE1fU1RSRUFNIGhhbmRsZQorICogXHBhcmFtIG90aGVyRGF0YUJpdHMgbnVtYmVyIG9mIG90aGVyIGRhdGEgYml0cyB0byBiZSB3cml0dGVuCisgKgorICogXHJldHVybiBhbiBUUkFOU1BPUlRFTkNfRVJST1IgZXJyb3IgY29kZQorICovCitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0xhdG1BZGRPdGhlckRhdGFCaXRzKEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3RoZXJEYXRhQml0cyk7CiAKIC8qKgogICogXGJyaWVmIEdldCBiaXQgZGVtYW5kIG9mIG5leHQgTEFUTS9MT0FTIGhlYWRlcgpAQCAtMTg4LDEwICsyMTIsOCBAQAogICoKICAqIFxyZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIGJ5IHRoZSBMQVRNL0xPQVMgaGVhZGVycwogICovCi11bnNpZ25lZCBpbnQgdHJhbnNwb3J0RW5jX0xhdG1Db3VudFRvdGFsQml0RGVtYW5kSGVhZGVyICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3RyZWFtRGF0YUxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK3Vuc2lnbmVkIGludCB0cmFuc3BvcnRFbmNfTGF0bUNvdW50VG90YWxCaXREZW1hbmRIZWFkZXIoCisgICAgSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsIHVuc2lnbmVkIGludCBzdHJlYW1EYXRhTGVuZ3RoKTsKIAogLyoqCiAgKiBcYnJpZWYgV3JpdGUgTEFUTS9MT0FTIGhlYWRlciBpbnRvIGdpdmVuIGJpdHN0cmVhbSBoYW5kbGUKQEAgLTIwNSw0MiArMjI3LDM1IEBACiAgKiBccmV0dXJuIGFuIFRSQU5TUE9SVEVOQ19FUlJPUiBlcnJvciBjb2RlCiAgKi8KIFRSQU5TUE9SVEVOQ19FUlJPUgotdHJhbnNwb3J0RW5jX0xhdG1Xcml0ZSAoCi0gICAgICAgIEhBTkRMRV9MQVRNX1NUUkVBTSAgICBoQXNzLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdHN0cmVhbSwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGF1Qml0cywKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGJ1ZmZlckZ1bGxuZXNzLAotICAgICAgICBDU1RwQ2FsbEJhY2tzICAgICAqY2IKLSAgICAgICAgKTsKK3RyYW5zcG9ydEVuY19MYXRtV3JpdGUoSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBhdUJpdHMsIGludCBidWZmZXJGdWxsbmVzcywgQ1NUcENhbGxCYWNrcyAqY2IpOwogCiAvKioKICAqIFxicmllZiBBZGp1c3QgYml0IGNvdW50IHJlbGF0aXZlIHRvIGN1cnJlbnQgc3ViZnJhbWUKICAqCiAgKiBccGFyYW0gaEFzcyBIQU5ETEVfTEFUTV9TVFJFQU0gaGFuZGxlCi0gKiBccGFyYW0gcEJpdHMgcG9pbnRlciB0byBhbiBpbnQsIHdoZXJlIHRoZSBjdXJyZW50IGZyYW1lIGJpdCBjb3VudCBpcyBjb250YWluZWQsCi0gKiAgICAgICAgYW5kIHdoZXJlIHRoZSBzdWJmcmFtZSByZWxhdGl2ZSBiaXQgY291bnQgd2lsbCBiZSByZXR1cm5lZCBpbnRvCisgKiBccGFyYW0gcEJpdHMgcG9pbnRlciB0byBhbiBpbnQsIHdoZXJlIHRoZSBjdXJyZW50IGZyYW1lIGJpdCBjb3VudCBpcworICogY29udGFpbmVkLCBhbmQgd2hlcmUgdGhlIHN1YmZyYW1lIHJlbGF0aXZlIGJpdCBjb3VudCB3aWxsIGJlIHJldHVybmVkIGludG8KICAqCiAgKiBccmV0dXJuIHZvaWQKICAqLwotdm9pZCB0cmFuc3BvcnRFbmNfTGF0bUFkanVzdFN1YmZyYW1lQml0cyhIQU5ETEVfTEFUTV9TVFJFQU0gICAgaEFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnBCaXRzKTsKK3ZvaWQgdHJhbnNwb3J0RW5jX0xhdG1BZGp1c3RTdWJmcmFtZUJpdHMoSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsIGludCAqcEJpdHMpOwogCiAvKioKICAqIFxicmllZiBSZXF1ZXN0IGFuIExBVE0gZnJhbWUsIHdoaWNoIG1heSwgb3IgbWF5IG5vdCBiZSBhdmFpbGFibGUKICAqCiAgKiBccGFyYW0gaEFzcyBIQU5ETEVfTEFUTV9TVFJFQU0gaGFuZGxlCiAgKiBccGFyYW0gaEJzIEJpdHN0cmVhbSBoYW5kbGUKLSAqIFxwYXJhbSBwQnl0ZXMgcG9pbnRlciB0byBhbiBpbnQsIHdoZXJlIHRoZSBjdXJyZW50IGZyYW1lIGJ5dGUgY291bnQgc3RvcmVkIGludG8uCi0gKiAgICAgICAgQSByZXR1cm4gdmFsdWUgb2YgemVybyBtZWFucyB0aGF0IGN1cnJlbnRseSBubyBMQVRNL0xPQVMgZnJhbWUgY2FuIGJlIHJldHVybmVkLgotICogICAgICAgIFRoZSBsYXR0ZXIgaXMgZXhwZWN0ZWQgaW4gY2FzZSBvZiBtdWx0aXBsZSBzdWJmcmFtZXMgYmVpbmcgdXNlZC4KKyAqIFxwYXJhbSBwQnl0ZXMgcG9pbnRlciB0byBhbiBpbnQsIHdoZXJlIHRoZSBjdXJyZW50IGZyYW1lIGJ5dGUgY291bnQgc3RvcmVkCisgKiBpbnRvLiBBIHJldHVybiB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoYXQgY3VycmVudGx5IG5vIExBVE0vTE9BUyBmcmFtZSBjYW4gYmUKKyAqIHJldHVybmVkLiBUaGUgbGF0dGVyIGlzIGV4cGVjdGVkIGluIGNhc2Ugb2YgbXVsdGlwbGUgc3ViZnJhbWVzIGJlaW5nCisgKiB1c2VkLgogICoKLSAqIFxyZXR1cm4gdm9pZAorICogXHJldHVybiBhbiBUUkFOU1BPUlRFTkNfRVJST1IgZXJyb3IgY29kZQogICovCi12b2lkIHRyYW5zcG9ydEVuY19MYXRtR2V0RnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0xBVE1fU1RSRUFNICAgIGhBc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcEJ5dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfTGF0bUdldEZyYW1lKEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwQnl0ZXMpOwogCiAvKioKICAqIFxicmllZiBXcml0ZSBhIFN0cmVhbU11eENvbmZpZyBpbnRvIHRoZSBnaXZlbiBiaXRzdHJlYW0gaGFuZGxlCkBAIC0yNTMsMTIgKzI2OCw3IEBACiAgKiBccmV0dXJuIHZvaWQKICAqLwogVFJBTlNQT1JURU5DX0VSUk9SCi1DcmVhdGVTdHJlYW1NdXhDb25maWcoCi0gICAgICAgIEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIGludCBidWZmZXJGdWxsbmVzcywKLSAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IKLSAgICAgICAgKTsKLQorQ3JlYXRlU3RyZWFtTXV4Q29uZmlnKEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckZ1bGxuZXNzLCBDU1RwQ2FsbEJhY2tzICpjYik7CiAKICNlbmRpZiAvKiBUUEVOQ19MQVRNX0ggKi8KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfbGliLmNwcCBiL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfbGliLmNwcAppbmRleCAyNGZiMzJmLi5hODU2N2I5IDEwMDY0NAotLS0gYS9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xpYi5jcHAKKysrIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19saWIuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI0ICs5MCwyNCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IFRyYW5zcG9ydCBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgorICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKwogICAgRGVzY3JpcHRpb246IE1QRUcgVHJhbnNwb3J0IGVuY29kZQogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidHBlbmNfbGliLmgiCiAKIC8qIGxpYnJhcnkgaW5mbyAqLwotI2luY2x1ZGUgInZlcnNpb24iCisjaW5jbHVkZSAidHBfdmVyc2lvbi5oIgogCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJ0cmFuc3BvcnRFbmMiCiAKICNpbmNsdWRlICJ0cGVuY19hc2MuaCIKLSNpbmNsdWRlICJjb252X3N0cmluZy5oIgogCiAjaW5jbHVkZSAidHBlbmNfYWR0cy5oIgogCkBAIC0xMDQsMjUgKzExNSwyMyBAQAogCiAjaW5jbHVkZSAidHBlbmNfbGF0bS5oIgogCi0KLQogdHlwZWRlZiBzdHJ1Y3QgewogICBpbnQgY3VyU3ViRnJhbWU7CiAgIGludCBuU3ViRnJhbWVzOwogICBpbnQgcHJldkJpdHM7CiB9IFJBV1BBQ0tFVFNfSU5GTzsKIAotc3RydWN0IFRSQU5TUE9SVEVOQwoteworc3RydWN0IFRSQU5TUE9SVEVOQyB7CiAgIENPREVSX0NPTkZJRyBjb25maWc7Ci0gIFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdDsgICAgICAgICAgLyohPCBNUEVHNCB0cmFuc3BvcnQgdHlwZS4gKi8KKyAgVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10OyAvKiE8IE1QRUc0IHRyYW5zcG9ydCB0eXBlLiAqLwogCiAgIEZES19CSVRTVFJFQU0gYml0U3RyZWFtOwogICBVQ0hBUiAqYnNCdWZmZXI7CiAgIElOVCBic0J1ZmZlclNpemU7CiAKLSAgSU5UIHBjZUZyYW1lQ291bnRlcjsgICAgICAgICAgICAgICAgICAvKiE8IEluZGljYXRlcyBmcmFtZSBwZXJpb2Qgd2hlbiBQQ0UgbXVzdCBiZSB3cml0dGVuIGluIHJhd19kYXRhX2Jsb2NrLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgbWVhbnMgbm90IHRvIHdyaXRlIGEgUENFIGluIHJhd19kYXRfYmxvY2suICovCisgIElOVCBwY2VGcmFtZUNvdW50ZXI7IC8qITwgSW5kaWNhdGVzIGZyYW1lIHBlcmlvZCB3aGVuIFBDRSBtdXN0IGJlIHdyaXR0ZW4gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X2RhdGFfYmxvY2suIC0xIG1lYW5zIG5vdCB0byB3cml0ZSBhIFBDRSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfZGF0X2Jsb2NrLiAqLwogICB1bmlvbiB7CiAgICAgU1RSVUNUX0FEVFMgYWR0czsKIApAQCAtMTMyLDggKzE0MSw2IEBACiAKICAgICBSQVdQQUNLRVRTX0lORk8gcmF3OwogCi0KLQogICB9IHdyaXRlcjsKIAogICBDU1RwQ2FsbEJhY2tzIGNhbGxiYWNrczsKQEAgLTE0MSwyNCArMTQ4LDIyIEBACiAKIHR5cGVkZWYgc3RydWN0IF9UUkFOU1BPUlRFTkNfU1RSVUNUIFRSQU5TUE9SVEVOQ19TVFJVQ1Q7CiAKLQogLyoKICAqIE1FTU9SWSBEZWNsYXJhdGlvbgogICovCiAKLUNfQUxMT0NfTUVNKFJhbV9UcmFuc3BvcnRFbmNvZGVyLCBUUkFOU1BPUlRFTkMsIDEpCitDX0FMTE9DX01FTShSYW1fVHJhbnNwb3J0RW5jb2Rlciwgc3RydWN0IFRSQU5TUE9SVEVOQywgMSkKIAotVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19PcGVuKCBIQU5ETEVfVFJBTlNQT1JURU5DICpwaFRwRW5jICkKLXsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfT3BlbihIQU5ETEVfVFJBTlNQT1JURU5DICpwaFRwRW5jKSB7CiAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jOwogCi0gIGlmICggcGhUcEVuYyA9PSBOVUxMICl7CisgIGlmIChwaFRwRW5jID09IE5VTEwpIHsKICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSOwogICB9CiAKICAgaFRwRW5jID0gR2V0UmFtX1RyYW5zcG9ydEVuY29kZXIoMCk7CiAKLSAgaWYgKCBoVHBFbmMgPT0gTlVMTCApIHsKKyAgaWYgKGhUcEVuYyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19OT19NRU07CiAgIH0KIApAQCAtMTY5LDI5ICsxNzQsMzEgQEAKIC8qKgogICogXGJyaWVmICBHZXQgZnJhbWUgcGVyaW9kIG9mIFBDRSBpbiByYXdfZGF0YV9ibG9jay4KICAqCi0gKiAgLSBXcml0ZSBQQ0Ugb25seSBpZiBuZWNlc3NhcnkuIFBDRSBjYW4gYmUgcGFydCBvZiB0aGUgQVNDIGlmIGNoQ29uZmlnPT0wIHdoZXJlcmZvcmUKLSAqICAgIG5vIGFkZGl0b25hbCBQQ0Ugd2lsbCBiZSB3cml0dGVuIGluIHJhd19kYXRhX2Jsb2NrLgorICogLSBXcml0ZSBQQ0Ugb25seSBpZiBuZWNlc3NhcnkuIFBDRSBjYW4gYmUgcGFydCBvZiB0aGUgQVNDIGlmIGNoQ29uZmlnPT0wCisgKiB3aGVyZXJmb3JlIG5vIGFkZGl0b25hbCBQQ0Ugd2lsbCBiZSB3cml0dGVuIGluIHJhd19kYXRhX2Jsb2NrLgogICogLSBBIG1hdHJpeE1peGRvd24gY29lZmZpY2llbnQgY2FuIG9ubHkgYmUgd3JpdHRlbiBpZiBjaENvbmZpZyBpcyA1LjAgb3IgNS4xLgotICogLSBUaGUgUENFIHJlcGV0aXRpb24gcmF0ZSBpbiByYXdfZGF0YV9ibG9jayBjYW4gYmUgY29udHJvbGxlZCB2aWEgaGVhZGVyUGVyaW9kIHBhcmFtZXRlci4KKyAqIC0gVGhlIFBDRSByZXBldGl0aW9uIHJhdGUgaW4gcmF3X2RhdGFfYmxvY2sgY2FuIGJlIGNvbnRyb2xsZWQgdmlhCisgKiBoZWFkZXJQZXJpb2QgcGFyYW1ldGVyLgogICoKLSAqIFxwYXJhbSBjaGFubmVsQ29uZmlnICAgICAgICAgQ2hhbm5lbCBDb25maWd1cmF0aW9uIGRlcml2ZWQgZnJvbSBDaGFubmVsIE1vZGUKKyAqIFxwYXJhbSBjaGFubmVsTW9kZSAgICAgICAgICAgRW5jb2RlciBDaGFubmVsIE1vZGUuCisgKiBccGFyYW0gY2hhbm5lbENvbmZpZ1plcm8gICAgIE5vIHN0YW5kYXJkIGNoYW5uZWwgY29uZmlndXJhdGlvbi4KICAqIFxwYXJhbSB0cmFuc3BvcnRGbXQgICAgICAgICAgRm9ybWF0IG9mIHRoZSB0cmFuc3BvcnQgdG8gYmUgd3JpdHRlbi4KICAqIFxwYXJhbSBoZWFkZXJQZXJpb2QgICAgICAgICAgQ2hvc2VuIFBDRSBmcmFtZSByZXBldGl0aW9uIHJhdGUuCi0gKiBccGFyYW0gbWF0cml4TWl4ZG93bkEgICAgICAgIEluZGljYXRlcyBpZiBhIHZhbGlkIE1hdHJpeCBNaXhkb3duIGNvZWZmaWNpZW50IGlzIGF2YWlsYWJsZS4KKyAqIFxwYXJhbSBtYXRyaXhNaXhkb3duQSAgICAgICAgSW5kaWNhdGVzIGlmIGEgdmFsaWQgTWF0cml4IE1peGRvd24gY29lZmZpY2llbnQKKyAqIGlzIGF2YWlsYWJsZS4KICAqCi0gKiBccmV0dXJuICBQQ0UgZnJhbWUgcmVwZXRpdGlvbiByYXRlLiAtMSBtZWFucyBubyBQQ0UgcHJlc2VudCBpbiByYXdfZGF0YV9ibG9jay4KKyAqIFxyZXR1cm4gIFBDRSBmcmFtZSByZXBldGl0aW9uIHJhdGUuIC0xIG1lYW5zIG5vIFBDRSBwcmVzZW50IGluCisgKiByYXdfZGF0YV9ibG9jay4KICAqLwotc3RhdGljIElOVCBnZXRQY2VSZXBldGl0aW9uUmF0ZSgKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgY2hhbm5lbENvbmZpZywKLSAgICAgICAgY29uc3QgVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10LAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBoZWFkZXJQZXJpb2QsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIG1hdHJpeE1peGRvd25BCi0gICAgICAgICkKLXsKK3N0YXRpYyBJTlQgZ2V0UGNlUmVwZXRpdGlvblJhdGUoY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hhbm5lbENvbmZpZ1plcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGhlYWRlclBlcmlvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG1hdHJpeE1peGRvd25BKSB7CiAgIElOVCBwY2VGcmFtZUNvdW50ZXIgPSAtMTsgLyogdmFyaWFibGUgdG8gYmUgcmV0dXJuZWQgKi8KIAotICBpZiAoaGVhZGVyUGVyaW9kPjApIHsKLSAgICBzd2l0Y2ggKCBjaGFubmVsQ29uZmlnICkgeworICBpZiAoaGVhZGVyUGVyaW9kID4gMCkgeworICAgIHN3aXRjaCAoZ2V0Q2hhbm5lbENvbmZpZyhjaGFubmVsTW9kZSwgY2hhbm5lbENvbmZpZ1plcm8pKSB7CiAgICAgICBjYXNlIDA6CiAgICAgICAgIHN3aXRjaCAodHJhbnNwb3J0Rm10KSB7CiAgICAgICAgICAgY2FzZSBUVF9NUDRfQURUUzoKQEAgLTE5OSw1MyArMjA2LDUyIEBACiAgICAgICAgICAgY2FzZSBUVF9NUDRfUkFXOgogICAgICAgICAgICAgcGNlRnJhbWVDb3VudGVyID0gaGVhZGVyUGVyaW9kOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUVF9NUDRfQURJRjogICAgICAgICAgICAgICAgICAvKiBBRElGIGhlYWRlciBjb21wcmlzZXMgUENFICovCi0gICAgICAgICAgY2FzZSBUVF9NUDRfTE9BUzogICAgICAgICAgICAgICAgICAvKiBQQ0UgaW4gQVNDIGlmIGNoQ2hvbmZpZz09MCAqLwotICAgICAgICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMTogICAgICAgICAgICAgLyogUENFIGluIEFTQyBpZiBjaENob25maWc9PTAgKi8KLSAgICAgICAgICBjYXNlIFRUX0RSTTogICAgICAgICAgICAgICAgICAgICAgIC8qIFBDRSBub3QgYWxsb3dlZCBpbiBEUk0gKi8KKyAgICAgICAgICBjYXNlIFRUX01QNF9BRElGOiAvKiBBRElGIGhlYWRlciBjb21wcmlzZXMgUENFICovCisgICAgICAgICAgICBpZiAoKGNoYW5uZWxNb2RlID09IE1PREVfMV8yXzIpIHx8IChjaGFubmVsTW9kZSA9PSBNT0RFXzFfMl8yXzEpKSB7CisgICAgICAgICAgICAgIHBjZUZyYW1lQ291bnRlciA9IGhlYWRlclBlcmlvZDsgLyogcmVwZWF0aW5nIHBjZSBvbmx5IG1lYW5pbmdmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcG90ZW50aWFsIG1hdHJpeCBtaXhkb3duICovCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgVFRfTVA0X0xPQVM6ICAgICAgLyogUENFIGluIEFTQyBpZiBjaENob25maWc9PTAgKi8KKyAgICAgICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6IC8qIFBDRSBpbiBBU0MgaWYgY2hDaG9uZmlnPT0wICovCiAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHBjZUZyYW1lQ291bnRlciA9IC0xOyAgICAgICAgICAgIC8qIG5vIFBDRSBpbiByYXdfZGF0YV9ibG9jayAqLworICAgICAgICAgICAgcGNlRnJhbWVDb3VudGVyID0gLTE7IC8qIG5vIFBDRSBpbiByYXdfZGF0YV9ibG9jayAqLwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSA1OiAvKiBNT0RFXzFfMl8yICovCiAgICAgICBjYXNlIDY6IC8qIE1PREVfMV8yXzJfMSAqLwotICAgICAgICAvKiBtYXRyaXhNaXhkb3duQ29lZmZpY2llbnQgY2FuIG9ubHkgYmUgd3JpdHRlbiBpZiA1LjAgYW5kIDUuMSBjb25maWcgcHJlc2VudC4gKi8KLSAgICAgICAgaWYgKG1hdHJpeE1peGRvd25BIT0wKSB7CisgICAgICAgIC8qIG1hdHJpeE1peGRvd25Db2VmZmljaWVudCBjYW4gb25seSBiZSB3cml0dGVuIGlmIDUuMCBhbmQgNS4xIGNvbmZpZworICAgICAgICAgKiBwcmVzZW50LiAqLworICAgICAgICBpZiAobWF0cml4TWl4ZG93bkEgIT0gMCkgewogICAgICAgICAgIHN3aXRjaCAodHJhbnNwb3J0Rm10KSB7Ci0gICAgICAgICAgICBjYXNlIFRUX01QNF9BRElGOiAgICAgICAgICAgICAgICAvKiBBRElGIGhlYWRlciBjb21wcmlzZXMgUENFICovCisgICAgICAgICAgICBjYXNlIFRUX01QNF9BRElGOiAvKiBBRElGIGhlYWRlciBjb21wcmlzZXMgUENFICovCiAgICAgICAgICAgICBjYXNlIFRUX01QNF9BRFRTOgotICAgICAgICAgICAgY2FzZSBUVF9NUDRfTE9BUzogICAgICAgICAgICAgICAgLyogbm8gUENFIGluIEFTQyBiZWNhdXNlIGNoQ29uZmlnIT0wICovCi0gICAgICAgICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6ICAgICAgICAgICAvKiBubyBQQ0UgaW4gQVNDIGJlY2F1c2UgY2hDb25maWchPTAgKi8KKyAgICAgICAgICAgIGNhc2UgVFRfTVA0X0xPQVM6ICAgICAgLyogbm8gUENFIGluIEFTQyBiZWNhdXNlIGNoQ29uZmlnIT0wICovCisgICAgICAgICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6IC8qIG5vIFBDRSBpbiBBU0MgYmVjYXVzZSBjaENvbmZpZyE9MCAqLwogICAgICAgICAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgogICAgICAgICAgICAgY2FzZSBUVF9NUDRfUkFXOgogICAgICAgICAgICAgICBwY2VGcmFtZUNvdW50ZXIgPSBoZWFkZXJQZXJpb2Q7CiAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUVF9EUk06ICAgICAgICAgICAgICAgICAgICAgLyogUENFIG5vdCBhbGxvd2VkIGluIERSTSAqLwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgcGNlRnJhbWVDb3VudGVyID0gLTE7ICAgICAgICAgIC8qIG5vIFBDRSBpbiByYXdfZGF0YV9ibG9jayAqLwotICAgICAgICAgIH0gLyogc3dpdGNoIHRyYW5zcG9ydEZtdCAqLwotICAgICAgICB9IC8qIGlmIG1hdHJpeE1peGRvd25BIT0wICovCisgICAgICAgICAgICAgIHBjZUZyYW1lQ291bnRlciA9IC0xOyAvKiBubyBQQ0UgaW4gcmF3X2RhdGFfYmxvY2sgKi8KKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN3aXRjaCB0cmFuc3BvcnRGbXQgKi8KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIG1hdHJpeE1peGRvd25BIT0wICovCiAgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKLSAgICAgICAgcGNlRnJhbWVDb3VudGVyID0gLTE7ICAgICAgICAgICAgICAgIC8qIG5vIFBDRSBpbiByYXdfZGF0YV9ibG9jayAqLwotICAgIH0gLyogc3dpdGNoIGdldENoYW5uZWxDb25maWcoKSAqLwotICB9IC8qIGlmIGhlYWRlclBlcmlvZD4wICAqLworICAgICAgICBwY2VGcmFtZUNvdW50ZXIgPSAtMTsgLyogbm8gUENFIGluIHJhd19kYXRhX2Jsb2NrICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzd2l0Y2ggZ2V0Q2hhbm5lbENvbmZpZygpICovCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBoZWFkZXJQZXJpb2Q+MCAgKi8KICAgZWxzZSB7Ci0gICAgcGNlRnJhbWVDb3VudGVyID0gLTE7ICAgICAgICAgICAgICAgICAgICAvKiBubyBQQ0UgaW4gcmF3X2RhdGFfYmxvY2sgKi8KKyAgICBwY2VGcmFtZUNvdW50ZXIgPSAtMTsgLyogbm8gUENFIGluIHJhd19kYXRhX2Jsb2NrICovCiAgIH0KIAogICByZXR1cm4gcGNlRnJhbWVDb3VudGVyOwogfQogCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0luaXQoCi0gICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAotICAgICAgICBVQ0hBUiAgICAgICAgICAgICAqYnNCdWZmZXIsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICBic0J1ZmZlclNpemUsCi0gICAgICAgIFRSQU5TUE9SVF9UWVBFICAgICB0cmFuc3BvcnRGbXQsCi0gICAgICAgIENPREVSX0NPTkZJRyAgICAgICpjY29uZmlnLAotICAgICAgICBVSU5UICAgICAgICAgICAgICAgZmxhZ3MKLSAgICAgICAgKQoteworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19Jbml0KEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpic0J1ZmZlciwgSU5UIGJzQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERVJfQ09ORklHICpjY29uZmlnLCBVSU5UIGZsYWdzKSB7CiAgIC8qIENvcHkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KICAgRkRLbWVtY3B5KCZoVHBFbmMtPmNvbmZpZywgY2NvbmZpZywgc2l6ZW9mKENPREVSX0NPTkZJRykpOwogCkBAIC0yNTUsODYgKzI2MSw5NSBAQAogICBoVHBFbmMtPmJzQnVmZmVyID0gYnNCdWZmZXI7CiAgIGhUcEVuYy0+YnNCdWZmZXJTaXplID0gYnNCdWZmZXJTaXplOwogCi0gIEZES2luaXRCaXRTdHJlYW0oJmhUcEVuYy0+Yml0U3RyZWFtLCBoVHBFbmMtPmJzQnVmZmVyLCBoVHBFbmMtPmJzQnVmZmVyU2l6ZSwgMCwgQlNfV1JJVEVSKTsKKyAgRkRLaW5pdEJpdFN0cmVhbSgmaFRwRW5jLT5iaXRTdHJlYW0sIGhUcEVuYy0+YnNCdWZmZXIsIGhUcEVuYy0+YnNCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgIDAsIEJTX1dSSVRFUik7CiAKICAgc3dpdGNoICh0cmFuc3BvcnRGbXQpIHsKKyAgICBjYXNlIFRUX01QNF9BRElGOgorICAgICAgLyogU2FuaXR5IGNoZWNrcyAqLworICAgICAgaWYgKChoVHBFbmMtPmNvbmZpZy5hb3QgIT0gQU9UX0FBQ19MQykgfHwKKyAgICAgICAgICAoaFRwRW5jLT5jb25maWcuc2FtcGxlc1BlckZyYW1lICE9IDEwMjQpKSB7CisgICAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICB9CisgICAgICBoVHBFbmMtPndyaXRlci5hZGlmLmhlYWRlcldyaXR0ZW4gPSAwOworICAgICAgaFRwRW5jLT53cml0ZXIuYWRpZi5zYW1wbGluZ1JhdGUgPSBoVHBFbmMtPmNvbmZpZy5zYW1wbGluZ1JhdGU7CisgICAgICBoVHBFbmMtPndyaXRlci5hZGlmLmJpdFJhdGUgPSBoVHBFbmMtPmNvbmZpZy5iaXRSYXRlOworICAgICAgaFRwRW5jLT53cml0ZXIuYWRpZi5wcm9maWxlID0gKChpbnQpaFRwRW5jLT5jb25maWcuYW90KSAtIDE7CisgICAgICBoVHBFbmMtPndyaXRlci5hZGlmLmNtID0gaFRwRW5jLT5jb25maWcuY2hhbm5lbE1vZGU7CisgICAgICBoVHBFbmMtPndyaXRlci5hZGlmLmJWYXJpYWJsZVJhdGUgPSAwOworICAgICAgaFRwRW5jLT53cml0ZXIuYWRpZi5pbnN0YW5jZVRhZyA9IDA7CisgICAgICBoVHBFbmMtPndyaXRlci5hZGlmLm1hdHJpeE1peGRvd25BID0gaFRwRW5jLT5jb25maWcubWF0cml4TWl4ZG93bkE7CisgICAgICBoVHBFbmMtPndyaXRlci5hZGlmLnBzZXVkb1N1cnJvdW5kRW5hYmxlID0KKyAgICAgICAgICAoaFRwRW5jLT5jb25maWcuZmxhZ3MgJiBDQ19QU0VVRE9fU1VSUk9VTkQpID8gMSA6IDA7CisgICAgICBicmVhazsKIAotICBjYXNlIFRUX01QNF9BRElGOgotICAgIC8qIFNhbml0eSBjaGVja3MgKi8KLSAgICBpZiAoIChoVHBFbmMtPmNvbmZpZy5hb3QgIT0gQU9UX0FBQ19MQykKLSAgICAgICB8fChoVHBFbmMtPmNvbmZpZy5zYW1wbGVzUGVyRnJhbWUgIT0gMTAyNCkpCi0gICAgewotICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgaFRwRW5jLT53cml0ZXIuYWRpZi5oZWFkZXJXcml0dGVuID0gMDsKLSAgICBoVHBFbmMtPndyaXRlci5hZGlmLnNhbXBsaW5nUmF0ZSA9IGhUcEVuYy0+Y29uZmlnLnNhbXBsaW5nUmF0ZTsKLSAgICBoVHBFbmMtPndyaXRlci5hZGlmLmJpdFJhdGUgPSBoVHBFbmMtPmNvbmZpZy5iaXRSYXRlOwotICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYucHJvZmlsZSA9ICgoaW50KWhUcEVuYy0+Y29uZmlnLmFvdCkgLSAxOwotICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYuY20gPSBoVHBFbmMtPmNvbmZpZy5jaGFubmVsTW9kZTsKLSAgICBoVHBFbmMtPndyaXRlci5hZGlmLmJWYXJpYWJsZVJhdGUgPSAwOwotICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYuaW5zdGFuY2VUYWcgPSAwOwotICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgICAvKiBTYW5pdHkgY2hlY2tzICovCisgICAgICBpZiAoKGhUcEVuYy0+Y29uZmlnLmFvdCAhPSBBT1RfQUFDX0xDKSB8fAorICAgICAgICAgIChoVHBFbmMtPmNvbmZpZy5zYW1wbGVzUGVyRnJhbWUgIT0gMTAyNCkpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIH0KKyAgICAgIGlmIChhZHRzV3JpdGVfSW5pdCgmaFRwRW5jLT53cml0ZXIuYWR0cywgJmhUcEVuYy0+Y29uZmlnKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICB9CisgICAgICBicmVhazsKIAotICBjYXNlIFRUX01QNF9BRFRTOgotICAgIC8qIFNhbml0eSBjaGVja3MgKi8KLSAgICBpZiAoICggaFRwRW5jLT5jb25maWcuYW90ICE9IEFPVF9BQUNfTEMpCi0gICAgICAgfHwoaFRwRW5jLT5jb25maWcuc2FtcGxlc1BlckZyYW1lICE9IDEwMjQpICkKLSAgICB7Ci0gICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSOwotICAgIH0KLSAgICBpZiAoIGFkdHNXcml0ZV9Jbml0KCZoVHBFbmMtPndyaXRlci5hZHRzLCAmaFRwRW5jLT5jb25maWcpICE9IDApIHsKLSAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgVFRfTVA0X0xPQVM6Ci0gIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKLSAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgotICAgIHsKKyAgICBjYXNlIFRUX01QNF9MT0FTOgorICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6IHsKICAgICAgIFRSQU5TUE9SVEVOQ19FUlJPUiBlcnJvcjsKIAotICAgICAgZXJyb3IgPSB0cmFuc3BvcnRFbmNfTGF0bV9Jbml0KAotICAgICAgICAgICAgICAgICZoVHBFbmMtPndyaXRlci5sYXRtLAotICAgICAgICAgICAgICAgICZoVHBFbmMtPmJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAmaFRwRW5jLT5jb25maWcsCi0gICAgICAgICAgICAgICAgIGZsYWdzICYgVFBfRkxBR19MQVRNX0FNViwKLSAgICAgICAgICAgICAgICAgdHJhbnNwb3J0Rm10LAotICAgICAgICAgICAgICAgICZoVHBFbmMtPmNhbGxiYWNrcwotICAgICAgICAgICAgICAgICApOworICAgICAgZXJyb3IgPSB0cmFuc3BvcnRFbmNfTGF0bV9Jbml0KCZoVHBFbmMtPndyaXRlci5sYXRtLCAmaFRwRW5jLT5iaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUcEVuYy0+Y29uZmlnLCBmbGFncyAmIFRQX0ZMQUdfTEFUTV9BTVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0Rm10LCAmaFRwRW5jLT5jYWxsYmFja3MpOwogICAgICAgaWYgKGVycm9yICE9IFRSQU5TUE9SVEVOQ19PSykgewogICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOworICAgIH0gYnJlYWs7CiAKLSAgY2FzZSBUVF9NUDRfUkFXOgotICAgIGhUcEVuYy0+d3JpdGVyLnJhdy5jdXJTdWJGcmFtZSA9IDA7Ci0gICAgaFRwRW5jLT53cml0ZXIucmF3Lm5TdWJGcmFtZXMgPSBoVHBFbmMtPmNvbmZpZy5uU3ViRnJhbWVzOwotICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X1JBVzoKKyAgICAgIGhUcEVuYy0+d3JpdGVyLnJhdy5jdXJTdWJGcmFtZSA9IDA7CisgICAgICBoVHBFbmMtPndyaXRlci5yYXcublN1YkZyYW1lcyA9IGhUcEVuYy0+Y29uZmlnLm5TdWJGcmFtZXM7CisgICAgICBicmVhazsKIAotCi0KLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSOwogICB9CiAKICAgLyogcGNlRnJhbWVDb3VudGVyIGluZGljYXRlcyBpZiBQQ0UgbXVzdCBiZSB3cml0dGVuIGluIHJhd19kYXRhX2Jsb2NrLiAqLwogICBoVHBFbmMtPnBjZUZyYW1lQ291bnRlciA9IGdldFBjZVJlcGV0aXRpb25SYXRlKAotICAgICAgICAgICAgICAgICAgICBnZXRDaGFubmVsQ29uZmlnKGhUcEVuYy0+Y29uZmlnLmNoYW5uZWxNb2RlKSwKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0Rm10LAotICAgICAgICAgICAgICAgICAgICBoVHBFbmMtPmNvbmZpZy5oZWFkZXJQZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgIGhUcEVuYy0+Y29uZmlnLm1hdHJpeE1peGRvd25BKTsKKyAgICAgIGhUcEVuYy0+Y29uZmlnLmNoYW5uZWxNb2RlLCBoVHBFbmMtPmNvbmZpZy5jaGFubmVsQ29uZmlnWmVybywKKyAgICAgIHRyYW5zcG9ydEZtdCwgaFRwRW5jLT5jb25maWcuaGVhZGVyUGVyaW9kLCBoVHBFbmMtPmNvbmZpZy5tYXRyaXhNaXhkb3duQSk7CiAKICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19PSzsKIH0KIAotSEFORExFX0ZES19CSVRTVFJFQU0gdHJhbnNwb3J0RW5jX0dldEJpdHN0cmVhbSggSEFORExFX1RSQU5TUE9SVEVOQyBoVHAgKQoteworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19BZGRPdGhlckRhdGFCaXRzKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuQml0cykgeworICBUUkFOU1BPUlRFTkNfRVJST1IgdHBFcnIgPSBUUkFOU1BPUlRFTkNfT0s7CisKKyAgc3dpdGNoIChoVHBFbmMtPnRyYW5zcG9ydEZtdCkgeworICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgICAgIHRwRXJyID0gdHJhbnNwb3J0RW5jX0xhdG1BZGRPdGhlckRhdGFCaXRzKCZoVHBFbmMtPndyaXRlci5sYXRtLCBuQml0cyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRUX01QNF9BRFRTOgorICAgIGNhc2UgVFRfTVA0X0FESUY6CisgICAgY2FzZSBUVF9NUDRfUkFXOgorICAgIGRlZmF1bHQ6CisgICAgICB0cEVyciA9IFRSQU5TUE9SVEVOQ19VTktPV05fRVJST1I7CisgIH0KKworICByZXR1cm4gdHBFcnI7Cit9CisKK0hBTkRMRV9GREtfQklUU1RSRUFNIHRyYW5zcG9ydEVuY19HZXRCaXRzdHJlYW0oSEFORExFX1RSQU5TUE9SVEVOQyBoVHApIHsKICAgcmV0dXJuICZoVHAtPmJpdFN0cmVhbTsKIH0KIAotaW50IHRyYW5zcG9ydEVuY19SZWdpc3RlclNickNhbGxiYWNrKCBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgY29uc3QgY2JTYnJfdCBjYlNiciwgdm9pZCogdXNlcl9kYXRhKQoteworaW50IHRyYW5zcG9ydEVuY19SZWdpc3RlclNickNhbGxiYWNrKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiU2JyX3QgY2JTYnIsIHZvaWQgKnVzZXJfZGF0YSkgewogICBpZiAoaFRwRW5jID09IE5VTEwpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTM0MiwxNSArMzU3LDI5IEBACiAgIGhUcEVuYy0+Y2FsbGJhY2tzLmNiU2JyRGF0YSA9IHVzZXJfZGF0YTsKICAgcmV0dXJuIDA7CiB9CitpbnQgdHJhbnNwb3J0RW5jX1JlZ2lzdGVyVXNhY0NhbGxiYWNrKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlVzYWNfdCBjYlVzYWMsIHZvaWQgKnVzZXJfZGF0YSkgeworICBpZiAoaFRwRW5jID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaFRwRW5jLT5jYWxsYmFja3MuY2JVc2FjID0gY2JVc2FjOworICBoVHBFbmMtPmNhbGxiYWNrcy5jYlVzYWNEYXRhID0gdXNlcl9kYXRhOworICByZXR1cm4gMDsKK30KIAoraW50IHRyYW5zcG9ydEVuY19SZWdpc3RlclNzY0NhbGxiYWNrKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiU3NjX3QgY2JTc2MsIHZvaWQgKnVzZXJfZGF0YSkgeworICBpZiAoaFRwRW5jID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaFRwRW5jLT5jYWxsYmFja3MuY2JTc2MgPSBjYlNzYzsKKyAgaFRwRW5jLT5jYWxsYmFja3MuY2JTc2NEYXRhID0gdXNlcl9kYXRhOworICByZXR1cm4gMDsKK30KIAotVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19Xcml0ZUFjY2Vzc1VuaXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJhbWVVc2VkQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckZ1bGxuZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmNjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19Xcml0ZUFjY2Vzc1VuaXQoSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJhbWVVc2VkQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJGdWxsbmVzcywgaW50IG5jYykgewogICBUUkFOU1BPUlRFTkNfRVJST1IgZXJyID0gVFJBTlNQT1JURU5DX09LOwogCiAgIGlmICghaFRwKSB7CkBAIC0zNTksNDggKzM4OCw0MSBAQAogICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmaFRwLT5iaXRTdHJlYW07CiAKICAgLyogSW4gY2FzZSBvZiB3cml0aW5nIFBDRSBpbiByYXdfZGF0YV9ibG9jayBmcmFtZVVzZWRCaXRzIG11c3QgYmUgYWRhcHRlZC4gKi8KLSAgaWYgKGhUcC0+cGNlRnJhbWVDb3VudGVyPj1oVHAtPmNvbmZpZy5oZWFkZXJQZXJpb2QpIHsKLSAgICBmcmFtZVVzZWRCaXRzICs9IHRyYW5zcG9ydEVuY19HZXRQQ0VCaXRzKGhUcC0+Y29uZmlnLmNoYW5uZWxNb2RlLCBoVHAtPmNvbmZpZy5tYXRyaXhNaXhkb3duQSwgMyk7IC8qIENvbnNpZGVyIDMgYml0cyBJRCBzaWduYWxsaW5nIGluIGFsaWdubWVudCAqLworICBpZiAoaFRwLT5wY2VGcmFtZUNvdW50ZXIgPj0gaFRwLT5jb25maWcuaGVhZGVyUGVyaW9kKSB7CisgICAgZnJhbWVVc2VkQml0cyArPSB0cmFuc3BvcnRFbmNfR2V0UENFQml0cygKKyAgICAgICAgaFRwLT5jb25maWcuY2hhbm5lbE1vZGUsIGhUcC0+Y29uZmlnLm1hdHJpeE1peGRvd25BLAorICAgICAgICAzKTsgLyogQ29uc2lkZXIgMyBiaXRzIElEIHNpZ25hbGxpbmcgaW4gYWxpZ25tZW50ICovCiAgIH0KIAogICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CiAgICAgY2FzZSBUVF9NUDRfQURJRjoKLSAgICAgIEZES2luaXRCaXRTdHJlYW0oJmhUcC0+Yml0U3RyZWFtLCBoVHAtPmJzQnVmZmVyLCBoVHAtPmJzQnVmZmVyU2l6ZSwgMCwgQlNfV1JJVEVSKTsKLSAgICAgIGFkaWZXcml0ZV9FbmNvZGVIZWFkZXIoCi0gICAgICAgICAgICAgJmhUcC0+d3JpdGVyLmFkaWYsCi0gICAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgICAgYnVmZmVyRnVsbG5lc3MKLSAgICAgICAgICAgICAgKTsKKyAgICAgIEZES2luaXRCaXRTdHJlYW0oJmhUcC0+Yml0U3RyZWFtLCBoVHAtPmJzQnVmZmVyLCBoVHAtPmJzQnVmZmVyU2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgQlNfV1JJVEVSKTsKKyAgICAgIGlmICgwICE9IGFkaWZXcml0ZV9FbmNvZGVIZWFkZXIoJmhUcC0+d3JpdGVyLmFkaWYsIGhCcywgYnVmZmVyRnVsbG5lc3MpKSB7CisgICAgICAgIGVyciA9IFRSQU5TUE9SVEVOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgICBidWZmZXJGdWxsbmVzcyAvPSBuY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgQ29uc2lkZXJlZCBDaGFubmVscyAqLworICAgICAgYnVmZmVyRnVsbG5lc3MgLz0gbmNjOyAvKiBOdW1iZXIgb2YgQ29uc2lkZXJlZCBDaGFubmVscyAqLwogICAgICAgYnVmZmVyRnVsbG5lc3MgLz0gMzI7CiAgICAgICBidWZmZXJGdWxsbmVzcyA9IEZES21pbigweDdGRiwgYnVmZmVyRnVsbG5lc3MpOyAvKiBTaWduYWwgdmFyaWFibGUgcmF0ZSAqLwotICAgICAgYWR0c1dyaXRlX0VuY29kZUhlYWRlcigKLSAgICAgICAgICAgICAmaFRwLT53cml0ZXIuYWR0cywKLSAgICAgICAgICAgICAmaFRwLT5iaXRTdHJlYW0sCi0gICAgICAgICAgICAgIGJ1ZmZlckZ1bGxuZXNzLAotICAgICAgICAgICAgICBmcmFtZVVzZWRCaXRzCi0gICAgICAgICAgICAgICk7CisgICAgICBhZHRzV3JpdGVfRW5jb2RlSGVhZGVyKCZoVHAtPndyaXRlci5hZHRzLCAmaFRwLT5iaXRTdHJlYW0sIGJ1ZmZlckZ1bGxuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVVzZWRCaXRzKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFRfTVA0X0xPQVM6CiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgogICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKLSAgICAgIGJ1ZmZlckZ1bGxuZXNzIC89IG5jYzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIENvbnNpZGVyZWQgQ2hhbm5lbHMgKi8KKyAgICAgIGJ1ZmZlckZ1bGxuZXNzIC89IG5jYzsgLyogTnVtYmVyIG9mIENvbnNpZGVyZWQgQ2hhbm5lbHMgKi8KICAgICAgIGJ1ZmZlckZ1bGxuZXNzIC89IDMyOwogICAgICAgYnVmZmVyRnVsbG5lc3MgPSBGREttaW4oMHhGRiwgYnVmZmVyRnVsbG5lc3MpOyAvKiBTaWduYWwgdmFyaWFibGUgcmF0ZSAqLwotICAgICAgdHJhbnNwb3J0RW5jX0xhdG1Xcml0ZSgKLSAgICAgICAgICAgICAmaFRwLT53cml0ZXIubGF0bSwKLSAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICBmcmFtZVVzZWRCaXRzLAotICAgICAgICAgICAgICBidWZmZXJGdWxsbmVzcywKLSAgICAgICAgICAgICAmaFRwLT5jYWxsYmFja3MKLSAgICAgICAgICAgICAgKTsKLSAgICBicmVhazsKKyAgICAgIHRyYW5zcG9ydEVuY19MYXRtV3JpdGUoJmhUcC0+d3JpdGVyLmxhdG0sIGhCcywgZnJhbWVVc2VkQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyRnVsbG5lc3MsICZoVHAtPmNhbGxiYWNrcyk7CisgICAgICBicmVhazsKICAgICBjYXNlIFRUX01QNF9SQVc6CiAgICAgICBpZiAoaFRwLT53cml0ZXIucmF3LmN1clN1YkZyYW1lID49IGhUcC0+d3JpdGVyLnJhdy5uU3ViRnJhbWVzKSB7CiAgICAgICAgIGhUcC0+d3JpdGVyLnJhdy5jdXJTdWJGcmFtZSA9IDA7Ci0gICAgICAgIEZES2luaXRCaXRTdHJlYW0oJmhUcC0+Yml0U3RyZWFtLCBoVHAtPmJzQnVmZmVyLCBoVHAtPmJzQnVmZmVyU2l6ZSwgMCwgQlNfV1JJVEVSKTsKKyAgICAgICAgRkRLaW5pdEJpdFN0cmVhbSgmaFRwLT5iaXRTdHJlYW0sIGhUcC0+YnNCdWZmZXIsIGhUcC0+YnNCdWZmZXJTaXplLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJTX1dSSVRFUik7CiAgICAgICB9CiAgICAgICBoVHAtPndyaXRlci5yYXcucHJldkJpdHMgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKICAgICAgIGJyZWFrOwpAQCAtNDEwLDcgKzQzMiw3IEBACiAgIH0KIAogICAvKiBXcml0ZSBQQ0UgaW4gcmF3X2RhdGFfYmxvY2sgaWYgcmVxdWlyZWQgKi8KLSAgaWYgKGhUcC0+cGNlRnJhbWVDb3VudGVyPj1oVHAtPmNvbmZpZy5oZWFkZXJQZXJpb2QpIHsKKyAgaWYgKGhUcC0+cGNlRnJhbWVDb3VudGVyID49IGhUcC0+Y29uZmlnLmhlYWRlclBlcmlvZCkgewogICAgIElOVCBjcmNJbmRleCA9IDA7CiAgICAgLyogQWxpZ24gaW5zaWRlIFBDRSB3aXRoIHJlcHNlY3QgdG8gdGhlIGZpcnN0IGJpdCBvZiB0aGUgcmF3X2RhdGFfYmxvY2soKSAqLwogICAgIFVJTlQgYWxpZ25BbmNob3IgPSBGREtnZXRWYWxpZEJpdHMoJmhUcC0+Yml0U3RyZWFtKTsKQEAgLTQxOCwyOSArNDQwLDM0IEBACiAgICAgLyogV3JpdGUgUENFIGVsZW1lbnQgSUQgYml0cyAqLwogICAgIEZES3dyaXRlQml0cygmaFRwLT5iaXRTdHJlYW0sIElEX1BDRSwgMyk7CiAKLSAgICBpZiAoIChoVHAtPnRyYW5zcG9ydEZtdD09VFRfTVA0X0FEVFMpICYmICFoVHAtPndyaXRlci5hZHRzLnByb3RlY3Rpb25fYWJzZW50KSB7CisgICAgaWYgKChoVHAtPnRyYW5zcG9ydEZtdCA9PSBUVF9NUDRfQURUUykgJiYKKyAgICAgICAgIWhUcC0+d3JpdGVyLmFkdHMucHJvdGVjdGlvbl9hYnNlbnQpIHsKICAgICAgIGNyY0luZGV4ID0gYWR0c1dyaXRlX0NyY1N0YXJ0UmVnKCZoVHAtPndyaXRlci5hZHRzLCAmaFRwLT5iaXRTdHJlYW0sIDApOwogICAgIH0KIAogICAgIC8qIFdyaXRlIFBDRSBhcyBmaXJzdCByYXdfZGF0YV9ibG9jayBlbGVtZW50ICovCi0gICAgdHJhbnNwb3J0RW5jX3dyaXRlUENFKCZoVHAtPmJpdFN0cmVhbSwgaFRwLT5jb25maWcuY2hhbm5lbE1vZGUsIGhUcC0+Y29uZmlnLnNhbXBsaW5nUmF0ZSwgMCwgMSwgaFRwLT5jb25maWcubWF0cml4TWl4ZG93bkEsIChoVHAtPmNvbmZpZy5mbGFncyZDQ19QU0VVRE9fU1VSUk9VTkQpPzE6MCwgYWxpZ25BbmNob3IpOworICAgIHRyYW5zcG9ydEVuY193cml0ZVBDRSgKKyAgICAgICAgJmhUcC0+Yml0U3RyZWFtLCBoVHAtPmNvbmZpZy5jaGFubmVsTW9kZSwgaFRwLT5jb25maWcuc2FtcGxpbmdSYXRlLCAwLAorICAgICAgICAxLCBoVHAtPmNvbmZpZy5tYXRyaXhNaXhkb3duQSwKKyAgICAgICAgKGhUcC0+Y29uZmlnLmZsYWdzICYgQ0NfUFNFVURPX1NVUlJPVU5EKSA/IDEgOiAwLCBhbGlnbkFuY2hvcik7CiAKLSAgICBpZiAoIChoVHAtPnRyYW5zcG9ydEZtdD09VFRfTVA0X0FEVFMpICYmICFoVHAtPndyaXRlci5hZHRzLnByb3RlY3Rpb25fYWJzZW50KSB7CisgICAgaWYgKChoVHAtPnRyYW5zcG9ydEZtdCA9PSBUVF9NUDRfQURUUykgJiYKKyAgICAgICAgIWhUcC0+d3JpdGVyLmFkdHMucHJvdGVjdGlvbl9hYnNlbnQpIHsKICAgICAgIGFkdHNXcml0ZV9DcmNFbmRSZWcoJmhUcC0+d3JpdGVyLmFkdHMsICZoVHAtPmJpdFN0cmVhbSwgY3JjSW5kZXgpOwogICAgIH0KICAgICBoVHAtPnBjZUZyYW1lQ291bnRlciA9IDA7IC8qIHJlc2V0IHBjZSBmcmFtZSBjb3VudGVyICovCiAgIH0KIAotICBpZiAoaFRwLT5wY2VGcmFtZUNvdW50ZXIhPS0xKSB7Ci0gICAgaFRwLT5wY2VGcmFtZUNvdW50ZXIrKzsgLyogVXBkYXRlIHBjZUZyYW1lQ291bnRlciBvbmx5IGlmIFBDRSB3cml0aW5nIGlzIGFjdGl2ZS4gKi8KKyAgaWYgKGhUcC0+cGNlRnJhbWVDb3VudGVyICE9IC0xKSB7CisgICAgaFRwLT5wY2VGcmFtZUNvdW50ZXIrKzsgLyogVXBkYXRlIHBjZUZyYW1lQ291bnRlciBvbmx5IGlmIFBDRSB3cml0aW5nIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLiAqLwogICB9CiAKICAgcmV0dXJuIGVycjsKIH0KIAotCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0VuZEFjY2Vzc1VuaXQoSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsIGludCAqYml0cykKLXsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfRW5kQWNjZXNzVW5pdChIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpIHsKICAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgewogICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CkBAIC00NjUsOCArNDkyLDkgQEAKICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19PSzsKIH0KIAotVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19HZXRGcmFtZShIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgaW50ICpuYnl0ZXMpCi17CitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0dldEZyYW1lKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5ieXRlcykgeworICBUUkFOU1BPUlRFTkNfRVJST1IgdHBFcnIgPSBUUkFOU1BPUlRFTkNfT0s7CiAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9ICZoVHBFbmMtPmJpdFN0cmVhbTsKIAogICBzd2l0Y2ggKGhUcEVuYy0+dHJhbnNwb3J0Rm10KSB7CkBAIC00NzQsMTEgKzUwMiwxMiBAQAogICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKICAgICBjYXNlIFRUX01QNF9MT0FTOgogICAgICAgKm5ieXRlcyA9IGhUcEVuYy0+YnNCdWZmZXJTaXplOwotICAgICAgdHJhbnNwb3J0RW5jX0xhdG1HZXRGcmFtZSgmaFRwRW5jLT53cml0ZXIubGF0bSwgaEJzLCBuYnl0ZXMpOworICAgICAgdHBFcnIgPSB0cmFuc3BvcnRFbmNfTGF0bUdldEZyYW1lKCZoVHBFbmMtPndyaXRlci5sYXRtLCBoQnMsIG5ieXRlcyk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFRUX01QNF9BRFRTOgotICAgICAgaWYgKGhUcEVuYy0+d3JpdGVyLmFkdHMuY3VycmVudEJsb2NrID49IGhUcEVuYy0+d3JpdGVyLmFkdHMubnVtX3Jhd19ibG9ja3MrMSkgewotICAgICAgICAqbmJ5dGVzID0gKEZES2dldFZhbGlkQml0cyhoQnMpICsgNyk+PjM7CisgICAgICBpZiAoaFRwRW5jLT53cml0ZXIuYWR0cy5jdXJyZW50QmxvY2sgPj0KKyAgICAgICAgICBoVHBFbmMtPndyaXRlci5hZHRzLm51bV9yYXdfYmxvY2tzICsgMSkgeworICAgICAgICAqbmJ5dGVzID0gKEZES2dldFZhbGlkQml0cyhoQnMpICsgNykgPj4gMzsKICAgICAgICAgaFRwRW5jLT53cml0ZXIuYWR0cy5jdXJyZW50QmxvY2sgPSAwOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgKm5ieXRlcyA9IDA7CkBAIC00ODYsMjggKzUxNSwzMSBAQAogICAgICAgYnJlYWs7CiAgICAgY2FzZSBUVF9NUDRfQURJRjoKICAgICAgIEZES19BU1NFUlQoKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSA+PSAwKTsKLSAgICAgICpuYnl0ZXMgPSAoRkRLZ2V0VmFsaWRCaXRzKGhCcykgKyA3KT4+MzsKKyAgICAgICpuYnl0ZXMgPSAoRkRLZ2V0VmFsaWRCaXRzKGhCcykgKyA3KSA+PiAzOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBUVF9NUDRfUkFXOgogICAgICAgRkRLc3luY0NhY2hlKGhCcyk7CiAgICAgICBoVHBFbmMtPndyaXRlci5yYXcuY3VyU3ViRnJhbWUrKzsKLSAgICAgICpuYnl0ZXMgPSAoKEZES2dldFZhbGlkQml0cyhoQnMpLWhUcEVuYy0+d3JpdGVyLnJhdy5wcmV2Qml0cykgKyA3KT4+MzsKKyAgICAgICpuYnl0ZXMgPSAoKEZES2dldFZhbGlkQml0cyhoQnMpIC0gaFRwRW5jLT53cml0ZXIucmF3LnByZXZCaXRzKSArIDcpID4+IDM7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CiAgIH0KIAotICByZXR1cm4gVFJBTlNQT1JURU5DX09LOworICByZXR1cm4gdHBFcnI7CiB9CiAKLUlOVCB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyggSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsIGludCBhdUJpdHMgKQoteworSU5UIHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwLCBpbnQgYXVCaXRzKSB7CiAgIElOVCBuYml0cyA9IDAsIG5QY2VCaXRzID0gMDsKIAogICAvKiBXcml0ZSBQQ0Ugd2l0aGluIHJhd19kYXRhX2Jsb2NrIGluIHRyYW5zcG9ydCBsaWIuICovCi0gIGlmIChoVHAtPnBjZUZyYW1lQ291bnRlcj49aFRwLT5jb25maWcuaGVhZGVyUGVyaW9kKSB7Ci0gICAgblBjZUJpdHMgPSB0cmFuc3BvcnRFbmNfR2V0UENFQml0cyhoVHAtPmNvbmZpZy5jaGFubmVsTW9kZSwgaFRwLT5jb25maWcubWF0cml4TWl4ZG93bkEsIDMpOyAvKiBDb25zaWRlciAzIGJpdHMgSUQgc2lnbmFsbGluZyBpbiBhbGlnbm1lbnQgKi8KLSAgICBhdUJpdHMgKz0gblBjZUJpdHM7IC8qIEFkYXB0IHJlcXVpcmVkIHJhd19kYXRhX2Jsb2NrIGJpdCBjb25zdW10cGlvbiBmb3IgQVUgbGVuZ3RoIGluZm9ybWF0aW9uIGUuZy4gaW4gTEFUTS9MT0FTIGNvbmZpZ3VyYXRpb24uICovCisgIGlmIChoVHAtPnBjZUZyYW1lQ291bnRlciA+PSBoVHAtPmNvbmZpZy5oZWFkZXJQZXJpb2QpIHsKKyAgICBuUGNlQml0cyA9IHRyYW5zcG9ydEVuY19HZXRQQ0VCaXRzKAorICAgICAgICBoVHAtPmNvbmZpZy5jaGFubmVsTW9kZSwgaFRwLT5jb25maWcubWF0cml4TWl4ZG93bkEsCisgICAgICAgIDMpOyAgICAgICAgICAgICAvKiBDb25zaWRlciAzIGJpdHMgSUQgc2lnbmFsbGluZyBpbiBhbGlnbm1lbnQgKi8KKyAgICBhdUJpdHMgKz0gblBjZUJpdHM7IC8qIEFkYXB0IHJlcXVpcmVkIHJhd19kYXRhX2Jsb2NrIGJpdCBjb25zdW10cGlvbiBmb3IgQVUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCBpbmZvcm1hdGlvbiBlLmcuIGluIExBVE0vTE9BUyBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIH0KIAogICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CkBAIC01MjEsNzMgKzU1Myw3MCBAQAogICAgIGNhc2UgVFRfTVA0X0xPQVM6CiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgogICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKLSAgICAgIG5iaXRzID0gdHJhbnNwb3J0RW5jX0xhdG1Db3VudFRvdGFsQml0RGVtYW5kSGVhZGVyKCAmaFRwLT53cml0ZXIubGF0bSwgYXVCaXRzICk7CisgICAgICBuYml0cyA9CisgICAgICAgICAgdHJhbnNwb3J0RW5jX0xhdG1Db3VudFRvdGFsQml0RGVtYW5kSGVhZGVyKCZoVHAtPndyaXRlci5sYXRtLCBhdUJpdHMpOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIG5iaXRzID0gMDsKICAgICAgIGJyZWFrOwogICB9CiAKLSAgLyogUENFIGlzIHdyaXR0ZW4gaW4gdGhlIHRyYW5zcG9ydCBsaWJyYXJ5IHRoZXJlZm9yZSB0aGUgYml0IGNvbnN1bXB0aW9uIGlzIHBhcnQgb2YgdGhlIHRyYW5zcG9ydCBzdGF0aWMgYml0cy4gKi8KKyAgLyogUENFIGlzIHdyaXR0ZW4gaW4gdGhlIHRyYW5zcG9ydCBsaWJyYXJ5IHRoZXJlZm9yZSB0aGUgYml0IGNvbnN1bXB0aW9uIGlzCisgICAqIHBhcnQgb2YgdGhlIHRyYW5zcG9ydCBzdGF0aWMgYml0cy4gKi8KICAgbmJpdHMgKz0gblBjZUJpdHM7CiAKICAgcmV0dXJuIG5iaXRzOwogfQogCi12b2lkIHRyYW5zcG9ydEVuY19DbG9zZShIQU5ETEVfVFJBTlNQT1JURU5DICpwaFRwKQotewotICBpZiAocGhUcCAhPSBOVUxMKQotICB7Cit2b2lkIHRyYW5zcG9ydEVuY19DbG9zZShIQU5ETEVfVFJBTlNQT1JURU5DICpwaFRwKSB7CisgIGlmIChwaFRwICE9IE5VTEwpIHsKICAgICBpZiAoKnBoVHAgIT0gTlVMTCkgewogICAgICAgRnJlZVJhbV9UcmFuc3BvcnRFbmNvZGVyKHBoVHApOwogICAgIH0KICAgfQogfQogCi1pbnQgdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBpbnQgbUJpdHMpCi17CitpbnQgdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBpbnQgbUJpdHMpIHsKICAgaW50IGNyY1JlZyA9IDA7CiAKICAgc3dpdGNoIChoVHBFbmMtPnRyYW5zcG9ydEZtdCkgewotICBjYXNlIFRUX01QNF9BRFRTOgotICAgIGNyY1JlZyA9IGFkdHNXcml0ZV9DcmNTdGFydFJlZygmaFRwRW5jLT53cml0ZXIuYWR0cywgJmhUcEVuYy0+Yml0U3RyZWFtLCBtQml0cyk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICAgIGNyY1JlZyA9IGFkdHNXcml0ZV9DcmNTdGFydFJlZygmaFRwRW5jLT53cml0ZXIuYWR0cywgJmhUcEVuYy0+Yml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgfQogCiAgIHJldHVybiBjcmNSZWc7CiB9CiAKLXZvaWQgdHJhbnNwb3J0RW5jX0NyY0VuZFJlZyhIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgaW50IHJlZykKLXsKK3ZvaWQgdHJhbnNwb3J0RW5jX0NyY0VuZFJlZyhIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgaW50IHJlZykgewogICBzd2l0Y2ggKGhUcEVuYy0+dHJhbnNwb3J0Rm10KSB7Ci0gIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgYWR0c1dyaXRlX0NyY0VuZFJlZygmaFRwRW5jLT53cml0ZXIuYWR0cywgJmhUcEVuYy0+Yml0U3RyZWFtLCByZWcpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgICBhZHRzV3JpdGVfQ3JjRW5kUmVnKCZoVHBFbmMtPndyaXRlci5hZHRzLCAmaFRwRW5jLT5iaXRTdHJlYW0sIHJlZyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CiAgIH0KIH0KIAotCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0dldENvbmYoSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAgICAgICAgKmNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES19CSVRTVFJFQU0gICAgICAgKmRhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAqY29uZlR5cGUpCi17CitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0dldENvbmYoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERVJfQ09ORklHICpjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREtfQklUU1RSRUFNICpkYXRhQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKmNvbmZUeXBlKSB7CiAgIFRSQU5TUE9SVEVOQ19FUlJPUiB0cEVyciA9IFRSQU5TUE9SVEVOQ19PSzsKICAgSEFORExFX0xBVE1fU1RSRUFNIGhMYXRtQ29uZmlnID0gJmhUcEVuYy0+d3JpdGVyLmxhdG07CiAKICAgKmNvbmZUeXBlID0gMDsgLyogc2V0IGNvbmZUeXBlIHZhcmlhYmxlIHRvIGRlZmF1bHQgKi8KIAogICAvKiB3cml0ZSBTdHJlYW1NdXhDb25maWcgb3IgQXVkaW9TcGVjaWZpY0NvbmZpZyBkZXBlbmRpbmcgb24gZm9ybWF0IHVzZWQgKi8KLSAgc3dpdGNoIChoVHBFbmMtPnRyYW5zcG9ydEZtdCkKLSAgeworICBzd2l0Y2ggKGhUcEVuYy0+dHJhbnNwb3J0Rm10KSB7CiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgogICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKICAgICBjYXNlIFRUX01QNF9MT0FTOgotICAgICAgdHBFcnIgPSBDcmVhdGVTdHJlYW1NdXhDb25maWcoaExhdG1Db25maWcsIGRhdGFCdWZmZXIsIDAsICZoVHBFbmMtPmNhbGxiYWNrcyk7CisgICAgICB0cEVyciA9CisgICAgICAgICAgQ3JlYXRlU3RyZWFtTXV4Q29uZmlnKGhMYXRtQ29uZmlnLCBkYXRhQnVmZmVyLCAwLCAmaFRwRW5jLT5jYWxsYmFja3MpOwogICAgICAgKmNvbmZUeXBlID0gMTsgLyogY29uZmlnIGlzIFNNQyAqLwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTU5NywxMSArNjI2LDkgQEAKICAgfQogCiAgIHJldHVybiB0cEVycjsKLQogfQogCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICkKLXsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykgewogICBpbnQgaTsKIAogICBpZiAoaW5mbyA9PSBOVUxMKSB7CkBAIC02MjksMTQgKzY1Niw4IEBACiAgIGluZm8tPnRpdGxlID0gVFBfTElCX1RJVExFOwogCiAgIC8qIFNldCBmbGFncyAqLwotICBpbmZvLT5mbGFncyA9IDAKLSAgICB8IENBUEZfQURJRgotICAgIHwgQ0FQRl9BRFRTCi0gICAgfCBDQVBGX0xBVE0KLSAgICB8IENBUEZfTE9BUwotICAgIHwgQ0FQRl9SQVdQQUNLRVRTCi0gICAgOworICBpbmZvLT5mbGFncyA9CisgICAgICAwIHwgQ0FQRl9BRElGIHwgQ0FQRl9BRFRTIHwgQ0FQRl9MQVRNIHwgQ0FQRl9MT0FTIHwgQ0FQRl9SQVdQQUNLRVRTOwogCiAgIHJldHVybiBUUkFOU1BPUlRFTkNfT0s7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9zcmMvdmVyc2lvbiBiL2xpYk1wZWdUUEVuYy9zcmMvdmVyc2lvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0MjU2OC4uMDAwMDAwMAotLS0gYS9saWJNcGVnVFBFbmMvc3JjL3ZlcnNpb24KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLS8qIGxpYnJhcnkgaW5mbyAqLwotI2RlZmluZSBUUF9MSUJfVkwwIDIKLSNkZWZpbmUgVFBfTElCX1ZMMSAzCi0jZGVmaW5lIFRQX0xJQl9WTDIgNgotI2RlZmluZSBUUF9MSUJfVElUTEUgIk1QRUcgVHJhbnNwb3J0IgotI2lmZGVmIF9fQU5EUk9JRF9fCi0jZGVmaW5lIFRQX0xJQl9CVUlMRF9EQVRFICIiCi0jZGVmaW5lIFRQX0xJQl9CVUlMRF9USU1FICIiCi0jZWxzZQotI2RlZmluZSBUUF9MSUJfQlVJTERfREFURSBfX0RBVEVfXwotI2RlZmluZSBUUF9MSUJfQlVJTERfVElNRSBfX1RJTUVfXwotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJQQ011dGlscy9pbmNsdWRlL2xpbWl0ZXIuaCBiL2xpYlBDTXV0aWxzL2luY2x1ZGUvbGltaXRlci5oCmluZGV4IDBkM2Q3MDEuLmZhYjcyMjYgMTAwNjQ0Ci0tLSBhL2xpYlBDTXV0aWxzL2luY2x1ZGUvbGltaXRlci5oCisrKyBiL2xpYlBDTXV0aWxzL2luY2x1ZGUvbGltaXRlci5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDM0ICs5MCw1MyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKiogIEZESyBQQ00gcG9zdHByb2Nlc3NvciBtb2R1bGUgICoqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENNIHV0aWxpdHkgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIE5ldXNpbmdlcgorCiAgICBEZXNjcmlwdGlvbjogSGFyZCBsaW1pdGVyIGZvciBjbGlwcGluZyBwcmV2ZW50aW9uCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX0xJTUlURVJfSF8KLSNkZWZpbmUgX0xJTUlURVJfSF8KLQorI2lmbmRlZiBMSU1JVEVSX0gKKyNkZWZpbmUgTElNSVRFUl9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCiAKLSNkZWZpbmUgVERMX0FUVEFDS19ERUZBVUxUX01TICAgICAgKDE1KSAgICAgICAgICAgICAgLyogZGVmYXVsdCBhdHRhY2sgIHRpbWUgaW4gbXMgKi8KLSNkZWZpbmUgVERMX1JFTEVBU0VfREVGQVVMVF9NUyAgICAgKDUwKSAgICAgICAgICAgICAgLyogZGVmYXVsdCByZWxlYXNlIHRpbWUgaW4gbXMgKi8KKyNkZWZpbmUgVERMX0FUVEFDS19ERUZBVUxUX01TICgxNSkgIC8qIGRlZmF1bHQgYXR0YWNrICB0aW1lIGluIG1zICovCisjZGVmaW5lIFRETF9SRUxFQVNFX0RFRkFVTFRfTVMgKDUwKSAvKiBkZWZhdWx0IHJlbGVhc2UgdGltZSBpbiBtcyAqLwogCi0jZGVmaW5lIFRETF9HQUlOX1NDQUxJTkcgICAgICAgICAgICgxNSkgICAgICAgICAgICAgIC8qIHNjYWxpbmcgb2YgZ2FpbiB2YWx1ZS4gKi8KLQorI2RlZmluZSBURExfR0FJTl9TQ0FMSU5HICgxNSkgLyogc2NhbGluZyBvZiBnYWluIHZhbHVlLiAqLwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKK3N0cnVjdCBURExpbWl0ZXIgeworICB1bnNpZ25lZCBpbnQgYXR0YWNrOworICBGSVhQX0RCTCBhdHRhY2tDb25zdCwgcmVsZWFzZUNvbnN0OworICB1bnNpZ25lZCBpbnQgYXR0YWNrTXMsIHJlbGVhc2VNcywgbWF4QXR0YWNrTXM7CisgIEZJWFBfREJMIHRocmVzaG9sZDsKKyAgdW5zaWduZWQgaW50IGNoYW5uZWxzLCBtYXhDaGFubmVsczsKKyAgVUlOVCBzYW1wbGVSYXRlLCBtYXhTYW1wbGVSYXRlOworICBGSVhQX0RCTCBjb3IsIG1heDsKKyAgRklYUF9EQkwqIG1heEJ1ZjsKKyAgRklYUF9EQkwqIGRlbGF5QnVmOworICB1bnNpZ25lZCBpbnQgbWF4QnVmSWR4LCBkZWxheUJ1ZklkeDsKKyAgRklYUF9EQkwgc21vb3RoU3RhdGUwOworICBGSVhQX0RCTCBtaW5HYWluOworCisgIEZJWFBfREJMIGFkZGl0aW9uYWxHYWluUHJldjsKKyAgRklYUF9EQkwgYWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZTsKKyAgRklYUF9EQkwgYWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZTE7Cit9OwogCiB0eXBlZGVmIGVudW0gewogICBURExJTUlUX09LID0gMCwKKyAgVERMSU1JVF9VTktOT1dOID0gLTEsCiAKICAgX19lcnJvcl9jb2Rlc19zdGFydCA9IC0xMDAsCiAKQEAgLTExOSwxMTUgKzE0OSwxMzMgQEAKIHN0cnVjdCBURExpbWl0ZXI7CiB0eXBlZGVmIHN0cnVjdCBURExpbWl0ZXIqIFRETGltaXRlclB0cjsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBjcmVhdGVMaW1pdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBtYXhBdHRhY2tNczogICBtYXhpbXVtIGFuZCBpbml0aWFsIGF0dGFjay9sb29rYWhlYWQgdGltZSBpbiBtaWxsaXNlY29uZHMgICAgKgotKiByZWxlYXNlTXM6ICAgICByZWxlYXNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzICg5MCUgdGltZSBjb25zdGFudCkgICAgICAgICAgICAgKgotKiB0aHJlc2hvbGQ6ICAgICBsaW1pdGluZyB0aHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBtYXhDaGFubmVsczogICBtYXhpbXVtIGFuZCBpbml0aWFsIG51bWJlciBvZiBjaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgKgotKiBtYXhTYW1wbGVSYXRlOiBtYXhpbXVtIGFuZCBpbml0aWFsIHNhbXBsaW5nIHJhdGUgaW4gSHogICAgICAgICAgICAgICAgICAgICAgKgotKiByZXR1cm5zOiAgICAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVERMaW1pdGVyUHRyIGNyZWF0ZUxpbWl0ZXIodW5zaWduZWQgaW50ICBtYXhBdHRhY2tNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgcmVsZWFzZU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICB0aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIG1heENoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBtYXhTYW1wbGVSYXRlKTsKKyNkZWZpbmUgUENNX0xJTSBMT05HCisjZGVmaW5lIEZJWFBfREJMMlBDTV9MSU0oeCkgKHgpCisjZGVmaW5lIFBDTV9MSU0yRklYUF9EQkwoeCkgKHgpCisjZGVmaW5lIFBDTV9MSU1fQklUUyAzMgorI2RlZmluZSBGSVhQX1BDTV9MSU0gRklYUF9EQkwKIAorI2RlZmluZSBTQU1QTEVfQklUU19MSU0gREZSQUNUX0JJVFMKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiByZXNldExpbWl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBsaW1pdGVyOiBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiByZXR1cm5zOiBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVERMSU1JVEVSX0VSUk9SIHJlc2V0TGltaXRlcihURExpbWl0ZXJQdHIgbGltaXRlcik7Ci0KKyAqIHBjbUxpbWl0ZXJfUmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBsaW1pdGVyOiBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuczogZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9SZXNldChURExpbWl0ZXJQdHIgbGltaXRlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogZGVzdHJveUxpbWl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogbGltaXRlcjogbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogcmV0dXJuczogZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVRETElNSVRFUl9FUlJPUiBkZXN0cm95TGltaXRlcihURExpbWl0ZXJQdHIgbGltaXRlcik7CisgKiBwY21MaW1pdGVyX0Rlc3Ryb3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogbGltaXRlcjogbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJldHVybnM6IGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfRGVzdHJveShURExpbWl0ZXJQdHIgbGltaXRlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogYXBwbHlMaW1pdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogbGltaXRlcjogICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogcEdhaW4gOiAgICAgcG9pbnRlciB0byBnYWlucyB0byBiZSBhcHBsaWVkIHRvIHRoZSBzaWduYWwgYmVmb3JlIGxpbWl0aW5nLCAgICoKLSogICAgICAgICAgICAgd2hpY2ggYXJlIGRvd25zY2FsZWQgYnkgVERMX0dBSU5fU0NBTElORyBiaXQuICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgVGhlc2UgZ2FpbnMgYXJlIGRlbGF5ZWQgYnkgZ2Fpbl9kZWxheSwgYW5kIHNtb290aGVkLiAgICAgICAgICAgICoKLSogICAgICAgICAgICAgU21vb3RoaW5nIGlzIGRvbmUgYnkgYSBidXR0ZXJ3b3J0aCBsb3dwYXNzIGZpbHRlciB3aXRoIGEgY3V0b2ZmICoKLSogICAgICAgICAgICAgZnJlcXVlbmN5IHdoaWNoIGlzIGZpeGVkIHdpdGggcmVzcGVjdCB0byB0aGUgc2FtcGxpbmcgcmF0ZS4gICAgICoKLSogICAgICAgICAgICAgSXQgaXMgYSBzdWJzdGl0dXRlIGZvciB0aGUgc21vb3RoaW5nIGR1ZSB0byB3aW5kb3dpbmcgYW5kICAgICAgICoKLSogICAgICAgICAgICAgb3ZlcmxhcC9hZGQsIGlmIGEgZ2FpbiBpcyBhcHBsaWVkIGluIGZyZXF1ZW5jeSBkb21haW4uICAgICAgICAgICoKLSogZ2Fpbl9zY2FsZTogcG9pbnRlciB0byBzY2FsaW5nIGV4cG9uZW50cyB0byBiZSBhcHBsaWVkIHRvIHRoZSBzaWduYWwgYmVmb3JlICoKLSogICAgICAgICAgICAgbGltaXRpbmcsIHdpdGhvdXQgZGVsYXkgYW5kIHdpdGhvdXQgc21vb3RoaW5nICAgICAgICAgICAgICAgICAgICoKLSogZ2Fpbl9zaXplOiAgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHBHYWluLCBjdXJyZW50bHkgcmVzdHJpY3RlZCB0byAxICAgICAgICAgICoKLSogZ2Fpbl9kZWxheTogZGVsYXkgW3NhbXBsZXNdIHdpdGggd2hpY2ggdGhlIGdhaW5zIGluIHBHYWluIHNoYWxsIGJlIGFwcGxpZWQgICoKLSogICAgICAgICAgICAgZ2Fpbl9kZWxheSA8PSBuU2FtcGxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogc2FtcGxlczogICAgaW5wdXQvb3V0cHV0IGJ1ZmZlciBjb250YWluaW5nIGludGVybGVhdmVkIHNhbXBsZXMgICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgcHJlY2lzaW9uIG9mIG91dHB1dCB3aWxsIGJlIERGUkFDVF9CSVRTLVRETF9HQUlOX1NDQUxJTkcgYml0cyAgICoKLSogblNhbXBsZXM6ICAgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogcmV0dXJuczogICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVRETElNSVRFUl9FUlJPUiBhcHBseUxpbWl0ZXIoVERMaW1pdGVyUHRyIGxpbWl0ZXIsCi0gICAgICAgICAgICAgICAgIElOVF9QQ00qICAgIHNhbXBsZXMsCi0gICAgICAgICAgICAgICAgIEZJWFBfREJMKiAgICBwR2FpbiwKLSAgICAgICAgICAgICAgICAgY29uc3QgSU5UKiAgIGdhaW5fc2NhbGUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICBnYWluX3NpemUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICBnYWluX2RlbGF5LAotICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgblNhbXBsZXMpOworICogcGNtTGltaXRlcl9HZXREZWxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIGxpbWl0ZXI6IGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiByZXR1cm5zOiBleGFjdCBkZWxheSBjYXVzZWQgYnkgdGhlIGxpbWl0ZXIgaW4gc2FtcGxlcyBwZXIgY2hhbm5lbCAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludCBwY21MaW1pdGVyX0dldERlbGF5KFRETGltaXRlclB0ciBsaW1pdGVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBnZXRMaW1pdGVyRGVsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBsaW1pdGVyOiBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiByZXR1cm5zOiBleGFjdCBkZWxheSBjYXVzZWQgYnkgdGhlIGxpbWl0ZXIgaW4gc2FtcGxlcyAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgaW50IGdldExpbWl0ZXJEZWxheShURExpbWl0ZXJQdHIgbGltaXRlcik7CisgKiBwY21MaW1pdGVyX0dldE1heEdhaW5SZWR1Y3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogbGltaXRlcjogbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJldHVybnM6IG1heGltdW0gZ2FpbiByZWR1Y3Rpb24gaW4gbGFzdCBwcm9jZXNzZWQgYmxvY2sgaW4gZEIgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UIHBjbUxpbWl0ZXJfR2V0TWF4R2FpblJlZHVjdGlvbihURExpbWl0ZXJQdHIgbGltaXRlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogc2V0TGltaXRlck5DaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogbGltaXRlcjogICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogbkNoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMgKCA8PSBtYXhDaGFubmVscyBzcGVjaWZpZWQgb24gY3JlYXRlKSAgICAgICAgICoKLSogcmV0dXJuczogICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVRETElNSVRFUl9FUlJPUiBzZXRMaW1pdGVyTkNoYW5uZWxzKFRETGltaXRlclB0ciBsaW1pdGVyLCB1bnNpZ25lZCBpbnQgbkNoYW5uZWxzKTsKKyAqIHBjbUxpbWl0ZXJfU2V0TkNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBsaW1pdGVyOiAgIGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogbkNoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMgKCA8PSBtYXhDaGFubmVscyBzcGVjaWZpZWQgb24gY3JlYXRlKSAgICAgICAgICoKKyAqIHJldHVybnM6ICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfU2V0TkNoYW5uZWxzKFRETGltaXRlclB0ciBsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuQ2hhbm5lbHMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIHNldExpbWl0ZXJTYW1wbGVSYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIGxpbWl0ZXI6ICAgIGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIHNhbXBsZVJhdGU6IHNhbXBsaW5nIHJhdGUgaW4gSHogKCA8PSBtYXhTYW1wbGVSYXRlIHNwZWNpZmllZCBvbiBjcmVhdGUpICAgICAqCi0qIHJldHVybnM6ICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1URExJTUlURVJfRVJST1Igc2V0TGltaXRlclNhbXBsZVJhdGUoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIHVuc2lnbmVkIGludCBzYW1wbGVSYXRlKTsKKyAqIHBjbUxpbWl0ZXJfU2V0U2FtcGxlUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBsaW1pdGVyOiAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogc2FtcGxlUmF0ZTogc2FtcGxpbmcgcmF0ZSBpbiBIeiAoIDw9IG1heFNhbXBsZVJhdGUgc3BlY2lmaWVkIG9uIGNyZWF0ZSkgICAgICoKKyAqIHJldHVybnM6ICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfU2V0U2FtcGxlUmF0ZShURExpbWl0ZXJQdHIgbGltaXRlciwgVUlOVCBzYW1wbGVSYXRlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBzZXRMaW1pdGVyQXR0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBsaW1pdGVyOiAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBhdHRhY2tNczogICBhdHRhY2sgdGltZSBpbiBtcyAoIDw9IG1heEF0dGFja01zIHNwZWNpZmllZCBvbiBjcmVhdGUpICAgICAgICAgKgotKiByZXR1cm5zOiAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJBdHRhY2soVERMaW1pdGVyUHRyIGxpbWl0ZXIsIHVuc2lnbmVkIGludCBhdHRhY2tNcyk7CisgKiBwY21MaW1pdGVyX1NldEF0dGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogbGltaXRlcjogICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIGF0dGFja01zOiAgIGF0dGFjayB0aW1lIGluIG1zICggPD0gbWF4QXR0YWNrTXMgc3BlY2lmaWVkIG9uIGNyZWF0ZSkgICAgICAgICAqCisgKiByZXR1cm5zOiAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RETElNSVRFUl9FUlJPUiBwY21MaW1pdGVyX1NldEF0dGFjayhURExpbWl0ZXJQdHIgbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYXR0YWNrTXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIHNldExpbWl0ZXJSZWxlYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIGxpbWl0ZXI6ICAgIGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIHJlbGVhc2VNczogIHJlbGVhc2UgdGltZSBpbiBtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIHJldHVybnM6ICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1URExJTUlURVJfRVJST1Igc2V0TGltaXRlclJlbGVhc2UoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIHVuc2lnbmVkIGludCByZWxlYXNlTXMpOworICogcGNtTGltaXRlcl9TZXRSZWxlYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIGxpbWl0ZXI6ICAgIGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiByZWxlYXNlTXM6ICByZWxlYXNlIHRpbWUgaW4gbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuczogICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9TZXRSZWxlYXNlKFRETGltaXRlclB0ciBsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVsZWFzZU1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBzZXRMaW1pdGVyVGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBsaW1pdGVyOiAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiB0aHJlc2hvbGQ6ICBsaW1pdGVyIHRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiByZXR1cm5zOiAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJUaHJlc2hvbGQoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIElOVF9QQ00gdGhyZXNob2xkKTsKKyAqIHBjbUxpbWl0ZXJfR2V0TGliSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBpbmZvOiAgICAgICBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgTElCX0lORk8gc3RydWN0dXJlICAgICAgKgorICogcmV0dXJuczogICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9HZXRMaWJJbmZvKExJQl9JTkZPKiBpbmZvKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcGNtTGltaXRlcl9DcmVhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIG1heEF0dGFja01zOiAgIG1heGltdW0gYW5kIGluaXRpYWwgYXR0YWNrL2xvb2thaGVhZCB0aW1lIGluIG1pbGxpc2Vjb25kcyAgICAqCisgKiByZWxlYXNlTXM6ICAgICByZWxlYXNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzICg5MCUgdGltZSBjb25zdGFudCkgICAgICAgICAgICAgKgorICogdGhyZXNob2xkOiAgICAgbGltaXRpbmcgdGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIG1heENoYW5uZWxzOiAgIG1heGltdW0gYW5kIGluaXRpYWwgbnVtYmVyIG9mIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBtYXhTYW1wbGVSYXRlOiBtYXhpbXVtIGFuZCBpbml0aWFsIHNhbXBsaW5nIHJhdGUgaW4gSHogICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuczogICAgICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitURExpbWl0ZXJQdHIgcGNtTGltaXRlcl9DcmVhdGUodW5zaWduZWQgaW50IG1heEF0dGFja01zLCB1bnNpZ25lZCBpbnQgcmVsZWFzZU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRocmVzaG9sZCwgdW5zaWduZWQgaW50IG1heENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbWF4U2FtcGxlUmF0ZSk7CiAKLSNlbmRpZiAgLy8jaWZuZGVmIF9MSU1JVEVSX0hfCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwY21MaW1pdGVyX1NldFRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogbGltaXRlcjogICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHRocmVzaG9sZDogIGxpbWl0ZXIgdGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiByZXR1cm5zOiAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RETElNSVRFUl9FUlJPUiBwY21MaW1pdGVyX1NldFRocmVzaG9sZChURExpbWl0ZXJQdHIgbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0aHJlc2hvbGQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwY21MaW1pdGVyX0FwcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogbGltaXRlcjogICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBHYWluIDogICAgIHBvaW50ZXIgdG8gZ2FpbnMgdG8gYmUgYXBwbGllZCB0byB0aGUgc2lnbmFsIGJlZm9yZSBsaW1pdGluZywgICAqCisgKiAgICAgICAgICAgICB3aGljaCBhcmUgZG93bnNjYWxlZCBieSBURExfR0FJTl9TQ0FMSU5HIGJpdC4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgVGhlc2UgZ2FpbnMgYXJlIGRlbGF5ZWQgYnkgZ2Fpbl9kZWxheSwgYW5kIHNtb290aGVkLiAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIFNtb290aGluZyBpcyBkb25lIGJ5IGEgYnV0dGVyd29ydGggbG93cGFzcyBmaWx0ZXIgd2l0aCBhIGN1dG9mZiAqCisgKiAgICAgICAgICAgICBmcmVxdWVuY3kgd2hpY2ggaXMgZml4ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBzYW1wbGluZyByYXRlLiAgICAgKgorICogICAgICAgICAgICAgSXQgaXMgYSBzdWJzdGl0dXRlIGZvciB0aGUgc21vb3RoaW5nIGR1ZSB0byB3aW5kb3dpbmcgYW5kICAgICAgICoKKyAqICAgICAgICAgICAgIG92ZXJsYXAvYWRkLCBpZiBhIGdhaW4gaXMgYXBwbGllZCBpbiBmcmVxdWVuY3kgZG9tYWluLiAgICAgICAgICAqCisgKiBnYWluX3NjYWxlOiBwb2ludGVyIHRvIHNjYWxpbmcgZXhwb25lbnRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNpZ25hbCBiZWZvcmUgKgorICogICAgICAgICAgICAgbGltaXRpbmcsIHdpdGhvdXQgZGVsYXkgYW5kIHdpdGhvdXQgc21vb3RoaW5nICAgICAgICAgICAgICAgICAgICoKKyAqIGdhaW5fc2l6ZTogIG51bWJlciBvZiBlbGVtZW50cyBpbiBwR2FpbiwgY3VycmVudGx5IHJlc3RyaWN0ZWQgdG8gMSAgICAgICAgICAqCisgKiBnYWluX2RlbGF5OiBkZWxheSBbc2FtcGxlc10gd2l0aCB3aGljaCB0aGUgZ2FpbnMgaW4gcEdhaW4gc2hhbGwgYmUgYXBwbGllZCAgKgorICogICAgICAgICAgICAgZ2Fpbl9kZWxheSA8PSBuU2FtcGxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHNhbXBsZXM6ICAgIGlucHV0L291dHB1dCBidWZmZXIgY29udGFpbmluZyBpbnRlcmxlYXZlZCBzYW1wbGVzICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICBwcmVjaXNpb24gb2Ygb3V0cHV0IHdpbGwgYmUgREZSQUNUX0JJVFMtVERMX0dBSU5fU0NBTElORyBiaXRzICAgKgorICogblNhbXBsZXM6ICAgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJldHVybnM6ICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfQXBwbHkoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIFBDTV9MSU0qIHNhbXBsZXNJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00qIHNhbXBsZXNPdXQsIEZJWFBfREJMKiBwR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCogZ2Fpbl9zY2FsZSwgY29uc3QgVUlOVCBnYWluX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGdhaW5fZGVsYXksIGNvbnN0IFVJTlQgblNhbXBsZXMpOworCisjZW5kaWYgLyogI2lmbmRlZiBMSU1JVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlBDTXV0aWxzL2luY2x1ZGUvcGNtX3V0aWxzLmggYi9saWJQQ011dGlscy9pbmNsdWRlL3BjbV91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3M2JjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJQQ011dGlscy9pbmNsdWRlL3BjbV91dGlscy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDTSB1dGlsaXR5IGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBBbGZvbnNvIFBpbm8gR2FyY2lhCisKKyAgIERlc2NyaXB0aW9uOiBGdW5jdGlvbnMgdGhhdCBwZXJmb3JtIChkZSlpbnRlcmxlYXZpbmcgY29tYmluZWQgd2l0aCBmb3JtYXQKK2NoYW5nZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoUENNX1VUSUxTX0gpCisjZGVmaW5lIFBDTV9VVElMU19ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKK3ZvaWQgRkRLX2ludGVybGVhdmUoY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHBJbiwgTE9ORyAqUkVTVFJJQ1QgcE91dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBjaGFubmVscywgY29uc3QgVUlOVCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoKTsKK3ZvaWQgRkRLX2ludGVybGVhdmUoY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHBJbiwgU0hPUlQgKlJFU1RSSUNUIHBPdXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbHMsIGNvbnN0IFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCk7Cit2b2lkIEZES19pbnRlcmxlYXZlKGNvbnN0IEZJWFBfU0dMICpSRVNUUklDVCBwSW4sIFNIT1JUICpSRVNUUklDVCBwT3V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsZW5ndGgpOworCit2b2lkIEZES19kZWludGVybGVhdmUoY29uc3QgTE9ORyAqUkVTVFJJQ1QgcEluLCBTSE9SVCAqUkVTVFJJQ1QgcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCk7Cit2b2lkIEZES19kZWludGVybGVhdmUoY29uc3QgTE9ORyAqUkVTVFJJQ1QgcEluLCBMT05HICpSRVNUUklDVCBwT3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbHMsIGNvbnN0IFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoKTsKK3ZvaWQgRkRLX2RlaW50ZXJsZWF2ZShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgcEluLCBTSE9SVCAqUkVTVFJJQ1QgcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCk7Cit2b2lkIEZES19kZWludGVybGVhdmUoY29uc3QgU0hPUlQgKlJFU1RSSUNUIHBJbiwgTE9ORyAqUkVTVFJJQ1QgcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCk7CisjZW5kaWYgLyogIWRlZmluZWQoUENNX1VUSUxTX0gpICovCmRpZmYgLS1naXQgYS9saWJQQ011dGlscy9pbmNsdWRlL3BjbWRteF9saWIuaCBiL2xpYlBDTXV0aWxzL2luY2x1ZGUvcGNtZG14X2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzN2E4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJQQ011dGlscy9pbmNsdWRlL3BjbWRteF9saWIuaApAQCAtMCwwICsxLDQ2MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ00gdXRpbGl0eSBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogXGZpbGUgICBwY21kbXhfbGliLmgKKyAqIFxicmllZiAgRkRLIFBDTSBhdWRpbyBtaXhkb3duIGxpYnJhcnkgaW50ZXJmYWNlIGhlYWRlciBmaWxlLgorCisgXHBhZ2UgSU5UUk8gSW50cm9kdWN0aW9uCisKKworIFxzZWN0aW9uIFNDT1BFIFNjb3BlCisKKyBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgaGlnaC1sZXZlbCBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgYW5kIHVzYWdlIG9mIHRoZQorIEZESyBQQ00gYXVkaW8gbWl4ZG93biBtb2R1bGUgbGlicmFyeSBkZXZlbG9wZWQgYnkgdGhlIEZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvcgorIEludGVncmF0ZWQgQ2lyY3VpdHMgKElJUykuIERlcGVuZGluZyBvbiB0aGUgbGlicmFyeSBjb25maWd1cmF0aW9uLCB0aGUgbW9kdWxlCisgY2FuIG1hbmlwdWxhdGUgdGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyBvZiBhIGdpdmVuIFBDTSBzaWduYWwuIEl0IGNhbgorIGNyZWF0ZSBmb3IgZXhhbXBsZSBhIHR3byBjaGFubmVsIHN0ZXJlbyBhdWRpbyBzaWduYWwgZnJvbSBhIGdpdmVuIG11bHRpLWNoYW5uZWwKKyBjb25maWd1cmF0aW9uIChlLmcuIDUuMSBjaGFubmVscykuCisKKworIFxwYWdlIEFCQlJFViBMaXN0IG9mIGFiYnJldmlhdGlvbnMKKworICBcbGkgXGIgQUFDIC0gQWR2YW5jZWQgQXVkaW8gQ29kaW5nXG4KKyAgICBJcyBhbiBhdWRpbyBjb2Rpbmcgc3RhbmRhcmQgZm9yIGxvc3N5IGRpZ2l0YWwgYXVkaW8gY29tcHJlc3Npb24gc3RhbmRhcmRpemVkCisgYnkgSVNPIGFuZCBJRUMsIGFzIHBhcnQgb2YgdGhlIE1QRUctMiAoSVNPL0lFQyAxMzgxOC03OjIwMDYpIGFuZCBNUEVHLTQKKyAoSVNPL0lFQyAxNDQ5Ni0zOjIwMDkpIHNwZWNpZmljYXRpb25zLgorCisgIFxsaSBcYiBEU0UgLSBEYXRhIFN0cmVhbSBFbGVtZW50XG4KKyAgICBBIHN5bnRhY3RpY2FsIGVsZW1lbnQgb2YgdGhlIE1QRUctMi80IEFkdmFuY2VkIEF1ZGlvIENvZGluZyBiaXRzdHJlYW0KKyBzdGFuZGFyZGl6ZWQgaW4gSVNPL0lFQyAxNDQ5Ni0zOjIwMDkuIEl0IGNhbiBjb252ZXkgYW55IGtpbmQgb2YgZGF0YSBhc3NvY2lhdGVkCisgdG8gb25lIHByb2dyYW0uCisKKyAgXGxpIFxiIFBDRSAtIFByb2dyYW0gQ29uZmlnIEVsZW1lbnRcbgorICAgIEEgc3ludGFjdGljYWwgZWxlbWVudCBvZiB0aGUgTVBFRy0yLzQgQWR2YW5jZWQgQXVkaW8gQ29kaW5nIGJpdHN0cmVhbQorIHN0YW5kYXJkaXplZCBpbiBJU08vSUVDIDE0NDk2LTM6MjAwOSB0aGF0IGNhbiBkZWZpbmUgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uCisgZm9yIGEgc2luZ2xlIHByb2dyYW0uIEluIGFkZGl0aW9uIGl0IGNhbiBjb21wcmlzZSBzaW1wbGUgZG93bm1peCBtZXRhIGRhdGEuCisKKyAqLworCisjaWZuZGVmIFBDTURNWF9MSUJfSAorI2RlZmluZSBQQ01ETVhfTElCX0gKKworI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgorI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKKy8qKgorICogIFxlbnVtICBQQ01ETVhfRVJST1IKKyAqCisgKiAgRXJyb3IgY29kZXMgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgbW9kdWxlIGludGVyZmFjZSBmdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIFBDTURNWF9PSyA9IDB4MCwgLyohPCBObyBlcnJvciBoYXBwZW5lZC4gKi8KKyAgUENNRE1YX1VOU1VQUE9SVEVEID0KKyAgICAgIDB4MSwgLyohPCBUaGUgcmVxdWVzdGVkIGZlYXR1cmUvc2VydmljZSBpcyB1bmF2YWlsYWJsZS4gVGhpcyBjYW4KKyAgICAgICAgICAgICAgICBvY2N1ciBpZiB0aGUgbW9kdWxlIHdhcyBidWlsdCBmb3IgYSB3cm9uZyBjb25maWd1cmF0aW9uLiAgKi8KKyAgcGNtX2RteF9mYXRhbF9lcnJvcl9zdGFydCwKKyAgUENNRE1YX09VVF9PRl9NRU1PUlksIC8qITwgTm90IGVub3VnaCBtZW1vcnkgdG8gc2V0IHVwIGFuIGluc3RhbmNlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLiAgICAqLworICBwY21fZG14X2ZhdGFsX2Vycm9yX2VuZCwKKworICBQQ01ETVhfSU5WQUxJRF9IQU5ETEUsICAgLyohPCBUaGUgZ2l2ZW4gaW5zdGFuY2UgaGFuZGxlIGlzIG5vdCB2YWxpZC4gICAqLworICBQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVCwgLyohPCBPbmUgb2YgdGhlIHBhcmFtZXRlcnMgaGFuZGVkIG92ZXIgaXMgaW52YWxpZC4gKi8KKyAgUENNRE1YX0lOVkFMSURfQ0hfQ09ORklHLCAvKiE8IFRoZSBnaXZlbiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGFuZCB0aHVzIG5vIHByb2Nlc3Npbmcgd2FzIHBlcmZvcm1lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUENNRE1YX0lOVkFMSURfTU9ERSwgIC8qITwgVGhlIHNldCBjb25maWd1cmF0aW9uL21vZGUgaXMgbm90IGFwcGxpY2FibGUuICAqLworICBQQ01ETVhfVU5LTk9XTl9QQVJBTSwgLyohPCBUaGUgaGFuZGVkIHBhcmFtZXRlciBpcyBub3Qga25vd24vc3VwcG9ydGVkLiAqLworICBQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSwgLyohPCBVbmFibGUgdG8gc2V0IHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXIuIE1vc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JhYmx5IHRoZSAgICB2YWx1ZSBpc3Qgb3V0IG9mIHJhbmdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBLCAgICAvKiE8IFRoZSByZWFkIGFuY2lsbGFyeSBkYXRhIHdhcyBjb3JydXB0LiAgICAgICAqLworICBQQ01ETVhfT1VUUFVUX0JVRkZFUl9UT09fU01BTEwgLyohPCBUaGUgc2l6ZSBvZiBwY20gb3V0cHV0IGJ1ZmZlciBpcyB0b28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsLiAgICAgICAgICAgICAgICovCisKK30gUENNRE1YX0VSUk9SOworCisvKiogTWFjcm8gdG8gaWRlbnRpZnkgZmF0YWwgZXJyb3JzLiAqLworI2RlZmluZSBQQ01ETVhfSVNfRkFUQUxfRVJST1IoZXJyKSAgICAgICAgICBcCisgICgoKChlcnIpID49IHBjbV9kbXhfZmF0YWxfZXJyb3Jfc3RhcnQpICYmIFwKKyAgICAoKGVycikgPD0gcGNtX2RteF9mYXRhbF9lcnJvcl9lbmQpKSAgICAgXAorICAgICAgID8gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAwKQorCisvKioKKyAqICBcZW51bSAgUENNRE1YX1BBUkFNCisgKgorICogIE1vZHVsZXMgZHluYW1pYyBydW50aW1lIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgaGFuZGVkIHRvIGZ1bmN0aW9uCisgKiBwY21EbXhfU2V0UGFyYW0oKSBhbmQgcGNtRG14X0dldFBhcmFtKCkuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIERNWF9QUk9GSUxFX1NFVFRJTkcgPQorICAgICAgMHgwMSwgLyohPCBEZWZpbmVzIHdoaWNoIGVxdWF0aW9ucywgY29lZmZpY2llbnRzIGFuZCBkZWZhdWx0LworICAgICAgICAgICAgICAgICBmYWxsYmFjayB2YWx1ZXMgdXNlZCBmb3IgZG93bm1peGluZy4gU2VlCisgICAgICAgICAgICAgICAgIDo6RE1YX1BST0ZJTEVfVFlQRSB0eXBlIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAqLworICBETVhfQlNfREFUQV9FWFBJUllfRlJBTUUgPQorICAgICAgMHgxMCwgLyohPCBUaGUgbnVtYmVyIG9mIGZyYW1lcyB3aXRob3V0IG5ldyBtZXRhZGF0YSB0aGF0CisgICAgICAgICAgICAgICAgIGhhdmUgdG8gZ28gYnkgYmVmb3JlIHRoZSBiaXRzdHJlYW0gZGF0YSBleHBpcmVzLgorICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgMCBkaXNhYmxlcyBleHBpcnkuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRE1YX0JTX0RBVEFfREVMQVkgPQorICAgICAgMHgxMSwgLyohPCBUaGUgbnVtYmVyIG9mIGRlbGF5IGZyYW1lcyBvZiB0aGUgb3V0cHV0IHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgY29tcGFyZWQgdG8gdGhlIGJpdHN0cmVhbSBkYXRhLiAgICAgICAgICAgICAgICAgICovCisgIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTID0KKyAgICAgIDB4MjAsIC8qITwgVGhlIG1pbmltdW0gbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gRm9yIGFsbAorICAgICAgICAgICAgICAgICBpbnB1dCBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgbGVzcyB0aGFuIHRoZSBnaXZlbgorICAgICAgICAgICAgICAgICBjaGFubmVscyB0aGUgbW9kdWxlIHdpbGwgbW9kaWZ5IHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSB0byBvYnRhaW4gdGhlIGdpdmVuIG51bWJlciBvZiBvdXRwdXQKKyAgICAgICAgICAgICAgICAgY2hhbm5lbHMuIE1vbm8gc2lnbmFscyB3aWxsIGJlIGR1cGxpY2F0ZWQuIElmIG1vcmUKKyAgICAgICAgICAgICAgICAgdGhhbiB0d28gb3V0cHV0IGNoYW5uZWxzIGFyZSBkZXNpcmVkIHRoZSBtb2R1bGUKKyAgICAgICAgICAgICAgICAganVzdCBhZGRzIGVtcHR5IGNoYW5uZWxzLiBUaGUgcGFyYW1ldGVyIHZhbHVlIG11c3QKKyAgICAgICAgICAgICAgICAgYmUgZWl0aGVyIC0xLCAwLCAxLCAyLCA2IG9yIDguIElmIHRoZSB2YWx1ZSBpcworICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gemVybyBhbmQgZXhjZWVkcyB0aGUgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIDo6TUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMgdGhlCisgICAgICAgICAgICAgICAgIGxhdHRlciB3aWxsIGJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZS4gQm90aCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgLTEgYW5kIDAgZGlzYWJsZSB0aGUgZmVhdHVyZS4gICAgICAgICAgICAgICAgICAgICovCisgIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTID0KKyAgICAgIDB4MjEsIC8qITwgVGhlIG1heGltdW0gbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gRm9yIGFsbAorICAgICAgICAgICAgICAgICBpbnB1dCBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgbW9yZSB0aGFuIHRoZSBnaXZlbgorICAgICAgICAgICAgICAgICBjaGFubmVscyB0aGUgbW9kdWxlIHdpbGwgYXBwbHkgYSBtaXhkb3duCisgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgdG8gb2J0YWluIHRoZSBnaXZlbiBudW1iZXIgb2Ygb3V0cHV0CisgICAgICAgICAgICAgICAgIGNoYW5uZWxzLiBUaGUgdmFsdWUgbXVzdCBiZSBlaXRoZXIgLTEsIDAsIDEsIDIsIDYKKyAgICAgICAgICAgICAgICAgb3IgOC4gSWYgaXQncyBncmVhdGVyIHRoYW4gemVybyBhbmQgbG93ZXIgb3IgZXF1YWwKKyAgICAgICAgICAgICAgICAgdGhhbiB0aGUgdmFsdWUgb2YgOjpNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUworICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdGhlIGxhdHRlciB3aWxsIGJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgVGhlIHZhbHVlcyAtMSBhbmQgMCBkaXNhYmxlIHRoZSBmZWF0dXJlLiAgICAgICAgICovCisgIERNWF9EVUFMX0NIQU5ORUxfTU9ERSA9CisgICAgICAweDMwLCAvKiE8IERvd25taXggbW9kZSBmb3IgdHdvIGNoYW5uZWwgYXVkaW8gZGF0YS4gU2VlIHR5cGUKKyAgICAgICAgICAgICAgICAgOjpEVUFMX0NIQU5ORUxfTU9ERSBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICovCisgIERNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERSA9CisgICAgICAweDMxIC8qITwgRGVmaW5lcyBob3cgbW9kdWxlIGhhbmRsZXMgcHNldWRvIHN1cnJvdW5kCisgICAgICAgICAgICAgICAgY29tcGF0aWJsZSBzaWduYWxzLiBTZWUgOjpQU0VVRE9fU1VSUk9VTkRfTU9ERQorICAgICAgICAgICAgICAgIHR5cGUgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBQQ01ETVhfUEFSQU07CisKKy8qKgorICogIFxlbnVtICBETVhfUFJPRklMRV9UWVBFCisgKgorICogIFZhbGlkIHZhbHVlIGxpc3QgZm9yIHBhcmFtZXRlciA6OkRNWF9QUk9GSUxFX1NFVFRJTkcuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIERNWF9QUkZMX1NUQU5EQVJEID0KKyAgICAgIDB4MCwgLyohPCBUaGUgc3RhbmRhcmQgcHJvZmlsZSBjcmVhdGVzIG1peGRvd24gc2lnbmFscyBiYXNlZCBvbgorICAgICAgICAgICAgICAgIHRoZSBhZHZhbmNlZCBkb3dubWl4IG1ldGFkYXRhIChmcm9tIGEgRFNFKSwgZXF1YXRpb25zCisgICAgICAgICAgICAgICAgYW5kIGRlZmF1bHQgdmFsdWVzIGRlZmluZWQgaW4gSVNPL0lFQyAxNDQ5NjozCisgICAgICAgICAgICAgICAgQW1tZW5kbWVudCA0LiBBbnkgb3RoZXIgKGxlZ2FjeSkgZG93bm1peCBtZXRhZGF0YSB3aWxsCisgICAgICAgICAgICAgICAgYmUgaWdub3JlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERNWF9QUkZMX01BVFJJWF9NSVggPQorICAgICAgMHgxLCAvKiE8IFRoaXMgcHJvZmlsZSBiZWhhdmVzIGp1c3QgYXMgdGhlIHN0YW5kYXJkIHByb2ZpbGUgaWYKKyAgICAgICAgICAgICAgICBhZHZhbmNlZCBkb3dubWl4IG1ldGFkYXRhIChmcm9tIGEgRFNFKSBpcyBhdmFpbGFibGUuIElmCisgICAgICAgICAgICAgICAgbm90LCB0aGUgbWF0cml4X21peGRvd24gaW5mb3JtYXRpb24gZW1iZWRkZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgcHJvZ3JhbSBjb25maWd1cmF0aW9uIGVsZW1lbnQgKFBDRSkgd2lsbCBiZSBhcHBsaWVkLiBJZgorICAgICAgICAgICAgICAgIG5laXRoZXIgaXMgdGhlIGNhc2UgdGhlIG1vZHVsZSBjcmVhdGVzIGEgbWl4ZG93biB1c2luZworICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGNvZWZmaWNpZW50cyBkZWZpbmVkIGluIE1QRUctNCBBbW1lbmRtZW50IDQuCisgICAgICAgICAgICAgICAgVGhlIHByb2ZpbGUgY2FuIGJlIHVzZWQgZS5nLiB0byBzdXBwb3J0IGxlZ2FjeSBkaWdpdGFsCisgICAgICAgICAgICAgICAgVFYgKGUuZy4gRFZCKSBzdHJlYW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERNWF9QUkZMX0ZPUkNFX01BVFJJWF9NSVggPQorICAgICAgMHgyLCAvKiE8IFNpbWlsYXIgdG8gdGhlIDo6RE1YX1BSRkxfTUFUUklYX01JWCBwcm9maWxlIGJ1dCBpZiBib3RoCisgICAgICAgICAgICAgICAgdGhlIGFkdmFuY2VkIChEU0UpIGFuZCB0aGUgbGVnYWN5IChQQ0UpIE1QRUcgZG93bm1peAorICAgICAgICAgICAgICAgIG1ldGFkYXRhIGFyZSBhdmFpbGFibGUgdGhlIGxhdHRlciB3aWxsIGJlIGFwcGxpZWQuICAgICAqLworICBETVhfUFJGTF9BUklCX0pBUEFOID0KKyAgICAgIDB4MyAvKiE8IERvd25taXggY3JlYXRpb24gYXMgZGVzY3JpYmVkIGluIEFCTlQgTkJSIDE1NjAyLTIuIEJ1dAorICAgICAgICAgICAgICAgaWYgYWR2YW5jZWQgZG93bm1peCBtZXRhZGF0YSBpcyBhdmFpbGFibGUgaXQgd2lsbCBiZQorICAgICAgICAgICAgICAgcHJlZmVyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IERNWF9QUk9GSUxFX1RZUEU7CisKKy8qKgorICogIFxlbnVtIFBTRVVET19TVVJST1VORF9NT0RFCisgKgorICogIFZhbGlkIHZhbHVlIGxpc3QgZm9yIHBhcmFtZXRlciA6OkRNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgTkVWRVJfRE9fUFNfRE1YID0KKyAgICAgIC0xLCAvKiE8IElnbm9yZSBhbnkgbWV0YWRhdGEgYW5kIGRvIG5ldmVyIGNyZWF0ZSBhIHBzZXVkbyBzdXJyb3VuZAorICAgICAgICAgICAgICAgY29tcGF0aWJsZSBkb3dubWl4LiAoRGVmYXVsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFVVE9fUFNfRE1YID0gMCwgLyohPCBDcmVhdGUgYSBwc2V1ZG8gc3Vycm91bmQgY29tcGF0aWJsZSBkb3dubWl4IG9ubHkgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbGxlZCBpbiBiaXRzdHJlYW1zIG1ldGEgZGF0YS4gKi8KKyAgRk9SQ0VfUFNfRE1YID0KKyAgICAgIDEgLyohPCBBbHdheXMgY3JlYXRlIGEgcHNldWRvIHN1cnJvdW5kIGNvbXBhdGlibGUgZG93bm1peC4KKyAgICAgICAgICAgICBDQVVUSU9OOiBUaGlzIGNhbiBsZWFkIHRvIGV4Y2Vzc2l2ZSBzaWduYWwgY2FuY2VsbGF0aW9ucworICAgICAgICAgICAgIGFuZCBzaWduYWwgbGV2ZWwgZGlmZmVyZW5jZXMgZm9yIG5vbi1jb21wYXRpYmxlIHNpZ25hbHMuICAqLworfSBQU0VVRE9fU1VSUk9VTkRfTU9ERTsKKworLyoqCisgKiAgXGVudW0gRFVBTF9DSEFOTkVMX01PREUKKyAqCisgKiAgVmFsaWQgdmFsdWUgbGlzdCBmb3IgcGFyYW1ldGVyIDo6RE1YX0RVQUxfQ0hBTk5FTF9NT0RFLgorICovCit0eXBlZGVmIGVudW0geworICBTVEVSRU9fTU9ERSA9IDB4MCwgLyohPCBMZWF2ZSBzdGVyZW8gc2lnbmFscyBhcyB0aGV5IGFyZS4gKi8KKyAgQ0gxX01PREUgPSAweDEsICAgIC8qITwgQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgZnJvbSBjaGFubmVsIDEuICAgICovCisgIENIMl9NT0RFID0gMHgyLCAgICAvKiE8IENyZWF0ZSBhIGR1YWwgbW9ubyBvdXRwdXQgc2lnbmFsIGZyb20gY2hhbm5lbCAyLiAgICAqLworICBNSVhFRF9NT0RFID0gMHgzICAgLyohPCBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBieSBtaXhpbmcgdGhlIHR3bworICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscy4gICAqLworfSBEVUFMX0NIQU5ORUxfTU9ERTsKKworI2RlZmluZSBETVhfUENNIEZJWFBfREJMCisjZGVmaW5lIERNWF9QQ01GIEZJWFBfREJMCisjZGVmaW5lIERNWF9QQ01fQklUUyBERlJBQ1RfQklUUworI2RlZmluZSBGWF9ETVgyRlhfUENNKHgpIEZYX0RCTDJGWF9QQ00oKEZJWFBfREJMKSh4KSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgICBNT0RVTEVTIElOVEVSRkFDRTogICAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3R5cGVkZWYgc3RydWN0IFBDTV9ETVhfSU5TVEFOQ0UgKkhBTkRMRV9QQ01fRE9XTk1JWDsKKworLyohIFxhZGR0b2dyb3VwIHBjbURteFJlc2V0RmxhZ3MgTW9kdWxlcyByZXNldCBmbGFncworICogIE1hY3JvcyB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcmFtZXRlciBmb3IgZnVuY3Rpb24gcGNtRG14X1Jlc2V0KCkgdG8gc3BlY2lmeQorICogd2hpY2ggcGFydHMgb2YgdGhlIG1vZHVsZSBzaGFsbCBiZSByZXNldC4KKyAqICBAeworICoKKyAqICBcZGVmICBQQ01ETVhfUkVTRVRfUEFSQU1TCisgKiAgT25seSByZXNldCB0aGUgdXNlciBzcGVjaWZpYyBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkIHdpdGgKKyAqIHBjbURteF9TZXRQYXJhbSgpLgorICoKKyAqICBcZGVmICBQQ01ETVhfUkVTRVRfQlNfREFUQQorICogIERlbGV0ZSB0aGUgbWV0YSBkYXRhIHRoYXQgaGFzIGJlZW4gZmVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIGludGVyZmFjZQorICogZnVuY3Rpb25zLgorICoKKyAqICBcZGVmICBQQ01ETVhfUkVTRVRfRlVMTAorICogIFJlc2V0IHRoZSBjb21wbGV0ZSBtb2R1bGUgaW5zdGFuY2UgdG8gdGhlIHN0YXRlIGFmdGVyIHBjbURteF9PcGVuKCkgaGFkIGJlZW4KKyAqIGNhbGxlZC4KKyAqLworI2RlZmluZSBQQ01ETVhfUkVTRVRfUEFSQU1TICgxKQorI2RlZmluZSBQQ01ETVhfUkVTRVRfQlNfREFUQSAoMikKKyNkZWZpbmUgUENNRE1YX1JFU0VUX0ZVTEwgKFBDTURNWF9SRVNFVF9QQVJBTVMgfCBQQ01ETVhfUkVTRVRfQlNfREFUQSkKKy8qISBAfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBPcGVuIGFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUKKyAqIEBwYXJhbVtvdXRdIHBTZWxmICBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyB0aGUgaGFuZGxlIG9mIHRoZSBuZXcKKyAqaW5zdGFuY2UuCisgKiBAcmV0dXJucyAgICAgICAgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlIG9mIHR5cGUgOjpQQ01ETVhfRVJST1IuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X09wZW4oSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZik7CisKKy8qKiBTZXQgb25lIHBhcmFtZXRlciBmb3IgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KKyAqIEBwYXJhbVtpbl0gc2VsZiAgIEhhbmRsZSBvZiBQQ00gZG93bm1peCBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gcGFyYW0gIFBhcmFtZXRlciB0byBiZSBzZXQuIENhbiBiZSBvbmUgZnJvbSB0aGUgOjpQQ01ETVhfUEFSQU0KKyAqbGlzdC4KKyAqIEBwYXJhbVtpbl0gdmFsdWUgIFBhcmFtZXRlciB2YWx1ZS4KKyAqIEByZXR1cm5zICAgICAgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZSBvZiB0eXBlIDo6UENNRE1YX0VSUk9SLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9TZXRQYXJhbShIQU5ETEVfUENNX0RPV05NSVggc2VsZiwgY29uc3QgUENNRE1YX1BBUkFNIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdmFsdWUpOworCisvKiogR2V0IG9uZSBwYXJhbWV0ZXIgdmFsdWUgb2YgYSBzaW5nbGUgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgorICogQHBhcmFtW2luXSAgc2VsZiAgICBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgorICogQHBhcmFtW2luXSAgcGFyYW0gICBQYXJhbWV0ZXIgdG8gcXVlcnkuIENhbiBiZSBvbmUgZnJvbSB0aGUgOjpQQ01ETVhfUEFSQU0KKyAqbGlzdC4KKyAqIEBwYXJhbVtvdXRdIHBWYWx1ZSAgUG9pbnRlciB0byBidWZmZXIgcmVjZWl2aW5nIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCisgKiBAcmV0dXJucyAgICAgICAgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZSBvZiB0eXBlIDo6UENNRE1YX0VSUk9SLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9HZXRQYXJhbShIQU5ETEVfUENNX0RPV05NSVggc2VsZiwgY29uc3QgUENNRE1YX1BBUkFNIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmNvbnN0IHBWYWx1ZSk7CisKKy8qKiBcY29uZAorICogIEV4dHJhY3QgcmVsZXZhbnQgZG93bm1peCBtZXRhLWRhdGEgZGlyZWN0bHkgZnJvbSBhIGdpdmVuIGJpdHN0cmVhbS4gVGhlCisgKmZ1bmN0aW9uIGNhbiBoYW5kbGUgYm90aCBkYXRhIHNwZWNpZmllZCBpbiBFVFNJIFRTIDEwMSAxNTQgb3IgSVNPL0lFQworICoxNDQ5Ni0zOjIwMDkvQW1kLjQ6MjAxMy4KKyAqIEBwYXJhbVtpbl0gc2VsZiAgICAgICAgIEhhbmRsZSBvZiBQQ00gZG93bm1peCBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gaEJpdFN0cmVhbSAgIEhhbmRsZSBvZiBGREsgYml0c3RyZWFtIGJ1ZmZlci4KKyAqIEBwYXJhbVtpbl0gYW5jRGF0YUJpdHMgIExlbmd0aCBvZiBhbmNpbGxhcnkgZGF0YSBpbiBiaXRzLgorICogQHBhcmFtW2luXSBpc01wZWcyICAgICAgRmxhZyBpbmRpY2F0aW5nIHdoZXRlciB0aGUgYW5jaWxsYXJ5IGRhdGEgaXMgZnJvbSBhCisgKk1QRUctMS8yIG9yIGEgTVBFRy00IHN0cmVhbS4KKyAqIEByZXR1cm5zICAgICAgICAgICAgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZSBvZiB0eXBlIDo6UENNRE1YX0VSUk9SLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9QYXJzZShIQU5ETEVfUENNX0RPV05NSVggc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgVUlOVCBhbmNEYXRhQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzTXBlZzIpOworLyoqIFxlbmRjb25kICovCisKKy8qKiBSZWFkIGZyb20gYSBnaXZlbiBhbmNpbGxhcnkgZGF0YSBidWZmZXIgYW5kIGV4dHJhY3QgdGhlIHJlbGV2YW50IGRvd25taXgKKyAqbWV0YS1kYXRhLiBUaGUgZnVuY3Rpb24gY2FuIGhhbmRsZSBib3RoIGRhdGEgc3BlY2lmaWVkIGluIEVUU0kgVFMgMTAxIDE1NCBvcgorICpJU08vSUVDIDE0NDk2LTM6MjAwOS9BbWQuNDoyMDEzLgorICogQHBhcmFtW2luXSBzZWxmICAgICAgICAgIEhhbmRsZSBvZiBQQ00gZG93bm1peCBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gcEFuY0RhdGFCdWYgICBQb2ludGVyIHRvIGFuY2lsbGFyeSBidWZmZXIgaG9sZGluZyB0aGUgZGF0YS4KKyAqIEBwYXJhbVtpbl0gYW5jRGF0YUJ5dGVzICBTaXplIG9mIGFuY2lsbGFyeSBkYXRhIGluIGJ5dGVzLgorICogQHBhcmFtW2luXSBpc01wZWcyICAgICAgIEZsYWcgaW5kaWNhdGluZyB3aGV0ZXIgdGhlIGFuY2lsbGFyeSBkYXRhIGlzIGZyb20gYQorICpNUEVHLTEvMiBvciBhIE1QRUctNCBzdHJlYW0uCisgKiBAcmV0dXJucyAgICAgICAgICAgICAgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlIG9mIHR5cGUgOjpQQ01ETVhfRVJST1IuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X1JlYWREdmJBbmNEYXRhKEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmLCBVQ0hBUiAqcEFuY0RhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYW5jRGF0YUJ5dGVzLCBpbnQgaXNNcGVnMik7CisKKy8qKiBTZXQgdGhlIG1hdHJpeCBtaXhkb3duIGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tIHRoZSBQQ0Ugb2YgYW4gQUFDCisgKmJpdHN0cmVhbS4KKyAqIEBwYXJhbVtpbl0gc2VsZiAgICAgICAgICAgICAgICAgIEhhbmRsZSBvZiBQQ00gZG93bm1peCBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gbWF0cml4TWl4ZG93blByZXNlbnQgIE1hdHJpeCBtaXhkb3duIGluZGV4IHByZXNlbnQgZmxhZyBleHRyYWN0ZWQKKyAqZnJvbSBQQ0UuCisgKiBAcGFyYW1baW5dIG1hdHJpeE1peGRvd25JZHggICAgICBUaGUgMiBiaXQgbWF0cml4IG1peGRvd24gaW5kZXggZXh0cmFjdGVkCisgKmZyb20gUENFLgorICogQHBhcmFtW2luXSBwc2V1ZG9TdXJyb3VuZEVuYWJsZSAgVGhlIHBzZXVkbyBzdXJyb3VuZCBlbmFibGUgZmxhZyBleHRyYWN0ZWQKKyAqZnJvbSBQQ0UuCisgKiBAcmV0dXJucyAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUgb2YgdHlwZQorICo6OlBDTURNWF9FUlJPUi4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfU2V0TWF0cml4TWl4ZG93bkZyb21QY2UoSEFORExFX1BDTV9ET1dOTUlYIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhNaXhkb3duUHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeE1peGRvd25JZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwc2V1ZG9TdXJyb3VuZEVuYWJsZSk7CisKKy8qKiBSZXNldCB0aGUgbW9kdWxlLgorICogQHBhcmFtW2luXSBzZWxmICAgSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgorICogQHBhcmFtW2luXSBmbGFncyAgRmxhZ3MgdGVsbGluZyB3aGljaCBwYXJ0cyBvZiB0aGUgbW9kdWxlIHNoYWxsIGJlIHJlc2V0LgorICogICAgICAgICAgICAgICAgICAgU2VlIFxyZWYgcGNtRG14UmVzZXRGbGFncyBmb3IgZGV0YWlscy4KKyAqIEByZXR1cm5zICAgICAgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZSBvZiB0eXBlIDo6UENNRE1YX0VSUk9SLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9SZXNldChIQU5ETEVfUENNX0RPV05NSVggc2VsZiwgVUlOVCBmbGFncyk7CisKKy8qKiBDcmVhdGUgYSBtaXhkb3duLCBieXBhc3Mgb3IgZXh0ZW5kIHRoZSBvdXRwdXQgc2lnbmFsIGRlcGVuZGluZyBvbiB0aGUKKyAqbW9kdWxlcyBzZXR0aW5ncyBhbmQgdGhlIHJlc3BlY3RpdmUgZ2l2ZW4gaW5wdXQgY29uZmlndXJhdGlvbi4KKyAqCisgKiBccGFyYW1baW5dICAgICBzZWxmICAgICAgICAgICAgSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KKyAqIFxwYXJhbVtpbixvdXRdIHBQY21CdWYgICAgICAgICBQb2ludGVyIHRvIHRpbWUgYnVmZmVyIHdpdGggUENNIHNhbXBsZXMuCisgKiBccGFyYW1baW5dICAgICBwY21CdWZTaXplICAgICAgU2l6ZSBvZiBwUGNtQnVmIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbl0gICAgIGZyYW1lU2l6ZSAgICAgICBUaGUgSS9PIGJsb2NrIHNpemUgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsLgorICogXHBhcmFtW2luLG91dF0gbkNoYW5uZWxzICAgICAgIFBvaW50ZXIgdG8gYnVmZmVyIHRoYXQgaG9sZHMgdGhlIG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgYW1vdW50IG9mIG91dHB1dCBjaGFubmVscyBpcyB3cml0dGVuCisgKnRvLgorICogXHBhcmFtW2luXSAgICAgZkludGVybGVhdmVkICAgIElucHV0IGFuZCBvdXRwdXQgc2FtcGxlcyBhcmUgcHJvY2Vzc2VkIGludGVybGVhdmVkLgorICogXHBhcmFtW2luLG91dF0gY2hhbm5lbFR5cGUgICAgIEFycmF5IHdlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGZvciBlYWNoIG91dHB1dCBhdWRpbworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgaXMgc3RvcmVkIGludG8uCisgKiBccGFyYW1baW4sb3V0XSBjaGFubmVsSW5kaWNlcyAgQXJyYXkgd2VyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kZXggZm9yIGVhY2ggb3V0cHV0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gY2hhbm5lbCBpcyBzdG9yZWQgaW50by4KKyAqIFxwYXJhbVtpbl0gICAgIG1hcERlc2NyICAgICAgICBQb2ludGVyIHRvIGEgRkRLIGNoYW5uZWwgbWFwcGluZyBkZXNjcmlwdG9yIHRoYXQgY29udGFpbnMgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBtYXBwaW5nIHRvIGJlIHVzZWQuCisgKiBccGFyYW1bb3V0XSAgICBwRG14T3V0U2NhbGUgICAgUG9pbnRlciBvbiBhIGZpZWxkIHJlY2VpdmluZyB0aGUgc2NhbGUgZmFjdG9yIHRoYXQgaGFzIHRvIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZCBvbiBhbGwgc2FtcGxlcyBhZnRlcndhcmRzLiBJZiB0aGUKKyAqaGFuZGVkIHBvaW50ZXIgaXMgTlVMTCB0aGUgZmluYWwgc2NhbGluZyBpcyBkb25lIGludGVybmFsbHkuCisgKiBAcmV0dXJucyAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlIG9mIHR5cGUgOjpQQ01ETVhfRVJST1IuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X0FwcGx5RnJhbWUoSEFORExFX1BDTV9ET1dOTUlYIHNlbGYsIERNWF9QQ00gKnBQY21CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHBjbUJ1ZlNpemUsIFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbkNoYW5uZWxzLCBJTlQgZkludGVybGVhdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBjaGFubmVsVHlwZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGNoYW5uZWxJbmRpY2VzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciAqY29uc3QgbWFwRGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwRG14T3V0U2NhbGUpOworCisvKiogQ2xvc2UgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KKyAqIEBwYXJhbVtpbixvdXRdIHBTZWxmICBQb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGhhbmRsZSBvZiB0aGUKKyAqaW5zdGFuY2UuCisgKiBAcmV0dXJucyAgICAgICAgICAgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlIG9mIHR5cGUgOjpQQ01ETVhfRVJST1IuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X0Nsb3NlKEhBTkRMRV9QQ01fRE9XTk1JWCAqcFNlbGYpOworCisvKiogR2V0IGxpYnJhcnkgaW5mbyBmb3IgdGhpcyBtb2R1bGUuCisgKiBAcGFyYW1bb3V0XSBpbmZvICBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3R1cmUuCisgKiBAcmV0dXJucyAgICAgICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUgb2YgdHlwZSA6OlBDTURNWF9FUlJPUi4KKyAqLworUENNRE1YX0VSUk9SIHBjbURteF9HZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBDTURNWF9MSUJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliUENNdXRpbHMvaW5jbHVkZS9wY211dGlsc19saWIuaCBiL2xpYlBDTXV0aWxzL2luY2x1ZGUvcGNtdXRpbHNfbGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZTZhNDEuLjAwMDAwMDAKLS0tIGEvbGliUENNdXRpbHMvaW5jbHVkZS9wY211dGlsc19saWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiAgRkRLIFBDTSB1cC9kb3dubWl4aW5nIG1vZHVsZSAgKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAotICAgRGVzY3JpcHRpb246IERlY2xhcmVzIGZ1bmN0aW9ucyB0byBpbnRlcmZhY2Ugd2l0aCB0aGUgUENNIGRvd25taXggcHJvY2Vzc2luZwotICAgICAgICAgICAgICAgIG1vZHVsZS4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfUENNVVRJTFNfTElCX0hfCi0jZGVmaW5lIF9QQ01VVElMU19MSUJfSF8KLQotI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgotI2luY2x1ZGUgImNvbW1vbl9maXguaCIKLSNpbmNsdWRlICJGREtfYXVkaW8uaCIKLSNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKLSAqICAgICBFUlJPUiBDT0RFUzogICAgICAgICAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXR5cGVkZWYgZW51bQotewotICBQQ01ETVhfT0sgICAgICAgICAgICAgID0gMHgwLCAgIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgcGNtX2RteF9mYXRhbF9lcnJvcl9zdGFydCwKLSAgUENNRE1YX09VVF9PRl9NRU1PUlkgICA9IDB4MiwgICAvKiE8IE5vdCBlbm91Z2ggbWVtb3J5IHRvIHNldCB1cCBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlLiAgICAqLwotICBQQ01ETVhfVU5LTk9XTiAgICAgICAgID0gMHg1LCAgIC8qITwgRXJyb3IgY29uZGl0aW9uIGlzIG9mIHVua25vd24gcmVhc29uLCBvciBmcm9tIGEgdGhpcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnR5IG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBwY21fZG14X2ZhdGFsX2Vycm9yX2VuZCwKLQotICBQQ01ETVhfSU5WQUxJRF9IQU5ETEUsICAgICAgICAgIC8qITwgVGhlIGdpdmVuIGluc3RhbmNlIGhhbmRsZSBpcyBub3QgdmFsaWQuICAgICAgICAgICAgICAgICAgICovCi0gIFBDTURNWF9JTlZBTElEX0FSR1VNRU5ULCAgICAgICAgLyohPCBPbmUgb2YgdGhlIHBhcmFtZXRlcnMgaGFuZGVkIG92ZXIgaXMgaW52YWxpZC4gICAgICAgICAgICAgKi8KLSAgUENNRE1YX0lOVkFMSURfQ0hfQ09ORklHLCAgICAgICAvKiE8IFRoZSBnaXZlbiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBhbmQgdGh1cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gcHJvY2Vzc2luZyB3YXMgcGVyZm9ybWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFBDTURNWF9JTlZBTElEX01PREUsICAgICAgICAgICAgLyohPCBUaGUgc2V0IGNvbmZpZ3VyYXRpb24vbW9kZSBpcyBub3QgYXBwbGljYWJsZS4gICAgICAgICAgICAgKi8KLSAgUENNRE1YX1VOS05PV05fUEFSQU0sICAgICAgICAgICAvKiE8IFRoZSBoYW5kZWQgcGFyYW1ldGVyIGlzIG5vdCBrbm93bi9zdXBwb3J0ZWQuICAgICAgICAgICAgICAqLwotICBQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSwgICAgIC8qITwgVW5hYmxlIHRvIHNldCB0aGUgc3BlY2lmaWMgcGFyYW1ldGVyLiBNb3N0IHByb2JhYmx5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXN0IG91dCBvZiByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBICAgICAgICAgLyohPCBUaGUgcmVhZCBhbmNpbGxhcnkgZGF0YSB3YXMgY29ycnVwdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLQotfSBQQ01ETVhfRVJST1I7Ci0KLS8qKiBNYWNybyB0byBpZGVudGlmeSBmYXRhbCBlcnJvcnMuICovCi0jZGVmaW5lIFBDTURNWF9JU19GQVRBTF9FUlJPUihlcnIpICAgKCAoKChlcnIpPj1wY21fZG14X2ZhdGFsX2Vycm9yX3N0YXJ0KSAgICYmICgoZXJyKTw9cGNtX2RteF9mYXRhbF9lcnJvcl9lbmQpKSAgID8gMSA6IDApCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCi0gKiAgICAgUlVOVElNRSBQQVJBTVM6ICAgICAgKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi10eXBlZGVmIGVudW0KLXsKLSAgRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FLCAgICAgICAvKiE8IFRoZSBudW1iZXIgb2YgZnJhbWVzIHdpdGhvdXQgbmV3IG1ldGFkYXRhIHRoYXQgaGF2ZSB0byBnbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgYmVmb3JlIHRoZSBiaXRzdHJlYW0gZGF0YSBleHBpcmVzLiBUaGUgdmFsdWUgMCBkaXNhYmxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIERNWF9CU19EQVRBX0RFTEFZLCAgICAgICAgICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIGRlbGF5IGZyYW1lcyBvZiB0aGUgb3V0cHV0IHNhbXBsZXMgY29tcGFyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBiaXRzdHJlYW0gZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUywgIC8qITwgVGhlIG1pbmltdW0gbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gRm9yIGFsbCBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbnMgdGhhdCBoYXZlIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gY2hhbm5lbHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgd2lsbCBtb2RpZnkgdGhlIG91dHB1dCBhdXRvbWF0aWNhbGx5IHRvIG9idGFpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIE1vbm8gc2lnbmFscyB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkLiBJZiBtb3JlIHRoYW4gdHdvIG91dHB1dCBjaGFubmVscyBhcmUgZGVzaXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vZHVsZSBqdXN0IGFkZHMgZW1wdHkgY2hhbm5lbHMuIFRoZSBwYXJhbWV0ZXIgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgZWl0aGVyIC0xLCAwLCAxLCAyLCA2IG9yIDguIElmIHRoZSB2YWx1ZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHplcm8gYW5kIGV4Y2VlZHMgdGhlIHZhbHVlIG9mIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMgdGhlIGxhdHRlciB3aWxsIGJlIHNldCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgdmFsdWUuIEJvdGggdmFsdWVzIC0xIGFuZCAwIGRpc2FibGUgdGhlIGZlYXR1cmUuICovCi0gIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLCAgLyohPCBUaGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBGb3IgYWxsIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgbW9yZSB0aGFuIHRoZSBnaXZlbiBjaGFubmVscyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSB3aWxsIGFwcGx5IGEgbWl4ZG93biBhdXRvbWF0aWNhbGx5IHRvIG9idGFpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIFRoZSB2YWx1ZSBtdXN0IGJlIGVpdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDAsIDEsIDIsIDYgb3IgOC4gSWYgaXQgaXMgZ3JlYXRlciB0aGFuIHplcm8gYW5kIGxvd2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBlcXVhbCB0aGFuIHRoZSB2YWx1ZSBvZiBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHRoZSBsYXR0ZXIgd2lsbCBiZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIC0xIGFuZCAwIGRpc2FibGUgdGhlIGZlYXR1cmUuICAgICAgICAgICAgICAgICAgKi8KLSAgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFLCAgICAgICAgICAvKiE8IERvd25taXggbW9kZSBmb3IgdHdvIGNoYW5uZWwgYXVkaW8gZGF0YS4gICAgICAgICAgICAgICAgICAqLwotICBETVhfUFNFVURPX1NVUlJPVU5EX01PREUgICAgICAgIC8qITwgRGVmaW5lcyBob3cgbW9kdWxlIGhhbmRsZXMgcHNldWRvIHN1cnJvdW5kIGNvbXBhdGlibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbHMuIFNlZSBQU0VVRE9fU1VSUk9VTkRfTU9ERSB0eXBlIGZvciBkZXRhaWxzLiAgICAgICAqLwotfSBQQ01ETVhfUEFSQU07Ci0KLS8qIFBhcmFtZXRlciB2YWx1ZSB0eXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIE5FVkVSX0RPX1BTX0RNWCA9IC0xLCAgICAgICAgICAgLyohPCBOZXZlciBjcmVhdGUgYSBwc2V1ZG8gc3Vycm91bmQgY29tcGF0aWJsZSBkb3dubWl4LiAgICAgICAgKi8KLSAgQVVUT19QU19ETVggICAgID0gIDAsICAgICAgICAgICAvKiE8IENyZWF0ZSBhIHBzZXVkbyBzdXJyb3VuZCBjb21wYXRpYmxlIGRvd25taXggb25seSBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsbGVkIGluIGJpdHN0cmVhbXMgbWV0YSBkYXRhLiAoRGVmYXVsdCkgICAgICAgICAgICAgICovCi0gIEZPUkNFX1BTX0RNWCAgICA9ICAxICAgICAgICAgICAgLyohPCBBbHdheXMgY3JlYXRlIGEgcHNldWRvIHN1cnJvdW5kIGNvbXBhdGlibGUgZG93bm1peC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBVVRJT046IFRoaXMgY2FuIGxlYWQgdG8gZXhjZXNzaXZlIHNpZ25hbCBjYW5jZWxsYXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc2lnbmFsIGxldmVsIGRpZmZlcmVuY2VzIGZvciBub24tY29tcGF0aWJsZSBzaWduYWxzLiAgKi8KLX0gUFNFVURPX1NVUlJPVU5EX01PREU7Ci0KLXR5cGVkZWYgZW51bQotewotICBTVEVSRU9fTU9ERSA9IDB4MCwgICAgICAgICAgICAgIC8qITwgTGVhdmUgc3RlcmVvIHNpZ25hbHMgYXMgdGhleSBhcmUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIENIMV9NT0RFICAgID0gMHgxLCAgICAgICAgICAgICAgLyohPCBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMS4gICAgICAgICAgKi8KLSAgQ0gyX01PREUgICAgPSAweDIsICAgICAgICAgICAgICAvKiE8IENyZWF0ZSBhIGR1YWwgbW9ubyBvdXRwdXQgc2lnbmFsIGZyb20gY2hhbm5lbCAyLiAgICAgICAgICAqLwotICBNSVhFRF9NT0RFICA9IDB4MyAgICAgICAgICAgICAgIC8qITwgQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgYnkgbWl4aW5nIHRoZSB0d28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfSBEVUFMX0NIQU5ORUxfTU9ERTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgotICogICAgIE1PRFVMRVMgSU5URVJGQUNFOiAgICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUENNX0RNWF9JTlNUQU5DRSAqSEFORExFX1BDTV9ET1dOTUlYOwotCi0vKiBNb2R1bGVzIHJlc2V0IGZsYWdzICovCi0jZGVmaW5lIFBDTURNWF9SRVNFVF9QQVJBTVMgICAoIDEgKQotI2RlZmluZSBQQ01ETVhfUkVTRVRfQlNfREFUQSAgKCAyICkKLSNkZWZpbmUgUENNRE1YX1JFU0VUX0ZVTEwgICAgICggUENNRE1YX1JFU0VUX1BBUkFNUyB8IFBDTURNWF9SRVNFVF9CU19EQVRBICkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotLyoqIE9wZW4gYW5kIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZQotICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBoYW5kbGUgb2YgdGhlIG5ldyBpbnN0YW5jZS4KLSAqIEByZXR1cm5zICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1QQ01ETVhfRVJST1IgcGNtRG14X09wZW4gKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAqcFNlbGYKLSAgKTsKLQotLyoqIFNldCBvbmUgcGFyYW1ldGVyIGZvciBvbmUgaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KLSAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBpbnN0YW5jZS4KLSAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB0byBiZSBzZXQuCi0gKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdmFsdWUuCi0gKiBAcmV0dXJucyAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1QQ01ETVhfRVJST1IgcGNtRG14X1NldFBhcmFtICgKLSAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCi0gICAgY29uc3QgUENNRE1YX1BBUkFNICBwYXJhbSwKLSAgICBjb25zdCBJTlQgICAgICAgICAgIHZhbHVlCi0gICk7Ci0KLS8qKiBHZXQgb25lIHBhcmFtZXRlciB2YWx1ZSBvZiBvbmUgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgotICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KLSAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB0byBiZSBzZXQuCi0gKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBidWZmZXIgcmVjZWl2aW5nIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCi0gKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1QQ01ETVhfRVJST1IgcGNtRG14X0dldFBhcmFtICgKLSAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCi0gICAgY29uc3QgUENNRE1YX1BBUkFNICBwYXJhbSwKLSAgICBJTlQgKiBjb25zdCAgICAgICAgIHBWYWx1ZQotICApOwotCi0vKiogUmVhZCBkb3dubWl4IG1ldGEtZGF0YSBkaXJlY3RseSBmcm9tIGEgZ2l2ZW4gYml0c3RyZWFtLgotICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgotICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIEZESyBiaXRzdHJlYW0gYnVmZmVyLgotICogQHBhcmFtIFtpbl0gTGVuZ3RoIG9mIGFuY2lsbGFyeSBkYXRhIGluIGJpdHMuCi0gKiBAcGFyYW0gW2luXSBGbGFnIGluZGljYXRpbmcgd2hldGVyIHRoZSBhbmNpbGxhcnkgZGF0YSBpcyBmcm9tIGEgTVBFRy0xLzIgb3IgYW4gTVBFRy00IHN0cmVhbS4KLSAqIEByZXR1cm5zICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfUGFyc2UgKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKLSAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbSwKLSAgICBVSU5UICAgYW5jRGF0YUJpdHMsCi0gICAgaW50ICAgIGlzTXBlZzIKLSAgKTsKLQotLyoqIFJlYWQgZG93bm1peCBtZXRhLWRhdGEgZnJvbSBhIGdpdmVuIGRhdGEgYnVmZmVyLgotICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgotICogQHBhcmFtIFtpbl0gUG9pbnRlciB0byBhbmNpbGxhcnkgZGF0YSBidWZmZXIuCi0gKiBAcGFyYW0gW2luXSBTaXplIG9mIGFuY2lsbGFyeSBkYXRhIGluIGJ5dGVzLgotICogQHBhcmFtIFtpbl0gRmxhZyBpbmRpY2F0aW5nIHdoZXRlciB0aGUgYW5jaWxsYXJ5IGRhdGEgaXMgZnJvbSBhIE1QRUctMS8yIG9yIGFuIE1QRUctNCBzdHJlYW0uCi0gKiBAcmV0dXJucyAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1QQ01ETVhfRVJST1IgcGNtRG14X1JlYWREdmJBbmNEYXRhICgKLSAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCi0gICAgVUNIQVIgKnBBbmNEYXRhQnVmLAotICAgIFVJTlQgICBhbmNEYXRhQnl0ZXMsCi0gICAgaW50ICAgIGlzTXBlZzIKLSAgKTsKLQotLyoqIFNldCB0aGUgbWF0cml4IG1peGRvd24gaW5mb3JtYXRpb24gZXh0cmFjdGVkIGZyb20gdGhlIFBDRSBvZiBhbiBBQUMgYml0c3RyZWFtLgotICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgotICogQHBhcmFtIFtpbl0gTWF0cml4IG1peGRvd24gaW5kZXggcHJlc2VudCBmbGFnIGV4dHJhY3RlZCBmcm9tIFBDRS4KLSAqIEBwYXJhbSBbaW5dIFRoZSAyIGJpdCBtYXRyaXggbWl4ZG93biBpbmRleCBleHRyYWN0ZWQgZnJvbSBQQ0UuCi0gKiBAcGFyYW0gW2luXSBUaGUgcHNldWRvIHN1cnJvdW5kIGVuYWJsZSBmbGFnIGV4dHJhY3RlZCBmcm9tIFBDRS4KLSAqIEByZXR1cm5zICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfU2V0TWF0cml4TWl4ZG93bkZyb21QY2UgKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1hdHJpeE1peGRvd25QcmVzZW50LAotICAgIGludCAgICAgICAgICAgICAgICAgbWF0cml4TWl4ZG93bklkeCwKLSAgICBpbnQgICAgICAgICAgICAgICAgIHBzZXVkb1N1cnJvdW5kRW5hYmxlCi0gICk7Ci0KLS8qKiBSZXNldCB0aGUgbW9kdWxlLgotICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgotICogQHBhcmFtIFtpbl0gRmxhZ3MgdGVsbGluZyB3aGljaCBwYXJ0cyBvZiB0aGUgbW9kdWxlIHNoYWxsIGJlIHJlc2V0LgotICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICoqLwotUENNRE1YX0VSUk9SIHBjbURteF9SZXNldCAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAotICAgIFVJTlQgICAgICAgICAgICAgICAgZmxhZ3MKLSAgKTsKLQotLyoqIENyZWF0ZSBhIG1peGRvd24sIGJ5cGFzcyBvciBleHRlbmQgdGhlIG91dHB1dCBzaWduYWwgZGVwZW5kaW5nIG9uIHRoZSBtb2R1bGVzIHNldHRpbmdzIGFuZCB0aGUKLSAqICByZXNwZWN0aXZlIGdpdmVuIGlucHV0IGNvbmZpZ3VyYXRpb24uCi0gKgotICogXHBhcmFtIFtpbl0gICAgSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KLSAqIFxwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gdGltZSBidWZmZXIgd2l0aCBkZWNvZGVkIFBDTSBzYW1wbGVzLgotICogXHBhcmFtIFtpbl0gICAgVGhlIEkvTyBibG9jayBzaXplIHdoaWNoIGlzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbC4KLSAqIFxwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gYnVmZmVyIHRoYXQgaG9sZHMgdGhlIG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBhbmQgd2hlcmUgdGhlCi0gKiAgICAgICAgICAgICAgICBhbW91bnQgb2Ygb3V0cHV0IGNoYW5uZWxzIGlzIHdyaXR0ZW4gdG8uCi0gKiBccGFyYW0gW2luXSAgICBGbGFnIHdoaWNoIGluZGljYXRlcyBpZiBvdXRwdXQgdGltZSBkYXRhIGlzIHdyaXR0ZXJuIGludGVybGVhdmVkIG9yIGFzCi0gKiAgICAgICAgICAgICAgICBzdWJzZXF1ZW50IGJsb2Nrcy4KLSAqIFxwYXJhbSBbaW5vdXRdIEFycmF5IHdlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsIGlzCi0gKiAgICAgICAgICAgICAgICBzdG9yZWQgaW50by4KLSAqIFxwYXJhbSBbaW5vdXRdIEFycmF5IHdlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsCi0gKiAgICAgICAgICAgICAgICBpcyBzdG9yZWQgaW50by4KLSAqIFxwYXJhbSBbaW5dICAgIEFycmF5IGNvbnRhaW5pbmcgdGhlIG91dHB1dCBjaGFubmVsIG1hcHBpbmcgdG8gYmUgdXNlZCAoZnJvbSBNUEVHIFBDRSBvcmRlcmluZwotICogICAgICAgICAgICAgICAgdG8gd2hhdGV2ZXIgaXMgcmVxdWlyZWQpLgotICogXHBhcmFtIFtvdXRdICAgUG9pbnRlciBvbiBhIGZpZWxkIHJlY2VpdmluZyB0aGUgc2NhbGUgZmFjdG9yIHRoYXQgaGFzIHRvIGJlIGFwcGxpZWQgb24gYWxsCi0gKiAgICAgICAgICAgICAgICBzYW1wbGVzIGFmdGVyd2FyZHMuIElmIHRoZSBoYW5kZWQgcG9pbnRlciBpcyBOVUxMIHRoZSBmaW5hbCBzY2FsaW5nIGlzIGRvbmUKLSAqICAgICAgICAgICAgICAgIGludGVybmFsbHkuCi0gKiBAcmV0dXJucyAgICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1QQ01ETVhfRVJST1IgcGNtRG14X0FwcGx5RnJhbWUgKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgICAgIHNlbGYsCi0gICAgSU5UX1BDTSAgICAgICAgICAgICAgICAqcFBjbUJ1ZiwKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUsCi0gICAgSU5UICAgICAgICAgICAgICAgICAgICAqbkNoYW5uZWxzLAotICAgIGludCAgICAgICAgICAgICAgICAgICAgIGZJbnRlcmxlYXZlZCwKLSAgICBBVURJT19DSEFOTkVMX1RZUEUgICAgICBjaGFubmVsVHlwZVtdLAotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW10sCi0gICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmdbXVs4XSwKLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICpwRG14T3V0U2NhbGUKLSAgKTsKLQotLyoqIENsb3NlIGFuIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUuCi0gKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGhhbmRsZSBvZiB0aGUgaW5zdGFuY2UuCi0gKiBAcmV0dXJucyAgICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1QQ01ETVhfRVJST1IgcGNtRG14X0Nsb3NlICgKLSAgICBIQU5ETEVfUENNX0RPV05NSVggKnBTZWxmCi0gICk7Ci0KLS8qKiBHZXQgbGlicmFyeSBpbmZvIGZvciB0aGlzIG1vZHVsZS4KLSAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3R1cmUuCi0gKiBAcmV0dXJucyAgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICovCi1QQ01ETVhfRVJST1IgcGNtRG14X0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmICAvKiBfUENNVVRJTFNfTElCX0hfICovCmRpZmYgLS1naXQgYS9saWJQQ011dGlscy9zcmMvbGltaXRlci5jcHAgYi9saWJQQ011dGlscy9zcmMvbGltaXRlci5jcHAKaW5kZXggYWY3MjRmMC4uYTc5OWE1MSAxMDA2NDQKLS0tIGEvbGliUENNdXRpbHMvc3JjL2xpbWl0ZXIuY3BwCisrKyBiL2xpYlBDTXV0aWxzL3NyYy9saW1pdGVyLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0NiArOTAsMjggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqICBGREsgUENNIHBvc3Rwcm9jZXNzb3IgbW9kdWxlICAqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDTSB1dGlsaXR5IGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBOZXVzaW5nZXIKKwogICAgRGVzY3JpcHRpb246IEhhcmQgbGltaXRlciBmb3IgY2xpcHBpbmcgcHJldmVudGlvbgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAibGltaXRlci5oIgorI2luY2x1ZGUgIkZES19jb3JlLmgiCiAKLQotc3RydWN0IFRETGltaXRlciB7Ci0gIHVuc2lnbmVkIGludCAgYXR0YWNrOwotICBGSVhQX0RCTCAgICAgIGF0dGFja0NvbnN0LCByZWxlYXNlQ29uc3Q7Ci0gIHVuc2lnbmVkIGludCAgYXR0YWNrTXMsIHJlbGVhc2VNcywgbWF4QXR0YWNrTXM7Ci0gIEZJWFBfUENNICAgICAgdGhyZXNob2xkOwotICB1bnNpZ25lZCBpbnQgIGNoYW5uZWxzLCBtYXhDaGFubmVsczsKLSAgdW5zaWduZWQgaW50ICBzYW1wbGVSYXRlLCBtYXhTYW1wbGVSYXRlOwotICBGSVhQX0RCTCAgICAgIGNvciwgbWF4OwotICBGSVhQX0RCTCogICAgIG1heEJ1ZjsKLSAgRklYUF9EQkwqICAgICBkZWxheUJ1ZjsKLSAgdW5zaWduZWQgaW50ICBtYXhCdWZJZHgsIGRlbGF5QnVmSWR4OwotICBGSVhQX0RCTCAgICAgIHNtb290aFN0YXRlMDsKLSAgRklYUF9EQkwgICAgICBtaW5HYWluOwotCi0gIEZJWFBfREJMICAgICAgYWRkaXRpb25hbEdhaW5QcmV2OwotICBGSVhQX0RCTCAgICAgIGFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGU7Ci0gIEZJWFBfREJMICAgICAgYWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZTE7Ci19OworLyogbGlicmFyeSB2ZXJzaW9uICovCisjaW5jbHVkZSAidmVyc2lvbi5oIgorLyogbGlicmFyeSB0aXRsZSAqLworI2RlZmluZSBURExJTUlUX0xJQl9USVRMRSAiVEQgTGltaXRlciBMaWIiCiAKIC8qIGNyZWF0ZSBsaW1pdGVyICovCi1URExpbWl0ZXJQdHIgY3JlYXRlTGltaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgbWF4QXR0YWNrTXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIHJlbGVhc2VNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBtYXhDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgbWF4U2FtcGxlUmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworVERMaW1pdGVyUHRyIHBjbUxpbWl0ZXJfQ3JlYXRlKHVuc2lnbmVkIGludCBtYXhBdHRhY2tNcywgdW5zaWduZWQgaW50IHJlbGVhc2VNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0aHJlc2hvbGQsIHVuc2lnbmVkIGludCBtYXhDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIG1heFNhbXBsZVJhdGUpIHsKICAgVERMaW1pdGVyUHRyIGxpbWl0ZXIgPSBOVUxMOwogICB1bnNpZ25lZCBpbnQgYXR0YWNrLCByZWxlYXNlOwogICBGSVhQX0RCTCBhdHRhY2tDb25zdCwgcmVsZWFzZUNvbnN0LCBleHBvbmVudDsKQEAgLTEzMywxNiArMTI2LDE3IEBACiAgIGlmICghbGltaXRlcikgcmV0dXJuIE5VTEw7CiAKICAgLyogYWxsb2MgbWF4IGFuZCBkZWxheSBidWZmZXJzICovCi0gIGxpbWl0ZXItPm1heEJ1ZiAgID0gKEZJWFBfREJMKilGREtjYWxsb2MoYXR0YWNrICsgMSwgc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIGxpbWl0ZXItPmRlbGF5QnVmID0gKEZJWFBfREJMKilGREtjYWxsb2MoYXR0YWNrICogbWF4Q2hhbm5lbHMsIHNpemVvZihGSVhQX0RCTCkpOworICBsaW1pdGVyLT5tYXhCdWYgPSAoRklYUF9EQkwqKUZES2NhbGxvYyhhdHRhY2sgKyAxLCBzaXplb2YoRklYUF9EQkwpKTsKKyAgbGltaXRlci0+ZGVsYXlCdWYgPQorICAgICAgKEZJWFBfREJMKilGREtjYWxsb2MoYXR0YWNrICogbWF4Q2hhbm5lbHMsIHNpemVvZihGSVhQX0RCTCkpOwogCiAgIGlmICghbGltaXRlci0+bWF4QnVmIHx8ICFsaW1pdGVyLT5kZWxheUJ1ZikgewotICAgIGRlc3Ryb3lMaW1pdGVyKGxpbWl0ZXIpOworICAgIHBjbUxpbWl0ZXJfRGVzdHJveShsaW1pdGVyKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIC8qIGF0dGFja0NvbnN0ID0gcG93KDAuMSwgMS4wIC8gKGF0dGFjayArIDEpKSAqLwotICBleHBvbmVudCA9IGludkZpeHAoYXR0YWNrKzEpOworICBleHBvbmVudCA9IGludkZpeHAoYXR0YWNrICsgMSk7CiAgIGF0dGFja0NvbnN0ID0gZlBvdyhGTDJGWENPTlNUX0RCTCgwLjFmKSwgMCwgZXhwb25lbnQsIDAsICZlX2Fucyk7CiAgIGF0dGFja0NvbnN0ID0gc2NhbGVWYWx1ZShhdHRhY2tDb25zdCwgZV9hbnMpOwogCkBAIC0xNTIsMTQwICsxNDYsMTA3IEBACiAgIHJlbGVhc2VDb25zdCA9IHNjYWxlVmFsdWUocmVsZWFzZUNvbnN0LCBlX2Fucyk7CiAKICAgLyogaW5pdCBwYXJhbWV0ZXJzICovCi0gIGxpbWl0ZXItPmF0dGFja01zICAgICAgPSBtYXhBdHRhY2tNczsKLSAgbGltaXRlci0+bWF4QXR0YWNrTXMgICA9IG1heEF0dGFja01zOwotICBsaW1pdGVyLT5yZWxlYXNlTXMgICAgID0gcmVsZWFzZU1zOwotICBsaW1pdGVyLT5hdHRhY2sgICAgICAgID0gYXR0YWNrOwotICBsaW1pdGVyLT5hdHRhY2tDb25zdCAgID0gYXR0YWNrQ29uc3Q7Ci0gIGxpbWl0ZXItPnJlbGVhc2VDb25zdCAgPSByZWxlYXNlQ29uc3Q7Ci0gIGxpbWl0ZXItPnRocmVzaG9sZCAgICAgPSAoRklYUF9QQ00pdGhyZXNob2xkOwotICBsaW1pdGVyLT5jaGFubmVscyAgICAgID0gbWF4Q2hhbm5lbHM7Ci0gIGxpbWl0ZXItPm1heENoYW5uZWxzICAgPSBtYXhDaGFubmVsczsKLSAgbGltaXRlci0+c2FtcGxlUmF0ZSAgICA9IG1heFNhbXBsZVJhdGU7CisgIGxpbWl0ZXItPmF0dGFja01zID0gbWF4QXR0YWNrTXM7CisgIGxpbWl0ZXItPm1heEF0dGFja01zID0gbWF4QXR0YWNrTXM7CisgIGxpbWl0ZXItPnJlbGVhc2VNcyA9IHJlbGVhc2VNczsKKyAgbGltaXRlci0+YXR0YWNrID0gYXR0YWNrOworICBsaW1pdGVyLT5hdHRhY2tDb25zdCA9IGF0dGFja0NvbnN0OworICBsaW1pdGVyLT5yZWxlYXNlQ29uc3QgPSByZWxlYXNlQ29uc3Q7CisgIGxpbWl0ZXItPnRocmVzaG9sZCA9IHRocmVzaG9sZCA+PiBURExfR0FJTl9TQ0FMSU5HOworICBsaW1pdGVyLT5jaGFubmVscyA9IG1heENoYW5uZWxzOworICBsaW1pdGVyLT5tYXhDaGFubmVscyA9IG1heENoYW5uZWxzOworICBsaW1pdGVyLT5zYW1wbGVSYXRlID0gbWF4U2FtcGxlUmF0ZTsKICAgbGltaXRlci0+bWF4U2FtcGxlUmF0ZSA9IG1heFNhbXBsZVJhdGU7CiAKLSAgcmVzZXRMaW1pdGVyKGxpbWl0ZXIpOworICBwY21MaW1pdGVyX1Jlc2V0KGxpbWl0ZXIpOwogCiAgIHJldHVybiBsaW1pdGVyOwogfQogCi0KLS8qIHJlc2V0IGxpbWl0ZXIgKi8KLVRETElNSVRFUl9FUlJPUiByZXNldExpbWl0ZXIoVERMaW1pdGVyUHRyIGxpbWl0ZXIpCi17Ci0gIGlmIChsaW1pdGVyICE9IE5VTEwpIHsKLQotICAgIGxpbWl0ZXItPm1heEJ1ZklkeCA9IDA7Ci0gICAgbGltaXRlci0+ZGVsYXlCdWZJZHggPSAwOwotICAgIGxpbWl0ZXItPm1heCA9IChGSVhQX0RCTCkwOwotICAgIGxpbWl0ZXItPmNvciA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PDEpKTsKLSAgICBsaW1pdGVyLT5zbW9vdGhTdGF0ZTAgPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDwxKSk7Ci0gICAgbGltaXRlci0+bWluR2FpbiA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PDEpKTsKLQotICAgIGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluUHJldiA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PFRETF9HQUlOX1NDQUxJTkcpKTsKLSAgICBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8VERMX0dBSU5fU0NBTElORykpOwotICAgIGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGUxID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8VERMX0dBSU5fU0NBTElORykpOwotCi0gICAgRkRLbWVtc2V0KGxpbWl0ZXItPm1heEJ1ZiwgICAwLCAobGltaXRlci0+YXR0YWNrICsgMSkgKiBzaXplb2YoRklYUF9EQkwpICk7Ci0gICAgRkRLbWVtc2V0KGxpbWl0ZXItPmRlbGF5QnVmLCAwLCBsaW1pdGVyLT5hdHRhY2sgKiBsaW1pdGVyLT5jaGFubmVscyAqIHNpemVvZihGSVhQX0RCTCkgKTsKLSAgfQotICBlbHNlIHsKLSAgICByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKLSAgfQotCi0gIHJldHVybiBURExJTUlUX09LOwotfQotCi0KLS8qIGRlc3Ryb3kgbGltaXRlciAqLwotVERMSU1JVEVSX0VSUk9SIGRlc3Ryb3lMaW1pdGVyKFRETGltaXRlclB0ciBsaW1pdGVyKQotewotICBpZiAobGltaXRlciAhPSBOVUxMKSB7Ci0gICAgRkRLZnJlZShsaW1pdGVyLT5tYXhCdWYpOwotICAgIEZES2ZyZWUobGltaXRlci0+ZGVsYXlCdWYpOwotCi0gICAgRkRLZnJlZShsaW1pdGVyKTsKLSAgfQotICBlbHNlIHsKLSAgICByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKLSAgfQotICByZXR1cm4gVERMSU1JVF9PSzsKLX0KLQogLyogYXBwbHkgbGltaXRlciAqLwotVERMSU1JVEVSX0VSUk9SIGFwcGx5TGltaXRlcihURExpbWl0ZXJQdHIgbGltaXRlciwKLSAgICAgICAgICAgICAgICAgSU5UX1BDTSogICAgc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgRklYUF9EQkwqICAgIHBHYWluLAotICAgICAgICAgICAgICAgICBjb25zdCBJTlQqICAgZ2Fpbl9zY2FsZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgIGdhaW5fc2l6ZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgIGdhaW5fZGVsYXksCi0gICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICBuU2FtcGxlcykKLXsKK1RETElNSVRFUl9FUlJPUiBwY21MaW1pdGVyX0FwcGx5KFRETGltaXRlclB0ciBsaW1pdGVyLCBQQ01fTElNKiBzYW1wbGVzSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNKiBzYW1wbGVzT3V0LCBGSVhQX0RCTCogUkVTVFJJQ1QgcEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQqIFJFU1RSSUNUIGdhaW5fc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGdhaW5fc2l6ZSwgY29uc3QgVUlOVCBnYWluX2RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBuU2FtcGxlcykgewogICB1bnNpZ25lZCBpbnQgaSwgajsKLSAgRklYUF9QQ00gdG1wMSwgdG1wMjsKLSAgRklYUF9EQkwgdG1wLCBvbGQsIGdhaW4sIGFkZGl0aW9uYWxHYWluLCBhZGRpdGlvbmFsR2FpblVuZmlsdGVyZWQ7Ci0gIEZJWFBfREJMIG1pbkdhaW4gPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDwxKSk7CisgIEZJWFBfREJMIHRtcDE7CisgIEZJWFBfREJMIHRtcDI7CisgIEZJWFBfREJMIHRtcCwgb2xkLCBnYWluLCBhZGRpdGlvbmFsR2FpbiA9IDAsIGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZDsKKyAgRklYUF9EQkwgbWluR2FpbiA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoMSA8PCAxKSk7CiAKICAgRkRLX0FTU0VSVChnYWluX3NpemUgPT0gMSk7CiAgIEZES19BU1NFUlQoZ2Fpbl9kZWxheSA8PSBuU2FtcGxlcyk7CiAKLSAgaWYgKCBsaW1pdGVyID09IE5VTEwgKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKKyAgaWYgKGxpbWl0ZXIgPT0gTlVMTCkgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9IQU5ETEU7CiAKICAgewotICAgIHVuc2lnbmVkIGludCBjaGFubmVscyAgICAgICA9IGxpbWl0ZXItPmNoYW5uZWxzOwotICAgIHVuc2lnbmVkIGludCBhdHRhY2sgICAgICAgICA9IGxpbWl0ZXItPmF0dGFjazsKLSAgICBGSVhQX0RCTCAgICAgYXR0YWNrQ29uc3QgICAgPSBsaW1pdGVyLT5hdHRhY2tDb25zdDsKLSAgICBGSVhQX0RCTCAgICAgcmVsZWFzZUNvbnN0ICAgPSBsaW1pdGVyLT5yZWxlYXNlQ29uc3Q7Ci0gICAgRklYUF9EQkwgICAgIHRocmVzaG9sZCAgICAgID0gRlhfUENNMkZYX0RCTChsaW1pdGVyLT50aHJlc2hvbGQpPj5URExfR0FJTl9TQ0FMSU5HOworICAgIHVuc2lnbmVkIGludCBjaGFubmVscyA9IGxpbWl0ZXItPmNoYW5uZWxzOworICAgIHVuc2lnbmVkIGludCBhdHRhY2sgPSBsaW1pdGVyLT5hdHRhY2s7CisgICAgRklYUF9EQkwgYXR0YWNrQ29uc3QgPSBsaW1pdGVyLT5hdHRhY2tDb25zdDsKKyAgICBGSVhQX0RCTCByZWxlYXNlQ29uc3QgPSBsaW1pdGVyLT5yZWxlYXNlQ29uc3Q7CisgICAgRklYUF9EQkwgdGhyZXNob2xkID0gbGltaXRlci0+dGhyZXNob2xkOwogCi0gICAgRklYUF9EQkwgICAgIG1heCAgICAgICAgICAgID0gbGltaXRlci0+bWF4OwotICAgIEZJWFBfREJMKiAgICBtYXhCdWYgICAgICAgICA9IGxpbWl0ZXItPm1heEJ1ZjsKLSAgICB1bnNpZ25lZCBpbnQgbWF4QnVmSWR4ICAgICAgPSBsaW1pdGVyLT5tYXhCdWZJZHg7Ci0gICAgRklYUF9EQkwgICAgIGNvciAgICAgICAgICAgID0gbGltaXRlci0+Y29yOwotICAgIEZJWFBfREJMKiAgICBkZWxheUJ1ZiAgICAgICA9IGxpbWl0ZXItPmRlbGF5QnVmOwotICAgIHVuc2lnbmVkIGludCBkZWxheUJ1ZklkeCAgICA9IGxpbWl0ZXItPmRlbGF5QnVmSWR4OworICAgIEZJWFBfREJMIG1heCA9IGxpbWl0ZXItPm1heDsKKyAgICBGSVhQX0RCTCogbWF4QnVmID0gbGltaXRlci0+bWF4QnVmOworICAgIHVuc2lnbmVkIGludCBtYXhCdWZJZHggPSBsaW1pdGVyLT5tYXhCdWZJZHg7CisgICAgRklYUF9EQkwgY29yID0gbGltaXRlci0+Y29yOworICAgIEZJWFBfREJMKiBkZWxheUJ1ZiA9IGxpbWl0ZXItPmRlbGF5QnVmOworICAgIHVuc2lnbmVkIGludCBkZWxheUJ1ZklkeCA9IGxpbWl0ZXItPmRlbGF5QnVmSWR4OwogCi0gICAgRklYUF9EQkwgICAgIHNtb290aFN0YXRlMCAgID0gbGltaXRlci0+c21vb3RoU3RhdGUwOwotICAgIEZJWFBfREJMICAgICBhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlID0gbGltaXRlci0+YWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZTsKLSAgICBGSVhQX0RCTCAgICAgYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZTEgPSBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlMTsKKyAgICBGSVhQX0RCTCBzbW9vdGhTdGF0ZTAgPSBsaW1pdGVyLT5zbW9vdGhTdGF0ZTA7CisgICAgRklYUF9EQkwgYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZSA9IGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGU7CisgICAgRklYUF9EQkwgYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZTEgPSBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlMTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7Ci0KLSAgICAgIGlmIChpIDwgZ2Fpbl9kZWxheSkgewotICAgICAgICBhZGRpdGlvbmFsR2FpblVuZmlsdGVyZWQgPSBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpblByZXY7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhZGRpdGlvbmFsR2FpblVuZmlsdGVyZWQgPSBwR2FpblswXTsKLSAgICAgIH0KLQotICAgICAgLyogU21vb3RoIGFkZGl0aW9uYWxHYWluICovCi0gICAgICAvKiBbYixhXSA9IGJ1dHRlcigxLCAwLjAxKSAqLwotICAgICAgc3RhdGljIGNvbnN0IEZJWFBfU0dMIGJbXSA9IHsgRkwyRlhDT05TVF9TR0woMC4wMTU0NjYqMi4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDE1NDY2KjIuMCkgfTsKLSAgICAgIHN0YXRpYyBjb25zdCBGSVhQX1NHTCBhW10gPSB7IEZMMkZYQ09OU1RfU0dMKDEuMDAwMDAwKSwgRkwyRlhDT05TVF9TR0woLTAuOTY5MDcpIH07Ci0gICAgICAvKiBbYixhXSA9IGJ1dHRlcigxLCAwLjAwMSkgKi8KLSAgICAgIC8vc3RhdGljIGNvbnN0IEZJWFBfU0dMIGJbXSA9IHsgRkwyRlhDT05TVF9TR0woMC4wMDE1NjgzKjIuMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAwMTU2ODMqMi4wKSB9OwotICAgICAgLy9zdGF0aWMgY29uc3QgRklYUF9TR0wgYVtdID0geyBGTDJGWENPTlNUX1NHTCgxLjAwMDAwMDApLCBGTDJGWENPTlNUX1NHTCgtMC45OTY4NikgfTsKLSAgICAgIGFkZGl0aW9uYWxHYWluID0gLSBmTXVsdChhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlLCBhWzFdKSArIGZNdWx0RGl2MiggYWRkaXRpb25hbEdhaW5VbmZpbHRlcmVkLCBiWzBdKSArIGZNdWx0RGl2MihhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlMSwgYlsxXSk7Ci0gICAgICBhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlMSA9IGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZDsKLSAgICAgIGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUgPSBhZGRpdGlvbmFsR2FpbjsKLQotICAgICAgLyogQXBwbHkgdGhlIGFkZGl0aW9uYWwgc2NhbGluZyB0aGF0IGhhcyBubyBkZWxheSBhbmQgbm8gc21vb3RoaW5nICovCisgICAgaWYgKCFnYWluX2RlbGF5KSB7CisgICAgICBhZGRpdGlvbmFsR2FpbiA9IHBHYWluWzBdOwogICAgICAgaWYgKGdhaW5fc2NhbGVbMF0gPiAwKSB7CiAgICAgICAgIGFkZGl0aW9uYWxHYWluIDw8PSBnYWluX3NjYWxlWzBdOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgYWRkaXRpb25hbEdhaW4gPj49IGdhaW5fc2NhbGVbMF07CisgICAgICAgIGFkZGl0aW9uYWxHYWluID4+PSAtZ2Fpbl9zY2FsZVswXTsKICAgICAgIH0KKyAgICB9CiAKLSAgICAgIC8qIGdldCBtYXhpbXVtIGFic29sdXRlIHNhbXBsZSB2YWx1ZSBvZiBhbGwgY2hhbm5lbHMsIGluY2x1ZGluZyB0aGUgYWRkaXRpb25hbCBnYWluLiAqLwotICAgICAgdG1wMSA9IChGSVhQX1BDTSkwOworICAgIGZvciAoaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7CisgICAgICBpZiAoZ2Fpbl9kZWxheSkgeworICAgICAgICBpZiAoaSA8IGdhaW5fZGVsYXkpIHsKKyAgICAgICAgICBhZGRpdGlvbmFsR2FpblVuZmlsdGVyZWQgPSBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpblByZXY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWRkaXRpb25hbEdhaW5VbmZpbHRlcmVkID0gcEdhaW5bMF07CisgICAgICAgIH0KKworICAgICAgICAvKiBTbW9vdGggYWRkaXRpb25hbEdhaW4gKi8KKyAgICAgICAgLyogW2IsYV0gPSBidXR0ZXIoMSwgMC4wMSkgKi8KKyAgICAgICAgc3RhdGljIGNvbnN0IEZJWFBfU0dMIGJbXSA9IHtGTDJGWENPTlNUX1NHTCgwLjAxNTQ2NiAqIDIuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMC4wMTU0NjYgKiAyLjApfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IEZJWFBfU0dMIGFbXSA9IHsoRklYUF9TR0wpTUFYVkFMX1NHTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgtMC45NjkwNyl9OworICAgICAgICBhZGRpdGlvbmFsR2FpbiA9IC1mTXVsdChhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlLCBhWzFdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZCwgYlswXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlMSwgYlsxXSk7CisgICAgICAgIGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUxID0gYWRkaXRpb25hbEdhaW5VbmZpbHRlcmVkOworICAgICAgICBhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlID0gYWRkaXRpb25hbEdhaW47CisKKyAgICAgICAgLyogQXBwbHkgdGhlIGFkZGl0aW9uYWwgc2NhbGluZyB0aGF0IGhhcyBubyBkZWxheSBhbmQgbm8gc21vb3RoaW5nICovCisgICAgICAgIGlmIChnYWluX3NjYWxlWzBdID4gMCkgeworICAgICAgICAgIGFkZGl0aW9uYWxHYWluIDw8PSBnYWluX3NjYWxlWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFkZGl0aW9uYWxHYWluID4+PSAtZ2Fpbl9zY2FsZVswXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogZ2V0IG1heGltdW0gYWJzb2x1dGUgc2FtcGxlIHZhbHVlIG9mIGFsbCBjaGFubmVscywgaW5jbHVkaW5nIHRoZQorICAgICAgICogYWRkaXRpb25hbCBnYWluLiAqLworICAgICAgdG1wMSA9IChGSVhQX0RCTCkwOwogICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKLSAgICAgICAgICB0bXAyID0gKEZJWFBfUENNKXNhbXBsZXNbaSAqIGNoYW5uZWxzICsgal07Ci0gICAgICAgICAgaWYgKHRtcDIgPT0gKEZJWFBfUENNKVNBTVBMRV9NSU4pIC8qIHByb3RlY3QgZkFicyBmcm9tIC0xLjAgdmFsdWUgKi8KLSAgICAgICAgICAgICAgdG1wMiA9IChGSVhQX1BDTSkoU0FNUExFX01JTisxKTsKLSAgICAgICAgdG1wMSA9IGZNYXgodG1wMSwgZkFicyh0bXAyKSk7CisgICAgICAgIHRtcDIgPSBQQ01fTElNMkZJWFBfREJMKHNhbXBsZXNJbltqXSk7CisgICAgICAgIHRtcDIgPSBmQWJzKHRtcDIpOworICAgICAgICB0bXAyID0gRklYUF9EQkwoSU5UKHRtcDIpIF4gSU5UKCh0bXAyID4+IChTQU1QTEVfQklUU19MSU0gLSAxKSkpKTsKKyAgICAgICAgdG1wMSA9IGZNYXgodG1wMSwgdG1wMik7CiAgICAgICB9Ci0gICAgICB0bXAgPSBTQVRVUkFURV9MRUZUX1NISUZUKGZNdWx0RGl2Mih0bXAxLCBhZGRpdGlvbmFsR2FpbiksIDEsIERGUkFDVF9CSVRTKTsKKyAgICAgIHRtcCA9IGZNdWx0KHRtcDEsIGFkZGl0aW9uYWxHYWluKTsKIAotICAgICAgLyogc2V0IHRocmVzaG9sZCBhcyBsb3dlciBib3JkZXIgdG8gc2F2ZSBjYWxjdWxhdGlvbnMgaW4gcnVubmluZyBtYXhpbXVtIGFsZ29yaXRobSAqLworICAgICAgLyogc2V0IHRocmVzaG9sZCBhcyBsb3dlciBib3JkZXIgdG8gc2F2ZSBjYWxjdWxhdGlvbnMgaW4gcnVubmluZyBtYXhpbXVtCisgICAgICAgKiBhbGdvcml0aG0gKi8KICAgICAgIHRtcCA9IGZNYXgodG1wLCB0aHJlc2hvbGQpOwogCiAgICAgICAvKiBydW5uaW5nIG1heGltdW0gKi8KQEAgLTI5NSw3NSArMjU2LDk3IEBACiAgICAgICBpZiAodG1wID49IG1heCkgewogICAgICAgICAvKiBuZXcgc2FtcGxlIGlzIGdyZWF0ZXIgdGhhbiBvbGQgbWF4aW11bSwgc28gaXQgaXMgdGhlIG5ldyBtYXhpbXVtICovCiAgICAgICAgIG1heCA9IHRtcDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9sZCA8IG1heCkgeworICAgICAgfSBlbHNlIGlmIChvbGQgPCBtYXgpIHsKICAgICAgICAgLyogbWF4aW11bSBkb2VzIG5vdCBjaGFuZ2UsIGFzIHRoZSBzYW1wbGUsIHdoaWNoIGhhcyBsZWZ0IHRoZSB3aW5kb3cgd2FzCiAgICAgICAgICAgIG5vdCB0aGUgbWF4aW11bSAqLwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICB9IGVsc2UgewogICAgICAgICAvKiB0aGUgb2xkIG1heGltdW0gaGFzIGxlZnQgdGhlIHdpbmRvdywgd2UgaGF2ZSB0byBzZWFyY2ggdGhlIGNvbXBsZXRlCiAgICAgICAgICAgIGJ1ZmZlciBmb3IgdGhlIG5ldyBtYXggKi8KICAgICAgICAgbWF4ID0gbWF4QnVmWzBdOwogICAgICAgICBmb3IgKGogPSAxOyBqIDw9IGF0dGFjazsgaisrKSB7Ci0gICAgICAgICAgaWYgKG1heEJ1ZltqXSA+IG1heCkgbWF4ID0gbWF4QnVmW2pdOworICAgICAgICAgIG1heCA9IGZNYXgobWF4LCBtYXhCdWZbal0pOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBtYXhCdWZJZHgrKzsKLSAgICAgIGlmIChtYXhCdWZJZHggPj0gYXR0YWNrKzEpIG1heEJ1ZklkeCA9IDA7CisgICAgICBpZiAobWF4QnVmSWR4ID49IGF0dGFjayArIDEpIG1heEJ1ZklkeCA9IDA7CiAKICAgICAgIC8qIGNhbGMgZ2FpbiAqLwogICAgICAgLyogZ2FpbiBpcyBkb3duc2NhbGVkIGJ5IG9uZSwgc28gdGhhdCBnYWluID0gMS4wIGNhbiBiZSByZXByZXNlbnRlZCAqLwogICAgICAgaWYgKG1heCA+IHRocmVzaG9sZCkgewotICAgICAgICBnYWluID0gZkRpdk5vcm0odGhyZXNob2xkLCBtYXgpPj4xOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGdhaW4gPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDwxKSk7CisgICAgICAgIGdhaW4gPSBmRGl2Tm9ybSh0aHJlc2hvbGQsIG1heCkgPj4gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdhaW4gPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKDEgPDwgMSkpOwogICAgICAgfQogCiAgICAgICAvKiBnYWluIHNtb290aGluZywgbWV0aG9kOiBURExfRVhQT05FTlRJQUwgKi8KICAgICAgIC8qIGZpcnN0IG9yZGVyIElJUiBmaWx0ZXIgd2l0aCBhdHRhY2sgY29ycmVjdGlvbiB0byBhdm9pZCBvdmVyc2hvb3RzICovCiAKLSAgICAgIC8qIGNvcnJlY3QgdGhlICdhaW1pbmcnIHZhbHVlIG9mIHRoZSBleHBvbmVudGlhbCBhdHRhY2sgdG8gYXZvaWQgdGhlIHJlbWFpbmluZyBvdmVyc2hvb3QgKi8KKyAgICAgIC8qIGNvcnJlY3QgdGhlICdhaW1pbmcnIHZhbHVlIG9mIHRoZSBleHBvbmVudGlhbCBhdHRhY2sgdG8gYXZvaWQgdGhlCisgICAgICAgKiByZW1haW5pbmcgb3ZlcnNob290ICovCiAgICAgICBpZiAoZ2FpbiA8IHNtb290aFN0YXRlMCkgewotICAgICAgICBjb3IgPSBmTWluKGNvciwgZk11bHREaXYyKChnYWluIC0gZk11bHREaXYyKEZMMkZYQ09OU1RfU0dMKDAuMWYqKDE8PDEpKSxzbW9vdGhTdGF0ZTApKSwgRkwyRlhDT05TVF9TR0woMS4xMTExMTExMWYvKDE8PDEpKSk8PDIpOwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICAgIGNvciA9IGZNaW4oY29yLAorICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MigoZ2FpbiAtIGZNdWx0RGl2MihGTDJGWENPTlNUX1NHTCgwLjFmICogKDEgPDwgMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhTdGF0ZTApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMS4xMTExMTExMWYgLyAoMSA8PCAxKSkpCisgICAgICAgICAgICAgICAgICAgICAgIDw8IDIpOworICAgICAgfSBlbHNlIHsKICAgICAgICAgY29yID0gZ2FpbjsKICAgICAgIH0KIAogICAgICAgLyogc21vb3RoaW5nIGZpbHRlciAqLwogICAgICAgaWYgKGNvciA8IHNtb290aFN0YXRlMCkgewotICAgICAgICBzbW9vdGhTdGF0ZTAgPSBmTXVsdChhdHRhY2tDb25zdCwoc21vb3RoU3RhdGUwIC0gY29yKSkgKyBjb3I7ICAvKiBhdHRhY2sgKi8KKyAgICAgICAgc21vb3RoU3RhdGUwID0KKyAgICAgICAgICAgIGZNdWx0KGF0dGFja0NvbnN0LCAoc21vb3RoU3RhdGUwIC0gY29yKSkgKyBjb3I7IC8qIGF0dGFjayAqLwogICAgICAgICBzbW9vdGhTdGF0ZTAgPSBmTWF4KHNtb290aFN0YXRlMCwgZ2Fpbik7IC8qIGF2b2lkIG92ZXJzaG9vdGluZyB0YXJnZXQgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogc2lnbiBpbnZlcnNpb24gdHdpY2UgdG8gcm91bmQgdG93YXJkcyAraW5maW5pdHksCiAgICAgICAgICAgIHNvIHRoYXQgZ2FpbiBjYW4gY29udmVyZ2UgdG8gMS4wIGFnYWluLAogICAgICAgICAgICBmb3IgYml0LWlkZW50aWNhbCBvdXRwdXQgd2hlbiBsaW1pdGVyIGlzIG5vdCBhY3RpdmUgKi8KLSAgICAgICAgc21vb3RoU3RhdGUwID0gLWZNdWx0KHJlbGVhc2VDb25zdCwtKHNtb290aFN0YXRlMCAtIGNvcikpICsgY29yOyAvKiByZWxlYXNlICovCisgICAgICAgIHNtb290aFN0YXRlMCA9CisgICAgICAgICAgICAtZk11bHQocmVsZWFzZUNvbnN0LCAtKHNtb290aFN0YXRlMCAtIGNvcikpICsgY29yOyAvKiByZWxlYXNlICovCiAgICAgICB9CiAKICAgICAgIGdhaW4gPSBzbW9vdGhTdGF0ZTA7CiAKLSAgICAgIC8qIGxvb2thaGVhZCBkZWxheSwgYXBwbHkgZ2FpbiAqLwotICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgIEZJWFBfREJMKiBwX2RlbGF5QnVmID0gJmRlbGF5QnVmW2RlbGF5QnVmSWR4ICogY2hhbm5lbHMgKyAwXTsKKyAgICAgIGlmIChnYWluIDwgRkwyRlhDT05TVF9EQkwoMS4wZiAvICgxIDw8IDEpKSkgeworICAgICAgICBnYWluIDw8PSAxOworICAgICAgICAvKiBsb29rYWhlYWQgZGVsYXksIGFwcGx5IGdhaW4gKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICB0bXAgPSBwX2RlbGF5QnVmW2pdOworICAgICAgICAgIHBfZGVsYXlCdWZbal0gPSBmTXVsdCgoRklYUF9QQ01fTElNKXNhbXBsZXNJbltqXSwgYWRkaXRpb25hbEdhaW4pOwogCi0gICAgICAgIHRtcCA9IGRlbGF5QnVmW2RlbGF5QnVmSWR4ICogY2hhbm5lbHMgKyBqXTsKLSAgICAgICAgZGVsYXlCdWZbZGVsYXlCdWZJZHggKiBjaGFubmVscyArIGpdID0gZk11bHQoKEZJWFBfUENNKXNhbXBsZXNbaSAqIGNoYW5uZWxzICsgal0sIGFkZGl0aW9uYWxHYWluKTsKKyAgICAgICAgICAvKiBBcHBseSBnYWluIHRvIGRlbGF5ZWQgc2lnbmFsICovCisgICAgICAgICAgdG1wID0gZk11bHREaXYyKHRtcCwgZ2Fpbik7CiAKLSAgICAgICAgLyogQXBwbHkgZ2FpbiB0byBkZWxheWVkIHNpZ25hbCAqLwotICAgICAgICBpZiAoZ2FpbiA8IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PDEpKSkKLSAgICAgICAgICB0bXAgPSBmTXVsdCh0bXAsZ2Fpbjw8MSk7Ci0KLSAgICAgICAgc2FtcGxlc1tpICogY2hhbm5lbHMgKyBqXSA9IEZYX0RCTDJGWF9QQ00oKEZJWFBfREJMKVNBVFVSQVRFX0xFRlRfU0hJRlQodG1wLFRETF9HQUlOX1NDQUxJTkcsREZSQUNUX0JJVFMpKTsKKyAgICAgICAgICBzYW1wbGVzT3V0W2pdID0gKElOVF9QQ00pRlhfREJMMkZYX1BDTSgoRklYUF9EQkwpU0FUVVJBVEVfTEVGVF9TSElGVCgKKyAgICAgICAgICAgICAgdG1wLCBURExfR0FJTl9TQ0FMSU5HICsgMSwgREZSQUNUX0JJVFMpKTsKKyAgICAgICAgfQorICAgICAgICBnYWluID4+PSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbG9va2FoZWFkIGRlbGF5LCBhcHBseSBnYWluPTEuMGYgKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICB0bXAgPSBwX2RlbGF5QnVmW2pdOworICAgICAgICAgIHBfZGVsYXlCdWZbal0gPSBmTXVsdCgoRklYUF9QQ01fTElNKXNhbXBsZXNJbltqXSwgYWRkaXRpb25hbEdhaW4pOworICAgICAgICAgIHNhbXBsZXNPdXRbal0gPSAoSU5UX1BDTSlGWF9EQkwyRlhfUENNKChGSVhQX0RCTClTQVRVUkFURV9MRUZUX1NISUZUKAorICAgICAgICAgICAgICB0bXAsIFRETF9HQUlOX1NDQUxJTkcsIERGUkFDVF9CSVRTKSk7CisgICAgICAgIH0KICAgICAgIH0KKwogICAgICAgZGVsYXlCdWZJZHgrKzsKLSAgICAgIGlmIChkZWxheUJ1ZklkeCA+PSBhdHRhY2spIGRlbGF5QnVmSWR4ID0gMDsKKyAgICAgIGlmIChkZWxheUJ1ZklkeCA+PSBhdHRhY2spIHsKKyAgICAgICAgZGVsYXlCdWZJZHggPSAwOworICAgICAgfQogCiAgICAgICAvKiBzYXZlIG1pbmltdW0gZ2FpbiBmYWN0b3IgKi8KLSAgICAgIGlmIChnYWluIDwgbWluR2FpbikgbWluR2FpbiA9IGdhaW47Ci0gICAgfQorICAgICAgaWYgKGdhaW4gPCBtaW5HYWluKSB7CisgICAgICAgIG1pbkdhaW4gPSBnYWluOworICAgICAgfQogCisgICAgICAvKiBhZHZhbmNlIHNhbXBsZSBwb2ludGVyIGJ5IDxjaGFubmVsPiBzYW1wbGVzICovCisgICAgICBzYW1wbGVzSW4gKz0gY2hhbm5lbHM7CisgICAgICBzYW1wbGVzT3V0ICs9IGNoYW5uZWxzOworICAgIH0KIAogICAgIGxpbWl0ZXItPm1heCA9IG1heDsKICAgICBsaW1pdGVyLT5tYXhCdWZJZHggPSBtYXhCdWZJZHg7CkBAIC0zODIsMzQgKzM2NSw5OSBAQAogICB9CiB9CiAKKy8qIHNldCBsaW1pdGVyIHRocmVzaG9sZCAqLworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfU2V0VGhyZXNob2xkKFRETGltaXRlclB0ciBsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRocmVzaG9sZCkgeworICBpZiAobGltaXRlciA9PSBOVUxMKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKKworICBsaW1pdGVyLT50aHJlc2hvbGQgPSB0aHJlc2hvbGQgPj4gVERMX0dBSU5fU0NBTElORzsKKworICByZXR1cm4gVERMSU1JVF9PSzsKK30KKworLyogcmVzZXQgbGltaXRlciAqLworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfUmVzZXQoVERMaW1pdGVyUHRyIGxpbWl0ZXIpIHsKKyAgaWYgKGxpbWl0ZXIgIT0gTlVMTCkgeworICAgIGxpbWl0ZXItPm1heEJ1ZklkeCA9IDA7CisgICAgbGltaXRlci0+ZGVsYXlCdWZJZHggPSAwOworICAgIGxpbWl0ZXItPm1heCA9IChGSVhQX0RCTCkwOworICAgIGxpbWl0ZXItPmNvciA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoMSA8PCAxKSk7CisgICAgbGltaXRlci0+c21vb3RoU3RhdGUwID0gRkwyRlhDT05TVF9EQkwoMS4wZiAvICgxIDw8IDEpKTsKKyAgICBsaW1pdGVyLT5taW5HYWluID0gRkwyRlhDT05TVF9EQkwoMS4wZiAvICgxIDw8IDEpKTsKKworICAgIGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluUHJldiA9CisgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoMSA8PCBURExfR0FJTl9TQ0FMSU5HKSk7CisgICAgbGltaXRlci0+YWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZSA9CisgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoMSA8PCBURExfR0FJTl9TQ0FMSU5HKSk7CisgICAgbGltaXRlci0+YWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZTEgPQorICAgICAgICBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKDEgPDwgVERMX0dBSU5fU0NBTElORykpOworCisgICAgRkRLbWVtc2V0KGxpbWl0ZXItPm1heEJ1ZiwgMCwgKGxpbWl0ZXItPmF0dGFjayArIDEpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtc2V0KGxpbWl0ZXItPmRlbGF5QnVmLCAwLAorICAgICAgICAgICAgICBsaW1pdGVyLT5hdHRhY2sgKiBsaW1pdGVyLT5jaGFubmVscyAqIHNpemVvZihGSVhQX0RCTCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworICB9CisKKyAgcmV0dXJuIFRETElNSVRfT0s7Cit9CisKKy8qIGRlc3Ryb3kgbGltaXRlciAqLworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfRGVzdHJveShURExpbWl0ZXJQdHIgbGltaXRlcikgeworICBpZiAobGltaXRlciAhPSBOVUxMKSB7CisgICAgRkRLZnJlZShsaW1pdGVyLT5tYXhCdWYpOworICAgIEZES2ZyZWUobGltaXRlci0+ZGVsYXlCdWYpOworCisgICAgRkRLZnJlZShsaW1pdGVyKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKKyAgfQorICByZXR1cm4gVERMSU1JVF9PSzsKK30KKwogLyogZ2V0IGRlbGF5IGluIHNhbXBsZXMgKi8KLXVuc2lnbmVkIGludCBnZXRMaW1pdGVyRGVsYXkoVERMaW1pdGVyUHRyIGxpbWl0ZXIpCi17Cit1bnNpZ25lZCBpbnQgcGNtTGltaXRlcl9HZXREZWxheShURExpbWl0ZXJQdHIgbGltaXRlcikgewogICBGREtfQVNTRVJUKGxpbWl0ZXIgIT0gTlVMTCk7CiAgIHJldHVybiBsaW1pdGVyLT5hdHRhY2s7CiB9CiAKKy8qIGdldCBtYXhpbXVtIGdhaW4gcmVkdWN0aW9uIG9mIGxhc3QgcHJvY2Vzc2VkIGJsb2NrICovCitJTlQgcGNtTGltaXRlcl9HZXRNYXhHYWluUmVkdWN0aW9uKFRETGltaXRlclB0ciBsaW1pdGVyKSB7CisgIC8qIG1heGltdW0gZ2FpbiByZWR1Y3Rpb24gaW4gZEIgPSAtMjAgKiBsb2cxMChsaW1pdGVyLT5taW5HYWluKQorICAgICA9IC0yMCAqIGxvZzIobGltaXRlci0+bWluR2FpbikvbG9nMigxMCkgPSAtNi4wMjA2KmxvZzIobGltaXRlci0+bWluR2FpbikgKi8KKyAgaW50IGVfYW5zOworICBGSVhQX0RCTCBsb2dnYWluLCBtYXhHYWluUmVkdWN0aW9uOworCisgIEZES19BU1NFUlQobGltaXRlciAhPSBOVUxMKTsKKworICBsb2dnYWluID0gZkxvZzIobGltaXRlci0+bWluR2FpbiwgMSwgJmVfYW5zKTsKKworICBtYXhHYWluUmVkdWN0aW9uID0gZk11bHQobG9nZ2FpbiwgRkwyRlhDT05TVF9EQkwoLTYuMDIwNmYgLyAoMSA8PCAzKSkpOworCisgIHJldHVybiBmaXhwX3JvdW5kVG9JbnQobWF4R2FpblJlZHVjdGlvbiwgKGVfYW5zICsgMykpOworfQorCiAvKiBzZXQgbnVtYmVyIG9mIGNoYW5uZWxzICovCi1URExJTUlURVJfRVJST1Igc2V0TGltaXRlck5DaGFubmVscyhURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IG5DaGFubmVscykKLXsKLSAgaWYgKCBsaW1pdGVyID09IE5VTEwgKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKK1RETElNSVRFUl9FUlJPUiBwY21MaW1pdGVyX1NldE5DaGFubmVscyhURExpbWl0ZXJQdHIgbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbkNoYW5uZWxzKSB7CisgIGlmIChsaW1pdGVyID09IE5VTEwpIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOwogCiAgIGlmIChuQ2hhbm5lbHMgPiBsaW1pdGVyLT5tYXhDaGFubmVscykgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI7CiAKICAgbGltaXRlci0+Y2hhbm5lbHMgPSBuQ2hhbm5lbHM7Ci0gIC8vcmVzZXRMaW1pdGVyKGxpbWl0ZXIpOworICAvLyBwY21MaW1pdGVyX1Jlc2V0KGxpbWl0ZXIpOwogCiAgIHJldHVybiBURExJTUlUX09LOwogfQogCiAvKiBzZXQgc2FtcGxpbmcgcmF0ZSAqLwotVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJTYW1wbGVSYXRlKFRETGltaXRlclB0ciBsaW1pdGVyLCB1bnNpZ25lZCBpbnQgc2FtcGxlUmF0ZSkKLXsKK1RETElNSVRFUl9FUlJPUiBwY21MaW1pdGVyX1NldFNhbXBsZVJhdGUoVERMaW1pdGVyUHRyIGxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxlUmF0ZSkgewogICB1bnNpZ25lZCBpbnQgYXR0YWNrLCByZWxlYXNlOwogICBGSVhQX0RCTCBhdHRhY2tDb25zdCwgcmVsZWFzZUNvbnN0LCBleHBvbmVudDsKICAgSU5UIGVfYW5zOwogCi0gIGlmICggbGltaXRlciA9PSBOVUxMICkgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9IQU5ETEU7CisgIGlmIChsaW1pdGVyID09IE5VTEwpIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOwogCiAgIGlmIChzYW1wbGVSYXRlID4gbGltaXRlci0+bWF4U2FtcGxlUmF0ZSkgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI7CiAKQEAgLTQxOCw3ICs0NjYsNyBAQAogICByZWxlYXNlID0gKHVuc2lnbmVkIGludCkobGltaXRlci0+cmVsZWFzZU1zICogc2FtcGxlUmF0ZSAvIDEwMDApOwogCiAgIC8qIGF0dGFja0NvbnN0ID0gcG93KDAuMSwgMS4wIC8gKGF0dGFjayArIDEpKSAqLwotICBleHBvbmVudCA9IGludkZpeHAoYXR0YWNrKzEpOworICBleHBvbmVudCA9IGludkZpeHAoYXR0YWNrICsgMSk7CiAgIGF0dGFja0NvbnN0ID0gZlBvdyhGTDJGWENPTlNUX0RCTCgwLjFmKSwgMCwgZXhwb25lbnQsIDAsICZlX2Fucyk7CiAgIGF0dGFja0NvbnN0ID0gc2NhbGVWYWx1ZShhdHRhY2tDb25zdCwgZV9hbnMpOwogCkBAIC00MjcsMjUgKzQ3NSwyNSBAQAogICByZWxlYXNlQ29uc3QgPSBmUG93KEZMMkZYQ09OU1RfREJMKDAuMWYpLCAwLCBleHBvbmVudCwgMCwgJmVfYW5zKTsKICAgcmVsZWFzZUNvbnN0ID0gc2NhbGVWYWx1ZShyZWxlYXNlQ29uc3QsIGVfYW5zKTsKIAotICBsaW1pdGVyLT5hdHRhY2sgICAgICAgID0gYXR0YWNrOwotICBsaW1pdGVyLT5hdHRhY2tDb25zdCAgID0gYXR0YWNrQ29uc3Q7Ci0gIGxpbWl0ZXItPnJlbGVhc2VDb25zdCAgPSByZWxlYXNlQ29uc3Q7Ci0gIGxpbWl0ZXItPnNhbXBsZVJhdGUgICAgPSBzYW1wbGVSYXRlOworICBsaW1pdGVyLT5hdHRhY2sgPSBhdHRhY2s7CisgIGxpbWl0ZXItPmF0dGFja0NvbnN0ID0gYXR0YWNrQ29uc3Q7CisgIGxpbWl0ZXItPnJlbGVhc2VDb25zdCA9IHJlbGVhc2VDb25zdDsKKyAgbGltaXRlci0+c2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAKICAgLyogcmVzZXQgKi8KLSAgLy9yZXNldExpbWl0ZXIobGltaXRlcik7CisgIC8vIHBjbUxpbWl0ZXJfUmVzZXQobGltaXRlcik7CiAKICAgcmV0dXJuIFRETElNSVRfT0s7CiB9CiAKIC8qIHNldCBhdHRhY2sgdGltZSAqLwotVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJBdHRhY2soVERMaW1pdGVyUHRyIGxpbWl0ZXIsIHVuc2lnbmVkIGludCBhdHRhY2tNcykKLXsKK1RETElNSVRFUl9FUlJPUiBwY21MaW1pdGVyX1NldEF0dGFjayhURExpbWl0ZXJQdHIgbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYXR0YWNrTXMpIHsKICAgdW5zaWduZWQgaW50IGF0dGFjazsKICAgRklYUF9EQkwgYXR0YWNrQ29uc3QsIGV4cG9uZW50OwogICBJTlQgZV9hbnM7CiAKLSAgaWYgKCBsaW1pdGVyID09IE5VTEwgKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKKyAgaWYgKGxpbWl0ZXIgPT0gTlVMTCkgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9IQU5ETEU7CiAKICAgaWYgKGF0dGFja01zID4gbGltaXRlci0+bWF4QXR0YWNrTXMpIHJldHVybiBURExJTUlUX0lOVkFMSURfUEFSQU1FVEVSOwogCkBAIC00NTMsMjUgKzUwMSwyNSBAQAogICBhdHRhY2sgPSAodW5zaWduZWQgaW50KShhdHRhY2tNcyAqIGxpbWl0ZXItPnNhbXBsZVJhdGUgLyAxMDAwKTsKIAogICAvKiBhdHRhY2tDb25zdCA9IHBvdygwLjEsIDEuMCAvIChhdHRhY2sgKyAxKSkgKi8KLSAgZXhwb25lbnQgPSBpbnZGaXhwKGF0dGFjaysxKTsKKyAgZXhwb25lbnQgPSBpbnZGaXhwKGF0dGFjayArIDEpOwogICBhdHRhY2tDb25zdCA9IGZQb3coRkwyRlhDT05TVF9EQkwoMC4xZiksIDAsIGV4cG9uZW50LCAwLCAmZV9hbnMpOwogICBhdHRhY2tDb25zdCA9IHNjYWxlVmFsdWUoYXR0YWNrQ29uc3QsIGVfYW5zKTsKIAotICBsaW1pdGVyLT5hdHRhY2sgICAgICAgID0gYXR0YWNrOwotICBsaW1pdGVyLT5hdHRhY2tDb25zdCAgID0gYXR0YWNrQ29uc3Q7Ci0gIGxpbWl0ZXItPmF0dGFja01zICAgICAgPSBhdHRhY2tNczsKKyAgbGltaXRlci0+YXR0YWNrID0gYXR0YWNrOworICBsaW1pdGVyLT5hdHRhY2tDb25zdCA9IGF0dGFja0NvbnN0OworICBsaW1pdGVyLT5hdHRhY2tNcyA9IGF0dGFja01zOwogCiAgIHJldHVybiBURExJTUlUX09LOwogfQogCiAvKiBzZXQgcmVsZWFzZSB0aW1lICovCi1URExJTUlURVJfRVJST1Igc2V0TGltaXRlclJlbGVhc2UoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIHVuc2lnbmVkIGludCByZWxlYXNlTXMpCi17CitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9TZXRSZWxlYXNlKFRETGltaXRlclB0ciBsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVsZWFzZU1zKSB7CiAgIHVuc2lnbmVkIGludCByZWxlYXNlOwogICBGSVhQX0RCTCByZWxlYXNlQ29uc3QsIGV4cG9uZW50OwogICBJTlQgZV9hbnM7CiAKLSAgaWYgKCBsaW1pdGVyID09IE5VTEwgKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKKyAgaWYgKGxpbWl0ZXIgPT0gTlVMTCkgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9IQU5ETEU7CiAKICAgLyogY2FsY3VsYXRlICByZWxlYXNlIHRpbWUgaW4gc2FtcGxlcyAqLwogICByZWxlYXNlID0gKHVuc2lnbmVkIGludCkocmVsZWFzZU1zICogbGltaXRlci0+c2FtcGxlUmF0ZSAvIDEwMDApOwpAQCAtNDgxLDE4ICs1MjksNDIgQEAKICAgcmVsZWFzZUNvbnN0ID0gZlBvdyhGTDJGWENPTlNUX0RCTCgwLjFmKSwgMCwgZXhwb25lbnQsIDAsICZlX2Fucyk7CiAgIHJlbGVhc2VDb25zdCA9IHNjYWxlVmFsdWUocmVsZWFzZUNvbnN0LCBlX2Fucyk7CiAKLSAgbGltaXRlci0+cmVsZWFzZUNvbnN0ICA9IHJlbGVhc2VDb25zdDsKLSAgbGltaXRlci0+cmVsZWFzZU1zICAgICA9IHJlbGVhc2VNczsKKyAgbGltaXRlci0+cmVsZWFzZUNvbnN0ID0gcmVsZWFzZUNvbnN0OworICBsaW1pdGVyLT5yZWxlYXNlTXMgPSByZWxlYXNlTXM7CiAKICAgcmV0dXJuIFRETElNSVRfT0s7CiB9CiAKLS8qIHNldCBsaW1pdGVyIHRocmVzaG9sZCAqLwotVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJUaHJlc2hvbGQoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIElOVF9QQ00gdGhyZXNob2xkKQotewotICBpZiAoIGxpbWl0ZXIgPT0gTlVMTCApIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworLyogR2V0IGxpYnJhcnkgaW5mbyBmb3IgdGhpcyBtb2R1bGUuICovCitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9HZXRMaWJJbmZvKExJQl9JTkZPKiBpbmZvKSB7CisgIGludCBpOwogCi0gIGxpbWl0ZXItPnRocmVzaG9sZCA9IChGSVhQX1BDTSl0aHJlc2hvbGQ7CisgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICByZXR1cm4gVERMSU1JVF9JTlZBTElEX1BBUkFNRVRFUjsKKyAgfQorCisgIC8qIFNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLworICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKKyAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpIGJyZWFrOworICB9CisgIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgeworICAgIHJldHVybiBURExJTUlUX1VOS05PV047CisgIH0KKworICAvKiBBZGQgdGhlIGxpYnJhcnkgaW5mbyAqLworICBpbmZvW2ldLm1vZHVsZV9pZCA9IEZES19URExJTUlUOworICBpbmZvW2ldLnZlcnNpb24gPQorICAgICAgTElCX1ZFUlNJT04oUENNVVRJTF9MSUJfVkwwLCBQQ01VVElMX0xJQl9WTDEsIFBDTVVUSUxfTElCX1ZMMik7CisgIExJQl9WRVJTSU9OX1NUUklORyhpbmZvICsgaSk7CisgIGluZm9baV0uYnVpbGRfZGF0ZSA9IFBDTVVUSUxfTElCX0JVSUxEX0RBVEU7CisgIGluZm9baV0uYnVpbGRfdGltZSA9IFBDTVVUSUxfTElCX0JVSUxEX1RJTUU7CisgIGluZm9baV0udGl0bGUgPSBURExJTUlUX0xJQl9USVRMRTsKKworICAvKiBTZXQgZmxhZ3MgKi8KKyAgaW5mb1tpXS5mbGFncyA9IENBUEZfTElNSVRFUjsKKworICAvKiBBZGQgbGliIGluZm8gZm9yIEZESyB0b29scyAoaWYgbm90IHlldCBkb25lKS4gKi8KKyAgRkRLX3Rvb2xzR2V0TGliSW5mbyhpbmZvKTsKIAogICByZXR1cm4gVERMSU1JVF9PSzsKIH0KZGlmZiAtLWdpdCBhL2xpYlBDTXV0aWxzL3NyYy9wY21fdXRpbHMuY3BwIGIvbGliUENNdXRpbHMvc3JjL3BjbV91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkMThkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlBDTXV0aWxzL3NyYy9wY21fdXRpbHMuY3BwCkBAIC0wLDAgKzEsMTk1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDTSB1dGlsaXR5IGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBBcnRodXIgVHJpdHRoYXJ0LCBBbGZvbnNvIFBpbm8gR2FyY2lhCisKKyAgIERlc2NyaXB0aW9uOiBGdW5jdGlvbnMgdGhhdCBwZXJmb3JtIChkZSlpbnRlcmxlYXZpbmcgY29tYmluZWQgd2l0aCBmb3JtYXQKK2NoYW5nZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicGNtX3V0aWxzLmgiCisKKy8qIGxpYnJhcnkgdmVyc2lvbiAqLworI2luY2x1ZGUgInZlcnNpb24uaCIKKwordm9pZCBGREtfaW50ZXJsZWF2ZShjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgcEluLCBMT05HICpSRVNUUklDVCBwT3V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsZW5ndGgpIHsKKyAgZm9yIChVSU5UIHNhbXBsZSA9IDA7IHNhbXBsZSA8IGxlbmd0aDsgc2FtcGxlKyspIHsKKyAgICBjb25zdCBGSVhQX0RCTCAqSW4gPSAmcEluW3NhbXBsZV07CisgICAgZm9yIChVSU5UIGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgKnBPdXQrKyA9IChMT05HKUluWzBdOworICAgICAgSW4gKz0gZnJhbWVTaXplOworICAgIH0KKyAgfQorfQorCit2b2lkIEZES19pbnRlcmxlYXZlKGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBwSW4sIFNIT1JUICpSRVNUUklDVCBwT3V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsZW5ndGgpIHsKKyAgZm9yIChVSU5UIHNhbXBsZSA9IDA7IHNhbXBsZSA8IGxlbmd0aDsgc2FtcGxlKyspIHsKKyAgICBjb25zdCBGSVhQX0RCTCAqSW4gPSAmcEluW3NhbXBsZV07CisgICAgZm9yIChVSU5UIGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgKnBPdXQrKyA9IChTSE9SVClGWF9EQkwyRlhfU0dMKEluWzBdKTsKKyAgICAgIEluICs9IGZyYW1lU2l6ZTsKKyAgICB9CisgIH0KK30KKwordm9pZCBGREtfaW50ZXJsZWF2ZShjb25zdCBGSVhQX1NHTCAqUkVTVFJJQ1QgcEluLCBTSE9SVCAqUkVTVFJJQ1QgcE91dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBjaGFubmVscywgY29uc3QgVUlOVCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoKSB7CisgIGZvciAoVUlOVCBzYW1wbGUgPSAwOyBzYW1wbGUgPCBsZW5ndGg7IHNhbXBsZSsrKSB7CisgICAgY29uc3QgRklYUF9TR0wgKkluID0gJnBJbltzYW1wbGVdOworICAgIGZvciAoVUlOVCBjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICpwT3V0KysgPSAoU0hPUlQpSW5bMF07CisgICAgICBJbiArPSBmcmFtZVNpemU7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRkRLX2RlaW50ZXJsZWF2ZShjb25zdCBMT05HICpSRVNUUklDVCBwSW4sIFNIT1JUICpSRVNUUklDVCBfcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCkgeworICBmb3IgKFVJTlQgY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgU0hPUlQgKnBPdXQgPSBfcE91dCArIGxlbmd0aCAqIGNoOworICAgIGNvbnN0IExPTkcgKkluID0gJnBJbltjaF07CisgICAgZm9yIChVSU5UIHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKKyAgICAgICpwT3V0KysgPSAoU0hPUlQpKEluWzBdID4+IDE2KTsKKyAgICAgIEluICs9IGNoYW5uZWxzOworICAgIH0KKyAgfQorfQorCit2b2lkIEZES19kZWludGVybGVhdmUoY29uc3QgTE9ORyAqUkVTVFJJQ1QgcEluLCBMT05HICpSRVNUUklDVCBfcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCkgeworICBmb3IgKFVJTlQgY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgTE9ORyAqcE91dCA9IF9wT3V0ICsgbGVuZ3RoICogY2g7CisgICAgY29uc3QgTE9ORyAqSW4gPSAmcEluW2NoXTsKKyAgICBmb3IgKFVJTlQgc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgeworICAgICAgKnBPdXQrKyA9IEluWzBdOworICAgICAgSW4gKz0gY2hhbm5lbHM7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRkRLX2RlaW50ZXJsZWF2ZShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgcEluLCBTSE9SVCAqUkVTVFJJQ1QgX3BPdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBjaGFubmVscywgY29uc3QgVUlOVCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsZW5ndGgpIHsKKyAgZm9yIChVSU5UIGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgIFNIT1JUICpwT3V0ID0gX3BPdXQgKyBsZW5ndGggKiBjaDsKKyAgICBjb25zdCBTSE9SVCAqSW4gPSAmcEluW2NoXTsKKyAgICBmb3IgKFVJTlQgc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgeworICAgICAgKnBPdXQrKyA9IEluWzBdOworICAgICAgSW4gKz0gY2hhbm5lbHM7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRkRLX2RlaW50ZXJsZWF2ZShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgcEluLCBMT05HICpSRVNUUklDVCBfcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCkgeworICBmb3IgKFVJTlQgY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgTE9ORyAqcE91dCA9IF9wT3V0ICsgbGVuZ3RoICogY2g7CisgICAgY29uc3QgU0hPUlQgKkluID0gJnBJbltjaF07CisgICAgZm9yIChVSU5UIHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKKyAgICAgICpwT3V0KysgPSAoTE9ORylJblswXSA8PCAxNjsKKyAgICAgIEluICs9IGNoYW5uZWxzOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliUENNdXRpbHMvc3JjL3BjbWRteF9saWIuY3BwIGIvbGliUENNdXRpbHMvc3JjL3BjbWRteF9saWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWE4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJQQ011dGlscy9zcmMvcGNtZG14X2xpYi5jcHAKQEAgLTAsMCArMSwyNjU5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDTSB1dGlsaXR5IGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAorCisgICBEZXNjcmlwdGlvbjogRGVmaW5lcyBmdW5jdGlvbnMgdGhhdCBwZXJmb3JtIGRvd25taXhpbmcgb3IgYSBzaW1wbGUgY2hhbm5lbAorICAgICAgICAgICAgICAgIGV4cGFuc2lvbiBpbiB0aGUgUENNIHRpbWUgZG9tYWluLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicGNtZG14X2xpYi5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKyNpbmNsdWRlICJmaXhwb2ludF9tYXRoLmgiCisjaW5jbHVkZSAiRkRLX2NvcmUuaCIKKworLyogbGlicmFyeSB2ZXJzaW9uICovCisjaW5jbHVkZSAidmVyc2lvbi5oIgorLyogbGlicmFyeSB0aXRsZSAqLworI2RlZmluZSBQQ01ETVhfTElCX1RJVExFICJQQ00gRG93bm1peCBMaWIiCisKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgSU4gMAorI2RlZmluZSBPVVQgMQorCisvKiBUeXBlIGRlZmluaXRpb25zOiAqLworI2RlZmluZSBGSVhQX0RNWCBGSVhQX1NHTAorI2RlZmluZSBGWF9ETVgyRlhfREJMKHgpIEZYX1NHTDJGWF9EQkwoKEZJWFBfU0dMKSh4KSkKKyNkZWZpbmUgRlhfREJMMkZYX0RNWCh4KSBGWF9EQkwyRlhfU0dMKHgpCisjZGVmaW5lIEZMMkZYQ09OU1RfRE1YKHgpIEZMMkZYQ09OU1RfU0dMKHgpCisjZGVmaW5lIE1BWFZBTF9ETVggTUFYVkFMX1NHTAorI2RlZmluZSBGWF9ETVgyU0hSVCh4KSAoKFNIT1JUKSh4KSkKKyNkZWZpbmUgRlhfRE1YMkZMKHgpIEZYX0RCTDJGTChGWF9ETVgyRlhfREJMKHgpKQorCisvKiBGaXhlZCBhbmQgdW5pcXVlIGNoYW5uZWwgZ3JvdXAgaW5kaWNlcy4KKyAqIFRoZSBsYXN0IGdyb3VwIGluZGV4IGhhcyB0byBiZSBzbWFsbGVyIHRoYW4gKCA0ICkuICovCisjZGVmaW5lIENIX0dST1VQX0ZST05UICgwKQorI2RlZmluZSBDSF9HUk9VUF9TSURFICgxKQorI2RlZmluZSBDSF9HUk9VUF9SRUFSICgyKQorI2RlZmluZSBDSF9HUk9VUF9MRkUgKDMpCisKKy8qIEZpeGVkIGFuZCB1bmlxdWUgY2hhbm5lbCBwbGFpbiBpbmRpY2VzLiAqLworI2RlZmluZSBDSF9QTEFJTl9OT1JNQUwgKDApCisjZGVmaW5lIENIX1BMQUlOX1RPUCAoMSkKKyNkZWZpbmUgQ0hfUExBSU5fQk9UVE9NICgyKQorCisvKiBUaGUgb3JkZXJpbmcgb2YgdGhlIGZvbGxvd2luZyBmaXhlZCBjaGFubmVsIGxhYmVscyBoYXMgdG8gYmUgaW4gTVBFRy00IHN0eWxlLgorICogRnJvbSB0aGUgY2VudGVyIHRvIHRoZSBiYWNrIHdpdGggbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBpbnRlcmxlYXZlZCAoc3RhcnRpbmcKKyAqIHdpdGggbGVmdCkuIFRoZSBsYXN0IGNoYW5uZWwgbGFiZWwgaW5kZXggaGFzIHRvIGJlIHNtYWxsZXIgdGhhbiAoIDggKS4gKi8KKyNkZWZpbmUgQ0VOVEVSX0ZST05UX0NIQU5ORUwgKDApIC8qIEMgICovCisjZGVmaW5lIExFRlRfRlJPTlRfQ0hBTk5FTCAoMSkgICAvKiBMICAqLworI2RlZmluZSBSSUdIVF9GUk9OVF9DSEFOTkVMICgyKSAgLyogUiAgKi8KKyNkZWZpbmUgTEVGVF9SRUFSX0NIQU5ORUwgXAorICAoMykgLyogTHIgKGFrYSBsZWZ0IGJhY2sgY2hhbm5lbCkgb3IgY2VudGVyIGJhY2sgY2hhbm5lbCAqLworI2RlZmluZSBSSUdIVF9SRUFSX0NIQU5ORUwgKDQpICAgICAgLyogUnIgKGFrYSByaWdodCBiYWNrIGNoYW5uZWwpICovCisjZGVmaW5lIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCAoNSkgICAvKiBMZiAqLworI2RlZmluZSBMRUZUX01VTFRJUFJQU19DSEFOTkVMICg2KSAgLyogTGVmdCBtdWx0aXB1cnBvc2UgY2hhbm5lbCAqLworI2RlZmluZSBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCAoNykgLyogUmlnaHQgbXVsdGlwdXJwb3NlIGNoYW5uZWwgKi8KKworLyogMjIuMiBjaGFubmVsIHNwZWNpZmljIGZpeGVkIGNoYW5uZWwgbGFibGVzOiAqLworI2RlZmluZSBMRUZUX1NJREVfQ0hBTk5FTCAoOCkgICAgICAgICAgICAvKiBMc3MgICovCisjZGVmaW5lIFJJR0hUX1NJREVfQ0hBTk5FTCAoOSkgICAgICAgICAgIC8qIFJzcyAgKi8KKyNkZWZpbmUgQ0VOVEVSX1JFQVJfQ0hBTk5FTCAoMTApICAgICAgICAgLyogQ3MgICAqLworI2RlZmluZSBDRU5URVJfRlJPTlRfQ0hBTk5FTF9UT1AgKDExKSAgICAvKiBDdiAgICovCisjZGVmaW5lIExFRlRfRlJPTlRfQ0hBTk5FTF9UT1AgKDEyKSAgICAgIC8qIEx2ICAgKi8KKyNkZWZpbmUgUklHSFRfRlJPTlRfQ0hBTk5FTF9UT1AgKDEzKSAgICAgLyogUnYgICAqLworI2RlZmluZSBMRUZUX1NJREVfQ0hBTk5FTF9UT1AgKDE0KSAgICAgICAvKiBMdnNzICovCisjZGVmaW5lIFJJR0hUX1NJREVfQ0hBTk5FTF9UT1AgKDE1KSAgICAgIC8qIFJ2c3MgKi8KKyNkZWZpbmUgQ0VOVEVSX1NJREVfQ0hBTk5FTF9UT1AgKDE2KSAgICAgLyogVHMgICAqLworI2RlZmluZSBMRUZUX1JFQVJfQ0hBTk5FTF9UT1AgKDE3KSAgICAgICAvKiBMdnIgICovCisjZGVmaW5lIFJJR0hUX1JFQVJfQ0hBTk5FTF9UT1AgKDE4KSAgICAgIC8qIFJ2ciAgKi8KKyNkZWZpbmUgQ0VOVEVSX1JFQVJfQ0hBTk5FTF9UT1AgKDE5KSAgICAgLyogQ3ZyICAqLworI2RlZmluZSBDRU5URVJfRlJPTlRfQ0hBTk5FTF9CT1RUT00gKDIwKSAvKiBDYiAgICovCisjZGVmaW5lIExFRlRfRlJPTlRfQ0hBTk5FTF9CT1RUT00gKDIxKSAgIC8qIExiICAgKi8KKyNkZWZpbmUgUklHSFRfRlJPTlRfQ0hBTk5FTF9CT1RUT00gKDIyKSAgLyogUmIgICAqLworI2RlZmluZSBMT1dfRlJFUVVFTkNZX0NIQU5ORUxfMiAoMjMpICAgICAvKiBMRkUyICovCisKKy8qIE1vcmUgY29uc3RhbnRzICovCisjZGVmaW5lIE9ORV9DSEFOTkVMICgxKQorI2RlZmluZSBUV09fQ0hBTk5FTCAoMikKKyNkZWZpbmUgU0lYX0NIQU5ORUwgKDYpCisjZGVmaW5lIEVJR0hUX0NIQU5ORUwgKDgpCisjZGVmaW5lIFRXRU5UWV9GT1VSX0NIQU5ORUwgKDI0KQorCisjZGVmaW5lIFBDTURNWF9USFJFU0hPTERfTUFQX0hFQVRfMSAoMCkgLyogU3RvcmUgb25seSBleGFjdCBtYXRjaGVzICovCisjZGVmaW5lIFBDTURNWF9USFJFU0hPTERfTUFQX0hFQVRfMiAoMjApCisjZGVmaW5lIFBDTURNWF9USFJFU0hPTERfTUFQX0hFQVRfMyBcCisgICgyNTYpIC8qIERvIG5vdCBhc3NpZ24gbm9ybWFsIGNoYW5uZWxzIHRvIExGRSAqLworCisjZGVmaW5lIFNQX1pfTlJNICgwKQorI2RlZmluZSBTUF9aX1RPUCAoMikKKyNkZWZpbmUgU1BfWl9CT1QgKC0yKQorI2RlZmluZSBTUF9aX0xGRSAoLTE4KQorI2RlZmluZSBTUF9aX01VTCAoOCkgLyogU2hvdWxkIGJlIHNtYWxsZXIgdGhhbiBTUF9aX0xGRSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNDSEFSIHg7IC8qIGhvcml6b250YWwgcG9zaXRpb246ICBjZW50ZXIgKDApLCBsZWZ0ICgtKSwgcmlnaHQgKCspICovCisgIFNDSEFSIHk7IC8qIGRlZXB0aCBwb3NpdGlvbjogICAgICBmcm9udCwgc2lkZSwgYmFjaywgcG9zaXRpb24gKi8KKyAgU0NIQVIgejsgLyogaGVpZ3RoIHBvc2l0aW9uczogICAgIG5vcm1hbCwgdG9wLCBib3R0b20sIGxmZSAqLworfSBQQ01fRE1YX1NQRUFLRVJfUE9TSVRJT047CisKKy8qIENBVVRJT046IFRoZSBtYXhpbXVtIHgtdmFsdWUgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdG8KKyAqIFBDTURNWF9TUEtSX1BPU19YX01BWF9XSURUSC4gKi8KK3N0YXRpYyBjb25zdCBQQ01fRE1YX1NQRUFLRVJfUE9TSVRJT04gc3BrclNsb3RQb3NbXSA9IHsKKyAgICAvKiAgeCwgIHksICB6ICAqLworICAgIHswLCAwLCBTUF9aX05STX0sICAvKiAwICBDRU5URVJfRlJPTlRfQ0hBTk5FTCAgICAgICAgKi8KKyAgICB7LTIsIDAsIFNQX1pfTlJNfSwgLyogMSAgTEVGVF9GUk9OVF9DSEFOTkVMICAgICAgICAgICovCisgICAgezIsIDAsIFNQX1pfTlJNfSwgIC8qIDIgIFJJR0hUX0ZST05UX0NIQU5ORUwgICAgICAgICAqLworICAgIHstMywgNCwgU1BfWl9OUk19LCAvKiAzICBMRUZUX1JFQVJfQ0hBTk5FTCAgICAgICAgICAgKi8KKyAgICB7MywgNCwgU1BfWl9OUk19LCAgLyogNCAgUklHSFRfUkVBUl9DSEFOTkVMICAgICAgICAgICovCisgICAgezAsIDAsIFNQX1pfTEZFfSwgIC8qIDUgIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCAgICAgICAqLworICAgIHstMiwgMiwgU1BfWl9NVUx9LCAvKiA2ICBMRUZUX01VTFRJUFJQU19DSEFOTkVMICAgICAgKi8KKyAgICB7MiwgMiwgU1BfWl9NVUx9ICAgLyogNyAgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwgICAgICovCit9OworCisvKiBMaXN0IG9mIHBhY2tlZCBjaGFubmVsIG1vZGVzICovCit0eXBlZGVmIGVudW0geyAvKiBDSF9NT0RFXzxudW1Gcm9udENoPl88bnVtU2lkZUNoPl88bnVtQmFja0NoPl88bnVtTGZDaD4gKi8KKyAgICAgICAgICAgICAgIENIX01PREVfVU5ERUZJTkVEID0gMHgwMDAwLAorICAgICAgICAgICAgICAgLyogMSBjaGFubmVsICovCisgICAgICAgICAgICAgICBDSF9NT0RFXzFfMF8wXzAgPSAweDAwMDEsIC8qIGNoQ2ZnIDEgKi8KKyAgICAgICAgICAgICAgIC8qIDIgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgIENIX01PREVfMl8wXzBfMCA9IDB4MDAwMiAvKiBjaENmZyAyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMyBjaGFubmVscyAqLworICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgQ0hfTU9ERV8zXzBfMF8wID0gMHgwMDAzLCAvKiBjaENmZyAzICovCisgICAgICAgICAgICAgICBDSF9NT0RFXzJfMF8xXzAgPSAweDAxMDIsCisgICAgICAgICAgICAgICBDSF9NT0RFXzJfMF8wXzEgPSAweDEwMDIsCisgICAgICAgICAgICAgICAvKiA0IGNoYW5uZWxzICovCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMF8xXzAgPSAweDAxMDMsIC8qIGNoQ2ZnIDQgKi8KKyAgICAgICAgICAgICAgIENIX01PREVfMl8wXzJfMCA9IDB4MDIwMiwKKyAgICAgICAgICAgICAgIENIX01PREVfMl8wXzFfMSA9IDB4MTEwMiwKKyAgICAgICAgICAgICAgIENIX01PREVfNF8wXzBfMCA9IDB4MDAwNCwKKyAgICAgICAgICAgICAgIC8qIDUgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgIENIX01PREVfM18wXzJfMCA9IDB4MDIwMywgLyogY2hDZmcgNSAqLworICAgICAgICAgICAgICAgQ0hfTU9ERV8yXzBfMl8xID0gMHgxMjAyLAorICAgICAgICAgICAgICAgQ0hfTU9ERV8zXzBfMV8xID0gMHgxMTAzLAorICAgICAgICAgICAgICAgQ0hfTU9ERV8zXzJfMF8wID0gMHgwMDIzLAorICAgICAgICAgICAgICAgQ0hfTU9ERV81XzBfMF8wID0gMHgwMDA1LAorICAgICAgICAgICAgICAgLyogNiBjaGFubmVscyAqLworICAgICAgICAgICAgICAgQ0hfTU9ERV8zXzBfMl8xID0gMHgxMjAzLCAvKiBjaENmZyA2ICovCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMl8wXzEgPSAweDEwMjMsCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMl8xXzAgPSAweDAxMjMsCisgICAgICAgICAgICAgICBDSF9NT0RFXzVfMF8xXzAgPSAweDAxMDUsCisgICAgICAgICAgICAgICBDSF9NT0RFXzZfMF8wXzAgPSAweDAwMDYsCisgICAgICAgICAgICAgICAvKiA3IGNoYW5uZWxzICovCisgICAgICAgICAgICAgICBDSF9NT0RFXzJfMl8yXzEgPSAweDEyMjIsCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMF8zXzEgPSAweDEzMDMsIC8qIGNoQ2ZnIDExICovCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMl8xXzEgPSAweDExMjMsCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMl8yXzAgPSAweDAyMjMsCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMF8yXzIgPSAweDIyMDMsCisgICAgICAgICAgICAgICBDSF9NT0RFXzVfMF8yXzAgPSAweDAyMDUsCisgICAgICAgICAgICAgICBDSF9NT0RFXzVfMF8xXzEgPSAweDExMDUsCisgICAgICAgICAgICAgICBDSF9NT0RFXzdfMF8wXzAgPSAweDAwMDcsCisgICAgICAgICAgICAgICAvKiA4IGNoYW5uZWxzICovCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMl8yXzEgPSAweDEyMjMsCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMF80XzEgPSAweDE0MDMsIC8qIGNoQ2ZnIDEyICovCisgICAgICAgICAgICAgICBDSF9NT0RFXzVfMF8yXzEgPSAweDEyMDUsIC8qIGNoQ2ZnIDcgKyAxNCAqLworICAgICAgICAgICAgICAgQ0hfTU9ERV81XzJfMV8wID0gMHgwMTI1LAorICAgICAgICAgICAgICAgQ0hfTU9ERV8zXzJfMV8yID0gMHgyMTIzLAorICAgICAgICAgICAgICAgQ0hfTU9ERV8yXzJfMl8yID0gMHgyMjIyLAorICAgICAgICAgICAgICAgQ0hfTU9ERV8zXzBfM18yID0gMHgyMzAzLAorICAgICAgICAgICAgICAgQ0hfTU9ERV84XzBfMF8wID0gMHgwMDA4CisKK30gUENNX0RNWF9DSEFOTkVMX01PREU7CisKKy8qIFRoZXNlIGFyZSB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9ucyBsaW5rZWQgdG8KKyAgIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzIGdpdmUgYnkgdGhlIHVzZXI6ICovCitzdGF0aWMgY29uc3QgUENNX0RNWF9DSEFOTkVMX01PREUgb3V0Q2hNb2RlVGFibGVbKDgpICsgMV0gPSB7CisgICAgQ0hfTU9ERV9VTkRFRklORUQsCisgICAgQ0hfTU9ERV8xXzBfMF8wLCAvKiAxIGNoYW5uZWwgICovCisgICAgQ0hfTU9ERV8yXzBfMF8wICAvKiAyIGNoYW5uZWxzICovCisgICAgLAorICAgIENIX01PREVfM18wXzBfMCwgLyogMyBjaGFubmVscyAqLworICAgIENIX01PREVfM18wXzFfMCwgLyogNCBjaGFubmVscyAqLworICAgIENIX01PREVfM18wXzJfMCwgLyogNSBjaGFubmVscyAqLworICAgIENIX01PREVfM18wXzJfMSAgLyogNiBjaGFubmVscyAqLworICAgICwKKyAgICBDSF9NT0RFXzNfMF8zXzEsIC8qIDcgY2hhbm5lbHMgKi8KKyAgICBDSF9NT0RFXzNfMF80XzEgIC8qIDggY2hhbm5lbHMgKi8KK307CisKK3N0YXRpYyBjb25zdCBGSVhQX0RNWCBhYk1peEx2bFZhbHVlVGFiWzhdID0geworICAgIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksIC8qIHNjYWxlZCBieSAxICovCisgICAgRkwyRlhDT05TVF9ETVgoMC44NDFmKSwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgRkwyRlhDT05TVF9ETVgoMC41OTZmKSwKKyAgICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLCBGTDJGWENPTlNUX0RNWCgwLjQyMmYpLCBGTDJGWENPTlNUX0RNWCgwLjM1NWYpLAorICAgIEZMMkZYQ09OU1RfRE1YKDAuMGYpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfRE1YIGxmZU1peEx2bFZhbHVlVGFiWzE2XSA9IHsKKyAgICAvKiAgICAgICAgICAgICB2YWx1ZSwgICAgICAgIHNjYWxlICovCisgICAgRkwyRlhDT05TVF9ETVgoMC43OTA1ZiksIC8qICAgICAyICovCisgICAgRkwyRlhDT05TVF9ETVgoMC41MDAwZiksIC8qICAgICAyICovCisgICAgRkwyRlhDT05TVF9ETVgoMC44Mzk1ZiksIC8qICAgICAxICovCisgICAgRkwyRlhDT05TVF9ETVgoMC43MDY1ZiksIC8qICAgICAxICovCisgICAgRkwyRlhDT05TVF9ETVgoMC41OTQ1ZiksIC8qICAgICAxICovCisgICAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwgIC8qICAgICAxICovCisgICAgRkwyRlhDT05TVF9ETVgoMC44NDFmKSwgIC8qICAgICAwICovCisgICAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgIC8qICAgICAwICovCisgICAgRkwyRlhDT05TVF9ETVgoMC41OTZmKSwgIC8qICAgICAwICovCisgICAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwgIC8qICAgICAwICovCisgICAgRkwyRlhDT05TVF9ETVgoMC4zMTZmKSwgIC8qICAgICAwICovCisgICAgRkwyRlhDT05TVF9ETVgoMC4xNzhmKSwgIC8qICAgICAwICovCisgICAgRkwyRlhDT05TVF9ETVgoMC4xMDBmKSwgIC8qICAgICAwICovCisgICAgRkwyRlhDT05TVF9ETVgoMC4wMzJmKSwgIC8qICAgICAwICovCisgICAgRkwyRlhDT05TVF9ETVgoMC4wMTBmKSwgIC8qICAgICAwICovCisgICAgRkwyRlhDT05TVF9ETVgoMC4wMDBmKSAgIC8qICAgICAwICovCit9OworCisvKiBNUEVHIG1hdHJpeCBtaXhkb3duOgorICAgIFNldCAxOiAgTCcgPSAoMSArIDJeLTAuNSArIEEgKV4tMSAqIFtMICsgQyAqIDJeLTAuNSArIEEgKiBMc107CisgICAgICAgICAgICBSJyA9ICgxICsgMl4tMC41ICsgQSApXi0xICogW1IgKyBDICogMl4tMC41ICsgQSAqIFJzXTsKKworICAgIFNldCAyOiAgTCcgPSAoMSArIDJeLTAuNSArIDJBICleLTEgKiBbTCArIEMgKiAyXi0wLjUgLSBBICogKExzICsgUnMpXTsKKyAgICAgICAgICAgIFInID0gKDEgKyAyXi0wLjUgKyAyQSApXi0xICogW1IgKyBDICogMl4tMC41ICsgQSAqIChMcyArIFJzKV07CisKKyAgICBNID0gKDMgKyAyQSleLTEgKiBbTCArIEMgKyBSICsgQSooTHMgKyBScyldOworKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RNWCBtcGVnTWl4RG93bklkeDJDb2VmWzRdID0geworICAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3MTA2NzhmKSwgRkwyRlhDT05TVF9ETVgoMC41ZiksCisgICAgRkwyRlhDT05TVF9ETVgoMC4zNTM1NTMzOWYpLCBGTDJGWENPTlNUX0RNWCgwLjBmKX07CisKK3N0YXRpYyBjb25zdCBGSVhQX0RNWCBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzNdWzRdID0geworICAgIHsvKiBTZXQgMTogKi8KKyAgICAgRkwyRlhDT05TVF9ETVgoMC40MTQyMTM1NjIzNzMwOTUwZiksIEZMMkZYQ09OU1RfRE1YKDAuNDUzMDgxODM5MzIxOTcyOGYpLAorICAgICBGTDJGWENPTlNUX0RNWCgwLjQ4NTI4MTM3NDIzODU3MDNmKSwgRkwyRlhDT05TVF9ETVgoMC41ODU3ODY0Mzc2MjY5MDUwZil9LAorICAgIHsvKiBTZXQgMjogKi8KKyAgICAgRkwyRlhDT05TVF9ETVgoMC4zMjAzNzcyNDEwMTcwNDA3ZiksIEZMMkZYQ09OU1RfRE1YKDAuMzY5Mzk4MDYyNTE4MTI5M2YpLAorICAgICBGTDJGWENPTlNUX0RNWCgwLjQxNDIxMzU2MjM3MzA5NTBmKSwgRkwyRlhDT05TVF9ETVgoMC41ODU3ODY0Mzc2MjY5MDUwZil9LAorICAgIHsvKiBNb25vIERNWCBzZXQ6ICovCisgICAgIEZMMkZYQ09OU1RfRE1YKDAuMjI2NTQwOTE5NjYwOTg2NGYpLCBGTDJGWENPTlNUX0RNWCgwLjI1ZiksCisgICAgIEZMMkZYQ09OU1RfRE1YKDAuMjY5NzUyMTQzMzg5ODE3OWYpLCBGTDJGWENPTlNUX0RNWCgwLjMzMzMzMzMzMzMzMzMzMzNmKX19OworCisjZGVmaW5lIFRZUEVfTk9ORSAoMHgwMCkKKyNkZWZpbmUgVFlQRV9QQ0VfREFUQSAoMHgwMSkKKyNkZWZpbmUgVFlQRV9EU0VfQ0xFVl9EQVRBICgweDAyKQorI2RlZmluZSBUWVBFX0RTRV9TTEVWX0RBVEEgKDB4MDQpCisjZGVmaW5lIFRZUEVfRFNFX0RNSVhfQUJfREFUQSAoMHgwOCkKKyNkZWZpbmUgVFlQRV9EU0VfRE1JWF9MRkVfREFUQSAoMHgxMCkKKyNkZWZpbmUgVFlQRV9EU0VfRE1YX0dBSU5fREFUQSAoMHgyMCkKKyNkZWZpbmUgVFlQRV9EU0VfRE1YX0NHTF9EQVRBICgweDQwKQorI2RlZmluZSBUWVBFX0RTRV9EQVRBICgweDdFKQorCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgdHlwZUZsYWdzOworICAvKiBGcm9tIERTRSAqLworICBVQ0hBUiBjTGV2SWR4OworICBVQ0hBUiBzTGV2SWR4OworICBVQ0hBUiBkbWl4SWR4QTsKKyAgVUNIQVIgZG1peElkeEI7CisgIFVDSEFSIGRtaXhJZHhMZmU7CisgIFVDSEFSIGRteEdhaW5JZHgyOworICBVQ0hBUiBkbXhHYWluSWR4NTsKKyAgLyogRnJvbSBQQ0UgKi8KKyAgVUNIQVIgbWF0cml4TWl4ZG93bklkeDsKKyAgLyogQXR0cmlidXRlczogKi8KKyAgU0NIQVIgcHNldWRvU3Vycm91bmQ7IC8qITwgSWYgc2V0IHRvIDEgdGhlIHNpZ25hbCBpcyBwc2V1ZG8gc3Vycm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUuIFRoZSB2YWx1ZSAwIHRlbGxzIHRoYXQgaXQgaXMgbm90LiBJZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIC0xIHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAgKi8KKyAgVUlOVCBleHBpcnlDb3VudDsgLyohPCBDb3VudGVyIHRvIG1vbml0b3IgdGhlIGxpZmUgdGltZSBvZiBhIG1ldGEgZGF0YSBzZXQuICovCisKK30gRE1YX0JTX01FVEFfREFUQTsKKworLyogRGVmYXVsdCBtZXRhZGF0YSAqLworc3RhdGljIGNvbnN0IERNWF9CU19NRVRBX0RBVEEgZGZsdE1ldGFEYXRhID0gezAsIDIsIDIsIDIsICAyLCAxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAtMSwgMH07CisKKy8qIER5bmFtaWMgKHVzZXIpIHBhcmFtczoKKyAgICAgU2VlIHRoZSBkZWZpbml0aW9uIG9mIFBDTURNWF9QQVJBTSBmb3IgZGV0YWlscyBvbiB0aGUgc3BlY2lmaWMgZmllbGRzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBETVhfUFJPRklMRV9UWVBFIGRteFByb2ZpbGU7IC8qITwgTGlua2VkIHRvIERNWF9QUkZMX1NUQU5EQVJEICAgICAgICAgICAgICAqLworICBVSU5UIGV4cGlyeUZyYW1lOyAgICAgICAgICAgIC8qITwgTGlua2VkIHRvIERNWF9CU19EQVRBX0VYUElSWV9GUkFNRSAgICAgICAqLworICBEVUFMX0NIQU5ORUxfTU9ERSBkdWFsQ2hhbm5lbE1vZGU7IC8qITwgTGlua2VkIHRvIERNWF9EVUFMX0NIQU5ORUxfTU9ERSAqLworICBQU0VVRE9fU1VSUk9VTkRfTU9ERQorICBwc2V1ZG9TdXJyTW9kZTsgICAgICAgICAgLyohPCBMaW5rZWQgdG8gRE1YX1BTRVVET19TVVJST1VORF9NT0RFICAgICAgICovCisgIFNIT1JUIG51bU91dENoYW5uZWxzTWluOyAvKiE8IExpbmtlZCB0byBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUyAgKi8KKyAgU0hPUlQgbnVtT3V0Q2hhbm5lbHNNYXg7IC8qITwgTGlua2VkIHRvIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTICAqLworICBVQ0hBUiBmcmFtZURlbGF5OyAgICAgICAgLyohPCBMaW5rZWQgdG8gRE1YX0JTX0RBVEFfREVMQVkgICAgICAgICAgICAgICovCisKK30gUENNX0RNWF9VU0VSX1BBUkFNUzsKKworLyogTW9kdWxlcyBtYWluIGRhdGEgc3RydWN0dXJlOiAqLworc3RydWN0IFBDTV9ETVhfSU5TVEFOQ0UgeworICAvKiBNZXRhZGF0YSAqLworICBETVhfQlNfTUVUQV9EQVRBIGJzTWV0YURhdGFbKDEpICsgMV07CisgIFBDTV9ETVhfVVNFUl9QQVJBTVMgdXNlclBhcmFtczsKKworICBVQ0hBUiBhcHBseVByb2Nlc3Npbmc7IC8qITwgRmxhZyB0byBlbi0vZGlzYWJsZSBtb2R1bGVzIHByb2Nlc3NpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4IGNoYW5uZWwgbGltaXRpbmcgaXMgZG9uZSBpbmRlcGVuZGVudGx5LiAqLworfTsKKworLyogTWVtb3J5IGFsbG9jYXRpb24gbWFjcm8gKi8KK0NfQUxMT0NfTUVNKFBjbURteEluc3RhbmNlLCBzdHJ1Y3QgUENNX0RNWF9JTlNUQU5DRSwgMSkKKworc3RhdGljIFVJTlQgZ2V0U3BlYWtlckRpc3RhbmNlKFBDTV9ETVhfU1BFQUtFUl9QT1NJVElPTiBwb3NBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTV9ETVhfU1BFQUtFUl9QT1NJVElPTiBwb3NCKSB7CisgIFBDTV9ETVhfU1BFQUtFUl9QT1NJVElPTiBkaWZmOworCisgIGRpZmYueCA9IHBvc0EueCAtIHBvc0IueDsKKyAgZGlmZi55ID0gcG9zQS55IC0gcG9zQi55OworICBkaWZmLnogPSBwb3NBLnogLSBwb3NCLno7CisKKyAgcmV0dXJuICgoZGlmZi54ICogZGlmZi54KSArIChkaWZmLnkgKiBkaWZmLnkpICsgKGRpZmYueiAqIGRpZmYueikpOworfQorCitzdGF0aWMgUENNX0RNWF9TUEVBS0VSX1BPU0lUSU9OIGdldFNwZWFrZXJQb3MoQVVESU9fQ0hBTk5FTF9UWVBFIGNoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBjaEluZGV4LCBVQ0hBUiBudW1DaEluR3JwKSB7CisjZGVmaW5lIFBDTURNWF9TUEtSX1BPU19YX01BWF9XSURUSCAoMykKKyNkZWZpbmUgUENNRE1YX1NQS1JfUE9TX1lfU1BSRUFEICgyKQorI2RlZmluZSBQQ01ETVhfU1BLUl9QT1NfWl9TUFJFQUQgKDIpCisKKyAgUENNX0RNWF9TUEVBS0VSX1BPU0lUSU9OIHNwa3JQb3MgPSB7MCwgMCwgMH07CisgIEFVRElPX0NIQU5ORUxfVFlQRSBjaEdycCA9IChBVURJT19DSEFOTkVMX1RZUEUpKGNoVHlwZSAmIDB4MEYpOworICB1bnNpZ25lZCBmSGFzQ2VudGVyID0gbnVtQ2hJbkdycCAmIDB4MTsKKyAgdW5zaWduZWQgY2hHcnBXaWR0aCA9IG51bUNoSW5HcnAgPj4gMTsKKyAgdW5zaWduZWQgZklzQ2VudGVyID0gMDsKKyAgdW5zaWduZWQgZklzTGZlID0gKGNoVHlwZSA9PSBBQ1RfTEZFKSA/IDEgOiAwOworICBpbnQgb2Zmc2V0ID0gMDsKKworICBGREtfQVNTRVJUKGNoSW5kZXggPCBudW1DaEluR3JwKTsKKworICBpZiAoKGNoR3JwID09IEFDVF9GUk9OVCkgJiYgZkhhc0NlbnRlcikgeworICAgIGlmIChjaEluZGV4ID09IDApIGZJc0NlbnRlciA9IDE7CisgICAgY2hJbmRleCA9IChVQ0hBUilmTWF4KDAsIGNoSW5kZXggLSAxKTsKKyAgfSBlbHNlIGlmIChmSGFzQ2VudGVyICYmIChjaEluZGV4ID09IG51bUNoSW5HcnAgLSAxKSkgeworICAgIGZJc0NlbnRlciA9IDE7CisgIH0KKyAgLyogbm93IGFsbCBldmVuIGluZGljZXMgYXJlIGxlZnQgKC0pICovCisgIGlmICghZklzQ2VudGVyKSB7CisgICAgb2Zmc2V0ID0gY2hJbmRleCA+PiAxOworICAgIGlmICgoY2hHcnAgPiBBQ1RfRlJPTlQpICYmIChjaFR5cGUgIT0gQUNUX1NJREUpICYmICFmSXNMZmUpIHsKKyAgICAgIC8qIHRoZSBoaWdoZXIgdGhlIGluZGV4IHRoZSBsb3dlciB0aGUgZGlzdGFuY2UgdG8gdGhlIGNlbnRlciBwb3NpdGlvbiAqLworICAgICAgb2Zmc2V0ID0gY2hHcnBXaWR0aCAtIGZIYXNDZW50ZXIgLSBvZmZzZXQ7CisgICAgfQorICAgIGlmICgoY2hJbmRleCAmIDB4MSkgPT0gMCkgeyAvKiBldmVuICovCisgICAgICBvZmZzZXQgPSAtKG9mZnNldCArIDEpOworICAgIH0gZWxzZSB7CisgICAgICBvZmZzZXQgKz0gMTsKKyAgICB9CisgIH0KKyAgLyogYXBwbHkgdGhlIG9mZnNldCAqLworICBpZiAoY2hUeXBlID09IEFDVF9TSURFKSB7CisgICAgc3BrclBvcy54ID0gKG9mZnNldCA8IDApID8gLVBDTURNWF9TUEtSX1BPU19YX01BWF9XSURUSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBDTURNWF9TUEtSX1BPU19YX01BWF9XSURUSDsKKyAgICBzcGtyUG9zLnkgPSAvKiAxeCAqLyBQQ01ETVhfU1BLUl9QT1NfWV9TUFJFQUQgKyAoU0NIQVIpZkFicyhvZmZzZXQpIC0gMTsKKyAgICBzcGtyUG9zLnogPSAwOworICB9IGVsc2UgeworICAgIHVuc2lnbmVkIHNwcmVhZCA9CisgICAgICAgICgoY2hHcnBXaWR0aCA9PSAxKSAmJiAoIWZJc0xmZSkpID8gUENNRE1YX1NQS1JfUE9TX1hfTUFYX1dJRFRIIC0gMSA6IDE7CisgICAgc3BrclBvcy54ID0gKFNDSEFSKW9mZnNldCAqIChTQ0hBUilzcHJlYWQ7CisgICAgaWYgKGZJc0xmZSkgeworICAgICAgc3BrclBvcy55ID0gMDsKKyAgICAgIHNwa3JQb3MueiA9IFNQX1pfTEZFOworICAgIH0gZWxzZSB7CisgICAgICBzcGtyUG9zLnkgPSAoU0NIQVIpZk1heCgoU0NIQVIpY2hHcnAgLSAxLCAwKSAqIFBDTURNWF9TUEtSX1BPU19ZX1NQUkVBRDsKKyAgICAgIHNwa3JQb3MueiA9IChTQ0hBUiljaFR5cGUgPj4gNDsKKyAgICAgIGlmIChzcGtyUG9zLnogPT0gMikgeyAvKiBBQ1RfQk9UVE9NICovCisgICAgICAgIHNwa3JQb3MueiA9IC0xOworICAgICAgfQorICAgICAgc3BrclBvcy56ICo9IFBDTURNWF9TUEtSX1BPU19aX1NQUkVBRDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNwa3JQb3M7Cit9CisKKy8qKiBSZXR1cm4gdGhlIGNoYW5uZWwgbW9kZSBvZiBhIGdpdmVuIGhvcml6b250YWwgY2hhbm5lbCBwbGFpbiAobm9ybWFsLCB0b3AsCisgKmJvdHRvbSkgZm9yIGEgZ2l2ZW4gY2hhbm5lbCBjb25maWd1cmF0aW9uLiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNoYWxsIGdldAorICpvYnNvbGV0ZSBvbmNlIHRoZSBjaGFubmVsIG1vZGUgaGFzIGJlZW4gY2hhbmdlZCB0byBiZSBub25hbWJpZ3VvdXMuCisgKiBAcGFyYW0gW2luXSBJbmRleCBvZiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwgcGxhaW4uCisgKiBAcGFyYW0gW2luXSBUaGUgcGFja2VkIGNoYW5uZWwgbW9kZSBmb3IgdGhlIGNvbXBsZXRlIGNoYW5uZWwgY29uZmlndXJhdGlvbgorICooYWxsIHBsYWlucykuCisgKiBAcGFyYW0gW2luXSBUaGUgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCB3aGljaCBpcyBuZWNlc3NhcnkgaW4KKyAqY2FzZXMgd2hlcmUgdGhlIChwYWNrZWQpIGNoYW5uZWwgbW9kZSBpcyBhbWJpZ3VvdXMuCisgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwYWNrZWQgY2hhbm5lbCBtb2RlIG9mIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbCBwbGFpbi4KKyAqKi8KK3N0YXRpYyBQQ01fRE1YX0NIQU5ORUxfTU9ERSBnZXRDaE1vZGU0UGxhaW4oCisgICAgY29uc3QgaW50IHBsYWluSW5kZXgsIGNvbnN0IFBDTV9ETVhfQ0hBTk5FTF9NT0RFIHRvdENoTW9kZSwKKyAgICBjb25zdCBpbnQgY2hDZmcpIHsKKyAgUENNX0RNWF9DSEFOTkVMX01PREUgcGxhaW5DaE1vZGUgPSB0b3RDaE1vZGU7CisKKyAgc3dpdGNoICh0b3RDaE1vZGUpIHsKKyAgICBjYXNlIENIX01PREVfNV8wXzJfMToKKyAgICAgIGlmIChjaENmZyA9PSAxNCkgeworICAgICAgICBzd2l0Y2ggKHBsYWluSW5kZXgpIHsKKyAgICAgICAgICBjYXNlIENIX1BMQUlOX0JPVFRPTToKKyAgICAgICAgICAgIHBsYWluQ2hNb2RlID0gKFBDTV9ETVhfQ0hBTk5FTF9NT0RFKTB4MDAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0hfUExBSU5fVE9QOgorICAgICAgICAgICAgcGxhaW5DaE1vZGUgPSBDSF9NT0RFXzJfMF8wXzA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENIX1BMQUlOX05PUk1BTDoKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcGxhaW5DaE1vZGUgPSBDSF9NT0RFXzNfMF8yXzE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHBsYWluQ2hNb2RlOworfQorCitzdGF0aWMgaW5saW5lIFVJTlQgZ2V0SWR4U3VtKFVDSEFSIG51bUNoKSB7CisgIFVJTlQgcmVzdWx0ID0gMDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDE7IGkgPCBudW1DaDsgaSArPSAxKSB7CisgICAgcmVzdWx0ICs9IGk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqIEV2YWx1YXRlIGEgZ2l2ZW4gY2hhbm5lbCBjb25maWd1cmF0aW9uIGFuZCBleHRyYWN0IGEgcGFja2VkIGNoYW5uZWwgbW9kZS4gSW4KKyAqYWRkaXRpb24gdGhlIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIGNoYW5uZWwgb2Zmc2V0IHRhYmxlIGZvciB0aGUgbWFwcGluZyB0byB0aGUKKyAqaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludmVyc2UgdG8gdGhlCisgKmdldENoYW5uZWxEZXNjcmlwdGlvbigpIHJvdXRpbmUuCisgKiBAcGFyYW0gW2luXSBUaGUgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgorICogQHBhcmFtIFtpbl0gQXJyYXkgaG9sZGluZyB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGVzIGZvciBlYWNoIGNoYW5uZWwuCisgKiBAcGFyYW0gW2luXSBBcnJheSBob2xkaW5nIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRpY2VzIGZvciBlYWNoCisgKmNoYW5uZWwuCisgKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgdGhlIGJ1ZmZlciBvZmZzZXRzIGZvciBlYWNoIGNoYW5uZWwgYXJlIHN0b3JlZCBpbnRvLgorICogQHBhcmFtIFtvdXRdIFRoZSBnZW5lcmF0ZWQgcGFja2VkIGNoYW5uZWwgbW9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuCisgKmlucHV0IGNvbmZpZ3VyYXRpb24uCisgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKiovCitzdGF0aWMgUENNRE1YX0VSUk9SIGdldENoYW5uZWxNb2RlKAorICAgIGNvbnN0IFVJTlQgbnVtQ2hhbm5lbHMsICAgICAgICAgICAgICAgICAvKiBpbiAqLworICAgIGNvbnN0IEFVRElPX0NIQU5ORUxfVFlQRSBjaGFubmVsVHlwZVtdLCAvKiBpbiAqLworICAgIFVDSEFSIGNoYW5uZWxJbmRpY2VzW10sICAgICAgICAgICAgICAgICAvKiBpbiAqLworICAgIFVDSEFSIG9mZnNldFRhYmxlWyg4KV0sICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KKyAgICBQQ01fRE1YX0NIQU5ORUxfTU9ERSAqY2hNb2RlICAgICAgICAgICAgLyogb3V0ICovCispIHsKKyAgVUlOVCBpZHhTdW1bKDMpXVsoNCldOworICBVQ0hBUiBudW1DaFsoMyldWyg0KV07CisgIFVDSEFSIG1hcHBlZFsoOCldOworICBQQ01fRE1YX1NQRUFLRVJfUE9TSVRJT04gc3BrclBvc1soOCldOworICBQQ01ETVhfRVJST1IgZXJyID0gUENNRE1YX09LOworICB1bnNpZ25lZCBjaCwgbnVtTWFwcGVkSW5DaHMgPSAwOworICB1bnNpZ25lZCBzdGFydFNsb3Q7CisgIHVuc2lnbmVkIHN0b3BTbG90ID0gTE9XX0ZSRVFVRU5DWV9DSEFOTkVMOworCisgIEZES19BU1NFUlQoY2hhbm5lbFR5cGUgIT0gTlVMTCk7CisgIEZES19BU1NFUlQoY2hhbm5lbEluZGljZXMgIT0gTlVMTCk7CisgIEZES19BU1NFUlQob2Zmc2V0VGFibGUgIT0gTlVMTCk7CisgIEZES19BU1NFUlQoY2hNb2RlICE9IE5VTEwpOworCisgIC8qIEZvciBkZXRhaWxzIHNlZSBJU08vSUVDIDEzODE4LTc6MjAwNShFKSwgOC41LjMgQ2hhbm5lbCBjb25maWd1cmF0aW9uICovCisgIEZES21lbWNsZWFyKGlkeFN1bSwgKDMpICogKDQpICogc2l6ZW9mKFVJTlQpKTsKKyAgRkRLbWVtY2xlYXIobnVtQ2gsICgzKSAqICg0KSAqIHNpemVvZihVQ0hBUikpOworICBGREttZW1jbGVhcihtYXBwZWQsICg4KSAqIHNpemVvZihVQ0hBUikpOworICBGREttZW1jbGVhcihzcGtyUG9zLCAoOCkgKiBzaXplb2YoUENNX0RNWF9TUEVBS0VSX1BPU0lUSU9OKSk7CisgIC8qIEluaXQgb3V0cHV0ICovCisgIEZES21lbXNldChvZmZzZXRUYWJsZSwgMjU1LCAoOCkgKiBzaXplb2YoVUNIQVIpKTsKKyAgKmNoTW9kZSA9IENIX01PREVfVU5ERUZJTkVEOworCisgIC8qIERldGVybWluZSBob3cgbWFueSBjaGFubmVscyBhcmUgYXNzaWduZWQgdG8gZWFjaCBjaGFubmVscyBlYWNoIGdyb3VwOiAqLworICBmb3IgKGNoID0gMDsgY2ggPCBudW1DaGFubmVsczsgY2ggKz0gMSkgeworICAgIHVuc2lnbmVkIGNoR3JwID0gZk1heCgKKyAgICAgICAgKGNoYW5uZWxUeXBlW2NoXSAmIDB4MEYpIC0gMSwKKyAgICAgICAgMCk7IC8qIEFzc2lnbiBhbGwgdW5kZWZpbmVkIGNoYW5uZWxzIChBQ1RfTk9ORSkgdG8gZnJvbnQgY2hhbm5lbHMuICovCisgICAgbnVtQ2hbY2hhbm5lbFR5cGVbY2hdID4+IDRdW2NoR3JwXSArPSAxOworICAgIGlkeFN1bVtjaGFubmVsVHlwZVtjaF0gPj4gNF1bY2hHcnBdICs9IGNoYW5uZWxJbmRpY2VzW2NoXTsKKyAgfQorICBpZiAobnVtQ2hhbm5lbHMgPiBUV09fQ0hBTk5FTCkgeworICAgIGludCBjaEdycDsKKyAgICAvKiBTYW5pdHkgY2hlY2sgb24gdGhlIGluZGljZXMgKi8KKyAgICBmb3IgKGNoR3JwID0gMDsgY2hHcnAgPCAoNCk7IGNoR3JwICs9IDEpIHsKKyAgICAgIGludCBwbGFuZTsKKyAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8ICgzKTsgcGxhbmUgKz0gMSkgeworICAgICAgICBpZiAoaWR4U3VtW3BsYW5lXVtjaEdycF0gIT0gZ2V0SWR4U3VtKG51bUNoW3BsYW5lXVtjaEdycF0pKSB7CisgICAgICAgICAgdW5zaWduZWQgaWR4Q250ID0gMDsKKyAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBudW1DaGFubmVsczsgY2ggKz0gMSkgeworICAgICAgICAgICAgaWYgKGNoYW5uZWxUeXBlW2NoXSA9PQorICAgICAgICAgICAgICAgIChBVURJT19DSEFOTkVMX1RZUEUpKChwbGFuZSA8PCA0KSB8ICgoY2hHcnAgKyAxKSAmIDB4RikpKSB7CisgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW2NoXSA9IGlkeENudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9DSF9DT05GSUc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogTWFwcGluZyBIRUFUIDE6CisgICAqICAgRGV0ZXJtaW5lIHRoZSBzcGVha2VyIHBvc2l0aW9uIG9mIGVhY2ggaW5wdXQgY2hhbm5lbCBhbmQgbWFwIGl0IHRvIGEKKyAgICogaW50ZXJuYWwgc2xvdCBpZiBpdCBtYXRjaGVzIGV4YWN0bHkgKHdpdGggemVybyBkaXN0YW5jZSkuICovCisgIGZvciAoY2ggPSAwOyBjaCA8IG51bUNoYW5uZWxzOyBjaCArPSAxKSB7CisgICAgVUlOVCBtYXBEaXN0ID0gKHVuc2lnbmVkKS0xOworICAgIHVuc2lnbmVkIG1hcENoLCBtYXBQb3MgPSAodW5zaWduZWQpLTE7CisgICAgdW5zaWduZWQgY2hHcnAgPSBmTWF4KAorICAgICAgICAoY2hhbm5lbFR5cGVbY2hdICYgMHgwRikgLSAxLAorICAgICAgICAwKTsgLyogQXNzaWduIGFsbCB1bmRlZmluZWQgY2hhbm5lbHMgKEFDVF9OT05FKSB0byBmcm9udCBjaGFubmVscy4gKi8KKworICAgIHNwa3JQb3NbY2hdID0gZ2V0U3BlYWtlclBvcyhjaGFubmVsVHlwZVtjaF0sIGNoYW5uZWxJbmRpY2VzW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hbY2hhbm5lbFR5cGVbY2hdID4+IDRdW2NoR3JwXSk7CisKKyAgICBmb3IgKG1hcENoID0gMDsgbWFwQ2ggPD0gc3RvcFNsb3Q7IG1hcENoICs9IDEpIHsKKyAgICAgIGlmIChvZmZzZXRUYWJsZVttYXBDaF0gPT0gMjU1KSB7CisgICAgICAgIFVJTlQgZGlzdCA9IGdldFNwZWFrZXJEaXN0YW5jZShzcGtyUG9zW2NoXSwgc3BrclNsb3RQb3NbbWFwQ2hdKTsKKyAgICAgICAgaWYgKGRpc3QgPCBtYXBEaXN0KSB7CisgICAgICAgICAgbWFwUG9zID0gbWFwQ2g7CisgICAgICAgICAgbWFwRGlzdCA9IGRpc3Q7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1hcERpc3QgPD0gUENNRE1YX1RIUkVTSE9MRF9NQVBfSEVBVF8xKSB7CisgICAgICBvZmZzZXRUYWJsZVttYXBQb3NdID0gKFVDSEFSKWNoOworICAgICAgbWFwcGVkW2NoXSA9IDE7CisgICAgICBudW1NYXBwZWRJbkNocyArPSAxOworICAgIH0KKyAgfQorCisgIC8qIE1hcHBpbmcgSEVBVCAyOgorICAgKiAgIEdvIHRocm91Z2ggdGhlIHVubWFwcGVkIGlucHV0IGNoYW5uZWxzIGFuZCBhc3NpZ24gdGhlbSB0byB0aGUgaW50ZXJuYWwKKyAgICogc2xvdHMgdGhhdCBtYXRjaGVzIGJlc3QgKGxlYXN0IGRpc3RhbmNlKS4gQnV0IGFzc2lnbiBjZW50ZXIgY2hhbm5lbHMgdG8KKyAgICogY2VudGVyIHNsb3RzIG9ubHkuICovCisgIHN0YXJ0U2xvdCA9CisgICAgICAoKG51bUNoW0NIX1BMQUlOX05PUk1BTF1bQ0hfR1JPVVBfRlJPTlRdICYgMHgxKSB8fCAobnVtQ2hhbm5lbHMgPj0gKDgpKSkKKyAgICAgICAgICA/IDAKKyAgICAgICAgICA6IDE7CisgIGZvciAoY2ggPSAwOyBjaCA8ICh1bnNpZ25lZCludW1DaGFubmVsczsgY2ggKz0gMSkgeworICAgIGlmICghbWFwcGVkW2NoXSkgeworICAgICAgVUlOVCBtYXBEaXN0ID0gKHVuc2lnbmVkKS0xOworICAgICAgdW5zaWduZWQgbWFwQ2gsIG1hcFBvcyA9ICh1bnNpZ25lZCktMTsKKworICAgICAgZm9yIChtYXBDaCA9IHN0YXJ0U2xvdDsgbWFwQ2ggPD0gc3RvcFNsb3Q7IG1hcENoICs9IDEpIHsKKyAgICAgICAgaWYgKG9mZnNldFRhYmxlW21hcENoXSA9PSAyNTUpIHsKKyAgICAgICAgICBVSU5UIGRpc3QgPSBnZXRTcGVha2VyRGlzdGFuY2Uoc3BrclBvc1tjaF0sIHNwa3JTbG90UG9zW21hcENoXSk7CisgICAgICAgICAgaWYgKGRpc3QgPCBtYXBEaXN0KSB7CisgICAgICAgICAgICBtYXBQb3MgPSBtYXBDaDsKKyAgICAgICAgICAgIG1hcERpc3QgPSBkaXN0OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKChtYXBQb3MgPD0gc3RvcFNsb3QpICYmIChtYXBEaXN0IDwgUENNRE1YX1RIUkVTSE9MRF9NQVBfSEVBVF8yKSAmJgorICAgICAgICAgICgoKHNwa3JQb3NbY2hdLnggIT0gMCkgJiYgKHNwa3JTbG90UG9zW21hcFBvc10ueCAhPSAwKSkgLyogWE9SICovCisgICAgICAgICAgIHx8ICgoc3BrclBvc1tjaF0ueCA9PSAwKSAmJgorICAgICAgICAgICAgICAgKHNwa3JTbG90UG9zW21hcFBvc10ueCA9PQorICAgICAgICAgICAgICAgIDApKSkpIHsgLyogQXNzaWduIGNlbnRlciBjaGFubmVscyB0byBjZW50ZXIgc2xvdHMgb25seS4gKi8KKyAgICAgICAgb2Zmc2V0VGFibGVbbWFwUG9zXSA9IChVQ0hBUiljaDsKKyAgICAgICAgbWFwcGVkW2NoXSA9IDE7CisgICAgICAgIG51bU1hcHBlZEluQ2hzICs9IDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogTWFwcGluZyBIRUFUIDM6CisgICAqICAgQXNzaWduIHRoZSByZXN0IGJ5IHNlYXJjaGluZyBmb3IgdGhlIG5lYXJlc3QgaW5wdXQgY2hhbm5lbCBmb3IgZWFjaAorICAgKiBpbnRlcm5hbCBzbG90LiAqLworICBmb3IgKGNoID0gc3RhcnRTbG90OyAoY2ggPCAoOCkpICYmIChudW1NYXBwZWRJbkNocyA8IG51bUNoYW5uZWxzKTsgY2ggKz0gMSkgeworICAgIGlmIChvZmZzZXRUYWJsZVtjaF0gPT0gMjU1KSB7CisgICAgICBVSU5UIG1hcERpc3QgPSAodW5zaWduZWQpLTE7CisgICAgICB1bnNpZ25lZCBtYXBDaCwgbWFwUG9zID0gKHVuc2lnbmVkKS0xOworCisgICAgICBmb3IgKG1hcENoID0gMDsgbWFwQ2ggPCAodW5zaWduZWQpbnVtQ2hhbm5lbHM7IG1hcENoICs9IDEpIHsKKyAgICAgICAgaWYgKCFtYXBwZWRbbWFwQ2hdKSB7CisgICAgICAgICAgVUlOVCBkaXN0ID0gZ2V0U3BlYWtlckRpc3RhbmNlKHNwa3JQb3NbbWFwQ2hdLCBzcGtyU2xvdFBvc1tjaF0pOworICAgICAgICAgIGlmIChkaXN0IDwgbWFwRGlzdCkgeworICAgICAgICAgICAgbWFwUG9zID0gbWFwQ2g7CisgICAgICAgICAgICBtYXBEaXN0ID0gZGlzdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChtYXBEaXN0IDwgUENNRE1YX1RIUkVTSE9MRF9NQVBfSEVBVF8zKSB7CisgICAgICAgIG9mZnNldFRhYmxlW2NoXSA9IChVQ0hBUiltYXBQb3M7CisgICAgICAgIG1hcHBlZFttYXBQb3NdID0gMTsKKyAgICAgICAgbnVtTWFwcGVkSW5DaHMgKz0gMTsKKyAgICAgICAgaWYgKChzcGtyUG9zW21hcFBvc10ueCA9PSAwKSAmJiAoc3BrclNsb3RQb3NbY2hdLnggIT0gMCkgJiYKKyAgICAgICAgICAgIChudW1DaGFubmVscyA8CisgICAgICAgICAgICAgKDgpKSkgeyAvKiBTa2lwIHRoZSBwYWlyZWQgc2xvdCBpZiB3ZSBhc3NpZ25lZCBhIGNlbnRlciBjaGFubmVsLiAqLworICAgICAgICAgIGNoICs9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBGaW5hbHkgY29tcG9zZSB0aGUgY2hhbm5lbCBtb2RlICovCisgIGZvciAoY2ggPSAwOyBjaCA8ICg0KTsgY2ggKz0gMSkgeworICAgIGludCBwbGFuZSwgbnVtQ2hJbkdycCA9IDA7CisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgKDMpOyBwbGFuZSArPSAxKSB7CisgICAgICBudW1DaEluR3JwICs9IG51bUNoW3BsYW5lXVtjaF07CisgICAgfQorICAgICpjaE1vZGUgPSAoUENNX0RNWF9DSEFOTkVMX01PREUpKCpjaE1vZGUgfCAobnVtQ2hJbkdycCA8PCAoY2ggKiA0KSkpOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqIEdlbmVyYXRlIGEgY2hhbm5lbCBvZmZzZXQgdGFibGUgYW5kIGNvbXBsZXRlIGNoYW5uZWwgZGVzY3JpcHRpb24gZm9yIGEgZ2l2ZW4KKyAqKHBhY2tlZCkgY2hhbm5lbCBtb2RlLiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnZlcnNlIHRvIHRoZSBnZXRDaGFubmVsTW9kZSgpCisgKnJvdXRpbmUgYnV0IGRvZXMgbm90IHN1cHBvcnQgd2VpcmQgY2hhbm5lbCBjb25maWd1cmF0aW9ucy4KKyAqIEBwYXJhbSBbaW5dIFRoZSBwYWNrZWQgY2hhbm5lbCBtb2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIHRvIGJlIHByb2Nlc3NlZC4KKyAqIEBwYXJhbSBbaW5dIEFycmF5IGNvbnRhaW5pbmcgdGhlIGNoYW5uZWwgbWFwcGluZyB0byBiZSB1c2VkIChGcm9tIE1QRUcgUENFCisgKm9yZGVyaW5nIHRvIHdoYXRldmVyIGlzIHJlcXVpcmVkKS4KKyAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZXMgZm9yIGVhY2ggY2hhbm5lbHMgYXJlCisgKnN0b3JlZCBpbnRvLgorICogQHBhcmFtIFtvdXRdIEFycmF5IHdoZXJlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGljZXMgZm9yIGVhY2ggb3V0cHV0CisgKmNoYW5uZWwgYXJlIHN0b3JlZCBpbnRvLgorICogQHBhcmFtIFtvdXRdIEFycmF5IHdoZXJlIHRoZSBidWZmZXIgb2Zmc2V0cyBmb3IgZWFjaCBjaGFubmVsIGFyZSBzdG9yZWQgaW50by4KKyAqIEByZXR1cm5zIE5vbmUuCisgKiovCitzdGF0aWMgdm9pZCBnZXRDaGFubmVsRGVzY3JpcHRpb24oCisgICAgY29uc3QgUENNX0RNWF9DSEFOTkVMX01PREUgY2hNb2RlLCAgICAgICAgIC8qIGluICovCisgICAgY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciAqY29uc3QgbWFwRGVzY3IsIC8qIGluICovCisgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlW10sICAgICAgICAgIC8qIG91dCAqLworICAgIFVDSEFSIGNoYW5uZWxJbmRpY2VzW10sICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KKyAgICBVQ0hBUiBvZmZzZXRUYWJsZVsoOCldICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCispIHsKKyAgaW50IGdycElkeCwgcGxhaW5JZHgsIG51bVBsYWlucyA9IDEsIG51bVRvdGFsQ2hhbm5lbHMgPSAwOworICBpbnQgY2hDZmcsIGNoID0gMDsKKworICBGREtfQVNTRVJUKGNoYW5uZWxUeXBlICE9IE5VTEwpOworICBGREtfQVNTRVJUKGNoYW5uZWxJbmRpY2VzICE9IE5VTEwpOworICBGREtfQVNTRVJUKG1hcERlc2NyICE9IE5VTEwpOworICBGREtfQVNTRVJUKG9mZnNldFRhYmxlICE9IE5VTEwpOworCisgIC8qIEluaXQgb3V0cHV0IGFycmF5cyAqLworICBGREttZW1jbGVhcihjaGFubmVsVHlwZSwgKDgpICogc2l6ZW9mKEFVRElPX0NIQU5ORUxfVFlQRSkpOworICBGREttZW1jbGVhcihjaGFubmVsSW5kaWNlcywgKDgpICogc2l6ZW9mKFVDSEFSKSk7CisgIEZES21lbXNldChvZmZzZXRUYWJsZSwgMjU1LCAoOCkgKiBzaXplb2YoVUNIQVIpKTsKKworICAvKiBTdW1tZXJpemUgdG8gZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgZm9yIChncnBJZHggPSAwOyBncnBJZHggPCAoNCk7IGdycElkeCArPSAxKSB7CisgICAgbnVtVG90YWxDaGFubmVscyArPSAoY2hNb2RlID4+IChncnBJZHggKiA0KSkgJiAweEY7CisgIH0KKworICAvKiBHZXQgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwgbWFwICovCisgIHN3aXRjaCAoY2hNb2RlKSB7CisgICAgY2FzZSBDSF9NT0RFXzFfMF8wXzA6CisgICAgY2FzZSBDSF9NT0RFXzJfMF8wXzA6CisgICAgY2FzZSBDSF9NT0RFXzNfMF8wXzA6CisgICAgY2FzZSBDSF9NT0RFXzNfMF8xXzA6CisgICAgY2FzZSBDSF9NT0RFXzNfMF8yXzA6CisgICAgY2FzZSBDSF9NT0RFXzNfMF8yXzE6CisgICAgICBjaENmZyA9IG51bVRvdGFsQ2hhbm5lbHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIX01PREVfM18wXzNfMToKKyAgICAgIGNoQ2ZnID0gMTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIX01PREVfM18wXzRfMToKKyAgICAgIGNoQ2ZnID0gMTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIX01PREVfNV8wXzJfMToKKyAgICAgIGNoQ2ZnID0gNzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBmYWxsYmFjayAqLworICAgICAgY2hDZmcgPSAwOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBDb21wb3NlIGNoYW5uZWwgb2Zmc2V0IHRhYmxlICovCisKKyAgZm9yIChwbGFpbklkeCA9IDA7IHBsYWluSWR4IDwgbnVtUGxhaW5zOyBwbGFpbklkeCArPSAxKSB7CisgICAgUENNX0RNWF9DSEFOTkVMX01PREUgcGxhaW5DaE1vZGU7CisgICAgVUNIQVIgbnVtQ2hJbkdycFsoNCldOworCisgICAgcGxhaW5DaE1vZGUgPSBnZXRDaE1vZGU0UGxhaW4ocGxhaW5JZHgsIGNoTW9kZSwgY2hDZmcpOworCisgICAgLyogRXh0cmFjdCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHBlciBncm91cCAqLworICAgIG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdID0gcGxhaW5DaE1vZGUgJiAweEY7CisgICAgbnVtQ2hJbkdycFtDSF9HUk9VUF9TSURFXSA9IChwbGFpbkNoTW9kZSA+PiA0KSAmIDB4RjsKKyAgICBudW1DaEluR3JwW0NIX0dST1VQX1JFQVJdID0gKHBsYWluQ2hNb2RlID4+IDgpICYgMHhGOworICAgIG51bUNoSW5HcnBbQ0hfR1JPVVBfTEZFXSA9IChwbGFpbkNoTW9kZSA+PiAxMikgJiAweEY7CisKKyAgICAvKiBOb24tc3ltbWV0cmljIGNoYW5uZWxzICovCisgICAgaWYgKChudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSAmIDB4MSkgJiYgKHBsYWluSWR4ID09IENIX1BMQUlOX05PUk1BTCkpIHsKKyAgICAgIC8qIE9kZCBudW1iZXIgb2YgZnJvbnQgY2hhbm5lbHMgLT4gd2UgaGF2ZSBhIGNlbnRlciBjaGFubmVsLgorICAgICAgICAgSW4gTVBFRy00IHRoZSBjZW50ZXIgaGFzIHRoZSBpbmRleCAwLiAqLworICAgICAgaW50IG1hcHBlZElkeCA9IEZES19jaE1hcERlc2NyX2dldE1hcFZhbHVlKG1hcERlc2NyLCAoVUNIQVIpY2gsIGNoQ2ZnKTsKKyAgICAgIG9mZnNldFRhYmxlW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IChVQ0hBUiltYXBwZWRJZHg7CisgICAgICBjaGFubmVsVHlwZVttYXBwZWRJZHhdID0gQUNUX0ZST05UOworICAgICAgY2hhbm5lbEluZGljZXNbbWFwcGVkSWR4XSA9IDA7CisgICAgICBjaCArPSAxOworICAgIH0KKworICAgIGZvciAoZ3JwSWR4ID0gMDsgZ3JwSWR4IDwgKDQpOyBncnBJZHggKz0gMSkgeworICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIHR5cGUgPSBBQ1RfTk9ORTsKKyAgICAgIGludCBjaE1hcFBvcyA9IDAsIG1heENoYW5uZWxzID0gMDsKKyAgICAgIGludCBjaElkeCA9IDA7IC8qIEluZGV4IG9mIGNoYW5uZWwgd2l0aGluIHRoZSBzcGVjaWZpYyBncm91cCAqLworCisgICAgICBzd2l0Y2ggKGdycElkeCkgeworICAgICAgICBjYXNlIENIX0dST1VQX0ZST05UOgorICAgICAgICAgIHR5cGUgPSAoQVVESU9fQ0hBTk5FTF9UWVBFKSgocGxhaW5JZHggPDwgNCkgfCBBQ1RfRlJPTlQpOworICAgICAgICAgIHN3aXRjaCAocGxhaW5JZHgpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGNoTWFwUG9zID0gTEVGVF9GUk9OVF9DSEFOTkVMOworICAgICAgICAgICAgICBjaElkeCA9IG51bUNoSW5HcnBbZ3JwSWR4XSAmIDB4MTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIG1heENoYW5uZWxzID0gMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSF9HUk9VUF9TSURFOgorICAgICAgICAgIC8qIEFsd2F5cyBtYXAgc2lkZSBjaGFubmVscyB0byB0aGUgbXVsdGlwdXJwb3NlIGdyb3VwLiAqLworICAgICAgICAgIHR5cGUgPSAoQVVESU9fQ0hBTk5FTF9UWVBFKSgocGxhaW5JZHggPDwgNCkgfCBBQ1RfU0lERSk7CisgICAgICAgICAgaWYgKHBsYWluSWR4ID09IENIX1BMQUlOX1RPUCkgeworICAgICAgICAgICAgY2hNYXBQb3MgPSBMRUZUX1NJREVfQ0hBTk5FTF9UT1A7CisgICAgICAgICAgICBtYXhDaGFubmVscyA9IDM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoTWFwUG9zID0gTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTDsKKyAgICAgICAgICAgIG1heENoYW5uZWxzID0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hfR1JPVVBfUkVBUjoKKyAgICAgICAgICB0eXBlID0gKEFVRElPX0NIQU5ORUxfVFlQRSkoKHBsYWluSWR4IDw8IDQpIHwgQUNUX0JBQ0spOworICAgICAgICAgIGlmIChwbGFpbklkeCA9PSBDSF9QTEFJTl9UT1ApIHsKKyAgICAgICAgICAgIGNoTWFwUG9zID0gTEVGVF9SRUFSX0NIQU5ORUxfVE9QOworICAgICAgICAgICAgbWF4Q2hhbm5lbHMgPSAzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaE1hcFBvcyA9IExFRlRfUkVBUl9DSEFOTkVMOworICAgICAgICAgICAgbWF4Q2hhbm5lbHMgPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSF9HUk9VUF9MRkU6CisgICAgICAgICAgaWYgKHBsYWluSWR4ID09IENIX1BMQUlOX05PUk1BTCkgeworICAgICAgICAgICAgdHlwZSA9IEFDVF9MRkU7CisgICAgICAgICAgICBjaE1hcFBvcyA9IExPV19GUkVRVUVOQ1lfQ0hBTk5FTDsKKyAgICAgICAgICAgIG1heENoYW5uZWxzID0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIE1hcCBhbGwgY2hhbm5lbHMgaW4gdGhpcyBncm91cCAqLworICAgICAgZm9yICg7IGNoSWR4IDwgbnVtQ2hJbkdycFtncnBJZHhdOyBjaElkeCArPSAxKSB7CisgICAgICAgIGludCBtYXBwZWRJZHggPSBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZShtYXBEZXNjciwgKFVDSEFSKWNoLCBjaENmZyk7CisgICAgICAgIGlmICgoY2hJZHggPT0gbWF4Q2hhbm5lbHMpIHx8IChvZmZzZXRUYWJsZVtjaE1hcFBvc10gPCAyNTUpKSB7CisgICAgICAgICAgLyogTm8gc3BhY2UgbGVmdCBpbiB0aGlzIGNoYW5uZWwgZ3JvdXAhICovCisgICAgICAgICAgaWYgKG9mZnNldFRhYmxlW0xFRlRfTVVMVElQUlBTX0NIQU5ORUxdID09CisgICAgICAgICAgICAgIDI1NSkgeyAvKiBVc2UgdGhlIG11bHRpcHVycG9zZSBncm91cDogKi8KKyAgICAgICAgICAgIGNoTWFwUG9zID0gTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0VGFibGVbY2hNYXBQb3NdID0gKFVDSEFSKW1hcHBlZElkeDsKKyAgICAgICAgY2hhbm5lbFR5cGVbbWFwcGVkSWR4XSA9IHR5cGU7CisgICAgICAgIGNoYW5uZWxJbmRpY2VzW21hcHBlZElkeF0gPSAoVUNIQVIpY2hJZHg7CisgICAgICAgIGNoTWFwUG9zICs9IDE7CisgICAgICAgIGNoICs9IDE7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgaW5pdGlhbGl6ZXMKKyAqICBvbmUgcm93IGluIGEgZ2l2ZW4gZG93bm1peCBtYXRyaXggKGNvcnJlc3BvbmRpbmcgdG8gb25lIG91dHB1dCBjaGFubmVsKS4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgorICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXgKKyAqZmFjdG9ycy4KKyAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIGNoYW5uZWwgKHJvdykgdG8gYmUgaW5pdGlhbGl6ZWQuCisgKiBAcmV0dXJucyAgICAgICBOb3RoaW5nIHRvIHJldHVybi4KKyAqKi8KK3N0YXRpYyB2b2lkIGRteEluaXRDaGFubmVsKEZJWFBfRE1YIG1peEZhY3RvcnNbKDgpXVsoOCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1peFNjYWxlc1soOCldWyg4KV0sIGNvbnN0IHVuc2lnbmVkIGludCBvdXRDaCkgeworICB1bnNpZ25lZCBpbnQgaW5DaDsKKyAgZm9yIChpbkNoID0gMDsgaW5DaCA8ICg4KTsgaW5DaCArPSAxKSB7CisgICAgaWYgKGluQ2ggPT0gb3V0Q2gpIHsKKyAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID0gRkwyRlhDT05TVF9ETVgoMC41Zik7CisgICAgICBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPSBGTDJGWENPTlNUX0RNWCgwLjBmKTsKKyAgICAgIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPSAwOworICAgIH0KKyAgfQorfQorCisvKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGRvZXMgYSByZXNldAorICogIG9mIG9uZSByb3cgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeCAoY29ycmVzcG9uZGluZyB0byBvbmUgb3V0cHV0IGNoYW5uZWwpLgorICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguCisgKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peAorICpmYWN0b3JzLgorICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgY2hhbm5lbCAocm93KSB0byBiZSBjbGVhcmVkL3Jlc2V0LgorICogQHJldHVybnMgICAgICAgTm90aGluZyB0byByZXR1cm4uCisgKiovCitzdGF0aWMgdm9pZCBkbXhDbGVhckNoYW5uZWwoRklYUF9ETVggbWl4RmFjdG9yc1soOCldWyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1peFNjYWxlc1soOCldWyg4KV0sIGNvbnN0IHVuc2lnbmVkIGludCBvdXRDaCkgeworICBGREtfQVNTRVJUKChvdXRDaCA+PSAwKSAmJiAob3V0Q2ggPCAoOCkpKTsKKyAgRkRLbWVtY2xlYXIoJm1peEZhY3RvcnNbb3V0Q2hdLCAoOCkgKiBzaXplb2YoRklYUF9ETVgpKTsKKyAgRkRLbWVtY2xlYXIoJm1peFNjYWxlc1tvdXRDaF0sICg4KSAqIHNpemVvZihJTlQpKTsKK30KKworLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBhcHBsaWVzIGEKKyAqc291cmNlIGNoYW5uZWwgKHJvdykgc2NhbGVkIGJ5IGEgZ2l2ZW4gbWl4IGZhY3RvciB0byBhIGRlc3RpbmF0aW9uIGNoYW5uZWwKKyAqKHJvdykgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeC4gRXhpc3RpbmcgbWl4IGZhY3RvcnMgb2YgdGhlIGRlc3RpbmF0aW9uCisgKmNoYW5uZWwgKHJvdykgd2lsbCBnZXQgb3ZlcndyaXR0ZW4uCisgKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gc2NhbGUgZmFjdG9yIG1hdHJpeCBhc3NvY2lhdGVkIHRvIHRoZSBkb3dubWl4CisgKmZhY3RvcnMuCisgKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBzb3VyY2UgY2hhbm5lbCAocm93KS4KKyAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykuCisgKiBAcGFyYW0gW2luXSAgICBGaXhlZC1wb2ludCBwYXJ0IG9mIG1peCBmYWN0b3IgdG8gYmUgYXBwbGllZC4KKyAqIEBwYXJhbSBbaW5dICAgIFNjYWxlIGZhY3RvciBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCisgKiBAcmV0dXJucyAgICAgICBOb3RoaW5nIHRvIHJldHVybi4KKyAqKi8KK3N0YXRpYyB2b2lkIGRteFNldENoYW5uZWwoRklYUF9ETVggbWl4RmFjdG9yc1soOCldWyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtaXhTY2FsZXNbKDgpXVsoOCldLCBjb25zdCB1bnNpZ25lZCBpbnQgZHN0Q2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzcmNDaCwgY29uc3QgRklYUF9ETVggZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2NhbGUpIHsKKyAgaW50IGNoOworICBmb3IgKGNoID0gMDsgY2ggPCAoOCk7IGNoICs9IDEpIHsKKyAgICBpZiAobWl4RmFjdG9yc1tzcmNDaF1bY2hdICE9IChGSVhQX0RNWCkwKSB7CisgICAgICBtaXhGYWN0b3JzW2RzdENoXVtjaF0gPQorICAgICAgICAgIEZYX0RCTDJGWF9ETVgoZk11bHQobWl4RmFjdG9yc1tzcmNDaF1bY2hdLCBmYWN0b3IpKTsKKyAgICAgIG1peFNjYWxlc1tkc3RDaF1bY2hdID0gbWl4U2NhbGVzW3NyY0NoXVtjaF0gKyBzY2FsZTsKKyAgICB9CisgIH0KK30KKworLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBhZGRzIGEgc291cmNlCisgKmNoYW5uZWwgKHJvdykgc2NhbGVkIGJ5IGEgZ2l2ZW4gbWl4IGZhY3RvciB0byBhIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykgaW4gYQorICpnaXZlbiBkb3dubWl4IG1hdHJpeC4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgorICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXgKKyAqZmFjdG9ycy4KKyAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIHNvdXJjZSBjaGFubmVsIChyb3cpLgorICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KS4KKyAqIEBwYXJhbSBbaW5dICAgIEZpeGVkLXBvaW50IHBhcnQgb2YgbWl4IGZhY3RvciB0byBiZSBhcHBsaWVkLgorICogQHBhcmFtIFtpbl0gICAgU2NhbGUgZmFjdG9yIG9mIG1peCBmYWN0b3IgdG8gYmUgYXBwbGllZC4KKyAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgorICoqLworc3RhdGljIHZvaWQgZG14QWRkQ2hhbm5lbChGSVhQX0RNWCBtaXhGYWN0b3JzWyg4KV1bKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1peFNjYWxlc1soOCldWyg4KV0sIGNvbnN0IHVuc2lnbmVkIGludCBkc3RDaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHNyY0NoLCBjb25zdCBGSVhQX0RNWCBmYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzY2FsZSkgeworICBpbnQgY2g7CisgIGZvciAoY2ggPSAwOyBjaCA8ICg4KTsgY2ggKz0gMSkgeworICAgIEZJWFBfREJMIGFkZEZhY3QgPSBmTXVsdChtaXhGYWN0b3JzW3NyY0NoXVtjaF0sIGZhY3Rvcik7CisgICAgaWYgKGFkZEZhY3QgIT0gKEZJWFBfRE1YKTApIHsKKyAgICAgIElOVCBuZXdTY2FsZSA9IG1peFNjYWxlc1tzcmNDaF1bY2hdICsgc2NhbGU7CisgICAgICBpZiAobWl4RmFjdG9yc1tkc3RDaF1bY2hdICE9IChGSVhQX0RNWCkwKSB7CisgICAgICAgIGlmIChuZXdTY2FsZSA+IG1peFNjYWxlc1tkc3RDaF1bY2hdKSB7CisgICAgICAgICAgbWl4RmFjdG9yc1tkc3RDaF1bY2hdID4+PSBuZXdTY2FsZSAtIG1peFNjYWxlc1tkc3RDaF1bY2hdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFkZEZhY3QgPj49IG1peFNjYWxlc1tkc3RDaF1bY2hdIC0gbmV3U2NhbGU7CisgICAgICAgICAgbmV3U2NhbGUgPSBtaXhTY2FsZXNbZHN0Q2hdW2NoXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbWl4RmFjdG9yc1tkc3RDaF1bY2hdICs9IEZYX0RCTDJGWF9ETVgoYWRkRmFjdCk7CisgICAgICBtaXhTY2FsZXNbZHN0Q2hdW2NoXSA9IG5ld1NjYWxlOworICAgIH0KKyAgfQorfQorCisvKiogUHJpdmF0ZSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBkb3dubWl4IGZhY3RvciBtYXRyaXggZGVwZW5kaW5nIG9uIHRoZSBpbnB1dAorIGFuZCBvdXRwdXQKKyAqICBjb25maWd1cmF0aW9uLCB0aGUgdXNlciBwYXJhbWV0ZXJzIGFzIHdlbGwgYXMgdGhlIGdpdmVuIG1ldGFkYXRhLiBUaGlzCisgZnVuY3Rpb24gaXMgdGhlIG1vZHVsZXMKKyAqICBicmFpbiBhbmQgaG9sZCBhbGwgZG93bm1peCBhbGdvcml0aG1zLgorICogQHBhcmFtIFtpbl0gIEZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgaW5DaE1vZGUgaG9sZHMgYSByZWFsIChwYWNrZWQpIGNoYW5uZWwKKyBtb2RlIG9yIGhhcyBiZWVuIGNvbnZlcnRlZCB0byBhIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXguCisgKiBAcGFyYW0gW2luXSAgRGVwZW5kZW50IG9uIHRoZSBpbk1vZGVJc0NmZyBmbGFnIHRoaXMgZmllbGQgaGFuZHMgaW4gYSAocGFja2VkKQorIGNoYW5uZWwgbW9kZSBvciB0aGUgY29ycmVzcG9uZGluZyBNUEVHLTQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4Lm9mIHRoZQorIGlucHV0IGNvbmZpZ3VyYXRpb24uCisgKiBAcGFyYW0gW2luXSAgVGhlIChwYWNrZWQpIGNoYW5uZWwgbW9kZSBvZiB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24uCisgKiBAcGFyYW0gW2luXSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgaG9sZGluZyBhbGwgY3VycmVudCB1c2VyIHBhcmFtZXRlci4KKyAqIEBwYXJhbSBbaW5dICBQb2ludGVyIHRvIGZpZWxkIGhvbGRpbmcgYWxsIGN1cnJlbnQgbWV0YSBkYXRhLgorICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LiBOb3JtYWxpemVkCisgdG8gb25lIHNjYWxlIGZhY3Rvci4KKyAqIEBwYXJhbSBbb3V0XSBUaGUgY29tbW9uIHNjYWxlIGZhY3RvciBvZiB0aGUgZG93bm1peCBtYXRyaXguCisgKiBAcmV0dXJucyAgICAgQW4gZXJyb3IgY29kZS4KKyAqKi8KK3N0YXRpYyBQQ01ETVhfRVJST1IgZ2V0TWl4RmFjdG9ycyhjb25zdCBVQ0hBUiBpbk1vZGVJc0NmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ01fRE1YX0NIQU5ORUxfTU9ERSBpbkNoTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQQ01fRE1YX0NIQU5ORUxfTU9ERSBvdXRDaE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUENNX0RNWF9VU0VSX1BBUkFNUyAqcFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBETVhfQlNfTUVUQV9EQVRBICpwTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9ETVggbWl4RmFjdG9yc1soOCldWyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwT3V0U2NhbGUpIHsKKyAgUENNRE1YX0VSUk9SIGVyciA9IFBDTURNWF9PSzsKKyAgSU5UIG1peFNjYWxlc1soOCldWyg4KV07CisgIElOVCBtYXhTY2FsZSA9IDA7CisgIGludCBudW1JbkNoYW5uZWw7CisgIGludCBudW1PdXRDaGFubmVsOworICBpbnQgZG14TWV0aG9kOworICB1bnNpZ25lZCBpbnQgb3V0Q2gsIGluQ2hDZmcgPSAwOworICB1bnNpZ25lZCBpbnQgdmFsaWRbKDgpXSA9IHswfTsKKworICBGREtfQVNTRVJUKHBNZXRhRGF0YSAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChtaXhGYWN0b3JzICE9IE5VTEwpOworICAvKiBDaGVjayBvbiBhIHN1cHBvcnRlZCBvdXRwdXQgY29uZmlndXJhdGlvbi4KKyAgICAgQWRkIG5ldyBvbmUgb25seSBhZnRlciBleHRlbnNpdmUgdGVzdGluZyEgKi8KKyAgaWYgKCEoKG91dENoTW9kZSA9PSBDSF9NT0RFXzFfMF8wXzApIHx8IChvdXRDaE1vZGUgPT0gQ0hfTU9ERV8yXzBfMF8wKSB8fAorICAgICAgICAob3V0Q2hNb2RlID09IENIX01PREVfM18wXzJfMSkgfHwgKG91dENoTW9kZSA9PSBDSF9NT0RFXzNfMF80XzEpIHx8CisgICAgICAgIChvdXRDaE1vZGUgPT0gQ0hfTU9ERV81XzBfMl8xKSkpIHsKKyAgICBGREtfQVNTRVJUKDApOworICB9CisKKyAgaWYgKGluTW9kZUlzQ2ZnKSB7CisgICAgLyogQ29udmVydCBjaGFubmVsIGNvbmZpZyB0byBjaGFubmVsIG1vZGU6ICovCisgICAgaW5DaENmZyA9ICh1bnNpZ25lZCBpbnQpaW5DaE1vZGU7CisgICAgc3dpdGNoIChpbkNoQ2ZnKSB7CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDI6CisgICAgICBjYXNlIDM6CisgICAgICBjYXNlIDQ6CisgICAgICBjYXNlIDU6CisgICAgICBjYXNlIDY6CisgICAgICAgIGluQ2hNb2RlID0gb3V0Q2hNb2RlVGFibGVbaW5DaENmZ107CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMToKKyAgICAgICAgaW5DaE1vZGUgPSBDSF9NT0RFXzNfMF8zXzE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMjoKKyAgICAgICAgaW5DaE1vZGUgPSBDSF9NT0RFXzNfMF80XzE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA3OgorICAgICAgY2FzZSAxNDoKKyAgICAgICAgaW5DaE1vZGUgPSBDSF9NT0RFXzVfMF8yXzE7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICB9CisgIH0KKworICAvKiBFeHRyYWN0IHRoZSB0b3RhbCBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgKi8KKyAgbnVtSW5DaGFubmVsID0gKGluQ2hNb2RlICYgMHhGKSArICgoaW5DaE1vZGUgPj4gNCkgJiAweEYpICsKKyAgICAgICAgICAgICAgICAgKChpbkNoTW9kZSA+PiA4KSAmIDB4RikgKyAoKGluQ2hNb2RlID4+IDEyKSAmIDB4Rik7CisgIC8qIEV4dHJhY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KKyAgbnVtT3V0Q2hhbm5lbCA9IChvdXRDaE1vZGUgJiAweEYpICsgKChvdXRDaE1vZGUgPj4gNCkgJiAweEYpICsKKyAgICAgICAgICAgICAgICAgICgob3V0Q2hNb2RlID4+IDgpICYgMHhGKSArICgob3V0Q2hNb2RlID4+IDEyKSAmIDB4Rik7CisKKyAgLyogTVBFRyBhbW1lbmRtZW50IDQgYWthIEVUU0kgbWV0YWRhdGEgYW5kIGZhbGxiYWNrIG1vZGU6ICovCisKKyAgLyogQ3JlYXRlIGlkZW50aXR5IERNWCBtYXRyaXg6ICovCisgIGZvciAob3V0Q2ggPSAwOyBvdXRDaCA8ICg4KTsgb3V0Q2ggKz0gMSkgeworICAgIGRteEluaXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgb3V0Q2gpOworICB9CisgIGlmICgoKGluQ2hNb2RlID4+IDEyKSAmIDB4RikgPT0gMCkgeworICAgIC8qIENsZWFyIGVtcHR5IG9yIHdyb25nbHkgbWFwcGVkIGlucHV0IGNoYW5uZWwgKi8KKyAgICBkbXhDbGVhckNoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwpOworICB9CisKKyAgLyogRklSU1QgU1RBR0U6ICovCisgIGlmIChudW1JbkNoYW5uZWwgPiBTSVhfQ0hBTk5FTCkgeyAvKiBBbHdheXMgdXNlIE1QRUcgZXF1YXRpb25zIGVpdGhlciB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhIGRhdGEgb3Igd2l0aCBkZWZhdWx0IHZhbHVlcy4gKi8KKyAgICBGSVhQX0RNWCBkTWl4RmFjdEEsIGRNaXhGYWN0QjsKKyAgICBJTlQgZE1peFNjYWxlQSwgZE1peFNjYWxlQjsKKyAgICBpbnQgaXNWYWxpZENmZyA9IFRSVUU7CisKKyAgICAvKiBHZXQgZmFjdG9ycyBmcm9tIG1ldGEgZGF0YSAqLworICAgIGRNaXhGYWN0QSA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5kbWl4SWR4QV07CisgICAgZE1peFNjYWxlQSA9IChwTWV0YURhdGEtPmRtaXhJZHhBID09IDApID8gMSA6IDA7CisgICAgZE1peEZhY3RCID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPmRtaXhJZHhCXTsKKyAgICBkTWl4U2NhbGVCID0gKHBNZXRhRGF0YS0+ZG1peElkeEIgPT0gMCkgPyAxIDogMDsKKworICAgIC8qIENoZWNrIGlmIGlucHV0IGlzIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyAqLworICAgIHN3aXRjaCAoaW5DaE1vZGUpIHsKKyAgICAgIGNhc2UgQ0hfTU9ERV8zXzJfMV8xOiAvKiBjaENmZyAxMSBidXQgd2l0aCBzaWRlIGNoYW5uZWxzICovCisgICAgICBjYXNlIENIX01PREVfM18yXzFfMDoKKyAgICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOworICAgICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOworICAgICAgY2FzZSBDSF9NT0RFXzNfMF8zXzE6IC8qIGNoQ2ZnIDExICovCisgICAgICAgIC8qIDYuMWNoOiAgQycgPSBDOyAgTCcgPSBMOyAgUicgPSBSOyAgTEZFJyA9IExGRTsKKyAgICAgICAgICAgICAgICAgICBMcycgPSBMcypkbWl4X2FfaWR4ICsgQ3MqZG1peF9iX2lkeDsKKyAgICAgICAgICAgICAgICAgICBScycgPSBScypkbWl4X2FfaWR4ICsgQ3MqZG1peF9iX2lkeDsgKi8KKyAgICAgICAgZG14Q2xlYXJDaGFubmVsKAorICAgICAgICAgICAgbWl4RmFjdG9ycywgbWl4U2NhbGVzLAorICAgICAgICAgICAgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwpOyAvKiBjbGVhciBlbXB0eSBpbnB1dCBjaGFubmVsICovCisgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgZE1peEZhY3RBLCBkTWl4U2NhbGVBKTsKKyAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQik7CisgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgUklHSFRfUkVBUl9DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEpOworICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDSF9NT0RFXzNfMF80XzE6IC8qIGNoQ2ZnIDEyICovCisgICAgICAgIC8qIDcuMWNoIFN1cnJvdW5kIEJhY2s6ICBDJyA9IEM7ICBMJyA9IEw7ICBSJyA9IFI7ICBMRkUnID0gTEZFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTHMnID0gTHMqZG1peF9hX2lkeCArIExzcipkbWl4X2JfaWR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnMnID0gUnMqZG1peF9hX2lkeCArIFJzcipkbWl4X2JfaWR4OyAqLworICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgTEVGVF9SRUFSX0NIQU5ORUwsIGRNaXhGYWN0QSwgZE1peFNjYWxlQSk7CisgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIpOworICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgZE1peEZhY3RBLCBkTWl4U2NhbGVBKTsKKyAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENIX01PREVfNV8wXzFfMDoKKyAgICAgIGNhc2UgQ0hfTU9ERV81XzBfMV8xOgorICAgICAgICBkbXhDbGVhckNoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgUklHSFRfUkVBUl9DSEFOTkVMKTsgLyogY2xlYXIgZW1wdHkgaW5wdXQgY2hhbm5lbCAqLworICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIExFRlRfUkVBUl9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMSk7CisgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDEpOworICAgICAgY2FzZSBDSF9NT0RFXzVfMl8xXzA6CisgICAgICAgIGlzVmFsaWRDZmcgPSBGQUxTRTsKKyAgICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKKyAgICAgIGNhc2UgQ0hfTU9ERV81XzBfMl8xOiAvKiBjaENmZyA3IHx8IDE0ICovCisgICAgICAgIGlmIChpbkNoQ2ZnID09IDE0KSB7CisgICAgICAgICAgLyogNy4xY2ggRnJvbnQgSGVpZ2h0OiAgQycgPSBDOyAgTHMnID0gTHM7ICBScycgPSBSczsgIExGRScgPSBMRkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCcgPSBMKmRtaXhfYV9pZHggKyBMdipkbWl4X2JfaWR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gUipkbWl4X2FfaWR4ICsgUnYqZG1peF9iX2lkeDsgKi8KKyAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVGVF9GUk9OVF9DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEpOworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIpOworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgZE1peEZhY3RBLCBkTWl4U2NhbGVBKTsKKyAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIDcuMWNoIEZyb250OiAgTHMnID0gTHM7ICBScycgPSBSczsgIExGRScgPSBMRkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDJyA9IEMgKyAoTGMrUmMpKmRtaXhfYV9pZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBMJyA9IEwgKyBMYypkbWl4X2JfaWR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSBSICsgUmMqZG1peF9iX2lkeDsgKi8KKyAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEpOworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEpOworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIpOworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAxKTsKKyAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIpOworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogTm90aGluZyB0byBkby4gSnVzdCB1c2UgdGhlIGlkZW50aXR5IG1hdHJpeC4gKi8KKyAgICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOworICAgICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBBZGQgYWRkaXRpb25hbCBETVggZ2FpbiAqLworICAgIGlmICgoaXNWYWxpZENmZyA9PSBUUlVFKSAmJgorICAgICAgICAocE1ldGFEYXRhLT5kbXhHYWluSWR4NSAhPSAwKSkgeyAvKiBBcHBseSBETVggZ2FpbiA1ICovCisgICAgICBGSVhQX0RNWCBkbXhHYWluOworICAgICAgSU5UIGRteFNjYWxlOworICAgICAgSU5UIHNpZ24gPSAocE1ldGFEYXRhLT5kbXhHYWluSWR4NSAmIDB4NDApID8gLTEgOiAxOworICAgICAgSU5UIHZhbCA9IHBNZXRhRGF0YS0+ZG14R2FpbklkeDUgJiAweDNGOworCisgICAgICAvKiAxMF4oZG14X2dhaW5fNS84MCkgKi8KKyAgICAgIGRteEdhaW4gPSBGWF9EQkwyRlhfRE1YKAorICAgICAgICAgIGZMZFBvdyhGTDJGWENPTlNUX0RCTCgwLjgzMDQ4MjAyMzcyMTg0MWYpLCAyLCAvKiBsb2cyKDEwKSAqLworICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHNpZ24gKiB2YWwgKiAoTE9ORylGTDJGWENPTlNUX0RCTCgwLjAxMjVmKSksIDAsCisgICAgICAgICAgICAgICAgICZkbXhTY2FsZSkpOworICAgICAgLyogQ3VycmVudGx5IG9ubHkgcG9zaXRpdmUgc2NhbGUgZmFjdG9ycyBzdXBwb3J0ZWQhICovCisgICAgICBpZiAoZG14U2NhbGUgPCAwKSB7CisgICAgICAgIGRteEdhaW4gPj49IC1kbXhTY2FsZTsKKyAgICAgICAgZG14U2NhbGUgPSAwOworICAgICAgfQorCisgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBkbXhHYWluLCBkbXhTY2FsZSk7CisgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICBMRUZUX0ZST05UX0NIQU5ORUwsIGRteEdhaW4sIGRteFNjYWxlKTsKKyAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBkbXhHYWluLCBkbXhTY2FsZSk7CisgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICBkbXhHYWluLCBkbXhTY2FsZSk7CisgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICBSSUdIVF9SRUFSX0NIQU5ORUwsIGRteEdhaW4sIGRteFNjYWxlKTsKKyAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgZG14R2FpbiwgZG14U2NhbGUpOworICAgIH0KKworICAgIC8qIE1hcmsgdGhlIG91dHB1dCBjaGFubmVscyAqLworICAgIHZhbGlkW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IDE7CisgICAgdmFsaWRbTEVGVF9GUk9OVF9DSEFOTkVMXSA9IDE7CisgICAgdmFsaWRbUklHSFRfRlJPTlRfQ0hBTk5FTF0gPSAxOworICAgIHZhbGlkW0xFRlRfUkVBUl9DSEFOTkVMXSA9IDE7CisgICAgdmFsaWRbUklHSFRfUkVBUl9DSEFOTkVMXSA9IDE7CisgICAgdmFsaWRbTE9XX0ZSRVFVRU5DWV9DSEFOTkVMXSA9IDE7CisKKyAgICAvKiBVcGRhdGUgY2hhbm5lbCBtb2RlIGZvciB0aGUgbmV4dCBzdGFnZSAqLworICAgIGluQ2hNb2RlID0gQ0hfTU9ERV8zXzBfMl8xOworICB9CisKKyAgICAvKiBGb3IgdGhlIFggKD4gNikgdG8gNiBjaGFubmVsIGRvd25taXggd2UgaGFkIG5vIGNob2ljZS4KKyAgICAgICBUbyBtaXggZnJvbSA2IHRvIDIgKG9yIDEpIGNoYW5uZWwocykgd2UgaGF2ZSBzZXZlcmFsIHBvc3NpYmlsaXRpZXMgKE1QRUcKKyAgICAgICBEU0UgfCBNUEVHIFBDRSB8IElUVSB8IEFSSUIgfCBETEIpLiBVc2UgcHJvZmlsZSBhbmQgdGhlIG1ldGFkYXRhCisgICAgICAgYXZhaWxhYmxlIGZsYWdzIHRvIGRldGVybWluZSB3aGljaCBlcXVhdGlvbiB0byB1c2U6ICovCisKKyNkZWZpbmUgRE1YX01FVEhPRF9NUEVHX0FNRDQgMQorI2RlZmluZSBETVhfTUVUSE9EX01QRUdfTEVHQUNZIDIKKyNkZWZpbmUgRE1YX01FVEhPRF9BUklCX0pBUEFOIDQKKyNkZWZpbmUgRE1YX01FVEhPRF9JVFVfUkVDT00gOAorI2RlZmluZSBETVhfTUVUSE9EX0NVU1RPTSAxNgorCisgIGRteE1ldGhvZCA9IERNWF9NRVRIT0RfTVBFR19BTUQ0OyAvKiBkZWZhdWx0ICovCisKKyAgaWYgKChwUGFyYW1zLT5kbXhQcm9maWxlID09IERNWF9QUkZMX0ZPUkNFX01BVFJJWF9NSVgpICYmCisgICAgICAocE1ldGFEYXRhLT50eXBlRmxhZ3MgJiBUWVBFX1BDRV9EQVRBKSkgeworICAgIGRteE1ldGhvZCA9IERNWF9NRVRIT0RfTVBFR19MRUdBQ1k7CisgIH0gZWxzZSBpZiAoIShwTWV0YURhdGEtPnR5cGVGbGFncyAmCisgICAgICAgICAgICAgICAoVFlQRV9EU0VfQ0xFVl9EQVRBIHwgVFlQRV9EU0VfU0xFVl9EQVRBKSkpIHsKKyAgICBzd2l0Y2ggKHBQYXJhbXMtPmRteFByb2ZpbGUpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBjYXNlIERNWF9QUkZMX1NUQU5EQVJEOgorICAgICAgICAvKiBkbXhNZXRob2QgPSBETVhfTUVUSE9EX01QRUdfQU1ENDsgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERNWF9QUkZMX01BVFJJWF9NSVg6CisgICAgICBjYXNlIERNWF9QUkZMX0ZPUkNFX01BVFJJWF9NSVg6CisgICAgICAgIGlmIChwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfUENFX0RBVEEpIHsKKyAgICAgICAgICBkbXhNZXRob2QgPSBETVhfTUVUSE9EX01QRUdfTEVHQUNZOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBETVhfUFJGTF9BUklCX0pBUEFOOgorICAgICAgICBkbXhNZXRob2QgPSBETVhfTUVUSE9EX0FSSUJfSkFQQU47CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIFNFQ09ORCBTVEFHRTogKi8KKyAgaWYgKG51bU91dENoYW5uZWwgPD0gVFdPX0NIQU5ORUwpIHsKKyAgICAvKiBDcmVhdGUgRE1YIG1hdHJpeCBhY2NvcmRpbmcgdG8gaW5wdXQgY29uZmlndXJhdGlvbiAqLworICAgIHN3aXRjaCAoaW5DaE1vZGUpIHsKKyAgICAgIGNhc2UgQ0hfTU9ERV8yXzBfMF8wOiAvKiBjaENmZyAyICovCisgICAgICAgIC8qIEFwcGx5IHRoZSBkdWFsIGNoYW5uZWwgbW9kZS4gKi8KKyAgICAgICAgc3dpdGNoIChwUGFyYW1zLT5kdWFsQ2hhbm5lbE1vZGUpIHsKKyAgICAgICAgICBjYXNlIENIMV9NT0RFOiAvKiBMJyA9IDAuNzA3ICogQ2gxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gMC43MDcgKiBDaDE7ICovCisgICAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDApOworICAgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENIMl9NT0RFOiAvKiBMJyA9IDAuNzA3ICogQ2gyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gMC43MDcgKiBDaDI7ICovCisgICAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwKTsKKyAgICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgTUlYRURfTU9ERTogLyogTCcgPSAwLjUqQ2gxICsgMC41KkNoMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gMC41KkNoMSArIDAuNSpDaDI7ICovCisgICAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwKTsKKyAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwKTsKKyAgICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwKTsKKyAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNhc2UgU1RFUkVPX01PREU6CisgICAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisgICAgICAgKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgICAgICBjYXNlIENIX01PREVfMl8wXzFfMDogeworICAgICAgICBGSVhQX0RNWCBzTWl4THZsOworICAgICAgICBpZiAoZG14TWV0aG9kID09IERNWF9NRVRIT0RfQVJJQl9KQVBBTikgeworICAgICAgICAgIC8qIEwnID0gMC43MDcqTCArIDAuNSpTOyAgUicgPSAwLjcwNypSICsgMC41KlM7ICovCisgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCk7CisgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwKTsKKyAgICAgICAgICBzTWl4THZsID0gRkwyRlhDT05TVF9ETVgoMC41Zik7CisgICAgICAgIH0gZWxzZSB7IC8qIEwnID0gTCArIDAuNzA3KlM7ICBSJyA9IFIgKyAwLjcwNypTOyAqLworICAgICAgICAgIHNNaXhMdmwgPSBGTDJGWENPTlNUX0RNWCgwLjcwN2YpOworICAgICAgICB9CisgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgTEVGVF9SRUFSX0NIQU5ORUwsIHNNaXhMdmwsIDApOworICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgc01peEx2bCwgMCk7CisgICAgICB9IGJyZWFrOworICAgICAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKyAgICAgICAqIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgICAgIGNhc2UgQ0hfTU9ERV8zXzBfMF8wOiAvKiBjaENmZyAzICovCisgICAgICB7CisgICAgICAgIEZJWFBfRE1YIGNNaXhMdmw7CisgICAgICAgIGlmIChkbXhNZXRob2QgPT0gRE1YX01FVEhPRF9BUklCX0pBUEFOKSB7CisgICAgICAgICAgLyogTCcgPSAwLjcwNypMICsgMC41KkM7ICBSJyA9IDAuNzA3KlIgKyAwLjUqQzsgKi8KKyAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVGVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwKTsKKyAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDApOworICAgICAgICAgIGNNaXhMdmwgPSBGTDJGWENPTlNUX0RNWCgwLjVmKTsKKyAgICAgICAgfSBlbHNlIHsgLyogTCcgPSBMICsgMC43MDcqQzsgIFInID0gUiArIDAuNzA3KkM7ICovCisgICAgICAgICAgY01peEx2bCA9IEZMMkZYQ09OU1RfRE1YKDAuNzA3Zik7CisgICAgICAgIH0KKyAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgY01peEx2bCwgMCk7CisgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjTWl4THZsLCAwKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorICAgICAgICogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworICAgICAgY2FzZSBDSF9NT0RFXzNfMF8xXzA6IC8qIGNoQ2ZnIDQgKi8KKyAgICAgIHsKKyAgICAgICAgRklYUF9ETVggY3NNaXhMdmw7CisgICAgICAgIGlmIChkbXhNZXRob2QgPT0gRE1YX01FVEhPRF9BUklCX0pBUEFOKSB7CisgICAgICAgICAgLyogTCcgPSAwLjcwNypMICsgMC41KkMgKyAwLjUqUzsgIFInID0gMC43MDcqUiArIDAuNSpDICsgMC41KlM7ICovCisgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCk7CisgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwKTsKKyAgICAgICAgICBjc01peEx2bCA9IEZMMkZYQ09OU1RfRE1YKDAuNWYpOworICAgICAgICB9IGVsc2UgeyAvKiBMJyA9IEwgKyAwLjcwNypDICsgMC43MDcqUzsKKyAgICAgICAgICAgICAgICAgICAgUicgPSBSICsgMC43MDcqQyArIDAuNzA3KlM7ICovCisgICAgICAgICAgY3NNaXhMdmwgPSBGTDJGWENPTlNUX0RNWCgwLjcwN2YpOworICAgICAgICB9CisgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGNzTWl4THZsLCAwKTsKKyAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgY3NNaXhMdmwsIDApOworICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgY3NNaXhMdmwsIDApOworICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgY3NNaXhMdmwsIDApOworICAgICAgfSBicmVhazsKKyAgICAgIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisgICAgICAgKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgICAgICBjYXNlIENIX01PREVfM18wXzJfMDogLyogY2hDZmcgNSAqLworICAgICAgY2FzZSBDSF9NT0RFXzNfMF8yXzE6IC8qIGNoQ2ZnIDYgKi8KKyAgICAgIHsKKyAgICAgICAgc3dpdGNoIChkbXhNZXRob2QpIHsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNhc2UgRE1YX01FVEhPRF9NUEVHX0FNRDQ6IHsKKyAgICAgICAgICAgIEZJWFBfRE1YIGNNaXhMdmwsIHNNaXhMdmwsIGxNaXhMdmw7CisgICAgICAgICAgICBJTlQgY01peFNjYWxlLCBzTWl4U2NhbGUsIGxNaXhTY2FsZTsKKworICAgICAgICAgICAgLyogR2V0IGZhY3RvcnMgZnJvbSBtZXRhIGRhdGEgKi8KKyAgICAgICAgICAgIGNNaXhMdmwgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+Y0xldklkeF07CisgICAgICAgICAgICBjTWl4U2NhbGUgPSAocE1ldGFEYXRhLT5jTGV2SWR4ID09IDApID8gMSA6IDA7CisgICAgICAgICAgICBzTWl4THZsID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPnNMZXZJZHhdOworICAgICAgICAgICAgc01peFNjYWxlID0gKHBNZXRhRGF0YS0+c0xldklkeCA9PSAwKSA/IDEgOiAwOworICAgICAgICAgICAgbE1peEx2bCA9IGxmZU1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+ZG1peElkeExmZV07CisgICAgICAgICAgICBpZiAocE1ldGFEYXRhLT5kbWl4SWR4TGZlIDw9IDEpIHsKKyAgICAgICAgICAgICAgbE1peFNjYWxlID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocE1ldGFEYXRhLT5kbWl4SWR4TGZlIDw9IDUpIHsKKyAgICAgICAgICAgICAgbE1peFNjYWxlID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGxNaXhTY2FsZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBTZXR1cCB0aGUgRE1YIG1hdHJpeCAqLworICAgICAgICAgICAgaWYgKChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBGT1JDRV9QU19ETVgpIHx8CisgICAgICAgICAgICAgICAgKChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBBVVRPX1BTX0RNWCkgJiYKKyAgICAgICAgICAgICAgICAgKHBNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQgPT0KKyAgICAgICAgICAgICAgICAgIDEpKSkgeyAvKiBMJyA9IEwgKyBDKmNsZXYgLSAoTHMrUnMpKnNsZXYgKyBMRkUqbGZsZXY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSBSICsgQypjbGV2ICsgKExzK1JzKSpzbGV2ICsgTEZFKmxmbGV2OyAqLworICAgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjTWl4THZsLCBjTWl4U2NhbGUpOworICAgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfUkVBUl9DSEFOTkVMLCAtc01peEx2bCwgc01peFNjYWxlKTsKKyAgICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9SRUFSX0NIQU5ORUwsIC1zTWl4THZsLCBzTWl4U2NhbGUpOworICAgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlKTsKKyAgICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGNNaXhMdmwsIGNNaXhTY2FsZSk7CisgICAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfUkVBUl9DSEFOTkVMLCBzTWl4THZsLCBzTWl4U2NhbGUpOworICAgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9SRUFSX0NIQU5ORUwsIHNNaXhMdmwsIHNNaXhTY2FsZSk7CisgICAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8qIEwnID0gTCArIEMqY2xldiArIExzKnNsZXYgKyBMRkUqbGxldjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFInID0gUiArIEMqY2xldiArIFJzKnNsZXYgKyBMRkUqbGxldjsgKi8KKyAgICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgY01peEx2bCwgY01peFNjYWxlKTsKKyAgICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgc01peEx2bCwgc01peFNjYWxlKTsKKyAgICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGxNaXhMdmwsIGxNaXhTY2FsZSk7CisgICAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjTWl4THZsLCBjTWl4U2NhbGUpOworICAgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9SRUFSX0NIQU5ORUwsIHNNaXhMdmwsIHNNaXhTY2FsZSk7CisgICAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQWRkIGFkZGl0aW9uYWwgRE1YIGdhaW4gKi8KKyAgICAgICAgICAgIGlmIChwTWV0YURhdGEtPmRteEdhaW5JZHgyICE9IDApIHsgLyogQXBwbHkgRE1YIGdhaW4gMiAqLworICAgICAgICAgICAgICBGSVhQX0RNWCBkbXhHYWluOworICAgICAgICAgICAgICBJTlQgZG14U2NhbGU7CisgICAgICAgICAgICAgIElOVCBzaWduID0gKHBNZXRhRGF0YS0+ZG14R2FpbklkeDIgJiAweDQwKSA/IC0xIDogMTsKKyAgICAgICAgICAgICAgSU5UIHZhbCA9IHBNZXRhRGF0YS0+ZG14R2FpbklkeDIgJiAweDNGOworCisgICAgICAgICAgICAgIC8qIDEwXihkbXhfZ2Fpbl8yLzgwKSAqLworICAgICAgICAgICAgICBkbXhHYWluID0gRlhfREJMMkZYX0RNWCgKKyAgICAgICAgICAgICAgICAgIGZMZFBvdyhGTDJGWENPTlNUX0RCTCgwLjgzMDQ4MjAyMzcyMTg0MWYpLCAyLCAvKiBsb2cyKDEwKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoc2lnbiAqIHZhbCAqIChMT05HKUZMMkZYQ09OU1RfREJMKDAuMDEyNWYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmZG14U2NhbGUpKTsKKyAgICAgICAgICAgICAgLyogQ3VycmVudGx5IG9ubHkgcG9zaXRpdmUgc2NhbGUgZmFjdG9ycyBzdXBwb3J0ZWQhICovCisgICAgICAgICAgICAgIGlmIChkbXhTY2FsZSA8IDApIHsKKyAgICAgICAgICAgICAgICBkbXhHYWluID4+PSAtZG14U2NhbGU7CisgICAgICAgICAgICAgICAgZG14U2NhbGUgPSAwOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX0ZST05UX0NIQU5ORUwsIGRteEdhaW4sIGRteFNjYWxlKTsKKyAgICAgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgZG14R2FpbiwgZG14U2NhbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgY2FzZSBETVhfTUVUSE9EX0FSSUJfSkFQQU46CisgICAgICAgICAgY2FzZSBETVhfTUVUSE9EX01QRUdfTEVHQUNZOiB7CisgICAgICAgICAgICBGSVhQX0RNWCBmbGV2LCBjbGV2LCBzbGV2TEwsIHNsZXZMUiwgc2xldlJMLCBzbGV2UlI7CisgICAgICAgICAgICBGSVhQX0RNWCBtdHJ4TWl4RHduQ29lZiA9CisgICAgICAgICAgICAgICAgbXBlZ01peERvd25JZHgyQ29lZltwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdOworCisgICAgICAgICAgICBpZiAoKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEZPUkNFX1BTX0RNWCkgfHwKKyAgICAgICAgICAgICAgICAoKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEFVVE9fUFNfRE1YKSAmJgorICAgICAgICAgICAgICAgICAocE1ldGFEYXRhLT5wc2V1ZG9TdXJyb3VuZCA9PSAxKSkpIHsKKyAgICAgICAgICAgICAgaWYgKGRteE1ldGhvZCA9PSBETVhfTUVUSE9EX0FSSUJfSkFQQU4pIHsKKyAgICAgICAgICAgICAgICAvKiAzLzIgaW5wdXQ6IEwnID0gMC43MDcgKiBbTCswLjcwNypDLWsqTHMtaypSc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IDAuNzA3ICogW1IrMC43MDcqQytrKkxzK2sqUnNdOyAqLworICAgICAgICAgICAgICAgIGZsZXYgPSBtcGVnTWl4RG93bklkeDJDb2VmWzBdOyAvKiBhID0gMC43MDcgKi8KKyAgICAgICAgICAgICAgfSBlbHNlIHsgLyogMy8yIGlucHV0OiBMJyA9ICgxLjcwNysyKkEpXi0xICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0wrMC43MDcqQy1BKkxzLUEqUnNdOyBSJyA9ICgxLjcwNysyKkEpXi0xICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1IrMC43MDcqQytBKkxzK0EqUnNdOyAqLworICAgICAgICAgICAgICAgIGZsZXYgPSBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzFdW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc2xldlJSID0gc2xldlJMID0gRlhfREJMMkZYX0RNWChmTXVsdChmbGV2LCBtdHJ4TWl4RHduQ29lZikpOworICAgICAgICAgICAgICBzbGV2TEwgPSBzbGV2TFIgPSAtc2xldlJMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKGRteE1ldGhvZCA9PSBETVhfTUVUSE9EX0FSSUJfSkFQQU4pIHsKKyAgICAgICAgICAgICAgICAvKiAzLzIgaW5wdXQ6IEwnID0gMC43MDcgKiBbTCswLjcwNypDK2sqTHNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjcwNyAqIFtSKzAuNzA3KkMraypSc107ICovCisgICAgICAgICAgICAgICAgZmxldiA9IG1wZWdNaXhEb3duSWR4MkNvZWZbMF07IC8qIGEgPSAwLjcwNyAqLworICAgICAgICAgICAgICB9IGVsc2UgeyAvKiAzLzIgaW5wdXQ6IEwnID0gKDEuNzA3K0EpXi0xICogW0wrMC43MDcqQytBKkxzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9ICgxLjcwNytBKV4tMSAqIFtSKzAuNzA3KkMrQSpSc107ICovCisgICAgICAgICAgICAgICAgZmxldiA9IG1wZWdNaXhEb3duSWR4MlByZUZhY3RbMF1bcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzbGV2UlIgPSBzbGV2TEwgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KGZsZXYsIG10cnhNaXhEd25Db2VmKSk7CisgICAgICAgICAgICAgIHNsZXZMUiA9IHNsZXZSTCA9IChGSVhQX0RNWCkwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY29tbW9uIGZhY3RvciAqLworICAgICAgICAgICAgY2xldiA9CisgICAgICAgICAgICAgICAgRlhfREJMMkZYX0RNWChmTXVsdChmbGV2LCBtcGVnTWl4RG93bklkeDJDb2VmWzBdIC8qIDAuNzA3ICovKSk7CisKKyAgICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgZmxldiwgMCk7CisgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgY2xldiwgMCk7CisgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgc2xldkxMLCAwKTsKKyAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgc2xldkxSLCAwKTsKKworICAgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX0ZST05UX0NIQU5ORUwsIGZsZXYsIDApOworICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjbGV2LCAwKTsKKyAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgc2xldlJMLCAwKTsKKyAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9SRUFSX0NIQU5ORUwsIHNsZXZSUiwgMCk7CisgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgfSAvKiBzd2l0Y2ggKGRteE1ldGhvZCkgKi8KKyAgICAgIH0gYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZml0IHRvIGFueSBrbm93biBkb3dubWl4IGVxdWF0aW9uISAqLworICAgICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOworICAgICAgICBicmVhazsKKyAgICB9IC8qIHN3aXRjaCAoaW5DaE1vZGUpICovCisKKyAgICAvKiBNYXJrIHRoZSBvdXRwdXQgY2hhbm5lbHMgKi8KKyAgICBGREttZW1jbGVhcih2YWxpZCwgKDgpICogc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICAgIHZhbGlkW0xFRlRfRlJPTlRfQ0hBTk5FTF0gPSAxOworICAgIHZhbGlkW1JJR0hUX0ZST05UX0NIQU5ORUxdID0gMTsKKyAgfQorCisgIGlmIChudW1PdXRDaGFubmVsID09IE9ORV9DSEFOTkVMKSB7CisgICAgRklYUF9ETVggbW9ub01peExldmVsOworICAgIElOVCBtb25vTWl4U2NhbGUgPSAwOworCisgICAgZG14Q2xlYXJDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywKKyAgICAgICAgICAgICAgICAgICAgQ0VOVEVSX0ZST05UX0NIQU5ORUwpOyAvKiBDIGlzIG5vdCBpbiB0aGUgbWl4ICovCisKKyAgICBpZiAoZG14TWV0aG9kID09CisgICAgICAgIERNWF9NRVRIT0RfTVBFR19MRUdBQ1kpIHsgLyogQycgPSAoMysyKkEpXi0xICogW0MrTCtSK0EqTHMrQStSc107ICovCisgICAgICBtb25vTWl4TGV2ZWwgPSBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzJdW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07CisKKyAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IG1vbm9NaXhMZXZlbDsKKyAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW0xFRlRfRlJPTlRfQ0hBTk5FTF0gPSBtb25vTWl4TGV2ZWw7CisgICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtSSUdIVF9GUk9OVF9DSEFOTkVMXSA9IG1vbm9NaXhMZXZlbDsKKyAgICAgIG1vbm9NaXhMZXZlbCA9IEZYX0RCTDJGWF9ETVgoZk11bHQoCisgICAgICAgICAgbW9ub01peExldmVsLCBtcGVnTWl4RG93bklkeDJDb2VmW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF0pKTsKKyAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW0xFRlRfUkVBUl9DSEFOTkVMXSA9IG1vbm9NaXhMZXZlbDsKKyAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW1JJR0hUX1JFQVJfQ0hBTk5FTF0gPSBtb25vTWl4TGV2ZWw7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoZG14TWV0aG9kKSB7CisgICAgICAgIGNhc2UgRE1YX01FVEhPRF9NUEVHX0FNRDQ6CisgICAgICAgICAgLyogQycgPSBMICsgUjsgKi8KKyAgICAgICAgICBtb25vTWl4TGV2ZWwgPSBGTDJGWENPTlNUX0RNWCgwLjVmKTsKKyAgICAgICAgICBtb25vTWl4U2NhbGUgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIC8qIEMnID0gMC41KkwgKyAwLjUqUjsgKi8KKyAgICAgICAgICBtb25vTWl4TGV2ZWwgPSBGTDJGWENPTlNUX0RNWCgwLjVmKTsKKyAgICAgICAgICBtb25vTWl4U2NhbGUgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICBMRUZUX0ZST05UX0NIQU5ORUwsIG1vbm9NaXhMZXZlbCwgbW9ub01peFNjYWxlKTsKKyAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgbW9ub01peExldmVsLCBtb25vTWl4U2NhbGUpOworICAgIH0KKworICAgIC8qIE1hcmsgdGhlIG91dHB1dCBjaGFubmVsICovCisgICAgRkRLbWVtY2xlYXIodmFsaWQsICg4KSAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKyAgICB2YWxpZFtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSAxOworICB9CisKKyNkZWZpbmUgTUFYX1NFQVJDSF9TVEFSVF9WQUwgKC03KQorCisgIHsKKyAgICBMT05HIGNoU3VtWyg4KV07CisgICAgSU5UIGNoU3VtTWF4ID0gTUFYX1NFQVJDSF9TVEFSVF9WQUw7CisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgbWF4aW11bSBzY2FsZSBmYWN0b3IgKi8KKyAgICBmb3IgKG91dENoID0gMDsgb3V0Q2ggPCAoOCk7IG91dENoICs9IDEpIHsKKyAgICAgIGlmICh2YWxpZFtvdXRDaF0gIT0gMCkgeworICAgICAgICB1bnNpZ25lZCBpbnQgaW5DaDsKKyAgICAgICAgZm9yIChpbkNoID0gMDsgaW5DaCA8ICg4KTsgaW5DaCArPSAxKSB7CisgICAgICAgICAgaWYgKG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPiBtYXhTY2FsZSkgeyAvKiBTdG9yZSB0aGUgbmV3IG1heGltdW0gKi8KKyAgICAgICAgICAgIG1heFNjYWxlID0gbWl4U2NhbGVzW291dENoXVtpbkNoXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbmRpdmlkdWFseSBhbmFseXNlIG91dHB1dCBjaGFuYWwgbGV2ZWxzICovCisgICAgZm9yIChvdXRDaCA9IDA7IG91dENoIDwgKDgpOyBvdXRDaCArPSAxKSB7CisgICAgICBjaFN1bVtvdXRDaF0gPSBNQVhfU0VBUkNIX1NUQVJUX1ZBTDsKKyAgICAgIGlmICh2YWxpZFtvdXRDaF0gIT0gMCkgeworICAgICAgICBpbnQgb3ZyZmx3UHJvdFNjYWxlID0gMDsKKyAgICAgICAgdW5zaWduZWQgaW50IGluQ2g7CisKKyAgICAgICAgLyogQWNjdW11bGF0ZSBhbGwgZmFjdG9ycyBmb3IgZWFjaCBvdXRwdXQgY2hhbm5lbCAqLworICAgICAgICBjaFN1bVtvdXRDaF0gPSAwOworICAgICAgICBmb3IgKGluQ2ggPSAwOyBpbkNoIDwgKDgpOyBpbkNoICs9IDEpIHsKKyAgICAgICAgICBTSE9SVCBhZGRGYWN0ID0gRlhfRE1YMlNIUlQobWl4RmFjdG9yc1tvdXRDaF1baW5DaF0pOworICAgICAgICAgIGlmIChtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIDw9IG1heFNjYWxlKSB7CisgICAgICAgICAgICBhZGRGYWN0ID4+PSBtYXhTY2FsZSAtIG1peFNjYWxlc1tvdXRDaF1baW5DaF07CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZEZhY3QgPDw9IG1peFNjYWxlc1tvdXRDaF1baW5DaF0gLSBtYXhTY2FsZTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2hTdW1bb3V0Q2hdICs9IGFkZEZhY3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoU3VtW291dENoXSA+IChMT05HKU1BWFZBTF9TR0wpIHsKKyAgICAgICAgICB3aGlsZSAoY2hTdW1bb3V0Q2hdID4gKExPTkcpTUFYVkFMX1NHTCkgeworICAgICAgICAgICAgb3ZyZmx3UHJvdFNjYWxlICs9IDE7CisgICAgICAgICAgICBjaFN1bVtvdXRDaF0gPj49IDE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoU3VtW291dENoXSA+IDApIHsKKyAgICAgICAgICB3aGlsZSAoKGNoU3VtW291dENoXSA8PCAxKSA8PSAoTE9ORylNQVhWQUxfU0dMKSB7CisgICAgICAgICAgICBvdnJmbHdQcm90U2NhbGUgLT0gMTsKKyAgICAgICAgICAgIGNoU3VtW291dENoXSA8PD0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogU3RvcmUgdGhlIGRpZmZlcmVudGlhbCBzY2FsaW5nIGluIHRoZSBzYW1lIGFycmF5ICovCisgICAgICAgIGNoU3VtW291dENoXSA9IG92cmZsd1Byb3RTY2FsZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKG91dENoID0gMDsgb3V0Q2ggPCAoOCk7IG91dENoICs9IDEpIHsKKyAgICAgIGlmICgodmFsaWRbb3V0Q2hdICE9IDApICYmCisgICAgICAgICAgKGNoU3VtW291dENoXSA+IGNoU3VtTWF4KSkgeyAvKiBTdG9yZSB0aGUgbmV3IG1heGltdW0gKi8KKyAgICAgICAgY2hTdW1NYXggPSBjaFN1bVtvdXRDaF07CisgICAgICB9CisgICAgfQorICAgIG1heFNjYWxlID0gZk1heChtYXhTY2FsZSArIGNoU3VtTWF4LCAwKTsKKworICAgIC8qIE5vcm1hbGl6ZSBhbGwgZmFjdG9ycyAqLworICAgIGZvciAob3V0Q2ggPSAwOyBvdXRDaCA8ICg4KTsgb3V0Q2ggKz0gMSkgeworICAgICAgaWYgKHZhbGlkW291dENoXSAhPSAwKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBpbkNoOworICAgICAgICBmb3IgKGluQ2ggPSAwOyBpbkNoIDwgKDgpOyBpbkNoICs9IDEpIHsKKyAgICAgICAgICBpZiAobWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gIT0gKEZJWFBfRE1YKTApIHsKKyAgICAgICAgICAgIGlmIChtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIDw9IG1heFNjYWxlKSB7CisgICAgICAgICAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID4+PSBtYXhTY2FsZSAtIG1peFNjYWxlc1tvdXRDaF1baW5DaF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA8PD0gbWl4U2NhbGVzW291dENoXVtpbkNoXSAtIG1heFNjYWxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWl4U2NhbGVzW291dENoXVtpbkNoXSA9IG1heFNjYWxlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIHJldHVybiB0aGUgc2NhbGUgZmFjdG9yICovCisgICpwT3V0U2NhbGUgPSBtYXhTY2FsZTsKKworICByZXR1cm4gKGVycik7Cit9CisKKy8qKiBPcGVuIGFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUKKyAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyB0aGUgaGFuZGxlIG9mIHRoZSBuZXcgaW5zdGFuY2UuCisgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X09wZW4oSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZikgeworICBIQU5ETEVfUENNX0RPV05NSVggc2VsZjsKKworICBpZiAocFNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgfQorCisgICpwU2VsZiA9IE5VTEw7CisKKyAgc2VsZiA9IChIQU5ETEVfUENNX0RPV05NSVgpR2V0UGNtRG14SW5zdGFuY2UoMCk7CisgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICByZXR1cm4gKFBDTURNWF9PVVRfT0ZfTUVNT1JZKTsKKyAgfQorCisgIC8qIFJlc2V0IHRoZSBmdWxsIGluc3RhbmNlICovCisgIHBjbURteF9SZXNldChzZWxmLCBQQ01ETVhfUkVTRVRfRlVMTCk7CisKKyAgKnBTZWxmID0gc2VsZjsKKworICByZXR1cm4gKFBDTURNWF9PSyk7Cit9CisKKy8qKiBSZXNldCBhbGwgc3RhdGljIHZhbHVlcyBsaWtlIGUuZy4gbWl4ZG93biBjb2VmZmljaWVudHMuCisgKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgorICogQHBhcmFtIFtpbl0gRmxhZ3MgdGVsbGluZyB3aGljaCBwYXJ0cyBvZiB0aGUgbW9kdWxlIHNoYWxsIGJlIHJlc2V0LgorICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9SZXNldChIQU5ETEVfUENNX0RPV05NSVggc2VsZiwgVUlOVCBmbGFncykgeworICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICB9CisKKyAgaWYgKGZsYWdzICYgUENNRE1YX1JFU0VUX1BBUkFNUykgeworICAgIFBDTV9ETVhfVVNFUl9QQVJBTVMgKnBQYXJhbXMgPSAmc2VsZi0+dXNlclBhcmFtczsKKworICAgIHBQYXJhbXMtPmR1YWxDaGFubmVsTW9kZSA9IFNURVJFT19NT0RFOworICAgIHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID0gTkVWRVJfRE9fUFNfRE1YOworICAgIHBQYXJhbXMtPm51bU91dENoYW5uZWxzTWF4ID0gKDYpOworICAgIHBQYXJhbXMtPm51bU91dENoYW5uZWxzTWluID0gKDApOworICAgIHBQYXJhbXMtPmZyYW1lRGVsYXkgPSAwOworICAgIHBQYXJhbXMtPmV4cGlyeUZyYW1lID0gKDApOworCisgICAgc2VsZi0+YXBwbHlQcm9jZXNzaW5nID0gMDsKKyAgfQorCisgIGlmIChmbGFncyAmIFBDTURNWF9SRVNFVF9CU19EQVRBKSB7CisgICAgaW50IHNsb3Q7CisgICAgLyogSW5pdCBhbGwgc2xvdHMgd2l0aCBhIGRlZmF1bHQgc2V0ICovCisgICAgZm9yIChzbG90ID0gMDsgc2xvdCA8PSAoMSk7IHNsb3QgKz0gMSkgeworICAgICAgRkRLbWVtY3B5KCZzZWxmLT5ic01ldGFEYXRhW3Nsb3RdLCAmZGZsdE1ldGFEYXRhLAorICAgICAgICAgICAgICAgIHNpemVvZihETVhfQlNfTUVUQV9EQVRBKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChQQ01ETVhfT0spOworfQorCisvKiogU2V0IG9uZSBwYXJhbWV0ZXIgZm9yIG9uZSBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgorICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB0byBiZSBzZXQuCisgKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdmFsdWUuCisgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X1NldFBhcmFtKEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmLCBjb25zdCBQQ01ETVhfUEFSQU0gcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB2YWx1ZSkgeworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBETVhfUFJPRklMRV9TRVRUSU5HOgorICAgICAgc3dpdGNoICgoRE1YX1BST0ZJTEVfVFlQRSl2YWx1ZSkgeworICAgICAgICBjYXNlIERNWF9QUkZMX1NUQU5EQVJEOgorICAgICAgICBjYXNlIERNWF9QUkZMX01BVFJJWF9NSVg6CisgICAgICAgIGNhc2UgRE1YX1BSRkxfRk9SQ0VfTUFUUklYX01JWDoKKyAgICAgICAgY2FzZSBETVhfUFJGTF9BUklCX0pBUEFOOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICAgICAgc2VsZi0+dXNlclBhcmFtcy5kbXhQcm9maWxlID0gKERNWF9QUk9GSUxFX1RZUEUpdmFsdWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FOgorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICAgICAgc2VsZi0+dXNlclBhcmFtcy5leHBpcnlGcmFtZSA9ICh2YWx1ZSA+IDApID8gKFVJTlQpdmFsdWUgOiAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERNWF9CU19EQVRBX0RFTEFZOgorICAgICAgaWYgKCh2YWx1ZSA+ICgxKSkgfHwgKHZhbHVlIDwgMCkpIHsKKyAgICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7CisgICAgICB9CisgICAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnVzZXJQYXJhbXMuZnJhbWVEZWxheSA9IChVQ0hBUil2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKKyAgICAgIHN3aXRjaCAodmFsdWUpIHsgLyogc3VwcG9ydGVkIG91dHB1dCBjaGFubmVscyAqLworICAgICAgICBjYXNlIC0xOgorICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgT05FX0NIQU5ORUw6CisgICAgICAgIGNhc2UgVFdPX0NIQU5ORUw6CisgICAgICAgIGNhc2UgU0lYX0NIQU5ORUw6CisgICAgICAgIGNhc2UgRUlHSFRfQ0hBTk5FTDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgICAgIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8KKyAgICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW4gPSAodmFsdWUgPiAwKSA/IChTSE9SVCl2YWx1ZSA6IC0xOworICAgICAgaWYgKCh2YWx1ZSA+IDApICYmIChzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4ID4gMCkgJiYKKyAgICAgICAgICAodmFsdWUgPiBzZWxmLT51c2VyUGFyYW1zCisgICAgICAgICAgICAgICAgICAgICAgIC5udW1PdXRDaGFubmVsc01heCkpIHsgLyogTUlOID4gTUFYIHdvdWxkIGJlIGFuIGludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS4gVGh1cyBzZXQgTUFYID0gTUlOIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBjYXNlLiAqLworICAgICAgICBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4ID0gc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01pbjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKKyAgICAgIHN3aXRjaCAodmFsdWUpIHsgLyogc3VwcG9ydGVkIG91dHB1dCBjaGFubmVscyAqLworICAgICAgICBjYXNlIC0xOgorICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgT05FX0NIQU5ORUw6CisgICAgICAgIGNhc2UgVFdPX0NIQU5ORUw6CisgICAgICAgIGNhc2UgU0lYX0NIQU5ORUw6CisgICAgICAgIGNhc2UgRUlHSFRfQ0hBTk5FTDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgICAgIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8KKyAgICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXggPSAodmFsdWUgPiAwKSA/IChTSE9SVCl2YWx1ZSA6IC0xOworICAgICAgaWYgKCh2YWx1ZSA+IDApICYmCisgICAgICAgICAgKHZhbHVlIDwgc2VsZi0+dXNlclBhcmFtcworICAgICAgICAgICAgICAgICAgICAgICAubnVtT3V0Q2hhbm5lbHNNaW4pKSB7IC8qIE1BWCA8IE1JTiB3b3VsZCBiZSBhbiBpbnZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuIFRodXMgc2V0IE1JTiA9IE1BWCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgY2FzZS4gKi8KKyAgICAgICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01pbiA9IHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXg7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFOgorICAgICAgc3dpdGNoICgoRFVBTF9DSEFOTkVMX01PREUpdmFsdWUpIHsKKyAgICAgICAgY2FzZSBTVEVSRU9fTU9ERToKKyAgICAgICAgY2FzZSBDSDFfTU9ERToKKyAgICAgICAgY2FzZSBDSDJfTU9ERToKKyAgICAgICAgY2FzZSBNSVhFRF9NT0RFOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICAgICAgc2VsZi0+dXNlclBhcmFtcy5kdWFsQ2hhbm5lbE1vZGUgPSAoRFVBTF9DSEFOTkVMX01PREUpdmFsdWU7CisgICAgICBzZWxmLT5hcHBseVByb2Nlc3NpbmcgPSAoKERVQUxfQ0hBTk5FTF9NT0RFKXZhbHVlICE9IFNURVJFT19NT0RFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsgLyogRm9yY2UgcHJvY2Vzc2luZyBpZiBuZWNlc3NhcnkuICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgRE1YX1BTRVVET19TVVJST1VORF9NT0RFOgorICAgICAgc3dpdGNoICgoUFNFVURPX1NVUlJPVU5EX01PREUpdmFsdWUpIHsKKyAgICAgICAgY2FzZSBORVZFUl9ET19QU19ETVg6CisgICAgICAgIGNhc2UgQVVUT19QU19ETVg6CisgICAgICAgIGNhc2UgRk9SQ0VfUFNfRE1YOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICAgICAgc2VsZi0+dXNlclBhcmFtcy5wc2V1ZG9TdXJyTW9kZSA9IChQU0VVRE9fU1VSUk9VTkRfTU9ERSl2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoUENNRE1YX1VOS05PV05fUEFSQU0pOworICB9CisKKyAgcmV0dXJuIChQQ01ETVhfT0spOworfQorCisvKiogR2V0IG9uZSBwYXJhbWV0ZXIgdmFsdWUgb2Ygb25lIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCisgKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdG8gYmUgc2V0LgorICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYnVmZmVyIHJlY2VpdmluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLgorICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9HZXRQYXJhbShIQU5ETEVfUENNX0RPV05NSVggc2VsZiwgY29uc3QgUENNRE1YX1BBUkFNIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmNvbnN0IHBWYWx1ZSkgeworICBQQ01fRE1YX1VTRVJfUEFSQU1TICpwVXNyUGFyYW1zOworCisgIGlmICgoc2VsZiA9PSBOVUxMKSB8fCAocFZhbHVlID09IE5VTEwpKSB7CisgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICB9CisgIHBVc3JQYXJhbXMgPSAmc2VsZi0+dXNlclBhcmFtczsKKworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBETVhfUFJPRklMRV9TRVRUSU5HOgorICAgICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZG14UHJvZmlsZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FOgorICAgICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZXhwaXJ5RnJhbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIERNWF9CU19EQVRBX0RFTEFZOgorICAgICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZnJhbWVEZWxheTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6CisgICAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5udW1PdXRDaGFubmVsc01pbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6CisgICAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5udW1PdXRDaGFubmVsc01heDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFOgorICAgICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZHVhbENoYW5uZWxNb2RlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBETVhfUFNFVURPX1NVUlJPVU5EX01PREU6CisgICAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKFBDTURNWF9VTktOT1dOX1BBUkFNKTsKKyAgfQorCisgIHJldHVybiAoUENNRE1YX09LKTsKK30KKworLyoKKyAqIFJlYWQgRE1YIG1ldGEtZGF0YSBmcm9tIGEgZGF0YSBzdHJlYW0gZWxlbWVudC4KKyAqLworUENNRE1YX0VSUk9SIHBjbURteF9QYXJzZShIQU5ETEVfUENNX0RPV05NSVggc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFuY0RhdGFCaXRzLCBpbnQgaXNNcGVnMikgeworICBQQ01ETVhfRVJST1IgZXJyb3JTdGF0dXMgPSBQQ01ETVhfT0s7CisKKyNkZWZpbmUgTUFYX0RTRV9BTkNfQllURVMgKDE2KSAgICAvKiAxNSBieXRlcyAqLworI2RlZmluZSBBTkNfREFUQV9TWU5DX0JZVEUgKDB4QkMpIC8qIGFuY2lsbGFyeSBkYXRhIHN5bmMgYnl0ZS4gKi8KKworICBETVhfQlNfTUVUQV9EQVRBICpwQnNNZXRhRGF0YTsKKworICBpbnQgc2tpcDREbXggPSAwLCBza2lwNEV4dCA9IDA7CisgIGludCBkbXhMdmxBdmFpbCA9IDAsIGV4dERhdGFBdmFpbCA9IDA7CisgIFVJTlQgZm91bmROZXdEYXRhID0gMDsKKyAgVUlOVCBtaW5BbmNCaXRzID0gKChpc01wZWcyKSA/IDUgOiAzKSAqIDg7CisKKyAgaWYgKChzZWxmID09IE5VTEwpIHx8IChoQnMgPT0gTlVMTCkpIHsKKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CisgIH0KKworICAvKiBzYW5pdHkgY2hlY2tzICovCisgIGlmICgoYW5jRGF0YUJpdHMgPCBtaW5BbmNCaXRzKSB8fCAoYW5jRGF0YUJpdHMgPiBGREtnZXRWYWxpZEJpdHMoaEJzKSkpIHsKKyAgICByZXR1cm4gKFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBKTsKKyAgfQorCisgIHBCc01ldGFEYXRhID0gJnNlbGYtPmJzTWV0YURhdGFbMF07CisKKyAgaWYgKGlzTXBlZzIpIHsKKyAgICAvKiBza2lwIERWRCBhbmNpbGxhcnkgZGF0YSAqLworICAgIEZES3B1c2hGb3IoaEJzLCAxNik7CisgIH0KKworICAvKiBjaGVjayBzeW5jIHdvcmQgKi8KKyAgaWYgKEZES3JlYWRCaXRzKGhCcywgOCkgIT0gQU5DX0RBVEFfU1lOQ19CWVRFKSB7CisgICAgcmV0dXJuIChQQ01ETVhfQ09SUlVQVF9BTkNfREFUQSk7CisgIH0KKworICAvKiBza2lwIE1QRUcgYXVkaW8gdHlwZSBhbmQgRG9sYnkgc3Vycm91bmQgbW9kZSAqLworICBGREtwdXNoRm9yKGhCcywgNCk7CisKKyAgaWYgKGlzTXBlZzIpIHsKKyAgICAvKiBpbnQgbnVtQW5jQnl0ZXMgPSAqLyBGREtyZWFkQml0cyhoQnMsIDQpOworICAgIC8qIGFkdmFuY2VkIGR5bmFtaWMgcmFuZ2UgY29udHJvbCAqLworICAgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RG14ICs9IDI0OworICAgIC8qIGRpYWxvZyBub3JtYWxpemF0aW9uICovCisgICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDREbXggKz0gODsKKyAgICAvKiByZXByb2R1Y3Rpb25fbGV2ZWwgKi8KKyAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNERteCArPSA4OworICB9IGVsc2UgeworICAgIEZES3B1c2hGb3IoaEJzLCAyKTsgLyogZHJjIHByZXNlbnRhdGlvbiBtb2RlICovCisgICAgcEJzTWV0YURhdGEtPnBzZXVkb1N1cnJvdW5kID0gKFNDSEFSKUZES3JlYWRCaXQoaEJzKTsKKyAgICBGREtwdXNoRm9yKGhCcywgNCk7IC8qIHJlc2VydmVkIGJpdHMgKi8KKyAgfQorCisgIC8qIGRvd25taXhpbmcgbGV2ZWxzIE1QRUd4IHN0YXR1cyAqLworICBkbXhMdmxBdmFpbCA9IEZES3JlYWRCaXQoaEJzKTsKKworICBpZiAoaXNNcGVnMikgeworICAgIC8qIHNjYWxlIGZhY3RvciBDUkMgc3RhdHVzICovCisgICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDRFeHQgKz0gMTY7CisgIH0gZWxzZSB7CisgICAgLyogYW5jaWxsYXJ5IGRhdGEgZXh0ZW5zaW9uIHN0YXR1cyAqLworICAgIGV4dERhdGFBdmFpbCA9IEZES3JlYWRCaXQoaEJzKTsKKyAgfQorCisgIC8qIGF1ZGlvIGNvZGluZyBhbmQgY29tcHJlc3Npb24gc3RhdHVzICovCisgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OworICAvKiBjb2Fyc2UgZ3JhaW4gdGltZWNvZGUgc3RhdHVzICovCisgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OworICAvKiBmaW5lIGdyYWluIHRpbWVjb2RlIHN0YXR1cyAqLworICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNEV4dCArPSAxNjsKKworICAvKiBza2lwIHRoZSB1c2VsZXNzIGRhdGEgdG8gZ2V0IHRvIHRoZSBETVggbGV2ZWxzICovCisgIEZES3B1c2hGb3IoaEJzLCBza2lwNERteCk7CisKKyAgLyogZG93bm1peF9sZXZlbHNfTVBFR1ggKi8KKyAgaWYgKGRteEx2bEF2YWlsKSB7CisgICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgeyAvKiBjZW50ZXJfbWl4X2xldmVsX29uICovCisgICAgICBwQnNNZXRhRGF0YS0+Y0xldklkeCA9IChVQ0hBUilGREtyZWFkQml0cyhoQnMsIDMpOworICAgICAgZm91bmROZXdEYXRhIHw9IFRZUEVfRFNFX0NMRVZfREFUQTsKKyAgICB9IGVsc2UgeworICAgICAgRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICB9CisgICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgeyAvKiBzdXJyb3VuZF9taXhfbGV2ZWxfb24gKi8KKyAgICAgIHBCc01ldGFEYXRhLT5zTGV2SWR4ID0gKFVDSEFSKUZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgICBmb3VuZE5ld0RhdGEgfD0gVFlQRV9EU0VfU0xFVl9EQVRBOworICAgIH0gZWxzZSB7CisgICAgICBGREtyZWFkQml0cyhoQnMsIDMpOworICAgIH0KKyAgfQorCisgIC8qIHNraXAgdGhlIHVzZWxlc3MgZGF0YSB0byBnZXQgdG8gdGhlIGFuY2lsbGFyeSBkYXRhIGV4dGVuc2lvbiAqLworICBGREtwdXNoRm9yKGhCcywgc2tpcDRFeHQpOworCisgIC8qIGFuYyBkYXRhIGV4dGVuc2lvbiAoTVBFRy00IG9ubHkpICovCisgIGlmIChleHREYXRhQXZhaWwpIHsKKyAgICBpbnQgZXh0RG14THZsU3QsIGV4dERteEdhaW5TdCwgZXh0RG14TGZlU3Q7CisKKyAgICBGREtyZWFkQml0KGhCcyk7IC8qIHJlc2VydmVkIGJpdCAqLworICAgIGV4dERteEx2bFN0ID0gRkRLcmVhZEJpdChoQnMpOworICAgIGV4dERteEdhaW5TdCA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICBleHREbXhMZmVTdCA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICBGREtyZWFkQml0cyhoQnMsIDQpOyAvKiByZXNlcnZlZCBiaXRzICovCisKKyAgICBpZiAoZXh0RG14THZsU3QpIHsKKyAgICAgIHBCc01ldGFEYXRhLT5kbWl4SWR4QSA9IChVQ0hBUilGREtyZWFkQml0cyhoQnMsIDMpOworICAgICAgcEJzTWV0YURhdGEtPmRtaXhJZHhCID0gKFVDSEFSKUZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgICBGREtyZWFkQml0cyhoQnMsIDIpOyAvKiByZXNlcnZlZCBiaXRzICovCisgICAgICBmb3VuZE5ld0RhdGEgfD0gVFlQRV9EU0VfRE1JWF9BQl9EQVRBOworICAgIH0KKyAgICBpZiAoZXh0RG14R2FpblN0KSB7CisgICAgICBwQnNNZXRhRGF0YS0+ZG14R2FpbklkeDUgPSAoVUNIQVIpRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgICAgIEZES3JlYWRCaXQoaEJzKTsgLyogcmVzZXJ2ZWQgYml0ICovCisgICAgICBwQnNNZXRhRGF0YS0+ZG14R2FpbklkeDIgPSAoVUNIQVIpRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgICAgIEZES3JlYWRCaXQoaEJzKTsgLyogcmVzZXJ2ZWQgYml0ICovCisgICAgICBmb3VuZE5ld0RhdGEgfD0gVFlQRV9EU0VfRE1YX0dBSU5fREFUQTsKKyAgICB9CisgICAgaWYgKGV4dERteExmZVN0KSB7CisgICAgICBwQnNNZXRhRGF0YS0+ZG1peElkeExmZSA9IChVQ0hBUilGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgRkRLcmVhZEJpdHMoaEJzLCA0KTsgLyogcmVzZXJ2ZWQgYml0cyAqLworICAgICAgZm91bmROZXdEYXRhIHw9IFRZUEVfRFNFX0RNSVhfTEZFX0RBVEE7CisgICAgfQorICB9CisKKyAgLyogZmluYWwgc2FuaXR5IGNoZWNrIG9uIHRoZSBhbW91bnQgb2YgcmVhZCBkYXRhICovCisgIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpIDwgMCkgeworICAgIGVycm9yU3RhdHVzID0gUENNRE1YX0NPUlJVUFRfQU5DX0RBVEE7CisgIH0KKworICBpZiAoKGVycm9yU3RhdHVzID09IFBDTURNWF9PSykgJiYgKGZvdW5kTmV3RGF0YSAhPSAwKSkgeworICAgIC8qIGFubm91bmNlIG5ldyBkYXRhICovCisgICAgcEJzTWV0YURhdGEtPnR5cGVGbGFncyB8PSBmb3VuZE5ld0RhdGE7CisgICAgLyogcmVzZXQgZXhwaXJ5IGNvdW50ZXIgKi8KKyAgICBwQnNNZXRhRGF0YS0+ZXhwaXJ5Q291bnQgPSAwOworICB9CisKKyAgcmV0dXJuIChlcnJvclN0YXR1cyk7Cit9CisKKy8qCisgKiBSZWFkIERNWCBtZXRhLWRhdGEgZnJvbSBhIGRhdGEgc3RyZWFtIGVsZW1lbnQuCisgKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfUmVhZER2YkFuY0RhdGEoSEFORExFX1BDTV9ET1dOTUlYIHNlbGYsIFVDSEFSICpwQW5jRGF0YUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhbmNEYXRhQnl0ZXMsIGludCBpc01wZWcyKSB7CisgIFBDTURNWF9FUlJPUiBlcnJvclN0YXR1cyA9IFBDTURNWF9PSzsKKyAgRkRLX0JJVFNUUkVBTSBiczsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gJmJzOworCisgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CisgIH0KKworICAvKiBzYW5pdHkgY2hlY2tzICovCisgIGlmICgocEFuY0RhdGFCdWYgPT0gTlVMTCkgfHwgKGFuY0RhdGFCeXRlcyA9PSAwKSkgeworICAgIHJldHVybiAoUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEpOworICB9CisKKyAgRkRLaW5pdEJpdFN0cmVhbShoQnMsIHBBbmNEYXRhQnVmLCBNQVhfRFNFX0FOQ19CWVRFUywgYW5jRGF0YUJ5dGVzICogOCwKKyAgICAgICAgICAgICAgICAgICBCU19SRUFERVIpOworCisgIGVycm9yU3RhdHVzID0gcGNtRG14X1BhcnNlKHNlbGYsIGhCcywgYW5jRGF0YUJ5dGVzICogOCwgaXNNcGVnMik7CisKKyAgcmV0dXJuIChlcnJvclN0YXR1cyk7Cit9CisKKy8qKiBTZXQgdGhlIG1hdHJpeCBtaXhkb3duIGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tIHRoZSBQQ0Ugb2YgYW4gQUFDCisgKmJpdHN0cmVhbS4gTm90ZTogQ2FsbCBvbmx5IGlmIG1hdHJpeF9taXhkb3duX2lkeF9wcmVzZW50IGlzIHRydWUuCisgKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgorICogQHBhcmFtIFtpbl0gVGhlIDIgYml0IG1hdHJpeCBtaXhkb3duIGluZGV4IGV4dHJhY3RlZCBmcm9tIFBDRS4KKyAqIEBwYXJhbSBbaW5dIFRoZSBwc2V1ZG8gc3Vycm91bmQgZW5hYmxlIGZsYWcgZXh0cmFjdGVkIGZyb20gUENFLgorICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9TZXRNYXRyaXhNaXhkb3duRnJvbVBjZShIQU5ETEVfUENNX0RPV05NSVggc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeE1peGRvd25QcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF0cml4TWl4ZG93bklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBzZXVkb1N1cnJvdW5kRW5hYmxlKSB7CisgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CisgIH0KKworICB7CisgICAgRE1YX0JTX01FVEFfREFUQSAqcEJzTWV0YURhdGEgPSAmc2VsZi0+YnNNZXRhRGF0YVswXTsKKworICAgIGlmIChtYXRyaXhNaXhkb3duUHJlc2VudCkgeworICAgICAgcEJzTWV0YURhdGEtPnBzZXVkb1N1cnJvdW5kID0gKHBzZXVkb1N1cnJvdW5kRW5hYmxlKSA/IDEgOiAwOworICAgICAgcEJzTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHggPSBtYXRyaXhNaXhkb3duSWR4ICYgMHgwMzsKKyAgICAgIHBCc01ldGFEYXRhLT50eXBlRmxhZ3MgfD0gVFlQRV9QQ0VfREFUQTsKKyAgICAgIC8qIFJlc2V0IGV4cGlyeSBjb3VudGVyICovCisgICAgICBwQnNNZXRhRGF0YS0+ZXhwaXJ5Q291bnQgPSAwOworICAgIH0KKyAgfQorCisgIHJldHVybiAoUENNRE1YX09LKTsKK30KKworLyoqIEFwcGx5IGRvd24gb3IgdXAgbWl4aW5nLgorICogQHBhcmFtIFtpbl0gICAgSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gYnVmZmVyIHRoYXQgaG9sZCB0aGUgdGltZSBkb21haW4gc2lnbmFsLgorICogQHBhcmFtIFtpbl0gICAgUG9pbnRlciB3aGVyZSB0aGUgYW1vdW50IG9mIG91dHB1dCBzYW1wbGVzIGlzIHJldHVybmVkIGludG8uCisgKiBAcGFyYW0gW2luXSAgICBTaXplIG9mIHBQY21CdWYuCisgKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHdoZXJlIHRoZSBhbW91bnQgb2Ygb3V0cHV0IGNoYW5uZWxzIGlzIHJldHVybmVkIGludG8uCisgKiBAcGFyYW0gW2luXSAgICBJbnB1dCBhbmQgb3V0cHV0IHNhbXBsZXMgYXJlIHByb2Nlc3NlZCBpbnRlcmxlYXZlZC4KKyAqIEBwYXJhbSBbaW5vdXRdIEFycmF5IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBmb3IgZWFjaCBvdXRwdXQKKyAqYXVkaW8gY2hhbm5lbCBpcyBzdG9yZWQgaW50by4KKyAqIEBwYXJhbSBbaW5vdXRdIEFycmF5IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRleCBmb3IgZWFjaAorICpvdXRwdXQgYXVkaW8gY2hhbm5lbCBpcyBzdG9yZWQgaW50by4KKyAqIEBwYXJhbSBbaW5dICAgIEFycmF5IGNvbnRhaW5pbmcgdGhlIG91dCBjaGFubmVsIG1hcHBpbmcgdG8gYmUgdXNlZCAoRnJvbSBNUEVHCisgKlBDRSBvcmRlcmluZyB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCkuCisgKiBAcGFyYW0gW291dF0gICBQb2ludGVyIG9uIGEgZmllbGQgcmVjZWl2aW5nIHRoZSBzY2FsZSBmYWN0b3IgdGhhdCBoYXMgdG8gYmUKKyAqYXBwbGllZCBvbiBhbGwgc2FtcGxlcyBhZnRlcndhcmRzLiBJZiB0aGUgaGFuZGVkIHBvaW50ZXIgaXMgTlVMTCBzY2FsaW5nIGlzCisgKmRvbmUgaW50ZXJuYWxseS4KKyAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfQXBwbHlGcmFtZShIQU5ETEVfUENNX0RPV05NSVggc2VsZiwgRE1YX1BDTSAqcFBjbUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcGNtQnVmU2l6ZSwgVUlOVCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpuQ2hhbm5lbHMsIElOVCBmSW50ZXJsZWF2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY2hhbm5lbEluZGljZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfY2hhbm5lbE1hcERlc2NyICpjb25zdCBtYXBEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBEbXhPdXRTY2FsZSkgeworICBQQ01fRE1YX1VTRVJfUEFSQU1TICpwUGFyYW0gPSBOVUxMOworICBQQ01ETVhfRVJST1IgZXJyb3JTdGF0dXMgPSBQQ01ETVhfT0s7CisgIERVQUxfQ0hBTk5FTF9NT0RFIGR1YWxDaGFubmVsTW9kZTsKKyAgUENNX0RNWF9DSEFOTkVMX01PREUgaW5DaE1vZGU7CisgIFBDTV9ETVhfQ0hBTk5FTF9NT0RFIG91dENoTW9kZTsKKyAgSU5UIGRldk51bGw7IC8qIEp1c3QgYSBkdW1teSB0byBhdm9pZCBhIGxvdCBvZiBicmFuY2hlcyBpbiB0aGUgY29kZSAqLworICBpbnQgbnVtT3V0Q2hhbm5lbHMsIG51bUluQ2hhbm5lbHM7CisgIGludCBpblN0cmlkZSwgb3V0U3RyaWRlLCBvZmZzZXQ7CisgIGludCBkbXhNYXhTY2FsZSwgZG14U2NhbGU7CisgIGludCBzbG90OworICBVQ0hBUiBpbk9mZnNldFRhYmxlWyg4KV07CisKKyAgRE1YX0JTX01FVEFfREFUQSBic01ldGFEYXRhOworCisgIGlmICgoc2VsZiA9PSBOVUxMKSB8fCAobkNoYW5uZWxzID09IE5VTEwpIHx8IChjaGFubmVsVHlwZSA9PSBOVUxMKSB8fAorICAgICAgKGNoYW5uZWxJbmRpY2VzID09IE5VTEwpIHx8ICghRkRLX2NoTWFwRGVzY3JfaXNWYWxpZChtYXBEZXNjcikpKSB7CisgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICB9CisKKyAgLyogSW5pdCB0aGUgb3V0cHV0IHNjYWxpbmcgKi8KKyAgZG14U2NhbGUgPSAwOworICBpZiAocERteE91dFNjYWxlICE9IE5VTEwpIHsKKyAgICAvKiBBdm9pZCBmaW5hbCBzY2FsaW5nIGludGVybmFsbHkgYW5kIGhhbmQgaXQgdG8gdGhlIG91dHNpZGUgd29ybGQuICovCisgICAgKnBEbXhPdXRTY2FsZSA9IDA7CisgICAgZG14TWF4U2NhbGUgPSAoMyk7CisgIH0gZWxzZSB7CisgICAgLyogQXBwbHkgdGhlIHNjYWxpbmcgaW50ZXJuYWxseS4gKi8KKyAgICBwRG14T3V0U2NhbGUgPSAmZGV2TnVsbDsgLyogcmVkaXJlY3QgdG8gdGVtcG9yYWwgc3RhY2sgbWVtb3J5ICovCisgICAgZG14TWF4U2NhbGUgPSAwOworICB9CisKKyAgcFBhcmFtID0gJnNlbGYtPnVzZXJQYXJhbXM7CisgIG51bUluQ2hhbm5lbHMgPSAqbkNoYW5uZWxzOworCisgIC8qIFBlcmZvcm0gc29tZSBpbnB1dCBzYW5pdHkgY2hlY2tzICovCisgIGlmIChwUGNtQnVmID09IE5VTEwpIHsKKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0FSR1VNRU5UKTsKKyAgfQorICBpZiAoZnJhbWVTaXplID09IDApIHsKKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0FSR1VNRU5UKTsKKyAgfQorICBpZiAobnVtSW5DaGFubmVscyA9PSAwKSB7CisgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVCk7CisgIH0KKyAgaWYgKG51bUluQ2hhbm5lbHMgPiAoOCkpIHsKKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0NIX0NPTkZJRyk7CisgIH0KKworICAvKiBDaGVjayBvbiBtaXNjb25maWd1cmF0aW9uICovCisgIEZES19BU1NFUlQoKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPD0gMCkgfHwKKyAgICAgICAgICAgICAocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA+PSBwUGFyYW0tPm51bU91dENoYW5uZWxzTWluKSk7CisKKyAgLyogRGV0ZXJtaW5lIGlmIHRoZSBtb2R1bGUgaGFzIHRvIGRvIHByb2Nlc3NpbmcgKi8KKyAgaWYgKChzZWxmLT5hcHBseVByb2Nlc3NpbmcgPT0gMCkgJiYKKyAgICAgICgocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA8PSAwKSB8fAorICAgICAgIChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4ID49IG51bUluQ2hhbm5lbHMpKSAmJgorICAgICAgKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW4gPD0gbnVtSW5DaGFubmVscykpIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgcmV0dXJuIChlcnJvclN0YXR1cyk7CisgIH0KKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KKyAgaWYgKChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4ID4gMCkgJiYKKyAgICAgIChudW1JbkNoYW5uZWxzID4gcFBhcmFtLT5udW1PdXRDaGFubmVsc01heCkpIHsKKyAgICBudW1PdXRDaGFubmVscyA9IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXg7CisgIH0gZWxzZSBpZiAobnVtSW5DaGFubmVscyA8IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW4pIHsKKyAgICBudW1PdXRDaGFubmVscyA9IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW47CisgIH0gZWxzZSB7CisgICAgbnVtT3V0Q2hhbm5lbHMgPSBudW1JbkNoYW5uZWxzOworICB9CisKKyAgLyogQ2hlY2sgSS9PIGJ1ZmZlciBzaXplICovCisgIGlmICgoVUlOVClwY21CdWZTaXplIDwgKFVJTlQpbnVtT3V0Q2hhbm5lbHMgKiBmcmFtZVNpemUpIHsKKyAgICByZXR1cm4gKFBDTURNWF9PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCk7CisgIH0KKworICBkdWFsQ2hhbm5lbE1vZGUgPSBwUGFyYW0tPmR1YWxDaGFubmVsTW9kZTsKKworICAvKiBBbmFseXNlIGlucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBhbmQgZ2V0IGNoYW5uZWwgb2Zmc2V0CisgICAqIHRhYmxlIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIGZpeGVkIGNoYW5uZWwgbGFiZWxzLiAqLworICBlcnJvclN0YXR1cyA9IGdldENoYW5uZWxNb2RlKG51bUluQ2hhbm5lbHMsIGNoYW5uZWxUeXBlLCBjaGFubmVsSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZnNldFRhYmxlLCAmaW5DaE1vZGUpOworICBpZiAoUENNRE1YX0lTX0ZBVEFMX0VSUk9SKGVycm9yU3RhdHVzKSB8fCAoaW5DaE1vZGUgPT0gQ0hfTU9ERV9VTkRFRklORUQpKSB7CisgICAgLyogV2UgZG9uJ3QgbmVlZCB0byByZXN0b3JlIGJlY2F1c2UgdGhlIGNoYW5uZWwKKyAgICAgICBjb25maWd1cmF0aW9uIGhhcyBub3QgYmVlbiBjaGFuZ2VkLiBKdXN0IGV4aXQuICovCisgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9DSF9DT05GSUcpOworICB9CisKKyAgLyogU2V0IGlucHV0IHN0cmlkZSBhbmQgb2Zmc2V0ICovCisgIGlmIChmSW50ZXJsZWF2ZWQpIHsKKyAgICBpblN0cmlkZSA9IG51bUluQ2hhbm5lbHM7CisgICAgb2Zmc2V0ID0gMTsgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCisgIH0gZWxzZSB7CisgICAgaW5TdHJpZGUgPSAxOworICAgIG9mZnNldCA9IGZyYW1lU2l6ZTsgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCisgIH0KKworICAvKiBSZXNldCBkb3dubWl4IG1ldGEgZGF0YSBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKChwUGFyYW0tPmV4cGlyeUZyYW1lID4gMCkgJiYKKyAgICAgICgrK3NlbGYtPmJzTWV0YURhdGFbMF0uZXhwaXJ5Q291bnQgPgorICAgICAgIHBQYXJhbQorICAgICAgICAgICAtPmV4cGlyeUZyYW1lKSkgeyAvKiBUaGUgbWV0YWRhdGEgcmVhZCBmcm9tIGJpdHN0cmVhbSBpcyB0b28gb2xkLiAqLworI2lmZGVmIEZES19BU1NFUlRfRU5BQkxFCisgICAgUENNRE1YX0VSUk9SIGVyciA9IHBjbURteF9SZXNldChzZWxmLCBQQ01ETVhfUkVTRVRfQlNfREFUQSk7CisgICAgRkRLX0FTU0VSVChlcnIgPT0gUENNRE1YX09LKTsKKyNlbHNlCisgICAgcGNtRG14X1Jlc2V0KHNlbGYsIFBDTURNWF9SRVNFVF9CU19EQVRBKTsKKyNlbmRpZgorICB9CisgIEZES21lbWNweSgmYnNNZXRhRGF0YSwgJnNlbGYtPmJzTWV0YURhdGFbcFBhcmFtLT5mcmFtZURlbGF5XSwKKyAgICAgICAgICAgIHNpemVvZihETVhfQlNfTUVUQV9EQVRBKSk7CisgIC8qIE1haW50YWluIGRlbGF5IGxpbmUgKi8KKyAgZm9yIChzbG90ID0gcFBhcmFtLT5mcmFtZURlbGF5OyBzbG90ID4gMDsgc2xvdCAtPSAxKSB7CisgICAgRkRLbWVtY3B5KCZzZWxmLT5ic01ldGFEYXRhW3Nsb3RdLCAmc2VsZi0+YnNNZXRhRGF0YVtzbG90IC0gMV0sCisgICAgICAgICAgICAgIHNpemVvZihETVhfQlNfTUVUQV9EQVRBKSk7CisgIH0KKworICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKyAgICogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgaWYgKG51bUluQ2hhbm5lbHMgPiBudW1PdXRDaGFubmVscykgeyAvKiBBcHBseSBkb3dubWl4ICovCisgICAgRE1YX1BDTSAqcEluUGNtWyg4KV0gPSB7TlVMTH07CisgICAgRE1YX1BDTSAqcE91dFBjbVsoOCldID0ge05VTEx9OworICAgIEZJWFBfRE1YIG1peEZhY3RvcnNbKDgpXVsoOCldOworICAgIFVDSEFSIG91dE9mZnNldFRhYmxlWyg4KV07CisgICAgVUlOVCBzYW1wbGU7CisgICAgaW50IGNoQ2ZnID0gMDsKKyAgICBpbnQgYnlwU2NhbGUgPSAwOworCisgICAgaWYgKG51bUluQ2hhbm5lbHMgPiBTSVhfQ0hBTk5FTCkgeworICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIG11bHRpUHVycG9zZUNoVHlwZVsyXTsKKworICAgICAgLyogR2V0IHRoZSB0eXBlIG9mIHRoZSBtdWx0aXB1cnBvc2UgY2hhbm5lbHMgKi8KKyAgICAgIG11bHRpUHVycG9zZUNoVHlwZVswXSA9CisgICAgICAgICAgY2hhbm5lbFR5cGVbaW5PZmZzZXRUYWJsZVtMRUZUX01VTFRJUFJQU19DSEFOTkVMXV07CisgICAgICBtdWx0aVB1cnBvc2VDaFR5cGVbMV0gPQorICAgICAgICAgIGNoYW5uZWxUeXBlW2luT2Zmc2V0VGFibGVbUklHSFRfTVVMVElQUlBTX0NIQU5ORUxdXTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGNvbmZpZ3VyYXRpb24gaXMgb25lIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkLiAqLworICAgICAgc3dpdGNoIChpbkNoTW9kZSkgeworICAgICAgICBjYXNlIENIX01PREVfNV8wXzJfMTogLyogY2hDZmcgNyB8fCAxNCAqLworICAgICAgICAgIC8qIEZ1cnRoZXIgYW5hbHlzZSB0aGUgaW5wdXQgY29uZmlnIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28KKyAgICAgICAgICAgKiBDSF9NT0RFXzVfMF8yXzEgY29uZmlncy4gKi8KKyAgICAgICAgICBpZiAoKG11bHRpUHVycG9zZUNoVHlwZVswXSA9PSBBQ1RfRlJPTlRfVE9QKSAmJgorICAgICAgICAgICAgICAobXVsdGlQdXJwb3NlQ2hUeXBlWzFdID09IEFDVF9GUk9OVF9UT1ApKSB7CisgICAgICAgICAgICBjaENmZyA9IDE0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaENmZyA9IDc7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIX01PREVfM18wXzNfMTogLyogY2hDZmcgMTEgKi8KKyAgICAgICAgICBjaENmZyA9IDExOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIX01PREVfM18wXzRfMTogLyogY2hDZmcgMTIgKi8KKyAgICAgICAgICBjaENmZyA9IDEyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNoQ2ZnID0gMDsgLyogTm90IGEga25vd24gY29uZmlnICovCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHRoaXMgc3RhZ2VzIG91dHB1dCBzdHJpZGUgYW5kIGNoYW5uZWwgbW9kZTogKi8KKyAgICBvdXRTdHJpZGUgPSAoZkludGVybGVhdmVkKSA/IG51bU91dENoYW5uZWxzIDogMTsKKyAgICBvdXRDaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtudW1PdXRDaGFubmVsc107CisgICAgRkRLX0FTU0VSVChvdXRDaE1vZGUgIT0gQ0hfTU9ERV9VTkRFRklORUQpOworCisgICAgLyogR2V0IGNoYW5uZWwgZGVzY3JpcHRpb24gYW5kIGNoYW5uZWwgbWFwcGluZyBmb3IgdGhlIGRlc2lyZWQgb3V0cHV0CisgICAgICogY29uZmlndXJhdGlvbi4gKi8KKyAgICBnZXRDaGFubmVsRGVzY3JpcHRpb24ob3V0Q2hNb2RlLCBtYXBEZXNjciwgY2hhbm5lbFR5cGUsIGNoYW5uZWxJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRPZmZzZXRUYWJsZSk7CisgICAgLyogTm93IHRoZXJlIGlzIG5vIHdheSBiYWNrIGJlY2F1c2Ugd2UgbW9kaWZpZWQgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiEKKyAgICAgKi8KKworICAgIC8qIENyZWF0ZSB0aGUgRE1YIG1hdHJpeCAqLworICAgIGVycm9yU3RhdHVzID0KKyAgICAgICAgZ2V0TWl4RmFjdG9ycygoY2hDZmcgPiAwKSA/IDEgOiAwLAorICAgICAgICAgICAgICAgICAgICAgIChjaENmZyA+IDApID8gKFBDTV9ETVhfQ0hBTk5FTF9NT0RFKWNoQ2ZnIDogaW5DaE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hNb2RlLCBwUGFyYW0sICZic01ldGFEYXRhLCBtaXhGYWN0b3JzLCAmZG14U2NhbGUpOworICAgIC8qIE5vIGZhdGFsIGVycm9ycyBjYW4gb2NjdXIgaGVyZS4gVGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGFsd2F5cyByZXR1cm4KKyAgICAgICBhIHZhbGlkIG1hdHJpeC4gVGhlIGVycm9yIGNvZGUgaXMgdXNlZCB0byBzaWduYWwgY29uZmlndXJhdGlvbnMgYW5kCisgICAgICAgbWF0cmljZXMgdGhhdCBhcmUgbm90IGNvbmZvcm0gdG8gYW55IHN0YW5kYXJkLiAqLworCisgICAgLyogRGV0ZXJtaW5lIHRoZSBmaW5hbCBzY2FsaW5nICovCisgICAgYnlwU2NhbGUgPSBmTWluKGRteE1heFNjYWxlLCBkbXhTY2FsZSk7CisgICAgKnBEbXhPdXRTY2FsZSArPSBieXBTY2FsZTsKKyAgICBkbXhTY2FsZSAtPSBieXBTY2FsZTsKKworICAgIHsgLyogU2V0IGNoYW5uZWwgcG9pbnRlciBmb3IgaW5wdXQuIFJlbW92ZSBlbXB0eSBjb2xzLiAqLworICAgICAgaW50IGluQ2gsIG91dENoLCBtYXBbKDgpXTsKKyAgICAgIGludCBjaCA9IDA7CisgICAgICBmb3IgKGluQ2ggPSAwOyBpbkNoIDwgKDgpOyBpbkNoICs9IDEpIHsKKyAgICAgICAgaWYgKGluT2Zmc2V0VGFibGVbaW5DaF0gPCAoVUNIQVIpbnVtSW5DaGFubmVscykgeworICAgICAgICAgIHBJblBjbVtjaF0gPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW2luQ2hdICogb2Zmc2V0XTsKKyAgICAgICAgICBtYXBbY2grK10gPSBpbkNoOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKDsgY2ggPCAoOCk7IGNoICs9IDEpIHsKKyAgICAgICAgbWFwW2NoXSA9IGNoOworICAgICAgfQorCisgICAgICAvKiBSZW1vdmUgdW51c2VkIGNvbHMgZnJvbSBmYWN0b3IgbWF0cml4ICovCisgICAgICBmb3IgKGluQ2ggPSAwOyBpbkNoIDwgbnVtSW5DaGFubmVsczsgaW5DaCArPSAxKSB7CisgICAgICAgIGlmIChpbkNoICE9IG1hcFtpbkNoXSkgeworICAgICAgICAgIGZvciAob3V0Q2ggPSAwOyBvdXRDaCA8ICg4KTsgb3V0Q2ggKz0gMSkgeworICAgICAgICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPSBtaXhGYWN0b3JzW291dENoXVttYXBbaW5DaF1dOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBTZXQgY2hhbm5lbCBwb2ludGVyIGZvciBvdXRwdXQuIFJlbW92ZSBlbXB0eSBjb2xzLiAqLworICAgICAgY2ggPSAwOworICAgICAgZm9yIChvdXRDaCA9IDA7IG91dENoIDwgKDgpOyBvdXRDaCArPSAxKSB7CisgICAgICAgIGlmIChvdXRPZmZzZXRUYWJsZVtvdXRDaF0gPCAoVUNIQVIpbnVtT3V0Q2hhbm5lbHMpIHsKKyAgICAgICAgICBwT3V0UGNtW2NoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW291dENoXSAqIG9mZnNldF07CisgICAgICAgICAgbWFwW2NoKytdID0gb3V0Q2g7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoOyBjaCA8ICg4KTsgY2ggKz0gMSkgeworICAgICAgICBtYXBbY2hdID0gY2g7CisgICAgICB9CisKKyAgICAgIC8qIFJlbW92ZSB1bnVzZWQgcm93cyBmcm9tIGZhY3RvciBtYXRyaXggKi8KKyAgICAgIGZvciAob3V0Q2ggPSAwOyBvdXRDaCA8IG51bU91dENoYW5uZWxzOyBvdXRDaCArPSAxKSB7CisgICAgICAgIGlmIChvdXRDaCAhPSBtYXBbb3V0Q2hdKSB7CisgICAgICAgICAgRkRLbWVtY3B5KCZtaXhGYWN0b3JzW291dENoXSwgJm1peEZhY3RvcnNbbWFwW291dENoXV0sCisgICAgICAgICAgICAgICAgICAgICg4KSAqIHNpemVvZihGSVhQX0RNWCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogU2FtcGxlIHByb2Nlc3NpbmcgbG9vcCAqLworICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgeworICAgICAgRE1YX1BDTSB0SW5bKDgpXSA9IHswfTsKKyAgICAgIEZJWFBfREJMIHRPdXRbKDgpXSA9IHsoRklYUF9EQkwpMH07CisgICAgICBpbnQgaW5DaCwgb3V0Q2g7CisKKyAgICAgIC8qIFByZWxvYWQgYWxsIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgIGZvciAoaW5DaCA9IDA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoICs9IDEpIHsKKyAgICAgICAgaWYgKHBJblBjbVtpbkNoXSAhPSBOVUxMKSB7CisgICAgICAgICAgdEluW2luQ2hdID0gKnBJblBjbVtpbkNoXTsKKyAgICAgICAgICBwSW5QY21baW5DaF0gKz0gaW5TdHJpZGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdEluW2luQ2hdID0gKERNWF9QQ00pMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogQXBwbHkgZG93bm1peCBjb2VmZmljaWVudHMgdG8gaW5wdXQgc2FtcGxlcyBhbmQgYWNjdW11bGF0ZSBmb3Igb3V0cHV0CisgICAgICAgKi8KKyAgICAgIGZvciAob3V0Q2ggPSAwOyBvdXRDaCA8IG51bU91dENoYW5uZWxzOyBvdXRDaCArPSAxKSB7CisgICAgICAgIGZvciAoaW5DaCA9IDA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoICs9IDEpIHsKKyAgICAgICAgICB0T3V0W291dENoXSArPSBmTXVsdCgoRE1YX1BDTUYpdEluW2luQ2hdLCBtaXhGYWN0b3JzW291dENoXVtpbkNoXSk7CisgICAgICAgIH0KKyAgICAgICAgRkRLX0FTU0VSVChwT3V0UGNtW291dENoXSA+PSBwUGNtQnVmKTsKKyAgICAgICAgRkRLX0FTU0VSVChwT3V0UGNtW291dENoXSA8ICZwUGNtQnVmW3BjbUJ1ZlNpemVdKTsKKyAgICAgICAgLyogV3JpdGUgc2FtcGxlICovCisgICAgICAgICpwT3V0UGNtW291dENoXSA9IChETVhfUENNKVNBVFVSQVRFX1NISUZUKAorICAgICAgICAgICAgdE91dFtvdXRDaF0sIERGUkFDVF9CSVRTIC0gRE1YX1BDTV9CSVRTIC0gZG14U2NhbGUsIERNWF9QQ01fQklUUyk7CisgICAgICAgIHBPdXRQY21bb3V0Q2hdICs9IG91dFN0cmlkZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KKyAgICAqbkNoYW5uZWxzID0gbnVtT3V0Q2hhbm5lbHM7CisKKyAgfSAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgZWxzZSBpZiAobnVtSW5DaGFubmVscyA8IG51bU91dENoYW5uZWxzKSB7IC8qIEFwcGx5IHJ1ZGltZW50YXJ5IHVwbWl4ICovCisgICAgLyogU2V0IHVwIGNoYW5uZWwgcG9pbnRlciAqLworICAgIFVDSEFSIG91dE9mZnNldFRhYmxlWyg4KV07CisKKyAgICAvKiBGSVJTVCBTVEFHRQorICAgICAgICAgQ3JlYXRlIGEgc3RlcmVvL2R1YWwgY2hhbm5lbCBzaWduYWwgKi8KKyAgICBpZiAobnVtSW5DaGFubmVscyA9PSBPTkVfQ0hBTk5FTCkgeworICAgICAgRE1YX1BDTSAqcEluUGNtWyg4KV07CisgICAgICBETVhfUENNICpwT3V0TEYsICpwT3V0UkY7CisgICAgICBVSU5UIHNhbXBsZTsKKworICAgICAgLyogU2V0IHRoaXMgc3RhZ2VzIG91dHB1dCBzdHJpZGUgYW5kIGNoYW5uZWwgbW9kZTogKi8KKyAgICAgIG91dFN0cmlkZSA9IChmSW50ZXJsZWF2ZWQpID8gVFdPX0NIQU5ORUwgOiAxOworICAgICAgb3V0Q2hNb2RlID0gb3V0Q2hNb2RlVGFibGVbVFdPX0NIQU5ORUxdOworCisgICAgICAvKiBHZXQgY2hhbm5lbCBkZXNjcmlwdGlvbiBhbmQgY2hhbm5lbCBtYXBwaW5nIGZvciB0aGlzCisgICAgICAgKiBzdGFnZXMgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAoYWx3YXlzIFNURVJFTykuICovCisgICAgICBnZXRDaGFubmVsRGVzY3JpcHRpb24ob3V0Q2hNb2RlLCBtYXBEZXNjciwgY2hhbm5lbFR5cGUsIGNoYW5uZWxJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mZnNldFRhYmxlKTsKKyAgICAgIC8qIE5vdyB0aGVyZSBpcyBubyB3YXkgYmFjayBiZWNhdXNlIHdlIG1vZGlmaWVkIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24hCisgICAgICAgKi8KKworICAgICAgLyogU2V0IGlucHV0IGNoYW5uZWwgcG9pbnRlci4gVGhlIGZpcnN0IGNoYW5uZWwgaXMgYWx3YXlzIGF0IGluZGV4IDAuICovCisgICAgICBwSW5QY21bQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0KKyAgICAgICAgICAmcFBjbUJ1ZlsoZnJhbWVTaXplIC0gMSkgKgorICAgICAgICAgICAgICAgICAgIGluU3RyaWRlXTsgLyogQ29uc2lkZXJpbmcgaW5wdXQgbWFwcGluZyBjb3VsZCBsZWFkIHRvIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQgcG9pbnRlciBoZXJlIGlmIHRoZSBjaGFubmVsIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWQgdG8gYmUgYSBmcm9udCBjaGFubmVsLiAqLworCisgICAgICAvKiBTZXQgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAoZm9yIHRoaXMgc3RhZ2UpLiAqLworICAgICAgcE91dExGID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbTEVGVF9GUk9OVF9DSEFOTkVMXSAqIG9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVTaXplIC0gMSkgKiBvdXRTdHJpZGVdOworICAgICAgcE91dFJGID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbUklHSFRfRlJPTlRfQ0hBTk5FTF0gKiBvZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lU2l6ZSAtIDEpICogb3V0U3RyaWRlXTsKKworICAgICAgLyogMS8wIGlucHV0OiAqLworICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CisgICAgICAgIC8qIEwnID0gQzsgIFInID0gQzsgKi8KKyAgICAgICAgKnBPdXRMRiA9ICpwT3V0UkYgPSAqcEluUGNtW0NFTlRFUl9GUk9OVF9DSEFOTkVMXTsKKworICAgICAgICBwSW5QY21bQ0VOVEVSX0ZST05UX0NIQU5ORUxdIC09IGluU3RyaWRlOworICAgICAgICBwT3V0TEYgLT0gb3V0U3RyaWRlOworICAgICAgICBwT3V0UkYgLT0gb3V0U3RyaWRlOworICAgICAgfQorCisgICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IHN0YWdlOiAqLworICAgICAgaW5TdHJpZGUgPSBvdXRTdHJpZGU7CisgICAgICBpbkNoTW9kZSA9IG91dENoTW9kZTsKKyAgICAgIEZES21lbWNweShpbk9mZnNldFRhYmxlLCBvdXRPZmZzZXRUYWJsZSwgKDgpICogc2l6ZW9mKFVDSEFSKSk7CisgICAgfQorCisgICAgLyogU0VDT05EIFNUQUdFCisgICAgICAgICBFeHRlbmQgd2l0aCB6ZXJvIGNoYW5uZWxzIHRvIGFjaGlldmVkIHRoZSBkZXNpcmVkIG51bWJlciBvZiBvdXRwdXQKKyAgICAgICBjaGFubmVscy4gKi8KKyAgICBpZiAobnVtT3V0Q2hhbm5lbHMgPiBUV09fQ0hBTk5FTCkgeworICAgICAgRE1YX1BDTSAqcEluWyg4KV0gPSB7TlVMTH07CisgICAgICBETVhfUENNICpwT3V0Wyg4KV0gPSB7TlVMTH07CisgICAgICBVSU5UIHNhbXBsZTsKKyAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBpbkNoVHlwZXNbKDgpXTsKKyAgICAgIFVDSEFSIGluQ2hJbmRpY2VzWyg4KV07CisgICAgICBVQ0hBUiBudW1DaFBlckdycFsyXVsoNCldOworICAgICAgaW50IG5Db250ZW50Q2ggPSAwOyAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgd2l0aCBjb250ZW50ICovCisgICAgICBpbnQgbkVtcHR5Q2ggPSAwOyAgIC8qIE51bWJlciBvZiBjaGFubmVscyB3aXRoIGNvbnRlbnQgKi8KKyAgICAgIGludCBjaCwgY2hHcnAsIGlzQ29tcGF0aWJsZSA9IDE7CisKKyAgICAgIC8qIERvIG5vdCBjaGFuZ2UgdGhlIHNpZ25hbGxpbmcgd2hpY2ggaXMgdGhlIGNoYW5uZWwgdHlwZXMgYW5kIGluZGljZXMuCisgICAgICAgICBKdXN0IHJlb3JkZXIgYW5kIGFkZCBjaGFubmVscy4gU28gZmlyc3Qgc2F2ZSB0aGUgaW5wdXQgc2lnbmFsbGluZy4gKi8KKyAgICAgIEZES21lbWNweShpbkNoVHlwZXMsIGNoYW5uZWxUeXBlLAorICAgICAgICAgICAgICAgIG51bUluQ2hhbm5lbHMgKiBzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7CisgICAgICBGREttZW1jbGVhcihpbkNoVHlwZXMgKyBudW1JbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgKCg4KSAtIG51bUluQ2hhbm5lbHMpICogc2l6ZW9mKEFVRElPX0NIQU5ORUxfVFlQRSkpOworICAgICAgRkRLbWVtY3B5KGluQ2hJbmRpY2VzLCBjaGFubmVsSW5kaWNlcywgbnVtSW5DaGFubmVscyAqIHNpemVvZihVQ0hBUikpOworICAgICAgRkRLbWVtY2xlYXIoaW5DaEluZGljZXMgKyBudW1JbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgKCg4KSAtIG51bUluQ2hhbm5lbHMpICogc2l6ZW9mKFVDSEFSKSk7CisKKyAgICAgIC8qIFNldCB0aGlzIHN0YWdlcyBvdXRwdXQgc3RyaWRlIGFuZCBjaGFubmVsIG1vZGU6ICovCisgICAgICBvdXRTdHJpZGUgPSAoZkludGVybGVhdmVkKSA/IG51bU91dENoYW5uZWxzIDogMTsKKyAgICAgIG91dENoTW9kZSA9IG91dENoTW9kZVRhYmxlW251bU91dENoYW5uZWxzXTsKKyAgICAgIEZES19BU1NFUlQob3V0Q2hNb2RlICE9IENIX01PREVfVU5ERUZJTkVEKTsKKworICAgICAgLyogQ2hlY2sgaWYgaW5wdXQgY2hhbm5lbCBjb25maWcgY2FuIGJlIGVhc2lseSBtYXBwZWQgdG8gdGhlIGRlc2lyZWQKKyAgICAgICAqIG91dHB1dCBjb25maWcuICovCisgICAgICBmb3IgKGNoR3JwID0gMDsgY2hHcnAgPCAoNCk7IGNoR3JwICs9IDEpIHsKKyAgICAgICAgbnVtQ2hQZXJHcnBbSU5dW2NoR3JwXSA9IChpbkNoTW9kZSA+PiAoY2hHcnAgKiA0KSkgJiAweEY7CisgICAgICAgIG51bUNoUGVyR3JwW09VVF1bY2hHcnBdID0gKG91dENoTW9kZSA+PiAoY2hHcnAgKiA0KSkgJiAweEY7CisKKyAgICAgICAgaWYgKG51bUNoUGVyR3JwW0lOXVtjaEdycF0gPiBudW1DaFBlckdycFtPVVRdW2NoR3JwXSkgeworICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGlzQ29tcGF0aWJsZSkgeworICAgICAgICAvKiBHZXQgbmV3IGNoYW5uZWwgZGVzY3JpcHRpb24gYW5kIGNoYW5uZWwKKyAgICAgICAgICogbWFwcGluZyBmb3IgdGhlIGRlc2lyZWQgb3V0cHV0IGNoYW5uZWwgbW9kZS4gKi8KKyAgICAgICAgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uKG91dENoTW9kZSwgbWFwRGVzY3IsIGNoYW5uZWxUeXBlLCBjaGFubmVsSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mZnNldFRhYmxlKTsKKyAgICAgICAgLyogSWYgdGhlIGlucHV0IGNvbmZpZyBoYXMgYSBiYWNrIGNlbnRlciBjaGFubmVsIGJ1dCB0aGUgb3V0cHV0CisgICAgICAgICAgIGNvbmZpZyBoYXMgbm90LCBjb3B5IGl0IHRvIGxlZnQgYW5kIHJpZ2h0IChpZiBhdmFpbGFibGUpLiAqLworICAgICAgICBpZiAoKG51bUNoUGVyR3JwW0lOXVtDSF9HUk9VUF9SRUFSXSAlIDIpICYmCisgICAgICAgICAgICAhKG51bUNoUGVyR3JwW09VVF1bQ0hfR1JPVVBfUkVBUl0gJSAyKSkgeworICAgICAgICAgIGlmIChudW1DaFBlckdycFtJTl1bQ0hfR1JPVVBfUkVBUl0gPT0gMSkgeworICAgICAgICAgICAgaW5PZmZzZXRUYWJsZVtSSUdIVF9SRUFSX0NIQU5ORUxdID0KKyAgICAgICAgICAgICAgICBpbk9mZnNldFRhYmxlW0xFRlRfUkVBUl9DSEFOTkVMXTsKKyAgICAgICAgICB9IGVsc2UgaWYgKG51bUNoUGVyR3JwW0lOXVtDSF9HUk9VUF9SRUFSXSA9PSAzKSB7CisgICAgICAgICAgICBpbk9mZnNldFRhYmxlW1JJR0hUX01VTFRJUFJQU19DSEFOTkVMXSA9CisgICAgICAgICAgICAgICAgaW5PZmZzZXRUYWJsZVtMRUZUX01VTFRJUFJQU19DSEFOTkVMXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEp1c3QgY29weSBhbmQgZXh0ZW5kIHRoZSBvcmlnaW5hbCBjb25maWcgKi8KKyAgICAgICAgRkRLbWVtY3B5KG91dE9mZnNldFRhYmxlLCBpbk9mZnNldFRhYmxlLCAoOCkgKiBzaXplb2YoVUNIQVIpKTsKKyAgICAgIH0KKworICAgICAgLyogU2V0IEkvTyBjaGFubmVsIHBvaW50ZXIuCisgICAgICAgICBOb3RlOiBUaGUgZm9sbG93aW5nIGFzc2lnbm1lbnQgYWxnb3JpdGhtIGNsZWFycyB0aGUgY2hhbm5lbCBvZmZzZXQKKyAgICAgICAgIHRhYmxlcy4gVGh1cyB0aGV5IGNhbiBub3QgYmUgdXNlZCBhZnRlcndhcmRzLiAqLworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgKDgpOyBjaCArPSAxKSB7CisgICAgICAgIGlmICgob3V0T2Zmc2V0VGFibGVbY2hdIDwgMjU1KSAmJgorICAgICAgICAgICAgKGluT2Zmc2V0VGFibGVbY2hdIDwgMjU1KSkgeyAvKiBTZXQgSS9PIHBvaW50ZXI6ICovCisgICAgICAgICAgcEluW25Db250ZW50Q2hdID0KKyAgICAgICAgICAgICAgJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtjaF0gKiBvZmZzZXQgKyAoZnJhbWVTaXplIC0gMSkgKiBpblN0cmlkZV07CisgICAgICAgICAgcE91dFtuQ29udGVudENoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW2NoXSAqIG9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZVNpemUgLSAxKSAqIG91dFN0cmlkZV07CisgICAgICAgICAgLyogVXBkYXRlIHNpZ25hbGxpbmcgKi8KKyAgICAgICAgICBjaGFubmVsVHlwZVtvdXRPZmZzZXRUYWJsZVtjaF1dID0gaW5DaFR5cGVzW2luT2Zmc2V0VGFibGVbY2hdXTsKKyAgICAgICAgICBjaGFubmVsSW5kaWNlc1tvdXRPZmZzZXRUYWJsZVtjaF1dID0gaW5DaEluZGljZXNbaW5PZmZzZXRUYWJsZVtjaF1dOworICAgICAgICAgIGluT2Zmc2V0VGFibGVbY2hdID0gMjU1OworICAgICAgICAgIG91dE9mZnNldFRhYmxlW2NoXSA9IDI1NTsKKyAgICAgICAgICBuQ29udGVudENoICs9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChpc0NvbXBhdGlibGUpIHsKKyAgICAgICAgLyogQXNzaWduIHRoZSByZW1haW5pbmcgaW5wdXQgY2hhbm5lbHMuCisgICAgICAgICAgIFRoaXMgaXMganVzdCBhIHNhZmV0eSBhcHBsaWFuY2UuIFdlIHNob3VsZCBuZXZlciBuZWVkIGl0LiAqLworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCAoOCk7IGNoICs9IDEpIHsKKyAgICAgICAgICBpZiAoaW5PZmZzZXRUYWJsZVtjaF0gPCAyNTUpIHsKKyAgICAgICAgICAgIGludCBvdXRDaDsKKyAgICAgICAgICAgIGZvciAob3V0Q2ggPSAwOyBvdXRDaCA8ICg4KTsgb3V0Q2ggKz0gMSkgeworICAgICAgICAgICAgICBpZiAob3V0T2Zmc2V0VGFibGVbb3V0Q2hdIDwgMjU1KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRDaCA+PSAoOCkpIHsKKyAgICAgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBTZXQgSS9PIHBvaW50ZXI6ICovCisgICAgICAgICAgICBwSW5bbkNvbnRlbnRDaF0gPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW2NoXSAqIG9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVTaXplIC0gMSkgKiBpblN0cmlkZV07CisgICAgICAgICAgICBwT3V0W25Db250ZW50Q2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdICogb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVTaXplIC0gMSkgKiBvdXRTdHJpZGVdOworICAgICAgICAgICAgLyogVXBkYXRlIHNpZ25hbGxpbmcgKi8KKyAgICAgICAgICAgIEZES19BU1NFUlQoaW5PZmZzZXRUYWJsZVtvdXRDaF0gPCBudW1JbkNoYW5uZWxzKTsKKyAgICAgICAgICAgIEZES19BU1NFUlQob3V0T2Zmc2V0VGFibGVbb3V0Q2hdIDwgbnVtT3V0Q2hhbm5lbHMpOworICAgICAgICAgICAgY2hhbm5lbFR5cGVbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdXSA9IGluQ2hUeXBlc1tpbk9mZnNldFRhYmxlW2NoXV07CisgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tvdXRPZmZzZXRUYWJsZVtvdXRDaF1dID0KKyAgICAgICAgICAgICAgICBpbkNoSW5kaWNlc1tpbk9mZnNldFRhYmxlW2NoXV07CisgICAgICAgICAgICBpbk9mZnNldFRhYmxlW2NoXSA9IDI1NTsKKyAgICAgICAgICAgIG91dE9mZnNldFRhYmxlW291dENoXSA9IDI1NTsKKyAgICAgICAgICAgIG5Db250ZW50Q2ggKz0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogU2V0IHRoZSByZW1haW5pbmcgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAqLworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCAoOCk7IGNoICs9IDEpIHsKKyAgICAgICAgICBpZiAob3V0T2Zmc2V0VGFibGVbY2hdIDwgMjU1KSB7CisgICAgICAgICAgICBwT3V0W25Db250ZW50Q2ggKyBuRW1wdHlDaF0gPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtjaF0gKiBvZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lU2l6ZSAtIDEpICogb3V0U3RyaWRlXTsKKyAgICAgICAgICAgIC8qIEV4cGFuZCBvdXRwdXQgc2lnbmFsbGluZyAqLworICAgICAgICAgICAgY2hhbm5lbFR5cGVbb3V0T2Zmc2V0VGFibGVbY2hdXSA9IEFDVF9OT05FOworICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbb3V0T2Zmc2V0VGFibGVbY2hdXSA9IChVQ0hBUiluRW1wdHlDaDsKKyAgICAgICAgICAgIG91dE9mZnNldFRhYmxlW2NoXSA9IDI1NTsKKyAgICAgICAgICAgIG5FbXB0eUNoICs9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBTZXQgdGhlIHJlbWFpbmluZyBvdXRwdXQgY2hhbm5lbCBwb2ludGVyICovCisgICAgICAgIGZvciAoY2ggPSBuQ29udGVudENoOyBjaCA8IG51bU91dENoYW5uZWxzOyBjaCArPSAxKSB7CisgICAgICAgICAgcE91dFtjaF0gPSAmcFBjbUJ1ZltjaCAqIG9mZnNldCArIChmcmFtZVNpemUgLSAxKSAqIG91dFN0cmlkZV07CisgICAgICAgICAgLyogRXhwYW5kIG91dHB1dCBzaWduYWxsaW5nICovCisgICAgICAgICAgY2hhbm5lbFR5cGVbY2hdID0gQUNUX05PTkU7CisgICAgICAgICAgY2hhbm5lbEluZGljZXNbY2hdID0gKFVDSEFSKW5FbXB0eUNoOworICAgICAgICAgIG5FbXB0eUNoICs9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogRmlyc3QgY29weSB0aGUgY2hhbm5lbHMgdGhhdCBoYXZlIHNpZ25hbCAqLworICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSArPSAxKSB7CisgICAgICAgIERNWF9QQ00gdEluWyg4KV07CisgICAgICAgIC8qIFJlYWQgYWxsIGNoYW5uZWwgc2FtcGxlcyAqLworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ29udGVudENoOyBjaCArPSAxKSB7CisgICAgICAgICAgdEluW2NoXSA9ICpwSW5bY2hdOworICAgICAgICAgIHBJbltjaF0gLT0gaW5TdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgLyogV3JpdGUgYWxsIGNoYW5uZWwgc2FtcGxlcyAqLworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ29udGVudENoOyBjaCArPSAxKSB7CisgICAgICAgICAgKnBPdXRbY2hdID0gdEluW2NoXTsKKyAgICAgICAgICBwT3V0W2NoXSAtPSBvdXRTdHJpZGU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ2xlYXIgYWxsIHRoZSBvdGhlciBjaGFubmVscyAqLworICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CisgICAgICAgIGZvciAoY2ggPSBuQ29udGVudENoOyBjaCA8IG51bU91dENoYW5uZWxzOyBjaCArPSAxKSB7CisgICAgICAgICAgKnBPdXRbY2hdID0gKERNWF9QQ00pMDsKKyAgICAgICAgICBwT3V0W2NoXSAtPSBvdXRTdHJpZGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1cGRhdGUgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KKyAgICAqbkNoYW5uZWxzID0gbnVtT3V0Q2hhbm5lbHM7CisgIH0gLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorICAgICAgIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgIGVsc2UgaWYgKG51bUluQ2hhbm5lbHMgPT0gbnVtT3V0Q2hhbm5lbHMpIHsKKyAgICAvKiBEb24ndCBuZWVkIHRvIGNoYW5nZSB0aGUgY2hhbm5lbCBkZXNjcmlwdGlvbiBoZXJlICovCisKKyAgICBzd2l0Y2ggKG51bUluQ2hhbm5lbHMpIHsKKyAgICAgIGNhc2UgMjogeyAvKiBTZXQgdXAgY2hhbm5lbCBwb2ludGVyICovCisgICAgICAgIERNWF9QQ00gKnBJblBjbVsoOCldOworICAgICAgICBETVhfUENNICpwT3V0TCwgKnBPdXRSOworICAgICAgICBGSVhQX0RNWCBmbGV2OworCisgICAgICAgIFVJTlQgc2FtcGxlOworCisgICAgICAgIGlmIChmSW50ZXJsZWF2ZWQpIHsKKyAgICAgICAgICBpblN0cmlkZSA9IG51bUluQ2hhbm5lbHM7CisgICAgICAgICAgb3V0U3RyaWRlID0KKyAgICAgICAgICAgICAgMjsgLyogZml4ZWQgISEhIChiZWxvdyBzdGVyZW8gaXMgZG9ud21peGVkIHRvIG1vbm8gaWYgcmVxdWlyZWQgKi8KKyAgICAgICAgICBvZmZzZXQgPSAxOyAvKiBDaGFubmVsIHNwZWNpZmljIG9mZnNldCBmYWN0b3IgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpblN0cmlkZSA9IDE7CisgICAgICAgICAgb3V0U3RyaWRlID0gMTsKKyAgICAgICAgICBvZmZzZXQgPSBmcmFtZVNpemU7IC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IGlucHV0IGNoYW5uZWwgcG9pbnRlciAqLworICAgICAgICBwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSA9CisgICAgICAgICAgICAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW0xFRlRfRlJPTlRfQ0hBTk5FTF0gKiBvZmZzZXRdOworICAgICAgICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gPQorICAgICAgICAgICAgJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtSSUdIVF9GUk9OVF9DSEFOTkVMXSAqIG9mZnNldF07CisKKyAgICAgICAgLyogU2V0IG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKHNhbWUgYXMgaW5wdXQpICovCisgICAgICAgIHBPdXRMID0gcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF07CisgICAgICAgIHBPdXRSID0gcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdOworCisgICAgICAgIC8qIFNldCBkb3dubWl4IGxldmVsczogKi8KKyAgICAgICAgZmxldiA9IEZMMkZYQ09OU1RfRE1YKDAuNzA3MTA2NzhmKTsKKyAgICAgICAgLyogMi8wIGlucHV0OiAqLworICAgICAgICBzd2l0Y2ggKGR1YWxDaGFubmVsTW9kZSkgeworICAgICAgICAgIGNhc2UgQ0gxX01PREU6IC8qIEwnID0gMC43MDcgKiBDaDE7ICBSJyA9IDAuNzA3ICogQ2gxICovCisgICAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKKyAgICAgICAgICAgICAgKnBPdXRMID0gKnBPdXRSID0gKERNWF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoCisgICAgICAgICAgICAgICAgICBmTXVsdCgoRE1YX1BDTUYpKnBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdLCBmbGV2KSwKKyAgICAgICAgICAgICAgICAgIERGUkFDVF9CSVRTIC0gRE1YX1BDTV9CSVRTLCBETVhfUENNX0JJVFMpOworCisgICAgICAgICAgICAgIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOworICAgICAgICAgICAgICBwT3V0TCArPSBvdXRTdHJpZGU7CisgICAgICAgICAgICAgIHBPdXRSICs9IG91dFN0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0gyX01PREU6IC8qIEwnID0gMC43MDcgKiBDaDI7ICBSJyA9IDAuNzA3ICogQ2gyICovCisgICAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKKyAgICAgICAgICAgICAgKnBPdXRMID0gKnBPdXRSID0gKERNWF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoCisgICAgICAgICAgICAgICAgICBmTXVsdCgoRE1YX1BDTUYpKnBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSwgZmxldiksCisgICAgICAgICAgICAgICAgICBERlJBQ1RfQklUUyAtIERNWF9QQ01fQklUUywgRE1YX1BDTV9CSVRTKTsKKworICAgICAgICAgICAgICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7CisgICAgICAgICAgICAgIHBPdXRMICs9IG91dFN0cmlkZTsKKyAgICAgICAgICAgICAgcE91dFIgKz0gb3V0U3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBNSVhFRF9NT0RFOiAvKiBMJyA9IDAuNSpDaDEgKyAwLjUqQ2gyOyAgUicgPSAwLjUqQ2gxICsgMC41KkNoMiAqLworICAgICAgICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CisgICAgICAgICAgICAgICpwT3V0TCA9ICpwT3V0UiA9ICgqcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0gPj4gMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSA+PiAxKTsKKworICAgICAgICAgICAgICBwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSArPSBpblN0cmlkZTsKKyAgICAgICAgICAgICAgcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOworICAgICAgICAgICAgICBwT3V0TCArPSBvdXRTdHJpZGU7CisgICAgICAgICAgICAgIHBPdXRSICs9IG91dFN0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY2FzZSBTVEVSRU9fTU9ERToKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiAoZXJyb3JTdGF0dXMpOworfQorCisvKiogQ2xvc2UgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgaGFuZGxlIG9mIHRoZSBpbnN0YW5jZS4KKyAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfQ2xvc2UoSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZikgeworICBpZiAocFNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgfQorCisgIEZyZWVQY21EbXhJbnN0YW5jZShwU2VsZik7CisgICpwU2VsZiA9IE5VTEw7CisKKyAgcmV0dXJuIChQQ01ETVhfT0spOworfQorCisvKiogR2V0IGxpYnJhcnkgaW5mbyBmb3IgdGhpcyBtb2R1bGUuCisgKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgTElCX0lORk8gc3RydWN0dXJlLgorICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgorICovCitQQ01ETVhfRVJST1IgcGNtRG14X0dldExpYkluZm8oTElCX0lORk8gKmluZm8pIHsKKyAgaW50IGk7CisKKyAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgIHJldHVybiBQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorCisgIC8qIFNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLworICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKKyAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpIGJyZWFrOworICB9CisgIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgeworICAgIHJldHVybiBQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorCisgIC8qIEFkZCB0aGUgbGlicmFyeSBpbmZvICovCisgIGluZm9baV0ubW9kdWxlX2lkID0gRkRLX1BDTURNWDsKKyAgaW5mb1tpXS52ZXJzaW9uID0KKyAgICAgIExJQl9WRVJTSU9OKFBDTVVUSUxfTElCX1ZMMCwgUENNVVRJTF9MSUJfVkwxLCBQQ01VVElMX0xJQl9WTDIpOworICBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbyArIGkpOworICBpbmZvW2ldLmJ1aWxkX2RhdGUgPSBQQ01VVElMX0xJQl9CVUlMRF9EQVRFOworICBpbmZvW2ldLmJ1aWxkX3RpbWUgPSBQQ01VVElMX0xJQl9CVUlMRF9USU1FOworICBpbmZvW2ldLnRpdGxlID0gUENNRE1YX0xJQl9USVRMRTsKKworICAvKiBTZXQgZmxhZ3MgKi8KKyAgaW5mb1tpXS5mbGFncyA9IDAgfCBDQVBGX0RNWF9CTElORCAvKiBBdCBsZWFzdCBibGluZCBkb3dubWl4aW5nIGlzIHBvc3NpYmxlICovCisgICAgICAgICAgICAgICAgICB8IENBUEZfRE1YX1BDRSAgICAgLyogR3VpZGVkIGRvd25taXggd2l0aCBkYXRhIGZyb20gTVBFRy0yLzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtIENvbmZpZyBFbGVtZW50cyAoUENFKS4gKi8KKyAgICAgICAgICAgICAgICAgIHwgQ0FQRl9ETVhfQVJJQiAvKiBQQ0UgZ3VpZGVkIGRvd25taXggd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhdGlvbnMgYW5kIGxldmVscy4gKi8KKyAgICAgICAgICAgICAgICAgIHwgQ0FQRl9ETVhfRFZCICAvKiBHdWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBEVkIgYW5jaWxsYXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBmaWVsZHMuICovCisgICAgICAgICAgICAgICAgICB8IENBUEZfRE1YX0NIX0VYUCAvKiBTaW1wbGUgdXBtaXhpbmcgYnkgZHVibGljYXRpbmcgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFkZGluZyB6ZXJvIGNoYW5uZWxzLiAqLworICAgICAgICAgICAgICAgICAgfCBDQVBGX0RNWF82X0NIIHwgQ0FQRl9ETVhfOF9DSDsKKworICAvKiBBZGQgbGliIGluZm8gZm9yIEZESyB0b29scyAoaWYgbm90IHlldCBkb25lKS4gKi8KKyAgRkRLX3Rvb2xzR2V0TGliSW5mbyhpbmZvKTsKKworICByZXR1cm4gUENNRE1YX09LOworfQpkaWZmIC0tZ2l0IGEvbGliUENNdXRpbHMvc3JjL3BjbXV0aWxzX2xpYi5jcHAgYi9saWJQQ011dGlscy9zcmMvcGNtdXRpbHNfbGliLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwM2QxNi4uMDAwMDAwMAotLS0gYS9saWJQQ011dGlscy9zcmMvcGNtdXRpbHNfbGliLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1MTAgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGREsgUENNIHV0aWxzIG1vZHVsZSAgKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCi0gICBEZXNjcmlwdGlvbjogRGVmaW5lcyBmdW5jdGlvbnMgdGhhdCBwZXJmb3JtIGRvd25taXhpbmcgb3IgYSBzaW1wbGUgY2hhbm5lbAotICAgICAgICAgICAgICAgIGV4cGFuc2lvbiBpbiB0aGUgUENNIHRpbWUgZG9tYWluLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX2xpbnV4X18KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJwY211dGlsc19saWIuaCIKLQotI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCi0jaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgotI2luY2x1ZGUgIkZES19jb3JlLmgiCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKLSAqICBHTE9CQUwgU0VUVElOR1MgKEdGUik6ICAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgRFNFX01FVEFEQVRBX0VOQUJMRSAgICAgICAgICAvKiE8IEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgTVBFRy9FVFNJIERWQiBhbmNpbGxhcnkgZGF0YSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgYXNzaXN0ZWQgZG93bm1peGluZyBvZiBNUEVHLTQgQUFDIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFRy0xLzIgbGF5ZXIgMiBzdHJlYW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUENFX01FVEFEQVRBX0VOQUJMRSAgICAgICAgICAvKiE8IEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgTVBFRyBtYXRyaXggbWl4ZG93biB3aXRoIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50IGNhcnJpZWQgaW4gdGhlIFBDRS4gICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMgICAgICAgICAgKCA4ICkgICAvKiBOZWl0aGVyIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnB1dCBub3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAuLi4gKi8KLSNkZWZpbmUgUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTICAgICAgICAgKCA4ICkgICAvKiAuLi4gbXVzdCBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHRoYXQgdGhlIGZyYW1ld29yayBjYW4gaGFuZGxlLiAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgotICogICAgU1BFQ0lGSUMgU0VUVElOR1M6ICAgICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBQQ01fQ0hBTk5FTF9FWFRFTlNJT05fRU5BQkxFICAgICAgICAgICAgIC8qITwgQWxsb3cgbW9kdWxlIHRvIGR1cGxpY2F0ZSBtb25vIHNpZ25hbHMgb3IgYWRkIHplcm8gY2hhbm5lbHMgdG8gYWNoaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWQgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gKi8KLQotI2RlZmluZSBQQ01fRE1YX0RGTFRfTUFYX09VVF9DSEFOTkVMUyAgICAoIDYgKSAgIC8qITwgVGhlIG1heGltdW0gbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gSWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAwIHRoZSBtb2R1bGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYXV0b21hdGljYWxseSBjcmVhdGUgYSBtaXhkb3duIGZvciBhbGwgaW5wdXQgc2lnbmFscyB3aXRoIG1vcmUgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gc3BlY2lmaWVkLiAqLwotI2RlZmluZSBQQ01fRE1YX0RGTFRfTUlOX09VVF9DSEFOTkVMUyAgICAoIDAgKSAgIC8qITwgVGhlIG1pbmltdW0gbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gSWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAwIHRoZSBtb2R1bGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgZG8gY2hhbm5lbCBleHRlbnNpb24gYXV0b21hdGljYWxseSBmb3IgYWxsIGlucHV0IHNpZ25hbHMgd2l0aCBsZXNzIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHNwZWNpZmllZC4gKi8KLSNkZWZpbmUgUENNX0RNWF9NQVhfREVMQVlfRlJBTUVTICAgICAgICAgKCAxICkgICAvKiE8IFRoZSBtYXhpbXVtIGRlbGF5IGZyYW1lcyB0byBhbGlnbiB0aGUgYml0c3RyZWFtcyBwYXlsb2FkIHdpdGggdGhlIFBDTSBvdXRwdXQuICovCi0jZGVmaW5lIFBDTV9ETVhfREZMVF9FWFBJUllfRlJBTUUgICAgICAgICggNTAgKSAgLyohPCBJZiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCB0aGUgbWl4ZG93biBjb2VmZmljaWVudHMgd2lsbCBleHBpcmUgYnkgZGVmYXVsdCBhZnRlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG51bWJlciBvZiBmcmFtZXMuIFRoZSB2YWx1ZSA1MCBjb3JyZXNwb25kcyB0byBhdCBsZWFzdCA1MDBtcyAoRkwgOTYwIEAgOTZrSHopICovCi0vKiAjZGVmaW5lIFBDTURNWF9ERUJVRyAqLwotCi0vKiBEZXJpdmVkIHNldHRpbmc6Ci0gKiAgIE5vIG5lZWQgdG8gZWRpdCBiZXlvbmQgdGhpcyBsaW5lLiAqLwotI2lmIGRlZmluZWQoRFNFX01FVEFEQVRBX0VOQUJMRSkgfHwgZGVmaW5lZChQQ0VfTUVUQURBVEFfRU5BQkxFKSB8fCBkZWZpbmVkKEFSSUJfTUlYRE9XTl9FTkFCTEUpCi0gI2RlZmluZSBQQ01fRE9XTk1JWF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmFsbHkgZW5hYmxlIGRvd24gbWl4aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2VuZGlmCi0jaWYgKFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTID4gMikgfHwgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+IDIpCi0gI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMUyAgICAgICAgICAgICggOCApCi0gI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyAgICAgICggNCApCi0gI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgIFBDTV9ETVhfTUFYX0NIQU5ORUxTICAgLyogQWxsIGNoYW5uZWxzIGNhbiBiZSBpbiBvbmUgZ3JvdXAgKi8KLSNlbHNlCi0gI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMUyAgICAgICAgICAgICggMyApICAgLyogTmVlZCB0byBhZGQgMSBiZWNhdXNlIHRoZXJlIGFyZSB0aHJlZSBjaGFubmVsIHBvc2l0aW9ucyBpbiBmaXJzdCBjaGFubmVsIGdyb3VwLiAqLwotICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgICAgICAoIDEgKSAgIC8qIE9ubHkgZnJvbnQgY2hhbm5lbHMgc3VwcG9ydGVkLiAqLwotICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICAoIDIgKSAgIC8qIFRoZSBtYXhpbXVtIG92ZXIgYWxsIGNoYW5uZWwgZ3JvdXBzICovCi0jZW5kaWYKLSNpZiAoUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMgPiBQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMpCi0gI2RlZmluZSBQQ01fRE1YX01BWF9JT19DSEFOTkVMUyAgUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMKLSNlbHNlCi0gI2RlZmluZSBQQ01fRE1YX01BWF9JT19DSEFOTkVMUyAgUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTCi0jZW5kaWYKLQotLyogRGVjb2RlciBsaWJyYXJ5IGluZm8gKi8KLSNkZWZpbmUgUENNRE1YX0xJQl9WTDAgMgotI2RlZmluZSBQQ01ETVhfTElCX1ZMMSA0Ci0jZGVmaW5lIFBDTURNWF9MSUJfVkwyIDIKLSNkZWZpbmUgUENNRE1YX0xJQl9USVRMRSAiUENNIERvd25taXggTGliIgotI2lmZGVmIF9fQU5EUk9JRF9fCi0jZGVmaW5lIFBDTURNWF9MSUJfQlVJTERfREFURSAiIgotI2RlZmluZSBQQ01ETVhfTElCX0JVSUxEX1RJTUUgIiIKLSNlbHNlCi0jZGVmaW5lIFBDTURNWF9MSUJfQlVJTERfREFURSBfX0RBVEVfXwotI2RlZmluZSBQQ01ETVhfTElCX0JVSUxEX1RJTUUgX19USU1FX18KLSNlbmRpZgotCi0KLS8qIEZpeGVkIGFuZCB1bmlxdWUgY2hhbm5lbCBncm91cCBpbmRpY2VzLgotICogVGhlIGxhc3QgZ3JvdXAgaW5kZXggaGFzIHRvIGJlIHNtYWxsZXIgdGhhbiBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUy4gKi8KLSNkZWZpbmUgQ0hfR1JPVVBfRlJPTlQgKCAwICkKLSNkZWZpbmUgQ0hfR1JPVVBfU0lERSAgKCAxICkKLSNkZWZpbmUgQ0hfR1JPVVBfUkVBUiAgKCAyICkKLSNkZWZpbmUgQ0hfR1JPVVBfTEZFICAgKCAzICkKLQotLyogVGhlIG9yZGVyaW5nIG9mIHRoZSBmb2xsb3dpbmcgZml4ZWQgY2hhbm5lbCBsYWJlbHMgaGFzIHRvIGJlIGluIE1QRUctNCBzdHlsZS4KLSAqIEZyb20gdGhlIGNlbnRlciB0byB0aGUgYmFjayB3aXRoIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgaW50ZXJsZWF2ZWQgKHN0YXJ0aW5nIHdpdGggbGVmdCkuCi0gKiBUaGUgbGFzdCBjaGFubmVsIGxhYmVsIGluZGV4IGhhcyB0byBiZSBzbWFsbGVyIHRoYW4gUENNX0RNWF9NQVhfQ0hBTk5FTFMuICovCi0jZGVmaW5lIENFTlRFUl9GUk9OVF9DSEFOTkVMICAgICggMCApICAgICAvKiBDICAqLwotI2RlZmluZSBMRUZUX0ZST05UX0NIQU5ORUwgICAgICAoIDEgKSAgICAgLyogTCAgKi8KLSNkZWZpbmUgUklHSFRfRlJPTlRfQ0hBTk5FTCAgICAgKCAyICkgICAgIC8qIFIgICovCi0jZGVmaW5lIExFRlRfUkVBUl9DSEFOTkVMICAgICAgICggMyApICAgICAvKiBMciAoYWthIGxlZnQgYmFjayBjaGFubmVsKSBvciBjZW50ZXIgYmFjayBjaGFubmVsICovCi0jZGVmaW5lIFJJR0hUX1JFQVJfQ0hBTk5FTCAgICAgICggNCApICAgICAvKiBSciAoYWthIHJpZ2h0IGJhY2sgY2hhbm5lbCkgKi8KLSNkZWZpbmUgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMICAgKCA1ICkgICAgIC8qIExmICovCi0jZGVmaW5lIExFRlRfTVVMVElQUlBTX0NIQU5ORUwgICggNiApICAgICAvKiBMZWZ0IG11bHRpcHVycG9zZSBjaGFubmVsICovCi0jZGVmaW5lIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMICggNyApICAgICAvKiBSaWdodCBtdWx0aXB1cnBvc2UgY2hhbm5lbCAqLwotCi0vKiBNb3JlIGNvbnN0YW50cyAqLwotI2RlZmluZSBPTkVfQ0hBTk5FTCAgICAgICAgICAgICAoIDEgKQotI2RlZmluZSBUV09fQ0hBTk5FTCAgICAgICAgICAgICAoIDIgKQotI2RlZmluZSBTSVhfQ0hBTk5FTCAgICAgICAgICAgICAoIDYgKQotI2RlZmluZSBFSUdIVF9DSEFOTkVMICAgICAgICAgICAoIDggKQotCi0jZGVmaW5lIFBDTURNWF9BX0lEWF9ERUZBVUxUICAgICggMiApCi0jZGVmaW5lIFBDTURNWF9CX0lEWF9ERUZBVUxUICAgICggMiApCi0jZGVmaW5lIFBDTURNWF9MRkVfSURYX0RFRkFVTFQgICggMTUgKQotI2RlZmluZSBQQ01ETVhfR0FJTl81X0RFRkFVTFQgICAoIDAgKQotI2RlZmluZSBQQ01ETVhfR0FJTl8yX0RFRkFVTFQgICAoIDAgKQotCi0jZGVmaW5lIFBDTURNWF9NQVhfSEVBRFJPT00gICAgICggMyApICAgICAvKiBEZWZpbmVzIHRoZSBtYXhpbXVtIFBDTSBzY2FsaW5nIGhlYWRyb29tIHRoYXQgY2FuIGJlIGRvbmUgYnkgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHByb2Nlc3Npbmcgc3RlcC4gVGhpcyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMC4gKi8KLQotI2RlZmluZSBGQUxTRSAgMAotI2RlZmluZSBUUlVFICAgMQotI2RlZmluZSBJTiAgICAgMAotI2RlZmluZSBPVVQgICAgMQotCi0vKiBUeXBlIGRlZmluaXRpb25zOiAqLwotI2lmbmRlZiBETVhfSElHSF9QUkVDSVNJT05fRU5BQkxFCi0gI2RlZmluZSBGSVhQX0RNWCAgICAgICAgICBGSVhQX1NHTAotICNkZWZpbmUgRlhfRE1YMkZYX0RCTCh4KSAgRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpKHgpKQotICNkZWZpbmUgRlhfREJMMkZYX0RNWCh4KSAgRlhfREJMMkZYX1NHTCh4KQotICNkZWZpbmUgRkwyRlhDT05TVF9ETVgoeCkgRkwyRlhDT05TVF9TR0woeCkKLSAjZGVmaW5lIE1BWFZBTF9ETVggICAgICAgIE1BWFZBTF9TR0wKLSAjZGVmaW5lIEZYX0RNWDJTSFJUKHgpICAgICgoU0hPUlQpKHgpKQotICNkZWZpbmUgRlhfRE1YMkZMKHgpICAgICAgRlhfREJMMkZMKEZYX0RNWDJGWF9EQkwoeCkpCi0jZWxzZQotICNkZWZpbmUgRklYUF9ETVggICAgICAgICAgRklYUF9EQkwKLSAjZGVmaW5lIEZYX0RNWDJGWF9EQkwoeCkgICgoRklYUF9EQkwpKHgpKQotICNkZWZpbmUgRlhfREJMMkZYX0RNWCh4KSAgKChGSVhQX0RCTCkoeCkKLSAjZGVmaW5lIEZMMkZYQ09OU1RfRE1YKHgpIEZMMkZYQ09OU1RfREJMKHgpCi0gI2RlZmluZSBNQVhWQUxfRE1YICAgICAgICBNQVhWQUxfREJMCi0gI2RlZmluZSBGWF9ETVgyU0hSVCh4KSAgICAoKFNIT1JUKSgoeCk+PkZSQUNUX0JJVFMpKQotICNkZWZpbmUgRlhfRE1YMkZMKHgpICAgICAgRlhfREJMMkZMKHgpCi0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiBjaGFubmVscyBwb3NpdGlvbnMgZm9yIGVhY2ggZ3JvdXAgaW4gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgotICogU2VlIHRoZSBjaGFubmVsIGxhYmVscyBhYm92ZS4gKi8KLXN0YXRpYyBjb25zdCBVQ0hBUiBtYXhDaEluR3JwW1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXSA9IHsKLSNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTFMgPiAzKQotICAzLCAwLCAyLCAxCi0jZWxzZQotICBQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAKLSNlbmRpZgotfTsKLQotLyogTGlzdCBvZiBwYWNrZWQgY2hhbm5lbCBtb2RlcyAqLwotdHlwZWRlZiBlbnVtCi17IC8qIENIX01PREVfPG51bUZyb250Q2g+XzxudW1TaWRlQ2g+XzxudW1CYWNrQ2g+XzxudW1MZkNoPiAqLwotICBDSF9NT0RFX1VOREVGSU5FRCA9IDB4MDAwMCwKLSAgLyogMSBjaGFubmVsICovCi0gIENIX01PREVfMV8wXzBfMCAgID0gMHgwMDAxLCAgIC8qIGNoQ2ZnIDEgKi8KLSAgLyogMiBjaGFubmVscyAqLwotICBDSF9NT0RFXzJfMF8wXzAgICA9IDB4MDAwMiwgICAvKiBjaENmZyAyICovCi0gIC8qIDMgY2hhbm5lbHMgKi8KLSAgQ0hfTU9ERV8zXzBfMF8wICAgPSAweDAwMDMsICAgLyogY2hDZmcgMyAqLwotICBDSF9NT0RFXzJfMF8xXzAgICA9IDB4MDEwMiwKLSAgQ0hfTU9ERV8yXzBfMF8xICAgPSAweDEwMDIsCi0gIC8qIDQgY2hhbm5lbHMgKi8KLSAgQ0hfTU9ERV8zXzBfMV8wICAgPSAweDAxMDMsICAgLyogY2hDZmcgNCAqLwotICBDSF9NT0RFXzJfMF8yXzAgICA9IDB4MDIwMiwKLSAgQ0hfTU9ERV8yXzBfMV8xICAgPSAweDExMDIsCi0gIENIX01PREVfNF8wXzBfMCAgID0gMHgwMDA0LAotICAvKiA1IGNoYW5uZWxzICovCi0gIENIX01PREVfM18wXzJfMCAgID0gMHgwMjAzLCAgIC8qIGNoQ2ZnIDUgKi8KLSAgQ0hfTU9ERV8yXzBfMl8xICAgPSAweDEyMDIsCi0gIENIX01PREVfM18wXzFfMSAgID0gMHgxMTAzLAotICBDSF9NT0RFXzNfMl8wXzAgICA9IDB4MDAyMywKLSAgQ0hfTU9ERV81XzBfMF8wICAgPSAweDAwMDUsCi0gIC8qIDYgY2hhbm5lbHMgKi8KLSAgQ0hfTU9ERV8zXzBfMl8xICAgPSAweDEyMDMsICAgLyogY2hDZmcgNiAqLwotICBDSF9NT0RFXzNfMl8wXzEgICA9IDB4MTAyMywKLSAgQ0hfTU9ERV8zXzJfMV8wICAgPSAweDAxMjMsCi0gIENIX01PREVfNV8wXzFfMCAgID0gMHgwMTA1LAotICBDSF9NT0RFXzZfMF8wXzAgICA9IDB4MDAwNiwKLSAgLyogNyBjaGFubmVscyAqLwotICBDSF9NT0RFXzJfMl8yXzEgICA9IDB4MTIyMiwKLSAgQ0hfTU9ERV8zXzBfM18xICAgPSAweDEzMDMsICAgLyogY2hDZmcgMTEgKi8KLSAgQ0hfTU9ERV8zXzJfMV8xICAgPSAweDExMjMsCi0gIENIX01PREVfM18yXzJfMCAgID0gMHgwMjIzLAotICBDSF9NT0RFXzNfMF8yXzIgICA9IDB4MjIwMywKLSAgQ0hfTU9ERV81XzBfMl8wICAgPSAweDAyMDUsCi0gIENIX01PREVfNV8wXzFfMSAgID0gMHgxMTA1LAotICBDSF9NT0RFXzdfMF8wXzAgICA9IDB4MDAwNywKLSAgLyogOCBjaGFubmVscyAqLwotICBDSF9NT0RFXzNfMl8yXzEgICA9IDB4MTIyMywKLSAgQ0hfTU9ERV8zXzBfNF8xICAgPSAweDE0MDMsICAgLyogY2hDZmcgMTIgKi8KLSAgQ0hfTU9ERV81XzBfMl8xICAgPSAweDEyMDUsICAgLyogY2hDZmcgNyArIDE0ICovCi0gIENIX01PREVfNV8yXzFfMCAgID0gMHgwMTI1LAotICBDSF9NT0RFXzNfMl8xXzIgICA9IDB4MjEyMywKLSAgQ0hfTU9ERV8yXzJfMl8yICAgPSAweDIyMjIsCi0gIENIX01PREVfM18wXzNfMiAgID0gMHgyMzAzLAotICBDSF9NT0RFXzhfMF8wXzAgICA9IDB4MDAwOAotCi19IFBDTV9ETVhfQ0hBTk5FTF9NT0RFOwotCi0KLS8qIFRoZXNlIGFyZSB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9ucyBsaW5rZWQgdG8KLSAgIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzIGdpdmUgYnkgdGhlIHVzZXI6ICovCi1zdGF0aWMgY29uc3QgUENNX0RNWF9DSEFOTkVMX01PREUgb3V0Q2hNb2RlVGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFMrMV0gPQotewotICBDSF9NT0RFX1VOREVGSU5FRCwKLSAgQ0hfTU9ERV8xXzBfMF8wLCAgLyogMSBjaGFubmVsICAqLwotICBDSF9NT0RFXzJfMF8wXzAsICAvKiAyIGNoYW5uZWxzICovCi0gIENIX01PREVfM18wXzBfMCAgIC8qIDMgY2hhbm5lbHMgKi8KLSNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTFMgPiAzKQotICxDSF9NT0RFXzNfMF8xXzAsICAvKiA0IGNoYW5uZWxzICovCi0gIENIX01PREVfM18wXzJfMCwgIC8qIDUgY2hhbm5lbHMgKi8KLSAgQ0hfTU9ERV8zXzBfMl8xLCAgLyogNiBjaGFubmVscyAqLwotICBDSF9NT0RFXzNfMF8zXzEsICAvKiA3IGNoYW5uZWxzICovCi0gIENIX01PREVfM18wXzRfMSAgIC8qIDggY2hhbm5lbHMgKi8KLSNlbmRpZgotfTsKLQotc3RhdGljIGNvbnN0IEZJWFBfRE1YIGFiTWl4THZsVmFsdWVUYWJbOF0gPQotewotICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLCAgIC8qIHNjYWxlZCBieSAxICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuODQxZiksCi0gIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksCi0gIEZMMkZYQ09OU1RfRE1YKDAuNTk2ZiksCi0gIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksCi0gIEZMMkZYQ09OU1RfRE1YKDAuNDIyZiksCi0gIEZMMkZYQ09OU1RfRE1YKDAuMzU1ZiksCi0gIEZMMkZYQ09OU1RfRE1YKDAuMGYpCi19OwotCi1zdGF0aWMgY29uc3QgRklYUF9ETVggbGZlTWl4THZsVmFsdWVUYWJbMTZdID0KLXsgLyogICAgICAgICAgICAgdmFsdWUsICAgICAgICBzY2FsZSAqLwotICBGTDJGWENPTlNUX0RNWCgwLjc5MDVmKSwgIC8qICAgICAyICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuNTAwMGYpLCAgLyogICAgIDIgKi8KLSAgRkwyRlhDT05TVF9ETVgoMC44Mzk1ZiksICAvKiAgICAgMSAqLwotICBGTDJGWENPTlNUX0RNWCgwLjcwNjVmKSwgIC8qICAgICAxICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuNTk0NWYpLCAgLyogICAgIDEgKi8KLSAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwgICAvKiAgICAgMSAqLwotICBGTDJGWENPTlNUX0RNWCgwLjg0MWYpLCAgIC8qICAgICAwICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksICAgLyogICAgIDAgKi8KLSAgRkwyRlhDT05TVF9ETVgoMC41OTZmKSwgICAvKiAgICAgMCAqLwotICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLCAgIC8qICAgICAwICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuMzE2ZiksICAgLyogICAgIDAgKi8KLSAgRkwyRlhDT05TVF9ETVgoMC4xNzhmKSwgICAvKiAgICAgMCAqLwotICBGTDJGWENPTlNUX0RNWCgwLjEwMGYpLCAgIC8qICAgICAwICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuMDMyZiksICAgLyogICAgIDAgKi8KLSAgRkwyRlhDT05TVF9ETVgoMC4wMTBmKSwgICAvKiAgICAgMCAqLwotICBGTDJGWENPTlNUX0RNWCgwLjAwMGYpICAgIC8qICAgICAwICovCi19OwotCi0KLQotI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKLSAgLyogTVBFRyBtYXRyaXggbWl4ZG93bjoKLSAgICAgIFNldCAxOiAgTCcgPSAoMSArIDJeLTAuNSArIEEgKV4tMSAqIFtMICsgQyAqIDJeLTAuNSArIEEgKiBMc107Ci0gICAgICAgICAgICAgIFInID0gKDEgKyAyXi0wLjUgKyBBICleLTEgKiBbUiArIEMgKiAyXi0wLjUgKyBBICogUnNdOwotCi0gICAgICBTZXQgMjogIEwnID0gKDEgKyAyXi0wLjUgKyAyQSApXi0xICogW0wgKyBDICogMl4tMC41IC0gQSAqIChMcyArIFJzKV07Ci0gICAgICAgICAgICAgIFInID0gKDEgKyAyXi0wLjUgKyAyQSApXi0xICogW1IgKyBDICogMl4tMC41ICsgQSAqIChMcyArIFJzKV07Ci0KLSAgICAgIE0gPSAoMyArIDJBKV4tMSAqIFtMICsgQyArIFIgKyBBKihMcyArIFJzKV07Ci0gICovCi0gIHN0YXRpYyBjb25zdCBGSVhQX0RNWCBtcGVnTWl4RG93bklkeDJDb2VmWzRdID0KLSAgewotICAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3MTA2NzhmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjVmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjM1MzU1MzM5ZiksCi0gICAgRkwyRlhDT05TVF9ETVgoMC4wZikKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgRklYUF9TR0wgbXBlZ01peERvd25JZHgyUHJlRmFjdFszXVs0XSA9Ci0gIHsgeyAgLyogU2V0IDE6ICovCi0gICAgRkwyRlhDT05TVF9ETVgoMC40MTQyMTM1NjIzNzMwOTUwZiksCi0gICAgRkwyRlhDT05TVF9ETVgoMC40NTMwODE4MzkzMjE5NzI4ZiksCi0gICAgRkwyRlhDT05TVF9ETVgoMC40ODUyODEzNzQyMzg1NzAzZiksCi0gICAgRkwyRlhDT05TVF9ETVgoMC41ODU3ODY0Mzc2MjY5MDUwZikKLSAgfSx7ICAvKiBTZXQgMjogKi8KLSAgICBGTDJGWENPTlNUX0RNWCgwLjMyMDM3NzI0MTAxNzA0MDdmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjM2OTM5ODA2MjUxODEyOTNmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjQxNDIxMzU2MjM3MzA5NTBmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjU4NTc4NjQzNzYyNjkwNTBmKQotICB9LHsgIC8qIE1vbm8gRE1YIHNldDogKi8KLSAgICBGTDJGWENPTlNUX0RNWCgwLjIyNjU0MDkxOTY2MDk4NjRmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjI1ZiksCi0gICAgRkwyRlhDT05TVF9ETVgoMC4yNjk3NTIxNDMzODk4MTc5ZiksCi0gICAgRkwyRlhDT05TVF9ETVgoMC4zMzMzMzMzMzMzMzMzMzMzZikgfQotICB9OwotI2VuZGlmICAvKiBQQ0VfTUVUQURBVEFfRU5BQkxFICovCi0KLQotI2RlZmluZSBUWVBFX05PTkUgICAgICAoIDB4MCApCi0jZGVmaW5lIFRZUEVfRFNFX0RBVEEgICggMHgxICkKLSNkZWZpbmUgVFlQRV9QQ0VfREFUQSAgKCAweDIgKQotCi10eXBlZGVmIHN0cnVjdAotewotICBVSU5UICAgdHlwZUZsYWdzOwotICAvKiBGcm9tIERTRSAqLwotICBVQ0hBUiAgY0xldklkeDsKLSAgVUNIQVIgIHNMZXZJZHg7Ci0gIFVDSEFSICBkbWl4SWR4QTsKLSAgVUNIQVIgIGRtaXhJZHhCOwotICBVQ0hBUiAgZG1peElkeExmZTsKLSAgVUNIQVIgIGRteEdhaW5JZHgyOwotICBVQ0hBUiAgZG14R2FpbklkeDU7Ci0jaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQotICAvKiBGcm9tIFBDRSAqLwotICBVQ0hBUiAgbWF0cml4TWl4ZG93bklkeDsKLSNlbmRpZgotICAvKiBBdHRyaWJ1dGVzOiAqLwotICBTQ0hBUiAgcHNldWRvU3Vycm91bmQ7ICAgICAgICAgICAgICAgLyohPCBJZiBzZXQgdG8gMSB0aGUgc2lnbmFsIGlzIHBzZXVkbyBzdXJyb3VuZCBjb21wYXRpYmxlLiBUaGUgdmFsdWUgMCB0ZWxscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGl0IGlzIG5vdC4gSWYgdGhlIHZhbHVlIGlzIC0xIHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAgKi8KLSAgVUlOVCAgIGV4cGlyeUNvdW50OyAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciB0byBtb25pdG9yIHRoZSBsaWZlIHRpbWUgb2YgYSBtZXRhIGRhdGEgc2V0LiAqLwotCi19IERNWF9CU19NRVRBX0RBVEE7Ci0KLS8qIERlZmF1bHQgbWV0YWRhdGEgKi8KLXN0YXRpYyBjb25zdCBETVhfQlNfTUVUQV9EQVRBICBkZmx0TWV0YURhdGEgPSB7Ci0gIDAsIDIsIDIsIDIsIDIsIDE1LCAwLCAwLAotI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKLSAgMCwKLSNlbmRpZgotICAtMSwgMAotfTsKLQotLyogRHluYW1pYyAodXNlcikgcGFyYW1zOgotICAgICBTZWUgdGhlIGRlZmluaXRpb24gb2YgUENNRE1YX1BBUkFNIGZvciBkZXRhaWxzIG9uIHRoZSBzcGVjaWZpYyBmaWVsZHMuICovCi10eXBlZGVmIHN0cnVjdAotewotICBVSU5UICAgZXhwaXJ5RnJhbWU7ICAgICAgICAgICAgICAgICAgIC8qITwgTGlua2VkIHRvIERNWF9CU19EQVRBX0VYUElSWV9GUkFNRSAgICAgICAqLwotICBEVUFMX0NIQU5ORUxfTU9ERSBkdWFsQ2hhbm5lbE1vZGU7ICAgIC8qITwgTGlua2VkIHRvIERNWF9EVUFMX0NIQU5ORUxfTU9ERSAgICAgICAgICAqLwotICBQU0VVRE9fU1VSUk9VTkRfTU9ERSBwc2V1ZG9TdXJyTW9kZTsgIC8qITwgTGlua2VkIHRvIERNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERSAgICAgICAqLwotICBTSE9SVCAgbnVtT3V0Q2hhbm5lbHNNaW47ICAgICAgICAgICAgIC8qITwgTGlua2VkIHRvIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTICAqLwotICBTSE9SVCAgbnVtT3V0Q2hhbm5lbHNNYXg7ICAgICAgICAgICAgIC8qITwgTGlua2VkIHRvIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTICAqLwotICBVQ0hBUiAgZnJhbWVEZWxheTsgICAgICAgICAgICAgICAgICAgIC8qITwgTGlua2VkIHRvIERNWF9CU19EQVRBX0RFTEFZICAgICAgICAgICAgICAqLwotCi19IFBDTV9ETVhfVVNFUl9QQVJBTVM7Ci0KLS8qIE1vZHVsZXMgbWFpbiBkYXRhIHN0cnVjdHVyZTogKi8KLXN0cnVjdCBQQ01fRE1YX0lOU1RBTkNFCi17Ci0gIC8qIE1ldGFkYXRhICovCi0gIERNWF9CU19NRVRBX0RBVEEgICAgIGJzTWV0YURhdGFbUENNX0RNWF9NQVhfREVMQVlfRlJBTUVTKzFdOwotICBQQ01fRE1YX1VTRVJfUEFSQU1TICB1c2VyUGFyYW1zOwotCi0gIFVDSEFSICBhcHBseVByb2Nlc3Npbmc7ICAgICAgICAgICAgICAvKiE8IEZsYWcgdG8gZW4tL2Rpc2FibGUgbW9kdWxlcyBwcm9jZXNzaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4IGNoYW5uZWwgbGltaXRpbmcgaXMgZG9uZSBpbmRlcGVuZGVudGx5LiAqLwotfTsKLQotLyogTWVtb3J5IGFsbG9jYXRpb24gbWFjcm8gKi8KLUNfQUxMT0NfTUVNX1NUQVRJQyhQY21EbXhJbnN0YW5jZSwgc3RydWN0IFBDTV9ETVhfSU5TVEFOQ0UsIDEpCi0KLQotLyoqIEV2YWx1YXRlIGEgZ2l2ZW4gY2hhbm5lbCBjb25maWd1cmF0aW9uIGFuZCBleHRyYWN0IGEgcGFja2VkIGNoYW5uZWwgbW9kZS4gSW4gYWRkaXRpb24gdGhlCi0gKiAgZnVuY3Rpb24gZ2VuZXJhdGVzIGEgY2hhbm5lbCBvZmZzZXQgdGFibGUgZm9yIHRoZSBtYXBwaW5nIHRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KLSAqICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnZlcnNlIHRvIHRoZSBnZXRDaGFubmVsRGVzY3JpcHRpb24oKSByb3V0aW5lLgotICogQHBhcmFtIFtpbl0gVGhlIHRvdGFsIG51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4KLSAqIEBwYXJhbSBbaW5dIEFycmF5IGhvbGRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlcyBmb3IgZWFjaCBjaGFubmVsLgotICogQHBhcmFtIFtpbl0gQXJyYXkgaG9sZGluZyB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kaWNlcyBmb3IgZWFjaCBjaGFubmVsLgotICogQHBhcmFtIFtvdXRdIEFycmF5IHdoZXJlIHRoZSBidWZmZXIgb2Zmc2V0cyBmb3IgZWFjaCBjaGFubmVsIGFyZSBzdG9yZWQgaW50by4KLSAqIEBwYXJhbSBbb3V0XSBUaGUgZ2VuZXJhdGVkIHBhY2tlZCBjaGFubmVsIG1vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBpbnB1dCBjb25maWd1cmF0aW9uLgotICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICoqLwotc3RhdGljCi1QQ01ETVhfRVJST1IgZ2V0Q2hhbm5lbE1vZGUgKAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KLSAgICAgICAgY29uc3QgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCi0gICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tdLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLwotICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdLCAgICAgLyogb3V0ICovCi0gICAgICAgIFBDTV9ETVhfQ0hBTk5FTF9NT0RFICAgICpjaE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KLSAgICAgICkKLXsKLSAgVUNIQVIgY2hJZHhbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUF07Ci0gIFVDSEFSIG51bUNoSW5HcnBbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdOyAvKiBUb3RhbCBudW0gb2YgY2hhbm5lbHMgcGVyIGdyb3VwIG9mIHRoZSBpbnB1dCBjb25maWcgKi8KLSAgVUNIQVIgbnVtQ2hGcmVlW1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXTsgIC8qIE51bWJlciBvZiBmcmVlIHNsb3RzIHBlciBncm91cCBpbiB0aGUgaW50ZXJuYWwgcmVwci4gKi8KLSAgVUNIQVIgaGFyZFRvUGxhY2VbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOyAgICAgIC8qIExpc3Qgb2YgY2hhbm5lbHMgbm90IG1hdGNoaW5nIHRoZSBpbnRlcm5hbCByZXByLiAqLwotICBVQ0hBUiBoMnBTb3J0SWR4W1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKLSAgUENNRE1YX0VSUk9SIGVyciA9IFBDTURNWF9PSzsKLSAgaW50ICAgY2gsIGdycElkeDsKLSAgaW50ICAgbnVtQ2hUb1BsYWNlID0gMDsKLQotICBGREtfQVNTRVJUKGNoYW5uZWxUeXBlICE9IE5VTEwpOwotICBGREtfQVNTRVJUKGNoYW5uZWxJbmRpY2VzICE9IE5VTEwpOwotICBGREtfQVNTRVJUKG9mZnNldFRhYmxlICE9IE5VTEwpOwotICBGREtfQVNTRVJUKGNoTW9kZSAhPSBOVUxMKTsKLQotICAvKiBGb3IgZGV0YWlscyBzZWUgSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksIDguNS4zIENoYW5uZWwgY29uZmlndXJhdGlvbiAqLwotICBGREttZW1jbGVhcihudW1DaEluR3JwLCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUypzaXplb2YoVUNIQVIpKTsKLSAgRkRLbWVtc2V0KG9mZnNldFRhYmxlLCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwotICBGREttZW1zZXQoY2hJZHgsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQKnNpemVvZihVQ0hBUikpOwotICBGREttZW1zZXQoaGFyZFRvUGxhY2UsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7Ci0gIEZES21lbXNldChoMnBTb3J0SWR4LCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwotICAvKiBHZXQgdGhlIHJlc3RyaWN0aW9ucyBvZiB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKi8KLSAgRkRLbWVtY3B5KG51bUNoRnJlZSwgbWF4Q2hJbkdycCwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMqc2l6ZW9mKFVDSEFSKSk7Ci0KLSAgKmNoTW9kZSA9IENIX01PREVfVU5ERUZJTkVEOwotCi0gIC8qIENhdGVnb3JpemUgY2hhbm5lbHMgKi8KLSAgZm9yIChjaCA9IDA7IGNoIDwgbnVtQ2hhbm5lbHM7IGNoICs9IDEpIHsKLSAgICBVQ0hBUiBjaEdycElkeCA9IGNoYW5uZWxJbmRpY2VzW2NoXTsKLSAgICBpbnQgaSA9IDAsIGo7Ci0KLSAgICBzd2l0Y2ggKGNoYW5uZWxUeXBlW2NoXSkgewotICAgIGNhc2UgQUNUX0ZST05UX1RPUDoKLSAgICAgIGNoR3JwSWR4ICs9IG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdOyAgLyogQXBwZW5kIGFmdGVyIG5vcm1hbCBwbGFpbiAqLwotICAgIGNhc2UgQUNUX0ZST05UOgotICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfRlJPTlQ7Ci0gICAgICBicmVhazsKLSNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQotICAgIGNhc2UgQUNUX1NJREVfVE9QOgotICAgICAgY2hHcnBJZHggKz0gbnVtQ2hJbkdycFtDSF9HUk9VUF9TSURFXTsgICAvKiBBcHBlbmQgYWZ0ZXIgbm9ybWFsIHBsYWluICovCi0gICAgY2FzZSBBQ1RfU0lERToKLSAgICAgIGdycElkeCA9IENIX0dST1VQX1NJREU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFDVF9CQUNLX1RPUDoKLSAgICAgIGNoR3JwSWR4ICs9IG51bUNoSW5HcnBbQ0hfR1JPVVBfUkVBUl07ICAgLyogQXBwZW5kIGFmdGVyIG5vcm1hbCBwbGFpbiAqLwotICAgIGNhc2UgQUNUX0JBQ0s6Ci0gICAgICBncnBJZHggPSBDSF9HUk9VUF9SRUFSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQ1RfTEZFOgotICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfTEZFOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgLyogRm91bmQgYSBjaGFubmVsIHRoYXQgY2FuIG5vdCBiZSBjYXRlZ29yaXplZCEgTW9zdCBsaWtlbHkgZHVlIHRvIGNvcnJ1cHQgaW5wdXQgc2lnbmFsbGluZy4KLSAgICAgICAgIFRoZSByZXNjdWUgc3RyYXRlZ3kgaXMgdG8gYXBwZW5kIGl0IHRvIHRoZSBmcm9udCBjaGFubmVscyAoPT4gaWdub3JlIGluZGV4KS4KLSAgICAgICAgIFRoaXMgY291bGQgY2F1c2Ugc3RyYW5nZSBiZWhhdmlvdXIgc28gcmV0dXJuIGFuIGVycm9yIHRvIHNpZ25hbCBpdC4gKi8KLSAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7Ci0gICAgICBncnBJZHggPSBDSF9HUk9VUF9GUk9OVDsKLSAgICAgIGNoR3JwSWR4ID0gbnVtQ2hhbm5lbHMgKyBudW1DaFRvUGxhY2U7Ci0gICAgICBudW1DaFRvUGxhY2UgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChudW1DaEluR3JwW2dycElkeF0gPCBQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVApIHsKLSAgICAgIC8qIFNvcnQgY2hhbm5lbHMgYnkgaW5kZXggKi8KLSAgICAgIHdoaWxlICggKGkgPCBudW1DaEluR3JwW2dycElkeF0pICYmIChjaEdycElkeCA+IGNoYW5uZWxJbmRpY2VzW2NoSWR4W2dycElkeF1baV1dKSApIHsKLSAgICAgICAgaSArPSAxOwotICAgICAgfQotICAgICAgZm9yIChqID0gbnVtQ2hJbkdycFtncnBJZHhdOyBqID4gaTsgaiAtPSAxKSB7Ci0gICAgICAgIGNoSWR4W2dycElkeF1bal0gPSBjaElkeFtncnBJZHhdW2otMV07Ci0gICAgICB9Ci0gICAgICBjaElkeFtncnBJZHhdW2ldID0gY2g7Ci0gICAgICBudW1DaEluR3JwW2dycElkeF0gKz0gMTsKLSAgICB9Ci0gIH0KLQotI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCi0gIEZES19BU1NFUlQoIChudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXStudW1DaEluR3JwW0NIX0dST1VQX1NJREVdCi0gICAgICAgICAgICAgICtudW1DaEluR3JwW0NIX0dST1VQX1JFQVJdK251bUNoSW5HcnBbQ0hfR1JPVVBfTEZFXSkgPT0gbnVtQ2hhbm5lbHMpOwotI2Vsc2UKLSAgRkRLX0FTU0VSVCggbnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gPT0gbnVtQ2hhbm5lbHMgKTsKLSNlbmRpZgotCi0gIC8qIENvbXBvc2UgY2hhbm5lbCBvZmZzZXQgdGFibGU6Ci0gICAqIE1hcCBhbGwgY2hhbm5lbHMgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiAqLwotICBudW1DaFRvUGxhY2UgPSAwOwotCi0gIC8qIE5vbi1zeW1tZXRyaWMgY2hhbm5lbHMgKi8KLSAgaWYgKG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdICYgMHgxKSB7Ci0gICAgLyogT2RkIG51bWJlciBvZiBmcm9udCBjaGFubmVscyAtPiB3ZSBoYXZlIGEgY2VudGVyIGNoYW5uZWwuCi0gICAgICAgSW4gTVBFRy00IHRoZSBjZW50ZXIgaGFzIHRoZSBpbmRleCAwLiAqLwotICAgIG9mZnNldFRhYmxlW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IGNoSWR4W0NIX0dST1VQX0ZST05UXVswXTsKLSAgICBudW1DaEZyZWVbQ0hfR1JPVVBfRlJPTlRdIC09IDE7Ci0gIH0KLQotICBmb3IgKGdycElkeCA9IDA7IGdycElkeCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTOyBncnBJZHggKz0gMSkgewotICAgIGludCBjaE1hcFBvcyA9IDA7Ci0gICAgY2ggPSAwOyAgLyogSW5kZXggb2YgY2hhbm5lbCB3aXRoaW4gdGhlIHNwZWNpZmljIGdyb3VwICovCi0KLSAgICBzd2l0Y2ggKGdycElkeCkgewotICAgIGNhc2UgQ0hfR1JPVVBfRlJPTlQ6Ci0gICAgICBjaE1hcFBvcyA9IExFRlRfRlJPTlRfQ0hBTk5FTDsKLSAgICAgIGNoID0gbnVtQ2hJbkdycFtncnBJZHhdICYgMHgxOwotICAgICAgYnJlYWs7Ci0jaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKLSAgICBjYXNlIENIX0dST1VQX1NJREU6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENIX0dST1VQX1JFQVI6Ci0gICAgICBjaE1hcFBvcyA9IExFRlRfUkVBUl9DSEFOTkVMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSF9HUk9VUF9MRkU6Ci0gICAgICBjaE1hcFBvcyA9IExPV19GUkVRVUVOQ1lfQ0hBTk5FTDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIEZES19BU1NFUlQoMCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvKiBNYXAgYWxsIGNoYW5uZWxzIG9mIHRoZSBncm91cCAqLwotICAgIGZvciAoIDsgY2ggPCBudW1DaEluR3JwW2dycElkeF07IGNoICs9IDEpIHsKLSAgICAgIGlmIChudW1DaEZyZWVbZ3JwSWR4XSA+IDApIHsKLSAgICAgICAgb2Zmc2V0VGFibGVbY2hNYXBQb3NdID0gY2hJZHhbZ3JwSWR4XVtjaF07Ci0gICAgICAgIGNoTWFwUG9zICs9IDE7Ci0gICAgICAgIG51bUNoRnJlZVtncnBJZHhdIC09IDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBBZGQgdG8gdGhlIGxpc3Qgb2YgaGFyZHNoaXAgY2FzZXMgY29uc2lkZXJpbmcgYSBNUEVHLWxpa2Ugc29ydGluZyBvcmRlcjogKi8KLSAgICAgICAgaW50IHBvcywgc29ydElkeCA9IGdycElkeCpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgKyBjaGFubmVsSW5kaWNlc1tjaElkeFtncnBJZHhdW2NoXV07Ci0gICAgICAgIGZvciAocG9zID0gbnVtQ2hUb1BsYWNlOyBwb3MgPiAwOyBwb3MgLT0gMSkgewotICAgICAgICAgIGlmIChoMnBTb3J0SWR4W3Bvcy0xXSA+IHNvcnRJZHgpIHsKLSAgICAgICAgICAgIGhhcmRUb1BsYWNlW3Bvc10gPSBoYXJkVG9QbGFjZVtwb3MtMV07Ci0gICAgICAgICAgICBoMnBTb3J0SWR4W3Bvc10gPSBoMnBTb3J0SWR4W3Bvcy0xXTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogSW5zZXJ0IGNoYW5uZWwgYXQgdGhlIGN1cnJlbnQgaW5kZXgvcG9zaXRpb24gKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBoYXJkVG9QbGFjZVtwb3NdID0gY2hJZHhbZ3JwSWR4XVtjaF07Ci0gICAgICAgIGgycFNvcnRJZHhbcG9zXSA9IHNvcnRJZHg7Ci0gICAgICAgIG51bUNoVG9QbGFjZSArPSAxOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHsgLyogQXNzaWduIHRoZSBoYXJkc2hpcCBjYXNlcyAqLwotICAgIGludCBjaE1hcFBvcyA9IDA7Ci0gICAgaW50IG1hcHBpbmdIZWF0ID0gMDsKLSAgICBmb3IgKGNoID0gMDsgY2ggPCBudW1DaFRvUGxhY2U7IGNoKz0xKSB7Ci0gICAgICBpbnQgY2hBc3NpZ25lZCA9IDA7Ci0KLSAgICAgIC8qIEp1c3QgYXNzaWduaW5nIHRoZSBjaGFubmVscyB0byB0aGUgbmV4dCBiZXN0IHNsb3QgY2FuIGxlYWQgdG8gdW5kZXNpcmVkIHJlc3VsdHMgKGVzcGVjaWFsbHkgZm9yIHgveC8xLngKLSAgICAgICAgIGNvbmZpZ3VyYXRpb25zKS4gVGh1cyB1c2UgdGhlIE1QRUctbGlrZSBzb3J0aW5nIGluZGV4IHRvIGZpbmQgdGhlIGJlc3QgZml0dGluZyBzbG90IGZvciBlYWNoIGNoYW5uZWwuCi0gICAgICAgICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSB0aGUgc29ydGluZyBpbmRleCB3aWxsIGJlIGlnbm9yZWQgKG1hcHBpbmdIZWF0ID49IDIpLiAqLwotICAgICAgZm9yICggOyBjaE1hcFBvcyA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaE1hcFBvcys9MSkgewotICAgICAgICBpZiAob2Zmc2V0VGFibGVbY2hNYXBQb3NdID09IDI1NSkgewotICAgICAgICAgIGludCBwcnZTb3J0SWR4ID0gMDsKLSAgICAgICAgICBpbnQgbnh0U29ydElkeCA9IChDSF9HUk9VUF9MRkUrMSkqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQOwotCi0gICAgICAgICAgaWYgKG1hcHBpbmdIZWF0IDwgMikgewotICAgICAgICAgICAgaWYgKGNoTWFwUG9zIDwgTEVGVF9SRUFSX0NIQU5ORUwpIHsKLSAgICAgICAgICAgICAgLyogR290IGZyb250IGNoYW5uZWwgc2xvdCAqLwotICAgICAgICAgICAgICBwcnZTb3J0SWR4ID0gQ0hfR1JPVVBfRlJPTlQqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICsgY2hNYXBQb3MgLSBDRU5URVJfRlJPTlRfQ0hBTk5FTDsKLSAgICAgICAgICAgICAgbnh0U29ydElkeCA9IENIX0dST1VQX1NJREUgKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoTWFwUG9zIDwgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMKSB7Ci0gICAgICAgICAgICAgIC8qIEdvdCBiYWNrIGNoYW5uZWwgc2xvdCAqLwotICAgICAgICAgICAgICBwcnZTb3J0SWR4ID0gQ0hfR1JPVVBfUkVBUipQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgKyBjaE1hcFBvcyAtIExFRlRfUkVBUl9DSEFOTkVMOwotICAgICAgICAgICAgICBueHRTb3J0SWR4ID0gQ0hfR1JPVVBfTEZFICpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaE1hcFBvcyA8IExFRlRfTVVMVElQUlBTX0NIQU5ORUwpIHsKLSAgICAgICAgICAgICAgLyogR290IGxmZSBjaGFubmVsIHNsb3QgKi8KLSAgICAgICAgICAgICAgcHJ2U29ydElkeCA9ICBDSF9HUk9VUF9MRkUgICAqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICsgY2hNYXBQb3MgLSBMT1dfRlJFUVVFTkNZX0NIQU5ORUw7Ci0gICAgICAgICAgICAgIG54dFNvcnRJZHggPSAoQ0hfR1JPVVBfTEZFKzEpKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBBc3NpZ24gdGhlIGNoYW5uZWwgb25seSBpZiBpdHMgc29ydCBpbmRleCBpcyB3aXRoaW4gdGhlIHJhbmdlICovCi0gICAgICAgICAgaWYgKCAoaDJwU29ydElkeFtjaF0gPj0gcHJ2U29ydElkeCkKLSAgICAgICAgICAgICYmIChoMnBTb3J0SWR4W2NoXSA8ICBueHRTb3J0SWR4KSApIHsKLSAgICAgICAgICAgIG9mZnNldFRhYmxlW2NoTWFwUG9zKytdID0gaGFyZFRvUGxhY2VbY2hdOwotICAgICAgICAgICAgY2hBc3NpZ25lZCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChjaEFzc2lnbmVkID09IDApIHsKLSAgICAgICAgY2hNYXBQb3MgPSAwOwotICAgICAgICBjaCAtPSAxOwotICAgICAgICBtYXBwaW5nSGVhdCArPSAxOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBDb21wb3NlIHRoZSBjaGFubmVsIG1vZGUgKi8KLSAgKmNoTW9kZSA9IChQQ01fRE1YX0NIQU5ORUxfTU9ERSkoIChudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSAmIDB4RikKLSNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG51bUNoSW5HcnBbQ0hfR1JPVVBfU0lERV0gICYgMHhGKSA8PCAgNAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG51bUNoSW5HcnBbQ0hfR1JPVVBfUkVBUl0gICYgMHhGKSA8PCAgOAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG51bUNoSW5HcnBbQ0hfR1JPVVBfTEZFXSAgICYgMHhGKSA8PCAxMgotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICByZXR1cm4gZXJyOwotfQotCi0KLS8qKiBHZW5lcmF0ZSBhIGNoYW5uZWwgb2Zmc2V0IHRhYmxlIGFuZCBjb21wbGV0ZSBjaGFubmVsIGRlc2NyaXB0aW9uIGZvciBhIGdpdmVuIChwYWNrZWQpIGNoYW5uZWwgbW9kZS4KLSAqICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnZlcnNlIHRvIHRoZSBnZXRDaGFubmVsTW9kZSgpIHJvdXRpbmUgYnV0IGRvZXMgbm90IHN1cHBvcnQgd2VpcmQgY2hhbm5lbAotICogIGNvbmZpZ3VyYXRpb25zLiBBbGwgY2hhbm5lbHMgaGF2ZSB0byBiZSBpbiB0aGUgbm9ybWFsIGhlaWdodCBsYXllciBhbmQgdGhlcmUgbXVzdCBub3QgYmUgbW9yZQotICogIGNoYW5uZWxzIGluIGVhY2ggZ3JvdXAgdGhhbiBnaXZlbiBieSBtYXhDaEluR3JwLgotICogQHBhcmFtIFtpbl0gVGhlIHBhY2tlZCBjaGFubmVsIG1vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gdG8gYmUgcHJvY2Vzc2VkLgotICogQHBhcmFtIFtpbl0gQXJyYXkgY29udGFpbmluZyB0aGUgY2hhbm5lbCBtYXBwaW5nIHRvIGJlIHVzZWQgKEZyb20gTVBFRyBQQ0Ugb3JkZXJpbmcgdG8gd2hhdGV2ZXIgaXMgcmVxdWlyZWQpLgotICogQHBhcmFtIFtvdXRdIEFycmF5IHdoZXJlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlcyBmb3IgZWFjaCBjaGFubmVscyBhcmUgc3RvcmVkIGludG8uCi0gKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kaWNlcyBmb3IgZWFjaCBvdXRwdXQgY2hhbm5lbCBhcmUgc3RvcmVkIGludG8uCi0gKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgdGhlIGJ1ZmZlciBvZmZzZXRzIGZvciBlYWNoIGNoYW5uZWwgYXJlIHN0b3JlZCBpbnRvLgotICogQHJldHVybnMgTm9uZS4KLSAqKi8KLXN0YXRpYwotdm9pZCBnZXRDaGFubmVsRGVzY3JpcHRpb24gKAotICAgICAgICBjb25zdCBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgY2hNb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCi0gICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgICAgICBjaGFubmVsTWFwcGluZ1tdWzhdLCAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KLSAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFICAgICAgICAgIGNoYW5uZWxUeXBlW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KLSAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW10sICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KLSAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSAgICAgICAvKiBvdXQgKi8KLSAgICAgICkKLXsKLSAgY29uc3QgVUNIQVIgKnBDaGFubmVsTWFwOwotICBpbnQgICBncnBJZHgsIGNoID0gMCwgbnVtQ2hhbm5lbHMgPSAwOwotICBVQ0hBUiBudW1DaEluR3JwW1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXTsKLQotICBGREtfQVNTRVJUKGNoYW5uZWxUeXBlICE9IE5VTEwpOwotICBGREtfQVNTRVJUKGNoYW5uZWxJbmRpY2VzICE9IE5VTEwpOwotICBGREtfQVNTRVJUKGNoYW5uZWxNYXBwaW5nICE9IE5VTEwpOwotICBGREtfQVNTRVJUKG9mZnNldFRhYmxlICE9IE5VTEwpOwotCi0gIC8qIEluaXQgb3V0cHV0IGFycmF5cyAqLwotICBGREttZW1jbGVhcihjaGFubmVsVHlwZSwgICAgUENNX0RNWF9NQVhfSU9fQ0hBTk5FTFMqc2l6ZW9mKEFVRElPX0NIQU5ORUxfVFlQRSkpOwotICBGREttZW1jbGVhcihjaGFubmVsSW5kaWNlcywgUENNX0RNWF9NQVhfSU9fQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7Ci0gIEZES21lbXNldChvZmZzZXRUYWJsZSwgMjU1LCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKLQotICAvKiBFeHRyYWN0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcGVyIGdyb3VwICovCi0gIG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdID0gIGNoTW9kZSAgICAgICAgJiAweEY7Ci0jaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKLSAgbnVtQ2hJbkdycFtDSF9HUk9VUF9TSURFXSAgPSAoY2hNb2RlID4+ICA0KSAmIDB4RjsKLSAgbnVtQ2hJbkdycFtDSF9HUk9VUF9SRUFSXSAgPSAoY2hNb2RlID4+ICA4KSAmIDB4RjsKLSAgbnVtQ2hJbkdycFtDSF9HUk9VUF9MRkVdICAgPSAoY2hNb2RlID4+IDEyKSAmIDB4RjsKLSNlbmRpZgotCi0gIC8qIFN1bW1lcml6ZSB0byBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiBjaGFubmVscyAqLwotICBmb3IgKGdycElkeCA9IDA7IGdycElkeCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTOyBncnBJZHggKz0gMSkgewotICAgIG51bUNoYW5uZWxzICs9IG51bUNoSW5HcnBbZ3JwSWR4XTsKLSAgfQotCi0gIC8qIEdldCB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbCBtYXAgKi8KLSAgc3dpdGNoIChjaE1vZGUpIHsKLSAgY2FzZSBDSF9NT0RFXzFfMF8wXzA6Ci0gIGNhc2UgQ0hfTU9ERV8yXzBfMF8wOgotICBjYXNlIENIX01PREVfM18wXzBfMDoKLSAgY2FzZSBDSF9NT0RFXzNfMF8xXzA6Ci0gIGNhc2UgQ0hfTU9ERV8zXzBfMl8wOgotICBjYXNlIENIX01PREVfM18wXzJfMToKLSAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nW251bUNoYW5uZWxzXTsKLSAgICBicmVhazsKLSAgY2FzZSBDSF9NT0RFXzNfMF8zXzE6Ci0gICAgcENoYW5uZWxNYXAgPSBjaGFubmVsTWFwcGluZ1sxMV07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQ0hfTU9ERV8zXzBfNF8xOgotICAgIHBDaGFubmVsTWFwID0gY2hhbm5lbE1hcHBpbmdbMTJdOwotICAgIGJyZWFrOwotICBjYXNlIENIX01PREVfNV8wXzJfMToKLSAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nWzddOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIC8qIGZhbGxiYWNrICovCi0gICAgcENoYW5uZWxNYXAgPSBjaGFubmVsTWFwcGluZ1swXTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIENvbXBvc2UgY2hhbm5lbCBvZmZzZXQgdGFibGUgKi8KLQotICAvKiBOb24tc3ltbWV0cmljIGNoYW5uZWxzICovCi0gIGlmIChudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSAmIDB4MSkgewotICAgIC8qIE9kZCBudW1iZXIgb2YgZnJvbnQgY2hhbm5lbHMgLT4gd2UgaGF2ZSBhIGNlbnRlciBjaGFubmVsLgotICAgICAgIEluIE1QRUctNCB0aGUgY2VudGVyIGhhcyB0aGUgaW5kZXggMC4gKi8KLSAgICBpbnQgbWFwcGVkSWR4ID0gcENoYW5uZWxNYXBbY2hdOwotICAgIG9mZnNldFRhYmxlW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IG1hcHBlZElkeDsKLSAgICBjaGFubmVsVHlwZVttYXBwZWRJZHhdICAgID0gQUNUX0ZST05UOwotICAgIGNoYW5uZWxJbmRpY2VzW21hcHBlZElkeF0gPSAwOwotICAgIGNoICs9IDE7Ci0gIH0KLQotICBmb3IgKGdycElkeCA9IDA7IGdycElkeCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTOyBncnBJZHggKz0gMSkgewotICAgIEFVRElPX0NIQU5ORUxfVFlQRSB0eXBlID0gQUNUX05PTkU7Ci0gICAgaW50IGNoTWFwUG9zID0gMCwgbWF4Q2hhbm5lbHMgPSAwOwotICAgIGludCBjaElkeCA9IDA7ICAvKiBJbmRleCBvZiBjaGFubmVsIHdpdGhpbiB0aGUgc3BlY2lmaWMgZ3JvdXAgKi8KLQotICAgIHN3aXRjaCAoZ3JwSWR4KSB7Ci0gICAgY2FzZSBDSF9HUk9VUF9GUk9OVDoKLSAgICAgIHR5cGUgPSBBQ1RfRlJPTlQ7Ci0gICAgICBjaE1hcFBvcyA9IExFRlRfRlJPTlRfQ0hBTk5FTDsKLSAgICAgIG1heENoYW5uZWxzID0gMzsKLSAgICAgIGNoSWR4ID0gbnVtQ2hJbkdycFtncnBJZHhdICYgMHgxOwotICAgICAgYnJlYWs7Ci0jaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKLSAgICBjYXNlIENIX0dST1VQX1NJREU6Ci0gICAgICAvKiBBbHdheXMgbWFwIHNpZGUgY2hhbm5lbHMgdG8gdGhlIG11bHRpcHVycG9zZSBncm91cC4gKi8KLSAgICAgIHR5cGUgPSBBQ1RfU0lERTsKLSAgICAgIGNoTWFwUG9zID0gTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hfR1JPVVBfUkVBUjoKLSAgICAgIHR5cGUgPSBBQ1RfQkFDSzsKLSAgICAgIGNoTWFwUG9zID0gTEVGVF9SRUFSX0NIQU5ORUw7Ci0gICAgICBtYXhDaGFubmVscyA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENIX0dST1VQX0xGRToKLSAgICAgIHR5cGUgPSBBQ1RfTEZFOwotICAgICAgY2hNYXBQb3MgPSBMT1dfRlJFUVVFTkNZX0NIQU5ORUw7Ci0gICAgICBtYXhDaGFubmVscyA9IDE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBNYXAgYWxsIGNoYW5uZWxzIGluIHRoaXMgZ3JvdXAgKi8KLSAgICBmb3IgKCA7IGNoSWR4IDwgbnVtQ2hJbkdycFtncnBJZHhdOyBjaElkeCArPSAxKSB7Ci0gICAgICBpbnQgbWFwcGVkSWR4ID0gcENoYW5uZWxNYXBbY2hdOwotICAgICAgaWYgKGNoSWR4ID09IG1heENoYW5uZWxzKSB7Ci0gICAgICAgIC8qIE5vIHNwYWNlIGxlZnQgaW4gdGhpcyBjaGFubmVsIGdyb3VwIQotICAgICAgICAgICBVc2UgdGhlIG11bHRpcHVycG9zZSBncm91cCBpbnN0ZWFkOiAqLwotICAgICAgICBjaE1hcFBvcyA9IExFRlRfTVVMVElQUlBTX0NIQU5ORUw7Ci0gICAgICB9Ci0gICAgICBvZmZzZXRUYWJsZVtjaE1hcFBvc10gICAgID0gbWFwcGVkSWR4OwotICAgICAgY2hhbm5lbFR5cGVbbWFwcGVkSWR4XSAgICA9IHR5cGU7Ci0gICAgICBjaGFubmVsSW5kaWNlc1ttYXBwZWRJZHhdID0gY2hJZHg7Ci0gICAgICBjaE1hcFBvcyArPSAxOwotICAgICAgY2ggKz0gMTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBpbml0aWFsaXplcwotICogIG9uZSByb3cgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeCAoY29ycmVzcG9uZGluZyB0byBvbmUgb3V0cHV0IGNoYW5uZWwpLgotICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguCi0gKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peCBmYWN0b3JzLgotICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgY2hhbm5lbCAocm93KSB0byBiZSBpbml0aWFsaXplZC4KLSAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgotICoqLwotc3RhdGljCi12b2lkIGRteEluaXRDaGFubmVsKAotICAgICAgICBGSVhQX0RNWCAgICAgICAgICAgIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBvdXRDaAotICAgICAgICkKLXsKLSAgdW5zaWduZWQgaW50IGluQ2g7Ci0gIGZvciAoaW5DaD0wOyBpbkNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGluQ2grPTEpIHsKLSAgICBpZiAoaW5DaCA9PSBvdXRDaCkgewotICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPSBGTDJGWENPTlNUX0RNWCgwLjVmKTsKLSAgICAgIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPSBGTDJGWENPTlNUX0RNWCgwLjBmKTsKLSAgICAgIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gID0gMDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBkb2VzIGEgcmVzZXQKLSAqICBvZiBvbmUgcm93IGluIGEgZ2l2ZW4gZG93bm1peCBtYXRyaXggKGNvcnJlc3BvbmRpbmcgdG8gb25lIG91dHB1dCBjaGFubmVsKS4KLSAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgotICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXggZmFjdG9ycy4KLSAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIGNoYW5uZWwgKHJvdykgdG8gYmUgY2xlYXJlZC9yZXNldC4KLSAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgotICoqLwotc3RhdGljCi12b2lkIGRteENsZWFyQ2hhbm5lbCgKLSAgICAgICAgRklYUF9ETVggICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWl4U2NhbGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCi0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgb3V0Q2gKLSAgICAgICApCi17Ci0gIEZES21lbWNsZWFyKCZtaXhGYWN0b3JzW291dENoXSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfRE1YKSk7Ci0gIEZES21lbWNsZWFyKCZtaXhTY2FsZXNbb3V0Q2hdLCAgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKElOVCkpOwotfQotCi0vKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGFwcGxpZXMgYSBzb3VyY2UgY2hhbm5lbCAocm93KQotICogIHNjYWxlZCBieSBhIGdpdmVuIG1peCBmYWN0b3IgdG8gYSBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpIGluIGEgZ2l2ZW4gZG93bm1peCBtYXRyaXguCi0gKiAgRXhpc3RpbmcgbWl4IGZhY3RvcnMgb2YgdGhlIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykgd2lsbCBnZXQgb3ZlcndyaXR0ZW4uCi0gKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KLSAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gc2NhbGUgZmFjdG9yIG1hdHJpeCBhc3NvY2lhdGVkIHRvIHRoZSBkb3dubWl4IGZhY3RvcnMuCi0gKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBzb3VyY2UgY2hhbm5lbCAocm93KS4KLSAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykuCi0gKiBAcGFyYW0gW2luXSAgICBGaXhlZC1wb2ludCBwYXJ0IG9mIG1peCBmYWN0b3IgdG8gYmUgYXBwbGllZC4KLSAqIEBwYXJhbSBbaW5dICAgIFNjYWxlIGZhY3RvciBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCi0gKiBAcmV0dXJucyAgICAgICBOb3RoaW5nIHRvIHJldHVybi4KLSAqKi8KLXN0YXRpYwotdm9pZCBkbXhTZXRDaGFubmVsKAotICAgICAgICBGSVhQX0RNWCAgICAgICAgICAgIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBkc3RDaCwKLSAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBzcmNDaCwKLSAgICAgICAgY29uc3QgRklYUF9ETVggICAgICBmYWN0b3IsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgc2NhbGUKLSAgICAgICApCi17Ci0gIGludCBjaDsKLSAgZm9yIChjaD0wOyBjaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaCs9MSkgewotICAgIGlmIChtaXhGYWN0b3JzW3NyY0NoXVtjaF0gIT0gKEZJWFBfRE1YKTApIHsKLSAgICAgIG1peEZhY3RvcnNbZHN0Q2hdW2NoXSA9IEZYX0RCTDJGWF9ETVgoZk11bHQobWl4RmFjdG9yc1tzcmNDaF1bY2hdLCBmYWN0b3IpKTsKLSAgICAgIG1peFNjYWxlc1tkc3RDaF1bY2hdICA9IG1peFNjYWxlc1tzcmNDaF1bY2hdICsgc2NhbGU7Ci0gICAgfQotICB9Ci19Ci0KLS8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgYWRkcyBhIHNvdXJjZSBjaGFubmVsIChyb3cpCi0gKiAgc2NhbGVkIGJ5IGEgZ2l2ZW4gbWl4IGZhY3RvciB0byBhIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeC4KLSAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgotICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXggZmFjdG9ycy4KLSAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIHNvdXJjZSBjaGFubmVsIChyb3cpLgotICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KS4KLSAqIEBwYXJhbSBbaW5dICAgIEZpeGVkLXBvaW50IHBhcnQgb2YgbWl4IGZhY3RvciB0byBiZSBhcHBsaWVkLgotICogQHBhcmFtIFtpbl0gICAgU2NhbGUgZmFjdG9yIG9mIG1peCBmYWN0b3IgdG8gYmUgYXBwbGllZC4KLSAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgotICoqLwotc3RhdGljCi12b2lkIGRteEFkZENoYW5uZWwoCi0gICAgICAgIEZJWFBfRE1YICAgICAgICAgICAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1peFNjYWxlc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAotICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIGRzdENoLAotICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIHNyY0NoLAotICAgICAgICBjb25zdCBGSVhQX0RNWCAgICAgIGZhY3RvciwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBzY2FsZQotICAgICAgICkKLXsKLSAgaW50IGNoOwotICBmb3IgKGNoPTA7IGNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoKz0xKSB7Ci0gICAgRklYUF9EQkwgYWRkRmFjdCA9IGZNdWx0KG1peEZhY3RvcnNbc3JjQ2hdW2NoXSwgZmFjdG9yKTsKLSAgICBpZiAoYWRkRmFjdCAhPSAoRklYUF9ETVgpMCkgewotICAgICAgSU5UIG5ld1NjYWxlID0gbWl4U2NhbGVzW3NyY0NoXVtjaF0gKyBzY2FsZTsKLSAgICAgIGlmIChtaXhGYWN0b3JzW2RzdENoXVtjaF0gIT0gKEZJWFBfRE1YKTApIHsKLSAgICAgICAgaWYgKG5ld1NjYWxlID4gbWl4U2NhbGVzW2RzdENoXVtjaF0pIHsKLSAgICAgICAgICBtaXhGYWN0b3JzW2RzdENoXVtjaF0gPj49IG5ld1NjYWxlIC0gbWl4U2NhbGVzW2RzdENoXVtjaF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYWRkRmFjdCA+Pj0gbWl4U2NhbGVzW2RzdENoXVtjaF0gLSBuZXdTY2FsZTsKLSAgICAgICAgICBuZXdTY2FsZSAgPSBtaXhTY2FsZXNbZHN0Q2hdW2NoXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgbWl4RmFjdG9yc1tkc3RDaF1bY2hdICs9IEZYX0RCTDJGWF9ETVgoYWRkRmFjdCk7Ci0gICAgICBtaXhTY2FsZXNbZHN0Q2hdW2NoXSAgID0gbmV3U2NhbGU7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqIFByaXZhdGUgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgZG93bm1peCBmYWN0b3IgbWF0cml4IGRlcGVuZGluZyBvbiB0aGUgaW5wdXQgYW5kIG91dHB1dAotICogIGNvbmZpZ3VyYXRpb24sIHRoZSB1c2VyIHBhcmFtZXRlcnMgYXMgd2VsbCBhcyB0aGUgZ2l2ZW4gbWV0YWRhdGEuIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG1vZHVsZXMKLSAqICBicmFpbiBhbmQgaG9sZCBhbGwgZG93bm1peCBhbGdvcml0aG1zLgotICogQHBhcmFtIFtpbl0gIEZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgaW5DaE1vZGUgaG9sZHMgYSByZWFsIChwYWNrZWQpIGNoYW5uZWwgbW9kZSBvciBoYXMgYmVlbgotICAgICAgICAgICAgICAgIGNvbnZlcnRlZCB0byBhIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXguCi0gKiBAcGFyYW0gW2luXSAgRGVwZW5kZW50IG9uIHRoZSBpbk1vZGVJc0NmZyBmbGFnIHRoaXMgZmllbGQgaGFuZHMgaW4gYSAocGFja2VkKSBjaGFubmVsIG1vZGUgb3IKLSAgICAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBNUEVHLTQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4Lm9mIHRoZSBpbnB1dCBjb25maWd1cmF0aW9uLgotICogQHBhcmFtIFtpbl0gIFRoZSAocGFja2VkKSBjaGFubmVsIG1vZGUgb2YgdGhlIG91dHB1dCBjb25maWd1cmF0aW9uLgotICogQHBhcmFtIFtpbl0gIFBvaW50ZXIgdG8gc3RydWN0dXJlIGhvbGRpbmcgYWxsIGN1cnJlbnQgdXNlciBwYXJhbWV0ZXIuCi0gKiBAcGFyYW0gW2luXSAgUG9pbnRlciB0byBmaWVsZCBob2xkaW5nIGFsbCBjdXJyZW50IG1ldGEgZGF0YS4KLSAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4gTm9ybWFsaXplZCB0byBvbmUgc2NhbGUgZmFjdG9yLgotICogQHBhcmFtIFtvdXRdIFRoZSBjb21tb24gc2NhbGUgZmFjdG9yIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KLSAqIEByZXR1cm5zICAgICBBbiBlcnJvciBjb2RlLgotICoqLwotc3RhdGljCi1QQ01ETVhfRVJST1IgZ2V0TWl4RmFjdG9ycyAoCi0gICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgICAgICBpbk1vZGVJc0NmZywKLSAgICAgICAgUENNX0RNWF9DSEFOTkVMX01PREUgICAgICAgIGluQ2hNb2RlLAotICAgICAgICBjb25zdCBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgb3V0Q2hNb2RlLAotICAgICAgICBjb25zdCBQQ01fRE1YX1VTRVJfUEFSQU1TICAqcFBhcmFtcywKLSAgICAgICAgY29uc3QgRE1YX0JTX01FVEFfREFUQSAgICAgKnBNZXRhRGF0YSwKLSAgICAgICAgRklYUF9ETVggICAgICAgICAgICAgICAgICAgIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRTY2FsZQotICAgICAgKQotewotICBQQ01ETVhfRVJST1IgZXJyID0gUENNRE1YX09LOwotICBJTlQgIG1peFNjYWxlc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwotICBJTlQgIG1heFNjYWxlID0gMDsKLSAgaW50ICBudW1JbkNoYW5uZWwsIG51bU91dENoYW5uZWw7Ci0gIHVuc2lnbmVkIGludCAgb3V0Q2gsIGluQ2gsIGluQ2hDZmcgPSAwOwotICB1bnNpZ25lZCBpbnQgIHZhbGlkW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSA9IHsgMCB9OwotCi0gIEZES19BU1NFUlQocE1ldGFEYXRhICAhPSBOVUxMKTsKLSAgRkRLX0FTU0VSVChtaXhGYWN0b3JzICE9IE5VTEwpOwotICAvKiBDaGVjayBvbiBhIHN1cHBvcnRlZCBvdXRwdXQgY29uZmlndXJhdGlvbiAqLwotICBGREtfQVNTRVJUKCAob3V0Q2hNb2RlID09IENIX01PREVfMV8wXzBfMCkKLSAgICAgICAgICAgfHwgKG91dENoTW9kZSA9PSBDSF9NT0RFXzJfMF8wXzApCi0gICAgICAgICAgIHx8IChvdXRDaE1vZGUgPT0gQ0hfTU9ERV8zXzBfMl8xKSApOwotCi0gIGlmIChpbk1vZGVJc0NmZykgewotICAgIC8qIFdvcmthcm91bmQgZm9yIHRoZSBhbWJpZ3VpdHkgb2YgdGhlIGludGVybmFsIGNoYW5uZWwgbW9kZXMuCi0gICAgICAgQ29udmVydCBjaGFubmVsIGNvbmZpZyB0byBjaGFubmVsIG1vZGU6ICovCi0gICAgaW5DaENmZyAgPSAodW5zaWduZWQgaW50KWluQ2hNb2RlOwotICAgIHN3aXRjaCAoaW5DaENmZykgewotICAgIGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6Ci0jaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxTID4gMykKLSAgICBjYXNlIDQ6IGNhc2UgNTogY2FzZSA2OgotI2VuZGlmCi0gICAgICBpbkNoTW9kZSA9IG91dENoTW9kZVRhYmxlW2luQ2hDZmddOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMToKLSAgICAgIGluQ2hNb2RlID0gQ0hfTU9ERV8zXzBfM18xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgIGluQ2hNb2RlID0gQ0hfTU9ERV8zXzBfNF8xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA3OiBjYXNlIDE0OgotICAgICAgaW5DaE1vZGUgPSBDSF9NT0RFXzVfMF8yXzE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgICB9Ci0gIH0KLQotICAvKiBFeHRyYWN0IHRoZSB0b3RhbCBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgKi8KLSAgbnVtSW5DaGFubmVsICA9ICAoaW5DaE1vZGUmMHhGKQotICAgICAgICAgICAgICAgICsgKChpbkNoTW9kZT4+IDQpJjB4RikKLSAgICAgICAgICAgICAgICArICgoaW5DaE1vZGU+PiA4KSYweEYpCi0gICAgICAgICAgICAgICAgKyAoKGluQ2hNb2RlPj4xMikmMHhGKTsKLSAgLyogRXh0cmFjdCB0aGUgdG90YWwgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLwotICBudW1PdXRDaGFubmVsID0gIChvdXRDaE1vZGUmMHhGKQotICAgICAgICAgICAgICAgICsgKChvdXRDaE1vZGU+PiA0KSYweEYpCi0gICAgICAgICAgICAgICAgKyAoKG91dENoTW9kZT4+IDgpJjB4RikKLSAgICAgICAgICAgICAgICArICgob3V0Q2hNb2RlPj4xMikmMHhGKTsKLQotICAvKiBNUEVHIGFtbWVuZG1lbnQgNCBha2EgRVRTSSBtZXRhZGF0YSBhbmQgZmFsbGJhY2sgbW9kZTogKi8KLQotCi0gIC8qIENyZWF0ZSBpZGVudGl0eSBETVggbWF0cml4OiAqLwotICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7Ci0gICAgZG14SW5pdENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgb3V0Q2ggKTsKLSAgfQotICBpZiAoKChpbkNoTW9kZT4+MTIpJjB4RikgPT0gMCkgewotICAgIC8qIENsZWFyIGVtcHR5IG9yIHdyb25nbHkgbWFwcGVkIGlucHV0IGNoYW5uZWwgKi8KLSAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMICk7Ci0gIH0KLQotICAvKiBGSVJTVCBTVEFHRTogKi8KLSAgaWYgKG51bUluQ2hhbm5lbCA+IFNJWF9DSEFOTkVMKQotICB7IC8qIEFsd2F5cyB1c2UgTVBFRyBlcXVhdGlvbnMgZWl0aGVyIHdpdGggbWV0YSBkYXRhIG9yIHdpdGggZGVmYXVsdCB2YWx1ZXMuICovCi0gICAgRklYUF9ETVggIGRNaXhGYWN0QSwgZE1peEZhY3RCOwotICAgIElOVCAgICAgICBkTWl4U2NhbGVBLCBkTWl4U2NhbGVCOwotICAgIGludCAgICAgICBpc1ZhbGlkQ2ZnID0gVFJVRTsKLQotICAgIC8qIEdldCBmYWN0b3JzIGZyb20gbWV0YSBkYXRhICovCi0gICAgZE1peEZhY3RBICA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5kbWl4SWR4QV07Ci0gICAgZE1peFNjYWxlQSA9IChwTWV0YURhdGEtPmRtaXhJZHhBPT0wKSA/IDEgOiAwOwotICAgIGRNaXhGYWN0QiAgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+ZG1peElkeEJdOwotICAgIGRNaXhTY2FsZUIgPSAocE1ldGFEYXRhLT5kbWl4SWR4Qj09MCkgPyAxIDogMDsKLQotICAgIC8qIENoZWNrIGlmIGlucHV0IGlzIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyAqLwotICAgIHN3aXRjaCAoaW5DaE1vZGUpIHsKLSAgICBjYXNlIENIX01PREVfM18wXzNfMTogICAvKiBjaENmZyAxMSAqLwotICAgICAgLyogNi4xY2g6ICBDJyA9IEM7ICBMJyA9IEw7ICBSJyA9IFI7ICBMRkUnID0gTEZFOwotICAgICAgICAgICAgICAgICBMcycgPSBMcypkbWl4X2FfaWR4ICsgQ3MqZG1peF9iX2lkeDsKLSAgICAgICAgICAgICAgICAgUnMnID0gUnMqZG1peF9hX2lkeCArIENzKmRtaXhfYl9pZHg7ICovCi0gICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwgKTsgIC8qIGNsZWFyIGVtcHR5IGlucHV0IGNoYW5uZWwgKi8KLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hfTU9ERV8zXzJfMV8wOgotICAgIGNhc2UgQ0hfTU9ERV8zXzJfMV8xOiAgIC8qIGNoQ2ZnIDExIGJ1dCB3aXRoIHNpZGUgY2hhbm5lbHMgKi8KLSAgICAgIC8qIDYuMWNoOiAgQycgPSBDOyAgTCcgPSBMOyAgUicgPSBSOyAgTEZFJyA9IExGRTsKLSAgICAgICAgICAgICAgICAgTHMnID0gTHMqZG1peF9hX2lkeCArIENzKmRtaXhfYl9pZHg7Ci0gICAgICAgICAgICAgICAgIFJzJyA9IFJzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OyAqLwotICAgICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCApOyAgLyogY2xlYXIgZW1wdHkgaW5wdXQgY2hhbm5lbCAqLwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7Ci0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICAgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKLSAgICAgIGlzVmFsaWRDZmcgPSBGQUxTRTsKLSAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENIX01PREVfNV8yXzFfMDoKLSAgICBjYXNlIENIX01PREVfNV8wXzFfMDoKLSAgICBjYXNlIENIX01PREVfNV8wXzFfMToKLSAgICAgIC8qICAgICAgICAgTHMnID0gQ3MqZG1peF9hX2lkeDsKLSAgICAgICAgICAgICAgICAgUnMnID0gQ3MqZG1peF9hX2lkeDsgKi8KLSAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwgKTsgIC8qIGNsZWFyIGVtcHR5IGlucHV0IGNoYW5uZWwgKi8KLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7Ci0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwotICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOwotICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hfTU9ERV8zXzBfNF8xOiAgIC8qIGNoQ2ZnIDEyICovCi0gICAgICAvKiA3LjFjaCBTdXJyb3VuZCBCYWNrOiAgQycgPSBDOyAgTCcgPSBMOyAgUicgPSBSOyAgTEZFJyA9IExGRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMcycgPSBMcypkbWl4X2FfaWR4ICsgTHNyKmRtaXhfYl9pZHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnMnID0gUnMqZG1peF9hX2lkeCArIFJzcipkbWl4X2JfaWR4OyAqLwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7Ci0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hfTU9ERV81XzBfMl8xOiAgIC8qIGNoQ2ZnIDcgfHwgMTQgKi8KLSAgICAgIGlmIChpbkNoQ2ZnID09IDE0KSB7Ci0gICAgICAgIC8qIDcuMWNoIEZyb250IEhlaWdodDogIEMnID0gQzsgIExzJyA9IExzOyAgUnMnID0gUnM7ICBMRkUnID0gTEZFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMJyA9IEwqZG1peF9hX2lkeCArIEx2KmRtaXhfYl9pZHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gUipkbWl4X2FfaWR4ICsgUnYqZG1peF9iX2lkeDsgKi8KLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX0ZST05UX0NIQU5ORUwsICAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7Ci0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiA3LjFjaCBGcm9udDogIExzJyA9IExzOyAgUnMnID0gUnM7ICBMRkUnID0gTEZFOwotICAgICAgICAgICAgICAgICAgICAgICAgIEMnID0gQyArIChMYytSYykqZG1peF9hX2lkeDsKLSAgICAgICAgICAgICAgICAgICAgICAgICBMJyA9IEwgKyBMYypkbWl4X2JfaWR4OwotICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gUiArIFJjKmRtaXhfYl9pZHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgQ0FVVElPTjogTCtSIGFyZSBub3QgYXQgKE1QRUcpIGluZGV4IDErMi4gKi8KLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7Ci0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgICAgICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAxICk7Ci0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAxICk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogTm90aGluZyB0byBkby4gSnVzdCB1c2UgdGhlIGlkZW50aXR5IG1hdHJpeC4gKi8KLSAgICAgIGlzVmFsaWRDZmcgPSBGQUxTRTsKLSAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBBZGQgYWRkaXRpb25hbCBETVggZ2FpbiAqLwotICAgIGlmICggKGlzVmFsaWRDZmcgPT0gVFJVRSkKLSAgICAgICYmIChwTWV0YURhdGEtPmRteEdhaW5JZHg1ICE9IDApKQotICAgIHsgLyogQXBwbHkgRE1YIGdhaW4gNSAqLwotICAgICAgRklYUF9ETVggZG14R2FpbjsKLSAgICAgIElOVCAgICAgIGRteFNjYWxlOwotICAgICAgSU5UICAgICAgc2lnbiA9IChwTWV0YURhdGEtPmRteEdhaW5JZHg1ICYgMHg0MCkgPyAtMSA6IDE7Ci0gICAgICBJTlQgICAgICB2YWwgID0gcE1ldGFEYXRhLT5kbXhHYWluSWR4NSAmIDB4M0Y7Ci0KLSAgICAgIC8qIDEwXihkbXhfZ2Fpbl81LzgwKSAqLwotICAgICAgZG14R2FpbiA9IEZYX0RCTDJGWF9ETVgoIGZMZFBvdygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuODMwNDgyMDIzNzIxODQxZiksIDIsICAvKiBsb2cyKDEwKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShzaWduKnZhbCooTE9ORylGTDJGWENPTlNUX0RCTCgwLjAxMjVmKSksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbXhTY2FsZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgIC8qIEN1cnJlbnRseSBvbmx5IHBvc2l0aXZlIHNjYWxlIGZhY3RvcnMgc3VwcG9ydGVkISAqLwotICAgICAgaWYgKGRteFNjYWxlIDwgMCkgewotICAgICAgICBkbXhHYWluID4+PSAtZG14U2NhbGU7Ci0gICAgICAgIGRteFNjYWxlICA9ICAwOwotICAgICAgfQotCi0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBkbXhHYWluLCBkbXhTY2FsZSApOwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgICAgZG14R2FpbiwgZG14U2NhbGUgKTsKLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgIGRteEdhaW4sIGRteFNjYWxlICk7Ci0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICBkbXhHYWluLCBkbXhTY2FsZSApOwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgZG14R2FpbiwgZG14U2NhbGUgKTsKLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGRteEdhaW4sIGRteFNjYWxlICk7Ci0gICAgfQotCi0gICAgLyogTWFyayB0aGUgb3V0cHV0IGNoYW5uZWxzICovCi0gICAgdmFsaWRbQ0VOVEVSX0ZST05UX0NIQU5ORUxdICA9IDE7Ci0gICAgdmFsaWRbTEVGVF9GUk9OVF9DSEFOTkVMXSAgICA9IDE7Ci0gICAgdmFsaWRbUklHSFRfRlJPTlRfQ0hBTk5FTF0gICA9IDE7Ci0gICAgdmFsaWRbTEVGVF9SRUFSX0NIQU5ORUxdICAgICA9IDE7Ci0gICAgdmFsaWRbUklHSFRfUkVBUl9DSEFOTkVMXSAgICA9IDE7Ci0gICAgdmFsaWRbTE9XX0ZSRVFVRU5DWV9DSEFOTkVMXSA9IDE7Ci0KLSAgICAvKiBVcGRhdGUgY2hhbm5lbCBtb2RlIGZvciB0aGUgbmV4dCBzdGFnZSAqLwotICAgIGluQ2hNb2RlID0gQ0hfTU9ERV8zXzBfMl8xOwotICB9Ci0KLSAgLyogU0VDT05EIFNUQUdFOiAqLwotICBpZiAobnVtT3V0Q2hhbm5lbCA8PSBUV09fQ0hBTk5FTCkgewotICAgIC8qIENyZWF0ZSBETVggbWF0cml4IGFjY29yZGluZyB0byBpbnB1dCBjb25maWd1cmF0aW9uICovCi0gICAgc3dpdGNoIChpbkNoTW9kZSkgewotICAgIGNhc2UgQ0hfTU9ERV8yXzBfMF8wOiAgIC8qIGNoQ2ZnIDIgKi8KLSAgICAgIC8qIEFwcGx5IHRoZSBkdWFsIGNoYW5uZWwgbW9kZS4gKi8KLSAgICAgIHN3aXRjaCAocFBhcmFtcy0+ZHVhbENoYW5uZWxNb2RlKSB7Ci0gICAgICBjYXNlIENIMV9NT0RFOiAgLyogTCcgPSAwLjcwNyAqIENoMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IDAuNzA3ICogQ2gxOyAqLwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX0ZST05UX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDSDJfTU9ERTogIC8qIEwnID0gMC43MDcgKiBDaDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjcwNyAqIENoMjsgKi8KLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7Ci0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTUlYRURfTU9ERTogIC8qIEwnID0gMC41KkNoMSArIDAuNSpDaDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IDAuNSpDaDEgKyAwLjUqQ2gyOyAqLwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwICk7Ci0gICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDAgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX0ZST05UX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMCApOwotICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgIGNhc2UgU1RFUkVPX01PREU6Ci0gICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENIX01PREVfMl8wXzFfMDoKLSAgICAgIC8qIEwnID0gTCArIDAuNzA3KlM7Ci0gICAgICAgICBSJyA9IFIgKyAwLjcwNypTOyAqLwotICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7Ci0gICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hfTU9ERV8zXzBfMF8wOiAgIC8qIGNoQ2ZnIDMgKi8KLSAgICAgIC8qIEwnID0gTCArIDAuNzA3KkM7Ci0gICAgICAgICBSJyA9IFIgKyAwLjcwNypDOyAqLwotICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwotICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSF9NT0RFXzNfMF8xXzA6ICAgLyogY2hDZmcgNCAqLwotICAgICAgLyogTCcgPSBMICsgMC43MDcqQyArIDAuNzA3KlM7Ci0gICAgICAgICBSJyA9IFIgKyAwLjcwNypDICsgMC43MDcqUzsgKi8KLSAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKLSAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKLSAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKLSAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsICAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hfTU9ERV8zXzBfMl8wOiAgIC8qIGNoQ2ZnIDUgKi8KLSAgICBjYXNlIENIX01PREVfM18wXzJfMTogICAvKiBjaENmZyA2ICovCi0gICAgICAvKiBNUEVHICsgSVRVICsgRExCCi0gICAgICAgICBCdXQgYmVjYXVzZSB0aGUgZGVmYXVsdCBkb3dubWl4IGVxdWF0aW9ucyBhbmQgY29lZmZpY2llbnRzIGFyZSBlcXVhbCB3ZSBzdGljayB0byBNUEVHLiAqLwotICAgICAgaWYgKCAgKHBNZXRhRGF0YS0+dHlwZUZsYWdzICYgVFlQRV9EU0VfREFUQSkKLSAgICAgICAgfHwgIShwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfUENFX0RBVEEpICkKLSAgICAgIHsKLSAgICAgICAgRklYUF9ETVggIGNNaXhMdmwsIHNNaXhMdmwsIGxNaXhMdmw7Ci0gICAgICAgIElOVCAgICAgICBjTWl4U2NhbGUsIHNNaXhTY2FsZSwgbE1peFNjYWxlOwotCi0gICAgICAgIC8qIEdldCBmYWN0b3JzIGZyb20gbWV0YSBkYXRhICovCi0gICAgICAgIGNNaXhMdmwgICA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5jTGV2SWR4XTsKLSAgICAgICAgY01peFNjYWxlID0gKHBNZXRhRGF0YS0+Y0xldklkeD09MCkgPyAxIDogMDsKLSAgICAgICAgc01peEx2bCAgID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPnNMZXZJZHhdOwotICAgICAgICBzTWl4U2NhbGUgPSAocE1ldGFEYXRhLT5zTGV2SWR4PT0wKSA/IDEgOiAwOwotICAgICAgICBsTWl4THZsICAgPSBsZmVNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPmRtaXhJZHhMZmVdOwotICAgICAgICBpZiAocE1ldGFEYXRhLT5kbWl4SWR4TGZlIDw9IDEpIHsKLSAgICAgICAgICBsTWl4U2NhbGUgPSAyOwotICAgICAgICB9IGVsc2UgaWYgKHBNZXRhRGF0YS0+ZG1peElkeExmZSA8PSA1KSB7Ci0gICAgICAgICAgbE1peFNjYWxlID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBsTWl4U2NhbGUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIC8qIFNldHVwIHRoZSBETVggbWF0cml4ICovCi0gICAgICAgIGlmICggKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEZPUkNFX1BTX0RNWCkKLSAgICAgICAgICB8fCAoKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEFVVE9fUFNfRE1YKSAmJiAocE1ldGFEYXRhLT5wc2V1ZG9TdXJyb3VuZD09MSkpKQotICAgICAgICB7IC8qIEwnID0gTCArIEMqY2xldiAtIChMcytScykqc2xldiArIExGRSpsZmxldjsKLSAgICAgICAgICAgICBSJyA9IFIgKyBDKmNsZXYgKyAoTHMrUnMpKnNsZXYgKyBMRkUqbGZsZXY7ICovCi0gICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGNNaXhMdmwsIGNNaXhTY2FsZSApOwotICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgIC1zTWl4THZsLCBzTWl4U2NhbGUgKTsKLSAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAtc01peEx2bCwgc01peFNjYWxlICk7Ci0gICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGxNaXhMdmwsIGxNaXhTY2FsZSApOwotICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBjTWl4THZsLCBjTWl4U2NhbGUgKTsKLSAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgc01peEx2bCwgc01peFNjYWxlICk7Ci0gICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgIHNNaXhMdmwsIHNNaXhTY2FsZSApOwotICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgLyogTCcgPSBMICsgQypjbGV2ICsgTHMqc2xldiArIExGRSpsbGV2OwotICAgICAgICAgICAgIFInID0gUiArIEMqY2xldiArIFJzKnNsZXYgKyBMRkUqbGxldjsgKi8KLSAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgY01peEx2bCwgY01peFNjYWxlICk7Ci0gICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgIHNNaXhMdmwsIHNNaXhTY2FsZSApOwotICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUgKTsKLSAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgY01peEx2bCwgY01peFNjYWxlICk7Ci0gICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgIHNNaXhMdmwsIHNNaXhTY2FsZSApOwotICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFkZCBhZGRpdGlvbmFsIERNWCBnYWluICovCi0gICAgICAgIGlmICggcE1ldGFEYXRhLT5kbXhHYWluSWR4MiAhPSAwICkKLSAgICAgICAgeyAvKiBBcHBseSBETVggZ2FpbiAyICovCi0gICAgICAgICAgRklYUF9ETVggZG14R2FpbjsKLSAgICAgICAgICBJTlQgICAgICBkbXhTY2FsZTsKLSAgICAgICAgICBJTlQgICAgICBzaWduID0gKHBNZXRhRGF0YS0+ZG14R2FpbklkeDIgJiAweDQwKSA/IC0xIDogMTsKLSAgICAgICAgICBJTlQgICAgICB2YWwgID0gcE1ldGFEYXRhLT5kbXhHYWluSWR4MiAmIDB4M0Y7Ci0KLSAgICAgICAgICAvKiAxMF4oZG14X2dhaW5fMi84MCkgKi8KLSAgICAgICAgICBkbXhHYWluID0gRlhfREJMMkZYX0RNWCggZkxkUG93KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuODMwNDgyMDIzNzIxODQxZiksIDIsICAvKiBsb2cyKDEwKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoc2lnbip2YWwqKExPTkcpRkwyRlhDT05TVF9EQkwoMC4wMTI1ZikpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRteFNjYWxlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAvKiBDdXJyZW50bHkgb25seSBwb3NpdGl2ZSBzY2FsZSBmYWN0b3JzIHN1cHBvcnRlZCEgKi8KLSAgICAgICAgICBpZiAoZG14U2NhbGUgPCAwKSB7Ci0gICAgICAgICAgICBkbXhHYWluID4+PSAtZG14U2NhbGU7Ci0gICAgICAgICAgICBkbXhTY2FsZSAgPSAgMDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgIGRteEdhaW4sIGRteFNjYWxlICk7Ci0gICAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBkbXhHYWluLCBkbXhTY2FsZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0jaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQotICAgICAgZWxzZSB7Ci0gICAgICAgIEZJWFBfRE1YICBmbGV2LCBjbGV2LCBzbGV2TEwsIHNsZXZMUiwgc2xldlJMLCBzbGV2UlI7Ci0gICAgICAgIEZJWFBfRE1YICBtdHJ4TWl4RHduQ29lZiA9IG1wZWdNaXhEb3duSWR4MkNvZWZbcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKLQotICAgICAgICBpZiAoIChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBGT1JDRV9QU19ETVgpCi0gICAgICAgICAgfHwgKChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBBVVRPX1BTX0RNWCkgJiYgKHBNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQ9PTEpKSkKLSAgICAgICAgeyAvKiAzLzIgaW5wdXQ6IEwnID0gKDEuNzA3KzIqQSleLTEgKiBbTCswLjcwNypDLUEqTHMtQSpSc107Ci0gICAgICAgICAgICAgICAgICAgICAgICBSJyA9ICgxLjcwNysyKkEpXi0xICogW1IrMC43MDcqQytBKkxzK0EqUnNdOyAqLwotICAgICAgICAgIGZsZXYgPSBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzFdW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07Ci0gICAgICAgICAgc2xldlJSID0gc2xldlJMID0gRlhfREJMMkZYX0RNWChmTXVsdChmbGV2LCBtdHJ4TWl4RHduQ29lZikpOwotICAgICAgICAgIHNsZXZMTCA9IHNsZXZMUiA9IC1zbGV2Ukw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgLyogMy8yIGlucHV0OiBMJyA9ICgxLjcwNytBKV4tMSAqIFtMKzAuNzA3KkMrQSpMc107Ci0gICAgICAgICAgICAgICAgICAgICAgICBSJyA9ICgxLjcwNytBKV4tMSAqIFtSKzAuNzA3KkMrQSpSc107ICovCi0gICAgICAgICAgZmxldiA9IG1wZWdNaXhEb3duSWR4MlByZUZhY3RbMF1bcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKLSAgICAgICAgICBzbGV2UlIgPSBzbGV2TEwgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KGZsZXYsIG10cnhNaXhEd25Db2VmKSk7Ci0gICAgICAgICAgc2xldkxSID0gc2xldlJMID0gKEZJWFBfU0dMKTA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogY29tbW9uIGZhY3RvciAqLwotICAgICAgICBjbGV2ICA9IEZYX0RCTDJGWF9ETVgoZk11bHQoZmxldiwgbXBlZ01peERvd25JZHgyQ29lZlswXSAvKiAwLjcwNyAqLykpOwotCi0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgIGZsZXYsICAgMCApOwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjbGV2LCAgIDAgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgc2xldkxMLCAwICk7Ci0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfUkVBUl9DSEFOTkVMLCAgIHNsZXZMUiwgMCApOwotCi0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgIGZsZXYsICAgMCApOwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjbGV2LCAgIDAgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgc2xldlJMLCAwICk7Ci0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgIHNsZXZSUiwgMCApOwotICAgICAgfQotI2VuZGlmICAvKiBQQ0VfTUVUQURBVEFfRU5BQkxFICovCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGZpdCB0byBhbnkga25vd24gZG93bm1peCBlcXVhdGlvbiEgKi8KLSAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgLyogTWFyayB0aGUgb3V0cHV0IGNoYW5uZWxzICovCi0gICAgRkRLbWVtY2xlYXIodmFsaWQsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZih1bnNpZ25lZCBpbnQpKTsKLSAgICB2YWxpZFtMRUZUX0ZST05UX0NIQU5ORUxdICA9IDE7Ci0gICAgdmFsaWRbUklHSFRfRlJPTlRfQ0hBTk5FTF0gPSAxOwotICAgIC8qIFVwZGF0ZSBjaGFubmVsIG1vZGUgZm9yIHRoZSBuZXh0IHN0YWdlICovCi0gICAgaW5DaE1vZGUgPSBDSF9NT0RFXzJfMF8wXzA7Ci0gIH0KLQotICBpZiAobnVtT3V0Q2hhbm5lbCA9PSBPTkVfQ0hBTk5FTCkgewotICAgIEZJWFBfRE1YIG1vbm9NaXhMZXZlbDsKLSAgICBJTlQgICAgICBtb25vTWl4U2NhbGU7Ci0KLSNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCi0gICAgaWYgKCAgKHBNZXRhRGF0YS0+dHlwZUZsYWdzICYgVFlQRV9QQ0VfREFUQSkKLSAgICAgICYmICEocE1ldGFEYXRhLT50eXBlRmxhZ3MgJiBUWVBFX0RTRV9EQVRBKSApCi0gICAgeyAvKiBDJyA9ICgzKzIqQSleLTEgKiBbQytMK1IrQSpMcytBK1JzXTsgKi8KLSAgICAgIG1vbm9NaXhMZXZlbCA9IG1wZWdNaXhEb3duSWR4MlByZUZhY3RbMl1bcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKLSAgICAgIG1vbm9NaXhTY2FsZSA9IDA7Ci0KLSAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCApOwotICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gbW9ub01peExldmVsOwotICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bTEVGVF9GUk9OVF9DSEFOTkVMXSAgID0gbW9ub01peExldmVsOwotICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bUklHSFRfRlJPTlRfQ0hBTk5FTF0gID0gbW9ub01peExldmVsOwotICAgICAgbW9ub01peExldmVsID0gRlhfREJMMkZYX0RNWChmTXVsdChtb25vTWl4TGV2ZWwsIG1wZWdNaXhEb3duSWR4MkNvZWZbcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XSkpOwotICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bTEVGVF9SRUFSX0NIQU5ORUxdICAgID0gbW9ub01peExldmVsOwotICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bUklHSFRfUkVBUl9DSEFOTkVMXSAgID0gbW9ub01peExldmVsOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICB7IC8qIEMnID0gTCArIFI7IFtkZWZhdWx0XSAqLwotICAgICAgbW9ub01peExldmVsID0gRkwyRlhDT05TVF9ETVgoMC41Zik7Ci0gICAgICBtb25vTWl4U2NhbGUgPSAxOwotICAgICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMICk7ICAvKiBDIGlzIG5vdCBpbiB0aGUgbWl4ICovCi0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBMRUZUX0ZST05UX0NIQU5ORUwsICBtb25vTWl4TGV2ZWwsIG1vbm9NaXhTY2FsZSApOwotICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgbW9ub01peExldmVsLCBtb25vTWl4U2NhbGUgKTsKLSAgICB9Ci0KLSAgICAvKiBNYXJrIHRoZSBvdXRwdXQgY2hhbm5lbCAqLwotICAgIEZES21lbWNsZWFyKHZhbGlkLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YodW5zaWduZWQgaW50KSk7Ci0gICAgdmFsaWRbQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gMTsKLSAgfQotCi0jZGVmaW5lIE1BWF9TRUFSQ0hfU1RBUlRfVkFMICAoIC03ICkKLQotICB7Ci0gICAgTE9ORyBjaFN1bVtQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0gICAgSU5UICBjaFN1bU1heCA9IE1BWF9TRUFSQ0hfU1RBUlRfVkFMOwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IG1heGltdW0gc2NhbGUgZmFjdG9yICovCi0gICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewotICAgICAgaWYgKHZhbGlkW291dENoXSE9MCkgewotICAgICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7Ci0gICAgICAgICAgaWYgKG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPiBtYXhTY2FsZSkKLSAgICAgICAgICB7IC8qIFN0b3JlIHRoZSBuZXcgbWF4aW11bSAqLwotICAgICAgICAgICAgbWF4U2NhbGUgPSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIEluZGl2aWR1YWx5IGFuYWx5c2Ugb3V0cHV0IGNoYW5hbCBsZXZlbHMgKi8KLSAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7Ci0gICAgICBjaFN1bVtvdXRDaF0gPSBNQVhfU0VBUkNIX1NUQVJUX1ZBTDsKLSAgICAgIGlmICh2YWxpZFtvdXRDaF0hPTApIHsKLSAgICAgICAgaW50ICBvdnJmbHdQcm90U2NhbGUgPSAwOwotCi0gICAgICAgIC8qIEFjY3VtdWxhdGUgYWxsIGZhY3RvcnMgZm9yIGVhY2ggb3V0cHV0IGNoYW5uZWwgKi8KLSAgICAgICAgY2hTdW1bb3V0Q2hdID0gMDsKLSAgICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgewotICAgICAgICAgIFNIT1JUIGFkZEZhY3QgPSBGWF9ETVgyU0hSVChtaXhGYWN0b3JzW291dENoXVtpbkNoXSk7Ci0gICAgICAgICAgaWYgKCBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIDw9IG1heFNjYWxlICkgewotICAgICAgICAgICAgYWRkRmFjdCA+Pj0gbWF4U2NhbGUgLSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRGYWN0IDw8PSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIC0gbWF4U2NhbGU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNoU3VtW291dENoXSArPSBhZGRGYWN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaFN1bVtvdXRDaF0gPiAoTE9ORylNQVhWQUxfU0dMKSB7Ci0gICAgICAgICAgd2hpbGUgKGNoU3VtW291dENoXSA+IChMT05HKU1BWFZBTF9TR0wpIHsKLSAgICAgICAgICAgIG92cmZsd1Byb3RTY2FsZSArPSAxOwotICAgICAgICAgICAgY2hTdW1bb3V0Q2hdID4+PSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjaFN1bVtvdXRDaF0gPiAwKSB7Ci0gICAgICAgICAgd2hpbGUgKChjaFN1bVtvdXRDaF08PDEpIDw9IChMT05HKU1BWFZBTF9TR0wpIHsKLSAgICAgICAgICAgIG92cmZsd1Byb3RTY2FsZSAtPSAxOwotICAgICAgICAgICAgY2hTdW1bb3V0Q2hdIDw8PSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBTdG9yZSB0aGUgZGlmZmVyZW50aWFsIHNjYWxpbmcgaW4gdGhlIHNhbWUgYXJyYXkgKi8KLSAgICAgICAgY2hTdW1bb3V0Q2hdID0gb3ZyZmx3UHJvdFNjYWxlOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKLSAgICAgIGlmICggKHZhbGlkW291dENoXSAhPSAwKQotICAgICAgICAmJiAoY2hTdW1bb3V0Q2hdID4gY2hTdW1NYXgpICkKLSAgICAgIHsgLyogU3RvcmUgdGhlIG5ldyBtYXhpbXVtICovCi0gICAgICAgIGNoU3VtTWF4ID0gY2hTdW1bb3V0Q2hdOwotICAgICAgfQotICAgIH0KLSAgICBtYXhTY2FsZSA9IEZES21heChtYXhTY2FsZStjaFN1bU1heCwgMCk7Ci0KLSAgICAvKiBOb3JtYWxpemUgYWxsIGZhY3RvcnMgKi8KLSAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7Ci0gICAgICBpZiAodmFsaWRbb3V0Q2hdIT0wKSB7Ci0gICAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGluQ2grPTEpIHsKLSAgICAgICAgICBpZiAobWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gIT0gKEZJWFBfRE1YKTApIHsKLSAgICAgICAgICAgIGlmICggbWl4U2NhbGVzW291dENoXVtpbkNoXSA8PSBtYXhTY2FsZSApIHsKLSAgICAgICAgICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPj49IG1heFNjYWxlIC0gbWl4U2NhbGVzW291dENoXVtpbkNoXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdIDw8PSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIC0gbWF4U2NhbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdID0gbWF4U2NhbGU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiByZXR1cm4gdGhlIHNjYWxlIGZhY3RvciAqLwotICAqcE91dFNjYWxlID0gbWF4U2NhbGU7Ci0KLSAgcmV0dXJuIChlcnIpOwotfQotCi0KLS8qKiBPcGVuIGFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUKLSAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyB0aGUgaGFuZGxlIG9mIHRoZSBuZXcgaW5zdGFuY2UuCi0gKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1QQ01ETVhfRVJST1IgcGNtRG14X09wZW4gKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAqcFNlbGYKLSAgKQotewotICBIQU5ETEVfUENNX0RPV05NSVggc2VsZjsKLSAgCi0gIGlmIChwU2VsZiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwotICB9Ci0KLSAgKnBTZWxmID0gTlVMTDsKLQotICBzZWxmID0gKEhBTkRMRV9QQ01fRE9XTk1JWCkgR2V0UGNtRG14SW5zdGFuY2UoIDAgKTsKLSAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgIHJldHVybiAoUENNRE1YX09VVF9PRl9NRU1PUlkpOwotICB9Ci0KLSAgLyogUmVzZXQgdGhlIGZ1bGwgaW5zdGFuY2UgKi8KLSAgcGNtRG14X1Jlc2V0KCBzZWxmLCBQQ01ETVhfUkVTRVRfRlVMTCApOwotCi0gICpwU2VsZiA9IHNlbGY7Ci0KLSAgcmV0dXJuIChQQ01ETVhfT0spOwotfQotCi0KLS8qKiBSZXNldCBhbGwgc3RhdGljIHZhbHVlcyBsaWtlIGUuZy4gbWl4ZG93biBjb2VmZmljaWVudHMuCi0gKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgotICogQHBhcmFtIFtpbl0gRmxhZ3MgdGVsbGluZyB3aGljaCBwYXJ0cyBvZiB0aGUgbW9kdWxlIHNoYWxsIGJlIHJlc2V0LgotICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICoqLwotUENNRE1YX0VSUk9SIHBjbURteF9SZXNldCAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAotICAgIFVJTlQgICAgICAgICAgICAgICAgZmxhZ3MKLSAgKQotewotICBpZiAoc2VsZiA9PSBOVUxMKSB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsgfQotCi0gIGlmIChmbGFncyAmIFBDTURNWF9SRVNFVF9QQVJBTVMpIHsKLSAgICBQQ01fRE1YX1VTRVJfUEFSQU1TICpwUGFyYW1zID0gJnNlbGYtPnVzZXJQYXJhbXM7Ci0KLSAgICBwUGFyYW1zLT5kdWFsQ2hhbm5lbE1vZGUgICA9IFNURVJFT19NT0RFOwotICAgIHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlICAgID0gTkVWRVJfRE9fUFNfRE1YOwotICAgIHBQYXJhbXMtPm51bU91dENoYW5uZWxzTWF4ID0gUENNX0RNWF9ERkxUX01BWF9PVVRfQ0hBTk5FTFM7Ci0gICAgcFBhcmFtcy0+bnVtT3V0Q2hhbm5lbHNNaW4gPSBQQ01fRE1YX0RGTFRfTUlOX09VVF9DSEFOTkVMUzsKLSAgICBwUGFyYW1zLT5mcmFtZURlbGF5ICAgICAgICA9IDA7Ci0gICAgcFBhcmFtcy0+ZXhwaXJ5RnJhbWUgICAgICAgPSBQQ01fRE1YX0RGTFRfRVhQSVJZX0ZSQU1FOwotCi0gICAgc2VsZi0+YXBwbHlQcm9jZXNzaW5nICAgICAgPSAwOwotICB9Ci0KLSAgaWYgKGZsYWdzICYgUENNRE1YX1JFU0VUX0JTX0RBVEEpIHsKLSAgICBpbnQgc2xvdDsKLSAgICAvKiBJbml0IGFsbCBzbG90cyB3aXRoIGEgZGVmYXVsdCBzZXQgKi8KLSAgICBmb3IgKHNsb3QgPSAwOyBzbG90IDw9IFBDTV9ETVhfTUFYX0RFTEFZX0ZSQU1FUzsgc2xvdCArPSAxKSB7Ci0gICAgICBGREttZW1jcHkoJnNlbGYtPmJzTWV0YURhdGFbc2xvdF0sICZkZmx0TWV0YURhdGEsIHNpemVvZihETVhfQlNfTUVUQV9EQVRBKSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIChQQ01ETVhfT0spOwotfQotCi0KLS8qKiBTZXQgb25lIHBhcmFtZXRlciBmb3Igb25lIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUuCi0gKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgotICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHRvIGJlIHNldC4KLSAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB2YWx1ZS4KLSAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfU2V0UGFyYW0gKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKLSAgICBjb25zdCBQQ01ETVhfUEFSQU0gIHBhcmFtLAotICAgIGNvbnN0IElOVCAgICAgICAgICAgdmFsdWUKLSAgKQotewotICBzd2l0Y2ggKHBhcmFtKQotICB7Ci0gIGNhc2UgRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FOgotICAgIGlmIChzZWxmID09IE5VTEwpCi0gICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7Ci0gICAgc2VsZi0+dXNlclBhcmFtcy5leHBpcnlGcmFtZSA9ICh2YWx1ZSA+IDApID8gKFVJTlQpdmFsdWUgOiAwOwotICAgIGJyZWFrOwotCi0gIGNhc2UgRE1YX0JTX0RBVEFfREVMQVk6Ci0gICAgaWYgKCAodmFsdWUgPiBQQ01fRE1YX01BWF9ERUxBWV9GUkFNRVMpCi0gICAgICB8fCAodmFsdWUgPCAwKSApIHsKLSAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOwotICAgIH0KLSAgICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7Ci0gICAgfQotICAgIHNlbGYtPnVzZXJQYXJhbXMuZnJhbWVEZWxheSA9IChVQ0hBUil2YWx1ZTsKLSAgICBicmVhazsKLQotICBjYXNlIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTOgotICAgIHN3aXRjaCAodmFsdWUpIHsgIC8qIHN1cHBvcnRlZCBvdXRwdXQgY2hhbm5lbHMgKi8KLSAgICBjYXNlIC0xOiBjYXNlIDA6IGNhc2UgT05FX0NIQU5ORUw6IGNhc2UgVFdPX0NIQU5ORUw6Ci0jaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+PSA2KQotICAgIGNhc2UgU0lYX0NIQU5ORUw6Ci0jZW5kaWYKLSNpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID49IDgpCi0gICAgY2FzZSBFSUdIVF9DSEFOTkVMOgotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7Ci0gICAgfQotICAgIGlmIChzZWxmID09IE5VTEwpCi0gICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7Ci0gICAgLyogU3RvcmUgdGhlIG5ldyB2YWx1ZSAqLwotICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW4gPSAodmFsdWUgPiAwKSA/IHZhbHVlIDogLTE7Ci0gICAgaWYgKCAodmFsdWUgPiAwKQotICAgICAgJiYgKHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXggPiAwKQotICAgICAgJiYgKHZhbHVlID4gc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heCkgKQotICAgIHsgLyogTUlOID4gTUFYIHdvdWxkIGJlIGFuIGludmFsaWQgc3RhdGUuIFRodXMgc2V0IE1BWCA9IE1JTiBpbiB0aGlzIGNhc2UuICovCi0gICAgICBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4ID0gc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01pbjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKLSAgICBzd2l0Y2ggKHZhbHVlKSB7ICAvKiBzdXBwb3J0ZWQgb3V0cHV0IGNoYW5uZWxzICovCi0gICAgY2FzZSAtMTogY2FzZSAwOiBjYXNlIE9ORV9DSEFOTkVMOiBjYXNlIFRXT19DSEFOTkVMOgotI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPj0gNikKLSAgICBjYXNlIFNJWF9DSEFOTkVMOgotI2VuZGlmCi0jaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+PSA4KQotICAgIGNhc2UgRUlHSFRfQ0hBTk5FTDoKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOwotICAgIH0KLSAgICBpZiAoc2VsZiA9PSBOVUxMKQotICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwotICAgIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8KLSAgICBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4ID0gKHZhbHVlID4gMCkgPyB2YWx1ZSA6IC0xOwotICAgIGlmICggKHZhbHVlID4gMCkKLSAgICAgICYmICh2YWx1ZSA8IHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW4pICkKLSAgICB7IC8qIE1BWCA8IE1JTiB3b3VsZCBiZSBhbiBpbnZhbGlkIHN0YXRlLiBUaHVzIHNldCBNSU4gPSBNQVggaW4gdGhpcyBjYXNlLiAqLwotICAgICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01pbiA9IHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXg7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFOgotICAgIHN3aXRjaCAoKERVQUxfQ0hBTk5FTF9NT0RFKXZhbHVlKSB7Ci0gICAgY2FzZSBTVEVSRU9fTU9ERToKLSAgICBjYXNlIENIMV9NT0RFOgotICAgIGNhc2UgQ0gyX01PREU6Ci0gICAgY2FzZSBNSVhFRF9NT0RFOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOwotICAgIH0KLSAgICBpZiAoc2VsZiA9PSBOVUxMKQotICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwotICAgIHNlbGYtPnVzZXJQYXJhbXMuZHVhbENoYW5uZWxNb2RlID0gKERVQUxfQ0hBTk5FTF9NT0RFKXZhbHVlOwotICAgIHNlbGYtPmFwcGx5UHJvY2Vzc2luZyA9IDE7ICAvKiBGb3JjZSBwcm9jZXNzaW5nICovCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSBETVhfUFNFVURPX1NVUlJPVU5EX01PREU6Ci0gICAgc3dpdGNoICgoUFNFVURPX1NVUlJPVU5EX01PREUpdmFsdWUpIHsKLSAgICBjYXNlIE5FVkVSX0RPX1BTX0RNWDoKLSAgICBjYXNlIEFVVE9fUFNfRE1YOgotICAgIGNhc2UgRk9SQ0VfUFNfRE1YOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOwotICAgIH0KLSAgICBpZiAoc2VsZiA9PSBOVUxMKQotICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwotICAgIHNlbGYtPnVzZXJQYXJhbXMucHNldWRvU3Vyck1vZGUgPSAoUFNFVURPX1NVUlJPVU5EX01PREUpdmFsdWU7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gKFBDTURNWF9VTktOT1dOX1BBUkFNKTsKLSAgfQotCi0gIHJldHVybiAoUENNRE1YX09LKTsKLX0KLQotLyoqIEdldCBvbmUgcGFyYW1ldGVyIHZhbHVlIG9mIG9uZSBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCi0gKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgotICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHRvIGJlIHNldC4KLSAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGJ1ZmZlciByZWNlaXZpbmcgdGhlIHBhcmFtZXRlciB2YWx1ZS4KLSAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfR2V0UGFyYW0gKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKLSAgICBjb25zdCBQQ01ETVhfUEFSQU0gIHBhcmFtLAotICAgIElOVCAqIGNvbnN0ICAgICAgICAgcFZhbHVlCi0gICkKLXsKLSAgUENNX0RNWF9VU0VSX1BBUkFNUyAqcFVzclBhcmFtczsKLQotICBpZiAoIChzZWxmID09IE5VTEwpCi0gICAgfHwgKHBWYWx1ZSA9PSBOVUxMKSApIHsKLSAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7Ci0gIH0KLSAgcFVzclBhcmFtcyA9ICZzZWxmLT51c2VyUGFyYW1zOwotCi0gIHN3aXRjaCAocGFyYW0pCi0gIHsKLSAgY2FzZSBETVhfQlNfREFUQV9FWFBJUllfRlJBTUU6Ci0gICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZXhwaXJ5RnJhbWU7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRE1YX0JTX0RBVEFfREVMQVk6Ci0gICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZnJhbWVEZWxheTsKLSAgICBicmVhazsKLSAgY2FzZSBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKLSAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5udW1PdXRDaGFubmVsc01pbjsKLSAgICBicmVhazsKLSAgY2FzZSBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKLSAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5udW1PdXRDaGFubmVsc01heDsKLSAgICBicmVhazsKLSAgY2FzZSBETVhfRFVBTF9DSEFOTkVMX01PREU6Ci0gICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZHVhbENoYW5uZWxNb2RlOwotICAgIGJyZWFrOwotICBjYXNlIERNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERToKLSAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gKFBDTURNWF9VTktOT1dOX1BBUkFNKTsKLSAgfQotCi0gIHJldHVybiAoUENNRE1YX09LKTsKLX0KLQotCi0jaWZkZWYgRFNFX01FVEFEQVRBX0VOQUJMRQotCi0jZGVmaW5lIE1BWF9EU0VfQU5DX0JZVEVTICAgICAgICggMTYgKSAgICAvKiAxNSBieXRlcyAqLwotI2RlZmluZSBBTkNfREFUQV9TWU5DX0JZVEUgICAgICAoIDB4QkMgKSAgLyogYW5jaWxsYXJ5IGRhdGEgc3luYyBieXRlLiAqLwotCi0vKgotICogUmVhZCBETVggbWV0YS1kYXRhIGZyb20gYSBkYXRhIHN0cmVhbSBlbGVtZW50LgotICovCi1QQ01ETVhfRVJST1IgcGNtRG14X1BhcnNlICgKLSAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCi0gICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKLSAgICBVSU5UICBhbmNEYXRhQml0cywKLSAgICBpbnQgICAgaXNNcGVnMgotICApCi17Ci0gIFBDTURNWF9FUlJPUiBlcnJvclN0YXR1cyA9IFBDTURNWF9PSzsKLSAgRE1YX0JTX01FVEFfREFUQSAqcEJzTWV0YURhdGEgPSAmc2VsZi0+YnNNZXRhRGF0YVswXTsKLQotICBpbnQgICBza2lwNERteCA9IDAsIHNraXA0RXh0ID0gMDsKLSAgaW50ICAgZG14THZsQXZhaWwgPSAwLCBleHREYXRhQXZhaWwgPSAwOwotICBpbnQgICBmb3VuZE5ld0RhdGEgPSAwOwotICBVSU5UICBtaW5BbmNCaXRzID0gKChpc01wZWcyKSA/IDUgOiAzKSo4OwotCi0gIGlmICggKHNlbGYgPT0gTlVMTCkKLSAgICB8fCAoaEJzICA9PSBOVUxMKSApIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOyB9Ci0KLSAgYW5jRGF0YUJpdHMgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKLQotICAvKiBzYW5pdHkgY2hlY2tzICovCi0gIGlmICggKGFuY0RhdGFCaXRzIDwgbWluQW5jQml0cykKLSAgICB8fCAoYW5jRGF0YUJpdHMgPiBGREtnZXRWYWxpZEJpdHMoaEJzKSkgKSB7Ci0gICAgcmV0dXJuIChQQ01ETVhfQ09SUlVQVF9BTkNfREFUQSk7Ci0gIH0KLQotICBwQnNNZXRhRGF0YSA9ICZzZWxmLT5ic01ldGFEYXRhWzBdOwotCi0gIGlmIChpc01wZWcyKSB7Ci0gICAgLyogc2tpcCBEVkQgYW5jaWxsYXJ5IGRhdGEgKi8KLSAgICBGREtwdXNoRm9yKGhCcywgMTYpOwotICB9Ci0KLSAgLyogY2hlY2sgc3luYyB3b3JkICovCi0gIGlmIChGREtyZWFkQml0cyhoQnMsOCkgIT0gQU5DX0RBVEFfU1lOQ19CWVRFKSB7Ci0gICAgcmV0dXJuIChQQ01ETVhfQ09SUlVQVF9BTkNfREFUQSk7Ci0gIH0KLQotICAvKiBza2lwIE1QRUcgYXVkaW8gdHlwZSBhbmQgRG9sYnkgc3Vycm91bmQgbW9kZSAqLwotICBGREtwdXNoRm9yKGhCcywgNCk7Ci0KLSAgaWYgKGlzTXBlZzIpIHsKLSAgICAvKiBpbnQgbnVtQW5jQnl0ZXMgPSAqLyBGREtyZWFkQml0cyhoQnMsIDQpOwotICAgIC8qIGFkdmFuY2VkIGR5bmFtaWMgcmFuZ2UgY29udHJvbCAqLwotICAgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RG14ICs9IDI0OwotICAgIC8qIGRpYWxvZyBub3JtYWxpemF0aW9uICovCi0gICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDREbXggKz0gODsKLSAgICAvKiByZXByb2R1Y3Rpb25fbGV2ZWwgKi8KLSAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNERteCArPSA4OwotICB9IGVsc2UgewotICAgIEZES3B1c2hGb3IoaEJzLCAyKTsgICAvKiBkcmMgcHJlc2VudGF0aW9uIG1vZGUgKi8KLSAgICBwQnNNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQgPSBGREtyZWFkQml0KGhCcyk7Ci0gICAgRkRLcHVzaEZvcihoQnMsIDQpOyAgIC8qIHJlc2VydmVkIGJpdHMgKi8KLSAgfQotCi0gIC8qIGRvd25taXhpbmcgbGV2ZWxzIE1QRUd4IHN0YXR1cyAqLwotICBkbXhMdmxBdmFpbCAgPSBGREtyZWFkQml0KGhCcyk7Ci0KLSAgaWYgKGlzTXBlZzIpIHsKLSAgICAvKiBzY2FsZSBmYWN0b3IgQ1JDIHN0YXR1cyAqLwotICAgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OwotICB9IGVsc2UgewotICAgIC8qIGFuY2lsbGFyeSBkYXRhIGV4dGVuc2lvbiBzdGF0dXMgKi8KLSAgICBleHREYXRhQXZhaWwgPSBGREtyZWFkQml0KGhCcyk7Ci0gIH0KLQotICAvKiBhdWRpbyBjb2RpbmcgYW5kIGNvbXByZXNzaW9uIHN0YXR1cyAqLwotICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNEV4dCArPSAxNjsKLSAgLyogY29hcnNlIGdyYWluIHRpbWVjb2RlIHN0YXR1cyAqLwotICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNEV4dCArPSAxNjsKLSAgLyogZmluZSBncmFpbiB0aW1lY29kZSBzdGF0dXMgKi8KLSAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDRFeHQgKz0gMTY7Ci0KLSAgLyogc2tpcCB0aGUgdXNlbGVzcyBkYXRhIHRvIGdldCB0byB0aGUgRE1YIGxldmVscyAqLwotICBGREtwdXNoRm9yKGhCcywgc2tpcDREbXgpOwotCi0gIC8qIGRvd25taXhfbGV2ZWxzX01QRUdYICovCi0gIGlmIChkbXhMdmxBdmFpbCkKLSAgewotICAgIGlmIChGREtyZWFkQml0KGhCcykpIHsgIC8qIGNlbnRlcl9taXhfbGV2ZWxfb24gKi8KLSAgICAgIHBCc01ldGFEYXRhLT5jTGV2SWR4ID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKLSAgICAgIGZvdW5kTmV3RGF0YSA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZES3JlYWRCaXRzKGhCcywgMyk7Ci0gICAgfQotICAgIGlmIChGREtyZWFkQml0KGhCcykpIHsgIC8qIHN1cnJvdW5kX21peF9sZXZlbF9vbiAqLwotICAgICAgcEJzTWV0YURhdGEtPnNMZXZJZHggPSBGREtyZWFkQml0cyhoQnMsIDMpOwotICAgICAgZm91bmROZXdEYXRhID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgRkRLcmVhZEJpdHMoaEJzLCAzKTsKLSAgICB9Ci0gIH0KLQotICAvKiBza2lwIHRoZSB1c2VsZXNzIGRhdGEgdG8gZ2V0IHRvIHRoZSBhbmNpbGxhcnkgZGF0YSBleHRlbnNpb24gKi8KLSAgRkRLcHVzaEZvcihoQnMsIHNraXA0RXh0KTsKLQotICAvKiBhbmMgZGF0YSBleHRlbnNpb24gKE1QRUctNCBvbmx5KSAqLwotICBpZiAoZXh0RGF0YUF2YWlsKSB7Ci0gICAgaW50IGV4dERteEx2bFN0LCBleHREbXhHYWluU3QsIGV4dERteExmZVN0OwotCi0gICAgRkRLcmVhZEJpdChoQnMpOyAgICAgICAgLyogcmVzZXJ2ZWQgYml0ICovCi0gICAgZXh0RG14THZsU3QgID0gRkRLcmVhZEJpdChoQnMpOwotICAgIGV4dERteEdhaW5TdCA9IEZES3JlYWRCaXQoaEJzKTsKLSAgICBleHREbXhMZmVTdCAgPSBGREtyZWFkQml0KGhCcyk7Ci0gICAgRkRLcmVhZEJpdHMoaEJzLCA0KTsgICAgLyogcmVzZXJ2ZWQgYml0cyAqLwotCi0gICAgaWYgKGV4dERteEx2bFN0KSB7Ci0gICAgICBwQnNNZXRhRGF0YS0+ZG1peElkeEEgPSBGREtyZWFkQml0cyhoQnMsIDMpOwotICAgICAgcEJzTWV0YURhdGEtPmRtaXhJZHhCID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKLSAgICAgIEZES3JlYWRCaXRzKGhCcywgMik7ICAvKiByZXNlcnZlZCBiaXRzICovCi0gICAgICBmb3VuZE5ld0RhdGEgPSAxOwotICAgIH0KLSAgICBpZiAoZXh0RG14R2FpblN0KSB7Ci0gICAgICBwQnNNZXRhRGF0YS0+ZG14R2FpbklkeDUgPSBGREtyZWFkQml0cyhoQnMsIDcpOwotICAgICAgRkRLcmVhZEJpdChoQnMpOyAgICAgIC8qIHJlc2VydmVkIGJpdCAqLwotICAgICAgcEJzTWV0YURhdGEtPmRteEdhaW5JZHgyID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKLSAgICAgIEZES3JlYWRCaXQoaEJzKTsgICAgICAvKiByZXNlcnZlZCBiaXQgKi8KLSAgICAgIGZvdW5kTmV3RGF0YSA9IDE7Ci0gICAgfQotICAgIGlmIChleHREbXhMZmVTdCkgewotICAgICAgcEJzTWV0YURhdGEtPmRtaXhJZHhMZmUgPSBGREtyZWFkQml0cyhoQnMsIDQpOwotICAgICAgRkRLcmVhZEJpdHMoaEJzLCA0KTsgIC8qIHJlc2VydmVkIGJpdHMgKi8KLSAgICAgIGZvdW5kTmV3RGF0YSA9IDE7Ci0gICAgfQotICB9Ci0KLSAgLyogZmluYWwgc2FuaXR5IGNoZWNrIG9uIHRoZSBhbW91bnQgb2YgcmVhZCBkYXRhICovCi0gIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpIDwgMCkgewotICAgIGVycm9yU3RhdHVzID0gUENNRE1YX0NPUlJVUFRfQU5DX0RBVEE7Ci0gIH0KLQotICBpZiAoIChlcnJvclN0YXR1cyAgPT0gUENNRE1YX09LKQotICAgICYmIChmb3VuZE5ld0RhdGEgPT0gMSkgKSB7Ci0gICAgLyogYW5ub3VuY2UgbmV3IGRhdGEgKi8KLSAgICBwQnNNZXRhRGF0YS0+dHlwZUZsYWdzIHw9IFRZUEVfRFNFX0RBVEE7Ci0gICAgLyogcmVzZXQgZXhwaXJ5IGNvdW50ZXIgKi8KLSAgICBwQnNNZXRhRGF0YS0+ZXhwaXJ5Q291bnQgPSAwOwotICB9Ci0KLSAgcmV0dXJuIChlcnJvclN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBSZWFkIERNWCBtZXRhLWRhdGEgZnJvbSBhIGRhdGEgc3RyZWFtIGVsZW1lbnQuCi0gKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfUmVhZER2YkFuY0RhdGEgKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKLSAgICBVQ0hBUiAqcEFuY0RhdGFCdWYsCi0gICAgVUlOVCAgIGFuY0RhdGFCeXRlcywKLSAgICBpbnQgICAgaXNNcGVnMgotICApCi17Ci0gIEZES19CSVRTVFJFQU0gYnM7Ci0gIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9ICZiczsKLSAgUENNRE1YX0VSUk9SIGVycm9yU3RhdHVzID0gUENNRE1YX09LOwotCi0gIGlmIChzZWxmID09IE5VTEwpIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOyB9Ci0KLSAgLyogc2FuaXR5IGNoZWNrcyAqLwotICBpZiAoIChwQW5jRGF0YUJ1ZiA9PSBOVUxMKQotICAgIHx8IChhbmNEYXRhQnl0ZXMgPT0gMCkgKSB7Ci0gICAgcmV0dXJuIChQQ01ETVhfQ09SUlVQVF9BTkNfREFUQSk7Ci0gIH0KLQotICBGREtpbml0Qml0U3RyZWFtIChoQnMsIHBBbmNEYXRhQnVmLCBNQVhfRFNFX0FOQ19CWVRFUywgYW5jRGF0YUJ5dGVzKjgsIEJTX1JFQURFUik7Ci0KLSAgZXJyb3JTdGF0dXMgPSBwY21EbXhfUGFyc2UgKAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuY0RhdGFCeXRlcyo4LAotICAgICAgICAgICAgICAgICAgICAgICAgaXNNcGVnMiApOwotCi0gIHJldHVybiAoZXJyb3JTdGF0dXMpOwotfQotI2VuZGlmICAvKiBEU0VfTUVUQURBVEFfRU5BQkxFICovCi0KLSNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCi0vKiogU2V0IHRoZSBtYXRyaXggbWl4ZG93biBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZnJvbSB0aGUgUENFIG9mIGFuIEFBQyBiaXRzdHJlYW0uCi0gKiAgTm90ZTogQ2FsbCBvbmx5IGlmIG1hdHJpeF9taXhkb3duX2lkeF9wcmVzZW50IGlzIHRydWUuCi0gKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgotICogQHBhcmFtIFtpbl0gVGhlIDIgYml0IG1hdHJpeCBtaXhkb3duIGluZGV4IGV4dHJhY3RlZCBmcm9tIFBDRS4KLSAqIEBwYXJhbSBbaW5dIFRoZSBwc2V1ZG8gc3Vycm91bmQgZW5hYmxlIGZsYWcgZXh0cmFjdGVkIGZyb20gUENFLgotICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICoqLwotUENNRE1YX0VSUk9SIHBjbURteF9TZXRNYXRyaXhNaXhkb3duRnJvbVBjZSAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAotICAgIGludCAgICAgICAgICAgICAgICAgbWF0cml4TWl4ZG93blByZXNlbnQsCi0gICAgaW50ICAgICAgICAgICAgICAgICBtYXRyaXhNaXhkb3duSWR4LAotICAgIGludCAgICAgICAgICAgICAgICAgcHNldWRvU3Vycm91bmRFbmFibGUKLSAgKQotewotICBETVhfQlNfTUVUQV9EQVRBICpwQnNNZXRhRGF0YSA9ICZzZWxmLT5ic01ldGFEYXRhWzBdOwotCi0gIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7Ci0gIH0KLQotICBpZiAobWF0cml4TWl4ZG93blByZXNlbnQpIHsKLSAgICBwQnNNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQgPSBwc2V1ZG9TdXJyb3VuZEVuYWJsZTsKLSAgICBwQnNNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeCA9IG1hdHJpeE1peGRvd25JZHggJiAweDAzOwotICAgIHBCc01ldGFEYXRhLT50eXBlRmxhZ3MgfD0gVFlQRV9QQ0VfREFUQTsKLSAgICAvKiBSZXNldCBleHBpcnkgY291bnRlciAqLwotICAgIHBCc01ldGFEYXRhLT5leHBpcnlDb3VudCA9IDA7Ci0gIH0KLQotICByZXR1cm4gKFBDTURNWF9PSyk7Ci19Ci0jZW5kaWYgIC8qIFBDRV9NRVRBREFUQV9FTkFCTEUgKi8KLQotCi0vKiogQXBwbHkgZG93biBvciB1cCBtaXhpbmcuCi0gKiBAcGFyYW0gW2luXSAgICBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgotICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBidWZmZXIgdGhhdCBob2xkIHRoZSB0aW1lIGRvbWFpbiBzaWduYWwuCi0gKiBAcGFyYW0gW2luXSAgICBQb2ludGVyIHdoZXJlIHRoZSBhbW91bnQgb2Ygb3V0cHV0IHNhbXBsZXMgaXMgcmV0dXJuZWQgaW50by4KLSAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgd2hlcmUgdGhlIGFtb3VudCBvZiBvdXRwdXQgY2hhbm5lbHMgaXMgcmV0dXJuZWQgaW50by4KLSAqIEBwYXJhbSBbaW5dICAgIEZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIG91dHB1dCB0aW1lIGRhdGEgYXJlIHdyaXR0ZXJuIGludGVybGVhdmVkIG9yIGFzIHN1YnNlcXVlbnQgYmxvY2tzLgotICogQHBhcmFtIFtpbm91dF0gQXJyYXkgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsIGlzIHN0b3JlZCBpbnRvLgotICogQHBhcmFtIFtpbm91dF0gQXJyYXkgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsIGlzIHN0b3JlZCBpbnRvLgotICogQHBhcmFtIFtpbl0gICAgQXJyYXkgY29udGFpbmluZyB0aGUgb3V0IGNoYW5uZWwgbWFwcGluZyB0byBiZSB1c2VkIChGcm9tIE1QRUcgUENFIG9yZGVyaW5nIHRvIHdoYXRldmVyIGlzIHJlcXVpcmVkKS4KLSAqIEBwYXJhbSBbb3V0XSAgIFBvaW50ZXIgb24gYSBmaWVsZCByZWNlaXZpbmcgdGhlIHNjYWxlIGZhY3RvciB0aGF0IGhhcyB0byBiZSBhcHBsaWVkIG9uIGFsbCBzYW1wbGVzIGFmdGVyd2FyZHMuCi0gKiAgICAgICAgICAgICAgICBJZiB0aGUgaGFuZGVkIHBvaW50ZXIgaXMgTlVMTCBzY2FsaW5nIGlzIGRvbmUgaW50ZXJuYWxseS4KLSAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfQXBwbHlGcmFtZSAoCi0gICAgICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgICAgIHNlbGYsCi0gICAgICAgIElOVF9QQ00gICAgICAgICAgICAgICAgKnBQY21CdWYsCi0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAqbkNoYW5uZWxzLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBmSW50ZXJsZWF2ZWQsCi0gICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSAgICAgIGNoYW5uZWxUeXBlW10sCi0gICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW10sCi0gICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nW11bOF0sCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgKnBEbXhPdXRTY2FsZQotICApCi17Ci0gIFBDTV9ETVhfVVNFUl9QQVJBTVMgICpwUGFyYW0gPSBOVUxMOwotICBQQ01ETVhfRVJST1IgIGVycm9yU3RhdHVzID0gUENNRE1YX09LOwotICBEVUFMX0NIQU5ORUxfTU9ERSAgZHVhbENoYW5uZWxNb2RlOwotICBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgaW5DaE1vZGU7Ci0gIFBDTV9ETVhfQ0hBTk5FTF9NT0RFICBvdXRDaE1vZGU7Ci0gIElOVCAgIGRldk51bGw7ICAvKiBKdXN0IGEgZHVtbXkgdG8gYXZvaWQgYSBsb3Qgb2YgYnJhbmNoZXMgaW4gdGhlIGNvZGUgKi8KLSAgaW50ICAgbnVtT3V0Q2hhbm5lbHMsIG51bUluQ2hhbm5lbHM7Ci0gIGludCAgIGluU3RyaWRlLCBvdXRTdHJpZGUsIG9mZnNldDsKLSAgaW50ICAgZG14TWF4U2NhbGUsIGRteFNjYWxlOwotICBpbnQgICBjaCwgc2xvdDsKLSAgVUNIQVIgaW5PZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0KLSAgRE1YX0JTX01FVEFfREFUQSAgYnNNZXRhRGF0YTsKLQotICBpZiAoIChzZWxmICAgICAgICAgICA9PSBOVUxMKQotICAgIHx8IChuQ2hhbm5lbHMgICAgICA9PSBOVUxMKQotICAgIHx8IChjaGFubmVsVHlwZSAgICA9PSBOVUxMKQotICAgIHx8IChjaGFubmVsSW5kaWNlcyA9PSBOVUxMKQotICAgIHx8IChjaGFubmVsTWFwcGluZyA9PSBOVUxMKSApIHsKLSAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7Ci0gIH0KLQotICAvKiBJbml0IHRoZSBvdXRwdXQgc2NhbGluZyAqLwotICBkbXhTY2FsZSA9IDA7Ci0gIGlmIChwRG14T3V0U2NhbGUgIT0gTlVMTCkgewotICAgIC8qIEF2b2lkIGZpbmFsIHNjYWxpbmcgaW50ZXJuYWxseSBhbmQgaGFuZCBpdCB0byB0aGUgb3V0c2lkZSB3b3JsZC4gKi8KLSAgICAqcERteE91dFNjYWxlID0gMDsKLSAgICBkbXhNYXhTY2FsZSA9IFBDTURNWF9NQVhfSEVBRFJPT007Ci0gIH0gZWxzZSB7Ci0gICAgLyogQXBwbHkgdGhlIHNjYWxpbmcgaW50ZXJuYWxseS4gKi8KLSAgICBwRG14T3V0U2NhbGUgPSAmZGV2TnVsbDsgIC8qIHJlZGlyZWN0IHRvIHRlbXBvcmFsIHN0YWNrIG1lbW9yeSAqLwotICAgIGRteE1heFNjYWxlID0gMDsKLSAgfQotCi0gIHBQYXJhbSA9ICZzZWxmLT51c2VyUGFyYW1zOwotICBudW1JbkNoYW5uZWxzID0gKm5DaGFubmVsczsKLQotICAvKiBQZXJmb3JtIHNvbWUgaW5wdXQgc2FuaXR5IGNoZWNrcyAqLwotICBpZiAocFBjbUJ1ZiA9PSBOVUxMKSAgICAgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0FSR1VNRU5UKTsgfQotICBpZiAoZnJhbWVTaXplID09IDApICAgICAgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0FSR1VNRU5UKTsgfQotICBpZiAoIChudW1JbkNoYW5uZWxzID09IDApCi0gICAgfHwgKG51bUluQ2hhbm5lbHMgPiBQQ01fRE1YX01BWF9JTl9DSEFOTkVMUykgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0FSR1VNRU5UKTsgfQotCi0gIC8qIENoZWNrIG9uIG1pc2NvbmZpZ3VyYXRpb24gKi8KLSAgRkRLX0FTU0VSVCggKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPD0gMCkgXAotICAgICAgICAgICB8fCAocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA+PSBwUGFyYW0tPm51bU91dENoYW5uZWxzTWluKSk7Ci0KLSAgLyogRGV0ZXJtaW5lIGlmIHRoZSBtb2R1bGUgaGFzIHRvIGRvIHByb2Nlc3NpbmcgKi8KLSAgaWYgKCAgIChzZWxmLT5hcHBseVByb2Nlc3NpbmcgPT0gMCkKLSAgICAmJiAgKChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4IDw9IDApCi0gICAgICB8fCAocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA+PSBudW1JbkNoYW5uZWxzKSkKLSAgICAmJiAgIChwUGFyYW0tPm51bU91dENoYW5uZWxzTWluIDw9IG51bUluQ2hhbm5lbHMpICkgewotICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KLSAgICByZXR1cm4gKGVycm9yU3RhdHVzKTsKLSAgfQotCi0gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLwotICBpZiAoIChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4ID4gMCkKLSAgICAmJiAobnVtSW5DaGFubmVscyA+IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXgpICkgewotICAgIG51bU91dENoYW5uZWxzID0gcFBhcmFtLT5udW1PdXRDaGFubmVsc01heDsKLSAgfQotICBlbHNlIGlmIChudW1JbkNoYW5uZWxzIDwgcFBhcmFtLT5udW1PdXRDaGFubmVsc01pbikgewotICAgIG51bU91dENoYW5uZWxzID0gcFBhcmFtLT5udW1PdXRDaGFubmVsc01pbjsKLSAgfQotICBlbHNlIHsKLSAgICBudW1PdXRDaGFubmVscyA9IG51bUluQ2hhbm5lbHM7Ci0gIH0KLQotICBkdWFsQ2hhbm5lbE1vZGUgPSBwUGFyYW0tPmR1YWxDaGFubmVsTW9kZTsKLQotICAvKiBBbmFseXNlIGlucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBhbmQgZ2V0IGNoYW5uZWwgb2Zmc2V0Ci0gICAqIHRhYmxlIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIGZpeGVkIGNoYW5uZWwgbGFiZWxzLiAqLwotICBlcnJvclN0YXR1cyA9IGdldENoYW5uZWxNb2RlKAotICAgICAgICAgICAgICAgICAgIG51bUluQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgY2hhbm5lbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXMsCi0gICAgICAgICAgICAgICAgICAgaW5PZmZzZXRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICZpbkNoTW9kZQotICAgICAgICAgICAgICAgICApOwotICBpZiAoIFBDTURNWF9JU19GQVRBTF9FUlJPUihlcnJvclN0YXR1cykKLSAgICB8fCAoaW5DaE1vZGUgPT0gQ0hfTU9ERV9VTkRFRklORUQpICkgewotICAgIC8qIFdlIGRvbid0IG5lZWQgdG8gcmVzdG9yZSBiZWNhdXNlIHRoZSBjaGFubmVsCi0gICAgICAgY29uZmlndXJhdGlvbiBoYXMgbm90IGJlZW4gY2hhbmdlZC4gSnVzdCBleGl0LiAqLwotICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfQ0hfQ09ORklHKTsKLSAgfQotCi0gIC8qIFNldCBpbnB1dCBzdHJpZGUgYW5kIG9mZnNldCAqLwotICBpZiAoZkludGVybGVhdmVkKSB7Ci0gICAgaW5TdHJpZGUgID0gbnVtSW5DaGFubmVsczsKLSAgICBvZmZzZXQgPSAxOyAgICAgICAgICAgICAgICAvKiBDaGFubmVsIHNwZWNpZmljIG9mZnNldCBmYWN0b3IgKi8KLSAgfSBlbHNlIHsKLSAgICBpblN0cmlkZSAgPSAxOwotICAgIG9mZnNldCA9IGZyYW1lU2l6ZTsgICAgICAgIC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLwotICB9Ci0KLSAgLyogUmVzZXQgZG93bm1peCBtZXRhIGRhdGEgaWYgbmVjZXNzYXJ5ICovCi0gIGlmICggKHBQYXJhbS0+ZXhwaXJ5RnJhbWUgPiAwKQotICAgICYmICgrK3NlbGYtPmJzTWV0YURhdGFbMF0uZXhwaXJ5Q291bnQgPiBwUGFyYW0tPmV4cGlyeUZyYW1lKSApCi0gIHsgLyogVGhlIG1ldGFkYXRhIHJlYWQgZnJvbSBiaXRzdHJlYW0gaXMgdG9vIG9sZC4gKi8KLSAgICBQQ01ETVhfRVJST1IgZXJyID0gcGNtRG14X1Jlc2V0KHNlbGYsIFBDTURNWF9SRVNFVF9CU19EQVRBKTsKLSAgICBGREtfQVNTRVJUKGVyciA9PSBQQ01ETVhfT0spOwotICB9Ci0gIEZES21lbWNweSgmYnNNZXRhRGF0YSwgJnNlbGYtPmJzTWV0YURhdGFbcFBhcmFtLT5mcmFtZURlbGF5XSwgc2l6ZW9mKERNWF9CU19NRVRBX0RBVEEpKTsKLSAgLyogTWFpbnRhaW4gZGVsYXkgbGluZSAqLwotICBmb3IgKHNsb3QgPSBwUGFyYW0tPmZyYW1lRGVsYXk7IHNsb3QgPiAwOyBzbG90IC09IDEpIHsKLSAgICBGREttZW1jcHkoJnNlbGYtPmJzTWV0YURhdGFbc2xvdF0sICZzZWxmLT5ic01ldGFEYXRhW3Nsb3QtMV0sIHNpemVvZihETVhfQlNfTUVUQV9EQVRBKSk7Ci0gIH0KLQotICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KLSNpZmRlZiBQQ01fRE9XTk1JWF9FTkFCTEUKLSAgaWYgKCBudW1JbkNoYW5uZWxzID4gbnVtT3V0Q2hhbm5lbHMgKQotICB7IC8qIEFwcGx5IGRvd25taXggKi8KLSAgICBJTlRfUENNICAqcEluUGNtW1BDTV9ETVhfTUFYX0lOX0NIQU5ORUxTXSA9IHsgTlVMTCB9OwotICAgIElOVF9QQ00gICpwT3V0UGNtW1BDTV9ETVhfTUFYX09VVF9DSEFOTkVMU10gPSB7IE5VTEwgfTsKLSAgICBGSVhQX0RNWCAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwotICAgIFVDSEFSICAgICBvdXRPZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0gICAgVUlOVCAgICAgIHNhbXBsZTsKLSAgICBpbnQgICAgICAgY2hDZmcgPSAwOwotICAgIGludCAgICAgICBieXBTY2FsZSA9IDA7Ci0KLSNpZiAoUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMgPj0gNykKLSAgICBpZiAobnVtSW5DaGFubmVscyA+IFNJWF9DSEFOTkVMKSB7Ci0gICAgICBBVURJT19DSEFOTkVMX1RZUEUgbXVsdGlQdXJwb3NlQ2hUeXBlWzJdOwotCi0gICAgICAvKiBHZXQgdGhlIHR5cGUgb2YgdGhlIG11bHRpcHVycG9zZSBjaGFubmVscyAqLwotICAgICAgbXVsdGlQdXJwb3NlQ2hUeXBlWzBdID0gY2hhbm5lbFR5cGVbaW5PZmZzZXRUYWJsZVtMRUZUX01VTFRJUFJQU19DSEFOTkVMXV07Ci0gICAgICBtdWx0aVB1cnBvc2VDaFR5cGVbMV0gPSBjaGFubmVsVHlwZVtpbk9mZnNldFRhYmxlW1JJR0hUX01VTFRJUFJQU19DSEFOTkVMXV07Ci0KLSAgICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBjb25maWd1cmF0aW9uIGlzIG9uZSBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZC4gKi8KLSAgICAgIHN3aXRjaCAoaW5DaE1vZGUpIHsKLSAgICAgIGNhc2UgQ0hfTU9ERV81XzBfMl8xOiAgLyogY2hDZmcgNyB8fCAxNCAqLwotICAgICAgICAvKiBGdXJ0aGVyIGFuYWx5c2UgdGhlIGlucHV0IGNvbmZpZyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIENIX01PREVfNV8wXzJfMSBjb25maWdzLiAqLwotICAgICAgICBpZiAoIChtdWx0aVB1cnBvc2VDaFR5cGVbMF0gPT0gQUNUX0ZST05UX1RPUCkKLSAgICAgICAgICAmJiAobXVsdGlQdXJwb3NlQ2hUeXBlWzFdID09IEFDVF9GUk9OVF9UT1ApICkgewotICAgICAgICAgIGNoQ2ZnID0gMTQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2hDZmcgPSA3OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDSF9NT0RFXzNfMF8zXzE6ICAvKiBjaENmZyAxMSAqLwotICAgICAgICBjaENmZyA9IDExOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQ0hfTU9ERV8zXzBfNF8xOiAgLyogY2hDZmcgMTIgKi8KLSAgICAgICAgY2hDZmcgPSAxMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBjaENmZyA9IDA7ICAvKiBOb3QgYSBrbm93biBjb25maWcgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBTZXQgdGhpcyBzdGFnZXMgb3V0cHV0IHN0cmlkZSBhbmQgY2hhbm5lbCBtb2RlOiAqLwotICAgIG91dFN0cmlkZSA9IChmSW50ZXJsZWF2ZWQpID8gbnVtT3V0Q2hhbm5lbHMgOiAxOwotICAgIG91dENoTW9kZSA9IG91dENoTW9kZVRhYmxlW251bU91dENoYW5uZWxzXTsKLQotICAgIC8qIEdldCBjaGFubmVsIGRlc2NyaXB0aW9uIGFuZCBjaGFubmVsIG1hcHBpbmcgZm9yIHRoZSBkZXNpcmVkIG91dHB1dCBjb25maWd1cmF0aW9uLiAqLwotICAgIGdldENoYW5uZWxEZXNjcmlwdGlvbigKLSAgICAgICAgICAgIG91dENoTW9kZSwKLSAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLAotICAgICAgICAgICAgY2hhbm5lbFR5cGUsCi0gICAgICAgICAgICBjaGFubmVsSW5kaWNlcywKLSAgICAgICAgICAgIG91dE9mZnNldFRhYmxlCi0gICAgICAgICAgICk7Ci0gICAgLyogTm93IHRoZXJlIGlzIG5vIHdheSBiYWNrIGJlY2F1c2Ugd2UgbW9kaWZpZWQgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiEgKi8KLQotICAgIC8qIENyZWF0ZSB0aGUgRE1YIG1hdHJpeCAqLwotICAgIGVycm9yU3RhdHVzID0gZ2V0TWl4RmFjdG9ycyAoCi0gICAgICAgICAgICAgICAgICAgICAgIChjaENmZz4wKSA/IDEgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICAoY2hDZmc+MCkgPyAoUENNX0RNWF9DSEFOTkVMX01PREUpY2hDZmcgOiBpbkNoTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgJmJzTWV0YURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIG1peEZhY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgJmRteFNjYWxlCi0gICAgICAgICAgICAgICAgICAgICApOwotICAgIC8qIE5vIGZhdGFsIGVycm9ycyBjYW4gb2NjdXIgaGVyZS4gVGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGFsd2F5cyByZXR1cm4gYSB2YWxpZCBtYXRyaXguCi0gICAgICAgVGhlIGVycm9yIGNvZGUgaXMgdXNlZCB0byBzaWduYWwgY29uZmlndXJhdGlvbnMgYW5kIG1hdHJpY2VzIHRoYXQgYXJlIG5vdCBjb25mb3JtIHRvIGFueSBzdGFuZGFyZC4gKi8KLQotICAgIC8qIERldGVybWluZSB0aGUgZmluYWwgc2NhbGluZyAqLwotICAgIGJ5cFNjYWxlID0gRkRLbWluKGRteE1heFNjYWxlLCBkbXhTY2FsZSk7Ci0gICAgKnBEbXhPdXRTY2FsZSArPSBieXBTY2FsZTsKLSAgICBkbXhTY2FsZSAtPSBieXBTY2FsZTsKLQotICAgIHsgLyogU2V0IGNoYW5uZWwgcG9pbnRlciBmb3IgaW5wdXQuIFJlbW92ZSBlbXB0eSBjb2xzLiAqLwotICAgICAgaW50IGluQ2gsIG91dENoLCBtYXBbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwotICAgICAgY2ggPSAwOwotICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgewotICAgICAgICBpZiAoaW5PZmZzZXRUYWJsZVtpbkNoXSAhPSAyNTUpIHsKLSAgICAgICAgICBwSW5QY21bY2hdID0gJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtpbkNoXSpvZmZzZXRdOwotICAgICAgICAgIG1hcFtjaCsrXSAgPSBpbkNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoY2ggIT0gbnVtSW5DaGFubmVscykgewotI2lmbmRlZiBfX2xpbnV4X18KLSAgICAgICAgICBBTE9HRSgiYi8yMzg3NjQ0NCIpOwotI2VuZGlmCi0gICAgICAgICAgcmV0dXJuIFBDTURNWF9JTlZBTElEX0FSR1VNRU5UOwotICAgICAgfQotCi0gICAgICAvKiBSZW1vdmUgdW51c2VkIGNvbHMgZnJvbSBmYWN0b3IgbWF0cml4ICovCi0gICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IG51bUluQ2hhbm5lbHM7IGluQ2grPTEpIHsKLSAgICAgICAgaWYgKGluQ2ggIT0gbWFwW2luQ2hdKSB7Ci0gICAgICAgICAgaW50IG91dENoOwotICAgICAgICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKLSAgICAgICAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID0gbWl4RmFjdG9yc1tvdXRDaF1bbWFwW2luQ2hdXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogU2V0IGNoYW5uZWwgcG9pbnRlciBmb3Igb3V0cHV0LiBSZW1vdmUgZW1wdHkgY29scy4gKi8KLSAgICAgIGNoID0gMDsKLSAgICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKLSAgICAgICAgaWYgKG91dE9mZnNldFRhYmxlW291dENoXSAhPSAyNTUpIHsKLSAgICAgICAgICBwT3V0UGNtW2NoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW291dENoXSpvZmZzZXRdOwotICAgICAgICAgIG1hcFtjaCsrXSAgPSBvdXRDaDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgRkRLX0FTU0VSVChjaCA9PSBudW1PdXRDaGFubmVscyk7Ci0KLSAgICAgIC8qIFJlbW92ZSB1bnVzZWQgcm93cyBmcm9tIGZhY3RvciBtYXRyaXggKi8KLSAgICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBudW1PdXRDaGFubmVsczsgb3V0Q2grPTEpIHsKLSAgICAgICAgaWYgKG91dENoICE9IG1hcFtvdXRDaF0pIHsKLSAgICAgICAgICBGREttZW1jcHkoJm1peEZhY3RvcnNbb3V0Q2hdLCAmbWl4RmFjdG9yc1ttYXBbb3V0Q2hdXSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfRE1YKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTYW1wbGUgcHJvY2Vzc2luZyBsb29wICovCi0gICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKQotICAgIHsKLSAgICAgIEZJWFBfUENNIHRJbltQQ01fRE1YX01BWF9JTl9DSEFOTkVMU107Ci0gICAgICBGSVhQX0RCTCB0T3V0W1BDTV9ETVhfTUFYX09VVF9DSEFOTkVMU10gPSB7IChGSVhQX0RCTCkwIH07Ci0gICAgICBpbnQgaW5DaCwgb3V0Q2g7Ci0KLSAgICAgIC8qIFByZWxvYWQgYWxsIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgbnVtSW5DaGFubmVsczsgaW5DaCs9MSkgewotICAgICAgICB0SW5baW5DaF0gPSAoRklYUF9QQ00pKnBJblBjbVtpbkNoXTsKLSAgICAgICAgcEluUGNtW2luQ2hdICs9IGluU3RyaWRlOwotICAgICAgfQotICAgICAgLyogQXBwbHkgZG93bm1peCBjb2VmZmljaWVudHMgdG8gaW5wdXQgc2FtcGxlcyBhbmQgYWNjdW11bGF0ZSBmb3Igb3V0cHV0ICovCi0gICAgICBmb3IgKG91dENoPTA7IG91dENoIDwgbnVtT3V0Q2hhbm5lbHM7IG91dENoKz0xKSB7Ci0gICAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgbnVtSW5DaGFubmVsczsgaW5DaCs9MSkgewotICAgICAgICAgIHRPdXRbb3V0Q2hdICs9IGZNdWx0KHRJbltpbkNoXSwgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0pOwotICAgICAgICB9Ci0gICAgICAgIC8qIFdyaXRlIHNhbXBsZSAqLwotI2lmIChTQU1QTEVfQklUUyA9PSBERlJBQ1RfQklUUykKLSAgICAgICAgKnBPdXRQY21bb3V0Q2hdID0gKElOVF9QQ00pU0FUVVJBVEVfTEVGVF9TSElGVCh0T3V0W291dENoXSwgZG14U2NhbGUsIFNBTVBMRV9CSVRTKTsKLSNlbHNlCi0gICAgICAgICpwT3V0UGNtW291dENoXSA9IChJTlRfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKHRPdXRbb3V0Q2hdLCBERlJBQ1RfQklUUy1TQU1QTEVfQklUUy1kbXhTY2FsZSwgU0FNUExFX0JJVFMpOwotI2VuZGlmCi0gICAgICAgIHBPdXRQY21bb3V0Q2hdICs9IG91dFN0cmlkZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KLSAgICAqbkNoYW5uZWxzID0gbnVtT3V0Q2hhbm5lbHM7Ci0KLSAgfSAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCi0gIGVsc2UKLSNlbmRpZiAvKiBQQ01fRE9XTk1JWF9FTkFCTEUgKi8KLSNpZmRlZiBQQ01fQ0hBTk5FTF9FWFRFTlNJT05fRU5BQkxFCi0gIGlmICggbnVtSW5DaGFubmVscyA8IG51bU91dENoYW5uZWxzICkKLSAgeyAvKiBBcHBseSBydWRpbWVudGFyeSB1cG1peCAqLwotICAgIC8qIFNldCB1cCBjaGFubmVsIHBvaW50ZXIgKi8KLSAgICBVSU5UICAgICBzYW1wbGU7Ci0gICAgVUNIQVIgICAgb3V0T2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwotCi0gICAgLyogRklSU1QgU1RBR0UKLSAgICAgICAgIENyZWF0ZSBhIHN0ZXJlby9kdWFsIGNoYW5uZWwgc2lnbmFsICovCi0gICAgaWYgKG51bUluQ2hhbm5lbHMgPT0gT05FX0NIQU5ORUwpCi0gICAgewotICAgICAgSU5UX1BDTSAgKnBJblBjbVtQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0gICAgICBJTlRfUENNICAqcE91dExGLCAqcE91dFJGOwotCi0gICAgICAvKiBTZXQgdGhpcyBzdGFnZXMgb3V0cHV0IHN0cmlkZSBhbmQgY2hhbm5lbCBtb2RlOiAqLwotICAgICAgb3V0U3RyaWRlID0gKGZJbnRlcmxlYXZlZCkgPyBUV09fQ0hBTk5FTCA6IDE7Ci0gICAgICBvdXRDaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtUV09fQ0hBTk5FTF07Ci0KLSAgICAgIC8qIEdldCBjaGFubmVsIGRlc2NyaXB0aW9uIGFuZCBjaGFubmVsIG1hcHBpbmcgZm9yIHRoaXMKLSAgICAgICAqIHN0YWdlcyBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzIChhbHdheXMgU1RFUkVPKS4gKi8KLSAgICAgIGdldENoYW5uZWxEZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgb3V0Q2hNb2RlLAotICAgICAgICAgICAgICBjaGFubmVsTWFwcGluZywKLSAgICAgICAgICAgICAgY2hhbm5lbFR5cGUsCi0gICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzLAotICAgICAgICAgICAgICBvdXRPZmZzZXRUYWJsZQotICAgICAgICAgICAgICk7Ci0gICAgICAvKiBOb3cgdGhlcmUgaXMgbm8gd2F5IGJhY2sgYmVjYXVzZSB3ZSBtb2RpZmllZCB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uISAqLwotCi0gICAgICAvKiBTZXQgaW5wdXQgY2hhbm5lbCBwb2ludGVyLiBUaGUgZmlyc3QgY2hhbm5lbCBpcyBhbHdheXMgYXQgaW5kZXggMC4gKi8KLSAgICAgIHBJblBjbVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSAmcFBjbUJ1ZlsoZnJhbWVTaXplLTEpKmluU3RyaWRlXTsgIC8qIENvbnNpZGVyaW5nIGlucHV0IG1hcHBpbmcgY291bGQgbGVhZCB0byBhIGludmFsaWQgcG9pbnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSBpZiB0aGUgY2hhbm5lbCBpcyBub3QgZGVjbGFyZWQgdG8gYmUgYSBmcm9udCBjaGFubmVsLiAqLwotCi0gICAgICAvKiBTZXQgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAoZm9yIHRoaXMgc3RhZ2UpLiAqLwotICAgICAgcE91dExGID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbTEVGVF9GUk9OVF9DSEFOTkVMXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwotICAgICAgcE91dFJGID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbUklHSFRfRlJPTlRfQ0hBTk5FTF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKLQotICAgICAgLyogMS8wIGlucHV0OiAqLwotICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7Ci0gICAgICAgIC8qIEwnID0gQzsgIFInID0gQzsgKi8KLSAgICAgICAgKnBPdXRMRiA9ICpwT3V0UkYgPSAqcEluUGNtW0NFTlRFUl9GUk9OVF9DSEFOTkVMXTsKLQotICAgICAgICBwSW5QY21bQ0VOVEVSX0ZST05UX0NIQU5ORUxdIC09IGluU3RyaWRlOwotICAgICAgICBwT3V0TEYgLT0gb3V0U3RyaWRlOyBwT3V0UkYgLT0gb3V0U3RyaWRlOwotICAgICAgfQotCi0gICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IHN0YWdlOiAqLwotICAgICAgaW5TdHJpZGUgPSBvdXRTdHJpZGU7Ci0gICAgICBpbkNoTW9kZSA9IG91dENoTW9kZTsKLSAgICAgIEZES21lbWNweShpbk9mZnNldFRhYmxlLCBvdXRPZmZzZXRUYWJsZSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7Ci0gICAgfQotCi0jaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+IDIpCi0gICAgLyogU0VDT05EIFNUQUdFCi0gICAgICAgICBFeHRlbmQgd2l0aCB6ZXJvIGNoYW5uZWxzIHRvIGFjaGlldmVkIHRoZSBkZXNpcmVkIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuICovCi0gICAgaWYgKG51bU91dENoYW5uZWxzID4gVFdPX0NIQU5ORUwpCi0gICAgewotICAgICAgSU5UX1BDTSAqcEluW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSAgPSB7IE5VTEwgfTsKLSAgICAgIElOVF9QQ00gKnBPdXRbUENNX0RNWF9NQVhfQ0hBTk5FTFNdID0geyBOVUxMIH07Ci0gICAgICBBVURJT19DSEFOTkVMX1RZUEUgIGluQ2hUeXBlc1tQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0gICAgICBVQ0hBUiAgICBpbkNoSW5kaWNlc1tQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0gICAgICBVQ0hBUiAgICBudW1DaFBlckdycFsyXVtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU107Ci0gICAgICBpbnQgICAgICBuQ29udGVudENoID0gMDsgIC8qIE51bWJlciBvZiBjaGFubmVscyB3aXRoIGNvbnRlbnQgKi8KLSAgICAgIGludCAgICAgIG5FbXB0eUNoID0gMDsgICAgLyogTnVtYmVyIG9mIGNoYW5uZWxzIHdpdGggY29udGVudCAqLwotICAgICAgaW50ICAgICAgY2gsIGNoR3JwLCBpc0NvbXBhdGlibGUgPSAxOwotCi0gICAgICAvKiBEbyBub3QgY2hhbmdlIHRoZSBzaWduYWxsaW5nIHdoaWNoIGlzIHRoZSBjaGFubmVsIHR5cGVzIGFuZCBpbmRpY2VzLgotICAgICAgICAgSnVzdCByZW9yZGVyIGFuZCBhZGQgY2hhbm5lbHMuIFNvIGZpcnN0IHNhdmUgdGhlIGlucHV0IHNpZ25hbGxpbmcuICovCi0gICAgICBGREttZW1jcHkoaW5DaFR5cGVzLCBjaGFubmVsVHlwZSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKEFVRElPX0NIQU5ORUxfVFlQRSkpOwotICAgICAgRkRLbWVtY3B5KGluQ2hJbmRpY2VzLCBjaGFubmVsSW5kaWNlcywgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7Ci0KLSAgICAgIC8qIFNldCB0aGlzIHN0YWdlcyBvdXRwdXQgc3RyaWRlIGFuZCBjaGFubmVsIG1vZGU6ICovCi0gICAgICBvdXRTdHJpZGUgPSAoZkludGVybGVhdmVkKSA/IG51bU91dENoYW5uZWxzIDogMTsKLSAgICAgIG91dENoTW9kZSA9IG91dENoTW9kZVRhYmxlW251bU91dENoYW5uZWxzXTsKLQotICAgICAgLyogQ2hlY2sgaWYgaW5wdXQgY2hhbm5lbCBjb25maWcgY2FuIGJlIGVhc2lseSBtYXBwZWQgdG8gdGhlIGRlc2lyZWQgb3V0cHV0IGNvbmZpZy4gKi8KLSAgICAgIGZvciAoY2hHcnAgPSAwOyBjaEdycCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTOyBjaEdycCArPSAxKSB7Ci0gICAgICAgIG51bUNoUGVyR3JwW0lOXVtjaEdycF0gPSAoaW5DaE1vZGUgPj4gKGNoR3JwKjQpKSAmIDB4RjsKLSAgICAgICAgbnVtQ2hQZXJHcnBbT1VUXVtjaEdycF0gPSAob3V0Q2hNb2RlID4+IChjaEdycCo0KSkgJiAweEY7Ci0KLSAgICAgICAgaWYgKG51bUNoUGVyR3JwW0lOXVtjaEdycF0gPiBudW1DaFBlckdycFtPVVRdW2NoR3JwXSkgewotICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IDA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCBpc0NvbXBhdGlibGUgKSB7Ci0gICAgICAgIC8qIEdldCBuZXcgY2hhbm5lbCBkZXNjcmlwdGlvbiBhbmQgY2hhbm5lbAotICAgICAgICAgKiBtYXBwaW5nIGZvciB0aGUgZGVzaXJlZCBvdXRwdXQgY2hhbm5lbCBtb2RlLiAqLwotICAgICAgICBnZXRDaGFubmVsRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgb3V0Q2hNb2RlLAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLAotICAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAotICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzLAotICAgICAgICAgICAgICAgIG91dE9mZnNldFRhYmxlCi0gICAgICAgICAgICAgICApOwotICAgICAgICAvKiBJZiB0aGUgaW5wdXQgY29uZmlnIGhhcyBhIGJhY2sgY2VudGVyIGNoYW5uZWwgYnV0IHRoZSBvdXRwdXQKLSAgICAgICAgICAgY29uZmlnIGhhcyBub3QsIGNvcHkgaXQgdG8gbGVmdCBhbmQgcmlnaHQgKGlmIGF2YWlsYWJsZSkuICovCi0gICAgICAgIGlmICggIChudW1DaFBlckdycFtJTl1bQ0hfR1JPVVBfUkVBUl0lMikKLSAgICAgICAgICAmJiAhKG51bUNoUGVyR3JwW09VVF1bQ0hfR1JPVVBfUkVBUl0lMikgKSB7Ci0gICAgICAgICAgaWYgKG51bUNoUGVyR3JwW0lOXVtDSF9HUk9VUF9SRUFSXSA9PSAxKSB7Ci0gICAgICAgICAgICBpbk9mZnNldFRhYmxlW1JJR0hUX1JFQVJfQ0hBTk5FTF0gPSBpbk9mZnNldFRhYmxlW0xFRlRfUkVBUl9DSEFOTkVMXTsKLSAgICAgICAgICB9IGVsc2UgaWYgKG51bUNoUGVyR3JwW0lOXVtDSF9HUk9VUF9SRUFSXSA9PSAzKSB7Ci0gICAgICAgICAgICBpbk9mZnNldFRhYmxlW1JJR0hUX01VTFRJUFJQU19DSEFOTkVMXSA9IGluT2Zmc2V0VGFibGVbTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTF07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgLyogSnVzdCBjb3B5IGFuZCBleHRlbmQgdGhlIG9yaWdpbmFsIGNvbmZpZyAqLwotICAgICAgICBGREttZW1jcHkob3V0T2Zmc2V0VGFibGUsIGluT2Zmc2V0VGFibGUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwotICAgICAgfQotCi0gICAgICAvKiBTZXQgSS9PIGNoYW5uZWwgcG9pbnRlci4KLSAgICAgICAgIE5vdGU6IFRoZSBmb2xsb3dpbmcgYXNzaWdubWVudCBhbGdvcml0aG0gY2xlYXJzIHRoZSBjaGFubmVsIG9mZnNldCB0YWJsZXMuCi0gICAgICAgICAgICAgICBUaHVzIHRoZXkgY2FuIG5vdCBiZSB1c2VkIGFmdGVyd2FyZHMuICovCi0gICAgICBmb3IgKGNoID0gMDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKLSAgICAgICAgaWYgKCAob3V0T2Zmc2V0VGFibGVbY2hdIDwgMjU1KQotICAgICAgICAgICYmIChpbk9mZnNldFRhYmxlW2NoXSA8IDI1NSkgKQotICAgICAgICB7IC8qIFNldCBJL08gcG9pbnRlcjogKi8KLSAgICAgICAgICBwSW5bbkNvbnRlbnRDaF0gPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW2NoXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSppblN0cmlkZV07Ci0gICAgICAgICAgcE91dFtuQ29udGVudENoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW2NoXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwotICAgICAgICAgIC8qIFVwZGF0ZSBzaWduYWxsaW5nICovCi0gICAgICAgICAgY2hhbm5lbFR5cGVbb3V0T2Zmc2V0VGFibGVbY2hdXSA9IGluQ2hUeXBlc1tpbk9mZnNldFRhYmxlW2NoXV07Ci0gICAgICAgICAgY2hhbm5lbEluZGljZXNbb3V0T2Zmc2V0VGFibGVbY2hdXSA9IGluQ2hJbmRpY2VzW2luT2Zmc2V0VGFibGVbY2hdXTsKLSAgICAgICAgICBpbk9mZnNldFRhYmxlW2NoXSA9IDI1NTsKLSAgICAgICAgICBvdXRPZmZzZXRUYWJsZVtjaF0gPSAyNTU7Ci0gICAgICAgICAgbkNvbnRlbnRDaCArPSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIGlzQ29tcGF0aWJsZSApIHsKLSAgICAgICAgLyogQXNzaWduIHRoZSByZW1haW5pbmcgaW5wdXQgY2hhbm5lbHMuCi0gICAgICAgICAgIFRoaXMgaXMganVzdCBhIHNhZmV0eSBhcHBsaWFuY2UuIFdlIHNob3VsZCBuZXZlciBuZWVkIGl0LiAqLwotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKLSAgICAgICAgICBpZiAoaW5PZmZzZXRUYWJsZVtjaF0gPCAyNTUpIHsKLSAgICAgICAgICAgIGludCAgb3V0Q2g7Ci0gICAgICAgICAgICBmb3IgKG91dENoID0gMCA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoICs9IDEpIHsKLSAgICAgICAgICAgICAgaWYgKG91dE9mZnNldFRhYmxlW291dENoXSA8IDI1NSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBTZXQgSS9PIHBvaW50ZXI6ICovCi0gICAgICAgICAgICBwSW5bbkNvbnRlbnRDaF0gPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW2NoXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSppblN0cmlkZV07Ci0gICAgICAgICAgICBwT3V0W25Db250ZW50Q2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07Ci0gICAgICAgICAgICAvKiBVcGRhdGUgc2lnbmFsbGluZyAqLwotICAgICAgICAgICAgY2hhbm5lbFR5cGVbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdXSA9IGluQ2hUeXBlc1tpbk9mZnNldFRhYmxlW2NoXV07Ci0gICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tvdXRPZmZzZXRUYWJsZVtvdXRDaF1dID0gaW5DaEluZGljZXNbaW5PZmZzZXRUYWJsZVtjaF1dOwotICAgICAgICAgICAgaW5PZmZzZXRUYWJsZVtjaF0gPSAyNTU7Ci0gICAgICAgICAgICBvdXRPZmZzZXRUYWJsZVtvdXRDaF0gPSAyNTU7Ci0gICAgICAgICAgICBuQ29udGVudENoICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIFNldCB0aGUgcmVtYWluaW5nIG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKi8KLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoKz0xKSB7Ci0gICAgICAgICAgaWYgKG91dE9mZnNldFRhYmxlW2NoXSA8IDI1NSkgewotICAgICAgICAgICAgcE91dFtuQ29udGVudENoK25FbXB0eUNoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW2NoXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwotICAgICAgICAgICAgLyogRXhwYW5kIG91dHB1dCBzaWduYWxsaW5nICovCi0gICAgICAgICAgICBjaGFubmVsVHlwZVtvdXRPZmZzZXRUYWJsZVtjaF1dID0gQUNUX05PTkU7Ci0gICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tvdXRPZmZzZXRUYWJsZVtjaF1dID0gbkVtcHR5Q2g7Ci0gICAgICAgICAgICBvdXRPZmZzZXRUYWJsZVtjaF0gPSAyNTU7Ci0gICAgICAgICAgICBuRW1wdHlDaCArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIC8qIFNldCB0aGUgcmVtYWluaW5nIG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKi8KLSAgICAgICAgZm9yIChjaCA9IG5Db250ZW50Q2g7IGNoIDwgbnVtT3V0Q2hhbm5lbHM7IGNoKz0xKSB7Ci0gICAgICAgICAgcE91dFtjaF0gPSAmcFBjbUJ1ZltjaCpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwotICAgICAgICAgIC8qIEV4cGFuZCBvdXRwdXQgc2lnbmFsbGluZyAqLwotICAgICAgICAgIGNoYW5uZWxUeXBlW2NoXSA9IEFDVF9OT05FOwotICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW2NoXSA9IG5FbXB0eUNoOwotICAgICAgICAgIG5FbXB0eUNoICs9IDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogRmlyc3QgY29weSB0aGUgY2hhbm5lbHMgdGhhdCBoYXZlIHNpZ25hbCAqLwotICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSs9MSkgewotICAgICAgICBJTlRfUENNIHRJbltQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0gICAgICAgIC8qIFJlYWQgYWxsIGNoYW5uZWwgc2FtcGxlcyAqLwotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ29udGVudENoOyBjaCs9MSkgewotICAgICAgICAgIHRJbltjaF0gPSAqcEluW2NoXTsKLSAgICAgICAgICBwSW5bY2hdIC09IGluU3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIC8qIFdyaXRlIGFsbCBjaGFubmVsIHNhbXBsZXMgKi8KLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNvbnRlbnRDaDsgY2grPTEpIHsKLSAgICAgICAgICAqcE91dFtjaF0gPSB0SW5bY2hdOwotICAgICAgICAgIHBPdXRbY2hdIC09IG91dFN0cmlkZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBDbGVhciBhbGwgdGhlIG90aGVyIGNoYW5uZWxzICovCi0gICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKLSAgICAgICAgZm9yIChjaCA9IG5Db250ZW50Q2g7IGNoIDwgbnVtT3V0Q2hhbm5lbHM7IGNoKz0xKSB7Ci0gICAgICAgICAgKnBPdXRbY2hdID0gKElOVF9QQ00pMDsKLSAgICAgICAgICBwT3V0W2NoXSAtPSBvdXRTdHJpZGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0jZW5kaWYgIC8qIGlmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPiAyKSAqLwotCi0gICAgLyogdXBkYXRlIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCi0gICAgKm5DaGFubmVscyA9IG51bU91dENoYW5uZWxzOwotICB9IC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KLSAgZWxzZQotI2VuZGlmIC8qIFBDTV9DSEFOTkVMX0VYVEVOU0lPTl9FTkFCTEUgKi8KLSAgaWYgKCBudW1JbkNoYW5uZWxzID09IG51bU91dENoYW5uZWxzICkKLSAgewotICAgIC8qIERvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBjaGFubmVsIGRlc2NyaXB0aW9uIGhlcmUgKi8KLQotICAgIHN3aXRjaCAobnVtSW5DaGFubmVscykKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgeyAvKiBTZXQgdXAgY2hhbm5lbCBwb2ludGVyICovCi0gICAgICAgIElOVF9QQ00gICpwSW5QY21bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwotICAgICAgICBJTlRfUENNICAqcE91dEwsICpwT3V0UjsKLSAgICAgICAgRklYUF9ETVggIGZsZXY7Ci0KLSAgICAgICAgVUlOVCBzYW1wbGU7Ci0gICAgICAgIGludCBpblN0cmlkZSwgb3V0U3RyaWRlLCBvZmZzZXQ7Ci0KLSAgICAgICAgaWYgKGZJbnRlcmxlYXZlZCkgewotICAgICAgICAgIGluU3RyaWRlICA9IG51bUluQ2hhbm5lbHM7Ci0gICAgICAgICAgb3V0U3RyaWRlID0gMjsgIC8qIGZpeGVkICEhISAoYmVsb3cgc3RlcmVvIGlzIGRvbndtaXhlZCB0byBtb25vIGlmIHJlcXVpcmVkICovCi0gICAgICAgICAgb2Zmc2V0ID0gMTsgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5TdHJpZGUgID0gMTsKLSAgICAgICAgICBvdXRTdHJpZGUgPSAxOwotICAgICAgICAgIG9mZnNldCA9IGZyYW1lU2l6ZTsgIC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogU2V0IGlucHV0IGNoYW5uZWwgcG9pbnRlciAqLwotICAgICAgICBwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSAgPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW0xFRlRfRlJPTlRfQ0hBTk5FTF0qb2Zmc2V0XTsKLSAgICAgICAgcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdID0gJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtSSUdIVF9GUk9OVF9DSEFOTkVMXSpvZmZzZXRdOwotCi0gICAgICAgIC8qIFNldCBvdXRwdXQgY2hhbm5lbCBwb2ludGVyIChzYW1lIGFzIGlucHV0KSAqLwotICAgICAgICBwT3V0TCAgPSAgcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF07Ci0gICAgICAgIHBPdXRSICA9ICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF07Ci0KLSAgICAgICAgLyogU2V0IGRvd25taXggbGV2ZWxzOiAqLwotICAgICAgICBmbGV2ID0gRkwyRlhDT05TVF9ETVgoMC43MDcxMDY3OGYpOwotICAgICAgICAvKiAyLzAgaW5wdXQ6ICovCi0gICAgICAgIHN3aXRjaCAoZHVhbENoYW5uZWxNb2RlKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgQ0gxX01PREU6ICAvKiBMJyA9IDAuNzA3ICogQ2gxOyAgUicgPSAwLjcwNyAqIENoMSAqLwotICAgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgewotICAgICAgICAgICAgKnBPdXRMID0gKnBPdXRSID0KLSAgICAgICAgICAgICAgKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoZk11bHQoKEZJWFBfUENNKSpwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSwgZmxldiksIERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLCBTQU1QTEVfQklUUyk7Ci0KLSAgICAgICAgICAgIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOwotICAgICAgICAgICAgcE91dEwgKz0gb3V0U3RyaWRlOyBwT3V0UiArPSBvdXRTdHJpZGU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIMl9NT0RFOiAgLyogTCcgPSAwLjcwNyAqIENoMjsgIFInID0gMC43MDcgKiBDaDIgKi8KLSAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKLSAgICAgICAgICAgICpwT3V0TCA9ICpwT3V0UiA9Ci0gICAgICAgICAgICAgIChJTlRfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKGZNdWx0KChGSVhQX1BDTSkqcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdLCBmbGV2KSwgREZSQUNUX0JJVFMtU0FNUExFX0JJVFMsIFNBTVBMRV9CSVRTKTsKLQotICAgICAgICAgICAgcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOwotICAgICAgICAgICAgcE91dEwgKz0gb3V0U3RyaWRlOyBwT3V0UiArPSBvdXRTdHJpZGU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1JWEVEX01PREU6ICAvKiBMJyA9IDAuNSpDaDEgKyAwLjUqQ2gyOyAgUicgPSAwLjUqQ2gxICsgMC41KkNoMiAqLwotICAgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgewotICAgICAgICAgICAgKnBPdXRMID0gKnBPdXRSID0gKCpwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSA+PiAxKSArICgqcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdID4+IDEpOwotCi0gICAgICAgICAgICBwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSArPSBpblN0cmlkZTsgIHBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSArPSBpblN0cmlkZTsKLSAgICAgICAgICAgIHBPdXRMICs9IG91dFN0cmlkZTsgcE91dFIgKz0gb3V0U3RyaWRlOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSBTVEVSRU9fTU9ERToKLSAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAoZXJyb3JTdGF0dXMpOwotfQotCi0KLS8qKiBDbG9zZSBhbiBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgotICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBoYW5kbGUgb2YgdGhlIGluc3RhbmNlLgotICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICoqLwotUENNRE1YX0VSUk9SIHBjbURteF9DbG9zZSAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZgotICApCi17Ci0gIGlmIChwU2VsZiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwotICB9Ci0KLSAgRnJlZVBjbURteEluc3RhbmNlKCBwU2VsZiApOwotICAqcFNlbGYgPSBOVUxMOwotCi0gIHJldHVybiAoUENNRE1YX09LKTsKLX0KLQotCi0vKiogR2V0IGxpYnJhcnkgaW5mbyBmb3IgdGhpcyBtb2R1bGUuCi0gKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgTElCX0lORk8gc3RydWN0dXJlLgotICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICovCi1QQ01ETVhfRVJST1IgcGNtRG14X0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICkKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKGluZm8gPT0gTlVMTCkgewotICAgIHJldHVybiBQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVDsKLSAgfQotCi0gIC8qIFNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLwotICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKLSAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpIGJyZWFrOwotICB9Ci0gIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgewotICAgIHJldHVybiBQQ01ETVhfVU5LTk9XTjsKLSAgfQotCi0gIC8qIEFkZCB0aGUgbGlicmFyeSBpbmZvICovCi0gIGluZm9baV0ubW9kdWxlX2lkICA9IEZES19QQ01ETVg7Ci0gIGluZm9baV0udmVyc2lvbiAgICA9IExJQl9WRVJTSU9OKFBDTURNWF9MSUJfVkwwLCBQQ01ETVhfTElCX1ZMMSwgUENNRE1YX0xJQl9WTDIpOwotICBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbytpKTsKLSAgaW5mb1tpXS5idWlsZF9kYXRlID0gUENNRE1YX0xJQl9CVUlMRF9EQVRFOwotICBpbmZvW2ldLmJ1aWxkX3RpbWUgPSBQQ01ETVhfTElCX0JVSUxEX1RJTUU7Ci0gIGluZm9baV0udGl0bGUgICAgICA9IFBDTURNWF9MSUJfVElUTEU7Ci0KLSAgLyogU2V0IGZsYWdzICovCi0gIGluZm9baV0uZmxhZ3MgPSAwCi0jaWZkZWYgUENNX0RPV05NSVhfRU5BQkxFCi0gICAgICB8IENBUEZfRE1YX0JMSU5EICAgLyogQXQgbGVhc3QgYmxpbmQgZG93bm1peGluZyBpcyBwb3NzaWJsZSAqLwotICNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCi0gICAgICB8IENBUEZfRE1YX1BDRSAgICAgLyogR3VpZGVkIGRvd25taXggd2l0aCBkYXRhIGZyb20gTVBFRy0yLzQgUHJvZ3JhbSBDb25maWcgRWxlbWVudHMgKFBDRSkuICovCi0gICNpZmRlZiBBUklCX01JWERPV05fRU5BQkxFCi0gICAgICB8IENBUEZfRE1YX0FSSUIgICAgLyogUENFIGd1aWRlZCBkb3dubWl4IHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IGVxdWF0aW9ucyBhbmQgbGV2ZWxzLiAqLwotICAjZW5kaWYKLSAjZW5kaWYgLyogUENFX01FVEFEQVRBX0VOQUJMRSAqLwotICNpZmRlZiBEU0VfTUVUQURBVEFfRU5BQkxFCi0gICAgICB8IENBUEZfRE1YX0RWQiAgICAgLyogR3VpZGVkIGRvd25taXggd2l0aCBkYXRhIGZyb20gRFZCIGFuY2lsbGFyeSBkYXRhIGZpZWxkcy4gKi8KLSAjZW5kaWYKLSNlbmRpZiAvKiBQQ01fRE9XTk1JWF9FTkFCTEUgKi8KLSNpZmRlZiBQQ01fQ0hBTk5FTF9FWFRFTlNJT05fRU5BQkxFCi0gICAgICB8IENBUEZfRE1YX0NIX0VYUCAgLyogU2ltcGxlIHVwbWl4aW5nIGJ5IGR1YmxpY2F0aW5nIGNoYW5uZWxzIG9yIGFkZGluZyB6ZXJvIGNoYW5uZWxzLiAqLwotI2VuZGlmCi0gICAgICA7Ci0KLSAgLyogQWRkIGxpYiBpbmZvIGZvciBGREsgdG9vbHMgKGlmIG5vdCB5ZXQgZG9uZSkuICovCi0gIEZES190b29sc0dldExpYkluZm8oaW5mbyk7Ci0KLSAgcmV0dXJuIFBDTURNWF9PSzsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYlBDTXV0aWxzL3NyYy92ZXJzaW9uLmggYi9saWJQQ011dGlscy9zcmMvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMzFhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJQQ011dGlscy9zcmMvdmVyc2lvbi5oCkBAIC0wLDAgKzEsMTE5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDTSB1dGlsaXR5IGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChWRVJTSU9OX0gpCisjZGVmaW5lIFZFUlNJT05fSAorCisvKiBsaWJyYXJ5IGluZm8gKi8KKyNkZWZpbmUgUENNVVRJTF9MSUJfVkwwIDMKKyNkZWZpbmUgUENNVVRJTF9MSUJfVkwxIDAKKyNkZWZpbmUgUENNVVRJTF9MSUJfVkwyIDAKKyNkZWZpbmUgUENNVVRJTF9MSUJfVElUTEUgIlBDTSBVdGlsaXR5IExpYiIKKyNpZmRlZiBfX0FORFJPSURfXworI2RlZmluZSBQQ01VVElMX0xJQl9CVUlMRF9EQVRFICIiCisjZGVmaW5lIFBDTVVUSUxfTElCX0JVSUxEX1RJTUUgIiIKKyNlbHNlCisjZGVmaW5lIFBDTVVUSUxfTElCX0JVSUxEX0RBVEUgX19EQVRFX18KKyNkZWZpbmUgUENNVVRJTF9MSUJfQlVJTERfVElNRSBfX1RJTUVfXworI2VuZGlmCisKKyNlbmRpZiAvKiAhZGVmaW5lZChWRVJTSU9OX0gpICovCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvaW5jbHVkZS9zYWNfZGVjX2Vycm9yY29kZXMuaCBiL2xpYlNBQ2RlYy9pbmNsdWRlL3NhY19kZWNfZXJyb3Jjb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOGI5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvaW5jbHVkZS9zYWNfZGVjX2Vycm9yY29kZXMuaApAQCAtMCwwICsxLDE1NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBlcnJvciBjb2RlcyBmb3IgbXBlZyBzdXJyb3VuZCBkZWNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDX0RFQ19FUlJPUkNPREVTX0gKKyNkZWZpbmUgU0FDX0RFQ19FUlJPUkNPREVTX0gKKwordHlwZWRlZiBlbnVtIHsKKworICBfX21wc19lcnJvcl9zdGFydCA9IC0xMDAwLAorCisgIE1QU19PSyA9IDAsCisKKyAgLyogZ2VuZXJpYy9pbml0IGVycm9ycyAqLworICBNUFNfTk9UT0sgPSBfX21wc19lcnJvcl9zdGFydCwKKworICBNUFNfT1VUT0ZNRU1PUlksCisgIE1QU19JTlZBTElEX0hBTkRMRSwKKyAgTVBTX0lOVkFMSURfUEFSQU1FVEVSLCAgICAgLyogU2V0UGFyYW0gbm90IHN1Y2Nlc3NmdWxsICovCisgIE1QU19VTlNVUFBPUlRFRF9IUlRGTU9ERUwsIC8qIFNldEhSVEZNb2RlbCgpIG5vdCBzdWNjZXNzZnVsbCAqLworICBNUFNfVU5TVVBQT1JURURfSFJURkZSRVEsICAvKiBTZXRIUlRGTW9kZWwoKSBub3Qgc3VjY2Vzc2Z1bGwgKi8KKworICBNUFNfVU5TVVBQT1JURURfVVBNSVhfVFlQRSwgLyogQ2hlY2tMZXZlbFRyZWVVcG1peFR5cGUoKSAqLworICBNUFNfVU5TVVBQT1JURURfRk9STUFULCAvKiB2YXJpb3VzIGZ1bmN0aW9uczsgdW5rbm93biBhb3Qgb3Igbm9fY2hhbm5lbHMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyYmFuayAqLworICBNUFNfT1VUUFVUX0JVRkZFUl9UT09fU01BTEwsIC8qIFNpemUgb2YgcHJvdmlkZWQgb3V0cHV0IHRpbWUgYnVmZmVyIGlzIHRvbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsICovCisKKyAgLyogc3NjIGVycm9ycyAqLworICBNUFNfSU5WQUxJRF9QQVJBTUVURVJCQU5EUywgLyogdW5zdXBwb3J0ZWQgbnVtUGFyYW1ldGVyQmFuZHMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYXRpYWxEZWNEZWNvZGVIZWFkZXIoKSAqLworICBNUFNfSU5WQUxJRF9UUkVFQ09ORklHLAorICBNUFNfSU5WQUxJRF9IUlRGU0VULCAgIC8qIFNwYXRpYWxEZWNEZWNvZGVIZWFkZXIoKSAqLworICBNUFNfSU5WQUxJRF9UVFQsICAgICAgIC8qIFNwYXRpYWxEZWNEZWNvZGVIZWFkZXIoKSAqLworICBNUFNfSU5WQUxJRF9CT1hJRFgsICAgIC8qIGVjRGF0YURlYygpICovCisgIE1QU19JTlZBTElEX1NFVElEWCwgICAgLyogZWNEYXRhRGVjKCkgKi8KKyAgTVBTX0lOVkFMSURfUVVBTlRNT0RFLCAvKiBTcGF0aWFsRGVjUGFyc2VTcGVjaWZpY0NvbmZpZygpICovCisgIE1QU19VTkVRVUFMX1NTQywgLyogRkRLX1NwYXRpYWxEZWNDb21wYXJlU3BhdGlhbFNwZWNpZmljQ29uZmlnSGVhZGVyKCkgKi8KKyAgTVBTX1VOU1VQUE9SVEVEX0NPTkZJRywgLyogbnVtYmVyIG9mIGNvcmUgY2hhbm5lbHM7IDNEU3RlcmVvSW52ZXJzaW9uOyAqLworCisgIC8qIHBhcnNlIGVycm9ycyAqLworICBNUFNfUEFSU0VfRVJST1IsCisgIE1QU19JTlZBTElEX1RFTVBTSEFQRSwgLyogU3BhdGlhbERlY1BhcnNlRnJhbWVEYXRhKCkgKi8KKworICAvKiByZW5kZXIgZXJyb3JzICovCisgIE1QU19XUk9OR19QQVJBTUVURVJTRVRTLAorICBNUFNfV1JPTkdfUEFSQU1FVEVSQkFORFMsIC8qIGRlY29kZUFuZE1hcEZyYW1lU21nKCkgKi8KKyAgTVBTX1dST05HX1RSRUVDT05GSUcsCisgIE1QU19XUk9OR19CTElORENPTkZJRywKKyAgTVBTX1dST05HX09UVCwKKyAgTVBTX1dST05HX1FVQU5UTU9ERSwKKyAgTVBTX1JFU0RFQ19FUlJPUiwKKyAgTVBTX0FQUExZX00yX0VSUk9SLCAvKiBlcnJvciBpbiBhcHBseU0yeCgpc2VsZWN0aW9uICovCisKKyAgX19tcHNfZXJyb3JfZW5kCisKK30gU0FDREVDX0VSUk9SOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9pbmNsdWRlL3NhY19kZWNfbGliLmggYi9saWJTQUNkZWMvaW5jbHVkZS9zYWNfZGVjX2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OTdhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvaW5jbHVkZS9zYWNfZGVjX2xpYi5oCkBAIC0wLDAgKzEsNDc3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IFNwYWNlIERlY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNfREVDX0xJQl9ICisjZGVmaW5lIFNBQ19ERUNfTElCX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKyNpbmNsdWRlICJzYWNfZGVjX2Vycm9yY29kZXMuaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAiRkRLX3FtZl9kb21haW4uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKioKKyAqIFxicmllZiAgTVBFRyBTdXJyb3VuZCBpbnB1dCBkYXRhIGludGVyZmFjZSBtb2RlLgorICoqLwordHlwZWRlZiBlbnVtIHsKKyAgU0FDX0lOVEVSRkFDRV9RTUYgPQorICAgICAgMCwgLyohPCBVc2UgUU1GIGRvbWFpbiBpbnRlcmZhY2UgZm9yIHRoZSBpbnB1dCBkb3dubWl4IGF1ZGlvLiAgKi8KKyAgU0FDX0lOVEVSRkFDRV9USU1FLCAvKiE8IFVzZSB0aW1lIGRvbWFpbiBpbnRlcmZhY2UgZm9yIHRoZSBpbnB1dCBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8uICovCisgIFNBQ19JTlRFUkZBQ0VfQVVUTyAgLyohPCAgICAgICAgICAqLworfSBTQUNfSU5QVVRfQ09ORklHOworCisvKioKKyAqIFxicmllZiAgTVBFRyBTdXJyb3VuZCBvdXRwdXQgbW9kZS4KKyAqKi8KK3R5cGVkZWYgZW51bSB7CisgIFNBQ0RFQ19PVVRfTU9ERV9OT1JNQUwgPQorICAgICAgMCwgLyohPCBOb3JtYWwgbXVsdGkgY2hhbm5lbCBwcm9jZXNzaW5nIHdpdGhvdXQgb3V0cHV0IHJlc3RyaWN0aW9ucy4gKi8KKyAgU0FDREVDX09VVF9NT0RFX0JJTkFVUkFMLCAvKiE8IFR3byBjaGFubmVsIG91dHB1dCB3aXRoIGJpbmF1cmFsIHByb2Nlc3NzaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTQUNERUNfT1VUX01PREVfU1RFUkVPLCAgIC8qITwgQWx3YXlzIHR3byBjaGFubmVsIG91dHB1dCBtb2RlLiAgICovCisgIFNBQ0RFQ19PVVRfTU9ERV82Q0hBTk5FTCAgLyohPCBBbHdheXMgcHJvY2VzcyB3aXRoIDUuMSBjaGFubmVsIG91dHB1dC4gICovCit9IFNBQ19ERUNfT1VUUFVUX01PREU7CisKKy8qKgorICogXGJyaWVmICBNUEVHIFN1cnJvdW5kIGJpbmF1cmFsIEhSVEYgbW9kZWwuCisgKiAgICAgICAgIEhSVEYgd2lsbCBiZSBhcHBsaWVkIG9ubHkgaW4gY29tYmluYXRpb24gd2l0aCB1cG1peHR5cGUKKyAqU0FDX1VQTUlYX1RZUEVfQklOQVVSQUwuCisgKiovCit0eXBlZGVmIGVudW0geworICBTQUNfQklOQVVSQUxfSFJURl9LRU1BUiA9IDAsCisgIFNBQ19CSU5BVVJBTF9IUlRGX1ZBU1QsCisgIFNBQ19CSU5BVVJBTF9IUlRGX01QU1ZULAorICBTQUNfQklOQVVSQUxfU0lOR0xFX0hSVEZTCit9IFNBQ19CSU5BVVJBTF9IUlRGX01PREVMOworCisvKioKKyAqIFxicmllZiAgTVBFRyBTdXJyb3VuZCBkZWNvZGVyIGluc3RhbmNlIGF2YWlsYWJsZS4KKyAqKi8KK3R5cGVkZWYgZW51bSB7CisgIFNBQ19JTlNUQU5DRV9OT1RfRlVMTF9BVkFJTEFCTEUgPQorICAgICAgMCwgLyohPCBNUEVHIFN1cnJvdW5kIGRlY29kZXIgaW5zdGFuY2Ugbm90IGZ1bGwgYXZhaWxhYmxlLiAqLworICBTQUNfSU5TVEFOQ0VfRlVMTF9BVkFJTEFCTEUgLyohPCBNUEVHIFN1cnJvdW5kIGRlY29kZXIgaW5zdGFuY2UgZnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLiAqLworfSBTQUNfSU5TVEFOQ0VfQVZBSUw7CisKKy8qKgorICogXGJyaWVmICBNUEVHIFN1cnJvdW5kIGRlY29kZXIgZHluYW1pYyBwYXJhbWV0ZXJzLgorICoKKyAqIFVzZSBtcGVnU3Vycm91bmREZWNvZGVyX1NldFBhcmFtKCkgZnVuY3Rpb24gdG8gY29uZmlndXJlIGludGVybmFsIHN0YXR1cyBvZgorICogZm9sbG93aW5nIHBhcmFtZXRlcnMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIFNBQ0RFQ19PVVRQVVRfTU9ERSA9IDB4MDAwMSwgLyohPCBTZXQgTVBFRyBTdXJyb3VuZCBkZWNvZGVyIG91dHB1dCBtb2RlLiBTZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUNfREVDX09VVFBVVF9NT0RFLiAqLworICBTQUNERUNfQkxJTkRfRU5BQkxFID0KKyAgICAgIDB4MDAwMiwgLyohPCBNdWx0aSBjaGFubmVsIG91dHB1dCB3aXRob3V0IE1QRUcgU3Vycm91bmQgc2lkZSBpbmZvLiAgICAqLworICBTQUNERUNfUEFSVElBTExZX0NPTVBMRVggPQorICAgICAgMHgwMDAzLCAvKiE8IFNldCBwYXJ0aWFsbHkgY29tcGxleCBmbGFnIGZvciBNUEVHIFN1cnJvdW5kLgorICAgICAgICAgICAgICAgICAgICAwOiBVc2UgY29tcGxleCB2YWx1ZWQgUU1GIGRhdGEuCisgICAgICAgICAgICAgICAgICAgIDE6IFVzZSByZWFsIHZhbHVlZCBRTUYgZGF0YSAobG93IHBvd2VyIG1vZGUpICovCisgIFNBQ0RFQ19JTlRFUkZBQ0UgPQorICAgICAgMHgwMDA0LCAvKiE8IFNlbGVjdCBzaWduYWwgaW5wdXQgaW50ZXJmYWNlIGZvciBNUEVHIFN1cnJvdW5kLgorICAgICAgICAgICAgICAgICAgICAgU3dpdGNoIHRpbWUgaW50ZXJmYWNlIG9mZjogIDAKKyAgICAgICAgICAgICAgICAgICAgIFN3aXRjaCB0aW1lIGludGVyZmFjZSBvbjogICAxICovCisgIFNBQ0RFQ19CU19ERUxBWSA9IDB4MDAwNSwgLyohPCBTZWxlY3QgYml0IHN0cmVhbSBkZWxheSBmb3IgTVBFRyBTdXJyb3VuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoIGJpdCBzdHJlYW0gZGVsYXkgb2ZmOiAgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2ggYml0IHN0cmVhbSBkZWxheSBvbjogICAxICovCisgIFNBQ0RFQ19CSU5BVVJBTF9RVUFMSVRZID0KKyAgICAgIDB4MDEwMiwgLyohPCBTZXQgYmluYXVyYWwgcXVhbGl0eSBmb3IgTVBFRyBTdXJyb3VuZCBiaW5hdXJhbCBtb2RlLgorICAgICAgICAgICAgICAgICAgIDA6IExvdyBDb21wbGV4aXR5LAorICAgICAgICAgICAgICAgICAgIDE6IEhpZ2ggUXVhbGl0eSAqLworICBTQUNERUNfQklOQVVSQUxfRElTVEFOQ0UgPSAweDAxMDMsIC8qITwgU2V0IHBlcmNlaXZlZCBkaXN0YW5jZSBmb3IgYmluYXVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFjayAoYmluYXVyYWwgbW9kZSBvbmx5KS4gVGhlIHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICByYW5nZSBmcm9tIDAgdG8gMTAwLiBXaGVyZSAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgZmFydGhlc3QgcGVyY2VpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UuICovCisgIFNBQ0RFQ19CSU5BVVJBTF9ESUFMT0dfQ0xBUklUWSA9CisgICAgICAweDAxMDQsIC8qITwgU2V0IGRpYWxvZyBjbGFyaXR5IChmb3IgYmluYXVyYWwgcGxheWJhY2spLgorICAgICAgICAgICAgICAgICAgIFRoZSB2YWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDEwMC4gKi8KKyAgU0FDREVDX0JJTkFVUkFMX0ZST05UX0FOR0xFID0gMHgwMTA1LCAvKiE8IFNldCBhbmdsZSBiZXR3ZWVuIHRoZSB2aXJ0dWFsIGZyb250CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYWtlciBwYWlyIChiaW5hdXJhbCBtb2RlIG9ubHkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbGlkIHJhbmdlIGlzIGZyb20gMCB0byAxODAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyIGRlZ3JlZXMuICovCisgIFNBQ0RFQ19CSU5BVVJBTF9CQUNLX0FOR0xFID0gMHgwMTA2LCAgLyohPCBTZXQgYW5nbGUgYmV0d2VlbiB0aGUgdmlydHVhbCBiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYWtlciBwYWlyIChiaW5hdXJhbCBtb2RlIG9ubHkpLiAgVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgcmFuZ2UgaXMgZnJvbSAwIHRvIDE4MCBhbmd1bGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlcy4gKi8KKyAgU0FDREVDX0JJTkFVUkFMX1BSRVNFVCA9IDB4MDEwNywgLyohPCBTZXQgYSB2aXJ0dWFsIHNwZWFrZXIgc2V0dXAgcHJlc2V0IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5hdXJhbCBwbGF5YmFjayAoYmluYXVyYWwgbW9kZSBvbmx5KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtZXRhLXBhcmFtZXRlciBpbXBsaWNpdGx5IG1vZGlmaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ0RFQ19CSU5BVVJBTF9ESVNUQU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ0RFQ19CSU5BVVJBTF9ESUFMT0dfQ0xBUklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ0RFQ19CSU5BVVJBTF9GUk9OVF9BTkdMRSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ0RFQ19CSU5BVVJBTF9CQUNLX0FOR0xFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJlc2V0cyBhcmUgYXZhaWxhYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogRHJ5IHJvb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6IExpdmluZyByb29tIChkZWZhdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogQ2luZW1hICovCisKKyAgU0FDREVDX0JTX0lOVEVSUlVQVElPTiA9CisgICAgICAweDAyMDAsIC8qITwgSWYgdGhlIGdpdmVuIHZhbHVlIGlzIHVuZXF1YWwgdG8gMCBoaW50IHRoZSBNUEVHIFN1cnJvdW5kCisgICAgICAgICAgICAgICAgIGRlY29kZXIgdGhhdCB0aGUgbmV4dCBpbnB1dCBkYXRhIGlzIGRpc2NvbnRpbnVvdXMsIGJlY2F1c2Ugb2YKKyAgICAgICAgICAgICAgICAgZnJhbWUgbG9zcywgc2Vla2luZywgZXRjLiBBbm5vdW5jZSB0aGUgZGVjb2RlciB0aGF0IHRoZQorICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gZGF0YSB3YXMgaW50ZXJydXB0ZWQgKGZTeW5jID0gMCkuIFRoaXMgd2lsbCBjYXVzZSB0aGUKKyAgICAgICAgICAgICAgICAgc3Vycm91bmQgZGVjb2RlciBub3QgdG8gcGFyc2UgYW55IG5ldyBiaXRzdHJlYW0gZGF0YSB1bnRpbCBhCisgICAgICAgICAgICAgICAgIG5ldyBoZWFkZXIgd2l0aCBhIHZhbGlkIFNwYXRpYWwgU3BlY2lmaWMgQ29uZmlnIGFuZCBhCisgICAgICAgICAgICAgICAgIGluZGVwZW5kZW50bHkgZGVjb2RhYmxlIGZyYW1lIGlzIGZvdW5kLiBTcGVjaWFsbHkgaW1wb3J0YW50CisgICAgICAgICAgICAgICAgIHdoZW4gdGhlIE1QRUcgU3Vycm91bmQgZGF0YSBpcyBzcGxpdCBhY2Nyb3NzIHNldmVyYWwgZnJhbWVzCisgICAgICAgICAgICAgICAgIChmb3IgZXhhbXBsZSBpbiB0aGUgY2FzZSBvZiBBQUMtTEMgZG93bm1peCB3aXRoIDEwMjQKKyAgICAgICAgICAgICAgICAgZnJhbWVsZW5ndGggYW5kIDIwNDggc3Vycm91bmQgZnJhbWUgbGVuZ3RoKSBhbmQgYSBkaXNjb250aW51aXR5CisgICAgICAgICAgICAgICAgIGluIHRoZSBiaXRzdHJlYW0gZGF0YSBvY2N1cnMuIElmIGZTeW5jIGlzIDEsIGFzc3VtZSB0aGF0IE1QRUcKKyAgICAgICAgICAgICAgICAgU3Vycm91bmQgZGF0YSBpcyBpbiBzeW5jIChvdXQgb2YgYmFuZCBjb25maWcgZm9yIGV4YW1wbGUpLiAqLworICBTQUNERUNfQ0xFQVJfSElTVE9SWSA9IDB4MDIwMSwgLyohPCBJZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdW5lcXVhbCB0byAwIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgaW50ZXJuYWwgc3RhdGVzIChkZWxheSBsaW5lcywgUU1GCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMsIC4uLikgb2YgdGhlIE1QRUcgU3Vycm91bmQgZGVjb2Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBjYXVzZSBhIGRpc2NvbnRpbnVpdHkgaW4gdGhlIGF1ZGlvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgc2lnbmFsLiAqLworCisgIFNBQ0RFQ19DT05DRUFMX05VTV9LRUVQX0ZSQU1FUyA9CisgICAgICAweDAzMDEsIC8qITwgRXJyb3IgY29uY2VhbG1lbnQ6IFRoZSBOdW1iZXIgb2YgZnJhbWVzIHRoZSBtb2R1bGUga2VlcHMgdGhlCisgICAgICAgICAgICAgICAgIGxhc3Qgc3BhdGlhbCBpbWFnZSBiZWZvcmUgZmFkaW5nIHRvIHRoZSBwYXJ0aWN1bGFyIHNwYXRpYWwKKyAgICAgICAgICAgICAgICAgc2NlbmFyaW8gc3RhcnRzLiBUaGUgZGVmYXVsdCBpcyAxMCBmcmFtZXMuICovCisgIFNBQ0RFQ19DT05DRUFMX0ZBREVfT1VUX1NMT1BFX0xFTkdUSCA9CisgICAgICAweDAzMDIsIC8qITwgRXJyb3IgY29uY2VhbG1lbnQ6IExlbmd0aCBvZiB0aGUgc2xvcGUgKGluIGZyYW1lcykgdGhlIG1vZHVsZQorICAgICAgICAgICAgICAgICBjcmVhdGVzIHRvIGZhZGUgZnJvbSB0aGUgbGFzdCBzcGF0aWFsIHNjZW5hcmlvIHRvIHRoZQorICAgICAgICAgICAgICAgICBwYXJ0aWN1bGFyIGRlZmF1bHQgc2NlbmFyaW8gKGRvd25taXgpIGluIGNhc2Ugb2YgY29uc2VjdXRpdmUKKyAgICAgICAgICAgICAgICAgZXJyb3JzLiBEZWZhdWx0IGlzIDUuICovCisgIFNBQ0RFQ19DT05DRUFMX0ZBREVfSU5fU0xPUEVfTEVOR1RIID0KKyAgICAgIDB4MDMwMywgLyohPCBFcnJvciBjb25jZWFsbWVudDogTGVuZ3RoIG9mIHRoZSBzbG9wZSAoaW4gZnJhbWVzKSB0aGUgbW9kdWxlCisgICAgICAgICAgICAgICAgIGNyZWF0ZXMgdG8gZmFkZSBmcm9tIHRoZSBkZWZhdWx0IHNwYXRpYWwgc2NlbmFyaW8gKGRvd25taXgpIHRvCisgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IHNjZW5hcmlvIGFmdGVyIGZhZGUtb3V0LiBEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZQorICAgICAgICAgICAgICAgICBpcyA1LiAqLworICBTQUNERUNfQ09OQ0VBTF9OVU1fUkVMRUFTRV9GUkFNRVMgPQorICAgICAgMHgwMzA0IC8qITwgRXJyb3IgY29uY2VhbG1lbnQ6IFRoZSBudW1iZXIgb2YgZXJyb3IgZnJlZSBmcmFtZXMgYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgIG1vZHVsZSBzdGFydHMgZmFkaW5nIGZyb20gZGVmYXVsdCB0byB0aGUgY3VycmVudCBzcGF0aWFsCisgICAgICAgICAgICAgICAgc2NlbmFyaW8uIERlZmF1bHQgcGFyYW1ldGVyIHZhbHVlIGlzIDMgZnJhbWVzLiAqLworfSBTQUNERUNfUEFSQU07CisKKyNkZWZpbmUgUENNX01QUyBJTlRfUENNCisKKy8qKgorICogXGJyaWVmIE1QRUcgU3Vycm91bmQgZGVjb2RlciBoYW5kbGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IE1wZWdTdXJyb3VuZERlY29kZXIgQ01wZWdTdXJyb3VuZERlY29kZXI7CisKKy8qKgorICogXGJyaWVmICBDaGVjayBpZiB0aGUgZnVsbCBNUEVHIFN1cnJvdW5kIGRlY29kZXIgaW5zdGFuY2UgaXMgYWxsb2NhdGVkLgorICoKKyAqIENoZWNrIGlmIHRoZSBmdWxsIE1QRUcgU3Vycm91bmQgZGVjb2RlciBpbnN0YW5jZSBpcyBhbGxvY2F0ZWQuCisgKgorICogXHBhcmFtIHBNcGVnU3Vycm91bmREZWNvZGVyICAgQSBwb2ludGVyIHRvIGEgZGVjb2RlciBzdHVjdHVyZS4KKyAqCisgKiBccmV0dXJuIFNBQ0RFQ19FUlJPUiBlcnJvciBjb2RlCisgKi8KK1NBQ19JTlNUQU5DRV9BVkFJTAorbXBlZ1N1cnJvdW5kRGVjb2Rlcl9Jc0Z1bGxNcGVnU3Vycm91bmREZWNvZGVySW5zdGFuY2VBdmFpbGFibGUoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyKTsKKworLyoqCisgKiBcYnJpZWYgIE9wZW4gb25lIGluc3RhbmNlIG9mIHRoZSBNUEVHIFN1cnJvdW5kIGRlY29kZXIuCisgKgorICogQWxsb2NhdGUgb25lIGluc3RhbmNlIG9mIGRlY29kZXIgYW5kIGlucHV0IGJ1ZmZlcnMuCisgKiAtIEFsbG9jYXRlIGRlY29kZXIgc3RydWN0dXJlCisgKiAtIEFsbG9jYXRlIGlucHV0IGJ1ZmZlcnMgKFFNRi90aW1lL01QUyBkYXRhKQorICoKKyAqIFxwYXJhbSBwTXBlZ1N1cnJvdW5kRGVjb2RlciAgIEEgcG9pbnRlciB0byBhIGRlY29kZXIgaGFuZGxlOyBmaWxsZWQgb24KKyAqIHJldHVybi4KKyAqIFxwYXJhbSBzcGxpdE1lbW9yeUFsbG9jYXRpb24gIEFsbG9jYXRlIG9ubHkgb3V0ZXIgbGF5ZXIgb2YgTVBTIGRlY29kZXIuIENvcmUKKyAqIHBhcnQgaXMgcmVhbGxvY2F0ZWQgbGF0ZXIgaWYgbmVlZGVkLgorICogXHBhcmFtIHN0ZXJlb0NvbmZpZ0luZGV4ICAgICAgVVNBQzogU2F2ZSBtZW1vcnkgYnkgb3BlbmluZyB0aGUgTVBTIGRlY29kZXIKKyAqIGZvciBhIHNwZWNpZmljIHN0ZXJlb0NvbmZpZ0luZGV4LiAoTmVlZHMgb3B0aW1pemF0aW9uIG1hY3JvcyBlbmFibGVkLikKKyAqIFxwYXJhbSBwUW1mRG9tYWluICAgICAgICAgICAgIFBvaW50ZXIgdG8gUU1GIGRvbWFpbiBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBccmV0dXJuIFNBQ0RFQ19FUlJPUiBlcnJvciBjb2RlCisgKi8KK1NBQ0RFQ19FUlJPUiBtcGVnU3Vycm91bmREZWNvZGVyX09wZW4oCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKipwTXBlZ1N1cnJvdW5kRGVjb2RlciwgaW50IHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgIEhBTkRMRV9GREtfUU1GX0RPTUFJTiBwUW1mRG9tYWluKTsKKworLyoqCisgKiBcYnJpZWYgIEluaXQgb25lIGluc3RhbmNlIG9mIHRoZSBNUEVHIFN1cnJvdW5kIGRlY29kZXIuCisgKgorICogSW5pdCBvbmUgaW5zdGFuY2Ugb2YgdGhlIE1QRUcgU3Vycm91bmQgZGVjb2RlcgorICoKKyAqIFxwYXJhbSBwTXBlZ1N1cnJvdW5kRGVjb2RlciAgQSBwb2ludGVyIHRvIGEgZGVjb2RlciBoYW5kbGU7CisgKgorICogXHJldHVybiBTQUNERUNfRVJST1IgZXJyb3IgY29kZQorICovCitTQUNERUNfRVJST1IgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9Jbml0KAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2Rlcik7CisKKy8qKgorICogXGJyaWVmIFJlYWQgYW5kIHBhcnNlIFNwYXRpYWxTcGVjaWZpY0NvbmZpZy4KKyAqCisgKiBccGFyYW0gcE1wZWdTdXJyb3VuZERlY29kZXIgIEEgcG9pbnRlciB0byBhIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlIGNvbmZpZyBwYXJzaW5nIGRhdGEgc291cmNlLgorICoKKyAqIFxyZXR1cm4gU0FDREVDX0VSUk9SIGVycm9yIGNvZGUKKyAqLworU0FDREVDX0VSUk9SIG1wZWdTdXJyb3VuZERlY29kZXJfQ29uZmlnKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywgSU5UIHNhbXBsaW5nUmF0ZSwgSU5UIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgIElOVCBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCwgSU5UIGNvbmZpZ0J5dGVzLCBjb25zdCBVQ0hBUiBjb25maWdNb2RlLAorICAgIFVDSEFSICpjb25maWdDaGFuZ2VkKTsKKworU0FDREVDX0VSUk9SCittcGVnU3Vycm91bmREZWNvZGVyX0NvbmZpZ3VyZVFtZkRvbWFpbigKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgU0FDX0lOUFVUX0NPTkZJRyBzYWNfZGVjX2ludGVyZmFjZSwgVUlOVCBjb3JlU2FtcGxpbmdSYXRlLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYyk7CisKKy8qKgorICogXGJyaWVmIFBhcnNlIE1QRUcgU3Vycm91bmQgZGF0YSB3aXRob3V0IGhlYWRlcgorICoKKyAqIFxwYXJhbSBwTXBlZ1N1cnJvdW5kRGVjb2RlciBBIE1QRUcgU3VycnJvdW5kIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGhCcyAgICAgICAgICAgICAgICAgIEJpdCBzdHJlYW0gaGFuZGxlIGRhdGEgaW5wdXQgc291cmNlCisgKiBccGFyYW0gcE1wc0RhdGFCaXRzICAgICAgICAgUG9pbnRlciB0byBudW1iZXIgb2YgdmFsaWQgYml0cyBpbiBleHRlbnNpb24KKyAqIHBheWxvYWQuIEZ1bmN0aW9uIHVwZGF0ZXMgbXBzRGF0YUJpdHMgd2hpbGUgcGFyc2luZyBiaXRzdHJlYW0uCisgKiBccGFyYW0gZkdsb2JhbEluZGVwZW5kZW5jeUZsYWcgR2xvYmFsIGluZGVwZW5kZW5jeSBmbGFnIG9mIGN1cnJlbnQgZnJhbWUuCisgKgorICogXHJldHVybiAgRXJyb3IgY29kZS4KKyAqLworaW50IG1wZWdTdXJyb3VuZERlY29kZXJfUGFyc2VOb0hlYWRlcigKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICBpbnQgKnBNcHNEYXRhQml0cywgaW50IGZHbG9iYWxJbmRlcGVuZGVuY3lGbGFnKTsKKworLyogI2lmZGVmIFNBQ0RFQ19NUFNfRU5BQkxFICovCisvKioKKyAqIFxicmllZiBQYXJzZSBNUEVHIFN1cnJvdW5kIGRhdGEgd2l0aCBoZWFkZXIuIEhlYWRlciBpcyBhbmNUeXBlLCBhbmNTdGFydCwKKyBhbmNTdG9wICg0IGJpdHMgdG90YWwpLiBCb2R5IGlzIGFuY0RhdGFTZWdtZW50Qnl0ZVtpXS4KKyAqCisgKiBccGFyYW0gcE1wZWdTdXJyb3VuZERlY29kZXIgQSBNUEVHIFN1cnJyb3VuZCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICBCaXQgc3RyZWFtIGhhbmRsZSBkYXRhIGlucHV0IHNvdXJjZQorICogXHBhcmFtIHBNcHNEYXRhQml0cyAgICAgICAgIFBvaW50ZXIgdG8gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gZXh0ZW5zaW9uCisgcGF5bG9hZC4gRnVuY3Rpb24gdXBkYXRlcyBtcHNEYXRhQml0cyB3aGlsZSBwYXJzaW5nIGJpdHN0cmVhbS4gTmVlZHMgdG8gYmUgYQorIG11bHRpcGxlIG9mIDggKyA0ICg0IGJpdHMgaGVhZGVyKS4KKyAqIFxwYXJhbSBjb3JlQ29kZWMgICAgICAgICAgICBUaGUgYXVkaW8gb2JqZWN0IHR5cGUgb2YgdGhlIGNvcmUgY29kZWMgaGFuZGxpbmcKKyB0aGUgZG93bm1peCBpbnB1dCBzaWduYWwuCisgKiBccGFyYW0gc2FtcGxlUmF0ZSAgICAgICAgICAgU2FtcGxlcmF0ZSBvZiBpbnB1dCBkb3dubWl4IGRhdGEuCisgKiBccGFyYW0gbkNoYW5uZWxzICAgICAgICAgICAgQW1vdW50IG9mIGlucHV0IGNoYW5uZWxzLgorICogXHBhcmFtIGZyYW1lU2l6ZSAgICAgICAgICAgIEFtb3VudCBvZiBpbnB1dCBzYW1wbGVzLgorICogXHBhcmFtIGZHbG9iYWxJbmRlcGVuZGVuY3lGbGFnIEdsb2JhbCBpbmRlcGVuZGVuY3kgZmxhZyBvZiBjdXJyZW50IGZyYW1lLgorICoKKyAqIFxyZXR1cm4gIEVycm9yIGNvZGUuCisgKi8KK2ludCBtcGVnU3Vycm91bmREZWNvZGVyX1BhcnNlKENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50ICpwTXBzRGF0YUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsIGludCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lU2l6ZSwgaW50IGZHbG9iYWxJbmRlcGVuZGVuY3lGbGFnKTsKKy8qICNlbmRpZiAqLworCisvKioKKyAqIFxicmllZiBBcHBseSBNUEVHIFN1cnJvdW5kIHVwbWl4LgorICoKKyAqIFByb2Nlc3Mgb25lIGRvd25taXggYXVkaW8gZnJhbWUgYW5kIGRlY29kZSBvbmUgc3Vycm91bmQgZnJhbWUgaWYgaXQgYXBwbGllcy4KKyAqIERvd25taXggZnJhbWluZyBjYW4gYmUgZGlmZmVyZW50IGZyb20gc3Vycm91bmQgZnJhbWluZywgc28gZGVwZW5kaW5nIG9uIHRoZQorICogZnJhbWUgc2l6ZSBvZiB0aGUgZG93bm1peCBhdWRpbyBkYXRhIGFuZCB0aGUgZnJhbWluZyBiZWluZyB1c2VkIGJ5IHRoZSBNUEVHCisgKiBTdXJyb3VuZCBkZWNvZGVyLCBpdCBjb3VsZCBiZSB0aGF0IG9ubHkgZXZlcnkgc2Vjb25kIGNhbGwsIGZvciBleGFtcGxlLCBvZgorICogdGhpcyBmdW5jdGlvbiBhY3R1YWxseSBzdXJyb3VuZCBkYXRhIHdhcyBkZWNvZGVkLiBUaGUgcmV0dXJuZWQgdmFsdWUgb2YKKyAqIGZyYW1lU2l6ZSB3aWxsIGJlIHplcm8sIGlmIG5vIHN1cnJvdW5kIGRhdGEgd2FzIGRlY29kZWQuCisgKgorICogRGVjb2Rpbmcgb25lIE1QRUcgU3Vycm91bmQgZnJhbWUuIERlcGVuZGluZyBvbiBpbnRlcmZhY2UgY29uZmlndXJhdGlvbgorICogbXBlZ1N1cnJvdW5kRGVjb2Rlcl9TZXRQYXJhbShzZWxmLCBTQUNERUNfSU5URVJGQUNFLCB2YWx1ZSksIHRoZSBRTUYgb3IgdGltZQorICogaW50ZXJmYWNlIHdpbGwgYmUgYXBwbGllZC4gRXh0ZXJuYWwgYWNjZXNzIHRvIFFNRiBidWZmZXIgaW50ZXJmYWNlIGNhbiBiZQorICogYWNoaWV2ZWQgYnkgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9HZXRRbWZCdWZmZXIoKSBjYWxsIGJlZm9yZSBkZWNvZGUgZnJhbWUuCisgKiBXaGlsZSB1c2luZyB0aW1lIGludGVyZmFjZSwgcFRpbWVEYXRhIGJ1ZmZlciB3aWxsIGJlIHNoYXJlZCBhcyBpbnB1dCBhbmQKKyAqIG91dHB1dCBidWZmZXIuCisgKgorICogXHBhcmFtIHBNcGVnU3Vycm91bmREZWNvZGVyIEEgTVBFRyBTdXJycm91bmQgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gcFRpbWVEYXRhICAgICAgICAgICAgUG9pbnRlciB0byB0aW1lIGJ1ZmZlci4gRGVwZW5kaW5nIG9uIGludGVyZmFjZQorICogY29uZmlndXJhdGlvbiwgdGhlIGNvbnRlbnQgb2YgcFRpbWVEYXRhIGlzIGlnbm9yZWQsIGFuZCB0aGUgaW50ZXJuYWwgUU1GCisgKiBidWZmZXIgd2lsbCBiZSB1c2VkIGFzIGlucHV0IGRhdGEgc291cmNlLgorICogT3RoZXJ3aXNlLCB0aGUgTVBFRyBTdXJyb3VuZCBwcm9jZXNzaW5nIGlzIGFwcGxpZWQgdG8gdGhlIHRpbWVzaWduYWwKKyAqIHBUaW1lRGF0YS4gRm9yIGJvdGggdmFyaWFudHMsIHRoZSByZXN1bHRpbmcgTVBFRworICogU3Vycm91bmQgc2lnbmFsIGlzIHdyaXR0ZW4gaW50byBwVGltZURhdGEuCisgKiBccGFyYW0gdGltZURhdGFTaXplICAgICAgICAgU2l6ZSBvZiBwVGltZURhdGEgKGF2YWlsYWJsZSBidWZmZXIgc2l6ZSkuCisgKiBccGFyYW0gdGltZURhdGFGcmFtZVNpemUgICAgRnJhbWUgc2l6ZSBvZiBpbnB1dCB0aW1lZGF0YQorICogXHBhcmFtIG5DaGFubmVscyAgICAgICAgICAgIFBvaW50ZXIgd2hlcmUgdGhlIGFtb3VudCBvZiBpbnB1dCBjaGFubmVscyBpcworICogZ2l2ZW4gYW5kIGFtb3VudCBvZiBvdXRwdXQgY2hhbm5lbHMgaXMgcmV0dXJuZWQuCisgKiBccGFyYW0gZnJhbWVTaXplICAgICAgICAgICAgUG9pbnRlciB3aGVyZSB0aGUgYW1vdW50IG9mIG91dHB1dCBzYW1wbGVzIGlzCisgKiByZXR1cm5lZCBpbnRvLgorICogXHBhcmFtIGNoYW5uZWxUeXBlICAgICAgICAgIEFycmF5IHdlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGZvcgorICogZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCBpcyBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSBjaGFubmVsSW5kaWNlcyAgICAgICBBcnJheSB3ZXJlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRleAorICogZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwgaXMgc3RvcmVkIGludG8uCisgKiBccGFyYW0gbWFwRGVzY3IgICAgICAgICAgICAgQ2hhbm5lcCBtYXAgZGVzY3JpcHRvciBmb3Igb3V0cHV0IGNoYW5uZWwgbWFwcGluZworICogdG8gYmUgdXNlZCAoRnJvbSBNUEVHIFBDRSBvcmRlcmluZyB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCkuCisgKgorICogXHJldHVybiAgRXJyb3IgY29kZS4KKyAqLworaW50IG1wZWdTdXJyb3VuZERlY29kZXJfQXBwbHkoQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqaW5wdXQsIFBDTV9NUFMgKnBUaW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0aW1lRGF0YVNpemUsIGludCB0aW1lRGF0YUZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbkNoYW5uZWxzLCBpbnQgKmZyYW1lU2l6ZSwgaW50IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgY2hhbm5lbFR5cGVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGNoYW5uZWxJbmRpY2VzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfY2hhbm5lbE1hcERlc2NyICpjb25zdCBtYXBEZXNjcik7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgICAgICAgICBEZWFsbG9jYXRlIGEgTVBFRyBTdXJyb3VuZCBkZWNvZGVyIGluc3RhbmNlLgorICogXHBhcmFtIHBNcGVnU3Vycm91bmREZWNvZGVyICBBIGRlY29kZXIgaGFuZGxlLgorICogXHJldHVybiAgICAgICAgICAgICAgICAgICAgICBObyByZXR1cm4gdmFsdWUuCisgKi8KK3ZvaWQgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9DbG9zZShDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBjb25maWcgZGVwZW5kZW50IE1QRUcgU3Vycm91bmQgbWVtb3J5LgorICogXHBhcmFtIHBNcGVnU3Vycm91bmREZWNvZGVyICBBIGRlY29kZXIgaGFuZGxlLgorICogXHJldHVybiAgICAgICAgICAgICAgICAgICAgICBlcnJvci4KKyAqLworU0FDREVDX0VSUk9SIG1wZWdTdXJyb3VuZERlY29kZXJfRnJlZU1lbSgKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIpOworCisvKioKKyAqIFxicmllZiAgU2V0IG9uZSBzaW5nbGUgTVBFRyBTdXJyb3VuZCBkZWNvZGVyIHBhcmFtZXRlci4KKyAqCisgKiBccGFyYW0gcE1wZWdTdXJyb3VuZERlY29kZXIgIEEgTVBFRyBTdXJycm91bmQgZGVjb2RlciBoYW5kbGUuIE11c3Qgbm90IGJlCisgKiBOVUxMIHBvaW50ZXIuCisgKiBccGFyYW0gcGFyYW0gICAgICAgICAgICAgICAgIFBhcmFtZXRlciB0byBiZSBzZXQuIFNlZSBTQUNERUNfUEFSQU0uCisgKiBccGFyYW0gdmFsdWUgICAgICAgICAgICAgICAgIFBhcmFtZXRlciB2YWx1ZS4gU2VlIFNBQ0RFQ19QQVJBTS4KKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2VzcywgYW5kIG5vbi16ZXJvIG9uIGZhaWx1cmUuCisgKi8KK1NBQ0RFQ19FUlJPUiBtcGVnU3Vycm91bmREZWNvZGVyX1NldFBhcmFtKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwgY29uc3QgU0FDREVDX1BBUkFNIHBhcmFtLAorICAgIGNvbnN0IElOVCB2YWx1ZSk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFJldHJpZXZlIE1QRUcgU3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5IGluZm8gYW5kIGZpbGwgaW5mbyBsaXN0IHdpdGggYWxsIGRlcGVuZGluZyBsaWJyYXJ5IGluZm9zLgorICogXHBhcmFtIGxpYkluZm8gIFBvaW50ZXIgdG8gbGlicmFyeSBpbmZvIGxpc3QgdG8gYmUgZmlsbGVkLgorICogXHJldHVybiAgICAgICAgIDAgb24gc3VjZXNzLCBhbmQgbm9uLXplcm8gb24gZmFpbHVyZS4KKyAqKi8KK2ludCBtcGVnU3Vycm91bmREZWNvZGVyX0dldExpYkluZm8oTElCX0lORk8gKmxpYkluZm8pOworCisvKioKKyAqIFxicmllZiAgU2V0IG9uZSBzaW5nbGUgTVBFRyBTdXJyb3VuZCBkZWNvZGVyIHBhcmFtZXRlci4KKyAqCisgKiBccGFyYW0gcE1wZWdTdXJyb3VuZERlY29kZXIgIEEgdmFsaWQgTVBFRyBTdXJycm91bmQgZGVjb2RlciBoYW5kbGUuCisgKgorICogXHJldHVybiAgVGhlIGFkZGl0aW9uYWwgc2lnbmFsIGRlbGF5IGNhdXNlZCBieSB0aGUgbW9kdWxlLgorICovCitVSU5UIG1wZWdTdXJyb3VuZERlY29kZXJfR2V0RGVsYXkoY29uc3QgQ01wZWdTdXJyb3VuZERlY29kZXIgKnNlbGYpOworCisvKioKKyAqIFxicmllZiAgR2V0IGluZm8gb24gd2hldGhlciB0aGUgVVNBQyBwc2V1ZG8gTFIgZmVhdHVyZSBpcyBhY3RpdmUuCisgKgorICogXHBhcmFtIHBNcGVnU3Vycm91bmREZWNvZGVyICBBIHZhbGlkIE1QRUcgU3VycnJvdW5kIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGJzUHNldWRvTHIgICAgICAgICAgICBQb2ludGVyIHRvIHJldHVybiB3ZXRoZXIgcHNldWRvIExSIFVTQUMgZmVhdHVyZQorICogaXMgdXNlZC4KKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2VzcywgYW5kIG5vbi16ZXJvIG9uIGZhaWx1cmUuCisgKi8KK1NBQ0RFQ19FUlJPUiBtcGVnU3Vycm91bmREZWNvZGVyX0lzUHNldWRvTFIoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLCBpbnQgKmJzUHNldWRvTHIpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogI2lmbmRlZiBTQUNfREVDX0xJQl9IICovCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19iaXRkZWMuY3BwIGIvbGliU0FDZGVjL3NyYy9zYWNfYml0ZGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2UwY2YyCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfYml0ZGVjLmNwcApAQCAtMCwwICsxLDIxNDcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlYyBiaXRzdHJlYW0gZGVjb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic2FjX2JpdGRlYy5oIgorCisjaW5jbHVkZSAic2FjX2RlY19lcnJvcmNvZGVzLmgiCisjaW5jbHVkZSAibmxjX2RlYy5oIgorI2luY2x1ZGUgInNhY19yb20uaCIKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisjaW5jbHVkZSAic2FjX3RzZC5oIgorCitlbnVtIHsKKyAgb3R0VnNUb3RJbmFjdGl2ID0gMCwKKyAgb3R0VnNUb3REYjFBY3RpdiA9IDEsCisgIG90dFZzVG90RGIyQWN0aXYgPSAyLAorICBvdHRWc1RvdERiMURiMkFjdGl2ID0gMworfTsKKworc3RhdGljIFNBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjRGVjb2RlSGVscGVySW5mbygKKyAgICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNwYXRpYWxTcGVjaWZpY0NvbmZpZywgVVBNSVhUWVBFIHVwbWl4VHlwZSkgeworICBpbnQgaTsKKyAgVUlOVCBzeW50YXhGbGFnczsKKworICAvKiBEZXRlcm1pbmUgYml0IHN0cmVhbSBzeW50YXggKi8KKyAgc3ludGF4RmxhZ3MgPSAwOworICBzd2l0Y2ggKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmNvcmVDb2RlYykgeworICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgorICAgICAgc3ludGF4RmxhZ3MgfD0gU0FDREVDX1NZTlRBWF9MRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX1VTQUM6CisgICAgICBzeW50YXhGbGFncyB8PSBTQUNERUNfU1lOVEFYX1VTQUM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9OT05FOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTVBTX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgfQorCisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnN5bnRheEZsYWdzID0gc3ludGF4RmxhZ3M7CisKKyAgc3dpdGNoIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnKSB7CisgICAgY2FzZSBUUkVFXzIxMjogeworICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+b3R0Q0xEZGVmYXVsdFswXSA9IDA7CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE1QU19JTlZBTElEX1RSRUVDT05GSUc7CisgIH0KKworICBpZiAoc3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX1VTQUMpIHsKKyAgICBpZiAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNPdHRCYW5kc1BoYXNlUHJlc2VudCkgeworICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bnVtT3R0QmFuZHNJUEQgPQorICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzT3R0QmFuZHNQaGFzZTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IG51bVBhcmFtZXRlckJhbmRzOworCisgICAgICBudW1QYXJhbWV0ZXJCYW5kcyA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmZyZXFSZXM7CisgICAgICBzd2l0Y2ggKG51bVBhcmFtZXRlckJhbmRzKSB7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm51bU90dEJhbmRzSVBEID0gMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm51bU90dEJhbmRzSVBEID0gMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5udW1PdHRCYW5kc0lQRCA9IDU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bnVtT3R0QmFuZHNJUEQgPSA3OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIwOgorICAgICAgICBjYXNlIDI4OgorICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm51bU90dEJhbmRzSVBEID0gMTA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIE1QU19JTlZBTElEX1BBUkFNRVRFUkJBTkRTOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5udW1PdHRCYW5kc0lQRCA9IDA7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5PdHRCb3hlczsgaSsrKSB7CisgICAgeworICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+Yml0c3RyZWFtT3R0QmFuZHNbaV0gPQorICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmZyZXFSZXM7CisgICAgfQorICAgIHsKKyAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm51bU90dEJhbmRzW2ldID0KKyAgICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5iaXRzdHJlYW1PdHRCYW5kc1tpXTsKKyAgICAgIGlmIChzeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfVVNBQyAmJgorICAgICAgICAgICFwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic090dEJhbmRzUGhhc2VQcmVzZW50KSB7CisgICAgICAgIGlmIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5iUmVzaWR1YWxDb2RpbmcgJiYKKyAgICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPlJlc2lkdWFsQ29uZmlnW2ldLmJSZXNpZHVhbFByZXNlbnQgJiYKKyAgICAgICAgICAgIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5udW1PdHRCYW5kc0lQRCA8CisgICAgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+UmVzaWR1YWxDb25maWdbaV0ublJlc2lkdWFsQmFuZHMpKSB7CisgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bnVtT3R0QmFuZHNJUEQgPQorICAgICAgICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5SZXNpZHVhbENvbmZpZ1tpXS5uUmVzaWR1YWxCYW5kczsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSAvKiBpICovCisKKyAgcmV0dXJuIE1QU19PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IFNwYXRpYWxEZWNQYXJzZUV4dGVuc2lvbkNvbmZpZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNQYXJzZUV4dGVuc2lvbkNvbmZpZygKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0sIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpjb25maWcsCisgICAgaW50IG51bU90dEJveGVzLCBpbnQgbnVtVHR0Qm94ZXMsIGludCBudW1PdXRDaGFuLCBpbnQgYml0c0F2YWlsYWJsZSkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBJTlQgYmEgPSBiaXRzQXZhaWxhYmxlOworCisgIGNvbmZpZy0+c2FjRXh0Q250ID0gMDsKKyAgY29uZmlnLT5iUmVzaWR1YWxDb2RpbmcgPSAwOworCisgIGJhID0gZk1pbigoaW50KUZES2dldFZhbGlkQml0cyhiaXRzdHJlYW0pLCBiYSk7CisKKyAgd2hpbGUgKChiYSA+PSA4KSAmJiAoY29uZmlnLT5zYWNFeHRDbnQgPCBNQVhfTlVNX0VYVF9UWVBFUykpIHsKKyAgICBpbnQgYml0c1JlYWQsIG5GaWxsQml0czsKKyAgICBJTlQgdG1wOworICAgIFVJTlQgc2FjRXh0TGVuOworCisgICAgY29uZmlnLT5zYWNFeHRUeXBlW2NvbmZpZy0+c2FjRXh0Q250XSA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgNCk7CisgICAgYmEgLT0gNDsKKworICAgIHNhY0V4dExlbiA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgNCk7CisgICAgYmEgLT0gNDsKKworICAgIGlmIChzYWNFeHRMZW4gPT0gMTUpIHsKKyAgICAgIHNhY0V4dExlbiArPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDgpOworICAgICAgYmEgLT0gODsKKyAgICAgIGlmIChzYWNFeHRMZW4gPT0gMTUgKyAyNTUpIHsKKyAgICAgICAgc2FjRXh0TGVuICs9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMTYpOworICAgICAgICBiYSAtPSAxNjsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0bXAgPSAoSU5UKUZES2dldFZhbGlkQml0cygKKyAgICAgICAgYml0c3RyZWFtKTsgLyogRXh0ZW5zaW9uIGNvbmZpZyBwYXlsb2FkIHN0YXJ0IGFuY2hvci4gKi8KKyAgICBpZiAoKHRtcCA8PSAwKSB8fCAodG1wIDwgKElOVClzYWNFeHRMZW4gKiA4KSB8fCAoYmEgPCAoSU5UKXNhY0V4dExlbiAqIDgpKSB7CisgICAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgc3dpdGNoIChjb25maWctPnNhY0V4dFR5cGVbY29uZmlnLT5zYWNFeHRDbnRdKSB7CisgICAgICBkZWZhdWx0OjsgLyogdW5rbm93biBleHRlbnNpb24gZGF0YSA9PiBkbyBub3RoaW5nICovCisgICAgfQorCisgICAgLyogc2tpcCByZW1haW5pbmcgZXh0ZW5zaW9uIGRhdGEgKi8KKyAgICBiaXRzUmVhZCA9IHRtcCAtIEZES2dldFZhbGlkQml0cyhiaXRzdHJlYW0pOworICAgIG5GaWxsQml0cyA9IDggKiBzYWNFeHRMZW4gLSBiaXRzUmVhZDsKKworICAgIGlmIChuRmlsbEJpdHMgPCAwKSB7CisgICAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFNraXAgZmlsbCBiaXRzIG9yIGFuIHVua293biBleHRlbnNpb24uICovCisgICAgICBGREtwdXNoRm9yKGJpdHN0cmVhbSwgbkZpbGxCaXRzKTsKKyAgICB9CisKKyAgICBiYSAtPSA4ICogc2FjRXh0TGVuOworICAgIGNvbmZpZy0+c2FjRXh0Q250Kys7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNQYXJzZVNwZWNpZmljQ29uZmlnSGVhZGVyKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJpdHN0cmVhbSwKKyAgICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNwYXRpYWxTcGVjaWZpY0NvbmZpZywKKyAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsIFNQQVRJQUxfREVDX1VQTUlYX1RZUEUgdXBtaXhUeXBlKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIElOVCBudW1GaWxsQml0czsKKyAgaW50IHNhY0hlYWRlckxlbiA9IDA7CisgIGludCBzYWNUaW1lQWxpZ25GbGFnID0gMDsKKworICBzYWNUaW1lQWxpZ25GbGFnID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKTsKKyAgc2FjSGVhZGVyTGVuID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCA3KTsKKworICBpZiAoc2FjSGVhZGVyTGVuID09IDEyNykgeworICAgIHNhY0hlYWRlckxlbiArPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDE2KTsKKyAgfQorICBudW1GaWxsQml0cyA9IEZES2dldFZhbGlkQml0cyhiaXRzdHJlYW0pOworCisgIGVyciA9IFNwYXRpYWxEZWNQYXJzZVNwZWNpZmljQ29uZmlnKGJpdHN0cmVhbSwgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FjSGVhZGVyTGVuLCBjb3JlQ29kZWMpOworCisgIG51bUZpbGxCaXRzIC09CisgICAgICBGREtnZXRWYWxpZEJpdHMoYml0c3RyZWFtKTsgLyogdGhlIG51bWJlciBvZiByZWFkIGJpdHMgKHRtcEJpdHMpICovCisgIG51bUZpbGxCaXRzID0gKDggKiBzYWNIZWFkZXJMZW4pIC0gbnVtRmlsbEJpdHM7CisgIGlmIChudW1GaWxsQml0cyA8IDApIHsKKyAgICAvKiBQYXJzaW5nIHdlbnQgd3JvbmcgKi8KKyAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgIH0KKyAgLyogTW92ZSB0byB0aGUgdmVyeSBlbmQgb2YgdGhlIFNTQyAqLworICBGREtwdXNoQmlEaXJlY3Rpb25hbChiaXRzdHJlYW0sIG51bUZpbGxCaXRzKTsKKworICBpZiAoKGVyciA9PSBNUFNfT0spICYmIHNhY1RpbWVBbGlnbkZsYWcpIHsKKyAgICAvKiBub3Qgc3VwcG9ydGVkICovCisgICAgRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxNik7CisgICAgZXJyID0gTVBTX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgfQorCisgIC8qIERlcml2ZSBhZGRpdGlvbmFsIGhlbHBlciB2YXJpYWJsZXMgKi8KKyAgU3BhdGlhbERlY0RlY29kZUhlbHBlckluZm8ocFNwYXRpYWxTcGVjaWZpY0NvbmZpZywgKFVQTUlYVFlQRSl1cG1peFR5cGUpOworCisgIHJldHVybiBlcnI7Cit9CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjUGFyc2VNcHMyMTJDb25maWcoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYml0c3RyZWFtLAorICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCBpbnQgc2FtcGxpbmdSYXRlLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywgSU5UIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgIElOVCBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCkgeworICBpbnQgaTsKKworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5zdGVyZW9Db25maWdJbmRleCA9IHN0ZXJlb0NvbmZpZ0luZGV4OworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5jb3JlU2JyRnJhbWVMZW5ndGhJbmRleCA9IGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4OworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5mcmVxUmVzID0KKyAgICAgIChTUEFUSUFMREVDX0ZSRVFfUkVTKWZyZXFSZXNUYWJsZVtGREtyZWFkQml0cyhiaXRzdHJlYW0sIDMpXTsKKyAgaWYgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmZyZXFSZXMgPT0gMCkgeworICAgIHJldHVybiBNUFNfUEFSU0VfRVJST1I7IC8qIHJlc2VydmVkIHZhbHVlICovCisgIH0KKworICBzd2l0Y2ggKGNvcmVDb2RlYykgeworICAgIGNhc2UgQU9UX0RSTV9VU0FDOgorICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNGaXhlZEdhaW5ETVggPQorICAgICAgICAgIChTUEFUSUFMREVDX0ZJWEVEX0dBSU5TKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMyk7CisgICAgICAvKiB0ZW1wU2hhcGVDb25maWcgPSAoYnNUZW1wU2hhcGVDb25maWdEcm0gPT0gMSkgPyAzIDogMCAqLworICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dGVtcFNoYXBlQ29uZmlnID0KKyAgICAgICAgICAoU1BBVElBTERFQ19UU19DT05GKShGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpICogMyk7CisgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5kZWNvcnJDb25maWcgPSAoU1BBVElBTERFQ19ERUNPUlJfQ09ORikwOworICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNEZWNvcnJUeXBlID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX1VTQUM6CisgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0ZpeGVkR2FpbkRNWCA9CisgICAgICAgICAgKFNQQVRJQUxERUNfRklYRURfR0FJTlMpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAzKTsKKyAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRlbXBTaGFwZUNvbmZpZyA9CisgICAgICAgICAgKFNQQVRJQUxERUNfVFNfQ09ORilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDIpOworICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+ZGVjb3JyQ29uZmlnID0KKyAgICAgICAgICAoU1BBVElBTERFQ19ERUNPUlJfQ09ORilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDIpOworICAgICAgaWYgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmRlY29yckNvbmZpZyA+IDIpIHsKKyAgICAgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsgLyogcmVzZXJ2ZWQgdmFsdWUgKi8KKyAgICAgIH0KKyAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzRGVjb3JyVHlwZSA9IDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE1QU19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgIH0KKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+blRpbWVTbG90cyA9IChjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCA9PSA0KSA/IDY0IDogMzI7CisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzSGlnaFJhdGVNb2RlID0gKFVDSEFSKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisKKyAgeworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzUGhhc2VDb2RpbmcgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKTsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic090dEJhbmRzUGhhc2VQcmVzZW50ID0KKyAgICAgICAgKFVDSEFSKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisgICAgaWYgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzT3R0QmFuZHNQaGFzZVByZXNlbnQpIHsKKyAgICAgIGlmIChNQVhfUEFSQU1FVEVSX0JBTkRTIDwgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzT3R0QmFuZHNQaGFzZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoYml0c3RyZWFtLCA1KSkpIHsKKyAgICAgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNPdHRCYW5kc1BoYXNlID0gMDsKKyAgICB9CisgIH0KKworICBpZiAoc3RlcmVvQ29uZmlnSW5kZXggPiAxKSB7IC8qIGRvIHJlc2lkdWFsIGNvZGluZyAqLworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJSZXNpZHVhbENvZGluZyA9IDE7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+UmVzaWR1YWxDb25maWctPmJSZXNpZHVhbFByZXNlbnQgPSAxOworICAgIGlmIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5mcmVxUmVzIDwKKyAgICAgICAgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPlJlc2lkdWFsQ29uZmlnLT5uUmVzaWR1YWxCYW5kcyA9CisgICAgICAgICAgICAgRkRLcmVhZEJpdHMoYml0c3RyZWFtLCA1KSkpIHsKKyAgICAgIHJldHVybiBNUFNfUEFSU0VfRVJST1I7CisgICAgfQorICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzT3R0QmFuZHNQaGFzZSA9CisgICAgICAgIGZNYXgocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNPdHRCYW5kc1BoYXNlLAorICAgICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPlJlc2lkdWFsQ29uZmlnLT5uUmVzaWR1YWxCYW5kcyk7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNQc2V1ZG9MciA9IChVQ0hBUilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworCisgICAgaWYgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzUGhhc2VDb2RpbmcpIHsKKyAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzUGhhc2VDb2RpbmcgPSAzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5iUmVzaWR1YWxDb2RpbmcgPSAwOworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPlJlc2lkdWFsQ29uZmlnLT5iUmVzaWR1YWxQcmVzZW50ID0gMDsKKyAgfQorCisgIGlmIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50ZW1wU2hhcGVDb25maWcgPT0gMikgeworICAgIHN3aXRjaCAoY29yZUNvZGVjKSB7CisgICAgICBjYXNlIEFPVF9VU0FDOgorICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5lbnZRdWFudE1vZGUgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8qIGFkZGVkIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICAgICAgYnJlYWs7IC8qIGFkZGVkIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICB9CisgIH0KKworICAvKiBTdGF0aWMgcGFyYW1ldGVycyAqLworCisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnNhbXBsaW5nRnJlcSA9CisgICAgICBzYW1wbGluZ1JhdGU7IC8qIHdyb25nIGZvciBzdGVyZW9Db25maWdJbmRleCA9PSAzIGJ1dCB2YWx1ZSBpcyB1bnVzZWQgKi8KKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZyA9IFNQQVRJQUxERUNfTU9ERV9SU1ZENzsKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk90dEJveGVzID0KKyAgICAgIHRyZWVQcm9wZXJ0eVRhYmxlW3BTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWddLm51bU90dEJveGVzOworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uSW5wdXRDaGFubmVscyA9CisgICAgICB0cmVlUHJvcGVydHlUYWJsZVtwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnXS5udW1JbnB1dENoYW5uZWxzOworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uT3V0cHV0Q2hhbm5lbHMgPQorICAgICAgdHJlZVByb3BlcnR5VGFibGVbcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZ10ubnVtT3V0cHV0Q2hhbm5lbHM7CisKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YkFyYml0cmFyeURvd25taXggPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uT3R0Qm94ZXM7IGkrKykgeworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPk90dENvbmZpZ1tpXS5uT3R0QmFuZHMgPSAwOworICB9CisKKyAgaWYgKGNvcmVDb2RlYyA9PSBBT1RfRFJNX1VTQUMpIHsKKyAgICAvKiBNUFMgcGF5bG9hZCBpcyBNUEVHIGNvbmZvcm0gLT4gbm8gbmVlZCBmb3IgcHNldWRvIERSTSBBT1QgKi8KKyAgICBjb3JlQ29kZWMgPSBBT1RfVVNBQzsKKyAgfQorICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5jb3JlQ29kZWMgPSBjb3JlQ29kZWM7CisKKyAgLyogRGVyaXZlIGFkZGl0aW9uYWwgaGVscGVyIHZhcmlhYmxlcyAqLworICBTcGF0aWFsRGVjRGVjb2RlSGVscGVySW5mbyhwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCBVUE1JWFRZUEVfTk9STUFMKTsKKworICByZXR1cm4gTVBTX09LOworfQorCitTQUNERUNfRVJST1IgU3BhdGlhbERlY1BhcnNlU3BlY2lmaWNDb25maWcoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYml0c3RyZWFtLAorICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCBpbnQgc2FjSGVhZGVyTGVuLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYykgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBpbnQgaTsKKyAgaW50IGJzU2FtcGxpbmdGcmVxSW5kZXg7CisgIGludCBic0ZyZXFSZXMsIGIzRGF1ZGlvTW9kZSA9IDA7CisgIGludCBudW1IZWFkZXJCaXRzOworICBpbnQgY2ZnU3RhcnRQb3MsIGJpdHNBdmFpbGFibGU7CisKKyAgY2ZnU3RhcnRQb3MgPSBGREtnZXRWYWxpZEJpdHMoYml0c3RyZWFtKTsKKyAgLyogSXQgbWlnaHQgYmUgdGhhdCB3ZSBkbyBub3Qga25vdyB0aGUgU1NDIGxlbmd0aCBiZWZvcmVoYW5kLiAqLworICBpZiAoc2FjSGVhZGVyTGVuID09IDApIHsKKyAgICBiaXRzQXZhaWxhYmxlID0gY2ZnU3RhcnRQb3M7CisgIH0gZWxzZSB7CisgICAgYml0c0F2YWlsYWJsZSA9IDggKiBzYWNIZWFkZXJMZW47CisgICAgaWYgKGJpdHNBdmFpbGFibGUgPiBjZmdTdGFydFBvcykgeworICAgICAgZXJyID0gTVBTX1BBUlNFX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCisgIGJzU2FtcGxpbmdGcmVxSW5kZXggPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDQpOworCisgIGlmIChic1NhbXBsaW5nRnJlcUluZGV4ID09IDE1KSB7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+c2FtcGxpbmdGcmVxID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAyNCk7CisgIH0gZWxzZSB7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+c2FtcGxpbmdGcmVxID0KKyAgICAgICAgc2FtcGxpbmdGcmVxVGFibGVbYnNTYW1wbGluZ0ZyZXFJbmRleF07CisgICAgaWYgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnNhbXBsaW5nRnJlcSA9PSAwKSB7CisgICAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9CisKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+blRpbWVTbG90cyA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgNSkgKyAxOworICBpZiAoKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UaW1lU2xvdHMgPCAxKSB8fAorICAgICAgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UaW1lU2xvdHMgPiBNQVhfVElNRV9TTE9UUykpIHsKKyAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisKKyAgYnNGcmVxUmVzID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAzKTsKKworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5mcmVxUmVzID0KKyAgICAgIChTUEFUSUFMREVDX0ZSRVFfUkVTKWZyZXFSZXNUYWJsZV9MRFtic0ZyZXFSZXNdOworCisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWcgPQorICAgICAgKFNQQVRJQUxERUNfVFJFRV9DT05GSUcpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCA0KTsKKworICBpZiAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZyAhPSBTUEFUSUFMREVDX01PREVfUlNWRDcpIHsKKyAgICBlcnIgPSBNUFNfVU5TVVBQT1JURURfQ09ORklHOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIHsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uT3R0Qm94ZXMgPQorICAgICAgICB0cmVlUHJvcGVydHlUYWJsZVtwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnXS5udW1PdHRCb3hlczsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uVHR0Qm94ZXMgPQorICAgICAgICB0cmVlUHJvcGVydHlUYWJsZVtwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnXS5udW1UdHRCb3hlczsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uSW5wdXRDaGFubmVscyA9CisgICAgICAgIHRyZWVQcm9wZXJ0eVRhYmxlW3BTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWddLm51bUlucHV0Q2hhbm5lbHM7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk91dHB1dENoYW5uZWxzID0KKyAgICAgICAgdHJlZVByb3BlcnR5VGFibGVbcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZ10ubnVtT3V0cHV0Q2hhbm5lbHM7CisgIH0KKworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5xdWFudE1vZGUgPQorICAgICAgKFNQQVRJQUxERUNfUVVBTlRfTU9ERSlGREtyZWFkQml0cyhiaXRzdHJlYW0sIDIpOworCisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJBcmJpdHJhcnlEb3dubWl4ID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKTsKKworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0ZpeGVkR2FpbkRNWCA9CisgICAgICAoU1BBVElBTERFQ19GSVhFRF9HQUlOUylGREtyZWFkQml0cyhiaXRzdHJlYW0sIDMpOworCisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRlbXBTaGFwZUNvbmZpZyA9CisgICAgICAoU1BBVElBTERFQ19UU19DT05GKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMik7CisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmRlY29yckNvbmZpZyA9CisgICAgICAoU1BBVElBTERFQ19ERUNPUlJfQ09ORilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDIpOworICBpZiAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+ZGVjb3JyQ29uZmlnID4gMikgeworICAgIHJldHVybiBNUFNfUEFSU0VfRVJST1I7IC8qIHJlc2VydmVkIHZhbHVlICovCisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk90dEJveGVzOyBpKyspIHsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5PdHRDb25maWdbaV0ubk90dEJhbmRzID0gMDsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uVHR0Qm94ZXM7IGkrKykgeworICAgIGludCBiVHR0RHVhbE1vZGUgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICAgIEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMyk7IC8qIG5vdCBzdXBwb3J0ZWQgKi8KKworICAgIGlmIChiVHR0RHVhbE1vZGUpIHsKKyAgICAgIEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgOCk7IC8qIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICB9CisgIH0KKworICBpZiAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dGVtcFNoYXBlQ29uZmlnID09IDIpIHsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5lbnZRdWFudE1vZGUgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICB9CisKKyAgaWYgKGIzRGF1ZGlvTW9kZSkgeworICAgIGlmIChGREtyZWFkQml0cyhiaXRzdHJlYW0sIDIpID09IDApIHsgLyogYjNEYXVkaW9IUlRGc2V0ID8gKi8KKyAgICAgIGludCBoYzsKKyAgICAgIGludCBIUlRGbnVtQmFuZDsKKyAgICAgIGludCBIUlRGZnJlcVJlcyA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMyk7CisgICAgICBpbnQgSFJURm51bUNoYW4gPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDQpOworICAgICAgaW50IEhSVEZhc3ltbWV0cmljID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKTsKKworICAgICAgSFJURm51bUJhbmQgPSBmcmVxUmVzVGFibGVfTERbSFJURmZyZXFSZXNdOworCisgICAgICBmb3IgKGhjID0gMDsgaGMgPCBIUlRGbnVtQ2hhbjsgaGMrKykgeworICAgICAgICBGREtwdXNoRm9yKGJpdHN0cmVhbSwgSFJURm51bUJhbmQgKiA2KTsgLyogSFJURmxldmVsTGVmdFtoY11baGJdICovCisgICAgICAgIGlmIChIUlRGYXN5bW1ldHJpYykgeworICAgICAgICAgIEZES3B1c2hGb3IoYml0c3RyZWFtLCBIUlRGbnVtQmFuZCAqIDYpOyAvKiBIUlRGbGV2ZWxSaWdodFtoY11baGJdICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSkpIHsgICAgICAgICAgLyogSFJURnBoYXNlW2hjXSA/ICovCisgICAgICAgICAgRkRLcHVzaEZvcihiaXRzdHJlYW0sIEhSVEZudW1CYW5kICogNik7IC8qIEhSVEZwaGFzZUxSW2hjXVtoYl0gKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKSkgeyAgICAgICAgICAvKiBIUlRGaWNjW2hjXSA/ICovCisgICAgICAgICAgRkRLcHVzaEZvcihiaXRzdHJlYW0sIEhSVEZudW1CYW5kICogNik7IC8qIEhSVEZpY2NMUltoY11baGJdICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBGREtieXRlQWxpZ24oYml0c3RyZWFtLAorICAgICAgICAgICAgICAgY2ZnU3RhcnRQb3MpOyAvKiBJU08vSUVDIEZESVMgMjMwMDMtMTogNS4yLiAuLi4gYnl0ZSBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCByZXNwZWN0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN5bnRhY3RpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGluIHdoaWNoIEJ5dGVBbGlnbigpIG9jY3Vycy4gKi8KKworICBudW1IZWFkZXJCaXRzID0gY2ZnU3RhcnRQb3MgLSAoSU5UKUZES2dldFZhbGlkQml0cyhiaXRzdHJlYW0pOworICBiaXRzQXZhaWxhYmxlIC09IG51bUhlYWRlckJpdHM7CisKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+c2FjRXh0Q250ID0gMDsKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YlJlc2lkdWFsQ29kaW5nID0gMDsKKworICBpZiAoKGVyciA9PSBNUFNfT0spICYmIChiaXRzQXZhaWxhYmxlID4gMCkpIHsKKyAgICBlcnIgPSBTcGF0aWFsRGVjUGFyc2VFeHRlbnNpb25Db25maWcoCisgICAgICAgIGJpdHN0cmVhbSwgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZywgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk90dEJveGVzLAorICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uVHR0Qm94ZXMsCisgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5PdXRwdXRDaGFubmVscywgYml0c0F2YWlsYWJsZSk7CisgIH0KKworICBGREtieXRlQWxpZ24oCisgICAgICBiaXRzdHJlYW0sCisgICAgICBjZmdTdGFydFBvcyk7IC8qIFNhbWUgYWxpZ25tZW50IGFuY2hvciBhcyBhYm92ZSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgICAgIFNwYXRpYWxFeHRlbnNpb25Db25maWcoKSBhbHdheXMgcmVhZHMgZnVsbCBieXRlcyAqLworCisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmNvcmVDb2RlYyA9IGNvcmVDb2RlYzsKKworICBTcGF0aWFsRGVjRGVjb2RlSGVscGVySW5mbyhwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCBVUE1JWFRZUEVfTk9STUFMKTsKKworYmFpbDoKKyAgaWYgKHNhY0hlYWRlckxlbiA+IDApIHsKKyAgICAvKiBJZiB0aGUgY29uZmlnIGlzIG9mIGtub3duIGxlbmd0aCB0aGVuIGFzc3VyZSB0aGF0IHRoZQorICAgICAgIGJpdGJ1ZmZlciBpcyBleGFjdGx5IGF0IGl0cyBlbmQgd2hlbiBsZWF2aW5nIHRoZSBmdW5jdGlvbi4gKi8KKyAgICBGREtwdXNoQmlEaXJlY3Rpb25hbCgKKyAgICAgICAgYml0c3RyZWFtLAorICAgICAgICAoc2FjSGVhZGVyTGVuICogOCkgLSAoY2ZnU3RhcnRQb3MgLSAoSU5UKUZES2dldFZhbGlkQml0cyhiaXRzdHJlYW0pKSk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitpbnQgU3BhdGlhbERlY0RlZmF1bHRTcGVjaWZpY0NvbmZpZygKKyAgICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNwYXRpYWxTcGVjaWZpY0NvbmZpZywKKyAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsIGludCBzYW1wbGluZ0ZyZXEsIGludCBuVGltZVNsb3RzLAorICAgIGludCBzYWNEZWNvZGVyTGV2ZWwsIGludCBpc0JsaW5kLCBpbnQgbnVtQ29yZUNoYW5uZWxzKQorCit7CisgIGludCBlcnIgPSBNUFNfT0s7CisgIGludCBpOworCisgIEZES19BU1NFUlQoY29yZUNvZGVjICE9IEFPVF9OT05FKTsKKyAgRkRLX0FTU0VSVChuVGltZVNsb3RzID4gMCk7CisgIEZES19BU1NFUlQoc2FtcGxpbmdGcmVxID4gMCk7CisKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+Y29yZUNvZGVjID0gY29yZUNvZGVjOworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5zYW1wbGluZ0ZyZXEgPSBzYW1wbGluZ0ZyZXE7CisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UaW1lU2xvdHMgPSBuVGltZVNsb3RzOworICBpZiAoKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0VMRCkgfHwKKyAgICAgIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5jb3JlQ29kZWMgPT0gQU9UX0VSX0FBQ19MRCkpCisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+ZnJlcVJlcyA9IFNQQVRJQUxERUNfRlJFUV9SRVNfMjM7CisgIGVsc2UKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5mcmVxUmVzID0gU1BBVElBTERFQ19GUkVRX1JFU18yODsKKworICB7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZyA9CisgICAgICAgIFNQQVRJQUxERUNfTU9ERV9SU1ZENzsgLyogMjEyICBjb25maWd1cmF0aW9uICovCisgIH0KKworICB7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk90dEJveGVzID0KKyAgICAgICAgdHJlZVByb3BlcnR5VGFibGVbcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZ10ubnVtT3R0Qm94ZXM7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bklucHV0Q2hhbm5lbHMgPQorICAgICAgICB0cmVlUHJvcGVydHlUYWJsZVtwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnXS5udW1JbnB1dENoYW5uZWxzOworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5PdXRwdXRDaGFubmVscyA9CisgICAgICAgIHRyZWVQcm9wZXJ0eVRhYmxlW3BTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWddLm51bU91dHB1dENoYW5uZWxzOworICB9CisKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+cXVhbnRNb2RlID0gU1BBVElBTERFQ19RVUFOVF9GSU5FX0RFRjsKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YkFyYml0cmFyeURvd25taXggPSAwOworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5iUmVzaWR1YWxDb2RpbmcgPSAwOworICBpZiAoKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0VMRCkgfHwKKyAgICAgIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5jb3JlQ29kZWMgPT0gQU9UX0VSX0FBQ19MRCkpCisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNGaXhlZEdhaW5ETVggPSBTUEFUSUFMREVDX0dBSU5fUlNWRDI7CisgIGVsc2UKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0ZpeGVkR2FpbkRNWCA9IFNQQVRJQUxERUNfR0FJTl9NT0RFMDsKKworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50ZW1wU2hhcGVDb25maWcgPSBTUEFUSUFMREVDX1RTX1RQTk9XSElURTsKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+ZGVjb3JyQ29uZmlnID0gU1BBVElBTERFQ19ERUNPUlJfTU9ERTA7CisKKyAgZm9yIChpID0gMDsgaSA8IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5PdHRCb3hlczsgaSsrKSB7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+T3R0Q29uZmlnW2ldLm5PdHRCYW5kcyA9IDA7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogY29hcnNlMmZpbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKyAgIFBhcmFtZXRlciBpbmRleCBtYXBwaW5nIGZyb20gY29hcnNlIHRvIGZpbmUgcXVhbnRpemF0aW9uCisKKyBBcmd1bWVudHM6CisKK0lucHV0OgorCitPdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjb2Fyc2UyZmluZShTQ0hBUiAqZGF0YSwgREFUQV9UWVBFIGRhdGFUeXBlLCBpbnQgc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUJhbmRzKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IHN0YXJ0QmFuZDsgaSA8IHN0YXJ0QmFuZCArIG51bUJhbmRzOyBpKyspIHsKKyAgICBkYXRhW2ldIDw8PSAxOworICB9CisKKyAgaWYgKGRhdGFUeXBlID09IHRfQ0xEKSB7CisgICAgZm9yIChpID0gc3RhcnRCYW5kOyBpIDwgc3RhcnRCYW5kICsgbnVtQmFuZHM7IGkrKykgeworICAgICAgaWYgKGRhdGFbaV0gPT0gLTE0KQorICAgICAgICBkYXRhW2ldID0gLTE1OworICAgICAgZWxzZSBpZiAoZGF0YVtpXSA9PSAxNCkKKyAgICAgICAgZGF0YVtpXSA9IDE1OworICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogZmluZTJjb2Fyc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKyAgIFBhcmFtZXRlciBpbmRleCBtYXBwaW5nIGZyb20gZmluZSB0byBjb2Fyc2UgcXVhbnRpemF0aW9uCisKKyBBcmd1bWVudHM6CisKK0lucHV0OgorCitPdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBmaW5lMmNvYXJzZShTQ0hBUiAqZGF0YSwgREFUQV9UWVBFIGRhdGFUeXBlLCBpbnQgc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUJhbmRzKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IHN0YXJ0QmFuZDsgaSA8IHN0YXJ0QmFuZCArIG51bUJhbmRzOyBpKyspIHsKKyAgICAvKiBOb3RlOiB0aGUgaWYgY2FzZXMgYmVsb3cgYWN0dWFsbHkgbWFrZSBhIGRpZmZlcmVuY2UgKG5lZ2F0aXZlIHZhbHVlcykgKi8KKyAgICBpZiAoZGF0YVR5cGUgPT0gdF9DTEQpCisgICAgICBkYXRhW2ldIC89IDI7CisgICAgZWxzZQorICAgICAgZGF0YVtpXSA+Pj0gMTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogZ2V0U3RyaWRlTWFwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisgICBJbmRleCBNYXBwaW5nIGFjY3JvZGluZyB0byBwYlN0cmlkZXMKKworIEFyZ3VtZW50czoKKworSW5wdXQ6CisKK091dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZ2V0U3RyaWRlTWFwKGludCBmcmVxUmVzU3RyaWRlLCBpbnQgc3RhcnRCYW5kLCBpbnQgc3RvcEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFTdHJpZGVzKSB7CisgIGludCBpLCBwYiwgcGJTdHJpZGUsIGRhdGFCYW5kcywgc3RyT2Zmc2V0OworCisgIHBiU3RyaWRlID0gcGJTdHJpZGVUYWJsZVtmcmVxUmVzU3RyaWRlXTsKKyAgZGF0YUJhbmRzID0gKHN0b3BCYW5kIC0gc3RhcnRCYW5kIC0gMSkgLyBwYlN0cmlkZSArIDE7CisKKyAgYVN0cmlkZXNbMF0gPSBzdGFydEJhbmQ7CisgIGZvciAocGIgPSAxOyBwYiA8PSBkYXRhQmFuZHM7IHBiKyspIHsKKyAgICBhU3RyaWRlc1twYl0gPSBhU3RyaWRlc1twYiAtIDFdICsgcGJTdHJpZGU7CisgIH0KKyAgc3RyT2Zmc2V0ID0gMDsKKyAgd2hpbGUgKGFTdHJpZGVzW2RhdGFCYW5kc10gPiBzdG9wQmFuZCkgeworICAgIGlmIChzdHJPZmZzZXQgPCBkYXRhQmFuZHMpIHN0ck9mZnNldCsrOworICAgIGZvciAoaSA9IHN0ck9mZnNldDsgaSA8PSBkYXRhQmFuZHM7IGkrKykgeworICAgICAgYVN0cmlkZXNbaV0tLTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZGF0YUJhbmRzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogZWNEYXRhRGVjCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisgICBEbyBkZWx0YSBkZWNvZGluZyBhbmQgZGVxdWFudGl6YXRpb24KKworIEFyZ3VtZW50czoKKworSW5wdXQ6CisKK091dHB1dDoKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgU0FDREVDX0VSUk9SIGVjRGF0YURlYygKKyAgICBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwgVUlOVCBzeW50YXhGbGFncywKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0sIExPU1NMRVNTREFUQSAqY29uc3QgbGxEYXRhLAorICAgIFNDSEFSICgqZGF0YSlbTUFYX1BBUkFNRVRFUl9TRVRTXVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwgU0NIQVIgKipsYXN0ZGF0YSwKKyAgICBpbnQgZGF0YXR5cGUsIGludCBib3hJZHgsIGludCBzdGFydEJhbmQsIGludCBzdG9wQmFuZCwgU0NIQVIgZGVmYXVsdFZhbHVlKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIGludCBpLCBqLCBwYiwgZGF0YVNldHMsIHNldElkeCwgYnNEYXRhUGFpciwgZGF0YUJhbmRzLCBvbGRRdWFudENvYXJzZVhYWDsKKyAgSU5UIGFTdHJpZGVzW01BWF9QQVJBTUVURVJfQkFORFMgKyAxXSA9IHswfTsKKworICBkYXRhU2V0cyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0czsgaSsrKSB7CisgICAgbGxEYXRhLT5ic1hYWERhdGFNb2RlW2ldID0gKFNDSEFSKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMik7CisKKyAgICBpZiAoKGZyYW1lLT5ic0luZGVwZW5kZW5jeUZsYWcgPT0gMSkgJiYgKGkgPT0gMCkgJiYKKyAgICAgICAgKGxsRGF0YS0+YnNYWFhEYXRhTW9kZVtpXSA9PSAxIHx8CisgICAgICAgICBsbERhdGEtPmJzWFhYRGF0YU1vZGVbaV0gPT0gMikpIHsgLyogVGhpcyBjaGVjayBjYXRjaGVzIGJpdHN0cmVhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgYnkgb2xkZXIgZW5jb2RlciB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgdHJvdWJsZSAqLworICAgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKChpID49IGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzIC0gMSkgJiYKKyAgICAgICAgKGxsRGF0YS0+YnNYWFhEYXRhTW9kZVtpXSA9PQorICAgICAgICAgMikpIHsgLyogVGhlIGludGVycG9sYXRpb24gbW9kZSBtdXN0IG5vdCBiZSBhY3RpdmUgZm9yIHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgc2V0ICovCisgICAgICByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOworICAgIH0KKworICAgIGlmIChsbERhdGEtPmJzWFhYRGF0YU1vZGVbaV0gPT0gMykgeworICAgICAgZGF0YVNldHMrKzsKKyAgICB9CisgIH0KKworICBzZXRJZHggPSAwOworICBic0RhdGFQYWlyID0gMDsKKyAgb2xkUXVhbnRDb2Fyc2VYWFggPSBsbERhdGEtPnN0YXRlLT5ic1F1YW50Q29hcnNlWFhYcHJldlBhcnNlOworCisgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0czsgaSsrKSB7CisgICAgaWYgKGxsRGF0YS0+YnNYWFhEYXRhTW9kZVtpXSA9PSAwKSB7CisgICAgICBmb3IgKHBiID0gc3RhcnRCYW5kOyBwYiA8IHN0b3BCYW5kOyBwYisrKSB7CisgICAgICAgIGxhc3RkYXRhW2JveElkeF1bcGJdID0gZGVmYXVsdFZhbHVlOworICAgICAgfQorCisgICAgICBvbGRRdWFudENvYXJzZVhYWCA9IDA7CisgICAgfQorCisgICAgaWYgKGxsRGF0YS0+YnNYWFhEYXRhTW9kZVtpXSA9PSAzKSB7CisgICAgICBpZiAoYnNEYXRhUGFpcikgeworICAgICAgICBic0RhdGFQYWlyID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJzRGF0YVBhaXIgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICAgICAgICBsbERhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbc2V0SWR4XSA9IChVQ0hBUilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICAgICAgICBsbERhdGEtPmJzRnJlcVJlc1N0cmlkZVhYWFtzZXRJZHhdID0gKFVDSEFSKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMik7CisKKyAgICAgICAgaWYgKGxsRGF0YS0+YnNRdWFudENvYXJzZVhYWFtzZXRJZHhdICE9IG9sZFF1YW50Q29hcnNlWFhYKSB7CisgICAgICAgICAgaWYgKG9sZFF1YW50Q29hcnNlWFhYKSB7CisgICAgICAgICAgICBjb2Fyc2UyZmluZShsYXN0ZGF0YVtib3hJZHhdLCAoREFUQV9UWVBFKWRhdGF0eXBlLCBzdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wQmFuZCAtIHN0YXJ0QmFuZCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmUyY29hcnNlKGxhc3RkYXRhW2JveElkeF0sIChEQVRBX1RZUEUpZGF0YXR5cGUsIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCYW5kIC0gc3RhcnRCYW5kKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhQmFuZHMgPSBnZXRTdHJpZGVNYXAobGxEYXRhLT5ic0ZyZXFSZXNTdHJpZGVYWFhbc2V0SWR4XSwgc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEJhbmQsIGFTdHJpZGVzKTsKKworICAgICAgICBmb3IgKHBiID0gMDsgcGIgPCBkYXRhQmFuZHM7IHBiKyspIHsKKyAgICAgICAgICBsYXN0ZGF0YVtib3hJZHhdW3N0YXJ0QmFuZCArIHBiXSA9IGxhc3RkYXRhW2JveElkeF1bYVN0cmlkZXNbcGJdXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChib3hJZHggPiBNQVhfTlVNX09UVCkgcmV0dXJuIE1QU19JTlZBTElEX0JPWElEWDsKKyAgICAgICAgaWYgKChzZXRJZHggKyBic0RhdGFQYWlyKSA+IE1BWF9QQVJBTUVURVJfU0VUUykKKyAgICAgICAgICByZXR1cm4gTVBTX0lOVkFMSURfU0VUSURYOworCisgICAgICAgIC8qIERFQ09ERVJfVFlQRSBkZWZpbmVkIGluIEZES190b29scyAqLworICAgICAgICBERUNPREVSX1RZUEUgdGhpc19kZWNvZGVyX3R5cGUgPSBTQUNfREVDT0RFUjsKKyAgICAgICAgaWYgKHN5bnRheEZsYWdzICYgKFNBQ0RFQ19TWU5UQVhfVVNBQyB8IFNBQ0RFQ19TWU5UQVhfUlNWRDUwKSkgeworICAgICAgICAgIHRoaXNfZGVjb2Rlcl90eXBlID0gVVNBQ19ERUNPREVSOworICAgICAgICB9IGVsc2UgaWYgKHN5bnRheEZsYWdzICYgU0FDREVDX1NZTlRBWF9MRCkgeworICAgICAgICAgIHRoaXNfZGVjb2Rlcl90eXBlID0gU0FPQ19ERUNPREVSOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gKFNBQ0RFQ19FUlJPUilFY0RhdGFQYWlyRGVjKAorICAgICAgICAgICAgdGhpc19kZWNvZGVyX3R5cGUsIGJpdHN0cmVhbSwgZGF0YVtib3hJZHhdW3NldElkeCArIDBdLAorICAgICAgICAgICAgZGF0YVtib3hJZHhdW3NldElkeCArIDFdLCBsYXN0ZGF0YVtib3hJZHhdLCAoREFUQV9UWVBFKWRhdGF0eXBlLAorICAgICAgICAgICAgc3RhcnRCYW5kLCBkYXRhQmFuZHMsIGJzRGF0YVBhaXIsIGxsRGF0YS0+YnNRdWFudENvYXJzZVhYWFtzZXRJZHhdLAorICAgICAgICAgICAgIShmcmFtZS0+YnNJbmRlcGVuZGVuY3lGbGFnICYmIChpID09IDApKSB8fCAoc2V0SWR4ID4gMCkpOworICAgICAgICBpZiAoZXJyICE9IE1QU19PSykgZ290byBiYWlsOworCisgICAgICAgIGlmIChkYXRhdHlwZSA9PSB0X0lQRCkgeworICAgICAgICAgIGNvbnN0IFNDSEFSIG1hc2sgPSAobGxEYXRhLT5ic1F1YW50Q29hcnNlWFhYW3NldElkeF0pID8gNyA6IDE1OworICAgICAgICAgIGZvciAocGIgPSAwOyBwYiA8IGRhdGFCYW5kczsgcGIrKykgeworICAgICAgICAgICAgZm9yIChqID0gYVN0cmlkZXNbcGJdOyBqIDwgYVN0cmlkZXNbcGIgKyAxXTsgaisrKSB7CisgICAgICAgICAgICAgIGxhc3RkYXRhW2JveElkeF1bal0gPQorICAgICAgICAgICAgICAgICAgZGF0YVtib3hJZHhdW3NldElkeCArIGJzRGF0YVBhaXJdW3N0YXJ0QmFuZCArIHBiXSAmIG1hc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAocGIgPSAwOyBwYiA8IGRhdGFCYW5kczsgcGIrKykgeworICAgICAgICAgICAgZm9yIChqID0gYVN0cmlkZXNbcGJdOyBqIDwgYVN0cmlkZXNbcGIgKyAxXTsgaisrKSB7CisgICAgICAgICAgICAgIGxhc3RkYXRhW2JveElkeF1bal0gPQorICAgICAgICAgICAgICAgICAgZGF0YVtib3hJZHhdW3NldElkeCArIGJzRGF0YVBhaXJdW3N0YXJ0QmFuZCArIHBiXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvbGRRdWFudENvYXJzZVhYWCA9IGxsRGF0YS0+YnNRdWFudENvYXJzZVhYWFtzZXRJZHhdOworCisgICAgICAgIGlmIChic0RhdGFQYWlyKSB7CisgICAgICAgICAgbGxEYXRhLT5ic1F1YW50Q29hcnNlWFhYW3NldElkeCArIDFdID0KKyAgICAgICAgICAgICAgbGxEYXRhLT5ic1F1YW50Q29hcnNlWFhYW3NldElkeF07CisgICAgICAgICAgbGxEYXRhLT5ic0ZyZXFSZXNTdHJpZGVYWFhbc2V0SWR4ICsgMV0gPQorICAgICAgICAgICAgICBsbERhdGEtPmJzRnJlcVJlc1N0cmlkZVhYWFtzZXRJZHhdOworICAgICAgICB9CisgICAgICAgIHNldElkeCArPSBic0RhdGFQYWlyICsgMTsKKyAgICAgIH0gLyogIWJzRGF0YVBhaXIgKi8KKyAgICB9ICAgLyogbGxEYXRhLT5ic1hYWERhdGFNb2RlW2ldID09IDMgKi8KKyAgfQorCisgIGxsRGF0YS0+c3RhdGUtPmJzUXVhbnRDb2Fyc2VYWFhwcmV2UGFyc2UgPSBvbGRRdWFudENvYXJzZVhYWDsKKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IHBhcnNlQXJiaXRyYXJ5RG93bm1peERhdGEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIFJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBTQUNERUNfRVJST1IgcGFyc2VBcmJpdHJhcnlEb3dubWl4RGF0YSgKKyAgICBzcGF0aWFsRGVjICpzZWxmLCBjb25zdCBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNTQywKKyAgICBjb25zdCBVSU5UIHN5bnRheEZsYWdzLCBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0pIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgaW50IGNoOworICBpbnQgb2Zmc2V0ID0gcFNTQy0+bk90dEJveGVzOworCisgIC8qIENMRCAoYXJiaXRyYXJ5IGRvd24tbWl4IGdhaW5zKSAqLworICBmb3IgKGNoID0gMDsgY2ggPCBwU1NDLT5uSW5wdXRDaGFubmVsczsgY2grKykgeworICAgIGVyciA9IGVjRGF0YURlYyhmcmFtZSwgc3ludGF4RmxhZ3MsIGJpdHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgJmZyYW1lLT5DTERMb3NzbGVzc0RhdGFbb2Zmc2V0ICsgY2hdLAorICAgICAgICAgICAgICAgICAgICBmcmFtZS0+Y21wQXJiZG14R2FpbklkeCwgc2VsZi0+Y21wQXJiZG14R2FpbklkeFByZXYsIHRfQ0xELAorICAgICAgICAgICAgICAgICAgICBjaCwgMCwgcFNTQy0+ZnJlcVJlcywgYXJiZG14R2FpbkRlZmF1bHQpOworICAgIGlmIChlcnIgIT0gTVBTX09LKSByZXR1cm4gZXJyOworICB9CisKKyAgcmV0dXJuIGVycjsKKworfSAvKiBwYXJzZUFyYml0cmFyeURvd25taXhEYXRhICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBTcGF0aWFsRGVjUGFyc2VGcmFtZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgSW5wdXQ6CisKKyBPdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgbkJpdHNQYXJhbVNsb3QoaW50IGkpIHsKKyAgaW50IGJpdHNQYXJhbVNsb3Q7CisKKyAgYml0c1BhcmFtU2xvdCA9IGZNYXgoMCwgREZSQUNUX0JJVFMgLSAxIC0gZk5vcm16KChGSVhQX0RCTClpKSk7CisgIGlmICgoMSA8PCBiaXRzUGFyYW1TbG90KSA8IGkpIHsKKyAgICBiaXRzUGFyYW1TbG90Kys7CisgIH0KKyAgRkRLX0FTU0VSVCgoYml0c1BhcmFtU2xvdCA+PSAwKSAmJiAoYml0c1BhcmFtU2xvdCA8PSAzMikpOworCisgIHJldHVybiBiaXRzUGFyYW1TbG90OworfQorCitTQUNERUNfRVJST1IgU3BhdGlhbERlY1BhcnNlRnJhbWVEYXRhKAorICAgIHNwYXRpYWxEZWNfc3RydWN0ICpzZWxmLCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0sCisgICAgY29uc3QgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTcGF0aWFsU3BlY2lmaWNDb25maWcsIFVQTUlYVFlQRSB1cG1peFR5cGUsCisgICAgaW50IGZHbG9iYWxJbmRlcGVuZGVuY3lGbGFnKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIGludCBic0ZyYW1pbmdUeXBlLCBkYXRhQmFuZHMsIHBzLCBwZywgaTsKKyAgaW50IHBiOworICBpbnQgbnVtVGVtcFNoYXBlQ2hhbiA9IDA7CisgIGludCBic051bU91dHB1dENoYW5uZWxzID0KKyAgICAgIHRyZWVQcm9wZXJ0eVRhYmxlW3BTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWddCisgICAgICAgICAgLm51bU91dHB1dENoYW5uZWxzOyAvKiBDQVVUSU9OOiBNYXliZSBkaWZmZXJlbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWcgaW4gc29tZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXMhICovCisgIGludCBwYXJhbVNldEVyciA9IDA7CisgIFVJTlQgYWxpZ25BbmNob3IgPSBGREtnZXRWYWxpZEJpdHMoCisgICAgICBiaXRzdHJlYW0pOyAvKiBBbmNob3IgZm9yIEJ5dGVBbGlnbigpIGZ1bmN0aW9uLiBTZWUgY29tbWVudCBiZWxvdy4gKi8KKyAgVUlOVCBzeW50YXhGbGFnczsKKworICBzeW50YXhGbGFncyA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnN5bnRheEZsYWdzOworCisgIGlmICgoc3ludGF4RmxhZ3MgJiAoU0FDREVDX1NZTlRBWF9VU0FDIHwgU0FDREVDX1NZTlRBWF9SU1ZENTApKSAmJgorICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNIaWdoUmF0ZU1vZGUgPT0gMCkgeworICAgIGJzRnJhbWluZ1R5cGUgPSAwOyAvKiBmaXhlZCBmcmFtaW5nICovCisgICAgZnJhbWUtPm51bVBhcmFtZXRlclNldHMgPSAxOworICB9IGVsc2UgeworICAgIGJzRnJhbWluZ1R5cGUgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICAgIGlmIChzeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfTEQpCisgICAgICBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSkgKyAxOworICAgIGVsc2UKKyAgICAgIGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAzKSArIDE7CisgIH0KKworICAvKiBBbnkgZXJyb3IgYWZ0ZXIgdGhpcyBsaW5lIHNoYWxsIHRyaWdnZXIgcGFyYW1ldGVyIGludmFsaWRhdGlvbiBhdCBiYWlsCisgICAqIGxhYmVsLiAqLworICBwYXJhbVNldEVyciA9IDE7CisKKyAgaWYgKGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzID49IE1BWF9QQVJBTUVURVJfU0VUUykgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIEJhc2ljIGNvbmZpZyBjaGVjay4gKi8KKyAgaWYgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5JbnB1dENoYW5uZWxzIDw9IDAgfHwKKyAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5PdXRwdXRDaGFubmVscyA8PSAwKSB7CisgICAgZXJyID0gTVBTX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoYnNGcmFtaW5nVHlwZSkgeworICAgIGludCBwcmV2UGFyYW1TbG90ID0gLTE7CisgICAgaW50IGJpdHNQYXJhbVNsb3Q7CisKKyAgICB7CisgICAgICBiaXRzUGFyYW1TbG90ID0gbkJpdHNQYXJhbVNsb3QocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+blRpbWVTbG90cyk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0czsgaSsrKSB7CisgICAgICAgIGZyYW1lLT5wYXJhbVNsb3RbaV0gPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIGJpdHNQYXJhbVNsb3QpOworICAgICAgICAvKiBTYW5pdHkgY2hlY2sgKi8KKyAgICAgICAgaWYgKChmcmFtZS0+cGFyYW1TbG90W2ldIDw9IHByZXZQYXJhbVNsb3QpIHx8CisgICAgICAgICAgICAoZnJhbWUtPnBhcmFtU2xvdFtpXSA+PSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uVGltZVNsb3RzKSkgeworICAgICAgICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgICAgcHJldlBhcmFtU2xvdCA9IGZyYW1lLT5wYXJhbVNsb3RbaV07CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0czsgaSsrKSB7CisgICAgICBmcmFtZS0+cGFyYW1TbG90W2ldID0gKChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uVGltZVNsb3RzICogKGkgKyAxKSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cykgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgfQorICB9CisKKyAgaWYgKChzeW50YXhGbGFncyAmIChTQUNERUNfU1lOVEFYX1VTQUMgfCBTQUNERUNfU1lOVEFYX1JTVkQ1MCkpICYmCisgICAgICBmR2xvYmFsSW5kZXBlbmRlbmN5RmxhZykgeworICAgIGZyYW1lLT5ic0luZGVwZW5kZW5jeUZsYWcgPSAxOworICB9IGVsc2UgeworICAgIGZyYW1lLT5ic0luZGVwZW5kZW5jeUZsYWcgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKTsKKyAgfQorCisgIC8qCisgICAqIE90dERhdGEoKQorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5PdHRCb3hlczsgaSsrKSB7CisgICAgZXJyID0gZWNEYXRhRGVjKGZyYW1lLCBzeW50YXhGbGFncywgYml0c3RyZWFtLCAmZnJhbWUtPkNMRExvc3NsZXNzRGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmNtcE90dENMRGlkeCwgc2VsZi0+Y21wT3R0Q0xEaWR4UHJldiwgdF9DTEQsIGksIDAsCisgICAgICAgICAgICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJpdHN0cmVhbU90dEJhbmRzW2ldLAorICAgICAgICAgICAgICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5vdHRDTERkZWZhdWx0W2ldKTsKKyAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfSAvKiBpIDwgbnVtT3R0Qm94ZXMgKi8KKworICB7CisgICAgZm9yIChpID0gMDsgaSA8IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5PdHRCb3hlczsgaSsrKSB7CisgICAgICBlcnIgPSBlY0RhdGFEZWMoZnJhbWUsIHN5bnRheEZsYWdzLCBiaXRzdHJlYW0sICZmcmFtZS0+SUNDTG9zc2xlc3NEYXRhW2ldLAorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5jbXBPdHRJQ0NpZHgsIHNlbGYtPmNtcE90dElDQ2lkeFByZXYsIHRfSUNDLCBpLCAwLAorICAgICAgICAgICAgICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJpdHN0cmVhbU90dEJhbmRzW2ldLCBJQ0NkZWZhdWx0KTsKKyAgICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9IC8qIGkgPCBudW1PdHRCb3hlcyAqLworICB9ICAgLyogIW9uZUlDQyAqLworCisgIGlmICgocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZyA9PSBTUEFUSUFMREVDX01PREVfUlNWRDcpICYmCisgICAgICAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNQaGFzZUNvZGluZykpIHsKKyAgICBmcmFtZS0+cGhhc2VNb2RlID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKTsKKworICAgIGlmIChmcmFtZS0+cGhhc2VNb2RlID09IDApIHsKKyAgICAgIGZvciAocGIgPSAwOyBwYiA8IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm51bU90dEJhbmRzSVBEOyBwYisrKSB7CisgICAgICAgIHNlbGYtPmNtcE90dElQRGlkeFByZXZbMF1bcGJdID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzOyBpKyspIHsKKyAgICAgICAgICBmcmFtZS0+Y21wT3R0SVBEaWR4WzBdW2ldW3BiXSA9IDA7CisgICAgICAgICAgLy8gZnJhbWUtPm90dElQRGlkeFswXVtpXVtwYl0gPSAwOworICAgICAgICB9CisgICAgICAgIC8qIHNlbGYtPm90dElQRGlkeFByZXZbMF1bcGJdID0gMDsgKi8KKyAgICAgIH0KKyAgICAgIGZyYW1lLT5PcGRTbW9vdGhpbmdNb2RlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgZnJhbWUtPk9wZFNtb290aGluZ01vZGUgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICAgICAgZXJyID0gZWNEYXRhRGVjKGZyYW1lLCBzeW50YXhGbGFncywgYml0c3RyZWFtLCAmZnJhbWUtPklQRExvc3NsZXNzRGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+Y21wT3R0SVBEaWR4LCBzZWxmLT5jbXBPdHRJUERpZHhQcmV2LCB0X0lQRCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5udW1PdHRCYW5kc0lQRCwgSVBEZGVmYXVsdCk7CisgICAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogU21nRGF0YSgpCisgICAqLworCisgIHsKKyAgICBpZiAoIXBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzSGlnaFJhdGVNb2RlICYmCisgICAgICAgIChzeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfVVNBQykpIHsKKyAgICAgIGZvciAocHMgPSAwOyBwcyA8IGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzOyBwcysrKSB7CisgICAgICAgIGZyYW1lLT5ic1Ntb290aE1vZGVbcHNdID0gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChwcyA9IDA7IHBzIDwgZnJhbWUtPm51bVBhcmFtZXRlclNldHM7IHBzKyspIHsKKyAgICAgICAgZnJhbWUtPmJzU21vb3RoTW9kZVtwc10gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAyKTsKKyAgICAgICAgaWYgKGZyYW1lLT5ic1Ntb290aE1vZGVbcHNdID49IDIpIHsKKyAgICAgICAgICBmcmFtZS0+YnNTbW9vdGhUaW1lW3BzXSA9IChVQ0hBUilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDIpOworICAgICAgICB9CisgICAgICAgIGlmIChmcmFtZS0+YnNTbW9vdGhNb2RlW3BzXSA9PSAzKSB7CisgICAgICAgICAgZnJhbWUtPmJzRnJlcVJlc1N0cmlkZVNtZ1twc10gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAyKTsKKyAgICAgICAgICBkYXRhQmFuZHMgPSAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+ZnJlcVJlcyAtIDEpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGJTdHJpZGVUYWJsZVtmcmFtZS0+YnNGcmVxUmVzU3RyaWRlU21nW3BzXV0gKworICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgZm9yIChwZyA9IDA7IHBnIDwgZGF0YUJhbmRzOyBwZysrKSB7CisgICAgICAgICAgICBmcmFtZS0+YnNTbWdEYXRhW3BzXVtwZ10gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gLyogcHMgPCBudW1QYXJhbWV0ZXJTZXRzICovCisgICAgfQorICB9CisKKyAgLyoKKyAgICogVGVtcFNoYXBlRGF0YSgpCisgICAqLworICBpZiAoKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRlbXBTaGFwZUNvbmZpZyA9PSAzKSAmJgorICAgICAgKHN5bnRheEZsYWdzICYgU0FDREVDX1NZTlRBWF9VU0FDKSkgeworICAgIGludCBUc2RFcnI7CisgICAgVHNkRXJyID0gVHNkUmVhZChiaXRzdHJlYW0sIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UaW1lU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAmZnJhbWUtPlRzZERhdGFbMF0pOworICAgIGlmIChUc2RFcnIpIHsKKyAgICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZnJhbWUtPlRzZERhdGFbMF0uYnNUc2RFbmFibGUgPSAwOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGJzTnVtT3V0cHV0Q2hhbm5lbHM7IGkrKykgeworICAgIGZyYW1lLT50ZW1wU2hhcGVFbmFibGVDaGFubmVsU1RQW2ldID0gMDsKKyAgICBmcmFtZS0+dGVtcFNoYXBlRW5hYmxlQ2hhbm5lbEdFU1tpXSA9IDA7CisgIH0KKworICBpZiAoKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRlbXBTaGFwZUNvbmZpZyA9PSAxKSB8fAorICAgICAgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRlbXBTaGFwZUNvbmZpZyA9PSAyKSkgeworICAgIGludCBic1RlbXBTaGFwZUVuYWJsZSA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisgICAgaWYgKGJzVGVtcFNoYXBlRW5hYmxlKSB7CisgICAgICBudW1UZW1wU2hhcGVDaGFuID0KKyAgICAgICAgICB0ZW1wU2hhcGVDaGFuVGFibGVbcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dGVtcFNoYXBlQ29uZmlnIC0gMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZ107CisgICAgICBzd2l0Y2ggKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRlbXBTaGFwZUNvbmZpZykgeworICAgICAgICBjYXNlIDE6IC8qIFNUUCAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1UZW1wU2hhcGVDaGFuOyBpKyspIHsKKyAgICAgICAgICAgIGludCBzdHBFbmFibGUgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICAgICAgICAgICAgZnJhbWUtPnRlbXBTaGFwZUVuYWJsZUNoYW5uZWxTVFBbaV0gPSBzdHBFbmFibGU7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IC8qIEdFUyAqLworICAgICAgICB7CisgICAgICAgICAgVUNIQVIgZ2VzQ2hhbm5lbEVuYWJsZVtNQVhfT1VUUFVUX0NIQU5ORUxTXTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1UZW1wU2hhcGVDaGFuOyBpKyspIHsKKyAgICAgICAgICAgIGdlc0NoYW5uZWxFbmFibGVbaV0gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKTsKKyAgICAgICAgICAgIGZyYW1lLT50ZW1wU2hhcGVFbmFibGVDaGFubmVsR0VTW2ldID0gZ2VzQ2hhbm5lbEVuYWJsZVtpXTsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRlbXBTaGFwZUNoYW47IGkrKykgeworICAgICAgICAgICAgaWYgKGdlc0NoYW5uZWxFbmFibGVbaV0pIHsKKyAgICAgICAgICAgICAgaW50IGVudlNoYXBlRGF0YV90bXBbTUFYX1RJTUVfU0xPVFNdOworICAgICAgICAgICAgICBpZiAoaHVmZl9kZWNfcmVzaGFwZShiaXRzdHJlYW0sIGVudlNoYXBlRGF0YV90bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UaW1lU2xvdHMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGZvciAoaW50IHRzID0gMDsgdHMgPCBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uVGltZVNsb3RzOyB0cysrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoZW52U2hhcGVEYXRhX3RtcFt0c10gPj0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGVudlNoYXBlRGF0YV90bXBbdHNdIDw9IDQpKSB7CisgICAgICAgICAgICAgICAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYW1lLT5ic0VudlNoYXBlRGF0YVtpXVt0c10gPSAoVUNIQVIpZW52U2hhcGVEYXRhX3RtcFt0c107CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfVEVNUFNIQVBFOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9IC8qIGJzVGVtcFNoYXBlRW5hYmxlICovCisgIH0gICAvKiBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50ZW1wU2hhcGVDb25maWcgIT0gMCAqLworCisgIGlmIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5iQXJiaXRyYXJ5RG93bm1peCAhPSAwKSB7CisgICAgZXJyID0gcGFyc2VBcmJpdHJhcnlEb3dubWl4RGF0YShzZWxmLCBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLCBiaXRzdHJlYW0pOworICAgIGlmIChlcnIgIT0gTVBTX09LKSBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoMSAmJiAoIShzeW50YXhGbGFncyAmIChTQUNERUNfU1lOVEFYX1VTQUMpKSkpIHsKKyAgICBGREtieXRlQWxpZ24oYml0c3RyZWFtLAorICAgICAgICAgICAgICAgICBhbGlnbkFuY2hvcik7IC8qIElTTy9JRUMgRkRJUyAyMzAwMy0xOiA1LjIuIC4uLiBieXRlIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzeW50YWN0aWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGluIHdoaWNoIEJ5dGVBbGlnbigpIG9jY3Vycy4gKi8KKyAgfQorCitiYWlsOgorICBpZiAoZXJyICE9IE1QU19PSyAmJiBwYXJhbVNldEVyciAhPSAwKSB7CisgICAgLyogU2luY2UgdGhlIHBhcmFtZXRlciBzZXQgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGluc3RhbmNlIHdlCisgICAgICogbmVlZCB0byAuLi4gKi8KKyAgICBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyA9IDA7IC8qIC4uLiBzaWduYWwgdGhhdCBpdCBpcyBjb3JydXB0IC4uLiAqLworICB9CisKKyAgcmV0dXJuIGVycjsKKworfSAvKiBTcGF0aWFsRGVjUGFyc2VGcmFtZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogY3JlYXRlTWFwcGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY3JlYXRlTWFwcGluZyhpbnQgYU1hcFtNQVhfUEFSQU1FVEVSX0JBTkRTICsgMV0sIGludCBzdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9wQmFuZCwgaW50IHN0cmlkZSkgeworICBpbnQgaW5CYW5kcywgb3V0QmFuZHMsIGJhbmRzQWNoaXZlZCwgYmFuZHNEaWZmLCBpbmNyLCBrLCBpOworICBpbnQgdkRrW01BWF9QQVJBTUVURVJfQkFORFMgKyAxXTsKKyAgaW5CYW5kcyA9IHN0b3BCYW5kIC0gc3RhcnRCYW5kOworICBvdXRCYW5kcyA9IChpbkJhbmRzIC0gMSkgLyBzdHJpZGUgKyAxOworCisgIGlmIChvdXRCYW5kcyA8IDEpIHsKKyAgICBvdXRCYW5kcyA9IDE7CisgIH0KKworICBiYW5kc0FjaGl2ZWQgPSBvdXRCYW5kcyAqIHN0cmlkZTsKKyAgYmFuZHNEaWZmID0gaW5CYW5kcyAtIGJhbmRzQWNoaXZlZDsKKyAgZm9yIChpID0gMDsgaSA8IG91dEJhbmRzOyBpKyspIHsKKyAgICB2RGtbaV0gPSBzdHJpZGU7CisgIH0KKworICBpZiAoYmFuZHNEaWZmID4gMCkgeworICAgIGluY3IgPSAtMTsKKyAgICBrID0gb3V0QmFuZHMgLSAxOworICB9IGVsc2UgeworICAgIGluY3IgPSAxOworICAgIGsgPSAwOworICB9CisKKyAgd2hpbGUgKGJhbmRzRGlmZiAhPSAwKSB7CisgICAgdkRrW2tdID0gdkRrW2tdIC0gaW5jcjsKKyAgICBrID0gayArIGluY3I7CisgICAgYmFuZHNEaWZmID0gYmFuZHNEaWZmICsgaW5jcjsKKyAgICBpZiAoayA+PSBvdXRCYW5kcykgeworICAgICAgaWYgKGJhbmRzRGlmZiA+IDApIHsKKyAgICAgICAgayA9IG91dEJhbmRzIC0gMTsKKyAgICAgIH0gZWxzZSBpZiAoYmFuZHNEaWZmIDwgMCkgeworICAgICAgICBrID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgYU1hcFswXSA9IHN0YXJ0QmFuZDsKKyAgZm9yIChpID0gMDsgaSA8IG91dEJhbmRzOyBpKyspIHsKKyAgICBhTWFwW2kgKyAxXSA9IGFNYXBbaV0gKyB2RGtbaV07CisgIH0KK30gLyogY3JlYXRlTWFwcGluZyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogbWFwRnJlcXVlbmN5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBtYXBGcmVxdWVuY3koY29uc3QgU0NIQVIgKnBJbnB1dCwgLyogSW5wdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqcE91dHB1dCwgICAgICAvKiBPdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBNYXAsICAgICAgICAgICAvKiBNYXBwaW5nIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFCYW5kcykgICAgICAgLyogTnVtYmVyIG9mIGRhdGEgQmFuZHMgKi8KK3sKKyAgaW50IGksIGo7CisgIGludCBzdGFydEJhbmQwID0gcE1hcFswXTsKKworICBmb3IgKGkgPSAwOyBpIDwgZGF0YUJhbmRzOyBpKyspIHsKKyAgICBpbnQgc3RhcnRCYW5kLCBzdG9wQmFuZCwgdmFsdWU7CisKKyAgICB2YWx1ZSA9IHBJbnB1dFtpICsgc3RhcnRCYW5kMF07CisKKyAgICBzdGFydEJhbmQgPSBwTWFwW2ldOworICAgIHN0b3BCYW5kID0gcE1hcFtpICsgMV07CisgICAgZm9yIChqID0gc3RhcnRCYW5kOyBqIDwgc3RvcEJhbmQ7IGorKykgeworICAgICAgcE91dHB1dFtqXSA9IHZhbHVlOworICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogZGVxCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGRlcUlkeChpbnQgdmFsdWUsIGludCBwYXJhbVR5cGUpIHsKKyAgaW50IGlkeCA9IC0xOworCisgIHN3aXRjaCAocGFyYW1UeXBlKSB7CisgICAgY2FzZSB0X0NMRDoKKyAgICAgIGlmICgoKHZhbHVlICsgMTUpID49IDApICYmICgodmFsdWUgKyAxNSkgPCAzMSkpIHsKKyAgICAgICAgaWR4ID0gKHZhbHVlICsgMTUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfSUNDOgorICAgICAgaWYgKCh2YWx1ZSA+PSAwKSAmJiAodmFsdWUgPCA4KSkgeworICAgICAgICBpZHggPSB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSB0X0lQRDoKKyAgICAgIC8qICgrLy0pMTUgKiBNQVhfUEFSQU1FVEVSX0JBTkRTIGZvciBkaWZmZXJlbnRpYWwgY29kaW5nIGluIGZyZXF1ZW5jeQorICAgICAgICogZG9tYWluIChhY2NvcmRpbmcgdG8gcmJsKSAqLworICAgICAgaWYgKCh2YWx1ZSA+PSAtNDIwKSAmJiAodmFsdWUgPD0gNDIwKSkgeworICAgICAgICBpZHggPSAodmFsdWUgJiAweGYpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgfQorCisgIHJldHVybiBpZHg7Cit9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZ1bmN0aW9ubmFtZTogZmFjdG9yRnVuY3QKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgRGVzY3JpcHRpb246CisKKyAgIEFyZ3VtZW50czoKKworICAgUmV0dXJuOgorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU0ZfSURYICg3KQorI2RlZmluZSBTRl9GQUNUT1IgKDMpCisjZGVmaW5lIFNDQUxFX0ZBQ1RPUiAoMSA8PCBTRl9GQUNUT1IpCisjZGVmaW5lIFNDQUxFX0NMRF9DMUMyICgxIDw8IFNGX0NMRF9DMUMyKQorCitzdGF0aWMgRklYUF9EQkwgZmFjdG9yRnVuY3QoRklYUF9EQkwgb3R0VnNUb3REYiwgSU5UIHF1YW50TW9kZSkgeworICBGSVhQX0RCTCBmYWN0b3I7CisKKyAgaWYgKG90dFZzVG90RGIgPiBGTDJGWENPTlNUX0RCTCgwLjApKSB7CisgICAgb3R0VnNUb3REYiA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisgIH0KKworICBvdHRWc1RvdERiID0gLW90dFZzVG90RGI7CisKKyAgc3dpdGNoIChxdWFudE1vZGUpIHsKKyAgICBjYXNlIDA6CisgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gU0NBTEVfRkFDVE9SKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGlmIChvdHRWc1RvdERiID49IEZMMkZYQ09OU1RfREJMKDIxLjBmIC8gU0NBTEVfQ0xEX0MxQzIpKQorICAgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX0RCTCg1LjBmIC8gU0NBTEVfRkFDVE9SKTsKKyAgICAgIGVsc2UgaWYgKG90dFZzVG90RGIgPD0gRkwyRlhDT05TVF9EQkwoMS4wZiAvIFNDQUxFX0NMRF9DMUMyKSkKKyAgICAgICAgZmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMS4wZiAvIFNDQUxFX0ZBQ1RPUik7CisgICAgICBlbHNlCisgICAgICAgIGZhY3RvciA9IChmTXVsdChGTDJGWENPTlNUX0RCTCgwLjJmKSwgb3R0VnNUb3REYikgKworICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC44ZiAvIFNDQUxFX0NMRF9DMUMyKSkKKyAgICAgICAgICAgICAgICAgPDwgKFNGX0NMRF9DMUMyIC0gU0ZfRkFDVE9SKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGlmIChvdHRWc1RvdERiID49IEZMMkZYQ09OU1RfREJMKDI1LjBmIC8gU0NBTEVfQ0xEX0MxQzIpKSB7CisgICAgICAgIEZES19BU1NFUlQoU0ZfRkFDVE9SID09IDMpOworICAgICAgICBmYWN0b3IgPSAoRklYUF9EQkwpCisgICAgICAgICAgICBNQVhWQUxfREJMOyAvKiBhdm9pZCB3YXJuaW5nOiBGTDJGWENPTlNUX0RCTCg4LjBmL1NDQUxFX0ZBQ1RPUikgKi8KKyAgICAgIH0gZWxzZSBpZiAob3R0VnNUb3REYiA8PSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gU0NBTEVfQ0xEX0MxQzIpKQorICAgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gU0NBTEVfRkFDVE9SKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZmFjdG9yID0gKGZNdWx0KEZMMkZYQ09OU1RfREJMKDcuMGYgLyAyNC4wZiksIG90dFZzVG90RGIpICsKKyAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKCgxNy4wZiAvIDI0LjBmKSAvIFNDQUxFX0NMRF9DMUMyKSkKKyAgICAgICAgICAgICAgICAgPDwgKFNGX0NMRF9DMUMyIC0gU0ZfRkFDVE9SKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgfQorCisgIHJldHVybiAoZmFjdG9yKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IGZhY3RvckNMRAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZmFjdG9yQ0xEKFNDSEFSICppZHgsIEZJWFBfREJMIG90dFZzVG90RGIsIEZJWFBfREJMICpvdHRWc1RvdERiMSwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqb3R0VnNUb3REYjIsIFNDSEFSIG90dFZzVG90RGJNb2RlLAorICAgICAgICAgICAgICAgICAgICAgIElOVCBxdWFudE1vZGUpIHsKKyAgRklYUF9EQkwgZmFjdG9yOworICBGSVhQX0RCTCBjbGRJZHhGcmFjdDsKKyAgSU5UIGNsZElkeDsKKworICBmYWN0b3IgPSBmYWN0b3JGdW5jdChvdHRWc1RvdERiLCBxdWFudE1vZGUpOworCisgIGNsZElkeEZyYWN0ID0KKyAgICAgIGZNdWx0KChGSVhQX0RCTCkoKCppZHgpIDw8ICgoREZSQUNUX0JJVFMgLSAxKSAtIFNGX0lEWCkpLCBmYWN0b3IpOworICBjbGRJZHhGcmFjdCArPSBGTDJGWENPTlNUX0RCTCgxNS41ZiAvICgxIDw8IChTRl9GQUNUT1IgKyBTRl9JRFgpKSk7CisgIGNsZElkeCA9IGZpeHBfdHJ1bmNhdGVUb0ludChjbGRJZHhGcmFjdCwgU0ZfRkFDVE9SICsgU0ZfSURYKTsKKworICBjbGRJZHggPSBmTWluKGNsZElkeCwgMzApOworICBjbGRJZHggPSBmTWF4KGNsZElkeCwgMCk7CisKKyAgKmlkeCA9IGNsZElkeCAtIDE1OworCisgIGlmIChvdHRWc1RvdERiTW9kZSAmIG90dFZzVG90RGIxQWN0aXYpCisgICAgKCpvdHRWc1RvdERiMSkgPSBvdHRWc1RvdERiICsgZGVxdWFudENMRF9jMVtjbGRJZHhdOworCisgIGlmIChvdHRWc1RvdERiTW9kZSAmIG90dFZzVG90RGIyQWN0aXYpCisgICAgKCpvdHRWc1RvdERiMikgPSBvdHRWc1RvdERiICsgZGVxdWFudENMRF9jMVszMCAtIGNsZElkeF07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBtYXBJbmRleERhdGEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIFJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBTQUNERUNfRVJST1IgbWFwSW5kZXhEYXRhKAorICAgIExPU1NMRVNTREFUQSAqbGxEYXRhLCBTQ0hBUiAqKipvdXRwdXREYXRhSWR4LCBTQ0hBUiAqKipvdXRwdXRJZHhEYXRhLAorICAgIGNvbnN0IFNDSEFSICgqY21wSWR4RGF0YSlbTUFYX1BBUkFNRVRFUl9TRVRTXVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBTQ0hBUiAqKipkaWZmSWR4RGF0YSwgU0NIQVIgeHR0SWR4LCBTQ0hBUiAqKmlkeFByZXYsIGludCBwYXJhbUlkeCwKKyAgICBpbnQgcGFyYW1UeXBlLCBpbnQgc3RhcnRCYW5kLCBpbnQgc3RvcEJhbmQsIFNDSEFSIGRlZmF1bHRWYWx1ZSwKKyAgICBpbnQgbnVtUGFyYW1ldGVyU2V0cywgY29uc3QgaW50ICpwYXJhbVNsb3QsIGludCBleHRlbmRGcmFtZSwgaW50IHF1YW50TW9kZSwKKyAgICBTcGF0aWFsRGVjQ29uY2VhbG1lbnRJbmZvICpjb25jZWFsbWVudEluZm8sIFNDSEFSIG90dFZzVG90RGJNb2RlLAorICAgIEZJWFBfREJMICgqcE90dFZzVG90RGJJbilbTUFYX1BBUkFNRVRFUl9TRVRTXVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCAoKnBPdHRWc1RvdERiMSlbTUFYX1BBUkFNRVRFUl9TRVRTXVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCAoKnBPdHRWc1RvdERiMilbTUFYX1BBUkFNRVRFUl9TRVRTXVtNQVhfUEFSQU1FVEVSX0JBTkRTXSkgeworICBpbnQgYVBhcmFtU2xvdHNbTUFYX1BBUkFNRVRFUl9TRVRTXTsKKyAgaW50IGFJbnRlcnBvbGF0ZVtNQVhfUEFSQU1FVEVSX1NFVFNdOworCisgIGludCBkYXRhU2V0czsKKyAgaW50IGFNYXBbTUFYX1BBUkFNRVRFUl9CQU5EUyArIDFdOworCisgIGludCBzZXRJZHgsIGksIGJhbmQsIHBhcm1TbG90OworICBpbnQgZGF0YUJhbmRzOworICBpbnQgcHMsIHBiOworICBpbnQgaTE7CisKKyAgaWYgKG51bVBhcmFtZXRlclNldHMgPiBNQVhfUEFSQU1FVEVSX1NFVFMpIHJldHVybiBNUFNfV1JPTkdfUEFSQU1FVEVSU0VUUzsKKworICBkYXRhU2V0cyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBudW1QYXJhbWV0ZXJTZXRzOyBpKyspIHsKKyAgICBpZiAobGxEYXRhLT5ic1hYWERhdGFNb2RlW2ldID09IDMpIHsKKyAgICAgIGFQYXJhbVNsb3RzW2RhdGFTZXRzXSA9IGk7CisgICAgICBkYXRhU2V0cysrOworICAgIH0KKyAgfQorCisgIHNldElkeCA9IDA7CisKKyAgLyogTWFpbiBjb25jZWFsbWVudCBzdGFnZSBpcyBoZXJlOiAqLworICBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfQXBwbHkoCisgICAgICBjb25jZWFsbWVudEluZm8sIGNtcElkeERhdGFbeHR0SWR4XSwKKyAgICAgIChkaWZmSWR4RGF0YSAhPSBOVUxMKSA/IGRpZmZJZHhEYXRhW3h0dElkeF0gOiBOVUxMLCBpZHhQcmV2W3h0dElkeF0sCisgICAgICBsbERhdGEtPmJzWFhYRGF0YU1vZGUsIHN0YXJ0QmFuZCwgc3RvcEJhbmQsIGRlZmF1bHRWYWx1ZSwgcGFyYW1UeXBlLAorICAgICAgbnVtUGFyYW1ldGVyU2V0cyk7CisKKyAgLyogUHJlcGFyZSBkYXRhICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1QYXJhbWV0ZXJTZXRzOyBpKyspIHsKKyAgICBpZiAobGxEYXRhLT5ic1hYWERhdGFNb2RlW2ldID09IDApIHsKKyAgICAgIGxsRGF0YS0+bm9jbXBRdWFudENvYXJzZVhYWFtpXSA9IDA7CisgICAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBzdG9wQmFuZDsgYmFuZCsrKSB7CisgICAgICAgIG91dHB1dElkeERhdGFbeHR0SWR4XVtpXVtiYW5kXSA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgIH0KKyAgICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kKyspIHsKKyAgICAgICAgaWR4UHJldlt4dHRJZHhdW2JhbmRdID0gb3V0cHV0SWR4RGF0YVt4dHRJZHhdW2ldW2JhbmRdOworICAgICAgfQorICAgICAgLyogQmVjYXVzZSB0aGUgaWR4UHJldiBhcmUgYWxzbyBzZXQgdG8gdGhlIGRlZmF1bHRWYWx1ZSAtPiBzaWduYWxpemUgZmluZQorICAgICAgICovCisgICAgICBsbERhdGEtPnN0YXRlLT5ic1F1YW50Q29hcnNlWFhYcHJldiA9IDA7CisgICAgfQorCisgICAgaWYgKGxsRGF0YS0+YnNYWFhEYXRhTW9kZVtpXSA9PSAxKSB7CisgICAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBzdG9wQmFuZDsgYmFuZCsrKSB7CisgICAgICAgIG91dHB1dElkeERhdGFbeHR0SWR4XVtpXVtiYW5kXSA9IGlkeFByZXZbeHR0SWR4XVtiYW5kXTsKKyAgICAgIH0KKyAgICAgIGxsRGF0YS0+bm9jbXBRdWFudENvYXJzZVhYWFtpXSA9IGxsRGF0YS0+c3RhdGUtPmJzUXVhbnRDb2Fyc2VYWFhwcmV2OworICAgIH0KKworICAgIGlmIChsbERhdGEtPmJzWFhYRGF0YU1vZGVbaV0gPT0gMikgeworICAgICAgZm9yIChiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKykgeworICAgICAgICBvdXRwdXRJZHhEYXRhW3h0dElkeF1baV1bYmFuZF0gPSBpZHhQcmV2W3h0dElkeF1bYmFuZF07CisgICAgICB9CisgICAgICBsbERhdGEtPm5vY21wUXVhbnRDb2Fyc2VYWFhbaV0gPSBsbERhdGEtPnN0YXRlLT5ic1F1YW50Q29hcnNlWFhYcHJldjsKKyAgICAgIGFJbnRlcnBvbGF0ZVtpXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGFJbnRlcnBvbGF0ZVtpXSA9IDA7CisgICAgfQorCisgICAgaWYgKGxsRGF0YS0+YnNYWFhEYXRhTW9kZVtpXSA9PSAzKSB7CisgICAgICBpbnQgc3RyaWRlOworCisgICAgICBwYXJtU2xvdCA9IGFQYXJhbVNsb3RzW3NldElkeF07CisgICAgICBzdHJpZGUgPSBwYlN0cmlkZVRhYmxlW2xsRGF0YS0+YnNGcmVxUmVzU3RyaWRlWFhYW3NldElkeF1dOworICAgICAgZGF0YUJhbmRzID0gKHN0b3BCYW5kIC0gc3RhcnRCYW5kIC0gMSkgLyBzdHJpZGUgKyAxOworICAgICAgY3JlYXRlTWFwcGluZyhhTWFwLCBzdGFydEJhbmQsIHN0b3BCYW5kLCBzdHJpZGUpOworICAgICAgbWFwRnJlcXVlbmN5KCZjbXBJZHhEYXRhW3h0dElkeF1bc2V0SWR4XVswXSwKKyAgICAgICAgICAgICAgICAgICAmb3V0cHV0SWR4RGF0YVt4dHRJZHhdW3Bhcm1TbG90XVswXSwgYU1hcCwgZGF0YUJhbmRzKTsKKyAgICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kKyspIHsKKyAgICAgICAgaWR4UHJldlt4dHRJZHhdW2JhbmRdID0gb3V0cHV0SWR4RGF0YVt4dHRJZHhdW3Bhcm1TbG90XVtiYW5kXTsKKyAgICAgIH0KKyAgICAgIGxsRGF0YS0+c3RhdGUtPmJzUXVhbnRDb2Fyc2VYWFhwcmV2ID0gbGxEYXRhLT5ic1F1YW50Q29hcnNlWFhYW3NldElkeF07CisgICAgICBsbERhdGEtPm5vY21wUXVhbnRDb2Fyc2VYWFhbaV0gPSBsbERhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbc2V0SWR4XTsKKworICAgICAgc2V0SWR4Kys7CisgICAgfQorICAgIGlmIChkaWZmSWR4RGF0YSAhPSBOVUxMKSB7CisgICAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBzdG9wQmFuZDsgYmFuZCsrKSB7CisgICAgICAgIG91dHB1dElkeERhdGFbeHR0SWR4XVtpXVtiYW5kXSArPSBkaWZmSWR4RGF0YVt4dHRJZHhdW2ldW2JhbmRdOworICAgICAgfQorICAgIH0KKyAgfSAvKiBmb3IoIGkgPSAwIDsgaSA8IG51bVBhcmFtZXRlclNldHM7IGkrKyApICovCisKKyAgLyogTWFwIGFsbCBjb2Fyc2UgZGF0YSB0byBmaW5lICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1QYXJhbWV0ZXJTZXRzOyBpKyspIHsKKyAgICBpZiAobGxEYXRhLT5ub2NtcFF1YW50Q29hcnNlWFhYW2ldID09IDEpIHsKKyAgICAgIGNvYXJzZTJmaW5lKG91dHB1dElkeERhdGFbeHR0SWR4XVtpXSwgKERBVEFfVFlQRSlwYXJhbVR5cGUsIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgIHN0b3BCYW5kIC0gc3RhcnRCYW5kKTsKKyAgICAgIGxsRGF0YS0+bm9jbXBRdWFudENvYXJzZVhYWFtpXSA9IDA7CisgICAgfQorICB9CisKKyAgLyogSW50ZXJwb2xhdGUgKi8KKyAgaTEgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbnVtUGFyYW1ldGVyU2V0czsgaSsrKSB7CisgICAgaW50IHhpLCBpMiwgeDEsIHgyOworCisgICAgaWYgKGFJbnRlcnBvbGF0ZVtpXSAhPSAxKSB7CisgICAgICBpMSA9IGk7CisgICAgfQorICAgIGkyID0gaTsKKyAgICB3aGlsZSAoYUludGVycG9sYXRlW2kyXSA9PSAxKSB7CisgICAgICBpMisrOworICAgIH0KKyAgICB4MSA9IHBhcmFtU2xvdFtpMV07CisgICAgeGkgPSBwYXJhbVNsb3RbaV07CisgICAgeDIgPSBwYXJhbVNsb3RbaTJdOworCisgICAgaWYgKGFJbnRlcnBvbGF0ZVtpXSA9PSAxKSB7CisgICAgICBpZiAoaTIgPj0gbnVtUGFyYW1ldGVyU2V0cykgcmV0dXJuIE1QU19XUk9OR19QQVJBTUVURVJTRVRTOworICAgICAgZm9yIChiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKykgeworICAgICAgICBpbnQgeWksIHkxLCB5MjsKKyAgICAgICAgeTEgPSBvdXRwdXRJZHhEYXRhW3h0dElkeF1baTFdW2JhbmRdOworICAgICAgICB5MiA9IG91dHB1dElkeERhdGFbeHR0SWR4XVtpMl1bYmFuZF07CisgICAgICAgIGlmICh4MSAhPSB4MikgeworICAgICAgICAgIHlpID0geTEgKyAoeGkgLSB4MSkgKiAoeTIgLSB5MSkgLyAoeDIgLSB4MSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgeWkgPSB5MSAvKisgKHhpLXgxKSooeTIteTEpLzFlLTEyKi87CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0SWR4RGF0YVt4dHRJZHhdW2ldW2JhbmRdID0geWk7CisgICAgICB9CisgICAgfQorICB9IC8qIGZvciggaSA9IDAgOyBpIDwgbnVtUGFyYW1ldGVyU2V0czsgaSsrICkgKi8KKworICAvKiBEZXF1YW50aXplIGRhdGEgYW5kIGFwcGx5IGZhY3RvckNMRCBpZiBuZWNlc3NhcnkgKi8KKyAgZm9yIChwcyA9IDA7IHBzIDwgbnVtUGFyYW1ldGVyU2V0czsgcHMrKykgeworICAgIGlmIChxdWFudE1vZGUgJiYgKHBhcmFtVHlwZSA9PSB0X0NMRCkpIHsKKyAgICAgIGlmIChwT3R0VnNUb3REYkluID09IDApIHJldHVybiBNUFNfV1JPTkdfT1RUOworICAgICAgaWYgKChwT3R0VnNUb3REYjEgPT0gMCkgJiYgKG90dFZzVG90RGJNb2RlID09IG90dFZzVG90RGIxQWN0aXYpKQorICAgICAgICByZXR1cm4gTVBTX1dST05HX09UVDsKKyAgICAgIGlmICgocE90dFZzVG90RGIyID09IDApICYmIChvdHRWc1RvdERiTW9kZSA9PSBvdHRWc1RvdERiMkFjdGl2KSkKKyAgICAgICAgcmV0dXJuIE1QU19XUk9OR19PVFQ7CisKKyAgICAgIGZvciAocGIgPSBzdGFydEJhbmQ7IHBiIDwgc3RvcEJhbmQ7IHBiKyspIHsKKyAgICAgICAgZmFjdG9yQ0xEKCYob3V0cHV0SWR4RGF0YVt4dHRJZHhdW3BzXVtwYl0pLCAoKnBPdHRWc1RvdERiSW4pW3BzXVtwYl0sCisgICAgICAgICAgICAgICAgICAocE90dFZzVG90RGIxICE9IE5VTEwpID8gJigoKnBPdHRWc1RvdERiMSlbcHNdW3BiXSkgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgKHBPdHRWc1RvdERiMiAhPSBOVUxMKSA/ICYoKCpwT3R0VnNUb3REYjIpW3BzXVtwYl0pIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgIG90dFZzVG90RGJNb2RlLCBxdWFudE1vZGUpOworICAgICAgfQorICAgIH0KKworICAgIC8qIERlcXVhbnRpemUgZGF0YSAqLworICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kKyspIHsKKyAgICAgIG91dHB1dERhdGFJZHhbeHR0SWR4XVtwc11bYmFuZF0gPQorICAgICAgICAgIGRlcUlkeChvdXRwdXRJZHhEYXRhW3h0dElkeF1bcHNdW2JhbmRdLCBwYXJhbVR5cGUpOworICAgICAgaWYgKG91dHB1dERhdGFJZHhbeHR0SWR4XVtwc11bYmFuZF0gPT0gLTEpIHsKKyAgICAgICAgb3V0cHV0RGF0YUlkeFt4dHRJZHhdW3BzXVtiYW5kXSA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0gLyogZm9yKCBpID0gMCA7IGkgPCBudW1QYXJhbWV0ZXJTZXRzOyBpKysgKSAqLworCisgIGlmIChleHRlbmRGcmFtZSkgeworICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kKyspIHsKKyAgICAgIG91dHB1dERhdGFJZHhbeHR0SWR4XVtudW1QYXJhbWV0ZXJTZXRzXVtiYW5kXSA9CisgICAgICAgICAgb3V0cHV0RGF0YUlkeFt4dHRJZHhdW251bVBhcmFtZXRlclNldHMgLSAxXVtiYW5kXTsKKyAgICB9CisgIH0KKworICByZXR1cm4gTVBTX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogZGVjb2RlQW5kTWFwRnJhbWVPdHQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKyAgIERvIGRlbHRhIGRlY29kaW5nIGFuZCBkZXF1YW50aXphdGlvbgorCisgQXJndW1lbnRzOgorCitJbnB1dDoKKworT3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFNBQ0RFQ19FUlJPUiBkZWNvZGVBbmRNYXBGcmFtZU90dChIQU5ETEVfU1BBVElBTF9ERUMgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBVElBTF9CU19GUkFNRSAqcEN1ckJzKSB7CisgIGludCBpLCBvdHRJZHg7CisgIGludCBudW1PdHRCb3hlczsKKworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworCisgIG51bU90dEJveGVzID0gc2VsZi0+bnVtT3R0Qm94ZXM7CisKKyAgc3dpdGNoIChzZWxmLT50cmVlQ29uZmlnKSB7CisgICAgZGVmYXVsdDogeworICAgICAgaWYgKHNlbGYtPnF1YW50TW9kZSAhPSAwKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT3R0Qm94ZXM7IGkrKykgeworICAgICAgICBlcnIgPSBtYXBJbmRleERhdGEoCisgICAgICAgICAgICAmcEN1ckJzLT5DTERMb3NzbGVzc0RhdGFbaV0sIC8qIExPU1NMRVNTREFUQSAqbGxEYXRhLCovCisgICAgICAgICAgICBzZWxmLT5vdHRDTERfX0ZESywgc2VsZi0+b3V0SWR4RGF0YSwKKyAgICAgICAgICAgIHBDdXJCcworICAgICAgICAgICAgICAgIC0+Y21wT3R0Q0xEaWR4LCAvKiBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wSWR4RGF0YVtNQVhfTlVNX09UVF1bTUFYX1BBUkFNRVRFUl9TRVRTXVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgIC8qIG5vIGRpZmZlcmVudGlhbCBkYXRhICovCisgICAgICAgICAgICBpLCAvKiAgaW50ICAgeHR0SWR4LCAgV2hpY2ggb3R0L3R0dCBpbmRleCB0byB1c2UgZm9yIGlucHV0IGFuZAorICAgICAgICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgIHNlbGYtPm90dENMRGlkeFByZXYsICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeFByZXZbTUFYX05VTV9PVFRdW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGksIHRfQ0xELCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ICAgc3RhcnRCYW5kLCAqLworICAgICAgICAgICAgc2VsZi0+cENvbmZpZ0N1cnJlbnQtPmJpdHN0cmVhbU90dEJhbmRzW2ldLCAvKiAgaW50ICAgc3RvcEJhbmQsICovCisgICAgICAgICAgICBzZWxmLT5wQ29uZmlnQ3VycmVudC0+b3R0Q0xEZGVmYXVsdFtpXSwgLyogaW50ICAgZGVmYXVsdFZhbHVlLCAqLworICAgICAgICAgICAgcEN1ckJzLT5udW1QYXJhbWV0ZXJTZXRzLCAvKiBpbnQgICBudW1QYXJhbWV0ZXJTZXRzKSAqLworICAgICAgICAgICAgcEN1ckJzLT5wYXJhbVNsb3QsIHNlbGYtPmV4dGVuZEZyYW1lLCBzZWxmLT5xdWFudE1vZGUsCisgICAgICAgICAgICAmKHNlbGYtPmNvbmNlYWxJbmZvKSwgb3R0VnNUb3RJbmFjdGl2LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKGVyciAhPSBNUFNfT0spIGdvdG8gYmFpbDsKKworICAgICAgfSAvKiBmb3IoaSA9IDA7IGkgPCBudW1PdHRCb3hlcyA7IGkrKyApICovCisgICAgICBicmVhazsKKyAgfSAvKiBjYXNlICovCisKKyAgZm9yIChvdHRJZHggPSAwOyBvdHRJZHggPCBudW1PdHRCb3hlczsgb3R0SWR4KyspIHsKKyAgICAvKiBSZWFkIElDQyAqLworICAgIGVyciA9IG1hcEluZGV4RGF0YSgKKyAgICAgICAgJnBDdXJCcy0+SUNDTG9zc2xlc3NEYXRhW290dElkeF0sIC8qIExPU1NMRVNTREFUQSAqbGxEYXRhLCovCisgICAgICAgIHNlbGYtPm90dElDQ19fRkRLLCBzZWxmLT5vdXRJZHhEYXRhLAorICAgICAgICBwQ3VyQnMKKyAgICAgICAgICAgIC0+Y21wT3R0SUNDaWR4LCAgLyogaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcElkeERhdGFbTUFYX05VTV9PVFRdW01BWF9QQVJBTUVURVJfU0VUU11bTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBzZWxmLT5vdHRJQ0NkaWZmaWR4LCAvKiBkaWZmZXJlbnRpYWwgZGF0YSAqLworICAgICAgICBvdHRJZHgsIC8qIGludCAgIHh0dElkeCwgIFdoaWNoIG90dC90dHQgaW5kZXggdG8gdXNlIGZvciBpbnB1dCBhbmQKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQgYnVmZmVycyAqLworICAgICAgICBzZWxmLT5vdHRJQ0NpZHhQcmV2LCAvKiBpbnQgICBpZHhQcmV2W01BWF9OVU1fT1RUXVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIG90dElkeCwgdF9JQ0MsIDAsICAgIC8qIGludCAgIHN0YXJ0QmFuZCwgKi8KKyAgICAgICAgc2VsZi0+cENvbmZpZ0N1cnJlbnQtPmJpdHN0cmVhbU90dEJhbmRzW290dElkeF0sIC8qIGludCAgIHN0b3BCYW5kLCAqLworICAgICAgICBJQ0NkZWZhdWx0LCAgICAgICAgICAgICAgIC8qIGludCAgIGRlZmF1bHRWYWx1ZSwgKi8KKyAgICAgICAgcEN1ckJzLT5udW1QYXJhbWV0ZXJTZXRzLCAvKiBpbnQgICBudW1QYXJhbWV0ZXJTZXRzKSAqLworICAgICAgICBwQ3VyQnMtPnBhcmFtU2xvdCwgc2VsZi0+ZXh0ZW5kRnJhbWUsIHNlbGYtPnF1YW50TW9kZSwKKyAgICAgICAgJihzZWxmLT5jb25jZWFsSW5mbyksIG90dFZzVG90SW5hY3RpdiwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKGVyciAhPSBNUFNfT0spIGdvdG8gYmFpbDsKKyAgfSAvKiBvdHRJZHggKi8KKworICBpZiAoKHNlbGYtPnRyZWVDb25maWcgPT0gVFJFRV8yMTIpICYmIChzZWxmLT5waGFzZUNvZGluZykpIHsKKyAgICBpZiAocEN1ckJzLT5waGFzZU1vZGUgPT0gMCkgeworICAgICAgZm9yIChpbnQgcGIgPSAwOyBwYiA8IHNlbGYtPnBDb25maWdDdXJyZW50LT5udW1PdHRCYW5kc0lQRDsgcGIrKykgeworICAgICAgICBzZWxmLT5vdHRJUERpZHhQcmV2WzBdW3BiXSA9IDA7CisgICAgICB9CisgICAgfQorICAgIGZvciAob3R0SWR4ID0gMDsgb3R0SWR4IDwgbnVtT3R0Qm94ZXM7IG90dElkeCsrKSB7CisgICAgICBlcnIgPSBtYXBJbmRleERhdGEoCisgICAgICAgICAgJnBDdXJCcy0+SVBETG9zc2xlc3NEYXRhW290dElkeF0sIHNlbGYtPm90dElQRF9fRkRLLCBzZWxmLT5vdXRJZHhEYXRhLAorICAgICAgICAgIHBDdXJCcy0+Y21wT3R0SVBEaWR4LCBOVUxMLCBvdHRJZHgsIHNlbGYtPm90dElQRGlkeFByZXYsIG90dElkeCwKKyAgICAgICAgICB0X0lQRCwgMCwgc2VsZi0+bnVtT3R0QmFuZHNJUEQsIElQRGRlZmF1bHQsIHBDdXJCcy0+bnVtUGFyYW1ldGVyU2V0cywKKyAgICAgICAgICBwQ3VyQnMtPnBhcmFtU2xvdCwgc2VsZi0+ZXh0ZW5kRnJhbWUsIHNlbGYtPnF1YW50TW9kZSwKKyAgICAgICAgICAmKHNlbGYtPmNvbmNlYWxJbmZvKSwgb3R0VnNUb3RJbmFjdGl2LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICB9CisgIH0KKworYmFpbDoKKworICByZXR1cm4gTVBTX09LOworCit9IC8qIGRlY29kZUFuZE1hcEZyYW1lT3R0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBkZWNvZGVBbmRNYXBGcmFtZVNtZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorICAgRGVjb2RlIHNtb290aGluZyBmbGFncworCisgQXJndW1lbnRzOgorCitJbnB1dDoKKworT3V0cHV0OgorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgU0FDREVDX0VSUk9SIGRlY29kZUFuZE1hcEZyYW1lU21nKEhBTkRMRV9TUEFUSUFMX0RFQyBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSkgeworICBpbnQgcHMsIHBiLCBwZywgcGJTdHJpZGUsIGRhdGFCYW5kcywgcGJTdGFydCwgcGJTdG9wLAorICAgICAgYUdyb3VwVG9CYW5kW01BWF9QQVJBTUVURVJfQkFORFMgKyAxXTsKKworICBpZiAoZnJhbWUtPm51bVBhcmFtZXRlclNldHMgPiBNQVhfUEFSQU1FVEVSX1NFVFMpCisgICAgcmV0dXJuIE1QU19XUk9OR19QQVJBTUVURVJTRVRTOworICBpZiAoc2VsZi0+Yml0c3RyZWFtUGFyYW1ldGVyQmFuZHMgPiBNQVhfUEFSQU1FVEVSX0JBTkRTKQorICAgIHJldHVybiBNUFNfV1JPTkdfUEFSQU1FVEVSQkFORFM7CisKKyAgZm9yIChwcyA9IDA7IHBzIDwgZnJhbWUtPm51bVBhcmFtZXRlclNldHM7IHBzKyspIHsKKyAgICBzd2l0Y2ggKGZyYW1lLT5ic1Ntb290aE1vZGVbcHNdKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHNlbGYtPnNtZ1RpbWVbcHNdID0gMjU2OworICAgICAgICBGREttZW1jbGVhcihzZWxmLT5zbWdEYXRhW3BzXSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+Yml0c3RyZWFtUGFyYW1ldGVyQmFuZHMgKiBzaXplb2YoVUNIQVIpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKHBzID4gMCkgeworICAgICAgICAgIHNlbGYtPnNtZ1RpbWVbcHNdID0gc2VsZi0+c21nVGltZVtwcyAtIDFdOworICAgICAgICAgIEZES21lbWNweShzZWxmLT5zbWdEYXRhW3BzXSwgc2VsZi0+c21nRGF0YVtwcyAtIDFdLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5iaXRzdHJlYW1QYXJhbWV0ZXJCYW5kcyAqIHNpemVvZihVQ0hBUikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbGYtPnNtZ1RpbWVbcHNdID0gc2VsZi0+c21vb3RoU3RhdGUtPnByZXZTbWdUaW1lOworICAgICAgICAgIEZES21lbWNweShzZWxmLT5zbWdEYXRhW3BzXSwgc2VsZi0+c21vb3RoU3RhdGUtPnByZXZTbWdEYXRhLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5iaXRzdHJlYW1QYXJhbWV0ZXJCYW5kcyAqIHNpemVvZihVQ0hBUikpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDI6CisgICAgICAgIHNlbGYtPnNtZ1RpbWVbcHNdID0gc21nVGltZVRhYmxlW2ZyYW1lLT5ic1Ntb290aFRpbWVbcHNdXTsKKyAgICAgICAgZm9yIChwYiA9IDA7IHBiIDwgc2VsZi0+Yml0c3RyZWFtUGFyYW1ldGVyQmFuZHM7IHBiKyspIHsKKyAgICAgICAgICBzZWxmLT5zbWdEYXRhW3BzXVtwYl0gPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDM6CisgICAgICAgIHNlbGYtPnNtZ1RpbWVbcHNdID0gc21nVGltZVRhYmxlW2ZyYW1lLT5ic1Ntb290aFRpbWVbcHNdXTsKKyAgICAgICAgcGJTdHJpZGUgPSBwYlN0cmlkZVRhYmxlW2ZyYW1lLT5ic0ZyZXFSZXNTdHJpZGVTbWdbcHNdXTsKKyAgICAgICAgZGF0YUJhbmRzID0gKHNlbGYtPmJpdHN0cmVhbVBhcmFtZXRlckJhbmRzIC0gMSkgLyBwYlN0cmlkZSArIDE7CisgICAgICAgIGNyZWF0ZU1hcHBpbmcoYUdyb3VwVG9CYW5kLCAwLCBzZWxmLT5iaXRzdHJlYW1QYXJhbWV0ZXJCYW5kcywgcGJTdHJpZGUpOworICAgICAgICBmb3IgKHBnID0gMDsgcGcgPCBkYXRhQmFuZHM7IHBnKyspIHsKKyAgICAgICAgICBwYlN0YXJ0ID0gYUdyb3VwVG9CYW5kW3BnXTsKKyAgICAgICAgICBwYlN0b3AgPSBhR3JvdXBUb0JhbmRbcGcgKyAxXTsKKyAgICAgICAgICBmb3IgKHBiID0gcGJTdGFydDsgcGIgPCBwYlN0b3A7IHBiKyspIHsKKyAgICAgICAgICAgIHNlbGYtPnNtZ0RhdGFbcHNdW3BiXSA9IGZyYW1lLT5ic1NtZ0RhdGFbcHNdW3BnXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgc2VsZi0+c21vb3RoU3RhdGUtPnByZXZTbWdUaW1lID0gc2VsZi0+c21nVGltZVtmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyAtIDFdOworICBGREttZW1jcHkoc2VsZi0+c21vb3RoU3RhdGUtPnByZXZTbWdEYXRhLAorICAgICAgICAgICAgc2VsZi0+c21nRGF0YVtmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyAtIDFdLAorICAgICAgICAgICAgc2VsZi0+Yml0c3RyZWFtUGFyYW1ldGVyQmFuZHMgKiBzaXplb2YoVUNIQVIpKTsKKworICBpZiAoc2VsZi0+ZXh0ZW5kRnJhbWUpIHsKKyAgICBzZWxmLT5zbWdUaW1lW2ZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzXSA9CisgICAgICAgIHNlbGYtPnNtZ1RpbWVbZnJhbWUtPm51bVBhcmFtZXRlclNldHMgLSAxXTsKKyAgICBGREttZW1jcHkoc2VsZi0+c21nRGF0YVtmcmFtZS0+bnVtUGFyYW1ldGVyU2V0c10sCisgICAgICAgICAgICAgIHNlbGYtPnNtZ0RhdGFbZnJhbWUtPm51bVBhcmFtZXRlclNldHMgLSAxXSwKKyAgICAgICAgICAgICAgc2VsZi0+Yml0c3RyZWFtUGFyYW1ldGVyQmFuZHMgKiBzaXplb2YoVUNIQVIpKTsKKyAgfQorCisgIHJldHVybiBNUFNfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBkZWNvZGVBbmRNYXBGcmFtZUFyYmRteAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorICAgRG8gZGVsdGEgZGVjb2RpbmcgYW5kIGRlcXVhbnRpemF0aW9uCisKKyBBcmd1bWVudHM6CisKK0lucHV0OgorCitPdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgU0FDREVDX0VSUk9SIGRlY29kZUFuZE1hcEZyYW1lQXJiZG14KEhBTkRMRV9TUEFUSUFMX0RFQyBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBpbnQgY2g7CisgIGludCBvZmZzZXQgPSBzZWxmLT5udW1PdHRCb3hlczsKKworICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5udW1JbnB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgZXJyID0gbWFwSW5kZXhEYXRhKCZmcmFtZS0+Q0xETG9zc2xlc3NEYXRhW29mZnNldCArIGNoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+YXJiZG14R2Fpbl9fRkRLLCBzZWxmLT5vdXRJZHhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+Y21wQXJiZG14R2FpbklkeCwgTlVMTCwgLyogbm8gZGlmZmVyZW50aWFsIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgY2gsIHNlbGYtPmFyYmRteEdhaW5JZHhQcmV2LCBvZmZzZXQgKyBjaCwgdF9DTEQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmJpdHN0cmVhbVBhcmFtZXRlckJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAwIC8qc2VsZi0+YXJiZG14R2FpbkRlZmF1bHQqLywgZnJhbWUtPm51bVBhcmFtZXRlclNldHMsCisgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5wYXJhbVNsb3QsIHNlbGYtPmV4dGVuZEZyYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAmKHNlbGYtPmNvbmNlYWxJbmZvKSwgb3R0VnNUb3RJbmFjdGl2LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IE1QU19PSykgZ290byBiYWlsOworICB9CisKK2JhaWw6CisgIHJldHVybiBlcnI7Cit9IC8qIGRlY29kZUFuZE1hcEZyYW1lQXJiZG14ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBTcGF0aWFsRGVjRGVjb2RlRnJhbWUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIFJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjRGVjb2RlRnJhbWUoc3BhdGlhbERlYyAqc2VsZiwgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKworICBzZWxmLT5leHRlbmRGcmFtZSA9IDA7CisgIGlmIChmcmFtZS0+cGFyYW1TbG90W2ZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzIC0gMV0gIT0gc2VsZi0+dGltZVNsb3RzIC0gMSkgeworICAgIHNlbGYtPmV4dGVuZEZyYW1lID0gMTsKKyAgfQorCisgIHNlbGYtPlRzZFRzID0gMDsKKworICAvKioqKioqIERUREYgYW5kIE1BUCBEQVRBICoqKioqKioqLworICBpZiAoKGVyciA9IGRlY29kZUFuZE1hcEZyYW1lT3R0KHNlbGYsIGZyYW1lKSkgIT0gTVBTX09LKSBnb3RvIGJhaWw7CisKKyAgaWYgKChlcnIgPSBkZWNvZGVBbmRNYXBGcmFtZVNtZyhzZWxmLCBmcmFtZSkpICE9IE1QU19PSykgZ290byBiYWlsOworCisgIGlmIChzZWxmLT5hcmJpdHJhcnlEb3dubWl4ICE9IDApIHsKKyAgICBpZiAoKGVyciA9IGRlY29kZUFuZE1hcEZyYW1lQXJiZG14KHNlbGYsIGZyYW1lKSkgIT0gTVBTX09LKSBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoc2VsZi0+ZXh0ZW5kRnJhbWUpIHsKKyAgICBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyA9CisgICAgICAgIGZpeE1pbihNQVhfUEFSQU1FVEVSX1NFVFMsIGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzICsgMSk7CisgICAgZnJhbWUtPnBhcmFtU2xvdFtmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyAtIDFdID0gc2VsZi0+dGltZVNsb3RzIC0gMTsKKyAgfQorCitiYWlsOgorICByZXR1cm4gZXJyOworfSAvKiBTcGF0aWFsRGVjRGVjb2RlRnJhbWUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogU3BhdGlhbERlY29kZUhlYWRlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0RlY29kZUhlYWRlcigKKyAgICBzcGF0aWFsRGVjICpzZWxmLCBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNwYXRpYWxTcGVjaWZpY0NvbmZpZykgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBpbnQgaTsKKworICBzZWxmLT5zYW1wbGluZ0ZyZXEgPSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5zYW1wbGluZ0ZyZXE7CisgIHNlbGYtPnRpbWVTbG90cyA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UaW1lU2xvdHM7CisgIHNlbGYtPmZyYW1lTGVuZ3RoID0gc2VsZi0+dGltZVNsb3RzICogc2VsZi0+cW1mQmFuZHM7CisgIHNlbGYtPmJpdHN0cmVhbVBhcmFtZXRlckJhbmRzID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+ZnJlcVJlczsKKworICBpZiAoc2VsZi0+cENvbmZpZ0N1cnJlbnQtPnN5bnRheEZsYWdzICYgU0FDREVDX1NZTlRBWF9MRCkKKyAgICBzZWxmLT5oeWJyaWRCYW5kcyA9IHNlbGYtPnFtZkJhbmRzOworICBlbHNlCisgICAgc2VsZi0+aHlicmlkQmFuZHMgPSBTYWNHZXRIeWJyaWRTdWJiYW5kcyhzZWxmLT5xbWZCYW5kcyk7CisgIHNlbGYtPnRwX2h5YkJhbmRCb3JkZXIgPSAxMjsKKworICBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kcyA9IHNlbGYtPmJpdHN0cmVhbVBhcmFtZXRlckJhbmRzOworCisgIGlmIChzZWxmLT5wQ29uZmlnQ3VycmVudC0+c3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX0xEKSB7CisgICAgc3dpdGNoIChzZWxmLT5udW1QYXJhbWV0ZXJCYW5kcykgeworICAgICAgY2FzZSA0OgorICAgICAgICBzZWxmLT5rZXJuZWxzID0ga2VybmVsc180X3RvXzY0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgc2VsZi0+a2VybmVscyA9IGtlcm5lbHNfNV90b182NDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDc6CisgICAgICAgIHNlbGYtPmtlcm5lbHMgPSBrZXJuZWxzXzdfdG9fNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5OgorICAgICAgICBzZWxmLT5rZXJuZWxzID0ga2VybmVsc185X3RvXzY0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTI6CisgICAgICAgIHNlbGYtPmtlcm5lbHMgPSBrZXJuZWxzXzEyX3RvXzY0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTU6CisgICAgICAgIHNlbGYtPmtlcm5lbHMgPSBrZXJuZWxzXzE1X3RvXzY0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjM6CisgICAgICAgIHNlbGYtPmtlcm5lbHMgPSBrZXJuZWxzXzIzX3RvXzY0OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNUFNfSU5WQUxJRF9QQVJBTUVURVJCQU5EUzsgLyogdW5zdXBwb3J0ZWQgbnVtUGFyYW1ldGVyQmFuZHMgKi8KKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChzZWxmLT5udW1QYXJhbWV0ZXJCYW5kcykgeworICAgICAgY2FzZSA0OgorICAgICAgICBzZWxmLT5rZXJuZWxzID0ga2VybmVsc180X3RvXzcxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgc2VsZi0+a2VybmVscyA9IGtlcm5lbHNfNV90b183MTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDc6CisgICAgICAgIHNlbGYtPmtlcm5lbHMgPSBrZXJuZWxzXzdfdG9fNzE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDoKKyAgICAgICAgc2VsZi0+a2VybmVscyA9IGtlcm5lbHNfMTBfdG9fNzE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNDoKKyAgICAgICAgc2VsZi0+a2VybmVscyA9IGtlcm5lbHNfMTRfdG9fNzE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyMDoKKyAgICAgICAgc2VsZi0+a2VybmVscyA9IGtlcm5lbHNfMjBfdG9fNzE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyODoKKyAgICAgICAgc2VsZi0+a2VybmVscyA9IGtlcm5lbHNfMjhfdG9fNzE7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1QU19JTlZBTElEX1BBUkFNRVRFUkJBTkRTOyAvKiB1bnN1cHBvcnRlZCBudW1QYXJhbWV0ZXJCYW5kcyAqLworICAgIH0KKyAgfQorCisgIC8qIGNyZWF0ZSBwYXJhbSB0byBoeWIgYmFuZCB0YWJsZSAqLworICBGREttZW1jbGVhcihzZWxmLT5wYXJhbTJoeWIsIChNQVhfUEFSQU1FVEVSX0JBTkRTICsgMSkgKiBzaXplb2YoaW50KSk7CisgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5oeWJyaWRCYW5kczsgaSsrKSB7CisgICAgc2VsZi0+cGFyYW0yaHliW3NlbGYtPmtlcm5lbHNbaV0gKyAxXSA9IGkgKyAxOworICB9CisgIHsKKyAgICBpbnQgcGIgPSBzZWxmLT5rZXJuZWxzW2kgLSAxXSArIDI7CisgICAgZm9yICg7IHBiIDwgKE1BWF9QQVJBTUVURVJfQkFORFMgKyAxKTsgcGIrKykgeworICAgICAgc2VsZi0+cGFyYW0yaHliW3BiXSA9IGk7CisgICAgfQorICAgIGZvciAocGIgPSAwOyBwYiA8IE1BWF9QQVJBTUVURVJfQkFORFM7IHBiICs9IDEpIHsKKyAgICAgIHNlbGYtPmtlcm5lbHNfd2lkdGhbcGJdID0gc2VsZi0+cGFyYW0yaHliW3BiICsgMV0gLSBzZWxmLT5wYXJhbTJoeWJbcGJdOworICAgIH0KKyAgfQorCisgIHNlbGYtPnRyZWVDb25maWcgPSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnOworCisgIHNlbGYtPm51bU90dEJveGVzID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk90dEJveGVzOworCisgIHNlbGYtPm51bUlucHV0Q2hhbm5lbHMgPSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uSW5wdXRDaGFubmVsczsKKworICBzZWxmLT5udW1PdXRwdXRDaGFubmVscyA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5PdXRwdXRDaGFubmVsczsKKworICBzZWxmLT5xdWFudE1vZGUgPSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5xdWFudE1vZGU7CisKKyAgc2VsZi0+YXJiaXRyYXJ5RG93bm1peCA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJBcmJpdHJhcnlEb3dubWl4OworCisgIHNlbGYtPm51bU0ycm93cyA9IHNlbGYtPm51bU91dHB1dENoYW5uZWxzOworCisgIHsKKyAgICBzZWxmLT5yZXNpZHVhbENvZGluZyA9IDA7CisgICAgaWYgKHNlbGYtPmFyYml0cmFyeURvd25taXggPT0gMikKKyAgICAgIHNlbGYtPmFyYml0cmFyeURvd25taXggPSAxOyAvKiBubyBhcmJpdHJhcnkgZG93bm1peCByZXNpZHVhbHMgKi8KKyAgfQorICBpZiAoKHNlbGYtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfVVNBQykpIHsKKyAgICBzZWxmLT5yZXNpZHVhbENvZGluZyA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJSZXNpZHVhbENvZGluZzsKKyAgfQorCisgIHNlbGYtPmNsaXBQcm90ZWN0R2Fpbl9fRkRLID0KKyAgICAgIEZYX0NGRzJGWF9EQkwoY2xpcEdhaW5UYWJsZV9fRkRLW3BTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzRml4ZWRHYWluRE1YXSk7CisgIHNlbGYtPmNsaXBQcm90ZWN0R2FpblNGX19GREsgPQorICAgICAgY2xpcEdhaW5TRlRhYmxlX19GREtbcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNGaXhlZEdhaW5ETVhdOworCisgIHNlbGYtPnRlbXBTaGFwZUNvbmZpZyA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRlbXBTaGFwZUNvbmZpZzsKKworICBzZWxmLT5kZWNvcnJDb25maWcgPSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5kZWNvcnJDb25maWc7CisKKyAgaWYgKHNlbGYtPnVwbWl4VHlwZSA9PSBVUE1JWFRZUEVfQllQQVNTKSB7CisgICAgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHMgPSBzZWxmLT5udW1JbnB1dENoYW5uZWxzOworICB9CisKKyAgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHNBVCA9IHNlbGYtPm51bU91dHB1dENoYW5uZWxzOworCisgIHNlbGYtPm51bU90dEJhbmRzSVBEID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bnVtT3R0QmFuZHNJUEQ7CisgIHNlbGYtPnBoYXNlQ29kaW5nID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNQaGFzZUNvZGluZzsKKyAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm51bU90dEJveGVzOyBpKyspIHsKKyAgICB7CisgICAgICBzZWxmLT5wQ29uZmlnQ3VycmVudC0+Yml0c3RyZWFtT3R0QmFuZHNbaV0gPQorICAgICAgICAgIHNlbGYtPmJpdHN0cmVhbVBhcmFtZXRlckJhbmRzOworICAgIH0KKyAgICBzZWxmLT5udW1PdHRCYW5kc1tpXSA9IHNlbGYtPnBDb25maWdDdXJyZW50LT5iaXRzdHJlYW1PdHRCYW5kc1tpXTsKKyAgfSAvKiBpICovCisKKyAgaWYgKHNlbGYtPnJlc2lkdWFsQ29kaW5nKSB7CisgICAgaW50IG51bUJveGVzID0gc2VsZi0+bnVtT3R0Qm94ZXM7CisgICAgZm9yIChpID0gMDsgaSA8IG51bUJveGVzOyBpKyspIHsKKyAgICAgIHNlbGYtPnJlc2lkdWFsUHJlc2VudFtpXSA9CisgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+UmVzaWR1YWxDb25maWdbaV0uYlJlc2lkdWFsUHJlc2VudDsKKworICAgICAgaWYgKHNlbGYtPnJlc2lkdWFsUHJlc2VudFtpXSkgeworICAgICAgICBzZWxmLT5yZXNpZHVhbEJhbmRzW2ldID0KKyAgICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPlJlc2lkdWFsQ29uZmlnW2ldLm5SZXNpZHVhbEJhbmRzOworICAgICAgICAvKiBjb252ZXJzaW9uIGZyb20gaHlicmlkIGJhbmRzIHRvIHFtZiBiYW5kcyAqLworICAgICAgICBzZWxmLT5yZXNpZHVhbFFNRkJhbmRzW2ldID0KKyAgICAgICAgICAgIGZNYXgoc2VsZi0+cGFyYW0yaHliW3NlbGYtPnJlc2lkdWFsQmFuZHNbaV1dICsgMyAtIDEwLAorICAgICAgICAgICAgICAgICAzKTsgLyogc2ltcGxpZmljYXRpb24gZm9yIHRoZSBsb3dlc3QgMTAgaHlicmlkIGJhbmRzICovCisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLT5yZXNpZHVhbEJhbmRzW2ldID0gMDsKKyAgICAgICAgc2VsZi0+cmVzaWR1YWxRTUZCYW5kc1tpXSA9IDA7CisgICAgICB9CisgICAgfQorICB9IC8qIHNlbGYtPnJlc2lkdWFsQ29kaW5nICovCisgIGVsc2UgeworICAgIGludCBib3hlcyA9IHNlbGYtPm51bU90dEJveGVzOworICAgIGZvciAoaSA9IDA7IGkgPCBib3hlczsgaSArPSAxKSB7CisgICAgICBzZWxmLT5yZXNpZHVhbFByZXNlbnRbaV0gPSAwOworICAgICAgc2VsZi0+cmVzaWR1YWxCYW5kc1tpXSA9IDA7CisgICAgfQorICB9CisKKyAgc3dpdGNoIChzZWxmLT50cmVlQ29uZmlnKSB7CisgICAgY2FzZSBUUkVFXzIxMjoKKyAgICAgIHNlbGYtPm51bURpcmVrdFNpZ25hbHMgPSAxOworICAgICAgc2VsZi0+bnVtRGVjb3JTaWduYWxzID0gMTsKKyAgICAgIHNlbGYtPm51bVhDaGFubmVscyA9IDE7CisgICAgICBpZiAoc2VsZi0+YXJiaXRyYXJ5RG93bm1peCA9PSAyKSB7CisgICAgICAgIHNlbGYtPm51bVhDaGFubmVscyArPSAxOworICAgICAgfQorICAgICAgc2VsZi0+bnVtVkNoYW5uZWxzID0gc2VsZi0+bnVtRGlyZWt0U2lnbmFscyArIHNlbGYtPm51bURlY29yU2lnbmFsczsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTVBTX0lOVkFMSURfVFJFRUNPTkZJRzsKKyAgfQorCisgIHNlbGYtPmhpZ2hSYXRlTW9kZSA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzSGlnaFJhdGVNb2RlOworICBzZWxmLT5kZWNvcnJUeXBlID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNEZWNvcnJUeXBlOworCisgIFNwYXRpYWxEZWNEZWNvZGVIZWxwZXJJbmZvKHBTcGF0aWFsU3BlY2lmaWNDb25maWcsIFVQTUlYVFlQRV9OT1JNQUwpOworCisgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBTcGF0aWFsRGVjQ3JlYXRlQnNGcmFtZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOiBDcmVhdGUgc3BhdGlhbCBiaXRzdHJlYW0gc3RydWN0dXJlCisKKyBBcmd1bWVudHM6ICAgc3BhdGlhbERlYyogc2VsZgorICAgICAgICAgICAgICBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICoqYnNGcmFtZQorCisgUmV0dXJuOiAgICAgIC0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQ3JlYXRlQnNGcmFtZShTUEFUSUFMX0JTX0ZSQU1FICpic0ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTX0xMX1NUQVRFICpsbFN0YXRlKSB7CisgIFNQQVRJQUxfQlNfRlJBTUUgKnBCcyA9IGJzRnJhbWU7CisKKyAgY29uc3QgaW50IG1heE51bU90dCA9IE1BWF9OVU1fT1RUOworICBjb25zdCBpbnQgbWF4TnVtSW5wdXRDaGFubmVscyA9IE1BWF9JTlBVVF9DSEFOTkVMUzsKKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEX1AoCisgICAgICBwQnMtPmNtcE90dElQRGlkeCwgbWF4TnVtT3R0ICogTUFYX1BBUkFNRVRFUl9TRVRTICogTUFYX1BBUkFNRVRFUl9CQU5EUywKKyAgICAgIFNDSEFSLCBTQ0hBUigqKVtNQVhfUEFSQU1FVEVSX1NFVFNdW01BWF9QQVJBTUVURVJfQkFORFNdKQorCisgIC8qIEFyYml0cmFyeSBEb3dubWl4ICovCisgIEZES19BTExPQ0FURV9NRU1PUllfMURfUCgKKyAgICAgIHBCcy0+Y21wQXJiZG14R2FpbklkeCwKKyAgICAgIG1heE51bUlucHV0Q2hhbm5lbHMgKiBNQVhfUEFSQU1FVEVSX1NFVFMgKiBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUiwKKyAgICAgIFNDSEFSKCopW01BWF9QQVJBTUVURVJfU0VUU11bTUFYX1BBUkFNRVRFUl9CQU5EU10pCisKKyAgLyogTG9zc2xlc3MgY29udHJvbCAqLworICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHBCcy0+Q0xETG9zc2xlc3NEYXRhLCBNQVhfTlVNX1BBUkFNRVRFUlMsIExPU1NMRVNTREFUQSkKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChwQnMtPklDQ0xvc3NsZXNzRGF0YSwgTUFYX05VTV9QQVJBTUVURVJTLCBMT1NTTEVTU0RBVEEpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChwQnMtPklQRExvc3NsZXNzRGF0YSwgTUFYX05VTV9QQVJBTUVURVJTLCBMT1NTTEVTU0RBVEEpCisKKyAgcEJzLT5uZXdCc0RhdGEgPSAwOworICBwQnMtPm51bVBhcmFtZXRlclNldHMgPSAxOworCisgIC8qIExpbmsgbG9zc2xlc3Mgc3RhdGVzICovCisgIGZvciAoaW50IHggPSAwOyB4IDwgTUFYX05VTV9QQVJBTUVURVJTOyB4KyspIHsKKyAgICBwQnMtPkNMRExvc3NsZXNzRGF0YVt4XS5zdGF0ZSA9ICZsbFN0YXRlLT5DTERMb3NzbGVzc1N0YXRlW3hdOworICAgIHBCcy0+SUNDTG9zc2xlc3NEYXRhW3hdLnN0YXRlID0gJmxsU3RhdGUtPklDQ0xvc3NsZXNzU3RhdGVbeF07CisKKyAgICBwQnMtPklQRExvc3NsZXNzRGF0YVt4XS5zdGF0ZSA9ICZsbFN0YXRlLT5JUERMb3NzbGVzc1N0YXRlW3hdOworICB9CisKKyAgcmV0dXJuIE1QU19PSzsKKworYmFpbDoKKyAgcmV0dXJuIE1QU19PVVRPRk1FTU9SWTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IFNwYXRpYWxEZWNDbG9zZUJzRnJhbWUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjogQ2xvc2Ugc3BhdGlhbCBiaXRzdHJlYW0gc3RydWN0dXJlCisKKyBBcmd1bWVudHM6ICAgc3BhdGlhbERlYyogc2VsZgorCisgUmV0dXJuOiAgICAgIC0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgU3BhdGlhbERlY0Nsb3NlQnNGcmFtZShTUEFUSUFMX0JTX0ZSQU1FICpwQnMpIHsKKyAgaWYgKHBCcyAhPSBOVUxMKSB7CisgICAgLyogVGhlc2UgYXJyYXlzIGNvbnRhaW4gdGhlIGNvbXBhY3QgaW5kaWNlcywgb25seSBvbmUgdmFsdWUgcGVyIHBic3RyaWRlLAorICAgICAqIG9ubHkgcGFyYW1zZXRzIGFjdHVhbGx5IGNvbnRhaW5pbmcgZGF0YS4gKi8KKworICAgIEZES19GUkVFX01FTU9SWV8xRChwQnMtPmNtcE90dElQRGlkeCk7CisKKyAgICAvKiBBcmJpdHJhcnkgRG93bm1peCAqLworICAgIEZES19GUkVFX01FTU9SWV8xRChwQnMtPmNtcEFyYmRteEdhaW5JZHgpOworCisgICAgLyogTG9zc2xlc3MgY29udHJvbCAqLworICAgIEZES19GUkVFX01FTU9SWV8xRChwQnMtPklQRExvc3NsZXNzRGF0YSk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHBCcy0+Q0xETG9zc2xlc3NEYXRhKTsKKyAgICBGREtfRlJFRV9NRU1PUllfMUQocEJzLT5JQ0NMb3NzbGVzc0RhdGEpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19iaXRkZWMuaCBiL2xpYlNBQ2RlYy9zcmMvc2FjX2JpdGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMGM3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19iaXRkZWMuaApAQCAtMCwwICsxLDE2MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIGJpdHN0cmVhbSBkZWNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIFNwYXRpYWwgQXVkaW8gYml0c3RyZWFtIGRlY29kZXIKKyovCisKKyNpZm5kZWYgU0FDX0JJVERFQ19ICisjZGVmaW5lIFNBQ19CSVRERUNfSAorCisjaW5jbHVkZSAic2FjX2RlYy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIFNDSEFSIG51bUlucHV0Q2hhbm5lbHM7CisgIFNDSEFSIG51bU91dHB1dENoYW5uZWxzOworICBTQ0hBUiBudW1PdHRCb3hlczsKKyAgU0NIQVIgbnVtVHR0Qm94ZXM7CisgIFNDSEFSIG90dE1vZGVMZmVbTUFYX05VTV9PVFRdOworfSBUUkVFUFJPUEVSVElFUzsKKworZW51bSB7IFRSRUVfMjEyID0gNywgVFJFRV9EVU1NWSA9IDI1NSB9OworCitlbnVtIHsgUVVBTlRfRklORSA9IDAsIFFVQU5UX0VCUTEgPSAxLCBRVUFOVF9FQlEyID0gMiB9OworCitTQUNERUNfRVJST1IgU3BhdGlhbERlY1BhcnNlU3BlY2lmaWNDb25maWdIZWFkZXIoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYml0c3RyZWFtLAorICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywgU1BBVElBTF9ERUNfVVBNSVhfVFlQRSB1cG1peFR5cGUpOworCitTQUNERUNfRVJST1IgU3BhdGlhbERlY1BhcnNlTXBzMjEyQ29uZmlnKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJpdHN0cmVhbSwKKyAgICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNwYXRpYWxTcGVjaWZpY0NvbmZpZywgaW50IHNhbXBsaW5nUmF0ZSwKKyAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsIElOVCBzdGVyZW9Db25maWdJbmRleCwKKyAgICBJTlQgY29yZVNickZyYW1lTGVuZ3RoSW5kZXgpOworCitTQUNERUNfRVJST1IgU3BhdGlhbERlY1BhcnNlU3BlY2lmaWNDb25maWcoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYml0c3RyZWFtLAorICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCBpbnQgc2FjSGVhZGVyTGVuLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYyk7CisKK2ludCBTcGF0aWFsRGVjRGVmYXVsdFNwZWNpZmljQ29uZmlnKAorICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywgaW50IHNhbXBsaW5nRnJlcSwgaW50IG5UaW1lU2xvdHMsCisgICAgaW50IHNhY0RlY29kZXJMZXZlbCwgaW50IGlzQmxpbmQsIGludCBjb3JlQ2hhbm5lbHMpOworCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0NyZWF0ZUJzRnJhbWUoU1BBVElBTF9CU19GUkFNRSAqYnNGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCU19MTF9TVEFURSAqbGxTdGF0ZSk7CisKK3ZvaWQgU3BhdGlhbERlY0Nsb3NlQnNGcmFtZShTUEFUSUFMX0JTX0ZSQU1FICpic0ZyYW1lKTsKKworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNQYXJzZUZyYW1lRGF0YSgKKyAgICBzcGF0aWFsRGVjICpzZWxmLCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwgSEFORExFX0ZES19CSVRTVFJFQU0gYml0c3RyZWFtLAorICAgIGNvbnN0IFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCBVUE1JWFRZUEUgdXBtaXhUeXBlLAorICAgIGludCBmR2xvYmFsSW5kZXBlbmRlbmN5RmxhZyk7CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjRGVjb2RlRnJhbWUoc3BhdGlhbERlYyAqc2VsZiwgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUpOworCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0RlY29kZUhlYWRlcigKKyAgICBzcGF0aWFsRGVjICpzZWxmLCBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNwYXRpYWxTcGVjaWZpY0NvbmZpZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfY2FsY00xYW5kTTIuY3BwIGIvbGliU0FDZGVjL3NyYy9zYWNfY2FsY00xYW5kTTIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWExNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19jYWxjTTFhbmRNMi5jcHAKQEAgLTAsMCArMSw4NDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlYyBNMSBhbmQgTTIgY2FsY3VsYXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNhY19jYWxjTTFhbmRNMi5oIgorI2luY2x1ZGUgInNhY19iaXRkZWMuaCIKKyNpbmNsdWRlICJzYWNfcHJvY2Vzcy5oIgorI2luY2x1ZGUgInNhY19yb20uaCIKKyNpbmNsdWRlICJzYWNfc21vb3RoaW5nLmgiCisjaW5jbHVkZSAiRkRLX3RyaWdGY3RzLmgiCisKKy8qIGFzc29ydGVkIGRlZmluaXRpb25zIGFuZCBjb25zdGFudHMgKi8KKworI2RlZmluZSBBQlNfVEhSMiAxLjBlLTkKKyNkZWZpbmUgU1FSVDJfRkRLIFwKKyAgKChGSVhQX0RCTClGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4ZikpIC8qIEZES3NxcnQoMi4wKSBzY2FsZWQgYnkgMC41ICovCisKK3N0YXRpYyB2b2lkIHBhcmFtMlVNWF9QU19fRkRLKHNwYXRpYWxEZWMqIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBIMTFbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBIMTJbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBIMjFbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBIMjJbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBjX2xbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBjX3JbTUFYX1BBUkFNRVRFUl9CQU5EU10sIGludCBvdHRCb3hJbmR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcmFtZXRlclNldEluZHgsIGludCByZXNCYW5kcyk7CisKK3N0YXRpYyB2b2lkIHBhcmFtMlVNWF9QU19Db3JlX19GREsoCisgICAgY29uc3QgU0NIQVIgY2xkW01BWF9QQVJBTUVURVJfQkFORFNdLCBjb25zdCBTQ0hBUiBpY2NbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgY29uc3QgaW50IG51bU90dEJhbmRzLCBjb25zdCBpbnQgcmVzQmFuZHMsCisgICAgRklYUF9EQkwgSDExW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBIMTJbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgRklYUF9EQkwgSDIxW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBIMjJbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgRklYUF9EQkwgY19sW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBjX3JbTUFYX1BBUkFNRVRFUl9CQU5EU10pOworCitzdGF0aWMgdm9pZCBwYXJhbTJVTVhfUFNfSVBEX09QRF9fRkRLKAorICAgIHNwYXRpYWxEZWMqIHNlbGYsIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUqIGZyYW1lLAorICAgIEZJWFBfREJMIEgxMXJlW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBIMTJyZVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCBIMjFyZVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwgRklYUF9EQkwgSDIycmVbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgRklYUF9EQkwgY19sW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBjX3JbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgaW50IG90dEJveEluZHgsIGludCBwYXJhbWV0ZXJTZXRJbmR4LCBpbnQgcmVzaWR1YWxCYW5kcyk7CisKK3N0YXRpYyB2b2lkIHBhcmFtMlVNWF9QcmVkaWN0aW9uX19GREsoCisgICAgc3BhdGlhbERlYyogc2VsZiwgRklYUF9EQkwgSDExcmVbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgRklYUF9EQkwgSDExaW1bTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIEgxMnJlW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgIEZJWFBfREJMIEgxMmltW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBIMjFyZVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCBIMjFpbVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwgRklYUF9EQkwgSDIycmVbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgRklYUF9EQkwgSDIyaW1bTUFYX1BBUkFNRVRFUl9CQU5EU10sIGludCBvdHRCb3hJbmR4LCBpbnQgcGFyYW1ldGVyU2V0SW5keCwKKyAgICBpbnQgcmVzQmFuZHMpOworCisvKiBzdGF0aWMgdm9pZCBTcGF0aWFsRGVjQ2FsY3VsYXRlTTAoc3BhdGlhbERlYyogc2VsZixpbnQgcHMpOyAqLworc3RhdGljIFNBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQ2FsY3VsYXRlTTFhbmRNMl8yMTIoCisgICAgc3BhdGlhbERlYyogc2VsZiwgaW50IHBzLCBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FKiBmcmFtZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBTcGF0aWFsRGVjR2V0UmVzaWR1YWxJbmRleAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgSW5wdXQ6CisKKyBPdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgU3BhdGlhbERlY0dldFJlc2lkdWFsSW5kZXgoc3BhdGlhbERlYyogc2VsZiwgaW50IHJvdykgeworICByZXR1cm4gcm93MnJlc2lkdWFsW3NlbGYtPnRyZWVDb25maWddW3Jvd107Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBVcGRhdGVBbHBoYQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgSW5wdXQ6CisKKyBPdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB1cGRhdGVBbHBoYShzcGF0aWFsRGVjKiBzZWxmKSB7CisgIGludCBuQ2hJbiA9IHNlbGYtPm51bUlucHV0Q2hhbm5lbHM7CisgIGludCBjaDsKKworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hJbjsgY2grKykgeworICAgIEZJWFBfREJMIGFscGhhID0gLyogRkwyRlhDT05TVF9EQkwoMS4wZikgKi8gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisKKyAgICBzZWxmLT5hcmJkbXhBbHBoYVByZXZfX0ZES1tjaF0gPSBzZWxmLT5hcmJkbXhBbHBoYV9fRkRLW2NoXTsKKworICAgIHNlbGYtPmFyYmRteEFscGhhX19GREtbY2hdID0gYWxwaGE7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IFNwYXRpYWxEZWNDYWxjdWxhdGVNMWFuZE0yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIERlc2NyaXB0aW9uOgorIEFyZ3VtZW50czoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0NhbGN1bGF0ZU0xYW5kTTIoc3BhdGlhbERlYyogc2VsZiwgaW50IHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUqIGZyYW1lKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisKKyAgaWYgKChzZWxmLT5hcmJpdHJhcnlEb3dubWl4ICE9IDApICYmIChwcyA9PSAwKSkgeworICAgIHVwZGF0ZUFscGhhKHNlbGYpOworICB9CisKKyAgc2VsZi0+cEFjdGl2TTJQYXJhbUJhbmRzID0gTlVMTDsKKworICBzd2l0Y2ggKHNlbGYtPnVwbWl4VHlwZSkgeworICAgIGNhc2UgVVBNSVhUWVBFX0JZUEFTUzoKKyAgICBjYXNlIFVQTUlYVFlQRV9OT1JNQUw6CisgICAgICBzd2l0Y2ggKHNlbGYtPnRyZWVDb25maWcpIHsKKyAgICAgICAgY2FzZSBUUkVFXzIxMjoKKyAgICAgICAgICBlcnIgPSBTcGF0aWFsRGVjQ2FsY3VsYXRlTTFhbmRNMl8yMTIoc2VsZiwgcHMsIGZyYW1lKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlcnIgPSBNUFNfV1JPTkdfVFJFRUNPTkZJRzsKKyAgICAgIH07CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnIgPSBNUFNfV1JPTkdfVFJFRUNPTkZJRzsKKyAgfQorCisgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgZ290byBiYWlsOworICB9CisKK2JhaWw6CisgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBTcGF0aWFsRGVjQ2FsY3VsYXRlTTFhbmRNMl8yMTIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIFJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBTQUNERUNfRVJST1IgU3BhdGlhbERlY0NhbGN1bGF0ZU0xYW5kTTJfMjEyKAorICAgIHNwYXRpYWxEZWMqIHNlbGYsIGludCBwcywgY29uc3QgU1BBVElBTF9CU19GUkFNRSogZnJhbWUpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgaW50IHBiOworCisgIEZJWFBfREJMIEgxMXJlW01BWF9QQVJBTUVURVJfQkFORFNdID0ge0ZMMkZYQ09OU1RfREJMKDAuMGYpfTsKKyAgRklYUF9EQkwgSDEycmVbTUFYX1BBUkFNRVRFUl9CQU5EU10gPSB7RkwyRlhDT05TVF9EQkwoMC4wZil9OworICBGSVhQX0RCTCBIMjFyZVtNQVhfUEFSQU1FVEVSX0JBTkRTXSA9IHtGTDJGWENPTlNUX0RCTCgwLjBmKX07CisgIEZJWFBfREJMIEgyMnJlW01BWF9QQVJBTUVURVJfQkFORFNdID0ge0ZMMkZYQ09OU1RfREJMKDAuMGYpfTsKKyAgRklYUF9EQkwgSDExaW1bTUFYX1BBUkFNRVRFUl9CQU5EU10gPSB7RkwyRlhDT05TVF9EQkwoMC4wZil9OworICBGSVhQX0RCTCBIMjFpbVtNQVhfUEFSQU1FVEVSX0JBTkRTXSA9IHtGTDJGWENPTlNUX0RCTCgwLjBmKX07CisKKyAgSU5UIHBoYXNlQ29kaW5nID0gc2VsZi0+cGhhc2VDb2Rpbmc7CisKKyAgc3dpdGNoIChwaGFzZUNvZGluZykgeworICAgIGNhc2UgMToKKyAgICAgIC8qIHBoYXNlIGNvZGluZzogeWVzOyByZXNpZHVhbHM6IG5vICovCisgICAgICBwYXJhbTJVTVhfUFNfSVBEX09QRF9fRkRLKHNlbGYsIGZyYW1lLCBIMTFyZSwgSDEycmUsIEgyMXJlLCBIMjJyZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgcHMsIHNlbGYtPnJlc2lkdWFsQmFuZHNbMF0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgLyogcGhhc2UgY29kaW5nOiB5ZXM7IHJlc2lkdWFsczogeWVzICovCisgICAgICBwYXJhbTJVTVhfUHJlZGljdGlvbl9fRkRLKHNlbGYsIEgxMXJlLCBIMTFpbSwgSDEycmUsIE5VTEwsIEgyMXJlLCBIMjFpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDIycmUsIE5VTEwsIDAsIHBzLCBzZWxmLT5yZXNpZHVhbEJhbmRzWzBdKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoc2VsZi0+cmVzaWR1YWxDb2RpbmcpIHsKKyAgICAgICAgLyogcGhhc2UgY29kaW5nOiBubzsgcmVzaWR1YWxzOiB5ZXMgKi8KKyAgICAgICAgcGFyYW0yVU1YX1ByZWRpY3Rpb25fX0ZESyhzZWxmLCBIMTFyZSwgTlVMTCwgSDEycmUsIE5VTEwsIEgyMXJlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyMnJlLCBOVUxMLCAwLCBwcywgc2VsZi0+cmVzaWR1YWxCYW5kc1swXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBwaGFzZSBjb2Rpbmc6IG5vOyByZXNpZHVhbHM6IG5vICovCisgICAgICAgIHBhcmFtMlVNWF9QU19fRkRLKHNlbGYsIEgxMXJlLCBIMTJyZSwgSDIxcmUsIEgyMnJlLCBOVUxMLCBOVUxMLCAwLCBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIGZvciAocGIgPSAwOyBwYiA8IHNlbGYtPm51bVBhcmFtZXRlckJhbmRzOyBwYisrKSB7CisgICAgc2VsZi0+TTJSZWFsX19GREtbMF1bMF1bcGJdID0gKEgxMXJlW3BiXSk7CisgICAgc2VsZi0+TTJSZWFsX19GREtbMF1bMV1bcGJdID0gKEgxMnJlW3BiXSk7CisKKyAgICBzZWxmLT5NMlJlYWxfX0ZES1sxXVswXVtwYl0gPSAoSDIxcmVbcGJdKTsKKyAgICBzZWxmLT5NMlJlYWxfX0ZES1sxXVsxXVtwYl0gPSAoSDIycmVbcGJdKTsKKyAgfQorICBpZiAocGhhc2VDb2RpbmcgPT0gMykgeworICAgIGZvciAocGIgPSAwOyBwYiA8IHNlbGYtPm51bVBhcmFtZXRlckJhbmRzOyBwYisrKSB7CisgICAgICBzZWxmLT5NMkltYWdfX0ZES1swXVswXVtwYl0gPSAoSDExaW1bcGJdKTsKKyAgICAgIHNlbGYtPk0ySW1hZ19fRkRLWzFdWzBdW3BiXSA9IChIMjFpbVtwYl0pOworICAgICAgc2VsZi0+TTJJbWFnX19GREtbMF1bMV1bcGJdID0gKEZJWFBfREJMKTA7ICAvLyBIMTJpbVtwYl07CisgICAgICBzZWxmLT5NMkltYWdfX0ZES1sxXVsxXVtwYl0gPSAoRklYUF9EQkwpMDsgIC8vIEgyMmltW3BiXTsKKyAgICB9CisgIH0KKworICBpZiAoc2VsZi0+cGhhc2VDb2RpbmcgPT0gMSkgeworICAgIFNwYXRpYWxEZWNTbW9vdGhPUEQoCisgICAgICAgIHNlbGYsIGZyYW1lLAorICAgICAgICBwcyk7IC8qIElOUFVUOiBQaGFzZUxlZnQsIFBoYXNlUmlnaHQsIChvcGRMZWZ0U3RhdGUsIG9wZFJpZ2h0U3RhdGUpICovCisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogcGFyYW0yVU1YX1BTX0NvcmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIFJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBhcmFtMlVNWF9QU19Db3JlX19GREsoCisgICAgY29uc3QgU0NIQVIgY2xkW01BWF9QQVJBTUVURVJfQkFORFNdLCBjb25zdCBTQ0hBUiBpY2NbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgY29uc3QgaW50IG51bU90dEJhbmRzLCBjb25zdCBpbnQgcmVzQmFuZHMsCisgICAgRklYUF9EQkwgSDExW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBIMTJbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgRklYUF9EQkwgSDIxW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBIMjJbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgRklYUF9EQkwgY19sW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBjX3JbTUFYX1BBUkFNRVRFUl9CQU5EU10pIHsKKyAgaW50IGJhbmQ7CisKKyAgaWYgKChjX2wgIT0gTlVMTCkgJiYgKGNfciAhPSBOVUxMKSkgeworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBudW1PdHRCYW5kczsgYmFuZCsrKSB7CisgICAgICBTcGF0aWFsRGVxdWFudEdldENMRFZhbHVlcyhjbGRbYmFuZF0sICZjX2xbYmFuZF0sICZjX3JbYmFuZF0pOworICAgIH0KKyAgfQorCisgIGJhbmQgPSAwOworICBGREtfQVNTRVJUKHJlc0JhbmRzID09IDApOworICBmb3IgKDsgYmFuZCA8IG51bU90dEJhbmRzOyBiYW5kKyspIHsKKyAgICAvKiBjb21wdXRlIG1peGluZyB2YXJpYWJsZXM6ICovCisgICAgY29uc3QgaW50IGlkeDEgPSBjbGRbYmFuZF07CisgICAgY29uc3QgaW50IGlkeDIgPSBpY2NbYmFuZF07CisgICAgSDExW2JhbmRdID0gRlhfQ0ZHMkZYX0RCTChIMTFfbmNbaWR4MV1baWR4Ml0pOworICAgIEgyMVtiYW5kXSA9IEZYX0NGRzJGWF9EQkwoSDExX25jWzMwIC0gaWR4MV1baWR4Ml0pOworICAgIEgxMltiYW5kXSA9IEZYX0NGRzJGWF9EQkwoSDEyX25jW2lkeDFdW2lkeDJdKTsKKyAgICBIMjJbYmFuZF0gPSBGWF9DRkcyRlhfREJMKC1IMTJfbmNbMzAgLSBpZHgxXVtpZHgyXSk7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IHBhcmFtMlVNWF9QUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGFyYW0yVU1YX1BTX19GREsoc3BhdGlhbERlYyogc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIEgxMVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIEgxMltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIEgyMVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIEgyMltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGNfbFtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGNfcltNQVhfUEFSQU1FVEVSX0JBTkRTXSwgaW50IG90dEJveEluZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyYW1ldGVyU2V0SW5keCwgaW50IHJlc2lkdWFsQmFuZHMpIHsKKyAgaW50IGJhbmQ7CisgIHBhcmFtMlVNWF9QU19Db3JlX19GREsoc2VsZi0+b3R0Q0xEX19GREtbb3R0Qm94SW5keF1bcGFyYW1ldGVyU2V0SW5keF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b3R0SUNDX19GREtbb3R0Qm94SW5keF1bcGFyYW1ldGVyU2V0SW5keF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+bnVtT3R0QmFuZHNbb3R0Qm94SW5keF0sIHJlc2lkdWFsQmFuZHMsIEgxMSwgSDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEgyMSwgSDIyLCBjX2wsIGNfcik7CisKKyAgZm9yIChiYW5kID0gc2VsZi0+bnVtT3R0QmFuZHNbb3R0Qm94SW5keF07IGJhbmQgPCBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kczsKKyAgICAgICBiYW5kKyspIHsKKyAgICBIMTFbYmFuZF0gPSBIMjFbYmFuZF0gPSBIMTJbYmFuZF0gPSBIMjJbYmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICB9Cit9CisKKyNkZWZpbmUgTl9DTEQgKDMxKQorI2RlZmluZSBOX0lQRCAoMTYpCisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBzaW5JcGRfdGFiW05fSVBEXSA9IHsKKyAgICBGSVhQX0RCTCgweDAwMDAwMDAwKSwgRklYUF9EQkwoMHgzMGZiYzU0ZSksIEZJWFBfREJMKDB4NWE4Mjc5OTkpLAorICAgIEZJWFBfREJMKDB4NzY0MWFmM2QpLCBGSVhQX0RCTCgweDdmZmZmZmZmKSwgRklYUF9EQkwoMHg3NjQxYWYzZCksCisgICAgRklYUF9EQkwoMHg1YTgyNzk5YSksIEZJWFBfREJMKDB4MzBmYmM1NGQpLCBGSVhQX0RCTCgweGZmZmZmZmZmKSwKKyAgICBGSVhQX0RCTCgweGNmMDQzYWIzKSwgRklYUF9EQkwoMHhhNTdkODY2NiksIEZJWFBfREJMKDB4ODliZTUwYzMpLAorICAgIEZJWFBfREJMKDB4ODAwMDAwMDApLCBGSVhQX0RCTCgweDg5YmU1MGMzKSwgRklYUF9EQkwoMHhhNTdkODY2NiksCisgICAgRklYUF9EQkwoMHhjZjA0M2FiMiksCit9OworCisvKiBjb3NJcGRbaV0gPSBzaW5JcGRbKGkrNCkmMTVdICovCisjZGVmaW5lIFNJTl9JUEQoYSkgKHNpbklwZF90YWJbKGEpXSkKKyNkZWZpbmUgQ09TX0lQRChhKSAoc2luSXBkX3RhYlsoKGEpICsgNCkgJiAxNV0pICAvLyhjb3NJcGRfdGFiWyhhKV0pCisKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBzcXJ0X29uZV9taW51c19JQ0MyWzhdID0geworICAgIEZMMkZYQ09OU1RfU0dMKDAuMGYpLAorICAgIEZMMkZYQ09OU1RfU0dMKDAuMzQ5MzI5MzU3NDgzNzM2ZiksCisgICAgRkwyRlhDT05TVF9TR0woMC41NDA3NTUyMTk2Njk2NzZmKSwKKyAgICBGTDJGWENPTlNUX1NHTCgwLjc5OTMwOTE3MjcyMzU0NmYpLAorICAgIEZMMkZYQ09OU1RfU0dMKDAuOTI5OTY4MTg3ODQzMDA0ZiksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKE1BWFZBTF9EQkwpLAorICAgIEZMMkZYQ09OU1RfU0dMKDAuODA4MTMzMDMzNjAyNzZmKSwKKyAgICBGTDJGWENPTlNUX1NHTCgwLjE0MTA2NzM1OTc5NjY1OWYpLAorfTsKKworLyogZXhwb25lbnQgb2Ygc3FydChDTEQpICovCitzdGF0aWMgY29uc3QgU0NIQVIgc3FydF9DTERfZVtOX0NMRF0gPSB7CisgICAgLTI0LCAtNywgLTYsIC01LCAtNCwgLTQsIC0zLCAtMywgLTIsIC0yLCAtMSwgLTEsIDAsIDAsIDAsIDEsCisgICAgMSwgICAxLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDcsIDgsIDI1fTsKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIHNxcnRfQ0xEX21bTl9DTERdID0geworICAgIEZMMkZYQ09OU1RfREJMKDAuNTMwNTQyMTUzNTY2MTk1ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MTk3OTY4OTYyNDM2NDdmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY0ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NjkwNDk0MTEyMTI0NTVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUwNTk2NDQyNTYyNjk0MWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODk5NzQ2MTIwMzA0NTU5ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MzU0NjI1ODc3Nzk0MjVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg5NzYxNDc2MzQ0MTU3MWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjMzOTU3Mjc2OTg0NDQ1ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44OTU0ODg0NTU0MjczMzZmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYzMjQ1NTUzMjAzMzY3NmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzk2MjE0MzQxMTA2OTk1ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MDExODcyMzM2MjcyNzJmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYzMDk1NzM0NDQ4MDE5M2YpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzk0MzI4MjM0NzI0MjgxZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42Mjk0NjI3MDU4OTcwODRmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc5MjQ0NjU5NjIzMDU1N2YpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTk3NjMxMTU3NDg0NDRmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYyNzk3MTYwNzg3NzM5NWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzkwNTY5NDE1MDQyMDk1ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NTgzNTQ0OTAxODg3MDRmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc4ODY5NjY4MDYwMDI0MmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTU3MDMxODM2MzMzNTkxZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43ODY4MjgzODIzNzEzNTVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU1NTcxMjMxNTYzNzE2M2YpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTg4MjExNzY4ODAyNjE5ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44Nzg2NTgzMjA2MDk5MmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzgxMjVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY5NDY0MDM5NDU0NjQ1NGYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTQyNDMyMTgzMDc3NDQ4ZiksCit9OworCitzdGF0aWMgY29uc3QgRklYUF9EQkwgQ0xEX21bTl9DTERdID0geworICAgIEZMMkZYQ09OU1RfREJMKDAuMjgxNDc0OTc2NzEwNjU2ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MTgxMDc1NzE4NDE5ODdmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQwOTZmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjMyMzgxNzIzMjQwMTI0MmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMjU2ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MDk1NDMwODEwMDMxMDVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQwMzgxMjcwMDQ2NzMyNGYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODA1NzEyMjYzNTQ4MjY3ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MDE5MDE4MjkwNDE1MzNmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgwMTg5OTU3MzgwMzYzNmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNGYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjMzOTU3Mjc2OTg0NDQ1ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC4yNTExODg2NDMxNTA5NThmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjM5ODEwNzE3MDU1MzQ5N2YpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjMwOTU3MzQ0NDgwMTkzZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC4yNWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMzk2MjIzMjk4MTE1Mjc4ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42Mjc5NzE2MDc4NzczOTVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk5NTI2NzkyNjM4Mzc0M2YpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMzk0MzQ4MzQwMzAwMTIxZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MjVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjMxMTc1OTczNjcxMzg4N2YpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjIyMDQyNDUzOTg5ODRmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjMxMDI4NDQ2NjY4OTE3MmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjE5MDk4OTAzMzA1MTIzZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC4zMDg4MTYxNzc3NTA4MThmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk3NjU2MjVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc3MjA0MDQ0NDM3NzA0NmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjEwMzUxNTYyNWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDgyNTI1Mjc3NzM1NjU0ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44ODgxNzg0MTk3MDAxMjUpLAorfTsKKworc3RhdGljIEZJWFBfREJMIGRlcXVhbnRJUERfQ0xEX0lDQ19zcGxpdEFuZ2xlX19GREtfRnVuY3Rpb24oSU5UIGlwZElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjbGRJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaWNjSWR4KSB7CisgIEZJWFBfREJMIGNsZDsKKyAgU3BhdGlhbERlcXVhbnRHZXRDTEQyVmFsdWVzKGNsZElkeCwgJmNsZCk7CisKKyAgLypjb25zdCBGSVhQX0RCTCBvbmVfbSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICBjb25zdCBpbnQgb25lX2UgPSAwOyovCisgIGNvbnN0IEZJWFBfREJMIG9uZV9tID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CisgIGNvbnN0IGludCBvbmVfZSA9IDE7CisgIC8qIGlpZExpbiA9IHNxcnQoY2xkKTsgKi8KKyAgRklYUF9EQkwgaWlkTGluX20gPSBzcXJ0X0NMRF9tW2NsZElkeF07CisgIGludCBpaWRMaW5fZSA9IHNxcnRfQ0xEX2VbY2xkSWR4XTsKKyAgLyogaWlkTGluMiA9IGNsZDsgKi8KKyAgRklYUF9EQkwgaWlkTGluMl9tID0gQ0xEX21bY2xkSWR4XTsKKyAgaW50IGlpZExpbjJfZSA9IHNxcnRfQ0xEX2VbY2xkSWR4XSA8PCAxOworICAvKiBpaWRMaW4yMSA9IGlpZExpbjIgKyAxLjBmOyAqLworICBpbnQgaWlkTGluMjFfZTsKKyAgRklYUF9EQkwgaWlkTGluMjFfbSA9CisgICAgICBmQWRkTm9ybShpaWRMaW4yX20sIGlpZExpbjJfZSwgb25lX20sIG9uZV9lLCAmaWlkTGluMjFfZSk7CisgIC8qIGlpZEljYzIgPSBpaWRMaW4gKiBpY2MgKiAyLjBmOyAqLworICBGSVhQX0NGRyBpY2MgPSBkZXF1YW50SUNDX19GREtbaWNjSWR4XTsKKyAgRklYUF9EQkwgdGVtcDFfbSwgdGVtcDFjX207CisgIGludCB0ZW1wMV9lLCB0ZW1wMWNfZTsKKyAgdGVtcDFfbSA9IGZNdWx0KGlpZExpbl9tLCBpY2MpOworICB0ZW1wMV9lID0gaWlkTGluX2UgKyAxOworCisgIEZJWFBfREJMIGNvc0lwZCwgc2luSXBkOworICBjb3NJcGQgPSBDT1NfSVBEKGlwZElkeCk7CisgIHNpbklwZCA9IFNJTl9JUEQoaXBkSWR4KTsKKworICB0ZW1wMWNfbSA9IGZNdWx0KHRlbXAxX20sIGNvc0lwZCk7CisgIHRlbXAxY19lID0gdGVtcDFfZTsgIC8vK2Nvc0lwZF9lOworCisgIGludCB0ZW1wMl9lLCB0ZW1wM19lLCBpbnZfdGVtcDNfZSwgcmF0aW9fZTsKKyAgRklYUF9EQkwgdGVtcDJfbSA9CisgICAgICBmQWRkTm9ybShpaWRMaW4yMV9tLCBpaWRMaW4yMV9lLCB0ZW1wMWNfbSwgdGVtcDFjX2UsICZ0ZW1wMl9lKTsKKyAgRklYUF9EQkwgdGVtcDNfbSA9CisgICAgICBmQWRkTm9ybShpaWRMaW4yMV9tLCBpaWRMaW4yMV9lLCB0ZW1wMV9tLCB0ZW1wMV9lLCAmdGVtcDNfZSk7CisgIC8qIGNhbGN1bGF0ZSAxL3RlbXAzIG5lZWRlZCBsYXRlciAqLworICBpbnZfdGVtcDNfZSA9IHRlbXAzX2U7CisgIEZJWFBfREJMIGludl90ZW1wM19tID0gaW52Rml4cCh0ZW1wM19tLCAmaW52X3RlbXAzX2UpOworICBGSVhQX0RCTCByYXRpb19tID0KKyAgICAgIGZBZGROb3JtKGZNdWx0KGludl90ZW1wM19tLCB0ZW1wMl9tKSwgKGludl90ZW1wM19lICsgdGVtcDJfZSksCisgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxZS05ZiksIDAsICZyYXRpb19lKTsKKworICBpbnQgd2VpZ2h0Ml9lLCB0ZW1wYl9hdGFuMl9lOworICBGSVhQX0RCTCB3ZWlnaHQyX20gPQorICAgICAgZlBvdyhyYXRpb19tLCByYXRpb19lLCBGTDJGWENPTlNUX0RCTCgwLjVmKSwgLTEsICZ3ZWlnaHQyX2UpOworICAvKiBhdGFuMih3MipzaW5JcGQsIHcxKmlpZExpbiArIHcyKmNvc0lwZCkgPSBhdGFuMih3MipzaW5JcGQsICgyIC0gdzIpKmlpZExpbgorICAgKiArIHcyKmNvc0lwZCkgPSBhdGFuMih3MipzaW5JcGQsIDIqaWlkTGluICsgdzIqKGNvc0lwZCAtIGlpZExpbikpOyAqLworICAvKiB0bXBhX2F0YW4yID0gdzIqc2luSXBkOyB0bXBiX2F0YW4yID0gMippaWRMaW4gKyB3MiooY29zSXBkIC0gaWlkTGluKTsgKi8KKyAgRklYUF9EQkwgdGVtcGJfYXRhbjJfbSA9IGlpZExpbl9tOworICB0ZW1wYl9hdGFuMl9lID0gaWlkTGluX2UgKyAxOworICBpbnQgYWRkX3RtcDFfZSA9IDA7CisgIEZJWFBfREJMIGFkZF90bXAxX20gPSBmQWRkTm9ybShjb3NJcGQsIDAsIC1paWRMaW5fbSwgaWlkTGluX2UsICZhZGRfdG1wMV9lKTsKKyAgRklYUF9EQkwgYWRkX3RtcDJfbSA9IGZNdWx0KGFkZF90bXAxX20sIHdlaWdodDJfbSk7CisgIGludCBhZGRfdG1wMl9lID0gYWRkX3RtcDFfZSArIHdlaWdodDJfZTsKKyAgdGVtcGJfYXRhbjJfbSA9IGZBZGROb3JtKHRlbXBiX2F0YW4yX20sIHRlbXBiX2F0YW4yX2UsIGFkZF90bXAyX20sIGFkZF90bXAyX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcGJfYXRhbjJfZSk7CisKKyAgRklYUF9EQkwgdGVtcGFfYXRhbjJfbSA9IGZNdWx0KHdlaWdodDJfbSwgc2luSXBkKTsKKyAgaW50IHRlbXBhX2F0YW4yX2UgPSB3ZWlnaHQyX2U7ICAvLyArIHNpbklwZF9lOworCisgIGlmICh0ZW1wYV9hdGFuMl9lID4gdGVtcGJfYXRhbjJfZSkgeworICAgIHRlbXBiX2F0YW4yX20gPSAodGVtcGJfYXRhbjJfbSA+PiAodGVtcGFfYXRhbjJfZSAtIHRlbXBiX2F0YW4yX2UpKTsKKyAgICB0ZW1wYl9hdGFuMl9lID0gdGVtcGFfYXRhbjJfZTsKKyAgfSBlbHNlIGlmICh0ZW1wYl9hdGFuMl9lID4gdGVtcGFfYXRhbjJfZSkgeworICAgIHRlbXBhX2F0YW4yX20gPSAodGVtcGFfYXRhbjJfbSA+PiAodGVtcGJfYXRhbjJfZSAtIHRlbXBhX2F0YW4yX2UpKTsKKyAgfQorCisgIHJldHVybiBmaXhwX2F0YW4yKHRlbXBhX2F0YW4yX20sIHRlbXBiX2F0YW4yX20pOworfQorCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVPcGQoc3BhdGlhbERlYyogc2VsZiwgSU5UIG90dEJveEluZHgsIElOVCBwYXJhbWV0ZXJTZXRJbmR4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIG9wZFtNQVhfUEFSQU1FVEVSX0JBTkRTXSkgeworICBJTlQgYmFuZDsKKworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgc2VsZi0+bnVtT3R0QmFuZHNJUEQ7IGJhbmQrKykgeworICAgIElOVCBpZHhDbGQgPSBzZWxmLT5vdHRDTERfX0ZES1tvdHRCb3hJbmR4XVtwYXJhbWV0ZXJTZXRJbmR4XVtiYW5kXTsKKyAgICBJTlQgaWR4SXBkID0gc2VsZi0+b3R0SVBEX19GREtbb3R0Qm94SW5keF1bcGFyYW1ldGVyU2V0SW5keF1bYmFuZF07CisgICAgSU5UIGlkeEljYyA9IHNlbGYtPm90dElDQ19fRkRLW290dEJveEluZHhdW3BhcmFtZXRlclNldEluZHhdW2JhbmRdOworICAgIEZJWFBfREJMIGNsZCwgaXBkOworCisgICAgaXBkID0gRlhfQ0ZHMkZYX0RCTChkZXF1YW50SVBEX19GREtbaWR4SXBkXSk7CisKKyAgICBTcGF0aWFsRGVxdWFudEdldENMRDJWYWx1ZXMoaWR4Q2xkLCAmY2xkKTsKKworICAgIC8qIGlwZChpZHhJcGQ9PTgpID09IFBJICovCisgICAgaWYgKChjbGQgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChpZHhJcGQgPT0gOCkpIHsKKyAgICAgIG9wZFsyICogYmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICB9IGVsc2UgeworICAgICAgb3BkWzIgKiBiYW5kXSA9IChkZXF1YW50SVBEX0NMRF9JQ0Nfc3BsaXRBbmdsZV9fRkRLX0Z1bmN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4SXBkLCBpZHhDbGQsIGlkeEljYykgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgKElQRF9TQ0FMRSAtIEFUMk9fU0YpKTsKKyAgICB9CisgICAgb3BkWzIgKiBiYW5kICsgMV0gPSBvcGRbMiAqIGJhbmRdIC0gaXBkOworICB9Cit9CisKKy8qIHdyYXAgcGhhc2UgaW4gcmFkIHRvIHRoZSByYW5nZSBvZiAwIDw9IHggPCAyKnBpICovCitzdGF0aWMgRklYUF9EQkwgd3JhcFBoYXNlKEZJWFBfREJMIHBoYXNlKSB7CisgIHdoaWxlIChwaGFzZSA8IChGSVhQX0RCTCkwKSBwaGFzZSArPSBQSXgyX19JUEQ7CisgIHdoaWxlIChwaGFzZSA+PSBQSXgyX19JUEQpIHBoYXNlIC09IFBJeDJfX0lQRDsKKyAgRkRLX0FTU0VSVCgocGhhc2UgPj0gKEZJWFBfREJMKTApICYmIChwaGFzZSA8IFBJeDJfX0lQRCkpOworCisgIHJldHVybiBwaGFzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IHBhcmFtMlVNWF9QU19JUEQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIFJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBhcmFtMlVNWF9QU19JUERfT1BEX19GREsoCisgICAgc3BhdGlhbERlYyogc2VsZiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSogZnJhbWUsCisgICAgRklYUF9EQkwgSDExW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBIMTJbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgRklYUF9EQkwgSDIxW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBIMjJbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgRklYUF9EQkwgY19sW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBjX3JbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgaW50IG90dEJveEluZHgsIGludCBwYXJhbWV0ZXJTZXRJbmR4LCBpbnQgcmVzaWR1YWxCYW5kcykgeworICBJTlQgYmFuZDsKKyAgRklYUF9EQkwgb3BkWzIgKiBNQVhfUEFSQU1FVEVSX0JBTkRTXTsKKyAgSU5UIG51bU90dEJhbmRzID0gc2VsZi0+bnVtT3R0QmFuZHNbb3R0Qm94SW5keF07CisgIElOVCBudW1JcGRCYW5kczsKKworICBudW1JcGRCYW5kcyA9IGZyYW1lLT5waGFzZU1vZGUgPyBzZWxmLT5udW1PdHRCYW5kc0lQRCA6IDA7CisKKyAgRkRLX0FTU0VSVChzZWxmLT5yZXNpZHVhbENvZGluZyA9PSAwKTsKKworICBwYXJhbTJVTVhfUFNfQ29yZV9fRkRLKHNlbGYtPm90dENMRF9fRkRLW290dEJveEluZHhdW3BhcmFtZXRlclNldEluZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm90dElDQ19fRkRLW290dEJveEluZHhdW3BhcmFtZXRlclNldEluZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm51bU90dEJhbmRzW290dEJveEluZHhdLCByZXNpZHVhbEJhbmRzLCBIMTEsIEgxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIMjEsIEgyMiwgY19sLCBjX3IpOworCisgIGZvciAoYmFuZCA9IHNlbGYtPm51bU90dEJhbmRzW290dEJveEluZHhdOyBiYW5kIDwgc2VsZi0+bnVtUGFyYW1ldGVyQmFuZHM7CisgICAgICAgYmFuZCsrKSB7CisgICAgSDExW2JhbmRdID0gSDIxW2JhbmRdID0gSDEyW2JhbmRdID0gSDIyW2JhbmRdID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgfQorCisgIGlmIChmcmFtZS0+cGhhc2VNb2RlKSB7CisgICAgY2FsY3VsYXRlT3BkKHNlbGYsIG90dEJveEluZHgsIHBhcmFtZXRlclNldEluZHgsIG9wZCk7CisKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtSXBkQmFuZHM7IGJhbmQrKykgeworICAgICAgc2VsZi0+UGhhc2VMZWZ0X19GREtbYmFuZF0gPSB3cmFwUGhhc2Uob3BkWzIgKiBiYW5kXSk7CisgICAgICBzZWxmLT5QaGFzZVJpZ2h0X19GREtbYmFuZF0gPSB3cmFwUGhhc2Uob3BkWzIgKiBiYW5kICsgMV0pOworICAgIH0KKyAgfQorCisgIGZvciAoYmFuZCA9IG51bUlwZEJhbmRzOyBiYW5kIDwgbnVtT3R0QmFuZHM7IGJhbmQrKykgeworICAgIHNlbGYtPlBoYXNlTGVmdF9fRkRLW2JhbmRdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgc2VsZi0+UGhhc2VSaWdodF9fRkRLW2JhbmRdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIH0KK30KKworRkRLX0lOTElORSB2b2lkIHBhcmFtMlVNWF9QcmVkaWN0aW9uX0NvcmVfX0ZESygKKyAgICBGSVhQX0RCTCogSDExcmUsIEZJWFBfREJMKiBIMTFpbSwgRklYUF9EQkwqIEgxMnJlLCBGSVhQX0RCTCogSDEyaW0sCisgICAgRklYUF9EQkwqIEgyMXJlLCBGSVhQX0RCTCogSDIxaW0sIEZJWFBfREJMKiBIMjJyZSwgRklYUF9EQkwqIEgyMmltLAorICAgIGludCBjbGRJZHgsIGludCBpY2NJZHgsIGludCBpcGRJZHgsIGludCBiYW5kLCBpbnQgbnVtT3R0QmFuZHNJUEQsCisgICAgaW50IHJlc0JhbmRzKSB7CisjZGVmaW5lIE1BWF9XRUlHSFQgKDEuMmYpCisgIEZES19BU1NFUlQoKEgxMmltID09IE5VTEwpICYmIChIMjJpbSA9PSBOVUxMKSk7IC8qIGFsd2F5cyA9PSAwICovCisKKyAgaWYgKChiYW5kIDwgbnVtT3R0QmFuZHNJUEQpICYmIChjbGRJZHggPT0gMTUpICYmIChpY2NJZHggPT0gMCkgJiYKKyAgICAgIChpcGRJZHggPT0gOCkpIHsKKyAgICBjb25zdCBGSVhQX0RCTCBnYWluID0KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMC41ZiAvIE1BWF9XRUlHSFQpID4+IFNDQUxFX1BBUkFNX00yXzIxMl9QUkVEOworCisgICAgKkgxMXJlID0gZ2FpbjsKKyAgICBpZiAoYmFuZCA8IHJlc0JhbmRzKSB7CisgICAgICAqSDIxcmUgPSBnYWluOworICAgICAgKkgxMnJlID0gZ2FpbjsKKyAgICAgICpIMjJyZSA9IC1nYWluOworICAgIH0gZWxzZSB7CisgICAgICAqSDIxcmUgPSAtZ2FpbjsKKyAgICAgICpIMTJyZSA9IChGSVhQX0RCTCkwOworICAgICAgKkgyMnJlID0gKEZJWFBfREJMKTA7CisgICAgfQorICAgIGlmICgoSDExaW0gIT0gTlVMTCkgJiYKKyAgICAgICAgKEgyMWltICE9IE5VTEwpIC8qJiYgKEgxMmltIT1OVUxMKSAmJiAoSDIyaW0hPU5VTEwpKi8pIHsKKyAgICAgICpIMTFpbSA9IChGSVhQX0RCTCkwOworICAgICAgKkgyMWltID0gKEZJWFBfREJMKTA7CisgICAgICAvKiAqSDEyaW0gPSAoRklYUF9EQkwpMDsgKi8KKyAgICAgIC8qICpIMjJpbSA9IChGSVhQX0RCTCkwOyAqLworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBGSVhQX0RCTCBvbmVfbSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgIGNvbnN0IGludCBvbmVfZSA9IDA7CisgICAgLyogaWlkTGluID0gc3FydChjbGQpOyAqLworICAgIEZJWFBfREJMIGlpZExpbl9tID0gc3FydF9DTERfbVtjbGRJZHhdOworICAgIGludCBpaWRMaW5fZSA9IHNxcnRfQ0xEX2VbY2xkSWR4XTsKKyAgICAvKiBpaWRMaW4yID0gY2xkOyAqLworICAgIEZJWFBfREJMIGlpZExpbjJfbSA9IENMRF9tW2NsZElkeF07CisgICAgaW50IGlpZExpbjJfZSA9IHNxcnRfQ0xEX2VbY2xkSWR4XSA8PCAxOworICAgIC8qIGlpZExpbjIxID0gaWlkTGluMiArIDEuMGY7ICovCisgICAgaW50IGlpZExpbjIxX2U7CisgICAgRklYUF9EQkwgaWlkTGluMjFfbSA9CisgICAgICAgIGZBZGROb3JtKGlpZExpbjJfbSwgaWlkTGluMl9lLCBvbmVfbSwgb25lX2UsICZpaWRMaW4yMV9lKTsKKyAgICAvKiBpaWRJY2MyID0gaWlkTGluICogaWNjICogMi4wZjsgKi8KKyAgICBGSVhQX0NGRyBpY2MgPSBkZXF1YW50SUNDX19GREtbaWNjSWR4XTsKKyAgICBpbnQgaWlkSWNjMl9lID0gaWlkTGluX2UgKyAxOworICAgIEZJWFBfREJMIGlpZEljYzJfbSA9IGZNdWx0KGlpZExpbl9tLCBpY2MpOworICAgIEZJWFBfREJMIHRlbXBfbSwgc3FydF90ZW1wX20sIGludl90ZW1wX20sIHdlaWdodF9tOworICAgIGludCB0ZW1wX2UsIHNxcnRfdGVtcF9lLCBpbnZfdGVtcF9lLCB3ZWlnaHRfZSwgc2NhbGU7CisgICAgRklYUF9EQkwgY29zSXBkLCBzaW5JcGQ7CisKKyAgICBjb3NJcGQgPSBDT1NfSVBEKChiYW5kIDwgbnVtT3R0QmFuZHNJUEQpID8gaXBkSWR4IDogMCk7CisgICAgc2luSXBkID0gU0lOX0lQRCgoYmFuZCA8IG51bU90dEJhbmRzSVBEKSA/IGlwZElkeCA6IDApOworCisgICAgLyogdGVtcCAgICA9IGlpZExpbjIxICsgaWlkSWNjMiAqIGNvc0lwZDsgKi8KKyAgICB0ZW1wX20gPSBmQWRkTm9ybShpaWRMaW4yMV9tLCBpaWRMaW4yMV9lLCBmTXVsdChpaWRJY2MyX20sIGNvc0lwZCksCisgICAgICAgICAgICAgICAgICAgICAgaWlkSWNjMl9lLCAmdGVtcF9lKTsKKworICAgIC8qIGNhbGN1bGF0ZSAxL3RlbXAgbmVlZGVkIGxhdGVyICovCisgICAgaW52X3RlbXBfZSA9IHRlbXBfZTsKKyAgICBpbnZfdGVtcF9tID0gaW52Rml4cCh0ZW1wX20sICZpbnZfdGVtcF9lKTsKKworICAgIC8qIDEvd2VpZ2h0ID0gc3FydCh0ZW1wKSAqIDEvc3FydChpaWRMaW4yMSkgKi8KKyAgICBpZiAodGVtcF9lICYgMSkgeworICAgICAgc3FydF90ZW1wX20gPSB0ZW1wX20gPj4gMTsKKyAgICAgIHNxcnRfdGVtcF9lID0gKHRlbXBfZSArIDEpID4+IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHNxcnRfdGVtcF9tID0gdGVtcF9tOworICAgICAgc3FydF90ZW1wX2UgPSB0ZW1wX2UgPj4gMTsKKyAgICB9CisgICAgc3FydF90ZW1wX20gPSBzcXJ0Rml4cChzcXJ0X3RlbXBfbSk7CisgICAgaWYgKGlpZExpbjIxX2UgJiAxKSB7CisgICAgICBpaWRMaW4yMV9lICs9IDE7CisgICAgICBpaWRMaW4yMV9tID4+PSAxOworICAgIH0KKyAgICAvKiB3ZWlnaHRfW20sZV0gaXMgYWN0dWFsbHkgMS93ZWlnaHQgaW4gdGhlIG5leHQgZmV3IGxpbmVzICovCisgICAgd2VpZ2h0X20gPSBpbnZTcXJ0Tm9ybTIoaWlkTGluMjFfbSwgJndlaWdodF9lKTsKKyAgICB3ZWlnaHRfZSAtPSBpaWRMaW4yMV9lID4+IDE7CisgICAgd2VpZ2h0X20gPSBmTXVsdChzcXJ0X3RlbXBfbSwgd2VpZ2h0X20pOworICAgIHdlaWdodF9lICs9IHNxcnRfdGVtcF9lOworICAgIHNjYWxlID0gZk5vcm0od2VpZ2h0X20pOworICAgIHdlaWdodF9tID0gc2NhbGVWYWx1ZSh3ZWlnaHRfbSwgc2NhbGUpOworICAgIHdlaWdodF9lIC09IHNjYWxlOworICAgIC8qIHdlaWdodCA9IDAuNSAqIG1heCgxL3dlaWdodCwgMS9tYXhXZWlnaHQpICovCisgICAgaWYgKCh3ZWlnaHRfZSA8IDApIHx8CisgICAgICAgICgod2VpZ2h0X2UgPT0gMCkgJiYgKHdlaWdodF9tIDwgRkwyRlhDT05TVF9EQkwoMS5mIC8gTUFYX1dFSUdIVCkpKSkgeworICAgICAgd2VpZ2h0X20gPSBGTDJGWENPTlNUX0RCTCgxLmYgLyBNQVhfV0VJR0hUKTsKKyAgICAgIHdlaWdodF9lID0gMDsKKyAgICB9CisgICAgd2VpZ2h0X2UgLT0gMTsKKworICAgIHsKKyAgICAgIEZJWFBfREJMIGFscGhhUmVfbSwgYWxwaGFJbV9tLCBhY2N1X207CisgICAgICBpbnQgYWxwaGFSZV9lLCBhbHBoYUltX2UsIGFjY3VfZTsKKyAgICAgIC8qIGFscGhhUmUgPSAoMS4wZiAtIGlpZExpbjIpIC8gdGVtcDsgKi8KKyAgICAgIGFscGhhUmVfbSA9IGZBZGROb3JtKG9uZV9tLCBvbmVfZSwgLWlpZExpbjJfbSwgaWlkTGluMl9lLCAmYWxwaGFSZV9lKTsKKyAgICAgIGFscGhhUmVfbSA9IGZNdWx0KGFscGhhUmVfbSwgaW52X3RlbXBfbSk7CisgICAgICBhbHBoYVJlX2UgKz0gaW52X3RlbXBfZTsKKworICAgICAgLyogSDExcmUgPSB3ZWlnaHQgLSBhbHBoYVJlICogd2VpZ2h0OyAqLworICAgICAgLyogSDIxcmUgPSB3ZWlnaHQgKyBhbHBoYVJlICogd2VpZ2h0OyAqLworICAgICAgYWNjdV9tID0gZk11bHQoYWxwaGFSZV9tLCB3ZWlnaHRfbSk7CisgICAgICBhY2N1X2UgPSBhbHBoYVJlX2UgKyB3ZWlnaHRfZTsKKyAgICAgIHsKKyAgICAgICAgaW50IGFjY3UyX2U7CisgICAgICAgIEZJWFBfREJMIGFjY3UyX207CisgICAgICAgIGFjY3UyX20gPSBmQWRkTm9ybSh3ZWlnaHRfbSwgd2VpZ2h0X2UsIC1hY2N1X20sIGFjY3VfZSwgJmFjY3UyX2UpOworICAgICAgICAqSDExcmUgPSBzY2FsZVZhbHVlKGFjY3UyX20sIGFjY3UyX2UgLSBTQ0FMRV9QQVJBTV9NMl8yMTJfUFJFRCk7CisgICAgICAgIGFjY3UyX20gPSBmQWRkTm9ybSh3ZWlnaHRfbSwgd2VpZ2h0X2UsIGFjY3VfbSwgYWNjdV9lLCAmYWNjdTJfZSk7CisgICAgICAgICpIMjFyZSA9IHNjYWxlVmFsdWUoYWNjdTJfbSwgYWNjdTJfZSAtIFNDQUxFX1BBUkFNX00yXzIxMl9QUkVEKTsKKyAgICAgIH0KKworICAgICAgaWYgKChIMTFpbSAhPSBOVUxMKSAmJgorICAgICAgICAgIChIMjFpbSAhPSBOVUxMKSAvKiYmIChIMTJpbSAhPSBOVUxMKSAmJiAoSDIyaW0gIT0gTlVMTCkqLykgeworICAgICAgICAvKiBhbHBoYUltID0gLWlpZEljYzIgKiBzaW5JcGQgLyB0ZW1wOyAqLworICAgICAgICBhbHBoYUltX20gPSBmTXVsdCgtaWlkSWNjMl9tLCBzaW5JcGQpOworICAgICAgICBhbHBoYUltX20gPSBmTXVsdChhbHBoYUltX20sIGludl90ZW1wX20pOworICAgICAgICBhbHBoYUltX2UgPSBpaWRJY2MyX2UgKyBpbnZfdGVtcF9lOworICAgICAgICAvKiBIMTFpbSA9IC1hbHBoYUltICogd2VpZ2h0OyAqLworICAgICAgICAvKiBIMjFpbSA9ICBhbHBoYUltICogd2VpZ2h0OyAqLworICAgICAgICBhY2N1X20gPSBmTXVsdChhbHBoYUltX20sIHdlaWdodF9tKTsKKyAgICAgICAgYWNjdV9lID0gYWxwaGFJbV9lICsgd2VpZ2h0X2U7CisgICAgICAgIGFjY3VfbSA9IHNjYWxlVmFsdWUoYWNjdV9tLCBhY2N1X2UgLSBTQ0FMRV9QQVJBTV9NMl8yMTJfUFJFRCk7CisgICAgICAgICpIMTFpbSA9IC1hY2N1X207CisgICAgICAgICpIMjFpbSA9IGFjY3VfbTsKKworICAgICAgICAvKiAqSDEyaW0gPSAoRklYUF9EQkwpMDsgKi8KKyAgICAgICAgLyogKkgyMmltID0gKEZJWFBfREJMKTA7ICovCisgICAgICB9CisgICAgfQorICAgIGlmIChiYW5kIDwgcmVzQmFuZHMpIHsKKyAgICAgIEZJWFBfREJMIHdlaWdodCA9CisgICAgICAgICAgc2NhbGVWYWx1ZSh3ZWlnaHRfbSwgd2VpZ2h0X2UgLSBTQ0FMRV9QQVJBTV9NMl8yMTJfUFJFRCk7CisgICAgICAqSDEycmUgPSB3ZWlnaHQ7CisgICAgICAqSDIycmUgPSAtd2VpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAvKiBiZXRhID0gMi4wZiAqIGlpZExpbiAqIChmbG9hdCkgc3FydCgxLjBmIC0gaWNjICogaWNjKSAqIHdlaWdodCAvIHRlbXA7CisgICAgICAgKi8KKyAgICAgIEZJWFBfREJMIGJldGFfbTsKKyAgICAgIGludCBiZXRhX2U7CisgICAgICBiZXRhX20gPSBGWF9TR0wyRlhfREJMKHNxcnRfb25lX21pbnVzX0lDQzJbaWNjSWR4XSk7CisgICAgICBiZXRhX2UgPSAxOyAvKiBtdWx0aXBpY2F0aW9uIHdpdGggMi4wZiAqLworICAgICAgYmV0YV9tID0gZk11bHQoYmV0YV9tLCB3ZWlnaHRfbSk7CisgICAgICBiZXRhX2UgKz0gd2VpZ2h0X2U7CisgICAgICBiZXRhX20gPSBmTXVsdChiZXRhX20sIGlpZExpbl9tKTsKKyAgICAgIGJldGFfZSArPSBpaWRMaW5fZTsKKyAgICAgIGJldGFfbSA9IGZNdWx0KGJldGFfbSwgaW52X3RlbXBfbSk7CisgICAgICBiZXRhX2UgKz0gaW52X3RlbXBfZTsKKworICAgICAgYmV0YV9tID0gc2NhbGVWYWx1ZShiZXRhX20sIGJldGFfZSAtIFNDQUxFX1BBUkFNX00yXzIxMl9QUkVEKTsKKyAgICAgICpIMTJyZSA9IGJldGFfbTsKKyAgICAgICpIMjJyZSA9IC1iZXRhX207CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHBhcmFtMlVNWF9QcmVkaWN0aW9uX19GREsoc3BhdGlhbERlYyogc2VsZiwgRklYUF9EQkwqIEgxMXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogSDExaW0sIEZJWFBfREJMKiBIMTJyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIEgxMmltLCBGSVhQX0RCTCogSDIxcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBIMjFpbSwgRklYUF9EQkwqIEgyMnJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogSDIyaW0sIGludCBvdHRCb3hJbmR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyYW1ldGVyU2V0SW5keCwgaW50IHJlc0JhbmRzKSB7CisgIGludCBiYW5kOworICBGREtfQVNTRVJUKChIMTJpbSA9PSBOVUxMKSAmJiAoSDIyaW0gPT0gTlVMTCkpOyAvKiBhbHdheXMgPT0gMCAqLworCisgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kczsgYmFuZCsrKSB7CisgICAgaW50IGNsZElkeCA9IHNlbGYtPm90dENMRF9fRkRLW290dEJveEluZHhdW3BhcmFtZXRlclNldEluZHhdW2JhbmRdOworICAgIGludCBpY2NJZHggPSBzZWxmLT5vdHRJQ0NfX0ZES1tvdHRCb3hJbmR4XVtwYXJhbWV0ZXJTZXRJbmR4XVtiYW5kXTsKKyAgICBpbnQgaXBkSWR4ID0gc2VsZi0+b3R0SVBEX19GREtbb3R0Qm94SW5keF1bcGFyYW1ldGVyU2V0SW5keF1bYmFuZF07CisKKyAgICBwYXJhbTJVTVhfUHJlZGljdGlvbl9Db3JlX19GREsoCisgICAgICAgICZIMTFyZVtiYW5kXSwgKEgxMWltID8gJkgxMWltW2JhbmRdIDogTlVMTCksICZIMTJyZVtiYW5kXSwgTlVMTCwKKyAgICAgICAgJkgyMXJlW2JhbmRdLCAoSDIxaW0gPyAmSDIxaW1bYmFuZF0gOiBOVUxMKSwgJkgyMnJlW2JhbmRdLCBOVUxMLCBjbGRJZHgsCisgICAgICAgIGljY0lkeCwgaXBkSWR4LCBiYW5kLCBzZWxmLT5udW1PdHRCYW5kc0lQRCwgcmVzQmFuZHMpOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiAgaW5pdE0xYW5kTTIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIFJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworU0FDREVDX0VSUk9SIGluaXRNMWFuZE0yKHNwYXRpYWxEZWMqIHNlbGYsIGludCBpbml0U3RhdGVzRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29uZmlnQ2hhbmdlZCkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworCisgIHNlbGYtPmJPdmVyd3JpdGVNMU0ycHJldiA9IChjb25maWdDaGFuZ2VkICYmICFpbml0U3RhdGVzRmxhZykgPyAxIDogMDsKKworICB7IHNlbGYtPm51bU0ycm93cyA9IHNlbGYtPm51bU91dHB1dENoYW5uZWxzOyB9CisKKyAgaWYgKGluaXRTdGF0ZXNGbGFnKSB7CisgICAgaW50IGksIGosIGs7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bnVtTTJyb3dzOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBzZWxmLT5udW1WQ2hhbm5lbHM7IGorKykgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTUFYX1BBUkFNRVRFUl9CQU5EUzsgaysrKSB7CisgICAgICAgICAgc2VsZi0+TTJSZWFsX19GREtbaV1bal1ba10gPSBGTDJGWENPTlNUX0RCTCgwKTsKKyAgICAgICAgICBzZWxmLT5NMlJlYWxQcmV2X19GREtbaV1bal1ba10gPSBGTDJGWENPTlNUX0RCTCgwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19jYWxjTTFhbmRNMi5oIGIvbGliU0FDZGVjL3NyYy9zYWNfY2FsY00xYW5kTTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTYyMzhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfY2FsY00xYW5kTTIuaApAQCAtMCwwICsxLDEyOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIE0xIGFuZCBNMiBjYWxjdWxhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzYV9jYWxjTTFhbmRNMi5oICovCisKKyNpZm5kZWYgU0FDX0NBTENNMUFORE0yX0gKKyNkZWZpbmUgU0FDX0NBTENNMUFORE0yX0gKKworI2luY2x1ZGUgInNhY19kZWMuaCIKKworI2RlZmluZSBTQ0FMRV9QQVJBTV9NMSAzCisKKy8qIFNjYWxpbmcgb2YgTTIgbWF0cml4LCBidXQgb25seSBmb3IgYmluYXVyYWwgdXBtaXggdHlwZS4gKi8KKyNkZWZpbmUgU0NBTEVfUEFSQU1fQ0FMQ19NMiAoMykKKyNkZWZpbmUgU0NBTEVfUEFSQU1fTTJfNTE1WCAoMykKKyNkZWZpbmUgU0NBTEVfUEFSQU1fTTJfNTI1IChTQ0FMRV9QQVJBTV9NMSArIEhSR19TRiArIDEgLSBTQ0FMRV9QQVJBTV9DQUxDX00yKQorI2RlZmluZSBTQ0FMRV9QQVJBTV9NMl8yMTJfUFJFRCAoMykKKy8qIFNjYWxpbmcgb2Ygc3BlY3RyYWwgZGF0YSBhZnRlciBhcHBseWluZyBNMiBtYXRyaXgsIGJ1dCBvbmx5IGZvciBiaW5hdXJhbAorICAgdXBtaXggdHlwZSBTY2FsaW5nIGlzIGNvbXBlbnNhdGVkIGxhdGVyIGluIHN5bnRoZXNpcyBxbWYgZmlsdGVyYmFuayAqLworI2RlZmluZSBTQ0FMRV9EQVRBX0FQUExZX00yICgxKQorCitTQUNERUNfRVJST1IgaW5pdE0xYW5kTTIoc3BhdGlhbERlYyogc2VsZiwgaW50IGluaXRTdGF0ZXNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25maWdDaGFuZ2VkKTsKKworaW50IFNwYXRpYWxEZWNHZXRSZXNpZHVhbEluZGV4KHNwYXRpYWxEZWMqIHNlbGYsIGludCByb3cpOworCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0NhbGN1bGF0ZU0xYW5kTTIoc3BhdGlhbERlYyogc2VsZiwgaW50IHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUqIGZyYW1lKTsKKworI2VuZGlmIC8qIFNBQ19DQUxDTTFBTkRNMl9IICovCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19kZWMuY3BwIGIvbGliU0FDZGVjL3NyYy9zYWNfZGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTM3ZDZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfZGVjLmNwcApAQCAtMCwwICsxLDE1MDkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlY29kZXIgTGlicmFyeQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic2FjX2RlY19lcnJvcmNvZGVzLmgiCisjaW5jbHVkZSAic2FjX2RlYy5oIgorCisjaW5jbHVkZSAic2FjX3Byb2Nlc3MuaCIKKyNpbmNsdWRlICJzYWNfYml0ZGVjLmgiCisjaW5jbHVkZSAic2FjX3Ntb290aGluZy5oIgorI2luY2x1ZGUgInNhY19jYWxjTTFhbmRNMi5oIgorI2luY2x1ZGUgInNhY19yZXNoYXBlQkJFbnYuaCIKKyNpbmNsdWRlICJzYWNfc3RwLmgiCisjaW5jbHVkZSAic2FjX3JvbS5oIgorCisjaW5jbHVkZSAiRkRLX2RlY29ycmVsYXRlLmgiCisKKyNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisKKy8qIHN0YXRpYyBpbnQgcGJTdHJpZGVUYWJsZVtdID0gezEsIDIsIDUsIDI4fTsgc2VlIHNhY19yb20uY3BwICovCisKK2VudW0geworICBBUFBMWV9NMl9OT05FID0gMCwgICAgLyogaW5pdCB2YWx1ZSAqLworICBBUFBMWV9NMiA9IDEsICAgICAgICAgLyogYXBwbHkgbTIgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gKi8KKyAgQVBQTFlfTTJfTU9ERTIxMiA9IDIsIC8qIGFwcGx5IG0yIGZvciAyMTIgbW9kZSAqLworICBBUFBMWV9NMl9NT0RFMjEyX1Jlc19QaGFzZUNvZGluZyA9CisgICAgICAzIC8qIGFwcGx5IG0yIGZvciAyMTIgbW9kZSB3aXRoIHJlc2lkdWFscyBhbmQgcGhhc2UgY29kaW5nICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZnVuY3Rpb246IEZES19TcGF0aWFsRGVjSW5pdERlZmF1bHRTcGF0aWFsU3BlY2lmaWNDb25maWcgKi8KKy8qIG91dHB1dDogICBzdHJ1Y3Qgb2YgdHlwZSBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqLworLyogaW5wdXQ6ICAgIGNvcmUgY29kZXIgYXVkaW8gb2JqZWN0IHR5cGUgKi8KKy8qIGlucHV0OiAgICBuciBvZiBjb3JlIGNoYW5uZWxzICovCisvKiBpbnB1dDogICAgc2FtcGxpbmcgcmF0ZSAqLworLyogaW5wdXQ6ICAgIG5yIG9mIHRpbWUgc2xvdHMgKi8KKy8qIGlucHV0OiAgICBkZWNvZGVyIGxldmVsICovCisvKiBpbnB1dDogICAgZmxhZyBpbmRpY2F0aW5nIHVwbWl4IHR5cGUgYmxpbmQgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByZXR1cm5zOiAgZXJyb3IgY29kZSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBGREtfU3BhdGlhbERlY0luaXREZWZhdWx0U3BhdGlhbFNwZWNpZmljQ29uZmlnKAorICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywgaW50IGNvcmVDaGFubmVscywgaW50IHNhbXBsaW5nRnJlcSwKKyAgICBpbnQgblRpbWVTbG90cywgaW50IGRlY29kZXJMZXZlbCwgaW50IGlzQmxpbmQpIHsKKyAgcmV0dXJuIFNwYXRpYWxEZWNEZWZhdWx0U3BlY2lmaWNDb25maWcocFNwYXRpYWxTcGVjaWZpY0NvbmZpZywgY29yZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEsIG5UaW1lU2xvdHMsIGRlY29kZXJMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCbGluZCwgY29yZUNoYW5uZWxzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZ1bmN0aW9uOiBGREtfU3BhdGlhbERlY0NvbXBhcmVTcGF0aWFsU3BlY2lmaWNDb25maWdIZWFkZXIgKi8KKy8qIGlucHV0OiAgICAyIHBvaW50ZXJzIHRvIGEgc3NjICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogb3V0cHV0OiAgIC0gKi8KKy8qIHJldHVybnM6ICBlcnJvciBjb2RlICgwID0gZXF1YWwsIDw+MCB1bmVxdWFsKSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBGREtfU3BhdGlhbERlY0NvbXBhcmVTcGF0aWFsU3BlY2lmaWNDb25maWdIZWFkZXIoCisgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTc2MxLCBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNzYzIpIHsKKyAgaW50IHJlc3VsdCA9IE1QU19PSzsKKworICAvKiB3ZSBhc3N1bWU6IGV2ZXJ5IGJpdCBtdXN0IGJlIGVxdWFsICovCisgIGlmIChGREttZW1jbXAocFNzYzEsIHBTc2MyLCBzaXplb2YoU1BBVElBTF9TUEVDSUZJQ19DT05GSUcpKSAhPSAwKSB7CisgICAgcmVzdWx0ID0gTVBTX1VORVFVQUxfU1NDOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBTcGF0aWFsRGVjQ2xlYXJGcmFtZURhdGEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjogQ2xlYXIvRmFrZSBmcmFtZSBkYXRhIHRvIGF2b2lkIG1pc2NvbmZpZ3VyYXRpb24gYW5kIGFsbG93IHByb3BlcgorICAgICAgICAgICAgICBlcnJvciBjb25jZWFsbWVudC4KKyBBcmd1bWVudHM6CisgSW5wdXQ6ICAgICAgIHNlbGYgKGZyYW1lIGRhdGEpCisgT3V0cHV0OiAgICAgIE5vIHJldHVybiB2YWx1ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFNwYXRpYWxEZWNDbGVhckZyYW1lRGF0YSgKKyAgICBzcGF0aWFsRGVjICpzZWxmLCAvKiBTaGFsbCBiZSByZW1vdmVkICovCisgICAgU1BBVElBTF9CU19GUkFNRSAqYnNGcmFtZSwgY29uc3QgU0FDREVDX0NSRUFUSU9OX1BBUkFNUyAqY29uc3Qgc2V0dXApIHsKKyAgaW50IGk7CisKKyAgRkRLX0FTU0VSVChzZWxmICE9IE5VTEwpOworICBGREtfQVNTRVJUKGJzRnJhbWUgIT0gTlVMTCk7CisgIEZES19BU1NFUlQoc2V0dXAgIT0gTlVMTCk7CisKKyAgLyogZG8gbm90IGFwcGx5IHNoYXBpbmcgdG9vbHMgKEdFUyBvciBTVFApICovCisgIGZvciAoaSA9IDA7IGkgPCBzZXR1cC0+bWF4TnVtT3V0cHV0Q2hhbm5lbHM7CisgICAgICAgaSArPSAxKSB7IC8qIE1BWF9PVVRQVVRfQ0hBTk5FTFMgKi8KKyAgICBic0ZyYW1lLT50ZW1wU2hhcGVFbmFibGVDaGFubmVsU1RQW2ldID0gMDsKKyAgICBic0ZyYW1lLT50ZW1wU2hhcGVFbmFibGVDaGFubmVsR0VTW2ldID0gMDsKKyAgfQorCisgIGJzRnJhbWUtPlRzZERhdGEtPmJzVHNkRW5hYmxlID0gMDsKKworICAvKiB1c2Ugb25seSAxIHBhcmFtZXRlciBzZXQgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUgKi8KKyAgYnNGcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyA9IDE7CisgIGJzRnJhbWUtPnBhcmFtU2xvdFswXSA9IHNlbGYtPnRpbWVTbG90cyAtIDE7CisKKyAgLyogcGFyYW1ldGVyIHNtb290aGluZyB0b29sIHNldCB0byBvZmYgKi8KKyAgYnNGcmFtZS0+YnNTbW9vdGhNb2RlWzBdID0gMDsKKworICAvKiByZXNldCByZXNpZHVhbCBkYXRhICovCisgIHsKKyAgICBpbnQgcmVzUW1mQmFuZHMsIHJlc1RpbWVTbG90cyA9ICgxKTsKKworICAgIHJlc1FtZkJhbmRzID0gc2V0dXAtPm1heE51bVFtZkJhbmRzOworCisgICAgZm9yIChpID0gMDsgaSA8IHNldHVwLT5iUHJvY1Jlc2lkdWFsCisgICAgICAgICAgICAgICAgICAgID8gZk1pbihzZXR1cC0+bWF4TnVtUmVzQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC0+bWF4TnVtT3R0Qm94ZXMgKyBzZXR1cC0+bWF4TnVtSW5wdXRDaGFubmVscykKKyAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgICAgaSArPSAxKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlc1RpbWVTbG90czsgaiArPSAxKSB7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmVzUW1mQmFuZHM7IGsgKz0gMSkgeworICAgICAgICAgIHNlbGYtPnFtZlJlc2lkdWFsUmVhbF9fRkRLW2ldW2pdW2tdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAgICAgc2VsZi0+cW1mUmVzaWR1YWxJbWFnX19GREtbaV1bal1ba10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IEZES19TcGF0aWFsRGVjT3BlbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3BhdGlhbERlYyAqRkRLX1NwYXRpYWxEZWNPcGVuKGNvbnN0IFNQQVRJQUxfREVDX0NPTkZJRyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVyZW9Db25maWdJbmRleCkgeworICBpbnQgaTsKKyAgaW50IGxmU2l6ZSwgaGZTaXplOworICBzcGF0aWFsRGVjICpzZWxmID0gTlVMTDsKKyAgU0FDREVDX0NSRUFUSU9OX1BBUkFNUyBzZXR1cDsKKworICBzd2l0Y2ggKGNvbmZpZy0+ZGVjb2RlckxldmVsKSB7CisgICAgY2FzZSBERUNPREVSX0xFVkVMXzA6IC8qIDIxMiBtYXhOdW1PdXRwdXRDaGFubmVscz09IDIgKi8KKyAgICAgIHNldHVwLm1heE51bUlucHV0Q2hhbm5lbHMgPSAxOworICAgICAgc2V0dXAubWF4TnVtT3V0cHV0Q2hhbm5lbHMgPSAyOworICAgICAgc2V0dXAubWF4TnVtUW1mQmFuZHMgPSA2NDsKKyAgICAgIHNldHVwLm1heE51bVhDaGFubmVscyA9IDI7CisgICAgICBzZXR1cC5tYXhOdW1WQ2hhbm5lbHMgPSAyOworICAgICAgc2V0dXAubWF4TnVtRGVjb3JDaGFubmVscyA9IDE7CisgICAgICBzZXR1cC5iUHJvY1Jlc2lkdWFsID0gMTsKKyAgICAgIHNldHVwLm1heE51bVJlc2lkdWFsQ2hhbm5lbHMgPSAwOworICAgICAgc2V0dXAubWF4TnVtT3R0Qm94ZXMgPSAxOworICAgICAgc2V0dXAubWF4TnVtUGFyYW1zID0gc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscyArIHNldHVwLm1heE51bU90dEJveGVzOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICB9CisKKyAgc2V0dXAubWF4TnVtUmVzQ2hhbm5lbHMgPSAxOworCisgIHsKKyAgICBzd2l0Y2ggKGNvbmZpZy0+bWF4TnVtT3V0cHV0Q2hhbm5lbHMpIHsKKyAgICAgIGNhc2UgT1VUUFVUX0NIQU5ORUxTXzJfMDoKKyAgICAgICAgc2V0dXAubWF4TnVtT3V0cHV0Q2hhbm5lbHMgPSBmTWluKHNldHVwLm1heE51bU91dHB1dENoYW5uZWxzLCAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE9VVFBVVF9DSEFOTkVMU19ERUZBVUxUOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgc2V0dXAubWF4TnVtSHlicmlkQmFuZHMgPSBTYWNHZXRIeWJyaWRTdWJiYW5kcyhzZXR1cC5tYXhOdW1RbWZCYW5kcyk7CisKKyAgc3dpdGNoIChjb25maWctPmRlY29kZXJNb2RlKSB7CisgICAgY2FzZSBFWFRfSFFfT05MWToKKyAgICAgIHNldHVwLm1heE51bUNtcGx4UW1mQmFuZHMgPSBzZXR1cC5tYXhOdW1RbWZCYW5kczsKKyAgICAgIHNldHVwLm1heE51bUNtcGx4SHliQmFuZHMgPSBzZXR1cC5tYXhOdW1IeWJyaWRCYW5kczsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzZXR1cC5tYXhOdW1DbXBseFFtZkJhbmRzID0gZml4TWF4KFBDX05VTV9CQU5EUywgc2V0dXAubWF4TnVtUW1mQmFuZHMpOworICAgICAgc2V0dXAubWF4TnVtQ21wbHhIeWJCYW5kcyA9CisgICAgICAgICAgZml4TWF4KFBDX05VTV9IWUJfQkFORFMsIHNldHVwLm1heE51bUh5YnJpZEJhbmRzKTsKKyAgICAgIGJyZWFrOworICB9IC8qIHN3aXRjaCBjb25maWctPmRlY29kZXJNb2RlICovCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRF9JTlQoc2VsZiwgMSwgc3BhdGlhbERlYywgU0VDVF9EQVRBX0wyKQorCisgIHNlbGYtPmNyZWF0ZVBhcmFtcyA9IHNldHVwOworCisgIEZES19BTExPQ0FURV9NRU1PUllfMUQoc2VsZi0+cGFyYW0yaHliLCBNQVhfUEFSQU1FVEVSX0JBTkRTICsgMSwgaW50KQorCisgIEZES19BTExPQ0FURV9NRU1PUllfMUQoc2VsZi0+bnVtT3R0QmFuZHMsIHNldHVwLm1heE51bU90dEJveGVzLCBpbnQpCisKKyAgLyogYWxsb2NhdGUgYXJyYXlzICovCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5zbWdUaW1lLCBNQVhfUEFSQU1FVEVSX1NFVFMsIGludCkKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChzZWxmLT5zbWdEYXRhLCBNQVhfUEFSQU1FVEVSX1NFVFMsIE1BWF9QQVJBTUVURVJfQkFORFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRChzZWxmLT5vdHRDTERfX0ZESywgc2V0dXAubWF4TnVtT3R0Qm94ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBUkFNRVRFUl9TRVRTLCBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRChzZWxmLT5vdHRJQ0NfX0ZESywgc2V0dXAubWF4TnVtT3R0Qm94ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBUkFNRVRFUl9TRVRTLCBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRChzZWxmLT5vdHRJUERfX0ZESywgc2V0dXAubWF4TnVtT3R0Qm94ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBUkFNRVRFUl9TRVRTLCBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKworICAvKiBMYXN0IHBhcmFtZXRlcnMgZnJvbSBwcmV2IGZyYW1lICovCisgIEZES19BTExPQ0FURV9NRU1PUllfMkQoc2VsZi0+b3R0Q0xEaWR4UHJldiwgc2V0dXAubWF4TnVtT3R0Qm94ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBUkFNRVRFUl9CQU5EUywgU0NIQVIpCisgIEZES19BTExPQ0FURV9NRU1PUllfMkQoc2VsZi0+b3R0SUNDaWR4UHJldiwgc2V0dXAubWF4TnVtT3R0Qm94ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBUkFNRVRFUl9CQU5EUywgU0NIQVIpCisgIEZES19BTExPQ0FURV9NRU1PUllfM0Qoc2VsZi0+b3R0SUNDZGlmZmlkeCwgc2V0dXAubWF4TnVtT3R0Qm94ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBUkFNRVRFUl9TRVRTLCBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChzZWxmLT5vdHRJUERpZHhQcmV2LCBzZXR1cC5tYXhOdW1PdHRCb3hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChzZWxmLT5hcmJkbXhHYWluSWR4UHJldiwgc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChzZWxmLT5jbXBPdHRDTERpZHhQcmV2LCBzZXR1cC5tYXhOdW1PdHRCb3hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChzZWxmLT5jbXBPdHRJQ0NpZHhQcmV2LCBzZXR1cC5tYXhOdW1PdHRCb3hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRChzZWxmLT5vdXRJZHhEYXRhLCBzZXR1cC5tYXhOdW1PdHRCb3hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX1NFVFMsIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSKQorCisgIEZES19BTExPQ0FURV9NRU1PUllfM0Qoc2VsZi0+YXJiZG14R2Fpbl9fRkRLLCBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQVJBTUVURVJfU0VUUywgTUFYX1BBUkFNRVRFUl9CQU5EUywgU0NIQVIpCisgIEZES19BTExPQ0FURV9NRU1PUllfMUQoc2VsZi0+YXJiZG14QWxwaGFfX0ZESywgc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCkKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5hcmJkbXhBbHBoYVByZXZfX0ZESywgc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCkKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChzZWxmLT5jbXBBcmJkbXhHYWluSWR4UHJldiwgc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKHNlbGYtPmNtcE90dElQRGlkeFByZXYsIHNldHVwLm1heE51bU90dEJveGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSKQorCisgIEZES19BTExPQ0FURV9NRU1PUllfM0RfSU5UKHNlbGYtPk0yUmVhbF9fRkRLLCBzZXR1cC5tYXhOdW1PdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtVkNoYW5uZWxzLCBNQVhfUEFSQU1FVEVSX0JBTkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCwgU0VDVF9EQVRBX0wyKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzNEKHNlbGYtPk0ySW1hZ19fRkRLLCBzZXR1cC5tYXhOdW1PdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1WQ2hhbm5lbHMsIE1BWF9QQVJBTUVURVJfQkFORFMsIEZJWFBfREJMKQorCisgIEZES19BTExPQ0FURV9NRU1PUllfM0RfSU5UKHNlbGYtPk0yUmVhbFByZXZfX0ZESywgc2V0dXAubWF4TnVtT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heE51bVZDaGFubmVscywgTUFYX1BBUkFNRVRFUl9CQU5EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwsIFNFQ1RfREFUQV9MMikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRChzZWxmLT5NMkltYWdQcmV2X19GREssIHNldHVwLm1heE51bU91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heE51bVZDaGFubmVscywgTUFYX1BBUkFNRVRFUl9CQU5EUywgRklYUF9EQkwpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlRfQUxJR05FRCgKKyAgICAgIHNlbGYtPnFtZklucHV0UmVhbF9fRkRLLCBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzLCBzZXR1cC5tYXhOdW1RbWZCYW5kcywKKyAgICAgIEZJWFBfREJMLCBTRUNUX0RBVEFfTDIpCisgIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UX0FMSUdORUQoCisgICAgICBzZWxmLT5xbWZJbnB1dEltYWdfX0ZESywgc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscywKKyAgICAgIHNldHVwLm1heE51bUNtcGx4UW1mQmFuZHMsIEZJWFBfREJMLCBTRUNUX0RBVEFfTDIpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlQoc2VsZi0+aHliSW5wdXRSZWFsX19GREssIHNldHVwLm1heE51bUlucHV0Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heE51bUh5YnJpZEJhbmRzLCBGSVhQX0RCTCwgU0VDVF9EQVRBX0wyKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVChzZWxmLT5oeWJJbnB1dEltYWdfX0ZESywgc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtQ21wbHhIeWJCYW5kcywgRklYUF9EQkwsIFNFQ1RfREFUQV9MMikKKworICBpZiAoc2V0dXAuYlByb2NSZXNpZHVhbCkgeworICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoc2VsZi0+cW1mUmVzaWR1YWxSZWFsX19GREssIHNldHVwLm1heE51bVJlc0NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiopCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5xbWZSZXNpZHVhbEltYWdfX0ZESywgc2V0dXAubWF4TnVtUmVzQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKikKKworICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoc2VsZi0+aHliUmVzaWR1YWxSZWFsX19GREssIHNldHVwLm1heE51bVJlc0NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKikKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHNlbGYtPmh5YlJlc2lkdWFsSW1hZ19fRkRLLCBzZXR1cC5tYXhOdW1SZXNDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICopCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2V0dXAubWF4TnVtUmVzQ2hhbm5lbHM7IGkrKykgeworICAgICAgaW50IHJlc1FtZkJhbmRzID0gKGNvbmZpZy0+ZGVjb2Rlck1vZGUgPT0gRVhUX0xQX09OTFkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQQ19OVU1fQkFORFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNldHVwLm1heE51bVFtZkJhbmRzOworICAgICAgaW50IHJlc0h5YkJhbmRzID0gKGNvbmZpZy0+ZGVjb2Rlck1vZGUgPT0gRVhUX0xQX09OTFkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQQ19OVU1fSFlCX0JBTkRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZXR1cC5tYXhOdW1IeWJyaWRCYW5kczsKKyAgICAgIC8qIEFsaWdubWVudCBpcyBuZWVkZWQgZm9yIFVTQUMgcmVzaWR1YWxzIGJlY2F1c2UgUU1GIGFuYWx5c2lzIGRpcmVjdGx5CisgICAgICAgKiB3cml0ZXMgdG8gdGhpcyBidWZmZXIuICovCisgICAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVF9BTElHTkVEKHNlbGYtPnFtZlJlc2lkdWFsUmVhbF9fRkRLW2ldLCAoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1FtZkJhbmRzLCBGSVhQX0RCTCwgU0VDVF9EQVRBX0wxKQorICAgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlRfQUxJR05FRChzZWxmLT5xbWZSZXNpZHVhbEltYWdfX0ZES1tpXSwgKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNRbWZCYW5kcywgRklYUF9EQkwsIFNFQ1RfREFUQV9MMSkKKworICAgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5oeWJSZXNpZHVhbFJlYWxfX0ZES1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtSHlicmlkQmFuZHMsIEZJWFBfREJMKQorICAgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5oeWJSZXNpZHVhbEltYWdfX0ZES1tpXSwgcmVzSHliQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKQorICAgIH0KKyAgfSAvKiBpZiAoc2V0dXAuYlByb2NSZXNpZHVhbCkgKi8KKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVChzZWxmLT53UmVhbF9fRkRLLCBzZXR1cC5tYXhOdW1WQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heE51bUh5YnJpZEJhbmRzLCBGSVhQX0RCTCwgU0VDVF9EQVRBX0wyKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVChzZWxmLT53SW1hZ19fRkRLLCBzZXR1cC5tYXhOdW1WQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heE51bUNtcGx4SHliQmFuZHMsIEZJWFBfREJMLCBTRUNUX0RBVEFfTDIpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlQoc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1PdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtSHlicmlkQmFuZHMsIEZJWFBfREJMLCBTRUNUX0RBVEFfTDIpCisgIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UKHNlbGYtPmh5Yk91dHB1dEltYWdEcnlfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heE51bUNtcGx4SHliQmFuZHMsIEZJWFBfREJMLCBTRUNUX0RBVEFfTDIpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlQoc2VsZi0+aHliT3V0cHV0UmVhbFdldF9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1PdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtSHlicmlkQmFuZHMsIEZJWFBfREJMLCBTRUNUX0RBVEFfTDIpCisgIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UKHNlbGYtPmh5Yk91dHB1dEltYWdXZXRfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heE51bUNtcGx4SHliQmFuZHMsIEZJWFBfREJMLCBTRUNUX0RBVEFfTDIpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5oeWJyaWRTeW50aGVzaXMsIHNldHVwLm1heE51bU91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZES19TWU5fSFlCX0ZJTFRFUikKKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKAorICAgICAgc2VsZi0+aHlicmlkQW5hbHlzaXMsCisgICAgICBzZXR1cC5iUHJvY1Jlc2lkdWFsID8gc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscyArIHNldHVwLm1heE51bVJlc0NoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscywKKyAgICAgIEZES19BTkFfSFlCX0ZJTFRFUikKKworICBsZlNpemUgPSAyICogQlVGRkVSX0xFTl9MRiAqIE1BWF9RTUZfQkFORFNfVE9fSFlCUklEOworICB7CisgICAgaGZTaXplID0KKyAgICAgICAgQlVGRkVSX0xFTl9IRiAqICgoc2V0dXAubWF4TnVtUW1mQmFuZHMgLSBNQVhfUU1GX0JBTkRTX1RPX0hZQlJJRCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIChzZXR1cC5tYXhOdW1DbXBseFFtZkJhbmRzIC0gTUFYX1FNRl9CQU5EU19UT19IWUJSSUQpKTsKKyAgfQorCisgIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UKHNlbGYtPnBIeWJyaWRBbmFTdGF0ZXNMRmRteCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscywgbGZTaXplLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVF9EQVRBX0wyKSB7CisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChzZWxmLT5wSHlicmlkQW5hU3RhdGVzSEZkbXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzLCBoZlNpemUsIEZJWFBfREJMKQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHNldHVwLm1heE51bUlucHV0Q2hhbm5lbHM7IGkrKykgeworICAgIEZJWFBfREJMICpwSHlicmlkQW5hU3RhdGVzSEZkbXg7CisKKyAgICBwSHlicmlkQW5hU3RhdGVzSEZkbXggPSBzZWxmLT5wSHlicmlkQW5hU3RhdGVzSEZkbXhbaV07CisKKyAgICBGREtoeWJyaWRBbmFseXNpc09wZW4oJnNlbGYtPmh5YnJpZEFuYWx5c2lzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wSHlicmlkQW5hU3RhdGVzTEZkbXhbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxmU2l6ZSAqIHNpemVvZihGSVhQX0RCTCksIHBIeWJyaWRBbmFTdGF0ZXNIRmRteCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGZTaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIH0KKyAgaWYgKHNldHVwLmJQcm9jUmVzaWR1YWwpIHsKKyAgICBsZlNpemUgPSAyICogQlVGRkVSX0xFTl9MRiAqIE1BWF9RTUZfQkFORFNfVE9fSFlCUklEOworICAgIGhmU2l6ZSA9IEJVRkZFUl9MRU5fSEYgKgorICAgICAgICAgICAgICgoKChjb25maWctPmRlY29kZXJNb2RlID09IEVYVF9MUF9PTkxZKSA/IFBDX05VTV9CQU5EUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNldHVwLm1heE51bVFtZkJhbmRzKSAtCisgICAgICAgICAgICAgICBNQVhfUU1GX0JBTkRTX1RPX0hZQlJJRCkgKworICAgICAgICAgICAgICAoc2V0dXAubWF4TnVtQ21wbHhRbWZCYW5kcyAtIE1BWF9RTUZfQkFORFNfVE9fSFlCUklEKSk7CisKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVChzZWxmLT5wSHlicmlkQW5hU3RhdGVzTEZyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtUmVzQ2hhbm5lbHMsIGxmU2l6ZSwgRklYUF9EQkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVF9EQVRBX0wyKQorICAgIEZES19BTExPQ0FURV9NRU1PUllfMkQoc2VsZi0+cEh5YnJpZEFuYVN0YXRlc0hGcmVzLCBzZXR1cC5tYXhOdW1SZXNDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhmU2l6ZSwgRklYUF9EQkwpCisKKyAgICBmb3IgKGkgPSBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzOworICAgICAgICAgaSA8IChzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzICsgc2V0dXAubWF4TnVtUmVzQ2hhbm5lbHMpOyBpKyspIHsKKyAgICAgIEZES2h5YnJpZEFuYWx5c2lzT3BlbigKKyAgICAgICAgICAmc2VsZi0+aHlicmlkQW5hbHlzaXNbaV0sCisgICAgICAgICAgc2VsZi0+cEh5YnJpZEFuYVN0YXRlc0xGcmVzW2kgLSBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzXSwKKyAgICAgICAgICBsZlNpemUgKiBzaXplb2YoRklYUF9EQkwpLAorICAgICAgICAgIHNlbGYtPnBIeWJyaWRBbmFTdGF0ZXNIRnJlc1tpIC0gc2V0dXAubWF4TnVtSW5wdXRDaGFubmVsc10sCisgICAgICAgICAgaGZTaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQorICB9CisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5zbW9vdGhTdGF0ZSwgMSwgU01PT1RISU5HX1NUQVRFKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHNlbGYtPnJlc2hhcGVCQkVudlN0YXRlLCAxLCBSRVNIQVBFX0JCRU5WX1NUQVRFKQorCisgIEZES19BTExPQ0FURV9NRU1PUllfMUQoc2VsZi0+YXBEZWNvciwgc2V0dXAubWF4TnVtRGVjb3JDaGFubmVscywgREVDT1JSX0RFQykKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlQoc2VsZi0+cERlY29yQnVmZmVyQ3BseCwgc2V0dXAubWF4TnVtRGVjb3JDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgKiAoKDgyNSkgKyAoMzczKSkpLCBGSVhQX0RCTCwgU0VDVF9EQVRBX0wyKQorCisgIGZvciAoaSA9IDA7IGkgPCBzZXR1cC5tYXhOdW1EZWNvckNoYW5uZWxzOyBpKyspIHsKKyAgICBpZiAoRkRLZGVjb3JyZWxhdGVPcGVuKCZzZWxmLT5hcERlY29yW2ldLCBzZWxmLT5wRGVjb3JCdWZmZXJDcGx4W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgKiAoKDgyNSkgKyAoMzczKSkpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCisgIGlmIChzdWJiYW5kVFBDcmVhdGUoJnNlbGYtPmhTdHBEZWMpICE9IE1QU19PSykgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIHNhdmUgZ2VuZXJhbCBkZWNvZGVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgc2VsZi0+ZGVjb2RlckxldmVsID0gY29uZmlnLT5kZWNvZGVyTGV2ZWw7CisgIHNlbGYtPmRlY29kZXJNb2RlID0gY29uZmlnLT5kZWNvZGVyTW9kZTsKKyAgc2VsZi0+YmluYXVyYWxNb2RlID0gY29uZmlnLT5iaW5hdXJhbE1vZGU7CisKKyAgLyogcHJlaW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uICovCisgIHNlbGYtPnBhcnRpYWxseUNvbXBsZXggPSAoY29uZmlnLT5kZWNvZGVyTW9kZSAhPSBFWFRfSFFfT05MWSkgPyAxIDogMDsKKworICAvKiBTZXQgdG8gZGVmYXVsdCBzdGF0ZSAqLworICBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfSW5pdCgmc2VsZi0+Y29uY2VhbEluZm8sIE1QRUdTX0NPTkNFQUxfUkVTRVRfQUxMKTsKKworICAvKiBFdmVyeXRoaW5nIGlzIGZpbmUgc28gcmV0dXJuIHRoZSBoYW5kbGUgKi8KKyAgcmV0dXJuIHNlbGY7CisKK2JhaWw6CisgIC8qIENvbGxlY3RvciBmb3IgYWxsIGVycm9ycy4KKyAgICAgRGVhbGxvY2F0ZSBhbGwgbWVtb3J5IGFuZCByZXR1cm4gYSBpbnZhbGlkIGhhbmRsZS4gKi8KKyAgRkRLX1NwYXRpYWxEZWNDbG9zZShzZWxmKTsKKworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IGlzVmFsaWRDb25maWcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjogVmFsaWRhdGUgaWYgY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQgaW4gcHJlc2VudCBpbnN0YW5jZQorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOiAxOiBhbGwgb2theQorICAgICAgICAgMDogY29uZmlndXJhdGlvbiBub3Qgc3VwcG9ydGVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpc1ZhbGlkQ29uZmlnKHNwYXRpYWxEZWMgY29uc3QgKmNvbnN0IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1BBVElBTF9ERUNfVVBNSVhfVFlQRSB1cG1peFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU1BBVElBTERFQ19QQVJBTSBjb25zdCAqY29uc3QgcFVzZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUFvdCkgeworICBVUE1JWFRZUEUgblVwbWl4VHlwZTsKKworICBGREtfQVNTRVJUKHNlbGYgIT0gTlVMTCk7CisgIEZES19BU1NFUlQocFVzZXJQYXJhbXMgIT0gTlVMTCk7CisKKyAgblVwbWl4VHlwZSA9IChVUE1JWFRZUEUpdXBtaXhUeXBlOworCisgIHN3aXRjaCAoblVwbWl4VHlwZSkgeworICAgIGNhc2UgVVBNSVhUWVBFX0JZUEFTUzogLyogVVBNSVhfVFlQRV9CWVBBU1MgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVVBNSVhUWVBFX05PUk1BTDogLyogVVBNSVhfVFlQRV9OT1JNQUwgKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsgLyogdW5zdXBwb3J0ZWQgdXBtaXhUeXBlICovCisgIH0KKworICByZXR1cm4gMTsgLyogdXBtaXhUeXBlIHN1cHBvcnRlZCAqLworfQorCitzdGF0aWMgU0FDREVDX0VSUk9SIENoZWNrTGV2ZWxUcmVlVXBtaXhUeXBlKAorICAgIGNvbnN0IFNBQ0RFQ19DUkVBVElPTl9QQVJBTVMgKmNvbnN0IHBDcmVhdGVQYXJhbXMsCisgICAgY29uc3QgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKmNvbnN0IHBTc2MsIGNvbnN0IGludCBkZWNvZGVyTGV2ZWwsCisgICAgY29uc3QgVVBNSVhUWVBFIHVwbWl4VHlwZSkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBpbnQgbk91dHB1dENoYW5uZWxzLCB0cmVlQ29uZmlnOworCisgIEZES19BU1NFUlQocENyZWF0ZVBhcmFtcyAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwU3NjICE9IE5VTEwpOworCisgIHRyZWVDb25maWcgPSBwU3NjLT50cmVlQ29uZmlnOworCisgIHN3aXRjaCAoZGVjb2RlckxldmVsKSB7CisgICAgY2FzZSAwOiB7CisgICAgICBpZiAodHJlZUNvbmZpZyAhPSBTUEFUSUFMREVDX01PREVfUlNWRDcpIHsKKyAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfVFJFRUNPTkZJRzsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9QQVJBTUVURVIgLyogTVBTX1VOSU1QTEVNRU5URUQgKi87CisgICAgICBnb3RvIGJhaWw7CisgIH0KKworICBzd2l0Y2ggKHVwbWl4VHlwZSkgeworICAgIGNhc2UgVVBNSVhUWVBFX0JZUEFTUzoKKyAgICAgIG5PdXRwdXRDaGFubmVscyA9IHBTc2MtPm5JbnB1dENoYW5uZWxzOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG5PdXRwdXRDaGFubmVscyA9IHBTc2MtPm5PdXRwdXRDaGFubmVsczsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogSXMgc3VmZmljaWVudCBtZW1vcnkgYWxsb2NhdGVkLiAqLworICBpZiAoKHBTc2MtPm5JbnB1dENoYW5uZWxzID4gcENyZWF0ZVBhcmFtcy0+bWF4TnVtSW5wdXRDaGFubmVscykgfHwKKyAgICAgIChuT3V0cHV0Q2hhbm5lbHMgPiBwQ3JlYXRlUGFyYW1zLT5tYXhOdW1PdXRwdXRDaGFubmVscykgfHwKKyAgICAgIChwU3NjLT5uT3R0Qm94ZXMgPiBwQ3JlYXRlUGFyYW1zLT5tYXhOdW1PdHRCb3hlcykpIHsKKyAgICBlcnIgPSBNUFNfSU5WQUxJRF9QQVJBTUVURVI7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKwordm9pZCBTcGF0aWFsRGVjSW5pdFBhcnNlckNvbnRleHQoc3BhdGlhbERlYyAqc2VsZikgeworICBpbnQgaSwgajsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+Y3JlYXRlUGFyYW1zLm1heE51bU90dEJveGVzOyBpICs9IDEpIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgTUFYX1BBUkFNRVRFUl9CQU5EUzsgaisrKSB7CisgICAgICBzZWxmLT5vdHRDTERpZHhQcmV2W2ldW2pdID0gMDsKKyAgICAgIHNlbGYtPm90dElDQ2lkeFByZXZbaV1bal0gPSAwOworICAgICAgc2VsZi0+Y21wT3R0Q0xEaWR4UHJldltpXVtqXSA9IDA7CisgICAgICBzZWxmLT5jbXBPdHRJQ0NpZHhQcmV2W2ldW2pdID0gMDsKKyAgICB9CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1JbnB1dENoYW5uZWxzOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgTUFYX1BBUkFNRVRFUl9CQU5EUzsgaisrKSB7CisgICAgICBzZWxmLT5hcmJkbXhHYWluSWR4UHJldltpXVtqXSA9IDA7CisgICAgICBzZWxmLT5jbXBBcmJkbXhHYWluSWR4UHJldltpXVtqXSA9IDA7CisgICAgfQorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBGREtfU3BhdGlhbERlY0luaXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIFJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworU0FDREVDX0VSUk9SIEZES19TcGF0aWFsRGVjSW5pdChzcGF0aWFsRGVjICpzZWxmLCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTcGF0aWFsU3BlY2lmaWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUW1mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQVRJQUxfREVDX1VQTUlYX1RZUEUgY29uc3QgdXBtaXhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEFUSUFMREVDX1BBUkFNICpwVXNlclBhcmFtcywgVUlOVCBpbml0RmxhZ3MpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgaW50IG5DaCwgaSwgaiwgazsKKyAgaW50IG1heFFtZkJhbmRzOworICBpbnQgYnlwYXNzTW9kZSA9IDA7CisKKyAgc2VsZi0+dXNlRkRyZXZlcmIgPSAwOworCisgIC8qIGNoZWNrIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICovCisgIGlmICghaXNWYWxpZENvbmZpZyhzZWxmLCB1cG1peFR5cGUsIHBVc2VyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+Y29yZUNvZGVjKSkgeworICAgIHJldHVybiBNUFNfSU5WQUxJRF9QQVJBTUVURVI7CisgIH0KKworICAvKiBjaGVjayB0cmVlIGNvbmZpZ3VyYXRpb24gKi8KKyAgZXJyID0gQ2hlY2tMZXZlbFRyZWVVcG1peFR5cGUoJnNlbGYtPmNyZWF0ZVBhcmFtcywgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZGVjb2RlckxldmVsLCAoVVBNSVhUWVBFKXVwbWl4VHlwZSk7CisgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogU3RvcmUgYW5kIHVwZGF0ZSBpbnN0YW5jZSBhZnRlciBhbGwgY2hlY2tzIHBhc3NlZCBzdWNjZXNzZnVsbHk6ICovCisgIHNlbGYtPnVwbWl4VHlwZSA9IChVUE1JWFRZUEUpdXBtaXhUeXBlOworCisgIGlmIChpbml0RmxhZ3MgJiBNUEVHU19JTklUX1BBUkFNU19FUlJPUl9DT05DRUFMTUVOVCkgeyAvKiBBdCBsZWFzdCBvbmUgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNlYWxtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgY2hhbmdlZCAqLworICAgIGVyciA9IFNwYXRpYWxEZWNDb25jZWFsbWVudF9TZXRQYXJhbSgKKyAgICAgICAgJnNlbGYtPmNvbmNlYWxJbmZvLCBTQUNfREVDX0NPTkNFQUxfTUVUSE9ELCBwVXNlclBhcmFtcy0+Y29uY2VhbE1ldGhvZCk7CisgICAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgZXJyID0gU3BhdGlhbERlY0NvbmNlYWxtZW50X1NldFBhcmFtKCZzZWxmLT5jb25jZWFsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDX0RFQ19DT05DRUFMX05VTV9LRUVQX0ZSQU1FUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJQYXJhbXMtPmNvbmNlYWxOdW1LZWVwRnJhbWVzKTsKKyAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICBlcnIgPSBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfU2V0UGFyYW0oCisgICAgICAgICZzZWxmLT5jb25jZWFsSW5mbywgU0FDX0RFQ19DT05DRUFMX0ZBREVfT1VUX1NMT1BFX0xFTkdUSCwKKyAgICAgICAgcFVzZXJQYXJhbXMtPmNvbmNlYWxGYWRlT3V0U2xvcGVMZW5ndGgpOworICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGVyciA9IFNwYXRpYWxEZWNDb25jZWFsbWVudF9TZXRQYXJhbSgmc2VsZi0+Y29uY2VhbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ19ERUNfQ09OQ0VBTF9GQURFX0lOX1NMT1BFX0xFTkdUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJQYXJhbXMtPmNvbmNlYWxGYWRlSW5TbG9wZUxlbmd0aCk7CisgICAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgZXJyID0gU3BhdGlhbERlY0NvbmNlYWxtZW50X1NldFBhcmFtKCZzZWxmLT5jb25jZWFsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDX0RFQ19DT05DRUFMX05VTV9SRUxFQVNFX0ZSQU1FUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXJQYXJhbXMtPmNvbmNlYWxOdW1SZWxlYXNlRnJhbWVzKTsKKyAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCisgIGlmIChpbml0RmxhZ3MgJgorICAgICAgTVBFR1NfSU5JVF9TVEFURVNfRVJST1JfQ09OQ0VBTE1FTlQpIHsgLyogU2V0IHRvIGRlZmF1bHQgc3RhdGUgKi8KKyAgICBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfSW5pdCgmc2VsZi0+Y29uY2VhbEluZm8sIE1QRUdTX0NPTkNFQUxfUkVTRVRfU1RBVEUpOworICB9CisKKyAgLyogZGV0ZXJtaW5lIGJ5cGFzcyBtb2RlICovCisgIGJ5cGFzc01vZGUgfD0gcFVzZXJQYXJhbXMtPmJ5cGFzc01vZGU7CisgIGJ5cGFzc01vZGUgfD0gKChzZWxmLT51cG1peFR5cGUgPT0gVVBNSVhUWVBFX0JZUEFTUykgPyAxIDogMCk7CisKKyAgLyogc3RhdGljIGRlY29kZXIgc2NhbGUgZGVwZW5kcyBvbiBudW1iZXIgb2YgcW1mIGJhbmRzICovCisgIHN3aXRjaCAoblFtZkJhbmRzKSB7CisgICAgY2FzZSAxNjoKKyAgICBjYXNlIDI0OgorICAgIGNhc2UgMzI6CisgICAgICBzZWxmLT5zdGF0aWNEZWNTY2FsZSA9IDIxOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2NDoKKyAgICAgIHNlbGYtPnN0YXRpY0RlY1NjYWxlID0gMjI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgfQorCisgIHNlbGYtPm51bVBhcmFtZXRlclNldHNQcmV2ID0gMTsKKworICBzZWxmLT5xbWZCYW5kcyA9IG5RbWZCYW5kczsKKyAgLyogc2VsZi0+aHlicmlkQmFuZHMgd2lsbCBiZSB1cGRhdGVkIGluIFNwYXRpYWxEZWNEZWNvZGVIZWFkZXIoKSBiZWxvdy4gKi8KKworICBzZWxmLT5iU2hhcmVEZWxheVdpdGhTQlIgPSAwOworCisgIGVyciA9IFNwYXRpYWxEZWNEZWNvZGVIZWFkZXIoc2VsZiwgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZyk7CisgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgc2VsZi0+c3RlcmVvQ29uZmlnSW5kZXggPSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5zdGVyZW9Db25maWdJbmRleDsKKworICBpZiAoaW5pdEZsYWdzICYgTVBFR1NfSU5JVF9TVEFURVNfQU5BX1FNRl9GSUxURVIpIHsKKyAgICBzZWxmLT5xbWZJbnB1dERlbGF5QnVmUG9zID0gMDsKKyAgICBzZWxmLT5wY19maWx0ZXJkZWxheSA9IDE7IC8qIERpdmlzaW9uIGJ5IDAgbm90IHBvc3NpYmxlICovCisgIH0KKworICBtYXhRbWZCYW5kcyA9IHNlbGYtPnFtZkJhbmRzOworCisgIC8qIGluaXQgcmVzaWR1YWwgZGVjb2RlciAqLworCisgIC8qIGluaXQgdG9uYWxpdHkgc21vb3RoaW5nICovCisgIGlmIChpbml0RmxhZ3MgJiBNUEVHU19JTklUX1NUQVRFU19QQVJBTSkgeworICAgIGluaXRQYXJhbWV0ZXJTbW9vdGhpbmcoc2VsZik7CisgIH0KKworICAvKiBpbml0IEdFUyAqLworICBpbml0QkJFbnYoc2VsZiwgKGluaXRGbGFncyAmIE1QRUdTX0lOSVRfU1RBVEVTX0dFUykgPyAxIDogMCk7CisKKyAgLyogQ2xpcCBwcm90ZWN0aW9uIGlzIGFwcGxpZWQgb25seSBmb3Igbm9ybWFsIHByb2Nlc3NpbmcuICovCisgIGlmICghaXNUd29DaE1vZGUoc2VsZi0+dXBtaXhUeXBlKSAmJiAhYnlwYXNzTW9kZSkgeworICAgIHNlbGYtPnN0YXRpY0RlY1NjYWxlICs9IHNlbGYtPmNsaXBQcm90ZWN0R2FpblNGX19GREs7CisgIH0KKworICB7CisgICAgVUlOVCBmbGFncyA9IDA7CisgICAgSU5UIGluaXRTdGF0ZXNGbGFnID0gKGluaXRGbGFncyAmIE1QRUdTX0lOSVRfU1RBVEVTX0FOQV9RTUZfRklMVEVSKSA/IDEgOiAwOworICAgIElOVCB1c2VMZEZpbHRlciA9CisgICAgICAgIChzZWxmLT5wQ29uZmlnQ3VycmVudC0+c3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX0xEKSA/IDEgOiAwOworCisgICAgZmxhZ3MgPSBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLmZsYWdzX3JlcXVlc3RlZDsKKyAgICBmbGFncyAmPSAofihVSU5UKVFNRl9GTEFHX0xQKTsKKworICAgIGlmIChpbml0U3RhdGVzRmxhZykKKyAgICAgIGZsYWdzICY9IH5RTUZfRkxBR19LRUVQX1NUQVRFUzsKKyAgICBlbHNlCisgICAgICBmbGFncyB8PSBRTUZfRkxBR19LRUVQX1NUQVRFUzsKKworICAgIGlmICh1c2VMZEZpbHRlcikKKyAgICAgIGZsYWdzIHw9IFFNRl9GTEFHX01QU0xERkI7CisgICAgZWxzZQorICAgICAgZmxhZ3MgJj0gflFNRl9GTEFHX01QU0xERkI7CisKKyAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLmZsYWdzX3JlcXVlc3RlZCA9IGZsYWdzOworICAgIEZES19RbWZEb21haW5fQ29uZmlndXJlKHNlbGYtPnBRbWZEb21haW4pOworCisgICAgLyogb3V0cHV0IHNjYWxpbmcgKi8KKyAgICBmb3IgKG5DaCA9IDA7IG5DaCA8IHNlbGYtPm51bU91dHB1dENoYW5uZWxzQVQ7IG5DaCsrKSB7CisgICAgICBpbnQgb3V0cHV0U2NhbGUgPSAwLCBvdXRwdXRHYWluX2UgPSAwLCBzY2FsZSA9IDA7CisgICAgICBGSVhQX0RCTCBvdXRwdXRHYWluX20gPSBnZXRDaEdhaW4oc2VsZiwgbkNoLCAmb3V0cHV0R2Fpbl9lKTsKKworICAgICAgaWYgKCFpc1R3b0NoTW9kZShzZWxmLT51cG1peFR5cGUpICYmICFieXBhc3NNb2RlKSB7CisgICAgICAgIG91dHB1dFNjYWxlICs9CisgICAgICAgICAgICBzZWxmLT5jbGlwUHJvdGVjdEdhaW5TRl9fRkRLOyAvKiBjb25zaWRlciBjbGlwIHByb3RlY3Rpb24gc2NhbGluZyBhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGhlc2lzIHFtZiAqLworICAgICAgfQorCisgICAgICBzY2FsZSA9IG91dHB1dFNjYWxlOworCisgICAgICBxbWZDaGFuZ2VPdXRTY2FsZWZhY3Rvcigmc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluT3V0W25DaF0uZmIsIHNjYWxlKTsKKyAgICAgIHFtZkNoYW5nZU91dEdhaW4oJnNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbk91dFtuQ2hdLmZiLCBvdXRwdXRHYWluX20sCisgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEdhaW5fZSk7CisgICAgfQorICB9CisKKyAgZm9yIChuQ2ggPSAwOyBuQ2ggPCBzZWxmLT5udW1PdXRwdXRDaGFubmVsc0FUOyBuQ2grKykgeworICAgIEZES2h5YnJpZFN5bnRoZXNpc0luaXQoJnNlbGYtPmh5YnJpZFN5bnRoZXNpc1tuQ2hdLCBUSFJFRV9UT19URU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5xbWZCYW5kcywgbWF4UW1mQmFuZHMpOworICB9CisKKyAgLyogZm9yIGlucHV0LCByZXNpZHVhbCBjaGFubmVscyBhbmQgYXJiaXRyYXJ5IGRvd24tbWl4IHJlc2lkdWFsIGNoYW5uZWxzICovCisgIGZvciAobkNoID0gMDsgbkNoIDwgc2VsZi0+Y3JlYXRlUGFyYW1zLm1heE51bUlucHV0Q2hhbm5lbHM7IG5DaCsrKSB7CisgICAgRkRLaHlicmlkQW5hbHlzaXNJbml0KAorICAgICAgICAmc2VsZi0+aHlicmlkQW5hbHlzaXNbbkNoXSwgVEhSRUVfVE9fVEVOLCBzZWxmLT5xbWZCYW5kcywgbWF4UW1mQmFuZHMsCisgICAgICAgIChpbml0RmxhZ3MgJiBNUEVHU19JTklUX1NUQVRFU19BTkFfSFlCX0ZJTFRFUikgPyAxIDogMCk7CisgIH0KKyAgZm9yICg7IG5DaCA8IChzZWxmLT5jcmVhdGVQYXJhbXMuYlByb2NSZXNpZHVhbAorICAgICAgICAgICAgICAgICAgICA/IChzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtSW5wdXRDaGFubmVscyArCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1SZXNDaGFubmVscykKKyAgICAgICAgICAgICAgICAgICAgOiBzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtSW5wdXRDaGFubmVscyk7CisgICAgICAgbkNoKyspIHsKKyAgICBGREtoeWJyaWRBbmFseXNpc0luaXQoJnNlbGYtPmh5YnJpZEFuYWx5c2lzW25DaF0sIFRIUkVFX1RPX1RFTiwgbWF4UW1mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFFtZkJhbmRzLCAwKTsKKyAgfQorCisgIHsKKyAgICBmb3IgKGsgPSAwOyBrIDwgc2VsZi0+bnVtRGVjb3JTaWduYWxzOyBrKyspIHsKKyAgICAgIGludCBlcnJDb2RlLCBpZGVjOworICAgICAgRkRLX0RFQ09SUl9UWVBFIGRlY29yclR5cGUgPSBERUNPUlJfUFM7CisgICAgICBkZWNvcnJUeXBlID0gREVDT1JSX0xEOworICAgICAgaWYgKHNlbGYtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmCisgICAgICAgICAgKFNBQ0RFQ19TWU5UQVhfVVNBQyB8IFNBQ0RFQ19TWU5UQVhfUlNWRDUwKSkgeworICAgICAgICBkZWNvcnJUeXBlID0KKyAgICAgICAgICAgICgoc2VsZi0+dHJlZUNvbmZpZyA9PSBUUkVFXzIxMikgJiYgKHNlbGYtPmRlY29yclR5cGUgPT0gREVDT1JSX1BTKSkKKyAgICAgICAgICAgICAgICA/IERFQ09SUl9QUworICAgICAgICAgICAgICAgIDogREVDT1JSX1VTQUM7CisgICAgICB9CisgICAgICB7CisgICAgICAgIGlkZWMgPSBrOworICAgICAgICBpZiAoc2VsZi0+cENvbmZpZ0N1cnJlbnQtPnN5bnRheEZsYWdzICYgU0FDREVDX1NZTlRBWF9MRCkgeworICAgICAgICAgIGlmIChzZWxmLT50cmVlQ29uZmlnID09IFRSRUVfMjEyICYmIGsgPT0gMCkgeworICAgICAgICAgICAgaWRlYyA9IDI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlcnJDb2RlID0gRkRLZGVjb3JyZWxhdGVJbml0KAorICAgICAgICAgICZzZWxmLT5hcERlY29yW2tdLCBzZWxmLT5oeWJyaWRCYW5kcywgZGVjb3JyVHlwZSwgRFVDS0VSX0FVVE9NQVRJQywKKyAgICAgICAgICBzZWxmLT5kZWNvcnJDb25maWcsIGlkZWMsIDAsIC8qIHNlbGYtPnBhcnRpYWxseUNvbXBsZXggKi8KKyAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzTGVnYWN5UFMgKi8KKyAgICAgICAgICAoaW5pdEZsYWdzICYgTVBFR1NfSU5JVF9TVEFURVNfREVDT1JSRUxBVE9SKSA/IDEgOiAwKTsKKyAgICAgIGlmIChlcnJDb2RlKSByZXR1cm4gTVBTX05PVE9LOworICAgIH0KKyAgfSAvKiAhc2VsZi0+cGFydGlhbGx5Q29tcGxleCAqLworCisgIGVyciA9IGluaXRNMWFuZE0yKHNlbGYsIChpbml0RmxhZ3MgJiBNUEVHU19JTklUX1NUQVRFU19NMU0yKSA/IDEgOiAwLAorICAgICAgICAgICAgICAgICAgICAoaW5pdEZsYWdzICYgTVBFR1NfSU5JVF9DT05GSUcpID8gMSA6IDApOworICBpZiAoZXJyICE9IE1QU19PSykgcmV0dXJuIGVycjsKKworICAvKiBJbml0aWFsaXphdGlvbiBvZiBwcmV2aW91cyBmcmFtZSBkYXRhICovCisgIGlmIChpbml0RmxhZ3MgJiBNUEVHU19JTklUX1NUQVRFU19QQVJBTSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtT3R0Qm94ZXM7IGkgKz0gMSkgeworICAgICAgLyogcmVzZXQgaWNjIGRpZmYgZGF0YSAqLworICAgICAgZm9yIChrID0gMDsgayA8IE1BWF9QQVJBTUVURVJfU0VUUzsgayArPSAxKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfUEFSQU1FVEVSX0JBTkRTOyBqICs9IDEpIHsKKyAgICAgICAgICBzZWxmLT5vdHRJQ0NkaWZmaWR4W2ldW2tdW2pdID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBQYXJhbWV0ZXIgU21vb3RoaW5nICovCisgICAgLyogcm9idXN0bmVzczogaW5pdCB3aXRoIG9uZSBvZiB0aGUgdmFsdWVzIG9mIHNtZ1RpbWVUYWJsZVtdID0gezY0LCAxMjgsCisgICAgICAgMjU2LCA1MTJ9IHRvIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gaW4gY2FsY0ZpbHRlckNvZWZmX19GREsoKSAqLworICAgIHNlbGYtPnNtb290aFN0YXRlLT5wcmV2U21nVGltZSA9IHNtZ1RpbWVUYWJsZVsyXTsgLyogPT0gMjU2ICovCisgICAgRkRLbWVtY2xlYXIoc2VsZi0+c21vb3RoU3RhdGUtPnByZXZTbWdEYXRhLAorICAgICAgICAgICAgICAgIE1BWF9QQVJBTUVURVJfQkFORFMgKiBzaXplb2YoVUNIQVIpKTsKKyAgICBGREttZW1jbGVhcihzZWxmLT5zbW9vdGhTdGF0ZS0+b3BkTGVmdFN0YXRlX19GREssCisgICAgICAgICAgICAgICAgTUFYX1BBUkFNRVRFUl9CQU5EUyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNsZWFyKHNlbGYtPnNtb290aFN0YXRlLT5vcGRSaWdodFN0YXRlX19GREssCisgICAgICAgICAgICAgICAgTUFYX1BBUkFNRVRFUl9CQU5EUyAqIHNpemVvZihGSVhQX0RCTCkpOworICB9CisKKyAgc2VsZi0+cHJldlRpbWVTbG90ID0gLTE7CisgIHNlbGYtPmN1clRpbWVTbG90ID0KKyAgICAgIE1BWF9USU1FX1NMT1RTICsgMTsgLyogSW5pdGlhbGl6ZSB3aXRoIGEgaW52YWxpZCB2YWx1ZSB0byB0cmlnZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNlYWxtZW50IGlmIGZpcnN0IGZyYW1lIGhhcyBubyB2YWxpZCBkYXRhLiAqLworICBzZWxmLT5jdXJQcyA9IDA7CisKKyAgc3ViYmFuZFRQSW5pdChzZWxmLT5oU3RwRGVjKTsKKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKwordm9pZCBTcGF0aWFsRGVjQ2hhbm5lbFByb3BlcnRpZXMoc3BhdGlhbERlYyAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBjaGFubmVsVHlwZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY2hhbm5lbEluZGljZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IgKmNvbnN0IG1hcERlc2NyKSB7CisgIGlmICgoc2VsZiA9PSBOVUxMKSB8fCAoY2hhbm5lbFR5cGUgPT0gTlVMTCkgfHwgKGNoYW5uZWxJbmRpY2VzID09IE5VTEwpIHx8CisgICAgICAobWFwRGVzY3IgPT0gTlVMTCkpIHsKKyAgICByZXR1cm47IC8qIG5vIGV4dGVybiBidWZmZXIgdG8gYmUgZmlsbGVkICovCisgIH0KKworICBpZiAoc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHNBVCAhPQorICAgICAgdHJlZVByb3BlcnR5VGFibGVbc2VsZi0+dHJlZUNvbmZpZ10ubnVtT3V0cHV0Q2hhbm5lbHMpIHsKKyAgICBpbnQgY2g7CisgICAgLyogRGVjbGFyZSBhbGwgY2hhbm5lbHMgdG8gYmUgZnJvbnQgY2hhbm5lbHM6ICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHNBVDsgY2ggKz0gMSkgeworICAgICAgY2hhbm5lbFR5cGVbY2hdID0gQUNUX0ZST05UOworICAgICAgY2hhbm5lbEluZGljZXNbY2hdID0gY2g7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIElTTy9JRUMgRkRJUyAyMzAwMy0xOjIwMDYoRSksIHBhZ2UgNDYsIFRhYmxlIDQwIGJzVHJlZUNvbmZpZyAqLworICAgIHN3aXRjaCAoc2VsZi0+dHJlZUNvbmZpZykgeworICAgICAgY2FzZSBUUkVFXzIxMjoKKyAgICAgICAgY2hhbm5lbFR5cGVbMF0gPSBBQ1RfRlJPTlQ7CisgICAgICAgIGNoYW5uZWxJbmRpY2VzWzBdID0gMDsKKyAgICAgICAgY2hhbm5lbFR5cGVbMV0gPSBBQ1RfRlJPTlQ7CisgICAgICAgIGNoYW5uZWxJbmRpY2VzWzFdID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OjsKKyAgICB9CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IEZES19TcGF0aWFsRGVjQ2xvc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIFJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBGREtfU3BhdGlhbERlY0Nsb3NlKHNwYXRpYWxEZWMgKnNlbGYpIHsKKyAgaWYgKHNlbGYpIHsKKyAgICBpbnQgazsKKworICAgIGlmIChzZWxmLT5hcERlY29yICE9IE5VTEwpIHsKKyAgICAgIGZvciAoayA9IDA7IGsgPCBzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtRGVjb3JDaGFubmVsczsgaysrKSB7CisgICAgICAgIEZES2RlY29ycmVsYXRlQ2xvc2UoJihzZWxmLT5hcERlY29yW2tdKSk7CisgICAgICB9CisgICAgICBGREtfRlJFRV9NRU1PUllfMUQoc2VsZi0+YXBEZWNvcik7CisgICAgfQorICAgIGlmIChzZWxmLT5wRGVjb3JCdWZmZXJDcGx4ICE9IE5VTEwpIHsKKyAgICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5wRGVjb3JCdWZmZXJDcGx4KTsKKyAgICB9CisKKyAgICBzdWJiYW5kVFBEZXN0cm95KCZzZWxmLT5oU3RwRGVjKTsKKworICAgIEZES19GUkVFX01FTU9SWV8xRChzZWxmLT5yZXNoYXBlQkJFbnZTdGF0ZSk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPnNtb290aFN0YXRlKTsKKworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5wSHlicmlkQW5hU3RhdGVzTEZkbXgpOworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5wSHlicmlkQW5hU3RhdGVzSEZkbXgpOworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5wSHlicmlkQW5hU3RhdGVzTEZyZXMpOworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5wSHlicmlkQW5hU3RhdGVzSEZyZXMpOworICAgIEZES19GUkVFX01FTU9SWV8xRChzZWxmLT5oeWJyaWRBbmFseXNpcyk7CisKKyAgICBGREtfRlJFRV9NRU1PUllfMUQoc2VsZi0+aHlicmlkU3ludGhlc2lzKTsKKworICAgIC8qIFRoZSB0aW1lIGJ1ZmZlciBpcyBwYXNzZWQgdG8gdGhlIGRlY29kZXIgZnJvbSBvdXRzaWRlIHRvIGF2b2lkIGNvcHlpbmcKKyAgICAgKiAoemVybyBjb3B5KS4gKi8KKyAgICAvKiBGREtfRlJFRV9NRU1PUllfMkQoc2VsZi0+dGltZU91dF9fRkRLKTsgKi8KKworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5oeWJPdXRwdXRJbWFnV2V0X19GREspOworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5oeWJPdXRwdXRSZWFsV2V0X19GREspOworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPmh5Yk91dHB1dEltYWdEcnlfX0ZESyk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPmh5Yk91dHB1dFJlYWxEcnlfX0ZESyk7CisKKyAgICBGREtfRlJFRV9NRU1PUllfMkQoc2VsZi0+d0ltYWdfX0ZESyk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPndSZWFsX19GREspOworCisgICAgaWYgKHNlbGYtPmNyZWF0ZVBhcmFtcy5iUHJvY1Jlc2lkdWFsKSB7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1SZXNDaGFubmVsczsgaSsrKSB7CisgICAgICAgIGlmIChzZWxmLT5oeWJSZXNpZHVhbEltYWdfX0ZESyAhPSBOVUxMKQorICAgICAgICAgIEZES19GUkVFX01FTU9SWV8xRChzZWxmLT5oeWJSZXNpZHVhbEltYWdfX0ZES1tpXSk7CisgICAgICAgIGlmIChzZWxmLT5oeWJSZXNpZHVhbFJlYWxfX0ZESyAhPSBOVUxMKQorICAgICAgICAgIEZES19GUkVFX01FTU9SWV8xRChzZWxmLT5oeWJSZXNpZHVhbFJlYWxfX0ZES1tpXSk7CisgICAgICAgIGlmIChzZWxmLT5xbWZSZXNpZHVhbEltYWdfX0ZESyAhPSBOVUxMKQorICAgICAgICAgIEZES19GUkVFX01FTU9SWV8yRF9BTElHTkVEKHNlbGYtPnFtZlJlc2lkdWFsSW1hZ19fRkRLW2ldKTsKKyAgICAgICAgaWYgKHNlbGYtPnFtZlJlc2lkdWFsUmVhbF9fRkRLICE9IE5VTEwpCisgICAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzJEX0FMSUdORUQoc2VsZi0+cW1mUmVzaWR1YWxSZWFsX19GREtbaV0pOworICAgICAgfQorCisgICAgICBGREtfRlJFRV9NRU1PUllfMUQoc2VsZi0+aHliUmVzaWR1YWxJbWFnX19GREspOworICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPmh5YlJlc2lkdWFsUmVhbF9fRkRLKTsKKworICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPnFtZlJlc2lkdWFsSW1hZ19fRkRLKTsKKyAgICAgIEZES19GUkVFX01FTU9SWV8xRChzZWxmLT5xbWZSZXNpZHVhbFJlYWxfX0ZESyk7CisKKyAgICB9IC8qIHNlbGYtPmNyZWF0ZVBhcmFtcy5iUHJvY1Jlc2lkdWFsICovCisKKyAgICBGREtfRlJFRV9NRU1PUllfMkQoc2VsZi0+aHliSW5wdXRJbWFnX19GREspOworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5oeWJJbnB1dFJlYWxfX0ZESyk7CisKKyAgICBGREtfRlJFRV9NRU1PUllfMkRfQUxJR05FRChzZWxmLT5xbWZJbnB1dEltYWdfX0ZESyk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEX0FMSUdORUQoc2VsZi0+cW1mSW5wdXRSZWFsX19GREspOworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzNEKHNlbGYtPk0ySW1hZ1ByZXZfX0ZESyk7CisKKyAgICBGREtfRlJFRV9NRU1PUllfM0Qoc2VsZi0+TTJSZWFsUHJldl9fRkRLKTsKKworICAgIEZES19GUkVFX01FTU9SWV8zRChzZWxmLT5NMkltYWdfX0ZESyk7CisKKyAgICBGREtfRlJFRV9NRU1PUllfM0Qoc2VsZi0+TTJSZWFsX19GREspOworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPmFyYmRteEFscGhhUHJldl9fRkRLKTsKKyAgICBGREtfRlJFRV9NRU1PUllfMUQoc2VsZi0+YXJiZG14QWxwaGFfX0ZESyk7CisKKyAgICBGREtfRlJFRV9NRU1PUllfM0Qoc2VsZi0+YXJiZG14R2Fpbl9fRkRLKTsKKworICAgIEZES19GUkVFX01FTU9SWV8zRChzZWxmLT5vdHRJUERfX0ZESyk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzNEKHNlbGYtPm90dElDQ19fRkRLKTsKKyAgICBGREtfRlJFRV9NRU1PUllfM0Qoc2VsZi0+b3R0Q0xEX19GREspOworCisgICAgLyogTGFzdCBwYXJhbWV0ZXJzIGZyb20gcHJldiBmcmFtZSAqLworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5vdHRDTERpZHhQcmV2KTsKKyAgICBGREtfRlJFRV9NRU1PUllfMkQoc2VsZi0+b3R0SUNDaWR4UHJldik7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzNEKHNlbGYtPm90dElDQ2RpZmZpZHgpOworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5vdHRJUERpZHhQcmV2KTsKKyAgICBGREtfRlJFRV9NRU1PUllfMkQoc2VsZi0+YXJiZG14R2FpbklkeFByZXYpOworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPmNtcE90dENMRGlkeFByZXYpOworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5jbXBPdHRJQ0NpZHhQcmV2KTsKKyAgICBGREtfRlJFRV9NRU1PUllfM0Qoc2VsZi0+b3V0SWR4RGF0YSk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPmNtcE90dElQRGlkeFByZXYpOworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5jbXBBcmJkbXhHYWluSWR4UHJldik7CisKKyAgICBGREtfRlJFRV9NRU1PUllfMkQoc2VsZi0+c21nRGF0YSk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPnNtZ1RpbWUpOworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPm51bU90dEJhbmRzKTsKKworICAgIEZES19GUkVFX01FTU9SWV8xRChzZWxmLT5wYXJhbTJoeWIpOworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYpOworICB9CisKKyAgcmV0dXJuOworfQorCisvKioKKyAqIFxicmllZiBBcHBseSBTdXJyb3VuZCBieXBhc3MgYnVmZmVyIGNvcGllcworICogXHBhcmFtIHNlbGYgc3BhdGlhbERlYyBoYW5kbGUKKyAqIFxwYXJhbSBoeWJJbnB1dFJlYWwKKyAqIFxwYXJhbSBoeWJJbnB1dEltYWcKKyAqIFxwYXJhbSBoeWJPdXRwdXRSZWFsCisgKiBccGFyYW0gaHliT3V0cHV0SW1hZworICogXHBhcmFtIG51bUlucHV0Q2hhbm5lbHMgYW1vdW50IGlmIGlucHV0IGNoYW5uZWxzIGF2YWlsYWJsZSBpbiBoeWJJbnB1dFJlYWwKKyAqIGFuZCBoeWJJbnB1dEltYWcsIHdoaWNoIG1heSBkaWZmZXIgZnJvbSBzZWxmLT5udW1JbnB1dENoYW5uZWxzLgorICovCitzdGF0aWMgdm9pZCBTcGF0aWFsRGVjQXBwbHlCeXBhc3Moc3BhdGlhbERlYyAqc2VsZiwgRklYUF9EQkwgKipoeWJJbnB1dFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJJbnB1dEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0SW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtSW5wdXRDaGFubmVscykgeworICBpbnQgY29tcGxleEh5YkJhbmRzOworCisgIGNvbXBsZXhIeWJCYW5kcyA9IHNlbGYtPmh5YnJpZEJhbmRzOworCisgIHsKKyAgICBpbnQgY2g7CisgICAgaW50IHJmID0gLTEsIGxmID0gLTEsIGNmID0gLTE7IC8qIFJpZ2h0IEZyb250LCBMZWZ0IEZyb250LCBDZW50ZXIgRnJvbnQgKi8KKworICAgIC8qIERldGVybWluZSBvdXRwdXQgY2hhbm5lbCBpbmRpY2VzIGFjY29yZGluZyB0byB0cmVlIGNvbmZpZyAqLworICAgIHN3aXRjaCAoc2VsZi0+dHJlZUNvbmZpZykgeworICAgICAgY2FzZSBUUkVFXzIxMjogLyogMjEyICAqLworICAgICAgICBsZiA9IDA7CisgICAgICAgIHJmID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OjsKKyAgICB9CisKKyAgICAvKiBOb3RlOiBudW1JbnB1dENoYW5uZWxzIG1pZ2h0IG5vdCBtYXRjaCB0aGUgdHJlZSBjb25maWcgISAqLworICAgIHN3aXRjaCAobnVtSW5wdXRDaGFubmVscykgeworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoY2YgPiAwKSB7CisgICAgICAgICAgRkRLbWVtY3B5KGh5Yk91dHB1dFJlYWxbY2ZdLCBoeWJJbnB1dFJlYWxbMF0sCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPmh5YnJpZEJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgRkRLbWVtY3B5KGh5Yk91dHB1dEltYWdbY2ZdLCBoeWJJbnB1dEltYWdbMF0sCisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhIeWJCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEZES21lbWNweShoeWJPdXRwdXRSZWFsW2xmXSwgaHliSW5wdXRSZWFsWzBdLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5oeWJyaWRCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIEZES21lbWNweShoeWJPdXRwdXRSZWFsW3JmXSwgaHliSW5wdXRSZWFsWzBdLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5oeWJyaWRCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIEZES21lbWNweShoeWJPdXRwdXRJbWFnW2xmXSwgaHliSW5wdXRJbWFnWzBdLAorICAgICAgICAgICAgICAgICAgICBjb21wbGV4SHliQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICBGREttZW1jcHkoaHliT3V0cHV0SW1hZ1tyZl0sIGh5YklucHV0SW1hZ1swXSwKKyAgICAgICAgICAgICAgICAgICAgY29tcGxleEh5YkJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIEZES19BU1NFUlQobGYgIT0gLTEpOworICAgICAgICBGREtfQVNTRVJUKHJmICE9IC0xKTsKKyAgICAgICAgRkRLbWVtY3B5KGh5Yk91dHB1dFJlYWxbbGZdLCBoeWJJbnB1dFJlYWxbMF0sCisgICAgICAgICAgICAgICAgICBzZWxmLT5oeWJyaWRCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICBGREttZW1jcHkoaHliT3V0cHV0UmVhbFtyZl0sIGh5YklucHV0UmVhbFsxXSwKKyAgICAgICAgICAgICAgICAgIHNlbGYtPmh5YnJpZEJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNweShoeWJPdXRwdXRJbWFnW2xmXSwgaHliSW5wdXRJbWFnWzBdLAorICAgICAgICAgICAgICAgICAgY29tcGxleEh5YkJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNweShoeWJPdXRwdXRJbWFnW3JmXSwgaHliSW5wdXRJbWFnWzFdLAorICAgICAgICAgICAgICAgICAgY29tcGxleEh5YkJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5udW1PdXRwdXRDaGFubmVsc0FUOyBjaCsrKSB7CisgICAgICBpZiAoY2ggPT0gbGYgfHwgY2ggPT0gcmYgfHwgY2ggPT0gY2YpIHsKKyAgICAgICAgY29udGludWU7IC8qIFNraXAgYnlwYXNzZWQgY2hhbm5lbHMgKi8KKyAgICAgIH0KKyAgICAgIEZES21lbWNsZWFyKGh5Yk91dHB1dFJlYWxbY2hdLCBzZWxmLT5oeWJyaWRCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY2xlYXIoaHliT3V0cHV0SW1hZ1tjaF0sIGNvbXBsZXhIeWJCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogU3BhdGlhbERlY0FwcGx5UGFyYW1ldGVyU2V0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFNBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQXBwbHlQYXJhbWV0ZXJTZXRzKAorICAgIHNwYXRpYWxEZWMgKnNlbGYsIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLCBTUEFUSUFMREVDX0lOUFVUX01PREUgbW9kZSwKKyAgICBQQ01fTVBTICppbkRhdGEsICAgICAgICAgIC8qIFRpbWUgZG9tYWluIGlucHV0ICAqLworICAgIEZJWFBfREJMICoqcW1mSW5EYXRhUmVhbCwgLyogUU1GIGRvbWFpbiBkYXRhIGwvciAqLworICAgIEZJWFBfREJMICoqcW1mSW5EYXRhSW1hZywgLyogUU1GIGRvbWFpbiBkYXRhIGwvciAqLworICAgIFVJTlQgblNhbXBsZXMsIFVJTlQgY29udHJvbEZsYWdzLCBpbnQgbnVtSW5wdXRDaGFubmVscywKKyAgICBjb25zdCBGREtfY2hhbm5lbE1hcERlc2NyICpjb25zdCBtYXBEZXNjcikgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworCisgIEZJWFBfU0dMIGFscGhhOworCisgIGludCB0czsKKyAgaW50IGNoOworICBpbnQgaHliOworCisgIGludCBwcmV2U2xvdCA9IHNlbGYtPnByZXZUaW1lU2xvdDsKKyAgaW50IHBzID0gc2VsZi0+Y3VyUHM7CisgIGludCB0c19pbyA9IDA7IC8qIGkvbyBkZXBlbmRlbnQgc2xvdCAqLworICBpbnQgYnlwYXNzTW9kZSA9IChjb250cm9sRmxhZ3MgJiBNUEVHU19CWVBBU1NNT0RFKSA/IDEgOiAwOworCisgIC8qIEJ5cGFzcyBjYW4gYmUgdHJpZ2dlcmVkIGJ5IHRoZSB1cG1peFR5cGUsIHRvby4gKi8KKyAgYnlwYXNzTW9kZSB8PSAoKHNlbGYtPnVwbWl4VHlwZSA9PSBVUE1JWFRZUEVfQllQQVNTKSA/IDEgOiAwKTsKKworICAvKgorICAgKiBEZWNvZGUgYXZhaWxhYmxlIHNsb3RzCisgICAqLworICBmb3IgKHRzID0gc2VsZi0+Y3VyVGltZVNsb3Q7CisgICAgICAgdHMgPD0gZml4TWluKHNlbGYtPmN1clRpbWVTbG90ICsgKGludCluU2FtcGxlcyAvIHNlbGYtPnFtZkJhbmRzIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+dGltZVNsb3RzIC0gMSk7CisgICAgICAgdHMrKywgdHNfaW8rKykgeworICAgIGludCBjdXJyU2xvdCA9IGZyYW1lLT5wYXJhbVNsb3RbcHNdOworCisgICAgLyoKKyAgICAgKiBHZXQgbmV3IHBhcmFtZXRlciBzZXQKKyAgICAgKi8KKyAgICBpZiAodHMgPT0gcHJldlNsb3QgKyAxKSB7CisgICAgICBlcnIgPSBTcGF0aWFsRGVjQ2FsY3VsYXRlTTFhbmRNMihzZWxmLCBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lKTsgLyogaW5wdXQ6IG90dENMRCwgb3R0SUNDLCAuLi4gKi8KKyAgICAgIC8qIG91dHB1dDogTTFwYXJhbShSZWFsL0ltYWcpLCBNMihSZWFsL0ltYWcpICovCisgICAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgICBieXBhc3NNb2RlID0gMTsKKyAgICAgICAgaWYgKHNlbGYtPmVyckludCA9PSBNUFNfT0spIHsKKyAgICAgICAgICAvKiBzdG9yZSBpbnRlcm5hbCBlcnJvciBiZWZvciBpdCBnZXRzIG92ZXJ3cml0dGVuICovCisgICAgICAgICAgc2VsZi0+ZXJySW50ID0gZXJyOworICAgICAgICB9CisgICAgICAgIGVyciA9IE1QU19PSzsKKyAgICAgIH0KKworICAgICAgaWYgKChwcyA9PSAwKSAmJiAoc2VsZi0+Yk92ZXJ3cml0ZU0xTTJwcmV2ICE9IDApKSB7CisgICAgICAgIC8qIGNvcHkgbWF0cml4IGVudHJpZXMgb2YgTTEvTTIgb2YgdGhlIGZpcnN0IHBhcmFtZXRlciBzZXQgdG8gdGhlCisgICAgICAgICAgIHByZXZpb3VzIG1hdHJpY2VzIChvZiB0aGUgbGFzdCBmcmFtZSkuIFRoaXMgYXZvaWRzIHRoZSBpbnRlcnBvbGF0aW9uCisgICAgICAgICAgIG9mIGluY29tcGF0aWJsZSB2YWx1ZXMuIEUuZy4gZm9yIHJlc2lkdWFsIGJhbmRzIHRoZSBjb2VmZmljaWVudHMgYXJlCisgICAgICAgICAgIGNhbGN1bGF0ZWQgZGlmZmVyZW50bHkgY29tcGFyZWQgdG8gbm9uLXJlc2lkdWFsIGJhbmRzLgorICAgICAgICAgKi8KKyAgICAgICAgU3BhdGlhbERlY0J1ZmZlck1hdHJpY2VzKHNlbGYpOyAvKiBpbnB1dDogTSgxLzIpcGFyYW0oUmVhbC9JbWFnKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogTSgxLzIpcGFyYW0oUmVhbC9JbWFnKVByZXYgKi8KKyAgICAgICAgc2VsZi0+Yk92ZXJ3cml0ZU0xTTJwcmV2ID0gMDsKKyAgICAgIH0KKworICAgICAgU3BhdGlhbERlY1Ntb290aE0xYW5kTTIoCisgICAgICAgICAgc2VsZiwgZnJhbWUsCisgICAgICAgICAgcHMpOyAvKiBpbnB1dDogTTFwYXJhbShSZWFsL0ltYWcpKFByZXYpLCBNMihSZWFsL0ltYWcpKFByZXYpICovCisgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IE0xcGFyYW0oUmVhbC9JbWFnKSwgTTIoUmVhbC9JbWFnKSAqLworICAgIH0KKworICAgIGFscGhhID0gRlhfREJMMkZYX1NHTChmRGl2Tm9ybSh0cyAtIHByZXZTbG90LCBjdXJyU2xvdCAtIHByZXZTbG90KSk7CisKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgIGNhc2UgSU5QVVRNT0RFX1FNRl9TQlI6CisgICAgICAgIGlmIChzZWxmLT5wQ29uZmlnQ3VycmVudC0+c3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX0xEKQorICAgICAgICAgIHNlbGYtPmJTaGFyZURlbGF5V2l0aFNCUiA9IDA7IC8qIFdlIGdvdCBubyBoeWJyaWQgZGVsYXkgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgIHNlbGYtPmJTaGFyZURlbGF5V2l0aFNCUiA9IDE7CisgICAgICAgIFNwYXRpYWxEZWNGZWVkUU1GKHNlbGYsIHFtZkluRGF0YVJlYWwsIHFtZkluRGF0YUltYWcsIHRzX2lvLCBieXBhc3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5xbWZJbnB1dFJlYWxfX0ZESywgc2VsZi0+cW1mSW5wdXRJbWFnX19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm51bUlucHV0Q2hhbm5lbHMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSU5QVVRNT0RFX1RJTUU6CisgICAgICAgIHNlbGYtPmJTaGFyZURlbGF5V2l0aFNCUiA9IDA7CisgICAgICAgIFNwYXRpYWxEZWNRTUZBbmFseXNpcyhzZWxmLCBpbkRhdGEsIHRzX2lvLCBieXBhc3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cW1mSW5wdXRSZWFsX19GREssIHNlbGYtPnFtZklucHV0SW1hZ19fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+bnVtSW5wdXRDaGFubmVscyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKChzZWxmLT5wQ29uZmlnQ3VycmVudC0+c3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX1VTQUMpICYmCisgICAgICAgIHNlbGYtPnJlc2lkdWFsQ29kaW5nKSB7CisgICAgICBpbnQgb2Zmc2V0OworICAgICAgY2ggPSAxOworCisgICAgICBvZmZzZXQgPSBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc1N5bnRoZXNpcyAqCisgICAgICAgICAgICAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5RbWZUaW1lU2xvdHM7CisKKyAgICAgIHsKKyAgICAgICAgY29uc3QgUENNX01QUyAqaW5TYW1wbGVzID0KKyAgICAgICAgICAgICZpbkRhdGFbdHMgKiBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc0FuYWx5c2lzXTsKKworICAgICAgICBDYWxjdWxhdGVTcGFjZUFuYWx5c2lzUW1mKAorICAgICAgICAgICAgJnNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbkluW2NoXS5mYiwgaW5TYW1wbGVzICsgKGNoICogb2Zmc2V0KSwKKyAgICAgICAgICAgIHNlbGYtPnFtZlJlc2lkdWFsUmVhbF9fRkRLWzBdWzBdLCBzZWxmLT5xbWZSZXNpZHVhbEltYWdfX0ZES1swXVswXSk7CisKKyAgICAgICAgaWYgKCFpc1R3b0NoTW9kZShzZWxmLT51cG1peFR5cGUpICYmICFieXBhc3NNb2RlKSB7CisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNlbGZfcW1mUmVzaWR1YWxSZWFsX19GREtfMF8wID0KKyAgICAgICAgICAgICAgJnNlbGYtPnFtZlJlc2lkdWFsUmVhbF9fRkRLWzBdWzBdWzBdOworICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBzZWxmX3FtZlJlc2lkdWFsSW1hZ19fRkRLXzBfMCA9CisgICAgICAgICAgICAgICZzZWxmLT5xbWZSZXNpZHVhbEltYWdfX0ZES1swXVswXVswXTsKKworICAgICAgICAgIGlmICgoc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uQmFuZHNBbmFseXNpcyA9PSAyNCkgJiYKKyAgICAgICAgICAgICAgIShzZWxmLT5zdGVyZW9Db25maWdJbmRleCA9PSAzKSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPnFtZkJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgc2VsZl9xbWZSZXNpZHVhbFJlYWxfX0ZES18wXzBbaV0gPQorICAgICAgICAgICAgICAgICAgZk11bHQoc2VsZl9xbWZSZXNpZHVhbFJlYWxfX0ZES18wXzBbaV0gPDwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNsaXBQcm90ZWN0R2Fpbl9fRkRLKTsKKyAgICAgICAgICAgICAgc2VsZl9xbWZSZXNpZHVhbEltYWdfX0ZES18wXzBbaV0gPQorICAgICAgICAgICAgICAgICAgZk11bHQoc2VsZl9xbWZSZXNpZHVhbEltYWdfX0ZES18wXzBbaV0gPDwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNsaXBQcm90ZWN0R2Fpbl9fRkRLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPnFtZkJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgc2VsZl9xbWZSZXNpZHVhbFJlYWxfX0ZES18wXzBbaV0gPSBmTXVsdCgKKyAgICAgICAgICAgICAgICAgIHNlbGZfcW1mUmVzaWR1YWxSZWFsX19GREtfMF8wW2ldLCBzZWxmLT5jbGlwUHJvdGVjdEdhaW5fX0ZESyk7CisgICAgICAgICAgICAgIHNlbGZfcW1mUmVzaWR1YWxJbWFnX19GREtfMF8wW2ldID0gZk11bHQoCisgICAgICAgICAgICAgICAgICBzZWxmX3FtZlJlc2lkdWFsSW1hZ19fRkRLXzBfMFtpXSwgc2VsZi0+Y2xpcFByb3RlY3RHYWluX19GREspOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIFNwYXRpYWxEZWNIeWJyaWRBbmFseXNpcygKKyAgICAgICAgc2VsZiwgLyogaW5wdXQ6IHFtZklucHV0KFJlYWwvSW1hZyksIHFtZlJlc2lkdWFsKFJlYWwvSW1hZykgKi8KKyAgICAgICAgc2VsZi0+cW1mSW5wdXRSZWFsX19GREssIHNlbGYtPnFtZklucHV0SW1hZ19fRkRLLAorICAgICAgICBzZWxmLT5oeWJJbnB1dFJlYWxfX0ZESywgc2VsZi0+aHliSW5wdXRJbWFnX19GREssIHRzLCBudW1JbnB1dENoYW5uZWxzKTsKKworICAgIGlmIChieXBhc3NNb2RlKSB7CisgICAgICBTcGF0aWFsRGVjQXBwbHlCeXBhc3MoCisgICAgICAgICAgc2VsZiwgc2VsZi0+aHliSW5wdXRSZWFsX19GREssIC8qIGlucHV0OiBoeWJJbnB1dChSZWFsL0ltYWcpICovCisgICAgICAgICAgc2VsZi0+aHliSW5wdXRJbWFnX19GREssCisgICAgICAgICAgc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLLCAvKiBvdXRwdXQ6IGh5Yk91dHB1dChSZWFsL0ltYWcpRHJ5ICovCisgICAgICAgICAgc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLLCBudW1JbnB1dENoYW5uZWxzKTsKKyAgICB9IGVsc2UgLyogIWJ5cGFzc01vZGUgKi8KKyAgICB7CisgICAgICBGSVhQX0RCTCAqcHhSZWFsW01BWF9OVU1fWENIQU5ORUxTXSA9IHtOVUxMfTsKKyAgICAgIEZJWFBfREJMICpweEltYWdbTUFYX05VTV9YQ0hBTk5FTFNdID0ge05VTEx9OworCisgICAgICBTcGF0aWFsRGVjQ3JlYXRlWChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aHliSW5wdXRSZWFsX19GREssIC8qIGlucHV0OiBoeWJJbnB1dChSZWFsL0ltYWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5YlJlc2lkdWFsKFJlYWwvSW1hZykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmh5YklucHV0SW1hZ19fRkRLLCBweFJlYWwsIHB4SW1hZyk7CisKKyAgICAgIHsKKyAgICAgICAgU3BhdGlhbERlY0FwcGx5TTFfQ3JlYXRlV19Nb2RlMjEyKAorICAgICAgICAgICAgc2VsZiwgZnJhbWUsIHB4UmVhbCwgcHhJbWFnLAorICAgICAgICAgICAgc2VsZi0+d1JlYWxfX0ZESywgLyogb3V0cHV0OiB3KFJlYWwvSW1hZykgKi8KKyAgICAgICAgICAgIHNlbGYtPndJbWFnX19GREspOworICAgICAgfQorICAgICAgaWYgKGVyciAhPSBNUFNfT0spIGdvdG8gYmFpbDsKKworICAgICAgaW50IGFwcGx5TTJDb25maWcgPSBBUFBMWV9NMl9OT05FOworCisgICAgICBhcHBseU0yQ29uZmlnID0gQVBQTFlfTTI7CisgICAgICBpZiAoKHNlbGYtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmCisgICAgICAgICAgIChTQUNERUNfU1lOVEFYX1VTQUMgfCBTQUNERUNfU1lOVEFYX1JTVkQ1MCkpICYmCisgICAgICAgICAgKHNlbGYtPnRlbXBTaGFwZUNvbmZpZyAhPSAxKSAmJiAoc2VsZi0+dGVtcFNoYXBlQ29uZmlnICE9IDIpKSB7CisgICAgICAgIGlmIChzZWxmLT5waGFzZUNvZGluZyA9PSAzKQorICAgICAgICAgIGFwcGx5TTJDb25maWcgPSBBUFBMWV9NMl9NT0RFMjEyX1Jlc19QaGFzZUNvZGluZzsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFwcGx5TTJDb25maWcgPSBBUFBMWV9NMl9NT0RFMjEyOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGFwcGx5TTJDb25maWcpIHsKKyAgICAgICAgY2FzZSBBUFBMWV9NMl9NT0RFMjEyOiB7CisgICAgICAgICAgZXJyID0gU3BhdGlhbERlY0FwcGx5TTJfTW9kZTIxMigKKyAgICAgICAgICAgICAgc2VsZiwgcHMsIGFscGhhLCBzZWxmLT53UmVhbF9fRkRLLCBzZWxmLT53SW1hZ19fRkRLLAorICAgICAgICAgICAgICBzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREssIHNlbGYtPmh5Yk91dHB1dEltYWdEcnlfX0ZESyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQVBQTFlfTTJfTU9ERTIxMl9SZXNfUGhhc2VDb2Rpbmc6CisgICAgICAgICAgZXJyID0gU3BhdGlhbERlY0FwcGx5TTJfTW9kZTIxMl9SZXNpZHVhbHNQbHVzUGhhc2VDb2RpbmcoCisgICAgICAgICAgICAgIHNlbGYsIHBzLCBhbHBoYSwgc2VsZi0+d1JlYWxfX0ZESywgc2VsZi0+d0ltYWdfX0ZESywKKyAgICAgICAgICAgICAgc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLLCBzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREspOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFQUExZX00yOgorICAgICAgICAgIGVyciA9IFNwYXRpYWxEZWNBcHBseU0yKAorICAgICAgICAgICAgICBzZWxmLCBwcywgYWxwaGEsIHNlbGYtPndSZWFsX19GREssIHNlbGYtPndJbWFnX19GREssCisgICAgICAgICAgICAgIHNlbGYtPmh5Yk91dHB1dFJlYWxEcnlfX0ZESywgc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLLAorICAgICAgICAgICAgICBzZWxmLT5oeWJPdXRwdXRSZWFsV2V0X19GREssIHNlbGYtPmh5Yk91dHB1dEltYWdXZXRfX0ZESyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZXJyID0gTVBTX0FQUExZX00yX0VSUk9SOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKworICAgICAgaWYgKGVyciAhPSBNUFNfT0spIGdvdG8gYmFpbDsKKworICAgICAgaWYgKChzZWxmLT50ZW1wU2hhcGVDb25maWcgPT0gMikgJiYgKCFpc1R3b0NoTW9kZShzZWxmLT51cG1peFR5cGUpKSkgeworICAgICAgICBTcGF0aWFsRGVjUmVzaGFwZUJCRW52KHNlbGYsIGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzKTsgLyogaW5wdXQ6IHJlc2hhcGVCQkVudlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHliT3V0cHV0KFJlYWwvSW1hZykoRHJ5L1dldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJJbnB1dChSZWFsL0ltYWcpICovCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IGh5Yk91dHB1dChSZWFsL0ltYWcpRHJ5ICovCisKKyAgICAgIC8qIE1lcmdlIHBhcnRzIG9mIHRoZSBkcnkgYW5kIHdldCBRTUYgYnVmZmVycy4gKi8KKyAgICAgIGlmICgoc2VsZi0+dGVtcFNoYXBlQ29uZmlnID09IDEpICYmICghaXNUd29DaE1vZGUoc2VsZi0+dXBtaXhUeXBlKSkpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICBmb3IgKGh5YiA9IDA7IGh5YiA8IHNlbGYtPnRwX2h5YkJhbmRCb3JkZXI7IGh5YisrKSB7CisgICAgICAgICAgICBzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREtbY2hdW2h5Yl0gKz0KKyAgICAgICAgICAgICAgICBzZWxmLT5oeWJPdXRwdXRSZWFsV2V0X19GREtbY2hdW2h5Yl07CisgICAgICAgICAgICBzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREtbY2hdW2h5Yl0gKz0KKyAgICAgICAgICAgICAgICBzZWxmLT5oeWJPdXRwdXRJbWFnV2V0X19GREtbY2hdW2h5Yl07CisgICAgICAgICAgfSAvKiBsb29wIGh5YiAqLworICAgICAgICB9ICAgLyogbG9vcCBjaCAqLworICAgICAgICBlcnIgPSBzdWJiYW5kVFBBcHBseSgKKyAgICAgICAgICAgIHNlbGYsIGZyYW1lKTsgLyogaW5wdXQ6IGhTdHBEZWMsIGh5Yk91dHB1dChSZWFsL0ltYWcpRHJ5L1dldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IGhTdHBEZWMsIGh5Yk91dHB1dChSZWFsL0ltYWcpRHJ5ICovCisgICAgICAgIGlmIChlcnIgIT0gTVBTX09LKSBnb3RvIGJhaWw7CisgICAgICB9IC8qIChzZWxmLT50ZW1wU2hhcGVDb25maWcgPT0gMSkgKi8KKyAgICAgIGVsc2UgeworICAgICAgICAvKiBUaGUgd2V0IHNpZ25hbCBpcyBhZGRlZCB0byB0aGUgZHJ5IHNpZ25hbCBpbiBhcHBseU0yIGlmIEdFUyBhbmQgU1RQCisgICAgICAgICAqIGFyZSBkaXNhYmxlZCAqLworICAgICAgICBpZiAoKHNlbGYtPnRlbXBTaGFwZUNvbmZpZyA9PSAxKSB8fCAoc2VsZi0+dGVtcFNoYXBlQ29uZmlnID09IDIpKSB7CisgICAgICAgICAgaW50IG5IeWJCYW5kczsKKyAgICAgICAgICBuSHliQmFuZHMgPSBzZWxmLT5oeWJyaWRCYW5kczsKKworICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPm51bU91dHB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFJlYWxEcnkgPSBzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREtbY2hdOworICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBJbWFnRHJ5ID0gc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLW2NoXTsKKyAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwUmVhbFdldCA9IHNlbGYtPmh5Yk91dHB1dFJlYWxXZXRfX0ZES1tjaF07CisgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEltYWdXZXQgPSBzZWxmLT5oeWJPdXRwdXRJbWFnV2V0X19GREtbY2hdOworICAgICAgICAgICAgZm9yIChoeWIgPSAwOyBoeWIgPCBuSHliQmFuZHM7IGh5YisrKSB7CisgICAgICAgICAgICAgIHBSZWFsRHJ5W2h5Yl0gKz0gcFJlYWxXZXRbaHliXTsKKyAgICAgICAgICAgICAgcEltYWdEcnlbaHliXSArPSBwSW1hZ1dldFtoeWJdOworICAgICAgICAgICAgfSAvKiBsb29wIGh5YiAqLworICAgICAgICAgICAgZm9yICg7IGh5YiA8IHNlbGYtPmh5YnJpZEJhbmRzOyBoeWIrKykgeworICAgICAgICAgICAgICBwUmVhbERyeVtoeWJdICs9IHBSZWFsV2V0W2h5Yl07CisgICAgICAgICAgICB9IC8qIGxvb3AgaHliICovCisgICAgICAgICAgfSAgIC8qIGxvb3AgY2ggKi8KKyAgICAgICAgfSAvKiAoIHNlbGYtPnRlbXBTaGFwZUNvbmZpZyA9PSAxICkgfHwgKCBzZWxmLT50ZW1wU2hhcGVDb25maWcgPT0gMiApICovCisgICAgICB9ICAgLyogIXNlbGYtPnRlbXBTaGFwZUNvbmZpZyA9PSAxICovCisgICAgfSAgICAgLyogICFieXBhc3NNb2RlICovCisKKyAgICBpZiAoc2VsZi0+cGhhc2VDb2RpbmcgPT0gMSkgeworICAgICAgLyogb25seSBpZiBic1BoYXNlQ29kaW5nID09IDEgYW5kIGJzUmVzaWR1YWxDb2RpbmcgPT0gMCAqLworCisgICAgICBTcGF0aWFsRGVjQXBwbHlQaGFzZSgKKyAgICAgICAgICBzZWxmLCBhbHBoYSwgKHRzID09IGN1cnJTbG90KSAvKiBzaWduYWwgdGhlIGxhc3Qgc2xvdCBvZiB0aGUgc2V0ICovCisgICAgICApOworICAgIH0KKworICAgIC8qCisgICAgICogU3ludGhlc2lzIEZpbHRlcmluZworICAgICAqLworCisgICAgZXJyID0gU3BhdGlhbERlY1N5bnRoZXNpcygKKyAgICAgICAgc2VsZiwgdHNfaW8sCisgICAgICAgIHNlbGYtPmh5Yk91dHB1dFJlYWxEcnlfX0ZESywgLyogaW5wdXQ6IGh5Yk91dHB1dChSZWFsL0ltYWcpRHJ5ICovCisgICAgICAgIHNlbGYtPmh5Yk91dHB1dEltYWdEcnlfX0ZESywgc2VsZi0+dGltZU91dF9fRkRLLCAvKiBvdXRwdXQ6IHRpbWVPdXQgKi8KKyAgICAgICAgbnVtSW5wdXRDaGFubmVscywgbWFwRGVzY3IpOworCisgICAgaWYgKGVyciAhPSBNUFNfT0spIGdvdG8gYmFpbDsKKworICAgIC8qCisgICAgICogVXBkYXRlIHBhcmFtZXRlciBidWZmZXIKKyAgICAgKi8KKyAgICBpZiAodHMgPT0gY3VyclNsb3QpIHsKKyAgICAgIFNwYXRpYWxEZWNCdWZmZXJNYXRyaWNlcyhzZWxmKTsgLyogaW5wdXQ6IE0oMS8yKXBhcmFtKFJlYWwvSW1hZykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBNKDEvMilwYXJhbShSZWFsL0ltYWcpUHJldiAqLworCisgICAgICBwcmV2U2xvdCA9IGN1cnJTbG90OworICAgICAgcHMrKzsKKyAgICB9IC8qIGlmICh0cz09Y3VyclNsb3QpICovCisKKyAgfSAvKiB0cyBsb29wICovCisKKyAgLyoKKyAgICogU2F2ZSBwYXJhbWV0ZXIgc3RhdGVzCisgICAqLworICBzZWxmLT5wcmV2VGltZVNsb3QgPSBwcmV2U2xvdDsKKyAgc2VsZi0+Y3VyVGltZVNsb3QgPSB0czsKKyAgc2VsZi0+Y3VyUHMgPSBwczsKKworYmFpbDoKKworICByZXR1cm4gZXJyOworfQorCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0FwcGx5RnJhbWUoCisgICAgc3BhdGlhbERlYyAqc2VsZiwKKyAgICBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwgLyogcGFyc2VkIGZyYW1lIGRhdGEgdG8gYmUgYXBwbGllZCAqLworICAgIFNQQVRJQUxERUNfSU5QVVRfTU9ERSBpbnB1dE1vZGUsIFBDTV9NUFMgKmluRGF0YSwgLyogVGltZSBkb21haW4gaW5wdXQgICovCisgICAgRklYUF9EQkwgKipxbWZJbkRhdGFSZWFsLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRTUYgZG9tYWluIGRhdGEgbC9yICovCisgICAgRklYUF9EQkwgKipxbWZJbkRhdGFJbWFnLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRTUYgZG9tYWluIGRhdGEgbC9yICovCisgICAgUENNX01QUyAqcGNtT3V0QnVmLCAvKiBNQVhfT1VUUFVUX0NIQU5ORUxTKk1BWF9USU1FX1NMT1RTKk5VTV9RTUZfQkFORFNdICovCisgICAgVUlOVCBuU2FtcGxlcywgVUlOVCAqcENvbnRyb2xGbGFncywgaW50IG51bUlucHV0Q2hhbm5lbHMsCisgICAgY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciAqY29uc3QgbWFwRGVzY3IpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKworICBpbnQgZkRlY0FuZE1hcEZyYW1lRGF0YTsKKyAgaW50IGNvbnRyb2xGbGFnczsKKworICBGREtfQVNTRVJUKHNlbGYgIT0gTlVMTCk7CisgIEZES19BU1NFUlQocENvbnRyb2xGbGFncyAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwY21PdXRCdWYgIT0gTlVMTCk7CisKKyAgc2VsZi0+ZXJySW50ID0gZXJyOyAvKiBJbml0IGludGVybmFsIGVycm9yICovCisKKyAgY29udHJvbEZsYWdzID0gKnBDb250cm9sRmxhZ3M7CisKKyAgaWYgKChzZWxmLT5wQ29uZmlnQ3VycmVudC0+c3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX1VTQUMpICYmCisgICAgICAoc2VsZi0+c3RlcmVvQ29uZmlnSW5kZXggPiAxKSkgeworICAgIG51bUlucHV0Q2hhbm5lbHMgPQorICAgICAgICAxOyAvKiBEbyBub3QgY291bnQgcmVzaWR1YWwgY2hhbm5lbCBhcyBpbnB1dCBjaGFubmVsLiBJdCBpcyBoYW5kbGVkCisgICAgICAgICAgICAgIHNlcGVyYXRlbHkuICovCisgIH0KKworICAvKiBDaGVjayBpZiBpbnB1dCBhbW91bnQgb2YgY2hhbm5lbHMgaXMgY29uc2lzdGVudCAqLworICBpZiAobnVtSW5wdXRDaGFubmVscyAhPSBzZWxmLT5udW1JbnB1dENoYW5uZWxzKSB7CisgICAgY29udHJvbEZsYWdzIHw9IE1QRUdTX0NPTkNFQUw7CisgICAgaWYgKG51bUlucHV0Q2hhbm5lbHMgPiBzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtSW5wdXRDaGFubmVscykgeworICAgICAgcmV0dXJuIE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgIH0KKworICBzZWxmLT50aW1lT3V0X19GREsgPSBwY21PdXRCdWY7CisKKyAgLyogRGV0ZXJtaW5lIGxvY2FsIGZ1bmN0aW9uIGNvbnRyb2wgZmxhZ3MgKi8KKyAgZkRlY0FuZE1hcEZyYW1lRGF0YSA9IGZyYW1lLT5uZXdCc0RhdGE7CisKKyAgaWYgKCgoZkRlY0FuZE1hcEZyYW1lRGF0YSA9PQorICAgICAgICAwKSAvKiBhc3N1cmVzIHRoYXQgY29uY2VhbCBmbGFnIHdpbGwgbm90IGJlIHNldCBmb3IgYmxpbmQgbW9kZSAqLworICAgICAgICYmIChzZWxmLT5jdXJUaW1lU2xvdCArIChpbnQpblNhbXBsZXMgLyBzZWxmLT5xbWZCYW5kcyA+CisgICAgICAgICAgIHNlbGYtPnRpbWVTbG90cykpIHx8CisgICAgICAoZnJhbWUtPm51bVBhcmFtZXRlclNldHMgPT0KKyAgICAgICAwKSkgeyAvKiBOZXcgaW5wdXQgc2FtcGxlcyBidXQgbWlzc2luZyBzaWRlIGluZm8gKi8KKyAgICBmRGVjQW5kTWFwRnJhbWVEYXRhID0gMTsKKyAgICBjb250cm9sRmxhZ3MgfD0gTVBFR1NfQ09OQ0VBTDsKKyAgfQorCisgIGlmICgoZkRlY0FuZE1hcEZyYW1lRGF0YSA9PSAwKSAmJgorICAgICAgKGZyYW1lLT5wYXJhbVNsb3RbZk1heCgwLCBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyAtIDEpXSAhPQorICAgICAgICAgICAoc2VsZi0+dGltZVNsb3RzIC0gMSkgfHwKKyAgICAgICBzZWxmLT5jdXJUaW1lU2xvdCA+CisgICAgICAgICAgIGZyYW1lLT5wYXJhbVNsb3Rbc2VsZi0+Y3VyUHNdKSkgeyAvKiBEZXRlY3RlZCBmYXVsdHkgcGFyYW1ldGVyIHNsb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuICovCisgICAgZkRlY0FuZE1hcEZyYW1lRGF0YSA9IDE7CisgICAgY29udHJvbEZsYWdzIHw9IE1QRUdTX0NPTkNFQUw7CisgIH0KKworICAvKiBVcGRhdGUgY29uY2VhbG1lbnQgc3RhdGUgbWFjaGluZSAqLworICBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfVXBkYXRlU3RhdGUoCisgICAgICAmc2VsZi0+Y29uY2VhbEluZm8sCisgICAgICAoY29udHJvbEZsYWdzICYgTVBFR1NfQ09OQ0VBTCkKKyAgICAgICAgICA/IDAKKyAgICAgICAgICA6IDEpOyAvKiBjb252ZXJ0IGZyb20gY29uY2VhbCBmbGFnIHRvIGZyYW1lIG9rIGZsYWcgKi8KKworICBpZiAoZkRlY0FuZE1hcEZyYW1lRGF0YSkgeworICAgIC8qIFJlc2V0IHNwYXRpYWwgZnJhbWluZyBjb250cm9sIHZhcnMgKi8KKyAgICBmcmFtZS0+bmV3QnNEYXRhID0gMDsKKyAgICBzZWxmLT5wcmV2VGltZVNsb3QgPSAtMTsKKyAgICBzZWxmLT5jdXJUaW1lU2xvdCA9IDA7CisgICAgc2VsZi0+Y3VyUHMgPSAwOworCisgICAgaWYgKGNvbnRyb2xGbGFncyAmIE1QRUdTX0NPTkNFQUwpIHsKKyAgICAgIC8qIFJlc2V0IGZyYW1lIGRhdGEgdG8gYXZvaWQgbWlzY29uZmlndXJhdGlvbi4gKi8KKyAgICAgIFNwYXRpYWxEZWNDbGVhckZyYW1lRGF0YShzZWxmLCBmcmFtZSwgJnNlbGYtPmNyZWF0ZVBhcmFtcyk7CisgICAgfQorCisgICAgeworICAgICAgZXJyID0gU3BhdGlhbERlY0RlY29kZUZyYW1lKHNlbGYsIGZyYW1lKTsgLyogaW5wdXQ6IC4uLiAqLworICAgICAgLyogb3V0cHV0OiBkZWNvZGVBbmRNYXBGcmFtZURBVEEgKi8KKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgLyogUmVzY3VlIHN0cmF0ZWd5IGlzIHRvIGFwcGx5IGJ5cGFzcyBtb2RlIGluIG9yZGVyCisgICAgICAgICB0byBrZWVwIGF0IGxlYXN0IHRoZSBkb3dubWl4IGNoYW5uZWxzIGNvbnRpbnVvdXMuICovCisgICAgICBjb250cm9sRmxhZ3MgfD0gTVBFR1NfQ09OQ0VBTDsKKyAgICAgIGlmIChzZWxmLT5lcnJJbnQgPT0gTVBTX09LKSB7CisgICAgICAgIC8qIHN0b3JlIGludGVybmFsIGVycm9yIGJlZm9yIGl0IGdldHMgb3ZlcndyaXR0ZW4gKi8KKyAgICAgICAgc2VsZi0+ZXJySW50ID0gZXJyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGVyciA9IFNwYXRpYWxEZWNBcHBseVBhcmFtZXRlclNldHMoCisgICAgICBzZWxmLCBmcmFtZSwgaW5wdXRNb2RlLCBpbkRhdGEsIHFtZkluRGF0YVJlYWwsIHFtZkluRGF0YUltYWcsIG5TYW1wbGVzLAorICAgICAgY29udHJvbEZsYWdzIHwgKChlcnIgPT0gTVBTX09LKSA/IDAgOiBNUEVHU19CWVBBU1NNT0RFKSwgbnVtSW5wdXRDaGFubmVscywKKyAgICAgIG1hcERlc2NyKTsKKyAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworYmFpbDoKKworICAqcENvbnRyb2xGbGFncyA9IGNvbnRyb2xGbGFnczsKKworICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfZGVjLmggYi9saWJTQUNkZWMvc3JjL3NhY19kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJhY2FkCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfZGVjLmgKQEAgLTAsMCArMSw1MzkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlY29kZXIgTGlicmFyeSBzdHJ1Y3R1cmVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDX0RFQ19ICisjZGVmaW5lIFNBQ19ERUNfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAic2FjX2RlY19pbnRlcmZhY2UuaCIgLyogbGlicmFyeSBpbnRlcmZhY2UgaW4gLi4vaW5jbHVkZSAqLworCisjaW5jbHVkZSAiRkRLX3FtZl9kb21haW4uaCIKKyNpbmNsdWRlICJzYWNfcW1mLmgiCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIiAvKiBtcDQgYml0YnVmZmVyICovCisjaW5jbHVkZSAic2FjX2NhbGNNMWFuZE0yLmgiCisjaW5jbHVkZSAiRkRLX2h5YnJpZC5oIgorI2luY2x1ZGUgIkZES19kZWNvcnJlbGF0ZS5oIgorI2luY2x1ZGUgInNhY19yZXNoYXBlQkJFbnYuaCIKKworI2luY2x1ZGUgInNhY19kZWNfY29uY2VhbC5oIgorCisjaW5jbHVkZSAic2FjX3RzZC5oIgorCisjaWZuZGVmIE1BWAorI2RlZmluZSBNQVgoYSwgYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCisjZGVmaW5lIElDQ2RlZmF1bHQgMAorI2RlZmluZSBJUERkZWZhdWx0IDAKKyNkZWZpbmUgYXJiZG14R2FpbkRlZmF1bHQgMAorI2RlZmluZSBDUENkZWZhdWx0IDEwCisjZGVmaW5lIHR0dENMRDFkZWZhdWx0IDE1CisjZGVmaW5lIHR0dENMRDJkZWZhdWx0IDAKKworI2RlZmluZSBJU19IUV9PTkxZKGFvdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoYW90KSA9PSBBT1RfRVJfQUFDX0xEIHx8IChhb3QpID09IEFPVF9FUl9BQUNfRUxEIHx8IChhb3QpID09IEFPVF9VU0FDIHx8IFwKKyAgIChhb3QpID09IEFPVF9SU1ZENTApCisKKyNkZWZpbmUgU0NPTlNUKHgpIEZMMkZYQ09OU1RfREJMKHgpCisKKyNkZWZpbmUgUENfTlVNX0JBTkRTICg4KQorI2RlZmluZSBQQ19OVU1fSFlCX0JBTkRTIChQQ19OVU1fQkFORFMgLSAzICsgMTApCisjZGVmaW5lIEFCU19USFIgKDFlLTlmICogMzI3NjggKiAzMjc2OCkKKworI2RlZmluZSBNQVhfSFlCUklEX0JBTkRTIChNQVhfTlVNX1FNRl9CQU5EUyAtIDMgKyAxMCkKKyNkZWZpbmUgSFlCUklEX0ZJTFRFUl9ERUxBWSAoNikKKworI2RlZmluZSBNQVhfUkVTSURVQUxfRlJBTUVTICg0KQorI2RlZmluZSBNQVhfUkVTSURVQUxfQklTVFJFQU0gXAorICAoODM2KSAvKiAgNDgwMDAgYnBzICogMyByZXMgLyAoOCAqIDQ0MTAwIC8gMjA0OCApICovCisjZGVmaW5lIE1BWF9NRENUX0NPRUZGUyAoMTAyNCkKKyNkZWZpbmUgU0FDREVDX1JFU0lEVUFMX0JTX0JVRl9TSVpFIFwKKyAgKDEwMjQpIC8qIHVzZWQgdG8gc2V0dXAgYW5kIGNoZWNrIHJlc2lkdWFsIGJpdHN0cmVhbSBidWZmZXIgKi8KKworI2RlZmluZSBNQVhfTlVNX1BBUkFNUyAoTUFYX05VTV9PVFQgKyA0ICogTUFYX05VTV9UVFQgKyBNQVhfSU5QVVRfQ0hBTk5FTFMpCisjZGVmaW5lIE1BWF9OVU1fUEFSQU1FVEVSUyAoTUFYKE1BWF9OVU1fUEFSQU1TLCBNQVhfTlVNX09UVCkpCisKKyNkZWZpbmUgTUFYX1BBUkFNRVRFUl9TRVRTICg5KQorCisjZGVmaW5lIE1BWF9NMl9JTlBVVCAoTUFYX09VVFBVVF9DSEFOTkVMUykgLyogMyBkaXJlY3QgKyA1IGRpZmZ1c2UgKi8KKworI2RlZmluZSBNQVhfUU1GX0JBTkRTX1RPX0hZQlJJRCBcCisgICgzKSAvKiAzIGJhbmRzIGFyZSBmaWx0ZXJlZCBhZ2FpbiBpbiAiNDAgYmFuZHMiIGNhc2UgKi8KKyNkZWZpbmUgUFJPVE9fTEVOICgxMykKKyNkZWZpbmUgQlVGRkVSX0xFTl9MRiAoUFJPVE9fTEVOKQorI2RlZmluZSBCVUZGRVJfTEVOX0hGICgoUFJPVE9fTEVOIC0gMSkgLyAyKQorCisjZGVmaW5lIE1BWF9OT19ERUNPUlJfQ0hBTk5FTFMgKE1BWF9PVVRQVVRfQ0hBTk5FTFMpCisjZGVmaW5lIEhSVEZfQVpJTVVUSFMgKDUpCisKKyNkZWZpbmUgTUFYX05VTV9PVFRfQVQgMAorCisvKiBsZWZ0IG91dCAqLworCit0eXBlZGVmIGVudW0geworICBVUE1JWFRZUEVfQllQQVNTID0gLTEsIC8qanVzdCBieXBhc3MgdGhlIGlucHV0IGNoYW5uZWxzIHdpdGhvdXQgcHJvY2Vzc2luZyovCisgIFVQTUlYVFlQRV9OT1JNQUwgPSAwICAgLyptdWx0aWNoYW5uZWwgbG91ZHNwZWFrZXIgdXBtaXggd2l0aCBzcGF0aWFsIGRhdGEqLworfSBVUE1JWFRZUEU7CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzVHdvQ2hNb2RlKFVQTUlYVFlQRSB1cG1peFR5cGUpIHsKKyAgaW50IHJldHZhbCA9IDA7CisgIHJldHVybiByZXR2YWw7Cit9CisKKyAgLyogbGVmdCBvdXQgZW5kICovCisKKyNkZWZpbmUgTVBFR1NfQllQQVNTTU9ERSAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgTVBFR1NfQ09OQ0VBTCAoMHgwMDAwMDAwMikKKwordHlwZWRlZiBzdHJ1Y3QgU1RQX0RFQyAqSEFORExFX1NUUF9ERUM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0NIQVIgYnNRdWFudENvYXJzZVhYWHByZXY7CisgIFNDSEFSIGJzUXVhbnRDb2Fyc2VYWFhwcmV2UGFyc2U7Cit9IExPU1NMRVNTU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0NIQVIgYnNYWFhEYXRhTW9kZVtNQVhfUEFSQU1FVEVSX1NFVFNdOworICBTQ0hBUiBic1F1YW50Q29hcnNlWFhYW01BWF9QQVJBTUVURVJfU0VUU107CisgIFNDSEFSIGJzRnJlcVJlc1N0cmlkZVhYWFtNQVhfUEFSQU1FVEVSX1NFVFNdOworICBTQ0hBUiBub2NtcFF1YW50Q29hcnNlWFhYW01BWF9QQVJBTUVURVJfU0VUU107CisgIExPU1NMRVNTU1RBVEUgKnN0YXRlOyAvKiBMaW5rIHRvIHBlcnNpc3RlbnQgc3RhdGUgaW5mb3JtYXRpb24gKi8KK30gTE9TU0xFU1NEQVRBOworCitzdHJ1Y3QgU1BBVElBTF9CU19GUkFNRV9zdHJ1Y3QgeworICBVQ0hBUiBic0luZGVwZW5kZW5jeUZsYWc7CisgIFVDSEFSIG5ld0JzRGF0YTsKKyAgVUNIQVIgbnVtUGFyYW1ldGVyU2V0czsKKworICAvKgorICBJZiBic0ZyYW1pbmdUeXBlID09IDAsIHRoZW4gdGhlIHBhcmFtU2xvdFtwc10gZm9yIDAgPD0gcHMgPCBudW1QYXJhbVNldHMgaXMKKyAgY2FsY3VsYXRlZCBhcyBmb2xsb3dzOiBwYXJhbVNsb3RbcHNdID0gY2VpbChudW1TbG90cyoocHMrMSkvbnVtUGFyYW1TZXRzKSAtIDEKKyAgT3RoZXJ3aXNlLCBpdCBpcworICAgIHBhcmFtU2xvdFtwc10gPSBic1BhcmFtU2xvdFtwc10KKyAgKi8KKyAgSU5UIHBhcmFtU2xvdFtNQVhfUEFSQU1FVEVSX1NFVFNdOworCisgIC8qIFRoZXNlIGFycmF5cyBjb250YWluIHRoZSBjb21wYWN0IGluZGljZXMsIG9ubHkgb25lIHZhbHVlIHBlciBwYnN0cmlkZSwgb25seQorICAgKiBwYXJhbXNldHMgYWN0dWFsbHkgY29udGFpbmluZyBkYXRhLiAqLworICAvKiBUaGVzZSB2YWx1ZXMgYXJlIHdyaXR0ZW4gZnJvbSB0aGUgcGFyc2VyIGluIGVjRGF0YURlYygpIGFuZCByZWFkIGR1cmluZworICAgKiBkZWNvZGUgaW4gbWFwSW5kZXhEYXRhKCkgKi8KKyAgU0NIQVIgY21wT3R0Q0xEaWR4W01BWF9OVU1fT1RUICsgTUFYX05VTV9PVFRfQVRdW01BWF9QQVJBTUVURVJfU0VUU10KKyAgICAgICAgICAgICAgICAgICAgW01BWF9QQVJBTUVURVJfQkFORFNdOworICBTQ0hBUiBjbXBPdHRJQ0NpZHhbTUFYX05VTV9PVFRdW01BWF9QQVJBTUVURVJfU0VUU11bTUFYX1BBUkFNRVRFUl9CQU5EU107CisKKyAgLyogU21vb3RoaW5nICovCisgIFVDSEFSIGJzU21vb3RoTW9kZVtNQVhfUEFSQU1FVEVSX1NFVFNdOworICBVQ0hBUiBic1Ntb290aFRpbWVbTUFYX1BBUkFNRVRFUl9TRVRTXTsKKyAgVUNIQVIgYnNGcmVxUmVzU3RyaWRlU21nW01BWF9QQVJBTUVURVJfU0VUU107CisgIFVDSEFSIGJzU21nRGF0YVtNQVhfUEFSQU1FVEVSX1NFVFNdCisgICAgICAgICAgICAgICAgIFtNQVhfUEFSQU1FVEVSX0JBTkRTXTsgLyogc21vb3RoaW5nIGZsYWdzLCBvbmUgaWYgYmFuZCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtb290aGVkLCBvdGhlcndpc2UgemVybyAqLworCisgIC8qIEFyYml0cmFyeSBEb3dubWl4ICovCisgIFNDSEFSICgqY21wQXJiZG14R2FpbklkeClbTUFYX1BBUkFNRVRFUl9TRVRTXVtNQVhfUEFSQU1FVEVSX0JBTkRTXTsKKworICAvKiBMb3NzbGVzcyBjb250cm9sICovCisgIExPU1NMRVNTREFUQSAqQ0xETG9zc2xlc3NEYXRhOworICBMT1NTTEVTU0RBVEEgKklDQ0xvc3NsZXNzRGF0YTsKKyAgLyogTE9TU0xFU1NEQVRBICpBREdMb3NzbGVzc0RhdGE7IC0+IGlzIHN0b3JlZCBpbiBDTERMb3NzbGVzc0RhdGFbb2Zmc2V0XSAqLworCisgIExPU1NMRVNTREFUQSAqSVBETG9zc2xlc3NEYXRhOworICBTQ0hBUiAoKmNtcE90dElQRGlkeClbTUFYX1BBUkFNRVRFUl9TRVRTXVtNQVhfUEFSQU1FVEVSX0JBTkRTXTsKKyAgaW50IHBoYXNlTW9kZTsKKyAgaW50IE9wZFNtb290aGluZ01vZGU7CisKKyAgVUNIQVIgdGVtcFNoYXBlRW5hYmxlQ2hhbm5lbEdFU1tNQVhfT1VUUFVUX0NIQU5ORUxTXTsgLyohPCBHRVMgc2lkZSBpbmZvLiAqLworICBVQ0hBUiBic0VudlNoYXBlRGF0YVtNQVhfT1VUUFVUX0NIQU5ORUxTXQorICAgICAgICAgICAgICAgICAgICAgIFtNQVhfVElNRV9TTE9UU107IC8qITwgR0VTIHNpZGUgaW5mbyAocXVhbnRpemVkKS4gKi8KKworICBVQ0hBUiB0ZW1wU2hhcGVFbmFibGVDaGFubmVsU1RQW01BWF9PVVRQVVRfQ0hBTk5FTFNdOyAvKiE8IFNUUCBzaWRlIGluZm8uICovCisKKyAgVFNEX0RBVEEgVHNkRGF0YVsxXTsgLyohPCBUU0QgZGF0YSBzdHJ1Y3R1cmUuICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIExvc3NsZXNzIHN0YXRlICovCisgIExPU1NMRVNTU1RBVEUgQ0xETG9zc2xlc3NTdGF0ZVtNQVhfTlVNX1BBUkFNRVRFUlNdOworICBMT1NTTEVTU1NUQVRFIElDQ0xvc3NsZXNzU3RhdGVbTUFYX05VTV9QQVJBTUVURVJTXTsKKyAgTE9TU0xFU1NTVEFURSBJUERMb3NzbGVzc1N0YXRlW01BWF9OVU1fUEFSQU1FVEVSU107Cit9IEJTX0xMX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBwcmV2UGFyYW1TbG90OworICBpbnQgcHJldlNtZ1RpbWU7CisgIFVDSEFSIHByZXZTbWdEYXRhW01BWF9QQVJBTUVURVJfQkFORFNdOworCisgIEZJWFBfREJMIG9wZExlZnRTdGF0ZV9fRkRLW01BWF9QQVJBTUVURVJfQkFORFNdOworICBGSVhQX0RCTCBvcGRSaWdodFN0YXRlX19GREtbTUFYX1BBUkFNRVRFUl9CQU5EU107CisKK30gU01PT1RISU5HX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfREJMIGFscGhhX19GREs7CisgIEZJWFBfREJMIGJldGFfX0ZESzsKKyAgRklYUF9EQkwgcGFydE5yZ1ByZXZfX0ZES1syICogTUFYX09VVFBVVF9DSEFOTkVMUyArIE1BWF9JTlBVVF9DSEFOTkVMU10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtCQl9FTlZfU0laRV07CisgIEZJWFBfREJMIG5vcm1OcmdQcmV2X19GREtbMiAqIE1BWF9PVVRQVVRfQ0hBTk5FTFMgKyBNQVhfSU5QVVRfQ0hBTk5FTFNdOworICBGSVhQX0RCTCBmcmFtZU5yZ1ByZXZfX0ZES1syICogTUFYX09VVFBVVF9DSEFOTkVMUyArIE1BWF9JTlBVVF9DSEFOTkVMU107CisgIElOVCBwYXJ0TnJnUHJldlNGWzIgKiBNQVhfT1VUUFVUX0NIQU5ORUxTICsgTUFYX0lOUFVUX0NIQU5ORUxTXTsKKyAgSU5UIHBhcnROcmdQcmV2MlNGWzIgKiBNQVhfT1VUUFVUX0NIQU5ORUxTICsgTUFYX0lOUFVUX0NIQU5ORUxTXTsKKyAgSU5UIG5vcm1OcmdQcmV2U0ZbMiAqIE1BWF9PVVRQVVRfQ0hBTk5FTFMgKyBNQVhfSU5QVVRfQ0hBTk5FTFNdOworICBJTlQgZnJhbWVOcmdQcmV2U0ZbMiAqIE1BWF9PVVRQVVRfQ0hBTk5FTFMgKyBNQVhfSU5QVVRfQ0hBTk5FTFNdOworfSBSRVNIQVBFX0JCRU5WX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBtYXhOdW1JbnB1dENoYW5uZWxzOworICBpbnQgbWF4TnVtT3V0cHV0Q2hhbm5lbHM7CisgIGludCBtYXhOdW1RbWZCYW5kczsKKyAgaW50IG1heE51bUh5YnJpZEJhbmRzOworICBpbnQgbWF4TnVtWENoYW5uZWxzOworICBpbnQgbWF4TnVtVkNoYW5uZWxzOworICBpbnQgbWF4TnVtRGVjb3JDaGFubmVsczsKKyAgaW50IG1heE51bUNtcGx4UW1mQmFuZHM7CisgIGludCBtYXhOdW1DbXBseEh5YkJhbmRzOworICBpbnQgbWF4TnVtUmVzQ2hhbm5lbHM7CisgIGludCBiUHJvY1Jlc2lkdWFsOyAvKiBwcm9jZXNzIHJlc2lkdWFsICovCisgIGludCBtYXhOdW1SZXNpZHVhbENoYW5uZWxzOworICBpbnQgbWF4TnVtT3R0Qm94ZXM7CisgIGludCBtYXhOdW1QYXJhbXM7CisKK30gU0FDREVDX0NSRUFUSU9OX1BBUkFNUzsKKworc3RydWN0IHNwYXRpYWxEZWNfc3RydWN0IHsKKyAgU0FDREVDX0VSUk9SCisgIGVyckludDsgICAgICAgICAgICAgLyogRmllbGQgdG8gc3RvcmUgaW50ZXJuYWwgZXJyb3JzLgorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbGwgYmUgY2xlYXIgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIGVhY2ggcHJvY2VzcyBjYWxsLiAqLworICBpbnQgc3RhdGljRGVjU2NhbGU7IC8qIHN0YXRpYyBzY2FsZSBvZiBkZWNvZGVyICovCisKKyAgLyogR0VORVJBTCAqLworICBpbnQgc2FtcGxpbmdGcmVxOyAgICAgICAvKiBbSHpdICovCisgIENGR19MRVZFTCBkZWNvZGVyTGV2ZWw7IC8qIDAuLjUgKi8KKyAgQ0ZHX0VYVEVOVCBkZWNvZGVyTW9kZTsKKyAgQ0ZHX0JJTkFVUkFMIGJpbmF1cmFsTW9kZTsKKworICBTQUNERUNfQ1JFQVRJT05fUEFSQU1TIGNyZWF0ZVBhcmFtczsKKworICBpbnQgbnVtQ29tcGxleFByb2Nlc3NpbmdCYW5kczsKKworICBpbnQgdHJlZUNvbmZpZzsgLyogVFJFRV81MTUxID0gNTE1MSwgVFJFRV81MTUyID0gNTE1MiwgVFJFRV81MjUgPSA1MjUsIGRlZmluZWQKKyAgICAgICAgICAgICAgICAgICAgIGluIHNhY19iaXRkZWMuaCAqLworCisgIGludCBudW1JbnB1dENoYW5uZWxzOyAgLyogMSAoTSkgb3IgMiAoTCxSKSAqLworICBpbnQgbnVtT3V0cHV0Q2hhbm5lbHM7IC8qIDYgZm9yIDMvMi4xIChGTCxGUixGQyxMRixCTCxCUikgKi8KKyAgaW50IG51bU90dEJveGVzOyAgICAgICAvKiBudW1iZXIgb2Ygb3R0IGJveGVzICovCisgIGludCBudW1NMnJvd3M7CisKKyAgaW50IG51bU91dHB1dENoYW5uZWxzQVQ7IC8qIE51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgYWZ0ZXIgYXJiaXRyYXJ5IHRyZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgKi8KKworICBpbnQgcXVhbnRNb2RlOyAvKiBRVUFOVF9GSU5FLCBRVUFOVF9FQlExLCBRVUFOVF9FQlEyLCBkZWZpbmVkIGluIHNhY19iaXRkZWMuaAorICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGFyYml0cmFyeURvd25taXg7IC8qIChhcmJpdHJhcnlEb3dubWl4ICE9IDApIDEgYXJiaXRyYXJ5IGRvd25taXggZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudCwgMiBhcmJpdHJhcnkgZG93bm1peCByZXNpZHVhbCBkYXRhIHByZXNlbnQqLworICBpbnQgcmVzaWR1YWxDb2Rpbmc7ICAgLyogKHJlc2lkdWFsQ29kaW5nICE9IDApID0+IHJlc2lkdWFsIGNvZGluZyBkYXRhIHByZXNlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBVQ0hBUiBuclJlc2lkdWFsRnJhbWU7CisgIFVDSEFSIG5yQXJiRG93bm1peFJlc2lkdWFsRnJhbWU7CisgIEZES19CSVRTVFJFQU0gKipoUmVzaWR1YWxCaXRzdHJlYW1zOworICBpbnQgdGVtcFNoYXBlQ29uZmlnOyAvKiAqLworICBpbnQgZGVjb3JyVHlwZTsgICAgICAvKiBJbmRpY2F0ZXMgdG8gdXNlIFBTIG9yIG5vbmUgUFMgZGVjb3JyZWxhdG9yLiAqLworICBpbnQgZGVjb3JyQ29uZmlnOyAgICAvKiBjaG9zZW4gZGVjb3JyZWxhdG9yICovCisgIGludCBlbnZRdWFudE1vZGU7ICAgIC8qIHF1YW50aXphdGlvbiBtb2RlIG9mIGVudmVsb3BlIHJlc2hhcGluZyBkYXRhICovCisKKyAgRklYUF9EQkwgY2xpcFByb3RlY3RHYWluX19GREs7IC8qIGdsb2JhbCBnYWluIGZvciB1cG1peCAqLworICBjaGFyIGNsaXBQcm90ZWN0R2FpblNGX19GREs7ICAgLyogZ2xvYmFsIGdhaW4gZm9yIHVwbWl4ICovCisKKyAgLyogQ3VycmVudGx5IGlnbm9yaW5nIGNlbnRlciBkZWNvcnIKKyAgICAgbnVtVkNoYW5uZWxzID0gbnVtRGlyZWt0U2lnbmFscyArIG51bURlY29yU2lnbmFscyAqLworICBpbnQgbnVtRGlyZWt0U2lnbmFsczsgIC8qIG5lZWRlZCBmb3IgVywgTnVtYmVyIG9mIGRpcmVrdCBzaWduYWxzIDUxNSAtPiAxIDUyNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IDMgKi8KKyAgaW50IHdTdGFydFJlc2lkdWFsSWR4OyAvKiBXaGVyZSB0byBzdGFydCByZWFkIHJlc2lkdWFscyBmb3IgVywgPSAwIGZvciA1MTUsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGZvciA1MjUgc2luY2Ugb25lIHJlc2lkdWFsIGlzIHVzZWQgaW4gViAqLworICBpbnQgbnVtRGVjb3JTaWduYWxzOyAgIC8qIG5lZWRlZCBmb3IgVywgTnVtYmVyIG9mIHJlc2lkdWFsIGFuZCBkZWNvcnJlbGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxzLCA9IDIsIDMgZm9yIGNlbnRlciBkZWNjb3JlbGF0aW9uKi8KKyAgaW50IG51bVZDaGFubmVsczsgICAgICAvKiBkaXJlY3Qgc2lnbmFscyArIGRlY29yZWxhdG9yIHNpZ25hbHMgKi8KKyAgaW50IG51bVhDaGFubmVsczsgICAgICAvKiBkaXJlY3QgaW5wdXQgc2lnbmFscyArIFRUVC1yZXNpZHVhbHMgKi8KKworICBpbnQgdGltZVNsb3RzOyAgICAvKiBsZW5ndGggb2Ygc3BhdGlhbCBmcmFtZSBpbiBRTUYgc2FtcGxlcyAqLworICBpbnQgY3VyVGltZVNsb3Q7ICAvKiBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHRpbWUgc2xvdCB1c2VkIGZvciBoeXBlcmZyYW1pbmcgKi8KKyAgaW50IHByZXZUaW1lU2xvdDsgLyogICovCisgIGludCBjdXJQczsKKyAgaW50IGZyYW1lTGVuZ3RoOyAvKiBudW1iZXIgb2Ygb3V0cHV0IHdhdmVmb3JtIHNhbXBsZXMvY2hhbm5lbC9mcmFtZSAqLworICBVUE1JWFRZUEUgdXBtaXhUeXBlOworICBpbnQgcGFydGlhbGx5Q29tcGxleDsKKyAgaW50IHVzZUZEcmV2ZXJiOworCisgIGludCBiU2hhcmVEZWxheVdpdGhTQlI7CisKKyAgaW50IHRwX2h5YkJhbmRCb3JkZXI7IC8qIEh5YnJpZCBiYW5kIGluZGljYXRpbmcgdGhlIEhQIGZpbHRlciBjdXQtb2ZmLiAqLworCisgIC8qIEZSRVFVRU5DWSBNQVBQSU5HICovCisgIGludCBxbWZCYW5kczsKKyAgaW50IGh5YnJpZEJhbmRzOworICBjb25zdCBTQ0hBUiAqa2VybmVsczsgLyogTWFwcGluZyBoeWJyaWQgYmFuZCB0byBwYXJhbWV0ZXIgYmFuZC4gKi8KKworICBpbnQgVHNkVHM7IC8qKjwgVFNEIFFNRiBzbG90IGNvdW50ZXIgMDw9IHRzIDwgbnVtU2xvdHMgKi8KKworICBpbnQgKnBhcmFtMmh5YjsgLyogTWFwcGluZyBwYXJhbWV0ZXIgYmFuZHMgdG8gaHlicmlkIGJhbmRzICovCisgIGludCBrZXJuZWxzX3dpZHRoW01BWF9QQVJBTUVURVJfQkFORFNdOyAvKiBNYXBwaW5nIHBhcm1ldGVyIGJhbmQgdG8gaHlicmlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kIG9mZnNldHMuICovCisKKyAgLyogUmVzaWR1YWwgY29kaW5nICovCisgIGludCByZXNpZHVhbFNhbXBsaW5nRnJlcTsKKyAgVUNIQVIgcmVzaWR1YWxQcmVzZW50W01BWF9OVU1fT1RUICsgTUFYX05VTV9UVFRdOworICBVQ0hBUiByZXNpZHVhbEJhbmRzW01BWF9OVU1fT1RUICsgTUFYX05VTV9UVFRdOyAgICAvKiAwLCBpZiBubyByZXNpZHVhbCBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQgZm9yIHRoaXMgYm94ICovCisgIFVDSEFSIHJlc2lkdWFsUU1GQmFuZHNbTUFYX05VTV9PVFQgKyBNQVhfTlVNX1RUVF07IC8qIG5lZWRlZCBmb3Igb3B0aW1pemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kY3QycW1mIGNhbGN1bGF0aW9uICovCisgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwQ29uZmlnQ3VycmVudDsKKworICBpbnQgYXJiZG14RnJhbWVzUGVyU3BhdGlhbEZyYW1lOworICBpbnQgYXJiZG14VXBkUU1GOworCisgIGludCBudW1QYXJhbWV0ZXJCYW5kczsgLyogTnVtYmVyIG9mIHBhcmFtZXRlciBiYW5kcyA0MCwgMjgsIDIwLCAxNCwgMTAsIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4qLworICBpbnQgYml0c3RyZWFtUGFyYW1ldGVyQmFuZHM7CisgIGludCAqbnVtT3R0QmFuZHM7IC8qIG51bWJlciBvZiBiYW5kcyBmb3IgZWFjaCBvdHQsIGlzICE9IG51bVBhcmFtZXRlckJhbmRzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICBMRkVzICovCisKKyAgLyogMSBNQVBQSU5HICovCisgIFVDSEFSIGV4dGVuZEZyYW1lOworICBVQ0hBUiBudW1QYXJhbWV0ZXJTZXRzUHJldjsKKworICBpbnQgKnNtZ1RpbWU7CisgIFVDSEFSICoqc21nRGF0YTsKKworICAvKiBQQVJBTUVURVIgREFUQSBkZWNvZGVkIGFuZCBkZXF1YW50aXplZCAqLworCisgIC8qIExhc3QgcGFyYW1ldGVycyBmcm9tIHByZXYgZnJhbWUgcmVxdWlyZWQgZHVyaW5nIGRlY29kZSBpbiBtYXBJbmRleERhdGEoKQorICAgKiBhbmQgbm90IHRvdWNoZWQgZHVyaW5nIHBhcnNlICovCisgIFNDSEFSICoqb3R0Q0xEaWR4UHJldjsKKyAgU0NIQVIgKipvdHRJQ0NpZHhQcmV2OworICBTQ0hBUiAqKmFyYmRteEdhaW5JZHhQcmV2OworICBTQ0hBUiAqKm90dElQRGlkeFByZXY7CisgIFNDSEFSICoqKm91dElkeERhdGE7IC8qIGlzIHRoaXMgcmVhbGx5IHBlcnNpc3RlbnQgbWVtb3J5ID8gKi8KKworICAvKiBTdGF0ZSBtZW0gcmVxdWlyZWQgZHVyaW5nIHBhcnNlIGluIFNwYXRpYWxEZWNQYXJzZUZyYW1lRGF0YSgpICovCisgIFNDSEFSICoqY21wT3R0Q0xEaWR4UHJldjsKKyAgU0NIQVIgKipjbXBPdHRJQ0NpZHhQcmV2OworICBTQ0hBUiAqKipvdHRJQ0NkaWZmaWR4OworICBTQ0hBUiAqKmNtcE90dElQRGlkeFByZXY7CisKKyAgLyogU3RhdGUgbWVtIHJlcXVpcmVkIGluIHBhcnNlQXJiaXRyYXJ5RG93bm1peERhdGEgKi8KKyAgU0NIQVIgKipjbXBBcmJkbXhHYWluSWR4UHJldjsKKworICBTQ0hBUiAqKipvdHRDTERfX0ZESzsKKyAgU0NIQVIgKioqb3R0SUNDX19GREs7CisKKyAgU0NIQVIgKioqYXJiZG14R2Fpbl9fRkRLOyAvKiBIb2xkcyB0aGUgYXJ0aXN0aWMgZG93bm1peCBjb3JyZWN0aW9uIGluZGV4LiovCisKKyAgRklYUF9EQkwgKmFyYmRteEFscGhhX19GREs7CisgIEZJWFBfREJMICphcmJkbXhBbHBoYVByZXZfX0ZESzsKKworICBVQ0hBUiBzdGVyZW9Db25maWdJbmRleDsKKyAgaW50IGhpZ2hSYXRlTW9kZTsKKworICBpbnQgcGhhc2VDb2Rpbmc7CisKKyAgU0NIQVIgKioqb3R0SVBEX19GREs7CisKKyAgRklYUF9EQkwgUGhhc2VMZWZ0X19GREtbTUFYX1BBUkFNRVRFUl9CQU5EU107CisgIEZJWFBfREJMIFBoYXNlUmlnaHRfX0ZES1tNQVhfUEFSQU1FVEVSX0JBTkRTXTsKKyAgRklYUF9EQkwgUGhhc2VQcmV2TGVmdF9fRkRLW01BWF9QQVJBTUVURVJfQkFORFNdOworICBGSVhQX0RCTCBQaGFzZVByZXZSaWdodF9fRkRLW01BWF9QQVJBTUVURVJfQkFORFNdOworICBpbnQgbnVtT3R0QmFuZHNJUEQ7CisKKyAgLyogR0FJTiBNQVRSSUNJRVMgRk9SIENVUlJFTlQgYW5kIFBSRVZJT1VTIFBBUk1BVEVSIFNFVChzKSovCisgIEZJWFBfREJMICoqKk0yUmVhbF9fRkRLOworICBGSVhQX0RCTCAqKipNMkltYWdfX0ZESzsKKyAgRklYUF9EQkwgKioqTTJSZWFsUHJldl9fRkRLOworICBGSVhQX0RCTCAqKipNMkltYWdQcmV2X19GREs7CisKKyAgLyogSU5QVVQgU0lHTkFMUyAqLworICBGSVhQX0RCTCAqKipxbWZJbnB1dFJlYWxEZWxheUJ1ZmZlcl9fRkRLOworICBGSVhQX0RCTCAqKipxbWZJbnB1dEltYWdEZWxheUJ1ZmZlcl9fRkRLOworCisgIGludCBwY19maWx0ZXJkZWxheTsgLyogYWRkaXRpb25hbCBkZWxheSB0byBhbGlnbiBIUSB3aXRoIExQIGJlZm9yZSBoeWJpcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXNpcyAqLworICBpbnQgcW1mSW5wdXREZWxheUJ1ZlBvczsKKyAgRklYUF9EQkwgKipxbWZJbnB1dFJlYWxfX0ZESzsKKyAgRklYUF9EQkwgKipxbWZJbnB1dEltYWdfX0ZESzsKKworICBGSVhQX0RCTCAqKmh5YklucHV0UmVhbF9fRkRLOworICBGSVhQX0RCTCAqKmh5YklucHV0SW1hZ19fRkRLOworCisgIEZJWFBfREJMICoqYmluSW5wdXRSZXZlcmI7CisKKyAgRklYUF9EQkwgYmluR2FpbiwgcmV2ZXJiR2FpbjsKKyAgRklYUF9EQkwgYmluQ2VudGVyR2FpbiwgcmV2ZXJiQ2VudGVyR2FpbjsKKworICAvKiBSRVNJRFVBTCBTSUdOQUxTICovCisKKyAgRklYUF9EQkwgKioqcW1mUmVzaWR1YWxSZWFsX19GREs7CisgIEZJWFBfREJMICoqKnFtZlJlc2lkdWFsSW1hZ19fRkRLOworCisgIEZJWFBfREJMICoqaHliUmVzaWR1YWxSZWFsX19GREs7CisgIEZJWFBfREJMICoqaHliUmVzaWR1YWxJbWFnX19GREs7CisKKyAgaW50IHFtZk91dHB1dFJlYWxEcnlEZWxheUJ1ZlBvczsKKyAgRklYUF9EQkwgKioqcW1mT3V0cHV0UmVhbERyeURlbGF5QnVmZmVyX19GREs7CisgIEZJWFBfREJMICoqKnFtZk91dHB1dEltYWdEcnlGaWx0ZXJCdWZmZXJfX0ZESzsKKyAgRklYUF9EQkwgKnFtZk91dHB1dEltYWdEcnlGaWx0ZXJCdWZmZXJCYXNlX19GREs7CisKKyAgLyogVEVNUE9SQVJZIFNJR05BTFMgKi8KKworICBGSVhQX0RCTCAqKndSZWFsX19GREs7CisgIEZJWFBfREJMICoqd0ltYWdfX0ZESzsKKworICAvKiBPVVRQVVQgU0lHTkFMUyAqLworICBGSVhQX0RCTCAqKmh5Yk91dHB1dFJlYWxEcnlfX0ZESzsKKyAgRklYUF9EQkwgKipoeWJPdXRwdXRJbWFnRHJ5X19GREs7CisgIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbFdldF9fRkRLOworICBGSVhQX0RCTCAqKmh5Yk91dHB1dEltYWdXZXRfX0ZESzsKKyAgUENNX01QUyAqdGltZU91dF9fRkRLOworCisgIEhBTkRMRV9GREtfUU1GX0RPTUFJTiBwUW1mRG9tYWluOworCisgIEZES19BTkFfSFlCX0ZJTFRFUgorICAqaHlicmlkQW5hbHlzaXM7IC8qITwgcG9pbnRlciBBbmFseXNpcyBoeWJyaWQgZmlsdGVyYmFuayBhcnJheS4gKi8KKyAgRkRLX1NZTl9IWUJfRklMVEVSCisgICpoeWJyaWRTeW50aGVzaXM7IC8qITwgcG9pbnRlciBTeW50aGVzaXMgaHlicmlkIGZpbHRlcmJhbmsgYXJyYXkuICovCisgIEZJWFBfREJMICoqCisgICAgICBwSHlicmlkQW5hU3RhdGVzTEZkbXg7IC8qITwgcG9pbnRlciB0byBhbmFseXNpcyBoeWJyaWQgZmlsdGVyIHN0YXRlcyBMRiAqLworICBGSVhQX0RCTCAqKgorICAgICAgcEh5YnJpZEFuYVN0YXRlc0hGZG14OyAvKiE8IHBvaW50ZXIgdG8gYW5hbHlzaXMgaHlicmlkIGZpbHRlciBzdGF0ZXMgSEYgKi8KKyAgRklYUF9EQkwgKioKKyAgICAgIHBIeWJyaWRBbmFTdGF0ZXNMRnJlczsgLyohPCBwb2ludGVyIHRvIGFuYWx5c2lzIGh5YnJpZCBmaWx0ZXIgc3RhdGVzIExGICovCisgIEZJWFBfREJMICoqCisgICAgICBwSHlicmlkQW5hU3RhdGVzSEZyZXM7IC8qITwgcG9pbnRlciB0byBhbmFseXNpcyBoeWJyaWQgZmlsdGVyIHN0YXRlcyBIRiAqLworCisgIERFQ09SUl9ERUMgKmFwRGVjb3I7IC8qITwgcG9pbnRlciBkZWNvcnJlbGF0b3IgYXJyYXkuICovCisgIEZJWFBfREJMICoqcERlY29yQnVmZmVyQ3BseDsKKworICBTTU9PVEhJTkdfU1RBVEUgKnNtb290aFN0YXRlOyAvKiE8IFBvaW50ZXIgdG8gc21vb3RoaW5nIHN0YXRlcy4gKi8KKworICBSRVNIQVBFX0JCRU5WX1NUQVRFICpyZXNoYXBlQkJFbnZTdGF0ZTsgLyohPCBHRVMgaGFuZGxlLiAqLworICBTQ0hBUiByb3cyY2hhbm5lbERteEdFU1tNQVhfT1VUUFVUX0NIQU5ORUxTXTsKKworICBIQU5ETEVfU1RQX0RFQyBoU3RwRGVjOyAvKiE8IFNUUCBoYW5kbGUuICovCisKKyAgY29uc3QgVUNIQVIgKnBBY3Rpdk0yUGFyYW1CYW5kczsKKworICBpbnQgYk92ZXJ3cml0ZU0xTTJwcmV2OyAvKiBPdmVyd3JpdGUgcHJldmlvdXMgTTIvTTIgcGFyYW1zIHdpdGggZmlyc3Qgc2V0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBmcmFtZSBhZnRlciBTU0MgY2hhbmdlIChha2EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlQWZ0ZXJDb25maWdIYXNDaGFuZ2VkRmxhZykuICovCisgIFNwYXRpYWxEZWNDb25jZWFsbWVudEluZm8gY29uY2VhbEluZm87Cit9OworCisjZGVmaW5lIFNBQ0RFQ19TWU5UQVhfTVBTIDEKKyNkZWZpbmUgU0FDREVDX1NZTlRBWF9VU0FDIDIKKyNkZWZpbmUgU0FDREVDX1NZTlRBWF9SU1ZENTAgNAorI2RlZmluZSBTQUNERUNfU1lOVEFYX0wyIDgKKyNkZWZpbmUgU0FDREVDX1NZTlRBWF9MMyAxNgorI2RlZmluZSBTQUNERUNfU1lOVEFYX0xEIDMyCisKK3N0YXRpYyBpbmxpbmUgaW50IEdldFByb2NCYW5kKHNwYXRpYWxEZWNfc3RydWN0ICpzZWxmLCBpbnQgcXMpIHsKKyAgcmV0dXJuIHNlbGYtPmtlcm5lbHNbcXNdOworfQorCisjZW5kaWYgLyogU0FDX0RFQ19IICovCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19kZWNfY29uY2VhbC5jcHAgYi9saWJTQUNkZWMvc3JjL3NhY19kZWNfY29uY2VhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlZWY3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9zcmMvc2FjX2RlY19jb25jZWFsLmNwcApAQCAtMCwwICsxLDM5MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEVydGVsLCBDaHJpc3RpYW4gR3JpZWJlbAorCisgICBEZXNjcmlwdGlvbjogU0FDIERlYyBlcnJvciBjb25jZWFsbWVudAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic2FjX2RlY19jb25jZWFsLmgiCisKK3ZvaWQgU3BhdGlhbERlY0NvbmNlYWxtZW50X0luaXQoU3BhdGlhbERlY0NvbmNlYWxtZW50SW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCByZXNldEZsYWdzKSB7CisgIEZES19BU1NFUlQoaW5mbyAhPSBOVUxMKTsKKworICBpZiAocmVzZXRGbGFncyAmIE1QRUdTX0NPTkNFQUxfUkVTRVRfU1RBVEUpIHsKKyAgICBpbmZvLT5jb25jZWFsU3RhdGUgPSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0luaXQ7CisgICAgLyogRnJhbWUgY291bnRlcnMgd2lsbCBiZSBpbml0aWFsaXplZCBpbXBsaWNpdGVseSBpbiBmdW5jdGlvbgorICAgICAqIFNwYXRpYWxEZWNDb25jZWFsbWVudF9VcGRhdGVTdGF0ZSgpLiAqLworICB9CisKKyAgaWYgKHJlc2V0RmxhZ3MgJiBNUEVHU19DT05DRUFMX1JFU0VUX1BBUkFNRVRFUikgeworICAgIC8qIFNldCBkZWZhdWx0IHBhcmFtcyAqLworICAgIGluZm8tPmNvbmNlYWxQYXJhbXMubWV0aG9kID0gTVBFR1NfQ09OQ0VBTF9ERUZBVUxUX01FVEhPRDsKKyAgICBpbmZvLT5jb25jZWFsUGFyYW1zLm51bUtlZXBGcmFtZXMgPSBNUEVHU19DT05DRUFMX0RFRkFVTFRfTlVNX0tFRVBfRlJBTUVTOworICAgIGluZm8tPmNvbmNlYWxQYXJhbXMubnVtRmFkZU91dEZyYW1lcyA9CisgICAgICAgIE1QRUdTX0NPTkNFQUxfREVGQVVMVF9GQURFX09VVF9TTE9QRV9MRU5HVEg7CisgICAgaW5mby0+Y29uY2VhbFBhcmFtcy5udW1GYWRlSW5GcmFtZXMgPQorICAgICAgICBNUEVHU19DT05DRUFMX0RFRkFVTFRfRkFERV9JTl9TTE9QRV9MRU5HVEg7CisgICAgaW5mby0+Y29uY2VhbFBhcmFtcy5udW1SZWxlYXNlRnJhbWVzID0KKyAgICAgICAgTVBFR1NfQ09OQ0VBTF9ERUZBVUxUX05VTV9SRUxFQVNFX0ZSQU1FUzsKKyAgfQorCisgIHJldHVybjsKK30KKworaW50IFNwYXRpYWxEZWNDb25jZWFsbWVudF9BcHBseSgKKyAgICBTcGF0aWFsRGVjQ29uY2VhbG1lbnRJbmZvICppbmZvLAorICAgIGNvbnN0IFNDSEFSICgqY21wSWR4RGF0YSlbTUFYX1BBUkFNRVRFUl9CQU5EU10sIFNDSEFSICoqZGlmZklkeERhdGEsCisgICAgU0NIQVIgKgorICAgICAgICBpZHhQcmV2LCAvKiBjaGFyCisgICAgICAgICAgICAgICAgICAgIGlkeFByZXZbU1BBVElBTERFQ19NQVhfTlVNX09UVF1bU1BBVElBTERFQ19NQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICovCisgICAgU0NIQVIgKmJzWFhYRGF0YU1vZGUsIGNvbnN0IGludCBzdGFydEJhbmQsIGNvbnN0IGludCBzdG9wQmFuZCwKKyAgICBjb25zdCBTQ0hBUiBkZWZhdWx0VmFsdWUsIGNvbnN0IGludCBwYXJhbVR5cGUsIGNvbnN0IGludCBudW1QYXJhbVNldHMpIHsKKyAgaW50IGFwcGxpZWRQcm9jZXNzaW5nID0gMDsKKyAgaW50IGJhbmQsIGRhdGFNb2RlID0gLTE7CisKKyAgRkRLX0FTU0VSVChpbmZvICE9IE5VTEwpOworICBGREtfQVNTRVJUKGNtcElkeERhdGEgIT0gTlVMTCk7CisgIEZES19BU1NFUlQoaWR4UHJldiAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChic1hYWERhdGFNb2RlICE9IE5VTEwpOworCisgIC8qIFByb2Nlc3NpbmcgZGVwZW5kcyBvbmx5IG9uIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworICBzd2l0Y2ggKGluZm8tPmNvbmNlYWxTdGF0ZSkgeworICAgIGNhc2UgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9Jbml0OgorICAgICAgZGF0YU1vZGUgPSAwOyAvKiBkZWZhdWx0ICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9PazoKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0tlZXA6CisgICAgICBkYXRhTW9kZSA9IDE7IC8qIGtlZXAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0ZhZGVUb0RlZmF1bHQ6IHsKKyAgICAgIC8qIFN0YXJ0IHNpbXBsZSBmYWRlIG91dCAqLworICAgICAgRklYUF9EQkwgZmFjID0gZkRpdk5vcm0oaW5mby0+Y250U3RhdGVGcmFtZXMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+Y29uY2VhbFBhcmFtcy5udW1GYWRlT3V0RnJhbWVzICsgMSk7CisKKyAgICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kICs9IDEpIHsKKyAgICAgICAgLyogICAgICAgICAgICBpZHhQcmV2ID0gZmFjICogZGVmYXVsdFZhbHVlICsgKDEtZmFjKSAqIGlkeFByZXY7ICovCisgICAgICAgIGlkeFByZXZbYmFuZF0gPQorICAgICAgICAgICAgZk11bHRJKGZhYywgZGVmYXVsdFZhbHVlIC0gaWR4UHJldltiYW5kXSkgKyBpZHhQcmV2W2JhbmRdOworICAgICAgfQorICAgICAgZGF0YU1vZGUgPSAxOyAvKiBrZWVwICovCisgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7CisgICAgfSBicmVhazsKKworICAgIGNhc2UgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9EZWZhdWx0OgorICAgICAgZm9yIChiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQgKz0gMSkgeworICAgICAgICBpZHhQcmV2W2JhbmRdID0gZGVmYXVsdFZhbHVlOworICAgICAgfQorICAgICAgZGF0YU1vZGUgPSAxOyAvKiBrZWVwICovCisgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9GYWRlRnJvbURlZmF1bHQ6IHsKKyAgICAgIEZJWFBfREJMIGZhYyA9IGZEaXZOb3JtKGluZm8tPmNudFZhbGlkRnJhbWVzICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmNvbmNlYWxQYXJhbXMubnVtRmFkZUluRnJhbWVzICsgMSk7CisKKyAgICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kICs9IDEpIHsKKyAgICAgICAgLyogICAgICAgICAgICBpZHhQcmV2ID0gZmFjICogY21wSWR4RGF0YSArICgxLWZhYykgKiBkZWZhdWx0VmFsdWU7ICovCisgICAgICAgIGlkeFByZXZbYmFuZF0gPQorICAgICAgICAgICAgZk11bHRJKGZhYywgY21wSWR4RGF0YVtudW1QYXJhbVNldHMgLSAxXVtiYW5kXSAtIGRlZmF1bHRWYWx1ZSkgKworICAgICAgICAgICAgZGVmYXVsdFZhbHVlOworICAgICAgfQorICAgICAgZGF0YU1vZGUgPSAxOyAvKiBrZWVwICovCisgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7CisgICAgfSBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOyAvKiBBbGwgdmFsaWQgc3RhdGVzIHNoYWxsIGJlIGhhbmRsZWQgYWJvdmUuICovCisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChkYXRhTW9kZSA+PSAwKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bVBhcmFtU2V0czsgaSArPSAxKSB7CisgICAgICBic1hYWERhdGFNb2RlW2ldID0gZGF0YU1vZGU7CisgICAgICBpZiAoZGlmZklkeERhdGEgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBzdG9wQmFuZDsgYmFuZCArPSAxKSB7CisgICAgICAgICAgZGlmZklkeERhdGFbaV1bYmFuZF0gPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGFwcGxpZWRQcm9jZXNzaW5nOworfQorCit2b2lkIFNwYXRpYWxEZWNDb25jZWFsbWVudF9VcGRhdGVTdGF0ZShTcGF0aWFsRGVjQ29uY2VhbG1lbnRJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lT2spIHsKKyAgRkRLX0FTU0VSVChpbmZvICE9IE5VTEwpOworCisgIGlmIChmcmFtZU9rKSB7CisgICAgaW5mby0+Y250VmFsaWRGcmFtZXMgKz0gMTsKKyAgfSBlbHNlIHsKKyAgICBpbmZvLT5jbnRWYWxpZEZyYW1lcyA9IDA7CisgIH0KKworICBzd2l0Y2ggKGluZm8tPmNvbmNlYWxTdGF0ZSkgeworICAgIGNhc2UgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9Jbml0OgorICAgICAgaWYgKGZyYW1lT2spIHsKKyAgICAgICAgLyogTkVYVCBTVEFURTogT2sgKi8KKyAgICAgICAgaW5mby0+Y29uY2VhbFN0YXRlID0gU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgaW5mby0+Y250U3RhdGVGcmFtZXMgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfT2s6CisgICAgICBpZiAoIWZyYW1lT2spIHsKKyAgICAgICAgLyogTkVYVCBTVEFURTogS2VlcCAqLworICAgICAgICBpbmZvLT5jb25jZWFsU3RhdGUgPSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0tlZXA7CisgICAgICAgIGluZm8tPmNudFN0YXRlRnJhbWVzID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0tlZXA6CisgICAgICBpbmZvLT5jbnRTdGF0ZUZyYW1lcyArPSAxOworICAgICAgaWYgKGZyYW1lT2spIHsKKyAgICAgICAgLyogTkVYVCBTVEFURTogT2sgKi8KKyAgICAgICAgaW5mby0+Y29uY2VhbFN0YXRlID0gU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9PazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbmZvLT5jbnRTdGF0ZUZyYW1lcyA+PSBpbmZvLT5jb25jZWFsUGFyYW1zLm51bUtlZXBGcmFtZXMpIHsKKyAgICAgICAgICBpZiAoaW5mby0+Y29uY2VhbFBhcmFtcy5udW1GYWRlT3V0RnJhbWVzID09IDApIHsKKyAgICAgICAgICAgIC8qIE5FWFQgU1RBVEU6IERlZmF1bHQgKi8KKyAgICAgICAgICAgIGluZm8tPmNvbmNlYWxTdGF0ZSA9IFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfRGVmYXVsdDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTkVYVCBTVEFURTogRmFkZSB0byBkZWZhdWx0ICovCisgICAgICAgICAgICBpbmZvLT5jb25jZWFsU3RhdGUgPSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0ZhZGVUb0RlZmF1bHQ7CisgICAgICAgICAgICBpbmZvLT5jbnRTdGF0ZUZyYW1lcyA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9GYWRlVG9EZWZhdWx0OgorICAgICAgaW5mby0+Y250U3RhdGVGcmFtZXMgKz0gMTsKKyAgICAgIGlmIChpbmZvLT5jbnRWYWxpZEZyYW1lcyA+IDApIHsKKyAgICAgICAgLyogTkVYVCBTVEFURTogRmFkZSBpbiBmcm9tIGRlZmF1bHQgKi8KKyAgICAgICAgaW5mby0+Y29uY2VhbFN0YXRlID0gU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9GYWRlRnJvbURlZmF1bHQ7CisgICAgICAgIGluZm8tPmNudFN0YXRlRnJhbWVzID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbmZvLT5jbnRTdGF0ZUZyYW1lcyA+PSBpbmZvLT5jb25jZWFsUGFyYW1zLm51bUZhZGVPdXRGcmFtZXMpIHsKKyAgICAgICAgICAvKiBORVhUIFNUQVRFOiBEZWZhdWx0ICovCisgICAgICAgICAgaW5mby0+Y29uY2VhbFN0YXRlID0gU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9EZWZhdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9EZWZhdWx0OgorICAgICAgaWYgKGluZm8tPmNudFZhbGlkRnJhbWVzID4gMCkgeworICAgICAgICBpZiAoaW5mby0+Y29uY2VhbFBhcmFtcy5udW1GYWRlSW5GcmFtZXMgPT0gMCkgeworICAgICAgICAgIC8qIE5FWFQgU1RBVEU6IE9rICovCisgICAgICAgICAgaW5mby0+Y29uY2VhbFN0YXRlID0gU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBORVhUIFNUQVRFOiBGYWRlIGluIGZyb20gZGVmYXVsdCAqLworICAgICAgICAgIGluZm8tPmNvbmNlYWxTdGF0ZSA9IFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfRmFkZUZyb21EZWZhdWx0OworICAgICAgICAgIGluZm8tPmNudFZhbGlkRnJhbWVzID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfRmFkZUZyb21EZWZhdWx0OgorICAgICAgaW5mby0+Y250VmFsaWRGcmFtZXMgKz0gMTsKKyAgICAgIGlmIChmcmFtZU9rKSB7CisgICAgICAgIGlmIChpbmZvLT5jbnRWYWxpZEZyYW1lcyA+PSBpbmZvLT5jb25jZWFsUGFyYW1zLm51bUZhZGVJbkZyYW1lcykgeworICAgICAgICAgIC8qIE5FWFQgU1RBVEU6IE9rICovCisgICAgICAgICAgaW5mby0+Y29uY2VhbFN0YXRlID0gU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTkVYVCBTVEFURTogRmFkZSB0byBkZWZhdWx0ICovCisgICAgICAgIGluZm8tPmNvbmNlYWxTdGF0ZSA9IFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfRmFkZVRvRGVmYXVsdDsKKyAgICAgICAgaW5mby0+Y250U3RhdGVGcmFtZXMgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsgLyogQWxsIHZhbGlkIHN0YXRlcyBzaG91bGQgYmUgaGFuZGxlZCBhYm92ZSEgKi8KKyAgICAgIGJyZWFrOworICB9Cit9CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfU2V0UGFyYW0oU3BhdGlhbERlY0NvbmNlYWxtZW50SW5mbyAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0FDX0RFQ19DT05DRUFMX1BBUkFNIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdmFsdWUpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBTQUNfREVDX0NPTkNFQUxfTUVUSE9EOgorICAgICAgc3dpdGNoICgoU3BhdGlhbERlY0NvbmNlYWxtZW50TWV0aG9kKXZhbHVlKSB7CisgICAgICAgIGNhc2UgU0FDX0RFQ19DT05DRUFMX1dJVEhfWkVST19WQUxVRURfT1VUUFVUOgorICAgICAgICBjYXNlIFNBQ19ERUNfQ09OQ0VBTF9CWV9GQURJTkdfUEFSQU1FVEVSUzoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICAvKiBzdG9yZSBwYXJhbWV0ZXIgdmFsdWUgKi8KKyAgICAgICAgc2VsZi0+Y29uY2VhbFBhcmFtcy5tZXRob2QgPSAoU3BhdGlhbERlY0NvbmNlYWxtZW50TWV0aG9kKXZhbHVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfSEFORExFOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBQ19ERUNfQ09OQ0VBTF9OVU1fS0VFUF9GUkFNRVM6CisgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICAvKiBzdG9yZSBwYXJhbWV0ZXIgdmFsdWUgKi8KKyAgICAgICAgc2VsZi0+Y29uY2VhbFBhcmFtcy5udW1LZWVwRnJhbWVzID0gKFVJTlQpdmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9IQU5ETEU7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FDX0RFQ19DT05DRUFMX0ZBREVfT1VUX1NMT1BFX0xFTkdUSDoKKyAgICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIC8qIHN0b3JlIHBhcmFtZXRlciB2YWx1ZSAqLworICAgICAgICBzZWxmLT5jb25jZWFsUGFyYW1zLm51bUZhZGVPdXRGcmFtZXMgPSAoVUlOVCl2YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IE1QU19JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBTQUNfREVDX0NPTkNFQUxfRkFERV9JTl9TTE9QRV9MRU5HVEg6CisgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICAvKiBzdG9yZSBwYXJhbWV0ZXIgdmFsdWUgKi8KKyAgICAgICAgc2VsZi0+Y29uY2VhbFBhcmFtcy5udW1GYWRlSW5GcmFtZXMgPSAoVUlOVCl2YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IE1QU19JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBTQUNfREVDX0NPTkNFQUxfTlVNX1JFTEVBU0VfRlJBTUVTOgorICAgICAgaWYgKHZhbHVlIDwgMCkgeworICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgLyogc3RvcmUgcGFyYW1ldGVyIHZhbHVlICovCisgICAgICAgIHNlbGYtPmNvbmNlYWxQYXJhbXMubnVtUmVsZWFzZUZyYW1lcyA9IChVSU5UKXZhbHVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfSEFORExFOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZXJyID0gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgZ290byBiYWlsOworICB9CisKK2JhaWw6CisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19kZWNfY29uY2VhbC5oIGIvbGliU0FDZGVjL3NyYy9zYWNfZGVjX2NvbmNlYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Y1MjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfZGVjX2NvbmNlYWwuaApAQCAtMCwwICsxLDE4NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEVydGVsLCBDaHJpc3RpYW4gR3JpZWJlbAorCisgICBEZXNjcmlwdGlvbjogU0FDIERlYyBlcnJvciBjb25jZWFsbWVudAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ19ERUNfQ09OQ0VBTF9ICisjZGVmaW5lIFNBQ19ERUNfQ09OQ0VBTF9ICisKKyNpbmNsdWRlICJzYWNfZGVjX2ludGVyZmFjZS5oIgorCisvKiBNb2R1bGVzIGR5bmFtaWMgcGFyYW1ldGVyczogKi8KK3R5cGVkZWYgZW51bSB7CisgIFNBQ19ERUNfQ09OQ0VBTF9NRVRIT0QgPSAwLAorICBTQUNfREVDX0NPTkNFQUxfTlVNX0tFRVBfRlJBTUVTLAorICBTQUNfREVDX0NPTkNFQUxfRkFERV9PVVRfU0xPUEVfTEVOR1RILAorICBTQUNfREVDX0NPTkNFQUxfRkFERV9JTl9TTE9QRV9MRU5HVEgsCisgIFNBQ19ERUNfQ09OQ0VBTF9OVU1fUkVMRUFTRV9GUkFNRVMKKworfSBTQUNfREVDX0NPTkNFQUxfUEFSQU07CisKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworLyogc2FjX2RlY19pbnRlcmZhY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3R5cGVkZWYgZW51bSB7CisgIFNBQ19ERUNfQ09OQ0VBTF9XSVRIX1pFUk9fVkFMVUVEX09VVFBVVCA9IDAsCisgIFNBQ19ERUNfQ09OQ0VBTF9CWV9GQURJTkdfUEFSQU1FVEVSUyA9IDEKKworfSBTcGF0aWFsRGVjQ29uY2VhbG1lbnRNZXRob2Q7CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworLyogRGVmYXVsdCBkeW5hbWljIHBhcmFtZXRlciB2YWx1ZXM6ICovCisjZGVmaW5lIE1QRUdTX0NPTkNFQUxfREVGQVVMVF9NRVRIT0QgU0FDX0RFQ19DT05DRUFMX0JZX0ZBRElOR19QQVJBTUVURVJTCisjZGVmaW5lIE1QRUdTX0NPTkNFQUxfREVGQVVMVF9OVU1fS0VFUF9GUkFNRVMgKDEwKQorI2RlZmluZSBNUEVHU19DT05DRUFMX0RFRkFVTFRfRkFERV9PVVRfU0xPUEVfTEVOR1RIICg1KQorI2RlZmluZSBNUEVHU19DT05DRUFMX0RFRkFVTFRfRkFERV9JTl9TTE9QRV9MRU5HVEggKDUpCisjZGVmaW5lIE1QRUdTX0NPTkNFQUxfREVGQVVMVF9OVU1fUkVMRUFTRV9GUkFNRVMgKDMpCisKK3R5cGVkZWYgZW51bSB7CisgIFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfSW5pdCA9IDAsCisgIFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfT2ssCisgIFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfS2VlcCwKKyAgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9GYWRlVG9EZWZhdWx0LAorICBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0RlZmF1bHQsCisgIFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfRmFkZUZyb21EZWZhdWx0CisKK30gU3BhdGlhbERlY0NvbmNlYWxtZW50U3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU3BhdGlhbERlY0NvbmNlYWxtZW50TWV0aG9kIG1ldGhvZDsKKworICBVSU5UIG51bUtlZXBGcmFtZXM7CisgIFVJTlQgbnVtRmFkZU91dEZyYW1lczsKKyAgVUlOVCBudW1GYWRlSW5GcmFtZXM7CisgIFVJTlQgbnVtUmVsZWFzZUZyYW1lczsKKworfSBTcGF0aWFsRGVjQ29uY2VhbG1lbnRQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU3BhdGlhbERlY0NvbmNlYWxtZW50UGFyYW1zIGNvbmNlYWxQYXJhbXM7IC8qIFVzZXIgc2V0IHBhcmFtcyAqLworICBTcGF0aWFsRGVjQ29uY2VhbG1lbnRTdGF0ZQorICAgICAgY29uY2VhbFN0YXRlOyAvKiBTdGF0ZSBvZiBpbnRlcm5hbCBzdGF0ZSBtYWNoaW5lIChmYWRlLWluL291dCBldGMpICovCisKKyAgVUlOVCBjbnRTdGF0ZUZyYW1lczsgLyogQ291bnRlciBmb3IgZmFkZS1pbi9vdXQgaGFuZGxpbmcgKi8KKyAgVUlOVCBjbnRWYWxpZEZyYW1lczsgLyogQ291bnRlciBmb3IgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBnb29kIGZyYW1lcyovCisKK30gU3BhdGlhbERlY0NvbmNlYWxtZW50SW5mbzsKKworLyogTW9kdWxlIHJlc2V0IGZsYWdzICovCisjZGVmaW5lIE1QRUdTX0NPTkNFQUxfUkVTRVRfU1RBVEUgKDB4MDEpCisjZGVmaW5lIE1QRUdTX0NPTkNFQUxfUkVTRVRfUEFSQU1FVEVSICgweDAyKQorI2RlZmluZSBNUEVHU19DT05DRUFMX1JFU0VUX0FMTCAoMHhGRikKKwordm9pZCBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfSW5pdChTcGF0aWFsRGVjQ29uY2VhbG1lbnRJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHJlc2V0RmxhZ3MpOworCitpbnQgU3BhdGlhbERlY0NvbmNlYWxtZW50X0FwcGx5KFNwYXRpYWxEZWNDb25jZWFsbWVudEluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSICgqY21wSWR4RGF0YSlbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICoqZGlmZklkeERhdGEsIFNDSEFSICppZHhQcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqYnNYWFhEYXRhTW9kZSwgY29uc3QgaW50IHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0b3BCYW5kLCBjb25zdCBTQ0hBUiBkZWZhdWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwYXJhbVR5cGUsIGNvbnN0IGludCBudW1QYXJhbVNldHMpOworCit2b2lkIFNwYXRpYWxEZWNDb25jZWFsbWVudF9VcGRhdGVTdGF0ZShTcGF0aWFsRGVjQ29uY2VhbG1lbnRJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lT2spOworCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0NvbmNlYWxtZW50X1NldFBhcmFtKFNwYXRpYWxEZWNDb25jZWFsbWVudEluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNBQ19ERUNfQ09OQ0VBTF9QQVJBTSBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHZhbHVlKTsKKworI2VuZGlmIC8qIFNBQ19ERUNfQ09OQ0VBTF9IICovCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19kZWNfaW50ZXJmYWNlLmggYi9saWJTQUNkZWMvc3JjL3NhY19kZWNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlZWE5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9zcmMvc2FjX2RlY19pbnRlcmZhY2UuaApAQCAtMCwwICsxLDMzNSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjb2RlciBMaWJyYXJ5IEludGVyZmFjZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ19ERUNfSU5URVJGQUNFX0gKKyNkZWZpbmUgU0FDX0RFQ19JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJzYWNfZGVjX2Vycm9yY29kZXMuaCIKKyNpbmNsdWRlICJzYWNfZGVjX3NzY19zdHJ1Y3QuaCIKKworLyoqCisgKiBcYnJpZWYgIEJhc2VsaW5lIE1QRUctU3Vycm91bmQgcHJvZmlsZSBMZXZlbCAxLTUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIERFQ09ERVJfTEVWRUxfMCA9IDAsIC8qITwgTGV2ZWwgMDogZHVtbXkgbGV2ZWw7IDIxMiBvbmx5ICovCisgIERFQ09ERVJfTEVWRUxfNiA9IDYgIC8qITwgTGV2ZWwgNjogbm8gc3VwcG9ydCAqLworfSBDRkdfTEVWRUw7CisKKy8qCisgKiBcYnJpZWYgIE51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgcmVzdHJpY3Rpb24uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIE9VVFBVVF9DSEFOTkVMU19ERUZBVUxULCAvKiE8IERlZmF1bHQgY29uZmlndXJhdGlvbiBkZXBlbmRpbmcgb24gRGVjb2RlciBMZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIE9VVFBVVF9DSEFOTkVMU18yXzAsICAgICAvKiE8IExpbWl0YXRpb24gdG8gc3RlcmVvIG91dHB1dCAqLworICBPVVRQVVRfQ0hBTk5FTFNfNV8xICAgICAgLyohPCBMaW1pdGF0aW9uIHRvIDUuMSBvdXRwdXQgKi8KK30gQ0ZHX1JFU1RSSUNUSU9OOworCisvKgorICogXGJyaWVmICBTdXBwb3J0ZWQgZGVjb2RlciBtb2RlLgorICovCit0eXBlZGVmIGVudW0geworICBFWFRfSFFfT05MWSA9IDAsICAvKiE8IEhpZ2ggUXVhbGl0eSBwcm9jZXNzaW5nIG9ubHkgKi8KKyAgRVhUX0xQX09OTFkgPSAxLCAgLyohPCBMb3cgUG93ZXIgcHJvY2VzaW5nIG9ubHkgKi8KKyAgRVhUX0hRX0FORF9MUCA9IDIgLyohPCBTdXBwb3J0IGJvdGggSFEgYW5kIExQIHByb2Nlc3NpbmcgKi8KK30gQ0ZHX0VYVEVOVDsKKworLyoKKyAqIFxicmllZiAgU3VwcG9ydGVkIGJpbmF1cmFsIG1vZGUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEJJTkFVUkFMX05PTkUgPSAtMSAvKiE8IE5vIGJpbmF1cmFsIHByb2Nlc2luZyBzdXBwb3J0ZWQgKi8KK30gQ0ZHX0JJTkFVUkFMOworCisvKioKKyAqIFxicmllZiAgRGVjb2RlciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZS4KKyAqCisgKiBUaGVzZSBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIHBhcmFtZXRlcnMgbmVjZXNzYXJ5IGZvciBkZWNvZGVyIG9wZW4gZnVuY3Rpb24uCisgKiBUaGUgY29uZmlndXJhdGlvbiBzcGVjaWZpZXMgdGhlIGZ1bmN0aW9uYWwgcmFuZ2Ugb2YgdGhlIGRlY29kZXIgaW5zdGFuY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgQ0ZHX0xFVkVMIGRlY29kZXJMZXZlbDsKKyAgQ0ZHX0VYVEVOVCBkZWNvZGVyTW9kZTsKKyAgQ0ZHX1JFU1RSSUNUSU9OIG1heE51bU91dHB1dENoYW5uZWxzOworICBDRkdfQklOQVVSQUwgYmluYXVyYWxNb2RlOworCit9IFNQQVRJQUxfREVDX0NPTkZJRzsKKwordHlwZWRlZiBlbnVtIHsKKyAgSU5QVVRNT0RFX1FNRiA9IDEwMDAsCisgIElOUFVUTU9ERV9RTUZfU0JSID0gMTAwMSwKKyAgSU5QVVRNT0RFX1RJTUUgPSAxMDAyCit9IFNQQVRJQUxERUNfSU5QVVRfTU9ERTsKKworLyoqCisgKiBcYnJpZWYgIE1QRUcgU3Vycm91bmQgdXBtaXggdHlwZSBtb2RlLgorICoqLwordHlwZWRlZiBlbnVtIHsKKyAgVVBNSVhfVFlQRV9CWVBBU1MgPQorICAgICAgLTEsIC8qITwgQnlwYXNzIHRoZSBkb3dubWl4IGNoYW5uZWxzIGZyb20gdGhlIGNvcmUgZGVjb2Rlci4gICAgKi8KKyAgVVBNSVhfVFlQRV9OT1JNQUwgPSAwIC8qITwgTXVsdGkgY2hhbm5lbCBvdXRwdXQuICovCisKK30gU1BBVElBTF9ERUNfVVBNSVhfVFlQRTsKKworLyoqCisgKiBcYnJpZWYgIER5bmFtaWMgZGVjb2RlciBwYXJhbWV0ZXJzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIEJhc2ljcyAqLworICBVQ0hBUiBvdXRwdXRNb2RlOworICBVQ0hBUiBibGluZEVuYWJsZTsKKyAgVUNIQVIgYnlwYXNzTW9kZTsKKworICAvKiBFcnJvciBjb25jZWFsbWVudCAqLworICBVQ0hBUiBjb25jZWFsTWV0aG9kOworICBVSU5UIGNvbmNlYWxOdW1LZWVwRnJhbWVzOworICBVSU5UIGNvbmNlYWxGYWRlT3V0U2xvcGVMZW5ndGg7CisgIFVJTlQgY29uY2VhbEZhZGVJblNsb3BlTGVuZ3RoOworICBVSU5UIGNvbmNlYWxOdW1SZWxlYXNlRnJhbWVzOworCit9IFNQQVRJQUxERUNfUEFSQU07CisKKy8qKgorICogXGJyaWVmIEZsYWdzIHdoaWNoIGNvbnRyb2wgdGhlIGluaXRpYWxpemF0aW9uCisgKiovCit0eXBlZGVmIGVudW0geworICBNUEVHU19JTklUX05PTkUgPSAweDAwMDAwMDAwLCAvKiE8IEluZGljYXRlcyBubyBpbml0aWFsaXphdGlvbiAqLworCisgIE1QRUdTX0lOSVRfQ09ORklHID0gMHgwMDAwMDAxMCwgLyohPCBJbmRpY2F0ZXMgYSBjb25maWd1cmF0aW9uIGNoYW5nZSBkdWUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0MgdmFsdWUgY2hhbmdlcyAqLworCisgIE1QRUdTX0lOSVRfU1RBVEVTX0FOQV9RTUZfRklMVEVSID0KKyAgICAgIDB4MDAwMDAxMDAsIC8qITwgQ29udHJvbHMgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBhbmFseXNpcyBxbWYgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMgKi8KKyAgTVBFR1NfSU5JVF9TVEFURVNfU1lOX1FNRl9GSUxURVIgPQorICAgICAgMHgwMDAwMDIwMCwgLyohPCBDb250cm9scyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHN5bnRoZXNpcyBxbWYgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMgKi8KKyAgTVBFR1NfSU5JVF9TVEFURVNfQU5BX0hZQl9GSUxURVIgPSAweDAwMDAwNDAwLCAvKiE8IENvbnRyb2xzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5c2lzIGh5YnJpZCBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMgKi8KKyAgTVBFR1NfSU5JVF9TVEFURVNfREVDT1JSRUxBVE9SID0KKyAgICAgIDB4MDAwMDA4MDAsIC8qITwgQ29udHJvbHMgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBkZWNvcnJlbGF0b3Igc3RhdGVzICovCisgIE1QRUdTX0lOSVRfU1RBVEVTX00xTTIgPSAweDAwMDAyMDAwLCAvKiE8IENvbnRyb2xzIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkgaW4gbTEgYW5kIG0yIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRpb24gKi8KKyAgTVBFR1NfSU5JVF9TVEFURVNfR0VTID0gMHgwMDAwNDAwMCwgIC8qITwgQ29udHJvbHMgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeSBpbiB0aGUgZ2VzIGNhbGN1bGF0aW9uICovCisgIE1QRUdTX0lOSVRfU1RBVEVTX1JFVkVSQiA9CisgICAgICAweDAwMDA4MDAwLCAvKiE8IENvbnRyb2xzIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcmV2ZXJiIHN0YXRlcyAqLworICBNUEVHU19JTklUX1NUQVRFU19QQVJBTSA9CisgICAgICAweDAwMDIwMDAwLCAvKiE8IENvbnRyb2xzIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgaGlzdG9yeSBvZiBhbGwgb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciAqLworICBNUEVHU19JTklUX1NUQVRFU19FUlJPUl9DT05DRUFMTUVOVCA9CisgICAgICAweDAwMDgwMDAwLCAvKiE8IENvbnRyb2xzIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZXJyb3IgY29uY2VhbG1lbnQKKyAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBzdGF0ZSAqLworICBNUEVHU19JTklUX1BBUkFNU19FUlJPUl9DT05DRUFMTUVOVCA9IDB4MDAyMDAwMDAgLyohPCBDb250cm9scyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvbGUgZXJyb3IgY29uY2VhbG1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBzZXQgKi8KKworfSBNUEVHU19JTklUX0NUUkxfRkxBR1M7CisKKyNkZWZpbmUgTUFTS19NUEVHU19JTklUX0FMTF9TVEFURVMgKDB4MDAwRkZGMDApCisjZGVmaW5lIE1BU0tfTVBFR1NfSU5JVF9BTExfUEFSQU1TICgweDAwRjAwMDAwKQorCit0eXBlZGVmIHN0cnVjdCBzcGF0aWFsRGVjX3N0cnVjdCBzcGF0aWFsRGVjLCAqSEFORExFX1NQQVRJQUxfREVDOworCit0eXBlZGVmIHN0cnVjdCBTUEFUSUFMX0JTX0ZSQU1FX3N0cnVjdCBTUEFUSUFMX0JTX0ZSQU1FOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgc2l6ZVBlcnNpc3RlbnQ7ICAgICAvKiBwZXJzaXN0ZW50IG1lbW9yeSAqLworICBVSU5UIHNpemVGYXN0UGVyc2lzdGVudDsgLyogZmFzdCBwZXJzaXN0ZW50IG1lbW9yeSAqLworCit9IE1FTV9SRVFVSVJFTUVOVFM7CisKKyNkZWZpbmUgUENNX01QUyBJTlRfUENNCisjZGVmaW5lIFBDTV9NUFNGIEZJWFBfUENNCisKKyNkZWZpbmUgRklYUF9EQkwyUENNX01QUyh4KSAoKElOVF9QQ00pRlhfREJMMkZYX1BDTSh4KSkKKworLyogZXhwb3NlZCBmdW5jdGlvbnMgKGxpYnJhcnkgaW50ZXJmYWNlKSAqLworCitpbnQgRkRLX1NwYXRpYWxEZWNDb21wYXJlU3BhdGlhbFNwZWNpZmljQ29uZmlnSGVhZGVyKAorICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3NjMSwgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTc2MyKTsKKworaW50IEZES19TcGF0aWFsRGVjSW5pdERlZmF1bHRTcGF0aWFsU3BlY2lmaWNDb25maWcoCisgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTcGF0aWFsU3BlY2lmaWNDb25maWcsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLCBpbnQgY29yZUNoYW5uZWxzLCBpbnQgc2FtcGxpbmdGcmVxLAorICAgIGludCBuVGltZVNsb3RzLCBpbnQgZGVjb2RlckxldmVsLCBpbnQgaXNCbGluZCk7CisKK3NwYXRpYWxEZWMgKkZES19TcGF0aWFsRGVjT3Blbihjb25zdCBTUEFUSUFMX0RFQ19DT05GSUcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcmVvQ29uZmlnSW5kZXgpOworCisvKioKKyAqIFxicmllZiBJbml0aWFsaXplIHN0YXRlIHZhcmlhYmxlcyBvZiB0aGUgTVBTIHBhcnNlcgorICovCit2b2lkIFNwYXRpYWxEZWNJbml0UGFyc2VyQ29udGV4dChzcGF0aWFsRGVjICpzZWxmKTsKKworLyoqCisgKiBcYnJpZWYgSW5pdGlhbGl6ZSBzdGF0ZSBvZiBNUFMgZGVjb2Rlci4gVGhpcyBtYXkgaGFwcGVuIGFmdGVyIHRoZSBmaXJzdCBwYXJzZQorICogb3BlcmF0aW9uLgorICovCitTQUNERUNfRVJST1IgRkRLX1NwYXRpYWxEZWNJbml0KHNwYXRpYWxEZWMgKnNlbGYsIFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNwYXRpYWxTcGVjaWZpY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5RbWZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBVElBTF9ERUNfVVBNSVhfVFlQRSBjb25zdCB1cG1peFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQVRJQUxERUNfUEFSQU0gKnBVc2VyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGluaXRGbGFncyAvKiBNUEVHU19JTklUX0NUUkxfRkxBR1MgKi8KKyk7CisKKy8qKgorICogXGJyaWVmIEFwcGx5IGRlY29kZWQgTVBFRyBTdXJyb3VuZCBwYXJhbWV0ZXJzIHRvIHRpbWUgZG9tYWluIG9yIFFNRiBkb3duIG1peAorICogZGF0YS4KKyAqIFxwYXJhbSBzZWxmIHNwYXRpYWwgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gaW5EYXRhIFBvaW50ZXIgdG8gdGltZSBkb21haW4gaW5wdXQgZG93biBtaXggZGF0YSBpZiBhbnkuCisgKiBccGFyYW0gcW1mSW5EYXRhUmVhbCBQb2ludGVyIGFycmF5IG9mIFFNRiBkb21haW4gZG93biBtaXggaW5wdXQgZGF0YSAocmVhbAorICogcGFydCkuCisgKiBccGFyYW0gcW1mSW5EYXRhSW1hZyBQb2ludGVyIGFycmF5IG9mIFFNRiBkb21haW4gZG93biBtaXggaW5wdXQgZGF0YQorICogKGltYWdpbmFyeSBwYXJ0KS4KKyAqIFxwYXJhbSBwY21PdXRCdWYgUG9pbnRlciB0byBhIHRpbWUgZG9tYWluIGJ1ZmZlciB3ZXJlIHRoZSB1cG1peGVkIG91dHB1dCBkYXRhCisgKiB3aWxsIGJlIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIG5TYW1wbGVzIEFtb3VudCBvZiBhdWRpbyBzYW1wbGVzIHBlciBjaGFubmVsIG9mIGRvd24gbWl4IGlucHV0IGRhdGEKKyAqIChmcmFtZSBsZW5ndGgpLgorICogXHBhcmFtIHBDb250cm9sRmxhZ3MgcG9pbnRlciB0byBjb250cm9sIGZsYWdzIGZpZWxkOyBpbnB1dC9vdXRwdXQuCisgKiBccGFyYW0gbnVtSW5wdXRDaGFubmVscyBhbW91bnQgb2YgZG93biBtaXggaW5wdXQgY2hhbm5lbHMuIE1pZ2h0IG5vdCBtYXRjaAorICogdGhlIGN1cnJlbnQgdHJlZSBjb25maWcsIHVzZWZ1bCBmb3IgaW50ZXJuYWwgc2FuaXR5IGNoZWNrcyBhbmQgYnlwYXNzIG1vZGUuCisgKiBccGFyYW0gY2hhbm5lbE1hcHBpbmcgYXJyYXkgY29udGFpbmluZyB0aGUgZGVzaXJlZCBvdXRwdXQgY2hhbm5lbCBvcmRlcmluZyB0bworICogdHJhbnNmb3JtIE1QRUcgUENFIHN0eWxlIG9yZGVyaW5nIHRvIGFueSBvdGhlciBjaGFubmVsIG9yZGVyaW5nLiBGaXJzdAorICogZGltZW5zaW9uIGlzIHRoZSB0b3RhbCBjaGFubmVsIGNvdW50LgorICovCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0FwcGx5RnJhbWUoCisgICAgc3BhdGlhbERlYyAqc2VsZiwgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUsIFNQQVRJQUxERUNfSU5QVVRfTU9ERSBpbnB1dE1vZGUsCisgICAgUENNX01QUyAqaW5EYXRhLCAgICAgICAgICAvKiBUaW1lIGRvbWFpbiBpbnB1dCAgKi8KKyAgICBGSVhQX0RCTCAqKnFtZkluRGF0YVJlYWwsIC8qIGludGVybGVhdmVkIGwvciAqLworICAgIEZJWFBfREJMICoqcW1mSW5EYXRhSW1hZywgLyogaW50ZXJsZWF2ZWQgbC9yICovCisgICAgUENNX01QUyAqcGNtT3V0QnVmLCAvKiBNQVhfT1VUUFVUX0NIQU5ORUxTKk1BWF9USU1FX1NMT1RTKk5VTV9RTUZfQkFORFNdICovCisgICAgVUlOVCBuU2FtcGxlcywgVUlOVCAqcENvbnRyb2xGbGFncywgaW50IG51bUlucHV0Q2hhbm5lbHMsCisgICAgY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciAqY29uc3QgbWFwRGVzY3IpOworCisvKioKKyAqIFxicmllZiBGaWxsIGdpdmVuIGFycmF5cyB3aXRoIGF1ZGlvIGNoYW5uZWwgdHlwZXMgYW5kIGluZGljZXMuCisgKiBccGFyYW0gc2VsZiBzcGF0aWFsIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGNoYW5uZWxUeXBlIGFycmF5IHdoZXJlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlcyBmciBlYWNoIG91dHB1dAorICogY2hhbm5lbHMgYXJlIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIGNoYW5uZWxJbmRpY2VzIGFycmF5IHdoZXJlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGljZXMgZnIgZWFjaAorICogb3V0cHV0IGNoYW5uZWxzIGFyZSBzdG9yZWQgaW50by4KKyAqLwordm9pZCBTcGF0aWFsRGVjQ2hhbm5lbFByb3BlcnRpZXMoc3BhdGlhbERlYyAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBjaGFubmVsVHlwZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY2hhbm5lbEluZGljZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IgKmNvbnN0IG1hcERlc2NyKTsKKwordm9pZCBGREtfU3BhdGlhbERlY0Nsb3NlKHNwYXRpYWxEZWMgKnNlbGYpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU0FDX0RFQ19JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfZGVjX2xpYi5jcHAgYi9saWJTQUNkZWMvc3JjL3NhY19kZWNfbGliLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmY5YmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfZGVjX2xpYi5jcHAKQEAgLTAsMCArMSwxOTE5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IFNBQyBEZWNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzYWNfZGVjX2xpYi5oIgorI2luY2x1ZGUgInNhY19kZWNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAic2FjX2RlYy5oIgorI2luY2x1ZGUgInNhY19iaXRkZWMuaCIKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisKKyNkZWZpbmUgTVBTX0RBVEFfQlVGRkVSX1NJWkUgKDIwNDgpCisKKy8qKgorICogXGJyaWVmIE1QRUcgU3Vycm91bmQgZGF0YSBpbmRpY2F0aW9uLgorICoqLwordHlwZWRlZiBlbnVtIHsKKyAgTVBFR1NfQU5DVFlQRV9GUkFNRSA9IDAsIC8qITwgTVBFRyBTdXJyb3VuZCBmcmFtZSwgc2VlIElTTy9JRUMgMjMwMDMtMSAqLworICBNUEVHU19BTkNUWVBFX0hFQURFUl9BTkRfRlJBTUUgPSAxLCAvKiE8IE1QRUcgU3Vycm91bmQgaGVhZGVyIGFuZCBNUEVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cnJvdW5kIGZyYW1lLCBzZWUgSVNPL0lFQyAyMzAwMy0xICovCisgIE1QRUdTX0FOQ1RZUEVfUkVTRVJWRURfMSA9IDIsICAgICAgIC8qITwgcmVzZXJ2ZWQsIHNlZSBJU08vSUVDIDIzMDAzLTEgKi8KKyAgTVBFR1NfQU5DVFlQRV9SRVNFUlZFRF8yID0gMyAgICAgICAgLyohPCByZXNlcnZlZCwgc2VlIElTTy9JRUMgMjMwMDMtMSovCit9IE1QRUdTX0FOQ1RZUEU7CisKKy8qKgorICogXGJyaWVmIE1QRUcgU3Vycm91bmQgZGF0YSBzZWdtZW50IGluZGljYXRpb24uCisgKiovCit0eXBlZGVmIGVudW0geworICBNUEVHU19DT05USU5VRSA9IDAsIC8qITwgSW5kaWNhdGVzIGlmIGRhdGEgc2VnbWVudCBjb250aW51ZXMgYSBkYXRhIGJsb2NrLiAqLworICBNUEVHU19TVE9QID0gMSwgICAgIC8qITwgSW5kaWNhdGVzIGlmIGRhdGEgc2VnbWVudCBlbmRzIGEgZGF0YSBibG9jay4gKi8KKyAgTVBFR1NfU1RBUlQgPSAyLCAgICAvKiE8IEluZGljYXRlcyBpZiBkYXRhIHNlZ21lbnQgYmVnaW5zIGEgZGF0YSBibG9jay4gKi8KKyAgTVBFR1NfU1RBUlRfU1RPUCA9CisgICAgICAzIC8qITwgSW5kaWNhdGVzIGlmIGRhdGEgc2VnbWVudCBiZWdpbnMgYW5kIGVuZHMgYSBkYXRhIGJsb2NrLiAqLworfSBNUEVHU19BTkNTVEFSVFNUT1A7CisKKy8qKgorICogXGJyaWVmIE1QRUcgU3Vycm91bmQgc3luY2hyb25pemFpdG9uIHN0YXRlLgorICoKKyAqICBDQVVUSU9OOiBDaGFuZ2luZyB0aGUgZW51bWVyYXRpb24gdmFsdWVzIGNhbiBicmVhayB0aGUgc3luYyBtZWNoYW5pc20KKyAqYmVjYXVzZSBpdCBpcyBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIHN0YXRlIHZhbHVlcy4KKyAqKi8KK3R5cGVkZWYgZW51bSB7CisgIE1QRUdTX1NZTkNfTE9TVCA9CisgICAgICAwLCAvKiE8IEluZGljYXRlcyBsb3N0IHN5bmMgYmVjYXVzZSBvZiBjdXJyZW50IGRpc2NvbnRpbnVpdHkuICovCisgIE1QRUdTX1NZTkNfRk9VTkQgPSAxLCAgIC8qITwgUGFyc2VkIGEgdmFsaWQgaGVhZGVyIGFuZCAocmUpaW50aWFsaXphdGlvbiB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4gKi8KKyAgTVBFR1NfU1lOQ19DT01QTEVURSA9IDIgLyohPCBJbiBzeW5jIGFuZCBjb250aW51b3VzLiBGb3VuZCBhbiBpbmRlcGVuZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBpbiBhZGRpdGlvbiB0byBNUEVHU19TWU5DX0ZPVU5ELgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWNvbmRpdGlvbjogTVBFR1NfU1lOQ19GT1VORC4gKi8KK30gTVBFR1NfU1lOQ1NUQVRFOworCisvKioKKyAqIFxicmllZiBNUEVHIFN1cnJvdW5kIG9wZXJhdGlvbiBtb2RlLgorICoqLwordHlwZWRlZiBlbnVtIHsKKyAgTVBFR1NfT1BNT0RFX0VNTSA9IDAsICAgICAgICAgICAvKiE8IE1vZGU6IEVuaGFuY2VkIE1hdHJpeCBNb2RlIChCbGluZCkgKi8KKyAgTVBFR1NfT1BNT0RFX01QU19QQVlMT0FEID0gMSwgICAvKiE8IE1vZGU6IE5vcm1hbCwgU3RlcmVvIG9yIEJpbmF1cmFsICovCisgIE1QRUdTX09QTU9ERV9OT19NUFNfUEFZTE9BRCA9IDIgLyohPCBNb2RlOiBubyBNUEVHIFN1cnJvdW5kIHBheWxvYWQgKi8KK30gTVBFR1NfT1BNT0RFOworCisvKioKKyAqIFxicmllZiBNUEVHIFN1cnJvdW5kIGluaXQgZmxhZ3MuCisgKiovCit0eXBlZGVmIGVudW0geworICBNUEVHU19JTklUX09LID0gMHgwMDAwMDAwMCwgLyohPCBpbmRpY2F0ZSBjb3JyZWN0IGluaXRpYWxpemF0aW9uICovCisgIE1QRUdTX0lOSVRfRU5GT1JDRV9SRUlOSVQgPQorICAgICAgMHgwMDAwMDAwMSwgLyohPCBpbmRpY2F0ZSBjb21wbGV0ZSBpbml0aWFsaXphdGlvbiAqLworCisgIE1QRUdTX0lOSVRfQ0hBTkdFX09VVFBVVF9NT0RFID0KKyAgICAgIDB4MDAwMDAwMTAsIC8qITwgaW5kaWNhdGUgY2hhbmdlIG9mIHRoZSBvdXRwdXQgbW9kZSAqLworICBNUEVHU19JTklUX0NIQU5HRV9QQVJUSUFMTFlfQ09NUExFWCA9CisgICAgICAweDAwMDAwMDIwLCAvKiE8IGluZGljYXRlIGNoYW5nZSBvZiBsb3cgcG93ZXIvaGlnaCBxdWFsaXR5ICovCisgIE1QRUdTX0lOSVRfQ0hBTkdFX1RJTUVfRlJFUV9JTlRFUkZBQ0UgPQorICAgICAgMHgwMDAwMDA0MCwgLyohPCBpbmRpY2F0ZSBjaGFuZ2Ugb2YgcW1mL3RpbWUgaW50ZXJmYWNlICovCisgIE1QRUdTX0lOSVRfQ0hBTkdFX0hFQURFUiA9IDB4MDAwMDAwODAsIC8qITwgaW5kaWNhdGUgY2hhbmdlIG9mIGhlYWRlciAqLworCisgIE1QRUdTX0lOSVRfRVJST1JfUEFZTE9BRCA9CisgICAgICAweDAwMDAwMTAwLCAvKiE8IGluZGljYXRlIHBheWxvYWQvYW5jVHlwZS9hbmNTdGFydFN0b3AgZXJyb3IgKi8KKworICBNUEVHU19JTklUX0JTX0lOVEVSUlVQVElPTiA9CisgICAgICAweDAwMDAxMDAwLCAvKiE8IGluZGljYXRlIGJpdHN0cmVhbSBpbnRlcnJ1cHRpb24gICovCisgIE1QRUdTX0lOSVRfQ0xFQVJfSElTVE9SWSA9CisgICAgICAweDAwMDAyMDAwLCAvKiE8IGluZGljYXRlIHRoYXQgYWxsIHN0YXRlcyBzaGFsbCBiZSBjbGVhcmVkICovCisKKyAgLyogUmUtaW5pdGlhbGl6YXRpb24gb2Ygc3VibW9kdWxlcyAqLworCisgIE1QRUdTX0lOSVRfQ0hBTkdFX0NPTkNFQUxfUEFSQU1TID0gMHgwMDEwMDAwMCwgLyohPCBpbmRpY2F0ZSBhIGNoYW5nZSBvZiBhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYXN0IG9uZSBlcnJvciBjb25jZWFsbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtICovCisKKyAgLyogTm8gcmUtaW5pdGlhbGl6YXRpb24gbmVlZGVkLCBjdXJyZW50bHkgbm90IHVzZWQgKi8KKyAgTVBFR1NfSU5JVF9DSEFOR0VfQllQQVNTX01PREUgPQorICAgICAgMHgwMTAwMDAwMCwgLyohPCBpbmRpY2F0ZSBjaGFuZ2Ugb2YgYnlwYXNzIG1vZGUgKi8KKworICAvKiBSZS1pbml0aWFsaXphdGlvbiBuZWVkZWQsIGN1cnJlbnRseSBub3QgdXNlZCAqLworICBNUEVHU19JTklUX0VSUk9SX0FOQ19UWVBFID0gMHgxMDAwMDAwMCwgLyohPCBpbmRpY2F0ZSBhbmNUeXBlIGVycm9yKi8KKyAgTVBFR1NfSU5JVF9FUlJPUl9BTkNfU1RBUlRTVE9QID0KKyAgICAgIDB4MjAwMDAwMDAgLyohPCBpbmRpY2F0ZSBhbmNTdGFydFN0b3AgZXJyb3IgKi8KK30gTVBFR1NfSU5JVF9GTEFHUzsKKworc3RydWN0IE1wZWdTdXJyb3VuZERlY29kZXIgeworICBIQU5ETEVfRkRLX1FNRl9ET01BSU4gcFFtZkRvbWFpbjsKKyAgVUNIQVIgbXBzRGF0YVtNUFNfREFUQV9CVUZGRVJfU0laRV07IC8qIEJ1ZmZlciBmb3IgTVBTIHBheWxvYWQgYWNjcm9zcyBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIG9uZSBzZWdtZW50ICovCisgIElOVCBtcHNEYXRhQml0czsgICAgICAgICAgICAgICAgICAgICAvKiBBbW91bnQgb2YgYml0cyBpbiBtcHNEYXRhICovCisgIC8qIE1QRUcgU3Vycm91bmQgZGVjb2RlciAqLworICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyBzcGF0aWFsU3BlY2lmaWNDb25maWdbMV07IC8qIFNTQyBkZWxheSBsaW5lIHdoaWNoIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBkdXJpbmcgZGVjb2RpbmcgKi8KKyAgc3BhdGlhbERlYyAqcFNwYXRpYWxEZWM7CisgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHCisgIHNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cDsgLyogU1NDIHVzZWQgd2hpbGUgcGFyc2luZyAqLworCisgIC8qIENyZWF0aW9uIHBhcmFtZXRlciAqLworICBVQ0hBUiBtcGVnU3Vycm91bmREZWNvZGVyTGV2ZWw7CisgIC8qIFJ1bi10aW1lIHBhcmFtZXRlciAqLworICBVQ0hBUiBtcGVnU3Vycm91bmRTc2NJc0dsb2JhbENmZzsgLyogRmxhZyB0ZWxsaW5nIHRoYXQgdGhlIFNTQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDo6c3BhdGlhbFNwZWNpZmljQ29uZmlnKSBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtb2YtYmFuZCBjb25maWd1cmF0aW9uLiAqLworICBVQ0hBUiBtcGVnU3Vycm91bmRVc2VUaW1lSW50ZXJmYWNlOworCisgIFNQQVRJQUxfQlNfRlJBTUUKKyAgYnNGcmFtZXNbMV07ICAgICAgICAgLyogQml0c3RyZWFtIFN0cnVjdHMgdGhhdCBjb250YWluIGRhdGEgcmVhZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBTcGF0aWFsRnJhbWUoKSBiaXRzdHJlYW0gZWxlbWVudCAqLworICBCU19MTF9TVEFURSBsbFN0YXRlOyAvKiBCaXQgc3RyZWFtIHBhcnNlciBzdGF0ZSBtZW1vcnkgKi8KKyAgVUNIQVIgYnNGcmFtZVBhcnNlOyAgLyogQ3VycmVudCBwYXJzZSBmcmFtZSBjb250ZXh0IGluZGV4ICovCisgIFVDSEFSIGJzRnJhbWVEZWNvZGU7IC8qIEN1cnJlbnQgZGVjb2RlL2FwcGx5IGZyYW1lIGNvbnRleHQgaW5kZXggKi8KKyAgVUNIQVIgYnNGcmFtZURlbGF5OyAgLyogQW1vdW50IG9mIGZyYW1lcyBkZWxheSBiZXR3ZWVuIHBhcnNpbmcgYW5kIHByb2Nlc3NpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGkuZS4gZm9yIGludGVycG9sYXRpb24gZXJyb3IgY29uY2VhbG1lbnQuICovCisKKyAgLyogVXNlciBwcmFtZXRlcnMgKi8KKyAgU1BBVElBTERFQ19QQVJBTSBtcGVnU3Vycm91bmRVc2VyUGFyYW1zOworCisgIC8qIEludGVybmFsIGZsYWdzICovCisgIFNQQVRJQUxfREVDX1VQTUlYX1RZUEUgdXBtaXhUeXBlOworICBpbnQgaW5pdEZsYWdzWzFdOworICBNUEVHU19BTkNTVEFSVFNUT1AgYW5jU3RhcnRTdG9wUHJldjsKKyAgTVBFR1NfU1lOQ1NUQVRFIGZPblN5bmNbMV07CisKKyAgLyogSW5pdGFsIGRlY29kZXIgY29uZmlndXJhdGlvbiAqLworICBTUEFUSUFMX0RFQ19DT05GSUcgZGVjQ29uZmlnOworfTsKKworc3RhdGljIFNBQ0RFQ19FUlJPUiBzc2NQYXJzZUNoZWNrKGNvbnN0IFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3NjKTsKKworLyoqCisgKiBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgUU1GIGJhbmRzIGZyb20gdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSAoaW4gSHopCisgKiovCitzdGF0aWMgaW50IG1wZWdTdXJyb3VuZERlY29kZXJfR2V0TnJPZlFtZkJhbmRzKAorICAgIGNvbnN0IFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3NjLCBVSU5UIHNhbXBsZVJhdGUpIHsKKyAgVUlOVCBzYW1wbGluZ0ZyZXF1ZW5jeSA9IHNhbXBsZVJhdGU7CisgIGludCBxbWZCYW5kcyA9IDY0OworCisgIGlmIChwU3NjICE9IE5VTEwpIHsKKyAgICBzd2l0Y2ggKHBTc2MtPmNvcmVDb2RlYykgeworICAgICAgY2FzZSBBT1RfVVNBQzoKKyAgICAgICAgaWYgKChwU3NjLT5zdGVyZW9Db25maWdJbmRleCA9PSAzKSkgeworICAgICAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBtYXBJZHgyUW1mQmFuZHNbM10gPSB7MjQsIDMyLCAxNn07CisgICAgICAgICAgRkRLX0FTU0VSVCgocFNzYy0+Y29yZVNickZyYW1lTGVuZ3RoSW5kZXggPj0gMikgJiYKKyAgICAgICAgICAgICAgICAgICAgIChwU3NjLT5jb3JlU2JyRnJhbWVMZW5ndGhJbmRleCA8PSA0KSk7CisgICAgICAgICAgcW1mQmFuZHMgPSBtYXBJZHgyUW1mQmFuZHNbcFNzYy0+Y29yZVNickZyYW1lTGVuZ3RoSW5kZXggLSAyXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcW1mQmFuZHM7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzYW1wbGluZ0ZyZXF1ZW5jeSA9IHBTc2MtPnNhbXBsaW5nRnJlcTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogbnVtYmVyIG9mIFFNRiBiYW5kcyBkZXBlbmQgb24gc2FtcGxpbmcgZnJlcXVlbmN5LCBzZWUgRkRJUyAyMzAwMy0xOjIwMDYKKyAgICogQ2hhcHRlciA2LjMuMyAqLworICBpZiAoc2FtcGxpbmdGcmVxdWVuY3kgPCAyNzcxMykgeworICAgIHFtZkJhbmRzID0gMzI7CisgIH0KKyAgaWYgKHNhbXBsaW5nRnJlcXVlbmN5ID4gNTU0MjYpIHsKKyAgICBxbWZCYW5kcyA9IDEyODsKKyAgfQorCisgIHJldHVybiBxbWZCYW5kczsKK30KKworLyoqCisgKiBcYnJpZWYgQW5hbHlzZSBpbml0IGZsYWdzCisgKiovCitzdGF0aWMgaW50IG1wZWdTdXJyb3VuZERlY29kZXJfQ2FsY0luaXRGbGFncyhTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNzYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNzYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXBtaXhUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaW5hdXJhbFF1YWxpdHlGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcnRpYWxseUNvbXBsZXhGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjdHJsRmxhZ3MpIHsKKyAgLyogQW5hbHlzZSBjb3JlIGNvZGVyICovCisgIGlmIChwU3NjMS0+Y29yZUNvZGVjICE9IHBTc2MyLT5jb3JlQ29kZWMpIHsKKyAgICAqY3RybEZsYWdzIHw9IE1BU0tfTVBFR1NfSU5JVF9BTExfU1RBVEVTOworICAgICpjdHJsRmxhZ3MgfD0gTUFTS19NUEVHU19JTklUX0FMTF9QQVJBTVM7CisgIH0gZWxzZSB7CisgICAgLyogQW5hbHlzZSBlbGVtZW50cyBmb3IgaW5pdGlhbGl6YXRpb24gb2Ygc3BhY2UgYW5hbHlzaXMgcW1mIGZpbHRlcmJhbmsgKi8KKyAgICBpZiAoKHBhcnRpYWxseUNvbXBsZXhGbGFnKSB8fCAocFNzYzEtPnRyZWVDb25maWcgIT0gcFNzYzItPnRyZWVDb25maWcpIHx8CisgICAgICAgIChwU3NjMS0+c2FtcGxpbmdGcmVxICE9IHBTc2MyLT5zYW1wbGluZ0ZyZXEpKSB7CisgICAgICAqY3RybEZsYWdzIHw9IE1QRUdTX0lOSVRfU1RBVEVTX0FOQV9RTUZfRklMVEVSOworICAgICAgKmN0cmxGbGFncyB8PSBNUEVHU19JTklUX1NUQVRFU19BTkFfSFlCX0ZJTFRFUjsKKyAgICB9CisKKyAgICAvKiBBbmFseXNlIGVsZW1lbnRzIGZvciBpbml0aWFsaXphdGlvbiBvZiBzcGFjZSBzeW50aGVzaXMgcW1mIGZpbHRlcmJhbmsgKi8KKyAgICBpZiAoKHVwbWl4VHlwZUZsYWcpIHx8IChwYXJ0aWFsbHlDb21wbGV4RmxhZykgfHwKKyAgICAgICAgKHBTc2MxLT50cmVlQ29uZmlnICE9IHBTc2MyLT50cmVlQ29uZmlnKSB8fAorICAgICAgICAocFNzYzEtPnNhbXBsaW5nRnJlcSAhPSBwU3NjMi0+c2FtcGxpbmdGcmVxKSB8fAorICAgICAgICAocFNzYzEtPmJzRml4ZWRHYWluRE1YICE9IHBTc2MyLT5ic0ZpeGVkR2FpbkRNWCkpIHsKKyAgICAgICpjdHJsRmxhZ3MgfD0gTVBFR1NfSU5JVF9TVEFURVNfU1lOX1FNRl9GSUxURVI7CisgICAgfQorCisgICAgLyogQW5hbHlzZSBlbGVtZW50cyBmb3IgaW5pdGlhbGl6YXRpb24gb2YgZGVjb3JyZWxhdG9yICovCisgICAgaWYgKCh1cG1peFR5cGVGbGFnKSB8fCAocGFydGlhbGx5Q29tcGxleEZsYWcpIHx8CisgICAgICAgIChwU3NjMS0+dHJlZUNvbmZpZyAhPSBwU3NjMi0+dHJlZUNvbmZpZykgfHwKKyAgICAgICAgKHBTc2MxLT5zYW1wbGluZ0ZyZXEgIT0gcFNzYzItPnNhbXBsaW5nRnJlcSkgfHwKKyAgICAgICAgKHBTc2MxLT5kZWNvcnJDb25maWcgIT0gcFNzYzItPmRlY29yckNvbmZpZykpIHsKKyAgICAgICpjdHJsRmxhZ3MgfD0gTVBFR1NfSU5JVF9TVEFURVNfREVDT1JSRUxBVE9SOworICAgIH0KKworICAgIC8qIEFuYWx5c2UgZWxlbWVudHMgZm9yIGluaXRpYWxpemF0aW9uIG9mIG0xIGFuZCBtMiBjYWxjdWxhdGlvbiAqLworICAgIGlmICgodXBtaXhUeXBlRmxhZykgfHwgKGJpbmF1cmFsUXVhbGl0eUZsYWcpIHx8CisgICAgICAgIChwU3NjMS0+dHJlZUNvbmZpZyAhPSBwU3NjMi0+dHJlZUNvbmZpZykgfHwKKyAgICAgICAgKHBTc2MxLT5zYW1wbGluZ0ZyZXEgIT0gcFNzYzItPnNhbXBsaW5nRnJlcSkpCisKKyAgICB7CisgICAgICAqY3RybEZsYWdzIHw9IE1QRUdTX0lOSVRfU1RBVEVTX00xTTI7CisgICAgfQorCisgICAgLyogQW5hbHlzZSBlbGVtZW50cyBmb3IgaW5pdGlhbGl6YXRpb24gb2YgR0VTICovCisgICAgaWYgKCh1cG1peFR5cGVGbGFnKSB8fCAocFNzYzEtPnRyZWVDb25maWcgIT0gcFNzYzItPnRyZWVDb25maWcpIHx8CisgICAgICAgIChwU3NjMS0+dGVtcFNoYXBlQ29uZmlnICE9IHBTc2MyLT50ZW1wU2hhcGVDb25maWcpKSB7CisgICAgICAqY3RybEZsYWdzIHw9IE1QRUdTX0lOSVRfU1RBVEVTX0dFUzsKKyAgICB9CisKKyAgICAvKiBBbmFseXNlIGVsZW1lbnRzIGZvciBpbml0aWFsaXphdGlvbiBvZiBGRHJldmVyYiAqLworICAgIGlmICgodXBtaXhUeXBlRmxhZykgfHwgKGJpbmF1cmFsUXVhbGl0eUZsYWcpIHx8IChwYXJ0aWFsbHlDb21wbGV4RmxhZykgfHwKKyAgICAgICAgKHBTc2MxLT5zYW1wbGluZ0ZyZXEgIT0gcFNzYzItPnNhbXBsaW5nRnJlcSkgfHwKKyAgICAgICAgKHBTc2MxLT5uVGltZVNsb3RzICE9IHBTc2MyLT5uVGltZVNsb3RzKSkgeworICAgICAgKmN0cmxGbGFncyB8PSBNUEVHU19JTklUX1NUQVRFU19SRVZFUkI7CisgICAgfQorCisgICAgLyogUmVzZXQgcHJldmlvdXMgZnJhbWUgZGF0YSB3aGVuZXZlciB0aGUgY29uZmlnIGNoYW5nZXMgKi8KKyAgICBpZiAoKmN0cmxGbGFncyAmIE1QRUdTX0lOSVRfQ09ORklHKSB7CisgICAgICAqY3RybEZsYWdzIHw9IE1QRUdTX0lOSVRfU1RBVEVTX1BBUkFNOworICAgIH0KKyAgfQorCisgIHJldHVybiBNUFNfT0s7Cit9CisKKy8qKgorICogXGJyaWVmIFJlc2V0IE1QRUcgU3Vycm91bmQgc3RhdHVzIGluZm8KKyAqKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZU1wZWdTdXJyb3VuZERlY29kZXJTdGF0dXMoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLCBpbnQgaW5pdEZsYWdzLAorICAgIE1QRUdTX1NZTkNTVEFURSBmT25TeW5jLCBNUEVHU19BTkNTVEFSVFNUT1AgYW5jU3RhcnRTdG9wUHJldikgeworICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSB8PQorICAgICAgaW5pdEZsYWdzOworICBpZiAoKHBNcGVnU3Vycm91bmREZWNvZGVyLT5tcGVnU3Vycm91bmRTc2NJc0dsb2JhbENmZyAhPSAwKSAmJgorICAgICAgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5mT25TeW5jW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSA+PQorICAgICAgIE1QRUdTX1NZTkNfRk9VTkQpICYmCisgICAgICAoZk9uU3luYyA8IE1QRUdTX1NZTkNfRk9VTkQpKSB7CisgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmZPblN5bmNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdID0KKyAgICAgICAgTVBFR1NfU1lOQ19GT1VORDsKKyAgfSBlbHNlIHsKKyAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+Zk9uU3luY1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gPQorICAgICAgICBmT25TeW5jOworICB9CisgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5hbmNTdGFydFN0b3BQcmV2ID0gYW5jU3RhcnRTdG9wUHJldjsKK30KKworc3RhdGljIFNBQ0RFQ19FUlJPUiBtcGVnU3Vycm91bmREZWNvZGVyX0NyZWF0ZSgKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKnBNcGVnU3Vycm91bmREZWNvZGVyLCBpbnQgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgSEFORExFX0ZES19RTUZfRE9NQUlOIHBRbWZEb21haW4pOworCitTQUNfSU5TVEFOQ0VfQVZBSUwKK21wZWdTdXJyb3VuZERlY29kZXJfSXNGdWxsTXBlZ1N1cnJvdW5kRGVjb2Rlckluc3RhbmNlQXZhaWxhYmxlKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlcikgeworICBTQUNfSU5TVEFOQ0VfQVZBSUwgaW5zdGFuY2VBdmFpbGFibGUgPSBTQUNfSU5TVEFOQ0VfTk9UX0ZVTExfQVZBSUxBQkxFOworCisgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMgIT0gTlVMTCkgeworICAgIGluc3RhbmNlQXZhaWxhYmxlID0gU0FDX0lOU1RBTkNFX0ZVTExfQVZBSUxBQkxFOworICB9CisKKyAgcmV0dXJuIGluc3RhbmNlQXZhaWxhYmxlOworfQorCitTQUNERUNfRVJST1IgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9PcGVuKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICoqcE1wZWdTdXJyb3VuZERlY29kZXIsIGludCBzdGVyZW9Db25maWdJbmRleCwKKyAgICBIQU5ETEVfRkRLX1FNRl9ET01BSU4gcFFtZkRvbWFpbikgeworICBTQUNERUNfRVJST1IgZXJyb3I7CisKKyAgZXJyb3IgPSBtcGVnU3Vycm91bmREZWNvZGVyX0NyZWF0ZShwTXBlZ1N1cnJvdW5kRGVjb2Rlciwgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkRvbWFpbik7CisKKyAgcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIFxicmllZiAgUmVuYW1lZCBmdW5jdGlvbiBmcm9tIGdldFVwbWl4VHlwZSB0byBjaGVja19VUGFyYW1fQnVpbGRfRGVjQ29uZmlnLgorICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB1c2VyIHBhcmFtcywgZGVjb2RlciBjb25maWcgYW5kIFNTQyBhcmUgdmFsaWQKKyAqICAgICAgICAgYW5kIGlmIHRoZSBkZWNvZGVyIGJ1aWxkIGNhbiBoYW5kbGUgYWxsIHRoaXMgc2V0dGluZ3MuCisgKiAgICAgICAgIFRoZSB1cG1peCB0eXBlIG1heSBiZSBtb2RpZmllZCBieSB0aGlzIGZ1bmN0aW9uLgorICogICAgICAgICBJdCBpcyBjYWxsZWQgaW4gaW5pdE1wZWdTdXJyb3VuZERlY29kZXIoKSBhZnRlciB0aGUgc3NjIHBhcnNlIGNoZWNrLAorICogICAgICAgICB0byBoYXZlIGFsbCBjaGVja3MgaW4gb25lIHBsYWNlIGFuZCB0byBlbnN1cmUgdGhlc2UgY2hlY2tzIGFyZSBhbHdheXMKKyAqICAgICAgICAgcGVyZm9ybWVkIGlmIGNvbmZpZyBjaGFuZ2VzIChpbmJhbmQgYW5kIG91dC1vZi1iYW5kKS4KKyAqCisgKiBccGFyYW0gcFVzZXJQYXJhbXMgIFVzZXIgZGF0YSBoYW5kbGUuCisgKiBccGFyYW0gcERlY0NvbmZpZyAgIGRlY29kZXIgY29uZmlnIGhhbmRsZS4KKyAqIFxwYXJhbSBwU3NjICAgICAgICAgc3BhdGlhbCBzcGVjaWZpYyBjb25maWcgaGFuZGxlLgorICogXHBhcmFtIHBVcG1peFR5cGUgICB1cG1peCB0eXBlIHdoaWNoIGlzIHNldCBieSB0aGlzIGZ1bmN0aW9uCisgKgorICogXHJldHVybiAgTVBTX09LIG9uIHN1Y2VzcywgYW5kIGVsc2Ugb24gZmFpbHVyZS4KKyAqLworc3RhdGljIFNBQ0RFQ19FUlJPUiBjaGVja19VUGFyYW1fQnVpbGRfRGVjQ29uZmlnKAorICAgIFNQQVRJQUxERUNfUEFSQU0gY29uc3QgKnBVc2VyUGFyYW1zLCBTUEFUSUFMX0RFQ19DT05GSUcgY29uc3QgKnBEZWNDb25maWcsCisgICAgY29uc3QgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTc2MsIFNQQVRJQUxfREVDX1VQTUlYX1RZUEUgKnBVcG1peFR5cGUpIHsKKyAgaW50IGRteENoYW5uZWxzLCBvdXRDaGFubmVscywgbWF4TnVtT3V0Q2hhbm5lbHM7CisKKyAgRkRLX0FTU0VSVChwVXNlclBhcmFtcyAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwVXBtaXhUeXBlICE9IE5VTEwpOworCisgIC8qIGNoZWNrcyBpZiBpbXBsZW1lbnRhdGlvbiBjYW4gaGFuZGxlIHRoZSBTc2MgKi8KKworICBzd2l0Y2ggKHBTc2MtPnRyZWVDb25maWcpIHsKKyAgICBjYXNlIFNQQVRJQUxERUNfTU9ERV9SU1ZENzogLyogMjEyICovCisgICAgICBkbXhDaGFubmVscyA9IDE7CisgICAgICBvdXRDaGFubmVscyA9IDI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE1QU19VTlNVUFBPUlRFRF9DT05GSUc7CisgIH0KKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgLyogQW5hbHlzZSBwRGVjQ29uZmlnIHBhcmFtcyAqLworICBzd2l0Y2ggKHBEZWNDb25maWctPmJpbmF1cmFsTW9kZSkgeworICAgIGNhc2UgQklOQVVSQUxfTk9ORToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTVBTX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgfQorCisgIHN3aXRjaCAocERlY0NvbmZpZy0+ZGVjb2Rlck1vZGUpIHsKKyAgICBjYXNlIEVYVF9IUV9PTkxZOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBNUFNfVU5TVVBQT1JURURfQ09ORklHOworICB9CisKKyAgc3dpdGNoIChwRGVjQ29uZmlnLT5tYXhOdW1PdXRwdXRDaGFubmVscykgeworICAgIGNhc2UgT1VUUFVUX0NIQU5ORUxTX0RFRkFVTFQ6CisgICAgICAvKiBObyBzcGVjaWFsIHJlc3RyaWN0aW9ucyAtPiBHZXQgdGhlIGxldmVsIHJlc3RyaWN0aW9uOiAqLworICAgICAgc3dpdGNoIChwRGVjQ29uZmlnLT5kZWNvZGVyTGV2ZWwpIHsKKyAgICAgICAgY2FzZSBERUNPREVSX0xFVkVMXzA6CisgICAgICAgICAgbWF4TnVtT3V0Q2hhbm5lbHMgPSAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBNUFNfVU5TVVBQT1JURURfQ09ORklHOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBPVVRQVVRfQ0hBTk5FTFNfMl8wOgorICAgICAgbWF4TnVtT3V0Q2hhbm5lbHMgPSAyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBNUFNfVU5TVVBQT1JURURfQ09ORklHOworICB9CisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAvKiBjaGVjayBpZiB3ZSBjYW4gaGFuZGxlIHVzZXIgcGFyYW1zICovCisgIGlmIChwVXNlclBhcmFtcy0+YmxpbmRFbmFibGUgPT0gMSkgeworICAgIHJldHVybiBNUFNfVU5TVVBQT1JURURfQ09ORklHOworICB9CisgIHsKKyAgICBzd2l0Y2ggKChTQUNfREVDX09VVFBVVF9NT0RFKXBVc2VyUGFyYW1zLT5vdXRwdXRNb2RlKSB7CisgICAgICBjYXNlIFNBQ0RFQ19PVVRfTU9ERV9OT1JNQUw6CisgICAgICAgIGlmIChtYXhOdW1PdXRDaGFubmVscyA+PSBvdXRDaGFubmVscykgeworICAgICAgICAgICpwVXBtaXhUeXBlID0gVVBNSVhfVFlQRV9OT1JNQUw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgeyAqcFVwbWl4VHlwZSA9IFVQTUlYX1RZUEVfQllQQVNTOyB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNBQ0RFQ19PVVRfTU9ERV9TVEVSRU86CisgICAgICAgIGlmIChkbXhDaGFubmVscyA9PSAxKSB7CisgICAgICAgICAgaWYgKG91dENoYW5uZWxzID09IDIpIHsKKyAgICAgICAgICAgICpwVXBtaXhUeXBlID0gVVBNSVhfVFlQRV9OT1JNQUw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpwVXBtaXhUeXBlID0gVVBNSVhfVFlQRV9CWVBBU1M7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNBQ0RFQ19PVVRfTU9ERV82Q0hBTk5FTDoKKyAgICAgICAgaWYgKG91dENoYW5uZWxzID4gNikgeworICAgICAgICAgIHsgKnBVcG1peFR5cGUgPSBVUE1JWF9UWVBFX0JZUEFTUzsgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpwVXBtaXhUeXBlID0gVVBNSVhfVFlQRV9OT1JNQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTVBTX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICB9CisgIH0KKworICByZXR1cm4gTVBTX09LOworfQorCisvKioKKyAqIFxicmllZiBJbml0IE1QRUcgU3Vycm91bmQgZGVjb2Rlci4KKyAqKi8KK3N0YXRpYyBTQUNERUNfRVJST1IgaW5pdE1wZWdTdXJyb3VuZERlY29kZXIoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnI7CisgIGludCBpbml0RmxhZ3MgPSBNUEVHU19JTklUX05PTkUsIGluaXRGbGFnc0RlYzsKKyAgaW50IHVwbWl4VHlwZUN1cnIgPSBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+dXBtaXhUeXBlOworCisgIEZES19BU1NFUlQocE1wZWdTdXJyb3VuZERlY29kZXIgIT0gTlVMTCk7CisKKyAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKmNvbnN0IHBTU0NpbnB1dCA9CisgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cDsKKyAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKmNvbnN0IHBTU0N0YXJnZXQgPQorICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgIC0+c3BhdGlhbFNwZWNpZmljQ29uZmlnW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXTsKKyAgaW5pdEZsYWdzRGVjID0KKyAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdOworCisgIGlmIChwU1NDaW5wdXQtPmNvcmVDb2RlYyAhPSBBT1RfVVNBQykgeworICAgIC8qIGhlcmUgd2UgY2hlY2sgaWYgd2UgaGF2ZSBhIHZhbGlkIFNzYyAqLworICAgIGVyciA9IHNzY1BhcnNlQ2hlY2socFNTQ2lucHV0KTsKKyAgICBpZiAoZXJyICE9IE1QU19PSykgZ290byBiYWlsOworICB9CisKKyAgLyogaGVyZSB3ZSBjaGVjayBpZiBTc2MgbWF0Y2hlcyBidWlsZDsgYWxzbyBjaGVjayBVUGFyYW1zIGFuZCBEZWNDb25maWcgKi8KKyAgLyogaWYgZGVzaXJlZCB1cG1peFR5cGUgaXMgY2hhbmdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgZXJyID0gY2hlY2tfVVBhcmFtX0J1aWxkX0RlY0NvbmZpZygKKyAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBlZ1N1cnJvdW5kVXNlclBhcmFtcywKKyAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+ZGVjQ29uZmlnLCBwU1NDaW5wdXQsCisgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXItPnVwbWl4VHlwZSk7CisgIGlmIChlcnIgIT0gTVBTX09LKSBnb3RvIGJhaWw7CisKKyAgLyogaW5pdCBjb25maWcgKi8KKyAgaWYgKGluaXRGbGFnc0RlYyAmIE1QRUdTX0lOSVRfQ0hBTkdFX0hFQURFUikgeworICAgIGluaXRGbGFncyB8PSBNUEVHU19JTklUX0NPTkZJRzsKKyAgfQorICAvKiBpbml0IGFsbCBzdGF0ZXMgKi8KKyAgaWYgKGluaXRGbGFnc0RlYyAmIE1QRUdTX0lOSVRfQ0xFQVJfSElTVE9SWSkgeworICAgIGluaXRGbGFncyB8PSBNQVNLX01QRUdTX0lOSVRfQUxMX1NUQVRFUzsKKyAgfQorICBpZiAoaW5pdEZsYWdzRGVjICYgTVBFR1NfSU5JVF9DSEFOR0VfQ09OQ0VBTF9QQVJBTVMpIHsKKyAgICBpbml0RmxhZ3MgfD0gTVBFR1NfSU5JVF9QQVJBTVNfRVJST1JfQ09OQ0VBTE1FTlQ7CisgIH0KKworICBpZiAoaW5pdEZsYWdzRGVjICYgTVBFR1NfSU5JVF9FTkZPUkNFX1JFSU5JVCkgeworICAgIC8qIGluaXQgYWxsIHN0YXRlcyAqLworICAgIGluaXRGbGFncyB8PSBNQVNLX01QRUdTX0lOSVRfQUxMX1NUQVRFUzsKKyAgICBpbml0RmxhZ3MgfD0gTUFTS19NUEVHU19JTklUX0FMTF9QQVJBTVM7CisgIH0gZWxzZSB7CisgICAgLyogYW5hbHlzZSBzdGF0ZXMgd2hpY2ggaGF2ZSB0byBiZSBpbml0aWFsaXplZCAqLworICAgIG1wZWdTdXJyb3VuZERlY29kZXJfQ2FsY0luaXRGbGFncygKKyAgICAgICAgcFNTQ3RhcmdldCwgcFNTQ2lucHV0LAorICAgICAgICAodXBtaXhUeXBlQ3VyciAhPQorICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnVwbWl4VHlwZSksIC8qIHVwbWl4VHlwZSBjaGFuZ2VkICovCisgICAgICAgIDAsIChpbml0RmxhZ3NEZWMgJiBNUEVHU19JTklUX0NIQU5HRV9QQVJUSUFMTFlfQ09NUExFWCkgPyAxIDogMCwKKyAgICAgICAgJmluaXRGbGFncyk7CisgIH0KKworICB7CisgICAgaW50IG5yT2ZRbWZCYW5kczsKKyAgICBGREttZW1jcHkocFNTQ3RhcmdldCwgcFNTQ2lucHV0LCBzaXplb2YoU1BBVElBTF9TUEVDSUZJQ19DT05GSUcpKTsKKworICAgIG5yT2ZRbWZCYW5kcyA9IG1wZWdTdXJyb3VuZERlY29kZXJfR2V0TnJPZlFtZkJhbmRzKAorICAgICAgICBwU1NDdGFyZ2V0LCBwU1NDdGFyZ2V0LT5zYW1wbGluZ0ZyZXEpOworICAgIGVyciA9IEZES19TcGF0aWFsRGVjSW5pdCgKKyAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLAorICAgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSwKKyAgICAgICAgcFNTQ3RhcmdldCwgbnJPZlFtZkJhbmRzLCBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+dXBtaXhUeXBlLAorICAgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZFVzZXJQYXJhbXMsIGluaXRGbGFncyk7CisKKyAgICBpZiAoZXJyICE9IE1QU19PSykgZ290byBiYWlsOworCisgICAgLyogU2lnbmFsIHRoYXQgd2UgZ290IGEgaGVhZGVyIGFuZCBjYW4gZ28gb24gZGVjb2RpbmcgKi8KKyAgICBpZiAoZXJyID09IE1QU19PSykgeworICAgICAgaW5pdEZsYWdzRGVjID0gTVBFR1NfSU5JVF9PSzsKKyAgICAgIHsKKyAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmZPblN5bmNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdID0KKyAgICAgICAgICAgIE1QRUdTX1NZTkNfRk9VTkQ7CisgICAgICB9CisgICAgfQorICB9CisKK2JhaWw6CisgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdID0KKyAgICAgIGluaXRGbGFnc0RlYzsKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBcYnJpZWYgSW5pdCBNUEVHIFN1cnJvdW5kIGRlY29kZXIuCisgKiovCitTQUNERUNfRVJST1IgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9Jbml0KAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlcikgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworCisgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSkgeworICAgIGVyciA9IGluaXRNcGVnU3Vycm91bmREZWNvZGVyKHBNcGVnU3Vycm91bmREZWNvZGVyKTsKKyAgfQorICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIFxicmllZiBPcGVuIE1QRUcgU3Vycm91bmQgZGVjb2Rlci4KKyAqKi8KK3N0YXRpYyBTQUNERUNfRVJST1IgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9DcmVhdGUoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKipwTXBlZ1N1cnJvdW5kRGVjb2RlciwgaW50IHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgIEhBTkRMRV9GREtfUU1GX0RPTUFJTiBwUW1mRG9tYWluKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIENNcGVnU3Vycm91bmREZWNvZGVyICpzYWNEZWMgPSBOVUxMOworICBzcGF0aWFsRGVjICpzZWxmID0gTlVMTDsKKworICAvKiBkZWNvZGVyTGV2ZWwgIGRlY29kZXJNb2RlICBtYXhOdW1PdXRwdXRDaGFubmVscyAgYmluYXVyYWxNb2RlICovCisgIHN0YXRpYyBjb25zdCBTUEFUSUFMX0RFQ19DT05GSUcgZGVjQ29uZmlnID0geworICAgICAgKENGR19MRVZFTCkoMCksIEVYVF9IUV9PTkxZLCBPVVRQVVRfQ0hBTk5FTFNfREVGQVVMVCwgQklOQVVSQUxfTk9ORX07CisKKyAgaWYgKCpwTXBlZ1N1cnJvdW5kRGVjb2RlciA9PSBOVUxMKSB7CisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRCgqcE1wZWdTdXJyb3VuZERlY29kZXIsIDEsIENNcGVnU3Vycm91bmREZWNvZGVyKQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOyBpKyspIHsKKyAgICAgIGVyciA9IFNwYXRpYWxEZWNDcmVhdGVCc0ZyYW1lKCYoKnBNcGVnU3Vycm91bmREZWNvZGVyKS0+YnNGcmFtZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKCpwTXBlZ1N1cnJvdW5kRGVjb2RlciktPmxsU3RhdGUpOworICAgICAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICAgICAgc2FjRGVjID0gKnBNcGVnU3Vycm91bmREZWNvZGVyOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorICAgICgqcE1wZWdTdXJyb3VuZERlY29kZXIpLT5wUW1mRG9tYWluID0gcFFtZkRvbWFpbjsKKworICAgICgqcE1wZWdTdXJyb3VuZERlY29kZXIpLT5ic0ZyYW1lRGVsYXkgPSAxOworICAgICgqcE1wZWdTdXJyb3VuZERlY29kZXIpLT5ic0ZyYW1lUGFyc2UgPSAwOworICAgICgqcE1wZWdTdXJyb3VuZERlY29kZXIpLT5ic0ZyYW1lRGVjb2RlID0gMDsKKworICAgIHJldHVybiBlcnI7CisgIH0gZWxzZSB7CisgICAgc2FjRGVjID0gKnBNcGVnU3Vycm91bmREZWNvZGVyOworICB9CisKKyAgaWYgKHNhY0RlYy0+cFNwYXRpYWxEZWMgPT0gTlVMTCkgeworICAgIGlmICgoc2VsZiA9IEZES19TcGF0aWFsRGVjT3BlbigmZGVjQ29uZmlnLCBzdGVyZW9Db25maWdJbmRleCkpID09IE5VTEwpIHsKKyAgICAgIGVyciA9IE1QU19PVVRPRk1FTU9SWTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc2VsZiA9IHNhY0RlYy0+cFNwYXRpYWxEZWM7CisgIH0KKworICBzZWxmLT5wUW1mRG9tYWluID0gc2FjRGVjLT5wUW1mRG9tYWluOworCisgIHNhY0RlYy0+cFNwYXRpYWxEZWMgPSBzZWxmOworCisgIC8qIGRlZmF1bHQgcGFyYW1ldGVyIHNldCAqLworICBzYWNEZWMtPm1wZWdTdXJyb3VuZFVzZXJQYXJhbXMub3V0cHV0TW9kZSA9IFNBQ0RFQ19PVVRfTU9ERV9OT1JNQUw7CisgIHNhY0RlYy0+bXBlZ1N1cnJvdW5kVXNlclBhcmFtcy5ibGluZEVuYWJsZSA9IDA7CisgIHNhY0RlYy0+bXBlZ1N1cnJvdW5kVXNlclBhcmFtcy5ieXBhc3NNb2RlID0gMDsKKyAgc2FjRGVjLT5tcGVnU3Vycm91bmRVc2VyUGFyYW1zLmNvbmNlYWxNZXRob2QgPSAxOworICBzYWNEZWMtPm1wZWdTdXJyb3VuZFVzZXJQYXJhbXMuY29uY2VhbE51bUtlZXBGcmFtZXMgPSAxMDsKKyAgc2FjRGVjLT5tcGVnU3Vycm91bmRVc2VyUGFyYW1zLmNvbmNlYWxGYWRlT3V0U2xvcGVMZW5ndGggPSA1OworICBzYWNEZWMtPm1wZWdTdXJyb3VuZFVzZXJQYXJhbXMuY29uY2VhbEZhZGVJblNsb3BlTGVuZ3RoID0gNTsKKyAgc2FjRGVjLT5tcGVnU3Vycm91bmRVc2VyUGFyYW1zLmNvbmNlYWxOdW1SZWxlYXNlRnJhbWVzID0gMzsKKyAgc2FjRGVjLT5tcGVnU3Vycm91bmRTc2NJc0dsb2JhbENmZyA9IDA7CisgIHNhY0RlYy0+bXBlZ1N1cnJvdW5kVXNlVGltZUludGVyZmFjZSA9IDE7CisgIHNhY0RlYy0+bXBlZ1N1cnJvdW5kRGVjb2RlckxldmVsID0gZGVjQ29uZmlnLmRlY29kZXJMZXZlbDsKKworICBzYWNEZWMtPnVwbWl4VHlwZSA9IFVQTUlYX1RZUEVfTk9STUFMOworCisgIC8qIHNpZ25hbGl6ZSBzcGF0aWFsIGRlY29kZXIgcmUtaW5pdGFsaXphdGlvbiAqLworICB1cGRhdGVNcGVnU3Vycm91bmREZWNvZGVyU3RhdHVzKHNhY0RlYywgTVBFR1NfSU5JVF9FTkZPUkNFX1JFSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19TWU5DX0xPU1QsIE1QRUdTX1NUT1ApOworCisgIC8qIHJldHVybiBkZWNvZGVyIGluc3RhbmNlICovCisgICpwTXBlZ1N1cnJvdW5kRGVjb2RlciA9IHNhY0RlYzsKKyAgc2FjRGVjLT5kZWNDb25maWcgPSBkZWNDb25maWc7CisKKyAgU3BhdGlhbERlY0luaXRQYXJzZXJDb250ZXh0KHNhY0RlYy0+cFNwYXRpYWxEZWMpOworCisgIHJldHVybiBlcnI7CisKK2JhaWw6CisgIGlmIChzYWNEZWMgIT0gTlVMTCkgeworICAgIG1wZWdTdXJyb3VuZERlY29kZXJfQ2xvc2Uoc2FjRGVjKTsKKyAgfQorICAqcE1wZWdTdXJyb3VuZERlY29kZXIgPSBOVUxMOworICBpZiAoZXJyID09IE1QU19PSykgeworICAgIHJldHVybiBNUFNfT1VUT0ZNRU1PUlk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGVycjsKKyAgfQorfQorCisvKioKKyAqIFxicmllZiBDb25maWcgTVBFRyBTdXJyb3VuZCBkZWNvZGVyLgorICoqLworU0FDREVDX0VSUk9SIG1wZWdTdXJyb3VuZERlY29kZXJfQ29uZmlnKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywgSU5UIHNhbXBsaW5nUmF0ZSwgSU5UIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgIElOVCBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCwgSU5UIGNvbmZpZ0J5dGVzLCBjb25zdCBVQ0hBUiBjb25maWdNb2RlLAorICAgIFVDSEFSICpjb25maWdDaGFuZ2VkKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHIHNwYXRpYWxTcGVjaWZpY0NvbmZpZzsKKworICBzd2l0Y2ggKGNvcmVDb2RlYykgeworICAgIGNhc2UgQU9UX0RSTV9VU0FDOgorICAgIGNhc2UgQU9UX1VTQUM6CisgICAgICBpZiAoY29uZmlnTW9kZSA9PSBBQ19DTV9ERVRfQ0ZHX0NIQU5HRSkgeworICAgICAgICAvKiBJbiBjb25maWcgZGV0ZWN0aW9uIG1vZGUgd3JpdGUgc3BhdGlhbCBzcGVjaWZpYyBjb25maWcgcGFyYW1ldGVycworICAgICAgICAgKiBpbnRvIHRlbXBvcmFyaWx5IGFsbG9jYXRlZCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgZXJyID0gU3BhdGlhbERlY1BhcnNlTXBzMjEyQ29uZmlnKAorICAgICAgICAgICAgaEJzLCAmc3BhdGlhbFNwZWNpZmljQ29uZmlnLCBzYW1wbGluZ1JhdGUsIGNvcmVDb2RlYywKKyAgICAgICAgICAgIHN0ZXJlb0NvbmZpZ0luZGV4LCBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBTcGF0aWFsRGVjUGFyc2VNcHMyMTJDb25maWcoCisgICAgICAgICAgICBoQnMsICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLAorICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBjb3JlQ29kZWMsIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgICAgICAgICAgY29yZVNickZyYW1lTGVuZ3RoSW5kZXgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICBpZiAoY29uZmlnTW9kZSA9PSBBQ19DTV9ERVRfQ0ZHX0NIQU5HRSkgeworICAgICAgICAvKiBJbiBjb25maWcgZGV0ZWN0aW9uIG1vZGUgd3JpdGUgc3BhdGlhbCBzcGVjaWZpYyBjb25maWcgcGFyYW1ldGVycworICAgICAgICAgKiBpbnRvIHRlbXBvcmFyaWx5IGFsbG9jYXRlZCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgZXJyID0gU3BhdGlhbERlY1BhcnNlU3BlY2lmaWNDb25maWcoaEJzLCAmc3BhdGlhbFNwZWNpZmljQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdCeXRlcywgY29yZUNvZGVjKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IFNwYXRpYWxEZWNQYXJzZVNwZWNpZmljQ29uZmlnKAorICAgICAgICAgICAgaEJzLCAmcE1wZWdTdXJyb3VuZERlY29kZXItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cCwKKyAgICAgICAgICAgIGNvbmZpZ0J5dGVzLCBjb3JlQ29kZWMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVyciA9IE1QU19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9ERVRfQ0ZHX0NIQU5HRSkgeworICAgIHJldHVybiBlcnI7CisgIH0KKworICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0FMTE9DX01FTSkgeworICAgIGlmICgqY29uZmlnQ2hhbmdlZCkgeworICAgICAgaWYgKChlcnIgPSBtcGVnU3Vycm91bmREZWNvZGVyX09wZW4oJnBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvQ29uZmlnSW5kZXgsIE5VTEwpKSkgeworICAgICAgICByZXR1cm4gZXJyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHsKKyAgICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqc3NjUGFyc2UgPQorICAgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXIKKyAgICAgICAgICAgICAtPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXTsKKworICAgIGlmIChGREtfU3BhdGlhbERlY0NvbXBhcmVTcGF0aWFsU3BlY2lmaWNDb25maWdIZWFkZXIoCisgICAgICAgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cCwgc3NjUGFyc2UpKSB7CisgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lUGFyc2VdIHw9CisgICAgICAgICAgTVBFR1NfSU5JVF9DSEFOR0VfSEVBREVSOworICAgICAgLyogRXJyb3IgcmVzaWxpZW5jZSBjb2RlICovCisgICAgICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjID09IE5VTEwpIHsKKyAgICAgICAgZXJyID0gTVBTX05PVE9LOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBTcGF0aWFsRGVjSW5pdFBhcnNlckNvbnRleHQocE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjKTsKKyAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYy0+cENvbmZpZ0N1cnJlbnQgPQorICAgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2RlcgorICAgICAgICAgICAgICAgLT5zcGF0aWFsU3BlY2lmaWNDb25maWdbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdOworICAgIH0KKyAgfQorCisgIGlmIChlcnIgPT0gTVBTX09LKSB7CisgICAgLyogV2UgZ290IGEgdmFsaWQgb3V0LW9mLWJhbmQgY29uZmlndXJhdGlvbiBzbyBsYWJlbCBpdCBhY2NvcmRpbmdseS4gKi8KKyAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBlZ1N1cnJvdW5kU3NjSXNHbG9iYWxDZmcgPSAxOworICB9CisKK2JhaWw6CisgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICogXGJyaWVmIERldGVybWluZSBNUEVHIFN1cnJvdW5kIG9wZXJhdGlvbiBtb2RlLgorICoqLworc3RhdGljIE1QRUdTX09QTU9ERSBtcGVnU3Vycm91bmRPcGVyYXRpb25Nb2RlKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwgaW50IG1wc0RhdGFCaXRzKSB7CisgIE1QRUdTX09QTU9ERSBtb2RlOworCisgIHsKKyAgICBpZiAoKG1wc0RhdGFCaXRzID4gMCkgJiYKKyAgICAgICAgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5tcGVnU3Vycm91bmRVc2VyUGFyYW1zLmJsaW5kRW5hYmxlID09IDApKSB7CisgICAgICBtb2RlID0gTVBFR1NfT1BNT0RFX01QU19QQVlMT0FEOyAvKiBNb2RlOiBOb3JtYWwsIFN0ZXJlbyBvciBCaW5hdXJhbCAqLworICAgIH0gZWxzZSB7CisgICAgICBtb2RlID0gTVBFR1NfT1BNT0RFX05PX01QU19QQVlMT0FEOyAvKiBNb2RlOiBObyBNUEVHIFN1cnJvdW5kIFBheWxvYWQgKi8KKyAgICAgIHVwZGF0ZU1wZWdTdXJyb3VuZERlY29kZXJTdGF0dXMocE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUdTX0lOSVRfRVJST1JfUEFZTE9BRCwgTVBFR1NfU1lOQ19MT1NULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19TVE9QKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gKG1vZGUpOworfQorCisvKioKKyAqIFxicmllZiAgQ2hlY2sgc3NjIGZvciBwYXJzZSBlcnJvcnMuCisgKiAgICAgICAgIFRoaXMgb25lIGlzIGNhbGxlZCBpbiBpbml0TXBlZ1N1cnJvdW5kRGVjb2RlcigpCisgKiAgICAgICAgIHRvIGVuc3VyZSBjaGVja2luZyBvZiBpbmJhbmQgYW5kIG91dC1vZi1iYW5kIG1wcyBjb25maWdzLgorICogICAgICAgICBPbmx5IHBhcnNlIGVycm9ycyBjaGVja2VkIGhlcmUhIENoZWNrIGZvciB2YWxpZCBjb25maWcgaXMgZG9uZQorICogICAgICAgICBpbiBjaGVja19VUGFyYW1fQnVpbGRfRGVjQ29uZmlnKCkhCisgKgorICogXHBhcmFtIHBTc2MgICAgICAgICBzcGF0aWFsIHNwZWNpZmljIGNvbmZpZyBoYW5kbGUuCisgKgorICogXHJldHVybiAgTVBTX09LIG9uIHN1Y2VzcywgYW5kIGVsc2Ugb24gcGFyc2UgZXJyb3IuCisgKi8KK3N0YXRpYyBTQUNERUNfRVJST1Igc3NjUGFyc2VDaGVjayhjb25zdCBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNzYykgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworCisgIGlmIChwU3NjLT5zYW1wbGluZ0ZyZXEgPiA5NjAwMCkgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKyAgaWYgKHBTc2MtPnNhbXBsaW5nRnJlcSA8IDgwMDApIHJldHVybiBNUFNfUEFSU0VfRVJST1I7CisKKyAgc3dpdGNoIChwU3NjLT5mcmVxUmVzKSB7CisgICAgY2FzZSBTUEFUSUFMREVDX0ZSRVFfUkVTXzI4OgorICAgIGNhc2UgU1BBVElBTERFQ19GUkVRX1JFU18yMDoKKyAgICBjYXNlIFNQQVRJQUxERUNfRlJFUV9SRVNfMTQ6CisgICAgY2FzZSBTUEFUSUFMREVDX0ZSRVFfUkVTXzEwOgorICAgIGNhc2UgU1BBVElBTERFQ19GUkVRX1JFU18yMzoKKyAgICBjYXNlIFNQQVRJQUxERUNfRlJFUV9SRVNfMTU6CisgICAgY2FzZSBTUEFUSUFMREVDX0ZSRVFfUkVTXzEyOgorICAgIGNhc2UgU1BBVElBTERFQ19GUkVRX1JFU185OgorICAgIGNhc2UgU1BBVElBTERFQ19GUkVRX1JFU183OgorICAgIGNhc2UgU1BBVElBTERFQ19GUkVRX1JFU181OgorICAgIGNhc2UgU1BBVElBTERFQ19GUkVRX1JFU180OgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTUEFUSUFMREVDX0ZSRVFfUkVTXzQwOiAvKiA0MCBkb2Vzbid0IGV4aXN0IGluIElTTy9JRUMgMjMwMDMtMSAqLworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOworICB9CisKKyAgaWYgKChwU3NjLT50cmVlQ29uZmlnIDwgMCkgfHwgKHBTc2MtPnRyZWVDb25maWcgPiA3KSkgeworICAgIHJldHVybiBNUFNfUEFSU0VfRVJST1I7CisgIH0KKworICBpZiAoKHBTc2MtPnF1YW50TW9kZSA8IDApIHx8IChwU3NjLT5xdWFudE1vZGUgPiAyKSkgeworICAgIHJldHVybiBNUFNfUEFSU0VfRVJST1I7CisgIH0KKworICBpZiAocFNzYy0+dGVtcFNoYXBlQ29uZmlnID09IDMpIHsKKyAgICByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOworICB9CisKKyAgaWYgKHBTc2MtPmRlY29yckNvbmZpZyA9PSAzKSB7CisgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKyAgfQorCisgIC8qIG5vdyB3ZSBhcmUgc3VyZSB0aGVyZSB3ZXJlIG5vIHBhcnNpbmcgZXJyb3JzICovCisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBcYnJpZWYgIENoZWNrIG51bWJlciBvZiB0aW1lIHNsb3RzCisgKgorICogQmFzaWNhbGx5IHRoZSBtcHMgZnJhbWUgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY29yZSBjb2RlciBmcmFtZQorICogbGVuZ3RoLiBUaGUgYmVsb3cgdGFibGUgc2hvd3MgYWxsIHZhbGlkIGNvbmZpZ3VyYXRpb25zIGluIGRldGFpbC4gU2VlIElTTy9JRUMKKyAqIDIzMDAzLTE6ICJUYWJsZSA0QSAtIEFsbG93ZWQgdmFsdWVzIGZvciBic0ZyYW1lTGVuZ3RoIGluIHRoZSBCYXNlbGluZSBNUEVHCisgKiBTdXJyb3VuZCBQcm9maWxlIgorICoKKyAqIERvd25taXggQ29kZXIgICAgICAgIERvd25taXggQ29kZSAgICAgIEFsbG93ZWQgdmFsdWVzIGZvciBic0ZyYW1lTGVuZ3RoCisgKiBBbGxvd2VkIGZyYW1lIHNpemVzIGZvciBub3JtYWwsIGRvd25zYW1wbGVkIGFuZCB1cHNhbXBsZWQgTVBTIEZyYW1lbGVuZ3RoCisgKiAgICAgICAgICAgICAgICAgICAgICAoUU1GIFNhbXBsZXMpCisgKgorICogQUFDIDEwMjQgICAgICAgICAgICAgICAgICAxNiAgICAgICAgICAgMTUsIDMxLCA0NywgNjMgMTAyNCAgMjA0OCAgMzA3MiAgNDA5NgorICogZG93bnNhbXBsZWQgTVBTICAgICAgICAgICAzMiAgICAgICAgICAgMzEsIDYzIDEwMjQgIDIwNDggdXBzYW1wbGVkIE1QUworICogOCAgICAgICAgICAgIDcsIDE1LCAyMywgMzEsIDM5LCA0NywgNTUsIDYzLCA3MSAgICAxMDI0ICAyMDQ4ICAzMDcyICA0MDk2CisgKiA1MTIwICA2MTQ0ICA3MTY4ICA4MTkyICA5MjE2CisgKgorICogQUFDIDk2MCAgICAgICAgICAgICAgICAgICAxNSAgICAgICAgICAgMTQsIDI5LCA0NCwgNTkgOTYwICAxOTIwICAyODgwICAzODQwCisgKiBkb3duc2FtcGxlZCBNUFMgICAgICAgICAgIDMwICAgICAgICAgICAyOSwgNTkgOTYwICAxOTIwIHVwc2FtcGxlZCBNUFMKKyAqIDcsNSAgICAgICAgICAgMTQsIDI5LCA0NCwgNTkgICAgICAgICAgICAgICAgICAgICAgICAxOTIwICAzODQwICA1NzYwICA3NjgwCisgKgorICogSEUtQUFDIDEwMjQvMjA0OCAgICAgICAgICAzMiAgICAgICAgICAgMzEsIDYzIDIwNDggIDQwOTYgZG93bnNhbXBsZWQgTVBTCisgKiA2NCAgICAgICAgICAgNjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4IHVwc2FtcGxlZCBNUFMKKyAqIDE2ICAgICAgICAgICAxNSwgMzEsIDQ3LCA2MyAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggIDQwOTYgIDYxNDQgIDgxOTIKKyAqCisgKiBIRS1BQUMgOTYwLzE5MjAgICAgICAgICAgIDMwICAgICAgICAgICAyOSwgNTkgMTkyMCAgMzg0MCBkb3duc2FtcGxlZCBNUFMKKyAqIDYwICAgICAgICAgICA1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAgdXBzYW1wbGVkIE1QUworICogMTUgICAgICAgICAgIDE0LCAyOSwgNDQsIDU5ICAgICAgICAgICAgICAgICAgICAgICAgMTkyMCAgMzg0MCAgNTc2MCAgNzY4MAorICoKKyAqIEJTQUMgICAgICAgICAgICAgICAgICAgICAgMTYgICAgICAgICAgIDE1LCAzMSwgNDcsIDYzIDEwMjQgIDIwNDggIDMwNzIgIDQwOTYKKyAqIGRvd25zYW1wbGVkIE1QUyAgICAgICAgICAgMzIgICAgICAgICAgIDMxLCA2MyAxMDI0ICAyMDQ4IHVwc2FtcGxlZCBNUFMKKyAqIDggICAgICAgICAgICA3LCAxNSwgMjMsIDMxLCAzOSwgNDcsIDU1LCA2MywgNzEgICAgMTAyNCAgMjA0OCAgMzA3MiAgNDA5NgorICogNTEyMCAgNjE0NCAgNzE2OCAgODE5MiAgOTIxNgorICoKKyAqIEJTQUMgd2l0aCBTQlIgICAgICAgICAgICAgMzIgICAgICAgICAgIDMxLCA2MyAyMDQ4ICA0MDk2IGRvd25zYW1wbGVkIE1QUworICogNjQgICAgICAgICAgIDYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCB1cHNhbXBsZWQgTVBTCisgKiAxNiAgICAgICAgICAgMTUsIDMxLCA0NywgNjMgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICA0MDk2ICA2MTQ0ICA4MTkyCisgKgorICogQUFDIExEIDUxMiAgICAgICAgICAgICAgICAgOCAgICAgICAgICAgIDcsIDE1LCAyMywgMzEsIDM5LCA0NywgNTUsIDYzLCA3MQorICogNTEyICAxMDI0ICAxNTM2ICAyMDQ4ICAyNTYwICAzMDcyICAzNTg0ICA0MDk2ICA0NjA4IGRvd25zYW1wbGVkIE1QUworICogMTYgICAgICAgICAgIDE1LCAzMSwgNDcsIDYzICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiAgMTAyNCAgMTUzNiAgMjA0OAorICoKKyAqIEFBQyBFTEQgNTEyICAgICAgICAgICAgICAgIDggICAgICAgICAgICA3LCAxNSwgMjMsIDMxLCAzOSwgNDcsIDU1LCA2MywgNzEKKyAqIDUxMiAgMTAyNCAgMTUzNiAgMjA0OCAgMjU2MCAgMzA3MiAgMzU4NCAgNDA5NiAgNDYwOCBkb3duc2FtcGxlZCBNUFMKKyAqIDE2ICAgICAgICAgICAxNSwgMzEsIDQ3LCA2MyAgICAgICAgICAgICAgICAgICAgICAgICA1MTIgIDEwMjQgIDE1MzYgIDIwNDgKKyAqCisgKiBBQUMgRUxEIHdpdGggU0JSIDUxMi8xMDI0IDE2ICAgICAgICAgICAxNSwgMzEsIDQ3LCA2MyAxMDI0ICAyMDQ4ICAzMDcyICA0MDk2CisgKiBkb3duc2FtcGxlZCBNUFMgICAgICAgICAgIDMyICAgICAgICAgICAzMSwgNjMgMTAyNCAgMjA0OCB1cHNhbXBsZWQgTVBTCisgKiA4ICAgICAgICAgICAgNywgMTUsIDIzLCAzMSwgMzksIDQ3LCA1NSwgNjMsIDcxICAgIDEwMjQgIDIwNDggIDMwNzIgIDQwOTYKKyAqIDUxMjAgIDYxNDQgIDcxNjggIDgxOTIgIDkyMTYKKyAqCisgKiBNUEVHMS8yIExheWVyIElJICAgICAgICAgIDE4ICAgICAgICAgICAxNywgMzUsIDUzLCA3MSAxMTUyICAyMzA0ICAzNDU2ICA0NjA4CisgKiBkb3duc2FtcGxlZCBNUFMgICAgICAgICAgIDM2ICAgICAgICAgICAzNSwgNzEgMTE1MiAgMjMwNAorICoKKyAqIE1QRUcxLzIgTGF5ZXIgSUlJICAgICAgICAgMTggICAgICAgICAgIDE3LCAzNSwgNTMsIDcxIDExNTIgIDIzMDQgIDM0NTYgIDQ2MDgKKyAqIGRvd25zYW1wbGVkIE1QUyAgICAgICAgICAgMzYgICAgICAgICAgIDM1LCA3MSAxMTUyICAyMzA0CisgKgorICogXHBhcmFtIGZyYW1lTGVuZ3RoCisgKiBccGFyYW0gcW1mQmFuZHMKKyAqIFxwYXJhbSB0aW1lU2xvdHMKKyAqCisgKiBccmV0dXJuICBlcnJvciBjb2RlCisgKi8KK1NBQ0RFQ19FUlJPUiBjaGVja1RpbWVTbG90cyhpbnQgZnJhbWVMZW5ndGgsIGludCBxbWZCYW5kcywgaW50IHRpbWVTbG90cykgeworICBpbnQgbGVuOworICBpbnQgbWF4RnJhbWVMZW5ndGg7CisKKyAgaWYgKHFtZkJhbmRzID09IDY0KSB7CisgICAgLyogbm9ybWFsIE1QRUcgU3Vycm91bmQgKi8KKyAgICBzd2l0Y2ggKGZyYW1lTGVuZ3RoKSB7CisgICAgICBjYXNlIDk2MDoKKyAgICAgIGNhc2UgMTkyMDoKKyAgICAgICAgbWF4RnJhbWVMZW5ndGggPSAzODQwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAyNDoKKyAgICAgIGNhc2UgMjA0ODoKKyAgICAgICAgbWF4RnJhbWVMZW5ndGggPSA0MDk2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTEyOgorICAgICAgY2FzZSAxMTUyOgorICAgICAgICBtYXhGcmFtZUxlbmd0aCA9IDQ2MDg7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKyAgICB9CisgIH0gZWxzZSBpZiAocW1mQmFuZHMgPT0gMzIpIHsKKyAgICAvKiBkb3duc2FtcGxlZCBNUEVHIFN1cnJvdW5kICovCisgICAgc3dpdGNoIChmcmFtZUxlbmd0aCkgeworICAgICAgY2FzZSA5NjA6CisgICAgICBjYXNlIDE5MjA6CisgICAgICAgIG1heEZyYW1lTGVuZ3RoID0gMTkyMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDUxMjoKKyAgICAgIGNhc2UgMTAyNDoKKyAgICAgIGNhc2UgMjA0ODoKKyAgICAgICAgbWF4RnJhbWVMZW5ndGggPSAyMDQ4OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTE1MjoKKyAgICAgICAgbWF4RnJhbWVMZW5ndGggPSAyMzA0OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNUFNfUEFSU0VfRVJST1I7CisgICAgfQorICB9IGVsc2UgaWYgKHFtZkJhbmRzID09IDEyOCkgeworICAgIC8qIHVwc2FtcGxlZCBNUEVHIFN1cnJvdW5kICovCisgICAgc3dpdGNoIChmcmFtZUxlbmd0aCkgeworICAgICAgY2FzZSAxOTIwOgorICAgICAgICBtYXhGcmFtZUxlbmd0aCA9IDc2ODA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDI0OgorICAgICAgICBtYXhGcmFtZUxlbmd0aCA9IDkyMTY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyMDQ4OgorICAgICAgICBtYXhGcmFtZUxlbmd0aCA9IDgxOTI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1MTI6CisgICAgICBjYXNlIDk2MDoKKyAgICAgIGNhc2UgMTE1MjoKKyAgICAgIC8qIG5vIGJyZWFrLCBubyBzdXBwb3J0IGZvciB1cHNhbXBsZWQgTVBFRyBTdXJyb3VuZCAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKyAgfQorCisgIGxlbiA9IGZyYW1lTGVuZ3RoOworCisgIHdoaWxlIChsZW4gPD0gbWF4RnJhbWVMZW5ndGgpIHsKKyAgICBpZiAobGVuID09IHRpbWVTbG90cyAqIHFtZkJhbmRzKSB7CisgICAgICByZXR1cm4gTVBTX09LOworICAgIH0KKyAgICBsZW4gKz0gZnJhbWVMZW5ndGg7CisgIH0KKyAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKK30KKworLyoqCisgKiBcYnJpZWYgIENoZWNrIHNzYyBmb3IgY29uc2lzdGVuY3kgKGUuZy4gYml0IGVycm9ycyBjb3VsZCBjYXVzZSB0cm91YmxlKQorICogICAgICAgICBGaXJzdCBvZiBjdXJyZW50bHkgdHdvIHNzYy1jaGVja3MuCisgKiAgICAgICAgIFRoaXMgKG9sZCkgb25lIGlzIGNhbGxlZCBpbiBtcGVnU3Vycm91bmREZWNvZGVyX0FwcGx5KCkKKyAqICAgICAgICAgb25seSBpZiBpbmJhbmQgbXBzIGNvbmZpZyBpcyBjb250YWluZWQgaW4gc3RyZWFtLgorICoKKyAqICAgICAgICAgTmV3IHNzYyBjaGVjayBpcyBzcGxpdCBpbiB0d28gZnVuY3Rpb25zIHNzY1BhcnNlQ2hlY2soKSBhbmQKKyAqIGNoZWNrX1VQYXJhbV9CdWlsZF9EZWNDb25maWcoKS4gc3NjUGFyc2VDaGVjaygpIGNoZWNrcyBvbmx5IGZvciBjb3JyZWN0CisgKiBwYXJzaW5nLiBjaGVja19VUGFyYW1fQnVpbGRfRGVjQ29uZmlnKCkgaXMgdXNlZCB0byBjaGVjayBpZiB3ZSBoYXZlIGEKKyAqIHZhbGlkIGNvbmZpZy4gQm90aCBhcmUgY2FsbGVkIGluIGluaXRNcGVnU3Vycm91bmREZWNvZGVyKCkgdG8gZW5zdXJlCisgKiBjaGVja2luZyBvZiBpbmJhbmQgYW5kIG91dC1vZi1iYW5kIG1wcyBjb25maWdzLgorICoKKyAqICAgICAgICAgSWYgdGhpcyBmdW5jdGlvbiBjYW4gYmUgaW50ZWdyYXRlZCBpbnRvIHRoZSBuZXcgZnVuY3Rpb25zLgorICogICAgICAgICBXZSBjYW4gcmVtb3ZlIHRoaXMgb25lLgorICoKKyAqIFxwYXJhbSBwU3NjICAgICAgICAgc3BhdGlhbCBzcGVjaWZpYyBjb25maWcgaGFuZGxlLgorICogXHBhcmFtIGZyYW1lTGVuZ3RoCisgKiBccGFyYW0gc2FtcGxlUmF0ZQorICoKKyAqIFxyZXR1cm4gIE1QU19PSyBvbiBzdWNlc3MsIGFuZCBlbHNlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBTQUNERUNfRVJST1Igc3NjQ2hlY2tJbkJhbmQoU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUxlbmd0aCwgaW50IHNhbXBsZVJhdGUpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgaW50IHFtZkJhbmRzOworCisgIEZES19BU1NFUlQocFNzYyAhPSBOVUxMKTsKKworICAvKiBjb3JlIGZzIGFuZCBtcHMgZnMgbXVzdCBtYXRjaCAqLworICBpZiAocFNzYy0+c2FtcGxpbmdGcmVxICE9IHNhbXBsZVJhdGUpIHsKKyAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1IgLyogTVBFR1NERUNfU1NDX1BBUlNFX0VSUk9SICovOworICB9CisKKyAgcW1mQmFuZHMgPSBtcGVnU3Vycm91bmREZWNvZGVyX0dldE5yT2ZRbWZCYW5kcyhwU3NjLCBwU3NjLT5zYW1wbGluZ0ZyZXEpOworCisgIGlmIChjaGVja1RpbWVTbG90cyhmcmFtZUxlbmd0aCwgcW1mQmFuZHMsIHBTc2MtPm5UaW1lU2xvdHMpICE9IE1QU19PSykgeworICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK1NBQ0RFQ19FUlJPUgorbXBlZ1N1cnJvdW5kRGVjb2Rlcl9Db25maWd1cmVRbWZEb21haW4oCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgIFNBQ19JTlBVVF9DT05GSUcgc2FjX2RlY19pbnRlcmZhY2UsIFVJTlQgY29yZVNhbXBsaW5nUmF0ZSwKKyAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgRkRLX1FNRl9ET01BSU5fR0MgKnBHQyA9IE5VTEw7CisKKyAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gTVBTX0lOVkFMSURfSEFORExFOworICB9CisKKyAgRkRLX0FTU0VSVChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMpOworCisgIHBHQyA9ICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZjsKKyAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5tcGVnU3Vycm91bmRTc2NJc0dsb2JhbENmZykgeworICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU1NDID0KKyAgICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5zcGF0aWFsU3BlY2lmaWNDb25maWdCYWNrdXA7CisgICAgaWYgKHNhY19kZWNfaW50ZXJmYWNlID09IFNBQ19JTlRFUkZBQ0VfVElNRSkgeworICAgICAgLyogRm9yIFNBQ19JTlRFUkZBQ0VfUU1GIHRoZXNlIHBhcmFtZXRlcnMgYXJlIHNldCBieSBTQlIuICovCisgICAgICBwR0MtPm5CYW5kc0FuYWx5c2lzX3JlcXVlc3RlZCA9IG1wZWdTdXJyb3VuZERlY29kZXJfR2V0TnJPZlFtZkJhbmRzKAorICAgICAgICAgIHBTU0MsIGNvcmVTYW1wbGluZ1JhdGUpOyAvKiBjb3JlU2FtcGxpbmdSYXRlID09IG91dHB1dFNhbXBsaW5nUmF0ZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDX0lOVEVSRkFDRV9USU1FICovCisgICAgICBwR0MtPm5CYW5kc1N5bnRoZXNpc19yZXF1ZXN0ZWQgPSBwR0MtPm5CYW5kc0FuYWx5c2lzX3JlcXVlc3RlZDsKKyAgICAgIHBHQy0+bklucHV0Q2hhbm5lbHNfcmVxdWVzdGVkID0KKyAgICAgICAgICBmTWF4KChVSU5UKXBTU0MtPm5JbnB1dENoYW5uZWxzLCAoVUlOVClwR0MtPm5JbnB1dENoYW5uZWxzX3JlcXVlc3RlZCk7CisgICAgfQorICAgIHBHQy0+bk91dHB1dENoYW5uZWxzX3JlcXVlc3RlZCA9CisgICAgICAgIGZNYXgoKFVJTlQpcFNTQy0+bk91dHB1dENoYW5uZWxzLCAoVUlOVClwR0MtPm5PdXRwdXRDaGFubmVsc19yZXF1ZXN0ZWQpOworICB9IGVsc2UgeworICAgIGlmIChzYWNfZGVjX2ludGVyZmFjZSA9PSBTQUNfSU5URVJGQUNFX1RJTUUpIHsKKyAgICAgIC8qIEZvciBTQUNfSU5URVJGQUNFX1FNRiB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBzZXQgYnkgU0JSLiAqLworICAgICAgcEdDLT5uQmFuZHNBbmFseXNpc19yZXF1ZXN0ZWQgPSBtcGVnU3Vycm91bmREZWNvZGVyX0dldE5yT2ZRbWZCYW5kcygKKyAgICAgICAgICBOVUxMLCBjb3JlU2FtcGxpbmdSYXRlKTsgLyogY29yZVNhbXBsaW5nUmF0ZSA9PSBvdXRwdXRTYW1wbGluZ1JhdGUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ19JTlRFUkZBQ0VfVElNRSAqLworICAgICAgcEdDLT5uQmFuZHNTeW50aGVzaXNfcmVxdWVzdGVkID0gcEdDLT5uQmFuZHNBbmFseXNpc19yZXF1ZXN0ZWQ7CisgICAgICBwR0MtPm5JbnB1dENoYW5uZWxzX3JlcXVlc3RlZCA9CisgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLT5jcmVhdGVQYXJhbXMubWF4TnVtSW5wdXRDaGFubmVsczsKKyAgICB9CisgICAgcEdDLT5uT3V0cHV0Q2hhbm5lbHNfcmVxdWVzdGVkID0KKyAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLT5jcmVhdGVQYXJhbXMubWF4TnVtT3V0cHV0Q2hhbm5lbHM7CisgIH0KKyAgcEdDLT5uUW1mUHJvY0JhbmRzX3JlcXVlc3RlZCA9IDY0OworICBwR0MtPm5RbWZQcm9jQ2hhbm5lbHNfcmVxdWVzdGVkID0KKyAgICAgIGZNaW4oKElOVClwR0MtPm5JbnB1dENoYW5uZWxzX3JlcXVlc3RlZCwKKyAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLT5jcmVhdGVQYXJhbXMubWF4TnVtSW5wdXRDaGFubmVscyk7CisKKyAgaWYgKGNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgIHBHQy0+ZmxhZ3NfcmVxdWVzdGVkIHw9IFFNRl9GTEFHX01QU0xERkI7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIFxicmllZiBEZWNvZGUgTVBFRyBTdXJyb3VuZCBmcmFtZS4KKyAqKi8KK2ludCBtcGVnU3Vycm91bmREZWNvZGVyX1BhcnNlTm9IZWFkZXIoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgaW50ICpwTXBzRGF0YUJpdHMsIGludCBmR2xvYmFsSW5kZXBlbmRlbmN5RmxhZykgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqc3NjUGFyc2U7CisgIGludCBiaXRzQXZhaWwsIG51bVNhY0JpdHM7CisKKyAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyID09IE5VTEwgfHwgaEJzID09IE5VTEwpIHsKKyAgICByZXR1cm4gTVBTX0lOVkFMSURfSEFORExFOworICB9CisKKyAgc3NjUGFyc2UgPSAmcE1wZWdTdXJyb3VuZERlY29kZXIKKyAgICAgICAgICAgICAgICAgIC0+c3BhdGlhbFNwZWNpZmljQ29uZmlnW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lUGFyc2VdOworCisgIGJpdHNBdmFpbCA9IEZES2dldFZhbGlkQml0cyhoQnMpOworCisgIC8qIEZpcnN0IHNwYXRpYWwgc3BlY2lmaWMgY29uZmlnIGlzIHBhcnNlZCBpbnRvIHNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cCwKKyAgICogc2Vjb25kIHNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cCBpcyBjb3BpZWQgaW50bworICAgKiBzcGF0aWFsU3BlY2lmaWNDb25maWdbYnNGcmFtZURlY29kZV0gKi8KKyAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVQYXJzZV0pIHsKKyAgICBGREttZW1jcHkoc3NjUGFyc2UsICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLAorICAgICAgICAgICAgICBzaXplb2YoU1BBVElBTF9TUEVDSUZJQ19DT05GSUcpKTsKKyAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+Zk9uU3luY1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXSA9CisgICAgICAgIE1QRUdTX1NZTkNfRk9VTkQ7CisgIH0KKworICBpZiAoYml0c0F2YWlsIDw9IDApIHsKKyAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgIH0gZWxzZSB7CisgICAgZXJyID0gU3BhdGlhbERlY1BhcnNlRnJhbWVEYXRhKAorICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMsCisgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZXNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVQYXJzZV0sCisgICAgICAgIGhCcywgc3NjUGFyc2UsIChVUE1JWFRZUEUpcE1wZWdTdXJyb3VuZERlY29kZXItPnVwbWl4VHlwZSwKKyAgICAgICAgZkdsb2JhbEluZGVwZW5kZW5jeUZsYWcpOworICAgIGlmIChlcnIgPT0gTVBTX09LKSB7CisgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZXNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVQYXJzZV0KKyAgICAgICAgICAubmV3QnNEYXRhID0gMTsKKyAgICB9CisgIH0KKworICBudW1TYWNCaXRzID0gYml0c0F2YWlsIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKKworICBpZiAobnVtU2FjQml0cyA+IGJpdHNBdmFpbCkgeworICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXQorICAgICAgICAubmV3QnNEYXRhID0gMDsKKyAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgIH0KKworICAqcE1wc0RhdGFCaXRzIC09IG51bVNhY0JpdHM7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBcYnJpZWYgQ2hlY2ssIGlmIGFuY1R5cGUgaXMgdmFsaWQuCisgKiovCitzdGF0aWMgaW50IGlzVmFsaWRBbmNUeXBlKENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFuY1R5cGUpIHsKKyAgaW50IHJldCA9IDE7CisKKyAgaWYgKChhbmNUeXBlICE9IE1QRUdTX0FOQ1RZUEVfSEVBREVSX0FORF9GUkFNRSkgJiYKKyAgICAgIChhbmNUeXBlICE9IE1QRUdTX0FOQ1RZUEVfRlJBTUUpKSB7CisgICAgcmV0ID0gMDsKKyAgfQorCisgIGlmIChyZXQgPT0gMCkgeworICAgIHVwZGF0ZU1wZWdTdXJyb3VuZERlY29kZXJTdGF0dXMocE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19JTklUX0VSUk9SX1BBWUxPQUQsIE1QRUdTX1NZTkNfTE9TVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUdTX1NUT1ApOworICB9CisKKyAgcmV0dXJuIChyZXQpOworfQorCisvKioKKyAqIFxicmllZiBDaGVjaywgaWYgYW5jU3RhcnRTdG9wIGlzIHZhbGlkLgorICoqLworc3RhdGljIGludCBpc1ZhbGlkQW5jU3RhcnRTdG9wKENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW5jU3RhcnRTdG9wKSB7CisgIGludCByZXQgPSAxOworCisgIHN3aXRjaCAoYW5jU3RhcnRTdG9wKSB7CisgICAgY2FzZSBNUEVHU19TVEFSVDoKKyAgICAgIC8qIFNlcXVlbmNlIHN0YXJ0IC0gc3RhcnQgYW5kIGNvbnRpbnVlIC0gc3RhcnQgbm90IGFsbG93ZWQgKi8KKyAgICAgIGlmICgocE1wZWdTdXJyb3VuZERlY29kZXItPmFuY1N0YXJ0U3RvcFByZXYgPT0gTVBFR1NfU1RBUlQpIHx8CisgICAgICAgICAgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5hbmNTdGFydFN0b3BQcmV2ID09IE1QRUdTX0NPTlRJTlVFKSkgeworICAgICAgICByZXQgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1QRUdTX1NUT1A6CisgICAgICAvKiBNUFMgcGF5bG9hZCBvZiB0aGUgcHJldmlvdXMgZnJhbWUgbXVzdCBiZSB2YWxpZCBpZiBjdXJyZW50IHR5cGUgaXMgc3RvcAorICAgICAgICAgU2VxdWVuY2Ugc3RhcnRzdG9wIC0gc3RvcCBhbmQgc3RvcCAtIHN0b3Agbm90IGFsbG93ZWQKKyAgICAgICAgIFNlcXVlbmNlIHN0YXJ0c3RvcCAtIGNvbnRpbnVlIGFuZCBzdG9wIC0gY29udGludWUgYXJlIGFsbG93ZWQgKi8KKyAgICAgIGlmICgocE1wZWdTdXJyb3VuZERlY29kZXItPmFuY1N0YXJ0U3RvcFByZXYgPT0gTVBFR1NfU1RPUCkgfHwKKyAgICAgICAgICAocE1wZWdTdXJyb3VuZERlY29kZXItPmFuY1N0YXJ0U3RvcFByZXYgPT0gTVBFR1NfU1RBUlRfU1RPUCkpIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNUEVHU19DT05USU5VRToKKyAgICBjYXNlIE1QRUdTX1NUQVJUX1NUT1A6CisgICAgICAvKiBObyBlcnJvciBkZXRlY3Rpb24gcG9zc2libGUgZm9yIHRoaXMgc3RhdGVzICovCisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChyZXQgPT0gMCkgeworICAgIHVwZGF0ZU1wZWdTdXJyb3VuZERlY29kZXJTdGF0dXMocE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19JTklUX0VSUk9SX1BBWUxPQUQsIE1QRUdTX1NZTkNfTE9TVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUdTX1NUT1ApOworICB9IGVsc2UgeworICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5hbmNTdGFydFN0b3BQcmV2ID0gKE1QRUdTX0FOQ1NUQVJUU1RPUClhbmNTdGFydFN0b3A7CisgIH0KKworICByZXR1cm4gKHJldCk7Cit9CisKK2ludCBtcGVnU3Vycm91bmREZWNvZGVyX1BhcnNlKENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50ICpwTXBzRGF0YUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsIGludCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lU2l6ZSwgaW50IGZHbG9iYWxJbmRlcGVuZGVuY3lGbGFnKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpzc2NQYXJzZTsKKyAgU1BBVElBTF9CU19GUkFNRSAqYnNGcmFtZTsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaE1wc0JzRGF0YSA9IE5VTEw7CisgIEZES19CSVRTVFJFQU0gbXBzQnNEYXRhOworICBpbnQgbXBzRGF0YUJpdHMgPSAqcE1wc0RhdGFCaXRzOworICBpbnQgbXBzQnNCaXRzOworICBNUEVHU19BTkNUWVBFIGFuY1R5cGU7CisgIE1QRUdTX0FOQ1NUQVJUU1RPUCBhbmNTdGFydFN0b3A7CisKKyAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gTVBTX0lOVkFMSURfSEFORExFOworICB9CisKKyAgRkRLX0FTU0VSVChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMpOworCisgIG1wc0JzQml0cyA9IEZES2dldFZhbGlkQml0cyhoQnMpOworCisgIHNzY1BhcnNlID0gJnBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgICAgICAgICAtPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXTsKKyAgYnNGcmFtZSA9ICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZXNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVQYXJzZV07CisKKyAgLyoKKyAgICAgRmluZCBvcGVyYXRpb24gbW9kZSBvZiBtcGVnIHN1cnJvdW5kIGRlY29kZXI6CisgICAgIC0gTVBFR1NfT1BNT0RFX0VNTTogICAgICAgICAgICBNb2RlOiBFbmhhbmNlZCBNYXRyaXggTW9kZSAoQmxpbmQpCisgICAgIC0gTVBFR1NfT1BNT0RFX01QU19QQVlMT0FEOiAgICBNb2RlOiBOb3JtYWwsIFN0ZXJlbyBvciBCaW5hdXJhbAorICAgICAtIE1QRUdTX09QTU9ERV9OT19NUFNfUEFZTE9BRDogTW9kZTogTm8gTXBlZ1N1cnJvdW5kIFBheWxvYWQKKyAgKi8KKyAgeworICAgIC8qIFBhcnNlIGFuY1R5cGUgYW5kIGFuY1N0YXJ0U3RvcCAqLworICAgIGFuY1R5cGUgPSAoTVBFR1NfQU5DVFlQRSlGREtyZWFkQml0cyhoQnMsIDIpOworICAgIGFuY1N0YXJ0U3RvcCA9IChNUEVHU19BTkNTVEFSVFNUT1ApRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICBtcHNEYXRhQml0cyAtPSA0OworCisgICAgLyogU2V0IHZhbGlkIGFuYyB0eXBlIGZsYWcsIGlmIGFuY1R5cGUgc2lnbmFscyBhIHBheWxvYWQgd2l0aCBlaXRoZXIgaGVhZGVyCisgICAgICogYW5kIGZyYW1lIG9yIGZyYW1lICovCisgICAgaWYgKGlzVmFsaWRBbmNUeXBlKHBNcGVnU3Vycm91bmREZWNvZGVyLCBhbmNUeXBlKSkgeworICAgICAgLyogU2V0IHZhbGlkIGFuYyBzdGFydHN0b3AgZmxhZywgaWYgdHJhbnNtaXR0ZWQgc2VxdWVuY2UgaXMgbm90IGlsbGVnYWwgKi8KKyAgICAgIGlmIChpc1ZhbGlkQW5jU3RhcnRTdG9wKHBNcGVnU3Vycm91bmREZWNvZGVyLCBhbmNTdGFydFN0b3ApKSB7CisgICAgICAgIHN3aXRjaCAoYW5jU3RhcnRTdG9wKSB7CisgICAgICAgICAgY2FzZSBNUEVHU19TVEFSVDoKKyAgICAgICAgICAgIC8qIEFzc3VtaW5nIHRoYXQgY29yZSBjb2RlciBmcmFtZSBzaXplIChBQUMpIGlzIHNtYWxsZXIgdGhhbiBNUFMKKyAgICAgICAgICAgICAgIGNvZGVyIGZyYW1lIHNpemUuIFNhdmUgYXVkaW8gZGF0YSBmb3IgbmV4dCBmcmFtZS4gKi8KKyAgICAgICAgICAgIGlmIChtcHNEYXRhQml0cyA+IE1QU19EQVRBX0JVRkZFUl9TSVpFICogOCkgeworICAgICAgICAgICAgICBlcnIgPSBNUFNfTk9UT0s7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXBzRGF0YUJpdHMgLyA4OyBpKyspIHsKKyAgICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPm1wc0RhdGFbaV0gPSBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPm1wc0RhdGFCaXRzID0gbXBzRGF0YUJpdHM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgTVBFR1NfQ09OVElOVUU6CisgICAgICAgICAgY2FzZSBNUEVHU19TVE9QOgorICAgICAgICAgICAgLyogQXNzdW1pbmcgdGhhdCBjb3JlIGNvZGVyIGZyYW1lIHNpemUgKEFBQykgaXMgc21hbGxlciB0aGFuIE1QUworICAgICAgICAgICAgICAgY29kZXIgZnJhbWUgc2l6ZS4gU2F2ZSBhdWRpbyBkYXRhIGZvciBuZXh0IGZyYW1lLiAqLworICAgICAgICAgICAgaWYgKChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YUJpdHMgKyBtcHNEYXRhQml0cykgPgorICAgICAgICAgICAgICAgIE1QU19EQVRBX0JVRkZFUl9TSVpFICogOCkgeworICAgICAgICAgICAgICBlcnIgPSBNUFNfTk9UT0s7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXBzRGF0YUJpdHMgLyA4OyBpKyspIHsKKyAgICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXIKKyAgICAgICAgICAgICAgICAgIC0+bXBzRGF0YVsocE1wZWdTdXJyb3VuZERlY29kZXItPm1wc0RhdGFCaXRzIC8gOCkgKyBpXSA9CisgICAgICAgICAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPm1wc0RhdGFCaXRzICs9IG1wc0RhdGFCaXRzOworICAgICAgICAgICAgRkRLaW5pdEJpdFN0cmVhbSgmbXBzQnNEYXRhLCBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0JVRlNJWkVfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5tcHNEYXRhQml0cywgQlNfUkVBREVSKTsKKyAgICAgICAgICAgIGhNcHNCc0RhdGEgPSAmbXBzQnNEYXRhOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIE1QRUdTX1NUQVJUX1NUT1A6CisgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YUJpdHMgPSBtcHNEYXRhQml0czsKKyAgICAgICAgICAgIGhNcHNCc0RhdGEgPSBoQnM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChhbmNTdGFydFN0b3AgPT0gTVBFR1NfU1RPUCkgfHwKKyAgICAgICAgICAgIChhbmNTdGFydFN0b3AgPT0gTVBFR1NfU1RBUlRfU1RPUCkpIHsKKyAgICAgICAgICBzd2l0Y2ggKGFuY1R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTVBFR1NfQU5DVFlQRV9IRUFERVJfQU5EX0ZSQU1FOiB7CisgICAgICAgICAgICAgIGludCBwYXJzZVJlc3VsdCwgYml0c1JlYWQ7CisgICAgICAgICAgICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHIHNwYXRpYWxTcGVjaWZpY0NvbmZpZ1RtcCA9CisgICAgICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwOworCisgICAgICAgICAgICAgIC8qIFBhcnNlIHNwYXRpYWwgc3BlY2lmaWMgY29uZmlnICovCisgICAgICAgICAgICAgIGJpdHNSZWFkID0gRkRLZ2V0VmFsaWRCaXRzKGhNcHNCc0RhdGEpOworCisgICAgICAgICAgICAgIGVyciA9IFNwYXRpYWxEZWNQYXJzZVNwZWNpZmljQ29uZmlnSGVhZGVyKAorICAgICAgICAgICAgICAgICAgaE1wc0JzRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLCBjb3JlQ29kZWMsCisgICAgICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+dXBtaXhUeXBlKTsKKworICAgICAgICAgICAgICBiaXRzUmVhZCA9IChiaXRzUmVhZCAtIEZES2dldFZhbGlkQml0cyhoTXBzQnNEYXRhKSk7CisgICAgICAgICAgICAgIHBhcnNlUmVzdWx0ID0gKChlcnIgPT0gTVBTX09LKSA/IGJpdHNSZWFkIDogLWJpdHNSZWFkKTsKKworICAgICAgICAgICAgICBpZiAocGFyc2VSZXN1bHQgPCAwKSB7CisgICAgICAgICAgICAgICAgcGFyc2VSZXN1bHQgPSAtcGFyc2VSZXN1bHQ7CisgICAgICAgICAgICAgICAgZXJyID0gTVBTX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBNUFNfT0spIHsKKyAgICAgICAgICAgICAgICAvKiBDaGVjayBTU0MgZm9yIGNvbnNpc3RlbmN5IChlLmcuIGJpdCBlcnJvcnMgY291bGQgY2F1c2UKKyAgICAgICAgICAgICAgICAgKiB0cm91YmxlKSAqLworICAgICAgICAgICAgICAgIGVyciA9IHNzY0NoZWNrSW5CYW5kKAorICAgICAgICAgICAgICAgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cCwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgICAgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5zcGF0aWFsU3BlY2lmaWNDb25maWdCYWNrdXAgPQorICAgICAgICAgICAgICAgICAgICBzcGF0aWFsU3BlY2lmaWNDb25maWdUbXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YUJpdHMgLT0gcGFyc2VSZXN1bHQ7CisKKyAgICAgICAgICAgICAgLyogSW5pdGlhdGUgcmUtaW5pdGlhbGl6YXRpb24sIGlmIGhlYWRlciBoYXMgY2hhbmdlZCAqLworICAgICAgICAgICAgICBpZiAoRkRLX1NwYXRpYWxEZWNDb21wYXJlU3BhdGlhbFNwZWNpZmljQ29uZmlnSGVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLAorICAgICAgICAgICAgICAgICAgICAgIHNzY1BhcnNlKSA9PSBNUFNfVU5FUVVBTF9TU0MpIHsKKyAgICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2RlcgorICAgICAgICAgICAgICAgICAgICAtPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXSB8PQorICAgICAgICAgICAgICAgICAgICBNUEVHU19JTklUX0NIQU5HRV9IRUFERVI7CisgICAgICAgICAgICAgICAgU3BhdGlhbERlY0luaXRQYXJzZXJDb250ZXh0KHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYyk7CisgICAgICAgICAgICAgICAgLyogV2UgZm91bmQgYSB2YWxpZCBpbi1iYW5kIGNvbmZpZ3VyYXRpb24uIFRoZXJlZm9yZSBhbnkKKyAgICAgICAgICAgICAgICAgKiBwcmV2aW91cyBjb25maWcgaXMgaW52YWxpZCBub3cuICovCisgICAgICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZFNzY0lzR2xvYmFsQ2ZnID0gMDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNUEVHU19BTkNUWVBFX0ZSQU1FOgorCisgICAgICAgICAgICAgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2RlcgorICAgICAgICAgICAgICAgICAgICAgIC0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lUGFyc2VdICYKKyAgICAgICAgICAgICAgICAgIE1QRUdTX0lOSVRfRVJST1JfUEFZTE9BRCkgeworICAgICAgICAgICAgICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIEZpcnN0IHNwYXRpYWwgc3BlY2lmaWMgY29uZmlnIGlzIHBhcnNlZCBpbnRvCisgICAgICAgICAgICAgICAqIHNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cCwgc2Vjb25kIHNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cAorICAgICAgICAgICAgICAgKiBpcyBjb3BpZWQgaW50byBzcGF0aWFsU3BlY2lmaWNDb25maWdbYnNGcmFtZURlY29kZV0gKi8KKyAgICAgICAgICAgICAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVQYXJzZV0pIHsKKyAgICAgICAgICAgICAgICBGREttZW1jcHkoc3NjUGFyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU1BBVElBTF9TUEVDSUZJQ19DT05GSUcpKTsKKyAgICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2RlcgorICAgICAgICAgICAgICAgICAgICAtPmZPblN5bmNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVQYXJzZV0gPQorICAgICAgICAgICAgICAgICAgICBNUEVHU19TWU5DX0ZPVU5EOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgLT5mT25TeW5jW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lUGFyc2VdID49CisgICAgICAgICAgICAgICAgICBNUEVHU19TWU5DX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgaW50IG5iaXRzID0gMCwgYml0c0F2YWlsOworCisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJpdHNBdmFpbCA9IEZES2dldFZhbGlkQml0cyhoTXBzQnNEYXRhKTsKKworICAgICAgICAgICAgICAgIGlmIChiaXRzQXZhaWwgPD0gMCkgeworICAgICAgICAgICAgICAgICAgZXJyID0gTVBTX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBlcnIgPSBTcGF0aWFsRGVjUGFyc2VGcmFtZURhdGEoCisgICAgICAgICAgICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLCBic0ZyYW1lLCBoTXBzQnNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIHNzY1BhcnNlLCAoVVBNSVhUWVBFKXBNcGVnU3Vycm91bmREZWNvZGVyLT51cG1peFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgZkdsb2JhbEluZGVwZW5kZW5jeUZsYWcpOworICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBNUFNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgYnNGcmFtZS0+bmV3QnNEYXRhID0gMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBuYml0cyA9IGJpdHNBdmFpbCAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhNcHNCc0RhdGEpOworCisgICAgICAgICAgICAgICAgaWYgKChuYml0cyA+IGJpdHNBdmFpbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKG5iaXRzID4gcE1wZWdTdXJyb3VuZERlY29kZXItPm1wc0RhdGFCaXRzKSB8fAorICAgICAgICAgICAgICAgICAgICAocE1wZWdTdXJyb3VuZERlY29kZXItPm1wc0RhdGFCaXRzID4gbmJpdHMgKyA3ICYmCisgICAgICAgICAgICAgICAgICAgICAhSVNfTE9XREVMQVkoY29yZUNvZGVjKSkpIHsKKyAgICAgICAgICAgICAgICAgIGJzRnJhbWUtPm5ld0JzRGF0YSA9IDA7CisgICAgICAgICAgICAgICAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPm1wc0RhdGFCaXRzIC09IG5iaXRzOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OiAvKiBhZGRlZCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nICovCisgICAgICAgICAgICAgIGVyciA9IE1QU19OT1RPSzsKKyAgICAgICAgICAgICAgYnJlYWs7IC8qIGFkZGVkIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICAgICAgICB9ICAgICAgICAgIC8qIHN3aXRjaCAoYW5jVHlwZSkgKi8KKworICAgICAgICAgIGlmIChlcnIgPT0gTVBTX09LKSB7CisgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YW5jU3RhcnRTdG9wUHJldiA9IGFuY1N0YXJ0U3RvcDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXBkYXRlTXBlZ1N1cnJvdW5kRGVjb2RlclN0YXR1cyhwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfSU5JVF9FUlJPUl9QQVlMT0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19TWU5DX0xPU1QsIE1QRUdTX1NUT1ApOworICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPm1wc0RhdGFCaXRzID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0gLyogKGFuY1N0YXJ0U3RvcCA9PSBNUEVHU19TVE9QKSB8fCAoYW5jU3RhcnRTdG9wID09IE1QRUdTX1NUQVJUX1NUT1ApCisgICAgICAgICAgICovCisgICAgICB9ICAgLyogdmFsaWRBbmNTdGFydFN0b3AgKi8KKyAgICB9ICAgICAvKiB2YWxpZEFuY1R5cGUgKi8KKyAgfQorCitiYWlsOgorCisgICpwTXBzRGF0YUJpdHMgLT0gKG1wc0JzQml0cyAtIEZES2dldFZhbGlkQml0cyhoQnMpKTsKKworICByZXR1cm4gZXJyOworfQorCitpbnQgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9BcHBseShDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICppbnB1dCwgUENNX01QUyAqcFRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVEYXRhU2l6ZSwgaW50IHRpbWVEYXRhRnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuQ2hhbm5lbHMsIGludCAqZnJhbWVTaXplLCBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBjaGFubmVsVHlwZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY2hhbm5lbEluZGljZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IgKmNvbnN0IG1hcERlc2NyKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIFBDTV9NUFMgKnBUaW1lT3V0ID0gcFRpbWVEYXRhOworICBVSU5UIGluaXRDb250cm9sRmxhZ3MgPSAwLCBjb250cm9sRmxhZ3MgPSAwOworICBpbnQgdGltZURhdGFSZXF1aXJlZFNpemUgPSAwOworICBpbnQgbmV3RGF0YTsKKworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBNUFNfSU5WQUxJRF9IQU5ETEU7CisgIH0KKworICBGREtfQVNTRVJUKHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYyk7CisKKyAgaWYgKCFGREtfY2hNYXBEZXNjcl9pc1ZhbGlkKG1hcERlc2NyKSkgeworICAgIHJldHVybiBNUFNfSU5WQUxJRF9IQU5ETEU7CisgIH0KKworICBpZiAoKCpuQ2hhbm5lbHMgPD0gMCkgfHwgKCpuQ2hhbm5lbHMgPiAyKSkgeworICAgIHJldHVybiBNUFNfTk9UT0s7CisgIH0KKworICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMtPnBDb25maWdDdXJyZW50ID0KKyAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2RlcgorICAgICAgICAgICAtPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV07CisgIG5ld0RhdGEgPSBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZXNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVQYXJzZV0KKyAgICAgICAgICAgICAgICAubmV3QnNEYXRhOworCisgIHN3aXRjaCAobXBlZ1N1cnJvdW5kT3BlcmF0aW9uTW9kZShwTXBlZ1N1cnJvdW5kRGVjb2RlciwgMTAwMCkpIHsKKyAgICBjYXNlIE1QRUdTX09QTU9ERV9NUFNfUEFZTE9BRDoKKyAgICAgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2RlcgorICAgICAgICAgICAgICAtPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0pIHsKKyAgICAgICAgZXJyID0gaW5pdE1wZWdTdXJyb3VuZERlY29kZXIocE1wZWdTdXJyb3VuZERlY29kZXIpOworICAgICAgfQorCisgICAgICBpZiAoZXJyID09IE1QU19PSykgeworICAgICAgICBpZiAoKHBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgICAgICAgIC0+Zk9uU3luY1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gIT0KKyAgICAgICAgICAgICBNUEVHU19TWU5DX0NPTVBMRVRFKSAmJgorICAgICAgICAgICAgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0KKyAgICAgICAgICAgICAgICAgLmJzSW5kZXBlbmRlbmN5RmxhZyA9PSAxKSkgeworICAgICAgICAgIC8qIFdlIGdvdCBhIHZhbGlkIGhlYWRlciBhbmQgaW5kZXBlbmRlbnRseSBkZWNvZGVhYmxlIGZyYW1lIGRhdGEuCisgICAgICAgICAgICAgIC0+IEdvIHRvIHRoZSBuZXh0IHN5bmMgbGV2ZWwgYW5kIHN0YXJ0IHByb2Nlc3NpbmcuICovCisgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmZPblN5bmNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdID0KKyAgICAgICAgICAgICAgTVBFR1NfU1lOQ19DT01QTEVURTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogV2UgZ290IGEgdmFsaWQgY29uZmlnIGhlYWRlciBidXQgZm91bmQgYW4gZXJyb3Igd2hpbGUgcGFyc2luZyB0aGUKKyAgICAgICAgICAgYml0c3RyZWFtLiBXYWl0IGZvciB0aGUgbmV4dCBpbmRlcGVuZGVudCBmcmFtZSBhbmQgYXBwbHkgZXJyb3IKKyAgICAgICAgICAgY29uZWFsbWVudCBpbiB0aGUgbWVhbnRpbWUuICovCisgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5mT25TeW5jW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSA9CisgICAgICAgICAgICBNUEVHU19TWU5DX0ZPVU5EOworICAgICAgICBjb250cm9sRmxhZ3MgfD0gTVBFR1NfQ09OQ0VBTDsKKyAgICAgICAgZXJyID0gTVBTX09LOworICAgICAgfQorICAgICAgLyoKKyAgICAgICAgIENvbmNlYWxtZW50OgorICAgICAgICAgLSBCaXRzdHJlYW0gaXMgYXZhaWxhYmxlLCBubyBzeW5jIGZvdW5kIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZworICAgICAgICAgLSBCaXRzdHJlYW0gaXMgYXZhaWxhYmxlLCBzeW5jIGxvc3QgZHVlIHRvIGNvcnJ1cHRlZCBiaXRzdHJlYW0KKyAgICAgICAgIC0gQml0c3RyZWFtIGlzIGF2YWlsYWJsZSwgc3luYyBmb3VuZCBidXQgbm8gaW5kZXBlbmRlbnQgZnJhbWUKKyAgICAgICovCisgICAgICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXItPmZPblN5bmNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdICE9CisgICAgICAgICAgTVBFR1NfU1lOQ19DT01QTEVURSkgeworICAgICAgICBjb250cm9sRmxhZ3MgfD0gTVBFR1NfQ09OQ0VBTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNUEVHU19PUE1PREVfTk9fTVBTX1BBWUxPQUQ6CisgICAgICAvKiBDb25jZWFsbWVudDogTm8gYml0c3RyZWFtIGlzIGF2YWlsYWJsZSAqLworICAgICAgY29udHJvbEZsYWdzIHw9IE1QRUdTX0NPTkNFQUw7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnIgPSBNUFNfTk9UT0s7CisgIH0KKworICBpZiAoZXJyICE9IE1QU19PSykgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qCisgICAqIEZvcmNlIEJ5cGFzc01vZGUgaWYgY2hvb3NlbiBieSB1c2VyCisgICAqLworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZFVzZXJQYXJhbXMuYnlwYXNzTW9kZSkgeworICAgIGNvbnRyb2xGbGFncyB8PSBNUEVHU19CWVBBU1NNT0RFOworICB9CisKKyAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdKSB7CisgICAgaW50IHN0YXJ0V2l0aERmbHRDZmcgPSAwOworICAgIC8qCisgICAgICogSW5pdCB3aXRoIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHdlIGNhbWUgaGVyZSBhbmQgYXJlIHN0aWxsIG5vdAorICAgICAqIGluaXRpYWxpemVkLgorICAgICAqLworICAgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSAmCisgICAgICAgIE1QRUdTX0lOSVRfRU5GT1JDRV9SRUlOSVQpIHsKKyAgICAgIC8qIEdldCBkZWZhdWx0IHNwYXRpYWwgc3BlY2lmaWMgY29uZmlnICovCisgICAgICBpZiAoRkRLX1NwYXRpYWxEZWNJbml0RGVmYXVsdFNwYXRpYWxTcGVjaWZpY0NvbmZpZygKKyAgICAgICAgICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5zcGF0aWFsU3BlY2lmaWNDb25maWdCYWNrdXAsIGNvcmVDb2RlYywKKyAgICAgICAgICAgICAgKm5DaGFubmVscywgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgKmZyYW1lU2l6ZSAvCisgICAgICAgICAgICAgICAgICBtcGVnU3Vycm91bmREZWNvZGVyX0dldE5yT2ZRbWZCYW5kcyhOVUxMLCBzYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZERlY29kZXJMZXZlbCwKKyAgICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZFVzZXJQYXJhbXMuYmxpbmRFbmFibGUpKSB7CisgICAgICAgIGVyciA9IE1QU19OT1RPSzsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICAvKiBJbml0aWF0ZSByZS1pbml0aWFsaXphdGlvbiwgaWYgaGVhZGVyIGhhcyBjaGFuZ2VkICovCisgICAgICBpZiAoRkRLX1NwYXRpYWxEZWNDb21wYXJlU3BhdGlhbFNwZWNpZmljQ29uZmlnSGVhZGVyKAorICAgICAgICAgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cCwKKyAgICAgICAgICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5zcGF0aWFsU3BlY2lmaWNDb25maWcKKyAgICAgICAgICAgICAgICAgICBbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdKSA9PSBNUFNfVU5FUVVBTF9TU0MpIHsKKyAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gfD0KKyAgICAgICAgICAgIE1QRUdTX0lOSVRfQ0hBTkdFX0hFQURFUjsKKyAgICAgICAgU3BhdGlhbERlY0luaXRQYXJzZXJDb250ZXh0KHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYyk7CisgICAgICB9CisKKyAgICAgIHN0YXJ0V2l0aERmbHRDZmcgPSAxOworICAgIH0KKworICAgIC8qIEZpcnN0IHNwYXRpYWwgc3BlY2lmaWMgY29uZmlnIGlzIHBhcnNlZCBpbnRvIHNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cCwKKyAgICAgKiBzZWNvbmQgc3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwIGlzIGNvcGllZCBpbnRvIHNwYXRpYWxTcGVjaWZpY0NvbmZpZworICAgICAqLworICAgIGVyciA9IGluaXRNcGVnU3Vycm91bmREZWNvZGVyKHBNcGVnU3Vycm91bmREZWNvZGVyKTsKKworICAgIGlmIChzdGFydFdpdGhEZmx0Q2ZnKSB7CisgICAgICAvKiBpbml0aWFsaXplZCB3aXRoIGRlZmF1bHQgY29uZmlnLCBidXQgbm8gc3luYyBmb3VuZCAqLworICAgICAgLyogbWF5YmUgdXNlIHVwZGF0ZU1wZWdTdXJyb3VuZERlY29kZXJTdGF0dXMgbGF0ZXIgb24gKi8KKyAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5mT25TeW5jW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSA9CisgICAgICAgICAgTVBFR1NfU1lOQ19MT1NUOworICAgIH0KKworICAgIC8qIFNpbmNlIHdlIGRvIG5vdCBoYXZlIHN0YXRlIE1QRUdTX1NZTkNfQ09NUExFVEUgYXBwbHkgY29uY2VhbG1lbnQgKi8KKyAgICBjb250cm9sRmxhZ3MgfD0gTVBFR1NfQ09OQ0VBTDsKKworICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogUHJvY2VzcyBNUEVHIFN1cnJvdW5kIEF1ZGlvCisgICAqLworICBpbml0Q29udHJvbEZsYWdzID0gY29udHJvbEZsYWdzOworCisgIC8qIENoZWNrIHRoYXQgcHJvdmlkZWQgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2guICovCisgIHRpbWVEYXRhUmVxdWlyZWRTaXplID0KKyAgICAgICh0aW1lRGF0YUZyYW1lU2l6ZSAqCisgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLT5udW1PdXRwdXRDaGFubmVsc0FUICoKKyAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uQmFuZHNTeW50aGVzaXMpIC8KKyAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc0FuYWx5c2lzOworICBpZiAodGltZURhdGFTaXplIDwgdGltZURhdGFSZXF1aXJlZFNpemUpIHsKKyAgICBlcnIgPSBNUFNfT1VUUFVUX0JVRkZFUl9UT09fU01BTEw7CisgICAgZ290byBiYWlsOworICB9CisKKyAgaWYgKChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmCisgICAgICAgU0FDREVDX1NZTlRBWF9VU0FDKSAmJgorICAgICAgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYy0+c3RlcmVvQ29uZmlnSW5kZXggPiAxKSkgeworICAgIEZES19BU1NFUlQodGltZURhdGFSZXF1aXJlZFNpemUgPj0gdGltZURhdGFGcmFtZVNpemUgKiAqbkNoYW5uZWxzKTsKKyAgICAvKiBQbGFjZSBzYW1wbGVzIGNvbXByaXNpbmcgUU1GIHRpbWUgc2xvdHMgc3BhY2VkIGF0IFFNRiBvdXRwdXQgQmFuZCByYXN0ZXIKKyAgICAgKiB0byBhbGxvdyBzbG90IHdpc2UgcHJvY2Vzc2luZyAqLworICAgIGludCB0aW1lRGF0YUZyYW1lU2l6ZU91dCA9CisgICAgICAgICh0aW1lRGF0YUZyYW1lU2l6ZSAqCisgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uQmFuZHNTeW50aGVzaXMpIC8KKyAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBRbWZEb21haW4tPmdsb2JhbENvbmYubkJhbmRzQW5hbHlzaXM7CisgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBRbWZEb21haW4tPmdsb2JhbENvbmYuVERpbnB1dCA9CisgICAgICAgIHBUaW1lRGF0YSArIHRpbWVEYXRhRnJhbWVTaXplT3V0IC0gdGltZURhdGFGcmFtZVNpemU7CisgICAgZm9yIChpbnQgaSA9ICpuQ2hhbm5lbHMgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgRkRLbWVtbW92ZShwVGltZURhdGEgKyAoaSArIDEpICogdGltZURhdGFGcmFtZVNpemVPdXQgLSB0aW1lRGF0YUZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgcFRpbWVEYXRhICsgdGltZURhdGFGcmFtZVNpemUgKiBpLAorICAgICAgICAgICAgICAgICBzaXplb2YoUENNX01QUykgKiB0aW1lRGF0YUZyYW1lU2l6ZSk7CisgICAgICBGREttZW1jbGVhcihwVGltZURhdGEgKyBpICogdGltZURhdGFGcmFtZVNpemVPdXQsCisgICAgICAgICAgICAgICAgICBzaXplb2YoUENNX01QUykgKiAodGltZURhdGFGcmFtZVNpemVPdXQgLSB0aW1lRGF0YUZyYW1lU2l6ZSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZFVzZVRpbWVJbnRlcmZhY2UpIHsKKyAgICAgIEZES21lbWNweShpbnB1dCwgcFRpbWVEYXRhLAorICAgICAgICAgICAgICAgIHNpemVvZihJTlRfUENNKSAqICgqbkNoYW5uZWxzKSAqICgqZnJhbWVTaXplKSk7CisgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5URGlucHV0ID0gaW5wdXQ7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogUHJvY2VzcyBNUEVHIFN1cnJvdW5kIEF1ZGlvCisgICAqLworICBlcnIgPSBTcGF0aWFsRGVjQXBwbHlGcmFtZSgKKyAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYywKKyAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZXNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdLAorICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZFVzZVRpbWVJbnRlcmZhY2UgPyBJTlBVVE1PREVfVElNRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJTlBVVE1PREVfUU1GX1NCUiwKKyAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLlREaW5wdXQsIE5VTEwsIE5VTEwsCisgICAgICBwVGltZU91dCwgKmZyYW1lU2l6ZSwgJmNvbnRyb2xGbGFncywgKm5DaGFubmVscywgbWFwRGVzY3IpOworICAqbkNoYW5uZWxzID0gcE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLT5udW1PdXRwdXRDaGFubmVsc0FUOworCisgIGlmIChlcnIgIT0KKyAgICAgIE1QU19PSykgeyAvKiBBIGZhdGFsIGVycm9yIG9jY3VyZWQuIEdvIGJhY2sgdG8gc3RhcnQgYW5kIHRyeSBhZ2FpbjogKi8KKyAgICB1cGRhdGVNcGVnU3Vycm91bmREZWNvZGVyU3RhdHVzKHBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfSU5JVF9FTkZPUkNFX1JFSU5JVCwgTVBFR1NfU1lOQ19MT1NULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfU1RPUCk7CisgICAgKmZyYW1lU2l6ZSA9CisgICAgICAgIDA7IC8qIERlY2xhcmUgdGhhdCBmcmFtZXdvcmsgY2FuIG5vdCB1c2UgdGhlIGRhdGEgaW4gcFRpbWVPdXQuICovCisgIH0gZWxzZSB7CisgICAgaWYgKCgoY29udHJvbEZsYWdzICYgTVBFR1NfQ09OQ0VBTCkgJiYKKyAgICAgICAgICEoaW5pdENvbnRyb2xGbGFncyAmIE1QRUdTX0NPTkNFQUwpKSB8fAorICAgICAgICAocE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLT5lcnJJbnQgIT0KKyAgICAgICAgIE1QU19PSykpIHsgLyogQWNjb3VudCBmb3IgZXJyb3JzIHRoYXQgb2NjdXJlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICBTcGF0aWFsRGVjQXBwbHlGcmFtZSgpOiAqLworICAgICAgdXBkYXRlTXBlZ1N1cnJvdW5kRGVjb2RlclN0YXR1cyhwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfSU5JVF9FUlJPUl9QQVlMT0FELCBNUEVHU19TWU5DX0xPU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUdTX1NUT1ApOworICAgIH0KKyAgfQorCisgIGlmICgoZXJyID09IE1QU19PSykgJiYgIShjb250cm9sRmxhZ3MgJiBNUEVHU19CWVBBU1NNT0RFKSAmJgorICAgICAgIShwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+dXBtaXhUeXBlID09IFVQTUlYX1RZUEVfQllQQVNTKSkgeworICAgIFNwYXRpYWxEZWNDaGFubmVsUHJvcGVydGllcyhwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMsIGNoYW5uZWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlcywgbWFwRGVzY3IpOworICB9CisKK2JhaWw6CisKKyAgaWYgKG5ld0RhdGEpIHsKKyAgICAvKiBudW1QYXJhbWV0ZXJTZXRzUHJldiBzaGFsbCBvbmx5IGJlIHJlYWQgaW4gdGhlIGRlY29kZSBwcm9jZXNzLCBiZWNhdXNlIG9mCisgICAgICAgdGhhdCB3ZSBjYW4gdXBkYXRlIHRoaXMgc3RhdGUgdmFyaWFibGUgaGVyZSAqLworICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYy0+bnVtUGFyYW1ldGVyU2V0c1ByZXYgPQorICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZXNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdCisgICAgICAgICAgICAubnVtUGFyYW1ldGVyU2V0czsKKyAgfQorCisgIHJldHVybiAoZXJyKTsKK30KKworLyoqCisgKiBcYnJpZWYgRnJlZSBjb25maWcgZGVwZW5kZW50IE1QRUcgU3Vycm91bmQgbWVtb3J5LgorICoqLworU0FDREVDX0VSUk9SIG1wZWdTdXJyb3VuZERlY29kZXJfRnJlZU1lbSgKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXIgIT0gTlVMTCkgeworICAgIEZES19TcGF0aWFsRGVjQ2xvc2UocE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjKTsKKyAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBcYnJpZWYgQ2xvc2UgTVBFRyBTdXJyb3VuZCBkZWNvZGVyLgorICoqLwordm9pZCBtcGVnU3Vycm91bmREZWNvZGVyX0Nsb3NlKENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlcikgeworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXIgIT0gTlVMTCkgeworICAgIEZES19TcGF0aWFsRGVjQ2xvc2UocE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjKTsKKyAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMgPSBOVUxMOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOyBpKyspIHsKKyAgICAgIFNwYXRpYWxEZWNDbG9zZUJzRnJhbWUoJnBNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lc1tpXSk7CisgICAgfQorCisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHBNcGVnU3Vycm91bmREZWNvZGVyKTsKKyAgfQorfQorCisjZGVmaW5lIFNBQ0RFQ19WTDAgMgorI2RlZmluZSBTQUNERUNfVkwxIDAKKyNkZWZpbmUgU0FDREVDX1ZMMiAwCisKK2ludCBtcGVnU3Vycm91bmREZWNvZGVyX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pIHsKKyAgaW50IGk7CisKKyAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIHNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLworICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKKyAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpIGJyZWFrOworICB9CisgIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgcmV0dXJuIC0xOworCisgIGluZm8gKz0gaTsKKworICBpbmZvLT5tb2R1bGVfaWQgPSBGREtfTVBTREVDOworI2lmZGVmIF9fQU5EUk9JRF9fCisgIGluZm8tPmJ1aWxkX2RhdGUgPSAiIjsKKyAgaW5mby0+YnVpbGRfdGltZSA9ICIiOworI2Vsc2UKKyAgaW5mby0+YnVpbGRfZGF0ZSA9IF9fREFURV9fOworICBpbmZvLT5idWlsZF90aW1lID0gX19USU1FX187CisjZW5kaWYKKyAgaW5mby0+dGl0bGUgPSAiTVBFRyBTdXJyb3VuZCBEZWNvZGVyIjsKKyAgaW5mby0+dmVyc2lvbiA9IExJQl9WRVJTSU9OKFNBQ0RFQ19WTDAsIFNBQ0RFQ19WTDEsIFNBQ0RFQ19WTDIpOworICBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbyk7CisgIGluZm8tPmZsYWdzID0gMCB8IENBUEZfTVBTX0xEIHwgQ0FQRl9NUFNfVVNBQyB8IENBUEZfTVBTX0hRIHwKKyAgICAgICAgICAgICAgICBDQVBGX01QU18xQ0hfSU4gfCBDQVBGX01QU18yQ0hfT1VUOyAvKiBlbmQgZmxhZ3MgKi8KKworICByZXR1cm4gMDsKK30KKworU0FDREVDX0VSUk9SIG1wZWdTdXJyb3VuZERlY29kZXJfU2V0UGFyYW0oCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLCBjb25zdCBTQUNERUNfUEFSQU0gcGFyYW0sCisgICAgY29uc3QgSU5UIHZhbHVlKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIFNQQVRJQUxERUNfUEFSQU0gKnBVc2VyUGFyYW1zID0gTlVMTDsKKworICAvKiBjaGVjayBkZWNvZGVyIGhhbmRsZSAqLworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXIgIT0gTlVMTCkgeworICAgIC8qIGluaXQgbG9jYWwgc2hvcnRjdXRzICovCisgICAgcFVzZXJQYXJhbXMgPSAmcE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZFVzZXJQYXJhbXM7CisgIH0gZWxzZSB7CisgICAgZXJyID0gTVBTX0lOVkFMSURfSEFORExFOworICAgIC8qIGNoZWNrIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGJlZm9yZSBleGl0aW5nLiAqLworICB9CisKKyAgLyogYXBwbHkgcGFyYW0gdmFsdWUgKi8KKyAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgU0FDREVDX09VVFBVVF9NT0RFOgorICAgICAgc3dpdGNoICgoU0FDX0RFQ19PVVRQVVRfTU9ERSl2YWx1ZSkgeworICAgICAgICBjYXNlIFNBQ0RFQ19PVVRfTU9ERV9OT1JNQUw6CisgICAgICAgIGNhc2UgU0FDREVDX09VVF9NT0RFX1NURVJFTzoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICB9CisgICAgICBpZiAoZXJyID09IE1QU19PSykgeworICAgICAgICBpZiAoMCkgeworICAgICAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfSBlbHNlIGlmIChwVXNlclBhcmFtcy0+b3V0cHV0TW9kZSAhPSAoVUNIQVIpdmFsdWUpIHsKKyAgICAgICAgICBwVXNlclBhcmFtcy0+b3V0cHV0TW9kZSA9IChVQ0hBUil2YWx1ZTsKKyAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2RlcgorICAgICAgICAgICAgICAtPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gfD0KKyAgICAgICAgICAgICAgTVBFR1NfSU5JVF9DSEFOR0VfT1VUUFVUX01PREU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNERUNfSU5URVJGQUNFOgorICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHsKKyAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgfQorICAgICAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5tcGVnU3Vycm91bmRVc2VUaW1lSW50ZXJmYWNlICE9IChVQ0hBUil2YWx1ZSkgeworICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBlZ1N1cnJvdW5kVXNlVGltZUludGVyZmFjZSA9IChVQ0hBUil2YWx1ZTsKKyAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gfD0KKyAgICAgICAgICAgIE1QRUdTX0lOSVRfQ0hBTkdFX1RJTUVfRlJFUV9JTlRFUkZBQ0U7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0FDREVDX0JTX0lOVEVSUlVQVElPTjoKKyAgICAgIGlmICgoZXJyID09IE1QU19PSykgJiYgKHZhbHVlICE9IDApKSB7CisgICAgICAgIHVwZGF0ZU1wZWdTdXJyb3VuZERlY29kZXJTdGF0dXMocE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfSU5JVF9CU19JTlRFUlJVUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfU1lOQ19MT1NULCBNUEVHU19TVE9QKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNERUNfQ0xFQVJfSElTVE9SWToKKyAgICAgIGlmICgoZXJyID09IE1QU19PSykgJiYgKHZhbHVlICE9IDApKSB7CisgICAgICAgIC8qIEp1c3QgcmVzZXQgdGhlIHN0YXRlcyBhbmQgZ28gb24uICovCisgICAgICAgIHVwZGF0ZU1wZWdTdXJyb3VuZERlY29kZXJTdGF0dXMocE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfSU5JVF9DTEVBUl9ISVNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUdTX1NZTkNfTE9TVCwgTVBFR1NfU1RPUCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0FDREVDX0NPTkNFQUxfTlVNX0tFRVBfRlJBTUVTOgorICAgICAgaWYgKHZhbHVlIDwgMCkgeyAvKiBDaGVjayB2YWxpZCB2YWx1ZSByYW5nZSAqLworICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICB9CisgICAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBpZiAocFVzZXJQYXJhbXMtPmNvbmNlYWxOdW1LZWVwRnJhbWVzICE9IChVSU5UKXZhbHVlKSB7CisgICAgICAgIHBVc2VyUGFyYW1zLT5jb25jZWFsTnVtS2VlcEZyYW1lcyA9IChVSU5UKXZhbHVlOworICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSB8PQorICAgICAgICAgICAgTVBFR1NfSU5JVF9DSEFOR0VfQ09OQ0VBTF9QQVJBTVM7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0FDREVDX0NPTkNFQUxfRkFERV9PVVRfU0xPUEVfTEVOR1RIOgorICAgICAgaWYgKHZhbHVlIDwgMCkgeyAvKiBDaGVjayB2YWxpZCB2YWx1ZSByYW5nZSAqLworICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICB9CisgICAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBpZiAocFVzZXJQYXJhbXMtPmNvbmNlYWxGYWRlT3V0U2xvcGVMZW5ndGggIT0gKFVJTlQpdmFsdWUpIHsKKyAgICAgICAgcFVzZXJQYXJhbXMtPmNvbmNlYWxGYWRlT3V0U2xvcGVMZW5ndGggPSAoVUlOVCl2YWx1ZTsKKyAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gfD0KKyAgICAgICAgICAgIE1QRUdTX0lOSVRfQ0hBTkdFX0NPTkNFQUxfUEFSQU1TOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0RFQ19DT05DRUFMX0ZBREVfSU5fU0xPUEVfTEVOR1RIOgorICAgICAgaWYgKHZhbHVlIDwgMCkgeyAvKiBDaGVjayB2YWxpZCB2YWx1ZSByYW5nZSAqLworICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICB9CisgICAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBpZiAocFVzZXJQYXJhbXMtPmNvbmNlYWxGYWRlSW5TbG9wZUxlbmd0aCAhPSAoVUlOVCl2YWx1ZSkgeworICAgICAgICBwVXNlclBhcmFtcy0+Y29uY2VhbEZhZGVJblNsb3BlTGVuZ3RoID0gKFVJTlQpdmFsdWU7CisgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdIHw9CisgICAgICAgICAgICBNUEVHU19JTklUX0NIQU5HRV9DT05DRUFMX1BBUkFNUzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNERUNfQ09OQ0VBTF9OVU1fUkVMRUFTRV9GUkFNRVM6CisgICAgICBpZiAodmFsdWUgPCAwKSB7IC8qIENoZWNrIHZhbGlkIHZhbHVlIHJhbmdlICovCisgICAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIH0KKyAgICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGlmIChwVXNlclBhcmFtcy0+Y29uY2VhbE51bVJlbGVhc2VGcmFtZXMgIT0gKFVJTlQpdmFsdWUpIHsKKyAgICAgICAgcFVzZXJQYXJhbXMtPmNvbmNlYWxOdW1SZWxlYXNlRnJhbWVzID0gKFVJTlQpdmFsdWU7CisgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdIHw9CisgICAgICAgICAgICBNUEVHU19JTklUX0NIQU5HRV9DT05DRUFMX1BBUkFNUzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIGJyZWFrOworICB9IC8qIHN3aXRjaChwYXJhbSkgKi8KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKworU0FDREVDX0VSUk9SIG1wZWdTdXJyb3VuZERlY29kZXJfSXNQc2V1ZG9MUigKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIsIGludCAqYnNQc2V1ZG9McikgeworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXIgIT0gTlVMTCkgeworICAgIGNvbnN0IFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpzc2NEZWNvZGUgPQorICAgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXIKKyAgICAgICAgICAgICAtPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV07CisgICAgKmJzUHNldWRvTHIgPSAoaW50KXNzY0RlY29kZS0+YnNQc2V1ZG9McjsKKyAgICByZXR1cm4gTVBTX09LOworICB9IGVsc2UKKyAgICByZXR1cm4gTVBTX0lOVkFMSURfSEFORExFOworfQorCisvKioKKyAqIFxicmllZiBHZXQgdGhlIHNpZ25hbCBkZWxheSBjYXVzZWQgYnkgdGhlIE1QRUcgU3Vycm91bmQgZGVjb2RlciBtb2R1bGUuCisgKiovCitVSU5UIG1wZWdTdXJyb3VuZERlY29kZXJfR2V0RGVsYXkoY29uc3QgQ01wZWdTdXJyb3VuZERlY29kZXIgKnNlbGYpIHsKKyAgSU5UIG91dHB1dERlbGF5ID0gMDsKKworICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgY29uc3QgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnNzY0RlY29kZSA9CisgICAgICAgICZzZWxmLT5zcGF0aWFsU3BlY2lmaWNDb25maWdbc2VsZi0+YnNGcmFtZURlY29kZV07CisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjID0gc3NjRGVjb2RlLT5jb3JlQ29kZWM7CisKKyAgICAvKiBTZWUgY2hhcHRlciA0LjUgKGRlbGF5IGFuZCBzeW5jaHJvbml6YXRpb24pIG9mIElTTy9JRUMgRkRJUyAyMzAwMy0xIGFuZAorICAgICAgIGNoYXB0ZXIgNS40LjMgb2YgSVNPL0lFQyBGRElTIDIzMDAzLTIgZm9yIGRldGFpbHMgb24gdGhlIGZvbGxvd2luZworICAgICAgIGZpZ3VyZXMuICovCisKKyAgICBpZiAoY29yZUNvZGVjID4gQU9UX05VTExfT0JKRUNUKSB7CisgICAgICBpZiAoSVNfTE9XREVMQVkoY29yZUNvZGVjKSkgeworICAgICAgICAvKiBBbGwgbG93IGRlbGF5IHZhcmlhbnRzIChFUi1BQUMtKEUpTEQpOiAqLworICAgICAgICBvdXRwdXREZWxheSArPSAyNTY7CisgICAgICB9IGVsc2UgaWYgKCFJU19VU0FDKGNvcmVDb2RlYykpIHsKKyAgICAgICAgLyogQnkgdGhlIG1ldGhvZCBvZiBlbGltaW5hdGlvbiB0aGlzIGlzIHRoZSBHQSAoQUFDLUxDLCBIRS1BQUMsIC4uLikKKyAgICAgICAgICogYnJhbmNoOiAqLworICAgICAgICBvdXRwdXREZWxheSArPSAzMjAgKyAyNTc7IC8qIGNvcyB0byBleHAgZGVsYXkgKyBRTUYgc3ludGhlc2lzICovCisgICAgICAgIGlmIChzZWxmLT5tcGVnU3Vycm91bmRVc2VUaW1lSW50ZXJmYWNlKSB7CisgICAgICAgICAgb3V0cHV0RGVsYXkgKz0gMzIwICsgMzg0OyAvKiBRTUYgYW5kIGh5YnJpZCBhbmFseXNpcyAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIChvdXRwdXREZWxheSk7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19kZWNfc3NjX3N0cnVjdC5oIGIvbGliU0FDZGVjL3NyYy9zYWNfZGVjX3NzY19zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjdiNDY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfZGVjX3NzY19zdHJ1Y3QuaApAQCAtMCwwICsxLDI4MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBpbnRlcmZhY2UgLSBzcGF0aWFsIHNwZWNpZmljIGNvbmZpZyBzdHJ1Y3QKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNfREVDX1NTQ19TVFJVQ1RfSAorI2RlZmluZSBTQUNfREVDX1NTQ19TVFJVQ1RfSAorCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCisKKyNkZWZpbmUgTUFYX05VTV9RTUZfQkFORFMgKDEyOCkKKyNkZWZpbmUgTUFYX1RJTUVfU0xPVFMgNjQKKyNkZWZpbmUgTUFYX0lOUFVUX0NIQU5ORUxTIDEKKyNkZWZpbmUgTUFYX09VVFBVVF9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMiAvKiBDQVVUSU9OOiBUaGlzIGRvZXMgTk9UIHJlc3RyaWN0IHRoZSBudW1iZXIgb2YgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY2hhbm5lbHMgZXhjbHVzaXZlbHkhIEluIGFkZGl0aW9uIGl0IFwKKyAgICAgICBhZmZlY3RzIHRoZSBtYXggbnVtYmVyIG9mIGJpdHN0cmVhbSBhbmQgcmVzaWR1YWwgY2hhbm5lbHMhICovCisjZGVmaW5lIE1BWF9OVU1fT1RUICg1KQorI2RlZmluZSBNQVhfTlVNX1RUVCAoMCkKKyNkZWZpbmUgTUFYX05VTV9FWFRfVFlQRVMgKDgpCisjZGVmaW5lIE1BWF9QQVJBTUVURVJfQkFORFMgKDI4KQorI2RlZmluZSBNQVhfUEFSQU1FVEVSX0JBTkRTX0xEICgyMykKKworI2RlZmluZSBNQVhfTlVNX1hDSEFOTkVMUyAoNikKKworI2RlZmluZSBNQVhfQVJCSVRSQVJZX1RSRUVfTEVWRUxTICgwKQorCit0eXBlZGVmIGVudW0geworICAvKiBDQVVUSU9OOiBEbyBub3QgY2hhbmdlIGVudW0gdmFsdWVzISAqLworICBTUEFUSUFMREVDX0ZSRVFfUkVTXzQwID0gNDAsCisgIFNQQVRJQUxERUNfRlJFUV9SRVNfMjggPSAyOCwKKyAgU1BBVElBTERFQ19GUkVRX1JFU18yMyA9IDIzLAorICBTUEFUSUFMREVDX0ZSRVFfUkVTXzIwID0gMjAsCisgIFNQQVRJQUxERUNfRlJFUV9SRVNfMTUgPSAxNSwKKyAgU1BBVElBTERFQ19GUkVRX1JFU18xNCA9IDE0LAorICBTUEFUSUFMREVDX0ZSRVFfUkVTXzEyID0gMTIsCisgIFNQQVRJQUxERUNfRlJFUV9SRVNfMTAgPSAxMCwKKyAgU1BBVElBTERFQ19GUkVRX1JFU185ID0gOSwKKyAgU1BBVElBTERFQ19GUkVRX1JFU183ID0gNywKKyAgU1BBVElBTERFQ19GUkVRX1JFU181ID0gNSwKKyAgU1BBVElBTERFQ19GUkVRX1JFU180ID0gNAorCit9IFNQQVRJQUxERUNfRlJFUV9SRVM7CisKK3R5cGVkZWYgZW51bSB7CisKKyAgU1BBVElBTERFQ19RVUFOVF9GSU5FX0RFRiA9IDAsCisgIFNQQVRJQUxERUNfUVVBTlRfRURRMSA9IDEsCisgIFNQQVRJQUxERUNfUVVBTlRfRURRMiA9IDIsCisgIFNQQVRJQUxERUNfUVVBTlRfUlNWRDMgPSAzLAorICBTUEFUSUFMREVDX1FVQU5UX1JTVkQ0ID0gNCwKKyAgU1BBVElBTERFQ19RVUFOVF9SU1ZENSA9IDUsCisgIFNQQVRJQUxERUNfUVVBTlRfUlNWRDYgPSA2LAorICBTUEFUSUFMREVDX1FVQU5UX1JTVkQ3ID0gNworCit9IFNQQVRJQUxERUNfUVVBTlRfTU9ERTsKKwordHlwZWRlZiBlbnVtIHsgU1BBVElBTERFQ19NT0RFX1JTVkQ3ID0gNyB9IFNQQVRJQUxERUNfVFJFRV9DT05GSUc7CisKK3R5cGVkZWYgZW51bSB7CisKKyAgU1BBVElBTERFQ19HQUlOX01PREUwID0gMCwKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQxID0gMSwKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQyID0gMiwKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQzID0gMywKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQ0ID0gNCwKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQ1ID0gNSwKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQ2ID0gNiwKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQ3ID0gNywKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQ4ID0gOCwKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQ5ID0gOSwKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQxMCA9IDEwLAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDExID0gMTEsCisgIFNQQVRJQUxERUNfR0FJTl9SU1ZEMTIgPSAxMiwKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQxMyA9IDEzLAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDE0ID0gMTQsCisgIFNQQVRJQUxERUNfR0FJTl9SU1ZEMTUgPSAxNQorCit9IFNQQVRJQUxERUNfRklYRURfR0FJTlM7CisKK3R5cGVkZWYgZW51bSB7CisKKyAgU1BBVElBTERFQ19UU19UUE5PV0hJVEUgPSAwLAorICBTUEFUSUFMREVDX1RTX1RQV0hJVEUgPSAxLAorICBTUEFUSUFMREVDX1RTX1RFUyA9IDIsCisgIFNQQVRJQUxERUNfVFNfTk9UUyA9IDMsCisgIFNQQVRJQUxERUNfVFNfUlNWRDQgPSA0LAorICBTUEFUSUFMREVDX1RTX1JTVkQ1ID0gNSwKKyAgU1BBVElBTERFQ19UU19SU1ZENiA9IDYsCisgIFNQQVRJQUxERUNfVFNfUlNWRDcgPSA3LAorICBTUEFUSUFMREVDX1RTX1JTVkQ4ID0gOCwKKyAgU1BBVElBTERFQ19UU19SU1ZEOSA9IDksCisgIFNQQVRJQUxERUNfVFNfUlNWRDEwID0gMTAsCisgIFNQQVRJQUxERUNfVFNfUlNWRDExID0gMTEsCisgIFNQQVRJQUxERUNfVFNfUlNWRDEyID0gMTIsCisgIFNQQVRJQUxERUNfVFNfUlNWRDEzID0gMTMsCisgIFNQQVRJQUxERUNfVFNfUlNWRDE0ID0gMTQsCisgIFNQQVRJQUxERUNfVFNfUlNWRDE1ID0gMTUKKworfSBTUEFUSUFMREVDX1RTX0NPTkY7CisKK3R5cGVkZWYgZW51bSB7CisKKyAgU1BBVElBTERFQ19ERUNPUlJfTU9ERTAgPSAwLAorICBTUEFUSUFMREVDX0RFQ09SUl9NT0RFMSA9IDEsCisgIFNQQVRJQUxERUNfREVDT1JSX01PREUyID0gMiwKKyAgU1BBVElBTERFQ19ERUNPUlJfUlNWRDMgPSAzLAorICBTUEFUSUFMREVDX0RFQ09SUl9SU1ZENCA9IDQsCisgIFNQQVRJQUxERUNfREVDT1JSX1JTVkQ1ID0gNSwKKyAgU1BBVElBTERFQ19ERUNPUlJfUlNWRDYgPSA2LAorICBTUEFUSUFMREVDX0RFQ09SUl9SU1ZENyA9IDcsCisgIFNQQVRJQUxERUNfREVDT1JSX1JTVkQ4ID0gOCwKKyAgU1BBVElBTERFQ19ERUNPUlJfUlNWRDkgPSA5LAorICBTUEFUSUFMREVDX0RFQ09SUl9SU1ZEMTAgPSAxMCwKKyAgU1BBVElBTERFQ19ERUNPUlJfUlNWRDExID0gMTEsCisgIFNQQVRJQUxERUNfREVDT1JSX1JTVkQxMiA9IDEyLAorICBTUEFUSUFMREVDX0RFQ09SUl9SU1ZEMTMgPSAxMywKKyAgU1BBVElBTERFQ19ERUNPUlJfUlNWRDE0ID0gMTQsCisgIFNQQVRJQUxERUNfREVDT1JSX1JTVkQxNSA9IDE1CisKK30gU1BBVElBTERFQ19ERUNPUlJfQ09ORjsKKwordHlwZWRlZiBzdHJ1Y3QgVF9TUEFUSUFMREVDX09UVF9DT05GIHsKKyAgaW50IG5PdHRCYW5kczsKKworfSBTUEFUSUFMREVDX09UVF9DT05GOworCit0eXBlZGVmIHN0cnVjdCBUX1NQQVRJQUxERUNfUkVTSURVQUxfQ09ORiB7CisgIGludCBiUmVzaWR1YWxQcmVzZW50OworICBpbnQgblJlc2lkdWFsQmFuZHM7CisKK30gU1BBVElBTERFQ19SRVNJRFVBTF9DT05GOworCit0eXBlZGVmIHN0cnVjdCBUX1NQQVRJQUxfU1BFQ0lGSUNfQ09ORklHIHsKKyAgVUlOVCBzeW50YXhGbGFnczsKKyAgaW50IHNhbXBsaW5nRnJlcTsKKyAgaW50IG5UaW1lU2xvdHM7CisgIFNQQVRJQUxERUNfRlJFUV9SRVMgZnJlcVJlczsKKyAgU1BBVElBTERFQ19UUkVFX0NPTkZJRyB0cmVlQ29uZmlnOworICBTUEFUSUFMREVDX1FVQU5UX01PREUgcXVhbnRNb2RlOworICBpbnQgYkFyYml0cmFyeURvd25taXg7CisKKyAgaW50IGJSZXNpZHVhbENvZGluZzsKKyAgU1BBVElBTERFQ19GSVhFRF9HQUlOUyBic0ZpeGVkR2FpbkRNWDsKKworICBTUEFUSUFMREVDX1RTX0NPTkYgdGVtcFNoYXBlQ29uZmlnOworICBTUEFUSUFMREVDX0RFQ09SUl9DT05GIGRlY29yckNvbmZpZzsKKworICBpbnQgbklucHV0Q2hhbm5lbHM7ICAvKiBkZXJpdmVkIGZyb20gIHRyZWVDb25maWcgKi8KKyAgaW50IG5PdXRwdXRDaGFubmVsczsgLyogZGVyaXZlZCBmcm9tICB0cmVlQ29uZmlnICovCisKKyAgLyogb3R0IGNvbmZpZyAqLworICBpbnQgbk90dEJveGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlcml2ZWQgZnJvbSAgdHJlZUNvbmZpZyAqLworICBTUEFUSUFMREVDX09UVF9DT05GIE90dENvbmZpZ1tNQVhfTlVNX09UVF07IC8qIGRpbWVuc2lvbiBuT3R0Qm94ZXMgKi8KKworICAvKiB0dHQgY29uZmlnICovCisgIGludCBuVHR0Qm94ZXM7IC8qIGRlcml2ZWQgZnJvbSAgdHJlZUNvbmZpZyAqLworCisgIC8qIHJlc2lkdWFsIGNvbmZpZyAqLworICBTUEFUSUFMREVDX1JFU0lEVUFMX0NPTkYKKyAgUmVzaWR1YWxDb25maWdbTUFYX05VTV9PVFQgKworICAgICAgICAgICAgICAgICBNQVhfTlVNX1RUVF07IC8qIGRpbWVuc2lvbiAobk90dEJveGVzICsgblR0dEJveGVzKSAqLworCisgIGludCBzYWNFeHRDbnQ7CisgIGludCBzYWNFeHRUeXBlW01BWF9OVU1fRVhUX1RZUEVTXTsKKyAgaW50IGVudlF1YW50TW9kZTsKKworICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWM7CisKKyAgVUNIQVIgc3RlcmVvQ29uZmlnSW5kZXg7CisgIFVDSEFSIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4OyAvKiBUYWJsZSA3MCBpbiBJU08vSUVDIEZESVMgMjMwMDMtMzoyMDExICovCisgIFVDSEFSIGJzSGlnaFJhdGVNb2RlOworICBVQ0hBUiBic0RlY29yclR5cGU7CisgIFVDSEFSIGJzUHNldWRvTHI7CisgIFVDSEFSIGJzUGhhc2VDb2Rpbmc7CisgIFVDSEFSIGJzT3R0QmFuZHNQaGFzZVByZXNlbnQ7CisgIGludCBic090dEJhbmRzUGhhc2U7CisKKyAgU0NIQVIgb3R0Q0xEZGVmYXVsdFtNQVhfTlVNX09UVF07CisgIFVDSEFSIG51bU90dEJhbmRzSVBEOworICBVQ0hBUiBiaXRzdHJlYW1PdHRCYW5kc1tNQVhfTlVNX09UVF07CisgIFVDSEFSIG51bU90dEJhbmRzW01BWF9OVU1fT1RUXTsKKworfSBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRzsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19wcm9jZXNzLmNwcCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3Byb2Nlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzcyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19wcm9jZXNzLmNwcApAQCAtMCwwICsxLDEwNjYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIFByb2Nlc3NpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGF0YSBzdHJ1Y3R1cmVzIGFuZCBpbnRlcmZhY2VzIGZvciBzcGF0aWFsIGF1ZGlvIHJlZmVyZW5jZSBzb2Z0d2FyZSAqLworI2luY2x1ZGUgInNhY19wcm9jZXNzLmgiCisKKyNpbmNsdWRlICJzYWNfYml0ZGVjLmgiCisjaW5jbHVkZSAic2FjX2NhbGNNMWFuZE0yLmgiCisjaW5jbHVkZSAic2FjX3Ntb290aGluZy5oIgorI2luY2x1ZGUgInNhY19yb20uaCIKKworI2luY2x1ZGUgInNhY19kZWNfZXJyb3Jjb2Rlcy5oIgorCisjaW5jbHVkZSAiRkRLX3RyaWdGY3RzLmgiCisjaW5jbHVkZSAiRkRLX2RlY29ycmVsYXRlLmgiCisKKy8qKgorICogXGJyaWVmICBMaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBwYXJhbWV0ZXIgdmFsdWVzLgorICogICAgICAgICBhKmFscGhhICsgYiooMS1hbHBoYSkKKyAqICAgICAgID0gYSphbHBoYSArIGIgLSBiKmFscGhhCisgKgorICogXHBhcmFtIGFscGhhICAgICAgICAgICAgICAgV2VpZ2h0aW5nIGZhY3Rvci4KKyAqIFxwYXJhbSBhICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBhLgorICogXHBhcmFtIGIgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIGIuCisgKgorICogXHJldHVybiBJbnRlcnBvbGF0ZWQgcGFyYW1ldGVyIHZhbHVlLgorICovCitGREtfSU5MSU5FIEZJWFBfREJMIGludGVycG9sYXRlUGFyYW1ldGVyKGNvbnN0IEZJWFBfU0dMIGFscGhhLCBjb25zdCBGSVhQX0RCTCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBiKSB7CisgIHJldHVybiAoYiAtIGZNdWx0KGFscGhhLCBiKSArIGZNdWx0KGFscGhhLCBhKSk7Cit9CisKKy8qKgorICogXGJyaWVmIE1hcCBNUEVHIFN1cnJvdW5kIGNoYW5uZWwgaW5kaWNlcyB0byBNUEVHIDQgUENFIGxpa2UgY2hhbm5lbCBpbmRpY2VzLgorICogXHBhcmFtIHNlbGYgU3BhdGlhbCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBjaCBNUEVHIFN1cnJvdW5kIGNoYW5uZWwgaW5kZXguCisgKiBccmV0dXJuIE1QRUcgNCBQQ0Ugc3R5bGUgY2hhbm5lbCBpbmRleCwgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gTVBFRworICogU3Vycm91bmQgY2hhbm5lbCBpbmRleC4KKyAqLworc3RhdGljIFVJTlQgbWFwQ2hhbm5lbChzcGF0aWFsRGVjICpzZWxmLCBVSU5UIGNoKSB7CisgIHN0YXRpYyBjb25zdCBVQ0hBUiBjaGFuZWxJZHhbXVs4XSA9IHsKKyAgICAgIHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3fSwgLyogIGJpbmF1cmFsLCBUUkVFXzIxMiwgYXJiaXRyYXJ5IHRyZWUgKi8KKyAgfTsKKworICBpbnQgaWR4ID0gMDsKKworICByZXR1cm4gKGNoYW5lbElkeFtpZHhdW2NoXSk7Cit9CisKK0ZJWFBfREJMIGdldENoR2FpbihzcGF0aWFsRGVjICpzZWxmLCBVSU5UIGNoLCBJTlQgKnNjYWxlKSB7CisgIC8qIGluaXQgbm8gZ2FpbiBtb2RpZmllciAqLworICBGSVhQX0RCTCBnYWluID0gMHg4MDAwMDAwMDsKKyAgKnNjYWxlID0gMDsKKworICBpZiAoKCFpc1R3b0NoTW9kZShzZWxmLT51cG1peFR5cGUpKSAmJgorICAgICAgKHNlbGYtPnVwbWl4VHlwZSAhPSBVUE1JWFRZUEVfQllQQVNTKSkgeworICAgIGlmICgoY2ggPT0gMCkgfHwgKGNoID09IDEpIHx8IChjaCA9PSAyKSkgeworICAgICAgLyogbm8gbW9kaWZpZXIgKi8KKyAgICB9CisgIH0KKworICByZXR1cm4gZ2FpbjsKK30KKworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNRTUZBbmFseXNpcyhzcGF0aWFsRGVjICpzZWxmLCBjb25zdCBQQ01fTVBTICppbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB0cywgY29uc3QgSU5UIGJ5cGFzc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mUmVhbCwgRklYUF9EQkwgKipxbWZJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtSW5wdXRDaGFubmVscykgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBpbnQgY2gsIG9mZnNldDsKKworICBvZmZzZXQgPSBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc1N5bnRoZXNpcyAqCisgICAgICAgICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYublFtZlRpbWVTbG90czsKKworICB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgbnVtSW5wdXRDaGFubmVsczsgY2grKykgeworICAgICAgY29uc3QgUENNX01QUyAqaW5TYW1wbGVzID0KKyAgICAgICAgICAmaW5EYXRhW3RzICogc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uQmFuZHNBbmFseXNpc107CisgICAgICBGSVhQX0RCTCAqcFFtZlJlYWxBbmFseXNpcyA9IHFtZlJlYWxbY2hdOyAvKiBubyBkZWxheSBpbiBibGluZCBtb2RlICovCisgICAgICBGSVhQX0RCTCAqcFFtZkltYWdBbmFseXNpcyA9IHFtZkltYWdbY2hdOworCisgICAgICBDYWxjdWxhdGVTcGFjZUFuYWx5c2lzUW1mKCZzZWxmLT5wUW1mRG9tYWluLT5RbWZEb21haW5JbltjaF0uZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2FtcGxlcyArIChjaCAqIG9mZnNldCksIHBRbWZSZWFsQW5hbHlzaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnQW5hbHlzaXMpOworCisgICAgICBpZiAoIWlzVHdvQ2hNb2RlKHNlbGYtPnVwbWl4VHlwZSkgJiYgIWJ5cGFzc01vZGUpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5xbWZCYW5kczsgaSsrKSB7CisgICAgICAgICAgcW1mUmVhbFtjaF1baV0gPSBmTXVsdChxbWZSZWFsW2NoXVtpXSwgc2VsZi0+Y2xpcFByb3RlY3RHYWluX19GREspOworICAgICAgICAgIHFtZkltYWdbY2hdW2ldID0gZk11bHQocW1mSW1hZ1tjaF1baV0sIHNlbGYtPmNsaXBQcm90ZWN0R2Fpbl9fRkRLKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHNlbGYtPnFtZklucHV0RGVsYXlCdWZQb3MgPQorICAgICAgKHNlbGYtPnFtZklucHV0RGVsYXlCdWZQb3MgKyAxKSAlIHNlbGYtPnBjX2ZpbHRlcmRlbGF5OworCisgIHJldHVybiBlcnI7Cit9CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjRmVlZFFNRihzcGF0aWFsRGVjICpzZWxmLCBGSVhQX0RCTCAqKnFtZkluRGF0YVJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZJbkRhdGFJbWFnLCBjb25zdCBJTlQgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJ5cGFzc01vZGUsIEZJWFBfREJMICoqcW1mUmVhbF9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mSW1hZ19fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1JbnB1dENoYW5uZWxzKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIGludCBjaDsKKworICB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgbnVtSW5wdXRDaGFubmVsczsgY2grKykgeworICAgICAgRklYUF9EQkwgKnBRbWZSZWFsQW5hbHlzaXMgPQorICAgICAgICAgIHFtZlJlYWxfX0ZES1tjaF07IC8qIG5vIGRlbGF5IGluIGJsaW5kIG1vZGUgKi8KKyAgICAgIEZJWFBfREJMICpwUW1mSW1hZ0FuYWx5c2lzID0gcW1mSW1hZ19fRkRLW2NoXTsKKworICAgICAgLyogV3JpdGUgSW5wdXQgZGF0YSB0byBwUW1mUmVhbEFuYWx5c2lzLiAqLworICAgICAgaWYgKHNlbGYtPmJTaGFyZURlbGF5V2l0aFNCUikgeworICAgICAgICBGREtfUW1mRG9tYWluX0dldFNsb3QoCisgICAgICAgICAgICAmc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluSW5bY2hdLCB0cyArIEhZQlJJRF9GSUxURVJfREVMQVksIDAsCisgICAgICAgICAgICBNQVhfUU1GX0JBTkRTX1RPX0hZQlJJRCwgcFFtZlJlYWxBbmFseXNpcywgcFFtZkltYWdBbmFseXNpcywgMTUpOworICAgICAgICBGREtfUW1mRG9tYWluX0dldFNsb3QoJnNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbkluW2NoXSwgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUU1GX0JBTkRTX1RPX0hZQlJJRCwgc2VsZi0+cW1mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mUmVhbEFuYWx5c2lzLCBwUW1mSW1hZ0FuYWx5c2lzLCAxNSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBGREtfUW1mRG9tYWluX0dldFNsb3QoJnNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbkluW2NoXSwgdHMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5xbWZCYW5kcywgcFFtZlJlYWxBbmFseXNpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnQW5hbHlzaXMsIDE1KTsKKyAgICAgIH0KKyAgICAgIGlmICh0cyA9PSBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5RbWZUaW1lU2xvdHMgLSAxKSB7CisgICAgICAgIC8qIElzIGN1cnJlbnRseSBhbHNvIG5lZWRlZCBpbiBjYXNlIHdlIGRvbnQgaGF2ZSBhbnkgb3ZlcmxhcC4gV2UgbmVlZCB0bworICAgICAgICAgKiBzYXZlIGxiX3NjYWxlIHRvIG92X2xiX3NjYWxlICovCisgICAgICAgIEZES19RbWZEb21haW5fU2F2ZU92ZXJsYXAoJnNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbkluW2NoXSwgMCk7CisgICAgICB9CisKKyAgICAgIC8qIEFwcGx5IGNsaXAgcHJvdGVjdGlvbiB0byBvdXRwdXQuICovCisgICAgICBpZiAoIWlzVHdvQ2hNb2RlKHNlbGYtPnVwbWl4VHlwZSkgJiYgIWJ5cGFzc01vZGUpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5xbWZCYW5kczsgaSsrKSB7CisgICAgICAgICAgcW1mUmVhbF9fRkRLW2NoXVtpXSA9CisgICAgICAgICAgICAgIGZNdWx0KHFtZlJlYWxfX0ZES1tjaF1baV0sIHNlbGYtPmNsaXBQcm90ZWN0R2Fpbl9fRkRLKTsKKyAgICAgICAgICBxbWZJbWFnX19GREtbY2hdW2ldID0KKyAgICAgICAgICAgICAgZk11bHQocW1mSW1hZ19fRkRLW2NoXVtpXSwgc2VsZi0+Y2xpcFByb3RlY3RHYWluX19GREspOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9IC8qIEVuZCBvZiBsb29wIG92ZXIgbnVtSW5wdXRDaGFubmVscyAqLworICB9CisKKyAgc2VsZi0+cW1mSW5wdXREZWxheUJ1ZlBvcyA9CisgICAgICAoc2VsZi0+cW1mSW5wdXREZWxheUJ1ZlBvcyArIDEpICUgc2VsZi0+cGNfZmlsdGVyZGVsYXk7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IFNwYXRpYWxEZWNIeWJyaWRBbmFseXNpcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgSW5wdXQ6CisgIGZsb2F0KiogcG9pbnRlcnNbNF0gbGVmdFJlYWwsIGxlZnRJbSwgcmlnaHRSZWFsLCByaWdodEltCisKKyBPdXRwdXQ6CisgIGZsb2F0IHNlbGYtPnFtZklucHV0UmVhbFtNQVhfSU5QVVRfQ0hBTk5FTFNdW01BWF9USU1FX1NMT1RTXVtNQVhfUU1GX0JBTkRTXTsKKyAgZmxvYXQgc2VsZi0+cW1mSW5wdXRJbWFnW01BWF9JTlBVVF9DSEFOTkVMU11bTUFYX1RJTUVfU0xPVFNdW01BWF9RTUZfQkFORFNdOworCisgIGZsb2F0CitzZWxmLT5oeWJJbnB1dFJlYWxbTUFYX0lOUFVUX0NIQU5ORUxTXVtNQVhfVElNRV9TTE9UU11bTUFYX0hZQlJJRF9CQU5EU107IGZsb2F0CitzZWxmLT5oeWJJbnB1dEltYWdbTUFYX0lOUFVUX0NIQU5ORUxTXVtNQVhfVElNRV9TTE9UU11bTUFYX0hZQlJJRF9CQU5EU107CisKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjSHlicmlkQW5hbHlzaXMoc3BhdGlhbERlYyAqc2VsZiwgRklYUF9EQkwgKipxbWZJbnB1dFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mSW5wdXRJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0SW1hZywgY29uc3QgSU5UIHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtSW5wdXRDaGFubmVscykgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBpbnQgY2g7CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgbnVtSW5wdXRDaGFubmVsczsKKyAgICAgICBjaCsrKSAvKiBoeWJyaWQgZmlsdGVyaW5nIGZvciBkb3duLW1peCBzaWduYWxzICovCisgIHsKKyAgICBpZiAoc2VsZi0+cENvbmZpZ0N1cnJlbnQtPnN5bnRheEZsYWdzICYgU0FDREVDX1NZTlRBWF9MRCkgeworICAgICAgaW50IGs7CisgICAgICAvKiBObyBoeWJyaWQgZmlsdGVyaW5nLiBKdXN0IGNvcHkgdGhlIFFNRiBkYXRhLiAqLworICAgICAgZm9yIChrID0gMDsgayA8IHNlbGYtPmh5YnJpZEJhbmRzOyBrICs9IDEpIHsKKyAgICAgICAgaHliT3V0cHV0UmVhbFtjaF1ba10gPSBxbWZJbnB1dFJlYWxbY2hdW2tdOworICAgICAgICBoeWJPdXRwdXRJbWFnW2NoXVtrXSA9IHFtZklucHV0SW1hZ1tjaF1ba107CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNlbGYtPmh5YnJpZEFuYWx5c2lzW2NoXS5oZk1vZGUgPSBzZWxmLT5iU2hhcmVEZWxheVdpdGhTQlI7CisKKyAgICAgIGlmIChzZWxmLT5zdGVyZW9Db25maWdJbmRleCA9PSAzKQorICAgICAgICBGREtfQVNTRVJUKHNlbGYtPmh5YnJpZEFuYWx5c2lzW2NoXS5oZk1vZGUgPT0gMCk7CisgICAgICBGREtoeWJyaWRBbmFseXNpc0FwcGx5KCZzZWxmLT5oeWJyaWRBbmFseXNpc1tjaF0sIHFtZklucHV0UmVhbFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZklucHV0SW1hZ1tjaF0sIGh5Yk91dHB1dFJlYWxbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJPdXRwdXRJbWFnW2NoXSk7CisgICAgfQorICB9CisKKyAgaWYgKChzZWxmLT5wQ29uZmlnQ3VycmVudC0+c3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX1VTQUMpICYmCisgICAgICBzZWxmLT5yZXNpZHVhbENvZGluZykgeworICAgIHNlbGYtPmh5YnJpZEFuYWx5c2lzW251bUlucHV0Q2hhbm5lbHNdLmhmTW9kZSA9IDA7CisgICAgRkRLaHlicmlkQW5hbHlzaXNBcHBseSgKKyAgICAgICAgJnNlbGYtPmh5YnJpZEFuYWx5c2lzW251bUlucHV0Q2hhbm5lbHNdLAorICAgICAgICBzZWxmLT5xbWZSZXNpZHVhbFJlYWxfX0ZES1swXVswXSwgc2VsZi0+cW1mUmVzaWR1YWxJbWFnX19GREtbMF1bMF0sCisgICAgICAgIHNlbGYtPmh5YlJlc2lkdWFsUmVhbF9fRkRLWzBdLCBzZWxmLT5oeWJSZXNpZHVhbEltYWdfX0ZES1swXSk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0NyZWF0ZVgoc3BhdGlhbERlYyAqc2VsZiwgRklYUF9EQkwgKipoeWJJbnB1dFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJJbnB1dEltYWcsIEZJWFBfREJMICoqcHhSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcHhJbWFnKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIGludCByb3c7CisKKyAgLyogQ3JlYXRpbmcgd0RyeSAqLworICBmb3IgKHJvdyA9IDA7IHJvdyA8IHNlbGYtPm51bUlucHV0Q2hhbm5lbHM7IHJvdysrKSB7CisgICAgLyogcG9pbnRlciB0byBkaXJlY3Qgc2lnbmFscyAqLworICAgIHB4UmVhbFtyb3ddID0gaHliSW5wdXRSZWFsW3Jvd107CisgICAgcHhJbWFnW3Jvd10gPSBoeWJJbnB1dEltYWdbcm93XTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIE0yUGFyYW1Ub0tlcm5lbE11bHQoRklYUF9TR0wgKlJFU1RSSUNUIHBLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBNcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBNcGFyYW1QcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKlJFU1RSSUNUIHBXaWR0aCwgRklYUF9TR0wgYWxwaGFfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5CYW5kcykgeworICBpbnQgcGI7CisKKyAgZm9yIChwYiA9IDA7IHBiIDwgbkJhbmRzOyBwYisrKSB7CisgICAgRklYUF9TR0wgdG1wID0gRlhfREJMMkZYX1NHTCgKKyAgICAgICAgaW50ZXJwb2xhdGVQYXJhbWV0ZXIoYWxwaGFfX0ZESywgTXBhcmFtW3BiXSwgTXBhcmFtUHJldltwYl0pKTsKKworICAgIGludCBpID0gcFdpZHRoW3BiXTsKKyAgICBpZiAoaSAmIDEpICpwS2VybmVsKysgPSB0bXA7CisgICAgaWYgKGkgJiAyKSB7CisgICAgICAqcEtlcm5lbCsrID0gdG1wOworICAgICAgKnBLZXJuZWwrKyA9IHRtcDsKKyAgICB9CisgICAgZm9yIChpID4+PSAyOyBpLS07KSB7CisgICAgICAqcEtlcm5lbCsrID0gdG1wOworICAgICAgKnBLZXJuZWwrKyA9IHRtcDsKKyAgICAgICpwS2VybmVsKysgPSB0bXA7CisgICAgICAqcEtlcm5lbCsrID0gdG1wOworICAgIH0KKyAgfQorfQorCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0FwcGx5TTFfQ3JlYXRlV19Nb2RlMjEyKAorICAgIHNwYXRpYWxEZWMgKnNlbGYsIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLCBGSVhQX0RCTCAqKnhSZWFsLAorICAgIEZJWFBfREJMICoqeEltYWcsIEZJWFBfREJMICoqdlJlYWwsIEZJWFBfREJMICoqdkltYWcpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgaW50IHJlczsKKyAgRklYUF9EQkwgKmRlY29yckluUmVhbCA9IHZSZWFsWzBdOworICBGSVhQX0RCTCAqZGVjb3JySW5JbWFnID0gdkltYWdbMF07CisKKyAgLyogTTEgZG9lcyBub3QgZG8gYW55dGhpbmcgaW4gMjEyIG1vZGUsIHNvIHVzZSBzaW1wbGlmaWVkIHByb2Nlc3NpbmcgKi8KKyAgRkRLX0FTU0VSVChzZWxmLT5udW1WQ2hhbm5lbHMgPT0gMik7CisgIEZES19BU1NFUlQoc2VsZi0+bnVtRGlyZWt0U2lnbmFscyA9PSAxKTsKKyAgRkRLX0FTU0VSVChzZWxmLT5udW1EZWNvclNpZ25hbHMgPT0gMSk7CisgIEZES21lbWNweSh2UmVhbFswXSwgeFJlYWxbMF0sIHNlbGYtPmh5YnJpZEJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNweSh2SW1hZ1swXSwgeEltYWdbMF0sIHNlbGYtPmh5YnJpZEJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgaWYgKGlzVHNkQWN0aXZlKGZyYW1lLT5Uc2REYXRhKSkgeworICAgIC8qIEdlbmVyYXRlIHZfe3gsbm9uVHJ9IGFzIGlucHV0IGZvciBhbGxwYXNzIGJhc2VkIGRlY29ycmVsYXRvciAqLworICAgIFRzZEdlbmVyYXRlTm9uVHIoc2VsZi0+aHlicmlkQmFuZHMsIGZyYW1lLT5Uc2REYXRhLCBzZWxmLT5Uc2RUcywgdlJlYWxbMF0sCisgICAgICAgICAgICAgICAgICAgICB2SW1hZ1swXSwgdlJlYWxbMV0sIHZJbWFnWzFdLCAmZGVjb3JySW5SZWFsLAorICAgICAgICAgICAgICAgICAgICAgJmRlY29yckluSW1hZyk7CisgIH0KKyAgLyogLSBEZWNvcnJlbGF0ZSAqLworICByZXMgPSBTcGF0aWFsRGVjR2V0UmVzaWR1YWxJbmRleChzZWxmLCAxKTsKKyAgaWYgKEZES2RlY29ycmVsYXRlQXBwbHkoJnNlbGYtPmFwRGVjb3JbMF0sIGRlY29yckluUmVhbCwgZGVjb3JySW5JbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2UmVhbFsxXSwgdkltYWdbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBhcmFtMmh5YltzZWxmLT5yZXNpZHVhbEJhbmRzW3Jlc11dKSkgeworICAgIHJldHVybiBNUFNfTk9UT0s7CisgIH0KKyAgaWYgKGlzVHNkQWN0aXZlKGZyYW1lLT5Uc2REYXRhKSkgeworICAgIC8qIEdlbmVyYXRlIHZfe3gsVHJ9LCBhcHBseSB0cmFuc2llbnQgZGVjb3JyZWxhdG9yIGFuZCBhZGQgdG8gYWxscGFzcyBiYXNlZAorICAgICAqIGRlY29ycmVsYXRvciBvdXRwdXQgKi8KKyAgICBUc2RBcHBseShzZWxmLT5oeWJyaWRCYW5kcywgZnJhbWUtPlRzZERhdGEsICZzZWxmLT5Uc2RUcywKKyAgICAgICAgICAgICB2UmVhbFswXSwgLyogaW5wdXQ6IHZfeCAqLworICAgICAgICAgICAgIHZJbWFnWzBdLAorICAgICAgICAgICAgIHZSZWFsWzFdLCAvKiBpbnB1dDogZF97eCxub25Ucn07IG91dHB1dDogZF97eCxub25Ucn0gKyBkX3t4LFRyfSAqLworICAgICAgICAgICAgIHZJbWFnWzFdKTsKKyAgfQorCisgIC8qIFdyaXRlIHJlc2lkdWFsIHNpZ25hbCBpbiBhcHByb3JpYXRlIHBhcmFtZXRlciBiYW5kcyAqLworICBpZiAoc2VsZi0+cmVzaWR1YWxCYW5kc1tyZXNdID4gMCkgeworICAgIGludCBzdG9wQmFuZCA9IHNlbGYtPnBhcmFtMmh5YltzZWxmLT5yZXNpZHVhbEJhbmRzW3Jlc11dOworICAgIEZES21lbWNweSh2UmVhbFsxXSwgc2VsZi0+aHliUmVzaWR1YWxSZWFsX19GREtbcmVzXSwKKyAgICAgICAgICAgICAgZml4TWluKHN0b3BCYW5kLCBzZWxmLT5oeWJyaWRCYW5kcykgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBGREttZW1jcHkodkltYWdbMV0sIHNlbGYtPmh5YlJlc2lkdWFsSW1hZ19fRkRLW3Jlc10sCisgICAgICAgICAgICAgIGZpeE1pbihzdG9wQmFuZCwgc2VsZi0+aHlicmlkQmFuZHMpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIH0gLyogKHNlbGYtPnJlc2lkdWFsQmFuZHNbcmVzXT4wKSAqLworCisgIHJldHVybiBlcnI7Cit9CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQXBwbHlNMl9Nb2RlMjEyKHNwYXRpYWxEZWMgKnNlbGYsIElOVCBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGFscGhhLCBGSVhQX0RCTCAqKndSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKip3SW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbERyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0SW1hZ0RyeSkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBJTlQgcm93OworCisgIElOVCAqcFdpZHRoID0gc2VsZi0+a2VybmVsc193aWR0aDsKKyAgLyogZm9yIHN0ZXJlb0NvbmZpZ0luZGV4ID09IDMgY2FzZSBoeWJyaWRCYW5kcyBpcyA8IDcxICovCisgIElOVCBwYl9tYXggPSBzZWxmLT5rZXJuZWxzW3NlbGYtPmh5YnJpZEJhbmRzIC0gMV0gKyAxOworICBJTlQgbWF4X3JvdyA9IHNlbGYtPm51bU91dHB1dENoYW5uZWxzOworCisgIElOVCBNMl9leHAgPSAwOworICBpZiAoc2VsZi0+cmVzaWR1YWxDb2RpbmcpIE0yX2V4cCA9IDM7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBtYXhfcm93OyByb3crKykgIC8vIDIgdGltZXMKKyAgeworICAgIEZJWFBfREJMICpNcGFyYW0wID0gc2VsZi0+TTJSZWFsX19GREtbcm93XVswXTsKKyAgICBGSVhQX0RCTCAqTXBhcmFtMSA9IHNlbGYtPk0yUmVhbF9fRkRLW3Jvd11bMV07CisgICAgRklYUF9EQkwgKk1wYXJhbVByZXYwID0gc2VsZi0+TTJSZWFsUHJldl9fRkRLW3Jvd11bMF07CisgICAgRklYUF9EQkwgKk1wYXJhbVByZXYxID0gc2VsZi0+TTJSZWFsUHJldl9fRkRLW3Jvd11bMV07CisKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEh5Yk91dFJlYWxEcnkgPSBoeWJPdXRwdXRSZWFsRHJ5W3Jvd107CisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBIeWJPdXRJbWFnRHJ5ID0gaHliT3V0cHV0SW1hZ0RyeVtyb3ddOworCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBXUmVhbDAgPSB3UmVhbFswXTsKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFdSZWFsMSA9IHdSZWFsWzFdOworICAgIEZJWFBfREJMICpSRVNUUklDVCBwV0ltYWcwID0gd0ltYWdbMF07CisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBXSW1hZzEgPSB3SW1hZ1sxXTsKKyAgICBmb3IgKElOVCBwYiA9IDA7IHBiIDwgcGJfbWF4OyBwYisrKSB7CisgICAgICBGSVhQX0RCTCB0bXAwLCB0bXAxOworCisgICAgICB0bXAwID0gaW50ZXJwb2xhdGVQYXJhbWV0ZXIoYWxwaGEsIE1wYXJhbTBbcGJdLCBNcGFyYW1QcmV2MFtwYl0pOworICAgICAgdG1wMSA9IGludGVycG9sYXRlUGFyYW1ldGVyKGFscGhhLCBNcGFyYW0xW3BiXSwgTXBhcmFtUHJldjFbcGJdKTsKKworICAgICAgSU5UIGkgPSBwV2lkdGhbcGJdOworCisgICAgICBkbyAgLy8gYWJvdXQgMy00IHRpbWVzCisgICAgICB7CisgICAgICAgIEZJWFBfREJMIHZhcjAsIHZhcjEsIHJlYWwsIGltYWc7CisKKyAgICAgICAgdmFyMCA9ICpwV1JlYWwwKys7CisgICAgICAgIHZhcjEgPSAqcFdSZWFsMSsrOworICAgICAgICByZWFsID0gZk11bHREaXYyKHZhcjAsIHRtcDApOworICAgICAgICB2YXIwID0gKnBXSW1hZzArKzsKKyAgICAgICAgcmVhbCA9IGZNdWx0QWRkRGl2MihyZWFsLCB2YXIxLCB0bXAxKTsKKyAgICAgICAgdmFyMSA9ICpwV0ltYWcxKys7CisgICAgICAgIGltYWcgPSBmTXVsdERpdjIodmFyMCwgdG1wMCk7CisgICAgICAgICpwSHliT3V0UmVhbERyeSsrID0gcmVhbCA8PCAoMSArIE0yX2V4cCk7CisgICAgICAgIGltYWcgPSBmTXVsdEFkZERpdjIoaW1hZywgdmFyMSwgdG1wMSk7CisgICAgICAgICpwSHliT3V0SW1hZ0RyeSsrID0gaW1hZyA8PCAoMSArIE0yX2V4cCk7CisgICAgICB9IHdoaWxlICgtLWkgIT0gMCk7CisgICAgfQorICB9CisgIHJldHVybiBlcnI7Cit9CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQXBwbHlNMl9Nb2RlMjEyX1Jlc2lkdWFsc1BsdXNQaGFzZUNvZGluZygKKyAgICBzcGF0aWFsRGVjICpzZWxmLCBJTlQgcHMsIGNvbnN0IEZJWFBfU0dMIGFscGhhLCBGSVhQX0RCTCAqKndSZWFsLAorICAgIEZJWFBfREJMICoqd0ltYWcsIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbERyeSwKKyAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dEltYWdEcnkpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgSU5UIHJvdzsKKyAgSU5UIHNjYWxlX3BhcmFtX20yOworICBJTlQgKnBXaWR0aCA9IHNlbGYtPmtlcm5lbHNfd2lkdGg7CisgIElOVCBwYl9tYXggPSBzZWxmLT5rZXJuZWxzW3NlbGYtPmh5YnJpZEJhbmRzIC0gMV0gKyAxOworCisgIHNjYWxlX3BhcmFtX20yID0gU0NBTEVfUEFSQU1fTTJfMjEyX1BSRUQgKyBTQ0FMRV9EQVRBX0FQUExZX00yOworCisgIGZvciAocm93ID0gMDsgcm93IDwgc2VsZi0+bnVtTTJyb3dzOyByb3crKykgeworICAgIElOVCBxcywgcGI7CisKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFdSZWFsMCA9IHdSZWFsWzBdOworICAgIEZJWFBfREJMICpSRVNUUklDVCBwV0ltYWcwID0gd0ltYWdbMF07CisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBXUmVhbDEgPSB3UmVhbFsxXTsKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFdJbWFnMSA9IHdJbWFnWzFdOworCisgICAgRklYUF9EQkwgKk1SZWFsMCA9IHNlbGYtPk0yUmVhbF9fRkRLW3Jvd11bMF07CisgICAgRklYUF9EQkwgKk1JbWFnMCA9IHNlbGYtPk0ySW1hZ19fRkRLW3Jvd11bMF07CisgICAgRklYUF9EQkwgKk1SZWFsMSA9IHNlbGYtPk0yUmVhbF9fRkRLW3Jvd11bMV07CisgICAgRklYUF9EQkwgKk1SZWFsUHJldjAgPSBzZWxmLT5NMlJlYWxQcmV2X19GREtbcm93XVswXTsKKyAgICBGSVhQX0RCTCAqTUltYWdQcmV2MCA9IHNlbGYtPk0ySW1hZ1ByZXZfX0ZES1tyb3ddWzBdOworICAgIEZJWFBfREJMICpNUmVhbFByZXYxID0gc2VsZi0+TTJSZWFsUHJldl9fRkRLW3Jvd11bMV07CisKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEh5Yk91dFJlYWxEcnkgPSBoeWJPdXRwdXRSZWFsRHJ5W3Jvd107CisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBIeWJPdXRJbWFnRHJ5ID0gaHliT3V0cHV0SW1hZ0RyeVtyb3ddOworCisgICAgRkRLX0FTU0VSVCghKHNlbGYtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfTEQpKTsKKyAgICBGREtfQVNTRVJUKChwV2lkdGhbMF0gKyBwV2lkdGhbMV0pID49IDMpOworCisgICAgZm9yIChwYiA9IDAsIHFzID0gMzsgcGIgPCAyOyBwYisrKSB7CisgICAgICBJTlQgczsKKyAgICAgIEZJWFBfREJMIG1heFZhbDsKKyAgICAgIEZJWFBfU0dMIG1SZWFsMTsKKyAgICAgIEZJWFBfU0dMIG1SZWFsMCwgbUltYWcwOworICAgICAgRklYUF9EQkwgaVJlYWwwLCBpSW1hZzAsIGlSZWFsMTsKKworICAgICAgaVJlYWwwID0gaW50ZXJwb2xhdGVQYXJhbWV0ZXIoYWxwaGEsIE1SZWFsMFtwYl0sIE1SZWFsUHJldjBbcGJdKTsKKyAgICAgIGlJbWFnMCA9IC1pbnRlcnBvbGF0ZVBhcmFtZXRlcihhbHBoYSwgTUltYWcwW3BiXSwgTUltYWdQcmV2MFtwYl0pOworICAgICAgaVJlYWwxID0gaW50ZXJwb2xhdGVQYXJhbWV0ZXIoYWxwaGEsIE1SZWFsMVtwYl0sIE1SZWFsUHJldjFbcGJdKTsKKworICAgICAgbWF4VmFsID0gZkFicyhpUmVhbDApIHwgZkFicyhpSW1hZzApOworICAgICAgbWF4VmFsIHw9IGZBYnMoaVJlYWwxKTsKKworICAgICAgcyA9IGZNYXgoQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxLCAwKTsKKyAgICAgIHMgPSBmTWluKHMsIHNjYWxlX3BhcmFtX20yKTsKKworICAgICAgbVJlYWwwID0gRlhfREJMMkZYX1NHTChpUmVhbDAgPDwgcyk7CisgICAgICBtSW1hZzAgPSBGWF9EQkwyRlhfU0dMKGlJbWFnMCA8PCBzKTsKKyAgICAgIG1SZWFsMSA9IEZYX0RCTDJGWF9TR0woaVJlYWwxIDw8IHMpOworCisgICAgICBzID0gc2NhbGVfcGFyYW1fbTIgLSBzOworCisgICAgICBJTlQgaSA9IHBXaWR0aFtwYl07CisKKyAgICAgIGRvIHsKKyAgICAgICAgRklYUF9EQkwgcmVhbCwgaW1hZywgd1JlYWwwLCB3SW1hZzAsIHdSZWFsMSwgd0ltYWcxOworCisgICAgICAgIHdSZWFsMCA9ICpwV1JlYWwwKys7CisgICAgICAgIHdJbWFnMCA9ICpwV0ltYWcwKys7CisgICAgICAgIHdSZWFsMSA9ICpwV1JlYWwxKys7CisgICAgICAgIHdJbWFnMSA9ICpwV0ltYWcxKys7CisKKyAgICAgICAgY3BseE11bHREaXYyKCZyZWFsLCAmaW1hZywgd1JlYWwwLCB3SW1hZzAsIG1SZWFsMCwgbUltYWcwKTsKKworICAgICAgICAqcEh5Yk91dFJlYWxEcnkrKyA9IGZNdWx0QWRkRGl2MihyZWFsLCB3UmVhbDEsIG1SZWFsMSkgPDwgczsKKyAgICAgICAgKnBIeWJPdXRJbWFnRHJ5KysgPSBmTXVsdEFkZERpdjIoaW1hZywgd0ltYWcxLCBtUmVhbDEpIDw8IHM7CisKKyAgICAgICAgaWYgKHFzID4gMCkgeworICAgICAgICAgIG1JbWFnMCA9IC1tSW1hZzA7CisgICAgICAgICAgcXMtLTsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoLS1pICE9IDApOworICAgIH0KKworICAgIGZvciAoOyBwYiA8IHBiX21heDsgcGIrKykgeworICAgICAgSU5UIHM7CisgICAgICBGSVhQX0RCTCBtYXhWYWw7CisgICAgICBGSVhQX1NHTCBtUmVhbDE7CisgICAgICBGSVhQX1NHTCBtUmVhbDAsIG1JbWFnMDsKKyAgICAgIEZJWFBfREJMIGlSZWFsMCwgaUltYWcwLCBpUmVhbDE7CisKKyAgICAgIGlSZWFsMCA9IGludGVycG9sYXRlUGFyYW1ldGVyKGFscGhhLCBNUmVhbDBbcGJdLCBNUmVhbFByZXYwW3BiXSk7CisgICAgICBpSW1hZzAgPSBpbnRlcnBvbGF0ZVBhcmFtZXRlcihhbHBoYSwgTUltYWcwW3BiXSwgTUltYWdQcmV2MFtwYl0pOworICAgICAgaVJlYWwxID0gaW50ZXJwb2xhdGVQYXJhbWV0ZXIoYWxwaGEsIE1SZWFsMVtwYl0sIE1SZWFsUHJldjFbcGJdKTsKKworICAgICAgbWF4VmFsID0gZkFicyhpUmVhbDApIHwgZkFicyhpSW1hZzApOworICAgICAgbWF4VmFsIHw9IGZBYnMoaVJlYWwxKTsKKworICAgICAgcyA9IGZNYXgoQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxLCAwKTsKKyAgICAgIHMgPSBmTWluKHMsIHNjYWxlX3BhcmFtX20yKTsKKworICAgICAgbVJlYWwwID0gRlhfREJMMkZYX1NHTChpUmVhbDAgPDwgcyk7CisgICAgICBtSW1hZzAgPSBGWF9EQkwyRlhfU0dMKGlJbWFnMCA8PCBzKTsKKyAgICAgIG1SZWFsMSA9IEZYX0RCTDJGWF9TR0woaVJlYWwxIDw8IHMpOworCisgICAgICBzID0gc2NhbGVfcGFyYW1fbTIgLSBzOworCisgICAgICBJTlQgaSA9IHBXaWR0aFtwYl07CisKKyAgICAgIGRvIHsKKyAgICAgICAgRklYUF9EQkwgcmVhbCwgaW1hZywgd1JlYWwwLCB3SW1hZzAsIHdSZWFsMSwgd0ltYWcxOworCisgICAgICAgIHdSZWFsMCA9ICpwV1JlYWwwKys7CisgICAgICAgIHdJbWFnMCA9ICpwV0ltYWcwKys7CisgICAgICAgIHdSZWFsMSA9ICpwV1JlYWwxKys7CisgICAgICAgIHdJbWFnMSA9ICpwV0ltYWcxKys7CisKKyAgICAgICAgY3BseE11bHREaXYyKCZyZWFsLCAmaW1hZywgd1JlYWwwLCB3SW1hZzAsIG1SZWFsMCwgbUltYWcwKTsKKworICAgICAgICAqcEh5Yk91dFJlYWxEcnkrKyA9IGZNdWx0QWRkRGl2MihyZWFsLCB3UmVhbDEsIG1SZWFsMSkgPDwgczsKKyAgICAgICAgKnBIeWJPdXRJbWFnRHJ5KysgPSBmTXVsdEFkZERpdjIoaW1hZywgd0ltYWcxLCBtUmVhbDEpIDw8IHM7CisgICAgICB9IHdoaWxlICgtLWkgIT0gMCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNBcHBseU0yKHNwYXRpYWxEZWMgKnNlbGYsIElOVCBwcywgY29uc3QgRklYUF9TR0wgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKip3UmVhbCwgRklYUF9EQkwgKip3SW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dFJlYWxEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRJbWFnRHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbFdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dEltYWdXZXQpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKworICB7CisgICAgaW50IHFzLCByb3csIGNvbDsKKyAgICBpbnQgY29tcGxleEh5YkJhbmRzOworICAgIGludCBjb21wbGV4UGFyQmFuZHM7CisgICAgaW50IHNjYWxlX3BhcmFtX20yID0gMDsKKyAgICBpbnQgdG9vbHNEaXNhYmxlZDsKKworICAgIFVDSEFSIGFjdGl2UGFyYW1CYW5kczsKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFdSZWFsLCAqUkVTVFJJQ1QgcFdJbWFnLCAqUkVTVFJJQ1QgcEh5Yk91dFJlYWxEcnksCisgICAgICAgICpSRVNUUklDVCBwSHliT3V0SW1hZ0RyeSwgKlJFU1RSSUNUIHBIeWJPdXRSZWFsV2V0LAorICAgICAgICAqUkVTVFJJQ1QgcEh5Yk91dEltYWdXZXQ7CisgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBLZXJuZWwsIEZJWFBfU0dMLCBNQVhfSFlCUklEX0JBTkRTKTsKKworICAgIC8qIFRoZSB3ZXQgc2lnbmFsIGlzIGFkZGVkIHRvIHRoZSBkcnkgc2lnbmFsIGRpcmVjdGx5IGluIGFwcGx5TTIgaWYgR0VTIGFuZAorICAgICAqIFNUUCBhcmUgZGlzYWJsZWQgKi8KKyAgICB0b29sc0Rpc2FibGVkID0KKyAgICAgICAgKChzZWxmLT50ZW1wU2hhcGVDb25maWcgPT0gMSkgfHwgKHNlbGYtPnRlbXBTaGFwZUNvbmZpZyA9PSAyKSkgPyAwIDogMTsKKworICAgIHsKKyAgICAgIGNvbXBsZXhIeWJCYW5kcyA9IHNlbGYtPmh5YnJpZEJhbmRzOworICAgICAgY29tcGxleFBhckJhbmRzID0gc2VsZi0+bnVtUGFyYW1ldGVyQmFuZHM7CisgICAgfQorCisgICAgRkRLbWVtY2xlYXIoaHliT3V0cHV0SW1hZ0RyeVswXSwKKyAgICAgICAgICAgICAgICBzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtT3V0cHV0Q2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICAgICBzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtQ21wbHhIeWJCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNsZWFyKGh5Yk91dHB1dFJlYWxEcnlbMF0sIHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1PdXRwdXRDaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1IeWJyaWRCYW5kcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpOworCisgICAgaWYgKCF0b29sc0Rpc2FibGVkKSB7CisgICAgICBGREttZW1jbGVhcihoeWJPdXRwdXRSZWFsV2V0WzBdLAorICAgICAgICAgICAgICAgICAgc2VsZi0+Y3JlYXRlUGFyYW1zLm1heE51bU91dHB1dENoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtSHlicmlkQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNsZWFyKGh5Yk91dHB1dEltYWdXZXRbMF0sCisgICAgICAgICAgICAgICAgICBzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtT3V0cHV0Q2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1DbXBseEh5YkJhbmRzICoKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpKTsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+cGhhc2VDb2RpbmcgPT0gMykgeworICAgICAgLyogKyBTQ0FMRV9EQVRBX0FQUExZX00yIHRvIGNvbXBlbnNhdGUgZm9yIERpdjIgYmVsb3cgPyEgKi8KKyAgICAgIHNjYWxlX3BhcmFtX20yID0gU0NBTEVfUEFSQU1fTTJfMjEyX1BSRUQgKyBTQ0FMRV9EQVRBX0FQUExZX00yOworICAgIH0KKworICAgIGZvciAocm93ID0gMDsgcm93IDwgc2VsZi0+bnVtTTJyb3dzOyByb3crKykgeworICAgICAgcEh5Yk91dFJlYWxEcnkgPSBoeWJPdXRwdXRSZWFsRHJ5W3Jvd107CisgICAgICBwSHliT3V0SW1hZ0RyeSA9IGh5Yk91dHB1dEltYWdEcnlbcm93XTsKKworICAgICAgaWYgKHRvb2xzRGlzYWJsZWQpIHsKKyAgICAgICAgcEh5Yk91dFJlYWxXZXQgPSBoeWJPdXRwdXRSZWFsRHJ5W3Jvd107CisgICAgICAgIHBIeWJPdXRJbWFnV2V0ID0gaHliT3V0cHV0SW1hZ0RyeVtyb3ddOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcEh5Yk91dFJlYWxXZXQgPSBoeWJPdXRwdXRSZWFsV2V0W3Jvd107CisgICAgICAgIHBIeWJPdXRJbWFnV2V0ID0gaHliT3V0cHV0SW1hZ1dldFtyb3ddOworICAgICAgfQorCisgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHNlbGYtPm51bURpcmVrdFNpZ25hbHM7IGNvbCsrKSB7CisgICAgICAgIGlmIChzZWxmLT5wQWN0aXZNMlBhcmFtQmFuZHMgPT0KKyAgICAgICAgICAgIDApIHsgLyogZGVmYXVsdCBzZXR0aW5nLCBjYWxjdWxhdGUgYWxsIHJvd3MgYW5kIGNvbHVtbnMgKi8KKyAgICAgICAgICBhY3RpdlBhcmFtQmFuZHMgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChzZWxmLT5wQWN0aXZNMlBhcmFtQmFuZHNbTUFYX00yX0lOUFVUICogcm93ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF0pIC8qIHRhYmxlIHdpdGggYWN0aXYgYW5kIGluYWN0aXYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRzIGV4aXN0cyBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiAqLworICAgICAgICAgICAgYWN0aXZQYXJhbUJhbmRzID0gMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhY3RpdlBhcmFtQmFuZHMgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChhY3RpdlBhcmFtQmFuZHMpIHsKKyAgICAgICAgICBwV1JlYWwgPSB3UmVhbFtjb2xdOworICAgICAgICAgIHBXSW1hZyA9IHdJbWFnW2NvbF07CisKKyAgICAgICAgICBNMlBhcmFtVG9LZXJuZWxNdWx0KHBLZXJuZWwsIHNlbGYtPk0yUmVhbF9fRkRLW3Jvd11bY29sXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPk0yUmVhbFByZXZfX0ZES1tyb3ddW2NvbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5rZXJuZWxzX3dpZHRoLCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm51bVBhcmFtZXRlckJhbmRzKTsKKworICAgICAgICAgIGlmICgxICYmIChzZWxmLT5waGFzZUNvZGluZyAhPSAzKSkgeworICAgICAgICAgICAgLyogZGlyZWN0IHNpZ25hbHMgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogb25seSBvbmUgc2FtcGxlIHdpbGwgYmUgYXNzaWduZWQgdG8gZWFjaCByb3csIGhlbmNlCisgICAgICAgICAgICAgICAqIGFjY3VtdWxhdGlvbiBpcyBub3QgbmVjY2Vzc2FyeTsgdGhhdCBpcyB2YWxpZCBmb3IgYWxsCisgICAgICAgICAgICAgICAqIGNvbmZpZ3VyYXRpb25zICovCisgICAgICAgICAgICAgIGZvciAocXMgPSAwOyBxcyA8IGNvbXBsZXhIeWJCYW5kczsgcXMrKykgeworICAgICAgICAgICAgICAgIHBIeWJPdXRSZWFsRHJ5W3FzXSA9IGZNdWx0KHBXUmVhbFtxc10sIHBLZXJuZWxbcXNdKTsKKyAgICAgICAgICAgICAgICBwSHliT3V0SW1hZ0RyeVtxc10gPSBmTXVsdChwV0ltYWdbcXNdLCBwS2VybmVsW3FzXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeyAvKiAgaXNCaW5hdXJhbE1vZGUoc2VsZi0+dXBtaXhUeXBlKSAgKi8KKworICAgICAgICAgICAgZm9yIChxcyA9IDA7IHFzIDwgY29tcGxleEh5YkJhbmRzOyBxcysrKSB7CisgICAgICAgICAgICAgIHBIeWJPdXRSZWFsRHJ5W3FzXSArPSBmTXVsdERpdjIocFdSZWFsW3FzXSwgcEtlcm5lbFtxc10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgICBwSHliT3V0SW1hZ0RyeVtxc10gKz0gZk11bHREaXYyKHBXSW1hZ1txc10sIHBLZXJuZWxbcXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTTJQYXJhbVRvS2VybmVsTXVsdChwS2VybmVsLCBzZWxmLT5NMkltYWdfX0ZES1tyb3ddW2NvbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPk0ySW1hZ1ByZXZfX0ZES1tyb3ddW2NvbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmtlcm5lbHNfd2lkdGgsIGFscGhhLCBjb21wbGV4UGFyQmFuZHMpOworCisgICAgICAgICAgICAvKiBkaXJlY3Qgc2lnbmFscyBzaWduIGlzIC0xIGZvciBxcyA9IDAsMiAqLworICAgICAgICAgICAgcEh5Yk91dFJlYWxEcnlbMF0gKz0gZk11bHREaXYyKHBXSW1hZ1swXSwgcEtlcm5lbFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICBwSHliT3V0SW1hZ0RyeVswXSAtPSBmTXVsdERpdjIocFdSZWFsWzBdLCBwS2VybmVsWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKworICAgICAgICAgICAgcEh5Yk91dFJlYWxEcnlbMl0gKz0gZk11bHREaXYyKHBXSW1hZ1syXSwgcEtlcm5lbFsyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICBwSHliT3V0SW1hZ0RyeVsyXSAtPSBmTXVsdERpdjIocFdSZWFsWzJdLCBwS2VybmVsWzJdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKworICAgICAgICAgICAgLyogZGlyZWN0IHNpZ25hbHMgc2lnbiBpcyArMSBmb3IgcXMgPSAxLDMsNCw1LC4uLixjb21wbGV4SHliQmFuZHMgKi8KKyAgICAgICAgICAgIHBIeWJPdXRSZWFsRHJ5WzFdIC09IGZNdWx0RGl2MihwV0ltYWdbMV0sIHBLZXJuZWxbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgcEh5Yk91dEltYWdEcnlbMV0gKz0gZk11bHREaXYyKHBXUmVhbFsxXSwgcEtlcm5lbFsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisKKyAgICAgICAgICAgIGZvciAocXMgPSAzOyBxcyA8IGNvbXBsZXhIeWJCYW5kczsgcXMrKykgeworICAgICAgICAgICAgICBwSHliT3V0UmVhbERyeVtxc10gLT0gZk11bHREaXYyKHBXSW1hZ1txc10sIHBLZXJuZWxbcXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgICAgcEh5Yk91dEltYWdEcnlbcXNdICs9IGZNdWx0RGl2MihwV1JlYWxbcXNdLCBwS2VybmVsW3FzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSAvKiBzZWxmLT51cG1peFR5cGUgKi8KKyAgICAgICAgfSAgIC8qIGlmIChhY3RpdlBhcmFtQmFuZHMpICovCisgICAgICB9ICAgICAvKiBzZWxmLT5udW1EaXJla3RTaWduYWxzICovCisKKyAgICAgIGZvciAoOyBjb2wgPCBzZWxmLT5udW1WQ2hhbm5lbHM7IGNvbCsrKSB7CisgICAgICAgIGlmIChzZWxmLT5wQWN0aXZNMlBhcmFtQmFuZHMgPT0KKyAgICAgICAgICAgIDApIHsgLyogZGVmYXVsdCBzZXR0aW5nLCBjYWxjdWxhdGUgYWxsIHJvd3MgYW5kIGNvbHVtbnMgKi8KKyAgICAgICAgICBhY3RpdlBhcmFtQmFuZHMgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChzZWxmLT5wQWN0aXZNMlBhcmFtQmFuZHNbTUFYX00yX0lOUFVUICogcm93ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF0pIC8qIHRhYmxlIHdpdGggYWN0aXYgYW5kIGluYWN0aXYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRzIGV4aXN0cyBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiAqLworICAgICAgICAgICAgYWN0aXZQYXJhbUJhbmRzID0gMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhY3RpdlBhcmFtQmFuZHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFjdGl2UGFyYW1CYW5kcykgeworICAgICAgICAgIGludCByZXNCYW5kSW5kZXg7CisgICAgICAgICAgaW50IHJlc0h5YkluZGV4OworCisgICAgICAgICAgcmVzQmFuZEluZGV4ID0KKyAgICAgICAgICAgICAgc2VsZi0+cmVzaWR1YWxCYW5kc1tTcGF0aWFsRGVjR2V0UmVzaWR1YWxJbmRleChzZWxmLCBjb2wpXTsKKyAgICAgICAgICByZXNIeWJJbmRleCA9IHNlbGYtPnBhcmFtMmh5YltyZXNCYW5kSW5kZXhdOworCisgICAgICAgICAgcFdSZWFsID0gd1JlYWxbY29sXTsKKyAgICAgICAgICBwV0ltYWcgPSB3SW1hZ1tjb2xdOworCisgICAgICAgICAgTTJQYXJhbVRvS2VybmVsTXVsdChwS2VybmVsLCBzZWxmLT5NMlJlYWxfX0ZES1tyb3ddW2NvbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5NMlJlYWxQcmV2X19GREtbcm93XVtjb2xdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+a2VybmVsc193aWR0aCwgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kcyk7CisKKyAgICAgICAgICBpZiAoMSAmJiAoc2VsZi0+cGhhc2VDb2RpbmcgIT0gMykpIHsKKyAgICAgICAgICAgIC8qIHJlc2lkdWFsIHNpZ25hbHMgKi8KKyAgICAgICAgICAgIGZvciAocXMgPSAwOyBxcyA8IHJlc0h5YkluZGV4OyBxcysrKSB7CisgICAgICAgICAgICAgIHBIeWJPdXRSZWFsRHJ5W3FzXSArPSBmTXVsdChwV1JlYWxbcXNdLCBwS2VybmVsW3FzXSk7CisgICAgICAgICAgICAgIHBIeWJPdXRJbWFnRHJ5W3FzXSArPSBmTXVsdChwV0ltYWdbcXNdLCBwS2VybmVsW3FzXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZWNvciBzaWduYWxzICovCisgICAgICAgICAgICBmb3IgKDsgcXMgPCBjb21wbGV4SHliQmFuZHM7IHFzKyspIHsKKyAgICAgICAgICAgICAgcEh5Yk91dFJlYWxXZXRbcXNdICs9IGZNdWx0KHBXUmVhbFtxc10sIHBLZXJuZWxbcXNdKTsKKyAgICAgICAgICAgICAgcEh5Yk91dEltYWdXZXRbcXNdICs9IGZNdWx0KHBXSW1hZ1txc10sIHBLZXJuZWxbcXNdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeyAvKiBzZWxmLT51cG1peFR5cGUgKi8KKyAgICAgICAgICAgIC8qIHJlc2lkdWFsIHNpZ25hbHMgKi8KKyAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwSHliT3V0UmVhbDsKKyAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwSHliT3V0SW1hZzsKKworICAgICAgICAgICAgZm9yIChxcyA9IDA7IHFzIDwgcmVzSHliSW5kZXg7IHFzKyspIHsKKyAgICAgICAgICAgICAgcEh5Yk91dFJlYWxEcnlbcXNdICs9IGZNdWx0RGl2MihwV1JlYWxbcXNdLCBwS2VybmVsW3FzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICAgIHBIeWJPdXRJbWFnRHJ5W3FzXSArPSBmTXVsdERpdjIocFdJbWFnW3FzXSwgcEtlcm5lbFtxc10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZGVjb3Igc2lnbmFscyAqLworICAgICAgICAgICAgZm9yICg7IHFzIDwgY29tcGxleEh5YkJhbmRzOyBxcysrKSB7CisgICAgICAgICAgICAgIHBIeWJPdXRSZWFsV2V0W3FzXSArPSBmTXVsdERpdjIocFdSZWFsW3FzXSwgcEtlcm5lbFtxc10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgICBwSHliT3V0SW1hZ1dldFtxc10gKz0gZk11bHREaXYyKHBXSW1hZ1txc10sIHBLZXJuZWxbcXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTTJQYXJhbVRvS2VybmVsTXVsdChwS2VybmVsLCBzZWxmLT5NMkltYWdfX0ZES1tyb3ddW2NvbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPk0ySW1hZ1ByZXZfX0ZES1tyb3ddW2NvbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmtlcm5lbHNfd2lkdGgsIGFscGhhLCBjb21wbGV4UGFyQmFuZHMpOworCisgICAgICAgICAgICAvKiBkaXJlY3Qgc2lnbmFscyBzaWduIGlzIC0xIGZvciBxcyA9IDAsMiAqLworICAgICAgICAgICAgLyogZGlyZWN0IHNpZ25hbHMgc2lnbiBpcyArMSBmb3IgcXMgPSAxLDMuLiAqLworICAgICAgICAgICAgaWYgKHRvb2xzRGlzYWJsZWQpIHsKKyAgICAgICAgICAgICAgcEh5Yk91dFJlYWxEcnlbMF0gKz0gZk11bHREaXYyKHBXSW1hZ1swXSwgcEtlcm5lbFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgICAgcEh5Yk91dEltYWdEcnlbMF0gLT0gZk11bHREaXYyKHBXUmVhbFswXSwgcEtlcm5lbFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKworICAgICAgICAgICAgICBwSHliT3V0UmVhbERyeVsxXSAtPSBmTXVsdERpdjIocFdJbWFnWzFdLCBwS2VybmVsWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgICBwSHliT3V0SW1hZ0RyeVsxXSArPSBmTXVsdERpdjIocFdSZWFsWzFdLCBwS2VybmVsWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworCisgICAgICAgICAgICAgIHBIeWJPdXRSZWFsRHJ5WzJdICs9IGZNdWx0RGl2MihwV0ltYWdbMl0sIHBLZXJuZWxbMl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICAgIHBIeWJPdXRJbWFnRHJ5WzJdIC09IGZNdWx0RGl2MihwV1JlYWxbMl0sIHBLZXJuZWxbMl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBwSHliT3V0UmVhbCA9ICZwSHliT3V0UmVhbERyeVswXTsKKyAgICAgICAgICAgICAgcEh5Yk91dEltYWcgPSAmcEh5Yk91dEltYWdEcnlbMF07CisgICAgICAgICAgICAgIGlmICgwID09IHJlc0h5YkluZGV4KSB7CisgICAgICAgICAgICAgICAgcEh5Yk91dFJlYWwgPSAmcEh5Yk91dFJlYWxXZXRbMF07CisgICAgICAgICAgICAgICAgcEh5Yk91dEltYWcgPSAmcEh5Yk91dEltYWdXZXRbMF07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcEh5Yk91dFJlYWxbMF0gKz0gZk11bHREaXYyKHBXSW1hZ1swXSwgcEtlcm5lbFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgICAgcEh5Yk91dEltYWdbMF0gLT0gZk11bHREaXYyKHBXUmVhbFswXSwgcEtlcm5lbFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKworICAgICAgICAgICAgICBpZiAoMSA9PSByZXNIeWJJbmRleCkgeworICAgICAgICAgICAgICAgIHBIeWJPdXRSZWFsID0gJnBIeWJPdXRSZWFsV2V0WzBdOworICAgICAgICAgICAgICAgIHBIeWJPdXRJbWFnID0gJnBIeWJPdXRJbWFnV2V0WzBdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHBIeWJPdXRSZWFsWzFdIC09IGZNdWx0RGl2MihwV0ltYWdbMV0sIHBLZXJuZWxbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICAgIHBIeWJPdXRJbWFnWzFdICs9IGZNdWx0RGl2MihwV1JlYWxbMV0sIHBLZXJuZWxbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisKKyAgICAgICAgICAgICAgaWYgKDIgPT0gcmVzSHliSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBwSHliT3V0UmVhbCA9ICZwSHliT3V0UmVhbFdldFswXTsKKyAgICAgICAgICAgICAgICBwSHliT3V0SW1hZyA9ICZwSHliT3V0SW1hZ1dldFswXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwSHliT3V0UmVhbFsyXSArPSBmTXVsdERpdjIocFdJbWFnWzJdLCBwS2VybmVsWzJdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgICBwSHliT3V0SW1hZ1syXSAtPSBmTXVsdERpdjIocFdSZWFsWzJdLCBwS2VybmVsWzJdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHFzID0gMzsgcXMgPCByZXNIeWJJbmRleDsgcXMrKykgeworICAgICAgICAgICAgICBwSHliT3V0UmVhbERyeVtxc10gLT0gZk11bHREaXYyKHBXSW1hZ1txc10sIHBLZXJuZWxbcXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgICAgcEh5Yk91dEltYWdEcnlbcXNdICs9IGZNdWx0RGl2MihwV1JlYWxbcXNdLCBwS2VybmVsW3FzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZWNvciBzaWduYWxzICovCisgICAgICAgICAgICBmb3IgKDsgcXMgPCBjb21wbGV4SHliQmFuZHM7IHFzKyspIHsKKyAgICAgICAgICAgICAgcEh5Yk91dFJlYWxXZXRbcXNdIC09IGZNdWx0RGl2MihwV0ltYWdbcXNdLCBwS2VybmVsW3FzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICAgIHBIeWJPdXRJbWFnV2V0W3FzXSArPSBmTXVsdERpdjIocFdSZWFsW3FzXSwgcEtlcm5lbFtxc10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gLyogc2VsZi0+dXBtaXhUeXBlICovCisgICAgICAgIH0gICAvKiBpZiAoYWN0aXZQYXJhbUJhbmRzKSB7ICovCisgICAgICB9ICAgICAvKiAgc2VsZi0+bnVtVkNoYW5uZWxzICovCisgICAgfQorCisgICAgQ19BTExPQ19TQ1JBVENIX0VORChwS2VybmVsLCBGSVhQX1NHTCwgTUFYX0hZQlJJRF9CQU5EUyk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitTQUNERUNfRVJST1IgU3BhdGlhbERlY1N5bnRoZXNpcyhzcGF0aWFsRGVjICpzZWxmLCBjb25zdCBJTlQgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dEltYWcsIFBDTV9NUFMgKnRpbWVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtSW5wdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IgKmNvbnN0IG1hcERlc2NyKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisKKyAgaW50IGNoOworICBpbnQgc3RyaWRlLCBvZmZzZXQ7CisKKyAgc3RyaWRlID0gc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHNBVDsKKyAgb2Zmc2V0ID0gMTsKKworICBQQ01fTVBTICpwVGltZU91dF9fRkRLID0KKyAgICAgICZ0aW1lT3V0W3N0cmlkZSAqIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYubkJhbmRzU3ludGhlc2lzICogdHNdOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocFFtZlJlYWwsIEZJWFBfREJMLCBRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyk7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwUW1mSW1hZywgRklYUF9EQkwsIFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTKTsKKworICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5udW1PdXRwdXRDaGFubmVsc0FUOyBjaCsrKSB7CisgICAgaWYgKHNlbGYtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfTEQpIHsKKyAgICAgIGludCBrOworICAgICAgLyogTm8gaHlicmlkIGZpbHRlcmluZy4gSnVzdCBjb3B5IHRoZSBRTUYgZGF0YS4gKi8KKyAgICAgIGZvciAoayA9IDA7IGsgPCBzZWxmLT5oeWJyaWRCYW5kczsgayArPSAxKSB7CisgICAgICAgIHBRbWZSZWFsW2tdID0gaHliT3V0cHV0UmVhbFtjaF1ba107CisgICAgICAgIHBRbWZJbWFnW2tdID0gaHliT3V0cHV0SW1hZ1tjaF1ba107CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEZES2h5YnJpZFN5bnRoZXNpc0FwcGx5KCZzZWxmLT5oeWJyaWRTeW50aGVzaXNbY2hdLCBoeWJPdXRwdXRSZWFsW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5Yk91dHB1dEltYWdbY2hdLCBwUW1mUmVhbCwgcFFtZkltYWcpOworICAgIH0KKworICAgIC8qIE1hcCBjaGFubmVsIGluZGljZXMgZnJvbSBNUEVHIFN1cnJvdW5kIC0+IFBDRSBzdHlsZSAtPiBjaGFubmVsTWFwcGluZ1tdCisgICAgICovCisgICAgRkRLX0FTU0VSVChzZWxmLT5udW1PdXRwdXRDaGFubmVsc0FUIDw9IDYpOworICAgIGludCBvdXRDaCA9IEZES19jaE1hcERlc2NyX2dldE1hcFZhbHVlKG1hcERlc2NyLCBtYXBDaGFubmVsKHNlbGYsIGNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5udW1PdXRwdXRDaGFubmVsc0FUKTsKKworICAgIHsKKyAgICAgIGlmIChzZWxmLT5zdGVyZW9Db25maWdJbmRleCA9PSAzKSB7CisgICAgICAgIC8qIE1QUyAtPiBTQlIgKi8KKyAgICAgICAgaW50IGk7CisgICAgICAgIEZJWFBfREJMICpwV29ya0J1ZlJlYWwsICpwV29ya0J1ZkltYWc7CisgICAgICAgIEZES19BU1NFUlQoKHNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbk91dFtvdXRDaF0uZmIub3V0R2Fpbl9tID09CisgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkweDgwMDAwMDAwKSAmJgorICAgICAgICAgICAgICAgICAgIChzZWxmLT5wUW1mRG9tYWluLT5RbWZEb21haW5PdXRbb3V0Q2hdLmZiLm91dEdhaW5fZSA9PSAwKSk7CisgICAgICAgIEZES19RbWZEb21haW5fR2V0V29ya0J1ZmZlcigmc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluSW5bb3V0Q2hdLCB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV29ya0J1ZlJlYWwsICZwV29ya0J1ZkltYWcpOworICAgICAgICBGREtfQVNTRVJUKHNlbGYtPnFtZkJhbmRzIDw9CisgICAgICAgICAgICAgICAgICAgc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluSW5bb3V0Q2hdLndvcmtCdWZfbkJhbmRzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPnFtZkJhbmRzOyBpKyspIHsKKyAgICAgICAgICBwV29ya0J1ZlJlYWxbaV0gPSBwUW1mUmVhbFtpXTsKKyAgICAgICAgICBwV29ya0J1ZkltYWdbaV0gPSBwUW1mSW1hZ1tpXTsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5wUW1mRG9tYWluLT5RbWZEb21haW5JbltvdXRDaF0uc2NhbGluZy5sYl9zY2FsZSA9CisgICAgICAgICAgICAtNzsgLyotQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LOyovCisgICAgICAgIHNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbkluW291dENoXS5zY2FsaW5nLmxiX3NjYWxlIC09CisgICAgICAgICAgICBzZWxmLT5wUW1mRG9tYWluLT5RbWZEb21haW5JbltvdXRDaF0uZmIuZmlsdGVyU2NhbGU7CisgICAgICAgIHNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbkluW291dENoXS5zY2FsaW5nLmxiX3NjYWxlIC09CisgICAgICAgICAgICBzZWxmLT5jbGlwUHJvdGVjdEdhaW5TRl9fRkRLOworCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBDYWxsIHRoZSBRTUYgc3ludGhlc2lzIGZvciBkcnkuICovCisgICAgICAgIGVyciA9IENhbGN1bGF0ZVNwYWNlU3ludGhlc2lzUW1mKCZzZWxmLT5wUW1mRG9tYWluLT5RbWZEb21haW5PdXRbb3V0Q2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mUmVhbCwgcFFtZkltYWcsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVPdXRfX0ZESyArIChvZmZzZXQgKiBvdXRDaCkpOworICAgICAgfQorICAgICAgaWYgKGVyciAhPSBNUFNfT0spIGdvdG8gYmFpbDsKKyAgICB9CisgIH0gLyogY2ggbG9vcCAqLworCitiYWlsOgorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBRbWZJbWFnLCBGSVhQX0RCTCwgUU1GX01BWF9TWU5USEVTSVNfQkFORFMpOworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBRbWZSZWFsLCBGSVhQX0RCTCwgUU1GX01BWF9TWU5USEVTSVNfQkFORFMpOworCisgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgU3BhdGlhbERlY0J1ZmZlck1hdHJpY2VzKHNwYXRpYWxEZWMgKnNlbGYpIHsKKyAgaW50IHJvdywgY29sOworICBpbnQgY29tcGxleFBhckJhbmRzOworICBjb21wbGV4UGFyQmFuZHMgPSBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kczsKKworICAvKgorICAgIGJ1ZmZlciBtYXRyaWNlcyBNMgorICAqLworICBmb3IgKHJvdyA9IDA7IHJvdyA8IHNlbGYtPm51bU0ycm93czsgcm93KyspIHsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHNlbGYtPm51bVZDaGFubmVsczsgY29sKyspIHsKKyAgICAgIEZES21lbWNweShzZWxmLT5NMlJlYWxQcmV2X19GREtbcm93XVtjb2xdLCBzZWxmLT5NMlJlYWxfX0ZES1tyb3ddW2NvbF0sCisgICAgICAgICAgICAgICAgc2VsZi0+bnVtUGFyYW1ldGVyQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIGlmICgwIHx8IChzZWxmLT5waGFzZUNvZGluZyA9PSAzKSkgeworICAgICAgICBGREttZW1jcHkoc2VsZi0+TTJJbWFnUHJldl9fRkRLW3Jvd11bY29sXSwgc2VsZi0+TTJJbWFnX19GREtbcm93XVtjb2xdLAorICAgICAgICAgICAgICAgICAgY29tcGxleFBhckJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogYnVmZmVyIHBoYXNlICovCisgIEZES21lbWNweShzZWxmLT5QaGFzZVByZXZMZWZ0X19GREssIHNlbGYtPlBoYXNlTGVmdF9fRkRLLAorICAgICAgICAgICAgc2VsZi0+bnVtUGFyYW1ldGVyQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY3B5KHNlbGYtPlBoYXNlUHJldlJpZ2h0X19GREssIHNlbGYtPlBoYXNlUmlnaHRfX0ZESywKKyAgICAgICAgICAgIHNlbGYtPm51bVBhcmFtZXRlckJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7Cit9CisKKyNkZWZpbmUgUEhBU0VfU0NBTEUgMgorCisjaWZuZGVmIFBfUEkKKyNkZWZpbmUgUF9QSSAzLjE0MTU5MjY1MzU4OTc5MzIKKyNlbmRpZgorCisvKiBGb3IgYmV0dGVyIHByZWNpc2lvbiwgUEkgKHBpX3gyKSBpcyBhbHJlYWR5IGRvdWJsZWQgKi8KK3N0YXRpYyBGSVhQX0RCTCBpbnRlcnBfYW5nbGVfX0ZESyhGSVhQX0RCTCBhbmdsZTEsIEZJWFBfREJMIGFuZ2xlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCBhbHBoYSwgRklYUF9EQkwgcGlfeDIpIHsKKyAgaWYgKGFuZ2xlMiAtIGFuZ2xlMSA+IChwaV94MiA+PiAxKSkgYW5nbGUyIC09IHBpX3gyOworCisgIGlmIChhbmdsZTEgLSBhbmdsZTIgPiAocGlfeDIgPj4gMSkpIGFuZ2xlMSAtPSBwaV94MjsKKworICByZXR1cm4gaW50ZXJwb2xhdGVQYXJhbWV0ZXIoYWxwaGEsIGFuZ2xlMiwgYW5nbGUxKTsKK30KKworLyoKKyAqCisgKi8KK3ZvaWQgU3BhdGlhbERlY0FwcGx5UGhhc2Uoc3BhdGlhbERlYyAqc2VsZiwgRklYUF9TR0wgYWxwaGFfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RTbG90T2ZQYXJhbVNldCkgeworICBpbnQgcGIsIHFzOworICBGSVhQX0RCTCBwcGJbTUFYX1BBUkFNRVRFUl9CQU5EUyAqCisgICAgICAgICAgICAgICA0XTsgLyogbGVmdCByZWFsLCBpbWFnIC0gcmlnaHQgcmVhbCwgaW1hZyBpbnRlcmxlYXZlZCAqLworCisgIGNvbnN0IEZJWFBfREJMIHBpX3gyID0gUEl4Ml9fSVBEOworICBmb3IgKHBiID0gMDsgcGIgPCBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kczsgcGIrKykgeworICAgIEZJWFBfREJMIHBsLCBwcjsKKworICAgIHBsID0gaW50ZXJwX2FuZ2xlX19GREsoc2VsZi0+UGhhc2VQcmV2TGVmdF9fRkRLW3BiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPlBoYXNlTGVmdF9fRkRLW3BiXSwgYWxwaGFfX0ZESywgcGlfeDIpOworICAgIHByID0gaW50ZXJwX2FuZ2xlX19GREsoc2VsZi0+UGhhc2VQcmV2UmlnaHRfX0ZES1twYl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5QaGFzZVJpZ2h0X19GREtbcGJdLCBhbHBoYV9fRkRLLCBwaV94Mik7CisKKyAgICBpbmxpbmVfZml4cF9jb3Nfc2luKHBsLCBwciwgSVBEX1NDQUxFLCAmcHBiWzQgKiBwYl0pOworICB9CisKKyAgLyogc2lnbiBpcyAtMSBmb3IgcXMgPSAwLDIgYW5kICsxIGZvciBxcyA9IDEgKi8KKworICBjb25zdCBTQ0hBUiAqa2VybmVscyA9ICZzZWxmLT5rZXJuZWxzWzBdOworCisgIEZJWFBfREJMICpEcnlfcmVhbDAgPSAmc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLWzBdWzBdOworICBGSVhQX0RCTCAqRHJ5X2ltYWcwID0gJnNlbGYtPmh5Yk91dHB1dEltYWdEcnlfX0ZES1swXVswXTsKKyAgRklYUF9EQkwgKkRyeV9yZWFsMSA9ICZzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREtbMV1bMF07CisgIEZJWFBfREJMICpEcnlfaW1hZzEgPSAmc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLWzFdWzBdOworCisgIGZvciAocXMgPSAyOyBxcyA+PSAwOyBxcy0tKSB7CisgICAgRklYUF9EQkwgb3V0X3JlLCBvdXRfaW07CisKKyAgICBwYiA9ICprZXJuZWxzKys7CisgICAgaWYgKHFzID09IDEpIC8qIHNpZ25bcXNdID49IDAgKi8KKyAgICB7CisgICAgICBjcGx4TXVsdERpdjIoJm91dF9yZSwgJm91dF9pbSwgKkRyeV9yZWFsMCwgKkRyeV9pbWFnMCwgcHBiWzQgKiBwYiArIDBdLAorICAgICAgICAgICAgICAgICAgIHBwYls0ICogcGIgKyAxXSk7CisgICAgICBvdXRfcmUgPDw9IFBIQVNFX1NDQUxFIC0gMTsKKyAgICAgIG91dF9pbSA8PD0gUEhBU0VfU0NBTEUgLSAxOworICAgICAgKkRyeV9yZWFsMCsrID0gb3V0X3JlOworICAgICAgKkRyeV9pbWFnMCsrID0gb3V0X2ltOworCisgICAgICBjcGx4TXVsdERpdjIoJm91dF9yZSwgJm91dF9pbSwgKkRyeV9yZWFsMSwgKkRyeV9pbWFnMSwgcHBiWzQgKiBwYiArIDJdLAorICAgICAgICAgICAgICAgICAgIHBwYls0ICogcGIgKyAzXSk7CisgICAgICBvdXRfcmUgPDw9IFBIQVNFX1NDQUxFIC0gMTsKKyAgICAgIG91dF9pbSA8PD0gUEhBU0VfU0NBTEUgLSAxOworICAgICAgKkRyeV9yZWFsMSsrID0gb3V0X3JlOworICAgICAgKkRyeV9pbWFnMSsrID0gb3V0X2ltOworICAgIH0gZWxzZSB7CisgICAgICBjcGx4TXVsdERpdjIoJm91dF9yZSwgJm91dF9pbSwgKkRyeV9yZWFsMCwgKkRyeV9pbWFnMCwgcHBiWzQgKiBwYiArIDBdLAorICAgICAgICAgICAgICAgICAgIC1wcGJbNCAqIHBiICsgMV0pOworICAgICAgb3V0X3JlIDw8PSBQSEFTRV9TQ0FMRSAtIDE7CisgICAgICBvdXRfaW0gPDw9IFBIQVNFX1NDQUxFIC0gMTsKKyAgICAgICpEcnlfcmVhbDArKyA9IG91dF9yZTsKKyAgICAgICpEcnlfaW1hZzArKyA9IG91dF9pbTsKKworICAgICAgY3BseE11bHREaXYyKCZvdXRfcmUsICZvdXRfaW0sICpEcnlfcmVhbDEsICpEcnlfaW1hZzEsIHBwYls0ICogcGIgKyAyXSwKKyAgICAgICAgICAgICAgICAgICAtcHBiWzQgKiBwYiArIDNdKTsKKyAgICAgIG91dF9yZSA8PD0gUEhBU0VfU0NBTEUgLSAxOworICAgICAgb3V0X2ltIDw8PSBQSEFTRV9TQ0FMRSAtIDE7CisgICAgICAqRHJ5X3JlYWwxKysgPSBvdXRfcmU7CisgICAgICAqRHJ5X2ltYWcxKysgPSBvdXRfaW07CisgICAgfQorICB9CisKKyAgLyogc2lnbiBpcyArMSBmb3IgcXMgPj0zICovCisgIGZvciAocXMgPSBzZWxmLT5oeWJyaWRCYW5kcyAtIDM7IHFzLS07KSB7CisgICAgRklYUF9EQkwgb3V0X3JlLCBvdXRfaW07CisKKyAgICBwYiA9ICprZXJuZWxzKys7CisgICAgY3BseE11bHREaXYyKCZvdXRfcmUsICZvdXRfaW0sICpEcnlfcmVhbDAsICpEcnlfaW1hZzAsIHBwYls0ICogcGIgKyAwXSwKKyAgICAgICAgICAgICAgICAgcHBiWzQgKiBwYiArIDFdKTsKKyAgICBvdXRfcmUgPDw9IFBIQVNFX1NDQUxFIC0gMTsKKyAgICBvdXRfaW0gPDw9IFBIQVNFX1NDQUxFIC0gMTsKKyAgICAqRHJ5X3JlYWwwKysgPSBvdXRfcmU7CisgICAgKkRyeV9pbWFnMCsrID0gb3V0X2ltOworCisgICAgY3BseE11bHREaXYyKCZvdXRfcmUsICZvdXRfaW0sICpEcnlfcmVhbDEsICpEcnlfaW1hZzEsIHBwYls0ICogcGIgKyAyXSwKKyAgICAgICAgICAgICAgICAgcHBiWzQgKiBwYiArIDNdKTsKKyAgICBvdXRfcmUgPDw9IFBIQVNFX1NDQUxFIC0gMTsKKyAgICBvdXRfaW0gPDw9IFBIQVNFX1NDQUxFIC0gMTsKKyAgICAqRHJ5X3JlYWwxKysgPSBvdXRfcmU7CisgICAgKkRyeV9pbWFnMSsrID0gb3V0X2ltOworICB9Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19wcm9jZXNzLmggYi9saWJTQUNkZWMvc3JjL3NhY19wcm9jZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyZjJmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9zcmMvc2FjX3Byb2Nlc3MuaApAQCAtMCwwICsxLDI5NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgUHJvY2Vzc2luZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBQb2x5cGhhc2UgRmlsdGVyYmFuaworKi8KKworI2lmbmRlZiBTQUNfUFJPQ0VTU19ICisjZGVmaW5lIFNBQ19QUk9DRVNTX0gKKworI2luY2x1ZGUgInNhY19kZWMuaCIKKwordm9pZCBTcGF0aWFsRGVjQXBwbHlQaGFzZShzcGF0aWFsRGVjICpzZWxmLCBGSVhQX1NHTCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RTbG90T2ZQYXJhbVNldCk7CisKKy8qKgorICogXGJyaWVmICBBcHBseSBRTUYgQW5hbHlzaXMgRmlsdGVyYmFuay4KKyAqCisgKiBDYWxjdWxhdGVzIHFtZiBkYXRhIG9uIGRvd25taXggaW5wdXQgdGltZSBkYXRhLgorICogRGVsYXlsaW5lcyB3aWxsIGJlIGFwcGxpZWQgaWYgbmVjZXNzYXJheS4KKyAqCisgKiBccGFyYW0gc2VsZiAgICAgICAgICAgICAgICBBIHNwYXRpYWwgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gaW5EYXRhICAgICAgICAgICAgICBEb3dubWl4IGNoYW5uZWwgdGltZSBkYXRhIGFzIGlucHV0LgorICogXHBhcmFtIHRzICAgICAgICAgICAgICAgICAgU2lnbmFscyB0aW1lIHNsb3Qgb2Zmc2V0IGZvciBpbnB1dCBidWZmZXIuCisgKiBccGFyYW0gcW1mUmVhbCAgICAgICAgICAgICBEb3dubWl4IGNoYW5uZWwgcW1mIG91dHB1dCBkYXRhLgorICogXHBhcmFtIHFtZkltYWcgICAgICAgICAgICAgRG93bm1peCBjaGFubmVsIHFtZiBvdXRwdXQgZGF0YS4KKyAqCisgKiBccmV0dXJuICBFcnJvciBzdGF0dXMuCisgKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjUU1GQW5hbHlzaXMoc3BhdGlhbERlYyAqc2VsZiwgY29uc3QgUENNX01QUyAqaW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdHMsIGNvbnN0IElOVCBieXBhc3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZlJlYWwsIEZJWFBfREJMICoqcW1mSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUlucHV0Q2hhbm5lbHMpOworCisvKioKKyAqIFxicmllZiAgRmVlZCBzcGF0aWFsIGRlY29kZXIgd2l0aCBleHRlcm5hbCBxbWYgZGF0YS4KKyAqCisgKiBccGFyYW0gc2VsZiAgICAgICAgICAgICAgICBBIHNwYXRpYWwgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gcW1mSW5EYXRhUmVhbCAgICAgICBFeHRlcm5hbCBxbWYgZG93bm1peCBkYXRhIGFzIGlucHV0LgorICogXHBhcmFtIHFtZkluRGF0YUltYWcgICAgICAgRXh0ZXJuYWwgcW1mIGRvd25taXggZGF0YSBhcyBpbnB1dC4KKyAqIFxwYXJhbSB0cyAgICAgICAgICAgICAgICAgIFNpZ25hbHMgdGltZSBzbG90IGluIGlucHV0IGJ1ZmZlciB0byBwcm9jZXNzLgorICogXHBhcmFtIHFtZlJlYWwgICAgICAgICAgICAgRG93bm1peCBjaGFubmVsIHFtZiBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSBxbWZJbWFnICAgICAgICAgICAgIERvd25taXggY2hhbm5lbCBxbWYgb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gbnVtSW5wdXRDaGFubmVscyAgICBOdW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMuIE1pZ2h0IGRpZmZlciBmcm9tCisgKiBzZWxmLT5udW1JbnB1dENoYW5uZWxzLgorICoKKyAqIFxyZXR1cm4gIEVycm9yIHN0YXR1cy4KKyAqLworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNGZWVkUU1GKHNwYXRpYWxEZWMgKnNlbGYsIEZJWFBfREJMICoqcW1mSW5EYXRhUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZkluRGF0YUltYWcsIGNvbnN0IElOVCB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYnlwYXNzTW9kZSwgRklYUF9EQkwgKipxbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mSW1hZywgY29uc3QgSU5UIG51bUlucHV0Q2hhbm5lbHMpOworCisvKioKKyAqIFxicmllZiAgQXBwbHkgSHlicmRpZCBBbmFseXNpcyBGaWx0ZXJiYW5rLgorICoKKyAqIENhbGN1bGF0ZXMgaHlicmlkIGRhdGEgb24gZG93bm1peCBpbnB1dCBkYXRhLgorICogUmVzaWR1YWwgaHlicmlkIHNpZ25hbHMgd2lsbCBhbHNvIGJlIGNhbGN1bGF0ZWQgb24gY3VycmVudCBzbG90IGlmIGF2YWlsYWJsZS4KKyAqCisgKiBccGFyYW0gc2VsZiAgICAgICAgICAgICAgICBBIHNwYXRpYWwgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gcW1mSW5wdXRSZWFsICAgICAgICBEb3dubWl4IGNoYW5uZWwgcW1mIGRhdGEgYXMgaW5wdXQuCisgKiBccGFyYW0gcW1mSW5wdXRJbWFnICAgICAgICBEb3dubWl4IGNoYW5uZWwgcW1mIGRhdGEgYXMgaW5wdXQuCisgKiBccGFyYW0gaHliT3V0cHV0UmVhbCAgICAgICBEb3dubWl4IGNoYW5uZWwgaHlicmlkIG91dHB1dCBkYXRhLgorICogXHBhcmFtIGh5Yk91dHB1dEltYWcgICAgICAgRG93bm1peCBjaGFubmVsIGh5YnJpZCBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSB0cyAgICAgICAgICAgICAgICAgIFNpZ25hbHMgdGltZSBzbG90IGluIHNwYXRpYWwgZnJhbWUgdG8gcHJvY2Vzcy4KKyAqIFxwYXJhbSBudW1JbnB1dENoYW5uZWxzICAgIE51bWJlciBvZiBpbnB1dCBjaGFubmVscy4gTWlnaHQgZGlmZmVyIGZyb20KKyAqIHNlbGYtPm51bUlucHV0Q2hhbm5lbHMuCisgKgorICogXHJldHVybiAgRXJyb3Igc3RhdHVzLgorICovCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0h5YnJpZEFuYWx5c2lzKHNwYXRpYWxEZWMgKnNlbGYsIEZJWFBfREJMICoqcW1mSW5wdXRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZklucHV0SW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dEltYWcsIGNvbnN0IElOVCB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bUlucHV0Q2hhbm5lbHMpOworCisvKioKKyAqIFxicmllZiAgQ3JlYXRlIFggZGF0YS4KKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciBsaXN0IG92ZXIgWGNoYW5uZWxzIHBvaW50aW5nIHRvIGRvd25taXggaW5wdXQgY2hhbm5lbHMKKyAqIGFuZCB0byByZXNpZHVhbCBjaGFubmVscyB3aGVuIHByb3ZpZGVkLgorICoKKyAqIFxwYXJhbSBzZWxmICAgICAgICAgICAgICAgIEEgc3BhdGlhbCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBoeWJJbnB1dFJlYWwgICAgICAgIERvd25taXggY2hhbm5lbCBoeWJyaWQgZGF0YSBhcyBpbnB1dC4KKyAqIFxwYXJhbSBoeWJJbnB1dEltYWcgICAgICAgIERvd25taXggY2hhbm5lbCBoeWJyaWQgZGF0YSBhcyBpbnB1dC4KKyAqIFxwYXJhbSBweFJlYWwgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaHlicmlkIGFuZCByZXNpZHVhbCBkYXRhIGFzIG91dHB1dC4KKyAqIFxwYXJhbSBweEltYWcgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaHlicmlkIGFuZCByZXNpZHVhbCBkYXRhIGFzIG91dHB1dC4KKyAqCisgKiBccmV0dXJuICBFcnJvciBzdGF0dXMuCisgKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQ3JlYXRlWChzcGF0aWFsRGVjICpzZWxmLCBGSVhQX0RCTCAqKmh5YklucHV0UmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5YklucHV0SW1hZywgRklYUF9EQkwgKipweFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipweEltYWcpOworCisvKioKKyAqIFxicmllZiAgTVBTMjEyIGNvbWJpbmVkIHZlcnNpb24gb2YgYXBwbHkgTTEgcGFyYW1ldGVycyBhbmQgY3JlYXRlIHdldCBzaWduYWwKKyAqCisgKiBccGFyYW0gc2VsZiAgICAgICAgICAgICAgICBBIHNwYXRpYWwgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0geFJlYWwgICAgICAgICAgICAgICBEb3dubWl4IGFuZCByZXNpZHVhbCBYIGRhdGEgYXMgaW5wdXQuCisgKiBccGFyYW0geEltYWcgICAgICAgICAgICAgICBEb3dubWl4IGFuZCByZXNpZHVhbCBYIGRhdGEgYXMgaW5wdXQuCisgKiBccGFyYW0gdlJlYWwgICAgICAgICAgICAgICBvdXRwdXQgZGF0YTogWzBdIGRpcmVjdCBzaWduYWwgKFYpOyBbMV0gd2V0IHNpZ25hbAorICogKFcpLgorICogXHBhcmFtIHZJbWFnICAgICAgICAgICAgICAgb3V0cHV0IGRhdGE6IFswXSBkaXJlY3Qgc2lnbmFsIChWKTsgWzFdIHdldCBzaWduYWwKKyAqIChXKS4KKyAqCisgKiBccmV0dXJuICBFcnJvciBzdGF0dXMuCisgKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQXBwbHlNMV9DcmVhdGVXX01vZGUyMTIoCisgICAgc3BhdGlhbERlYyAqc2VsZiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUsIEZJWFBfREJMICoqeFJlYWwsCisgICAgRklYUF9EQkwgKip4SW1hZywgRklYUF9EQkwgKip2UmVhbCwgRklYUF9EQkwgKip2SW1hZyk7CisKKy8qKgorICogXGJyaWVmICBBcHBseSBNMiBwYXJhbWV0ZXJzLgorICoKKyAqIFxwYXJhbSBzZWxmICAgICAgICAgICAgICAgIEEgc3BhdGlhbCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBwcyAgICAgICAgICAgICAgICAgIFNpZ25hbHMgcGFyYW1ldGVyIGJhbmQgZnJvbSB3aGVyZSBNMiBwYXJhbWV0ZXIgdG8KKyAqIHVzZS4KKyAqIFxwYXJhbSBhbHBoYSAgICAgICAgICAgICAgIFNtb290aGluZyBmYWN0b3IgYmV0d2VlbiBjdXJyZW50IGFuZCBwcmV2aW91cworICogcGFyYW1ldGVyIGJhbmQuIFJhbmdlYWJpbGl0eSBiZXR3ZWVuIDAuZiBhbmQgMS5mLgorICogXHBhcmFtIHdSZWFsICAgICAgICAgICAgICAgV2V0IGlucHV0IGRhdGEuCisgKiBccGFyYW0gd0ltYWcgICAgICAgICAgICAgICBXZXQgaW5wdXQgZGF0YS4KKyAqIFxwYXJhbSBoeWJPdXRwdXRSZWFsRHJ5ICAgIERyeSBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSBoeWJPdXRwdXRJbWFnRHJ5ICAgIERyeSBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSBoeWJPdXRwdXRSZWFsV2V0ICAgIFdldCBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSBoeWJPdXRwdXRJbWFnV2V0ICAgIFdldCBvdXRwdXQgZGF0YS4KKyAqCisgKiBccmV0dXJuICBFcnJvciBzdGF0dXMuCisgKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQXBwbHlNMihzcGF0aWFsRGVjICpzZWxmLCBJTlQgcHMsIGNvbnN0IEZJWFBfU0dMIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqd1JlYWwsIEZJWFBfREJMICoqd0ltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRSZWFsRHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0SW1hZ0RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dFJlYWxXZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRJbWFnV2V0KTsKKworLyoqCisgKiBcYnJpZWYgIEFwcGx5IE0yIHBhcmFtZXRlciBmb3IgMjEyIG1vZGUgd2l0aCByZXNpZHVhbENvZGluZyBhbmQgcGhhc2VDb2RpbmcuCisgKgorICogXHBhcmFtIHNlbGYgICAgICAgICAgICAgICAgW2ldIEEgc3BhdGlhbCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBwcyAgICAgICAgICAgICAgICAgIFtpXSBTaWduYWxzIHBhcmFtZXRlciBiYW5kIGZyb20gd2hlcmUgTTIgcGFyYW1ldGVyCisgKiB0byB1c2UuCisgKiBccGFyYW0gYWxwaGEgICAgICAgICAgICAgICBbaV0gU21vb3RoaW5nIGZhY3RvciBiZXR3ZWVuIGN1cnJlbnQgYW5kIHByZXZpb3VzCisgKiBwYXJhbWV0ZXIgYmFuZC4gUmFuZ2VhYmlsaXR5IGJldHdlZW4gMC5mIGFuZCAxLmYuCisgKiBccGFyYW0gd1JlYWwgICAgICAgICAgICAgICBbaV0gV2V0IGlucHV0IGRhdGEuCisgKiBccGFyYW0gd0ltYWcgICAgICAgICAgICAgICBbaV0gV2V0IGlucHV0IGRhdGEuCisgKiBccGFyYW0gaHliT3V0cHV0UmVhbERyeSAgICBbb10gRHJ5IG91dHB1dCBkYXRhLgorICogXHBhcmFtIGh5Yk91dHB1dEltYWdEcnkgICAgW29dIERyeSBvdXRwdXQgZGF0YS4KKyAqCisgKiBccmV0dXJuIGVycm9yCisgKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQXBwbHlNMl9Nb2RlMjEyX1Jlc2lkdWFsc1BsdXNQaGFzZUNvZGluZygKKyAgICBzcGF0aWFsRGVjICpzZWxmLCBJTlQgcHMsIGNvbnN0IEZJWFBfU0dMIGFscGhhLCBGSVhQX0RCTCAqKndSZWFsLAorICAgIEZJWFBfREJMICoqd0ltYWcsIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbERyeSwgRklYUF9EQkwgKipoeWJPdXRwdXRJbWFnRHJ5KTsKKworLyoqCisgKiBcYnJpZWYgIEFwcGx5IE0yIHBhcmFtZXRlciBmb3IgMjEyIG1vZGUsIHVwbWl4IGZyb20gbW9ubyB0byBzdGVyZW8uCisgKgorICogXHBhcmFtIHNlbGYgICAgICAgICAgICAgICAgW2ldIEEgc3BhdGlhbCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBwcyAgICAgICAgICAgICAgICAgIFtpXSBTaWduYWxzIHBhcmFtZXRlciBiYW5kIGZyb20gd2hlcmUgTTIgcGFyYW1ldGVyCisgKiB0byB1c2UuCisgKiBccGFyYW0gYWxwaGEgICAgICAgICAgICAgICBbaV0gU21vb3RoaW5nIGZhY3RvciBiZXR3ZWVuIGN1cnJlbnQgYW5kIHByZXZpb3VzCisgKiBwYXJhbWV0ZXIgYmFuZC4gUmFuZ2VhYmlsaXR5IGJldHdlZW4gMC5mIGFuZCAxLmYuCisgKiBccGFyYW0gd1JlYWwgICAgICAgICAgICAgICBbaV0gV2V0IGlucHV0IGRhdGEuCisgKiBccGFyYW0gd0ltYWcgICAgICAgICAgICAgICBbaV0gV2V0IGlucHV0IGRhdGEuCisgKiBccGFyYW0gaHliT3V0cHV0UmVhbERyeSAgICBbb10gRHJ5IG91dHB1dCBkYXRhLgorICogXHBhcmFtIGh5Yk91dHB1dEltYWdEcnkgICAgW29dIERyeSBvdXRwdXQgZGF0YS4KKyAqCisgKiBccmV0dXJuIGVycm9yCisgKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQXBwbHlNMl9Nb2RlMjEyKHNwYXRpYWxEZWMgKnNlbGYsIElOVCBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGFscGhhLCBGSVhQX0RCTCAqKndSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKip3SW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbERyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0SW1hZ0RyeSk7CisKKy8qKgorICogXGJyaWVmICBDb252ZXJ0IEh5YnJpZCBpbnB1dCB0byBvdXRwdXQgYXVkaW8gZGF0YS4KKyAqCisgKiBccGFyYW0gaFNwYWNlU3ludGhlc2lzUW1mICBBIHNwYXRpYWwgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gdHMgICAgICAgICAgICAgICAgICBTaWduYWxzIHRpbWUgc2xvdCBpbiBzcGF0aWFsIGZyYW1lIHRvIHByb2Nlc3MuCisgKiBccGFyYW0gaHliT3V0cHV0UmVhbCAgICAgICBIeWJyaWQgZGF0YSBhcyBpbnB1dC4KKyAqIFxwYXJhbSBoeWJPdXRwdXRJbWFnICAgICAgIEh5YnJpZCBkYXRhIGFzIGlucHV0LgorICogXHBhcmFtIHRpbWVPdXQgICAgICAgICAgICAgYXVkaW8gb3V0cHV0IGRhdGEuCisgKgorICogXHJldHVybiAgRXJyb3Igc3RhdHVzLgorICovCitTQUNERUNfRVJST1IgU3BhdGlhbERlY1N5bnRoZXNpcyhzcGF0aWFsRGVjICpzZWxmLCBjb25zdCBJTlQgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dEltYWcsIFBDTV9NUFMgKnRpbWVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtSW5wdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IgKmNvbnN0IG1hcERlc2NyKTsKKwordm9pZCBTcGF0aWFsRGVjQnVmZmVyTWF0cmljZXMoc3BhdGlhbERlYyAqc2VsZik7CisKK0ZJWFBfREJMIGdldENoR2FpbihzcGF0aWFsRGVjICpzZWxmLCBVSU5UIGNoLCBJTlQgKnNjYWxlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19xbWYuY3BwIGIvbGliU0FDZGVjL3NyYy9zYWNfcW1mLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDc1NDkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfcW1mLmNwcApAQCAtMCwwICsxLDE1NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIFFNRiBwcm9jZXNzaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzYWNfcW1mLmgiCisKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisjaW5jbHVkZSAic2FjX2RlY19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJzYWNfcm9tLmgiCisKKyNpbmNsdWRlICJxbWYuaCIKKworU0FDREVDX0VSUk9SIENhbGN1bGF0ZVNwYWNlU3ludGhlc2lzUW1mKAorICAgIGNvbnN0IEhBTkRMRV9GREtfUU1GX0RPTUFJTl9PVVQgaFFtZkRvbWFpbk91dENoLCBjb25zdCBGSVhQX0RCTCAqU3IsCisgICAgY29uc3QgRklYUF9EQkwgKlNpLCBjb25zdCBJTlQgc3RyaWRlLCBJTlRfUENNICp0aW1lU2lnKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisKKyAgaWYgKGhRbWZEb21haW5PdXRDaCA9PSBOVUxMKSB7CisgICAgZXJyID0gTVBTX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIEhBTkRMRV9TUEFDRV9TWU5USEVTSVNfUU1GIGhTcGFjZVN5bnRoZXNpc1FtZiA9ICZoUW1mRG9tYWluT3V0Q2gtPmZiOworI2lmIChRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyA8PSA2NCkKKyAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyA8PCAxKSk7CisjZWxzZQorICAgIENfQUFMTE9DX1NUQUNLX1NUQVJUKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgKFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTIDw8IDEpKTsKKyNlbmRpZgorCisgICAgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdChoU3BhY2VTeW50aGVzaXNRbWYsIFNyLCBTaSwgMCwgMCwgdGltZVNpZywgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIpOworCisjaWYgKFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTIDw9IDY0KQorICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgKFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTIDw8IDEpKTsKKyNlbHNlCisgICAgQ19BQUxMT0NfU1RBQ0tfRU5EKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgKFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTIDw8IDEpKTsKKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworU0FDREVDX0VSUk9SIENhbGN1bGF0ZVNwYWNlQW5hbHlzaXNRbWYoCisgICAgSEFORExFX1NQQUNFX0FOQUxZU0lTX1FNRiBoU3BhY2VBbmFseXNpc1FtZiwgY29uc3QgUENNX01QUyAqdGltZVNpZywKKyAgICBGSVhQX0RCTCAqU3IsIEZJWFBfREJMICpTaSkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworCisgIGlmIChoU3BhY2VBbmFseXNpc1FtZiA9PSBOVUxMKSB7CisgICAgZXJyID0gTVBTX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAoNjQgPDwgMSkpOworCisgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KGhTcGFjZUFuYWx5c2lzUW1mLCBTciwgU2ksIHRpbWVTaWcsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyKTsKKyAgICBDX0FBTExPQ19TQ1JBVENIX0VORChwV29ya0J1ZmZlciwgRklYUF9EQkwsICg2NCA8PCAxKSk7CisgIH0KKworICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfcW1mLmggYi9saWJTQUNkZWMvc3JjL3NhY19xbWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRjODM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfcW1mLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlYyBRTUYgcHJvY2Vzc2luZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ19RTUZfSAorI2RlZmluZSBTQUNfUU1GX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2luY2x1ZGUgInNhY19kZWNfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJGREtfcW1mX2RvbWFpbi5oIgorI2RlZmluZSBIQU5ETEVfU1BBQ0VfQU5BTFlTSVNfUU1GIEhBTkRMRV9RTUZfRklMVEVSX0JBTksKKyNkZWZpbmUgSEFORExFX1NQQUNFX1NZTlRIRVNJU19RTUYgSEFORExFX1FNRl9GSUxURVJfQkFOSworCisvKioKKyAqIFxicmllZiAgQ29udmVydCBRbWYgaW5wdXQgdG8gb3V0cHV0IGF1ZGlvIGRhdGEuCisgKgorICogXHBhcmFtIGhTcGFjZVN5bnRoZXNpc1FtZiAgQSBRbWYgU3ludGhlc2lzIEZpbHRlcmJhbmsgaGFuZGxlLgorICogXHBhcmFtIFNyICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBRbWYgaW5wdXQgYnVmZmVyLgorICogXHBhcmFtIFNpICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBRbWYgaW5wdXQgYnVmZmVyLgorICogXHBhcmFtIHN0cmlkZSAgICAgICAgICAgICAgU3RyaWRlIGZhY3RvciBmb3Igb3V0cHV0IGRhdGEsIDEgaWYgbm9uZS4KKyAqIFxwYXJhbSB0aW1lU2lnICAgICAgICAgICAgIChOb25lLSlJbnRlcmxlYXZlZCBhdWRpbyBvdXRwdXQgZGF0YS4KKyAqCisgKiBccmV0dXJuICBFcnJvciBzdGF0dXMuCisgKi8KK1NBQ0RFQ19FUlJPUiBDYWxjdWxhdGVTcGFjZVN5bnRoZXNpc1FtZigKKyAgICBjb25zdCBIQU5ETEVfRkRLX1FNRl9ET01BSU5fT1VUIGhRbWZEb21haW5PdXRDaCwgY29uc3QgRklYUF9EQkwgKlNyLAorICAgIGNvbnN0IEZJWFBfREJMICpTaSwgY29uc3QgSU5UIHN0cmlkZSwgSU5UX1BDTSAqdGltZVNpZyk7CisKKy8qKgorICogXGJyaWVmICBDb252ZXJ0IGF1ZGlvIGlucHV0IGRhdGEgdG8gcW1mIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIFxwYXJhbSBoU3BhY2VBbmFseXNpc1FtZiAgIEEgUW1mIEFuYWx5c2lzIEZpbHRlcmJhbmsgaGFuZGxlLgorICogXHBhcmFtIHRpbWVTaWcgICAgICAgICAgICAgKE5vbmUtKUludGVybGVhdmQgYXVkaW8gaW5wdXQgZGF0YS4KKyAqIFxwYXJhbSBTciAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gUW1mIG91dHB1dCBidWZmZXIuCisgKiBccGFyYW0gU2kgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIFFtZiBvdXRwdXQgYnVmZmVyLgorICoKKyAqIFxyZXR1cm4gIEVycm9yIHN0YXR1cy4KKyAqLworU0FDREVDX0VSUk9SIENhbGN1bGF0ZVNwYWNlQW5hbHlzaXNRbWYoCisgICAgSEFORExFX1NQQUNFX0FOQUxZU0lTX1FNRiBoU3BhY2VBbmFseXNpc1FtZiwgY29uc3QgUENNX01QUyAqdGltZVNpZywKKyAgICBGSVhQX0RCTCAqU3IsIEZJWFBfREJMICpTaSk7CisKKyNlbmRpZiAvKiBTQUNfUU1GX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX3Jlc2hhcGVCQkVudi5jcHAgYi9saWJTQUNkZWMvc3JjL3NhY19yZXNoYXBlQkJFbnYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzBhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19yZXNoYXBlQkJFbnYuY3BwCkBAIC0wLDAgKzEsNjgwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IFNBQyBEZWMgZ3VpZGVkIGVudmVsb3BlIHNoYXBpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNhY19yZXNoYXBlQkJFbnYuaCIKKworI2luY2x1ZGUgInNhY19kZWMuaCIKKyNpbmNsdWRlICJzYWNfYml0ZGVjLmgiCisjaW5jbHVkZSAic2FjX2NhbGNNMWFuZE0yLmgiCisjaW5jbHVkZSAic2FjX3Jlc2hhcGVCQkVudi5oIgorI2luY2x1ZGUgInNhY19yb20uaCIKKworI2RlZmluZSBJTlBfRFJZX1dFVCAwCisjZGVmaW5lIElOUF9ETVggMQorCisjZGVmaW5lIFNGX1NIQVBFIDEKKyNkZWZpbmUgU0ZfRElWMzIgNgorI2RlZmluZSBTRl9GQUNUT1JfU0xPVCA1CisKKyNkZWZpbmUgU1RBUlRfQkJfRU5WIDAgLyogMTAgKi8KKyNkZWZpbmUgRU5EX0JCX0VOViA5ICAgLyogMTggKi8KKworI2RlZmluZSBTRl9BTFBIQTEgOAorI2RlZmluZSBTRl9CRVRBMSA0CisKK3ZvaWQgaW5pdEJCRW52KHNwYXRpYWxEZWMgKnNlbGYsIGludCBpbml0U3RhdGVzRmxhZykgeworICBJTlQgY2gsIGs7CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICBrID0gcm93MmNoYW5uZWxHRVNbc2VsZi0+dHJlZUNvbmZpZ11bY2hdOworICAgIHNlbGYtPnJvdzJjaGFubmVsRG14R0VTW2NoXSA9IGs7CisgICAgaWYgKGsgPT0gLTEpIGNvbnRpbnVlOworCisgICAgc3dpdGNoIChzZWxmLT50cmVlQ29uZmlnKSB7CisgICAgICBjYXNlIFRSRUVfMjEyOgorICAgICAgICBzZWxmLT5yb3cyY2hhbm5lbERteEdFU1tjaF0gPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6OworICAgIH0KKyAgfQorCisgIGlmIChpbml0U3RhdGVzRmxhZykgeworICAgIGZvciAoayA9IDA7IGsgPCAyICogTUFYX09VVFBVVF9DSEFOTkVMUyArIE1BWF9JTlBVVF9DSEFOTkVMUzsgaysrKSB7CisgICAgICBzZWxmLT5yZXNoYXBlQkJFbnZTdGF0ZS0+bm9ybU5yZ1ByZXZfX0ZES1trXSA9CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC41Zik7IC8qIDMyNzY4LmYqMzI3NjguZiAqLworICAgICAgc2VsZi0+cmVzaGFwZUJCRW52U3RhdGUtPm5vcm1OcmdQcmV2U0Zba10gPSBERlJBQ1RfQklUUyAtIDE7CisgICAgICBzZWxmLT5yZXNoYXBlQkJFbnZTdGF0ZS0+cGFydE5yZ1ByZXZTRltrXSA9IDA7CisgICAgICBzZWxmLT5yZXNoYXBlQkJFbnZTdGF0ZS0+cGFydE5yZ1ByZXYyU0Zba10gPSAwOworICAgICAgc2VsZi0+cmVzaGFwZUJCRW52U3RhdGUtPmZyYW1lTnJnUHJldlNGW2tdID0gMDsKKyAgICB9CisgIH0KKworICBzZWxmLT5yZXNoYXBlQkJFbnZTdGF0ZS0+YWxwaGFfX0ZESyA9CisgICAgICBGTDJGWENPTlNUX0RCTCgwLjk5NjM3ODQ1NTc1Zik7IC8qIEZES2V4cCgtNjQgLyAoMC40ZiAgKiA0NDEwMCkpICovCisgIHNlbGYtPnJlc2hhcGVCQkVudlN0YXRlLT5iZXRhX19GREsgPQorICAgICAgRkwyRlhDT05TVF9EQkwoMC45NjQzNjkwOTQ4OGYpOyAvKiBGREtleHAoLTY0IC8gKDAuMDRmICogNDQxMDApKSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0U2xvdE5yZ0hRKEZJWFBfREJMICpSRVNUUklDVCBwUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2xvdE5yZywgSU5UIG1heFZhbFNGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaHliQmFuZHMpIHsKKyAgSU5UIHFzOworICBGSVhQX0RCTCBucmc7CisKKyAgLyogcXMgPSAxMiwgMTMsIDE0ICovCisgIHNsb3ROcmdbMF0gPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgICAgICAoU0ZfRkFDVE9SX1NMT1QgLSAxKSk7CisgIHNsb3ROcmdbMV0gPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgICAgICAoU0ZfRkFDVE9SX1NMT1QgLSAxKSk7CisgIHNsb3ROcmdbMl0gPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgICAgICAoU0ZfRkFDVE9SX1NMT1QgLSAxKSk7CisgIC8qIHFzID0gMTUgKi8KKyAgc2xvdE5yZ1szXSA9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgLyogcXMgPSAxNiwgMTcgKi8KKyAgbnJnID0gKChmUG93MkRpdjIoKCpwUmVhbCsrKSA8PCBtYXhWYWxTRikgKworICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgc2xvdE5yZ1s0XSA9IG5yZyArICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgLyogcXMgPSAxOCwgMTksIDIwICovCisgIG5yZyA9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICBmUG93MkRpdjIoKCpwSW1hZysrKSA8PCBtYXhWYWxTRikpID4+CisgICAgICAgICAoU0ZfRkFDVE9SX1NMT1QgLSAxKSk7CisgIG5yZyArPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAoU0ZfRkFDVE9SX1NMT1QgLSAxKSk7CisgIHNsb3ROcmdbNV0gPSBucmcgKyAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAoU0ZfRkFDVE9SX1NMT1QgLSAxKSk7CisgIC8qIHFzID0gMjEsIDIyICovCisgIG5yZyA9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICBmUG93MkRpdjIoKCpwSW1hZysrKSA8PCBtYXhWYWxTRikpID4+CisgICAgICAgICAoU0ZfRkFDVE9SX1NMT1QgLSAxKSk7CisgIHNsb3ROcmdbNl0gPSBucmcgKyAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAoU0ZfRkFDVE9SX1NMT1QgLSAxKSk7CisgIC8qIHFzID0gMjMsIDI0ICovCisgIGlmIChoeWJCYW5kcyA+IDIzKSB7CisgICAgc2xvdE5yZ1s2XSArPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgICAgICAgICAoU0ZfRkFDVE9SX1NMT1QgLSAxKSk7CisgICAgc2xvdE5yZ1s2XSArPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgICAgICAgICAoU0ZfRkFDVE9SX1NMT1QgLSAxKSk7CisgICAgLyogcXMgPSAyNSwgMjYsIDI5LCAyOCwgMjkgKi8KKyAgICBucmcgPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICBmUG93MkRpdjIoKCpwSW1hZysrKSA8PCBtYXhWYWxTRikpID4+CisgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgICBucmcgKz0gKChmUG93MkRpdjIoKCpwUmVhbCsrKSA8PCBtYXhWYWxTRikgKworICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgICBucmcgKz0gKChmUG93MkRpdjIoKCpwUmVhbCsrKSA8PCBtYXhWYWxTRikgKworICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgICBucmcgKz0gKChmUG93MkRpdjIoKCpwUmVhbCsrKSA8PCBtYXhWYWxTRikgKworICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgICBzbG90TnJnWzddID0gbnJnICsgKChmUG93MkRpdjIoKCpwUmVhbCsrKSA8PCBtYXhWYWxTRikgKworICAgICAgICAgICAgICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgICAvKiBxcyA9IDMwIC4uLiBtaW4oNDEsaHliQmFuZHMtMSkgKi8KKyAgICBucmcgPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICBmUG93MkRpdjIoKCpwSW1hZysrKSA8PCBtYXhWYWxTRikpID4+CisgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgICBmb3IgKHFzID0gMzE7IHFzIDwgaHliQmFuZHM7IHFzKyspIHsKKyAgICAgIG5yZyArPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgICBmUG93MkRpdjIoKCpwSW1hZysrKSA8PCBtYXhWYWxTRikpID4+CisgICAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgICB9CisgICAgc2xvdE5yZ1s4XSA9IG5yZzsKKyAgfSBlbHNlIHsKKyAgICBzbG90TnJnWzddID0gKEZJWFBfREJMKTA7CisgICAgc2xvdE5yZ1s4XSA9IChGSVhQX0RCTCkwOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgSU5UIGdldE1heFZhbERteChGSVhQX0RCTCAqUkVTVFJJQ1QgcFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBJbWFnLCBJTlQgY3BseEJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBoeWJCYW5kcykgeworICBJTlQgcXMsIGNsejsKKyAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgZm9yIChxcyA9IDEyOyBxcyA8IGNwbHhCYW5kczsgcXMrKykgeworICAgIG1heFZhbCB8PSBmQWJzKHBSZWFsW3FzXSk7CisgICAgbWF4VmFsIHw9IGZBYnMocEltYWdbcXNdKTsKKyAgfQorICBmb3IgKDsgcXMgPCBoeWJCYW5kczsgcXMrKykgeworICAgIG1heFZhbCB8PSBmQWJzKHBSZWFsW3FzXSk7CisgIH0KKworICBjbHogPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxKTsKKworICByZXR1cm4gKGNseik7Cit9CisKK3N0YXRpYyBpbmxpbmUgSU5UIGdldE1heFZhbERyeVdldChGSVhQX0RCTCAqUkVTVFJJQ1QgcFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwSHliT3V0cHV0UmVhbERyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEh5Yk91dHB1dEltYWdEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBIeWJPdXRwdXRSZWFsV2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwSHliT3V0cHV0SW1hZ1dldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY3BseEJhbmRzLCBJTlQgaHliQmFuZHMpIHsKKyAgSU5UIHFzLCBjbHo7CisgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgIGZvciAocXMgPSAxMjsgcXMgPCBjcGx4QmFuZHM7IHFzKyspIHsKKyAgICBwUmVhbFtxc10gPSBwSHliT3V0cHV0UmVhbERyeVtxc10gKyBwSHliT3V0cHV0UmVhbFdldFtxc107CisgICAgbWF4VmFsIHw9IGZBYnMocFJlYWxbcXNdKTsKKyAgICBwSW1hZ1txc10gPSBwSHliT3V0cHV0SW1hZ0RyeVtxc10gKyBwSHliT3V0cHV0SW1hZ1dldFtxc107CisgICAgbWF4VmFsIHw9IGZBYnMocEltYWdbcXNdKTsKKyAgfQorICBmb3IgKDsgcXMgPCBoeWJCYW5kczsgcXMrKykgeworICAgIHBSZWFsW3FzXSA9IHBIeWJPdXRwdXRSZWFsRHJ5W3FzXSArIHBIeWJPdXRwdXRSZWFsV2V0W3FzXTsKKyAgICBtYXhWYWwgfD0gZkFicyhwUmVhbFtxc10pOworICB9CisKKyAgY2x6ID0gZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhtYXhWYWwpIC0gMSk7CisKKyAgcmV0dXJuIChjbHopOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2xvdEFtcChGSVhQX0RCTCAqUkVTVFJJQ1Qgc2xvdEFtcF9kcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2xvdEFtcF93ZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEh5Yk91dHB1dFJlYWxEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEh5Yk91dHB1dEltYWdEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEh5Yk91dHB1dFJlYWxXZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEh5Yk91dHB1dEltYWdXZXQsIElOVCBjcGx4QmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaHliQmFuZHMpIHsKKyAgSU5UIHFzOworICBGSVhQX0RCTCBkcnksIHdldDsKKworICBkcnkgPSB3ZXQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgZm9yIChxcyA9IDA7IHFzIDwgY3BseEJhbmRzOyBxcysrKSB7CisgICAgZHJ5ID0gZkFkZFNhdHVyYXRlKGRyeSwgZlBvdzJEaXYyKHBIeWJPdXRwdXRSZWFsRHJ5W3FzXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUG93MkRpdjIocEh5Yk91dHB1dEltYWdEcnlbcXNdKSk7CisgICAgd2V0ID0gZkFkZFNhdHVyYXRlKHdldCwgZlBvdzJEaXYyKHBIeWJPdXRwdXRSZWFsV2V0W3FzXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUG93MkRpdjIocEh5Yk91dHB1dEltYWdXZXRbcXNdKSk7CisgIH0KKyAgZm9yICg7IHFzIDwgaHliQmFuZHM7IHFzKyspIHsKKyAgICBkcnkgPSBmQWRkU2F0dXJhdGUoZHJ5LCBmUG93MkRpdjIocEh5Yk91dHB1dFJlYWxEcnlbcXNdKSk7CisgICAgd2V0ID0gZkFkZFNhdHVyYXRlKHdldCwgZlBvdzJEaXYyKHBIeWJPdXRwdXRSZWFsV2V0W3FzXSkpOworICB9CisgICpzbG90QW1wX2RyeSA9IGRyeTsKKyAgKnNsb3RBbXBfd2V0ID0gd2V0OworfQorCisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKK19fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKyNlbmRpZgorc3RhdGljIHZvaWQKK3NoYXBlQkJFbnYoRklYUF9EQkwgKnBIeWJPdXRwdXRSZWFsRHJ5LCBGSVhQX0RCTCAqcEh5Yk91dHB1dEltYWdEcnksCisgICAgICAgICAgIEZJWFBfREJMIGRyeUZhYywgSU5UIHNjYWxlLCBJTlQgY3BseEJhbmRzLCBJTlQgaHliQmFuZHMpIHsKKyAgSU5UIHFzOworCisgIGlmIChzY2FsZSA9PSAwKSB7CisgICAgZm9yIChxcyA9IDA7IHFzIDwgY3BseEJhbmRzOyBxcysrKSB7CisgICAgICBwSHliT3V0cHV0UmVhbERyeVtxc10gPSBmTXVsdERpdjIocEh5Yk91dHB1dFJlYWxEcnlbcXNdLCBkcnlGYWMpOworICAgICAgcEh5Yk91dHB1dEltYWdEcnlbcXNdID0gZk11bHREaXYyKHBIeWJPdXRwdXRJbWFnRHJ5W3FzXSwgZHJ5RmFjKTsKKyAgICB9CisgICAgZm9yICg7IHFzIDwgaHliQmFuZHM7IHFzKyspIHsKKyAgICAgIHBIeWJPdXRwdXRSZWFsRHJ5W3FzXSA9IGZNdWx0RGl2MihwSHliT3V0cHV0UmVhbERyeVtxc10sIGRyeUZhYyk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAocXMgPSAwOyBxcyA8IGNwbHhCYW5kczsgcXMrKykgeworICAgICAgcEh5Yk91dHB1dFJlYWxEcnlbcXNdID0gZk11bHREaXYyKHBIeWJPdXRwdXRSZWFsRHJ5W3FzXSwgZHJ5RmFjKSA8PCBzY2FsZTsKKyAgICAgIHBIeWJPdXRwdXRJbWFnRHJ5W3FzXSA9IGZNdWx0RGl2MihwSHliT3V0cHV0SW1hZ0RyeVtxc10sIGRyeUZhYykgPDwgc2NhbGU7CisgICAgfQorICAgIGZvciAoOyBxcyA8IGh5YkJhbmRzOyBxcysrKSB7CisgICAgICBwSHliT3V0cHV0UmVhbERyeVtxc10gPSBmTXVsdERpdjIocEh5Yk91dHB1dFJlYWxEcnlbcXNdLCBkcnlGYWMpIDw8IHNjYWxlOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBleHRyYWN0QkJFbnYoc3BhdGlhbERlYyAqc2VsZiwgSU5UIGlucCwgSU5UIHN0YXJ0LCBJTlQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBFbnYsIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lKSB7CisgIElOVCBjaCwgcGIsIHByZXZDaE9mZnM7CisgIElOVCBjbHosIHNjYWxlLCBzY2FsZV9taW4sIGVudlNGOworICBJTlQgc2NhbGVDdXIsIHNjYWxlUHJldiwgY29tbW9uU2NhbGU7CisgIElOVCBzbG90TnJnU0YsIHBhcnROcmdTRiwgZnJhbWVOcmdTRjsKKyAgSU5UICpwUGFydE5yZ1ByZXZTRiwgKnBGcmFtZU5yZ1ByZXZTRjsKKyAgSU5UICpwTm9ybU5yZ1ByZXZTRiwgKnBQYXJ0TnJnUHJldjJTRjsKKworICBGSVhQX0RCTCBtYXhWYWwsIGVudiwgZnJhbWVOcmcsIG5vcm1Ocmc7CisgIEZJWFBfREJMICpwUmVhbCwgKnBJbWFnOworICBGSVhQX0RCTCAqcGFydE5yZywgKnBhcnROcmdQcmV2OworCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwU2NyYXRjaEJ1ZmZlciwgRklYUF9EQkwsCisgICAgICAgICAgICAgICAgICAgICAgICAoMiAqIDQyICsgTUFYX1BBUkFNRVRFUl9CQU5EUykpOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocmVzUGIsIEZJWFBfREJMLCAoRU5EX0JCX0VOViAtIFNUQVJUX0JCX0VOVikpOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocmVzUGJTRiwgSU5ULCAoRU5EX0JCX0VOViAtIFNUQVJUX0JCX0VOVikpOworCisgIEZJWFBfREJMICpzbG90TnJnID0gcFNjcmF0Y2hCdWZmZXIgKyAoMiAqIDQyKTsKKworICBSRVNIQVBFX0JCRU5WX1NUQVRFICpwQkJFbnZTdGF0ZSA9IHNlbGYtPnJlc2hhcGVCQkVudlN0YXRlOworCisgIEZJWFBfREJMIGFscGhhID0gcEJCRW52U3RhdGUtPmFscGhhX19GREs7CisgIC8qRklYUF9EQkwgIGFscGhhMSA9IChGTDJGWENPTlNUX0RCTCgxLjBmKSAtIGFscGhhKSA8PCBTRl9BTFBIQTE7Ki8KKyAgRklYUF9EQkwgYWxwaGExID0gKChGSVhQX0RCTClNQVhWQUxfREJMIC0gYWxwaGEpIDw8IFNGX0FMUEhBMTsKKyAgRklYUF9EQkwgYmV0YSA9IHBCQkVudlN0YXRlLT5iZXRhX19GREs7CisgIC8qRklYUF9EQkwgIGJldGExICA9IChGTDJGWENPTlNUX0RCTCgxLjBmKSAtIGJldGEpIDw8IFNGX0JFVEExOyovCisgIEZJWFBfREJMIGJldGExID0gKChGSVhQX0RCTClNQVhWQUxfREJMIC0gYmV0YSkgPDwgU0ZfQkVUQTE7CisKKyAgSU5UIHNoYXBlQWN0aXYgPSAxOworICBJTlQgaHliQmFuZHMgPSBmaXhNaW4oNDIsIHNlbGYtPmh5YnJpZEJhbmRzKTsKKyAgSU5UIHN0YXRpY1NjYWxlID0gc2VsZi0+c3RhdGljRGVjU2NhbGU7CisgIElOVCBjcGx4QmFuZHM7CisgIGNwbHhCYW5kcyA9IGZpeE1pbig0Miwgc2VsZi0+aHlicmlkQmFuZHMpOworCisgIGZvciAoY2ggPSBzdGFydDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgIGlmIChpbnAgPT0gSU5QX0RSWV9XRVQpIHsKKyAgICAgIElOVCBjaDIgPSByb3cyY2hhbm5lbEdFU1tzZWxmLT50cmVlQ29uZmlnXVtjaF07CisgICAgICBpZiAoY2gyID09IC0xKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZyYW1lLT50ZW1wU2hhcGVFbmFibGVDaGFubmVsR0VTW2NoMl0pIHsKKyAgICAgICAgICBzaGFwZUFjdGl2ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzaGFwZUFjdGl2ID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcHJldkNoT2ZmcyA9IGNoOworICAgICAgcFJlYWwgPSBwU2NyYXRjaEJ1ZmZlcjsKKyAgICAgIHBJbWFnID0gcFNjcmF0Y2hCdWZmZXIgKyA0MjsKKyAgICAgIGNseiA9IGdldE1heFZhbERyeVdldCgKKyAgICAgICAgICBwUmVhbCwgcEltYWcsIHNlbGYtPmh5Yk91dHB1dFJlYWxEcnlfX0ZES1tjaF0sCisgICAgICAgICAgc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLW2NoXSwgc2VsZi0+aHliT3V0cHV0UmVhbFdldF9fRkRLW2NoXSwKKyAgICAgICAgICBzZWxmLT5oeWJPdXRwdXRJbWFnV2V0X19GREtbY2hdLCBjcGx4QmFuZHMsIGh5YkJhbmRzKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJldkNoT2ZmcyA9IGNoICsgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHM7CisgICAgICBwUmVhbCA9IHNlbGYtPmh5YklucHV0UmVhbF9fRkRLW2NoXTsKKyAgICAgIHBJbWFnID0gc2VsZi0+aHliSW5wdXRJbWFnX19GREtbY2hdOworICAgICAgY2x6ID0gZ2V0TWF4VmFsRG14KHBSZWFsLCBwSW1hZywgY3BseEJhbmRzLCBoeWJCYW5kcyk7CisgICAgfQorCisgICAgcGFydE5yZyA9IHBhcnROcmdQcmV2ID0gcEJCRW52U3RhdGUtPnBhcnROcmdQcmV2X19GREtbcHJldkNoT2Zmc107CisgICAgcFBhcnROcmdQcmV2U0YgPSAmcEJCRW52U3RhdGUtPnBhcnROcmdQcmV2U0ZbcHJldkNoT2Zmc107CisgICAgcEZyYW1lTnJnUHJldlNGID0gJnBCQkVudlN0YXRlLT5mcmFtZU5yZ1ByZXZTRltwcmV2Q2hPZmZzXTsKKyAgICBwTm9ybU5yZ1ByZXZTRiA9ICZwQkJFbnZTdGF0ZS0+bm9ybU5yZ1ByZXZTRltwcmV2Q2hPZmZzXTsKKyAgICBwUGFydE5yZ1ByZXYyU0YgPSAmcEJCRW52U3RhdGUtPnBhcnROcmdQcmV2MlNGW3ByZXZDaE9mZnNdOworCisgICAgLyogY2FsY3VsYXRlIHNsb3QgZW5lcmd5ICovCisgICAgeworICAgICAgZ2V0U2xvdE5yZ0hRKCZwUmVhbFsxMl0sICZwSW1hZ1sxMl0sIHNsb3ROcmcsIGNseiwKKyAgICAgICAgICAgICAgICAgICBmaXhNaW4oNDIsIHNlbGYtPmh5YnJpZEJhbmRzKSk7IC8qIHNjYWxlIHNsb3ROcmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKihzdGF0aWNTY2FsZS1jbHopICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGX0ZBQ1RPUl9TTE9UICovCisgICAgfQorCisgICAgc2xvdE5yZ1NGID0gMiAqIChzdGF0aWNTY2FsZSAtIGNseikgKyBTRl9GQUNUT1JfU0xPVDsKKyAgICBmcmFtZU5yZ1NGID0gMiAqIChzdGF0aWNTY2FsZSAtIGNseikgKyBTRl9GQUNUT1JfU0xPVDsKKworICAgIHBhcnROcmdTRiA9IGZpeE1heChzbG90TnJnU0YgLSBTRl9BTFBIQTEgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICBwUGFydE5yZ1ByZXZTRlswXSAtIHBQYXJ0TnJnUHJldjJTRlswXSArIDEpOworICAgIHNjYWxlUHJldiA9IGZpeE1heChmaXhNaW4ocGFydE5yZ1NGIC0gcFBhcnROcmdQcmV2U0ZbMF0sIERGUkFDVF9CSVRTIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgIC0oREZSQUNUX0JJVFMgLSAxKSk7CisgICAgc2NhbGVDdXIgPQorICAgICAgICBmaXhNYXgoZml4TWluKHBhcnROcmdTRiAtIHNsb3ROcmdTRiArIFNGX0FMUEhBMSwgREZSQUNUX0JJVFMgLSAxKSwKKyAgICAgICAgICAgICAgIC0oREZSQUNUX0JJVFMgLSAxKSk7CisKKyAgICBtYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBmcmFtZU5yZyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIGlmICgoc2NhbGVDdXIgPCAwKSAmJiAoc2NhbGVQcmV2IDwgMCkpIHsKKyAgICAgIHNjYWxlQ3VyID0gLXNjYWxlQ3VyOworICAgICAgc2NhbGVQcmV2ID0gLXNjYWxlUHJldjsKKyAgICAgIGZvciAocGIgPSBTVEFSVF9CQl9FTlY7IHBiIDwgRU5EX0JCX0VOVjsgcGIrKykgeworICAgICAgICBwYXJ0TnJnW3BiXSA9ICgoZk11bHREaXYyKGFscGhhMSwgc2xvdE5yZ1twYl0pIDw8IHNjYWxlQ3VyKSArCisgICAgICAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIoYWxwaGEsIHBhcnROcmdQcmV2W3BiXSkgPDwgc2NhbGVQcmV2KSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAxOworICAgICAgICBtYXhWYWwgfD0gcGFydE5yZ1twYl07CisgICAgICAgIGZyYW1lTnJnICs9IHNsb3ROcmdbcGJdID4+IDM7CisgICAgICB9CisgICAgfSBlbHNlIGlmICgoc2NhbGVDdXIgPj0gMCkgJiYgKHNjYWxlUHJldiA+PSAwKSkgeworICAgICAgZm9yIChwYiA9IFNUQVJUX0JCX0VOVjsgcGIgPCBFTkRfQkJfRU5WOyBwYisrKSB7CisgICAgICAgIHBhcnROcmdbcGJdID0gKChmTXVsdERpdjIoYWxwaGExLCBzbG90TnJnW3BiXSkgPj4gc2NhbGVDdXIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0RGl2MihhbHBoYSwgcGFydE5yZ1ByZXZbcGJdKSA+PiBzY2FsZVByZXYpKQorICAgICAgICAgICAgICAgICAgICAgIDw8IDE7CisgICAgICAgIG1heFZhbCB8PSBwYXJ0TnJnW3BiXTsKKyAgICAgICAgZnJhbWVOcmcgKz0gc2xvdE5yZ1twYl0gPj4gMzsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChzY2FsZUN1ciA8IDApICYmIChzY2FsZVByZXYgPj0gMCkpIHsKKyAgICAgIHNjYWxlQ3VyID0gLXNjYWxlQ3VyOworICAgICAgZm9yIChwYiA9IFNUQVJUX0JCX0VOVjsgcGIgPCBFTkRfQkJfRU5WOyBwYisrKSB7CisgICAgICAgIHBhcnROcmdbcGJdID0gKChmTXVsdERpdjIoYWxwaGExLCBzbG90TnJnW3BiXSkgPDwgc2NhbGVDdXIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0RGl2MihhbHBoYSwgcGFydE5yZ1ByZXZbcGJdKSA+PiBzY2FsZVByZXYpKQorICAgICAgICAgICAgICAgICAgICAgIDw8IDE7CisgICAgICAgIG1heFZhbCB8PSBwYXJ0TnJnW3BiXTsKKyAgICAgICAgZnJhbWVOcmcgKz0gc2xvdE5yZ1twYl0gPj4gMzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBpZiAoIChzY2FsZUN1ciA+PSAwKSAmJiAoc2NhbGVQcmV2IDwgMCkgKSAqLworICAgICAgc2NhbGVQcmV2ID0gLXNjYWxlUHJldjsKKyAgICAgIGZvciAocGIgPSBTVEFSVF9CQl9FTlY7IHBiIDwgRU5EX0JCX0VOVjsgcGIrKykgeworICAgICAgICBwYXJ0TnJnW3BiXSA9ICgoZk11bHREaXYyKGFscGhhMSwgc2xvdE5yZ1twYl0pID4+IHNjYWxlQ3VyKSArCisgICAgICAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIoYWxwaGEsIHBhcnROcmdQcmV2W3BiXSkgPDwgc2NhbGVQcmV2KSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAxOworICAgICAgICBtYXhWYWwgfD0gcGFydE5yZ1twYl07CisgICAgICAgIGZyYW1lTnJnICs9IHNsb3ROcmdbcGJdID4+IDM7CisgICAgICB9CisgICAgfQorCisgICAgLyogZnJhbWVOcmcgLz0gKEVORF9CQl9FTlYgLSBTVEFSVF9CQl9FTlYpOyAwLjg4ODg4ODg4ODg4ZiA9CisgICAgICogKDEvKEVORF9CQl9FTlYtU1RBUlRfQkJfRU5WKTw8Mzsgc2hpZnQgd2l0aCAzIGlzIGNvbXBlbnNhdGVkIGluIGxvb3AKKyAgICAgKiBhYm92ZSAqLworICAgIGZyYW1lTnJnID0gZk11bHQoZnJhbWVOcmcsIEZMMkZYQ09OU1RfREJMKDAuODg4ODg4ODg4ODhmKSk7CisKKyAgICAvKiBzdG9yZSBzY2FsZWZhY3RvciBhbmQgaGVhZHJvb20gZm9yIHBhcnQgbnJnIHByZXYgKi8KKyAgICBwUGFydE5yZ1ByZXZTRlswXSA9IHBhcnROcmdTRjsKKyAgICBwUGFydE5yZ1ByZXYyU0ZbMF0gPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxKTsKKworICAgIGNvbW1vblNjYWxlID0gZml4TWF4KGZyYW1lTnJnU0YgLSBTRl9BTFBIQTEgKyAxLCBwRnJhbWVOcmdQcmV2U0ZbMF0gKyAxKTsKKyAgICBzY2FsZVByZXYgPSBmaXhNaW4oY29tbW9uU2NhbGUgLSBwRnJhbWVOcmdQcmV2U0ZbMF0sIERGUkFDVF9CSVRTIC0gMSk7CisgICAgc2NhbGVDdXIgPSBmaXhNaW4oY29tbW9uU2NhbGUgLSBmcmFtZU5yZ1NGICsgU0ZfQUxQSEExLCBERlJBQ1RfQklUUyAtIDEpOworICAgIGZyYW1lTnJnU0YgPSBjb21tb25TY2FsZTsKKworICAgIGZyYW1lTnJnID0gKChmTXVsdERpdjIoYWxwaGExLCBmcmFtZU5yZykgPj4gc2NhbGVDdXIpICsKKyAgICAgICAgICAgICAgICAoZk11bHREaXYyKGFscGhhLCBwQkJFbnZTdGF0ZS0+ZnJhbWVOcmdQcmV2X19GREtbcHJldkNoT2Zmc10pID4+CisgICAgICAgICAgICAgICAgIHNjYWxlUHJldikpCisgICAgICAgICAgICAgICA8PCAxOworCisgICAgY2x6ID0gZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhmcmFtZU5yZykgLSAxKTsKKyAgICBwQkJFbnZTdGF0ZS0+ZnJhbWVOcmdQcmV2X19GREtbcHJldkNoT2Zmc10gPSBmcmFtZU5yZyA8PCBjbHo7CisgICAgcEZyYW1lTnJnUHJldlNGWzBdID0gZnJhbWVOcmdTRiAtIGNsejsKKworICAgIGVudiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIHNjYWxlID0gY2x6ICsgcGFydE5yZ1NGIC0gZnJhbWVOcmdTRjsKKyAgICBzY2FsZV9taW4gPSBERlJBQ1RfQklUUyAtIDE7CisgICAgZm9yIChwYiA9IFNUQVJUX0JCX0VOVjsgcGIgPCBFTkRfQkJfRU5WOyBwYisrKSB7CisgICAgICBpZiAoKHBhcnROcmdbcGJdIHwgc2xvdE5yZ1twYl0pICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgIElOVCBzOworICAgICAgICBJTlQgc2MgPSAwOworICAgICAgICBJTlQgc24gPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKHNsb3ROcmdbcGJdKSAtIDEpOworICAgICAgICBGSVhQX0RCTCBpbnZfc3FydCA9IGludlNxcnROb3JtMihwYXJ0TnJnW3BiXSwgJnNjKTsKKyAgICAgICAgRklYUF9EQkwgcmVzID0gZk11bHQoc2xvdE5yZ1twYl0gPDwgc24sIGZQb3cyKGludl9zcXJ0KSk7CisKKyAgICAgICAgcyA9IGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MocmVzKSAtIDEpOworICAgICAgICByZXMgPSByZXMgPDwgczsKKworICAgICAgICBzYyA9IHNjYWxlIC0gKDIgKiBzYyAtIHNuIC0gcyk7CisgICAgICAgIHNjYWxlX21pbiA9IGZpeE1pbihzY2FsZV9taW4sIHNjKTsKKworICAgICAgICByZXNQYltwYl0gPSByZXM7CisgICAgICAgIHJlc1BiU0ZbcGJdID0gc2M7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXNQYltwYl0gPSAoRklYUF9EQkwpMDsKKyAgICAgICAgcmVzUGJTRltwYl0gPSAwOworICAgICAgfQorICAgIH0KKworICAgIHNjYWxlX21pbiA9IDQgLSBzY2FsZV9taW47CisKKyAgICBmb3IgKHBiID0gU1RBUlRfQkJfRU5WOyBwYiA8IEVORF9CQl9FTlY7IHBiKyspIHsKKyAgICAgIElOVCBzYyA9IGZpeE1heChmaXhNaW4ocmVzUGJTRltwYl0gKyBzY2FsZV9taW4sIERGUkFDVF9CSVRTIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgLShERlJBQ1RfQklUUyAtIDEpKTsKKworICAgICAgaWYgKHNjIDwgMCkgeworICAgICAgICBlbnYgKz0gcmVzUGJbcGJdIDw8ICgtc2MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW52ICs9IHJlc1BiW3BiXSA+PiAoc2MpOworICAgICAgfQorICAgIH0KKworICAgIGVudiA9IGZNdWx0RGl2MihlbnYsIHBCQkVudlN0YXRlLT5mcmFtZU5yZ1ByZXZfX0ZES1twcmV2Q2hPZmZzXSk7CisgICAgZW52U0YgPSBzbG90TnJnU0YgKyBzY2FsZV9taW4gKyAxOworCisgICAgY29tbW9uU2NhbGUgPSBmaXhNYXgoZW52U0YgLSBTRl9CRVRBMSArIDEsIHBOb3JtTnJnUHJldlNGWzBdICsgMSk7CisgICAgc2NhbGVQcmV2ID0gZml4TWluKGNvbW1vblNjYWxlIC0gcE5vcm1OcmdQcmV2U0ZbMF0sIERGUkFDVF9CSVRTIC0gMSk7CisgICAgc2NhbGVDdXIgPSBmaXhNaW4oY29tbW9uU2NhbGUgLSBlbnZTRiArIFNGX0JFVEExLCBERlJBQ1RfQklUUyAtIDEpOworCisgICAgbm9ybU5yZyA9ICgoZk11bHREaXYyKGJldGExLCBlbnYpID4+IHNjYWxlQ3VyKSArCisgICAgICAgICAgICAgICAoZk11bHREaXYyKGJldGEsIHBCQkVudlN0YXRlLT5ub3JtTnJnUHJldl9fRkRLW3ByZXZDaE9mZnNdKSA+PgorICAgICAgICAgICAgICAgIHNjYWxlUHJldikpCisgICAgICAgICAgICAgIDw8IDE7CisKKyAgICBjbHogPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG5vcm1OcmcpIC0gMSk7CisgICAgcEJCRW52U3RhdGUtPm5vcm1OcmdQcmV2X19GREtbcHJldkNoT2Zmc10gPSBub3JtTnJnIDw8IGNsejsKKyAgICBwTm9ybU5yZ1ByZXZTRlswXSA9IGNvbW1vblNjYWxlIC0gY2x6OworCisgICAgaWYgKHNoYXBlQWN0aXYpIHsKKyAgICAgIGlmICgoZW52IHwgbm9ybU5yZykgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgICAgSU5UIHNjLCBzZSwgc247CisgICAgICAgIHNlID0gZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhlbnYpIC0gMSk7CisgICAgICAgIHNjID0gY29tbW9uU2NhbGUgKyBTRl9ESVYzMiAtIGVudlNGICsgc2U7CisgICAgICAgIGVudiA9IGZNdWx0KHNxcnRGaXhwKChlbnYgPDwgc2UpID4+IChzYyAmIDB4MSkpLAorICAgICAgICAgICAgICAgICAgICBpbnZTcXJ0Tm9ybTIobm9ybU5yZywgJnNuKSk7CisKKyAgICAgICAgc2MgPSBmaXhNaW4oKHNjID4+IDEpIC0gc24sIERGUkFDVF9CSVRTIC0gMSk7CisgICAgICAgIGlmIChzYyA8IDApIHsKKyAgICAgICAgICBlbnYgPDw9ICgtc2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVudiA+Pj0gKHNjKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogZW52IGlzIHNjYWxlZCBieSBTRl9ESVYzMi8yIGJpdHMgKi8KKyAgICB9CisgICAgcEVudltjaF0gPSBlbnY7CisgIH0KKworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHJlc1BiU0YsIElOVCwgKEVORF9CQl9FTlYgLSBTVEFSVF9CQl9FTlYpKTsKKyAgQ19BTExPQ19TQ1JBVENIX0VORChyZXNQYiwgRklYUF9EQkwsIChFTkRfQkJfRU5WIC0gU1RBUlRfQkJfRU5WKSk7CisgIENfQUxMT0NfU0NSQVRDSF9FTkQocFNjcmF0Y2hCdWZmZXIsIEZJWFBfREJMLCAoMiAqIDQyICsgTUFYX1BBUkFNRVRFUl9CQU5EUykpOworfQorCit2b2lkIFNwYXRpYWxEZWNSZXNoYXBlQkJFbnYoc3BhdGlhbERlYyAqc2VsZiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRzKSB7CisgIElOVCBjaCwgc2NhbGU7CisgIElOVCBkcnlGYWNTRiwgc2xvdEFtcFNGOworICBGSVhQX0RCTCB0bXAsIGRyeUZhYywgZW52U2hhcGU7CisgIEZJWFBfREJMIHNsb3RBbXBfZHJ5LCBzbG90QW1wX3dldCwgc2xvdEFtcF9yYXRpbzsKKyAgRklYUF9EQkwgZW52RHJ5W01BWF9PVVRQVVRfQ0hBTk5FTFNdLCBlbnZEbXhbMl07CisKKyAgSU5UIGNwbHhCYW5kczsKKyAgSU5UIGh5YkJhbmRzID0gc2VsZi0+aHlicmlkQmFuZHMgLSA2OworCisgIGNwbHhCYW5kcyA9IHNlbGYtPmh5YnJpZEJhbmRzIC0gNjsKKworICAvKiBleHRyYWN0IGRvd25taXggZW52ZWxvcGUocykgKi8KKyAgc3dpdGNoIChzZWxmLT50cmVlQ29uZmlnKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGV4dHJhY3RCQkVudihzZWxmLCBJTlBfRE1YLCAwLCBmTWluKHNlbGYtPm51bUlucHV0Q2hhbm5lbHMsIDIpLCBlbnZEbXgsCisgICAgICAgICAgICAgICAgICAgZnJhbWUpOworICB9CisKKyAgLyogZXh0cmFjdCBkcnkgYW5kIHdldCBlbnZlbG9wZXMgKi8KKyAgZXh0cmFjdEJCRW52KHNlbGYsIElOUF9EUllfV0VULCAwLCBzZWxmLT5udW1PdXRwdXRDaGFubmVscywgZW52RHJ5LCBmcmFtZSk7CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICBJTlQgY2gyOworCisgICAgY2gyID0gcm93MmNoYW5uZWxHRVNbc2VsZi0+dHJlZUNvbmZpZ11bY2hdOworCisgICAgaWYgKGNoMiA9PSAtMSkgY29udGludWU7CisKKyAgICBpZiAoZnJhbWUtPnRlbXBTaGFwZUVuYWJsZUNoYW5uZWxHRVNbY2gyXSkgeworICAgICAgSU5UIHNjOworCisgICAgICAvKiByZXNoYXBlIGRyeSBhbmQgd2V0IHNpZ25hbHMgYWNjb3JkaW5nIHRvIHRyYW5zbWl0dGVkIGVudmVsb3BlICovCisKKyAgICAgIC8qIERlLXF1YW50aXplIEdFUyBkYXRhICovCisgICAgICBGREtfQVNTRVJUKChmcmFtZS0+YnNFbnZTaGFwZURhdGFbY2gyXVt0c10gPj0gMCkgJiYKKyAgICAgICAgICAgICAgICAgKGZyYW1lLT5ic0VudlNoYXBlRGF0YVtjaDJdW3RzXSA8PSA0KSk7CisgICAgICBGREtfQVNTRVJUKChzZWxmLT5lbnZRdWFudE1vZGUgPT0gMCkgfHwgKHNlbGYtPmVudlF1YW50TW9kZSA9PSAxKSk7CisgICAgICBlbnZTaGFwZSA9CisgICAgICAgICAgRlhfQ0ZHMkZYX0RCTChlbnZTaGFwZURhdGFUYWJsZV9fRkRLW2ZyYW1lLT5ic0VudlNoYXBlRGF0YVtjaDJdW3RzXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi0+ZW52UXVhbnRNb2RlXSk7CisKKyAgICAgIC8qIGdldCBkb3dubWl4IGNoYW5uZWwgKi8KKyAgICAgIGNoMiA9IHNlbGYtPnJvdzJjaGFubmVsRG14R0VTW2NoXTsKKworICAgICAgLyogbXVsdGlwbHkgcmF0aW8gd2l0aCBkbXggZW52ZWxvcGU7IHRtcCBpcyBzY2FsZWQgYnkgU0ZfRElWMzIvMitTRl9TSEFQRQorICAgICAgICogYml0cyAqLworICAgICAgaWYgKGNoMiA9PSAyKSB7CisgICAgICAgIHRtcCA9IGZNdWx0RGl2MihlbnZTaGFwZSwgZW52RG14WzBdKSArIGZNdWx0RGl2MihlbnZTaGFwZSwgZW52RG14WzFdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IGZNdWx0KGVudlNoYXBlLCBlbnZEbXhbY2gyXSk7CisgICAgICB9CisKKyAgICAgIC8qIHdlaWdodGluZyBmYWN0b3JzICovCisgICAgICBkcnlGYWNTRiA9IHNsb3RBbXBTRiA9IDA7CisgICAgICBkcnlGYWMgPSBzbG90QW1wX3JhdGlvID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICAgIC8qIGRyeUZhYyB3aWxsIGJlIHNjYWxlZCBieSBkcnlGYWNTRiBiaXRzICovCisgICAgICBpZiAoZW52RHJ5W2NoXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICBlbnZEcnlbY2hdID0gaW52U3FydE5vcm0yKGVudkRyeVtjaF0sICZkcnlGYWNTRik7CisgICAgICAgIGRyeUZhYyA9IGZNdWx0RGl2Mih0bXAsIGZQb3cyRGl2MihlbnZEcnlbY2hdKSkgPDwgMjsKKyAgICAgICAgZHJ5RmFjU0YgPSBTRl9TSEFQRSArIDIgKiBkcnlGYWNTRjsKKyAgICAgIH0KKworICAgICAgLyogY2FsY3VsYXRlIHNsb3RBbXBfZHJ5IGFuZCBzbG90QW1wX3dldCAqLworICAgICAgc2xvdEFtcCgmc2xvdEFtcF9kcnksICZzbG90QW1wX3dldCwgJnNlbGYtPmh5Yk91dHB1dFJlYWxEcnlfX0ZES1tjaF1bNl0sCisgICAgICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREtbY2hdWzZdLAorICAgICAgICAgICAgICAmc2VsZi0+aHliT3V0cHV0UmVhbFdldF9fRkRLW2NoXVs2XSwKKyAgICAgICAgICAgICAgJnNlbGYtPmh5Yk91dHB1dEltYWdXZXRfX0ZES1tjaF1bNl0sIGNwbHhCYW5kcywgaHliQmFuZHMpOworCisgICAgICAvKiBzbG90QW1wX3JhdGlvIHdpbGwgYmUgc2NhbGVkIGJ5IHNsb3RBbXBTRiBiaXRzICovCisgICAgICBpZiAoc2xvdEFtcF9kcnkgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgICAgc2MgPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKHNsb3RBbXBfd2V0KSAtIDEpOworICAgICAgICBzYyA9IHNjIC0gKHNjICYgMSk7CisKKyAgICAgICAgc2xvdEFtcF93ZXQgPSBzcXJ0Rml4cChzbG90QW1wX3dldCA8PCBzYyk7CisgICAgICAgIHNsb3RBbXBfZHJ5ID0gaW52U3FydE5vcm0yKHNsb3RBbXBfZHJ5LCAmc2xvdEFtcFNGKTsKKworICAgICAgICBzbG90QW1wX3JhdGlvID0gZk11bHQoc2xvdEFtcF93ZXQsIHNsb3RBbXBfZHJ5KTsKKyAgICAgICAgc2xvdEFtcFNGID0gc2xvdEFtcFNGIC0gKHNjID4+IDEpOworICAgICAgfQorCisgICAgICAvKiBjYWxjdWxhdGUgY29tbW9uIHNjYWxlIGZhY3RvciAqLworICAgICAgc2NhbGUgPQorICAgICAgICAgIGZpeE1heCgzLCBmaXhNYXgoZHJ5RmFjU0YsIHNsb3RBbXBTRikpOyAvKiBzY2FsZSBpcyBhdCBsZWFzdCB3aXRoIDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyB0byBhdm9pZCBvdmVyZmxvd3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBjYWxjdWxhdGluZyBkcnlGYWMgICovCisgICAgICBkcnlGYWMgPSBkcnlGYWMgPj4gKHNjYWxlIC0gZHJ5RmFjU0YpOworICAgICAgc2xvdEFtcF9yYXRpbyA9IHNsb3RBbXBfcmF0aW8gPj4gKHNjYWxlIC0gc2xvdEFtcFNGKTsKKworICAgICAgLyogbGltaXQgZHJ5RmFjICovCisgICAgICBkcnlGYWMgPSBmaXhNYXgoCisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4yNWYpID4+IChJTlQpZml4TWluKDIgKiBzY2FsZSwgREZSQUNUX0JJVFMgLSAxKSwKKyAgICAgICAgICBmTXVsdChkcnlGYWMsIHNsb3RBbXBfcmF0aW8pIC0gKHNsb3RBbXBfcmF0aW8gPj4gc2NhbGUpICsKKyAgICAgICAgICAgICAgKGRyeUZhYyA+PiBzY2FsZSkpOworICAgICAgZHJ5RmFjID0gZml4TWluKAorICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNTBmKSA+PiAoSU5UKWZpeE1pbigyICogc2NhbGUgLSAzLCBERlJBQ1RfQklUUyAtIDEpLAorICAgICAgICAgIGRyeUZhYyk7IC8qIHJlZHVjZSBzaGlmdCBiaXRzIGJ5IDMsIGJlY2F1c2UgdXBwZXIKKyAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA0LjAgaXMgc2NhbGVkIHdpdGggMyBiaXRzICovCisgICAgICBzY2FsZSA9IDIgKiBzY2FsZSArIDE7CisKKyAgICAgIC8qIGltcHJvdmUgcHJlY2lzaW9uIGZvciBkcnlGYWMgKi8KKyAgICAgIHNjID0gZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhkcnlGYWMpIC0gMSk7CisgICAgICBkcnlGYWMgPSBkcnlGYWMgPDwgKElOVClmaXhNaW4oc2NhbGUsIHNjKTsKKyAgICAgIHNjYWxlID0gc2NhbGUgLSBmaXhNaW4oc2NhbGUsIHNjKTsKKworICAgICAgLyogc2hhcGluZyAqLworICAgICAgc2hhcGVCQkVudigmc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLW2NoXVs2XSwKKyAgICAgICAgICAgICAgICAgJnNlbGYtPmh5Yk91dHB1dEltYWdEcnlfX0ZES1tjaF1bNl0sIGRyeUZhYywgc2NhbGUsIGNwbHhCYW5kcywKKyAgICAgICAgICAgICAgICAgaHliQmFuZHMpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfcmVzaGFwZUJCRW52LmggYi9saWJTQUNkZWMvc3JjL3NhY19yZXNoYXBlQkJFbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjU4NTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfcmVzaGFwZUJCRW52LmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlYyBndWlkZWQgZW52ZWxvcGUgc2hhcGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ19SRVNIQVBFQkJFTlZfSAorI2RlZmluZSBTQUNfUkVTSEFQRUJCRU5WX0gKKworI2luY2x1ZGUgInNhY19kZWNfaW50ZXJmYWNlLmgiCisKKyNkZWZpbmUgQkJfRU5WX1NJWkUgOSAvKiBFTkRfQkJfRU5WIC0gU1RBUlRfQkJfRU5WICovCisKK3ZvaWQgaW5pdEJCRW52KHNwYXRpYWxEZWMgKnNlbGYsIGludCBpbml0U3RhdGVzRmxhZyk7Cit2b2lkIFNwYXRpYWxEZWNSZXNoYXBlQkJFbnYoc3BhdGlhbERlYyAqc2VsZiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19yb20uY3BwIGIvbGliU0FDZGVjL3NyYy9zYWNfcm9tLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjg1YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfcm9tLmNwcApAQCAtMCwwICsxLDcwOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIHRhYmxlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic2FjX3JvbS5oIgorI2luY2x1ZGUgInNhY19jYWxjTTFhbmRNMi5oIgorCisjZGVmaW5lIFNDQUxFX0NQQyhhKSAoRkwyRlhDT05TVF9DRkcoYSAvIChmbG9hdCkoMSA8PCBTQ0FMRV9QQVJBTV9NMSkpKQorY29uc3QgRklYUF9DRkcgZGVxdWFudENQQ19fRkRLW10gPSB7CisgICAgU0NBTEVfQ1BDKC0yLjBmKSwgU0NBTEVfQ1BDKC0xLjlmKSwgU0NBTEVfQ1BDKC0xLjhmKSwgU0NBTEVfQ1BDKC0xLjdmKSwKKyAgICBTQ0FMRV9DUEMoLTEuNmYpLCBTQ0FMRV9DUEMoLTEuNWYpLCBTQ0FMRV9DUEMoLTEuNGYpLCBTQ0FMRV9DUEMoLTEuM2YpLAorICAgIFNDQUxFX0NQQygtMS4yZiksIFNDQUxFX0NQQygtMS4xZiksIFNDQUxFX0NQQygtMS4wZiksIFNDQUxFX0NQQygtMC45ZiksCisgICAgU0NBTEVfQ1BDKC0wLjhmKSwgU0NBTEVfQ1BDKC0wLjdmKSwgU0NBTEVfQ1BDKC0wLjZmKSwgU0NBTEVfQ1BDKC0wLjVmKSwKKyAgICBTQ0FMRV9DUEMoLTAuNGYpLCBTQ0FMRV9DUEMoLTAuM2YpLCBTQ0FMRV9DUEMoLTAuMmYpLCBTQ0FMRV9DUEMoLTAuMWYpLAorICAgIFNDQUxFX0NQQygwLjBmKSwgIFNDQUxFX0NQQygwLjFmKSwgIFNDQUxFX0NQQygwLjJmKSwgIFNDQUxFX0NQQygwLjNmKSwKKyAgICBTQ0FMRV9DUEMoMC40ZiksICBTQ0FMRV9DUEMoMC41ZiksICBTQ0FMRV9DUEMoMC42ZiksICBTQ0FMRV9DUEMoMC43ZiksCisgICAgU0NBTEVfQ1BDKDAuOGYpLCAgU0NBTEVfQ1BDKDAuOWYpLCAgU0NBTEVfQ1BDKDEuMGYpLCAgU0NBTEVfQ1BDKDEuMWYpLAorICAgIFNDQUxFX0NQQygxLjJmKSwgIFNDQUxFX0NQQygxLjNmKSwgIFNDQUxFX0NQQygxLjRmKSwgIFNDQUxFX0NQQygxLjVmKSwKKyAgICBTQ0FMRV9DUEMoMS42ZiksICBTQ0FMRV9DUEMoMS43ZiksICBTQ0FMRV9DUEMoMS44ZiksICBTQ0FMRV9DUEMoMS45ZiksCisgICAgU0NBTEVfQ1BDKDIuMGYpLCAgU0NBTEVfQ1BDKDIuMWYpLCAgU0NBTEVfQ1BDKDIuMmYpLCAgU0NBTEVfQ1BDKDIuM2YpLAorICAgIFNDQUxFX0NQQygyLjRmKSwgIFNDQUxFX0NQQygyLjVmKSwgIFNDQUxFX0NQQygyLjZmKSwgIFNDQUxFX0NQQygyLjdmKSwKKyAgICBTQ0FMRV9DUEMoMi44ZiksICBTQ0FMRV9DUEMoMi45ZiksICBTQ0FMRV9DUEMoMy4wZil9OworCisjZGVmaW5lIFNDQUxFX0lDQyhhKSAoRkwyRlhDT05TVF9DRkcoYSkpCitjb25zdCBGSVhQX0NGRyBkZXF1YW50SUNDX19GREtbOF0gPSB7CisgICAgLypTQ0FMRV9JQ0MoMS4wMDAwMGYpKi8gRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKSwKKyAgICBTQ0FMRV9JQ0MoMC45MzcwZiksCisgICAgU0NBTEVfSUNDKDAuODQxMThmKSwKKyAgICBTQ0FMRV9JQ0MoMC42MDA5MmYpLAorICAgIFNDQUxFX0lDQygwLjM2NzY0ZiksCisgICAgU0NBTEVfSUNDKDAuMDAwMGYpLAorICAgIFNDQUxFX0lDQygtMC41ODkwMGYpLAorICAgIFNDQUxFX0lDQygtMC45OTAwZil9OworCisjZGVmaW5lIFNDQUxFX0NMRDIoYSkgKEZMMkZYQ09OU1RfQ0ZHKGEgLyAoZmxvYXQpKDEgPDwgOCkpKQorY29uc3QgRklYUF9DRkcgZGVxdWFudENMRF9fRkRLWzMxXSA9IHsKKyAgICBTQ0FMRV9DTEQyKC0xNTAuMGYpLCBTQ0FMRV9DTEQyKC00NS4wZiksIFNDQUxFX0NMRDIoLTQwLjBmKSwKKyAgICBTQ0FMRV9DTEQyKC0zNS4wZiksICBTQ0FMRV9DTEQyKC0zMC4wZiksIFNDQUxFX0NMRDIoLTI1LjBmKSwKKyAgICBTQ0FMRV9DTEQyKC0yMi4wZiksICBTQ0FMRV9DTEQyKC0xOS4wZiksIFNDQUxFX0NMRDIoLTE2LjBmKSwKKyAgICBTQ0FMRV9DTEQyKC0xMy4wZiksICBTQ0FMRV9DTEQyKC0xMC4wZiksIFNDQUxFX0NMRDIoLTguMGYpLAorICAgIFNDQUxFX0NMRDIoLTYuMGYpLCAgIFNDQUxFX0NMRDIoLTQuMGYpLCAgU0NBTEVfQ0xEMigtMi4wZiksCisgICAgU0NBTEVfQ0xEMigwLjBmKSwgICAgU0NBTEVfQ0xEMigyLjBmKSwgICBTQ0FMRV9DTEQyKDQuMGYpLAorICAgIFNDQUxFX0NMRDIoNi4wZiksICAgIFNDQUxFX0NMRDIoOC4wZiksICAgU0NBTEVfQ0xEMigxMC4wZiksCisgICAgU0NBTEVfQ0xEMigxMy4wZiksICAgU0NBTEVfQ0xEMigxNi4wZiksICBTQ0FMRV9DTEQyKDE5LjBmKSwKKyAgICBTQ0FMRV9DTEQyKDIyLjBmKSwgICBTQ0FMRV9DTEQyKDI1LjBmKSwgIFNDQUxFX0NMRDIoMzAuMGYpLAorICAgIFNDQUxFX0NMRDIoMzUuMGYpLCAgIFNDQUxFX0NMRDIoNDAuMGYpLCAgU0NBTEVfQ0xEMig0NS4wZiksCisgICAgU0NBTEVfQ0xEMigxNTAuMGYpfTsKKworI2RlZmluZSBTQ0FMRV9JUEQoYSkgKEZMMkZYQ09OU1RfQ0ZHKGEgLyAoZmxvYXQpKDEgPDwgSVBEX1NDQUxFKSkpCitjb25zdCBGSVhQX0NGRyBkZXF1YW50SVBEX19GREtbMTZdID0geworICAgIC8qIFNDQUxFX0lQRCgwLjAwMDAwMDAwMGYpLCBTQ0FMRV9JUEQoMC4zOTI2OTkwODJmKSwKKyAgICAgICBTQ0FMRV9JUEQoMC43ODUzOTgxNjNmKSwgU0NBTEVfSVBEKDEuMTc4MDk3MjQ1ZiksCisgICAgICAgU0NBTEVfSVBEKDEuNTcwNzk2MzI3ZiksIFNDQUxFX0lQRCgxLjk2MzQ5NTQwOGYpLAorICAgICAgIFNDQUxFX0lQRCgyLjM1NjE5NDQ5MGYpLCBTQ0FMRV9JUEQoMi43NDg4OTM1NzJmKSwKKyAgICAgICBTQ0FMRV9JUEQoMy4xNDE1OTI2NTRmKSwgU0NBTEVfSVBEKDMuNTM0MjkxNzM1ZiksCisgICAgICAgU0NBTEVfSVBEKDMuOTI2OTkwODE3ZiksIFNDQUxFX0lQRCg0LjMxOTY4OTg5OWYpLAorICAgICAgIFNDQUxFX0lQRCg0LjcxMjM4ODk4MGYpLCBTQ0FMRV9JUEQoNS4xMDUwODgwNjJmKSwKKyAgICAgICBTQ0FMRV9JUEQoNS40OTc3ODcxNDRmKSwgU0NBTEVfSVBEKDUuODkwNDg2MjI1ZikgKi8KKyAgICBTQ0FMRV9JUEQoMC4wMDAwMDAwMDAwMDAwMGYpLCBTQ0FMRV9JUEQoMC4zOTI2OTkwODJmKSwKKyAgICBTQ0FMRV9JUEQoMC43ODUzOTgxNjMzOTc0NWYpLCBTQ0FMRV9JUEQoMS4xNzgwOTcyNDVmKSwKKyAgICBTQ0FMRV9JUEQoMS41NzA3OTYzMjY3OTQ5MGYpLCBTQ0FMRV9JUEQoMS45NjM0OTU0MDhmKSwKKyAgICBTQ0FMRV9JUEQoMi4zNTYxOTQ0OTAxOTIzNGYpLCBTQ0FMRV9JUEQoMi43NDg4OTM1NzJmKSwKKyAgICBTQ0FMRV9JUEQoMy4xNDE1OTI2NTM1ODk3OWYpLCBTQ0FMRV9JUEQoMy41MzQyOTE3MzVmKSwKKyAgICBTQ0FMRV9JUEQoMy45MjY5OTA4MTY5ODcyNGYpLCBTQ0FMRV9JUEQoNC4zMTk2ODk4OTlmKSwKKyAgICBTQ0FMRV9JUEQoNC43MTIzODg5ODAzODQ2OWYpLCBTQ0FMRV9JUEQoNS4xMDUwODgwNjJmKSwKKyAgICBTQ0FMRV9JUEQoNS40OTc3ODcxNDM3ODIxNGYpLCBTQ0FMRV9JUEQoNS44OTA0ODYyMjVmKX07CisKKyNkZWZpbmUgU0NBTEVfU1BMSVRfQU5HTEUoYSkgKEZMMkZYQ09OU1RfQ0ZHKGEgLyAoZmxvYXQpKDEgPDwgSVBEX1NDQUxFKSkpCisvKgorICBHZW5lcmF0ZSB0YWJsZSBkZXF1YW50SVBEX0NMRF9JQ0Nfc3BsaXRBbmdsZV9fRkRLWzE2XVszMV1bOF06CisKKyAgI2RlZmluZSBBQlNfVEhSICAgICAgICAgICAgICAgICAgICAgICAgICggMWUtOWYgKiAzMjc2OCAqIDMyNzY4ICkKKworICBmbG9hdCBkZXF1YW50SUNDW10gPQorICB7MS4wMDAwZiwwLjkzNzBmLDAuODQxMThmLDAuNjAwOTJmLDAuMzY3NjRmLDAuMGYsLTAuNTg5MGYsLTAuOTkwMGZ9OyBmbG9hdAorICBkZXF1YW50Q0xEW10gPQorICB7LTE1MC4wLC00NS4wLC00MC4wLC0zNS4wLC0zMC4wLC0yNS4wLC0yMi4wLC0xOS4wLC0xNi4wLC0xMy4wLC0xMC4wLCAtOC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAtNi4wLCAtNC4wLCAtMi4wLCAgMC4wLCAgMi4wLCAgNC4wLCAgNi4wLCAgOC4wLAorICAxMC4wLCAxMy4wLCAxNi4wLCAxOS4wLCAyMi4wLCAyNS4wLCAzMC4wLCAzNS4wLCA0MC4wLCA0NS4wLCAxNTAuMCB9OyBmbG9hdAorICBkZXF1YW50SVBEW10gPQorICB7MC5mLDAuMzkyNjk5MDgyZiwwLjc4NTM5ODE2M2YsMS4xNzgwOTcyNDVmLDEuNTcwNzk2MzI3ZiwxLjk2MzQ5NTQwOGYsCisgICAgICAgICAgICAgICAgICAgICAgICAyLjM1NjE5NDQ5ZiwyLjc0ODg5MzU3MmYsMy4xNDE1OTI2NTRmLDMuNTM0MjkxNzM1ZiwzLjkyNjk5MDgxN2YsCisgICAgICAgICAgICAgICAgICAgICAgICA0LjMxOTY4OTg5OWYsNC43MTIzODg5OGYsNS4xMDUwODgwNjJmLDUuNDk3Nzg3MTQ0Ziw1Ljg5MDQ4NjIyNWZ9OworCisgIGZvciAoaXBkSWR4PTA7IGlwZElkeDwxNjsgaXBkSWR4KyspCisgICAgZm9yIChjbGRJZHg9MDsgY2xkSWR4PDMxOyBjbGRJZHgrKykKKyAgICAgIGZvciAoaWNjSWR4PTA7IGljY0lkeDw4OyBpY2NJZHgrKykgeworICAgICAgICBpcGQgPSBkZXF1YW50SVBEW2lwZElkeF07CisgICAgICAgIGNsZCA9IGRlcXVhbnRDTERbY2xkSWR4XTsKKyAgICAgICAgaWNjID0gZGVxdWFudElDQ1tpY2NJZHhdOworICAgICAgICBpaWRMaW4gPSAoZmxvYXQpIHBvdygxMC4wZiwgY2xkIC8gMjAuMGYpOworICAgICAgICBpaWRMaW4yID0gaWlkTGluICogaWlkTGluOworICAgICAgICBpaWRMaW4yMSA9IGlpZExpbjIgKyAxLjBmOworICAgICAgICBzaW5JcGQgPSAoZmxvYXQpIHNpbihpcGQpOworICAgICAgICBjb3NJcGQgPSAoZmxvYXQpIGNvcyhpcGQpOworICAgICAgICB0ZW1wMSA9IDIuMGYgKiBpY2MgKiBpaWRMaW47CisgICAgICAgIHRlbXAxYyA9IHRlbXAxICogY29zSXBkOworICAgICAgICByYXRpbyA9IChpaWRMaW4yMSArIHRlbXAxYykgLyAoaWlkTGluMjEgKyB0ZW1wMSkgKyBBQlNfVEhSOworICAgICAgICB3MiA9IChmbG9hdCkgcG93KHJhdGlvLCAwLjI1Zik7CisgICAgICAgIHcxID0gMi4wZiAtIHcyOworICAgICAgICBkZXF1YW50SVBEX0NMRF9JQ0Nfc3BsaXRBbmdsZV9fRkRLW2lwZElkeF1bY2xkSWR4XVtpY2NJZHhdID0gKGZsb2F0KQorICBhdGFuMih3MiAqIHNpbklwZCwgdzEgKiBpaWRMaW4gKyB3MiAqIGNvc0lwZCk7CisgICAgICB9CisqLworCisjZGVmaW5lIFNDQUxFX0NMRChhKSAoRkwyRlhDT05TVF9DRkcoYSkpCisKK2NvbnN0IEZJWFBfQ0ZHIGRlcXVhbnRDTERfY19sWzMxXSA9IHsKKyAgICBTQ0FMRV9DTEQoMC4wMDAwMDAwMzE2ZiksCisgICAgU0NBTEVfQ0xEKDAuMDA1NjIzMzI0M2YpLAorICAgIFNDQUxFX0NMRCgwLjAwOTk5OTQ5OTdmKSwKKyAgICBTQ0FMRV9DTEQoMC4wMTc3Nzk5ODM2ZiksCisgICAgU0NBTEVfQ0xEKDAuMDMxNjA2OTc1OWYpLAorICAgIFNDQUxFX0NMRCgwLjA1NjE0NTQyOTZmKSwKKyAgICBTQ0FMRV9DTEQoMC4wNzkxODM0MDcxZiksCisgICAgU0NBTEVfQ0xEKDAuMTExNTAyMTc4MGYpLAorICAgIFNDQUxFX0NMRCgwLjE1NjUzNTUwNjJmKSwKKyAgICBTQ0FMRV9DTEQoMC4yMTg0NjQ0NjM5ZiksCisgICAgU0NBTEVfQ0xEKDAuMzAxNTExMzQ3M2YpLAorICAgIFNDQUxFX0NMRCgwLjM2OTg3NDE0OTZmKSwKKyAgICBTQ0FMRV9DTEQoMC40NDgwNjI0Nzk1ZiksCisgICAgU0NBTEVfQ0xEKDAuNTMzNjE3MTM4OWYpLAorICAgIFNDQUxFX0NMRCgwLjYyMTk4MzIzMDFmKSwKKyAgICBTQ0FMRV9DTEQoMC43MDcxMDY3NjkxZiksCisgICAgU0NBTEVfQ0xEKDAuNzgzMDMwNTY5NmYpLAorICAgIFNDQUxFX0NMRCgwLjg0NTcyNjE5MjBmKSwKKyAgICBTQ0FMRV9DTEQoMC44OTQwMDIxOTkyZiksCisgICAgU0NBTEVfQ0xEKDAuOTI5MDgxODU3MmYpLAorICAgIFNDQUxFX0NMRCgwLjk1MzQ2MjYwMDdmKSwKKyAgICBTQ0FMRV9DTEQoMC45NzU4NDQ5MTk3ZiksCisgICAgU0NBTEVfQ0xEKDAuOTg3NjcyMzI4OWYpLAorICAgIFNDQUxFX0NMRCgwLjk5Mzc2NDE2MjFmKSwKKyAgICBTQ0FMRV9DTEQoMC45OTY4NjAwODY5ZiksCisgICAgU0NBTEVfQ0xEKDAuOTk4NDIyNjIyN2YpLAorICAgIFNDQUxFX0NMRCgwLjk5OTUwMDM5MzlmKSwKKyAgICBTQ0FMRV9DTEQoMC45OTk4NDE5Mjg1ZiksCisgICAgU0NBTEVfQ0xEKDAuOTk5OTQ5OTkxN2YpLAorICAgIFNDQUxFX0NMRCgwLjk5OTk4NDIwNDhmKSwKKyAgICAvKlNDQUxFX0NMRCgxLjAwMDAwMDAwMDBmKSovIEZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCl9OworCisjZGVmaW5lIFNDX0goYSkgKEZMMkZYQ09OU1RfQ0ZHKGEpKQorI2RlZmluZSBEQVRBX1RZUEVfSCBGSVhQX0NGRworCisvKiBub3QgY29ycmVsYXRlZCAgdGFibGVzICovCitjb25zdCBEQVRBX1RZUEVfSCBIMTFfbmNbMzFdWzhdID0geworICAgIHtTQ19IKDAuMDAwMDAwMDMxNmYpLCBTQ19IKDAuMDAwMDAwMDI5NmYpLCBTQ19IKDAuMDAwMDAwMDI2NmYpLAorICAgICBTQ19IKDAuMDAwMDAwMDE5MGYpLCBTQ19IKDAuMDAwMDAwMDExNmYpLCBTQ19IKDAuMDAwMDAwMDAwMGYpLAorICAgICBTQ19IKC0wLjAwMDAwMDAxODZmKSwgU0NfSCgtMC4wMDAwMDAwMzEzZil9LAorICAgIHtTQ19IKDAuMDA1NjIzMzI0M2YpLCBTQ19IKDAuMDA1MjcyODgzNWYpLCBTQ19IKDAuMDA0NzM5NDA5OGYpLAorICAgICBTQ19IKDAuMDAzMzk5MjY5MmYpLCBTQ19IKDAuMDAyMDk0NjIyMmYpLCBTQ19IKDAuMDAwMDMxNjIxNWYpLAorICAgICBTQ19IKC0wLjAwMzI5MTM4MjlmKSwgU0NfSCgtMC4wMDU1NjY0NTY0Zil9LAorICAgIHtTQ19IKDAuMDA5OTk5NDk5N2YpLCBTQ19IKDAuMDA5MzgxNTY0M2YpLCBTQ19IKDAuMDA4NDQwMjU0M2YpLAorICAgICBTQ19IKDAuMDA2MDcyMjEyNWYpLCBTQ19IKDAuMDAzNzYyMjE3OWYpLCBTQ19IKDAuMDAwMDk5OTg5OGYpLAorICAgICBTQ19IKC0wLjAwNTgyMzgyMDhmKSwgU0NfSCgtMC4wMDk4OTc0ODQ0Zil9LAorICAgIHtTQ19IKDAuMDE3Nzc5OTgzNmYpLCBTQ19IKDAuMDE2Njk3NDgzMWYpLCBTQ19IKDAuMDE1MDQ2NTg0NGYpLAorICAgICBTQ19IKDAuMDEwODgzMTQwNGYpLCBTQ19IKDAuMDA2ODA3MzgyMmYpLCBTQ19IKDAuMDAwMzE2MTI2N2YpLAorICAgICBTQ19IKC0wLjAxMDI2MjY1MTRmKSwgU0NfSCgtMC4wMTc1OTU3MjE0Zil9LAorICAgIHtTQ19IKDAuMDMxNjA2OTc1OWYpLCBTQ19IKDAuMDI5NzMyNDg0NGYpLCBTQ19IKDAuMDI2ODY4MTI3M2YpLAorICAgICBTQ19IKDAuMDE5NjEzODk3NGYpLCBTQ19IKDAuMDEyNDY5MTk2N2YpLCBTQ19IKDAuMDAwOTk4OTk4OGYpLAorICAgICBTQ19IKC0wLjAxNzk0NTI4MDNmKSwgU0NfSCgtMC4wMzEyNzAwNDIxZil9LAorICAgIHtTQ19IKDAuMDU2MTQ1NDI5NmYpLCBTQ19IKDAuMDUyOTY1MDQ4N2YpLCBTQ19IKDAuMDQ4MDg5NjkwNWYpLAorICAgICBTQ19IKDAuMDM1NjU2NDYzNGYpLCBTQ19IKDAuMDIzMjg2MDA3M2YpLCBTQ19IKDAuMDAzMTUyMzA4MWYpLAorICAgICBTQ19IKC0wLjAzMDkwMjk0MDhmKSwgU0NfSCgtMC4wNTU1MTU0ODMwZil9LAorICAgIHtTQ19IKDAuMDc5MTgzNDA3MWYpLCBTQ19IKDAuMDc0ODg0MjU4MmYpLCBTQ19IKDAuMDY4Mjc2MjExNmYpLAorICAgICBTQ19IKDAuMDUxMzI0MTY2NGYpLCBTQ19IKDAuMDM0MzA4MDM0OWYpLCBTQ19IKDAuMDA2MjcwMDA3MmYpLAorICAgICBTQ19IKC0wLjA0MjIzNDAzNzFmKSwgU0NfSCgtMC4wNzgyNDk5Mzg4Zil9LAorICAgIHtTQ19IKDAuMTExNTAyMTc4MGYpLCBTQ19IKDAuMTA1NzkyNDg1MmYpLCBTQ19IKDAuMDk2OTg3MzA3MWYpLAorICAgICBTQ19IKDAuMDc0MjMwNTE0NWYpLCBTQ19IKDAuMDUxMTI3NzYxNmYpLCBTQ19IKDAuMDEyNDMyNzI4OWYpLAorICAgICBTQ19IKC0wLjA1NjY1OTY2MTJmKSwgU0NfSCgtMC4xMTAwODk2Mjk5Zil9LAorICAgIHtTQ19IKDAuMTU2NTM1NTA2MmYpLCBTQ19IKDAuMTQ5MTM2NjE3OGYpLCBTQ19IKDAuMTM3NjgyNjMxNmYpLAorICAgICBTQ19IKDAuMTA3ODE4NjQwOGYpLCBTQ19IKDAuMDc3MDc5NDAwNGYpLCBTQ19IKDAuMDI0NTAzMzU1OGYpLAorICAgICBTQ19IKC0wLjA3MzU5ODA0MjFmKSwgU0NfSCgtMC4xNTQzMzAzMTMyZil9LAorICAgIHtTQ19IKDAuMjE4NDY0NDYzOWYpLCBTQ19IKDAuMjA5MTk3OTY4MmYpLCBTQ19IKDAuMTk0Nzk0ODE4OGYpLAorICAgICBTQ19IKDAuMTU2ODgyMjI2NWYpLCBTQ19IKDAuMTE3MjQ3ODk0NGYpLCBTQ19IKDAuMDQ3NzI2NzEzMWYpLAorICAgICBTQ19IKC0wLjA4OTk1MDcyNTRmKSwgU0NfSCgtMC4yMTQ4NTI2NDYwZil9LAorICAgIHtTQ19IKDAuMzAxNTExMzQ3M2YpLCBTQ19IKDAuMjkwNDM5MTI4OWYpLCBTQ19IKDAuMjczMTY3MzQxOWYpLAorICAgICBTQ19IKDAuMjI3MzAyNDAyM2YpLCBTQ19IKDAuMTc4NjIzOTE0N2YpLCBTQ19IKDAuMDkwOTA5MDc4N2YpLAorICAgICBTQ19IKC0wLjA5NjQyNTUzMzNmKSwgU0NfSCgtMC4yOTUxMTI0OTA3Zil9LAorICAgIHtTQ19IKDAuMzY5ODc0MTQ5NmYpLCBTQ19IKDAuMzU3ODI4NDA4NWYpLCBTQ19IKDAuMzM5MDA2NjkyMmYpLAorICAgICBTQ19IKDAuMjg4ODEwODQ5MmYpLCBTQ19IKDAuMjM1MTExNzQzMmYpLCBTQ19IKDAuMTM2ODA2ODc1NWYpLAorICAgICBTQ19IKC0wLjA4NTAyOTYwOTVmKSwgU0NfSCgtMC4zNTk3OTY2MTM1Zil9LAorICAgIHtTQ19IKDAuNDQ4MDYyNDc5NWYpLCBTQ19IKDAuNDM1NDAyNTQyNGYpLCBTQ19IKDAuNDE1NjA3NzUwNGYpLAorICAgICBTQ19IKDAuMzYyNzEyMDI1NmYpLCBTQ19IKDAuMzA1ODgyMzk0M2YpLCBTQ19IKDAuMjAwNzU5OTc3MWYpLAorICAgICBTQ19IKC0wLjA0ODQwMjA5MzRmKSwgU0NfSCgtMC40MzA0OTQwNzAxZil9LAorICAgIHtTQ19IKDAuNTMzNjE3MTM4OWYpLCBTQ19IKDAuNTIwODQ3MTQxN2YpLCBTQ19IKDAuNTAwODkzNTkyOGYpLAorICAgICBTQ19IKDAuNDQ3NjQyMDU4MWYpLCBTQ19IKDAuMzkwNTA0NDQ5NmYpLCBTQ19IKDAuMjg0NzQ3MjQyOWYpLAorICAgICBTQ19IKDAuMDI3NjY3NjAwN2YpLCBTQ19IKC0wLjQ5NjY1NzkwODBmKX0sCisgICAge1NDX0goMC42MjE5ODMyMzAxZiksIFNDX0goMC42MDk2OTYzODgyZiksIFNDX0goMC41OTA1NDE1NDE2ZiksCisgICAgIFNDX0goMC41Mzk2OTUwMjQ1ZiksIFNDX0goMC40ODU2MDcwNTc4ZiksIFNDX0goMC4zODY4NjMxMTI0ZiksCisgICAgIFNDX0goMC4xNTMxNjUyOTU3ZiksIFNDX0goLTAuNTA0NTM2MTUxOWYpfSwKKyAgICB7U0NfSCgwLjcwNzEwNjc2OTFmKSwgU0NfSCgwLjY5NTg4MDcxMTFmKSwgU0NfSCgwLjY3ODQ1MDQwNTZmKSwKKyAgICAgU0NfSCgwLjYzMjYzNzMyMTlmKSwgU0NfSCgwLjU4NDczMDY4NDhmKSwgU0NfSCgwLjQ5OTk5OTk3MDJmKSwKKyAgICAgU0NfSCgwLjMyMDU0NjQ0ODJmKSwgU0NfSCgwLjA1MDAwMDAwNDVmKX0sCisgICAge1NDX0goMC43ODMwMzA1Njk2ZiksIFNDX0goMC43NzMzMDY3ODcwZiksIFNDX0goMC43NTgyOTYxMzIxZiksCisgICAgIFNDX0goMC43MTk0MDU1OTE1ZiksIFNDX0goMC42Nzk3NzA1MjkzZiksIFNDX0goMC42MTMxMzY4ODc2ZiksCisgICAgIFNDX0goMC40OTk3MzMyNjkyZiksIFNDX0goMC42OTM0MTkzOTY5Zil9LAorICAgIHtTQ19IKDAuODQ1NzI2MTkyMGYpLCBTQ19IKDAuODM3NzI3NDg3MWYpLCBTQ19IKDAuODI1NDY5NDkzOWYpLAorICAgICBTQ19IKDAuNzk0Mjg1MTc4MmYpLCBTQ19IKDAuNzYzNTQzOTAzOGYpLCBTQ19IKDAuNzE1MjUyNzU3MWYpLAorICAgICBTQ19IKDAuNjU2NzEyMjkzNmYpLCBTQ19IKDAuODIyOTA2MTk2MWYpfSwKKyAgICB7U0NfSCgwLjg5NDAwMjE5OTJmKSwgU0NfSCgwLjg4NzcyNDgxNjhmKSwgU0NfSCgwLjg3ODE4NTUxMDZmKSwKKyAgICAgU0NfSCgwLjg1NDQyMzc2MTRmKSwgU0NfSCgwLjgzMTg5MTgzNDdmKSwgU0NfSCgwLjc5OTIzOTkzMzVmKSwKKyAgICAgU0NfSCgwLjc3NTEyNzUzMDFmKSwgU0NfSCgwLjg4NTMyNzY5NjhmKX0sCisgICAge1NDX0goMC45MjkwODE4NTcyZiksIFNDX0goMC45MjQzNTI0MDc1ZiksIFNDX0goMC45MTcyMzA0ODY5ZiksCisgICAgIFNDX0goMC44OTk4ODc3NDA2ZiksIFNDX0goMC44ODQxMTc0ODQxZiksIFNDX0goMC44NjMxOTMwOTQ3ZiksCisgICAgIFNDX0goMC44NTY1MTM5NzcxZiksIFNDX0goMC45MjUxMTYxMjE4Zil9LAorICAgIHtTQ19IKDAuOTUzNDYyNjAwN2YpLCBTQ19IKDAuOTUwMDE5MzAwMGYpLCBTQ19IKDAuOTQ0ODgyMTU0NWYpLAorICAgICBTQ19IKDAuOTMyNjU2NTI2NmYpLCBTQ19IKDAuOTIyMDAyMzc1MWYpLCBTQ19IKDAuOTA5MDkwOTM2MmYpLAorICAgICBTQ19IKDAuOTA5NjU5MTQ3M2YpLCBTQ19IKDAuOTUxNDU4NDU0MWYpfSwKKyAgICB7U0NfSCgwLjk3NTg0NDkxOTdmKSwgU0NfSCgwLjk3MzgxMjI4MjFmKSwgU0NfSCgwLjk3MDgyMDA2OTNmKSwKKyAgICAgU0NfSCgwLjk2MzkyODc1OTFmKSwgU0NfSCgwLjk1ODI3NjM5MTBmKSwgU0NfSCgwLjk1MjI3MzMwOTJmKSwKKyAgICAgU0NfSCgwLjk1NTMyMDcxNTlmKSwgU0NfSCgwLjk3NTA0MjcwMDhmKX0sCisgICAge1NDX0goMC45ODc2NzIzMjg5ZiksIFNDX0goMC45ODY1MjY3Mjc3ZiksIFNDX0goMC45ODQ4NjAzMDEwZiksCisgICAgIFNDX0goMC45ODExMzEwMTcyZiksIFNDX0goMC45NzgyMzAyOTc2ZiksIFNDX0goMC45NzU0OTY2NDk3ZiksCisgICAgIFNDX0goMC45Nzc5NjIxMzYzZiksIFNDX0goMC45ODczMjUyNTExZil9LAorICAgIHtTQ19IKDAuOTkzNzY0MTYyMWYpLCBTQ19IKDAuOTkzMTM5NzQzOGYpLCBTQ19IKDAuOTkyMjQwNDI4OWYpLAorICAgICBTQ19IKDAuOTkwMjc1MDI1NGYpLCBTQ19IKDAuOTg4ODExNjcxN2YpLCBTQ19IKDAuOTg3NTY3MjQ2MGYpLAorICAgICBTQ19IKDAuOTg5MTEzMTUyMGYpLCBTQ19IKDAuOTkzNjA2Njg2NmYpfSwKKyAgICB7U0NfSCgwLjk5Njg2MDA4NjlmKSwgU0NfSCgwLjk5NjUyNzc5MTBmKSwgU0NfSCgwLjk5NjA1MzA0MDBmKSwKKyAgICAgU0NfSCgwLjk5NTAzNDc1NDNmKSwgU0NfSCgwLjk5NDMwMjI3MjhmKSwgU0NfSCgwLjk5MzczMDAwODZmKSwKKyAgICAgU0NfSCgwLjk5NDYwNzMyOTRmKSwgU0NfSCgwLjk5Njc4NjM1NjBmKX0sCisgICAge1NDX0goMC45OTg0MjI2MjI3ZiksIFNDX0goMC45OTgyNDg4MTU1ZiksIFNDX0goMC45OTgwMDIwNTIzZiksCisgICAgIFNDX0goMC45OTc0ODAyMTM2ZiksIFNDX0goMC45OTcxMTQ2NTg0ZiksIFNDX0goMC45OTY4NDc2ODkyZiksCisgICAgIFNDX0goMC45OTczMjE2MDU3ZiksIFNDX0goMC45OTgzODczOTYzZil9LAorICAgIHtTQ19IKDAuOTk5NTAwMzkzOWYpLCBTQ19IKDAuOTk5NDQyODc1NGYpLCBTQ19IKDAuOTk5MzYxNzUzNWYpLAorICAgICBTQ19IKDAuOTk5MTkzMDcyM2YpLCBTQ19IKDAuOTk5MDc4MzMzNGYpLCBTQ19IKDAuOTk5MDAxMDI2MmYpLAorICAgICBTQ19IKDAuOTk5MTYxNjYwN2YpLCBTQ19IKDAuOTk5NDg5Nzg0MmYpfSwKKyAgICB7U0NfSCgwLjk5OTg0MTkyODVmKSwgU0NfSCgwLjk5OTgyMzI3MjJmKSwgU0NfSCgwLjk5OTc5NzA0NjJmKSwKKyAgICAgU0NfSCgwLjk5OTc0MzA0NDRmKSwgU0NfSCgwLjk5OTcwNjk4MzZmKSwgU0NfSCgwLjk5OTY4Mzg1NzBmKSwKKyAgICAgU0NfSCgwLjk5OTczNjQ4NzlmKSwgU0NfSCgwLjk5OTgzODY1MDJmKX0sCisgICAge1NDX0goMC45OTk5NDk5OTE3ZiksIFNDX0goMC45OTk5NDQwMzEyZiksIFNDX0goMC45OTk5MzU2MjcwZiksCisgICAgIFNDX0goMC45OTk5MTg0MDEyZiksIFNDX0goMC45OTk5MDcwNzY0ZiksIFNDX0goMC45OTk4OTk5ODM0ZiksCisgICAgIFNDX0goMC45OTk5MTY5NzA3ZiksIFNDX0goMC45OTk5NDg5Nzg0Zil9LAorICAgIHtTQ19IKDAuOTk5OTg0MjA0OGYpLCBTQ19IKDAuOTk5OTgyMjk3NGYpLCBTQ19IKDAuOTk5OTc5NjE1MmYpLAorICAgICBTQ19IKDAuOTk5OTc0MTkxMmYpLCBTQ19IKDAuOTk5OTcwNjE0OWYpLCBTQ19IKDAuOTk5OTY4NDA5NWYpLAorICAgICBTQ19IKDAuOTk5OTczODMzNmYpLCBTQ19IKDAuOTk5OTgzOTA2N2YpfSwKKyAgICAvKiB7IFNDX0goIDEuMDAwMDAwMDAwMGYpLCBTQ19IKCAxLjAwMDAwMDAwMDBmKSwgU0NfSCggMS4wMDAwMDAwMDAwZiksCisgICAgICAgU0NfSCggMS4wMDAwMDAwMDAwZiksIFNDX0goIDEuMDAwMDAwMDAwMGYpLCBTQ19IKCAxLjAwMDAwMDAwMDBmKSwKKyAgICAgICBTQ19IKCAxLjAwMDAwMDAwMDBmKSwgU0NfSCggMS4wMDAwMDAwMDAwZil9ICovCisgICAge0ZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCksIEZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCksCisgICAgIEZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCksIEZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCksCisgICAgIEZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCksIEZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCksCisgICAgIEZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCksIEZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCl9fTsKK2NvbnN0IERBVEFfVFlQRV9IIEgxMl9uY1szMV1bOF0gPSB7CisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMDAwMDAwMTEwZiksIFNDX0goMC4wMDAwMDAwMTcxZiksCisgICAgIFNDX0goMC4wMDAwMDAwMjUzZiksIFNDX0goMC4wMDAwMDAwMjk0ZiksIFNDX0goMC4wMDAwMDAwMzE2ZiksCisgICAgIFNDX0goMC4wMDAwMDAwMjU2ZiksIFNDX0goMC4wMDAwMDAwMDQ1Zil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDAxOTU0MDkyNGYpLCBTQ19IKDAuMDAzMDI2NTExM2YpLAorICAgICBTQ19IKDAuMDA0NDc5NTkyMmYpLCBTQ19IKDAuMDA1MjE4NjUyNWYpLCBTQ19IKDAuMDA1NjIzMjM1NGYpLAorICAgICBTQ19IKDAuMDA0NTU5NDQ4OWYpLCBTQ19IKDAuMDAwNzk3NzA4NWYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAwMzQ2MDY3MjBmKSwgU0NfSCgwLjAwNTM2MjA5ODZmKSwKKyAgICAgU0NfSCgwLjAwNzk0NDY5ODRmKSwgU0NfSCgwLjAwOTI2NDc1NjBmKSwgU0NfSCgwLjAwOTk5ODk5OTVmKSwKKyAgICAgU0NfSCgwLjAwODEyODUzNjlmKSwgU0NfSCgwLjAwMTQyNDcwNjRmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMDYxMDkxNjE4ZiksIFNDX0goMC4wMDk0NzI0OTIyZiksCisgICAgIFNDX0goMC4wMTQwNjAwNTIxZiksIFNDX0goMC4wMTY0MjUyMDU0ZiksIFNDX0goMC4wMTc3NzcxNzI4ZiksCisgICAgIFNDX0goMC4wMTQ1MTkxNTMyZiksIFNDX0goMC4wMDI1NTMxMTQwZil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDEwNzIyODg1OGYpLCBTQ19IKDAuMDE2NjQ2NDYxNmYpLAorICAgICBTQ19IKDAuMDI0Nzg0OTkzNGYpLCBTQ19IKDAuMDI5MDQzNDE3NGYpLCBTQ19IKDAuMDMxNTkxMTg0NGYpLAorICAgICBTQ19IKDAuMDI2MDE4NjA2NWYpLCBTQ19IKDAuMDA0NjAyNzYxNWYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAxODYyODI4NjJmKSwgU0NfSCgwLjAyODk3NzQyMjBmKSwKKyAgICAgU0NfSCgwLjA0MzM2OTYzOTdmKSwgU0NfSCgwLjA1MTA4ODg1NDdmKSwgU0NfSCgwLjA1NjA1Njg2NDZmKSwKKyAgICAgU0NfSCgwLjA0Njg3NTU1NTFmKSwgU0NfSCgwLjAwODM4NjkyNjdmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMjU3MzYzNTQzZiksIFNDX0goMC4wNDAxMDQ0OTcyZiksCisgICAgIFNDX0goMC4wNjAyOTc5NDM3ZiksIFNDX0goMC4wNzEzNjUwNTEwZiksIFNDX0goMC4wNzg5MzQ3NzM4ZiksCisgICAgIFNDX0goMC4wNjY5Nzk4MzI5ZiksIFNDX0goMC4wMTIxMjI2NzY3Zil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDM1MjIzMzcyM2YpLCBTQ19IKDAuMDU1MDEwODkyNWYpLAorICAgICBTQ19IKDAuMDgzMjAxOTU5N2YpLCBTQ19IKDAuMDk5MDg5Mjk0N2YpLCBTQ19IKDAuMTEwODA2ODc0OWYpLAorICAgICBTQ19IKDAuMDk2MDMzNDI0MWYpLCBTQ19IKDAuMDE3NjkyMDU5M2YpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjA0NzU1NjY1MzZmKSwgU0NfSCgwLjA3NDQ3NzIyNTVmKSwKKyAgICAgU0NfSCgwLjExMzQ4MzUwMzVmKSwgU0NfSCgwLjEzNjI0MjkxMTJmKSwgU0NfSCgwLjE1NDYwNTc5MTBmKSwKKyAgICAgU0NfSCgwLjEzODE1NDU5NjFmKSwgU0NfSCgwLjAyNjE4MjQzOTJmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wNjI5NTE4MTgxZiksIFNDX0goMC4wOTg5MDI0ODYzZiksCisgICAgIFNDX0goMC4xNTIwMzUxNjE5ZiksIFNDX0goMC4xODQzMzU3MDg2ZiksIFNDX0goMC4yMTMxODc0NDEyZiksCisgICAgIFNDX0goMC4xOTkwODY4ODk2ZiksIFNDX0goMC4wMzk1NjA4OTkxZil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDgwOTU4MDkwN2YpLCBTQ19IKDAuMTI3NjI3MTQ5MmYpLAorICAgICBTQ19IKDAuMTk4MDk3NzM1NmYpLCBTQ19IKDAuMjQyOTA0NDg0M2YpLCBTQ19IKDAuMjg3NDc5Nzg4MWYpLAorICAgICBTQ19IKDAuMjg1Njc2NzQ3NmYpLCBTQ19IKDAuMDYxNzg3NTY0M2YpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjA5MzYyNTQzMzdmKSwgU0NfSCgwLjE0NzkyMzQzOTdmKSwKKyAgICAgU0NfSCgwLjIzMTA3Mzk2MDdmKSwgU0NfSCgwLjI4NTUzMzQ1ODBmKSwgU0NfSCgwLjM0MzY0MzM2NzNmKSwKKyAgICAgU0NfSCgwLjM1OTk2Nzg1NzZmKSwgU0NfSCgwLjA4NTc1MTI3MjdmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4xMDU3NTczNzgwZiksIFNDX0goMC4xNjc0MjIxNzU0ZiksCisgICAgIFNDX0goMC4yNjMwNTg4NDEyZiksIFNDX0goMC4zMjc0MDc5MjYzZiksIFNDX0goMC40MDA1Njg4NzI3ZiksCisgICAgIFNDX0goMC40NDU0NDA0NzEyZiksIFNDX0goMC4xMjQyMzcwNTMxZil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMTE2MDQwOTMwMmYpLCBTQ19IKDAuMTgzOTkxNTA2N2YpLAorICAgICBTQ19IKDAuMjkwNDU0NTY2NWYpLCBTQ19IKDAuMzYzNjY2NzcyOGYpLCBTQ19IKDAuNDUxMjkzOTc1MWYpLAorICAgICBTQ19IKDAuNTMyODk5Mzc5N2YpLCBTQ19IKDAuMTk1MTM2MjY0MGYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjEyMzAxODIwNTJmKSwgU0NfSCgwLjE5NTI1MzI5NzdmKSwKKyAgICAgU0NfSCgwLjMwOTE4MDI1OTdmKSwgU0NfSCgwLjM4ODY1MDE0OTFmKSwgU0NfSCgwLjQ4NzAzMTg3NzBmKSwKKyAgICAgU0NfSCgwLjYwMjgyOTU3NTVmKSwgU0NfSCgwLjM2MzczOTUyMDNmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4xMjU0OTkwMjUwZiksIFNDX0goMC4xOTkyNjExMTQwZiksCisgICAgIFNDX0goMC4zMTU4NjM4Nzc1ZiksIFNDX0goMC4zOTc2MDUzMjk4ZiksIFNDX0goMC41MDAwMDAwMDAwZiksCisgICAgIFNDX0goMC42MzAyNzc2OTMzZiksIFNDX0goMC43MDUzMzY4MDkyZil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMTIzMDE4MjA1MmYpLCBTQ19IKDAuMTk1MjUzMzEyNmYpLAorICAgICBTQ19IKDAuMzA5MTgwMjU5N2YpLCBTQ19IKDAuMzg4NjUwMTQ5MWYpLCBTQ19IKDAuNDg3MDMxOTA2OGYpLAorICAgICBTQ19IKDAuNjAyODI5NTc1NWYpLCBTQ19IKDAuMzYzNzM5NDkwNWYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjExNjA0MDkzMDJmKSwgU0NfSCgwLjE4Mzk5MTUyMTZmKSwKKyAgICAgU0NfSCgwLjI5MDQ1NDU2NjVmKSwgU0NfSCgwLjM2MzY2NjgwMjZmKSwgU0NfSCgwLjQ1MTI5Mzk3NTFmKSwKKyAgICAgU0NfSCgwLjUzMjg5OTM3OTdmKSwgU0NfSCgwLjE5NTEzNjIwNDRmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4xMDU3NTczODU1ZiksIFNDX0goMC4xNjc0MjIxNzU0ZiksCisgICAgIFNDX0goMC4yNjMwNTg4NzEwZiksIFNDX0goMC4zMjc0MDc5MjYzZiksIFNDX0goMC40MDA1Njg4NzI3ZiksCisgICAgIFNDX0goMC40NDU0NDA1MDEwZiksIFNDX0goMC4xMjQyMzcwMzgyZil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDkzNjI1NDMzN2YpLCBTQ19IKDAuMTQ3OTIzNDM5N2YpLAorICAgICBTQ19IKDAuMjMxMDczOTYwN2YpLCBTQ19IKDAuMjg1NTMzNDU4MGYpLCBTQ19IKDAuMzQzNjQzMzY3M2YpLAorICAgICBTQ19IKDAuMzU5OTY3ODU3NmYpLCBTQ19IKDAuMDg1NzUxMjY1M2YpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjA4MDk1ODA5MDdmKSwgU0NfSCgwLjEyNzYyNzE0OTJmKSwKKyAgICAgU0NfSCgwLjE5ODA5NzcyMDdmKSwgU0NfSCgwLjI0MjkwNDQ4NDNmKSwgU0NfSCgwLjI4NzQ3OTc4ODFmKSwKKyAgICAgU0NfSCgwLjI4NTY3Njc0NzZmKSwgU0NfSCgwLjA2MTc4NzU2MDZmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wNjI5NTE4MTA3ZiksIFNDX0goMC4wOTg5MDI0ODYzZiksCisgICAgIFNDX0goMC4xNTIwMzUxNjE5ZiksIFNDX0goMC4xODQzMzU3MjM1ZiksIFNDX0goMC4yMTMxODc0NDEyZiksCisgICAgIFNDX0goMC4xOTkwODY4ODk2ZiksIFNDX0goMC4wMzk1NjA5NDAxZil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDQ3NTU2NjQ2MmYpLCBTQ19IKDAuMDc0NDc3MjI1NWYpLAorICAgICBTQ19IKDAuMTEzNDgzNTE4NGYpLCBTQ19IKDAuMTM2MjQyOTExMmYpLCBTQ19IKDAuMTU0NjA1Nzc2MWYpLAorICAgICBTQ19IKDAuMTM4MTU0NTk2MWYpLCBTQ19IKDAuMDI2MTgyNDgwMmYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAzNTIyMzM3OTdmKSwgU0NfSCgwLjA1NTAxMDg5NjJmKSwKKyAgICAgU0NfSCgwLjA4MzIwMTk0NDhmKSwgU0NfSCgwLjA5OTA4OTI3OThmKSwgU0NfSCgwLjExMDgwNjg1MjZmKSwKKyAgICAgU0NfSCgwLjA5NjAzMzQ0NjVmKSwgU0NfSCgwLjAxNzY5MjA2ODZmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMjU3MzYzNTI0ZiksIFNDX0goMC4wNDAxMDQ0OTM1ZiksCisgICAgIFNDX0goMC4wNjAyOTc5NDc0ZiksIFNDX0goMC4wNzEzNjUwODA4ZiksIFNDX0goMC4wNzg5MzQ3NTg5ZiksCisgICAgIFNDX0goMC4wNjY5Nzk3OTU3ZiksIFNDX0goMC4wMTIxMjI2NTE2Zil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDE4NjI4Mjg4MWYpLCBTQ19IKDAuMDI4OTc3NDI1OGYpLAorICAgICBTQ19IKDAuMDQzMzY5NjI0OGYpLCBTQ19IKDAuMDUxMDg4ODU0N2YpLCBTQ19IKDAuMDU2MDU2ODkwNmYpLAorICAgICBTQ19IKDAuMDQ2ODc1NTg4NmYpLCBTQ19IKDAuMDA4Mzg2OTcxNGYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAxMDcyMjg4MzBmKSwgU0NfSCgwLjAxNjY0NjQ3MjdmKSwKKyAgICAgU0NfSCgwLjAyNDc4NDk4MjJmKSwgU0NfSCgwLjAyOTA0MzQyNDlmKSwgU0NfSCgwLjAzMTU5MTE2MjFmKSwKKyAgICAgU0NfSCgwLjAyNjAxODY0NzVmKSwgU0NfSCgwLjAwNDYwMjczNzdmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMDYxMDkxNTc2ZiksIFNDX0goMC4wMDk0NzI0ODk0ZiksCisgICAgIFNDX0goMC4wMTQwNjAwNDY1ZiksIFNDX0goMC4wMTY0MjUxOTQyZiksIFNDX0goMC4wMTc3NzcxNTI0ZiksCisgICAgIFNDX0goMC4wMTQ1MTkxNTA0ZiksIFNDX0goMC4wMDI1NTMwNTY3Zil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDAzNDYwNjc0M2YpLCBTQ19IKDAuMDA1MzYyMDk3NmYpLAorICAgICBTQ19IKDAuMDA3OTQ0Njk5NGYpLCBTQ19IKDAuMDA5MjY0NzY3MmYpLCBTQ19IKDAuMDA5OTk5MDI1NmYpLAorICAgICBTQ19IKDAuMDA4MTI4NTA0M2YpLCBTQ19IKDAuMDAxNDI0NzE3N2YpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAwMTk1NDA5MTJmKSwgU0NfSCgwLjAwMzAyNjUyMjVmKSwKKyAgICAgU0NfSCgwLjAwNDQ3OTU5MDhmKSwgU0NfSCgwLjAwNTIxODYzODFmKSwgU0NfSCgwLjAwNTYyMzIyMjNmKSwKKyAgICAgU0NfSCgwLjAwNDU1OTQyODlmKSwgU0NfSCgwLjAwMDc5NzczNTlmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMDAwMDAwMTQ5ZiksIFNDX0goMC4wMDAwMDAwMjk4ZiksCisgICAgIFNDX0goMC4wMDAwMDAwMjk4ZiksIFNDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMDAwMDAwNTk2ZiksCisgICAgIFNDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMDAwMDAwMDAwZil9fTsKKworLyoKKyAgZm9yIChpPTA7IGk8MzE7IGkrKykgeworICAgIGNsZCA9IGRlcXVhbnRDTERbaV07CisgICAgdmFsID0gKGZsb2F0KShGREtleHAoY2xkL2RiZSkvKDErRkRLZXhwKGNsZC9kYmUpKSk7CisgICAgdmFsID0gKGZsb2F0KShkYmUqRkRLbG9nKHZhbCkpOworICB9CisqLworI2RlZmluZSBTQ0FMRV9DTERfQzFDMihhKSAoRkwyRlhDT05TVF9EQkwoYSAvIChmbG9hdCkoMSA8PCBTRl9DTERfQzFDMikpKQorY29uc3QgRklYUF9EQkwgZGVxdWFudENMRF9jMVszMV0gPSB7U0NBTEVfQ0xEX0MxQzIoLTEuNTAwMDAwMDAwMDAwMDAwMGUrMDAyZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtNC41MDAwMTM3MzI5MTAxNTYzZSswMDFmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC00LjAwMDA0MzQ4NzU0ODgyODFlKzAwMWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTMuNTAwMTM3MzI5MTAxNTYyNWUrMDAxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMy4wMDA0MzQxMTI1NDg4MjgxZSswMDFmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC0yLjUwMTM3MTE5MjkzMjEyODllKzAwMWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTIuMjAyNzMxNTEzOTc3MDUwOGUrMDAxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMS45MDU0MzMyNzMzMTU0Mjk3ZSswMDFmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC0xLjYxMDc3NDIzMDk1NzAzMTNlKzAwMWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTEuMzIxMjM4NDIyMzkzNzk4OGUrMDAxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMS4wNDEzOTI3MDc4MjQ3MDcwZSswMDFmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC04LjYzODkyMDc4Mzk5NjU4MjBlKzAwMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTYuOTczMjI3OTc3NzUyNjg1NWUrMDAwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtNS40NTU0MDQyODE2MTYyMTA5ZSswMDBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC00LjEyNDQyNTg4ODA2MTUyMzRlKzAwMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTMuMDEwMjk5OTIxMDM1NzY2NmUrMDAwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMi4xMjQ0MjU4ODgwNjE1MjM0ZSswMDBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC0xLjQ1NTQwNDUyMDAzNDc5MDBlKzAwMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTkuNzMyMjc4NTg1NDMzOTYwMGUtMDAxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtNi4zODkyMDM2Njc2NDA2ODYwZS0wMDFmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC00LjEzOTI2NjkwODE2ODc5MjdlLTAwMWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTIuMTIzODM4NjYzMTAxMTk2M2UtMDAxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMS4wNzc0MjE3NTQ1OTg2MTc2ZS0wMDFmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC01LjQzMzMyMjExNjczMjU5NzRlLTAwMmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTIuNzMxNTk1MDAyMTE0NzcyOGUtMDAyZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMS4zNzExOTM0OTA5MjI0NTEwZS0wMDJmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC00LjM0MDY1NjU2NzM2NDkzMTFlLTAwM2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTEuMzczMjA4ODI2NDA3NzkwMmUtMDAzZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtNC4zNDM4ODI2MTA1NTU3MzgyZS0wMDRmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC0xLjM3NDU2NjYzNjUxMzkxODZlLTAwNGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoMC4wMDAwMDAwMDAwMDAwMDAwZSswMDBmKX07CisKKy8qIHNhY19zdHAgKi8KKy8qIG5vbmUgc2NhbGVkICovCitjb25zdCBGSVhQX0NGRyBCUF9fRkRLW10gPSB7RkwyRlhDT05TVF9DRkcoMC43MzkxOTk5OTU5OTQ1NyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9DRkcoMC45NzkwOTk5ODg5MzczOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9DRkcoMC45OTkzMDAwMDMwNTE3Nil9OworCisvKiBzY2FsZWQgd2l0aCAyNiBiaXRzICovCitjb25zdCBGSVhQX0NGRyBCUF9HRl9fRkRLW10gPSB7CisgICAgRkwyRlhDT05TVF9DRkcoMC4wMDAwMDAwMDY0MzMzMCksIEZMMkZYQ09OU1RfQ0ZHKDAuMDAwMDQzOTY4NTAyMzIpLAorICAgIEZMMkZYQ09OU1RfQ0ZHKDAuMDAwODc0NTY5NDg1NTIpLCBGTDJGWENPTlNUX0NGRygwLjAwNDc0NjQ4MjIwMjQzKSwKKyAgICBGTDJGWENPTlNUX0NGRygwLjAxNzE3OTg3MjQ0ODAwKSwgRkwyRlhDT05TVF9DRkcoMC4wNDkwNjc0MjQ5MTA3MyksCisgICAgRkwyRlhDT05TVF9DRkcoMC4xMDU2OTUxODY1NjcyOSksIEZMMkZYQ09OU1RfQ0ZHKDAuMjExNjU3Njc1OTI2NTMpLAorICAgIEZMMkZYQ09OU1RfQ0ZHKDAuMzYwMzY3NjI0NzgwMjQpLCBGTDJGWENPTlNUX0NGRygwLjU5ODk0MTgyNzY2OTQ4KSwKKyAgICBGTDJGWENPTlNUX0NGRygwLjgxNjQxNjc4OTI5MTI5KSwgRkwyRlhDT05TVF9DRkcoMC45NzQxODQ4MTEzMzM5NyksCisgICAgRkwyRlhDT05TVF9DRkcoMC45OTU3NTQxMTYxMDg0NSksIEZMMkZYQ09OU1RfQ0ZHKDAuODg4NDI2NjYyODEzNjEpLAorICAgIEZMMkZYQ09OU1RfQ0ZHKDAuNzkyMjIzMTcwNjM3MzYpLCBGTDJGWENPTlNUX0NGRygwLjcwODI4NjA0MzE4NjA0KSwKKyAgICBGTDJGWENPTlNUX0NGRygwLjY2Mzk1MDU0ODE2MzM4KSwgRkwyRlhDT05TVF9DRkcoMC42NDYzMzczOTUxNjk1MiksCisgICAgRkwyRlhDT05TVF9DRkcoMC42NjA5ODI3ODE4NTI1NSl9OworCisvKiBzYWNfYml0ZGVjICovCitjb25zdCBJTlQgc2FtcGxpbmdGcmVxVGFibGVbMTZdID0gezk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzM1MCwgIDAsICAgICAwLCAgICAgMH07CisKK2NvbnN0IFVDSEFSIGZyZXFSZXNUYWJsZVtdID0gezAsIDI4LCAyMCwgMTQsIDEwLCA3LCA1LCA0fTsKKworY29uc3QgVUNIQVIgZnJlcVJlc1RhYmxlX0xEW10gPSB7MCwgMjMsIDE1LCAxMiwgOSwgNywgNSwgNH07CisKK2NvbnN0IFVDSEFSIHRlbXBTaGFwZUNoYW5UYWJsZVtdWzhdID0ge3s1LCA1LCA0LCA2LCA2LCA0LCA0LCAyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1LCA1LCA1LCA3LCA3LCA0LCA0LCAyfX07CisKK2NvbnN0IFRSRUVQUk9QRVJUSUVTIHRyZWVQcm9wZXJ0eVRhYmxlW10gPSB7CisgICAgezEsIDYsIDUsIDAsIHswLCAwLCAwLCAwLCAxfX0sIHsxLCA2LCA1LCAwLCB7MCwgMCwgMSwgMCwgMH19LAorICAgIHsyLCA2LCAzLCAxLCB7MSwgMCwgMCwgMCwgMH19LCB7MiwgOCwgNSwgMSwgezEsIDAsIDAsIDAsIDB9fSwKKyAgICB7MiwgOCwgNSwgMSwgezEsIDAsIDAsIDAsIDB9fSwgezYsIDgsIDIsIDAsIHswLCAwLCAwLCAwLCAwfX0sCisgICAgezYsIDgsIDIsIDAsIHswLCAwLCAwLCAwLCAwfX0sIHsxLCAyLCAxLCAwLCB7MCwgMCwgMCwgMCwgMH19fTsKKworY29uc3QgU0NIQVIga2VybmVsc180X3RvXzcxW01BWF9IWUJSSURfQkFORFNdID0geworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzfTsKKworY29uc3QgU0NIQVIga2VybmVsc181X3RvXzcxW01BWF9IWUJSSURfQkFORFNdID0geworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0fTsKKworY29uc3QgU0NIQVIga2VybmVsc183X3RvXzcxW01BWF9IWUJSSURfQkFORFNdID0geworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsCisgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2fTsKKworY29uc3QgU0NIQVIga2VybmVsc18xMF90b183MVtNQVhfSFlCUklEX0JBTkRTXSA9IHsKKyAgICAwLCAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA3LCA3LCA3LCA4LCA4LAorICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksCisgICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorICAgIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksCisgICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOX07CisKK2NvbnN0IFNDSEFSIGtlcm5lbHNfMTRfdG9fNzFbTUFYX0hZQlJJRF9CQU5EU10gPSB7CisgICAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMiwgIDMsICA0LCAgNCwgIDUsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsCisgICAgOCwgIDksICA5LCAgOSwgIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTN9OworCitjb25zdCBTQ0hBUiBrZXJuZWxzXzIwX3RvXzcxW01BWF9IWUJSSURfQkFORFNdID0geworICAgIDAsICAwLCAgMSwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsCisgICAgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOX07CisKK2NvbnN0IFNDSEFSIGtlcm5lbHNfMjhfdG9fNzFbTUFYX0hZQlJJRF9CQU5EU10gPSB7CisgICAgMCwgIDAsICAxLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgIDE1LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMywKKyAgICAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI2LCAyNiwgMjYsCisgICAgMjYsIDI2LCAyNiwgMjYsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LAorICAgIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKKyAgICAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisgICAgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LAorICAgIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3fTsKKworY29uc3QgU0NIQVIga2VybmVsc180X3RvXzY0W01BWF9IWUJSSURfQkFORFNdID0geworICAgIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzfTsKKworY29uc3QgU0NIQVIga2VybmVsc181X3RvXzY0W01BWF9IWUJSSURfQkFORFNdID0geworICAgIDAsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0fTsKKworY29uc3QgU0NIQVIga2VybmVsc183X3RvXzY0W01BWF9IWUJSSURfQkFORFNdID0geworICAgIDAsIDEsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisgICAgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2fTsKKworY29uc3QgU0NIQVIga2VybmVsc185X3RvXzY0W01BWF9IWUJSSURfQkFORFNdID0geworICAgIDAsIDEsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDYsIDYsIDYsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4fTsKKworY29uc3QgU0NIQVIga2VybmVsc18xMl90b182NFtNQVhfSFlCUklEX0JBTkRTXSA9IHsKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsICA5LAorICAgIDksICA5LCAgOSwgIDksICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMX07CisKK2NvbnN0IFNDSEFSIGtlcm5lbHNfMTVfdG9fNjRbTUFYX0hZQlJJRF9CQU5EU10gPSB7CisgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDksICAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0fTsKKworY29uc3QgU0NIQVIga2VybmVsc18yM190b182NFtNQVhfSFlCUklEX0JBTkRTXSA9IHsKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsIDExLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNSwKKyAgICAxNSwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwKKyAgICAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwKKyAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwKKyAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwKKyAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwKKyAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjJ9OworCitjb25zdCBVQ0hBUiBtYXBwaW5nXzE1X3RvXzIzW01BWF9QQVJBTUVURVJfQkFORFNfTERdID0geworICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICA5LCAxMCwKKyAgICAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTR9OworCitjb25zdCBVQ0hBUiBtYXBwaW5nXzEyX3RvXzIzW01BWF9QQVJBTUVURVJfQkFORFNfTERdID0geworICAgIDAsIDEsIDIsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDYsIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTF9OworCitjb25zdCBVQ0hBUiBtYXBwaW5nXzlfdG9fMjNbTUFYX1BBUkFNRVRFUl9CQU5EU19MRF0gPSB7CisgICAgMCwgMSwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNiwgNiwgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOH07CisKK2NvbnN0IFVDSEFSIG1hcHBpbmdfN190b18yM1tNQVhfUEFSQU1FVEVSX0JBTkRTX0xEXSA9IHsKKyAgICAwLCAxLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2fTsKKworY29uc3QgVUNIQVIgbWFwcGluZ181X3RvXzIzW01BWF9QQVJBTUVURVJfQkFORFNfTERdID0geworICAgIDAsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDR9OworCitjb25zdCBVQ0hBUiBtYXBwaW5nXzRfdG9fMjNbTUFYX1BBUkFNRVRFUl9CQU5EU19MRF0gPSB7CisgICAgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgM307CisKK2NvbnN0IEZJWFBfQ0ZHIGNsaXBHYWluVGFibGVfX0ZES1tdID0geworICAgIC8qQ0xJUF9QUk9URUNUX0dBSU5fMCgxLjAwMDAwMGYpKi8gRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKSwKKyAgICBDTElQX1BST1RFQ1RfR0FJTl8xKDEuMTg5MjA3ZiksCisgICAgQ0xJUF9QUk9URUNUX0dBSU5fMSgxLjQxNDIxM2YpLAorICAgIENMSVBfUFJPVEVDVF9HQUlOXzEoMS42ODE3OTJmKSwKKyAgICAvKkNMSVBfUFJPVEVDVF9HQUlOXzEoMi4wMDAwMDBmKSovIEZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCksCisgICAgQ0xJUF9QUk9URUNUX0dBSU5fMigyLjM3ODQxNGYpLAorICAgIENMSVBfUFJPVEVDVF9HQUlOXzIoMi44Mjg0MjdmKSwKKyAgICAvKkNMSVBfUFJPVEVDVF9HQUlOXzIoNC4wMDAwMDBmKSovIEZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCl9OworCitjb25zdCBVQ0hBUiBjbGlwR2FpblNGVGFibGVfX0ZES1tdID0gezAsIDEsIDEsIDEsIDEsIDIsIDIsIDJ9OworCitjb25zdCBVQ0hBUiBwYlN0cmlkZVRhYmxlW10gPSB7MSwgMiwgNSwgMjh9OworCitjb25zdCBpbnQgc21nVGltZVRhYmxlW10gPSB7NjQsIDEyOCwgMjU2LCA1MTJ9OworCisvKiB0YWJsZSBpcyBzY2FsZWQgYnkgZmFjdG9yIDAuNSAqLworY29uc3QgRklYUF9DRkcgZW52U2hhcGVEYXRhVGFibGVfX0ZES1s1XVsyXSA9IHsKKyAgICB7RkwyRlhDT05TVF9DRkcoMC4yNTAwMDAwMDAwMDAwMGYpLCBGTDJGWENPTlNUX0NGRygwLjI1MDAwMDAwMDAwMDAwZil9LAorICAgIHtGTDJGWENPTlNUX0NGRygwLjM1MzU1MzM5MDU5MzI3ZiksIEZMMkZYQ09OU1RfQ0ZHKDAuMzE0OTgwMjYyNDczNzJmKX0sCisgICAge0ZMMkZYQ09OU1RfQ0ZHKDAuNTAwMDAwMDAwMDAwMDBmKSwgRkwyRlhDT05TVF9DRkcoMC4zOTY4NTAyNjI5OTIwNWYpfSwKKyAgICB7RkwyRlhDT05TVF9DRkcoMC43MDcxMDY3ODExODY1NWYpLCBGTDJGWENPTlNUX0NGRygwLjUwMDAwMDAwMDAwMDAwZil9LAorICAgIHsvKkZMMkZYQ09OU1RfQ0ZHKCAxLjAwMDAwMDAwMDAwMDAwZikqLyBGWF9EQkwyRlhfQ0ZHKE1BWFZBTF9EQkwpLAorICAgICBGTDJGWENPTlNUX0NGRygwLjYyOTk2MDUyNDk0NzQ0Zil9fTsKKworLyogc2FjX2NhbGNNMWFuZE0yICovCitjb25zdCBTQ0hBUiByb3cyY2hhbm5lbFNUUFtdW01BWF9NMl9JTlBVVF0gPSB7ezAsIDF9LCB7MCwgM30sIHswLCAyfSwgIHswLCA0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgNH0sIHswLCAyfSwgey0xLCAyfSwgezAsIDF9fTsKKworY29uc3QgU0NIQVIgcm93MmNoYW5uZWxHRVNbXVtNQVhfTTJfSU5QVVRdID0ge3swLCAxfSwgezAsIDN9LCB7MCwgM30sICB7MCwgNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDV9LCB7MCwgMn0sIHstMSwgMn0sIHswLCAxfX07CisKK2NvbnN0IFNDSEFSIHJvdzJyZXNpZHVhbFtdW01BWF9NMl9JTlBVVF0gPSB7ey0xLCAwfSwgIHstMSwgMH0sICB7LTEsIC0xfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xLCAtMX0sIHstMSwgLTF9LCB7LTEsIC0xfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xLCAtMX0sIHstMSwgMH19OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogc2FjX2dldENMRFZhbHVlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOiBHZXQgQ0xEIHZhbHVlcyBmcm9tIHRhYmxlIGluZGV4LgorCisgQXJndW1lbnRzOgorICAgaW5kZXg6IFRhYmxlIGluZGV4CisgICAqY3UsICpjbCA6IFBvaW50ZXIgdG8gbG9jYXRpb25zIHdoZXJlIHJlc3VsdGluZyB2YWx1ZXMgd2lsbCBiZSB3cml0dGVuIHRvLgorCisgUmV0dXJuOiBub3RoaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFNwYXRpYWxEZXF1YW50R2V0Q0xEVmFsdWVzKGludCBpbmRleCwgRklYUF9EQkwqIGN1LCBGSVhQX0RCTCogY2wpIHsKKyAgKmN1ID0gRlhfQ0ZHMkZYX0RCTChkZXF1YW50Q0xEX2NfbFtpbmRleF0pOworICAqY2wgPSBGWF9DRkcyRlhfREJMKGRlcXVhbnRDTERfY19sWzMxIC0gMSAtIGluZGV4XSk7Cit9CisKK3ZvaWQgU3BhdGlhbERlcXVhbnRHZXRDTEQyVmFsdWVzKGludCBpZHgsIEZJWFBfREJMKiB4KSB7CisgICp4ID0gRlhfQ0ZHMkZYX0RCTChkZXF1YW50Q0xEX19GREtbaWR4XSk7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19yb20uaCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3JvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjZmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19yb20uaApAQCAtMCwwICsxLDIzMCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIHRhYmxlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ19ST01fSAorI2RlZmluZSBTQUNfUk9NX0gKKworI2luY2x1ZGUgIkZES19hcmNoZGVmLmgiCisjaW5jbHVkZSAic2FjX2RlY19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImh1ZmZfbm9kZXMuaCIKKyNpbmNsdWRlICJzYWNfYml0ZGVjLmgiCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisKKy8qIEdsb2JhbCBST00gdGFibGUgZGF0YSB0eXBlOiAqLworI2lmbmRlZiBBUkNIX1BSRUZFUl9NVUxUXzMyeDMyCisjZGVmaW5lIEZJWFBfQ0ZHIEZJWFBfU0dMCisjZGVmaW5lIEZYX0NGRzJGWF9EQkwgRlhfU0dMMkZYX0RCTAorI2RlZmluZSBGWF9DRkcyRlhfU0dMCisjZGVmaW5lIENGRyhhKSAoRlhfREJMMkZYQ09OU1RfU0dMKGEpKQorI2RlZmluZSBGTDJGWENPTlNUX0NGRyBGTDJGWENPTlNUX1NHTAorI2RlZmluZSBGWF9EQkwyRlhfQ0ZHKHgpIEZYX0RCTDJGWF9TR0woKEZJWFBfREJMKSh4KSkKKyNlbHNlCisjZGVmaW5lIEZJWFBfQ0ZHIEZJWFBfREJMCisjZGVmaW5lIEZYX0NGRzJGWF9EQkwKKyNkZWZpbmUgRlhfQ0ZHMkZYX1NHTCBGWF9EQkwyRlhfU0dMCisjZGVmaW5lIENGRyhhKSBGSVhQX0RCTChhKQorI2RlZmluZSBGTDJGWENPTlNUX0NGRyBGTDJGWENPTlNUX0RCTAorI2RlZmluZSBGWF9EQkwyRlhfQ0ZHKHgpICgoRklYUF9EQkwpKHgpKQorI2VuZGlmCisKKy8qIG90aGVycyAgKi8KKyNkZWZpbmUgU0NBTEVfSU5WX0lDQyAoMikKKyNkZWZpbmUgR19kZF9TQ0FMRSAoMikKKworI2RlZmluZSBRQ0NfU0NBTEUgMQorI2RlZmluZSBNMU0yX0RBVEEgRklYUF9EQkwKKyNpZm5kZWYgQVJDSF9QUkVGRVJfTVVMVF8zMngzMgorI2RlZmluZSBNMU0yX0NEQVRBIEZJWFBfU0dMCisjZGVmaW5lIE0xTTJfQ0RBVEEyRlhfREJMKGEpIEZYX1NHTDJGWF9EQkwoYSkKKyNkZWZpbmUgRlhfREJMMk0xTTJfQ0RBVEEoYSkgRlhfREJMMkZYX1NHTChhKQorI2Vsc2UKKyNkZWZpbmUgTTFNMl9DREFUQSBGSVhQX0RCTAorI2RlZmluZSBNMU0yX0NEQVRBMkZYX0RCTChhKSAoYSkKKyNkZWZpbmUgRlhfREJMMk0xTTJfQ0RBVEEoYSkgKGEpCisjZW5kaWYKKworI2RlZmluZSBDTElQX1BST1RFQ1RfR0FJTl8wKHgpIEZMMkZYQ09OU1RfQ0ZHKCgoeCkgLyAoZmxvYXQpKDEgPDwgMCkpKQorI2RlZmluZSBDTElQX1BST1RFQ1RfR0FJTl8xKHgpIEZMMkZYQ09OU1RfQ0ZHKCgoeCkgLyAoZmxvYXQpKDEgPDwgMSkpKQorI2RlZmluZSBDTElQX1BST1RFQ1RfR0FJTl8yKHgpIEZMMkZYQ09OU1RfQ0ZHKCgoeCkgLyAoZmxvYXQpKDEgPDwgMikpKQorCisjZGVmaW5lIFNGX0NMRF9DMUMyICg4KQorCitleHRlcm4gY29uc3QgRklYUF9DRkcgZGVxdWFudENQQ19fRkRLW107CitleHRlcm4gY29uc3QgRklYUF9DRkcgZGVxdWFudElDQ19fRkRLWzhdOworZXh0ZXJuIGNvbnN0IEZJWFBfQ0ZHIGRlcXVhbnRDTERfX0ZES1szMV07CisKKyNkZWZpbmUgSVBEX1NDQUxFICg1KQorI2RlZmluZSBQSV9fSVBEIChGTDJGWENPTlNUX0RCTCgzLjE0MTU5MjY1MzU4OTc5MzJmIC8gKGZsb2F0KSgxIDw8IElQRF9TQ0FMRSkpKQorLyogRGVmaW5lIGZvciBQSSoyIGZvciBiZXR0ZXIgcHJlY2lzaW9uIGluICBTcGF0aWFsRGVjQXBwbHlQaGFzZSgpICovCisjZGVmaW5lIFBJeDJfX0lQRCBcCisgIChGTDJGWENPTlNUX0RCTCgzLjE0MTU5MjY1MzU4OTc5MzJmIC8gKGZsb2F0KSgxIDw8IChJUERfU0NBTEUgLSAxKSkpKQorCitleHRlcm4gY29uc3QgRklYUF9DRkcgZGVxdWFudElQRF9fRkRLWzE2XTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfQ0ZHIEgxMV9uY1szMV1bOF07CitleHRlcm4gY29uc3QgRklYUF9DRkcgSDEyX25jWzMxXVs4XTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIGRlcXVhbnRDTERfYzFbMzFdOworCitleHRlcm4gY29uc3QgRklYUF9DRkcgQlBfX0ZES1tdOworZXh0ZXJuIGNvbnN0IEZJWFBfQ0ZHIEJQX0dGX19GREtbXTsKK2V4dGVybiBjb25zdCBTQ0hBUiByb3cyY2hhbm5lbFNUUFtdW01BWF9NMl9JTlBVVF07CisKKy8qIHNhY19iaXRkZWMgKi8KK2V4dGVybiBjb25zdCBJTlQgc2FtcGxpbmdGcmVxVGFibGVbMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIGZyZXFSZXNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IFVDSEFSIGZyZXFSZXNUYWJsZV9MRFtdOworZXh0ZXJuIGNvbnN0IFVDSEFSIHRlbXBTaGFwZUNoYW5UYWJsZVsyXVs4XTsKK2V4dGVybiBjb25zdCBUUkVFUFJPUEVSVElFUyB0cmVlUHJvcGVydHlUYWJsZVtdOworCitleHRlcm4gY29uc3QgU0NIQVIga2VybmVsc180X3RvXzcxW01BWF9IWUJSSURfQkFORFNdOworZXh0ZXJuIGNvbnN0IFNDSEFSIGtlcm5lbHNfNV90b183MVtNQVhfSFlCUklEX0JBTkRTXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBrZXJuZWxzXzdfdG9fNzFbTUFYX0hZQlJJRF9CQU5EU107CitleHRlcm4gY29uc3QgU0NIQVIga2VybmVsc18xMF90b183MVtNQVhfSFlCUklEX0JBTkRTXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBrZXJuZWxzXzE0X3RvXzcxW01BWF9IWUJSSURfQkFORFNdOworZXh0ZXJuIGNvbnN0IFNDSEFSIGtlcm5lbHNfMjBfdG9fNzFbTUFYX0hZQlJJRF9CQU5EU107CitleHRlcm4gY29uc3QgU0NIQVIga2VybmVsc18yOF90b183MVtNQVhfSFlCUklEX0JBTkRTXTsKKworZXh0ZXJuIGNvbnN0IFVDSEFSIG1hcHBpbmdfNF90b18yOFtNQVhfUEFSQU1FVEVSX0JBTkRTXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBtYXBwaW5nXzVfdG9fMjhbTUFYX1BBUkFNRVRFUl9CQU5EU107CitleHRlcm4gY29uc3QgVUNIQVIgbWFwcGluZ183X3RvXzI4W01BWF9QQVJBTUVURVJfQkFORFNdOworZXh0ZXJuIGNvbnN0IFVDSEFSIG1hcHBpbmdfMTBfdG9fMjhbTUFYX1BBUkFNRVRFUl9CQU5EU107CitleHRlcm4gY29uc3QgVUNIQVIgbWFwcGluZ18xNF90b18yOFtNQVhfUEFSQU1FVEVSX0JBTkRTXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBtYXBwaW5nXzIwX3RvXzI4W01BWF9QQVJBTUVURVJfQkFORFNdOworZXh0ZXJuIGNvbnN0IFNDSEFSIGtlcm5lbHNfNF90b182NFtNQVhfSFlCUklEX0JBTkRTXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBrZXJuZWxzXzVfdG9fNjRbTUFYX0hZQlJJRF9CQU5EU107CitleHRlcm4gY29uc3QgU0NIQVIga2VybmVsc183X3RvXzY0W01BWF9IWUJSSURfQkFORFNdOworZXh0ZXJuIGNvbnN0IFNDSEFSIGtlcm5lbHNfOV90b182NFtNQVhfSFlCUklEX0JBTkRTXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBrZXJuZWxzXzEyX3RvXzY0W01BWF9IWUJSSURfQkFORFNdOworZXh0ZXJuIGNvbnN0IFNDSEFSIGtlcm5lbHNfMTVfdG9fNjRbTUFYX0hZQlJJRF9CQU5EU107CitleHRlcm4gY29uc3QgU0NIQVIga2VybmVsc18yM190b182NFtNQVhfSFlCUklEX0JBTkRTXTsKKworZXh0ZXJuIGNvbnN0IFVDSEFSIG1hcHBpbmdfMTVfdG9fMjNbTUFYX1BBUkFNRVRFUl9CQU5EU19MRF07CitleHRlcm4gY29uc3QgVUNIQVIgbWFwcGluZ18xMl90b18yM1tNQVhfUEFSQU1FVEVSX0JBTkRTX0xEXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBtYXBwaW5nXzlfdG9fMjNbTUFYX1BBUkFNRVRFUl9CQU5EU19MRF07CitleHRlcm4gY29uc3QgVUNIQVIgbWFwcGluZ183X3RvXzIzW01BWF9QQVJBTUVURVJfQkFORFNfTERdOworZXh0ZXJuIGNvbnN0IFVDSEFSIG1hcHBpbmdfNV90b18yM1tNQVhfUEFSQU1FVEVSX0JBTkRTX0xEXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBtYXBwaW5nXzRfdG9fMjNbTUFYX1BBUkFNRVRFUl9CQU5EU19MRF07CisKK2V4dGVybiBjb25zdCBGSVhQX0NGRyBjbGlwR2FpblRhYmxlX19GREtbXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBjbGlwR2FpblNGVGFibGVfX0ZES1tdOworCitleHRlcm4gY29uc3QgVUNIQVIgcGJTdHJpZGVUYWJsZVtdOworZXh0ZXJuIGNvbnN0IGludCBzbWdUaW1lVGFibGVbXTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfQ0ZHIGVudlNoYXBlRGF0YVRhYmxlX19GREtbNV1bMl07CitleHRlcm4gY29uc3QgU0NIQVIgcm93MmNoYW5uZWxHRVNbXVtNQVhfTTJfSU5QVVRdOworCisvKiBzYWNfY2FsY00xYW5kTTIgKi8KK2V4dGVybiBjb25zdCBTQ0hBUiByb3cycmVzaWR1YWxbXVtNQVhfTTJfSU5QVVRdOworCit2b2lkIFNwYXRpYWxEZXF1YW50R2V0Q0xEVmFsdWVzKGludCBpbmRleCwgRklYUF9EQkwqIGN1LCBGSVhQX0RCTCogY2wpOworCit2b2lkIFNwYXRpYWxEZXF1YW50R2V0Q0xEMlZhbHVlcyhpbnQgaW5kZXgsIEZJWFBfREJMKiB4KTsKKworLyogRXh0ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGlubGluZSBpbnQgU2FjR2V0SHlicmlkU3ViYmFuZHMoaW50IHFtZlN1YmJhbmRzKSB7CisgIHJldHVybiBxbWZTdWJiYW5kcyAtIE1BWF9RTUZfQkFORFNfVE9fSFlCUklEICsgMTA7Cit9CisKKyNlbmRpZiAvKiBTQUNfUk9NX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX3Ntb290aGluZy5jcHAgYi9saWJTQUNkZWMvc3JjL3NhY19zbW9vdGhpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTY1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19zbW9vdGhpbmcuY3BwCkBAIC0wLDAgKzEsMjk1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IFNBQyBEZWMgcGFyYW1ldGVyIHNtb290aGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic2FjX2RlYy5oIgorI2luY2x1ZGUgInNhY19iaXRkZWMuaCIKKyNpbmNsdWRlICJzYWNfc21vb3RoaW5nLmgiCisjaW5jbHVkZSAic2FjX3JvbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogY2FsY0ZpbHRlckNvZWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBJbnB1dDoKKworIE91dHB1dDoKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEZJWFBfREJMIGNhbGNGaWx0ZXJDb2VmZl9fRkRLKHNwYXRpYWxEZWMgKnNlbGYsIGludCBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSkgeworICBpbnQgZFNsb3RzOworICBGSVhQX0RCTCBkZWx0YTsKKworICBkU2xvdHMgPSBmcmFtZS0+cGFyYW1TbG90W3BzXSAtIHNlbGYtPnNtb290aFN0YXRlLT5wcmV2UGFyYW1TbG90OworCisgIGlmIChkU2xvdHMgPD0gMCkgeworICAgIGRTbG90cyArPSBzZWxmLT50aW1lU2xvdHM7CisgIH0KKworICBkZWx0YSA9IGZEaXZOb3JtKGRTbG90cywgc2VsZi0+c21nVGltZVtwc10pOworCisgIHJldHVybiBkZWx0YTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IGdldFNtb290aE9uT2ZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBJbnB1dDoKKworIE91dHB1dDoKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBnZXRTbW9vdGhPbk9mZihzcGF0aWFsRGVjICpzZWxmLCBpbnQgcHMsIGludCBwYikgeworICBpbnQgc21vb3RoQmFuZCA9IDA7CisKKyAgc21vb3RoQmFuZCA9IHNlbGYtPnNtZ0RhdGFbcHNdW3BiXTsKKworICByZXR1cm4gc21vb3RoQmFuZDsKK30KKwordm9pZCBTcGF0aWFsRGVjU21vb3RoTTFhbmRNMihzcGF0aWFsRGVjICpzZWxmLCBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBzKSB7CisgIEZJWFBfREJMIGRlbHRhX19GREs7CisgIEZJWFBfREJMIG9uZV9taW51c19kZWx0YV9fRkRLOworCisgIGludCBwYiwgcm93LCBjb2w7CisgIGludCByZXNpZHVhbEJhbmRzID0gMDsKKworICBpZiAoc2VsZi0+cmVzaWR1YWxDb2RpbmcpIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgYm94ZXMgPSBzZWxmLT5udW1PdHRCb3hlczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYm94ZXM7IGkrKykgeworICAgICAgaWYgKHNlbGYtPnJlc2lkdWFsQmFuZHNbaV0gPiByZXNpZHVhbEJhbmRzKSB7CisgICAgICAgIHJlc2lkdWFsQmFuZHMgPSBzZWxmLT5yZXNpZHVhbEJhbmRzW2ldOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGRlbHRhX19GREsgPSBjYWxjRmlsdGVyQ29lZmZfX0ZESyhzZWxmLCBwcywgZnJhbWUpOworICBpZiAoZGVsdGFfX0ZESyA9PSAvKkZMMkZYQ09OU1RfREJMKDEuMGYpKi8gKEZJWFBfREJMKU1BWFZBTF9EQkwpCisgICAgb25lX21pbnVzX2RlbHRhX19GREsgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgZWxzZSBpZiAoZGVsdGFfX0ZESyA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICBvbmVfbWludXNfZGVsdGFfX0ZESyA9IC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLyAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgZWxzZQorICAgIG9uZV9taW51c19kZWx0YV9fRkRLID0gKEZMMkZYQ09OU1RfREJMKDAuNWYpIC0gKGRlbHRhX19GREsgPj4gMSkpIDw8IDE7CisKKyAgZm9yIChwYiA9IDA7IHBiIDwgc2VsZi0+bnVtUGFyYW1ldGVyQmFuZHM7IHBiKyspIHsKKyAgICBpbnQgc21vb3RoQmFuZDsKKworICAgIHNtb290aEJhbmQgPSBnZXRTbW9vdGhPbk9mZihzZWxmLCBwcywgcGIpOworCisgICAgaWYgKHNtb290aEJhbmQgJiYgKHBiID49IHJlc2lkdWFsQmFuZHMpKSB7CisgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IHNlbGYtPm51bU0ycm93czsgcm93KyspIHsKKyAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBzZWxmLT5udW1WQ2hhbm5lbHM7IGNvbCsrKSB7CisgICAgICAgICAgc2VsZi0+TTJSZWFsX19GREtbcm93XVtjb2xdW3BiXSA9CisgICAgICAgICAgICAgICgoZk11bHREaXYyKGRlbHRhX19GREssIHNlbGYtPk0yUmVhbF9fRkRLW3Jvd11bY29sXVtwYl0pICsKKyAgICAgICAgICAgICAgICBmTXVsdERpdjIob25lX21pbnVzX2RlbHRhX19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPk0yUmVhbFByZXZfX0ZES1tyb3ddW2NvbF1bcGJdKSkKKyAgICAgICAgICAgICAgIDw8IDEpOworICAgICAgICAgIGlmICgwIHx8IChzZWxmLT5waGFzZUNvZGluZyA9PSAzKSkgeworICAgICAgICAgICAgc2VsZi0+TTJJbWFnX19GREtbcm93XVtjb2xdW3BiXSA9CisgICAgICAgICAgICAgICAgKChmTXVsdERpdjIoZGVsdGFfX0ZESywgc2VsZi0+TTJJbWFnX19GREtbcm93XVtjb2xdW3BiXSkgKworICAgICAgICAgICAgICAgICAgZk11bHREaXYyKG9uZV9taW51c19kZWx0YV9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPk0ySW1hZ1ByZXZfX0ZES1tyb3ddW2NvbF1bcGJdKSkKKyAgICAgICAgICAgICAgICAgPDwgMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHNlbGYtPnNtb290aFN0YXRlLT5wcmV2UGFyYW1TbG90ID0gZnJhbWUtPnBhcmFtU2xvdFtwc107Cit9CisKKy8qIGluaXQgc3RhdGVzICovCit2b2lkIGluaXRQYXJhbWV0ZXJTbW9vdGhpbmcoc3BhdGlhbERlYyAqc2VsZikgeworICBzZWxmLT5zbW9vdGhTdGF0ZS0+cHJldlBhcmFtU2xvdCA9IDA7Cit9CisKK3ZvaWQgU3BhdGlhbERlY1Ntb290aE9QRChzcGF0aWFsRGVjICpzZWxmLCBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHMpIHsKKyAgaW50IHBiOworICBpbnQgZFNsb3RzOworICBGSVhQX0RCTCBkZWx0YV9fRkRLOworICBGSVhQX0RCTCBvbmVfbWludXNfZGVsdGFfX0ZESzsKKyAgRklYUF9EQkwgKnBoYXNlTGVmdFNtb290aF9fRkRLID0gc2VsZi0+c21vb3RoU3RhdGUtPm9wZExlZnRTdGF0ZV9fRkRLOworICBGSVhQX0RCTCAqcGhhc2VSaWdodFNtb290aF9fRkRLID0gc2VsZi0+c21vb3RoU3RhdGUtPm9wZFJpZ2h0U3RhdGVfX0ZESzsKKyAgaW50IHF1YW50Q29hcnNlOworCisgIHF1YW50Q29hcnNlID0gZnJhbWUtPklQRExvc3NsZXNzRGF0YVswXS5ic1F1YW50Q29hcnNlWFhYW3BzXTsKKworICBpZiAoZnJhbWUtPk9wZFNtb290aGluZ01vZGUgPT0gMCkgeworICAgIEZES21lbWNweShwaGFzZUxlZnRTbW9vdGhfX0ZESywgc2VsZi0+UGhhc2VMZWZ0X19GREssCisgICAgICAgICAgICAgIHNlbGYtPm51bVBhcmFtZXRlckJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY3B5KHBoYXNlUmlnaHRTbW9vdGhfX0ZESywgc2VsZi0+UGhhc2VSaWdodF9fRkRLLAorICAgICAgICAgICAgICBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICB9IGVsc2UgeworICAgIGlmIChwcyA9PSAwKSB7CisgICAgICBkU2xvdHMgPSBmcmFtZS0+cGFyYW1TbG90W3BzXSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGRTbG90cyA9IGZyYW1lLT5wYXJhbVNsb3RbcHNdIC0gZnJhbWUtPnBhcmFtU2xvdFtwcyAtIDFdOworICAgIH0KKworICAgIGRlbHRhX19GREsgPSAoRklYUF9EQkwpKChJTlQpKEZMMkZYQ09OU1RfREJMKDAuMDA3ODEyNWYpKSAqIGRTbG90cyk7CisKKyAgICBpZiAoZGVsdGFfX0ZESyA9PSAoRklYUF9EQkwpTUFYVkFMX0RCTCAvKkZMMkZYQ09OU1RfREJMKDEuMGYpKi8pCisgICAgICBvbmVfbWludXNfZGVsdGFfX0ZESyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIGVsc2UgaWYgKGRlbHRhX19GREsgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpCisgICAgICBvbmVfbWludXNfZGVsdGFfX0ZESyA9IChGSVhQX0RCTClNQVhWQUxfREJMIC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLzsKKyAgICBlbHNlCisgICAgICBvbmVfbWludXNfZGVsdGFfX0ZESyA9IChGTDJGWENPTlNUX0RCTCgwLjVmKSAtIChkZWx0YV9fRkRLID4+IDEpKSA8PCAxOworCisgICAgZm9yIChwYiA9IDA7IHBiIDwgc2VsZi0+bnVtUGFyYW1ldGVyQmFuZHM7IHBiKyspIHsKKyAgICAgIEZJWFBfREJMIHRtcEwsIHRtcFIsIHRtcDsKKworICAgICAgdG1wTCA9IHNlbGYtPlBoYXNlTGVmdF9fRkRLW3BiXTsKKyAgICAgIHRtcFIgPSBzZWxmLT5QaGFzZVJpZ2h0X19GREtbcGJdOworCisgICAgICB3aGlsZSAodG1wTCA+IHBoYXNlTGVmdFNtb290aF9fRkRLW3BiXSArIFBJX19JUEQpIHRtcEwgLT0gUElfX0lQRCA8PCAxOworICAgICAgd2hpbGUgKHRtcEwgPCBwaGFzZUxlZnRTbW9vdGhfX0ZES1twYl0gLSBQSV9fSVBEKSB0bXBMICs9IFBJX19JUEQgPDwgMTsKKyAgICAgIHdoaWxlICh0bXBSID4gcGhhc2VSaWdodFNtb290aF9fRkRLW3BiXSArIFBJX19JUEQpIHRtcFIgLT0gUElfX0lQRCA8PCAxOworICAgICAgd2hpbGUgKHRtcFIgPCBwaGFzZVJpZ2h0U21vb3RoX19GREtbcGJdIC0gUElfX0lQRCkgdG1wUiArPSBQSV9fSVBEIDw8IDE7CisKKyAgICAgIHBoYXNlTGVmdFNtb290aF9fRkRLW3BiXSA9CisgICAgICAgICAgZk11bHQoZGVsdGFfX0ZESywgdG1wTCkgKworICAgICAgICAgIGZNdWx0KG9uZV9taW51c19kZWx0YV9fRkRLLCBwaGFzZUxlZnRTbW9vdGhfX0ZES1twYl0pOworICAgICAgcGhhc2VSaWdodFNtb290aF9fRkRLW3BiXSA9CisgICAgICAgICAgZk11bHQoZGVsdGFfX0ZESywgdG1wUikgKworICAgICAgICAgIGZNdWx0KG9uZV9taW51c19kZWx0YV9fRkRLLCBwaGFzZVJpZ2h0U21vb3RoX19GREtbcGJdKTsKKworICAgICAgdG1wID0gKCgodG1wTCA+PiAxKSAtICh0bXBSID4+IDEpKSAtICgocGhhc2VMZWZ0U21vb3RoX19GREtbcGJdID4+IDEpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBoYXNlUmlnaHRTbW9vdGhfX0ZES1twYl0gPj4gMSkpKQorICAgICAgICAgICAgPDwgMTsKKyAgICAgIHdoaWxlICh0bXAgPiBQSV9fSVBEKSB0bXAgLT0gUElfX0lQRCA8PCAxOworICAgICAgd2hpbGUgKHRtcCA8IC1QSV9fSVBEKSB0bXAgKz0gUElfX0lQRCA8PCAxOworICAgICAgaWYgKGZpeHBfYWJzKHRtcCkgPiBmTXVsdCgocXVhbnRDb2Fyc2UgPyBGTDJGWENPTlNUX0RCTCg1MC5mIC8gMTgwLmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZMMkZYQ09OU1RfREJMKDI1LmYgLyAxODAuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSV9fSVBEKSkgeworICAgICAgICBwaGFzZUxlZnRTbW9vdGhfX0ZES1twYl0gPSB0bXBMOworICAgICAgICBwaGFzZVJpZ2h0U21vb3RoX19GREtbcGJdID0gdG1wUjsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKHBoYXNlTGVmdFNtb290aF9fRkRLW3BiXSA+IFBJX19JUEQgPDwgMSkKKyAgICAgICAgcGhhc2VMZWZ0U21vb3RoX19GREtbcGJdIC09IFBJX19JUEQgPDwgMTsKKyAgICAgIHdoaWxlIChwaGFzZUxlZnRTbW9vdGhfX0ZES1twYl0gPCAoRklYUF9EQkwpMCkKKyAgICAgICAgcGhhc2VMZWZ0U21vb3RoX19GREtbcGJdICs9IFBJX19JUEQgPDwgMTsKKyAgICAgIHdoaWxlIChwaGFzZVJpZ2h0U21vb3RoX19GREtbcGJdID4gUElfX0lQRCA8PCAxKQorICAgICAgICBwaGFzZVJpZ2h0U21vb3RoX19GREtbcGJdIC09IFBJX19JUEQgPDwgMTsKKyAgICAgIHdoaWxlIChwaGFzZVJpZ2h0U21vb3RoX19GREtbcGJdIDwgKEZJWFBfREJMKTApCisgICAgICAgIHBoYXNlUmlnaHRTbW9vdGhfX0ZES1twYl0gKz0gUElfX0lQRCA8PCAxOworCisgICAgICBzZWxmLT5QaGFzZUxlZnRfX0ZES1twYl0gPSBwaGFzZUxlZnRTbW9vdGhfX0ZES1twYl07CisgICAgICBzZWxmLT5QaGFzZVJpZ2h0X19GREtbcGJdID0gcGhhc2VSaWdodFNtb290aF9fRkRLW3BiXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfc21vb3RoaW5nLmggYi9saWJTQUNkZWMvc3JjL3NhY19zbW9vdGhpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGYzZjViCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfc21vb3RoaW5nLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlYyBwYXJhbWV0ZXIgc21vb3RoaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDX1NNT09USElOR19ICisjZGVmaW5lIFNBQ19TTU9PVEhJTkdfSAorCisjaW5jbHVkZSAic2FjX2RlYy5oIgorCit2b2lkIGluaXRQYXJhbWV0ZXJTbW9vdGhpbmcoc3BhdGlhbERlYyAqc2VsZik7Cit2b2lkIFNwYXRpYWxEZWNTbW9vdGhNMWFuZE0yKHNwYXRpYWxEZWMgKnNlbGYsIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHMpOwordm9pZCBTcGF0aWFsRGVjU21vb3RoT1BEKHNwYXRpYWxEZWMgKnNlbGYsIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfc3RwLmNwcCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3N0cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4ZTlkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9zcmMvc2FjX3N0cC5jcHAKQEAgLTAsMCArMSw1NDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlYyBzdWJiYW5kIHByb2Nlc3NpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNhY19zdHAuaCIKKyNpbmNsdWRlICJzYWNfY2FsY00xYW5kTTIuaCIKKyNpbmNsdWRlICJzYWNfYml0ZGVjLmgiCisjaW5jbHVkZSAiRkRLX21hdHJpeENhbGxvYy5oIgorI2luY2x1ZGUgInNhY19yb20uaCIKKworI2RlZmluZSBCUF9HRl9TVEFSVCA2CisjZGVmaW5lIEJQX0dGX1NJWkUgMjUKKyNkZWZpbmUgSFBfU0laRSA5CisjZGVmaW5lIFNUUF9VUERBVEVfRU5FUkdZX1JBVEUgMzIKKworI2RlZmluZSBTRl9XRVQgNQorI2RlZmluZSBTRl9EUlkgXAorICAzIC8qIFNGX0RSWSA9PSAyIHdvdWxkIHByb2R1Y2UgZ29vZCBjb25mb3JtYW5jZSB0ZXN0IHJlc3VsdHMgYXMgd2VsbCAqLworI2RlZmluZSBTRl9QUk9EVUNUX0JQX0dGIDEzCisjZGVmaW5lIFNGX1BST0RVQ1RfQlBfR0ZfR0YgMjYKKyNkZWZpbmUgU0ZfU0NBTEUgMgorCisjZGVmaW5lIFNGX1NDQUxFX0xENjQgRkwyRlhDT05TVF9EQkwoMC4wMzEyNSkgICAgICAvKiBMRDY0KCgxPDxTRl9TQ0FMRSkpKi8KKyNkZWZpbmUgU1RQX0xQRl9DT0VGRjFfX0ZESyBGTDJGWENPTlNUX0RCTCgwLjk1MGYpIC8qIDAuOTUgKi8KKyNkZWZpbmUgT05FX01JTlVTX1NUUF9MUEZfQ09FRkYxX19GREsgRkwyRlhDT05TVF9EQkwoMC4wNWYpIC8qIDEuMCAtIDAuOTUgKi8KKyNkZWZpbmUgU1RQX0xQRl9DT0VGRjJfX0ZESyBGTDJGWENPTlNUX0RCTCgwLjQ1MGYpICAgICAgICAgIC8qIDAuNDUgKi8KKyNkZWZpbmUgT05FX01JTlVTX1NUUF9MUEZfQ09FRkYyX19GREsgXAorICBGTDJGWENPTlNUX0RCTCgxLjBmIC0gMC40NTBmKSAvKiAxLjAgLSAwLjQ1ICovCisjZGVmaW5lIFNUUF9TQ0FMRV9MSU1JVF9fRkRLIFwKKyAgRkwyRlhDT05TVF9EQkwoMi44MmYgLyAoZmxvYXQpKDEgPDwgU0ZfU0NBTEUpKSAvKiBzY2FsZWQgYnkgU0ZfU0NBTEUgKi8KKyNkZWZpbmUgT05FX0RJVl9TVFBfU0NBTEVfTElNSVRfX0ZESyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkwyRlhDT05TVF9EQkwoMS4wZiAvIDIuODJmIC8gKGZsb2F0KSgxIDw8IFNGX1NDQUxFKSkgLyogc2NhbGVkIGJ5IFNGX1NDQUxFIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFCU19USFJfX0ZESyAgICAgICBcCisgIEZMMkZYQ09OU1RfREJMKEFCU19USFIgLyBcCisgICAgICAgICAgICAgICAgICgoZmxvYXQpKDEgPDwgKDIyICsgMjIgLSAyNikpKSkgLyogc2NhbGVkIGJ5IDE4IGJpdHMgKi8KKyNkZWZpbmUgQUJTX1RIUjJfX0ZESyAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMMkZYQ09OU1RfREJMKEFCU19USFIgKiAzMi4wZiAqIDMyLjBmIC8gXAorICAgICAgICAgICAgICAgICAoKGZsb2F0KSgxIDw8ICgyMiArIDIyIC0gMjYpKSkpIC8qIHNjYWxlZCBieSAxMCBiaXRzICovCisjZGVmaW5lIFNUUF9TQ0FMRV9MSU1JVF9ISSBcCisgIEZMMkZYQ09OU1RfREJMKDMuMDIyMjIyMjIyMjIgLyAoMSA8PCBTRl9TQ0FMRSkpIC8qIHNlZSA0LiBiZWxvdyAqLworI2RlZmluZSBTVFBfU0NBTEVfTElNSVRfTE8gXAorICBGTDJGWENPTlNUX0RCTCgwLjI4Mjg5OTkyMTE5IC8gKDEgPDwgU0ZfU0NBTEUpKSAvKiBzZWUgNC4gYmVsb3cgKi8KKyNkZWZpbmUgU1RQX1NDQUxFX0xJTUlUX0hJX0xENjQgICAgICAgICAgICAgICAgIFwKKyAgRkwyRlhDT05TVF9EQkwoMC4wNDk4NjI4MDQ1MikgLyogc2VlIDQuIGJlbG93IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNUUF9TQ0FMRV9MSU1JVF9MT19MRDY0ICAgICAgICAgICAgICAgICBcCisgIEZMMkZYQ09OU1RfREJMKDAuMDU2OTI2MTM1MDApIC8qIHNlZSA0LiBiZWxvdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiAgU2NhbGUgZmFjdG9yIGNhbGN1bGF0aW9uIGZvciB0aGUgZGlmZnVzZSBzaWduYWwgbmVlZHMgYWRhcHRlZCB0aHJlc2hvbGRzCisgICAgZm9yIFNUUF9TQ0FMRV9MSU1JVCBhbmQgMS9TVFBfU0NBTEVfTElNSVQ6CisKKyAgICAxLiBzY2FsZSA9IHNxcnQoRHJ5TnJnL1dldE5yZykKKworICAgIDIuIERhbXBpbmcgb2Ygc2NhbGUgZmFjdG9yCisgICAgICAgc2NhbGUyID0gMC4xICsgMC45ICogc2NhbGUKKworICAgIDMuIExpbWl0aW5nIG9mIHNjYWxlIGZhY3RvcgorICAgICAgICAgIFNUUF9TQ0FMRV9MSU1JVCAgICAgICAgICAgPj0gICAgICAgIHNjYWxlMiAgICAgICAgPj0gMS9TVFBfU0NBTEVfTElNSVQKKyAgICAgICA9PiBTVFBfU0NBTEVfTElNSVQgICAgICAgICAgID49ICAoMC4xICsgMC45ICogc2NhbGUpID49IDEvU1RQX1NDQUxFX0xJTUlUCisgICAgICAgPT4gKFNUUF9TQ0FMRV9MSU1JVC0wLjEpLzAuOSA+PSAgICAgICAgc2NhbGUgICAgICAgICA+PQorICAgKDEvU1RQX1NDQUxFX0xJTUlULTAuMSkvMC45CisKKyAgICAzLiBMaW1pdGluZyBvZiBzY2FsZSBmYWN0b3IgYmVmb3JlIHNxcnQgY2FsY3VsYXRpb24KKyAgICAgICAoKFNUUF9TQ0FMRV9MSU1JVC0wLjEpLzAuOSleMiA+PSAoc2NhbGVeMikgPj0KKyAgICgoMS9TVFBfU0NBTEVfTElNSVQtMC4xKS8wLjkpXjIgKFNUUF9TQ0FMRV9MSU1JVF9ISSleMiAgICAgICAgPj0gKHNjYWxlXjIpID49CisgICAoU1RQX1NDQUxFX0xJTUlUX0xPKV4yCisKKyAgICA0LiBUaHJlc2hvbGRzIGZvciBsaW1pdGluZyBvZiBzY2FsZSBmYWN0b3IKKyAgICAgICBTVFBfU0NBTEVfTElNSVRfSEkgICAgICA9ICgoMi44Mi0wLjEpLzAuOSkKKyAgICAgICBTVFBfU0NBTEVfTElNSVRfTE8gICAgICA9ICgoKDEuMC8yLjgyKS0wLjEpLzAuOSkKKyAgICAgICBTVFBfU0NBTEVfTElNSVRfSElfTEQ2NCA9IExENjQoU1RQX1NDQUxFX0xJTUlUX0hJKlNUUF9TQ0FMRV9MSU1JVF9ISSkKKyAgICAgICBTVFBfU0NBTEVfTElNSVRfTE9fTEQ2NCA9IExENjQoU1RQX1NDQUxFX0xJTUlUX0xPKlNUUF9TQ0FMRV9MSU1JVF9MTykKKyovCisKKyNkZWZpbmUgRFJZX0VORVJfV0VJR0hUKERyeUVuZXIpIERyeUVuZXIgPSBEcnlFbmVyID4+IGRyeV9zY2FsZV9kbXgKKworI2RlZmluZSBXRVRfRU5FUl9XRUlHSFQoV2V0RW5lcikgV2V0RW5lciA9IFdldEVuZXIgPDwgd2V0X3NjYWxlX2RteAorCisjZGVmaW5lIERSWV9FTkVSX1NVTV9SRUFMKERyeUVuZXIsIGRteFJlYWwsIG4pIFwKKyAgRHJ5RW5lciArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZk11bHREaXYyKGZQb3cyRGl2MihkbXhSZWFsIDw8IFNGX0RSWSksIHBCUFtuXSkgPj4gKCgyICogU0ZfRFJZKSAtIDIpCisKKyNkZWZpbmUgRFJZX0VORVJfU1VNX0NQTFgoRHJ5RW5lciwgZG14UmVhbCwgZG14SW1hZywgbikgXAorICBEcnlFbmVyICs9IGZNdWx0RGl2MiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmUG93MkRpdjIoZG14UmVhbCA8PCBTRl9EUlkpICsgZlBvdzJEaXYyKGRteEltYWcgPDwgU0ZfRFJZKSwgcEJQW25dKQorCisjZGVmaW5lIENBTENfV0VUX1NDQUxFKGRyeUlkeCwgd2V0SWR4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKERyeUVuZXJMRDY0W2RyeUlkeF0gLSBTVFBfU0NBTEVfTElNSVRfSElfTEQ2NCkgPiBXZXRFbmVyTEQ2NFt3ZXRJZHhdKSB7IFwKKyAgICBzY2FsZVt3ZXRJZHhdID0gU1RQX1NDQUxFX0xJTUlUX0hJOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSBpZiAoRHJ5RW5lckxENjRbZHJ5SWR4XSA8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIChXZXRFbmVyTEQ2NFt3ZXRJZHhdIC0gU1RQX1NDQUxFX0xJTUlUX0xPX0xENjQpKSB7ICAgICAgICAgICAgICAgIFwKKyAgICBzY2FsZVt3ZXRJZHhdID0gU1RQX1NDQUxFX0xJTUlUX0xPOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcCA9ICgoRHJ5RW5lckxENjRbZHJ5SWR4XSAtIFdldEVuZXJMRDY0W3dldElkeF0pID4+IDEpIC0gU0ZfU0NBTEVfTEQ2NDsgIFwKKyAgICBzY2FsZVt3ZXRJZHhdID0gQ2FsY0ludkxkRGF0YSh0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworc3RydWN0IFNUUF9ERUMgeworICBGSVhQX0RCTCBydW5EcnlFbmVyW01BWF9JTlBVVF9DSEFOTkVMU107CisgIEZJWFBfREJMIHJ1bldldEVuZXJbTUFYX09VVFBVVF9DSEFOTkVMU107CisgIEZJWFBfREJMIG9sZERyeUVuZXJMRDY0W01BWF9JTlBVVF9DSEFOTkVMU107CisgIEZJWFBfREJMIG9sZFdldEVuZXJMRDY0W01BWF9PVVRQVVRfQ0hBTk5FTFNdOworICBGSVhQX0RCTCBwcmV2X3RwX3NjYWxlW01BWF9PVVRQVVRfQ0hBTk5FTFNdOworICBjb25zdCBGSVhQX0NGRyAqQlA7CisgIGNvbnN0IEZJWFBfQ0ZHICpCUF9HRjsKKyAgaW50IHVwZGF0ZV9vbGRfZW5lcjsKK307CisKK2lubGluZSB2b2lkIGNvbWJpbmVTaWduYWxSZWFsKEZJWFBfREJMICpoeWJPdXRwdXRSZWFsRHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmh5Yk91dHB1dFJlYWxXZXQsIGludCBiYW5kcykgeworICBpbnQgbjsKKworICBmb3IgKG4gPSBiYW5kcyAtIDE7IG4gPj0gMDsgbi0tKSB7CisgICAgKmh5Yk91dHB1dFJlYWxEcnkgPSAqaHliT3V0cHV0UmVhbERyeSArICpoeWJPdXRwdXRSZWFsV2V0OworICAgIGh5Yk91dHB1dFJlYWxEcnkrKywgaHliT3V0cHV0UmVhbFdldCsrOworICB9Cit9CisKK2lubGluZSB2b2lkIGNvbWJpbmVTaWduYWxSZWFsU2NhbGUxKEZJWFBfREJMICpoeWJPdXRwdXRSZWFsRHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmh5Yk91dHB1dFJlYWxXZXQsIEZJWFBfREJMIHNjYWxlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYW5kcykgeworICBpbnQgbjsKKworICBmb3IgKG4gPSBiYW5kcyAtIDE7IG4gPj0gMDsgbi0tKSB7CisgICAgKmh5Yk91dHB1dFJlYWxEcnkgPQorICAgICAgICAqaHliT3V0cHV0UmVhbERyeSArCisgICAgICAgIChmTXVsdERpdjIoKmh5Yk91dHB1dFJlYWxXZXQsIHNjYWxlWCkgPDwgKFNGX1NDQUxFICsgMSkpOworICAgIGh5Yk91dHB1dFJlYWxEcnkrKywgaHliT3V0cHV0UmVhbFdldCsrOworICB9Cit9CisKK2lubGluZSB2b2lkIGNvbWJpbmVTaWduYWxDcGx4KEZJWFBfREJMICpoeWJPdXRwdXRSZWFsRHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmh5Yk91dHB1dEltYWdEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaHliT3V0cHV0UmVhbFdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpoeWJPdXRwdXRJbWFnV2V0LCBpbnQgYmFuZHMpIHsKKyAgaW50IG47CisKKyAgZm9yIChuID0gYmFuZHMgLSAxOyBuID49IDA7IG4tLSkgeworICAgICpoeWJPdXRwdXRSZWFsRHJ5ID0gKmh5Yk91dHB1dFJlYWxEcnkgKyAqaHliT3V0cHV0UmVhbFdldDsKKyAgICAqaHliT3V0cHV0SW1hZ0RyeSA9ICpoeWJPdXRwdXRJbWFnRHJ5ICsgKmh5Yk91dHB1dEltYWdXZXQ7CisgICAgaHliT3V0cHV0UmVhbERyeSsrLCBoeWJPdXRwdXRSZWFsV2V0Kys7CisgICAgaHliT3V0cHV0SW1hZ0RyeSsrLCBoeWJPdXRwdXRJbWFnV2V0Kys7CisgIH0KK30KKworaW5saW5lIHZvaWQgY29tYmluZVNpZ25hbENwbHhTY2FsZTEoRklYUF9EQkwgKmh5Yk91dHB1dFJlYWxEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaHliT3V0cHV0SW1hZ0RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpoeWJPdXRwdXRSZWFsV2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmh5Yk91dHB1dEltYWdXZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0NGRyAqcEJQLCBGSVhQX0RCTCBzY2FsZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFuZHMpIHsKKyAgaW50IG47CisgIEZJWFBfREJMIHNjYWxlWTsKKyAgZm9yIChuID0gYmFuZHMgLSAxOyBuID49IDA7IG4tLSkgeworICAgIHNjYWxlWSA9IGZNdWx0RGl2MihzY2FsZVgsICpwQlApOworICAgICpoeWJPdXRwdXRSZWFsRHJ5ID0KKyAgICAgICAgKmh5Yk91dHB1dFJlYWxEcnkgKworICAgICAgICAoZk11bHREaXYyKCpoeWJPdXRwdXRSZWFsV2V0LCBzY2FsZVkpIDw8IChTRl9TQ0FMRSArIDIpKTsKKyAgICAqaHliT3V0cHV0SW1hZ0RyeSA9CisgICAgICAgICpoeWJPdXRwdXRJbWFnRHJ5ICsKKyAgICAgICAgKGZNdWx0RGl2MigqaHliT3V0cHV0SW1hZ1dldCwgc2NhbGVZKSA8PCAoU0ZfU0NBTEUgKyAyKSk7CisgICAgaHliT3V0cHV0UmVhbERyeSsrLCBoeWJPdXRwdXRSZWFsV2V0Kys7CisgICAgaHliT3V0cHV0SW1hZ0RyeSsrLCBoeWJPdXRwdXRJbWFnV2V0Kys7CisgICAgcEJQKys7CisgIH0KK30KKworaW5saW5lIHZvaWQgY29tYmluZVNpZ25hbENwbHhTY2FsZTIoRklYUF9EQkwgKmh5Yk91dHB1dFJlYWxEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaHliT3V0cHV0SW1hZ0RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpoeWJPdXRwdXRSZWFsV2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmh5Yk91dHB1dEltYWdXZXQsIEZJWFBfREJMIHNjYWxlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYW5kcykgeworICBpbnQgbjsKKworICBmb3IgKG4gPSBiYW5kcyAtIDE7IG4gPj0gMDsgbi0tKSB7CisgICAgKmh5Yk91dHB1dFJlYWxEcnkgPQorICAgICAgICAqaHliT3V0cHV0UmVhbERyeSArCisgICAgICAgIChmTXVsdERpdjIoKmh5Yk91dHB1dFJlYWxXZXQsIHNjYWxlWCkgPDwgKFNGX1NDQUxFICsgMSkpOworICAgICpoeWJPdXRwdXRJbWFnRHJ5ID0KKyAgICAgICAgKmh5Yk91dHB1dEltYWdEcnkgKworICAgICAgICAoZk11bHREaXYyKCpoeWJPdXRwdXRJbWFnV2V0LCBzY2FsZVgpIDw8IChTRl9TQ0FMRSArIDEpKTsKKyAgICBoeWJPdXRwdXRSZWFsRHJ5KyssIGh5Yk91dHB1dFJlYWxXZXQrKzsKKyAgICBoeWJPdXRwdXRJbWFnRHJ5KyssIGh5Yk91dHB1dEltYWdXZXQrKzsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogc3ViYmFuZFRQQ3JlYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU0FDREVDX0VSUk9SIHN1YmJhbmRUUENyZWF0ZShIQU5ETEVfU1RQX0RFQyAqaFN0cERlYykgeworICBIQU5ETEVfU1RQX0RFQyBzZWxmID0gTlVMTDsKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLCAxLCBzdHJ1Y3QgU1RQX0RFQykKKyAgaWYgKGhTdHBEZWMgIT0gTlVMTCkgeworICAgICpoU3RwRGVjID0gc2VsZjsKKyAgfQorCisgIHJldHVybiBNUFNfT0s7CitiYWlsOgorICByZXR1cm4gTVBTX09VVE9GTUVNT1JZOworfQorCitTQUNERUNfRVJST1Igc3ViYmFuZFRQSW5pdChIQU5ETEVfU1RQX0RFQyBzZWxmKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIGludCBjaDsKKworICBmb3IgKGNoID0gMDsgY2ggPCBNQVhfT1VUUFVUX0NIQU5ORUxTOyBjaCsrKSB7CisgICAgc2VsZi0+cHJldl90cF9zY2FsZVtjaF0gPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKDEgPDwgU0ZfU0NBTEUpKTsKKyAgICBzZWxmLT5vbGRXZXRFbmVyTEQ2NFtjaF0gPQorICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjM0Mzc1Zik7IC8qIDMyNzY4LjAqMzI3NjguMC8yXig0NC0yNi0xMCkgKi8KKyAgfQorICBmb3IgKGNoID0gMDsgY2ggPCBNQVhfSU5QVVRfQ0hBTk5FTFM7IGNoKyspIHsKKyAgICBzZWxmLT5vbGREcnlFbmVyTEQ2NFtjaF0gPQorICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjE4NzVmKTsgLyogMzI3NjguMCozMjc2OC4wLzJeKDQ0LTI2KSAqLworICB9CisKKyAgc2VsZi0+QlAgPSBCUF9fRkRLOworICBzZWxmLT5CUF9HRiA9IEJQX0dGX19GREs7CisKKyAgc2VsZi0+dXBkYXRlX29sZF9lbmVyID0gMDsKKworICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogc3ViYmFuZFRQRGVzdHJveQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3ViYmFuZFRQRGVzdHJveShIQU5ETEVfU1RQX0RFQyAqaFN0cERlYykgeworICBpZiAoaFN0cERlYyAhPSBOVUxMKSB7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKCpoU3RwRGVjKTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogc3ViYmFuZFRQQXBwbHkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTQUNERUNfRVJST1Igc3ViYmFuZFRQQXBwbHkoc3BhdGlhbERlYyAqc2VsZiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUpIHsKKyAgRklYUF9EQkwgKnFtZk91dHB1dFJlYWxEcnlbTUFYX09VVFBVVF9DSEFOTkVMU107CisgIEZJWFBfREJMICpxbWZPdXRwdXRJbWFnRHJ5W01BWF9PVVRQVVRfQ0hBTk5FTFNdOworICBGSVhQX0RCTCAqcW1mT3V0cHV0UmVhbFdldFtNQVhfT1VUUFVUX0NIQU5ORUxTXTsKKyAgRklYUF9EQkwgKnFtZk91dHB1dEltYWdXZXRbTUFYX09VVFBVVF9DSEFOTkVMU107CisKKyAgRklYUF9EQkwgRHJ5RW5lcltNQVhfSU5QVVRfQ0hBTk5FTFNdOworICBGSVhQX0RCTCBzY2FsZVtNQVhfT1VUUFVUX0NIQU5ORUxTXTsKKworICBGSVhQX0RCTCBEcnlFbmVyTEQ2NFtNQVhfSU5QVVRfQ0hBTk5FTFNdOworICBGSVhQX0RCTCBXZXRFbmVyTEQ2NFtNQVhfT1VUUFVUX0NIQU5ORUxTXTsKKworICBGSVhQX0RCTCBEcnlFbmVyMCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBGSVhQX0RCTCBXZXRFbmVyWCwgZGFtcCwgdG1wOworICBGSVhQX0RCTCBkbXhSZWFsMCwgZG14SW1hZzA7CisgIGludCBza2lwQ2hhbm5lbHNbTUFYX09VVFBVVF9DSEFOTkVMU107CisgIGludCBuLCBjaCwgY3BseEJhbmRzLCBjcGx4SHliQmFuZHM7CisgIGludCBkcnlfc2NhbGVfZG14LCB3ZXRfc2NhbGVfZG14OworICBpbnQgaV9MRiwgaV9SRjsKKyAgSEFORExFX1NUUF9ERUMgaFN0cERlYzsKKyAgY29uc3QgRklYUF9DRkcgKnBCUDsKKworICBpbnQgbnJnU2NhbGUgPSAoMiAqIHNlbGYtPmNsaXBQcm90ZWN0R2FpblNGX19GREspOworCisgIGhTdHBEZWMgPSBzZWxmLT5oU3RwRGVjOworCisgIC8qIHNldCBzY2FsZWZhY3RvciBhbmQgbG9vcCBjb3VudGVyICovCisgIEZES19BU1NFUlQoU0ZfRFJZID49IDEpOworICB7CisgICAgY3BseEJhbmRzID0gQlBfR0ZfU0laRTsKKyAgICBjcGx4SHliQmFuZHMgPSBzZWxmLT5oeWJyaWRCYW5kczsKKyAgICBkcnlfc2NhbGVfZG14ID0gKDIgKiBTRl9EUlkpIC0gMjsKKyAgICB3ZXRfc2NhbGVfZG14ID0gMjsKKyAgfQorCisgIC8qIHNldHVwIHBvaW50ZXIgZm9yIGZvcm1pbmcgdGhlIGRpcmVjdCBkb3dubWl4IHNpZ25hbCAqLworICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5udW1PdXRwdXRDaGFubmVsczsgY2grKykgeworICAgIHFtZk91dHB1dFJlYWxEcnlbY2hdID0gJnNlbGYtPmh5Yk91dHB1dFJlYWxEcnlfX0ZES1tjaF1bN107CisgICAgcW1mT3V0cHV0UmVhbFdldFtjaF0gPSAmc2VsZi0+aHliT3V0cHV0UmVhbFdldF9fRkRLW2NoXVs3XTsKKyAgICBxbWZPdXRwdXRJbWFnRHJ5W2NoXSA9ICZzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREtbY2hdWzddOworICAgIHFtZk91dHB1dEltYWdXZXRbY2hdID0gJnNlbGYtPmh5Yk91dHB1dEltYWdXZXRfX0ZES1tjaF1bN107CisgIH0KKworICAvKiBjbGVhciBza2lwcGluZyBmbGFnIGZvciBhbGwgb3V0cHV0IGNoYW5uZWxzICovCisgIEZES21lbXNldChza2lwQ2hhbm5lbHMsIDAsIHNlbGYtPm51bU91dHB1dENoYW5uZWxzICogc2l6ZW9mKGludCkpOworCisgIC8qIHNldCBzY2FsZSB2YWx1ZXMgdG8gemVybyAqLworICBGREttZW1zZXQoc2NhbGUsIDAsIHNlbGYtPm51bU91dHB1dENoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgLyogdXBkYXRlIG5vcm1hbGlzYXRpb24gZW5lcmd5IHdpdGggbGF0ZXN0IHNtb290aGVkIGVuZXJneSAqLworICBpZiAoaFN0cERlYy0+dXBkYXRlX29sZF9lbmVyID09IFNUUF9VUERBVEVfRU5FUkdZX1JBVEUpIHsKKyAgICBoU3RwRGVjLT51cGRhdGVfb2xkX2VuZXIgPSAxOworICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPm51bUlucHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIGhTdHBEZWMtPm9sZERyeUVuZXJMRDY0W2NoXSA9CisgICAgICAgICAgQ2FsY0xkRGF0YShoU3RwRGVjLT5ydW5EcnlFbmVyW2NoXSArIEFCU19USFJfX0ZESyk7CisgICAgfQorICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPm51bU91dHB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgICBoU3RwRGVjLT5vbGRXZXRFbmVyTEQ2NFtjaF0gPQorICAgICAgICAgIENhbGNMZERhdGEoaFN0cERlYy0+cnVuV2V0RW5lcltjaF0gKyBBQlNfVEhSMl9fRkRLKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaFN0cERlYy0+dXBkYXRlX29sZF9lbmVyKys7CisgIH0KKworICAvKiBnZXQgY2hhbm5lbCBjb25maWd1cmF0aW9uICovCisgIHN3aXRjaCAoc2VsZi0+dHJlZUNvbmZpZykgeworICAgIGNhc2UgVFJFRV8yMTI6CisgICAgICBpX0xGID0gMDsKKyAgICAgIGlfUkYgPSAxOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBNUFNfV1JPTkdfVFJFRUNPTkZJRzsKKyAgfQorCisgIC8qIGZvcm0gdGhlICdkaXJlY3QnIGRvd25taXggc2lnbmFsICovCisgIHBCUCA9IGhTdHBEZWMtPkJQX0dGIC0gQlBfR0ZfU1RBUlQ7CisgIHN3aXRjaCAoc2VsZi0+dHJlZUNvbmZpZykgeworICAgIGNhc2UgVFJFRV8yMTI6CisgICAgICBmb3IgKG4gPSBCUF9HRl9TVEFSVDsgbiA8IGNwbHhCYW5kczsgbisrKSB7CisgICAgICAgIGRteFJlYWwwID0gcW1mT3V0cHV0UmVhbERyeVtpX0xGXVtuXSArIHFtZk91dHB1dFJlYWxEcnlbaV9SRl1bbl07CisgICAgICAgIGRteEltYWcwID0gcW1mT3V0cHV0SW1hZ0RyeVtpX0xGXVtuXSArIHFtZk91dHB1dEltYWdEcnlbaV9SRl1bbl07CisgICAgICAgIERSWV9FTkVSX1NVTV9DUExYKERyeUVuZXIwLCBkbXhSZWFsMCwgZG14SW1hZzAsIG4pOworICAgICAgfQorICAgICAgRFJZX0VORVJfV0VJR0hUKERyeUVuZXIwKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6OworICB9CisgIERyeUVuZXJbMF0gPSBEcnlFbmVyMDsKKworICAvKiBub3JtYWxpc2UgdGhlICdkaXJlY3QnIHNpZ25hbHMgKi8KKyAgZm9yIChjaCA9IDA7IGNoIDwgc2VsZi0+bnVtSW5wdXRDaGFubmVsczsgY2grKykgeworICAgIERyeUVuZXJbY2hdID0gRHJ5RW5lcltjaF0gPDwgKG5yZ1NjYWxlKTsKKyAgICBoU3RwRGVjLT5ydW5EcnlFbmVyW2NoXSA9CisgICAgICAgIGZNdWx0KFNUUF9MUEZfQ09FRkYxX19GREssIGhTdHBEZWMtPnJ1bkRyeUVuZXJbY2hdKSArCisgICAgICAgIGZNdWx0KE9ORV9NSU5VU19TVFBfTFBGX0NPRUZGMV9fRkRLLCBEcnlFbmVyW2NoXSk7CisgICAgaWYgKERyeUVuZXJbY2hdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICBEcnlFbmVyTEQ2NFtjaF0gPQorICAgICAgICAgIGZpeE1heCgoQ2FsY0xkRGF0YShEcnlFbmVyW2NoXSkgLSBoU3RwRGVjLT5vbGREcnlFbmVyTEQ2NFtjaF0pLAorICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMC40ODQzNzVmKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIERyeUVuZXJMRDY0W2NoXSA9IEZMMkZYQ09OU1RfREJMKC0wLjQ4NDM3NWYpOworICAgIH0KKyAgfQorICBpZiAoc2VsZi0+dHJlZUNvbmZpZyA9PSBUUkVFXzIxMikgeworICAgIGZvciAoOyBjaCA8IE1BWF9JTlBVVF9DSEFOTkVMUzsgY2grKykgeworICAgICAgRHJ5RW5lckxENjRbY2hdID0gRkwyRlhDT05TVF9EQkwoLTAuNDg0Mzc1Zik7CisgICAgfQorICB9CisKKyAgLyogbm9ybWFsaXNlIHRoZSAnZGlmZnVzZScgc2lnbmFscyAqLworICBwQlAgPSBoU3RwRGVjLT5CUF9HRiAtIEJQX0dGX1NUQVJUOworICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5udW1PdXRwdXRDaGFubmVsczsgY2grKykgeworICAgIGlmIChza2lwQ2hhbm5lbHNbY2hdKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBXZXRFbmVyWCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIGZvciAobiA9IEJQX0dGX1NUQVJUOyBuIDwgY3BseEJhbmRzOyBuKyspIHsKKyAgICAgIHRtcCA9IGZQb3cyRGl2MihxbWZPdXRwdXRSZWFsV2V0W2NoXVtuXSA8PCBTRl9XRVQpOworICAgICAgdG1wICs9IGZQb3cyRGl2MihxbWZPdXRwdXRJbWFnV2V0W2NoXVtuXSA8PCBTRl9XRVQpOworICAgICAgV2V0RW5lclggKz0gZk11bHREaXYyKHRtcCwgcEJQW25dKTsKKyAgICB9CisgICAgV0VUX0VORVJfV0VJR0hUKFdldEVuZXJYKTsKKworICAgIFdldEVuZXJYID0gV2V0RW5lclggPDwgKG5yZ1NjYWxlKTsKKyAgICBoU3RwRGVjLT5ydW5XZXRFbmVyW2NoXSA9CisgICAgICAgIGZNdWx0KFNUUF9MUEZfQ09FRkYxX19GREssIGhTdHBEZWMtPnJ1bldldEVuZXJbY2hdKSArCisgICAgICAgIGZNdWx0KE9ORV9NSU5VU19TVFBfTFBGX0NPRUZGMV9fRkRLLCBXZXRFbmVyWCk7CisKKyAgICBpZiAoV2V0RW5lclggPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIFdldEVuZXJMRDY0W2NoXSA9IEZMMkZYQ09OU1RfREJMKC0wLjQ4NDM3NWYpOworICAgIH0gZWxzZSB7CisgICAgICBXZXRFbmVyTEQ2NFtjaF0gPQorICAgICAgICAgIGZpeE1heCgoQ2FsY0xkRGF0YShXZXRFbmVyWCkgLSBoU3RwRGVjLT5vbGRXZXRFbmVyTEQ2NFtjaF0pLAorICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMC40ODQzNzVmKSk7CisgICAgfQorICB9CisKKyAgLyogY29tcHV0ZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSAnZGlmZnVzZScgc2lnbmFscyAqLworICBzd2l0Y2ggKHNlbGYtPnRyZWVDb25maWcpIHsKKyAgICBjYXNlIFRSRUVfMjEyOgorICAgICAgaWYgKERyeUVuZXJbMF0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgICAgQ0FMQ19XRVRfU0NBTEUoMCwgaV9MRik7CisgICAgICAgIENBTENfV0VUX1NDQUxFKDAsIGlfUkYpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDo7CisgIH0KKworICBkYW1wID0gRkwyRlhDT05TVF9EQkwoMC4xZiAvICgxIDw8IFNGX1NDQUxFKSk7CisgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPm51bU91dHB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgLyogZGFtcCB0aGUgc2NhbGluZyBmYWN0b3IgKi8KKyAgICBzY2FsZVtjaF0gPSBkYW1wICsgZk11bHQoRkwyRlhDT05TVF9EQkwoMC45ZiksIHNjYWxlW2NoXSk7CisKKyAgICAvKiBsaW1pdGluZyB0aGUgc2NhbGUgZmFjdG9yICovCisgICAgaWYgKHNjYWxlW2NoXSA+IFNUUF9TQ0FMRV9MSU1JVF9fRkRLKSB7CisgICAgICBzY2FsZVtjaF0gPSBTVFBfU0NBTEVfTElNSVRfX0ZESzsKKyAgICB9CisgICAgaWYgKHNjYWxlW2NoXSA8IE9ORV9ESVZfU1RQX1NDQUxFX0xJTUlUX19GREspIHsKKyAgICAgIHNjYWxlW2NoXSA9IE9ORV9ESVZfU1RQX1NDQUxFX0xJTUlUX19GREs7CisgICAgfQorCisgICAgLyogbG93IHBhc3MgZmlsdGVyIHRoZSBzY2FsaW5nIGZhY3RvciAqLworICAgIHNjYWxlW2NoXSA9CisgICAgICAgIGZNdWx0KFNUUF9MUEZfQ09FRkYyX19GREssIHNjYWxlW2NoXSkgKworICAgICAgICBmTXVsdChPTkVfTUlOVVNfU1RQX0xQRl9DT0VGRjJfX0ZESywgaFN0cERlYy0+cHJldl90cF9zY2FsZVtjaF0pOworICAgIGhTdHBEZWMtPnByZXZfdHBfc2NhbGVbY2hdID0gc2NhbGVbY2hdOworICB9CisKKyAgLyogY29tYmluZSAnZGlyZWN0JyBhbmQgc2NhbGVkICdkaWZmdXNlJyBzaWduYWwgKi8KKyAgRkRLX0FTU0VSVCgoSFBfU0laRSAtIDMgKyAxMCAtIDEpID09IFBDX05VTV9IWUJfQkFORFMpOworICBjb25zdCBTQ0hBUiAqY2hhbm5sSW5kZXggPSByb3cyY2hhbm5lbFNUUFtzZWxmLT50cmVlQ29uZmlnXTsKKworICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5udW1PdXRwdXRDaGFubmVsczsgY2grKykgeworICAgIGludCBub19zY2FsaW5nOworCisgICAgbm9fc2NhbGluZyA9ICFmcmFtZS0+dGVtcFNoYXBlRW5hYmxlQ2hhbm5lbFNUUFtjaGFubmxJbmRleFtjaF1dOworICAgIGlmIChub19zY2FsaW5nKSB7CisgICAgICBjb21iaW5lU2lnbmFsQ3BseCgKKyAgICAgICAgICAmc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLW2NoXVtzZWxmLT50cF9oeWJCYW5kQm9yZGVyXSwKKyAgICAgICAgICAmc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLW2NoXVtzZWxmLT50cF9oeWJCYW5kQm9yZGVyXSwKKyAgICAgICAgICAmc2VsZi0+aHliT3V0cHV0UmVhbFdldF9fRkRLW2NoXVtzZWxmLT50cF9oeWJCYW5kQm9yZGVyXSwKKyAgICAgICAgICAmc2VsZi0+aHliT3V0cHV0SW1hZ1dldF9fRkRLW2NoXVtzZWxmLT50cF9oeWJCYW5kQm9yZGVyXSwKKyAgICAgICAgICBjcGx4SHliQmFuZHMgLSBzZWxmLT50cF9oeWJCYW5kQm9yZGVyKTsKKworICAgIH0gZWxzZSB7CisgICAgICBGSVhQX0RCTCBzY2FsZVg7CisgICAgICBzY2FsZVggPSBzY2FsZVtjaF07CisgICAgICBwQlAgPSBoU3RwRGVjLT5CUCAtIHNlbGYtPnRwX2h5YkJhbmRCb3JkZXI7CisgICAgICAvKiBCYW5kW0hQX1NJWkUtMysxMC0xXSBuZWVkcyBub3QgdG8gYmUgcHJvY2Vzc2VkIGluCisgICAgICAgICBjb21iaW5lU2lnbmFsQ3BseFNjYWxlMSgpLCBiZWNhdXNlIHBCW0hQX1NJWkUtMysxMC0xXSB3b3VsZCBiZSAxLjAgKi8KKyAgICAgIGNvbWJpbmVTaWduYWxDcGx4U2NhbGUxKAorICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREtbY2hdW3NlbGYtPnRwX2h5YkJhbmRCb3JkZXJdLAorICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREtbY2hdW3NlbGYtPnRwX2h5YkJhbmRCb3JkZXJdLAorICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRSZWFsV2V0X19GREtbY2hdW3NlbGYtPnRwX2h5YkJhbmRCb3JkZXJdLAorICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRJbWFnV2V0X19GREtbY2hdW3NlbGYtPnRwX2h5YkJhbmRCb3JkZXJdLAorICAgICAgICAgICZwQlBbc2VsZi0+dHBfaHliQmFuZEJvcmRlcl0sIHNjYWxlWCwKKyAgICAgICAgICAoSFBfU0laRSAtIDMgKyAxMCAtIDEpIC0gc2VsZi0+dHBfaHliQmFuZEJvcmRlcik7CisKKyAgICAgIHsKKyAgICAgICAgY29tYmluZVNpZ25hbENwbHhTY2FsZTIoCisgICAgICAgICAgICAmc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLW2NoXVtIUF9TSVpFIC0gMyArIDEwIC0gMV0sCisgICAgICAgICAgICAmc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLW2NoXVtIUF9TSVpFIC0gMyArIDEwIC0gMV0sCisgICAgICAgICAgICAmc2VsZi0+aHliT3V0cHV0UmVhbFdldF9fRkRLW2NoXVtIUF9TSVpFIC0gMyArIDEwIC0gMV0sCisgICAgICAgICAgICAmc2VsZi0+aHliT3V0cHV0SW1hZ1dldF9fRkRLW2NoXVtIUF9TSVpFIC0gMyArIDEwIC0gMV0sIHNjYWxlWCwKKyAgICAgICAgICAgIGNwbHhIeWJCYW5kcyAtIChIUF9TSVpFIC0gMyArIDEwIC0gMSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAoU0FDREVDX0VSUk9SKU1QU19PSzsKKyAgOworfQpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfc3RwLmggYi9saWJTQUNkZWMvc3JjL3NhY19zdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQ3MWJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfc3RwLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlYyBzdWJiYW5kIHByb2Nlc3NpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNfU1RQX0gKKyNkZWZpbmUgU0FDX1NUUF9ICisKKyNpbmNsdWRlICJzYWNfZGVjLmgiCisKK1NBQ0RFQ19FUlJPUiBzdWJiYW5kVFBDcmVhdGUoSEFORExFX1NUUF9ERUMgKmhTdHBEZWMpOworCitTQUNERUNfRVJST1Igc3ViYmFuZFRQSW5pdChIQU5ETEVfU1RQX0RFQyBzZWxmKTsKKworU0FDREVDX0VSUk9SIHN1YmJhbmRUUEFwcGx5KHNwYXRpYWxEZWMgKnNlbGYsIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lKTsKK3ZvaWQgc3ViYmFuZFRQRGVzdHJveShIQU5ETEVfU1RQX0RFQyAqaFN0cERlYyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfdHNkLmNwcCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3RzZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhY2NhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9zcmMvc2FjX3RzZC5jcHAKQEAgLTAsMCArMSwzNTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOiBVU0FDIE1QUzIxMiBUcmFuc2llbnQgU3RlZXJpbmcgRGVjb3JyZWxhdG9yIChUU0QpCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzYWNfdHNkLmgiCisKKyNkZWZpbmUgVFNEX1NUQVJUX0JBTkQgKDcpCisjZGVmaW5lIFNJWkVfUyAoNCkKKyNkZWZpbmUgU0laRV9DICg1KQorCisvKioqIFRhYmxlcyAqKiovCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorc3RhdGljIGNvbnN0IFVDSEFSIG5CaXRzVHNkQ1dfMzJzbG90c1szMl0gPSB7CisgICAgNSwgIDksICAxMywgMTYsIDE4LCAyMCwgMjIsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDI5LCAzMCwgMzAsCisgICAgMzAsIDI5LCAyOSwgMjgsIDI3LCAyNiwgMjUsIDI0LCAyMiwgMjAsIDE4LCAxNiwgMTMsIDksICA1LCAgMH07CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitzdGF0aWMgY29uc3QgVUNIQVIgbkJpdHNUc2RDV182NHNsb3RzWzY0XSA9IHsKKyAgICA2LCAgMTEsIDE2LCAyMCwgMjMsIDI3LCAzMCwgMzMsIDM1LCAzOCwgNDAsIDQyLCA0NCwgNDYsIDQ4LCA0OSwKKyAgICA1MSwgNTIsIDUzLCA1NSwgNTYsIDU3LCA1OCwgNTgsIDU5LCA2MCwgNjAsIDYwLCA2MSwgNjEsIDYxLCA2MSwKKyAgICA2MSwgNjEsIDYxLCA2MCwgNjAsIDYwLCA1OSwgNTgsIDU4LCA1NywgNTYsIDU1LCA1MywgNTIsIDUxLCA0OSwKKyAgICA0OCwgNDYsIDQ0LCA0MiwgNDAsIDM4LCAzNSwgMzMsIDMwLCAyNywgMjMsIDIwLCAxNiwgMTEsIDYsICAwfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK3N0YXRpYyBjb25zdCBGSVhQX1NUUCBwaGlUc2RbOF0gPSB7CisgICAgU1RDUCgweDdmZmZmZmZmLCAweDAwMDAwMDAwKSwgU1RDUCgweDVhODI3OTlhLCAweDVhODI3OTlhKSwKKyAgICBTVENQKDB4MDAwMDAwMDAsIDB4N2ZmZmZmZmYpLCBTVENQKDB4YTU3ZDg2NjYsIDB4NWE4Mjc5OWEpLAorICAgIFNUQ1AoMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCksIFNUQ1AoMHhhNTdkODY2NiwgMHhhNTdkODY2NiksCisgICAgU1RDUCgweDAwMDAwMDAwLCAweDgwMDAwMDAwKSwgU1RDUCgweDVhODI3OTlhLCAweGE1N2Q4NjY2KSwKK307CisKKy8qKiogU3RhdGljIEZ1bmN0aW9ucyAqKiovCitzdGF0aWMgdm9pZCBsb25nbXVsdDEoVVNIT1JUIGFbXSwgVVNIT1JUIGIsIFVTSE9SVCBkW10sIGludCBsZW4pIHsKKyAgaW50IGs7CisgIFVMT05HIHRtcDsKKyAgVUxPTkcgYjAgPSAoVUxPTkcpYjsKKworICB0bXAgPSAoKFVMT05HKWFbMF0pICogYjA7CisgIGRbMF0gPSAoVVNIT1JUKXRtcDsKKworICBmb3IgKGsgPSAxOyBrIDwgbGVuOyBrKyspIHsKKyAgICB0bXAgPSAodG1wID4+IDE2KSArICgoVUxPTkcpYVtrXSkgKiBiMDsKKyAgICBkW2tdID0gKFVTSE9SVCl0bXA7CisgIH0KK30KKworc3RhdGljIHZvaWQgbG9uZ2RpdihVU0hPUlQgYltdLCBVU0hPUlQgYSwgVVNIT1JUIGRbXSwgVVNIT1JUICpwciwgaW50IGxlbikgeworICBVTE9ORyByOworICBVTE9ORyB0bXA7CisgIGludCBrOworCisgIEZES19BU1NFUlQoYSAhPSAwKTsKKworICByID0gMDsKKworICBmb3IgKGsgPSBsZW4gLSAxOyBrID49IDA7IGstLSkgeworICAgIHRtcCA9ICgoVUxPTkcpYltrXSkgKyAociA8PCAxNik7CisKKyAgICBpZiAodG1wKSB7CisgICAgICBkW2tdID0gKFVTSE9SVCkodG1wIC8gYSk7CisgICAgICByID0gdG1wIC0gZFtrXSAqIGE7CisgICAgfSBlbHNlIHsKKyAgICAgIGRba10gPSAwOworICAgIH0KKyAgfQorICAqcHIgPSAoVVNIT1JUKXI7Cit9CisKK3N0YXRpYyB2b2lkIGxvbmdzdWIoVVNIT1JUIGFbXSwgVVNIT1JUIGJbXSwgaW50IGxlbmEsIGludCBsZW5iKSB7CisgIGludCBoOworICBMT05HIGNhcnJ5ID0gMDsKKworICBGREtfQVNTRVJUKGxlbmEgPj0gbGVuYik7CisgIGZvciAoaCA9IDA7IGggPCBsZW5iOyBoKyspIHsKKyAgICBjYXJyeSArPSAoKExPTkcpYVtoXSkgLSAoKExPTkcpYltoXSk7CisgICAgYVtoXSA9IChVU0hPUlQpY2Fycnk7CisgICAgY2FycnkgPSBjYXJyeSA+PiAxNjsKKyAgfQorCisgIGZvciAoOyBoIDwgbGVuYTsgaCsrKSB7CisgICAgY2FycnkgPSAoKExPTkcpYVtoXSkgKyBjYXJyeTsKKyAgICBhW2hdID0gKFVTSE9SVCljYXJyeTsKKyAgICBjYXJyeSA9IGNhcnJ5ID4+IDE2OworICB9CisKKyAgRkRLX0FTU0VSVChjYXJyeSA9PQorICAgICAgICAgICAgIDApOyAvKiBjYXJyeSAhPSAwIGluZGljYXRlcyBzdWJ0cmFjdGlvbiB1bmRlcmZsb3csIGUuZy4gYiA+IGEgKi8KKyAgcmV0dXJuOworfQorCitzdGF0aWMgaW50IGxvbmdjb21wYXJlKFVTSE9SVCBhW10sIFVTSE9SVCBiW10sIGludCBsZW4pIHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gbGVuIC0gMTsgaSA+IDA7IGktLSkgeworICAgIGlmIChhW2ldICE9IGJbaV0pIGJyZWFrOworICB9CisgIHJldHVybiAoYVtpXSA+PSBiW2ldKSA/IDEgOiAwOworfQorCitGREtfSU5MSU5FIGludCBpc1RyU2xvdChjb25zdCBUU0RfREFUQSAqcFRzZERhdGEsIGNvbnN0IGludCB0cykgeworICByZXR1cm4gKHBUc2REYXRhLT5ic1RzZFRyUGhhc2VEYXRhW3RzXSA+PSAwKTsKK30KKworLyoqKiBQdWJsaWMgRnVuY3Rpb25zICoqKi8KK2ludCBUc2RSZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgY29uc3QgaW50IG51bVNsb3RzLCBUU0RfREFUQSAqcFRzZERhdGEpIHsKKyAgaW50IG5CaXRzVHJTbG90cyA9IDA7CisgIGludCBic1RzZE51bVRyU2xvdHM7CisgIGNvbnN0IFVDSEFSICpuQml0c1RzZENXX3RhYiA9IE5VTEw7CisKKyAgc3dpdGNoIChudW1TbG90cykgeworICAgIGNhc2UgMzI6CisgICAgICBuQml0c1RyU2xvdHMgPSA0OworICAgICAgbkJpdHNUc2RDV190YWIgPSBuQml0c1RzZENXXzMyc2xvdHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY0OgorICAgICAgbkJpdHNUclNsb3RzID0gNTsKKyAgICAgIG5CaXRzVHNkQ1dfdGFiID0gbkJpdHNUc2RDV182NHNsb3RzOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAxOworICB9CisKKyAgLyoqKiBSZWFkIFRlbXBTaGFwZURhdGEgZm9yIGJzVGVtcFNoYXBlQ29uZmlnID09IDMgKioqLworICBwVHNkRGF0YS0+YnNUc2RFbmFibGUgPSBGREtyZWFkQml0KGhCcyk7CisgIGlmICghcFRzZERhdGEtPmJzVHNkRW5hYmxlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKioqIFBhcnNlL0RlY29kZSBUc2REYXRhKCkgKioqLworICBwVHNkRGF0YS0+bnVtU2xvdHMgPSBudW1TbG90czsKKworICBic1RzZE51bVRyU2xvdHMgPSBGREtyZWFkQml0cyhoQnMsIG5CaXRzVHJTbG90cyk7CisKKyAgLyogRGVjb2RlIHRyYW5zaWVudCBzbG90IHBvc2l0aW9ucyAqLworICB7CisgICAgaW50IG5CaXRzVHNkQ1cgPSAoaW50KW5CaXRzVHNkQ1dfdGFiW2JzVHNkTnVtVHJTbG90c107CisgICAgU0NIQVIgKnBoYXNlRGF0YSA9IHBUc2REYXRhLT5ic1RzZFRyUGhhc2VEYXRhOworICAgIGludCBwID0gYnNUc2ROdW1UclNsb3RzICsgMTsKKyAgICBpbnQgaywgaDsKKyAgICBVU0hPUlQgc1tTSVpFX1NdID0gezB9OworICAgIFVTSE9SVCBjW1NJWkVfQ10gPSB7MH07CisgICAgVVNIT1JUIHJbMV07CisKKyAgICAvKiBJbml0IHdpdGggVHNkU2VwRGF0YVtrXSA9IDAgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtU2xvdHM7IGsrKykgeworICAgICAgcGhhc2VEYXRhW2tdID0gLTE7IC8qIG1lYW5zIFRzZFNlcERhdGFbXSA9IDAgKi8KKyAgICB9CisKKyAgICBmb3IgKGggPSAoU0laRV9TIC0gMSk7IGggPj0gMDsgaC0tKSB7CisgICAgICBpZiAobkJpdHNUc2RDVyA+IGggKiAxNikgeworICAgICAgICBzW2hdID0gKFVTSE9SVClGREtyZWFkQml0cyhoQnMsIG5CaXRzVHNkQ1cgLSBoICogMTYpOworICAgICAgICBuQml0c1RzZENXID0gaCAqIDE2OworICAgICAgfQorICAgIH0KKworICAgIC8qIGMgPSBwcm9kX3toPTF9XntwfSAoay1wK2gpL2ggKi8KKyAgICBrID0gbnVtU2xvdHMgLSAxOworICAgIGNbMF0gPSBrIC0gcCArIDE7CisgICAgZm9yIChoID0gMjsgaCA8PSBwOyBoKyspIHsKKyAgICAgIGxvbmdtdWx0MShjLCAoayAtIHAgKyBoKSwgYywgNSk7IC8qIGMgKj0gayAtIHAgKyBoOyAqLworICAgICAgbG9uZ2RpdihjLCBoLCBjLCByLCA1KTsgICAgICAgICAgLyogYyAvPSBoOyAqLworICAgICAgRkRLX0FTU0VSVCgqciA9PSAwKTsKKyAgICB9CisKKyAgICAvKiBnbyB0aHJvdWdoIGFsbCBzbG90cyAqLworICAgIGZvciAoOyBrID49IDA7IGstLSkgeworICAgICAgaWYgKHAgPiBrKSB7CisgICAgICAgIGZvciAoOyBrID49IDA7IGstLSkgeworICAgICAgICAgIHBoYXNlRGF0YVtrXSA9IDE7IC8qIG1lYW5zIFRzZFNlcERhdGFbXSA9IDEgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChsb25nY29tcGFyZShzLCBjLCA0KSkgeyAvKiAocyA+PSBjKSAqLworICAgICAgICBsb25nc3ViKHMsIGMsIDQsIDQpOyAgICAgIC8qIHMgLT0gYzsgKi8KKyAgICAgICAgcGhhc2VEYXRhW2tdID0gMTsgICAgICAgICAvKiBtZWFucyBUc2RTZXBEYXRhW10gPSAxICovCisgICAgICAgIGlmIChwID09IDEpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBVcGRhdGUgYyBmb3IgbmV4dCBpdGVyYXRpb246IGNfbmV3ID0gY19vbGQgKiBwIC8gayAqLworICAgICAgICBsb25nbXVsdDEoYywgcCwgYywgNSk7CisgICAgICAgIHAtLTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFVwZGF0ZSBjIGZvciBuZXh0IGl0ZXJhdGlvbjogY19uZXcgPSBjX29sZCAqIChrLXApIC8gayAqLworICAgICAgICBsb25nbXVsdDEoYywgKGsgLSBwKSwgYywgNSk7CisgICAgICB9CisgICAgICBsb25nZGl2KGMsIGssIGMsIHIsIDUpOworICAgICAgRkRLX0FTU0VSVCgqciA9PSAwKTsKKyAgICB9CisKKyAgICAvKiBSZWFkIHBoYXNlIGRhdGEgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtU2xvdHM7IGsrKykgeworICAgICAgaWYgKHBoYXNlRGF0YVtrXSA9PSAxKSB7CisgICAgICAgIHBoYXNlRGF0YVtrXSA9IEZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgVHNkR2VuZXJhdGVOb25Ucihjb25zdCBpbnQgbnVtSHlicmlkQmFuZHMsIGNvbnN0IFRTRF9EQVRBICpwVHNkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdHMsIEZJWFBfREJMICpwVmRpcmVjdFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBWZGlyZWN0SW1hZywgRklYUF9EQkwgKnBWbm9uVHJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwVm5vblRySW1hZywgRklYUF9EQkwgKipwcERlY29yckluUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnBwRGVjb3JySW5JbWFnKSB7CisgIGludCBrID0gMDsKKworICBpZiAoIWlzVHJTbG90KHBUc2REYXRhLCB0cykpIHsKKyAgICAvKiBMZXQgYWxscGFzcyBiYXNlZCBkZWNvcnJlbGF0b3IgcmVhZCBmcm9tIGRpcmVjdCBpbnB1dC4gKi8KKyAgICAqcHBEZWNvcnJJblJlYWwgPSBwVmRpcmVjdFJlYWw7CisgICAgKnBwRGVjb3JySW5JbWFnID0gcFZkaXJlY3RJbWFnOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIEdlbmVyYXRlIG5vblRyIGlucHV0IHNpZ25hbCBmb3IgYWxscGFzcyBiYXNlZCBkZWNvcnJlbGF0b3IgKi8KKyAgZm9yICg7IGsgPCBUU0RfU1RBUlRfQkFORDsgaysrKSB7CisgICAgcFZub25UclJlYWxba10gPSBwVmRpcmVjdFJlYWxba107CisgICAgcFZub25UckltYWdba10gPSBwVmRpcmVjdEltYWdba107CisgIH0KKyAgZm9yICg7IGsgPCBudW1IeWJyaWRCYW5kczsgaysrKSB7CisgICAgcFZub25UclJlYWxba10gPSAoRklYUF9EQkwpMDsKKyAgICBwVm5vblRySW1hZ1trXSA9IChGSVhQX0RCTCkwOworICB9CisgICpwcERlY29yckluUmVhbCA9IHBWbm9uVHJSZWFsOworICAqcHBEZWNvcnJJbkltYWcgPSBwVm5vblRySW1hZzsKK30KKwordm9pZCBUc2RBcHBseShjb25zdCBpbnQgbnVtSHlicmlkQmFuZHMsIGNvbnN0IFRTRF9EQVRBICpwVHNkRGF0YSwgaW50ICpwVHNkVHMsCisgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpwVmRpcmVjdFJlYWwsIGNvbnN0IEZJWFBfREJMICpwVmRpcmVjdEltYWcsCisgICAgICAgICAgICAgIEZJWFBfREJMICpwRG5vblRyUmVhbCwgRklYUF9EQkwgKnBEbm9uVHJJbWFnKSB7CisgIGNvbnN0IGludCB0cyA9ICpwVHNkVHM7CisKKyAgaWYgKGlzVHJTbG90KHBUc2REYXRhLCB0cykpIHsKKyAgICBpbnQgazsKKyAgICBjb25zdCBGSVhQX1NUUCAqcGhpID0gJnBoaVRzZFtwVHNkRGF0YS0+YnNUc2RUclBoYXNlRGF0YVt0c11dOworICAgIEZES19BU1NFUlQoKHBUc2REYXRhLT5ic1RzZFRyUGhhc2VEYXRhW3RzXSA+PSAwKSAmJgorICAgICAgICAgICAgICAgKHBUc2REYXRhLT5ic1RzZFRyUGhhc2VEYXRhW3RzXSA8IDgpKTsKKworICAgIC8qIGQgPSBkX25vblRyICsgdl9kaXJlY3QgKiBleHAoaiAqIGJzVHNkVHJQaGFzZURhdGFbdHNdLzQgKiBwaSApICovCisgICAgZm9yIChrID0gVFNEX1NUQVJUX0JBTkQ7IGsgPCBudW1IeWJyaWRCYW5kczsgaysrKSB7CisgICAgICBGSVhQX0RCTCB0ZW1wUmVhbCwgdGVtcEltYWc7CisgICAgICBjcGx4TXVsdCgmdGVtcFJlYWwsICZ0ZW1wSW1hZywgcFZkaXJlY3RSZWFsW2tdLCBwVmRpcmVjdEltYWdba10sICpwaGkpOworICAgICAgcERub25UclJlYWxba10gKz0gdGVtcFJlYWw7CisgICAgICBwRG5vblRySW1hZ1trXSArPSB0ZW1wSW1hZzsKKyAgICB9CisgIH0KKworICAvKiBUaGUgbW9kdWxvIE1BWF9UU0RfVElNRV9TTE9UUyBvcGVyYXRpb24gaXMgdG8gYXZvaWQgaWxsZWdhbCBtZW1vcnkgYWNjZXNzZXMKKyAgICogaW4gY2FzZSBvZiBlcnJvcnMuICovCisgICpwVHNkVHMgPSAodHMgKyAxKSAmIChNQVhfVFNEX1RJTUVfU0xPVFMgLSAxKTsKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfdHNkLmggYi9saWJTQUNkZWMvc3JjL3NhY190c2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTIxZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfdHNkLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOiBVU0FDIE1QUzIxMiBUcmFuc2llbnQgU3RlZXJpbmcgRGVjb3JyZWxhdG9yIChUU0QpCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDX1RTRF9ICisjZGVmaW5lIFNBQ19UU0RfSAorCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2RlZmluZSBNQVhfVFNEX1RJTUVfU0xPVFMgKDY0KQorCisvKiogU3RydWN0dXJlIHdoaWNoIGhvbGRzIHRoZSBkYXRhIG5lZWRlZCB0byBhcHBseSBUU0QgdG8gY3VycmVudCBmcmFtZS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgYnNUc2RFbmFibGU7IC8qKjwgZm9yIGN1cnJlbnQgZnJhbWUgVFNEIGlzICgwOmRpc2FibGVkLCAxOmVuYWJsZWQpICovCisgIFVDSEFSIG51bVNsb3RzOyAgICAvKio8IHRvdGFsIG51bWJlciBvZiBRTUYgc2xvdHMgcGVyIGZyYW1lICovCisgIFNDSEFSCisgIGJzVHNkVHJQaGFzZURhdGFbTUFYX1RTRF9USU1FX1NMT1RTXTsgLyoqPCAtMSA9PiBUc2RTZXBEYXRhW3RzXT0wOyAwLTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIG9mIGJzVHNkVHJQaGFzZURhdGFbdHNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFRzZFNlcERhdGFbdHNdPTEgKi8KK30gVFNEX0RBVEE7CisKK0ZES19JTkxJTkUgaW50IGlzVHNkQWN0aXZlKGNvbnN0IFRTRF9EQVRBICpwVHNkRGF0YSkgeworICByZXR1cm4gKGludClwVHNkRGF0YS0+YnNUc2RFbmFibGU7Cit9CisKKy8qKgorICogXGJyaWVmIFBhcnNlIGFuZCBEZWNvZGUgVFNEIGRhdGEuCisgKiBccGFyYW1baW5dIGhCcyBiaXRzdHJlYW0gaGFuZGxlIHRvIHJlYWQgZGF0YSBmcm9tLgorICogXHBhcmFtW2luXSBudW1TbG90cyBudW1iZXIgb2YgUU1GIHNsb3RzIHBlciBmcmFtZS4KKyAqIFxwYXJhbVtvdXRdIHBUc2REYXRhIHBvaW50ZXIgdG8gVFNEIGRhdGEgc3RydWN0dXJlLgorICogXHJldHVybiAwIG9uIHN1Y2NlcywgMSBvbiBlcnJvci4KKyAqLworaW50IFRzZFJlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBjb25zdCBpbnQgbnVtU2xvdHMsIFRTRF9EQVRBICpwVHNkRGF0YSk7CisKKy8qKgorICogXGJyaWVmIFBlcmZvcm0gdHJhbnNpZW50IHNlcGVyYXRpb24gKHZfe3gsbm9uVHJ9IHNpZ25hbCkuCisgKiBccGFyYW1baW5dIG51bUh5YnJpZEJhbmRzIG51bWJlciBvZiBoeWJyaWQgYmFuZHMuCisgKiBccGFyYW1baW5dIHBUc2REYXRhIHBvaW50ZXIgdG8gVFNEIGRhdGEgc3RydWN0dXJlLgorICogXHBhcmFtW2luXSBwVmRpcmVjdFJlYWwgcG9pbnRlciB0byBhcnJheSB3aXRoIGRpcmVjdCBzaWduYWwuCisgKiBccGFyYW1baW5dIHBWZGlyZWN0SW1hZyBwb2ludGVyIHRvIGFycmF5IHdpdGggZGlyZWN0IHNpZ25hbC4KKyAqIFxwYXJhbVtvdXRdIHBWbm9uVHJSZWFsIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCBub25UciBzaWduYWwuCisgKiBccGFyYW1bb3V0XSBwVm5vblRySW1hZyBwb2ludGVyIHRvIGFycmF5IHdpdGggbm9uVHIgc2lnbmFsLgorICogXHBhcmFtW291dF0gcHBEZWNvcnJJblJlYWwgaGFuZGxlIHRvIGFycmF5IHdoZXJlIGFsbHBhc3MgYmFzZWQgZGVjb3JyZWxhdG9yCisgKiBzaG91bGQgcmVhZCBmcm9tIChtb2RpZmllZCBieSB0aGlzIGZ1bmN0aW9uKS4KKyAqIFxwYXJhbVtvdXRdIHBwRGVjb3JySW5JbWFnIGhhbmRsZSB0byBhcnJheSB3aGVyZSBhbGxwYXNzIGJhc2VkIGRlY29ycmVsYXRvcgorICogc2hvdWxkIHJlYWQgZnJvbSAobW9kaWZpZWQgYnkgdGhpcyBmdW5jdGlvbikuCisgKi8KK3ZvaWQgVHNkR2VuZXJhdGVOb25Ucihjb25zdCBpbnQgbnVtSHlicmlkQmFuZHMsIGNvbnN0IFRTRF9EQVRBICpwVHNkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdHMsIEZJWFBfREJMICpwVmRpcmVjdFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBWZGlyZWN0SW1hZywgRklYUF9EQkwgKnBWbm9uVHJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwVm5vblRySW1hZywgRklYUF9EQkwgKipwcERlY29yckluUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnBwRGVjb3JySW5JbWFnKTsKKworLyoqCisgKiBcYnJpZWYgR2VuZXJhdGUgZF97eCxUcn0gc2lnbmFsIGFuZCBhZGQgdG8gZF97eCxub25Ucn0gc2lnbmFsCisgKiBccGFyYW1baW5dIG51bUh5YnJpZEJhbmRzCisgKiBccGFyYW1baW4sb3V0XSBwVHNkRGF0YQorICogXHBhcmFtIHBUc2RUcyBwb2ludGVyIHRvIHBlcnNpc3RlbnQgdGltZSBzbG90IGNvdW50ZXIKKyAqIFxwYXJhbVtpbl0gcFZkaXJlY3RSZWFsCisgKiBccGFyYW1baW5dIHBWZGlyZWN0SW1hZworICogXHBhcmFtW291dF0gcERub25UclJlYWwKKyAqIFxwYXJhbVtvdXRdIHBEbm9uVHJJbWFnCisgKi8KK3ZvaWQgVHNkQXBwbHkoY29uc3QgaW50IG51bUh5YnJpZEJhbmRzLCBjb25zdCBUU0RfREFUQSAqcFRzZERhdGEsIGludCAqcFRzZFRzLAorICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqcFZkaXJlY3RSZWFsLCBjb25zdCBGSVhQX0RCTCAqcFZkaXJlY3RJbWFnLAorICAgICAgICAgICAgICBGSVhQX0RCTCAqcERub25UclJlYWwsIEZJWFBfREJMICpwRG5vblRySW1hZyk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIFNBQ19UU0RfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL2luY2x1ZGUvc2FjZW5jX2xpYi5oIGIvbGliU0FDZW5jL2luY2x1ZGUvc2FjZW5jX2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OGNjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvaW5jbHVkZS9zYWNlbmNfbGliLmgKQEAgLTAsMCArMSw0MDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1heCBOZXVlbmRvcmYKKworICAgRGVzY3JpcHRpb246IEVuY29kZXIgTGlicmFyeSBJbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBFbmNvZGVyIEFQSQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKgorICAgXGZpbGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDRU5DX0xJQl9ICisjZGVmaW5lIFNBQ0VOQ19MSUJfSAorCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqICBTcGFjZSBlbmNvZGVyIGVycm9yIGNvZGVzLgorICovCit0eXBlZGVmIGVudW0geworICBTQUNFTkNfT0sgPSAweDAwMDAwMDAwLCAvKiE8IE5vIGVycm9yIGhhcHBlbmVkLiBBbGwgZmluZS4gKi8KKyAgU0FDRU5DX0lOVkFMSURfSEFORExFID0KKyAgICAgIDB4MDAwMDAwODAsIC8qITwgSGFuZGxlIHBhc3NlZCB0byBmdW5jdGlvbiBjYWxsIHdhcyBpbnZhbGlkLiAqLworICBTQUNFTkNfTUVNT1JZX0VSUk9SID0gMHgwMDAwMDgwMCwgLyohPCBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCisgIFNBQ0VOQ19JTklUX0VSUk9SID0gMHgwMDAwODAwMCwgICAvKiE8IEdlbmVyYWwgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCisgIFNBQ0VOQ19FTkNPREVfRVJST1IgPQorICAgICAgMHgwMDA4MDAwMCwgLyohPCBUaGUgZW5jb2RpbmcgcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnkgYW4gdW5leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgZXJyb3IuICovCisgIFNBQ0VOQ19QQVJBTV9FUlJPUiA9IDB4MDA4MDAwMDAsICAgICAgICAgICAvKiE8IEludmFsaWQgcnVudGltZSBwYXJhbWV0ZXIuICovCisgIFNBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVIgPSAweDAwODAwMDAxLCAvKiE8IFBhcmFtZXRlciBub3QgYXZhaWxhYmxlLiAqLworICBTQUNFTkNfSU5WQUxJRF9DT05GSUcgPSAweDAwODAwMDAyLCAgICAgICAgLyohPCBDb25maWd1cmF0aW9uIG5vdCBwcm92aWRlZC4gKi8KKyAgU0FDRU5DX1VOS05PV05fRVJST1IgPSAweDA4MDAwMDAwICAgICAgICAgIC8qITwgVW5rbm93biBlcnJvci4gKi8KKworfSBGREtfU0FDRU5DX0VSUk9SOworCit0eXBlZGVmIGVudW0geworICBTQUNFTkNfSU5WQUxJRF9NT0RFID0gMCwKKyAgU0FDRU5DXzIxMiA9IDgsCisgIFNBQ0VOQ19FU0NBUEUgPSAxNQorCit9IE1QNFNQQUNFRU5DX01PREU7CisKK3R5cGVkZWYgZW51bSB7CisgIFNBQ0VOQ19CQU5EU19JTlZBTElEID0gMCwKKyAgU0FDRU5DX0JBTkRTXzQgPSA0LAorICBTQUNFTkNfQkFORFNfNSA9IDUsCisgIFNBQ0VOQ19CQU5EU183ID0gNywKKyAgU0FDRU5DX0JBTkRTXzkgPSA5LAorICBTQUNFTkNfQkFORFNfMTIgPSAxMiwKKyAgU0FDRU5DX0JBTkRTXzE1ID0gMTUsCisgIFNBQ0VOQ19CQU5EU18yMyA9IDIzCisKK30gTVA0U1BBQ0VFTkNfQkFORFNfQ09ORklHOworCit0eXBlZGVmIGVudW0geworICBTQUNFTkNfUVVBTlRNT0RFX0lOVkFMSUQgPSAtMSwKKyAgU0FDRU5DX1FVQU5UTU9ERV9GSU5FID0gMCwKKyAgU0FDRU5DX1FVQU5UTU9ERV9FQlExID0gMSwKKyAgU0FDRU5DX1FVQU5UTU9ERV9FQlEyID0gMiwKKyAgU0FDRU5DX1FVQU5UTU9ERV9SU1ZEMyA9IDMKKworfSBNUDRTUEFDRUVOQ19RVUFOVE1PREU7CisKK3R5cGVkZWYgZW51bSB7CisgIFNBQ0VOQ19ETVhHQUlOX0lOVkFMSUQgPSAtMSwKKyAgU0FDRU5DX0RNWEdBSU5fMF9kQiA9IDAsCisgIFNBQ0VOQ19ETVhHQUlOXzFfNV9kQiA9IDEsCisgIFNBQ0VOQ19ETVhHQUlOXzNfZEIgPSAyLAorICBTQUNFTkNfRE1YR0FJTl80XzVfZEIgPSAzLAorICBTQUNFTkNfRE1YR0FJTl82X2RCID0gNCwKKyAgU0FDRU5DX0RNWEdBSU5fN181X2RCID0gNSwKKyAgU0FDRU5DX0RNWEdBSU5fOV9kQiA9IDYsCisgIFNBQ0VOQ19ETVhHQUlOXzEyX2RCID0gNworCit9IE1QNFNQQUNFRU5DX0RNWF9HQUlOOworCisvKioKKyAqIFxicmllZiAgU3BhY2UgRW5jb2RlciBzZXR0aW5nIHBhcmFtZXRlcnMuCisgKgorICogVXNlIEZES19zYWNlbmNfc2V0UGFyYW0oKSBmdW5jdGlvbiB0byBjb25maWd1cmUgdGhlIGludGVybmFsIHN0YXR1cyBvZiB0aGUKKyAqIGZvbGxvd2luZyBwYXJhbWV0ZXJzLgorICovCit0eXBlZGVmIGVudW0geworICBTQUNFTkNfTE9XREVMQVksIC8qITwgQ29uZmlndXJlIGxvd2RlbGF5IE1QRUcgU3Vycm91bmQuCisgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERpc2FibGUgTG93ZGVsYXkuIChkZWZhdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBFbmFibGUgTG93ZGVsYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IEVuYWJsZSBMb3dkZWxheSBpbmNsdWRpbmcga2VlcCBmcmFtZS4gKi8KKworICBTQUNFTkNfRU5DX01PREUsIC8qITwgQ29uZmlndXJlIGVuY29kZXIgdHJlZSBtb2RlLiBTZWUgOjpNUDRTUEFDRUVOQ19NT0RFIGZvcgorICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB2YWx1ZXMuICovCisKKyAgU0FDRU5DX1NBTVBMRVJBVEUsIC8qITwgQ29uZmlndXJlIGVuY29kZXIgc2FtcGxpbmcgcmF0ZS4gKi8KKworICBTQUNFTkNfRlJBTUVfVElNRV9TTE9UUywgLyohPCBDb25maWd1cmUgbnVtYmVyIG9mIHNsb3RzIHBlciBzcGF0aWFsIGZyYW1lLiAqLworCisgIFNBQ0VOQ19QQVJBTV9CQU5EUywgLyohPCBDb25maWd1cmUgbnVtYmVyIG9mIHBhcmFtZXRlciBiYW5kcy4gU2VlCisgICAgICAgICAgICAgICAgICAgICAgICAgOjpNUDRTUEFDRUVOQ19CQU5EU19DT05GSUcgZm9yIGF2YWlsYWJsZSB2YWx1ZXMuICovCisKKyAgU0FDRU5DX1RJTUVfRE9NX0RNWCwgLyohPCBDb25maWd1cmUgdGltZSBkb21haW4gZG93bm1peC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IE5vIHRpbWUgZG9tYWluIGRvd25taXguIChkZWZhdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogU3RhdGljIHRpbWUgZG9tYWluIGRvd25taXguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBFbmhhbmNlZCB0aW1lIGRvbWFpbiBkb3dubWl4LCBzdGVyZW8gdG8gbW9ubworICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LiAqLworCisgIFNBQ0VOQ19ETVhfR0FJTiwgLyohPCBDb25maWd1cmUgZG93bm1peCBnYWluLiBTZWUgOjpNUDRTUEFDRUVOQ19ETVhfR0FJTiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdmFsdWVzLiAqLworCisgIFNBQ0VOQ19DT0FSU0VfUVVBTlQsIC8qITwgVXNlIGNvYXJzZSBwYXJhbWV0ZXIgcXVhbnRpemF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogTm8gKGRlZmF1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBZZXMgKi8KKworICBTQUNFTkNfUVVBTlRfTU9ERSwgLyohPCBDb25maWd1cmUgcXVhbml0emF0aW9uIG1vZGUuIFNlZQorICAgICAgICAgICAgICAgICAgICAgICAgOjpNUDRTUEFDRUVOQ19RVUFOVE1PREUgZm9yIGF2YWlsYWJsZSB2YWx1ZXMuICovCisKKyAgU0FDRU5DX1RJTUVfQUxJR05NRU5ULCAvKiE8IENvbmZpZ3VyZSB0aW1lIGFsaWdubWVudCBpbiBzYW1wbGVzLiAqLworCisgIFNBQ0VOQ19JTkRFUEVOREVOQ1lfQ09VTlQsIC8qITwgQ29uZmlndXJlIHRoZSBpbmRlcGVuZGVuY3kgY291bnQuIChjb3VudCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5zIGluZGVwZW5kZW5jeUZsYWcgPT0gMSkgKi8KKworICBTQUNFTkNfSU5ERVBFTkRFTkNZX0ZBQ1RPUiwgLyohPCBIb3cgb2Z0ZW4gc2hvdWxkIHdlIHNldCB0aGUgaW5kZXBlbmRlbmN5IGZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIFNBQ0VOQ19OT05FIC8qITwgLS0tLS0tICovCisKK30gU1BBQ0VFTkNfUEFSQU07CisKKy8qKgorICogIERlc2NyaWJlcyBTcGF0aWFsIFNwZWNpZmljIENvbmZpZy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgblNzY1NpemVCaXRzOyAvKiE8IE51bWJlciBvZiB2YWxpZCBiaXRzIGluIHBTc2MgYnVmZmVyLiAqLworICBVQ0hBUiAqcFNzYzsgICAgICAvKiE8IFNwYXRpYWxTcGVjaWZpY0NvbmZpZyBidWZmZXIgaW4gYmluYXJ5IGZvcm1hdC4gKi8KKworfSBNUEVHNFNQQUNFRU5DX1NTQ0JVRjsKKworLyoqCisgKiAgUHJvdmlkZXMgc29tZSBpbmZvIGFib3V0IHRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIG5TYW1wbGVSYXRlOyAgICAgICAgIC8qITwgQ29uZmlndXJlZCBzYW1wbGluZyByYXRlLiovCisgIElOVCBuU2FtcGxlc0ZyYW1lOyAgICAgICAvKiE8IEZyYW1lIGxlbmd0aCBpbiBzYW1wbGVzLiAqLworICBJTlQgblRvdGFsSW5wdXRDaGFubmVsczsgLyohPCBOdW1iZXIgb2YgZXhwZWN0ZWQgYXVkaW8gaW5wdXQgY2hhbm5lbHMuICovCisgIElOVCBuRG14RGVsYXk7ICAgICAgICAgICAvKiE8IERlbGF5IG9mIHRoZSBkb3dubWl4ZWQgc2lnbmFsLiAqLworICBJTlQgbkNvZGVjRGVsYXk7ICAgICAgICAgLyohPCBEZWxheSBvZiB0aGUgd2hvbGUgZW4tL2RlY29kZWQgc2lnbmFsLCBpbmNsdWRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUtY29kZXIgZGVsYXkuICovCisgIElOVCBuRGVjb2RlckRlbGF5OyAgICAgICAvKiE8IERlbGF5IGFkZGVkIGJ5IHRoZSBNUDRTUEFDRSBkZWNvZGVyLiAqLworICBJTlQgblBheWxvYWREZWxheTsgICAgICAgLyohPCBEZWxheSBvZiB0aGUgcGF5bG9hZC4gKi8KKyAgSU5UIG5EaXNjYXJkT3V0RnJhbWVzOyAvKiE8IE51bWJlciBvZiBkbXggZnJhbWVzIHRvIGRpc2NhcmQgZm9yIGFsaWdubWVudCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtLiAqLworCisgIE1QRUc0U1BBQ0VFTkNfU1NDQlVGCisgICpwU3NjQnVmOyAvKiE8IFBvaW50ZXIgdG8gU3BhdGlhbCBTcGVjaWZpYyBDb25maWcgc3RydWN0dXJlLiAqLworCit9IE1QNFNQQUNFRU5DX0lORk87CisKKy8qKgorICogIE1QRUcgU3Vycm91bmQgZW5jb2RlciBoYW5kbGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IE1QNFNQQUNFX0VOQ09ERVIgKkhBTkRMRV9NUDRTUEFDRV9FTkNPREVSOworCisvKioKKyAqICBEZWZpbmVzIHRoZSBpbnB1dCBhcmd1bWVudHMgZm9yIGEgRkRLX3NhY2VuY19lbmNvZGUoKSBjYWxsLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBuSW5wdXRTYW1wbGVzOyAvKiE8IE51bWJlciBvZiB2YWxpZCBpbnB1dCBhdWRpbyBzYW1wbGVzIChtdWx0aXBsZSBvZiBpbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpLiAqLworICBVSU5UIGlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWw7IC8qITwgU2l6ZSBvZiBpbnB1dCBidWZmZXIgKGlucHV0IGF1ZGlvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcykgcGVyIGNoYW5uZWwuICovCisgIFVJTlQgaXNJbnB1dEludGVybGVhdmVkOyAvKiE8IEluZGljYXRlcyBpZiBpbnB1dCBhdWRpbyBzYW1wbGVzIGFyZSByZXByZXNlbnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYmxvY2tzIG9yIGludGVybGVhdmVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgOiBpbiBibG9ja3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMSA6IGludGVybGVhdmVkLiAqLworCit9IFNBQ0VOQ19JbkFyZ3M7CisKKy8qKgorICogIERlZmluZXMgdGhlIG91dHB1dCBhcmd1bWVudHMgZm9yIGEgRkRLX3NhY2VuY19lbmNvZGUoKSBjYWxsLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBuT3V0cHV0Qml0czsgICAgLyohPCBOdW1iZXIgb2YgdmFsaWQgcGF5bG9hZCBiaXRzIGdlbmVyYXRlZCBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICBGREtfc2FjZW5jX2VuY29kZSgpLiAqLworICBJTlQgbk91dHB1dFNhbXBsZXM7IC8qITwgTnVtYmVyIG9mIHZhbGlkIG91dHB1dCBhdWRpbyBzYW1wbGVzIGdlbmVyYXRlZCBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICBGREtfc2FjZW5jX2VuY29kZSgpLiAqLworICBVSU5UIG5TYW1wbGVzQ29uc3VtZWQ7IC8qITwgTnVtYmVyIG9mIGlucHV0IGF1ZGlvIHNhbXBsZXMgY29uc3VtZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREtfc2FjZW5jX2VuY29kZSgpLiAqLworCit9IFNBQ0VOQ19PdXRBcmdzOworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBcYnJpZWYgIE9wZW5zIGEgbmV3IGluc3RhY2Ugb2YgdGhlIE1QRUcgU3Vycm91bmQgZW5jb2Rlci4KKyAqCisgKiBccGFyYW0gcGhNcDRTcGFjZUVuYyAgICAgIFBvaW50ZXIgdG8gdGhlIGVuY29kZXIgaGFuZGxlIHRvIGJlIGRlYWxsb2NhdGVkLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gU0FDRU5DX09LLCBvbiBzdWNjZXNzLgorICogICAgICAgICAgLSBTQUNFTkNfSU5WQUxJRF9IQU5ETEUsIFNBQ0VOQ19NRU1PUllfRVJST1IsIG9uIGZhaWx1cmUuCisgKi8KK0ZES19TQUNFTkNfRVJST1IgRkRLX3NhY2VuY19vcGVuKEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSICpwaE1wNFNwYWNlRW5jKTsKKworLyoqCisgKiBcYnJpZWYgIEZpbmFsaXplcyBvcGVuaW5nIHByb2Nlc3Mgb2YgTVBFRyBTdXJyb3VuZCBlbmNvZGVyLgorICoKKyAqIFNob3dzLCBob3cgbWFueSBzYW1wbGVzIGFyZSBuZWVkZWQgYXMgaW5wdXQKKyAqCisgKiBccGFyYW0gaE1wNFNwYWNlRW5jICAgICAgIEEgdmFsaWQgTVBFRyBTdXJyb3VuZCBlbmNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBkbXhEZWxheSAgICAgICAgICAgRG93bm1peCBkZWxheS4KKyAqCisgKiBccmV0dXJuCisgKiAgICAgICAgICAtIFNBQ0VOQ19PSywgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgIC0gU0FDRU5DX0lOVkFMSURfSEFORExFLCBTQUNFTkNfSU5JVF9FUlJPUiwgU0FDRU5DX0lOVkFMSURfQ09ORklHLAorICogb24gZmFpbHVyZS4KKyAqLworRkRLX1NBQ0VOQ19FUlJPUiBGREtfc2FjZW5jX2luaXQoSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaE1wNFNwYWNlRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRteERlbGF5KTsKKworLyoqCisgKiBcYnJpZWYgIENsb3NlIHRoZSBNUEVHIFN1cnJvdW5kIGVuY29kZXIgaW5zdGFuY2UuCisgKgorICogRGVhbGxvY2F0ZSBlbmNvZGVyIGluc3RhbmNlIGFuZCBmcmVlIHdob2xlIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gcGhNcDRTcGFjZUVuYyAgICAgIFBvaW50ZXIgdG8gdGhlIGVuY29kZXIgaGFuZGxlIHRvIGJlIGRlYWxsb2NhdGVkLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gU0FDRU5DX09LLCBvbiBzdWNjZXNzLgorICogICAgICAgICAgLSBTQUNFTkNfSU5WQUxJRF9IQU5ETEUsIG9uIGZhaWx1cmUuCisgKi8KK0ZES19TQUNFTkNfRVJST1IgRkRLX3NhY2VuY19jbG9zZShIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiAqcGhNcDRTcGFjZUVuYyk7CisKKy8qKgorICogXGJyaWVmICBNUEVHIHN1cnJvdW5kIHBhcmFtZXRlciBleHRyYWN0aW9uLCBmcmFtd2lzZS4KKyAqCisgKiBccGFyYW0gaE1wNFNwYWNlRW5jICAgICAgIEEgdmFsaWQgTVBFRyBTdXJyb3VuZCBlbmNvZGVyIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuCisgKiAgICAgICAgICAtIFNBQ0VOQ19PSywgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgIC0gU0FDRU5DX0lOVkFMSURfSEFORExFLCBvbiBmYWlsdXJlLgorICovCitGREtfU0FDRU5DX0VSUk9SIEZES19zYWNlbmNfZW5jb2RlKGNvbnN0IEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhNcDRTcGFjZUVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX2J1ZkRlc2NyICppbkJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19idWZEZXNjciAqb3V0QnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0FDRU5DX0luQXJncyAqaW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUNFTkNfT3V0QXJncyAqb3V0YXJncyk7CisKKy8qKgorICogXGJyaWVmICBQcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBwcm9kdWNlZCBiaXRzdHJlYW0uCisgKgorICogXHBhcmFtIGhNcDRTcGFjZUVuYyAgICAgICBBIHZhbGlkIE1QRUcgU3Vycm91bmQgZW5jb2RlciBoYW5kbGUuCisgKiBccGFyYW0gcEluZm8gICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW5jb2RlciBpbmZvIHN0cnVjdCwgZmlsbGVkIG9uCisgKiByZXR1cm4uCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBTQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCisgKiAgICAgICAgICAtIFNBQ0VOQ19JTlZBTElEX0hBTkRMRSwgb24gZmFpbHVyZS4KKyAqLworRkRLX1NBQ0VOQ19FUlJPUiBGREtfc2FjZW5jX2dldEluZm8oY29uc3QgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaE1wNFNwYWNlRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVA0U1BBQ0VFTkNfSU5GTyAqY29uc3QgcEluZm8pOworCisvKioKKyAqIFxicmllZiAgU2V0IG9uZSBzaW5nbGUgTVBFRyBTdXJyb3VuZCBlbmNvZGVyIHBhcmFtZXRlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjb25maWd1cmF0aW9uIG9mIGFsbCBlbmNvZGVyIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluCisgKiA6OlNQQUNFRU5DX1BBUkFNLiBFYWNoIHBhcmFtZXRlciBtdXN0IGJlIHNldCB3aXRoIGEgc2VwYXJhdGUgZnVuY3Rpb24gY2FsbC4KKyAqIEFuIGludGVybmFsIHZhbGlkYXRpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgcmFuZ2Ugd2lsbCBiZSBkb25lLgorICoKKyAqIFxwYXJhbSBoTXA0U3BhY2VFbmMgICAgICAgQSB2YWxpZCBNUEVHIFN1cnJvdW5kIGVuY29kZXIgaGFuZGxlLgorICogXHBhcmFtIHBhcmFtICAgICAgICAgICAgICBQYXJhbWV0ZXIgdG8gYmUgc2V0LiBTZWUgOjpTUEFDRUVOQ19QQVJBTS4KKyAqIFxwYXJhbSB2YWx1ZSAgICAgICAgICAgICAgUGFyYW1ldGVyIHZhbHVlLiBTZWUgcGFyYW1ldGVyIGRlc2NyaXB0aW9uIGluCisgKiA6OlNQQUNFRU5DX1BBUkFNLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gU0FDRU5DX09LLCBvbiBzdWNjZXNzLgorICogICAgICAgICAgLSBTQUNFTkNfSU5WQUxJRF9IQU5ETEUsIFNBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVIsCisgKiBTQUNFTkNfSU5WQUxJRF9DT05GSUcsIG9uIGZhaWx1cmUuCisgKi8KK0ZES19TQUNFTkNfRVJST1IgRkRLX3NhY2VuY19zZXRQYXJhbShIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoTXA0U3BhY2VFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1BBQ0VFTkNfUEFSQU0gcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCB2YWx1ZSk7CisKKy8qKgorICogXGJyaWVmICBHZXQgaW5mb3JtYXRpb24gYWJvdXQgTVBFRyBTdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgYnVpbGQuCisgKgorICogRmlsbCBhIGdpdmVuIExJQl9JTkZPIHN0cnVjdHVyZSB3aXRoIGxpYnJhcnkgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBccGFyYW0gaW5mbyAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdC4KKyAqCisgKiBccmV0dXJuCisgKiAgICAgICAgICAtIFNBQ0VOQ19PSywgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgIC0gU0FDRU5DX0lOVkFMSURfSEFORExFLCBTQUNFTkNfSU5JVF9FUlJPUiwgb24gZmFpbHVyZS4KKyAqLworRkRLX1NBQ0VOQ19FUlJPUiBGREtfc2FjZW5jX2dldExpYkluZm8oTElCX0lORk8gKmluZm8pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU0FDRU5DX0xJQl9IICovCmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19iaXRzdHJlYW0uY3BwIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfYml0c3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWNmYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfYml0c3RyZWFtLmNwcApAQCAtMCwwICsxLDgyNiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgQml0c3RyZWFtIFdyaXRlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgInNhY2VuY19jb25zdC5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisjaW5jbHVkZSAic2FjZW5jX25sY19lbmMuaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNQVhfRlJFUV9SRVNfSU5ERVggOAorI2RlZmluZSBNQVhfU0FNUExJTkdfRlJFUVVFTkNZX0lOREVYIDEzCisjZGVmaW5lIFNBTVBMSU5HX0ZSRVFVRU5DWV9JTkRFWF9FU0NBUEUgMTUKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworICBTQ0hBUiBjbGRfb2xkW1NBQ0VOQ19NQVhfTlVNX0JPWEVTXVtNQVhfTlVNX0JJTlNdOworICBTQ0hBUiBpY2Nfb2xkW1NBQ0VOQ19NQVhfTlVNX0JPWEVTXVtNQVhfTlVNX0JJTlNdOworICBVQ0hBUiBxdWFudENvYXJzZUNsZFByZXZbU0FDRU5DX01BWF9OVU1fQk9YRVNdW01BWF9OVU1fUEFSQU1TXTsKKyAgVUNIQVIgcXVhbnRDb2Fyc2VJY2NQcmV2W1NBQ0VOQ19NQVhfTlVNX0JPWEVTXVtNQVhfTlVNX1BBUkFNU107CisKK30gUFJFVl9PVFREQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFBSRVZfT1RUREFUQSBwcmV2T3R0RGF0YTsKKworfSBTVEFUSUNfU1BBVElBTEZSQU1FOworCit0eXBlZGVmIHN0cnVjdCBCU0ZfSU5TVEFOQ0UgeworICBTUEFUSUFMU1BFQ0lGSUNDT05GSUcgc3BhdGlhbFNwZWNpZmljQ29uZmlnOworICBTUEFUSUFMRlJBTUUgZnJhbWU7CisgIFNUQVRJQ19TUEFUSUFMRlJBTUUgcHJldkZyYW1lRGF0YTsKKworfSBCU0ZfSU5TVEFOQ0U7CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBjb25zdCBJTlQgU2FtcGxlUmF0ZVRhYmxlW01BWF9TQU1QTElOR19GUkVRVUVOQ1lfSU5ERVhdID0geworICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLAorICAgIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCAgNzM1MH07CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBGcmVxUmVzQmluVGFibGVfTERbTUFYX0ZSRVFfUkVTX0lOREVYXSA9IHswLCAyMywgMTUsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIDcsICA1LCAgNH07CitzdGF0aWMgY29uc3QgVUNIQVIgRnJlcVJlc1N0cmlkZVRhYmxlX0xEW10gPSB7MSwgMiwgNSwgMjN9OworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIER1cGxpY2F0ZUxvc3NsZXNzRGF0YSgKKyAgICBjb25zdCBJTlQgc3RhcnRCb3gsIGNvbnN0IElOVCBzdG9wQm94LAorICAgIGNvbnN0IExPU1NMRVNTREFUQSAqY29uc3QgaExvc3NsZXNzRGF0YUZyb20sIGNvbnN0IElOVCBzZXRGcm9tLAorICAgIExPU1NMRVNTREFUQSAqY29uc3QgaExvc3NsZXNzRGF0YVRvLCBjb25zdCBJTlQgc2V0VG8pIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKE5VTEwgPT0gaExvc3NsZXNzRGF0YUZyb20pIHx8IChOVUxMID09IGhMb3NzbGVzc0RhdGFUbykpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IHN0YXJ0Qm94OyBpIDwgc3RvcEJveDsgaSsrKSB7CisgICAgICBoTG9zc2xlc3NEYXRhVG8tPmJzWFhYRGF0YU1vZGVbaV1bc2V0VG9dID0KKyAgICAgICAgICBoTG9zc2xlc3NEYXRhRnJvbS0+YnNYWFhEYXRhTW9kZVtpXVtzZXRGcm9tXTsKKyAgICAgIGhMb3NzbGVzc0RhdGFUby0+YnNEYXRhUGFpcltpXVtzZXRUb10gPQorICAgICAgICAgIGhMb3NzbGVzc0RhdGFGcm9tLT5ic0RhdGFQYWlyW2ldW3NldEZyb21dOworICAgICAgaExvc3NsZXNzRGF0YVRvLT5ic1F1YW50Q29hcnNlWFhYW2ldW3NldFRvXSA9CisgICAgICAgICAgaExvc3NsZXNzRGF0YUZyb20tPmJzUXVhbnRDb2Fyc2VYWFhbaV1bc2V0RnJvbV07CisgICAgICBoTG9zc2xlc3NEYXRhVG8tPmJzRnJlcVJlc1N0cmlkZVhYWFtpXVtzZXRUb10gPQorICAgICAgICAgIGhMb3NzbGVzc0RhdGFGcm9tLT5ic0ZyZXFSZXNTdHJpZGVYWFhbaV1bc2V0RnJvbV07CisgICAgfQorICB9CisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2R1cGxpY2F0ZVBhcmFtZXRlclNldCgKKyAgICBjb25zdCBTUEFUSUFMRlJBTUUgKmNvbnN0IGhGcm9tLCBjb25zdCBJTlQgc2V0RnJvbSwgU1BBVElBTEZSQU1FICpjb25zdCBoVG8sCisgICAgY29uc3QgSU5UIHNldFRvKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChOVUxMID09IGhGcm9tKSB8fCAoTlVMTCA9PSBoVG8pKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IGJveDsKKyAgICAvKiBPbmx5IENvcHkgUGFyYW1ldGVyIFNldCBzZWxlY3RpdmUgc3R1ZmYgKi8KKworICAgIC8qIE9UVC1EYXRhICovCisgICAgZm9yIChib3ggPSAwOyBib3ggPCBTQUNFTkNfTUFYX05VTV9CT1hFUzsgYm94KyspIHsKKyAgICAgIEZES21lbWNweShoVG8tPm90dERhdGEuY2xkW2JveF1bc2V0VG9dLCBoRnJvbS0+b3R0RGF0YS5jbGRbYm94XVtzZXRGcm9tXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoaEZyb20tPm90dERhdGEuY2xkWzBdWzBdKSk7CisgICAgICBGREttZW1jcHkoaFRvLT5vdHREYXRhLmljY1tib3hdW3NldFRvXSwgaEZyb20tPm90dERhdGEuaWNjW2JveF1bc2V0RnJvbV0sCisgICAgICAgICAgICAgICAgc2l6ZW9mKGhGcm9tLT5vdHREYXRhLmljY1swXVswXSkpOworICAgIH0KKworICAgIC8qIExPU1NMRVNTREFUQSAqLworICAgIER1cGxpY2F0ZUxvc3NsZXNzRGF0YSgwLCBTQUNFTkNfTUFYX05VTV9CT1hFUywgJmhGcm9tLT5DTERMb3NzbGVzc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZyb20sICZoVG8tPkNMRExvc3NsZXNzRGF0YSwgc2V0VG8pOworICAgIER1cGxpY2F0ZUxvc3NsZXNzRGF0YSgwLCBTQUNFTkNfTUFYX05VTV9CT1hFUywgJmhGcm9tLT5JQ0NMb3NzbGVzc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZyb20sICZoVG8tPklDQ0xvc3NsZXNzRGF0YSwgc2V0VG8pOworCisgIH0gLyogdmFsaWQgaGFuZGxlICovCisKKyAgcmV0dXJuIGVycm9yOworfQorCisvKiBzZXQgZnJhbWUgZGVmYXVsdHMgKi8KK3N0YXRpYyB2b2lkIGNsZWFyRnJhbWUoU1BBVElBTEZSQU1FICpjb25zdCBwRnJhbWUpIHsKKyAgRkRLbWVtY2xlYXIocEZyYW1lLCBzaXplb2YoU1BBVElBTEZSQU1FKSk7CisKKyAgcEZyYW1lLT5ic0luZGVwZW5kZW5jeUZsYWcgPSAxOworICBwRnJhbWUtPmZyYW1pbmdJbmZvLm51bVBhcmFtU2V0cyA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmUyY29hcnNlKFNDSEFSICpjb25zdCBkYXRhLCBjb25zdCBEQVRBX1RZUEUgZGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RhcnRCYW5kLCBjb25zdCBJTlQgbnVtQmFuZHMpIHsKKyAgaW50IGk7CisgIGlmIChkYXRhVHlwZSA9PSB0X0NMRCkgeworICAgIGZvciAoaSA9IHN0YXJ0QmFuZDsgaSA8IHN0YXJ0QmFuZCArIG51bUJhbmRzOyBpKyspIHsKKyAgICAgIGRhdGFbaV0gLz0gMjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gc3RhcnRCYW5kOyBpIDwgc3RhcnRCYW5kICsgbnVtQmFuZHM7IGkrKykgeworICAgICAgZGF0YVtpXSA+Pj0gMTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgY29hcnNlMmZpbmUoU0NIQVIgKmNvbnN0IGRhdGEsIGNvbnN0IERBVEFfVFlQRSBkYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdGFydEJhbmQsIGNvbnN0IElOVCBudW1CYW5kcykgeworICBpbnQgaTsKKworICBmb3IgKGkgPSBzdGFydEJhbmQ7IGkgPCBzdGFydEJhbmQgKyBudW1CYW5kczsgaSsrKSB7CisgICAgZGF0YVtpXSA8PD0gMTsKKyAgfQorCisgIGlmIChkYXRhVHlwZSA9PSB0X0NMRCkgeworICAgIGZvciAoaSA9IHN0YXJ0QmFuZDsgaSA8IHN0YXJ0QmFuZCArIG51bUJhbmRzOyBpKyspIHsKKyAgICAgIGlmIChkYXRhW2ldID09IC0xNCkgeworICAgICAgICBkYXRhW2ldID0gLTE1OworICAgICAgfSBlbHNlIGlmIChkYXRhW2ldID09IDE0KSB7CisgICAgICAgIGRhdGFbaV0gPSAxNTsKKyAgICAgIH0KKyAgICB9CisgIH0gLyogKGRhdGFUeXBlID09IHRfQ0xEKSAqLworfQorCitzdGF0aWMgVUNIQVIgZ2V0QnNGcmVxUmVzU3RyaWRlKGNvbnN0IElOVCBpbmRleCkgeworICBjb25zdCBVQ0hBUiAqcEZyZXFSZXNTdHJpZGVUYWJsZSA9IE5VTEw7CisgIGludCBmcmVxUmVzU3RyaWRlVGFibGVTaXplID0gMDsKKworICBwRnJlcVJlc1N0cmlkZVRhYmxlID0gRnJlcVJlc1N0cmlkZVRhYmxlX0xEOworICBmcmVxUmVzU3RyaWRlVGFibGVTaXplID0KKyAgICAgIHNpemVvZihGcmVxUmVzU3RyaWRlVGFibGVfTEQpIC8gc2l6ZW9mKCpGcmVxUmVzU3RyaWRlVGFibGVfTEQpOworCisgIHJldHVybiAoKChOVUxMICE9IHBGcmVxUmVzU3RyaWRlVGFibGUpICYmIChpbmRleCA+PSAwKSAmJgorICAgICAgICAgICAoaW5kZXggPCBmcmVxUmVzU3RyaWRlVGFibGVTaXplKSkKKyAgICAgICAgICAgICAgPyBwRnJlcVJlc1N0cmlkZVRhYmxlW2luZGV4XQorICAgICAgICAgICAgICA6IDEpOworfQorCisvKiB3cml0ZSBkYXRhIHRvIGJpdHN0cmVhbSAqLworc3RhdGljIHZvaWQgZWNEYXRhKEhBTkRMRV9GREtfQklUU1RSRUFNIGJpdHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICBTQ0hBUiBkYXRhW01BWF9OVU1fUEFSQU1TXVtNQVhfTlVNX0JJTlNdLAorICAgICAgICAgICAgICAgICAgIFNDSEFSIG9sZERhdGFbTUFYX05VTV9CSU5TXSwKKyAgICAgICAgICAgICAgICAgICBVQ0hBUiBxdWFudENvYXJzZVhYWHByZXZbTUFYX05VTV9QQVJBTVNdLAorICAgICAgICAgICAgICAgICAgIExPU1NMRVNTREFUQSAqY29uc3QgbG9zc2xlc3NEYXRhLCBjb25zdCBEQVRBX1RZUEUgZGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHBhcmFtSWR4LCBjb25zdCBJTlQgbnVtUGFyYW1TZXRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpbmRlcGVuZGVuY3lGbGFnLCBjb25zdCBJTlQgc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdG9wQmFuZCwgY29uc3QgSU5UIGRlZmF1bHRWYWx1ZSkgeworICBpbnQgcHMsIHBiLCBzdHJPZmZzZXQsIHBiU3RyaWRlLCBkYXRhQmFuZHMsIGk7CisgIGludCBhU3RyaWRlc1tNQVhfTlVNX0JJTlMgKyAxXSA9IHswfTsKKyAgU0hPUlQgY21wSWR4RGF0YVsyXVtNQVhfTlVNX0JJTlNdID0ge3swfX07CisgIFNIT1JUIGNtcE9sZERhdGFbTUFYX05VTV9CSU5TXSA9IHswfTsKKworICAvKiBic1hYWERhdGFNb2RlICovCisgIGlmIChpbmRlcGVuZGVuY3lGbGFnIHx8IChsb3NzbGVzc0RhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbcGFyYW1JZHhdWzBdICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudENvYXJzZVhYWHByZXZbcGFyYW1JZHhdKSkgeworICAgIGxvc3NsZXNzRGF0YS0+YnNYWFhEYXRhTW9kZVtwYXJhbUlkeF1bMF0gPSBGSU5FQ09BUlNFOworICB9IGVsc2UgeworICAgIGxvc3NsZXNzRGF0YS0+YnNYWFhEYXRhTW9kZVtwYXJhbUlkeF1bMF0gPSBLRUVQOworICAgIGZvciAoaSA9IHN0YXJ0QmFuZDsgaSA8IHN0b3BCYW5kOyBpKyspIHsKKyAgICAgIGlmIChkYXRhWzBdW2ldICE9IG9sZERhdGFbaV0pIHsKKyAgICAgICAgbG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVswXSA9IEZJTkVDT0FSU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEZES3dyaXRlQml0cyhiaXRzdHJlYW0sIGxvc3NsZXNzRGF0YS0+YnNYWFhEYXRhTW9kZVtwYXJhbUlkeF1bMF0sIDIpOworCisgIGZvciAocHMgPSAxOyBwcyA8IG51bVBhcmFtU2V0czsgcHMrKykgeworICAgIGlmIChsb3NzbGVzc0RhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbcGFyYW1JZHhdW3BzXSAhPQorICAgICAgICBsb3NzbGVzc0RhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbcGFyYW1JZHhdW3BzIC0gMV0pIHsKKyAgICAgIGxvc3NsZXNzRGF0YS0+YnNYWFhEYXRhTW9kZVtwYXJhbUlkeF1bcHNdID0gRklORUNPQVJTRTsKKyAgICB9IGVsc2UgeworICAgICAgbG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVtwc10gPSBLRUVQOworICAgICAgZm9yIChpID0gc3RhcnRCYW5kOyBpIDwgc3RvcEJhbmQ7IGkrKykgeworICAgICAgICBpZiAoZGF0YVtwc11baV0gIT0gZGF0YVtwcyAtIDFdW2ldKSB7CisgICAgICAgICAgbG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVtwc10gPSBGSU5FQ09BUlNFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgRkRLd3JpdGVCaXRzKGJpdHN0cmVhbSwgbG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVtwc10sIDIpOworICB9IC8qIGZvciBwcyAqLworCisgIC8qIENyZWF0ZSBkYXRhIHBhaXJzIGlmIHBvc3NpYmxlICovCisgIGZvciAocHMgPSAwOyBwcyA8IChudW1QYXJhbVNldHMgLSAxKTsgcHMrKykgeworICAgIGlmIChsb3NzbGVzc0RhdGEtPmJzWFhYRGF0YU1vZGVbcGFyYW1JZHhdW3BzXSA9PSBGSU5FQ09BUlNFKSB7CisgICAgICAvKiBDaGVjayBpZiBuZXh0IHBhcmFtZXRlciBzZXQgaXMgRklOQ09BUlNFICovCisgICAgICBpZiAobG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVtwcyArIDFdID09IEZJTkVDT0FSU0UpIHsKKyAgICAgICAgLyogV2UgaGF2ZSB0byBjaGVjayBpZiBwcyBhbmQgcHMrMSB1c2UgdGhlIHNhbWUgYnNYWFhRdWFudE1vZGUgKi8KKyAgICAgICAgLyogYW5kIGFsc28gaGF2ZSB0aGUgc2FtZSBzdHJpZGUgKi8KKyAgICAgICAgaWYgKChsb3NzbGVzc0RhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbcGFyYW1JZHhdW3BzICsgMV0gPT0KKyAgICAgICAgICAgICBsb3NzbGVzc0RhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbcGFyYW1JZHhdW3BzXSkgJiYKKyAgICAgICAgICAgIChsb3NzbGVzc0RhdGEtPmJzRnJlcVJlc1N0cmlkZVhYWFtwYXJhbUlkeF1bcHMgKyAxXSA9PQorICAgICAgICAgICAgIGxvc3NsZXNzRGF0YS0+YnNGcmVxUmVzU3RyaWRlWFhYW3BhcmFtSWR4XVtwc10pKSB7CisgICAgICAgICAgbG9zc2xlc3NEYXRhLT5ic0RhdGFQYWlyW3BhcmFtSWR4XVtwc10gPSAxOworICAgICAgICAgIGxvc3NsZXNzRGF0YS0+YnNEYXRhUGFpcltwYXJhbUlkeF1bcHMgKyAxXSA9IDE7CisKKyAgICAgICAgICAvKiBXZSBoYXZlIGEgZGF0YSBwYWlyIC0+IEp1bXAgdG8gdGhlIHBzIGFmdGVyIG5leHQgcHMqLworICAgICAgICAgIHBzKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIGRhdGFNb2RlIG9mIG5leHQgcHMgaXMgbm90IEZJTkVDT0FSU0Ugb3IgZG9lcyBub3QgdXNlIHRoZSBzYW1lCisgICAgICAgKiBic1hYWFF1YW50TW9kZS9zdHJpZGUgKi8KKyAgICAgIC8qIC0+IG5vIGRhdGFQYWlyIHBvc3NpYmxlICovCisgICAgICBsb3NzbGVzc0RhdGEtPmJzRGF0YVBhaXJbcGFyYW1JZHhdW3BzXSA9IDA7CisKKyAgICAgIC8qIEluaXRpYWxpemUgcHMgYWZ0ZXIgbmV4dCBwcyB0byBaZXJvIChvbmx5IGltcG9ydGFudCBmb3IgdGhlIGxhc3QKKyAgICAgICAqIHBhcmFtZXRlciBzZXQpICovCisgICAgICBsb3NzbGVzc0RhdGEtPmJzRGF0YVBhaXJbcGFyYW1JZHhdW3BzICsgMV0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAvKiBObyBGSU5FQ09BUlNFIC0+IG5vIGRhdGEgcGFpciBwb3NzaWJsZSAqLworICAgICAgbG9zc2xlc3NEYXRhLT5ic0RhdGFQYWlyW3BhcmFtSWR4XVtwc10gPSAwOworCisgICAgICAvKiBJbml0aWFsaXplIHBzIGFmdGVyIG5leHQgcHMgdG8gWmVybyAob25seSBpbXBvcnRhbnQgZm9yIHRoZSBsYXN0CisgICAgICAgKiBwYXJhbWV0ZXIgc2V0KSAqLworICAgICAgbG9zc2xlc3NEYXRhLT5ic0RhdGFQYWlyW3BhcmFtSWR4XVtwcyArIDFdID0gMDsKKyAgICB9CisgIH0gLyogZm9yIHBzICovCisKKyAgZm9yIChwcyA9IDA7IHBzIDwgbnVtUGFyYW1TZXRzOyBwcysrKSB7CisgICAgaWYgKGxvc3NsZXNzRGF0YS0+YnNYWFhEYXRhTW9kZVtwYXJhbUlkeF1bcHNdID09IERFRkFVTFQpIHsKKyAgICAgIC8qIFByZXBhcmUgb2xkIGRhdGEgKi8KKyAgICAgIGZvciAoaSA9IHN0YXJ0QmFuZDsgaSA8IHN0b3BCYW5kOyBpKyspIHsKKyAgICAgICAgb2xkRGF0YVtpXSA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgIH0KKyAgICAgIHF1YW50Q29hcnNlWFhYcHJldltwYXJhbUlkeF0gPSAwOyAvKiBEZWZhdWx0IGRhdGEgYXJlIGFsd2F5cyBmaW5lICovCisgICAgfQorCisgICAgaWYgKGxvc3NsZXNzRGF0YS0+YnNYWFhEYXRhTW9kZVtwYXJhbUlkeF1bcHNdID09IEZJTkVDT0FSU0UpIHsKKyAgICAgIEZES3dyaXRlQml0cyhiaXRzdHJlYW0sIGxvc3NsZXNzRGF0YS0+YnNEYXRhUGFpcltwYXJhbUlkeF1bcHNdLCAxKTsKKyAgICAgIEZES3dyaXRlQml0cyhiaXRzdHJlYW0sIGxvc3NsZXNzRGF0YS0+YnNRdWFudENvYXJzZVhYWFtwYXJhbUlkeF1bcHNdLCAxKTsKKyAgICAgIEZES3dyaXRlQml0cyhiaXRzdHJlYW0sIGxvc3NsZXNzRGF0YS0+YnNGcmVxUmVzU3RyaWRlWFhYW3BhcmFtSWR4XVtwc10sCisgICAgICAgICAgICAgICAgICAgMik7CisKKyAgICAgIGlmIChsb3NzbGVzc0RhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbcGFyYW1JZHhdW3BzXSAhPQorICAgICAgICAgIHF1YW50Q29hcnNlWFhYcHJldltwYXJhbUlkeF0pIHsKKyAgICAgICAgaWYgKHF1YW50Q29hcnNlWFhYcHJldltwYXJhbUlkeF0pIHsKKyAgICAgICAgICBjb2Fyc2UyZmluZShvbGREYXRhLCBkYXRhVHlwZSwgc3RhcnRCYW5kLCBzdG9wQmFuZCAtIHN0YXJ0QmFuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZmluZTJjb2Fyc2Uob2xkRGF0YSwgZGF0YVR5cGUsIHN0YXJ0QmFuZCwgc3RvcEJhbmQgLSBzdGFydEJhbmQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIEhhbmRsZSBzdHJpZGVzICovCisgICAgICBwYlN0cmlkZSA9CisgICAgICAgICAgZ2V0QnNGcmVxUmVzU3RyaWRlKGxvc3NsZXNzRGF0YS0+YnNGcmVxUmVzU3RyaWRlWFhYW3BhcmFtSWR4XVtwc10pOworICAgICAgZGF0YUJhbmRzID0gKHN0b3BCYW5kIC0gc3RhcnRCYW5kIC0gMSkgLyBwYlN0cmlkZSArIDE7CisKKyAgICAgIGFTdHJpZGVzWzBdID0gc3RhcnRCYW5kOworICAgICAgZm9yIChwYiA9IDE7IHBiIDw9IGRhdGFCYW5kczsgcGIrKykgeworICAgICAgICBhU3RyaWRlc1twYl0gPSBhU3RyaWRlc1twYiAtIDFdICsgcGJTdHJpZGU7CisgICAgICB9CisKKyAgICAgIHN0ck9mZnNldCA9IDA7CisgICAgICB3aGlsZSAoYVN0cmlkZXNbZGF0YUJhbmRzXSA+IHN0b3BCYW5kKSB7CisgICAgICAgIGlmIChzdHJPZmZzZXQgPCBkYXRhQmFuZHMpIHsKKyAgICAgICAgICBzdHJPZmZzZXQrKzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSBzdHJPZmZzZXQ7IGkgPD0gZGF0YUJhbmRzOyBpKyspIHsKKyAgICAgICAgICBhU3RyaWRlc1tpXS0tOworICAgICAgICB9CisgICAgICB9IC8qIHdoaWxlICovCisKKyAgICAgIGZvciAocGIgPSAwOyBwYiA8IGRhdGFCYW5kczsgcGIrKykgeworICAgICAgICBjbXBPbGREYXRhW3N0YXJ0QmFuZCArIHBiXSA9IG9sZERhdGFbYVN0cmlkZXNbcGJdXTsKKyAgICAgICAgY21wSWR4RGF0YVswXVtzdGFydEJhbmQgKyBwYl0gPSBkYXRhW3BzXVthU3RyaWRlc1twYl1dOworCisgICAgICAgIGlmIChsb3NzbGVzc0RhdGEtPmJzRGF0YVBhaXJbcGFyYW1JZHhdW3BzXSkgeworICAgICAgICAgIGNtcElkeERhdGFbMV1bc3RhcnRCYW5kICsgcGJdID0gZGF0YVtwcyArIDFdW2FTdHJpZGVzW3BiXV07CisgICAgICAgIH0KKyAgICAgIH0gLyogZm9yIHBiKi8KKworICAgICAgLyogRmluYWxseSBlbmNvZGUgKi8KKyAgICAgIGlmIChsb3NzbGVzc0RhdGEtPmJzRGF0YVBhaXJbcGFyYW1JZHhdW3BzXSkgeworICAgICAgICBmZGtfc2FjZW5jX2VjRGF0YVBhaXJFbmMoYml0c3RyZWFtLCBjbXBJZHhEYXRhLCBjbXBPbGREYXRhLCBkYXRhVHlwZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QmFuZCwgZGF0YUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zc2xlc3NEYXRhLT5ic1F1YW50Q29hcnNlWFhYW3BhcmFtSWR4XVtwc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlcGVuZGVuY3lGbGFnICYmIChwcyA9PSAwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmZGtfc2FjZW5jX2VjRGF0YVNpbmdsZUVuYyhiaXRzdHJlYW0sIGNtcElkeERhdGEsIGNtcE9sZERhdGEsIGRhdGFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBzdGFydEJhbmQsIGRhdGFCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zc2xlc3NEYXRhLT5ic1F1YW50Q29hcnNlWFhYW3BhcmFtSWR4XVtwc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVwZW5kZW5jeUZsYWcgJiYgKHBzID09IDApKTsKKyAgICAgIH0KKworICAgICAgLyogT3ZlcndyaXRlIG9sZCBkYXRhICovCisgICAgICBmb3IgKGkgPSBzdGFydEJhbmQ7IGkgPCBzdG9wQmFuZDsgaSsrKSB7CisgICAgICAgIGlmIChsb3NzbGVzc0RhdGEtPmJzRGF0YVBhaXJbcGFyYW1JZHhdW3BzXSkgeworICAgICAgICAgIG9sZERhdGFbaV0gPSBkYXRhW3BzICsgMV1baV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb2xkRGF0YVtpXSA9IGRhdGFbcHNdW2ldOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHF1YW50Q29hcnNlWFhYcHJldltwYXJhbUlkeF0gPQorICAgICAgICAgIGxvc3NsZXNzRGF0YS0+YnNRdWFudENvYXJzZVhYWFtwYXJhbUlkeF1bcHNdOworCisgICAgICAvKiBKdW1wIGZvcndhcmQgaWYgd2UgaGF2ZSBlbmNvZGVkIGEgZGF0YSBwYWlyICovCisgICAgICBpZiAobG9zc2xlc3NEYXRhLT5ic0RhdGFQYWlyW3BhcmFtSWR4XVtwc10pIHsKKyAgICAgICAgcHMrKzsKKyAgICAgIH0KKworICAgIH0gLyogaWYgKGxvc3NsZXNzRGF0YS0+YnNYWFhEYXRhTW9kZVtwYXJhbUlkeF1bcHNdID09IEZJTkVDT0FSU0UgKSAqLworICB9ICAgLyogZm9yIHBzICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQml0c3RyZWFtIGZvcm1hdHRlciBpbnRlcmZhY2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIGdldEJzRnJlcVJlc0luZGV4KGNvbnN0IElOVCBudW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3QgcGJzRnJlcVJlc0luZGV4KSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKE5VTEwgPT0gcGJzRnJlcVJlc0luZGV4KSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgY29uc3QgVUNIQVIgKnBGcmVxUmVzQmluVGFibGUgPSBGcmVxUmVzQmluVGFibGVfTEQ7CisgICAgaW50IGk7CisgICAgKnBic0ZyZXFSZXNJbmRleCA9IC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9GUkVRX1JFU19JTkRFWDsgaSsrKSB7CisgICAgICBpZiAobnVtQmFuZHMgPT0gcEZyZXFSZXNCaW5UYWJsZVtpXSkgeworICAgICAgICAqcGJzRnJlcVJlc0luZGV4ID0gaTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICgqcGJzRnJlcVJlc0luZGV4IDwgMCB8fCAqcGJzRnJlcVJlc0luZGV4ID49IE1BWF9GUkVRX1JFU19JTkRFWCkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgfQorICB9CisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgZ2V0U2FtcGxpbmdGcmVxdWVuY3lJbmRleCgKKyAgICBjb25zdCBJTlQgYnNTYW1wbGluZ0ZyZXF1ZW5jeSwgSU5UICpjb25zdCBwYnNTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4KSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKE5VTEwgPT0gcGJzU2FtcGxpbmdGcmVxdWVuY3lJbmRleCkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBpOworICAgICpwYnNTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gU0FNUExJTkdfRlJFUVVFTkNZX0lOREVYX0VTQ0FQRTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfU0FNUExJTkdfRlJFUVVFTkNZX0lOREVYOyBpKyspIHsKKyAgICAgIGlmIChic1NhbXBsaW5nRnJlcXVlbmN5ID09IFNhbXBsZVJhdGVUYWJsZVtpXSkgeyAvKnNwYXRpYWwgc2FtcGxpbmcgcmF0ZSovCisgICAgICAgICpwYnNTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gaTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBlcnJvcjsKK30KKworLyogZGVzdHJveSBlbmNvZGVyIGluc3RhbmNlICovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVzdHJveVNwYXRpYWxCaXRzdHJlYW1FbmNvZGVyKAorICAgIEhBTkRMRV9CU0ZfSU5TVEFOQ0UgKnNlbGZQdHIpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKHNlbGZQdHIgPT0gTlVMTCkgfHwgKCpzZWxmUHRyID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaWYgKCpzZWxmUHRyICE9IE5VTEwpIHsKKyAgICAgIEZES19GUkVFX01FTU9SWV8xRCgqc2VsZlB0cik7CisgICAgfQorICB9CisgIHJldHVybiBlcnJvcjsKK30KKworLyogY3JlYXRlIGVuY29kZXIgaW5zdGFuY2UgKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19jcmVhdGVTcGF0aWFsQml0c3RyZWFtRW5jb2RlcigKKyAgICBIQU5ETEVfQlNGX0lOU1RBTkNFICpzZWxmUHRyKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKE5VTEwgPT0gc2VsZlB0cikgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIC8qIGFsbG9jYXRlIGVuY29kZXIgc3RydWN0ICovCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRCgqc2VsZlB0ciwgMSwgQlNGX0lOU1RBTkNFKTsKKyAgfQorICByZXR1cm4gZXJyb3I7CisKK2JhaWw6CisgIGZka19zYWNlbmNfZGVzdHJveVNwYXRpYWxCaXRzdHJlYW1FbmNvZGVyKHNlbGZQdHIpOworICByZXR1cm4gKChTQUNFTkNfT0sgPT0gZXJyb3IpID8gU0FDRU5DX01FTU9SWV9FUlJPUiA6IGVycm9yKTsKK30KKworLyogaW5pdCBlbmNvZGVyIGluc3RhbmNlICovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfaW5pdFNwYXRpYWxCaXRzdHJlYW1FbmNvZGVyKAorICAgIEhBTkRMRV9CU0ZfSU5TVEFOQ0Ugc2VsZlB0cikgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChzZWxmUHRyID09IE5VTEwpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICAvKiBpbml0L2NsZWFyICovCisgICAgY2xlYXJGcmFtZSgmc2VsZlB0ci0+ZnJhbWUpOworCisgIH0gLyogdmFsaWQgaGFuZGxlICovCisgIHJldHVybiBlcnJvcjsKK30KKworLyogZ2V0IFNwYXRpYWxTcGVjaWZpY0NvbmZpZyBzdHJ1Y3QgKi8KK1NQQVRJQUxTUEVDSUZJQ0NPTkZJRyAqZmRrX3NhY2VuY19nZXRTcGF0aWFsU3BlY2lmaWNDb25maWcoCisgICAgSEFORExFX0JTRl9JTlNUQU5DRSBzZWxmUHRyKSB7CisgIHJldHVybiAoKHNlbGZQdHIgPT0gTlVMTCkgPyBOVUxMIDogJihzZWxmUHRyLT5zcGF0aWFsU3BlY2lmaWNDb25maWcpKTsKK30KKworLyogd3JpdGUgU3BhdGlhbFNwZWNpZmljQ29uZmlnIHRvIHN0cmVhbSAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3dyaXRlU3BhdGlhbFNwZWNpZmljQ29uZmlnKAorICAgIFNQQVRJQUxTUEVDSUZJQ0NPTkZJRyAqY29uc3Qgc3BhdGlhbFNwZWNpZmljQ29uZmlnLAorICAgIFVDSEFSICpjb25zdCBwT3V0cHV0QnVmZmVyLCBjb25zdCBJTlQgb3V0cHV0QnVmZmVyU2l6ZSwKKyAgICBJTlQgKmNvbnN0IHBuT3V0cHV0Qml0cykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworICBJTlQgYnNTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gMDsKKyAgSU5UIGJzRnJlcVJlcyA9IDA7CisKKyAgaWYgKChzcGF0aWFsU3BlY2lmaWNDb25maWcgPT0gTlVMTCkgfHwgKHBPdXRwdXRCdWZmZXIgPT0gTlVMTCkgfHwKKyAgICAgIChwbk91dHB1dEJpdHMgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBGREtfQklUU1RSRUFNIGJpdHN0cmVhbTsKKworICAgIC8qIEZpbmQgRnJlcVJlcyAqLworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZ2V0QnNGcmVxUmVzSW5kZXgoc3BhdGlhbFNwZWNpZmljQ29uZmlnLT5udW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZic0ZyZXFSZXMpKSkKKyAgICAgIGdvdG8gYmFpbDsKKworICAgIC8qIEZpbmQgU2FtcGxpbmdGcmVxdWVuY3lJbmRleCAqLworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZ2V0U2FtcGxpbmdGcmVxdWVuY3lJbmRleCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic1NhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnNTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4KSkpCisgICAgICBnb3RvIGJhaWw7CisKKyAgICAvKiBiaW5kIGV4dGVybiBidWZmZXIgdG8gYml0c3RyZWFtIGhhbmRsZSAqLworICAgIEZES2luaXRCaXRTdHJlYW0oJmJpdHN0cmVhbSwgcE91dHB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyU2l6ZSwgMCwgQlNfV1JJVEVSKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIHdyaXRlIHRvIGJpdHN0cmVhbSAqLworCisgICAgRkRLd3JpdGVCaXRzKCZiaXRzdHJlYW0sIGJzU2FtcGxpbmdGcmVxdWVuY3lJbmRleCwgNCk7CisKKyAgICBpZiAoYnNTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID09IDE1KSB7CisgICAgICBGREt3cml0ZUJpdHMoJmJpdHN0cmVhbSwgc3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic1NhbXBsaW5nRnJlcXVlbmN5LCAyNCk7CisgICAgfQorCisgICAgRkRLd3JpdGVCaXRzKCZiaXRzdHJlYW0sIHNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNGcmFtZUxlbmd0aCwgNSk7CisKKyAgICBGREt3cml0ZUJpdHMoJmJpdHN0cmVhbSwgYnNGcmVxUmVzLCAzKTsKKyAgICBGREt3cml0ZUJpdHMoJmJpdHN0cmVhbSwgc3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic1RyZWVDb25maWcsIDQpOworICAgIEZES3dyaXRlQml0cygmYml0c3RyZWFtLCBzcGF0aWFsU3BlY2lmaWNDb25maWctPmJzUXVhbnRNb2RlLCAyKTsKKworICAgIEZES3dyaXRlQml0cygmYml0c3RyZWFtLCAwLCAxKTsgLyogYnNBcmJpdHJhcnlEb3dubWl4ICovCisKKyAgICBGREt3cml0ZUJpdHMoJmJpdHN0cmVhbSwgc3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0ZpeGVkR2FpbkRNWCwgMyk7CisKKyAgICBGREt3cml0ZUJpdHMoJmJpdHN0cmVhbSwgVEVNUFNIQVBFX09GRiwgMik7CisgICAgRkRLd3JpdGVCaXRzKCZiaXRzdHJlYW0sIHNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNEZWNvcnJDb25maWcsIDIpOworCisgICAgRkRLYnl0ZUFsaWduKCZiaXRzdHJlYW0sIDApOyAvKiBieXRlIGFsaWdubWVudCAqLworCisgICAgLyogcmV0dXJuIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpdHN0cmVhbSAqLworICAgIGlmICgoKnBuT3V0cHV0Qml0cyA9IEZES2dldFZhbGlkQml0cygmYml0c3RyZWFtKSkgPgorICAgICAgICAob3V0cHV0QnVmZmVyU2l6ZSAqIDgpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiB0ZXJtaW5hdGUgYnVmZmVyIHdpdGggYWxpZ25tZW50ICovCisgICAgRkRLYnl0ZUFsaWduKCZiaXRzdHJlYW0sIDApOworCisgIH0gLyogdmFsaWQgaGFuZGxlICovCisKK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworLyogZ2V0IFNwYXRpYWxGcmFtZSBzdHJ1Y3QgKi8KK1NQQVRJQUxGUkFNRSAqZmRrX3NhY2VuY19nZXRTcGF0aWFsRnJhbWUoSEFORExFX0JTRl9JTlNUQU5DRSBzZWxmUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTUEFUSUFMRlJBTUVfVFlQRSBmcmFtZVR5cGUpIHsKKyAgaW50IGlkeCA9IC0xOworCisgIHN3aXRjaCAoZnJhbWVUeXBlKSB7CisgICAgY2FzZSBSRUFEX1NQQVRJQUxGUkFNRToKKyAgICBjYXNlIFdSSVRFX1NQQVRJQUxGUkFNRToKKyAgICAgIGlkeCA9IDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWR4ID0gLTE7IC8qIGludmFsaWQgY29uZmlndXJhdGlvbiAqLworICB9ICAgICAgICAgICAgIC8qIHN3aXRjaCBmcmFtZVR5cGUgKi8KKworICByZXR1cm4gKCgoc2VsZlB0ciA9PSBOVUxMKSB8fCAoaWR4ID09IC0xKSkgPyBOVUxMIDogJnNlbGZQdHItPmZyYW1lKTsKK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1Igd3JpdGVGcmFtaW5nSW5mbyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGUkFNSU5HSU5GTyAqY29uc3QgcEZyYW1pbmdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGgpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKGhCaXRzdHJlYW0gPT0gTlVMTCkgfHwgKHBGcmFtaW5nSW5mbyA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCBwRnJhbWluZ0luZm8tPmJzRnJhbWluZ1R5cGUsIDEpOworICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCBwRnJhbWluZ0luZm8tPm51bVBhcmFtU2V0cyAtIDEsIDEpOworCisgICAgaWYgKHBGcmFtaW5nSW5mby0+YnNGcmFtaW5nVHlwZSkgeworICAgICAgaW50IHBzID0gMDsKKyAgICAgIGludCBudW1QYXJhbVNldHMgPSBwRnJhbWluZ0luZm8tPm51bVBhcmFtU2V0czsKKworICAgICAgeworICAgICAgICBmb3IgKHBzID0gMDsgcHMgPCBudW1QYXJhbVNldHM7IHBzKyspIHsKKyAgICAgICAgICBpbnQgYml0c1BhcmFtU2xvdCA9IDA7CisgICAgICAgICAgd2hpbGUgKCgxIDw8IGJpdHNQYXJhbVNsb3QpIDwgKGZyYW1lTGVuZ3RoICsgMSkpIGJpdHNQYXJhbVNsb3QrKzsKKyAgICAgICAgICBpZiAoYml0c1BhcmFtU2xvdCA+IDApCisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwgcEZyYW1pbmdJbmZvLT5ic1BhcmFtU2xvdHNbcHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNQYXJhbVNsb3QpOworICAgICAgICB9CisgICAgICB9CisgICAgfSAvKiBwRnJhbWluZ0luZm8tPmJzRnJhbWluZ1R5cGUgKi8KKyAgfSAgIC8qIHZhbGlkIGhhbmRsZSAqLworCisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1Igd3JpdGVTbWdEYXRhKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU01HREFUQSAqY29uc3QgcFNtZ0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bVBhcmFtU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZGF0YUJhbmRzKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChoQml0c3RyZWFtID09IE5VTEwpIHx8IChwU21nRGF0YSA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bVBhcmFtU2V0czsgaSsrKSB7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwgcFNtZ0RhdGEtPmJzU21vb3RoTW9kZVtpXSwgMik7CisKKyAgICAgIGlmIChwU21nRGF0YS0+YnNTbW9vdGhNb2RlW2ldID49IDIpIHsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIHBTbWdEYXRhLT5ic1Ntb290aFRpbWVbaV0sIDIpOworICAgICAgfQorICAgICAgaWYgKHBTbWdEYXRhLT5ic1Ntb290aE1vZGVbaV0gPT0gMykgeworICAgICAgICBjb25zdCBpbnQgc3RyaWRlID0gZ2V0QnNGcmVxUmVzU3RyaWRlKHBTbWdEYXRhLT5ic0ZyZXFSZXNTdHJpZGVbaV0pOworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwgcFNtZ0RhdGEtPmJzRnJlcVJlc1N0cmlkZVtpXSwgMik7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkYXRhQmFuZHM7IGogKz0gc3RyaWRlKSB7CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIHBTbWdEYXRhLT5ic1NtZ0RhdGFbaV1bal0sIDEpOworICAgICAgICB9CisgICAgICB9CisgICAgfSAvKiBmb3IgaSAqLworICB9ICAgLyogdmFsaWQgaGFuZGxlICovCisKKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiB3cml0ZU90dERhdGEoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSwgUFJFVl9PVFREQVRBICpjb25zdCBwUHJldk90dERhdGEsCisgICAgT1RUREFUQSAqY29uc3QgcE90dERhdGEsIGNvbnN0IE9UVENPTkZJRyBvdHRDb25maWdbU0FDRU5DX01BWF9OVU1fQk9YRVNdLAorICAgIExPU1NMRVNTREFUQSAqY29uc3QgcENMRExvc3NsZXNzRGF0YSwgTE9TU0xFU1NEQVRBICpjb25zdCBwSUNDTG9zc2xlc3NEYXRhLAorICAgIGNvbnN0IElOVCBudW1PdHRCb3hlcywgY29uc3QgSU5UIG51bUJhbmRzLCBjb25zdCBJTlQgbnVtUGFyYW1TZXRzLAorICAgIGNvbnN0IElOVCBic0luZGVwZW5kZW5jeUZsYWcpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKGhCaXRzdHJlYW0gPT0gTlVMTCkgfHwgKHBQcmV2T3R0RGF0YSA9PSBOVUxMKSB8fCAocE90dERhdGEgPT0gTlVMTCkgfHwKKyAgICAgIChvdHRDb25maWcgPT0gTlVMTCkgfHwgKHBDTERMb3NzbGVzc0RhdGEgPT0gTlVMTCkgfHwKKyAgICAgIChwSUNDTG9zc2xlc3NEYXRhID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bU90dEJveGVzOyBpKyspIHsKKyAgICAgIGVjRGF0YShoQml0c3RyZWFtLCBwT3R0RGF0YS0+Y2xkW2ldLCBwUHJldk90dERhdGEtPmNsZF9vbGRbaV0sCisgICAgICAgICAgICAgcFByZXZPdHREYXRhLT5xdWFudENvYXJzZUNsZFByZXZbaV0sIHBDTERMb3NzbGVzc0RhdGEsIHRfQ0xELCBpLAorICAgICAgICAgICAgIG51bVBhcmFtU2V0cywgYnNJbmRlcGVuZGVuY3lGbGFnLCAwLCBvdHRDb25maWdbaV0uYnNPdHRCYW5kcywgMTUpOworICAgIH0KKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT3R0Qm94ZXM7IGkrKykgeworICAgICAgICB7CisgICAgICAgICAgZWNEYXRhKGhCaXRzdHJlYW0sIHBPdHREYXRhLT5pY2NbaV0sIHBQcmV2T3R0RGF0YS0+aWNjX29sZFtpXSwKKyAgICAgICAgICAgICAgICAgcFByZXZPdHREYXRhLT5xdWFudENvYXJzZUljY1ByZXZbaV0sIHBJQ0NMb3NzbGVzc0RhdGEsIHRfSUNDLAorICAgICAgICAgICAgICAgICBpLCBudW1QYXJhbVNldHMsIGJzSW5kZXBlbmRlbmN5RmxhZywgMCwgbnVtQmFuZHMsIDApOworICAgICAgICB9CisgICAgICB9IC8qIGZvciBpICovCisgICAgfQorICB9IC8qIHZhbGlkIGhhbmRsZSAqLworCisgIHJldHVybiBlcnJvcjsKK30KKworLyogd3JpdGUgZXh0ZW5zaW9uIGZyYW1lIGRhdGEgdG8gc3RyZWFtICovCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBXcml0ZVNwYXRpYWxFeHRlbnNpb25GcmFtZSgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0sIEhBTkRMRV9CU0ZfSU5TVEFOQ0Ugc2VsZikgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoYml0c3RyZWFtID09IE5VTEwpIHx8IChzZWxmID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgRkRLYnl0ZUFsaWduKGJpdHN0cmVhbSwgMCk7CisgIH0gLyogdmFsaWQgaGFuZGxlICovCisKKyAgcmV0dXJuIGVycm9yOworfQorCisvKiB3cml0ZSBmcmFtZSBkYXRhIHRvIHN0cmVhbSAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3dyaXRlU3BhdGlhbEZyYW1lKFVDSEFSICpjb25zdCBwT3V0cHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBvdXRwdXRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3QgcG5PdXRwdXRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CU0ZfSU5TVEFOQ0Ugc2VsZlB0cikgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgocE91dHB1dEJ1ZmZlciA9PSBOVUxMKSB8fCAocG5PdXRwdXRCaXRzID09IE5VTEwpIHx8IChzZWxmUHRyID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgU1BBVElBTEZSQU1FICpmcmFtZSA9IE5VTEw7CisgICAgU1BBVElBTFNQRUNJRklDQ09ORklHICpjb25maWcgPSBOVUxMOworICAgIEZES19CSVRTVFJFQU0gYml0c3RyZWFtOworCisgICAgaW50IGksIGosIG51bVBhcmFtU2V0cywgbnVtT3R0Qm94ZXM7CisKKyAgICBpZiAoKE5VTEwgPT0KKyAgICAgICAgIChmcmFtZSA9IGZka19zYWNlbmNfZ2V0U3BhdGlhbEZyYW1lKHNlbGZQdHIsIFJFQURfU1BBVElBTEZSQU1FKSkpIHx8CisgICAgICAgIChOVUxMID09IChjb25maWcgPSAmKHNlbGZQdHItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZykpKSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgbnVtT3R0Qm94ZXMgPSBzZWxmUHRyLT5zcGF0aWFsU3BlY2lmaWNDb25maWcudHJlZURlc2NyaXB0aW9uLm51bU90dEJveGVzOworCisgICAgbnVtUGFyYW1TZXRzID0gZnJhbWUtPmZyYW1pbmdJbmZvLm51bVBhcmFtU2V0czsKKworICAgIGlmIChmcmFtZS0+YlVzZUJCQ3VlcykgeworICAgICAgZm9yIChpID0gMDsgaSA8IFNBQ0VOQ19NQVhfTlVNX0JPWEVTOyBpKyspIHsKKyAgICAgICAgLyogSWYgYSB0cmFuc2llbnQgd2FzIGRldGVjdGVkLCBmb3JjZSBvbmx5IHRoZSBzZWNvbmQgcHMgYnJvYWQgYmFuZCAqLworICAgICAgICBpZiAobnVtUGFyYW1TZXRzID09IDEpIHsKKyAgICAgICAgICBmcmFtZS0+Q0xETG9zc2xlc3NEYXRhLmJzRnJlcVJlc1N0cmlkZVhYWFtpXVswXSA9IDM7CisgICAgICAgICAgZnJhbWUtPklDQ0xvc3NsZXNzRGF0YS5ic0ZyZXFSZXNTdHJpZGVYWFhbaV1bMF0gPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaiA9IDE7IGogPCBNQVhfTlVNX1BBUkFNUzsgaisrKSB7CisgICAgICAgICAgICBmcmFtZS0+Q0xETG9zc2xlc3NEYXRhLmJzRnJlcVJlc1N0cmlkZVhYWFtpXVtqXSA9IDM7CisgICAgICAgICAgICBmcmFtZS0+SUNDTG9zc2xlc3NEYXRhLmJzRnJlcVJlc1N0cmlkZVhYWFtpXVtqXSA9IDM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSAvKiBmcmFtZS0+YlVzZUJCQ3VlcyAqLworCisgICAgLyogYmluZCBleHRlcm4gYnVmZmVyIHRvIGJpdHN0cmVhbSBoYW5kbGUgKi8KKyAgICBGREtpbml0Qml0U3RyZWFtKCZiaXRzdHJlYW0sIHBPdXRwdXRCdWZmZXIsIG91dHB1dEJ1ZmZlclNpemUsIDAsIEJTX1dSSVRFUik7CisKKyAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IHdyaXRlRnJhbWluZ0luZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiaXRzdHJlYW0sICYoZnJhbWUtPmZyYW1pbmdJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZlB0ci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnLmJzRnJhbWVMZW5ndGgpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIHdyaXRlIGJzSW5kZXBlbmRlbmN5RmxhZyAqLworICAgIEZES3dyaXRlQml0cygmYml0c3RyZWFtLCBmcmFtZS0+YnNJbmRlcGVuZGVuY3lGbGFnLCAxKTsKKworICAgIC8qIHdyaXRlIHNwYXRpYWwgZGF0YSB0byBiaXRzdHJlYW0gKi8KKyAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgIChlcnJvciA9IHdyaXRlT3R0RGF0YSgmYml0c3RyZWFtLCAmc2VsZlB0ci0+cHJldkZyYW1lRGF0YS5wcmV2T3R0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZS0+b3R0RGF0YSwgY29uZmlnLT5vdHRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWUtPkNMRExvc3NsZXNzRGF0YSwgJmZyYW1lLT5JQ0NMb3NzbGVzc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1PdHRCb3hlcywgY29uZmlnLT5udW1CYW5kcywgbnVtUGFyYW1TZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmJzSW5kZXBlbmRlbmN5RmxhZykpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gd3JpdGVTbWdEYXRhKCZiaXRzdHJlYW0sICZmcmFtZS0+c21nRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1QYXJhbVNldHMsIGNvbmZpZy0+bnVtQmFuZHMpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIGJ5dGUgYWxpZ25tZW50ICovCisgICAgRkRLYnl0ZUFsaWduKCZiaXRzdHJlYW0sIDApOworCisgICAgLyogV3JpdGUgU3BhdGlhbEV4dGVuc2lvbkZyYW1lICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAoZXJyb3IgPSBXcml0ZVNwYXRpYWxFeHRlbnNpb25GcmFtZSgmYml0c3RyZWFtLCBzZWxmUHRyKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PQorICAgICAgICAoZnJhbWUgPSBmZGtfc2FjZW5jX2dldFNwYXRpYWxGcmFtZShzZWxmUHRyLCBXUklURV9TUEFUSUFMRlJBTUUpKSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgY2xlYXJGcmFtZShmcmFtZSk7CisKKyAgICAvKiByZXR1cm4gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYml0c3RyZWFtICovCisgICAgaWYgKCgqcG5PdXRwdXRCaXRzID0gRkRLZ2V0VmFsaWRCaXRzKCZiaXRzdHJlYW0pKSA+CisgICAgICAgIChvdXRwdXRCdWZmZXJTaXplICogOCkpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIHRlcm1pbmF0ZSBidWZmZXIgd2l0aCBhbGlnbm1lbnQgKi8KKyAgICBGREtieXRlQWxpZ24oJmJpdHN0cmVhbSwgMCk7CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL3NyYy9zYWNlbmNfYml0c3RyZWFtLmggYi9saWJTQUNlbmMvc3JjL3NhY2VuY19iaXRzdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I3YjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfYml0c3RyZWFtLmgKQEAgLTAsMCArMSwyOTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIEJpdHN0cmVhbSBXcml0ZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNFTkNfQklUU1RSRUFNX0gKKyNkZWZpbmUgU0FDRU5DX0JJVFNUUkVBTV9ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAiRkRLX21hdHJpeENhbGxvYy5oIgorI2luY2x1ZGUgInNhY2VuY19saWIuaCIKKyNpbmNsdWRlICJzYWNlbmNfY29uc3QuaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNQVhfTlVNX0JJTlMgMjMKKyNkZWZpbmUgTUFYX05VTV9QQVJBTVMgMgorI2RlZmluZSBNQVhfTlVNX09VVFBVVENIQU5ORUxTIFNBQ0VOQ19NQVhfT1VUUFVUX0NIQU5ORUxTCisjZGVmaW5lIE1BWF9USU1FX1NMT1RTIDMyCisKK3R5cGVkZWYgZW51bSB7CisgIFRSRUVfMjEyID0gNywKKyAgVFJFRV9FU0NBUEUgPSAxNQorCit9IFRSRUVDT05GSUc7CisKK3R5cGVkZWYgZW51bSB7CisgIEZSRVFfUkVTXzQwID0gMCwKKyAgRlJFUV9SRVNfMjAgPSAxLAorICBGUkVRX1JFU18xMCA9IDIsCisgIEZSRVFfUkVTXzUgPSAzCisKK30gRlJFUTsKKwordHlwZWRlZiBlbnVtIHsKKyAgUVVBTlRNT0RFX0lOVkFMSUQgPSAtMSwKKyAgUVVBTlRNT0RFX0ZJTkUgPSAwLAorICBRVUFOVE1PREVfRUJRMSA9IDEsCisgIFFVQU5UTU9ERV9FQlEyID0gMgorCit9IFFVQU5UTU9ERTsKKwordHlwZWRlZiBlbnVtIHsKKyAgVEVNUFNIQVBFX09GRiA9IDAKKworfSBURU1QU0hBUEVDT05GSUc7CisKK3R5cGVkZWYgZW51bSB7CisgIEZJWEVER0FJTkRNWF9JTlZBTElEID0gLTEsCisgIEZJWEVER0FJTkRNWF8wID0gMCwKKyAgRklYRURHQUlORE1YXzEgPSAxLAorICBGSVhFREdBSU5ETVhfMiA9IDIsCisgIEZJWEVER0FJTkRNWF8zID0gMywKKyAgRklYRURHQUlORE1YXzQgPSA0LAorICBGSVhFREdBSU5ETVhfNSA9IDUsCisgIEZJWEVER0FJTkRNWF82ID0gNiwKKyAgRklYRURHQUlORE1YXzcgPSA3CisKK30gRklYRURHQUlORE1YQ09ORklHOworCit0eXBlZGVmIGVudW0geworICBERUNPUlJfSU5WQUxJRCA9IC0xLAorICBERUNPUlJfUU1GU1BMSVQwID0gMCwgLyogUU1GIHNwbGl0ZnJlcTogMywgMTUsIDI0LCA2NSAqLworICBERUNPUlJfUU1GU1BMSVQxID0gMSwgLyogUU1GIHNwbGl0ZnJlcTogMywgNTAsIDY1LCA2NSAqLworICBERUNPUlJfUU1GU1BMSVQyID0gMiAgLyogUU1GIHNwbGl0ZnJlcTogMCwgMTUsIDY1LCA2NSAqLworCit9IERFQ09SUkNPTkZJRzsKKwordHlwZWRlZiBlbnVtIHsKKyAgREVGQVVMVCA9IDAsCisgIEtFRVAgPSAxLAorICBJTlRFUlBPTEFURSA9IDIsCisgIEZJTkVDT0FSU0UgPSAzCisKK30gREFUQV9NT0RFOworCit0eXBlZGVmIGVudW0geworICBSRUFEX1NQQVRJQUxGUkFNRSA9IDAsCisgIFdSSVRFX1NQQVRJQUxGUkFNRSA9IDEKKworfSBTUEFUSUFMRlJBTUVfVFlQRTsKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgbnVtT3R0Qm94ZXM7CisgIElOVCBudW1JbkNoYW47CisgIElOVCBudW1PdXRDaGFuOworCit9IFRSRUVERVNDUklQVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgYnNPdHRCYW5kczsKKworfSBPVFRDT05GSUc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIGJzU2FtcGxpbmdGcmVxdWVuY3k7IC8qIGZvciBic1NhbXBsaW5nRnJlcXVlbmN5SW5kZXggKi8KKyAgSU5UIGJzRnJhbWVMZW5ndGg7CisgIElOVCBudW1CYW5kczsgLyogZm9yIGJzRnJlcVJlcyAqLworICBUUkVFQ09ORklHIGJzVHJlZUNvbmZpZzsKKyAgUVVBTlRNT0RFIGJzUXVhbnRNb2RlOworICBGSVhFREdBSU5ETVhDT05GSUcgYnNGaXhlZEdhaW5ETVg7CisgIGludCBic0VudlF1YW50TW9kZTsKKyAgREVDT1JSQ09ORklHIGJzRGVjb3JyQ29uZmlnOworICBUUkVFREVTQ1JJUFRJT04gdHJlZURlc2NyaXB0aW9uOworICBPVFRDT05GSUcgb3R0Q29uZmlnW1NBQ0VOQ19NQVhfTlVNX0JPWEVTXTsKKworfSBTUEFUSUFMU1BFQ0lGSUNDT05GSUc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgYnNGcmFtaW5nVHlwZTsKKyAgVUNIQVIgbnVtUGFyYW1TZXRzOworICBVQ0hBUiBic1BhcmFtU2xvdHNbTUFYX05VTV9QQVJBTVNdOworCit9IEZSQU1JTkdJTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNDSEFSIGNsZFtTQUNFTkNfTUFYX05VTV9CT1hFU11bTUFYX05VTV9QQVJBTVNdW01BWF9OVU1fQklOU107CisgIFNDSEFSIGljY1tTQUNFTkNfTUFYX05VTV9CT1hFU11bTUFYX05VTV9QQVJBTVNdW01BWF9OVU1fQklOU107CisKK30gT1RUREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBic1Ntb290aE1vZGVbTUFYX05VTV9QQVJBTVNdOworICBVQ0hBUiBic1Ntb290aFRpbWVbTUFYX05VTV9QQVJBTVNdOworICBVQ0hBUiBic0ZyZXFSZXNTdHJpZGVbTUFYX05VTV9QQVJBTVNdOworICBVQ0hBUiBic1NtZ0RhdGFbTUFYX05VTV9QQVJBTVNdW01BWF9OVU1fQklOU107CisKK30gU01HREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBic0VudlNoYXBlQ2hhbm5lbFtNQVhfTlVNX09VVFBVVENIQU5ORUxTXTsKKyAgVUNIQVIgYnNFbnZTaGFwZURhdGFbTUFYX05VTV9PVVRQVVRDSEFOTkVMU11bTUFYX1RJTUVfU0xPVFNdOworCit9IFRFTVBTSEFQRURBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgYnNYWFhEYXRhTW9kZVtTQUNFTkNfTUFYX05VTV9CT1hFU11bTUFYX05VTV9QQVJBTVNdOworICBVQ0hBUiBic0RhdGFQYWlyW1NBQ0VOQ19NQVhfTlVNX0JPWEVTXVtNQVhfTlVNX1BBUkFNU107CisgIFVDSEFSIGJzUXVhbnRDb2Fyc2VYWFhbU0FDRU5DX01BWF9OVU1fQk9YRVNdW01BWF9OVU1fUEFSQU1TXTsKKyAgVUNIQVIgYnNGcmVxUmVzU3RyaWRlWFhYW1NBQ0VOQ19NQVhfTlVNX0JPWEVTXVtNQVhfTlVNX1BBUkFNU107CisKK30gTE9TU0xFU1NEQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEZSQU1JTkdJTkZPIGZyYW1pbmdJbmZvOworICBVQ0hBUiBic0luZGVwZW5kZW5jeUZsYWc7CisgIE9UVERBVEEgb3R0RGF0YTsKKyAgU01HREFUQSBzbWdEYXRhOworICBURU1QU0hBUEVEQVRBIHRlbXBTaGFwZURhdGE7CisgIExPU1NMRVNTREFUQSBDTERMb3NzbGVzc0RhdGE7CisgIExPU1NMRVNTREFUQSBJQ0NMb3NzbGVzc0RhdGE7CisgIFVDSEFSIGJVc2VCQkN1ZXM7CisKK30gU1BBVElBTEZSQU1FOworCit0eXBlZGVmIHN0cnVjdCBCU0ZfSU5TVEFOQ0UgKkhBTkRMRV9CU0ZfSU5TVEFOQ0U7CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGVzdHJveSBlbmNvZGVyIGluc3RhbmNlICovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVzdHJveVNwYXRpYWxCaXRzdHJlYW1FbmNvZGVyKAorICAgIEhBTkRMRV9CU0ZfSU5TVEFOQ0UgKnNlbGZQdHIpOworCisvKiBjcmVhdGUgZW5jb2RlciBpbnN0YW5jZSAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2NyZWF0ZVNwYXRpYWxCaXRzdHJlYW1FbmNvZGVyKAorICAgIEhBTkRMRV9CU0ZfSU5TVEFOQ0UgKnNlbGZQdHIpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfaW5pdFNwYXRpYWxCaXRzdHJlYW1FbmNvZGVyKAorICAgIEhBTkRMRV9CU0ZfSU5TVEFOQ0Ugc2VsZlB0cik7CisKKy8qIGdldCBTcGF0aWFsU3BlY2lmaWNDb25maWcgc3RydWN0ICovCitTUEFUSUFMU1BFQ0lGSUNDT05GSUcgKmZka19zYWNlbmNfZ2V0U3BhdGlhbFNwZWNpZmljQ29uZmlnKAorICAgIEhBTkRMRV9CU0ZfSU5TVEFOQ0Ugc2VsZlB0cik7CisKKy8qIHdyaXRlIFNwYXRpYWxTcGVjaWZpY0NvbmZpZyB0byBzdHJlYW0gKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY193cml0ZVNwYXRpYWxTcGVjaWZpY0NvbmZpZygKKyAgICBTUEFUSUFMU1BFQ0lGSUNDT05GSUcgKmNvbnN0IHNwYXRpYWxTcGVjaWZpY0NvbmZpZywKKyAgICBVQ0hBUiAqY29uc3QgcE91dHB1dEJ1ZmZlciwgY29uc3QgSU5UIG91dHB1dEJ1ZmZlclNpemUsCisgICAgSU5UICpjb25zdCBwbk91dHB1dEJpdHMpOworCisvKiBnZXQgU3BhdGlhbEZyYW1lIHN0cnVjdCAqLworU1BBVElBTEZSQU1FICpmZGtfc2FjZW5jX2dldFNwYXRpYWxGcmFtZShIQU5ETEVfQlNGX0lOU1RBTkNFIHNlbGZQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNQQVRJQUxGUkFNRV9UWVBFIGZyYW1lVHlwZSk7CisKKy8qIHdyaXRlIGZyYW1lIGRhdGEgdG8gc3RyZWFtICovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfd3JpdGVTcGF0aWFsRnJhbWUoVUNIQVIgKmNvbnN0IHBPdXRwdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG91dHB1dEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdCBwbk91dHB1dEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JTRl9JTlNUQU5DRSBzZWxmUHRyKTsKKworLyogQ29weS9TYXZlIHNwYXRpYWwgZnJhbWUgZGF0YSBmb3Igb25lIHBhcmFtZXRlciBzZXQgKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kdXBsaWNhdGVQYXJhbWV0ZXJTZXQoCisgICAgY29uc3QgU1BBVElBTEZSQU1FICpjb25zdCBoRnJvbSwgY29uc3QgSU5UIHNldEZyb20sIFNQQVRJQUxGUkFNRSAqY29uc3QgaFRvLAorICAgIGNvbnN0IElOVCBzZXRUbyk7CisKKyNlbmRpZiAvKiBTQUNFTkNfQklUU1RSRUFNX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2NvbnN0LmggYi9saWJTQUNlbmMvc3JjL3NhY2VuY19jb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NmU3NjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19jb25zdC5oCkBAIC0wLDAgKzEsMTI2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXJrdXMgTXVsdHJ1cworCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIGNvbnN0YW50cyB0byBNUEVHLTQgc3BhdGlhbCBlbmNvZGVyIGxpYgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ0VOQ19DT05TVF9ICisjZGVmaW5lIFNBQ0VOQ19DT05TVF9ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOVU1fUU1GX0JBTkRTIDY0CisjZGVmaW5lIE1BWF9RTUZfQkFORFMgMTI4CisKKyNkZWZpbmUgU0FDRU5DX01BWF9OVU1fQk9YRVMgMQorI2RlZmluZSBTQUNFTkNfTUFYX0lOUFVUX0NIQU5ORUxTIDIKKyNkZWZpbmUgU0FDRU5DX01BWF9PVVRQVVRfQ0hBTk5FTFMgMQorCisjZGVmaW5lIFNBQ0VOQ19GTE9BVF9FUFNJTE9OICgxZS05ZikKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmIC8qIFNBQ0VOQ19DT05TVF9IICovCmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19kZWxheS5jcHAgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19kZWxheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJlZDZiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2RlbGF5LmNwcApAQCAtMCwwICsxLDQ3MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdvZXR0bGluZ2VyCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgZGVsYXkgbWFuYWdlbWVudCBvZiB0aGUgZW5jb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKgorIFxmaWxlCisgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBkZWxheSBpbmZyYXN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY19kZWxheS5oIgorI2luY2x1ZGUgInNhY2VuY19jb25zdC5oIgorI2luY2x1ZGUgIkZES19tYXRyaXhDYWxsb2MuaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgREVMQVkgeworICBzdHJ1Y3QgREVMQVlfQ09ORklHIHsKKyAgICAvKiBSb3V0aW5nIENvbmZpZyBTd2l0Y2hlcyovCisgICAgSU5UIGJEbXhBbGlnbjsKKyAgICBJTlQgYlRpbWVEb21EbXg7CisgICAgSU5UIGJNaW5pbWl6ZURlbGF5OworICAgIElOVCBiU2FjVGltZUFsaWdubWVudER5bmFtaWNPdXQ7CisKKyAgICAvKiBOZWVkZWQgSW5wdXQgVmFyaWFibGVzKi8KKyAgICBJTlQgblFtZkxlbjsKKyAgICBJTlQgbkZyYW1lTGVuOworICAgIElOVCBuU3Vycm91bmREZWxheTsKKyAgICBJTlQgbkFyYkRteERlbGF5OworICAgIElOVCBuTGltaXRlckRlbGF5OworICAgIElOVCBuQ29yZUNvZGVyRGVsYXk7CisgICAgSU5UIG5TYWNTdHJlYW1NdXhEZWxheTsKKyAgICBJTlQgblNhY1RpbWVBbGlnbm1lbnQ7IC8qIE92ZXJ3cml0dGVuLCBpZiBiU2FjVGltZUFsaWdubWVudER5bmFtaWNPdXQgKi8KKyAgfSBjb25maWc7CisKKyAgLyogVmFyaWFibGUgRGVsYXlidWZmZXJzIC0+IERlbGF5cyAqLworICBJTlQgbkRteEFsaWduQnVmZmVyOworICBJTlQgblN1cnJvdW5kQW5hbHlzaXNCdWZmZXI7CisgIElOVCBuQXJiRG14QW5hbHlzaXNCdWZmZXI7CisgIElOVCBuT3V0cHV0QXVkaW9CdWZmZXI7CisgIElOVCBuQml0c3RyZWFtRnJhbWVCdWZmZXI7CisgIElOVCBuT3V0cHV0QXVkaW9RbWZGcmFtZUJ1ZmZlcjsKKyAgSU5UIG5EaXNjYXJkT3V0RnJhbWVzOworCisgIC8qIFZhcmlhYmxlIERlbGF5YnVmZmVycyBDb21wdXRhdGlvbiBWYXJpYWJsZXMgKi8KKyAgSU5UIG5CaXRzdHJlYW1GcmFtZUJ1ZmZlclNpemU7CisKKyAgLyogT3V0cHV0OiBJbmZvcyAqLworICBJTlQgbkluZm9EbXhEZWxheTsgLyogRGVsYXkgb2YgdGhlIGRvd25taXhlZCBzaWduYWwgYWZ0ZXIgdGhlIHNwYWNlIGVuY29kZXIgKi8KKyAgSU5UIG5JbmZvQ29kZWNEZWxheTsgLyogRGVsYXkgb2YgdGhlIHdob2xlIGVuLS9kZWNvZGVyIGluY2x1ZGluZyBDb3JlQ29kZXIgKi8KKyAgSU5UIG5JbmZvRGVjb2RlckRlbGF5OyAvKiBEZWxheSBvZiB0aGUgTXBlZyBTdXJyb3VuZCBkZWNvZGVyICovCit9OworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbm5hbWU6IGZka19zYWNlbmNfZGVsYXlfT3BlbigpCitkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIERlbGF5cworcmV0dXJuczogICAgICBub0Vycm9yIG9uIHN1Y2Nlc3MsIGFuIGFwcm9wcmlhdGUgZXJyb3IgY29kZSBlbHNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfT3BlbihIQU5ETEVfREVMQVkgKnBoRGVsYXkpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBwaERlbGF5KSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRCgqcGhEZWxheSwgMSwgc3RydWN0IERFTEFZKTsKKyAgfQorICByZXR1cm4gZXJyb3I7CisKK2JhaWw6CisgIGZka19zYWNlbmNfZGVsYXlfQ2xvc2UocGhEZWxheSk7CisgIHJldHVybiAoKFNBQ0VOQ19PSyA9PSBlcnJvcikgPyBTQUNFTkNfTUVNT1JZX0VSUk9SIDogZXJyb3IpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbm5hbWU6IGZka19zYWNlbmNfZGVsYXlfQ2xvc2UoKQorZGVzY3JpcHRpb246ICBkZXN0cnVjdHMgRGVsYXkKK3JldHVybnM6ICAgICAgbm9FcnJvciBvbiBzdWNjZXNzLCBhbiBhcHJvcHJpYXRlIGVycm9yIGNvZGUgZWxzZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X0Nsb3NlKEhBTkRMRV9ERUxBWSAqcGhEZWxheSkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IHBoRGVsYXkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoTlVMTCAhPSAqcGhEZWxheSkgeworICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKCpwaERlbGF5KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfSW5pdChIQU5ETEVfREVMQVkgaERlbGF5LCBjb25zdCBJTlQgblFtZkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNvcmVDb2RlckRlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5TYWNTdHJlYW1NdXhEZWxheSkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IGhEZWxheSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIC8qIEZpbGwgc3RydWN0dXJlIGJlZm9yZSBjYWxjdWxhdGlvbiAqLworICAgIEZES21lbWNsZWFyKCZoRGVsYXktPmNvbmZpZywgc2l6ZW9mKGhEZWxheS0+Y29uZmlnKSk7CisKKyAgICBoRGVsYXktPmNvbmZpZy5uUW1mTGVuID0gblFtZkxlbjsKKyAgICBoRGVsYXktPmNvbmZpZy5uRnJhbWVMZW4gPSBuRnJhbWVMZW47CisgICAgaERlbGF5LT5jb25maWcubkNvcmVDb2RlckRlbGF5ID0gbkNvcmVDb2RlckRlbGF5OworICAgIGhEZWxheS0+Y29uZmlnLm5TYWNTdHJlYW1NdXhEZWxheSA9IG5TYWNTdHJlYW1NdXhEZWxheTsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9ubmFtZTogZmRrX3NhY2VuY19kZWxheV9TdWJDYWx1bGF0ZUJ1ZmZlckRlbGF5cygpCitkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgdGhlIERlbGF5cyBvZiB0aGUgYnVmZmVycworcmV0dXJuczogICAgICBFcnJvciBDb2RlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfU3ViQ2FsdWxhdGVCdWZmZXJEZWxheXMoSEFORExFX0RFTEFZIGhEZWwpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBoRGVsKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IG5FbmNvZGVyQW5EZWxheSwgbkVuY29kZXJTeW5EZWxheSwgbkVuY29kZXJXaW5EZWxheSwgbkRlY29kZXJBbkRlbGF5LAorICAgICAgICBuRGVjb2RlclN5bkRlbGF5LCBuUmVzaWR1YWxDb2RlckZyYW1lRGVsYXksCisgICAgICAgIG5BcmJEbXhSZXNpZHVhbENvZGVyRnJhbWVEZWxheTsKKworICAgIGlmIChoRGVsLT5jb25maWcuYlNhY1RpbWVBbGlnbm1lbnREeW5hbWljT3V0ID4gMCkgeworICAgICAgaERlbC0+Y29uZmlnLm5TYWNUaW1lQWxpZ25tZW50ID0gMDsKKyAgICB9CisKKyAgICB7CisgICAgICBuRW5jb2RlckFuRGVsYXkgPQorICAgICAgICAgIDIgKiBoRGVsLT5jb25maWcublFtZkxlbiArCisgICAgICAgICAgaERlbC0+Y29uZmlnLm5RbWZMZW4gLyAyOyAvKiBPbmx5IExkLVFNRiBEZWxheSwgbm8gaHlicmlkICovCisgICAgICBuRW5jb2RlclN5bkRlbGF5ID0gMSAqIGhEZWwtPmNvbmZpZy5uUW1mTGVuICsgaERlbC0+Y29uZmlnLm5RbWZMZW4gLyAyOworICAgICAgbkRlY29kZXJBbkRlbGF5ID0gMiAqIGhEZWwtPmNvbmZpZy5uUW1mTGVuICsgaERlbC0+Y29uZmlnLm5RbWZMZW4gLyAyOworICAgICAgbkRlY29kZXJTeW5EZWxheSA9IDEgKiBoRGVsLT5jb25maWcublFtZkxlbiArIGhEZWwtPmNvbmZpZy5uUW1mTGVuIC8gMjsKKyAgICAgIG5FbmNvZGVyV2luRGVsYXkgPQorICAgICAgICAgIGhEZWwtPmNvbmZpZy5uRnJhbWVMZW4gLyAyOyAvKiBXaW5kb3dMb29rYWhlYWQgaXMganVzdCBoYWxmIGEgZnJhbWUgKi8KKyAgICB9CisKKyAgICB7IG5SZXNpZHVhbENvZGVyRnJhbWVEZWxheSA9IDA7IH0KKworICAgIHsgbkFyYkRteFJlc2lkdWFsQ29kZXJGcmFtZURlbGF5ID0gMDsgfQorCisgICAgLyogQ2FsY3VsYXRlIHZhcmlhYmxlIEJ1ZmZlci1EZWxheXMgKi8KKyAgICBpZiAoaERlbC0+Y29uZmlnLmJUaW1lRG9tRG14ID09IDApIHsKKyAgICAgIC8qIEFyYml0cmFyeURteCBhbmQgVGREbXggb2ZmICovCisgICAgICBpbnQgdGVtcERlbGF5OworCisgICAgICBoRGVsLT5uU3Vycm91bmRBbmFseXNpc0J1ZmZlciA9IDA7CisgICAgICBoRGVsLT5uQXJiRG14QW5hbHlzaXNCdWZmZXIgPSAwOworICAgICAgdGVtcERlbGF5ID0gbkVuY29kZXJTeW5EZWxheSArIGhEZWwtPmNvbmZpZy5uTGltaXRlckRlbGF5ICsKKyAgICAgICAgICAgICAgICAgIGhEZWwtPmNvbmZpZy5uQ29yZUNvZGVyRGVsYXkgKworICAgICAgICAgICAgICAgICAgaERlbC0+Y29uZmlnLm5TYWNUaW1lQWxpZ25tZW50ICsgbkRlY29kZXJBbkRlbGF5OworICAgICAgdGVtcERlbGF5ID0gKG5SZXNpZHVhbENvZGVyRnJhbWVEZWxheSAqIGhEZWwtPmNvbmZpZy5uRnJhbWVMZW4pICsKKyAgICAgICAgICAgICAgICAgIGhEZWwtPmNvbmZpZy5uU2FjU3RyZWFtTXV4RGVsYXkgLSB0ZW1wRGVsYXk7CisKKyAgICAgIGlmICh0ZW1wRGVsYXkgPiAwKSB7CisgICAgICAgIGhEZWwtPm5CaXRzdHJlYW1GcmFtZUJ1ZmZlciA9IDA7CisgICAgICAgIGhEZWwtPm5PdXRwdXRBdWRpb0J1ZmZlciA9IHRlbXBEZWxheTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBEZWxheSA9IC10ZW1wRGVsYXk7CisgICAgICAgIGhEZWwtPm5CaXRzdHJlYW1GcmFtZUJ1ZmZlciA9CisgICAgICAgICAgICAodGVtcERlbGF5ICsgaERlbC0+Y29uZmlnLm5GcmFtZUxlbiAtIDEpIC8gaERlbC0+Y29uZmlnLm5GcmFtZUxlbjsKKyAgICAgICAgaERlbC0+bk91dHB1dEF1ZGlvQnVmZmVyID0KKyAgICAgICAgICAgIChoRGVsLT5uQml0c3RyZWFtRnJhbWVCdWZmZXIgKiBoRGVsLT5jb25maWcubkZyYW1lTGVuKSAtIHRlbXBEZWxheTsKKyAgICAgIH0KKworICAgICAgaERlbC0+bk91dHB1dEF1ZGlvUW1mRnJhbWVCdWZmZXIgPQorICAgICAgICAgIChoRGVsLT5uT3V0cHV0QXVkaW9CdWZmZXIgKyAoaERlbC0+Y29uZmlnLm5RbWZMZW4gLyAyKSAtIDEpIC8KKyAgICAgICAgICBoRGVsLT5jb25maWcublFtZkxlbjsKKworICAgICAgaWYgKGhEZWwtPmNvbmZpZy5iRG14QWxpZ24gPiAwKSB7CisgICAgICAgIHRlbXBEZWxheSA9IG5FbmNvZGVyV2luRGVsYXkgKyBuRW5jb2RlckFuRGVsYXkgKyBuRW5jb2RlclN5bkRlbGF5ICsKKyAgICAgICAgICAgICAgICAgICAgaERlbC0+bk91dHB1dEF1ZGlvQnVmZmVyICsgaERlbC0+Y29uZmlnLm5MaW1pdGVyRGVsYXkgKworICAgICAgICAgICAgICAgICAgICBoRGVsLT5jb25maWcubkNvcmVDb2RlckRlbGF5OworICAgICAgICBoRGVsLT5uRGlzY2FyZE91dEZyYW1lcyA9CisgICAgICAgICAgICAodGVtcERlbGF5ICsgaERlbC0+Y29uZmlnLm5GcmFtZUxlbiAtIDEpIC8gaERlbC0+Y29uZmlnLm5GcmFtZUxlbjsKKyAgICAgICAgaERlbC0+bkRteEFsaWduQnVmZmVyID0KKyAgICAgICAgICAgIGhEZWwtPm5EaXNjYXJkT3V0RnJhbWVzICogaERlbC0+Y29uZmlnLm5GcmFtZUxlbiAtIHRlbXBEZWxheTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhEZWwtPm5EaXNjYXJkT3V0RnJhbWVzID0gMDsKKyAgICAgICAgaERlbC0+bkRteEFsaWduQnVmZmVyID0gMDsKKyAgICAgIH0KKworICAgICAgLyogT3V0cHV0OiBJbmZvLVZhcmlhYmxlcyAqLworICAgICAgaERlbC0+bkluZm9EbXhEZWxheSA9IGhEZWwtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyICsgbkVuY29kZXJBbkRlbGF5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRW5jb2RlcldpbkRlbGF5ICsgbkVuY29kZXJTeW5EZWxheSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaERlbC0+bk91dHB1dEF1ZGlvQnVmZmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRGVsLT5jb25maWcubkxpbWl0ZXJEZWxheTsKKyAgICAgIGhEZWwtPm5JbmZvQ29kZWNEZWxheSA9CisgICAgICAgICAgaERlbC0+bkluZm9EbXhEZWxheSArIGhEZWwtPmNvbmZpZy5uQ29yZUNvZGVyRGVsYXkgKworICAgICAgICAgIGhEZWwtPmNvbmZpZy5uU2FjVGltZUFsaWdubWVudCArIG5EZWNvZGVyQW5EZWxheSArIG5EZWNvZGVyU3luRGVsYXk7CisKKyAgICB9IGVsc2UgeworICAgICAgLyogQXJiaXRyYXJ5RG14IG9yIFRkRG14IG9uICovCisgICAgICBpbnQgdGVtcERlbGF5MSwgdGVtcERlbGF5MiwgdGVtcERlbGF5MTIsIHRlbXBEZWxheTM7CisKKyAgICAgIHRlbXBEZWxheTEgPSBoRGVsLT5jb25maWcubkFyYkRteERlbGF5IC0gaERlbC0+Y29uZmlnLm5TdXJyb3VuZERlbGF5OworCisgICAgICBpZiAodGVtcERlbGF5MSA+PSAwKSB7CisgICAgICAgIGhEZWwtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyID0gdGVtcERlbGF5MTsKKyAgICAgICAgaERlbC0+bkFyYkRteEFuYWx5c2lzQnVmZmVyID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhEZWwtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyID0gMDsKKyAgICAgICAgaERlbC0+bkFyYkRteEFuYWx5c2lzQnVmZmVyID0gLXRlbXBEZWxheTE7CisgICAgICB9CisKKyAgICAgIHRlbXBEZWxheTEgPSBuRW5jb2RlcldpbkRlbGF5ICsgaERlbC0+Y29uZmlnLm5TdXJyb3VuZERlbGF5ICsKKyAgICAgICAgICAgICAgICAgICBoRGVsLT5uU3Vycm91bmRBbmFseXNpc0J1ZmZlciArCisgICAgICAgICAgICAgICAgICAgbkVuY29kZXJBbkRlbGF5OyAvKlN1cnJvdW5kIFBhdGgqLworICAgICAgdGVtcERlbGF5MiA9IG5FbmNvZGVyV2luRGVsYXkgKyBoRGVsLT5jb25maWcubkFyYkRteERlbGF5ICsKKyAgICAgICAgICAgICAgICAgICBoRGVsLT5uQXJiRG14QW5hbHlzaXNCdWZmZXIgKworICAgICAgICAgICAgICAgICAgIG5FbmNvZGVyQW5EZWxheTsgLyogQXJiRG14IENvbXBhcmUgUGF0aCAqLworICAgICAgdGVtcERlbGF5MyA9IGhEZWwtPmNvbmZpZy5uQXJiRG14RGVsYXkgKyBoRGVsLT5jb25maWcubkxpbWl0ZXJEZWxheSArCisgICAgICAgICAgICAgICAgICAgaERlbC0+Y29uZmlnLm5Db3JlQ29kZXJEZWxheSArCisgICAgICAgICAgICAgICAgICAgaERlbC0+Y29uZmlnLm5TYWNUaW1lQWxpZ25tZW50ICsKKyAgICAgICAgICAgICAgICAgICBuRGVjb2RlckFuRGVsYXk7IC8qIEFyYkRteCBQYXNzdGhyb3VnaCovCisKKyAgICAgIHRlbXBEZWxheTEyID0KKyAgICAgICAgICBGREttYXgoblJlc2lkdWFsQ29kZXJGcmFtZURlbGF5LCBuQXJiRG14UmVzaWR1YWxDb2RlckZyYW1lRGVsYXkpICoKKyAgICAgICAgICBoRGVsLT5jb25maWcubkZyYW1lTGVuOworICAgICAgdGVtcERlbGF5MTIgKz0gaERlbC0+Y29uZmlnLm5TYWNTdHJlYW1NdXhEZWxheTsKKworICAgICAgaWYgKHRlbXBEZWxheTEgPiB0ZW1wRGVsYXkyKSB7CisgICAgICAgIHRlbXBEZWxheTEyICs9IHRlbXBEZWxheTE7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZW1wRGVsYXkxMiArPSB0ZW1wRGVsYXkyOworICAgICAgfQorCisgICAgICBpZiAodGVtcERlbGF5MyA+IHRlbXBEZWxheTEyKSB7CisgICAgICAgIGlmIChoRGVsLT5jb25maWcuYk1pbmltaXplRGVsYXkgPiAwKSB7CisgICAgICAgICAgaERlbC0+bkJpdHN0cmVhbUZyYW1lQnVmZmVyID0KKyAgICAgICAgICAgICAgKHRlbXBEZWxheTMgLSB0ZW1wRGVsYXkxMikgLyBoRGVsLT5jb25maWcubkZyYW1lTGVuOyAvKmZsb29yKi8KKyAgICAgICAgICBoRGVsLT5uT3V0cHV0QXVkaW9CdWZmZXIgPSAwOworICAgICAgICAgIGhEZWwtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyICs9CisgICAgICAgICAgICAgICh0ZW1wRGVsYXkzIC0gdGVtcERlbGF5MTIgLQorICAgICAgICAgICAgICAgKGhEZWwtPm5CaXRzdHJlYW1GcmFtZUJ1ZmZlciAqIGhEZWwtPmNvbmZpZy5uRnJhbWVMZW4pKTsKKyAgICAgICAgICBoRGVsLT5uQXJiRG14QW5hbHlzaXNCdWZmZXIgKz0KKyAgICAgICAgICAgICAgKHRlbXBEZWxheTMgLSB0ZW1wRGVsYXkxMiAtCisgICAgICAgICAgICAgICAoaERlbC0+bkJpdHN0cmVhbUZyYW1lQnVmZmVyICogaERlbC0+Y29uZmlnLm5GcmFtZUxlbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhEZWwtPm5CaXRzdHJlYW1GcmFtZUJ1ZmZlciA9CisgICAgICAgICAgICAgICgodGVtcERlbGF5MyAtIHRlbXBEZWxheTEyKSArIGhEZWwtPmNvbmZpZy5uRnJhbWVMZW4gLSAxKSAvCisgICAgICAgICAgICAgIGhEZWwtPmNvbmZpZy5uRnJhbWVMZW47CisgICAgICAgICAgaERlbC0+bk91dHB1dEF1ZGlvQnVmZmVyID0KKyAgICAgICAgICAgICAgaERlbC0+bkJpdHN0cmVhbUZyYW1lQnVmZmVyICogaERlbC0+Y29uZmlnLm5GcmFtZUxlbiArCisgICAgICAgICAgICAgIHRlbXBEZWxheTEyIC0gdGVtcERlbGF5MzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaERlbC0+bkJpdHN0cmVhbUZyYW1lQnVmZmVyID0gMDsKKyAgICAgICAgaERlbC0+bk91dHB1dEF1ZGlvQnVmZmVyID0gdGVtcERlbGF5MTIgLSB0ZW1wRGVsYXkzOworICAgICAgfQorCisgICAgICBpZiAoaERlbC0+Y29uZmlnLmJEbXhBbGlnbiA+IDApIHsKKyAgICAgICAgaW50IHRlbXBEZWxheSA9IGhEZWwtPmNvbmZpZy5uQXJiRG14RGVsYXkgKyBoRGVsLT5uT3V0cHV0QXVkaW9CdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgaERlbC0+Y29uZmlnLm5MaW1pdGVyRGVsYXkgKworICAgICAgICAgICAgICAgICAgICAgICAgaERlbC0+Y29uZmlnLm5Db3JlQ29kZXJEZWxheTsKKyAgICAgICAgaERlbC0+bkRpc2NhcmRPdXRGcmFtZXMgPQorICAgICAgICAgICAgKHRlbXBEZWxheSArIGhEZWwtPmNvbmZpZy5uRnJhbWVMZW4gLSAxKSAvIGhEZWwtPmNvbmZpZy5uRnJhbWVMZW47CisgICAgICAgIGhEZWwtPm5EbXhBbGlnbkJ1ZmZlciA9CisgICAgICAgICAgICBoRGVsLT5uRGlzY2FyZE91dEZyYW1lcyAqIGhEZWwtPmNvbmZpZy5uRnJhbWVMZW4gLSB0ZW1wRGVsYXk7CisgICAgICB9IGVsc2UgeworICAgICAgICBoRGVsLT5uRGlzY2FyZE91dEZyYW1lcyA9IDA7CisgICAgICAgIGhEZWwtPm5EbXhBbGlnbkJ1ZmZlciA9IDA7CisgICAgICB9CisKKyAgICAgIC8qIE91dHB1dDogSW5mby1WYXJpYWJsZXMgKi8KKyAgICAgIGhEZWwtPm5JbmZvRG14RGVsYXkgPSBoRGVsLT5jb25maWcubkFyYkRteERlbGF5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRGVsLT5uT3V0cHV0QXVkaW9CdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhEZWwtPmNvbmZpZy5uTGltaXRlckRlbGF5OworICAgICAgaERlbC0+bkluZm9Db2RlY0RlbGF5ID0KKyAgICAgICAgICBoRGVsLT5uSW5mb0RteERlbGF5ICsgaERlbC0+Y29uZmlnLm5Db3JlQ29kZXJEZWxheSArCisgICAgICAgICAgaERlbC0+Y29uZmlnLm5TYWNUaW1lQWxpZ25tZW50ICsgbkRlY29kZXJBbkRlbGF5ICsgbkRlY29kZXJTeW5EZWxheTsKKyAgICAgIGhEZWwtPm5JbmZvRGVjb2RlckRlbGF5ID0gbkRlY29kZXJBbkRlbGF5ICsgbkRlY29kZXJTeW5EZWxheTsKKworICAgIH0gLyogQXJiaXRyYXJ5RG14IG9yIFRkRG14IG9uICovCisKKyAgICAvKiBBZGRpdG9uYWwgVmFyaWFibGVzIG5lZWRlZCBmb3IgQ29tcHV0YXRpb24gSXNzdWVzICovCisgICAgaERlbC0+bkJpdHN0cmVhbUZyYW1lQnVmZmVyU2l6ZSA9IGhEZWwtPm5CaXRzdHJlYW1GcmFtZUJ1ZmZlciArIDE7CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIGFzc2lnblBhcmFtZXRlckluUmFuZ2UoCisgICAgY29uc3QgSU5UIHN0YXJ0UmFuZ2UsIC8qIGluY2x1ZGluZyBzdGFydFJhbmdlICovCisgICAgY29uc3QgSU5UIHN0b3BSYW5nZSwgIC8qIGluY2x1ZGluZyBzdG9wUmFuZ2UgKi8KKyAgICBjb25zdCBJTlQgdmFsdWUsICAgICAgLyogdmFsdWUgdG8gd3JpdGUqLworICAgIElOVCAqY29uc3QgcHRyICAgICAgICAvKiBkZXN0aW5hdGlvbiBwb2ludGVyKi8KKykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworCisgIGlmICgoc3RhcnRSYW5nZSA8PSB2YWx1ZSkgJiYgKHZhbHVlIDw9IHN0b3BSYW5nZSkpIHsKKyAgICAqcHRyID0gdmFsdWU7CisgICAgZXJyb3IgPSBTQUNFTkNfT0s7CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZWxheV9TZXREbXhBbGlnbihIQU5ETEVfREVMQVkgaERlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBiRG14QWxpZ25JbikgeworICByZXR1cm4gKGFzc2lnblBhcmFtZXRlckluUmFuZ2UoMCwgMSwgYkRteEFsaWduSW4sICZoRGVsYXktPmNvbmZpZy5iRG14QWxpZ24pKTsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X1NldFRpbWVEb21EbXgoSEFORExFX0RFTEFZIGhEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBiVGltZURvbURteEluKSB7CisgIHJldHVybiAoCisgICAgICBhc3NpZ25QYXJhbWV0ZXJJblJhbmdlKDAsIDEsIGJUaW1lRG9tRG14SW4sICZoRGVsYXktPmNvbmZpZy5iVGltZURvbURteCkpOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfU2V0U2FjVGltZUFsaWdubWVudER5bmFtaWNPdXQoCisgICAgSEFORExFX0RFTEFZIGhEZWxheSwgY29uc3QgSU5UIGJTYWNUaW1lQWxpZ25tZW50RHluYW1pY091dEluKSB7CisgIHJldHVybiAoYXNzaWduUGFyYW1ldGVySW5SYW5nZSgwLCAxLCBiU2FjVGltZUFsaWdubWVudER5bmFtaWNPdXRJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRGVsYXktPmNvbmZpZy5iU2FjVGltZUFsaWdubWVudER5bmFtaWNPdXQpKTsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X1NldE5TYWNUaW1lQWxpZ25tZW50KAorICAgIEhBTkRMRV9ERUxBWSBoRGVsYXksIGNvbnN0IElOVCBuU2FjVGltZUFsaWdubWVudEluKSB7CisgIHJldHVybiAoYXNzaWduUGFyYW1ldGVySW5SYW5nZSgtMzI3NjgsIDMyNzY3LCBuU2FjVGltZUFsaWdubWVudEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhEZWxheS0+Y29uZmlnLm5TYWNUaW1lQWxpZ25tZW50KSk7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZWxheV9TZXRNaW5pbWl6ZURlbGF5KEhBTkRMRV9ERUxBWSBoRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYk1pbmltaXplRGVsYXkpIHsKKyAgcmV0dXJuIChhc3NpZ25QYXJhbWV0ZXJJblJhbmdlKDAsIDEsIGJNaW5pbWl6ZURlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhEZWxheS0+Y29uZmlnLmJNaW5pbWl6ZURlbGF5KSk7Cit9CisKK0lOVCBmZGtfc2FjZW5jX2RlbGF5X0dldE91dHB1dEF1ZGlvQnVmZmVyRGVsYXkoSEFORExFX0RFTEFZIGhEZWxheSkgeworICByZXR1cm4gKGhEZWxheS0+bk91dHB1dEF1ZGlvQnVmZmVyKTsKK30KKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0U3Vycm91bmRBbmFseXNpc0J1ZmZlckRlbGF5KEhBTkRMRV9ERUxBWSBoRGVsYXkpIHsKKyAgcmV0dXJuIChoRGVsYXktPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyKTsKK30KKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0QXJiRG14QW5hbHlzaXNCdWZmZXJEZWxheShIQU5ETEVfREVMQVkgaERlbGF5KSB7CisgIHJldHVybiAoaERlbGF5LT5uQXJiRG14QW5hbHlzaXNCdWZmZXIpOworfQorCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXRCaXRzdHJlYW1GcmFtZUJ1ZmZlclNpemUoSEFORExFX0RFTEFZIGhEZWxheSkgeworICByZXR1cm4gKGhEZWxheS0+bkJpdHN0cmVhbUZyYW1lQnVmZmVyU2l6ZSk7Cit9CisKK0lOVCBmZGtfc2FjZW5jX2RlbGF5X0dldERteEFsaWduQnVmZmVyRGVsYXkoSEFORExFX0RFTEFZIGhEZWxheSkgeworICByZXR1cm4gKGhEZWxheS0+bkRteEFsaWduQnVmZmVyKTsKK30KKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0RGlzY2FyZE91dEZyYW1lcyhIQU5ETEVfREVMQVkgaERlbGF5KSB7CisgIHJldHVybiAoaERlbGF5LT5uRGlzY2FyZE91dEZyYW1lcyk7Cit9CisKK0lOVCBmZGtfc2FjZW5jX2RlbGF5X0dldEluZm9EbXhEZWxheShIQU5ETEVfREVMQVkgaERlbGF5KSB7CisgIHJldHVybiAoaERlbGF5LT5uSW5mb0RteERlbGF5KTsKK30KKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0SW5mb0NvZGVjRGVsYXkoSEFORExFX0RFTEFZIGhEZWxheSkgeworICByZXR1cm4gKGhEZWxheS0+bkluZm9Db2RlY0RlbGF5KTsKK30KKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0SW5mb0RlY29kZXJEZWxheShIQU5ETEVfREVMQVkgaERlbGF5KSB7CisgIHJldHVybiAoaERlbGF5LT5uSW5mb0RlY29kZXJEZWxheSk7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19kZWxheS5oIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZGVsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGJmYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZGVsYXkuaApAQCAtMCwwICsxLDE3NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdvZXR0bGluZ2VyCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgZGVsYXkgbWFuYWdlbWVudCBvZiB0aGUgZW5jb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKgorICAgXGZpbGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFNBQ0VOQ19ERUxBWV9ICisjZGVmaW5lIFNBQ0VOQ19ERUxBWV9ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJzYWNlbmNfbGliLmgiCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisjaW5jbHVkZSAiRkRLX21hdHJpeENhbGxvYy5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1BWF9ERUxBWV9JTlBVVCAxMDI0CisjZGVmaW5lIE1BWF9ERUxBWV9PVVRQVVQgNDA5NgorLyogYnVtcGVkIGZyb20gMCB0byA1LiB0aGlzIHNob3VsZCBiZSBlcXVhbCBvciBsYXJnZXIgdG8gdGhlIGR1YWxyYXRlIHNicgorICogcmVzYW1wbGVyIGZpbHRlciBsZW5ndGggKi8KKyNkZWZpbmUgTUFYX0RFTEFZX1NVUlJPVU5EX0FOQUxZU0lTIDUKKyNkZWZpbmUgTUFYX0JJVFNUUkVBTV9ERUxBWSAxCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IERFTEFZICpIQU5ETEVfREVMQVk7CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X09wZW4oSEFORExFX0RFTEFZICpwaERlbGF5KTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X0Nsb3NlKEhBTkRMRV9ERUxBWSAqcGhEZWxheSk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZWxheV9Jbml0KEhBTkRMRV9ERUxBWSBoRGVsYXksIGNvbnN0IElOVCBuUW1mTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5GcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ29yZUNvZGVyRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblNhY1N0cmVhbU11eERlbGF5KTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X1N1YkNhbHVsYXRlQnVmZmVyRGVsYXlzKEhBTkRMRV9ERUxBWSBoRGVsKTsKKworLyogU2V0IEV4cGVydCBDb25maWcgUGFyYW1ldGVycyAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X1NldERteEFsaWduKEhBTkRMRV9ERUxBWSBoRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJEbXhBbGlnbkluKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X1NldFRpbWVEb21EbXgoSEFORExFX0RFTEFZIGhEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBiVGltZURvbURteEluKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X1NldFNhY1RpbWVBbGlnbm1lbnREeW5hbWljT3V0KAorICAgIEhBTkRMRV9ERUxBWSBoRGVsYXksIGNvbnN0IElOVCBiU2FjVGltZUFsaWdubWVudER5bmFtaWNPdXRJbik7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZWxheV9TZXROU2FjVGltZUFsaWdubWVudCgKKyAgICBIQU5ETEVfREVMQVkgaERlbGF5LCBjb25zdCBJTlQgblNhY1RpbWVBbGlnbm1lbnRJbik7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZWxheV9TZXRNaW5pbWl6ZURlbGF5KEhBTkRMRV9ERUxBWSBoRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYk1pbmltaXplRGVsYXkpOworCisvKiBHZXQgSW50ZXJuYWwgVmFyaWFibGVzICovCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXRPdXRwdXRBdWRpb0J1ZmZlckRlbGF5KEhBTkRMRV9ERUxBWSBoRGVsYXkpOworCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXRTdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXkoSEFORExFX0RFTEFZIGhEZWxheSk7CisKK0lOVCBmZGtfc2FjZW5jX2RlbGF5X0dldEFyYkRteEFuYWx5c2lzQnVmZmVyRGVsYXkoSEFORExFX0RFTEFZIGhEZWxheSk7CisKK0lOVCBmZGtfc2FjZW5jX2RlbGF5X0dldEJpdHN0cmVhbUZyYW1lQnVmZmVyU2l6ZShIQU5ETEVfREVMQVkgaERlbGF5KTsKKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0RG14QWxpZ25CdWZmZXJEZWxheShIQU5ETEVfREVMQVkgaERlbGF5KTsKKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0RGlzY2FyZE91dEZyYW1lcyhIQU5ETEVfREVMQVkgaERlbGF5KTsKKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0SW5mb0RteERlbGF5KEhBTkRMRV9ERUxBWSBoRGVsYXkpOworCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXRJbmZvQ29kZWNEZWxheShIQU5ETEVfREVMQVkgaERlbGF5KTsKKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0SW5mb0RlY29kZXJEZWxheShIQU5ETEVfREVMQVkgaERlbGF5KTsKKworI2VuZGlmIC8qIFNBQ0VOQ19ERUxBWV9IICovCmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19kbXhfdGRvbV9lbmguY3BwIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZG14X3Rkb21fZW5oLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTY2YzgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZG14X3Rkb21fZW5oLmNwcApAQCAtMCwwICsxLDYzOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTS4gTHVpcyBWYWxlcm8KKworICAgRGVzY3JpcHRpb246IEVuaGFuY2VkIFRpbWUgRG9tYWluIERvd25taXgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY19kbXhfdGRvbV9lbmguaCIKKworI2luY2x1ZGUgIkZES19tYXRyaXhDYWxsb2MuaCIKKyNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKKyNpbmNsdWRlICJmaXhwb2ludF9tYXRoLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUElfRkxUIDMuMTQxNTkyNjUzNTg5NzkzMWYKKyNkZWZpbmUgQUxQSEFfRkxUIDAuMDAwMWYKKworI2RlZmluZSBQSV9FICgyKQorI2RlZmluZSBQSV9NIChGTDJGWENPTlNUX0RCTChQSV9GTFQgLyAoMSA8PCBQSV9FKSkpCisKKyNkZWZpbmUgQUxQSEFfRSAoMTMpCisjZGVmaW5lIEFMUEhBX00gKEZMMkZYQ09OU1RfREJMKEFMUEhBX0ZMVCAqICgxIDw8IEFMUEhBX0UpKSkKKworZW51bSB7IEwgPSAwLCBSID0gMSB9OworCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBUX0VOSEFOQ0VEX1RJTUVfRE9NQUlOX0RNWCB7CisgIGludCBtYXhGcmFtZWxlbmd0aDsKKworICBpbnQgZnJhbWVsZW5ndGg7CisKKyAgRklYUF9EQkwgcHJldl9nYWluX21bMl07CisgIElOVCBwcmV2X2dhaW5fZTsKKyAgRklYUF9EQkwgcHJldl9IMV9tWzJdOworICBJTlQgcHJldl9IMV9lOworCisgIEZJWFBfREJMICpzaW51c1dpbmRvd19tOworICBTQ0hBUiBzaW51c1dpbmRvd19lOworCisgIEZJWFBfREJMIHByZXZfTGVmdF9tOworICBJTlQgcHJldl9MZWZ0X2U7CisgIEZJWFBfREJMIHByZXZfUmlnaHRfbTsKKyAgSU5UIHByZXZfUmlnaHRfZTsKKyAgRklYUF9EQkwgcHJldl9YTnJnX207CisgIElOVCBwcmV2X1hOcmdfZTsKKworICBGSVhQX0RCTCBsaW5fYmJDbGRfd2VpZ2h0X207CisgIElOVCBsaW5fYmJDbGRfd2VpZ2h0X2U7CisgIEZJWFBfREJMIGdhaW5fd2VpZ2h0X21bMl07CisgIElOVCBnYWluX3dlaWdodF9lOworCit9IEVOSEFOQ0VEX1RJTUVfRE9NQUlOX0RNWDsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVSYXRpbyhjb25zdCBGSVhQX0RCTCBzcXJ0X2xpbkNsZF9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNxcnRfbGluQ2xkX2UsIGNvbnN0IEZJWFBfREJMIGxpbl9DbGRfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBsaW5fQ2xkX2UsIGNvbnN0IEZJWFBfREJMIEljY19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIEljY19lLCBGSVhQX0RCTCBHX21bMl0sIElOVCAqR19lKTsKKworc3RhdGljIHZvaWQgY2FsY3VsYXRlRG14R2FpbnMoY29uc3QgRklYUF9EQkwgbGluX0NsZF9tLCBjb25zdCBJTlQgbGluX0NsZF9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgbGluX0NsZDJfbSwgY29uc3QgSU5UIGxpbl9DbGQyX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBJY2NfbSwgY29uc3QgSU5UIEljY19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgR19tWzJdLCBjb25zdCBJTlQgR19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgSDFfbVsyXSwgSU5UICpwSDFfZSk7CisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBGSVhQX0RCTCBpbnZTcXJ0Tm9ybTIoY29uc3QgRklYUF9EQkwgb3BfbSwgY29uc3QgSU5UIG9wX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3QgcmVzdWx0X2UpIHsKKyAgRklYUF9EQkwgc3JjX20gPSBvcF9tOworICBpbnQgc3JjX2UgPSBvcF9lOworCisgIGlmIChzcmNfZSAmIDEpIHsKKyAgICBzcmNfbSA+Pj0gMTsKKyAgICBzcmNfZSArPSAxOworICB9CisKKyAgc3JjX20gPSBpbnZTcXJ0Tm9ybTIoc3JjX20sIHJlc3VsdF9lKTsKKyAgKnJlc3VsdF9lID0gKCpyZXN1bHRfZSkgLSAoc3JjX2UgPj4gMSk7CisKKyAgcmV0dXJuIHNyY19tOworfQorCitzdGF0aWMgRklYUF9EQkwgc3FydEZpeHAoY29uc3QgRklYUF9EQkwgb3BfbSwgY29uc3QgSU5UIG9wX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdCByZXN1bHRfZSkgeworICBGSVhQX0RCTCBzcmNfbSA9IG9wX207CisgIGludCBzcmNfZSA9IG9wX2U7CisKKyAgaWYgKHNyY19lICYgMSkgeworICAgIHNyY19tID4+PSAxOworICAgIHNyY19lICs9IDE7CisgIH0KKworICAqcmVzdWx0X2UgPSAoc3JjX2UgPj4gMSk7CisgIHJldHVybiBzcXJ0Rml4cChzcmNfbSk7Cit9CisKK3N0YXRpYyBGSVhQX0RCTCBmaXhwQWRkKGNvbnN0IEZJWFBfREJMIHNyYzFfbSwgY29uc3QgSU5UIHNyYzFfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHNyYzJfbSwgY29uc3QgSU5UIHNyYzJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3QgZHN0X2UpIHsKKyAgRklYUF9EQkwgZHN0X207CisKKyAgaWYgKHNyYzFfbSA9PSBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgKmRzdF9lID0gc3JjMl9lOworICAgIGRzdF9tID0gc3JjMl9tOworICB9IGVsc2UgaWYgKHNyYzJfbSA9PSBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgKmRzdF9lID0gc3JjMV9lOworICAgIGRzdF9tID0gc3JjMV9tOworICB9IGVsc2UgeworICAgICpkc3RfZSA9IGZpeE1heChzcmMxX2UsIHNyYzJfZSkgKyAxOworICAgIGRzdF9tID0KKyAgICAgICAgc2NhbGVWYWx1ZShzcmMxX20sIGZpeE1heCgoc3JjMV9lIC0gKCpkc3RfZSkpLCAtKERGUkFDVF9CSVRTIC0gMSkpKSArCisgICAgICAgIHNjYWxlVmFsdWUoc3JjMl9tLCBmaXhNYXgoKHNyYzJfZSAtICgqZHN0X2UpKSwgLShERlJBQ1RfQklUUyAtIDEpKSk7CisgIH0KKyAgcmV0dXJuIGRzdF9tOworfQorCisvKioKKyAqIFxicmllZiAgU3VtIHVwIGZpeHBvaW50IHZhbHVlcyB3aXRoIGJlc3QgcG9zc2libGUgYWNjdXJhY3kuCisgKgorICogXHBhcmFtIHZhbHVlMSAgICAgICAgRmlyc3QgaW5wdXQgdmFsdWUuCisgKiBccGFyYW0gcTEgICAgICAgICAgICBTY2FsaW5nIGZhY3RvciBvZiBmaXJzdCBpbnB1dCB2YWx1ZS4KKyAqIFxwYXJhbSBwVmFsdWUyICAgICAgIFBvaW50ZXIgdG8gc2Vjb25kIGlucHV0IHZhbHVlLCB3aWxsIGJlIG1vZGlmaWVkIG9uCisgKiByZXR1cm4uCisgKiBccGFyYW0gcFEyICAgICAgICAgICBQb2ludGVyIHRvIHNlY29uZCBzY2FsaW5nIGZhY3Rvciwgd2lsbCBiZSBtb2RpZmllZCBvbgorICogcmV0dXJuLgorICoKKyAqIFxyZXR1cm4gICAgdm9pZAorICovCitzdGF0aWMgdm9pZCBmaXhwQWRkTm9ybShjb25zdCBGSVhQX0RCTCB2YWx1ZTEsIGNvbnN0IElOVCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBwVmFsdWUyLCBJTlQgKmNvbnN0IHBRMikgeworICBjb25zdCBpbnQgaGVhZHJvb20xID0gZk5vcm16KGZpeHBfYWJzKHZhbHVlMSkpIC0gMTsKKyAgY29uc3QgaW50IGhlYWRyb29tMiA9IGZOb3JteihmaXhwX2FicygqcFZhbHVlMikpIC0gMTsKKyAgaW50IHJlc3VsdFNjYWxlID0gZml4TWF4KHExIC0gaGVhZHJvb20xLCAoKnBRMikgLSBoZWFkcm9vbTIpOworCisgIGlmICgodmFsdWUxICE9IEZMMkZYQ09OU1RfREJMKDAuZikpICYmICgqcFZhbHVlMiAhPSBGTDJGWENPTlNUX0RCTCgwLmYpKSkgeworICAgIHJlc3VsdFNjYWxlKys7CisgIH0KKworICAqcFZhbHVlMiA9CisgICAgICBzY2FsZVZhbHVlKHZhbHVlMSwgcTEgLSByZXN1bHRTY2FsZSkgKworICAgICAgc2NhbGVWYWx1ZSgqcFZhbHVlMiwgZml4TWF4KC0oREZSQUNUX0JJVFMgLSAxKSwgKCgqcFEyKSAtIHJlc3VsdFNjYWxlKSkpOworICAqcFEyID0gKCpwVmFsdWUyICE9IChGSVhQX0RCTCkwKSA/IHJlc3VsdFNjYWxlIDogREZSQUNUX0JJVFMgLSAxOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfb3Blbl9lbmhhbmNlZFRpbWVEb21haW5EbXgoCisgICAgSEFORExFX0VOSEFOQ0VEX1RJTUVfRE9NQUlOX0RNWCAqcGhFbmhhbmNlZFRpbWVEbXgsIGNvbnN0IElOVCBmcmFtZWxlbmd0aCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworICBIQU5ETEVfRU5IQU5DRURfVElNRV9ET01BSU5fRE1YIGhFbmhhbmNlZFRpbWVEbXggPSBOVUxMOworCisgIGlmIChOVUxMID09IHBoRW5oYW5jZWRUaW1lRG14KSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoRW5oYW5jZWRUaW1lRG14LCAxLCBFTkhBTkNFRF9USU1FX0RPTUFJTl9ETVgpOworICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoaEVuaGFuY2VkVGltZURteC0+c2ludXNXaW5kb3dfbSwgMSArIGZyYW1lbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwpOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPm1heEZyYW1lbGVuZ3RoID0gZnJhbWVsZW5ndGg7CisgICAgKnBoRW5oYW5jZWRUaW1lRG14ID0gaEVuaGFuY2VkVGltZURteDsKKyAgfQorICByZXR1cm4gZXJyb3I7CisKK2JhaWw6CisgIGZka19zYWNlbmNfY2xvc2VfZW5oYW5jZWRUaW1lRG9tYWluRG14KCZoRW5oYW5jZWRUaW1lRG14KTsKKyAgcmV0dXJuICgoU0FDRU5DX09LID09IGVycm9yKSA/IFNBQ0VOQ19NRU1PUllfRVJST1IgOiBlcnJvcik7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19pbml0X2VuaGFuY2VkVGltZURvbWFpbkRteCgKKyAgICBIQU5ETEVfRU5IQU5DRURfVElNRV9ET01BSU5fRE1YIGhFbmhhbmNlZFRpbWVEbXgsCisgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBJbnB1dEdhaW5fbSwgY29uc3QgSU5UIGlucHV0R2Fpbl9lLAorICAgIGNvbnN0IEZJWFBfREJMIG91dHB1dEdhaW5fbSwgY29uc3QgSU5UIG91dHB1dEdhaW5fZSwKKyAgICBjb25zdCBJTlQgZnJhbWVsZW5ndGgpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoaEVuaGFuY2VkVGltZURteCA9PSBOVUxMKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IHNtcDsKKyAgICBpZiAoZnJhbWVsZW5ndGggPiBoRW5oYW5jZWRUaW1lRG14LT5tYXhGcmFtZWxlbmd0aCkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5JVF9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5mcmFtZWxlbmd0aCA9IGZyYW1lbGVuZ3RoOworCisgICAgSU5UIGRlbHRheF9lOworICAgIEZJWFBfREJMIGRlbHRheF9tOworCisgICAgZGVsdGF4X20gPSBmRGl2Tm9ybUhpZ2hQcmVjKAorICAgICAgICBQSV9NLCAoRklYUF9EQkwpKDIgKiBoRW5oYW5jZWRUaW1lRG14LT5mcmFtZWxlbmd0aCksICZkZWx0YXhfZSk7CisgICAgZGVsdGF4X20gPSBzY2FsZVZhbHVlKGRlbHRheF9tLCBQSV9FICsgZGVsdGF4X2UgLSAoREZSQUNUX0JJVFMgLSAxKSAtIDEpOworICAgIGRlbHRheF9lID0gMTsKKworICAgIGZvciAoc21wID0gMDsgc21wIDwgaEVuaGFuY2VkVGltZURteC0+ZnJhbWVsZW5ndGggKyAxOyBzbXArKykgeworICAgICAgaEVuaGFuY2VkVGltZURteC0+c2ludXNXaW5kb3dfbVtzbXBdID0KKyAgICAgICAgICBmTXVsdChBTFBIQV9NLCBmUG93MihmaXhwX3NpbihzbXAgKiBkZWx0YXhfbSwgZGVsdGF4X2UpKSk7CisgICAgfQorICAgIGhFbmhhbmNlZFRpbWVEbXgtPnNpbnVzV2luZG93X2UgPSAtQUxQSEFfRTsKKworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfTGVmdF9tID0gaEVuaGFuY2VkVGltZURteC0+cHJldl9SaWdodF9tID0KKyAgICAgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9YTnJnX20gPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfTGVmdF9lID0gaEVuaGFuY2VkVGltZURteC0+cHJldl9SaWdodF9lID0KKyAgICAgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9YTnJnX2UgPSBERlJBQ1RfQklUUyAtIDE7CisKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5saW5fYmJDbGRfd2VpZ2h0X20gPQorICAgICAgICBmRGl2Tm9ybUhpZ2hQcmVjKGZQb3cyKHBJbnB1dEdhaW5fbVtMXSksIGZQb3cyKHBJbnB1dEdhaW5fbVtSXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbmhhbmNlZFRpbWVEbXgtPmxpbl9iYkNsZF93ZWlnaHRfZSk7CisKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9tW0xdID0gZk11bHQocElucHV0R2Fpbl9tW0xdLCBvdXRwdXRHYWluX20pOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPmdhaW5fd2VpZ2h0X21bUl0gPSBmTXVsdChwSW5wdXRHYWluX21bUl0sIG91dHB1dEdhaW5fbSk7CisgICAgaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfZSA9CisgICAgICAgIC1mTm9ybShmaXhNYXgoaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfbVtMXSwKKyAgICAgICAgICAgICAgICAgICAgICBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9tW1JdKSk7CisKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9tW0xdID0gc2NhbGVWYWx1ZSgKKyAgICAgICAgaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfbVtMXSwgLWhFbmhhbmNlZFRpbWVEbXgtPmdhaW5fd2VpZ2h0X2UpOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPmdhaW5fd2VpZ2h0X21bUl0gPSBzY2FsZVZhbHVlKAorICAgICAgICBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9tW1JdLCAtaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfZSk7CisgICAgaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfZSArPSBpbnB1dEdhaW5fZSArIG91dHB1dEdhaW5fZTsKKworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfZ2Fpbl9tW0xdID0gaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfbVtMXSA+PiAxOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfZ2Fpbl9tW1JdID0gaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfbVtSXSA+PiAxOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfZ2Fpbl9lID0gaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfZSArIDE7CisKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X0gxX21bTF0gPQorICAgICAgICBzY2FsZVZhbHVlKGhFbmhhbmNlZFRpbWVEbXgtPmdhaW5fd2VpZ2h0X21bTF0sIC00KTsKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X0gxX21bUl0gPQorICAgICAgICBzY2FsZVZhbHVlKGhFbmhhbmNlZFRpbWVEbXgtPmdhaW5fd2VpZ2h0X21bUl0sIC00KTsKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X0gxX2UgPSAyICsgMiArIGhFbmhhbmNlZFRpbWVEbXgtPmdhaW5fd2VpZ2h0X2U7CisgIH0KK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2FwcGx5X2VuaGFuY2VkVGltZURvbWFpbkRteCgKKyAgICBIQU5ETEVfRU5IQU5DRURfVElNRV9ET01BSU5fRE1YIGhFbmhhbmNlZFRpbWVEbXgsCisgICAgY29uc3QgSU5UX1BDTSAqY29uc3QgKmNvbnN0IGlucHV0VGltZSwgSU5UX1BDTSAqY29uc3Qgb3V0cHV0VGltZURteCwKKyAgICBjb25zdCBJTlQgSW5wdXREZWxheSkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoTlVMTCA9PSBoRW5oYW5jZWRUaW1lRG14KSB8fCAoTlVMTCA9PSBpbnB1dFRpbWUpIHx8CisgICAgICAoTlVMTCA9PSBpbnB1dFRpbWVbTF0pIHx8IChOVUxMID09IGlucHV0VGltZVtSXSkgfHwKKyAgICAgIChOVUxMID09IG91dHB1dFRpbWVEbXgpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IHNtcDsKKyAgICBGSVhQX0RCTCBsaW5fYmJDbGRfbSwgbGluX0NsZF9tLCBiYkNvcnJfbSwgc3FydF9saW5DbGRfbSwgR19tWzJdLCBIMV9tWzJdLAorICAgICAgICBnYWluTGVmdF9tLCBnYWluUmlnaHRfbTsKKyAgICBGSVhQX0RCTCBiYk5yZ0xlZnRfbSwgYmJOcmdSaWdodF9tLCBiYlhOcmdfbSwgbnJnTGVmdF9tLCBucmdSaWdodF9tLCBucmdYX207CisgICAgSU5UIGxpbl9iYkNsZF9lLCBsaW5fQ2xkX2UsIGJiQ29ycl9lLCBzcXJ0X2xpbkNsZF9lLCBHX2UsIEgxX2U7CisgICAgSU5UIGJiTnJnTGVmdF9lLCBiYk5yZ1JpZ2h0X2UsIGJiWE5yZ19lLCBucmdMZWZ0X2UsIG5yZ1JpZ2h0X2UsIG5yZ1hfZTsKKworICAgIC8qIEluY3JlYXNlIGVuZXJneSB0aW1lIHJlc29sdXRpb24gd2l0aCBzaG9ydGVyIHByb2Nlc3NpbmcgYmxvY2tzLiAxMjggaXMgYW4KKyAgICAgKiBlbXBpcmljIHZhbHVlLiAqLworICAgIGNvbnN0IGludCBncmFudWxlTGVuZ3RoID0gZml4TWluKDEyOCwgaEVuaGFuY2VkVGltZURteC0+ZnJhbWVsZW5ndGgpOworICAgIGludCBncmFudWxlU2hpZnQgPQorICAgICAgICAoZ3JhbnVsZUxlbmd0aCA+IDEpCisgICAgICAgICAgICA/ICgoREZSQUNUX0JJVFMgLSAxKSAtIGZOb3JtKChGSVhQX0RCTCkoZ3JhbnVsZUxlbmd0aCAtIDEpKSkKKyAgICAgICAgICAgIDogMDsKKyAgICBncmFudWxlU2hpZnQgPSBmaXhNYXgoCisgICAgICAgIDMsIGdyYW51bGVTaGlmdCArCisgICAgICAgICAgICAgICAxKTsgLyogb25lIGJpdCBtb3JlIGhlYWRyb29tIGZvciB3b3JzdCBjYXNlIGFjY3VtdWxhdGlvbiAqLworCisgICAgc21wID0gMDsKKworICAgIC8qIFByZXZlbnQgZGl2aXNpb24gYnkgemVyby4gKi8KKyAgICBiYk5yZ0xlZnRfbSA9IGJiTnJnUmlnaHRfbSA9IGJiWE5yZ19tID0gKEZJWFBfREJMKSgxKTsKKyAgICBiYk5yZ0xlZnRfZSA9IGJiTnJnUmlnaHRfZSA9IGJiWE5yZ19lID0gMDsKKworICAgIGRvIHsKKyAgICAgIGNvbnN0IGludCBvZmZzZXQgPSBzbXA7CisgICAgICBGSVhQX0RCTCBwYXJ0aWFsTCwgcGFydGlhbFIsIHBhcnRpYWxYOworICAgICAgcGFydGlhbEwgPSBwYXJ0aWFsUiA9IHBhcnRpYWxYID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKworICAgICAgaW50IGluX21hcmdpbiA9IEZES21pbigKKyAgICAgICAgICBnZXRTY2FsZWZhY3RvclBDTSgKKyAgICAgICAgICAgICAgJmlucHV0VGltZVtMXVtvZmZzZXRdLAorICAgICAgICAgICAgICBmaXhNaW4ob2Zmc2V0ICsgZ3JhbnVsZUxlbmd0aCwgaEVuaGFuY2VkVGltZURteC0+ZnJhbWVsZW5ndGgpIC0KKyAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgMSksCisgICAgICAgICAgZ2V0U2NhbGVmYWN0b3JQQ00oCisgICAgICAgICAgICAgICZpbnB1dFRpbWVbUl1bb2Zmc2V0XSwKKyAgICAgICAgICAgICAgZml4TWluKG9mZnNldCArIGdyYW51bGVMZW5ndGgsIGhFbmhhbmNlZFRpbWVEbXgtPmZyYW1lbGVuZ3RoKSAtCisgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgIDEpKTsKKworICAgICAgLyogcGFydGlhbCBlbmVyZ3kgKi8KKyAgICAgIGZvciAoc21wID0gb2Zmc2V0OworICAgICAgICAgICBzbXAgPCBmaXhNaW4ob2Zmc2V0ICsgZ3JhbnVsZUxlbmd0aCwgaEVuaGFuY2VkVGltZURteC0+ZnJhbWVsZW5ndGgpOworICAgICAgICAgICBzbXArKykgeworICAgICAgICBGSVhQX1BDTSBpbnB1dEwgPQorICAgICAgICAgICAgc2NhbGVWYWx1ZSgoRklYUF9QQ00paW5wdXRUaW1lW0xdW3NtcF0sIGluX21hcmdpbiAtIDEpOworICAgICAgICBGSVhQX1BDTSBpbnB1dFIgPQorICAgICAgICAgICAgc2NhbGVWYWx1ZSgoRklYUF9QQ00paW5wdXRUaW1lW1JdW3NtcF0sIGluX21hcmdpbiAtIDEpOworCisgICAgICAgIHBhcnRpYWxMICs9IGZQb3cyRGl2MihpbnB1dEwpID4+IChncmFudWxlU2hpZnQgLSAzKTsKKyAgICAgICAgcGFydGlhbFIgKz0gZlBvdzJEaXYyKGlucHV0UikgPj4gKGdyYW51bGVTaGlmdCAtIDMpOworICAgICAgICBwYXJ0aWFsWCArPSBmTXVsdERpdjIoaW5wdXRMLCBpbnB1dFIpID4+IChncmFudWxlU2hpZnQgLSAzKTsKKyAgICAgIH0KKworICAgICAgZml4cEFkZE5vcm0ocGFydGlhbEwsIGdyYW51bGVTaGlmdCAtIDIgKiBpbl9tYXJnaW4sICZiYk5yZ0xlZnRfbSwKKyAgICAgICAgICAgICAgICAgICZiYk5yZ0xlZnRfZSk7CisgICAgICBmaXhwQWRkTm9ybShwYXJ0aWFsUiwgZ3JhbnVsZVNoaWZ0IC0gMiAqIGluX21hcmdpbiwgJmJiTnJnUmlnaHRfbSwKKyAgICAgICAgICAgICAgICAgICZiYk5yZ1JpZ2h0X2UpOworICAgICAgZml4cEFkZE5vcm0ocGFydGlhbFgsIGdyYW51bGVTaGlmdCAtIDIgKiBpbl9tYXJnaW4sICZiYlhOcmdfbSwgJmJiWE5yZ19lKTsKKyAgICB9IHdoaWxlIChzbXAgPCBoRW5oYW5jZWRUaW1lRG14LT5mcmFtZWxlbmd0aCk7CisKKyAgICBucmdMZWZ0X20gPQorICAgICAgICBmaXhwQWRkKGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfTGVmdF9tLCBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X0xlZnRfZSwKKyAgICAgICAgICAgICAgICBiYk5yZ0xlZnRfbSwgYmJOcmdMZWZ0X2UsICZucmdMZWZ0X2UpOworICAgIG5yZ1JpZ2h0X20gPQorICAgICAgICBmaXhwQWRkKGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfUmlnaHRfbSwgaEVuaGFuY2VkVGltZURteC0+cHJldl9SaWdodF9lLAorICAgICAgICAgICAgICAgIGJiTnJnUmlnaHRfbSwgYmJOcmdSaWdodF9lLCAmbnJnUmlnaHRfZSk7CisgICAgbnJnWF9tID0KKyAgICAgICAgZml4cEFkZChoRW5oYW5jZWRUaW1lRG14LT5wcmV2X1hOcmdfbSwgaEVuaGFuY2VkVGltZURteC0+cHJldl9YTnJnX2UsCisgICAgICAgICAgICAgICAgYmJYTnJnX20sIGJiWE5yZ19lLCAmbnJnWF9lKTsKKworICAgIGxpbl9iYkNsZF9tID0gZk11bHQoaEVuaGFuY2VkVGltZURteC0+bGluX2JiQ2xkX3dlaWdodF9tLAorICAgICAgICAgICAgICAgICAgICAgICAgZkRpdk5vcm0obnJnTGVmdF9tLCBucmdSaWdodF9tLCAmbGluX2JiQ2xkX2UpKTsKKyAgICBsaW5fYmJDbGRfZSArPQorICAgICAgICBoRW5oYW5jZWRUaW1lRG14LT5saW5fYmJDbGRfd2VpZ2h0X2UgKyBucmdMZWZ0X2UgLSBucmdSaWdodF9lOworCisgICAgYmJDb3JyX20gPSBmTXVsdChucmdYX20sIGludlNxcnROb3JtMihmTXVsdChucmdMZWZ0X20sIG5yZ1JpZ2h0X20pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJnTGVmdF9lICsgbnJnUmlnaHRfZSwgJmJiQ29ycl9lKSk7CisgICAgYmJDb3JyX2UgKz0gbnJnWF9lOworCisgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9MZWZ0X20gPSBiYk5yZ0xlZnRfbTsKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X0xlZnRfZSA9IGJiTnJnTGVmdF9lOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfUmlnaHRfbSA9IGJiTnJnUmlnaHRfbTsKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X1JpZ2h0X2UgPSBiYk5yZ1JpZ2h0X2U7CisgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9YTnJnX20gPSBiYlhOcmdfbTsKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X1hOcmdfZSA9IGJiWE5yZ19lOworCisgICAgLyoKKyAgICAgICBiYkNsZCAgICA9IDEwLmYqbG9nMTAobGluX2JiQ2xkKQorCisgICAgICAgbGluX0NsZCAgPSBwb3coMTAsYmJDbGQvMjApCisgICAgICAgICAgICAgICAgPSBwb3coMTAsMTAuZipsb2cxMChsaW5fYmJDbGQpLzIwLmYpCisgICAgICAgICAgICAgICAgPSBzcXJ0KGxpbl9iYkNsZCkKKworICAgICAgIGxpbl9DbGQyID0gbGluX0NsZCpsaW5fQ2xkCisgICAgICAgICAgICAgICAgPSBzcXJ0KGxpbl9iYkNsZCkqc3FydChsaW5fYmJDbGQpCisgICAgICAgICAgICAgICAgPSBsaW5fYmJDbGQKKyAgICAgKi8KKyAgICBsaW5fQ2xkX20gPSBzcXJ0Rml4cChsaW5fYmJDbGRfbSwgbGluX2JiQ2xkX2UsICZsaW5fQ2xkX2UpOworICAgIHNxcnRfbGluQ2xkX20gPSBzcXJ0Rml4cChsaW5fQ2xkX20sIGxpbl9DbGRfZSwgJnNxcnRfbGluQ2xkX2UpOworCisgICAgLypjYWxjdWxhdGUgaG93IG11Y2ggcmlnaHQgYW5kIGhvdyBtdWNoIGxlZnQgc2lnbmFsLCB0byBhdm9pZCBzaWduYWwKKyAgICAgKiBjYW5jZWxsYXRpb25zKi8KKyAgICBjYWxjdWxhdGVSYXRpbyhzcXJ0X2xpbkNsZF9tLCBzcXJ0X2xpbkNsZF9lLCBsaW5fQ2xkX20sIGxpbl9DbGRfZSwgYmJDb3JyX20sCisgICAgICAgICAgICAgICAgICAgYmJDb3JyX2UsIEdfbSwgJkdfZSk7CisKKyAgICAvKmNhbGN1bGF0ZSBkb3dubWl4IGdhaW5zKi8KKyAgICBjYWxjdWxhdGVEbXhHYWlucyhsaW5fQ2xkX20sIGxpbl9DbGRfZSwgbGluX2JiQ2xkX20sIGxpbl9iYkNsZF9lLCBiYkNvcnJfbSwKKyAgICAgICAgICAgICAgICAgICAgICBiYkNvcnJfZSwgR19tLCBHX2UsIEgxX20sICZIMV9lKTsKKworICAgIC8qYWRhcHQgb3V0cHV0IGdhaW5zKi8KKyAgICBIMV9tW0xdID0gZk11bHQoSDFfbVtMXSwgaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfbVtMXSk7CisgICAgSDFfbVtSXSA9IGZNdWx0KEgxX21bUl0sIGhFbmhhbmNlZFRpbWVEbXgtPmdhaW5fd2VpZ2h0X21bUl0pOworICAgIEgxX2UgKz0gaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfZTsKKworICAgIGdhaW5MZWZ0X20gPSBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X2dhaW5fbVtMXTsKKyAgICBnYWluUmlnaHRfbSA9IGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfZ2Fpbl9tW1JdOworCisgICAgSU5UIGludGVybWVkaWF0ZV9nYWluX2UgPQorICAgICAgICAraEVuaGFuY2VkVGltZURteC0+c2ludXNXaW5kb3dfZSArIEgxX2UgLSBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X2dhaW5fZTsKKworICAgIGZvciAoc21wID0gMDsgc21wIDwgaEVuaGFuY2VkVGltZURteC0+ZnJhbWVsZW5ndGg7IHNtcCsrKSB7CisgICAgICBjb25zdCBJTlQgTiA9IGhFbmhhbmNlZFRpbWVEbXgtPmZyYW1lbGVuZ3RoOworICAgICAgRklYUF9EQkwgaW50ZXJtZWRpYXRlX2dhaW5MZWZ0X20sIGludGVybWVkaWF0ZV9nYWluUmlnaHRfbSwgdG1wOworCisgICAgICBpbnRlcm1lZGlhdGVfZ2FpbkxlZnRfbSA9CisgICAgICAgICAgc2NhbGVWYWx1ZSgoZk11bHQoaEVuaGFuY2VkVGltZURteC0+c2ludXNXaW5kb3dfbVtzbXBdLCBIMV9tW0xdKSArCisgICAgICAgICAgICAgICAgICAgICAgZk11bHQoaEVuaGFuY2VkVGltZURteC0+c2ludXNXaW5kb3dfbVtOIC0gc21wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X0gxX21bTF0pKSwKKyAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9nYWluX2UpOworICAgICAgaW50ZXJtZWRpYXRlX2dhaW5SaWdodF9tID0KKyAgICAgICAgICBzY2FsZVZhbHVlKChmTXVsdChoRW5oYW5jZWRUaW1lRG14LT5zaW51c1dpbmRvd19tW3NtcF0sIEgxX21bUl0pICsKKyAgICAgICAgICAgICAgICAgICAgICBmTXVsdChoRW5oYW5jZWRUaW1lRG14LT5zaW51c1dpbmRvd19tW04gLSBzbXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfSDFfbVtSXSkpLAorICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX2dhaW5fZSk7CisKKyAgICAgIGdhaW5MZWZ0X20gPSBpbnRlcm1lZGlhdGVfZ2FpbkxlZnRfbSArCisgICAgICAgICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMS5mIC0gQUxQSEFfRkxUKSwgZ2FpbkxlZnRfbSk7CisgICAgICBnYWluUmlnaHRfbSA9IGludGVybWVkaWF0ZV9nYWluUmlnaHRfbSArCisgICAgICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuZiAtIEFMUEhBX0ZMVCksIGdhaW5SaWdodF9tKTsKKworICAgICAgdG1wID0gZk11bHREaXYyKGdhaW5MZWZ0X20sIChGSVhQX1BDTSlpbnB1dFRpbWVbTF1bc21wICsgSW5wdXREZWxheV0pICsKKyAgICAgICAgICAgIGZNdWx0RGl2MihnYWluUmlnaHRfbSwgKEZJWFBfUENNKWlucHV0VGltZVtSXVtzbXAgKyBJbnB1dERlbGF5XSk7CisgICAgICBvdXRwdXRUaW1lRG14W3NtcF0gPSAoSU5UX1BDTSlTQVRVUkFURV9TSElGVCgKKyAgICAgICAgICB0bXAsCisgICAgICAgICAgLShoRW5oYW5jZWRUaW1lRG14LT5wcmV2X2dhaW5fZSArIDEgLSAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUykpLAorICAgICAgICAgIFNBTVBMRV9CSVRTKTsKKyAgICB9CisKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X2dhaW5fbVtMXSA9IGdhaW5MZWZ0X207CisgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9nYWluX21bUl0gPSBnYWluUmlnaHRfbTsKKworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfSDFfbVtMXSA9IEgxX21bTF07CisgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9IMV9tW1JdID0gSDFfbVtSXTsKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X0gxX2UgPSBIMV9lOworICB9CisKKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVSYXRpbyhjb25zdCBGSVhQX0RCTCBzcXJ0X2xpbkNsZF9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNxcnRfbGluQ2xkX2UsIGNvbnN0IEZJWFBfREJMIGxpbl9DbGRfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBsaW5fQ2xkX2UsIGNvbnN0IEZJWFBfREJMIEljY19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIEljY19lLCBGSVhQX0RCTCBHX21bMl0sIElOVCAqR19lKSB7CisjZGVmaW5lIEdfU0NBTEVfRkFDVE9SICgyKQorCisgIGlmIChJY2NfbSA+PSBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgR19tWzBdID0gR19tWzFdID0gRkwyRlhDT05TVF9EQkwoMS5mIC8gKGZsb2F0KSgxIDw8IEdfU0NBTEVfRkFDVE9SKSk7CisgICAgR19lWzBdID0gR19TQ0FMRV9GQUNUT1I7CisgIH0gZWxzZSB7CisgICAgY29uc3QgRklYUF9EQkwgbWF4X2dhaW5fZmFjdG9yID0KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMi5mIC8gKGZsb2F0KSgxIDw8IEdfU0NBTEVfRkFDVE9SKSk7CisgICAgRklYUF9EQkwgdG1wMV9tLCB0bXAyX20sIG51bWVyYXRvcl9tLCBkZW5vbWluYXRvcl9tLCByX20sIHI0X20sIHE7CisgICAgSU5UIHRtcDFfZSwgdG1wMl9lLCBudW1lcmF0b3JfZSwgZGVub21pbmF0b3JfZSwgcl9lLCByNF9lOworCisgICAgLyogIHIgICA9IChsaW5fQ2xkICsgMSArIDIqSWNjKnNxcnRfbGluQ2xkKSAvIChsaW5fQ2xkICsgMSAtCisgICAgICogMipJY2Mqc3FydF9saW5DbGQpID0gKHRtcDEgKyB0bXAyKSAvICh0bXAxIC0gdG1wMikKKyAgICAgKi8KKyAgICB0bXAxX20gPQorICAgICAgICBmaXhwQWRkKGxpbl9DbGRfbSwgbGluX0NsZF9lLCBGTDJGWENPTlNUX0RCTCgxLmYgLyAyLmYpLCAxLCAmdG1wMV9lKTsKKworICAgIHRtcDJfbSA9IGZNdWx0KEljY19tLCBzcXJ0X2xpbkNsZF9tKTsKKyAgICB0bXAyX2UgPSAxICsgSWNjX2UgKyBzcXJ0X2xpbkNsZF9lOworICAgIG51bWVyYXRvcl9tID0gZml4cEFkZCh0bXAxX20sIHRtcDFfZSwgdG1wMl9tLCB0bXAyX2UsICZudW1lcmF0b3JfZSk7CisgICAgZGVub21pbmF0b3JfbSA9IGZpeHBBZGQodG1wMV9tLCB0bXAxX2UsIC10bXAyX20sIHRtcDJfZSwgJmRlbm9taW5hdG9yX2UpOworCisgICAgaWYgKChudW1lcmF0b3JfbSA+IEZMMkZYQ09OU1RfREJMKDAuZikpICYmCisgICAgICAgIChkZW5vbWluYXRvcl9tID4gRkwyRlhDT05TVF9EQkwoMC5mKSkpIHsKKyAgICAgIHJfbSA9IGZEaXZOb3JtKG51bWVyYXRvcl9tLCBkZW5vbWluYXRvcl9tLCAmcl9lKTsKKyAgICAgIHJfZSArPSBudW1lcmF0b3JfZSAtIGRlbm9taW5hdG9yX2U7CisKKyAgICAgIC8qIHJfNCA9IHNxcnQoIHNxcnQoIHIgKSApICovCisgICAgICByNF9tID0gc3FydEZpeHAocl9tLCByX2UsICZyNF9lKTsKKyAgICAgIHI0X20gPSBzcXJ0Rml4cChyNF9tLCByNF9lLCAmcjRfZSk7CisKKyAgICAgIHI0X2UgLT0gR19TQ0FMRV9GQUNUT1I7CisKKyAgICAgIC8qIHEgPSBtaW4ocjRfbSwgbWF4X2dhaW5fZmFjdG9yKSAqLworICAgICAgcSA9ICgocjRfZSA+PSAwKSAmJiAocjRfbSA+PSAobWF4X2dhaW5fZmFjdG9yID4+IHI0X2UpKSkKKyAgICAgICAgICAgICAgPyBtYXhfZ2Fpbl9mYWN0b3IKKyAgICAgICAgICAgICAgOiBzY2FsZVZhbHVlKHI0X20sIHI0X2UpOworICAgIH0gZWxzZSB7CisgICAgICBxID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICB9CisKKyAgICBHX21bMF0gPSBtYXhfZ2Fpbl9mYWN0b3IgLSBxOworICAgIEdfbVsxXSA9IHE7CisKKyAgICAqR19lID0gR19TQ0FMRV9GQUNUT1I7CisgIH0KK30KKworc3RhdGljIHZvaWQgY2FsY3VsYXRlRG14R2FpbnMoY29uc3QgRklYUF9EQkwgbGluX0NsZF9tLCBjb25zdCBJTlQgbGluX0NsZF9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgbGluX0NsZDJfbSwgY29uc3QgSU5UIGxpbl9DbGQyX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBJY2NfbSwgY29uc3QgSU5UIEljY19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgR19tWzJdLCBjb25zdCBJTlQgR19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgSDFfbVsyXSwgSU5UICpwSDFfZSkgeworI2RlZmluZSBIMV9TQ0FMRV9GQUNUT1IgKDIpCisgIGNvbnN0IEZJWFBfREJMIG1heF9nYWluX2ZhY3RvciA9CisgICAgICBGTDJGWENPTlNUX0RCTCgyLmYgLyAoZmxvYXQpKDEgPDwgSDFfU0NBTEVfRkFDVE9SKSk7CisKKyAgRklYUF9EQkwgbnJnUmlnaHRfbSwgbnJnTGVmdF9tLCBjcm9zc05yZ19tLCBpbnZfd2VpZ2h0X251bV9tLAorICAgICAgaW52X3dlaWdodF9kZW5vbV9tLCBpbnZlcnNlX3dlaWdodF9tLCBpbnZlcnNlX3dlaWdodF9saW1pdGVkOworICBJTlQgbnJnUmlnaHRfZSwgbnJnTGVmdF9lLCBjcm9zc05yZ19lLCBpbnZfd2VpZ2h0X251bV9lLCBpbnZfd2VpZ2h0X2Rlbm9tX2UsCisgICAgICBpbnZlcnNlX3dlaWdodF9lOworCisgIC8qIG5yZ1JpZ2h0ID0gc3FydCgxLyhsaW5fQ2xkMiArIDEpICovCisgIG5yZ1JpZ2h0X20gPSBmaXhwQWRkKGxpbl9DbGQyX20sIGxpbl9DbGQyX2UsIEZMMkZYQ09OU1RfREJMKDEuZiAvIDIuZiksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICZucmdSaWdodF9lKTsKKyAgbnJnUmlnaHRfbSA9IGludlNxcnROb3JtMihucmdSaWdodF9tLCBucmdSaWdodF9lLCAmbnJnUmlnaHRfZSk7CisKKyAgLyogbnJnTGVmdCA9IGxpbl9DbGQgKiBucmdSaWdodCAqLworICBucmdMZWZ0X20gPSBmTXVsdChsaW5fQ2xkX20sIG5yZ1JpZ2h0X20pOworICBucmdMZWZ0X2UgPSBsaW5fQ2xkX2UgKyBucmdSaWdodF9lOworCisgIC8qIGNyb3NzTnJnID0gc3FydChucmdMZWZ0Km5yZ1JpZ2h0KSAqLworICBjcm9zc05yZ19tID0gc3FydEZpeHAoZk11bHQobnJnTGVmdF9tLCBucmdSaWdodF9tKSwgbnJnTGVmdF9lICsgbnJnUmlnaHRfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjcm9zc05yZ19lKTsKKworICAvKiBpbnZlcnNlX3dlaWdodCA9IHNxcnQoKG5yZ0xlZnQgKyBucmdSaWdodCkgLyAoIChHWzBdKkdbMF0qbnJnTGVmdCkgKworICAgKiAoR1sxXSpHWzFdKm5yZ1JpZ2h0KSArIDIqR1swXSpHWzFdKkljYypjcm9zc05yZykpID0gc3FydChpbnZfd2VpZ2h0X251bSAvCisgICAqIGludl93ZWlnaHRfZGVub20pCisgICAqLworICBpbnZfd2VpZ2h0X251bV9tID0KKyAgICAgIGZpeHBBZGQobnJnUmlnaHRfbSwgbnJnUmlnaHRfZSwgbnJnTGVmdF9tLCBucmdMZWZ0X2UsICZpbnZfd2VpZ2h0X251bV9lKTsKKworICBpbnZfd2VpZ2h0X2Rlbm9tX20gPQorICAgICAgZml4cEFkZChmTXVsdChmUG93MihHX21bMF0pLCBucmdMZWZ0X20pLCAyICogR19lICsgbnJnTGVmdF9lLAorICAgICAgICAgICAgICBmTXVsdChmUG93MihHX21bMV0pLCBucmdSaWdodF9tKSwgMiAqIEdfZSArIG5yZ1JpZ2h0X2UsCisgICAgICAgICAgICAgICZpbnZfd2VpZ2h0X2Rlbm9tX2UpOworCisgIGludl93ZWlnaHRfZGVub21fbSA9CisgICAgICBmaXhwQWRkKGZNdWx0KGZNdWx0KGZNdWx0KEdfbVswXSwgR19tWzFdKSwgY3Jvc3NOcmdfbSksIEljY19tKSwKKyAgICAgICAgICAgICAgMSArIDIgKiBHX2UgKyBjcm9zc05yZ19lICsgSWNjX2UsIGludl93ZWlnaHRfZGVub21fbSwKKyAgICAgICAgICAgICAgaW52X3dlaWdodF9kZW5vbV9lLCAmaW52X3dlaWdodF9kZW5vbV9lKTsKKworICBpZiAoaW52X3dlaWdodF9kZW5vbV9tID4gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgIGludmVyc2Vfd2VpZ2h0X20gPQorICAgICAgICBmRGl2Tm9ybShpbnZfd2VpZ2h0X251bV9tLCBpbnZfd2VpZ2h0X2Rlbm9tX20sICZpbnZlcnNlX3dlaWdodF9lKTsKKyAgICBpbnZlcnNlX3dlaWdodF9tID0KKyAgICAgICAgc3FydEZpeHAoaW52ZXJzZV93ZWlnaHRfbSwKKyAgICAgICAgICAgICAgICAgaW52ZXJzZV93ZWlnaHRfZSArIGludl93ZWlnaHRfbnVtX2UgLSBpbnZfd2VpZ2h0X2Rlbm9tX2UsCisgICAgICAgICAgICAgICAgICZpbnZlcnNlX3dlaWdodF9lKTsKKyAgICBpbnZlcnNlX3dlaWdodF9lIC09IEgxX1NDQUxFX0ZBQ1RPUjsKKworICAgIC8qIGludmVyc2Vfd2VpZ2h0X2xpbWl0ZWQgPSBtaW4obWF4X2dhaW5fZmFjdG9yLCBpbnZlcnNlX3dlaWdodCkgKi8KKyAgICBpbnZlcnNlX3dlaWdodF9saW1pdGVkID0KKyAgICAgICAgKChpbnZlcnNlX3dlaWdodF9lID49IDApICYmCisgICAgICAgICAoaW52ZXJzZV93ZWlnaHRfbSA+PSAobWF4X2dhaW5fZmFjdG9yID4+IGludmVyc2Vfd2VpZ2h0X2UpKSkKKyAgICAgICAgICAgID8gbWF4X2dhaW5fZmFjdG9yCisgICAgICAgICAgICA6IHNjYWxlVmFsdWUoaW52ZXJzZV93ZWlnaHRfbSwgaW52ZXJzZV93ZWlnaHRfZSk7CisgIH0gZWxzZSB7CisgICAgaW52ZXJzZV93ZWlnaHRfbGltaXRlZCA9IG1heF9nYWluX2ZhY3RvcjsKKyAgfQorCisgIEgxX21bMF0gPSBmTXVsdChHX21bMF0sIGludmVyc2Vfd2VpZ2h0X2xpbWl0ZWQpOworICBIMV9tWzFdID0gZk11bHQoR19tWzFdLCBpbnZlcnNlX3dlaWdodF9saW1pdGVkKTsKKworICAqcEgxX2UgPSBHX2UgKyBIMV9TQ0FMRV9GQUNUT1I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19jbG9zZV9lbmhhbmNlZFRpbWVEb21haW5EbXgoCisgICAgSEFORExFX0VOSEFOQ0VEX1RJTUVfRE9NQUlOX0RNWCAqcGhFbmhhbmNlZFRpbWVEbXgpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAocGhFbmhhbmNlZFRpbWVEbXggPT0gTlVMTCkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGlmICgqcGhFbmhhbmNlZFRpbWVEbXggIT0gTlVMTCkgeworICAgICAgaWYgKCgqcGhFbmhhbmNlZFRpbWVEbXgpLT5zaW51c1dpbmRvd19tICE9IE5VTEwpIHsKKyAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKCgqcGhFbmhhbmNlZFRpbWVEbXgpLT5zaW51c1dpbmRvd19tKTsKKyAgICAgIH0KKyAgICAgIEZES19GUkVFX01FTU9SWV8xRCgqcGhFbmhhbmNlZFRpbWVEbXgpOworICAgIH0KKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19kbXhfdGRvbV9lbmguaCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2RteF90ZG9tX2VuaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzk5MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19kbXhfdGRvbV9lbmguaApAQCAtMCwwICsxLDEzNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTS4gTHVpcyBWYWxlcm8KKworICAgRGVzY3JpcHRpb246IEVuaGFuY2VkIFRpbWUgRG9tYWluIERvd25taXgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNFTkNfRE1YX1RET01fRU5IX0gKKyNkZWZpbmUgU0FDRU5DX0RNWF9URE9NX0VOSF9ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJzYWNlbmNfbGliLmgiCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IFRfRU5IQU5DRURfVElNRV9ET01BSU5fRE1YICpIQU5ETEVfRU5IQU5DRURfVElNRV9ET01BSU5fRE1YOworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19vcGVuX2VuaGFuY2VkVGltZURvbWFpbkRteCgKKyAgICBIQU5ETEVfRU5IQU5DRURfVElNRV9ET01BSU5fRE1YICpoRW5oYW5jZWRUaW1lRG14LCBjb25zdCBJTlQgZnJhbWVsZW5ndGgpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfaW5pdF9lbmhhbmNlZFRpbWVEb21haW5EbXgoCisgICAgSEFORExFX0VOSEFOQ0VEX1RJTUVfRE9NQUlOX0RNWCBoRW5oYW5jZWRUaW1lRG14LAorICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwSW5wdXRHYWluX20sIGNvbnN0IElOVCBpbnB1dEdhaW5fZSwKKyAgICBjb25zdCBGSVhQX0RCTCBvdXRwdXRHYWluX20sIGNvbnN0IElOVCBvdXRwdXRHYWluX2UsIGNvbnN0IElOVCBmcmFtZWxlbmd0aCk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19hcHBseV9lbmhhbmNlZFRpbWVEb21haW5EbXgoCisgICAgSEFORExFX0VOSEFOQ0VEX1RJTUVfRE9NQUlOX0RNWCBoRW5oYW5jZWRUaW1lRG14LAorICAgIGNvbnN0IElOVF9QQ00gKmNvbnN0ICpjb25zdCBpbnB1dFRpbWUsIElOVF9QQ00gKmNvbnN0IG91dHB1dFRpbWVEbXgsCisgICAgY29uc3QgSU5UIElucHV0RGVsYXkpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfY2xvc2VfZW5oYW5jZWRUaW1lRG9tYWluRG14KAorICAgIEhBTkRMRV9FTkhBTkNFRF9USU1FX0RPTUFJTl9ETVggKmhFbmhhbmNlZFRpbWVEbXgpOworCisjZW5kaWYgLyogU0FDRU5DX0RNWF9URE9NX0VOSF9IICovCmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19maWx0ZXIuY3BwIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWYwNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZmlsdGVyLmNwcApAQCAtMCwwICsxLDIwNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTS4gTXVsdHJ1cworCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5CisgICAgICAgICAgICAgICAgRmlsdGVyIGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX2ZpbHRlci5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IFRfRENfRklMVEVSIHsKKyAgRklYUF9EQkwgY19fRkRLOworICBGSVhQX0RCTCBzdGF0ZV9fRkRLOworCit9IERDX0ZJTFRFUjsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19jcmVhdGVEQ0ZpbHRlcihIQU5ETEVfRENfRklMVEVSICpoRENGaWx0ZXIpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBoRENGaWx0ZXIpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKCpoRENGaWx0ZXIsIDEsIERDX0ZJTFRFUik7CisgIH0KKyAgcmV0dXJuIGVycm9yOworCitiYWlsOgorICBmZGtfc2FjZW5jX2Rlc3Ryb3lEQ0ZpbHRlcihoRENGaWx0ZXIpOworICByZXR1cm4gKChTQUNFTkNfT0sgPT0gZXJyb3IpID8gU0FDRU5DX01FTU9SWV9FUlJPUiA6IGVycm9yKTsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2luaXREQ0ZpbHRlcihIQU5ETEVfRENfRklMVEVSIGhEQ0ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBzYW1wbGVSYXRlKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgRklYUF9EQkwgZXhwQzsKKyAgaW50IHM7CisKKyAgLyogQ29udmVyc2lvbiBmb3IgdXNlIG9mIENhbGNJbnZMZERhdGE6IGVeeCA9IDJeKHgqbG9nMTAoZSkvbG9nMTAoMikgPQorICAgICBDYWxjSW52TGREYXRhKHgqbG9nMTAoZSkvbG9nMTAoMikvNjQuMCkgMS40NDI2OTUwNDA4OSA9IGxvZzEwKGUpL2xvZzEwKDIpCisgICAgIDAuNSAgICAgICAgICAgPSBzY2FsZSBjb25zdGFudCB2YWx1ZSB3aXRoIDEgQml0cworICAqLworICBleHBDID0gZkRpdk5vcm1IaWdoUHJlYygoRklYUF9EQkwpMjAsIChGSVhQX0RCTClzYW1wbGVSYXRlLCAmcyk7CisgIGV4cEMgPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoLTEuNDQyNjk1MDQwODkgKiAwLjUpLCBleHBDKSA+PgorICAgICAgICAgKExEX0RBVEFfU0hJRlQgLSAxIC0gMSk7CisKKyAgaWYgKHMgPCAwKQorICAgIGV4cEMgPSBleHBDID4+ICgtcyk7CisgIGVsc2UKKyAgICBleHBDID0gZXhwQyA8PCAocyk7CisKKyAgZXhwQyA9IENhbGNJbnZMZERhdGEoZXhwQyk7CisKKyAgaERDRmlsdGVyLT5jX19GREsgPSBleHBDOworICBoRENGaWx0ZXItPnN0YXRlX19GREsgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZXN0cm95RENGaWx0ZXIoSEFORExFX0RDX0ZJTFRFUiAqaERDRmlsdGVyKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChoRENGaWx0ZXIgIT0gTlVMTCkgJiYgKCpoRENGaWx0ZXIgIT0gTlVMTCkpIHsKKyAgICBGREtmcmVlKCpoRENGaWx0ZXIpOworCisgICAgKmhEQ0ZpbHRlciA9IE5VTEw7CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19hcHBseURDRmlsdGVyKEhBTkRMRV9EQ19GSUxURVIgaERDRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSAqY29uc3Qgc2lnbmFsSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICpjb25zdCBzaWduYWxPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2lnbmFsTGVuZ3RoKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChoRENGaWx0ZXIgPT0gTlVMTCkgfHwgKHNpZ25hbEluID09IE5VTEwpIHx8IChzaWduYWxPdXQgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBJTlRfUENNICpjb25zdCB4ID0gc2lnbmFsSW47CisgICAgSU5UX1BDTSAqY29uc3QgeSA9IHNpZ25hbE91dDsKKyAgICBjb25zdCBGSVhQX0RCTCBjID0gaERDRmlsdGVyLT5jX19GREs7CisgICAgRklYUF9EQkwgKmNvbnN0IHN0YXRlID0gJmhEQ0ZpbHRlci0+c3RhdGVfX0ZESzsKKyAgICBpbnQgaTsKKyAgICBGSVhQX0RCTCB4MCwgeDEsIHkxOworCisgICAgeDEgPSB4MCA9IEZYX1BDTTJGWF9EQkwoeFswXSkgPj4gRENfRklMVEVSX1NGOworICAgIHkxID0geDAgKyAoKnN0YXRlKTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBzaWduYWxMZW5ndGg7IGkrKykgeworICAgICAgeDAgPSBGWF9QQ00yRlhfREJMKHhbaV0pID4+IERDX0ZJTFRFUl9TRjsKKyAgICAgIHlbaSAtIDFdID0gRlhfREJMMkZYX1BDTSh5MSk7CisgICAgICB5MSA9IHgwIC0geDEgKyBmTXVsdChjLCB5MSk7CisgICAgICB4MSA9IHgwOworICAgIH0KKworICAgICpzdGF0ZSA9IGZNdWx0KGMsIHkxKSAtIHgxOworICAgIHlbaSAtIDFdID0gRlhfREJMMkZYX1BDTSh5MSk7CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19maWx0ZXIuaCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTNhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19maWx0ZXIuaApAQCAtMCwwICsxLDEzMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTS4gTXVsdHJ1cworCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIEZpbHRlciBmdW5jdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNFTkNfRklMVEVSX0gKKyNkZWZpbmUgU0FDRU5DX0ZJTFRFUl9ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAic2FjZW5jX2xpYi5oIgorI2luY2x1ZGUgIkZES19tYXRyaXhDYWxsb2MuaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBEQ19GSUxURVJfU0YgMQorCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBUX0RDX0ZJTFRFUiAqSEFORExFX0RDX0ZJTFRFUjsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfY3JlYXRlRENGaWx0ZXIoSEFORExFX0RDX0ZJTFRFUiAqaERDRmlsdGVyKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2luaXREQ0ZpbHRlcihIQU5ETEVfRENfRklMVEVSIGhEQ0ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBzYW1wbGVSYXRlKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2Rlc3Ryb3lEQ0ZpbHRlcihIQU5ETEVfRENfRklMVEVSICpoRENGaWx0ZXIpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfYXBwbHlEQ0ZpbHRlcihIQU5ETEVfRENfRklMVEVSIGhEQ0ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00gKmNvbnN0IHNpZ25hbEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqY29uc3Qgc2lnbmFsT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNpZ25hbExlbmd0aCk7CisKKyNlbmRpZiAvKiBTQUNFTkNfRklMVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2ZyYW1ld2luZG93aW5nLmNwcCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2ZyYW1ld2luZG93aW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYwZjBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZnJhbWV3aW5kb3dpbmcuY3BwCkBAIC0wLDAgKzEsNTY4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXggTmV1ZW5kb3JmCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgR2V0IHdpbmRvd3MgZm9yIGZyYW1pbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioKKyAgIFxmaWxlCisgICBEZXNjcmlwdGlvbiBvZiBmaWxlIGNvbnRlbnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX2ZyYW1ld2luZG93aW5nLmgiCisjaW5jbHVkZSAic2FjZW5jX3ZlY3RvcmZ1bmN0aW9ucy5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IFRfRlJBTUVXSU5ET1cgeworICBJTlQgblRpbWVTbG90c01heDsKKyAgSU5UIGJGcmFtZUtlZXA7CisgIElOVCBzdGFydFNsb3BlOworICBJTlQgc3RvcFNsb3BlOworICBJTlQgc3RhcnRSZWN0OworICBJTlQgc3RvcFJlY3Q7CisKKyAgSU5UIHRhcGVyQW5hTGVuOworICBJTlQgdGFwZXJTeW5MZW47CisgIEZJWFBfV0lOIHBUYXBlckFuYV9fRkRLW01BWF9USU1FX1NMT1RTXTsKKyAgRklYUF9XSU4gcFRhcGVyU3luX19GREtbTUFYX1RJTUVfU0xPVFNdOworCit9IEZSQU1FV0lORE9XOworCit0eXBlZGVmIGVudW0geworICBGSVhfSU5WQUxJRCA9IC0xLAorICBGSVhfUkVDVF9TTU9PVEggPSAwLAorICBGSVhfU01PT1RIX1JFQ1QgPSAxLAorICBGSVhfTEFSR0VfU01PT1RIID0gMiwKKyAgRklYX1JFQ1RfVFJJQU5HID0gMworCit9IEZJWF9UWVBFOworCit0eXBlZGVmIGVudW0geworICBWQVJfSU5WQUxJRCA9IC0xLAorICBWQVJfSE9MRCA9IDAsCisgIFZBUl9JU09MQVRFID0gMQorCit9IFZBUl9UWVBFOworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY2FsY1RhcGVyV2luKEZJWFBfV0lOICpwVGFwZXJXaW4sIElOVCB0aW1lU2xvdHMpIHsKKyAgRklYUF9EQkwgeDsKKyAgaW50IGksIHNjYWxlOworCisgIGZvciAoaSA9IDA7IGkgPCB0aW1lU2xvdHM7IGkrKykgeworICAgIHggPSBmRGl2Tm9ybUhpZ2hQcmVjKChGSVhQX0RCTClpLCAoRklYUF9EQkwpdGltZVNsb3RzLCAmc2NhbGUpOworCisgICAgaWYgKHNjYWxlIDwgMCkgeworICAgICAgcFRhcGVyV2luW2ldID0gRlhfREJMMkZYX1dJTih4ID4+ICgtc2NhbGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgcFRhcGVyV2luW2ldID0gRlhfREJMMkZYX1dJTih4IDw8IChzY2FsZSkpOworICAgIH0KKyAgfQorICBwVGFwZXJXaW5bdGltZVNsb3RzXSA9IEZYX0RCTDJGWF9XSU4oKEZJWFBfREJMKU1BWFZBTF9EQkwpOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZnJhbWVXaW5kb3dfQ3JlYXRlKAorICAgIEhBTkRMRV9GUkFNRVdJTkRPVyAqcGhGcmFtZVdpbmRvdykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IHBoRnJhbWVXaW5kb3cpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICAvKiBNZW1vcnkgQWxsb2NhdGlvbiAqLworICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoKnBoRnJhbWVXaW5kb3csIDEsIEZSQU1FV0lORE9XKTsKKyAgfQorICByZXR1cm4gZXJyb3I7CisKK2JhaWw6CisgIGZka19zYWNlbmNfZnJhbWVXaW5kb3dfRGVzdHJveShwaEZyYW1lV2luZG93KTsKKyAgcmV0dXJuICgoU0FDRU5DX09LID09IGVycm9yKSA/IFNBQ0VOQ19NRU1PUllfRVJST1IgOiBlcnJvcik7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19mcmFtZVdpbmRvd19Jbml0KAorICAgIEhBTkRMRV9GUkFNRVdJTkRPVyBoRnJhbWVXaW5kb3csCisgICAgY29uc3QgRlJBTUVXSU5ET1dfQ09ORklHICpjb25zdCBwRnJhbWVXaW5kb3dDb25maWcpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKGhGcmFtZVdpbmRvdyA9PSBOVUxMKSB8fCAocEZyYW1lV2luZG93Q29uZmlnID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSBpZiAocEZyYW1lV2luZG93Q29uZmlnLT5uVGltZVNsb3RzTWF4IDwgMCkgeworICAgIGVycm9yID0gU0FDRU5DX0lOSVRfRVJST1I7CisgIH0gZWxzZSB7CisgICAgaW50IHRzOworICAgIGhGcmFtZVdpbmRvdy0+YkZyYW1lS2VlcCA9IHBGcmFtZVdpbmRvd0NvbmZpZy0+YkZyYW1lS2VlcDsKKyAgICBoRnJhbWVXaW5kb3ctPm5UaW1lU2xvdHNNYXggPSBwRnJhbWVXaW5kb3dDb25maWctPm5UaW1lU2xvdHNNYXg7CisKKyAgICBGSVhQX1dJTiB3aW5NYXhWYWwgPSBGWF9EQkwyRlhfV0lOKChGSVhQX0RCTClNQVhWQUxfREJMKTsKKyAgICBpbnQgdGltZVNsb3RzID0gcEZyYW1lV2luZG93Q29uZmlnLT5uVGltZVNsb3RzTWF4OworICAgIHsKKyAgICAgIGhGcmFtZVdpbmRvdy0+c3RhcnRTbG9wZSA9IDA7CisgICAgICBoRnJhbWVXaW5kb3ctPnN0b3BTbG9wZSA9ICgoMyAqIHRpbWVTbG90cykgPj4gMSkgLSAxOworICAgICAgaEZyYW1lV2luZG93LT5zdGFydFJlY3QgPSB0aW1lU2xvdHMgPj4gMTsKKyAgICAgIGhGcmFtZVdpbmRvdy0+c3RvcFJlY3QgPSB0aW1lU2xvdHM7CisgICAgICBjYWxjVGFwZXJXaW4oaEZyYW1lV2luZG93LT5wVGFwZXJTeW5fX0ZESywgdGltZVNsb3RzID4+IDEpOworICAgICAgaEZyYW1lV2luZG93LT50YXBlclN5bkxlbiA9IHRpbWVTbG90cyA+PiAxOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBUYXBlciBmb3Igbm9uLXJlY3QuIGFuYS4gd2luZG93cyAqLworICAgIGhGcmFtZVdpbmRvdy0+dGFwZXJBbmFMZW4gPQorICAgICAgICBoRnJhbWVXaW5kb3ctPnN0YXJ0UmVjdCAtIGhGcmFtZVdpbmRvdy0+c3RhcnRTbG9wZTsKKyAgICBmb3IgKHRzID0gMDsgdHMgPCBoRnJhbWVXaW5kb3ctPnRhcGVyQW5hTGVuOyB0cysrKSB7CisgICAgICB7IGhGcmFtZVdpbmRvdy0+cFRhcGVyQW5hX19GREtbdHNdID0gd2luTWF4VmFsOyB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZnJhbWVXaW5kb3dfRGVzdHJveSgKKyAgICBIQU5ETEVfRlJBTUVXSU5ET1cgKnBoRnJhbWVXaW5kb3cpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKE5VTEwgIT0gcGhGcmFtZVdpbmRvdykgJiYgKE5VTEwgIT0gKnBoRnJhbWVXaW5kb3cpKSB7CisgICAgRkRLZnJlZSgqcGhGcmFtZVdpbmRvdyk7CisgICAgKnBoRnJhbWVXaW5kb3cgPSBOVUxMOworICB9CisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgRnJhbWVXaW5MaXN0X1Jlc2V0KEZSQU1FV0lOX0xJU1QgKmNvbnN0IHBGcmFtZVdpbkxpc3QpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBwRnJhbWVXaW5MaXN0KSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IGsgPSAwOworICAgIGZvciAoayA9IDA7IGsgPCBNQVhfTlVNX1BBUkFNUzsgaysrKSB7CisgICAgICBwRnJhbWVXaW5MaXN0LT5kYXRba10uc2xvdCA9IC0xOworICAgICAgcEZyYW1lV2luTGlzdC0+ZGF0W2tdLmhvbGQgPSBGV19JTlRQOworICAgIH0KKyAgICBwRnJhbWVXaW5MaXN0LT5uID0gMDsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIEZyYW1lV2luZG93TGlzdF9BZGQoRlJBTUVXSU5fTElTVCAqY29uc3QgcEZyYW1lV2luTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZXX1NMT1RUWVBFIGhvbGQpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBwRnJhbWVXaW5MaXN0KSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaWYgKHBGcmFtZVdpbkxpc3QtPm4gPj0gTUFYX05VTV9QQVJBTVMpIHsgLyogUGxhY2UgbGVmdCBpbiBMaXN0ID8qLworICAgICAgZXJyb3IgPSBTQUNFTkNfUEFSQU1fRVJST1I7CisgICAgfSBlbHNlIGlmIChwRnJhbWVXaW5MaXN0LT5uID4gMCAmJgorICAgICAgICAgICAgICAgcEZyYW1lV2luTGlzdC0+ZGF0W3BGcmFtZVdpbkxpc3QtPm4gLSAxXS5zbG90IC0gc2xvdCA+IDApIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX1BBUkFNX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICBwRnJhbWVXaW5MaXN0LT5kYXRbcEZyYW1lV2luTGlzdC0+bl0uc2xvdCA9IHNsb3Q7CisgICAgICBwRnJhbWVXaW5MaXN0LT5kYXRbcEZyYW1lV2luTGlzdC0+bl0uaG9sZCA9IGhvbGQ7CisgICAgICBwRnJhbWVXaW5MaXN0LT5uKys7CisgICAgfQorICB9CisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgRnJhbWVXaW5kb3dMaXN0X1JlbW92ZSgKKyAgICBGUkFNRVdJTl9MSVNUICpjb25zdCBwRnJhbWVXaW5MaXN0LCBjb25zdCBJTlQgaWR4KSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKE5VTEwgPT0gcEZyYW1lV2luTGlzdCkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBrID0gMDsKKyAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gTUFYX05VTV9QQVJBTVMpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX1BBUkFNX0VSUk9SOworICAgIH0gZWxzZSBpZiAocEZyYW1lV2luTGlzdC0+biA+IDApIHsKKyAgICAgIGlmIChpZHggPT0gTUFYX05VTV9QQVJBTVMgLSAxKSB7CisgICAgICAgIHBGcmFtZVdpbkxpc3QtPmRhdFtpZHhdLnNsb3QgPSAtMTsKKyAgICAgICAgcEZyYW1lV2luTGlzdC0+ZGF0W2lkeF0uaG9sZCA9IEZXX0lOVFA7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGsgPSBpZHg7IGsgPCBNQVhfTlVNX1BBUkFNUyAtIDE7IGsrKykgeworICAgICAgICAgIHBGcmFtZVdpbkxpc3QtPmRhdFtrXSA9IHBGcmFtZVdpbkxpc3QtPmRhdFtrICsgMV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBGcmFtZVdpbkxpc3QtPm4tLTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBGcmFtZVdpbmRvd0xpc3RfTGltaXQoCisgICAgRlJBTUVXSU5fTElTVCAqY29uc3QgcEZyYW1lV2luTGlzdCwgY29uc3QgSU5UIGxsIC8qbG93ZXIgbGltaXQqLywKKyAgICBjb25zdCBJTlQgdWwgLyp1cHBlciBsaW1pdCovCispIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBwRnJhbWVXaW5MaXN0KSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IGsgPSAwOworICAgIGZvciAoayA9IDA7IGsgPCBwRnJhbWVXaW5MaXN0LT5uOyBrKyspIHsKKyAgICAgIGlmIChwRnJhbWVXaW5MaXN0LT5kYXRba10uc2xvdCA8IGxsIHx8IHBGcmFtZVdpbkxpc3QtPmRhdFtrXS5zbG90ID4gdWwpIHsKKyAgICAgICAgRnJhbWVXaW5kb3dMaXN0X1JlbW92ZShwRnJhbWVXaW5MaXN0LCBrKTsKKyAgICAgICAgLS1rOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19mcmFtZVdpbmRvd19HZXRXaW5kb3coCisgICAgSEFORExFX0ZSQU1FV0lORE9XIGhGcmFtZVdpbmRvdywgSU5UIHRyX3Bvc1tNQVhfTlVNX1BBUkFNU10sCisgICAgY29uc3QgSU5UIHRpbWVTbG90cywgRlJBTUlOR0lORk8gKmNvbnN0IHBGcmFtaW5nSW5mbywKKyAgICBGSVhQX1dJTiAqcFdpbmRvd0FuYV9fRkRLW01BWF9OVU1fUEFSQU1TXSwKKyAgICBGUkFNRVdJTl9MSVNUICpjb25zdCBwRnJhbWVXaW5MaXN0LCBjb25zdCBJTlQgYXZvaWRfa2VlcCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoaEZyYW1lV2luZG93ID09IE5VTEwpIHx8ICh0cl9wb3MgPT0gTlVMTCkgfHwgKHBGcmFtaW5nSW5mbyA9PSBOVUxMKSB8fAorICAgICAgKHBGcmFtZVdpbkxpc3QgPT0gTlVMTCkgfHwgKHBXaW5kb3dBbmFfX0ZESyA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGNvbnN0IFZBUl9UWVBFIHZhclR5cGUgPSBWQVJfSE9MRDsKKyAgICBjb25zdCBpbnQgdHJhbkwgPSA0OworICAgIGludCB3aW5DbnQgPSAwOworICAgIGludCB3LCBwczsKKworICAgIGludCBzdGFydFNsb3BlID0gaEZyYW1lV2luZG93LT5zdGFydFNsb3BlOworICAgIGludCBzdG9wU2xvcGUgPSBoRnJhbWVXaW5kb3ctPnN0b3BTbG9wZTsKKyAgICBpbnQgc3RhcnRSZWN0ID0gaEZyYW1lV2luZG93LT5zdGFydFJlY3Q7CisgICAgaW50IHN0b3BSZWN0ID0gaEZyYW1lV2luZG93LT5zdG9wUmVjdDsKKyAgICBpbnQgdGFwZXJBbmFMZW4gPSBoRnJhbWVXaW5kb3ctPnRhcGVyQW5hTGVuOworCisgICAgRklYUF9XSU4gd2luTWF4VmFsID0gRlhfREJMMkZYX1dJTigoRklYUF9EQkwpTUFYVkFMX0RCTCk7CisgICAgRklYUF9XSU4gYXBwbHlSaWdodFdpbmRvd0dhaW5fX0ZES1tNQVhfTlVNX1BBUkFNU107CisgICAgRklYUF9XSU4gKnBUYXBlckFuYV9fRkRLID0gaEZyYW1lV2luZG93LT5wVGFwZXJBbmFfX0ZESzsKKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGZvciAocHMgPSAwOyBwcyA8IE1BWF9OVU1fUEFSQU1TOyBwcysrKSB7CisgICAgICBpZiAocFdpbmRvd0FuYV9fRkRLW3BzXSA9PSBOVUxMKSB7CisgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCh0aW1lU2xvdHMgPiBoRnJhbWVXaW5kb3ctPm5UaW1lU2xvdHNNYXgpIHx8ICh0aW1lU2xvdHMgPCAwKSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogUmVzZXQgKi8KKyAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IEZyYW1lV2luTGlzdF9SZXNldChwRnJhbWVXaW5MaXN0KSkpIGdvdG8gYmFpbDsKKworICAgIEZES21lbWNsZWFyKGFwcGx5UmlnaHRXaW5kb3dHYWluX19GREssIHNpemVvZihhcHBseVJpZ2h0V2luZG93R2Fpbl9fRkRLKSk7CisKKyAgICBpZiAodHJfcG9zWzBdID4gLTEpIHsgLyogVHJhbnNpZW50cyBpbiBmaXJzdCAobGVmdCkgaGFsZj8gKi8KKyAgICAgIGludCBwX2wgPSB0cl9wb3NbMF07CisgICAgICB3aW5DbnQgPSAwOworCisgICAgICAvKiBDcmVhdGUgUGFyYW1ldGVyIFBvc2l0aW9ucyAqLworICAgICAgc3dpdGNoICh2YXJUeXBlKSB7CisgICAgICAgIGNhc2UgVkFSX0hPTEQ6CisgICAgICAgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAgICAgICAoZXJyb3IgPSBGcmFtZVdpbmRvd0xpc3RfQWRkKHBGcmFtZVdpbkxpc3QsIHBfbCAtIDEsIEZXX0hPTEQpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgICAgICAgIChlcnJvciA9IEZyYW1lV2luZG93TGlzdF9BZGQocEZyYW1lV2luTGlzdCwgcF9sLCBGV19JTlRQKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVkFSX0lTT0xBVEU6CisgICAgICAgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAgICAgICAoZXJyb3IgPSBGcmFtZVdpbmRvd0xpc3RfQWRkKHBGcmFtZVdpbkxpc3QsIHBfbCAtIDEsIEZXX0hPTEQpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgICAgICAgIChlcnJvciA9IEZyYW1lV2luZG93TGlzdF9BZGQocEZyYW1lV2luTGlzdCwgcF9sLCBGV19JTlRQKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBGcmFtZVdpbmRvd0xpc3RfQWRkKHBGcmFtZVdpbkxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbCArIHRyYW5MLCBGV19IT0xEKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBGcmFtZVdpbmRvd0xpc3RfQWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWVXaW5MaXN0LCBwX2wgKyB0cmFuTCArIDEsIEZXX0lOVFApKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogT3V0c2lkZSBvZiBmcmFtZT8gPT4gS2ljayBPdXQgKi8KKyAgICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgICAoZXJyb3IgPSBGcmFtZVdpbmRvd0xpc3RfTGltaXQocEZyYW1lV2luTGlzdCwgMCwgdGltZVNsb3RzIC0gMSkpKQorICAgICAgICBnb3RvIGJhaWw7CisKKyAgICAgIC8qIEFkZCB0aW1lU2xvdHMgYXMgdGVtcG9yYXJ5IGJvcmRlciBmb3Igd2luZG93IGNyZWF0aW9uICovCisgICAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgICAgKGVycm9yID0gRnJhbWVXaW5kb3dMaXN0X0FkZChwRnJhbWVXaW5MaXN0LCB0aW1lU2xvdHMgLSAxLCBGV19IT0xEKSkpCisgICAgICAgIGdvdG8gYmFpbDsKKworICAgICAgLyogQ3JlYXRlIFdpbmRvd3MgKi8KKyAgICAgIGZvciAocHMgPSAwOyBwcyA8IHBGcmFtZVdpbkxpc3QtPm4gLSAxOyBwcysrKSB7CisgICAgICAgIGlmIChGV19IT0xEICE9IHBGcmFtZVdpbkxpc3QtPmRhdFtwc10uaG9sZCkgeworICAgICAgICAgIGludCBjb25zdCBzdGFydCA9IHBGcmFtZVdpbkxpc3QtPmRhdFtwc10uc2xvdDsKKyAgICAgICAgICBpbnQgY29uc3Qgc3RvcCA9IHBGcmFtZVdpbkxpc3QtPmRhdFtwcyArIDFdLnNsb3Q7CisKKyAgICAgICAgICAvKiBBbmFseXNpcyBXaW5kb3cgKi8KKyAgICAgICAgICBGREttZW1zZXRfZmxleChwV2luZG93QW5hX19GREtbd2luQ250XSwgRlhfREJMMkZYX1dJTigoRklYUF9EQkwpMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQpOworICAgICAgICAgIEZES21lbXNldF9mbGV4KCZwV2luZG93QW5hX19GREtbd2luQ250XVtzdGFydF0sIHdpbk1heFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wIC0gc3RhcnQgKyAxKTsKKyAgICAgICAgICBGREttZW1zZXRfZmxleCgmcFdpbmRvd0FuYV9fRkRLW3dpbkNudF1bc3RvcCArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RCTDJGWF9XSU4oKEZJWFBfREJMKTApLCB0aW1lU2xvdHMgLSBzdG9wIC0gMSk7CisKKyAgICAgICAgICBhcHBseVJpZ2h0V2luZG93R2Fpbl9fRkRLW3dpbkNudF0gPQorICAgICAgICAgICAgICBwV2luZG93QW5hX19GREtbd2luQ250XVt0aW1lU2xvdHMgLSAxXTsKKyAgICAgICAgICB3aW5DbnQrKzsKKyAgICAgICAgfQorICAgICAgfSAvKiBwcyAqLworCisgICAgICAvKiBQb3AgdGVtcG9yYXJ5IGZyYW1lIGJvcmRlciAqLworICAgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAgIChlcnJvciA9IEZyYW1lV2luZG93TGlzdF9SZW1vdmUocEZyYW1lV2luTGlzdCwgcEZyYW1lV2luTGlzdC0+biAtIDEpKSkKKyAgICAgICAgZ290byBiYWlsOworICAgIH0gZWxzZSB7IC8qIE5vIHRyYW5zaWVudCBpbiBsZWZ0IGhhbGYgb2YgYW5hLiB3aW5kb3cgKi8KKyAgICAgIHdpbkNudCA9IDA7CisKKyAgICAgIC8qIEFkZCBwYXJhbXRlciBzZXQgYXQgZW5kIG9mIGZyYW1lICovCisgICAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgICAgKGVycm9yID0gRnJhbWVXaW5kb3dMaXN0X0FkZChwRnJhbWVXaW5MaXN0LCB0aW1lU2xvdHMgLSAxLCBGV19JTlRQKSkpCisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIC8qIEFuYWx5c2lzIFdpbmRvdyAqLworICAgICAgRkRLbWVtc2V0X2ZsZXgocFdpbmRvd0FuYV9fRkRLW3dpbkNudF0sIEZYX0RCTDJGWF9XSU4oKEZJWFBfREJMKTApLAorICAgICAgICAgICAgICAgICAgICAgc3RhcnRTbG9wZSk7CisgICAgICBGREttZW1jcHlfZmxleCgmcFdpbmRvd0FuYV9fRkRLW3dpbkNudF1bc3RhcnRTbG9wZV0sIDEsIHBUYXBlckFuYV9fRkRLLCAxLAorICAgICAgICAgICAgICAgICAgICAgdGFwZXJBbmFMZW4pOworICAgICAgRkRLbWVtc2V0X2ZsZXgoJnBXaW5kb3dBbmFfX0ZES1t3aW5DbnRdW3N0YXJ0UmVjdF0sIHdpbk1heFZhbCwKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVTbG90cyAtIHN0YXJ0UmVjdCk7CisKKyAgICAgIGFwcGx5UmlnaHRXaW5kb3dHYWluX19GREtbd2luQ250XSA9IHdpbk1heFZhbDsKKyAgICAgIHdpbkNudCsrOworICAgIH0gLyogaWYgKHRyX3Bvc1swXSA+IC0xKSAqLworCisgICAgZm9yICh3ID0gMDsgdyA8IHdpbkNudDsgdysrKSB7CisgICAgICBpZiAoYXBwbHlSaWdodFdpbmRvd0dhaW5fX0ZES1t3XSA+IChGSVhQX1dJTikwKSB7CisgICAgICAgIGlmICh0cl9wb3NbMV0gPiAtMSkgeyAvKiBUcmFuc2llbnRzIGluIHNlY29uZCAocmlnaHQpIGhhbGY/ICovCisgICAgICAgICAgaW50IHBfciA9IHRyX3Bvc1sxXTsKKworICAgICAgICAgIC8qIEFuYWx5c2lzIFdpbmRvdyAqLworICAgICAgICAgIEZES21lbXNldF9mbGV4KCZwV2luZG93QW5hX19GREtbd11bdGltZVNsb3RzXSwgd2luTWF4VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBfciAtIHRpbWVTbG90cyk7CisgICAgICAgICAgRkRLbWVtc2V0X2ZsZXgoJnBXaW5kb3dBbmFfX0ZES1t3XVtwX3JdLCBGWF9EQkwyRlhfV0lOKChGSVhQX0RCTCkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAyICogdGltZVNsb3RzIC0gcF9yKTsKKworICAgICAgICB9IGVsc2UgeyAvKiBObyB0cmFuc2llbnQgaW4gcmlnaHQgaGFsZiBvZiBhbmEuIHdpbmRvdyAqLworICAgICAgICAgIC8qIEFuYWx5c2lzIFdpbmRvdyAqLworICAgICAgICAgIEZES21lbXNldF9mbGV4KCZwV2luZG93QW5hX19GREtbd11bdGltZVNsb3RzXSwgd2luTWF4VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BSZWN0IC0gdGltZVNsb3RzICsgMSk7CisgICAgICAgICAgRkRLbWVtY3B5X2ZsZXgoJnBXaW5kb3dBbmFfX0ZES1t3XVtzdG9wUmVjdF0sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBUYXBlckFuYV9fRkRLW3RhcGVyQW5hTGVuIC0gMV0sIC0xLCB0YXBlckFuYUxlbik7CisgICAgICAgICAgRkRLbWVtc2V0X2ZsZXgoJnBXaW5kb3dBbmFfX0ZES1t3XVtzdG9wU2xvcGUgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQkwyRlhfV0lOKChGSVhQX0RCTCkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAyICogdGltZVNsb3RzIC0gc3RvcFNsb3BlIC0gMSk7CisKKyAgICAgICAgfSAvKiBpZiAodHJfcG9zWzFdID4gLTEpICovCisKKyAgICAgICAgLyogV2VpZ2h0ICovCisgICAgICAgIGlmIChhcHBseVJpZ2h0V2luZG93R2Fpbl9fRkRLW3ddIDwgd2luTWF4VmFsKSB7CisgICAgICAgICAgaW50IHRzOworICAgICAgICAgIGZvciAodHMgPSAwOyB0cyA8IHRpbWVTbG90czsgdHMrKykgeworICAgICAgICAgICAgcFdpbmRvd0FuYV9fRkRLW3ddW3RpbWVTbG90cyArIHRzXSA9CisgICAgICAgICAgICAgICAgRlhfREJMMkZYX1dJTihmTXVsdChwV2luZG93QW5hX19GREtbd11bdGltZVNsb3RzICsgdHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlSaWdodFdpbmRvd0dhaW5fX0ZES1t3XSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSAvKiBpZiAoYXBwbHlSaWdodFdpbmRvd0dhaW5bd10gPiAwLjBmKSAqLworICAgICAgZWxzZSB7CisgICAgICAgIC8qIEFsbCBaZXJvICovCisgICAgICAgIEZES21lbXNldF9mbGV4KCZwV2luZG93QW5hX19GREtbd11bdGltZVNsb3RzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfREJMMkZYX1dJTigoRklYUF9EQkwpMCksIHRpbWVTbG90cyk7CisgICAgICB9CisgICAgfSAvKiBsb29wIG92ZXIgd2luZG93cyAqLworCisgICAgaWYgKGhGcmFtZVdpbmRvdy0+YkZyYW1lS2VlcCA9PSAxKSB7CisgICAgICBGREttZW1jcHlfZmxleCgmcFdpbmRvd0FuYV9fRkRLWzBdWzIgKiB0aW1lU2xvdHNdLCAxLAorICAgICAgICAgICAgICAgICAgICAgJnBXaW5kb3dBbmFfX0ZES1swXVt0aW1lU2xvdHNdLCAxLCB0aW1lU2xvdHMpOworICAgICAgRkRLbWVtY3B5X2ZsZXgoJnBXaW5kb3dBbmFfX0ZES1swXVt0aW1lU2xvdHNdLCAxLCBwV2luZG93QW5hX19GREtbMF0sIDEsCisgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMpOworCisgICAgICBpZiAoYXZvaWRfa2VlcCAhPSAwKSB7CisgICAgICAgIEZES21lbXNldF9mbGV4KHBXaW5kb3dBbmFfX0ZES1swXSwgRlhfREJMMkZYX1dJTigoRklYUF9EQkwpMCksCisgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTbG90cyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBGREttZW1zZXRfZmxleChwV2luZG93QW5hX19GREtbMF0sIHdpbk1heFZhbCwgdGltZVNsb3RzKTsKKyAgICAgIH0KKyAgICB9IC8qIGlmIChoRnJhbWVXaW5kb3ctPmJGcmFtZUtlZXA9PTEpICovCisKKyAgICAvKiBGZWVkIEluZm8gdG8gQml0c3RyZWFtIEZvcm1hdHRlciAqLworICAgIHBGcmFtaW5nSW5mby0+bnVtUGFyYW1TZXRzID0gcEZyYW1lV2luTGlzdC0+bjsKKyAgICBwRnJhbWluZ0luZm8tPmJzRnJhbWluZ1R5cGUgPSAxOyAvKiB2YXJpYWJsZSBmcmFtaW5nICovCisgICAgZm9yIChwcyA9IDA7IHBzIDwgcEZyYW1pbmdJbmZvLT5udW1QYXJhbVNldHM7IHBzKyspIHsKKyAgICAgIHBGcmFtaW5nSW5mby0+YnNQYXJhbVNsb3RzW3BzXSA9IHBGcmFtZVdpbkxpc3QtPmRhdFtwc10uc2xvdDsKKyAgICB9CisKKyAgICAvKiBpZiB0aGVyZSBpcyBqdXN0IG9uZSBwYXJhbSBzZXQgYXQgbGFzdCBzbG90LAorICAgICAgIHVzZSBmaXhlZCBmcmFtaW5nIHRvIHNhdmUgc29tZSBiaXRzICovCisgICAgaWYgKChwRnJhbWluZ0luZm8tPm51bVBhcmFtU2V0cyA9PSAxKSAmJgorICAgICAgICAocEZyYW1pbmdJbmZvLT5ic1BhcmFtU2xvdHNbMF0gPT0gdGltZVNsb3RzIC0gMSkpIHsKKyAgICAgIHBGcmFtaW5nSW5mby0+YnNGcmFtaW5nVHlwZSA9IDA7CisgICAgfQorCisgIH0gLyogdmFsaWQgaGFuZGxlICovCisKK2JhaWw6CisKKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfYW5hbHlzaXNXaW5kb3dpbmcoCisgICAgY29uc3QgSU5UIG5UaW1lU2xvdHMsIGNvbnN0IElOVCBzdGFydFRpbWVTbG90LAorICAgIEZJWFBfV0lOICpwRnJhbWVXaW5kb3dBbmFfX0ZESywgY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBwcERhdGFJbl9fRkRLLAorICAgIEZJWFBfRFBLICpjb25zdCAqY29uc3QgcHBEYXRhT3V0X19GREssIGNvbnN0IElOVCBuSHlicmlkQmFuZHMsCisgICAgY29uc3QgSU5UIGRpbSkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgocEZyYW1lV2luZG93QW5hX19GREsgPT0gTlVMTCkgfHwgKHBwRGF0YUluX19GREsgPT0gTlVMTCkgfHwKKyAgICAgIChwcERhdGFPdXRfX0ZESyA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBpLCB0czsKKyAgICBGSVhQX1dJTiBtYXhWYWwgPSBGWF9EQkwyRlhfV0lOKChGSVhQX0RCTClNQVhWQUxfREJMKTsKKworICAgIGlmIChkaW0gPT0gRldfQ0hBTkdFX0RJTSkgeworICAgICAgZm9yICh0cyA9IHN0YXJ0VGltZVNsb3Q7IHRzIDwgblRpbWVTbG90czsgdHMrKykgeworICAgICAgICBGSVhQX1dJTiB3aW4gPSBwRnJhbWVXaW5kb3dBbmFfX0ZES1t0c107CisgICAgICAgIGlmICh3aW4gPT0gbWF4VmFsKSB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5IeWJyaWRCYW5kczsgaSsrKSB7CisgICAgICAgICAgICBwcERhdGFPdXRfX0ZES1tpXVt0c10udi5yZSA9IHBwRGF0YUluX19GREtbdHNdW2ldLnYucmU7CisgICAgICAgICAgICBwcERhdGFPdXRfX0ZES1tpXVt0c10udi5pbSA9IHBwRGF0YUluX19GREtbdHNdW2ldLnYuaW07CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuSHlicmlkQmFuZHM7IGkrKykgeworICAgICAgICAgICAgcHBEYXRhT3V0X19GREtbaV1bdHNdLnYucmUgPSBmTXVsdCh3aW4sIHBwRGF0YUluX19GREtbdHNdW2ldLnYucmUpOworICAgICAgICAgICAgcHBEYXRhT3V0X19GREtbaV1bdHNdLnYuaW0gPSBmTXVsdCh3aW4sIHBwRGF0YUluX19GREtbdHNdW2ldLnYuaW0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSAvKiB0cyAqLworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHRzID0gc3RhcnRUaW1lU2xvdDsgdHMgPCBuVGltZVNsb3RzOyB0cysrKSB7CisgICAgICAgIEZJWFBfV0lOIHdpbiA9IHBGcmFtZVdpbmRvd0FuYV9fRkRLW3RzXTsKKyAgICAgICAgaWYgKHdpbiA9PSBtYXhWYWwpIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkh5YnJpZEJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBwRGF0YU91dF9fRkRLW3RzXVtpXS52LnJlID0gcHBEYXRhSW5fX0ZES1t0c11baV0udi5yZTsKKyAgICAgICAgICAgIHBwRGF0YU91dF9fRkRLW3RzXVtpXS52LmltID0gcHBEYXRhSW5fX0ZES1t0c11baV0udi5pbTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5IeWJyaWRCYW5kczsgaSsrKSB7CisgICAgICAgICAgICBwcERhdGFPdXRfX0ZES1t0c11baV0udi5yZSA9IGZNdWx0KHdpbiwgcHBEYXRhSW5fX0ZES1t0c11baV0udi5yZSk7CisgICAgICAgICAgICBwcERhdGFPdXRfX0ZES1t0c11baV0udi5pbSA9IGZNdWx0KHdpbiwgcHBEYXRhSW5fX0ZES1t0c11baV0udi5pbSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IC8qIHRzICovCisgICAgfQorICB9CisKKyAgcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL3NyYy9zYWNlbmNfZnJhbWV3aW5kb3dpbmcuaCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2ZyYW1ld2luZG93aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyMmRjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2ZyYW1ld2luZG93aW5nLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1heCBOZXVlbmRvcmYKKworICAgRGVzY3JpcHRpb246IEVuY29kZXIgTGlicmFyeSBJbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBHZXQgd2luZG93cyBmb3IgZnJhbWluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ0VOQ19GUkFNRVdJTkRPV0lOR19ICisjZGVmaW5lIFNBQ0VOQ19GUkFNRVdJTkRPV0lOR19ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqCisgICBcZmlsZQorICAgRGVzY3JpcHRpb24gb2YgZmlsZSBjb250ZW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgInNhY2VuY19saWIuaCIKKyNpbmNsdWRlICJzYWNlbmNfYml0c3RyZWFtLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRklYUF9XSU4gRklYUF9EQkwKKyNkZWZpbmUgRlhfREJMMkZYX1dJTih4KSAoeCkKKyNkZWZpbmUgREFMREFUQVRZUEVfV0lOIERBTERBVEFUWVBFX0RGUkFDVAorCit0eXBlZGVmIGVudW0geworICBGV19JTlRQID0gMCwKKyAgRldfSE9MRCA9IDEKKworfSBGV19TTE9UVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgRldfTEVBVkVfRElNID0gMCwKKyAgRldfQ0hBTkdFX0RJTSA9IDEKKworfSBGV19ESU1FTlNJT047CisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IFRfRlJBTUVXSU5ET1cgKkhBTkRMRV9GUkFNRVdJTkRPVzsKKwordHlwZWRlZiBzdHJ1Y3QgVF9GUkFNRVdJTkRPV19DT05GSUcgeworICBJTlQgblRpbWVTbG90c01heDsKKyAgSU5UIGJGcmFtZUtlZXA7CisKK30gRlJBTUVXSU5ET1dfQ09ORklHOworCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBzbG90OworICBGV19TTE9UVFlQRSBob2xkOworCit9IEZSQU1FV0lOX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRlJBTUVXSU5fREFUQSBkYXRbTUFYX05VTV9QQVJBTVNdOworICBJTlQgbjsKKworfSBGUkFNRVdJTl9MSVNUOworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19mcmFtZVdpbmRvd19DcmVhdGUoCisgICAgSEFORExFX0ZSQU1FV0lORE9XICpwaEZyYW1lV2luZG93KTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2ZyYW1lV2luZG93X0luaXQoCisgICAgSEFORExFX0ZSQU1FV0lORE9XIGhGcmFtZVdpbmRvdywKKyAgICBjb25zdCBGUkFNRVdJTkRPV19DT05GSUcgKmNvbnN0IHBGcmFtZVdpbmRvd0NvbmZpZyk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19mcmFtZVdpbmRvd19EZXN0cm95KAorICAgIEhBTkRMRV9GUkFNRVdJTkRPVyAqcGhGcmFtZVdpbmRvdyk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19mcmFtZVdpbmRvd19HZXRXaW5kb3coCisgICAgSEFORExFX0ZSQU1FV0lORE9XIGhGcmFtZVdpbmRvdywgSU5UIHRyX3Bvc1tNQVhfTlVNX1BBUkFNU10sCisgICAgY29uc3QgSU5UIHRpbWVTbG90cywgRlJBTUlOR0lORk8gKmNvbnN0IHBGcmFtaW5nSW5mbywKKyAgICBGSVhQX1dJTiAqcFdpbmRvd0FuYV9fRkRLW01BWF9OVU1fUEFSQU1TXSwKKyAgICBGUkFNRVdJTl9MSVNUICpjb25zdCBwRnJhbWVXaW5MaXN0LCBjb25zdCBJTlQgYXZvaWRfa2VlcCk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19hbmFseXNpc1dpbmRvd2luZygKKyAgICBjb25zdCBJTlQgblRpbWVTbG90cywgY29uc3QgSU5UIHN0YXJ0VGltZVNsb3QsCisgICAgRklYUF9XSU4gKnBGcmFtZVdpbmRvd0FuYV9fRkRLLCBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IHBwRGF0YUluX19GREssCisgICAgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBwcERhdGFPdXRfX0ZESywgY29uc3QgSU5UIG5IeWJyaWRCYW5kcywKKyAgICBjb25zdCBJTlQgZGltKTsKKworI2VuZGlmIC8qIFNBQ0VOQ19GUkFNRVdJTkRPV0lOR19IICovCmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19odWZmX3RhYi5jcHAgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19odWZmX3RhYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyOGVjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2h1ZmZfdGFiLmNwcApAQCAtMCwwICsxLDk5NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFya3VzIExvaHdhc3NlcgorCisgICBEZXNjcmlwdGlvbjogU0FDLUVuY29kZXIgY29uc3RhbnQgaHVmZm1hbiB0YWJsZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY19odWZmX3RhYi5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgSFVGRl9DTERfVEFCTEUgZmRrX3NhY2VuY19odWZmQ0xEVGFiID0geworICAgIHsvKiBoMURbMl1bMzFdICovCisgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMSksICBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMiksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyksICBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSksICBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgNyksICBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOCksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgOSksICBIVUZGX1BBQ0soMHgwMDAwMDNmZSwgMTApLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3ZmUsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDBmZmUsIDEyKSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAxZmZlLCAxMyksIEhVRkZfUEFDSygweDAwMDA3ZmZlLCAxNSksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwN2ZmYywgMTUpLCBIVUZGX1BBQ0soMHgwMDAwZmZmZSwgMTYpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMGZmZmEsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMWZmZmUsIDE3KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDFmZmY2LCAxNyksIEhVRkZfUEFDSygweDAwMDNmZmZlLCAxOCksCisgICAgICBIVUZGX1BBQ0soMHgwMDAzZmZmZiwgMTgpLCBIVUZGX1BBQ0soMHgwMDA3ZmZkZSwgMTkpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwM2ZmZWUsIDE4KSwgSFVGRl9QQUNLKDB4MDAwZmZmYmUsIDIwKSwKKyAgICAgIEhVRkZfUEFDSygweDAwMWZmZjdlLCAyMSksIEhVRkZfUEFDSygweDAwZmZmYmZjLCAyNCksCisgICAgICBIVUZGX1BBQ0soMHgwMGZmZmJmZCwgMjQpLCBIVUZGX1BBQ0soMHgwMGZmZmJmZSwgMjQpLAorICAgICAgSFVGRl9QQUNLKDB4MDBmZmZiZmYsIDI0KSwgSFVGRl9QQUNLKDB4MDA3ZmZkZmMsIDIzKSwKKyAgICAgIEhVRkZfUEFDSygweDAwN2ZmZGZkLCAyMyl9LAorICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDEpLCAgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpLCAgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDQpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDUpLCAgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpLCAgSFVGRl9QQUNLKDB4MDAwMDAxZmUsIDkpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZmMsIDkpLCAgSFVGRl9QQUNLKDB4MDAwMDAzZmUsIDEwKSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAwM2ZhLCAxMCksIEhVRkZfUEFDSygweDAwMDAwN2ZlLCAxMSksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDdmNiwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMGZmZSwgMTIpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDBmZWUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDFmZmUsIDEzKSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAxZmRlLCAxMyksIEhVRkZfUEFDSygweDAwMDAzZmZlLCAxNCksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwM2ZiZSwgMTQpLCBIVUZGX1BBQ0soMHgwMDAwM2ZiZiwgMTQpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDdmZmUsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMGZmZmUsIDE2KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDFmZmZlLCAxNyksIEhVRkZfUEFDSygweDAwMDdmZmZlLCAxOSksCisgICAgICBIVUZGX1BBQ0soMHgwMDA3ZmZmYywgMTkpLCBIVUZGX1BBQ0soMHgwMDBmZmZmYSwgMjApLAorICAgICAgSFVGRl9QQUNLKDB4MDAxZmZmZmMsIDIxKSwgSFVGRl9QQUNLKDB4MDAxZmZmZmQsIDIxKSwKKyAgICAgIEhVRkZfUEFDSygweDAwMWZmZmZlLCAyMSksIEhVRkZfUEFDSygweDAwMWZmZmZmLCAyMSksCisgICAgICBIVUZGX1BBQ0soMHgwMDBmZmZmYiwgMjApfX0sCisgICAgeyAgLyogSFVGRl9DTERfVEFCXzJEICovCisgICAgIHsgLyogSFVGRl9DTERfVEFCXzJEWzBdW10gKi8KKyAgICAgIHsvKiBIVUZGX0NMRF9UQUJfMkRbMF1bMF0gKi8KKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjNfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMiksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwNCwgNSksIEhVRkZfUEFDSygweDAwMDAwMDNlLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDYsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNywgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgMTApfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMDFlLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNiksIEhVRkZfUEFDSygweDAwMDAwMDA1LCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwZmYsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAwMGQsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCAzKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDMsIDIpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCAwKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWNV8yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAyLCAzKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDMsIDMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDEwLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2MsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGQ2LCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAzZWUsIDEwKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMGEsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAzNCwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMWY3ZSwgMTMpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDM2LCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyNiwgNiksIEhVRkZfUEFDSygweDAwMDAwMDQ2LCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDExZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMWY2LCA5KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAxMWYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDBkNywgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwOGUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDBmZiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNmEsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA0ZSwgNyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwZmJlLCAxMiksIEhVRkZfUEFDSygweDAwMDAwN2RlLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNGYsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAzNywgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTcsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAxZjdmLCAxMyksIEhVRkZfUEFDSygweDAwMDAwMGZhLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyMiwgNiksIEhVRkZfUEFDSygweDAwMDAwMDEyLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksIEhVRkZfUEFDSygweDAwMDAwMDAwLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjdfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksIEhVRkZfUEFDSygweDAwMDAwMDBhLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDdjLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBiZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMTdhLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBlZSwgOSksIEhVRkZfUEFDSygweDAwMDAwN2I2LCAxMSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGMsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDE2LCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMjYsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMmUsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWVjLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDQ3Y2UsIDE1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMTYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAzYywgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMjIsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDA0ZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2YsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA1ZSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA4ZmEsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDA4ZmIsIDEyKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwNWYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDBmYSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYmYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAzYSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZjYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDFkZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwM2RhLCAxMCksIEhVRkZfUEFDSygweDAwMDAwN2I3LCAxMSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMWRmLCAxMCksIEhVRkZfUEFDSygweDAwMDAwM2VlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxN2IsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDNlZiwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWVlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwOGUsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWVmLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAxZmUsIDkpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDhmOCwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDQ3ZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwNDdmLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMDc2LCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzYywgNyksIEhVRkZfUEFDSygweDAwMDAwMDQ2LCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3YSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDdlLCA3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDIzZTYsIDE0KSwgSFVGRl9QQUNLKDB4MDAwMDExZjIsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFmZiwgOSksIEhVRkZfUEFDSygweDAwMDAwMDNkLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA0ZiwgNyksIEhVRkZfUEFDSygweDAwMDAwMDJlLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxMiwgNSksIEhVRkZfUEFDSygweDAwMDAwMDA0LCA0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDQ3Y2YsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDAxMWUsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGJjLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFjLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTAsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBkLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDIpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCAwKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWOV8yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDA2LCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDcsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDA2LCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBhLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDhhLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwNGUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDI3NiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDJlMiwgMTEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwMCwgNCksIEhVRkZfUEFDSygweDAwMDAwMDBhLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxNiwgNSksIEhVRkZfUEFDSygweDAwMDAwMDI2LCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3NiwgNyksIEhVRkZfUEFDSygweDAwMDAwMGYyLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxMiwgOCksIEhVRkZfUEFDSygweDAwMDAwMDVlLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA4YiwgOSksIEhVRkZfUEFDSygweDAwMDAyZTc2LCAxNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDEyLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDcsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDM4LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2MsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDA4LCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwNDYsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGY2LCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAxY2EsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxNzNhLCAxNCksIEhVRkZfUEFDSygweDAwMDAxNzM4LCAxNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDllLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwNGEsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDI2LCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGMsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDRlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwZjcsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMTNhLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwOWUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDlmZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDEzZSwgMTIpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAyNiwgOSksIEhVRkZfUEFDSygweDAwMDAwMDFhLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFlNiwgOSksIEhVRkZfUEFDSygweDAwMDAwMWUyLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBlZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMWNlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDI3NywgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDNjZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMmU2LCAxMSksIEhVRkZfUEFDSygweDAwMDAwNGZjLCAxMSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMmUzLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMTcwLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxNzIsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAwYmEsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAxZTMsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFiLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2YsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDllLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwOWYsIDkpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMGI5ZSwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwMDlmZiwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwNGZkLCAxMSksIEhVRkZfUEFDSygweDAwMDAwNGZlLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxY2YsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDBlZiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNDQsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA1ZiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZTQsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDBmMCwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAyZTcyLCAxNSksIEhVRkZfUEFDSygweDAwMDAwMTNmLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBiOWYsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDAxM2UsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGZlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwNDcsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2QsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDEwLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMjQsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMmU3NywgMTUpLCBIVUZGX1BBQ0soMHgwMDAwNWNlNiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGJiLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwZTYsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDE2LCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwZmYsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdhLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2EsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDE3LCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDQpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwNWNlNywgMTYpLCBIVUZGX1BBQ0soMHgwMDAwMDNjZiwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDE3LCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAxY2IsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDljLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwNGIsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDE2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDA4LCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCAwKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9fSwKKyAgICAgIHsvKiBIVUZGX0NMRF9UQUJfMkRbMF1bMV0gKi8KKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjNfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMSksIEhVRkZfUEFDSygweDAwMDAwMDNlLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDc2ZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMGVkZSwgMTIpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDNmLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDNiNiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDAzYSwgNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDFjLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwZWUsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWRhLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDBlZiwgOCksIEhVRkZfUEFDSygweDAwMDAwZWRmLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZWMsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY1XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAxYywgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMGVmYywgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBlZmZlLCAxNiksIEhVRkZfUEFDSygweDAwMDFkZmZlLCAxNyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA0LCAzKSwgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDBlZmUsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwNzdmZSwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwMDA3NiwgNyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGJlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDBlZmQsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBlZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAyZSwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZGUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDNiZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA3ZiwgNyksIEhVRkZfUEFDSygweDAwMDAwMDVlLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwM2JmZSwgMTQpLCBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMGJmLCA4KSwgSFVGRl9QQUNLKDB4MDAwMWRmZmYsIDE3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMWRmZSwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwMDBmZiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2EsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY3XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDIsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAxYywgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYmMsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDVmYywgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA1ZmZlLCAxNSksIEhVRkZfUEFDSygweDAwMDJmZmRlLCAxOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwYmZmN2UsIDIwKSwgSFVGRl9QQUNLKDB4MDAxN2ZlZmYsIDIxKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDQsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDJmYSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWZlLCAxMyksIEhVRkZfUEFDSygweDAwMDBiZmYyLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwNWZmYmUsIDE5KSwgSFVGRl9QQUNLKDB4MDAwMDAwZWUsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwMiwgNCksIEhVRkZfUEFDSygweDAwMDAwMDE2LCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmNiwgOCksIEhVRkZfUEFDSygweDAwMDAwNWZlLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZmYsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMGJmZjYsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFkZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMDdlLCA3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAzYywgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAyZmZlLCAxNCksIEhVRkZfUEFDSygweDAwMDAwMmZiLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZjcsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAyZSwgNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2EsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBhLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDBmLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwNzYsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDE3LCA5KSwgSFVGRl9QQUNLKDB4MDAwMDVmZjgsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGJmZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2YsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMywgNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA0LCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwYmQsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBiZmYzLCAxNiksIEhVRkZfUEFDSygweDAwMDA1ZmZmLCAxNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBiZmEsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAxN2MsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNhLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDMsIDMpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDE3ZSwgOSksIEhVRkZfUEFDSygweDAwMTdmZWZlLCAyMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMTdmZWUsIDE3KSwgSFVGRl9QQUNLKDB4MDAwMDVmZmEsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGJmYiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDFkZiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyl9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAxN2ZlZmYsIDIxKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWOV8yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTQsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDhlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDA0ZmUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMjNmZSwgMTQpLCBIVUZGX1BBQ0soMHgwMDAwOGZmZSwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDVmZmJjLCAxOSksIEhVRkZfUEFDSygweDAwMTdmZWY3LCAyMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAxN2ZlZjcsIDIxKSwgSFVGRl9QQUNLKDB4MDAxN2ZlZjcsIDIxKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDIsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNDQsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDI3ZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxN2ZjLCAxMyksIEhVRkZfUEFDSygweDAwMDBiZmY2LCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwNWZmYmUsIDE5KSwgSFVGRl9QQUNLKDB4MDAwMTFmZjgsIDE3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDBiZmY3YSwgMjApLCBIVUZGX1BBQ0soMHgwMDAwMDBiYywgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFhLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMTFmNiwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwYmZmZSwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDExZmY5LCAxNyksIEhVRkZfUEFDSygweDAwMTdmZWY2LCAyMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxMWUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDA1NiwgNyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDEwLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDllLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDA3ZmUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMTFmNywgMTMpLCBIVUZGX1BBQ0soMHgwMDAwNWZmOCwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDE3ZmVlLCAxNyksIEhVRkZfUEFDSygweDAwMDAwN2ZmLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYWUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDI2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWVlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDA0N2UsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGJmYywgMTIpLCBIVUZGX1BBQ0soMHgwMDAwYmZmZiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwOGZhLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMDZlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFlZiwgOSksIEhVRkZfUEFDSygweDAwMDAwMDdlLCA3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwN2EsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA0ZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDBkZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxMWZlLCAxMyksIEhVRkZfUEFDSygweDAwMDAyZmZlLCAxNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA0ZmYsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAwZmYsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBiZCwgOCksIEhVRkZfUEFDSygweDAwMDAwMDJlLCA2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwZmUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDBhZiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZWMsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDFiZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDExZmZlLCAxNyksIEhVRkZfUEFDSygweDAwMDAyZmZhLCAxNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA4ZmUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAzZmUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA0NiwgNyksIEhVRkZfUEFDSygweDAwMDAwMDEyLCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwM2UsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA0NSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAyZmUsIDEwKSwgSFVGRl9QQUNLKDB4MDAwYmZmN2UsIDIwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwNWZmOSwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwNWZmYSwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwYmZkLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMTNlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNiksIEhVRkZfUEFDSygweDAwMDAwMDA3LCA0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwYmUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAzNiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwYmZmN2YsIDIwKSwgSFVGRl9QQUNLKDB4MDAwMjNmZmUsIDE4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAxMWZmYSwgMTcpLCBIVUZGX1BBQ0soMHgwMDAwNWZmZSwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWJmLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMWVkLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyYSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDAwLCAzKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAxN2UsIDkpLCBIVUZGX1BBQ0soMHgwMDE3ZmVmNywgMjEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDQ3ZmZlLCAxOSksIEhVRkZfUEFDSygweDAwMDQ3ZmZmLCAxOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMTFmZmIsIDE3KSwgSFVGRl9QQUNLKDB4MDAwMDJmZmIsIDE0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDQ3YywgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2MsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyl9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAxN2ZlZjcsIDIxKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9fX0sCisgICAgIHsgLyogSFVGRl9DTERfVEFCXzJEWzFdW10gKi8KKyAgICAgIHsvKiBIVUZGX0NMRF9UQUJfMkRbMV1bMF0gKi8KKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjNfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMSksIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDNiZSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMGVmZSwgMTIpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDFjLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFkZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMGVhLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwNzQsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDBlZSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZWIsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAxZiwgNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwNzdlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwZWZmLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNzYsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY1XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMjQsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDI1ZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAzY2ZlLCAxNCksIEhVRkZfUEFDSygweDAwMDA3OWZlLCAxNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCAzKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDcsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDc4LCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAzY2UsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMWU3ZSwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwMDBiZSwgOSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA4LCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDI2LCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAxMmUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBiZiwgOSksIEhVRkZfUEFDSygweDAwMDAwMDJlLCA3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMjcsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA3YSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZTQsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDA5NiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2IsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAzZiwgNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMWU2LCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAxZTUsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZjNlLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMDVlLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxNiwgNiksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDA3OWUsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDI1ZiwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDA0YSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY3XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZGUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDY5ZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAzNGZlLCAxNCksIEhVRkZfUEFDSygweDAwMDFhN2ZlLCAxNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwNjlmZjYsIDE5KSwgSFVGRl9QQUNLKDB4MDAwNjlmZjcsIDE5KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDIsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNmEsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDM0ZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxZmRlLCAxMyksIEhVRkZfUEFDSygweDAwMDA2OWZlLCAxNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMWE3ZmMsIDE3KSwgSFVGRl9QQUNLKDB4MDAwMDAzNzIsIDEwKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAzYywgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZGYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDFlZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZGRlLCAxMiksIEhVRkZfUEFDSygweDAwMDA2OWZhLCAxNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzNzMsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAwN2EsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDY4LCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiYSwgOSksIEhVRkZfUEFDSygweDAwMDAwM2Y2LCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBkM2UsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAzNGMsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFmYSwgOSksIEhVRkZfUEFDSygweDAwMDAwMGQyLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwN2UsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZjgsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDZlZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwM2RlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMWI4LCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFmYywgOSksIEhVRkZfUEFDSygweDAwMDAwMDZiLCA3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwZjYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzNGQsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDNmYmUsIDE0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDdmNiwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDNmYSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNjLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2QsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDNmNywgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDM3NiwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDFhN2ZmLCAxNyksIEhVRkZfUEFDSygweDAwMDAzZmJmLCAxNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBkZGYsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAxZjksIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDM2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDQpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDNkZiwgMTEpLCBIVUZGX1BBQ0soMHgwMDAzNGZmYSwgMTgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA2OWZiLCAxNSksIEhVRkZfUEFDSygweDAwMDAzNGZjLCAxNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBmZWUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAxZmYsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCAwKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWOV8yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDA2LCAzKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDQsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDEyLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDA3ZmUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMWY3ZSwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwZmJmZSwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDFmN2ZlLCAxNyksIEhVRkZfUEFDSygweDAwMGI3ZGZlLCAyMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwYjdkZmYsIDIxKSwgSFVGRl9QQUNLKDB4MDAwYjdkZmYsIDIxKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2MsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA0NiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3ZDAsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDFmNGUsIDE0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwYjdmZSwgMTcpLCBIVUZGX1BBQ0soMHgwMDAwNWJlZSwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDE2ZmJlLCAxOCksIEhVRkZfUEFDSygweDAwMDAwM2VlLCAxMCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDJlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAzZmUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDdkMiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMWY0ZiwgMTQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAyZGZlLCAxNSksIEhVRkZfUEFDSygweDAwMDBiN2RlLCAxNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZmUsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAwMmUsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA3YSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDdlLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3YSwgOCksIEhVRkZfUEFDSygweDAwMDAwMWZhLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3ZmUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDFmN2MsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMTZmYSwgMTQpLCBIVUZGX1BBQ0soMHgwMDAwMDA5ZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDIwLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMjEsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDE2LCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMTZlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwOWYsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDBiN2MsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDNkZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDBiNiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYmUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDA3YywgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDVhLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwNzgsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDQ3LCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwNDQsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwN2ZmLCAxMiksIEhVRkZfUEFDSygweDAwMDAwN2QxLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZjYsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAxZjcsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyZiwgOCksIEhVRkZfUEFDSygweDAwMDAwMDJjLCA3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwZmMsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDFmNiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZjYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDdmZiwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxNmZlLCAxNCksIEhVRkZfUEFDSygweDAwMDAwMmRlLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzZWEsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAwYmYsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGZhLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA0ZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMDI2LCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFlZSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwNWJmZSwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAzZWZlLCAxNCksIEhVRkZfUEFDSygweDAwMDAwYjdlLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzZWIsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAxZmUsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdiLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDcsIDUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDFmYiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDA0NSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMTZmZmUsIDE4KSwgSFVGRl9QQUNLKDB4MDAwMWY3ZmYsIDE3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMmRmNiwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwMWY3ZCwgMTMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwM2ZlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMDVlLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzYywgNiksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAzZGYsIDExKSwgSFVGRl9QQUNLKDB4MDAwNWJlZmUsIDIwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAyZGY3ZSwgMTkpLCBIVUZGX1BBQ0soMHgwMDAxNmZmZiwgMTgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3ZGZlLCAxNSksIEhVRkZfUEFDSygweDAwMDAwZmE2LCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3ZGUsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAwNzksIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMGI3ZGZmLCAyMSkgLyogZXNjYXBlICovCisgICAgICAgfX0sCisgICAgICB7LyogSFVGRl9DTERfVEFCXzJEWzFdWzFdICovCisgICAgICAgeworICAgICAgICAgICAvKiBMQVYzXzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDEpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZmEsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDdkZSwgMTEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwYywgNCksIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMWY2LCA5KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwZmYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA3YywgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAxYSwgNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwN2RmLCAxMSksIEhVRkZfUEFDSygweDAwMDAwM2VlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWIsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY1XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2MsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDNmZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZmJlLCAxMiksIEhVRkZfUEFDSygweDAwMDAzZWZlLCAxNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDAwLCAzKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDEsIDMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNjLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwNWUsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwN2RlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwN2JlLCAxMSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDFlLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFmLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwNWYsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWVlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAxZjYsIDkpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDFmZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMGZlLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmNiwgOCksIEhVRkZfUEFDSygweDAwMDAwMGZhLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDE2LCA2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDA3YmYsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAzZGUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDNlZSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDA3YSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAzZWZmLCAxNCksIEhVRkZfUEFDSygweDAwMDAxZjdlLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzZmYsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAwMmUsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDA0LCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCAwKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWN18yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAyLCAzKSwgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFhLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAxYmUsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwNmU2LCAxMSksIEhVRkZfUEFDSygweDAwMDAwNjdhLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBjZjIsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDMzZGUsIDE1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMGMsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDBkZSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzNzIsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAzZDYsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDY3OCwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMGNmNiwgMTMpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAzNiwgNiksIEhVRkZfUEFDSygweDAwMDAwMDEyLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDNjLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiOCwgOSksIEhVRkZfUEFDSygweDAwMDAwM2Q0LCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzM2UsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAzM2YsIDExKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwN2UsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA2YSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNGUsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYmEsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDBjZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZjYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDFlZSwgMTApfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDFlZiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDEzZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2YsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA2NiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZDYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZDcsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA5ZSwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwN2FlLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMWU4LCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZTksIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAyN2UsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzMiwgNyksIEhVRkZfUEFDSygweDAwMDAwMDE4LCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyNiwgNiksIEhVRkZfUEFDSygweDAwMDAwMDM0LCA2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDBjZjMsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDA3YWEsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDdhYiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDI3ZiwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWJmLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWIsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGIsIDQpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMzNkZiwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwMTllZSwgMTQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwN2FmLCAxMiksIEhVRkZfUEFDSygweDAwMDAwNmU3LCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYmIsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZiwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDgsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY5XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMGUsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwOCwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYmEsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDBkYmUsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGQ3ZSwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwMWFmNiwgMTQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3ZmVjLCAxNSksIEhVRkZfUEFDSygweDAwMDFmZmI2LCAxNyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDBhLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGMsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBjLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMzYsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGRlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDA1ZmUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDZiZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMWI3ZSwgMTMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3ZmVlLCAxNSksIEhVRkZfUEFDSygweDAwMDA2ZGZlLCAxNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDFlLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBhLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwNmEsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWFlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDA2ZmUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDM3NiwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMGRmZSwgMTMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZGZmLCAxMyksIEhVRkZfUEFDSygweDAwMDAwZDdmLCAxMyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMGI2LCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwNWUsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdjLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwNmUsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDZhLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAxNmEsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZmZlLCAxMiksIEhVRkZfUEFDSygweDAwMDAwZGZlLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBmZmMsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDFiZmUsIDEzKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAzNWUsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAxYjYsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDVlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwYjQsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDZjLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAxN2UsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMzZlLCAxMCksIEhVRkZfUEFDSygweDAwMDAwM2VlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzN2UsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAzNzcsIDExKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDBmZmYsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAxYWUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiZSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDFmNiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYmUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDBkYSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDE2YiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZDYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDM3ZSwgMTApfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMTdmZSwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwMGJmZSwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwN2RlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwNmRlLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYjgsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAwZDYsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDJlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMzQsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGRlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwYmUsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwN2ZlZiwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwMDZiYywgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxYmZmLCAxMyksIEhVRkZfUEFDSygweDAwMDAxZmZhLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYjksIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAzZmUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmYSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDJlLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzNCwgNiksIEhVRkZfUEFDSygweDAwMDAwMDFmLCA2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDZkZmYsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDFhZjcsIDE0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMzZmZSwgMTQpLCBIVUZGX1BBQ0soMHgwMDAwMDZmZSwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZmJlLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMzVmLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYjcsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAyYywgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwOSwgNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDFmZmI3LCAxNyksIEhVRkZfUEFDSygweDAwMDBmZmRhLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBkN2EsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDE3ZmYsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGZiZiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDJmZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDVmLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDA0LCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDIpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCAwKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9fX19fTsKKworY29uc3QgSFVGRl9JQ0NfVEFCTEUgZmRrX3NhY2VuY19odWZmSUNDVGFiID0geworICAgIHsvKiBoMURbMl1bOF0gKi8KKyAgICAge0hVRkZfUEFDSygweDAwMDAwMDAwLCAxKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDNlLCA2KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2YsIDcpfSwKKyAgICAge0hVRkZfUEFDSygweDAwMDAwMDAwLCAxKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDNlLCA2KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2YsIDcpfX0sCisgICAgeyAgLyogSFVGRl9JQ0NfVEFCXzJEICovCisgICAgIHsgLyogSFVGRl9JQ0NfVEFCXzJEWzBdW10gKi8KKyAgICAgIHsvKiBIVUZGX0lDQ19UQUJfMkRbMF1bMF0gKi8KKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjFfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMSksIEhVRkZfUEFDSygweDAwMDAwMDA2LCAzKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDcsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVYzXzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDBlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDQsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDE2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAzZmUsIDExKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAxZmUsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDNmZiwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNywgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMywgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY1XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGMsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDA2YSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZGMsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDZlZSwgMTEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDBjLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwZCwgNSksIEhVRkZfUEFDSygweDAwMDAwMDFlLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFhZSwgOSksIEhVRkZfUEFDSygweDAwMDBkZGZmLCAxNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMGRlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFmLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAxYmUsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA2ZWZlLCAxNSksIEhVRkZfUEFDSygweDAwMDBkZGZlLCAxNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAzNzdlLCAxNCksIEhVRkZfUEFDSygweDAwMDAxYmJlLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBkZGUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAxYmYsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGQ2LCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAzNzYsIDEwKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMGRkZmYsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMGRkZmYsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiYSwgOSksIEhVRkZfUEFDSygweDAwMDAwMDM0LCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMGRkZmYsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMDAxYWYsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdmLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMzYsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBkZGZmLCAxNikgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjdfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMiksIEhVRkZfUEFDSygweDAwMDAwMDBjLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyZSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDQ0LCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA4NiwgOCksIEhVRkZfUEFDSygweDAwMDAwNjllLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA0M2UsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDA4N2EsIDEyKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMWUsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMmEsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDA0NiwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxNWUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDA0NywgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzNGEsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwZDYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAyNiwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMmYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDBkNywgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNmEsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDM0ZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwODdiLCAxMiksIEhVRkZfUEFDSygweDAwMDAwODdiLCAxMil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMmJlLCAxMCksIEhVRkZfUEFDSygweDAwMDAwMWE2LCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMDEyLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiZiwgOSksIEhVRkZfUEFDSygweDAwMDAwODdiLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDg3YiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDg3YiwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDM2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwZDAsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwNDNjLCAxMSksIEhVRkZfUEFDSygweDAwMDAwNDNmLCAxMSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwODdiLCAxMiksIEhVRkZfUEFDSygweDAwMDAwODdiLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAzNGIsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyNywgNiksIEhVRkZfUEFDSygweDAwMDAwMDIwLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA0MiwgNyksIEhVRkZfUEFDSygweDAwMDAwMGQxLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDJiZiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDBkZSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYWUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA1NiwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNCwgNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwODdiLCAxMiksIEhVRkZfUEFDSygweDAwMDAwNjlmLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYTQsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDEwZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNDUsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA2ZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWYsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMSwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9fSwKKyAgICAgIHsvKiBIVUZGX0lDQ19UQUJfMkRbMF1bMV0gKi8KKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjFfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMSksIEhVRkZfUEFDSygweDAwMDAwMDA2LCAzKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDcsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVYzXzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNCwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxN2UsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAyZmUsIDExKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYmUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNiwgNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDBmLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTQsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDVlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDQpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAyZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMmZmLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTUsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMywgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY1XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzZmMsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMGZmZmEsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDBmZmY5ZSwgMjApLCBIVUZGX1BBQ0soMHgwMDBmZmY5ZiwgMjApfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDA0LCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBiZSwgOSksIEhVRkZfUEFDSygweDAwMDA3ZmZlLCAxNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwN2ZmY2UsIDE5KSwgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNCksIEhVRkZfUEFDSygweDAwMDAwMDFlLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDNmZCwgMTApLCBIVUZGX1BBQ0soMHgwMDAwZmZmYiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZmZlLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMDNlLCA2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMGEsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDFmZmUsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDdmZmYsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA1ZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMWYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDNmZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDFmZmYyLCAxNyksIEhVRkZfUEFDSygweDAwMDAwZmZjLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMmUsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMGJmLCA5KSwgSFVGRl9QQUNLKDB4MDAwM2ZmZTYsIDE4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwZmZmOCwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwMGZmZCwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDE2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCAwKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWN18yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAyLCAyKSwgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZmZlLCAxMiksIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMGZmZmUsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMGZmZmYsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDA4LCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDdmZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMGZmZmYsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMDAwNWEsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNCksIEhVRkZfUEFDSygweDAwMDAwMDdhLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDE2NCwgMTApLCBIVUZGX1BBQ0soMHgwMDAwN2ZmYSwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDFmZWUsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDAwM2MsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNSksIEhVRkZfUEFDSygweDAwMDAwMGZlLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDJjZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDJjZiwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3ZmZiLCAxNSksIEhVRkZfUEFDSygweDAwMDAxZmVjLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYjAsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDAyZSwgNyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDNlLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAzZmUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDE2NSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwN2ZmYywgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxZmVmLCAxMyksIEhVRkZfUEFDSygweDAwMDAwN2ZhLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3ZjgsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAwMWYsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAyZiwgNyksIEhVRkZfUEFDSygweDAwMDAwMGY2LCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMWZlZCwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3ZmZkLCAxNSksIEhVRkZfUEFDSygweDAwMDAwZmYyLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYjEsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA5LCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAxNjYsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3ZmZlLCAxNSksIEhVRkZfUEFDSygweDAwMDAzZmZjLCAxNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNWIsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDdlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMGZmZmYsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksIEhVRkZfUEFDSygweDAwMDAwZmYzLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZjcsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMGZmZmYsIDE2KSAvKiBlc2NhcGUgKi8KKyAgICAgICB9fX0sCisgICAgIHsgLyogSFVGRl9JQ0NfVEFCXzJEWzFdW10gKi8KKyAgICAgIHsvKiBIVUZGX0lDQ19UQUJfMkRbMV1bMF0gKi8KKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjFfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMSksIEhVRkZfUEFDSygweDAwMDAwMDA2LCAzKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDcsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVYzXzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzN2UsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDBkZmUsIDEyKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMGYsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYmEsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDFiYiwgOSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMGRlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwZGMsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWJlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWEsIDUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDZmZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMGRmZiwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDM2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDEpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCAwKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWNV8yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAwLCAxKSwgSFVGRl9QQUNLKDB4MDAwMDAwMGMsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWI2LCA5KSwgSFVGRl9QQUNLKDB4MDAwMDFiN2MsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwZGJmZSwgMTYpLCBIVUZGX1BBQ0soMHgwMDAzNmZmZiwgMTgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiZSwgOSksIEhVRkZfUEFDSygweDAwMDAwZGZlLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMzZmZmUsIDE4KSwgSFVGRl9QQUNLKDB4MDAwMDAzNmUsIDEwKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwNmUsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZDgsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMzZmZSwgMTQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwNmRlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMGRlLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAxZmEsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDBkYSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBkZmYsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDFiN2UsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBkOSwgOCksIEhVRkZfUEFDSygweDAwMDAwMGZmLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAzZjYsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDA2ZmUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwNmRmZSwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwMDM3ZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGZjLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWEsIDUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDdlZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAxYjdmZSwgMTcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxYjdkLCAxMyksIEhVRkZfUEFDSygweDAwMDAwN2VmLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMzZmZmYsIDE4KSAvKiBlc2NhcGUgKi8KKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWN18yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAwLCAxKSwgSFVGRl9QQUNLKDB4MDAwMDAwMGMsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwN2VlLCAxMSksIEhVRkZfUEFDSygweDAwMDAxZTdlLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDNjZmUsIDE0KSwgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksIEhVRkZfUEFDSygweDAwMDAwMDFhLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFlNiwgOSksIEhVRkZfUEFDSygweDAwMDAxZmJlLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDc5ZmUsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwMDZmYywgMTEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA2YywgNyksIEhVRkZfUEFDSygweDAwMDAwMGY2LCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiYSwgOSksIEhVRkZfUEFDSygweDAwMDAwZGZjLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBkZmQsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGYzZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDFiYiwgOSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMGRjLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAxZmUsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMzZlLCAxMCksIEhVRkZfUEFDSygweDAwMDAwM2ZlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDBmZGUsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFlZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMGYyLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAxZmEsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDNmNiwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWJlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMWZiZiwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwMDNjZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwM2ZmLCAxMCksIEhVRkZfUEFDSygweDAwMDAwMGRlLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwNzgsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDBkYSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDZmZCwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDM2YywgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWVmLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDM2ZiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMGRmZSwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3OWZmLCAxNSksIEhVRkZfUEFDSygweDAwMDA3OWZmLCAxNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDAzNmQsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmYywgOCksIEhVRkZfUEFDSygweDAwMDAwMDNlLCA2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDBkZmYsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3OWZmLCAxNSksIEhVRkZfUEFDSygweDAwMDAwNzllLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2EsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSAvKiBlc2NhcGUgKi8KKyAgICAgICB9fSwKKyAgICAgIHsvKiBIVUZGX0lDQ19UQUJfMkRbMV1bMV0gKi8KKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjFfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMSksIEhVRkZfUEFDSygweDAwMDAwMDA2LCAzKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDcsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVYzXzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZmMsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMGZkZSwgMTIpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwYywgNCksIEhVRkZfUEFDSygweDAwMDAwMDBkLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgOSksIEhVRkZfUEFDSygweDAwMDAwN2VlLCAxMSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMWZhLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAxZmYsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGZlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMGZkZiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDNmNiwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDEpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCAwKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWNV8yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAwLCAyKSwgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNhLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDA2NzYsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMTlmZSwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwY2ViZSwgMTYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwZiwgNCksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNiksIEhVRkZfUEFDSygweDAwMDAwMGZlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMTlkNiwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwNjc1ZSwgMTUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDMyLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxOCwgNSksIEhVRkZfUEFDSygweDAwMDAwMzNlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBjZmUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDA2NzcsIDExKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDA2NzQsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAxOWMsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGZmLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2IsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFjLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMzNmZSwgMTQpLCBIVUZGX1BBQ0soMHgwMDAwMzNmZiwgMTQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwY2VhLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMDY2LCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxYSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDA2LCA0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMGNlYmYsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMDMzYWUsIDE0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDY3ZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDE5ZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWIsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY3XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDdiZSwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZmZjLCAxMyksIEhVRkZfUEFDSygweDAwMDAwZmZkLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDFlZmUsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDNkZmUsIDE2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDQsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2MsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDBmNiwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWRhLCAxMSksIEhVRkZfUEFDSygweDAwMDAwM2ZlLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDNkZmUsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDNkZmYsIDE2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwM2MsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAzYSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzZGUsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDA3YmUsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGY3ZSwgMTQpLCBIVUZGX1BBQ0soMHgwMDAwMWVmZSwgMTQpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDFkZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDBlYywgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGMsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWVlLCAxMCksIEhVRkZfUEFDSygweDAwMDAwZjdlLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3ZmMsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDNkZmYsIDE1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDdmZmUsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMDAzYmUsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFhLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWMsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwN2ZkLCAxMiksIEhVRkZfUEFDSygweDAwMDAwZmZlLCAxMyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAzZGZmLCAxNiksIEhVRkZfUEFDSygweDAwMDAwM2JmLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDFmZmUsIDE0KSwgSFVGRl9QQUNLKDB4MDAwMDAzZmYsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDFiLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMGY2LCA5KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDdmZmYsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMDNkZmYsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwM2ZmZSwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwMDFkYiwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGVlLCAxMCksIEhVRkZfUEFDSygweDAwMDAwMDdhLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDBiLCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDNkZmYsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMDNkZmYsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDNkZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWVlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMDdhLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNSksIEhVRkZfUEFDSygweDAwMDAwMDAzLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwM2RmZiwgMTYpIC8qIGVzY2FwZSAqLworICAgICAgIH19fX19OworCitjb25zdCBIVUZGX1BUMF9UQUJMRSBmZGtfc2FjZW5jX2h1ZmZQYXJ0MFRhYiA9IHsKKyAgICB7LyogQ0xEICovCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDUyLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwYWUsIDkpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDBhZiwgOSksIEhVRkZfUEFDSygweDAwMDAwMDI4LCA3KSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNmUsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAzNiwgNiksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDQpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNCksIEhVRkZfUEFDSygweDAwMDAwMDBhLCA0KSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNiwgNSksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDEyLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTcsIDUpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgNCksIEhVRkZfUEFDSygweDAwMDAwMDA0LCA0KSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwOCwgNCksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDA3LCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDMsIDQpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMSwgNCksIEhVRkZfUEFDSygweDAwMDAwMDFhLCA1KSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTMsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDE2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTcsIDYpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDA2ZiwgNyksIEhVRkZfUEFDSygweDAwMDAwMDJhLCA3KSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNTYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA1MywgOCksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDNmLCA2KX0sCisgICAgey8qIElDQyAqLworICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMiksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDEsIDIpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDNmLCA2KX19OworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2h1ZmZfdGFiLmggYi9saWJTQUNlbmMvc3JjL3NhY2VuY19odWZmX3RhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNmMzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19odWZmX3RhYi5oCkBAIC0wLDAgKzEsMjIyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXJrdXMgTG9od2Fzc2VyCisKKyAgIERlc2NyaXB0aW9uOiBTQUMtRW5jb2RlciBjb25zdGFudCBodWZmbWFuIHRhYmxlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ0VOQ19IVUZGX1RBQl9ICisjZGVmaW5lIFNBQ0VOQ19IVUZGX1RBQl9ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIVUZGX1BBQ0soYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCgoVUxPTkcpYSkgJiAweDAwRkZGRkZGKSA8PCA4KSB8ICgoKFVMT05HKWIpICYgMHhGRikgXAorICB9IC8qITwgUGFjayBodWZmbWFuIHZhbHVlIGFuZCBsZW5ndGggaW5mb3JtYXRpb24uICovCisjZGVmaW5lIEhVRkZfVkFMVUUoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKGEucGFja2VkID4+IDgpICYgMHgwMEZGRkZGRikpIC8qITwgUmV0dXJuIHZhbHVlIGZyb20gcGFja2VkIHRhYmxlIGVudHJ5LiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIVUZGX0xFTkdUSChhKSBcCisgICgoYS5wYWNrZWQgJiAweEZGKSkgLyohPCBSZXR1cm4gbGVuZ3RoIGZyb20gcGFja2VkIHRhYmxlIGVudHJ5LiAqLworCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIFxicmllZiAgVGhpcyBzdHJ1Y3QgY29udGFpbnMgcGFja2VkIGh1ZmZtYW4gZW50cmllcy4KKyAqCisgKiBUaGUgcGFja2VkIGVudHJ5IGNvbnNpc3Qgb2YgaGZmbWFuIHZhbHVlIGFuZCBsZW5ndGggaW5mb3JtYXRpb24uCisgKgorICogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICB8ICAgICAgICAgdmFsdWUgICAgICAgICAgfCBsZW5ndGggfAorICogICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogICB8PC0tLS0tLS0gMzEuLi44IC0tLS0tLS0+fDwgNy4uMCA+fAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFVMT05HIHBhY2tlZDsgLyohIFBhY2tlZCBodWZmbWFuIGVudHJ5OgorICAgICAgICAgICAgICAgICAgICAtIGxvd2VyIDggYml0IGFyZSByZXNlcnZvZWQgZm9yIGxlbmd0aCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAtIHVwcGVyIDI0IGJpdCBjb250YWlucyBodWZmbWFuIHZhbHVlICovCit9IEhVRkZfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSFVGRl9FTlRSWSBlbnRyeVsyXVsyXTsKKyAgSFVGRl9FTlRSWSBlc2NhcGU7CisKK30gTEFWMV8yRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBIVUZGX0VOVFJZIGVudHJ5WzRdWzRdOworICBIVUZGX0VOVFJZIGVzY2FwZTsKKworfSBMQVYzXzJEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEhVRkZfRU5UUlkgZW50cnlbNl1bNl07CisgIEhVRkZfRU5UUlkgZXNjYXBlOworCit9IExBVjVfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSFVGRl9FTlRSWSBlbnRyeVs3XVs3XTsKKyAgSFVGRl9FTlRSWSBlc2NhcGU7CisKK30gTEFWNl8yRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBIVUZGX0VOVFJZIGVudHJ5WzhdWzhdOworICBIVUZGX0VOVFJZIGVzY2FwZTsKKworfSBMQVY3XzJEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEhVRkZfRU5UUlkgZW50cnlbMTBdWzEwXTsKKyAgSFVGRl9FTlRSWSBlc2NhcGU7CisKK30gTEFWOV8yRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBIVUZGX0VOVFJZIGVudHJ5WzEzXVsxM107CisgIEhVRkZfRU5UUlkgZXNjYXBlOworCit9IExBVjEyXzJEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIExBVjNfMkQgbGF2MzsKKyAgTEFWNV8yRCBsYXY1OworICBMQVY3XzJEIGxhdjc7CisgIExBVjlfMkQgbGF2OTsKKworfSBIVUZGX0NMRF9UQUJfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgTEFWMV8yRCBsYXYxOworICBMQVYzXzJEIGxhdjM7CisgIExBVjVfMkQgbGF2NTsKKyAgTEFWN18yRCBsYXY3OworCit9IEhVRkZfSUNDX1RBQl8yRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBIVUZGX0VOVFJZIGgxRFsyXVszMV07CisgIEhVRkZfQ0xEX1RBQl8yRCBoMkRbMl1bMl07CisKK30gSFVGRl9DTERfVEFCTEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSFVGRl9FTlRSWSBoMURbMl1bOF07CisgIEhVRkZfSUNDX1RBQl8yRCBoMkRbMl1bMl07CisKK30gSFVGRl9JQ0NfVEFCTEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSFVGRl9FTlRSWSBjbGRbMzFdOworICBIVUZGX0VOVFJZIGljY1s4XTsKKworfSBIVUZGX1BUMF9UQUJMRTsKKwordHlwZWRlZiBIVUZGX0VOVFJZIEhVRkZfUkVTX1RBQkxFWzVdWzhdOworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gY29uc3QgSFVGRl9DTERfVEFCTEUgZmRrX3NhY2VuY19odWZmQ0xEVGFiOworZXh0ZXJuIGNvbnN0IEhVRkZfSUNDX1RBQkxFIGZka19zYWNlbmNfaHVmZklDQ1RhYjsKK2V4dGVybiBjb25zdCBIVUZGX1BUMF9UQUJMRSBmZGtfc2FjZW5jX2h1ZmZQYXJ0MFRhYjsKKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLyogU0FDRU5DX0hVRkZfVEFCX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2xpYi5jcHAgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19saWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTE2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19saWIuY3BwCkBAIC0wLDAgKzEsMjA0MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF4IE5ldWVuZG9yZgorCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIEludGVyZmFjZSB0byBTcGFjaWFsIEF1ZGlvIENvZGluZyBFbmNvZGVyIGxpYgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorXGZpbGUKK0Rlc2NyaXB0aW9uIG9mIGZpbGUgY29udGVudHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY19saWIuaCIKKyNpbmNsdWRlICJzYWNlbmNfY29uc3QuaCIKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorI2luY2x1ZGUgIkZES19jb3JlLmgiCisjaW5jbHVkZSAic2FjZW5jX3RyZWUuaCIKKyNpbmNsdWRlICJzYWNlbmNfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAic2FjZW5jX29uc2V0ZGV0ZWN0LmgiCisjaW5jbHVkZSAic2FjZW5jX2ZyYW1ld2luZG93aW5nLmgiCisjaW5jbHVkZSAic2FjZW5jX2ZpbHRlci5oIgorI2luY2x1ZGUgInNhY2VuY19wYXJhbWV4dHJhY3QuaCIKKyNpbmNsdWRlICJzYWNlbmNfc3RhdGljZ2Fpbi5oIgorI2luY2x1ZGUgInNhY2VuY19kZWxheS5oIgorI2luY2x1ZGUgInNhY2VuY19kbXhfdGRvbV9lbmguaCIKKyNpbmNsdWRlICJzYWNlbmNfdmVjdG9yZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAicW1mLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRW5jb2RlciBsaWJyYXJ5IGluZm8gKi8KKyNkZWZpbmUgU0FDRU5DX0xJQl9WTDAgMgorI2RlZmluZSBTQUNFTkNfTElCX1ZMMSAwCisjZGVmaW5lIFNBQ0VOQ19MSUJfVkwyIDAKKyNkZWZpbmUgU0FDRU5DX0xJQl9USVRMRSAiTVBFRyBTdXJyb3VuZCBFbmNvZGVyIgorI2lmZGVmIF9fQU5EUk9JRF9fCisjZGVmaW5lIFNBQ0VOQ19MSUJfQlVJTERfREFURSAiIgorI2RlZmluZSBTQUNFTkNfTElCX0JVSUxEX1RJTUUgIiIKKyNlbHNlCisjZGVmaW5lIFNBQ0VOQ19MSUJfQlVJTERfREFURSBfX0RBVEVfXworI2RlZmluZSBTQUNFTkNfTElCX0JVSUxEX1RJTUUgX19USU1FX18KKyNlbmRpZgorCisjZGVmaW5lIE1BWF9NUEVHU19CWVRFUyAoMSA8PCAxNCkKKyNkZWZpbmUgTUFYX1NTQ19CWVRFUyAoMSA8PCA2KQorCisjZGVmaW5lIE1BWF9TUEFDRV9UUkVFX0NIQU5ORUxTIDIKKyNkZWZpbmUgTlVNX0tFRVBfV0lORE9XUyAzCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgTVA0U1BBQ0VFTkNfTU9ERSBlbmNNb2RlOworICBNUDRTUEFDRUVOQ19CQU5EU19DT05GSUcgblBhcmFtQmFuZHM7CisgIE1QNFNQQUNFRU5DX1FVQU5UTU9ERSBxdWFudE1vZGU7CisgIFVDSEFSIGJVc2VDb2Fyc2VRdWFudDsKKyAgVUNIQVIgYkxkTW9kZTsKKyAgVUNIQVIgYlRpbWVEb21haW5EbXg7CisgIFVJTlQgc2FtcGxlUmF0ZTsKKyAgVUlOVCBmcmFtZVRpbWVTbG90czsgICAgIC8qIGUuZy4gMzIgd2hlbiB1c2VkIHdpdGggSEUtQUFDICovCisgIFVJTlQgaW5kZXBlbmRlbmN5RmFjdG9yOyAvKiBob3cgb2Z0ZW4gc2hvdWxkIHdlIHNldCB0aGUgaW5kZXBlbmRlbmN5IGZsYWcgKi8KKyAgSU5UIHRpbWVBbGlnbm1lbnQ7ICAgICAgIC8qIGFkZGl0aW9uYWwgZGVsYXkgZm9yIGRvd25taXggKi8KKworfSBNUDRTUEFDRUVOQ19TRVRVUCwgKkhBTkRMRV9NUDRTUEFDRUVOQ19TRVRVUDsKKworc3RydWN0IEVOQ19DT05GSUdfU0VUVVAgeworICBVQ0hBUiBiRW5jTW9kZV8yMTI7CisgIFVDSEFSIG1heEh5YnJpZEluU3RhdGljU2xvdHM7CisgIExPTkcgbWF4U2FtcGxpbmdyYXRlOworICBJTlQgbWF4QW5hbHlzaXNMZW5ndGhUaW1lU2xvdHM7CisgIElOVCBtYXhIeWJyaWRCYW5kczsKKyAgSU5UIG1heFFtZkJhbmRzOworICBJTlQgbWF4Q2hJbjsKKyAgSU5UIG1heEZyYW1lVGltZVNsb3RzOworICBJTlQgbWF4RnJhbWVMZW5ndGg7CisgIElOVCBtYXhDaE91dDsKKyAgSU5UIG1heENoVG90T3V0OworfTsKKworc3RydWN0IE1QNFNQQUNFX0VOQ09ERVIgeworICBNUDRTUEFDRUVOQ19TRVRVUCB1c2VyOworCisgIEVOQ19DT05GSUdfU0VUVVAgc2V0dXA7IC8qIGRlc2NyaWJlIGFsbG9jYXRlZCBpbnN0YW5jZSAqLworCisgIEhBTkRMRV9GUkFNRVdJTkRPVworICBoRnJhbWVXaW5kb3c7ICAgICAgLyogV2luZG93aW5nLCBvbmx5IGNyZWF0ZWQrdXBkYXRlZCwgYnV0IG5vdCB1c2VkICovCisgIElOVCBuU2FtcGxlc1ZhbGlkOyAvKiBJbnB1dCBCdWZmZXIgSGFuZGxpbmcgKi8KKworICAvKiBSb3V0aW5nIFNlbnNpYmxlIFN3aXRjaGVzL1ZhcmlhYmxlcyAqLworICBNUDRTUEFDRUVOQ19CQU5EU19DT05GSUcgblBhcmFtQmFuZHM7CisgIFVDSEFSIHVzZVRpbWVEb21Eb3dubWl4OworCisgIC8qIG5vdCBSb3V0aW5nIFNlbnNpYmxlIFN3aXRjaGVzL1ZhcmlibGVzIC0gbXVzdCBiZSBjb250YWluZWQgaW4gQ2hlY2sgKi8KKyAgTVA0U1BBQ0VFTkNfTU9ERSBlbmNNb2RlOworICBVQ0hBUiBiRW5jTW9kZV8yMTJfb25seTsKKworICAvKiBub3QgUm91dGluZyBTZW5zaWJsZSBTd2l0Y2hlcy9WYXJpYmxlcyArIGxvd2VyIENsYXNzZXMgKi8KKyAgVUNIQVIgdXNlRnJhbWVLZWVwOworICBVSU5UIGluZGVwZW5kZW5jeUZhY3RvcjsKKyAgVUlOVCBuU2FtcGxlUmF0ZTsKKyAgVUNIQVIgbklucHV0Q2hhbm5lbHM7CisgIFVDSEFSIG5PdXRwdXRDaGFubmVsczsKKyAgVUNIQVIgbkZyYW1lVGltZVNsb3RzOyAvKiBlLmcuIDMyIHdoZW4gdXNlZCB3aXRoIEhFLUFBQyAqLworICBVQ0hBUiBuUW1mQmFuZHM7CisgIFVDSEFSIG5IeWJyaWRCYW5kczsKKyAgVUlOVCBuRnJhbWVMZW5ndGg7IC8qIG51bWJlciBvZiBvdXRwdXQgd2F2ZWZvcm0gc2FtcGxlcy9jaGFubmVsL2ZyYW1lICovCisKKyAgLyogbm90IFJvdXRpbmcgU2Vuc2libGUgU3dpdGNoZXMvVmFyaWJsZXMgKyBsb3dlciBDbGFzc2VzLCBzZWNvbmRhcnkgY29tcHV0ZWQKKyAgICovCisgIElOVCBuU2FtcGxlc05leHQ7CisgIElOVCBuQW5hbHlzaXNMZW5ndGhUaW1lU2xvdHM7CisgIElOVCBuQW5hbHlzaXNMb29rYWhlYWRUaW1lU2xvdHM7CisgIElOVCBuVXBkYXRlSHlicmlkUG9zaXRpb25UaW1lU2xvdHM7CisgIElOVCAqcG5PdXRwdXRCaXRzOworICBJTlQgbklucHV0RGVsYXk7CisgIElOVCBuT3V0cHV0QnVmZmVyRGVsYXk7CisgIElOVCBuU3Vycm91bmRBbmFseXNpc0J1ZmZlckRlbGF5OworICBJTlQgbkJpdHN0cmVhbURlbGF5QnVmZmVyOworICBJTlQgbkJpdHN0cmVhbUJ1ZmZlclJlYWQ7CisgIElOVCBuQml0c3RyZWFtQnVmZmVyV3JpdGU7CisgIElOVCBuRGlzY2FyZE91dEZyYW1lczsKKyAgSU5UIGF2b2lkX2tlZXA7CisKKyAgLyogbm90IFJvdXRpbmcgU2Vuc2libGUgU3dpdGNoZXMvVmFyaWJsZXMgLT4gbW92ZWQgdG8gbG93ZXIgQ2xhc3NlcyAqLworICBVQ0hBUiB1c2VDb2Fyc2VRdWFudENsZDsgICAgLyogT25seSBVc2VkIGluIFNwYWNlVHJlZVNldHVwICovCisgIFVDSEFSIHVzZUNvYXJzZVF1YW50SWNjOyAgICAvKiBPbmx5IFVzZWQgaW4gU3BhY2VUcmVlU2V0dXAgKi8KKyAgVUNIQVIgdXNlQ29hcnNlUXVhbnRDcGM7ICAgIC8qIE9ubHkgVXNlZCBpbiBTcGFjZVRyZWVTZXR1cCAqLworICBVQ0hBUiB1c2VDb2Fyc2VRdWFudEFyYkRteDsgLyogQXJiaXRyYXJ5RG14LC4uLiBub3QgYXZhaWxhYmxlIHlldCAqLworICBNUDRTUEFDRUVOQ19RVUFOVE1PREUKKyAgcXVhbnRNb2RlOyAgICAgICAgICAvKiBVc2VkIGZvciBxdWFuaXR6YXRpb24gYW5kIGluIGJpdHN0cmVhbSB3cml0ZXIgKi8KKyAgSU5UIGNvcmVDb2RlckRlbGF5OyAvKiBVc2VkIGluIGRlbGF5IGNvbXBlbnNhdGlvbiAqLworICBJTlQgdGltZUFsaWdubWVudDsgIC8qIFVzZWQgaW4gZGVsYXkgY29tcGVuc2F0aW9uICovCisKKyAgLyogTG9jYWwgUHJvY2Vzc2luZyBWYXJpYWJsZXMgKi8KKyAgSU5UIGluZGVwZW5kZW5jeUNvdW50OworICBJTlQgaW5kZXBlbmRlbmN5RmxhZzsKKyAgSU5UICoqcHBUckN1cnJQb3M7ICAgICAgICAgICAgICAgIC8qIGJlbG9uZ3Mgc29tZWhvdyB0byBPbnNldCBEZXRlY3Rpb24gKi8KKyAgSU5UIHRyUHJldlBvc1syICogTUFYX05VTV9UUkFOU107IC8qIGJlbG9uZ3Mgc29tZWhvdyB0byBPbnNldCBEZXRlY3Rpb24gKi8KKworICBGUkFNRVdJTl9MSVNUIGZyYW1lV2luTGlzdDsKKyAgU1BBVElBTEZSQU1FIHNhdmVGcmFtZTsKKworICAvKiBNb2R1bGUtSGFuZGxlcyAqLworICBTUEFDRV9UUkVFX1NFVFVQIHNwYWNlVHJlZVNldHVwOworICBNUEVHNFNQQUNFRU5DX1NTQ0JVRiBzc2NCdWY7CisgIEZJWFBfV0lOICpwRnJhbWVXaW5kb3dBbmFfX0ZES1tNQVhfTlVNX1BBUkFNU107CisgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgKnBoUW1mRmlsdEluX19GREs7CisgIEhBTkRMRV9EQ19GSUxURVIgcGhEQ0ZpbHRlclNpZ0luW1NBQ0VOQ19NQVhfSU5QVVRfQ0hBTk5FTFNdOworICBIQU5ETEVfT05TRVRfREVURUNUIHBoT25zZXRbU0FDRU5DX01BWF9JTlBVVF9DSEFOTkVMU107CisgIEhBTkRMRV9TUEFDRV9UUkVFIGhTcGFjZVRyZWU7CisgIEhBTkRMRV9CU0ZfSU5TVEFOQ0UgaEJpdHN0cmVhbUZvcm1hdHRlcjsKKyAgSEFORExFX1NUQVRJQ19HQUlOX0NPTkZJRyBoU3RhdGljR2FpbkNvbmZpZzsKKyAgSEFORExFX1NUQVRJQ19HQUlOIGhTdGF0aWNHYWluOworICBIQU5ETEVfREVMQVkgaERlbGF5OworCisgIC8qIGVuaGFuY2VkIHRpbWUgZG9tYWluIGRvd25taXggKGZvciBzdGVyZW8gaW5wdXQpICovCisgIEhBTkRMRV9FTkhBTkNFRF9USU1FX0RPTUFJTl9ETVggaEVuaGFuY2VkVGltZURteDsKKworICAvKiBEYXRhIEJ1ZmZlcnMgKi8KKyAgSU5UX1BDTSAqKnBwVGltZVNpZ0luX19GREs7CisgIElOVF9QQ00gKipwcFRpbWVTaWdEZWxheUluX19GREs7CisgIElOVF9QQ00gKipwcFRpbWVTaWdPdXRfX0ZESzsKKyAgRklYUF9EUEsgKioqcHBwSHlicmlkSW5fX0ZESzsKKyAgRklYUF9EUEsgKioqcHBwSHlicmlkSW5TdGF0aWNfX0ZESzsKKyAgRklYUF9EUEsgKioqcHBwUHJvY0RhdGFJbl9fRkRLOworICBJTlRfUENNICpwT3V0cHV0RGVsYXlCdWZmZXJfX0ZESzsKKworICBVQ0hBUiAqKnBwQml0c3RyZWFtRGVsYXlCdWZmZXI7CisKKyAgVUNIQVIgKnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQ7CisgIElOVCBzdGF0aWNHYWluU2NhbGU7CisKKyAgSU5UICpwRW5jb2RlcklucHV0Q2hTY2FsZTsKKyAgSU5UICpzdGF0aWNUaW1lRG9tYWluRG14SW5TY2FsZTsKK307CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBjb25zdCBVQ0hBUiBwVmFsaWRCYW5kc19MZFs4XSA9IHs0LCA1LCA3LCA5LCAxMiwgMTUsIDIzLCA0MH07CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBxbWYycW1mW10gPSAvKiBCeXBhc3MgdGhlIEh5YnJpZEFueWx5aXMvU3ludGhlc2lzKi8KKyAgICB7MCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgICAxMCwgIDExLCAgMTIsICAxMywgIDE0LAorICAgICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksCisgICAgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwKKyAgICAgNDUsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LAorICAgICA2MCwgIDYxLCAgNjIsICA2MywgIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsCisgICAgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksICA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwKKyAgICAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LCAgOTYsICA5NywgIDk4LCAgOTksICAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwKKyAgICAgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwKKyAgICAgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjd9OworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBtcDRTcGFjZUVuY19jcmVhdGUoCisgICAgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgKnBoTXA0U3BhY2VFbmMpOworCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBGaWxsU3BhdGlhbFNwZWNpZmljQ29uZmlnKAorICAgIGNvbnN0IEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhFbmMsIFNQQVRJQUxTUEVDSUZJQ0NPTkZJRyAqY29uc3QgaFNzYyk7CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIG1wNFNwYWNlRW5jX0ZpbGxTcGFjZVRyZWVTZXR1cCgKKyAgICBjb25zdCBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoRW5jLAorICAgIFNQQUNFX1RSRUVfU0VUVVAgKmNvbnN0IGhTcGFjZVRyZWVTZXR1cCk7CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIG1wNFNwYWNlRW5jX0luaXREZWxheUNvbXBlbnNhdGlvbigKKyAgICBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoTXA0U3BhY2VFbmMsIGNvbnN0IElOVCBjb3JlQ29kZXJEZWxheSk7CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIG1wNFNwYWNlRW5jX0luaXREZWZhdWx0KAorICAgIEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhNcDRTcGFjZUVuYyk7CisKK3N0YXRpYyBERUNPUlJDT05GSUcgbXA0U3BhY2VFbmNfR2V0RGVjb3JyQ29uZmlnKGNvbnN0IE1QNFNQQUNFRU5DX01PREUgZW5jTW9kZSk7CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIG1wNFNwYWNlRW5jX0luaXROdW1QYXJhbUJhbmRzKAorICAgIEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhFbmMsIGNvbnN0IE1QNFNQQUNFRU5DX0JBTkRTX0NPTkZJRyBuUGFyYW1CYW5kcyk7CisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVSU5UIG1wNFNwYWNlRW5jX0dldE51bVFtZkJhbmRzKGNvbnN0IFVJTlQgblNhbXBsZVJhdGUpIHsKKyAgVUlOVCBuUW1mQmFuZHMgPSAwOworCisgIGlmIChuU2FtcGxlUmF0ZSA8IDI3NzEzKQorICAgIG5RbWZCYW5kcyA9IDMyOworICBlbHNlIGlmIChuU2FtcGxlUmF0ZSA8IDU1NDI2KQorICAgIG5RbWZCYW5kcyA9IDY0OworCisgIHJldHVybiBuUW1mQmFuZHM7Cit9CisKK3N0YXRpYyBVSU5UIHVwZGF0ZVFtZkZsYWdzKGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IElOVCBrZWVwU3RhdGVzKSB7CisgIFVJTlQgcW1mRmxhZ3MgPSBmbGFnczsKKworICBxbWZGbGFncyA9IChxbWZGbGFncyAmICh+KFVJTlQpUU1GX0ZMQUdfTFApKTsKKyAgcW1mRmxhZ3MgPSAocW1mRmxhZ3MgfCBRTUZfRkxBR19NUFNMREZCKTsKKyAgcW1mRmxhZ3MgPSAoa2VlcFN0YXRlcykgPyAocW1mRmxhZ3MgfCBRTUZfRkxBR19LRUVQX1NUQVRFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocW1mRmxhZ3MgJiAofihVSU5UKVFNRl9GTEFHX0tFRVBfU1RBVEVTKSk7CisKKyAgcmV0dXJuIHFtZkZsYWdzOworfQorCitzdGF0aWMgSU5UIGZyZXEySHlicmlkQmFuZChjb25zdCBVSU5UIG5GcmVxdWVuY3ksIGNvbnN0IFVJTlQgblNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG5RbWZCYW5kcykgeworICAvKgorICAgIG5RbWZTbG90V2lkdGggPSAoblNhbXBsZVJhdGUvMikgLyBuUW1mQmFuZHM7CisgICAgblFtZkJhbmQgICAgICA9IG5GcmVxdWVuY3kgLyBuUW1mU2xvdFdpZHRoOworICAqLworICBpbnQgbkh5YnJpZEJhbmQgPSAtMTsKKyAgaW50IHNjYWxlID0gMDsKKyAgY29uc3QgRklYUF9EQkwgdGVtcCA9IGZEaXZOb3JtKChGSVhQX0RCTCkoMiAqIG5GcmVxdWVuY3kgKiBuUW1mQmFuZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKW5TYW1wbGVSYXRlLCAmc2NhbGUpOworICBjb25zdCBpbnQgblFtZkJhbmQgPSBzY2FsZVZhbHVlKHRlbXAsIHNjYWxlIC0gKERGUkFDVF9CSVRTIC0gMSkpOworCisgIGlmICgoblFtZkJhbmQgPiAtMSkgJiYgKG5RbWZCYW5kIDwgKGludCluUW1mQmFuZHMpKSB7CisgICAgbkh5YnJpZEJhbmQgPSBxbWYycW1mW25RbWZCYW5kXTsKKyAgfQorCisgIHJldHVybiBuSHlicmlkQmFuZDsKK30KKworLyoKKyAqIEV4YW1pbmUgYnVmZmVyIGRlc2NyaXB0b3IgcmVnYXJkaW5nIGNob29zZW4gdHlwZS4KKyAqCisgKiBccGFyYW0gcEJ1ZkRlc2MgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYnVmZmVyIGRlc2NyaXB0b3IKKyAqIFxwYXJhbSB0eXBlICAgICAgICAgICAgICAgICAgQnVmZmVyIHR5cGUgdG8gbG9vayBmb3IuCisKKyAqIFxyZXR1cm4gLSBCdWZmZXIgZGVzY3JpcHRvciBpbmRleC4KKyAqICAgICAgICAgLTEsIGlmIHRoZXJlIGlzIG5vIGVudHJ5IGF2YWlsYWJsZS4KKyAqLworc3RhdGljIElOVCBnZXRCdWZEZXNjSWR4KGNvbnN0IEZES19idWZEZXNjciAqcEJ1ZkRlc2MsIGNvbnN0IFVJTlQgdHlwZSkgeworICBJTlQgaSwgaWR4ID0gLTE7CisKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpcEJ1ZkRlc2MtPm51bUJ1ZnM7IGkrKykgeworICAgIGlmIChwQnVmRGVzYy0+cEJ1ZlR5cGVbaV0gPT0gdHlwZSkgeworICAgICAgaWR4ID0gaTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gaWR4OworfQorCitGREtfU0FDRU5DX0VSUk9SIEZES19zYWNlbmNfb3BlbihIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiAqcGhNcDRTcGFjZUVuYykgeworICByZXR1cm4gbXA0U3BhY2VFbmNfY3JlYXRlKHBoTXA0U3BhY2VFbmMpOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBtcDRTcGFjZUVuY19jcmVhdGUoCisgICAgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgKnBoTXA0U3BhY2VFbmMpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKyAgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaEVuYyA9IE5VTEw7CisgIEVOQ19DT05GSUdfU0VUVVAgc2V0dXA7CisKKyAgaWYgKE5VTEwgPT0gcGhNcDRTcGFjZUVuYykgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBpLCBjaDsKKyAgICBGREttZW1jbGVhcigmc2V0dXAsIHNpemVvZihFTkNfQ09ORklHX1NFVFVQKSk7CisKKyAgICAvKiBBbGxvY2F0ZSBFbmNvZGVyIEluc3RhbmNlICovCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoRW5jLCAxLCBzdHJ1Y3QgTVA0U1BBQ0VfRU5DT0RFUik7CisKKyAgICAvKiBDbGVhciBldmVyeXRoaW5nLCBhbHNvIHBvaW50ZXJzLiAqLworICAgIGlmIChOVUxMICE9IGhFbmMpIHsKKyAgICAgIEZES21lbWNsZWFyKGhFbmMsIHNpemVvZihzdHJ1Y3QgTVA0U1BBQ0VfRU5DT0RFUikpOworICAgIH0KKworICAgIHNldHVwLm1heFNhbXBsaW5ncmF0ZSA9IDQ4MDAwOworICAgIHNldHVwLm1heEZyYW1lVGltZVNsb3RzID0gMTY7CisKKyAgICBzZXR1cC5tYXhBbmFseXNpc0xlbmd0aFRpbWVTbG90cyA9IDMgKiBzZXR1cC5tYXhGcmFtZVRpbWVTbG90czsKKyAgICBzZXR1cC5tYXhRbWZCYW5kcyA9IG1wNFNwYWNlRW5jX0dldE51bVFtZkJhbmRzKHNldHVwLm1heFNhbXBsaW5ncmF0ZSk7CisgICAgOworICAgIHNldHVwLm1heEh5YnJpZEJhbmRzID0gc2V0dXAubWF4UW1mQmFuZHM7CisgICAgc2V0dXAubWF4RnJhbWVMZW5ndGggPSBzZXR1cC5tYXhRbWZCYW5kcyAqIHNldHVwLm1heEZyYW1lVGltZVNsb3RzOworCisgICAgc2V0dXAubWF4Q2hJbiA9IDI7CisgICAgc2V0dXAubWF4Q2hPdXQgPSAxOworICAgIHNldHVwLm1heENoVG90T3V0ID0gc2V0dXAubWF4Q2hPdXQ7CisgICAgc2V0dXAuYkVuY01vZGVfMjEyID0gMTsKKyAgICBzZXR1cC5tYXhIeWJyaWRJblN0YXRpY1Nsb3RzID0gMjQ7CisKKyAgICAvKiBPcGVuIFN0YXRpYyBHYWluKi8KKyAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgIChlcnJvciA9IGZka19zYWNlbmNfc3RhdGljR2Fpbl9PcGVuQ29uZmlnKCZoRW5jLT5oU3RhdGljR2FpbkNvbmZpZykpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogZW5oYW5jZWQgdGltZSBkb21haW4gZG93bm1peCAoZm9yIHN0ZXJlbyBpbnB1dCkgKi8KKyAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfb3Blbl9lbmhhbmNlZFRpbWVEb21haW5EbXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW5jLT5oRW5oYW5jZWRUaW1lRG14LCBzZXR1cC5tYXhGcmFtZUxlbmd0aCkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoRW5jLT5wUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX05VTV9QQVJBTV9CQU5EUywgVUNIQVIpOworCisgICAgLyogQ3JlYXRlIFNwYWNlIFRyZWUgZmlyc3QsIHRvIGdldCBudW1iZXIgb2YgaW4tL291dHB1dCBjaGFubmVscyAqLworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19zcGFjZVRyZWVfT3BlbigmaEVuYy0+aFNwYWNlVHJlZSkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoRW5jLT5wRW5jb2RlcklucHV0Q2hTY2FsZSwgc2V0dXAubWF4Q2hJbiwgSU5UKTsKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKGhFbmMtPnN0YXRpY1RpbWVEb21haW5EbXhJblNjYWxlLCBzZXR1cC5tYXhDaEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKTsKKworICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoaEVuYy0+cGhRbWZGaWx0SW5fX0ZESywgc2V0dXAubWF4Q2hJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTkspOworCisgICAgLyogQWxsb2NhdGUgQW5hbHlzaXMgRmlsdGVyYmFuayBTdHJ1Y3RzICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgc2V0dXAubWF4Q2hJbjsgY2grKykgeworICAgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRF9JTlQoaEVuYy0+cGhRbWZGaWx0SW5fX0ZES1tjaF0sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgUU1GX0ZJTFRFUl9CQU5LLCBTRUNUX0RBVEFfTDIpCisgICAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEX0lOVChoRW5jLT5waFFtZkZpbHRJbl9fRkRLW2NoXS0+RmlsdGVyU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIDUgKiBzZXR1cC5tYXhRbWZCYW5kcywgRklYUF9RQVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUX0RBVEFfTDIpCisgICAgfQorCisgICAgLyogQWxsb2NhdGUgU3ludGhlc2lzIEZpbHRlcmJhbmsgU3RydWN0cyBmb3IgYXJiaXRyYXJ5IGRvd25taXggKi8KKworICAgIC8qIEFsbG9jYXRlIERDIEZpbHRlciBTdHJ1Y3QgZm9yIG5vcm1hbCBzaWduYWwgaW5wdXQgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzZXR1cC5tYXhDaEluOyBjaCsrKSB7CisgICAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgICAgKGVycm9yID0gZmRrX3NhY2VuY19jcmVhdGVEQ0ZpbHRlcigmaEVuYy0+cGhEQ0ZpbHRlclNpZ0luW2NoXSkpKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBPcGVuIE9uc2V0IERldGVjdGlvbiAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IHNldHVwLm1heENoSW47IGNoKyspIHsKKyAgICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19vbnNldERldGVjdF9PcGVuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW5jLT5waE9uc2V0W2NoXSwgc2V0dXAubWF4RnJhbWVUaW1lU2xvdHMpKSkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChoRW5jLT5wcFRyQ3VyclBvcywgc2V0dXAubWF4Q2hJbiwgTUFYX05VTV9UUkFOUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCk7CisKKyAgICAvKiBDcmVhdGUgV2luZG93aW5nICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAoZXJyb3IgPSBmZGtfc2FjZW5jX2ZyYW1lV2luZG93X0NyZWF0ZSgmaEVuYy0+aEZyYW1lV2luZG93KSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBPcGVuIHN0YXRpYyBnYWluICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fT3BlbigmaEVuYy0+aFN0YXRpY0dhaW4pKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIGNyZWF0ZSBiaXRzdHJlYW0gZW5jb2RlciAqLworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19jcmVhdGVTcGF0aWFsQml0c3RyZWFtRW5jb2RlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbmMtPmhCaXRzdHJlYW1Gb3JtYXR0ZXIpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoaEVuYy0+c3NjQnVmLnBTc2MsIE1BWF9TU0NfQllURVMsIFVDSEFSKTsKKworICAgIHsKKyAgICAgIEZES19BTExPQ0FURV9NRU1PUllfMkQoaEVuYy0+cHBUaW1lU2lnSW5fX0ZESywgc2V0dXAubWF4Q2hJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4RnJhbWVMZW5ndGggKyBNQVhfREVMQVlfU1VSUk9VTkRfQU5BTFlTSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00pOworICAgIH0KKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKGhFbmMtPnBwVGltZVNpZ0RlbGF5SW5fX0ZESywgc2V0dXAubWF4Q2hJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9ERUxBWV9TVVJST1VORF9BTkFMWVNJUywgSU5UX1BDTSk7CisKKyAgICAvKiBDcmVhdGUgbmV3IGJ1ZmZlcnMgZm9yIHNldmVyYWwgc2lnbmFscyAoaW5jbHVkaW5nIGFyYml0cmFyeSBkb3dubWl4KSAqLworICAgIGlmIChzZXR1cC5iRW5jTW9kZV8yMTIgPT0gMCkgeworICAgICAgLyogcE91dHB1dERlbGF5QnVmZmVyX19GREsgYnVmZmVyIGlzIG5vdCBuZWVkZWQgZm9yIFNBQ0VOQ18yMTIgbW9kZSAqLworICAgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRCgKKyAgICAgICAgICBoRW5jLT5wT3V0cHV0RGVsYXlCdWZmZXJfX0ZESywKKyAgICAgICAgICAoc2V0dXAubWF4RnJhbWVMZW5ndGggKyBNQVhfREVMQVlfT1VUUFVUKSAqIHNldHVwLm1heENoT3V0LCBJTlRfUENNKTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBidWZmZXJzICovCisgICAgaWYgKHNldHVwLmJFbmNNb2RlXzIxMiA9PSAwKSB7CisgICAgICAvKiBwcFRpbWVTaWdPdXRfX0ZESyBidWZmZXIgaXMgbm90IG5lZWRlZCBmb3IgU0FDRU5DXzIxMiBtb2RlICovCisgICAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKGhFbmMtPnBwVGltZVNpZ091dF9fRkRLLCBzZXR1cC5tYXhDaFRvdE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4RnJhbWVMZW5ndGgsIElOVF9QQ00pOworICAgIH0KKworICAgIGlmIChzZXR1cC5iRW5jTW9kZV8yMTIgPT0gMSkgeworICAgICAgLyogcHBwSHlicmlkSW5fX0ZESyBidWZmZXIgY2FuIGJlIHJlZHVjZWQgYnkgbWF4RnJhbWVUaW1lU2xvdHMvMiBzbG90cyBmb3IKKyAgICAgICAqIFNBQ0VOQ18yMTIgbW9kZSAqLworICAgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRCgKKyAgICAgICAgICBoRW5jLT5wcHBIeWJyaWRJbl9fRkRLLCBzZXR1cC5tYXhDaEluLAorICAgICAgICAgIHNldHVwLm1heEFuYWx5c2lzTGVuZ3RoVGltZVNsb3RzIC0gKHNldHVwLm1heEZyYW1lVGltZVNsb3RzID4+IDEpLAorICAgICAgICAgIHNldHVwLm1heEh5YnJpZEJhbmRzLCBGSVhQX0RQSyk7CisgICAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzNEKGhFbmMtPnBwcEh5YnJpZEluU3RhdGljX19GREssIHNldHVwLm1heENoSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heEh5YnJpZEluU3RhdGljU2xvdHMsIHNldHVwLm1heEh5YnJpZEJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RQSyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZES19BTExPQ0FURV9NRU1PUllfM0QoaEVuYy0+cHBwSHlicmlkSW5fX0ZESywgc2V0dXAubWF4Q2hJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4QW5hbHlzaXNMZW5ndGhUaW1lU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heEh5YnJpZEJhbmRzLCBGSVhQX0RQSyk7CisgICAgfQorCisgICAgaWYgKHNldHVwLmJFbmNNb2RlXzIxMiA9PSAwKSB7CisgICAgICAvKiBwcHBQcm9jRGF0YUluX19GREsgYnVmZmVyIGlzIG5vdCBuZWVkZWQgZm9yIFNBQ0VOQ18yMTIgbW9kZSAqLworICAgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRChoRW5jLT5wcHBQcm9jRGF0YUluX19GREssIE1BWF9TUEFDRV9UUkVFX0NIQU5ORUxTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhBbmFseXNpc0xlbmd0aFRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4SHlicmlkQmFuZHMsIEZJWFBfRFBLKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fUEFSQU1TOyBpKyspIHsKKyAgICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoaEVuYy0+cEZyYW1lV2luZG93QW5hX19GREtbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heEFuYWx5c2lzTGVuZ3RoVGltZVNsb3RzLCBGSVhQX1dJTik7CisgICAgfSAvKiBmb3IgaSAqLworCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX2RlbGF5X09wZW4oJmhFbmMtPmhEZWxheSkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKHNldHVwLmJFbmNNb2RlXzIxMiA9PSAwKSB7CisgICAgICAvKiBwcEJpdHN0cmVhbURlbGF5QnVmZmVyIGJ1ZmZlciBpcyBub3QgbmVlZGVkIGZvciBTQUNFTkNfMjEyIG1vZGUgKi8KKyAgICAgIEZES19BTExPQ0FURV9NRU1PUllfMkQoaEVuYy0+cHBCaXRzdHJlYW1EZWxheUJ1ZmZlciwgTUFYX0JJVFNUUkVBTV9ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX01QRUdTX0JZVEVTLCBVQ0hBUik7CisgICAgfQorICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoaEVuYy0+cG5PdXRwdXRCaXRzLCBNQVhfQklUU1RSRUFNX0RFTEFZLCBJTlQpOworCisgICAgaEVuYy0+c2V0dXAgPSBzZXR1cDsgLyogc2F2ZSBjb25maWd1cmF0aW9uIHVzZWQgd2hpbGUgZW5jb2RlciBhbGxvY2F0aW9uLiAqLworICAgIG1wNFNwYWNlRW5jX0luaXREZWZhdWx0KGhFbmMpOworCisgICAgaWYgKE5VTEwgIT0gcGhNcDRTcGFjZUVuYykgeworICAgICAgKnBoTXA0U3BhY2VFbmMgPSBoRW5jOyAvKiByZXR1cm4gZW5jb2RlciBoYW5kbGUgKi8KKyAgICB9CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworICByZXR1cm4gZXJyb3I7CisKK2JhaWw6CisgIGlmIChOVUxMICE9IGhFbmMpIHsKKyAgICBoRW5jLT5zZXR1cCA9IHNldHVwOworICAgIEZES19zYWNlbmNfY2xvc2UoJmhFbmMpOworICB9CisgIHJldHVybiAoKFNBQ0VOQ19PSyA9PSBlcnJvcikgPyBTQUNFTkNfTUVNT1JZX0VSUk9SIDogZXJyb3IpOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBtcDRTcGFjZUVuY19Jbml0RGVmYXVsdChIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoRW5jKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyID0gU0FDRU5DX09LOworCisgIC8qIEdldCBkZWZhdWx0IHN0YXRpYyBnYWluIGNvbmZpZ3VyYXRpb24uICovCisgIGlmIChTQUNFTkNfT0sgIT0gKGVyciA9IGZka19zYWNlbmNfc3RhdGljR2Fpbl9Jbml0RGVmYXVsdENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPmhTdGF0aWNHYWluQ29uZmlnKSkpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgRkRLX3NhY2VuY19jb25maWd1cmUoCisgICAgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaEVuYywgY29uc3QgSEFORExFX01QNFNQQUNFRU5DX1NFVFVQIGhTZXR1cCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGhFbmMtPm5TYW1wbGVSYXRlID0gaFNldHVwLT5zYW1wbGVSYXRlOworICBoRW5jLT5lbmNNb2RlID0gaFNldHVwLT5lbmNNb2RlOworICBoRW5jLT5uUW1mQmFuZHMgPSBtcDRTcGFjZUVuY19HZXROdW1RbWZCYW5kcyhoRW5jLT5uU2FtcGxlUmF0ZSk7CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBzZXQgdGltZSBkb21haW4gZG93bm1peCBmb3IgMjEyICovCisgIGlmIChoU2V0dXAtPmVuY01vZGUgPT0gU0FDRU5DXzIxMiAmJiBoU2V0dXAtPmJUaW1lRG9tYWluRG14ID09IDApIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgfSBlbHNlIHsKKyAgICBoRW5jLT51c2VUaW1lRG9tRG93bm1peCA9IGhTZXR1cC0+YlRpbWVEb21haW5EbXg7CisgIH0KKworICBoRW5jLT50aW1lQWxpZ25tZW50ID0gaFNldHVwLT50aW1lQWxpZ25tZW50OworICBoRW5jLT5xdWFudE1vZGUgPSBoU2V0dXAtPnF1YW50TW9kZTsKKworICBoRW5jLT51c2VDb2Fyc2VRdWFudENsZCA9IGhTZXR1cC0+YlVzZUNvYXJzZVF1YW50OworICBoRW5jLT51c2VDb2Fyc2VRdWFudENwYyA9IGhTZXR1cC0+YlVzZUNvYXJzZVF1YW50OworICBoRW5jLT51c2VGcmFtZUtlZXAgPSAoaFNldHVwLT5iTGRNb2RlID09IDIpOworICBoRW5jLT51c2VDb2Fyc2VRdWFudEljYyA9IDA7ICAgIC8qIG5vdCBhdmFpbGFibGUgKi8KKyAgaEVuYy0+dXNlQ29hcnNlUXVhbnRBcmJEbXggPSAwOyAvKiBub3QgYXZhaWxhYmxlIGZvciB1c2VyIHJpZ2h0IG5vdyAqLworICBoRW5jLT5pbmRlcGVuZGVuY3lGYWN0b3IgPSBoU2V0dXAtPmluZGVwZW5kZW5jeUZhY3RvcjsKKyAgaEVuYy0+aW5kZXBlbmRlbmN5Q291bnQgPSAwOworICBoRW5jLT5pbmRlcGVuZGVuY3lGbGFnID0gMTsKKworICAvKiBzZXQgbnVtYmVyIG9mIEh5YnJpZCBiYW5kcyAqLworICBoRW5jLT5uSHlicmlkQmFuZHMgPSBoRW5jLT5uUW1mQmFuZHM7CisgIGhFbmMtPm5GcmFtZVRpbWVTbG90cyA9IGhTZXR1cC0+ZnJhbWVUaW1lU2xvdHM7CisgIG1wNFNwYWNlRW5jX0luaXROdW1QYXJhbUJhbmRzKGhFbmMsIGhTZXR1cC0+blBhcmFtQmFuZHMpOworCisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBGREtfc2FjZW5jX2luaXQoSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkbXhEZWxheSkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIC8qIFNhbml0eSBDaGVja3MgKi8KKyAgaWYgKE5VTEwgPT0gaEVuYykgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGNvbnN0IGludCBpbml0U3RhdGVzRmxhZyA9IDE7CisKKyAgICBpbnQgY2g7IC8qIGxvb3AgY291bnRlciAqLworICAgIGludCBuQ2hJbkFyYkRteDsKKworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gRkRLX3NhY2VuY19jb25maWd1cmUoaEVuYywgJmhFbmMtPnVzZXIpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGhFbmMtPmJFbmNNb2RlXzIxMl9vbmx5ID0gaEVuYy0+c2V0dXAuYkVuY01vZGVfMjEyOworCisgICAgLyogU2xvdHMgcGVyIEZyYW1lIGFuZCBGcmFtZSBMZW5ndGggKi8KKyAgICBpZiAoaEVuYy0+bkZyYW1lVGltZVNsb3RzIDwgMSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGhFbmMtPm5GcmFtZUxlbmd0aCA9IGhFbmMtPm5RbWZCYW5kcyAqIGhFbmMtPm5GcmFtZVRpbWVTbG90czsKKworICAgIGlmIChoRW5jLT51c2VGcmFtZUtlZXAgPT0gMSkgeworICAgICAgaEVuYy0+bkFuYWx5c2lzTGVuZ3RoVGltZVNsb3RzID0gMyAqIGhFbmMtPm5GcmFtZVRpbWVTbG90czsKKyAgICAgIGhFbmMtPm5VcGRhdGVIeWJyaWRQb3NpdGlvblRpbWVTbG90cyA9IGhFbmMtPm5GcmFtZVRpbWVTbG90czsKKyAgICB9IGVsc2UgeworICAgICAgaEVuYy0+bkFuYWx5c2lzTGVuZ3RoVGltZVNsb3RzID0gMiAqIGhFbmMtPm5GcmFtZVRpbWVTbG90czsKKyAgICAgIGhFbmMtPm5VcGRhdGVIeWJyaWRQb3NpdGlvblRpbWVTbG90cyA9IDA7CisgICAgfQorCisgICAgeworICAgICAgaEVuYy0+bkFuYWx5c2lzTG9va2FoZWFkVGltZVNsb3RzID0KKyAgICAgICAgICBoRW5jLT5uQW5hbHlzaXNMZW5ndGhUaW1lU2xvdHMgLSAzICogaEVuYy0+bkZyYW1lVGltZVNsb3RzIC8gMjsKKyAgICB9CisKKyAgICAvKiBpbml0IHBhcmFtZXRlckJhbmQyaHlicmlkQmFuZE9mZnNldCB0YWJsZSAqLworICAgIGZka19zYWNlbmNfY2FsY1BhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCgKKyAgICAgICAgKEJPWF9TVUJCQU5EX0NPTkZJRyloRW5jLT5uUGFyYW1CYW5kcywgaEVuYy0+bkh5YnJpZEJhbmRzLAorICAgICAgICBoRW5jLT5wUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0KTsKKworICAgIC8qIEZpbGwgU2V0dXAgc3RydWN0dXJlIGZvciBTcGFjZSBUcmVlICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAoZXJyb3IgPSBtcDRTcGFjZUVuY19GaWxsU3BhY2VUcmVlU2V0dXAoaEVuYywgJmhFbmMtPnNwYWNlVHJlZVNldHVwKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBJbml0IHNwYWNlIHRyZWUgY29uZmlndXJhdGlvbiAqLworICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgKGVycm9yID0gZmRrX3NhY2VuY19zcGFjZVRyZWVfSW5pdCgKKyAgICAgICAgICAgICBoRW5jLT5oU3BhY2VUcmVlLCAmaEVuYy0+c3BhY2VUcmVlU2V0dXAsCisgICAgICAgICAgICAgaEVuYy0+cFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCwgaEVuYy0+dXNlRnJhbWVLZWVwKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBHZXQgc3BhY2UgdHJlZSBkZXNjcmlwdGlvbiBhbmQgcmVzdWx0aW5nIG51bWJlciBvZiBpbnB1dC9vdXRwdXQgY2hhbm5lbHMKKyAgICAgKi8KKyAgICB7CisgICAgICBTUEFDRV9UUkVFX0RFU0NSSVBUSU9OIHNwYWNlVHJlZURlc2NyaXB0aW9uOworCisgICAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfc3BhY2VUcmVlX0dldERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPmhTcGFjZVRyZWUsICZzcGFjZVRyZWVEZXNjcmlwdGlvbikpKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKworICAgICAgaEVuYy0+bklucHV0Q2hhbm5lbHMgPQorICAgICAgICAgIHNwYWNlVHJlZURlc2NyaXB0aW9uLm5PdXRDaGFubmVsczsgLyogc3BhY2UgdHJlZSBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVzIGRlY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgIGhFbmMtPm5PdXRwdXRDaGFubmVscyA9CisgICAgICAgICAgc3BhY2VUcmVlRGVzY3JpcHRpb24ubkluQ2hhbm5lbHM7IC8qIHNwYWNlIHRyZWUgZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVzIGRlY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiAqLworICAgIH0KKworICAgIG5DaEluQXJiRG14ID0gMDsKKworICAgIC8qIElOSVRJQUxJWkFUSU9OICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgaEVuYy0+bklucHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIC8qIHNjYWxpbmcgaW4gYW5hbHlzaXMgcW1mIGZpbHRlcmJhbmsgKDcpICovCisgICAgICBoRW5jLT5wRW5jb2RlcklucHV0Q2hTY2FsZVtjaF0gPSA3OworCisgICAgICB7CisgICAgICAgIC8qIGFkZGl0aW9uYWwgc2NhbGluZyBpbiBxbWYgcHJvdG90eXBlIGZpbHRlciBmb3IgbG93IGRlbGF5ICovCisgICAgICAgIGhFbmMtPnBFbmNvZGVySW5wdXRDaFNjYWxlW2NoXSArPSAxOworICAgICAgfQorCisgICAgICB7IGhFbmMtPnBFbmNvZGVySW5wdXRDaFNjYWxlW2NoXSArPSBEQ19GSUxURVJfU0Y7IH0KKyAgICB9IC8qIG5JbnB1dENoYW5uZWxzICovCisKKyAgICAvKiBJbml0IGFuYWx5c2lzIGZpbHRlcmJhbmsgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBoRW5jLT5uSW5wdXRDaGFubmVsczsgY2grKykgeworICAgICAgaEVuYy0+cGhRbWZGaWx0SW5fX0ZES1tjaF0tPmZsYWdzID0KKyAgICAgICAgICB1cGRhdGVRbWZGbGFncyhoRW5jLT5waFFtZkZpbHRJbl9fRkRLW2NoXS0+ZmxhZ3MsICFpbml0U3RhdGVzRmxhZyk7CisKKyAgICAgIGlmICgwICE9IHFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsoCisgICAgICAgICAgICAgICAgICAgaEVuYy0+cGhRbWZGaWx0SW5fX0ZES1tjaF0sCisgICAgICAgICAgICAgICAgICAgKEZJWFBfUUFTICopaEVuYy0+cGhRbWZGaWx0SW5fX0ZES1tjaF0tPkZpbHRlclN0YXRlcywgMSwKKyAgICAgICAgICAgICAgICAgICBoRW5jLT5uUW1mQmFuZHMsIGhFbmMtPm5RbWZCYW5kcywgaEVuYy0+blFtZkJhbmRzLAorICAgICAgICAgICAgICAgICAgIGhFbmMtPnBoUW1mRmlsdEluX19GREtbY2hdLT5mbGFncykpIHsKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5JVF9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgREMgRmlsdGVyLiAqLworICAgIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGhFbmMtPm5JbnB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19pbml0RENGaWx0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW5jLT5waERDRmlsdGVyU2lnSW5bY2hdLCBoRW5jLT5uU2FtcGxlUmF0ZSkpKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdCBvbnNldCBkZXRlY3QuICovCisgICAgeworICAgICAgLyogaW5pdCBvbnNldCBkZXRlY3QgY29uZmlndXJhdGlvbiBzdHJ1Y3QgKi8KKyAgICAgIE9OU0VUX0RFVEVDVF9DT05GSUcgb25zZXREZXRlY3RDb25maWc7CisgICAgICBvbnNldERldGVjdENvbmZpZy5tYXhUaW1lU2xvdHMgPSBoRW5jLT5uRnJhbWVUaW1lU2xvdHM7CisgICAgICBvbnNldERldGVjdENvbmZpZy5sb3dlckJvdW5kT25zZXREZXRlY3Rpb24gPQorICAgICAgICAgIGZyZXEySHlicmlkQmFuZCgxNzI1LCBoRW5jLT5uU2FtcGxlUmF0ZSwgaEVuYy0+blFtZkJhbmRzKTsKKyAgICAgIG9uc2V0RGV0ZWN0Q29uZmlnLnVwcGVyQm91bmRPbnNldERldGVjdGlvbiA9IGhFbmMtPm5IeWJyaWRCYW5kczsKKworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgaEVuYy0+bklucHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X0luaXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW5jLT5waE9uc2V0W2NoXSwgJm9uc2V0RGV0ZWN0Q29uZmlnLCAxKSkpIHsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAvKiBpbml0IHdpbmRvd2luZyAqLworICAgICAgRlJBTUVXSU5ET1dfQ09ORklHIGZyYW1ld2luZG93Q29uZmlnOworICAgICAgZnJhbWV3aW5kb3dDb25maWcublRpbWVTbG90c01heCA9IGhFbmMtPm5GcmFtZVRpbWVTbG90czsKKyAgICAgIGZyYW1ld2luZG93Q29uZmlnLmJGcmFtZUtlZXAgPSBoRW5jLT51c2VGcmFtZUtlZXA7CisKKyAgICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19mcmFtZVdpbmRvd19Jbml0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPmhGcmFtZVdpbmRvdywgJmZyYW1ld2luZG93Q29uZmlnKSkpIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKworICAgIC8qIFNldCBlbmNvZGVyIG1vZGUgZm9yIHN0YXRpYyBnYWluIGluaXRpYWxpemF0aW9uLiAqLworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19zdGF0aWNHYWluX1NldEVuY01vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPmhTdGF0aWNHYWluQ29uZmlnLCBoRW5jLT5lbmNNb2RlKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBJbml0IHN0YXRpYyBnYWluLiAqLworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19zdGF0aWNHYWluX0luaXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPmhTdGF0aWNHYWluLCBoRW5jLT5oU3RhdGljR2FpbkNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJihoRW5jLT5zdGF0aWNHYWluU2NhbGUpKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBoRW5jLT5uSW5wdXRDaGFubmVsczsgY2grKykgeworICAgICAgaEVuYy0+cEVuY29kZXJJbnB1dENoU2NhbGVbY2hdICs9IGhFbmMtPnN0YXRpY0dhaW5TY2FsZTsKKyAgICB9CisKKyAgICAvKiBlbmhhbmNlZCBkb3dubWl4IGZvciBzdGVyZW8gaW5wdXQqLworICAgIGlmIChoRW5jLT51c2VUaW1lRG9tRG93bm1peCAhPSAwKSB7CisgICAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfaW5pdF9lbmhhbmNlZFRpbWVEb21haW5EbXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVuYy0+aEVuaGFuY2VkVGltZURteCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZGtfc2FjZW5jX2dldFByZUdhaW5QdHJGREsoaEVuYy0+aFN0YXRpY0dhaW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPnN0YXRpY0dhaW5TY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZGtfc2FjZW5jX2dldFBvc3RHYWluRkRLKGhFbmMtPmhTdGF0aWNHYWluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW5jLT5zdGF0aWNHYWluU2NhbGUsIGhFbmMtPm5GcmFtZUxlbmd0aCkpKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDcmVhdGUgY29uZmlnIHN0cnVjdHVyZSBmb3IgYml0c3RyZWFtIGZvcm1hdHRlciBpbmNsdWRpbmcgYXJiaXRyYXJ5CisgICAgICogZG93bm1peCByZXNpZHVhbCAqLworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19pbml0U3BhdGlhbEJpdHN0cmVhbUVuY29kZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPmhCaXRzdHJlYW1Gb3JtYXR0ZXIpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gRmlsbFNwYXRpYWxTcGVjaWZpY0NvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaEVuYywgZmRrX3NhY2VuY19nZXRTcGF0aWFsU3BlY2lmaWNDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW5jLT5oQml0c3RyZWFtRm9ybWF0dGVyKSkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAoZXJyb3IgPSBmZGtfc2FjZW5jX3dyaXRlU3BhdGlhbFNwZWNpZmljQ29uZmlnKAorICAgICAgICAgICAgIGZka19zYWNlbmNfZ2V0U3BhdGlhbFNwZWNpZmljQ29uZmlnKGhFbmMtPmhCaXRzdHJlYW1Gb3JtYXR0ZXIpLAorICAgICAgICAgICAgIGhFbmMtPnNzY0J1Zi5wU3NjLCBNQVhfU1NDX0JZVEVTLCAmaEVuYy0+c3NjQnVmLm5Tc2NTaXplQml0cykpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogaW5pdCBkZWxheSBjb21wZW5zYXRpb24gd2l0aCBkbXggY29yZSBjb2RlciBkZWxheTsgaWYgbm8gY29yZSBjb2RlciBpcworICAgICAqIHVzZWQsIG1hbnkgb3RoZXIgYnVmZmVycyBhcmUgaW5pdGlhbGl6ZWQgbmV2ZXJ0aGVsZXNzICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAoZXJyb3IgPSBtcDRTcGFjZUVuY19Jbml0RGVsYXlDb21wZW5zYXRpb24oaEVuYywgZG14RGVsYXkpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIEhvdyBtdWNoIGlucHV0IGRvIHdlIG5lZWQ/ICovCisgICAgaEVuYy0+blNhbXBsZXNOZXh0ID0KKyAgICAgICAgaEVuYy0+bkZyYW1lTGVuZ3RoICogKGhFbmMtPm5JbnB1dENoYW5uZWxzICsgbkNoSW5BcmJEbXgpOworICAgIGhFbmMtPm5TYW1wbGVzVmFsaWQgPSAwOworICB9IC8qIHZhbGlkIGhhbmRsZSAqLworCitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBJTlQgZ2V0QW5hbHlzaXNMZW5ndGhUaW1lU2xvdHMoRklYUF9XSU4gKnBGcmFtZVdpbmRvd0FuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5UaW1lU2xvdHMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IG5UaW1lU2xvdHMgLSAxOyBpID49IDA7IGktLSkgeworICAgIGlmIChwRnJhbWVXaW5kb3dBbmFbaV0gIT0gKEZJWFBfV0lOKTApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBuVGltZVNsb3RzID0gaSArIDE7CisgIHJldHVybiBuVGltZVNsb3RzOworfQorCitzdGF0aWMgSU5UIGdldEFuYWx5c2lzU3RhcnRUaW1lU2xvdChGSVhQX1dJTiAqcEZyYW1lV2luZG93QW5hLCBJTlQgblRpbWVTbG90cykgeworICBpbnQgc3RhcnRUaW1lU2xvdCA9IDA7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgblRpbWVTbG90czsgaSsrKSB7CisgICAgaWYgKHBGcmFtZVdpbmRvd0FuYVtpXSAhPSAoRklYUF9XSU4pMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHN0YXJ0VGltZVNsb3QgPSBpOworICByZXR1cm4gc3RhcnRUaW1lU2xvdDsKK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgX19GZWVkRGVpbnRlclByZVNjYWxlKAorICAgIEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhFbmMsIElOVF9QQ00gY29uc3QgKmNvbnN0IHBTYW1wbGVzLAorICAgIElOVF9QQ00gKmNvbnN0IHBPdXRwdXRTYW1wbGVzLCBJTlQgY29uc3QgblNhbXBsZXMsCisgICAgVUlOVCBjb25zdCBpc0lucHV0SW50ZXJsZWF2ZWQsIFVJTlQgY29uc3QgaW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCwKKyAgICBVSU5UICpjb25zdCBwblNhbXBsZXNGZWQpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKGhFbmMgPT0gTlVMTCkgfHwgKHBTYW1wbGVzID09IE5VTEwpIHx8IChwblNhbXBsZXNGZWQgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIGlmIChuU2FtcGxlcyA9PSAwKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7IC8qIEZsdXNoaW5nIG5vdCBpbXBsZW1lbnRlZCAqLworICB9IGVsc2UgeworICAgIGludCBjaDsKKyAgICBjb25zdCBJTlQgbkNoSW4gPSBoRW5jLT5uSW5wdXRDaGFubmVsczsKKyAgICBjb25zdCBJTlQgbkNoSW5XaXRoRG14ID0gbkNoSW47CisgICAgY29uc3QgSU5UIHNhbXBsZXNUb0ZlZWQgPQorICAgICAgICBGREttaW4oblNhbXBsZXMsIGhFbmMtPm5TYW1wbGVzTmV4dCAtIGhFbmMtPm5TYW1wbGVzVmFsaWQpOworICAgIGNvbnN0IElOVCBuU2FtcGxlc1BlckNoYW5uZWwgPSBzYW1wbGVzVG9GZWVkIC8gbkNoSW5XaXRoRG14OworCisgICAgaWYgKChzYW1wbGVzVG9GZWVkIDwgMCkgfHwgKHNhbXBsZXNUb0ZlZWQgJSBuQ2hJbldpdGhEbXggIT0gMCkgfHwKKyAgICAgICAgKHNhbXBsZXNUb0ZlZWQgPiBuQ2hJbldpdGhEbXggKiAoSU5UKWhFbmMtPm5GcmFtZUxlbmd0aCkpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICBpbnQgaTsKKworICAgIGNvbnN0IElOVF9QQ00gKnBJbnB1dF9fRkRLOworICAgIGNvbnN0IElOVF9QQ00gKnBJbnB1dDJfX0ZESzsKKworICAgIHsgLyogbm8gZG14IGFsaWduID0gZGVmYXVsdCovCisgICAgICBwSW5wdXRfX0ZESyA9IHBTYW1wbGVzOworICAgICAgcElucHV0Ml9fRkRLID0gcFNhbXBsZXMgKyAoaEVuYy0+bklucHV0RGVsYXkgKiBuQ2hJbldpdGhEbXgpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBoRW5jLT5uSW5wdXRDaGFubmVsczsgaSsrKSB7CisgICAgICBoRW5jLT5zdGF0aWNUaW1lRG9tYWluRG14SW5TY2FsZVtpXSA9IGhFbmMtPnN0YXRpY0dhaW5TY2FsZTsKKyAgICB9CisKKyAgICAvKioqKiogICAgICAgIE4tY2hhbm5lbC1pbnB1dCAgICAgKioqKiovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoSW47IGNoKyspIHsKKyAgICAgIC8qIFdyaXRlIGRlbGF5ZWQgdGltZSBzaWduYWwgaW50byB0aW1lIHNpZ25hbCBidWZmZXIgKi8KKyAgICAgIEZES21lbWNweSgmKGhFbmMtPnBwVGltZVNpZ0luX19GREtbY2hdWzBdKSwKKyAgICAgICAgICAgICAgICAmKGhFbmMtPnBwVGltZVNpZ0RlbGF5SW5fX0ZES1tjaF1bMF0pLAorICAgICAgICAgICAgICAgIGhFbmMtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXkgKiBzaXplb2YoSU5UX1BDTSkpOworCisgICAgICBpZiAoaXNJbnB1dEludGVybGVhdmVkKSB7CisgICAgICAgIC8qIEFkZCB0aGUgbmV3IGZyYW1lIGRlLWludGVybGVhdmVkLiBBcHBseSBuU3Vycm91bmRBbmFseXNpc0J1ZmZlckRlbGF5LgorICAgICAgICAgKi8KKyAgICAgICAgRkRLbWVtY3B5X2ZsZXgoCisgICAgICAgICAgICAmKGhFbmMtPnBwVGltZVNpZ0luX19GREtbY2hdW2hFbmMtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXldKSwKKyAgICAgICAgICAgIDEsIHBJbnB1dF9fRkRLICsgY2gsIG5DaEluV2l0aERteCwgaEVuYy0+bklucHV0RGVsYXkpOworICAgICAgICBGREttZW1jcHlfZmxleCgKKyAgICAgICAgICAgICYoaEVuYy0+cHBUaW1lU2lnSW5fX0ZES1tjaF1baEVuYy0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXJEZWxheSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPm5JbnB1dERlbGF5XSksCisgICAgICAgICAgICAxLCBwSW5wdXQyX19GREsgKyBjaCwgbkNoSW5XaXRoRG14LAorICAgICAgICAgICAgblNhbXBsZXNQZXJDaGFubmVsIC0gaEVuYy0+bklucHV0RGVsYXkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSW5wdXQgaXMgYWxyZWFkeSBkZWludGVybGVhdmVkLCBqdXN0IGNvcHkgKi8KKyAgICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgICAgJihoRW5jLT5wcFRpbWVTaWdJbl9fRkRLW2NoXVtoRW5jLT5uU3Vycm91bmRBbmFseXNpc0J1ZmZlckRlbGF5XSksCisgICAgICAgICAgICBwSW5wdXRfX0ZESyArIGNoICogaW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCwKKyAgICAgICAgICAgIGhFbmMtPm5JbnB1dERlbGF5ICogc2l6ZW9mKElOVF9QQ00pKTsKKyAgICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgICAgJihoRW5jLT5wcFRpbWVTaWdJbl9fRkRLW2NoXVtoRW5jLT5uU3Vycm91bmRBbmFseXNpc0J1ZmZlckRlbGF5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVuYy0+bklucHV0RGVsYXldKSwKKyAgICAgICAgICAgIHBJbnB1dDJfX0ZESyArIGNoICogaW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCwKKyAgICAgICAgICAgIChuU2FtcGxlc1BlckNoYW5uZWwgLSBoRW5jLT5uSW5wdXREZWxheSkgKiBzaXplb2YoSU5UX1BDTSkpOworICAgICAgfQorCisgICAgICAvKiBVcGRhdGUgdGltZSBzaWduYWwgZGVsYXkgYnVmZmVyICovCisgICAgICBGREttZW1jcHkoJihoRW5jLT5wcFRpbWVTaWdEZWxheUluX19GREtbY2hdWzBdKSwKKyAgICAgICAgICAgICAgICAmKGhFbmMtPnBwVGltZVNpZ0luX19GREtbY2hdW2hFbmMtPm5GcmFtZUxlbmd0aF0pLAorICAgICAgICAgICAgICAgIGhFbmMtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXkgKiBzaXplb2YoSU5UX1BDTSkpOworICAgIH0gLyogZm9yIGNoICovCisKKyAgICAvKioqKiogICAgICBObyBBcmJpdHJhcnkgRG93bm1peCAgICAgICoqKioqLworICAgIC8qICJDcnVkZSBURCBEbXgiOiBUaW1lIERvbWFpbkRvd25taXggKyBOTyBBcmJpdHJhcnkgRG93bm1peCwgRGVsYXkgQWRkZWQgYXQKKyAgICAgKiBwT3V0cHV0QnVmZmVyICovCisgICAgaWYgKChoRW5jLT51c2VUaW1lRG9tRG93bm1peCA+IDApKSB7CisgICAgICBpZiAoKGhFbmMtPnVzZVRpbWVEb21Eb3dubWl4ID09IDEpIHx8IChoRW5jLT5uSW5wdXRDaGFubmVscyAhPSAyKSkgeworICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZW5oYW5jZWQgdGltZSBkb21haW4gZG93bm1peCAoZm9yIHN0ZXJlbyBpbnB1dCkgKi8KKyAgICAgICAgaWYgKGhFbmMtPmVuY01vZGUgPT0gU0FDRU5DXzIxMikgeworICAgICAgICAgIGlmIChwT3V0cHV0U2FtcGxlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmZGtfc2FjZW5jX2FwcGx5X2VuaGFuY2VkVGltZURvbWFpbkRteCgKKyAgICAgICAgICAgICAgaEVuYy0+aEVuaGFuY2VkVGltZURteCwgaEVuYy0+cHBUaW1lU2lnSW5fX0ZESywgcE91dHB1dFNhbXBsZXMsCisgICAgICAgICAgICAgIGhFbmMtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICgmaEVuYy0+cHBUaW1lU2lnT3V0X19GREtbMF1bMF0gPT0gTlVMTCkgeworICAgICAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgfQorCisgICAgICAgICAgZmRrX3NhY2VuY19hcHBseV9lbmhhbmNlZFRpbWVEb21haW5EbXgoCisgICAgICAgICAgICAgIGhFbmMtPmhFbmhhbmNlZFRpbWVEbXgsIGhFbmMtPnBwVGltZVNpZ0luX19GREssCisgICAgICAgICAgICAgICZoRW5jLT5wcFRpbWVTaWdPdXRfX0ZES1swXVswXSwKKyAgICAgICAgICAgICAgaEVuYy0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXJEZWxheSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1cGRhdGUgbnVtYmVyIG9mIHNhbXBsZXMgc3RpbGwgdG8gcHJvY2VzcyAqLworICAgIGhFbmMtPm5TYW1wbGVzVmFsaWQgKz0gc2FtcGxlc1RvRmVlZDsKKworICAgIC8qcmV0dXJuIG51bWJlciBvZiBmZWQgc2FtcGxlcyAqLworICAgICpwblNhbXBsZXNGZWQgPSBzYW1wbGVzVG9GZWVkOworICB9CitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgRkRLX3NhY2VuY19lbmNvZGUoY29uc3QgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaE1wNFNwYWNlRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfYnVmRGVzY3IgKmluQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX2J1ZkRlc2NyICpvdXRCdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQUNFTkNfSW5BcmdzICppbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ0VOQ19PdXRBcmdzICpvdXRhcmdzKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgY29uc3QgSU5UX1BDTSAqcElucHV0U2FtcGxlcyA9CisgICAgICAoY29uc3QgSU5UX1BDTSAqKWluQnVmRGVzYy0+cHBCYXNlW2dldEJ1ZkRlc2NJZHgoCisgICAgICAgICAgaW5CdWZEZXNjLCAoRkRLX0JVRl9UWVBFX0lOUFVUIHwgRkRLX0JVRl9UWVBFX1BDTV9EQVRBKSldOworCisgIElOVF9QQ00gKmNvbnN0IHBPdXRwdXRTYW1wbGVzID0gKElOVF9QQ00gKilvdXRCdWZEZXNjLT5wcEJhc2VbZ2V0QnVmRGVzY0lkeCgKKyAgICAgIG91dEJ1ZkRlc2MsIChGREtfQlVGX1RZUEVfT1VUUFVUIHwgRkRLX0JVRl9UWVBFX1BDTV9EQVRBKSldOworCisgIGNvbnN0IGludCBuT3V0cHV0U2FtcGxlc0J1ZmZlclNpemUgPQorICAgICAgb3V0QnVmRGVzYy0+cEJ1ZlNpemVbZ2V0QnVmRGVzY0lkeCgKKyAgICAgICAgICBvdXRCdWZEZXNjLCAoRkRLX0JVRl9UWVBFX09VVFBVVCB8IEZES19CVUZfVFlQRV9QQ01fREFUQSkpXSAvCisgICAgICBvdXRCdWZEZXNjLT5wRWxlU2l6ZVtnZXRCdWZEZXNjSWR4KAorICAgICAgICAgIG91dEJ1ZkRlc2MsIChGREtfQlVGX1RZUEVfT1VUUFVUIHwgRkRLX0JVRl9UWVBFX1BDTV9EQVRBKSldOworCisgIGlmICgoaE1wNFNwYWNlRW5jID09IE5VTEwpIHx8IChwSW5wdXRTYW1wbGVzID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IG5PdXRwdXRTYW1wbGVzOworICAgIGludCBpLCBjaCwgcHMsIHdpbkNudCwgdHMsIHNsb3Q7CisgICAgSU5UIGN1cnJUcmFuc1BvcyA9IC0xOworICAgIFNQQVRJQUxGUkFNRSAqcEZyYW1lRGF0YSA9IE5VTEw7CisKKyAgICAvKiBJbXByb3ZlIENvZGUgUmVhZGFiaWxpdHkgKi8KKyAgICBjb25zdCBpbnQgbkNoSW4gPSBoTXA0U3BhY2VFbmMtPm5JbnB1dENoYW5uZWxzOworICAgIGNvbnN0IGludCBuQ2hJbldpdGhEbXggPSBuQ2hJbjsKKyAgICBjb25zdCBpbnQgbkNoT3V0ID0gaE1wNFNwYWNlRW5jLT5uT3V0cHV0Q2hhbm5lbHM7CisgICAgY29uc3QgaW50IG5TYW1wbGVzUGVyQ2hhbm5lbCA9IGluYXJncy0+bklucHV0U2FtcGxlcyAvIG5DaEluV2l0aERteDsKKyAgICBjb25zdCBpbnQgbk91dHB1dFNhbXBsZXNNYXggPSBuU2FtcGxlc1BlckNoYW5uZWwgKiBuQ2hPdXQ7CisgICAgY29uc3QgaW50IG5GcmFtZVRpbWVTbG90cyA9IGhNcDRTcGFjZUVuYy0+bkZyYW1lVGltZVNsb3RzOworCisgICAgSU5UIGVuY29kZXJJbnB1dENoU2NhbGVbU0FDRU5DX01BWF9JTlBVVF9DSEFOTkVMU107CisgICAgSU5UIG5GcmFtZVRpbWVTbG90c1JlZHVjdGlvbiA9IDA7CisKKyAgICBpZiAoaE1wNFNwYWNlRW5jLT5lbmNNb2RlID09IFNBQ0VOQ18yMTIpIHsKKyAgICAgIG5GcmFtZVRpbWVTbG90c1JlZHVjdGlvbiA9IGhNcDRTcGFjZUVuYy0+bkZyYW1lVGltZVNsb3RzID4+IDE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5DaEluOyBpKyspCisgICAgICBlbmNvZGVySW5wdXRDaFNjYWxlW2ldID0gaE1wNFNwYWNlRW5jLT5wRW5jb2RlcklucHV0Q2hTY2FsZVtpXTsKKworICAgIC8qIFNhbml0eSBDaGVjayAqLworICAgIGlmICgoMCAhPSBpbmFyZ3MtPm5JbnB1dFNhbXBsZXMgJSBuQ2hJbldpdGhEbXgpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldCBGcmFtZSBEYXRhIEhhbmRsZS4KKyAgICAgKi8KKworICAgIC8qIGdldCBiaXRzdHJlYW0gaGFuZGxlIChmb3Igc3RvcmFnZSBvZiBjbGQncywgaWNjJ3MgYW5kIHNvIG9uKQorICAgICAqIGdldCBzcGF0aWFsZnJhbWUgMiBmcmFtZXMgaW4gdGhlIGZ1dHVyZTsgTk9URTogdGhpcyBpcyBuZWNlc3NhcnkgdG8KKyAgICAgKiBzeW5jaHJvbmlzZSBzcGF0aWFsIGRhdGEgYW5kIGF1ZGlvIGRhdGEgKi8KKyAgICBpZiAoTlVMTCA9PSAocEZyYW1lRGF0YSA9IGZka19zYWNlbmNfZ2V0U3BhdGlhbEZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5oQml0c3RyZWFtRm9ybWF0dGVyLCBXUklURV9TUEFUSUFMRlJBTUUpKSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogSW5kZXBlbmRlbnQgRnJhbWVzIENvdW50ZXJzKi8KKyAgICBpZiAoaE1wNFNwYWNlRW5jLT5uRGlzY2FyZE91dEZyYW1lcyA+CisgICAgICAgIDApIHsgLyogSW5kZXBlbmRlbnQgRnJhbWVzIGlmIHRoZXkgc2hvdWxkIGJlIGRpc2NhcmRlZCwgUmVzZXQgQ291bnRlciovCisgICAgICBoTXA0U3BhY2VFbmMtPmluZGVwZW5kZW5jeUNvdW50ID0KKyAgICAgICAgICAwOyAvKiBSZXNldCB0aGUgY291bnRlciwgZmlyc3QgdmFsaWQgZnJhbWUgaXMgYW4gaW5kZXBlbmRlbnQgb25lKi8KKyAgICAgIGhNcDRTcGFjZUVuYy0+aW5kZXBlbmRlbmN5RmxhZyA9IDE7CisgICAgfSBlbHNlIHsgLypoTXA0U3BhY2VFbmMtPm5EaXNjYXJkT3V0RnJhbWVzID09IDAqLworICAgICAgaE1wNFNwYWNlRW5jLT5pbmRlcGVuZGVuY3lGbGFnID0KKyAgICAgICAgICAoaE1wNFNwYWNlRW5jLT5pbmRlcGVuZGVuY3lDb3VudCA9PSAwKSA/IDEgOiAwOworICAgICAgaWYgKGhNcDRTcGFjZUVuYy0+aW5kZXBlbmRlbmN5RmFjdG9yID4gMCkgeworICAgICAgICBoTXA0U3BhY2VFbmMtPmluZGVwZW5kZW5jeUNvdW50Kys7CisgICAgICAgIGhNcDRTcGFjZUVuYy0+aW5kZXBlbmRlbmN5Q291bnQgPQorICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5pbmRlcGVuZGVuY3lDb3VudCAlCisgICAgICAgICAgICAoKGludCloTXA0U3BhY2VFbmMtPmluZGVwZW5kZW5jeUZhY3Rvcik7CisgICAgICB9IGVsc2UgeyAvKiBpbmRlcGVuZGVuY3lGYWN0b3IgPT0gMCAqLworICAgICAgICBoTXA0U3BhY2VFbmMtPmluZGVwZW5kZW5jeUNvdW50ID0gLTE7CisgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaW1lIHNpZ25hbCBwcmVwcm9jZXNzaW5nOgorICAgICAqIC0gRmVlZCBpbnB1dCBidWZmZXIKKyAgICAgKiAtIFByZXNjYWxlIHRpbWUgc2lnbmFsCisgICAgICogLSBBcHBseSBEQyBmaWx0ZXIgb24gaW5wdXQgc2lnbmFsCisgICAgICovCisKKyAgICAvKiBGZWVkLCBEZWludGVybGVhdmUsIFByZS1TY2FsZSB0aGUgaW5wdXQgdGltZSBzaWduYWxzICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAoZXJyb3IgPSBfX0ZlZWREZWludGVyUHJlU2NhbGUoCisgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLCBwSW5wdXRTYW1wbGVzLCBwT3V0cHV0U2FtcGxlcywgaW5hcmdzLT5uSW5wdXRTYW1wbGVzLAorICAgICAgICAgICAgIGluYXJncy0+aXNJbnB1dEludGVybGVhdmVkLCBpbmFyZ3MtPmlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWwsCisgICAgICAgICAgICAgJm91dGFyZ3MtPm5TYW1wbGVzQ29uc3VtZWQpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChoTXA0U3BhY2VFbmMtPm5TYW1wbGVzTmV4dCAhPSBoTXA0U3BhY2VFbmMtPm5TYW1wbGVzVmFsaWQpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChoTXA0U3BhY2VFbmMtPmVuY01vZGUgPT0gU0FDRU5DXzIxMiAmJgorICAgICAgICBoTXA0U3BhY2VFbmMtPmJFbmNNb2RlXzIxMl9vbmx5KSB7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hJbjsgY2grKykgeworICAgICAgICBmb3IgKHNsb3QgPSAwOyBzbG90IDwgbkZyYW1lVGltZVNsb3RzOyBzbG90KyspIHsKKyAgICAgICAgICBzZXRDcGx4VmVjKAorICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPnBwcEh5YnJpZEluX19GREsKKyAgICAgICAgICAgICAgICAgIFtjaF1baE1wNFNwYWNlRW5jLT5uVXBkYXRlSHlicmlkUG9zaXRpb25UaW1lU2xvdHMgKworICAgICAgICAgICAgICAgICAgICAgICBuRnJhbWVUaW1lU2xvdHMgLSBuRnJhbWVUaW1lU2xvdHNSZWR1Y3Rpb24gKyBzbG90XSwKKyAgICAgICAgICAgICAgKEZJWFBfREJMKTAsIGhNcDRTcGFjZUVuYy0+bkh5YnJpZEJhbmRzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVGltZSAvIEZyZXF1ZW5jeToKKyAgICAgKiAtIFQvRiBhdWRpbyBpbnB1dCBjaGFubmVscworICAgICAqIC0gVC9GIGFyYml0cmFyeSBkb3dubWl4IGlucHV0IGNoYW5uZWxzCisgICAgICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoSW47IGNoKyspIHsKKyAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocFFtZkluUmVhbCwgRklYUF9EQkwsIE1BWF9RTUZfQkFORFMpCisgICAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHBRbWZJbkltYWcsIEZJWFBfREJMLCBNQVhfUU1GX0JBTkRTKQorICAgICAgRklYUF9HQUlOICpwUHJlR2FpbiA9CisgICAgICAgICAgZmRrX3NhY2VuY19nZXRQcmVHYWluUHRyRkRLKGhNcDRTcGFjZUVuYy0+aFN0YXRpY0dhaW4pOworCisgICAgICBmb3IgKHRzID0gMDsgdHMgPCBuRnJhbWVUaW1lU2xvdHM7IHRzKyspIHsKKyAgICAgICAgRklYUF9EQkwgKnBTcGVjUmVhbDsKKyAgICAgICAgRklYUF9EQkwgKnBTcGVjSW1hZzsKKworICAgICAgICBJTlRfUENNICpwVGltZUluID0KKyAgICAgICAgICAgICZoTXA0U3BhY2VFbmMtPnBwVGltZVNpZ0luX19GREtbY2hdWyh0cyAqIGhNcDRTcGFjZUVuYy0+blFtZkJhbmRzKV07CisKKyAgICAgICAgeworICAgICAgICAgIC8qIEFwcGx5IERDIGZpbHRlciBvbiBpbnB1dCBjaGFubmVscyAqLworICAgICAgICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19hcHBseURDRmlsdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPnBoRENGaWx0ZXJTaWdJbltjaF0sIHBUaW1lSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lSW4sIGhNcDRTcGFjZUVuYy0+blFtZkJhbmRzKSkpIHsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBRTUYgZmlsdGVyYmFuayAqLworICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAoTUFYX1FNRl9CQU5EUyA8PCAxKSk7CisKKyAgICAgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KGhNcDRTcGFjZUVuYy0+cGhRbWZGaWx0SW5fX0ZES1tjaF0sIHBRbWZJblJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW5JbWFnLCBwVGltZUluLCAxLCBwV29ya0J1ZmZlcik7CisKKyAgICAgICAgQ19BTExPQ19TQ1JBVENIX0VORChwV29ya0J1ZmZlciwgRklYUF9EQkwsIChNQVhfUU1GX0JBTkRTIDw8IDEpKTsKKworICAgICAgICBwU3BlY1JlYWwgPSBwUW1mSW5SZWFsOworICAgICAgICBwU3BlY0ltYWcgPSBwUW1mSW5JbWFnOworCisgICAgICAgIC8qIEFwcGx5IHByZS1zY2FsZSBhZnRlciBmaWx0ZXJiYW5rICovCisgICAgICAgIGlmIChNQVhWQUxfR0FJTiAhPSBwUHJlR2FpbltjaF0pIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaE1wNFNwYWNlRW5jLT5uSHlicmlkQmFuZHM7IGkrKykgeworICAgICAgICAgICAgaE1wNFNwYWNlRW5jCisgICAgICAgICAgICAgICAgLT5wcHBIeWJyaWRJbl9fRkRLW2NoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoTXA0U3BhY2VFbmMtPm5BbmFseXNpc0xvb2thaGVhZFRpbWVTbG90cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzXVtpXQorICAgICAgICAgICAgICAgIC52LnJlID0gZk11bHQocFNwZWNSZWFsW2ldLCBwUHJlR2FpbltjaF0pOworICAgICAgICAgICAgaE1wNFNwYWNlRW5jCisgICAgICAgICAgICAgICAgLT5wcHBIeWJyaWRJbl9fRkRLW2NoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoTXA0U3BhY2VFbmMtPm5BbmFseXNpc0xvb2thaGVhZFRpbWVTbG90cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzXVtpXQorICAgICAgICAgICAgICAgIC52LmltID0gZk11bHQocFNwZWNJbWFnW2ldLCBwUHJlR2FpbltjaF0pOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaE1wNFNwYWNlRW5jLT5uSHlicmlkQmFuZHM7IGkrKykgeworICAgICAgICAgICAgaE1wNFNwYWNlRW5jCisgICAgICAgICAgICAgICAgLT5wcHBIeWJyaWRJbl9fRkRLW2NoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoTXA0U3BhY2VFbmMtPm5BbmFseXNpc0xvb2thaGVhZFRpbWVTbG90cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzXVtpXQorICAgICAgICAgICAgICAgIC52LnJlID0gcFNwZWNSZWFsW2ldOworICAgICAgICAgICAgaE1wNFNwYWNlRW5jCisgICAgICAgICAgICAgICAgLT5wcHBIeWJyaWRJbl9fRkRLW2NoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoTXA0U3BhY2VFbmMtPm5BbmFseXNpc0xvb2thaGVhZFRpbWVTbG90cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzXVtpXQorICAgICAgICAgICAgICAgIC52LmltID0gcFNwZWNJbWFnW2ldOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSAvKiB0cyAqLworICAgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocFFtZkluSW1hZywgRklYUF9EQkwsIE1BWF9RTUZfQkFORFMpCisgICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChwUW1mSW5SZWFsLCBGSVhQX0RCTCwgTUFYX1FNRl9CQU5EUykKKworICAgICAgaWYgKFNBQ0VOQ19PSyAhPSBlcnJvcikgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfSAvKiBjaCAqLworCisgICAgaWYgKGhNcDRTcGFjZUVuYy0+ZW5jTW9kZSA9PSBTQUNFTkNfMjEyICYmCisgICAgICAgIGhNcDRTcGFjZUVuYy0+YkVuY01vZGVfMjEyX29ubHkpIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaEluOyBjaCsrKSB7CisgICAgICAgIGZvciAoc2xvdCA9IDA7CisgICAgICAgICAgICAgc2xvdCA8IChpbnQpKGhNcDRTcGFjZUVuYy0+blVwZGF0ZUh5YnJpZFBvc2l0aW9uVGltZVNsb3RzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbkZyYW1lVGltZVNsb3RzIC0gbkZyYW1lVGltZVNsb3RzUmVkdWN0aW9uKTsKKyAgICAgICAgICAgICBzbG90KyspIHsKKyAgICAgICAgICBjb3B5Q3BseFZlYyhoTXA0U3BhY2VFbmMtPnBwcEh5YnJpZEluX19GREtbY2hdW3Nsb3RdLAorICAgICAgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cHBwSHlicmlkSW5TdGF0aWNfX0ZES1tjaF1bc2xvdF0sCisgICAgICAgICAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5uSHlicmlkQmFuZHMpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hJbjsgY2grKykgeworICAgICAgICBmb3IgKHNsb3QgPSAwOworICAgICAgICAgICAgIHNsb3QgPCAoaW50KShoTXA0U3BhY2VFbmMtPm5VcGRhdGVIeWJyaWRQb3NpdGlvblRpbWVTbG90cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5GcmFtZVRpbWVTbG90cyAtIG5GcmFtZVRpbWVTbG90c1JlZHVjdGlvbik7CisgICAgICAgICAgICAgc2xvdCsrKSB7CisgICAgICAgICAgY29weUNwbHhWZWMoCisgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cHBwSHlicmlkSW5TdGF0aWNfX0ZES1tjaF1bc2xvdF0sCisgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cHBwSHlicmlkSW5fX0ZES1tjaF1bbkZyYW1lVGltZVNsb3RzICsgc2xvdF0sCisgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+bkh5YnJpZEJhbmRzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogT25zZXQgRGV0ZWN0aW9uOgorICAgICAqIC0gZGV0ZWN0aW9uIG9mIHRyYW5zaWVudHMKKyAgICAgKiAtIGJ1aWxkIGZyYW1pbmcKKyAgICAgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hJbjsgY2grKykgeworICAgICAgaWYgKGNoICE9IDMpIHsgLyogIUxGRSAqLworICAgICAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgICAgICAoZXJyb3IgPSBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X0FwcGx5KAorICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPnBoT25zZXRbY2hdLCBuRnJhbWVUaW1lU2xvdHMsCisgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+bkh5YnJpZEJhbmRzLAorICAgICAgICAgICAgICAgICAmaE1wNFNwYWNlRW5jLT5wcHBIeWJyaWRJbl9fRkRLCisgICAgICAgICAgICAgICAgICAgICAgW2NoXVtoTXA0U3BhY2VFbmMtPm5BbmFseXNpc0xvb2thaGVhZFRpbWVTbG90c10sCisgICAgICAgICAgICAgICAgIGVuY29kZXJJbnB1dENoU2NhbGVbY2hdLAorICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPnRyUHJldlBvc1sxXSwgLyogY29udGFpbnMgcHJldmlvdXMgVHJhbnNpZW50ICovCisgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cHBUckN1cnJQb3NbY2hdKSkpIHsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKDEpICYmIChoTXA0U3BhY2VFbmMtPnVzZUZyYW1lS2VlcCA9PSAwKSkgeworICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cHBUckN1cnJQb3NbY2hdWzBdID0gLTE7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIGZpcnN0IFRyYW5zaWVudCBQb3NpdGlvbiAqLworICAgICAgICBpZiAoKGhNcDRTcGFjZUVuYy0+cHBUckN1cnJQb3NbY2hdWzBdID49IDApICYmCisgICAgICAgICAgICAoKGN1cnJUcmFuc1BvcyA8IDApIHx8CisgICAgICAgICAgICAgKGhNcDRTcGFjZUVuYy0+cHBUckN1cnJQb3NbY2hdWzBdIDwgY3VyclRyYW5zUG9zKSkpIHsKKyAgICAgICAgICBjdXJyVHJhbnNQb3MgPSBoTXA0U3BhY2VFbmMtPnBwVHJDdXJyUG9zW2NoXVswXTsKKyAgICAgICAgfQorICAgICAgfSAvKiAhTEZFICovCisgICAgfSAgIC8qIGNoICovCisKKyAgICBpZiAoaE1wNFNwYWNlRW5jLT51c2VGcmFtZUtlZXAgPT0gMSkgeworICAgICAgaWYgKChjdXJyVHJhbnNQb3MgIT0gLTEpIHx8IChoTXA0U3BhY2VFbmMtPmluZGVwZW5kZW5jeUZsYWcgPT0gMSkpIHsKKyAgICAgICAgaE1wNFNwYWNlRW5jLT5hdm9pZF9rZWVwID0gTlVNX0tFRVBfV0lORE9XUzsKKyAgICAgICAgY3VyclRyYW5zUG9zID0gLTE7CisgICAgICB9CisgICAgfQorCisgICAgLyogU2F2ZSBwcmV2aW91cyBUcmFuc2llbnQgUG9zaXRpb24gKi8KKyAgICBoTXA0U3BhY2VFbmMtPnRyUHJldlBvc1swXSA9CisgICAgICAgIEZES21heCgtMSwgaE1wNFNwYWNlRW5jLT50clByZXZQb3NbMV0gLSAoSU5UKW5GcmFtZVRpbWVTbG90cyk7CisgICAgaE1wNFNwYWNlRW5jLT50clByZXZQb3NbMV0gPSBjdXJyVHJhbnNQb3M7CisKKyAgICAvKiBVcGRhdGUgT25zZXQgRGV0ZWN0aW9uIEVuZXJneSBCdWZmZXIgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hJbjsgY2grKykgeworICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X1VwZGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPnBoT25zZXRbY2hdLCBuRnJhbWVUaW1lU2xvdHMpKSkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorCisgICAgLyogRnJhbWluZyAqLworICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgKGVycm9yID0gZmRrX3NhY2VuY19mcmFtZVdpbmRvd19HZXRXaW5kb3coCisgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5oRnJhbWVXaW5kb3csIGhNcDRTcGFjZUVuYy0+dHJQcmV2UG9zLAorICAgICAgICAgICAgIG5GcmFtZVRpbWVTbG90cywgJnBGcmFtZURhdGEtPmZyYW1pbmdJbmZvLAorICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cEZyYW1lV2luZG93QW5hX19GREssICZoTXA0U3BhY2VFbmMtPmZyYW1lV2luTGlzdCwKKyAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPmF2b2lkX2tlZXApKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qCisgICAgICogTVBTIFByb2Nlc3Npbmc6CisgICAgICovCisgICAgZm9yIChwcyA9IDAsIHdpbkNudCA9IDA7IHBzIDwgaE1wNFNwYWNlRW5jLT5mcmFtZVdpbkxpc3QubjsgKytwcykgeworICAgICAgLyogQW5hbHlzaXMgV2luZG93aW5nICovCisgICAgICBpZiAoaE1wNFNwYWNlRW5jLT5mcmFtZVdpbkxpc3QuZGF0W3BzXS5ob2xkID09IEZXX0hPTEQpIHsKKyAgICAgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyAgICAgICAgLyogT05MWSBDT1BZIEFORCBIT0xEIFBSRVZJT1VTIFBBUkFNRVRFUlMgKi8KKyAgICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX2R1cGxpY2F0ZVBhcmFtZXRlclNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoTXA0U3BhY2VFbmMtPnNhdmVGcmFtZSwgMCwgcEZyYW1lRGF0YSwgcHMpKSkgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorCisgICAgICB9IGVsc2UgeyAvKiAhRldfSE9MRCAqLworICAgICAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworICAgICAgICAvKiBORVcgV0lORE9XICovCisKKyAgICAgICAgSU5UIG5BbmFseXNpc0xlbmd0aFRpbWVTbG90cywgYW5hbHlzaXNTdGFydFRpbWVTbG90OworCisgICAgICAgIG5BbmFseXNpc0xlbmd0aFRpbWVTbG90cyA9IGdldEFuYWx5c2lzTGVuZ3RoVGltZVNsb3RzKAorICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5wRnJhbWVXaW5kb3dBbmFfX0ZES1t3aW5DbnRdLAorICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5uQW5hbHlzaXNMZW5ndGhUaW1lU2xvdHMpOworCisgICAgICAgIGFuYWx5c2lzU3RhcnRUaW1lU2xvdCA9CisgICAgICAgICAgICBnZXRBbmFseXNpc1N0YXJ0VGltZVNsb3QoaE1wNFNwYWNlRW5jLT5wRnJhbWVXaW5kb3dBbmFfX0ZES1t3aW5DbnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+bkFuYWx5c2lzTGVuZ3RoVGltZVNsb3RzKTsKKworICAgICAgICAvKiBwZXJmb3JtIG1haW4gc2lnbmFsIGFuYWx5c2lzIHdpbmRvd2luZyBpbgorICAgICAgICAgKiBmZGtfc2FjZW5jX3NwYWNlVHJlZV9BcHBseSgpICovCisgICAgICAgIEZJWFBfV0lOICpwRnJhbWVXaW5kb3dBbmFfX0ZESyA9CisgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPnBGcmFtZVdpbmRvd0FuYV9fRkRLW3dpbkNudF07CisgICAgICAgIEZJWFBfRFBLICoqKnBwcEh5YnJpZEluX19GREsgPSBoTXA0U3BhY2VFbmMtPnBwcEh5YnJpZEluX19GREs7CisgICAgICAgIEZJWFBfRFBLICoqKnBwcFByb2NEYXRhSW5fX0ZESyA9IGhNcDRTcGFjZUVuYy0+cHBwUHJvY0RhdGFJbl9fRkRLOworCisgICAgICAgIGlmIChoTXA0U3BhY2VFbmMtPmVuY01vZGUgPT0gU0FDRU5DXzIxMiAmJgorICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5iRW5jTW9kZV8yMTJfb25seSkgeworICAgICAgICAgIHBwcFByb2NEYXRhSW5fX0ZESyA9IHBwcEh5YnJpZEluX19GREs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgICAgICAoZXJyb3IgPSBmZGtfc2FjZW5jX3NwYWNlVHJlZV9BcHBseSgKKyAgICAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5oU3BhY2VUcmVlLCBwcywgbkNoSW4sIG5BbmFseXNpc0xlbmd0aFRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgYW5hbHlzaXNTdGFydFRpbWVTbG90LCBoTXA0U3BhY2VFbmMtPm5IeWJyaWRCYW5kcywKKyAgICAgICAgICAgICAgICAgcEZyYW1lV2luZG93QW5hX19GREssIHBwcEh5YnJpZEluX19GREssCisgICAgICAgICAgICAgICAgIHBwcFByb2NEYXRhSW5fX0ZESywgLyogbXVsdGktY2hhbm5lbCBpbnB1dCAqLworICAgICAgICAgICAgICAgICBwRnJhbWVEYXRhLCBoTXA0U3BhY2VFbmMtPmF2b2lkX2tlZXAsIGVuY29kZXJJbnB1dENoU2NhbGUpKSkgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNhdmUgc3BhdGlhbCBmcmFtZSBmb3IgcG90ZW50aWFsIGhvbGQgcGFyYW1ldGVyIHNldCAqLworICAgICAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfZHVwbGljYXRlUGFyYW1ldGVyU2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lRGF0YSwgcHMsICZoTXA0U3BhY2VFbmMtPnNhdmVGcmFtZSwgMCkpKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisKKyAgICAgICAgKyt3aW5DbnQ7CisgICAgICB9CisgICAgICBpZiAoaE1wNFNwYWNlRW5jLT5hdm9pZF9rZWVwID4gMCkgeworICAgICAgICBoTXA0U3BhY2VFbmMtPmF2b2lkX2tlZXAtLTsKKyAgICAgIH0KKyAgICB9IC8qIExvb3Agb3ZlciBQYXJhbWV0ZXIgU2V0cyAqLworICAgIC8qIC0tLS0gRW5kIG9mIFByb2Nlc3NpbmcgTG9vcCAtLS0tICovCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBoeWJyaWRJblJlYWwvSW1hZyBidWZmZXIgYW5kIGRvIHRoZSBzYW1lIGZvciBhcmJEbXgKKyAgICAgKiB0aGlzIG1lYW5zIHRvIG1vdmUgdGhlIGh5YnJpZCBkYXRhIG9mIHRoZSBjdXJyZW50IGZyYW1lIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgKiBvZiB0aGUgMipuRnJhbWVMZW5ndGgtbG9uZyBidWZmZXIKKyAgICAgKi8KKyAgICBpZiAoIShoTXA0U3BhY2VFbmMtPmVuY01vZGUgPT0gU0FDRU5DXzIxMiAmJgorICAgICAgICAgIGhNcDRTcGFjZUVuYy0+YkVuY01vZGVfMjEyX29ubHkpKSB7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hJbjsgY2grKykgeyAvKiBmb3IgYXV0b21hdGljIGRvd25taXggKi8KKyAgICAgICAgZm9yIChzbG90ID0gMDsKKyAgICAgICAgICAgICBzbG90IDwgKGludCkoaE1wNFNwYWNlRW5jLT5uVXBkYXRlSHlicmlkUG9zaXRpb25UaW1lU2xvdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICBuRnJhbWVUaW1lU2xvdHMgLSBuRnJhbWVUaW1lU2xvdHNSZWR1Y3Rpb24pOworICAgICAgICAgICAgIHNsb3QrKykgeworICAgICAgICAgIGNvcHlDcGx4VmVjKAorICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPnBwcEh5YnJpZEluX19GREtbY2hdW3Nsb3RdLAorICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPnBwcEh5YnJpZEluX19GREtbY2hdW25GcmFtZVRpbWVTbG90cyArIHNsb3RdLAorICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPm5IeWJyaWRCYW5kcyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzbG90ID0gMDsgc2xvdCA8IG5GcmFtZVRpbWVTbG90czsgc2xvdCsrKSB7CisgICAgICAgICAgc2V0Q3BseFZlYygKKyAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5wcHBIeWJyaWRJbl9fRkRLCisgICAgICAgICAgICAgICAgICBbY2hdW2hNcDRTcGFjZUVuYy0+blVwZGF0ZUh5YnJpZFBvc2l0aW9uVGltZVNsb3RzICsKKyAgICAgICAgICAgICAgICAgICAgICAgbkZyYW1lVGltZVNsb3RzIC0gbkZyYW1lVGltZVNsb3RzUmVkdWN0aW9uICsgc2xvdF0sCisgICAgICAgICAgICAgIChGSVhQX0RCTCkwLCBoTXA0U3BhY2VFbmMtPm5IeWJyaWRCYW5kcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLyoKKyAgICAgKiBTcGF0aWFsIFRvbmFsaXR5OgorICAgICAqLworICAgIHsKKyAgICAgIC8qIFNtb290aCBjb25maWcgb2ZmLiAqLworICAgICAgRkRLbWVtY2xlYXIoJnBGcmFtZURhdGEtPnNtZ0RhdGEsIHNpemVvZihwRnJhbWVEYXRhLT5zbWdEYXRhKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDcmVhdGUgYml0c3RyZWFtCisgICAgICogLSBjb250cm9sIGluZGVwZW5kZWN5IGZsYWcKKyAgICAgKiAtIHdyaXRlIHNwYXRpYWwgZnJhbWUKKyAgICAgKiAtIHJldHVybiBiaXRzdHJlYW0KKyAgICAgKi8KKyAgICBVQ0hBUiAqcEJpdHN0cmVhbURlbGF5QnVmZmVyOworCisgICAgaWYgKGhNcDRTcGFjZUVuYy0+ZW5jTW9kZSA9PSBTQUNFTkNfMjEyKSB7CisgICAgICAvKiBubyBiaXRzdHJlYW0gZGVsYXkgYnVmZmVyIGZvciBTQUNFTkNfMjEyIG1vZGUsIHdyaXRlIGJpdHN0cmVhbSBkaXJlY3RseQorICAgICAgICogaW50byB0aGUgc2FjT3V0QnVmZmVyIGJ1ZmZlciB3aGljaCBpcyBwcm92aWRlZCBieSB0aGUgY29yZSByb3V0aW5lICovCisgICAgICBwQml0c3RyZWFtRGVsYXlCdWZmZXIgPSAoVUNIQVIgKilvdXRCdWZEZXNjLT5wcEJhc2VbMV07CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGJpdHN0cmVhbSBkZWxheSBpcyBoYW5kbGVkIGluIHBwQml0c3RyZWFtRGVsYXlCdWZmZXIgYnVmZmVyICovCisgICAgICBwQml0c3RyZWFtRGVsYXlCdWZmZXIgPQorICAgICAgICAgIGhNcDRTcGFjZUVuYworICAgICAgICAgICAgICAtPnBwQml0c3RyZWFtRGVsYXlCdWZmZXJbaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtQnVmZmVyV3JpdGVdOworICAgIH0KKyAgICBpZiAocEJpdHN0cmVhbURlbGF5QnVmZmVyID09IE5VTEwpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIHBGcmFtZURhdGEtPmJzSW5kZXBlbmRlbmN5RmxhZyA9IGhNcDRTcGFjZUVuYy0+aW5kZXBlbmRlbmN5RmxhZzsKKworICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgKGVycm9yID0gZmRrX3NhY2VuY193cml0ZVNwYXRpYWxGcmFtZSgKKyAgICAgICAgICAgICBwQml0c3RyZWFtRGVsYXlCdWZmZXIsIE1BWF9NUEVHU19CWVRFUywKKyAgICAgICAgICAgICAmaE1wNFNwYWNlRW5jLT5wbk91dHB1dEJpdHNbaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtQnVmZmVyV3JpdGVdLAorICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+aEJpdHN0cmVhbUZvcm1hdHRlcikpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogcmV0dXJuIGJpdHN0cmVhbSBpbmZvICovCisgICAgaWYgKChoTXA0U3BhY2VFbmMtPm5EaXNjYXJkT3V0RnJhbWVzID09IDApICYmCisgICAgICAgIChnZXRCdWZEZXNjSWR4KG91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgIChGREtfQlVGX1RZUEVfT1VUUFVUIHwgRkRLX0JVRl9UWVBFX0JTX0RBVEEpKSAhPSAtMSkpIHsKKyAgICAgIGNvbnN0IElOVCBpZHggPSBnZXRCdWZEZXNjSWR4KAorICAgICAgICAgIG91dEJ1ZkRlc2MsIChGREtfQlVGX1RZUEVfT1VUUFVUIHwgRkRLX0JVRl9UWVBFX0JTX0RBVEEpKTsKKyAgICAgIGNvbnN0IElOVCBvdXRCaXRzID0KKyAgICAgICAgICBoTXA0U3BhY2VFbmMtPnBuT3V0cHV0Qml0c1toTXA0U3BhY2VFbmMtPm5CaXRzdHJlYW1CdWZmZXJSZWFkXTsKKworICAgICAgaWYgKCgob3V0Qml0cyArIDcpIC8gOCkgPgorICAgICAgICAgIChJTlQpKG91dEJ1ZkRlc2MtPnBCdWZTaXplW2lkeF0gLyBvdXRCdWZEZXNjLT5wRWxlU2l6ZVtpZHhdKSkgeworICAgICAgICBvdXRhcmdzLT5uT3V0cHV0Qml0cyA9IDA7CisgICAgICAgIGVycm9yID0gU0FDRU5DX0VOQ09ERV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICAvKiByZXR1cm4gYml0c3RyZWFtIGJ1ZmZlciwgY29weSBkZWxheWVkIGJpdHN0cmVhbSBmb3IgYWxsIGNvbmZpZ3VyYXRpb25zCisgICAgICAgKiBleGNlcHQgZm9yIHRoZSBTQUNFTkNfMjEyIG1vZGUgKi8KKyAgICAgIGlmIChoTXA0U3BhY2VFbmMtPmVuY01vZGUgIT0gU0FDRU5DXzIxMikgeworICAgICAgICBGREttZW1jcHkoCisgICAgICAgICAgICBvdXRCdWZEZXNjLT5wcEJhc2VbaWR4XSwKKyAgICAgICAgICAgIGhNcDRTcGFjZUVuYworICAgICAgICAgICAgICAgIC0+cHBCaXRzdHJlYW1EZWxheUJ1ZmZlcltoTXA0U3BhY2VFbmMtPm5CaXRzdHJlYW1CdWZmZXJSZWFkXSwKKyAgICAgICAgICAgIChvdXRCaXRzICsgNykgLyA4KTsKKyAgICAgIH0KKworICAgICAgLyogcmV0dXJuIG51bWJlciBvZiB2YWxpZCBiaXRzICovCisgICAgICBvdXRhcmdzLT5uT3V0cHV0Qml0cyA9IG91dEJpdHM7CisgICAgfSBlbHNlIHsgLyogTm8gc3BhdGlhbCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZCBpZiB0aGUgY3VycmVudCBmcmFtZSBpcyB0byBiZQorICAgICAgICAgICAgICAgIGRpc2NhcmRlZC4gKi8KKyAgICAgIG91dGFyZ3MtPm5PdXRwdXRCaXRzID0gMDsKKyAgICB9CisKKyAgICAvKiB1cGRhdGUgcG9pbnRlcnMgKi8KKyAgICBoTXA0U3BhY2VFbmMtPm5CaXRzdHJlYW1CdWZmZXJSZWFkID0KKyAgICAgICAgKGhNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbUJ1ZmZlclJlYWQgKyAxKSAlCisgICAgICAgIGhNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbURlbGF5QnVmZmVyOworICAgIGhNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbUJ1ZmZlcldyaXRlID0KKyAgICAgICAgKGhNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbUJ1ZmZlcldyaXRlICsgMSkgJQorICAgICAgICBoTXA0U3BhY2VFbmMtPm5CaXRzdHJlYW1EZWxheUJ1ZmZlcjsKKworICAgIC8qIFNldCBPdXRwdXQgUGFyYW1ldGVycyAqLworICAgIG5PdXRwdXRTYW1wbGVzID0KKyAgICAgICAgKGhNcDRTcGFjZUVuYy0+bkRpc2NhcmRPdXRGcmFtZXMgPT0gMCkKKyAgICAgICAgICAgID8gKG5PdXRwdXRTYW1wbGVzTWF4KQorICAgICAgICAgICAgOiAwOyAvKiBkb24ndCBvdXRwdXQgc2FtcGxlcyBpbiBjYXNlIGZyYW1lcyB0byBiZSBkaXNjYXJkZWQgKi8KKyAgICBpZiAobk91dHB1dFNhbXBsZXMgPiBuT3V0cHV0U2FtcGxlc0J1ZmZlclNpemUpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICBvdXRhcmdzLT5uT3V0cHV0U2FtcGxlcyA9IG5PdXRwdXRTYW1wbGVzOworCisgICAgeyAvKiAhYlFtZk91dHB1dCAqLworCisgICAgICBpZiAoaE1wNFNwYWNlRW5jLT5lbmNNb2RlICE9IFNBQ0VOQ18yMTIpIHsKKyAgICAgICAgLyogZGVsYXkgb3V0cHV0IHNhbXBsZXMgYW5kIGludGVybGVhdmUgdGhlbSAqLworICAgICAgICAvKiBub3RlOiBpbiBjYXNlIG9mIGFyYml0cmFyeSBkb3dubWl4IHRoaXMgd2lsbCBhbHdheXMgYmUgcHJvY2Vzc2VkLAorICAgICAgICAgKiBiZWNhdXNlIG5PdXRwdXRTYW1wbGVzICE9IDAsIGV2ZW4gaWYgYkRNWEFsaWduIGlzIHN3aXRjaGVkIG9uICovCisgICAgICAgIC8qIGFsd2F5cyBydW4gY29weS1mdW5jLCBzbyBuT3V0cHV0U2FtcGxlc01heCBpbnN0ZWFkIG9mIG5PdXRwdXRTYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hPdXQ7IGNoKyspIHsKKyAgICAgICAgICBGREttZW1jcHlfZmxleCgKKyAgICAgICAgICAgICAgJmhNcDRTcGFjZUVuYy0+cE91dHB1dERlbGF5QnVmZmVyX19GREsKKyAgICAgICAgICAgICAgICAgICBbY2ggKyAoaE1wNFNwYWNlRW5jLT5uT3V0cHV0QnVmZmVyRGVsYXkpICogbkNoT3V0XSwKKyAgICAgICAgICAgICAgbkNoT3V0LCBoTXA0U3BhY2VFbmMtPnBwVGltZVNpZ091dF9fRkRLW2NoXSwgMSwKKyAgICAgICAgICAgICAgbk91dHB1dFNhbXBsZXNNYXggLyBuQ2hPdXQpOworICAgICAgICB9CisKKyAgICAgICAgLyogd3JpdGUgZGVsYXllZCBkYXRhIGluIG91dHB1dCBwY20gc3RyZWFtICovCisgICAgICAgIC8qIGFsd2F5cyBjYWxjdWxhdGUsIGxpbWl0ZXIgbXVzdCBoYXZlIGEgbG9va2FoZWFkISEhICovCisgICAgICAgIEZES21lbWNweShwT3V0cHV0U2FtcGxlcywgaE1wNFNwYWNlRW5jLT5wT3V0cHV0RGVsYXlCdWZmZXJfX0ZESywKKyAgICAgICAgICAgICAgICAgIG5PdXRwdXRTYW1wbGVzTWF4ICogc2l6ZW9mKElOVF9QQ00pKTsKKworICAgICAgICAvKiB1cGRhdGUgZGVsYXkgYnVmZmVyIChtb3ZlIGJhY2sgZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcikgKi8KKyAgICAgICAgRkRLbWVtbW92ZSgKKyAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cE91dHB1dERlbGF5QnVmZmVyX19GREssCisgICAgICAgICAgICAmaE1wNFNwYWNlRW5jLT5wT3V0cHV0RGVsYXlCdWZmZXJfX0ZES1tuT3V0cHV0U2FtcGxlc01heF0sCisgICAgICAgICAgICBuQ2hPdXQgKiAoaE1wNFNwYWNlRW5jLT5uT3V0cHV0QnVmZmVyRGVsYXkpICogc2l6ZW9mKElOVF9QQ00pKTsKKyAgICAgIH0KKworICAgICAgaWYgKGhNcDRTcGFjZUVuYy0+dXNlVGltZURvbURvd25taXggPD0gMCkgeworICAgICAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfc3RhdGljUG9zdEdhaW5fQXBwbHlGREsoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPmhTdGF0aWNHYWluLCBwT3V0cHV0U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5PdXRwdXRTYW1wbGVzTWF4LCAwKSkpIHsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0gLyogIWJRbWZPdXRwdXQgKi8KKworICAgIGlmIChoTXA0U3BhY2VFbmMtPm5EaXNjYXJkT3V0RnJhbWVzID4gMCkgeworICAgICAgaE1wNFNwYWNlRW5jLT5uRGlzY2FyZE91dEZyYW1lcy0tOworICAgIH0KKworICAgIC8qIEludmFsaWRhdGUgSW5wdXQgQnVmZmVyICovCisgICAgaE1wNFNwYWNlRW5jLT5uU2FtcGxlc1ZhbGlkID0gMDsKKworICB9IC8qIHZhbGlkIGhhbmRsZSAqLworYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIEZES19zYWNlbmNfY2xvc2UoSEFORExFX01QNFNQQUNFX0VOQ09ERVIgKnBoTXA0U3BhY2VFbmMpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCAhPSBwaE1wNFNwYWNlRW5jKSB7CisgICAgaWYgKE5VTEwgIT0gKnBoTXA0U3BhY2VFbmMpIHsKKyAgICAgIGludCBjaCwgaTsKKyAgICAgIEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGNvbnN0IGhFbmMgPSAqcGhNcDRTcGFjZUVuYzsKKworICAgICAgaWYgKGhFbmMtPnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQgIT0gTlVMTCkgeworICAgICAgICBGREtfRlJFRV9NRU1PUllfMUQoaEVuYy0+cFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCk7CisgICAgICB9CisgICAgICAvKiBGcmVlIEFuYWx5c2lzIEZpbHRlcmJhbmsgU3RydWN0cyAqLworICAgICAgaWYgKGhFbmMtPnBFbmNvZGVySW5wdXRDaFNjYWxlICE9IE5VTEwpIHsKKyAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKGhFbmMtPnBFbmNvZGVySW5wdXRDaFNjYWxlKTsKKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5zdGF0aWNUaW1lRG9tYWluRG14SW5TY2FsZSAhPSBOVUxMKSB7CisgICAgICAgIEZES19GUkVFX01FTU9SWV8xRChoRW5jLT5zdGF0aWNUaW1lRG9tYWluRG14SW5TY2FsZSk7CisgICAgICB9CisgICAgICBpZiAoaEVuYy0+cGhRbWZGaWx0SW5fX0ZESyAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGhFbmMtPnNldHVwLm1heENoSW47IGNoKyspIHsKKyAgICAgICAgICBpZiAoaEVuYy0+cGhRbWZGaWx0SW5fX0ZES1tjaF0gIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGhFbmMtPnBoUW1mRmlsdEluX19GREtbY2hdLT5GaWx0ZXJTdGF0ZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgICBGREtfRlJFRV9NRU1PUllfMUQoaEVuYy0+cGhRbWZGaWx0SW5fX0ZES1tjaF0tPkZpbHRlclN0YXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGREtfRlJFRV9NRU1PUllfMUQoaEVuYy0+cGhRbWZGaWx0SW5fX0ZES1tjaF0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGREtfRlJFRV9NRU1PUllfMUQoaEVuYy0+cGhRbWZGaWx0SW5fX0ZESyk7CisgICAgICB9CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBoRW5jLT5zZXR1cC5tYXhDaEluOyBjaCsrKSB7CisgICAgICAgIGlmIChOVUxMICE9IGhFbmMtPnBoRENGaWx0ZXJTaWdJbltjaF0pIHsKKyAgICAgICAgICBmZGtfc2FjZW5jX2Rlc3Ryb3lEQ0ZpbHRlcigmaEVuYy0+cGhEQ0ZpbHRlclNpZ0luW2NoXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIENsb3NlIE9uc2V0IERldGVjdGlvbiAqLworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgaEVuYy0+c2V0dXAubWF4Q2hJbjsgY2grKykgeworICAgICAgICBpZiAoTlVMTCAhPSBoRW5jLT5waE9uc2V0W2NoXSkgeworICAgICAgICAgIGZka19zYWNlbmNfb25zZXREZXRlY3RfQ2xvc2UoJmhFbmMtPnBoT25zZXRbY2hdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGhFbmMtPnBwVHJDdXJyUG9zKSB7CisgICAgICAgIEZES19GUkVFX01FTU9SWV8yRChoRW5jLT5wcFRyQ3VyclBvcyk7CisgICAgICB9CisgICAgICBpZiAoaEVuYy0+aEZyYW1lV2luZG93KSB7CisgICAgICAgIGZka19zYWNlbmNfZnJhbWVXaW5kb3dfRGVzdHJveSgmaEVuYy0+aEZyYW1lV2luZG93KTsKKyAgICAgIH0KKyAgICAgIC8qIENsb3NlIFNwYWNlIFRyZWUgKi8KKyAgICAgIGlmIChOVUxMICE9IGhFbmMtPmhTcGFjZVRyZWUpIHsKKyAgICAgICAgZmRrX3NhY2VuY19zcGFjZVRyZWVfQ2xvc2UoJmhFbmMtPmhTcGFjZVRyZWUpOworICAgICAgfQorICAgICAgaWYgKE5VTEwgIT0gaEVuYy0+aEVuaGFuY2VkVGltZURteCkgeworICAgICAgICBmZGtfc2FjZW5jX2Nsb3NlX2VuaGFuY2VkVGltZURvbWFpbkRteCgmaEVuYy0+aEVuaGFuY2VkVGltZURteCk7CisgICAgICB9CisgICAgICAvKiBDbG9zZSBTdGF0aWMgR2FpbiAqLworICAgICAgaWYgKE5VTEwgIT0gaEVuYy0+aFN0YXRpY0dhaW4pIHsKKyAgICAgICAgZmRrX3NhY2VuY19zdGF0aWNHYWluX0Nsb3NlKCZoRW5jLT5oU3RhdGljR2Fpbik7CisgICAgICB9CisgICAgICBpZiAoTlVMTCAhPSBoRW5jLT5oU3RhdGljR2FpbkNvbmZpZykgeworICAgICAgICBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fQ2xvc2VDb25maWcoJmhFbmMtPmhTdGF0aWNHYWluQ29uZmlnKTsKKyAgICAgIH0KKyAgICAgIC8qIENsb3NlIERlbGF5Ki8KKyAgICAgIGlmIChOVUxMICE9IGhFbmMtPmhEZWxheSkgeworICAgICAgICBmZGtfc2FjZW5jX2RlbGF5X0Nsb3NlKCZoRW5jLT5oRGVsYXkpOworICAgICAgfQorICAgICAgLyogRGVsZXRlIEJpdHN0cmVhbSBTdHVmZiAqLworICAgICAgaWYgKE5VTEwgIT0gaEVuYy0+aEJpdHN0cmVhbUZvcm1hdHRlcikgeworICAgICAgICBmZGtfc2FjZW5jX2Rlc3Ryb3lTcGF0aWFsQml0c3RyZWFtRW5jb2RlcigmKGhFbmMtPmhCaXRzdHJlYW1Gb3JtYXR0ZXIpKTsKKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5wcHBIeWJyaWRJbl9fRkRLICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGhFbmMtPnNldHVwLmJFbmNNb2RlXzIxMiA9PSAxKSB7CisgICAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzNEKGhFbmMtPnBwcEh5YnJpZEluX19GREspOworICAgICAgICAgIEZES19GUkVFX01FTU9SWV8zRChoRW5jLT5wcHBIeWJyaWRJblN0YXRpY19fRkRLKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGREtfRlJFRV9NRU1PUllfM0QoaEVuYy0+cHBwSHlicmlkSW5fX0ZESyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5wcHBQcm9jRGF0YUluX19GREsgIT0gTlVMTCkgeworICAgICAgICBGREtfRlJFRV9NRU1PUllfM0QoaEVuYy0+cHBwUHJvY0RhdGFJbl9fRkRLKTsKKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5wT3V0cHV0RGVsYXlCdWZmZXJfX0ZESyAhPSBOVUxMKSB7CisgICAgICAgIEZES19GUkVFX01FTU9SWV8xRChoRW5jLT5wT3V0cHV0RGVsYXlCdWZmZXJfX0ZESyk7CisgICAgICB9CisgICAgICBpZiAoaEVuYy0+cHBUaW1lU2lnSW5fX0ZESyAhPSBOVUxMKSB7CisgICAgICAgIHsgRkRLX0ZSRUVfTUVNT1JZXzJEKGhFbmMtPnBwVGltZVNpZ0luX19GREspOyB9CisgICAgICB9CisgICAgICBpZiAoaEVuYy0+cHBUaW1lU2lnRGVsYXlJbl9fRkRLICE9IE5VTEwpIHsKKyAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKGhFbmMtPnBwVGltZVNpZ0RlbGF5SW5fX0ZESyk7CisgICAgICB9CisgICAgICBpZiAoaEVuYy0+cHBUaW1lU2lnT3V0X19GREsgIT0gTlVMTCkgeworICAgICAgICBGREtfRlJFRV9NRU1PUllfMkQoaEVuYy0+cHBUaW1lU2lnT3V0X19GREspOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fUEFSQU1TOyBpKyspIHsKKyAgICAgICAgaWYgKGhFbmMtPnBGcmFtZVdpbmRvd0FuYV9fRkRLW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICBGREtfRlJFRV9NRU1PUllfMUQoaEVuYy0+cEZyYW1lV2luZG93QW5hX19GREtbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaEVuYy0+cG5PdXRwdXRCaXRzICE9IE5VTEwpIHsKKyAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKGhFbmMtPnBuT3V0cHV0Qml0cyk7CisgICAgICB9CisgICAgICBpZiAoaEVuYy0+cHBCaXRzdHJlYW1EZWxheUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIEZES19GUkVFX01FTU9SWV8yRChoRW5jLT5wcEJpdHN0cmVhbURlbGF5QnVmZmVyKTsKKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5zc2NCdWYucFNzYyAhPSBOVUxMKSB7CisgICAgICAgIEZES19GUkVFX01FTU9SWV8xRChoRW5jLT5zc2NCdWYucFNzYyk7CisgICAgICB9CisgICAgICBGREtfRlJFRV9NRU1PUllfMUQoKnBoTXA0U3BhY2VFbmMpOworICAgIH0KKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBmdW5jdGlvbm5hbWU6IG1wNFNwYWNlRW5jX0luaXREZWxheUNvbXBlbnNhdGlvbigpCisgIGRlc2NyaXB0aW9uOiAgaW5pdGlhbHplcyBkZWxheSBjb21wZW5zYXRpb24KKyAgcmV0dXJuczogICAgICBub0Vycm9yIG9uIHN1Y2Nlc3MsIGFuIGFwcm9wcmlhdGUgZXJyb3IgY29kZSBlbHNlCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIG1wNFNwYWNlRW5jX0luaXREZWxheUNvbXBlbnNhdGlvbigKKyAgICBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoTXA0U3BhY2VFbmMsIGNvbnN0IElOVCBjb3JlQ29kZXJEZWxheSkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIC8qIFNhbml0eSBDaGVjayAqLworICBpZiAoaE1wNFNwYWNlRW5jID09IE5VTEwpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBoTXA0U3BhY2VFbmMtPmNvcmVDb2RlckRlbGF5ID0gY29yZUNvZGVyRGVsYXk7CisKKyAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfZGVsYXlfSW5pdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5oRGVsYXksIGhNcDRTcGFjZUVuYy0+blFtZkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPm5GcmFtZUxlbmd0aCwgY29yZUNvZGVyRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+dGltZUFsaWdubWVudCkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgZmRrX3NhY2VuY19kZWxheV9TZXREbXhBbGlnbihoTXA0U3BhY2VFbmMtPmhEZWxheSwgMCk7CisgICAgZmRrX3NhY2VuY19kZWxheV9TZXRUaW1lRG9tRG14KAorICAgICAgICBoTXA0U3BhY2VFbmMtPmhEZWxheSwgKGhNcDRTcGFjZUVuYy0+dXNlVGltZURvbURvd25taXggPj0gMSkgPyAxIDogMCk7CisgICAgZmRrX3NhY2VuY19kZWxheV9TZXRNaW5pbWl6ZURlbGF5KGhNcDRTcGFjZUVuYy0+aERlbGF5LCAxKTsKKworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19kZWxheV9TdWJDYWx1bGF0ZUJ1ZmZlckRlbGF5cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5oRGVsYXkpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIGluaXQgb3V0cHV0IGRlbGF5IGNvbXBlbnNhdGlvbiAqLworICAgIGhNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbURlbGF5QnVmZmVyID0KKyAgICAgICAgZmRrX3NhY2VuY19kZWxheV9HZXRCaXRzdHJlYW1GcmFtZUJ1ZmZlclNpemUoaE1wNFNwYWNlRW5jLT5oRGVsYXkpOworICAgIGhNcDRTcGFjZUVuYy0+bk91dHB1dEJ1ZmZlckRlbGF5ID0KKyAgICAgICAgZmRrX3NhY2VuY19kZWxheV9HZXRPdXRwdXRBdWRpb0J1ZmZlckRlbGF5KGhNcDRTcGFjZUVuYy0+aERlbGF5KTsKKyAgICBoTXA0U3BhY2VFbmMtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXkgPQorICAgICAgICBmZGtfc2FjZW5jX2RlbGF5X0dldFN1cnJvdW5kQW5hbHlzaXNCdWZmZXJEZWxheShoTXA0U3BhY2VFbmMtPmhEZWxheSk7CisgICAgaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtQnVmZmVyUmVhZCA9IDA7CisgICAgaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtQnVmZmVyV3JpdGUgPQorICAgICAgICBoTXA0U3BhY2VFbmMtPm5CaXRzdHJlYW1EZWxheUJ1ZmZlciAtIDE7CisKKyAgICBpZiAoaE1wNFNwYWNlRW5jLT5lbmNNb2RlID09IFNBQ0VOQ18yMTIpIHsKKyAgICAgIC8qIG1vZGUgMjEyIGV4cGVjdHMgbm8gYml0c3RyZWFtIGRlbGF5ICovCisgICAgICBpZiAoaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtQnVmZmVyV3JpdGUgIT0KKyAgICAgICAgICBoTXA0U3BhY2VFbmMtPm5CaXRzdHJlYW1CdWZmZXJSZWFkKSB7CisgICAgICAgIGVycm9yID0gU0FDRU5DX1BBUkFNX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisKKyAgICAgIC8qIG1vZGUgMjEyIGV4cGVjdHMgbm8gb3V0cHV0IGJ1ZmZlciBkZWxheSAqLworICAgICAgaWYgKGhNcDRTcGFjZUVuYy0+bk91dHB1dEJ1ZmZlckRlbGF5ICE9IDApIHsKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfUEFSQU1fRVJST1I7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioqIElucHV0IGRlbGF5IHRvIG9idGFpbiBhIG5ldCBlbmNvZGVyIGRlbGF5IHRoYXQgaXMgYSBtdWx0aXBsZQorICAgIG9mIHRoZSB1c2VkIGZyYW1lbGVuZ3RoIHRvIGVuc3VyZSBzeW5jaHJvbml6YXRpb24gb2YgZnJhbWluZworICAgIGluIGFydGlzdGljIGRvd24tbWl4IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgc3BhdGlhbCBkYXRhLiAgICAgICoqKi8KKyAgICBoTXA0U3BhY2VFbmMtPm5EaXNjYXJkT3V0RnJhbWVzID0KKyAgICAgICAgZmRrX3NhY2VuY19kZWxheV9HZXREaXNjYXJkT3V0RnJhbWVzKGhNcDRTcGFjZUVuYy0+aERlbGF5KTsKKyAgICBoTXA0U3BhY2VFbmMtPm5JbnB1dERlbGF5ID0KKyAgICAgICAgZmRrX3NhY2VuY19kZWxheV9HZXREbXhBbGlnbkJ1ZmZlckRlbGF5KGhNcDRTcGFjZUVuYy0+aERlbGF5KTsKKworICAgIC8qIHJlc2V0IGluZGVwZW5kZW5jeSBGbGFnIGNvdW50ZXIgKi8KKyAgICBoTXA0U3BhY2VFbmMtPmluZGVwZW5kZW5jeUNvdW50ID0gMDsKKyAgICBoTXA0U3BhY2VFbmMtPmluZGVwZW5kZW5jeUZsYWcgPSAxOworCisgICAgaW50IGk7CisKKyAgICAvKiB3cml0ZSBzb21lIHBhcmFtZXRlcnMgdG8gYml0c3RyZWFtICovCisgICAgZm9yIChpID0gMDsgaSA8IGhNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbURlbGF5QnVmZmVyIC0gMTsgaSsrKSB7CisgICAgICBTUEFUSUFMRlJBTUUgKnBGcmFtZURhdGEgPSBOVUxMOworCisgICAgICBpZiAoTlVMTCA9PSAocEZyYW1lRGF0YSA9IGZka19zYWNlbmNfZ2V0U3BhdGlhbEZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPmhCaXRzdHJlYW1Gb3JtYXR0ZXIsIFJFQURfU1BBVElBTEZSQU1FKSkpIHsKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKworICAgICAgcEZyYW1lRGF0YS0+YnNJbmRlcGVuZGVuY3lGbGFnID0gMTsKKyAgICAgIHBGcmFtZURhdGEtPmZyYW1pbmdJbmZvLm51bVBhcmFtU2V0cyA9IDE7CisgICAgICBwRnJhbWVEYXRhLT5mcmFtaW5nSW5mby5ic0ZyYW1pbmdUeXBlID0gMDsKKworICAgICAgZmRrX3NhY2VuY193cml0ZVNwYXRpYWxGcmFtZSgKKyAgICAgICAgICBoTXA0U3BhY2VFbmMtPnBwQml0c3RyZWFtRGVsYXlCdWZmZXJbaV0sIE1BWF9NUEVHU19CWVRFUywKKyAgICAgICAgICAmaE1wNFNwYWNlRW5jLT5wbk91dHB1dEJpdHNbaV0sIGhNcDRTcGFjZUVuYy0+aEJpdHN0cmVhbUZvcm1hdHRlcik7CisgICAgfQorCisgICAgaWYgKChoTXA0U3BhY2VFbmMtPm5JbnB1dERlbGF5ID4gTUFYX0RFTEFZX0lOUFVUKSB8fAorICAgICAgICAoaE1wNFNwYWNlRW5jLT5uT3V0cHV0QnVmZmVyRGVsYXkgPiBNQVhfREVMQVlfT1VUUFVUKSB8fAorICAgICAgICAoaE1wNFNwYWNlRW5jLT5uU3Vycm91bmRBbmFseXNpc0J1ZmZlckRlbGF5ID4KKyAgICAgICAgIE1BWF9ERUxBWV9TVVJST1VORF9BTkFMWVNJUykgfHwKKyAgICAgICAgKGhNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbURlbGF5QnVmZmVyID4gTUFYX0JJVFNUUkVBTV9ERUxBWSkpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOSVRfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9CisKK2JhaWw6CisKKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgUVVBTlRNT0RFIF9fbWFwUXVhbnRNb2RlKGNvbnN0IE1QNFNQQUNFRU5DX1FVQU5UTU9ERSBxdWFudE1vZGUpIHsKKyAgUVVBTlRNT0RFIGJzUXVhbnRNb2RlID0gUVVBTlRNT0RFX0lOVkFMSUQ7CisKKyAgc3dpdGNoIChxdWFudE1vZGUpIHsKKyAgICBjYXNlIFNBQ0VOQ19RVUFOVE1PREVfRklORToKKyAgICAgIGJzUXVhbnRNb2RlID0gUVVBTlRNT0RFX0ZJTkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBQ0VOQ19RVUFOVE1PREVfRUJRMToKKyAgICAgIGJzUXVhbnRNb2RlID0gUVVBTlRNT0RFX0VCUTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBQ0VOQ19RVUFOVE1PREVfRUJRMjoKKyAgICAgIGJzUXVhbnRNb2RlID0gUVVBTlRNT0RFX0VCUTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBQ0VOQ19RVUFOVE1PREVfUlNWRDM6CisgICAgY2FzZSBTQUNFTkNfUVVBTlRNT0RFX0lOVkFMSUQ6CisgICAgZGVmYXVsdDoKKyAgICAgIGJzUXVhbnRNb2RlID0gUVVBTlRNT0RFX0lOVkFMSUQ7CisgIH0gLyogc3dpdGNoIGhFbmMtPnF1YW50TW9kZSAqLworCisgIHJldHVybiBic1F1YW50TW9kZTsKK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgRmlsbFNwYXRpYWxTcGVjaWZpY0NvbmZpZygKKyAgICBjb25zdCBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoRW5jLCBTUEFUSUFMU1BFQ0lGSUNDT05GSUcgKmNvbnN0IGhTc2MpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKE5VTEwgPT0gaEVuYykgfHwgKE5VTEwgPT0gaFNzYykpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBTUEFDRV9UUkVFX0RFU0NSSVBUSU9OIHNwYWNlVHJlZURlc2NyaXB0aW9uOworICAgIGludCBpOworCisgICAgLyogR2V0IHRyZWUgZGVzY3JpcHRpb24gKi8KKyAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfc3BhY2VUcmVlX0dldERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICBoRW5jLT5oU3BhY2VUcmVlLCAmc3BhY2VUcmVlRGVzY3JpcHRpb24pKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIEZpbGwgU1NDICovCisgICAgRkRLbWVtY2xlYXIoaFNzYywgc2l6ZW9mKFNQQVRJQUxTUEVDSUZJQ0NPTkZJRykpOyAvKiByZXNldCAqLworCisgICAgaFNzYy0+bnVtQmFuZHMgPSBoRW5jLT5zcGFjZVRyZWVTZXR1cC5uUGFyYW1CYW5kczsgLyogZm9yIGJzRnJlcVJlcyAqLworCisgICAgLyogRmlsbCB0cmVlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBoU3NjLT50cmVlRGVzY3JpcHRpb24ubnVtT3R0Qm94ZXMgPSBzcGFjZVRyZWVEZXNjcmlwdGlvbi5uT3R0Qm94ZXM7CisgICAgaFNzYy0+dHJlZURlc2NyaXB0aW9uLm51bUluQ2hhbiA9IHNwYWNlVHJlZURlc2NyaXB0aW9uLm5JbkNoYW5uZWxzOworICAgIGhTc2MtPnRyZWVEZXNjcmlwdGlvbi5udW1PdXRDaGFuID0gc3BhY2VUcmVlRGVzY3JpcHRpb24ubk91dENoYW5uZWxzOworCisgICAgZm9yIChpID0gMDsgaSA8IFNBQ0VOQ19NQVhfTlVNX0JPWEVTOyBpKyspIHsKKyAgICAgIGhTc2MtPm90dENvbmZpZ1tpXS5ic090dEJhbmRzID0gaFNzYy0+bnVtQmFuZHM7CisgICAgfQorCisgICAgc3dpdGNoIChoRW5jLT5lbmNNb2RlKSB7CisgICAgICBjYXNlIFNBQ0VOQ18yMTI6CisgICAgICAgIGhTc2MtPmJzVHJlZUNvbmZpZyA9IFRSRUVfMjEyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0FDRU5DX0lOVkFMSURfTU9ERToKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaFNzYy0+YnNTYW1wbGluZ0ZyZXF1ZW5jeSA9CisgICAgICAgIGhFbmMtPm5TYW1wbGVSYXRlOyAvKiBmb3IgYnNTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ICovCisgICAgaFNzYy0+YnNGcmFtZUxlbmd0aCA9IGhFbmMtPm5GcmFtZVRpbWVTbG90cyAtIDE7CisKKyAgICAvKiBtYXAgZGVjb3JyIHR5cGUgKi8KKyAgICBpZiAoREVDT1JSX0lOVkFMSUQgPT0KKyAgICAgICAgKGhTc2MtPmJzRGVjb3JyQ29uZmlnID0gbXA0U3BhY2VFbmNfR2V0RGVjb3JyQ29uZmlnKGhFbmMtPmVuY01vZGUpKSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogbWFwIHF1YW50TW9kZSAqLworICAgIGlmIChRVUFOVE1PREVfSU5WQUxJRCA9PQorICAgICAgICAoaFNzYy0+YnNRdWFudE1vZGUgPSBfX21hcFF1YW50TW9kZShoRW5jLT5xdWFudE1vZGUpKSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogQ29uZmlndXJlIEdhaW5zKi8KKyAgICBoU3NjLT5ic0ZpeGVkR2FpbkRNWCA9IGZka19zYWNlbmNfc3RhdGljR2Fpbl9HZXREbXhHYWluKGhFbmMtPmhTdGF0aWNHYWluKTsKKyAgICBoU3NjLT5ic0VudlF1YW50TW9kZSA9IDA7CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBtcDRTcGFjZUVuY19GaWxsU3BhY2VUcmVlU2V0dXAoCisgICAgY29uc3QgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaEVuYywKKyAgICBTUEFDRV9UUkVFX1NFVFVQICpjb25zdCBoU3BhY2VUcmVlU2V0dXApIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICAvKiBTYW5pdHkgQ2hlY2sgKi8KKyAgaWYgKE5VTEwgPT0gaEVuYyB8fCBOVUxMID09IGhTcGFjZVRyZWVTZXR1cCkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIFFVQU5UTU9ERSB0bXBRdWFudG1vZGUgPSBRVUFOVE1PREVfSU5WQUxJRDsKKworICAgIC8qIG1hcCBxdWFudE1vZGUgKi8KKyAgICBpZiAoUVVBTlRNT0RFX0lOVkFMSUQgPT0gKHRtcFF1YW50bW9kZSA9IF9fbWFwUXVhbnRNb2RlKGhFbmMtPnF1YW50TW9kZSkpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBoU3BhY2VUcmVlU2V0dXAtPm5QYXJhbUJhbmRzID0gaEVuYy0+blBhcmFtQmFuZHM7CisgICAgaFNwYWNlVHJlZVNldHVwLT5iVXNlQ29hcnNlUXVhbnRUdG9DbGQgPSBoRW5jLT51c2VDb2Fyc2VRdWFudENsZDsKKyAgICBoU3BhY2VUcmVlU2V0dXAtPmJVc2VDb2Fyc2VRdWFudFR0b0ljYyA9IGhFbmMtPnVzZUNvYXJzZVF1YW50SWNjOworICAgIGhTcGFjZVRyZWVTZXR1cC0+cXVhbnRNb2RlID0gdG1wUXVhbnRtb2RlOworICAgIGhTcGFjZVRyZWVTZXR1cC0+bkh5YnJpZEJhbmRzTWF4ID0gaEVuYy0+bkh5YnJpZEJhbmRzOworCisgICAgc3dpdGNoIChoRW5jLT5lbmNNb2RlKSB7CisgICAgICBjYXNlIFNBQ0VOQ18yMTI6CisgICAgICAgIGhTcGFjZVRyZWVTZXR1cC0+bW9kZSA9IFNQQUNFVFJFRV8yMTI7CisgICAgICAgIGhTcGFjZVRyZWVTZXR1cC0+bkNoYW5uZWxzSW5NYXggPSAyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0FDRU5DX0lOVkFMSURfTU9ERToKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfSAvKiBzd2l0Y2ggaEVuYy0+ZW5jTW9kZSAqLworCisgIH0gLyogdmFsaWQgaGFuZGxlICovCitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgRkRLX3NhY2VuY19nZXRJbmZvKGNvbnN0IEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhNcDRTcGFjZUVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNFNQQUNFRU5DX0lORk8gKmNvbnN0IHBJbmZvKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChOVUxMID09IGhNcDRTcGFjZUVuYykgfHwgKE5VTEwgPT0gcEluZm8pKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgcEluZm8tPm5TYW1wbGVSYXRlID0gaE1wNFNwYWNlRW5jLT5uU2FtcGxlUmF0ZTsKKyAgICBwSW5mby0+blNhbXBsZXNGcmFtZSA9IGhNcDRTcGFjZUVuYy0+bkZyYW1lTGVuZ3RoOworICAgIHBJbmZvLT5uVG90YWxJbnB1dENoYW5uZWxzID0gaE1wNFNwYWNlRW5jLT5uSW5wdXRDaGFubmVsczsKKyAgICBwSW5mby0+bkRteERlbGF5ID0gZmRrX3NhY2VuY19kZWxheV9HZXRJbmZvRG14RGVsYXkoaE1wNFNwYWNlRW5jLT5oRGVsYXkpOworICAgIHBJbmZvLT5uQ29kZWNEZWxheSA9CisgICAgICAgIGZka19zYWNlbmNfZGVsYXlfR2V0SW5mb0NvZGVjRGVsYXkoaE1wNFNwYWNlRW5jLT5oRGVsYXkpOworICAgIHBJbmZvLT5uRGVjb2RlckRlbGF5ID0KKyAgICAgICAgZmRrX3NhY2VuY19kZWxheV9HZXRJbmZvRGVjb2RlckRlbGF5KGhNcDRTcGFjZUVuYy0+aERlbGF5KTsKKyAgICBwSW5mby0+blBheWxvYWREZWxheSA9CisgICAgICAgIGZka19zYWNlbmNfZGVsYXlfR2V0Qml0c3RyZWFtRnJhbWVCdWZmZXJTaXplKGhNcDRTcGFjZUVuYy0+aERlbGF5KSAtIDE7CisgICAgcEluZm8tPm5EaXNjYXJkT3V0RnJhbWVzID0gaE1wNFNwYWNlRW5jLT5uRGlzY2FyZE91dEZyYW1lczsKKworICAgIHBJbmZvLT5wU3NjQnVmID0gJmhNcDRTcGFjZUVuYy0+c3NjQnVmOworICB9CisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBGREtfc2FjZW5jX3NldFBhcmFtKEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhNcDRTcGFjZUVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTUEFDRUVOQ19QQVJBTSBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHZhbHVlKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgLyogY2hlY2sgZW5jb2RlciBoYW5kbGUgKi8KKyAgaWYgKGhNcDRTcGFjZUVuYyA9PSBOVUxMKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogYXBwbHkgcGFyYW0gdmFsdWUgKi8KKyAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgU0FDRU5DX0xPV0RFTEFZOgorICAgICAgaWYgKCEoKHZhbHVlID09IDApIHx8ICh2YWx1ZSA9PSAxKSB8fCAodmFsdWUgPT0gMikpKSB7CisgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGhNcDRTcGFjZUVuYy0+dXNlci5iTGRNb2RlID0gdmFsdWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0FDRU5DX0VOQ19NT0RFOgorICAgICAgc3dpdGNoICgoTVA0U1BBQ0VFTkNfTU9ERSl2YWx1ZSkgeworICAgICAgICBjYXNlIFNBQ0VOQ18yMTI6CisgICAgICAgICAgaE1wNFNwYWNlRW5jLT51c2VyLmVuY01vZGUgPSAoTVA0U1BBQ0VFTkNfTU9ERSl2YWx1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNFTkNfU0FNUExFUkFURToKKyAgICAgIGlmICgoKGludCl2YWx1ZSA8IDApIHx8CisgICAgICAgICAgKChpbnQpdmFsdWUgPiBoTXA0U3BhY2VFbmMtPnNldHVwLm1heFNhbXBsaW5ncmF0ZSkpIHsKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaE1wNFNwYWNlRW5jLT51c2VyLnNhbXBsZVJhdGUgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNFTkNfRlJBTUVfVElNRV9TTE9UUzoKKyAgICAgIGlmICgoKGludCl2YWx1ZSA8IDApIHx8CisgICAgICAgICAgKChpbnQpdmFsdWUgPiBoTXA0U3BhY2VFbmMtPnNldHVwLm1heEZyYW1lVGltZVNsb3RzKSkgeworICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBoTXA0U3BhY2VFbmMtPnVzZXIuZnJhbWVUaW1lU2xvdHMgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNFTkNfUEFSQU1fQkFORFM6CisgICAgICBzd2l0Y2ggKChNUDRTUEFDRUVOQ19CQU5EU19DT05GSUcpdmFsdWUpIHsKKyAgICAgICAgY2FzZSBTQUNFTkNfQkFORFNfNDoKKyAgICAgICAgY2FzZSBTQUNFTkNfQkFORFNfNToKKyAgICAgICAgY2FzZSBTQUNFTkNfQkFORFNfNzoKKyAgICAgICAgY2FzZSBTQUNFTkNfQkFORFNfOToKKyAgICAgICAgY2FzZSBTQUNFTkNfQkFORFNfMTI6CisgICAgICAgIGNhc2UgU0FDRU5DX0JBTkRTXzE1OgorICAgICAgICBjYXNlIFNBQ0VOQ19CQU5EU18yMzoKKyAgICAgICAgICBoTXA0U3BhY2VFbmMtPnVzZXIublBhcmFtQmFuZHMgPSAoTVA0U1BBQ0VFTkNfQkFORFNfQ09ORklHKXZhbHVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0VOQ19USU1FX0RPTV9ETVg6CisgICAgICBpZiAoISgodmFsdWUgPT0gMCkgfHwgKHZhbHVlID09IDIpKSkgeworICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBoTXA0U3BhY2VFbmMtPnVzZXIuYlRpbWVEb21haW5EbXggPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNFTkNfRE1YX0dBSU46CisgICAgICBpZiAoISgodmFsdWUgPT0gMCkgfHwgKHZhbHVlID09IDEpIHx8ICh2YWx1ZSA9PSAyKSB8fCAodmFsdWUgPT0gMykgfHwKKyAgICAgICAgICAgICh2YWx1ZSA9PSA0KSB8fCAodmFsdWUgPT0gNSkgfHwgKHZhbHVlID09IDYpIHx8ICh2YWx1ZSA9PSA3KSkpIHsKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZXJyb3IgPSBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fU2V0RG14R2FpbihoTXA0U3BhY2VFbmMtPmhTdGF0aWNHYWluQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTVA0U1BBQ0VFTkNfRE1YX0dBSU4pdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0VOQ19DT0FSU0VfUVVBTlQ6CisgICAgICBpZiAoISgodmFsdWUgPT0gMCkgfHwgKHZhbHVlID09IDEpKSkgeworICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBoTXA0U3BhY2VFbmMtPnVzZXIuYlVzZUNvYXJzZVF1YW50ID0gdmFsdWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0FDRU5DX1FVQU5UX01PREU6CisgICAgICBzd2l0Y2ggKChNUDRTUEFDRUVOQ19RVUFOVE1PREUpdmFsdWUpIHsKKyAgICAgICAgY2FzZSBTQUNFTkNfUVVBTlRNT0RFX0ZJTkU6CisgICAgICAgIGNhc2UgU0FDRU5DX1FVQU5UTU9ERV9FQlExOgorICAgICAgICBjYXNlIFNBQ0VOQ19RVUFOVE1PREVfRUJRMjoKKyAgICAgICAgICBoTXA0U3BhY2VFbmMtPnVzZXIucXVhbnRNb2RlID0gKE1QNFNQQUNFRU5DX1FVQU5UTU9ERSl2YWx1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNFTkNfVElNRV9BTElHTk1FTlQ6CisgICAgICBpZiAoKElOVCl2YWx1ZSA8IC0zMjc2OCB8fCAoSU5UKXZhbHVlID4gMzI3NjcpIHsKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaE1wNFNwYWNlRW5jLT51c2VyLnRpbWVBbGlnbm1lbnQgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNFTkNfSU5ERVBFTkRFTkNZX0NPVU5UOgorICAgICAgaE1wNFNwYWNlRW5jLT5pbmRlcGVuZGVuY3lDb3VudCA9IHZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0VOQ19JTkRFUEVOREVOQ1lfRkFDVE9SOgorICAgICAgaE1wNFNwYWNlRW5jLT51c2VyLmluZGVwZW5kZW5jeUZhY3RvciA9IHZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgPSBTQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSOworICAgICAgYnJlYWs7CisgIH0gLyogc3dpdGNoKHBhcmFtKSAqLworYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIEZES19zYWNlbmNfZ2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykgeworICBpbnQgaSA9IDA7CisKKyAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgIHJldHVybiBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0KKworICBGREtfdG9vbHNHZXRMaWJJbmZvKGluZm8pOworCisgIC8qIHNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLworICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKKyAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpIGJyZWFrOworICB9CisgIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgeworICAgIHJldHVybiBTQUNFTkNfSU5JVF9FUlJPUjsKKyAgfQorCisgIGluZm9baV0ubW9kdWxlX2lkID0gRkRLX01QU0VOQzsKKyAgaW5mb1tpXS5idWlsZF9kYXRlID0gU0FDRU5DX0xJQl9CVUlMRF9EQVRFOworICBpbmZvW2ldLmJ1aWxkX3RpbWUgPSBTQUNFTkNfTElCX0JVSUxEX1RJTUU7CisgIGluZm9baV0udGl0bGUgPSBTQUNFTkNfTElCX1RJVExFOworICBpbmZvW2ldLnZlcnNpb24gPSBMSUJfVkVSU0lPTihTQUNFTkNfTElCX1ZMMCwgU0FDRU5DX0xJQl9WTDEsIFNBQ0VOQ19MSUJfVkwyKTsKKyAgTElCX1ZFUlNJT05fU1RSSU5HKCZpbmZvW2ldKTsKKworICAvKiBDYXBhYmlsaXR5IGZsYWdzICovCisgIGluZm9baV0uZmxhZ3MgPSAwOworICAvKiBFbmQgb2YgZmxhZ3MgKi8KKworICByZXR1cm4gU0FDRU5DX09LOworfQorCitzdGF0aWMgREVDT1JSQ09ORklHIG1wNFNwYWNlRW5jX0dldERlY29yckNvbmZpZygKKyAgICBjb25zdCBNUDRTUEFDRUVOQ19NT0RFIGVuY01vZGUpIHsKKyAgREVDT1JSQ09ORklHIGRlY29yckNvbmZpZyA9IERFQ09SUl9JTlZBTElEOworCisgIC8qIHNldCBkZWNvcnJDb25maWcgZGVwZW5kZW50IG9uIHRyZWUgbW9kZSAqLworICBzd2l0Y2ggKGVuY01vZGUpIHsKKyAgICBjYXNlIFNBQ0VOQ18yMTI6CisgICAgICBkZWNvcnJDb25maWcgPSBERUNPUlJfUU1GU1BMSVQwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQUNFTkNfSU5WQUxJRF9NT0RFOgorICAgIGRlZmF1bHQ6CisgICAgICBkZWNvcnJDb25maWcgPSBERUNPUlJfSU5WQUxJRDsKKyAgfQorICByZXR1cm4gZGVjb3JyQ29uZmlnOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBtcDRTcGFjZUVuY19Jbml0TnVtUGFyYW1CYW5kcygKKyAgICBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoRW5jLCBjb25zdCBNUDRTUEFDRUVOQ19CQU5EU19DT05GSUcgblBhcmFtQmFuZHMpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICAvKiBTZXQvQ2hlY2sgblBhcmFtQmFuZHMgKi8KKyAgaW50IGsgPSAwOworICBjb25zdCBpbnQgbiA9IHNpemVvZihwVmFsaWRCYW5kc19MZCkgLyBzaXplb2YoVUNIQVIpOworICBjb25zdCBVQ0hBUiAqcEJhbmRzID0gcFZhbGlkQmFuZHNfTGQ7CisKKyAgd2hpbGUgKGsgPCBuICYmIHBCYW5kc1trXSAhPSAoVUNIQVIpblBhcmFtQmFuZHMpICsrazsKKyAgaWYgKGsgPT0gbikgeworICAgIGhFbmMtPm5QYXJhbUJhbmRzID0gU0FDRU5DX0JBTkRTX0lOVkFMSUQ7CisgIH0gZWxzZSB7CisgICAgaEVuYy0+blBhcmFtQmFuZHMgPSBuUGFyYW1CYW5kczsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19ubGNfZW5jLmNwcCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX25sY19lbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYTZjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19ubGNfZW5jLmNwcApAQCAtMCwwICsxLDE0NDIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEthcnN0ZW4gTGluem1laWVyCisKKyAgIERlc2NyaXB0aW9uOiBOb2lzZWxlc3MgQ29kaW5nCisgICAgICAgICAgICAgICAgSHVmZm1hbiBlbmNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJzYWNlbmNfbmxjX2VuYy5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKyNpbmNsdWRlICJmaXhwb2ludF9tYXRoLmgiCisKKyNpbmNsdWRlICJzYWNlbmNfY29uc3QuaCIKKyNpbmNsdWRlICJzYWNlbmNfaHVmZl90YWIuaCIKKyNpbmNsdWRlICJzYWNlbmNfcGFyYW1leHRyYWN0LmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUEFJUl9TSElGVCA0CisjZGVmaW5lIFBBSVJfTUFTSyAweGYKKworI2RlZmluZSBQQkNfTUlOX0JBTkRTIDUKKwordHlwZWRlZiBlbnVtIHsKKyAgQkFDS1dBUkRTID0gMHgwLAorICBGT1JXQVJEUyA9IDB4MQorCit9IERJUkVDVElPTjsKKwordHlwZWRlZiBlbnVtIHsKKyAgRElGRl9GUkVRID0gMHgwLAorICBESUZGX1RJTUUgPSAweDEKKworfSBESUZGX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgIEhVRkZfMUQgPSAweDAsCisgIEhVRkZfMkQgPSAweDEKKworfSBDT0RJTkdfU0NIRU1FOworCit0eXBlZGVmIGVudW0geworICBGUkVRX1BBSVIgPSAweDAsCisgIFRJTUVfUEFJUiA9IDB4MQorCit9IFBBSVJJTkc7CisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IFVDSEFSIGxhdkh1ZmZWYWxbNF0gPSB7MCwgMiwgNiwgN307CitzdGF0aWMgY29uc3QgVUNIQVIgbGF2SHVmZkxlbls0XSA9IHsxLCAyLCAzLCAzfTsKKworc3RhdGljIGNvbnN0IFVDSEFSIGxhdl9zdGVwX0NMRFtdID0gezAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDN9Oworc3RhdGljIGNvbnN0IFVDSEFSIGxhdl9zdGVwX0lDQ1tdID0gezAsIDAsIDEsIDEsIDIsIDIsIDMsIDN9OworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHNwbGl0X2xzYihjb25zdCBTSE9SVCAqY29uc3QgaW5fZGF0YSwgU0hPUlQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1fdmFsLCBTSE9SVCAqY29uc3Qgb3V0X2RhdGFfbHNiLAorICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpjb25zdCBvdXRfZGF0YV9tc2IpIHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV92YWw7IGkrKykgeworICAgIFNIT1JUIHZhbCA9IGluX2RhdGFbaV0gKyBvZmZzZXQ7CisgICAgaWYgKG91dF9kYXRhX2xzYiAhPSBOVUxMKSBvdXRfZGF0YV9sc2JbaV0gPSB2YWwgJiAweDAwMDE7CisgICAgaWYgKG91dF9kYXRhX21zYiAhPSBOVUxMKSBvdXRfZGF0YV9tc2JbaV0gPSB2YWwgPj4gMTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBhcHBseV9sc2JfY29kaW5nKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpjb25zdCBpbl9kYXRhX2xzYiwgY29uc3QgVUlOVCBudW1fbHNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtX3ZhbCkgeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbDsgaSsrKSB7CisgICAgRkRLd3JpdGVCaXRzKHN0cm0sIGluX2RhdGFfbHNiW2ldLCBudW1fbHNiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBjYWxjX2RpZmZfZnJlcShjb25zdCBTSE9SVCAqY29uc3QgaW5fZGF0YSwgU0hPUlQgKmNvbnN0IG91dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bV92YWwpIHsKKyAgaW50IGk7CisgIG91dF9kYXRhWzBdID0gaW5fZGF0YVswXTsKKworICBmb3IgKGkgPSAxOyBpIDwgbnVtX3ZhbDsgaSsrKSB7CisgICAgb3V0X2RhdGFbaV0gPSBpbl9kYXRhW2ldIC0gaW5fZGF0YVtpIC0gMV07CisgIH0KK30KKworc3RhdGljIHZvaWQgY2FsY19kaWZmX3RpbWUoY29uc3QgU0hPUlQgKmNvbnN0IGluX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAqY29uc3QgcHJldl9kYXRhLCBTSE9SVCAqY29uc3Qgb3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtX3ZhbCkgeworICBpbnQgaTsKKyAgb3V0X2RhdGFbMF0gPSBpbl9kYXRhWzBdOworICBvdXRfZGF0YVsxXSA9IHByZXZfZGF0YVswXTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbDsgaSsrKSB7CisgICAgb3V0X2RhdGFbaSArIDJdID0gaW5fZGF0YVtpXSAtIHByZXZfZGF0YVtpXTsKKyAgfQorfQorCitzdGF0aWMgSU5UIHN5bV9jaGVjayhTSE9SVCBkYXRhWzJdLCBjb25zdCBJTlQgbGF2LCBTSE9SVCAqY29uc3QgcFN5bV9iaXRzKSB7CisgIFVDSEFSIHN5bUJpdHMgPSAwOworICBpbnQgc3VtX3ZhbCA9IGRhdGFbMF0gKyBkYXRhWzFdOworICBpbnQgZGlmZl92YWwgPSBkYXRhWzBdIC0gZGF0YVsxXTsKKyAgaW50IG51bV9zYml0cyA9IDA7CisKKyAgaWYgKHN1bV92YWwgIT0gMCkgeworICAgIGludCBzdW1fbmVnID0gKHN1bV92YWwgPCAwKSA/IDEgOiAwOworICAgIGlmIChzdW1fbmVnKSB7CisgICAgICBzdW1fdmFsID0gLXN1bV92YWw7CisgICAgICBkaWZmX3ZhbCA9IC1kaWZmX3ZhbDsKKyAgICB9CisgICAgc3ltQml0cyA9IChzeW1CaXRzIDw8IDEpIHwgc3VtX25lZzsKKyAgICBudW1fc2JpdHMrKzsKKyAgfQorCisgIGlmIChkaWZmX3ZhbCAhPSAwKSB7CisgICAgaW50IGRpZmZfbmVnID0gKGRpZmZfdmFsIDwgMCkgPyAxIDogMDsKKyAgICBpZiAoZGlmZl9uZWcpIHsKKyAgICAgIGRpZmZfdmFsID0gLWRpZmZfdmFsOworICAgIH0KKyAgICBzeW1CaXRzID0gKHN5bUJpdHMgPDwgMSkgfCBkaWZmX25lZzsKKyAgICBudW1fc2JpdHMrKzsKKyAgfQorCisgIGlmIChwU3ltX2JpdHMgIT0gTlVMTCkgeworICAgICpwU3ltX2JpdHMgPSBzeW1CaXRzOworICB9CisKKyAgaWYgKHN1bV92YWwgJSAyKSB7CisgICAgZGF0YVswXSA9IGxhdiAtIHN1bV92YWwgLyAyOworICAgIGRhdGFbMV0gPSBsYXYgLSBkaWZmX3ZhbCAvIDI7CisgIH0gZWxzZSB7CisgICAgZGF0YVswXSA9IHN1bV92YWwgLyAyOworICAgIGRhdGFbMV0gPSBkaWZmX3ZhbCAvIDI7CisgIH0KKworICByZXR1cm4gbnVtX3NiaXRzOworfQorCitzdGF0aWMgSU5UIGlsb2cyKFVJTlQgaSkgeworICBpbnQgbCA9IDA7CisKKyAgaWYgKGkpIGktLTsKKyAgd2hpbGUgKGkgPiAwKSB7CisgICAgaSA+Pj0gMTsKKyAgICBsKys7CisgIH0KKworICByZXR1cm4gbDsKK30KKworc3RhdGljIFNIT1JUIGNhbGNfcGNtX2JpdHMoY29uc3QgU0hPUlQgbnVtX3ZhbCwgY29uc3QgU0hPUlQgbnVtX2xldmVscykgeworICBTSE9SVCBudW1fY29tcGxldGVfY2h1bmtzID0gMCwgcmVzdF9jaHVua19zaXplID0gMDsKKyAgU0hPUlQgbWF4X2dycF9sZW4gPSAwLCBiaXRzX3BjbSA9IDA7CisgIGludCBjaHVua19sZXZlbHMsIGk7CisKKyAgc3dpdGNoIChudW1fbGV2ZWxzKSB7CisgICAgY2FzZSAzOgorICAgICAgbWF4X2dycF9sZW4gPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgbWF4X2dycF9sZW4gPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgbWF4X2dycF9sZW4gPSA2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMToKKyAgICAgIG1heF9ncnBfbGVuID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICBtYXhfZ3JwX2xlbiA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE5OgorICAgICAgbWF4X2dycF9sZW4gPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNToKKyAgICAgIG1heF9ncnBfbGVuID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTE6CisgICAgICBtYXhfZ3JwX2xlbiA9IDQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbWF4X2dycF9sZW4gPSAxOworICB9CisKKyAgbnVtX2NvbXBsZXRlX2NodW5rcyA9IG51bV92YWwgLyBtYXhfZ3JwX2xlbjsKKyAgcmVzdF9jaHVua19zaXplID0gbnVtX3ZhbCAlIG1heF9ncnBfbGVuOworCisgIGNodW5rX2xldmVscyA9IDE7CisgIGZvciAoaSA9IDE7IGkgPD0gbWF4X2dycF9sZW47IGkrKykgeworICAgIGNodW5rX2xldmVscyAqPSBudW1fbGV2ZWxzOworICB9CisKKyAgYml0c19wY20gPSAoU0hPUlQpKGlsb2cyKGNodW5rX2xldmVscykgKiBudW1fY29tcGxldGVfY2h1bmtzKTsKKyAgYml0c19wY20gKz0gKFNIT1JUKShpbG9nMihudW1fbGV2ZWxzKSAqIHJlc3RfY2h1bmtfc2l6ZSk7CisKKyAgcmV0dXJuIGJpdHNfcGNtOworfQorCitzdGF0aWMgdm9pZCBhcHBseV9wY21fY29kaW5nKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpjb25zdCBpbl9kYXRhXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpjb25zdCBpbl9kYXRhXzIsIGNvbnN0IFNIT1JUIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgbnVtX3ZhbCwgY29uc3QgU0hPUlQgbnVtX2xldmVscykgeworICBTSE9SVCBpID0gMCwgaiA9IDAsIGlkeCA9IDA7CisgIFNIT1JUIG1heF9ncnBfbGVuID0gMCwgZ3JwX2xlbiA9IDAsIG5leHRfdmFsID0gMDsKKyAgaW50IGdycF92YWwgPSAwLCBjaHVua19sZXZlbHMgPSAwOworCisgIFNIT1JUIHBjbV9jaHVua19zaXplWzddID0gezB9OworCisgIHN3aXRjaCAobnVtX2xldmVscykgeworICAgIGNhc2UgMzoKKyAgICAgIG1heF9ncnBfbGVuID0gNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIG1heF9ncnBfbGVuID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIG1heF9ncnBfbGVuID0gNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIG1heF9ncnBfbGVuID0gNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOToKKyAgICAgIG1heF9ncnBfbGVuID0gNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6CisgICAgICBtYXhfZ3JwX2xlbiA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgbWF4X2dycF9sZW4gPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOToKKyAgICAgIG1heF9ncnBfbGVuID0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjU6CisgICAgICBtYXhfZ3JwX2xlbiA9IDM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDUxOgorICAgICAgbWF4X2dycF9sZW4gPSA0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG1heF9ncnBfbGVuID0gMTsKKyAgfQorCisgIGNodW5rX2xldmVscyA9IDE7CisgIGZvciAoaSA9IDE7IGkgPD0gbWF4X2dycF9sZW47IGkrKykgeworICAgIGNodW5rX2xldmVscyAqPSBudW1fbGV2ZWxzOworICAgIHBjbV9jaHVua19zaXplW2ldID0gaWxvZzIoY2h1bmtfbGV2ZWxzKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsOyBpICs9IG1heF9ncnBfbGVuKSB7CisgICAgZ3JwX2xlbiA9IEZES21pbihtYXhfZ3JwX2xlbiwgbnVtX3ZhbCAtIGkpOworICAgIGdycF92YWwgPSAwOworICAgIGZvciAoaiA9IDA7IGogPCBncnBfbGVuOyBqKyspIHsKKyAgICAgIGlkeCA9IGkgKyBqOworICAgICAgaWYgKGluX2RhdGFfMiA9PSBOVUxMKSB7CisgICAgICAgIG5leHRfdmFsID0gaW5fZGF0YV8xW2lkeF07CisgICAgICB9IGVsc2UgaWYgKGluX2RhdGFfMSA9PSBOVUxMKSB7CisgICAgICAgIG5leHRfdmFsID0gaW5fZGF0YV8yW2lkeF07CisgICAgICB9IGVsc2UgeworICAgICAgICBuZXh0X3ZhbCA9ICgoaWR4ICUgMikgPyBpbl9kYXRhXzJbaWR4IC8gMl0gOiBpbl9kYXRhXzFbaWR4IC8gMl0pOworICAgICAgfQorICAgICAgbmV4dF92YWwgKz0gb2Zmc2V0OworICAgICAgZ3JwX3ZhbCA9IGdycF92YWwgKiBudW1fbGV2ZWxzICsgbmV4dF92YWw7CisgICAgfQorCisgICAgRkRLd3JpdGVCaXRzKHN0cm0sIGdycF92YWwsIHBjbV9jaHVua19zaXplW2dycF9sZW5dKTsKKyAgfQorfQorCitzdGF0aWMgVUlOVCBodWZmX2VuY18xRChIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLCBjb25zdCBEQVRBX1RZUEUgZGF0YV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRpbTEsIFNIT1JUICpjb25zdCBpbl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgbnVtX3ZhbCwgY29uc3QgU0hPUlQgcDBfZmxhZykgeworICBpbnQgaSwgb2Zmc2V0ID0gMDsKKyAgVUlOVCBodWZmQml0cyA9IDA7CisKKyAgSFVGRl9FTlRSWSBwYXJ0MCA9IHswfTsKKyAgY29uc3QgSFVGRl9FTlRSWSAqcEh1ZmZUYWIgPSBOVUxMOworCisgIHN3aXRjaCAoZGF0YV90eXBlKSB7CisgICAgY2FzZSB0X0NMRDoKKyAgICAgIHBIdWZmVGFiID0gZmRrX3NhY2VuY19odWZmQ0xEVGFiLmgxRFtkaW0xXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9JQ0M6CisgICAgICBwSHVmZlRhYiA9IGZka19zYWNlbmNfaHVmZklDQ1RhYi5oMURbZGltMV07CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChwMF9mbGFnKSB7CisgICAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICAgIGNhc2UgdF9DTEQ6CisgICAgICAgIHBhcnQwID0gZmRrX3NhY2VuY19odWZmUGFydDBUYWIuY2xkW2luX2RhdGFbMF1dOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9JQ0M6CisgICAgICAgIHBhcnQwID0gZmRrX3NhY2VuY19odWZmUGFydDBUYWIuaWNjW2luX2RhdGFbMF1dOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaHVmZkJpdHMgKz0gRkRLd3JpdGVCaXRzKHN0cm0sIEhVRkZfVkFMVUUocGFydDApLCBIVUZGX0xFTkdUSChwYXJ0MCkpOworICAgIG9mZnNldCA9IDE7CisgIH0KKworICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBudW1fdmFsOyBpKyspIHsKKyAgICBpbnQgaWRfc2lnbiA9IDA7CisgICAgaW50IGlkID0gaW5fZGF0YVtpXTsKKworICAgIGlmIChpZCAhPSAwKSB7CisgICAgICBpZF9zaWduID0gMDsKKyAgICAgIGlmIChpZCA8IDApIHsKKyAgICAgICAgaWQgPSAtaWQ7CisgICAgICAgIGlkX3NpZ24gPSAxOworICAgICAgfQorICAgIH0KKworICAgIGh1ZmZCaXRzICs9CisgICAgICAgIEZES3dyaXRlQml0cyhzdHJtLCBIVUZGX1ZBTFVFKHBIdWZmVGFiW2lkXSksIEhVRkZfTEVOR1RIKHBIdWZmVGFiW2lkXSkpOworCisgICAgaWYgKGlkICE9IDApIHsKKyAgICAgIGh1ZmZCaXRzICs9IEZES3dyaXRlQml0cyhzdHJtLCBpZF9zaWduLCAxKTsKKyAgICB9CisgIH0gLyogZm9yIGkgKi8KKworICByZXR1cm4gaHVmZkJpdHM7Cit9CisKK3N0YXRpYyB2b2lkIGdldEh1ZmZFbnRyeShjb25zdCBJTlQgbGF2LCBjb25zdCBEQVRBX1RZUEUgZGF0YV90eXBlLCBjb25zdCBJTlQgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCB0YWJfaWR4XzJEWzJdLCBjb25zdCBTSE9SVCBpbl9kYXRhW11bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgSFVGRl9FTlRSWSAqY29uc3QgcEVudHJ5LCBIVUZGX0VOVFJZICpjb25zdCBwRXNjYXBlKSB7CisgIGNvbnN0IEhVRkZfQ0xEX1RBQl8yRCAqcENMRDJkVGFiID0KKyAgICAgICZmZGtfc2FjZW5jX2h1ZmZDTERUYWIuaDJEW3RhYl9pZHhfMkRbMF1dW3RhYl9pZHhfMkRbMV1dOworICBjb25zdCBIVUZGX0lDQ19UQUJfMkQgKnBJQ0MyZFRhYiA9CisgICAgICAmZmRrX3NhY2VuY19odWZmSUNDVGFiLmgyRFt0YWJfaWR4XzJEWzBdXVt0YWJfaWR4XzJEWzFdXTsKKworICBzd2l0Y2ggKGxhdikgeworICAgIGNhc2UgMTogeworICAgICAgY29uc3QgTEFWMV8yRCAqcExhdjEgPSBOVUxMOworICAgICAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICAgICAgY2FzZSB0X0NMRDoKKyAgICAgICAgICBwTGF2MSA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9JQ0M6CisgICAgICAgICAgcExhdjEgPSAmcElDQzJkVGFiLT5sYXYxOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHBMYXYxICE9IE5VTEwpIHsKKyAgICAgICAgKnBFbnRyeSA9IHBMYXYxLT5lbnRyeVtpbl9kYXRhW2ldWzBdXVtpbl9kYXRhW2ldWzFdXTsKKyAgICAgICAgKnBFc2NhcGUgPSBwTGF2MS0+ZXNjYXBlOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSAzOiB7CisgICAgICBjb25zdCBMQVYzXzJEICpwTGF2MyA9IE5VTEw7CisgICAgICBzd2l0Y2ggKGRhdGFfdHlwZSkgeworICAgICAgICBjYXNlIHRfQ0xEOgorICAgICAgICAgIHBMYXYzID0gJnBDTEQyZFRhYi0+bGF2MzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X0lDQzoKKyAgICAgICAgICBwTGF2MyA9ICZwSUNDMmRUYWItPmxhdjM7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocExhdjMgIT0gTlVMTCkgeworICAgICAgICAqcEVudHJ5ID0gcExhdjMtPmVudHJ5W2luX2RhdGFbaV1bMF1dW2luX2RhdGFbaV1bMV1dOworICAgICAgICAqcEVzY2FwZSA9IHBMYXYzLT5lc2NhcGU7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIDU6IHsKKyAgICAgIGNvbnN0IExBVjVfMkQgKnBMYXY1ID0gTlVMTDsKKyAgICAgIHN3aXRjaCAoZGF0YV90eXBlKSB7CisgICAgICAgIGNhc2UgdF9DTEQ6CisgICAgICAgICAgcExhdjUgPSAmcENMRDJkVGFiLT5sYXY1OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfSUNDOgorICAgICAgICAgIHBMYXY1ID0gJnBJQ0MyZFRhYi0+bGF2NTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChwTGF2NSAhPSBOVUxMKSB7CisgICAgICAgICpwRW50cnkgPSBwTGF2NS0+ZW50cnlbaW5fZGF0YVtpXVswXV1baW5fZGF0YVtpXVsxXV07CisgICAgICAgICpwRXNjYXBlID0gcExhdjUtPmVzY2FwZTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgNzogeworICAgICAgY29uc3QgTEFWN18yRCAqcExhdjcgPSBOVUxMOworICAgICAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICAgICAgY2FzZSB0X0NMRDoKKyAgICAgICAgICBwTGF2NyA9ICZwQ0xEMmRUYWItPmxhdjc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9JQ0M6CisgICAgICAgICAgcExhdjcgPSAmcElDQzJkVGFiLT5sYXY3OworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHBMYXY3ICE9IE5VTEwpIHsKKyAgICAgICAgKnBFbnRyeSA9IHBMYXY3LT5lbnRyeVtpbl9kYXRhW2ldWzBdXVtpbl9kYXRhW2ldWzFdXTsKKyAgICAgICAgKnBFc2NhcGUgPSBwTGF2Ny0+ZXNjYXBlOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSA5OiB7CisgICAgICBjb25zdCBMQVY5XzJEICpwTGF2OSA9IE5VTEw7CisgICAgICBzd2l0Y2ggKGRhdGFfdHlwZSkgeworICAgICAgICBjYXNlIHRfQ0xEOgorICAgICAgICAgIHBMYXY5ID0gJnBDTEQyZFRhYi0+bGF2OTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X0lDQzoKKyAgICAgICAgICBwTGF2OSA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocExhdjkgIT0gTlVMTCkgeworICAgICAgICAqcEVudHJ5ID0gcExhdjktPmVudHJ5W2luX2RhdGFbaV1bMF1dW2luX2RhdGFbaV1bMV1dOworICAgICAgICAqcEVzY2FwZSA9IHBMYXY5LT5lc2NhcGU7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgfQorfQorCitzdGF0aWMgVUlOVCBodWZmX2VuY18yRChIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLCBjb25zdCBEQVRBX1RZUEUgZGF0YV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgdGFiX2lkeF8yRFsyXSwgU0hPUlQgbGF2X2lkeCwgU0hPUlQgaW5fZGF0YVtdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgbnVtX3ZhbCwgU0hPUlQgc3RyaWRlLCBTSE9SVCAqcDBfZGF0YVsyXSkgeworICBTSE9SVCBpID0gMCwgbGF2ID0gMCwgbnVtX3NiaXRzID0gMCwgc3ltX2JpdHMgPSAwLCBlc2NJZHggPSAwOworICBTSE9SVCBlc2NfZGF0YVsyXVtNQVhCQU5EU10gPSB7ezB9fTsKKworICBVSU5UIGh1ZmZCaXRzID0gMDsKKworICBjb25zdCBIVUZGX0VOVFJZICpwSHVmZkVudHJ5ID0gTlVMTDsKKworICBzd2l0Y2ggKGRhdGFfdHlwZSkgeworICAgIGNhc2UgdF9DTEQ6CisgICAgICBsYXYgPSAyICogbGF2X2lkeCArIDM7IC8qIExBViAqLworICAgICAgcEh1ZmZFbnRyeSA9IGZka19zYWNlbmNfaHVmZlBhcnQwVGFiLmNsZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9JQ0M6CisgICAgICBsYXYgPSAyICogbGF2X2lkeCArIDE7IC8qIExBViAqLworICAgICAgcEh1ZmZFbnRyeSA9IGZka19zYWNlbmNfaHVmZlBhcnQwVGFiLmljYzsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogUGFydGl0aW9uIDAgKi8KKyAgaWYgKHAwX2RhdGFbMF0gIT0gTlVMTCkgeworICAgIEhVRkZfRU5UUlkgZW50cnkgPSBwSHVmZkVudHJ5WypwMF9kYXRhWzBdXTsKKyAgICBodWZmQml0cyArPSBGREt3cml0ZUJpdHMoc3RybSwgSFVGRl9WQUxVRShlbnRyeSksIEhVRkZfTEVOR1RIKGVudHJ5KSk7CisgIH0KKyAgaWYgKHAwX2RhdGFbMV0gIT0gTlVMTCkgeworICAgIEhVRkZfRU5UUlkgZW50cnkgPSBwSHVmZkVudHJ5WypwMF9kYXRhWzFdXTsKKyAgICBodWZmQml0cyArPSBGREt3cml0ZUJpdHMoc3RybSwgSFVGRl9WQUxVRShlbnRyeSksIEhVRkZfTEVOR1RIKGVudHJ5KSk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbDsgaSArPSBzdHJpZGUpIHsKKyAgICBIVUZGX0VOVFJZIGVudHJ5ID0gezB9OworICAgIEhVRkZfRU5UUlkgZXNjYXBlID0gezB9OworCisgICAgZXNjX2RhdGFbMF1bZXNjSWR4XSA9IGluX2RhdGFbaV1bMF0gKyBsYXY7CisgICAgZXNjX2RhdGFbMV1bZXNjSWR4XSA9IGluX2RhdGFbaV1bMV0gKyBsYXY7CisKKyAgICBudW1fc2JpdHMgPSBzeW1fY2hlY2soaW5fZGF0YVtpXSwgbGF2LCAmc3ltX2JpdHMpOworCisgICAgZ2V0SHVmZkVudHJ5KGxhdiwgZGF0YV90eXBlLCBpLCB0YWJfaWR4XzJELCBpbl9kYXRhLCAmZW50cnksICZlc2NhcGUpOworCisgICAgaHVmZkJpdHMgKz0gRkRLd3JpdGVCaXRzKHN0cm0sIEhVRkZfVkFMVUUoZW50cnkpLCBIVUZGX0xFTkdUSChlbnRyeSkpOworCisgICAgaWYgKChIVUZGX1ZBTFVFKGVudHJ5KSA9PSBIVUZGX1ZBTFVFKGVzY2FwZSkpICYmCisgICAgICAgIChIVUZGX0xFTkdUSChlbnRyeSkgPT0gSFVGRl9MRU5HVEgoZXNjYXBlKSkpIHsKKyAgICAgIGVzY0lkeCsrOworICAgIH0gZWxzZSB7CisgICAgICBodWZmQml0cyArPSBGREt3cml0ZUJpdHMoc3RybSwgc3ltX2JpdHMsIG51bV9zYml0cyk7CisgICAgfQorICB9IC8qIGZvciBpICovCisKKyAgaWYgKGVzY0lkeCA+IDApIHsKKyAgICBodWZmQml0cyArPSBjYWxjX3BjbV9iaXRzKDIgKiBlc2NJZHgsICgyICogbGF2ICsgMSkpOworICAgIGlmIChzdHJtICE9IE5VTEwpIHsKKyAgICAgIGFwcGx5X3BjbV9jb2Rpbmcoc3RybSwgZXNjX2RhdGFbMF0sIGVzY19kYXRhWzFdLCAwIC8qb2Zmc2V0Ki8sIDIgKiBlc2NJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICgyICogbGF2ICsgMSkpOworICAgIH0KKyAgfQorCisgIHJldHVybiBodWZmQml0czsKK30KKworc3RhdGljIFNDSEFSIGdldF9uZXh0X2xhdl9zdGVwKGNvbnN0IElOVCBsYXYsIGNvbnN0IERBVEFfVFlQRSBkYXRhX3R5cGUpIHsKKyAgU0NIQVIgbGF2X3N0ZXAgPSAwOworCisgIHN3aXRjaCAoZGF0YV90eXBlKSB7CisgICAgY2FzZSB0X0NMRDoKKyAgICAgIGxhdl9zdGVwID0gKGxhdiA+IDkpID8gLTEgOiBsYXZfc3RlcF9DTERbbGF2XTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9JQ0M6CisgICAgICBsYXZfc3RlcCA9IChsYXYgPiA3KSA/IC0xIDogbGF2X3N0ZXBfSUNDW2xhdl07CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBsYXZfc3RlcDsKK30KKworc3RhdGljIElOVCBkaWZmX3R5cGVfb2Zmc2V0KGNvbnN0IERJRkZfVFlQRSBkaWZmX3R5cGUpIHsKKyAgaW50IG9mZnNldCA9IDA7CisgIHN3aXRjaCAoZGlmZl90eXBlKSB7CisgICAgY2FzZSBESUZGX0ZSRVE6CisgICAgICBvZmZzZXQgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBESUZGX1RJTUU6CisgICAgICBvZmZzZXQgPSAyOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIFNIT1JUIGNhbGNfaHVmZl9iaXRzKFNIT1JUICppbl9kYXRhXzEsIFNIT1JUICppbl9kYXRhXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREFUQV9UWVBFIGRhdGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBESUZGX1RZUEUgZGlmZl90eXBlXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRElGRl9UWVBFIGRpZmZfdHlwZV8yLCBjb25zdCBTSE9SVCBudW1fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpjb25zdCBsYXZfaWR4LCBTSE9SVCAqY29uc3QgY2RnX3NjaGVtZSkgeworICBTSE9SVCB0YWJfaWR4XzJEWzJdWzJdID0ge3swfX07CisgIFNIT1JUIHRhYl9pZHhfMURbMl0gPSB7MH07CisgIFNIT1JUIGRmX3Jlc3RfZmxhZ1syXSA9IHswfTsKKyAgU0hPUlQgcDBfZmxhZ1syXSA9IHswfTsKKworICBTSE9SVCBwYWlyX3ZlY1tNQVhCQU5EU11bMl0gPSB7ezB9fTsKKworICBTSE9SVCAqcDBfZGF0YV8xWzJdID0ge05VTEx9OworICBTSE9SVCAqcDBfZGF0YV8yWzJdID0ge05VTEx9OworCisgIFNIT1JUIGkgPSAwOworICBTSE9SVCBsYXZfZnBbMl0gPSB7MH07CisKKyAgU0hPUlQgYml0X2NvdW50XzFEID0gMDsKKyAgU0hPUlQgYml0X2NvdW50XzJEX2ZyZXEgPSAwOworICBTSE9SVCBiaXRfY291bnRfbWluID0gMDsKKworICBTSE9SVCBudW1fdmFsXzFfc2hvcnQgPSAwOworICBTSE9SVCBudW1fdmFsXzJfc2hvcnQgPSAwOworCisgIFNIT1JUICppbl9kYXRhXzFfc2hvcnQgPSBOVUxMOworICBTSE9SVCAqaW5fZGF0YV8yX3Nob3J0ID0gTlVMTDsKKworICAvKiAxRCBIdWZmbWFuIGNvZGluZyAqLworICBiaXRfY291bnRfMUQgPSAxOyAvKiBIVUZGXzFEICovCisKKyAgbnVtX3ZhbF8xX3Nob3J0ID0gbnVtX3ZhbDsKKyAgbnVtX3ZhbF8yX3Nob3J0ID0gbnVtX3ZhbDsKKworICBpZiAoaW5fZGF0YV8xICE9IE5VTEwpIHsKKyAgICBpbl9kYXRhXzFfc2hvcnQgPSBpbl9kYXRhXzEgKyBkaWZmX3R5cGVfb2Zmc2V0KGRpZmZfdHlwZV8xKTsKKyAgfQorICBpZiAoaW5fZGF0YV8yICE9IE5VTEwpIHsKKyAgICBpbl9kYXRhXzJfc2hvcnQgPSBpbl9kYXRhXzIgKyBkaWZmX3R5cGVfb2Zmc2V0KGRpZmZfdHlwZV8yKTsKKyAgfQorCisgIHAwX2ZsYWdbMF0gPSAoZGlmZl90eXBlXzEgPT0gRElGRl9GUkVRKTsKKyAgcDBfZmxhZ1sxXSA9IChkaWZmX3R5cGVfMiA9PSBESUZGX0ZSRVEpOworCisgIHRhYl9pZHhfMURbMF0gPSAoZGlmZl90eXBlXzEgPT0gRElGRl9GUkVRKSA/IDAgOiAxOworICB0YWJfaWR4XzFEWzFdID0gKGRpZmZfdHlwZV8yID09IERJRkZfRlJFUSkgPyAwIDogMTsKKworICBpZiAoaW5fZGF0YV8xICE9IE5VTEwpIHsKKyAgICBiaXRfY291bnRfMUQgKz0gaHVmZl9lbmNfMUQoTlVMTCwgZGF0YV90eXBlLCB0YWJfaWR4XzFEWzBdLCBpbl9kYXRhXzFfc2hvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YWxfMV9zaG9ydCwgcDBfZmxhZ1swXSk7CisgIH0KKyAgaWYgKGluX2RhdGFfMiAhPSBOVUxMKSB7CisgICAgYml0X2NvdW50XzFEICs9IGh1ZmZfZW5jXzFEKE5VTEwsIGRhdGFfdHlwZSwgdGFiX2lkeF8xRFsxXSwgaW5fZGF0YV8yX3Nob3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFsXzJfc2hvcnQsIHAwX2ZsYWdbMV0pOworICB9CisKKyAgYml0X2NvdW50X21pbiA9IGJpdF9jb3VudF8xRDsKKyAgKmNkZ19zY2hlbWUgPSBIVUZGXzFEIDw8IFBBSVJfU0hJRlQ7CisgIGxhdl9pZHhbMF0gPSBsYXZfaWR4WzFdID0gLTE7CisKKyAgLyogSHVmZm1hbiAyRCBmcmVxdWVuY3kgcGFpcnMgKi8KKyAgYml0X2NvdW50XzJEX2ZyZXEgPSAxOyAvKiBIVUZGXzJEICovCisKKyAgbnVtX3ZhbF8xX3Nob3J0ID0gbnVtX3ZhbDsKKyAgbnVtX3ZhbF8yX3Nob3J0ID0gbnVtX3ZhbDsKKworICBpZiAoaW5fZGF0YV8xICE9IE5VTEwpIHsKKyAgICBpbl9kYXRhXzFfc2hvcnQgPSBpbl9kYXRhXzEgKyBkaWZmX3R5cGVfb2Zmc2V0KGRpZmZfdHlwZV8xKTsKKyAgfQorICBpZiAoaW5fZGF0YV8yICE9IE5VTEwpIHsKKyAgICBpbl9kYXRhXzJfc2hvcnQgPSBpbl9kYXRhXzIgKyBkaWZmX3R5cGVfb2Zmc2V0KGRpZmZfdHlwZV8yKTsKKyAgfQorCisgIGxhdl9mcFswXSA9IGxhdl9mcFsxXSA9IDA7CisKKyAgcDBfZGF0YV8xWzBdID0gTlVMTDsKKyAgcDBfZGF0YV8xWzFdID0gTlVMTDsKKyAgcDBfZGF0YV8yWzBdID0gTlVMTDsKKyAgcDBfZGF0YV8yWzFdID0gTlVMTDsKKworICBpZiAoaW5fZGF0YV8xICE9IE5VTEwpIHsKKyAgICBpZiAoZGlmZl90eXBlXzEgPT0gRElGRl9GUkVRKSB7CisgICAgICBwMF9kYXRhXzFbMF0gPSAmaW5fZGF0YV8xWzBdOworICAgICAgcDBfZGF0YV8xWzFdID0gTlVMTDsKKworICAgICAgbnVtX3ZhbF8xX3Nob3J0IC09IDE7CisgICAgICBpbl9kYXRhXzFfc2hvcnQgKz0gMTsKKyAgICB9CisKKyAgICBkZl9yZXN0X2ZsYWdbMF0gPSBudW1fdmFsXzFfc2hvcnQgJSAyOworCisgICAgaWYgKGRmX3Jlc3RfZmxhZ1swXSkgbnVtX3ZhbF8xX3Nob3J0IC09IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbF8xX3Nob3J0IC0gMTsgaSArPSAyKSB7CisgICAgICBwYWlyX3ZlY1tpXVswXSA9IGluX2RhdGFfMV9zaG9ydFtpXTsKKyAgICAgIHBhaXJfdmVjW2ldWzFdID0gaW5fZGF0YV8xX3Nob3J0W2kgKyAxXTsKKworICAgICAgbGF2X2ZwWzBdID0gRkRLbWF4KGxhdl9mcFswXSwgZkFicyhwYWlyX3ZlY1tpXVswXSkpOworICAgICAgbGF2X2ZwWzBdID0gRkRLbWF4KGxhdl9mcFswXSwgZkFicyhwYWlyX3ZlY1tpXVsxXSkpOworICAgIH0KKworICAgIHRhYl9pZHhfMkRbMF1bMF0gPSAoZGlmZl90eXBlXzEgPT0gRElGRl9USU1FKSA/IDEgOiAwOworICAgIHRhYl9pZHhfMkRbMF1bMV0gPSAwOworCisgICAgdGFiX2lkeF8xRFswXSA9IChkaWZmX3R5cGVfMSA9PSBESUZGX0ZSRVEpID8gMCA6IDE7CisKKyAgICBsYXZfZnBbMF0gPSBnZXRfbmV4dF9sYXZfc3RlcChsYXZfZnBbMF0sIGRhdGFfdHlwZSk7CisKKyAgICBpZiAobGF2X2ZwWzBdICE9IC0xKSBiaXRfY291bnRfMkRfZnJlcSArPSBsYXZIdWZmTGVuW2xhdl9mcFswXV07CisgIH0KKworICBpZiAoaW5fZGF0YV8yICE9IE5VTEwpIHsKKyAgICBpZiAoZGlmZl90eXBlXzIgPT0gRElGRl9GUkVRKSB7CisgICAgICBwMF9kYXRhXzJbMF0gPSBOVUxMOworICAgICAgcDBfZGF0YV8yWzFdID0gJmluX2RhdGFfMlswXTsKKworICAgICAgbnVtX3ZhbF8yX3Nob3J0IC09IDE7CisgICAgICBpbl9kYXRhXzJfc2hvcnQgKz0gMTsKKyAgICB9CisKKyAgICBkZl9yZXN0X2ZsYWdbMV0gPSBudW1fdmFsXzJfc2hvcnQgJSAyOworCisgICAgaWYgKGRmX3Jlc3RfZmxhZ1sxXSkgbnVtX3ZhbF8yX3Nob3J0IC09IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbF8yX3Nob3J0IC0gMTsgaSArPSAyKSB7CisgICAgICBwYWlyX3ZlY1tpICsgMV1bMF0gPSBpbl9kYXRhXzJfc2hvcnRbaV07CisgICAgICBwYWlyX3ZlY1tpICsgMV1bMV0gPSBpbl9kYXRhXzJfc2hvcnRbaSArIDFdOworCisgICAgICBsYXZfZnBbMV0gPSBGREttYXgobGF2X2ZwWzFdLCBmQWJzKHBhaXJfdmVjW2kgKyAxXVswXSkpOworICAgICAgbGF2X2ZwWzFdID0gRkRLbWF4KGxhdl9mcFsxXSwgZkFicyhwYWlyX3ZlY1tpICsgMV1bMV0pKTsKKyAgICB9CisKKyAgICB0YWJfaWR4XzJEWzFdWzBdID0gKGRpZmZfdHlwZV8yID09IERJRkZfVElNRSkgPyAxIDogMDsKKyAgICB0YWJfaWR4XzJEWzFdWzFdID0gMDsKKworICAgIHRhYl9pZHhfMURbMV0gPSAoZGlmZl90eXBlXzIgPT0gRElGRl9GUkVRKSA/IDAgOiAxOworCisgICAgbGF2X2ZwWzFdID0gZ2V0X25leHRfbGF2X3N0ZXAobGF2X2ZwWzFdLCBkYXRhX3R5cGUpOworCisgICAgaWYgKGxhdl9mcFsxXSAhPSAtMSkgYml0X2NvdW50XzJEX2ZyZXEgKz0gbGF2SHVmZkxlbltsYXZfZnBbMV1dOworICB9CisKKyAgaWYgKChsYXZfZnBbMF0gIT0gLTEpICYmIChsYXZfZnBbMV0gIT0gLTEpKSB7CisgICAgaWYgKGluX2RhdGFfMSAhPSBOVUxMKSB7CisgICAgICBiaXRfY291bnRfMkRfZnJlcSArPQorICAgICAgICAgIGh1ZmZfZW5jXzJEKE5VTEwsIGRhdGFfdHlwZSwgdGFiX2lkeF8yRFswXSwgbGF2X2ZwWzBdLCBwYWlyX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICBudW1fdmFsXzFfc2hvcnQsIDIsIHAwX2RhdGFfMSk7CisgICAgfQorICAgIGlmIChpbl9kYXRhXzIgIT0gTlVMTCkgeworICAgICAgYml0X2NvdW50XzJEX2ZyZXEgKz0KKyAgICAgICAgICBodWZmX2VuY18yRChOVUxMLCBkYXRhX3R5cGUsIHRhYl9pZHhfMkRbMV0sIGxhdl9mcFsxXSwgcGFpcl92ZWMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgIG51bV92YWxfMl9zaG9ydCwgMiwgcDBfZGF0YV8yKTsKKyAgICB9CisgICAgaWYgKGluX2RhdGFfMSAhPSBOVUxMKSB7CisgICAgICBpZiAoZGZfcmVzdF9mbGFnWzBdKQorICAgICAgICBiaXRfY291bnRfMkRfZnJlcSArPQorICAgICAgICAgICAgaHVmZl9lbmNfMUQoTlVMTCwgZGF0YV90eXBlLCB0YWJfaWR4XzFEWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5fZGF0YV8xX3Nob3J0ICsgbnVtX3ZhbF8xX3Nob3J0LCAxLCAwKTsKKyAgICB9CisgICAgaWYgKGluX2RhdGFfMiAhPSBOVUxMKSB7CisgICAgICBpZiAoZGZfcmVzdF9mbGFnWzFdKQorICAgICAgICBiaXRfY291bnRfMkRfZnJlcSArPQorICAgICAgICAgICAgaHVmZl9lbmNfMUQoTlVMTCwgZGF0YV90eXBlLCB0YWJfaWR4XzFEWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5fZGF0YV8yX3Nob3J0ICsgbnVtX3ZhbF8yX3Nob3J0LCAxLCAwKTsKKyAgICB9CisKKyAgICBpZiAoYml0X2NvdW50XzJEX2ZyZXEgPCBiaXRfY291bnRfbWluKSB7CisgICAgICBiaXRfY291bnRfbWluID0gYml0X2NvdW50XzJEX2ZyZXE7CisgICAgICAqY2RnX3NjaGVtZSA9IEhVRkZfMkQgPDwgUEFJUl9TSElGVCB8IEZSRVFfUEFJUjsKKyAgICAgIGxhdl9pZHhbMF0gPSBsYXZfZnBbMF07CisgICAgICBsYXZfaWR4WzFdID0gbGF2X2ZwWzFdOworICAgIH0KKyAgfQorCisgIHJldHVybiBiaXRfY291bnRfbWluOworfQorCitzdGF0aWMgdm9pZCBhcHBseV9odWZmX2NvZGluZyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLCBTSE9SVCAqY29uc3QgaW5fZGF0YV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKmNvbnN0IGluX2RhdGFfMiwgY29uc3QgREFUQV9UWVBFIGRhdGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERJRkZfVFlQRSBkaWZmX3R5cGVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERJRkZfVFlQRSBkaWZmX3R5cGVfMiwgY29uc3QgU0hPUlQgbnVtX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpjb25zdCBsYXZfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgY2RnX3NjaGVtZSkgeworICBTSE9SVCB0YWJfaWR4XzJEWzJdWzJdID0ge3swfX07CisgIFNIT1JUIHRhYl9pZHhfMURbMl0gPSB7MH07CisgIFNIT1JUIGRmX3Jlc3RfZmxhZ1syXSA9IHswfTsKKyAgU0hPUlQgcDBfZmxhZ1syXSA9IHswfTsKKworICBTSE9SVCBwYWlyX3ZlY1tNQVhCQU5EU11bMl0gPSB7ezB9fTsKKworICBTSE9SVCAqcDBfZGF0YV8xWzJdID0ge05VTEx9OworICBTSE9SVCAqcDBfZGF0YV8yWzJdID0ge05VTEx9OworCisgIFNIT1JUIGkgPSAwOworCisgIFNIT1JUIG51bV92YWxfMV9zaG9ydCA9IG51bV92YWw7CisgIFNIT1JUIG51bV92YWxfMl9zaG9ydCA9IG51bV92YWw7CisKKyAgU0hPUlQgKmluX2RhdGFfMV9zaG9ydCA9IE5VTEw7CisgIFNIT1JUICppbl9kYXRhXzJfc2hvcnQgPSBOVUxMOworCisgIC8qIE9mZnNldCAqLworICBpZiAoaW5fZGF0YV8xICE9IE5VTEwpIHsKKyAgICBpbl9kYXRhXzFfc2hvcnQgPSBpbl9kYXRhXzEgKyBkaWZmX3R5cGVfb2Zmc2V0KGRpZmZfdHlwZV8xKTsKKyAgfQorICBpZiAoaW5fZGF0YV8yICE9IE5VTEwpIHsKKyAgICBpbl9kYXRhXzJfc2hvcnQgPSBpbl9kYXRhXzIgKyBkaWZmX3R5cGVfb2Zmc2V0KGRpZmZfdHlwZV8yKTsKKyAgfQorCisgIC8qIFNpZ25hbGl6ZSBjb2Rpbmcgc2NoZW1lICovCisgIEZES3dyaXRlQml0cyhzdHJtLCBjZGdfc2NoZW1lID4+IFBBSVJfU0hJRlQsIDEpOworCisgIHN3aXRjaCAoY2RnX3NjaGVtZSA+PiBQQUlSX1NISUZUKSB7CisgICAgY2FzZSBIVUZGXzFEOgorCisgICAgICBwMF9mbGFnWzBdID0gKGRpZmZfdHlwZV8xID09IERJRkZfRlJFUSk7CisgICAgICBwMF9mbGFnWzFdID0gKGRpZmZfdHlwZV8yID09IERJRkZfRlJFUSk7CisKKyAgICAgIHRhYl9pZHhfMURbMF0gPSAoZGlmZl90eXBlXzEgPT0gRElGRl9GUkVRKSA/IDAgOiAxOworICAgICAgdGFiX2lkeF8xRFsxXSA9IChkaWZmX3R5cGVfMiA9PSBESUZGX0ZSRVEpID8gMCA6IDE7CisKKyAgICAgIGlmIChpbl9kYXRhXzEgIT0gTlVMTCkgeworICAgICAgICBodWZmX2VuY18xRChzdHJtLCBkYXRhX3R5cGUsIHRhYl9pZHhfMURbMF0sIGluX2RhdGFfMV9zaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbF8xX3Nob3J0LCBwMF9mbGFnWzBdKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbl9kYXRhXzIgIT0gTlVMTCkgeworICAgICAgICBodWZmX2VuY18xRChzdHJtLCBkYXRhX3R5cGUsIHRhYl9pZHhfMURbMV0sIGluX2RhdGFfMl9zaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbF8yX3Nob3J0LCBwMF9mbGFnWzFdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOyAvKiBIVUZGXzFEICovCisKKyAgICBjYXNlIEhVRkZfMkQ6CisKKyAgICAgIHN3aXRjaCAoY2RnX3NjaGVtZSAmIFBBSVJfTUFTSykgeworICAgICAgICBjYXNlIEZSRVFfUEFJUjoKKworICAgICAgICAgIGlmIChpbl9kYXRhXzEgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGRpZmZfdHlwZV8xID09IERJRkZfRlJFUSkgeworICAgICAgICAgICAgICBwMF9kYXRhXzFbMF0gPSAmaW5fZGF0YV8xWzBdOworICAgICAgICAgICAgICBwMF9kYXRhXzFbMV0gPSBOVUxMOworCisgICAgICAgICAgICAgIG51bV92YWxfMV9zaG9ydCAtPSAxOworICAgICAgICAgICAgICBpbl9kYXRhXzFfc2hvcnQgKz0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGZfcmVzdF9mbGFnWzBdID0gbnVtX3ZhbF8xX3Nob3J0ICUgMjsKKworICAgICAgICAgICAgaWYgKGRmX3Jlc3RfZmxhZ1swXSkgbnVtX3ZhbF8xX3Nob3J0IC09IDE7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsXzFfc2hvcnQgLSAxOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgcGFpcl92ZWNbaV1bMF0gPSBpbl9kYXRhXzFfc2hvcnRbaV07CisgICAgICAgICAgICAgIHBhaXJfdmVjW2ldWzFdID0gaW5fZGF0YV8xX3Nob3J0W2kgKyAxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFiX2lkeF8yRFswXVswXSA9IChkaWZmX3R5cGVfMSA9PSBESUZGX1RJTUUpID8gMSA6IDA7CisgICAgICAgICAgICB0YWJfaWR4XzJEWzBdWzFdID0gMDsKKworICAgICAgICAgICAgdGFiX2lkeF8xRFswXSA9IChkaWZmX3R5cGVfMSA9PSBESUZGX0ZSRVEpID8gMCA6IDE7CisgICAgICAgICAgfSAvKiBpZiggaW5fZGF0YV8xICE9IE5VTEwgKSAqLworCisgICAgICAgICAgaWYgKGluX2RhdGFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZGlmZl90eXBlXzIgPT0gRElGRl9GUkVRKSB7CisgICAgICAgICAgICAgIHAwX2RhdGFfMlswXSA9IE5VTEw7CisgICAgICAgICAgICAgIHAwX2RhdGFfMlsxXSA9ICZpbl9kYXRhXzJbMF07CisKKyAgICAgICAgICAgICAgbnVtX3ZhbF8yX3Nob3J0IC09IDE7CisgICAgICAgICAgICAgIGluX2RhdGFfMl9zaG9ydCArPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZl9yZXN0X2ZsYWdbMV0gPSBudW1fdmFsXzJfc2hvcnQgJSAyOworCisgICAgICAgICAgICBpZiAoZGZfcmVzdF9mbGFnWzFdKSBudW1fdmFsXzJfc2hvcnQgLT0gMTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV92YWxfMl9zaG9ydCAtIDE7IGkgKz0gMikgeworICAgICAgICAgICAgICBwYWlyX3ZlY1tpICsgMV1bMF0gPSBpbl9kYXRhXzJfc2hvcnRbaV07CisgICAgICAgICAgICAgIHBhaXJfdmVjW2kgKyAxXVsxXSA9IGluX2RhdGFfMl9zaG9ydFtpICsgMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRhYl9pZHhfMkRbMV1bMF0gPSAoZGlmZl90eXBlXzIgPT0gRElGRl9USU1FKSA/IDEgOiAwOworICAgICAgICAgICAgdGFiX2lkeF8yRFsxXVsxXSA9IDA7CisKKyAgICAgICAgICAgIHRhYl9pZHhfMURbMV0gPSAoZGlmZl90eXBlXzIgPT0gRElGRl9GUkVRKSA/IDAgOiAxOworICAgICAgICAgIH0gLyogaWYoIGluX2RhdGFfMiAhPSBOVUxMICkgKi8KKworICAgICAgICAgIGlmIChpbl9kYXRhXzEgIT0gTlVMTCkgeworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKHN0cm0sIGxhdkh1ZmZWYWxbbGF2X2lkeFswXV0sIGxhdkh1ZmZMZW5bbGF2X2lkeFswXV0pOworICAgICAgICAgICAgaHVmZl9lbmNfMkQoc3RybSwgZGF0YV90eXBlLCB0YWJfaWR4XzJEWzBdLCBsYXZfaWR4WzBdLCBwYWlyX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YWxfMV9zaG9ydCwgMiwgcDBfZGF0YV8xKTsKKyAgICAgICAgICAgIGlmIChkZl9yZXN0X2ZsYWdbMF0pIHsKKyAgICAgICAgICAgICAgaHVmZl9lbmNfMUQoc3RybSwgZGF0YV90eXBlLCB0YWJfaWR4XzFEWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9kYXRhXzFfc2hvcnQgKyBudW1fdmFsXzFfc2hvcnQsIDEsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaW5fZGF0YV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEZES3dyaXRlQml0cyhzdHJtLCBsYXZIdWZmVmFsW2xhdl9pZHhbMV1dLCBsYXZIdWZmTGVuW2xhdl9pZHhbMV1dKTsKKyAgICAgICAgICAgIGh1ZmZfZW5jXzJEKHN0cm0sIGRhdGFfdHlwZSwgdGFiX2lkeF8yRFsxXSwgbGF2X2lkeFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJfdmVjICsgMSwgbnVtX3ZhbF8yX3Nob3J0LCAyLCBwMF9kYXRhXzIpOworICAgICAgICAgICAgaWYgKGRmX3Jlc3RfZmxhZ1sxXSkgeworICAgICAgICAgICAgICBodWZmX2VuY18xRChzdHJtLCBkYXRhX3R5cGUsIHRhYl9pZHhfMURbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2RhdGFfMl9zaG9ydCArIG51bV92YWxfMl9zaG9ydCwgMSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOyAvKiBGUkVRX1BBSVIgKi8KKworICAgICAgICBjYXNlIFRJTUVfUEFJUjoKKworICAgICAgICAgIGlmICgoZGlmZl90eXBlXzEgPT0gRElGRl9GUkVRKSB8fCAoZGlmZl90eXBlXzIgPT0gRElGRl9GUkVRKSkgeworICAgICAgICAgICAgcDBfZGF0YV8xWzBdID0gJmluX2RhdGFfMVswXTsKKyAgICAgICAgICAgIHAwX2RhdGFfMVsxXSA9ICZpbl9kYXRhXzJbMF07CisKKyAgICAgICAgICAgIGluX2RhdGFfMV9zaG9ydCArPSAxOworICAgICAgICAgICAgaW5fZGF0YV8yX3Nob3J0ICs9IDE7CisKKyAgICAgICAgICAgIG51bV92YWxfMV9zaG9ydCAtPSAxOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsXzFfc2hvcnQ7IGkrKykgeworICAgICAgICAgICAgcGFpcl92ZWNbaV1bMF0gPSBpbl9kYXRhXzFfc2hvcnRbaV07CisgICAgICAgICAgICBwYWlyX3ZlY1tpXVsxXSA9IGluX2RhdGFfMl9zaG9ydFtpXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB0YWJfaWR4XzJEWzBdWzBdID0KKyAgICAgICAgICAgICAgKChkaWZmX3R5cGVfMSA9PSBESUZGX1RJTUUpIHx8IChkaWZmX3R5cGVfMiA9PSBESUZGX1RJTUUpKSA/IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgICAgdGFiX2lkeF8yRFswXVsxXSA9IDE7CisKKyAgICAgICAgICBGREt3cml0ZUJpdHMoc3RybSwgbGF2SHVmZlZhbFtsYXZfaWR4WzBdXSwgbGF2SHVmZkxlbltsYXZfaWR4WzBdXSk7CisKKyAgICAgICAgICBodWZmX2VuY18yRChzdHJtLCBkYXRhX3R5cGUsIHRhYl9pZHhfMkRbMF0sIGxhdl9pZHhbMF0sIHBhaXJfdmVjLAorICAgICAgICAgICAgICAgICAgICAgIG51bV92YWxfMV9zaG9ydCwgMSwgcDBfZGF0YV8xKTsKKworICAgICAgICAgIGJyZWFrOyAvKiBUSU1FX1BBSVIgKi8KKyAgICAgIH0gICAgICAgICAgLyogc3dpdGNoKCBjZGdfc2NoZW1lICYgUEFJUl9NQVNLICkgKi8KKworICAgICAgYnJlYWs7IC8qIEhVRkZfMkQgKi8KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfSAvKiBzd2l0Y2goIGNkZ19zY2hlbWUgPj4gUEFJUl9TSElGVCApICovCit9CisKK0lOVCBmZGtfc2FjZW5jX2VjRGF0YVBhaXJFbmMoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgYWFJbkRhdGFbXVtNQVhCQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIGFIaXN0b3J5W01BWEJBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREFUQV9UWVBFIGRhdGFfdHlwZSwgY29uc3QgSU5UIHNldElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN0YXJ0QmFuZCwgY29uc3QgSU5UIGRhdGFCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGNvYXJzZV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaW5kZXBlbmRlbmN5X2ZsYWcpIHsKKyAgU0hPUlQgcmVzZXQgPSAwLCBwYiA9IDA7CisgIFNIT1JUIHF1YW50X2xldmVscyA9IDAsIHF1YW50X29mZnNldCA9IDAsIG51bV9wY21fdmFsID0gMDsKKworICBTSE9SVCBzcGxpdExzYl9mbGFnID0gMDsKKyAgU0hPUlQgcGNtQ29kaW5nX2ZsYWcgPSAwOworCisgIFNIT1JUIGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcgPSAhaW5kZXBlbmRlbmN5X2ZsYWcgfHwgKHNldElkeCA+IDApOworCisgIFNIT1JUIG51bV9sc2JfYml0cyA9IC0xOworICBTSE9SVCBudW1fcGNtX2JpdHMgPSAtMTsKKworICBTSE9SVCBxdWFudF9kYXRhX2xzYlsyXVtNQVhCQU5EU107CisgIFNIT1JUIHF1YW50X2RhdGFfbXNiWzJdW01BWEJBTkRTXTsKKworICBTSE9SVCBxdWFudF9kYXRhX2hpc3RfbHNiW01BWEJBTkRTXTsKKyAgU0hPUlQgcXVhbnRfZGF0YV9oaXN0X21zYltNQVhCQU5EU107CisKKyAgU0hPUlQgZGF0YV9kaWZmX2ZyZXFbMl1bTUFYQkFORFNdOworICBTSE9SVCBkYXRhX2RpZmZfdGltZVsyXVtNQVhCQU5EUyArIDJdOworCisgIFNIT1JUICpwX3F1YW50X2RhdGFfbXNiWzJdOworICBTSE9SVCAqcF9xdWFudF9kYXRhX2hpc3RfbXNiID0gTlVMTDsKKworICBTSE9SVCBtaW5fYml0c19hbGwgPSAwOworICBTSE9SVCBtaW5fZm91bmQgPSAwOworCisgIFNIT1JUIG1pbl9iaXRzX2RmX2RmID0gLTE7CisgIFNIT1JUIG1pbl9iaXRzX2RmX2R0ID0gLTE7CisgIFNIT1JUIG1pbl9iaXRzX2R0YndfZGYgPSAtMTsKKyAgU0hPUlQgbWluX2JpdHNfZHRfZHQgPSAtMTsKKworICBTSE9SVCBsYXZfZGZfZGZbMl0gPSB7LTEsIC0xfTsKKyAgU0hPUlQgbGF2X2RmX2R0WzJdID0gey0xLCAtMX07CisgIFNIT1JUIGxhdl9kdGJ3X2RmWzJdID0gey0xLCAtMX07CisgIFNIT1JUIGxhdl9kdF9kdFsyXSA9IHstMSwgLTF9OworCisgIFNIT1JUIGNvZGluZ19zY2hlbWVfZGZfZGYgPSAwOworICBTSE9SVCBjb2Rpbmdfc2NoZW1lX2RmX2R0ID0gMDsKKyAgU0hPUlQgY29kaW5nX3NjaGVtZV9kdGJ3X2RmID0gMDsKKyAgU0hPUlQgY29kaW5nX3NjaGVtZV9kdF9kdCA9IDA7CisKKyAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICBjYXNlIHRfQ0xEOgorICAgICAgaWYgKGNvYXJzZV9mbGFnKSB7CisgICAgICAgIHNwbGl0THNiX2ZsYWcgPSAwOworICAgICAgICBxdWFudF9sZXZlbHMgPSAxNTsKKyAgICAgICAgcXVhbnRfb2Zmc2V0ID0gNzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNwbGl0THNiX2ZsYWcgPSAwOworICAgICAgICBxdWFudF9sZXZlbHMgPSAzMTsKKyAgICAgICAgcXVhbnRfb2Zmc2V0ID0gMTU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfSUNDOgorICAgICAgaWYgKGNvYXJzZV9mbGFnKSB7CisgICAgICAgIHNwbGl0THNiX2ZsYWcgPSAwOworICAgICAgICBxdWFudF9sZXZlbHMgPSA0OworICAgICAgICBxdWFudF9vZmZzZXQgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3BsaXRMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDg7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfSAvKiBzd2l0Y2goIGRhdGFfdHlwZSApICovCisKKyAgLyogU3BsaXQgb2ZmIExTQiAqLworICBpZiAoc3BsaXRMc2JfZmxhZykgeworICAgIHNwbGl0X2xzYihhYUluRGF0YVtzZXRJZHhdICsgc3RhcnRCYW5kLCBxdWFudF9vZmZzZXQsIGRhdGFCYW5kcywKKyAgICAgICAgICAgICAgcXVhbnRfZGF0YV9sc2JbMF0sIHF1YW50X2RhdGFfbXNiWzBdKTsKKworICAgIHNwbGl0X2xzYihhYUluRGF0YVtzZXRJZHggKyAxXSArIHN0YXJ0QmFuZCwgcXVhbnRfb2Zmc2V0LCBkYXRhQmFuZHMsCisgICAgICAgICAgICAgIHF1YW50X2RhdGFfbHNiWzFdLCBxdWFudF9kYXRhX21zYlsxXSk7CisKKyAgICBwX3F1YW50X2RhdGFfbXNiWzBdID0gcXVhbnRfZGF0YV9tc2JbMF07CisgICAgcF9xdWFudF9kYXRhX21zYlsxXSA9IHF1YW50X2RhdGFfbXNiWzFdOworCisgICAgbnVtX2xzYl9iaXRzID0gMiAqIGRhdGFCYW5kczsKKyAgfSBlbHNlIGlmIChxdWFudF9vZmZzZXQgIT0gMCkgeworICAgIGZvciAocGIgPSAwOyBwYiA8IGRhdGFCYW5kczsgcGIrKykgeworICAgICAgcXVhbnRfZGF0YV9tc2JbMF1bcGJdID0gYWFJbkRhdGFbc2V0SWR4XVtzdGFydEJhbmQgKyBwYl0gKyBxdWFudF9vZmZzZXQ7CisgICAgICBxdWFudF9kYXRhX21zYlsxXVtwYl0gPQorICAgICAgICAgIGFhSW5EYXRhW3NldElkeCArIDFdW3N0YXJ0QmFuZCArIHBiXSArIHF1YW50X29mZnNldDsKKyAgICB9CisKKyAgICBwX3F1YW50X2RhdGFfbXNiWzBdID0gcXVhbnRfZGF0YV9tc2JbMF07CisgICAgcF9xdWFudF9kYXRhX21zYlsxXSA9IHF1YW50X2RhdGFfbXNiWzFdOworCisgICAgbnVtX2xzYl9iaXRzID0gMDsKKyAgfSBlbHNlIHsKKyAgICBwX3F1YW50X2RhdGFfbXNiWzBdID0gYWFJbkRhdGFbc2V0SWR4XSArIHN0YXJ0QmFuZDsKKyAgICBwX3F1YW50X2RhdGFfbXNiWzFdID0gYWFJbkRhdGFbc2V0SWR4ICsgMV0gKyBzdGFydEJhbmQ7CisKKyAgICBudW1fbHNiX2JpdHMgPSAwOworICB9CisKKyAgaWYgKGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcpIHsKKyAgICBpZiAoc3BsaXRMc2JfZmxhZykgeworICAgICAgc3BsaXRfbHNiKGFIaXN0b3J5ICsgc3RhcnRCYW5kLCBxdWFudF9vZmZzZXQsIGRhdGFCYW5kcywKKyAgICAgICAgICAgICAgICBxdWFudF9kYXRhX2hpc3RfbHNiLCBxdWFudF9kYXRhX2hpc3RfbXNiKTsKKworICAgICAgcF9xdWFudF9kYXRhX2hpc3RfbXNiID0gcXVhbnRfZGF0YV9oaXN0X21zYjsKKyAgICB9IGVsc2UgaWYgKHF1YW50X29mZnNldCAhPSAwKSB7CisgICAgICBmb3IgKHBiID0gMDsgcGIgPCBkYXRhQmFuZHM7IHBiKyspIHsKKyAgICAgICAgcXVhbnRfZGF0YV9oaXN0X21zYltwYl0gPSBhSGlzdG9yeVtzdGFydEJhbmQgKyBwYl0gKyBxdWFudF9vZmZzZXQ7CisgICAgICB9CisgICAgICBwX3F1YW50X2RhdGFfaGlzdF9tc2IgPSBxdWFudF9kYXRhX2hpc3RfbXNiOworICAgIH0gZWxzZSB7CisgICAgICBwX3F1YW50X2RhdGFfaGlzdF9tc2IgPSBhSGlzdG9yeSArIHN0YXJ0QmFuZDsKKyAgICB9CisgIH0KKworICAvKiBDYWxjdWxhdGUgZnJlcXVlbmN5IGRpZmZlcmVuY2VzICovCisgIGNhbGNfZGlmZl9mcmVxKHBfcXVhbnRfZGF0YV9tc2JbMF0sIGRhdGFfZGlmZl9mcmVxWzBdLCBkYXRhQmFuZHMpOworCisgIGNhbGNfZGlmZl9mcmVxKHBfcXVhbnRfZGF0YV9tc2JbMV0sIGRhdGFfZGlmZl9mcmVxWzFdLCBkYXRhQmFuZHMpOworCisgIC8qIENhbGN1bGF0ZSB0aW1lIGRpZmZlcmVuY2VzICovCisgIGlmIChhbGxvd0RpZmZUaW1lQmFja19mbGFnKSB7CisgICAgY2FsY19kaWZmX3RpbWUocF9xdWFudF9kYXRhX21zYlswXSwgcF9xdWFudF9kYXRhX2hpc3RfbXNiLAorICAgICAgICAgICAgICAgICAgIGRhdGFfZGlmZl90aW1lWzBdLCBkYXRhQmFuZHMpOworICB9CisKKyAgY2FsY19kaWZmX3RpbWUocF9xdWFudF9kYXRhX21zYlsxXSwgcF9xdWFudF9kYXRhX21zYlswXSwgZGF0YV9kaWZmX3RpbWVbMV0sCisgICAgICAgICAgICAgICAgIGRhdGFCYW5kcyk7CisKKyAgLyogQ2FsY3VsYXRlIGNvZGluZyBzY2hlbWUgd2l0aCBtaW51bXVtIGJpdCBjb25zdW1wdGlvbiAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBudW1fcGNtX2JpdHMgPSBjYWxjX3BjbV9iaXRzKDIgKiBkYXRhQmFuZHMsIHF1YW50X2xldmVscyk7CisgIG51bV9wY21fdmFsID0gMiAqIGRhdGFCYW5kczsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBtaW5fYml0c19hbGwgPSBudW1fcGNtX2JpdHM7CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBtaW5fYml0c19kZl9kZiA9CisgICAgICBjYWxjX2h1ZmZfYml0cyhkYXRhX2RpZmZfZnJlcVswXSwgZGF0YV9kaWZmX2ZyZXFbMV0sIGRhdGFfdHlwZSwgRElGRl9GUkVRLAorICAgICAgICAgICAgICAgICAgICAgRElGRl9GUkVRLCBkYXRhQmFuZHMsIGxhdl9kZl9kZiwgJmNvZGluZ19zY2hlbWVfZGZfZGYpOworCisgIG1pbl9iaXRzX2RmX2RmICs9IDI7CisKKyAgbWluX2JpdHNfZGZfZGYgKz0gbnVtX2xzYl9iaXRzOworCisgIGlmIChtaW5fYml0c19kZl9kZiA8IG1pbl9iaXRzX2FsbCkgeworICAgIG1pbl9iaXRzX2FsbCA9IG1pbl9iaXRzX2RmX2RmOworICB9CisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBtaW5fYml0c19kZl9kdCA9CisgICAgICBjYWxjX2h1ZmZfYml0cyhkYXRhX2RpZmZfZnJlcVswXSwgZGF0YV9kaWZmX3RpbWVbMV0sIGRhdGFfdHlwZSwgRElGRl9GUkVRLAorICAgICAgICAgICAgICAgICAgICAgRElGRl9USU1FLCBkYXRhQmFuZHMsIGxhdl9kZl9kdCwgJmNvZGluZ19zY2hlbWVfZGZfZHQpOworCisgIG1pbl9iaXRzX2RmX2R0ICs9IDI7CisKKyAgbWluX2JpdHNfZGZfZHQgKz0gbnVtX2xzYl9iaXRzOworCisgIGlmIChtaW5fYml0c19kZl9kdCA8IG1pbl9iaXRzX2FsbCkgeworICAgIG1pbl9iaXRzX2FsbCA9IG1pbl9iaXRzX2RmX2R0OworICB9CisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBpZiAoYWxsb3dEaWZmVGltZUJhY2tfZmxhZykgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIG1pbl9iaXRzX2R0YndfZGYgPSBjYWxjX2h1ZmZfYml0cygKKyAgICAgICAgZGF0YV9kaWZmX3RpbWVbMF0sIGRhdGFfZGlmZl9mcmVxWzFdLCBkYXRhX3R5cGUsIERJRkZfVElNRSwgRElGRl9GUkVRLAorICAgICAgICBkYXRhQmFuZHMsIGxhdl9kdGJ3X2RmLCAmY29kaW5nX3NjaGVtZV9kdGJ3X2RmKTsKKworICAgIG1pbl9iaXRzX2R0YndfZGYgKz0gMjsKKworICAgIG1pbl9iaXRzX2R0YndfZGYgKz0gbnVtX2xzYl9iaXRzOworCisgICAgaWYgKG1pbl9iaXRzX2R0YndfZGYgPCBtaW5fYml0c19hbGwpIHsKKyAgICAgIG1pbl9iaXRzX2FsbCA9IG1pbl9iaXRzX2R0YndfZGY7CisgICAgfQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbWluX2JpdHNfZHRfZHQgPSBjYWxjX2h1ZmZfYml0cyhkYXRhX2RpZmZfdGltZVswXSwgZGF0YV9kaWZmX3RpbWVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGUsIERJRkZfVElNRSwgRElGRl9USU1FLCBkYXRhQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXZfZHRfZHQsICZjb2Rpbmdfc2NoZW1lX2R0X2R0KTsKKworICAgIG1pbl9iaXRzX2R0X2R0ICs9IDI7CisKKyAgICBtaW5fYml0c19kdF9kdCArPSBudW1fbHNiX2JpdHM7CisKKyAgICBpZiAobWluX2JpdHNfZHRfZHQgPCBtaW5fYml0c19hbGwpIHsKKyAgICAgIG1pbl9iaXRzX2FsbCA9IG1pbl9iaXRzX2R0X2R0OworICAgIH0KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB9IC8qIGlmKCBhbGxvd0RpZmZUaW1lQmFja19mbGFnICkgKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiBTdGFydCBhY3R1YWwgY29kaW5nIG5vdyAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIFBDTSBvciBEaWZmL0h1ZmYgQ29kaW5nPyAqLworICBwY21Db2RpbmdfZmxhZyA9IChtaW5fYml0c19hbGwgPT0gbnVtX3BjbV9iaXRzKTsKKworICBGREt3cml0ZUJpdHMoc3RybSwgcGNtQ29kaW5nX2ZsYWcsIDEpOworCisgIGlmIChwY21Db2RpbmdfZmxhZykgeworICAgIC8qIEdyb3VwZWQgUENNIENvZGluZyAqLworICAgIGFwcGx5X3BjbV9jb2Rpbmcoc3RybSwgYWFJbkRhdGFbc2V0SWR4XSArIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgIGFhSW5EYXRhW3NldElkeCArIDFdICsgc3RhcnRCYW5kLCBxdWFudF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBudW1fcGNtX3ZhbCwgcXVhbnRfbGV2ZWxzKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBEaWZmL0h1ZmYgQ29kaW5nICovCisKKyAgICBtaW5fZm91bmQgPSAwOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKG1pbl9iaXRzX2FsbCA9PSBtaW5fYml0c19kZl9kZikgeworICAgICAgRkRLd3JpdGVCaXRzKHN0cm0sIERJRkZfRlJFUSwgMSk7CisgICAgICBGREt3cml0ZUJpdHMoc3RybSwgRElGRl9GUkVRLCAxKTsKKworICAgICAgYXBwbHlfaHVmZl9jb2Rpbmcoc3RybSwgZGF0YV9kaWZmX2ZyZXFbMF0sIGRhdGFfZGlmZl9mcmVxWzFdLCBkYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0ZSRVEsIERJRkZfRlJFUSwgZGF0YUJhbmRzLCBsYXZfZGZfZGYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2Rpbmdfc2NoZW1lX2RmX2RmKTsKKworICAgICAgbWluX2ZvdW5kID0gMTsKKyAgICB9CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoIW1pbl9mb3VuZCAmJiAobWluX2JpdHNfYWxsID09IG1pbl9iaXRzX2RmX2R0KSkgeworICAgICAgRkRLd3JpdGVCaXRzKHN0cm0sIERJRkZfRlJFUSwgMSk7CisgICAgICBGREt3cml0ZUJpdHMoc3RybSwgRElGRl9USU1FLCAxKTsKKworICAgICAgYXBwbHlfaHVmZl9jb2Rpbmcoc3RybSwgZGF0YV9kaWZmX2ZyZXFbMF0sIGRhdGFfZGlmZl90aW1lWzFdLCBkYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0ZSRVEsIERJRkZfVElNRSwgZGF0YUJhbmRzLCBsYXZfZGZfZHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2Rpbmdfc2NoZW1lX2RmX2R0KTsKKworICAgICAgbWluX2ZvdW5kID0gMTsKKyAgICB9CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChhbGxvd0RpZmZUaW1lQmFja19mbGFnKSB7CisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgIGlmICghbWluX2ZvdW5kICYmIChtaW5fYml0c19hbGwgPT0gbWluX2JpdHNfZHRid19kZikpIHsKKyAgICAgICAgRkRLd3JpdGVCaXRzKHN0cm0sIERJRkZfVElNRSwgMSk7CisgICAgICAgIEZES3dyaXRlQml0cyhzdHJtLCBESUZGX0ZSRVEsIDEpOworCisgICAgICAgIGFwcGx5X2h1ZmZfY29kaW5nKHN0cm0sIGRhdGFfZGlmZl90aW1lWzBdLCBkYXRhX2RpZmZfZnJlcVsxXSwgZGF0YV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX1RJTUUsIERJRkZfRlJFUSwgZGF0YUJhbmRzLCBsYXZfZHRid19kZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nX3NjaGVtZV9kdGJ3X2RmKTsKKworICAgICAgICBtaW5fZm91bmQgPSAxOworICAgICAgfQorICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgaWYgKCFtaW5fZm91bmQgJiYgKG1pbl9iaXRzX2FsbCA9PSBtaW5fYml0c19kdF9kdCkpIHsKKyAgICAgICAgRkRLd3JpdGVCaXRzKHN0cm0sIERJRkZfVElNRSwgMSk7CisgICAgICAgIEZES3dyaXRlQml0cyhzdHJtLCBESUZGX1RJTUUsIDEpOworCisgICAgICAgIGFwcGx5X2h1ZmZfY29kaW5nKHN0cm0sIGRhdGFfZGlmZl90aW1lWzBdLCBkYXRhX2RpZmZfdGltZVsxXSwgZGF0YV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX1RJTUUsIERJRkZfVElNRSwgZGF0YUJhbmRzLCBsYXZfZHRfZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGluZ19zY2hlbWVfZHRfZHQpOworICAgICAgfQorICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICB9IC8qIGlmKCBhbGxvd0RpZmZUaW1lQmFja19mbGFnICkgKi8KKworICAgIC8qIExTQiBjb2RpbmcgKi8KKyAgICBpZiAoc3BsaXRMc2JfZmxhZykgeworICAgICAgYXBwbHlfbHNiX2NvZGluZyhzdHJtLCBxdWFudF9kYXRhX2xzYlswXSwgMSwgZGF0YUJhbmRzKTsKKworICAgICAgYXBwbHlfbHNiX2NvZGluZyhzdHJtLCBxdWFudF9kYXRhX2xzYlsxXSwgMSwgZGF0YUJhbmRzKTsKKyAgICB9CisKKyAgfSAvKiBEaWZmL0h1ZmYvTFNCIGNvZGluZyAqLworCisgIHJldHVybiByZXNldDsKK30KKworSU5UIGZka19zYWNlbmNfZWNEYXRhU2luZ2xlRW5jKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgYWFJbkRhdGFbXVtNQVhCQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgYUhpc3RvcnlbTUFYQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERBVEFfVFlQRSBkYXRhX3R5cGUsIGNvbnN0IElOVCBzZXRJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN0YXJ0QmFuZCwgY29uc3QgSU5UIGRhdGFCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY29hcnNlX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGluZGVwZW5kZW5jeV9mbGFnKSB7CisgIFNIT1JUIHJlc2V0ID0gMCwgcGIgPSAwOworICBTSE9SVCBxdWFudF9sZXZlbHMgPSAwLCBxdWFudF9vZmZzZXQgPSAwLCBudW1fcGNtX3ZhbCA9IDA7CisKKyAgU0hPUlQgc3BsaXRMc2JfZmxhZyA9IDA7CisgIFNIT1JUIHBjbUNvZGluZ19mbGFnID0gMDsKKworICBTSE9SVCBhbGxvd0RpZmZUaW1lQmFja19mbGFnID0gIWluZGVwZW5kZW5jeV9mbGFnIHx8IChzZXRJZHggPiAwKTsKKworICBTSE9SVCBudW1fbHNiX2JpdHMgPSAtMTsKKyAgU0hPUlQgbnVtX3BjbV9iaXRzID0gLTE7CisKKyAgU0hPUlQgcXVhbnRfZGF0YV9sc2JbTUFYQkFORFNdOworICBTSE9SVCBxdWFudF9kYXRhX21zYltNQVhCQU5EU107CisKKyAgU0hPUlQgcXVhbnRfZGF0YV9oaXN0X2xzYltNQVhCQU5EU107CisgIFNIT1JUIHF1YW50X2RhdGFfaGlzdF9tc2JbTUFYQkFORFNdOworCisgIFNIT1JUIGRhdGFfZGlmZl9mcmVxW01BWEJBTkRTXTsKKyAgU0hPUlQgZGF0YV9kaWZmX3RpbWVbTUFYQkFORFMgKyAyXTsKKworICBTSE9SVCAqcF9xdWFudF9kYXRhX21zYjsKKyAgU0hPUlQgKnBfcXVhbnRfZGF0YV9oaXN0X21zYiA9IE5VTEw7CisKKyAgU0hPUlQgbWluX2JpdHNfYWxsID0gMDsKKyAgU0hPUlQgbWluX2ZvdW5kID0gMDsKKworICBTSE9SVCBtaW5fYml0c19kZiA9IC0xOworICBTSE9SVCBtaW5fYml0c19kdCA9IC0xOworCisgIFNIT1JUIGxhdl9kZlsyXSA9IHstMSwgLTF9OworICBTSE9SVCBsYXZfZHRbMl0gPSB7LTEsIC0xfTsKKworICBTSE9SVCBjb2Rpbmdfc2NoZW1lX2RmID0gMDsKKyAgU0hPUlQgY29kaW5nX3NjaGVtZV9kdCA9IDA7CisKKyAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICBjYXNlIHRfQ0xEOgorICAgICAgaWYgKGNvYXJzZV9mbGFnKSB7CisgICAgICAgIHNwbGl0THNiX2ZsYWcgPSAwOworICAgICAgICBxdWFudF9sZXZlbHMgPSAxNTsKKyAgICAgICAgcXVhbnRfb2Zmc2V0ID0gNzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNwbGl0THNiX2ZsYWcgPSAwOworICAgICAgICBxdWFudF9sZXZlbHMgPSAzMTsKKyAgICAgICAgcXVhbnRfb2Zmc2V0ID0gMTU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfSUNDOgorICAgICAgaWYgKGNvYXJzZV9mbGFnKSB7CisgICAgICAgIHNwbGl0THNiX2ZsYWcgPSAwOworICAgICAgICBxdWFudF9sZXZlbHMgPSA0OworICAgICAgICBxdWFudF9vZmZzZXQgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3BsaXRMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDg7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfSAvKiBzd2l0Y2goIGRhdGFfdHlwZSApICovCisKKyAgLyogU3BsaXQgb2ZmIExTQiAqLworICBpZiAoc3BsaXRMc2JfZmxhZykgeworICAgIHNwbGl0X2xzYihhYUluRGF0YVtzZXRJZHhdICsgc3RhcnRCYW5kLCBxdWFudF9vZmZzZXQsIGRhdGFCYW5kcywKKyAgICAgICAgICAgICAgcXVhbnRfZGF0YV9sc2IsIHF1YW50X2RhdGFfbXNiKTsKKworICAgIHBfcXVhbnRfZGF0YV9tc2IgPSBxdWFudF9kYXRhX21zYjsKKyAgICBudW1fbHNiX2JpdHMgPSBkYXRhQmFuZHM7CisgIH0gZWxzZSBpZiAocXVhbnRfb2Zmc2V0ICE9IDApIHsKKyAgICBmb3IgKHBiID0gMDsgcGIgPCBkYXRhQmFuZHM7IHBiKyspIHsKKyAgICAgIHF1YW50X2RhdGFfbXNiW3BiXSA9IGFhSW5EYXRhW3NldElkeF1bc3RhcnRCYW5kICsgcGJdICsgcXVhbnRfb2Zmc2V0OworICAgIH0KKworICAgIHBfcXVhbnRfZGF0YV9tc2IgPSBxdWFudF9kYXRhX21zYjsKKyAgICBudW1fbHNiX2JpdHMgPSAwOworICB9IGVsc2UgeworICAgIHBfcXVhbnRfZGF0YV9tc2IgPSBhYUluRGF0YVtzZXRJZHhdICsgc3RhcnRCYW5kOworICAgIG51bV9sc2JfYml0cyA9IDA7CisgIH0KKworICBpZiAoYWxsb3dEaWZmVGltZUJhY2tfZmxhZykgeworICAgIGlmIChzcGxpdExzYl9mbGFnKSB7CisgICAgICBzcGxpdF9sc2IoYUhpc3RvcnkgKyBzdGFydEJhbmQsIHF1YW50X29mZnNldCwgZGF0YUJhbmRzLAorICAgICAgICAgICAgICAgIHF1YW50X2RhdGFfaGlzdF9sc2IsIHF1YW50X2RhdGFfaGlzdF9tc2IpOworCisgICAgICBwX3F1YW50X2RhdGFfaGlzdF9tc2IgPSBxdWFudF9kYXRhX2hpc3RfbXNiOworICAgIH0gZWxzZSBpZiAocXVhbnRfb2Zmc2V0ICE9IDApIHsKKyAgICAgIGZvciAocGIgPSAwOyBwYiA8IGRhdGFCYW5kczsgcGIrKykgeworICAgICAgICBxdWFudF9kYXRhX2hpc3RfbXNiW3BiXSA9IGFIaXN0b3J5W3N0YXJ0QmFuZCArIHBiXSArIHF1YW50X29mZnNldDsKKyAgICAgIH0KKyAgICAgIHBfcXVhbnRfZGF0YV9oaXN0X21zYiA9IHF1YW50X2RhdGFfaGlzdF9tc2I7CisgICAgfSBlbHNlIHsKKyAgICAgIHBfcXVhbnRfZGF0YV9oaXN0X21zYiA9IGFIaXN0b3J5ICsgc3RhcnRCYW5kOworICAgIH0KKyAgfQorCisgIC8qIENhbGN1bGF0ZSBmcmVxdWVuY3kgZGlmZmVyZW5jZXMgKi8KKyAgY2FsY19kaWZmX2ZyZXEocF9xdWFudF9kYXRhX21zYiwgZGF0YV9kaWZmX2ZyZXEsIGRhdGFCYW5kcyk7CisKKyAgLyogQ2FsY3VsYXRlIHRpbWUgZGlmZmVyZW5jZXMgKi8KKyAgaWYgKGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcpIHsKKyAgICBjYWxjX2RpZmZfdGltZShwX3F1YW50X2RhdGFfbXNiLCBwX3F1YW50X2RhdGFfaGlzdF9tc2IsIGRhdGFfZGlmZl90aW1lLAorICAgICAgICAgICAgICAgICAgIGRhdGFCYW5kcyk7CisgIH0KKworICAvKiBDYWxjdWxhdGUgY29kaW5nIHNjaGVtZSB3aXRoIG1pbnVtdW0gYml0IGNvbnN1bXB0aW9uICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIG51bV9wY21fYml0cyA9IGNhbGNfcGNtX2JpdHMoZGF0YUJhbmRzLCBxdWFudF9sZXZlbHMpOworICBudW1fcGNtX3ZhbCA9IGRhdGFCYW5kczsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBtaW5fYml0c19hbGwgPSBudW1fcGNtX2JpdHM7CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBtaW5fYml0c19kZiA9IGNhbGNfaHVmZl9iaXRzKGRhdGFfZGlmZl9mcmVxLCBOVUxMLCBkYXRhX3R5cGUsIERJRkZfRlJFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0ZSRVEsIGRhdGFCYW5kcywgbGF2X2RmLCAmY29kaW5nX3NjaGVtZV9kZik7CisKKyAgaWYgKGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcpIG1pbl9iaXRzX2RmICs9IDE7CisKKyAgbWluX2JpdHNfZGYgKz0gbnVtX2xzYl9iaXRzOworCisgIGlmIChtaW5fYml0c19kZiA8IG1pbl9iaXRzX2FsbCkgeworICAgIG1pbl9iaXRzX2FsbCA9IG1pbl9iaXRzX2RmOworICB9CisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoYWxsb3dEaWZmVGltZUJhY2tfZmxhZykgeworICAgIG1pbl9iaXRzX2R0ID0KKyAgICAgICAgY2FsY19odWZmX2JpdHMoZGF0YV9kaWZmX3RpbWUsIE5VTEwsIGRhdGFfdHlwZSwgRElGRl9USU1FLCBESUZGX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGFCYW5kcywgbGF2X2R0LCAmY29kaW5nX3NjaGVtZV9kdCk7CisKKyAgICBtaW5fYml0c19kdCArPSAxOworICAgIG1pbl9iaXRzX2R0ICs9IG51bV9sc2JfYml0czsKKworICAgIGlmIChtaW5fYml0c19kdCA8IG1pbl9iaXRzX2FsbCkgeworICAgICAgbWluX2JpdHNfYWxsID0gbWluX2JpdHNfZHQ7CisgICAgfQorICB9IC8qIGlmKCBhbGxvd0RpZmZUaW1lQmFja19mbGFnICkgKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiBTdGFydCBhY3R1YWwgY29kaW5nIG5vdyAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIFBDTSBvciBEaWZmL0h1ZmYgQ29kaW5nPyAqLworICBwY21Db2RpbmdfZmxhZyA9IChtaW5fYml0c19hbGwgPT0gbnVtX3BjbV9iaXRzKTsKKworICBGREt3cml0ZUJpdHMoc3RybSwgcGNtQ29kaW5nX2ZsYWcsIDEpOworCisgIGlmIChwY21Db2RpbmdfZmxhZykgeworICAgIC8qIEdyb3VwZWQgUENNIENvZGluZyAqLworICAgIGFwcGx5X3BjbV9jb2Rpbmcoc3RybSwgYWFJbkRhdGFbc2V0SWR4XSArIHN0YXJ0QmFuZCwgTlVMTCwgcXVhbnRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgbnVtX3BjbV92YWwsIHF1YW50X2xldmVscyk7CisgIH0gZWxzZSB7CisgICAgLyogRGlmZi9IdWZmIENvZGluZyAqLworCisgICAgbWluX2ZvdW5kID0gMDsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChtaW5fYml0c19hbGwgPT0gbWluX2JpdHNfZGYpIHsKKyAgICAgIGlmIChhbGxvd0RpZmZUaW1lQmFja19mbGFnKSB7CisgICAgICAgIEZES3dyaXRlQml0cyhzdHJtLCBESUZGX0ZSRVEsIDEpOworICAgICAgfQorCisgICAgICBhcHBseV9odWZmX2NvZGluZyhzdHJtLCBkYXRhX2RpZmZfZnJlcSwgTlVMTCwgZGF0YV90eXBlLCBESUZGX0ZSRVEsCisgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0ZSRVEsIGRhdGFCYW5kcywgbGF2X2RmLCBjb2Rpbmdfc2NoZW1lX2RmKTsKKworICAgICAgbWluX2ZvdW5kID0gMTsKKyAgICB9IC8qIGlmKCBtaW5fYml0c19hbGwgPT0gbWluX2JpdHNfZGYgKSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcpIHsKKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgaWYgKCFtaW5fZm91bmQgJiYgKG1pbl9iaXRzX2FsbCA9PSBtaW5fYml0c19kdCkpIHsKKyAgICAgICAgRkRLd3JpdGVCaXRzKHN0cm0sIERJRkZfVElNRSwgMSk7CisKKyAgICAgICAgYXBwbHlfaHVmZl9jb2Rpbmcoc3RybSwgZGF0YV9kaWZmX3RpbWUsIE5VTEwsIGRhdGFfdHlwZSwgRElGRl9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX1RJTUUsIGRhdGFCYW5kcywgbGF2X2R0LCBjb2Rpbmdfc2NoZW1lX2R0KTsKKyAgICAgIH0KKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgfSAvKiBpZiggYWxsb3dEaWZmVGltZUJhY2tfZmxhZyApICovCisKKyAgICAvKiBMU0IgY29kaW5nICovCisgICAgaWYgKHNwbGl0THNiX2ZsYWcpIHsKKyAgICAgIGFwcGx5X2xzYl9jb2Rpbmcoc3RybSwgcXVhbnRfZGF0YV9sc2IsIDEsIGRhdGFCYW5kcyk7CisgICAgfQorCisgIH0gLyogRGlmZi9IdWZmL0xTQiBjb2RpbmcgKi8KKworICByZXR1cm4gcmVzZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19ubGNfZW5jLmggYi9saWJTQUNlbmMvc3JjL3NhY2VuY19ubGNfZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2YjMwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX25sY19lbmMuaApAQCAtMCwwICsxLDE0MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgS2Fyc3RlbiBMaW56bWVpZXIKKworICAgRGVzY3JpcHRpb246IE5vaXNlbGVzcyBDb2RpbmcKKyAgICAgICAgICAgICAgICBIdWZmbWFuIGVuY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNFTkNfTkxDX0VOQ19ICisjZGVmaW5lIFNBQ0VOQ19OTENfRU5DX0gKKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY19jb25zdC5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJzYWNlbmNfYml0c3RyZWFtLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTUFYQkFORFMgTUFYX05VTV9CSU5TIC8qIG1heGltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kcyAqLworCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworICB0X0NMRCwKKyAgdF9JQ0MKKworfSBEQVRBX1RZUEU7CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UIGZka19zYWNlbmNfZWNEYXRhUGFpckVuYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBhYUluRGF0YVtdW01BWEJBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgYUhpc3RvcnlbTUFYQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQVRBX1RZUEUgZGF0YV90eXBlLCBjb25zdCBJTlQgc2V0SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RhcnRCYW5kLCBjb25zdCBJTlQgZGF0YUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY29hcnNlX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpbmRlcGVuZGVuY3lfZmxhZyk7CisKK0lOVCBmZGtfc2FjZW5jX2VjRGF0YVNpbmdsZUVuYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIGFhSW5EYXRhW11bTUFYQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIGFIaXN0b3J5W01BWEJBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQVRBX1RZUEUgZGF0YV90eXBlLCBjb25zdCBJTlQgc2V0SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdGFydEJhbmQsIGNvbnN0IElOVCBkYXRhQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGNvYXJzZV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpbmRlcGVuZGVuY3lfZmxhZyk7CisKKyNlbmRpZiAvKiBTQUNFTkNfTkxDX0VOQ19IICovCmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19vbnNldGRldGVjdC5jcHAgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19vbnNldGRldGVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5YWVlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX29uc2V0ZGV0ZWN0LmNwcApAQCAtMCwwICsxLDM4MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF4IE5ldWVuZG9yZgorCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIERldGVjdCBPbnNldCBpbiBjdXJyZW50IGZyYW1lCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqCisgICBcZmlsZQorICAgRGVzY3JpcHRpb24gb2YgZmlsZSBjb250ZW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY19vbnNldGRldGVjdC5oIgorI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisjaW5jbHVkZSAic2FjZW5jX3ZlY3RvcmZ1bmN0aW9ucy5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNQQUNFX09OU0VUX1RIUkVTSE9MRCAoMy4wKQorI2RlZmluZSBTUEFDRV9PTlNFVF9USFJFU0hPTERfU0YgKDMpCisjZGVmaW5lIFNQQUNFX09OU0VUX1RIUkVTSE9MRF9TUVVBUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoRkwyRlhDT05TVF9EQkwoKDEuMCAvIChTUEFDRV9PTlNFVF9USFJFU0hPTEQgKiBTUEFDRV9PTlNFVF9USFJFU0hPTEQpKSAqIFwKKyAgICAgICAgICAgICAgICAgIChmbG9hdCkoMSA8PCBTUEFDRV9PTlNFVF9USFJFU0hPTERfU0YpKSkKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IE9OU0VUX0RFVEVDVCB7CisgIElOVCBtYXhUaW1lU2xvdHM7CisgIElOVCBtaW5UcmFuc2llbnREaXN0YW5jZTsKKyAgSU5UIGF2Z0VuZXJneURpc3RhbmNlOworICBJTlQgbG93ZXJCb3VuZE9uc2V0RGV0ZWN0aW9uOworICBJTlQgdXBwZXJCb3VuZE9uc2V0RGV0ZWN0aW9uOworICBGSVhQX0RCTCAqcEVuZXJneUhpc3RfX0ZESzsKKyAgU0NIQVIgKnBFbmVyZ3lIaXN0U2NhbGU7CisgIFNDSEFSIGF2Z0VuZXJneURpc3RhbmNlU2NhbGU7Cit9OworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X09wZW4oSEFORExFX09OU0VUX0RFVEVDVCAqcGhPbnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbWF4VGltZVNsb3RzKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisgIEhBTkRMRV9PTlNFVF9ERVRFQ1QgaE9uc2V0ID0gTlVMTDsKKworICBpZiAoTlVMTCA9PSBwaE9uc2V0KSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgLyogTWVtb3J5IEFsbG9jYXRpb24gKi8KKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKGhPbnNldCwgMSwgc3RydWN0IE9OU0VUX0RFVEVDVCk7CisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoT25zZXQtPnBFbmVyZ3lIaXN0X19GREssIDE2ICsgbWF4VGltZVNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwpOworICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoaE9uc2V0LT5wRW5lcmd5SGlzdFNjYWxlLCAxNiArIG1heFRpbWVTbG90cywgU0NIQVIpOworCisgICAgaE9uc2V0LT5tYXhUaW1lU2xvdHMgPSBtYXhUaW1lU2xvdHM7CisgICAgaE9uc2V0LT5taW5UcmFuc2llbnREaXN0YW5jZSA9CisgICAgICAgIDg7IC8qIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiBkZXRlY3RlZCB0cmFuc2llbnRzICovCisgICAgaE9uc2V0LT5hdmdFbmVyZ3lEaXN0YW5jZSA9IDE2OyAvKiBhdmVyYWdlIGVuZXJneSBkaXN0YW5jZSAqLworCisgICAgaE9uc2V0LT5hdmdFbmVyZ3lEaXN0YW5jZVNjYWxlID0gNDsKKyAgICAqcGhPbnNldCA9IGhPbnNldDsKKyAgfQorICByZXR1cm4gZXJyb3I7CisKK2JhaWw6CisgIGZka19zYWNlbmNfb25zZXREZXRlY3RfQ2xvc2UoJmhPbnNldCk7CisgIHJldHVybiAoKFNBQ0VOQ19PSyA9PSBlcnJvcikgPyBTQUNFTkNfTUVNT1JZX0VSUk9SIDogZXJyb3IpOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfb25zZXREZXRlY3RfSW5pdCgKKyAgICBIQU5ETEVfT05TRVRfREVURUNUIGhPbnNldCwKKyAgICBjb25zdCBPTlNFVF9ERVRFQ1RfQ09ORklHICpjb25zdCBwT25zZXREZXRlY3RDb25maWcsIGNvbnN0IFVJTlQgaW5pdEZsYWdzKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChOVUxMID09IGhPbnNldCkgfHwgKHBPbnNldERldGVjdENvbmZpZyA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGlmICgocE9uc2V0RGV0ZWN0Q29uZmlnLT5tYXhUaW1lU2xvdHMgPiBoT25zZXQtPm1heFRpbWVTbG90cykgfHwKKyAgICAgICAgKHBPbnNldERldGVjdENvbmZpZy0+dXBwZXJCb3VuZE9uc2V0RGV0ZWN0aW9uIDwKKyAgICAgICAgIGhPbnNldC0+bG93ZXJCb3VuZE9uc2V0RGV0ZWN0aW9uKSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaE9uc2V0LT5tYXhUaW1lU2xvdHMgPSBwT25zZXREZXRlY3RDb25maWctPm1heFRpbWVTbG90czsKKyAgICBoT25zZXQtPmxvd2VyQm91bmRPbnNldERldGVjdGlvbiA9CisgICAgICAgIHBPbnNldERldGVjdENvbmZpZy0+bG93ZXJCb3VuZE9uc2V0RGV0ZWN0aW9uOworICAgIGhPbnNldC0+dXBwZXJCb3VuZE9uc2V0RGV0ZWN0aW9uID0KKyAgICAgICAgcE9uc2V0RGV0ZWN0Q29uZmlnLT51cHBlckJvdW5kT25zZXREZXRlY3Rpb247CisKKyAgICBoT25zZXQtPm1pblRyYW5zaWVudERpc3RhbmNlID0KKyAgICAgICAgODsgLyogbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIGRldGVjdGVkIHRyYW5zaWVudHMgKi8KKyAgICBoT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlID0gMTY7IC8qIGF2ZXJhZ2UgZW5lcmd5IGRpc3RhbmNlICovCisKKyAgICBoT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlU2NhbGUgPSA0OworCisgICAgLyogSW5pdCAvIFJlc2V0ICovCisgICAgaWYgKGluaXRGbGFncykgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaE9uc2V0LT5hdmdFbmVyZ3lEaXN0YW5jZSArIGhPbnNldC0+bWF4VGltZVNsb3RzOyBpKyspCisgICAgICAgIGhPbnNldC0+cEVuZXJneUhpc3RTY2FsZVtpXSA9IC0oREZSQUNUX0JJVFMgLSAzKTsKKworICAgICAgRkRLbWVtc2V0X2ZsZXgoCisgICAgICAgICAgaE9uc2V0LT5wRW5lcmd5SGlzdF9fRkRLLAorICAgICAgICAgIEZMMkZYQ09OU1RfREJMKFNBQ0VOQ19GTE9BVF9FUFNJTE9OICogKDEgPDwgKERGUkFDVF9CSVRTIC0gMykpKSwKKyAgICAgICAgICBoT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlICsgaE9uc2V0LT5tYXhUaW1lU2xvdHMpOworICAgIH0KKyAgfQorCitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X0Nsb3NlKEhBTkRMRV9PTlNFVF9ERVRFQ1QgKnBoT25zZXQpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKE5VTEwgIT0gcGhPbnNldCkgJiYgKE5VTEwgIT0gKnBoT25zZXQpKSB7CisgICAgaWYgKE5VTEwgIT0gKCpwaE9uc2V0KS0+cEVuZXJneUhpc3RfX0ZESykgeworICAgICAgRkRLZnJlZSgoKnBoT25zZXQpLT5wRW5lcmd5SGlzdF9fRkRLKTsKKyAgICB9CisgICAgKCpwaE9uc2V0KS0+cEVuZXJneUhpc3RfX0ZESyA9IE5VTEw7CisKKyAgICBpZiAoTlVMTCAhPSAoKnBoT25zZXQpLT5wRW5lcmd5SGlzdFNjYWxlKSB7CisgICAgICBGREtmcmVlKCgqcGhPbnNldCktPnBFbmVyZ3lIaXN0U2NhbGUpOworICAgIH0KKyAgICAoKnBoT25zZXQpLT5wRW5lcmd5SGlzdFNjYWxlID0gTlVMTDsKKyAgICBGREtmcmVlKCpwaE9uc2V0KTsKKyAgICAqcGhPbnNldCA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19vbnNldERldGVjdF9VcGRhdGUoSEFORExFX09OU0VUX0RFVEVDVCBoT25zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB0aW1lU2xvdHMpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBoT25zZXQpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpZiAodGltZVNsb3RzID4gaE9uc2V0LT5tYXhUaW1lU2xvdHMpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgaTsKKyAgICAgIC8qIFNoaWZ0IG9sZCBkYXRhICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaE9uc2V0LT5hdmdFbmVyZ3lEaXN0YW5jZTsgaSsrKSB7CisgICAgICAgIGhPbnNldC0+cEVuZXJneUhpc3RfX0ZES1tpXSA9IGhPbnNldC0+cEVuZXJneUhpc3RfX0ZES1tpICsgdGltZVNsb3RzXTsKKyAgICAgICAgaE9uc2V0LT5wRW5lcmd5SGlzdFNjYWxlW2ldID0gaE9uc2V0LT5wRW5lcmd5SGlzdFNjYWxlW2kgKyB0aW1lU2xvdHNdOworICAgICAgfQorCisgICAgICAvKiBDbGVhciBmb3IgbmV3IGRhdGEgKi8KKyAgICAgIEZES21lbXNldF9mbGV4KCZoT25zZXQtPnBFbmVyZ3lIaXN0X19GREtbaE9uc2V0LT5hdmdFbmVyZ3lEaXN0YW5jZV0sCisgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTChTQUNFTkNfRkxPQVRfRVBTSUxPTiksIHRpbWVTbG90cyk7CisgICAgfQorICB9CisgIHJldHVybiBlcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfb25zZXREZXRlY3RfQXBwbHkoCisgICAgSEFORExFX09OU0VUX0RFVEVDVCBoT25zZXQsIGNvbnN0IElOVCBuVGltZVNsb3RzLCBjb25zdCBJTlQgbkh5YnJpZEJhbmRzLAorICAgIEZJWFBfRFBLICpjb25zdCAqY29uc3QgcHBIeWJyaWREYXRhX19GREssIGNvbnN0IElOVCBoeWJyaWREYXRhU2NhbGUsCisgICAgY29uc3QgSU5UIHByZXZQb3MsIElOVCBwVHJhbnNpZW50UG9zW01BWF9OVU1fVFJBTlNdKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGVudnMsIEZJWFBfREJMLCAoMTYgKyBNQVhfVElNRV9TTE9UUykpCisgIEZES21lbWNsZWFyKGVudnMsICgxNiArIE1BWF9USU1FX1NMT1RTKSAqIHNpemVvZihGSVhQX0RCTCkpOworCisgIGlmICgoaE9uc2V0ID09IE5VTEwpIHx8IChwVHJhbnNpZW50UG9zID09IE5VTEwpIHx8CisgICAgICAocHBIeWJyaWREYXRhX19GREsgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaSwgdHMsIHRyQ250LCBjdXJyUG9zOworCisgICAgaWYgKChuVGltZVNsb3RzIDwgMCkgfHwgKG5UaW1lU2xvdHMgPiBoT25zZXQtPm1heFRpbWVTbG90cykgfHwKKyAgICAgICAgKGhPbnNldC0+bG93ZXJCb3VuZE9uc2V0RGV0ZWN0aW9uIDwgLTEpIHx8CisgICAgICAgIChoT25zZXQtPnVwcGVyQm91bmRPbnNldERldGVjdGlvbiA+IG5IeWJyaWRCYW5kcykpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGNvbnN0IGludCBsb3dlckJvdW5kT25zZXREZXRlY3Rpb24gPSBoT25zZXQtPmxvd2VyQm91bmRPbnNldERldGVjdGlvbjsKKyAgICBjb25zdCBpbnQgdXBwZXJCb3VuZE9uc2V0RGV0ZWN0aW9uID0gaE9uc2V0LT51cHBlckJvdW5kT25zZXREZXRlY3Rpb247CisgICAgY29uc3QgaW50IE0gPSBoT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlOworCisgICAgeworICAgICAgU0NIQVIgKmVudlNjYWxlID0gaE9uc2V0LT5wRW5lcmd5SGlzdFNjYWxlOworICAgICAgRklYUF9EQkwgKmVudiA9IGhPbnNldC0+cEVuZXJneUhpc3RfX0ZESzsKKyAgICAgIGNvbnN0IEZJWFBfREJMIHRocmVzaG9sZF9zcXVhcmUgPSBTUEFDRV9PTlNFVF9USFJFU0hPTERfU1FVQVJFOworCisgICAgICB0ckNudCA9IDA7CisKKyAgICAgIC8qIHJlc2V0IHRyYW5zaWVudCBhcnJheSAqLworICAgICAgRkRLbWVtc2V0X2ZsZXgocFRyYW5zaWVudFBvcywgLTEsIE1BWF9OVU1fVFJBTlMpOworCisgICAgICAvKiBtaW5pbXVtIHRyYW5zaWVudCBkaXN0YW5jZSBvZiBtaW5UcmFuc0Rpc3QgUU1GIHNhbXBsZXMgKi8KKyAgICAgIGlmIChwcmV2UG9zID4gMCkgeworICAgICAgICBjdXJyUG9zID0gRkRLbWF4KG5UaW1lU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlBvcyAtIG5UaW1lU2xvdHMgKyBoT25zZXQtPm1pblRyYW5zaWVudERpc3RhbmNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN1cnJQb3MgPSBuVGltZVNsb3RzOworICAgICAgfQorCisgICAgICAvKiBnZXQgZW5lcmd5IGFuZCBzY2FsZWZhY3RvciBmb3IgZWFjaCB0aW1lIHNsb3QgKi8KKyAgICAgIGludCBvdXRTY2FsZTsKKyAgICAgIGludCBpblNjYWxlID0gMzsgLyogc2NhbGUgZmFjdG9yIGRldGVybWluZWQgZW1waXJpY2FsbHkgKi8KKyAgICAgIGZvciAodHMgPSAwOyB0cyA8IG5UaW1lU2xvdHM7IHRzKyspIHsKKyAgICAgICAgZW52W00gKyB0c10gPSBzdW1VcENwbHhQb3cyKAorICAgICAgICAgICAgJnBwSHlicmlkRGF0YV9fRkRLW3RzXVtsb3dlckJvdW5kT25zZXREZXRlY3Rpb24gKyAxXSwKKyAgICAgICAgICAgIFNVTV9VUF9EWU5BTUlDX1NDQUxFLCBpblNjYWxlLCAmb3V0U2NhbGUsCisgICAgICAgICAgICB1cHBlckJvdW5kT25zZXREZXRlY3Rpb24gLSBsb3dlckJvdW5kT25zZXREZXRlY3Rpb24gLSAxKTsKKyAgICAgICAgZW52U2NhbGVbTSArIHRzXSA9IG91dFNjYWxlICsgKGh5YnJpZERhdGFTY2FsZSA8PCAxKTsKKyAgICAgIH0KKworICAgICAgLyogY2FsY3VsYXRlIGNvbW1vbiBzY2FsZSBmb3IgYWxsIHRpbWUgc2xvdHMgKi8KKyAgICAgIFNDSEFSIG1heFNjYWxlID0gLShERlJBQ1RfQklUUyAtIDEpOworICAgICAgZm9yIChpID0gMDsgaSA8IChuVGltZVNsb3RzICsgTSk7IGkrKykgeworICAgICAgICBtYXhTY2FsZSA9IGZpeE1heChtYXhTY2FsZSwgZW52U2NhbGVbaV0pOworICAgICAgfQorCisgICAgICAvKiBhcHBseSBjb21tb24gc2NhbGUgYW5kIHN0b3JlIGVuZXJneSBpbiB0ZW1wb3JhcnkgYnVmZmVyICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgKG5UaW1lU2xvdHMgKyBNKTsgaSsrKSB7CisgICAgICAgIGVudnNbaV0gPSBlbnZbaV0gPj4gZml4TWluKChtYXhTY2FsZSAtIGVudlNjYWxlW2ldKSwgKERGUkFDVF9CSVRTIC0gMSkpOworICAgICAgfQorCisgICAgICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoblRpbWVTbG90cyArIE0pOyBpKyspIHsKKyAgICAgICAgbWF4VmFsIHw9IGZBYnMoZW52c1tpXSk7CisgICAgICB9CisKKyAgICAgIGludCBzID0gZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhtYXhWYWwpIC0gMSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoblRpbWVTbG90cyArIE0pOyBpKyspIHsKKyAgICAgICAgZW52c1tpXSA9IGVudnNbaV0gPDwgczsKKyAgICAgIH0KKworICAgICAgaW50IGN1cnJQb3NQcmV2ID0gY3VyclBvczsKKyAgICAgIEZJWFBfREJMIHAxLCBwMjsKKyAgICAgIHAyID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBmb3IgKDsgKGN1cnJQb3MgPCAoblRpbWVTbG90cyA8PCAxKSkgJiYgKHRyQ250IDwgTUFYX05VTV9UUkFOUyk7CisgICAgICAgICAgIGN1cnJQb3MrKykgeworICAgICAgICBwMSA9IGZNdWx0RGl2MihlbnZzW2N1cnJQb3MgLSBuVGltZVNsb3RzICsgTV0sIHRocmVzaG9sZF9zcXVhcmUpID4+CisgICAgICAgICAgICAgKFNQQUNFX09OU0VUX1RIUkVTSE9MRF9TRiAtIDEpOworCisgICAgICAgIC8qIENhbGN1bGF0ZSBhdmVyYWdlIG9mIHBhc3QgTSBlbmVyZ3kgdmFsdWVzICovCisgICAgICAgIGlmIChjdXJyUG9zUHJldiA9PSAoY3VyclBvcyAtIDEpKSB7CisgICAgICAgICAgLyogcmVtb3ZlIGxhc3QgYW5kIGFkZCBuZXcgZWxlbWVudCAqLworICAgICAgICAgIHAyIC09IChlbnZzW2N1cnJQb3NQcmV2IC0gblRpbWVTbG90c10gPj4KKyAgICAgICAgICAgICAgICAgKGludCloT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlU2NhbGUpOworICAgICAgICAgIHAyICs9IChlbnZzW2N1cnJQb3MgLSBuVGltZVNsb3RzICsgTSAtIDFdID4+CisgICAgICAgICAgICAgICAgIChpbnQpaE9uc2V0LT5hdmdFbmVyZ3lEaXN0YW5jZVNjYWxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBjYWxjdWxhdGUgY29tcGxldGUgdmVjdG9yICovCisgICAgICAgICAgcDIgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgICBmb3IgKHRzID0gMDsgdHMgPCBNOyB0cysrKSB7CisgICAgICAgICAgICBwMiArPSAoZW52c1tjdXJyUG9zIC0gblRpbWVTbG90cyArIHRzXSA+PgorICAgICAgICAgICAgICAgICAgIChpbnQpaE9uc2V0LT5hdmdFbmVyZ3lEaXN0YW5jZVNjYWxlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY3VyclBvc1ByZXYgPSBjdXJyUG9zOworCisgICAgICAgIHsKKyAgICAgICAgICAvKiBzYXZlIHBvc2l0aW9uIGlmIHRyYW5zaWVudCBmb3VuZCAqLworICAgICAgICAgIGlmIChwMSA+IHAyKSB7CisgICAgICAgICAgICBwVHJhbnNpZW50UG9zW3RyQ250KytdID0gY3VyclBvczsKKyAgICAgICAgICAgIGN1cnJQb3MgKz0gaE9uc2V0LT5taW5UcmFuc2llbnREaXN0YW5jZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gLyogZm9yIGN1cnJQb3MgKi8KKyAgICB9CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUqLworYmFpbDoKKworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGVudnMsIEZJWFBfREJMLCAoMTYgKyBNQVhfVElNRV9TTE9UUykpCisKKyAgcmV0dXJuIGVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19vbnNldGRldGVjdC5oIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfb25zZXRkZXRlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjNmMGJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfb25zZXRkZXRlY3QuaApAQCAtMCwwICsxLDE1NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF4IE5ldWVuZG9yZgorCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIERldGVybWluZSBURVMgZmxhZ3MKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNFTkNfT05TRVRERVRFQ1RfSAorI2RlZmluZSBTQUNFTkNfT05TRVRERVRFQ1RfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKgorICAgXGZpbGUKKyAgIERlc2NyaXB0aW9uIG9mIGZpbGUgY29udGVudHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAiRkRLX21hdHJpeENhbGxvYy5oIgorI2luY2x1ZGUgInNhY2VuY19saWIuaCIKKyNpbmNsdWRlICJzYWNlbmNfYml0c3RyZWFtLmgiIC8qIGZvciBkZWYuIG9mIE1BWF9OVU1fUEFSQU1TICovCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTUFYX05VTV9UUkFOUyAoTUFYX05VTV9QQVJBTVMgLyAyKQorCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBUX09OU0VUX0RFVEVDVF9DT05GSUcgeworICBJTlQgbWF4VGltZVNsb3RzOworCisgIC8qIGNhbGMgdHJhbnNpZW4gZGV0ZWN0aW9uIGluIF1sb3dlckJvdW5kT25zZXREZXRlY3Rpb247CisgICAqIHVwcGVyQm91bmRPbnNldERldGVjdGlvblsgKi8KKyAgSU5UIGxvd2VyQm91bmRPbnNldERldGVjdGlvbjsKKyAgSU5UIHVwcGVyQm91bmRPbnNldERldGVjdGlvbjsKKworfSBPTlNFVF9ERVRFQ1RfQ09ORklHOworCit0eXBlZGVmIHN0cnVjdCBPTlNFVF9ERVRFQ1QgKkhBTkRMRV9PTlNFVF9ERVRFQ1Q7CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X09wZW4oSEFORExFX09OU0VUX0RFVEVDVCAqcGhPbnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbWF4VGltZVNsb3RzKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X0luaXQoCisgICAgSEFORExFX09OU0VUX0RFVEVDVCBoT25zZXQsCisgICAgY29uc3QgT05TRVRfREVURUNUX0NPTkZJRyAqY29uc3QgcE9uc2V0RGV0ZWN0Q29uZmlnLCBjb25zdCBVSU5UIGluaXRGbGFncyk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19vbnNldERldGVjdF9DbG9zZShIQU5ETEVfT05TRVRfREVURUNUICpwaE9uc2V0KTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X1VwZGF0ZShIQU5ETEVfT05TRVRfREVURUNUIGhPbnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHRpbWVTbG90cyk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19vbnNldERldGVjdF9BcHBseSgKKyAgICBIQU5ETEVfT05TRVRfREVURUNUIGhPbnNldCwgY29uc3QgSU5UIG5UaW1lU2xvdHMsIGNvbnN0IElOVCBuSHlicmlkQmFuZHMsCisgICAgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBwcEh5YnJpZERhdGFfX0ZESywgY29uc3QgSU5UIGh5YnJpZERhdGFTY2FsZSwKKyAgICBjb25zdCBJTlQgcHJldlBvcywgSU5UIHBUcmFuc2llbnRQb3NbTUFYX05VTV9UUkFOU10pOworCisjZW5kaWYgLyogU0FDRU5DX09OU0VUREVURUNUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3BhcmFtZXh0cmFjdC5jcHAgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19wYXJhbWV4dHJhY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYmNlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19wYXJhbWV4dHJhY3QuY3BwCkBAIC0wLDAgKzEsNzI1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNLiBNdWx0cnVzCisKKyAgIERlc2NyaXB0aW9uOiBQYXJhbWV0ZXIgRXh0cmFjdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX3BhcmFtZXh0cmFjdC5oIgorI2luY2x1ZGUgInNhY2VuY190cmVlLmgiCisjaW5jbHVkZSAic2FjZW5jX3ZlY3RvcmZ1bmN0aW9ucy5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExPRzEwXzJfMTAgKDMuMDEwMjk5OTU2NjRmKSAvKiAxMC4wZipsb2cxMCgyLmYpICovCisjZGVmaW5lIFNDQUxFX0NMREVfU0YgKDcpICAgICAgICAgICAvKiBtYXhWYWwgaW4gUXVhbnQgdGFiIGlzICsvLSAgNTAgKi8KKyNkZWZpbmUgU0NBTEVfQ0xERF9TRiAoOCkgICAgICAgICAgIC8qIG1heFZhbCBpbiBRdWFudCB0YWIgaXMgKy8tIDE1MCAqLworCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBUX1RUT19CT1ggeworICBGSVhQX0RCTCBwQ2xkX19GREtbTUFYX05VTV9QQVJBTV9CQU5EU107CisgIEZJWFBfREJMIHBJY2NfX0ZES1tNQVhfTlVNX1BBUkFNX0JBTkRTXTsKKyAgRklYUF9EQkwgcENsZFF1YW50X19GREtbTUFYX05VTV9QQVJBTV9CQU5EU107CisKKyAgY29uc3QgRklYUF9EQkwgKnBJY2NRdWFudFRhYmxlX19GREs7CisgIGNvbnN0IEZJWFBfREJMICpwQ2xkUXVhbnRUYWJsZURlY19fRkRLOworICBjb25zdCBGSVhQX0RCTCAqcENsZFF1YW50VGFibGVFbmNfX0ZESzsKKworICBTQ0hBUiBwQ2xkRWJRSWR4W01BWF9OVU1fUEFSQU1fQkFORFNdOworICBTQ0hBUiBwSWNjRG93bm1peElkeFtNQVhfTlVNX1BBUkFNX0JBTkRTXTsKKworICBVQ0hBUiAqcFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldDsKKyAgY29uc3QgSU5UICpwU3ViYmFuZEltYWdTaWduOworICBVQ0hBUiBuSHlicmlkQmFuZHNNYXg7CisgIFVDSEFSIG5QYXJhbWV0ZXJCYW5kczsKKyAgVUNIQVIgYkZyYW1lS2VlcDsKKworICBVQ0hBUiBpY2NDb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlcjsKKyAgQk9YX1FVQU5UTU9ERSBib3hRdWFudE1vZGU7CisKKyAgVUNIQVIgbkljY1F1YW50U3RlcHM7CisgIFVDSEFSIG5JY2NRdWFudE9mZnNldDsKKworICBVQ0hBUiBuQ2xkUXVhbnRTdGVwczsKKyAgVUNIQVIgbkNsZFF1YW50T2Zmc2V0OworCisgIFVDSEFSIGJVc2VDb2Fyc2VRdWFudENsZDsKKyAgVUNIQVIgYlVzZUNvYXJzZVF1YW50SWNjOworCit9IFRUT19CT1g7CisKK3N0cnVjdCBCT1hfU1VCQkFORF9TRVRVUCB7CisgIEJPWF9TVUJCQU5EX0NPTkZJRyBzdWJiYW5kQ29uZmlnOworICBVQ0hBUiBuUGFyYW1ldGVyQmFuZHM7CisgIGNvbnN0IFVDSEFSICpwU3ViYmFuZDJQYXJhbWV0ZXJJbmRleExkOworICBVQ0hBUiBpY2NDb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlcjsKK307CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBjb25zdCBVQ0hBUiBzdWJiYW5kMlBhcmFtZXRlcjRfTGRbTlVNX1FNRl9CQU5EU10gPSB7CisgICAgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDN9OworCitzdGF0aWMgY29uc3QgVUNIQVIgc3ViYmFuZDJQYXJhbWV0ZXI1X0xkW05VTV9RTUZfQkFORFNdID0geworICAgIDAsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0fTsKKworc3RhdGljIGNvbnN0IFVDSEFSIHN1YmJhbmQyUGFyYW1ldGVyN19MZFtOVU1fUU1GX0JBTkRTXSA9IHsKKyAgICAwLCAxLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorICAgIDUsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNn07CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBzdWJiYW5kMlBhcmFtZXRlcjlfTGRbTlVNX1FNRl9CQU5EU10gPSB7CisgICAgMCwgMSwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNiwgNiwgNiwgNywgNywgNywgNywgNywgNywgNywgNywKKyAgICA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDh9OworCitzdGF0aWMgY29uc3QgVUNIQVIgc3ViYmFuZDJQYXJhbWV0ZXIxMl9MZFtOVU1fUU1GX0JBTkRTXSA9IHsKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LAorICAgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDksICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExfTsKKworc3RhdGljIGNvbnN0IFVDSEFSIHN1YmJhbmQyUGFyYW1ldGVyMTVfTGRbTlVNX1FNRl9CQU5EU10gPSB7CisgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDksICAxMCwgMTAsIDEwLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTR9OworCitzdGF0aWMgY29uc3QgVUNIQVIgc3ViYmFuZDJQYXJhbWV0ZXIyM19MZFtOVU1fUU1GX0JBTkRTXSA9IHsKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsIDExLCAxMiwgMTIsIDEzLCAxMywKKyAgICAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwKKyAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMn07CisKK3N0YXRpYyBjb25zdCBJTlQgc3ViYmFuZEltYWdTaWduX0xkW05VTV9RTUZfQkFORFNdID0geworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorfTsKKworI2RlZmluZSBTQ0FMRV9DTERFKGEpIChGTDJGWENPTlNUX0RCTChhIC8gKGZsb2F0KSgxIDw8IFNDQUxFX0NMREVfU0YpKSkKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBjbGRRdWFudFRhYmxlRmluZUVuY19fRkRLW01BWF9DTERfUVVBTlRfRklORV0gPSB7CisgICAgU0NBTEVfQ0xERSgtNTAuMCksIFNDQUxFX0NMREUoLTQ1LjApLCBTQ0FMRV9DTERFKC00MC4wKSwgU0NBTEVfQ0xERSgtMzUuMCksCisgICAgU0NBTEVfQ0xERSgtMzAuMCksIFNDQUxFX0NMREUoLTI1LjApLCBTQ0FMRV9DTERFKC0yMi4wKSwgU0NBTEVfQ0xERSgtMTkuMCksCisgICAgU0NBTEVfQ0xERSgtMTYuMCksIFNDQUxFX0NMREUoLTEzLjApLCBTQ0FMRV9DTERFKC0xMC4wKSwgU0NBTEVfQ0xERSgtOC4wKSwKKyAgICBTQ0FMRV9DTERFKC02LjApLCAgU0NBTEVfQ0xERSgtNC4wKSwgIFNDQUxFX0NMREUoLTIuMCksICBTQ0FMRV9DTERFKDAuMCksCisgICAgU0NBTEVfQ0xERSgyLjApLCAgIFNDQUxFX0NMREUoNC4wKSwgICBTQ0FMRV9DTERFKDYuMCksICAgU0NBTEVfQ0xERSg4LjApLAorICAgIFNDQUxFX0NMREUoMTAuMCksICBTQ0FMRV9DTERFKDEzLjApLCAgU0NBTEVfQ0xERSgxNi4wKSwgIFNDQUxFX0NMREUoMTkuMCksCisgICAgU0NBTEVfQ0xERSgyMi4wKSwgIFNDQUxFX0NMREUoMjUuMCksICBTQ0FMRV9DTERFKDMwLjApLCAgU0NBTEVfQ0xERSgzNS4wKSwKKyAgICBTQ0FMRV9DTERFKDQwLjApLCAgU0NBTEVfQ0xERSg0NS4wKSwgIFNDQUxFX0NMREUoNTAuMCl9OworCitzdGF0aWMgY29uc3QgRklYUF9EQkwgY2xkUXVhbnRUYWJsZUNvYXJzZUVuY19fRkRLW01BWF9DTERfUVVBTlRfQ09BUlNFXSA9IHsKKyAgICBTQ0FMRV9DTERFKC01MC4wKSwgU0NBTEVfQ0xERSgtMzUuMCksIFNDQUxFX0NMREUoLTI1LjApLCBTQ0FMRV9DTERFKC0xOS4wKSwKKyAgICBTQ0FMRV9DTERFKC0xMy4wKSwgU0NBTEVfQ0xERSgtOC4wKSwgIFNDQUxFX0NMREUoLTQuMCksICBTQ0FMRV9DTERFKDAuMCksCisgICAgU0NBTEVfQ0xERSg0LjApLCAgIFNDQUxFX0NMREUoOC4wKSwgICBTQ0FMRV9DTERFKDEzLjApLCAgU0NBTEVfQ0xERSgxOS4wKSwKKyAgICBTQ0FMRV9DTERFKDI1LjApLCAgU0NBTEVfQ0xERSgzNS4wKSwgIFNDQUxFX0NMREUoNTAuMCl9OworCisjZGVmaW5lIFNDQUxFX0NMREQoYSkgKEZMMkZYQ09OU1RfREJMKGEgLyAoZmxvYXQpKDEgPDwgU0NBTEVfQ0xERF9TRikpKQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGNsZFF1YW50VGFibGVGaW5lRGVjX19GREtbTUFYX0NMRF9RVUFOVF9GSU5FXSA9IHsKKyAgICBTQ0FMRV9DTEREKC0xNTAuMCksIFNDQUxFX0NMREQoLTQ1LjApLCBTQ0FMRV9DTEREKC00MC4wKSwgU0NBTEVfQ0xERCgtMzUuMCksCisgICAgU0NBTEVfQ0xERCgtMzAuMCksICBTQ0FMRV9DTEREKC0yNS4wKSwgU0NBTEVfQ0xERCgtMjIuMCksIFNDQUxFX0NMREQoLTE5LjApLAorICAgIFNDQUxFX0NMREQoLTE2LjApLCAgU0NBTEVfQ0xERCgtMTMuMCksIFNDQUxFX0NMREQoLTEwLjApLCBTQ0FMRV9DTEREKC04LjApLAorICAgIFNDQUxFX0NMREQoLTYuMCksICAgU0NBTEVfQ0xERCgtNC4wKSwgIFNDQUxFX0NMREQoLTIuMCksICBTQ0FMRV9DTEREKDAuMCksCisgICAgU0NBTEVfQ0xERCgyLjApLCAgICBTQ0FMRV9DTEREKDQuMCksICAgU0NBTEVfQ0xERCg2LjApLCAgIFNDQUxFX0NMREQoOC4wKSwKKyAgICBTQ0FMRV9DTEREKDEwLjApLCAgIFNDQUxFX0NMREQoMTMuMCksICBTQ0FMRV9DTEREKDE2LjApLCAgU0NBTEVfQ0xERCgxOS4wKSwKKyAgICBTQ0FMRV9DTEREKDIyLjApLCAgIFNDQUxFX0NMREQoMjUuMCksICBTQ0FMRV9DTEREKDMwLjApLCAgU0NBTEVfQ0xERCgzNS4wKSwKKyAgICBTQ0FMRV9DTEREKDQwLjApLCAgIFNDQUxFX0NMREQoNDUuMCksICBTQ0FMRV9DTEREKDE1MC4wKX07CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBjbGRRdWFudFRhYmxlQ29hcnNlRGVjX19GREtbTUFYX0NMRF9RVUFOVF9DT0FSU0VdID0geworICAgIFNDQUxFX0NMREQoLTE1MC4wKSwgU0NBTEVfQ0xERCgtMzUuMCksIFNDQUxFX0NMREQoLTI1LjApLCBTQ0FMRV9DTEREKC0xOS4wKSwKKyAgICBTQ0FMRV9DTEREKC0xMy4wKSwgIFNDQUxFX0NMREQoLTguMCksICBTQ0FMRV9DTEREKC00LjApLCAgU0NBTEVfQ0xERCgwLjApLAorICAgIFNDQUxFX0NMREQoNC4wKSwgICAgU0NBTEVfQ0xERCg4LjApLCAgIFNDQUxFX0NMREQoMTMuMCksICBTQ0FMRV9DTEREKDE5LjApLAorICAgIFNDQUxFX0NMREQoMjUuMCksICAgU0NBTEVfQ0xERCgzNS4wKSwgIFNDQUxFX0NMREQoMTUwLjApfTsKKworI2RlZmluZSBTQ0FMRV9JQ0MoYSkgKEZMMkZYQ09OU1RfREJMKGEpKQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGljY1F1YW50VGFibGVGaW5lX19GREtbTUFYX0lDQ19RVUFOVF9GSU5FXSA9IHsKKyAgICBTQ0FMRV9JQ0MoMC45OTk5OTk5OTk1MyksIFNDQUxFX0lDQygwLjkzN2YpLCAgIFNDQUxFX0lDQygwLjg0MTE4ZiksCisgICAgU0NBTEVfSUNDKDAuNjAwOTJmKSwgICAgICBTQ0FMRV9JQ0MoMC4zNjc2NGYpLCBTQ0FMRV9JQ0MoMC4wZiksCisgICAgU0NBTEVfSUNDKC0wLjU4OWYpLCAgICAgICBTQ0FMRV9JQ0MoLTAuOTlmKX07CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpY2NRdWFudFRhYmxlQ29hcnNlX19GREtbTUFYX0lDQ19RVUFOVF9DT0FSU0VdID0geworICAgIFNDQUxFX0lDQygwLjk5OTk5OTk5OTUzKSwgU0NBTEVfSUNDKDAuODQxMThmKSwgU0NBTEVfSUNDKDAuMzY3NjRmKSwKKyAgICBTQ0FMRV9JQ0MoLTAuNTg5MGYpfTsKKworc3RhdGljIGNvbnN0IEJPWF9TVUJCQU5EX1NFVFVQIGJveFN1YmJhbmRTZXR1cFtdID0geworICAgIHtCT1hfU1VCQkFORFNfNCwgNCwgc3ViYmFuZDJQYXJhbWV0ZXI0X0xkLCAxfSwKKyAgICB7Qk9YX1NVQkJBTkRTXzUsIDUsIHN1YmJhbmQyUGFyYW1ldGVyNV9MZCwgMn0sCisgICAge0JPWF9TVUJCQU5EU183LCA3LCBzdWJiYW5kMlBhcmFtZXRlcjdfTGQsIDN9LAorICAgIHtCT1hfU1VCQkFORFNfOSwgOSwgc3ViYmFuZDJQYXJhbWV0ZXI5X0xkLCA0fSwKKyAgICB7Qk9YX1NVQkJBTkRTXzEyLCAxMiwgc3ViYmFuZDJQYXJhbWV0ZXIxMl9MZCwgNH0sCisgICAge0JPWF9TVUJCQU5EU18xNSwgMTUsIHN1YmJhbmQyUGFyYW1ldGVyMTVfTGQsIDV9LAorICAgIHtCT1hfU1VCQkFORFNfMjMsIDIzLCBzdWJiYW5kMlBhcmFtZXRlcjIzX0xkLCA4fX07CisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IEJPWF9TVUJCQU5EX1NFVFVQICpnZXRCb3hTdWJiYW5kU2V0dXAoCisgICAgY29uc3QgQk9YX1NVQkJBTkRfQ09ORklHIHN1YmJhbmRDb25maWcpIHsKKyAgaW50IGk7CisgIGNvbnN0IEJPWF9TVUJCQU5EX1NFVFVQICpzZXR1cCA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpKHNpemVvZihib3hTdWJiYW5kU2V0dXApIC8gc2l6ZW9mKEJPWF9TVUJCQU5EX1NFVFVQKSk7CisgICAgICAgaSsrKSB7CisgICAgaWYgKGJveFN1YmJhbmRTZXR1cFtpXS5zdWJiYW5kQ29uZmlnID09IHN1YmJhbmRDb25maWcpIHsKKyAgICAgIHNldHVwID0gJmJveFN1YmJhbmRTZXR1cFtpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc2V0dXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBBcHBseUJCQ3Vlc0ZESyhGSVhQX0RCTCAqY29uc3QgcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5QYXJhbUJhbmRzKSB7CisgIGludCBpLCBzOworICBGSVhQX0RCTCB0bXAsIGludlBhcmFtQmFuZHM7CisKKyAgaW52UGFyYW1CYW5kcyA9IGZEaXZOb3JtSGlnaFByZWMoKEZJWFBfREJMKTEsIChGSVhQX0RCTCluUGFyYW1CYW5kcywgJnMpOworICBzID0gLXM7CisKKyAgdG1wID0gZk11bHQocERhdGFbMF0sIGludlBhcmFtQmFuZHMpID4+IHM7CisgIGZvciAoaSA9IDE7IGkgPCBuUGFyYW1CYW5kczsgaSsrKSB7CisgICAgdG1wICs9IGZNdWx0KHBEYXRhW2ldLCBpbnZQYXJhbUJhbmRzKSA+PiBzOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG5QYXJhbUJhbmRzOyBpKyspIHsKKyAgICBwRGF0YVtpXSA9IHRtcDsKKyAgfQorfQorCitzdGF0aWMgSU5UIGdldE51bWJlclBhcmFtZXRlckJhbmRzKGNvbnN0IEJPWF9TVUJCQU5EX0NPTkZJRyBzdWJiYW5kQ29uZmlnKSB7CisgIGNvbnN0IEJPWF9TVUJCQU5EX1NFVFVQICpzZXR1cCA9IGdldEJveFN1YmJhbmRTZXR1cChzdWJiYW5kQ29uZmlnKTsKKyAgcmV0dXJuICgoc2V0dXAgPT0gTlVMTCkgPyAwIDogc2V0dXAtPm5QYXJhbWV0ZXJCYW5kcyk7Cit9CisKK3N0YXRpYyBjb25zdCBVQ0hBUiAqZ2V0U3ViYmFuZDJQYXJhbWV0ZXJJbmRleCgKKyAgICBjb25zdCBCT1hfU1VCQkFORF9DT05GSUcgc3ViYmFuZENvbmZpZykgeworICBjb25zdCBCT1hfU1VCQkFORF9TRVRVUCAqc2V0dXAgPSBnZXRCb3hTdWJiYW5kU2V0dXAoc3ViYmFuZENvbmZpZyk7CisKKyAgcmV0dXJuICgoc2V0dXAgPT0gTlVMTCkgPyBOVUxMIDogKHNldHVwLT5wU3ViYmFuZDJQYXJhbWV0ZXJJbmRleExkKSk7Cit9CisKK3ZvaWQgZmRrX3NhY2VuY19jYWxjUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0KAorICAgIGNvbnN0IEJPWF9TVUJCQU5EX0NPTkZJRyBzdWJiYW5kQ29uZmlnLCBjb25zdCBJTlQgbkh5YnJpZEJhbmRzLAorICAgIFVDSEFSICpwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0KSB7CisgIGNvbnN0IEJPWF9TVUJCQU5EX1NFVFVQICpzZXR1cCA9IGdldEJveFN1YmJhbmRTZXR1cChzdWJiYW5kQ29uZmlnKTsKKyAgY29uc3QgVUNIQVIgKnBTdWJiYW5kMlBhcmFtZXRlckluZGV4OworCisgIGludCBpLCBwYjsKKworICBwU3ViYmFuZDJQYXJhbWV0ZXJJbmRleCA9IHNldHVwLT5wU3ViYmFuZDJQYXJhbWV0ZXJJbmRleExkOworCisgIGZvciAocGIgPSAwLCBpID0gMDsgaSA8IG5IeWJyaWRCYW5kcyAtIDE7IGkrKykgeworICAgIGlmIChwU3ViYmFuZDJQYXJhbWV0ZXJJbmRleFtpICsgMV0gLSBwU3ViYmFuZDJQYXJhbWV0ZXJJbmRleFtpXSkgeworICAgICAgcFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldFtwYisrXSA9IChpICsgMSk7CisgICAgfQorICB9CisgIHBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXRbcGIrK10gPSAoaSArIDEpOworfQorCitjb25zdCBJTlQgKmZka19zYWNlbmNfZ2V0U3ViYmFuZEltYWdTaWduKCkgeworICBjb25zdCBJTlQgKnBJbWFnU2lnbiA9IE5VTEw7CisKKyAgcEltYWdTaWduID0gc3ViYmFuZEltYWdTaWduX0xkOworCisgIHJldHVybiAocEltYWdTaWduKTsKK30KKworc3RhdGljIElOVCBnZXRJY2NDb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlcigKKyAgICBjb25zdCBCT1hfU1VCQkFORF9DT05GSUcgc3ViYmFuZENvbmZpZywgY29uc3QgSU5UIGJVc2VDb2hlcmVuY2VPbmx5KSB7CisgIGNvbnN0IEJPWF9TVUJCQU5EX1NFVFVQICpzZXR1cCA9IGdldEJveFN1YmJhbmRTZXR1cChzdWJiYW5kQ29uZmlnKTsKKyAgcmV0dXJuICgKKyAgICAgIChzZXR1cCA9PSBOVUxMKQorICAgICAgICAgID8gMAorICAgICAgICAgIDogKChiVXNlQ29oZXJlbmNlT25seSkgPyAwIDogc2V0dXAtPmljY0NvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyKSk7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19jcmVhdGVUdG9Cb3goSEFORExFX1RUT19CT1ggKmhUdG9Cb3gpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBoVHRvQm94KSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRCgqaFR0b0JveCwgMSwgVFRPX0JPWCk7CisgIH0KKyAgcmV0dXJuIGVycm9yOworCitiYWlsOgorICBmZGtfc2FjZW5jX2Rlc3Ryb3lUdG9Cb3goaFR0b0JveCk7CisgIHJldHVybiAoKFNBQ0VOQ19PSyA9PSBlcnJvcikgPyBTQUNFTkNfTUVNT1JZX0VSUk9SIDogZXJyb3IpOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfaW5pdFR0b0JveChIQU5ETEVfVFRPX0JPWCBoVHRvQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRPX0JPWF9DT05GSUcgKmNvbnN0IHR0b0JveENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0KSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChoVHRvQm94ID09IE5VTEwpIHx8ICh0dG9Cb3hDb25maWcgPT0gTlVMTCkgfHwKKyAgICAgIChwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0ID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgRkRLbWVtY2xlYXIoaFR0b0JveCwgc2l6ZW9mKFRUT19CT1gpKTsKKworICAgIGhUdG9Cb3gtPmJVc2VDb2Fyc2VRdWFudENsZCA9IHR0b0JveENvbmZpZy0+YlVzZUNvYXJzZVF1YW50Q2xkOworICAgIGhUdG9Cb3gtPmJVc2VDb2Fyc2VRdWFudEljYyA9IHR0b0JveENvbmZpZy0+YlVzZUNvYXJzZVF1YW50SWNjOworICAgIGhUdG9Cb3gtPmJveFF1YW50TW9kZSA9IHR0b0JveENvbmZpZy0+Ym94UXVhbnRNb2RlOworICAgIGhUdG9Cb3gtPmljY0NvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyID0gZ2V0SWNjQ29ycmVsYXRpb25Db2hlcmVuY2VCb3JkZXIoCisgICAgICAgIHR0b0JveENvbmZpZy0+c3ViYmFuZENvbmZpZywgdHRvQm94Q29uZmlnLT5iVXNlQ29oZXJlbmNlSWNjT25seSk7CisgICAgaFR0b0JveC0+bkh5YnJpZEJhbmRzTWF4ID0gdHRvQm94Q29uZmlnLT5uSHlicmlkQmFuZHNNYXg7CisgICAgaFR0b0JveC0+blBhcmFtZXRlckJhbmRzID0KKyAgICAgICAgZ2V0TnVtYmVyUGFyYW1ldGVyQmFuZHModHRvQm94Q29uZmlnLT5zdWJiYW5kQ29uZmlnKTsKKyAgICBoVHRvQm94LT5iRnJhbWVLZWVwID0gdHRvQm94Q29uZmlnLT5iRnJhbWVLZWVwOworCisgICAgaFR0b0JveC0+bkljY1F1YW50U3RlcHMgPQorICAgICAgICBmZGtfc2FjZW5jX2dldE51bWJlckljY1F1YW50TGV2ZWxzKGhUdG9Cb3gtPmJVc2VDb2Fyc2VRdWFudEljYyk7CisgICAgaFR0b0JveC0+bkljY1F1YW50T2Zmc2V0ID0KKyAgICAgICAgZmRrX3NhY2VuY19nZXRJY2NRdWFudE9mZnNldChoVHRvQm94LT5iVXNlQ29hcnNlUXVhbnRJY2MpOworCisgICAgaFR0b0JveC0+cEljY1F1YW50VGFibGVfX0ZESyA9IGhUdG9Cb3gtPmJVc2VDb2Fyc2VRdWFudEljYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpY2NRdWFudFRhYmxlQ29hcnNlX19GREsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaWNjUXVhbnRUYWJsZUZpbmVfX0ZESzsKKyAgICBoVHRvQm94LT5wQ2xkUXVhbnRUYWJsZURlY19fRkRLID0gaFR0b0JveC0+YlVzZUNvYXJzZVF1YW50Q2xkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNsZFF1YW50VGFibGVDb2Fyc2VEZWNfX0ZESworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjbGRRdWFudFRhYmxlRmluZURlY19fRkRLOworICAgIGhUdG9Cb3gtPnBDbGRRdWFudFRhYmxlRW5jX19GREsgPSBoVHRvQm94LT5iVXNlQ29hcnNlUXVhbnRDbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2xkUXVhbnRUYWJsZUNvYXJzZUVuY19fRkRLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNsZFF1YW50VGFibGVGaW5lRW5jX19GREs7CisKKyAgICBoVHRvQm94LT5uQ2xkUXVhbnRTdGVwcyA9CisgICAgICAgIGZka19zYWNlbmNfZ2V0TnVtYmVyQ2xkUXVhbnRMZXZlbHMoaFR0b0JveC0+YlVzZUNvYXJzZVF1YW50Q2xkKTsKKyAgICBoVHRvQm94LT5uQ2xkUXVhbnRPZmZzZXQgPQorICAgICAgICBmZGtfc2FjZW5jX2dldENsZFF1YW50T2Zmc2V0KGhUdG9Cb3gtPmJVc2VDb2Fyc2VRdWFudENsZCk7CisKKyAgICAvKiBzYW5pdHkgKi8KKyAgICBpZiAoTlVMTCA9PSAoaFR0b0JveC0+cFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICBwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0KSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5JVF9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSAoaFR0b0JveC0+cFN1YmJhbmRJbWFnU2lnbiA9IGZka19zYWNlbmNfZ2V0U3ViYmFuZEltYWdTaWduKCkpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTklUX0VSUk9SOworICAgIH0KKworICAgIGlmICgoaFR0b0JveC0+Ym94UXVhbnRNb2RlICE9IEJPWF9RVUFOVE1PREVfRklORSkgJiYKKyAgICAgICAgKGhUdG9Cb3gtPmJveFF1YW50TW9kZSAhPSBCT1hfUVVBTlRNT0RFX0VCUTEpICYmCisgICAgICAgIChoVHRvQm94LT5ib3hRdWFudE1vZGUgIT0gQk9YX1FVQU5UTU9ERV9FQlEyKSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5JVF9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2Rlc3Ryb3lUdG9Cb3goSEFORExFX1RUT19CT1ggKmhUdG9Cb3gpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKmhUdG9Cb3ggIT0gTlVMTCkgeworICAgIEZES2ZyZWUoKmhUdG9Cb3gpOworICAgICpoVHRvQm94ID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgY2FsY3VsYXRlSWNjRkRLKGNvbnN0IElOVCBuUGFyYW1CYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcFB3cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBQd3IyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwUHJvZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgY29uc3QgKmNvbnN0IHBQcm9kSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgcEljYykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgocFB3cjEgPT0gTlVMTCkgfHwgKHBQd3IyID09IE5VTEwpIHx8IChwUHJvZFJlYWwgPT0gTlVMTCkgfHwKKyAgICAgIChwUHJvZEltYWcgPT0gTlVMTCkgfHwgKHBJY2MgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICAvKiBzYW5pdHkgY2hlY2sgYm9yZGVyICovCisgICAgaWYgKGNvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyID4gblBhcmFtQmFuZCkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGNvcnJlbGF0aW9uICovCisgICAgICBGREtjYWxjQ29ycmVsYXRpb25WZWMocEljYywgcFByb2RSZWFsLCBwUHdyMSwgcFB3cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25Db2hlcmVuY2VCb3JkZXIpOworCisgICAgICAvKiBjb2hlcmVuY2UgKi8KKyAgICAgIGNhbGNDb2hlcmVuY2VWZWMoJnBJY2NbY29ycmVsYXRpb25Db2hlcmVuY2VCb3JkZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAmcFByb2RSZWFsW2NvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBQcm9kSW1hZ1tjb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlcl0sCisgICAgICAgICAgICAgICAgICAgICAgICZwUHdyMVtjb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlcl0sCisgICAgICAgICAgICAgICAgICAgICAgICZwUHdyMltjb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlcl0sIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbUJhbmQgLSBjb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlcik7CisKKyAgICB9IC8qIHZhbGlkIGNvbmZpZ3VyYXRpb24gKi8KKyAgfSAgIC8qIHZhbGlkIGhhbmRsZSAqLworCisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgUXVhbnRpemVDb2VmRkRLKGNvbnN0IEZJWFBfREJMICpjb25zdCBpbnB1dCwgY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcXVhbnRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaWR4T2Zmc2V0LCBjb25zdCBJTlQgblF1YW50U3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKmNvbnN0IHF1YW50T3V0KSB7CisgIGludCBiYW5kOworICBjb25zdCBpbnQgcmV2ZXJzZSA9IChxdWFudFRhYmxlWzBdID4gcXVhbnRUYWJsZVsxXSk7CisKKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG5CYW5kczsgYmFuZCsrKSB7CisgICAgRklYUF9EQkwgcVZhbDsKKyAgICBGSVhQX0RCTCBjdXJWYWwgPSBpbnB1dFtiYW5kXTsKKworICAgIGludCBsb3dlciA9IDA7CisgICAgaW50IHVwcGVyID0gblF1YW50U3RlcHMgLSAxOworCisgICAgaWYgKHJldmVyc2UpIHsKKyAgICAgIHdoaWxlICh1cHBlciAtIGxvd2VyID4gMSkgeworICAgICAgICBpbnQgaWR4ID0gKGxvd2VyICsgdXBwZXIpID4+IDE7CisgICAgICAgIHFWYWwgPSBxdWFudFRhYmxlW2lkeF07CisgICAgICAgIGlmIChjdXJWYWwgPj0gcVZhbCkgeworICAgICAgICAgIHVwcGVyID0gaWR4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxvd2VyID0gaWR4OworICAgICAgICB9CisgICAgICB9IC8qIHdoaWxlICovCisKKyAgICAgIGlmICgoY3VyVmFsIC0gcXVhbnRUYWJsZVtsb3dlcl0pID49IChxdWFudFRhYmxlW3VwcGVyXSAtIGN1clZhbCkpIHsKKyAgICAgICAgcXVhbnRPdXRbYmFuZF0gPSBsb3dlciAtIGlkeE9mZnNldDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHF1YW50T3V0W2JhbmRdID0gdXBwZXIgLSBpZHhPZmZzZXQ7CisgICAgICB9CisgICAgfSAvKiBpZiByZXZlcnNlICovCisgICAgZWxzZSB7CisgICAgICB3aGlsZSAodXBwZXIgLSBsb3dlciA+IDEpIHsKKyAgICAgICAgaW50IGlkeCA9IChsb3dlciArIHVwcGVyKSA+PiAxOworICAgICAgICBxVmFsID0gcXVhbnRUYWJsZVtpZHhdOworICAgICAgICBpZiAoY3VyVmFsIDw9IHFWYWwpIHsKKyAgICAgICAgICB1cHBlciA9IGlkeDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsb3dlciA9IGlkeDsKKyAgICAgICAgfQorICAgICAgfSAvKiB3aGlsZSAqLworCisgICAgICBpZiAoKGN1clZhbCAtIHF1YW50VGFibGVbbG93ZXJdKSA8PSAocXVhbnRUYWJsZVt1cHBlcl0gLSBjdXJWYWwpKSB7CisgICAgICAgIHF1YW50T3V0W2JhbmRdID0gbG93ZXIgLSBpZHhPZmZzZXQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBxdWFudE91dFtiYW5kXSA9IHVwcGVyIC0gaWR4T2Zmc2V0OworICAgICAgfQorICAgIH0gLyogZWxzZSByZXZlcnNlICovCisgIH0gICAvKiBmb3IgYmFuZCAqLworfQorCitzdGF0aWMgdm9pZCBkZVF1YW50aXplQ29lZkZESyhjb25zdCBTQ0hBUiAqY29uc3QgaW5wdXQsIGNvbnN0IElOVCBuQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcXVhbnRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpZHhPZmZzZXQsIEZJWFBfREJMICpjb25zdCBkZXF1YW50T3V0KSB7CisgIGludCBiYW5kOworCisgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBuQmFuZHM7IGJhbmQrKykgeworICAgIGRlcXVhbnRPdXRbYmFuZF0gPSBxdWFudFRhYmxlW2lucHV0W2JhbmRdICsgaWR4T2Zmc2V0XTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDYWxjdWxhdGVDbGRGREsoRklYUF9EQkwgKmNvbnN0IHBDbGQsIGNvbnN0IEZJWFBfREJMICpjb25zdCBwUHdyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcFB3cjIsIGNvbnN0IElOVCBzY2FsZUNoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmNvbnN0IHBiU2NhbGVDaDEsIGNvbnN0IElOVCBzY2FsZUNoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmNvbnN0IHBiU2NhbGVDaDIsIGNvbnN0IGludCBuUGFyYW1CYW5kKSB7CisgIElOVCBpOworICBGSVhQX0RCTCBsZFB3cjEsIGxkUHdyMiwgY2xkOworICBGSVhQX0RCTCBtYXhQd3IgPSBGTDJGWENPTlNUX0RCTCgKKyAgICAgIDMwLjBmIC8KKyAgICAgICgxIDw8IChMRF9EQVRBX1NISUZUICsKKyAgICAgICAgICAgICAxKSkpOyAvKiBjb25zaWRlciBTQUNFTkNfRkxPQVRfRVBTSUxPTiBpbiBwb3dlciBjYWxjdWxhdGlvbiAqLworCisgIGZvciAoaSA9IDA7IGkgPCBuUGFyYW1CYW5kOyBpKyspIHsKKyAgICBsZFB3cjEgPQorICAgICAgICAoQ2FsY0xkRGF0YShwUHdyMVtpXSkgPj4gMSkgKyAoKEZJWFBfREJMKShzY2FsZUNoMSArIHBiU2NhbGVDaDFbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCkpOworICAgIGxkUHdyMiA9CisgICAgICAgIChDYWxjTGREYXRhKHBQd3IyW2ldKSA+PiAxKSArICgoRklYUF9EQkwpKHNjYWxlQ2gyICsgcGJTY2FsZUNoMltpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChERlJBQ1RfQklUUyAtIDEgLSBMRF9EQVRBX1NISUZUKSk7CisKKyAgICBsZFB3cjEgPSBmaXhNYXgoZml4TWluKGxkUHdyMSwgbWF4UHdyKSwgLW1heFB3cik7CisgICAgbGRQd3IyID0gZml4TWF4KGZpeE1pbihsZFB3cjIsIG1heFB3ciksIC1tYXhQd3IpOworCisgICAgLyogbGRQd3IxIGFuZCBsZFB3cjIgYXJlIHNjYWxlZCBieSBMRF9EQVRBX1NISUZUIGFuZCBhZGRpdGlvbmFsIDEgYml0OyAxIGJpdAorICAgICAqIHNjYWxlIGJ5IGZNdWx0RGl2MigpICovCisgICAgY2xkID0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKExPRzEwXzJfMTAgLyAoMSA8PCBTQ0FMRV9DTERFX1NGKSksCisgICAgICAgICAgICAgICAgICAgIGxkUHdyMSAtIGxkUHdyMik7CisKKyAgICBjbGQgPQorICAgICAgICBmaXhNaW4oY2xkLCAoRklYUF9EQkwpKCgoRklYUF9EQkwpTUFYVkFMX0RCTCkgPj4gKExEX0RBVEFfU0hJRlQgKyAyKSkpOworICAgIGNsZCA9CisgICAgICAgIGZpeE1heChjbGQsIChGSVhQX0RCTCkoKChGSVhQX0RCTClNSU5WQUxfREJMKSA+PiAoTERfREFUQV9TSElGVCArIDIpKSk7CisgICAgcENsZFtpXSA9IGNsZCA8PCAoTERfREFUQV9TSElGVCArIDIpOworICB9Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19hcHBseVR0b0JveCgKKyAgICBIQU5ETEVfVFRPX0JPWCBoVHRvQm94LCBjb25zdCBJTlQgblRpbWVTbG90cywgY29uc3QgSU5UIHN0YXJ0VGltZVNsb3QsCisgICAgY29uc3QgSU5UIG5IeWJyaWRCYW5kcywgY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBwcEh5YnJpZERhdGExX19GREssCisgICAgY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBwcEh5YnJpZERhdGEyX19GREssIFNDSEFSICpjb25zdCBwSWNjSWR4LAorICAgIFVDSEFSICpjb25zdCBwYkljY1F1YW50Q29hcnNlLCBTQ0hBUiAqY29uc3QgcENsZElkeCwKKyAgICBVQ0hBUiAqY29uc3QgcGJDbGRRdWFudENvYXJzZSwgY29uc3QgSU5UIGJVc2VCQkN1ZXMsIElOVCAqc2NhbGVDaDEsCisgICAgSU5UICpzY2FsZUNoMikgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwb3dlckh5YnJpZERhdGExX19GREssIEZJWFBfREJMLCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocG93ZXJIeWJyaWREYXRhMl9fRkRLLCBGSVhQX0RCTCwgTUFYX05VTV9QQVJBTV9CQU5EUykKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHByb2RIeWJyaWREYXRhUmVhbF9fRkRLLCBGSVhQX0RCTCwgTUFYX05VTV9QQVJBTV9CQU5EUykKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHByb2RIeWJyaWREYXRhSW1hZ19fRkRLLCBGSVhQX0RCTCwgTUFYX05VTV9QQVJBTV9CQU5EUykKKworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoSWNjRG93bm1peF9fRkRLLCBGSVhQX0RCTCwgTUFYX05VTV9QQVJBTV9CQU5EUykKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKEljY0Rvd25taXhRdWFudF9fRkRLLCBGSVhQX0RCTCwgTUFYX05VTV9QQVJBTV9CQU5EUykKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBiU2NhbGVDaDEsIElOVCwgTUFYX05VTV9QQVJBTV9CQU5EUykKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBiU2NhbGVDaDIsIElOVCwgTUFYX05VTV9QQVJBTV9CQU5EUykKKworICBpZiAoKGhUdG9Cb3ggPT0gTlVMTCkgfHwgKHBDbGRJZHggPT0gTlVMTCkgfHwgKHBiQ2xkUXVhbnRDb2Fyc2UgPT0gTlVMTCkgfHwKKyAgICAgIChwcEh5YnJpZERhdGExX19GREsgPT0gTlVMTCkgfHwgKHBwSHlicmlkRGF0YTJfX0ZESyA9PSBOVUxMKSB8fAorICAgICAgKHBJY2NJZHggPT0gTlVMTCkgfHwgKHBiSWNjUXVhbnRDb2Fyc2UgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaiwgcGI7CisgICAgY29uc3QgaW50IG5QYXJhbUJhbmRzID0gaFR0b0JveC0+blBhcmFtZXRlckJhbmRzOworICAgIGNvbnN0IGludCBiVXNlRWJRID0gKGhUdG9Cb3gtPmJveFF1YW50TW9kZSA9PSBCT1hfUVVBTlRNT0RFX0VCUTEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoaFR0b0JveC0+Ym94UXVhbnRNb2RlID09IEJPWF9RVUFOVE1PREVfRUJRMik7CisKKyAgICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgICBpZiAoKG5IeWJyaWRCYW5kcyA8IDApIHx8IChuSHlicmlkQmFuZHMgPiBoVHRvQm94LT5uSHlicmlkQmFuZHNNYXgpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpbnQgb3V0U2NhbGU7ICAgIC8qIHNjYWxlZmFjdG9yIHdpbGwgbm90IGJlIGV2YWx1YXRlZCAqLworICAgIGludCBpblNjYWxlID0gNTsgLyogc2NhbGUgZmFjdG9yIGRldGVybWluZWQgZW1waXJpY2FsbHkgKi8KKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgaGVhZHJvb20gb2YgdGhlIGh5YnJpZCBkYXRhIGZvciBlYWNoIHBhcmFtZXRlciBiYW5kICovCisgICAgRkRLY2FsY1BiU2NhbGVGYWN0b3IocHBIeWJyaWREYXRhMV9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhUdG9Cb3gtPnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQsIHBiU2NhbGVDaDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lU2xvdCwgblRpbWVTbG90cywgblBhcmFtQmFuZHMpOworICAgIEZES2NhbGNQYlNjYWxlRmFjdG9yKHBwSHlicmlkRGF0YTJfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICBoVHRvQm94LT5wUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0LCBwYlNjYWxlQ2gyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVNsb3QsIG5UaW1lU2xvdHMsIG5QYXJhbUJhbmRzKTsKKworICAgIGZvciAoaiA9IDAsIHBiID0gMDsgcGIgPCBuUGFyYW1CYW5kczsgcGIrKykgeworICAgICAgRklYUF9EQkwgZGF0YTEsIGRhdGEyOworICAgICAgZGF0YTEgPSBkYXRhMiA9IChGSVhQX0RCTCkwOworICAgICAgZm9yICg7IGogPCBoVHRvQm94LT5wUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0W3BiXTsgaisrKSB7CisgICAgICAgIGRhdGExICs9IHN1bVVwQ3BseFBvdzJEaW0yKHBwSHlicmlkRGF0YTFfX0ZESywgU1VNX1VQX1NUQVRJQ19TQ0FMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TY2FsZSArIHBiU2NhbGVDaDFbcGJdLCAmb3V0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVNsb3QsIG5UaW1lU2xvdHMsIGosIGogKyAxKTsKKyAgICAgICAgZGF0YTIgKz0gc3VtVXBDcGx4UG93MkRpbTIocHBIeWJyaWREYXRhMl9fRkRLLCBTVU1fVVBfU1RBVElDX1NDQUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNjYWxlICsgcGJTY2FsZUNoMltwYl0sICZvdXRTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lU2xvdCwgblRpbWVTbG90cywgaiwgaiArIDEpOworICAgICAgfSAvKiBmb3IgaiAqLworICAgICAgcG93ZXJIeWJyaWREYXRhMV9fRkRLW3BiXSA9IGRhdGExOworICAgICAgcG93ZXJIeWJyaWREYXRhMl9fRkRLW3BiXSA9IGRhdGEyOworICAgIH0gLyogcGIgKi8KKworICAgIHsKKyAgICAgIGZvciAoaiA9IDAsIHBiID0gMDsgcGIgPCBuUGFyYW1CYW5kczsgcGIrKykgeworICAgICAgICBGSVhQX0RCTCBkYXRhUmVhbCwgZGF0YUltYWc7CisgICAgICAgIGRhdGFSZWFsID0gZGF0YUltYWcgPSAoRklYUF9EQkwpMDsKKyAgICAgICAgZm9yICg7IGogPCBoVHRvQm94LT5wUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0W3BiXTsgaisrKSB7CisgICAgICAgICAgRklYUF9EUEsgc2NhbGFyUHJvZDsKKyAgICAgICAgICBjcGx4X2NwbHhTY2FsYXJQcm9kdWN0KCZzY2FsYXJQcm9kLCBwcEh5YnJpZERhdGExX19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcEh5YnJpZERhdGEyX19GREssIGluU2NhbGUgKyBwYlNjYWxlQ2gxW3BiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2NhbGUgKyBwYlNjYWxlQ2gyW3BiXSwgJm91dFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lU2xvdCwgblRpbWVTbG90cywgaiwgaiArIDEpOworICAgICAgICAgIGRhdGFSZWFsICs9IHNjYWxhclByb2Qudi5yZTsKKyAgICAgICAgICBpZiAoaFR0b0JveC0+cFN1YmJhbmRJbWFnU2lnbltqXSA8IDApIHsKKyAgICAgICAgICAgIGRhdGFJbWFnIC09IHNjYWxhclByb2Qudi5pbTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YUltYWcgKz0gc2NhbGFyUHJvZC52LmltOworICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBmb3IgaiAqLworICAgICAgICBwcm9kSHlicmlkRGF0YVJlYWxfX0ZES1twYl0gPSBkYXRhUmVhbDsKKyAgICAgICAgcHJvZEh5YnJpZERhdGFJbWFnX19GREtbcGJdID0gZGF0YUltYWc7CisgICAgICB9IC8qIHBiICovCisKKyAgICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gY2FsY3VsYXRlSWNjRkRLKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbUJhbmRzLCBoVHRvQm94LT5pY2NDb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlckh5YnJpZERhdGExX19GREssIHBvd2VySHlicmlkRGF0YTJfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kSHlicmlkRGF0YVJlYWxfX0ZESywgcHJvZEh5YnJpZERhdGFJbWFnX19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFR0b0JveC0+cEljY19fRkRLKSkpIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICAvKiBjYWxjdWxhdGUgY29ycmVsYXRpb24gYmFzZWQgSWNjIGZvciBkb3dubWl4ICovCisgICAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGNhbGN1bGF0ZUljY0ZESygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGFyYW1CYW5kcywgblBhcmFtQmFuZHMsIHBvd2VySHlicmlkRGF0YTFfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlckh5YnJpZERhdGEyX19GREssIHByb2RIeWJyaWREYXRhUmVhbF9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2RIeWJyaWREYXRhSW1hZ19fRkRLLCBJY2NEb3dubWl4X19GREspKSkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiVXNlRWJRKSB7CisgICAgICBDYWxjdWxhdGVDbGRGREsoaFR0b0JveC0+cENsZF9fRkRLLCBwb3dlckh5YnJpZERhdGExX19GREssCisgICAgICAgICAgICAgICAgICAgICAgcG93ZXJIeWJyaWREYXRhMl9fRkRLLCAqc2NhbGVDaDEgKyBpblNjYWxlICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICBwYlNjYWxlQ2gxLCAqc2NhbGVDaDIgKyBpblNjYWxlICsgMSwgcGJTY2FsZUNoMiwKKyAgICAgICAgICAgICAgICAgICAgICBuUGFyYW1CYW5kcyk7CisgICAgfQorCisgICAgaWYgKGJVc2VCQkN1ZXMpIHsKKyAgICAgIEFwcGx5QkJDdWVzRkRLKCZoVHRvQm94LT5wQ2xkX19GREtbMF0sIG5QYXJhbUJhbmRzKTsKKworICAgICAgeyBBcHBseUJCQ3Vlc0ZESygmaFR0b0JveC0+cEljY19fRkRLWzBdLCBuUGFyYW1CYW5kcyk7IH0KKworICAgIH0gLyogYlVzZUJCQ3VlcyAqLworCisgICAgLyogcXVhbnRpemUvZGUtcXVhbnRpemUgaWNjICovCisgICAgeworICAgICAgUXVhbnRpemVDb2VmRkRLKGhUdG9Cb3gtPnBJY2NfX0ZESywgblBhcmFtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgaFR0b0JveC0+cEljY1F1YW50VGFibGVfX0ZESywgaFR0b0JveC0+bkljY1F1YW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGhUdG9Cb3gtPm5JY2NRdWFudFN0ZXBzLCBwSWNjSWR4KTsKKyAgICAgIFF1YW50aXplQ29lZkZESyhJY2NEb3dubWl4X19GREssIG5QYXJhbUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgIGhUdG9Cb3gtPnBJY2NRdWFudFRhYmxlX19GREssIGhUdG9Cb3gtPm5JY2NRdWFudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBoVHRvQm94LT5uSWNjUXVhbnRTdGVwcywgaFR0b0JveC0+cEljY0Rvd25taXhJZHgpOworICAgICAgZGVRdWFudGl6ZUNvZWZGREsoaFR0b0JveC0+cEljY0Rvd25taXhJZHgsIG5QYXJhbUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgaFR0b0JveC0+cEljY1F1YW50VGFibGVfX0ZESywgaFR0b0JveC0+bkljY1F1YW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgSWNjRG93bm1peFF1YW50X19GREspOworCisgICAgICAqcGJJY2NRdWFudENvYXJzZSA9IGhUdG9Cb3gtPmJVc2VDb2Fyc2VRdWFudEljYzsKKyAgICB9CisKKyAgICAvKiBxdWFudGl6ZS9kZS1xdWFudGl6ZSBjbGQgKi8KKyAgICBpZiAoIWJVc2VFYlEpIHsKKyAgICAgIFF1YW50aXplQ29lZkZESyhoVHRvQm94LT5wQ2xkX19GREssIG5QYXJhbUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgIGhUdG9Cb3gtPnBDbGRRdWFudFRhYmxlRW5jX19GREssIGhUdG9Cb3gtPm5DbGRRdWFudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBoVHRvQm94LT5uQ2xkUXVhbnRTdGVwcywgcENsZElkeCk7CisgICAgICBkZVF1YW50aXplQ29lZkZESyhwQ2xkSWR4LCBuUGFyYW1CYW5kcywgaFR0b0JveC0+cENsZFF1YW50VGFibGVEZWNfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhUdG9Cb3gtPm5DbGRRdWFudE9mZnNldCwgaFR0b0JveC0+cENsZFF1YW50X19GREspOworICAgIH0gZWxzZSB7CisgICAgICBGREttZW1jcHkocENsZElkeCwgaFR0b0JveC0+cENsZEViUUlkeCwgblBhcmFtQmFuZHMgKiBzaXplb2YoU0NIQVIpKTsKKyAgICB9CisgICAgKnBiQ2xkUXVhbnRDb2Fyc2UgPSBoVHRvQm94LT5iVXNlQ29hcnNlUXVhbnRDbGQ7CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworYmFpbDoKKyAgQ19BTExPQ19TQ1JBVENIX0VORChwYlNjYWxlQ2gyLCBJTlQsIE1BWF9OVU1fUEFSQU1fQkFORFMpCisgIENfQUxMT0NfU0NSQVRDSF9FTkQocGJTY2FsZUNoMSwgSU5ULCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKEljY0Rvd25taXhRdWFudF9fRkRLLCBGSVhQX0RCTCwgTUFYX05VTV9QQVJBTV9CQU5EUykKKyAgQ19BTExPQ19TQ1JBVENIX0VORChJY2NEb3dubWl4X19GREssIEZJWFBfREJMLCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorCisgIENfQUxMT0NfU0NSQVRDSF9FTkQocHJvZEh5YnJpZERhdGFJbWFnX19GREssIEZJWFBfREJMLCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHByb2RIeWJyaWREYXRhUmVhbF9fRkRLLCBGSVhQX0RCTCwgTUFYX05VTV9QQVJBTV9CQU5EUykKKyAgQ19BTExPQ19TQ1JBVENIX0VORChwb3dlckh5YnJpZERhdGEyX19GREssIEZJWFBfREJMLCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBvd2VySHlicmlkRGF0YTFfX0ZESywgRklYUF9EQkwsIE1BWF9OVU1fUEFSQU1fQkFORFMpCisKKyAgcmV0dXJuIGVycm9yOworfQorCitJTlQgZmRrX3NhY2VuY19zdWJiYW5kMlBhcmFtQmFuZChjb25zdCBCT1hfU1VCQkFORF9DT05GSUcgYm94U3ViYmFuZENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuU3ViYmFuZCkgeworICBJTlQgblBhcmFtQmFuZCA9IC0xOworICBjb25zdCBVQ0hBUiAqcFN1YmJhbmQyUGFyYW1ldGVySW5kZXggPQorICAgICAgZ2V0U3ViYmFuZDJQYXJhbWV0ZXJJbmRleChib3hTdWJiYW5kQ29uZmlnKTsKKworICBpZiAocFN1YmJhbmQyUGFyYW1ldGVySW5kZXggIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBoeWJyaWRfcmVzb2x1dGlvbiA9IDY0OworCisgICAgaWYgKChuU3ViYmFuZCA+IC0xKSAmJiAoblN1YmJhbmQgPCBoeWJyaWRfcmVzb2x1dGlvbikpIHsKKyAgICAgIG5QYXJhbUJhbmQgPSBwU3ViYmFuZDJQYXJhbWV0ZXJJbmRleFtuU3ViYmFuZF07CisgICAgfQorICB9CisKKyAgcmV0dXJuIG5QYXJhbUJhbmQ7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19wYXJhbWV4dHJhY3QuaCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3BhcmFtZXh0cmFjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYmI5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19wYXJhbWV4dHJhY3QuaApAQCAtMCwwICsxLDIxNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTS4gTXVsdHJ1cworCisgICBEZXNjcmlwdGlvbjogUGFyYW1ldGVyIEV4dHJhY3Rpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNFTkNfUEFSQU1FWFRSQUNUX0gKKyNkZWZpbmUgU0FDRU5DX1BBUkFNRVhUUkFDVF9ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAic2FjZW5jX2xpYi5oIgorI2luY2x1ZGUgInNhY2VuY19jb25zdC5oIgorI2luY2x1ZGUgInNhY2VuY19iaXRzdHJlYW0uaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNQVhfQ0xEX1FVQU5UX0ZJTkUgKDMxKQorI2RlZmluZSBNQVhfQ0xEX1FVQU5UX0NPQVJTRSAoMTUpCisjZGVmaW5lIE9GRlNFVF9DTERfUVVBTlRfQ09BUlNFICg3KQorI2RlZmluZSBPRkZTRVRfQ0xEX1FVQU5UX0ZJTkUgKDE1KQorCisjZGVmaW5lIE1BWF9JQ0NfUVVBTlRfQ09BUlNFICg0KQorI2RlZmluZSBNQVhfSUNDX1FVQU5UX0ZJTkUgKDgpCisjZGVmaW5lIE9GRlNFVF9JQ0NfUVVBTlRfQ09BUlNFICgwKQorI2RlZmluZSBPRkZTRVRfSUNDX1FVQU5UX0ZJTkUgKDApCisKKyNkZWZpbmUgTUFYX05VTV9QQVJBTV9CQU5EUyAoMjgpCisKKyNkZWZpbmUgTlVNX01BUFBFRF9IWUJSSURfQkFORFMgKDE2KQorCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBUX1RUT19CT1ggKkhBTkRMRV9UVE9fQk9YOworCit0eXBlZGVmIGVudW0geworICBCT1hfU1VCQkFORFNfSU5WQUxJRCA9IDAsCisgIEJPWF9TVUJCQU5EU180ID0gNCwKKyAgQk9YX1NVQkJBTkRTXzUgPSA1LAorICBCT1hfU1VCQkFORFNfNyA9IDcsCisgIEJPWF9TVUJCQU5EU185ID0gOSwKKyAgQk9YX1NVQkJBTkRTXzEyID0gMTIsCisgIEJPWF9TVUJCQU5EU18xNSA9IDE1LAorICBCT1hfU1VCQkFORFNfMjMgPSAyMworCit9IEJPWF9TVUJCQU5EX0NPTkZJRzsKKwordHlwZWRlZiBlbnVtIHsKKyAgQk9YX1FVQU5UTU9ERV9JTlZBTElEID0gLTEsCisgIEJPWF9RVUFOVE1PREVfRklORSA9IDAsCisgIEJPWF9RVUFOVE1PREVfRUJRMSA9IDEsCisgIEJPWF9RVUFOVE1PREVfRUJRMiA9IDIsCisgIEJPWF9RVUFOVE1PREVfUkVTRVJWRUQzID0gMywKKyAgQk9YX1FVQU5UTU9ERV9SRVNFUlZFRDQgPSA0LAorICBCT1hfUVVBTlRNT0RFX1JFU0VSVkVENSA9IDUsCisgIEJPWF9RVUFOVE1PREVfUkVTRVJWRUQ2ID0gNiwKKyAgQk9YX1FVQU5UTU9ERV9SRVNFUlZFRDcgPSA3CisKK30gQk9YX1FVQU5UTU9ERTsKKwordHlwZWRlZiBzdHJ1Y3QgVF9UVE9fQk9YX0NPTkZJRyB7CisgIFVDSEFSIGJVc2VDb2Fyc2VRdWFudENsZDsKKyAgVUNIQVIgYlVzZUNvYXJzZVF1YW50SWNjOworICBVQ0hBUiBiVXNlQ29oZXJlbmNlSWNjT25seTsKKworICBCT1hfU1VCQkFORF9DT05GSUcgc3ViYmFuZENvbmZpZzsKKyAgQk9YX1FVQU5UTU9ERSBib3hRdWFudE1vZGU7CisKKyAgVUNIQVIgbkh5YnJpZEJhbmRzTWF4OworCisgIFVDSEFSIGJGcmFtZUtlZXA7CisKK30gVFRPX0JPWF9DT05GSUc7CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2NyZWF0ZVR0b0JveChIQU5ETEVfVFRPX0JPWCAqaFR0b0JveCk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19pbml0VHRvQm94KEhBTkRMRV9UVE9fQk9YIGhUdG9Cb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVE9fQk9YX0NPTkZJRyAqY29uc3QgdHRvQm94Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVzdHJveVR0b0JveChIQU5ETEVfVFRPX0JPWCAqaFR0b0JveCk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19hcHBseVR0b0JveCgKKyAgICBIQU5ETEVfVFRPX0JPWCBoVHRvQm94LCBjb25zdCBJTlQgblRpbWVTbG90cywgY29uc3QgSU5UIHN0YXJ0VGltZVNsb3QsCisgICAgY29uc3QgSU5UIG5IeWJyaWRCYW5kcywgY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBwcEh5YnJpZERhdGExX19GREssCisgICAgY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBwcEh5YnJpZERhdGEyX19GREssIFNDSEFSICpjb25zdCBwSWNjSWR4LAorICAgIFVDSEFSICpjb25zdCBwYkljY1F1YW50Q29hcnNlLCBTQ0hBUiAqY29uc3QgcENsZElkeCwKKyAgICBVQ0hBUiAqY29uc3QgcGJDbGRRdWFudENvYXJzZSwgY29uc3QgSU5UIGJVc2VCQkN1ZXMsIElOVCAqc2NhbGVDaDAsCisgICAgSU5UICpzY2FsZUNoMSk7CisKK0lOVCBmZGtfc2FjZW5jX3N1YmJhbmQyUGFyYW1CYW5kKGNvbnN0IEJPWF9TVUJCQU5EX0NPTkZJRyBib3hTdWJiYW5kQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5TdWJiYW5kKTsKKworY29uc3QgSU5UICpmZGtfc2FjZW5jX2dldFN1YmJhbmRJbWFnU2lnbigpOworCit2b2lkIGZka19zYWNlbmNfY2FsY1BhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCgKKyAgICBjb25zdCBCT1hfU1VCQkFORF9DT05GSUcgc3ViYmFuZENvbmZpZywgY29uc3QgSU5UIG5IeWJyaWRCYW5kcywKKyAgICBVQ0hBUiAqcFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCk7CisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgVUNIQVIgZmRrX3NhY2VuY19nZXRDbGRRdWFudE9mZnNldChjb25zdCBJTlQgYlVzZUNvYXJzZVF1YW50KSB7CisgIHJldHVybiAoKGJVc2VDb2Fyc2VRdWFudCkgPyBPRkZTRVRfQ0xEX1FVQU5UX0NPQVJTRSA6IE9GRlNFVF9DTERfUVVBTlRfRklORSk7Cit9CitzdGF0aWMgaW5saW5lIFVDSEFSIGZka19zYWNlbmNfZ2V0SWNjUXVhbnRPZmZzZXQoY29uc3QgSU5UIGJVc2VDb2Fyc2VRdWFudCkgeworICByZXR1cm4gKChiVXNlQ29hcnNlUXVhbnQpID8gT0ZGU0VUX0lDQ19RVUFOVF9DT0FSU0UgOiBPRkZTRVRfSUNDX1FVQU5UX0ZJTkUpOworfQorCitzdGF0aWMgaW5saW5lIFVDSEFSIGZka19zYWNlbmNfZ2V0TnVtYmVyQ2xkUXVhbnRMZXZlbHMoCisgICAgY29uc3QgSU5UIGJVc2VDb2Fyc2VRdWFudCkgeworICByZXR1cm4gKChiVXNlQ29hcnNlUXVhbnQpID8gTUFYX0NMRF9RVUFOVF9DT0FSU0UgOiBNQVhfQ0xEX1FVQU5UX0ZJTkUpOworfQorc3RhdGljIGlubGluZSBVQ0hBUiBmZGtfc2FjZW5jX2dldE51bWJlckljY1F1YW50TGV2ZWxzKAorICAgIGNvbnN0IElOVCBiVXNlQ29hcnNlUXVhbnQpIHsKKyAgcmV0dXJuICgoYlVzZUNvYXJzZVF1YW50KSA/IE1BWF9JQ0NfUVVBTlRfQ09BUlNFIDogTUFYX0lDQ19RVUFOVF9GSU5FKTsKK30KKworI2VuZGlmIC8qIFNBQ0VOQ19QQVJBTUVYVFJBQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL3NyYy9zYWNlbmNfc3RhdGljZ2Fpbi5jcHAgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19zdGF0aWNnYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWY5ZjhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfc3RhdGljZ2Fpbi5jcHAKQEAgLTAsMCArMSw0NDYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHb2V0dGxpbmdlcgorCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIGdhaW4gbWFuYWdlbWVudCBvZiB0aGUgZW5jb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1xmaWxlCitUaGlzIGZpbGUgY29udGFpbnMgYWxsIHN0YXRpYyBnYWluIGluZnJhc3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJzYWNlbmNfc3RhdGljZ2Fpbi5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1QNFNQQUNFRU5DX0RNWF9HQUlOX0RFRkFVTFQgU0FDRU5DX0RNWEdBSU5fM19kQgorI2RlZmluZSBHQUlOQ0ZfU0YgKDQpCisjZGVmaW5lIEdBSU5DVDEoeCkgRkwyRlhDT05TVF9EQkwoeCkKKyNkZWZpbmUgR0FJTkNGKHgpIEZMMkZYQ09OU1RfREJMKHgpCisKKyNkZWZpbmUgR0FJTkNUMih4KSBGTDJGWENPTlNUX0RCTCh4KQorI2RlZmluZSBGWF9EQkwyRlhfR0FJTih4KSAoeCkKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IFNUQVRJQ19HQUlOIHsKKyAgLyogRXh0ZXJuYWwgQ29uZmlnIFZhbHVlcyAqLworICBNUDRTUEFDRUVOQ19NT0RFIGVuY01vZGU7CisgIE1QNFNQQUNFRU5DX0RNWF9HQUlOIGZpeGVkR2FpbkRNWDsKKyAgSU5UIHByZUdhaW5GYWN0b3JEYjsKKworICAvKiBJbnRlcm5hbCBWYWx1ZXMgKi8KKyAgRklYUF9HQUlOIFBvc3RHYWluX19GREs7CisgIEZJWFBfR0FJTiBwUHJlR2Fpbl9fRkRLW1NBQ0VOQ19NQVhfSU5QVVRfQ0hBTk5FTFNdOworfTsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAgIHByZUdhaW5GYWN0b3JUYWJsZToKKworICAgcHJlIGNhbGN1bGF0aW9uOiAoZmxvYXQpcG93KDEwLmYsKCgoZmxvYXQpIHgpLzIwLmYpKS8oZmxvYXQpKDE8PEdBSU5DRl9TRiksIHgKKyAgID0gLTIwIC4uLiArMjAKKyovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgcHJlR2FpbkZhY3RvclRhYmxlX19GREtbNDFdID0geworICAgIEdBSU5DRig2LjI1MDAwMDA5MzFlLTAwMyksIEdBSU5DRig3LjAxMjYxNTQ0NjBlLTAwMyksCisgICAgR0FJTkNGKDcuODY4MjgzNDI4M2UtMDAzKSwgR0FJTkNGKDguODI4MzU5NjU2MGUtMDAzKSwKKyAgICBHQUlOQ0YoOS45MDU1ODIyOTM5ZS0wMDMpLCBHQUlOQ0YoMS4xMTE0MjQ2MjEyZS0wMDIpLAorICAgIEdBSU5DRigxLjI0NzAzODk3MTZlLTAwMiksIEdBSU5DRigxLjM5OTIwMDY4OTBlLTAwMiksCisgICAgR0FJTkNGKDEuNTY5OTI4OTczOWUtMDAyKSwgR0FJTkNGKDEuNzYxNDg5MzYxNWUtMDAyKSwKKyAgICBHQUlOQ0YoMS45NzY0MjM1MjQzZS0wMDIpLCBHQUlOQ0YoMi4yMTc1ODM3MzA4ZS0wMDIpLAorICAgIEdBSU5DRigyLjQ4ODE2OTgxOTFlLTAwMiksIEdBSU5DRigyLjc5MTc3MjQxMDNlLTAwMiksCisgICAgR0FJTkNGKDMuMTMyNDIwMDMzMmUtMDAyKSwgR0FJTkNGKDMuNTE0NjMzMzI3N2UtMDAyKSwKKyAgICBHQUlOQ0YoMy45NDM0ODM1MzE1ZS0wMDIpLCBHQUlOQ0YoNC40MjQ2NjEwMjU0ZS0wMDIpLAorICAgIEdBSU5DRig0Ljk2NDU1MTMyOTZlLTAwMiksIEdBSU5DRig1LjU3MDMxODE3NzNlLTAwMiksCisgICAgR0FJTkNGKDYuMjUwMDAwMDAwMGUtMDAyKSwgR0FJTkNGKDcuMDEyNjE1MzUyOWUtMDAyKSwKKyAgICBHQUlOQ0YoNy44NjgyODM5ODcwZS0wMDIpLCBHQUlOQ0YoOC44MjgzNTk4NDIzZS0wMDIpLAorICAgIEdBSU5DRig5LjkwNTU4MjY2NjRlLTAwMiksIEdBSU5DRigxLjExMTQyNDYzOThlLTAwMSksCisgICAgR0FJTkNGKDEuMjQ3MDM4OTE1OGUtMDAxKSwgR0FJTkNGKDEuMzk5MjAwNzA3N2UtMDAxKSwKKyAgICBHQUlOQ0YoMS41Njk5Mjg5NzM5ZS0wMDEpLCBHQUlOQ0YoMS43NjE0ODkzNjE1ZS0wMDEpLAorICAgIEdBSU5DRigxLjk3NjQyMzU2MTZlLTAwMSksIEdBSU5DRigyLjIxNzU4MzY1NjNlLTAwMSksCisgICAgR0FJTkNGKDIuNDg4MTY5ODE5MWUtMDAxKSwgR0FJTkNGKDIuNzkxNzcyNDg0OGUtMDAxKSwKKyAgICBHQUlOQ0YoMy4xMzI0MjAxODIyZS0wMDEpLCBHQUlOQ0YoMy41MTQ2MzMxNzg3ZS0wMDEpLAorICAgIEdBSU5DRigzLjk0MzQ4MzUzMTVlLTAwMSksIEdBSU5DRig0LjQyNDY2MTA5OTllLTAwMSksCisgICAgR0FJTkNGKDQuOTY0NTUxMzI5NmUtMDAxKSwgR0FJTkNGKDUuNTcwMzE4MTAyOGUtMDAxKSwKKyAgICBHQUlOQ0YoNi4yNTAwMDAwMDAwZS0wMDEpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfR0FJTiBkbXhHYWluVGFibGVfX0ZES1tdID0geworICAgIC8qIEdBSU5DVDIoMS4wKSwgKi8gR0FJTkNUMigwLjg0MDg5NjUwZiksCisgICAgR0FJTkNUMigwLjcwNzEwNzA2ZiksCisgICAgR0FJTkNUMigwLjU5NDYwMzg1ZiksCisgICAgR0FJTkNUMigwLjUwMDAwMDAwZiksCisgICAgR0FJTkNUMigwLjQyMDQ0ODI1ZiksCisgICAgR0FJTkNUMigwLjM1MzU1MzQxZiksCisgICAgR0FJTkNUMigwLjI1MDAwMDAwZil9OworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb25uYW1lOiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fT3BlbkNvbmZpZygpCitkZXNjcmlwdGlvbjogIG9wZW5zIGFuZCBzZXRzIENvbmZpZ1N0cnVjdCB0byBEZWZhdWx0IFZhbHVlcworcmV0dXJuczogICAgICBub0Vycm9yIG9uIHN1Y2Nlc3MsIGFuIGFwcm9wcmlhdGUgZXJyb3IgY29kZSBlbHNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3RhdGljR2Fpbl9PcGVuQ29uZmlnKAorICAgIEhBTkRMRV9TVEFUSUNfR0FJTl9DT05GSUcgKnBoU3RhdGljR2FpbkNvbmZpZykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IHBoU3RhdGljR2FpbkNvbmZpZykgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIC8qIEFsbG9jYXRlIEluc3RhbmNlICovCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRCgqcGhTdGF0aWNHYWluQ29uZmlnLCAxLCBzdHJ1Y3QgU1RBVElDX0dBSU5fQ09ORklHKTsKKyAgfQorICByZXR1cm4gZXJyb3I7CisKK2JhaWw6CisgIGZka19zYWNlbmNfc3RhdGljR2Fpbl9DbG9zZUNvbmZpZyhwaFN0YXRpY0dhaW5Db25maWcpOworICByZXR1cm4gKChTQUNFTkNfT0sgPT0gZXJyb3IpID8gU0FDRU5DX01FTU9SWV9FUlJPUiA6IGVycm9yKTsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fSW5pdERlZmF1bHRDb25maWcoCisgICAgSEFORExFX1NUQVRJQ19HQUlOX0NPTkZJRyBoU3RhdGljR2FpbkNvbmZpZykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IGhTdGF0aWNHYWluQ29uZmlnKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgLyogTmVjZXNzYXJ5IElucHV0IFZhcmlhYmxlcyAqLworICAgIGhTdGF0aWNHYWluQ29uZmlnLT5lbmNNb2RlID0gU0FDRU5DX0lOVkFMSURfTU9ERTsKKworICAgIC8qIE9wdGlvbmFsIENvbmZpZ3MgU2V0IHRvIERlZmF1bHQgVmFsdWVzICovCisgICAgaFN0YXRpY0dhaW5Db25maWctPmZpeGVkR2FpbkRNWCA9IE1QNFNQQUNFRU5DX0RNWF9HQUlOX0RFRkFVTFQ7CisgICAgaFN0YXRpY0dhaW5Db25maWctPnByZUdhaW5GYWN0b3JEYiA9IDA7CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbm5hbWU6IGZka19zYWNlbmNfc3RhdGljR2Fpbl9DbG9zZUNvbmZpZygpCitkZXNjcmlwdGlvbjogIGRlc3RydWN0cyBTdGF0aWMgR2FpbiBDb25maWcgU3RydWN0dXJlCityZXR1cm5zOiAgICAgIG5vRXJyb3Igb24gc3VjY2VzcywgYW4gYXByb3ByaWF0ZSBlcnJvciBjb2RlIGVsc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zdGF0aWNHYWluX0Nsb3NlQ29uZmlnKAorICAgIEhBTkRMRV9TVEFUSUNfR0FJTl9DT05GSUcgKnBoU3RhdGljR2FpbkNvbmZpZykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgocGhTdGF0aWNHYWluQ29uZmlnID09IE5VTEwpIHx8ICgqcGhTdGF0aWNHYWluQ29uZmlnID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgRkRLZnJlZSgqcGhTdGF0aWNHYWluQ29uZmlnKTsKKyAgICAqcGhTdGF0aWNHYWluQ29uZmlnID0gTlVMTDsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9ubmFtZTogZmRrX3NhY2VuY19zdGF0aWNHYWluX09wZW4oKQorZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyBTdGF0aWMgR2FpbnMKK3JldHVybnM6ICAgICAgbm9FcnJvciBvbiBzdWNjZXNzLCBhbiBhcHJvcHJpYXRlIGVycm9yIGNvZGUgZWxzZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fT3BlbihIQU5ETEVfU1RBVElDX0dBSU4gKnBoU3RhdGljR2FpbikgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IHBoU3RhdGljR2FpbikgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIC8qIEFsbG9jYXRlIEluc3RhbmNlICovCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRCgqcGhTdGF0aWNHYWluLCAxLCBzdHJ1Y3QgU1RBVElDX0dBSU4pOworICB9CisgIHJldHVybiBlcnJvcjsKKworYmFpbDoKKyAgcmV0dXJuICgoU0FDRU5DX09LID09IGVycm9yKSA/IFNBQ0VOQ19NRU1PUllfRVJST1IgOiBlcnJvcik7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zdGF0aWNHYWluX0luaXQoCisgICAgSEFORExFX1NUQVRJQ19HQUlOIGhTdGF0aWNHYWluLAorICAgIGNvbnN0IEhBTkRMRV9TVEFUSUNfR0FJTl9DT05GSUcgaFN0YXRpY0dhaW5Db25maWcsIElOVCAqY29uc3Qgc2NhbGUpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKGhTdGF0aWNHYWluID09IE5VTEwpIHx8IChoU3RhdGljR2FpbkNvbmZpZyA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGhTdGF0aWNHYWluLT5lbmNNb2RlID0gaFN0YXRpY0dhaW5Db25maWctPmVuY01vZGU7CisgICAgaFN0YXRpY0dhaW4tPmZpeGVkR2FpbkRNWCA9IGhTdGF0aWNHYWluQ29uZmlnLT5maXhlZEdhaW5ETVg7CisgICAgaFN0YXRpY0dhaW4tPnByZUdhaW5GYWN0b3JEYiA9IGhTdGF0aWNHYWluQ29uZmlnLT5wcmVHYWluRmFjdG9yRGI7CisKKyAgICBpZiAoKGhTdGF0aWNHYWluLT5wcmVHYWluRmFjdG9yRGIgPCAtMjApIHx8CisgICAgICAgIChoU3RhdGljR2Fpbi0+cHJlR2FpbkZhY3RvckRiID4gMjApKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBGSVhQX0RCTCBmUHJlR2FpbkZhY3Rvcl9fRkRLOworCisgICAgaWYgKGhTdGF0aWNHYWluLT5wcmVHYWluRmFjdG9yRGIgPT0gMCkgeworICAgICAgZlByZUdhaW5GYWN0b3JfX0ZESyA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgKnNjYWxlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgaW50IHM7CisgICAgICBmUHJlR2FpbkZhY3Rvcl9fRkRLID0KKyAgICAgICAgICBwcmVHYWluRmFjdG9yVGFibGVfX0ZES1toU3RhdGljR2Fpbi0+cHJlR2FpbkZhY3RvckRiICsgMjBdOworICAgICAgcyA9IGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MoZlByZUdhaW5GYWN0b3JfX0ZESykgLSAxKTsKKyAgICAgIGZQcmVHYWluRmFjdG9yX19GREsgPSBmUHJlR2FpbkZhY3Rvcl9fRkRLIDw8IChzKTsKKyAgICAgICpzY2FsZSA9IEdBSU5DRl9TRiAtIHM7CisgICAgfQorCisgICAgaWYgKGhTdGF0aWNHYWluLT5maXhlZEdhaW5ETVggPT0gMCkKKyAgICAgIGhTdGF0aWNHYWluLT5Qb3N0R2Fpbl9fRkRLID0gTUFYVkFMX0dBSU47CisgICAgZWxzZQorICAgICAgaFN0YXRpY0dhaW4tPlBvc3RHYWluX19GREsgPQorICAgICAgICAgIGRteEdhaW5UYWJsZV9fRkRLW2hTdGF0aWNHYWluLT5maXhlZEdhaW5ETVggLSAxXTsKKworICAgIEZES21lbWNsZWFyKAorICAgICAgICBoU3RhdGljR2Fpbi0+cFByZUdhaW5fX0ZESywKKyAgICAgICAgc2l6ZW9mKGhTdGF0aWNHYWluLT5wUHJlR2Fpbl9fRkRLKSk7IC8qIHplcm8gYWxsIGlucHV0IGNoYW5uZWxzICovCisKKyAgICAvKiBDb25maWd1cmUgUHJlR2Fpbi1WZWN0b3IgKi8KKyAgICBpZiAoaFN0YXRpY0dhaW4tPmVuY01vZGUgPT0gU0FDRU5DXzIxMikgeworICAgICAgaFN0YXRpY0dhaW4tPnBQcmVHYWluX19GREtbMF0gPQorICAgICAgICAgIEZYX0RCTDJGWF9HQUlOKGZQcmVHYWluRmFjdG9yX19GREspOyAvKiBMICovCisgICAgICBoU3RhdGljR2Fpbi0+cFByZUdhaW5fX0ZES1sxXSA9CisgICAgICAgICAgRlhfREJMMkZYX0dBSU4oZlByZUdhaW5GYWN0b3JfX0ZESyk7IC8qIFIgKi8KKyAgICB9IGVsc2UgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgfQorCisgIH0gLyogdmFsaWQgaGFuZGxlICovCisKK2JhaWw6CisKKyAgcmV0dXJuIGVycm9yOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbm5hbWU6IGZka19zYWNlbmNfc3RhdGljR2Fpbl9DbG9zZSgpCitkZXNjcmlwdGlvbjogIGRlc3RydWN0cyBTdGF0aWMgR2FpbnMKK3JldHVybnM6ICAgICAgbm9FcnJvciBvbiBzdWNjZXNzLCBhbiBhcHJvcHJpYXRlIGVycm9yIGNvZGUgZWxzZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fQ2xvc2UoSEFORExFX1NUQVRJQ19HQUlOICpwaFN0YXRpY0dhaW4pIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKHBoU3RhdGljR2FpbiA9PSBOVUxMKSB8fCAoKnBoU3RhdGljR2FpbiA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIEZES2ZyZWUoKnBoU3RhdGljR2Fpbik7CisgICAgKnBoU3RhdGljR2FpbiA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbm5hbWU6IGZka19zYWNlbmNfc3RhdGljUG9zdEdhaW5fQXBwbHkKK2Rlc2NyaXB0aW9uOiAgbXVsdGlwbHkgdGhlIE91dHB1dCBzYW1wbGVzIHdpdGggdGhlIFBvc3RHYWluCityZXR1cm5zOiAgICAgIG5vRXJyb3Igb24gc3VjY2VzcywgYW4gYXByb3ByaWF0ZSBlcnJvciBjb2RlIGVsc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zdGF0aWNQb3N0R2Fpbl9BcHBseUZESygKKyAgICBjb25zdCBIQU5ETEVfU1RBVElDX0dBSU4gaFN0YXRpY0dhaW4sIElOVF9QQ00gKmNvbnN0IHBPdXRwdXRTYW1wbGVzLAorICAgIGNvbnN0IElOVCBuT3V0cHV0U2FtcGxlcywgY29uc3QgSU5UIHNjYWxlKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKE5VTEwgPT0gaFN0YXRpY0dhaW4pIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBGSVhQX0dBSU4gcG9zdEdhaW4gPSBoU3RhdGljR2Fpbi0+UG9zdEdhaW5fX0ZESzsKKworICAgIGlmIChzY2FsZSA8IDApIHsKKyAgICAgIGlmIChwb3N0R2FpbiA9PSBNQVhWQUxfR0FJTikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbk91dHB1dFNhbXBsZXM7IGkrKykgeworICAgICAgICAgIHBPdXRwdXRTYW1wbGVzW2ldID0gcE91dHB1dFNhbXBsZXNbaV0gPj4gKC1zY2FsZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuT3V0cHV0U2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgcE91dHB1dFNhbXBsZXNbaV0gPSBGWF9EQkwyRlhfUENNKAorICAgICAgICAgICAgICBmTXVsdChwb3N0R2FpbiwgRlhfUENNMkZYX0RCTChwT3V0cHV0U2FtcGxlc1tpXSkpID4+ICgtc2NhbGUpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAocG9zdEdhaW4gPT0gTUFYVkFMX0dBSU4pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5PdXRwdXRTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICBwT3V0cHV0U2FtcGxlc1tpXSA9IEZYX0RCTDJGWF9QQ00oU0FUVVJBVEVfTEVGVF9TSElGVCgKKyAgICAgICAgICAgICAgRlhfUENNMkZYX0RCTChwT3V0cHV0U2FtcGxlc1tpXSksIHNjYWxlLCBERlJBQ1RfQklUUykpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbk91dHB1dFNhbXBsZXM7IGkrKykgeworICAgICAgICAgIHBPdXRwdXRTYW1wbGVzW2ldID0gRlhfREJMMkZYX1BDTShTQVRVUkFURV9MRUZUX1NISUZUKAorICAgICAgICAgICAgICBmTXVsdChwb3N0R2FpbiwgRlhfUENNMkZYX0RCTChwT3V0cHV0U2FtcGxlc1tpXSkpLCBzY2FsZSwKKyAgICAgICAgICAgICAgREZSQUNUX0JJVFMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9ubmFtZTogZmRrX3NhY2VuY19nZXRQcmVHYWluUHRyKCkvIGZka19zYWNlbmNfZ2V0UG9zdEdhaW4oKQorZGVzY3JpcHRpb246ICBnZXQgR2Fpbi1Qb2ludGVycyBmcm9tIHN0cnVjdAorcmV0dXJuczogICAgICBQb2ludGVyIHRvIFByZUdhaW4gb3IgcG9zdEdhaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0ZJWFBfR0FJTiAqZmRrX3NhY2VuY19nZXRQcmVHYWluUHRyRkRLKEhBTkRMRV9TVEFUSUNfR0FJTiBoU3RhdGljR2FpbikgeworICByZXR1cm4gKChoU3RhdGljR2FpbiA9PSBOVUxMKSA/IE5VTEwgOiBoU3RhdGljR2Fpbi0+cFByZUdhaW5fX0ZESyk7Cit9CisKK0ZJWFBfR0FJTiBmZGtfc2FjZW5jX2dldFBvc3RHYWluRkRLKEhBTkRMRV9TVEFUSUNfR0FJTiBoU3RhdGljR2FpbikgeworICByZXR1cm4gKGhTdGF0aWNHYWluLT5Qb3N0R2Fpbl9fRkRLKTsKK30KKworLyogZ2V0IGZpeGVkIGRvd25taXggZ2FpbiBhbmQgbWFwIGl0IHRvIGJpdHN0cmVhbSBlbnVtICovCitGSVhFREdBSU5ETVhDT05GSUcgZmRrX3NhY2VuY19zdGF0aWNHYWluX0dldERteEdhaW4oCisgICAgY29uc3QgSEFORExFX1NUQVRJQ19HQUlOIGhTdGF0aWNHYWluKSB7CisgIEZJWEVER0FJTkRNWENPTkZJRyBkbXhHYWluID0gRklYRURHQUlORE1YX0lOVkFMSUQ7CisKKyAgc3dpdGNoIChoU3RhdGljR2Fpbi0+Zml4ZWRHYWluRE1YKSB7CisgICAgY2FzZSAwOgorICAgICAgZG14R2FpbiA9IEZJWEVER0FJTkRNWF8wOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgZG14R2FpbiA9IEZJWEVER0FJTkRNWF8xOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgZG14R2FpbiA9IEZJWEVER0FJTkRNWF8yOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgZG14R2FpbiA9IEZJWEVER0FJTkRNWF8zOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgZG14R2FpbiA9IEZJWEVER0FJTkRNWF80OworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgZG14R2FpbiA9IEZJWEVER0FJTkRNWF81OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgZG14R2FpbiA9IEZJWEVER0FJTkRNWF82OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgZG14R2FpbiA9IEZJWEVER0FJTkRNWF83OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGRteEdhaW4gPSBGSVhFREdBSU5ETVhfSU5WQUxJRDsKKyAgfQorICByZXR1cm4gZG14R2FpbjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fU2V0RG14R2FpbigKKyAgICBIQU5ETEVfU1RBVElDX0dBSU5fQ09ORklHIGhTdGF0aWNHYWluQ2ZnLAorICAgIGNvbnN0IE1QNFNQQUNFRU5DX0RNWF9HQUlOIGRteEdhaW4pIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBoU3RhdGljR2FpbkNmZykgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGhTdGF0aWNHYWluQ2ZnLT5maXhlZEdhaW5ETVggPSBkbXhHYWluOworICB9CisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fU2V0RW5jTW9kZSgKKyAgICBIQU5ETEVfU1RBVElDX0dBSU5fQ09ORklHIGhTdGF0aWNHYWluQ2ZnLCBjb25zdCBNUDRTUEFDRUVOQ19NT0RFIGVuY01vZGUpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBoU3RhdGljR2FpbkNmZykgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGhTdGF0aWNHYWluQ2ZnLT5lbmNNb2RlID0gZW5jTW9kZTsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19zdGF0aWNnYWluLmggYi9saWJTQUNlbmMvc3JjL3NhY2VuY19zdGF0aWNnYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiM2JlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3N0YXRpY2dhaW4uaApAQCAtMCwwICsxLDE3NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdvZXR0bGluZ2VyCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWMKKyAgICAgICAgICAgICAgICBnYWluIG1hbmFnZW1lbnQgb2YgdGhlIGVuY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioKKyAgIFxmaWxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ0VOQ19TVEFUSUNHQUlOX0gKKyNkZWZpbmUgU0FDRU5DX1NUQVRJQ0dBSU5fSAorCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgInNhY2VuY19saWIuaCIKKyNpbmNsdWRlICJzYWNlbmNfY29uc3QuaCIKKyNpbmNsdWRlICJzYWNlbmNfYml0c3RyZWFtLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRklYUF9HQUlOIEZJWFBfREJMCisjZGVmaW5lIE1BWFZBTF9HQUlOICgoRklYUF9EQkwpTUFYVkFMX0RCTCkKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IFNUQVRJQ19HQUlOX0NPTkZJRyB7CisgIE1QNFNQQUNFRU5DX01PREUgZW5jTW9kZTsKKyAgTVA0U1BBQ0VFTkNfRE1YX0dBSU4gZml4ZWRHYWluRE1YOworICBJTlQgcHJlR2FpbkZhY3RvckRiOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgU1RBVElDX0dBSU5fQ09ORklHICpIQU5ETEVfU1RBVElDX0dBSU5fQ09ORklHOwordHlwZWRlZiBzdHJ1Y3QgU1RBVElDX0dBSU4gKkhBTkRMRV9TVEFUSUNfR0FJTjsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluaXRpYWxpemVzIFN0YXRpYyBHYWluIENvbXB1dGF0aW9uIENvbmZpZyAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fT3BlbkNvbmZpZygKKyAgICBIQU5ETEVfU1RBVElDX0dBSU5fQ09ORklHICpwaFN0YXRpY0dhaW5Db25maWcpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3RhdGljR2Fpbl9Jbml0RGVmYXVsdENvbmZpZygKKyAgICBIQU5ETEVfU1RBVElDX0dBSU5fQ09ORklHIGhTdGF0aWNHYWluQ29uZmlnKTsKKworLyogRGVsZXRlcyBTdGF0aWMgR2FpbiBDb21wdXRhdGlvbiBDb25maWcgfkRlc3RydWN0b3IgKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zdGF0aWNHYWluX0Nsb3NlQ29uZmlnKAorICAgIEhBTkRMRV9TVEFUSUNfR0FJTl9DT05GSUcgKnBoU3RhdGljR2FpbkNvbmZpZyk7CisKKy8qIEluaXRpYWxpemVzIFN0YXRpYyBHYWluIENvbXB1dGF0aW9uIH5Db25zdHJ1Y3RvciAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fT3BlbihIQU5ETEVfU1RBVElDX0dBSU4gKnBoU3RhdGljR2Fpbik7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zdGF0aWNHYWluX0luaXQoCisgICAgSEFORExFX1NUQVRJQ19HQUlOIGhTdGF0aWNHYWluLAorICAgIGNvbnN0IEhBTkRMRV9TVEFUSUNfR0FJTl9DT05GSUcgaFN0YXRpY0dhaW5Db25maWcsIElOVCAqY29uc3Qgc2NhbGUpOworCisvKiBEZWxldGVzIFN0YXRpYyBHYWluIENvbXB1dGF0aW9uIEluZnJhc3R1Y3R1cmUgfkRlc3RydWN0b3IgKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zdGF0aWNHYWluX0Nsb3NlKEhBTkRMRV9TVEFUSUNfR0FJTiAqcGhTdGF0aWNHYWluKTsKKworLyogQXBwbHkgUG9zdEdhaW4gdG8gdGhlIG91dHB1dCBQQ00gRG93bm1peC1TaWduYWwgKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zdGF0aWNQb3N0R2Fpbl9BcHBseUZESygKKyAgICBjb25zdCBIQU5ETEVfU1RBVElDX0dBSU4gaFN0YXRpY0dhaW4sIElOVF9QQ00gKmNvbnN0IHBPdXRwdXRTYW1wbGVzLAorICAgIGNvbnN0IElOVCBuT3V0cHV0U2FtcGxlcywgY29uc3QgSU5UIHNjYWxlKTsKKworLyogR2V0IFBvaW50ZXIgdG8gUHJlR2Fpbi12ZWN0b3IgKi8KK0ZJWFBfR0FJTiAqZmRrX3NhY2VuY19nZXRQcmVHYWluUHRyRkRLKEhBTkRMRV9TVEFUSUNfR0FJTiBoU3RhdGljR2Fpbik7CisKKy8qIEdldCBQb2ludGVyIHRvIFBvc3RHYWluLWNvZWYgKi8KK0ZJWFBfR0FJTiBmZGtfc2FjZW5jX2dldFBvc3RHYWluRkRLKEhBTkRMRV9TVEFUSUNfR0FJTiBoU3RhdGljR2Fpbik7CisKK0ZJWEVER0FJTkRNWENPTkZJRyBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fR2V0RG14R2FpbigKKyAgICBjb25zdCBIQU5ETEVfU1RBVElDX0dBSU4gaFN0YXRpY0dhaW4pOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3RhdGljR2Fpbl9TZXREbXhHYWluKAorICAgIEhBTkRMRV9TVEFUSUNfR0FJTl9DT05GSUcgaFN0YXRpY0dhaW5DZmcsCisgICAgY29uc3QgTVA0U1BBQ0VFTkNfRE1YX0dBSU4gZG14R2Fpbik7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zdGF0aWNHYWluX1NldEVuY01vZGUoCisgICAgSEFORExFX1NUQVRJQ19HQUlOX0NPTkZJRyBoU3RhdGljR2FpbkNmZywgY29uc3QgTVA0U1BBQ0VFTkNfTU9ERSBlbmNNb2RlKTsKKworI2VuZGlmIC8qIFNBQ0VOQ19TVEFUSUNHQUlOX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3RyZWUuY3BwIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfdHJlZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkMzEyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3RyZWUuY3BwCkBAIC0wLDAgKzEsNDg4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXggTmV1ZW5kb3JmCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgVHJlZSBTdHJ1Y3R1cmUgZm9yIFNwYWNlIEVuY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY190cmVlLmgiCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKyNpbmNsdWRlICJzYWNlbmNfY29uc3QuaCIKKyNpbmNsdWRlICJzYWNlbmNfcGFyYW1leHRyYWN0LmgiCisjaW5jbHVkZSAic2FjZW5jX2ZyYW1ld2luZG93aW5nLmgiCisjaW5jbHVkZSAiRkRLX21hdHJpeENhbGxvYy5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlbnVtIHsgQk9YXzAgPSAwLCBCT1hfMSA9IDEgfTsKKworZW51bSB7IENIX0wgPSAwLCBDSF9SID0gMSB9OworCitlbnVtIHsgVFRPX0NIXzAgPSAwLCBUVE9fQ0hfMSA9IDEgfTsKKworZW51bSB7IFdJTl9JTkFDVElWID0gMCwgV0lOX0FDVElWID0gMSB9OworCitlbnVtIHsgTUFYX0tFRVBfRlJBTUVDT1VOVCA9IDEwMCB9OworCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgU1BBQ0VfVFJFRSB7CisgIFNQQUNFVFJFRV9NT0RFIG1vZGU7CisgIFNQQUNFX1RSRUVfREVTQ1JJUFRJT04gZGVzY3I7CisgIEhBTkRMRV9UVE9fQk9YIHR0b0JveFtTQUNFTkNfTUFYX05VTV9CT1hFU107CisgIFVDSEFSIG5QYXJhbUJhbmRzOworICBVQ0hBUiBiVXNlQ29hcnNlUXVhbnRUdG9JY2M7CisgIFVDSEFSIGJVc2VDb2Fyc2VRdWFudFR0b0NsZDsKKyAgUVVBTlRNT0RFIHF1YW50TW9kZTsKKyAgSU5UIGZyYW1lQ291bnQ7CisgIFVDSEFSIGJGcmFtZUtlZXA7CisKKyAgLyogSW50ZXJtZWRpYXRlIGJ1ZmZlcnMgKi8KKyAgVUNIQVIgcENsZF9wcmV2W1NBQ0VOQ19NQVhfTlVNX0JPWEVTXVtNQVhfTlVNX1BBUkFNX0JBTkRTXTsKKyAgVUNIQVIgcEljY19wcmV2W1NBQ0VOQ19NQVhfTlVNX0JPWEVTXVtNQVhfTlVNX1BBUkFNX0JBTkRTXTsKKworICBVQ0hBUiBuQ2hhbm5lbHNJbk1heDsKKyAgVUNIQVIgbkh5YnJpZEJhbmRzTWF4OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBib3hJZDsKKyAgVUNIQVIgaW5DaDE7CisgIFVDSEFSIGluQ2gyOworICBVQ0hBUiBpbkNoMzsKKyAgVUNIQVIgaW5DaDQ7CisgIFVDSEFSIHdDaDE7CisgIFVDSEFSIHdDaDI7CisKK30gVFRPX0RFU0NSSVBUT1I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU1BBQ0VUUkVFX01PREUgbW9kZTsKKyAgU1BBQ0VfVFJFRV9ERVNDUklQVElPTiB0cmVlRGVzY3JpcHRpb247CisKK30gVFJFRV9DT05GSUc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU1BBQ0VUUkVFX01PREUgbW9kZTsKKyAgVUNIQVIgbkNoYW5uZWxzSW47CisgIFVDSEFSIG5DaGFubmVsc091dDsKKyAgVUNIQVIgblR0b0JveGVzOworICBUVE9fREVTQ1JJUFRPUiB0dG9fZGVzY3JpcHRvclsxXTsKKworfSBUUkVFX1NFVFVQOworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgVFJFRV9DT05GSUcgdHJlZUNvbmZpZ1RhYmxlW10gPSB7CisgICAge1NQQUNFVFJFRV9JTlZBTElEX01PREUsIHswLCAwLCAwfX0sIHtTUEFDRVRSRUVfMjEyLCB7MSwgMSwgMn19fTsKKworc3RhdGljIGNvbnN0IFRSRUVfU0VUVVAgdHJlZVNldHVwVGFibGVbXSA9IHsKKyAgICB7U1BBQ0VUUkVFX0lOVkFMSURfTU9ERSwgMCwgMCwgMCwge3swLCAwLCAwLCAwLCAwLCAwLCAwfX19LAorICAgIHtTUEFDRVRSRUVfMjEyLAorICAgICAyLAorICAgICAxLAorICAgICAxLAorICAgICB7e0JPWF8wLCBDSF9MLCBDSF9SLCBUVE9fQ0hfMCwgVFRPX0NIXzEsIFdJTl9BQ1RJViwgV0lOX0FDVElWfX19fTsKKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBnZXRUcmVlQ29uZmlnKAorICAgIGNvbnN0IFNQQUNFVFJFRV9NT0RFIG1vZGUsIFNQQUNFX1RSRUVfREVTQ1JJUFRJT04gKnBUcmVlRGVzY3JpcHRpb24pIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19JTklUX0VSUk9SOworCisgIGlmIChwVHJlZURlc2NyaXB0aW9uID09IE5VTEwpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKHRyZWVDb25maWdUYWJsZSkgLyBzaXplb2YoVFJFRV9DT05GSUcpKTsgaSsrKSB7CisgICAgICBpZiAodHJlZUNvbmZpZ1RhYmxlW2ldLm1vZGUgPT0gbW9kZSkgeworICAgICAgICAqcFRyZWVEZXNjcmlwdGlvbiA9IHRyZWVDb25maWdUYWJsZVtpXS50cmVlRGVzY3JpcHRpb247CisgICAgICAgIGVycm9yID0gU0FDRU5DX09LOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gLyogdmFsaWQgaGFuZGxlICovCisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGNvbnN0IFRSRUVfU0VUVVAgKmdldFRyZWVTZXR1cChjb25zdCBTUEFDRVRSRUVfTU9ERSBtb2RlKSB7CisgIGludCBpOworICBjb25zdCBUUkVFX1NFVFVQICpzZXR1cCA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpKHNpemVvZih0cmVlU2V0dXBUYWJsZSkgLyBzaXplb2YoVFJFRV9TRVRVUCkpOyBpKyspIHsKKyAgICBpZiAodHJlZVNldHVwVGFibGVbaV0ubW9kZSA9PSBtb2RlKSB7CisgICAgICBzZXR1cCA9ICZ0cmVlU2V0dXBUYWJsZVtpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc2V0dXA7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zcGFjZVRyZWVfT3BlbihIQU5ETEVfU1BBQ0VfVFJFRSAqcGhTcGFjZVRyZWUpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKyAgSEFORExFX1NQQUNFX1RSRUUgaFNwYWNlVHJlZSA9IE5VTEw7CisKKyAgaWYgKE5VTEwgPT0gcGhTcGFjZVRyZWUpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgYm94OworCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoU3BhY2VUcmVlLCAxLCBzdHJ1Y3QgU1BBQ0VfVFJFRSk7CisKKyAgICBmb3IgKGJveCA9IDA7IGJveCA8IFNBQ0VOQ19NQVhfTlVNX0JPWEVTOyBib3grKykgeworICAgICAgSEFORExFX1RUT19CT1ggdHRvQm94ID0gTlVMTDsKKyAgICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19jcmVhdGVUdG9Cb3goJnR0b0JveCkpKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGlmIChOVUxMICE9IGhTcGFjZVRyZWUpIHsKKyAgICAgICAgaFNwYWNlVHJlZS0+dHRvQm94W2JveF0gPSB0dG9Cb3g7CisgICAgICB9CisgICAgfQorICAgICpwaFNwYWNlVHJlZSA9IGhTcGFjZVRyZWU7CisgIH0KKyAgcmV0dXJuIGVycm9yOworCitiYWlsOgorICBmZGtfc2FjZW5jX3NwYWNlVHJlZV9DbG9zZSgmaFNwYWNlVHJlZSk7CisgIHJldHVybiAoKFNBQ0VOQ19PSyA9PSBlcnJvcikgPyBTQUNFTkNfTUVNT1JZX0VSUk9SIDogZXJyb3IpOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3BhY2VUcmVlX0luaXQoCisgICAgSEFORExFX1NQQUNFX1RSRUUgaFNULCBjb25zdCBTUEFDRV9UUkVFX1NFVFVQICpjb25zdCBoU2V0dXAsCisgICAgVUNIQVIgKnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQsIGNvbnN0IElOVCBiRnJhbWVLZWVwKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChoU1QgPT0gTlVMTCkgfHwgKGhTZXR1cCA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBiVHRvQm94RnJvbnRCYWNrQ29tYmluW1NBQ0VOQ19NQVhfTlVNX0JPWEVTXSA9IHswfTsKKyAgICBpbnQgYm94ID0gMDsKKworICAgIGhTVC0+ZnJhbWVDb3VudCA9IDA7CisgICAgaFNULT5iRnJhbWVLZWVwID0gYkZyYW1lS2VlcDsKKworICAgIC8qIEluaXQgKi8KKyAgICBoU1QtPm1vZGUgPSBoU2V0dXAtPm1vZGU7CisgICAgaFNULT5uUGFyYW1CYW5kcyA9IGhTZXR1cC0+blBhcmFtQmFuZHM7CisgICAgaFNULT5iVXNlQ29hcnNlUXVhbnRUdG9JY2MgPSBoU2V0dXAtPmJVc2VDb2Fyc2VRdWFudFR0b0ljYzsKKyAgICBoU1QtPmJVc2VDb2Fyc2VRdWFudFR0b0NsZCA9IGhTZXR1cC0+YlVzZUNvYXJzZVF1YW50VHRvQ2xkOworICAgIGhTVC0+cXVhbnRNb2RlID0gaFNldHVwLT5xdWFudE1vZGU7CisgICAgaFNULT5uQ2hhbm5lbHNJbk1heCA9IGhTZXR1cC0+bkNoYW5uZWxzSW5NYXg7CisgICAgaFNULT5uSHlicmlkQmFuZHNNYXggPSBoU2V0dXAtPm5IeWJyaWRCYW5kc01heDsKKworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZ2V0VHJlZUNvbmZpZyhoU1QtPm1vZGUsICZoU1QtPmRlc2NyKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGhTVC0+bW9kZSkgeworICAgICAgY2FzZSBTUEFDRVRSRUVfMjEyOgorICAgICAgICBiVHRvQm94RnJvbnRCYWNrQ29tYmluW0JPWF8wXSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUEFDRVRSRUVfSU5WQUxJRF9NT0RFOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5JVF9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0gLyogc3dpdGNoIChoU1QtPm1vZGUpICovCisKKyAgICBpZiAoaFNULT5kZXNjci5uT3R0Qm94ZXMgPiBTQUNFTkNfTUFYX05VTV9CT1hFUykgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5JVF9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBmb3IgKGJveCA9IDA7IGJveCA8IGhTVC0+ZGVzY3Iubk90dEJveGVzOyBib3grKykgeworICAgICAgVFRPX0JPWF9DT05GSUcgYm94Q29uZmlnOworICAgICAgYm94Q29uZmlnLnN1YmJhbmRDb25maWcgPSAoQk9YX1NVQkJBTkRfQ09ORklHKWhTVC0+blBhcmFtQmFuZHM7CisgICAgICBib3hDb25maWcuYlVzZUNvYXJzZVF1YW50Q2xkID0gaFNULT5iVXNlQ29hcnNlUXVhbnRUdG9DbGQ7CisgICAgICBib3hDb25maWcuYlVzZUNvYXJzZVF1YW50SWNjID0gaFNULT5iVXNlQ29hcnNlUXVhbnRUdG9JY2M7CisgICAgICBib3hDb25maWcuYlVzZUNvaGVyZW5jZUljY09ubHkgPSBiVHRvQm94RnJvbnRCYWNrQ29tYmluW2JveF07CisgICAgICBib3hDb25maWcuYm94UXVhbnRNb2RlID0gKEJPWF9RVUFOVE1PREUpaFNULT5xdWFudE1vZGU7CisgICAgICBib3hDb25maWcubkh5YnJpZEJhbmRzTWF4ID0gaFNULT5uSHlicmlkQmFuZHNNYXg7CisgICAgICBib3hDb25maWcuYkZyYW1lS2VlcCA9IGhTVC0+YkZyYW1lS2VlcDsKKworICAgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAgIChlcnJvciA9IGZka19zYWNlbmNfaW5pdFR0b0JveChoU1QtPnR0b0JveFtib3hdLCAmYm94Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0KSkpIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0gLyogZm9yIGJveCAqLworCisgIH0gLyogdmFsaWQgaGFuZGxlICovCisKK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgU3BhY2VUcmVlX0ZyYW1lS2VlcDIxMihjb25zdCBIQU5ETEVfU1BBQ0VfVFJFRSBoU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQVRJQUxGUkFNRSAqY29uc3QgaFNUT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYXZvaWRfa2VlcCkgeworICBpbnQgcGI7CisKKyAgaWYgKGF2b2lkX2tlZXAgPT0gMCkgeworICAgIGlmIChoU1QtPmZyYW1lQ291bnQgJSAyID09IDApIHsKKyAgICAgIGZvciAocGIgPSAwOyBwYiA8IGhTVC0+blBhcmFtQmFuZHM7IHBiKyspIHsKKyAgICAgICAgaFNULT5wSWNjX3ByZXZbQk9YXzBdW3BiXSA9IGhTVE91dC0+b3R0RGF0YS5pY2NbQk9YXzBdWzBdW3BiXTsKKyAgICAgICAgaFNUT3V0LT5vdHREYXRhLmNsZFtCT1hfMF1bMF1bcGJdID0gaFNULT5wQ2xkX3ByZXZbQk9YXzBdW3BiXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChwYiA9IDA7IHBiIDwgaFNULT5uUGFyYW1CYW5kczsgcGIrKykgeworICAgICAgICBoU1RPdXQtPm90dERhdGEuaWNjW0JPWF8wXVswXVtwYl0gPSBoU1QtPnBJY2NfcHJldltCT1hfMF1bcGJdOworICAgICAgICBoU1QtPnBDbGRfcHJldltCT1hfMF1bcGJdID0gaFNUT3V0LT5vdHREYXRhLmNsZFtCT1hfMF1bMF1bcGJdOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKHBiID0gMDsgcGIgPCBoU1QtPm5QYXJhbUJhbmRzOyBwYisrKSB7CisgICAgICBoU1QtPnBJY2NfcHJldltCT1hfMF1bcGJdID0gaFNUT3V0LT5vdHREYXRhLmljY1tCT1hfMF1bMF1bcGJdOworICAgICAgaFNULT5wQ2xkX3ByZXZbQk9YXzBdW3BiXSA9IGhTVE91dC0+b3R0RGF0YS5jbGRbQk9YXzBdWzBdW3BiXTsKKyAgICB9CisgIH0KKyAgaFNULT5mcmFtZUNvdW50Kys7CisgIGlmIChoU1QtPmZyYW1lQ291bnQgPT0gTUFYX0tFRVBfRlJBTUVDT1VOVCkgeworICAgIGhTVC0+ZnJhbWVDb3VudCA9IDA7CisgIH0KK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgU3BhY2VUcmVlX0ZyYW1lS2VlcChjb25zdCBIQU5ETEVfU1BBQ0VfVFJFRSBoU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQVRJQUxGUkFNRSAqY29uc3QgaFNUT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYXZvaWRfa2VlcCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIHN3aXRjaCAoaFNULT5tb2RlKSB7CisgICAgY2FzZSBTUEFDRVRSRUVfMjEyOgorICAgICAgU3BhY2VUcmVlX0ZyYW1lS2VlcDIxMihoU1QsIGhTVE91dCwgYXZvaWRfa2VlcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNQQUNFVFJFRV9JTlZBTElEX01PREU6CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3BhY2VUcmVlX0FwcGx5KAorICAgIEhBTkRMRV9TUEFDRV9UUkVFIGhTVCwgY29uc3QgSU5UIHBhcmFtU2V0LCBjb25zdCBJTlQgbkNoYW5uZWxzSW4sCisgICAgY29uc3QgSU5UIG5UaW1lU2xvdHMsIGNvbnN0IElOVCBzdGFydFRpbWVTbG90LCBjb25zdCBJTlQgbkh5YnJpZEJhbmRzLAorICAgIEZJWFBfV0lOICpwRnJhbWVXaW5kb3dBbmFfX0ZESywKKyAgICBGSVhQX0RQSyAqY29uc3QgKmNvbnN0ICpjb25zdCBwcHBIeWJyaWRfX0ZESywKKyAgICBGSVhQX0RQSyAqY29uc3QgKmNvbnN0ICpjb25zdCBwcHBIeWJyaWRJbl9fRkRLLCBTUEFUSUFMRlJBTUUgKmNvbnN0IGhTVE91dCwKKyAgICBjb25zdCBJTlQgYXZvaWRfa2VlcCwgSU5UICpwRW5jb2RlcklucHV0Q2hTY2FsZSkgeworICAvKiogXHZlcmJhdGltCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgVFJFRV8yMTIKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fXworICAgICAgICBMIC0tIFRUT19DSF8wIC0tfCAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICB8IFRUT18wIHwtLSBUVE9fQ0hfMAorICAgICAgICBSIC0tIFRUT19DSF8xIC0tfF9fX19fX198CisKKyAgXGVuZHZlcmJhdGltICovCisKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKyAgaW50IGs7CisgIGNvbnN0IFRSRUVfU0VUVVAgKnRyZWVTZXR1cCA9IE5VTEw7CisKKyAgaWYgKChoU1QgPT0gTlVMTCkgfHwgKGhTVE91dCA9PSBOVUxMKSB8fCAocHBwSHlicmlkX19GREsgPT0gTlVMTCkgfHwKKyAgICAgIChwcHBIeWJyaWRJbl9fRkRLID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgZ290byBiYWlsOworICB9CisKKyAgaWYgKCh0cmVlU2V0dXAgPSBnZXRUcmVlU2V0dXAoaFNULT5tb2RlKSkgPT0gTlVMTCkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIFNhbml0eSBDaGVja3MgKi8KKyAgaWYgKChuQ2hhbm5lbHNJbiAhPSB0cmVlU2V0dXAtPm5DaGFubmVsc0luKSB8fAorICAgICAgKG5DaGFubmVsc0luID4gaFNULT5uQ2hhbm5lbHNJbk1heCkgfHwKKyAgICAgIChuSHlicmlkQmFuZHMgPiBoU1QtPm5IeWJyaWRCYW5kc01heCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBBcHBseSBhbGwgVFRPIGJveGVzLiAqLworICBmb3IgKGsgPSAwOyBrIDwgdHJlZVNldHVwLT5uVHRvQm94ZXM7IGsrKykgeworICAgIGNvbnN0IFRUT19ERVNDUklQVE9SICpwVFRPID0gJnRyZWVTZXR1cC0+dHRvX2Rlc2NyaXB0b3Jba107CisKKyAgICBpbnQgaSwgaW5DaFsyXSwgb3V0Q2hbMl0sIHdpblsyXTsKKworICAgIGluQ2hbMF0gPSBwVFRPLT5pbkNoMTsKKyAgICBvdXRDaFswXSA9IHBUVE8tPmluQ2gzOworICAgIHdpblswXSA9IHBUVE8tPndDaDE7CisgICAgaW5DaFsxXSA9IHBUVE8tPmluQ2gyOworICAgIG91dENoWzFdID0gcFRUTy0+aW5DaDQ7CisgICAgd2luWzFdID0gcFRUTy0+d0NoMjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIGlmICh3aW5baV0gPT0gV0lOX0FDVElWKSB7CisgICAgICAgIGZka19zYWNlbmNfYW5hbHlzaXNXaW5kb3dpbmcoCisgICAgICAgICAgICBuVGltZVNsb3RzLCBzdGFydFRpbWVTbG90LCBwRnJhbWVXaW5kb3dBbmFfX0ZESywKKyAgICAgICAgICAgIHBwcEh5YnJpZF9fRkRLW2luQ2hbaV1dLCBwcHBIeWJyaWRJbl9fRkRLW291dENoW2ldXSwgbkh5YnJpZEJhbmRzLAorICAgICAgICAgICAgRldfTEVBVkVfRElNKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgb3V0cHV0IGRvd25taXggd2l0aGluIGxhc3QgVFRPIGJveCwgaWYgbm8gVFRUIGJveCBpcyBhcHBsaWVkLgorICAgICAqLworICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgKGVycm9yID0gZmRrX3NhY2VuY19hcHBseVR0b0JveCgKKyAgICAgICAgICAgICBoU1QtPnR0b0JveFtwVFRPLT5ib3hJZF0sIG5UaW1lU2xvdHMsIHN0YXJ0VGltZVNsb3QsIG5IeWJyaWRCYW5kcywKKyAgICAgICAgICAgICBwcHBIeWJyaWRJbl9fRkRLW3BUVE8tPmluQ2gzXSwgcHBwSHlicmlkSW5fX0ZES1twVFRPLT5pbkNoNF0sCisgICAgICAgICAgICAgaFNUT3V0LT5vdHREYXRhLmljY1twVFRPLT5ib3hJZF1bcGFyYW1TZXRdLAorICAgICAgICAgICAgICYoaFNUT3V0LT5JQ0NMb3NzbGVzc0RhdGEuYnNRdWFudENvYXJzZVhYWFtwVFRPLT5ib3hJZF1bcGFyYW1TZXRdKSwKKyAgICAgICAgICAgICBoU1RPdXQtPm90dERhdGEuY2xkW3BUVE8tPmJveElkXVtwYXJhbVNldF0sCisgICAgICAgICAgICAgJihoU1RPdXQtPkNMRExvc3NsZXNzRGF0YS5ic1F1YW50Q29hcnNlWFhYW3BUVE8tPmJveElkXVtwYXJhbVNldF0pLAorICAgICAgICAgICAgIGhTVE91dC0+YlVzZUJCQ3VlcywgJnBFbmNvZGVySW5wdXRDaFNjYWxlW2luQ2hbMF1dLAorICAgICAgICAgICAgICZwRW5jb2RlcklucHV0Q2hTY2FsZVtpbkNoWzFdXSkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9CisKKyAgaWYgKGhTVC0+YkZyYW1lS2VlcCA9PSAxKSB7CisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBTcGFjZVRyZWVfRnJhbWVLZWVwKGhTVCwgaFNUT3V0LCBhdm9pZF9rZWVwKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3BhY2VUcmVlX0Nsb3NlKEhBTkRMRV9TUEFDRV9UUkVFICpwaFNwYWNlVHJlZSkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgocGhTcGFjZVRyZWUgPT0gTlVMTCkgfHwgKCpwaFNwYWNlVHJlZSA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBib3g7CisgICAgSEFORExFX1NQQUNFX1RSRUUgY29uc3QgaFNUID0gKnBoU3BhY2VUcmVlOworCisgICAgLyogZm9yIChib3ggPSAwOyBib3ggPCBoU1QtPmRlc2NyLm5PdHRCb3hlczsgKytib3gpIHsgKi8KKyAgICBmb3IgKGJveCA9IDA7IGJveCA8IFNBQ0VOQ19NQVhfTlVNX0JPWEVTOyArK2JveCkgeworICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX2Rlc3Ryb3lUdG9Cb3goJmhTVC0+dHRvQm94W2JveF0pKSkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorCisgICAgRkRLZnJlZSgqcGhTcGFjZVRyZWUpOworICAgICpwaFNwYWNlVHJlZSA9IE5VTEw7CisgIH0KK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3NwYWNlVHJlZV9HZXREZXNjcmlwdGlvbigKKyAgICBjb25zdCBIQU5ETEVfU1BBQ0VfVFJFRSBoU3BhY2VUcmVlLAorICAgIFNQQUNFX1RSRUVfREVTQ1JJUFRJT04gKnBTcGFjZVRyZWVEZXNjcmlwdGlvbikgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoaFNwYWNlVHJlZSA9PSBOVUxMKSB8fCAocFNwYWNlVHJlZURlc2NyaXB0aW9uID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgKnBTcGFjZVRyZWVEZXNjcmlwdGlvbiA9IGhTcGFjZVRyZWUtPmRlc2NyOworICB9CisgIHJldHVybiBlcnJvcjsKK30KKworSU5UIGZka19zYWNlbmNfc3BhY2VUcmVlX0h5YnJpZDJQYXJhbUJhbmQoY29uc3QgSU5UIG5QYXJhbUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5IeWJyaWRCYW5kKSB7CisgIHJldHVybiBmZGtfc2FjZW5jX3N1YmJhbmQyUGFyYW1CYW5kKChCT1hfU1VCQkFORF9DT05GSUcpblBhcmFtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5IeWJyaWRCYW5kKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY190cmVlLmggYi9saWJTQUNlbmMvc3JjL3NhY2VuY190cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmNWIyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3RyZWUuaApAQCAtMCwwICsxLDE2OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF4IE5ldWVuZG9yZgorCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIFRyZWUgU3RydWN0dXJlIGZvciBTcGFjZSBFbmNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDRU5DX1RSRUVfSAorI2RlZmluZSBTQUNFTkNfVFJFRV9ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJzYWNlbmNfZnJhbWV3aW5kb3dpbmcuaCIKKyNpbmNsdWRlICJzYWNlbmNfbGliLmgiCisjaW5jbHVkZSAic2FjZW5jX2JpdHN0cmVhbS5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisgIFNQQUNFVFJFRV9JTlZBTElEX01PREUgPSAwLAorICBTUEFDRVRSRUVfMjEyID0gOAorCit9IFNQQUNFVFJFRV9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBTUEFDRV9UUkVFICpIQU5ETEVfU1BBQ0VfVFJFRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBuUGFyYW1CYW5kczsKKyAgVUNIQVIgYlVzZUNvYXJzZVF1YW50VHRvQ2xkOworICBVQ0hBUiBiVXNlQ29hcnNlUXVhbnRUdG9JY2M7CisgIFFVQU5UTU9ERSBxdWFudE1vZGU7CisgIFNQQUNFVFJFRV9NT0RFIG1vZGU7CisKKyAgVUNIQVIgbkNoYW5uZWxzSW5NYXg7CisgIFVDSEFSIG5IeWJyaWRCYW5kc01heDsKKworfSBTUEFDRV9UUkVFX1NFVFVQOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIG5PdHRCb3hlczsKKyAgVUNIQVIgbkluQ2hhbm5lbHM7CisgIFVDSEFSIG5PdXRDaGFubmVsczsKKworfSBTUEFDRV9UUkVFX0RFU0NSSVBUSU9OOworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zcGFjZVRyZWVfT3BlbihIQU5ETEVfU1BBQ0VfVFJFRSAqcGhTcGFjZVRyZWUpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3BhY2VUcmVlX0luaXQoCisgICAgSEFORExFX1NQQUNFX1RSRUUgaFNULCBjb25zdCBTUEFDRV9UUkVFX1NFVFVQICpjb25zdCBoU2V0dXAsCisgICAgVUNIQVIgKnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQsIGNvbnN0IElOVCBiRnJhbWVLZWVwKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3NwYWNlVHJlZV9BcHBseSgKKyAgICBIQU5ETEVfU1BBQ0VfVFJFRSBoU1QsIGNvbnN0IElOVCBwYXJhbVNldCwgY29uc3QgSU5UIG5DaGFubmVsc0luLAorICAgIGNvbnN0IElOVCBuVGltZVNsb3RzLCBjb25zdCBJTlQgc3RhcnRUaW1lU2xvdCwgY29uc3QgSU5UIG5IeWJyaWRCYW5kcywKKyAgICBGSVhQX1dJTiAqcEZyYW1lV2luZG93QW5hX19GREssCisgICAgRklYUF9EUEsgKmNvbnN0ICpjb25zdCAqY29uc3QgcHBwSHlicmlkX19GREssCisgICAgRklYUF9EUEsgKmNvbnN0ICpjb25zdCAqY29uc3QgcHBwSHlicmlkSW5fX0ZESywgU1BBVElBTEZSQU1FICpjb25zdCBoU1RPdXQsCisgICAgY29uc3QgSU5UIGF2b2lkX2tlZXAsIElOVCAqcEVuY29kZXJJbnB1dENoU2NhbGUpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3BhY2VUcmVlX0Nsb3NlKEhBTkRMRV9TUEFDRV9UUkVFICpwaFNwYWNlVHJlZSk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zcGFjZVRyZWVfR2V0RGVzY3JpcHRpb24oCisgICAgY29uc3QgSEFORExFX1NQQUNFX1RSRUUgaFNwYWNlVHJlZSwKKyAgICBTUEFDRV9UUkVFX0RFU0NSSVBUSU9OICpwU3BhY2VUcmVlRGVzY3JpcHRpb24pOworCitJTlQgZmRrX3NhY2VuY19zcGFjZVRyZWVfSHlicmlkMlBhcmFtQmFuZChjb25zdCBJTlQgblBhcmFtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkh5YnJpZEJhbmQpOworCisjZW5kaWYgLyogU0FDRU5DX1RSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL3NyYy9zYWNlbmNfdmVjdG9yZnVuY3Rpb25zLmNwcCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3ZlY3RvcmZ1bmN0aW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlMjRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3ZlY3RvcmZ1bmN0aW9ucy5jcHAKQEAgLTAsMCArMSw0NTAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIHZlY3RvciBmdW5jdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitcZmlsZQorVGhpcyBmaWxlIGNvbnRhaW5zIHZlY3RvciBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY192ZWN0b3JmdW5jdGlvbnMuaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ZJWFBfREJMIHN1bVVwQ3BseFBvdzIoY29uc3QgRklYUF9EUEsgKmNvbnN0IHgsIGNvbnN0IElOVCBzY2FsZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpblNjYWxlRmFjdG9yLCBJTlQgKmNvbnN0IG91dFNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbikgeworICBpbnQgaSwgY3M7CisKKyAgaWYgKHNjYWxlTW9kZSA9PSBTVU1fVVBfRFlOQU1JQ19TQ0FMRSkgeworICAgIC8qIGNhbGN1bGF0ZSBoZWFkcm9vbSAqLworICAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIG1heFZhbCB8PSBmQWJzKHhbaV0udi5yZSk7CisgICAgICBtYXhWYWwgfD0gZkFicyh4W2ldLnYuaW0pOworICAgIH0KKyAgICBjcyA9IGluU2NhbGVGYWN0b3IgLSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxKTsKKyAgfSBlbHNlIHsKKyAgICBjcyA9IGluU2NhbGVGYWN0b3I7CisgIH0KKworICAvKiBjb25zaWRlciBzY2FsaW5nIG9mIGVuZXJneSBhbmQgc2NhbGluZyBpbiBmUG93MkRpdjIgYW5kIGFkZGl0aW9uICovCisgICpvdXRTY2FsZUZhY3RvciA9IDIgKiBjcyArIDI7CisKKyAgLyogbWFrZSBzdXJlIHRoYXQgdGhlIHNjYWxlZmFjdG9yIGlzIGluIHRoZSByYW5nZSBvZiAtKERGUkFDVF9CSVRTLTEpLCAuLi4gLAorICAgKiAoREZSQUNUX0JJVFMtMSkgKi8KKyAgY3MgPSBmaXhNYXgoZml4TWluKGNzLCBERlJBQ1RfQklUUyAtIDEpLCAtKERGUkFDVF9CSVRTIC0gMSkpOworCisgIC8qIHN1bSB1cCBjb21wbGV4IGVuZXJneSBzYW1wbGVzICovCisgIEZJWFBfREJMIHJlLCBpbSwgc3VtOworCisgIHJlID0gaW0gPSBzdW0gPSBGTDJGWENPTlNUX0RCTCgwLjApOworICBpZiAoY3MgPCAwKSB7CisgICAgY3MgPSAtY3M7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgcmUgKz0gZlBvdzJEaXYyKHhbaV0udi5yZSA8PCBjcyk7CisgICAgICBpbSArPSBmUG93MkRpdjIoeFtpXS52LmltIDw8IGNzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY3MgPSAyICogY3M7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgcmUgKz0gZlBvdzJEaXYyKHhbaV0udi5yZSkgPj4gY3M7CisgICAgICBpbSArPSBmUG93MkRpdjIoeFtpXS52LmltKSA+PiBjczsKKyAgICB9CisgIH0KKworICBzdW0gPSAocmUgPj4gMSkgKyAoaW0gPj4gMSk7CisKKyAgcmV0dXJuIChzdW0pOworfQorCitGSVhQX0RCTCBzdW1VcENwbHhQb3cyRGltMihjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IHgsIGNvbnN0IElOVCBzY2FsZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaW5TY2FsZUZhY3RvciwgSU5UICpjb25zdCBvdXRTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzRGltMSwgY29uc3QgSU5UIG5EaW0xLCBjb25zdCBJTlQgc0RpbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkRpbTIpIHsKKyAgaW50IGksIGosIGNzOworCisgIGlmIChzY2FsZU1vZGUgPT0gU1VNX1VQX0RZTkFNSUNfU0NBTEUpIHsKKyAgICAvKiBjYWxjdWxhdGUgaGVhZHJvb20gKi8KKyAgICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBmb3IgKGkgPSBzRGltMTsgaSA8IG5EaW0xOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IHNEaW0yOyBqIDwgbkRpbTI7IGorKykgeworICAgICAgICBtYXhWYWwgfD0gZkFicyh4W2ldW2pdLnYucmUpOworICAgICAgICBtYXhWYWwgfD0gZkFicyh4W2ldW2pdLnYuaW0pOworICAgICAgfQorICAgIH0KKyAgICBjcyA9IGluU2NhbGVGYWN0b3IgLSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxKTsKKyAgfSBlbHNlIHsKKyAgICBjcyA9IGluU2NhbGVGYWN0b3I7CisgIH0KKworICAvKiBjb25zaWRlciBzY2FsaW5nIG9mIGVuZXJneSBhbmQgc2NhbGluZyBpbiBmUG93MkRpdjIgYW5kIGFkZGl0aW9uICovCisgICpvdXRTY2FsZUZhY3RvciA9IDIgKiBjcyArIDI7CisKKyAgLyogbWFrZSBzdXJlIHRoYXQgdGhlIHNjYWxlZmFjdG9yIGlzIGluIHRoZSByYW5nZSBvZiAtKERGUkFDVF9CSVRTLTEpLCAuLi4gLAorICAgKiAoREZSQUNUX0JJVFMtMSkgKi8KKyAgY3MgPSBmaXhNYXgoZml4TWluKGNzLCBERlJBQ1RfQklUUyAtIDEpLCAtKERGUkFDVF9CSVRTIC0gMSkpOworCisgIC8qIHN1bSB1cCBjb21wbGV4IGVuZXJneSBzYW1wbGVzICovCisgIEZJWFBfREJMIHJlLCBpbSwgc3VtOworCisgIHJlID0gaW0gPSBzdW0gPSBGTDJGWENPTlNUX0RCTCgwLjApOworICBpZiAoY3MgPCAwKSB7CisgICAgY3MgPSAtY3M7CisgICAgZm9yIChpID0gc0RpbTE7IGkgPCBuRGltMTsgaSsrKSB7CisgICAgICBmb3IgKGogPSBzRGltMjsgaiA8IG5EaW0yOyBqKyspIHsKKyAgICAgICAgcmUgKz0gZlBvdzJEaXYyKHhbaV1bal0udi5yZSA8PCBjcyk7CisgICAgICAgIGltICs9IGZQb3cyRGl2Mih4W2ldW2pdLnYuaW0gPDwgY3MpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjcyA9IDIgKiBjczsKKyAgICBmb3IgKGkgPSBzRGltMTsgaSA8IG5EaW0xOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IHNEaW0yOyBqIDwgbkRpbTI7IGorKykgeworICAgICAgICByZSArPSBmUG93MkRpdjIoeFtpXVtqXS52LnJlKSA+PiBjczsKKyAgICAgICAgaW0gKz0gZlBvdzJEaXYyKHhbaV1bal0udi5pbSkgPj4gY3M7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3VtID0gKHJlID4+IDEpICsgKGltID4+IDEpOworCisgIHJldHVybiAoc3VtKTsKK30KKwordm9pZCBjb3B5Q3BseFZlYyhGSVhQX0RQSyAqY29uc3QgWiwgY29uc3QgRklYUF9EUEsgKmNvbnN0IFgsIGNvbnN0IElOVCBuKSB7CisgIEZES21lbW1vdmUoWiwgWCwgc2l6ZW9mKEZJWFBfRFBLKSAqIG4pOworfQorCit2b2lkIHNldENwbHhWZWMoRklYUF9EUEsgKmNvbnN0IFosIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IElOVCBuKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBaW2ldLnYucmUgPSBhOworICAgIFpbaV0udi5pbSA9IGE7CisgIH0KK30KKwordm9pZCBjcGx4X2NwbHhTY2FsYXJQcm9kdWN0KEZJWFBfRFBLICpjb25zdCBaLCBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBZLCBjb25zdCBJTlQgc2NhbGVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzY2FsZVksIElOVCAqY29uc3Qgc2NhbGVaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzRGltMSwgY29uc3QgSU5UIG5EaW0xLCBjb25zdCBJTlQgc0RpbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5EaW0yKSB7CisgIGludCBpLCBqLCBzeCwgc3k7CisgIEZJWFBfREJMIHhyZSwgeXJlLCB4aW0sIHlpbSwgcmUsIGltOworCisgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBzY2FsZWZhY3RvciBpcyBpbiB0aGUgcmFuZ2Ugb2YgLShERlJBQ1RfQklUUy0xKSwgLi4uICwKKyAgICogKERGUkFDVF9CSVRTLTEpICovCisgIHN4ID0gZml4TWF4KGZpeE1pbihzY2FsZVgsIERGUkFDVF9CSVRTIC0gMSksIC0oREZSQUNUX0JJVFMgLSAxKSk7CisgIHN5ID0gZml4TWF4KGZpeE1pbihzY2FsZVksIERGUkFDVF9CSVRTIC0gMSksIC0oREZSQUNUX0JJVFMgLSAxKSk7CisKKyAgLyogY29uc2lkZXIgc2NhbGluZyBvZiBlbmVyZ3kgYW5kIHNjYWxpbmcgaW4gZk11bHREaXYyIGFuZCBzaGlmdCBvZiByZXN1bHQKKyAgICogdmFsdWVzICovCisgICpzY2FsZVogPSBzeCArIHN5ICsgMjsKKworICByZSA9IChGSVhQX0RCTCkwOworICBpbSA9IChGSVhQX0RCTCkwOworICBpZiAoKHN4IDwgMCkgJiYgKHN5IDwgMCkpIHsKKyAgICBzeCA9IC1zeDsKKyAgICBzeSA9IC1zeTsKKyAgICBmb3IgKGkgPSBzRGltMTsgaSA8IG5EaW0xOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IHNEaW0yOyBqIDwgbkRpbTI7IGorKykgeworICAgICAgICB4cmUgPSBYW2ldW2pdLnYucmUgPDwgc3g7CisgICAgICAgIHhpbSA9IFhbaV1bal0udi5pbSA8PCBzeDsKKyAgICAgICAgeXJlID0gWVtpXVtqXS52LnJlIDw8IHN5OworICAgICAgICB5aW0gPSBZW2ldW2pdLnYuaW0gPDwgc3k7CisgICAgICAgIHJlICs9IGZNdWx0RGl2Mih4cmUsIHlyZSkgKyBmTXVsdERpdjIoeGltLCB5aW0pOworICAgICAgICBpbSArPSBmTXVsdERpdjIoeGltLCB5cmUpIC0gZk11bHREaXYyKHhyZSwgeWltKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoKHN4ID49IDApICYmIChzeSA+PSAwKSkgeworICAgIGZvciAoaSA9IHNEaW0xOyBpIDwgbkRpbTE7IGkrKykgeworICAgICAgZm9yIChqID0gc0RpbTI7IGogPCBuRGltMjsgaisrKSB7CisgICAgICAgIHhyZSA9IFhbaV1bal0udi5yZTsKKyAgICAgICAgeGltID0gWFtpXVtqXS52LmltOworICAgICAgICB5cmUgPSBZW2ldW2pdLnYucmU7CisgICAgICAgIHlpbSA9IFlbaV1bal0udi5pbTsKKyAgICAgICAgcmUgKz0gKGZNdWx0RGl2Mih4cmUsIHlyZSkgKyBmTXVsdERpdjIoeGltLCB5aW0pKSA+PiAoc3ggKyBzeSk7CisgICAgICAgIGltICs9IChmTXVsdERpdjIoeGltLCB5cmUpIC0gZk11bHREaXYyKHhyZSwgeWltKSkgPj4gKHN4ICsgc3kpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICgoc3ggPCAwKSAmJiAoc3kgPj0gMCkpIHsKKyAgICBzeCA9IC1zeDsKKyAgICBmb3IgKGkgPSBzRGltMTsgaSA8IG5EaW0xOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IHNEaW0yOyBqIDwgbkRpbTI7IGorKykgeworICAgICAgICB4cmUgPSBYW2ldW2pdLnYucmUgPDwgc3g7CisgICAgICAgIHhpbSA9IFhbaV1bal0udi5pbSA8PCBzeDsKKyAgICAgICAgeXJlID0gWVtpXVtqXS52LnJlOworICAgICAgICB5aW0gPSBZW2ldW2pdLnYuaW07CisgICAgICAgIHJlICs9IChmTXVsdERpdjIoeHJlLCB5cmUpICsgZk11bHREaXYyKHhpbSwgeWltKSkgPj4gc3k7CisgICAgICAgIGltICs9IChmTXVsdERpdjIoeGltLCB5cmUpIC0gZk11bHREaXYyKHhyZSwgeWltKSkgPj4gc3k7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHN5ID0gLXN5OworICAgIGZvciAoaSA9IHNEaW0xOyBpIDwgbkRpbTE7IGkrKykgeworICAgICAgZm9yIChqID0gc0RpbTI7IGogPCBuRGltMjsgaisrKSB7CisgICAgICAgIHhyZSA9IFhbaV1bal0udi5yZTsKKyAgICAgICAgeGltID0gWFtpXVtqXS52LmltOworICAgICAgICB5cmUgPSBZW2ldW2pdLnYucmUgPDwgc3k7CisgICAgICAgIHlpbSA9IFlbaV1bal0udi5pbSA8PCBzeTsKKyAgICAgICAgcmUgKz0gKGZNdWx0RGl2Mih4cmUsIHlyZSkgKyBmTXVsdERpdjIoeGltLCB5aW0pKSA+PiBzeDsKKyAgICAgICAgaW0gKz0gKGZNdWx0RGl2Mih4aW0sIHlyZSkgLSBmTXVsdERpdjIoeHJlLCB5aW0pKSA+PiBzeDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBaLT52LnJlID0gcmUgPj4gMTsKKyAgWi0+di5pbSA9IGltID4+IDE7Cit9CisKK3ZvaWQgRkRLY2FsY0NvcnJlbGF0aW9uVmVjKEZJWFBfREJMICpjb25zdCB6LCBjb25zdCBGSVhQX0RCTCAqY29uc3QgcHIxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwMSwgY29uc3QgRklYUF9EQkwgKmNvbnN0IHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG4pIHsKKyAgaW50IGksIHM7CisgIEZJWFBfREJMIHAxMiwgY29yOworCisgIC8qIGNvcnJlbGF0aW9uICovCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBwMTIgPSBmTXVsdChwMVtpXSwgcDJbaV0pOworICAgIGlmIChwMTIgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgcDEyID0gaW52U3FydE5vcm0yKHAxMiwgJnMpOworICAgICAgY29yID0gZk11bHQocHIxMltpXSwgcDEyKTsKKyAgICAgIHpbaV0gPSBTQVRVUkFURV9MRUZUX1NISUZUKGNvciwgcywgREZSQUNUX0JJVFMpOworICAgIH0gZWxzZSB7CisgICAgICB6W2ldID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgY2FsY0NvaGVyZW5jZVZlYyhGSVhQX0RCTCAqY29uc3QgeiwgY29uc3QgRklYUF9EQkwgKmNvbnN0IHAxMnIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHAxMmksIGNvbnN0IEZJWFBfREJMICpjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcDIsIGNvbnN0IElOVCBzY2FsZVAxMiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2NhbGVQLCBjb25zdCBJTlQgbikgeworICBpbnQgaSwgcywgczEsIHMyOworICBGSVhQX0RCTCBjb2gsIHAxMiwgcDEycmk7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIHMyID0gZml4TWluKGZpeE1heCgwLCBDb3VudExlYWRpbmdCaXRzKHAxMnJbaV0pIC0gMSksCisgICAgICAgICAgICAgICAgZml4TWF4KDAsIENvdW50TGVhZGluZ0JpdHMocDEyaVtpXSkgLSAxKSk7CisgICAgcDEycmkgPSBzcXJ0Rml4cChmUG93MkRpdjIocDEycltpXSA8PCBzMikgKyBmUG93MkRpdjIocDEyaVtpXSA8PCBzMikpOworICAgIHMxID0gZml4TWluKGZpeE1heCgwLCBDb3VudExlYWRpbmdCaXRzKHAxW2ldKSAtIDEpLAorICAgICAgICAgICAgICAgIGZpeE1heCgwLCBDb3VudExlYWRpbmdCaXRzKHAyW2ldKSAtIDEpKTsKKyAgICBwMTIgPSBmTXVsdERpdjIocDFbaV0gPDwgczEsIHAyW2ldIDw8IHMxKTsKKworICAgIGlmIChwMTIgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgcDEyID0gaW52U3FydE5vcm0yKHAxMiwgJnMpOworICAgICAgY29oID0gZk11bHQocDEycmksIHAxMik7CisgICAgICBzID0gZml4TWF4KGZpeE1pbigoc2NhbGVQMTIgLSBzY2FsZVAgKyBzICsgczEgLSBzMiksIERGUkFDVF9CSVRTIC0gMSksCisgICAgICAgICAgICAgICAgIC0oREZSQUNUX0JJVFMgLSAxKSk7CisgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgeltpXSA9IGNvaCA+PiAoLXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgeltpXSA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoY29oLCBzLCBERlJBQ1RfQklUUyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHpbaV0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICB9CisgIH0KK30KKwordm9pZCBhZGRXZWlnaHRlZENwbHhWZWMoRklYUF9EUEsgKmNvbnN0ICpjb25zdCBaLCBjb25zdCBGSVhQX0RCTCAqY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgWCwgY29uc3QgRklYUF9EQkwgKmNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IFksIGNvbnN0IElOVCBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3Qgc2NhbGVDaDEsIGNvbnN0IElOVCBzY2FsZUNoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpjb25zdCBwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5QYXJhbWV0ZXJCYW5kcywgY29uc3QgSU5UIG5UaW1lU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RhcnRUaW1lU2xvdCkgeworICBpbnQgcGIsIGosIGk7CisgIGludCBjcywgczEsIHMyOworCisgIC8qIGRldGVybWluZSBtYXhpbXVtIHNjYWxlIG9mIGJvdGggY2hhbm5lbHMgKi8KKyAgY3MgPSBmaXhNYXgoKnNjYWxlQ2gxLCBzY2FsZUNoMik7CisgIHMxID0gY3MgLSAoKnNjYWxlQ2gxKTsKKyAgczIgPSBjcyAtIHNjYWxlQ2gyOworCisgIC8qIHNjYWxlZmFjdG9yIDEgaXMgdXBkYXRlZCB3aXRoIGNvbW1vbiBzY2FsZSBvZiBjaGFubmVsIDEgYW5kIGNoYW5uZWwyICovCisgICpzY2FsZUNoMSA9IGNzOworCisgIC8qIHNjYWxlIG9mIGEgYW5kIGI7IGFkZGl0aW9uYWwgc2NhbGUgZm9yIGZNdWx0RGl2MigpICovCisgIGZvciAoaiA9IDAsIHBiID0gMDsgcGIgPCBuUGFyYW1ldGVyQmFuZHM7IHBiKyspIHsKKyAgICBGSVhQX0RCTCBhUGIsIGJQYjsKKyAgICBhUGIgPSBhW3BiXSwgYlBiID0gYltwYl07CisgICAgZm9yICg7IGogPCBwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0W3BiXTsgaisrKSB7CisgICAgICBmb3IgKGkgPSBzdGFydFRpbWVTbG90OyBpIDwgblRpbWVTbG90czsgaSsrKSB7CisgICAgICAgIFpbal1baV0udi5yZSA9ICgoZk11bHREaXYyKGFQYiwgWFtqXVtpXS52LnJlKSA+PiBzMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0RGl2MihiUGIsIFlbal1baV0udi5yZSkgPj4gczIpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGUgKyAxKTsKKyAgICAgICAgWltqXVtpXS52LmltID0gKChmTXVsdERpdjIoYVBiLCBYW2pdW2ldLnYuaW0pID4+IHMxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKGJQYiwgWVtqXVtpXS52LmltKSA+PiBzMikpCisgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZSArIDEpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIEZES2NhbGNQYlNjYWxlRmFjdG9yKGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKmNvbnN0IHBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3Qgb3V0U2NhbGVGYWN0b3IsIGNvbnN0IElOVCBzdGFydFRpbWVTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblRpbWVTbG90cywgY29uc3QgSU5UIG5QYXJhbUJhbmRzKSB7CisgIGludCBpLCBqLCBwYjsKKworICAvKiBjYWxjdWxhdGUgaGVhZHJvb20gKi8KKyAgZm9yIChqID0gMCwgcGIgPSAwOyBwYiA8IG5QYXJhbUJhbmRzOyBwYisrKSB7CisgICAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgZm9yICg7IGogPCBwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0W3BiXTsgaisrKSB7CisgICAgICBmb3IgKGkgPSBzdGFydFRpbWVTbG90OyBpIDwgblRpbWVTbG90czsgaSsrKSB7CisgICAgICAgIG1heFZhbCB8PSBmQWJzKHhbaV1bal0udi5yZSk7CisgICAgICAgIG1heFZhbCB8PSBmQWJzKHhbaV1bal0udi5pbSk7CisgICAgICB9CisgICAgfQorICAgIG91dFNjYWxlRmFjdG9yW3BiXSA9IC1maXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxKTsKKyAgfQorfQorCitJTlQgRkRLY2FsY1NjYWxlRmFjdG9yKGNvbnN0IEZJWFBfREJMICpjb25zdCB4LCBjb25zdCBGSVhQX0RCTCAqY29uc3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG4pIHsKKyAgaW50IGk7CisKKyAgLyogY2FsY3VsYXRlIGhlYWRyb29tICovCisgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBpZiAoeCAhPSBOVUxMKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgbWF4VmFsIHw9IGZBYnMoeFtpXSk7CisgICAgfQorICB9CisKKyAgaWYgKHkgIT0gTlVMTCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIG1heFZhbCB8PSBmQWJzKHlbaV0pOworICAgIH0KKyAgfQorCisgIGlmIChtYXhWYWwgPT0gKEZJWFBfREJMKTApCisgICAgcmV0dXJuICgtKERGUkFDVF9CSVRTIC0gMSkpOworICBlbHNlCisgICAgcmV0dXJuICgtQ291bnRMZWFkaW5nQml0cyhtYXhWYWwpKTsKK30KKworSU5UIEZES2NhbGNTY2FsZUZhY3RvckRQSyhjb25zdCBGSVhQX0RQSyAqUkVTVFJJQ1QgeCwgY29uc3QgSU5UIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJhbmRzKSB7CisgIElOVCBxcywgY2x6OworICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICBmb3IgKHFzID0gc3RhcnRCYW5kOyBxcyA8IGJhbmRzOyBxcysrKSB7CisgICAgbWF4VmFsIHw9IGZBYnMoeFtxc10udi5yZSk7CisgICAgbWF4VmFsIHw9IGZBYnMoeFtxc10udi5pbSk7CisgIH0KKworICBjbHogPSAtZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhtYXhWYWwpIC0gMSk7CisKKyAgcmV0dXJuIChjbHopOworfQpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL3NyYy9zYWNlbmNfdmVjdG9yZnVuY3Rpb25zLmggYi9saWJTQUNlbmMvc3JjL3NhY2VuY192ZWN0b3JmdW5jdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWM0YWJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfdmVjdG9yZnVuY3Rpb25zLmgKQEAgLTAsMCArMSw0ODggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIHZlY3RvciBmdW5jdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitcZmlsZQorVGhpcyBmaWxlIGNvbnRhaW5zIHZlY3RvciBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNFTkNfVkVDVE9SRlVOQ1RJT05TX0gKKyNkZWZpbmUgU0FDRU5DX1ZFQ1RPUkZVTkNUSU9OU19ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU1VNX1VQX1NUQVRJQ19TQ0FMRSAwCisjZGVmaW5lIFNVTV9VUF9EWU5BTUlDX1NDQUxFIDEKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgVmVjdG9yIGZ1bmN0aW9uIDogU3VtIHVwIGNvbXBsZXggcG93ZXIKKyAqCisgKiAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gOiByZXQgPSBzdW0oIHJle1hbaV19ICogcmV7WFtpXX0gKyBpbXtYW2ldfSAqCisgKiBpbXtYW2ldfSApLCAgaT0wLC4uLixuLTEgcmV0IGlzIHNjYWxlZCBieSBvdXRTY2FsZUZhY3RvcgorICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RQSyB4W10KKyAqICAgICAgICAgICAgICAgICBJbnB1dDogY29tcGxleCB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzY2FsZU1vZGUKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogY2hvb3NlIHN0YXRpYyBvciBkeW5hbWljIHNjYWxpbmcKKyAqIChTVU1fVVBfRFlOQU1JQ19TQ0FMRS9TVU1fVVBfU1RBVElDX1NDQUxFKQorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgaW5TY2FsZUZhY3RvcgorICogICAgICAgICAgICAgICAgIElucHV0OiBkZXRlcm1pbmUgaGVhZHJvb20gYml0cyBmb3IgdGhlIGNvbXBsZXggaW5wdXQgdmVjdG9yCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBvdXRTY2FsZUZhY3RvcgorICogICAgICAgICAgICAgICAgIE91dHB1dDogY29tcGxldGUgc2NhbGluZyBpbiBlbmVyZ3kgY2FsY3VsYXRpb24KKyAqCisgKiBccmV0dXJuICAgICAgICAgRklYUF9EQkwgcmV0CisgKi8KK0ZJWFBfREJMIHN1bVVwQ3BseFBvdzIoY29uc3QgRklYUF9EUEsgKmNvbnN0IHgsIGNvbnN0IElOVCBzY2FsZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpblNjYWxlRmFjdG9yLCBJTlQgKmNvbnN0IG91dFNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbik7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFZlY3RvciBmdW5jdGlvbiA6IFN1bSB1cCBjb21wbGV4IHBvd2VyCisgKgorICogICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIDogcmV0ID0gc3VtKCByZXtYW2ldW2pdfSAqIHJle1hbaV1bXX0gKworICogaW17WFtpXVtdfSAqIGlte1hbaV1bXX0gKSwgIGk9c0RpbTEsLi4uLG5EaW0xLTEgaT1zRGltMiwuLi4sbkRpbTItMSByZXQgaXMKKyAqIHNjYWxlZCBieSBvdXRTY2FsZUZhY3RvcgorICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RQSyB4W10KKyAqICAgICAgICAgICAgICAgICBJbnB1dDogY29tcGxleCB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzY2FsZU1vZGUKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogY2hvb3NlIHN0YXRpYyBvciBkeW5hbWljIHNjYWxpbmcKKyAqIChTVU1fVVBfRFlOQU1JQ19TQ0FMRS9TVU1fVVBfU1RBVElDX1NDQUxFKQorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgaW5TY2FsZUZhY3RvcgorICogICAgICAgICAgICAgICAgIElucHV0OiBkZXRlcm1pbmUgaGVhZHJvb20gYml0cyBmb3IgdGhlIGNvbXBsZXggaW5wdXQgdmVjdG9yCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBvdXRTY2FsZUZhY3RvcgorICogICAgICAgICAgICAgICAgIE91dHB1dDogY29tcGxldGUgc2NhbGluZyBpbiBlbmVyZ3kgY2FsY3VsYXRpb24KKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IHNEaW0xCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHN0YXJ0IGluZGV4IGZvciBsb29wIGNvdW50ZXIgaW4gZGltZW5zaW9uIDEKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IG5EaW0xCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IGxvb3AgY291bnRlciBpbiBkaW1lbnNpb24gMQorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgc0RpbTIKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogc3RhcnQgaW5kZXggZm9yIGxvb3AgY291bnRlciBpbiBkaW1lbnNpb24gMgorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgbkRpbTIKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogbG9vcCBjb3VudGVyIGluIGRpbWVuc2lvbiAyCisgKgorICogXHJldHVybiAgICAgICAgIEZJWFBfREJMIHJldAorICovCitGSVhQX0RCTCBzdW1VcENwbHhQb3cyRGltMihjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IHgsIGNvbnN0IElOVCBzY2FsZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaW5TY2FsZUZhY3RvciwgSU5UICpjb25zdCBvdXRTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzRGltMSwgY29uc3QgSU5UIG5EaW0xLCBjb25zdCBJTlQgc0RpbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkRpbTIpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBWZWN0b3IgZnVuY3Rpb24gOiBaW2ldID0gWFtpXSwgIGk9MCwuLi4sbi0xCisgKgorICogICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIDogcmV7WltpXX0gPSByZXtYW2ldfSwgIGk9MCwuLi4sbi0xCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXtaW2ldfSA9IGlte1hbaV19LCAgaT0wLC4uLixuLTEKKyAqCisgKiAgICAgICAgICAgICAgICAgQ29weSBjb21wbGV4IHZlY3RvciBYW10gdG8gY29tcGxleCB2ZWN0b3IgWltdLgorICogICAgICAgICAgICAgICAgIEl0IGlzIGFsbG93ZWQgdG8gb3ZlcmxheSBYW10gd2l0aCBaW10uCisgKgorICogXHBhcmFtICAgICAgICAgIEZJWFBfRFBLIFpbXQorICogICAgICAgICAgICAgICAgIE91dHB1dDogdmVjdG9yIG9mIHRoZSBsZW5ndGggbgorICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RQSyBYW10KKyAqICAgICAgICAgICAgICAgICBJbnB1dDogdmVjdG9yIG9mIHRoZSBsZW5ndGggbgorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgbgorICogICAgICAgICAgICAgICAgIElucHV0OiBsZW5ndGggb2YgdmVjdG9yIFpbXSBhbmQgWFtdCisgKgorICogXHJldHVybiAgICAgICAgIHZvaWQKKyAqLwordm9pZCBjb3B5Q3BseFZlYyhGSVhQX0RQSyAqY29uc3QgWiwgY29uc3QgRklYUF9EUEsgKmNvbnN0IFgsIGNvbnN0IElOVCBuKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgVmVjdG9yIGZ1bmN0aW9uIDogWltpXSA9IGEsICBpPTAsLi4uLG4tMQorICoKKyAqICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA6IHJle1pbaV19ID0gYSwgIGk9MCwuLi4sbi0xCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXtaW2ldfSA9IGEsICBpPTAsLi4uLG4tMQorICoKKyAqICAgICAgICAgICAgICAgICBTZXQgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIGNvbXBsZXggdmFsdWUgWiB0byBhLgorICoKKyAqIFxwYXJhbSAgICAgICAgICBGSVBYX0RQSyBaW10KKyAqICAgICAgICAgICAgICAgICBPdXRwdXQ6IHZlY3RvciBvZiB0aGUgbGVuZ3RoIG4KKyAqCisgKiBccGFyYW0gICAgICAgICAgY29uc3QgRklYUF9EQkwgYQorICogICAgICAgICAgICAgICAgIElucHV0OiBjb25zdGFudCB2YWx1ZQorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgbgorICogICAgICAgICAgICAgICAgIElucHV0OiBsZW5ndGggb2YgdmVjdG9yIFpbXQorICoKKyAqIFxyZXR1cm4gICAgICAgICB2b2lkCisgKi8KK3ZvaWQgc2V0Q3BseFZlYyhGSVhQX0RQSyAqY29uc3QgWiwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgSU5UIG4pOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBWZWN0b3IgZnVuY3Rpb24gOiBDYWxjdWxhdGUgY29tcGxleC12YWx1ZWQgcmVzdWx0IG9mIGNvbXBsZXgKKyAqIHNjYWxhciBwcm9kdWN0CisgKgorICogICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIDogcmV7Wn0gPSBzdW0oIHJle1hbaV19ICogcmV7WVtpXX0gKyBpbXtYW2ldfSAqCisgKiBpbXtZW2ldfSwgIGk9MCwuLi4sbi0xICkgaW17Wn0gPSBzdW0oIGlte1hbaV19ICogcmV7WVtpXX0gLSByZXtYW2ldfSAqCisgKiBpbXtZW2ldfSwgIGk9MCwuLi4sbi0xICkKKyAqCisgKiAgICAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbXBsZXgtdmFsdWVkIHJlc3VsdCBvZiB0aGUgY29tcGxleAorICogc2NhbGFyIHByb2R1Y3QgYXQgdGhlIGFkZHJlc3Mgb2YgWi4gVGhlIHJlc3VsdCBpcyBzY2FsZWQgYnkgc2NhbGVaLgorICoKKyAqIFxwYXJhbSAgICAgICAgICBGSVhQX0RQSyAqWgorICogICAgICAgICAgICAgICAgIE91dHB1dDogcG9pbnRlciB0byBaCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgWAorICogICAgICAgICAgICAgICAgIElucHV0OiB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgWQorICogICAgICAgICAgICAgICAgIElucHV0OiB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzY2FsZVgKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogc2NhbGVmYWN0b3Igb2YgdmVjdG9yIFhbXQorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgc2NhbGVZCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHNjYWxlZmFjdG9yIG9mIHZlY3RvciBZW10KKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IHNjYWxlWgorICogICAgICAgICAgICAgICAgIE91dHB1dDogc2NhbGVmYWN0b3Igb2YgdmVjdG9yIFpbXQorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgc0RpbTEKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogc3RhcnQgaW5kZXggZm9yIGxvb3AgY291bnRlciBpbiBkaW1lbnNpb24gMQorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgbkRpbTEKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogbG9vcCBjb3VudGVyIGluIGRpbWVuc2lvbiAxCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzRGltMgorICogICAgICAgICAgICAgICAgIElucHV0OiBzdGFydCBpbmRleCBmb3IgbG9vcCBjb3VudGVyIGluIGRpbWVuc2lvbiAyCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBuRGltMgorICogICAgICAgICAgICAgICAgIElucHV0OiBsb29wIGNvdW50ZXIgaW4gZGltZW5zaW9uIDIKKyAqCisgKiBccmV0dXJuICAgICAgICAgdm9pZAorICovCit2b2lkIGNwbHhfY3BseFNjYWxhclByb2R1Y3QoRklYUF9EUEsgKmNvbnN0IFosIGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IFksIGNvbnN0IElOVCBzY2FsZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNjYWxlWSwgSU5UICpjb25zdCBzY2FsZVosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNEaW0xLCBjb25zdCBJTlQgbkRpbTEsIGNvbnN0IElOVCBzRGltMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkRpbTIpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBWZWN0b3IgZnVuY3Rpb24gOiBDYWxjdWxhdGUgY29ycmVsYXRpb24KKyAqCisgKiAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gOiB6W2ldID0gcHIxMltpXSAvIHNxcnQocDFbaV0qcDJbaV0pICwKKyAqIGk9MCwuLi4sbi0xCisgKgorICogXHBhcmFtICAgICAgICAgIEZJWFBfREJMIHpbXQorICogICAgICAgICAgICAgICAgIE91dHB1dDogdmVjdG9yIG9mIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHByMTJbXQorICogICAgICAgICAgICAgICAgIElucHV0OiB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHAxW10KKyAqICAgICAgICAgICAgICAgICBJbnB1dDogdmVjdG9yIG9mIHRoZSBsZW5ndGggbgorICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RCTCBwMltdCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHZlY3RvciBvZiB0aGUgbGVuZ3RoIG4KKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IG4KKyAqICAgICAgICAgICAgICAgICBJbnB1dDogbGVuZ3RoIG9mIHZlY3RvciBwcjEyW10sIHAxW10gYW5kIHAyW10KKyAqCisgKiBccmV0dXJuICAgICAgICAgdm9pZAorICovCit2b2lkIEZES2NhbGNDb3JyZWxhdGlvblZlYyhGSVhQX0RCTCAqY29uc3QgeiwgY29uc3QgRklYUF9EQkwgKmNvbnN0IHByMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcDEsIGNvbnN0IEZJWFBfREJMICpjb25zdCBwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgVmVjdG9yIGZ1bmN0aW9uIDogQ2FsY3VsYXRlIGNvaGVyZW5jZQorICoKKyAqICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA6IHpbaV0gPSBzcXJ0KCAocDEycltpXSpwMTJyW2ldICsKKyAqIHAxMmlbaV0qcDEyaVtpXSkgLyAocDFbaV0qcDJbaV0pICksICBpPTAsLi4uLG4tMQorICoKKyAqIFxwYXJhbSAgICAgICAgICBGSVhQX0RCTCB6W10KKyAqICAgICAgICAgICAgICAgICBPdXRwdXQ6IHZlY3RvciBvZiBsZW5ndGggbgorICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RCTCBwMTJyW10KKyAqICAgICAgICAgICAgICAgICBJbnB1dDogdmVjdG9yIG9mIHRoZSBsZW5ndGggbgorICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RCTCBwMTJpW10KKyAqICAgICAgICAgICAgICAgICBJbnB1dDogdmVjdG9yIG9mIHRoZSBsZW5ndGggbgorICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RCTCBwMVtdCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHZlY3RvciBvZiB0aGUgbGVuZ3RoIG4KKyAqCisgKiBccGFyYW0gICAgICAgICAgY29uc3QgRklYUF9EQkwgcDJbXQorICogICAgICAgICAgICAgICAgIElucHV0OiB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzY2FsZVAxMltdCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHNjYWxlZmFjdG9yIG9mIHAxMnIgYW5kIHAxMmkKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IHNjYWxlUAorICogICAgICAgICAgICAgICAgIElucHV0OiBzY2FsZWZhY3RvciBvZiBwMSBhbmQgcDIKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IG4KKyAqICAgICAgICAgICAgICAgICBJbnB1dDogbGVuZ3RoIG9mIHZlY3RvciBwMTJyW10sIHAxMmlbXSwgcDFbXSBhbmQgcDJbXQorICoKKyAqIFxyZXR1cm4gICAgICAgICB2b2lkCisgKi8KK3ZvaWQgY2FsY0NvaGVyZW5jZVZlYyhGSVhQX0RCTCAqY29uc3QgeiwgY29uc3QgRklYUF9EQkwgKmNvbnN0IHAxMnIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHAxMmksIGNvbnN0IEZJWFBfREJMICpjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcDIsIGNvbnN0IElOVCBzY2FsZVAxMiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2NhbGVQLCBjb25zdCBJTlQgbik7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFZlY3RvciBmdW5jdGlvbiA6IFpbal1baV0gPSBhW3BiXSAqIFhbal1baV0gKyBiW3BiXSAqCisgKiBZW2pdW2ldLCAgaj0wLC4uLixuSHlicmlkQmFuZHMtMTsgIGk9c3RhcnRUaW1lU2xvdCwuLi4sblRpbWVTbG90cy0xOworICogcGI9MCwuLi4sblBhcmFtZXRlckJhbmRzLTEKKyAqCisgKiAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gOiByZXtaW2pdW2ldfSA9IGFbcGJdICogcmV7WFtqXVtpXX0gKyBiW3BiXSAqCisgKiByZXtZW2pdW2ldfSwgIGo9MCwuLi4sbkh5YnJpZEJhbmRzLTE7ICBpPXN0YXJ0VGltZVNsb3QsLi4uLG5UaW1lU2xvdHMtMTsKKyAqIHBiPTAsLi4uLG5QYXJhbWV0ZXJCYW5kcy0xIGlte1pbal1baV19ID0gYVtwYl0gKiBpbXtYW2pdW2ldfSArIGJbcGJdICoKKyAqIGlte1lbal1baV19LCAgaj0wLC4uLixuSHlicmlkQmFuZHMtMTsKKyAqIGk9c3RhcnRUaW1lU2xvdCwuLi4sblRpbWVTbG90cy0xOyAgcGI9MCwuLi4sblBhcmFtZXRlckJhbmRzLTEKKyAqCisgKiAgICAgICAgICAgICAgICAgSXQgaXMgYWxsb3dlZCB0byBvdmVybGF5IFhbXSBvciBZW10gd2l0aCBaW10uIFRoZSBzY2FsZWZhY3RvcgorICogb2YgY2hhbm5lbCAxIGlzIHVwZGF0ZWQgd2l0aCB0aGUgY29tbW9uIHNjYWxlZmFjdG9yIG9mIGNoYW5uZWwgMSBhbmQKKyAqIGNoYW5uZWwgMi4KKyAqCisgKiBccGFyYW0gICAgICAgICAgRklYUF9EUEsgKipaCisgKiAgICAgICAgICAgICAgICAgT3V0cHV0OiB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuSHlicmlkQmFuZHMqblRpbWVTbG90cworICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqYQorICogICAgICAgICAgICAgICAgIElucHV0OiB2ZWN0b3Igb2YgbGVuZ3RoIG5QYXJhbWV0ZXJCYW5kcworICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RQSyAqKlgKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogdmVjdG9yIG9mIHRoZSBsZW5ndGggbkh5YnJpZEJhbmRzKm5UaW1lU2xvdHMKKyAqCisgKiBccGFyYW0gICAgICAgICAgY29uc3QgRklYUF9EQkwgKmIKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogdmVjdG9yIG9mIGxlbmd0aCBuUGFyYW1ldGVyQmFuZHMKKyAqCisgKiBccGFyYW0gICAgICAgICAgY29uc3QgRklYUF9EUEsgKipZCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHZlY3RvciBvZiB0aGUgbGVuZ3RoIG5IeWJyaWRCYW5kcypuVGltZVNsb3RzCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzY2FsZQorICogICAgICAgICAgICAgICAgIElucHV0OiBzY2FsZSBvZiB2ZWN0b3IgYSBhbmQgYgorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgKnNjYWxlQ2gxCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHNjYWxlIG9mIGNoMQorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgc2NhbGVDaDIKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogc2NhbGUgb2YgY2gyCisgKgorICogXHBhcmFtICAgICAgICAgIFVDSEFSICpwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0CisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHZlY3RvciBvZiBsZW5ndGggblBhcmFtZXRlckJhbmRzCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBuVGltZVNsb3RzCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IG51bWJlciBvZiB0aW1lIHNsb3RzCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzdGFydFRpbWVTbG90CisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHN0YXJ0IHRpbWUgc2xvdAorICoKKyAqIFxyZXR1cm4gICAgICAgICB2b2lkCisgKi8KK3ZvaWQgYWRkV2VpZ2h0ZWRDcGx4VmVjKEZJWFBfRFBLICpjb25zdCAqY29uc3QgWiwgY29uc3QgRklYUF9EQkwgKmNvbnN0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IFgsIGNvbnN0IEZJWFBfREJMICpjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBZLCBjb25zdCBJTlQgc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmNvbnN0IHNjYWxlQ2gxLCBjb25zdCBJTlQgc2NhbGVDaDIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqY29uc3QgcFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuUGFyYW1ldGVyQmFuZHMsIGNvbnN0IElOVCBuVGltZVNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN0YXJ0VGltZVNsb3QpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBWZWN0b3IgZnVuY3Rpb24gOiBDYWxjdWxhdGUgdGhlIGhlYWRyb29tIG9mIGEgY29tcGxleCB2ZWN0b3IKKyAqIGluIGEgcGFyYW1ldGVyIGJhbmQgZ3JpZAorICoKKyAqIFxwYXJhbSAgICAgICAgICBGSVhQX0RQSyAqKngKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogcG9pbnRlciB0byBjb21wbGV4IGlucHV0IHZlY3RvcgorICoKKyAqIFxwYXJhbSAgICAgICAgICBVQ0hBUiAqcFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldAorICogICAgICAgICAgICAgICAgIElucHV0OiBwb2ludGVyIHRvIGh5YnJpZCBiYW5kIG9mZnNldHMKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50ICpvdXRTY2FsZUZhY3RvcgorICogICAgICAgICAgICAgICAgIElucHV0OiBwb2ludGVyIHRvIG91cHV0IHNjYWxlZmFjdG9yCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzdGFydFRpbWVTbG90CisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHN0YXJ0IHRpbWUgc2xvdAorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgblRpbWVTbG90cworICogICAgICAgICAgICAgICAgIElucHV0OiBudW1iZXIgb2YgdGltZSBzbG90CisgKgorICogXHBhcmFtICAgICAgICAgIGludCBuUGFyYW1CYW5kcworICogICAgICAgICAgICAgICAgIElucHV0OiBudW1iZXIgb2YgcGFyYW1ldGVyIGJhbmRzCisgKgorICogXHJldHVybiAgICAgICAgIHZvaWQKKyAqLwordm9pZCBGREtjYWxjUGJTY2FsZUZhY3Rvcihjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpjb25zdCBwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmNvbnN0IG91dFNjYWxlRmFjdG9yLCBjb25zdCBJTlQgc3RhcnRUaW1lU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5UaW1lU2xvdHMsIGNvbnN0IElOVCBuUGFyYW1CYW5kcyk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFZlY3RvciBmdW5jdGlvbiA6IENhbGN1bGF0ZSB0aGUgY29tbW9uIGhlYWRyb29tIG9mIHR3bworICogc3BhcmF0ZSB2ZWN0b3JzCisgKgorICogXHBhcmFtICAgICAgICAgIEZJWFBfREJMICp4CisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHBvaW50ZXIgdG8gZmlyc3QgaW5wdXQgdmVjdG9yCisgKgorICogXHBhcmFtICAgICAgICAgIEZJWFBfREJMICp5CisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHBvaW50ZXIgdG8gc2Vjb25kIGlucHV0IHZlY3RvcgorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgbgorICogICAgICAgICAgICAgICAgIElucHV0OiBudW1iZXIgb2Ygc2FtcGxlcworICoKKyAqIFxyZXR1cm4gICAgICAgICBpbnQgaGVhZHJvbW0gaW4gYml0cworICovCitJTlQgRkRLY2FsY1NjYWxlRmFjdG9yKGNvbnN0IEZJWFBfREJMICpjb25zdCB4LCBjb25zdCBGSVhQX0RCTCAqY29uc3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG4pOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBWZWN0b3IgZnVuY3Rpb24gOiBDYWxjdWxhdGUgdGhlIGhlYWRyb29tIG9mIGEgY29tcGxleCB2ZWN0b3IKKyAqCisgKiBccGFyYW0gICAgICAgICAgRklYUF9EUEsgKngKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogcG9pbnRlciB0byBjb21wbGV4IGlucHV0IHZlY3RvcgorICoKKyAqIFxwYXJhbSAgICAgICAgICBJTlQgc3RhcnRCYW5kCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHN0YXJ0IGJhbmQKKyAqCisgKiBccGFyYW0gICAgICAgICAgSU5UIGJhbmRzCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IG51bWJlciBvZiBiYW5kcworICoKKyAqIFxyZXR1cm4gICAgICAgICBpbnQgaGVhZHJvbW0gaW4gYml0cworICovCitJTlQgRkRLY2FsY1NjYWxlRmFjdG9yRFBLKGNvbnN0IEZJWFBfRFBLICpSRVNUUklDVCB4LCBjb25zdCBJTlQgc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmFuZHMpOworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSB2b2lkIEZES21lbWNweV9mbGV4KFQgKmNvbnN0IGRzdCwgY29uc3QgSU5UIGRzdFN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQgKmNvbnN0IHNyYywgY29uc3QgSU5UIHNyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuU2FtcGxlcykgeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgblNhbXBsZXM7IGkrKykgeworICAgIGRzdFtpICogZHN0U3RyaWRlXSA9IHNyY1tpICogc3JjU3RyaWRlXTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSB2b2lkIEZES21lbXNldF9mbGV4KFQgKmNvbnN0IHgsIGNvbnN0IFQgYywgY29uc3QgSU5UIG5TYW1wbGVzKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7CisgICAgeFtpXSA9IGM7CisgIH0KK30KKworI2VuZGlmIC8qIFNBQ0VOQ19WRUNUT1JGVU5DVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL2luY2x1ZGUvc2JyZGVjb2Rlci5oIGIvbGliU0JSZGVjL2luY2x1ZGUvc2JyZGVjb2Rlci5oCmluZGV4IDNiYjliYTMuLmNjNTU1NzIgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9pbmNsdWRlL3NicmRlY29kZXIuaAorKysgYi9saWJTQlJkZWMvaW5jbHVkZS9zYnJkZWNvZGVyLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjUgKzkwLDI4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IFNCUiBkZWNvZGVyIGZyb250LWVuZCBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucy4KIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfX1NCUkRFQ09ERVJfSAotI2RlZmluZSBfX1NCUkRFQ09ERVJfSAorI2lmbmRlZiBTQlJERUNPREVSX0gKKyNkZWZpbmUgU0JSREVDT0RFUl9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCiAKKyNpbmNsdWRlICJGREtfcW1mX2RvbWFpbi5oIgogCi0jZGVmaW5lIFNCUl9ERUJVR19FWFRITFAgIlwKKyNkZWZpbmUgU0JSX0RFQlVHX0VYVEhMUCBcCisgICJcCiAtLS0gU0JSIC0tLVxuXAogICAgIDB4MDAwMDAwMTAgQW5jaWxsYXJ5IGRhdGEgYW5kIFNCUi1IZWFkZXJcblwKICAgICAweDAwMDAwMDIwIFNCUi1TaWRlIGluZm9cblwKQEAgLTExMCw2NCArMTI0LDkyIEBACiAiCiAKIC8qIENhcGFiaWxpdHkgZmxhZ3MgKi8KLSNkZWZpbmUgQ0FQRl9TQlJfTFAgICAgICAgICAgMHgwMDAwMDAwMSAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IG9mIExvdyBQb3dlciBtb2RlLiAgICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfU0JSX0hRICAgICAgICAgIDB4MDAwMDAwMDIgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBsaWJyYXJ5J3MgY2FwYWJpbGl0eSBvZiBIaWdoIFF1YWxpdHkgbW9kZS4gICAgICAgICAqLwotI2RlZmluZSBDQVBGX1NCUl9EUk1fQlMgICAgICAweDAwMDAwMDA0ICAgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgdG8gZGVjb2RlIERSTSBTQlIgZGF0YS4gICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9TQlJfQ09OQ0VBTE1FTlQgMHgwMDAwMDAwOCAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IHRvIGNvbmNlYWwgZXJyb25lb3VzIGZyYW1lcy4gICovCi0jZGVmaW5lIENBUEZfU0JSX0RSQyAgICAgICAgIDB4MDAwMDAwMTAgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBsaWJyYXJ5J3MgY2FwYWJpbGl0eSBmb3IgRHluYW1pYyBSYW5nZSBDb250cm9sLiAgICAqLwotI2RlZmluZSBDQVBGX1NCUl9QU19NUEVHICAgICAweDAwMDAwMDIwICAgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgdG8gZG8gTVBFRyBQYXJhbWV0cmljIFN0ZXJlby4gKi8KLSNkZWZpbmUgQ0FQRl9TQlJfUFNfRFJNICAgICAgMHgwMDAwMDA0MCAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IHRvIGRvIERSTSBQYXJhbWV0cmljIFN0ZXJlby4gICovCisjZGVmaW5lIENBUEZfU0JSX0xQIFwKKyAgMHgwMDAwMDAwMSAvKiE8IEZsYWcgaW5kaWNhdGluZyBsaWJyYXJ5J3MgY2FwYWJpbGl0eSBvZiBMb3cgUG93ZXIgbW9kZS4gKi8KKyNkZWZpbmUgQ0FQRl9TQlJfSFEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAyIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IG9mIEhpZ2ggUXVhbGl0eSBtb2RlLiBcCisgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX0RSTV9CUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDA0IC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IHRvIGRlY29kZSBEUk0gU0JSIGRhdGEuIFwKKyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfQ09OQ0VBTE1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDggLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgdG8gY29uY2VhbCBlcnJvbmVvdXMgXAorICAgICAgICAgICAgICAgIGZyYW1lcy4gICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfRFJDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMTAgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgZm9yIER5bmFtaWMgUmFuZ2UgXAorICAgICAgICAgICAgICAgIENvbnRyb2wuICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfUFNfTVBFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDIwIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IHRvIGRvIE1QRUcgUGFyYW1ldHJpYyBcCisgICAgICAgICAgICAgICAgU3RlcmVvLiAgICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX1BTX0RSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDQwIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IHRvIGRvIERSTSBQYXJhbWV0cmljIFwKKyAgICAgICAgICAgICAgICBTdGVyZW8uICAgICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX0VMRF9ET1dOU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDA4MCAvKiE8IEZsYWcgaW5kaWNhdGluZyBsaWJyYXJ5J3MgY2FwYWJpbGl0eSB0byBkbyBFTEQgZGVjb2RpbmcgaW4gXAorICAgICAgICAgICAgICAgIGRvd25zY2FsZWQgbW9kZSAqLworI2RlZmluZSBDQVBGX1NCUl9IQkVIUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDEwMCAvKiE8IEZsYWcgaW5kaWNhdGluZyBsaWJyYXJ5J3MgY2FwYWJpbGl0eSB0byBkbyBIUSBIYXJtb25pYyBcCisgICAgICAgICAgICAgICAgdHJhbnNwb3NpbmcgICAgICAgICAqLwogCi10eXBlZGVmIGVudW0KLXsKLSAgU0JSREVDX09LID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQWxsIGZpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNCUkRFQ19DT05DRUFMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQlJERUNfTk9TWU5DSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0JSREVDX0lMTEVHQUxfUFJPR1JBTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNCUkRFQ19JTExFR0FMX1RBRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQlJERUNfSUxMRUdBTF9DSE5fQ09ORklHLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0JSREVDX0lMTEVHQUxfU0VDVElPTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNCUkRFQ19JTExFR0FMX1NDRkFDVE9SUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQlJERUNfSUxMRUdBTF9QVUxTRV9EQVRBLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0JSREVDX01BSU5fUFJPRklMRV9OT1RfSU1QTEVNRU5URUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNCUkRFQ19HQ19OT1RfSU1QTEVNRU5URUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQlJERUNfSUxMRUdBTF9QTFVTX0VMRV9JRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgU0JSREVDX0NSRUFURV9FUlJPUiwgICAgICAgICAgICAgICAgIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFNCUkRFQ19OT1RfSU5JVElBTElaRUQsICAgICAgICAgICAgICAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRCwgICAgICAgICAgICAgLyohPCBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuIFByb2JhYmx5IG5vdCBlbm91Z2ggbWVtb3J5IGF2YWlsYWJsZS4gKi8KLSAgU0JSREVDX1BBUlNFX0VSUk9SLCAgICAgICAgICAgICAgICAgIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUcsICAgICAgICAgICAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBTQlJERUNfU0VUX1BBUkFNX0ZBSUwgICAgICAgICAgICAgICAgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgZW51bSB7CisgIFNCUkRFQ19PSyA9IDAsIC8qITwgQWxsIGZpbmUuICovCisgIC8qIFNCUkRFQ19DT05DRUFMLCAqLworICAvKiBTQlJERUNfTk9TWU5DSCwgKi8KKyAgLyogU0JSREVDX0lMTEVHQUxfUFJPR1JBTSwgKi8KKyAgLyogU0JSREVDX0lMTEVHQUxfVEFHLCAqLworICAvKiBTQlJERUNfSUxMRUdBTF9DSE5fQ09ORklHLCAqLworICAvKiBTQlJERUNfSUxMRUdBTF9TRUNUSU9OLCAqLworICAvKiBTQlJERUNfSUxMRUdBTF9TQ0ZBQ1RPUlMsICovCisgIC8qIFNCUkRFQ19JTExFR0FMX1BVTFNFX0RBVEEsICovCisgIC8qIFNCUkRFQ19NQUlOX1BST0ZJTEVfTk9UX0lNUExFTUVOVEVELCAqLworICAvKiBTQlJERUNfR0NfTk9UX0lNUExFTUVOVEVELCAqLworICAvKiBTQlJERUNfSUxMRUdBTF9QTFVTX0VMRV9JRCwgKi8KKyAgU0JSREVDX0lOVkFMSURfQVJHVU1FTlQsICAgLyohPCAgICovCisgIFNCUkRFQ19DUkVBVEVfRVJST1IsICAgICAgIC8qITwgICAgICAgKi8KKyAgU0JSREVDX05PVF9JTklUSUFMSVpFRCwgICAgLyohPCAgICAqLworICBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRCwgICAvKiE8IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gUHJvYmFibHkgbm90IGVub3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgYXZhaWxhYmxlLiAqLworICBTQlJERUNfUEFSU0VfRVJST1IsICAgICAgICAvKiE8ICAgICAgICAqLworICBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHLCAvKiE8ICovCisgIFNCUkRFQ19TRVRfUEFSQU1fRkFJTCwgICAgIC8qITwgICAgICovCisgIFNCUkRFQ19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCAvKiE8ICovCiB9IFNCUl9FUlJPUjsKIAotdHlwZWRlZiBlbnVtCi17Ci0gIFNCUl9TWVNURU1fQklUU1RSRUFNX0RFTEFZLCAgICAgICAgICAvKiE8IFN5c3RlbTogU3dpdGNoIHRvIGVuYWJsZSBhbiBhZGRpdGlvbmFsIFNCUiBiaXRzdHJlYW0gZGVsYXkgb2Ygb25lIGZyYW1lLiAqLwotICBTQlJfUU1GX01PREUsICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTZXQgUU1GIG1vZGUsIGVpdGhlciBjb21wbGV4IG9yIGxvdyBwb3dlci4gKi8KLSAgU0JSX0xEX1FNRl9USU1FX0FMSUdOLCAgICAgICAgICAgICAgIC8qITwgU2V0IFFNRiB0eXBlLCBlaXRoZXIgTEQtTVBTIG9yIENMREZCLiBSZWxldmFudCBmb3IgRUxEIHN0cmVhbXMgb25seS4gKi8KLSAgU0JSX0ZMVVNIX0RBVEEsICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IGludGVybmFsIHN0YXRlIHRvIGZsdXNoIHRoZSBkZWNvZGVyIHdpdGggdGhlIG5leHQgcHJvY2VzcyBjYWxsLiAqLwotICBTQlJfQ0xFQVJfSElTVE9SWSwgICAgICAgICAgICAgICAgICAgLyohPCBDbGVhciBhbGwgaW50ZXJuYWwgc3RhdGVzIChkZWxheSBsaW5lcywgUU1GIHN0YXRlcywgLi4uKS4gKi8KLSAgU0JSX0JTX0lOVEVSUlVQVElPTiAgICAgICAgICAgICAgICAgIC8qITwgU2lnbmFsIGJpdCBzdHJlYW0gaW50ZXJydXB0aW9uLiBWYWx1ZSBpcyBpZ25vcmVkLiAqLwordHlwZWRlZiBlbnVtIHsKKyAgU0JSX1NZU1RFTV9CSVRTVFJFQU1fREVMQVksIC8qITwgU3lzdGVtOiBTd2l0Y2ggdG8gZW5hYmxlIGFuIGFkZGl0aW9uYWwgU0JSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gZGVsYXkgb2Ygb25lIGZyYW1lLiAqLworICBTQlJfUU1GX01PREUsICAgICAgICAgICAgICAgLyohPCBTZXQgUU1GIG1vZGUsIGVpdGhlciBjb21wbGV4IG9yIGxvdyBwb3dlci4gKi8KKyAgU0JSX0xEX1FNRl9USU1FX0FMSUdOLCAvKiE8IFNldCBRTUYgdHlwZSwgZWl0aGVyIExELU1QUyBvciBDTERGQi4gUmVsZXZhbnQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxEIHN0cmVhbXMgb25seS4gKi8KKyAgU0JSX0ZMVVNIX0RBVEEsICAgICAvKiE8IFNldCBpbnRlcm5hbCBzdGF0ZSB0byBmbHVzaCB0aGUgZGVjb2RlciB3aXRoIHRoZSBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBjYWxsLiAqLworICBTQlJfQ0xFQVJfSElTVE9SWSwgIC8qITwgQ2xlYXIgYWxsIGludGVybmFsIHN0YXRlcyAoZGVsYXkgbGluZXMsIFFNRiBzdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKS4gKi8KKyAgU0JSX0JTX0lOVEVSUlVQVElPTiAvKiE8IFNpZ25hbCBiaXQgc3RyZWFtIGludGVycnVwdGlvbi4gVmFsdWUgaXMgaWdub3JlZC4gKi8KKyAgLAorICBTQlJfU0tJUF9RTUYgLyohPCBFbmFibGUgc2tpcHBpbmcgb2YgUU1GIHN0ZXA6IDEgc2tpcCBhbmFseXNpcywgMiBza2lwCisgICAgICAgICAgICAgICAgICBzeW50aGVzaXMgKi8KIH0gU0JSREVDX1BBUkFNOwogCiB0eXBlZGVmIHN0cnVjdCBTQlJfREVDT0RFUl9JTlNUQU5DRSAqSEFORExFX1NCUkRFQ09ERVI7CiAKLQogI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17CitleHRlcm4gIkMiIHsKICNlbmRpZgogCi0KIC8qKgotICogXGJyaWVmICAgICAgICBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIG9uZSBTQlIgZGVjb2RlciBpbnN0YW5jZS4KLSAqIFxwYXJhbSBwU2VsZiAgUG9pbnRlciB0byB3aGVyZSBhIFNCUiBkZWNvZGVyIGhhbmRsZSBpcyBjb3BpZWQgaW50by4KLSAqIFxyZXR1cm4gICAgICAgRXJyb3IgY29kZS4KKyAqIFxicmllZiAgICAgICAgICAgICBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIG9uZSBTQlIgZGVjb2RlciBpbnN0YW5jZS4KKyAqIFxwYXJhbSBwU2VsZiAgICAgICBQb2ludGVyIHRvIHdoZXJlIGEgU0JSIGRlY29kZXIgaGFuZGxlIGlzIGNvcGllZCBpbnRvLgorICogXHBhcmFtIHBRbWZEb21haW4gIFBvaW50ZXIgdG8gUU1GIGRvbWFpbiBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBccmV0dXJuICAgICAgICAgICAgRXJyb3IgY29kZS4KICAqLwotU0JSX0VSUk9SIHNickRlY29kZXJfT3BlbiAoIEhBTkRMRV9TQlJERUNPREVSICpwU2VsZiApOworU0JSX0VSUk9SIHNickRlY29kZXJfT3BlbihIQU5ETEVfU0JSREVDT0RFUiAqcFNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfUU1GX0RPTUFJTiBwUW1mRG9tYWluKTsKIAogLyoqCi0gKiBcYnJpZWYgIEluaXRpYWxpemUgYSBTQlIgZGVjb2RlciBydW50aW1lIGluc3RhbmNlLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgZGVjb2Rpbmcgc3RhcnRzLgorICogXGJyaWVmICBJbml0aWFsaXplIGEgU0JSIGRlY29kZXIgcnVudGltZSBpbnN0YW5jZS4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlCisgKiBkZWNvZGluZyBzdGFydHMuCiAgKgogICogXHBhcmFtIHNlbGYgICAgICAgICAgICAgSGFuZGxlIHRvIGEgU0JSIGRlY29kZXIgaW5zdGFuY2UuCiAgKiBccGFyYW0gc2FtcGxlUmF0ZUluICAgICBJbnB1dCBzYW1wbGVyYXRlIG9mIHRoZSBTQlIgZGVjb2RlciBpbnN0YW5jZS4KQEAgLTE3NSw0MCArMjE3LDUyIEBACiAgKiBccGFyYW0gc2FtcGxlc1BlckZyYW1lICBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWVzLgogICogXHBhcmFtIGNvcmVDb2RlYyAgICAgICAgQXVkaW8gT2JqZWN0IFR5cGUgKEFPVCkgb2YgdGhlIGNvcmUgY29kZWMuCiAgKiBccGFyYW0gZWxlbWVudElEICAgICAgICBUYWJsZSB3aXRoIE1QRUctNCBlbGVtZW50IElkcyBpbiBjYW5vbmljYWwgb3JkZXIuCi0gKiBccGFyYW0gZm9yY2VSZXNldCAgICAgICBGbGFnIHRoYXQgZW5mb3JjZXMgYSBjb21wbGV0ZSBkZWNvZGVyIHJlc2V0LgorICogXHBhcmFtIGVsZW1lbnRJbmRleCAgICAgU0JSIGVsZW1lbnQgaW5kZXgKKyAqIFxwYXJhbSBoYXJtb25pY1NCUgorICogXHBhcmFtIHN0ZXJlb0NvbmZpZ0luZGV4CisgKiBccGFyYW0gZG93bnNjYWxlRmFjdG9yICBFTEQgZG93bnNjYWxlIGZhY3RvcgorICogXHBhcmFtIGNvbmZpZ01vZGUgICAgICAgVGFibGUgd2l0aCBNUEVHLTQgZWxlbWVudCBJZHMgaW4gY2Fub25pY2FsIG9yZGVyLgorICogXHBhcmFtIGNvbmZpZ0NoYW5nZWQgICAgRmxhZyB0aGF0IGVuZm9yY2VzIGEgY29tcGxldGUgZGVjb2RlciByZXNldC4KICAqCiAgKiBccmV0dXJuICBFcnJvciBjb2RlLgogICovCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9Jbml0RWxlbWVudCAoCi0gICAgICAgIEhBTkRMRV9TQlJERUNPREVSICAgICAgIHNlbGYsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZVJhdGVJbiwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZU91dCwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCi0gICAgICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEICAgIGVsZW1lbnRJRCwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgZWxlbWVudEluZGV4Ci0gICAgICAgICk7CitTQlJfRVJST1Igc2JyRGVjb2Rlcl9Jbml0RWxlbWVudCgKKyAgICBIQU5ETEVfU0JSREVDT0RFUiBzZWxmLCBjb25zdCBpbnQgc2FtcGxlUmF0ZUluLCBjb25zdCBpbnQgc2FtcGxlUmF0ZU91dCwKKyAgICBjb25zdCBpbnQgc2FtcGxlc1BlckZyYW1lLCBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCisgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxlbWVudElELCBjb25zdCBpbnQgZWxlbWVudEluZGV4LAorICAgIGNvbnN0IFVDSEFSIGhhcm1vbmljU0JSLCBjb25zdCBVQ0hBUiBzdGVyZW9Db25maWdJbmRleCwKKyAgICBjb25zdCBVQ0hBUiBjb25maWdNb2RlLCBVQ0hBUiAqY29uZmlnQ2hhbmdlZCwgY29uc3QgSU5UIGRvd25zY2FsZUZhY3Rvcik7CisKKy8qKgorICogXGJyaWVmIEZyZWUgY29uZmlnIGRlcGVuZGVudCBTQlIgbWVtb3J5LgorICogXHBhcmFtIHNlbGYgU0JSIGRlY29kZXIgaW5zdGFuY2UgaGFuZGxlCisgKi8KK1NCUl9FUlJPUiBzYnJEZWNvZGVyX0ZyZWVNZW0oSEFORExFX1NCUkRFQ09ERVIgKnNlbGYpOwogCiAvKioKICAqIFxicmllZiBwYXNzIG91dCBvZiBiYW5kIFNCUiBoZWFkZXIgdG8gU0JSIGRlY29kZXIKICAqCiAgKiBccGFyYW0gc2VsZiAgICAgICAgIEhhbmRsZSB0byBhIFNCUiBkZWNvZGVyIGluc3RhbmNlLgogICogXHBhcmFtIGhCcyAgICAgICAgICBiaXQgc3RyZWFtIGhhbmRsZSBkYXRhIHNvdXJjZS4KKyAqIFxwYXJhbSBzYW1wbGVSYXRlSW4gU0JSIGlucHV0IHNhbXBsaW5nIHJhdGUKKyAqIFxwYXJhbSBzYW1wbGVSYXRlT3V0IFNCUiBvdXRwdXQgc2FtcGxpbmcgcmF0ZQorICogXHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBmcmFtZSBsZW5ndGgKICAqIFxwYXJhbSBlbGVtZW50SUQgICAgU0JSIGVsZW1lbnQgSUQuCiAgKiBccGFyYW0gZWxlbWVudEluZGV4IFNCUiBlbGVtZW50IGluZGV4LgorICogXHBhcmFtIGhhcm1vbmljU0JSCisgKiBccGFyYW0gc3RlcmVvQ29uZmlnSW5kZXgKKyAqIFxwYXJhbSBkb3duc2NhbGVGYWN0b3IgIEVMRCBkb3duc2NhbGUgZmFjdG9yCiAgKgogICogXHJldHVybiAgRXJyb3IgY29kZS4KICAqLwotSU5UIHNickRlY29kZXJfSGVhZGVyICgKLSAgICAgICAgSEFORExFX1NCUkRFQ09ERVIgICAgICAgc2VsZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgaEJzLAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUluLAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZU91dCwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAotICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCAgICBlbGVtZW50SUQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgIGVsZW1lbnRJbmRleAotICAgICAgICApOworSU5UIHNickRlY29kZXJfSGVhZGVyKEhBTkRMRV9TQlJERUNPREVSIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUluLCBjb25zdCBJTlQgc2FtcGxlUmF0ZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50SUQsIGNvbnN0IElOVCBlbGVtZW50SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgaGFybW9uaWNTQlIsIGNvbnN0IFVDSEFSIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkb3duc2NhbGVGYWN0b3IpOwogCiAvKioKICAqIFxicmllZiAgICAgICAgU2V0IGEgcGFyYW1ldGVyIG9mIHRoZSBTQlIgZGVjb2RlciBydW50aW1lIGluc3RhbmNlLgpAQCAtMjE3LDMyICsyNzEsMzIgQEAKICAqIFxwYXJhbSB2YWx1ZSAgTmV3IHBhcmFtZXRlciB2YWx1ZS4KICAqIFxyZXR1cm4gICAgICAgRXJyb3IgY29kZS4KICAqLwotU0JSX0VSUk9SIHNickRlY29kZXJfU2V0UGFyYW0gKCBIQU5ETEVfU0JSREVDT0RFUiAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNCUkRFQ19QQVJBTSAgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgdmFsdWUgKTsKK1NCUl9FUlJPUiBzYnJEZWNvZGVyX1NldFBhcmFtKEhBTkRMRV9TQlJERUNPREVSIHNlbGYsIGNvbnN0IFNCUkRFQ19QQVJBTSBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB2YWx1ZSk7CiAKIC8qKgogICogXGJyaWVmICBGZWVkIERSQyBjaGFubmVsIGRhdGEgaW50byBhIFNCUiBkZWNvZGVyIHJ1bnRpbWUgaW5zdGFuY2UuCiAgKgogICogXHBhcmFtIHNlbGYgICAgICAgICAgICAgICAgICAgIFNCUiBkZWNvZGVyIGhhbmRsZS4KLSAqIFxwYXJhbSBjaCAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsIG51bWJlciB0byB3aGljaCB0aGUgRFJDIGRhdGEgaXMgYXNzb2NpYXRlZCB0by4KKyAqIFxwYXJhbSBjaCAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsIG51bWJlciB0byB3aGljaCB0aGUgRFJDIGRhdGEgaXMKKyAqIGFzc29jaWF0ZWQgdG8uCiAgKiBccGFyYW0gbnVtQmFuZHMgICAgICAgICAgICAgICAgTnVtYmVyIG9mIERSQyBiYW5kcy4KLSAqIFxwYXJhbSBwTmV4dEZhY3RfbWFnICAgICAgICAgICBQb2ludGVyIHRvIGEgdGFibGUgd2l0aCB0aGUgRFJDIGZhY3RvciBtYWduaXR1ZGVzLgorICogXHBhcmFtIHBOZXh0RmFjdF9tYWcgICAgICAgICAgIFBvaW50ZXIgdG8gYSB0YWJsZSB3aXRoIHRoZSBEUkMgZmFjdG9yCisgKiBtYWduaXR1ZGVzLgogICogXHBhcmFtIG5leHRGYWN0X2V4cCAgICAgICAgICAgIEV4cG9uZW50IGZvciBhbGwgRFJDIGZhY3RvcnMuCiAgKiBccGFyYW0gZHJjSW50ZXJwb2xhdGlvblNjaGVtZSAgRFJDIGludGVycG9sYXRpb24gc2NoZW1lLgotICogXHBhcmFtIHdpblNlcXVlbmNlICAgICAgICAgICAgIFdpbmRvdyBzZXF1ZW5jZSBmcm9tIGNvcmUgY29kZXIgKGVpZ2h0IHNob3J0IG9yIG9uZSBsb25nIHdpbmRvdykuCi0gKiBccGFyYW0gcEJhbmRUb3AgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHRhYmxlIHdpdGggdGhlIHRvcCBib3JkZXJzIGZvciBhbGwgRFJDIGJhbmRzLgorICogXHBhcmFtIHdpblNlcXVlbmNlICAgICAgICAgICAgIFdpbmRvdyBzZXF1ZW5jZSBmcm9tIGNvcmUgY29kZXIgKGVpZ2h0IHNob3J0CisgKiBvciBvbmUgbG9uZyB3aW5kb3cpLgorICogXHBhcmFtIHBCYW5kVG9wICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSB0YWJsZSB3aXRoIHRoZSB0b3AgYm9yZGVycyBmb3IKKyAqIGFsbCBEUkMgYmFuZHMuCiAgKgogICogXHJldHVybiAgRXJyb3IgY29kZS4KICAqLwotU0JSX0VSUk9SIHNickRlY29kZXJfZHJjRmVlZENoYW5uZWwgKCBIQU5ETEVfU0JSREVDT0RFUiAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgIGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgbnVtQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgICpwTmV4dEZhY3RfbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgbmV4dEZhY3RfZXhwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAgICAgICAgICAgICAgZHJjSW50ZXJwb2xhdGlvblNjaGVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgIHdpblNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAqcEJhbmRUb3AgKTsKK1NCUl9FUlJPUiBzYnJEZWNvZGVyX2RyY0ZlZWRDaGFubmVsKEhBTkRMRV9TQlJERUNPREVSIHNlbGYsIElOVCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbnVtQmFuZHMsIEZJWFBfREJMICpwTmV4dEZhY3RfbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5leHRGYWN0X2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIGRyY0ludGVycG9sYXRpb25TY2hlbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiB3aW5TZXF1ZW5jZSwgVVNIT1JUICpwQmFuZFRvcCk7CiAKIC8qKgogICogXGJyaWVmICBEaXNhYmxlIFNCUiBEUkMgZm9yIGEgY2VydGFpbiBjaGFubmVsLgpAQCAtMjUyLDQyICszMDYsNDEgQEAKICAqCiAgKiBccmV0dXJuICBOb25lLgogICovCi12b2lkIHNickRlY29kZXJfZHJjRGlzYWJsZSAoIEhBTkRMRV9TQlJERUNPREVSICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgY2ggKTsKLQordm9pZCBzYnJEZWNvZGVyX2RyY0Rpc2FibGUoSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgSU5UIGNoKTsKIAogLyoqCi0gKiBcYnJpZWYgIFBhcnNlIG9uZSBTQlIgZWxlbWVudCBkYXRhIGV4dGVuc2lvbiBkYXRhIGJsb2NrLiBUaGUgYml0IHN0cmVhbSBwb3NpdGlvbiB3aWxsCi0gKiAgICAgICAgIGJlIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBTQlIgcGF5bG9hZCBibG9jay4gVGhlIHJlbWFpbmluZyBiaXRzIHdpbGwgYmUgcmV0dXJuZWQKLSAqICAgICAgICAgaW50byAqY291bnQgaWYgYSBwYXlsb2FkIGxlbmd0aCBpcyBnaXZlbiAoYnlQYXlMZW4gPiAwKS4gSWYgbm8gU0JSIHBheWxvYWQgbGVuZ3RoIGlzCi0gKiAgICAgICAgIGdpdmVuIChic1BheUxlbiA8IDApIHRoZW4gdGhlIGJpdCBzdHJlYW0gcG9zaXRpb24gb24gcmV0dXJuIHdpbGwgYmUgcmFuZG9tIGFmdGVyIHRoaXMKLSAqICAgICAgICAgZnVuY3Rpb24gY2FsbCBpbiBjYXNlIG9mIGVycm9ycywgYW5kIGFueSBmdXJ0aGVyIGRlY29kaW5nIHdpbGwgYmUgY29tcGxldGVseSBwb2ludGxlc3MuCi0gKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBlaXRoZXIgbm9ybWFsIG9yZGVyZWQgU0JSIGRhdGEgb3IgcmV2ZXJzZSBvcmRlcmVkIERSTSBTQlIgZGF0YS4KKyAqIFxicmllZiAgUGFyc2Ugb25lIFNCUiBlbGVtZW50IGRhdGEgZXh0ZW5zaW9uIGRhdGEgYmxvY2suIFRoZSBiaXQgc3RyZWFtCisgKiBwb3NpdGlvbiB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBTQlIgcGF5bG9hZCBibG9jay4gVGhlIHJlbWFpbmluZworICogYml0cyB3aWxsIGJlIHJldHVybmVkIGludG8gKmNvdW50IGlmIGEgcGF5bG9hZCBsZW5ndGggaXMgZ2l2ZW4KKyAqIChieVBheUxlbiA+IDApLiBJZiBubyBTQlIgcGF5bG9hZCBsZW5ndGggaXMgZ2l2ZW4gKGJzUGF5TGVuIDwgMCkgdGhlbgorICogdGhlIGJpdCBzdHJlYW0gcG9zaXRpb24gb24gcmV0dXJuIHdpbGwgYmUgcmFuZG9tIGFmdGVyIHRoaXMgZnVuY3Rpb24KKyAqIGNhbGwgaW4gY2FzZSBvZiBlcnJvcnMsIGFuZCBhbnkgZnVydGhlciBkZWNvZGluZyB3aWxsIGJlIGNvbXBsZXRlbHkKKyAqIHBvaW50bGVzcy4gVGhpcyBmdW5jdGlvbiBhY2NlcHRzIGVpdGhlciBub3JtYWwgb3JkZXJlZCBTQlIgZGF0YSBvciByZXZlcnNlCisgKiBvcmRlcmVkIERSTSBTQlIgZGF0YS4KICAqCiAgKiBccGFyYW0gc2VsZiAgICAgICAgICAgU0JSIGRlY29kZXIgaGFuZGxlLgogICogXHBhcmFtIGhCcyAgICAgICAgICAgIEJpdCBzdHJlYW0gaGFuZGxlIGFzIGRhdGEgc291cmNlLgotICogXHBhcmFtIGNvdW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gaW50ZWdlciB3aGVyZSB0aGUgYW1vdW50IG9mIHBhcnNlZCBTQlIgcGF5bG9hZCBiaXRzIGlzIHN0b3JlZCBpbnRvLgotICogXHBhcmFtIGJzUGF5TGVuICAgICAgIElmID4gMCB0aGlzIHZhbHVlIGlzIHRoZSBTQlIgcGF5bG9hZCBsZW5ndGguIElmIDwgMCwgdGhlIFNCUiBwYXlsb2FkIGxlbmd0aCBpcyB1bmtub3duLgorICogXHBhcmFtIGNvdW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gaW50ZWdlciB3aGVyZSB0aGUgYW1vdW50IG9mIHBhcnNlZCBTQlIKKyAqIHBheWxvYWQgYml0cyBpcyBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSBic1BheUxlbiAgICAgICBJZiA+IDAgdGhpcyB2YWx1ZSBpcyB0aGUgU0JSIHBheWxvYWQgbGVuZ3RoLiBJZiA8IDAsCisgKiB0aGUgU0JSIHBheWxvYWQgbGVuZ3RoIGlzIHVua25vd24uCiAgKiBccGFyYW0gZmxhZ3MgICAgICAgICAgQ1JDIGZsYWcgKDA6IEVYVF9TQlJfREFUQTsgMTogRVhUX1NCUl9EQVRBX0NSQykKICAqIFxwYXJhbSBwcmV2X2VsZW1lbnQgICBQcmV2aW91cyBNUEVHLTQgZWxlbWVudCBJRC4KICAqIFxwYXJhbSBlbGVtZW50X2luZGV4ICBJbmRleCBvZiB0aGUgY3VycmVudCBlbGVtZW50LgorICogXHBhcmFtIGFjRmxhZ3MgICAgICAgIEF1ZGlvIGNvZGVjIGZsYWdzCiAgKgogICogXHJldHVybiAgRXJyb3IgY29kZS4KICAqLwotU0JSX0VSUk9SIHNickRlY29kZXJfUGFyc2UgKAotICAgICAgICBIQU5ETEVfU0JSREVDT0RFUiAgc2VsZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICBpbnQgKmNvdW50LAotICAgICAgICBpbnQgIGJzUGF5TGVuLAotICAgICAgICBpbnQgIGNyY0ZsYWcsCi0gICAgICAgIE1QNF9FTEVNRU5UX0lEIHByZXZfZWxlbWVudCwKLSAgICAgICAgaW50IGVsZW1lbnRfaW5kZXgsCi0gICAgICAgIGludCBmR2xvYmFsSW5kZXBlbmRlbmN5RmxhZwotICAgICAgICApOworU0JSX0VSUk9SIHNickRlY29kZXJfUGFyc2UoSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBEcm1Cc0J1ZmZlciwgVVNIT1JUIGRybUJzQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY291bnQsIGludCBic1BheUxlbiwgaW50IGNyY0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNUDRfRUxFTUVOVF9JRCBwcmV2X2VsZW1lbnQsIGludCBlbGVtZW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhY0ZsYWdzLCBVSU5UIGFjRWxGbGFnc1tdKTsKIAogLyoqCi0gKiBcYnJpZWYgIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyB0aGUgZ2l2ZW4gU0JSIGJpdHN0cmVhbXMgYW5kIGFwcGxpZXMgU0JSIHRvIHRoZSBnaXZlbiB0aW1lIGRhdGEuCi0gKiAKKyAqIFxicmllZiAgVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoZSBnaXZlbiBTQlIgYml0c3RyZWFtcyBhbmQgYXBwbGllcyBTQlIgdG8gdGhlCisgKiBnaXZlbiB0aW1lIGRhdGEuCisgKgogICogU0JSLXByb2Nlc3Npbmcgd29ya3MgSW5QbGFjZS4gSS5lLiB0aGUgY2FsbGluZyBmdW5jdGlvbiBoYXMgdG8gcHJvdmlkZQogICogYSB0aW1lIGRvbWFpbiBidWZmZXIgdGltZURhdGEgd2hpY2ggY2FuIGhvbGQgdGhlIGNvbXBsZXRlbHkgZGVjb2RlZAogICogcmVzdWx0LgpAQCAtMjk3LDQ4ICszNTAsNDkgQEAKICAqCiAgKiBccGFyYW0gc2VsZiAgICAgICAgICAgIEhhbmRsZSBvZiBhbiBvcGVuIFNCUiBkZWNvZGVyIGluc3RhbmNlLgogICogXHBhcmFtIGhTYnJCcyAgICAgICAgICBTQlIgQml0c3RyZWFtIGhhbmRsZS4KLSAqIFxwYXJhbSB0aW1lRGF0YSAgICAgICAgUG9pbnRlciB0byBpbnB1dCBhbmQgZmluYWxseSB1cHNhbXBsZWQgb3V0cHV0IGRhdGEuCi0gKiBccGFyYW0gbnVtQ2hhbm5lbHMgICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRpbWUgZGF0YSBidWZmZXIuCisgKiBccGFyYW0gaW5wdXQgICAgICAgICAgIFBvaW50ZXIgdG8gaW5wdXQgZGF0YS4KKyAqIFxwYXJhbSB0aW1lRGF0YSAgICAgICAgUG9pbnRlciB0byB1cHNhbXBsZWQgb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gdGltZURhdGFTaXplICAgIFNpemUgb2YgdGltZURhdGEuCisgKiBccGFyYW0gbnVtQ2hhbm5lbHMgICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluCisgKiB0aW1lIGRhdGEgYnVmZmVyLgogICogXHBhcmFtIHNhbXBsZVJhdGUgICAgICBPdXRwdXQgc2FtcGxlcmF0ZS4KICAqIFxwYXJhbSBjaGFubmVsTWFwcGluZyAgQ2hhbm5lbCBtYXBwaW5nIGluZGljZXMuCi0gKiBccGFyYW0gaW50ZXJsZWF2ZWQgICAgIEZsYWcgaW5kaWNhdGluZyBpZiB0aW1lIGRhdGEgaXMgc3RvcmVkIGludGVybGVhdmVkICgxOiBJbnRlcmxlYXZlZCB0aW1lIGRhdGEsIDA6IG5vbi1pbnRlcmxlYXZlZCB0aW1lZGF0YSkuCi0gKiBccGFyYW0gY29yZURlY29kZWRPayAgIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgY29yZSBkZWNvZGVyIGRpZCBub3QgZmluZCBhbnkgZXJyb3IgKDA6IGNvcmUgZGVjb2RlciBmb3VuZCBlcnJvcnMsIDE6IG5vIGVycm9ycykuCi0gKiBccGFyYW0gcHNEZWNvZGVkICAgICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgaG9sZGluZyBhIGZsYWcuIElucHV0OiBQUyBpcyBwb3NzaWJsZSwgT3V0cHV0OiBQUyBoYXMgYmVlbiByZW5kZXJlZC4KKyAqIFxwYXJhbSBjb3JlRGVjb2RlZE9rICAgRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBjb3JlIGRlY29kZXIgZGlkIG5vdCBmaW5kIGFueQorICogZXJyb3IgKDA6IGNvcmUgZGVjb2RlciBmb3VuZCBlcnJvcnMsIDE6IG5vIGVycm9ycykuCisgKiBccGFyYW0gcHNEZWNvZGVkICAgICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgaG9sZGluZyBhIGZsYWcuIElucHV0OiBQUyBpcworICogcG9zc2libGUsIE91dHB1dDogUFMgaGFzIGJlZW4gcmVuZGVyZWQuCiAgKgogICogXHJldHVybiAgRXJyb3IgY29kZS4KICAqLwotU0JSX0VSUk9SIHNickRlY29kZXJfQXBwbHkgKCBIQU5ETEVfU0JSREVDT0RFUiAgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAgICp0aW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqbnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgIGNoYW5uZWxNYXBwaW5nWyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGludGVybGVhdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBjb3JlRGVjb2RlZE9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICpwc0RlY29kZWQgKTsKLQorU0JSX0VSUk9SIHNickRlY29kZXJfQXBwbHkoSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgSU5UX1BDTSAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICp0aW1lRGF0YSwgY29uc3QgaW50IHRpbWVEYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbnVtQ2hhbm5lbHMsIGludCAqc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IgKmNvbnN0IG1hcERlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG1hcElkeCwgY29uc3QgaW50IGNvcmVEZWNvZGVkT2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcHNEZWNvZGVkKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgQ2xvc2UgU0JSIGRlY29kZXIgaW5zdGFuY2UgYW5kIGZyZWUgbWVtb3J5LgogICogXHBhcmFtIHNlbGYgIFNCUiBkZWNvZGVyIGhhbmRsZS4KICAqIFxyZXR1cm4gICAgICBFcnJvciBDb2RlLgogICovCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9DbG9zZSAoIEhBTkRMRV9TQlJERUNPREVSICpzZWxmICk7Ci0KK1NCUl9FUlJPUiBzYnJEZWNvZGVyX0Nsb3NlKEhBTkRMRV9TQlJERUNPREVSICpzZWxmKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgR2V0IFNCUiBkZWNvZGVyIGxpYnJhcnkgaW5mb3JtYXRpb24uCi0gKiBccGFyYW0gaW5mbyAgUG9pbnRlciB0byBhIExJQl9JTkZPIHN0cnVjdCwgd2hlcmUgbGlicmFyeSBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIHRvLgotICogXHJldHVybiAgICAgIDAgb24gc3VjY2VzcywgLTEgaWYgaW52YWxpZCBoYW5kbGUgb3IgaWYgbm8gZnJlZSBlbGVtZW50IGlzIGF2YWlsYWJsZSB0byB3cml0ZSBpbmZvcm1hdGlvbiB0by4KKyAqIFxwYXJhbSBpbmZvICBQb2ludGVyIHRvIGEgTElCX0lORk8gc3RydWN0LCB3aGVyZSBsaWJyYXJ5IGluZm9ybWF0aW9uIGlzCisgKiB3cml0dGVuIHRvLgorICogXHJldHVybiAgICAgIDAgb24gc3VjY2VzcywgLTEgaWYgaW52YWxpZCBoYW5kbGUgb3IgaWYgbm8gZnJlZSBlbGVtZW50IGlzCisgKiBhdmFpbGFibGUgdG8gd3JpdGUgaW5mb3JtYXRpb24gdG8uCiAgKi8KLUlOVCBzYnJEZWNvZGVyX0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICk7ICAgIAorSU5UIHNickRlY29kZXJfR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbyk7CiAKIC8qKgogICogXGJyaWVmICAgICAgIERldGVybWluZSB0aGUgbW9kdWxlcyBvdXRwdXQgc2lnbmFsIGRlbGF5IGluIHNhbXBsZXMuCiAgKiBccGFyYW0gc2VsZiAgU0JSIGRlY29kZXIgaGFuZGxlLgogICogXHJldHVybiAgICAgIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBzaWduYWwgZGVsYXkgYWRkZWQgYnkgdGhlIG1vZHVsZS4KICAqLwotVUlOVCBzYnJEZWNvZGVyX0dldERlbGF5KCBjb25zdCBIQU5ETEVfU0JSREVDT0RFUiBzZWxmICk7Ci0KK1VJTlQgc2JyRGVjb2Rlcl9HZXREZWxheShjb25zdCBIQU5ETEVfU0JSREVDT0RFUiBzZWxmKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL0hGZ2VuX3ByZUZsYXQuY3BwIGIvbGliU0JSZGVjL3NyYy9IRmdlbl9wcmVGbGF0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmFkYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0JSZGVjL3NyYy9IRmdlbl9wcmVGbGF0LmNwcApAQCAtMCwwICsxLDk5MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgT2xpdmVyIE1vc2VyLCBNYW51ZWwgSmFuZGVyLCBNYXR0aGlhcyBIaWxkZW5icmFuZAorCisgICBEZXNjcmlwdGlvbjogUU1GIGZyZXF1ZW5jeSBwcmUtd2hpdGVuaW5nIGZvciBTQlIuCisgICAgICAgICAgICAgICAgSW4gdGhlIGRvY3VtZW50YXRpb24gdGhlIHRlcm1zICJzY2FsZSBmYWN0b3IiIGFuZCAiZXhwb25lbnQiCisgICAgICAgICAgICAgICAgbWVhbiB0aGUgc2FtZS4gVmFyaWFibGVzIGNvbnRhaW5pbmcgc3VjaCBpbmZvcm1hdGlvbiBoYXZlCisgICAgICAgICAgICAgICAgdGhlIHN1ZmZpeCAiX3NmIi4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkhGZ2VuX3ByZUZsYXQuaCIKKworI2RlZmluZSBQT0xZX09SREVSIDMKKyNkZWZpbmUgTUFYTE9XQkFORFMgMzIKKyNkZWZpbmUgTE9HMTBGQUMgMC43NTI1NzQ5ODkxNTk5NTNmICAgICAvKiA9PSAxMC9sb2cyKDEwKSAqIDJeLTIgKi8KKyNkZWZpbmUgTE9HMTBGQUNfSU5WIDAuNjY0Mzg1NjE4OTc3NDcyZiAvKiA9PSBsb2cyKDEwKS8yMCAqIDJeMiAgKi8KKworI2RlZmluZSBGSVhQX0NIQiBGSVhQX1NHTCAvKiBTVEIgc2ludXMgVGFiIHVzZWQgaW4gdHJhbnNmb3JtYXRpb24gKi8KKyNkZWZpbmUgQ0hDKGEpIChGWF9EQkwyRlhDT05TVF9TR0woYSkpCisjZGVmaW5lIEZYX0NIQjJGWF9EQkwoYSkgRlhfU0dMMkZYX0RCTChhKQorCit0eXBlZGVmIHN0cnVjdCBiYWNrc3Vic3RfZGF0YSB7CisgIEZJWFBfQ0hCIExub3JtMWRbM107IC8qITwgTm9ybWFsaXplZCBMIG1hdHJpeCAqLworICBTQ0hBUiBMbm9ybTFkX3NmWzNdOworICBGSVhQX0NIQiBMbm9ybWlpCisgICAgICBbM107IC8qITwgVGhlIGRpYWdvbmFsIGRhdGEgcG9pbnRzIFtpXVtpXSBvZiB0aGUgbm9ybWFsaXplZCBMIG1hdHJpeCAqLworICBTQ0hBUiBMbm9ybWlpX3NmWzNdOworICBGSVhQX0NIQiBCbXVsMAorICAgICAgWzRdOyAvKiE8IFRvIG5vcm1hbGl6ZSBMKng9YiwgQm11bDAgaXMgd2hhdCB3ZSBuZWVkIHRvIG11bHRpcGx5IGIgd2l0aC4gKi8KKyAgU0NIQVIgQm11bDBfc2ZbNF07CisgIEZJWFBfQ0hCIExub3JtSW52MWRbNl07IC8qITwgTm9ybWFsaXplZCBpbnZlcnRlZCBMIG1hdHJpeCAoTCcpICovCisgIFNDSEFSIExub3JtSW52MWRfc2ZbNl07CisgIEZJWFBfQ0hCCisgIEJtdWwxWzRdOyAvKiE8IFRvIG5vcm1hbGl6ZSBMJyp4PWIsIEJtdWwxIGlzIHdoYXQgd2UgbmVlZCB0byBtdWx0aXBseSBiCisgICAgICAgICAgICAgICB3aXRoLiAqLworICBTQ0hBUiBCbXVsMV9zZls0XTsKK30gYmFja3N1YnN0X2RhdGE7CisKKy8qIGZvciBlYWNoIGVsZW1lbnQgbiBkbywgZihuKSA9IHRydW5jKGxvZzIobikpKzEgICovCitjb25zdCBVQ0hBUiBnZXRMb2cyWzMyXSA9IHswLCAxLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNX07CisKKy8qKiBcZGVmICBCU0RfSURYX09GRlNFVAorICoKKyAqICBic2RbXSBiZWdpbnMgYXQgaW5kZXggMCB3aXRoIGRhdGEgZm9yIG51bUJhbmRzPTUuIFRoZSBjb3JyZWN0IGJzZFtdIGlzCisgKiAgaW5kZXhlZCBsaWtlIGJzZFtudW1CYW5kcy1CU0RfSURYX09GRlNFVF0uCisgKi8KKyNkZWZpbmUgQlNEX0lEWF9PRkZTRVQgNQorCisjZGVmaW5lIE5fTlVNQkFORFMgICAgICAgICAgICAgICBcCisgIE1BWExPV0JBTkRTIC0gQlNEX0lEWF9PRkZTRVQgKyBcCisgICAgICAxIC8qITwgTnVtYmVyIG9mIGJhY2tzdWJzdF9kYXRhIGVsZW1lbnRzIGluIGJzZCAqLworCitjb25zdCBiYWNrc3Vic3RfZGF0YSBic2RbTl9OVU1CQU5EU10gPSB7CisgICAgeworICAgICAgICAvKiBudW1CYW5kcz01ICovCisgICAgICAgIHtDSEMoMHg2NmM4NWE1MiksIENIQygweDQyNzhlNTg3KSwgQ0hDKDB4Njk3ZGNhZmYpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDY2YTYxNzg5KSwgQ0hDKDB4NTI1M2I4ZTMpLCBDSEMoMHg1YWRkYWQ4MSl9LAorICAgICAgICB7MywgNCwgMX0sCisgICAgICAgIHtDSEMoMHg3NTI1ZWU5MCksIENIQygweDZlMmExMjEwKSwgQ0hDKDB4NjUyM2JiNDApLCBDSEMoMHg1OTgyMmVhZCl9LAorICAgICAgICB7LTYsIC00LCAtMiwgMH0sCisgICAgICAgIHtDSEMoMHg2MDllNGNhZCksIENIQygweDU5YzdlMzEyKSwgQ0hDKDB4NjgxZWVjYWMpLCBDSEMoMHg0NDBlYTg5MyksCisgICAgICAgICBDSEMoMHg0YTIxNGJiMyksIENIQygweDUzYzM0NWExKX0sCisgICAgICAgIHsxLCAwLCAtMSwgLTEsIC0zLCAtNX0sCisgICAgICAgIHtDSEMoMHg3NTI1ZWU5MCksIENIQygweDU4NTg3OTM2KSwgQ0hDKDB4NDEwZDBiMzgpLCBDSEMoMHg3ZjE1MTlkNil9LAorICAgICAgICB7LTYsIC0xLCAyLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9NiAqLworICAgICAgICB7Q0hDKDB4Njg5NDMyODUpLCBDSEMoMHg0ODQxZDJjMyksIENIQygweDZhNjIxNGM3KX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg2M2M1OTIzZSksIENIQygweDRlOTA2ZTE4KSwgQ0hDKDB4NjI4NWFmOGEpfSwKKyAgICAgICAgezMsIDQsIDF9LAorICAgICAgICB7Q0hDKDB4NzI2Mzk0MGIpLCBDSEMoMHg0MjRhNjlhNSksIENIQygweDRhZTgzODNhKSwgQ0hDKDB4NTE3Yjc3MzApfSwKKyAgICAgICAgey03LCAtNCwgLTIsIDB9LAorICAgICAgICB7Q0hDKDB4NTE4YWVlNWYpLCBDSEMoMHg0ODIzYTA5NiksIENIQygweDQzNzY0YTM5KSwgQ0hDKDB4NmU2ZmFmMjMpLAorICAgICAgICAgQ0hDKDB4NjFiYmE0NGYpLCBDSEMoMHg1OWQ4YjEzMil9LAorICAgICAgICB7MSwgMCwgLTEsIC0yLCAtNCwgLTZ9LAorICAgICAgICB7Q0hDKDB4NzI2Mzk0MGIpLCBDSEMoMHg2NzU3YmZmMiksIENIQygweDViZjQwZmUwKSwgQ0hDKDB4N2Q2ZjQyOTIpfSwKKyAgICAgICAgey03LCAtMiwgMSwgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTcgKi8KKyAgICAgICAge0NIQygweDY5OWI0YzNjKSwgQ0hDKDB4NGI4YjcwMmYpLCBDSEMoMHg2YWU1MWE0Zil9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NjIzYTdmNDkpLCBDSEMoMHg0Y2NjOTFmYyksIENIQygweDY4ZjA0OGRkKX0sCisgICAgICAgIHszLCA0LCAxfSwKKyAgICAgICAge0NIQygweDdlNmViZTE4KSwgQ0hDKDB4NTcwMWRhZjIpLCBDSEMoMHg3NGE4MTk4YiksIENIQygweDRiMzk5YWExKX0sCisgICAgICAgIHstOCwgLTUsIC0zLCAwfSwKKyAgICAgICAge0NIQygweDQ2NGE2NGE2KSwgQ0hDKDB4NzhlNDI2MzMpLCBDSEMoMHg1ZWUxNzRiYSksIENIQygweDVkMDAwOGM4KSwKKyAgICAgICAgIENIQygweDQ1NWNmZjBmKSwgQ0hDKDB4NmI5MTAwZTcpfSwKKyAgICAgICAgezEsIC0xLCAtMiwgLTIsIC00LCAtN30sCisgICAgICAgIHtDSEMoMHg3ZTZlYmUxOCksIENIQygweDQyYzUyZWZlKSwgQ0hDKDB4NDVmZTQwMWYpLCBDSEMoMHg3YjU4MDhlZil9LAorICAgICAgICB7LTgsIC0yLCAxLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9OCAqLworICAgICAgICB7Q0hDKDB4NmEzZmQ5YjQpLCBDSEMoMHg0ZDk5ODIzZiksIENIQygweDZiMzcyYTk0KX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg2MTRjNmVmNyksIENIQygweDRiZDA2Njk5KSwgQ0hDKDB4NmU1OWNmY2EpfSwKKyAgICAgICAgezMsIDQsIDF9LAorICAgICAgICB7Q0hDKDB4NGMzODljYzUpLCBDSEMoMHg3OTY4NjY4MSksIENIQygweDVlMjU0NGMyKSwgQ0hDKDB4NDYzMDViNDMpfSwKKyAgICAgICAgey04LCAtNiwgLTMsIDB9LAorICAgICAgICB7Q0hDKDB4N2I0Y2E3YzYpLCBDSEMoMHg2ODI3MGFjNSksIENIQygweDQ2N2M2NDRjKSwgQ0hDKDB4NTA1YzFiMGYpLAorICAgICAgICAgQ0hDKDB4NjdhMTQ3NzgpLCBDSEMoMHg0NTgwMTc2Nyl9LAorICAgICAgICB7MCwgLTEsIC0yLCAtMiwgLTUsIC03fSwKKyAgICAgICAge0NIQygweDRjMzg5Y2M1KSwgQ0hDKDB4NWM0OTljZWIpLCBDSEMoMHg2Zjg2M2M5ZiksIENIQygweDc5MDU5YmZjKX0sCisgICAgICAgIHstOCwgLTMsIDAsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz05ICovCisgICAgICAgIHtDSEMoMHg2YWFkOTk4OCksIENIQygweDRlZjhhYzE4KSwgQ0hDKDB4NmI2ZGYxMTYpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDYwYjE1OWIwKSwgQ0hDKDB4NGIzM2Y3NzIpLCBDSEMoMHg3MmY1NTczZCl9LAorICAgICAgICB7MywgNCwgMX0sCisgICAgICAgIHtDSEMoMHg2MjA2Y2IxOCksIENIQygweDU4YTdkOGRjKSwgQ0hDKDB4NGUwYjJkMGIpLCBDSEMoMHg0MjA3YWQ4NCl9LAorICAgICAgICB7LTksIC02LCAtMywgMH0sCisgICAgICAgIHtDSEMoMHg2ZGFkYWRhZSksIENIQygweDViOGIyY2ZjKSwgQ0hDKDB4NmNmNjFkYjIpLCBDSEMoMHg0NmMzYzkwYiksCisgICAgICAgICBDSEMoMHg1MDYzMTRlYSksIENIQygweDVmMDM0YWNkKX0sCisgICAgICAgIHswLCAtMSwgLTMsIC0yLCAtNSwgLTh9LAorICAgICAgICB7Q0hDKDB4NjIwNmNiMTgpLCBDSEMoMHg0MmY4YjhkZSksIENIQygweDViYjQ3NzZmKSwgQ0hDKDB4NzY5YWNjNzkpfSwKKyAgICAgICAgey05LCAtMywgMCwgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTEwICovCisgICAgICAgIHtDSEMoMHg2YWZhNzI1MiksIENIQygweDRmZWVkM2VkKSwgQ0hDKDB4NmI5NDUwNGQpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDYwNDY3ODk5KSwgQ0hDKDB4NGFjYmFmYmEpLCBDSEMoMHg3NmViMzI3Zil9LAorICAgICAgICB7MywgNCwgMX0sCisgICAgICAgIHtDSEMoMHg0MjQxNWIxNSksIENIQygweDQzMTA4MGRhKSwgQ0hDKDB4NDIwZjFjMzIpLCBDSEMoMHg3ZDBjMWFlYil9LAorICAgICAgICB7LTksIC02LCAtMywgLTF9LAorICAgICAgICB7Q0hDKDB4NjJiMmM3YTQpLCBDSEMoMHg1MWIwNDBhNiksIENIQygweDU2Y2FkZGI0KSwgQ0hDKDB4N2U3NGEyYzgpLAorICAgICAgICAgQ0hDKDB4NDAzMGFkZjUpLCBDSEMoMHg0M2QxZGM0Zil9LAorICAgICAgICB7MCwgLTEsIC0zLCAtMywgLTUsIC04fSwKKyAgICAgICAge0NIQygweDQyNDE1YjE1KSwgQ0hDKDB4NjRlMjk5YjMpLCBDSEMoMHg0ZDMzYjVlOCksIENIQygweDc0MmNlZTVmKX0sCisgICAgICAgIHstOSwgLTQsIDAsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0xMSAqLworICAgICAgICB7Q0hDKDB4NmIzMjU4YmIpLCBDSEMoMHg1MGEyMTIzMyksIENIQygweDZiYjAzYzE5KX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZmY5OTdjNiksIENIQygweDRhODI3MDZlKSwgQ0hDKDB4N2E1YWFlMzYpfSwKKyAgICAgICAgezMsIDQsIDF9LAorICAgICAgICB7Q0hDKDB4NWQyZmI0ZmIpLCBDSEMoMHg2ODViZGRkOCksIENIQygweDcxYjVlOTgzKSwgQ0hDKDB4NzcwOGM5MGIpfSwKKyAgICAgICAgey0xMCwgLTcsIC00LCAtMX0sCisgICAgICAgIHtDSEMoMHg1OWFjZWVhMiksIENIQygweDQ5YzQyOGEwKSwgQ0hDKDB4NDZjYTU1MjcpLCBDSEMoMHg3MjRiZTg4NCksCisgICAgICAgICBDSEMoMHg2OGU1ODZkYSksIENIQygweDY0MzQ4NWI2KX0sCisgICAgICAgIHswLCAtMSwgLTMsIC0zLCAtNiwgLTl9LAorICAgICAgICB7Q0hDKDB4NWQyZmI0ZmIpLCBDSEMoMHg0ZTNmYWQxYSksIENIQygweDQyMzEwYmEyKSwgQ0hDKDB4NzFjOGIzY2UpfSwKKyAgICAgICAgey0xMCwgLTQsIDAsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0xMiAqLworICAgICAgICB7Q0hDKDB4NmI1YzQ3MjYpLCBDSEMoMHg1MTI4YTRhOCksIENIQygweDZiYzUyZWUxKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZmMwNjYxOCksIENIQygweDRhNGNlNTU5KSwgQ0hDKDB4N2Q1YzE2ZTkpfSwKKyAgICAgICAgezMsIDQsIDF9LAorICAgICAgICB7Q0hDKDB4NDNhZjgzNDIpLCBDSEMoMHg1MzE1MzNkMyksIENIQygweDYzMzY2MGE2KSwgQ0hDKDB4NzFjZTYwNTIpfSwKKyAgICAgICAgey0xMCwgLTcsIC00LCAtMX0sCisgICAgICAgIHtDSEMoMHg1MjIzNzNkNyksIENIQygweDQzNDE1MGNiKSwgQ0hDKDB4NzViNThhZmMpLCBDSEMoMHg2ODQ3NGYyZCksCisgICAgICAgICBDSEMoMHg1NzUzNDhhNSksIENIQygweDRjMjA5NzNmKX0sCisgICAgICAgIHswLCAtMSwgLTQsIC0zLCAtNiwgLTl9LAorICAgICAgICB7Q0hDKDB4NDNhZjgzNDIpLCBDSEMoMHg3YzRkM2QxMSksIENIQygweDczMmUxM2RiKSwgQ0hDKDB4NmY3NTZhYzQpfSwKKyAgICAgICAgey0xMCwgLTUsIC0xLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MTMgKi8KKyAgICAgICAge0NIQygweDZiN2M4OTUzKSwgQ0hDKDB4NTE5MDNmY2QpLCBDSEMoMHg2YmQ1NGQyZSl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWY5NGFiZjApLCBDSEMoMHg0YTI0ODBmYSksIENIQygweDQwMDEzNTUzKX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDY1MDEyMzZlKSwgQ0hDKDB4NDM2YjljNGUpLCBDSEMoMHg1NzhkNzg4MSksIENIQygweDZkMzRmOTJlKX0sCisgICAgICAgIHstMTEsIC03LCAtNCwgLTF9LAorICAgICAgICB7Q0hDKDB4NGJjMGUyYjIpLCBDSEMoMHg3YjlkMTJhYyksIENIQygweDYzNmMxYzFiKSwgQ0hDKDB4NWZlMTVjMmIpLAorICAgICAgICAgQ0hDKDB4NDlkNTQ4NzkpLCBDSEMoMHg3NjYyY2ZhNSl9LAorICAgICAgICB7MCwgLTIsIC00LCAtMywgLTYsIC0xMH0sCisgICAgICAgIHtDSEMoMHg2NTAxMjM2ZSksIENIQygweDY0YjA1OWZlKSwgQ0hDKDB4NjU2ZDgzNTkpLCBDSEMoMHg2ZDM3MDkwMCl9LAorICAgICAgICB7LTExLCAtNSwgLTEsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0xNCAqLworICAgICAgICB7Q0hDKDB4NmI5NWUyNzYpLCBDSEMoMHg1MWUxYjYzNyksIENIQygweDZiZTFmN2VkKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZjcyN2ExYyksIENIQygweDRhMDUzZTljKSwgQ0hDKDB4NDEyZTUyOGMpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NGQxNzhiZDQpLCBDSEMoMHg2ZjMzYjRlOCksIENIQygweDRlMDI4ZjdmKSwgQ0hDKDB4NjkxZWUxMDQpfSwKKyAgICAgICAgey0xMSwgLTgsIC00LCAtMX0sCisgICAgICAgIHtDSEMoMHg0NjQ3M2QzZiksIENIQygweDcyNWJkMGE2KSwgQ0hDKDB4NTUxOTk4ODUpLCBDSEMoMHg1OGJjYzU2YiksCisgICAgICAgICBDSEMoMHg3ZTdlNjI4OCksIENIQygweDVkZGVmNmViKX0sCisgICAgICAgIHswLCAtMiwgLTQsIC0zLCAtNywgLTEwfSwKKyAgICAgICAge0NIQygweDRkMTc4YmQ0KSwgQ0hDKDB4NTJlYmQ0NjcpLCBDSEMoMHg1YTM5NWE2ZSksIENIQygweDZiMGY3MjRmKX0sCisgICAgICAgIHstMTEsIC01LCAtMSwgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTE1ICovCisgICAgICAgIHtDSEMoMHg2YmFhMmEyMiksIENIQygweDUyMjJlYjkxKSwgQ0hDKDB4NmJlYzFhODYpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDVmNTczOTNiKSwgQ0hDKDB4NDllYzg5MzQpLCBDSEMoMHg0MjNiNWI1OCl9LAorICAgICAgICB7MywgNCwgMn0sCisgICAgICAgIHtDSEMoMHg3N2ZkMjQ4NiksIENIQygweDVjZmJkZjJjKSwgQ0hDKDB4NDYxNTNiZDEpLCBDSEMoMHg2NTc1N2VkOSl9LAorICAgICAgICB7LTEyLCAtOCwgLTQsIC0xfSwKKyAgICAgICAge0NIQygweDQxODg4ZWU2KSwgQ0hDKDB4NmE2NjFkYjMpLCBDSEMoMHg0OWFiYzhjOCksIENIQygweDUyOTY1ODQ4KSwKKyAgICAgICAgIENIQygweDZkOTMwMWI3KSwgQ0hDKDB4NGJiMDQ3MjEpfSwKKyAgICAgICAgezAsIC0yLCAtNCwgLTMsIC03LCAtMTB9LAorICAgICAgICB7Q0hDKDB4NzdmZDI0ODYpLCBDSEMoMHg0NTQyNGM2OCksIENIQygweDUwZjMzY2M2KSwgQ0hDKDB4NjhmZjQzZjApfSwKKyAgICAgICAgey0xMiwgLTUsIC0xLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MTYgKi8KKyAgICAgICAge0NIQygweDZiYmFhNDk5KSwgQ0hDKDB4NTI1N2VkOTQpLCBDSEMoMHg2YmY0NTZlNCl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWY0MTI1OTQpLCBDSEMoMHg0OWQ4YTc2NiksIENIQygweDQzMmQxZGJkKX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDVlZjVjZmRlKSwgQ0hDKDB4NGVhZmNkMmQpLCBDSEMoMHg3ZWQzNjg5MyksIENIQygweDYyMjc0YjQ1KX0sCisgICAgICAgIHstMTIsIC04LCAtNSwgLTF9LAorICAgICAgICB7Q0hDKDB4N2FjNDM4ZjUpLCBDSEMoMHg2MzdhYWIyMSksIENIQygweDQwNjc2MTdhKSwgQ0hDKDB4NGQzYzZlYzcpLAorICAgICAgICAgQ0hDKDB4NWZkNmUwZGQpLCBDSEMoMHg3YmQ1ZjAyNCl9LAorICAgICAgICB7LTEsIC0yLCAtNCwgLTMsIC03LCAtMTF9LAorICAgICAgICB7Q0hDKDB4NWVmNWNmZGUpLCBDSEMoMHg3NTFkMGQ0ZiksIENIQygweDQ5MmIzYzQxKSwgQ0hDKDB4NjcwNjU0MDkpfSwKKyAgICAgICAgey0xMiwgLTYsIC0xLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MTcgKi8KKyAgICAgICAge0NIQygweDZiYzgzNmM5KSwgQ0hDKDB4NTI4Mzk5N2UpLCBDSEMoMHg2YmZiMWY1ZSl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWYyZjAyYjYpLCBDSEMoMHg0OWM4NjhlOSksIENIQygweDQ0MDc4MTUxKX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDRjNDNiNjVhKSwgQ0hDKDB4NDM0OWRjZjYpLCBDSEMoMHg3Mzc5OWUyZCksIENIQygweDVmMjY3Mjc0KX0sCisgICAgICAgIHstMTIsIC04LCAtNSwgLTF9LAorICAgICAgICB7Q0hDKDB4NzM3MjYzOTQpLCBDSEMoMHg1ZDY4NTExYSksIENIQygweDcxOTFiYmNjKSwgQ0hDKDB4NDg4OThjNzApLAorICAgICAgICAgQ0hDKDB4NTQ4OTU2ZTEpLCBDSEMoMHg2Njk4MWNlOCl9LAorICAgICAgICB7LTEsIC0yLCAtNSwgLTMsIC03LCAtMTF9LAorICAgICAgICB7Q0hDKDB4NGM0M2I2NWEpLCBDSEMoMHg2NDEzMTExNiksIENIQygweDQyOTAyOGUyKSwgQ0hDKDB4NjUyNDAyMTEpfSwKKyAgICAgICAgey0xMiwgLTYsIC0xLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MTggKi8KKyAgICAgICAge0NIQygweDZiZDM4NjBkKSwgQ0hDKDB4NTJhODAxNTYpLCBDSEMoMHg2YzAwYzY4ZCl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWYxZmVkODYpLCBDSEMoMHg0OWJhZjYzNiksIENIQygweDQ0Y2RiOWRjKX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDdjMTg5Mzg5KSwgQ0hDKDB4NzQyNjY2ZDgpLCBDSEMoMHg2OWI4Yzc3NiksIENIQygweDVjNjdlMjdkKX0sCisgICAgICAgIHstMTMsIC05LCAtNSwgLTF9LAorICAgICAgICB7Q0hDKDB4NmNmMWVhNzYpLCBDSEMoMHg1ODA5NTcwMyksIENIQygweDY0ZTM1MWE5KSwgQ0hDKDB4NDQ2MGRhOTApLAorICAgICAgICAgQ0hDKDB4NGIxZjgwODMpLCBDSEMoMHg1NWYyZDNlMSl9LAorICAgICAgICB7LTEsIC0yLCAtNSwgLTMsIC03LCAtMTF9LAorICAgICAgICB7Q0hDKDB4N2MxODkzODkpLCBDSEMoMHg1NjUxNzkyYSksIENIQygweDc5Y2I5YjNkKSwgQ0hDKDB4NjM1NzY5YzApfSwKKyAgICAgICAgey0xMywgLTYsIC0yLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MTkgKi8KKyAgICAgICAge0NIQygweDZiZGQwYzQwKSwgQ0hDKDB4NTJjNmFiZjYpLCBDSEMoMHg2YzA1ODk1MCl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWYxMzNmODgpLCBDSEMoMHg0OWFmYjMwNSksIENIQygweDQ1ODI2ZDczKX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDY2MjFhMTY0KSwgQ0hDKDB4NjUxMjUyOGUpLCBDSEMoMHg2MTQ0OWZjOCksIENIQygweDU5ZTJhMGMwKX0sCisgICAgICAgIHstMTMsIC05LCAtNSwgLTF9LAorICAgICAgICB7Q0hDKDB4NjcyMWNhZGIpLCBDSEMoMHg1MzQwNGNkNCksIENIQygweDVhMzg5ZTkxKSwgQ0hDKDB4NDBhYmNiZDIpLAorICAgICAgICAgQ0hDKDB4NDMzMzJmMDEpLCBDSEMoMHg0OGI4MmU0Nil9LAorICAgICAgICB7LTEsIC0yLCAtNSwgLTMsIC03LCAtMTF9LAorICAgICAgICB7Q0hDKDB4NjYyMWExNjQpLCBDSEMoMHg0YjEyY2MyOCksIENIQygweDZmZmQ0ZGY4KSwgQ0hDKDB4NjE5ZjgzNWUpfSwKKyAgICAgICAgey0xMywgLTYsIC0yLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MjAgKi8KKyAgICAgICAge0NIQygweDZiZTUyNGM1KSwgQ0hDKDB4NTJlMGJlYjMpLCBDSEMoMHg2YzA5OTU1Mil9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWYwODdjNjgpLCBDSEMoMHg0OWE2MmJiNSksIENIQygweDQ2MjdkMTc1KX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDU0ZWM2YWZlKSwgQ0hDKDB4NTg5OTFhNDIpLCBDSEMoMHg1OWUyM2U4YyksIENIQygweDU3OGY0ZWY0KX0sCisgICAgICAgIHstMTMsIC05LCAtNSwgLTF9LAorICAgICAgICB7Q0hDKDB4NjFlNzhmNmYpLCBDSEMoMHg0ZWY1ZTFlOSksIENIQygweDUxMjljM2I4KSwgQ0hDKDB4N2FiMGY3YjIpLAorICAgICAgICAgQ0hDKDB4NzhlZmIwNzYpLCBDSEMoMHg3YzI1NjdlYSl9LAorICAgICAgICB7LTEsIC0yLCAtNSwgLTQsIC04LCAtMTJ9LAorICAgICAgICB7Q0hDKDB4NTRlYzZhZmUpLCBDSEMoMHg0MWM3ODEyYyksIENIQygweDY3NmY2ZjhkKSwgQ0hDKDB4NWZmYjM4M2YpfSwKKyAgICAgICAgey0xMywgLTYsIC0yLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MjEgKi8KKyAgICAgICAge0NIQygweDZiZWMxNTQyKSwgQ0hDKDB4NTJmNzE5MjkpLCBDSEMoMHg2YzBkMGQ1ZSl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWVmZjQ1YzUpLCBDSEMoMHg0OTllMDkyZCksIENIQygweDQ2YmZjMGM5KX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDQ3NDU3YTc4KSwgQ0hDKDB4NGUyZDk5YjMpLCBDSEMoMHg1MzYzN2VhNSksIENIQygweDU1NjdkMGU5KX0sCisgICAgICAgIHstMTMsIC05LCAtNSwgLTF9LAorICAgICAgICB7Q0hDKDB4NWQyZGM2MWIpLCBDSEMoMHg0YjE3NjBjOCksIENIQygweDQ5NjdjZjM5KSwgQ0hDKDB4NzRiMTEzZDgpLAorICAgICAgICAgQ0hDKDB4NmQ2Njc2YjYpLCBDSEMoMHg2YWQxMTRlOSl9LAorICAgICAgICB7LTEsIC0yLCAtNSwgLTQsIC04LCAtMTJ9LAorICAgICAgICB7Q0hDKDB4NDc0NTdhNzgpLCBDSEMoMHg3NDBhY2NhYSksIENIQygweDVmZWI2NjA5KSwgQ0hDKDB4NWU2OTZmOTUpfSwKKyAgICAgICAgey0xMywgLTcsIC0yLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MjIgKi8KKyAgICAgICAge0NIQygweDZiZjIxMzg3KSwgQ0hDKDB4NTMwYTY4M2MpLCBDSEMoMHg2YzEwMGM1OSl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWVmNzUyZWEpLCBDSEMoMHg0OTk3MDhjNiksIENIQygweDQ3NGJjZDFiKX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDc4YTIxYWI3KSwgQ0hDKDB4NDU2NThhZWMpLCBDSEMoMHg0ZGEzYzRmZSksIENIQygweDUzNjcwOTRiKX0sCisgICAgICAgIHstMTQsIC05LCAtNSwgLTF9LAorICAgICAgICB7Q0hDKDB4NThlMmRmNmEpLCBDSEMoMHg0Nzk1OTkwZSksIENIQygweDQyYjVlMGY3KSwgQ0hDKDB4NmY0MDhjNjQpLAorICAgICAgICAgQ0hDKDB4NjM3MGJlYmYpLCBDSEMoMHg1YzkxY2E4NSl9LAorICAgICAgICB7LTEsIC0yLCAtNSwgLTQsIC04LCAtMTJ9LAorICAgICAgICB7Q0hDKDB4NzhhMjFhYjcpLCBDSEMoMHg2NmY5NTFkNiksIENIQygweDU5NDYwNWJiKSwgQ0hDKDB4NWNlOTE2NTcpfSwKKyAgICAgICAgey0xNCwgLTcsIC0yLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MjMgKi8KKyAgICAgICAge0NIQygweDZiZjc0OWIyKSwgQ0hDKDB4NTMxYjMzNDgpLCBDSEMoMHg2YzEyYTc1MCl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWVmMDZiMTcpLCBDSEMoMHg0OTkwZjZjOSksIENIQygweDQ3Y2Q0YzViKX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDY2ZGVkZTM2KSwgQ0hDKDB4N2JkZjkwYTkpLCBDSEMoMHg0ODg1YjJiOSksIENIQygweDUxODhhNmI3KX0sCisgICAgICAgIHstMTQsIC0xMCwgLTUsIC0xfSwKKyAgICAgICAge0NIQygweDU0Zjg1ODEyKSwgQ0hDKDB4NDQ2NDE0YWUpLCBDSEMoMHg3OWM4ZDUxOSksIENIQygweDZhNGMyZjMxKSwKKyAgICAgICAgIENIQygweDVhYzgzMjVmKSwgQ0hDKDB4NTBiZjkyMDApfSwKKyAgICAgICAgey0xLCAtMiwgLTYsIC00LCAtOCwgLTEyfSwKKyAgICAgICAge0NIQygweDY2ZGVkZTM2KSwgQ0hDKDB4NWJlMGQ5MGUpLCBDSEMoMHg1MzVjYzQ1MyksIENIQygweDViNzkyM2YwKX0sCisgICAgICAgIHstMTQsIC03LCAtMiwgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTI0ICovCisgICAgICAgIHtDSEMoMHg2YmZiZDkxZCksIENIQygweDUzMjllNTgwKSwgQ0hDKDB4NmMxNGVlZWQpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDVlZWE2MTc5KSwgQ0hDKDB4NDk4YmFhOTApLCBDSEMoMHg0ODQ1NjM1ZCl9LAorICAgICAgICB7MywgNCwgMn0sCisgICAgICAgIHtDSEMoMHg1ODU1OWI3ZSksIENIQygweDZmMWIyMzFmKSwgQ0hDKDB4NDNmMTc4OWIpLCBDSEMoMHg0ZmM4ZmNiOCl9LAorICAgICAgICB7LTE0LCAtMTAsIC01LCAtMX0sCisgICAgICAgIHtDSEMoMHg1MTYyMTc3NSksIENIQygweDQxNzg4MWEzKSwgQ0hDKDB4NmY5YmE5YjYpLCBDSEMoMHg2NWM0MTJiMiksCisgICAgICAgICBDSEMoMHg1MzM1MmM2MSksIENIQygweDQ2ZGI5Y2FmKX0sCisgICAgICAgIHstMSwgLTIsIC02LCAtNCwgLTgsIC0xMn0sCisgICAgICAgIHtDSEMoMHg1ODU1OWI3ZSksIENIQygweDUyNjM2MDAzKSwgQ0hDKDB4NGUxM2IzMTYpLCBDSEMoMHg1YTE4OWNkZil9LAorICAgICAgICB7LTE0LCAtNywgLTIsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0yNSAqLworICAgICAgICB7Q0hDKDB4NmJmZmRjNzMpLCBDSEMoMHg1MzM2ZDRhZiksIENIQygweDZjMTZmMDg0KX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZWU1MTI0OSksIENIQygweDQ5ODcwM2NjKSwgQ0hDKDB4NDhiNTBlNGYpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NGM1NjE2Y2YpLCBDSEMoMHg2NDFiOWZhZCksIENIQygweDdmYTczNWUwKSwgQ0hDKDB4NGUyNGU1N2EpfSwKKyAgICAgICAgey0xNCwgLTEwLCAtNiwgLTF9LAorICAgICAgICB7Q0hDKDB4NGUxNWY0N2EpLCBDSEMoMHg3ZDk0ODFkNiksIENIQygweDY2YTgyZjhhKSwgQ0hDKDB4NjE5YWU5NzEpLAorICAgICAgICAgQ0hDKDB4NGM4YjJmNWYpLCBDSEMoMHg3ZDA5ZWMxMSl9LAorICAgICAgICB7LTEsIC0zLCAtNiwgLTQsIC04LCAtMTN9LAorICAgICAgICB7Q0hDKDB4NGM1NjE2Y2YpLCBDSEMoMHg0YTM3NzBmYiksIENIQygweDQ5NTQwMmRlKSwgQ0hDKDB4NThjNjkzZmEpfSwKKyAgICAgICAgey0xNCwgLTcsIC0yLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MjYgKi8KKyAgICAgICAge0NIQygweDZjMDM2OTQzKSwgQ0hDKDB4NTM0MjQ2MjUpLCBDSEMoMHg2YzE4YjZkYyl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWVlMDYwYWEpLCBDSEMoMHg0OTgyZTg4YSksIENIQygweDQ5MWQyNzdmKX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDQyNWFkYTViKSwgQ0hDKDB4NWE5MzY4YWMpLCBDSEMoMHg3ODM4MGE0MiksIENIQygweDRjOTlhYTA1KX0sCisgICAgICAgIHstMTQsIC0xMCwgLTYsIC0xfSwKKyAgICAgICAge0NIQygweDRiMGI1NjljKSwgQ0hDKDB4NzhhNDIwZGEpLCBDSEMoMHg1ZWJkZjIwMyksIENIQygweDVkYzU3ZTYzKSwKKyAgICAgICAgIENIQygweDQ2YTY1MGZmKSwgQ0hDKDB4NmVlMTNmYjgpfSwKKyAgICAgICAgey0xLCAtMywgLTYsIC00LCAtOCwgLTEzfSwKKyAgICAgICAge0NIQygweDQyNWFkYTViKSwgQ0hDKDB4NDMyMzA3M2MpLCBDSEMoMHg0NTBhZTkyYiksIENIQygweDU3ODIyYWQ1KX0sCisgICAgICAgIHstMTQsIC03LCAtMiwgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTI3ICovCisgICAgICAgIHtDSEMoMHg2YzA2OTExYSksIENIQygweDUzNGM3MjYxKSwgQ0hDKDB4NmMxYTRhYmEpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDVlZGMzNTI0KSwgQ0hDKDB4NDk3ZjQzYzApLCBDSEMoMHg0OTdlNmNkOCl9LAorICAgICAgICB7MywgNCwgMn0sCisgICAgICAgIHtDSEMoMHg3M2ZiNTUwZSksIENIQygweDUyNDQ4OTRmKSwgQ0hDKDB4NzE3YWFkNzgpLCBDSEMoMHg0YjI0ZWY2Yyl9LAorICAgICAgICB7LTE1LCAtMTAsIC02LCAtMX0sCisgICAgICAgIHtDSEMoMHg0ODNhZWJlNCksIENIQygweDc0MTM5MTE2KSwgQ0hDKDB4NTdiNTgwMzcpLCBDSEMoMHg1YTNhNGYzYyksCisgICAgICAgICBDSEMoMHg0MTY5NTBmZSksIENIQygweDYyYzdmNGYyKX0sCisgICAgICAgIHstMSwgLTMsIC02LCAtNCwgLTgsIC0xM30sCisgICAgICAgIHtDSEMoMHg3M2ZiNTUwZSksIENIQygweDc5ZWZiOTk0KSwgQ0hDKDB4NDEyOGNhYjcpLCBDSEMoMHg1NjRhOTE5YSl9LAorICAgICAgICB7LTE1LCAtOCwgLTIsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0yOCAqLworICAgICAgICB7Q0hDKDB4NmMwOTYyNjQpLCBDSEMoMHg1MzU1ODdjZCksIENIQygweDZjMWJiMzU1KX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZWQ4N2M3NiksIENIQygweDQ5N2MwNDM5KSwgQ0hDKDB4NDlkOTg0NTIpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NjVkZWM1YmYpLCBDSEMoMHg0YWZkMWJhMyksIENIQygweDZiNThiNGIzKSwgQ0hDKDB4NDljNGE3YjApfSwKKyAgICAgICAgey0xNSwgLTEwLCAtNiwgLTF9LAorICAgICAgICB7Q0hDKDB4NDU5ZTZlYjEpLCBDSEMoMHg2ZmQ4NTBiNyksIENIQygweDUxNmU3YmU5KSwgQ0hDKDB4NTZmMTNkMDUpLAorICAgICAgICAgQ0hDKDB4Nzk3ODU1OTQpLCBDSEMoMHg1ODYxN2RlNyl9LAorICAgICAgICB7LTEsIC0zLCAtNiwgLTQsIC05LCAtMTN9LAorICAgICAgICB7Q0hDKDB4NjVkZWM1YmYpLCBDSEMoMHg2ZjIxNjhhYSksIENIQygweDdiNDEzMTBmKSwgQ0hDKDB4NTUxZjA2OTIpfSwKKyAgICAgICAgey0xNSwgLTgsIC0zLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MjkgKi8KKyAgICAgICAge0NIQygweDZjMGJlOTEzKSwgQ0hDKDB4NTM1ZGFjZDUpLCBDSEMoMHg2YzFjZjZhMyl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWVkNTI2YjQpLCBDSEMoMHg0OTc5MWJjNSksIENIQygweDRhMmVmZjk5KX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDU5ZTQ0YWZlKSwgQ0hDKDB4NDQ5NDlhZGEpLCBDSEMoMHg2NWJmMzZmNSksIENIQygweDQ4NzcwNWEwKX0sCisgICAgICAgIHstMTUsIC0xMCwgLTYsIC0xfSwKKyAgICAgICAge0NIQygweDQzMzA3Nzc5KSwgQ0hDKDB4NmJlOTU5YzQpLCBDSEMoMHg0YmNlMjEyMiksIENIQygweDUzZTM0ZDg5KSwKKyAgICAgICAgIENIQygweDcxMTVmZjgyKSwgQ0hDKDB4NGY2NDIxYTEpfSwKKyAgICAgICAgey0xLCAtMywgLTYsIC00LCAtOSwgLTEzfSwKKyAgICAgICAge0NIQygweDU5ZTQ0YWZlKSwgQ0hDKDB4NjU5ZWFiN2QpLCBDSEMoMHg3NGNlYTQ1OSksIENIQygweDUzZmVkNTc0KX0sCisgICAgICAgIHstMTUsIC04LCAtMywgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTMwICovCisgICAgICAgIHtDSEMoMHg2YzBlMmYxNyksIENIQygweDUzNjUwMTgxKSwgQ0hDKDB4NmMxZTE5OWQpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDVlZDIyNjlmKSwgQ0hDKDB4NDk3NjdlOWUpLCBDSEMoMHg0YTdmNWYwYil9LAorICAgICAgICB7MywgNCwgMn0sCisgICAgICAgIHtDSEMoMHg0ZmFhNGFlNiksIENIQygweDdkZDNiZjExKSwgQ0hDKDB4NjA5ZTI3MzIpLCBDSEMoMHg0NzNhNzJlOSl9LAorICAgICAgICB7LTE1LCAtMTEsIC02LCAtMX0sCisgICAgICAgIHtDSEMoMHg0MGVjNTdjNiksIENIQygweDY4M2VlMTQ3KSwgQ0hDKDB4NDZiZTI2MWQpLCBDSEMoMHg1MTBhNzk4MyksCisgICAgICAgICBDSEMoMHg2OThhODRjYiksIENIQygweDQ3OTRhOTI3KX0sCisgICAgICAgIHstMSwgLTMsIC02LCAtNCwgLTksIC0xM30sCisgICAgICAgIHtDSEMoMHg0ZmFhNGFlNiksIENIQygweDVkMzYxNWFkKSwgQ0hDKDB4NmVlNzQ3NzMpLCBDSEMoMHg1MmU5NTZhMSl9LAorICAgICAgICB7LTE1LCAtOCwgLTMsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0zMSAqLworICAgICAgICB7Q0hDKDB4NmMxMDNjYzkpLCBDSEMoMHg1MzZiYTBhYyksIENIQygweDZjMWYyMDcwKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZWNmNzExZSksIENIQygweDQ5NzQyMmVhKSwgQ0hDKDB4NGFjYjE0MzgpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NDZlMzIyYWQpLCBDSEMoMHg3M2MzMmYzYyksIENIQygweDViZTdkMTcyKSwgQ0hDKDB4NDYwZDg4MDApfSwKKyAgICAgICAgey0xNSwgLTExLCAtNiwgLTF9LAorICAgICAgICB7Q0hDKDB4N2Q5YmY4YWQpLCBDSEMoMHg2NGQyMjM1MSksIENIQygweDQyMmJkYzgxKSwgQ0hDKDB4NGU2MTg0YWEpLAorICAgICAgICAgQ0hDKDB4NjJiYTIzNzUpLCBDSEMoMHg0MGMzMjVkZSl9LAorICAgICAgICB7LTIsIC0zLCAtNiwgLTQsIC05LCAtMTN9LAorICAgICAgICB7Q0hDKDB4NDZlMzIyYWQpLCBDSEMoMHg1NWJlZjJhMyksIENIQygweDY5N2IzMTM1KSwgQ0hDKDB4NTFkZGVlNGQpfSwKKyAgICAgICAgey0xNSwgLTgsIC0zLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLy8gbnVtQmFuZHM9MzIKKyAgICAgICAge0NIQygweDZjMTIxOTMzKSwgQ0hDKDB4NTM3MWExMDQpLCBDSEMoMHg2YzIwMGVhMCl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWVjY2ZjZDMpLCBDSEMoMHg0OTcyMDA2MCksIENIQygweDRiMTI4M2YwKX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDdlYTEyYTUyKSwgQ0hDKDB4NmFjYTMzMDMpLCBDSEMoMHg1NzkwNzJiZiksIENIQygweDQ0ZWYwNTZlKX0sCisgICAgICAgIHstMTYsIC0xMSwgLTYsIC0xfSwKKyAgICAgICAge0NIQygweDc5YTNhOWFiKSwgQ0hDKDB4NjE5ZDM4ZmMpLCBDSEMoMHg3YzBmMDczNCksIENIQygweDRiZTNkZDVkKSwKKyAgICAgICAgIENIQygweDVjOGQ3MTYzKSwgQ0hDKDB4NzU5MTA2NWYpfSwKKyAgICAgICAgey0yLCAtMywgLTcsIC00LCAtOSwgLTE0fSwKKyAgICAgICAge0NIQygweDdlYTEyYTUyKSwgQ0hDKDB4NGYxNzgyYTYpLCBDSEMoMHg2NDdjYmNiMiksIENIQygweDUwZGMwYmIxKX0sCisgICAgICAgIHstMTYsIC04LCAtMywgMH0sCisgICAgfSwKK307CisKKy8qKiBcZGVmICBTVU1fU0FGRVRZCisgKgorICogIFNVTV9TQUZURVkgZGVmaW5lcyB0aGUgYml0cyBuZWVkZWQgdG8gcmlnaHQtc2hpZnQgZXZlcnkgc3VtbWFuZCBpbgorICogIG9yZGVyIHRvIGJlIG92ZXJmbG93LXNhZmUuIEluIHRoZSB0d28gYmFja3N1YnN0IGZ1bmN0aW9ucyB3ZSBzdW0gdXAgNAorICogIHZhbHVlcy4gU2luY2Ugb25lIG9mIHdoaWNoIGlzIGRlZmluaXRlbHkgbm90IE1BWFZBTF9EQkwgKHRoZSBMW3hdW3ldKSwKKyAqICB3ZSBzcGFyZSBqdXN0IDIgc2FmZXR5IGJpdHMgaW5zdGVhZCBvZiAzLgorICovCisjZGVmaW5lIFNVTV9TQUZFVFkgMgorCisvKioKKyAqIFxicmllZiAgU29sdmVzIEwqeD1iIHZpYSBiYWNrc3Vic3RpdHV0aW9uIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisgKiBzdHJ1Y3R1cmU6CisgKgorICogIHhbMF0gPSAgYlswXTsKKyAqICB4WzFdID0gKGJbMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB4WzBdKSAvIExbMV1bMV07CisgKiAgeFsyXSA9IChiWzJdIC0geFsxXSpMWzJdWzFdICAgICAgICAgICAgICAgIC0geFswXSkgLyBMWzJdWzJdOworICogIHhbM10gPSAoYlszXSAtIHhbMl0qTFszXVsyXSAtIHhbMV0qTFszXVsxXSAtIHhbMF0pIC8gTFszXVszXTsKKyAqCisgKiBccGFyYW1baW5dICBudW1CYW5kcyAgU0JSIGNyb3Nzb3ZlciBiYW5kIGluZGV4CisgKiBccGFyYW1baW5dICBiICAgICAgICAgdGhlIGIgaW4gTCp4PWIgKG9uZS1kaW1lbnNpb25hbCkKKyAqIFxwYXJhbVtvdXRdIHggICAgICAgICBvdXRwdXQgcG9seW5vbWlhbCBjb2VmZmljaWVudHMgKG1hbnRpc3NhKQorICogXHBhcmFtW291dF0geF9zZiAgICAgIGV4cG9uZW50cyBvZiB4W10KKyAqLworc3RhdGljIHZvaWQgYmFja3N1YnN0X2Z3KGNvbnN0IGludCBudW1CYW5kcywgY29uc3QgRklYUF9EQkwgKmNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHgsIGludCAqUkVTVFJJQ1QgeF9zZikgeworICBpbnQgaSwgazsKKyAgaW50IG07IC8qIHRoZSB0cmlwIGNvdW50ZXIgdGhhdCBpbmRleGVzIGluY3JlbWVudGFsbHkgdGhyb3VnaCBMbm9ybTFkW10gKi8KKworICBjb25zdCBGSVhQX0NIQiAqUkVTVFJJQ1QgcExub3JtMWQgPSBic2RbbnVtQmFuZHMgLSBCU0RfSURYX09GRlNFVF0uTG5vcm0xZDsKKyAgY29uc3QgU0NIQVIgKlJFU1RSSUNUIHBMbm9ybTFkX3NmID0gYnNkW251bUJhbmRzIC0gQlNEX0lEWF9PRkZTRVRdLkxub3JtMWRfc2Y7CisgIGNvbnN0IEZJWFBfQ0hCICpSRVNUUklDVCBwTG5vcm1paSA9IGJzZFtudW1CYW5kcyAtIEJTRF9JRFhfT0ZGU0VUXS5Mbm9ybWlpOworICBjb25zdCBTQ0hBUiAqUkVTVFJJQ1QgcExub3JtaWlfc2YgPSBic2RbbnVtQmFuZHMgLSBCU0RfSURYX09GRlNFVF0uTG5vcm1paV9zZjsKKworICB4WzBdID0gYlswXTsKKworICBmb3IgKGkgPSAxLCBtID0gMDsgaSA8PSBQT0xZX09SREVSOyArK2kpIHsKKyAgICBGSVhQX0RCTCBzdW0gPSBiW2ldID4+IFNVTV9TQUZFVFk7CisgICAgaW50IHN1bV9zZiA9IHhfc2ZbaV07CisgICAgZm9yIChrID0gaSAtIDE7IGsgPiAwOyAtLWssICsrbSkgeworICAgICAgaW50IGU7CisgICAgICBGSVhQX0RCTCBtdWx0ID0gZk11bHROb3JtKEZYX0NIQjJGWF9EQkwocExub3JtMWRbbV0pLCB4W2tdLCAmZSk7CisgICAgICBpbnQgbXVsdF9zZiA9IHBMbm9ybTFkX3NmW21dICsgeF9zZltrXSArIGU7CisKKyAgICAgIC8qIGNoZWNrIGlmIHRoZSBuZXcgc3VtbWFuZCBtdWx0IGhhcyBhIGRpZmZlcmVudCBzZiB0aGFuIHRoZSBzdW0gY3VycmVudGx5CisgICAgICAgKiBoYXMgKi8KKyAgICAgIGludCBkaWZmID0gbXVsdF9zZiAtIHN1bV9zZjsKKworICAgICAgaWYgKGRpZmYgPiAwKSB7CisgICAgICAgIC8qIHllcywgYW5kIGl0IHJlcXVpcmVzIHRoZSBzdW0gdG8gYmUgYWRqdXN0ZWQgKHNjYWxlZCBkb3duKSAqLworICAgICAgICBzdW0gPj49IGRpZmY7CisgICAgICAgIHN1bV9zZiA9IG11bHRfc2Y7CisgICAgICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7CisgICAgICAgIC8qIHllcywgYnV0IGhlcmUgbXVsdCBuZWVkcyB0byBiZSBzY2FsZWQgZG93biAqLworICAgICAgICBtdWx0ID4+PSAtZGlmZjsKKyAgICAgIH0KKyAgICAgIHN1bSAtPSAobXVsdCA+PiBTVU1fU0FGRVRZKTsKKyAgICB9CisKKyAgICAvKiAtIHhbMF0gKi8KKyAgICBpZiAoeF9zZlswXSA+IHN1bV9zZikgeworICAgICAgc3VtID4+PSAoeF9zZlswXSAtIHN1bV9zZik7CisgICAgICBzdW1fc2YgPSB4X3NmWzBdOworICAgIH0KKyAgICBzdW0gLT0gKHhbMF0gPj4gKHN1bV9zZiAtIHhfc2ZbMF0gKyBTVU1fU0FGRVRZKSk7CisKKyAgICAvKiBpbnN0ZWFkIG9mIHRoZSBkaXZpc2lvbiAvTFtpXVtpXSwgd2UgbXVsdGlwbHkgYnkgdGhlIGludmVyc2UgKi8KKyAgICBpbnQgZTsKKyAgICB4W2ldID0gZk11bHROb3JtKHN1bSwgRlhfQ0hCMkZYX0RCTChwTG5vcm1paVtpIC0gMV0pLCAmZSk7CisgICAgeF9zZltpXSA9IHN1bV9zZiArIHBMbm9ybWlpX3NmW2kgLSAxXSArIGUgKyBTVU1fU0FGRVRZOworICB9Cit9CisKKy8qKgorICogXGJyaWVmIFNvbHZlcyBMKng9YiB2aWEgYmFja3N1YnN0aXR1dGlvbiBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZworICogc3RydWN0dXJlOgorICoKKyAqICB4WzNdID0gYlszXTsKKyAqICB4WzJdID0gYlsyXSAtIExbMl1bM10qeFszXTsKKyAqICB4WzFdID0gYlsxXSAtIExbMV1bMl0qeFsyXSAtIExbMV1bM10qeFszXTsKKyAqICB4WzBdID0gYlswXSAtIExbMF1bMV0qeFsxXSAtIExbMF1bMl0qeFsyXSAtIExbMF1bM10qeFszXTsKKyAqCisgKiBccGFyYW1baW5dICBudW1CYW5kcyAgU0JSIGNyb3Nzb3ZlciBiYW5kIGluZGV4CisgKiBccGFyYW1baW5dICBiICAgICAgICAgdGhlIGIgaW4gTCp4PWIgKG9uZS1kaW1lbnNpb25hbCkKKyAqIFxwYXJhbVtvdXRdIHggICAgICAgICBzb2x1dGlvbiB2ZWN0b3IKKyAqIFxwYXJhbVtvdXRdIHhfc2YgICAgICBleHBvbmVudHMgb2YgeFtdCisgKi8KK3N0YXRpYyB2b2lkIGJhY2tzdWJzdF9idyhjb25zdCBpbnQgbnVtQmFuZHMsIGNvbnN0IEZJWFBfREJMICpjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCB4LCBpbnQgKlJFU1RSSUNUIHhfc2YpIHsKKyAgaW50IGksIGs7CisgIGludCBtOyAvKiB0aGUgdHJpcCBjb3VudGVyIHRoYXQgaW5kZXhlcyBpbmNyZW1lbnRhbGx5IHRocm91Z2ggTG5vcm1JbnYxZFtdICovCisKKyAgY29uc3QgRklYUF9DSEIgKlJFU1RSSUNUIHBMbm9ybUludjFkID0KKyAgICAgIGJzZFtudW1CYW5kcyAtIEJTRF9JRFhfT0ZGU0VUXS5Mbm9ybUludjFkOworICBjb25zdCBTQ0hBUiAqUkVTVFJJQ1QgcExub3JtSW52MWRfc2YgPQorICAgICAgYnNkW251bUJhbmRzIC0gQlNEX0lEWF9PRkZTRVRdLkxub3JtSW52MWRfc2Y7CisKKyAgeFtQT0xZX09SREVSXSA9IGJbUE9MWV9PUkRFUl07CisKKyAgZm9yIChpID0gUE9MWV9PUkRFUiAtIDEsIG0gPSAwOyBpID49IDA7IGktLSkgeworICAgIEZJWFBfREJMIHN1bSA9IGJbaV0gPj4gU1VNX1NBRkVUWTsKKyAgICBpbnQgc3VtX3NmID0geF9zZltpXTsgLyogc3VtJ3Mgc2YgYnV0IGRpc3JlZ2FyZGluZyBTVU1fU0FGRVRZIChhZGRlZCBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uJ3MgZW5kKSAqLworCisgICAgZm9yIChrID0gaSArIDE7IGsgPD0gUE9MWV9PUkRFUjsgKytrLCArK20pIHsKKyAgICAgIGludCBlOworICAgICAgRklYUF9EQkwgbXVsdCA9IGZNdWx0Tm9ybShGWF9DSEIyRlhfREJMKHBMbm9ybUludjFkW21dKSwgeFtrXSwgJmUpOworICAgICAgaW50IG11bHRfc2YgPSBwTG5vcm1JbnYxZF9zZlttXSArIHhfc2Zba10gKyBlOworCisgICAgICAvKiBjaGVjayBpZiB0aGUgbmV3IHN1bW1hbmQgbXVsdCBoYXMgYSBkaWZmZXJlbnQgc2YgdGhhbiBzdW0gY3VycmVudGx5IGhhcworICAgICAgICovCisgICAgICBpbnQgZGlmZiA9IG11bHRfc2YgLSBzdW1fc2Y7CisKKyAgICAgIGlmIChkaWZmID4gMCkgeworICAgICAgICAvKiB5ZXMsIGFuZCBpdCByZXF1aXJlcyB0aGUgc3VtIHYgdG8gYmUgYWRqdXN0ZWQgKHNjYWxlZCBkb3duKSAqLworICAgICAgICBzdW0gPj49IGRpZmY7CisgICAgICAgIHN1bV9zZiA9IG11bHRfc2Y7CisgICAgICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7CisgICAgICAgIC8qIHllcywgYnV0IGhlcmUgbXVsdCBuZWVkcyB0byBiZSBzY2FsZWQgZG93biAqLworICAgICAgICBtdWx0ID4+PSAtZGlmZjsKKyAgICAgIH0KKworICAgICAgLyogbXVsdCBoYXMgbm93IHRoZSBzYW1lIHNmIHRoYW4gd2hhdCBpdCBpcyBhYm91dCB0byBiZSBhZGRlZCB0by4gKi8KKyAgICAgIC8qIHNjYWxlIG11bHQgZG93biBhZGRpdGlvbmFsbHkgc28gdGhhdCBidWlsZGluZyB0aGUgc3VtIGlzIG92ZXJmbG93LXNhZmUuCisgICAgICAgKi8KKyAgICAgIHN1bSAtPSAobXVsdCA+PiBTVU1fU0FGRVRZKTsKKyAgICB9CisKKyAgICB4X3NmW2ldID0gc3VtX3NmICsgU1VNX1NBRkVUWTsKKyAgICB4W2ldID0gc3VtOworICB9Cit9CisKKy8qKgorICogXGJyaWVmICBTb2x2ZXMgYSBzeXN0ZW0gb2YgbGluZWFyIGVxdWF0aW9ucyAoTCp4PWIpIHdpdGggdGhlIENob2xlc2t5CisgKiBhbGdvcml0aG0uCisgKgorICogXHBhcmFtW2luXSAgICAgbnVtQmFuZHMgIFNCUiBjcm9zc292ZXIgYmFuZCBpbmRleAorICogXHBhcmFtW2luLG91dF0gYiAgICAgICAgIGlucHV0OiB2ZWN0b3IgYiwgb3V0cHV0OiBzb2x1dGlvbiB2ZWN0b3IgcC4KKyAqIFxwYXJhbVtpbixvdXRdIGJfc2YgICAgICBpbnB1dDogZXhwb25lbnQgb2YgYjsgb3V0cHV0OiBleHBvbmVudCBvZiBzb2x1dGlvbgorICogcC4KKyAqLworc3RhdGljIHZvaWQgY2hvbGVza3lTb2x2ZShjb25zdCBpbnQgbnVtQmFuZHMsIEZJWFBfREJMICpSRVNUUklDVCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKlJFU1RSSUNUIGJfc2YpIHsKKyAgaW50IGksIGU7CisKKyAgY29uc3QgRklYUF9DSEIgKlJFU1RSSUNUIHBCbXVsMCA9IGJzZFtudW1CYW5kcyAtIEJTRF9JRFhfT0ZGU0VUXS5CbXVsMDsKKyAgY29uc3QgU0NIQVIgKlJFU1RSSUNUIHBCbXVsMF9zZiA9IGJzZFtudW1CYW5kcyAtIEJTRF9JRFhfT0ZGU0VUXS5CbXVsMF9zZjsKKyAgY29uc3QgRklYUF9DSEIgKlJFU1RSSUNUIHBCbXVsMSA9IGJzZFtudW1CYW5kcyAtIEJTRF9JRFhfT0ZGU0VUXS5CbXVsMTsKKyAgY29uc3QgU0NIQVIgKlJFU1RSSUNUIHBCbXVsMV9zZiA9IGJzZFtudW1CYW5kcyAtIEJTRF9JRFhfT0ZGU0VUXS5CbXVsMV9zZjsKKworICAvKiBub3JtYWxpemUgYiAqLworICBGSVhQX0RCTCBibm9ybWVkW1BPTFlfT1JERVIgKyAxXTsKKyAgZm9yIChpID0gMDsgaSA8PSBQT0xZX09SREVSOyArK2kpIHsKKyAgICBibm9ybWVkW2ldID0gZk11bHROb3JtKGJbaV0sIEZYX0NIQjJGWF9EQkwocEJtdWwwW2ldKSwgJmUpOworICAgIGJfc2ZbaV0gKz0gcEJtdWwwX3NmW2ldICsgZTsKKyAgfQorCisgIGJhY2tzdWJzdF9mdyhudW1CYW5kcywgYm5vcm1lZCwgYiwgYl9zZik7CisKKyAgLyogbm9ybWFsaXplIGIgYWdhaW4gKi8KKyAgZm9yIChpID0gMDsgaSA8PSBQT0xZX09SREVSOyArK2kpIHsKKyAgICBibm9ybWVkW2ldID0gZk11bHROb3JtKGJbaV0sIEZYX0NIQjJGWF9EQkwocEJtdWwxW2ldKSwgJmUpOworICAgIGJfc2ZbaV0gKz0gcEJtdWwxX3NmW2ldICsgZTsKKyAgfQorCisgIGJhY2tzdWJzdF9idyhudW1CYW5kcywgYm5vcm1lZCwgYiwgYl9zZik7Cit9CisKKy8qKgorICogXGJyaWVmICBGaW5kIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbiBvZiB2ZWN0b3IgeSB3aXRoIGltcGxpY2l0IGFic2Npc2FzCisgKiB4PTAsMSwyLDMuLm4tMQorICoKKyAqICBUaGUgcHJvYmxlbSAoVl5UICogViAqIHAgPSBWXlQgKiB5KSBpcyBzb2x2ZWQgd2l0aCBDaG9sZXNreS4KKyAqICBWIGlzIHRoZSBWYW5kZXJtb2RlIE1hdHJpeCBjb25zdHJ1Y3RlZCB3aXRoIHggPSAwLi4ubi0xOworICogIEEgPSBWXlQgKiBWOyBiID0gVl5UICogeTsKKyAqCisgKiBccGFyYW1baW5dICBudW1CYW5kcyAgU0JSIGNyb3Nzb3ZlciBiYW5kIGluZGV4IChCU0RfSURYX09GRlNFVCA8PSBudW1CYW5kcyA8PQorICogTUFYTE9XQkFORFMpCisgKiBccGFyYW1baW5dICB5ICAgICAgICAgaW5wdXQgdmVjdG9yIChtYW50aXNzYSkKKyAqIFxwYXJhbVtpbl0gIHlfc2YgICAgICBleHBvbmVudHMgb2YgeVtdCisgKiBccGFyYW1bb3V0XSBwICAgICAgICAgb3V0cHV0IHBvbHlub21pYWwgY29lZmZpY2llbnRzIChtYW50aXNzYSkKKyAqIFxwYXJhbVtvdXRdIHBfc2YgICAgICBleHBvbmVudHMgb2YgcFtdCisgKi8KK3N0YXRpYyB2b2lkIHBvbHlmaXQoY29uc3QgaW50IG51bUJhbmRzLCBjb25zdCBGSVhQX0RCTCAqY29uc3QgeSwgY29uc3QgaW50IHlfc2YsCisgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwLCBpbnQgKlJFU1RSSUNUIHBfc2YpIHsKKyAgaW50IGksIGs7CisgIExPTkcgdltQT0xZX09SREVSICsgMV07CisgIGludCBzdW1fc2FmdGV5ID0gZ2V0TG9nMltudW1CYW5kcyAtIDFdOworCisgIEZES19BU1NFUlQoKG51bUJhbmRzID49IEJTRF9JRFhfT0ZGU0VUKSAmJiAobnVtQmFuZHMgPD0gTUFYTE9XQkFORFMpKTsKKworICAvKiBjb25zdHJ1Y3QgdmVjdG9yIGJbXSB0ZW1wb3JhcmlseSBzdG9yZWQgaW4gYXJyYXkgcFtdICovCisgIEZES21lbWNsZWFyKHAsIChQT0xZX09SREVSICsgMSkgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICAvKiBwW10gYXJlIHRoZSBzdW1zIG92ZXIgbiB2YWx1ZXMgYW5kIGVhY2ggcFtpXSBoYXMgaXRzIG93biBzZiAqLworICBmb3IgKGkgPSAwOyBpIDw9IFBPTFlfT1JERVI7ICsraSkgcF9zZltpXSA9IDEgLSBERlJBQ1RfQklUUzsKKworICBmb3IgKGsgPSAwOyBrIDwgbnVtQmFuZHM7IGsrKykgeworICAgIHZbMF0gPSAoTE9ORykxOworICAgIGZvciAoaSA9IDE7IGkgPD0gUE9MWV9PUkRFUjsgaSsrKSB7CisgICAgICB2W2ldID0gayAqIHZbaSAtIDFdOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPD0gUE9MWV9PUkRFUjsgaSsrKSB7CisgICAgICBpZiAodltQT0xZX09SREVSIC0gaV0gIT0gMCAmJiB5W2tdICE9IEZJWFBfREJMKDApKSB7CisgICAgICAgIGludCBlOworICAgICAgICBGSVhQX0RCTCBtdWx0ID0gZk11bHROb3JtKChGSVhQX0RCTCl2W1BPTFlfT1JERVIgLSBpXSwgeVtrXSwgJmUpOworICAgICAgICBpbnQgc2YgPSBERlJBQ1RfQklUUyAtIDEgKyB5X3NmICsgZTsKKworICAgICAgICAvKiBjaGVjayBpZiB0aGUgbmV3IHN1bW1hbmQgaGFzIGEgZGlmZmVyZW50IHNmIHRoYW4gdGhlIHN1bSBwW2ldCisgICAgICAgICAqIGN1cnJlbnRseSBoYXMgKi8KKyAgICAgICAgaW50IGRpZmYgPSBzZiAtIHBfc2ZbaV07CisKKyAgICAgICAgaWYgKGRpZmYgPiAwKSB7CisgICAgICAgICAgLyogeWVzLCBhbmQgaXQgcmVxdWlyZXMgdGhlIHN1bSBwW2ldIHRvIGJlIGFkanVzdGVkIChzY2FsZWQgZG93bikgKi8KKyAgICAgICAgICBwW2ldID4+PSBmTWluKERGUkFDVF9CSVRTIC0gMSwgZGlmZik7CisgICAgICAgICAgcF9zZltpXSA9IHNmOworICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7CisgICAgICAgICAgLyogeWVzLCBidXQgaGVyZSBtdWx0IG5lZWRzIHRvIGJlIHNjYWxlZCBkb3duICovCisgICAgICAgICAgbXVsdCA+Pj0gLWRpZmY7CisgICAgICAgIH0KKworICAgICAgICAvKiBtdWx0IGhhcyBub3cgdGhlIHNhbWUgc2YgdGhhbiB3aGF0IGl0IGlzIGFib3V0IHRvIGJlIGFkZGVkIHRvLgorICAgICAgICAgICBzY2FsZSBtdWx0IGRvd24gYWRkaXRpb25hbGx5IHNvIHRoYXQgYnVpbGRpbmcgdGhlIHN1bSBpcworICAgICAgICAgICBvdmVyZmxvdy1zYWZlLiAqLworICAgICAgICBwW2ldICs9IG11bHQgPj4gc3VtX3NhZnRleTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwX3NmWzBdICs9IHN1bV9zYWZ0ZXk7CisgIHBfc2ZbMV0gKz0gc3VtX3NhZnRleTsKKyAgcF9zZlsyXSArPSBzdW1fc2FmdGV5OworICBwX3NmWzNdICs9IHN1bV9zYWZ0ZXk7CisKKyAgY2hvbGVza3lTb2x2ZShudW1CYW5kcywgcCwgcF9zZik7Cit9CisKKy8qKgorICogXGJyaWVmICBDYWxjdWxhdGVzIHRoZSBvdXRwdXQgb2YgYSBQT0xZX09SREVSLWRlZ3JlZSBwb2x5bm9taWFsIGZ1bmN0aW9uCisgKiAgICAgICAgIHdpdGggSG9ybmVyIHNjaGVtZToKKyAqCisgKiAgICAgICAgIHkoeCkgPSBwMyArIHAyKnggKyBwMSp4XjIgKyBwMCp4XjMKKyAqICAgICAgICAgICAgICA9IHAzICsgeCoocDIgKyB4KihwMSArIHgqcDApKQorICoKKyAqICAgICAgICAgVGhlIGZvciBsb29wIGl0ZXJhdGVzIHRocm91Z2ggdGhlIG11bHQvYWRkIHBhcnRzIGluIHkoeCkgYXMgYWJvdmUsCisgKiAgICAgICAgIGR1cmluZyB3aGljaCByZWd1bGFyIHVwc2NhbGluZyBlbnN1cmVzIGEgc3RhYmxlIGV4cG9uZW50IG9mIHRoZQorICogICAgICAgICByZXN1bHQuCisgKgorICogXHBhcmFtW2luXSAgcCAgICAgICBjb2VmZmljaWVudHMgYXMgaW4geSh4KQorICogXHBhcmFtW2luXSAgcF9zZiAgICBleHBvbmVudHMgb2YgcFtdCisgKiBccGFyYW1baW5dICB4X2ludCAgIG5vbi1mcmFjdGlvbmFsIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgeCBhcyBpbiB5KHgpCisgKiBccGFyYW1bb3V0XSBvdXRfc2YgIGV4cG9uZW50IG9mIHJldHVybiB2YWx1ZQorICoKKyAqIFxyZXR1cm4gICAgICAgICAgICAgcmVzdWx0IHkoeCkKKyAqLworc3RhdGljIEZJWFBfREJMIHBvbHl2YWwoY29uc3QgRklYUF9EQkwgKmNvbnN0IHAsIGNvbnN0IGludCAqY29uc3QgcF9zZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB4X2ludCwgaW50ICpvdXRfc2YpIHsKKyAgRkRLX0FTU0VSVCh4X2ludCA8PSAzMSk7IC8qIG90aGVyd2lzZSBnZXRMb2cyW10gbmVlZHMgbW9yZSBlbGVtZW50cyAqLworCisgIGludCBrLCB4X3NmOworICBpbnQgcmVzdWx0X3NmOyAgIC8qIHdvcmtpbmcgc3BhY2UgdG8gY29tcHV0ZSByZXR1cm4gdmFsdWUgKm91dF9zZiAqLworICBGSVhQX0RCTCB4OyAgICAgIC8qIGZyYWN0aW9uYWwgdmFsdWUgb2YgeF9pbnQgKi8KKyAgRklYUF9EQkwgcmVzdWx0OyAvKiByZXR1cm4gdmFsdWUgKi8KKworICAvKiBpZiB4ID09IDAsIHRoZW4geSh4KSBpcyBqdXN0IHAzICovCisgIGlmICh4X2ludCAhPSAwKSB7CisgICAgeF9zZiA9IGdldExvZzJbeF9pbnRdOworICAgIHggPSAoRklYUF9EQkwpeF9pbnQgPDwgKERGUkFDVF9CSVRTIC0gMSAtIHhfc2YpOworICB9IGVsc2UgeworICAgICpvdXRfc2YgPSBwX3NmWzNdOworICAgIHJldHVybiBwWzNdOworICB9CisKKyAgcmVzdWx0ID0gcFswXTsKKyAgcmVzdWx0X3NmID0gcF9zZlswXTsKKworICBmb3IgKGsgPSAxOyBrIDw9IFBPTFlfT1JERVI7ICsraykgeworICAgIEZJWFBfREJMIG11bHQgPSBmTXVsdCh4LCByZXN1bHQpOworICAgIGludCBtdWx0X3NmID0geF9zZiArIHJlc3VsdF9zZjsKKworICAgIGludCByb29tID0gQ291bnRMZWFkaW5nQml0cyhtdWx0KTsKKyAgICBtdWx0IDw8PSByb29tOworICAgIG11bHRfc2YgLT0gcm9vbTsKKworICAgIEZJWFBfREJMIHBwID0gcFtrXTsKKyAgICBpbnQgcHBfc2YgPSBwX3NmW2tdOworCisgICAgLyogZXF1YWxpemUgdGhlIHNoaWZ0IGZhY3RvcnMgb2YgcHAgYW5kIG11bHQgc28gdGhhdCB3ZSBjYW4gc3VtIHRoZW0gdXAgKi8KKyAgICBpbnQgZGlmZiA9IHBwX3NmIC0gbXVsdF9zZjsKKworICAgIGlmIChkaWZmID4gMCkgeworICAgICAgZGlmZiA9IGZNaW4oZGlmZiwgREZSQUNUX0JJVFMgLSAxKTsKKyAgICAgIG11bHQgPj49IGRpZmY7CisgICAgfSBlbHNlIGlmIChkaWZmIDwgMCkgeworICAgICAgZGlmZiA9IGZNYXgoZGlmZiwgMSAtIERGUkFDVF9CSVRTKTsKKyAgICAgIHBwID4+PSAtZGlmZjsKKyAgICB9CisKKyAgICAvKiBkb3duc2hpZnQgYnkgMSB0byBlbnN1cmUgc2FmZSBzdW1tYXRpb24gKi8KKyAgICBtdWx0ID4+PSAxOworICAgIG11bHRfc2YrKzsKKyAgICBwcCA+Pj0gMTsKKyAgICBwcF9zZisrOworCisgICAgcmVzdWx0X3NmID0gZk1heChwcF9zZiwgbXVsdF9zZik7CisKKyAgICByZXN1bHQgPSBtdWx0ICsgcHA7CisgICAgLyogcmFyZWx5LCBtdWx0IGFuZCBwcCBoYXBwZW4gdG8gYmUgYWxtb3N0IGVxdWFsIGV4Y2VwdCB0aGVpciBzaWduLAorICAgIGFuZCB0aGVuIHVwb24gc3VtbWF0aW9uLCByZXN1bHQgYmVjb21lcyBzbyBzbWFsbCwgdGhhdCBpdCBpcyB3aXRoaW4KKyAgICB0aGUgaW5hY2N1cmFjeSByYW5nZSBvZiBhIGZldyBiaXRzLCBhbmQgdGhlbiB0aGUgcmVsYXRpdmUgZXJyb3IKKyAgICBwcm9kdWNlZCBieSB0aGlzIGZ1bmN0aW9uIG1heSBiZWNvbWUgSFVHRSAqLworICB9CisKKyAgKm91dF9zZiA9IHJlc3VsdF9zZjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBzYnJEZWNvZGVyX2NhbGN1bGF0ZUdhaW5WZWMoRklYUF9EQkwgKipzb3VyY2VCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipzb3VyY2VCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZUJ1Zl9lX292ZXJsYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlQnVmX2VfY3VycmVudCwgaW50IG92ZXJsYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgR2FpblZlYywgaW50ICpHYWluVmVjX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CYW5kcywgY29uc3QgaW50IHN0YXJ0U2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0b3BTYW1wbGUpIHsKKyAgRklYUF9EQkwgcFtQT0xZX09SREVSICsgMV07CisgIEZJWFBfREJMIG1lYW5Ocmc7CisgIEZJWFBfREJMIExvd0VudltNQVhMT1dCQU5EU107CisgIEZJWFBfREJMIGludk51bUJhbmRzID0gR2V0SW52SW50KG51bUJhbmRzKTsKKyAgRklYUF9EQkwgaW52TnVtU2xvdHMgPSBHZXRJbnZJbnQoc3RvcFNhbXBsZSAtIHN0YXJ0U2FtcGxlKTsKKyAgaW50IGksIGxvQmFuZCwgZXhwLCBzY2FsZV9ucmcsIHNjYWxlX25yZ19vdjsKKyAgaW50IHN1bV9zY2FsZSA9IDUsIHN1bV9zY2FsZV9vdiA9IDM7CisKKyAgaWYgKG92ZXJsYXAgPiA4KSB7CisgICAgRkRLX0FTU0VSVChvdmVybGFwIDw9IDE2KTsKKyAgICBzdW1fc2NhbGVfb3YgKz0gMTsKKyAgICBzdW1fc2NhbGUgKz0gMTsKKyAgfQorCisgIC8qIGV4cG9uZW50cyBvZiBlbmVyZ3kgdmFsdWVzICovCisgIHNvdXJjZUJ1Zl9lX292ZXJsYXAgPSBzb3VyY2VCdWZfZV9vdmVybGFwICogMiArIHN1bV9zY2FsZV9vdjsKKyAgc291cmNlQnVmX2VfY3VycmVudCA9IHNvdXJjZUJ1Zl9lX2N1cnJlbnQgKiAyICsgc3VtX3NjYWxlOworICBleHAgPSBmTWF4KHNvdXJjZUJ1Zl9lX292ZXJsYXAsIHNvdXJjZUJ1Zl9lX2N1cnJlbnQpOworICBzY2FsZV9ucmcgPSBzb3VyY2VCdWZfZV9jdXJyZW50IC0gZXhwOworICBzY2FsZV9ucmdfb3YgPSBzb3VyY2VCdWZfZV9vdmVybGFwIC0gZXhwOworCisgIG1lYW5OcmcgPSAoRklYUF9EQkwpMDsKKyAgLyogQ2FsY3VsYXRlIHRoZSBzcGVjdHJhbCBlbnZlbG9wZSBpbiBkQiBvdmVyIHRoZSBjdXJyZW50IGNvcHktdXAgZnJhbWUuICovCisgIGZvciAobG9CYW5kID0gMDsgbG9CYW5kIDwgbnVtQmFuZHM7IGxvQmFuZCsrKSB7CisgICAgRklYUF9EQkwgbnJnX292LCBucmc7CisgICAgSU5UIHJlc2VydmUgPSAwLCBleHBfbmV3OworICAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYX0RCTCgwLjBmKTsKKworICAgIGZvciAoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrKSB7CisgICAgICBtYXhWYWwgfD0KKyAgICAgICAgICAoRklYUF9EQkwpKChMT05HKShzb3VyY2VCdWZmZXJSZWFsW2ldW2xvQmFuZF0pIF4KKyAgICAgICAgICAgICAgICAgICAgICgoTE9ORylzb3VyY2VCdWZmZXJSZWFsW2ldW2xvQmFuZF0gPj4gKFNBTVBMRV9CSVRTIC0gMSkpKTsKKyAgICAgIG1heFZhbCB8PQorICAgICAgICAgIChGSVhQX0RCTCkoKExPTkcpKHNvdXJjZUJ1ZmZlckltYWdbaV1bbG9CYW5kXSkgXgorICAgICAgICAgICAgICAgICAgICAgKChMT05HKXNvdXJjZUJ1ZmZlckltYWdbaV1bbG9CYW5kXSA+PiAoU0FNUExFX0JJVFMgLSAxKSkpOworICAgIH0KKworICAgIGlmIChtYXhWYWwgIT0gRkwyRlhfREJMKDAuMGYpKSB7CisgICAgICByZXNlcnZlID0gZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhtYXhWYWwpIC0gMik7CisgICAgfQorCisgICAgbnJnX292ID0gbnJnID0gKEZJWFBfREJMKTA7CisgICAgaWYgKHNjYWxlX25yZ19vdiA+IC0zMSkgeworICAgICAgZm9yIChpID0gc3RhcnRTYW1wbGU7IGkgPCBvdmVybGFwOyBpKyspIHsKKyAgICAgICAgbnJnX292ICs9IChmUG93MkRpdjIoc291cmNlQnVmZmVyUmVhbFtpXVtsb0JhbmRdIDw8IHJlc2VydmUpICsKKyAgICAgICAgICAgICAgICAgICBmUG93MkRpdjIoc291cmNlQnVmZmVySW1hZ1tpXVtsb0JhbmRdIDw8IHJlc2VydmUpKSA+PgorICAgICAgICAgICAgICAgICAgc3VtX3NjYWxlX292OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzY2FsZV9ucmdfb3YgPSAwOworICAgIH0KKyAgICBpZiAoc2NhbGVfbnJnID4gLTMxKSB7CisgICAgICBmb3IgKGkgPSBvdmVybGFwOyBpIDwgc3RvcFNhbXBsZTsgaSsrKSB7CisgICAgICAgIG5yZyArPSAoZlBvdzJEaXYyKHNvdXJjZUJ1ZmZlclJlYWxbaV1bbG9CYW5kXSA8PCByZXNlcnZlKSArCisgICAgICAgICAgICAgICAgZlBvdzJEaXYyKHNvdXJjZUJ1ZmZlckltYWdbaV1bbG9CYW5kXSA8PCByZXNlcnZlKSkgPj4KKyAgICAgICAgICAgICAgIHN1bV9zY2FsZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2NhbGVfbnJnID0gMDsKKyAgICB9CisKKyAgICBucmcgPSAoc2NhbGVWYWx1ZShucmdfb3YsIHNjYWxlX25yZ19vdikgPj4gMSkgKworICAgICAgICAgIChzY2FsZVZhbHVlKG5yZywgc2NhbGVfbnJnKSA+PiAxKTsKKyAgICBucmcgPSBmTXVsdChucmcsIGludk51bVNsb3RzKTsKKworICAgIGV4cF9uZXcgPQorICAgICAgICBleHAgLSAoMiAqIHJlc2VydmUpICsKKyAgICAgICAgMjsgLyogKzEgZm9yIGFkZGl0aW9uIGRpcmVjdGx5IGFib3ZlLCArMSBmb3IgZlBvdzJEaXYyIGluIGxvb3BzIGFib3ZlICovCisKKyAgICAvKiBMb3dFbnYgPSAxMCpsb2cxMChucmcpID0gbG9nMihucmcpICogMTAvbG9nMigxMCkgKi8KKyAgICAvKiBleHBvbmVudCBvZiBsb2dhcml0aG1pYyBlbmVyZ3kgaXMgOCAqLworICAgIGlmIChucmcgPiAoRklYUF9EQkwpMCkgeworICAgICAgaW50IGV4cF9sb2cyOworICAgICAgbnJnID0gQ2FsY0xvZzIobnJnLCBleHBfbmV3LCAmZXhwX2xvZzIpOworICAgICAgbnJnID0gc2NhbGVWYWx1ZShucmcsIGV4cF9sb2cyIC0gNik7CisgICAgICBucmcgPSBmTXVsdChGTDJGWENPTlNUX1NHTChMT0cxMEZBQyksIG5yZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG5yZyA9IChGSVhQX0RCTCkwOworICAgIH0KKyAgICBMb3dFbnZbbG9CYW5kXSA9IG5yZzsKKyAgICBtZWFuTnJnICs9IGZNdWx0KG5yZywgaW52TnVtQmFuZHMpOworICB9CisgIGV4cCA9IDYgKyAyOyAvKiBleHBvbmVudCBvZiBMb3dFbnY6ICsyIGlzIGV4cG9uZW50IG9mIExPRzEwRkFDICovCisKKyAgLyogc3VidHJhY3QgbWVhbiBiZWZvcmUgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIHRvIHJlZHVjZSBkeW5hbWljIG9mIHBbXSAqLworICBmb3IgKGxvQmFuZCA9IDA7IGxvQmFuZCA8IG51bUJhbmRzOyBsb0JhbmQrKykgeworICAgIExvd0Vudltsb0JhbmRdID0gbWVhbk5yZyAtIExvd0Vudltsb0JhbmRdOworICB9CisKKyAgLyogRm9yIG51bUJhbmRzIDwgQlNEX0lEWF9PRkZTRVQgKD09IFBPTFlfT1JERVIrMikgd2UgZG9udCBnZXQgYW4KKyAgICAgb3ZlcmRldGVybWluZWQgZXF1YXRpb24gc3lzdGVtLiBUaGUgY2FsY3VsYXRlZCBwb2x5bm9taWFsIHdpbGwgZXhhY3RseSBmaXQKKyAgICAgdGhlIGlucHV0IGRhdGEgYW5kIGV2YWx1YXRpbmcgdGhlIHBvbHlub21pYWwgd2lsbCBsZWFkIHRvIHRoZSBzYW1lIHZlY3RvcgorICAgICB0aGFuIHRoZSBvcmlnaW5hbCBpbnB1dCB2ZWN0b3I6IGxvd0VudlNsb3BlW10gPT0gbG93RW52W10KKyAgKi8KKyAgaWYgKG51bUJhbmRzID4gUE9MWV9PUkRFUiArIDEpIHsKKyAgICAvKiBGaW5kIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbiBvZiBMb3dFbnYgKi8KKyAgICBpbnQgcF9zZltQT0xZX09SREVSICsgMV07CisKKyAgICBwb2x5Zml0KG51bUJhbmRzLCBMb3dFbnYsIGV4cCwgcCwgcF9zZik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgaW50IHNmOworCisgICAgICAvKiBsb3dCYW5kRW52U2xvcGVbaV0gPSB0bXA7ICovCisgICAgICBGSVhQX0RCTCB0bXAgPSBwb2x5dmFsKHAsIHBfc2YsIGksICZzZik7CisKKyAgICAgIC8qIEdhaW5WZWMgPSAxMF4oKG1lYW4oeSkteSkvMjApID0gMl4oIChtZWFuKHkpLXkpICogbG9nMigxMCkvMjAgKSAqLworICAgICAgdG1wID0gZk11bHQodG1wLCBGTDJGWENPTlNUX1NHTChMT0cxMEZBQ19JTlYpKTsKKyAgICAgIEdhaW5WZWNbaV0gPSBmMlBvdyh0bXAsIHNmIC0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmR2FpblZlY19leHBbaV0pOyAvKiAtMiBpcyBleHBvbmVudCBvZiBMT0cxMEZBQ19JTlYgKi8KKyAgICB9CisgIH0gZWxzZSB7IC8qIG51bUJhbmRzIDw9IFBPTFlfT1JERVIrMSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICBpbnQgc2YgPSBleHA7IC8qIGV4cG9uZW50IG9mIExvd0VudltdICovCisKKyAgICAgIC8qIGxvd0JhbmRFbnZTbG9wZVtpXSA9IExvd0VudltpXTsgKi8KKyAgICAgIEZJWFBfREJMIHRtcCA9IExvd0VudltpXTsKKworICAgICAgLyogR2FpblZlYyA9IDEwXigobWVhbih5KS15KS8yMCkgPSAyXiggKG1lYW4oeSkteSkgKiBsb2cyKDEwKS8yMCApICovCisgICAgICB0bXAgPSBmTXVsdCh0bXAsIEZMMkZYQ09OU1RfU0dMKExPRzEwRkFDX0lOVikpOworICAgICAgR2FpblZlY1tpXSA9IGYyUG93KHRtcCwgc2YgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICZHYWluVmVjX2V4cFtpXSk7IC8qIC0yIGlzIGV4cG9uZW50IG9mIExPRzEwRkFDX0lOViAqLworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9IRmdlbl9wcmVGbGF0LmggYi9saWJTQlJkZWMvc3JjL0hGZ2VuX3ByZUZsYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWZjNDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0JSZGVjL3NyYy9IRmdlbl9wcmVGbGF0LmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIsIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOiBRTUYgZnJlcXVlbmN5IHByZSB3aGl0ZW5pbmcgZm9yIFNCUgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaWZuZGVmIEhGR0VOX1BSRUZMQVRfSAorI2RlZmluZSBIRkdFTl9QUkVGTEFUX0gKKworI2RlZmluZSBHQUlOX1ZFQ19FWFAgNiAvKiBleHBvbmVudCBvZiBHYWluVmVjW10gKi8KKworLyoqCisgKiBcYnJpZWYgRmluZCBnYWluIHZlY3RvciB0byBmbGF0dGVuIHRoZSBRTUYgZnJlcXVlbmN5IGJhbmRzIHdoaXRob3V0IGxvb3NpbmcKKyAqIHRoZSBmaW5lIHN0cnVjdHVyZS4KKyAqIFxwYXJhbVtpbl0gc291cmNlQnVmZmVyUmVhbCByZWFsIHBhcnQgb2YgUU1GIGRvbWFpbiBkYXRhLgorICogXHBhcmFtW2luXSBzb3VyY2VCdWZmZXJJbWFnIGltYWdpbmFyeSBwYXJ0IG9mIFFNRiBkb21haW4gZGF0YS4KKyAqIFxwYXJhbVtpbl0gc291cmNlQnVmZmVyX2Vfb3ZlcmxhcCBleHBvbmVudCBvZiBzb3VyY2VCdWZmZXJSZWFsLgorICogXHBhcmFtW2luXSBzb3VyY2VCdWZmZXJfZV9jdXJyZW50IGV4cG9uZW50IG9mIHNvdXJjZUJ1ZmZlckltYWcuCisgKiBccGFyYW1baW5dIG92ZXJsYXAgbnVtYmVyIG9mIG92ZXJsYXAgc2FtcGxlcy4KKyAqIFxwYXJhbVtvdXRdIEdhaW5WZWMgYXJyYXkgb2YgZ2FpbiB2YWx1ZXMgKG9uZSBmb3IgZWFjaCBRTUYgYmFuZCkuCisgKiBccGFyYW1bb3V0XSBHYWluVmVjX2V4cCBleHBvbmVudHMgb2YgR2FpblZlYyAob25lIGZvciBlYWNoIFFNRiBiYW5kKS4KKyAqIFxwYXJhbVtpbl0gbnVtQmFuZHMgbnVtYmVyIG9mIGxvdyBiYW5kcyAoa18wKS4KKyAqIFxwYXJhbVtpbl0gc3RhcnRTYW1wbGUgdGltZSBzbG90IHN0YXJ0LgorICogXHBhcmFtW2luXSBzdG9wU2FtcGxlIHRpbWUgc2xvdCBzdG9wLgorICovCit2b2lkIHNickRlY29kZXJfY2FsY3VsYXRlR2FpblZlYyhGSVhQX0RCTCAqKnNvdXJjZUJ1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnNvdXJjZUJ1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlQnVmZmVyX2Vfb3ZlcmxhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VCdWZmZXJfZV9jdXJyZW50LCBpbnQgb3ZlcmxhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIEdhaW5WZWNbXSwgaW50IEdhaW5WZWNfZXhwW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtQmFuZHMsIGNvbnN0IGludCBzdGFydFNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdG9wU2FtcGxlKTsKKworI2VuZGlmIC8qIF9fSEZHRU5fUFJFRkxBVF9IICovCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL2FybS9lbnZfY2FsY19hcm0uY3BwIGIvbGliU0JSZGVjL3NyYy9hcm0vZW52X2NhbGNfYXJtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiMTdkOC4uMDAwMDAwMAotLS0gYS9saWJTQlJkZWMvc3JjL2FybS9lbnZfY2FsY19hcm0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOiAgIEFydGh1ciBUcml0dGhhcnQKLSAgIERlc2NyaXB0aW9uOiAoQVJNIG9wdGltaXNlZCkgU0JSIGRvbWFpbiBjb2RpbmcKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBJTkNMVVNJT05fR1VBUkRfQ0FMQ19FTlZfQVJNCi0jZGVmaW5lIElOQ0xVU0lPTl9HVUFSRF9DQUxDX0VOVl9BUk0KLQotCi0vKiEKLSAgXGJyaWVmICAgQ29tcHV0ZSBtYXhpbWFsIHZhbHVlIG9mIGEgY29tcGxleCBhcnJheSAocmUvaW0pIG9mIGEgZ2l2ZW4gd2lkdGgKLSAgICAgICAgICAgTmVnYXRpdmUgdmFsdWVzIGFyZSB0ZW1wb3JhcmlseSBsb2dpY2FsbHkgb3InZWQgd2l0aCAweEZGRkZGRkZGCi0gICAgICAgICAgIGluc3RlYWQgb2YgbmVnYXRpbmcgdGhlIHZhbHVlLCBpZiB0aGUgc2lnbiBiaXQgaXMgc2V0LgotICBccGFyYW0gICBtYXhWYWwgIFByZXNldCBtYXhpbWFsIHZhbHVlCi0gIFxwYXJhbSAgIHJlVG1wICAgcmVhbCBpbnB1dCBzaWduYWwKLSAgXHBhcmFtICAgaW1UbXAgICBpbWFnaW5hcnkgaW5wdXQgc2lnbmFsCi0gIFxyZXR1cm4gIG5ldyBtYXhpbWFsIHZhbHVlCi0qLwotCi0jaWZkZWYgRlVOQ1RJT05fRkRLX2dldF9tYXh2YWwKLV9fYXNtIEZJWFBfREJMIEZES19nZXRfbWF4dmFsIChGSVhQX0RCTCBtYXhWYWwsIEZJWFBfREJMICpyZVRtcCwgRklYUF9EQkwgKmltVG1wLCBpbnQgd2lkdGggKQotewotCi0gIC8qIFJlZ2lzdGVyIG1hcDoKLSAgICAgcjAgICAgbWF4VmFsCi0gICAgIHIxICAgIHJlVG1wCi0gICAgIHIyICAgIGltVG1wCi0gICAgIHIzICAgIHdpZHRoCi0gICAgIHI0ICAgIHJlYWwKLSAgICAgcjUgICAgaW1hZwotICAqLwotICAgIFBVU0ggICAge3I0LXI1fQotCi0gICAgTU9WUyAgICByMywgcjMsIEFTUiAjMQotICAgIEFEQyAgICAgcjMsIHIzLCAjMAotICAgIEJDUyAgICAgRkRLX2dldF9tYXh2YWxfbG9vcF8ybmRfcGFydAotICAgIEJFUSAgICAgRkRLX2dldF9tYXh2YWxfbG9vcF9lbmQKLQotRkRLX2dldF9tYXh2YWxfbG9vcAotICAgIExEUiAgICAgcjQsIFtyMV0sICM0Ci0gICAgTERSICAgICByNSwgW3IyXSwgIzQKLSAgICBFT1IgICAgIHI0LCByNCwgcjQsIEFTUiAjMzEKLSAgICBFT1IgICAgIHI1LCByNSwgcjUsIEFTUiAjMzEKLSAgICBPUlIgICAgIHIwLCByMCwgcjQKLSAgICBPUlIgICAgIHIwLCByMCwgcjUKLQotRkRLX2dldF9tYXh2YWxfbG9vcF8ybmRfcGFydAotICAgIExEUiAgICAgcjQsIFtyMV0sICM0Ci0gICAgTERSICAgICByNSwgW3IyXSwgIzQKLSAgICBFT1IgICAgIHI0LCByNCwgcjQsIEFTUiAjMzEKLSAgICBFT1IgICAgIHI1LCByNSwgcjUsIEFTUiAjMzEKLSAgICBPUlIgICAgIHIwLCByMCwgcjQKLSAgICBPUlIgICAgIHIwLCByMCwgcjUKLQotICAgIFNVQlMgICAgcjMsIHIzLCAjMQotICAgIEJORSAgICAgRkRLX2dldF9tYXh2YWxfbG9vcAotCi1GREtfZ2V0X21heHZhbF9sb29wX2VuZAotICAgIFBPUCAgICAge3I0LXI1fQotICAgIEJYICAgICAgbHIKLX0KLSNlbmRpZiAvKiBGVU5DVElPTl9GREtfZ2V0X21heHZhbCAqLwotCi0jZW5kaWYgLyogSU5DTFVTSU9OX0dVQVJEX0NBTENfRU5WX0FSTSAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9hcm0vbHBwX3RyYW5fYXJtLmNwcCBiL2xpYlNCUmRlYy9zcmMvYXJtL2xwcF90cmFuX2FybS5jcHAKaW5kZXggNzhiYmMyYy4uZGIxOTQ4ZiAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9hcm0vbHBwX3RyYW5fYXJtLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL2FybS9scHBfdHJhbl9hcm0uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDczICs5MCw3MCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEFydGh1ciBUcml0dGhhcnQKKwogICAgRGVzY3JpcHRpb246IChBUk0gb3B0aW1pc2VkKSBMUFAgdHJhbnNwb3NlciBzdWJyb3V0aW5lcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZiBkZWZpbmVkKF9fYXJtX18pCiAKLQogI2RlZmluZSBGVU5DVElPTl9MUFBUUkFOU1BPU0VSX2Z1bmMxCiAKICNpZmRlZiBGVU5DVElPTl9MUFBUUkFOU1BPU0VSX2Z1bmMxCiAKLS8qIE5vdGU6IFRoaXMgY29kZSByZXF1aXJlcyBvbmx5IDQzIGN5Y2xlcyBwZXIgaXRlcmF0aW9uIGluc3RlYWQgb2YgNjEgb24gQVJNOTI2RUotUyAqLwotX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgc3RhdGljIHZvaWQgbHBwVHJhbnNwb3Nlcl9mdW5jMSgKLSAgRklYUF9EQkwgKmxvd0JhbmRSZWFsLAotICBGSVhQX0RCTCAqbG93QmFuZEltYWcsCi0gIEZJWFBfREJMICoqcW1mQnVmZmVyUmVhbCwKLSAgRklYUF9EQkwgKipxbWZCdWZmZXJJbWFnLAotICBpbnQgbG9vcHMsCi0gIGludCBoaUJhbmQsCi0gIGludCBkeW5hbWljU2NhbGUsCi0gIGludCBkZXNjYWxlLAotICBGSVhQX1NHTCBhMHIsCi0gIEZJWFBfU0dMIGEwaSwKLSAgRklYUF9TR0wgYTFyLAotICBGSVhQX1NHTCBhMWkpCi17Ci0KKy8qIE5vdGU6IFRoaXMgY29kZSByZXF1aXJlcyBvbmx5IDQzIGN5Y2xlcyBwZXIgaXRlcmF0aW9uIGluc3RlYWQgb2YgNjEgb24KKyAqIEFSTTkyNkVKLVMgKi8KK3N0YXRpYyB2b2lkIGxwcFRyYW5zcG9zZXJfZnVuYzEoRklYUF9EQkwgKmxvd0JhbmRSZWFsLCBGSVhQX0RCTCAqbG93QmFuZEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mQnVmZmVyUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZCdWZmZXJJbWFnLCBpbnQgbG9vcHMsIGludCBoaUJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkeW5hbWljU2NhbGUsIGludCBkZXNjYWxlLCBGSVhQX1NHTCBhMHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMIGEwaSwgRklYUF9TR0wgYTFyLCBGSVhQX1NHTCBhMWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmUHJlV2hpdGVuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBwcmVXaGl0ZW5pbmdHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlV2hpdGVuaW5nR2FpbnNfc2YpIHsKICAgRklYUF9EQkwgcmVhbDEsIHJlYWwyLCBpbWFnMSwgaW1hZzIsIGFjY3UxLCBhY2N1MjsKIAogICByZWFsMiA9IGxvd0JhbmRSZWFsWy0yXTsKICAgcmVhbDEgPSBsb3dCYW5kUmVhbFstMV07CiAgIGltYWcyID0gbG93QmFuZEltYWdbLTJdOwogICBpbWFnMSA9IGxvd0JhbmRJbWFnWy0xXTsKLSAgZm9yKGludCBpPTA7IGkgPCBsb29wczsgaSsrKQotICB7Ci0gICAgYWNjdTEgPSBmTXVsdERpdjIoICAgICAgICAgYTByLHJlYWwxKTsKLSAgICBhY2N1MiA9IGZNdWx0RGl2MiggICAgICAgICBhMGksaW1hZzEpOwotICAgIGFjY3UxID0gZk11bHRBZGREaXYyKGFjY3UxLGExcixyZWFsMik7Ci0gICAgYWNjdTIgPSBmTXVsdEFkZERpdjIoYWNjdTIsYTFpLGltYWcyKTsKLSAgICByZWFsMiA9IGZNdWx0RGl2MiggICAgICAgICBhMWkscmVhbDIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BzOyBpKyspIHsKKyAgICBhY2N1MSA9IGZNdWx0RGl2MihhMHIsIHJlYWwxKTsKKyAgICBhY2N1MiA9IGZNdWx0RGl2MihhMGksIGltYWcxKTsKKyAgICBhY2N1MSA9IGZNdWx0QWRkRGl2MihhY2N1MSwgYTFyLCByZWFsMik7CisgICAgYWNjdTIgPSBmTXVsdEFkZERpdjIoYWNjdTIsIGExaSwgaW1hZzIpOworICAgIHJlYWwyID0gZk11bHREaXYyKGExaSwgcmVhbDIpOwogICAgIGFjY3UxID0gYWNjdTEgLSBhY2N1MjsKICAgICBhY2N1MSA9IGFjY3UxID4+IGR5bmFtaWNTY2FsZTsKIAotICAgIGFjY3UyID0gZk11bHRBZGREaXYyKHJlYWwyLGExcixpbWFnMik7CisgICAgYWNjdTIgPSBmTXVsdEFkZERpdjIocmVhbDIsIGExciwgaW1hZzIpOwogICAgIHJlYWwyID0gcmVhbDE7CiAgICAgaW1hZzIgPSBpbWFnMTsKLSAgICBhY2N1MiA9IGZNdWx0QWRkRGl2MihhY2N1MixhMGkscmVhbDEpOworICAgIGFjY3UyID0gZk11bHRBZGREaXYyKGFjY3UyLCBhMGksIHJlYWwxKTsKICAgICByZWFsMSA9IGxvd0JhbmRSZWFsW2ldOwotICAgIGFjY3UyID0gZk11bHRBZGREaXYyKGFjY3UyLGEwcixpbWFnMSk7CisgICAgYWNjdTIgPSBmTXVsdEFkZERpdjIoYWNjdTIsIGEwciwgaW1hZzEpOwogICAgIGltYWcxID0gbG93QmFuZEltYWdbaV07CiAgICAgYWNjdTIgPSBhY2N1MiA+PiBkeW5hbWljU2NhbGU7CiAKICAgICBhY2N1MSA8PD0gMTsKICAgICBhY2N1MiA8PD0gMTsKLQotICAgIHFtZkJ1ZmZlclJlYWxbaV1baGlCYW5kXSA9IGFjY3UxICsgKHJlYWwxPj5kZXNjYWxlKTsKLSAgICBxbWZCdWZmZXJJbWFnW2ldW2hpQmFuZF0gPSBhY2N1MiArIChpbWFnMT4+ZGVzY2FsZSk7CisgICAgYWNjdTEgKz0gKHJlYWwxID4+IGRlc2NhbGUpOworICAgIGFjY3UyICs9IChpbWFnMSA+PiBkZXNjYWxlKTsKKyAgICBpZiAoZlByZVdoaXRlbmluZykgeworICAgICAgYWNjdTEgPSBzY2FsZVZhbHVlU2F0dXJhdGUoZk11bHREaXYyKGFjY3UxLCBwcmVXaGl0ZW5pbmdHYWluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZVdoaXRlbmluZ0dhaW5zX3NmKTsKKyAgICAgIGFjY3UyID0gc2NhbGVWYWx1ZVNhdHVyYXRlKGZNdWx0RGl2MihhY2N1MiwgcHJlV2hpdGVuaW5nR2FpbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVXaGl0ZW5pbmdHYWluc19zZik7CisgICAgfQorICAgIHFtZkJ1ZmZlclJlYWxbaV1baGlCYW5kXSA9IGFjY3UxOworICAgIHFtZkJ1ZmZlckltYWdbaV1baGlCYW5kXSA9IGFjY3UyOwogICB9CiB9Ci0jZW5kaWYgIC8qICNpZmRlZiBGVU5DVElPTl9MUFBUUkFOU1BPU0VSX2Z1bmMxICovCi0jZW5kaWYgIC8qIF9fYXJtX18gKi8KKyNlbmRpZiAvKiAjaWZkZWYgRlVOQ1RJT05fTFBQVFJBTlNQT1NFUl9mdW5jMSAqLwogCi0KLQorI2VuZGlmIC8qIF9fYXJtX18gKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvZW52X2NhbGMuY3BwIGIvbGliU0JSZGVjL3NyYy9lbnZfY2FsYy5jcHAKaW5kZXggNzNiZDdiYS4uZDdhOGJiNSAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9lbnZfY2FsYy5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9lbnZfY2FsYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTEgKzkwLDE5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgRW52ZWxvcGUgY2FsY3VsYXRpb24gIAorICBcYnJpZWYgIEVudmVsb3BlIGNhbGN1bGF0aW9uCiAKICAgVGhlIGVudmVsb3BlIGFkanVzdG9yIGNvbXBhcmVzIHRoZSBlbmVyZ2llcyBwcmVzZW50IGluIHRoZSB0cmFuc3Bvc2VkCiAgIGhpZ2hiYW5kIHRvIHRoZSByZWZlcmVuY2UgZW5lcmdpZXMgY29udmV5ZWQgd2l0aCB0aGUgYml0c3RyZWFtLgpAQCAtMTExLDE2ICsxMzAsMTcgQEAKICAgSG93ZXZlciwgaW4gYXZlcmFnZSBvbmx5IHRoZSBkYXRhIG9mIDEgZnJhbWUgaXMgYmVpbmcgcHJvY2Vzc2VkIGFzCiAgIHRoZSBhZGp1c3RvciBpcyBjYWxsZWQgb25jZSBwZXIgZnJhbWUuCiAKLSAgRGVwZW5kaW5nIG9uIHRoZSBmcmVxdWVuY3kgcmFuZ2Ugc2V0IGluIHRoZSBiaXRzdHJlYW0sIG9ubHkgUU1GLXN1YmJhbmRzIGJldHdlZW4KLSAgPGVtPmxvd1N1YmJhbmQ8L2VtPiBhbmQgPGVtPmhpZ2hTdWJiYW5kPC9lbT4gYXJlIGFkanVzdGVkLgorICBEZXBlbmRpbmcgb24gdGhlIGZyZXF1ZW5jeSByYW5nZSBzZXQgaW4gdGhlIGJpdHN0cmVhbSwgb25seSBRTUYtc3ViYmFuZHMKKyAgYmV0d2VlbiA8ZW0+bG93U3ViYmFuZDwvZW0+IGFuZCA8ZW0+aGlnaFN1YmJhbmQ8L2VtPiBhcmUgYWRqdXN0ZWQuCiAKLSAgU2NhbGluZyBvZiBzcGVjdHJhbCBkYXRhIHRvIG1heGltaXplIFNOUiAoc2VlICNRTUZfU0NBTEVfRkFDVE9SKSBhcyB3ZWxsIGFzIGEgc3BlY2lhbCBNYW50aXNzYS1FeHBvbmVudCBmb3JtYXQKLSAgKCBzZWUgIGNhbGN1bGF0ZVNickVudmVsb3BlKCkgKSBhcmUgYmVpbmcgdXNlZC4gVGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoaXMgbW9kdWxlcyBpcyBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpLgorICBTY2FsaW5nIG9mIHNwZWN0cmFsIGRhdGEgdG8gbWF4aW1pemUgU05SIChzZWUgI1FNRl9TQ0FMRV9GQUNUT1IpIGFzIHdlbGwgYXMgYQorICBzcGVjaWFsIE1hbnRpc3NhLUV4cG9uZW50IGZvcm1hdCAoIHNlZSAgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSApIGFyZSBiZWluZworICB1c2VkLiBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhpcyBtb2R1bGVzIGlzIGNhbGN1bGF0ZVNickVudmVsb3BlKCkuCiAKLSAgXHNhIHNicl9zY2FsZS5oLCAjUU1GX1NDQUxFX0ZBQ1RPUiwgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSwgXHJlZiBkb2N1bWVudGF0aW9uT3ZlcnZpZXcKKyAgXHNhIHNicl9zY2FsZS5oLCAjUU1GX1NDQUxFX0ZBQ1RPUiwgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSwgXHJlZgorICBkb2N1bWVudGF0aW9uT3ZlcnZpZXcKICovCiAKLQogI2luY2x1ZGUgImVudl9jYWxjLmgiCiAKICNpbmNsdWRlICJzYnJkZWNfZnJlcV9zY2EuaCIKQEAgLTEyOSwyMDMgKzE0OSwyNjAgQEAKICNpbmNsdWRlICJzYnJfcmFtLmgiCiAjaW5jbHVkZSAic2JyX3JvbS5oIgogCi0jaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIgICAgICAgICAgIC8qIG5lZWQgRkRLcG93KCkgZm9yIGRlYnVnIG91dHB1dHMgKi8KKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIiAvKiBuZWVkIEZES3BvdygpIGZvciBkZWJ1ZyBvdXRwdXRzICovCiAKLSNpZiBkZWZpbmVkKF9fYXJtX18pCi0jaW5jbHVkZSAiYXJtL2Vudl9jYWxjX2FybS5jcHAiCi0jZW5kaWYKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9EQkwgbnJnUmVmW01BWF9GUkVRX0NPRUZGU107CisgIEZJWFBfREJMIG5yZ0VzdFtNQVhfRlJFUV9DT0VGRlNdOworICBGSVhQX0RCTCBucmdHYWluW01BWF9GUkVRX0NPRUZGU107CisgIEZJWFBfREJMIG5vaXNlTGV2ZWxbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgRklYUF9EQkwgbnJnU2luZVtNQVhfRlJFUV9DT0VGRlNdOwogCi10eXBlZGVmIHN0cnVjdAotewotICAgIEZJWFBfREJMIG5yZ1JlZltNQVhfRlJFUV9DT0VGRlNdOwotICAgIEZJWFBfREJMIG5yZ0VzdFtNQVhfRlJFUV9DT0VGRlNdOwotICAgIEZJWFBfREJMIG5yZ0dhaW5bTUFYX0ZSRVFfQ09FRkZTXTsKLSAgICBGSVhQX0RCTCBub2lzZUxldmVsW01BWF9GUkVRX0NPRUZGU107Ci0gICAgRklYUF9EQkwgbnJnU2luZVtNQVhfRlJFUV9DT0VGRlNdOworICBTQ0hBUiBucmdSZWZfZVtNQVhfRlJFUV9DT0VGRlNdOworICBTQ0hBUiBucmdFc3RfZVtNQVhfRlJFUV9DT0VGRlNdOworICBTQ0hBUiBucmdHYWluX2VbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgU0NIQVIgbm9pc2VMZXZlbF9lW01BWF9GUkVRX0NPRUZGU107CisgIFNDSEFSIG5yZ1NpbmVfZVtNQVhfRlJFUV9DT0VGRlNdOworICAvKiB5ZXQgYW5vdGhlciBleHBvbmVudCBbMF06IGZvciB0cyA8IG5vX2NvbHM7IFsxXTogZm9yIHRzID49IG5vX2NvbHMgKi8KKyAgU0NIQVIgZXhwb25lbnRbMl07Cit9IEVOVl9DQUxDX05SR1M7CiAKLSAgICBTQ0hBUiAgIG5yZ1JlZl9lW01BWF9GUkVRX0NPRUZGU107Ci0gICAgU0NIQVIgICBucmdFc3RfZVtNQVhfRlJFUV9DT0VGRlNdOwotICAgIFNDSEFSICAgbnJnR2Fpbl9lW01BWF9GUkVRX0NPRUZGU107Ci0gICAgU0NIQVIgICBub2lzZUxldmVsX2VbTUFYX0ZSRVFfQ09FRkZTXTsKLSAgICBTQ0hBUiAgIG5yZ1NpbmVfZVtNQVhfRlJFUV9DT0VGRlNdOwotfQotRU5WX0NBTENfTlJHUzsKK3N0YXRpYyB2b2lkIGVxdWFsaXplRmlsdEJ1ZmZlckV4cChGSVhQX0RCTCAqZmlsdEJ1ZmZlciwgU0NIQVIgKmZpbHRCdWZmZXJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqTnJnR2FpbiwgU0NIQVIgKk5yZ0dhaW5fZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViYmFuZHMpOwogCi1zdGF0aWMgdm9pZCBlcXVhbGl6ZUZpbHRCdWZmZXJFeHAoRklYUF9EQkwgKmZpbHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAqZmlsdEJ1ZmZlcl9lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpOcmdHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgKk5yZ0dhaW5fZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgc3ViYmFuZHMpOworc3RhdGljIHZvaWQgY2FsY05yZ1BlclN1YmJhbmQoRklYUF9EQkwgKiphbmFseXNCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiphbmFseXNCdWZmZXJJbWFnLCBpbnQgbG93U3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaWdoU3ViYmFuZCwgaW50IHN0YXJ0X3BvcywgaW50IG5leHRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgZnJhbWVFeHAsIEZJWFBfREJMICpucmdFc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqbnJnRXN0X2UpOwogCi1zdGF0aWMgdm9pZCBjYWxjTnJnUGVyU3ViYmFuZChGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICoqYW5hbHlzQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBsb3dTdWJiYW5kLCBpbnQgaGlnaFN1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc3RhcnRfcG9zLCAgaW50IG5leHRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGZyYW1lRXhwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ0VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpucmdFc3RfZSApOworc3RhdGljIHZvaWQgY2FsY05yZ1BlclNmYihGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqYW5hbHlzQnVmZmVySW1hZywgaW50IG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLCBpbnQgc3RhcnRfcG9zLCBpbnQgbmV4dF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGlucHV0X2UsIEZJWFBfREJMICpucmdfZXN0LCBTQ0hBUiAqbnJnX2VzdF9lKTsKIAotc3RhdGljIHZvaWQgY2FsY05yZ1BlclNmYihGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgKmZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICBpbnQgbmV4dF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBpbnB1dF9lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnX2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKm5yZ19lc3RfZSApOworc3RhdGljIHZvaWQgY2FsY1N1YmJhbmRHYWluKEZJWFBfREJMIG5yZ1JlZiwgU0NIQVIgbnJnUmVmX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyAqbnJncywgaW50IGMsIEZJWFBfREJMIHRtcE5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIHRtcE5vaXNlX2UsIFVDSEFSIHNpbmVQcmVzZW50RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBzaW5lTWFwcGVkLCBpbnQgbm9Ob2lzZUZsYWcpOwogCi1zdGF0aWMgdm9pZCBjYWxjU3ViYmFuZEdhaW4oRklYUF9EQkwgIG5yZ1JlZiwgU0NIQVIgbnJnUmVmX2UsIEVOVl9DQUxDX05SR1MqIG5yZ3MsIGludCBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICB0bXBOb2lzZSwgU0NIQVIgdG1wTm9pc2VfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgc2luZVByZXNlbnRGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICBzaW5lTWFwcGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZyk7CitzdGF0aWMgdm9pZCBjYWxjQXZnR2FpbihFTlZfQ0FMQ19OUkdTICpucmdzLCBpbnQgbG93U3ViYmFuZCwgaW50IGhpZ2hTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnN1bVJlZl9tLCBTQ0hBUiAqc3VtUmVmX2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcHRyQXZnR2Fpbl9tLCBTQ0hBUiAqcHRyQXZnR2Fpbl9lKTsKIAotc3RhdGljIHZvaWQgY2FsY0F2Z0dhaW4oRU5WX0NBTENfTlJHUyogbnJncywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbG93U3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgaGlnaFN1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKnN1bVJlZl9tLAotICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICpzdW1SZWZfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqcHRyQXZnR2Fpbl9tLAotICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICpwdHJBdmdHYWluX2UpOworc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RfRWxkR3JpZChGSVhQX0RCTCAqcHRyUmVhbCwgRU5WX0NBTENfTlJHUyAqbnJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnB0ckhhcm1JbmRleCwgaW50IGxvd1N1YmJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9TdWJiYW5kcywgaW50IHNjYWxlX2NoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vTm9pc2VGbGFnLCBpbnQgKnB0clBoYXNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2FsZV9kaWZmX2xvdyk7CiAKLXN0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90X0VsZEdyaWQoRklYUF9EQkwgICpwdHJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwdHJIYXJtSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbG93U3ViYmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9TdWJiYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBzY2FsZV9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9Ob2lzZUZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAqcHRyUGhhc2VJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBzY2FsZV9kaWZmX2xvdyk7CitzdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdExDKEZJWFBfREJMICpwdHJSZWFsLCBFTlZfQ0FMQ19OUkdTICpucmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcHRySGFybUluZGV4LCBpbnQgbG93U3ViYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub1N1YmJhbmRzLCBpbnQgc2NhbGVfY2hhbmdlLCBpbnQgbm9Ob2lzZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcHRyUGhhc2VJbmRleCk7CiAKLXN0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90TEMoRklYUF9EQkwgICpwdHJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwdHJIYXJtSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbG93U3ViYmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9TdWJiYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBzY2FsZV9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9Ob2lzZUZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAqcHRyUGhhc2VJbmRleCk7Ci1zdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdEhRKEZJWFBfREJMICAqcHRyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqcHRySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhfc2JyX2NhbF9lbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGxvd1N1YmJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIG5vU3ViYmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgc2NhbGVfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgc21vb3RoX3JhdGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIG5vTm9pc2VGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKKy8qKgorICogXGJyaWVmIFZhcmlhbnQgb2YgYWRqdXN0VGltZVNsb3RIUSgpIHdoaWNoIG9ubHkgcmVnYXJkcyBnYWluIGFuZCBub2lzZSBidXQgbm8KKyAqIGFkZGl0aW9uYWwgaGFybW9uaWNzCisgKi8KK3N0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90SFFfR2FpbkFuZE5vaXNlKAorICAgIEZJWFBfREJMICpwdHJSZWFsLCBGSVhQX0RCTCAqcHRySW1hZywKKyAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LCBFTlZfQ0FMQ19OUkdTICpucmdzLAorICAgIGludCBsb3dTdWJiYW5kcywgaW50IG5vU3ViYmFuZHMsIGludCBzY2FsZV9jaGFuZ2UsIEZJWFBfU0dMIHNtb290aF9yYXRpbywKKyAgICBpbnQgbm9Ob2lzZUZsYWcsIGludCBmaWx0QnVmZmVyTm9pc2VTaGlmdCk7CisvKioKKyAqIFxicmllZiBWYXJpYW50IG9mIGFkanVzdFRpbWVTbG90SFEoKSB3aGljaCBvbmx5IGFkZHMgdGhlIGFkZGl0aW9uYWwgaGFybW9uaWNzCisgKi8KK3N0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90SFFfQWRkSGFybW9uaWNzKAorICAgIEZJWFBfREJMICpwdHJSZWFsLCBGSVhQX0RCTCAqcHRySW1hZywKKyAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LCBFTlZfQ0FMQ19OUkdTICpucmdzLAorICAgIGludCBsb3dTdWJiYW5kcywgaW50IG5vU3ViYmFuZHMsIGludCBzY2FsZV9jaGFuZ2UpOwogCitzdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdEhRKEZJWFBfREJMICpwdHJSZWFsLCBGSVhQX0RCTCAqcHRySW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyAqbnJncywgaW50IGxvd1N1YmJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9TdWJiYW5kcywgaW50IHNjYWxlX2NoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgc21vb3RoX3JhdGlvLCBpbnQgbm9Ob2lzZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWx0QnVmZmVyTm9pc2VTaGlmdCk7CiAKIC8qIQogICBcYnJpZWYgICAgIE1hcCBzaW5lIGZsYWdzIGZyb20gYml0c3RyZWFtIHRvIFFNRiBiYW5kcwogCi0gIFRoZSBiaXRzdHJlYW0gY2FycmllcyBvbmx5IDEgc2luZSBmbGFnIHBlciBiYW5kIGFuZCBmcmFtZS4KLSAgVGhpcyBmdW5jdGlvbiBtYXBzIGV2ZXJ5IHNpbmUgZmxhZyBmcm9tIHRoZSBiaXRzdHJlYW0gdG8gYSBzcGVjaWZpYyBRTUYgc3ViYmFuZAotICBhbmQgdG8gYSBzcGVjaWZpYyBlbnZlbG9wZSB3aGVyZSB0aGUgc2luZSBzaGFsbCBzdGFydC4KLSAgVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gdGhlIHZlY3RvciBzaW5lTWFwcGVkIHdoaWNoIGNvbnRhaW5zIG9uZSBlbnRyeSBwZXIKLSAgUU1GIHN1YmJhbmQuIFRoZSB2YWx1ZSBvZiBhbiBlbnRyeSBzcGVjaWZpZXMgdGhlIGVudmVsb3BlIHdoZXJlIGEgc2luZQotICBzaGFsbCBzdGFydC4gQSB2YWx1ZSBvZiAjTUFYX0VOVkVMT1BFUyBpbmRpY2F0ZXMgdGhhdCBubyBzaW5lIGlzIHByZXNlbnQKLSAgaW4gdGhlIHN1YmJhbmQuCi0gIFRoZSBtaXNzaW5nIGhhcm1vbmljcyBmbGFncyBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZSAoaGFybUZsYWdzUHJldikgZGV0ZXJtaW5lCi0gIGlmIGEgc2luZSBzdGFydHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUgb3IgYXQgdGhlIHRyYW5zaWVudCBwb3NpdGlvbi4KLSAgQWRkaXRpb25hbGx5LCB0aGUgZmxhZ3MgaW4gaGFybUZsYWdzUHJldiBhcmUgYmVpbmcgdXBkYXRlZCBieSB0aGlzIGZ1bmN0aW9uCi0gIGZvciB0aGUgbmV4dCBmcmFtZS4KKyAgVGhlIGJpdHN0cmVhbSBjYXJyaWVzIG9ubHkgMSBzaW5lIGZsYWcgcGVyIGJhbmQgKFNmYikgYW5kIGZyYW1lLgorICBUaGlzIGZ1bmN0aW9uIG1hcHMgZXZlcnkgc2luZSBmbGFnIGZyb20gdGhlIGJpdHN0cmVhbSB0byBhIHNwZWNpZmljIFFNRgorICBzdWJiYW5kIGFuZCB0byBhIHNwZWNpZmljIGVudmVsb3BlIHdoZXJlIHRoZSBzaW5lIHNoYWxsIHN0YXJ0LiBUaGUgcmVzdWx0IGlzCisgIHN0b3JlZCBpbiB0aGUgdmVjdG9yIHNpbmVNYXBwZWQgd2hpY2ggY29udGFpbnMgb25lIGVudHJ5IHBlciBRTUYgc3ViYmFuZC4gVGhlCisgIHZhbHVlIG9mIGFuIGVudHJ5IHNwZWNpZmllcyB0aGUgZW52ZWxvcGUgd2hlcmUgYSBzaW5lIHNoYWxsIHN0YXJ0LiBBIHZhbHVlIG9mCisgIDMyIGluZGljYXRlcyB0aGF0IG5vIHNpbmUgaXMgcHJlc2VudCBpbiB0aGUgc3ViYmFuZC4gVGhlIG1pc3NpbmcgaGFybW9uaWNzCisgIGZsYWdzIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lIChoYXJtRmxhZ3NQcmV2KSBkZXRlcm1pbmUgaWYgYSBzaW5lIHN0YXJ0cyBhdAorICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmFtZSBvciBhdCB0aGUgdHJhbnNpZW50IHBvc2l0aW9uLiBBZGRpdGlvbmFsbHksIHRoZQorICBmbGFncyBpbiBoYXJtRmxhZ3NQcmV2IGFyZSBiZWluZyB1cGRhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gZm9yIHRoZSBuZXh0IGZyYW1lLgogKi8KLXN0YXRpYyB2b2lkIG1hcFNpbmVGbGFncyhVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAgICAvKiE8IEJhbmQgYm9yZGVycyAodGhlcmUncyBvbmx5IDEgZmxhZyBwZXIgYmFuZCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNmYiwgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBpbiB0aGUgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqYWRkSGFybW9uaWNzLCAgICAgICAgICAgLyohPCB2ZWN0b3Igd2l0aCAxIGZsYWcgcGVyIHNmYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaGFybUZsYWdzUHJldiwgICAgICAgICAgIC8qITwgUGFja2VkICdhZGRIYXJtb25pY3MnICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5FbnYsICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2llbnQgcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqc2luZU1hcHBlZCkgICAgICAgICAgICAvKiE8IFJlc3VsdGluZyB2ZWN0b3Igb2Ygc2luZSBzdGFydCBwb3NpdGlvbnMgZm9yIGVhY2ggUU1GIGJhbmQgKi8KK3N0YXRpYyB2b2lkIG1hcFNpbmVGbGFncygKKyAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgLyohPCBCYW5kIGJvcmRlcnMgKHRoZXJlJ3Mgb25seSAxIGZsYWcgcGVyIGJhbmQpICovCisgICAgaW50IG5TZmIsICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGluIHRoZSB0YWJsZSAqLworICAgIFVMT05HICphZGRIYXJtb25pY3MsICAvKiE8IFBhY2tlZCBhZGRIYXJtb25pY3Mgb2YgY3VycmVudCBmcmFtZSAoYWxpZ25lZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTVNCKSAqLworICAgIFVMT05HICpoYXJtRmxhZ3NQcmV2LCAvKiE8IFBhY2tlZCBhZGRIYXJtb25pY3Mgb2YgcHJldmlvdXMgZnJhbWUgKGFsaWduZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIExTQikgKi8KKyAgICBVTE9ORyAqaGFybUZsYWdzUHJldkFjdGl2ZSwgLyohPCBQYWNrZWQgc2luZU1hcHBlZCBvZiBwcmV2aW91cyBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxpZ25lZCB0byB0aGUgTFNCKSAqLworICAgIGludCB0cmFuRW52LCAgICAgICAgICAgICAgICAvKiE8IFRyYW5zaWVudCBwb3NpdGlvbiAqLworICAgIFNDSEFSICpzaW5lTWFwcGVkKSAvKiE8IFJlc3VsdGluZyB2ZWN0b3Igb2Ygc2luZSBzdGFydCBwb3NpdGlvbnMgZm9yIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUU1GIGJhbmQgKi8KIAogewogICBpbnQgaTsKLSAgaW50IGxvd1N1YmJhbmQyID0gZnJlcUJhbmRUYWJsZVswXTw8MTsKLSAgaW50IGJpdGNvdW50ID0gMDsKLSAgaW50IG9sZGZsYWdzID0gKmhhcm1GbGFnc1ByZXY7Ci0gIGludCBuZXdmbGFncyA9IDA7CisgIGludCBiaXRjb3VudCA9IDMxOworICBVTE9ORyBoYXJtRmxhZ3NRbWZCYW5kc1tBRERfSEFSTU9OSUNTX0ZMQUdTX1NJWkVdID0gezB9OworICBVTE9ORyAqY3VyRmxhZ3MgPSBhZGRIYXJtb25pY3M7CiAKICAgLyoKLSAgICBGb3JtYXQgb2YgaGFybUZsYWdzUHJldjoKKyAgICBGb3JtYXQgb2YgYWRkSGFybW9uaWNzIChhbGlnbmVkIHRvIE1TQik6CiAKLSAgICBmaXJzdCB3b3JkID0gZmxhZ3MgZm9yIGhpZ2hlc3QgMTYgc2ZiIGJhbmRzIGluIHVzZQotICAgIHNlY29uZCB3b3JkID0gZmxhZ3MgZm9yIG5leHQgbG93ZXIgMTYgc2ZiIGJhbmRzIChpZiBwcmVzZW50KQotICAgIHRoaXJkIHdvcmQgPSBmbGFncyBmb3IgbG93ZXN0IDE2IHNmYiBiYW5kcyAoaWYgcHJlc2VudCkKKyAgICAgIFVwIHRvIE1BWF9GUkVRX0NPRUZGUyBzZmIgYmFuZHMgY2FuIGJlIGZsYWdnZWQgZm9yIGEgc2lnbi4KKyAgICAgIGZpcnN0IHdvcmQgID0gZmxhZ3MgZm9yIGxvd2VzdCAzMiBzZmIgYmFuZHMgaW4gdXNlCisgICAgICBzZWNvbmQgd29yZCA9IGZsYWdzIGZvciBoaWdlc3QgMzIgc2ZiIGJhbmRzIChpZiBwcmVzZW50KQogCi0gICAgVXAgdG8gTUFYX0ZSRVFfQ09FRkZTIHNmYiBiYW5kcyBjYW4gYmUgZmxhZ2dlZCBmb3IgYSBzaWduLgotICAgIFRoZSBsb3dlc3QgYml0IG9mIHRoZSBmaXJzdCB3b3JkIGNvcnJlc3BvbmRzIHRvIHRoZSBfaGlnaGVzdF8gc2ZiIGJhbmQgaW4gdXNlLgotICAgIFRoaXMgaXMgZW5zdXJlcyB0aGF0IGVhY2ggZmxhZyBpcyAgbWFwcGVkIHRvIHRoZSBzYW1lIFFNRiBiYW5kIGV2ZW4gYWZ0ZXIgYQotICAgIGNoYW5nZSBvZiB0aGUgY3Jvc3NvdmVyLWZyZXF1ZW5jeS4KKyAgICBGb3JtYXQgb2YgaGFybUZsYWdzUHJldiAoYWxpZ25lZCB0byBMU0IpOgorCisgICAgICBJbmRleCBpcyBhYnNvbHV0ZSAobm90IHJlbGF0aXZlIHRvIGxzYikgc28gaXQgaXMgY29ycmVjdCBldmVuIGlmIGxzYgorICAgIGNoYW5nZXMgZmlyc3Qgd29yZCAgPSBmbGFncyBmb3IgbG93ZXN0IDMyIHFtZiBiYW5kcyAoMC4uLjMxKSBzZWNvbmQgd29yZCA9CisgICAgZmxhZ3MgZm9yIG5leHQgaGlnaGVyIDMyIHFtZiBiYW5kcyAoMzIuLi42MykKKwogICAqLwogCi0KICAgLyogUmVzZXQgdGhlIG91dHB1dCB2ZWN0b3IgZmlyc3QgKi8KLSAgRkRLbWVtc2V0KHNpbmVNYXBwZWQsIE1BWF9FTlZFTE9QRVMsTUFYX0ZSRVFfQ09FRkZTKTsgLyogTUFYX0VOVkVMT1BFUyBtZWFucyAnbm8gc2luZScgKi8KKyAgRkRLbWVtc2V0KHNpbmVNYXBwZWQsIDMyLAorICAgICAgICAgICAgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mKFNDSEFSKSk7IC8qIDMyIG1lYW5zICdubyBzaW5lJyAqLworICBGREttZW1jbGVhcihoYXJtRmxhZ3NQcmV2QWN0aXZlLCBBRERfSEFSTU9OSUNTX0ZMQUdTX1NJWkUgKiBzaXplb2YoVUxPTkcpKTsKKyAgZm9yIChpID0gMDsgaSA8IG5TZmI7IGkrKykgeworICAgIFVMT05HIG1hc2tTZmIgPQorICAgICAgICAxIDw8IGJpdGNvdW50OyAvKiBtYXNrIHRvIGV4dHJhY3QgYWRkSGFybW9uaWNzIGZsYWcgb2YgY3VycmVudCBTZmIgKi8KIAotICBmcmVxQmFuZFRhYmxlICs9IG5TZmI7Ci0gIGFkZEhhcm1vbmljcyAgKz0gblNmYi0xOworICAgIGlmICgqY3VyRmxhZ3MgJiBtYXNrU2ZiKSB7ICAgICAgICAgIC8qIFRoZXJlIGlzIGEgc2luZSBpbiB0aGlzIGJhbmQgKi8KKyAgICAgIGNvbnN0IGludCBsc2IgPSBmcmVxQmFuZFRhYmxlWzBdOyAvKiBzdGFydCBvZiBzYnIgcmFuZ2UgKi8KKyAgICAgIC8qIHFtZiBiYW5kIHRvIHdoaWNoIHNpbmUgc2hvdWxkIGJlIGFkZGVkICovCisgICAgICBjb25zdCBpbnQgcW1mQmFuZCA9IChmcmVxQmFuZFRhYmxlW2ldICsgZnJlcUJhbmRUYWJsZVtpICsgMV0pID4+IDE7CisgICAgICBjb25zdCBpbnQgcW1mQmFuZERpdjMyID0gcW1mQmFuZCA+PiA1OworICAgICAgY29uc3QgaW50IG1hc2tRbWZCYW5kID0KKyAgICAgICAgICAxIDw8IChxbWZCYW5kICYKKyAgICAgICAgICAgICAgICAzMSk7IC8qIG1hc2sgdG8gZXh0cmFjdCBoYXJtb25pYyBmbGFnIGZyb20gcHJldkZsYWdzICovCiAKLSAgZm9yIChpPW5TZmI7IGkhPTA7IGktLSkgewotICAgIGludCB1aSA9ICpmcmVxQmFuZFRhYmxlLS07ICAgICAgICAgICAgICAgICAvKiBVcHBlciBsaW1pdCBvZiB0aGUgY3VycmVudCBzY2FsZSBmYWN0b3IgYmFuZC4gKi8KLSAgICBpbnQgbGkgPSAqZnJlcUJhbmRUYWJsZTsgICAgICAgICAgICAgICAgICAgLyogTG93ZXIgbGltaXQgb2YgdGhlIGN1cnJlbnQgc2NhbGUgZmFjdG9yIGJhbmQuICovCi0KLSAgICBpZiAoICphZGRIYXJtb25pY3MtLSApIHsgICAgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgYSBzaW5lIGluIHRoaXMgYmFuZCAqLwotCi0gICAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgYml0Y291bnQ7Ci0gICAgICBuZXdmbGFncyB8PSBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBmbGFnICovCisgICAgICAvKiBtYXBwaW5nIG9mIHNmYiB3aXRoIHNpbmUgdG8gYSBjZXJ0YWluIHFtZiBiYW5kIC0+IGZvciBoYXJtRmxhZ3NQcmV2ICovCisgICAgICBoYXJtRmxhZ3NRbWZCYW5kc1txbWZCYW5kRGl2MzJdIHw9IG1hc2tRbWZCYW5kOwogCiAgICAgICAvKgotICAgICAgICBJZiB0aGVyZSB3YXMgYSBzaW5lIGluIHRoZSBsYXN0IGZyYW1lLCBsZXQgaXQgY29udGludWUgZnJvbSB0aGUgZmlyc3QgZW52ZWxvcGUgb24KLSAgICAgICAgZWxzZSBzdGFydCBhdCB0aGUgdHJhbnNpZW50IHBvc2l0aW9uLgorICAgICAgICBJZiB0aGVyZSB3YXMgYSBzaW5lIGluIHRoZSBsYXN0IGZyYW1lLCBsZXQgaXQgY29udGludWUgZnJvbSB0aGUgZmlyc3QKKyAgICAgICAgZW52ZWxvcGUgb24gZWxzZSBzdGFydCBhdCB0aGUgdHJhbnNpZW50IHBvc2l0aW9uLiBJbmRleGluZyBvZiBzaW5lTWFwcGVkCisgICAgICAgIHN0YXJ0cyByZWxhdGl2ZSB0byBsc2IuCiAgICAgICAqLwotICAgICAgc2luZU1hcHBlZFsodWkrbGktbG93U3ViYmFuZDIpID4+IDFdID0gKCBvbGRmbGFncyAmIG1hc2sgKSA/IDAgOiB0cmFuRW52OworICAgICAgc2luZU1hcHBlZFtxbWZCYW5kIC0gbHNiXSA9CisgICAgICAgICAgKGhhcm1GbGFnc1ByZXZbcW1mQmFuZERpdjMyXSAmIG1hc2tRbWZCYW5kKSA/IDAgOiB0cmFuRW52OworICAgICAgaWYgKHNpbmVNYXBwZWRbcW1mQmFuZCAtIGxzYl0gPCBQVkNfTlRJTUVTTE9UKSB7CisgICAgICAgIGhhcm1GbGFnc1ByZXZBY3RpdmVbcW1mQmFuZERpdjMyXSB8PSBtYXNrUW1mQmFuZDsKKyAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoKCsrYml0Y291bnQgPT0gMTYpIHx8IGk9PTEpIHsKLSAgICAgIGJpdGNvdW50ID0gMDsKLSAgICAgICpoYXJtRmxhZ3NQcmV2KysgPSBuZXdmbGFnczsKLSAgICAgIG9sZGZsYWdzID0gKmhhcm1GbGFnc1ByZXY7ICAgICAgICAgICAgICAgLyogRmV0Y2ggMTYgb2YgdGhlIG9sZCBmbGFncyAqLwotICAgICAgbmV3ZmxhZ3MgPSAwOworICAgIGlmIChiaXRjb3VudC0tID09IDApIHsKKyAgICAgIGJpdGNvdW50ID0gMzE7CisgICAgICBjdXJGbGFncysrOwogICAgIH0KICAgfQorICBGREttZW1jcHkoaGFybUZsYWdzUHJldiwgaGFybUZsYWdzUW1mQmFuZHMsCisgICAgICAgICAgICBzaXplb2YoVUxPTkcpICogQUREX0hBUk1PTklDU19GTEFHU19TSVpFKTsKIH0KIAorLyohCisgIFxicmllZiAgICAgUmVzdG9yZSBzaW5lTWFwcGVkIG9mIHByZXZpb3VzIGZyYW1lCisKKyAgRm9yIFBWQyBpdCBtaWdodCBoYXBwZW4gdGhhdCB0aGUgUFZDIGZyYW1pbmcgKGFsd2F5cyAwKSBpcyBvdXQgb2Ygc3luYyB3aXRoCisgIHRoZSBTQlIgZnJhbWluZy4gVGhlIGFkZGluZyBvZiBhZGRpdGlvbmFsIGhhcm1vbmljcyBpcyBkb25lIGJhc2VkIG9uIHRoZSBTQlIKKyAgZnJhbWluZy4gSWYgdGhlIFNCUiBmcmFtaW5nIGlzIHRyYWlsaW5nIHRoZSBQVkMgZnJhbWluZyB0aGUgc2luZSBtYXBwaW5nIG9mCisgIHRoZSBwcmV2aW91cyBTQlIgZnJhbWUgbmVlZHMgdG8gYmUgdXNlZCBmb3IgdGhlIG92ZXJsYXBwaW5nIHRpbWUgc2xvdHMuCisqLworLypzdGF0aWMqLyB2b2lkIG1hcFNpbmVGbGFnc1B2YygKKyAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAgLyohPCBCYW5kIGJvcmRlcnMgKHRoZXJlJ3Mgb25seSAxIGZsYWcgcGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQpICovCisgICAgaW50IG5TZmIsICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGluIHRoZSB0YWJsZSAqLworICAgIFVMT05HICpoYXJtRmxhZ3NQcmV2LCAgICAgICAvKiE8IFBhY2tlZCBhZGRIYXJtb25pY3Mgb2YgcHJldmlvdXMgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsaWduZWQgdG8gdGhlIE1TQikgKi8KKyAgICBVTE9ORyAqaGFybUZsYWdzUHJldkFjdGl2ZSwgLyohPCBQYWNrZWQgc2luZU1hcHBlZCBvZiBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSAoYWxpZ25lZCB0byB0aGUgTFNCKSAqLworICAgIFNDSEFSICpzaW5lTWFwcGVkLCAgICAgICAgICAvKiE8IFJlc3VsdGluZyB2ZWN0b3Igb2Ygc2luZSBzdGFydCBwb3NpdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGVhY2ggUU1GIGJhbmQgKi8KKyAgICBpbnQgc2ludXNvaWRhbFBvcywgICAgICAgICAgLyohPCBzaW51c29pZGFsIHBvc2l0aW9uICovCisgICAgU0NIQVIgKnNpbnVzb2lkYWxQb3NQcmV2LCAgIC8qITwgc2ludXNvaWRhbCBwb3NpdGlvbiBvZiBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSAqLworICAgIGludCB0cmFpbGluZ1NickZyYW1lKSAgICAgICAvKiE8IGluZGljYXRpb24gaWYgdGhlIFNCUiBmcmFtaW5nIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nIHRoZSBQVkMgZnJhbWluZyAqLworeworICAvKiBSZXNldCB0aGUgb3V0cHV0IHZlY3RvciBmaXJzdCAqLworICBGREttZW1zZXQoc2luZU1hcHBlZCwgMzIsIE1BWF9GUkVRX0NPRUZGUyk7IC8qIDMyIG1lYW5zICdubyBzaW5lJyAqLworCisgIGlmICh0cmFpbGluZ1NickZyYW1lKSB7CisgICAgLyogcmVzdG9yZSBzaW5lTWFwcGVkW10gb2YgcHJldmlvdXMgZnJhbWUgKi8KKyAgICBpbnQgaTsKKyAgICBjb25zdCBpbnQgbHNiID0gZnJlcUJhbmRUYWJsZVswXTsKKyAgICBjb25zdCBpbnQgdXNiID0gZnJlcUJhbmRUYWJsZVtuU2ZiXTsKKyAgICBmb3IgKGkgPSBsc2I7IGkgPCB1c2I7IGkrKykgeworICAgICAgY29uc3QgaW50IHFtZkJhbmREaXYzMiA9IGkgPj4gNTsKKyAgICAgIGNvbnN0IGludCBtYXNrUW1mQmFuZCA9CisgICAgICAgICAgMSA8PCAoaSAmIDMxKTsgLyogbWFzayB0byBleHRyYWN0IGhhcm1vbmljIGZsYWcgZnJvbSBwcmV2RmxhZ3MgKi8KKworICAgICAgLyogVHdvIGNhc2VzIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCAuLi4gKi8KKyAgICAgIGlmIChoYXJtRmxhZ3NQcmV2QWN0aXZlW3FtZkJhbmREaXYzMl0gJiBtYXNrUW1mQmFuZCkgeworICAgICAgICAvKiB0aGUgc2luZSBtYXBwaW5nIGFscmVhZHkgc3RhcnRlZCBsYXN0IFBWQyBmcmFtZSAtPiBzZWFtbGVzc2x5CisgICAgICAgICAqIGNvbnRpbnVlICovCisgICAgICAgIHNpbmVNYXBwZWRbaSAtIGxzYl0gPSAwOworICAgICAgfSBlbHNlIGlmIChoYXJtRmxhZ3NQcmV2W3FtZkJhbmREaXYzMl0gJiBtYXNrUW1mQmFuZCkgeworICAgICAgICAvKiBzaW51c29pZGFsUG9zIG9mIHByZXYgUFZDIGZyYW1lIHdhcyA+PSBQVkNfTlRJTUVTTE9UIC0+IHNpbmUgc3RhcnRzCisgICAgICAgICAqIGluIHRoaXMgZnJhbWUgKi8KKyAgICAgICAgc2luZU1hcHBlZFtpIC0gbHNiXSA9CisgICAgICAgICAgICAqc2ludXNvaWRhbFBvc1ByZXYgLSBQVkNfTlRJTUVTTE9UOyAvKiB3ZSBhcmUgMTYgc2JyIHRpbWUgc2xvdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFoZWFkIG9mIGxhc3QgZnJhbWUgbm93ICovCisgICAgICB9CisgICAgfQorICB9CisgICpzaW51c29pZGFsUG9zUHJldiA9IHNpbnVzb2lkYWxQb3M7Cit9CiAKIC8qIQogICBcYnJpZWYgICAgIFJlZHVjZSBnYWluLWFkanVzdG1lbnQgaW5kdWNlZCBhbGlhc2luZyBmb3IgcmVhbCB2YWx1ZWQgZmlsdGVyYmFuay4KICovCi0vKnN0YXRpYyovIHZvaWQKLWFsaWFzaW5nUmVkdWN0aW9uKEZJWFBfREJMKiBkZWdyZWVBbGlhcywgICAgICAgLyohPCBlc3RpbWF0ZWQgYWxpYXNpbmcgZm9yIGVhY2ggUU1GIGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCi0gICAgICAgICAgICAgICAgICBpbnQqICAgICAgdXNlQWxpYXNSZWR1Y3Rpb24sIC8qITwgc3ludGhldGljIHNpbmUgZW5nZXJneSBmb3IgZWFjaCBzdWJiYW5kLCB1c2VkIGFzIGZsYWcgKi8KLSAgICAgICAgICAgICAgICAgIGludCAgICAgICBub1N1YmJhbmRzKSAgICAgICAgLyohPCBudW1iZXIgb2YgUU1GIGNoYW5uZWxzIHRvIHByb2Nlc3MgKi8KKy8qc3RhdGljKi8gdm9pZCBhbGlhc2luZ1JlZHVjdGlvbigKKyAgICBGSVhQX0RCTCAqZGVncmVlQWxpYXMsIC8qITwgZXN0aW1hdGVkIGFsaWFzaW5nIGZvciBlYWNoIFFNRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAqLworICAgIEVOVl9DQUxDX05SR1MgKm5yZ3MsCisgICAgVUNIQVIgKnVzZUFsaWFzUmVkdWN0aW9uLCAvKiE8IHN5bnRoZXRpYyBzaW5lIGVuZXJneSBmb3IgZWFjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViYmFuZCwgdXNlZCBhcyBmbGFnICovCisgICAgaW50IG5vU3ViYmFuZHMpICAgICAgICAgICAvKiE8IG51bWJlciBvZiBRTUYgY2hhbm5lbHMgdG8gcHJvY2VzcyAqLwogewotICBGSVhQX0RCTCogbnJnR2FpbiAgID0gbnJncy0+bnJnR2FpbjsgICAgICAgICAgLyohPCBzdWJiYW5kIGdhaW5zIHRvIGJlIG1vZGlmaWVkICovCi0gIFNDSEFSKiAgICBucmdHYWluX2UgPSBucmdzLT5ucmdHYWluX2U7ICAgICAgICAvKiE8IHN1YmJhbmQgZ2FpbnMgdG8gYmUgbW9kaWZpZWQgKGV4cG9uZW50cykgKi8KLSAgRklYUF9EQkwqIG5yZ0VzdCAgICA9IG5yZ3MtPm5yZ0VzdDsgICAgICAgICAgIC8qITwgc3ViYmFuZCBlbmVyZ3kgYmVmb3JlIGFtcGxpZmljYXRpb24gKi8KLSAgU0NIQVIqICAgIG5yZ0VzdF9lICA9IG5yZ3MtPm5yZ0VzdF9lOyAgICAgICAgIC8qITwgc3ViYmFuZCBlbmVyZ3kgYmVmb3JlIGFtcGxpZmljYXRpb24gKGV4cG9uZW50cykgKi8KKyAgRklYUF9EQkwgKm5yZ0dhaW4gPSBucmdzLT5ucmdHYWluOyAvKiE8IHN1YmJhbmQgZ2FpbnMgdG8gYmUgbW9kaWZpZWQgKi8KKyAgU0NIQVIgKm5yZ0dhaW5fZSA9CisgICAgICBucmdzLT5ucmdHYWluX2U7IC8qITwgc3ViYmFuZCBnYWlucyB0byBiZSBtb2RpZmllZCAoZXhwb25lbnRzKSAqLworICBGSVhQX0RCTCAqbnJnRXN0ID0gbnJncy0+bnJnRXN0OyAvKiE8IHN1YmJhbmQgZW5lcmd5IGJlZm9yZSBhbXBsaWZpY2F0aW9uICovCisgIFNDSEFSICpucmdFc3RfZSA9CisgICAgICBucmdzLT5ucmdFc3RfZTsgLyohPCBzdWJiYW5kIGVuZXJneSBiZWZvcmUgYW1wbGlmaWNhdGlvbiAoZXhwb25lbnRzKSAqLwogICBpbnQgZ3JvdXBpbmcgPSAwLCBpbmRleCA9IDAsIG5vR3JvdXBzLCBrOwogICBpbnQgZ3JvdXBWZWN0b3JbTUFYX0ZSRVFfQ09FRkZTXTsKIAogICAvKiBDYWxjdWxhdGUgZ3JvdXBpbmcqLwotICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kcy0xOyBrKysgKXsKLSAgICBpZiAoIChkZWdyZWVBbGlhc1trICsgMV0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIHVzZUFsaWFzUmVkdWN0aW9uW2tdICkgewotICAgICAgaWYoZ3JvdXBpbmc9PTApeworICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kcyAtIDE7IGsrKykgeworICAgIGlmICgoZGVncmVlQWxpYXNbayArIDFdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJiB1c2VBbGlhc1JlZHVjdGlvbltrXSkgeworICAgICAgaWYgKGdyb3VwaW5nID09IDApIHsKICAgICAgICAgZ3JvdXBWZWN0b3JbaW5kZXgrK10gPSBrOwogICAgICAgICBncm91cGluZyA9IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlewotICAgICAgICBpZihncm91cFZlY3RvcltpbmRleC0xXSArIDMgPT0gayl7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZ3JvdXBWZWN0b3JbaW5kZXggLSAxXSArIDMgPT0gaykgewogICAgICAgICAgIGdyb3VwVmVjdG9yW2luZGV4KytdID0gayArIDE7CiAgICAgICAgICAgZ3JvdXBpbmcgPSAwOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICBpZihncm91cGluZyl7Ci0gICAgICAgIGlmKHVzZUFsaWFzUmVkdWN0aW9uW2tdKQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoZ3JvdXBpbmcpIHsKKyAgICAgICAgaWYgKHVzZUFsaWFzUmVkdWN0aW9uW2tdKQogICAgICAgICAgIGdyb3VwVmVjdG9yW2luZGV4KytdID0gayArIDE7CiAgICAgICAgIGVsc2UKICAgICAgICAgICBncm91cFZlY3RvcltpbmRleCsrXSA9IGs7CkBAIC0zMzQsOTAgKzQxMSwzODQgQEAKICAgICB9CiAgIH0KIAotICBpZihncm91cGluZyl7CisgIGlmIChncm91cGluZykgewogICAgIGdyb3VwVmVjdG9yW2luZGV4KytdID0gbm9TdWJiYW5kczsKICAgfQogICBub0dyb3VwcyA9IGluZGV4ID4+IDE7CiAKLQogICAvKkNhbGN1bGF0ZSBuZXcgZ2FpbiovCi0gIGZvciAoaW50IGdyb3VwID0gMDsgZ3JvdXAgPCBub0dyb3VwczsgZ3JvdXAgKyspIHsKLSAgICBGSVhQX0RCTCBucmdPcmlnID0gRkwyRlhDT05TVF9EQkwoMC4wZik7ICAgIC8qIE9yaWdpbmFsIHNpZ25hbCBlbmVyZ3kgaW4gY3VycmVudCBncm91cCBvZiBiYW5kcyAqLwotICAgIFNDSEFSICAgIG5yZ09yaWdfZSA9IDA7Ci0gICAgRklYUF9EQkwgbnJnQW1wID0gRkwyRlhDT05TVF9EQkwoMC4wZik7ICAgICAvKiBBbXBsaWZpZWQgc2lnbmFsIGVuZXJneSBpbiBncm91cCAodXNpbmcgY3VycmVudCBnYWlucykgKi8KLSAgICBTQ0hBUiAgICBucmdBbXBfZSA9IDA7Ci0gICAgRklYUF9EQkwgbnJnTW9kID0gRkwyRlhDT05TVF9EQkwoMC4wZik7ICAgLyogU2lnbmFsIGVuZXJneSBpbiBncm91cCB3aGVuIGFwcGx5aW5nIG1vZGlmaWVkIGdhaW5zICovCi0gICAgU0NIQVIgICAgbnJnTW9kX2UgPSAwOwotICAgIEZJWFBfREJMIGdyb3VwR2FpbjsgICAgICAgICAvKiBUb3RhbCBlbmVyZ3kgZ2FpbiBpbiBncm91cCAqLwotICAgIFNDSEFSICAgIGdyb3VwR2Fpbl9lOwotICAgIEZJWFBfREJMIGNvbXBlbnNhdGlvbjsgICAgICAvKiBDb21wZW5zYXRpb24gZmFjdG9yIGZvciB0aGUgZW5lcmd5IGNoYW5nZSB3aGVuIGFwcGx5aW5nIG1vZGlmaWVkIGdhaW5zICovCi0gICAgU0NIQVIgICAgY29tcGVuc2F0aW9uX2U7CisgIGZvciAoaW50IGdyb3VwID0gMDsgZ3JvdXAgPCBub0dyb3VwczsgZ3JvdXArKykgeworICAgIEZJWFBfREJMIG5yZ09yaWcgPSBGTDJGWENPTlNUX0RCTCgKKyAgICAgICAgMC4wZik7IC8qIE9yaWdpbmFsIHNpZ25hbCBlbmVyZ3kgaW4gY3VycmVudCBncm91cCBvZiBiYW5kcyAqLworICAgIFNDSEFSIG5yZ09yaWdfZSA9IDA7CisgICAgRklYUF9EQkwgbnJnQW1wID0gRkwyRlhDT05TVF9EQkwoCisgICAgICAgIDAuMGYpOyAvKiBBbXBsaWZpZWQgc2lnbmFsIGVuZXJneSBpbiBncm91cCAodXNpbmcgY3VycmVudCBnYWlucykgKi8KKyAgICBTQ0hBUiBucmdBbXBfZSA9IDA7CisgICAgRklYUF9EQkwgbnJnTW9kID0gRkwyRlhDT05TVF9EQkwoCisgICAgICAgIDAuMGYpOyAvKiBTaWduYWwgZW5lcmd5IGluIGdyb3VwIHdoZW4gYXBwbHlpbmcgbW9kaWZpZWQgZ2FpbnMgKi8KKyAgICBTQ0hBUiBucmdNb2RfZSA9IDA7CisgICAgRklYUF9EQkwgZ3JvdXBHYWluOyAvKiBUb3RhbCBlbmVyZ3kgZ2FpbiBpbiBncm91cCAqLworICAgIFNDSEFSIGdyb3VwR2Fpbl9lOworICAgIEZJWFBfREJMIGNvbXBlbnNhdGlvbjsgLyogQ29tcGVuc2F0aW9uIGZhY3RvciBmb3IgdGhlIGVuZXJneSBjaGFuZ2Ugd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlpbmcgbW9kaWZpZWQgZ2FpbnMgKi8KKyAgICBTQ0hBUiBjb21wZW5zYXRpb25fZTsKIAotICAgIGludCBzdGFydEdyb3VwID0gZ3JvdXBWZWN0b3JbMipncm91cF07Ci0gICAgaW50IHN0b3BHcm91cCAgPSBncm91cFZlY3RvclsyKmdyb3VwKzFdOworICAgIGludCBzdGFydEdyb3VwID0gZ3JvdXBWZWN0b3JbMiAqIGdyb3VwXTsKKyAgICBpbnQgc3RvcEdyb3VwID0gZ3JvdXBWZWN0b3JbMiAqIGdyb3VwICsgMV07CiAKLSAgICAvKiBDYWxjdWxhdGUgdG90YWwgZW5lcmd5IGluIGdyb3VwIGJlZm9yZSBhbmQgYWZ0ZXIgYW1wbGlmaWNhdGlvbiB3aXRoIGN1cnJlbnQgZ2FpbnM6ICovCi0gICAgZm9yKGsgPSBzdGFydEdyb3VwOyBrIDwgc3RvcEdyb3VwOyBrKyspeworICAgIC8qIENhbGN1bGF0ZSB0b3RhbCBlbmVyZ3kgaW4gZ3JvdXAgYmVmb3JlIGFuZCBhZnRlciBhbXBsaWZpY2F0aW9uIHdpdGgKKyAgICAgKiBjdXJyZW50IGdhaW5zOiAqLworICAgIGZvciAoayA9IHN0YXJ0R3JvdXA7IGsgPCBzdG9wR3JvdXA7IGsrKykgewogICAgICAgLyogR2V0IG9yaWdpbmFsIGJhbmQgZW5lcmd5ICovCiAgICAgICBGSVhQX0RCTCB0bXAgPSBucmdFc3Rba107Ci0gICAgICBTQ0hBUiAgICB0bXBfZSA9IG5yZ0VzdF9lW2tdOworICAgICAgU0NIQVIgdG1wX2UgPSBucmdFc3RfZVtrXTsKIAogICAgICAgRkRLX2FkZF9NYW50RXhwKHRtcCwgdG1wX2UsIG5yZ09yaWcsIG5yZ09yaWdfZSwgJm5yZ09yaWcsICZucmdPcmlnX2UpOwogCiAgICAgICAvKiBNdWx0aXBseSBiYW5kIGVuZXJneSB3aXRoIGN1cnJlbnQgZ2FpbiAqLwotICAgICAgdG1wID0gZk11bHQodG1wLG5yZ0dhaW5ba10pOworICAgICAgdG1wID0gZk11bHQodG1wLCBucmdHYWluW2tdKTsKICAgICAgIHRtcF9lID0gdG1wX2UgKyBucmdHYWluX2Vba107CiAKICAgICAgIEZES19hZGRfTWFudEV4cCh0bXAsIHRtcF9lLCBucmdBbXAsIG5yZ0FtcF9lLCAmbnJnQW1wLCAmbnJnQW1wX2UpOwogICAgIH0KIAogICAgIC8qIENhbGN1bGF0ZSB0b3RhbCBlbmVyZ3kgZ2FpbiBpbiBncm91cCAqLwotICAgIEZES19kaXZpZGVfTWFudEV4cChucmdBbXAsIG5yZ0FtcF9lLAotICAgICAgICAgICAgICAgICAgICAgICBucmdPcmlnLCBucmdPcmlnX2UsCi0gICAgICAgICAgICAgICAgICAgICAgICZncm91cEdhaW4sICZncm91cEdhaW5fZSk7CisgICAgRkRLX2RpdmlkZV9NYW50RXhwKG5yZ0FtcCwgbnJnQW1wX2UsIG5yZ09yaWcsIG5yZ09yaWdfZSwgJmdyb3VwR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwR2Fpbl9lKTsKIAotICAgIGZvcihrID0gc3RhcnRHcm91cDsgayA8IHN0b3BHcm91cDsgaysrKXsKKyAgICBmb3IgKGsgPSBzdGFydEdyb3VwOyBrIDwgc3RvcEdyb3VwOyBrKyspIHsKICAgICAgIEZJWFBfREJMIHRtcDsKLSAgICAgIFNDSEFSICAgIHRtcF9lOworICAgICAgU0NIQVIgdG1wX2U7CiAKICAgICAgIEZJWFBfREJMIGFscGhhID0gZGVncmVlQWxpYXNba107CiAgICAgICBpZiAoayA8IG5vU3ViYmFuZHMgLSAxKSB7Ci0gICAgICAgIGlmIChkZWdyZWVBbGlhc1trICsgMV0gPiBhbHBoYSkKLSAgICAgICAgICBhbHBoYSA9IGRlZ3JlZUFsaWFzW2sgKyAxXTsKKyAgICAgICAgaWYgKGRlZ3JlZUFsaWFzW2sgKyAxXSA+IGFscGhhKSBhbHBoYSA9IGRlZ3JlZUFsaWFzW2sgKyAxXTsKICAgICAgIH0KIAogICAgICAgLyogTW9kaWZ5IGdhaW4gZGVwZW5kaW5nIG9uIHRoZSBkZWdyZWUgb2YgYWxpYXNpbmcgKi8KLSAgICAgIEZES19hZGRfTWFudEV4cCggZk11bHQoYWxwaGEsZ3JvdXBHYWluKSwgZ3JvdXBHYWluX2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLyAoRklYUF9EQkwpTUFYVkFMX0RCTCAtIGFscGhhLG5yZ0dhaW5ba10pLCBucmdHYWluX2Vba10sCi0gICAgICAgICAgICAgICAgICAgICAgICZucmdHYWluW2tdLCAmbnJnR2Fpbl9lW2tdICk7CisgICAgICBGREtfYWRkX01hbnRFeHAoCisgICAgICAgICAgZk11bHQoYWxwaGEsIGdyb3VwR2FpbiksIGdyb3VwR2Fpbl9lLAorICAgICAgICAgIGZNdWx0KC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLyAoRklYUF9EQkwpTUFYVkFMX0RCTCAtIGFscGhhLAorICAgICAgICAgICAgICAgIG5yZ0dhaW5ba10pLAorICAgICAgICAgIG5yZ0dhaW5fZVtrXSwgJm5yZ0dhaW5ba10sICZucmdHYWluX2Vba10pOwogCiAgICAgICAvKiBBcHBseSBtb2RpZmllZCBnYWluIHRvIG9yaWdpbmFsIGVuZXJneSAqLwotICAgICAgdG1wID0gZk11bHQobnJnR2FpbltrXSxucmdFc3Rba10pOworICAgICAgdG1wID0gZk11bHQobnJnR2FpbltrXSwgbnJnRXN0W2tdKTsKICAgICAgIHRtcF9lID0gbnJnR2Fpbl9lW2tdICsgbnJnRXN0X2Vba107CiAKICAgICAgIC8qIEFjY3VtdWxhdGUgZW5lcmd5IHdpdGggbW9kaWZpZWQgZ2FpbnMgYXBwbGllZCAqLwotICAgICAgRkRLX2FkZF9NYW50RXhwKCB0bXAsIHRtcF9lLAotICAgICAgICAgICAgICAgICAgICAgICBucmdNb2QsIG5yZ01vZF9lLAotICAgICAgICAgICAgICAgICAgICAgICAmbnJnTW9kLCAmbnJnTW9kX2UgKTsKKyAgICAgIEZES19hZGRfTWFudEV4cCh0bXAsIHRtcF9lLCBucmdNb2QsIG5yZ01vZF9lLCAmbnJnTW9kLCAmbnJnTW9kX2UpOwogICAgIH0KIAotICAgIC8qIENhbGN1bGF0ZSBjb21wZW5zYXRpb24gZmFjdG9yIHRvIHJldGFpbiB0aGUgZW5lcmd5IG9mIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCi0gICAgRkRLX2RpdmlkZV9NYW50RXhwKG5yZ0FtcCwgbnJnQW1wX2UsCi0gICAgICAgICAgICAgICAgICAgICAgIG5yZ01vZCwgbnJnTW9kX2UsCi0gICAgICAgICAgICAgICAgICAgICAgICZjb21wZW5zYXRpb24sICZjb21wZW5zYXRpb25fZSk7CisgICAgLyogQ2FsY3VsYXRlIGNvbXBlbnNhdGlvbiBmYWN0b3IgdG8gcmV0YWluIHRoZSBlbmVyZ3kgb2YgdGhlIGFtcGxpZmllZAorICAgICAqIHNpZ25hbCAqLworICAgIEZES19kaXZpZGVfTWFudEV4cChucmdBbXAsIG5yZ0FtcF9lLCBucmdNb2QsIG5yZ01vZF9lLCAmY29tcGVuc2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAmY29tcGVuc2F0aW9uX2UpOwogCiAgICAgLyogQXBwbHkgY29tcGVuc2F0aW9uIGZhY3RvciB0byBhbGwgZ2FpbnMgb2YgdGhlIGdyb3VwICovCi0gICAgZm9yKGsgPSBzdGFydEdyb3VwOyBrIDwgc3RvcEdyb3VwOyBrKyspewotICAgICAgbnJnR2FpbltrXSA9IGZNdWx0KG5yZ0dhaW5ba10sY29tcGVuc2F0aW9uKTsKKyAgICBmb3IgKGsgPSBzdGFydEdyb3VwOyBrIDwgc3RvcEdyb3VwOyBrKyspIHsKKyAgICAgIG5yZ0dhaW5ba10gPSBmTXVsdChucmdHYWluW2tdLCBjb21wZW5zYXRpb24pOwogICAgICAgbnJnR2Fpbl9lW2tdID0gbnJnR2Fpbl9lW2tdICsgY29tcGVuc2F0aW9uX2U7CiAgICAgfQogICB9CiB9CiAKKyNkZWZpbmUgSU5URVJfVEVTX1NGX0NIQU5HRSAzCiAKLSAvKiBDb252ZXJ0IGhlYWRyb29tIGJpdHMgdG8gZXhwb25lbnQgKi8KLSNkZWZpbmUgU0NBTEUyRVhQKHMpICgxNS0ocykpCi0jZGVmaW5lIEVYUDJTQ0FMRShlKSAoMTUtKGUpKQordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCBzdWJzYW1wbGVfcG93ZXJfbG93WygoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpICsgKDMgKiAoNCkpKV07CisgIEZJWFBfREJMIHN1YnNhbXBsZV9wb3dlcl9oaWdoWygoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpICsgKDMgKiAoNCkpKV07CisgIEZJWFBfREJMIGdhaW5bKCgoMTAyNCkgLyAoMzIpICogKDQpIC8gMikgKyAoMyAqICg0KSkpXTsKKyAgU0NIQVIgc3Vic2FtcGxlX3Bvd2VyX2xvd19zZlsoKCgxMDI0KSAvICgzMikgKiAoNCkgLyAyKSArICgzICogKDQpKSldOworICBTQ0hBUiBzdWJzYW1wbGVfcG93ZXJfaGlnaF9zZlsoKCgxMDI0KSAvICgzMikgKiAoNCkgLyAyKSArICgzICogKDQpKSldOworfSBJVEVTX1RFTVA7CisKK3N0YXRpYyB2b2lkIGFwcGx5X2ludGVyX3RlcyhGSVhQX0RCTCAqKnFtZlJlYWwsIEZJWFBfREJMICoqcW1mSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRTUZfU0NBTEVfRkFDVE9SICpzYnJTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiBleHBbMl0sIGNvbnN0IGludCBSQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdGFydFBvcywgY29uc3QgaW50IHN0b3BQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxvd1N1YmJhbmQsIGNvbnN0IGludCBuYlN1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgZ2FtbWFfaWR4KSB7CisgIGludCBoaWdoU3ViYmFuZCA9IGxvd1N1YmJhbmQgKyBuYlN1YmJhbmQ7CisgIEZJWFBfREJMICpzdWJzYW1wbGVfcG93ZXJfaGlnaCwgKnN1YnNhbXBsZV9wb3dlcl9sb3c7CisgIFNDSEFSICpzdWJzYW1wbGVfcG93ZXJfaGlnaF9zZiwgKnN1YnNhbXBsZV9wb3dlcl9sb3dfc2Y7CisgIEZJWFBfREJMIHRvdGFsX3Bvd2VyX2hpZ2ggPSAoRklYUF9EQkwpMDsKKyAgRklYUF9EQkwgdG90YWxfcG93ZXJfbG93ID0gKEZJWFBfREJMKTA7CisgIEZJWFBfREJMICpnYWluOworICBpbnQgZ2Fpbl9zZlsoKCgxMDI0KSAvICgzMikgKiAoNCkgLyAyKSArICgzICogKDQpKSldOworCisgIC8qIGdhbW1hW2dhbW1hX2lkeF0gPSB7MC4wZiwgMS4wZiwgMi4wZiwgNC4wZn0gKi8KKyAgaW50IGdhbW1hX3NmID0KKyAgICAgIChpbnQpZ2FtbWFfaWR4IC0gMTsgLyogcGVyaGFwcyArMSB0byBzYXZlIG9uZSBiaXQ/ICgwLjk5OTk5ZiB2cyAxLmYpICovCisKKyAgaW50IG5iU3Vic2FtcGxlID0gc3RvcFBvcyAtIHN0YXJ0UG9zOworICBpbnQgaSwgajsKKworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocFRtcCwgSVRFU19URU1QLCAxKTsKKyAgc3Vic2FtcGxlX3Bvd2VyX2hpZ2ggPSBwVG1wLT5zdWJzYW1wbGVfcG93ZXJfaGlnaDsKKyAgc3Vic2FtcGxlX3Bvd2VyX2xvdyA9IHBUbXAtPnN1YnNhbXBsZV9wb3dlcl9sb3c7CisgIHN1YnNhbXBsZV9wb3dlcl9oaWdoX3NmID0gcFRtcC0+c3Vic2FtcGxlX3Bvd2VyX2hpZ2hfc2Y7CisgIHN1YnNhbXBsZV9wb3dlcl9sb3dfc2YgPSBwVG1wLT5zdWJzYW1wbGVfcG93ZXJfbG93X3NmOworICBnYWluID0gcFRtcC0+Z2FpbjsKKworICBpZiAoZ2FtbWFfaWR4ID4gMCkgeworICAgIGludCBwcmVTaGlmdDIgPSAzMiAtIGZOb3JteigoRklYUF9EQkwpbmJTdWJzYW1wbGUpOworICAgIGludCB0b3RhbF9wb3dlcl9sb3dfc2YgPSAxIC0gREZSQUNUX0JJVFM7CisgICAgaW50IHRvdGFsX3Bvd2VyX2hpZ2hfc2YgPSAxIC0gREZSQUNUX0JJVFM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJTdWJzYW1wbGU7ICsraSkgeworICAgICAgRklYUF9EQkwgYnVmZmVyUmVhbFsoKCgxMDI0KSAvICgzMikgKiAoNCkgLyAyKSArICgzICogKDQpKSldOworICAgICAgRklYUF9EQkwgYnVmZmVySW1hZ1soKCgxMDI0KSAvICgzMikgKiAoNCkgLyAyKSArICgzICogKDQpKSldOworICAgICAgRklYUF9EQkwgbWF4VmFsID0gKEZJWFBfREJMKTA7CisKKyAgICAgIGludCB0cyA9IHN0YXJ0UG9zICsgaTsKKworICAgICAgaW50IGxvd19zZiA9ICh0cyA8IDMgKiBSQVRFKSA/IHNiclNjYWxlRmFjdG9yLT5vdl9sYl9zY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZTsKKyAgICAgIGxvd19zZiA9IDE1IC0gbG93X3NmOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgbG93U3ViYmFuZDsgKytqKSB7CisgICAgICAgIGJ1ZmZlckltYWdbal0gPSBxbWZJbWFnW3N0YXJ0UG9zICsgaV1bal07CisgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJJbWFnW2pdKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTE9ORylidWZmZXJJbWFnW2pdID4+IChERlJBQ1RfQklUUyAtIDEpKSk7CisgICAgICAgIGJ1ZmZlclJlYWxbal0gPSBxbWZSZWFsW3N0YXJ0UG9zICsgaV1bal07CisgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJSZWFsW2pdKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTE9ORylidWZmZXJSZWFsW2pdID4+IChERlJBQ1RfQklUUyAtIDEpKSk7CisgICAgICB9CisKKyAgICAgIHN1YnNhbXBsZV9wb3dlcl9sb3dbaV0gPSAoRklYUF9EQkwpMDsKKyAgICAgIHN1YnNhbXBsZV9wb3dlcl9sb3dfc2ZbaV0gPSAwOworCisgICAgICBpZiAobWF4VmFsICE9IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgICAgLyogbXVsdGlwbHkgZmlyc3QsIHRoZW4gc2hpZnQgZm9yIHNhZmUgc3VtbWF0aW9uICovCisgICAgICAgIGludCBwcmVTaGlmdCA9IDEgLSBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKTsKKyAgICAgICAgaW50IHBvc3RTaGlmdCA9IDMyIC0gZk5vcm16KChGSVhQX0RCTClsb3dTdWJiYW5kKTsKKworICAgICAgICAvKiByZWR1Y2UgcHJlU2hpZnQgYmVjYXVzZSBvdGhlcndpc2Ugd2UgcmlzayB0byBzcXVhcmUgLTEuZiAqLworICAgICAgICBpZiAocHJlU2hpZnQgIT0gMCkgcHJlU2hpZnQrKzsKKworICAgICAgICBzdWJzYW1wbGVfcG93ZXJfbG93X3NmW2ldICs9IChsb3dfc2YgKyBwcmVTaGlmdCkgKiAyICsgcG9zdFNoaWZ0ICsgMTsKKworICAgICAgICBzY2FsZVZhbHVlcyhidWZmZXJSZWFsLCBsb3dTdWJiYW5kLCAtcHJlU2hpZnQpOworICAgICAgICBzY2FsZVZhbHVlcyhidWZmZXJJbWFnLCBsb3dTdWJiYW5kLCAtcHJlU2hpZnQpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbG93U3ViYmFuZDsgKytqKSB7CisgICAgICAgICAgRklYUF9EQkwgYWRkbWU7CisgICAgICAgICAgYWRkbWUgPSBmUG93MkRpdjIoYnVmZmVyUmVhbFtqXSk7CisgICAgICAgICAgc3Vic2FtcGxlX3Bvd2VyX2xvd1tpXSArPSBhZGRtZSA+PiBwb3N0U2hpZnQ7CisgICAgICAgICAgYWRkbWUgPSBmUG93MkRpdjIoYnVmZmVySW1hZ1tqXSk7CisgICAgICAgICAgc3Vic2FtcGxlX3Bvd2VyX2xvd1tpXSArPSBhZGRtZSA+PiBwb3N0U2hpZnQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogbm93IGdldCBoaWdoICovCisKKyAgICAgIG1heFZhbCA9IChGSVhQX0RCTCkwOworCisgICAgICBpbnQgaGlnaF9zZiA9IGV4cFsodHMgPCAxNiAqIFJBVEUpID8gMCA6IDFdOworCisgICAgICBmb3IgKGogPSBsb3dTdWJiYW5kOyBqIDwgaGlnaFN1YmJhbmQ7ICsraikgeworICAgICAgICBidWZmZXJJbWFnW2pdID0gcW1mSW1hZ1tzdGFydFBvcyArIGldW2pdOworICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykoYnVmZmVySW1hZ1tqXSkgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExPTkcpYnVmZmVySW1hZ1tqXSA+PiAoREZSQUNUX0JJVFMgLSAxKSkpOworICAgICAgICBidWZmZXJSZWFsW2pdID0gcW1mUmVhbFtzdGFydFBvcyArIGldW2pdOworICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykoYnVmZmVyUmVhbFtqXSkgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExPTkcpYnVmZmVyUmVhbFtqXSA+PiAoREZSQUNUX0JJVFMgLSAxKSkpOworICAgICAgfQorCisgICAgICBzdWJzYW1wbGVfcG93ZXJfaGlnaFtpXSA9IChGSVhQX0RCTCkwOworICAgICAgc3Vic2FtcGxlX3Bvd2VyX2hpZ2hfc2ZbaV0gPSAwOworCisgICAgICBpZiAobWF4VmFsICE9IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgICAgaW50IHByZVNoaWZ0ID0gMSAtIENudExlYWRpbmdaZXJvcyhtYXhWYWwpOworICAgICAgICAvKiByZWR1Y2UgcHJlU2hpZnQgYmVjYXVzZSBvdGhlcndpc2Ugd2UgcmlzayB0byBzcXVhcmUgLTEuZiAqLworICAgICAgICBpZiAocHJlU2hpZnQgIT0gMCkgcHJlU2hpZnQrKzsKKworICAgICAgICBpbnQgcG9zdFNoaWZ0ID0gMzIgLSBmTm9ybXooKEZJWFBfREJMKShoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQpKTsKKyAgICAgICAgc3Vic2FtcGxlX3Bvd2VyX2hpZ2hfc2ZbaV0gKz0gKGhpZ2hfc2YgKyBwcmVTaGlmdCkgKiAyICsgcG9zdFNoaWZ0ICsgMTsKKworICAgICAgICBzY2FsZVZhbHVlcygmYnVmZmVyUmVhbFtsb3dTdWJiYW5kXSwgaGlnaFN1YmJhbmQgLSBsb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAtcHJlU2hpZnQpOworICAgICAgICBzY2FsZVZhbHVlcygmYnVmZmVySW1hZ1tsb3dTdWJiYW5kXSwgaGlnaFN1YmJhbmQgLSBsb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAtcHJlU2hpZnQpOworICAgICAgICBmb3IgKGogPSBsb3dTdWJiYW5kOyBqIDwgaGlnaFN1YmJhbmQ7IGorKykgeworICAgICAgICAgIHN1YnNhbXBsZV9wb3dlcl9oaWdoW2ldICs9IGZQb3cyRGl2MihidWZmZXJSZWFsW2pdKSA+PiBwb3N0U2hpZnQ7CisgICAgICAgICAgc3Vic2FtcGxlX3Bvd2VyX2hpZ2hbaV0gKz0gZlBvdzJEaXYyKGJ1ZmZlckltYWdbal0pID4+IHBvc3RTaGlmdDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBzdW0gYWxsIHRvZ2V0aGVyICovCisgICAgICBGSVhQX0RCTCBuZXdfc3VtbWFuZCA9IHN1YnNhbXBsZV9wb3dlcl9sb3dbaV07CisgICAgICBpbnQgbmV3X3N1bW1hbmRfc2YgPSBzdWJzYW1wbGVfcG93ZXJfbG93X3NmW2ldOworCisgICAgICAvKiBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgc3VtLCBhbmQgdGhlIG5ldyBzdW1tYW5kIGhhdmUgdGhlIHNhbWUgU0YgKi8KKyAgICAgIGlmIChuZXdfc3VtbWFuZF9zZiA+IHRvdGFsX3Bvd2VyX2xvd19zZikgeworICAgICAgICBpbnQgZGlmZiA9IGZNaW4oREZSQUNUX0JJVFMgLSAxLCBuZXdfc3VtbWFuZF9zZiAtIHRvdGFsX3Bvd2VyX2xvd19zZik7CisgICAgICAgIHRvdGFsX3Bvd2VyX2xvdyA+Pj0gZGlmZjsKKyAgICAgICAgdG90YWxfcG93ZXJfbG93X3NmID0gbmV3X3N1bW1hbmRfc2Y7CisgICAgICB9IGVsc2UgaWYgKG5ld19zdW1tYW5kX3NmIDwgdG90YWxfcG93ZXJfbG93X3NmKSB7CisgICAgICAgIG5ld19zdW1tYW5kID4+PSB0b3RhbF9wb3dlcl9sb3dfc2YgLSBuZXdfc3VtbWFuZF9zZjsKKyAgICAgIH0KKworICAgICAgdG90YWxfcG93ZXJfbG93ICs9IChuZXdfc3VtbWFuZCA+PiBwcmVTaGlmdDIpOworCisgICAgICBuZXdfc3VtbWFuZCA9IHN1YnNhbXBsZV9wb3dlcl9oaWdoW2ldOworICAgICAgbmV3X3N1bW1hbmRfc2YgPSBzdWJzYW1wbGVfcG93ZXJfaGlnaF9zZltpXTsKKyAgICAgIGlmIChuZXdfc3VtbWFuZF9zZiA+IHRvdGFsX3Bvd2VyX2hpZ2hfc2YpIHsKKyAgICAgICAgdG90YWxfcG93ZXJfaGlnaCA+Pj0KKyAgICAgICAgICAgIGZNaW4oREZSQUNUX0JJVFMgLSAxLCBuZXdfc3VtbWFuZF9zZiAtIHRvdGFsX3Bvd2VyX2hpZ2hfc2YpOworICAgICAgICB0b3RhbF9wb3dlcl9oaWdoX3NmID0gbmV3X3N1bW1hbmRfc2Y7CisgICAgICB9IGVsc2UgaWYgKG5ld19zdW1tYW5kX3NmIDwgdG90YWxfcG93ZXJfaGlnaF9zZikgeworICAgICAgICBuZXdfc3VtbWFuZCA+Pj0gdG90YWxfcG93ZXJfaGlnaF9zZiAtIG5ld19zdW1tYW5kX3NmOworICAgICAgfQorCisgICAgICB0b3RhbF9wb3dlcl9oaWdoICs9IChuZXdfc3VtbWFuZCA+PiBwcmVTaGlmdDIpOworICAgIH0KKworICAgIHRvdGFsX3Bvd2VyX2xvd19zZiArPSBwcmVTaGlmdDI7CisgICAgdG90YWxfcG93ZXJfaGlnaF9zZiArPSBwcmVTaGlmdDI7CisKKyAgICAvKiBnYWluW2ldID0gZV9MT1dbaV0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJTdWJzYW1wbGU7ICsraSkgeworICAgICAgaW50IHNmMjsKKyAgICAgIEZJWFBfREJMIG11bHQgPQorICAgICAgICAgIGZNdWx0Tm9ybShzdWJzYW1wbGVfcG93ZXJfbG93W2ldLCAoRklYUF9EQkwpbmJTdWJzYW1wbGUsICZzZjIpOworICAgICAgaW50IG11bHRfc2YgPSBzdWJzYW1wbGVfcG93ZXJfbG93X3NmW2ldICsgREZSQUNUX0JJVFMgLSAxICsgc2YyOworCisgICAgICBpZiAodG90YWxfcG93ZXJfbG93ICE9IEZJWFBfREJMKDApKSB7CisgICAgICAgIGdhaW5baV0gPSBmRGl2Tm9ybShtdWx0LCB0b3RhbF9wb3dlcl9sb3csICZzZjIpOworICAgICAgICBnYWluX3NmW2ldID0gbXVsdF9zZiAtIHRvdGFsX3Bvd2VyX2xvd19zZiArIHNmMjsKKyAgICAgICAgZ2FpbltpXSA9IHNxcnRGaXhwX2xvb2t1cChnYWluW2ldLCAmZ2Fpbl9zZltpXSk7CisgICAgICAgIGlmIChnYWluX3NmW2ldIDwgMCkgeworICAgICAgICAgIGdhaW5baV0gPj49IC1nYWluX3NmW2ldOworICAgICAgICAgIGdhaW5fc2ZbaV0gPSAwOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobXVsdCA9PSBGSVhQX0RCTCgwKSkgeworICAgICAgICAgIGdhaW5baV0gPSBGSVhQX0RCTCgwKTsKKyAgICAgICAgICBnYWluX3NmW2ldID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnYWluW2ldID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgICAgICAgZ2Fpbl9zZltpXSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBGSVhQX0RCTCB0b3RhbF9wb3dlcl9oaWdoX2FmdGVyID0gKEZJWFBfREJMKTA7CisgICAgaW50IHRvdGFsX3Bvd2VyX2hpZ2hfYWZ0ZXJfc2YgPSAxIC0gREZSQUNUX0JJVFM7CisKKyAgICAvKiBnYWluW2ldID0gZ19pbnRlcltpXSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuYlN1YnNhbXBsZTsgKytpKSB7CisgICAgICBpZiAoZ2Fpbl9zZltpXSA8IDApIHsKKyAgICAgICAgZ2FpbltpXSA+Pj0gLWdhaW5fc2ZbaV07CisgICAgICAgIGdhaW5fc2ZbaV0gPSAwOworICAgICAgfQorCisgICAgICAvKiBjYWxjdWxhdGU6IGdhaW5baV0gPSAxLjBmICsgZ2FtbWEgKiAoZ2FpbltpXSAtIDEuMGYpOyAqLworICAgICAgRklYUF9EQkwgb25lID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgPj4KKyAgICAgICAgICAgICAgICAgICAgIGdhaW5fc2ZbaV07IC8qIHRvIHN1YnN0cmFjdCB0aGlzIGZyb20gZ2FpbltpXSAqLworCisgICAgICAvKiBnYW1tYSBpcyBhY3R1YWxseSBhbHdheXMgMSBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlLCBzbyBza2lwIHRoZQorICAgICAgICogZk11bHREaXYyICovCisgICAgICBGSVhQX0RCTCBtdWx0ID0gKGdhaW5baV0gLSBvbmUpID4+IDE7CisgICAgICBpbnQgbXVsdF9zZiA9IGdhaW5fc2ZbaV0gKyBnYW1tYV9zZjsKKworICAgICAgb25lID0gRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gbXVsdF9zZjsKKyAgICAgIGdhaW5baV0gPSBvbmUgKyBtdWx0OworICAgICAgZ2Fpbl9zZltpXSArPSBnYW1tYV9zZiArIDE7IC8qICsxIGJlY2F1c2Ugb2YgZk11bHREaXYyKCkgKi8KKworICAgICAgLyogc2V0IGdhaW4gdG8gYXQgbGVhc3QgMC4yZiAqLworICAgICAgRklYUF9EQkwgcG9pbnRfdHdvID0gRkwyRlhDT05TVF9EQkwoMC44Zik7IC8qIHNjYWxlZCB1cCBieSAyICovCisgICAgICBpbnQgcG9pbnRfdHdvX3NmID0gLTI7CisKKyAgICAgIEZJWFBfREJMIHRtcCA9IGdhaW5baV07CisgICAgICBpZiAocG9pbnRfdHdvX3NmIDwgZ2Fpbl9zZltpXSkgeworICAgICAgICBwb2ludF90d28gPj49IGdhaW5fc2ZbaV0gLSBwb2ludF90d29fc2Y7CisgICAgICB9IGVsc2UgeworICAgICAgICB0bXAgPj49IHBvaW50X3R3b19zZiAtIGdhaW5fc2ZbaV07CisgICAgICB9CisKKyAgICAgIC8qIGxpbWl0IGFuZCBjYWxjdWxhdGUgZ2FpbltpXV4yIHRvbyAqLworICAgICAgRklYUF9EQkwgZ2Fpbl9wb3cyOworICAgICAgaW50IGdhaW5fcG93Ml9zZjsKKyAgICAgIGlmICh0bXAgPCBwb2ludF90d28pIHsKKyAgICAgICAgZ2FpbltpXSA9IEZMMkZYQ09OU1RfREJMKDAuOGYpOworICAgICAgICBnYWluX3NmW2ldID0gLTI7CisgICAgICAgIGdhaW5fcG93MiA9IEZMMkZYQ09OU1RfREJMKDAuNjRmKTsKKyAgICAgICAgZ2Fpbl9wb3cyX3NmID0gLTQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiB0aGlzIHVwc2NhbGluZyBzZWVtcyBxdWl0ZSBpbXBvcnRhbnQgKi8KKyAgICAgICAgaW50IHIgPSBDb3VudExlYWRpbmdCaXRzKGdhaW5baV0pOworICAgICAgICBnYWluW2ldIDw8PSByOworICAgICAgICBnYWluX3NmW2ldIC09IHI7CisKKyAgICAgICAgZ2Fpbl9wb3cyID0gZlBvdzIoZ2FpbltpXSk7CisgICAgICAgIGdhaW5fcG93Ml9zZiA9IGdhaW5fc2ZbaV0gPDwgMTsKKyAgICAgIH0KKworICAgICAgaW50IHJvb207CisgICAgICBzdWJzYW1wbGVfcG93ZXJfaGlnaFtpXSA9CisgICAgICAgICAgZk11bHROb3JtKHN1YnNhbXBsZV9wb3dlcl9oaWdoW2ldLCBnYWluX3BvdzIsICZyb29tKTsKKyAgICAgIHN1YnNhbXBsZV9wb3dlcl9oaWdoX3NmW2ldID0KKyAgICAgICAgICBzdWJzYW1wbGVfcG93ZXJfaGlnaF9zZltpXSArIGdhaW5fcG93Ml9zZiArIHJvb207CisKKyAgICAgIGludCBuZXdfc3VtbWFuZF9zZiA9IHN1YnNhbXBsZV9wb3dlcl9oaWdoX3NmW2ldOyAvKiArIGdhaW5fcG93Ml9zZjsgKi8KKyAgICAgIGlmIChuZXdfc3VtbWFuZF9zZiA+IHRvdGFsX3Bvd2VyX2hpZ2hfYWZ0ZXJfc2YpIHsKKyAgICAgICAgdG90YWxfcG93ZXJfaGlnaF9hZnRlciA+Pj0KKyAgICAgICAgICAgIGZNaW4oREZSQUNUX0JJVFMgLSAxLCBuZXdfc3VtbWFuZF9zZiAtIHRvdGFsX3Bvd2VyX2hpZ2hfYWZ0ZXJfc2YpOworICAgICAgICB0b3RhbF9wb3dlcl9oaWdoX2FmdGVyX3NmID0gbmV3X3N1bW1hbmRfc2Y7CisgICAgICB9IGVsc2UgaWYgKG5ld19zdW1tYW5kX3NmIDwgdG90YWxfcG93ZXJfaGlnaF9hZnRlcl9zZikgeworICAgICAgICBzdWJzYW1wbGVfcG93ZXJfaGlnaFtpXSA+Pj0gdG90YWxfcG93ZXJfaGlnaF9hZnRlcl9zZiAtIG5ld19zdW1tYW5kX3NmOworICAgICAgfQorICAgICAgdG90YWxfcG93ZXJfaGlnaF9hZnRlciArPSBzdWJzYW1wbGVfcG93ZXJfaGlnaFtpXSA+PiBwcmVTaGlmdDI7CisgICAgfQorCisgICAgdG90YWxfcG93ZXJfaGlnaF9hZnRlcl9zZiArPSBwcmVTaGlmdDI7CisKKyAgICBpbnQgc2YyID0gMDsKKyAgICBGSVhQX0RCTCBnYWluX2Fkal8yID0gRkwyRlhfREJMKDAuNWYpOworICAgIGludCBnYWluX2Fkal8yX3NmID0gMTsKKworICAgIGlmICgodG90YWxfcG93ZXJfaGlnaCAhPSAoRklYUF9EQkwpMCkgJiYKKyAgICAgICAgKHRvdGFsX3Bvd2VyX2hpZ2hfYWZ0ZXIgIT0gKEZJWFBfREJMKTApKSB7CisgICAgICBnYWluX2Fkal8yID0gZkRpdk5vcm0odG90YWxfcG93ZXJfaGlnaCwgdG90YWxfcG93ZXJfaGlnaF9hZnRlciwgJnNmMik7CisgICAgICBnYWluX2Fkal8yX3NmID0gdG90YWxfcG93ZXJfaGlnaF9zZiAtIHRvdGFsX3Bvd2VyX2hpZ2hfYWZ0ZXJfc2YgKyBzZjI7CisgICAgfQorCisgICAgRklYUF9EQkwgZ2Fpbl9hZGogPSBzcXJ0Rml4cF9sb29rdXAoZ2Fpbl9hZGpfMiwgJmdhaW5fYWRqXzJfc2YpOworICAgIGludCBnYWluX2Fkal9zZiA9IGdhaW5fYWRqXzJfc2Y7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJTdWJzYW1wbGU7ICsraSkgeworICAgICAgZ2FpbltpXSA9IGZNdWx0KGdhaW5baV0sIGdhaW5fYWRqKTsKKyAgICAgIGdhaW5fc2ZbaV0gKz0gZ2Fpbl9hZGpfc2Y7CisKKyAgICAgIC8qIGxpbWl0IGdhaW4gKi8KKyAgICAgIGlmIChnYWluX3NmW2ldID4gSU5URVJfVEVTX1NGX0NIQU5HRSkgeworICAgICAgICBnYWluW2ldID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgICAgIGdhaW5fc2ZbaV0gPSBJTlRFUl9URVNfU0ZfQ0hBTkdFOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuYlN1YnNhbXBsZTsgKytpKSB7CisgICAgICAvKiBlcXVhbGl6ZSBnYWluW10ncyBzY2FsZSBmYWN0b3JzICovCisgICAgICBnYWluW2ldID4+PSBJTlRFUl9URVNfU0ZfQ0hBTkdFIC0gZ2Fpbl9zZltpXTsKKworICAgICAgZm9yIChqID0gbG93U3ViYmFuZDsgaiA8IGhpZ2hTdWJiYW5kOyBqKyspIHsKKyAgICAgICAgcW1mUmVhbFtzdGFydFBvcyArIGldW2pdID0gZk11bHQocW1mUmVhbFtzdGFydFBvcyArIGldW2pdLCBnYWluW2ldKTsKKyAgICAgICAgcW1mSW1hZ1tzdGFydFBvcyArIGldW2pdID0gZk11bHQocW1mSW1hZ1tzdGFydFBvcyArIGldW2pdLCBnYWluW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7IC8qIGdhbW1hX2lkeCA9PSAwICovCisgICAgLyogSW50ZXItVEVTIGlzIG5vdCBhY3RpdmUuIFN0aWxsIHBlcmZvcm0gdGhlIHNjYWxlIGNoYW5nZSB0byBoYXZlIGEKKyAgICAgKiBjb25zaXN0ZW50IHNjYWxpbmcgZm9yIGFsbCBlbnZlbG9wZXMgb2YgdGhpcyBmcmFtZS4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJTdWJzYW1wbGU7ICsraSkgeworICAgICAgZm9yIChqID0gbG93U3ViYmFuZDsgaiA8IGhpZ2hTdWJiYW5kOyBqKyspIHsKKyAgICAgICAgcW1mUmVhbFtzdGFydFBvcyArIGldW2pdID4+PSBJTlRFUl9URVNfU0ZfQ0hBTkdFOworICAgICAgICBxbWZJbWFnW3N0YXJ0UG9zICsgaV1bal0gPj49IElOVEVSX1RFU19TRl9DSEFOR0U7CisgICAgICB9CisgICAgfQorICB9CisgIENfQUxMT0NfU0NSQVRDSF9FTkQocFRtcCwgSVRFU19URU1QLCAxKTsKK30KIAogLyohCiAgIFxicmllZiAgQXBwbHkgc3BlY3RyYWwgZW52ZWxvcGUgdG8gc3ViYmFuZCBzYW1wbGVzCkBAIC00MzAsNyArODAxLDggQEAKICAgdGhlIHN1ZmZpeGVzIDxlbT5fbTwvZW0+IGFuZCAgPGVtPl9lPC9lbT4gcmVzcGVjdGl2ZWx5LiBUaGUgY29udHJvbCBkYXRhCiAgIGluICNoRnJhbWVEYXRhIGNvbnRhaW50cyBlbnZlbG9wZSBkYXRhIHdoaWNoIGlzIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybWF0IGJ1dAogICBzdG9yZWQgaW4gc2luZ2xlIHdvcmRzLiAoU2VlIHJlcXVhbnRpemVFbnZlbG9wZURhdGEoKSBmb3IgZGV0YWlscykuIFRoaXMgZGF0YQotICBpcyB1bnBhY2tlZCB3aXRoaW4gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSB0byBmb2xsb3cgdGhlIGRlc2NyaWJlZCBzdWZmaXggY29udmVudGlvbi4KKyAgaXMgdW5wYWNrZWQgd2l0aGluIGNhbGN1bGF0ZVNickVudmVsb3BlKCkgdG8gZm9sbG93IHRoZSBkZXNjcmliZWQgc3VmZml4CisgIGNvbnZlbnRpb24uCiAKICAgVGhlIGFjdHVhbCB2YWx1ZSAoY29tcGFyYWJsZSB0byB0aGUgY29ycmVzcG9uZGluZyBmbG9hdC12YXJpYWJsZSBpbiB0aGUKICAgcmVzZWFyY2gtaW1wbGVtZW50YXRpb24pIG9mIGEgbWFudGlzc2EvZXhwb25lbnQtcGFpciBjYW4gYmUgY2FsY3VsYXRlZCBhcwpAQCAtNDM4LDQ5ICs4MTAsNDUgQEAKICAgXGYkIHZhbHVlID0gdmFsdWVcX20gKiAyXnt2YWx1ZVxfZX0gXGYkCiAKICAgQWxsIGVuZXJnaWVzIGFuZCBub2lzZSBsZXZlbHMgZGVjb2RlZCBmcm9tIHRoZSBiaXRzdHJlYW0gc3VpdCBmb3IgYW4KLSAgb3JpZ2luYWwgc2lnbmFsIG1hZ25pdHVkZSBvZiBcZiRccG0gMzI3NjggXGYkIHJhdGhlciB0aGFuIFxmJCBccG0gMVxmJC4gVGhlcmVmb3JlLAotICB0aGUgc2NhbGUgZmFjdG9yIDxlbT5oYl9zY2FsZTwvZW0+IHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjb252ZXJ0ZWQKLSAgdG8gYW4gJ2lucHV0IGV4cG9uZW50JyAoI2lucHV0X2UpLCB3aGljaCBmaXRzIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KKyAgb3JpZ2luYWwgc2lnbmFsIG1hZ25pdHVkZSBvZiBcZiRccG0gMzI3NjggXGYkIHJhdGhlciB0aGFuIFxmJCBccG0gMVxmJC4KKyAgVGhlcmVmb3JlLCB0aGUgc2NhbGUgZmFjdG9yIDxlbT5oYl9zY2FsZTwvZW0+IHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24gd2lsbAorICBiZSBjb252ZXJ0ZWQgdG8gYW4gJ2lucHV0IGV4cG9uZW50JyAoI2lucHV0X2UpLCB3aGljaCBmaXRzIHRoZSBpbnRlcm5hbAorICByZXByZXNlbnRhdGlvbi4KIAogICBCZWZvcmUgdGhlIGFjdHVhbCBwcm9jZXNzaW5nLCBhbiBleHBvbmVudCAjYWRqX2UgZm9yIHJlc3VsdGluZyBhZGp1c3RlZAogICBzYW1wbGVzIGlzIGRlcml2ZWQgZnJvbSB0aGUgbWF4aW11bSByZWZlcmVuY2UgZW5lcmd5LgogCiAgIFRoZW4sIGZvciBlYWNoIGVudmVsb3BlLCB0aGUgZm9sbG93aW5nIHN0ZXBzIGFyZSBwZXJmb3JtZWQ6CiAKLSAgXGxpIENhbGN1bGF0ZSBlbmVyZ3kgaW4gdGhlIHNpZ25hbCB0byBiZSBhZGp1c3RlZC4gRGVwZW5kaW5nIG9uIHRoZSB0aGUgdmFsdWUgb2YKLSAgICAgICNpbnRlcnBvbEZyZXEgKGludGVycG9sYXRpb24gbW9kZSksIHRoaXMgaXMgZWl0aGVyIGRvbmUgc2VwZXJhdGVseQotICAgICAgZm9yIGVhY2ggUU1GLXN1YmJhbmQgb3IgZm9yIGVhY2ggU0JSLWJhbmQuCi0gICAgICBUaGUgcmVzdWx0aW5nIGVuZXJnaWVzIGFyZSBzdG9yZWQgaW4gI25yZ0VzdF9tWyNNQVhfRlJFUV9DT0VGRlNdIChtYW50aXNzYXMpCi0gICAgICBhbmQgI25yZ0VzdF9lWyNNQVhfRlJFUV9DT0VGRlNdIChleHBvbmVudHMpLgotICBcbGkgQ2FsY3VsYXRlIGdhaW4gYW5kIG5vaXNlIGxldmVsIGZvciBlYWNoIHN1YmJhbmQ6PGJyPgotICAgICAgXGYkIGdhaW4gID0gXHNxcnR7IFxmcmFje25yZ1JlZn17bnJnRXN0fSBcY2RvdCAoMSAtIG5vaXNlUmF0aW8pIH0KLSAgICAgICAgICBcaHNwYWNlezJjbX0KLSAgICAgICAgICBub2lzZSA9IFxzcXJ0eyBucmdSZWYgXGNkb3Qgbm9pc2VSYXRpbyB9Ci0gICAgICBcZiQ8YnI+Ci0gICAgICB3aGVyZSA8ZW0+bm9pc2VSYXRpbzwvZW0+IGFuZCA8ZW0+bnJnUmVmPC9lbT4gYXJlIGV4dHJhY3RlZCBmcm9tIHRoZQotICAgICAgYml0c3RyZWFtIGFuZCA8ZW0+bnJnRXN0PC9lbT4gaXMgdGhlIHN1YmJhbmQgZW5lcmd5IGJlZm9yZSBhZGp1c3RtZW50LgotICAgICAgVGhlIHJlc3VsdGluZyBnYWlucyBhcmUgc3RvcmVkIGluICNucmdHYWluX21bI01BWF9GUkVRX0NPRUZGU10KLSAgICAgIChtYW50aXNzYXMpIGFuZCAjbnJnR2Fpbl9lWyNNQVhfRlJFUV9DT0VGRlNdIChleHBvbmVudHMpLCB0aGUgbm9pc2UgbGV2ZWxzCi0gICAgICBhcmUgc3RvcmVkIGluICNub2lzZUxldmVsX21bI01BWF9GUkVRX0NPRUZGU10gYW5kICNub2lzZUxldmVsX2VbI01BWF9GUkVRX0NPRUZGU10KLSAgICAgIChleHBvbmVudHMpLgotICAgICAgVGhlIHNpbmUgbGV2ZWxzIGFyZSBzdG9yZWQgaW4gI25yZ1NpbmVfbVsjTUFYX0ZSRVFfQ09FRkZTXQotICAgICAgYW5kICNucmdTaW5lX2VbI01BWF9GUkVRX0NPRUZGU10uCi0gIFxsaSBOb2lzZSBsaW1pdGluZzogVGhlIGdhaW4gZm9yIGVhY2ggc3ViYmFuZCBpcyBsaW1pdGVkIGJvdGggYWJzb2x1dGVseQotICAgICAgYW5kIHJlbGF0aXZlbHkgY29tcGFyZWQgdG8gdGhlIHRvdGFsIGdhaW4gb3ZlciBhbGwgc3ViYmFuZHMuCi0gIFxsaSBCb29zdCBnYWluOiBDYWxjdWxhdGUgYW5kIGFwcGx5IGJvb3N0IGZhY3RvciBmb3IgZWFjaCBsaW1pdGVyIGJhbmQKLSAgICAgIGluIG9yZGVyIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBlbmVyZ3kgbG9zcyBpbXBvc2VkIGJ5IHRoZSBsaW1pdGluZy4KLSAgXGxpIEFwcGx5IGdhaW5zIGFuZCBhZGQgbm9pc2U6IFRoZSBnYWlucyBhbmQgbm9pc2UgbGV2ZWxzIGFyZSBhcHBsaWVkCi0gICAgICB0byBhbGwgdGltZXNsb3RzIG9mIHRoZSBjdXJyZW50IGVudmVsb3BlLiBBIHNob3J0IEZJUi1maWx0ZXIgKGxlbmd0aCA0Ci0gICAgICBRTUYtdGltZXNsb3RzKSBjYW4gYmUgdXNlZCB0byBzbW9vdGggdGhlIHN1ZGRlbiBjaGFuZ2UgYXQgdGhlIGVudmVsb3BlIGJvcmRlcnMuCi0gICAgICBFYWNoIGNvbXBsZXggc3ViYmFuZCBzYW1wbGUgb2YgdGhlIGN1cnJlbnQgdGltZXNsb3QgaXMgbXVsdGlwbGllZCBieSB0aGUKLSAgICAgIHNtb290aGVkIGdhaW4sIHRoZW4gcmFuZG9tIG5vaXNlIHdpdGggdGhlIGNhbGN1bGF0ZWQgbGV2ZWwgaXMgYWRkZWQuCisgIFxsaSBDYWxjdWxhdGUgZW5lcmd5IGluIHRoZSBzaWduYWwgdG8gYmUgYWRqdXN0ZWQuIERlcGVuZGluZyBvbiB0aGUgdGhlIHZhbHVlCisgIG9mICNpbnRlcnBvbEZyZXEgKGludGVycG9sYXRpb24gbW9kZSksIHRoaXMgaXMgZWl0aGVyIGRvbmUgc2VwZXJhdGVseSBmb3IgZWFjaAorICBRTUYtc3ViYmFuZCBvciBmb3IgZWFjaCBTQlItYmFuZC4gVGhlIHJlc3VsdGluZyBlbmVyZ2llcyBhcmUgc3RvcmVkIGluCisgICNucmdFc3RfbVsjTUFYX0ZSRVFfQ09FRkZTXSAobWFudGlzc2FzKSBhbmQgI25yZ0VzdF9lWyNNQVhfRlJFUV9DT0VGRlNdCisgIChleHBvbmVudHMpLiBcbGkgQ2FsY3VsYXRlIGdhaW4gYW5kIG5vaXNlIGxldmVsIGZvciBlYWNoIHN1YmJhbmQ6PGJyPiBcZiQgZ2FpbgorICA9IFxzcXJ0eyBcZnJhY3tucmdSZWZ9e25yZ0VzdH0gXGNkb3QgKDEgLSBub2lzZVJhdGlvKSB9IFxoc3BhY2V7MmNtfSBub2lzZSA9CisgIFxzcXJ0eyBucmdSZWYgXGNkb3Qgbm9pc2VSYXRpbyB9IFxmJDxicj4gd2hlcmUgPGVtPm5vaXNlUmF0aW88L2VtPiBhbmQKKyAgPGVtPm5yZ1JlZjwvZW0+IGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgYml0c3RyZWFtIGFuZCA8ZW0+bnJnRXN0PC9lbT4gaXMgdGhlCisgIHN1YmJhbmQgZW5lcmd5IGJlZm9yZSBhZGp1c3RtZW50LiBUaGUgcmVzdWx0aW5nIGdhaW5zIGFyZSBzdG9yZWQgaW4KKyAgI25yZ0dhaW5fbVsjTUFYX0ZSRVFfQ09FRkZTXSAobWFudGlzc2FzKSBhbmQgI25yZ0dhaW5fZVsjTUFYX0ZSRVFfQ09FRkZTXQorICAoZXhwb25lbnRzKSwgdGhlIG5vaXNlIGxldmVscyBhcmUgc3RvcmVkIGluICNub2lzZUxldmVsX21bI01BWF9GUkVRX0NPRUZGU10KKyAgYW5kICNub2lzZUxldmVsX2VbI01BWF9GUkVRX0NPRUZGU10gKGV4cG9uZW50cykuIFRoZSBzaW5lIGxldmVscyBhcmUgc3RvcmVkIGluCisgICNucmdTaW5lX21bI01BWF9GUkVRX0NPRUZGU10gYW5kICNucmdTaW5lX2VbI01BWF9GUkVRX0NPRUZGU10uIFxsaSBOb2lzZQorICBsaW1pdGluZzogVGhlIGdhaW4gZm9yIGVhY2ggc3ViYmFuZCBpcyBsaW1pdGVkIGJvdGggYWJzb2x1dGVseSBhbmQgcmVsYXRpdmVseQorICBjb21wYXJlZCB0byB0aGUgdG90YWwgZ2FpbiBvdmVyIGFsbCBzdWJiYW5kcy4gXGxpIEJvb3N0IGdhaW46IENhbGN1bGF0ZSBhbmQKKyAgYXBwbHkgYm9vc3QgZmFjdG9yIGZvciBlYWNoIGxpbWl0ZXIgYmFuZCBpbiBvcmRlciB0byBjb21wZW5zYXRlIGZvciB0aGUgZW5lcmd5CisgIGxvc3MgaW1wb3NlZCBieSB0aGUgbGltaXRpbmcuIFxsaSBBcHBseSBnYWlucyBhbmQgYWRkIG5vaXNlOiBUaGUgZ2FpbnMgYW5kCisgIG5vaXNlIGxldmVscyBhcmUgYXBwbGllZCB0byBhbGwgdGltZXNsb3RzIG9mIHRoZSBjdXJyZW50IGVudmVsb3BlLiBBIHNob3J0CisgIEZJUi1maWx0ZXIgKGxlbmd0aCA0IFFNRi10aW1lc2xvdHMpIGNhbiBiZSB1c2VkIHRvIHNtb290aCB0aGUgc3VkZGVuIGNoYW5nZSBhdAorICB0aGUgZW52ZWxvcGUgYm9yZGVycy4gRWFjaCBjb21wbGV4IHN1YmJhbmQgc2FtcGxlIG9mIHRoZSBjdXJyZW50IHRpbWVzbG90IGlzCisgIG11bHRpcGxpZWQgYnkgdGhlIHNtb290aGVkIGdhaW4sIHRoZW4gcmFuZG9tIG5vaXNlIHdpdGggdGhlIGNhbGN1bGF0ZWQgbGV2ZWwKKyAgaXMgYWRkZWQuCiAKICAgXG5vdGUKICAgVG8gcmVkdWNlIHRoZSBzdGFjayBzaXplLCBzb21lIG9mIHRoZSBsb2NhbCBhcnJheXMgY291bGQgYmUgbG9jYXRlZCB3aXRoaW4KICAgdGhlIHRpbWUgb3V0cHV0IGJ1ZmZlci4gT2YgdGhlIDUxMiBzYW1wbGVzIHRlbXBvcmFyaWx5IGF2YWlsYWJsZSB0aGVyZSwKICAgYWJvdXQgaGFsZiB0aGUgc2l6ZSBpcyBhbHJlYWR5IHVzZWQgYnkgI1NCUl9GUkFNRV9EQVRBLiBBIHBvaW50ZXIgdG8gdGhlCi0gIHJlbWFpbmluZyBmcmVlIG1lbW9yeSBjb3VsZCBiZSBzdXBwbGllZCBieSBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIGNhbGN1bGF0ZVNickVudmVsb3BlKCkKLSAgaW4gc2JyX2RlYzoKKyAgcmVtYWluaW5nIGZyZWUgbWVtb3J5IGNvdWxkIGJlIHN1cHBsaWVkIGJ5IGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8KKyAgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSBpbiBzYnJfZGVjOgogCiAgIFxwYXIKICAgXGNvZGUKQEAgLTQ5MCwxMiArODU4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhGcmFtZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlclJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXRQdHIgKyBzaXplb2YoU0JSX0ZSQU1FX0RBVEEpL3NpemVvZihGbG9hdCkgKyAxKTsKLSAgXGVuZGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dFB0ciArIHNpemVvZihTQlJfRlJBTUVfREFUQSkvc2l6ZW9mKEZsb2F0KSArCisgIDEpOyBcZW5kY29kZQogCiAgIFxwYXIKLSAgV2l0aGluIGNhbGN1bGF0ZVNickVudmVsb3BlKCksIHNvbWUgcG9pbnRlcnMgY291bGQgYmUgZGVmaW5lZCBpbnN0ZWFkIG9mIHRoZSBhcnJheXMKLSAgI25yZ1JlZl9tLCAjbnJnUmVmX2UsICNucmdFc3RfbSwgI25yZ0VzdF9lLCAjbm9pc2VMZXZlbF9tOgorICBXaXRoaW4gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSwgc29tZSBwb2ludGVycyBjb3VsZCBiZSBkZWZpbmVkIGluc3RlYWQgb2YgdGhlCisgIGFycmF5cyAjbnJnUmVmX20sICNucmdSZWZfZSwgI25yZ0VzdF9tLCAjbnJnRXN0X2UsICNub2lzZUxldmVsX206CiAKICAgXHBhcgogICBcY29kZQpAQCAtNTA4LDU2ICs4NzYsMTAzIEBACiAKICAgPGJyPgogKi8KLXZvaWQKLWNhbGN1bGF0ZVNickVudmVsb3BlIChRTUZfU0NBTEVfRkFDVE9SICAqc2JyU2NhbGVGYWN0b3IsICAgICAgICAgICAvKiE8IFNjYWxpbmcgZmFjdG9ycyAqLwotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhfc2JyX2NhbF9lbnYsIC8qITwgSGFuZGxlIHRvIHN0cnVjdCBmaWxsZWQgYnkgdGhlIGNyZWF0ZS1mdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgICAgICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YSwgICAgICAgICAgIC8qITwgQ29udHJvbCBkYXRhIG9mIGN1cnJlbnQgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlclJlYWwsICAgICAgICAgICAgICAgICAvKiE8IFJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiphbmFseXNCdWZmZXJJbWFnLCAgICAgICAgICAgICAgICAgLyohPCBJbWFnIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCAqLwotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1c2VMUCwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGVncmVlQWxpYXMsICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVzdGltYXRlZCBhbGlhc2luZyBmb3IgZWFjaCBRTUYgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lRXJyb3JGbGFnCi0gICAgICAgICAgICAgICAgICAgICAgKQotewotICBpbnQgYywgaSwgaiwgZW52Tm9pc2UgPSAwOwotICBVQ0hBUiogICBib3JkZXJzID0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnM7Ci0KLSAgRklYUF9TR0wgKm5vaXNlTGV2ZWxzICAgICAgID0gaEZyYW1lRGF0YS0+c2JyTm9pc2VGbG9vckxldmVsOwordm9pZCBjYWxjdWxhdGVTYnJFbnZlbG9wZSgKKyAgICBRTUZfU0NBTEVfRkFDVE9SICpzYnJTY2FsZUZhY3RvciwgLyohPCBTY2FsaW5nIGZhY3RvcnMgKi8KKyAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRQorICAgICAgICBoX3Nicl9jYWxfZW52LCAvKiE8IEhhbmRsZSB0byBzdHJ1Y3QgZmlsbGVkIGJ5IHRoZSBjcmVhdGUtZnVuY3Rpb24gKi8KKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YSwgICAvKiE8IENvbnRyb2wgZGF0YSBvZiBjdXJyZW50IGZyYW1lICovCisgICAgUFZDX0RZTkFNSUNfREFUQSAqcFB2Y0R5bmFtaWNEYXRhLAorICAgIEZJWFBfREJMICoKKyAgICAgICAgKmFuYWx5c0J1ZmZlclJlYWwsIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICBGSVhQX0RCTCAqCisgICAgICAgICphbmFseXNCdWZmZXJJbWFnLCAvKiE8IEltYWcgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgY29uc3QgaW50IHVzZUxQLAorICAgIEZJWFBfREJMICpkZWdyZWVBbGlhcywgLyohPCBFc3RpbWF0ZWQgYWxpYXNpbmcgZm9yIGVhY2ggUU1GIGNoYW5uZWwgKi8KKyAgICBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBpbnQgZnJhbWVFcnJvckZsYWcpIHsKKyAgaW50IGMsIGksIGlfc3RvcCwgaiwgZW52Tm9pc2UgPSAwOworICBVQ0hBUiAqYm9yZGVycyA9IGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzOworICBVQ0hBUiAqYm9yZGVyc1B2YyA9IGhGcmFtZURhdGEtPmZyYW1lSW5mby5wdmNCb3JkZXJzOworICBpbnQgcHZjX21vZGUgPSBwUHZjRHluYW1pY0RhdGEtPnB2Y19tb2RlOworICBpbnQgZmlyc3Rfc3RhcnQgPQorICAgICAgKChwdmNfbW9kZSA+IDApID8gYm9yZGVyc1B2Y1swXSA6IGJvcmRlcnNbMF0pICogaEhlYWRlckRhdGEtPnRpbWVTdGVwOworICBGSVhQX1NHTCAqbm9pc2VMZXZlbHMgPSBoRnJhbWVEYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWw7CiAgIEhBTkRMRV9GUkVRX0JBTkRfREFUQSBoRnJlcSA9ICZoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhOworICBVQ0hBUiAqKnBGcmVxQmFuZFRhYmxlID0gaEZyZXEtPmZyZXFCYW5kVGFibGU7CisgIFVDSEFSICpwRnJlcUJhbmRUYWJsZU5vaXNlID0gaEZyZXEtPmZyZXFCYW5kVGFibGVOb2lzZTsKIAotICBpbnQgbG93U3ViYmFuZCAgPSBoRnJlcS0+bG93U3ViYmFuZDsKKyAgaW50IGxvd1N1YmJhbmQgPSBoRnJlcS0+bG93U3ViYmFuZDsKICAgaW50IGhpZ2hTdWJiYW5kID0gaEZyZXEtPmhpZ2hTdWJiYW5kOwotICBpbnQgbm9TdWJiYW5kcyAgPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CisgIGludCBub1N1YmJhbmRzID0gaGlnaFN1YmJhbmQgLSBsb3dTdWJiYW5kOwogCi0gIGludCAgICBub05vaXNlQmFuZHMgPSBoRnJlcS0+bk5mYjsKLSAgaW50ICAgIG5vX2NvbHMgICAgICA9IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXA7Ci0gIFVDSEFSICBmaXJzdF9zdGFydCAgPSBib3JkZXJzWzBdICogaEhlYWRlckRhdGEtPnRpbWVTdGVwOworICAvKiBvbGQgaGlnaCBzdWJiYW5kIGJlZm9yZSBoZWFkZXJjaGFuZ2UKKyAgICAgd2UgYXN1bWUgbm8gaGVhZGVyY2hhbmdlIGhlcmUgICAgICAgICovCisgIGludCBvdl9oaWdoU3ViYmFuZCA9IGhGcmVxLT5oaWdoU3ViYmFuZDsKIAotICBTQ0hBUiAgc2luZU1hcHBlZFtNQVhfRlJFUV9DT0VGRlNdOwotICBTQ0hBUiAgb3ZfYWRqX2UgPSBTQ0FMRTJFWFAoc2JyU2NhbGVGYWN0b3ItPm92X2hiX3NjYWxlKTsKLSAgU0NIQVIgIGFkal9lID0gMDsKLSAgU0NIQVIgIG91dHB1dF9lOwotICBTQ0hBUiAgZmluYWxfZSA9IDA7CisgIGludCBub05vaXNlQmFuZHMgPSBoRnJlcS0+bk5mYjsKKyAgVUNIQVIgKm5vU3ViRnJhbWVCYW5kcyA9IGhGcmVxLT5uU2ZiOworICBpbnQgbm9fY29scyA9IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXA7CiAKLSAgU0NIQVIgIG1heEdhaW5MaW1pdF9lID0gKGZyYW1lRXJyb3JGbGFnKSA/IE1BWF9HQUlOX0NPTkNFQUxfRVhQIDogTUFYX0dBSU5fRVhQOworICBTQ0hBUiBzaW5lTWFwcGVkW01BWF9GUkVRX0NPRUZGU107CisgIFNDSEFSIG92X2Fkal9lID0gU0NBTEUyRVhQKHNiclNjYWxlRmFjdG9yLT5vdl9oYl9zY2FsZSk7CisgIFNDSEFSIGFkal9lID0gMDsKKyAgU0NIQVIgb3V0cHV0X2U7CisgIFNDSEFSIGZpbmFsX2UgPSAwOworICAvKiBpbnRlci1URVMgaXMgYWN0aXZlIGluIG9uZSBvciBtb3JlIGVudmVsb3BlcyBvZiB0aGUgY3VycmVudCBTQlIgZnJhbWUgKi8KKyAgY29uc3QgaW50IGlURVNfZW5hYmxlID0gaEZyYW1lRGF0YS0+aVRFU2FjdGl2ZTsKKyAgY29uc3QgaW50IGlURVNfc2NhbGVfY2hhbmdlID0gKGlURVNfZW5hYmxlKSA/IElOVEVSX1RFU19TRl9DSEFOR0UgOiAwOworICBTQ0hBUiBtYXhHYWluTGltaXRfZSA9IChmcmFtZUVycm9yRmxhZykgPyBNQVhfR0FJTl9DT05DRUFMX0VYUCA6IE1BWF9HQUlOX0VYUDsKIAotICBpbnQgdXNlQWxpYXNSZWR1Y3Rpb25bNjRdOwogICBVQ0hBUiBzbW9vdGhfbGVuZ3RoID0gMDsKIAotICBGSVhQX1NHTCAqIHBJZW52ID0gaEZyYW1lRGF0YS0+aUVudmVsb3BlOworICBGSVhQX1NHTCAqcEllbnYgPSBoRnJhbWVEYXRhLT5pRW52ZWxvcGU7CiAKLSAgLyoKLSAgICBFeHRyYWN0IHNpbmUgZmxhZ3MgZm9yIGFsbCBRTUYgYmFuZHMKLSAgKi8KLSAgbWFwU2luZUZsYWdzKGhGcmVxLT5mcmVxQmFuZFRhYmxlWzFdLAotICAgICAgICAgICAgICAgaEZyZXEtPm5TZmJbMV0sCi0gICAgICAgICAgICAgICBoRnJhbWVEYXRhLT5hZGRIYXJtb25pY3MsCi0gICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5oYXJtRmxhZ3NQcmV2LAotICAgICAgICAgICAgICAgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLnRyYW5FbnYsCi0gICAgICAgICAgICAgICBzaW5lTWFwcGVkKTsKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHVzZUFsaWFzUmVkdWN0aW9uLCBVQ0hBUiwgNjQpCiAKKyAgLyogaWYgdmFsdWVzIGRpZmZlciB3ZSBoYWQgYSBoZWFkZXJjaGFuZ2U7IGlmIG9sZCBoaWdoYmFuZCBpcyBiaWdnZXIgdGhlbiBuZXcKKyAgICAgb25lIHdlIG5lZWQgdG8gcGF0Y2ggb3ZlcmxhcC1oaWdoYmFuZC1zY2FsaW5nIGZvciB0aGlzIGZyYW1lIChzZWUgdXNlIG9mCisgICAgIG92X2hpZ2hTdWJiYW5kKSBhcyBvdmVybGFwIGNvbnRhaW5zIGhpZ2hlciBmcmVxdWVuY3kgY29tcG9uZW50cyB3aGljaCB3b3VsZAorICAgICBnZXQgbG9zdCAqLworICBpZiAoaEZyZXEtPmhpZ2hTdWJiYW5kIDwgaEZyZXEtPm92X2hpZ2hTdWJiYW5kKSB7CisgICAgb3ZfaGlnaFN1YmJhbmQgPSBoRnJlcS0+b3ZfaGlnaFN1YmJhbmQ7CisgIH0KKworICBpZiAocHZjX21vZGUgPiAwKSB7CisgICAgaWYgKGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzTm9pc2VbMF0gPiBib3JkZXJzUHZjWzBdKSB7CisgICAgICAvKiBub2lzZSBlbnZlbG9wZSBvZiBwcmV2aW91cyBmcmFtZSBpcyB0cmFpbGluZyBpbnRvIGN1cnJlbnQgUFZDIGZyYW1lICovCisgICAgICBlbnZOb2lzZSA9IC0xOworICAgICAgbm9pc2VMZXZlbHMgPSBoX3Nicl9jYWxfZW52LT5wcmV2U2JyTm9pc2VGbG9vckxldmVsOworICAgICAgbm9Ob2lzZUJhbmRzID0gaF9zYnJfY2FsX2Vudi0+cHJldk5OZmI7CisgICAgICBub1N1YkZyYW1lQmFuZHMgPSBoX3Nicl9jYWxfZW52LT5wcmV2TlNmYjsKKyAgICAgIGxvd1N1YmJhbmQgPSBoX3Nicl9jYWxfZW52LT5wcmV2TG9TdWJiYW5kOworICAgICAgaGlnaFN1YmJhbmQgPSBoX3Nicl9jYWxfZW52LT5wcmV2SGlTdWJiYW5kOworCisgICAgICBub1N1YmJhbmRzID0gaGlnaFN1YmJhbmQgLSBsb3dTdWJiYW5kOworICAgICAgb3ZfaGlnaFN1YmJhbmQgPSBoaWdoU3ViYmFuZDsKKyAgICAgIGlmIChoaWdoU3ViYmFuZCA8IGhfc2JyX2NhbF9lbnYtPnByZXZfb3ZfaGlnaFN1YmJhbmQpIHsKKyAgICAgICAgb3ZfaGlnaFN1YmJhbmQgPSBoX3Nicl9jYWxfZW52LT5wcmV2X292X2hpZ2hTdWJiYW5kOworICAgICAgfQorCisgICAgICBwRnJlcUJhbmRUYWJsZVswXSA9IGhfc2JyX2NhbF9lbnYtPnByZXZGcmVxQmFuZFRhYmxlTG87CisgICAgICBwRnJlcUJhbmRUYWJsZVsxXSA9IGhfc2JyX2NhbF9lbnYtPnByZXZGcmVxQmFuZFRhYmxlSGk7CisgICAgICBwRnJlcUJhbmRUYWJsZU5vaXNlID0gaF9zYnJfY2FsX2Vudi0+cHJldkZyZXFCYW5kVGFibGVOb2lzZTsKKyAgICB9CisKKyAgICBtYXBTaW5lRmxhZ3NQdmMocEZyZXFCYW5kVGFibGVbMV0sIG5vU3ViRnJhbWVCYW5kc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+aGFybUZsYWdzUHJldiwKKyAgICAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+aGFybUZsYWdzUHJldkFjdGl2ZSwgc2luZU1hcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YS0+c2ludXNvaWRhbF9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgJmhfc2JyX2NhbF9lbnYtPnNpbnVzb2lkYWxfcG9zaXRpb25QcmV2LAorICAgICAgICAgICAgICAgICAgICAoYm9yZGVyc1swXSA+IGJvcmRlcnNQdmNbMF0pID8gMSA6IDApOworICB9IGVsc2UgeworICAgIC8qCisgICAgICBFeHRyYWN0IHNpbmUgZmxhZ3MgZm9yIGFsbCBRTUYgYmFuZHMKKyAgICAqLworICAgIG1hcFNpbmVGbGFncyhwRnJlcUJhbmRUYWJsZVsxXSwgbm9TdWJGcmFtZUJhbmRzWzFdLAorICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhLT5hZGRIYXJtb25pY3MsIGhfc2JyX2NhbF9lbnYtPmhhcm1GbGFnc1ByZXYsCisgICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmhhcm1GbGFnc1ByZXZBY3RpdmUsCisgICAgICAgICAgICAgICAgIGhGcmFtZURhdGEtPmZyYW1lSW5mby50cmFuRW52LCBzaW5lTWFwcGVkKTsKKyAgfQogCiAgIC8qCiAgICAgU2NhbiBmb3IgbWF4aW11bSBpbiBidWZmZXJkIG5vaXNlIGxldmVscy4KQEAgLTU2NywxNjMgKzk4MiwyODkgQEAKICAgICBpbiByZWZlcmVuY2UgZW5lcmdpZXMKICAgKi8KICAgaWYgKCF1c2VMUCkKLSAgICBhZGpfZSA9IGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lIC0gZ2V0U2NhbGVmYWN0b3IoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlLCBub1N1YmJhbmRzKTsKKyAgICBhZGpfZSA9IGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lIC0KKyAgICAgICAgICAgIGdldFNjYWxlZmFjdG9yKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZSwgbm9TdWJiYW5kcyk7CiAKICAgLyoKICAgICBTY2FuIGZvciBtYXhpbXVtIHJlZmVyZW5jZSBlbmVyZ3kgdG8gYmUgYWJsZQogICAgIHRvIHNlbGVjdCBhcHByb3ByaWF0ZSB2YWx1ZXMgZm9yIGFkal9lIGFuZCBmaW5hbF9lLgogICAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBoRnJhbWVEYXRhLT5mcmFtZUluZm8ubkVudmVsb3BlczsgaSsrKSB7Ci0gICAgSU5UIG1heFNmYk5yZ19lID0gLUZSQUNUX0JJVFMrTlJHX0VYUF9PRkZTRVQ7IC8qIHN0YXJ0IHZhbHVlIGZvciBtYXhpbXVtIHNlYXJjaCAqLwotCi0gICAgLyogRmV0Y2ggZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIGN1cnJlbnQgZW52ZWxvcGU6ICovCi0gICAgZm9yIChqPWhGcmVxLT5uU2ZiW2hGcmFtZURhdGEtPmZyYW1lSW5mby5mcmVxUmVzW2ldXTsgaiE9MDsgai0tKSB7Ci0gICAgICBtYXhTZmJOcmdfZSA9IGZpeE1heChtYXhTZmJOcmdfZSwoSU5UKSgoTE9ORykoKnBJZW52KyspICYgTUFTS19FKSk7Ci0gICAgfQotICAgIG1heFNmYk5yZ19lIC09IE5SR19FWFBfT0ZGU0VUOworICBpZiAocHZjX21vZGUgPiAwKSB7CisgICAgSU5UIG1heFNmYk5yZ19lID0gcFB2Y0R5bmFtaWNEYXRhLT5wcmVkRXNnX2V4cE1heDsKIAogICAgIC8qIEVuZXJneSAtPiBtYWduaXR1ZGUgKHNxcnQgaGFsZmVucyBleHBvbmVudCkgKi8KLSAgICBtYXhTZmJOcmdfZSA9IChtYXhTZmJOcmdfZSsxKSA+PiAxOyAgLyogKzEgdG8gZ28gc2FmZSAocm91bmQgdG8gbmV4dCBoaWdoZXIgaW50KSAqLworICAgIG1heFNmYk5yZ19lID0KKyAgICAgICAgKG1heFNmYk5yZ19lICsgMSkgPj4gMTsgLyogKzEgdG8gZ28gc2FmZSAocm91bmQgdG8gbmV4dCBoaWdoZXIgaW50KSAqLwogCiAgICAgLyogU29tZSBzYWZldHkgbWFyZ2luIGlzIG5lZWRlZCBmb3IgMiByZWFzb25zOgogICAgICAgIC0gVGhlIHNpZ25hbCBlbmVyZ3kgaXMgbm90IGVxdWFsbHkgc3ByZWFkIG92ZXIgYWxsIHN1YmJhbmQgc2FtcGxlcyBpbgogICAgICAgICAgYSBzcGVjaWZpYyBzZmIgb2YgYW4gZW52ZWxvcGUgKE5yZyBjb3VsZCBiZSB0b28gaGlnaCBieSBhIGZhY3RvciBvZgogICAgICAgICAgZW52V2lkdGggKiBzZmJXaWR0aCkKLSAgICAgICAtIFNtb290aGluZyBjYW4gc21lYXIgaGlnaCBnYWlucyBvZiB0aGUgcHJldmlvdXMgZW52ZWxvcGUgaW50byB0aGUgY3VycmVudAorICAgICAgIC0gU21vb3RoaW5nIGNhbiBzbWVhciBoaWdoIGdhaW5zIG9mIHRoZSBwcmV2aW91cyBlbnZlbG9wZSBpbnRvIHRoZQorICAgICAgIGN1cnJlbnQKICAgICAqLwogICAgIG1heFNmYk5yZ19lICs9IDY7CiAKLSAgICBpZiAoYm9yZGVyc1tpXSA8IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMpCi0gICAgICAvKiBUaGlzIGVudmVsb3BlIGFmZmVjdHMgdGltZXNsb3RzIHRoYXQgYmVsb25nIHRvIHRoZSBvdXRwdXQgZnJhbWUgKi8KLSAgICAgIGFkal9lID0gKG1heFNmYk5yZ19lID4gYWRqX2UpID8gbWF4U2ZiTnJnX2UgOiBhZGpfZTsKKyAgICBhZGpfZSA9IG1heFNmYk5yZ19lOworICAgIC8vIGZpbmFsX2Ugc2hvdWxkIG5vdCBleGlzdCBmb3IgUFZDIGZpeGZpeCBmcmFtaW5nCisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzOyBpKyspIHsKKyAgICAgIElOVCBtYXhTZmJOcmdfZSA9CisgICAgICAgICAgLUZSQUNUX0JJVFMgKyBOUkdfRVhQX09GRlNFVDsgLyogc3RhcnQgdmFsdWUgZm9yIG1heGltdW0gc2VhcmNoICovCiAKLSAgICBpZiAoYm9yZGVyc1tpKzFdID4gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cykKLSAgICAgIC8qIFRoaXMgZW52ZWxvcGUgYWZmZWN0cyB0aW1lc2xvdHMgYWZ0ZXIgdGhlIG91dHB1dCBmcmFtZSAqLwotICAgICAgZmluYWxfZSA9ICAobWF4U2ZiTnJnX2UgPiBmaW5hbF9lKSA/IG1heFNmYk5yZ19lIDogZmluYWxfZTsKKyAgICAgIC8qIEZldGNoIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBjdXJyZW50IGVudmVsb3BlOiAqLworICAgICAgZm9yIChqID0gbm9TdWJGcmFtZUJhbmRzW2hGcmFtZURhdGEtPmZyYW1lSW5mby5mcmVxUmVzW2ldXTsgaiAhPSAwOyBqLS0pIHsKKyAgICAgICAgbWF4U2ZiTnJnX2UgPSBmaXhNYXgobWF4U2ZiTnJnX2UsIChJTlQpKChMT05HKSgqcEllbnYrKykgJiBNQVNLX0UpKTsKKyAgICAgIH0KKyAgICAgIG1heFNmYk5yZ19lIC09IE5SR19FWFBfT0ZGU0VUOwogCisgICAgICAvKiBFbmVyZ3kgLT4gbWFnbml0dWRlIChzcXJ0IGhhbGZlbnMgZXhwb25lbnQpICovCisgICAgICBtYXhTZmJOcmdfZSA9CisgICAgICAgICAgKG1heFNmYk5yZ19lICsgMSkgPj4gMTsgLyogKzEgdG8gZ28gc2FmZSAocm91bmQgdG8gbmV4dCBoaWdoZXIgaW50KSAqLworCisgICAgICAvKiBTb21lIHNhZmV0eSBtYXJnaW4gaXMgbmVlZGVkIGZvciAyIHJlYXNvbnM6CisgICAgICAgICAtIFRoZSBzaWduYWwgZW5lcmd5IGlzIG5vdCBlcXVhbGx5IHNwcmVhZCBvdmVyIGFsbCBzdWJiYW5kIHNhbXBsZXMgaW4KKyAgICAgICAgICAgYSBzcGVjaWZpYyBzZmIgb2YgYW4gZW52ZWxvcGUgKE5yZyBjb3VsZCBiZSB0b28gaGlnaCBieSBhIGZhY3RvciBvZgorICAgICAgICAgICBlbnZXaWR0aCAqIHNmYldpZHRoKQorICAgICAgICAgLSBTbW9vdGhpbmcgY2FuIHNtZWFyIGhpZ2ggZ2FpbnMgb2YgdGhlIHByZXZpb3VzIGVudmVsb3BlIGludG8gdGhlCisgICAgICAgICBjdXJyZW50CisgICAgICAqLworICAgICAgbWF4U2ZiTnJnX2UgKz0gNjsKKworICAgICAgaWYgKGJvcmRlcnNbaV0gPCBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzKQorICAgICAgICAvKiBUaGlzIGVudmVsb3BlIGFmZmVjdHMgdGltZXNsb3RzIHRoYXQgYmVsb25nIHRvIHRoZSBvdXRwdXQgZnJhbWUgKi8KKyAgICAgICAgYWRqX2UgPSBmTWF4KG1heFNmYk5yZ19lLCBhZGpfZSk7CisKKyAgICAgIGlmIChib3JkZXJzW2kgKyAxXSA+IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMpCisgICAgICAgIC8qIFRoaXMgZW52ZWxvcGUgYWZmZWN0cyB0aW1lc2xvdHMgYWZ0ZXIgdGhlIG91dHB1dCBmcmFtZSAqLworICAgICAgICBmaW5hbF9lID0gZk1heChtYXhTZmJOcmdfZSwgZmluYWxfZSk7CisgICAgfQogICB9Ci0KICAgLyoKICAgICBDYWxjdWxhdGUgYWRqdXN0bWVudCBmYWN0b3JzIGFuZCBhcHBseSB0aGVtIGZvciBldmVyeSBlbnZlbG9wZS4KICAgKi8KICAgcEllbnYgPSBoRnJhbWVEYXRhLT5pRW52ZWxvcGU7CiAKLSAgZm9yIChpID0gMDsgaSA8IGhGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzOyBpKyspIHsKLQorICBpZiAocHZjX21vZGUgPiAwKSB7CisgICAgLyogaXRlcmF0ZSBvdmVyIFNCUiB0aW1lIHNsb3RzIHN0YXJ0aW5nIHdpdGggYm9yZGVyc1B2Y1tpXSAqLworICAgIGkgPSBib3JkZXJzUHZjWzBdOyAvKiB1c3VhbGx5IDA7IGNhbiBiZSA+MCBpZiBzd2l0Y2hpbmcgZnJvbSBsZWdhY3kgU0JSIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBWQyAqLworICAgIGlfc3RvcCA9IFBWQ19OVElNRVNMT1Q7CisgICAgRkRLX0FTU0VSVChib3JkZXJzUHZjW2hGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzXSA9PSBQVkNfTlRJTUVTTE9UKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBpdGVyYXRlIG92ZXIgU0JSIGVudmVsb3BlcyBzdGFydGluZyB3aXRoIDAgKi8KKyAgICBpID0gMDsKKyAgICBpX3N0b3AgPSBoRnJhbWVEYXRhLT5mcmFtZUluZm8ubkVudmVsb3BlczsKKyAgfQorICBmb3IgKDsgaSA8IGlfc3RvcDsgaSsrKSB7CiAgICAgaW50IGssIG5vTm9pc2VGbGFnOwotICAgIFNDSEFSICBub2lzZV9lLCBpbnB1dF9lID0gU0NBTEUyRVhQKHNiclNjYWxlRmFjdG9yLT5oYl9zY2FsZSk7CisgICAgU0NIQVIgbm9pc2VfZSwgaW5wdXRfZSA9IFNDQUxFMkVYUChzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUpOwogICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwTnJncywgRU5WX0NBTENfTlJHUywgMSk7CiAKICAgICAvKgogICAgICAgSGVscGVyIHZhcmlhYmxlcy4KICAgICAqLwotICAgIFVDSEFSIHN0YXJ0X3BvcyA9IGhIZWFkZXJEYXRhLT50aW1lU3RlcCAqIGJvcmRlcnNbaV07ICAvKiBTdGFydC1wb3NpdGlvbiBpbiB0aW1lIChzdWJiYW5kIHNhbXBsZSkgZm9yIGN1cnJlbnQgZW52ZWxvcGUuICovCi0gICAgVUNIQVIgc3RvcF9wb3MgPSBoSGVhZGVyRGF0YS0+dGltZVN0ZXAgKiBib3JkZXJzW2krMV07IC8qIFN0b3AtcG9zaXRpb24gaW4gdGltZSAoc3ViYmFuZCBzYW1wbGUpIGZvciBjdXJyZW50IGVudmVsb3BlLiAqLwotICAgIFVDSEFSIGZyZXFfcmVzID0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmZyZXFSZXNbaV07ICAgICAvKiBGcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgY3VycmVudCBlbnZlbG9wZS4gKi8KKyAgICBpbnQgc3RhcnRfcG9zLCBzdG9wX3BvcywgZnJlcV9yZXM7CisgICAgaWYgKHB2Y19tb2RlID4gMCkgeworICAgICAgc3RhcnRfcG9zID0KKyAgICAgICAgICBoSGVhZGVyRGF0YS0+dGltZVN0ZXAgKgorICAgICAgICAgIGk7IC8qIFN0YXJ0LXBvc2l0aW9uIGluIHRpbWUgKHN1YmJhbmQgc2FtcGxlKSBmb3IgY3VycmVudCBlbnZlbG9wZS4gKi8KKyAgICAgIHN0b3BfcG9zID0gaEhlYWRlckRhdGEtPnRpbWVTdGVwICogKGkgKyAxKTsgLyogU3RvcC1wb3NpdGlvbiBpbiB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWJiYW5kIHNhbXBsZSkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZW52ZWxvcGUuICovCisgICAgICBmcmVxX3JlcyA9CisgICAgICAgICAgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvCisgICAgICAgICAgICAgIC5mcmVxUmVzWzBdOyAvKiBGcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgY3VycmVudCBlbnZlbG9wZS4gKi8KKyAgICAgIEZES19BU1NFUlQoCisgICAgICAgICAgZnJlcV9yZXMgPT0KKyAgICAgICAgICBoRnJhbWVEYXRhLT5mcmFtZUluZm8uZnJlcVJlc1toRnJhbWVEYXRhLT5mcmFtZUluZm8ubkVudmVsb3BlcyAtIDFdKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RhcnRfcG9zID0gaEhlYWRlckRhdGEtPnRpbWVTdGVwICoKKyAgICAgICAgICAgICAgICAgIGJvcmRlcnNbaV07IC8qIFN0YXJ0LXBvc2l0aW9uIGluIHRpbWUgKHN1YmJhbmQgc2FtcGxlKSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZW52ZWxvcGUuICovCisgICAgICBzdG9wX3BvcyA9IGhIZWFkZXJEYXRhLT50aW1lU3RlcCAqCisgICAgICAgICAgICAgICAgIGJvcmRlcnNbaSArIDFdOyAvKiBTdG9wLXBvc2l0aW9uIGluIHRpbWUgKHN1YmJhbmQgc2FtcGxlKSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZW52ZWxvcGUuICovCisgICAgICBmcmVxX3JlcyA9CisgICAgICAgICAgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvCisgICAgICAgICAgICAgIC5mcmVxUmVzW2ldOyAvKiBGcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgY3VycmVudCBlbnZlbG9wZS4gKi8KKyAgICB9CiAKLQotICAgIC8qIEFsd2F5cyBkbyBmdWxseSBpbml0aWFsaXplIHRoZSB0ZW1wb3JhcnkgZW5lcmd5IHRhYmxlLiBUaGlzIHByZXZlbnRzIG5lZ2F0aXZlIGVuZXJnaWVzIGFuZCBleHRyZW1lIGdhaW4gZmFjdG9ycyBpbgotICAgICAgIGNhc2VzIHdoZXJlIHRoZSBudW1iZXIgb2YgbGltaXRlciBiYW5kcyBleGNlZWRzIHRoZSBudW1iZXIgb2Ygc3ViYmFuZHMuIFRoZSBsYXR0ZXIgY2FuIGJlIGNhdXNlZCBieSB1bmRldGVjdGVkIGJpdAotICAgICAgIGVycm9ycyBhbmQgaXMgdGVzdGVkIGJ5IHNvbWUgc3RyZWFtcyBmcm9tIHRoZSBjZXJ0aWZpY2F0aW9uIHNldC4gKi8KKyAgICAvKiBBbHdheXMgZnVsbHkgaW5pdGlhbGl6ZSB0aGUgdGVtcG9yYXJ5IGVuZXJneSB0YWJsZS4gVGhpcyBwcmV2ZW50cworICAgICAgIG5lZ2F0aXZlIGVuZXJnaWVzIGFuZCBleHRyZW1lIGdhaW4gZmFjdG9ycyBpbiBjYXNlcyB3aGVyZSB0aGUgbnVtYmVyIG9mCisgICAgICAgbGltaXRlciBiYW5kcyBleGNlZWRzIHRoZSBudW1iZXIgb2Ygc3ViYmFuZHMuIFRoZSBsYXR0ZXIgY2FuIGJlIGNhdXNlZCBieQorICAgICAgIHVuZGV0ZWN0ZWQgYml0IGVycm9ycyBhbmQgaXMgdGVzdGVkIGJ5IHNvbWUgc3RyZWFtcyBmcm9tIHRoZQorICAgICAgIGNlcnRpZmljYXRpb24gc2V0LiAqLwogICAgIEZES21lbWNsZWFyKHBOcmdzLCBzaXplb2YoRU5WX0NBTENfTlJHUykpOwogCi0gICAgLyogSWYgdGhlIHN0YXJ0LXBvcyBvZiB0aGUgY3VycmVudCBlbnZlbG9wZSBlcXVhbHMgdGhlIHN0b3AgcG9zIG9mIHRoZSBjdXJyZW50Ci0gICAgICAgbm9pc2UgZW52ZWxvcGUsIGluY3JlYXNlIHRoZSBwb2ludGVyIChpLmUuIGNob29zZSB0aGUgbmV4dCBub2lzZS1mbG9vcikuKi8KLSAgICBpZiAoYm9yZGVyc1tpXSA9PSBoRnJhbWVEYXRhLT5mcmFtZUluZm8uYm9yZGVyc05vaXNlW2Vudk5vaXNlKzFdKXsKLSAgICAgIG5vaXNlTGV2ZWxzICs9IG5vTm9pc2VCYW5kczsgICAvKiBUaGUgbm9pc2UgZmxvb3IgZGF0YSBpcyBzdG9yZWQgaW4gYSByb3cgW25vaXNlRmxvb3IxIG5vaXNlRmxvb3IyLi4uXS4qLwotICAgICAgZW52Tm9pc2UrKzsKLSAgICB9CisgICAgaWYgKHB2Y19tb2RlID4gMCkgeworICAgICAgLyogZ2V0IHByZWRpY3RlZCBlbmVyZ3kgdmFsdWVzIGZyb20gUFZDIG1vZHVsZSAqLworICAgICAgZXhwYW5kUHJlZEVzZyhwUHZjRHluYW1pY0RhdGEsIGksIChpbnQpTUFYX0ZSRVFfQ09FRkZTLCBwTnJncy0+bnJnUmVmLAorICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnUmVmX2UpOwogCi0gICAgaWYoaT09aEZyYW1lRGF0YS0+ZnJhbWVJbmZvLnRyYW5FbnYgfHwgaT09aF9zYnJfY2FsX2Vudi0+cHJldlRyYW5FbnYpIC8qIGF0dGFjayAqLworICAgICAgaWYgKGkgPT0gYm9yZGVyc1swXSkgeworICAgICAgICBtYXBTaW5lRmxhZ3MocEZyZXFCYW5kVGFibGVbMV0sIG5vU3ViRnJhbWVCYW5kc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgIGhGcmFtZURhdGEtPmFkZEhhcm1vbmljcywgaF9zYnJfY2FsX2Vudi0+aGFybUZsYWdzUHJldiwKKyAgICAgICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmhhcm1GbGFnc1ByZXZBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhLT5zaW51c29pZGFsX3Bvc2l0aW9uLCBzaW5lTWFwcGVkKTsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPj0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnNOb2lzZVtlbnZOb2lzZSArIDFdKSB7CisgICAgICAgIGlmIChlbnZOb2lzZSA+PSAwKSB7CisgICAgICAgICAgbm9pc2VMZXZlbHMgKz0gbm9Ob2lzZUJhbmRzOyAvKiBUaGUgbm9pc2UgZmxvb3IgZGF0YSBpcyBzdG9yZWQgaW4gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IFtub2lzZUZsb29yMSBub2lzZUZsb29yMi4uLl0uKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBsZWF2ZSB0cmFpbGluZyBub2lzZSBlbnZlbG9wZSBvZiBwYXN0IGZyYW1lICovCisgICAgICAgICAgbm9Ob2lzZUJhbmRzID0gaEZyZXEtPm5OZmI7CisgICAgICAgICAgbm9TdWJGcmFtZUJhbmRzID0gaEZyZXEtPm5TZmI7CisgICAgICAgICAgbm9pc2VMZXZlbHMgPSBoRnJhbWVEYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWw7CisKKyAgICAgICAgICBsb3dTdWJiYW5kID0gaEZyZXEtPmxvd1N1YmJhbmQ7CisgICAgICAgICAgaGlnaFN1YmJhbmQgPSBoRnJlcS0+aGlnaFN1YmJhbmQ7CisKKyAgICAgICAgICBub1N1YmJhbmRzID0gaGlnaFN1YmJhbmQgLSBsb3dTdWJiYW5kOworICAgICAgICAgIG92X2hpZ2hTdWJiYW5kID0gaGlnaFN1YmJhbmQ7CisgICAgICAgICAgaWYgKGhpZ2hTdWJiYW5kIDwgaEZyZXEtPm92X2hpZ2hTdWJiYW5kKSB7CisgICAgICAgICAgICBvdl9oaWdoU3ViYmFuZCA9IGhGcmVxLT5vdl9oaWdoU3ViYmFuZDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwRnJlcUJhbmRUYWJsZVswXSA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlTG87CisgICAgICAgICAgcEZyZXFCYW5kVGFibGVbMV0gPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZUhpOworICAgICAgICAgIHBGcmVxQmFuZFRhYmxlTm9pc2UgPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZU5vaXNlOworICAgICAgICB9CisgICAgICAgIGVudk5vaXNlKys7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIElmIHRoZSBzdGFydC1wb3Mgb2YgdGhlIGN1cnJlbnQgZW52ZWxvcGUgZXF1YWxzIHRoZSBzdG9wIHBvcyBvZiB0aGUKKyAgICAgICAgIGN1cnJlbnQgbm9pc2UgZW52ZWxvcGUsIGluY3JlYXNlIHRoZSBwb2ludGVyIChpLmUuIGNob29zZSB0aGUgbmV4dAorICAgICAgICAgbm9pc2UtZmxvb3IpLiovCisgICAgICBpZiAoYm9yZGVyc1tpXSA9PSBoRnJhbWVEYXRhLT5mcmFtZUluZm8uYm9yZGVyc05vaXNlW2Vudk5vaXNlICsgMV0pIHsKKyAgICAgICAgbm9pc2VMZXZlbHMgKz0gbm9Ob2lzZUJhbmRzOyAvKiBUaGUgbm9pc2UgZmxvb3IgZGF0YSBpcyBzdG9yZWQgaW4gYSByb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbm9pc2VGbG9vcjEgbm9pc2VGbG9vcjIuLi5dLiovCisgICAgICAgIGVudk5vaXNlKys7CisgICAgICB9CisgICAgfQorICAgIGlmIChpID09IGhGcmFtZURhdGEtPmZyYW1lSW5mby50cmFuRW52IHx8CisgICAgICAgIGkgPT0gaF9zYnJfY2FsX2Vudi0+cHJldlRyYW5FbnYpIC8qIGF0dGFjayAqLwogICAgIHsKICAgICAgIG5vTm9pc2VGbGFnID0gMTsKLSAgICAgIGlmICghdXNlTFApCi0gICAgICAgIHNtb290aF9sZW5ndGggPSAwOyAgLyogTm8gc21vb3RoaW5nIG9uIGF0dGFja3MhICovCi0gICAgfQotICAgIGVsc2UgeworICAgICAgaWYgKCF1c2VMUCkgc21vb3RoX2xlbmd0aCA9IDA7IC8qIE5vIHNtb290aGluZyBvbiBhdHRhY2tzISAqLworICAgIH0gZWxzZSB7CiAgICAgICBub05vaXNlRmxhZyA9IDA7CiAgICAgICBpZiAoIXVzZUxQKQotICAgICAgICBzbW9vdGhfbGVuZ3RoID0gKDEgLSBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zbW9vdGhpbmdMZW5ndGgpIDw8IDI7ICAvKiBjYW4gYmVjb21lIGVpdGhlciAwIG9yIDQgKi8KKyAgICAgICAgc21vb3RoX2xlbmd0aCA9ICgxIC0gaEhlYWRlckRhdGEtPmJzX2RhdGEuc21vb3RoaW5nTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgMjsgLyogY2FuIGJlY29tZSBlaXRoZXIgMCBvciA0ICovCiAgICAgfQogCi0KICAgICAvKgogICAgICAgRW5lcmd5IGVzdGltYXRpb24gaW4gdHJhbnNwb3NlZCBoaWdoYmFuZC4KICAgICAqLwogICAgIGlmIChoSGVhZGVyRGF0YS0+YnNfZGF0YS5pbnRlcnBvbEZyZXEpCi0gICAgICBjYWxjTnJnUGVyU3ViYmFuZChhbmFseXNCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwgaGlnaFN1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsIHN0b3BfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdFc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnRXN0X2UpOworICAgICAgY2FsY05yZ1BlclN1YmJhbmQoYW5hbHlzQnVmZmVyUmVhbCwgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwgaGlnaFN1YmJhbmQsIHN0YXJ0X3Bvcywgc3RvcF9wb3MsIGlucHV0X2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnRXN0LCBwTnJncy0+bnJnRXN0X2UpOwogICAgIGVsc2UKLSAgICAgIGNhbGNOcmdQZXJTZmIoYW5hbHlzQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICBoRnJlcS0+blNmYltmcmVxX3Jlc10sCi0gICAgICAgICAgICAgICAgICAgIGhGcmVxLT5mcmVxQmFuZFRhYmxlW2ZyZXFfcmVzXSwKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLCBzdG9wX3BvcywKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRfZSwKLSAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0VzdCwKKyAgICAgIGNhbGNOcmdQZXJTZmIoYW5hbHlzQnVmZmVyUmVhbCwgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICBub1N1YkZyYW1lQmFuZHNbZnJlcV9yZXNdLCBwRnJlcUJhbmRUYWJsZVtmcmVxX3Jlc10sCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3Bvcywgc3RvcF9wb3MsIGlucHV0X2UsIHBOcmdzLT5ucmdFc3QsCiAgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdFc3RfZSk7CiAKICAgICAvKgogICAgICAgQ2FsY3VsYXRlIHN1YmJhbmQgZ2FpbnMKICAgICAqLwogICAgIHsKLSAgICAgIFVDSEFSICogdGFibGUgPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZVtmcmVxX3Jlc107Ci0gICAgICBVQ0hBUiAqIHBVaU5vaXNlID0gJmhGcmVxLT5mcmVxQmFuZFRhYmxlTm9pc2VbMV07IC8qISBVcHBlciBsaW1pdCBvZiB0aGUgY3VycmVudCBub2lzZSBmbG9vciBiYW5kLiAqLworICAgICAgVUNIQVIgKnRhYmxlID0gcEZyZXFCYW5kVGFibGVbZnJlcV9yZXNdOworICAgICAgVUNIQVIgKnBVaU5vaXNlID0KKyAgICAgICAgICAmcEZyZXFCYW5kVGFibGVOb2lzZVsxXTsgLyohIFVwcGVyIGxpbWl0IG9mIHRoZSBjdXJyZW50IG5vaXNlIGZsb29yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQuICovCiAKLSAgICAgIEZJWFBfU0dMICogcE5vaXNlTGV2ZWxzID0gbm9pc2VMZXZlbHM7CisgICAgICBGSVhQX1NHTCAqcE5vaXNlTGV2ZWxzID0gbm9pc2VMZXZlbHM7CiAKLSAgICAgIEZJWFBfREJMIHRtcE5vaXNlID0gRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpKChMT05HKSgqcE5vaXNlTGV2ZWxzKSAmIE1BU0tfTSkpOwotICAgICAgU0NIQVIgICAgdG1wTm9pc2VfZSA9IChVQ0hBUikoKExPTkcpKCpwTm9pc2VMZXZlbHMrKykgJiBNQVNLX0UpIC0gTk9JU0VfRVhQX09GRlNFVDsKKyAgICAgIEZJWFBfREJMIHRtcE5vaXNlID0KKyAgICAgICAgICBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoKExPTkcpKCpwTm9pc2VMZXZlbHMpICYgTUFTS19NKSk7CisgICAgICBTQ0hBUiB0bXBOb2lzZV9lID0KKyAgICAgICAgICAoVUNIQVIpKChMT05HKSgqcE5vaXNlTGV2ZWxzKyspICYgTUFTS19FKSAtIE5PSVNFX0VYUF9PRkZTRVQ7CiAKICAgICAgIGludCBjYyA9IDA7CiAgICAgICBjID0gMDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBoRnJlcS0+blNmYltmcmVxX3Jlc107IGorKykgeworICAgICAgaWYgKHB2Y19tb2RlID4gMCkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbm9TdWJGcmFtZUJhbmRzW2ZyZXFfcmVzXTsgaisrKSB7CisgICAgICAgICAgVUNIQVIgc2luZVByZXNlbnRGbGFnID0gMDsKKyAgICAgICAgICBpbnQgbGkgPSB0YWJsZVtqXTsKKyAgICAgICAgICBpbnQgdWkgPSB0YWJsZVtqICsgMV07CiAKLSAgICAgICAgRklYUF9EQkwgcmVmTnJnICAgPSBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoKExPTkcpKCpwSWVudikgJiBNQVNLX00pKTsKLSAgICAgICAgU0NIQVIgICAgcmVmTnJnX2UgPSAoU0NIQVIpKChMT05HKSgqcEllbnYpICYgTUFTS19FKSAtIE5SR19FWFBfT0ZGU0VUOwotCi0gICAgICAgIFVDSEFSIHNpbmVQcmVzZW50RmxhZyA9IDA7Ci0gICAgICAgIGludCBsaSA9IHRhYmxlW2pdOwotICAgICAgICBpbnQgdWkgPSB0YWJsZVtqKzFdOwotCi0gICAgICAgIGZvciAoaz1saTsgazx1aTsgaysrKSB7Ci0gICAgICAgICAgc2luZVByZXNlbnRGbGFnIHw9IChpID49IHNpbmVNYXBwZWRbY2NdKTsKLSAgICAgICAgICBjYysrOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChrPWxpOyBrPHVpOyBrKyspIHsKLSAgICAgICAgICBpZiAoayA+PSAqcFVpTm9pc2UpIHsKLSAgICAgICAgICAgIHRtcE5vaXNlID0gRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpKChMT05HKSgqcE5vaXNlTGV2ZWxzKSAmIE1BU0tfTSkpOwotICAgICAgICAgICAgdG1wTm9pc2VfZSA9IChTQ0hBUikoKExPTkcpKCpwTm9pc2VMZXZlbHMrKykgJiBNQVNLX0UpIC0gTk9JU0VfRVhQX09GRlNFVDsKLQotICAgICAgICAgICAgcFVpTm9pc2UrKzsKKyAgICAgICAgICBmb3IgKGsgPSBsaTsgayA8IHVpOyBrKyspIHsKKyAgICAgICAgICAgIHNpbmVQcmVzZW50RmxhZyB8PSAoaSA+PSBzaW5lTWFwcGVkW2NjXSk7CisgICAgICAgICAgICBjYysrOwogICAgICAgICAgIH0KIAotICAgICAgICAgIEZES19BU1NFUlQoayA+PSBsb3dTdWJiYW5kKTsKKyAgICAgICAgICBmb3IgKGsgPSBsaTsgayA8IHVpOyBrKyspIHsKKyAgICAgICAgICAgIEZJWFBfREJMIHJlZk5yZyA9IHBOcmdzLT5ucmdSZWZbayAtIGxvd1N1YmJhbmRdOworICAgICAgICAgICAgU0NIQVIgcmVmTnJnX2UgPSBwTnJncy0+bnJnUmVmX2VbayAtIGxvd1N1YmJhbmRdOwogCi0gICAgICAgICAgaWYgKHVzZUxQKQotICAgICAgICAgICAgdXNlQWxpYXNSZWR1Y3Rpb25bay1sb3dTdWJiYW5kXSA9ICFzaW5lUHJlc2VudEZsYWc7CisgICAgICAgICAgICBpZiAoayA+PSAqcFVpTm9pc2UpIHsKKyAgICAgICAgICAgICAgdG1wTm9pc2UgPQorICAgICAgICAgICAgICAgICAgRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpKChMT05HKSgqcE5vaXNlTGV2ZWxzKSAmIE1BU0tfTSkpOworICAgICAgICAgICAgICB0bXBOb2lzZV9lID0KKyAgICAgICAgICAgICAgICAgIChTQ0hBUikoKExPTkcpKCpwTm9pc2VMZXZlbHMrKykgJiBNQVNLX0UpIC0gTk9JU0VfRVhQX09GRlNFVDsKIAotICAgICAgICAgIHBOcmdzLT5ucmdTaW5lW2NdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVfZVtjXSA9IDA7CisgICAgICAgICAgICAgIHBVaU5vaXNlKys7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICBjYWxjU3ViYmFuZEdhaW4ocmVmTnJnLCByZWZOcmdfZSwgcE5yZ3MsIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE5vaXNlLCB0bXBOb2lzZV9lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5lUHJlc2VudEZsYWcsIGkgPj0gc2luZU1hcHBlZFtjXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUZsYWcpOworICAgICAgICAgICAgRkRLX0FTU0VSVChrID49IGxvd1N1YmJhbmQpOwogCi0gICAgICAgICAgcE5yZ3MtPm5yZ1JlZltjXSAgID0gcmVmTnJnOwotICAgICAgICAgIHBOcmdzLT5ucmdSZWZfZVtjXSA9IHJlZk5yZ19lOworICAgICAgICAgICAgaWYgKHVzZUxQKSB1c2VBbGlhc1JlZHVjdGlvbltrIC0gbG93U3ViYmFuZF0gPSAhc2luZVByZXNlbnRGbGFnOwogCi0gICAgICAgICAgYysrOworICAgICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVbY10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgICAgIHBOcmdzLT5ucmdTaW5lX2VbY10gPSAwOworCisgICAgICAgICAgICBjYWxjU3ViYmFuZEdhaW4ocmVmTnJnLCByZWZOcmdfZSwgcE5yZ3MsIGMsIHRtcE5vaXNlLCB0bXBOb2lzZV9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmVQcmVzZW50RmxhZywgaSA+PSBzaW5lTWFwcGVkW2NdLCBub05vaXNlRmxhZyk7CisKKyAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcEllbnYrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBub1N1YkZyYW1lQmFuZHNbZnJlcV9yZXNdOyBqKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCByZWZOcmcgPSBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoKExPTkcpKCpwSWVudikgJiBNQVNLX00pKTsKKyAgICAgICAgICBTQ0hBUiByZWZOcmdfZSA9IChTQ0hBUikoKExPTkcpKCpwSWVudikgJiBNQVNLX0UpIC0gTlJHX0VYUF9PRkZTRVQ7CisKKyAgICAgICAgICBVQ0hBUiBzaW5lUHJlc2VudEZsYWcgPSAwOworICAgICAgICAgIGludCBsaSA9IHRhYmxlW2pdOworICAgICAgICAgIGludCB1aSA9IHRhYmxlW2ogKyAxXTsKKworICAgICAgICAgIGZvciAoayA9IGxpOyBrIDwgdWk7IGsrKykgeworICAgICAgICAgICAgc2luZVByZXNlbnRGbGFnIHw9IChpID49IHNpbmVNYXBwZWRbY2NdKTsKKyAgICAgICAgICAgIGNjKys7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CisgICAgICAgICAgICBpZiAoayA+PSAqcFVpTm9pc2UpIHsKKyAgICAgICAgICAgICAgdG1wTm9pc2UgPQorICAgICAgICAgICAgICAgICAgRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpKChMT05HKSgqcE5vaXNlTGV2ZWxzKSAmIE1BU0tfTSkpOworICAgICAgICAgICAgICB0bXBOb2lzZV9lID0KKyAgICAgICAgICAgICAgICAgIChTQ0hBUikoKExPTkcpKCpwTm9pc2VMZXZlbHMrKykgJiBNQVNLX0UpIC0gTk9JU0VfRVhQX09GRlNFVDsKKworICAgICAgICAgICAgICBwVWlOb2lzZSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGREtfQVNTRVJUKGsgPj0gbG93U3ViYmFuZCk7CisKKyAgICAgICAgICAgIGlmICh1c2VMUCkgdXNlQWxpYXNSZWR1Y3Rpb25bayAtIGxvd1N1YmJhbmRdID0gIXNpbmVQcmVzZW50RmxhZzsKKworICAgICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVbY10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgICAgIHBOcmdzLT5ucmdTaW5lX2VbY10gPSAwOworCisgICAgICAgICAgICBjYWxjU3ViYmFuZEdhaW4ocmVmTnJnLCByZWZOcmdfZSwgcE5yZ3MsIGMsIHRtcE5vaXNlLCB0bXBOb2lzZV9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmVQcmVzZW50RmxhZywgaSA+PSBzaW5lTWFwcGVkW2NdLCBub05vaXNlRmxhZyk7CisKKyAgICAgICAgICAgIHBOcmdzLT5ucmdSZWZbY10gPSByZWZOcmc7CisgICAgICAgICAgICBwTnJncy0+bnJnUmVmX2VbY10gPSByZWZOcmdfZTsKKworICAgICAgICAgICAgYysrOworICAgICAgICAgIH0KKyAgICAgICAgICBwSWVudisrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogCkBAIC03MzIsMTkgKzEyNzMsMzAgQEAKICAgICAqLwogCiAgICAgZm9yIChjID0gMDsgYyA8IGhGcmVxLT5ub0xpbWl0ZXJCYW5kczsgYysrKSB7Ci0KICAgICAgIEZJWFBfREJMIHN1bVJlZiwgYm9vc3RHYWluLCBtYXhHYWluOwogICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgU0NIQVIgICBzdW1SZWZfZSwgYm9vc3RHYWluX2UsIG1heEdhaW5fZSwgYWNjdV9lID0gMDsKKyAgICAgIFNDSEFSIHN1bVJlZl9lLCBib29zdEdhaW5fZSwgbWF4R2Fpbl9lLCBhY2N1X2UgPSAwOworICAgICAgaW50IG1heEdhaW5MaW1HYWluU3VtX2UgPSAwOwogCi0gICAgICBjYWxjQXZnR2FpbihwTnJncywKLSAgICAgICAgICAgICAgICAgIGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2NdLCBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjKzFdLAotICAgICAgICAgICAgICAgICAgJnN1bVJlZiwgJnN1bVJlZl9lLAotICAgICAgICAgICAgICAgICAgJm1heEdhaW4sICZtYXhHYWluX2UpOworICAgICAgY2FsY0F2Z0dhaW4ocE5yZ3MsIGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2NdLAorICAgICAgICAgICAgICAgICAgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbYyArIDFdLCAmc3VtUmVmLCAmc3VtUmVmX2UsICZtYXhHYWluLAorICAgICAgICAgICAgICAgICAgJm1heEdhaW5fZSk7CiAKICAgICAgIC8qIE11bHRpcGx5IG1heEdhaW4gd2l0aCBsaW1pdGVyR2FpbjogKi8KLSAgICAgIG1heEdhaW4gPSBmTXVsdChtYXhHYWluLCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfbVtoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyR2FpbnNdKTsKLSAgICAgIG1heEdhaW5fZSArPSBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfZVtoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyR2FpbnNdOworICAgICAgbWF4R2FpbiA9IGZNdWx0KAorICAgICAgICAgIG1heEdhaW4sCisgICAgICAgICAgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX21baEhlYWRlckRhdGEtPmJzX2RhdGEubGltaXRlckdhaW5zXSk7CisgICAgICAvKiBtYXhHYWluX2UgKz0KKyAgICAgICAqIEZES19zYnJEZWNvZGVyX3Nicl9saW1HYWluc19lW2hIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJHYWluc107ICovCisgICAgICAvKiBUaGUgYWRkaXRpb24gb2YgbWF4R2Fpbl9lIGFuZCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfZVszXSBtaWdodAorICAgICAgICAgeWllbGQgdmFsdWVzIGdyZWF0ZXIgdGhhbiAxMjcgd2hpY2ggZG9lc24ndCBmaXQgaW50byBhbiBTQ0hBUiEgSW4gdGhlc2UKKyAgICAgICAgIHJhcmUgc2l0dWF0aW9ucyBsaW1pdCBtYXhHYWluX2UgdG8gMTI3LgorICAgICAgKi8KKyAgICAgIG1heEdhaW5MaW1HYWluU3VtX2UgPQorICAgICAgICAgIG1heEdhaW5fZSArCisgICAgICAgICAgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX2VbaEhlYWRlckRhdGEtPmJzX2RhdGEubGltaXRlckdhaW5zXTsKKyAgICAgIG1heEdhaW5fZSA9CisgICAgICAgICAgKG1heEdhaW5MaW1HYWluU3VtX2UgPiAxMjcpID8gKFNDSEFSKTEyNyA6IChTQ0hBUiltYXhHYWluTGltR2FpblN1bV9lOwogCiAgICAgICAvKiBTY2FsZSBtYW50aXNzYSBvZiBNYXhHYWluIGludG8gcmFuZ2UgYmV0d2VlbiAwLjUgYW5kIDE6ICovCiAgICAgICBpZiAobWF4R2FpbiA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKQEAgLTc1Miw3ICsxMzA0LDcgQEAKICAgICAgIGVsc2UgewogICAgICAgICBTQ0hBUiBjaGFyVGVtcCA9IENvdW50TGVhZGluZ0JpdHMobWF4R2Fpbik7CiAgICAgICAgIG1heEdhaW5fZSAtPSBjaGFyVGVtcDsKLSAgICAgICAgbWF4R2FpbiAgPDw9IChpbnQpY2hhclRlbXA7CisgICAgICAgIG1heEdhaW4gPDw9IChpbnQpY2hhclRlbXA7CiAgICAgICB9CiAKICAgICAgIGlmIChtYXhHYWluX2UgPj0gbWF4R2FpbkxpbWl0X2UpIHsgLyogdXBwZXIgbGltaXQgKGUuZy4gOTYgZEIpICovCkBAIC03NjAsMjAgKzEzMTIsMjEgQEAKICAgICAgICAgbWF4R2Fpbl9lID0gbWF4R2FpbkxpbWl0X2U7CiAgICAgICB9CiAKLQogICAgICAgLyogRXZlcnkgc3ViYmFuZCBnYWluIGlzIGNvbXBhcmVkIHRvIHRoZSBzY2FsZWQgImF2ZXJhZ2UgZ2FpbiIKICAgICAgICAgIGFuZCBsaW1pdGVkIGlmIG5lY2Vzc2FyeTogKi8KLSAgICAgIGZvciAoayA9IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2NdOyBrIDwgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbYysxXTsgaysrKSB7Ci0gICAgICAgIGlmICggKHBOcmdzLT5ucmdHYWluX2Vba10gPiBtYXhHYWluX2UpIHx8IChwTnJncy0+bnJnR2Fpbl9lW2tdID09IG1heEdhaW5fZSAmJiBwTnJncy0+bnJnR2FpbltrXT5tYXhHYWluKSApIHsKLQorICAgICAgZm9yIChrID0gaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbY107IGsgPCBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjICsgMV07CisgICAgICAgICAgIGsrKykgeworICAgICAgICBpZiAoKHBOcmdzLT5ucmdHYWluX2Vba10gPiBtYXhHYWluX2UpIHx8CisgICAgICAgICAgICAocE5yZ3MtPm5yZ0dhaW5fZVtrXSA9PSBtYXhHYWluX2UgJiYgcE5yZ3MtPm5yZ0dhaW5ba10gPiBtYXhHYWluKSkgewogICAgICAgICAgIEZJWFBfREJMIG5vaXNlQW1wOwotICAgICAgICAgIFNDSEFSICAgIG5vaXNlQW1wX2U7CisgICAgICAgICAgU0NIQVIgbm9pc2VBbXBfZTsKIAotICAgICAgICAgIEZES19kaXZpZGVfTWFudEV4cChtYXhHYWluLCBtYXhHYWluX2UsIHBOcmdzLT5ucmdHYWluW2tdLCBwTnJncy0+bnJnR2Fpbl9lW2tdLCAmbm9pc2VBbXAsICZub2lzZUFtcF9lKTsKLSAgICAgICAgICBwTnJncy0+bm9pc2VMZXZlbFtrXSAgICA9IGZNdWx0KHBOcmdzLT5ub2lzZUxldmVsW2tdLG5vaXNlQW1wKTsKKyAgICAgICAgICBGREtfZGl2aWRlX01hbnRFeHAobWF4R2FpbiwgbWF4R2Fpbl9lLCBwTnJncy0+bnJnR2FpbltrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZVtrXSwgJm5vaXNlQW1wLCAmbm9pc2VBbXBfZSk7CisgICAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxba10gPSBmTXVsdChwTnJncy0+bm9pc2VMZXZlbFtrXSwgbm9pc2VBbXApOwogICAgICAgICAgIHBOcmdzLT5ub2lzZUxldmVsX2Vba10gKz0gbm9pc2VBbXBfZTsKLSAgICAgICAgICBwTnJncy0+bnJnR2FpbltrXSAgICAgICA9IG1heEdhaW47Ci0gICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZVtrXSAgICAgPSBtYXhHYWluX2U7CisgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5ba10gPSBtYXhHYWluOworICAgICAgICAgIHBOcmdzLT5ucmdHYWluX2Vba10gPSBtYXhHYWluX2U7CiAgICAgICAgIH0KICAgICAgIH0KIApAQCAtNzgzLDIxICsxMzM2LDIyIEBACiAgICAgICAgIDIuIENhbGN1bGF0ZSBib29zdCBmYWN0b3IgYnkgY29tcGFyaXNvbiB3aXRoIHJlZmVyZW5jZSBlbmVyZ3kKICAgICAgICAgMy4gQXBwbHkgYm9vc3QgZmFjdG9yIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBlbmVyZ3kgbG9zcyBkdWUgdG8gbGltaXRpbmcKICAgICAgICovCi0gICAgICBmb3IgKGsgPSBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjXTsgayA8IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2MgKyAxXTsgaysrKSB7Ci0KKyAgICAgIGZvciAoayA9IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2NdOyBrIDwgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbYyArIDFdOworICAgICAgICAgICBrKyspIHsKICAgICAgICAgLyogMS5hICBBZGQgZW5lcmd5IG9mIGFkanVzdGVkIHNpZ25hbCAodXNpbmcgcHJlbGltaW5hcnkgZ2FpbikgKi8KLSAgICAgICAgRklYUF9EQkwgIHRtcCAgID0gZk11bHQocE5yZ3MtPm5yZ0dhaW5ba10scE5yZ3MtPm5yZ0VzdFtrXSk7Ci0gICAgICAgIFNDSEFSICAgICB0bXBfZSA9IHBOcmdzLT5ucmdHYWluX2Vba10gKyBwTnJncy0+bnJnRXN0X2Vba107CisgICAgICAgIEZJWFBfREJMIHRtcCA9IGZNdWx0KHBOcmdzLT5ucmdHYWluW2tdLCBwTnJncy0+bnJnRXN0W2tdKTsKKyAgICAgICAgU0NIQVIgdG1wX2UgPSBwTnJncy0+bnJnR2Fpbl9lW2tdICsgcE5yZ3MtPm5yZ0VzdF9lW2tdOwogICAgICAgICBGREtfYWRkX01hbnRFeHAodG1wLCB0bXBfZSwgYWNjdSwgYWNjdV9lLCAmYWNjdSwgJmFjY3VfZSk7CiAKICAgICAgICAgLyogMS5iICBBZGQgc2luZSBlbmVyZ3kgKGlmIHByZXNlbnQpICovCi0gICAgICAgIGlmKHBOcmdzLT5ucmdTaW5lW2tdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7Ci0gICAgICAgICAgRkRLX2FkZF9NYW50RXhwKHBOcmdzLT5ucmdTaW5lW2tdLCBwTnJncy0+bnJnU2luZV9lW2tdLCBhY2N1LCBhY2N1X2UsICZhY2N1LCAmYWNjdV9lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKHBOcmdzLT5ucmdTaW5lW2tdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgICAgRkRLX2FkZF9NYW50RXhwKHBOcmdzLT5ucmdTaW5lW2tdLCBwTnJncy0+bnJnU2luZV9lW2tdLCBhY2N1LCBhY2N1X2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2N1LCAmYWNjdV9lKTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvKiAxLmMgIEFkZCBub2lzZSBlbmVyZ3kgKGlmIHByZXNlbnQpICovCi0gICAgICAgICAgaWYobm9Ob2lzZUZsYWcgPT0gMCkgewotICAgICAgICAgICAgRkRLX2FkZF9NYW50RXhwKHBOcmdzLT5ub2lzZUxldmVsW2tdLCBwTnJncy0+bm9pc2VMZXZlbF9lW2tdLCBhY2N1LCBhY2N1X2UsICZhY2N1LCAmYWNjdV9lKTsKKyAgICAgICAgICBpZiAobm9Ob2lzZUZsYWcgPT0gMCkgeworICAgICAgICAgICAgRkRLX2FkZF9NYW50RXhwKHBOcmdzLT5ub2lzZUxldmVsW2tdLCBwTnJncy0+bm9pc2VMZXZlbF9lW2tdLCBhY2N1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VfZSwgJmFjY3UsICZhY2N1X2UpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQpAQCAtODEyLDMzICsxMzY2LDMwIEBACiAgICAgICAgIGJvb3N0R2Fpbl9lID0gc3VtUmVmX2UgLSBhY2N1X2UgKyBkaXZfZTsKICAgICAgIH0KIAotCiAgICAgICAvKiAyLmIgUmVzdWx0IHRvbyBoaWdoPyAtLT4gTGltaXQgdGhlIGJvb3N0IGZhY3RvciB0byArNCBkQiAqLwotICAgICAgaWYoKGJvb3N0R2Fpbl9lICA+IDMpIHx8Ci0gICAgICAgICAoYm9vc3RHYWluX2UgPT0gMiAmJiBib29zdEdhaW4gPiBGTDJGWENPTlNUX0RCTCgwLjYyNzk3MTZmKSkgfHwKLSAgICAgICAgIChib29zdEdhaW5fZSA9PSAzICYmIGJvb3N0R2FpbiA+IEZMMkZYQ09OU1RfREJMKDAuMzEzOTg1OGYpKSApCi0gICAgICB7CisgICAgICBpZiAoKGJvb3N0R2Fpbl9lID4gMykgfHwKKyAgICAgICAgICAoYm9vc3RHYWluX2UgPT0gMiAmJiBib29zdEdhaW4gPiBGTDJGWENPTlNUX0RCTCgwLjYyNzk3MTZmKSkgfHwKKyAgICAgICAgICAoYm9vc3RHYWluX2UgPT0gMyAmJiBib29zdEdhaW4gPiBGTDJGWENPTlNUX0RCTCgwLjMxMzk4NThmKSkpIHsKICAgICAgICAgYm9vc3RHYWluID0gRkwyRlhDT05TVF9EQkwoMC42Mjc5NzE2Zik7CiAgICAgICAgIGJvb3N0R2Fpbl9lID0gMjsKICAgICAgIH0KICAgICAgIC8qIDMuICBNdWx0aXBseSBhbGwgc2lnbmFsIGNvbXBvbmVudHMgd2l0aCB0aGUgYm9vc3QgZmFjdG9yICovCi0gICAgICBmb3IgKGsgPSBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjXTsgayA8IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2MgKyAxXTsgaysrKSB7Ci0gICAgICAgIHBOcmdzLT5ucmdHYWluW2tdICAgPSBmTXVsdERpdjIocE5yZ3MtPm5yZ0dhaW5ba10sYm9vc3RHYWluKTsKKyAgICAgIGZvciAoayA9IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2NdOyBrIDwgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbYyArIDFdOworICAgICAgICAgICBrKyspIHsKKyAgICAgICAgcE5yZ3MtPm5yZ0dhaW5ba10gPSBmTXVsdERpdjIocE5yZ3MtPm5yZ0dhaW5ba10sIGJvb3N0R2Fpbik7CiAgICAgICAgIHBOcmdzLT5ucmdHYWluX2Vba10gPSBwTnJncy0+bnJnR2Fpbl9lW2tdICsgYm9vc3RHYWluX2UgKyAxOwogCi0gICAgICAgIHBOcmdzLT5ucmdTaW5lW2tdICAgPSBmTXVsdERpdjIocE5yZ3MtPm5yZ1NpbmVba10sYm9vc3RHYWluKTsKKyAgICAgICAgcE5yZ3MtPm5yZ1NpbmVba10gPSBmTXVsdERpdjIocE5yZ3MtPm5yZ1NpbmVba10sIGJvb3N0R2Fpbik7CiAgICAgICAgIHBOcmdzLT5ucmdTaW5lX2Vba10gPSBwTnJncy0+bnJnU2luZV9lW2tdICsgYm9vc3RHYWluX2UgKyAxOwogCi0gICAgICAgIHBOcmdzLT5ub2lzZUxldmVsW2tdICAgPSBmTXVsdERpdjIocE5yZ3MtPm5vaXNlTGV2ZWxba10sYm9vc3RHYWluKTsKKyAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxba10gPSBmTXVsdERpdjIocE5yZ3MtPm5vaXNlTGV2ZWxba10sIGJvb3N0R2Fpbik7CiAgICAgICAgIHBOcmdzLT5ub2lzZUxldmVsX2Vba10gPSBwTnJncy0+bm9pc2VMZXZlbF9lW2tdICsgYm9vc3RHYWluX2UgKyAxOwogICAgICAgfQogICAgIH0KICAgICAvKiBFbmQgb2Ygbm9pc2UgbGltaXRpbmcgKi8KIAogICAgIGlmICh1c2VMUCkKLSAgICAgIGFsaWFzaW5nUmVkdWN0aW9uKGRlZ3JlZUFsaWFzK2xvd1N1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwTnJncywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZUFsaWFzUmVkdWN0aW9uLAorICAgICAgYWxpYXNpbmdSZWR1Y3Rpb24oZGVncmVlQWxpYXMgKyBsb3dTdWJiYW5kLCBwTnJncywgdXNlQWxpYXNSZWR1Y3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzKTsKIAogICAgIC8qIEZvciB0aGUgdGltZXNsb3RzIHdpdGhpbiB0aGUgcmFuZ2UgZm9yIHRoZSBvdXRwdXQgZnJhbWUsCkBAIC04NTIsMTQgKzE0MDMsMTQgQEAKICAgICAvKgogICAgICAgQ29udmVydCBlbmVyZ2llcyB0byBhbXBsaXR1ZGUgbGV2ZWxzCiAgICAgKi8KLSAgICBmb3IgKGs9MDsgazxub1N1YmJhbmRzOyBrKyspIHsKLSAgICAgIEZES19zcXJ0X01hbnRFeHAoJnBOcmdzLT5ucmdTaW5lW2tdLCAgICAmcE5yZ3MtPm5yZ1NpbmVfZVtrXSwgICAgJm5vaXNlX2UpOwotICAgICAgRkRLX3NxcnRfTWFudEV4cCgmcE5yZ3MtPm5yZ0dhaW5ba10sICAgICZwTnJncy0+bnJnR2Fpbl9lW2tdLCAgICAmcE5yZ3MtPm5yZ0dhaW5fZVtrXSk7Ci0gICAgICBGREtfc3FydF9NYW50RXhwKCZwTnJncy0+bm9pc2VMZXZlbFtrXSwgJnBOcmdzLT5ub2lzZUxldmVsX2Vba10sICZub2lzZV9lKTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CisgICAgICBGREtfc3FydF9NYW50RXhwKCZwTnJncy0+bnJnU2luZVtrXSwgJnBOcmdzLT5ucmdTaW5lX2Vba10sICZub2lzZV9lKTsKKyAgICAgIEZES19zcXJ0X01hbnRFeHAoJnBOcmdzLT5ucmdHYWluW2tdLCAmcE5yZ3MtPm5yZ0dhaW5fZVtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBOcmdzLT5ucmdHYWluX2Vba10pOworICAgICAgRkRLX3NxcnRfTWFudEV4cCgmcE5yZ3MtPm5vaXNlTGV2ZWxba10sICZwTnJncy0+bm9pc2VMZXZlbF9lW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAmbm9pc2VfZSk7CiAgICAgfQogCi0KLQogICAgIC8qCiAgICAgICBBcHBseSBjYWxjdWxhdGVkIGdhaW5zIGFuZCBhZGFwdGl2ZSBub2lzZQogICAgICovCkBAIC04NjgsNDAgKzE0MTksNDIgQEAKICAgICB7CiAgICAgICBpbnQgc2NhbGVfY2hhbmdlLCBzY19jaGFuZ2U7CiAgICAgICBGSVhQX1NHTCBzbW9vdGhfcmF0aW87Ci0gICAgICBpbnQgZmlsdEJ1ZmZlck5vaXNlU2hpZnQ9MDsKKyAgICAgIGludCBmaWx0QnVmZmVyTm9pc2VTaGlmdCA9IDA7CiAKICAgICAgIC8qIEluaXRpYWxpemUgc21vb3RoaW5nIGJ1ZmZlcnMgd2l0aCB0aGUgZmlyc3QgdmFsaWQgdmFsdWVzICovCi0gICAgICBpZiAoaF9zYnJfY2FsX2Vudi0+c3RhcnRVcCkKLSAgICAgIHsKKyAgICAgIGlmIChoX3Nicl9jYWxfZW52LT5zdGFydFVwKSB7CiAgICAgICAgIGlmICghdXNlTFApIHsKICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2VfZSA9IG5vaXNlX2U7CiAKLSAgICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcl9lLCAgICBwTnJncy0+bnJnR2Fpbl9lLCAgbm9TdWJiYW5kcypzaXplb2YoU0NIQVIpKTsKLSAgICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlLCBwTnJncy0+bm9pc2VMZXZlbCwgbm9TdWJiYW5kcypzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlciwgICAgICBwTnJncy0+bnJnR2FpbiwgICAgbm9TdWJiYW5kcypzaXplb2YoRklYUF9EQkwpKTsKLQorICAgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2UsIHBOcmdzLT5ucmdHYWluX2UsCisgICAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMgKiBzaXplb2YoU0NIQVIpKTsKKyAgICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlLCBwTnJncy0+bm9pc2VMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyLCBwTnJncy0+bnJnR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOwogICAgICAgICB9CiAgICAgICAgIGhfc2JyX2NhbF9lbnYtPnN0YXJ0VXAgPSAwOwogICAgICAgfQogCiAgICAgICBpZiAoIXVzZUxQKSB7Ci0KLSAgICAgICAgZXF1YWxpemVGaWx0QnVmZmVyRXhwKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXIsICAgIC8qIGJ1ZmZlcmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2UsICAvKiBidWZmZXJlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW4sICAgICAgICAgICAgICAgLyogY3VycmVudCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdHYWluX2UsICAgICAgICAgICAgIC8qIGN1cnJlbnQgICovCisgICAgICAgIGVxdWFsaXplRmlsdEJ1ZmZlckV4cChoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyLCAgIC8qIGJ1ZmZlcmVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2UsIC8qIGJ1ZmZlcmVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnR2FpbiwgICAgICAgICAgICAgIC8qIGN1cnJlbnQgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnR2Fpbl9lLCAgICAgICAgICAgIC8qIGN1cnJlbnQgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzKTsKIAogICAgICAgICAvKiBBZGFwdCBleHBvbmVudCBvZiBidWZmZXJlZCBub2lzZSBsZXZlbHMgdG8gdGhlIGN1cnJlbnQgZXhwb25lbnQKICAgICAgICAgICAgc28gdGhleSBjYW4gZWFzaWx5IGJlIHNtb290aGVkICovCi0gICAgICAgIGlmKChoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2VfZSAtIG5vaXNlX2UpPj0wKSB7Ci0gICAgICAgICAgaW50IHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsKGludCkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgLSBub2lzZV9lKSk7Ci0gICAgICAgICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKQorICAgICAgICBpZiAoKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lIC0gbm9pc2VfZSkgPj0gMCkgeworICAgICAgICAgIGludCBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lIC0gbm9pc2VfZSkpOworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzOyBrKyspCiAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2Vba10gPDw9IHNoaWZ0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGludCBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUy0xLC0oaW50KShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2VfZSAtIG5vaXNlX2UpKTsKLSAgICAgICAgICBmb3IgKGs9MDsgazxub1N1YmJhbmRzOyBrKyspCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50IHNoaWZ0ID0KKyAgICAgICAgICAgICAgZml4TWluKERGUkFDVF9CSVRTIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC0oaW50KShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2VfZSAtIG5vaXNlX2UpKTsKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKQogICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdID4+PSBzaGlmdDsKICAgICAgICAgfQogCkBAIC05MDksNjAgKzE0NjIsNjEgQEAKICAgICAgIH0KIAogICAgICAgLyogZmluZCBiZXN0IHNjYWxpbmchICovCi0gICAgICBzY2FsZV9jaGFuZ2UgPSAtKERGUkFDVF9CSVRTLTEpOwotICAgICAgZm9yKGs9MDtrPG5vU3ViYmFuZHM7aysrKSB7Ci0gICAgICAgICAgc2NhbGVfY2hhbmdlID0gZml4TWF4KHNjYWxlX2NoYW5nZSwoaW50KXBOcmdzLT5ucmdHYWluX2Vba10pOworICAgICAgc2NhbGVfY2hhbmdlID0gLShERlJBQ1RfQklUUyAtIDEpOworICAgICAgZm9yIChrID0gMDsgayA8IG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgICBzY2FsZV9jaGFuZ2UgPSBmaXhNYXgoc2NhbGVfY2hhbmdlLCAoaW50KXBOcmdzLT5ucmdHYWluX2Vba10pOwogICAgICAgfQotICAgICAgc2NfY2hhbmdlID0gKHN0YXJ0X3Bvczxub19jb2xzKT8gYWRqX2UgLSBpbnB1dF9lIDogZmluYWxfZSAtIGlucHV0X2U7CisgICAgICBzY19jaGFuZ2UgPSAoc3RhcnRfcG9zIDwgbm9fY29scykgPyBhZGpfZSAtIGlucHV0X2UgOiBmaW5hbF9lIC0gaW5wdXRfZTsKIAotICAgICAgaWYgKChzY2FsZV9jaGFuZ2Utc2NfY2hhbmdlKzEpPDApCi0gICAgICAgICAgc2NhbGVfY2hhbmdlLT0oc2NhbGVfY2hhbmdlLXNjX2NoYW5nZSsxKTsKKyAgICAgIGlmICgoc2NhbGVfY2hhbmdlIC0gc2NfY2hhbmdlICsgMSkgPCAwKQorICAgICAgICBzY2FsZV9jaGFuZ2UgLT0gKHNjYWxlX2NoYW5nZSAtIHNjX2NoYW5nZSArIDEpOwogCi0gICAgICBzY2FsZV9jaGFuZ2UgPSAoc2NhbGVfY2hhbmdlLXNjX2NoYW5nZSkrMTsKKyAgICAgIHNjYWxlX2NoYW5nZSA9IChzY2FsZV9jaGFuZ2UgLSBzY19jaGFuZ2UpICsgMTsKIAotICAgICAgZm9yKGs9MDtrPG5vU3ViYmFuZHM7aysrKSB7Ci0gICAgICAgICAgaW50IHNjID0gc2NhbGVfY2hhbmdlLXBOcmdzLT5ucmdHYWluX2Vba10gKyAoc2NfY2hhbmdlLTEpOwotICAgICAgICAgIHBOcmdzLT5ucmdHYWluW2tdICA+Pj0gc2M7Ci0gICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZVtrXSArPSBzYzsKKyAgICAgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKKyAgICAgICAgaW50IHNjID0gc2NhbGVfY2hhbmdlIC0gcE5yZ3MtPm5yZ0dhaW5fZVtrXSArIChzY19jaGFuZ2UgLSAxKTsKKyAgICAgICAgcE5yZ3MtPm5yZ0dhaW5ba10gPj49IHNjOworICAgICAgICBwTnJncy0+bnJnR2Fpbl9lW2tdICs9IHNjOwogICAgICAgfQogCiAgICAgICBpZiAoIXVzZUxQKSB7Ci0gICAgICAgIGZvcihrPTA7azxub1N1YmJhbmRzO2srKykgewotICAgICAgICAgIGludCBzYyA9IHNjYWxlX2NoYW5nZS1oX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2Vba10gKyAoc2NfY2hhbmdlLTEpOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CisgICAgICAgICAgaW50IHNjID0KKyAgICAgICAgICAgICAgc2NhbGVfY2hhbmdlIC0gaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcl9lW2tdICsgKHNjX2NoYW5nZSAtIDEpOwogICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJba10gPj49IHNjOwogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGZvciAoaiA9IHN0YXJ0X3BvczsgaiA8IHN0b3BfcG9zOyBqKyspCi0gICAgICB7Ci0gICAgICAgIC8qIFRoaXMgdGltZXNsb3QgaXMgbG9jYXRlZCB3aXRoaW4gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHByb2Nlc3NpbmcgYnVmZmVyCi0gICAgICAgICAgIGFuZCB3aWxsIGJlIGZlZCBpbnRvIHRoZSBRTUYtc3ludGhlc2lzIGZvciB0aGUgY3VycmVudCBmcmFtZS4KKyAgICAgIGZvciAoaiA9IHN0YXJ0X3BvczsgaiA8IHN0b3BfcG9zOyBqKyspIHsKKyAgICAgICAgLyogVGhpcyB0aW1lc2xvdCBpcyBsb2NhdGVkIHdpdGhpbiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcHJvY2Vzc2luZworICAgICAgICAgICBidWZmZXIgYW5kIHdpbGwgYmUgZmVkIGludG8gdGhlIFFNRi1zeW50aGVzaXMgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgogICAgICAgICAgICAgICAgYWRqX2UgLSBpbnB1dF9lCiAgICAgICAgICAgIFRoaXMgdGltZXNsb3Qgd2lsbCBub3QgeWV0IGJlIGZlZCBpbnRvIHRoZSBRTUYgc28gd2UgZG8gbm90IGNhcmUKICAgICAgICAgICAgYWJvdXQgdGhlIGFkal9lLgogICAgICAgICAgICAgICAgc2NfY2hhbmdlID0gZmluYWxfZSAtIGlucHV0X2UKICAgICAgICAgKi8KLSAgICAgICAgaWYgKCAoaj09bm9fY29scykgJiYgKHN0YXJ0X3Bvczxub19jb2xzKSApCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgc2hpZnQgPSAoaW50KSAobm9pc2VfZSAtIGZpbmFsX2UpOworICAgICAgICBpZiAoKGogPT0gbm9fY29scykgJiYgKHN0YXJ0X3BvcyA8IG5vX2NvbHMpKSB7CisgICAgICAgICAgaW50IHNoaWZ0ID0gKGludCkobm9pc2VfZSAtIGZpbmFsX2UpOwogICAgICAgICAgIGlmICghdXNlTFApCi0gICAgICAgICAgICBmaWx0QnVmZmVyTm9pc2VTaGlmdCA9IHNoaWZ0OyAgICAgICAgICAgICAgIC8qIHNoaWZ0aW5nIG9mIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZVtrXSB3aWxsIGJlIGFwcGxpZWQgaW4gZnVuY3Rpb24gYWRqdXN0VGltZVNsb3RIUSgpICovCi0gICAgICAgICAgaWYgKHNoaWZ0Pj0wKSB7Ci0gICAgICAgICAgICBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUy0xLHNoaWZ0KTsKLSAgICAgICAgICAgIGZvciAoaz0wOyBrPG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgICAgICAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQgPSBzaGlmdDsgLyogc2hpZnRpbmcgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZVtrXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBhcHBsaWVkIGluIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RUaW1lU2xvdEhRKCkgKi8KKyAgICAgICAgICBpZiAoc2hpZnQgPj0gMCkgeworICAgICAgICAgICAgc2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCBzaGlmdCk7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CiAgICAgICAgICAgICAgIHBOcmdzLT5ucmdTaW5lW2tdIDw8PSBzaGlmdDsKLSAgICAgICAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxba10gIDw8PSBzaGlmdDsKKyAgICAgICAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxba10gPDw9IHNoaWZ0OwogICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICBpZiAoIXVzZUxQKQogICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZVtrXSAgPDw9IHNoaWZ0OwogICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLXNoaWZ0KTsKLSAgICAgICAgICAgIGZvciAoaz0wOyBrPG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIC1zaGlmdCk7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CiAgICAgICAgICAgICAgIHBOcmdzLT5ucmdTaW5lW2tdID4+PSBzaGlmdDsKLSAgICAgICAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxba10gID4+PSBzaGlmdDsKKyAgICAgICAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxba10gPj49IHNoaWZ0OwogICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICBpZiAoIXVzZUxQKQogICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZVtrXSAgPj49IHNoaWZ0OwpAQCAtOTczLDE4MiArMTUyNywyNDggQEAKICAgICAgICAgICAvKiB1cGRhdGUgbm9pc2Ugc2NhbGluZyAqLwogICAgICAgICAgIG5vaXNlX2UgPSBmaW5hbF9lOwogICAgICAgICAgIGlmICghdXNlTFApCi0gICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2VfZSA9IG5vaXNlX2U7ICAvKiBzY2FsaW5nIHZhbHVlIHVudXNlZCEgKi8KKyAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lID0KKyAgICAgICAgICAgICAgICBub2lzZV9lOyAvKiBzY2FsaW5nIHZhbHVlIHVudXNlZCEgKi8KIAogICAgICAgICAgIC8qIHVwZGF0ZSBnYWluIGJ1ZmZlciovCiAgICAgICAgICAgc2NfY2hhbmdlIC09IChmaW5hbF9lIC0gaW5wdXRfZSk7CiAKLSAgICAgICAgICBpZiAoc2NfY2hhbmdlPDApIHsKLSAgICAgICAgICAgIGZvcihrPTA7azxub1N1YmJhbmRzO2srKykgewotICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdHYWluW2tdICA+Pj0gLXNjX2NoYW5nZTsKLSAgICAgICAgICAgICAgICBwTnJncy0+bnJnR2Fpbl9lW2tdICs9IC1zY19jaGFuZ2U7CisgICAgICAgICAgaWYgKHNjX2NoYW5nZSA8IDApIHsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKKyAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5ba10gPj49IC1zY19jaGFuZ2U7CisgICAgICAgICAgICAgIHBOcmdzLT5ucmdHYWluX2Vba10gKz0gLXNjX2NoYW5nZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghdXNlTFApIHsKLSAgICAgICAgICAgICAgZm9yKGs9MDtrPG5vU3ViYmFuZHM7aysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJba10gPj49IC1zY19jaGFuZ2U7CisgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKKyAgICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyW2tdID4+PSAtc2NfY2hhbmdlOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNjYWxlX2NoYW5nZSs9c2NfY2hhbmdlOworICAgICAgICAgICAgc2NhbGVfY2hhbmdlICs9IHNjX2NoYW5nZTsKICAgICAgICAgICB9CiAKLSAgICAgICAgfSAvLyBpZgorICAgICAgICB9IC8qIGlmICovCiAKICAgICAgICAgaWYgKCF1c2VMUCkgewotCiAgICAgICAgICAgLyogUHJldmVudCB0aGUgc21vb3RoaW5nIGZpbHRlciBmcm9tIHJ1bm5pbmcgb24gY29uc3RhbnQgbGV2ZWxzICovCi0gICAgICAgICAgaWYgKGotc3RhcnRfcG9zIDwgc21vb3RoX2xlbmd0aCkKLSAgICAgICAgICAgIHNtb290aF9yYXRpbyA9IEZES19zYnJEZWNvZGVyX3Nicl9zbW9vdGhGaWx0ZXJbai1zdGFydF9wb3NdOworICAgICAgICAgIGlmIChqIC0gc3RhcnRfcG9zIDwgc21vb3RoX2xlbmd0aCkKKyAgICAgICAgICAgIHNtb290aF9yYXRpbyA9IEZES19zYnJEZWNvZGVyX3Nicl9zbW9vdGhGaWx0ZXJbaiAtIHN0YXJ0X3Bvc107CiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgc21vb3RoX3JhdGlvID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAKLSAgICAgICAgICBhZGp1c3RUaW1lU2xvdEhRKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuYWx5c0J1ZmZlckltYWdbal1bbG93U3ViYmFuZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtb290aF9yYXRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vTm9pc2VGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICAgIGlmIChpVEVTX2VuYWJsZSkgeworICAgICAgICAgICAgLyogYWRqdXN0VGltZVNsb3RIUSgpIHdpdGhvdXQgYWRkaW5nIG9mIGFkZGl0aW9uYWwgaGFybW9uaWNzICovCisgICAgICAgICAgICBhZGp1c3RUaW1lU2xvdEhRX0dhaW5BbmROb2lzZSgKKyAgICAgICAgICAgICAgICAmYW5hbHlzQnVmZmVyUmVhbFtqXVtsb3dTdWJiYW5kXSwKKyAgICAgICAgICAgICAgICAmYW5hbHlzQnVmZmVySW1hZ1tqXVtsb3dTdWJiYW5kXSwgaF9zYnJfY2FsX2VudiwgcE5yZ3MsCisgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwgbm9TdWJiYW5kcywgc2NhbGVfY2hhbmdlLCBzbW9vdGhfcmF0aW8sIG5vTm9pc2VGbGFnLAorICAgICAgICAgICAgICAgIGZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRqdXN0VGltZVNsb3RIUSgmYW5hbHlzQnVmZmVyUmVhbFtqXVtsb3dTdWJiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuYWx5c0J1ZmZlckltYWdbal1bbG93U3ViYmFuZF0sIGhfc2JyX2NhbF9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLCBsb3dTdWJiYW5kLCBub1N1YmJhbmRzLCBzY2FsZV9jaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtb290aF9yYXRpbywgbm9Ob2lzZUZsYWcsIGZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRkRLX0FTU0VSVCghaVRFU19lbmFibGUpOyAvKiBub3Qgc3VwcG9ydGVkICovCiAgICAgICAgICAgaWYgKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKSB7Ci0gICAgICAgICAgICBhZGp1c3RUaW1lU2xvdF9FbGRHcmlkKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5oYXJtSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vTm9pc2VGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9zYnJfY2FsX2Vudi0+cGhhc2VJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUDJTQ0FMRShhZGpfZSkgLSBzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpOwotICAgICAgICAgIH0gZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkanVzdFRpbWVTbG90TEMoJmFuYWx5c0J1ZmZlclJlYWxbal1bbG93U3ViYmFuZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfc2JyX2NhbF9lbnYtPmhhcm1JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5waGFzZUluZGV4KTsKKyAgICAgICAgICAgIC8qIEZES21lbXNldChhbmFseXNCdWZmZXJSZWFsW2pdLCAwLCA2NCAqIHNpemVvZihGSVhQX0RCTCkpOyAqLworICAgICAgICAgICAgYWRqdXN0VGltZVNsb3RfRWxkR3JpZCgmYW5hbHlzQnVmZmVyUmVhbFtqXVtsb3dTdWJiYW5kXSwgcE5yZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5oYXJtSW5kZXgsIGxvd1N1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMsIHNjYWxlX2NoYW5nZSwgbm9Ob2lzZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5waGFzZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFAyU0NBTEUoYWRqX2UpIC0gc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRqdXN0VGltZVNsb3RMQygmYW5hbHlzQnVmZmVyUmVhbFtqXVtsb3dTdWJiYW5kXSwgcE5yZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5oYXJtSW5kZXgsIGxvd1N1YmJhbmQsIG5vU3ViYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NoYW5nZSwgbm9Ob2lzZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5waGFzZUluZGV4KTsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0gLy8gZm9yCisgICAgICAgIC8qIEluIGNhc2UgdGhlIGVudmVsb3BlIHNwYW5zIGFjY3Jvc3MgdGhlIG5vX2NvbHMgYm9yZGVyIGJvdGggZXhwb25lbnRzCisgICAgICAgICAqIGFyZSBuZWVkZWQuICovCisgICAgICAgIC8qIG5yZ0dhaW5fZVswLi4uKG5vU3ViYmFuZHMtMSldIGFyZSBlcXVhbGl6ZWQgYnkKKyAgICAgICAgICogZXF1YWxpemVGaWx0QnVmZmVyRXhwKCkgKi8KKyAgICAgICAgcE5yZ3MtPmV4cG9uZW50WyhqIDwgbm9fY29scykgPyAwIDogMV0gPQorICAgICAgICAgICAgKFNDSEFSKSgoMTUgLSBzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUpICsgcE5yZ3MtPm5yZ0dhaW5fZVswXSArIDEgLQorICAgICAgICAgICAgICAgICAgICBzY2FsZV9jaGFuZ2UpOworICAgICAgfSAvKiBmb3IgKi8KKworICAgICAgaWYgKGlURVNfZW5hYmxlKSB7CisgICAgICAgIGFwcGx5X2ludGVyX3RlcygKKyAgICAgICAgICAgIGFuYWx5c0J1ZmZlclJlYWwsIC8qIHBBQnVmUiwgKi8KKyAgICAgICAgICAgIGFuYWx5c0J1ZmZlckltYWcsIC8qIHBBQnVmSSwgKi8KKyAgICAgICAgICAgIHNiclNjYWxlRmFjdG9yLCBwTnJncy0+ZXhwb25lbnQsIGhIZWFkZXJEYXRhLT50aW1lU3RlcCwgc3RhcnRfcG9zLAorICAgICAgICAgICAgc3RvcF9wb3MsIGxvd1N1YmJhbmQsIG5vU3ViYmFuZHMsCisgICAgICAgICAgICBoRnJhbWVEYXRhCisgICAgICAgICAgICAgICAgLT5pbnRlclRlbXBTaGFwZU1vZGVbaV0gLyogZnJhbWVEYXRhLT5pbnRlclRlbXBTaGFwZU1vZGVbZW52XSAqLworICAgICAgICApOworCisgICAgICAgIC8qIGFkZCBhZGRpdGlvbmFsIGhhcm1vbmljcyAqLworICAgICAgICBmb3IgKGogPSBzdGFydF9wb3M7IGogPCBzdG9wX3BvczsgaisrKSB7CisgICAgICAgICAgLyogbWF0Y2ggZXhwb25lbnQgb2YgYWRkaXRpb25hbCBoYXJtb25pY3MgdG8gc2NhbGUgY2hhbmdlIG9mIFFNRiBkYXRhCisgICAgICAgICAgICogY2F1c2VkIGJ5IGFwcGx5X2ludGVyX3RlcygpICovCisgICAgICAgICAgc2NhbGVfY2hhbmdlID0gMDsKKworICAgICAgICAgIGlmICgoc3RhcnRfcG9zIDw9IG5vX2NvbHMpICYmIChzdG9wX3BvcyA+IG5vX2NvbHMpKSB7CisgICAgICAgICAgICAvKiBTY2FsaW5nIG9mIGFuYWx5c0J1ZmZlcnMgd2FzIHBvdGVudGlhbGx5IGNoYW5nZWQgd2l0aGluIHRoaXMKKyAgICAgICAgICAgICAgIGVudmVsb3BlLiBUaGUgcE5yZ3MtPm5yZ1NpbmVfZSBtYXRjaCB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlCisgICAgICAgICAgICAgICBlbnZlbG9wZS4gRm9yIChqPD1ub19jb2xzKSB0aGUgZXhwb25lbnQgb2YgdGhlIHNpbmUgZW5lcmdpZXMgaGFzCisgICAgICAgICAgICAgICB0byBiZSBhZGFwdGVkLiAqLworICAgICAgICAgICAgc2NhbGVfY2hhbmdlID0gcE5yZ3MtPmV4cG9uZW50WzFdIC0gcE5yZ3MtPmV4cG9uZW50WzBdOworICAgICAgICAgIH0KKworICAgICAgICAgIGFkanVzdFRpbWVTbG90SFFfQWRkSGFybW9uaWNzKAorICAgICAgICAgICAgICAmYW5hbHlzQnVmZmVyUmVhbFtqXVtsb3dTdWJiYW5kXSwKKyAgICAgICAgICAgICAgJmFuYWx5c0J1ZmZlckltYWdbal1bbG93U3ViYmFuZF0sIGhfc2JyX2NhbF9lbnYsIHBOcmdzLAorICAgICAgICAgICAgICBsb3dTdWJiYW5kLCBub1N1YmJhbmRzLAorICAgICAgICAgICAgICAtaVRFU19zY2FsZV9jaGFuZ2UgKyAoKGogPCBub19jb2xzKSA/IHNjYWxlX2NoYW5nZSA6IDApKTsKKyAgICAgICAgfQorICAgICAgfQogCiAgICAgICBpZiAoIXVzZUxQKSB7CiAgICAgICAgIC8qIFVwZGF0ZSB0aW1lLXNtb290aGluZy1idWZmZXJzIGZvciBnYWlucyBhbmQgbm9pc2UgbGV2ZWxzCi0gICAgICAgICAgIFRoZSBnYWlucyBhbmQgdGhlIG5vaXNlIHZhbHVlcyBvZiB0aGUgY3VycmVudCBlbnZlbG9wZSBhcmUgY29waWVkIGludG8gdGhlIGJ1ZmZlci4KLSAgICAgICAgICAgVGhpcyBoYXMgdG8gYmUgZG9uZSBhdCB0aGUgZW5kIG9mIGVhY2ggZW52ZWxvcGUgYXMgdGhlIHZhbHVlcyBhcmUgcmVxdWlyZWQgZm9yCi0gICAgICAgICAgIGEgc21vb3RoIHRyYW5zaXRpb24gdG8gdGhlIG5leHQgZW52ZWxvcGUuICovCi0gICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyLCAgICAgIHBOcmdzLT5ucmdHYWluLCAgICBub1N1YmJhbmRzKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcl9lLCAgICBwTnJncy0+bnJnR2Fpbl9lLCAgbm9TdWJiYW5kcypzaXplb2YoU0NIQVIpKTsKLSAgICAgICAgRkRLbWVtY3B5KGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZSwgcE5yZ3MtPm5vaXNlTGV2ZWwsIG5vU3ViYmFuZHMqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgIFRoZSBnYWlucyBhbmQgdGhlIG5vaXNlIHZhbHVlcyBvZiB0aGUgY3VycmVudCBlbnZlbG9wZSBhcmUgY29waWVkCisgICAgICAgICAgIGludG8gdGhlIGJ1ZmZlci4gVGhpcyBoYXMgdG8gYmUgZG9uZSBhdCB0aGUgZW5kIG9mIGVhY2ggZW52ZWxvcGUgYXMKKyAgICAgICAgICAgdGhlIHZhbHVlcyBhcmUgcmVxdWlyZWQgZm9yIGEgc21vb3RoIHRyYW5zaXRpb24gdG8gdGhlIG5leHQgZW52ZWxvcGUuCisgICAgICAgICAqLworICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlciwgcE5yZ3MtPm5yZ0dhaW4sCisgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2UsIHBOcmdzLT5ucmdHYWluX2UsCisgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzICogc2l6ZW9mKFNDSEFSKSk7CisgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2UsIHBOcmdzLT5ub2lzZUxldmVsLAorICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOwogICAgICAgfQotCiAgICAgfQogICAgIENfQUxMT0NfU0NSQVRDSF9FTkQocE5yZ3MsIEVOVl9DQUxDX05SR1MsIDEpOwogICB9CiAKKyAgLyogYWRhcHQgYWRqX2UgdG8gdGhlIHNjYWxlIGNoYW5nZSBjYXVzZWQgYnkgYXBwbHlfaW50ZXJfdGVzKCkgKi8KKyAgYWRqX2UgKz0gaVRFU19zY2FsZV9jaGFuZ2U7CisKICAgLyogUmVzY2FsZSBvdXRwdXQgc2FtcGxlcyAqLwogICB7CiAgICAgRklYUF9EQkwgbWF4VmFsOwogICAgIGludCBvdl9yZXNlcnZlLCByZXNlcnZlOwogCiAgICAgLyogRGV0ZXJtaW5lIGhlYWRyb29tIGluIG9sZCBhZGp1c3RlZCBzYW1wbGVzICovCi0gICAgbWF4VmFsID0gbWF4U3ViYmFuZFNhbXBsZSggYW5hbHlzQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VMUCkgPyBOVUxMIDogYW5hbHlzQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hTdWJiYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Rfc3RhcnQpOworICAgIG1heFZhbCA9CisgICAgICAgIG1heFN1YmJhbmRTYW1wbGUoYW5hbHlzQnVmZmVyUmVhbCwgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsIG92X2hpZ2hTdWJiYW5kLCAwLCBmaXJzdF9zdGFydCk7CiAKICAgICBvdl9yZXNlcnZlID0gZk5vcm0obWF4VmFsKTsKIAogICAgIC8qIERldGVybWluZSBoZWFkcm9vbSBpbiBuZXcgYWRqdXN0ZWQgc2FtcGxlcyAqLwotICAgIG1heFZhbCA9IG1heFN1YmJhbmRTYW1wbGUoIGFuYWx5c0J1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Rfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fY29scyk7CisgICAgbWF4VmFsID0KKyAgICAgICAgbWF4U3ViYmFuZFNhbXBsZShhbmFseXNCdWZmZXJSZWFsLCAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwgaGlnaFN1YmJhbmQsIGZpcnN0X3N0YXJ0LCBub19jb2xzKTsKIAogICAgIHJlc2VydmUgPSBmTm9ybShtYXhWYWwpOwogCiAgICAgLyogRGV0ZXJtaW5lIGNvbW1vbiBvdXRwdXQgZXhwb25lbnQgKi8KLSAgICBpZiAob3ZfYWRqX2UgLSBvdl9yZXNlcnZlICA+ICBhZGpfZSAtIHJlc2VydmUgKSAvKiBzZXQgb3V0cHV0X2UgdG8gdGhlIG1heGltdW0gKi8KLSAgICAgIG91dHB1dF9lID0gb3ZfYWRqX2UgLSBvdl9yZXNlcnZlOwotICAgIGVsc2UKLSAgICAgIG91dHB1dF9lID0gYWRqX2UgLSByZXNlcnZlOworICAgIG91dHB1dF9lID0gZk1heChvdl9hZGpfZSAtIG92X3Jlc2VydmUsIGFkal9lIC0gcmVzZXJ2ZSk7CiAKICAgICAvKiBSZXNjYWxlIG9sZCBzYW1wbGVzICovCi0gICAgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKCBhbmFseXNCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwgaGlnaFN1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBmaXJzdF9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG92X2Fkal9lIC0gb3V0cHV0X2UpOworICAgIHJlc2NhbGVTdWJiYW5kU2FtcGxlcyhhbmFseXNCdWZmZXJSZWFsLCAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsIG92X2hpZ2hTdWJiYW5kLCAwLCBmaXJzdF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZfYWRqX2UgLSBvdXRwdXRfZSk7CiAKICAgICAvKiBSZXNjYWxlIG5ldyBzYW1wbGVzICovCi0gICAgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKCBhbmFseXNCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwgaGlnaFN1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9zdGFydCwgbm9fY29scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkal9lIC0gb3V0cHV0X2UpOworICAgIHJlc2NhbGVTdWJiYW5kU2FtcGxlcyhhbmFseXNCdWZmZXJSZWFsLCAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsIGhpZ2hTdWJiYW5kLCBmaXJzdF9zdGFydCwgbm9fY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqX2UgLSBvdXRwdXRfZSk7CiAgIH0KIAogICAvKiBVcGRhdGUgaGJfc2NhbGUgKi8KICAgc2JyU2NhbGVGYWN0b3ItPmhiX3NjYWxlID0gRVhQMlNDQUxFKG91dHB1dF9lKTsKIAogICAvKiBTYXZlIHRoZSBjdXJyZW50IGZpbmFsIGV4cG9uZW50IGZvciB0aGUgbmV4dCBmcmFtZTogKi8KLSAgc2JyU2NhbGVGYWN0b3ItPm92X2hiX3NjYWxlID0gRVhQMlNDQUxFKGZpbmFsX2UpOworICAvKiBhZGFwdCBmaW5hbF9lIHRvIHRoZSBzY2FsZSBjaGFuZ2UgY2F1c2VkIGJ5IGFwcGx5X2ludGVyX3RlcygpICovCisgIHNiclNjYWxlRmFjdG9yLT5vdl9oYl9zY2FsZSA9IEVYUDJTQ0FMRShmaW5hbF9lICsgaVRFU19zY2FsZV9jaGFuZ2UpOwogCi0KLSAgLyogV2UgbmVlZCB0byByZW1lYmVyIHRvIHRoZSBuZXh0IGZyYW1lIHRoYXQgdGhlIHRyYW5zaWVudAorICAvKiBXZSBuZWVkIHRvIHJlbWVtYmVyIHRvIHRoZSBuZXh0IGZyYW1lIHRoYXQgdGhlIHRyYW5zaWVudAogICAgICB3aWxsIG9jY3VyIGluIHRoZSBmaXJzdCBlbnZlbG9wZSAoaWYgdHJhbkVudiA9PSBuRW52ZWxvcGVzKS4gKi8KLSAgaWYoaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLnRyYW5FbnYgPT0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXMpCisgIGlmIChoRnJhbWVEYXRhLT5mcmFtZUluZm8udHJhbkVudiA9PSBoRnJhbWVEYXRhLT5mcmFtZUluZm8ubkVudmVsb3BlcykKICAgICBoX3Nicl9jYWxfZW52LT5wcmV2VHJhbkVudiA9IDA7CiAgIGVsc2UKICAgICBoX3Nicl9jYWxfZW52LT5wcmV2VHJhbkVudiA9IC0xOwogCi19CisgIGlmIChwdmNfbW9kZSA+IDApIHsKKyAgICAvKiBOb3QgbW9yZSB0aGFuIGp1c3QgdGhlIGxhc3Qgbm9pc2UgZW52ZWxvcGUgcmVhY2hlcyBpbnRvIHRoZSBuZXh0IFBWQworICAgICAgIGZyYW1lISBUaGlzIHNob3VsZCBiZSB0cnVlIGJlY2F1c2UgYnNfbm9pc2VfcG9zaXRpb24gaXMgPD0gMTUgKi8KKyAgICBGREtfQVNTRVJUKGhGcmFtZURhdGEtPmZyYW1lSW5mbworICAgICAgICAgICAgICAgICAgIC5ib3JkZXJzTm9pc2VbaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlcyAtIDFdIDwKKyAgICAgICAgICAgICAgIFBWQ19OVElNRVNMT1QpOworICAgIGlmIChoRnJhbWVEYXRhLT5mcmFtZUluZm8KKyAgICAgICAgICAgIC5ib3JkZXJzTm9pc2VbaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3Blc10gPgorICAgICAgICBQVkNfTlRJTUVTTE9UKSB7CisgICAgICBGREtfQVNTRVJUKG5vaXNlTGV2ZWxzID09CisgICAgICAgICAgICAgICAgIChoRnJhbWVEYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWwgKworICAgICAgICAgICAgICAgICAgKGhGcmFtZURhdGEtPmZyYW1lSW5mby5uTm9pc2VFbnZlbG9wZXMgLSAxKSAqIG5vTm9pc2VCYW5kcykpOworICAgICAgaF9zYnJfY2FsX2Vudi0+cHJldk5OZmIgPSBub05vaXNlQmFuZHM7CiAKKyAgICAgIGhfc2JyX2NhbF9lbnYtPnByZXZOU2ZiWzBdID0gbm9TdWJGcmFtZUJhbmRzWzBdOworICAgICAgaF9zYnJfY2FsX2Vudi0+cHJldk5TZmJbMV0gPSBub1N1YkZyYW1lQmFuZHNbMV07CisKKyAgICAgIGhfc2JyX2NhbF9lbnYtPnByZXZMb1N1YmJhbmQgPSBsb3dTdWJiYW5kOworICAgICAgaF9zYnJfY2FsX2Vudi0+cHJldkhpU3ViYmFuZCA9IGhpZ2hTdWJiYW5kOworICAgICAgaF9zYnJfY2FsX2Vudi0+cHJldl9vdl9oaWdoU3ViYmFuZCA9IG92X2hpZ2hTdWJiYW5kOworCisgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+cHJldkZyZXFCYW5kVGFibGVMbywgcEZyZXFCYW5kVGFibGVbMF0sCisgICAgICAgICAgICAgICAgbm9TdWJGcmFtZUJhbmRzWzBdICsgMSk7CisgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+cHJldkZyZXFCYW5kVGFibGVIaSwgcEZyZXFCYW5kVGFibGVbMV0sCisgICAgICAgICAgICAgICAgbm9TdWJGcmFtZUJhbmRzWzFdICsgMSk7CisgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+cHJldkZyZXFCYW5kVGFibGVOb2lzZSwKKyAgICAgICAgICAgICAgICBoRnJlcS0+ZnJlcUJhbmRUYWJsZU5vaXNlLCBzaXplb2YoaEZyZXEtPmZyZXFCYW5kVGFibGVOb2lzZSkpOworCisgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+cHJldlNick5vaXNlRmxvb3JMZXZlbCwgbm9pc2VMZXZlbHMsCisgICAgICAgICAgICAgICAgTUFYX05PSVNFX0NPRUZGUyAqIHNpemVvZihGSVhQX1NHTCkpOworICAgIH0KKyAgfQorCisgIENfQUxMT0NfU0NSQVRDSF9FTkQodXNlQWxpYXNSZWR1Y3Rpb24sIFVDSEFSLCA2NCkKK30KIAogLyohCiAgIFxicmllZiAgIENyZWF0ZSBlbnZlbG9wZSBpbnN0YW5jZQogCi0gIE11c3QgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggY2hhbm5lbCBiZWZvcmUgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSBjYW4gYmUgdXNlZC4KKyAgTXVzdCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBjaGFubmVsIGJlZm9yZSBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIGNhbiBiZQorICB1c2VkLgogCiAgIFxyZXR1cm4gIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCiAqLwogU0JSX0VSUk9SCi1jcmVhdGVTYnJFbnZlbG9wZUNhbGMgKEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhzLCAgIC8qITwgcG9pbnRlciB0byBlbnZlbG9wZSBpbnN0YW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IHN0YXRpYyBTQlIgY29udHJvbCBkYXRhLCBpbml0aWFsaXplZCB3aXRoIGRlZmF1bHRzICovCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFuLCAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCBmb3Igd2hpY2ggdG8gYXNzaWduIGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncykKLXsKK2NyZWF0ZVNickVudmVsb3BlQ2FsYygKKyAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBocywgLyohPCBwb2ludGVyIHRvIGVudmVsb3BlIGluc3RhbmNlICovCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQQorICAgICAgICBoSGVhZGVyRGF0YSwgLyohPCBzdGF0aWMgU0JSIGNvbnRyb2wgZGF0YSwgaW5pdGlhbGl6ZWQgd2l0aCBkZWZhdWx0cyAqLworICAgIGNvbnN0IGludCBjaGFuLCAgLyohPCBDaGFubmVsIGZvciB3aGljaCB0byBhc3NpZ24gYnVmZmVycyAqLworICAgIGNvbnN0IFVJTlQgZmxhZ3MpIHsKICAgU0JSX0VSUk9SIGVyciA9IFNCUkRFQ19PSzsKICAgaW50IGk7CiAKICAgLyogQ2xlYXIgcHJldmlvdXMgbWlzc2luZyBoYXJtb25pY3MgZmxhZ3MgKi8KLSAgZm9yIChpPTA7IGk8KE1BWF9GUkVRX0NPRUZGUysxNSk+PjQ7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgQUREX0hBUk1PTklDU19GTEFHU19TSVpFOyBpKyspIHsKICAgICBocy0+aGFybUZsYWdzUHJldltpXSA9IDA7CisgICAgaHMtPmhhcm1GbGFnc1ByZXZBY3RpdmVbaV0gPSAwOwogICB9CiAgIGhzLT5oYXJtSW5kZXggPSAwOwogCisgIEZES21lbWNsZWFyKGhzLT5wcmV2U2JyTm9pc2VGbG9vckxldmVsLCBzaXplb2YoaHMtPnByZXZTYnJOb2lzZUZsb29yTGV2ZWwpKTsKKyAgaHMtPnByZXZOTmZiID0gMDsKKyAgRkRLbWVtY2xlYXIoaHMtPnByZXZGcmVxQmFuZFRhYmxlTm9pc2UsIHNpemVvZihocy0+cHJldkZyZXFCYW5kVGFibGVOb2lzZSkpOworICBocy0+c2ludXNvaWRhbF9wb3NpdGlvblByZXYgPSAwOworCiAgIC8qCiAgICAgU2V0dXAgcG9pbnRlcnMgZm9yIHRpbWUgc21vb3RoaW5nLgogICAgIFRoZSBidWZmZXIgaXRzZWxmIHdpbGwgYmUgaW5pdGlhbGl6ZWQgbGF0ZXIgdHJpZ2dlcmVkIGJ5IHRoZSBzdGFydFVwLWZsYWcuCiAgICovCiAgIGhzLT5wcmV2VHJhbkVudiA9IC0xOwogCi0KICAgLyogaW5pdGlhbGl6YXRpb24gKi8KICAgcmVzZXRTYnJFbnZlbG9wZUNhbGMoaHMpOwogCi0gIGlmIChjaGFuPT0wKSB7IC8qIGRvIHRoaXMgb25seSBvbmNlICovCisgIGlmIChjaGFuID09IDApIHsgLyogZG8gdGhpcyBvbmx5IG9uY2UgKi8KICAgICBlcnIgPSByZXNldEZyZXFCYW5kVGFibGVzKGhIZWFkZXJEYXRhLCBmbGFncyk7CiAgIH0KIApAQCAtMTE1OCwxNiArMTc3OCwxMiBAQAogLyohCiAgIFxicmllZiAgIENyZWF0ZSBlbnZlbG9wZSBpbnN0YW5jZQogCi0gIE11c3QgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggY2hhbm5lbCBiZWZvcmUgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSBjYW4gYmUgdXNlZC4KKyAgTXVzdCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBjaGFubmVsIGJlZm9yZSBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIGNhbiBiZQorICB1c2VkLgogCiAgIFxyZXR1cm4gIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCiAqLwotaW50Ci1kZWxldGVTYnJFbnZlbG9wZUNhbGMgKEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhzKQotewotICByZXR1cm4gMDsKLX0KLQoraW50IGRlbGV0ZVNickVudmVsb3BlQ2FsYyhIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBocykgeyByZXR1cm4gMDsgfQogCiAvKiEKICAgXGJyaWVmICAgUmVzZXQgZW52ZWxvcGUgaW5zdGFuY2UKQEAgLTExNzcsMTggKzE3OTMsMTggQEAKIAogICBccmV0dXJuICBlcnJvckNvZGUsIDAgaWYgc3VjY2Vzc2Z1bAogKi8KLXZvaWQKLXJlc2V0U2JyRW52ZWxvcGVDYWxjIChIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoQ2FsRW52KSAvKiE8IHBvaW50ZXIgdG8gZW52ZWxvcGUgaW5zdGFuY2UgKi8KK3ZvaWQgcmVzZXRTYnJFbnZlbG9wZUNhbGMoCisgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaENhbEVudikgLyohPCBwb2ludGVyIHRvIGVudmVsb3BlIGluc3RhbmNlICovCiB7CiAgIGhDYWxFbnYtPnBoYXNlSW5kZXggPSAwOwogCi0gIC8qIE5vaXNlIGV4cG9uZW50IG5lZWRzIHRvIGJlIHJlc2V0IGJlY2F1c2UgdGhlIG91dHB1dCBleHBvbmVudCBmb3IgdGhlIG5leHQgZnJhbWUgZGVwZW5kcyBvbiBpdCAqLworICAvKiBOb2lzZSBleHBvbmVudCBuZWVkcyB0byBiZSByZXNldCBiZWNhdXNlIHRoZSBvdXRwdXQgZXhwb25lbnQgZm9yIHRoZSBuZXh0CisgICAqIGZyYW1lIGRlcGVuZHMgb24gaXQgKi8KICAgaENhbEVudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgPSAwOwogCiAgIGhDYWxFbnYtPnN0YXJ0VXAgPSAxOwogfQogCi0KIC8qIQogICBcYnJpZWYgIEVxdWFsaXplIGV4cG9uZW50cyBvZiB0aGUgYnVmZmVyZWQgZ2FpbiB2YWx1ZXMgYW5kIHRoZSBuZXcgb25lcwogCkBAIC0xMTk2LDQwICsxODEyLDQxIEBACiAgIGNhbiBiZSBwZXJmb3JtZWQuCiAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggZW52ZWxvcGUgYmVmb3JlIGFkanVzdGluZy4KICovCi1zdGF0aWMgdm9pZCBlcXVhbGl6ZUZpbHRCdWZmZXJFeHAoRklYUF9EQkwgKmZpbHRCdWZmZXIsICAgICAvKiE8IGJ1ZmZlcmQgZ2FpbnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqZmlsdEJ1ZmZlcl9lLCAgIC8qITwgZXhwb25lbnRzIG9mIGJ1ZmZlcmQgZ2FpbnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnR2FpbiwgICAgICAgIC8qITwgZ2FpbnMgZm9yIGN1cnJlbnQgZW52ZWxvcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqbnJnR2Fpbl9lLCAgICAgIC8qITwgZXhwb25lbnRzIG9mIGdhaW5zIGZvciBjdXJyZW50IGVudmVsb3BlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHN1YmJhbmRzKSAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KK3N0YXRpYyB2b2lkIGVxdWFsaXplRmlsdEJ1ZmZlckV4cCgKKyAgICBGSVhQX0RCTCAqZmlsdEJ1ZmZlciwgLyohPCBidWZmZXJkIGdhaW5zICovCisgICAgU0NIQVIgKmZpbHRCdWZmZXJfZSwgIC8qITwgZXhwb25lbnRzIG9mIGJ1ZmZlcmQgZ2FpbnMgKi8KKyAgICBGSVhQX0RCTCAqbnJnR2FpbiwgICAgLyohPCBnYWlucyBmb3IgY3VycmVudCBlbnZlbG9wZSAqLworICAgIFNDSEFSICpucmdHYWluX2UsICAgICAvKiE8IGV4cG9uZW50cyBvZiBnYWlucyBmb3IgY3VycmVudCBlbnZlbG9wZSAqLworICAgIGludCBzdWJiYW5kcykgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KIHsKLSAgaW50ICAgYmFuZDsKLSAgaW50ICBkaWZmOworICBpbnQgYmFuZDsKKyAgaW50IGRpZmY7CiAKLSAgZm9yIChiYW5kPTA7IGJhbmQ8c3ViYmFuZHM7IGJhbmQrKyl7Ci0gICAgZGlmZiA9IChpbnQpIChucmdHYWluX2VbYmFuZF0gLSBmaWx0QnVmZmVyX2VbYmFuZF0pOwotICAgIGlmIChkaWZmPjApIHsKLSAgICAgIGZpbHRCdWZmZXJbYmFuZF0gPj49IGRpZmY7ICAgLyogQ29tcGVuc2F0ZSBmb3IgdGhlIHNjYWxlIGNoYW5nZSBieSBzaGlmdGluZyB0aGUgbWFudGlzc2EuICovCi0gICAgICBmaWx0QnVmZmVyX2VbYmFuZF0gKz0gZGlmZjsgIC8qIE5ldyBnYWluIGlzIGJpZ2dlciwgdXNlIGl0cyBleHBvbmVudCAqLwotICAgIH0KLSAgICBlbHNlIGlmIChkaWZmPDApIHsKKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHN1YmJhbmRzOyBiYW5kKyspIHsKKyAgICBkaWZmID0gKGludCkobnJnR2Fpbl9lW2JhbmRdIC0gZmlsdEJ1ZmZlcl9lW2JhbmRdKTsKKyAgICBpZiAoZGlmZiA+IDApIHsKKyAgICAgIGZpbHRCdWZmZXJbYmFuZF0gPj49CisgICAgICAgICAgZGlmZjsgLyogQ29tcGVuc2F0ZSBmb3IgdGhlIHNjYWxlIGNoYW5nZSBieSBzaGlmdGluZyB0aGUgbWFudGlzc2EuICovCisgICAgICBmaWx0QnVmZmVyX2VbYmFuZF0gKz0gZGlmZjsgLyogTmV3IGdhaW4gaXMgYmlnZ2VyLCB1c2UgaXRzIGV4cG9uZW50ICovCisgICAgfSBlbHNlIGlmIChkaWZmIDwgMCkgewogICAgICAgLyogVGhlIGJ1ZmZlcmVkIGdhaW5zIHNlZW0gdG8gYmUgbGFyZ2VyLCBidXQgbWF5YmUgdGhlcmUKICAgICAgICAgIGFyZSBzb21lIHVudXNlZCBiaXRzIGxlZnQgaW4gdGhlIG1hbnRpc3NhICovCiAKLSAgICAgIGludCByZXNlcnZlID0gQ250TGVhZGluZ1plcm9zKGZpeHBfYWJzKGZpbHRCdWZmZXJbYmFuZF0pKS0xOworICAgICAgaW50IHJlc2VydmUgPSBDbnRMZWFkaW5nWmVyb3MoZml4cF9hYnMoZmlsdEJ1ZmZlcltiYW5kXSkpIC0gMTsKIAogICAgICAgaWYgKCgtZGlmZikgPD0gcmVzZXJ2ZSkgewogICAgICAgICAvKiBUaGVyZSBpcyBlbm91Z2ggc3BhY2UgaW4gdGhlIGJ1ZmZlcmVkIG1hbnRpc3NhIHNvCiAgICAgICAgICAgIHRoYXQgd2UgY2FuIHRha2UgdGhlIG5ldyBleHBvbmVudCBhcyBjb21tb24uCiAgICAgICAgICovCiAgICAgICAgIGZpbHRCdWZmZXJbYmFuZF0gPDw9ICgtZGlmZik7Ci0gICAgICAgIGZpbHRCdWZmZXJfZVtiYW5kXSArPSBkaWZmOyAgLyogYmVjb21lcyBlcXVhbCB0byAqcHRyTmV3RXhwICovCi0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgZmlsdEJ1ZmZlcltiYW5kXSA8PD0gcmVzZXJ2ZTsgICAvKiBTaGlmdCB0aGUgbWFudGlzc2EgYXMgZmFyIGFzIHBvc3NpYmxlOiAqLwotICAgICAgICBmaWx0QnVmZmVyX2VbYmFuZF0gLT0gcmVzZXJ2ZTsgIC8qIENvbXBlbnNhdGUgaW4gdGhlIGV4cG9uZW50OiAqLworICAgICAgICBmaWx0QnVmZmVyX2VbYmFuZF0gKz0gZGlmZjsgLyogYmVjb21lcyBlcXVhbCB0byAqcHRyTmV3RXhwICovCisgICAgICB9IGVsc2UgeworICAgICAgICBmaWx0QnVmZmVyW2JhbmRdIDw8PQorICAgICAgICAgICAgcmVzZXJ2ZTsgLyogU2hpZnQgdGhlIG1hbnRpc3NhIGFzIGZhciBhcyBwb3NzaWJsZTogKi8KKyAgICAgICAgZmlsdEJ1ZmZlcl9lW2JhbmRdIC09IHJlc2VydmU7IC8qIENvbXBlbnNhdGUgaW4gdGhlIGV4cG9uZW50OiAqLwogCiAgICAgICAgIC8qIEZvciB0aGUgcmVtYWluaW5nIGRpZmZlcmVuY2UsIGNoYW5nZSB0aGUgbmV3IGdhaW4gdmFsdWUgKi8KLSAgICAgICAgZGlmZiA9IGZpeE1pbigtKHJlc2VydmUgKyBkaWZmKSxERlJBQ1RfQklUUy0xKTsKKyAgICAgICAgZGlmZiA9IGZpeE1pbigtKHJlc2VydmUgKyBkaWZmKSwgREZSQUNUX0JJVFMgLSAxKTsKICAgICAgICAgbnJnR2FpbltiYW5kXSA+Pj0gZGlmZjsKICAgICAgICAgbnJnR2Fpbl9lW2JhbmRdICs9IGRpZmY7CiAgICAgICB9CkBAIC0xMjQ0LDMxICsxODYxLDQxIEBACiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXNjYWxlIHRoZSBhdWRpbyBkYXRhIGluIHRoZSBvdmVybGFwIGJ1ZmZlcgogICB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGVudmVsb3BlIGFkanVzdGVkIHdpdGggdGhlIGxhc3QgZnJhbWUuCiAqLwotdm9pZCByZXNjYWxlU3ViYmFuZFNhbXBsZXMoRklYUF9EQkwgKiogcmUsICAgLyohPCBSZWFsIHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIGltLCAgIC8qITwgSW1hZ2luYXJ5IHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dTdWJiYW5kLCAgIC8qITwgQmVnaW4gb2YgZnJlcXVlbmN5IHJhbmdlIHRvIHByb2Nlc3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaWdoU3ViYmFuZCwgIC8qITwgRW5kIG9mIGZyZXF1ZW5jeSByYW5nZSB0byBwcm9jZXNzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfcG9zLCAgICAvKiE8IEJlZ2luIG9mIHRpbWUgcmFnZSAoUU1GLXRpbWVzbG90KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5leHRfcG9zLCAgICAgLyohPCBFbmQgb2YgdGltZSByYWdlIChRTUYtdGltZXNsb3QpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQpICAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0ICovCit2b2lkIHJlc2NhbGVTdWJiYW5kU2FtcGxlcygKKyAgICBGSVhQX0RCTCAqKnJlLCAgIC8qITwgUmVhbCBwYXJ0IG9mIGlucHV0IGFuZCBvdXRwdXQgc3ViYmFuZCBzYW1wbGVzICovCisgICAgRklYUF9EQkwgKippbSwgICAvKiE8IEltYWdpbmFyeSBwYXJ0IG9mIGlucHV0IGFuZCBvdXRwdXQgc3ViYmFuZCBzYW1wbGVzICovCisgICAgaW50IGxvd1N1YmJhbmQsICAvKiE8IEJlZ2luIG9mIGZyZXF1ZW5jeSByYW5nZSB0byBwcm9jZXNzICovCisgICAgaW50IGhpZ2hTdWJiYW5kLCAvKiE8IEVuZCBvZiBmcmVxdWVuY3kgcmFuZ2UgdG8gcHJvY2VzcyAqLworICAgIGludCBzdGFydF9wb3MsICAgLyohPCBCZWdpbiBvZiB0aW1lIHJhZ2UgKFFNRi10aW1lc2xvdCkgKi8KKyAgICBpbnQgbmV4dF9wb3MsICAgIC8qITwgRW5kIG9mIHRpbWUgcmFnZSAoUU1GLXRpbWVzbG90KSAqLworICAgIGludCBzaGlmdCkgICAgICAgLyohPCBudW1iZXIgb2YgYml0cyB0byBzaGlmdCAqLwogewotICBpbnQgd2lkdGggPSBoaWdoU3ViYmFuZC1sb3dTdWJiYW5kOworICBpbnQgd2lkdGggPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CiAKLSAgaWYgKCAod2lkdGggPiAwKSAmJiAoc2hpZnQhPTApICkgewotICAgIGlmIChpbSE9TlVMTCkgewotICAgICAgZm9yIChpbnQgbD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewotICAgICAgICAgIHNjYWxlVmFsdWVzKCZyZVtsXVtsb3dTdWJiYW5kXSwgd2lkdGgsIHNoaWZ0KTsKLSAgICAgICAgICBzY2FsZVZhbHVlcygmaW1bbF1bbG93U3ViYmFuZF0sIHdpZHRoLCBzaGlmdCk7CisgIGlmICgod2lkdGggPiAwKSAmJiAoc2hpZnQgIT0gMCkpIHsKKyAgICBpZiAoaW0gIT0gTlVMTCkgeworICAgICAgZm9yIChpbnQgbCA9IHN0YXJ0X3BvczsgbCA8IG5leHRfcG9zOyBsKyspIHsKKyAgICAgICAgc2NhbGVWYWx1ZXMoJnJlW2xdW2xvd1N1YmJhbmRdLCB3aWR0aCwgc2hpZnQpOworICAgICAgICBzY2FsZVZhbHVlcygmaW1bbF1bbG93U3ViYmFuZF0sIHdpZHRoLCBzaGlmdCk7CiAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgZm9yIChpbnQgbD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewotICAgICAgICAgIHNjYWxlVmFsdWVzKCZyZVtsXVtsb3dTdWJiYW5kXSwgd2lkdGgsIHNoaWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgbCA9IHN0YXJ0X3BvczsgbCA8IG5leHRfcG9zOyBsKyspIHsKKyAgICAgICAgc2NhbGVWYWx1ZXMoJnJlW2xdW2xvd1N1YmJhbmRdLCB3aWR0aCwgc2hpZnQpOwogICAgICAgfQogICAgIH0KICAgfQogfQogCitzdGF0aWMgaW5saW5lIEZJWFBfREJMIEZES19nZXRfbWF4dmFsX3JlYWwoRklYUF9EQkwgbWF4VmFsLCBGSVhQX0RCTCAqcmVUbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHdpZHRoKSB7CisgIG1heFZhbCA9IChGSVhQX0RCTCkwOworICB3aGlsZSAod2lkdGgtLSAhPSAwKSB7CisgICAgRklYUF9EQkwgdG1wID0gKihyZVRtcCsrKTsKKyAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykodG1wKSBeICgoTE9ORyl0bXAgPj4gKERGUkFDVF9CSVRTIC0gMSkpKTsKKyAgfQorCisgIHJldHVybiBtYXhWYWw7Cit9CiAKIC8qIQogICBcYnJpZWYgICBEZXRlcm1pbmUgaGVhZHJvb20gZm9yIHNoaWZ0aW5nCkBAIC0xMjc5LDU1ICsxOTA2LDU4IEBACiAgIFxyZXR1cm4gIE51bWJlciBvZiBmcmVlIGJpdHMgaW4gdGhlIGJpZ2dlc3Qgc3BlY3RyYWwgdmFsdWUKICovCiAKLUZJWFBfREJMIG1heFN1YmJhbmRTYW1wbGUoIEZJWFBfREJMICoqIHJlLCAgIC8qITwgUmVhbCBwYXJ0IG9mIGlucHV0IGFuZCBvdXRwdXQgc3ViYmFuZCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKiBpbSwgICAvKiE8IFJlYWwgcGFydCBvZiBpbnB1dCBhbmQgb3V0cHV0IHN1YmJhbmQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd1N1YmJhbmQsICAgLyohPCBCZWdpbiBvZiBmcmVxdWVuY3kgcmFuZ2UgdG8gcHJvY2VzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2hTdWJiYW5kLCAgLyohPCBOdW1iZXIgb2YgUU1GIGJhbmRzIHRvIHByb2Nlc3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9wb3MsICAgIC8qITwgQmVnaW4gb2YgdGltZSByYWdlIChRTUYtdGltZXNsb3QpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dF9wb3MgICAgICAvKiE8IEVuZCBvZiB0aW1lIHJhZ2UgKFFNRi10aW1lc2xvdCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworRklYUF9EQkwgbWF4U3ViYmFuZFNhbXBsZSgKKyAgICBGSVhQX0RCTCAqKnJlLCAgIC8qITwgUmVhbCBwYXJ0IG9mIGlucHV0IGFuZCBvdXRwdXQgc3ViYmFuZCBzYW1wbGVzICovCisgICAgRklYUF9EQkwgKippbSwgICAvKiE8IFJlYWwgcGFydCBvZiBpbnB1dCBhbmQgb3V0cHV0IHN1YmJhbmQgc2FtcGxlcyAqLworICAgIGludCBsb3dTdWJiYW5kLCAgLyohPCBCZWdpbiBvZiBmcmVxdWVuY3kgcmFuZ2UgdG8gcHJvY2VzcyAqLworICAgIGludCBoaWdoU3ViYmFuZCwgLyohPCBOdW1iZXIgb2YgUU1GIGJhbmRzIHRvIHByb2Nlc3MgKi8KKyAgICBpbnQgc3RhcnRfcG9zLCAgIC8qITwgQmVnaW4gb2YgdGltZSByYWdlIChRTUYtdGltZXNsb3QpICovCisgICAgaW50IG5leHRfcG9zICAgICAvKiE8IEVuZCBvZiB0aW1lIHJhZ2UgKFFNRi10aW1lc2xvdCkgKi8KKykgewogICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWF9EQkwoMC4wZik7CiAgIHVuc2lnbmVkIGludCB3aWR0aCA9IGhpZ2hTdWJiYW5kIC0gbG93U3ViYmFuZDsKIAogICBGREtfQVNTRVJUKHdpZHRoIDw9ICg2NCkpOwogCi0gIGlmICggd2lkdGggPiAwICkgewotICAgIGlmIChpbSE9TlVMTCkgCi0gICAgewotICAgICAgZm9yIChpbnQgbD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgCi0gICAgICB7Ci0jaWZkZWYgRlVOQ1RJT05fRkRLX2dldF9tYXh2YWwKLSAgICAgICAgbWF4VmFsID0gRkRLX2dldF9tYXh2YWwobWF4VmFsLCAmcmVbbF1bbG93U3ViYmFuZF0sICZpbVtsXVtsb3dTdWJiYW5kXSwgd2lkdGgpOwotI2Vsc2UKLSAgICAgICAgaW50IGs9d2lkdGg7CisgIGlmICh3aWR0aCA+IDApIHsKKyAgICBpZiAoaW0gIT0gTlVMTCkgeworICAgICAgZm9yIChpbnQgbCA9IHN0YXJ0X3BvczsgbCA8IG5leHRfcG9zOyBsKyspIHsKKyAgICAgICAgaW50IGsgPSB3aWR0aDsKICAgICAgICAgRklYUF9EQkwgKnJlVG1wID0gJnJlW2xdW2xvd1N1YmJhbmRdOwogICAgICAgICBGSVhQX0RCTCAqaW1UbXAgPSAmaW1bbF1bbG93U3ViYmFuZF07Ci0gICAgICAgIGRveworICAgICAgICBkbyB7CiAgICAgICAgICAgRklYUF9EQkwgdG1wMSA9ICoocmVUbXArKyk7CiAgICAgICAgICAgRklYUF9EQkwgdG1wMiA9ICooaW1UbXArKyk7Ci0gICAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKHRtcDEpXigoTE9ORyl0bXAxPj4oREZSQUNUX0JJVFMtMSkpKTsKLSAgICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykodG1wMileKChMT05HKXRtcDI+PihERlJBQ1RfQklUUy0xKSkpOwotICAgICAgICB9IHdoaWxlKC0tayE9MCk7Ci0jZW5kaWYKKyAgICAgICAgICBtYXhWYWwgfD0KKyAgICAgICAgICAgICAgKEZJWFBfREJMKSgoTE9ORykodG1wMSkgXiAoKExPTkcpdG1wMSA+PiAoREZSQUNUX0JJVFMgLSAxKSkpOworICAgICAgICAgIG1heFZhbCB8PQorICAgICAgICAgICAgICAoRklYUF9EQkwpKChMT05HKSh0bXAyKSBeICgoTE9ORyl0bXAyID4+IChERlJBQ1RfQklUUyAtIDEpKSk7CisgICAgICAgIH0gd2hpbGUgKC0tayAhPSAwKTsKICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGludCBsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7Ci0gICAgICAgIGludCBrPXdpZHRoOwotICAgICAgICBGSVhQX0RCTCAqcmVUbXAgPSAmcmVbbF1bbG93U3ViYmFuZF07Ci0gICAgICAgIGRvewotICAgICAgICAgIEZJWFBfREJMIHRtcCA9ICoocmVUbXArKyk7Ci0gICAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKHRtcCleKChMT05HKXRtcD4+KERGUkFDVF9CSVRTLTEpKSk7Ci0gICAgICAgIH13aGlsZSgtLWshPTApOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBsID0gc3RhcnRfcG9zOyBsIDwgbmV4dF9wb3M7IGwrKykgeworICAgICAgICBtYXhWYWwgfD0gRkRLX2dldF9tYXh2YWxfcmVhbChtYXhWYWwsICZyZVtsXVtsb3dTdWJiYW5kXSwgd2lkdGgpOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIHJldHVybihtYXhWYWwpOworICBpZiAobWF4VmFsID4gKEZJWFBfREJMKTApIHsKKyAgICAvKiBGb3IgbmVnYXRpdmUgaW5wdXQgdmFsdWVzLCBtYXhWYWwgaXMgdG9vIHNtYWxsIGJ5IDEuIEFkZCAxIG9ubHkgd2hlbgorICAgICAqIG5lY2Vzc2FyeTogaWYgbWF4VmFsIGlzIGEgcG93ZXIgb2YgMiAqLworICAgIEZJWFBfREJMIGxvd2VyUG93MiA9CisgICAgICAgIChGSVhQX0RCTCkoMSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gQ250TGVhZGluZ1plcm9zKG1heFZhbCkpKTsKKyAgICBpZiAobWF4VmFsID09IGxvd2VyUG93MikgbWF4VmFsICs9IChGSVhQX0RCTCkxOworICB9CisKKyAgcmV0dXJuIChtYXhWYWwpOwogfQogCi0jZGVmaW5lIFNISUZUX0JFRk9SRV9TUVVBUkUgKDMpIC8qICg3LzIpICovCisvKiAjZGVmaW5lIFNISUZUX0JFRk9SRV9TUVVBUkUgKDMpICovIC8qICg3LzIpICovCisvKiBBdm9pZCBhc3NlcnRpb24gZmFpbHVyZXMgdHJpZ2dlcmQgYnkgb3ZlcmZsb3dzIHdoaWNoIG9jY3VyZWQgaW4gcm9idXN0bmVzcworICAgdGVzdHMuIFNldHRpbmcgdGhlIFNISUZUX0JFRk9SRV9TUVVBUkUgdG8gNCBoYXMgbmVnbGlnaWJsZSBlZmZlY3Qgb24gKFVTQUMpCisgICBjb25mb3JtYW5jZSByZXN1bHRzLiAqLworI2RlZmluZSBTSElGVF9CRUZPUkVfU1FVQVJFICg0KSAvKiAoKDggLSAwKSAvIDIpICovCisKIC8qITwKICAgSWYgdGhlIGFjY3VtdWxhdG9yIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIG92ZXJmbG93IGJpdHMgb3IKICAgZG9lcyBub3QgcHJvdmlkZSBhIGhpZ2ggZHluYW1pYyByYW5nZSwgdGhlIGJlbG93IGVuZXJneSBjYWxjdWxhdGlvbgpAQCAtMTM1MSw5MiArMTk4MSwxMDAgQEAKIAogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbnRlcnBvbEZyZXEgaXMgdHJ1ZS4KICovCi1zdGF0aWMgdm9pZCBjYWxjTnJnUGVyU3ViYmFuZChGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJSZWFsLCAvKiE8IFJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlckltYWcsIC8qITwgSW1hZ2luYXJ5IHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgICAgICAgIC8qITwgQmVnaW4gb2YgdGhlIFNCUiBmcmVxdWVuY3kgcmFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBoaWdoU3ViYmFuZCwgICAgICAgICAgLyohPCBIaWdoIGVuZCBvZiB0aGUgU0JSIGZyZXF1ZW5jeSByYW5nZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHN0YXJ0X3BvcywgICAgICAgICAgICAvKiE8IEZpcnN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuZXh0X3BvcywgICAgICAgICAgICAgLyohPCBMYXN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKyAxICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgZnJhbWVFeHAsICAgICAgICAgICAgIC8qITwgQ29tbW9uIGV4cG9uZW50IGZvciBhbGwgaW5wdXQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ0VzdCwgICAgICAgICAgICAgICAvKiE8IHJlc3VsdGluZyBFbmVyZ3kgKDAuLjEpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqbnJnRXN0X2UgKSAgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgcmVzdWx0aW5nIEVuZXJneSAqLworc3RhdGljIHZvaWQgY2FsY05yZ1BlclN1YmJhbmQoCisgICAgRklYUF9EQkwgKiphbmFseXNCdWZmZXJSZWFsLCAvKiE8IFJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KKyAgICBGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlckltYWcsIC8qITwgSW1hZ2luYXJ5IHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCisgICAgaW50IGxvd1N1YmJhbmQsICAgICAgICAgICAgICAvKiE8IEJlZ2luIG9mIHRoZSBTQlIgZnJlcXVlbmN5IHJhbmdlICovCisgICAgaW50IGhpZ2hTdWJiYW5kLCAgICAgICAgICAgICAvKiE8IEhpZ2ggZW5kIG9mIHRoZSBTQlIgZnJlcXVlbmN5IHJhbmdlICovCisgICAgaW50IHN0YXJ0X3BvcywgICAgICAgICAgICAgICAvKiE8IEZpcnN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KKyAgICBpbnQgbmV4dF9wb3MsICAgICAgICAgICAgICAgIC8qITwgTGFzdCBRTUYtc2xvdCBvZiBjdXJyZW50IGVudmVsb3BlICsgMSAqLworICAgIFNDSEFSIGZyYW1lRXhwLCAgICAgICAgICAgICAgLyohPCBDb21tb24gZXhwb25lbnQgZm9yIGFsbCBpbnB1dCBzYW1wbGVzICovCisgICAgRklYUF9EQkwgKm5yZ0VzdCwgICAgICAgICAgICAvKiE8IHJlc3VsdGluZyBFbmVyZ3kgKDAuLjEpICovCisgICAgU0NIQVIgKm5yZ0VzdF9lKSAgICAgICAgICAgICAvKiE8IEV4cG9uZW50IG9mIHJlc3VsdGluZyBFbmVyZ3kgKi8KIHsKICAgRklYUF9TR0wgaW52V2lkdGg7Ci0gIFNDSEFSICBwcmVTaGlmdDsKLSAgU0NIQVIgIHNoaWZ0OworICBTQ0hBUiBwcmVTaGlmdDsKKyAgU0NIQVIgc2hpZnQ7CiAgIEZJWFBfREJMIHN1bTsKLSAgaW50IGssbDsKKyAgaW50IGs7CiAKICAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIGVudmVsb3BlIGxhdGVyOiAqLwogICBpbnZXaWR0aCA9IEZYX0RCTDJGWF9TR0woR2V0SW52SW50KG5leHRfcG9zIC0gc3RhcnRfcG9zKSk7Ci0gIC8qIFRoZSBjb21tb24gZXhwb25lbnQgbmVlZHMgdG8gYmUgZG91YmxlZCBiZWNhdXNlIGFsbCBtYW50aXNzYXMgYXJlIHNxdWFyZWQ6ICovCisgIC8qIFRoZSBjb21tb24gZXhwb25lbnQgbmVlZHMgdG8gYmUgZG91YmxlZCBiZWNhdXNlIGFsbCBtYW50aXNzYXMgYXJlIHNxdWFyZWQ6CisgICAqLwogICBmcmFtZUV4cCA9IGZyYW1lRXhwIDw8IDE7CiAKLSAgZm9yIChrPWxvd1N1YmJhbmQ7IGs8aGlnaFN1YmJhbmQ7IGsrKykgewotICAgIEZJWFBfREJMICBidWZmZXJSZWFsWygoKDEwMjQpLygzMikpKyg2KSldOwotICAgIEZJWFBfREJMICBidWZmZXJJbWFnWygoKDEwMjQpLygzMikpKyg2KSldOwotICAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYX0RCTCgwLjBmKTsKKyAgZm9yIChrID0gbG93U3ViYmFuZDsgayA8IGhpZ2hTdWJiYW5kOyBrKyspIHsKKyAgICBGSVhQX0RCTCBidWZmZXJSZWFsWygoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpICsgKDMgKiAoNCkpKV07CisgICAgRklYUF9EQkwgYnVmZmVySW1hZ1soKCgxMDI0KSAvICgzMikgKiAoNCkgLyAyKSArICgzICogKDQpKSldOworICAgIEZJWFBfREJMIG1heFZhbDsKIAotICAgIGlmIChhbmFseXNCdWZmZXJJbWFnIT1OVUxMKQotICAgIHsKLSAgICAgIGZvciAobD1zdGFydF9wb3M7bDxuZXh0X3BvcztsKyspIAotICAgICAgeworICAgIGlmIChhbmFseXNCdWZmZXJJbWFnICE9IE5VTEwpIHsKKyAgICAgIGludCBsOworICAgICAgbWF4VmFsID0gRkwyRlhfREJMKDAuMGYpOworICAgICAgZm9yIChsID0gc3RhcnRfcG9zOyBsIDwgbmV4dF9wb3M7IGwrKykgewogICAgICAgICBidWZmZXJJbWFnW2xdID0gYW5hbHlzQnVmZmVySW1hZ1tsXVtrXTsKLSAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKGJ1ZmZlckltYWdbbF0pXigoTE9ORylidWZmZXJJbWFnW2xdPj4oREZSQUNUX0JJVFMtMSkpKTsKKyAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKGJ1ZmZlckltYWdbbF0pIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMT05HKWJ1ZmZlckltYWdbbF0gPj4gKERGUkFDVF9CSVRTIC0gMSkpKTsKICAgICAgICAgYnVmZmVyUmVhbFtsXSA9IGFuYWx5c0J1ZmZlclJlYWxbbF1ba107Ci0gICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJSZWFsW2xdKV4oKExPTkcpYnVmZmVyUmVhbFtsXT4+KERGUkFDVF9CSVRTLTEpKSk7CisgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJSZWFsW2xdKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTE9ORylidWZmZXJSZWFsW2xdID4+IChERlJBQ1RfQklUUyAtIDEpKSk7CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGw9c3RhcnRfcG9zO2w8bmV4dF9wb3M7bCsrKQotICAgICAgeworICAgIH0gZWxzZSB7CisgICAgICBpbnQgbDsKKyAgICAgIG1heFZhbCA9IEZMMkZYX0RCTCgwLjBmKTsKKyAgICAgIGZvciAobCA9IHN0YXJ0X3BvczsgbCA8IG5leHRfcG9zOyBsKyspIHsKICAgICAgICAgYnVmZmVyUmVhbFtsXSA9IGFuYWx5c0J1ZmZlclJlYWxbbF1ba107Ci0gICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJSZWFsW2xdKV4oKExPTkcpYnVmZmVyUmVhbFtsXT4+KERGUkFDVF9CSVRTLTEpKSk7CisgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJSZWFsW2xdKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTE9ORylidWZmZXJSZWFsW2xdID4+IChERlJBQ1RfQklUUyAtIDEpKSk7CiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1heFZhbCE9RkwyRlhDT05TVF9EQkwoMC5mKSkgewotCi0KKyAgICBpZiAobWF4VmFsICE9IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKICAgICAgIC8qIElmIHRoZSBhY2N1IGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIG92ZXJmbG93IGJpdHMsIHdlIGNhbm5vdAogICAgICAgICAgc2hpZnQgdGhlIHNhbXBsZXMgdXAgdG8gdGhlIGxpbWl0LgogICAgICAgICAgSW5zdGVhZCwga2VlcCB1cCB0byAzIGZyZWUgYml0cyBpbiBlYWNoIHNhbXBsZSwgaS5lLiB1cCB0bwogICAgICAgICAgNiBiaXRzIGFmdGVyIGNhbGN1bGF0aW9uIG9mIHNxdWFyZS4KICAgICAgICAgIFBsZWFzZSBub3RlIHRoZSBjb21tZW50IG9uIHNhdHVyYXRlZCBhcml0aG1ldGljIGFib3ZlIQogICAgICAgKi8KLSAgICAgIEZJWFBfREJMIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgIHByZVNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKG1heFZhbCktMTsKKyAgICAgIEZJWFBfREJMIGFjY3U7CisgICAgICBwcmVTaGlmdCA9IENudExlYWRpbmdaZXJvcyhtYXhWYWwpIC0gMTsKICAgICAgIHByZVNoaWZ0IC09IFNISUZUX0JFRk9SRV9TUVVBUkU7CiAKLSAgICAgIGlmIChwcmVTaGlmdD49MCkgewotICAgICAgICBpZiAoYW5hbHlzQnVmZmVySW1hZyE9TlVMTCkgewotICAgICAgICAgIGZvciAobD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgeworICAgICAgLyogTGltaXQgcHJlU2hpZnQgdG8gYSBtYXhpbXVtIHZhbHVlIHRvIHByZXZlbnQgYWNjdW11bGF0b3Igb3ZlcmZsb3cgaW4KKyAgICAgICAgIGV4Y2VwdGlvbmFsIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHNpZ25hbCBpbiB0aGUgYW5hbHlzaXMtYnVmZmVyIGlzIHZlcnkKKyAgICAgICAgIHNtYWxsIChzbWFsbCBtYXhWYWwpLgorICAgICAgKi8KKyAgICAgIHByZVNoaWZ0ID0gZk1pbihwcmVTaGlmdCwgKFNDSEFSKTI1KTsKKworICAgICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgaWYgKHByZVNoaWZ0ID49IDApIHsKKyAgICAgICAgaW50IGw7CisgICAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnICE9IE5VTEwpIHsKKyAgICAgICAgICBmb3IgKGwgPSBzdGFydF9wb3M7IGwgPCBuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgICAgICBGSVhQX0RCTCB0ZW1wMSA9IGJ1ZmZlclJlYWxbbF0gPDwgKGludClwcmVTaGlmdDsKICAgICAgICAgICAgIEZJWFBfREJMIHRlbXAyID0gYnVmZmVySW1hZ1tsXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wMSk7CiAgICAgICAgICAgICBhY2N1ID0gZlBvdzJBZGREaXYyKGFjY3UsIHRlbXAyKTsKICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChsID0gc3RhcnRfcG9zOyBsIDwgbmV4dF9wb3M7IGwrKykgewogICAgICAgICAgICAgRklYUF9EQkwgdGVtcCA9IGJ1ZmZlclJlYWxbbF0gPDwgKGludClwcmVTaGlmdDsKICAgICAgICAgICAgIGFjY3UgPSBmUG93MkFkZERpdjIoYWNjdSwgdGVtcCk7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsgICAgLyogaWYgbmVnYXRpdmUgc2hpZnQgdmFsdWUgKi8KKyAgICAgIH0gZWxzZSB7IC8qIGlmIG5lZ2F0aXZlIHNoaWZ0IHZhbHVlICovCisgICAgICAgIGludCBsOwogICAgICAgICBpbnQgbmVncHJlU2hpZnQgPSAtcHJlU2hpZnQ7Ci0gICAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnIT1OVUxMKSB7Ci0gICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CisgICAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnICE9IE5VTEwpIHsKKyAgICAgICAgICBmb3IgKGwgPSBzdGFydF9wb3M7IGwgPCBuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgICAgICBGSVhQX0RCTCB0ZW1wMSA9IGJ1ZmZlclJlYWxbbF0gPj4gKGludCluZWdwcmVTaGlmdDsKICAgICAgICAgICAgIEZJWFBfREJMIHRlbXAyID0gYnVmZmVySW1hZ1tsXSA+PiAoaW50KW5lZ3ByZVNoaWZ0OwogICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wMSk7CiAgICAgICAgICAgICBhY2N1ID0gZlBvdzJBZGREaXYyKGFjY3UsIHRlbXAyKTsKICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChsID0gc3RhcnRfcG9zOyBsIDwgbmV4dF9wb3M7IGwrKykgewogICAgICAgICAgICAgRklYUF9EQkwgdGVtcCA9IGJ1ZmZlclJlYWxbbF0gPj4gKGludCluZWdwcmVTaGlmdDsKICAgICAgICAgICAgIGFjY3UgPSBmUG93MkFkZERpdjIoYWNjdSwgdGVtcCk7CiAgICAgICAgICAgfQpAQCAtMTQ1MSwxMyArMjA4OSwxMiBAQAogICAgICAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIGVudmVsb3BlIGFuZCBhcHBseSBmcmFtZSBzY2FsZTogKi8KICAgICAgICpucmdFc3QrKyA9IGZNdWx0KHN1bSwgaW52V2lkdGgpOwogICAgICAgc2hpZnQgKz0gMiAqIHByZVNoaWZ0OwotICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWchPU5VTEwpCisgICAgICBpZiAoYW5hbHlzQnVmZmVySW1hZyAhPSBOVUxMKQogICAgICAgICAqbnJnRXN0X2UrKyA9IGZyYW1lRXhwIC0gc2hpZnQ7CiAgICAgICBlbHNlCi0gICAgICAgICpucmdFc3RfZSsrID0gZnJhbWVFeHAgLSBzaGlmdCArIDE7ICAvKiArMSBkdWUgdG8gbWlzc2luZyBpbWFnLiBwYXJ0ICovCi0gICAgfSAvKiBtYXhWYWwhPTAgKi8KKyAgICAgICAgKm5yZ0VzdF9lKysgPSBmcmFtZUV4cCAtIHNoaWZ0ICsgMTsgLyogKzEgZHVlIHRvIG1pc3NpbmcgaW1hZy4gcGFydCAqLworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhWYWwhPTAgKi8KICAgICBlbHNlIHsKLQogICAgICAgLyogUHJldmVudCBhIHplcm8tbWFudGlzc2EtbnVtYmVyIGZyb20gYmVpbmcgbWlzaW50ZXJwcmV0ZWQKICAgICAgICAgIGR1ZSB0byBpdHMgZXhwb25lbnQuICovCiAgICAgICAqbnJnRXN0KysgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKQEAgLTE0NzIsNDUgKzIxMDksNDIgQEAKIAogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbnRlcnBvbEZyZXEgaXMgZmFsc2UuCiAqLwotc3RhdGljIHZvaWQgY2FsY05yZ1BlclNmYihGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJSZWFsLCAgLyohPCBSZWFsIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlckltYWcsICAvKiE8IEltYWdpbmFyeSBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgblNmYiwgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpmcmVxQmFuZFRhYmxlLCAgICAgICAvKiE8IEZpcnN0IFN1YmJhbmQgZm9yIGVhY2ggU2ZiICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICAgICAgICAgICAvKiE8IEZpcnN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5leHRfcG9zLCAgICAgICAgICAgIC8qITwgTGFzdCBRTUYtc2xvdCBvZiBjdXJyZW50IGVudmVsb3BlICsgMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgaW5wdXRfZSwgICAgICAgICAgICAgLyohPCBDb21tb24gZXhwb25lbnQgZm9yIGFsbCBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdFc3QsICAgICAgICAgICAgICAvKiE8IHJlc3VsdGluZyBFbmVyZ3kgKDAuLjEpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpucmdFc3RfZSApICAgICAgICAgICAvKiE8IEV4cG9uZW50IG9mIHJlc3VsdGluZyBFbmVyZ3kgKi8KK3N0YXRpYyB2b2lkIGNhbGNOcmdQZXJTZmIoCisgICAgRklYUF9EQkwgKiphbmFseXNCdWZmZXJSZWFsLCAvKiE8IFJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KKyAgICBGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlckltYWcsIC8qITwgSW1hZ2luYXJ5IHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCisgICAgaW50IG5TZmIsICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBzY2FsZSBmYWN0b3IgYmFuZHMgKi8KKyAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAgIC8qITwgRmlyc3QgU3ViYmFuZCBmb3IgZWFjaCBTZmIgKi8KKyAgICBpbnQgc3RhcnRfcG9zLCAgICAgICAgICAgICAgIC8qITwgRmlyc3QgUU1GLXNsb3Qgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICAgIGludCBuZXh0X3BvcywgICAgICAgICAgICAgICAgLyohPCBMYXN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKyAxICovCisgICAgU0NIQVIgaW5wdXRfZSwgICAgICAgICAgICAgICAvKiE8IENvbW1vbiBleHBvbmVudCBmb3IgYWxsIGlucHV0IHNhbXBsZXMgKi8KKyAgICBGSVhQX0RCTCAqbnJnRXN0LCAgICAgICAgICAgIC8qITwgcmVzdWx0aW5nIEVuZXJneSAoMC4uMSkgKi8KKyAgICBTQ0hBUiAqbnJnRXN0X2UpICAgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgcmVzdWx0aW5nIEVuZXJneSAqLwogewotICBGSVhQX1NHTCAgaW52V2lkdGg7Ci0gIEZJWFBfREJMICB0ZW1wOwotICBTQ0hBUiAgcHJlU2hpZnQ7Ci0gIFNDSEFSICAgc2hpZnQsIHN1bV9lOwotICBGSVhQX0RCTCAgc3VtOworICBGSVhQX1NHTCBpbnZXaWR0aDsKKyAgRklYUF9EQkwgdGVtcDsKKyAgU0NIQVIgcHJlU2hpZnQ7CisgIFNDSEFSIHNoaWZ0LCBzdW1fZTsKKyAgRklYUF9EQkwgc3VtOwogCi0gIGludCBqLGssbCxsaSx1aTsKKyAgaW50IGosIGssIGwsIGxpLCB1aTsKICAgRklYUF9EQkwgc3VtQWxsLCBzdW1MaW5lOyAvKiBTaW5nbGUgcHJlY2lzaW9uIHdvdWxkIGJlIHN1ZmZpY2llbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBvdmVyZmxvdyBiaXRzIGFyZSByZXF1aXJlZCBmb3IgYWNjdW11bGF0aW9uICovCiAKICAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIGVudmVsb3BlIGxhdGVyOiAqLwogICBpbnZXaWR0aCA9IEZYX0RCTDJGWF9TR0woR2V0SW52SW50KG5leHRfcG9zIC0gc3RhcnRfcG9zKSk7Ci0gIC8qIFRoZSBjb21tb24gZXhwb25lbnQgbmVlZHMgdG8gYmUgZG91YmxlZCBiZWNhdXNlIGFsbCBtYW50aXNzYXMgYXJlIHNxdWFyZWQ6ICovCisgIC8qIFRoZSBjb21tb24gZXhwb25lbnQgbmVlZHMgdG8gYmUgZG91YmxlZCBiZWNhdXNlIGFsbCBtYW50aXNzYXMgYXJlIHNxdWFyZWQ6CisgICAqLwogICBpbnB1dF9lID0gaW5wdXRfZSA8PCAxOwogCi0gIGZvcihqPTA7IGo8blNmYjsgaisrKSB7CisgIGZvciAoaiA9IDA7IGogPCBuU2ZiOyBqKyspIHsKICAgICBsaSA9IGZyZXFCYW5kVGFibGVbal07Ci0gICAgdWkgPSBmcmVxQmFuZFRhYmxlW2orMV07CisgICAgdWkgPSBmcmVxQmFuZFRhYmxlW2ogKyAxXTsKIAotICAgIEZJWFBfREJMIG1heFZhbCA9IG1heFN1YmJhbmRTYW1wbGUoIGFuYWx5c0J1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHlzQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9wb3MgKTsKKyAgICBGSVhQX0RCTCBtYXhWYWwgPSBtYXhTdWJiYW5kU2FtcGxlKGFuYWx5c0J1ZmZlclJlYWwsIGFuYWx5c0J1ZmZlckltYWcsIGxpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWksIHN0YXJ0X3BvcywgbmV4dF9wb3MpOwogCi0gICAgaWYgKG1heFZhbCE9RkwyRlhDT05TVF9EQkwoMC5mKSkgewotCi0gICAgICBwcmVTaGlmdCA9IENudExlYWRpbmdaZXJvcyhtYXhWYWwpLTE7CisgICAgaWYgKG1heFZhbCAhPSBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgICBwcmVTaGlmdCA9IENudExlYWRpbmdaZXJvcyhtYXhWYWwpIC0gMTsKIAogICAgICAgLyogSWYgdGhlIGFjY3UgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggb3ZlcmZsb3cgYml0cywgd2UgY2Fubm90CiAgICAgICAgICBzaGlmdCB0aGUgc2FtcGxlcyB1cCB0byB0aGUgbGltaXQuCkBAIC0xNTIyLDM4ICsyMTU2LDM0IEBACiAKICAgICAgIHN1bUFsbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCi0KLSAgICAgIGZvciAoaz1saTsgazx1aTsgaysrKSB7Ci0KKyAgICAgIGZvciAoayA9IGxpOyBrIDwgdWk7IGsrKykgewogICAgICAgICBzdW1MaW5lID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWchPU5VTEwpIHsKLSAgICAgICAgICBpZiAocHJlU2hpZnQ+PTApIHsKLSAgICAgICAgICAgIGZvciAobD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewotICAgICAgICAgICAgICB0ZW1wICAgPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdIDw8IChpbnQpcHJlU2hpZnQ7CisgICAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnICE9IE5VTEwpIHsKKyAgICAgICAgICBpZiAocHJlU2hpZnQgPj0gMCkgeworICAgICAgICAgICAgZm9yIChsID0gc3RhcnRfcG9zOyBsIDwgbmV4dF9wb3M7IGwrKykgeworICAgICAgICAgICAgICB0ZW1wID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgICBzdW1MaW5lICs9IGZQb3cyRGl2Mih0ZW1wKTsKLSAgICAgICAgICAgICAgdGVtcCAgID0gYW5hbHlzQnVmZmVySW1hZ1tsXVtrXSA8PCAoaW50KXByZVNoaWZ0OworICAgICAgICAgICAgICB0ZW1wID0gYW5hbHlzQnVmZmVySW1hZ1tsXVtrXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgICBzdW1MaW5lICs9IGZQb3cyRGl2Mih0ZW1wKTsKLQogICAgICAgICAgICAgfQogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKLSAgICAgICAgICAgICAgdGVtcCAgID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXSA+PiAtKGludClwcmVTaGlmdDsKKyAgICAgICAgICAgIGZvciAobCA9IHN0YXJ0X3BvczsgbCA8IG5leHRfcG9zOyBsKyspIHsKKyAgICAgICAgICAgICAgdGVtcCA9IGFuYWx5c0J1ZmZlclJlYWxbbF1ba10gPj4gLShpbnQpcHJlU2hpZnQ7CiAgICAgICAgICAgICAgIHN1bUxpbmUgKz0gZlBvdzJEaXYyKHRlbXApOwotICAgICAgICAgICAgICB0ZW1wICAgPSBhbmFseXNCdWZmZXJJbWFnW2xdW2tdID4+IC0oaW50KXByZVNoaWZ0OworICAgICAgICAgICAgICB0ZW1wID0gYW5hbHlzQnVmZmVySW1hZ1tsXVtrXSA+PiAtKGludClwcmVTaGlmdDsKICAgICAgICAgICAgICAgc3VtTGluZSArPSBmUG93MkRpdjIodGVtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChwcmVTaGlmdD49MCkgewotICAgICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7Ci0gICAgICAgICAgICAgIHRlbXAgICA9IGFuYWx5c0J1ZmZlclJlYWxbbF1ba10gPDwgKGludClwcmVTaGlmdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAocHJlU2hpZnQgPj0gMCkgeworICAgICAgICAgICAgZm9yIChsID0gc3RhcnRfcG9zOyBsIDwgbmV4dF9wb3M7IGwrKykgeworICAgICAgICAgICAgICB0ZW1wID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgICBzdW1MaW5lICs9IGZQb3cyRGl2Mih0ZW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7Ci0gICAgICAgICAgICAgIHRlbXAgICA9IGFuYWx5c0J1ZmZlclJlYWxbbF1ba10gPj4gLShpbnQpcHJlU2hpZnQ7CisgICAgICAgICAgICBmb3IgKGwgPSBzdGFydF9wb3M7IGwgPCBuZXh0X3BvczsgbCsrKSB7CisgICAgICAgICAgICAgIHRlbXAgPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdID4+IC0oaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgICBzdW1MaW5lICs9IGZQb3cyRGl2Mih0ZW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CkBAIC0xNTYxLDggKzIxOTEsOCBAQAogCiAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgUU1GLWNoYW5uZWxzIHBlciBTQlIgYmFuZHMgbWF5IGJlIHVwIHRvIDE1LgogICAgICAgICAgICBTaGlmdCByaWdodCB0byBhdm9pZCBvdmVyZmxvd3MgaW4gc3VtIG92ZXIgYWxsIGNoYW5uZWxzLiAqLwotICAgICAgICBzdW1MaW5lID0gc3VtTGluZSA+PiAoNC0xKTsKLSAgICAgICAgc3VtQWxsICArPSBzdW1MaW5lOworICAgICAgICBzdW1MaW5lID0gc3VtTGluZSA+PiAoNCAtIDEpOworICAgICAgICBzdW1BbGwgKz0gc3VtTGluZTsKICAgICAgIH0KIAogICAgICAgLyogQ29udmVydCBkb3VibGUgcHJlY2lzaW9uIHRvIE1hbnRpc3NhL0V4cG9uZW50OiAqLwpAQCAtMTU3MCw2MiArMjIwMCw2NiBAQAogICAgICAgc3VtID0gc3VtQWxsIDw8IChpbnQpc2hpZnQ7CiAKICAgICAgIC8qIERpdmlkZSBieSB3aWR0aCBvZiBlbnZlbG9wZTogKi8KLSAgICAgIHN1bSA9IGZNdWx0KHN1bSxpbnZXaWR0aCk7CisgICAgICBzdW0gPSBmTXVsdChzdW0sIGludldpZHRoKTsKIAogICAgICAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIFNmYjogKi8KLSAgICAgIHN1bSA9IGZNdWx0KHN1bSwgRlhfREJMMkZYX1NHTChHZXRJbnZJbnQodWktbGkpKSk7CisgICAgICBzdW0gPSBmTXVsdChzdW0sIEZYX0RCTDJGWF9TR0woR2V0SW52SW50KHVpIC0gbGkpKSk7CiAKICAgICAgIC8qIFNldCBhbGwgU3ViYmFuZCBlbmVyZ2llcyBpbiB0aGUgU2ZiIHRvIHRoZSBhdmVyYWdlIGVuZXJneTogKi8KLSAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnIT1OVUxMKQotICAgICAgICBzdW1fZSA9IGlucHV0X2UgKyA0IC0gc2hpZnQ7ICAvKiAtNCB0byBjb21wZW5zYXRlIHJpZ2h0LXNoaWZ0ICovCisgICAgICBpZiAoYW5hbHlzQnVmZmVySW1hZyAhPSBOVUxMKQorICAgICAgICBzdW1fZSA9IGlucHV0X2UgKyA0IC0gc2hpZnQ7IC8qIC00IHRvIGNvbXBlbnNhdGUgcmlnaHQtc2hpZnQgKi8KICAgICAgIGVsc2UKLSAgICAgICAgc3VtX2UgPSBpbnB1dF9lICsgNCArIDEgLSBzaGlmdDsgIC8qIC00IHRvIGNvbXBlbnNhdGUgcmlnaHQtc2hpZnQ7ICsxIGR1ZSB0byBtaXNzaW5nIGltYWcuIHBhcnQgKi8KKyAgICAgICAgc3VtX2UgPSBpbnB1dF9lICsgNCArIDEgLQorICAgICAgICAgICAgICAgIHNoaWZ0OyAvKiAtNCB0byBjb21wZW5zYXRlIHJpZ2h0LXNoaWZ0OyArMSBkdWUgdG8gbWlzc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnLiBwYXJ0ICovCiAKICAgICAgIHN1bV9lIC09IDIgKiBwcmVTaGlmdDsKICAgICB9IC8qIG1heFZhbCE9MCAqLwogICAgIGVsc2UgewotCiAgICAgICAvKiBQcmV2ZW50IGEgemVyby1tYW50aXNzYS1udW1iZXIgZnJvbSBiZWluZyBtaXNpbnRlcnByZXRlZAogICAgICAgICAgZHVlIHRvIGl0cyBleHBvbmVudC4gKi8KICAgICAgIHN1bSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgc3VtX2UgPSAwOwogICAgIH0KIAotICAgIGZvciAoaz1saTsgazx1aTsgaysrKQotICAgIHsKLSAgICAgICpucmdFc3QrKyAgID0gc3VtOworICAgIGZvciAoayA9IGxpOyBrIDwgdWk7IGsrKykgeworICAgICAgKm5yZ0VzdCsrID0gc3VtOwogICAgICAgKm5yZ0VzdF9lKysgPSBzdW1fZTsKICAgICB9CiAgIH0KIH0KIAotCiAvKiEKICAgXGJyaWVmICBDYWxjdWxhdGUgZ2Fpbiwgbm9pc2UsIGFuZCBhZGRpdGlvbmFsIHNpbmUgbGV2ZWwgZm9yIG9uZSBzdWJiYW5kLgogCiAgIFRoZSByZXN1bHRpbmcgZW5lcmd5IGdhaW4gaXMgZ2l2ZW4gYnkgbWFudGlzc2EgYW5kIGV4cG9uZW50LgogKi8KLXN0YXRpYyB2b2lkIGNhbGNTdWJiYW5kR2FpbihGSVhQX0RCTCAgbnJnUmVmLCAgICAgICAgICAgIC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBucmdSZWZfZSwgICAgICAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhIChleHBvbmVudCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICB0bXBOb2lzZSwgICAgICAgICAgLyohPCBSZWxhdGl2ZSBub2lzZSBsZXZlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICB0bXBOb2lzZV9lLCAgICAgICAgLyohPCBSZWxhdGl2ZSBub2lzZSBsZXZlbCAoZXhwb25lbnQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgIHNpbmVQcmVzZW50RmxhZywgICAvKiE8IEluZGljYXRlcyBpZiBzaW5lIGlzIHByZXNlbnQgb24gYmFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICBzaW5lTWFwcGVkLCAgICAgICAgLyohPCBJbmRpY2F0ZXMgaWYgc2luZSBtdXN0IGJlIGFkZGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vTm9pc2VGbGFnKSAgICAgICAvKiE8IEZsYWcgdG8gc3VwcHJlc3Mgbm9pc2UgYWRkaXRpb24gKi8KK3N0YXRpYyB2b2lkIGNhbGNTdWJiYW5kR2FpbigKKyAgICBGSVhQX0RCTCBucmdSZWYsIC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YSAqLworICAgIFNDSEFSCisgICAgICAgIG5yZ1JlZl9lLCAvKiE8IFJlZmVyZW5jZSBFbmVyZ3kgYWNjb3JkaW5nIHRvIGVudmVsb3BlIGRhdGEgKGV4cG9uZW50KSAqLworICAgIEVOVl9DQUxDX05SR1MgKm5yZ3MsIGludCBpLCBGSVhQX0RCTCB0bXBOb2lzZSwgLyohPCBSZWxhdGl2ZSBub2lzZSBsZXZlbCAqLworICAgIFNDSEFSIHRtcE5vaXNlX2UsICAgICAgLyohPCBSZWxhdGl2ZSBub2lzZSBsZXZlbCAoZXhwb25lbnQpICovCisgICAgVUNIQVIgc2luZVByZXNlbnRGbGFnLCAvKiE8IEluZGljYXRlcyBpZiBzaW5lIGlzIHByZXNlbnQgb24gYmFuZCAqLworICAgIFVDSEFSIHNpbmVNYXBwZWQsICAgICAgLyohPCBJbmRpY2F0ZXMgaWYgc2luZSBtdXN0IGJlIGFkZGVkICovCisgICAgaW50IG5vTm9pc2VGbGFnKSAgICAgICAvKiE8IEZsYWcgdG8gc3VwcHJlc3Mgbm9pc2UgYWRkaXRpb24gKi8KIHsKLSAgRklYUF9EQkwgIG5yZ0VzdCAgICAgICAgICA9IG5yZ3MtPm5yZ0VzdFtpXTsgICAgICAgICAgICAvKiE8IEVuZXJneSBpbiB0cmFuc3Bvc2VkIHNpZ25hbCAqLwotICBTQ0hBUiAgICAgbnJnRXN0X2UgICAgICAgID0gbnJncy0+bnJnRXN0X2VbaV07ICAgICAgICAgIC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsIChleHBvbmVudCkgKi8KLSAgRklYUF9EQkwgKnB0ck5yZ0dhaW4gICAgICA9ICZucmdzLT5ucmdHYWluW2ldOyAgICAgICAgICAvKiE8IFJlc3VsdGluZyBlbmVyZ3kgZ2FpbiAqLwotICBTQ0hBUiAgICAqcHRyTnJnR2Fpbl9lICAgID0gJm5yZ3MtPm5yZ0dhaW5fZVtpXTsgICAgICAgIC8qITwgUmVzdWx0aW5nIGVuZXJneSBnYWluIChleHBvbmVudCkgKi8KLSAgRklYUF9EQkwgKnB0ck5vaXNlTGV2ZWwgICA9ICZucmdzLT5ub2lzZUxldmVsW2ldOyAgICAgICAvKiE8IFJlc3VsdGluZyBhYnNvbHV0ZSBub2lzZSBlbmVyZ3kgKi8KLSAgU0NIQVIgICAgKnB0ck5vaXNlTGV2ZWxfZSA9ICZucmdzLT5ub2lzZUxldmVsX2VbaV07ICAgICAvKiE8IFJlc3VsdGluZyBhYnNvbHV0ZSBub2lzZSBlbmVyZ3kgKGV4cG9uZW50KSAqLwotICBGSVhQX0RCTCAqcHRyTnJnU2luZSAgICAgID0gJm5yZ3MtPm5yZ1NpbmVbaV07ICAgICAgICAgIC8qITwgQWRkaXRpb25hbCBzaW5lIGVuZXJneSAqLwotICBTQ0hBUiAgICAqcHRyTnJnU2luZV9lICAgID0gJm5yZ3MtPm5yZ1NpbmVfZVtpXTsgICAgICAgIC8qITwgQWRkaXRpb25hbCBzaW5lIGVuZXJneSAoZXhwb25lbnQpICovCisgIEZJWFBfREJMIG5yZ0VzdCA9IG5yZ3MtPm5yZ0VzdFtpXTsgLyohPCBFbmVyZ3kgaW4gdHJhbnNwb3NlZCBzaWduYWwgKi8KKyAgU0NIQVIgbnJnRXN0X2UgPQorICAgICAgbnJncy0+bnJnRXN0X2VbaV07IC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsIChleHBvbmVudCkgKi8KKyAgRklYUF9EQkwgKnB0ck5yZ0dhaW4gPSAmbnJncy0+bnJnR2FpbltpXTsgLyohPCBSZXN1bHRpbmcgZW5lcmd5IGdhaW4gKi8KKyAgU0NIQVIgKnB0ck5yZ0dhaW5fZSA9CisgICAgICAmbnJncy0+bnJnR2Fpbl9lW2ldOyAvKiE8IFJlc3VsdGluZyBlbmVyZ3kgZ2FpbiAoZXhwb25lbnQpICovCisgIEZJWFBfREJMICpwdHJOb2lzZUxldmVsID0KKyAgICAgICZucmdzLT5ub2lzZUxldmVsW2ldOyAvKiE8IFJlc3VsdGluZyBhYnNvbHV0ZSBub2lzZSBlbmVyZ3kgKi8KKyAgU0NIQVIgKnB0ck5vaXNlTGV2ZWxfZSA9CisgICAgICAmbnJncy0+bm9pc2VMZXZlbF9lW2ldOyAvKiE8IFJlc3VsdGluZyBhYnNvbHV0ZSBub2lzZSBlbmVyZ3kgKGV4cG9uZW50KSAqLworICBGSVhQX0RCTCAqcHRyTnJnU2luZSA9ICZucmdzLT5ucmdTaW5lW2ldOyAvKiE8IEFkZGl0aW9uYWwgc2luZSBlbmVyZ3kgKi8KKyAgU0NIQVIgKnB0ck5yZ1NpbmVfZSA9CisgICAgICAmbnJncy0+bnJnU2luZV9lW2ldOyAvKiE8IEFkZGl0aW9uYWwgc2luZSBlbmVyZ3kgKGV4cG9uZW50KSAqLwogCiAgIEZJWFBfREJMIGEsIGIsIGM7Ci0gIFNDSEFSICAgIGFfZSwgYl9lLCBjX2U7CisgIFNDSEFSIGFfZSwgYl9lLCBjX2U7CiAKICAgLyoKICAgICAgVGhpcyBhZGRpdGlvbiBvZiAxIHByZXZlbnRzIGRpdmlzaW9ucyBieSB6ZXJvIGluIHRoZSByZWZlcmVuY2UgY29kZS4KQEAgLTE2MzMsNzQgKzIyNjcsNjQgQEAKICAgICAgdmVyeSBoaWdoIHdoaWNoIGNvdWxkIGNhdXNlIHNvbWUgdHJvdWJsZSBkdWUgdG8gdGhlIHNtb290aGluZy4KICAgKi8KICAgYl9lID0gKGludCkobnJnRXN0X2UgLSAxKTsKLSAgaWYgKGJfZT49MCkgewotICAgIG5yZ0VzdCA9IChGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiAoSU5UKWZpeE1pbihiX2UrMSxERlJBQ1RfQklUUy0xKSkgKyAobnJnRXN0ID4+IDEpOwotICAgIG5yZ0VzdF9lICs9IDE7ICAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLworICBpZiAoYl9lID49IDApIHsKKyAgICBucmdFc3QgPSAoRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gKElOVClmaXhNaW4oYl9lICsgMSwgREZSQUNUX0JJVFMgLSAxKSkgKworICAgICAgICAgICAgIChucmdFc3QgPj4gMSk7CisgICAgbnJnRXN0X2UgKz0gMTsgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KIAogICB9IGVsc2UgewotICAgIG5yZ0VzdCA9IChucmdFc3QgPj4gKElOVCkoZml4TWluKC1iX2UrMSxERlJBQ1RfQklUUy0xKSkpICsgKEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IDEpOwotICAgIG5yZ0VzdF9lID0gMjsgIC8qIHNoaWZ0IGJ5IDEgYml0IHRvIGF2b2lkIG92ZXJmbG93ICovCisgICAgbnJnRXN0ID0gKG5yZ0VzdCA+PiAoSU5UKShmaXhNaW4oLWJfZSArIDEsIERGUkFDVF9CSVRTIC0gMSkpKSArCisgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IDEpOworICAgIG5yZ0VzdF9lID0gMjsgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KICAgfQogCiAgIC8qICBBID0gTnJnUmVmICogVG1wTm9pc2UgKi8KLSAgYSA9IGZNdWx0KG5yZ1JlZix0bXBOb2lzZSk7CisgIGEgPSBmTXVsdChucmdSZWYsIHRtcE5vaXNlKTsKICAgYV9lID0gbnJnUmVmX2UgKyB0bXBOb2lzZV9lOwogCiAgIC8qICBCID0gMSArIFRtcE5vaXNlICovCiAgIGJfZSA9IChpbnQpKHRtcE5vaXNlX2UgLSAxKTsKLSAgaWYgKGJfZT49MCkgewotICAgIGIgPSAoRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gKElOVClmaXhNaW4oYl9lKzEsREZSQUNUX0JJVFMtMSkpICsgKHRtcE5vaXNlID4+IDEpOwotICAgIGJfZSA9IHRtcE5vaXNlX2UgKyAxOyAgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKyAgaWYgKGJfZSA+PSAwKSB7CisgICAgYiA9IChGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiAoSU5UKWZpeE1pbihiX2UgKyAxLCBERlJBQ1RfQklUUyAtIDEpKSArCisgICAgICAgICh0bXBOb2lzZSA+PiAxKTsKKyAgICBiX2UgPSB0bXBOb2lzZV9lICsgMTsgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KICAgfSBlbHNlIHsKLSAgICBiID0gKHRtcE5vaXNlID4+IChJTlQpKGZpeE1pbigtYl9lKzEsREZSQUNUX0JJVFMtMSkpKSArIChGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiAxKTsKLSAgICBiX2UgPSAyOyAgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKyAgICBiID0gKHRtcE5vaXNlID4+IChJTlQpKGZpeE1pbigtYl9lICsgMSwgREZSQUNUX0JJVFMgLSAxKSkpICsKKyAgICAgICAgKEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IDEpOworICAgIGJfZSA9IDI7IC8qIHNoaWZ0IGJ5IDEgYml0IHRvIGF2b2lkIG92ZXJmbG93ICovCiAgIH0KIAogICAvKiAgbm9pc2VMZXZlbCA9IEEgLyBCID0gKE5yZ1JlZiAqIFRtcE5vaXNlKSAvICgxICsgVG1wTm9pc2UpICovCi0gIEZES19kaXZpZGVfTWFudEV4cCggYSwgIGFfZSwKLSAgICAgICAgICAgICAgICAgICAgICBiLCAgYl9lLAotICAgICAgICAgICAgICAgICAgICAgIHB0ck5vaXNlTGV2ZWwsIHB0ck5vaXNlTGV2ZWxfZSk7CisgIEZES19kaXZpZGVfTWFudEV4cChhLCBhX2UsIGIsIGJfZSwgcHRyTm9pc2VMZXZlbCwgcHRyTm9pc2VMZXZlbF9lKTsKIAogICBpZiAoc2luZVByZXNlbnRGbGFnKSB7Ci0KICAgICAvKiAgQyA9ICgxICsgVG1wTm9pc2UpICogTnJnRXN0ICovCi0gICAgYyA9IGZNdWx0KGIsbnJnRXN0KTsKKyAgICBjID0gZk11bHQoYiwgbnJnRXN0KTsKICAgICBjX2UgPSBiX2UgKyBucmdFc3RfZTsKIAogICAgIC8qICBnYWluID0gQSAvIEMgPSAoTnJnUmVmICogVG1wTm9pc2UpIC8gKDEgKyBUbXBOb2lzZSkgKiBOcmdFc3QgKi8KLSAgICBGREtfZGl2aWRlX01hbnRFeHAoIGEsICBhX2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBjLCAgY19lLAotICAgICAgICAgICAgICAgICAgICAgICAgcHRyTnJnR2FpbiwgcHRyTnJnR2Fpbl9lKTsKKyAgICBGREtfZGl2aWRlX01hbnRFeHAoYSwgYV9lLCBjLCBjX2UsIHB0ck5yZ0dhaW4sIHB0ck5yZ0dhaW5fZSk7CiAKICAgICBpZiAoc2luZU1hcHBlZCkgewotCiAgICAgICAvKiAgc2luZUxldmVsID0gbnJnUmVmLyAoMSArIFRtcE5vaXNlKSAqLwotICAgICAgRkRLX2RpdmlkZV9NYW50RXhwKCBucmdSZWYsICBucmdSZWZfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgIGJfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyTnJnU2luZSwgcHRyTnJnU2luZV9lKTsKKyAgICAgIEZES19kaXZpZGVfTWFudEV4cChucmdSZWYsIG5yZ1JlZl9lLCBiLCBiX2UsIHB0ck5yZ1NpbmUsIHB0ck5yZ1NpbmVfZSk7CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGlmIChub05vaXNlRmxhZykgewogICAgICAgLyogIEIgPSBOcmdFc3QgKi8KICAgICAgIGIgPSBucmdFc3Q7CiAgICAgICBiX2UgPSBucmdFc3RfZTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIC8qICBCID0gTnJnRXN0ICogKDEgKyBUbXBOb2lzZSkgKi8KLSAgICAgIGIgPSBmTXVsdChiLG5yZ0VzdCk7CisgICAgICBiID0gZk11bHQoYiwgbnJnRXN0KTsKICAgICAgIGJfZSA9IGJfZSArIG5yZ0VzdF9lOwogICAgIH0KIAotCiAgICAgLyogIGdhaW4gPSBucmdSZWYgLyBCICovCi0gICAgRkRLX2RpdmlkZV9NYW50RXhwKCBucmdSZWYsICBucmdSZWZfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGIsICBiX2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBwdHJOcmdHYWluLCBwdHJOcmdHYWluX2UpOworICAgIEZES19kaXZpZGVfTWFudEV4cChucmdSZWYsIG5yZ1JlZl9lLCBiLCBiX2UsIHB0ck5yZ0dhaW4sIHB0ck5yZ0dhaW5fZSk7CiAgIH0KIH0KIAotCiAvKiEKICAgXGJyaWVmICBDYWxjdWxhdGUgImF2ZXJhZ2UgZ2FpbiIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViYmFuZCByYW5nZS4KIApAQCAtMTcwOSwxMjEgKzIzMzMsMTQwIEBACiAgIFRoZSByZXN1bHQgaXMgdXNlZCBhcyBhIHJlbGF0aXZlIGxpbWl0IGZvciBhbGwgZ2FpbnMgd2l0aGluIHRoZQogICBjdXJyZW50ICJsaW1pdGVyIGJhbmQiIChhIGNlcnRhaW4gZnJlcXVlbmN5IHJhbmdlKS4KICovCi1zdGF0aWMgdm9pZCBjYWxjQXZnR2FpbihFTlZfQ0FMQ19OUkdTKiBucmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBsb3dTdWJiYW5kLCAgICAvKiE8IEJlZ2luIG9mIHRoZSBsaW1pdGVyIGJhbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgaGlnaFN1YmJhbmQsICAgLyohPCBIaWdoIGVuZCBvZiB0aGUgbGltaXRlciBiYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKnB0clN1bVJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAqcHRyU3VtUmVmX2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKnB0ckF2Z0dhaW4sICAvKiE8IFJlc3VsdGluZyBvdmVyYWxsIGdhaW4gKG1hbnRpc3NhKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICpwdHJBdmdHYWluX2UpICAvKiE8IFJlc3VsdGluZyBvdmVyYWxsIGdhaW4gKGV4cG9uZW50KSAqLworc3RhdGljIHZvaWQgY2FsY0F2Z0dhaW4oCisgICAgRU5WX0NBTENfTlJHUyAqbnJncywgaW50IGxvd1N1YmJhbmQsIC8qITwgQmVnaW4gb2YgdGhlIGxpbWl0ZXIgYmFuZCAqLworICAgIGludCBoaWdoU3ViYmFuZCwgICAgICAgICAgICAgICAgICAgICAvKiE8IEhpZ2ggZW5kIG9mIHRoZSBsaW1pdGVyIGJhbmQgKi8KKyAgICBGSVhQX0RCTCAqcHRyU3VtUmVmLCBTQ0hBUiAqcHRyU3VtUmVmX2UsCisgICAgRklYUF9EQkwgKnB0ckF2Z0dhaW4sIC8qITwgUmVzdWx0aW5nIG92ZXJhbGwgZ2FpbiAobWFudGlzc2EpICovCisgICAgU0NIQVIgKnB0ckF2Z0dhaW5fZSkgIC8qITwgUmVzdWx0aW5nIG92ZXJhbGwgZ2FpbiAoZXhwb25lbnQpICovCiB7Ci0gIEZJWFBfREJMICAqbnJnUmVmICAgPSBucmdzLT5ucmdSZWY7ICAgICAgIC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YSAqLwotICBTQ0hBUiAgICAgKm5yZ1JlZl9lID0gbnJncy0+bnJnUmVmX2U7ICAgICAvKiE8IFJlZmVyZW5jZSBFbmVyZ3kgYWNjb3JkaW5nIHRvIGVudmVsb3BlIGRhdGEgKGV4cG9uZW50KSAqLwotICBGSVhQX0RCTCAgKm5yZ0VzdCAgID0gbnJncy0+bnJnRXN0OyAgICAgICAvKiE8IEVuZXJneSBpbiB0cmFuc3Bvc2VkIHNpZ25hbCAqLwotICBTQ0hBUiAgICAgKm5yZ0VzdF9lID0gbnJncy0+bnJnRXN0X2U7ICAgICAvKiE8IEVuZXJneSBpbiB0cmFuc3Bvc2VkIHNpZ25hbCAoZXhwb25lbnQpICovCisgIEZJWFBfREJMICpucmdSZWYgPQorICAgICAgbnJncy0+bnJnUmVmOyAvKiE8IFJlZmVyZW5jZSBFbmVyZ3kgYWNjb3JkaW5nIHRvIGVudmVsb3BlIGRhdGEgKi8KKyAgU0NIQVIgKm5yZ1JlZl9lID0KKyAgICAgIG5yZ3MtPm5yZ1JlZl9lOyAvKiE8IFJlZmVyZW5jZSBFbmVyZ3kgYWNjb3JkaW5nIHRvIGVudmVsb3BlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwb25lbnQpICovCisgIEZJWFBfREJMICpucmdFc3QgPSBucmdzLT5ucmdFc3Q7IC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsICovCisgIFNDSEFSICpucmdFc3RfZSA9CisgICAgICBucmdzLT5ucmdFc3RfZTsgLyohPCBFbmVyZ3kgaW4gdHJhbnNwb3NlZCBzaWduYWwgKGV4cG9uZW50KSAqLwogCiAgIEZJWFBfREJMIHN1bVJlZiA9IDE7CiAgIEZJWFBfREJMIHN1bUVzdCA9IDE7Ci0gIFNDSEFSICAgIHN1bVJlZl9lID0gLUZSQUNUX0JJVFM7Ci0gIFNDSEFSICAgIHN1bUVzdF9lID0gLUZSQUNUX0JJVFM7Ci0gIGludCAgICAgIGs7CisgIFNDSEFSIHN1bVJlZl9lID0gLUZSQUNUX0JJVFM7CisgIFNDSEFSIHN1bUVzdF9lID0gLUZSQUNUX0JJVFM7CisgIGludCBrOwogCi0gIGZvciAoaz1sb3dTdWJiYW5kOyBrPGhpZ2hTdWJiYW5kOyBrKyspeworICBmb3IgKGsgPSBsb3dTdWJiYW5kOyBrIDwgaGlnaFN1YmJhbmQ7IGsrKykgewogICAgIC8qIEFkZCBucmdSZWZba10gdG8gc3VtUmVmOiAqLwotICAgIEZES19hZGRfTWFudEV4cCggc3VtUmVmLCBzdW1SZWZfZSwKLSAgICAgICAgICAgICAgICAgICAgIG5yZ1JlZltrXSwgbnJnUmVmX2Vba10sCi0gICAgICAgICAgICAgICAgICAgICAmc3VtUmVmLCAmc3VtUmVmX2UgKTsKKyAgICBGREtfYWRkX01hbnRFeHAoc3VtUmVmLCBzdW1SZWZfZSwgbnJnUmVmW2tdLCBucmdSZWZfZVtrXSwgJnN1bVJlZiwKKyAgICAgICAgICAgICAgICAgICAgJnN1bVJlZl9lKTsKIAogICAgIC8qIEFkZCBucmdFc3Rba10gdG8gc3VtRXN0OiAqLwotICAgIEZES19hZGRfTWFudEV4cCggc3VtRXN0LCBzdW1Fc3RfZSwKLSAgICAgICAgICAgICAgICAgICAgIG5yZ0VzdFtrXSwgbnJnRXN0X2Vba10sCi0gICAgICAgICAgICAgICAgICAgICAmc3VtRXN0LCAmc3VtRXN0X2UgKTsKKyAgICBGREtfYWRkX01hbnRFeHAoc3VtRXN0LCBzdW1Fc3RfZSwgbnJnRXN0W2tdLCBucmdFc3RfZVtrXSwgJnN1bUVzdCwKKyAgICAgICAgICAgICAgICAgICAgJnN1bUVzdF9lKTsKICAgfQogCi0gIEZES19kaXZpZGVfTWFudEV4cChzdW1SZWYsIHN1bVJlZl9lLAotICAgICAgICAgICAgICAgICAgICAgc3VtRXN0LCBzdW1Fc3RfZSwKLSAgICAgICAgICAgICAgICAgICAgIHB0ckF2Z0dhaW4sIHB0ckF2Z0dhaW5fZSk7CisgIEZES19kaXZpZGVfTWFudEV4cChzdW1SZWYsIHN1bVJlZl9lLCBzdW1Fc3QsIHN1bUVzdF9lLCBwdHJBdmdHYWluLAorICAgICAgICAgICAgICAgICAgICAgcHRyQXZnR2Fpbl9lKTsKIAogICAqcHRyU3VtUmVmID0gc3VtUmVmOwogICAqcHRyU3VtUmVmX2UgPSBzdW1SZWZfZTsKIH0KIAogc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RfRWxkR3JpZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwdHJSZWFsLCAgICAgICAgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpwdHJIYXJtSW5kZXgsICAgLyohPCBIYXJtb25pYyBpbmRleCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGxvd1N1YmJhbmQsICAgICAvKiE8IExvd2VzdCBRTUYtY2hhbm5lbCBpbiB0aGUgY3VycmVudGx5IHVzZWQgU0JSIHJhbmdlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vU3ViYmFuZHMsICAgICAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9jaGFuZ2UsICAgLyohPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBhZGp1c3RlZCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9Ob2lzZUZsYWcsICAgIC8qITwgRmxhZyB0byBzdXBwcmVzcyBub2lzZSBhZGRpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgKnB0clBoYXNlSW5kZXgsICAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9kaWZmX2xvdykgLyohPCAgKi8KKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QKKyAgICAgICAgcHRyUmVhbCwgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLworICAgIEVOVl9DQUxDX05SR1MgKm5yZ3MsIFVDSEFSICpwdHJIYXJtSW5kZXgsIC8qITwgSGFybW9uaWMgaW5kZXggKi8KKyAgICBpbnQgbG93U3ViYmFuZCwgLyohPCBMb3dlc3QgUU1GLWNoYW5uZWwgaW4gdGhlIGN1cnJlbnRseSB1c2VkIFNCUiByYW5nZS4gKi8KKyAgICBpbnQgbm9TdWJiYW5kcywgLyohPCBOdW1iZXIgb2YgUU1GIHN1YmJhbmRzICovCisgICAgaW50IHNjYWxlX2NoYW5nZSwgICAvKiE8IE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IGFkanVzdGVkIHNhbXBsZXMgKi8KKyAgICBpbnQgbm9Ob2lzZUZsYWcsICAgIC8qITwgRmxhZyB0byBzdXBwcmVzcyBub2lzZSBhZGRpdGlvbiAqLworICAgIGludCAqcHRyUGhhc2VJbmRleCwgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCisgICAgaW50IHNjYWxlX2RpZmZfbG93KSAvKiE8ICAqLworCiB7CiAgIGludCBrOwotICBGSVhQX0RCTCAgc2lnbmFsUmVhbCwgc2JOb2lzZTsKKyAgRklYUF9EQkwgc2lnbmFsUmVhbCwgc2JOb2lzZTsKICAgaW50IHRvbmVfY291bnQgPSAwOwogCi0gIEZJWFBfREJMICpwR2FpbiAgICAgICA9IG5yZ3MtPm5yZ0dhaW47ICAgICAvKiE8IEdhaW5zIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KLSAgRklYUF9EQkwgKnBOb2lzZUxldmVsID0gbnJncy0+bm9pc2VMZXZlbDsgIC8qITwgTm9pc2UgbGV2ZWxzIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KLSAgRklYUF9EQkwgKnBTaW5lTGV2ZWwgID0gbnJncy0+bnJnU2luZTsgICAgIC8qITwgU2luZSBsZXZlbHMgKi8KKyAgRklYUF9EQkwgKnBHYWluID0gbnJncy0+bnJnR2FpbjsgLyohPCBHYWlucyBvZiBjdXJyZW50IGVudmVsb3BlICovCisgIEZJWFBfREJMICpSRVNUUklDVCBwTm9pc2VMZXZlbCA9CisgICAgICBucmdzLT5ub2lzZUxldmVsOyAvKiE8IE5vaXNlIGxldmVscyBvZiBjdXJyZW50IGVudmVsb3BlICovCisgIEZJWFBfREJMICpSRVNUUklDVCBwU2luZUxldmVsID0gbnJncy0+bnJnU2luZTsgLyohPCBTaW5lIGxldmVscyAqLwogCi0gIGludCAgICBwaGFzZUluZGV4ID0gKnB0clBoYXNlSW5kZXg7Ci0gIFVDSEFSICBoYXJtSW5kZXggID0gKnB0ckhhcm1JbmRleDsKKyAgaW50IHBoYXNlSW5kZXggPSAqcHRyUGhhc2VJbmRleDsKKyAgVUNIQVIgaGFybUluZGV4ID0gKnB0ckhhcm1JbmRleDsKIAotICBzdGF0aWMgY29uc3QgSU5UIGhhcm1vbmljUGhhc2UgWzJdWzRdID0gewotICAgIHsgMSwgMCwgLTEsICAwfSwKLSAgICB7IDAsIDEsICAwLCAtMX0KLSAgfTsKKyAgc3RhdGljIGNvbnN0IElOVCBoYXJtb25pY1BoYXNlWzRdWzJdID0ge3sxLCAwfSwgezAsIDF9LCB7LTEsIDB9LCB7MCwgLTF9fTsKIAotICBzdGF0aWMgY29uc3QgRklYUF9EQkwgaGFybW9uaWNQaGFzZVggWzJdWzRdID0gewotICAgIHsgRkwyRlhDT05TVF9EQkwoMi4wKjEuMjQ1MTgzMTU0NTM5MTM5ZS0wMDEpLCAgRkwyRlhDT05TVF9EQkwoMi4wKi0xLjEyMzc2Nzg1OTMyNTAyOGUtMDAxKSwgIEZMMkZYQ09OU1RfREJMKDIuMCotMS4yNDUxODMxNTQ1MzkxMzllLTAwMSksIEZMMkZYQ09OU1RfREJMKDIuMCogMS4xMjM3Njc4NTkzMjUwMjhlLTAwMSkgfSwKLSAgICB7IEZMMkZYQ09OU1RfREJMKDIuMCoxLjI0NTE4MzE1NDUzOTEzOWUtMDAxKSwgIEZMMkZYQ09OU1RfREJMKDIuMCogMS4xMjM3Njc4NTkzMjUwMjhlLTAwMSksICBGTDJGWENPTlNUX0RCTCgyLjAqLTEuMjQ1MTgzMTU0NTM5MTM5ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCgyLjAqLTEuMTIzNzY3ODU5MzI1MDI4ZS0wMDEpIH0KLSAgfTsKKyAgc3RhdGljIGNvbnN0IEZJWFBfREJMIGhhcm1vbmljUGhhc2VYWzRdWzJdID0geworICAgICAge0ZMMkZYQ09OU1RfREJMKDIuMCAqIDEuMjQ1MTgzMTU0NTM5MTM5ZS0wMDEpLAorICAgICAgIEZMMkZYQ09OU1RfREJMKDIuMCAqIDEuMjQ1MTgzMTU0NTM5MTM5ZS0wMDEpfSwKKyAgICAgIHtGTDJGWENPTlNUX0RCTCgyLjAgKiAtMS4xMjM3Njc4NTkzMjUwMjhlLTAwMSksCisgICAgICAgRkwyRlhDT05TVF9EQkwoMi4wICogMS4xMjM3Njc4NTkzMjUwMjhlLTAwMSl9LAorICAgICAge0ZMMkZYQ09OU1RfREJMKDIuMCAqIC0xLjI0NTE4MzE1NDUzOTEzOWUtMDAxKSwKKyAgICAgICBGTDJGWENPTlNUX0RCTCgyLjAgKiAtMS4yNDUxODMxNTQ1MzkxMzllLTAwMSl9LAorICAgICAge0ZMMkZYQ09OU1RfREJMKDIuMCAqIDEuMTIzNzY3ODU5MzI1MDI4ZS0wMDEpLAorICAgICAgIEZMMkZYQ09OU1RfREJMKDIuMCAqIC0xLjEyMzc2Nzg1OTMyNTAyOGUtMDAxKX19OwogCi0gIGZvciAoaz0wOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CisgIGNvbnN0IEZJWFBfREJMICpwX2hhcm1vbmljUGhhc2VYID0gJmhhcm1vbmljUGhhc2VYW2hhcm1JbmRleF1bMF07CisgIGNvbnN0IElOVCAqcF9oYXJtb25pY1BoYXNlID0gJmhhcm1vbmljUGhhc2VbaGFybUluZGV4XVswXTsKIAorICAqKHB0clJlYWwgLSAxKSA9IGZBZGRTYXR1cmF0ZSgKKyAgICAgICoocHRyUmVhbCAtIDEpLAorICAgICAgU0FUVVJBVEVfU0hJRlQoZk11bHREaXYyKHBfaGFybW9uaWNQaGFzZVhbbG93U3ViYmFuZCAmIDFdLCBwU2luZUxldmVsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2RpZmZfbG93LCBERlJBQ1RfQklUUykpOworICBGSVhQX0RCTCBwU2luZUxldmVsX3ByZXYgPSAoRklYUF9EQkwpMDsKKworICBpbnQgaWR4X2sgPSBsb3dTdWJiYW5kICYgMTsKKworICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CisgICAgRklYUF9EQkwgc2luZUxldmVsX2N1cnIgPSAqcFNpbmVMZXZlbCsrOwogICAgIHBoYXNlSW5kZXggPSAocGhhc2VJbmRleCArIDEpICYgKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7CiAKLSAgICBpZiggKHBTaW5lTGV2ZWxbMF0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHx8IChub05vaXNlRmxhZyA9PSAxKSApewotICAgICAgc2JOb2lzZSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzYk5vaXNlID0gcE5vaXNlTGV2ZWxbMF07CisgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwgKnBHYWluKyspIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CisgICAgc2JOb2lzZSA9ICpwTm9pc2VMZXZlbCsrOworICAgIGlmICgoKElOVClzaW5lTGV2ZWxfY3VyciB8IG5vTm9pc2VGbGFnKSA9PSAwKSB7CisgICAgICBzaWduYWxSZWFsICs9CisgICAgICAgICAgKGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbcGhhc2VJbmRleF1bMF0sIHNiTm9pc2UpCisgICAgICAgICAgIDw8IDQpOwogICAgIH0KLQotICAgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsKnBHYWluKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOwotCi0gICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtwaGFzZUluZGV4XVswXSwgc2JOb2lzZSk8PDQpOwotCi0gICAgc2lnbmFsUmVhbCArPSBwU2luZUxldmVsWzBdICogaGFybW9uaWNQaGFzZVswXVtoYXJtSW5kZXhdOwotCi0gICAgKnB0clJlYWwgPSBzaWduYWxSZWFsOwotCi0gICAgaWYgKGsgPT0gMCkgewotICAgICAgKihwdHJSZWFsLTEpICs9IHNjYWxlVmFsdWUoZk11bHREaXYyKGhhcm1vbmljUGhhc2VYW2xvd1N1YmJhbmQmMV1baGFybUluZGV4XSwgcFNpbmVMZXZlbFswXSksIC1zY2FsZV9kaWZmX2xvdykgIDsKLSAgICAgIGlmIChrIDwgbm9TdWJiYW5kcyAtIDEpIHsKLSAgICAgICAgKihwdHJSZWFsKSAgICs9IGZNdWx0RGl2MihwU2luZUxldmVsWzFdLCBoYXJtb25pY1BoYXNlWFsobG93U3ViYmFuZCsxKSYxXVtoYXJtSW5kZXhdKTsKKyAgICBzaWduYWxSZWFsICs9IHNpbmVMZXZlbF9jdXJyICogcF9oYXJtb25pY1BoYXNlWzBdOworICAgIHNpZ25hbFJlYWwgPQorICAgICAgICBmTXVsdEFkZERpdjIoc2lnbmFsUmVhbCwgcFNpbmVMZXZlbF9wcmV2LCBwX2hhcm1vbmljUGhhc2VYW2lkeF9rXSk7CisgICAgcFNpbmVMZXZlbF9wcmV2ID0gc2luZUxldmVsX2N1cnI7CisgICAgaWR4X2sgPSAhaWR4X2s7CisgICAgaWYgKGsgPCBub1N1YmJhbmRzIC0gMSkgeworICAgICAgc2lnbmFsUmVhbCA9CisgICAgICAgICAgZk11bHRBZGREaXYyKHNpZ25hbFJlYWwsIHBTaW5lTGV2ZWxbMF0sIHBfaGFybW9uaWNQaGFzZVhbaWR4X2tdKTsKKyAgICB9IGVsc2UgLyogKGsgPT0gbm9TdWJiYW5kcyAtIDEpICAqLworICAgIHsKKyAgICAgIGlmIChrICsgbG93U3ViYmFuZCArIDEgPCA2MykgeworICAgICAgICAqKHB0clJlYWwgKyAxKSArPSBmTXVsdERpdjIocFNpbmVMZXZlbF9wcmV2LCBwX2hhcm1vbmljUGhhc2VYW2lkeF9rXSk7CiAgICAgICB9CiAgICAgfQotICAgIGlmIChrID4gMCAmJiBrIDwgbm9TdWJiYW5kcyAtIDEgJiYgdG9uZV9jb3VudCA8IDE2KSB7Ci0gICAgICAqKHB0clJlYWwpICAgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbLSAxXSwgaGFybW9uaWNQaGFzZVggWyhsb3dTdWJiYW5kK2spJjFdICBbaGFybUluZGV4XSk7Ci0gICAgICAqKHB0clJlYWwpICAgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbKyAxXSwgaGFybW9uaWNQaGFzZVggWyhsb3dTdWJiYW5kK2srMSkmMV1baGFybUluZGV4XSk7Ci0gICAgfQotICAgIGlmIChrID09IG5vU3ViYmFuZHMgLSAxICYmIHRvbmVfY291bnQgPCAxNikgewotICAgICAgaWYgKGsgPiAwKSB7Ci0gICAgICAgICoocHRyUmVhbCkgICArPSBmTXVsdERpdjIocFNpbmVMZXZlbFstIDFdLCBoYXJtb25pY1BoYXNlWCBbKGxvd1N1YmJhbmQraykmMV1baGFybUluZGV4XSk7Ci0gICAgICB9Ci0gICAgICBpZiAoayArIGxvd1N1YmJhbmQgKyAxPCA2MykgewotICAgICAgICAqKHB0clJlYWwrMSkgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbMF0sIGhhcm1vbmljUGhhc2VYWyhsb3dTdWJiYW5kK2srMSkmMV1baGFybUluZGV4XSk7Ci0gICAgICB9Ci0gICAgfQorICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOwogCi0gICAgaWYocFNpbmVMZXZlbFswXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSl7Ci0gICAgICB0b25lX2NvdW50Kys7CisgICAgaWYgKHBTaW5lTGV2ZWxfcHJldiAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgaWYgKCsrdG9uZV9jb3VudCA9PSAxNikgeworICAgICAgICBrKys7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICBwdHJSZWFsKys7Ci0gICAgcE5vaXNlTGV2ZWwrKzsKLSAgICBwR2FpbisrOwotICAgIHBTaW5lTGV2ZWwrKzsKKyAgfQorICAvKiBSdW4gYWdhaW4sIGlmIHByZXZpb3VzIGxvb3AgZ290IGJyZWFrZWQgd2l0aCB0b25lX2NvdW50ID0gMTYgKi8KKyAgZm9yICg7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKKyAgICBGSVhQX0RCTCBzaW5lTGV2ZWxfY3VyciA9ICpwU2luZUxldmVsKys7CisgICAgcGhhc2VJbmRleCA9IChwaGFzZUluZGV4ICsgMSkgJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKworICAgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsICpwR2FpbisrKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOworICAgIHNiTm9pc2UgPSAqcE5vaXNlTGV2ZWwrKzsKKyAgICBpZiAoKChJTlQpc2luZUxldmVsX2N1cnIgfCBub05vaXNlRmxhZykgPT0gMCkgeworICAgICAgc2lnbmFsUmVhbCArPQorICAgICAgICAgIChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW3BoYXNlSW5kZXhdWzBdLCBzYk5vaXNlKQorICAgICAgICAgICA8PCA0KTsKKyAgICB9CisgICAgc2lnbmFsUmVhbCArPSBzaW5lTGV2ZWxfY3VyciAqIHBfaGFybW9uaWNQaGFzZVswXTsKKyAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbDsKICAgfQogCiAgICpwdHJIYXJtSW5kZXggPSAoaGFybUluZGV4ICsgMSkgJiAzOwpAQCAtMTgzNSwyOSArMjQ3OCwzMCBAQAogICAgICAgICAgICBhbmQgYWRkIHRoZSBub2lzZWZsb29yLgogKi8KIAotc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RMQyhGSVhQX0RCTCAqcHRyUmVhbCwgICAgICAgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAqcHRySGFybUluZGV4LCAgLyohPCBIYXJtb25pYyBpbmRleCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgLyohPCBMb3dlc3QgUU1GLWNoYW5uZWwgaW4gdGhlIGN1cnJlbnRseSB1c2VkIFNCUiByYW5nZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vU3ViYmFuZHMsICAgIC8qITwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc2NhbGVfY2hhbmdlLCAgLyohPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBhZGp1c3RlZCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZywgICAvKiE8IEZsYWcgdG8gc3VwcHJlc3Mgbm9pc2UgYWRkaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgKnB0clBoYXNlSW5kZXgpIC8qITwgU3RhcnQgaW5kZXggdG8gcmFuZG9tIG51bWJlciBhcnJheSAqLworc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RMQygKKyAgICBGSVhQX0RCTCAqcHRyUmVhbCwgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLworICAgIEVOVl9DQUxDX05SR1MgKm5yZ3MsIFVDSEFSICpwdHJIYXJtSW5kZXgsIC8qITwgSGFybW9uaWMgaW5kZXggKi8KKyAgICBpbnQgbG93U3ViYmFuZCwgLyohPCBMb3dlc3QgUU1GLWNoYW5uZWwgaW4gdGhlIGN1cnJlbnRseSB1c2VkIFNCUiByYW5nZS4gKi8KKyAgICBpbnQgbm9TdWJiYW5kcywgLyohPCBOdW1iZXIgb2YgUU1GIHN1YmJhbmRzICovCisgICAgaW50IHNjYWxlX2NoYW5nZSwgICAvKiE8IE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IGFkanVzdGVkIHNhbXBsZXMgKi8KKyAgICBpbnQgbm9Ob2lzZUZsYWcsICAgIC8qITwgRmxhZyB0byBzdXBwcmVzcyBub2lzZSBhZGRpdGlvbiAqLworICAgIGludCAqcHRyUGhhc2VJbmRleCkgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCiB7Ci0gIEZJWFBfREJMICpwR2FpbiAgICAgICA9IG5yZ3MtPm5yZ0dhaW47ICAgICAvKiE8IEdhaW5zIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KLSAgRklYUF9EQkwgKnBOb2lzZUxldmVsID0gbnJncy0+bm9pc2VMZXZlbDsgIC8qITwgTm9pc2UgbGV2ZWxzIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KLSAgRklYUF9EQkwgKnBTaW5lTGV2ZWwgID0gbnJncy0+bnJnU2luZTsgICAgIC8qITwgU2luZSBsZXZlbHMgKi8KKyAgRklYUF9EQkwgKnBHYWluID0gbnJncy0+bnJnR2FpbjsgLyohPCBHYWlucyBvZiBjdXJyZW50IGVudmVsb3BlICovCisgIEZJWFBfREJMICpwTm9pc2VMZXZlbCA9CisgICAgICBucmdzLT5ub2lzZUxldmVsOyAgICAgICAgICAgICAgICAgLyohPCBOb2lzZSBsZXZlbHMgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqcFNpbmVMZXZlbCA9IG5yZ3MtPm5yZ1NpbmU7IC8qITwgU2luZSBsZXZlbHMgKi8KIAotICBpbnQgICAgazsKLSAgaW50ICAgIGluZGV4ID0gKnB0clBoYXNlSW5kZXg7Ci0gIFVDSEFSICBoYXJtSW5kZXggPSAqcHRySGFybUluZGV4OwotICBVQ0hBUiAgZnJlcUludkZsYWcgPSAobG93U3ViYmFuZCAmIDEpOwotICBGSVhQX0RCTCAgc2lnbmFsUmVhbCwgc2luZUxldmVsLCBzaW5lTGV2ZWxOZXh0LCBzaW5lTGV2ZWxQcmV2OwotICBpbnQgICAgdG9uZV9jb3VudCA9IDA7Ci0gIGludCAgICBzaW5lU2lnbiA9IDE7CisgIGludCBrOworICBpbnQgaW5kZXggPSAqcHRyUGhhc2VJbmRleDsKKyAgVUNIQVIgaGFybUluZGV4ID0gKnB0ckhhcm1JbmRleDsKKyAgVUNIQVIgZnJlcUludkZsYWcgPSAobG93U3ViYmFuZCAmIDEpOworICBGSVhQX0RCTCBzaWduYWxSZWFsLCBzaW5lTGV2ZWwsIHNpbmVMZXZlbE5leHQsIHNpbmVMZXZlbFByZXY7CisgIGludCB0b25lX2NvdW50ID0gMDsKKyAgaW50IHNpbmVTaWduID0gMTsKIAotICAjZGVmaW5lIEMxICAgKChGSVhQX1NHTClGTDJGWENPTlNUX1NHTCgyLmYqMC4wMDgxNWYpKQotICAjZGVmaW5lIEMxX0NMREZCICgoRklYUF9TR0wpRkwyRlhDT05TVF9TR0woMi5mKjAuMTY3NzNmKSkKKyNkZWZpbmUgQzEgKChGSVhQX1NHTClGTDJGWENPTlNUX1NHTCgyLmYgKiAwLjAwODE1ZikpCisjZGVmaW5lIEMxX0NMREZCICgoRklYUF9TR0wpRkwyRlhDT05TVF9TR0woMi5mICogMC4xNjc3M2YpKQogCiAgIC8qCiAgICAgRmlyc3QgcGFzcyBmb3Igaz0wIHB1bGxlZCBvdXQgb2YgdGhlIGxvb3A6CkBAIC0xODcwLDM4ICsyNTE0LDQwIEBACiAgICAgb2YgdGhlIHNpZ25hbCBhbmQgc2hvdWxkIGJlIGNhcnJpZWQgb3V0IHdpdGggZnVsbCBhY2N1cmFjeQogICAgIChzdXBwbHlpbmcgI0ZSQUNUX0JJVFMgdmFsaWQgYml0cykuCiAgICovCi0gIHNpZ25hbFJlYWwgICAgPSBmTXVsdERpdjIoKnB0clJlYWwsKnBHYWluKyspIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7Ci0gIHNpbmVMZXZlbCAgICAgPSAqcFNpbmVMZXZlbCsrOworICBzaWduYWxSZWFsID0gZk11bHREaXYyKCpwdHJSZWFsLCAqcEdhaW4rKykgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKKyAgc2luZUxldmVsID0gKnBTaW5lTGV2ZWwrKzsKICAgc2luZUxldmVsTmV4dCA9IChub1N1YmJhbmRzID4gMSkgPyBwU2luZUxldmVsWzBdIDogRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgaWYgKHNpbmVMZXZlbCE9RkwyRlhDT05TVF9EQkwoMC4wZikpIHRvbmVfY291bnQrKzsKKyAgaWYgKHNpbmVMZXZlbCAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICB0b25lX2NvdW50Kys7CiAgIGVsc2UgaWYgKCFub05vaXNlRmxhZykKLSAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KLSAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CisgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KKyAgICBzaWduYWxSZWFsICs9CisgICAgICAgIChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgcE5vaXNlTGV2ZWxbMF0pCisgICAgICAgICA8PCA0KTsKIAogICB7Ci0gICAgaWYgKCEoaGFybUluZGV4JjB4MSkpIHsKKyAgICBpZiAoIShoYXJtSW5kZXggJiAweDEpKSB7CiAgICAgICAvKiBoYXJtSW5kZXggMCwyICovCi0gICAgICBzaWduYWxSZWFsICs9IChoYXJtSW5kZXgmMHgyKSA/IC1zaW5lTGV2ZWwgOiBzaW5lTGV2ZWw7CisgICAgICBzaWduYWxSZWFsICs9IChoYXJtSW5kZXggJiAweDIpID8gLXNpbmVMZXZlbCA6IHNpbmVMZXZlbDsKICAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgLyogaGFybUluZGV4IDEsMyBpbiBjb21iaW5hdGlvbiB3aXRoIGZyZXFJbnZGbGFnICovCi0gICAgICBpbnQgc2hpZnQgPSAoaW50KSAoc2NhbGVfY2hhbmdlKzEpOwotICAgICAgc2hpZnQgPSAoc2hpZnQ+PTApID8gZml4TWluKERGUkFDVF9CSVRTLTEsc2hpZnQpIDogZml4TWF4KC0oREZSQUNUX0JJVFMtMSksc2hpZnQpOworICAgICAgaW50IHNoaWZ0ID0gKGludCkoc2NhbGVfY2hhbmdlICsgMSk7CisgICAgICBzaGlmdCA9IChzaGlmdCA+PSAwKSA/IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIHNoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaXhNYXgoLShERlJBQ1RfQklUUyAtIDEpLCBzaGlmdCk7CiAKLSAgICAgIEZJWFBfREJMIHRtcDEgPSAoc2hpZnQ+PTApID8gKCBmTXVsdERpdjIoQzEsIHNpbmVMZXZlbCkgPj4gc2hpZnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIGZNdWx0RGl2MihDMSwgc2luZUxldmVsKSA8PCAoLXNoaWZ0KSApOworICAgICAgRklYUF9EQkwgdG1wMSA9IChzaGlmdCA+PSAwKSA/IChmTXVsdERpdjIoQzEsIHNpbmVMZXZlbCkgPj4gc2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGZNdWx0RGl2MihDMSwgc2luZUxldmVsKSA8PCAoLXNoaWZ0KSk7CiAgICAgICBGSVhQX0RCTCB0bXAyID0gZk11bHREaXYyKEMxLCBzaW5lTGV2ZWxOZXh0KTsKIAotCiAgICAgICAvKiBzYXZlIHN3aXRjaCBhbmQgY29tcGFyZSBvcGVyYXRpb25zIGFuZCByZWR1Y2UgdG8gWE9SIHN0YXRlbWVudCAqLwotICAgICAgaWYgKCAoKGhhcm1JbmRleD4+MSkmMHgxKV5mcmVxSW52RmxhZykgewotICAgICAgICAgICoocHRyUmVhbC0xKSArPSB0bXAxOwotICAgICAgICAgIHNpZ25hbFJlYWwgICAtPSB0bXAyOworICAgICAgaWYgKCgoaGFybUluZGV4ID4+IDEpICYgMHgxKSBeIGZyZXFJbnZGbGFnKSB7CisgICAgICAgICoocHRyUmVhbCAtIDEpICs9IHRtcDE7CisgICAgICAgIHNpZ25hbFJlYWwgLT0gdG1wMjsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgKihwdHJSZWFsLTEpIC09IHRtcDE7Ci0gICAgICAgICAgc2lnbmFsUmVhbCAgICs9IHRtcDI7CisgICAgICAgICoocHRyUmVhbCAtIDEpIC09IHRtcDE7CisgICAgICAgIHNpZ25hbFJlYWwgKz0gdG1wMjsKICAgICAgIH0KICAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOwogICAgICAgZnJlcUludkZsYWcgPSAhZnJlcUludkZsYWc7CkBAIC0xOTEwLDQ1ICsyNTU2LDUxIEBACiAKICAgcE5vaXNlTGV2ZWwrKzsKIAotICBpZiAoIG5vU3ViYmFuZHMgPiAyICkgewotICAgIGlmICghKGhhcm1JbmRleCYweDEpKSB7CisgIGlmIChub1N1YmJhbmRzID4gMikgeworICAgIGlmICghKGhhcm1JbmRleCAmIDB4MSkpIHsKICAgICAgIC8qIGhhcm1JbmRleCAwLDIgKi8KLSAgICAgIGlmKCFoYXJtSW5kZXgpIAotICAgICAgeworICAgICAgaWYgKCFoYXJtSW5kZXgpIHsKICAgICAgICAgc2luZVNpZ24gPSAwOwogICAgICAgfQogCi0gICAgICBmb3IgKGs9bm9TdWJiYW5kcy0yOyBrIT0wOyBrLS0pIHsKKyAgICAgIGZvciAoayA9IG5vU3ViYmFuZHMgLSAyOyBrICE9IDA7IGstLSkgewogICAgICAgICBGSVhQX0RCTCBzaW5lbGV2ZWwgPSAqcFNpbmVMZXZlbCsrOwogICAgICAgICBpbmRleCsrOwotICAgICAgICBpZiAoKChzaWduYWxSZWFsID0gKHNpbmVTaWduID8gLXNpbmVsZXZlbCA6IHNpbmVsZXZlbCkpID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAgJiYgIW5vTm9pc2VGbGFnKSAKLSAgICAgICAgeworICAgICAgICBpZiAoKChzaWduYWxSZWFsID0gKHNpbmVTaWduID8gLXNpbmVsZXZlbCA6IHNpbmVsZXZlbCkpID09CisgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wZikpICYmCisgICAgICAgICAgICAhbm9Ob2lzZUZsYWcpIHsKICAgICAgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLwogICAgICAgICAgIGluZGV4ICY9IChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwotICAgICAgICAgIHNpZ25hbFJlYWwgKz0gKGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzBdLCBwTm9pc2VMZXZlbFswXSk8PDQpOworICAgICAgICAgIHNpZ25hbFJlYWwgKz0gKGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9pc2VMZXZlbFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCA0KTsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogVGhlIG5leHQgbXVsdGlwbGljYXRpb24gY29uc3RpdHV0ZXMgdGhlIGFjdHVhbCBlbnZlbG9wZSBhZGp1c3RtZW50IG9mIHRoZSBzaWduYWwuICovCi0gICAgICAgIHNpZ25hbFJlYWwgKz0gZk11bHREaXYyKCpwdHJSZWFsLCpwR2FpbisrKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOworCisgICAgICAgIC8qIFRoZSBuZXh0IG11bHRpcGxpY2F0aW9uIGNvbnN0aXR1dGVzIHRoZSBhY3R1YWwgZW52ZWxvcGUgYWRqdXN0bWVudCBvZgorICAgICAgICAgKiB0aGUgc2lnbmFsLiAqLworICAgICAgICBzaWduYWxSZWFsICs9IGZNdWx0RGl2MigqcHRyUmVhbCwgKnBHYWluKyspIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CiAKICAgICAgICAgcE5vaXNlTGV2ZWwrKzsKICAgICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICAgICB9IC8qIGZvciAuLi4gKi8KLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIC8qIGhhcm1JbmRleCAxLDMgaW4gY29tYmluYXRpb24gd2l0aCBmcmVxSW52RmxhZyAqLwotICAgICAgaWYgKGhhcm1JbmRleD09MSkgZnJlcUludkZsYWcgPSAhZnJlcUludkZsYWc7CisgICAgICBpZiAoaGFybUluZGV4ID09IDEpIGZyZXFJbnZGbGFnID0gIWZyZXFJbnZGbGFnOwogCi0gICAgICBmb3IgKGs9bm9TdWJiYW5kcy0yOyBrIT0wOyBrLS0pIHsKKyAgICAgIGZvciAoayA9IG5vU3ViYmFuZHMgLSAyOyBrICE9IDA7IGstLSkgewogICAgICAgICBpbmRleCsrOwotICAgICAgICAvKiBUaGUgbmV4dCBtdWx0aXBsaWNhdGlvbiBjb25zdGl0dXRlcyB0aGUgYWN0dWFsIGVudmVsb3BlIGFkanVzdG1lbnQgb2YgdGhlIHNpZ25hbC4gKi8KLSAgICAgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwqcEdhaW4rKykgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKKyAgICAgICAgLyogVGhlIG5leHQgbXVsdGlwbGljYXRpb24gY29uc3RpdHV0ZXMgdGhlIGFjdHVhbCBlbnZlbG9wZSBhZGp1c3RtZW50IG9mCisgICAgICAgICAqIHRoZSBzaWduYWwuICovCisgICAgICAgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsICpwR2FpbisrKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOwogCi0gICAgICAgIGlmICgqcFNpbmVMZXZlbCsrIT1GTDJGWENPTlNUX0RCTCgwLjBmKSkgdG9uZV9jb3VudCsrOworICAgICAgICBpZiAoKnBTaW5lTGV2ZWwrKyAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICAgICAgICB0b25lX2NvdW50Kys7CiAgICAgICAgIGVsc2UgaWYgKCFub05vaXNlRmxhZykgewogICAgICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCiAgICAgICAgICAgaW5kZXggJj0gKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7Ci0gICAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CisgICAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2lzZUxldmVsWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDQpOwogICAgICAgICB9CiAKICAgICAgICAgcE5vaXNlTGV2ZWwrKzsKQEAgLTE5NjYsNzYgKzI2MTgsMjQ3IEBACiAKICAgaWYgKG5vU3ViYmFuZHMgPiAtMSkgewogICAgIGluZGV4Kys7Ci0gICAgLyogVGhlIG5leHQgbXVsdGlwbGljYXRpb24gY29uc3RpdHV0ZXMgdGhlIGFjdHVhbCBlbnZlbG9wZSBhZGp1c3RtZW50IG9mIHRoZSBzaWduYWwuICovCi0gICAgc2lnbmFsUmVhbCAgICA9IGZNdWx0RGl2MigqcHRyUmVhbCwqcEdhaW4pIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7Ci0gICAgc2luZUxldmVsUHJldiA9IGZNdWx0RGl2MihwU2luZUxldmVsWy0xXSxGTDJGWF9TR0woMC4wMTYzZikpOwotICAgIHNpbmVMZXZlbCAgICAgPSBwU2luZUxldmVsWzBdOworICAgIC8qIFRoZSBuZXh0IG11bHRpcGxpY2F0aW9uIGNvbnN0aXR1dGVzIHRoZSBhY3R1YWwgZW52ZWxvcGUgYWRqdXN0bWVudCBvZiB0aGUKKyAgICAgKiBzaWduYWwuICovCisgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwgKnBHYWluKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOworICAgIHNpbmVMZXZlbFByZXYgPSBmTXVsdERpdjIocFNpbmVMZXZlbFstMV0sIEZMMkZYX1NHTCgwLjAxNjNmKSk7CisgICAgc2luZUxldmVsID0gcFNpbmVMZXZlbFswXTsKIAotICAgIGlmIChwU2luZUxldmVsWzBdIT1GTDJGWENPTlNUX0RCTCgwLjBmKSkgdG9uZV9jb3VudCsrOworICAgIGlmIChwU2luZUxldmVsWzBdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgdG9uZV9jb3VudCsrOwogICAgIGVsc2UgaWYgKCFub05vaXNlRmxhZykgewotICAgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLwotICAgICAgICBpbmRleCAmPSAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKLSAgICAgICAgc2lnbmFsUmVhbCA9IHNpZ25hbFJlYWwgKyAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CisgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLworICAgICAgaW5kZXggJj0gKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7CisgICAgICBzaWduYWxSZWFsID0KKyAgICAgICAgICBzaWduYWxSZWFsICsKKyAgICAgICAgICAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKQorICAgICAgICAgICA8PCA0KTsKICAgICB9CiAKLSAgICBpZiAoIShoYXJtSW5kZXgmMHgxKSkgeworICAgIGlmICghKGhhcm1JbmRleCAmIDB4MSkpIHsKICAgICAgIC8qIGhhcm1JbmRleCAwLDIgKi8KLSAgICAgICpwdHJSZWFsID0gc2lnbmFsUmVhbCArICggKHNpbmVTaWduKSA/IC1zaW5lTGV2ZWwgOiBzaW5lTGV2ZWwpOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICAgICpwdHJSZWFsID0gc2lnbmFsUmVhbCArICgoc2luZVNpZ24pID8gLXNpbmVMZXZlbCA6IHNpbmVMZXZlbCk7CisgICAgfSBlbHNlIHsKICAgICAgIC8qIGhhcm1JbmRleCAxLDMgaW4gY29tYmluYXRpb24gd2l0aCBmcmVxSW52RmxhZyAqLwotICAgICAgaWYodG9uZV9jb3VudCA8PSAxNil7CisgICAgICBpZiAodG9uZV9jb3VudCA8PSAxNikgewogICAgICAgICBpZiAoZnJlcUludkZsYWcpIHsKLSAgICAgICAgICAqcHRyUmVhbCsrICAgPSBzaWduYWxSZWFsIC0gc2luZUxldmVsUHJldjsKKyAgICAgICAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbCAtIHNpbmVMZXZlbFByZXY7CiAgICAgICAgICAgaWYgKG5vU3ViYmFuZHMgKyBsb3dTdWJiYW5kIDwgNjMpCiAgICAgICAgICAgICAqcHRyUmVhbCA9ICpwdHJSZWFsICsgZk11bHREaXYyKEMxLCBzaW5lTGV2ZWwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsICsgc2luZUxldmVsUHJldjsKICAgICAgICAgICBpZiAobm9TdWJiYW5kcyArIGxvd1N1YmJhbmQgPCA2MykKICAgICAgICAgICAgICpwdHJSZWFsID0gKnB0clJlYWwgLSBmTXVsdERpdjIoQzEsIHNpbmVMZXZlbCk7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgKnB0clJlYWwgPSBzaWduYWxSZWFsOworICAgICAgfSBlbHNlCisgICAgICAgICpwdHJSZWFsID0gc2lnbmFsUmVhbDsKICAgICB9CiAgIH0KICAgKnB0ckhhcm1JbmRleCA9IChoYXJtSW5kZXggKyAxKSAmIDM7CiAgICpwdHJQaGFzZUluZGV4ID0gaW5kZXggJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKIH0KLXN0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90SFEoCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHB0clJlYWwsICAgICAgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLwotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwdHJJbWFnLCAgICAgIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCBpbWFnIHBhcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LAotICAgICAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGxvd1N1YmJhbmQsICAgICAgICAgICAgLyohPCBMb3dlc3QgUU1GLWNoYW5uZWwgaW4gdGhlIGN1cnJlbnRseSB1c2VkIFNCUiByYW5nZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9TdWJiYW5kcywgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc2NhbGVfY2hhbmdlLCAgICAgICAgICAvKiE8IE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IGFkanVzdGVkIHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgc21vb3RoX3JhdGlvLCAgICAgICAgICAvKiE8IEltcGFjdCBvZiBsYXN0IGVudmVsb3BlICovCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vTm9pc2VGbGFnLCAgICAgICAgICAgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGZpbHRCdWZmZXJOb2lzZVNoaWZ0KSAgLyohPCBTaGlmdCBmYWN0b3Igb2YgZmlsdEJ1ZmZlck5vaXNlICovCisKK3N0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90SFFfR2FpbkFuZE5vaXNlKAorICAgIEZJWFBfREJMICpSRVNUUklDVAorICAgICAgICBwdHJSZWFsLCAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCisgICAgRklYUF9EQkwgKlJFU1RSSUNUCisgICAgICAgIHB0ckltYWcsIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCBpbWFnIHBhcnQgKi8KKyAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LCBFTlZfQ0FMQ19OUkdTICpucmdzLAorICAgIGludCBsb3dTdWJiYW5kLCAvKiE8IExvd2VzdCBRTUYtY2hhbm5lbCBpbiB0aGUgY3VycmVudGx5IHVzZWQgU0JSIHJhbmdlLiAqLworICAgIGludCBub1N1YmJhbmRzLCAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KKyAgICBpbnQgc2NhbGVfY2hhbmdlLCAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgYWRqdXN0ZWQgc2FtcGxlcyAqLworICAgIEZJWFBfU0dMIHNtb290aF9yYXRpbywgICAgLyohPCBJbXBhY3Qgb2YgbGFzdCBlbnZlbG9wZSAqLworICAgIGludCBub05vaXNlRmxhZywgICAgICAgICAgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCisgICAgaW50IGZpbHRCdWZmZXJOb2lzZVNoaWZ0KSAvKiE8IFNoaWZ0IGZhY3RvciBvZiBmaWx0QnVmZmVyTm9pc2UgKi8KIHsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIGdhaW4gPSBucmdzLT5ucmdHYWluOyAvKiE8IEdhaW5zIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KKyAgRklYUF9EQkwgKlJFU1RSSUNUIG5vaXNlTGV2ZWwgPQorICAgICAgbnJncy0+bm9pc2VMZXZlbDsgLyohPCBOb2lzZSBsZXZlbHMgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFNpbmVMZXZlbCA9IG5yZ3MtPm5yZ1NpbmU7IC8qITwgU2luZSBsZXZlbHMgKi8KIAotICBGSVhQX0RCTCAqUkVTVFJJQ1QgZ2FpbiAgICAgICA9IG5yZ3MtPm5yZ0dhaW47ICAgICAgICAvKiE8IEdhaW5zIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KLSAgRklYUF9EQkwgKlJFU1RSSUNUIG5vaXNlTGV2ZWwgPSBucmdzLT5ub2lzZUxldmVsOyAgICAgLyohPCBOb2lzZSBsZXZlbHMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwotICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFNpbmVMZXZlbCA9IG5yZ3MtPm5yZ1NpbmU7ICAgICAgICAvKiE8IFNpbmUgbGV2ZWxzICovCisgIEZJWFBfREJMICpSRVNUUklDVCBmaWx0QnVmZmVyID0KKyAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXI7IC8qITwgR2FpbnMgb2YgbGFzdCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqUkVTVFJJQ1QgZmlsdEJ1ZmZlck5vaXNlID0KKyAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZTsgLyohPCBOb2lzZSBsZXZlbHMgb2YgbGFzdCBlbnZlbG9wZSAqLworICBpbnQgKlJFU1RSSUNUIHB0clBoYXNlSW5kZXggPQorICAgICAgJmhfc2JyX2NhbF9lbnYtPnBoYXNlSW5kZXg7IC8qITwgU3RhcnQgaW5kZXggdG8gcmFuZG9tIG51bWJlciBhcnJheSAqLwogCi0gIEZJWFBfREJMICpSRVNUUklDVCBmaWx0QnVmZmVyICAgICAgPSBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyOyAgICAgIC8qITwgR2FpbnMgb2YgbGFzdCBlbnZlbG9wZSAqLwotICBGSVhQX0RCTCAqUkVTVFJJQ1QgZmlsdEJ1ZmZlck5vaXNlID0gaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlOyAvKiE8IE5vaXNlIGxldmVscyBvZiBsYXN0IGVudmVsb3BlICovCi0gIFVDSEFSICAgICpSRVNUUklDVCBwdHJIYXJtSW5kZXggICAgPSZoX3Nicl9jYWxfZW52LT5oYXJtSW5kZXg7ICAgICAgIC8qITwgSGFybW9uaWMgaW5kZXggKi8KLSAgaW50ICAgICAgKlJFU1RSSUNUIHB0clBoYXNlSW5kZXggICA9Jmhfc2JyX2NhbF9lbnYtPnBoYXNlSW5kZXg7ICAgICAgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCi0KLSAgaW50ICAgIGs7CisgIGludCBrOwogICBGSVhQX0RCTCBzaWduYWxSZWFsLCBzaWduYWxJbWFnOwotICBGSVhQX0RCTCBub2lzZVJlYWwsICBub2lzZUltYWc7Ci0gIEZJWFBfREJMICBzbW9vdGhlZEdhaW4sIHNtb290aGVkTm9pc2U7Ci0gIEZJWFBfU0dMIGRpcmVjdF9yYXRpbyA9IC8qRkwyRlhDT05TVF9TR0woMS4wZikgKi8gKEZJWFBfU0dMKU1BWFZBTF9TR0wgLSBzbW9vdGhfcmF0aW87Ci0gIGludCAgICBpbmRleCA9ICpwdHJQaGFzZUluZGV4OwotICBVQ0hBUiAgIGhhcm1JbmRleCA9ICpwdHJIYXJtSW5kZXg7CisgIEZJWFBfREJMIG5vaXNlUmVhbCwgbm9pc2VJbWFnOworICBGSVhQX0RCTCBzbW9vdGhlZEdhaW4sIHNtb290aGVkTm9pc2U7CisgIEZJWFBfU0dMIGRpcmVjdF9yYXRpbyA9CisgICAgICAvKkZMMkZYQ09OU1RfU0dMKDEuMGYpICovIChGSVhQX1NHTClNQVhWQUxfU0dMIC0gc21vb3RoX3JhdGlvOworICBpbnQgaW5kZXggPSAqcHRyUGhhc2VJbmRleDsKKyAgaW50IHNoaWZ0OworCisgICpwdHJQaGFzZUluZGV4ID0gKGluZGV4ICsgbm9TdWJiYW5kcykgJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKworICBmaWx0QnVmZmVyTm9pc2VTaGlmdCArPQorICAgICAgMTsgLyogZHVlIHRvIGxhdGVyIHVzZSBvZiBmTXVsdERpdjIgaW5zdGVhZCBvZiBmTXVsdCAqLworICBpZiAoZmlsdEJ1ZmZlck5vaXNlU2hpZnQgPCAwKSB7CisgICAgc2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCAtZmlsdEJ1ZmZlck5vaXNlU2hpZnQpOworICB9IGVsc2UgeworICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTIC0gMSwgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpOworICB9CisKKyAgaWYgKHNtb290aF9yYXRpbyA+IEZMMkZYQ09OU1RfU0dMKDAuMGYpKSB7CisgICAgZm9yIChrID0gMDsgayA8IG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgLyoKKyAgICAgICAgU21vb3RoaW5nOiBUaGUgb2xkIGVudmVsb3BlIGhhcyBiZWVuIGJ1ZmZlcmQgYW5kIGEgY2VydGFpbiByYXRpbworICAgICAgICBvZiB0aGUgb2xkIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgaXMgdXNlZC4KKyAgICAgICovCisgICAgICBzbW9vdGhlZEdhaW4gPQorICAgICAgICAgIGZNdWx0KHNtb290aF9yYXRpbywgZmlsdEJ1ZmZlcltrXSkgKyBmTXVsdChkaXJlY3RfcmF0aW8sIGdhaW5ba10pOworCisgICAgICBpZiAoZmlsdEJ1ZmZlck5vaXNlU2hpZnQgPCAwKSB7CisgICAgICAgIHNtb290aGVkTm9pc2UgPSAoZk11bHREaXYyKHNtb290aF9yYXRpbywgZmlsdEJ1ZmZlck5vaXNlW2tdKSA+PiBzaGlmdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoZGlyZWN0X3JhdGlvLCBub2lzZUxldmVsW2tdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNtb290aGVkTm9pc2UgPSAoZk11bHREaXYyKHNtb290aF9yYXRpbywgZmlsdEJ1ZmZlck5vaXNlW2tdKSA8PCBzaGlmdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoZGlyZWN0X3JhdGlvLCBub2lzZUxldmVsW2tdKTsKKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAgVGhlIG5leHQgMiBtdWx0aXBsaWNhdGlvbnMgY29uc3RpdHV0ZSB0aGUgYWN0dWFsIGVudmVsb3BlIGFkanVzdG1lbnQKKyAgICAgICAgb2YgdGhlIHNpZ25hbCBhbmQgc2hvdWxkIGJlIGNhcnJpZWQgb3V0IHdpdGggZnVsbCBhY2N1cmFjeQorICAgICAgICAoc3VwcGx5aW5nICNERlJBQ1RfQklUUyB2YWxpZCBiaXRzKS4KKyAgICAgICovCisgICAgICBzaWduYWxSZWFsID0gZk11bHREaXYyKCpwdHJSZWFsLCBzbW9vdGhlZEdhaW4pIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CisgICAgICBzaWduYWxJbWFnID0gZk11bHREaXYyKCpwdHJJbWFnLCBzbW9vdGhlZEdhaW4pIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CisKKyAgICAgIGluZGV4Kys7CisKKyAgICAgIGlmICgocFNpbmVMZXZlbFtrXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgfHwgbm9Ob2lzZUZsYWcpIHsKKyAgICAgICAgLyogSnVzdCB0aGUgYW1wbGlmaWVkIHNpZ25hbCBpcyBzYXZlZCAqLworICAgICAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbDsKKyAgICAgICAgKnB0ckltYWcrKyA9IHNpZ25hbEltYWc7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLworICAgICAgICBpbmRleCAmPSAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKyAgICAgICAgbm9pc2VSZWFsID0KKyAgICAgICAgICAgIGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzBdLCBzbW9vdGhlZE5vaXNlKQorICAgICAgICAgICAgPDwgNDsKKyAgICAgICAgbm9pc2VJbWFnID0KKyAgICAgICAgICAgIGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzFdLCBzbW9vdGhlZE5vaXNlKQorICAgICAgICAgICAgPDwgNDsKKyAgICAgICAgKnB0clJlYWwrKyA9IChzaWduYWxSZWFsICsgbm9pc2VSZWFsKTsKKyAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnICsgbm9pc2VJbWFnKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChrID0gMDsgayA8IG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgc21vb3RoZWRHYWluID0gZ2FpbltrXTsKKyAgICAgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsIHNtb290aGVkR2FpbikgPDwgc2NhbGVfY2hhbmdlOworICAgICAgc2lnbmFsSW1hZyA9IGZNdWx0RGl2MigqcHRySW1hZywgc21vb3RoZWRHYWluKSA8PCBzY2FsZV9jaGFuZ2U7CisKKyAgICAgIGluZGV4Kys7CisKKyAgICAgIGlmICgocFNpbmVMZXZlbFtrXSA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKG5vTm9pc2VGbGFnID09IDApKSB7CisgICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCisgICAgICAgIHNtb290aGVkTm9pc2UgPSBub2lzZUxldmVsW2tdOworICAgICAgICBpbmRleCAmPSAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKyAgICAgICAgbm9pc2VSZWFsID0KKyAgICAgICAgICAgIGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzBdLCBzbW9vdGhlZE5vaXNlKTsKKyAgICAgICAgbm9pc2VJbWFnID0KKyAgICAgICAgICAgIGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzFdLCBzbW9vdGhlZE5vaXNlKTsKKworICAgICAgICAvKiBGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2UgaXMgZG93bnNjYWxlZCBieSAyXjMgKi8KKyAgICAgICAgc2lnbmFsUmVhbCArPSBub2lzZVJlYWwgPDwgNDsKKyAgICAgICAgc2lnbmFsSW1hZyArPSBub2lzZUltYWcgPDwgNDsKKyAgICAgIH0KKyAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOworICAgICAgKnB0ckltYWcrKyA9IHNpZ25hbEltYWc7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90SFFfQWRkSGFybW9uaWNzKAorICAgIEZJWFBfREJMICpSRVNUUklDVAorICAgICAgICBwdHJSZWFsLCAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCisgICAgRklYUF9EQkwgKlJFU1RSSUNUCisgICAgICAgIHB0ckltYWcsIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCBpbWFnIHBhcnQgKi8KKyAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LCBFTlZfQ0FMQ19OUkdTICpucmdzLAorICAgIGludCBsb3dTdWJiYW5kLCAgLyohPCBMb3dlc3QgUU1GLWNoYW5uZWwgaW4gdGhlIGN1cnJlbnRseSB1c2VkIFNCUiByYW5nZS4gKi8KKyAgICBpbnQgbm9TdWJiYW5kcywgIC8qITwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kcyAqLworICAgIGludCBzY2FsZV9jaGFuZ2UgLyohPCBTY2FsZSBtaXNtYXRjaCBiZXR3ZWVuIFFNRiBpbnB1dCBhbmQgc2luZUxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBvbmVudC4gKi8KKykgeworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFNpbmVMZXZlbCA9IG5yZ3MtPm5yZ1NpbmU7IC8qITwgU2luZSBsZXZlbHMgKi8KKyAgVUNIQVIgKlJFU1RSSUNUIHB0ckhhcm1JbmRleCA9CisgICAgICAmaF9zYnJfY2FsX2Vudi0+aGFybUluZGV4OyAvKiE8IEhhcm1vbmljIGluZGV4ICovCisKKyAgaW50IGs7CisgIEZJWFBfREJMIHNpZ25hbFJlYWwsIHNpZ25hbEltYWc7CisgIFVDSEFSIGhhcm1JbmRleCA9ICpwdHJIYXJtSW5kZXg7CisgIGludCBmcmVxSW52RmxhZyA9IChsb3dTdWJiYW5kICYgMSk7CisgIEZJWFBfREJMIHNpbmVMZXZlbDsKKworICAqcHRySGFybUluZGV4ID0gKGhhcm1JbmRleCArIDEpICYgMzsKKworICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CisgICAgc2luZUxldmVsID0gcFNpbmVMZXZlbFtrXTsKKyAgICBmcmVxSW52RmxhZyBePSAxOworICAgIGlmIChzaW5lTGV2ZWwgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgc2lnbmFsUmVhbCA9IHB0clJlYWxba107CisgICAgICBzaWduYWxJbWFnID0gcHRySW1hZ1trXTsKKyAgICAgIHNpbmVMZXZlbCA9IHNjYWxlVmFsdWUoc2luZUxldmVsLCBzY2FsZV9jaGFuZ2UpOworICAgICAgaWYgKGhhcm1JbmRleCAmIDIpIHsKKyAgICAgICAgLyogY2FzZSAyLDMgKi8KKyAgICAgICAgc2luZUxldmVsID0gLXNpbmVMZXZlbDsKKyAgICAgIH0KKyAgICAgIGlmICghKGhhcm1JbmRleCAmIDEpKSB7CisgICAgICAgIC8qIGNhc2UgMCwyOiAqLworICAgICAgICBwdHJSZWFsW2tdID0gc2lnbmFsUmVhbCArIHNpbmVMZXZlbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGNhc2UgMSwzICovCisgICAgICAgIGlmICghZnJlcUludkZsYWcpIHNpbmVMZXZlbCA9IC1zaW5lTGV2ZWw7CisgICAgICAgIHB0ckltYWdba10gPSBzaWduYWxJbWFnICsgc2luZUxldmVsOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdEhRKAorICAgIEZJWFBfREJMICpSRVNUUklDVAorICAgICAgICBwdHJSZWFsLCAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCisgICAgRklYUF9EQkwgKlJFU1RSSUNUCisgICAgICAgIHB0ckltYWcsIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCBpbWFnIHBhcnQgKi8KKyAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LCBFTlZfQ0FMQ19OUkdTICpucmdzLAorICAgIGludCBsb3dTdWJiYW5kLCAvKiE8IExvd2VzdCBRTUYtY2hhbm5lbCBpbiB0aGUgY3VycmVudGx5IHVzZWQgU0JSIHJhbmdlLiAqLworICAgIGludCBub1N1YmJhbmRzLCAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KKyAgICBpbnQgc2NhbGVfY2hhbmdlLCAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgYWRqdXN0ZWQgc2FtcGxlcyAqLworICAgIEZJWFBfU0dMIHNtb290aF9yYXRpbywgICAgLyohPCBJbXBhY3Qgb2YgbGFzdCBlbnZlbG9wZSAqLworICAgIGludCBub05vaXNlRmxhZywgICAgICAgICAgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCisgICAgaW50IGZpbHRCdWZmZXJOb2lzZVNoaWZ0KSAvKiE8IFNoaWZ0IGZhY3RvciBvZiBmaWx0QnVmZmVyTm9pc2UgKi8KK3sKKyAgRklYUF9EQkwgKlJFU1RSSUNUIGdhaW4gPSBucmdzLT5ucmdHYWluOyAvKiE8IEdhaW5zIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KKyAgRklYUF9EQkwgKlJFU1RSSUNUIG5vaXNlTGV2ZWwgPQorICAgICAgbnJncy0+bm9pc2VMZXZlbDsgLyohPCBOb2lzZSBsZXZlbHMgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFNpbmVMZXZlbCA9IG5yZ3MtPm5yZ1NpbmU7IC8qITwgU2luZSBsZXZlbHMgKi8KKworICBGSVhQX0RCTCAqUkVTVFJJQ1QgZmlsdEJ1ZmZlciA9CisgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyOyAvKiE8IEdhaW5zIG9mIGxhc3QgZW52ZWxvcGUgKi8KKyAgRklYUF9EQkwgKlJFU1RSSUNUIGZpbHRCdWZmZXJOb2lzZSA9CisgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2U7IC8qITwgTm9pc2UgbGV2ZWxzIG9mIGxhc3QgZW52ZWxvcGUgKi8KKyAgVUNIQVIgKlJFU1RSSUNUIHB0ckhhcm1JbmRleCA9CisgICAgICAmaF9zYnJfY2FsX2Vudi0+aGFybUluZGV4OyAvKiE8IEhhcm1vbmljIGluZGV4ICovCisgIGludCAqUkVTVFJJQ1QgcHRyUGhhc2VJbmRleCA9CisgICAgICAmaF9zYnJfY2FsX2Vudi0+cGhhc2VJbmRleDsgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCisKKyAgaW50IGs7CisgIEZJWFBfREJMIHNpZ25hbFJlYWwsIHNpZ25hbEltYWc7CisgIEZJWFBfREJMIG5vaXNlUmVhbCwgbm9pc2VJbWFnOworICBGSVhQX0RCTCBzbW9vdGhlZEdhaW4sIHNtb290aGVkTm9pc2U7CisgIEZJWFBfU0dMIGRpcmVjdF9yYXRpbyA9CisgICAgICAvKkZMMkZYQ09OU1RfU0dMKDEuMGYpICovIChGSVhQX1NHTClNQVhWQUxfU0dMIC0gc21vb3RoX3JhdGlvOworICBpbnQgaW5kZXggPSAqcHRyUGhhc2VJbmRleDsKKyAgVUNIQVIgaGFybUluZGV4ID0gKnB0ckhhcm1JbmRleDsKICAgaW50IGZyZXFJbnZGbGFnID0gKGxvd1N1YmJhbmQgJiAxKTsKICAgRklYUF9EQkwgc2luZUxldmVsOwogICBpbnQgc2hpZnQ7CiAKLSAgKnB0clBoYXNlSW5kZXggPSAoaW5kZXgrbm9TdWJiYW5kcykgJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKyAgKnB0clBoYXNlSW5kZXggPSAoaW5kZXggKyBub1N1YmJhbmRzKSAmIChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwogICAqcHRySGFybUluZGV4ID0gKGhhcm1JbmRleCArIDEpICYgMzsKIAogICAvKgpAQCAtMjA0NywzMCArMjg3MCwyOSBAQAogICAgIG9mIHRoZSB3aG9sZSBmdW5jdGlvbiBkZWNyZWFzZWQgYnkgYWJvdXQgMjAgJQogICAqLwogCi0gIGZpbHRCdWZmZXJOb2lzZVNoaWZ0ICs9IDE7ICAgICAgLyogZHVlIHRvIGxhdGVyIHVzZSBvZiBmTXVsdERpdjIgaW5zdGVhZCBvZiBmTXVsdCAqLwotICBpZiAoZmlsdEJ1ZmZlck5vaXNlU2hpZnQ8MCkKLSAgICBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUy0xLC1maWx0QnVmZmVyTm9pc2VTaGlmdCk7CisgIGZpbHRCdWZmZXJOb2lzZVNoaWZ0ICs9CisgICAgICAxOyAvKiBkdWUgdG8gbGF0ZXIgdXNlIG9mIGZNdWx0RGl2MiBpbnN0ZWFkIG9mIGZNdWx0ICovCisgIGlmIChmaWx0QnVmZmVyTm9pc2VTaGlmdCA8IDApCisgICAgc2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCAtZmlsdEJ1ZmZlck5vaXNlU2hpZnQpOwogICBlbHNlCi0gICAgc2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpOworICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTIC0gMSwgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpOwogCiAgIGlmIChzbW9vdGhfcmF0aW8gPiBGTDJGWENPTlNUX1NHTCgwLjBmKSkgewotCi0gICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKSB7CisgICAgZm9yIChrID0gMDsgayA8IG5vU3ViYmFuZHM7IGsrKykgewogICAgICAgLyoKICAgICAgICAgU21vb3RoaW5nOiBUaGUgb2xkIGVudmVsb3BlIGhhcyBiZWVuIGJ1ZmZlcmQgYW5kIGEgY2VydGFpbiByYXRpbwogICAgICAgICBvZiB0aGUgb2xkIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgaXMgdXNlZC4KICAgICAgICovCiAKLSAgICAgIHNtb290aGVkR2FpbiA9IGZNdWx0KHNtb290aF9yYXRpbyxmaWx0QnVmZmVyW2tdKSArCi0gICAgICAgICAgICAgICAgICAgICBmTXVsdChkaXJlY3RfcmF0aW8sZ2FpbltrXSk7CisgICAgICBzbW9vdGhlZEdhaW4gPQorICAgICAgICAgIGZNdWx0KHNtb290aF9yYXRpbywgZmlsdEJ1ZmZlcltrXSkgKyBmTXVsdChkaXJlY3RfcmF0aW8sIGdhaW5ba10pOwogCi0gICAgICBpZiAoZmlsdEJ1ZmZlck5vaXNlU2hpZnQ8MCkgewotICAgICAgICBzbW9vdGhlZE5vaXNlID0gKGZNdWx0RGl2MihzbW9vdGhfcmF0aW8sZmlsdEJ1ZmZlck5vaXNlW2tdKT4+c2hpZnQpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChkaXJlY3RfcmF0aW8sbm9pc2VMZXZlbFtrXSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgc21vb3RoZWROb2lzZSA9IChmTXVsdERpdjIoc21vb3RoX3JhdGlvLGZpbHRCdWZmZXJOb2lzZVtrXSk8PHNoaWZ0KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoZGlyZWN0X3JhdGlvLG5vaXNlTGV2ZWxba10pOworICAgICAgaWYgKGZpbHRCdWZmZXJOb2lzZVNoaWZ0IDwgMCkgeworICAgICAgICBzbW9vdGhlZE5vaXNlID0gKGZNdWx0RGl2MihzbW9vdGhfcmF0aW8sIGZpbHRCdWZmZXJOb2lzZVtrXSkgPj4gc2hpZnQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGRpcmVjdF9yYXRpbywgbm9pc2VMZXZlbFtrXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzbW9vdGhlZE5vaXNlID0gKGZNdWx0RGl2MihzbW9vdGhfcmF0aW8sIGZpbHRCdWZmZXJOb2lzZVtrXSkgPDwgc2hpZnQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGRpcmVjdF9yYXRpbywgbm9pc2VMZXZlbFtrXSk7CiAgICAgICB9CiAKICAgICAgIC8qCkBAIC0yMDc4LDUwICsyOTAwLDUzIEBACiAgICAgICAgIG9mIHRoZSBzaWduYWwgYW5kIHNob3VsZCBiZSBjYXJyaWVkIG91dCB3aXRoIGZ1bGwgYWNjdXJhY3kKICAgICAgICAgKHN1cHBseWluZyAjREZSQUNUX0JJVFMgdmFsaWQgYml0cykuCiAgICAgICAqLwotICAgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCxzbW9vdGhlZEdhaW4pPDwoKGludClzY2FsZV9jaGFuZ2UpOwotICAgICAgc2lnbmFsSW1hZyA9IGZNdWx0RGl2MigqcHRySW1hZyxzbW9vdGhlZEdhaW4pPDwoKGludClzY2FsZV9jaGFuZ2UpOworICAgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwgc21vb3RoZWRHYWluKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOworICAgICAgc2lnbmFsSW1hZyA9IGZNdWx0RGl2MigqcHRySW1hZywgc21vb3RoZWRHYWluKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOwogCiAgICAgICBpbmRleCsrOwogCiAgICAgICBpZiAocFNpbmVMZXZlbFtrXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewogICAgICAgICBzaW5lTGV2ZWwgPSBwU2luZUxldmVsW2tdOwogCi0gICAgICAgIHN3aXRjaChoYXJtSW5kZXgpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCArIHNpbmVMZXZlbCk7Ci0gICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCAtIHNpbmVMZXZlbCk7Ci0gICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCk7Ci0gICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQotICAgICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnIC0gc2luZUxldmVsKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgKyBzaW5lTGV2ZWwpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7Ci0gICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQotICAgICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnICsgc2luZUxldmVsKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgLSBzaW5lTGV2ZWwpOwotICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKGhhcm1JbmRleCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCArIHNpbmVMZXZlbCk7CisgICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgKnB0clJlYWwrKyA9IChzaWduYWxSZWFsIC0gc2luZUxldmVsKTsKKyAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAqcHRyUmVhbCsrID0gKHNpZ25hbFJlYWwpOworICAgICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQorICAgICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgLSBzaW5lTGV2ZWwpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgKyBzaW5lTGV2ZWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CisgICAgICAgICAgICBpZiAoZnJlcUludkZsYWcpCisgICAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyArIHNpbmVMZXZlbCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyAtIHNpbmVMZXZlbCk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICB9IGVsc2UgewogICAgICAgICBpZiAobm9Ob2lzZUZsYWcpIHsKICAgICAgICAgICAvKiBKdXN0IHRoZSBhbXBsaWZpZWQgc2lnbmFsIGlzIHNhdmVkICovCiAgICAgICAgICAgKnB0clJlYWwrKyA9IChzaWduYWxSZWFsKTsKICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCiAgICAgICAgICAgaW5kZXggJj0gKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7Ci0gICAgICAgICAgbm9pc2VSZWFsID0gZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHNtb290aGVkTm9pc2UpPDw0OwotICAgICAgICAgIG5vaXNlSW1hZyA9IGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzFdLCBzbW9vdGhlZE5vaXNlKTw8NDsKKyAgICAgICAgICAvKiBGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2UgaXMgZG93bnNjYWxlZCBieSAyXjMgKi8KKyAgICAgICAgICBub2lzZVJlYWwgPQorICAgICAgICAgICAgICBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgc21vb3RoZWROb2lzZSkKKyAgICAgICAgICAgICAgPDwgNDsKKyAgICAgICAgICBub2lzZUltYWcgPQorICAgICAgICAgICAgICBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVsxXSwgc21vb3RoZWROb2lzZSkKKyAgICAgICAgICAgICAgPDwgNDsKICAgICAgICAgICAqcHRyUmVhbCsrID0gKHNpZ25hbFJlYWwgKyBub2lzZVJlYWwpOwogICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyArIG5vaXNlSW1hZyk7CiAgICAgICAgIH0KQEAgLTIxMjksNTIgKzI5NTQsNDggQEAKICAgICAgIGZyZXFJbnZGbGFnIF49IDE7CiAgICAgfQogCi0gIH0KLSAgZWxzZSAKLSAgewotICAgIGZvciAoaz0wOyBrPG5vU3ViYmFuZHM7IGsrKykgCi0gICAgewotICAgICAgc21vb3RoZWRHYWluICA9IGdhaW5ba107CisgIH0gZWxzZSB7CisgICAgZm9yIChrID0gMDsgayA8IG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgc21vb3RoZWRHYWluID0gZ2FpbltrXTsKICAgICAgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsIHNtb290aGVkR2FpbikgPDwgc2NhbGVfY2hhbmdlOwogICAgICAgc2lnbmFsSW1hZyA9IGZNdWx0RGl2MigqcHRySW1hZywgc21vb3RoZWRHYWluKSA8PCBzY2FsZV9jaGFuZ2U7CiAKICAgICAgIGluZGV4Kys7CiAKLSAgICAgIGlmICgoc2luZUxldmVsID0gcFNpbmVMZXZlbFtrXSkgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIAotICAgICAgewotICAgICAgICBzd2l0Y2ggKGhhcm1JbmRleCkgCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgIHNpZ25hbFJlYWwgKz0gc2luZUxldmVsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQotICAgICAgICAgICAgc2lnbmFsSW1hZyAtPSBzaW5lTGV2ZWw7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2lnbmFsSW1hZyArPSBzaW5lTGV2ZWw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICBzaWduYWxSZWFsIC09IHNpbmVMZXZlbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgIGlmIChmcmVxSW52RmxhZykKLSAgICAgICAgICAgIHNpZ25hbEltYWcgKz0gc2luZUxldmVsOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNpZ25hbEltYWcgLT0gc2luZUxldmVsOwotICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKChzaW5lTGV2ZWwgPSBwU2luZUxldmVsW2tdKSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICBzd2l0Y2ggKGhhcm1JbmRleCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHNpZ25hbFJlYWwgKz0gc2luZUxldmVsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQorICAgICAgICAgICAgICBzaWduYWxJbWFnIC09IHNpbmVMZXZlbDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgc2lnbmFsSW1hZyArPSBzaW5lTGV2ZWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBzaWduYWxSZWFsIC09IHNpbmVMZXZlbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGlmIChmcmVxSW52RmxhZykKKyAgICAgICAgICAgICAgc2lnbmFsSW1hZyArPSBzaW5lTGV2ZWw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHNpZ25hbEltYWcgLT0gc2luZUxldmVsOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgCi0gICAgICB7Ci0gICAgICAgIGlmIChub05vaXNlRmxhZyA9PSAwKQotICAgICAgICB7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobm9Ob2lzZUZsYWcgPT0gMCkgewogICAgICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCiAgICAgICAgICAgc21vb3RoZWROb2lzZSA9IG5vaXNlTGV2ZWxba107CiAgICAgICAgICAgaW5kZXggJj0gKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7Ci0gICAgICAgICAgbm9pc2VSZWFsID0gZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHNtb290aGVkTm9pc2UpOwotICAgICAgICAgIG5vaXNlSW1hZyA9IGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzFdLCBzbW9vdGhlZE5vaXNlKTsKLSAgICAgICAgICBzaWduYWxSZWFsICs9IG5vaXNlUmVhbDw8NDsKLSAgICAgICAgICBzaWduYWxJbWFnICs9IG5vaXNlSW1hZzw8NDsKKyAgICAgICAgICBub2lzZVJlYWwgPSBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoZWROb2lzZSk7CisgICAgICAgICAgbm9pc2VJbWFnID0gZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtb290aGVkTm9pc2UpOworCisgICAgICAgICAgLyogRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlIGlzIGRvd25zY2FsZWQgYnkgMl4zICovCisgICAgICAgICAgc2lnbmFsUmVhbCArPSBub2lzZVJlYWwgPDwgNDsKKyAgICAgICAgICBzaWduYWxJbWFnICs9IG5vaXNlSW1hZyA8PCA0OwogICAgICAgICB9CiAgICAgICB9CiAgICAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbDsKQEAgLTIxODUsNyArMzAwNiw2IEBACiAgIH0KIH0KIAotCiAvKiEKICAgXGJyaWVmICAgUmVzZXQgbGltaXRlciBiYW5kcy4KIApAQCAtMjE5NSwxNCArMzAxNSwxNSBAQAogICBccmV0dXJuICBTQlJERUNfT0sgaWYgb2ssICBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHIG9uIGVycm9yCiAqLwogU0JSX0VSUk9SCi1SZXNldExpbWl0ZXJCYW5kcyAoIFVDSEFSICpsaW1pdGVyQmFuZFRhYmxlLCAgIC8qITwgUmVzdWx0aW5nIGJhbmQgYm9yZGVycyBpbiBRTUYgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vTGltaXRlckJhbmRzLCAgICAgLyohPCBSZXN1bHRpbmcgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZCAqLwotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAvKiE8IFRhYmxlIHdpdGggcG9zc2libGUgYmFuZCBib3JkZXJzICovCi0gICAgICAgICAgICAgICAgICAgIGludCBub0ZyZXFCYW5kcywgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgaW4gZnJlcUJhbmRUYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICBjb25zdCBQQVRDSF9QQVJBTSAqcGF0Y2hQYXJhbSwgICAgIC8qITwgVHJhbnNwb3NlciBwYXRjaCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgICAgIGludCBub1BhdGNoZXMsICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdHJhbnNwb3NlciBwYXRjaGVzICovCi0gICAgICAgICAgICAgICAgICAgIGludCBsaW1pdGVyQmFuZHMpICAgICAgICAgICAgICAgICAgLyohPCBTZWxlY3RlZCAnYmFuZCBkZW5zaXR5JyBmcm9tIGJpdHN0cmVhbSAqLwoteworUmVzZXRMaW1pdGVyQmFuZHMoCisgICAgVUNIQVIgKmxpbWl0ZXJCYW5kVGFibGUsIC8qITwgUmVzdWx0aW5nIGJhbmQgYm9yZGVycyBpbiBRTUYgY2hhbm5lbHMgKi8KKyAgICBVQ0hBUiAqbm9MaW1pdGVyQmFuZHMsICAgLyohPCBSZXN1bHRpbmcgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZCAqLworICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAvKiE8IFRhYmxlIHdpdGggcG9zc2libGUgYmFuZCBib3JkZXJzICovCisgICAgaW50IG5vRnJlcUJhbmRzLCAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGluIGZyZXFCYW5kVGFibGUgKi8KKyAgICBjb25zdCBQQVRDSF9QQVJBTSAqcGF0Y2hQYXJhbSwgLyohPCBUcmFuc3Bvc2VyIHBhdGNoIHBhcmFtZXRlcnMgKi8KKyAgICBpbnQgbm9QYXRjaGVzLCAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdHJhbnNwb3NlciBwYXRjaGVzICovCisgICAgaW50IGxpbWl0ZXJCYW5kcywgLyohPCBTZWxlY3RlZCAnYmFuZCBkZW5zaXR5JyBmcm9tIGJpdHN0cmVhbSAqLworICAgIFVDSEFSIHNiclBhdGNoaW5nTW9kZSwgaW50IHhPdmVyUW1mW01BWF9OVU1fUEFUQ0hFU10sIGludCBiNDFTYnIpIHsKICAgaW50IGksIGssIGlzUGF0Y2hCb3JkZXJbMl0sIGxvTGltSW5kZXgsIGhpTGltSW5kZXgsIHRlbXBOb0xpbSwgbkJhbmRzOwogICBVQ0hBUiB3b3JrTGltaXRlckJhbmRUYWJsZVtNQVhfRlJFUV9DT0VGRlMgLyAyICsgTUFYX05VTV9QQVRDSEVTICsgMV07CiAgIGludCBwYXRjaEJvcmRlcnNbTUFYX05VTV9QQVRDSEVTICsgMV07CkBAIC0yMjEyLDEzICszMDMzLDI4IEBACiAgIGludCBoaWdoU3ViYmFuZCA9IGZyZXFCYW5kVGFibGVbbm9GcmVxQmFuZHNdOwogCiAgIC8qIDEgbGltaXRlciBiYW5kLiAqLwotICBpZihsaW1pdGVyQmFuZHMgPT0gMCkgeworICBpZiAobGltaXRlckJhbmRzID09IDApIHsKICAgICBsaW1pdGVyQmFuZFRhYmxlWzBdID0gMDsKICAgICBsaW1pdGVyQmFuZFRhYmxlWzFdID0gaGlnaFN1YmJhbmQgLSBsb3dTdWJiYW5kOwogICAgIG5CYW5kcyA9IDE7CiAgIH0gZWxzZSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5vUGF0Y2hlczsgaSsrKSB7Ci0gICAgICBwYXRjaEJvcmRlcnNbaV0gPSBwYXRjaFBhcmFtW2ldLmd1YXJkU3RhcnRCYW5kIC0gbG93U3ViYmFuZDsKKyAgICBpZiAoIXNiclBhdGNoaW5nTW9kZSAmJiB4T3ZlclFtZiAhPSBOVUxMKSB7CisgICAgICBub1BhdGNoZXMgPSAwOworCisgICAgICBpZiAoYjQxU2JyID09IDEpIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWF9OVU1fUEFUQ0hFU19IQkU7IGkrKykKKyAgICAgICAgICBpZiAoeE92ZXJRbWZbaV0gIT0gMCkgbm9QYXRjaGVzKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX1NUUkVUQ0hfSEJFOyBpKyspCisgICAgICAgICAgaWYgKHhPdmVyUW1mW2ldICE9IDApIG5vUGF0Y2hlcysrOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IG5vUGF0Y2hlczsgaSsrKSB7CisgICAgICAgIHBhdGNoQm9yZGVyc1tpXSA9IHhPdmVyUW1mW2ldIC0gbG93U3ViYmFuZDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMDsgaSA8IG5vUGF0Y2hlczsgaSsrKSB7CisgICAgICAgIHBhdGNoQm9yZGVyc1tpXSA9IHBhdGNoUGFyYW1baV0uZ3VhcmRTdGFydEJhbmQgLSBsb3dTdWJiYW5kOworICAgICAgfQogICAgIH0KICAgICBwYXRjaEJvcmRlcnNbaV0gPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CiAKQEAgLTIyMzYsMzUgKzMwNzIsMzggQEAKICAgICBsb0xpbUluZGV4ID0gMDsKICAgICBoaUxpbUluZGV4ID0gMTsKIAotCiAgICAgd2hpbGUgKGhpTGltSW5kZXggPD0gdGVtcE5vTGltKSB7CiAgICAgICBGSVhQX0RCTCBkaXZfbSwgb2N0X20sIHRlbXA7Ci0gICAgICBJTlQgZGl2X2UgID0gMCwgb2N0X2UgID0gMCwgdGVtcF9lID0gMDsKKyAgICAgIElOVCBkaXZfZSA9IDAsIG9jdF9lID0gMCwgdGVtcF9lID0gMDsKIAogICAgICAgazIgPSB3b3JrTGltaXRlckJhbmRUYWJsZVtoaUxpbUluZGV4XSArIGxvd1N1YmJhbmQ7CiAgICAgICBreCA9IHdvcmtMaW1pdGVyQmFuZFRhYmxlW2xvTGltSW5kZXhdICsgbG93U3ViYmFuZDsKIAotICAgICAgZGl2X20gID0gZkRpdk5vcm0oazIsIGt4LCAmZGl2X2UpOworICAgICAgZGl2X20gPSBmRGl2Tm9ybShrMiwga3gsICZkaXZfZSk7CiAKICAgICAgIC8qIGNhbGN1bGF0ZSBudW1iZXIgb2Ygb2N0YXZlcyAqLwotICAgICAgb2N0X20gID0gZkxvZzIoZGl2X20sIGRpdl9lLCAmb2N0X2UpOworICAgICAgb2N0X20gPSBmTG9nMihkaXZfbSwgZGl2X2UsICZvY3RfZSk7CiAKICAgICAgIC8qIG11bHRpcGx5IHdpdGggbGltaXRlcmJhbmRzIHBlciBvY3RhdmUgICAgKi8KICAgICAgIC8qIHZhbHVlcyAxLCAxLjIsIDIsIDMgLT4gc2NhbGUgZmFjdG9yIG9mIDIgKi8KLSAgICAgIHRlbXAgPSBmTXVsdE5vcm0ob2N0X20sIEZES19zYnJEZWNvZGVyX3Nicl9saW1pdGVyQmFuZHNQZXJPY3RhdmVEaXY0X0RCTFtsaW1pdGVyQmFuZHNdLCAmdGVtcF9lKTsKKyAgICAgIHRlbXAgPSBmTXVsdE5vcm0oCisgICAgICAgICAgb2N0X20sIEZES19zYnJEZWNvZGVyX3Nicl9saW1pdGVyQmFuZHNQZXJPY3RhdmVEaXY0X0RCTFtsaW1pdGVyQmFuZHNdLAorICAgICAgICAgICZ0ZW1wX2UpOwogCi0gICAgICAvKiBvdmVyYWxsIHNjYWxlIGZhY3RvciBvZiB0ZW1wIGlzdCBhZGRpdGlvbiBvZiBzY2FsZWZhY3RvcnMgZnJvbSBsb2cyIGNhbGN1bGF0aW9uLAotICAgICAgICAgbGltaXRlciBiYW5kcyBzY2FsZWZhY3RvciAoMikgYW5kIGxpbWl0ZXIgYmFuZHMgbXVsdGlwbGljYXRpb24gKi8KKyAgICAgIC8qIG92ZXJhbGwgc2NhbGUgZmFjdG9yIG9mIHRlbXAgaXN0IGFkZGl0aW9uIG9mIHNjYWxlZmFjdG9ycyBmcm9tIGxvZzIKKyAgICAgICAgIGNhbGN1bGF0aW9uLCBsaW1pdGVyIGJhbmRzIHNjYWxlZmFjdG9yICgyKSBhbmQgbGltaXRlciBiYW5kcworICAgICAgICAgbXVsdGlwbGljYXRpb24gKi8KICAgICAgIHRlbXBfZSArPSBvY3RfZSArIDI7CiAKICAgICAgIC8qICAgIGRpdiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IChrMiA9IDY0IGFuZCBreCA9IDEpCiAgICAgICAgICAtPiBvY3QgY2FuIGJlIGEgbWF4aW11bSBvZiA2Ci0gICAgICAgICAtPiB0ZW1wIGNhbiBiZSBhIG1heGltdW0gb2YgMTggKGFzIGxpbWl0ZXJCYW5kc1Blck9jdG9hdmUgaXMgYSBtYXhpbXVtIGZhY3RvciBvZiAzKQorICAgICAgICAgLT4gdGVtcCBjYW4gYmUgYSBtYXhpbXVtIG9mIDE4IChhcyBsaW1pdGVyQmFuZHNQZXJPY3RvYXZlIGlzIGEgbWF4aW11bQorICAgICAgICAgZmFjdG9yIG9mIDMpCiAgICAgICAgICAtPiB3ZSBuZWVkIGEgc2NhbGUgZmFjdG9yIG9mIDUgZm9yIGNvbXBhcmlzc29uCiAgICAgICAqLwotICAgICAgaWYgKHRlbXAgPj4gKDUgLSB0ZW1wX2UpIDwgRkwyRlhDT05TVF9EQkwgKDAuNDlmKSA+PiA1KSB7Ci0KLSAgICAgICAgaWYgKHdvcmtMaW1pdGVyQmFuZFRhYmxlW2hpTGltSW5kZXhdID09IHdvcmtMaW1pdGVyQmFuZFRhYmxlW2xvTGltSW5kZXhdKSB7CisgICAgICBpZiAodGVtcCA+PiAoNSAtIHRlbXBfZSkgPCBGTDJGWENPTlNUX0RCTCgwLjQ5ZikgPj4gNSkgeworICAgICAgICBpZiAod29ya0xpbWl0ZXJCYW5kVGFibGVbaGlMaW1JbmRleF0gPT0KKyAgICAgICAgICAgIHdvcmtMaW1pdGVyQmFuZFRhYmxlW2xvTGltSW5kZXhdKSB7CiAgICAgICAgICAgd29ya0xpbWl0ZXJCYW5kVGFibGVbaGlMaW1JbmRleF0gPSBoaWdoU3ViYmFuZDsKICAgICAgICAgICBuQmFuZHMtLTsKICAgICAgICAgICBoaUxpbUluZGV4Kys7CkBAIC0yMjk2LDEyICszMTM1LDExIEBACiAgICAgICB9CiAgICAgICBsb0xpbUluZGV4ID0gaGlMaW1JbmRleDsKICAgICAgIGhpTGltSW5kZXgrKzsKLQogICAgIH0KICAgICBzaGVsbHNvcnQod29ya0xpbWl0ZXJCYW5kVGFibGUsIHRlbXBOb0xpbSArIDEpOwogCiAgICAgLyogVGVzdCBpZiBhbGdvcml0aG0gZXhjZWVkZWQgbWF4aW11bSBhbGxvd2VkIGxpbWl0ZXJiYW5kcyAqLwotICAgIGlmKCBuQmFuZHMgPiBNQVhfTlVNX0xJTUlURVJTIHx8IG5CYW5kcyA8PSAwKSB7CisgICAgaWYgKG5CYW5kcyA+IE1BWF9OVU1fTElNSVRFUlMgfHwgbkJhbmRzIDw9IDApIHsKICAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICAgIH0KIApAQCAtMjMxNCw0ICszMTUyLDMgQEAKIAogICByZXR1cm4gU0JSREVDX09LOwogfQotCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmggYi9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmgKaW5kZXggODE1NDE2Ni4uY2ZmMzY1ZCAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9lbnZfY2FsYy5oCisrKyBiL2xpYlNCUmRlYy9zcmMvZW52X2NhbGMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw4NyArOTAsOTMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBFbnZlbG9wZSBjYWxjdWxhdGlvbiBwcm90b3R5cGVzICAKKyAgXGJyaWVmICBFbnZlbG9wZSBjYWxjdWxhdGlvbiBwcm90b3R5cGVzCiAqLwotI2lmbmRlZiBfX0VOVl9DQUxDX0gKLSNkZWZpbmUgX19FTlZfQ0FMQ19ICisjaWZuZGVmIEVOVl9DQUxDX0gKKyNkZWZpbmUgRU5WX0NBTENfSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgotI2luY2x1ZGUgImVudl9leHRyLmgiICAvKiBmb3IgSEFORExFX1NCUl9IRUFERVJfREFUQSAqLwotI2luY2x1ZGUgInNicl9zY2FsZS5oIgorI2luY2x1ZGUgImVudl9leHRyLmgiIC8qIGZvciBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICovCiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9EQkwgZmlsdEJ1ZmZlcltNQVhfRlJFUV9DT0VGRlNdOyAgICAgIC8qITwgcHJldmlvdXMgZ2FpbnMgKHJlcXVpcmVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoaW5nKSAqLworICBGSVhQX0RCTCBmaWx0QnVmZmVyTm9pc2VbTUFYX0ZSRVFfQ09FRkZTXTsgLyohPCBwcmV2aW91cyBub2lzZSBsZXZlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXF1aXJlZCBmb3Igc21vb3RoaW5nKSAqLworICBTQ0hBUiBmaWx0QnVmZmVyX2VbTUFYX0ZSRVFfQ09FRkZTXTsgICAgICAgLyohPCBFeHBvbmVudHMgb2YgcHJldmlvdXMgZ2FpbnMgKi8KKyAgU0NIQVIgZmlsdEJ1ZmZlck5vaXNlX2U7IC8qITwgQ29tbW9uIGV4cG9uZW50IG9mIHByZXZpb3VzIG5vaXNlIGxldmVscyAqLwogCi10eXBlZGVmIHN0cnVjdAotewotICBGSVhQX0RCTCAgZmlsdEJ1ZmZlcltNQVhfRlJFUV9DT0VGRlNdOyAgICAgICAgICAvKiE8IHByZXZpb3VzIGdhaW5zIChyZXF1aXJlZCBmb3Igc21vb3RoaW5nKSAqLwotICBGSVhQX0RCTCAgZmlsdEJ1ZmZlck5vaXNlW01BWF9GUkVRX0NPRUZGU107ICAgICAvKiE8IHByZXZpb3VzIG5vaXNlIGxldmVscyAocmVxdWlyZWQgZm9yIHNtb290aGluZykgKi8KLSAgU0NIQVIgICAgIGZpbHRCdWZmZXJfZVtNQVhfRlJFUV9DT0VGRlNdOyAgICAgICAgLyohPCBFeHBvbmVudHMgb2YgcHJldmlvdXMgZ2FpbnMgKi8KLSAgU0NIQVIgICAgIGZpbHRCdWZmZXJOb2lzZV9lOyAgICAgICAgICAgICAgICAgICAgLyohPCBDb21tb24gZXhwb25lbnQgb2YgcHJldmlvdXMgbm9pc2UgbGV2ZWxzICovCisgIGludCBzdGFydFVwOyAgICAgLyohPCBmbGFnIHRvIHNpZ25hbCBpbml0aWFsIGNvbmRpdGlvbnMgaW4gYnVmZmVycyAqLworICBpbnQgcGhhc2VJbmRleDsgIC8qITwgSW5kZXggZm9yIHJhbmRvbVBhc2UgYXJyYXkgKi8KKyAgaW50IHByZXZUcmFuRW52OyAvKiE8IFRoZSB0cmFuc2llbnQgZW52ZWxvcGUgb2YgdGhlIHByZXZpb3VzIGZyYW1lLiAqLwogCi0gIGludCBzdGFydFVwOyAgICAgICAgICAgICAgIC8qITwgZmxhZyB0byBzaWduYWwgaW5pdGlhbCBjb25kaXRpb25zIGluIGJ1ZmZlcnMgKi8KLSAgaW50IHBoYXNlSW5kZXg7ICAgICAgICAgICAgLyohPCBJbmRleCBmb3IgcmFuZG9tUGFzZSBhcnJheSAqLwotICBpbnQgcHJldlRyYW5FbnY7ICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2llbnQgZW52ZWxvcGUgb2YgdGhlIHByZXZpb3VzIGZyYW1lLiAqLworICBVTE9ORyBoYXJtRmxhZ3NQcmV2W0FERF9IQVJNT05JQ1NfRkxBR1NfU0laRV07CisgIC8qITwgV29yZHMgd2l0aCAxNiBmbGFncyBlYWNoIGluZGljYXRpbmcgd2hlcmUgYSBzaW5lIHdhcyBhZGRlZCBpbiB0aGUKKyAgICogcHJldmlvdXMgZnJhbWUuKi8KKyAgVUNIQVIgaGFybUluZGV4OyAgICAgLyohPCBDdXJyZW50IHBoYXNlIG9mIHN5bnRoZXRpYyBzaW5lICovCisgIGludCBzYnJQYXRjaGluZ01vZGU7IC8qITwgQ3VycmVudCBwYXRjaGluZyBtb2RlICAgICAgICAgICAqLwogCi0gIGludCBoYXJtRmxhZ3NQcmV2WyhNQVhfRlJFUV9DT0VGRlMrMTUpLzE2XTsKLSAgLyohPCBXb3JkcyB3aXRoIDE2IGZsYWdzIGVhY2ggaW5kaWNhdGluZyB3aGVyZSBhIHNpbmUgd2FzIGFkZGVkIGluIHRoZSBwcmV2aW91cyBmcmFtZS4qLwotICBVQ0hBUiBoYXJtSW5kZXg7ICAgICAgICAgICAgLyohPCBDdXJyZW50IHBoYXNlIG9mIHN5bnRoZXRpYyBzaW5lICovCi0KLX0KLVNCUl9DQUxDVUxBVEVfRU5WRUxPUEU7CisgIEZJWFBfU0dMIHByZXZTYnJOb2lzZUZsb29yTGV2ZWxbTUFYX05PSVNFX0NPRUZGU107CisgIFVDSEFSIHByZXZOTmZiOworICBVQ0hBUiBwcmV2TlNmYlsyXTsKKyAgVUNIQVIgcHJldkxvU3ViYmFuZDsKKyAgVUNIQVIgcHJldkhpU3ViYmFuZDsKKyAgVUNIQVIgcHJldl9vdl9oaWdoU3ViYmFuZDsKKyAgVUNIQVIgKnByZXZGcmVxQmFuZFRhYmxlWzJdOworICBVQ0hBUiBwcmV2RnJlcUJhbmRUYWJsZUxvW01BWF9GUkVRX0NPRUZGUyAvIDIgKyAxXTsKKyAgVUNIQVIgcHJldkZyZXFCYW5kVGFibGVIaVtNQVhfRlJFUV9DT0VGRlMgKyAxXTsKKyAgVUNIQVIgcHJldkZyZXFCYW5kVGFibGVOb2lzZVtNQVhfTk9JU0VfQ09FRkZTICsgMV07CisgIFNDSEFSIHNpbnVzb2lkYWxfcG9zaXRpb25QcmV2OworICBVTE9ORyBoYXJtRmxhZ3NQcmV2QWN0aXZlW0FERF9IQVJNT05JQ1NfRkxBR1NfU0laRV07Cit9IFNCUl9DQUxDVUxBVEVfRU5WRUxPUEU7CiAKIHR5cGVkZWYgU0JSX0NBTENVTEFURV9FTlZFTE9QRSAqSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEU7CiAKLQotCi12b2lkCi1jYWxjdWxhdGVTYnJFbnZlbG9wZSAoUU1GX1NDQUxFX0ZBQ1RPUiAgKnNiclNjYWxlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhfc2JyX2NhbF9lbnYsCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiphbmFseXNCdWZmZXJJbWFnLCAgICAgICAgICAgICAgICAgLyohPCBJbWFnIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCAqLwotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1c2VMUCwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGVncmVlQWxpYXMsICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVzdGltYXRlZCBhbGlhc2luZyBmb3IgZWFjaCBRTUYgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lRXJyb3JGbGFnCi0gICAgICAgICAgICAgICAgICAgICAgKTsKK3ZvaWQgY2FsY3VsYXRlU2JyRW52ZWxvcGUoCisgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2JyU2NhbGVGYWN0b3IsCisgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YSwKKyAgICBQVkNfRFlOQU1JQ19EQVRBICpwUHZjRHluYW1pY0RhdGEsIEZJWFBfREJMICoqYW5hbHlzQnVmZmVyUmVhbCwKKyAgICBGSVhQX0RCTCAqCisgICAgICAgICphbmFseXNCdWZmZXJJbWFnLCAvKiE8IEltYWcgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgY29uc3QgaW50IHVzZUxQLAorICAgIEZJWFBfREJMICpkZWdyZWVBbGlhcywgLyohPCBFc3RpbWF0ZWQgYWxpYXNpbmcgZm9yIGVhY2ggUU1GIGNoYW5uZWwgKi8KKyAgICBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBpbnQgZnJhbWVFcnJvckZsYWcpOwogCiBTQlJfRVJST1IKLWNyZWF0ZVNickVudmVsb3BlQ2FsYyAoSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaFNickNhbGN1bGF0ZUVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7CitjcmVhdGVTYnJFbnZlbG9wZUNhbGMoSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaFNickNhbGN1bGF0ZUVudmVsb3BlLAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIGNvbnN0IGludCBjaGFuLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MpOwogCi1pbnQKLWRlbGV0ZVNickVudmVsb3BlQ2FsYyAoSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaFNickNhbGN1bGF0ZUVudmVsb3BlKTsKK2ludCBkZWxldGVTYnJFbnZlbG9wZUNhbGMoSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaFNickNhbGN1bGF0ZUVudmVsb3BlKTsKIAotdm9pZAotcmVzZXRTYnJFbnZlbG9wZUNhbGMgKEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhDYWxFbnYpOwordm9pZCByZXNldFNickVudmVsb3BlQ2FsYyhIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoQ2FsRW52KTsKIAogU0JSX0VSUk9SCi1SZXNldExpbWl0ZXJCYW5kcyAoIFVDSEFSICpsaW1pdGVyQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqbm9MaW1pdGVyQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICBpbnQgbm9GcmVxQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFBBVENIX1BBUkFNICpwYXRjaFBhcmFtLAotICAgICAgICAgICAgICAgICAgICBpbnQgbm9QYXRjaGVzLAotICAgICAgICAgICAgICAgICAgICBpbnQgbGltaXRlckJhbmRzKTsKK1Jlc2V0TGltaXRlckJhbmRzKFVDSEFSICpsaW1pdGVyQmFuZFRhYmxlLCBVQ0hBUiAqbm9MaW1pdGVyQmFuZHMsCisgICAgICAgICAgICAgICAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgaW50IG5vRnJlcUJhbmRzLAorICAgICAgICAgICAgICAgICAgY29uc3QgUEFUQ0hfUEFSQU0gKnBhdGNoUGFyYW0sIGludCBub1BhdGNoZXMsCisgICAgICAgICAgICAgICAgICBpbnQgbGltaXRlckJhbmRzLCBVQ0hBUiBzYnJQYXRjaGluZ01vZGUsCisgICAgICAgICAgICAgICAgICBpbnQgeE92ZXJRbWZbTUFYX05VTV9QQVRDSEVTXSwgaW50IHNiclJhdGlvKTsKIAotdm9pZCByZXNjYWxlU3ViYmFuZFNhbXBsZXMoIEZJWFBfREJMICoqIHJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dTdWJiYW5kLCBpbnQgbm9TdWJiYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfcG9zLCAgaW50IG5leHRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGlmdCk7Cit2b2lkIHJlc2NhbGVTdWJiYW5kU2FtcGxlcyhGSVhQX0RCTCAqKnJlLCBGSVhQX0RCTCAqKmltLCBpbnQgbG93U3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub1N1YmJhbmRzLCBpbnQgc3RhcnRfcG9zLCBpbnQgbmV4dF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQpOwogCi1GSVhQX0RCTCBtYXhTdWJiYW5kU2FtcGxlKCBGSVhQX0RCTCAqKiBhbmFseXNCdWZmZXJSZWFsX20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKiBhbmFseXNCdWZmZXJJbWFnX20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93U3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaWdoU3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcF9wb3MpOworRklYUF9EQkwgbWF4U3ViYmFuZFNhbXBsZShGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlclJlYWxfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiphbmFseXNCdWZmZXJJbWFnX20sIGludCBsb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlnaFN1YmJhbmQsIGludCBzdGFydF9wb3MsIGludCBzdG9wX3Bvcyk7CiAKLSNlbmRpZiAvLyBfX0VOVl9DQUxDX0gKKyNlbmRpZiAgLy8gRU5WX0NBTENfSApkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmNwcCBiL2xpYlNCUmRlYy9zcmMvZW52X2RlYy5jcHAKaW5kZXggYzY1YzE2OS4uODhjOTJjZCAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL2Vudl9kZWMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDEzICs5MCwyMSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIGVudmVsb3BlIGRlY29kaW5nICAKLSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgZW52ZWxvcGUgZGVjb2RpbmcgYW5kIGVycm9yIGNvbmNlYWxtZW50IGFsZ29yaXRobXMuIFRoZSBtYWluCi0gIGVudHJ5IHBvaW50IGlzIGRlY29kZVNickRhdGEoKS4KKyAgXGJyaWVmICBlbnZlbG9wZSBkZWNvZGluZworICBUaGlzIG1vZHVsZSBwcm92aWRlcyBlbnZlbG9wZSBkZWNvZGluZyBhbmQgZXJyb3IgY29uY2VhbG1lbnQgYWxnb3JpdGhtcy4gVGhlCisgIG1haW4gZW50cnkgcG9pbnQgaXMgZGVjb2RlU2JyRGF0YSgpLgogCiAgIFxzYSBkZWNvZGVTYnJEYXRhKCksXHJlZiBkb2N1bWVudGF0aW9uT3ZlcnZpZXcKICovCkBAIC05Nyw0MyArMTE2LDQxIEBACiAKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCitzdGF0aWMgdm9pZCBkZWNvZGVFbnZlbG9wZShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhX290aGVyQ2hhbm5lbCk7CitzdGF0aWMgdm9pZCBzYnJfZW52ZWxvcGVfdW5tYXBwaW5nKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2RhdGFfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9yaWdodCk7CitzdGF0aWMgdm9pZCByZXF1YW50aXplRW52ZWxvcGVEYXRhKEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW1wUmVzb2x1dGlvbik7CitzdGF0aWMgdm9pZCBkZWx0YVRvTGluZWFyUGNtRW52ZWxvcGVEZWNvZGluZygKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwKKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSk7CitzdGF0aWMgdm9pZCBkZWNvZGVOb2lzZUZsb29ybGV2ZWxzKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSk7CitzdGF0aWMgdm9pZCB0aW1lQ29tcGVuc2F0ZUZpcnN0RW52ZWxvcGUoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSk7CitzdGF0aWMgaW50IGNoZWNrRW52ZWxvcGVEYXRhKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSk7CiAKLXN0YXRpYyB2b2lkIGRlY29kZUVudmVsb3BlIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhX290aGVyQ2hhbm5lbCk7Ci1zdGF0aWMgdm9pZCBzYnJfZW52ZWxvcGVfdW5tYXBwaW5nIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9yaWdodCk7Ci1zdGF0aWMgdm9pZCByZXF1YW50aXplRW52ZWxvcGVEYXRhIChIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbXBSZXNvbHV0aW9uKTsKLXN0YXRpYyB2b2lkIGRlbHRhVG9MaW5lYXJQY21FbnZlbG9wZURlY29kaW5nIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhKTsKLXN0YXRpYyB2b2lkIGRlY29kZU5vaXNlRmxvb3JsZXZlbHMgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhKTsKLXN0YXRpYyB2b2lkIHRpbWVDb21wZW5zYXRlRmlyc3RFbnZlbG9wZSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhKTsKLXN0YXRpYyBpbnQgY2hlY2tFbnZlbG9wZURhdGEgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhKTsKKyNkZWZpbmUgU0JSX0VORVJHWV9QQU5fT0ZGU0VUICgxMiA8PCBFTlZfRVhQX0ZSQUNUKQorI2RlZmluZSBTQlJfTUFYX0VORVJHWSAoMzUgPDwgRU5WX0VYUF9GUkFDVCkKIAotCi0KLSNkZWZpbmUgU0JSX0VORVJHWV9QQU5fT0ZGU0VUICAgKDEyIDw8IEVOVl9FWFBfRlJBQ1QpCi0jZGVmaW5lIFNCUl9NQVhfRU5FUkdZICAgICAgICAgICgzNSA8PCBFTlZfRVhQX0ZSQUNUKQotCi0jZGVmaW5lIERFQ0FZICAgICAgICAgICAgICAgICAgICggMSA8PCBFTlZfRVhQX0ZSQUNUKQorI2RlZmluZSBERUNBWSAoMSA8PCBFTlZfRVhQX0ZSQUNUKQogCiAjaWYgRU5WX0VYUF9GUkFDVAotI2RlZmluZSBERUNBWV9DT1VQTElORyAgICAgICAgICAoIDEgPDwgKEVOVl9FWFBfRlJBQ1QtMSkgKSAvKiE8IGNvcnJlc3BvbmRzIHRvIGEgdmFsdWUgb2YgMC41ICovCisjZGVmaW5lIERFQ0FZX0NPVVBMSU5HIFwKKyAgKDEgPDwgKEVOVl9FWFBfRlJBQ1QgLSAxKSkgLyohPCBjb3JyZXNwb25kcyB0byBhIHZhbHVlIG9mIDAuNSAqLwogI2Vsc2UKLSNkZWZpbmUgREVDQVlfQ09VUExJTkcgICAgICAgICAgICAxICAvKiE8IElmIHRoZSBlbmVyZ3kgZGF0YSBpcyBub3Qgc2hpZnRlZCwgdXNlIDEgaW5zdGVhZCBvZiAwLjUgKi8KKyNkZWZpbmUgREVDQVlfQ09VUExJTkcgXAorICAxIC8qITwgSWYgdGhlIGVuZXJneSBkYXRhIGlzIG5vdCBzaGlmdGVkLCB1c2UgMSBpbnN0ZWFkIG9mIDAuNSAqLwogI2VuZGlmCiAKLQogLyohCiAgIFxicmllZiAgQ29udmVydCB0YWJsZSBpbmRleAogKi8KQEAgLTE0MSwyOSArMTU4LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCAgLyohPCBpbmRleCB0byBzY2FsZWZhY3RvciBiYW5kICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcykgICAgLyohPCBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLwogewotICBpZihyZXMgPT0gMCkKLSAgewotICAgIGlmIChvZmZzZXQgPj0gMCkKLSAgICB7Ci0gICAgICAgIGlmIChpbmRleCA8IG9mZnNldCkKLSAgICAgICAgICByZXR1cm4oaW5kZXgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuKDIqaW5kZXggLSBvZmZzZXQpOworICBpZiAocmVzID09IDApIHsKKyAgICBpZiAob2Zmc2V0ID49IDApIHsKKyAgICAgIGlmIChpbmRleCA8IG9mZnNldCkKKyAgICAgICAgcmV0dXJuIChpbmRleCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAoMiAqIGluZGV4IC0gb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKKyAgICAgIGlmIChpbmRleCA8IG9mZnNldCkKKyAgICAgICAgcmV0dXJuICgyICogaW5kZXggKyBpbmRleCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAoMiAqIGluZGV4ICsgb2Zmc2V0KTsKICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKLSAgICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQotICAgICAgICAgIHJldHVybigyKmluZGV4K2luZGV4KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHJldHVybigyKmluZGV4ICsgb2Zmc2V0KTsKLSAgICB9Ci0gIH0KLSAgZWxzZQotICAgIHJldHVybihpbmRleCk7CisgIH0gZWxzZQorICAgIHJldHVybiAoaW5kZXgpOwogfQogCi0KIC8qIQogICBcYnJpZWYgIFVwZGF0ZSBwcmV2aW91cyBlbnZlbG9wZSB2YWx1ZSBmb3IgZGVsdGEtY29kaW5nCiAKQEAgLTE3MywxMTUgKzE4NCwxMTkgQEAKICAgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uLCB0aGUgZW5lcmd5IHZhbHVlIHdpbGwgYmUgbWFwcGVkIHRvIHRoZQogICBjb3JyZXNwb25kaW5nIGhpZ2gtcmVzIGJhbmRzLgogKi8KLXN0YXRpYyB2b2lkIG1hcExvd1Jlc0VuZXJneVZhbChGSVhQX1NHTCBjdXJyVmFsLCAgLyohPCBjdXJyZW50IGVuZXJneSB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMKiBwcmV2RGF0YSwvKiE8IHBvaW50ZXIgdG8gcHJldmlvdXMgZGF0YSB2ZWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCAgICAgIC8qITwgbWFwcGluZyBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsICAgICAgIC8qITwgaW5kZXggdG8gc2NhbGVmYWN0b3IgYmFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXMpICAgICAgICAgLyohPCBmcmVxdWVueSByZXNvbHV0aW9uICovCitzdGF0aWMgdm9pZCBtYXBMb3dSZXNFbmVyZ3lWYWwoCisgICAgRklYUF9TR0wgY3VyclZhbCwgICAvKiE8IGN1cnJlbnQgZW5lcmd5IHZhbHVlICovCisgICAgRklYUF9TR0wgKnByZXZEYXRhLCAvKiE8IHBvaW50ZXIgdG8gcHJldmlvdXMgZGF0YSB2ZWN0b3IgKi8KKyAgICBpbnQgb2Zmc2V0LCAgICAgICAgIC8qITwgbWFwcGluZyBmYWN0b3IgKi8KKyAgICBpbnQgaW5kZXgsICAgICAgICAgIC8qITwgaW5kZXggdG8gc2NhbGVmYWN0b3IgYmFuZCAqLworICAgIGludCByZXMpICAgICAgICAgICAgLyohPCBmcmVxdWVueSByZXNvbHV0aW9uICovCiB7Ci0gIGlmKHJlcyA9PSAwKQotICB7Ci0gICAgaWYgKG9mZnNldCA+PSAwKQotICAgIHsKLSAgICAgICAgaWYoaW5kZXggPCBvZmZzZXQpCi0gICAgICAgICAgICBwcmV2RGF0YVtpbmRleF0gPSBjdXJyVmFsOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZXZEYXRhWzIqaW5kZXggLSBvZmZzZXRdID0gY3VyclZhbDsKLSAgICAgICAgICAgIHByZXZEYXRhWzIqaW5kZXgrMSAtIG9mZnNldF0gPSBjdXJyVmFsOwotICAgICAgICB9CisgIGlmIChyZXMgPT0gMCkgeworICAgIGlmIChvZmZzZXQgPj0gMCkgeworICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQorICAgICAgICBwcmV2RGF0YVtpbmRleF0gPSBjdXJyVmFsOworICAgICAgZWxzZSB7CisgICAgICAgIHByZXZEYXRhWzIgKiBpbmRleCAtIG9mZnNldF0gPSBjdXJyVmFsOworICAgICAgICBwcmV2RGF0YVsyICogaW5kZXggKyAxIC0gb2Zmc2V0XSA9IGN1cnJWYWw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG9mZnNldCA9IC1vZmZzZXQ7CisgICAgICBpZiAoaW5kZXggPCBvZmZzZXQpIHsKKyAgICAgICAgcHJldkRhdGFbMyAqIGluZGV4XSA9IGN1cnJWYWw7CisgICAgICAgIHByZXZEYXRhWzMgKiBpbmRleCArIDFdID0gY3VyclZhbDsKKyAgICAgICAgcHJldkRhdGFbMyAqIGluZGV4ICsgMl0gPSBjdXJyVmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJldkRhdGFbMiAqIGluZGV4ICsgb2Zmc2V0XSA9IGN1cnJWYWw7CisgICAgICAgIHByZXZEYXRhWzIgKiBpbmRleCArIDEgKyBvZmZzZXRdID0gY3VyclZhbDsKKyAgICAgIH0KICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKLSAgICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2RGF0YVszKmluZGV4XSA9IGN1cnJWYWw7Ci0gICAgICAgICAgICBwcmV2RGF0YVszKmluZGV4KzFdID0gY3VyclZhbDsKLSAgICAgICAgICAgIHByZXZEYXRhWzMqaW5kZXgrMl0gPSBjdXJyVmFsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJldkRhdGFbMippbmRleCArIG9mZnNldF0gPSBjdXJyVmFsOwotICAgICAgICAgICAgcHJldkRhdGFbMippbmRleCArIDEgKyBvZmZzZXRdID0gY3VyclZhbDsKLSAgICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlCisgIH0gZWxzZQogICAgIHByZXZEYXRhW2luZGV4XSA9IGN1cnJWYWw7CiB9CiAKLQotCiAvKiEKICAgXGJyaWVmICAgIENvbnZlcnQgcmF3IGVudmVsb3BlIGFuZCBub2lzZWZsb29yIGRhdGEgdG8gZW5lcmd5IGxldmVscwogCi0gIFRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIGJ5IHNickRlY29kZXJfUGFyc2VFbGVtZW50KCkgYW5kIHByb3ZpZGVzIHR3byBpbXBvcnRhbnQgYWxnb3JpdGhtczoKKyAgVGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgYnkgc2JyRGVjb2Rlcl9QYXJzZUVsZW1lbnQoKSBhbmQgcHJvdmlkZXMgdHdvCisgIGltcG9ydGFudCBhbGdvcml0aG1zOgogCi0gIEZpcnN0IHRoZSBmdW5jdGlvbiBkZWNvZGVzIGVudmVsb3BlcyBhbmQgbm9pc2UgZmxvb3IgbGV2ZWxzIGFzIGRlc2NyaWJlZCBpbiByZXF1YW50aXplRW52ZWxvcGVEYXRhKCkKLSAgYW5kIHNicl9lbnZlbG9wZV91bm1hcHBpbmcoKS4gVGhlIGZ1bmN0aW9uIGFsc28gaW1wbGVtZW50cyBjb25jZWFsbWVudCBhbGdvcml0aG1zIGluIGNhc2UgdGhlcmUgYXJlIGVycm9ycwotICB3aXRoaW4gdGhlIHNiciBkYXRhLiBGb3IgYm90aCBvcGVyYXRpb25zIGZyYWN0aW9uYWwgYXJpdGhtZXRpYyBpcyB1c2VkLgotICBUaGVyZWZvcmUgeW91IG1pZ2h0IGVuY291bnRlciBkaWZmZXJlbnQgb3V0cHV0IHZhbHVlcyBvbiB5b3VyIHRhcmdldAotICBzeXN0ZW0gY29tcGFyZWQgdG8gdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KKyAgRmlyc3QgdGhlIGZ1bmN0aW9uIGRlY29kZXMgZW52ZWxvcGVzIGFuZCBub2lzZSBmbG9vciBsZXZlbHMgYXMgZGVzY3JpYmVkIGluCisgIHJlcXVhbnRpemVFbnZlbG9wZURhdGEoKSBhbmQgc2JyX2VudmVsb3BlX3VubWFwcGluZygpLiBUaGUgZnVuY3Rpb24gYWxzbworICBpbXBsZW1lbnRzIGNvbmNlYWxtZW50IGFsZ29yaXRobXMgaW4gY2FzZSB0aGVyZSBhcmUgZXJyb3JzIHdpdGhpbiB0aGUgc2JyCisgIGRhdGEuIEZvciBib3RoIG9wZXJhdGlvbnMgZnJhY3Rpb25hbCBhcml0aG1ldGljIGlzIHVzZWQuIFRoZXJlZm9yZSB5b3UgbWlnaHQKKyAgZW5jb3VudGVyIGRpZmZlcmVudCBvdXRwdXQgdmFsdWVzIG9uIHlvdXIgdGFyZ2V0IHN5c3RlbSBjb21wYXJlZCB0byB0aGUKKyAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgogKi8KLXZvaWQKLWRlY29kZVNickRhdGEgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgICAgICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9sZWZ0LCAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGxlZnQgY2hhbm5lbCBmcmFtZSBkYXRhICovCi0gICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YV9sZWZ0LCAvKiE8IHBvaW50ZXIgdG8gbGVmdCBjaGFubmVsIHByZXZpb3VzIGZyYW1lIGRhdGEgKi8KLSAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2RhdGFfcmlnaHQsICAgICAgICAgIC8qITwgcG9pbnRlciB0byByaWdodCBjaGFubmVsIGZyYW1lIGRhdGEgKi8KLSAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhX3JpZ2h0KS8qITwgcG9pbnRlciB0byByaWdodCBjaGFubmVsIHByZXZpb3VzIGZyYW1lIGRhdGEgKi8KK3ZvaWQgZGVjb2RlU2JyRGF0YSgKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEKKyAgICAgICAgaF9kYXRhX2xlZnQsIC8qITwgcG9pbnRlciB0byBsZWZ0IGNoYW5uZWwgZnJhbWUgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBCisgICAgICAgIGhfcHJldl9kYXRhX2xlZnQsIC8qITwgcG9pbnRlciB0byBsZWZ0IGNoYW5uZWwgcHJldmlvdXMgZnJhbWUgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQQorICAgICAgICBoX2RhdGFfcmlnaHQsIC8qITwgcG9pbnRlciB0byByaWdodCBjaGFubmVsIGZyYW1lIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQQorICAgICAgICBoX3ByZXZfZGF0YV9yaWdodCkgLyohPCBwb2ludGVyIHRvIHJpZ2h0IGNoYW5uZWwgcHJldmlvdXMgZnJhbWUgZGF0YSAqLwogewogICBGSVhQX1NHTCB0ZW1wU2ZiTnJnUHJldltNQVhfRlJFUV9DT0VGRlNdOwogICBpbnQgZXJyTGVmdDsKIAotICAvKiBTYXZlIHByZXZpb3VzIGVuZXJneSB2YWx1ZXMgdG8gYmUgYWJsZSB0byByZXVzZSB0aGVtIGxhdGVyIGZvciBjb25jZWFsbWVudC4gKi8KLSAgRkRLbWVtY3B5ICh0ZW1wU2ZiTnJnUHJldiwgaF9wcmV2X2RhdGFfbGVmdC0+c2ZiX25yZ19wcmV2LCBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YoRklYUF9TR0wpKTsKKyAgLyogU2F2ZSBwcmV2aW91cyBlbmVyZ3kgdmFsdWVzIHRvIGJlIGFibGUgdG8gcmV1c2UgdGhlbSBsYXRlciBmb3IgY29uY2VhbG1lbnQuCisgICAqLworICBGREttZW1jcHkodGVtcFNmYk5yZ1ByZXYsIGhfcHJldl9kYXRhX2xlZnQtPnNmYl9ucmdfcHJldiwKKyAgICAgICAgICAgIE1BWF9GUkVRX0NPRUZGUyAqIHNpemVvZihGSVhQX1NHTCkpOwogCi0gIGRlY29kZUVudmVsb3BlIChoSGVhZGVyRGF0YSwgaF9kYXRhX2xlZnQsIGhfcHJldl9kYXRhX2xlZnQsIGhfcHJldl9kYXRhX3JpZ2h0KTsKLSAgZGVjb2RlTm9pc2VGbG9vcmxldmVscyAoaEhlYWRlckRhdGEsIGhfZGF0YV9sZWZ0LCBoX3ByZXZfZGF0YV9sZWZ0KTsKKyAgaWYgKGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZyB8fCBoSGVhZGVyRGF0YS0+YnNfaW5mby5wdmNfbW9kZSA9PSAwKSB7CisgICAgZGVjb2RlRW52ZWxvcGUoaEhlYWRlckRhdGEsIGhfZGF0YV9sZWZ0LCBoX3ByZXZfZGF0YV9sZWZ0LAorICAgICAgICAgICAgICAgICAgIGhfcHJldl9kYXRhX3JpZ2h0KTsKKyAgfSBlbHNlIHsKKyAgICBGREtfQVNTRVJUKGhfZGF0YV9yaWdodCA9PSBOVUxMKTsKKyAgfQorICBkZWNvZGVOb2lzZUZsb29ybGV2ZWxzKGhIZWFkZXJEYXRhLCBoX2RhdGFfbGVmdCwgaF9wcmV2X2RhdGFfbGVmdCk7CiAKLSAgaWYoaF9kYXRhX3JpZ2h0ICE9IE5VTEwpIHsKKyAgaWYgKGhfZGF0YV9yaWdodCAhPSBOVUxMKSB7CiAgICAgZXJyTGVmdCA9IGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZzsKLSAgICBkZWNvZGVFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhfZGF0YV9yaWdodCwgaF9wcmV2X2RhdGFfcmlnaHQsIGhfcHJldl9kYXRhX2xlZnQpOwotICAgIGRlY29kZU5vaXNlRmxvb3JsZXZlbHMgKGhIZWFkZXJEYXRhLCBoX2RhdGFfcmlnaHQsIGhfcHJldl9kYXRhX3JpZ2h0KTsKKyAgICBkZWNvZGVFbnZlbG9wZShoSGVhZGVyRGF0YSwgaF9kYXRhX3JpZ2h0LCBoX3ByZXZfZGF0YV9yaWdodCwKKyAgICAgICAgICAgICAgICAgICBoX3ByZXZfZGF0YV9sZWZ0KTsKKyAgICBkZWNvZGVOb2lzZUZsb29ybGV2ZWxzKGhIZWFkZXJEYXRhLCBoX2RhdGFfcmlnaHQsIGhfcHJldl9kYXRhX3JpZ2h0KTsKIAogICAgIGlmICghZXJyTGVmdCAmJiBoSGVhZGVyRGF0YS0+ZnJhbWVFcnJvckZsYWcpIHsKLSAgICAgIC8qIElmIGFuIGVycm9yIG9jY3VycyBpbiB0aGUgcmlnaHQgY2hhbm5lbCB3aGVyZSB0aGUgbGVmdCBjaGFubmVsIHNlZW1lZCBvaywKLSAgICAgICAgIHdlIGFwcGx5IGNvbmNlYWxtZW50IGFsc28gb24gdGhlIGxlZnQgY2hhbm5lbC4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGNvdXBsaW5nCi0gICAgICAgICBtb2RlcyBvZiBib3RoIGNoYW5uZWxzIG1hdGNoIGFuZCB0aGF0IHdlIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVudmVsb3BlcyBpbgotICAgICAgICAgY291cGxpbmcgbW9kZS4KLSAgICAgICAgIEhvd2V2ZXIsIGFzIHRoZSBsZWZ0IGNoYW5uZWwgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYmVmb3JlLCB0aGUgcmVzdWx0aW5nCi0gICAgICAgICBlbmVyZ3kgbGV2ZWxzIGFyZSBub3QgdGhlIHNhbWUgYXMgaWYgdGhlIGxlZnQgY2hhbm5lbCBoYWQgYmVlbiBjb25jZWFsZWQKLSAgICAgICAgIGR1cmluZyB0aGUgZmlyc3QgY2FsbCBvZiBkZWNvZGVFbnZlbG9wZSgpLgorICAgICAgLyogSWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoZSByaWdodCBjaGFubmVsIHdoZXJlIHRoZSBsZWZ0IGNoYW5uZWwgc2VlbWVkCisgICAgICAgICBvaywgd2UgYXBwbHkgY29uY2VhbG1lbnQgYWxzbyBvbiB0aGUgbGVmdCBjaGFubmVsLiBUaGlzIGVuc3VyZXMgdGhhdAorICAgICAgICAgdGhlIGNvdXBsaW5nIG1vZGVzIG9mIGJvdGggY2hhbm5lbHMgbWF0Y2ggYW5kIHRoYXQgd2UgaGF2ZSB0aGUgc2FtZQorICAgICAgICAgbnVtYmVyIG9mIGVudmVsb3BlcyBpbiBjb3VwbGluZyBtb2RlLiBIb3dldmVyLCBhcyB0aGUgbGVmdCBjaGFubmVsIGhhcworICAgICAgICAgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBiZWZvcmUsIHRoZSByZXN1bHRpbmcgZW5lcmd5IGxldmVscyBhcmUgbm90IHRoZQorICAgICAgICAgc2FtZSBhcyBpZiB0aGUgbGVmdCBjaGFubmVsIGhhZCBiZWVuIGNvbmNlYWxlZCBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgb2YKKyAgICAgICAgIGRlY29kZUVudmVsb3BlKCkuCiAgICAgICAqLwotICAgICAgLyogUmVzdG9yZSBwcmV2aW91cyBlbmVyZ3kgdmFsdWVzIGZvciBjb25jZWFsbWVudCwgYmVjYXVzZSB0aGUgdmFsdWVzIGhhdmUgYmVlbgotICAgICAgICAgb3ZlcndyaXR0ZW4gYnkgdGhlIGZpcnN0IGNhbGwgb2YgZGVjb2RlRW52ZWxvcGUoKS4gKi8KLSAgICAgIEZES21lbWNweSAoaF9wcmV2X2RhdGFfbGVmdC0+c2ZiX25yZ19wcmV2LCB0ZW1wU2ZiTnJnUHJldiwgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mKEZJWFBfU0dMKSk7CisgICAgICAvKiBSZXN0b3JlIHByZXZpb3VzIGVuZXJneSB2YWx1ZXMgZm9yIGNvbmNlYWxtZW50LCBiZWNhdXNlIHRoZSB2YWx1ZXMgaGF2ZQorICAgICAgICAgYmVlbiBvdmVyd3JpdHRlbiBieSB0aGUgZmlyc3QgY2FsbCBvZiBkZWNvZGVFbnZlbG9wZSgpLiAqLworICAgICAgRkRLbWVtY3B5KGhfcHJldl9kYXRhX2xlZnQtPnNmYl9ucmdfcHJldiwgdGVtcFNmYk5yZ1ByZXYsCisgICAgICAgICAgICAgICAgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mKEZJWFBfU0dMKSk7CiAgICAgICAvKiBEbyBjb25jZWFsbWVudCAqLwotICAgICAgZGVjb2RlRW52ZWxvcGUgKGhIZWFkZXJEYXRhLCBoX2RhdGFfbGVmdCwgaF9wcmV2X2RhdGFfbGVmdCwgaF9wcmV2X2RhdGFfcmlnaHQpOworICAgICAgZGVjb2RlRW52ZWxvcGUoaEhlYWRlckRhdGEsIGhfZGF0YV9sZWZ0LCBoX3ByZXZfZGF0YV9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgaF9wcmV2X2RhdGFfcmlnaHQpOwogICAgIH0KIAogICAgIGlmIChoX2RhdGFfbGVmdC0+Y291cGxpbmcpIHsKLSAgICAgIHNicl9lbnZlbG9wZV91bm1hcHBpbmcgKGhIZWFkZXJEYXRhLCBoX2RhdGFfbGVmdCwgaF9kYXRhX3JpZ2h0KTsKKyAgICAgIHNicl9lbnZlbG9wZV91bm1hcHBpbmcoaEhlYWRlckRhdGEsIGhfZGF0YV9sZWZ0LCBoX2RhdGFfcmlnaHQpOwogICAgIH0KICAgfQogCiAgIC8qIERpc3BsYXkgdGhlIGRhdGEgZm9yIGRlYnVnZ2luZzogKi8KIH0KIAotCiAvKiEKICAgXGJyaWVmICAgQ29udmVydCBmcm9tIGNvdXBsZWQgY2hhbm5lbHMgdG8gaW5kZXBlbmRlbnQgTC9SIGRhdGEKICovCi1zdGF0aWMgdm9pZAotc2JyX2VudmVsb3BlX3VubWFwcGluZyAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX2xlZnQsICAvKiE8IHBvaW50ZXIgdG8gbGVmdCBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX3JpZ2h0KSAvKiE8IHBvaW50ZXIgdG8gcmlnaHQgY2hhbm5lbCAqLworc3RhdGljIHZvaWQgc2JyX2VudmVsb3BlX3VubWFwcGluZygKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX2xlZnQsICAvKiE8IHBvaW50ZXIgdG8gbGVmdCBjaGFubmVsICovCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9yaWdodCkgLyohPCBwb2ludGVyIHRvIHJpZ2h0IGNoYW5uZWwgKi8KIHsKICAgaW50IGk7CiAgIEZJWFBfU0dMIHRlbXBMX20sIHRlbXBSX20sIHRlbXBScGx1czFfbSwgbmV3TF9tLCBuZXdSX207Ci0gIFNDSEFSICAgdGVtcExfZSwgdGVtcFJfZSwgdGVtcFJwbHVzMV9lLCBuZXdMX2UsIG5ld1JfZTsKLQorICBTQ0hBUiB0ZW1wTF9lLCB0ZW1wUl9lLCB0ZW1wUnBsdXMxX2UsIG5ld0xfZSwgbmV3Ul9lOwogCiAgIC8qIDEuIFVubWFwIChhbHJlYWR5IGRlcXVhbnRpemVkKSBjb3VwbGVkIGVudmVsb3BlIGVuZXJnaWVzICovCiAKQEAgLTI4OSw1MSArMzA0LDUzIEBACiAgICAgdGVtcFJfbSA9IChGSVhQX1NHTCkoKExPTkcpaF9kYXRhX3JpZ2h0LT5pRW52ZWxvcGVbaV0gJiBNQVNLX00pOwogICAgIHRlbXBSX2UgPSAoU0NIQVIpKChMT05HKWhfZGF0YV9yaWdodC0+aUVudmVsb3BlW2ldICYgTUFTS19FKTsKIAotICAgIHRlbXBSX2UgLT0gKDE4ICsgTlJHX0VYUF9PRkZTRVQpOyAgLyogLTE4ID0gbGQoVU5NQVBQSU5HX1NDQUxFIC8gaF9kYXRhX3JpZ2h0LT5uQ2hhbm5lbHMpICovCisgICAgdGVtcFJfZSAtPSAoMTggKyBOUkdfRVhQX09GRlNFVCk7IC8qIC0xOCA9IGxkKFVOTUFQUElOR19TQ0FMRSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZGF0YV9yaWdodC0+bkNoYW5uZWxzKSAqLwogICAgIHRlbXBMX20gPSAoRklYUF9TR0wpKChMT05HKWhfZGF0YV9sZWZ0LT5pRW52ZWxvcGVbaV0gJiBNQVNLX00pOwogICAgIHRlbXBMX2UgPSAoU0NIQVIpKChMT05HKWhfZGF0YV9sZWZ0LT5pRW52ZWxvcGVbaV0gJiBNQVNLX0UpOwogCiAgICAgdGVtcExfZSAtPSBOUkdfRVhQX09GRlNFVDsKIAogICAgIC8qIENhbGN1bGF0ZSB0ZW1wUmlnaHQrMSAqLwotICAgIEZES19hZGRfTWFudEV4cCggdGVtcFJfbSwgdGVtcFJfZSwKLSAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYpLCAxLCAgLyogMS4wICovCi0gICAgICAgICAgICAgICAgICAgICAmdGVtcFJwbHVzMV9tLCAmdGVtcFJwbHVzMV9lKTsKKyAgICBGREtfYWRkX01hbnRFeHAodGVtcFJfbSwgdGVtcFJfZSwgRkwyRlhDT05TVF9TR0woMC41ZiksIDEsIC8qIDEuMCAqLworICAgICAgICAgICAgICAgICAgICAmdGVtcFJwbHVzMV9tLCAmdGVtcFJwbHVzMV9lKTsKIAotICAgIEZES19kaXZpZGVfTWFudEV4cCggdGVtcExfbSwgdGVtcExfZSsxLCAgLyogIDIgKiB0ZW1wTGVmdCAqLwotICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUnBsdXMxX20sIHRlbXBScGx1czFfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JfbSwgJm5ld1JfZSApOworICAgIEZES19kaXZpZGVfTWFudEV4cCh0ZW1wTF9tLCB0ZW1wTF9lICsgMSwgLyogIDIgKiB0ZW1wTGVmdCAqLworICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUnBsdXMxX20sIHRlbXBScGx1czFfZSwgJm5ld1JfbSwgJm5ld1JfZSk7CiAKICAgICBpZiAobmV3Ul9tID49ICgoRklYUF9TR0wpTUFYVkFMX1NHTCAtIFJPVU5ESU5HKSkgewogICAgICAgbmV3Ul9tID4+PSAxOwogICAgICAgbmV3Ul9lICs9IDE7CiAgICAgfQogCi0gICAgbmV3TF9tID0gRlhfREJMMkZYX1NHTChmTXVsdCh0ZW1wUl9tLG5ld1JfbSkpOworICAgIG5ld0xfbSA9IEZYX0RCTDJGWF9TR0woZk11bHQodGVtcFJfbSwgbmV3Ul9tKSk7CiAgICAgbmV3TF9lID0gdGVtcFJfZSArIG5ld1JfZTsKIAotICAgIGhfZGF0YV9yaWdodC0+aUVudmVsb3BlW2ldID0gKChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3Ul9tICsgUk9VTkRJTkcpICYgTUFTS19NKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3Ul9lICsgTlJHX0VYUF9PRkZTRVQpICYgTUFTS19FKTsKLSAgICBoX2RhdGFfbGVmdC0+aUVudmVsb3BlW2ldID0gICgoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld0xfbSArIFJPVU5ESU5HKSAmIE1BU0tfTSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld0xfZSArIE5SR19FWFBfT0ZGU0VUKSAmIE1BU0tfRSk7CisgICAgaF9kYXRhX3JpZ2h0LT5pRW52ZWxvcGVbaV0gPQorICAgICAgICAoKEZJWFBfU0dMKSgoU0hPUlQpKEZJWFBfU0dMKShuZXdSX20gKyBST1VORElORykgJiBNQVNLX00pKSArCisgICAgICAgIChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3Ul9lICsgTlJHX0VYUF9PRkZTRVQpICYgTUFTS19FKTsKKyAgICBoX2RhdGFfbGVmdC0+aUVudmVsb3BlW2ldID0KKyAgICAgICAgKChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3TF9tICsgUk9VTkRJTkcpICYgTUFTS19NKSkgKworICAgICAgICAoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld0xfZSArIE5SR19FWFBfT0ZGU0VUKSAmIE1BU0tfRSk7CiAgIH0KIAogICAvKiAyLiBEZXF1YW50aXplIGFuZCB1bm1hcCBjb3VwbGVkIG5vaXNlIGZsb29yIGxldmVscyAqLwogCi0gIGZvciAoaSA9IDA7IGkgPCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5OZmIgKiBoX2RhdGFfbGVmdC0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlczsgaSsrKSB7Ci0KKyAgZm9yIChpID0gMDsgaSA8IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubk5mYiAqCisgICAgICAgICAgICAgICAgICAgICAgaF9kYXRhX2xlZnQtPmZyYW1lSW5mby5uTm9pc2VFbnZlbG9wZXM7CisgICAgICAgaSsrKSB7CiAgICAgdGVtcExfZSA9IChTQ0hBUikoNiAtIChMT05HKWhfZGF0YV9sZWZ0LT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0pOwotICAgIHRlbXBSX2UgPSAoU0NIQVIpKChMT05HKWhfZGF0YV9yaWdodC0+c2JyTm9pc2VGbG9vckxldmVsW2ldIC0gMTIpIC8qU0JSX0VORVJHWV9QQU5fT0ZGU0VUKi87CisgICAgdGVtcFJfZSA9IChTQ0hBUikoKExPTkcpaF9kYXRhX3JpZ2h0LT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gLQorICAgICAgICAgICAgICAgICAgICAgIDEyKSAvKlNCUl9FTkVSR1lfUEFOX09GRlNFVCovOwogCiAgICAgLyogQ2FsY3VsYXRlIHRlbXBSKzEgKi8KLSAgICBGREtfYWRkX01hbnRFeHAoIEZMMkZYQ09OU1RfU0dMKDAuNWYpLCAxK3RlbXBSX2UsIC8qIHRlbXBSICovCi0gICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjVmKSwgMSwgICAgICAgICAvKiAgMS4wICAqLwotICAgICAgICAgICAgICAgICAgICAgJnRlbXBScGx1czFfbSwgJnRlbXBScGx1czFfZSk7CisgICAgRkRLX2FkZF9NYW50RXhwKEZMMkZYQ09OU1RfU0dMKDAuNWYpLCAxICsgdGVtcFJfZSwgLyogdGVtcFIgKi8KKyAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMC41ZiksIDEsICAgICAgICAgICAvKiAgMS4wICAqLworICAgICAgICAgICAgICAgICAgICAmdGVtcFJwbHVzMV9tLCAmdGVtcFJwbHVzMV9lKTsKIAogICAgIC8qIENhbGN1bGF0ZSAyKnRlbXBMZWZ0Lyh0ZW1wUisxKSAqLwotICAgIEZES19kaXZpZGVfTWFudEV4cCggRkwyRlhDT05TVF9TR0woMC41ZiksIHRlbXBMX2UrMiwgIC8qICAyICogdGVtcExlZnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJwbHVzMV9tLCB0ZW1wUnBsdXMxX2UsCi0gICAgICAgICAgICAgICAgICAgICAgICZuZXdSX20sICZuZXdSX2UgKTsKKyAgICBGREtfZGl2aWRlX01hbnRFeHAoRkwyRlhDT05TVF9TR0woMC41ZiksIHRlbXBMX2UgKyAyLCAvKiAgMiAqIHRlbXBMZWZ0ICovCisgICAgICAgICAgICAgICAgICAgICAgIHRlbXBScGx1czFfbSwgdGVtcFJwbHVzMV9lLCAmbmV3Ul9tLCAmbmV3Ul9lKTsKIAogICAgIC8qIGlmIChuZXdSX20gPj0gKChGSVhQX1NHTClNQVhWQUxfU0dMIC0gUk9VTkRJTkcpKSB7CiAgICAgICBuZXdSX20gPj49IDE7CkBAIC0zNDMsMTQgKzM2MCwxNSBAQAogICAgIC8qIEwgPSB0ZW1wUiAqIFIgKi8KICAgICBuZXdMX20gPSBuZXdSX207CiAgICAgbmV3TF9lID0gbmV3Ul9lICsgdGVtcFJfZTsKLSAgICBoX2RhdGFfcmlnaHQtPnNick5vaXNlRmxvb3JMZXZlbFtpXSA9ICgoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld1JfbSArIFJPVU5ESU5HKSAmIE1BU0tfTSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld1JfZSArIE5PSVNFX0VYUF9PRkZTRVQpICYgTUFTS19FKTsKLSAgICBoX2RhdGFfbGVmdC0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0gICgoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld0xfbSArIFJPVU5ESU5HKSAmIE1BU0tfTSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld0xfZSArIE5PSVNFX0VYUF9PRkZTRVQpICYgTUFTS19FKTsKKyAgICBoX2RhdGFfcmlnaHQtPnNick5vaXNlRmxvb3JMZXZlbFtpXSA9CisgICAgICAgICgoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld1JfbSArIFJPVU5ESU5HKSAmIE1BU0tfTSkpICsKKyAgICAgICAgKEZJWFBfU0dMKSgoU0hPUlQpKEZJWFBfU0dMKShuZXdSX2UgKyBOT0lTRV9FWFBfT0ZGU0VUKSAmIE1BU0tfRSk7CisgICAgaF9kYXRhX2xlZnQtPnNick5vaXNlRmxvb3JMZXZlbFtpXSA9CisgICAgICAgICgoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld0xfbSArIFJPVU5ESU5HKSAmIE1BU0tfTSkpICsKKyAgICAgICAgKEZJWFBfU0dMKSgoU0hPUlQpKEZJWFBfU0dMKShuZXdMX2UgKyBOT0lTRV9FWFBfT0ZGU0VUKSAmIE1BU0tfRSk7CiAgIH0KIH0KIAotCiAvKiEKICAgXGJyaWVmICAgIFNpbXBsZSBhbHRlcm5hdGl2ZSB0byB0aGUgcmVhbCBTQlIgY29uY2VhbG1lbnQKIApAQCAtMzU5LDI0ICszNzcsMjMgQEAKICAgVGhlIGRlbHRhLWNvZGVkIGVuZXJnaWVzIGFyZSBzZXQgdG8gbmVnYXRpdmUgdmFsdWVzLCByZXN1bHRpbmcgaW4gYSBmYWRlLWRvd24uCiAgIEluIGNhc2Ugb2YgY291cGxpbmcsIHRoZSBiYWxhbmNlLWNoYW5uZWwgd2lsbCBtb3ZlIHRvd2FyZHMgdGhlIGNlbnRlci4KICovCi1zdGF0aWMgdm9pZAotbGVhblNickNvbmNlYWxtZW50KEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfc2JyX2RhdGEsICAgICAgLyohPCBwb2ludGVyIHRvIGN1cnJlbnQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhICAvKiE8IHBvaW50ZXIgdG8gZGF0YSBvZiBsYXN0IGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgKQotewotICBGSVhQX1NHTCB0YXJnZXQ7ICAvKiB0YXJnZXRlZCBsZXZlbCBmb3Igc2ZiX25yZ19wcmV2IGR1cmluZyBmYWRlLWRvd24gKi8KLSAgRklYUF9TR0wgc3RlcDsgICAgLyogc3BlZWQgb2YgZmFkZSAqLworc3RhdGljIHZvaWQgbGVhblNickNvbmNlYWxtZW50KAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLCAgICAgIC8qITwgcG9pbnRlciB0byBjdXJyZW50IGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSAvKiE8IHBvaW50ZXIgdG8gZGF0YSBvZiBsYXN0IGZyYW1lICovCispIHsKKyAgRklYUF9TR0wgdGFyZ2V0OyAvKiB0YXJnZXRlZCBsZXZlbCBmb3Igc2ZiX25yZ19wcmV2IGR1cmluZyBmYWRlLWRvd24gKi8KKyAgRklYUF9TR0wgc3RlcDsgICAvKiBzcGVlZCBvZiBmYWRlICovCiAgIGludCBpOwogCi0gIGludCBjdXJyZW50U3RhcnRQb3MgPSBGREttYXgoMCwgaF9wcmV2X2RhdGEtPnN0b3BQb3MgLSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzKTsKKyAgaW50IGN1cnJlbnRTdGFydFBvcyA9CisgICAgICBmTWF4KDAsIGhfcHJldl9kYXRhLT5zdG9wUG9zIC0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyk7CiAgIGludCBjdXJyZW50U3RvcFBvcyA9IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHM7CiAKLQogICAvKiBVc2Ugc29tZSBzZXR0aW5ncyBvZiB0aGUgcHJldmlvdXMgZnJhbWUgKi8KICAgaF9zYnJfZGF0YS0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZSA9IGhfcHJldl9kYXRhLT5hbXBSZXM7CiAgIGhfc2JyX2RhdGEtPmNvdXBsaW5nID0gaF9wcmV2X2RhdGEtPmNvdXBsaW5nOwotICBmb3IoaT0wO2k8TUFYX0lOVkZfQkFORFM7aSsrKQorICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOVkZfQkFORFM7IGkrKykKICAgICBoX3Nicl9kYXRhLT5zYnJfaW52Zl9tb2RlW2ldID0gaF9wcmV2X2RhdGEtPnNicl9pbnZmX21vZGVbaV07CiAKICAgLyogR2VuZXJhdGUgY29uY2VhbGluZyBjb250cm9sIGRhdGEgKi8KQEAgLTM4NSw3ICs0MDIsNyBAQAogICBoX3Nicl9kYXRhLT5mcmFtZUluZm8uYm9yZGVyc1swXSA9IGN1cnJlbnRTdGFydFBvczsKICAgaF9zYnJfZGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnNbMV0gPSBjdXJyZW50U3RvcFBvczsKICAgaF9zYnJfZGF0YS0+ZnJhbWVJbmZvLmZyZXFSZXNbMF0gPSAxOwotICBoX3Nicl9kYXRhLT5mcmFtZUluZm8udHJhbkVudiA9IC0xOyAgLyogbm8gdHJhbnNpZW50ICovCisgIGhfc2JyX2RhdGEtPmZyYW1lSW5mby50cmFuRW52ID0gLTE7IC8qIG5vIHRyYW5zaWVudCAqLwogICBoX3Nicl9kYXRhLT5mcmFtZUluZm8ubk5vaXNlRW52ZWxvcGVzID0gMTsKICAgaF9zYnJfZGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnNOb2lzZVswXSA9IGN1cnJlbnRTdGFydFBvczsKICAgaF9zYnJfZGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnNOb2lzZVsxXSA9IGN1cnJlbnRTdG9wUG9zOwpAQCAtMzk5LDE3ICs0MTYsMTYgQEAKICAgaWYgKGhfc2JyX2RhdGEtPmNvdXBsaW5nID09IENPVVBMSU5HX0JBTCkgewogICAgIHRhcmdldCA9IChGSVhQX1NHTClTQlJfRU5FUkdZX1BBTl9PRkZTRVQ7CiAgICAgc3RlcCA9IChGSVhQX1NHTClERUNBWV9DT1VQTElORzsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICB0YXJnZXQgPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKLSAgICBzdGVwICAgPSAoRklYUF9TR0wpREVDQVk7CisgICAgc3RlcCA9IChGSVhQX1NHTClERUNBWTsKICAgfQogICBpZiAoaEhlYWRlckRhdGEtPmJzX2luZm8uYW1wUmVzb2x1dGlvbiA9PSAwKSB7CiAgICAgdGFyZ2V0IDw8PSAxOwotICAgIHN0ZXAgICA8PD0gMTsKKyAgICBzdGVwIDw8PSAxOwogICB9CiAKLSAgZm9yIChpPTA7IGkgPCBoX3Nicl9kYXRhLT5uU2NhbGVGYWN0b3JzOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IGhfc2JyX2RhdGEtPm5TY2FsZUZhY3RvcnM7IGkrKykgewogICAgIGlmIChoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2W2ldID4gdGFyZ2V0KQogICAgICAgaF9zYnJfZGF0YS0+aUVudmVsb3BlW2ldID0gLXN0ZXA7CiAgICAgZWxzZQpAQCAtNDE5LDEyMyArNDM1LDEyNSBAQAogICAvKiBOb2lzZWZsb29yIGxldmVscyBhcmUgYWx3YXlzIGNsZWFyZWQgLi4uICovCiAKICAgaF9zYnJfZGF0YS0+ZG9tYWluX3ZlY19ub2lzZVswXSA9IDE7Ci0gIGZvciAoaT0wOyBpIDwgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uTmZiOyBpKyspCisgIGZvciAoaSA9IDA7IGkgPCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5OZmI7IGkrKykKICAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKIAogICAvKiAuLi4gYW5kIHNvIGFyZSB0aGUgc2luZXMgKi8KLSAgRkRLbWVtY2xlYXIoaF9zYnJfZGF0YS0+YWRkSGFybW9uaWNzLCBNQVhfRlJFUV9DT0VGRlMpOworICBGREttZW1jbGVhcihoX3Nicl9kYXRhLT5hZGRIYXJtb25pY3MsCisgICAgICAgICAgICAgIHNpemVvZihVTE9ORykgKiBBRERfSEFSTU9OSUNTX0ZMQUdTX1NJWkUpOwogfQogCi0KIC8qIQogICBcYnJpZWYgICBCdWlsZCByZWZlcmVuY2UgZW5lcmdpZXMgYW5kIG5vaXNlIGxldmVscyBmcm9tIGJpdHN0cmVhbSBlbGVtZW50cwogKi8KLXN0YXRpYyB2b2lkCi1kZWNvZGVFbnZlbG9wZSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaF9zYnJfZGF0YSwgICAgICAvKiE8IHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCi0gICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEsIC8qITwgcG9pbnRlciB0byBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBvdGhlckNoYW5uZWwgLyohPCBvdGhlciBjaGFubmVsJ3MgbGFzdCBmcmFtZSBkYXRhICovCi0gICAgICAgICAgICAgICAgKQoteworc3RhdGljIHZvaWQgZGVjb2RlRW52ZWxvcGUoCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsICAgLyohPCBwb2ludGVyIHRvIGN1cnJlbnQgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBCisgICAgICAgIGhfcHJldl9kYXRhLCAvKiE8IHBvaW50ZXIgdG8gZGF0YSBvZiBsYXN0IGZyYW1lICovCisgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEKKyAgICAgICAgb3RoZXJDaGFubmVsIC8qITwgb3RoZXIgY2hhbm5lbCdzIGxhc3QgZnJhbWUgZGF0YSAqLworKSB7CiAgIGludCBpOwogICBpbnQgZkZyYW1lRXJyb3IgPSBoSGVhZGVyRGF0YS0+ZnJhbWVFcnJvckZsYWc7CiAgIEZJWFBfU0dMIHRlbXBTZmJOcmdQcmV2W01BWF9GUkVRX0NPRUZGU107CiAKICAgaWYgKCFmRnJhbWVFcnJvcikgewogICAgIC8qCi0gICAgICBUbyBhdm9pZCBkaXN0b3J0aW9ucyBhZnRlciBiYWQgZnJhbWVzLCBzZXQgdGhlIGVycm9yIGZsYWcgaWYgZGVsdGEgY29kaW5nIGluIHRpbWUgb2NjdXJzLgotICAgICAgSG93ZXZlciwgU0JSIGNhbiB0YWtlIGEgbGl0dGxlIGxvbmdlciB0byBjb21lIHVwIGFnYWluLgorICAgICAgVG8gYXZvaWQgZGlzdG9ydGlvbnMgYWZ0ZXIgYmFkIGZyYW1lcywgc2V0IHRoZSBlcnJvciBmbGFnIGlmIGRlbHRhIGNvZGluZworICAgICAgaW4gdGltZSBvY2N1cnMuIEhvd2V2ZXIsIFNCUiBjYW4gdGFrZSBhIGxpdHRsZSBsb25nZXIgdG8gY29tZSB1cCBhZ2Fpbi4KICAgICAqLwotICAgIGlmICggaF9wcmV2X2RhdGEtPmZyYW1lRXJyb3JGbGFnICkgeworICAgIGlmIChoX3ByZXZfZGF0YS0+ZnJhbWVFcnJvckZsYWcpIHsKICAgICAgIGlmIChoX3Nicl9kYXRhLT5kb21haW5fdmVjWzBdICE9IDApIHsKICAgICAgICAgZkZyYW1lRXJyb3IgPSAxOwogICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAvKiBDaGVjayB0aGF0IHRoZSBwcmV2aW91cyBzdG9wIHBvc2l0aW9uIGFuZCB0aGUgY3VycmVudCBzdGFydCBwb3NpdGlvbiBtYXRjaC4KLSAgICAgICAgIChDb3VsZCBiZSBkb25lIGluIGNoZWNrRnJhbWVJbmZvKCksIGJ1dCB0aGUgcHJldmlvdXMgZnJhbWUgZGF0YSBpcyBub3QgYXZhaWxhYmxlIHRoZXJlKSAqLwotICAgICAgaWYgKCBoX3Nicl9kYXRhLT5mcmFtZUluZm8uYm9yZGVyc1swXSAhPSBoX3ByZXZfZGF0YS0+c3RvcFBvcyAtIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgKSB7Ci0gICAgICAgIC8qIEJvdGggdGhlIHByZXZpb3VzIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgZnJhbWUgYXJlIGZsYWdnZWQgdG8gYmUgb2ssIGJ1dCB0aGV5IGRvIG5vdCBtYXRjaCEgKi8KKyAgICAgIC8qIENoZWNrIHRoYXQgdGhlIHByZXZpb3VzIHN0b3AgcG9zaXRpb24gYW5kIHRoZSBjdXJyZW50IHN0YXJ0IHBvc2l0aW9uCisgICAgICAgICBtYXRjaC4gKENvdWxkIGJlIGRvbmUgaW4gY2hlY2tGcmFtZUluZm8oKSwgYnV0IHRoZSBwcmV2aW91cyBmcmFtZSBkYXRhCisgICAgICAgICBpcyBub3QgYXZhaWxhYmxlIHRoZXJlKSAqLworICAgICAgaWYgKGhfc2JyX2RhdGEtPmZyYW1lSW5mby5ib3JkZXJzWzBdICE9CisgICAgICAgICAgaF9wcmV2X2RhdGEtPnN0b3BQb3MgLSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzKSB7CisgICAgICAgIC8qIEJvdGggdGhlIHByZXZpb3VzIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgZnJhbWUgYXJlIGZsYWdnZWQgdG8gYmUgb2ssCisgICAgICAgICAqIGJ1dCB0aGV5IGRvIG5vdCBtYXRjaCEgKi8KICAgICAgICAgaWYgKGhfc2JyX2RhdGEtPmRvbWFpbl92ZWNbMF0gPT0gMSkgewotICAgICAgICAgIC8qIFByZWZlciBjb25jZWFsbWVudCBvdmVyIGRlbHRhLXRpbWUgY29kaW5nIGJldHdlZW4gdGhlIG1pc21hdGNoaW5nIGZyYW1lcyAqLworICAgICAgICAgIC8qIFByZWZlciBjb25jZWFsbWVudCBvdmVyIGRlbHRhLXRpbWUgY29kaW5nIGJldHdlZW4gdGhlIG1pc21hdGNoaW5nCisgICAgICAgICAgICogZnJhbWVzICovCiAgICAgICAgICAgZkZyYW1lRXJyb3IgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIC8qIENsb3NlIHRoZSBnYXAgaW4gdGltZSBieSB0cmlnZ2VyaW5nIHRpbWVDb21wZW5zYXRlRmlyc3RFbnZlbG9wZSgpICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogQ2xvc2UgdGhlIGdhcCBpbiB0aW1lIGJ5IHRyaWdnZXJpbmcgdGltZUNvbXBlbnNhdGVGaXJzdEVudmVsb3BlKCkKKyAgICAgICAgICAgKi8KICAgICAgICAgICBmRnJhbWVFcnJvciA9IDE7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIAorICBpZiAoZkZyYW1lRXJyb3IpIC8qIEVycm9yIGlzIGRldGVjdGVkICovCisgIHsKKyAgICBsZWFuU2JyQ29uY2VhbG1lbnQoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEsIGhfcHJldl9kYXRhKTsKIAotICBpZiAoZkZyYW1lRXJyb3IpICAgICAgIC8qIEVycm9yIGlzIGRldGVjdGVkICovCi0gICAgewotICAgICAgbGVhblNickNvbmNlYWxtZW50KGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaF9wcmV2X2RhdGEpOwotCi0gICAgICAvKiBkZWNvZGUgdGhlIGVudmVsb3BlIGRhdGEgdG8gbGluZWFyIFBDTSAqLwotICAgICAgZGVsdGFUb0xpbmVhclBjbUVudmVsb3BlRGVjb2RpbmcgKGhIZWFkZXJEYXRhLCBoX3Nicl9kYXRhLCBoX3ByZXZfZGF0YSk7Ci0gICAgfQotICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvKkRvIGEgdGVtcG9yYXJ5IGR1bW15IGRlY29kaW5nIGFuZCBjaGVjayB0aGF0IHRoZSBlbnZlbG9wZSB2YWx1ZXMgYXJlIHdpdGhpbiBsaW1pdHMgKi8KLSAgICB7Ci0gICAgICBpZiAoaF9wcmV2X2RhdGEtPmZyYW1lRXJyb3JGbGFnKSB7Ci0gICAgICAgIHRpbWVDb21wZW5zYXRlRmlyc3RFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEsIGhfcHJldl9kYXRhKTsKLSAgICAgICAgaWYgKGhfc2JyX2RhdGEtPmNvdXBsaW5nICE9IGhfcHJldl9kYXRhLT5jb3VwbGluZykgewotICAgICAgICAgIC8qCi0gICAgICAgICAgICBDb3VwbGluZyBtb2RlIGhhcyBjaGFuZ2VkIGR1cmluZyBjb25jZWFsbWVudC4KLSAgICAgICAgICAgICBUaGUgc3RvcmVkIGVuZXJneSBsZXZlbHMgbmVlZCB0byBiZSBjb252ZXJ0ZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYlsxXTsgaSsrKSB7Ci0gICAgICAgICAgICAvKiBGb3JtZXIgTGV2ZWwtQ2hhbm5lbCB3aWxsIGJlIHVzZWQgZm9yIGJvdGggY2hhbm5lbHMgKi8KLSAgICAgICAgICAgIGlmIChoX3ByZXZfZGF0YS0+Y291cGxpbmcgPT0gQ09VUExJTkdfQkFMKQotICAgICAgICAgICAgICBoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2W2ldID0gb3RoZXJDaGFubmVsLT5zZmJfbnJnX3ByZXZbaV07Ci0gICAgICAgICAgICAvKiBGb3JtZXIgTC9SIHdpbGwgYmUgY29tYmluZWQgYXMgdGhlIG5ldyBMZXZlbC1DaGFubmVsICovCi0gICAgICAgICAgICBlbHNlIGlmIChoX3Nicl9kYXRhLT5jb3VwbGluZyA9PSBDT1VQTElOR19MRVZFTCkKLSAgICAgICAgICAgICAgaF9wcmV2X2RhdGEtPnNmYl9ucmdfcHJldltpXSA9IChoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2W2ldICsgb3RoZXJDaGFubmVsLT5zZmJfbnJnX3ByZXZbaV0pID4+IDE7Ci0gICAgICAgICAgICBlbHNlIGlmIChoX3Nicl9kYXRhLT5jb3VwbGluZyA9PSBDT1VQTElOR19CQUwpCi0gICAgICAgICAgICAgIGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXZbaV0gPSAoRklYUF9TR0wpU0JSX0VORVJHWV9QQU5fT0ZGU0VUOwotICAgICAgICAgIH0KKyAgICAvKiBkZWNvZGUgdGhlIGVudmVsb3BlIGRhdGEgdG8gbGluZWFyIFBDTSAqLworICAgIGRlbHRhVG9MaW5lYXJQY21FbnZlbG9wZURlY29kaW5nKGhIZWFkZXJEYXRhLCBoX3Nicl9kYXRhLCBoX3ByZXZfZGF0YSk7CisgIH0gZWxzZSAvKkRvIGEgdGVtcG9yYXJ5IGR1bW15IGRlY29kaW5nIGFuZCBjaGVjayB0aGF0IHRoZSBlbnZlbG9wZSB2YWx1ZXMgYXJlCisgICAgICAgICAgICB3aXRoaW4gbGltaXRzICovCisgIHsKKyAgICBpZiAoaF9wcmV2X2RhdGEtPmZyYW1lRXJyb3JGbGFnKSB7CisgICAgICB0aW1lQ29tcGVuc2F0ZUZpcnN0RW52ZWxvcGUoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEsIGhfcHJldl9kYXRhKTsKKyAgICAgIGlmIChoX3Nicl9kYXRhLT5jb3VwbGluZyAhPSBoX3ByZXZfZGF0YS0+Y291cGxpbmcpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICBDb3VwbGluZyBtb2RlIGhhcyBjaGFuZ2VkIGR1cmluZyBjb25jZWFsbWVudC4KKyAgICAgICAgICAgVGhlIHN0b3JlZCBlbmVyZ3kgbGV2ZWxzIG5lZWQgdG8gYmUgY29udmVydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYlsxXTsgaSsrKSB7CisgICAgICAgICAgLyogRm9ybWVyIExldmVsLUNoYW5uZWwgd2lsbCBiZSB1c2VkIGZvciBib3RoIGNoYW5uZWxzICovCisgICAgICAgICAgaWYgKGhfcHJldl9kYXRhLT5jb3VwbGluZyA9PSBDT1VQTElOR19CQUwpCisgICAgICAgICAgICBoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2W2ldID0gb3RoZXJDaGFubmVsLT5zZmJfbnJnX3ByZXZbaV07CisgICAgICAgICAgLyogRm9ybWVyIEwvUiB3aWxsIGJlIGNvbWJpbmVkIGFzIHRoZSBuZXcgTGV2ZWwtQ2hhbm5lbCAqLworICAgICAgICAgIGVsc2UgaWYgKGhfc2JyX2RhdGEtPmNvdXBsaW5nID09IENPVVBMSU5HX0xFVkVMKQorICAgICAgICAgICAgaF9wcmV2X2RhdGEtPnNmYl9ucmdfcHJldltpXSA9IChoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2W2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJDaGFubmVsLT5zZmJfbnJnX3ByZXZbaV0pID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICBlbHNlIGlmIChoX3Nicl9kYXRhLT5jb3VwbGluZyA9PSBDT1VQTElOR19CQUwpCisgICAgICAgICAgICBoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2W2ldID0gKEZJWFBfU0dMKVNCUl9FTkVSR1lfUEFOX09GRlNFVDsKICAgICAgICAgfQogICAgICAgfQotICAgICAgRkRLbWVtY3B5ICh0ZW1wU2ZiTnJnUHJldiwgaF9wcmV2X2RhdGEtPnNmYl9ucmdfcHJldiwKLSAgICAgICAgICAgICAgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mIChGSVhQX1NHTCkpOwotCi0gICAgICBkZWx0YVRvTGluZWFyUGNtRW52ZWxvcGVEZWNvZGluZyAoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEsIGhfcHJldl9kYXRhKTsKLQotICAgICAgZkZyYW1lRXJyb3IgPSBjaGVja0VudmVsb3BlRGF0YSAoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEsIGhfcHJldl9kYXRhKTsKLQotICAgICAgaWYgKGZGcmFtZUVycm9yKQotICAgICAgICB7Ci0gICAgICAgICAgaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnID0gMTsKLSAgICAgICAgICBGREttZW1jcHkgKGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXYsIHRlbXBTZmJOcmdQcmV2LAotICAgICAgICAgICAgICAgICAgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mIChGSVhQX1NHTCkpOwotICAgICAgICAgIGRlY29kZUVudmVsb3BlIChoSGVhZGVyRGF0YSwgaF9zYnJfZGF0YSwgaF9wcmV2X2RhdGEsIG90aGVyQ2hhbm5lbCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CiAgICAgfQorICAgIEZES21lbWNweSh0ZW1wU2ZiTnJnUHJldiwgaF9wcmV2X2RhdGEtPnNmYl9ucmdfcHJldiwKKyAgICAgICAgICAgICAgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mKEZJWFBfU0dMKSk7CiAKLSAgcmVxdWFudGl6ZUVudmVsb3BlRGF0YSAoaF9zYnJfZGF0YSwgaF9zYnJfZGF0YS0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZSk7CisgICAgZGVsdGFUb0xpbmVhclBjbUVudmVsb3BlRGVjb2RpbmcoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEsIGhfcHJldl9kYXRhKTsKKworICAgIGZGcmFtZUVycm9yID0gY2hlY2tFbnZlbG9wZURhdGEoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEsIGhfcHJldl9kYXRhKTsKKworICAgIGlmIChmRnJhbWVFcnJvcikgeworICAgICAgaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnID0gMTsKKyAgICAgIEZES21lbWNweShoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2LCB0ZW1wU2ZiTnJnUHJldiwKKyAgICAgICAgICAgICAgICBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YoRklYUF9TR0wpKTsKKyAgICAgIGRlY29kZUVudmVsb3BlKGhIZWFkZXJEYXRhLCBoX3Nicl9kYXRhLCBoX3ByZXZfZGF0YSwgb3RoZXJDaGFubmVsKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICByZXF1YW50aXplRW52ZWxvcGVEYXRhKGhfc2JyX2RhdGEsIGhfc2JyX2RhdGEtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWUpOwogCiAgIGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZyA9IGZGcmFtZUVycm9yOwogfQogCi0KIC8qIQogICBcYnJpZWYgICBWZXJpZnkgdGhhdCBlbnZlbG9wZSBlbmVyZ2llcyBhcmUgd2l0aGluIHRoZSBhbGxvd2VkIHJhbmdlCiAgIFxyZXR1cm4gIDAgaWYgYWxsIGlzIGZpbmUsIDEgaWYgYW4gZW52ZWxvcGUgdmFsdWUgd2FzIHRvbyBoaWdoCiAqLwotc3RhdGljIGludAotY2hlY2tFbnZlbG9wZURhdGEgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwgICAgICAgLyohPCBwb2ludGVyIHRvIGN1cnJlbnQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhICAvKiE8IHBvaW50ZXIgdG8gZGF0YSBvZiBsYXN0IGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgKQoteworc3RhdGljIGludCBjaGVja0VudmVsb3BlRGF0YSgKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwgICAgICAvKiE8IHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCisgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEgLyohPCBwb2ludGVyIHRvIGRhdGEgb2YgbGFzdCBmcmFtZSAqLworKSB7CiAgIEZJWFBfU0dMICppRW52ZWxvcGUgPSBoX3Nicl9kYXRhLT5pRW52ZWxvcGU7CiAgIEZJWFBfU0dMICpzZmJfbnJnX3ByZXYgPSBoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2OwotICBpbnQgICAgaSA9IDAsIGVycm9yRmxhZyA9IDA7Ci0gIEZJWFBfU0dMIHNicl9tYXhfZW5lcmd5ID0KLSAgICAoaF9zYnJfZGF0YS0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZSA9PSAxKSA/IFNCUl9NQVhfRU5FUkdZIDogKFNCUl9NQVhfRU5FUkdZIDw8IDEpOworICBpbnQgaSA9IDAsIGVycm9yRmxhZyA9IDA7CisgIEZJWFBfU0dMIHNicl9tYXhfZW5lcmd5ID0gKGhfc2JyX2RhdGEtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWUgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTQlJfTUFYX0VORVJHWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChTQlJfTUFYX0VORVJHWSA8PCAxKTsKIAogICAvKgogICAgIFJhbmdlIGNoZWNrIGZvciBjdXJyZW50IGVuZXJnaWVzCkBAIC01NjEsNyArNTc5LDYgQEAKICAgcmV0dXJuIChlcnJvckZsYWcpOwogfQogCi0KIC8qIQogICBcYnJpZWYgICBWZXJpZnkgdGhhdCB0aGUgbm9pc2UgbGV2ZWxzIGFyZSB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UKIApAQCAtNTY5LDQ5ICs1ODYsNTUgQEAKICAgV2hlbiB0aGUgbm9pc2UtbGV2ZWxzIGFyZSBiZWluZyBkZWNvZGVkLCBpdCBpcyBhbHJlYWR5IHRvbyBsYXRlIGZvcgogICBjb25jZWFsbWVudC4gVGhlcmVmb3JlIHRoZSBub2lzZSBsZXZlbHMgYXJlIHNpbXBseSBsaW1pdGVkIGhlcmUuCiAqLwotc3RhdGljIHZvaWQKLWxpbWl0Tm9pc2VMZXZlbHMoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSkgICAgICAgLyohPCBwb2ludGVyIHRvIGN1cnJlbnQgZGF0YSAqLworc3RhdGljIHZvaWQgbGltaXROb2lzZUxldmVscygKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSkgICAvKiE8IHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCiB7CiAgIGludCBpOwogICBpbnQgbk5mYiA9IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubk5mYjsKIAotICAvKgotICAgIFNldCByYW5nZSBsaW1pdHMuIFRoZSBleGFjdCB2YWx1ZXMgZGVwZW5kIG9uIHRoZSBjb3VwbGluZyBtb2RlLgotICAgIEhvd2V2ZXIgdGhpcyBsaW1pdGF0aW9uIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBhdm9pZCB1bmxpbWl0ZWQKLSAgICBhY2N1bXVsYXRpb24gb2YgdGhlIGRlbHRhLWNvZGVkIG5vaXNlIGxldmVscy4KLSAgKi8KLSAgI2RlZmluZSBsb3dlckxpbWl0ICAgKChGSVhQX1NHTCkwKSAgICAgLyogbG93ZXJMaW1pdCBhY3R1YWxseSByZWZlcnMgdG8gdGhlIF9oaWdoZXN0XyBub2lzZSBlbmVyZ3kgKi8KLSAgI2RlZmluZSB1cHBlckxpbWl0ICAgKChGSVhQX1NHTCkzNSkgICAgLyogdXBwZXJMaW1pdCBhY3R1YWxseSByZWZlcnMgdG8gdGhlIF9sb3dlc3RfIG5vaXNlIGVuZXJneSAqLworLyoKKyAgU2V0IHJhbmdlIGxpbWl0cy4gVGhlIGV4YWN0IHZhbHVlcyBkZXBlbmQgb24gdGhlIGNvdXBsaW5nIG1vZGUuCisgIEhvd2V2ZXIgdGhpcyBsaW1pdGF0aW9uIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBhdm9pZCB1bmxpbWl0ZWQKKyAgYWNjdW11bGF0aW9uIG9mIHRoZSBkZWx0YS1jb2RlZCBub2lzZSBsZXZlbHMuCisqLworI2RlZmluZSBsb3dlckxpbWl0IFwKKyAgKChGSVhQX1NHTCkwKSAvKiBsb3dlckxpbWl0IGFjdHVhbGx5IHJlZmVycyB0byB0aGUgX2hpZ2hlc3RfIG5vaXNlIGVuZXJneSAqLworI2RlZmluZSB1cHBlckxpbWl0IFwKKyAgKChGSVhQX1NHTCkzNSkgLyogdXBwZXJMaW1pdCBhY3R1YWxseSByZWZlcnMgdG8gdGhlIF9sb3dlc3RfIG5vaXNlIGVuZXJneSAqLwogCiAgIC8qCiAgICAgUmFuZ2UgY2hlY2sgZm9yIGN1cnJlbnQgbm9pc2UgbGV2ZWxzCiAgICovCiAgIGZvciAoaSA9IDA7IGkgPCBoX3Nicl9kYXRhLT5mcmFtZUluZm8ubk5vaXNlRW52ZWxvcGVzICogbk5mYjsgaSsrKSB7Ci0gICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0gZml4TWluKGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSwgdXBwZXJMaW1pdCk7Ci0gICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0gZml4TWF4KGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSwgbG93ZXJMaW1pdCk7CisgICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0KKyAgICAgICAgZml4TWluKGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSwgdXBwZXJMaW1pdCk7CisgICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0KKyAgICAgICAgZml4TWF4KGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSwgbG93ZXJMaW1pdCk7CiAgIH0KIH0KIAotCiAvKiEKICAgXGJyaWVmICAgQ29tcGVuc2F0ZSBmb3IgdGhlIHdyb25nIHRpbWluZyB0aGF0IG1pZ2h0IG9jY3VyIGFmdGVyIGEgZnJhbWUgZXJyb3IuCiAqLwotc3RhdGljIHZvaWQKLXRpbWVDb21wZW5zYXRlRmlyc3RFbnZlbG9wZSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLCAgIC8qITwgcG9pbnRlciB0byBhY3R1YWwgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSkgIC8qITwgcG9pbnRlciB0byBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KK3N0YXRpYyB2b2lkIHRpbWVDb21wZW5zYXRlRmlyc3RFbnZlbG9wZSgKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwgICAvKiE8IHBvaW50ZXIgdG8gYWN0dWFsIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQQorICAgICAgICBoX3ByZXZfZGF0YSkgLyohPCBwb2ludGVyIHRvIGRhdGEgb2YgbGFzdCBmcmFtZSAqLwogewogICBpbnQgaSwgblNjYWxlZmFjdG9yczsKICAgRlJBTUVfSU5GTyAqcEZyYW1lSW5mbyA9ICZoX3Nicl9kYXRhLT5mcmFtZUluZm87CiAgIFVDSEFSICpuU2ZiID0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiOwotICBpbnQgZXN0aW1hdGVkU3RhcnRQb3MgPSBoX3ByZXZfZGF0YS0+c3RvcFBvcyAtIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHM7CisgIGludCBlc3RpbWF0ZWRTdGFydFBvcyA9CisgICAgICBmTWF4KDAsIGhfcHJldl9kYXRhLT5zdG9wUG9zIC0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyk7CiAgIGludCByZWZMZW4sIG5ld0xlbiwgc2hpZnQ7Ci0gIEZJWFBfU0dMICBkZWx0YUV4cDsKKyAgRklYUF9TR0wgZGVsdGFFeHA7CiAKICAgLyogT3JpZ2luYWwgbGVuZ3RoIG9mIGZpcnN0IGVudmVsb3BlIGFjY29yZGluZyB0byBiaXRzdHJlYW0gKi8KICAgcmVmTGVuID0gcEZyYW1lSW5mby0+Ym9yZGVyc1sxXSAtIHBGcmFtZUluZm8tPmJvcmRlcnNbMF07Ci0gIC8qIENvcnJlY3RlZCBsZW5ndGggb2YgZmlyc3QgZW52ZWxvcGUgKGNvbmNlYWxpbmcgY2FuIG1ha2UgdGhlIGZpcnN0IGVudmVsb3BlIGxvbmdlcikgKi8KKyAgLyogQ29ycmVjdGVkIGxlbmd0aCBvZiBmaXJzdCBlbnZlbG9wZSAoY29uY2VhbGluZyBjYW4gbWFrZSB0aGUgZmlyc3QgZW52ZWxvcGUKKyAgICogbG9uZ2VyKSAqLwogICBuZXdMZW4gPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzFdIC0gZXN0aW1hdGVkU3RhcnRQb3M7CiAKICAgaWYgKG5ld0xlbiA8PSAwKSB7CkBAIC02MjUsNyArNjQ4LDggQEAKICAgZGVsdGFFeHAgPSBGREtfZ2V0TnVtT2N0YXZlc0RpdjgobmV3TGVuLCByZWZMZW4pOwogCiAgIC8qIFNoaWZ0IGJ5IC0zIHRvIHJlc2NhbGUgbGQtdGFibGUsIGFtcFJlcy0xIHRvIGVuYWJsZSBjb2Fyc2VyIHN0ZXBzICovCi0gIHNoaWZ0ID0gKEZSQUNUX0JJVFMgLSAxIC0gRU5WX0VYUF9GUkFDVCAtIDEgKyBoX3Nicl9kYXRhLT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lIC0gMyk7CisgIHNoaWZ0ID0gKEZSQUNUX0JJVFMgLSAxIC0gRU5WX0VYUF9GUkFDVCAtIDEgKworICAgICAgICAgICBoX3Nicl9kYXRhLT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lIC0gMyk7CiAgIGRlbHRhRXhwID0gZGVsdGFFeHAgPj4gc2hpZnQ7CiAgIHBGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBlc3RpbWF0ZWRTdGFydFBvczsKICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gZXN0aW1hdGVkU3RhcnRQb3M7CkBAIC02MzgsOCArNjYyLDYgQEAKICAgfQogfQogCi0KLQogLyohCiAgIFxicmllZiAgIENvbnZlcnQgZWFjaCBlbnZlbG9wZSB2YWx1ZSBmcm9tIGxvZ2FyaXRobWljIHRvIGxpbmVhciBkb21haW4KIApAQCAtNjYwLDkgKzY4Miw4IEBACiAKICAgVGhlIGRhdGEgaXMgdGhlbiB1c2VkIGluIGNhbGN1bGF0ZVNickVudmVsb3BlKCkuCiAqLwotc3RhdGljIHZvaWQKLXJlcXVhbnRpemVFbnZlbG9wZURhdGEgKEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLCBpbnQgYW1wUmVzb2x1dGlvbikKLXsKK3N0YXRpYyB2b2lkIHJlcXVhbnRpemVFbnZlbG9wZURhdGEoSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbXBSZXNvbHV0aW9uKSB7CiAgIGludCBpOwogICBGSVhQX1NHTCBtYW50aXNzYTsKICAgaW50IGFtcFNoaWZ0ID0gMSAtIGFtcFJlc29sdXRpb247CkBAIC02NzIsMTYgKzY5MywxNSBAQAogICAgICB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhpcyBhcnJheSBoYXMgdG8gYmUgYWRhcHRlZCEKICAgKi8KICNpZiBFTlZfRVhQX0ZSQUNUCi0gIHN0YXRpYyBjb25zdCBGSVhQX1NHTCBwb3cyW0VOVl9FWFBfRlJBQ1RdID0KLSAgewotICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDEpKSksIC8qIDAuNzA3MSAqLwotICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDIpKSksIC8qIDAuNTk0NiAqLwotICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDMpKSksCi0gICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgNCkpKSwKLSAgICBGTDJGWENPTlNUX1NHTCgwLjVmICogcG93KDIuMGYsIHBvdygwLjVmLCA1KSkpLAotICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDYpKSksCi0gICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgNykpKSwKLSAgICBGTDJGWENPTlNUX1NHTCgwLjVmICogcG93KDIuMGYsIHBvdygwLjVmLCA4KSkpICAvKiAwLjUwMTMgKi8KKyAgc3RhdGljIGNvbnN0IEZJWFBfU0dMIHBvdzJbRU5WX0VYUF9GUkFDVF0gPSB7CisgICAgICBGTDJGWENPTlNUX1NHTCgwLjVmICogcG93KDIuMGYsIHBvdygwLjVmLCAxKSkpLCAvKiAwLjcwNzEgKi8KKyAgICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDIpKSksIC8qIDAuNTk0NiAqLworICAgICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgMykpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDQpKSksCisgICAgICBGTDJGWENPTlNUX1NHTCgwLjVmICogcG93KDIuMGYsIHBvdygwLjVmLCA1KSkpLAorICAgICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgNikpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDcpKSksCisgICAgICBGTDJGWENPTlNUX1NHTCgwLjVmICogcG93KDIuMGYsIHBvdygwLjVmLCA4KSkpIC8qIDAuNTAxMyAqLwogICB9OwogCiAgIGludCBiaXQsIG1hc2s7CkBAIC02OTgsMTMgKzcxOCwxMyBAQAogICAgIC8qIEFtcGxpZnkgbWFudGlzc2EgYWNjb3JkaW5nIHRvIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlCiAgICAgICAgZXhwb25lbnQgKHJlc3VsdCB3aWxsIGJlIGJldHdlZW4gMC41MDAwMDAgYW5kIDAuOTk5OTk5KQogICAgICovCi0gICAgbWFzayA9IDE7ICAvKiBiZWdpbiB3aXRoIGxvd2VzdCBiaXQgb2YgZXhwb25lbnQgKi8KKyAgICBtYXNrID0gMTsgLyogYmVnaW4gd2l0aCBsb3dlc3QgYml0IG9mIGV4cG9uZW50ICovCiAKLSAgICBmb3IgKCBiaXQ9RU5WX0VYUF9GUkFDVC0xOyBiaXQ+PTA7IGJpdC0tICkgeworICAgIGZvciAoYml0ID0gRU5WX0VYUF9GUkFDVCAtIDE7IGJpdCA+PSAwOyBiaXQtLSkgewogICAgICAgaWYgKGV4cG9uZW50ICYgbWFzaykgewogICAgICAgICAvKiBUaGUgY3VycmVudCBiaXQgb2YgdGhlIGV4cG9uZW50IGlzIHNldCwKICAgICAgICAgICAgbXVsdGlwbHkgbWFudGlzc2Egd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmYWN0b3I6ICovCi0gICAgICAgIG1hbnRpc3NhID0gKEZJWFBfU0dMKSggKG1hbnRpc3NhICogcG93MltiaXRdKSA8PCAxKTsKKyAgICAgICAgbWFudGlzc2EgPSAoRklYUF9TR0wpKChtYW50aXNzYSAqIHBvdzJbYml0XSkgPDwgMSk7CiAgICAgICB9CiAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgYml0ICovCiAgICAgICBtYXNrID0gbWFzayA8PCAxOwpAQCAtNzE0LDQwICs3MzQsNDMgQEAKICAgICBleHBvbmVudCA9IGV4cG9uZW50ID4+IEVOVl9FWFBfRlJBQ1Q7CiAKICNlbHNlCi0gICAgLyogSW4gY2FzZSBvZiB0aGUgaGlnaCBhbXBsaXR1ZGUgcmVzb2x1dGlvbiwgMSBiaXQgb2YgdGhlIGV4cG9uZW50IGdldHMgbG9zdCBieSB0aGUgc2hpZnQuCi0gICAgICAgVGhpcyB3aWxsIGJlIGNvbXBlbnNhdGVkIGJ5IGEgbWFudGlzc2Egb2YgMC41KnNxcnQoMikgaW5zdGVhZCBvZiAwLjUgaWYgdGhhdCBiaXQgaXMgMS4gKi8KLSAgICBtYW50aXNzYSA9IChleHBvbmVudCAmIGFtcFNoaWZ0KSA/IEZMMkZYQ09OU1RfU0dMKDAuNzA3MTA2NzgxMTg2NTQ4ZikgOiBGTDJGWENPTlNUX1NHTCgwLjVmKTsKKyAgICAvKiBJbiBjYXNlIG9mIHRoZSBoaWdoIGFtcGxpdHVkZSByZXNvbHV0aW9uLCAxIGJpdCBvZiB0aGUgZXhwb25lbnQgZ2V0cyBsb3N0CisgICAgICAgYnkgdGhlIHNoaWZ0LiBUaGlzIHdpbGwgYmUgY29tcGVuc2F0ZWQgYnkgYSBtYW50aXNzYSBvZiAwLjUqc3FydCgyKQorICAgICAgIGluc3RlYWQgb2YgMC41IGlmIHRoYXQgYml0IGlzIDEuICovCisgICAgbWFudGlzc2EgPSAoZXhwb25lbnQgJiBhbXBTaGlmdCkgPyBGTDJGWENPTlNUX1NHTCgwLjcwNzEwNjc4MTE4NjU0OGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGTDJGWENPTlNUX1NHTCgwLjVmKTsKICAgICBleHBvbmVudCA9IGV4cG9uZW50ID4+IGFtcFNoaWZ0OwogI2VuZGlmCiAKICAgICAvKgotICAgICAgTWFudGlzc2Egd2FzIHNldCB0byAwLjUgKGluc3RlYWQgb2YgMS4wLCB0aGVyZWZvcmUgaW5jcmVhc2UgZXhwb25lbnQgYnkgMSkuCi0gICAgICBNdWx0aXBseSBieSBMPW5DaGFubmVscz02NCBieSBpbmNyZWFzaW5nIGV4cG9uZW50IGJ5IGFub3RoZXIgNi4KKyAgICAgIE1hbnRpc3NhIHdhcyBzZXQgdG8gMC41IChpbnN0ZWFkIG9mIDEuMCwgdGhlcmVmb3JlIGluY3JlYXNlIGV4cG9uZW50IGJ5CisgICAgICAxKS4gTXVsdGlwbHkgYnkgTD1uQ2hhbm5lbHM9NjQgYnkgaW5jcmVhc2luZyBleHBvbmVudCBieSBhbm90aGVyIDYuCiAgICAgICA9PiBJbmNyZWFzZSBleHBvbmVudCBieSA3CiAgICAgKi8KICAgICBleHBvbmVudCArPSA3ICsgTlJHX0VYUF9PRkZTRVQ7CiAKICAgICAvKiBDb21iaW5lIG1hbnRpc3NhIGFuZCBleHBvbmVudCBhbmQgd3JpdGUgYmFjayB0aGUgcmVzdWx0ICovCi0gICAgaF9zYnJfZGF0YS0+aUVudmVsb3BlW2ldID0gKEZJWFBfU0dMKSgoKExPTkcpbWFudGlzc2EgJiBNQVNLX00pIHwgKGV4cG9uZW50ICYgTUFTS19FKSk7Ci0KKyAgICBoX3Nicl9kYXRhLT5pRW52ZWxvcGVbaV0gPQorICAgICAgICAoKEZJWFBfU0dMKSgoU0hPUlQpKEZJWFBfU0dMKW1hbnRpc3NhICYgTUFTS19NKSkgKworICAgICAgICAoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpZXhwb25lbnQgJiBNQVNLX0UpOwogICB9CiB9CiAKLQogLyohCiAgIFxicmllZiAgIEJ1aWxkIG5ldyByZWZlcmVuY2UgZW5lcmdpZXMgZnJvbSBvbGQgb25lcyBhbmQgZGVsdGEgY29kZWQgZGF0YQogKi8KLXN0YXRpYyB2b2lkCi1kZWx0YVRvTGluZWFyUGNtRW52ZWxvcGVEZWNvZGluZyAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLCAgICAgICAvKiE8IHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEpIC8qITwgcG9pbnRlciB0byBwcmV2aW91cyBkYXRhICovCitzdGF0aWMgdm9pZCBkZWx0YVRvTGluZWFyUGNtRW52ZWxvcGVEZWNvZGluZygKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsICAgICAgIC8qITwgcG9pbnRlciB0byBjdXJyZW50IGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSkgLyohPCBwb2ludGVyIHRvIHByZXZpb3VzIGRhdGEgKi8KIHsKICAgaW50IGksIGRvbWFpbiwgbm9fb2ZfYmFuZHMsIGJhbmQsIGZyZXFSZXM7CiAKICAgRklYUF9TR0wgKnNmYl9ucmdfcHJldiA9IGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXY7CiAgIEZJWFBfU0dMICpwdHJfbnJnID0gaF9zYnJfZGF0YS0+aUVudmVsb3BlOwogCi0gIGludCBvZmZzZXQgPSAyICogaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzBdIC0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzFdOworICBpbnQgb2Zmc2V0ID0KKyAgICAgIDIgKiBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmJbMF0gLSBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmJbMV07CiAKICAgZm9yIChpID0gMDsgaSA8IGhfc2JyX2RhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzOyBpKyspIHsKICAgICBkb21haW4gPSBoX3Nicl9kYXRhLT5kb21haW5fdmVjW2ldOwpAQCAtNzU5LDIyICs3ODIsMTggQEAKIAogICAgIEZES19BU1NFUlQobm9fb2ZfYmFuZHMgPCAoNjQpKTsKIAotICAgIGlmIChkb21haW4gPT0gMCkKLSAgICB7CisgICAgaWYgKGRvbWFpbiA9PSAwKSB7CiAgICAgICBtYXBMb3dSZXNFbmVyZ3lWYWwoKnB0cl9ucmcsIHNmYl9ucmdfcHJldiwgb2Zmc2V0LCAwLCBmcmVxUmVzKTsKICAgICAgIHB0cl9ucmcrKzsKLSAgICAgIGZvciAoYmFuZCA9IDE7IGJhbmQgPCBub19vZl9iYW5kczsgYmFuZCsrKQotICAgICAgewotICAgICAgICAqcHRyX25yZyA9ICpwdHJfbnJnICsgKihwdHJfbnJnLTEpOworICAgICAgZm9yIChiYW5kID0gMTsgYmFuZCA8IG5vX29mX2JhbmRzOyBiYW5kKyspIHsKKyAgICAgICAgKnB0cl9ucmcgPSAqcHRyX25yZyArICoocHRyX25yZyAtIDEpOwogICAgICAgICBtYXBMb3dSZXNFbmVyZ3lWYWwoKnB0cl9ucmcsIHNmYl9ucmdfcHJldiwgb2Zmc2V0LCBiYW5kLCBmcmVxUmVzKTsKICAgICAgICAgcHRyX25yZysrOwogICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG5vX29mX2JhbmRzOyBiYW5kKyspCi0gICAgICB7Ci0gICAgICAgICpwdHJfbnJnID0gKnB0cl9ucmcgKyBzZmJfbnJnX3ByZXZbaW5kZXhMb3cySGlnaChvZmZzZXQsIGJhbmQsIGZyZXFSZXMpXTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG5vX29mX2JhbmRzOyBiYW5kKyspIHsKKyAgICAgICAgKnB0cl9ucmcgPQorICAgICAgICAgICAgKnB0cl9ucmcgKyBzZmJfbnJnX3ByZXZbaW5kZXhMb3cySGlnaChvZmZzZXQsIGJhbmQsIGZyZXFSZXMpXTsKICAgICAgICAgbWFwTG93UmVzRW5lcmd5VmFsKCpwdHJfbnJnLCBzZmJfbnJnX3ByZXYsIG9mZnNldCwgYmFuZCwgZnJlcVJlcyk7CiAgICAgICAgIHB0cl9ucmcrKzsKICAgICAgIH0KQEAgLTc4MiwxNCArODAxLDEzIEBACiAgIH0KIH0KIAotCiAvKiEKICAgXGJyaWVmICAgQnVpbGQgbmV3IG5vaXNlIGxldmVscyBmcm9tIG9sZCBvbmVzIGFuZCBkZWx0YSBjb2RlZCBkYXRhCiAqLwotc3RhdGljIHZvaWQKLWRlY29kZU5vaXNlRmxvb3JsZXZlbHMgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLCAgICAgICAvKiE8IHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSkgLyohPCBwb2ludGVyIHRvIHByZXZpb3VzIGRhdGEgKi8KK3N0YXRpYyB2b2lkIGRlY29kZU5vaXNlRmxvb3JsZXZlbHMoCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLCAgICAgICAvKiE8IHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCisgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEpIC8qITwgcG9pbnRlciB0byBwcmV2aW91cyBkYXRhICovCiB7CiAgIGludCBpOwogICBpbnQgbk5mYiA9IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubk5mYjsKQEAgLTgwMyw4ICs4MjEsNyBAQAogICAgICAgbm9pc2VMZXZlbCArPSBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV07CiAgICAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gPSBub2lzZUxldmVsOwogICAgIH0KLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBmb3IgKGkgPSAwOyBpIDwgbk5mYjsgaSsrKSB7CiAgICAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gKz0gaF9wcmV2X2RhdGEtPnByZXZOb2lzZUxldmVsW2ldOwogICAgIH0KQEAgLTgxNiwxNCArODMzLDE0IEBACiAgIGlmIChuTm9pc2VGbG9vckVudmVsb3BlcyA+IDEpIHsKICAgICBpZiAoaF9zYnJfZGF0YS0+ZG9tYWluX3ZlY19ub2lzZVsxXSA9PSAwKSB7CiAgICAgICBGSVhQX1NHTCBub2lzZUxldmVsID0gaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW25OZmJdOwotICAgICAgZm9yIChpID0gbk5mYiArIDE7IGkgPCAyKm5OZmI7IGkrKykgeworICAgICAgZm9yIChpID0gbk5mYiArIDE7IGkgPCAyICogbk5mYjsgaSsrKSB7CiAgICAgICAgIG5vaXNlTGV2ZWwgKz0gaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldOwogICAgICAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gPSBub2lzZUxldmVsOwogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgZm9yIChpID0gMDsgaSA8IG5OZmI7IGkrKykgewotICAgICAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSArIG5OZmJdICs9IGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXTsKKyAgICAgICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2kgKyBuTmZiXSArPQorICAgICAgICAgICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtODMyLDIxICs4NDksMjAgQEAKIAogICAvKiBVcGRhdGUgcHJldk5vaXNlTGV2ZWwgd2l0aCB0aGUgbGFzdCBub2lzZSBlbnZlbG9wZSAqLwogICBmb3IgKGkgPSAwOyBpIDwgbk5mYjsgaSsrKQotICAgIGhfcHJldl9kYXRhLT5wcmV2Tm9pc2VMZXZlbFtpXSA9IGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpICsgbk5mYioobk5vaXNlRmxvb3JFbnZlbG9wZXMtMSldOwotCisgICAgaF9wcmV2X2RhdGEtPnByZXZOb2lzZUxldmVsW2ldID0KKyAgICAgICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2kgKyBuTmZiICogKG5Ob2lzZUZsb29yRW52ZWxvcGVzIC0gMSldOwogCiAgIC8qIFJlcXVhbnRpemUgdGhlIG5vaXNlIGZsb29yIGxldmVscyBpbiBDT1VQTElOR19PRkYtbW9kZSAqLwogICBpZiAoIWhfc2JyX2RhdGEtPmNvdXBsaW5nKSB7CiAgICAgaW50IG5mX2U7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbk5vaXNlRmxvb3JFbnZlbG9wZXMqbk5mYjsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG5Ob2lzZUZsb29yRW52ZWxvcGVzICogbk5mYjsgaSsrKSB7CiAgICAgICBuZl9lID0gNiAtIChMT05HKWhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSArIDEgKyBOT0lTRV9FWFBfT0ZGU0VUOwogICAgICAgLyogKzEgdG8gY29tcGVuc2F0ZSBmb3IgYSBtYW50aXNzYSBvZiAwLjUgaW5zdGVhZCBvZiAxLjAgKi8KIAogICAgICAgaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0KLSAgICAgICAgKEZJWFBfU0dMKSggKChMT05HKUZMMkZYQ09OU1RfU0dMKDAuNWYpKSArICAvKiBtYW50aXNzYSAqLwotICAgICAgICAgICAgICAgICAgKG5mX2UgJiBNQVNLX0UpICk7IC8qIGV4cG9uZW50ICovCi0KKyAgICAgICAgICAoRklYUF9TR0wpKCgoTE9ORylGTDJGWENPTlNUX1NHTCgwLjVmKSkgKyAvKiBtYW50aXNzYSAqLworICAgICAgICAgICAgICAgICAgICAgKG5mX2UgJiBNQVNLX0UpKTsgICAgICAgICAgICAgIC8qIGV4cG9uZW50ICovCiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL2Vudl9kZWMuaCBiL2xpYlNCUmRlYy9zcmMvZW52X2RlYy5oCmluZGV4IDZmNmRhZTMuLjBiMTFjZTEgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvZW52X2RlYy5oCisrKyBiL2xpYlNCUmRlYy9zcmMvZW52X2RlYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIzICs5MCwzMCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIEVudmVsb3BlIGRlY29kaW5nICAKKyAgXGJyaWVmICBFbnZlbG9wZSBkZWNvZGluZwogKi8KLSNpZm5kZWYgX19FTlZfREVDX0gKLSNkZWZpbmUgX19FTlZfREVDX0gKKyNpZm5kZWYgRU5WX0RFQ19ICisjZGVmaW5lIEVOVl9ERUNfSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogI2luY2x1ZGUgImVudl9leHRyLmgiCiAKLXZvaWQgZGVjb2RlU2JyRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9sZWZ0LAotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YV9sZWZ0LAotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX3JpZ2h0LAotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YV9yaWdodCk7Ci0KK3ZvaWQgZGVjb2RlU2JyRGF0YShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2RhdGFfbGVmdCwKKyAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YV9sZWZ0LAorICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2RhdGFfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGFfcmlnaHQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvZW52X2V4dHIuY3BwIGIvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5jcHAKaW5kZXggNGQ1M2ExMy4uZTZhZTZkYyAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDcgKzkwLDY1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgRW52ZWxvcGUgZXh0cmFjdGlvbiAgCi0gIFRoZSBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUgYXJlIG1vc3RseSBjYWxsZWQgYnkgYXBwbHlTQlIoKS4gQWZ0ZXIgaXQgaXMKLSAgZGV0ZXJtaW5lZCB0aGF0IHRoZXJlIGlzIHZhbGlkIFNCUiBkYXRhLCBzYnJHZXRIZWFkZXJEYXRhKCkgbWlnaHQgYmUgY2FsbGVkIGlmIHRoZSBjdXJyZW50Ci0gIFNCUiBkYXRhIGNvbnRhaW5zIGFuIFxyZWYgU0JSX0hFQURFUl9FTEVNRU5UIGFzIG9wcG9zZWQgdG8gYSBccmVmIFNCUl9TVEFOREFSRF9FTEVNRU5ULiBUaGlzIGZ1bmN0aW9uCi0gIG1heSByZXR1cm4gdmFyaW91cyBlcnJvciBjb2RlcyBhcyBkZWZpbmVkIGluICNTQlJfSEVBREVSX1NUQVRVUyAuIE1vc3QgaW1wb3J0YW50bHkgaXQgcmV0dXJucyBIRUFERVJfUkVTRVQgd2hlbiBkZWNvZGVyCi0gIHNldHRpbmdzIG5lZWQgdG8gYmUgcmVjYWxjdWxhdGVkIGFjY29yZGluZyB0byB0aGUgU0JSIHNwZWNpZmljYXRpb25zLiBJbiB0aGF0IGNhc2UgYXBwbHlTQlIoKQotICB3aWxsIGluaXRpYXRpdGUgdGhlIHJlcXVpcmVkIHJlLWNvbmZpZ3VyYXRpb24uCisgIFxicmllZiAgRW52ZWxvcGUgZXh0cmFjdGlvbgorICBUaGUgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoaXMgbW9kdWxlIGFyZSBtb3N0bHkgY2FsbGVkIGJ5IGFwcGx5U0JSKCkuIEFmdGVyCisgIGl0IGlzIGRldGVybWluZWQgdGhhdCB0aGVyZSBpcyB2YWxpZCBTQlIgZGF0YSwgc2JyR2V0SGVhZGVyRGF0YSgpIG1pZ2h0IGJlCisgIGNhbGxlZCBpZiB0aGUgY3VycmVudCBTQlIgZGF0YSBjb250YWlucyBhbiBccmVmIFNCUl9IRUFERVJfRUxFTUVOVCBhcyBvcHBvc2VkCisgIHRvIGEgXHJlZiBTQlJfU1RBTkRBUkRfRUxFTUVOVC4gVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIHZhcmlvdXMgZXJyb3IgY29kZXMKKyAgYXMgZGVmaW5lZCBpbiAjU0JSX0hFQURFUl9TVEFUVVMgLiBNb3N0IGltcG9ydGFudGx5IGl0IHJldHVybnMgSEVBREVSX1JFU0VUCisgIHdoZW4gZGVjb2RlciBzZXR0aW5ncyBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIFNCUgorICBzcGVjaWZpY2F0aW9ucy4gSW4gdGhhdCBjYXNlIGFwcGx5U0JSKCkgd2lsbCBpbml0aWF0aXRlIHRoZSByZXF1aXJlZAorICByZS1jb25maWd1cmF0aW9uLgogCiAgIFRoZSBoZWFkZXIgZGF0YSBpcyBzdG9yZWQgaW4gYSAjU0JSX0hFQURFUl9EQVRBIHN0cnVjdHVyZS4KIAotICBUaGUgYWN0dWFsIFNCUiBkYXRhIGZvciB0aGUgY3VycmVudCBmcmFtZSBpcyBkZWNvZGVkIGludG8gU0JSX0ZSQU1FX0RBVEEgc3R1Y3R1cmVzIGJ5IHNickdldENoYW5uZWxQYWlyRWxlbWVudCgpCi0gIFtmb3Igc3RlcmVvIHN0cmVhbXNdIGFuZCBzYnJHZXRTaW5nbGVDaGFubmVsRWxlbWVudCgpIFtmb3IgbW9ubyBzdHJlYW1zXS4gVGhlcmUgaXMgbm8gZnJhY3Rpb25hbCBhcml0aG1ldGljIGludm9sdmVkLgorICBUaGUgYWN0dWFsIFNCUiBkYXRhIGZvciB0aGUgY3VycmVudCBmcmFtZSBpcyBkZWNvZGVkIGludG8gU0JSX0ZSQU1FX0RBVEEKKyAgc3R1Y3R1cmVzIGJ5IHNickdldENoYW5uZWxQYWlyRWxlbWVudCgpIFtmb3Igc3RlcmVvIHN0cmVhbXNdIGFuZAorICBzYnJHZXRTaW5nbGVDaGFubmVsRWxlbWVudCgpIFtmb3IgbW9ubyBzdHJlYW1zXS4gVGhlcmUgaXMgbm8gZnJhY3Rpb25hbAorICBhcml0aG1ldGljIGludm9sdmVkLgogCi0gIE9uY2UgdGhlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCwgdGhlIGRhdGEgbmVlZHMgdG8gYmUgZnVydGhlciBwcmVwYXJlZCBiZWZvcmUgdGhlIGFjdHVhbCBkZWNvZGluZyBwcm9jZXNzLgotICBUaGlzIGlzIGRvbmUgaW4gZGVjb2RlU2JyRGF0YSgpLgorICBPbmNlIHRoZSBpbmZvcm1hdGlvbiBpcyBleHRyYWN0ZWQsIHRoZSBkYXRhIG5lZWRzIHRvIGJlIGZ1cnRoZXIgcHJlcGFyZWQKKyAgYmVmb3JlIHRoZSBhY3R1YWwgZGVjb2RpbmcgcHJvY2Vzcy4gVGhpcyBpcyBkb25lIGluIGRlY29kZVNickRhdGEoKS4KIAogICBcc2EgRGVzY3JpcHRpb24gb2YgYnVmZmVyIG1hbmFnZW1lbnQgaW4gYXBwbHlTQlIoKS4gXHJlZiBkb2N1bWVudGF0aW9uT3ZlcnZpZXcKIAogICA8aDE+QWJvdXQgdGhlIFNCUiBkYXRhIGZvcm1hdDo8L2gxPgogCi0gIEVhY2ggZnJhbWUgaW5jbHVkZXMgU0JSIGRhdGEgKHNpZGUgY2hhaW4gaW5mb3JtYXRpb24pLCBhbmQgY2FuIGJlIGVpdGhlciB0aGUgXHJlZiBTQlJfSEVBREVSX0VMRU1FTlQgb3IgdGhlIFxyZWYgU0JSX1NUQU5EQVJEX0VMRU1FTlQuCi0gIFBhcnRzIG9mIHRoZSBkYXRhIGNhbiBiZSBwcm90ZWN0ZWQgYnkgYSBDUkMgY2hlY2tzdW0uCisgIEVhY2ggZnJhbWUgaW5jbHVkZXMgU0JSIGRhdGEgKHNpZGUgY2hhaW4gaW5mb3JtYXRpb24pLCBhbmQgY2FuIGJlIGVpdGhlciB0aGUKKyAgXHJlZiBTQlJfSEVBREVSX0VMRU1FTlQgb3IgdGhlIFxyZWYgU0JSX1NUQU5EQVJEX0VMRU1FTlQuIFBhcnRzIG9mIHRoZSBkYXRhCisgIGNhbiBiZSBwcm90ZWN0ZWQgYnkgYSBDUkMgY2hlY2tzdW0uCiAKICAgXGFuY2hvciBTQlJfSEVBREVSX0VMRU1FTlQgPGgyPlRoZSBTQlJfSEVBREVSX0VMRU1FTlQ8L2gyPgogCi0gIFRoZSBTQlJfSEVBREVSX0VMRU1FTlQgY2FuIGJlIHRyYW5zbWl0dGVkIHdpdGggZXZlcnkgZnJhbWUsIGhvd2V2ZXIsIGl0IHR5cGljYWxseSBpcyBzZW5kIGV2ZXJ5IHNlY29uZCBvciBzby4gSXQgY29udGFpbnMgZnVuZGFtZW50YWwKLSAgaW5mb3JtYXRpb24gc3VjaCBhcyBTQlIgc2FtcGxpbmcgZnJlcXVlbmN5IGFuZCBmcmVxdWVuY3kgcmFuZ2UgYXMgd2VsbCBhcyBjb250cm9sIHNpZ25hbHMgdGhhdCBkbyBub3QgcmVxdWlyZSBmcmVxdWVudCBjaGFuZ2VzLiBJdCBhbHNvCi0gIGluY2x1ZGVzIHRoZSBccmVmIFNCUl9TVEFOREFSRF9FTEVNRU5ULgorICBUaGUgU0JSX0hFQURFUl9FTEVNRU5UIGNhbiBiZSB0cmFuc21pdHRlZCB3aXRoIGV2ZXJ5IGZyYW1lLCBob3dldmVyLCBpdAorICB0eXBpY2FsbHkgaXMgc2VuZCBldmVyeSBzZWNvbmQgb3Igc28uIEl0IGNvbnRhaW5zIGZ1bmRhbWVudGFsIGluZm9ybWF0aW9uIHN1Y2gKKyAgYXMgU0JSIHNhbXBsaW5nIGZyZXF1ZW5jeSBhbmQgZnJlcXVlbmN5IHJhbmdlIGFzIHdlbGwgYXMgY29udHJvbCBzaWduYWxzIHRoYXQKKyAgZG8gbm90IHJlcXVpcmUgZnJlcXVlbnQgY2hhbmdlcy4gSXQgYWxzbyBpbmNsdWRlcyB0aGUgXHJlZgorICBTQlJfU1RBTkRBUkRfRUxFTUVOVC4KIAotICBEZXBlbmRpbmcgb24gdGhlIGNoYW5nZXMgYmV0d2VlbiB0aGUgaW5mb3JtYXRpb24gaW4gYSBjdXJyZW50IFNCUl9IRUFERVJfRUxFTUVOVCBhbmQgdGhlIHByZXZpb3VzIFNCUl9IRUFERVJfRUxFTUVOVCwgdGhlIFNCUiBkZWNvZGVyIG1pZ2h0IG5lZWQKLSAgdG8gYmUgcmVzZXQgYW5kIHJlY29uZmlndXJlZCAoZS5nLiBuZXcgdGFibGVzIG5lZWQgdG8gYmUgY2FsY3VsYXRlZCkuCisgIERlcGVuZGluZyBvbiB0aGUgY2hhbmdlcyBiZXR3ZWVuIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGN1cnJlbnQKKyAgU0JSX0hFQURFUl9FTEVNRU5UIGFuZCB0aGUgcHJldmlvdXMgU0JSX0hFQURFUl9FTEVNRU5ULCB0aGUgU0JSIGRlY29kZXIgbWlnaHQKKyAgbmVlZCB0byBiZSByZXNldCBhbmQgcmVjb25maWd1cmVkIChlLmcuIG5ldyB0YWJsZXMgbmVlZCB0byBiZSBjYWxjdWxhdGVkKS4KIAogICBcYW5jaG9yIFNCUl9TVEFOREFSRF9FTEVNRU5UIDxoMj5UaGUgU0JSX1NUQU5EQVJEX0VMRU1FTlQ8L2gyPgogCi0gIFRoaXMgZGF0YSBjYW4gYmUgc3ViZGl2aWRlZCBpbnRvICJzaWRlIGluZm8iIGFuZCAicmF3IGRhdGEiLCB3aGVyZSBzaWRlIGluZm8gaXMgZGVmaW5lZCBhcyBzaWduYWxzIG5lZWRlZCB0byBkZWNvZGUgdGhlIHJhdyBkYXRhCi0gIGFuZCBzb21lIGRlY29kZXIgdHVuaW5nIHNpZ25hbHMuIFJhdyBkYXRhIGlzIHJlZmVycmVkIHRvIGFzIFBDTSBhbmQgSHVmZm1hbiBjb2RlZCBlbnZlbG9wZSBhbmQgbm9pc2UgZmxvb3IgZXN0aW1hdGVzLiBUaGUgc2lkZSBpbmZvIGFsc28KLSAgaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRpbWUtZnJlcXVlbmN5IGdyaWQgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgorICBUaGlzIGRhdGEgY2FuIGJlIHN1YmRpdmlkZWQgaW50byAic2lkZSBpbmZvIiBhbmQgInJhdyBkYXRhIiwgd2hlcmUgc2lkZSBpbmZvCisgIGlzIGRlZmluZWQgYXMgc2lnbmFscyBuZWVkZWQgdG8gZGVjb2RlIHRoZSByYXcgZGF0YSBhbmQgc29tZSBkZWNvZGVyIHR1bmluZworICBzaWduYWxzLiBSYXcgZGF0YSBpcyByZWZlcnJlZCB0byBhcyBQQ00gYW5kIEh1ZmZtYW4gY29kZWQgZW52ZWxvcGUgYW5kIG5vaXNlCisgIGZsb29yIGVzdGltYXRlcy4gVGhlIHNpZGUgaW5mbyBhbHNvIGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICB0aW1lLWZyZXF1ZW5jeSBncmlkIGZvciB0aGUgY3VycmVudCBmcmFtZS4KIAogICBcc2EgXHJlZiBkb2N1bWVudGF0aW9uT3ZlcnZpZXcKICovCkBAIC0xMzAsNjAgKzE1OSwxMTUgQEAKICNpbmNsdWRlICJzYnJfcm9tLmgiCiAjaW5jbHVkZSAiaHVmZl9kZWMuaCIKIAotCiAjaW5jbHVkZSAicHNiaXRkZWMuaCIKIAotI2RlZmluZSBEUk1fUEFSQU1FVFJJQ19TVEVSRU8gICAwCi0jZGVmaW5lIEVYVEVOU0lPTl9JRF9QU19DT0RJTkcgIDIKKyNkZWZpbmUgRFJNX1BBUkFNRVRSSUNfU1RFUkVPIDAKKyNkZWZpbmUgRVhURU5TSU9OX0lEX1BTX0NPRElORyAyCiAKK3N0YXRpYyBpbnQgZXh0cmFjdFB2Y0ZyYW1lSW5mbygKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsICAgICAgICAgICAvKiE8IGJpdGJ1ZmZlciBoYW5kbGUgKi8KKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLCAvKiE8IHBvaW50ZXIgdG8gbWVtb3J5IHdoZXJlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLWluZm8gd2lsbCBiZSBzdG9yZWQgKi8KKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZnJhbWVfZGF0YSwgLyohPCBwb2ludGVyIHRvIG1lbW9yeSB3aGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJldmlvdXMgZnJhbWUtaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCAqLworICAgIFVDSEFSIHB2Y19tb2RlX2xhc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBWQyBtb2RlIG9mIGxhc3QgZnJhbWUgKi8KKyAgICBjb25zdCBVSU5UIGZsYWdzKTsKK3N0YXRpYyBpbnQgZXh0cmFjdEZyYW1lSW5mbyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnJPZkNoYW5uZWxzLCBjb25zdCBVSU5UIGZsYWdzKTsKIAotc3RhdGljIGludCBleHRyYWN0RnJhbWVJbmZvIChIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoX2ZyYW1lX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgbnJPZkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK3N0YXRpYyBpbnQgc2JyR2V0UHZjRW52ZWxvcGUoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZnJhbWVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHB2Y01vZGUpOworc3RhdGljIGludCBzYnJHZXRFbnZlbG9wZShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGNvbnN0IFVJTlQgZmxhZ3MpOwogCitzdGF0aWMgdm9pZCBzYnJHZXREaXJlY3Rpb25Db250cm9sRGF0YShIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IGludCBic19wdmNfbW9kZSk7CiAKLXN0YXRpYyBpbnQgc2JyR2V0RW52ZWxvcGUgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfZnJhbWVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7CitzdGF0aWMgdm9pZCBzYnJHZXROb2lzZUZsb29yRGF0YShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZnJhbWVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyk7CiAKLXN0YXRpYyB2b2lkIHNickdldERpcmVjdGlvbkNvbnRyb2xEYXRhIChIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpOworc3RhdGljIGludCBjaGVja0ZyYW1lSW5mbyhGUkFNRV9JTkZPICpwRnJhbWVJbmZvLCBpbnQgbnVtYmVyT2ZUaW1lU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdmVybGFwLCBpbnQgdGltZVN0ZXApOwogCi1zdGF0aWMgdm9pZCBzYnJHZXROb2lzZUZsb29yRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfZnJhbWVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcyk7CisvKiBNYXBwaW5nIHRvIHN0ZCBzYW1wbGVyYXRlIHRhYmxlIGFjY29yZGluZyB0byAxNDQ5Ni0zICg0LjYuMTguMi42KSAqLwordHlwZWRlZiBzdHJ1Y3QgU1JfTUFQUElORyB7CisgIFVJTlQgZnNSYW5nZUxvOyAvKiBJZiBmc1JhbmdlTG8obisxKT5mcz49ZnNSYW5nZUxvKG4pLCBpdCB3aWxsIGJlIG1hcHBlZCB0by4uLgorICAgICAgICAgICAgICAgICAgICovCisgIFVJTlQgZnNNYXBwZWQ7ICAvKiBmc01hcHBlZC4gKi8KK30gU1JfTUFQUElORzsKIAotc3RhdGljIGludCBjaGVja0ZyYW1lSW5mbyAoRlJBTUVfSU5GTyAqcEZyYW1lSW5mbywgaW50IG51bWJlck9mVGltZVNsb3RzLCBpbnQgb3ZlcmxhcCwgaW50IHRpbWVTdGVwKTsKK3N0YXRpYyBjb25zdCBTUl9NQVBQSU5HIHN0ZFNhbXBsZVJhdGVzTWFwcGluZ1tdID0geworICAgIHswLCA4MDAwfSwgICAgICB7OTM5MSwgMTEwMjV9LCAgezExNTAyLCAxMjAwMH0sIHsxMzg1NiwgMTYwMDB9LAorICAgIHsxODc4MywgMjIwNTB9LCB7MjMwMDQsIDI0MDAwfSwgezI3NzEzLCAzMjAwMH0sIHszNzU2NiwgNDQxMDB9LAorICAgIHs0NjAwOSwgNDgwMDB9LCB7NTU0MjYsIDY0MDAwfSwgezc1MTMyLCA4ODIwMH0sIHs5MjAxNywgOTYwMDB9fTsKK3N0YXRpYyBjb25zdCBTUl9NQVBQSU5HIHN0ZFNhbXBsZVJhdGVzTWFwcGluZ1VzYWNbXSA9IHsKKyAgICB7MCwgMTYwMDB9LCAgICAgezE4NzgzLCAyMjA1MH0sIHsyMzAwNCwgMjQwMDB9LCB7Mjc3MTMsIDMyMDAwfSwKKyAgICB7MzU3NzcsIDQwMDAwfSwgezQyMDAwLCA0NDEwMH0sIHs0NjAwOSwgNDgwMDB9LCB7NTU0MjYsIDY0MDAwfSwKKyAgICB7NzUxMzIsIDg4MjAwfSwgezkyMDE3LCA5NjAwMH19OworCitVSU5UIHNicmRlY19tYXBUb1N0ZFNhbXBsZVJhdGUoVUlOVCBmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGlzVXNhYykgLyohPCBPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCit7CisgIFVJTlQgZnNNYXBwZWQgPSBmcywgdGFibGVTaXplID0gMDsKKyAgY29uc3QgU1JfTUFQUElORyAqbWFwcGluZ1RhYmxlOworICBpbnQgaTsKKworICBpZiAoIWlzVXNhYykgeworICAgIG1hcHBpbmdUYWJsZSA9IHN0ZFNhbXBsZVJhdGVzTWFwcGluZzsKKyAgICB0YWJsZVNpemUgPSBzaXplb2Yoc3RkU2FtcGxlUmF0ZXNNYXBwaW5nKSAvIHNpemVvZihTUl9NQVBQSU5HKTsKKyAgfSBlbHNlIHsKKyAgICBtYXBwaW5nVGFibGUgPSBzdGRTYW1wbGVSYXRlc01hcHBpbmdVc2FjOworICAgIHRhYmxlU2l6ZSA9IHNpemVvZihzdGRTYW1wbGVSYXRlc01hcHBpbmdVc2FjKSAvIHNpemVvZihTUl9NQVBQSU5HKTsKKyAgfQorCisgIGZvciAoaSA9IHRhYmxlU2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKGZzID49IG1hcHBpbmdUYWJsZVtpXS5mc1JhbmdlTG8pIHsKKyAgICAgIGZzTWFwcGVkID0gbWFwcGluZ1RhYmxlW2ldLmZzTWFwcGVkOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChmc01hcHBlZCk7Cit9CiAKIFNCUl9FUlJPUgotaW5pdEhlYWRlckRhdGEgKAotICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICBoSGVhZGVyRGF0YSwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUluLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlT3V0LAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgIGZsYWdzCi0gICAgICAgICkKLXsKK2luaXRIZWFkZXJEYXRhKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIGNvbnN0IGludCBzYW1wbGVSYXRlSW4sCisgICAgICAgICAgICAgICBjb25zdCBpbnQgc2FtcGxlUmF0ZU91dCwgY29uc3QgSU5UIGRvd25zY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsIGNvbnN0IFVJTlQgZmxhZ3MsCisgICAgICAgICAgICAgICBjb25zdCBpbnQgc2V0RGVmYXVsdEhkcikgewogICBIQU5ETEVfRlJFUV9CQU5EX0RBVEEgaEZyZXEgPSAmaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YTsKICAgU0JSX0VSUk9SIHNickVycm9yID0gU0JSREVDX09LOwogICBpbnQgbnVtQW5hbHlzaXNCYW5kczsKKyAgaW50IHNhbXBsZVJhdGVQcm9jOwogCi0gIGlmICggc2FtcGxlUmF0ZUluID09IHNhbXBsZVJhdGVPdXQgKSB7Ci0gICAgaEhlYWRlckRhdGEtPnNiclByb2NTbXBsUmF0ZSA9IHNhbXBsZVJhdGVPdXQ8PDE7CisgIGlmICghKGZsYWdzICYgKFNCUkRFQ19TWU5UQVhfVVNBQyB8IFNCUkRFQ19TWU5UQVhfUlNWRDUwKSkpIHsKKyAgICBzYW1wbGVSYXRlUHJvYyA9CisgICAgICAgIHNicmRlY19tYXBUb1N0ZFNhbXBsZVJhdGUoc2FtcGxlUmF0ZU91dCAqIGRvd25zY2FsZUZhY3RvciwgMCk7CisgIH0gZWxzZSB7CisgICAgc2FtcGxlUmF0ZVByb2MgPSBzYW1wbGVSYXRlT3V0ICogZG93bnNjYWxlRmFjdG9yOworICB9CisKKyAgaWYgKHNhbXBsZVJhdGVJbiA9PSBzYW1wbGVSYXRlT3V0KSB7CisgICAgaEhlYWRlckRhdGEtPnNiclByb2NTbXBsUmF0ZSA9IHNhbXBsZVJhdGVQcm9jIDw8IDE7CiAgICAgbnVtQW5hbHlzaXNCYW5kcyA9IDMyOwogICB9IGVsc2UgewotICAgIGhIZWFkZXJEYXRhLT5zYnJQcm9jU21wbFJhdGUgPSBzYW1wbGVSYXRlT3V0OwotICAgIGlmICggKHNhbXBsZVJhdGVPdXQ+PjEpID09IHNhbXBsZVJhdGVJbikgeworICAgIGhIZWFkZXJEYXRhLT5zYnJQcm9jU21wbFJhdGUgPSBzYW1wbGVSYXRlUHJvYzsKKyAgICBpZiAoKHNhbXBsZVJhdGVPdXQgPj4gMSkgPT0gc2FtcGxlUmF0ZUluKSB7CiAgICAgICAvKiAxOjIgKi8KICAgICAgIG51bUFuYWx5c2lzQmFuZHMgPSAzMjsKLSAgICB9IGVsc2UgaWYgKCAoc2FtcGxlUmF0ZU91dD4+MikgPT0gc2FtcGxlUmF0ZUluICkgeworICAgIH0gZWxzZSBpZiAoKHNhbXBsZVJhdGVPdXQgPj4gMikgPT0gc2FtcGxlUmF0ZUluKSB7CiAgICAgICAvKiAxOjQgKi8KLSAgICAgIG51bUFuYWx5c2lzQmFuZHMgPSAzMjsKLSAgICB9IGVsc2UgaWYgKCAoc2FtcGxlUmF0ZU91dCozKT4+MyA9PSAoc2FtcGxlUmF0ZUluKjgpPj4zICkgeworICAgICAgbnVtQW5hbHlzaXNCYW5kcyA9IDE2OworICAgIH0gZWxzZSBpZiAoKHNhbXBsZVJhdGVPdXQgKiAzKSA+PiAzID09IChzYW1wbGVSYXRlSW4gKiA4KSA+PiAzKSB7CiAgICAgICAvKiAzOjgsIDMvNCBjb3JlIGZyYW1lIGxlbmd0aCAqLwogICAgICAgbnVtQW5hbHlzaXNCYW5kcyA9IDI0OwogICAgIH0gZWxzZSB7CkBAIC0xOTEsNzQgKzI3NSw5OSBAQAogICAgICAgZ290byBiYWlsOwogICAgIH0KICAgfQorICBudW1BbmFseXNpc0JhbmRzIC89IGRvd25zY2FsZUZhY3RvcjsKIAotICAvKiBGaWxsIGluIGRlZmF1bHQgdmFsdWVzIGZpcnN0ICovCi0gIGhIZWFkZXJEYXRhLT5zeW5jU3RhdGUgICAgICAgICAgPSBTQlJfTk9UX0lOSVRJQUxJWkVEOwotICBoSGVhZGVyRGF0YS0+c3RhdHVzICAgICAgICAgICAgID0gMDsKLSAgaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnICAgICA9IDA7CisgIGlmIChzZXREZWZhdWx0SGRyKSB7CisgICAgLyogRmlsbCBpbiBkZWZhdWx0IHZhbHVlcyBmaXJzdCAqLworICAgIGhIZWFkZXJEYXRhLT5zeW5jU3RhdGUgPSBTQlJfTk9UX0lOSVRJQUxJWkVEOworICAgIGhIZWFkZXJEYXRhLT5zdGF0dXMgPSAwOworICAgIGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZyA9IDA7CiAKLSAgaEhlYWRlckRhdGEtPmJzX2luZm8uYW1wUmVzb2x1dGlvbiAgICAgPSAxOwotICBoSGVhZGVyRGF0YS0+YnNfaW5mby54b3Zlcl9iYW5kICAgICAgICA9IDA7Ci0gIGhIZWFkZXJEYXRhLT5ic19pbmZvLnNicl9wcmVwcm9jZXNzaW5nID0gMDsKKyAgICBoSGVhZGVyRGF0YS0+YnNfaW5mby5hbXBSZXNvbHV0aW9uID0gMTsKKyAgICBoSGVhZGVyRGF0YS0+YnNfaW5mby54b3Zlcl9iYW5kID0gMDsKKyAgICBoSGVhZGVyRGF0YS0+YnNfaW5mby5zYnJfcHJlcHJvY2Vzc2luZyA9IDA7CisgICAgaEhlYWRlckRhdGEtPmJzX2luZm8ucHZjX21vZGUgPSAwOwogCi0gIGhIZWFkZXJEYXRhLT5ic19kYXRhLnN0YXJ0RnJlcSAgICAgICA9IDU7Ci0gIGhIZWFkZXJEYXRhLT5ic19kYXRhLnN0b3BGcmVxICAgICAgICA9IDA7Ci0gIGhIZWFkZXJEYXRhLT5ic19kYXRhLmZyZXFTY2FsZSAgICAgICA9IDI7Ci0gIGhIZWFkZXJEYXRhLT5ic19kYXRhLmFsdGVyU2NhbGUgICAgICA9IDE7Ci0gIGhIZWFkZXJEYXRhLT5ic19kYXRhLm5vaXNlX2JhbmRzICAgICA9IDI7Ci0gIGhIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJCYW5kcyAgICA9IDI7Ci0gIGhIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJHYWlucyAgICA9IDI7Ci0gIGhIZWFkZXJEYXRhLT5ic19kYXRhLmludGVycG9sRnJlcSAgICA9IDE7Ci0gIGhIZWFkZXJEYXRhLT5ic19kYXRhLnNtb290aGluZ0xlbmd0aCA9IDE7CisgICAgaEhlYWRlckRhdGEtPmJzX2RhdGEuc3RhcnRGcmVxID0gNTsKKyAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zdG9wRnJlcSA9IDA7CisgICAgaEhlYWRlckRhdGEtPmJzX2RhdGEuZnJlcVNjYWxlID0KKyAgICAgICAgMDsgLyogcHJldmlvdXNseSAyOyBmb3IgRUxEIHJlZHVjZWQgZGVsYXkgYml0c3RyZWFtcworICAgICAgICAgICAvc2FtcGxlcmF0ZXMgaW5pdGlhbGl6aW5nIG9mIHRoZSBzYnIgZGVjb2RlciBpbnN0YW5jZSBmYWlscyBpZgorICAgICAgICAgICBmcmVxU2NhbGUgaXMgc2V0IHRvIDIgYmVjYXVzZSBubyBtYXN0ZXIgdGFibGUgY2FuIGJlIGdlbmVyYXRlZDsgaW4KKyAgICAgICAgICAgRUxEIHJlZHVjZWQgZGVsYXkgYml0c3RyZWFtcyB0aGlzIHZhbHVlIGlzIGFsd2F5cyAwOyBnZXRzIG92ZXJ3cml0dGVuCisgICAgICAgICAgIHdoZW4gaGVhZGVyIGlzIHJlYWQgKi8KKyAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5hbHRlclNjYWxlID0gMTsKKyAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5ub2lzZV9iYW5kcyA9IDI7CisgICAgaEhlYWRlckRhdGEtPmJzX2RhdGEubGltaXRlckJhbmRzID0gMjsKKyAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyR2FpbnMgPSAyOworICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLmludGVycG9sRnJlcSA9IDE7CisgICAgaEhlYWRlckRhdGEtPmJzX2RhdGEuc21vb3RoaW5nTGVuZ3RoID0gMTsKIAotICBoSGVhZGVyRGF0YS0+dGltZVN0ZXAgPSAoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpID8gMSA6IDI7Ci0KLSAgLyogU2V0dXAgcG9pbnRlcnMgdG8gZnJlcXVlbmN5IGJhbmQgdGFibGVzICovCi0gIGhGcmVxLT5mcmVxQmFuZFRhYmxlWzBdICA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlTG87Ci0gIGhGcmVxLT5mcmVxQmFuZFRhYmxlWzFdID0gaEZyZXEtPmZyZXFCYW5kVGFibGVIaTsKLQotICAvKiBQYXRjaCBzb21lIGVudHJpZXMgKi8KLSAgaWYgKHNhbXBsZVJhdGVPdXQgPiAyNDAwMCkgeyAgICAvKiBUcmlnZ2VyIGFuIGVycm9yIGlmIFNCUiBpcyBnb2luZyB0byBiZSBwcm9jZXNzZWQgd2l0aG91dCAgICAgKi8KLSAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zdGFydEZyZXEgPSA3OyAgIC8qICAgaGF2aW5nIHJlYWQgdGhlc2UgZnJlcXVlbmN5IHZhbHVlcyBmcm9tIGJpdCBzdHJlYW0gYmVmb3JlLiAqLwotICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLnN0b3BGcmVxICA9IDM7CisgICAgLyogUGF0Y2ggc29tZSBlbnRyaWVzICovCisgICAgaWYgKHNhbXBsZVJhdGVPdXQgKiBkb3duc2NhbGVGYWN0b3IgPj0gOTYwMDApIHsKKyAgICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLnN0YXJ0RnJlcSA9CisgICAgICAgICAgNDsgLyogICBoYXZpbmcgcmVhZCB0aGVzZSBmcmVxdWVuY3kgdmFsdWVzIGZyb20gYml0IHN0cmVhbSBiZWZvcmUuICovCisgICAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zdG9wRnJlcSA9IDM7CisgICAgfSBlbHNlIGlmIChzYW1wbGVSYXRlT3V0ICogZG93bnNjYWxlRmFjdG9yID4KKyAgICAgICAgICAgICAgIDI0MDAwKSB7IC8qIFRyaWdnZXIgYW4gZXJyb3IgaWYgU0JSIGlzIGdvaW5nIHRvIGJlIHByb2Nlc3NlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCAgICAgKi8KKyAgICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLnN0YXJ0RnJlcSA9CisgICAgICAgICAgNzsgLyogICBoYXZpbmcgcmVhZCB0aGVzZSBmcmVxdWVuY3kgdmFsdWVzIGZyb20gYml0IHN0cmVhbSBiZWZvcmUuICovCisgICAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zdG9wRnJlcSA9IDM7CisgICAgfQogICB9CiAKLSAgLyogT25lIFNCUiB0aW1lc2xvdCBjb3JyZXNwb25kcyB0byB0aGUgYW1vdW50IG9mIHNhbXBsZXMgZXF1YWwgdG8gdGhlIGFtb3VudCBvZiBhbmFseXNpcyBiYW5kcywgZGl2aWRlZCBieSB0aGUgdGltZXN0ZXAuICovCi0gIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgPSAoc2FtcGxlc1BlckZyYW1lL251bUFuYWx5c2lzQmFuZHMpID4+IChoSGVhZGVyRGF0YS0+dGltZVN0ZXAgLSAxKTsKKyAgaWYgKChzYW1wbGVSYXRlT3V0ID4+IDIpID09IHNhbXBsZVJhdGVJbikgeworICAgIGhIZWFkZXJEYXRhLT50aW1lU3RlcCA9IDQ7CisgIH0gZWxzZSB7CisgICAgaEhlYWRlckRhdGEtPnRpbWVTdGVwID0gKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKSA/IDEgOiAyOworICB9CisKKyAgLyogU2V0dXAgcG9pbnRlcnMgdG8gZnJlcXVlbmN5IGJhbmQgdGFibGVzICovCisgIGhGcmVxLT5mcmVxQmFuZFRhYmxlWzBdID0gaEZyZXEtPmZyZXFCYW5kVGFibGVMbzsKKyAgaEZyZXEtPmZyZXFCYW5kVGFibGVbMV0gPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZUhpOworCisgIC8qIE9uZSBTQlIgdGltZXNsb3QgY29ycmVzcG9uZHMgdG8gdGhlIGFtb3VudCBvZiBzYW1wbGVzIGVxdWFsIHRvIHRoZSBhbW91bnQKKyAgICogb2YgYW5hbHlzaXMgYmFuZHMsIGRpdmlkZWQgYnkgdGhlIHRpbWVzdGVwLiAqLworICBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzID0KKyAgICAgIChzYW1wbGVzUGVyRnJhbWUgLyBudW1BbmFseXNpc0JhbmRzKSA+PiAoaEhlYWRlckRhdGEtPnRpbWVTdGVwIC0gMSk7CiAgIGlmIChoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzID4gKDE2KSkgewogICAgIHNickVycm9yID0gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgfQogCiAgIGhIZWFkZXJEYXRhLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMgPSBudW1BbmFseXNpc0JhbmRzOworICBpZiAoKHNhbXBsZVJhdGVPdXQgPj4gMikgPT0gc2FtcGxlUmF0ZUluKSB7CisgICAgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyA8PD0gMTsKKyAgfQogCiBiYWlsOgogICByZXR1cm4gc2JyRXJyb3I7CiB9CiAKLQogLyohCiAgIFxicmllZiAgIEluaXRpYWxpemUgdGhlIFNCUl9QUkVWX0ZSQU1FX0RBVEEgc3RydWN0CiAqLwotdm9pZAotaW5pdFNiclByZXZGcmFtZURhdGEgKEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgU0JSX1BSRVZfRlJBTUVfREFUQSAqLwotICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU2xvdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZyYW1lbGVuZ3RoIGluIFNCUi10aW1lc2xvdHMgKi8KK3ZvaWQgaW5pdFNiclByZXZGcmFtZURhdGEoCisgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEKKyAgICAgICAgaF9wcmV2X2RhdGEsIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBTQlJfUFJFVl9GUkFNRV9EQVRBICovCisgICAgaW50IHRpbWVTbG90cykgICAvKiE8IEZyYW1lbGVuZ3RoIGluIFNCUi10aW1lc2xvdHMgKi8KIHsKICAgaW50IGk7CiAKICAgLyogU2V0IHByZXZpb3VzIGVuZXJneSBhbmQgbm9pc2UgbGV2ZWxzIHRvIDAgZm9yIHRoZSBjYXNlCiAgICAgIHRoYXQgZGVjb2Rpbmcgc3RhcnRzIGluIHRoZSBtaWRkbGUgb2YgYSBiaXRzdHJlYW0gKi8KLSAgZm9yIChpPTA7IGkgPCBNQVhfRlJFUV9DT0VGRlM7IGkrKykKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9GUkVRX0NPRUZGUzsgaSsrKQogICAgIGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXZbaV0gPSAoRklYUF9EQkwpMDsKLSAgZm9yIChpPTA7IGkgPCBNQVhfTk9JU0VfQ09FRkZTOyBpKyspCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTk9JU0VfQ09FRkZTOyBpKyspCiAgICAgaF9wcmV2X2RhdGEtPnByZXZOb2lzZUxldmVsW2ldID0gKEZJWFBfREJMKTA7Ci0gIGZvciAoaT0wOyBpIDwgTUFYX0lOVkZfQkFORFM7IGkrKykKLSAgICBoX3ByZXZfZGF0YS0+c2JyX2ludmZfbW9kZVtpXSA9IElOVkZfT0ZGOworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOVkZfQkFORFM7IGkrKykgaF9wcmV2X2RhdGEtPnNicl9pbnZmX21vZGVbaV0gPSBJTlZGX09GRjsKIAogICBoX3ByZXZfZGF0YS0+c3RvcFBvcyA9IHRpbWVTbG90czsKICAgaF9wcmV2X2RhdGEtPmNvdXBsaW5nID0gQ09VUExJTkdfT0ZGOwogICBoX3ByZXZfZGF0YS0+YW1wUmVzID0gMDsKLX0KIAorICBGREttZW1jbGVhcigmaF9wcmV2X2RhdGEtPnByZXZGcmFtZUluZm8sIHNpemVvZihoX3ByZXZfZGF0YS0+cHJldkZyYW1lSW5mbykpOworfQogCiAvKiEKICAgXGJyaWVmICAgUmVhZCBoZWFkZXIgZGF0YSBmcm9tIGJpdHN0cmVhbQpAQCAtMjY2LDc0ICszNzUsOTIgQEAKICAgXHJldHVybiAgZXJyb3Igc3RhdHVzIC0gMCBpZiBvawogKi8KIFNCUl9IRUFERVJfU1RBVFVTCi1zYnJHZXRIZWFkZXJEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQnMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICBmSXNTYnJEYXRhKQoteworc2JyR2V0SGVhZGVyRGF0YShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IGludCBmSXNTYnJEYXRhLAorICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBjb25maWdNb2RlKSB7CiAgIFNCUl9IRUFERVJfREFUQV9CUyAqcEJzRGF0YTsKICAgU0JSX0hFQURFUl9EQVRBX0JTIGxhc3RIZWFkZXI7CiAgIFNCUl9IRUFERVJfREFUQV9CU19JTkZPIGxhc3RJbmZvOwotICBpbnQgaGVhZGVyRXh0cmExPTAsIGhlYWRlckV4dHJhMj0wOworICBpbnQgaGVhZGVyRXh0cmExID0gMCwgaGVhZGVyRXh0cmEyID0gMDsKKworICAvKiBSZWFkIGFuZCBkaXNjYXJkIG5ldyBoZWFkZXIgaW4gY29uZmlnIGNoYW5nZSBkZXRlY3Rpb24gbW9kZSAqLworICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0RFVF9DRkdfQ0hBTkdFKSB7CisgICAgaWYgKCEoZmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9SU1ZENTAgfCBTQlJERUNfU1lOVEFYX1VTQUMpKSkgeworICAgICAgLyogYW1wUmVzb2x1dGlvbiAqLworICAgICAgRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICB9CisgICAgLyogc3RhcnRGcmVxLCBzdG9wRnJlcSAqLworICAgIEZES3B1c2hGb3IoaEJzLCA4KTsKKyAgICBpZiAoIShmbGFncyAmIChTQlJERUNfU1lOVEFYX1JTVkQ1MCB8IFNCUkRFQ19TWU5UQVhfVVNBQykpKSB7CisgICAgICAvKiB4b3Zlcl9iYW5kICovCisgICAgICBGREtyZWFkQml0cyhoQnMsIDMpOworICAgICAgLyogcmVzZXJ2ZWQgYml0cyAqLworICAgICAgRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICB9CisgICAgaGVhZGVyRXh0cmExID0gRkRLcmVhZEJpdChoQnMpOworICAgIGhlYWRlckV4dHJhMiA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICBGREtwdXNoRm9yKGhCcywgNSAqIGhlYWRlckV4dHJhMSArIDYgKiBoZWFkZXJFeHRyYTIpOworCisgICAgcmV0dXJuIEhFQURFUl9PSzsKKyAgfQogCiAgIC8qIENvcHkgU0JSIGJpdCBzdHJlYW0gaGVhZGVyIHRvIHRlbXBvcmFyeSBoZWFkZXIgKi8KICAgbGFzdEhlYWRlciA9IGhIZWFkZXJEYXRhLT5ic19kYXRhOwotICBsYXN0SW5mbyAgID0gaEhlYWRlckRhdGEtPmJzX2luZm87CisgIGxhc3RJbmZvID0gaEhlYWRlckRhdGEtPmJzX2luZm87CiAKICAgLyogUmVhZCBuZXcgaGVhZGVyIGZyb20gYml0c3RyZWFtICovCi0gIHsKKyAgaWYgKChmbGFncyAmIChTQlJERUNfU1lOVEFYX1JTVkQ1MCB8IFNCUkRFQ19TWU5UQVhfVVNBQykpICYmICFmSXNTYnJEYXRhKSB7CisgICAgcEJzRGF0YSA9ICZoSGVhZGVyRGF0YS0+YnNfZGZsdDsKKyAgfSBlbHNlIHsKICAgICBwQnNEYXRhID0gJmhIZWFkZXJEYXRhLT5ic19kYXRhOwogICB9CiAKLSAgewotICAgIGhIZWFkZXJEYXRhLT5ic19pbmZvLmFtcFJlc29sdXRpb24gPSBGREtyZWFkQml0cyAoaEJzLCAxKTsKKyAgaWYgKCEoZmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9SU1ZENTAgfCBTQlJERUNfU1lOVEFYX1VTQUMpKSkgeworICAgIGhIZWFkZXJEYXRhLT5ic19pbmZvLmFtcFJlc29sdXRpb24gPSBGREtyZWFkQml0cyhoQnMsIDEpOwogICB9CiAKLSAgcEJzRGF0YS0+c3RhcnRGcmVxID0gRkRLcmVhZEJpdHMgKGhCcywgNCk7Ci0gIHBCc0RhdGEtPnN0b3BGcmVxID0gRkRLcmVhZEJpdHMgKGhCcywgNCk7CisgIHBCc0RhdGEtPnN0YXJ0RnJlcSA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgIHBCc0RhdGEtPnN0b3BGcmVxID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKIAotICB7Ci0gICAgaEhlYWRlckRhdGEtPmJzX2luZm8ueG92ZXJfYmFuZCA9IEZES3JlYWRCaXRzIChoQnMsIDMpOwotICAgIEZES3JlYWRCaXRzIChoQnMsIDIpOworICBpZiAoIShmbGFncyAmIChTQlJERUNfU1lOVEFYX1JTVkQ1MCB8IFNCUkRFQ19TWU5UQVhfVVNBQykpKSB7CisgICAgaEhlYWRlckRhdGEtPmJzX2luZm8ueG92ZXJfYmFuZCA9IEZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgRkRLcmVhZEJpdHMoaEJzLCAyKTsKICAgfQogCi0gIGhlYWRlckV4dHJhMSA9IEZES3JlYWRCaXRzIChoQnMsIDEpOwotICBoZWFkZXJFeHRyYTIgPSBGREtyZWFkQml0cyAoaEJzLCAxKTsKKyAgaGVhZGVyRXh0cmExID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaGVhZGVyRXh0cmEyID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKIAogICAvKiBIYW5kbGUgZXh0cmEgaGVhZGVyIGluZm9ybWF0aW9uICovCi0gIGlmKCBoZWFkZXJFeHRyYTEpIAotICB7Ci0gICAgcEJzRGF0YS0+ZnJlcVNjYWxlID0gRkRLcmVhZEJpdHMgKGhCcywgMik7Ci0gICAgcEJzRGF0YS0+YWx0ZXJTY2FsZSA9IEZES3JlYWRCaXRzIChoQnMsIDEpOwotICAgIHBCc0RhdGEtPm5vaXNlX2JhbmRzID0gRkRLcmVhZEJpdHMgKGhCcywgMik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcEJzRGF0YS0+ZnJlcVNjYWxlICAgPSAyOwotICAgIHBCc0RhdGEtPmFsdGVyU2NhbGUgID0gMTsKKyAgaWYgKGhlYWRlckV4dHJhMSkgeworICAgIHBCc0RhdGEtPmZyZXFTY2FsZSA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgICAgcEJzRGF0YS0+YWx0ZXJTY2FsZSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgcEJzRGF0YS0+bm9pc2VfYmFuZHMgPSBGREtyZWFkQml0cyhoQnMsIDIpOworICB9IGVsc2UgeworICAgIHBCc0RhdGEtPmZyZXFTY2FsZSA9IDI7CisgICAgcEJzRGF0YS0+YWx0ZXJTY2FsZSA9IDE7CiAgICAgcEJzRGF0YS0+bm9pc2VfYmFuZHMgPSAyOwogICB9CiAKICAgaWYgKGhlYWRlckV4dHJhMikgewotICAgIHBCc0RhdGEtPmxpbWl0ZXJCYW5kcyA9IEZES3JlYWRCaXRzIChoQnMsIDIpOwotICAgIHBCc0RhdGEtPmxpbWl0ZXJHYWlucyA9IEZES3JlYWRCaXRzIChoQnMsIDIpOwotICAgIHBCc0RhdGEtPmludGVycG9sRnJlcSA9IEZES3JlYWRCaXRzIChoQnMsIDEpOwotICAgIHBCc0RhdGEtPnNtb290aGluZ0xlbmd0aCA9IEZES3JlYWRCaXRzIChoQnMsIDEpOwotICB9Ci0gIGVsc2UgewotICAgIHBCc0RhdGEtPmxpbWl0ZXJCYW5kcyAgICA9IDI7Ci0gICAgcEJzRGF0YS0+bGltaXRlckdhaW5zICAgID0gMjsKLSAgICBwQnNEYXRhLT5pbnRlcnBvbEZyZXEgICAgPSAxOworICAgIHBCc0RhdGEtPmxpbWl0ZXJCYW5kcyA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgICAgcEJzRGF0YS0+bGltaXRlckdhaW5zID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICBwQnNEYXRhLT5pbnRlcnBvbEZyZXEgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIHBCc0RhdGEtPnNtb290aGluZ0xlbmd0aCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIH0gZWxzZSB7CisgICAgcEJzRGF0YS0+bGltaXRlckJhbmRzID0gMjsKKyAgICBwQnNEYXRhLT5saW1pdGVyR2FpbnMgPSAyOworICAgIHBCc0RhdGEtPmludGVycG9sRnJlcSA9IDE7CiAgICAgcEJzRGF0YS0+c21vb3RoaW5nTGVuZ3RoID0gMTsKICAgfQogCiAgIC8qIExvb2sgZm9yIG5ldyBzZXR0aW5ncy4gSUVDIDE0NDk2LTMsIDQuNi4xOC4zLjEgKi8KLSAgaWYoaEhlYWRlckRhdGEtPnN5bmNTdGF0ZSA8IFNCUl9IRUFERVIgfHwKLSAgICAgbGFzdEhlYWRlci5zdGFydEZyZXEgICAhPSBwQnNEYXRhLT5zdGFydEZyZXEgICB8fAotICAgICBsYXN0SGVhZGVyLnN0b3BGcmVxICAgICE9IHBCc0RhdGEtPnN0b3BGcmVxICAgIHx8Ci0gICAgIGxhc3RIZWFkZXIuZnJlcVNjYWxlICAgIT0gcEJzRGF0YS0+ZnJlcVNjYWxlICAgfHwKLSAgICAgbGFzdEhlYWRlci5hbHRlclNjYWxlICAhPSBwQnNEYXRhLT5hbHRlclNjYWxlICB8fAotICAgICBsYXN0SGVhZGVyLm5vaXNlX2JhbmRzICE9IHBCc0RhdGEtPm5vaXNlX2JhbmRzIHx8Ci0gICAgIGxhc3RJbmZvLnhvdmVyX2JhbmQgICAgIT0gaEhlYWRlckRhdGEtPmJzX2luZm8ueG92ZXJfYmFuZCkgeworICBpZiAoaEhlYWRlckRhdGEtPnN5bmNTdGF0ZSA8IFNCUl9IRUFERVIgfHwKKyAgICAgIGxhc3RIZWFkZXIuc3RhcnRGcmVxICE9IHBCc0RhdGEtPnN0YXJ0RnJlcSB8fAorICAgICAgbGFzdEhlYWRlci5zdG9wRnJlcSAhPSBwQnNEYXRhLT5zdG9wRnJlcSB8fAorICAgICAgbGFzdEhlYWRlci5mcmVxU2NhbGUgIT0gcEJzRGF0YS0+ZnJlcVNjYWxlIHx8CisgICAgICBsYXN0SGVhZGVyLmFsdGVyU2NhbGUgIT0gcEJzRGF0YS0+YWx0ZXJTY2FsZSB8fAorICAgICAgbGFzdEhlYWRlci5ub2lzZV9iYW5kcyAhPSBwQnNEYXRhLT5ub2lzZV9iYW5kcyB8fAorICAgICAgbGFzdEluZm8ueG92ZXJfYmFuZCAhPSBoSGVhZGVyRGF0YS0+YnNfaW5mby54b3Zlcl9iYW5kKSB7CiAgICAgcmV0dXJuIEhFQURFUl9SRVNFVDsgLyogTmV3IHNldHRpbmdzICovCiAgIH0KIApAQCAtMzQ1LDI3ICs0NzIsNDUgQEAKIAogICBccmV0dXJuICBlcnJvciBzdGF0dXMgLSAwIGlmIG9rCiAqLwotaW50Ci1zYnJHZXRTeW50aGV0aWNDb2RlZERhdGEoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQnMpCi17CitpbnQgc2JyR2V0U3ludGhldGljQ29kZWREYXRhKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGNvbnN0IFVJTlQgZmxhZ3MpIHsKICAgaW50IGksIGJpdHNSZWFkID0gMDsKIAotICBpbnQgZmxhZyA9IEZES3JlYWRCaXRzKGhCcywxKTsKKyAgaW50IGFkZF9oYXJtb25pY19mbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKICAgYml0c1JlYWQrKzsKIAotICBpZihmbGFnKXsKLSAgICBmb3IoaT0wO2k8aEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzFdO2krKyl7Ci0gICAgICBoRnJhbWVEYXRhLT5hZGRIYXJtb25pY3NbaV0gID0gRkRLcmVhZEJpdHMgKGhCcywgMSApOwotICAgICAgYml0c1JlYWQrKzsKKyAgaWYgKGFkZF9oYXJtb25pY19mbGFnKSB7CisgICAgaW50IG5TZmIgPSBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmJbMV07CisgICAgZm9yIChpID0gMDsgaSA8IEFERF9IQVJNT05JQ1NfRkxBR1NfU0laRTsgaSsrKSB7CisgICAgICAvKiByZWFkIG1heGltdW0gMzIgYml0cyBhbmQgYWxpZ24gdGhlbSB0byB0aGUgTVNCICovCisgICAgICBpbnQgcmVhZEJpdHMgPSBmTWluKDMyLCBuU2ZiKTsKKyAgICAgIG5TZmIgLT0gcmVhZEJpdHM7CisgICAgICBpZiAocmVhZEJpdHMgPiAwKSB7CisgICAgICAgIGhGcmFtZURhdGEtPmFkZEhhcm1vbmljc1tpXSA9IEZES3JlYWRCaXRzKGhCcywgcmVhZEJpdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgzMiAtIHJlYWRCaXRzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhGcmFtZURhdGEtPmFkZEhhcm1vbmljc1tpXSA9IDA7CisgICAgICB9CisKKyAgICAgIGJpdHNSZWFkICs9IHJlYWRCaXRzOwogICAgIH0KKyAgICAvKiBic19wdmNfbW9kZSA9IDAgZm9yIFJzdmQ1MCAqLworICAgIGlmIChmbGFncyAmIFNCUkRFQ19TWU5UQVhfVVNBQykgeworICAgICAgaWYgKGhIZWFkZXJEYXRhLT5ic19pbmZvLnB2Y19tb2RlKSB7CisgICAgICAgIGludCBic19zaW51c29pZGFsX3Bvc2l0aW9uID0gMzE7CisgICAgICAgIGlmIChGREtyZWFkQml0KGhCcykgLyogYnNfc2ludXNvaWRhbF9wb3NpdGlvbl9mbGFnICovKSB7CisgICAgICAgICAgYnNfc2ludXNvaWRhbF9wb3NpdGlvbiA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgICAgICAgIH0KKyAgICAgICAgaEZyYW1lRGF0YS0+c2ludXNvaWRhbF9wb3NpdGlvbiA9IGJzX3NpbnVzb2lkYWxfcG9zaXRpb247CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBBRERfSEFSTU9OSUNTX0ZMQUdTX1NJWkU7IGkrKykKKyAgICAgIGhGcmFtZURhdGEtPmFkZEhhcm1vbmljc1tpXSA9IDA7CiAgIH0KLSAgZWxzZSB7Ci0gICAgZm9yKGk9MDsgaTxNQVhfRlJFUV9DT0VGRlM7IGkrKykKLSAgICAgIGhGcmFtZURhdGEtPmFkZEhhcm1vbmljc1tpXSAgPSAwOwotICB9Ci0gIHJldHVybihiaXRzUmVhZCk7CisKKyAgcmV0dXJuIChiaXRzUmVhZCk7CiB9CiAKIC8qIQpAQCAtMzc3LDE2ICs1MjIsMTYgQEAKICAgYXJlIHVudXNlZC4gVGhlIGRhdGEgc2hvdWxkIGJlIHNraXBwZWQgaW4gb3JkZXIgdG8gdXBkYXRlIHRoZSBudW1iZXIKICAgb2YgcmVhZCBiaXRzIGZvciB0aGUgY29uc2lzdGVuY3kgY2hlY2sgaW4gYXBwbHlTQlIoKS4KICovCi1zdGF0aWMgaW50ICBleHRyYWN0RXh0ZW5kZWREYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAvKiE8IGhhbmRsZSB0byBTQlIgaGVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzICAgICAgICAgICAgIC8qITwgSGFuZGxlIHRvIHRoZSBiaXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEhBTkRMRV9QU19ERUMgaFBhcmFtZXRyaWNTdGVyZW9EZWMgICAgIC8qITwgUGFyYW1ldHJpYyBTdGVyZW8gRGVjb2RlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKK3N0YXRpYyBpbnQgZXh0cmFjdEV4dGVuZGVkRGF0YSgKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IGhhbmRsZSB0byBTQlIgaGVhZGVyICovCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzICAgICAgICAgICAgLyohPCBIYW5kbGUgdG8gdGhlIGJpdCBidWZmZXIgKi8KKyAgICAsCisgICAgSEFORExFX1BTX0RFQyBoUGFyYW1ldHJpY1N0ZXJlb0RlYyAvKiE8IFBhcmFtZXRyaWMgU3RlcmVvIERlY29kZXIgKi8KKykgewogICBJTlQgbkJpdHNMZWZ0OwogICBpbnQgZXh0ZW5kZWRfZGF0YTsKICAgaW50IGksIGZyYW1lT2sgPSAxOwogCi0KICAgZXh0ZW5kZWRfZGF0YSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CiAKICAgaWYgKGV4dGVuZGVkX2RhdGEpIHsKQEAgLTM5NCw5ICs1MzksNyBAQAogICAgIGludCBiUHNSZWFkID0gMDsKIAogICAgIGNudCA9IEZES3JlYWRCaXRzKGhCcywgNCk7Ci0gICAgaWYgKGNudCA9PSAoMTw8NCktMSkKLSAgICAgIGNudCArPSBGREtyZWFkQml0cyhoQnMsIDgpOwotCisgICAgaWYgKGNudCA9PSAoMSA8PCA0KSAtIDEpIGNudCArPSBGREtyZWFkQml0cyhoQnMsIDgpOwogCiAgICAgbkJpdHNMZWZ0ID0gOCAqIGNudDsKIApAQCAtNDEyLDUyICs1NTUsNTIgQEAKICAgICAgIGludCBleHRlbnNpb25faWQgPSBGREtyZWFkQml0cyhoQnMsIDIpOwogICAgICAgbkJpdHNMZWZ0IC09IDI7CiAKLSAgICAgIHN3aXRjaChleHRlbnNpb25faWQpIHsKLQotCi0KKyAgICAgIHN3aXRjaCAoZXh0ZW5zaW9uX2lkKSB7CiAgICAgICAgIGNhc2UgRVhURU5TSU9OX0lEX1BTX0NPRElORzoKIAotICAgICAgICAvKiBSZWFkIFBTIGRhdGEgZnJvbSBiaXRzdHJlYW0gKi8KKyAgICAgICAgICAvKiBSZWFkIFBTIGRhdGEgZnJvbSBiaXRzdHJlYW0gKi8KIAotICAgICAgICBpZiAoaFBhcmFtZXRyaWNTdGVyZW9EZWMgIT0gTlVMTCkgewotICAgICAgICAgIGlmKGJQc1JlYWQgJiYgIWhQYXJhbWV0cmljU3RlcmVvRGVjLT5ic0RhdGFbaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzUmVhZFNsb3RdLm1wZWcuYlBzSGVhZGVyVmFsaWQpIHsKLSAgICAgICAgICAgIGNudCA9IG5CaXRzTGVmdCA+PiAzOyAvKiBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzICovCi0gICAgICAgICAgICBmb3IgKGk9MDsgaTxjbnQ7IGkrKykKLSAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCA4KTsKLSAgICAgICAgICAgIG5CaXRzTGVmdCAtPSBjbnQgKiA4OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuQml0c0xlZnQgLT0gUmVhZFBzRGF0YShoUGFyYW1ldHJpY1N0ZXJlb0RlYywgaEJzLCBuQml0c0xlZnQpOwotICAgICAgICAgICAgYlBzUmVhZCA9IDE7CisgICAgICAgICAgaWYgKGhQYXJhbWV0cmljU3RlcmVvRGVjICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChiUHNSZWFkICYmCisgICAgICAgICAgICAgICAgIWhQYXJhbWV0cmljU3RlcmVvRGVjLT5ic0RhdGFbaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzUmVhZFNsb3RdCisgICAgICAgICAgICAgICAgICAgICAubXBlZy5iUHNIZWFkZXJWYWxpZCkgeworICAgICAgICAgICAgICBjbnQgPSBuQml0c0xlZnQgPj4gMzsgLyogbnVtYmVyIG9mIHJlbWFpbmluZyBieXRlcyAqLworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgICAgICAgIG5CaXRzTGVmdCAtPSBjbnQgKiA4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgbkJpdHNMZWZ0IC09CisgICAgICAgICAgICAgICAgICAoSU5UKVJlYWRQc0RhdGEoaFBhcmFtZXRyaWNTdGVyZW9EZWMsIGhCcywgbkJpdHNMZWZ0KTsKKyAgICAgICAgICAgICAgYlBzUmVhZCA9IDE7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICB9CiAKLSAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZXRlY3RlZCwgY291bGQgc2V0IGNoYW5uZWxNb2RlIGFjY29yZGluZ2x5IGhlcmUgICovCisgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGV0ZWN0ZWQsIGNvdWxkIHNldCBjaGFubmVsTW9kZSBhY2NvcmRpbmdseSBoZXJlCisgICAgICAgICAgICovCiAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICJUaGUgdXNhZ2Ugb2YgdGhpcyBwYXJhbWV0cmljIHN0ZXJlbyBleHRlbnNpb24gdG8gSEUtQUFDIGlzICAgICAgICAgKi8KLSAgICAgICAgICAvKiBzaWduYWxsZWQgaW1wbGljaXRseSBpbiB0aGUgYml0c3RyZWFtLiBIZW5jZSwgaWYgYW4gc2JyX2V4dGVuc2lvbigpICovCi0gICAgICAgICAgLyogd2l0aCBic19leHRlbnNpb25faWQ9PUVYVEVOU0lPTl9JRF9QUyBpcyBmb3VuZCBpbiB0aGUgU0JSIHBhcnQgb2YgICAqLwotICAgICAgICAgIC8qIHRoZSBiaXRzdHJlYW0sIGEgZGVjb2RlciBzdXBwb3J0aW5nIHRoZSBjb21iaW5hdGlvbiBvZiBTQlIgYW5kIFBTICAgKi8KLSAgICAgICAgICAvKiBzaGFsbCBvcGVyYXRlIHRoZSBQUyB0b29sIHRvIGdlbmVyYXRlIGEgc3RlcmVvIG91dHB1dCBzaWduYWwuIiAgICAgICovCi0gICAgICAgICAgLyogc291cmNlOiBJU08vSUVDIDE0NDk2LTM6MjAwMS9GREFNIDI6MjAwNChFKSAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIC8qICJUaGUgdXNhZ2Ugb2YgdGhpcyBwYXJhbWV0cmljIHN0ZXJlbyBleHRlbnNpb24gdG8gSEUtQUFDIGlzICovCisgICAgICAgICAgLyogc2lnbmFsbGVkIGltcGxpY2l0bHkgaW4gdGhlIGJpdHN0cmVhbS4gSGVuY2UsIGlmIGFuIHNicl9leHRlbnNpb24oKQorICAgICAgICAgICAqLworICAgICAgICAgIC8qIHdpdGggYnNfZXh0ZW5zaW9uX2lkPT1FWFRFTlNJT05fSURfUFMgaXMgZm91bmQgaW4gdGhlIFNCUiBwYXJ0IG9mCisgICAgICAgICAgICovCisgICAgICAgICAgLyogdGhlIGJpdHN0cmVhbSwgYSBkZWNvZGVyIHN1cHBvcnRpbmcgdGhlIGNvbWJpbmF0aW9uIG9mIFNCUiBhbmQgUFMKKyAgICAgICAgICAgKi8KKyAgICAgICAgICAvKiBzaGFsbCBvcGVyYXRlIHRoZSBQUyB0b29sIHRvIGdlbmVyYXRlIGEgc3RlcmVvIG91dHB1dCBzaWduYWwuIiAqLworICAgICAgICAgIC8qIHNvdXJjZTogSVNPL0lFQyAxNDQ5Ni0zOjIwMDEvRkRBTSAyOjIwMDQoRSkgKi8KIAotICAgICAgICBicmVhazsKKyAgICAgICAgICBicmVhazsKIAotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBjbnQgPSBuQml0c0xlZnQgPj4gMzsgLyogbnVtYmVyIG9mIHJlbWFpbmluZyBieXRlcyAqLwotICAgICAgICBmb3IgKGk9MDsgaTxjbnQ7IGkrKykKLSAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDgpOwotICAgICAgICBuQml0c0xlZnQgLT0gY250ICogODsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY250ID0gbkJpdHNMZWZ0ID4+IDM7IC8qIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgICAgbkJpdHNMZWZ0IC09IGNudCAqIDg7CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG5CaXRzTGVmdCA8IDApIHsKICAgICAgIGZyYW1lT2sgPSAwOwogICAgICAgZ290byBiYWlsOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgLyogUmVhZCBmaWxsIGJpdHMgZm9yIGJ5dGUgYWxpZ25tZW50ICovCiAgICAgICBGREtyZWFkQml0cyhoQnMsIG5CaXRzTGVmdCk7CiAgICAgfQpAQCAtNDY3LDE5NiArNjEwLDIwOCBAQAogICByZXR1cm4gKGZyYW1lT2spOwogfQogCi0KIC8qIQotICBcYnJpZWYgICBSZWFkIGJpdHN0cmVhbSBlbGVtZW50cyBvZiBvbmUgY2hhbm5lbAotCi0gIFxyZXR1cm4gIFNickZyYW1lT0s6ICAxPW9rLCAwPWVycm9yCisgIFxicmllZiAgICAgIFJlYWQgYml0c3RyZWFtIGVsZW1lbnRzIG9mIGEgU0JSIGNoYW5uZWwgZWxlbWVudAorICBccmV0dXJuICAgICBTYnJGcmFtZU9LCiAqLwotaW50Ci1zYnJHZXRTaW5nbGVDaGFubmVsRWxlbWVudCAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgICAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoRnJhbWVEYXRhLCAgICAgICAgICAgLyohPCBDb250cm9sIGRhdGEgb2YgY3VycmVudCBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzLCAgICAgICAgICAgICAgICAgIC8qITwgSGFuZGxlIHRvIHN0cnVjdCBCSVRfQlVGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BTX0RFQyAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlb0RlYywgLyohPCBIYW5kbGUgdG8gUFMgZGVjb2RlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICBvdmVybGFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIGludCBpOworaW50IHNickdldENoYW5uZWxFbGVtZW50KEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YUxlZnRQcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIHB2Y19tb2RlX2xhc3QsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUFNfREVDIGhQYXJhbWV0cmljU3RlcmVvRGVjLCBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdmVybGFwKSB7CisgIGludCBpLCBic19jb3VwbGluZyA9IENPVVBMSU5HX09GRjsKKyAgY29uc3QgaW50IG5DaCA9IChoRnJhbWVEYXRhUmlnaHQgPT0gTlVMTCkgPyAxIDogMjsKIAotCi0gIGhGcmFtZURhdGEtPmNvdXBsaW5nID0gQ09VUExJTkdfT0ZGOwotCi0gIHsKKyAgaWYgKCEoZmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9VU0FDIHwgU0JSREVDX1NZTlRBWF9SU1ZENTApKSkgewogICAgIC8qIFJlc2VydmVkIGJpdHMgKi8KLSAgICBpZiAoRkRLcmVhZEJpdHMoaEJzLCAxKSkgeyAgLyogYnNfZGF0YV9leHRyYSAqLworICAgIGlmIChGREtyZWFkQml0cyhoQnMsIDEpKSB7IC8qIGJzX2RhdGFfZXh0cmEgKi8KICAgICAgIEZES3JlYWRCaXRzKGhCcywgNCk7Ci0gICAgICBpZiAoZmxhZ3MgJiBTQlJERUNfU1lOVEFYX1NDQUwpIHsKKyAgICAgIGlmICgoZmxhZ3MgJiBTQlJERUNfU1lOVEFYX1NDQUwpIHx8IChuQ2ggPT0gMikpIHsKICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCA0KTsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBpZiAoZmxhZ3MgJiBTQlJERUNfU1lOVEFYX1NDQUwpIHsKLSAgICBGREtyZWFkQml0cyAoaEJzLCAxKTsgICAgIC8qIGJzX2NvdXBsaW5nICovCi0gIH0KLQotICAvKgotICAgIEdyaWQgY29udHJvbAotICAqLwotICBpZiAoICFleHRyYWN0RnJhbWVJbmZvICggaEJzLCBoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YSwgMSwgZmxhZ3MpICkKLSAgIHJldHVybiAwOwotCi0gIGlmICggIWNoZWNrRnJhbWVJbmZvICgmaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLCBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzLCBvdmVybGFwLCBoSGVhZGVyRGF0YS0+dGltZVN0ZXApICkKLSAgICByZXR1cm4gMDsKLQotCi0gIC8qCi0gICAgRmV0Y2ggZG9tYWluIHZlY3RvcnMgKHRpbWUgb3IgZnJlcXVlbmN5IGRpcmVjdGlvbiBmb3IgZGVsdGEtY29kaW5nKQotICAqLwotICBzYnJHZXREaXJlY3Rpb25Db250cm9sRGF0YSAoaEZyYW1lRGF0YSwgaEJzKTsKLQotICBmb3IgKGk9MDsgaTxoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5JbnZmQmFuZHM7IGkrKykgewotICAgIGhGcmFtZURhdGEtPnNicl9pbnZmX21vZGVbaV0gPQotICAgICAgKElOVkZfTU9ERSkgRkRLcmVhZEJpdHMgKGhCcywgMik7Ci0gIH0KLQotCi0KLSAgLyogcmF3IGRhdGEgKi8KLSAgaWYgKCAhc2JyR2V0RW52ZWxvcGUgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhLCBoQnMsIGZsYWdzKSApCi0gICAgcmV0dXJuIDA7Ci0KLQotICBzYnJHZXROb2lzZUZsb29yRGF0YSAoaEhlYWRlckRhdGEsIGhGcmFtZURhdGEsIGhCcyk7Ci0KLSAgc2JyR2V0U3ludGhldGljQ29kZWREYXRhKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhLCBoQnMpOwotCi0gIHsKLSAgICAvKiBzYnIgZXh0ZW5kZWQgZGF0YSAqLwotICAgIGlmICghIGV4dHJhY3RFeHRlbmRlZERhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaFBhcmFtZXRyaWNTdGVyZW9EZWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSB7Ci0gICAgICByZXR1cm4gMDsKKyAgaWYgKG5DaCA9PSAyKSB7CisgICAgLyogUmVhZCBjb3VwbGluZyBmbGFnICovCisgICAgYnNfY291cGxpbmcgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChic19jb3VwbGluZykgeworICAgICAgaEZyYW1lRGF0YUxlZnQtPmNvdXBsaW5nID0gQ09VUExJTkdfTEVWRUw7CisgICAgICBoRnJhbWVEYXRhUmlnaHQtPmNvdXBsaW5nID0gQ09VUExJTkdfQkFMOworICAgIH0gZWxzZSB7CisgICAgICBoRnJhbWVEYXRhTGVmdC0+Y291cGxpbmcgPSBDT1VQTElOR19PRkY7CisgICAgICBoRnJhbWVEYXRhUmlnaHQtPmNvdXBsaW5nID0gQ09VUExJTkdfT0ZGOwogICAgIH0KLSAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLQotLyohCi0gIFxicmllZiAgICAgIFJlYWQgYml0c3RyZWFtIGVsZW1lbnRzIG9mIGEgY2hhbm5lbCBwYWlyCi0gIFxyZXR1cm4gICAgIFNickZyYW1lT0sKLSovCi1pbnQKLXNickdldENoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YUxlZnQsIC8qITwgRHluYW1pYyBjb250cm9sIGRhdGEgZm9yIGZpcnN0IGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoRnJhbWVEYXRhUmlnaHQsLyohPCBEeW5hbWljIGNvbnRyb2wgZGF0YSBmb3Igc2Vjb25kIGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQnMsICAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gc3RydWN0IEJJVF9CVUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG92ZXJsYXAgKQotewotICBpbnQgaSwgYml0OwotCi0KLSAgLyogUmVzZXJ2ZWQgYml0cyAqLwotICBpZiAoRkRLcmVhZEJpdHMoaEJzLCAxKSkgeyAgLyogYnNfZGF0YV9leHRyYSAqLwotICAgIEZES3JlYWRCaXRzKGhCcywgNCk7Ci0gICAgRkRLcmVhZEJpdHMoaEJzLCA0KTsKLSAgfQotCi0gIC8qIFJlYWQgY291cGxpbmcgZmxhZyAqLwotICBiaXQgPSBGREtyZWFkQml0cyAoaEJzLCAxKTsKLQotICBpZiAoYml0KSB7Ci0gICAgaEZyYW1lRGF0YUxlZnQtPmNvdXBsaW5nID0gQ09VUExJTkdfTEVWRUw7Ci0gICAgaEZyYW1lRGF0YVJpZ2h0LT5jb3VwbGluZyA9IENPVVBMSU5HX0JBTDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZmxhZ3MgJiBTQlJERUNfU1lOVEFYX1NDQUwpIHsKKyAgICAgIEZES3JlYWRCaXRzKGhCcywgMSk7IC8qIGJzX2NvdXBsaW5nICovCisgICAgfQogICAgIGhGcmFtZURhdGFMZWZ0LT5jb3VwbGluZyA9IENPVVBMSU5HX09GRjsKLSAgICBoRnJhbWVEYXRhUmlnaHQtPmNvdXBsaW5nID0gQ09VUExJTkdfT0ZGOwogICB9CiAKKyAgaWYgKGZsYWdzICYgKFNCUkRFQ19TWU5UQVhfVVNBQyB8IFNCUkRFQ19TWU5UQVhfUlNWRDUwKSkgeworICAgIGlmIChmbGFncyAmIFNCUkRFQ19VU0FDX0hBUk1PTklDU0JSKSB7CisgICAgICBoRnJhbWVEYXRhTGVmdC0+c2JyUGF0Y2hpbmdNb2RlID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgaWYgKGhGcmFtZURhdGFMZWZ0LT5zYnJQYXRjaGluZ01vZGUgPT0gMCkgeworICAgICAgICBoRnJhbWVEYXRhTGVmdC0+c2JyT3ZlcnNhbXBsaW5nRmxhZyA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgeyAvKiBzYnJQaXRjaEluQmluc0ZsYWcgKi8KKyAgICAgICAgICBoRnJhbWVEYXRhTGVmdC0+c2JyUGl0Y2hJbkJpbnMgPSBGREtyZWFkQml0cyhoQnMsIDcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhGcmFtZURhdGFMZWZ0LT5zYnJQaXRjaEluQmlucyA9IDA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhGcmFtZURhdGFMZWZ0LT5zYnJPdmVyc2FtcGxpbmdGbGFnID0gMDsKKyAgICAgICAgaEZyYW1lRGF0YUxlZnQtPnNiclBpdGNoSW5CaW5zID0gMDsKKyAgICAgIH0KIAotICAvKgotICAgIEdyaWQgY29udHJvbAotICAqLwotICBpZiAoICFleHRyYWN0RnJhbWVJbmZvIChoQnMsIGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgMiwgZmxhZ3MpICkKLSAgICByZXR1cm4gMDsKKyAgICAgIGlmIChuQ2ggPT0gMikgeworICAgICAgICBpZiAoYnNfY291cGxpbmcpIHsKKyAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNiclBhdGNoaW5nTW9kZSA9IGhGcmFtZURhdGFMZWZ0LT5zYnJQYXRjaGluZ01vZGU7CisgICAgICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJPdmVyc2FtcGxpbmdGbGFnID0KKyAgICAgICAgICAgICAgaEZyYW1lRGF0YUxlZnQtPnNick92ZXJzYW1wbGluZ0ZsYWc7CisgICAgICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJQaXRjaEluQmlucyA9IGhGcmFtZURhdGFMZWZ0LT5zYnJQaXRjaEluQmluczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNiclBhdGNoaW5nTW9kZSA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgICBpZiAoaEZyYW1lRGF0YVJpZ2h0LT5zYnJQYXRjaGluZ01vZGUgPT0gMCkgeworICAgICAgICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJPdmVyc2FtcGxpbmdGbGFnID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICAgICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgeyAvKiBzYnJQaXRjaEluQmluc0ZsYWcgKi8KKyAgICAgICAgICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJQaXRjaEluQmlucyA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNiclBpdGNoSW5CaW5zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJPdmVyc2FtcGxpbmdGbGFnID0gMDsKKyAgICAgICAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyUGl0Y2hJbkJpbnMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobkNoID09IDIpIHsKKyAgICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJQYXRjaGluZ01vZGUgPSAxOworICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNick92ZXJzYW1wbGluZ0ZsYWcgPSAwOworICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNiclBpdGNoSW5CaW5zID0gMDsKKyAgICAgIH0KIAotICBpZiAoICFjaGVja0ZyYW1lSW5mbyAoJmhGcmFtZURhdGFMZWZ0LT5mcmFtZUluZm8sIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMsIG92ZXJsYXAsIGhIZWFkZXJEYXRhLT50aW1lU3RlcCkgKQotICAgIHJldHVybiAwOworICAgICAgaEZyYW1lRGF0YUxlZnQtPnNiclBhdGNoaW5nTW9kZSA9IDE7CisgICAgICBoRnJhbWVEYXRhTGVmdC0+c2JyT3ZlcnNhbXBsaW5nRmxhZyA9IDA7CisgICAgICBoRnJhbWVEYXRhTGVmdC0+c2JyUGl0Y2hJbkJpbnMgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAobkNoID09IDIpIHsKKyAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyUGF0Y2hpbmdNb2RlID0gMTsKKyAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyT3ZlcnNhbXBsaW5nRmxhZyA9IDA7CisgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNiclBpdGNoSW5CaW5zID0gMDsKKyAgICB9CiAKLSAgaWYgKGhGcmFtZURhdGFMZWZ0LT5jb3VwbGluZykgewotICAgIEZES21lbWNweSAoJmhGcmFtZURhdGFSaWdodC0+ZnJhbWVJbmZvLCAmaEZyYW1lRGF0YUxlZnQtPmZyYW1lSW5mbywgc2l6ZW9mKEZSQU1FX0lORk8pKTsKLSAgICBoRnJhbWVEYXRhUmlnaHQtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWUgPSBoRnJhbWVEYXRhTGVmdC0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZTsKLSAgfQotICBlbHNlIHsKLSAgICBpZiAoICFleHRyYWN0RnJhbWVJbmZvIChoQnMsIGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhUmlnaHQsIDIsIGZsYWdzKSApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggIWNoZWNrRnJhbWVJbmZvICgmaEZyYW1lRGF0YVJpZ2h0LT5mcmFtZUluZm8sIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMsIG92ZXJsYXAsIGhIZWFkZXJEYXRhLT50aW1lU3RlcCkgKQotICAgICAgcmV0dXJuIDA7CisgICAgaEZyYW1lRGF0YUxlZnQtPnNiclBhdGNoaW5nTW9kZSA9IDE7CisgICAgaEZyYW1lRGF0YUxlZnQtPnNick92ZXJzYW1wbGluZ0ZsYWcgPSAwOworICAgIGhGcmFtZURhdGFMZWZ0LT5zYnJQaXRjaEluQmlucyA9IDA7CiAgIH0KIAogICAvKgotICAgIEZldGNoIGRvbWFpbiB2ZWN0b3JzICh0aW1lIG9yIGZyZXF1ZW5jeSBkaXJlY3Rpb24gZm9yIGRlbHRhLWNvZGluZykKKyAgICBzYnJfZ3JpZCgpOiBHcmlkIGNvbnRyb2wKICAgKi8KLSAgc2JyR2V0RGlyZWN0aW9uQ29udHJvbERhdGEgKGhGcmFtZURhdGFMZWZ0LCBoQnMpOwotICBzYnJHZXREaXJlY3Rpb25Db250cm9sRGF0YSAoaEZyYW1lRGF0YVJpZ2h0LCBoQnMpOworICBpZiAoaEhlYWRlckRhdGEtPmJzX2luZm8ucHZjX21vZGUpIHsKKyAgICBGREtfQVNTRVJUKG5DaCA9PSAxKTsgLyogUFZDIG5vdCBwb3NzaWJsZSBmb3IgQ1BFICovCisgICAgaWYgKCFleHRyYWN0UHZjRnJhbWVJbmZvKGhCcywgaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhTGVmdFByZXYsIHB2Y19tb2RlX2xhc3QsIGZsYWdzKSkKKyAgICAgIHJldHVybiAwOwogCi0gIGZvciAoaT0wOyBpPGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kczsgaSsrKSB7Ci0gICAgaEZyYW1lRGF0YUxlZnQtPnNicl9pbnZmX21vZGVbaV0gPSAoSU5WRl9NT0RFKSBGREtyZWFkQml0cyAoaEJzLCAyKTsKKyAgICBpZiAoIWNoZWNrRnJhbWVJbmZvKCZoRnJhbWVEYXRhTGVmdC0+ZnJhbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cywgb3ZlcmxhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT50aW1lU3RlcCkpCisgICAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIWV4dHJhY3RGcmFtZUluZm8oaEJzLCBoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIDEsIGZsYWdzKSkgcmV0dXJuIDA7CisKKyAgICBpZiAoIWNoZWNrRnJhbWVJbmZvKCZoRnJhbWVEYXRhTGVmdC0+ZnJhbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cywgb3ZlcmxhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT50aW1lU3RlcCkpCisgICAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobkNoID09IDIpIHsKKyAgICBpZiAoaEZyYW1lRGF0YUxlZnQtPmNvdXBsaW5nKSB7CisgICAgICBGREttZW1jcHkoJmhGcmFtZURhdGFSaWdodC0+ZnJhbWVJbmZvLCAmaEZyYW1lRGF0YUxlZnQtPmZyYW1lSW5mbywKKyAgICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfSU5GTykpOworICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lID0KKyAgICAgICAgICBoRnJhbWVEYXRhTGVmdC0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFleHRyYWN0RnJhbWVJbmZvKGhCcywgaEhlYWRlckRhdGEsIGhGcmFtZURhdGFSaWdodCwgMiwgZmxhZ3MpKQorICAgICAgICByZXR1cm4gMDsKKworICAgICAgaWYgKCFjaGVja0ZyYW1lSW5mbygmaEZyYW1lRGF0YVJpZ2h0LT5mcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMsIG92ZXJsYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT50aW1lU3RlcCkpCisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgfQogCi0gIGlmIChoRnJhbWVEYXRhTGVmdC0+Y291cGxpbmcpIHsKLSAgICBmb3IgKGk9MDsgaTxoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5JbnZmQmFuZHM7IGkrKykgewotICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJfaW52Zl9tb2RlW2ldID0gaEZyYW1lRGF0YUxlZnQtPnNicl9pbnZmX21vZGVbaV07Ci0gICAgfQorICAvKgorICAgIHNicl9kdGRmKCk6IEZldGNoIGRvbWFpbiB2ZWN0b3JzICh0aW1lIG9yIGZyZXF1ZW5jeSBkaXJlY3Rpb24gZm9yCisgICAgZGVsdGEtY29kaW5nKQorICAqLworICBzYnJHZXREaXJlY3Rpb25Db250cm9sRGF0YShoRnJhbWVEYXRhTGVmdCwgaEJzLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmJzX2luZm8ucHZjX21vZGUpOworICBpZiAobkNoID09IDIpIHsKKyAgICBzYnJHZXREaXJlY3Rpb25Db250cm9sRGF0YShoRnJhbWVEYXRhUmlnaHQsIGhCcywgZmxhZ3MsIDApOworICB9CiAKLQotICAgIGlmICggIXNickdldEVudmVsb3BlIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcywgZmxhZ3MpICkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc2JyR2V0Tm9pc2VGbG9vckRhdGEgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgaEJzKTsKLQotICAgIGlmICggIXNickdldEVudmVsb3BlIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCBoQnMsIGZsYWdzKSApIHsKLSAgICAgIHJldHVybiAwOworICAvKiBzYnJfaW52ZigpICovCisgIGZvciAoaSA9IDA7IGkgPCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5JbnZmQmFuZHM7IGkrKykgeworICAgIGhGcmFtZURhdGFMZWZ0LT5zYnJfaW52Zl9tb2RlW2ldID0gKElOVkZfTU9ERSlGREtyZWFkQml0cyhoQnMsIDIpOworICB9CisgIGlmIChuQ2ggPT0gMikgeworICAgIGlmIChoRnJhbWVEYXRhTGVmdC0+Y291cGxpbmcpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5JbnZmQmFuZHM7IGkrKykgeworICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNicl9pbnZmX21vZGVbaV0gPSBoRnJhbWVEYXRhTGVmdC0+c2JyX2ludmZfbW9kZVtpXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMDsgaSA8IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kczsgaSsrKSB7CisgICAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyX2ludmZfbW9kZVtpXSA9IChJTlZGX01PREUpRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICAgIH0KICAgICB9CiAgIH0KLSAgZWxzZSB7CiAKLSAgICBmb3IgKGk9MDsgaTxoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5JbnZmQmFuZHM7IGkrKykgewotICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJfaW52Zl9tb2RlW2ldID0gKElOVkZfTU9ERSkgRkRLcmVhZEJpdHMgKGhCcywgMik7CisgIGlmIChuQ2ggPT0gMSkgeworICAgIGlmIChoSGVhZGVyRGF0YS0+YnNfaW5mby5wdmNfbW9kZSkgeworICAgICAgaWYgKCFzYnJHZXRQdmNFbnZlbG9wZShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcywgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5ic19pbmZvLnB2Y19tb2RlKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc2JyR2V0RW52ZWxvcGUoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMsIGZsYWdzKSkKKyAgICAgIHJldHVybiAwOworCisgICAgc2JyR2V0Tm9pc2VGbG9vckRhdGEoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMpOworICB9IGVsc2UgaWYgKGhGcmFtZURhdGFMZWZ0LT5jb3VwbGluZykgeworICAgIGlmICghc2JyR2V0RW52ZWxvcGUoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMsIGZsYWdzKSkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgc2JyR2V0Tm9pc2VGbG9vckRhdGEoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMpOwogCi0KLSAgICBpZiAoICFzYnJHZXRFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMsIGZsYWdzKSApCisgICAgaWYgKCFzYnJHZXRFbnZlbG9wZShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCBoQnMsIGZsYWdzKSkgewogICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNickdldE5vaXNlRmxvb3JEYXRhKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhUmlnaHQsIGhCcyk7CisgIH0gZWxzZSB7IC8qIG5DaCA9PSAyICYmIG5vIGNvdXBsaW5nICovCiAKLSAgICBpZiAoICFzYnJHZXRFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFSaWdodCwgaEJzLCBmbGFncykgKQotICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFzYnJHZXRFbnZlbG9wZShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcywgZmxhZ3MpKSByZXR1cm4gMDsKIAotICAgIHNickdldE5vaXNlRmxvb3JEYXRhIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcyk7CisgICAgaWYgKCFzYnJHZXRFbnZlbG9wZShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCBoQnMsIGZsYWdzKSkgcmV0dXJuIDA7CiAKKyAgICBzYnJHZXROb2lzZUZsb29yRGF0YShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcyk7CisKKyAgICBzYnJHZXROb2lzZUZsb29yRGF0YShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCBoQnMpOwogICB9Ci0gIHNickdldE5vaXNlRmxvb3JEYXRhIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCBoQnMpOwogCi0gIHNickdldFN5bnRoZXRpY0NvZGVkRGF0YShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcyk7Ci0gIHNickdldFN5bnRoZXRpY0NvZGVkRGF0YShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCBoQnMpOworICBzYnJHZXRTeW50aGV0aWNDb2RlZERhdGEoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMsIGZsYWdzKTsKKyAgaWYgKG5DaCA9PSAyKSB7CisgICAgc2JyR2V0U3ludGhldGljQ29kZWREYXRhKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhUmlnaHQsIGhCcywgZmxhZ3MpOworICB9CiAKLSAgewotICAgIGlmICghIGV4dHJhY3RFeHRlbmRlZERhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICkgeworICBpZiAoIShmbGFncyAmIChTQlJERUNfU1lOVEFYX1VTQUMgfCBTQlJERUNfU1lOVEFYX1JTVkQ1MCkpKSB7CisgICAgaWYgKCFleHRyYWN0RXh0ZW5kZWREYXRhKGhIZWFkZXJEYXRhLCBoQnMsIGhQYXJhbWV0cmljU3RlcmVvRGVjKSkgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9CkBAIC02NjQsMzggKzgxOSw1MCBAQAogICByZXR1cm4gMTsKIH0KIAotCi0KLQogLyohCiAgIFxicmllZiAgIFJlYWQgZGlyZWN0aW9uIGNvbnRyb2wgZGF0YSBmcm9tIGJpdHN0cmVhbQogKi8KLXZvaWQKLXNickdldERpcmVjdGlvbkNvbnRyb2xEYXRhIChIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgU0JSX0ZSQU1FX0RBVEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzKSAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLwordm9pZCBzYnJHZXREaXJlY3Rpb25Db250cm9sRGF0YSgKKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgU0JSX0ZSQU1FX0RBVEEgKi8KKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLworICAgIGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IGludCBic19wdmNfbW9kZSkKKwogewogICBpbnQgaTsKKyAgaW50IGluZGVwRmxhZyA9IDA7CiAKLSAgZm9yIChpID0gMDsgaSA8IGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXM7IGkrKykgewotICAgIGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY1tpXSA9IEZES3JlYWRCaXRzIChoQnMsIDEpOworICBpZiAoZmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9VU0FDIHwgU0JSREVDX1NZTlRBWF9SU1ZENTApKSB7CisgICAgaW5kZXBGbGFnID0gZmxhZ3MgJiBTQlJERUNfVVNBQ19JTkRFUDsKICAgfQogCi0gIGZvciAoaSA9IDA7IGkgPCBoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mby5uTm9pc2VFbnZlbG9wZXM7IGkrKykgewotICAgIGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY19ub2lzZVtpXSA9IEZES3JlYWRCaXRzIChoQnMsIDEpOworICBpZiAoYnNfcHZjX21vZGUgPT0gMCkgeworICAgIGkgPSAwOworICAgIGlmIChpbmRlcEZsYWcpIHsKKyAgICAgIGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY1tpKytdID0gMDsKKyAgICB9CisgICAgZm9yICg7IGkgPCBoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzOyBpKyspIHsKKyAgICAgIGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY1tpXSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgfQorICB9CisKKyAgaSA9IDA7CisgIGlmIChpbmRlcEZsYWcpIHsKKyAgICBoX2ZyYW1lX2RhdGEtPmRvbWFpbl92ZWNfbm9pc2VbaSsrXSA9IDA7CisgIH0KKyAgZm9yICg7IGkgPCBoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mby5uTm9pc2VFbnZlbG9wZXM7IGkrKykgeworICAgIGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY19ub2lzZVtpXSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CiAgIH0KIH0KIAotCi0KIC8qIQogICBcYnJpZWYgICBSZWFkIG5vaXNlLWZsb29yLWxldmVsIGRhdGEgZnJvbSBiaXRzdHJlYW0KICovCi12b2lkCi1zYnJHZXROb2lzZUZsb29yRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaF9mcmFtZV9kYXRhLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgU0JSX0ZSQU1FX0RBVEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcykgICAgICAgICAgLyohPCBoYW5kbGUgdG8gc3RydWN0IEJJVF9CVUYgKi8KK3ZvaWQgc2JyR2V0Tm9pc2VGbG9vckRhdGEoCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZnJhbWVfZGF0YSwgLyohPCBoYW5kbGUgdG8gc3RydWN0IFNCUl9GUkFNRV9EQVRBICovCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKSAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gc3RydWN0IEJJVF9CVUYgKi8KIHsKLSAgaW50IGksajsKKyAgaW50IGksIGo7CiAgIGludCBkZWx0YTsKICAgQ09VUExJTkdfTU9ERSBjb3VwbGluZzsKICAgaW50IG5vTm9pc2VCYW5kcyA9IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubk5mYjsKQEAgLTcwNiw2MSArODczLDE1NyBAQAogCiAgIGNvdXBsaW5nID0gaF9mcmFtZV9kYXRhLT5jb3VwbGluZzsKIAotCiAgIC8qCiAgICAgU2VsZWN0IGh1ZmZtYW4gY29kZWJvb2sgZGVwZW5kaW5nIG9uIGNvdXBsaW5nIG1vZGUKICAgKi8KICAgaWYgKGNvdXBsaW5nID09IENPVVBMSU5HX0JBTCkgewogICAgIGhjYl9ub2lzZSA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfTm9pc2VCYWxhbmNlMTFUOwotICAgIGhjYl9ub2lzZUYgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMUY7ICAvKiAic2JyX2h1ZmZCb29rX05vaXNlQmFsYW5jZTExRiIgKi8KKyAgICBoY2Jfbm9pc2VGID0KKyAgICAgICAgKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTFGOyAvKiAic2JyX2h1ZmZCb29rX05vaXNlQmFsYW5jZTExRiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBlbnZEYXRhVGFibGVDb21wRmFjdG9yID0gMTsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBoY2Jfbm9pc2UgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX05vaXNlTGV2ZWwxMVQ7Ci0gICAgaGNiX25vaXNlRiA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52TGV2ZWwxMUY7ICAgIC8qICJzYnJfaHVmZkJvb2tfTm9pc2VMZXZlbDExRiIgKi8KKyAgICBoY2Jfbm9pc2VGID0KKyAgICAgICAgKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExRjsgLyogInNicl9odWZmQm9va19Ob2lzZUxldmVsMTFGIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBlbnZEYXRhVGFibGVDb21wRmFjdG9yID0gMDsKICAgfQogCiAgIC8qCiAgICAgUmVhZCByYXcgbm9pc2UtZW52ZWxvcGUgZGF0YQogICAqLwotICBmb3IgKGk9MDsgaTxoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mby5uTm9pc2VFbnZlbG9wZXM7IGkrKykgewotCi0KKyAgZm9yIChpID0gMDsgaSA8IGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CiAgICAgaWYgKGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY19ub2lzZVtpXSA9PSAwKSB7CiAgICAgICBpZiAoY291cGxpbmcgPT0gQ09VUExJTkdfQkFMKSB7Ci0gICAgICAgIGhfZnJhbWVfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2kqbm9Ob2lzZUJhbmRzXSA9Ci0gICAgICAgICAgKEZJWFBfU0dMKSAoKChpbnQpRkRLcmVhZEJpdHMgKGhCcywgNSkpIDw8IGVudkRhdGFUYWJsZUNvbXBGYWN0b3IpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGhfZnJhbWVfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2kqbm9Ob2lzZUJhbmRzXSA9Ci0gICAgICAgICAgKEZJWFBfU0dMKSAoaW50KUZES3JlYWRCaXRzIChoQnMsIDUpOworICAgICAgICBoX2ZyYW1lX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpICogbm9Ob2lzZUJhbmRzXSA9CisgICAgICAgICAgICAoRklYUF9TR0wpKCgoaW50KUZES3JlYWRCaXRzKGhCcywgNSkpIDw8IGVudkRhdGFUYWJsZUNvbXBGYWN0b3IpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaF9mcmFtZV9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSAqIG5vTm9pc2VCYW5kc10gPQorICAgICAgICAgICAgKEZJWFBfU0dMKShpbnQpRkRLcmVhZEJpdHMoaEJzLCA1KTsKICAgICAgIH0KIAogICAgICAgZm9yIChqID0gMTsgaiA8IG5vTm9pc2VCYW5kczsgaisrKSB7CiAgICAgICAgIGRlbHRhID0gRGVjb2RlSHVmZm1hbkNXKGhjYl9ub2lzZUYsIGhCcyk7Ci0gICAgICAgIGhfZnJhbWVfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2kqbm9Ob2lzZUJhbmRzK2pdID0gKEZJWFBfU0dMKSAoZGVsdGEgPDwgZW52RGF0YVRhYmxlQ29tcEZhY3Rvcik7CisgICAgICAgIGhfZnJhbWVfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2kgKiBub05vaXNlQmFuZHMgKyBqXSA9CisgICAgICAgICAgICAoRklYUF9TR0wpKGRlbHRhIDw8IGVudkRhdGFUYWJsZUNvbXBGYWN0b3IpOwogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgZm9yIChqID0gMDsgaiA8IG5vTm9pc2VCYW5kczsgaisrKSB7CiAgICAgICAgIGRlbHRhID0gRGVjb2RlSHVmZm1hbkNXKGhjYl9ub2lzZSwgaEJzKTsKLSAgICAgICAgaF9mcmFtZV9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSpub05vaXNlQmFuZHMral0gPSAoRklYUF9TR0wpIChkZWx0YSA8PCBlbnZEYXRhVGFibGVDb21wRmFjdG9yKTsKKyAgICAgICAgaF9mcmFtZV9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSAqIG5vTm9pc2VCYW5kcyArIGpdID0KKyAgICAgICAgICAgIChGSVhQX1NHTCkoZGVsdGEgPDwgZW52RGF0YVRhYmxlQ29tcEZhY3Rvcik7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKKy8qIG5zID0gbWFwTnNNb2RlMm5zW3B2Y01vZGUtMV1bbnNNb2RlXSAqLworc3RhdGljIGNvbnN0IFVDSEFSIG1hcE5zTW9kZTJuc1syXVsyXSA9IHsKKyAgICB7MTYsIDR9LCAvKiBwdmNNb2RlID0gMSAqLworICAgIHsxMiwgM30gIC8qIHB2Y01vZGUgPSAyICovCit9OwogCitzdGF0aWMgaW50IHNickdldFB2Y0VudmVsb3BlKAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2ZyYW1lX2RhdGEsIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBTQlJfRlJBTUVfREFUQSAqLworICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBCSVRfQlVGICovCisgICAgY29uc3QgVUlOVCBmbGFncywgY29uc3QgVUlOVCBwdmNNb2RlKSB7CisgIGludCBkaXZNb2RlLCBuc01vZGU7CisgIGludCBpbmRlcEZsYWcgPSBmbGFncyAmIFNCUkRFQ19VU0FDX0lOREVQOworICBVQ0hBUiAqcHZjSUQgPSBoX2ZyYW1lX2RhdGEtPnB2Y0lEOworCisgIGRpdk1vZGUgPSBGREtyZWFkQml0cyhoQnMsIFBWQ19ESVZNT0RFX0JJVFMpOworICBuc01vZGUgPSBGREtyZWFkQml0KGhCcyk7CisgIEZES19BU1NFUlQoKHB2Y01vZGUgPT0gMSkgfHwgKHB2Y01vZGUgPT0gMikpOworICBoX2ZyYW1lX2RhdGEtPm5zID0gbWFwTnNNb2RlMm5zW3B2Y01vZGUgLSAxXVtuc01vZGVdOworCisgIGlmIChkaXZNb2RlIDw9IDMpIHsKKyAgICBpbnQgaSwgayA9IDEsIHN1bV9sZW5ndGggPSAwLCByZXVzZV9wY3ZJRDsKKworICAgIC8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciBmaXJzdCB0aW1lIHNsb3Qgaz0wICovCisgICAgaW5kZXBGbGFnID8gKHJldXNlX3BjdklEID0gMCkgOiAocmV1c2VfcGN2SUQgPSBGREtyZWFkQml0KGhCcykpOworICAgIGlmIChyZXVzZV9wY3ZJRCkgeworICAgICAgcHZjSURbMF0gPSBoSGVhZGVyRGF0YS0+cHZjSURwcmV2OworICAgIH0gZWxzZSB7CisgICAgICBwdmNJRFswXSA9IEZES3JlYWRCaXRzKGhCcywgUFZDX1BWQ0lEX0JJVFMpOworICAgIH0KKworICAgIC8qIG90aGVyIHRpbWUgc2xvdHMgaz4wICovCisgICAgZm9yIChpID0gMDsgaSA8IGRpdk1vZGU7IGkrKykgeworICAgICAgaW50IGxlbmd0aCwgbnVtQml0cyA9IDQ7CisKKyAgICAgIGlmIChzdW1fbGVuZ3RoID49IDEzKSB7CisgICAgICAgIG51bUJpdHMgPSAxOworICAgICAgfSBlbHNlIGlmIChzdW1fbGVuZ3RoID49IDExKSB7CisgICAgICAgIG51bUJpdHMgPSAyOworICAgICAgfSBlbHNlIGlmIChzdW1fbGVuZ3RoID49IDcpIHsKKyAgICAgICAgbnVtQml0cyA9IDM7CisgICAgICB9CisKKyAgICAgIGxlbmd0aCA9IEZES3JlYWRCaXRzKGhCcywgbnVtQml0cyk7CisgICAgICBzdW1fbGVuZ3RoICs9IGxlbmd0aCArIDE7CisgICAgICBpZiAoc3VtX2xlbmd0aCA+PSBQVkNfTlRJTUVTTE9UKSB7CisgICAgICAgIHJldHVybiAwOyAvKiBwYXJzZSBlcnJvciAqLworICAgICAgfQorICAgICAgZm9yICg7IGxlbmd0aC0tOyBrKyspIHsKKyAgICAgICAgcHZjSURba10gPSBwdmNJRFtrIC0gMV07CisgICAgICB9CisgICAgICBwdmNJRFtrKytdID0gRkRLcmVhZEJpdHMoaEJzLCBQVkNfUFZDSURfQklUUyk7CisgICAgfQorICAgIGZvciAoOyBrIDwgMTY7IGsrKykgeworICAgICAgcHZjSURba10gPSBwdmNJRFtrIC0gMV07CisgICAgfQorICB9IGVsc2UgeyAvKiBkaXZNb2RlID49IDQgKi8KKyAgICBpbnQgbnVtX2dyaWRfaW5mbywgZml4ZWRfbGVuZ3RoLCBncmlkX2luZm8sIGosIGsgPSAwOworCisgICAgZGl2TW9kZSAtPSA0OworICAgIG51bV9ncmlkX2luZm8gPSAyIDw8IGRpdk1vZGU7CisgICAgZml4ZWRfbGVuZ3RoID0gOCA+PiBkaXZNb2RlOworICAgIEZES19BU1NFUlQobnVtX2dyaWRfaW5mbyAqIGZpeGVkX2xlbmd0aCA9PSBQVkNfTlRJTUVTTE9UKTsKKworICAgIC8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciBmaXJzdCB0aW1lIHNsb3Qgaz0wICovCisgICAgaW5kZXBGbGFnID8gKGdyaWRfaW5mbyA9IDEpIDogKGdyaWRfaW5mbyA9IEZES3JlYWRCaXQoaEJzKSk7CisgICAgaWYgKGdyaWRfaW5mbykgeworICAgICAgcHZjSURbaysrXSA9IEZES3JlYWRCaXRzKGhCcywgUFZDX1BWQ0lEX0JJVFMpOworICAgIH0gZWxzZSB7CisgICAgICBwdmNJRFtrKytdID0gaEhlYWRlckRhdGEtPnB2Y0lEcHJldjsKKyAgICB9CisgICAgaiA9IGZpeGVkX2xlbmd0aCAtIDE7CisgICAgZm9yICg7IGotLTsgaysrKSB7CisgICAgICBwdmNJRFtrXSA9IHB2Y0lEW2sgLSAxXTsKKyAgICB9CisgICAgbnVtX2dyaWRfaW5mby0tOworCisgICAgLyogb3RoZXIgdGltZSBzbG90cyBrPjAgKi8KKyAgICBmb3IgKDsgbnVtX2dyaWRfaW5mby0tOykgeworICAgICAgaiA9IGZpeGVkX2xlbmd0aDsKKyAgICAgIGdyaWRfaW5mbyA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgIGlmIChncmlkX2luZm8pIHsKKyAgICAgICAgcHZjSURbaysrXSA9IEZES3JlYWRCaXRzKGhCcywgUFZDX1BWQ0lEX0JJVFMpOworICAgICAgICBqLS07CisgICAgICB9CisgICAgICBmb3IgKDsgai0tOyBrKyspIHsKKyAgICAgICAgcHZjSURba10gPSBwdmNJRFtrIC0gMV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgaEhlYWRlckRhdGEtPnB2Y0lEcHJldiA9IHB2Y0lEW1BWQ19OVElNRVNMT1QgLSAxXTsKKworICAvKiB1c2FnZSBvZiBQVkMgZXhjbHVkZXMgaW50ZXItVEVTIHRvb2wgKi8KKyAgaF9mcmFtZV9kYXRhLT5pVEVTYWN0aXZlID0gKFVDSEFSKTA7CisKKyAgcmV0dXJuIDE7Cit9CiAvKiEKICAgXGJyaWVmICAgUmVhZCBlbnZlbG9wZSBkYXRhIGZyb20gYml0c3RyZWFtCiAqLwotc3RhdGljIGludAotc2JyR2V0RW52ZWxvcGUgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfZnJhbWVfZGF0YSwgLyohPCBoYW5kbGUgdG8gc3RydWN0IFNCUl9GUkFNRV9EQVRBICovCi0gICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQnMsICAgICAgICAgIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBCSVRfQlVGICovCi0gICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncykKLXsKK3N0YXRpYyBpbnQgc2JyR2V0RW52ZWxvcGUoCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZnJhbWVfZGF0YSwgLyohPCBoYW5kbGUgdG8gc3RydWN0IFNCUl9GUkFNRV9EQVRBICovCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gc3RydWN0IEJJVF9CVUYgKi8KKyAgICBjb25zdCBVSU5UIGZsYWdzKSB7CiAgIGludCBpLCBqOwogICBVQ0hBUiBub19iYW5kW01BWF9FTlZFTE9QRVNdOwogICBpbnQgZGVsdGEgPSAwOwpAQCAtNzc0LDcgKzEwMzcsNyBAQAogCiAgIGhfZnJhbWVfZGF0YS0+blNjYWxlRmFjdG9ycyA9IDA7CiAKLSAgaWYgKCAoaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8uZnJhbWVDbGFzcyA9PSAwKSAmJiAobkVudmVsb3BlcyA9PSAxKSApIHsKKyAgaWYgKChoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mby5mcmFtZUNsYXNzID09IDApICYmIChuRW52ZWxvcGVzID09IDEpKSB7CiAgICAgaWYgKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKQogICAgICAgYW1wUmVzID0gaF9mcmFtZV9kYXRhLT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lOwogICAgIGVsc2UKQEAgLTc4NSwxMyArMTA0OCwxMCBAQAogICAvKgogICAgIFNldCBudW1iZXIgb2YgYml0cyBmb3IgZmlyc3QgdmFsdWUgZGVwZW5kaW5nIG9uIGFtcGxpdHVkZSByZXNvbHV0aW9uCiAgICovCi0gIGlmKGFtcFJlcyA9PSAxKQotICB7CisgIGlmIChhbXBSZXMgPT0gMSkgewogICAgIHN0YXJ0X2JpdHMgPSA2OwogICAgIHN0YXJ0X2JpdHNfYmFsYW5jZSA9IDU7Ci0gIH0KLSAgZWxzZQotICB7CisgIH0gZWxzZSB7CiAgICAgc3RhcnRfYml0cyA9IDc7CiAgICAgc3RhcnRfYml0c19iYWxhbmNlID0gNjsKICAgfQpAQCAtODAwLDExICsxMDYwLDExIEBACiAgICAgQ2FsY3VsYXRlIG51bWJlciBvZiB2YWx1ZXMgZm9yIGVhY2ggZW52ZWxvcGUgYW5kIGFsbHRvZ2V0aGVyCiAgICovCiAgIGZvciAoaSA9IDA7IGkgPCBuRW52ZWxvcGVzOyBpKyspIHsKLSAgICBub19iYW5kW2ldID0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiW2hfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLmZyZXFSZXNbaV1dOworICAgIG5vX2JhbmRbaV0gPQorICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmJbaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8uZnJlcVJlc1tpXV07CiAgICAgaF9mcmFtZV9kYXRhLT5uU2NhbGVGYWN0b3JzICs9IG5vX2JhbmRbaV07CiAgIH0KLSAgaWYgKGhfZnJhbWVfZGF0YS0+blNjYWxlRmFjdG9ycyA+IE1BWF9OVU1fRU5WRUxPUEVfVkFMVUVTKQotICAgIHJldHVybiAwOworICBpZiAoaF9mcmFtZV9kYXRhLT5uU2NhbGVGYWN0b3JzID4gTUFYX05VTV9FTlZFTE9QRV9WQUxVRVMpIHJldHVybiAwOwogCiAgIC8qCiAgICAgU2VsZWN0IEh1ZmZtYW4gY29kZWJvb2sgZGVwZW5kaW5nIG9uIGNvdXBsaW5nIG1vZGUgYW5kIGFtcGxpdHVkZSByZXNvbHV0aW9uCkBAIC04MTQsNTcgKzEwNzQsNjQgQEAKICAgICBpZiAoYW1wUmVzID09IDApIHsKICAgICAgIGhjYl90ID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTBUOwogICAgICAgaGNiX2YgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMEY7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBoY2JfdCA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52QmFsYW5jZTExVDsKICAgICAgIGhjYl9mID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTFGOwogICAgIH0KLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBlbnZEYXRhVGFibGVDb21wRmFjdG9yID0gMDsKICAgICBpZiAoYW1wUmVzID09IDApIHsKICAgICAgIGhjYl90ID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDEwVDsKICAgICAgIGhjYl9mID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDEwRjsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIGhjYl90ID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExVDsKICAgICAgIGhjYl9mID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExRjsKICAgICB9CiAgIH0KIAorICBoX2ZyYW1lX2RhdGEtPmlURVNhY3RpdmUgPSAoVUNIQVIpMDsgLyogZGlzYWJsZSBpbnRlci1URVMgYnkgZGVmYXVsdCAqLwogICAvKgogICAgIE5vdyByZWFkIHJhdyBlbnZlbG9wZSBkYXRhCiAgICovCiAgIGZvciAoaiA9IDAsIG9mZnNldCA9IDA7IGogPCBuRW52ZWxvcGVzOyBqKyspIHsKLQotCiAgICAgaWYgKGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY1tqXSA9PSAwKSB7CiAgICAgICBpZiAoY291cGxpbmcgPT0gQ09VUExJTkdfQkFMKSB7CiAgICAgICAgIGhfZnJhbWVfZGF0YS0+aUVudmVsb3BlW29mZnNldF0gPQotICAgICAgICAgIChGSVhQX1NHTCkgKCggKGludClGREtyZWFkQml0cyhoQnMsIHN0YXJ0X2JpdHNfYmFsYW5jZSkpIDw8IGVudkRhdGFUYWJsZUNvbXBGYWN0b3IpOwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICAgICAgICAoRklYUF9TR0wpKCgoaW50KUZES3JlYWRCaXRzKGhCcywgc3RhcnRfYml0c19iYWxhbmNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW52RGF0YVRhYmxlQ29tcEZhY3Rvcik7CisgICAgICB9IGVsc2UgewogICAgICAgICBoX2ZyYW1lX2RhdGEtPmlFbnZlbG9wZVtvZmZzZXRdID0KLSAgICAgICAgICAoRklYUF9TR0wpIChpbnQpRkRLcmVhZEJpdHMgKGhCcywgc3RhcnRfYml0cyk7CisgICAgICAgICAgICAoRklYUF9TR0wpKGludClGREtyZWFkQml0cyhoQnMsIHN0YXJ0X2JpdHMpOwogICAgICAgfQogICAgIH0KIAogICAgIGZvciAoaSA9ICgxIC0gaF9mcmFtZV9kYXRhLT5kb21haW5fdmVjW2pdKTsgaSA8IG5vX2JhbmRbal07IGkrKykgewotCiAgICAgICBpZiAoaF9mcmFtZV9kYXRhLT5kb21haW5fdmVjW2pdID09IDApIHsKICAgICAgICAgZGVsdGEgPSBEZWNvZGVIdWZmbWFuQ1coaGNiX2YsIGhCcyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIGRlbHRhID0gRGVjb2RlSHVmZm1hbkNXKGhjYl90LCBoQnMpOwogICAgICAgfQogCi0gICAgICBoX2ZyYW1lX2RhdGEtPmlFbnZlbG9wZVtvZmZzZXQgKyBpXSA9IChGSVhQX1NHTCkgKGRlbHRhIDw8IGVudkRhdGFUYWJsZUNvbXBGYWN0b3IpOworICAgICAgaF9mcmFtZV9kYXRhLT5pRW52ZWxvcGVbb2Zmc2V0ICsgaV0gPQorICAgICAgICAgIChGSVhQX1NHTCkoZGVsdGEgPDwgZW52RGF0YVRhYmxlQ29tcEZhY3Rvcik7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiBTQlJERUNfU1lOVEFYX1VTQUMpICYmIChmbGFncyAmIFNCUkRFQ19VU0FDX0lURVMpKSB7CisgICAgICBpbnQgYnNfdGVtcF9zaGFwZSA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgIEZES19BU1NFUlQoaiA8IDgpOworICAgICAgaF9mcmFtZV9kYXRhLT5pVEVTYWN0aXZlIHw9IChVQ0hBUikoYnNfdGVtcF9zaGFwZSA8PCBqKTsKKyAgICAgIGlmIChic190ZW1wX3NoYXBlKSB7CisgICAgICAgIGhfZnJhbWVfZGF0YS0+aW50ZXJUZW1wU2hhcGVNb2RlW2pdID0KKyAgICAgICAgICAgIEZES3JlYWQyQml0cyhoQnMpOyAvKiBic19pbnRlcl90ZW1wX3NoYXBlX21vZGUgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhfZnJhbWVfZGF0YS0+aW50ZXJUZW1wU2hhcGVNb2RlW2pdID0gMDsKKyAgICAgIH0KICAgICB9CiAgICAgb2Zmc2V0ICs9IG5vX2JhbmRbal07CiAgIH0KIAogI2lmIEVOVl9FWFBfRlJBQ1QKLSAgLyogQ29udmVydCBmcm9tIGludCB0byBzY2FsZWQgZnJhY3QgKEVOVl9FWFBfRlJBQ1QgYml0cyBmb3IgdGhlIGZyYWN0aW9uYWwgcGFydCkgKi8KKyAgLyogQ29udmVydCBmcm9tIGludCB0byBzY2FsZWQgZnJhY3QgKEVOVl9FWFBfRlJBQ1QgYml0cyBmb3IgdGhlIGZyYWN0aW9uYWwKKyAgICogcGFydCkgKi8KICAgZm9yIChpID0gMDsgaSA8IGhfZnJhbWVfZGF0YS0+blNjYWxlRmFjdG9yczsgaSsrKSB7CiAgICAgaF9mcmFtZV9kYXRhLT5pRW52ZWxvcGVbaV0gPDw9IEVOVl9FWFBfRlJBQ1Q7CiAgIH0KQEAgLTg3Myw2MSArMTE0MCw1MyBAQAogICByZXR1cm4gMTsKIH0KIAotCi0vL3N0YXRpYyBjb25zdCBGUkFNRV9JTkZPIHZfZnJhbWVfaW5mbzFfOCA9IHsgMCwgMSwgezAsIDh9LCB7MX0sIC0xLCAxLCB7MCwgOH0gfTsKLXN0YXRpYyBjb25zdCBGUkFNRV9JTkZPIHZfZnJhbWVfaW5mbzJfOCA9IHsgMCwgMiwgezAsIDQsIDh9LCB7MSwgMX0sIC0xLCAyLCB7MCwgNCwgOH0gfTsKLXN0YXRpYyBjb25zdCBGUkFNRV9JTkZPIHZfZnJhbWVfaW5mbzRfOCA9IHsgMCwgNCwgezAsIDIsIDQsIDYsIDh9LCB7MSwgMSwgMSwgMX0sIC0xLCAyLCB7MCwgNCwgOH0gfTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQotICBcYnJpZWYgICAgR2VuZXJhdGVzIGZyYW1lIGluZm8gZm9yIEZJWEZJWG9ubHkgZnJhbWUgY2xhc3MgdXNlZCBmb3IgbG93IGRlbGF5IHZlcnNpb24KKyAgXGJyaWVmICAgIEdlbmVyYXRlcyBmcmFtZSBpbmZvIGZvciBGSVhGSVhvbmx5IGZyYW1lIGNsYXNzIHVzZWQgZm9yIGxvdyBkZWxheQorIHZlcnNpb24KIAogICBccmV0dXJuICAgbm90aGluZwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gc3RhdGljIHZvaWQgZ2VuZXJhdGVGaXhGaXhPbmx5ICggRlJBTUVfSU5GTyAqaFNickZyYW1lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhblBvc0ludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIGludCBuRW52LCBpLCB0cmFuSWR4OwotICAgIGNvbnN0IGludCAqcFRhYmxlOworc3RhdGljIHZvaWQgZ2VuZXJhdGVGaXhGaXhPbmx5KEZSQU1FX0lORk8gKmhTYnJGcmFtZUluZm8sIGludCB0cmFuUG9zSW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cywgY29uc3QgVUlOVCBmbGFncykgeworICBpbnQgbkVudiwgaSwgdHJhbklkeDsKKyAgY29uc3QgaW50ICpwVGFibGU7CiAKLSAgICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykgewotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICBwVGFibGUgPSBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzhbdHJhblBvc0ludGVybmFsXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgcFRhYmxlID0gRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV8xNVt0cmFuUG9zSW50ZXJuYWxdOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICBwVGFibGUgPSBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE2W3RyYW5Qb3NJbnRlcm5hbF07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEZES19BU1NFUlQoMCk7Ci0gICAgICAgICAgICAvKiBpbiBjYXNlIGFzc2VydGlvbiBjaGVja3MgYXJlIGRpc2FibGVkLCBmb3JjZSBhIGRlZmluaXRlIG1lbW9yeSBmYXVsdCBhdCBmaXJzdCBhY2Nlc3MgKi8KLSAgICAgICAgICAgIHBUYWJsZSA9IE5VTEw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9CisgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7CisgICAgY2FzZSA4OgorICAgICAgcFRhYmxlID0gRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV84W3RyYW5Qb3NJbnRlcm5hbF07CisgICAgICBicmVhazsKKyAgICBjYXNlIDE1OgorICAgICAgcFRhYmxlID0gRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV8xNVt0cmFuUG9zSW50ZXJuYWxdOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIDE2OgorICAgICAgcFRhYmxlID0gRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV8xNlt0cmFuUG9zSW50ZXJuYWxdOworICAgICAgYnJlYWs7CisgIH0KIAotICAgIC8qIGxvb2sgbnVtYmVyIG9mIGVudmVsb3BlcyBpbiB0YWJsZSAqLwotICAgIG5FbnYgPSBwVGFibGVbMF07Ci0gICAgLyogbG9vayB1cCBlbnZlbG9wZSBkaXN0cmlidXRpb24gaW4gdGFibGUgKi8KLSAgICBmb3IgKGk9MTsgaTxuRW52OyBpKyspCi0gICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBwVGFibGVbaSsyXTsKLSAgICAvKiBvcGVuIGFuZCBjbG9zZSBmcmFtZSBib3JkZXIgKi8KLSAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdICAgID0gMDsKLSAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gbnVtYmVyVGltZVNsb3RzOwotICAgIGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSBuRW52OworICAvKiBsb29rIG51bWJlciBvZiBlbnZlbG9wZXMgaW4gdGFibGUgKi8KKyAgbkVudiA9IHBUYWJsZVswXTsKKyAgLyogbG9vayB1cCBlbnZlbG9wZSBkaXN0cmlidXRpb24gaW4gdGFibGUgKi8KKyAgZm9yIChpID0gMTsgaSA8IG5FbnY7IGkrKykgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IHBUYWJsZVtpICsgMl07CisgIC8qIG9wZW4gYW5kIGNsb3NlIGZyYW1lIGJvcmRlciAqLworICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gMDsKKyAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XSA9IG51bWJlclRpbWVTbG90czsKKyAgaFNickZyYW1lSW5mby0+bkVudmVsb3BlcyA9IG5FbnY7CiAKLSAgIC8qIHRyYW5zaWVudCBpZHggKi8KLSAgICB0cmFuSWR4ID0gaFNickZyYW1lSW5mby0+dHJhbkVudiA9IHBUYWJsZVsxXTsKKyAgLyogdHJhbnNpZW50IGlkeCAqLworICB0cmFuSWR4ID0gaFNickZyYW1lSW5mby0+dHJhbkVudiA9IHBUYWJsZVsxXTsKIAotICAgIC8qIGFkZCBub2lzZSBmbG9vcnMgKi8KLSAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSAwOwotICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbdHJhbklkeD90cmFuSWR4OjFdOwotICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsyXSA9IG51bWJlclRpbWVTbG90czsKLSAgICAvKiBuRW52IGlzIGFsd2F5cyA+IDEsIHNvIG5Ob2lzZUVudmVsb3BlcyBpcyBhbHdheXMgMiAoSUVDIDE0NDk2LTMgNC42LjE5LjMuMikgKi8KLSAgICBoU2JyRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXMgPSAyOworICAvKiBhZGQgbm9pc2UgZmxvb3JzICovCisgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVswXSA9IDA7CisgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9CisgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW3RyYW5JZHggPyB0cmFuSWR4IDogMV07CisgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsyXSA9IG51bWJlclRpbWVTbG90czsKKyAgLyogbkVudiBpcyBhbHdheXMgPiAxLCBzbyBuTm9pc2VFbnZlbG9wZXMgaXMgYWx3YXlzIDIgKElFQyAxNDQ5Ni0zIDQuNi4xOS4zLjIpCisgICAqLworICBoU2JyRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXMgPSAyOwogfQogCiAvKiEKQEAgLTkzNSwzNTUgKzExOTQsNDMwIEBACiAKICAgXHJldHVybiB6ZXJvIGZvciBiaXRzdHJlYW0gZXJyb3IsIG9uZSBmb3IgY29ycmVjdC4KICovCi1zdGF0aWMgaW50Ci1leHRyYWN0TG93RGVsYXlHcmlkIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCAgICAgICAgICAvKiE8IGJpdGJ1ZmZlciBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLCAvKiE8IGNvbnRhaW5zIHRoZSBGUkFNRV9JTkZPIHN0cnVjdCB0byBiZSBmaWxsZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU2xvdHMKLSAgICAgICAgICAgICAgICAgICAgKQotewotICBGUkFNRV9JTkZPICogcEZyYW1lSW5mbyA9ICZoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mbzsKK3N0YXRpYyBpbnQgZXh0cmFjdExvd0RlbGF5R3JpZCgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCAvKiE8IGJpdGJ1ZmZlciBoYW5kbGUgKi8KKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQQorICAgICAgICBoX2ZyYW1lX2RhdGEsIC8qITwgY29udGFpbnMgdGhlIEZSQU1FX0lORk8gc3RydWN0IHRvIGJlIGZpbGxlZCAqLworICAgIGludCB0aW1lU2xvdHMsIGNvbnN0IFVJTlQgZmxhZ3MpIHsKKyAgRlJBTUVfSU5GTyAqcEZyYW1lSW5mbyA9ICZoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mbzsKICAgSU5UIG51bWJlclRpbWVTbG90cyA9IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHM7CiAgIElOVCB0ZW1wID0gMCwgazsKIAotICAgICAgLyogRklYRklYb25seSBmcmFtaW5nIGNhc2UgKi8KLSAgICAgIGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLmZyYW1lQ2xhc3MgPSAwOworICAvKiBGSVhGSVhvbmx5IGZyYW1pbmcgY2FzZSAqLworICBoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mby5mcmFtZUNsYXNzID0gMDsKIAotICAgICAgLyogZ2V0IHRoZSB0cmFuc2llbnQgcG9zaXRpb24gZnJvbSB0aGUgYml0c3RyZWFtICovCi0gICAgICBzd2l0Y2ggKHRpbWVTbG90cyl7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAvKiAzYml0IHRyYW5zaWVudCBwb3NpdGlvbiAodGVtcD17MDsuLjs3fSkgKi8KLSAgICAgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoIGhCaXRCdWYsIDMpOwotICAgICAgICAgIGJyZWFrOworICAvKiBnZXQgdGhlIHRyYW5zaWVudCBwb3NpdGlvbiBmcm9tIHRoZSBiaXRzdHJlYW0gKi8KKyAgc3dpdGNoICh0aW1lU2xvdHMpIHsKKyAgICBjYXNlIDg6CisgICAgICAvKiAzYml0IHRyYW5zaWVudCBwb3NpdGlvbiAodGVtcD17MDsuLjs3fSkgKi8KKyAgICAgIHRlbXAgPSBGREtyZWFkQml0cyhoQml0QnVmLCAzKTsKKyAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgLyogNGJpdCB0cmFuc2llbnQgcG9zaXRpb24gKHRlbXA9ezA7Li47MTV9KSAqLwotICAgICAgICAgIHRlbXAgPSBGREtyZWFkQml0cyggaEJpdEJ1ZiwgNCk7Ci0gICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICBjYXNlIDE1OgorICAgICAgLyogNGJpdCB0cmFuc2llbnQgcG9zaXRpb24gKHRlbXA9ezA7Li47MTV9KSAqLworICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKGhCaXRCdWYsIDQpOworICAgICAgYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KIAotICAgICAgLyogY2FsY3VsYXRlIGJvcmRlcnMgYWNjb3JkaW5nIHRvIHRoZSB0cmFuc2llbnQgcG9zaXRpb24gKi8KLSAgICAgIGdlbmVyYXRlRml4Rml4T25seSAoIHBGcmFtZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyVGltZVNsb3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgLyogRm9yICJjYXNlIDE1IiBvbmx5Ki8KKyAgaWYgKHRlbXAgPj0gdGltZVNsb3RzKSB7CisgICAgcmV0dXJuIDA7CisgIH0KIAotICAgICAgLyogZGVjb2RlIGZyZXEgcmVzOiAqLwotICAgICAgZm9yIChrID0gMDsgayA8IHBGcmFtZUluZm8tPm5FbnZlbG9wZXM7IGsrKykgewotICAgICAgICAgIHBGcmFtZUluZm8tPmZyZXFSZXNba10gPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAxKTsgLyogZiA9IEYgWzEgYml0c10gKi8gICAgICAgICAgCi0gICAgICB9CisgIC8qIGNhbGN1bGF0ZSBib3JkZXJzIGFjY29yZGluZyB0byB0aGUgdHJhbnNpZW50IHBvc2l0aW9uICovCisgIGdlbmVyYXRlRml4Rml4T25seShwRnJhbWVJbmZvLCB0ZW1wLCBudW1iZXJUaW1lU2xvdHMsIGZsYWdzKTsKIAorICAvKiBkZWNvZGUgZnJlcSByZXM6ICovCisgIGZvciAoayA9IDA7IGsgPCBwRnJhbWVJbmZvLT5uRW52ZWxvcGVzOyBrKyspIHsKKyAgICBwRnJhbWVJbmZvLT5mcmVxUmVzW2tdID0KKyAgICAgICAgKFVDSEFSKUZES3JlYWRCaXRzKGhCaXRCdWYsIDEpOyAvKiBmID0gRiBbMSBiaXRzXSAqLworICB9CiAKICAgcmV0dXJuIDE7CiB9CiAKIC8qIQotICBcYnJpZWYgICBFeHRyYWN0IHRoZSBmcmFtZSBpbmZvcm1hdGlvbiAoc3RydWN0dXJlIEZSQU1FX0lORk8pIGZyb20gdGhlIGJpdHN0cmVhbQotICBccmV0dXJuICBaZXJvIGZvciBiaXRzdHJlYW0gZXJyb3IsIG9uZSBmb3IgY29ycmVjdC4KKyAgXGJyaWVmICAgRXh0cmFjdCB0aGUgUFZDIGZyYW1lIGluZm9ybWF0aW9uIChzdHJ1Y3R1cmUgRlJBTUVfSU5GTykgZnJvbSB0aGUKKyAgYml0c3RyZWFtIFxyZXR1cm4gIFplcm8gZm9yIGJpdHN0cmVhbSBlcnJvciwgb25lIGZvciBjb3JyZWN0LgogKi8KLWludAotZXh0cmFjdEZyYW1lSW5mbyAoIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzLCAgICAgICAgICAvKiE8IGJpdGJ1ZmZlciBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoX2ZyYW1lX2RhdGEsIC8qITwgcG9pbnRlciB0byBtZW1vcnkgd2hlcmUgdGhlIGZyYW1lLWluZm8gd2lsbCBiZSBzdG9yZWQgKi8KLSAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIG5yT2ZDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzCi0gICAgICAgICAgICAgICAgICkKLXsKLSAgRlJBTUVfSU5GTyAqIHBGcmFtZUluZm8gPSAmaF9mcmFtZV9kYXRhLT5mcmFtZUluZm87CitpbnQgZXh0cmFjdFB2Y0ZyYW1lSW5mbygKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsICAgICAgICAgICAvKiE8IGJpdGJ1ZmZlciBoYW5kbGUgKi8KKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLCAvKiE8IHBvaW50ZXIgdG8gbWVtb3J5IHdoZXJlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLWluZm8gd2lsbCBiZSBzdG9yZWQgKi8KKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZnJhbWVfZGF0YSwgLyohPCBwb2ludGVyIHRvIG1lbW9yeSB3aGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJldmlvdXMgZnJhbWUtaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCAqLworICAgIFVDSEFSIHB2Y19tb2RlX2xhc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBWQyBtb2RlIG9mIGxhc3QgZnJhbWUgKi8KKyAgICBjb25zdCBVSU5UIGZsYWdzKSB7CisgIEZSQU1FX0lORk8gKnBGcmFtZUluZm8gPSAmaF9mcmFtZV9kYXRhLT5mcmFtZUluZm87CisgIEZSQU1FX0lORk8gKnBQcmV2RnJhbWVJbmZvID0gJmhfcHJldl9mcmFtZV9kYXRhLT5wcmV2RnJhbWVJbmZvOworICBpbnQgYnNfdmFyX2xlbl9oZiwgYnNfbm9pc2VfcG9zaXRpb247CisgIGJzX25vaXNlX3Bvc2l0aW9uID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsgLyogU0JSX1BWQ19OT0lTRVBPU0lUSU9OX0JJVFMgNCAqLworICBic192YXJfbGVuX2hmID0gRkRLcmVhZEJpdChoQnMpOworICBwRnJhbWVJbmZvLT5ub2lzZVBvc2l0aW9uID0gYnNfbm9pc2VfcG9zaXRpb247CisgIHBGcmFtZUluZm8tPnRyYW5FbnYgPSAtMTsKKworICAvKiBJbml0IGZvciBic19ub2lzZV9wb3NpdGlvbiA9PSAwIGluIGNhc2UgYSBwYXJzZSBlcnJvciBpcyBmb3VuZCBiZWxvdy4gKi8KKyAgcEZyYW1lSW5mby0+bkVudmVsb3BlcyA9IDE7CisgIHBGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDE7CisgIHBGcmFtZUluZm8tPmZyZXFSZXNbMF0gPSAwOworCisgIGlmIChic192YXJfbGVuX2hmKSB7IC8qIDEgb3IgMyBCaXRzICovCisgICAgcEZyYW1lSW5mby0+dmFyTGVuZ3RoID0gRkRLcmVhZEJpdHMoaEJzLCAyKSArIDE7CisgICAgaWYgKHBGcmFtZUluZm8tPnZhckxlbmd0aCA+IDMpIHsKKyAgICAgIHBGcmFtZUluZm8tPnZhckxlbmd0aCA9CisgICAgICAgICAgMDsgICAgLyogYXNzdW1lIGJzX3Zhcl9sZW5faGYgPT0gMCBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICByZXR1cm4gMDsgLyogcmVzZXJ2ZWQgdmFsdWUgLT4gcGFyc2UgZXJyb3IgKi8KKyAgICB9CisgIH0gZWxzZSB7CisgICAgcEZyYW1lSW5mby0+dmFyTGVuZ3RoID0gMDsKKyAgfQorCisgIGlmIChic19ub2lzZV9wb3NpdGlvbikgeworICAgIHBGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSAyOworICAgIHBGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDI7CisgICAgRkRLbWVtY2xlYXIocEZyYW1lSW5mby0+ZnJlcVJlcywgc2l6ZW9mKHBGcmFtZUluZm8tPmZyZXFSZXMpKTsKKyAgfQorCisgIC8qIGZyYW1lIGJvcmRlciBjYWxjdWxhdGlvbiAqLworICBpZiAoaEhlYWRlckRhdGEtPmJzX2luZm8ucHZjX21vZGUgPiAwKSB7CisgICAgLyogU2VlICI3LjUuMS40IEhGIGFkanVzdG1lbnQgb2YgU0JSIGVudmVsb3BlIHNjYWxlZmFjdG9ycyIgZm9yIHJlZmVyZW5jZS4KKyAgICAgKi8KKworICAgIEZES19BU1NFUlQoKHBGcmFtZUluZm8tPm5FbnZlbG9wZXMgPT0gMSkgfHwgKHBGcmFtZUluZm8tPm5FbnZlbG9wZXMgPT0gMikpOworCisgICAgLyogbGVmdCB0aW1lYm9yZGVyLW9mZnNldDogdXNlIHRoZSB0aW1lYm9yZGVyIG9mIHByZXYgU0JSIGZyYW1lICovCisgICAgaWYgKHBQcmV2RnJhbWVJbmZvLT5uRW52ZWxvcGVzID4gMCkgeworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1swXSA9CisgICAgICAgICAgcFByZXZGcmFtZUluZm8tPmJvcmRlcnNbcFByZXZGcmFtZUluZm8tPm5FbnZlbG9wZXNdIC0gUFZDX05USU1FU0xPVDsKKyAgICAgIEZES19BU1NFUlQocEZyYW1lSW5mby0+Ym9yZGVyc1swXSA8PSAzKTsKKyAgICB9IGVsc2UgeworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IDA7CisgICAgfQorCisgICAgLyogcmlnaHQgdGltZWJvcmRlci1vZmZzZXQ6ICovCisgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1twRnJhbWVJbmZvLT5uRW52ZWxvcGVzXSA9IDE2ICsgcEZyYW1lSW5mby0+dmFyTGVuZ3RoOworCisgICAgaWYgKHBGcmFtZUluZm8tPm5FbnZlbG9wZXMgPT0gMikgeworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1sxXSA9IHBGcmFtZUluZm8tPm5vaXNlUG9zaXRpb247CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRpb24gb2YgUFZDIHRpbWUgYm9yZGVycyB0X0VQVkMgKi8KKyAgICBpZiAocHZjX21vZGVfbGFzdCA9PSAwKSB7CisgICAgICAvKiB0aGVyZSB3YXMgYSBsZWdhY3kgU0JSIGZyYW1lIGJlZm9yZSB0aGlzIGZyYW1lID0+IHVzZSBic192YXJfbGVuJyBmb3IKKyAgICAgICAqIGZpcnN0IFBWQyB0aW1lc2xvdCAqLworICAgICAgcEZyYW1lSW5mby0+cHZjQm9yZGVyc1swXSA9IHBGcmFtZUluZm8tPmJvcmRlcnNbMF07CisgICAgfSBlbHNlIHsKKyAgICAgIHBGcmFtZUluZm8tPnB2Y0JvcmRlcnNbMF0gPSAwOworICAgIH0KKyAgICBpZiAocEZyYW1lSW5mby0+bkVudmVsb3BlcyA9PSAyKSB7CisgICAgICBwRnJhbWVJbmZvLT5wdmNCb3JkZXJzWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1sxXTsKKyAgICB9CisgICAgcEZyYW1lSW5mby0+cHZjQm9yZGVyc1twRnJhbWVJbmZvLT5uRW52ZWxvcGVzXSA9IDE2OworCisgICAgLyogY2FsY3VsYXRpb24gb2YgU0JSIG5vaXNlLWZsb29yIHRpbWUtYm9yZGVyIHZlY3RvcjogKi8KKyAgICBmb3IgKElOVCBpID0gMDsgaSA8PSBwRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXM7IGkrKykgeworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlW2ldID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tpXTsKKyAgICB9CisKKyAgICBwRnJhbWVJbmZvLT50cmFuRW52ID0gLTE7IC8qIHRyYW5FbnYgbm90IHVzZWQgKi8KKyAgfQorICByZXR1cm4gMTsKK30KKworLyohCisgIFxicmllZiAgIEV4dHJhY3QgdGhlIGZyYW1lIGluZm9ybWF0aW9uIChzdHJ1Y3R1cmUgRlJBTUVfSU5GTykgZnJvbSB0aGUKKyAgYml0c3RyZWFtIFxyZXR1cm4gIFplcm8gZm9yIGJpdHN0cmVhbSBlcnJvciwgb25lIGZvciBjb3JyZWN0LgorKi8KK2ludCBleHRyYWN0RnJhbWVJbmZvKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAgICAgICAgIC8qITwgYml0YnVmZmVyIGhhbmRsZSAqLworICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2ZyYW1lX2RhdGEsIC8qITwgcG9pbnRlciB0byBtZW1vcnkgd2hlcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtaW5mbyB3aWxsIGJlIHN0b3JlZCAqLworICAgIGNvbnN0IFVJTlQgbnJPZkNoYW5uZWxzLCBjb25zdCBVSU5UIGZsYWdzKSB7CisgIEZSQU1FX0lORk8gKnBGcmFtZUluZm8gPSAmaF9mcmFtZV9kYXRhLT5mcmFtZUluZm87CiAgIGludCBudW1iZXJUaW1lU2xvdHMgPSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzOwotICBpbnQgcG9pbnRlcl9iaXRzID0gMCwgbkVudiA9IDAsIGIgPSAwLCBib3JkZXIsIGksIG4gPSAwLAotICAgIGssIHAsIGFMLCBhUiwgbkwsIG5SLAotICAgIHRlbXAgPSAwLCBzdGF0aWNGcmVxUmVzOworICBpbnQgcG9pbnRlcl9iaXRzID0gMCwgbkVudiA9IDAsIGIgPSAwLCBib3JkZXIsIGksIG4gPSAwLCBrLCBwLCBhTCwgYVIsIG5MLCBuUiwKKyAgICAgIHRlbXAgPSAwLCBzdGF0aWNGcmVxUmVzOwogICBVQ0hBUiBmcmFtZUNsYXNzOwogCiAgIGlmIChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkgewotICAgICAgLyogQ09ERUNfQUFDTEQgKExEK1NCUikgb25seSB1c2VzIHRoZSBub3JtYWwgMCBHcmlkIGZvciBub24tdHJhbnNpZW50IEZyYW1lcyBhbmQgdGhlIExvd0RlbGF5R3JpZCBmb3IgdHJhbnNpZW50IEZyYW1lcyAqLwotICAgICAgZnJhbWVDbGFzcyA9IEZES3JlYWRCaXRzIChoQnMsIDEpOyAvKiBmcmFtZUNsYXNzID0gWzEgYml0XSAqLwotICAgICAgaWYgKCBmcmFtZUNsYXNzID09IDEgKSB7Ci0gICAgICAgIC8qIGlmIGZyYW1lQ2xhc3MgPT0gMSwgZXh0cmFjdCBMb3dEZWxheVNickdyaWQsIG90aGVyd2lzZSBleHRyYWN0IG5vcm1hbCBTQlItR3JpZCBmb3IgRklYSUZYICovCi0gICAgICAgIC8qIGV4dHJhY3QgdGhlIEFBQ0xELVNici1HcmlkICovCi0gICAgICAgIHBGcmFtZUluZm8tPmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOwotICAgICAgICBleHRyYWN0TG93RGVsYXlHcmlkIChoQnMsIGhIZWFkZXJEYXRhLCBoX2ZyYW1lX2RhdGEsIG51bWJlclRpbWVTbG90cyk7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICB9IGVsc2UKLSAgewotICAgIGZyYW1lQ2xhc3MgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsgLyogZnJhbWVDbGFzcyA9IEMgWzIgYml0c10gKi8KLSAgfQotCi0KLSAgc3dpdGNoIChmcmFtZUNsYXNzKSB7Ci0gIGNhc2UgMDoKLSAgICB0ZW1wID0gRkRLcmVhZEJpdHMgKGhCcywgMik7ICAgICAvKiBFIFsyIGJpdHMgXSAqLwotICAgIG5FbnYgPSAoaW50KSAoMSA8PCB0ZW1wKTsgICAgLyogRSAtPiBlICovCi0KLSAgICBpZiAoKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKSAmJiAobkVudiA9PSAxKSkKLSAgICAgIGhfZnJhbWVfZGF0YS0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZSA9IEZES3JlYWRCaXRzKCBoQnMsIDEpOyAvKiBuZXcgRUxEIFN5bnRheCAwNy0xMS0wOSAqLwotCi0gICAgc3RhdGljRnJlcVJlcyA9IEZES3JlYWRCaXRzIChoQnMsIDEpOwotCi0gICAgewotICAgICAgaWYgKG5FbnYgPiBNQVhfRU5WRUxPUEVTX0hFQUFDKQotICAgICAgICByZXR1cm4gMDsKKyAgICAvKiBDT0RFQ19BQUNMRCAoTEQrU0JSKSBvbmx5IHVzZXMgdGhlIG5vcm1hbCAwIEdyaWQgZm9yIG5vbi10cmFuc2llbnQgRnJhbWVzCisgICAgICogYW5kIHRoZSBMb3dEZWxheUdyaWQgZm9yIHRyYW5zaWVudCBGcmFtZXMgKi8KKyAgICBmcmFtZUNsYXNzID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsgLyogZnJhbWVDbGFzcyA9IFsxIGJpdF0gKi8KKyAgICBpZiAoZnJhbWVDbGFzcyA9PSAxKSB7CisgICAgICAvKiBpZiBmcmFtZUNsYXNzID09IDEsIGV4dHJhY3QgTG93RGVsYXlTYnJHcmlkLCBvdGhlcndpc2UgZXh0cmFjdCBub3JtYWwKKyAgICAgICAqIFNCUi1HcmlkIGZvciBGSVhJRlggKi8KKyAgICAgIC8qIGV4dHJhY3QgdGhlIEFBQ0xELVNici1HcmlkICovCisgICAgICBwRnJhbWVJbmZvLT5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKKyAgICAgIGludCBlcnIgPSAxOworICAgICAgZXJyID0gZXh0cmFjdExvd0RlbGF5R3JpZChoQnMsIGhIZWFkZXJEYXRhLCBoX2ZyYW1lX2RhdGEsIG51bWJlclRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0KLSAgICBiID0gbkVudiArIDE7Ci0gICAgc3dpdGNoIChuRW52KSB7Ci0gICAgY2FzZSAxOgotICAgICAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKLSAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICBGREttZW1jcHkgKHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzFfMTUsIHNpemVvZihGUkFNRV9JTkZPKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgRkRLbWVtY3B5IChwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8xXzE2LCBzaXplb2YoRlJBTUVfSU5GTykpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIEZES19BU1NFUlQoMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykgewotICAgICAgICBjYXNlIDE1OgotICAgICAgICAgIEZES21lbWNweSAocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMl8xNSwgc2l6ZW9mKEZSQU1FX0lORk8pKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICBGREttZW1jcHkgKHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzJfMTYsIHNpemVvZihGUkFNRV9JTkZPKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7Ci0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgRkRLbWVtY3B5IChwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm80XzE1LCBzaXplb2YoRlJBTUVfSU5GTykpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgIEZES21lbWNweSAocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvNF8xNiwgc2l6ZW9mKEZSQU1FX0lORk8pKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBGREtfQVNTRVJUKDApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotI2lmIChNQVhfRU5WRUxPUEVTID49IDgpCi0gICAgICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykgewotICAgICAgICBjYXNlIDE1OgotICAgICAgICAgIEZES21lbWNweSAocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvOF8xNSwgc2l6ZW9mKEZSQU1FX0lORk8pKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICBGREttZW1jcHkgKHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzhfMTYsIHNpemVvZihGUkFNRV9JTkZPKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2Vsc2UKLSAgICAgIHJldHVybiAwOwotI2VuZGlmCi0gICAgfQotICAgIC8qIEFwcGx5IGNvcnJlY3QgZnJlcVJlcyAoSGlnaCBpcyBkZWZhdWx0KSAqLwotICAgIGlmICghc3RhdGljRnJlcVJlcykgewotICAgICAgZm9yIChpID0gMDsgaSA8IG5FbnYgOyBpKyspCi0gICAgICAgIHBGcmFtZUluZm8tPmZyZXFSZXNbaV0gPSAwOwotICAgIH0KLQotICAgIGJyZWFrOwotICBjYXNlIDE6Ci0gIGNhc2UgMjoKLSAgICB0ZW1wID0gRkRLcmVhZEJpdHMgKGhCcywgMik7ICAvKiBBIFsyIGJpdHNdICovCi0KLSAgICBuICAgID0gRkRLcmVhZEJpdHMgKGhCcywgMik7ICAvKiBuID0gTiBbMiBiaXRzXSAqLwotCi0gICAgbkVudiA9IG4gKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIyBlbnZlbG9wZXMgKi8KLSAgICBiID0gbkVudiArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAjIGJvcmRlcnMgICAqLwotCi0gICAgYnJlYWs7CisgIH0gZWxzZSB7CisgICAgZnJhbWVDbGFzcyA9IEZES3JlYWRCaXRzKGhCcywgMik7IC8qIGZyYW1lQ2xhc3MgPSBDIFsyIGJpdHNdICovCiAgIH0KIAogICBzd2l0Y2ggKGZyYW1lQ2xhc3MpIHsKLSAgY2FzZSAxOgotICAgIC8qIERlY29kZSBib3JkZXJzOiAqLwotICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSAwOyAgICAgICAgICAgICAgIC8qIGZpcnN0IGJvcmRlciAgICAgICAgICAqLwotICAgIGJvcmRlciA9IHRlbXAgKyBudW1iZXJUaW1lU2xvdHM7ICAgICAgICAgIC8qIEEgLT4gYVIgICAgICAgICAgICAgICAqLwotICAgIGkgPSBiLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyYW1lIGluZm8gaW5kZXggZm9yIGxhc3QgYm9yZGVyICovCi0gICAgcEZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsgICAgICAgICAgLyogbGFzdCBib3JkZXIgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGZvciAoayA9IDA7IGsgPCBuOyBrKyspIHsKLSAgICAgIHRlbXAgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsvKiBSIFsyIGJpdHNdICovCi0gICAgICBib3JkZXIgLT0gKDIgKiB0ZW1wICsgMik7ICAgICAgICAgICAgICAgLyogUiAtPiByICAgICAgICAgICAgICAgICovCi0gICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWy0taV0gPSBib3JkZXI7Ci0gICAgfQotCi0KLSAgICAvKiBEZWNvZGUgcG9pbnRlcjogKi8KLSAgICBwb2ludGVyX2JpdHMgPSBERlJBQ1RfQklUUyAtIDEgLSBDb3VudExlYWRpbmdCaXRzKChGSVhQX0RCTCkobisxKSk7Ci0gICAgcCA9IEZES3JlYWRCaXRzIChoQnMsIHBvaW50ZXJfYml0cyk7ICAgICAvKiBwID0gUCBbcG9pbnRlcl9iaXRzIGJpdHNdICovCi0KLSAgICBpZiAocCA+IG4rMSkKLSAgICAgIHJldHVybiAwOwotCi0gICAgcEZyYW1lSW5mby0+dHJhbkVudiA9IHAgPyBuICsgMiAtIHAgOiAtMTsKLQotCi0gICAgLyogRGVjb2RlIGZyZXEgcmVzOiAqLwotICAgIGZvciAoayA9IG47IGsgPj0gMDsgay0tKSB7Ci0gICAgICBwRnJhbWVJbmZvLT5mcmVxUmVzW2tdID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7IC8qIGYgPSBGIFsxIGJpdHNdICovCi0gICAgfQotCi0KLSAgICAvKiBDYWxjdWxhdGUgbm9pc2UgZmxvb3IgbWlkZGxlIGJvcmRlcjogKi8KLSAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkKLSAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IHBGcmFtZUluZm8tPmJvcmRlcnNbbl07Ci0gICAgZWxzZQotICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1twRnJhbWVJbmZvLT50cmFuRW52XTsKLQotICAgIGJyZWFrOwotCi0gIGNhc2UgMjoKLSAgICAvKiBEZWNvZGUgYm9yZGVyczogKi8KLSAgICBib3JkZXIgPSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBIC0+IGFMICovCi0gICAgcEZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGJvcmRlcjsgICAgICAgICAgLyogZmlyc3QgYm9yZGVyICovCi0KLSAgICBmb3IgKGsgPSAxOyBrIDw9IG47IGsrKykgewotICAgICAgdGVtcCA9IEZES3JlYWRCaXRzIChoQnMsIDIpOy8qIFIgWzIgYml0c10gKi8KLSAgICAgIGJvcmRlciArPSAoMiAqIHRlbXAgKyAyKTsgICAgICAgICAgICAgICAvKiBSIC0+IHIgICAgICAgICAgICAgICAgKi8KLSAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNba10gPSBib3JkZXI7Ci0gICAgfQotICAgIHBGcmFtZUluZm8tPmJvcmRlcnNba10gPSBudW1iZXJUaW1lU2xvdHM7IC8qIGxhc3QgYm9yZGVyICovCi0KLQotICAgIC8qIERlY29kZSBwb2ludGVyOiAqLwotICAgIHBvaW50ZXJfYml0cyA9IERGUkFDVF9CSVRTIC0gMSAtIENvdW50TGVhZGluZ0JpdHMoKEZJWFBfREJMKShuKzEpKTsKLSAgICBwID0gRkRLcmVhZEJpdHMgKGhCcywgcG9pbnRlcl9iaXRzKTsgICAgIC8qIHAgPSBQIFtwb2ludGVyX2JpdHMgYml0c10gKi8KLSAgICBpZiAocCA+IG4rMSkKLSAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKHAgPT0gMCB8fCBwID09IDEpCi0gICAgICBwRnJhbWVJbmZvLT50cmFuRW52ID0gLTE7Ci0gICAgZWxzZQotICAgICAgcEZyYW1lSW5mby0+dHJhbkVudiA9IHAgLSAxOwotCi0KLQotICAgIC8qIERlY29kZSBmcmVxIHJlczogKi8KLSAgICBmb3IgKGsgPSAwOyBrIDw9IG47IGsrKykgewotICAgICAgcEZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IEZES3JlYWRCaXRzKGhCcywgMSk7IC8qIGYgPSBGIFsxIGJpdHNdICovCi0gICAgfQotCi0KLQotICAgIC8qIENhbGN1bGF0ZSBub2lzZSBmbG9vciBtaWRkbGUgYm9yZGVyOiAqLwotICAgIHN3aXRjaCAocCkgewogICAgIGNhc2UgMDoKLSAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IHBGcmFtZUluZm8tPmJvcmRlcnNbMV07CisgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsgLyogRSBbMiBiaXRzIF0gKi8KKyAgICAgIG5FbnYgPSAoaW50KSgxIDw8IHRlbXApOyAgICAvKiBFIC0+IGUgKi8KKworICAgICAgaWYgKChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkgJiYgKG5FbnYgPT0gMSkpCisgICAgICAgIGhfZnJhbWVfZGF0YS0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZSA9CisgICAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDEpOyAvKiBuZXcgRUxEIFN5bnRheCAwNy0xMS0wOSAqLworCisgICAgICBzdGF0aWNGcmVxUmVzID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKworICAgICAgaWYgKGZsYWdzICYgKFNCUkRFQ19TWU5UQVhfVVNBQyB8IFNCUkRFQ19TWU5UQVhfUlNWRDUwKSkgeworICAgICAgICBpZiAobkVudiA+IE1BWF9FTlZFTE9QRVNfVVNBQykgcmV0dXJuIDA7CisgICAgICB9IGVsc2UKKworICAgICAgICBiID0gbkVudiArIDE7CisgICAgICBzd2l0Y2ggKG5FbnYpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICBGREttZW1jcHkocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9JTkZPKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgRkRLbWVtY3B5KHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzFfMTYsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfSU5GTykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgIEZES21lbWNweShwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8yXzE1LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0lORk8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICBGREttZW1jcHkocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMl8xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9JTkZPKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykgeworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgRkRLbWVtY3B5KHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzRfMTUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfSU5GTykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgIEZES21lbWNweShwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm80XzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0lORk8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorI2lmIChNQVhfRU5WRUxPUEVTID49IDgpCisgICAgICAgICAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgIEZES21lbWNweShwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm84XzE1LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0lORk8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICBGREttZW1jcHkocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvOF8xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9JTkZPKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgICB9CisgICAgICAvKiBBcHBseSBjb3JyZWN0IGZyZXFSZXMgKEhpZ2ggaXMgZGVmYXVsdCkgKi8KKyAgICAgIGlmICghc3RhdGljRnJlcVJlcykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkVudjsgaSsrKSBwRnJhbWVJbmZvLT5mcmVxUmVzW2ldID0gMDsKKyAgICAgIH0KKwogICAgICAgYnJlYWs7CiAgICAgY2FzZSAxOgotICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuXTsKKyAgICBjYXNlIDI6CisgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsgLyogQSBbMiBiaXRzXSAqLworCisgICAgICBuID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsgLyogbiA9IE4gWzIgYml0c10gKi8KKworICAgICAgbkVudiA9IG4gKyAxOyAvKiAjIGVudmVsb3BlcyAqLworICAgICAgYiA9IG5FbnYgKyAxOyAvKiAjIGJvcmRlcnMgICAqLworCiAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1twRnJhbWVJbmZvLT50cmFuRW52XTsKLSAgICAgIGJyZWFrOwotICAgIH0KKyAgfQogCi0gICAgYnJlYWs7CisgIHN3aXRjaCAoZnJhbWVDbGFzcykgeworICAgIGNhc2UgMToKKyAgICAgIC8qIERlY29kZSBib3JkZXJzOiAqLworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IDA7ICAgICAgLyogZmlyc3QgYm9yZGVyICAgICAgICAgICovCisgICAgICBib3JkZXIgPSB0ZW1wICsgbnVtYmVyVGltZVNsb3RzOyAvKiBBIC0+IGFSICAgICAgICAgICAgICAgKi8KKyAgICAgIGkgPSBiIC0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyYW1lIGluZm8gaW5kZXggZm9yIGxhc3QgYm9yZGVyICovCisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gYm9yZGVyOyAvKiBsYXN0IGJvcmRlciAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gIGNhc2UgMzoKLSAgICAvKiB2X2N0cmxTaWduYWwgPSBbZnJhbWVDbGFzcyxhTCxhUixuTCxuUix2X3JMLHZfclIscCx2X2ZMUl07ICovCisgICAgICBmb3IgKGsgPSAwOyBrIDwgbjsgaysrKSB7CisgICAgICAgIHRlbXAgPSBGREtyZWFkQml0cyhoQnMsIDIpOyAvKiBSIFsyIGJpdHNdICovCisgICAgICAgIGJvcmRlciAtPSAoMiAqIHRlbXAgKyAyKTsgICAvKiBSIC0+IHIgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1stLWldID0gYm9yZGVyOworICAgICAgfQogCi0gICAgYUwgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsgICAgICAgLyogQUwgWzIgYml0c10sIEFMIC0+IGFMICovCisgICAgICAvKiBEZWNvZGUgcG9pbnRlcjogKi8KKyAgICAgIHBvaW50ZXJfYml0cyA9IERGUkFDVF9CSVRTIC0gMSAtIENvdW50TGVhZGluZ0JpdHMoKEZJWFBfREJMKShuICsgMSkpOworICAgICAgcCA9IEZES3JlYWRCaXRzKGhCcywgcG9pbnRlcl9iaXRzKTsgLyogcCA9IFAgW3BvaW50ZXJfYml0cyBiaXRzXSAqLwogCi0gICAgYVIgPSBGREtyZWFkQml0cyAoaEJzLCAyKSArIG51bWJlclRpbWVTbG90czsgICAgIC8qIEFSIFsyIGJpdHNdLCBBUiAtPiBhUiAqLworICAgICAgaWYgKHAgPiBuICsgMSkgcmV0dXJuIDA7CiAKLSAgICBuTCA9IEZES3JlYWRCaXRzIChoQnMsIDIpOyAgICAgICAvKiBuTCA9IE5MIFsyIGJpdHNdICovCisgICAgICBwRnJhbWVJbmZvLT50cmFuRW52ID0gcCA/IG4gKyAyIC0gcCA6IC0xOwogCi0gICAgblIgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsgICAgICAgLyogblIgPSBOUiBbMiBiaXRzXSAqLworICAgICAgLyogRGVjb2RlIGZyZXEgcmVzOiAqLworICAgICAgZm9yIChrID0gbjsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgcEZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IEZES3JlYWRCaXRzKGhCcywgMSk7IC8qIGYgPSBGIFsxIGJpdHNdICovCisgICAgICB9CiAKLQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBDYWxjdWxhdGUgaGVscCB2YXJpYWJsZXMKLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIC8qIGdlbmVyYWw6ICovCi0gICAgbkVudiA9IG5MICsgblIgKyAxOyAgICAgICAgICAgIC8qICMgZW52ZWxvcGVzICovCi0gICAgaWYgKG5FbnYgPiBNQVhfRU5WRUxPUEVTKQotICAgICAgcmV0dXJuIDA7Ci0gICAgYiA9IG5FbnYgKyAxOyAgICAgICAgICAgICAgICAgIC8qICMgYm9yZGVycyAgICovCi0KLQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBEZWNvZGUgZW52ZWxvcGVzCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotICAgIC8qIEwtYm9yZGVyczogICAqLwotICAgIGJvcmRlciAgICAgICAgICAgID0gYUw7ICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGJvcmRlciAqLwotICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBib3JkZXI7Ci0KLSAgICBmb3IgKGsgPSAxOyBrIDw9IG5MOyBrKyspIHsKLSAgICAgIHRlbXAgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsvKiBSIFsyIGJpdHNdICovCi0gICAgICBib3JkZXIgKz0gKDIgKiB0ZW1wICsgMik7ICAgICAgICAgICAgICAgLyogUiAtPiByICAgICAgICAgICAgICAgICovCi0gICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW2tdID0gYm9yZGVyOwotICAgIH0KLQotCi0gICAgLyogUi1ib3JkZXJzOiAgKi8KLSAgICBib3JkZXIgPSBhUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsYXN0IGJvcmRlciAqLwotICAgIGkgICAgICA9IG5FbnY7Ci0KLSAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gYm9yZGVyOwotCi0gICAgZm9yIChrID0gMDsgayA8IG5SOyBrKyspIHsKLSAgICAgIHRlbXAgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsvKiBSIFsyIGJpdHNdICovCi0gICAgICBib3JkZXIgLT0gKDIgKiB0ZW1wICsgMik7ICAgICAgICAgICAgICAgLyogUiAtPiByICAgICAgICAgICAgICAgICovCi0gICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWy0taV0gPSBib3JkZXI7Ci0gICAgfQotCi0KLSAgICAvKiBkZWNvZGUgcG9pbnRlcjogKi8KLSAgICBwb2ludGVyX2JpdHMgPSBERlJBQ1RfQklUUyAtIDEgLSBDb3VudExlYWRpbmdCaXRzKChGSVhQX0RCTCkobkwrblIrMSkpOwotICAgIHAgPSBGREtyZWFkQml0cyAoaEJzLCBwb2ludGVyX2JpdHMpOyAgICAgLyogcCA9IFAgW3BvaW50ZXJfYml0cyBiaXRzXSAqLwotCi0gICAgaWYgKHAgPiBuTCtuUisxKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBwRnJhbWVJbmZvLT50cmFuRW52ID0gcCA/IGIgLSBwIDogLTE7Ci0KLQotCi0gICAgLyogZGVjb2RlIGZyZXEgcmVzOiAqLwotICAgIGZvciAoayA9IDA7IGsgPCBuRW52OyBrKyspIHsKLSAgICAgIHBGcmFtZUluZm8tPmZyZXFSZXNba10gPSBGREtyZWFkQml0cyhoQnMsIDEpOyAvKiBmID0gRiBbMSBiaXRzXSAqLwotICAgIH0KLQotCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIERlY29kZSBub2lzZSBmbG9vcnMKLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSBhTDsKLQotICAgIGlmIChuRW52ID09IDEpIHsKLSAgICAgIC8qIDEgbm9pc2UgZmxvb3IgZW52ZWxvcGU6ICovCi0gICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBhUjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiAyIG5vaXNlIGZsb29yIGVudmVsb3BlcyAqLworICAgICAgLyogQ2FsY3VsYXRlIG5vaXNlIGZsb29yIG1pZGRsZSBib3JkZXI6ICovCiAgICAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkKLSAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuRW52IC0gMV07CisgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IHBGcmFtZUluZm8tPmJvcmRlcnNbbl07CiAgICAgICBlbHNlCiAgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IHBGcmFtZUluZm8tPmJvcmRlcnNbcEZyYW1lSW5mby0+dHJhbkVudl07Ci0gICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMl0gPSBhUjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KIAorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgICAvKiBEZWNvZGUgYm9yZGVyczogKi8KKyAgICAgIGJvcmRlciA9IHRlbXA7ICAgICAgICAgICAgICAgICAgIC8qIEEgLT4gYUwgKi8KKyAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBib3JkZXI7IC8qIGZpcnN0IGJvcmRlciAqLworCisgICAgICBmb3IgKGsgPSAxOyBrIDw9IG47IGsrKykgeworICAgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsgLyogUiBbMiBiaXRzXSAqLworICAgICAgICBib3JkZXIgKz0gKDIgKiB0ZW1wICsgMik7ICAgLyogUiAtPiByICAgICAgICAgICAgICAgICovCisgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNba10gPSBib3JkZXI7CisgICAgICB9CisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW2tdID0gbnVtYmVyVGltZVNsb3RzOyAvKiBsYXN0IGJvcmRlciAqLworCisgICAgICAvKiBEZWNvZGUgcG9pbnRlcjogKi8KKyAgICAgIHBvaW50ZXJfYml0cyA9IERGUkFDVF9CSVRTIC0gMSAtIENvdW50TGVhZGluZ0JpdHMoKEZJWFBfREJMKShuICsgMSkpOworICAgICAgcCA9IEZES3JlYWRCaXRzKGhCcywgcG9pbnRlcl9iaXRzKTsgLyogcCA9IFAgW3BvaW50ZXJfYml0cyBiaXRzXSAqLworICAgICAgaWYgKHAgPiBuICsgMSkgcmV0dXJuIDA7CisKKyAgICAgIGlmIChwID09IDAgfHwgcCA9PSAxKQorICAgICAgICBwRnJhbWVJbmZvLT50cmFuRW52ID0gLTE7CisgICAgICBlbHNlCisgICAgICAgIHBGcmFtZUluZm8tPnRyYW5FbnYgPSBwIC0gMTsKKworICAgICAgLyogRGVjb2RlIGZyZXEgcmVzOiAqLworICAgICAgZm9yIChrID0gMDsgayA8PSBuOyBrKyspIHsKKyAgICAgICAgcEZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IEZES3JlYWRCaXRzKGhCcywgMSk7IC8qIGYgPSBGIFsxIGJpdHNdICovCisgICAgICB9CisKKyAgICAgIC8qIENhbGN1bGF0ZSBub2lzZSBmbG9vciBtaWRkbGUgYm9yZGVyOiAqLworICAgICAgc3dpdGNoIChwKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzFdOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPQorICAgICAgICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW3BGcmFtZUluZm8tPnRyYW5FbnZdOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgMzoKKyAgICAgIC8qIHZfY3RybFNpZ25hbCA9IFtmcmFtZUNsYXNzLGFMLGFSLG5MLG5SLHZfckwsdl9yUixwLHZfZkxSXTsgKi8KKworICAgICAgYUwgPSBGREtyZWFkQml0cyhoQnMsIDIpOyAvKiBBTCBbMiBiaXRzXSwgQUwgLT4gYUwgKi8KKworICAgICAgYVIgPSBGREtyZWFkQml0cyhoQnMsIDIpICsgbnVtYmVyVGltZVNsb3RzOyAvKiBBUiBbMiBiaXRzXSwgQVIgLT4gYVIgKi8KKworICAgICAgbkwgPSBGREtyZWFkQml0cyhoQnMsIDIpOyAvKiBuTCA9IE5MIFsyIGJpdHNdICovCisKKyAgICAgIG5SID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsgLyogblIgPSBOUiBbMiBiaXRzXSAqLworCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgQ2FsY3VsYXRlIGhlbHAgdmFyaWFibGVzCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgICAgLyogZ2VuZXJhbDogKi8KKyAgICAgIG5FbnYgPSBuTCArIG5SICsgMTsgLyogIyBlbnZlbG9wZXMgKi8KKyAgICAgIGlmIChuRW52ID4gTUFYX0VOVkVMT1BFUykgcmV0dXJuIDA7CisgICAgICBiID0gbkVudiArIDE7IC8qICMgYm9yZGVycyAgICovCisKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBEZWNvZGUgZW52ZWxvcGVzCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgICAgLyogTC1ib3JkZXJzOiAgICovCisgICAgICBib3JkZXIgPSBhTDsgLyogZmlyc3QgYm9yZGVyICovCisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gYm9yZGVyOworCisgICAgICBmb3IgKGsgPSAxOyBrIDw9IG5MOyBrKyspIHsKKyAgICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKGhCcywgMik7IC8qIFIgWzIgYml0c10gKi8KKyAgICAgICAgYm9yZGVyICs9ICgyICogdGVtcCArIDIpOyAgIC8qIFIgLT4gciAgICAgICAgICAgICAgICAqLworICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW2tdID0gYm9yZGVyOworICAgICAgfQorCisgICAgICAvKiBSLWJvcmRlcnM6ICAqLworICAgICAgYm9yZGVyID0gYVI7IC8qIGxhc3QgYm9yZGVyICovCisgICAgICBpID0gbkVudjsKKworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsKKworICAgICAgZm9yIChrID0gMDsgayA8IG5SOyBrKyspIHsKKyAgICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKGhCcywgMik7IC8qIFIgWzIgYml0c10gKi8KKyAgICAgICAgYm9yZGVyIC09ICgyICogdGVtcCArIDIpOyAgIC8qIFIgLT4gciAgICAgICAgICAgICAgICAqLworICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWy0taV0gPSBib3JkZXI7CisgICAgICB9CisKKyAgICAgIC8qIGRlY29kZSBwb2ludGVyOiAqLworICAgICAgcG9pbnRlcl9iaXRzID0KKyAgICAgICAgICBERlJBQ1RfQklUUyAtIDEgLSBDb3VudExlYWRpbmdCaXRzKChGSVhQX0RCTCkobkwgKyBuUiArIDEpKTsKKyAgICAgIHAgPSBGREtyZWFkQml0cyhoQnMsIHBvaW50ZXJfYml0cyk7IC8qIHAgPSBQIFtwb2ludGVyX2JpdHMgYml0c10gKi8KKworICAgICAgaWYgKHAgPiBuTCArIG5SICsgMSkgcmV0dXJuIDA7CisKKyAgICAgIHBGcmFtZUluZm8tPnRyYW5FbnYgPSBwID8gYiAtIHAgOiAtMTsKKworICAgICAgLyogZGVjb2RlIGZyZXEgcmVzOiAqLworICAgICAgZm9yIChrID0gMDsgayA8IG5FbnY7IGsrKykgeworICAgICAgICBwRnJhbWVJbmZvLT5mcmVxUmVzW2tdID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsgLyogZiA9IEYgWzEgYml0c10gKi8KKyAgICAgIH0KKworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIERlY29kZSBub2lzZSBmbG9vcnMKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gYUw7CisKKyAgICAgIGlmIChuRW52ID09IDEpIHsKKyAgICAgICAgLyogMSBub2lzZSBmbG9vciBlbnZlbG9wZTogKi8KKyAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gYVI7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiAyIG5vaXNlIGZsb29yIGVudmVsb3BlcyAqLworICAgICAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkKKyAgICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25FbnYgLSAxXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9CisgICAgICAgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbcEZyYW1lSW5mby0+dHJhbkVudl07CisgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsyXSA9IGFSOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KIAogICAvKgogICAgIFN0b3JlIG51bWJlciBvZiBlbnZlbG9wZXMsIG5vaXNlIGZsb29yIGVudmVsb3BlcyBhbmQgZnJhbWUgY2xhc3MKQEAgLTEzMDAsMjUgKzE2MzQsMjQgQEAKICAgaWYgKHBGcmFtZUluZm8tPmZyYW1lQ2xhc3MgPT0gMiB8fCBwRnJhbWVJbmZvLT5mcmFtZUNsYXNzID09IDEpIHsKICAgICAvKiBjYWxjdWxhdGUgbm9pc2UgZmxvb3IgZmlyc3QgYW5kIGxhc3QgYm9yZGVyczogKi8KICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdOwotICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtwRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXNdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XTsKKyAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbcEZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzXSA9CisgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbbkVudl07CiAgIH0KIAotCiAgIHJldHVybiAxOwogfQogCi0KIC8qIQogICBcYnJpZWYgICBDaGVjayBpZiB0aGUgZnJhbWVJbmZvIHZlY3RvciBoYXMgcmVhc29uYWJsZSB2YWx1ZXMuCiAgIFxyZXR1cm4gIFplcm8gZm9yIGVycm9yLCBvbmUgZm9yIGNvcnJlY3QKICovCi1zdGF0aWMgaW50Ci1jaGVja0ZyYW1lSW5mbyAoRlJBTUVfSU5GTyAqIHBGcmFtZUluZm8sIC8qITwgcG9pbnRlciB0byBmcmFtZUluZm8gKi8KLSAgICAgICAgICAgICAgICBpbnQgbnVtYmVyT2ZUaW1lU2xvdHMsICAgLyohPCBRTUYgdGltZSBzbG90cyBwZXIgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBpbnQgb3ZlcmxhcCwgICAgICAgICAgICAgLyohPCBBbW91bnQgb2Ygb3ZlcmxhcCBRTUYgdGltZSBzbG90cyAqLwotICAgICAgICAgICAgICAgIGludCB0aW1lU3RlcCkgICAgICAgICAgICAvKiE8IFFNRiBzbG90cyB0byBTQlIgc2xvdHMgc3RlcCBmYWN0b3IgKi8KK3N0YXRpYyBpbnQgY2hlY2tGcmFtZUluZm8oCisgICAgRlJBTUVfSU5GTyAqcEZyYW1lSW5mbywgLyohPCBwb2ludGVyIHRvIGZyYW1lSW5mbyAqLworICAgIGludCBudW1iZXJPZlRpbWVTbG90cywgIC8qITwgUU1GIHRpbWUgc2xvdHMgcGVyIGZyYW1lICovCisgICAgaW50IG92ZXJsYXAsICAgICAgICAgICAgLyohPCBBbW91bnQgb2Ygb3ZlcmxhcCBRTUYgdGltZSBzbG90cyAqLworICAgIGludCB0aW1lU3RlcCkgICAgICAgICAgIC8qITwgUU1GIHNsb3RzIHRvIFNCUiBzbG90cyBzdGVwIGZhY3RvciAqLwogewotICBpbnQgbWF4UG9zLGksajsKKyAgaW50IG1heFBvcywgaSwgajsKICAgaW50IHN0YXJ0UG9zOwogICBpbnQgc3RvcFBvczsKICAgaW50IHRyYW5FbnY7CkBAIC0xMzI3LDcxICsxNjYwLDY1IEBACiAgIGludCBuRW52ZWxvcGVzID0gcEZyYW1lSW5mby0+bkVudmVsb3BlczsKICAgaW50IG5Ob2lzZUVudmVsb3BlcyA9IHBGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlczsKIAotICBpZihuRW52ZWxvcGVzIDwgMSB8fCBuRW52ZWxvcGVzID4gTUFYX0VOVkVMT1BFUykKLSAgICByZXR1cm4gMDsKKyAgaWYgKG5FbnZlbG9wZXMgPCAxIHx8IG5FbnZlbG9wZXMgPiBNQVhfRU5WRUxPUEVTKSByZXR1cm4gMDsKIAotICBpZihuTm9pc2VFbnZlbG9wZXMgPiBNQVhfTk9JU0VfRU5WRUxPUEVTKQotICAgIHJldHVybiAwOworICBpZiAobk5vaXNlRW52ZWxvcGVzID4gTUFYX05PSVNFX0VOVkVMT1BFUykgcmV0dXJuIDA7CiAKLSAgc3RhcnRQb3MgICAgICAgID0gcEZyYW1lSW5mby0+Ym9yZGVyc1swXTsKLSAgc3RvcFBvcyAgICAgICAgID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuRW52ZWxvcGVzXTsKLSAgdHJhbkVudiAgICAgICAgID0gcEZyYW1lSW5mby0+dHJhbkVudjsKLSAgc3RhcnRQb3NOb2lzZSAgID0gcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdOwotICBzdG9wUG9zTm9pc2UgICAgPSBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2Vbbk5vaXNlRW52ZWxvcGVzXTsKKyAgc3RhcnRQb3MgPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdOworICBzdG9wUG9zID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuRW52ZWxvcGVzXTsKKyAgdHJhbkVudiA9IHBGcmFtZUluZm8tPnRyYW5FbnY7CisgIHN0YXJ0UG9zTm9pc2UgPSBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF07CisgIHN0b3BQb3NOb2lzZSA9IHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtuTm9pc2VFbnZlbG9wZXNdOwogCi0gIGlmIChvdmVybGFwIDwgMCB8fCBvdmVybGFwID4gKDYpKSB7CisgIGlmIChvdmVybGFwIDwgMCB8fCBvdmVybGFwID4gKDMgKiAoNCkpKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KLSAgaWYgKHRpbWVTdGVwIDwgMSB8fCB0aW1lU3RlcCA+IDIpIHsKKyAgaWYgKHRpbWVTdGVwIDwgMSB8fCB0aW1lU3RlcCA+ICg0KSkgewogICAgIHJldHVybiAwOwogICB9Ci0gIG1heFBvcyA9IG51bWJlck9mVGltZVNsb3RzICsgKG92ZXJsYXAvdGltZVN0ZXApOworICBtYXhQb3MgPSBudW1iZXJPZlRpbWVTbG90cyArIChvdmVybGFwIC8gdGltZVN0ZXApOwogCi0gIC8qIENoZWNrIHRoYXQgdGhlIHN0YXJ0IGFuZCBzdG9wIHBvc2l0aW9ucyBvZiB0aGUgZnJhbWUgYXJlIHJlYXNvbmFibGUgdmFsdWVzLiAqLwotICBpZiggKHN0YXJ0UG9zIDwgMCkgfHwgKHN0YXJ0UG9zID49IHN0b3BQb3MpICkKKyAgLyogQ2hlY2sgdGhhdCB0aGUgc3RhcnQgYW5kIHN0b3AgcG9zaXRpb25zIG9mIHRoZSBmcmFtZSBhcmUgcmVhc29uYWJsZSB2YWx1ZXMuCisgICAqLworICBpZiAoKHN0YXJ0UG9zIDwgMCkgfHwgKHN0YXJ0UG9zID49IHN0b3BQb3MpKSByZXR1cm4gMDsKKyAgaWYgKHN0YXJ0UG9zID4gbWF4UG9zIC0gbnVtYmVyT2ZUaW1lU2xvdHMpIC8qIEZpcnN0IGVudi4gbXVzdCBzdGFydCBpbiBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgYWZ0ZXIgdGhlIG92ZXJsYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAqLwogICAgIHJldHVybiAwOwotICBpZiggc3RhcnRQb3MgPiBtYXhQb3MtbnVtYmVyT2ZUaW1lU2xvdHMgKSAvKiBGaXJzdCBlbnYuIG11c3Qgc3RhcnQgaW4gb3IgZGlyZWN0bHkgYWZ0ZXIgdGhlIG92ZXJsYXAgYnVmZmVyICovCisgIGlmIChzdG9wUG9zIDwgbnVtYmVyT2ZUaW1lU2xvdHMpIC8qIE9uZSBjb21wbGV0ZSBmcmFtZSBtdXN0IGJlIHJlYWR5IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYWZ0ZXIgcHJvY2Vzc2luZyAqLwogICAgIHJldHVybiAwOwotICBpZiggc3RvcFBvcyA8IG51bWJlck9mVGltZVNsb3RzICkgLyogT25lIGNvbXBsZXRlIGZyYW1lIG11c3QgYmUgcmVhZHkgZm9yIG91dHB1dCBhZnRlciBwcm9jZXNzaW5nICovCi0gICAgcmV0dXJuIDA7Ci0gIGlmKHN0b3BQb3MgPiBtYXhQb3MpCi0gICAgcmV0dXJuIDA7CisgIGlmIChzdG9wUG9zID4gbWF4UG9zKSByZXR1cm4gMDsKIAotICAvKiBDaGVjayB0aGF0IHRoZSAgc3RhcnQgYm9yZGVyIGZvciBldmVyeSBlbnZlbG9wZSBpcyBzdHJpY3RseSBsYXRlciBpbiB0aW1lICovCi0gIGZvcihpPTA7aTxuRW52ZWxvcGVzO2krKykgewotICAgIGlmKHBGcmFtZUluZm8tPmJvcmRlcnNbaV0gPj0gcEZyYW1lSW5mby0+Ym9yZGVyc1tpKzFdKQotICAgICAgcmV0dXJuIDA7CisgIC8qIENoZWNrIHRoYXQgdGhlICBzdGFydCBib3JkZXIgZm9yIGV2ZXJ5IGVudmVsb3BlIGlzIHN0cmljdGx5IGxhdGVyIGluIHRpbWUKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBuRW52ZWxvcGVzOyBpKyspIHsKKyAgICBpZiAocEZyYW1lSW5mby0+Ym9yZGVyc1tpXSA+PSBwRnJhbWVJbmZvLT5ib3JkZXJzW2kgKyAxXSkgcmV0dXJuIDA7CiAgIH0KIAogICAvKiBDaGVjayB0aGF0IHRoZSBlbnZlbG9wZSB0byBiZSBzaG9ydGVuZWQgaXMgYWN0dWFsbHkgYW1vbmcgdGhlIGVudmVsb3BlcyAqLwotICBpZih0cmFuRW52Pm5FbnZlbG9wZXMpCi0gICAgcmV0dXJuIDA7Ci0KKyAgaWYgKHRyYW5FbnYgPiBuRW52ZWxvcGVzKSByZXR1cm4gMDsKIAogICAvKiBDaGVjayB0aGUgbm9pc2UgYm9yZGVycyAqLwotICBpZihuRW52ZWxvcGVzPT0xICYmIG5Ob2lzZUVudmVsb3Blcz4xKQotICAgIHJldHVybiAwOworICBpZiAobkVudmVsb3BlcyA9PSAxICYmIG5Ob2lzZUVudmVsb3BlcyA+IDEpIHJldHVybiAwOwogCi0gIGlmKHN0YXJ0UG9zICE9IHN0YXJ0UG9zTm9pc2UgfHwgc3RvcFBvcyAhPSBzdG9wUG9zTm9pc2UpCi0gICAgcmV0dXJuIDA7CisgIGlmIChzdGFydFBvcyAhPSBzdGFydFBvc05vaXNlIHx8IHN0b3BQb3MgIT0gc3RvcFBvc05vaXNlKSByZXR1cm4gMDsKIAotCi0gIC8qIENoZWNrIHRoYXQgdGhlICBzdGFydCBib3JkZXIgZm9yIGV2ZXJ5IG5vaXNlLWVudmVsb3BlIGlzIHN0cmljdGx5IGxhdGVyIGluIHRpbWUqLwotICBmb3IoaT0wOyBpPG5Ob2lzZUVudmVsb3BlczsgaSsrKSB7Ci0gICAgaWYocEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlW2ldID49IHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtpKzFdKQorICAvKiBDaGVjayB0aGF0IHRoZSAgc3RhcnQgYm9yZGVyIGZvciBldmVyeSBub2lzZS1lbnZlbG9wZSBpcyBzdHJpY3RseSBsYXRlciBpbgorICAgKiB0aW1lKi8KKyAgZm9yIChpID0gMDsgaSA8IG5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CisgICAgaWYgKHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtpXSA+PSBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbaSArIDFdKQogICAgICAgcmV0dXJuIDA7CiAgIH0KIAogICAvKiBDaGVjayB0aGF0IGV2ZXJ5IG5vaXNlIGJvcmRlciBpcyB0aGUgc2FtZSBhcyBhbiBlbnZlbG9wZSBib3JkZXIqLwotICBmb3IoaT0wOyBpPG5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBuTm9pc2VFbnZlbG9wZXM7IGkrKykgewogICAgIHN0YXJ0UG9zTm9pc2UgPSBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbaV07CiAKLSAgICBmb3Ioaj0wOyBqPG5FbnZlbG9wZXM7IGorKykgewotICAgICAgaWYocEZyYW1lSW5mby0+Ym9yZGVyc1tqXSA9PSBzdGFydFBvc05vaXNlKQotICAgICAgICBicmVhazsKKyAgICBmb3IgKGogPSAwOyBqIDwgbkVudmVsb3BlczsgaisrKSB7CisgICAgICBpZiAocEZyYW1lSW5mby0+Ym9yZGVyc1tqXSA9PSBzdGFydFBvc05vaXNlKSBicmVhazsKICAgICB9Ci0gICAgaWYoaj09bkVudmVsb3BlcykKLSAgICAgIHJldHVybiAwOworICAgIGlmIChqID09IG5FbnZlbG9wZXMpIHJldHVybiAwOwogICB9CiAKICAgcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmggYi9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmgKaW5kZXggMDUxOGVhOS4uMzhjMDRhMyAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5oCisrKyBiL2xpYlNCUmRlYy9zcmMvZW52X2V4dHIuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNSArOTAsMjMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBFbnZlbG9wZSBleHRyYWN0aW9uIHByb3RvdHlwZXMgIAorICBcYnJpZWYgIEVudmVsb3BlIGV4dHJhY3Rpb24gcHJvdG90eXBlcwogKi8KIAotI2lmbmRlZiBfX0VOVkVMT1BFX0VYVFJBQ1RJT05fSAotI2RlZmluZSBfX0VOVkVMT1BFX0VYVFJBQ1RJT05fSAorI2lmbmRlZiBFTlZfRVhUUl9ICisjZGVmaW5lIEVOVl9FWFRSX0gKIAogI2luY2x1ZGUgInNicmRlY29kZXIuaCIKIApAQCAtOTUsNiArMTE0LDcgQEAKICNpbmNsdWRlICJscHBfdHJhbi5oIgogCiAjaW5jbHVkZSAicHNkZWMuaCIKKyNpbmNsdWRlICJwdmNfZGVjLmgiCiAKICNkZWZpbmUgRU5WX0VYUF9GUkFDVCAwCiAvKiE8IFNoaWZ0IHJhdyBlbnZlbG9wZSBkYXRhIHRvIHN1cHBvcnQgZnJhY3Rpb25hbCBudW1iZXJzLgpAQCAtMTA0LDIwOCArMTI0LDI3OCBAQAogKi8KIAogI2RlZmluZSBFWFBfQklUUyA2Ci0vKiE8IFNpemUgb2YgZXhwb25lbnQtcGFydCBvZiBhIHBzZXVkbyBmbG9hdCBlbnZlbG9wZSB2YWx1ZSAoc2hvdWxkIGJlIGF0IGxlYXN0IDYpLgotICBUaGUgcmVtYWluaW5nIGJpdHMgaW4gZWFjaCB3b3JkIGFyZSB1c2VkIGZvciB0aGUgbWFudGlzc2EgKHNob3VsZCBiZSBhdCBsZWFzdCAxMCkuCi0gIFRoaXMgZm9ybWF0IGlzIHVzZWQgaW4gdGhlIGFycmF5cyBpRW52ZWxvcGVbXSBhbmQgc2JyTm9pc2VGbG9vckxldmVsW10KLSAgaW4gdGhlIEZSQU1FX0RBVEEgc3RydWN0IHdoaWNoIG11c3QgZml0IGluIGEgY2VydGFpbiBwYXJ0IG9mIHRoZSBvdXRwdXQgYnVmZmVyCi0gIChTZWUgYnVmZmVyIG1hbmFnZW1lbnQgaW4gc2JyX2RlYy5jcHApLgotICBFeHBvbmVudHMgYW5kIG1hbnRpc3NhcyBjb3VsZCBhbHNvIGJlIHN0b3JlZCBpbiBzZXBhcmF0ZSBhcnJheXMuCi0gIEFjY2Vzc2luZyB0aGUgZXhwb25lbnQgb3IgdGhlIG1hbnRpc3NhIHdvdWxkIGJlIHNpbXBsaWZpZWQgYW5kIHRoZSBtYXNrcyAjTUFTS19FCi0gIHJlc3AuICNNQVNLX00gd291bGQgICBubyBsb25nZXIgYmUgcmVxdWlyZWQuCisvKiE8IFNpemUgb2YgZXhwb25lbnQtcGFydCBvZiBhIHBzZXVkbyBmbG9hdCBlbnZlbG9wZSB2YWx1ZSAoc2hvdWxkIGJlIGF0IGxlYXN0CisgIDYpLiBUaGUgcmVtYWluaW5nIGJpdHMgaW4gZWFjaCB3b3JkIGFyZSB1c2VkIGZvciB0aGUgbWFudGlzc2EgKHNob3VsZCBiZSBhdAorICBsZWFzdCAxMCkuIFRoaXMgZm9ybWF0IGlzIHVzZWQgaW4gdGhlIGFycmF5cyBpRW52ZWxvcGVbXSBhbmQKKyAgc2JyTm9pc2VGbG9vckxldmVsW10gaW4gdGhlIEZSQU1FX0RBVEEgc3RydWN0IHdoaWNoIG11c3QgZml0IGluIGEgY2VydGFpbiBwYXJ0CisgIG9mIHRoZSBvdXRwdXQgYnVmZmVyIChTZWUgYnVmZmVyIG1hbmFnZW1lbnQgaW4gc2JyX2RlYy5jcHApLiBFeHBvbmVudHMgYW5kCisgIG1hbnRpc3NhcyBjb3VsZCBhbHNvIGJlIHN0b3JlZCBpbiBzZXBhcmF0ZSBhcnJheXMuIEFjY2Vzc2luZyB0aGUgZXhwb25lbnQgb3IKKyAgdGhlIG1hbnRpc3NhIHdvdWxkIGJlIHNpbXBsaWZpZWQgYW5kIHRoZSBtYXNrcyAjTUFTS19FIHJlc3AuICNNQVNLX00gd291bGQKKyAgbm8gbG9uZ2VyIGJlIHJlcXVpcmVkLgogKi8KIAotI2RlZmluZSBNQVNLX00gKCgoMSA8PCAoRlJBQ1RfQklUUyAtIEVYUF9CSVRTKSkgLSAxKSA8PCBFWFBfQklUUykgIC8qITwgTWFzayBmb3IgZXh0cmFjdGluZyB0aGUgbWFudGlzc2Egb2YgYSBwc2V1ZG8gZmxvYXQgZW52ZWxvcGUgdmFsdWUgKi8KLSNkZWZpbmUgTUFTS19FICgoMSA8PCBFWFBfQklUUykgLSAxKSAgICAgICAgICAgLyohPCBNYXNrIGZvciBleHRyYWN0aW5nIHRoZSBleHBvbmVudCBvZiBhIHBzZXVkbyBmbG9hdCBlbnZlbG9wZSB2YWx1ZSAqLworI2RlZmluZSBNQVNLX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgxIDw8IChGUkFDVF9CSVRTIC0gRVhQX0JJVFMpKSAtIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgPDwgRVhQX0JJVFMpIC8qITwgTWFzayBmb3IgZXh0cmFjdGluZyB0aGUgbWFudGlzc2Egb2YgYSBwc2V1ZG8gZmxvYXQgXAorICAgICAgICAgICAgICAgICAgIGVudmVsb3BlIHZhbHVlICovCisjZGVmaW5lIE1BU0tfRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgxIDw8IEVYUF9CSVRTKSAtIDEpIC8qITwgTWFzayBmb3IgZXh0cmFjdGluZyB0aGUgZXhwb25lbnQgb2YgYSBwc2V1ZG8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZW52ZWxvcGUgdmFsdWUgKi8KIAotI2RlZmluZSBTSUdOX0VYVCAoICgoU0NIQVIpLTEpIF4gTUFTS19FKSAgICAgICAgLyohPCBhIENIQVItY29uc3RhbnQgd2l0aCBhbGwgYml0cyBhYm92ZSBvdXIgc2lnbi1iaXQgc2V0ICovCi0jZGVmaW5lIFJPVU5ESU5HICggKEZJWFBfU0dMKSgxPDwoRVhQX0JJVFMtMSkpICkgLyohPCAwLjUtb2Zmc2V0IGZvciByb3VuZGluZyB0aGUgbWFudGlzc2Egb2YgYSBwc2V1ZG8tZmxvYXQgZW52ZWxvcGUgdmFsdWUgKi8KLSNkZWZpbmUgTlJHX0VYUF9PRkZTRVQgIDE2ICAgICAgICAgICAgICAgICAgICAgLyohPCBXaWxsIGJlIGFkZGVkIHRvIHRoZSByZWZlcmVuY2UgZW5lcmd5J3MgZXhwb25lbnQgdG8gcHJldmVudCBuZWdhdGl2ZSBudW1iZXJzICovCi0jZGVmaW5lIE5PSVNFX0VYUF9PRkZTRVQgIDM4ICAgICAgICAgICAgICAgICAgIC8qITwgV2lsbCBiZSBhZGRlZCB0byB0aGUgbm9pc2UgbGV2ZWwgZXhwb25lbnQgdG8gcHJldmVudCBuZWdhdGl2ZSBudW1iZXJzICovCisjZGVmaW5lIFNJR05fRVhUIFwKKyAgKCgoU0NIQVIpLTEpIF4gXAorICAgTUFTS19FKSAvKiE8IGEgQ0hBUi1jb25zdGFudCB3aXRoIGFsbCBiaXRzIGFib3ZlIG91ciBzaWduLWJpdCBzZXQgKi8KKyNkZWZpbmUgUk9VTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChGSVhQX1NHTCkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDEgPDwgKEVYUF9CSVRTIC0gMSkpKSAvKiE8IDAuNS1vZmZzZXQgZm9yIHJvdW5kaW5nIHRoZSBtYW50aXNzYSBvZiBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZG8tZmxvYXQgZW52ZWxvcGUgdmFsdWUgKi8KKyNkZWZpbmUgTlJHX0VYUF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDE2IC8qITwgV2lsbCBiZSBhZGRlZCB0byB0aGUgcmVmZXJlbmNlIGVuZXJneSdzIGV4cG9uZW50IHRvIHByZXZlbnQgbmVnYXRpdmUgXAorICAgICAgICBudW1iZXJzICovCisjZGVmaW5lIE5PSVNFX0VYUF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDM4IC8qITwgV2lsbCBiZSBhZGRlZCB0byB0aGUgbm9pc2UgbGV2ZWwgZXhwb25lbnQgdG8gcHJldmVudCBuZWdhdGl2ZSBcCisgICAgICAgIG51bWJlcnMgKi8KIAotdHlwZWRlZiBlbnVtCi17CisjZGVmaW5lIEFERF9IQVJNT05JQ1NfRkxBR1NfU0laRSAyIC8qIGNlaWwoTUFYX0ZSRVFfQ09FRkZTLzMyKSAqLworCit0eXBlZGVmIGVudW0gewogICBIRUFERVJfTk9UX1BSRVNFTlQsCiAgIEhFQURFUl9FUlJPUiwKICAgSEVBREVSX09LLAogICBIRUFERVJfUkVTRVQKLX0KLVNCUl9IRUFERVJfU1RBVFVTOworfSBTQlJfSEVBREVSX1NUQVRVUzsKIAotdHlwZWRlZiBlbnVtCi17Cit0eXBlZGVmIGVudW0gewogICBTQlJfTk9UX0lOSVRJQUxJWkVEID0gMCwKICAgVVBTQU1QTElORyA9IDEsCiAgIFNCUl9IRUFERVIgPSAyLAogICBTQlJfQUNUSVZFID0gMwotfQotU0JSX1NZTkNfU1RBVEU7Cit9IFNCUl9TWU5DX1NUQVRFOwogCit0eXBlZGVmIGVudW0geyBDT1VQTElOR19PRkYgPSAwLCBDT1VQTElOR19MRVZFTCwgQ09VUExJTkdfQkFMIH0gQ09VUExJTkdfTU9ERTsKIAotdHlwZWRlZiBlbnVtCi17Ci0gIENPVVBMSU5HX09GRiA9IDAsCi0gIENPVVBMSU5HX0xFVkVMLAotICBDT1VQTElOR19CQUwKLX0KLUNPVVBMSU5HX01PREU7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFVDSEFSIG5TZmJbMl07ICAgICAgICAgICAvKiE8IE51bWJlciBvZiBTQlItYmFuZHMgZm9yIGxvdyBhbmQgaGlnaCBmcmVxLXJlc29sdXRpb24gKi8KLSAgVUNIQVIgbk5mYjsgICAgICAgICAgICAgIC8qITwgQWN0dWFsIG51bWJlciBvZiBub2lzZSBiYW5kcyB0byByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSovCi0gIFVDSEFSIG51bU1hc3RlcjsgICAgICAgICAvKiE8IE51bWJlciBvZiBTQlItYmFuZHMgaW4gdl9rX21hc3RlciAqLwotICBVQ0hBUiBsb3dTdWJiYW5kOyAgICAgICAgLyohPCBRTUYtYmFuZCB3aGVyZSBTQlIgZnJlcXVlbmN5IHJhbmdlIHN0YXJ0cyAqLwotICBVQ0hBUiBoaWdoU3ViYmFuZDsgICAgICAgLyohPCBRTUYtYmFuZCB3aGVyZSBTQlIgZnJlcXVlbmN5IHJhbmdlIGVuZHMgKi8KLSAgVUNIQVIgbGltaXRlckJhbmRUYWJsZVtNQVhfTlVNX0xJTUlURVJTKzFdOyAvKiE8IExpbWl0ZXIgYmFuZCB0YWJsZS4gKi8KLSAgVUNIQVIgbm9MaW1pdGVyQmFuZHM7ICAgIC8qITwgTnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMuICovCi0gIFVDSEFSIG5JbnZmQmFuZHM7ICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBmb3IgaW52ZXJzZSBmaWx0ZXJpbmcgKi8KLSAgVUNIQVIgKmZyZXFCYW5kVGFibGVbMl07IC8qITwgUG9pbnRlcnMgdG8gZnJlcUJhbmRUYWJsZUxvIGFuZCBmcmVxQmFuZFRhYmxlSGkgKi8KLSAgVUNIQVIgZnJlcUJhbmRUYWJsZUxvW01BWF9GUkVRX0NPRUZGUy8yKzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1hcHBpbmcgb2YgU0JSIGJhbmRzIHRvIFFNRiBiYW5kcyBmb3IgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCi0gIFVDSEFSIGZyZXFCYW5kVGFibGVIaVtNQVhfRlJFUV9DT0VGRlMrMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFwcGluZyBvZiBTQlIgYmFuZHMgdG8gUU1GIGJhbmRzIGZvciBoaWdoIGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCi0gIFVDSEFSIGZyZXFCYW5kVGFibGVOb2lzZVtNQVhfTk9JU0VfQ09FRkZTKzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1hcHBpbmcgb2YgU0JSIG5vaXNlIGJhbmRzIHRvIFFNRiBiYW5kcyAqLwotICBVQ0hBUiB2X2tfbWFzdGVyW01BWF9GUkVRX0NPRUZGUysxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgQmFuZFRhYmxlIHdoaWNoIGZyZXFCYW5kVGFibGUgaXMgZGVyaXZlZCBmcm9tICovCi19Ci1GUkVRX0JBTkRfREFUQTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgblNmYlsyXTsgLyohPCBOdW1iZXIgb2YgU0JSLWJhbmRzIGZvciBsb3cgYW5kIGhpZ2ggZnJlcS1yZXNvbHV0aW9uICovCisgIFVDSEFSIG5OZmI7ICAgIC8qITwgQWN0dWFsIG51bWJlciBvZiBub2lzZSBiYW5kcyB0byByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSovCisgIFVDSEFSIG51bU1hc3RlcjsgICAgICAvKiE8IE51bWJlciBvZiBTQlItYmFuZHMgaW4gdl9rX21hc3RlciAqLworICBVQ0hBUiBsb3dTdWJiYW5kOyAgICAgLyohPCBRTUYtYmFuZCB3aGVyZSBTQlIgZnJlcXVlbmN5IHJhbmdlIHN0YXJ0cyAqLworICBVQ0hBUiBoaWdoU3ViYmFuZDsgICAgLyohPCBRTUYtYmFuZCB3aGVyZSBTQlIgZnJlcXVlbmN5IHJhbmdlIGVuZHMgKi8KKyAgVUNIQVIgb3ZfaGlnaFN1YmJhbmQ7IC8qITwgaWYgaGVhZGVyY2hhbmdlIGFwcGxpZXMgdGhpcyB2YWx1ZSBob2xkcyB0aGUgb2xkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoYmFuZCB2YWx1ZSAtPiBoaWdoYmFuZCB2YWx1ZSBvZiBvdmVybGFwIGFyZWE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvciBvdmVybGFwIGluIHVzYWMgd2hlbiBoZWFkZXJjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycyBiZXR3ZWVuIFhWQVIgYW5kIFZBUlggZnJhbWUgKi8KKyAgVUNIQVIgbGltaXRlckJhbmRUYWJsZVtNQVhfTlVNX0xJTUlURVJTICsgMV07IC8qITwgTGltaXRlciBiYW5kIHRhYmxlLiAqLworICBVQ0hBUiBub0xpbWl0ZXJCYW5kczsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgbGltaXRlciBiYW5kcy4gKi8KKyAgVUNIQVIgbkludmZCYW5kczsgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCisgIFVDSEFSCisgICpmcmVxQmFuZFRhYmxlWzJdOyAvKiE8IFBvaW50ZXJzIHRvIGZyZXFCYW5kVGFibGVMbyBhbmQgZnJlcUJhbmRUYWJsZUhpICovCisgIFVDSEFSIGZyZXFCYW5kVGFibGVMb1tNQVhfRlJFUV9DT0VGRlMgLyAyICsgMV07CisgIC8qITwgTWFwcGluZyBvZiBTQlIgYmFuZHMgdG8gUU1GIGJhbmRzIGZvciBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KKyAgVUNIQVIgZnJlcUJhbmRUYWJsZUhpW01BWF9GUkVRX0NPRUZGUyArIDFdOworICAvKiE8IE1hcHBpbmcgb2YgU0JSIGJhbmRzIHRvIFFNRiBiYW5kcyBmb3IgaGlnaCBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLworICBVQ0hBUiBmcmVxQmFuZFRhYmxlTm9pc2VbTUFYX05PSVNFX0NPRUZGUyArIDFdOworICAvKiE8IE1hcHBpbmcgb2YgU0JSIG5vaXNlIGJhbmRzIHRvIFFNRiBiYW5kcyAqLworICBVQ0hBUiB2X2tfbWFzdGVyW01BWF9GUkVRX0NPRUZGUyArIDFdOworICAvKiE8IE1hc3RlciBCYW5kVGFibGUgd2hpY2ggZnJlcUJhbmRUYWJsZSBpcyBkZXJpdmVkIGZyb20gKi8KK30gRlJFUV9CQU5EX0RBVEE7CiAKIHR5cGVkZWYgRlJFUV9CQU5EX0RBVEEgKkhBTkRMRV9GUkVRX0JBTkRfREFUQTsKIAotI2RlZmluZSBTQlJERUNfRUxEX0dSSUQgICAgICAgIDEKLSNkZWZpbmUgU0JSREVDX1NZTlRBWF9TQ0FMICAgICAyCi0jZGVmaW5lIFNCUkRFQ19TWU5UQVhfVVNBQyAgICAgNAotI2RlZmluZSBTQlJERUNfU1lOVEFYX1JTVkQ1MCAgIDgKLSNkZWZpbmUgU0JSREVDX0xPV19QT1dFUiAgICAgIDE2ICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBMb3cgUG93ZXIgUU1GIG1vZGUgc2hhbGwgYmUgdXNlZC4gKi8KLSNkZWZpbmUgU0JSREVDX1BTX0RFQ09ERUQgICAgIDMyICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBQUyB3YXMgZGVjb2RlZCBhbmQgcmVuZGVyZWQuICovCi0jZGVmaW5lIFNCUkRFQ19MRF9NUFNfUU1GICAgIDUxMiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIExELU1QUyBRTUYgc2hhbGwgYmUgdXNlZC4gKi8KLSNkZWZpbmUgU0JSREVDX1NZTlRBWF9EUk0gICAyMDQ4ICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBEUk0zMC9EUk0rIHJldmVyc2Ugc3ludGF4IGlzIGJlaW5nIHVzZWQuICovCi0jZGVmaW5lIFNCUkRFQ19ET1dOU0FNUExFICAgODE5MiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRvd25zYW1wbGluZyBtb2RlIGlzIHVzZWQuICovCi0jZGVmaW5lIFNCUkRFQ19GTFVTSCAgICAgICAxNjM4NCAgLyogRmxhZyBpcyB1c2VkIHRvIGZsdXNoIGFsbCBlbGVtZW50cyBpbiB1c2UuICovCi0jZGVmaW5lIFNCUkRFQ19GT1JDRV9SRVNFVCAzMjc2OCAgLyogRmxhZyBpcyB1c2VkIHRvIGZvcmNlIGEgcmVzZXQgb2YgYWxsIGVsZW1lbnRzIGluIHVzZS4gKi8KKyNkZWZpbmUgU0JSREVDX0VMRF9HUklEIDEKKyNkZWZpbmUgU0JSREVDX1NZTlRBWF9TQ0FMIDIKKyNkZWZpbmUgU0JSREVDX1NZTlRBWF9VU0FDIDQKKyNkZWZpbmUgU0JSREVDX1NZTlRBWF9SU1ZENTAgOAorI2RlZmluZSBTQlJERUNfVVNBQ19JTkRFUCBcCisgIDE2IC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IFVTQUMgZ2xvYmFsIGluZGVwZW5kZW5jeSBmbGFnIGlzIGFjdGl2ZS4gKi8KKyNkZWZpbmUgU0JSREVDX0xPV19QT1dFUiBcCisgIDMyIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IExvdyBQb3dlciBRTUYgbW9kZSBzaGFsbCBiZSB1c2VkLiAqLworI2RlZmluZSBTQlJERUNfUFNfREVDT0RFRCBcCisgIDY0IC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IFBTIHdhcyBkZWNvZGVkIGFuZCByZW5kZXJlZC4gKi8KKyNkZWZpbmUgU0JSREVDX1FVQURfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMTI4IC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IFVTQUMgU0JSIDQ6MSBpcyBhY3RpdmUuIFwKKyAgICAgICAqLworI2RlZmluZSBTQlJERUNfVVNBQ19IQVJNT05JQ1NCUiBcCisgIDI1NiAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBVU0FDIEhCRSB0b29sIGlzIGFjdGl2ZS4gKi8KKyNkZWZpbmUgU0JSREVDX0xEX01QU19RTUYgXAorICA1MTIgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIExELU1QUyBRTUYgc2hhbGwgYmUgdXNlZC4gKi8KKyNkZWZpbmUgU0JSREVDX1VTQUNfSVRFUyBcCisgIDEwMjQgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgVVNBQyBpbnRlciBURVMgdG9vbCBpcyBhY3RpdmUuICovCisjZGVmaW5lIFNCUkRFQ19TWU5UQVhfRFJNIFwKKyAgMjA0OCAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBEUk0zMC9EUk0rIHJldmVyc2Ugc3ludGF4IGlzIGJlaW5nIHVzZWQuICovCisjZGVmaW5lIFNCUkRFQ19FTERfRE9XTlNDQUxFIFwKKyAgNDA5NiAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBFTEQgZG93bnNjYWxlZCBtb2RlIGRlY29kaW5nIGlzIHVzZWQgKi8KKyNkZWZpbmUgU0JSREVDX0RPV05TQU1QTEUgXAorICA4MTkyIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBkb3duc2FtcGxpbmcgbW9kZSBpcyB1c2VkLiAqLworI2RlZmluZSBTQlJERUNfRkxVU0ggMTYzODQgLyogRmxhZyBpcyB1c2VkIHRvIGZsdXNoIGFsbCBlbGVtZW50cyBpbiB1c2UuICovCisjZGVmaW5lIFNCUkRFQ19GT1JDRV9SRVNFVCBcCisgIDMyNzY4IC8qIEZsYWcgaXMgdXNlZCB0byBmb3JjZSBhIHJlc2V0IG9mIGFsbCBlbGVtZW50cyBpbiB1c2UuICovCisjZGVmaW5lIFNCUkRFQ19TS0lQX1FNRl9BTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDEgPDwgMjEpIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBpbnB1dCBkYXRhIGlzIHByb3ZpZGVkIGluIHRoZSBRTUYgXAorICAgICAgICAgICAgICAgZG9tYWluLiAqLworI2RlZmluZSBTQlJERUNfU0tJUF9RTUZfU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMSA8PCAyMikgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIG91dHB1dCBkYXRhIGlzIGV4cG9ydGVkIGluIHRoZSBRTUYgXAorICAgICAgICAgICAgICAgZG9tYWluLiAqLwogCi0jZGVmaW5lIFNCUkRFQ19IRFJfU1RBVF9SRVNFVCAgMQorI2RlZmluZSBTQlJERUNfSERSX1NUQVRfUkVTRVQgMQogI2RlZmluZSBTQlJERUNfSERSX1NUQVRfVVBEQVRFIDIKIAogdHlwZWRlZiBzdHJ1Y3QgewotICBVQ0hBUiBhbXBSZXNvbHV0aW9uOyAgICAgICAvKiE8IEFtcGxpdHVkZSByZXNvbHV0aW9uIG9mIGVudmVsb3BlIHZhbHVlcyAoMDogMS41ZEIsIDE6IDNkQikgKi8KLSAgVUNIQVIgeG92ZXJfYmFuZDsgICAgICAgICAgLyohPCBTdGFydCBpbmRleCBpbiAjdl9rX21hc3RlcltdIHVzZWQgZm9yIGR5bmFtaWMgY3Jvc3NvdmVyIGZyZXF1ZW5jeSAqLwotICBVQ0hBUiBzYnJfcHJlcHJvY2Vzc2luZzsgICAvKiE8IFNCUiBwcmV3aGl0ZW5pbmcgZmxhZy4gKi8KKyAgVUNIQVIgYW1wUmVzb2x1dGlvbjsgLyohPCBBbXBsaXR1ZGUgcmVzb2x1dGlvbiBvZiBlbnZlbG9wZSB2YWx1ZXMgKDA6IDEuNWRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxOiAzZEIpICovCisgIFVDSEFSCisgIHhvdmVyX2JhbmQ7IC8qITwgU3RhcnQgaW5kZXggaW4gI3Zfa19tYXN0ZXJbXSB1c2VkIGZvciBkeW5hbWljIGNyb3Nzb3ZlcgorICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgKi8KKyAgVUNIQVIgc2JyX3ByZXByb2Nlc3Npbmc7IC8qITwgU0JSIHByZXdoaXRlbmluZyBmbGFnLiAqLworICBVQ0hBUiBwdmNfbW9kZTsgICAgICAgICAgLyohPCBQcmVkaWN0aXZlIHZlY3RvciBjb2RpbmcgbW9kZSAqLwogfSBTQlJfSEVBREVSX0RBVEFfQlNfSU5GTzsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAvKiBDaGFuZ2VzIGluIHRoZXNlIHZhcmlhYmxlcyBjYXVzZXMgYSByZXNldCBvZiB0aGUgZGVjb2RlciAqLwotICBVQ0hBUiBzdGFydEZyZXE7ICAgICAgICAgICAvKiE8IEluZGV4IGZvciBTQlIgc3RhcnQgZnJlcXVlbmN5ICovCi0gIFVDSEFSIHN0b3BGcmVxOyAgICAgICAgICAgIC8qITwgSW5kZXggZm9yIFNCUiBoaWdoZXN0IGZyZXF1ZW5jeSAqLwotICBVQ0hBUiBmcmVxU2NhbGU7ICAgICAgICAgICAvKiE8IDA6IGxpbmVhciBzY2FsZSwgIDEtMyBsb2dhcml0aG1pYyBzY2FsZXMgKi8KLSAgVUNIQVIgYWx0ZXJTY2FsZTsgICAgICAgICAgLyohPCBGbGFnIGZvciBjb2Fyc2VyIGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCi0gIFVDSEFSIG5vaXNlX2JhbmRzOyAgICAgICAgIC8qITwgTm9pc2UgYmFuZHMgcGVyIG9jdGF2ZSwgcmVhZCBmcm9tIGJpdHN0cmVhbSovCisgIFVDSEFSIHN0YXJ0RnJlcTsgICAvKiE8IEluZGV4IGZvciBTQlIgc3RhcnQgZnJlcXVlbmN5ICovCisgIFVDSEFSIHN0b3BGcmVxOyAgICAvKiE8IEluZGV4IGZvciBTQlIgaGlnaGVzdCBmcmVxdWVuY3kgKi8KKyAgVUNIQVIgZnJlcVNjYWxlOyAgIC8qITwgMDogbGluZWFyIHNjYWxlLCAgMS0zIGxvZ2FyaXRobWljIHNjYWxlcyAqLworICBVQ0hBUiBhbHRlclNjYWxlOyAgLyohPCBGbGFnIGZvciBjb2Fyc2VyIGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCisgIFVDSEFSIG5vaXNlX2JhbmRzOyAvKiE8IE5vaXNlIGJhbmRzIHBlciBvY3RhdmUsIHJlYWQgZnJvbSBiaXRzdHJlYW0qLwogCiAgIC8qIGRvbid0IHJlcXVpcmUgcmVzZXQgKi8KLSAgVUNIQVIgbGltaXRlckJhbmRzOyAgICAgICAgLyohPCBJbmRleCBmb3IgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMgcGVyIG9jdGF2ZSAqLwotICBVQ0hBUiBsaW1pdGVyR2FpbnM7ICAgICAgICAvKiE8IEluZGV4IHRvIHNlbGVjdCBnYWluIGxpbWl0ICovCi0gIFVDSEFSIGludGVycG9sRnJlcTsgICAgICAgIC8qITwgU2VsZWN0IGdhaW4gY2FsY3VsYXRpb24gbWV0aG9kICgxOiBwZXIgUU1GIGNoYW5uZWwsIDA6IHBlciBTQlIgYmFuZCkgKi8KLSAgVUNIQVIgc21vb3RoaW5nTGVuZ3RoOyAgICAgLyohPCBTbW9vdGhpbmcgb2YgZ2FpbnMgb3ZlciB0aW1lICgwOiBvbiAgMTogb2ZmKSAqLworICBVQ0hBUiBsaW1pdGVyQmFuZHM7IC8qITwgSW5kZXggZm9yIG51bWJlciBvZiBsaW1pdGVyIGJhbmRzIHBlciBvY3RhdmUgKi8KKyAgVUNIQVIgbGltaXRlckdhaW5zOyAvKiE8IEluZGV4IHRvIHNlbGVjdCBnYWluIGxpbWl0ICovCisgIFVDSEFSIGludGVycG9sRnJlcTsgLyohPCBTZWxlY3QgZ2FpbiBjYWxjdWxhdGlvbiBtZXRob2QgKDE6IHBlciBRTUYgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwOiBwZXIgU0JSIGJhbmQpICovCisgIFVDSEFSIHNtb290aGluZ0xlbmd0aDsgLyohPCBTbW9vdGhpbmcgb2YgZ2FpbnMgb3ZlciB0aW1lICgwOiBvbiAgMTogb2ZmKSAqLwogCiB9IFNCUl9IRUFERVJfREFUQV9CUzsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgU0JSX1NZTkNfU1RBVEUgc3luY1N0YXRlOyAgICAvKiE8IFRoZSBjdXJyZW50IGluaXRpYWxpemF0aW9uIHN0YXR1cyBvZiB0aGUgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFNCUl9TWU5DX1NUQVRFCisgIHN5bmNTdGF0ZTsgLyohPCBUaGUgY3VycmVudCBpbml0aWFsaXphdGlvbiBzdGF0dXMgb2YgdGhlIGhlYWRlciAqLwogCi0gIFVDSEFSIHN0YXR1czsgICAgICAgICAgICAgICAgLyohPCBGbGFncyBmaWVsZCB1c2VkIGZvciBzaWduYWxpbmcgYSByZXNldCByaWdodCBiZWZvcmUgdGhlIHByb2Nlc3Npbmcgc3RhcnRzIGFuZCBhbiB1cGRhdGUgZnJvbSBjb25maWcgKGUuZy4gQVNDKS4gKi8KLSAgVUNIQVIgZnJhbWVFcnJvckZsYWc7ICAgICAgICAvKiE8IEZyYW1lIGRhdGEgdmFsaWQgZmxhZy4gQ0FVVElPTjogVGhpcyB2YXJpYWJsZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBmbGFnIHN0b3JlZCBpbiB0aGUgZWxlbWVudCBzdHJ1Y3R1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZSBmcmFtZSBkZWxheS4gVGhlcmUgaXQgbWlnaHQgaGFwcGVuIHRoYXQgZGlmZmVyZW50IHNsb3RzIHVzZSB0aGUgc2FtZSBoZWFkZXIuICovCisgIFVDSEFSIHN0YXR1czsgLyohPCBGbGFncyBmaWVsZCB1c2VkIGZvciBzaWduYWxpbmcgYSByZXNldCByaWdodCBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBzdGFydHMgYW5kIGFuIHVwZGF0ZSBmcm9tIGNvbmZpZyAoZS5nLiBBU0MpLiAqLworICBVQ0hBUgorICBmcmFtZUVycm9yRmxhZzsgLyohPCBGcmFtZSBkYXRhIHZhbGlkIGZsYWcuIENBVVRJT046IFRoaXMgdmFyaWFibGUgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXR0ZW4gYnkgdGhlIGZsYWcgc3RvcmVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgdGhlIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICBkZWxheS4gVGhlcmUgaXQgbWlnaHQgaGFwcGVuIHRoYXQgZGlmZmVyZW50IHNsb3RzIHVzZQorICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgaGVhZGVyLiAqLwogICBVQ0hBUiBudW1iZXJUaW1lU2xvdHM7ICAgICAgIC8qITwgQUFDOiAxNiwxNSAqLwogICBVQ0hBUiBudW1iZXJPZkFuYWx5c2lzQmFuZHM7IC8qITwgTnVtYmVyIG9mIFFNRiBhbmFseXNpcyBiYW5kcyAqLwogICBVQ0hBUiB0aW1lU3RlcDsgICAgICAgICAgICAgIC8qITwgVGltZSByZXNvbHV0aW9uIG9mIFNCUiBpbiBRTUYtc2xvdHMgKi8KLSAgVUlOVCAgc2JyUHJvY1NtcGxSYXRlOyAgICAgICAvKiE8IFNCUiBwcm9jZXNzaW5nIHNhbXBsaW5nIGZyZXF1ZW5jeSAoIT0gT3V0cHV0U2FtcGxpbmdSYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbHdheXM6IENvcmVTYW1wbGluZ1JhdGUgKiBVcFNhbXBsaW5nRmFjdG9yOyBldmVuIGluIHNpbmdsZSByYXRlIG1vZGUpICovCisgIFVJTlQKKyAgICAgIHNiclByb2NTbXBsUmF0ZTsgLyohPCBTQlIgcHJvY2Vzc2luZyBzYW1wbGluZyBmcmVxdWVuY3kgKCE9CisgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFNhbXBsaW5nUmF0ZSkgICAgICAgIChhbHdheXM6IENvcmVTYW1wbGluZ1JhdGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBVcFNhbXBsaW5nRmFjdG9yOyBldmVuIGluIHNpbmdsZSByYXRlIG1vZGUpICovCiAKLSAgU0JSX0hFQURFUl9EQVRBX0JTICAgICAgYnNfZGF0YTsgIC8qITwgY3VycmVudCBTQlIgaGVhZGVyLiAqLwotICBTQlJfSEVBREVSX0RBVEFfQlNfSU5GTyBic19pbmZvOyAgLyohPCBTQlIgaW5mby4gKi8KKyAgU0JSX0hFQURFUl9EQVRBX0JTIGJzX2RhdGE7ICAgICAgLyohPCBjdXJyZW50IFNCUiBoZWFkZXIuICovCisgIFNCUl9IRUFERVJfREFUQV9CUyBic19kZmx0OyAgICAgIC8qITwgRGVmYXVsdCBzYnIgaGVhZGVyLiAqLworICBTQlJfSEVBREVSX0RBVEFfQlNfSU5GTyBic19pbmZvOyAvKiE8IFNCUiBpbmZvLiAqLwogCi0gIEZSRVFfQkFORF9EQVRBIGZyZXFCYW5kRGF0YTsgIC8qITwgUG9pbnRlciB0byBzdHJ1Y3QgI0ZSRVFfQkFORF9EQVRBICovCi19Ci1TQlJfSEVBREVSX0RBVEE7CisgIEZSRVFfQkFORF9EQVRBIGZyZXFCYW5kRGF0YTsgLyohPCBQb2ludGVyIHRvIHN0cnVjdCAjRlJFUV9CQU5EX0RBVEEgKi8KKyAgVUNIQVIgcHZjSURwcmV2OworfSBTQlJfSEVBREVSX0RBVEE7CiAKIHR5cGVkZWYgU0JSX0hFQURFUl9EQVRBICpIQU5ETEVfU0JSX0hFQURFUl9EQVRBOwogCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGZyYW1lQ2xhc3M7ICAgICAgICAgICAgICAgICAvKiE8IFNlbGVjdCBncmlkIHR5cGUgKi8KKyAgVUNIQVIgbkVudmVsb3BlczsgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVudmVsb3BlcyAqLworICBVQ0hBUiBib3JkZXJzW01BWF9FTlZFTE9QRVMgKyAxXTsgLyohPCBFbnZlbG9wZSBib3JkZXJzIChpbiBTQlItdGltZXNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiBtcDNQUk86IDAuLjExKSAqLworICBVQ0hBUiBmcmVxUmVzW01BWF9FTlZFTE9QRVNdOyAgICAgLyohPCBGcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgZWFjaCBlbnZlbG9wZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDA9bG93LCAxPWhpZ2gpICovCisgIFNDSEFSIHRyYW5FbnY7ICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zaWVudCBlbnZlbG9wZSwgLTEgaWYgbm9uZSAqLworICBVQ0hBUiBuTm9pc2VFbnZlbG9wZXM7ICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgZW52ZWxvcGVzICovCisgIFVDSEFSCisgIGJvcmRlcnNOb2lzZVtNQVhfTk9JU0VfRU5WRUxPUEVTICsgMV07IC8qITwgYm9yZGVycyBvZiBub2lzZSBlbnZlbG9wZXMgKi8KKyAgVUNIQVIgcHZjQm9yZGVyc1tNQVhfUFZDX0VOVkVMT1BFUyArIDFdOworICBVQ0hBUiBub2lzZVBvc2l0aW9uOworICBVQ0hBUiB2YXJMZW5ndGg7Cit9IEZSQU1FX0lORk87CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFVDSEFSIGZyYW1lQ2xhc3M7ICAgICAgICAgICAgICAgLyohPCBTZWxlY3QgZ3JpZCB0eXBlICovCi0gIFVDSEFSIG5FbnZlbG9wZXM7ICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZW52ZWxvcGVzICovCi0gIFVDSEFSIGJvcmRlcnNbTUFYX0VOVkVMT1BFUysxXTsgLyohPCBFbnZlbG9wZSBib3JkZXJzIChpbiBTQlItdGltZXNsb3RzLCBlLmcuIG1wM1BSTzogMC4uMTEpICovCi0gIFVDSEFSIGZyZXFSZXNbTUFYX0VOVkVMT1BFU107ICAgLyohPCBGcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgZWFjaCBlbnZlbG9wZSAoMD1sb3csIDE9aGlnaCkgKi8KLSAgU0NIQVIgIHRyYW5FbnY7ICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zaWVudCBlbnZlbG9wZSwgLTEgaWYgbm9uZSAqLwotICBVQ0hBUiBuTm9pc2VFbnZlbG9wZXM7ICAgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGVudmVsb3BlcyAqLwotICBVQ0hBUiBib3JkZXJzTm9pc2VbTUFYX05PSVNFX0VOVkVMT1BFUysxXTsvKiE8IGJvcmRlcnMgb2Ygbm9pc2UgZW52ZWxvcGVzICovCi19Ci1GUkFNRV9JTkZPOwotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEZJWFBfU0dMIHNmYl9ucmdfcHJldltNQVhfRlJFUV9DT0VGRlNdOyAgICAvKiE8IFByZXZpb3VzIGVudmVsb3BlIChyZXF1aXJlZCBmb3IgZGlmZmVyZW50aWFsLWNvZGVkIHZhbHVlcykgKi8KLSAgRklYUF9TR0wgcHJldk5vaXNlTGV2ZWxbTUFYX05PSVNFX0NPRUZGU107IC8qITwgUHJldmlvdXMgbm9pc2UgZW52ZWxvcGUgKHJlcXVpcmVkIGZvciBkaWZmZXJlbnRpYWwtY29kZWQgdmFsdWVzKSAqLwotICBDT1VQTElOR19NT0RFIGNvdXBsaW5nOyAgICAgICAgICAgICAgICAgICAgLyohPCBTdGVyZW8tbW9kZSBvZiBwcmV2aW91cyBmcmFtZSAqLwotICBJTlZGX01PREUgc2JyX2ludmZfbW9kZVtNQVhfSU5WRl9CQU5EU107ICAgLyohPCBQcmV2aW91cyBzdHJlbmd0aCBvZiBmaWx0ZXJpbmcgaW4gdHJhbnNwb3NlciAqLwotICBVQ0hBUiBhbXBSZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQcmV2aW91cyBhbXBsaXR1ZGUgcmVzb2x1dGlvbiAoMDogMS41ZEIsIDE6IDNkQikgKi8KLSAgVUNIQVIgc3RvcFBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUG9zaXRpb24gaW4gdGltZSB3aGVyZSBsYXN0IGVudmVsb3BlIGVuZGVkICovCi0gIFVDSEFSIGZyYW1lRXJyb3JGbGFnOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFByZXZpb3VzIGZyYW1lIHN0YXR1cyAqLwotfQotU0JSX1BSRVZfRlJBTUVfREFUQTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9TR0wgc2ZiX25yZ19wcmV2W01BWF9GUkVRX0NPRUZGU107IC8qITwgUHJldmlvdXMgZW52ZWxvcGUgKHJlcXVpcmVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50aWFsLWNvZGVkIHZhbHVlcykgKi8KKyAgRklYUF9TR0wKKyAgcHJldk5vaXNlTGV2ZWxbTUFYX05PSVNFX0NPRUZGU107IC8qITwgUHJldmlvdXMgbm9pc2UgZW52ZWxvcGUgKHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGlmZmVyZW50aWFsLWNvZGVkIHZhbHVlcykgKi8KKyAgQ09VUExJTkdfTU9ERSBjb3VwbGluZzsgICAgICAgICAgIC8qITwgU3RlcmVvLW1vZGUgb2YgcHJldmlvdXMgZnJhbWUgKi8KKyAgSU5WRl9NT0RFIHNicl9pbnZmX21vZGVbTUFYX0lOVkZfQkFORFNdOyAvKiE8IFByZXZpb3VzIHN0cmVuZ3RoIG9mIGZpbHRlcmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRyYW5zcG9zZXIgKi8KKyAgVUNIQVIgYW1wUmVzOyAgICAgICAgIC8qITwgUHJldmlvdXMgYW1wbGl0dWRlIHJlc29sdXRpb24gKDA6IDEuNWRCLCAxOiAzZEIpICovCisgIFVDSEFSIHN0b3BQb3M7ICAgICAgICAvKiE8IFBvc2l0aW9uIGluIHRpbWUgd2hlcmUgbGFzdCBlbnZlbG9wZSBlbmRlZCAqLworICBVQ0hBUiBmcmFtZUVycm9yRmxhZzsgLyohPCBQcmV2aW91cyBmcmFtZSBzdGF0dXMgKi8KKyAgVUNIQVIgcHJldlNiclBpdGNoSW5CaW5zOyAvKiE8IFByZXZpb3VzIGZyYW1lIHBpdGNoSW5CaW5zICovCisgIEZSQU1FX0lORk8gcHJldkZyYW1lSW5mbzsKK30gU0JSX1BSRVZfRlJBTUVfREFUQTsKIAogdHlwZWRlZiBTQlJfUFJFVl9GUkFNRV9EQVRBICpIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQTsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgblNjYWxlRmFjdG9yczsgLyohPCB0b3RhbCBudW1iZXIgb2Ygc2NhbGVmYWN0b3JzIGluIGZyYW1lICovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGludCBuU2NhbGVGYWN0b3JzOyAgICAgICAgICAgICAgICAgICAgLyohPCB0b3RhbCBudW1iZXIgb2Ygc2NhbGVmYWN0b3JzIGluIGZyYW1lICovCisgIEZSQU1FX0lORk8gZnJhbWVJbmZvOyAgICAgICAgICAgIC8qITwgdGltZSBncmlkIGZvciBjdXJyZW50IGZyYW1lICovCisgIFVDSEFSIGRvbWFpbl92ZWNbTUFYX0VOVkVMT1BFU107IC8qITwgQml0ZmllbGQgY29udGFpbmluZyBkaXJlY3Rpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEtY29kaW5nIGZvciBlYWNoIGVudmVsb3BlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwOmZyZXF1ZW5jeSwgMTp0aW1lKSAqLworICBVQ0hBUiBkb21haW5fdmVjX25vaXNlCisgICAgICBbTUFYX05PSVNFX0VOVkVMT1BFU107IC8qITwgU2FtZSBhcyBhYm92ZSwgYnV0IGZvciBub2lzZSBlbnZlbG9wZXMgKi8KIAotICBGUkFNRV9JTkZPIGZyYW1lSW5mbzsgICAgICAgICAgICAgICAgIC8qITwgdGltZSBncmlkIGZvciBjdXJyZW50IGZyYW1lICovCi0gIFVDSEFSIGRvbWFpbl92ZWNbTUFYX0VOVkVMT1BFU107ICAgICAgLyohPCBCaXRmaWVsZCBjb250YWluaW5nIGRpcmVjdGlvbiBvZiBkZWx0YS1jb2RpbmcgZm9yIGVhY2ggZW52ZWxvcGUgKDA6ZnJlcXVlbmN5LCAxOnRpbWUpICovCi0gIFVDSEFSIGRvbWFpbl92ZWNfbm9pc2VbTUFYX05PSVNFX0VOVkVMT1BFU107IC8qITwgU2FtZSBhcyBhYm92ZSwgYnV0IGZvciBub2lzZSBlbnZlbG9wZXMgKi8KKyAgSU5WRl9NT0RFCisgIHNicl9pbnZmX21vZGVbTUFYX0lOVkZfQkFORFNdOyAvKiE8IFN0cmVuZ3RoIG9mIGZpbHRlcmluZyBpbiB0cmFuc3Bvc2VyICovCisgIENPVVBMSU5HX01PREUgY291cGxpbmc7ICAgICAgICAvKiE8IFN0ZXJlby1tb2RlICovCisgIGludCBhbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lOyAvKiE8IEFtcGxpdHVkZSByZXNvbHV0aW9uIG9mIGVudmVsb3BlIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDA6IDEuNWRCLCAxOiAzZEIpICovCiAKLSAgSU5WRl9NT0RFIHNicl9pbnZmX21vZGVbTUFYX0lOVkZfQkFORFNdOyAvKiE8IFN0cmVuZ3RoIG9mIGZpbHRlcmluZyBpbiB0cmFuc3Bvc2VyICovCi0gIENPVVBMSU5HX01PREUgY291cGxpbmc7ICAgICAgICAgICAgICAgICAgLyohPCBTdGVyZW8tbW9kZSAqLwotICBpbnQgYW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZTsgICAgICAgICAgIC8qITwgQW1wbGl0dWRlIHJlc29sdXRpb24gb2YgZW52ZWxvcGUgdmFsdWVzICgwOiAxLjVkQiwgMTogM2RCKSAqLwotCi0gIFVDSEFSIGFkZEhhcm1vbmljc1tNQVhfRlJFUV9DT0VGRlNdOyAgICAgLyohPCBGbGFncyBmb3Igc3ludGhldGljIHNpbmUgYWRkaXRpb24gKi8KKyAgVUxPTkcgYWRkSGFybW9uaWNzW0FERF9IQVJNT05JQ1NfRkxBR1NfU0laRV07IC8qITwgRmxhZ3MgZm9yIHN5bnRoZXRpYyBzaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbiAoYWxpZ25lZCB0byBNU0IpICovCiAKICAgRklYUF9TR0wgaUVudmVsb3BlW01BWF9OVU1fRU5WRUxPUEVfVkFMVUVTXTsgICAgICAgLyohPCBFbnZlbG9wZSBkYXRhICovCiAgIEZJWFBfU0dMIHNick5vaXNlRmxvb3JMZXZlbFtNQVhfTlVNX05PSVNFX1ZBTFVFU107IC8qITwgTm9pc2UgZW52ZWxvcGUgZGF0YSAqLwotfQotU0JSX0ZSQU1FX0RBVEE7CisgIFVDSEFSIGlURVNhY3RpdmU7IC8qITwgT25lIGZsYWcgZm9yIGVhY2ggZW52ZWxvcGUgdG8gZW5hYmxlIFVTQUMgaW50ZXItVEVTICovCisgIFVDSEFSCisgIGludGVyVGVtcFNoYXBlTW9kZVtNQVhfRU5WRUxPUEVTXTsgLyohPCBVU0FDIGludGVyLVRFUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic19pbnRlcl90ZW1wX3NoYXBlX21vZGVbY2hdW2Vudl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAqLworICBVQ0hBUiBwdmNJRFtQVkNfTlRJTUVTTE9UXTsgICAgICAgIC8qITwgT25lIFBWQyBJRCB2YWx1ZSBmb3IgZWFjaCB0aW1lIHNsb3QgKi8KKyAgVUNIQVIgbnM7CisgIFVDSEFSIHNpbnVzb2lkYWxfcG9zaXRpb247CisKKyAgVUNIQVIgc2JyUGF0Y2hpbmdNb2RlOworICBVQ0hBUiBzYnJPdmVyc2FtcGxpbmdGbGFnOworICBVQ0hBUiBzYnJQaXRjaEluQmluczsKK30gU0JSX0ZSQU1FX0RBVEE7CiAKIHR5cGVkZWYgU0JSX0ZSQU1FX0RBVEEgKkhBTkRMRV9TQlJfRlJBTUVfREFUQTsKIAotdm9pZCBpbml0U2JyUHJldkZyYW1lRGF0YSAoSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZVNsb3RzKTsKKy8qIQorXGJyaWVmICAgTWFwcyBzYW1wbGluZyBmcmVxdWVuY2llcyB0byBmcmVxdWVuY2llcyBmb3Igd2hpY2ggc2V0dXAgdGFibGVzIGFyZQorYXZhaWxhYmxlCiAKK01hcHMgYXJiaXRhcnkgc2FtcGxpbmcgZnJlcXVlbmN5IHRvIG5lYXJlc3QgbmVpZ2hib3JzIGZvciB3aGljaCBzZXR1cCB0YWJsZXMKK2FyZSBhdmFpbGFibGUgKGUuZy4gMjU2MDAgLT4gMjQwMDApLgorVXNlZCBmb3Igc3RhcnRGcmVxIGNhbGN1bGF0aW9uLgorVGhlIG1hcHBpbmcgaXMgZGVmaW5lZCBpbiAxNDQ5Ni0zICg0LjYuMTguMi42KSwgZnMoU0JSKSwgYW5kIHRhYmxlIDQuODIKIAotaW50IHNickdldFNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BTX0RFQyBoUGFyYW1ldHJpY1N0ZXJlb0RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICBvdmVybGFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK1xyZXR1cm4gIG1hcHBlZCBzYW1wbGluZyBmcmVxdWVuY3kKKyovCitVSU5UIHNicmRlY19tYXBUb1N0ZFNhbXBsZVJhdGUoVUlOVCBmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGlzVXNhYyk7IC8qITwgT3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwogCi1pbnQgc2JyR2V0Q2hhbm5lbFBhaXJFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoRnJhbWVEYXRhTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQml0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgb3ZlcmxhcCk7Cit2b2lkIGluaXRTYnJQcmV2RnJhbWVEYXRhKEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZVNsb3RzKTsKKworaW50IHNickdldENoYW5uZWxFbGVtZW50KEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YUxlZnRQcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIHB2Y19tb2RlX2xhc3QsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BTX0RFQyBoUGFyYW1ldHJpY1N0ZXJlb0RlYywgY29uc3QgVUlOVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3ZlcmxhcCk7CiAKIFNCUl9IRUFERVJfU1RBVFVTCi1zYnJHZXRIZWFkZXJEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRCdWYsCi0gICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICBmSXNTYnJEYXRhKTsKK3NickdldEhlYWRlckRhdGEoSEFORExFX1NCUl9IRUFERVJfREFUQSBoZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZklzU2JyRGF0YSwgY29uc3QgVUNIQVIgY29uZmlnTW9kZSk7CiAKIC8qIQogICBcYnJpZWYgICAgIEluaXRpYWxpemUgU0JSIGhlYWRlciBkYXRhCkBAIC0zMTQsMTEgKzQwNCwxMiBAQAogICBkZXBlbmRpbmcgb24gdGhlIGNvcmUgY29kZWMuCiAqLwogU0JSX0VSUk9SCi1pbml0SGVhZGVyRGF0YSAoCi0gICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgIGhIZWFkZXJEYXRhLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlSW4sCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZVJhdGVPdXQsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgZmxhZ3MKLSAgICAgICAgKTsKK2luaXRIZWFkZXJEYXRhKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIGNvbnN0IGludCBzYW1wbGVSYXRlSW4sCisgICAgICAgICAgICAgICBjb25zdCBpbnQgc2FtcGxlUmF0ZU91dCwgY29uc3QgSU5UIGRvd25zY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsIGNvbnN0IFVJTlQgZmxhZ3MsCisgICAgICAgICAgICAgICBjb25zdCBpbnQgc2V0RGVmYXVsdEhkcik7CiAjZW5kaWYKKworLyogQ29udmVydCBoZWFkcm9vbSBiaXRzIHRvIGV4cG9uZW50ICovCisjZGVmaW5lIFNDQUxFMkVYUChzKSAoMTUgLSAocykpCisjZGVmaW5lIEVYUDJTQ0FMRShlKSAoMTUgLSAoZSkpCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL2hiZS5jcHAgYi9saWJTQlJkZWMvc3JjL2hiZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiMjFjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNCUmRlYy9zcmMvaGJlLmNwcApAQCAtMCwwICsxLDIxOTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgRmFzdCBGRlQgcm91dGluZXMgcHJvdG90eXBlcworICBcYXV0aG9yIEZhYmlhbiBIYXVzc2VsCisqLworCisjaW5jbHVkZSAiaGJlLmgiCisjaW5jbHVkZSAicW1mLmgiCisjaW5jbHVkZSAiZW52X2V4dHIuaCIKKworI2RlZmluZSBIQkVfTUFYX1FNRl9CQU5EUyAoNDApCisKKyNkZWZpbmUgSEJFX01BWF9PVVRfU0xPVFMgKDExKQorCisjZGVmaW5lIFFNRl9XSU5fTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDEyICsgNiAtIDQgLSAxKSAvKiA2IHN1YmJhbmQgc2xvdHMgZXh0cmEgZGVsYXkgdG8gYWxpZ24gd2l0aCBIUSAtIDQgc2xvdHMgXAorICAgICAgICAgICAgICAgICAgICAgIHRvIGNvbXBlbnNhdGUgZm9yIGNyaXRpY2FsIHNhbXBsaW5nIGRlbGF5IC0gMSBzbG90IHRvICBcCisgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gY3JpdGljYWwgc2FtcGxpbmcgZXhhY3RseSAodyBhZGRpdGlvbmFsIHRpbWUgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBkb21haW4gZGVsYXkpKi8KKworI2lmbmRlZiBQSQorI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludCB4UHJvZHVjdHNbTUFYX1NUUkVUQ0hfSEJFIC0gMV0gPSB7CisgICAgMSwgMSwgMX07IC8qIENyb3NzIHByb2R1Y3RzIG9uKDEpL29mZigwKSBmb3IgVD0yLDMsNC4gKi8KK3N0YXRpYyBjb25zdCBpbnQgc3RhcnRTdWJiYW5kMmtMWzMzXSA9IHsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMiwgIDIsICAyLCAgNCwgIDQsICA0LCAgNCwgIDQsICA2LCA2LAorICAgIDYsIDgsIDgsIDgsIDgsIDgsIDEwLCAxMCwgMTAsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyfTsKKworc3RhdGljIGNvbnN0IGludCBwbWluID0gMTI7CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBoaW50UmVhbF9GWzRdWzNdID0geworICAgIHtGTDJGWENPTlNUX0RCTCgwLjM5ODQwMzM1ZiksIEZMMkZYQ09OU1RfREJMKDAuMzk4NDAzMzVmKSwKKyAgICAgRkwyRlhDT05TVF9EQkwoLTAuMzk4NDAzMzVmKX0sCisgICAge0ZMMkZYQ09OU1RfREJMKDAuMzk4NDAzMzVmKSwgRkwyRlhDT05TVF9EQkwoLTAuMzk4NDAzMzVmKSwKKyAgICAgRkwyRlhDT05TVF9EQkwoLTAuMzk4NDAzMzVmKX0sCisgICAge0ZMMkZYQ09OU1RfREJMKC0wLjM5ODQwMzM1ZiksIEZMMkZYQ09OU1RfREJMKC0wLjM5ODQwMzM1ZiksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuMzk4NDAzMzVmKX0sCisgICAge0ZMMkZYQ09OU1RfREJMKC0wLjM5ODQwMzM1ZiksIEZMMkZYQ09OU1RfREJMKDAuMzk4NDAzMzVmKSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC4zOTg0MDMzNWYpfX07CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBmYWN0b3JzWzRdID0geworICAgIEZMMkZYQ09OU1RfREJMKDAuMzk4NDAzMzVmKSwgRkwyRlhDT05TVF9EQkwoLTAuMzk4NDAzMzVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgtMC4zOTg0MDMzNWYpLCBGTDJGWENPTlNUX0RCTCgwLjM5ODQwMzM1Zil9OworCisjZGVmaW5lIFBTQ0FMRSAzMgorCitzdGF0aWMgY29uc3QgRklYUF9EQkwgcF9GWzEyOF0gPSB7RkwyRlhDT05TVF9EQkwoMC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDIuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMy5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDUuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoNi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDguZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoOS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMy5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxNC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxNS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxNi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxNy5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxOC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxOS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyMC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyMS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyMi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyMy5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyNC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyNS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyNi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyNy5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyOC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyOS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzMC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzMS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzMi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzMy5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzNC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzNS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzNi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzNy5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzOC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzOS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg0MC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg0MS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg0Mi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg0My5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg0NC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg0NS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg0Ni5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg0Ny5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg0OC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg0OS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg1MC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg1MS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg1Mi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg1My5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg1NC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg1NS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg1Ni5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg1Ny5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg1OC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg1OS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2MC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2MS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2Mi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2My5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2NC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2NS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2Ni5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2Ny5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2OC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2OS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg3MC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg3MS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg3Mi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg3My5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg3NC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg3NS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg3Ni5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg3Ny5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg3OC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg3OS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg4MC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg4MS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg4Mi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg4My5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg4NC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg4NS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg4Ni5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg4Ny5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg4OC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg4OS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5MC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5MS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5Mi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5My5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5NC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5NS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5Ni5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5Ny5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5OC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5OS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMDAuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTAxLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEwMi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMDMuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTA0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEwNS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMDYuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTA3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEwOC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMDkuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTEwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDExMS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMTIuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTEzLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDExNC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMTUuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTE2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDExNy5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMTguZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTE5LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEyMC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMjEuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTIyLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEyMy5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMjQuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTI1LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEyNi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMjcuZiAvIChQU0NBTEUgKiAxMi5mKSl9OworCitzdGF0aWMgY29uc3QgRklYUF9EQkwgYmFuZF9GWzY0XSA9IHsKKyAgICBGTDJGWENPTlNUX0RCTCgoMC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMi5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMy5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNi5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNy5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoOC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoOS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDExLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMi5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTMuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDE0LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxNS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTYuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDE3LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxOC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTkuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDIwLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgyMS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMjIuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDIzLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgyNC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMjUuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDI2LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgyNy5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMjguZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDI5LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgzMC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMzEuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDMyLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgzMy5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMzQuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDM1LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgzNi5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMzcuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDM4LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgzOS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNDAuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDQxLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg0Mi5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNDMuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDQ0LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg0NS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNDYuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDQ3LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg0OC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNDkuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDUwLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg1MS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNTIuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDUzLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg1NC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNTUuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDU2LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg1Ny5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNTguZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDU5LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg2MC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNjEuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDYyLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg2My5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKX07CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0cl9zdHJbM10gPSB7RkwyRlhDT05TVF9EQkwoMS5mIC8gNC5mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMi5mIC8gNC5mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMy5mIC8gNC5mKX07CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBzdHJldGNoZmFjWzNdID0ge0ZMMkZYQ09OU1RfREJMKDEuZiAvIDIuZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxLmYgLyAzLmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMS5mIC8gNC5mKX07CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBjb3NfRls2NF0gPSB7CisgICAgMjYzNTMwMjgsICAgLTc5MDQzMjA4LCAgIDEzMTY4NTc3NiwgIC0xODQyNDQ5NDQsICAyMzY2OTcyMTYsICAtMjg5MDA2OTEyLAorICAgIDM0MTE0MjQ5NiwgIC0zOTMwNzI2MDgsICA0NDQ3NzM5ODQsICAtNDk2MTkxMzkyLCAgNTQ3MzI1ODI0LCAgLTU5ODExNDc1MiwKKyAgICA2NDg1NTkxMDQsICAtNjk4NTk3MjQ4LCAgNzQ4MjMwMDE2LCAgLTc5NzQxMTkwNCwgIDg0NjA4MzIwMCwgIC04OTQyNzUxMzYsCisgICAgOTQxOTI4MTkyLCAgLTk4OTAxMzc2MCwgIDEwMzU0NzQ2MjQsIC0xMDgxMzQwNjcyLCAxMTI2NTU1MTM2LCAtMTE3MTA2MzI5NiwKKyAgICAxMjE0ODkzNjk2LCAtMTI1Nzk5MjE5MiwgMTMwMDMzMjU0NCwgLTEzNDE4ODk0MDgsIDEzODI2MTI3MzYsIC0xNDIyNTAzODA4LAorICAgIDE0NjE1ODY5NDQsIC0xNDk5NzQxNDQwLCAxNTM3MDM5MTA0LCAtMTU3MzM2NDg2NCwgMTYwODc0MzgwOCwgLTE2NDMxOTY2NzIsCisgICAgMTY3NjYxNzM0NCwgLTE3MDkwMjg5OTIsIDE3NDA0NTA1NjAsIC0xNzcwNzg0ODk2LCAxODAwMDg5NDcyLCAtMTgyODI3MzUzNiwKKyAgICAxODU1MzU3NDQwLCAtMTg4MTM1NjI4OCwgMTkwNjE5MDA4MCwgLTE5Mjk4NzY2MDgsIDE5NTI0Mjg5MjgsIC0xOTczNzc3NjY0LAorICAgIDE5OTM5NjI4ODAsIC0yMDEyOTIyMjQwLCAyMDMwNjcwMjA4LCAtMjA0NzIxNjAwMCwgMjA2MjUwODI4OCwgLTIwNzY1NTk0ODgsCisgICAgMjA4OTM3NjEyOCwgLTIxMDA5MzIyMjQsIDIxMTExOTY4MDAsIC0yMTIwMjE0Nzg0LCAyMTI3OTUzNzkyLCAtMjEzNDM5NDM2OCwKKyAgICAyMTM5NTY1MDU2LCAtMjE0MzQ0NDg2NCwgMjE0NjAyNjYyNCwgLTIxNDczMjE4NTZ9OworCitzdGF0aWMgY29uc3QgRklYUF9EQkwgdHdpZGRsZVsxMjFdID0gezEwNzM3NDE4MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNzE0NDI4NjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNjQ1NTU4MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNTMxMTAxNzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzcxNTQ5NTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTY3NTg0ODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5MjAwODA5NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYzMDA5NzczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5Mjk4ODc2OTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5Mjc4MzY5OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODUxODU2NjYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDcyODE4NDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1OTI1MDEyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA3OTY3MTc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTM2NTI2MDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NjUzODk5NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM2ODcwOTEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzQ5MDM4NjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxMDkwMzIwNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQ1MTQyOTk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzc5MDQ4MzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOTQ3NjYzOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQwMTUxNDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDIyNjA3NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcwMjI2MDc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTQwMTUxNDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjA5NDc2NjM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjc3OTA0ODM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzQ1MTQyOTk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDEwOTAzMjA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDc0OTAzODY1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTM2ODcwOTEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTk2NTM4OTk1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjUzNjUyNjA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzA3OTY3MTc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzU5MjUwMTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODA3MjgxODQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODUxODU2NjYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODkyNzgzNjk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTI5ODg3Njk3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTYzMDA5NzczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTkyMDA4MDk0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTAxNjc1ODQ4NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwMzcxNTQ5NTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDUzMTEwMTc2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA2NDU1NTgxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzE0NDI4NjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDczNzQxODI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3MTQ0Mjg2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNjQ1NTU4MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDUzMTEwMTc2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTAzNzE1NDk1OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwMTY3NTg0ODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05OTIwMDgwOTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NjMwMDk3NzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05Mjk4ODc2OTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04OTI3ODM2OTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NTE4NTY2NjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04MDcyODE4NDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03NTkyNTAxMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MDc5NjcxNzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02NTM2NTI2MDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01OTY1Mzg5OTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01MzY4NzA5MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NzQ5MDM4NjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MTA5MDMyMDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNDUxNDI5OTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNzc5MDQ4MzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yMDk0NzY2MzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDAxNTE0MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MDIyNjA3NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzAyMjYwNzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MDE1MTQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA5NDc2NjM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzc5MDQ4MzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0NTE0Mjk5OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEwOTAzMjA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzQ5MDM4NjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNjg3MDkxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk2NTM4OTk1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTM2NTI2MDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwNzk2NzE3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzU5MjUwMTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDcyODE4NDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg1MTg1NjY2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODkyNzgzNjk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5Mjk4ODc2OTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MzAwOTc3MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTkyMDA4MDk0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDE2NzU4NDg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDM3MTU0OTU5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDUzMTEwMTc2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDY0NTU1ODE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDcxNDQyODYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDczNzQxODI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDcxNDQyODYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDY0NTU1ODE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDUzMTEwMTc2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDM3MTU0OTU5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDE2NzU4NDg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OTIwMDgwOTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MzAwOTc3MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTI5ODg3Njk3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OTI3ODM2OTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg1MTg1NjY2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODA3MjgxODQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NTkyNTAxMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwNzk2NzE3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjUzNjUyNjA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTY1Mzg5OTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNjg3MDkxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc0OTAzODY1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MTA5MDMyMDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0NTE0Mjk5OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc3OTA0ODM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDk0NzY2MzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MDE1MTQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzAyMjYwNzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OworCisjaWYgRklYUF9RVFcgPT0gRklYUF9TR0wKKyNkZWZpbmUgSFRXKHgpICh4KQorI2Vsc2UKKyNkZWZpbmUgSFRXKHgpIEZYX0RCTDJGWF9RVFcoRlhfU0dMMkZYX0RCTCgoY29uc3QgRklYUF9TR0wpeCkpCisjZW5kaWYKKworc3RhdGljIGNvbnN0IEZJWFBfUVRXIHBvc3RfdHdpZGRsZV9jb3NfOFs4XSA9IHsKKyAgICBIVFcoLTE2MDYpLCAgSFRXKDQ3NTYpLCAgSFRXKC03NzIzKSwgIEhUVygxMDM5NCksCisgICAgSFRXKC0xMjY2NSksIEhUVygxNDQ0OSksIEhUVygtMTU2NzkpLCBIVFcoMTYzMDUpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfUVRXIHBvc3RfdHdpZGRsZV9jb3NfMTZbMTZdID0geworICAgIEhUVygtODA0KSwgICBIVFcoMjQwNCksICBIVFcoLTM5ODEpLCAgSFRXKDU1MjApLCAgSFRXKC03MDA1KSwgIEhUVyg4NDIzKSwKKyAgICBIVFcoLTk3NjApLCAgSFRXKDExMDAzKSwgSFRXKC0xMjE0MCksIEhUVygxMzE2MCksIEhUVygtMTQwNTMpLCBIVFcoMTQ4MTEpLAorICAgIEhUVygtMTU0MjYpLCBIVFcoMTU4OTMpLCBIVFcoLTE2MjA3KSwgSFRXKDE2MzY0KX07CisKK3N0YXRpYyBjb25zdCBGSVhQX1FUVyBwb3N0X3R3aWRkbGVfY29zXzI0WzI0XSA9IHsKKyAgICBIVFcoLTUzNiksICAgSFRXKDE2MDYpLCAgSFRXKC0yNjY5KSwgIEhUVygzNzIwKSwgIEhUVygtNDc1NiksICBIVFcoNTc3MSksCisgICAgSFRXKC02NzYyKSwgIEhUVyg3NzIzKSwgIEhUVygtODY1MiksICBIVFcoOTU0MyksICBIVFcoLTEwMzk0KSwgSFRXKDExMjAwKSwKKyAgICBIVFcoLTExOTU4KSwgSFRXKDEyNjY1KSwgSFRXKC0xMzMxOCksIEhUVygxMzkxMyksIEhUVygtMTQ0NDkpLCBIVFcoMTQ5MjQpLAorICAgIEhUVygtMTUzMzQpLCBIVFcoMTU2NzkpLCBIVFcoLTE1OTU2KSwgSFRXKDE2MTY1KSwgSFRXKC0xNjMwNSksIEhUVygxNjM3NSl9OworCitzdGF0aWMgY29uc3QgRklYUF9RVFcgcG9zdF90d2lkZGxlX2Nvc18zMlszMl0gPSB7CisgICAgSFRXKC00MDIpLCAgIEhUVygxMjA1KSwgIEhUVygtMjAwNiksICBIVFcoMjgwMSksICBIVFcoLTM1OTApLCAgSFRXKDQzNzApLAorICAgIEhUVygtNTEzOSksICBIVFcoNTg5NyksICBIVFcoLTY2MzkpLCAgSFRXKDczNjYpLCAgSFRXKC04MDc2KSwgIEhUVyg4NzY1KSwKKyAgICBIVFcoLTk0MzQpLCAgSFRXKDEwMDgwKSwgSFRXKC0xMDcwMiksIEhUVygxMTI5NyksIEhUVygtMTE4NjYpLCBIVFcoMTI0MDYpLAorICAgIEhUVygtMTI5MTYpLCBIVFcoMTMzOTUpLCBIVFcoLTEzODQyKSwgSFRXKDE0MjU2KSwgSFRXKC0xNDYzNSksIEhUVygxNDk3OCksCisgICAgSFRXKC0xNTI4NiksIEhUVygxNTU1NyksIEhUVygtMTU3OTEpLCBIVFcoMTU5ODYpLCBIVFcoLTE2MTQzKSwgSFRXKDE2MjYxKSwKKyAgICBIVFcoLTE2MzQwKSwgSFRXKDE2Mzc5KX07CisKK3N0YXRpYyBjb25zdCBGSVhQX1FUVyBwb3N0X3R3aWRkbGVfY29zXzQwWzQwXSA9IHsKKyAgICBIVFcoLTMyMiksICAgSFRXKDk2NSksICAgSFRXKC0xNjA2KSwgIEhUVygyMjQ1KSwgIEhUVygtMjg4MCksICBIVFcoMzUxMSksCisgICAgSFRXKC00MTM3KSwgIEhUVyg0NzU2KSwgIEhUVygtNTM2OCksICBIVFcoNTk3MSksICBIVFcoLTY1NjYpLCAgSFRXKDcxNTApLAorICAgIEhUVygtNzcyMyksICBIVFcoODI4NSksICBIVFcoLTg4MzMpLCAgSFRXKDkzNjgpLCAgSFRXKC05ODg5KSwgIEhUVygxMDM5NCksCisgICAgSFRXKC0xMDg4MyksIEhUVygxMTM1NiksIEhUVygtMTE4MTApLCBIVFcoMTIyNDcpLCBIVFcoLTEyNjY1KSwgSFRXKDEzMDYzKSwKKyAgICBIVFcoLTEzNDQxKSwgSFRXKDEzNzk5KSwgSFRXKC0xNDEzNSksIEhUVygxNDQ0OSksIEhUVygtMTQ3NDEpLCBIVFcoMTUwMTEpLAorICAgIEhUVygtMTUyNTcpLCBIVFcoMTU0ODApLCBIVFcoLTE1Njc5KSwgSFRXKDE1ODUzKSwgSFRXKC0xNjAwMyksIEhUVygxNjEyOSksCisgICAgSFRXKC0xNjIyOSksIEhUVygxNjMwNSksIEhUVygtMTYzNTYpLCBIVFcoMTYzODEpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfUVRXIHBvc3RfdHdpZGRsZV9zaW5fOFs4XSA9IHsKKyAgICBIVFcoMTYzMDUpLCBIVFcoLTE1Njc5KSwgSFRXKDE0NDQ5KSwgSFRXKC0xMjY2NSksCisgICAgSFRXKDEwMzk0KSwgSFRXKC03NzIzKSwgIEhUVyg0NzU2KSwgIEhUVygtMTYwNil9OworCitzdGF0aWMgY29uc3QgRklYUF9RVFcgcG9zdF90d2lkZGxlX3Npbl8xNlsxNl0gPSB7CisgICAgSFRXKDE2MzY0KSwgSFRXKC0xNjIwNyksIEhUVygxNTg5MyksIEhUVygtMTU0MjYpLCBIVFcoMTQ4MTEpLCBIVFcoLTE0MDUzKSwKKyAgICBIVFcoMTMxNjApLCBIVFcoLTEyMTQwKSwgSFRXKDExMDAzKSwgSFRXKC05NzYwKSwgIEhUVyg4NDIzKSwgIEhUVygtNzAwNSksCisgICAgSFRXKDU1MjApLCAgSFRXKC0zOTgxKSwgIEhUVygyNDA0KSwgIEhUVygtODA0KX07CisKK3N0YXRpYyBjb25zdCBGSVhQX1FUVyBwb3N0X3R3aWRkbGVfc2luXzI0WzI0XSA9IHsKKyAgICBIVFcoMTYzNzUpLCBIVFcoLTE2MzA1KSwgSFRXKDE2MTY1KSwgSFRXKC0xNTk1NiksIEhUVygxNTY3OSksIEhUVygtMTUzMzQpLAorICAgIEhUVygxNDkyNCksIEhUVygtMTQ0NDkpLCBIVFcoMTM5MTMpLCBIVFcoLTEzMzE4KSwgSFRXKDEyNjY1KSwgSFRXKC0xMTk1OCksCisgICAgSFRXKDExMjAwKSwgSFRXKC0xMDM5NCksIEhUVyg5NTQzKSwgIEhUVygtODY1MiksICBIVFcoNzcyMyksICBIVFcoLTY3NjIpLAorICAgIEhUVyg1NzcxKSwgIEhUVygtNDc1NiksICBIVFcoMzcyMCksICBIVFcoLTI2NjkpLCAgSFRXKDE2MDYpLCAgSFRXKC01MzYpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfUVRXIHBvc3RfdHdpZGRsZV9zaW5fMzJbMzJdID0geworICAgIEhUVygxNjM3OSksIEhUVygtMTYzNDApLCBIVFcoMTYyNjEpLCBIVFcoLTE2MTQzKSwgSFRXKDE1OTg2KSwgSFRXKC0xNTc5MSksCisgICAgSFRXKDE1NTU3KSwgSFRXKC0xNTI4NiksIEhUVygxNDk3OCksIEhUVygtMTQ2MzUpLCBIVFcoMTQyNTYpLCBIVFcoLTEzODQyKSwKKyAgICBIVFcoMTMzOTUpLCBIVFcoLTEyOTE2KSwgSFRXKDEyNDA2KSwgSFRXKC0xMTg2NiksIEhUVygxMTI5NyksIEhUVygtMTA3MDIpLAorICAgIEhUVygxMDA4MCksIEhUVygtOTQzNCksICBIVFcoODc2NSksICBIVFcoLTgwNzYpLCAgSFRXKDczNjYpLCAgSFRXKC02NjM5KSwKKyAgICBIVFcoNTg5NyksICBIVFcoLTUxMzkpLCAgSFRXKDQzNzApLCAgSFRXKC0zNTkwKSwgIEhUVygyODAxKSwgIEhUVygtMjAwNiksCisgICAgSFRXKDEyMDUpLCAgSFRXKC00MDIpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfUVRXIHBvc3RfdHdpZGRsZV9zaW5fNDBbNDBdID0geworICAgIEhUVygxNjM4MSksIEhUVygtMTYzNTYpLCBIVFcoMTYzMDUpLCBIVFcoLTE2MjI5KSwgSFRXKDE2MTI5KSwgSFRXKC0xNjAwMyksCisgICAgSFRXKDE1ODUzKSwgSFRXKC0xNTY3OSksIEhUVygxNTQ4MCksIEhUVygtMTUyNTcpLCBIVFcoMTUwMTEpLCBIVFcoLTE0NzQxKSwKKyAgICBIVFcoMTQ0NDkpLCBIVFcoLTE0MTM1KSwgSFRXKDEzNzk5KSwgSFRXKC0xMzQ0MSksIEhUVygxMzA2MyksIEhUVygtMTI2NjUpLAorICAgIEhUVygxMjI0NyksIEhUVygtMTE4MTApLCBIVFcoMTEzNTYpLCBIVFcoLTEwODgzKSwgSFRXKDEwMzk0KSwgSFRXKC05ODg5KSwKKyAgICBIVFcoOTM2OCksICBIVFcoLTg4MzMpLCAgSFRXKDgyODUpLCAgSFRXKC03NzIzKSwgIEhUVyg3MTUwKSwgIEhUVygtNjU2NiksCisgICAgSFRXKDU5NzEpLCAgSFRXKC01MzY4KSwgIEhUVyg0NzU2KSwgIEhUVygtNDEzNyksICBIVFcoMzUxMSksICBIVFcoLTI4ODApLAorICAgIEhUVygyMjQ1KSwgIEhUVygtMTYwNiksICBIVFcoOTY1KSwgICBIVFcoLTMyMil9OworCitzdGF0aWMgY29uc3QgRklYUF9EQkwgcHJlTW9kQ29zWzMyXSA9IHsKKyAgICAtNzQ5ODc1Nzc2LCA3ODY2ODE1MzYsICAgNzExMjYzNTUyLCAgLTgyMTU5MjA2NCwgIC02NzA5Mzc3OTIsIDg1NDUyMzM5MiwKKyAgICA2Mjg5OTU2NDgsICAtODg1Mzk2MDMyLCAgLTU4NTUzODI0MCwgOTE0MTM1NjgwLCAgIDU0MDY3MDIwOCwgIC05NDA2NzMwODgsCisgICAgLTQ5NDQ5OTY4MCwgOTY0OTQ0Mzg0LCAgIDQ0NzEzNzgyNCwgIC05ODY4OTEwMDgsICAtMzk4Njk4ODE2LCAxMDA2NDYwMDk2LAorICAgIDM0OTI5OTI2NCwgIC0xMDIzNjA0NTQ0LCAtMjk5MDU4MjQwLCAxMDM4MjgzMDcyLCAgMjQ4MDk2NzUyLCAgLTEwNTA0NjAyODgsCisgICAgLTE5NjUzNzU4NCwgMTA2MDEwNjgxNiwgIDE0NDUwNDkyOCwgIC0xMDY3MTk5NDg4LCAtOTIxMjQxNjAsICAxMDcxNzIxMTUyLAorICAgIDM5NTIxNDU2LCAgIC0xMDczNjYwOTkyfTsKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIHByZU1vZFNpblszMl0gPSB7CisgICAgNzY4NTEwMTQ0LCAgIDczMDc4OTc2MCwgIC04MDQzNzkwNzIsICAtNjkxMzA4ODY0LCA4MzgzMTAyMDgsICAgNjUwMTYyNTYwLAorICAgIC04NzAyMjE3NjAsICAtNjA3NDQ5OTIwLCA5MDAwMzY5MjgsICAgNTYzMjczODU2LCAgLTkyNzY4Mzc3NiwgIC01MTc3NDA4OTYsCisgICAgOTUzMDk1ODA4LCAgIDQ3MDk2MDYwOCwgIC05NzYyMTE3MTIsICAtNDIzMDQ1NzI4LCA5OTY5NzU4MDgsICAgMzc0MTExNzEyLAorICAgIC0xMDE1MzM4MTEyLCAtMzI0Mjc2NDE2LCAxMDMxMjU0NDAwLCAgMjczNjU5OTA0LCAgLTEwNDQ2ODYzMzYsIC0yMjIzODQxNDQsCisgICAgMTA1NTYwMTQ3MiwgIDE3MDU3MjY0MCwgIC0xMDYzOTczNjMyLCAtMTE4MzUwMTkyLCAxMDY5NzgyNTI4LCAgNjU4NDI2NDAsCisgICAgLTEwNzMwMTQyMDgsIC0xMzE3NjQ2NH07CisKKy8qIFRoZSBjdWJlIHJvb3QgZnVuY3Rpb24gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBpbnZDdWJlUm9vdE5vcm0yCisgICAgZGVzY3JpcHRpb246ICBkZWxpdmVycyAxL2N1YmVyb290KG9wKSBpbiBRMS4zMSBmb3JtYXQgYW5kIG1vZGlmaWVkIGV4cG9uZW50CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDVUJFX1JPT1RfQklUUyA3CisjZGVmaW5lIENVQkVfUk9PVF9WQUxVRVMgKDEyOCArIDIpCisjZGVmaW5lIENVQkVfUk9PVF9CSVRTX01BU0sgMHg3ZgorI2RlZmluZSBDVUJFX1JPT1RfRlJBQ1RfQklUU19NQVNLIDB4MDA3RkZGRkYKKy8qIEludmVyc2UgY3ViZSByb290IHRhYmxlIGZvciBvcGVyYW5kcyBydW5uaW5nIGZyb20gMC41IHRvIDEuMCAqLworLyogKElOVCkgKDEuMC9jdWJlcm9vdCgob3ApKSk7ICAgICAgICAgICAgICAgICAgICAqLworLyogSW1wbGljaXQgZXhwb25lbnQgaXMgMS4gICAgICAgICAgICAgICAgICAgICAgICAqLworCitMTktfU0VDVElPTl9DT05TVERBVEEKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZDdWJlUm9vdFRhYltDVUJFX1JPT1RfVkFMVUVTXSA9IHsKKyAgICAoMHg1MGEyOGJlNiksICgweDUwNmQxMTcyKSwgKDB4NTAzODIzYzQpLCAoMHg1MDAzYzA1YSksICgweDRmY2ZlNGMwKSwKKyAgICAoMHg0ZjljOGU5MiksICgweDRmNjliYjdkKSwgKDB4NGYzNzY5M2IpLCAoMHg0ZjA1OTU5NCksICgweDRlZDQzZTVmKSwKKyAgICAoMHg0ZWEzNjE4MSksICgweDRlNzJmY2VhKSwgKDB4NGU0MzBlOTgpLCAoMHg0ZTEzOTQ5NSksICgweDRkZTQ4Y2Y1KSwKKyAgICAoMHg0ZGI1ZjVkYiksICgweDRkODdjZDczKSwgKDB4NGQ1YTExZjIpLCAoMHg0ZDJjYzE5YyksICgweDRjZmZkYWJiKSwKKyAgICAoMHg0Y2QzNWJhNCksICgweDRjYTc0MmI3KSwgKDB4NGM3YjhlNWMpLCAoMHg0YzUwM2QwNSksICgweDRjMjU0ZDJhKSwKKyAgICAoMHg0YmZhYmQ1MCksICgweDRiZDA4YzAwKSwgKDB4NGJhNmI3Y2QpLCAoMHg0YjdkM2Y1MyksICgweDRiNTQyMTM0KSwKKyAgICAoMHg0YjJiNWMxOCksICgweDRiMDJlZWIxKSwgKDB4NGFkYWQ3YjgpLCAoMHg0YWIzMTVlYSksICgweDRhOGJhODBkKSwKKyAgICAoMHg0YTY0OGNlYyksICgweDRhM2RjMzViKSwgKDB4NGExNzRhMzApLCAoMHg0OWYxMjA0YSksICgweDQ5Y2I0NDhkKSwKKyAgICAoMHg0OWE1YjVlMiksICgweDQ5ODA3MzM5KSwgKDB4NDk1YjdiODYpLCAoMHg0OTM2Y2RjMiksICgweDQ5MTI2OGVjKSwKKyAgICAoMHg0OGVlNGMwOCksICgweDQ4Y2E3NjFmKSwgKDB4NDhhNmU2M2UpLCAoMHg0ODgzOWI3NiksICgweDQ4NjA5NGRlKSwKKyAgICAoMHg0ODNkZDE5MCksICgweDQ4MWI1MGFkKSwgKDB4NDdmOTExNTYpLCAoMHg0N2Q3MTJiMyksICgweDQ3YjU1M2YwKSwKKyAgICAoMHg0NzkzZDQzYyksICgweDQ3NzI5MmM5KSwgKDB4NDc1MThlY2UpLCAoMHg0NzMwYzc4NSksICgweDQ3MTAzYzJkKSwKKyAgICAoMHg0NmVmZWMwNiksICgweDQ2Y2ZkNjU1KSwgKDB4NDZhZmZhNjEpLCAoMHg0NjkwNTc3NyksICgweDQ2NzBlY2U0KSwKKyAgICAoMHg0NjUxYjlmOSksICgweDQ2MzJiZTBiKSwgKDB4NDYxM2Y4NzEpLCAoMHg0NWY1Njg4NSksICgweDQ1ZDcwZGE1KSwKKyAgICAoMHg0NWI4ZTcyZiksICgweDQ1OWFmNDg3KSwgKDB4NDU3ZDM1MTEpLCAoMHg0NTVmYTgzNSksICgweDQ1NDI0ZDVkKSwKKyAgICAoMHg0NTI1MjNmNiksICgweDQ1MDgyYjZlKSwgKDB4NDRlYjYzMzcpLCAoMHg0NGNlY2FjNSksICgweDQ0YjI2MThkKSwKKyAgICAoMHg0NDk2MjcwOCksICgweDQ0N2ExYWIxKSwgKDB4NDQ1ZTNjMDIpLCAoMHg0NDQyOGE3YyksICgweDQ0MjcwNTllKSwKKyAgICAoMHg0NDBiYWNlYyksICgweDQzZjA3ZmU5KSwgKDB4NDNkNTdlMWMpLCAoMHg0M2JhYTcwZSksICgweDQzOWZmYTQ4KSwKKyAgICAoMHg0Mzg1Nzc1NyksICgweDQzNmIxZGM4KSwgKDB4NDM1MGVkMmIpLCAoMHg0MzM2ZTUxMSksICgweDQzMWQwNTBjKSwKKyAgICAoMHg0MzAzNGNiMiksICgweDQyZTliYjk4KSwgKDB4NDJkMDUxNTYpLCAoMHg0MmI3MGQ4NSksICgweDQyOWRlZmMwKSwKKyAgICAoMHg0Mjg0ZjdhMiksICgweDQyNmMyNGNiKSwgKDB4NDI1Mzc2ZDgpLCAoMHg0MjNhZWQ2YSksICgweDQyMjI4ODIzKSwKKyAgICAoMHg0MjBhNDZhNiksICgweDQxZjIyODk4KSwgKDB4NDFkYTJkOWYpLCAoMHg0MWMyNTU2MSksICgweDQxYWE5Zjg2KSwKKyAgICAoMHg0MTkzMGJiYSksICgweDQxN2I5OWE1KSwgKDB4NDE2NDQ4ZjUpLCAoMHg0MTRkMTk1NiksICgweDQxMzYwYTc2KSwKKyAgICAoMHg0MTFmMWMwNiksICgweDQxMDg0ZGI1KSwgKDB4NDBmMTlmMzUpLCAoMHg0MGRiMTAzOSksICgweDQwYzRhMDc0KSwKKyAgICAoMHg0MGFlNGY5YiksICgweDQwOTgxZDY0KSwgKDB4NDA4MjA5ODUpLCAoMHg0MDZjMTNiNiksICgweDQwNTYzYmIxKSwKKyAgICAoMHg0MDQwODEyZSksICgweDQwMmFlM2U3KSwgKDB4NDAxNTYzOTkpLCAoMHg0MDAwMDAwMCksICgweDNGRUFCOEQ5KX07CisvKiAgbi5hLiAgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZDdWJlUm9vdENvcnJlY3Rpb25bM10gPSB7MHg0MDAwMDAwMCwgMHg1MEEyOEJFNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NTk3RkE5NX07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmIGNhbGN1bGF0ZSAxLjAvY3ViZV9yb290KG9wKSwgb3AgY29udGFpbnMgbWFudGlzc2EgYW5kIGV4cG9uZW50CisgKiBccGFyYW0gb3BfbTogKGkpIG1hbnRpc3NhIG9mIG9wZXJhbmQsIG11c3Qgbm90IGJlIHplcm8gKDB4MDAwMC4wMDAwKSBvcgorICogbmVnYXRpdmUKKyAqIFxwYXJhbSBvcF9lOiAoaSkgcG9pbnRlciB0byB0aGUgZXhwb25lbnQgb2YgdGhlIG9wZXJhbmQgKG11c3QgYmUgaW5pdGlhbGl6ZWQpCisgKiBhbmQgLi4gKG8pIHBvaW50ZXIgdG8gdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQKKyAqIFxyZXR1cm46ICAgICAobykgbWFudGlzc2Egb2YgdGhlIHJlc3VsdAorICogXGRlc2NyaXB0aW9uOgorICogIFRoaXMgcm91dGluZSBjYWxjdWxhdGVzIHRoZSBjdWJlIHJvb3Qgb2YgdGhlIGlucHV0IG9wZXJhbmQsIHRoYXQgaXMKKyAqICBnaXZlbiB3aXRoIGl0cyBtYW50aXNzYSBpbiBRMzEgZm9ybWF0IChGSVhQX0RCTCkgYW5kIGl0cyBleHBvbmVudCAoSU5UKS4KKyAqICBUaGUgcmVzdWx0aW5nIG1hbnRpc3NhIGlzIHJldHVybmVkIGluIGZvcm1hdCBRMzEuIFRoZSBleHBvbmVudCAoKm9wX2UpCisgKiAgaXMgbW9kaWZpZWQgYWNjb3JkaW5nbHkuIEl0IGlzIG5vdCBhc3N1cmVkLCB0aGF0IHRoZSByZXN1bHQgaXMgZnVsbHkKKyAqIGxlZnQtYWxpZ25lZCBidXQgYXNzdW1lZCB0byBoYXZlIG5vdCBtb3JlIHRoYW4gMiBiaXRzIGhlYWRyb29tLiBUaGVyZSBpcyBvbmUKKyAqIG1hY3JvIHRvIGFjdGl2YXRlIHRoZSB1c2Ugb2YgdGhpcyBhbGdvcml0aG06IEZVTkNUSU9OX2ludkN1YmVSb290Tm9ybTIgQnkKKyAqIG1lYW5zIG9mIGFjdGl2YXRpbmcgdGhlIG1hY3JvIElOVkNVQkVST09UTk9STTJfTElORUFSX0lOVEVSUE9MQVRFX0hRLCBhCisgKiBzbGlnaHRseSBoaWdoZXIgcHJlY2lzaW9uIGlzIHJlYWNoYWJsZSAoYnkgZGVmYXVsdCwgbm90IGFjdGl2ZSkuIEZvciBERUJVRworICogcHVycG9zZSBvbmx5OiBhIEZES19BU1NFUlQgbWFjcm8gdmFsaWRhdGVzLCBpZiB0aGUgaW5wdXQgbWFudGlzc2EgaXMgZ3JlYXRlcgorICogemVyby4KKyAqCisgKi8KK3N0YXRpYworI2lmZGVmIF9fYXJtX18KKyAgICBGSVhQX0RCTCBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyAgICBpbnZDdWJlUm9vdE5vcm0yKEZJWFBfREJMIG9wX20sIElOVCogb3BfZSkKKyNlbHNlCisgICAgRklYUF9EQkwKKyAgICBpbnZDdWJlUm9vdE5vcm0yKEZJWFBfREJMIG9wX20sIElOVCogb3BfZSkKKyNlbmRpZgoreworICBGREtfQVNTRVJUKG9wX20gPiBGSVhQX0RCTCgwKSk7CisKKyAgLyogbm9ybWFsaXplIGlucHV0LCBjYWxjdWxhdGUgc2hpZnQgdmFsdWUgKi8KKyAgSU5UIGV4cG9uZW50ID0gKElOVClmTm9ybXoob3BfbSkgLSAxOworICBvcF9tIDw8PSBleHBvbmVudDsKKworICBJTlQgaW5kZXggPSAoSU5UKShvcF9tID4+IChERlJBQ1RfQklUUyAtIDEgLSAoQ1VCRV9ST09UX0JJVFMgKyAxKSkpICYKKyAgICAgICAgICAgICAgQ1VCRV9ST09UX0JJVFNfTUFTSzsKKyAgRklYUF9EQkwgZnJhY3QgPSAoRklYUF9EQkwpKCgoSU5UKW9wX20gJiBDVUJFX1JPT1RfRlJBQ1RfQklUU19NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKENVQkVfUk9PVF9CSVRTICsgMSkpOworICBGSVhQX0RCTCBkaWZmID0gaW52Q3ViZVJvb3RUYWJbaW5kZXggKyAxXSAtIGludkN1YmVSb290VGFiW2luZGV4XTsKKyAgb3BfbSA9IGZNdWx0QWRkRGl2MihpbnZDdWJlUm9vdFRhYltpbmRleF0sIGRpZmYgPDwgMSwgZnJhY3QpOworI2lmIGRlZmluZWQoSU5WQ1VCRVJPT1ROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEpCisgIC8qIHJlZzEgPSB0W2ldICsgKHRbaSsxXS10W2ldKSpmcmFjdCAuLi4gYWxyZWFkeSBjb21wdXRlZCAuLi4gKworICAgKiAoMS1mcmFjdClmcmFjdCoodFtpKzJdLXRbaSsxXSkvMiAqLworICBpZiAoZnJhY3QgIT0gKEZJWFBfREJMKTApIHsKKyAgICAvKiBmcmFjdCA9IGZyYWN0ICogKDEgLSBmcmFjdCkgKi8KKyAgICBmcmFjdCA9IGZNdWx0RGl2MihmcmFjdCwgKEZJWFBfREJMKSgoTE9ORykweDgwMDAwMDAwIC0gKExPTkcpZnJhY3QpKSA8PCAxOworICAgIGRpZmYgPSBkaWZmIC0gKGludkN1YmVSb290VGFiW2luZGV4ICsgMl0gLSBpbnZDdWJlUm9vdFRhYltpbmRleCArIDFdKTsKKyAgICBvcF9tID0gZk11bHRBZGREaXYyKG9wX20sIGZyYWN0LCBkaWZmKTsKKyAgfQorI2VuZGlmIC8qIElOVkNVQkVST09UTk9STTJfTElORUFSX0lOVEVSUE9MQVRFX0hRICovCisKKyAgLyogY2FsY3VsYXRlIHRoZSBvdXRwdXQgZXhwb25lbnQgPSBpbnB1dCAqIGV4cC8zID0gY3ViaWNyb290KG0pKjJeKGV4cC8zKQorICAgKiB3aGVyZSAyXihleHAvMykgPSAyXmsnKjIgb3IgMl5rJyoyXigxLzMpIG9yIDJeaycqMl4oMi8zKSAqLworICBleHBvbmVudCA9IGV4cG9uZW50IC0gKm9wX2UgKyAzOworICBJTlQgc2hpZnRfdG1wID0KKyAgICAgICgoSU5UKWZNdWx0RGl2MigoRklYUF9TR0wpZkFicyhleHBvbmVudCksIChGSVhQX1NHTCkweDU1NTYpKSA+PiAxNjsKKyAgaWYgKGV4cG9uZW50IDwgMCkgeworICAgIHNoaWZ0X3RtcCA9IC1zaGlmdF90bXA7CisgIH0KKyAgSU5UIHJlbSA9IGV4cG9uZW50IC0gMyAqIHNoaWZ0X3RtcDsKKyAgaWYgKHJlbSA8IDApIHsKKyAgICByZW0gKz0gMzsKKyAgICBzaGlmdF90bXAtLTsKKyAgfQorCisgICpvcF9lID0gc2hpZnRfdG1wOworICBvcF9tID0gZk11bHREaXYyKG9wX20sIGludkN1YmVSb290Q29ycmVjdGlvbltyZW1dKSA8PCAyOworCisgIHJldHVybiAob3BfbSk7Cit9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgIGZ1bmN0aW9ubmFtZTogaW52Rm91cnRoUm9vdE5vcm0yCisgICAgICBkZXNjcmlwdGlvbjogIGRlbGl2ZXJzIDEvRm91cnRoUm9vdChvcCkgaW4gUTEuMzEgZm9ybWF0IGFuZCBtb2RpZmllZAorICBleHBvbmVudAorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZPVVJUSFJPT1RfQklUUyA3CisjZGVmaW5lIEZPVVJUSFJPT1RfVkFMVUVTICgxMjggKyAyKQorI2RlZmluZSBGT1VSVEhST09UX0JJVFNfTUFTSyAweDdmCisjZGVmaW5lIEZPVVJUSFJPT1RfRlJBQ1RfQklUU19NQVNLIDB4MDA3RkZGRkYKKworTE5LX1NFQ1RJT05fQ09OU1REQVRBCitzdGF0aWMgY29uc3QgRklYUF9EQkwgaW52Rm91cnRoUm9vdFRhYltGT1VSVEhST09UX1ZBTFVFU10gPSB7CisgICAgKDB4NGMxYmY4MjkpLCAoMHg0YmY2MTk3NyksICgweDRiZDA5ODQzKSwgKDB4NGJhYjcyZWYpLCAoMHg0Yjg2YTdlYiksCisgICAgKDB4NGI2MjM1YWMpLCAoMHg0YjNlMWFiNiksICgweDRiMWE1NTkyKSwgKDB4NGFmNmU0ZDQpLCAoMHg0YWQzYzcxOCksCisgICAgKDB4NGFiMGZiMDMpLCAoMHg0YThlN2Y0MiksICgweDRhNmM1Mjg4KSwgKDB4NGE0YTczOTMpLCAoMHg0YTI4ZTEyNiksCisgICAgKDB4NGEwNzlhMGMpLCAoMHg0OWU2OWQxNiksICgweDQ5YzVlOTFmKSwgKDB4NDlhNTdkMDQpLCAoMHg0OTg1NTdhYyksCisgICAgKDB4NDk2NTc4MDIpLCAoMHg0OTQ1ZGNmOSksICgweDQ5MjY4NTg4KSwgKDB4NDkwNzcwYWMpLCAoMHg0OGU4OWQ2YSksCisgICAgKDB4NDhjYTBhYzkpLCAoMHg0OGFiYjdkNiksICgweDQ4OGRhM2E2KSwgKDB4NDg2ZmNkNGYpLCAoMHg0ODUyMzNlZCksCisgICAgKDB4NDgzNGQ2YTMpLCAoMHg0ODE3YjQ5NiksICgweDQ3ZmFjY2YwKSwgKDB4NDdkZTFlZTApLCAoMHg0N2MxYTk5OSksCisgICAgKDB4NDdhNTZjNTEpLCAoMHg0Nzg5NjY0MyksICgweDQ3NmQ5NmFmKSwgKDB4NDc1MWZjZDYpLCAoMHg0NzM2OTdmZiksCisgICAgKDB4NDcxYjY3NzMpLCAoMHg0NzAwNmE4MSksICgweDQ2ZTVhMDc5KSwgKDB4NDZjYjA4YWUpLCAoMHg0NmIwYTI3OSksCisgICAgKDB4NDY5NjZkMzQpLCAoMHg0NjdjNjgzZCksICgweDQ2NjI5MmY0KSwgKDB4NDY0OGVjYmMpLCAoMHg0NjJmNzRmZSksCisgICAgKDB4NDYxNjJiMjApLCAoMHg0NWZkMGU5MSksICgweDQ1ZTQxZWJlKSwgKDB4NDVjYjViMTkpLCAoMHg0NWIyYzMxNSksCisgICAgKDB4NDU5YTU2MmEpLCAoMHg0NTgyMTNjZiksICgweDQ1NjlmYjgxKSwgKDB4NDU1MjBjYmMpLCAoMHg0NTNhNDcwMSksCisgICAgKDB4NDUyMmE5ZDEpLCAoMHg0NTBiMzRiMCksICgweDQ0ZjNlNzI2KSwgKDB4NDRkY2MwYmEpLCAoMHg0NGM1YzBmNyksCisgICAgKDB4NDRhZWU3NjgpLCAoMHg0NDk4MzM5ZSksICgweDQ0ODFhNTI3KSwgKDB4NDQ2YjNiOTYpLCAoMHg0NDU0ZjY3ZSksCisgICAgKDB4NDQzZWQ1NzYpLCAoMHg0NDI4ZDgxNSksICgweDQ0MTJmZGYzKSwgKDB4NDNmZDQ2YWQpLCAoMHg0M2U3YjFkZSksCisgICAgKDB4NDNkMjNmMjMpLCAoMHg0M2JjZWUxZSksICgweDQzYTdiZTZmKSwgKDB4NDM5MmFmYjgpLCAoMHg0MzdkYzE5ZCksCisgICAgKDB4NDM2OGYzYzUpLCAoMHg0MzU0NDVkNiksICgweDQzM2ZiNzc5KSwgKDB4NDMyYjQ4NTYpLCAoMHg0MzE2ZjgxYSksCisgICAgKDB4NDMwMmM2NmYpLCAoMHg0MmVlYjMwNSksICgweDQyZGFiZDhhKSwgKDB4NDJjNmU1YWQpLCAoMHg0MmIzMmIyMSksCisgICAgKDB4NDI5ZjhkOTYpLCAoMHg0MjhjMGNjMiksICgweDQyNzhhODU5KSwgKDB4NDI2NTYwMTApLCAoMHg0MjUyMzM5ZSksCisgICAgKDB4NDIzZjIyYmMpLCAoMHg0MjJjMmQyMyksICgweDQyMTk1MjhiKSwgKDB4NDIwNjkyYjIpLCAoMHg0MWYzZWQ1MSksCisgICAgKDB4NDFlMTYyMjgpLCAoMHg0MWNlZjBmMiksICgweDQxYmM5OTcxKSwgKDB4NDFhYTViNjIpLCAoMHg0MTk4MzY4NyksCisgICAgKDB4NDE4NjJhYTIpLCAoMHg0MTc0Mzc3NSksICgweDQxNjI1Y2MzKSwgKDB4NDE1MDlhNTApLCAoMHg0MTNlZWZlMiksCisgICAgKDB4NDEyZDVkM2UpLCAoMHg0MTFiZTIyYiksICgweDQxMGE3ZTcwKSwgKDB4NDBmOTMxZDUpLCAoMHg0MGU3ZmMyMyksCisgICAgKDB4NDBkNmRkMjQpLCAoMHg0MGM1ZDRhMiksICgweDQwYjRlMjY4KSwgKDB4NDBhNDA2NDIpLCAoMHg0MDkzM2ZmYyksCisgICAgKDB4NDA4MjhmNjQpLCAoMHg0MDcxZjQ0NyksICgweDQwNjE2ZTczKSwgKDB4NDA1MGZkYjkpLCAoMHg0MDQwYTFlNiksCisgICAgKDB4NDAzMDVhY2MpLCAoMHg0MDIwMjgzYyksICgweDQwMTAwYTA4KSwgKDB4NDAwMDAwMDApLCAoMHgzZmYwMDlmOSksCit9OworCitzdGF0aWMgY29uc3QgRklYUF9EQkwgaW52Rm91cnRoUm9vdENvcnJlY3Rpb25bNF0gPSB7MHg0MDAwMDAwMCwgMHg0QzFCRjgyOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVBODI3OTlBLCAweDZCQTI3RTY1fTsKKworLyogVGhlIGZvdXJ0aCByb290IGZ1bmN0aW9uICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZiBjYWxjdWxhdGUgMS4wL2ZvdXJ0aF9yb290KG9wKSwgb3AgY29udGFpbnMgbWFudGlzc2EgYW5kIGV4cG9uZW50CisgKiBccGFyYW0gb3BfbTogKGkpIG1hbnRpc3NhIG9mIG9wZXJhbmQsIG11c3Qgbm90IGJlIHplcm8gKDB4MDAwMC4wMDAwKSBvcgorICogbmVnYXRpdmUKKyAqIFxwYXJhbSBvcF9lOiAoaSkgcG9pbnRlciB0byB0aGUgZXhwb25lbnQgb2YgdGhlIG9wZXJhbmQgKG11c3QgYmUgaW5pdGlhbGl6ZWQpCisgKiBhbmQgLi4gKG8pIHBvaW50ZXIgdG8gdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQKKyAqIFxyZXR1cm46ICAgICAobykgbWFudGlzc2Egb2YgdGhlIHJlc3VsdAorICogXGRlc2NyaXB0aW9uOgorICogIFRoaXMgcm91dGluZSBjYWxjdWxhdGVzIHRoZSBjdWJlIHJvb3Qgb2YgdGhlIGlucHV0IG9wZXJhbmQsIHRoYXQgaXMKKyAqICBnaXZlbiB3aXRoIGl0cyBtYW50aXNzYSBpbiBRMzEgZm9ybWF0IChGSVhQX0RCTCkgYW5kIGl0cyBleHBvbmVudCAoSU5UKS4KKyAqICBUaGUgcmVzdWx0aW5nIG1hbnRpc3NhIGlzIHJldHVybmVkIGluIGZvcm1hdCBRMzEuIFRoZSBleHBvbmVudCAoKm9wX2UpCisgKiAgaXMgbW9kaWZpZWQgYWNjb3JkaW5nbHkuIEl0IGlzIG5vdCBhc3N1cmVkLCB0aGF0IHRoZSByZXN1bHQgaXMgZnVsbHkKKyAqIGxlZnQtYWxpZ25lZCBidXQgYXNzdW1lZCB0byBoYXZlIG5vdCBtb3JlIHRoYW4gMiBiaXRzIGhlYWRyb29tLiBUaGVyZSBpcyBvbmUKKyAqIG1hY3JvIHRvIGFjdGl2YXRlIHRoZSB1c2Ugb2YgdGhpcyBhbGdvcml0aG06IEZVTkNUSU9OX2ludkZvdXJ0aFJvb3ROb3JtMiBCeQorICogbWVhbnMgb2YgYWN0aXZhdGluZyB0aGUgbWFjcm8gSU5WRk9VUlRIUk9PVE5PUk0yX0xJTkVBUl9JTlRFUlBPTEFURV9IUSwgYQorICogc2xpZ2h0bHkgaGlnaGVyIHByZWNpc2lvbiBpcyByZWFjaGFibGUgKGJ5IGRlZmF1bHQsIG5vdCBhY3RpdmUpLiBGb3IgREVCVUcKKyAqIHB1cnBvc2Ugb25seTogYSBGREtfQVNTRVJUIG1hY3JvIHZhbGlkYXRlcywgaWYgdGhlIGlucHV0IG1hbnRpc3NhIGlzIGdyZWF0ZXIKKyAqIHplcm8uCisgKgorICovCisKKy8qICNkZWZpbmUgSU5WRk9VUlRIUk9PVE5PUk0yX0xJTkVBUl9JTlRFUlBPTEFURV9IUSAqLworCitzdGF0aWMKKyNpZmRlZiBfX2FybV9fCisgICAgRklYUF9EQkwgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCisgICAgaW52Rm91cnRoUm9vdE5vcm0yKEZJWFBfREJMIG9wX20sIElOVCogb3BfZSkKKyNlbHNlCisgICAgRklYUF9EQkwKKyAgICBpbnZGb3VydGhSb290Tm9ybTIoRklYUF9EQkwgb3BfbSwgSU5UKiBvcF9lKQorI2VuZGlmCit7CisgIEZES19BU1NFUlQob3BfbSA+IEZMMkZYQ09OU1RfREJMKDAuMCkpOworCisgIC8qIG5vcm1hbGl6ZSBpbnB1dCwgY2FsY3VsYXRlIHNoaWZ0IHZhbHVlICovCisgIElOVCBleHBvbmVudCA9IChJTlQpZk5vcm16KG9wX20pIC0gMTsKKyAgb3BfbSA8PD0gZXhwb25lbnQ7CisKKyAgSU5UIGluZGV4ID0gKElOVCkob3BfbSA+PiAoREZSQUNUX0JJVFMgLSAxIC0gKEZPVVJUSFJPT1RfQklUUyArIDEpKSkgJgorICAgICAgICAgICAgICBGT1VSVEhST09UX0JJVFNfTUFTSzsKKyAgRklYUF9EQkwgZnJhY3QgPSAoRklYUF9EQkwpKCgoSU5UKW9wX20gJiBGT1VSVEhST09UX0ZSQUNUX0JJVFNfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChGT1VSVEhST09UX0JJVFMgKyAxKSk7CisgIEZJWFBfREJMIGRpZmYgPSBpbnZGb3VydGhSb290VGFiW2luZGV4ICsgMV0gLSBpbnZGb3VydGhSb290VGFiW2luZGV4XTsKKyAgb3BfbSA9IGludkZvdXJ0aFJvb3RUYWJbaW5kZXhdICsgKGZNdWx0RGl2MihkaWZmLCBmcmFjdCkgPDwgMSk7CisKKyNpZiBkZWZpbmVkKElOVkZPVVJUSFJPT1ROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEpCisgIC8qIHJlZzEgPSB0W2ldICsgKHRbaSsxXS10W2ldKSpmcmFjdCAuLi4gYWxyZWFkeSBjb21wdXRlZCAuLi4gKworICAgKiAoMS1mcmFjdClmcmFjdCoodFtpKzJdLXRbaSsxXSkvMiAqLworICBpZiAoZnJhY3QgIT0gKEZJWFBfREJMKTApIHsKKyAgICAvKiBmcmFjdCA9IGZyYWN0ICogKDEgLSBmcmFjdCkgKi8KKyAgICBmcmFjdCA9IGZNdWx0RGl2MihmcmFjdCwgKEZJWFBfREJMKSgoTE9ORykweDgwMDAwMDAwIC0gKExPTkcpZnJhY3QpKSA8PCAxOworICAgIGRpZmYgPSBkaWZmIC0gKGludkZvdXJ0aFJvb3RUYWJbaW5kZXggKyAyXSAtIGludkZvdXJ0aFJvb3RUYWJbaW5kZXggKyAxXSk7CisgICAgb3BfbSA9IGZNdWx0QWRkRGl2MihvcF9tLCBmcmFjdCwgZGlmZik7CisgIH0KKyNlbmRpZiAvKiBJTlZGT1VSVEhST09UTk9STTJfTElORUFSX0lOVEVSUE9MQVRFX0hRICovCisKKyAgZXhwb25lbnQgPSBleHBvbmVudCAtICpvcF9lICsgNDsKKyAgSU5UIHJlbSA9IGV4cG9uZW50ICYgMHgwMDAwMDAwMzsKKyAgSU5UIHNoaWZ0X3RtcCA9IChleHBvbmVudCA+PiAyKTsKKworICAqb3BfZSA9IHNoaWZ0X3RtcDsKKyAgb3BfbSA9IGZNdWx0RGl2MihvcF9tLCBpbnZGb3VydGhSb290Q29ycmVjdGlvbltyZW1dKSA8PCAyOworCisgIHJldHVybiAob3BfbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZnVuY3Rpb25uYW1lOiBpbnYzRWlndGhSb290Tm9ybTIKKyAgICBkZXNjcmlwdGlvbjogIGRlbGl2ZXJzIDEvY3ViZXJ0KG9wKSBub3JtYWxpemVkIHRvIC41Li4uMSBhbmQgdGhlIHNoaWZ0IHZhbHVlCitvZiB0aGUgT1VUUFVUCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUSFJFRUlHVEhST09UX0JJVFMgNworI2RlZmluZSBUSFJFRUlHVEhST09UX1ZBTFVFUyAoMTI4ICsgMikKKyNkZWZpbmUgVEhSRUVJR1RIUk9PVF9CSVRTX01BU0sgMHg3ZgorI2RlZmluZSBUSFJFRUlHVEhST09UX0ZSQUNUX0JJVFNfTUFTSyAweDAwN0ZGRkZGCisKK0xOS19TRUNUSU9OX0NPTlNUREFUQQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGludjNFaWd0aFJvb3RUYWJbVEhSRUVJR1RIUk9PVF9WQUxVRVNdID0geworICAgICgweDQ1Y2FlMGYyKSwgKDB4NDViOTgxYmYpLCAoMHg0NWE4NDkyYSksICgweDQ1OTczNjkxKSwgKDB4NDU4NjQ5NTkpLAorICAgICgweDQ1NzU4MGU2KSwgKDB4NDU2NGRjYTQpLCAoMHg0NTU0NWMwMCksICgweDQ1NDNmZTZiKSwgKDB4NDUzM2MzNWEpLAorICAgICgweDQ1MjNhYTQ0KSwgKDB4NDUxM2IyYTQpLCAoMHg0NTAzZGJmNyksICgweDQ0ZjQyNWJlKSwgKDB4NDRlNDhmN2IpLAorICAgICgweDQ0ZDUxOGI2KSwgKDB4NDRjNWMwZjcpLCAoMHg0NGI2ODdjOCksICgweDQ0YTc2Y2I4KSwgKDB4NDQ5ODZmNTgpLAorICAgICgweDQ0ODk4ZjM4KSwgKDB4NDQ3YWNiZWYpLCAoMHg0NDZjMjUxNCksICgweDQ0NWQ5YTNmKSwgKDB4NDQ0ZjJiMGQpLAorICAgICgweDQ0NDBkNzFhKSwgKDB4NDQzMjllMDcpLCAoMHg0NDI0N2Y3MyksICgweDQ0MTY3YjA0KSwgKDB4NDQwODkwNWUpLAorICAgICgweDQzZmFiZjI4KSwgKDB4NDNlZDA3MGIpLCAoMHg0M2RmNjdiMCksICgweDQzZDFlMGM1KSwgKDB4NDNjNDcxZjcpLAorICAgICgweDQzYjcxYWY2KSwgKDB4NDNhOWRiNzEpLCAoMHg0MzljYjMxYyksICgweDQzOGZhMWFiKSwgKDB4NDM4MmE2ZDIpLAorICAgICgweDQzNzVjMjQ4KSwgKDB4NDM2OGYzYzUpLCAoMHg0MzVjM2IwMyksICgweDQzNGY5N2JjKSwgKDB4NDM0MzA5YWMpLAorICAgICgweDQzMzY5MDkxKSwgKDB4NDMyYTJjMjgpLCAoMHg0MzFkZGMzMCksICgweDQzMTFhMDZjKSwgKDB4NDMwNTc4OWMpLAorICAgICgweDQyZjk2NDgzKSwgKDB4NDJlZDYzZTUpLCAoMHg0MmUxNzY4OCksICgweDQyZDU5YzMwKSwgKDB4NDJjOWQ0YTYpLAorICAgICgweDQyYmUxZmIxKSwgKDB4NDJiMjdkMWEpLCAoMHg0MmE2ZWNhYyksICgweDQyOWI2ZTJmKSwgKDB4NDI5MDAxNzIpLAorICAgICgweDQyODRhNjNmKSwgKDB4NDI3OTVjNjQpLCAoMHg0MjZlMjNiMCksICgweDQyNjJmYmYyKSwgKDB4NDI1N2U0ZjkpLAorICAgICgweDQyNGNkZTk2KSwgKDB4NDI0MWU4OWEpLCAoMHg0MjM3MDJkOCksICgweDQyMmMyZDIzKSwgKDB4NDIyMTY3NGQpLAorICAgICgweDQyMTZiMTJjKSwgKDB4NDIwYzBhOTQpLCAoMHg0MjAxNzM1YiksICgweDQxZjZlYjU3KSwgKDB4NDFlYzcyNWYpLAorICAgICgweDQxZTIwODRiKSwgKDB4NDFkN2FjZjMpLCAoMHg0MWNkNjAzMCksICgweDQxYzMyMWRiKSwgKDB4NDFiOGYxY2UpLAorICAgICgweDQxYWVjZmU1KSwgKDB4NDFhNGJiZjgpLCAoMHg0MTlhYjVlNiksICgweDQxOTBiZDg5KSwgKDB4NDE4NmQyYmYpLAorICAgICgweDQxN2NmNTY1KSwgKDB4NDE3MzI1NTgpLCAoMHg0MTY5NjI3NyksICgweDQxNWZhY2ExKSwgKDB4NDE1NjAzYjQpLAorICAgICgweDQxNGM2NzkyKSwgKDB4NDE0MmQ4MTgpLCAoMHg0MTM5NTUyYSksICgweDQxMmZkZWE2KSwgKDB4NDEyNjc0NzApLAorICAgICgweDQxMWQxNjY4KSwgKDB4NDExM2M0NzIpLCAoMHg0MTBhN2U3MCksICgweDQxMDE0NDQ1KSwgKDB4NDBmODE1ZDQpLAorICAgICgweDQwZWVmMzAyKSwgKDB4NDBlNWRiYjQpLCAoMHg0MGRjY2ZjZCksICgweDQwZDNjZjMzKSwgKDB4NDBjYWQ5Y2IpLAorICAgICgweDQwYzFlZjdiKSwgKDB4NDBiOTEwMmEpLCAoMHg0MGIwM2JiZCksICgweDQwYTc3MjFjKSwgKDB4NDA5ZWIzMmUpLAorICAgICgweDQwOTVmZWRhKSwgKDB4NDA4ZDU1MDgpLCAoMHg0MDg0YjVhMCksICgweDQwN2MyMDhiKSwgKDB4NDA3Mzk1YjIpLAorICAgICgweDQwNmIxNGZkKSwgKDB4NDA2MjllNTYpLCAoMHg0MDVhMzFhNiksICgweDQwNTFjZWQ4KSwgKDB4NDA0OTc1ZDUpLAorICAgICgweDQwNDEyNjg5KSwgKDB4NDAzOGUwZGQpLCAoMHg0MDMwYTRiZCksICgweDQwMjg3MjE1KSwgKDB4NDAyMDQ4Y2YpLAorICAgICgweDQwMTgyOGQ3KSwgKDB4NDAxMDEyMWEpLCAoMHg0MDA4MDQ4MyksICgweDQwMDAwMDAwKSwgKDB4M2ZmODA0N2QpLAorfTsKKworLyogVGhlIGxhc3QgdmFsdWUgaXMgcm91bmRlZCBpbiBvcmRlciB0byBhdm9pZCBhbnkgb3ZlcmZsb3cgZHVlIHRvIHRoZSB2YWx1ZXMKKyAqIHJhbmdlIG9mIHRoZSByb290IHRhYmxlICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgaW52M0VpZ3RoUm9vdENvcnJlY3Rpb25bOF0gPSB7CisgICAgMHg0MDAwMDAwMCwgMHg0NUNBRTBGMiwgMHg0QzFCRjgyOSwgMHg1MkZGNkI1NSwKKyAgICAweDVBODI3OTlBLCAweDYyQjM5NTA5LCAweDZCQTI3RTY1LCAweDc1NjA2MzczfTsKKworLyogVGhlIDMvOCByb290IGZ1bmN0aW9uICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZiBjYWxjdWxhdGUgMS4wLzNFaWd0aF9yb290KG9wKSA9IDEuMC8oeCleKDMvOCksIG9wIGNvbnRhaW5zIG1hbnRpc3NhCisgKiBhbmQgZXhwb25lbnQKKyAqIFxwYXJhbSBvcF9tOiAoaSkgbWFudGlzc2Egb2Ygb3BlcmFuZCwgbXVzdCBub3QgYmUgemVybyAoMHgwMDAwLjAwMDApIG9yCisgKiBuZWdhdGl2ZQorICogXHBhcmFtIG9wX2U6IChpKSBwb2ludGVyIHRvIHRoZSBleHBvbmVudCBvZiB0aGUgb3BlcmFuZCAobXVzdCBiZSBpbml0aWFsaXplZCkKKyAqIGFuZCAuLiAobykgcG9pbnRlciB0byB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdAorICogXHJldHVybjogICAgIChvKSBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKiBcZGVzY3JpcHRpb246CisgKiAgVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIGN1YmUgcm9vdCBvZiB0aGUgaW5wdXQgb3BlcmFuZCwgdGhhdCBpcworICogIGdpdmVuIHdpdGggaXRzIG1hbnRpc3NhIGluIFEzMSBmb3JtYXQgKEZJWFBfREJMKSBhbmQgaXRzIGV4cG9uZW50IChJTlQpLgorICogIFRoZSByZXN1bHRpbmcgbWFudGlzc2EgaXMgcmV0dXJuZWQgaW4gZm9ybWF0IFEzMS4gVGhlIGV4cG9uZW50ICgqb3BfZSkKKyAqICBpcyBtb2RpZmllZCBhY2NvcmRpbmdseS4gSXQgaXMgbm90IGFzc3VyZWQsIHRoYXQgdGhlIHJlc3VsdCBpcyBmdWxseQorICogbGVmdC1hbGlnbmVkIGJ1dCBhc3N1bWVkIHRvIGhhdmUgbm90IG1vcmUgdGhhbiAyIGJpdHMgaGVhZHJvb20uIFRoZXJlIGlzIG9uZQorICogbWFjcm8gdG8gYWN0aXZhdGUgdGhlIHVzZSBvZiB0aGlzIGFsZ29yaXRobTogRlVOQ1RJT05faW52M0VpZ3RoUm9vdE5vcm0yIEJ5CisgKiBtZWFucyBvZiBhY3RpdmF0aW5nIHRoZSBtYWNybyBJTlZUSFJFRUlHVEhST09UTk9STTJfTElORUFSX0lOVEVSUE9MQVRFX0hRLCBhCisgKiBzbGlnaHRseSBoaWdoZXIgcHJlY2lzaW9uIGlzIHJlYWNoYWJsZSAoYnkgZGVmYXVsdCwgbm90IGFjdGl2ZSkuIEZvciBERUJVRworICogcHVycG9zZSBvbmx5OiBhIEZES19BU1NFUlQgbWFjcm8gdmFsaWRhdGVzLCBpZiB0aGUgaW5wdXQgbWFudGlzc2EgaXMgZ3JlYXRlcgorICogemVyby4KKyAqCisgKi8KKworLyogI2RlZmluZSBJTlZUSFJFRUlHVEhST09UTk9STTJfTElORUFSX0lOVEVSUE9MQVRFX0hRICovCisKK3N0YXRpYworI2lmZGVmIF9fYXJtX18KKyAgICBGSVhQX0RCTCBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyAgICBpbnYzRWlndGhSb290Tm9ybTIoRklYUF9EQkwgb3BfbSwgSU5UKiBvcF9lKQorI2Vsc2UKKyAgICBGSVhQX0RCTAorICAgIGludjNFaWd0aFJvb3ROb3JtMihGSVhQX0RCTCBvcF9tLCBJTlQqIG9wX2UpCisjZW5kaWYKK3sKKyAgRkRLX0FTU0VSVChvcF9tID4gRkwyRlhDT05TVF9EQkwoMC4wKSk7CisKKyAgLyogbm9ybWFsaXplIGlucHV0LCBjYWxjdWxhdGUgc2hpZnQgb3BfbXVlICovCisgIElOVCBleHBvbmVudCA9IChJTlQpZk5vcm16KG9wX20pIC0gMTsKKyAgb3BfbSA8PD0gZXhwb25lbnQ7CisKKyAgSU5UIGluZGV4ID0gKElOVCkob3BfbSA+PiAoREZSQUNUX0JJVFMgLSAxIC0gKFRIUkVFSUdUSFJPT1RfQklUUyArIDEpKSkgJgorICAgICAgICAgICAgICBUSFJFRUlHVEhST09UX0JJVFNfTUFTSzsKKyAgRklYUF9EQkwgZnJhY3QgPSAoRklYUF9EQkwpKCgoSU5UKW9wX20gJiBUSFJFRUlHVEhST09UX0ZSQUNUX0JJVFNfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChUSFJFRUlHVEhST09UX0JJVFMgKyAxKSk7CisgIEZJWFBfREJMIGRpZmYgPSBpbnYzRWlndGhSb290VGFiW2luZGV4ICsgMV0gLSBpbnYzRWlndGhSb290VGFiW2luZGV4XTsKKyAgb3BfbSA9IGludjNFaWd0aFJvb3RUYWJbaW5kZXhdICsgKGZNdWx0RGl2MihkaWZmLCBmcmFjdCkgPDwgMSk7CisKKyNpZiBkZWZpbmVkKElOVlRIUkVFSUdUSFJPT1ROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEpCisgIC8qIG9wX20gPSB0W2ldICsgKHRbaSsxXS10W2ldKSpmcmFjdCAuLi4gYWxyZWFkeSBjb21wdXRlZCAuLi4gKworICAgKiAoMS1mcmFjdClmcmFjdCoodFtpKzJdLXRbaSsxXSkvMiAqLworICBpZiAoZnJhY3QgIT0gKEZJWFBfREJMKTApIHsKKyAgICAvKiBmcmFjdCA9IGZyYWN0ICogKDEgLSBmcmFjdCkgKi8KKyAgICBmcmFjdCA9IGZNdWx0RGl2MihmcmFjdCwgKEZJWFBfREJMKSgoTE9ORykweDgwMDAwMDAwIC0gKExPTkcpZnJhY3QpKSA8PCAxOworICAgIGRpZmYgPSBkaWZmIC0gKGludjNFaWd0aFJvb3RUYWJbaW5kZXggKyAyXSAtIGludjNFaWd0aFJvb3RUYWJbaW5kZXggKyAxXSk7CisgICAgb3BfbSA9IGZNdWx0QWRkRGl2MihvcF9tLCBmcmFjdCwgZGlmZik7CisgIH0KKyNlbmRpZiAvKiBJTlZUSFJFRUlHVEhST09UTk9STTJfTElORUFSX0lOVEVSUE9MQVRFX0hRICovCisKKyAgZXhwb25lbnQgPSBleHBvbmVudCAtICpvcF9lICsgODsKKyAgSU5UIHJlbSA9IGV4cG9uZW50ICYgMHgwMDAwMDAwNzsKKyAgSU5UIHNoaWZ0X3RtcCA9IChleHBvbmVudCA+PiAzKTsKKworICAqb3BfZSA9IHNoaWZ0X3RtcCAqIDM7CisgIG9wX20gPSBmTXVsdERpdjIob3BfbSwgaW52M0VpZ3RoUm9vdENvcnJlY3Rpb25bcmVtXSkgPDwgMjsKKworICByZXR1cm4gKGZNdWx0KG9wX20sIGZNdWx0KG9wX20sIG9wX20pKSk7Cit9CisKK1NCUl9FUlJPUgorUW1mVHJhbnNwb3NlckNyZWF0ZShIQU5ETEVfSEJFX1RSQU5TUE9TRVIqIGhRbWZUcmFuc3Bvc2VyLCBjb25zdCBpbnQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICBpbnQgYkRpc2FibGVDcm9zc1Byb2R1Y3RzLCBpbnQgYlNicjQxKSB7CisgIEhBTkRMRV9IQkVfVFJBTlNQT1NFUiBoUW1mVHJhbiA9IE5VTEw7CisKKyAgaW50IGk7CisKKyAgaWYgKGhRbWZUcmFuc3Bvc2VyICE9IE5VTEwpIHsKKyAgICAvKiBNZW1vcnkgYWxsb2NhdGlvbiAqLworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGhRbWZUcmFuID0KKyAgICAgICAgKEhBTkRMRV9IQkVfVFJBTlNQT1NFUilGREtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBoYmVUcmFuc3Bvc2VyKSk7CisgICAgaWYgKGhRbWZUcmFuID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1NUUkVUQ0hfSEJFIC0gMTsgaSsrKSB7CisgICAgICBoUW1mVHJhbi0+YlhQcm9kdWN0c1tpXSA9IChiRGlzYWJsZUNyb3NzUHJvZHVjdHMgPyAwIDogeFByb2R1Y3RzW2ldKTsKKyAgICB9CisKKyAgICBoUW1mVHJhbi0+dGltZURvbWFpbldpbkxlbiA9IGZyYW1lU2l6ZTsKKyAgICBpZiAoZnJhbWVTaXplID09IDc2OCkgeworICAgICAgaFFtZlRyYW4tPm5vQ29scyA9CisgICAgICAgICAgKDggKiBmcmFtZVNpemUgLyAzKSAvIFFNRl9TWU5USF9DSEFOTkVMUzsgLyogMzIgZm9yIDI0OjY0ICovCisgICAgfSBlbHNlIHsKKyAgICAgIGhRbWZUcmFuLT5ub0NvbHMgPQorICAgICAgICAgIChiU2JyNDEgKyAxKSAqIDIgKiBmcmFtZVNpemUgLworICAgICAgICAgIFFNRl9TWU5USF9DSEFOTkVMUzsgLyogMzIgZm9yIDMyOjY0IGFuZCA2NCBmb3IgMTY6NjQgLT4gaWRlbnRpY2FsIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJkZWMtPm5vX2NvbHMgKi8KKyAgICB9CisKKyAgICBoUW1mVHJhbi0+bm9DaGFubmVscyA9IGZyYW1lU2l6ZSAvIGhRbWZUcmFuLT5ub0NvbHM7CisKKyAgICBoUW1mVHJhbi0+cW1mSW5CdWZTaXplID0gUU1GX1dJTl9MRU47CisgICAgaFFtZlRyYW4tPnFtZk91dEJ1ZlNpemUgPSAyICogKGhRbWZUcmFuLT5ub0NvbHMgLyAyICsgUU1GX1dJTl9MRU4gLSAxKTsKKworICAgIGhRbWZUcmFuLT5pbkJ1Zl9GID0KKyAgICAgICAgKElOVF9QQ00qKUZES2NhbGxvYyhRTUZfU1lOVEhfQ0hBTk5FTFMgKyAyMCArIDEsIHNpemVvZihJTlRfUENNKSk7CisgICAgLyogYnVmZmVyZWQgdGltZSBzaWduYWwgbmVlZHMgdG8gYmUgZGVsYXllZCBieSBzeW50aGVzaXNfc2l6ZTsgbWF4CisgICAgICogc3ludGhlc2lzX3NpemUgPSAyMDsgKi8KKyAgICBpZiAoaFFtZlRyYW4tPmluQnVmX0YgPT0gTlVMTCkgeworICAgICAgUW1mVHJhbnNwb3NlckNsb3NlKGhRbWZUcmFuKTsKKyAgICAgIHJldHVybiBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICB9CisKKyAgICBoUW1mVHJhbi0+cW1mSW5CdWZSZWFsX0YgPQorICAgICAgICAoRklYUF9EQkwqKilGREtjYWxsb2MoaFFtZlRyYW4tPnFtZkluQnVmU2l6ZSwgc2l6ZW9mKEZJWFBfREJMKikpOworICAgIGhRbWZUcmFuLT5xbWZJbkJ1ZkltYWdfRiA9CisgICAgICAgIChGSVhQX0RCTCoqKUZES2NhbGxvYyhoUW1mVHJhbi0+cW1mSW5CdWZTaXplLCBzaXplb2YoRklYUF9EQkwqKSk7CisKKyAgICBpZiAoaFFtZlRyYW4tPnFtZkluQnVmUmVhbF9GID09IE5VTEwpIHsKKyAgICAgIFFtZlRyYW5zcG9zZXJDbG9zZShoUW1mVHJhbik7CisgICAgICByZXR1cm4gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CisgICAgfQorICAgIGlmIChoUW1mVHJhbi0+cW1mSW5CdWZJbWFnX0YgPT0gTlVMTCkgeworICAgICAgUW1mVHJhbnNwb3NlckNsb3NlKGhRbWZUcmFuKTsKKyAgICAgIHJldHVybiBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaFFtZlRyYW4tPnFtZkluQnVmU2l6ZTsgaSsrKSB7CisgICAgICBoUW1mVHJhbi0+cW1mSW5CdWZSZWFsX0ZbaV0gPSAoRklYUF9EQkwqKUZES2FhbGxvYygKKyAgICAgICAgICBRTUZfU1lOVEhfQ0hBTk5FTFMgKiBzaXplb2YoRklYUF9EQkwpLCBBTElHTk1FTlRfREVGQVVMVCk7CisgICAgICBoUW1mVHJhbi0+cW1mSW5CdWZJbWFnX0ZbaV0gPSAoRklYUF9EQkwqKUZES2FhbGxvYygKKyAgICAgICAgICBRTUZfU1lOVEhfQ0hBTk5FTFMgKiBzaXplb2YoRklYUF9EQkwpLCBBTElHTk1FTlRfREVGQVVMVCk7CisgICAgICBpZiAoaFFtZlRyYW4tPnFtZkluQnVmUmVhbF9GW2ldID09IE5VTEwpIHsKKyAgICAgICAgUW1mVHJhbnNwb3NlckNsb3NlKGhRbWZUcmFuKTsKKyAgICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgICAgfQorICAgICAgaWYgKGhRbWZUcmFuLT5xbWZJbkJ1ZkltYWdfRltpXSA9PSBOVUxMKSB7CisgICAgICAgIFFtZlRyYW5zcG9zZXJDbG9zZShoUW1mVHJhbik7CisgICAgICAgIHJldHVybiBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBoUW1mVHJhbi0+cW1mSEJFQnVmUmVhbF9GID0KKyAgICAgICAgKEZJWFBfREJMKiopRkRLY2FsbG9jKEhCRV9NQVhfT1VUX1NMT1RTLCBzaXplb2YoRklYUF9EQkwqKSk7CisgICAgaFFtZlRyYW4tPnFtZkhCRUJ1ZkltYWdfRiA9CisgICAgICAgIChGSVhQX0RCTCoqKUZES2NhbGxvYyhIQkVfTUFYX09VVF9TTE9UUywgc2l6ZW9mKEZJWFBfREJMKikpOworCisgICAgaWYgKGhRbWZUcmFuLT5xbWZIQkVCdWZSZWFsX0YgPT0gTlVMTCkgeworICAgICAgUW1mVHJhbnNwb3NlckNsb3NlKGhRbWZUcmFuKTsKKyAgICAgIHJldHVybiBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICB9CisgICAgaWYgKGhRbWZUcmFuLT5xbWZIQkVCdWZJbWFnX0YgPT0gTlVMTCkgeworICAgICAgUW1mVHJhbnNwb3NlckNsb3NlKGhRbWZUcmFuKTsKKyAgICAgIHJldHVybiBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSEJFX01BWF9PVVRfU0xPVFM7IGkrKykgeworICAgICAgaFFtZlRyYW4tPnFtZkhCRUJ1ZlJlYWxfRltpXSA9CisgICAgICAgICAgKEZJWFBfREJMKilGREtjYWxsb2MoUU1GX1NZTlRIX0NIQU5ORUxTLCBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIGhRbWZUcmFuLT5xbWZIQkVCdWZJbWFnX0ZbaV0gPQorICAgICAgICAgIChGSVhQX0RCTCopRkRLY2FsbG9jKFFNRl9TWU5USF9DSEFOTkVMUywgc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBpZiAoaFFtZlRyYW4tPnFtZkhCRUJ1ZlJlYWxfRltpXSA9PSBOVUxMKSB7CisgICAgICAgIFFtZlRyYW5zcG9zZXJDbG9zZShoUW1mVHJhbik7CisgICAgICAgIHJldHVybiBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICAgIH0KKyAgICAgIGlmIChoUW1mVHJhbi0+cW1mSEJFQnVmSW1hZ19GW2ldID09IE5VTEwpIHsKKyAgICAgICAgUW1mVHJhbnNwb3NlckNsb3NlKGhRbWZUcmFuKTsKKyAgICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgICAgfQorICAgIH0KKworICAgIGhRbWZUcmFuLT5xbWZCdWZmZXJDb2RlY1RlbXBTbG90X0YgPQorICAgICAgICAoRklYUF9EQkwqKUZES2NhbGxvYyhRTUZfU1lOVEhfQ0hBTk5FTFMgLyAyLCBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBpZiAoaFFtZlRyYW4tPnFtZkJ1ZmZlckNvZGVjVGVtcFNsb3RfRiA9PSBOVUxMKSB7CisgICAgICBRbWZUcmFuc3Bvc2VyQ2xvc2UoaFFtZlRyYW4pOworICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKworICAgIGhRbWZUcmFuLT5iU2JyNDEgPSBiU2JyNDE7CisKKyAgICBoUW1mVHJhbi0+aGlnaGJhbmRfZXhwWzBdID0gMDsKKyAgICBoUW1mVHJhbi0+aGlnaGJhbmRfZXhwWzFdID0gMDsKKyAgICBoUW1mVHJhbi0+dGFyZ2V0X2V4cFswXSA9IDA7CisgICAgaFFtZlRyYW4tPnRhcmdldF9leHBbMV0gPSAwOworCisgICAgKmhRbWZUcmFuc3Bvc2VyID0gaFFtZlRyYW47CisgIH0KKworICByZXR1cm4gU0JSREVDX09LOworfQorCitTQlJfRVJST1IgUW1mVHJhbnNwb3NlclJlSW5pdChIQU5ETEVfSEJFX1RSQU5TUE9TRVIgaFFtZlRyYW5zcG9zZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiogRnJlcUJhbmRUYWJsZVsyXSwgVUNIQVIgTlNmYlsyXSkKKy8qIHJlbW92ZWQgYlNicjQxIGZyb20gcGFyYW1ldGVybGlzdDoKKyAgIGRvbid0IGtub3cgd2hlcmUgdG8gZ2V0IHRoaXMgdmFsdWUgZnJvbQorICAgYXQgY2FsbC1zaWRlICovCit7CisgIGludCBMLCBzZmIsIHBhdGNoLCBzdG9wUGF0Y2gsIHFtZkVycjsKKworICBpZiAoaFFtZlRyYW5zcG9zZXIgIT0gTlVMTCkgeworICAgIGNvbnN0IEZJWFBfUVRXKiB0bXBfdF9jb3M7CisgICAgY29uc3QgRklYUF9RVFcqIHRtcF90X3NpbjsKKworICAgIGhRbWZUcmFuc3Bvc2VyLT5zdGFydEJhbmQgPSBGcmVxQmFuZFRhYmxlWzBdWzBdOworICAgIGhRbWZUcmFuc3Bvc2VyLT5zdG9wQmFuZCA9IEZyZXFCYW5kVGFibGVbMF1bTlNmYlswXV07CisKKyAgICBoUW1mVHJhbnNwb3Nlci0+c3ludGhTaXplID0KKyAgICAgICAgNCAqICgoaFFtZlRyYW5zcG9zZXItPnN0YXJ0QmFuZCArIDQpIC8gOCArIDEpOyAvKiA4LCAxMiwgMTYsIDIwICovCisgICAgaFFtZlRyYW5zcG9zZXItPmtzdGFydCA9IHN0YXJ0U3ViYmFuZDJrTFtoUW1mVHJhbnNwb3Nlci0+c3RhcnRCYW5kXTsKKworICAgIC8qIGRvbid0IGtub3cgd2hlcmUgdG8gdGFrZSB0aGlzIGluZm9ybWF0aW9uIGZyb20gKi8KKyAgICAvKiBoUW1mVHJhbnNwb3Nlci0+YlNicjQxID0gYlNicjQxOyAgICAgICAgICAgICAgICovCisKKyAgICBpZiAoaFFtZlRyYW5zcG9zZXItPmJTYnI0MSkgeworICAgICAgaWYgKGhRbWZUcmFuc3Bvc2VyLT5rc3RhcnQgKyBoUW1mVHJhbnNwb3Nlci0+c3ludGhTaXplID4gMTYpCisgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5rc3RhcnQgPSAxNiAtIGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemU7CisgICAgfSBlbHNlIGlmIChoUW1mVHJhbnNwb3Nlci0+dGltZURvbWFpbldpbkxlbiA9PSA3NjgpIHsKKyAgICAgIGlmIChoUW1mVHJhbnNwb3Nlci0+a3N0YXJ0ICsgaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZSA+IDI0KQorICAgICAgICBoUW1mVHJhbnNwb3Nlci0+a3N0YXJ0ID0gMjQgLSBoUW1mVHJhbnNwb3Nlci0+c3ludGhTaXplOworICAgIH0KKworICAgIGhRbWZUcmFuc3Bvc2VyLT5zeW50aGVzaXNRbWZQcmVNb2RDb3NfRiA9CisgICAgICAgICZwcmVNb2RDb3NbaFFtZlRyYW5zcG9zZXItPmtzdGFydF07CisgICAgaFFtZlRyYW5zcG9zZXItPnN5bnRoZXNpc1FtZlByZU1vZFNpbl9GID0KKyAgICAgICAgJnByZU1vZFNpbltoUW1mVHJhbnNwb3Nlci0+a3N0YXJ0XTsKKworICAgIEwgPSAyICogaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZTsgLyogOCwgMTYsIDI0LCAzMiwgNDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoYW5nZSBhbmFseXNpcyBwb3N0IHR3aWRkbGVzICovCisKKyAgICBzd2l0Y2ggKEwpIHsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgdG1wX3RfY29zID0gcG9zdF90d2lkZGxlX2Nvc184OworICAgICAgICB0bXBfdF9zaW4gPSBwb3N0X3R3aWRkbGVfc2luXzg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNjoKKyAgICAgICAgdG1wX3RfY29zID0gcG9zdF90d2lkZGxlX2Nvc18xNjsKKyAgICAgICAgdG1wX3Rfc2luID0gcG9zdF90d2lkZGxlX3Npbl8xNjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI0OgorICAgICAgICB0bXBfdF9jb3MgPSBwb3N0X3R3aWRkbGVfY29zXzI0OworICAgICAgICB0bXBfdF9zaW4gPSBwb3N0X3R3aWRkbGVfc2luXzI0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzI6CisgICAgICAgIHRtcF90X2NvcyA9IHBvc3RfdHdpZGRsZV9jb3NfMzI7CisgICAgICAgIHRtcF90X3NpbiA9IHBvc3RfdHdpZGRsZV9zaW5fMzI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0MDoKKyAgICAgICAgdG1wX3RfY29zID0gcG9zdF90d2lkZGxlX2Nvc180MDsKKyAgICAgICAgdG1wX3Rfc2luID0gcG9zdF90d2lkZGxlX3Npbl80MDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICB9CisKKyAgICBxbWZFcnIgPSBxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuaygKKyAgICAgICAgJmhRbWZUcmFuc3Bvc2VyLT5IQkVTeW50aGVzaXNRTUYsIGhRbWZUcmFuc3Bvc2VyLT5zeW5RbWZTdGF0ZXMsCisgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5ub0NvbHMsIDAsIGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemUsCisgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemUsIDEpOworICAgIGlmIChxbWZFcnIgIT0gMCkgeworICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgICAgfQorCisgICAgcW1mRXJyID0gcW1mSW5pdEFuYWx5c2lzRmlsdGVyQmFuaygKKyAgICAgICAgJmhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYsIGhRbWZUcmFuc3Bvc2VyLT5hbmFRbWZTdGF0ZXMsCisgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5ub0NvbHMgLyAyLCAwLCAyICogaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZSwKKyAgICAgICAgMiAqIGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemUsIDApOworCisgICAgaWYgKHFtZkVyciAhPSAwKSB7CisgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICB9CisKKyAgICBoUW1mVHJhbnNwb3Nlci0+SEJFQW5hbHlzaXNjUU1GLnRfY29zID0gdG1wX3RfY29zOworICAgIGhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYudF9zaW4gPSB0bXBfdF9zaW47CisKKyAgICBGREttZW1zZXQoaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mLCAwLAorICAgICAgICAgICAgICBNQVhfTlVNX1BBVENIRVMgKiBzaXplb2YoaW50KSk7IC8qIGdsb2JhbCAqLworICAgIHNmYiA9IDA7CisgICAgaWYgKGhRbWZUcmFuc3Bvc2VyLT5iU2JyNDEpIHsKKyAgICAgIHN0b3BQYXRjaCA9IE1BWF9OVU1fUEFUQ0hFUzsKKyAgICAgIGhRbWZUcmFuc3Bvc2VyLT5tYXhTdHJldGNoID0gTUFYX1NUUkVUQ0hfSEJFOworICAgIH0gZWxzZSB7CisgICAgICBzdG9wUGF0Y2ggPSBNQVhfU1RSRVRDSF9IQkU7CisgICAgfQorCisgICAgZm9yIChwYXRjaCA9IDE7IHBhdGNoIDw9IHN0b3BQYXRjaDsgcGF0Y2grKykgeworICAgICAgd2hpbGUgKHNmYiA8PSBOU2ZiWzBdICYmCisgICAgICAgICAgICAgRnJlcUJhbmRUYWJsZVswXVtzZmJdIDw9IHBhdGNoICogaFFtZlRyYW5zcG9zZXItPnN0YXJ0QmFuZCkKKyAgICAgICAgc2ZiKys7CisgICAgICBpZiAoc2ZiIDw9IE5TZmJbMF0pIHsKKyAgICAgICAgLyogSWYgdGhlIGRpc3RhbmNlIGlzIGxhcmdlciB0aGFuIHRocmVlIFFNRiBiYW5kcyAtIHRyeSBhbGlnbmluZyB0byBoaWdoCisgICAgICAgICAqIHJlc29sdXRpb24gZnJlcXVlbmN5IGJhbmRzIGluc3RlYWQuICovCisgICAgICAgIGlmICgocGF0Y2ggKiBoUW1mVHJhbnNwb3Nlci0+c3RhcnRCYW5kIC0gRnJlcUJhbmRUYWJsZVswXVtzZmIgLSAxXSkgPD0KKyAgICAgICAgICAgIDMpIHsKKyAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbcGF0Y2ggLSAxXSA9IEZyZXFCYW5kVGFibGVbMF1bc2ZiIC0gMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50IHNmYl90bXAgPSAwOworICAgICAgICAgIHdoaWxlIChzZmJfdG1wIDw9IE5TZmJbMV0gJiYKKyAgICAgICAgICAgICAgICAgRnJlcUJhbmRUYWJsZVsxXVtzZmJfdG1wXSA8PSBwYXRjaCAqIGhRbWZUcmFuc3Bvc2VyLT5zdGFydEJhbmQpCisgICAgICAgICAgICBzZmJfdG1wKys7CisgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mW3BhdGNoIC0gMV0gPSBGcmVxQmFuZFRhYmxlWzFdW3NmYl90bXAgLSAxXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mW3BhdGNoIC0gMV0gPSBoUW1mVHJhbnNwb3Nlci0+c3RvcEJhbmQ7CisgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5tYXhTdHJldGNoID0gZk1pbihwYXRjaCwgTUFYX1NUUkVUQ0hfSEJFKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaFFtZlRyYW5zcG9zZXItPmhpZ2hiYW5kX2V4cFswXSA9IDA7CisgICAgaFFtZlRyYW5zcG9zZXItPmhpZ2hiYW5kX2V4cFsxXSA9IDA7CisgICAgaFFtZlRyYW5zcG9zZXItPnRhcmdldF9leHBbMF0gPSAwOworICAgIGhRbWZUcmFuc3Bvc2VyLT50YXJnZXRfZXhwWzFdID0gMDsKKyAgfQorCisgIHJldHVybiBTQlJERUNfT0s7Cit9CisKK3ZvaWQgUW1mVHJhbnNwb3NlckNsb3NlKEhBTkRMRV9IQkVfVFJBTlNQT1NFUiBoUW1mVHJhbnNwb3NlcikgeworICBpbnQgaTsKKworICBpZiAoaFFtZlRyYW5zcG9zZXIgIT0gTlVMTCkgeworICAgIGlmIChoUW1mVHJhbnNwb3Nlci0+aW5CdWZfRikgRkRLZnJlZShoUW1mVHJhbnNwb3Nlci0+aW5CdWZfRik7CisKKyAgICBpZiAoaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmU2l6ZTsgaSsrKSB7CisgICAgICAgIEZES2FmcmVlKGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltpXSk7CisgICAgICB9CisgICAgICBGREtmcmVlKGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRik7CisgICAgfQorCisgICAgaWYgKGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRikgeworICAgICAgZm9yIChpID0gMDsgaSA8IGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlNpemU7IGkrKykgeworICAgICAgICBGREthZnJlZShoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0ZbaV0pOworICAgICAgfQorICAgICAgRkRLZnJlZShoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0YpOworICAgIH0KKworICAgIGlmIChoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmUmVhbF9GKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgSEJFX01BWF9PVVRfU0xPVFM7IGkrKykgeworICAgICAgICBGREtmcmVlKGhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZSZWFsX0ZbaV0pOworICAgICAgfQorICAgICAgRkRLZnJlZShoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmUmVhbF9GKTsKKyAgICB9CisKKyAgICBpZiAoaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZkltYWdfRikgeworICAgICAgZm9yIChpID0gMDsgaSA8IEhCRV9NQVhfT1VUX1NMT1RTOyBpKyspIHsKKyAgICAgICAgRkRLZnJlZShoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmSW1hZ19GW2ldKTsKKyAgICAgIH0KKyAgICAgIEZES2ZyZWUoaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZkltYWdfRik7CisgICAgfQorCisgICAgRkRLZnJlZShoUW1mVHJhbnNwb3Nlci0+cW1mQnVmZmVyQ29kZWNUZW1wU2xvdF9GKTsKKworICAgIEZES2ZyZWUoaFFtZlRyYW5zcG9zZXIpOworICB9Cit9CisKK2lubGluZSB2b2lkIHNjYWxlVXAoRklYUF9EQkwqIHJlYWxfbSwgRklYUF9EQkwqIGltYWdfbSwgSU5UKiBfZSkgeworICBJTlQgcmVzZXJ2ZTsKKyAgLyogc2hpZnQgZ2NfciBhbmQgZ2NfaSB1cCBpZiBwb3NzaWJsZSAqLworICByZXNlcnZlID0gQ250TGVhZGluZ1plcm9zKChJTlQoKnJlYWxfbSkgXiBJTlQoKCpyZWFsX20gPj4gMzEpKSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQoKmltYWdfbSkgXiBJTlQoKCppbWFnX20gPj4gMzEpKSkpIC0KKyAgICAgICAgICAgIDE7CisgIHJlc2VydmUgPSBmTWF4KHJlc2VydmUgLSAxLAorICAgICAgICAgICAgICAgICAwKTsgLyogTGVhdmUgb25lIGJpdCBoZWFkcm9vbSBzdWNoIHRoYXQgKHJlYWxfbV4yICsgaW1hZ19tXjIpCisgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBvdmVyZmxvdyBsYXRlciBpZiBib3RoIGFyZSAweDgwMDAwMDAwLiAqLworICByZXNlcnZlID0gZk1pbihyZXNlcnZlLCAqX2UpOworICBGREtfQVNTRVJUKHJlc2VydmUgPj0gMCk7CisgICpyZWFsX20gPDw9IHJlc2VydmU7CisgICppbWFnX20gPDw9IHJlc2VydmU7CisgICpfZSAtPSByZXNlcnZlOworfQorCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVDZW50ZXJGSVhQKEZJWFBfREJMIGdhbW1hVmVjUmVhbCwgRklYUF9EQkwgZ2FtbWFWZWNJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogY2VudGVyUmVhbCwgRklYUF9EQkwqIGNlbnRlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogZXhwb25lbnQsIGludCBzdHJldGNoLCBpbnQgbXVsdCkgeworICBzY2FsZVVwKCZnYW1tYVZlY1JlYWwsICZnYW1tYVZlY0ltYWcsIGV4cG9uZW50KTsKKyAgRklYUF9EQkwgZW5lcmd5ID0gZlBvdzJEaXYyKGdhbW1hVmVjUmVhbCkgKyBmUG93MkRpdjIoZ2FtbWFWZWNJbWFnKTsKKworICBpZiAoZW5lcmd5ICE9IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICBGSVhQX0RCTCBnY19yX20sIGdjX2lfbSwgZmFjdG9yX20gPSAoRklYUF9EQkwpMDsKKyAgICBJTlQgZmFjdG9yX2UsIGdjX2U7CisgICAgZmFjdG9yX2UgPSAyICogKCpleHBvbmVudCkgKyAxOworCisgICAgc3dpdGNoIChzdHJldGNoKSB7CisgICAgICBjYXNlIDI6CisgICAgICAgIGZhY3Rvcl9tID0gaW52Rm91cnRoUm9vdE5vcm0yKGVuZXJneSwgJmZhY3Rvcl9lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIGZhY3Rvcl9tID0gaW52Q3ViZVJvb3ROb3JtMihlbmVyZ3ksICZmYWN0b3JfZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OgorICAgICAgICBmYWN0b3JfbSA9IGludjNFaWd0aFJvb3ROb3JtMihlbmVyZ3ksICZmYWN0b3JfZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGdjX3JfbSA9IGZNdWx0RGl2MihnYW1tYVZlY1JlYWwsCisgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9tKTsgLyogZXhwb25lbnQgPSBIQkVfU0NBTEUgKyBmYWN0b3JfZSArIDEgKi8KKyAgICBnY19pX20gPSBmTXVsdERpdjIoZ2FtbWFWZWNJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbSk7IC8qIGV4cG9uZW50ID0gSEJFX1NDQUxFICsgZmFjdG9yX2UgKyAxKi8KKyAgICBnY19lID0gKmV4cG9uZW50ICsgZmFjdG9yX2UgKyAxOworCisgICAgc2NhbGVVcCgmZ2Nfcl9tLCAmZ2NfaV9tLCAmZ2NfZSk7CisKKyAgICBzd2l0Y2ggKG11bHQpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgKmNlbnRlclJlYWwgPSBnY19yX207CisgICAgICAgICpjZW50ZXJJbWFnID0gZ2NfaV9tOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgKmNlbnRlclJlYWwgPSBmUG93MkRpdjIoZ2Nfcl9tKSAtIGZQb3cyRGl2MihnY19pX20pOworICAgICAgICAqY2VudGVySW1hZyA9IGZNdWx0KGdjX3JfbSwgZ2NfaV9tKTsKKyAgICAgICAgZ2NfZSA9IDIgKiBnY19lICsgMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIEZJWFBfREJMIHRtcF9yID0gZ2Nfcl9tOworICAgICAgICBGSVhQX0RCTCB0bXBfaSA9IGdjX2lfbTsKKyAgICAgICAgZ2Nfcl9tID0gZlBvdzJEaXYyKGdjX3JfbSkgLSBmUG93MkRpdjIoZ2NfaV9tKTsKKyAgICAgICAgZ2NfaV9tID0gZk11bHQodG1wX3IsIGdjX2lfbSk7CisgICAgICAgIGdjX2UgPSAzICogZ2NfZSArIDEgKyAxOworICAgICAgICBjcGx4TXVsdERpdjIoJmNlbnRlclJlYWxbMF0sICZjZW50ZXJJbWFnWzBdLCBnY19yX20sIGdjX2lfbSwgdG1wX3IsCisgICAgICAgICAgICAgICAgICAgICB0bXBfaSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNjYWxlVXAoY2VudGVyUmVhbCwgY2VudGVySW1hZywgJmdjX2UpOworCisgICAgRkRLX0FTU0VSVChnY19lID49IDApOworICAgICpleHBvbmVudCA9IGdjX2U7CisgIH0gZWxzZSB7CisgICAgKmNlbnRlclJlYWwgPSBlbmVyZ3k7IC8qIGVuZXJneSA9IDAgKi8KKyAgICAqY2VudGVySW1hZyA9IGVuZXJneTsgLyogZW5lcmd5ID0gMCAqLworICAgICpleHBvbmVudCA9IChJTlQpZW5lcmd5OworICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0SEJFU2NhbGVGYWN0b3JGcmFtZShjb25zdCBpbnQgYlNicjQxLCBjb25zdCBpbnQgbWF4U3RyZXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcGl0Y2hJbkJpbnMpIHsKKyAgaWYgKHBpdGNoSW5CaW5zID49IHBtaW4gKiAoMSArIGJTYnI0MSkpIHsKKyAgICAvKiBjcm9zc3Byb2R1Y3RzIGVuYWJsZWQgKi8KKyAgICByZXR1cm4gMjY7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIChtYXhTdHJldGNoID09IDIpID8gMjQgOiAyNTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBhZGRIaWdoQmFuZFBhcnQoRklYUF9EQkwgZ19yX20sIEZJWFBfREJMIGdfaV9tLCBJTlQgZ19lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIG11bHQsIEZJWFBfREJMIGdhbW1hQ2VudGVyUmVhbF9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGdhbW1hQ2VudGVySW1hZ19tLCBJTlQgZ2FtbWFDZW50ZXJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RyZXRjaCwgSU5UIHNjYWxlX2ZhY3Rvcl9oYmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIHFtZkhCRUJ1ZlJlYWxfRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogcW1mSEJFQnVmSW1hZ19GKSB7CisgIGlmICgoZ19yX20gfCBnX2lfbSkgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgIEZJWFBfREJMIGZhY3Rvcl9tID0gKEZJWFBfREJMKTA7CisgICAgSU5UIGZhY3Rvcl9lOworICAgIElOVCBhZGQgPSAoc3RyZXRjaCA9PSA0KSA/IDEgOiAwOworICAgIElOVCBzaGlmdCA9IChzdHJldGNoID09IDQpID8gMSA6IDI7CisKKyAgICBzY2FsZVVwKCZnX3JfbSwgJmdfaV9tLCAmZ19lKTsKKyAgICBGSVhQX0RCTCBlbmVyZ3kgPSBmUG93MkFkZERpdjIoZlBvdzJEaXYyKGdfcl9tKSwgZ19pX20pOworICAgIGZhY3Rvcl9lID0gMiAqIGdfZSArIDE7CisKKyAgICBzd2l0Y2ggKHN0cmV0Y2gpIHsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgZmFjdG9yX20gPSBpbnZGb3VydGhSb290Tm9ybTIoZW5lcmd5LCAmZmFjdG9yX2UpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgZmFjdG9yX20gPSBpbnZDdWJlUm9vdE5vcm0yKGVuZXJneSwgJmZhY3Rvcl9lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGZhY3Rvcl9tID0gaW52M0VpZ3RoUm9vdE5vcm0yKGVuZXJneSwgJmZhY3Rvcl9lKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZmFjdG9yX20gPSBmTXVsdChmYWN0b3JfbSwgbXVsdCk7CisKKyAgICBGSVhQX0RCTCB0bXBfciwgdG1wX2k7CisgICAgY3BseE11bHREaXYyKCZ0bXBfciwgJnRtcF9pLCBnX3JfbSwgZ19pX20sIGdhbW1hQ2VudGVyUmVhbF9tLAorICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlckltYWdfbSk7CisKKyAgICBnX3JfbSA9IGZNdWx0RGl2Mih0bXBfciwgZmFjdG9yX20pIDw8IHNoaWZ0OworICAgIGdfaV9tID0gZk11bHREaXYyKHRtcF9pLCBmYWN0b3JfbSkgPDwgc2hpZnQ7CisgICAgZ19lID0gc2NhbGVfZmFjdG9yX2hiZSAtIChnX2UgKyBmYWN0b3JfZSArIGdhbW1hQ2VudGVyX2UgKyBhZGQpOworICAgIGZNYXgoKElOVCkwLCBnX2UpOworICAgICpxbWZIQkVCdWZSZWFsX0YgKz0gZ19yX20gPj4gZ19lOworICAgICpxbWZIQkVCdWZJbWFnX0YgKz0gZ19pX20gPj4gZ19lOworICB9Cit9CisKK3ZvaWQgUW1mVHJhbnNwb3NlckFwcGx5KEhBTkRMRV9IQkVfVFJBTlNQT1NFUiBoUW1mVHJhbnNwb3NlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiogcW1mQnVmZmVyQ29kZWNSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqKiBxbWZCdWZmZXJDb2RlY0ltYWcsIGludCBuQ29sc0luLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqKiBwcFFtZkJ1ZmZlck91dFJlYWxfRiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiogcHBRbWZCdWZmZXJPdXRJbWFnX0YsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBscGNGaWx0ZXJTdGF0ZXNSZWFsWzIgKyAoMyAqICg0KSldWyg2NCldLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbHBjRmlsdGVyU3RhdGVzSW1hZ1syICsgKDMgKiAoNCkpXVsoNjQpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaEluQmlucywgaW50IHNjYWxlX2xiLCBpbnQgc2NhbGVfaGJlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzY2FsZV9oYiwgaW50IHRpbWVTdGVwLCBpbnQgZmlyc3RTbG90T2Zmc3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBLRUVQX1NUQVRFU19TWU5DRURfTU9ERSBrZWVwU3RhdGVzU3luY2VkTW9kZSkgeworICBpbnQgaSwgaiwgc3RyZXRjaCwgYmFuZCwgc291cmNlYmFuZCwgciwgczsKKyAgaW50IHFtZlZvY29kZXJDb2xzSW4gPSBoUW1mVHJhbnNwb3Nlci0+bm9Db2xzIC8gMjsKKyAgaW50IGJTYnI0MSA9IGhRbWZUcmFuc3Bvc2VyLT5iU2JyNDE7CisKKyAgY29uc3QgaW50IHdpbkxlbmd0aFszXSA9IHsxMCwgOCwgNn07CisgIGNvbnN0IGludCBzbG90T2Zmc2V0ID0gNjsgLyogaFFtZlRyYW5zcG9zZXItPndpbkxlbi02OyAqLworCisgIGludCBxbWZPZmZzZXQgPSAyICogaFFtZlRyYW5zcG9zZXItPmtzdGFydDsKKyAgaW50IHNjYWxlX2JvcmRlciA9IChuQ29sc0luID09IDY0KSA/IDMyIDogbkNvbHNJbjsKKworICBJTlQgc2xvdF9zdHJldGNoNFs5XSA9IHswLCAwLCAwLCAwLCAyLCA0LCA2LCA4LCAxMH07CisgIElOVCBzbG90X3N0cmV0Y2gyWzExXSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH07CisgIElOVCBzbG90X3N0cmV0Y2gzWzEwXSA9IHswLCAwLCAwLCAxLCAzLCA0LCA2LCA3LCA5LCAxMH07CisgIElOVCBmaWx0X3N0cmV0Y2gzWzEwXSA9IHswLCAwLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxfTsKKyAgSU5UIGZpbHRfZHVtbXlbMTFdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OworICBJTlQqIHBTbG90U3RyZXRjaDsKKyAgSU5UKiBwRmlsdDsKKworICBpbnQgb2Zmc2V0ID0gMDsgLyogd2hlcmUgdG8gdGFrZSAgUW1mVHJhbnNwb3NlciBkYXRhICovCisKKyAgaW50IHNpZ25QcmVNb2QgPQorICAgICAgKGhRbWZUcmFuc3Bvc2VyLT5zeW50aGVzaXNRbWZQcmVNb2RDb3NfRlswXSA8IEZMMkZYQ09OU1RfREJMKDAuZikpID8gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLTE7CisKKyAgaW50IHNjYWxlX2ZhY3Rvcl9oYmUgPQorICAgICAgZ2V0SEJFU2NhbGVGYWN0b3JGcmFtZShiU2JyNDEsIGhRbWZUcmFuc3Bvc2VyLT5tYXhTdHJldGNoLCBwaXRjaEluQmlucyk7CisKKyAgaWYgKGtlZXBTdGF0ZXNTeW5jZWRNb2RlICE9IEtFRVBfU1RBVEVTX1NZTkNFRF9PRkYpIHsKKyAgICBvZmZzZXQgPSBoUW1mVHJhbnNwb3Nlci0+bm9Db2xzIC0gb3ZfbGVuIC0gTFBDX09SREVSOworICB9CisKKyAgaFFtZlRyYW5zcG9zZXItPmhpZ2hiYW5kX2V4cFswXSA9IGhRbWZUcmFuc3Bvc2VyLT5oaWdoYmFuZF9leHBbMV07CisgIGhRbWZUcmFuc3Bvc2VyLT50YXJnZXRfZXhwWzBdID0gaFFtZlRyYW5zcG9zZXItPnRhcmdldF9leHBbMV07CisKKyAgaFFtZlRyYW5zcG9zZXItPmhpZ2hiYW5kX2V4cFsxXSA9IHNjYWxlX2ZhY3Rvcl9oYmU7CisgIGhRbWZUcmFuc3Bvc2VyLT50YXJnZXRfZXhwWzFdID0KKyAgICAgIGZpeE1heChoUW1mVHJhbnNwb3Nlci0+aGlnaGJhbmRfZXhwWzFdLCBoUW1mVHJhbnNwb3Nlci0+aGlnaGJhbmRfZXhwWzBdKTsKKworICBzY2FsZV9mYWN0b3JfaGJlID0gaFFtZlRyYW5zcG9zZXItPnRhcmdldF9leHBbMV07CisKKyAgaW50IHNoaWZ0X292ID0gaFFtZlRyYW5zcG9zZXItPnRhcmdldF9leHBbMF0gLSBoUW1mVHJhbnNwb3Nlci0+dGFyZ2V0X2V4cFsxXTsKKworICBpZiAoc2hpZnRfb3YgIT0gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBIQkVfTUFYX09VVF9TTE9UUzsgaSsrKSB7CisgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgUU1GX1NZTlRIX0NIQU5ORUxTOyBiYW5kKyspIHsKKyAgICAgICAgaWYgKHNoaWZ0X292ID49IDApIHsKKyAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmUmVhbF9GW2ldW2JhbmRdIDw8PSBzaGlmdF9vdjsKKyAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmSW1hZ19GW2ldW2JhbmRdIDw8PSBzaGlmdF9vdjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmUmVhbF9GW2ldW2JhbmRdID4+PSAoLXNoaWZ0X292KTsKKyAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmSW1hZ19GW2ldW2JhbmRdID4+PSAoLXNoaWZ0X292KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICgoa2VlcFN0YXRlc1N5bmNlZE1vZGUgPT0gS0VFUF9TVEFURVNfU1lOQ0VEX09GRikgJiYgc2hpZnRfb3YgIT0gMCkgeworICAgIGZvciAoaSA9IHRpbWVTdGVwICogZmlyc3RTbG90T2Zmc3NldDsgaSA8IG92X2xlbjsgaSsrKSB7CisgICAgICBmb3IgKGJhbmQgPSBoUW1mVHJhbnNwb3Nlci0+c3RhcnRCYW5kOyBiYW5kIDwgaFFtZlRyYW5zcG9zZXItPnN0b3BCYW5kOworICAgICAgICAgICBiYW5kKyspIHsKKyAgICAgICAgaWYgKHNoaWZ0X292ID49IDApIHsKKyAgICAgICAgICBwcFFtZkJ1ZmZlck91dFJlYWxfRltpXVtiYW5kXSA8PD0gc2hpZnRfb3Y7CisgICAgICAgICAgcHBRbWZCdWZmZXJPdXRJbWFnX0ZbaV1bYmFuZF0gPDw9IHNoaWZ0X292OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBwUW1mQnVmZmVyT3V0UmVhbF9GW2ldW2JhbmRdID4+PSAoLXNoaWZ0X292KTsKKyAgICAgICAgICBwcFFtZkJ1ZmZlck91dEltYWdfRltpXVtiYW5kXSA+Pj0gKC1zaGlmdF9vdik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzaGlmdCBscGMgZmlsdGVyc3RhdGVzICovCisgICAgZm9yIChpID0gMDsgaSA8IHRpbWVTdGVwICogZmlyc3RTbG90T2Zmc3NldCArIExQQ19PUkRFUjsgaSsrKSB7CisgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgKDY0KTsgYmFuZCsrKSB7CisgICAgICAgIGlmIChzaGlmdF9vdiA+PSAwKSB7CisgICAgICAgICAgbHBjRmlsdGVyU3RhdGVzUmVhbFtpXVtiYW5kXSA8PD0gc2hpZnRfb3Y7CisgICAgICAgICAgbHBjRmlsdGVyU3RhdGVzSW1hZ1tpXVtiYW5kXSA8PD0gc2hpZnRfb3Y7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbHBjRmlsdGVyU3RhdGVzUmVhbFtpXVtiYW5kXSA+Pj0gKC1zaGlmdF9vdik7CisgICAgICAgICAgbHBjRmlsdGVyU3RhdGVzSW1hZ1tpXVtiYW5kXSA+Pj0gKC1zaGlmdF9vdik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBGSVhQX0RCTCB0d2lkX21fbmV3WzNdWzJdOyAvKiBbc3RyZXRjaF1bY29zL3Npbl0gKi8KKyAgSU5UIHN0ZXBzaXplID0gMSArICFiU2JyNDEsIHNpbmVfb2Zmc2V0ID0gMjQsIG1vZCA9IDk2OworICBJTlQgbXVsdFszXSA9IHsxLCAyLCAzfTsKKworICBmb3IgKHMgPSAwOyBzIDw9IE1BWF9TVFJFVENIX0hCRSAtIDI7IHMrKykgeworICAgIHR3aWRfbV9uZXdbc11bMF0gPSB0d2lkZGxlWyhtdWx0W3NdICogKHN0ZXBzaXplICogcGl0Y2hJbkJpbnMpKSAlIG1vZF07CisgICAgdHdpZF9tX25ld1tzXVsxXSA9CisgICAgICAgIHR3aWRkbGVbKChtdWx0W3NdICogKHN0ZXBzaXplICogcGl0Y2hJbkJpbnMpKSArIHNpbmVfb2Zmc2V0KSAlIG1vZF07CisgIH0KKworICAvKiBUaW1lLXN0cmV0Y2ggKi8KKyAgZm9yIChqID0gMDsgaiA8IHFtZlZvY29kZXJDb2xzSW47IGorKykgeworICAgIGludCBzaWduID0gLTEsIGssIHosIGFkZHJzaGlmdCwgY29kZWNUZW1wX2U7CisgICAgLyogdXBkYXRlIGluYnVmICovCisgICAgZm9yIChpID0gMDsgaSA8IGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemU7IGkrKykgeworICAgICAgaFFtZlRyYW5zcG9zZXItPmluQnVmX0ZbaV0gPQorICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5pbkJ1Zl9GW2kgKyAyICogaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZV07CisgICAgfQorCisgICAgLyogcnVuIHN5bnRoZXNpcyBmb3IgdHdvIHNiciBzbG90cyBhcyB0cmFuc3Bvc2VyIHVzZXMKKyAgICBoYWxmIHNsb3RzIGRvdWJsZSBiYW5kcyByZXByZXNlbnRhdGlvbiAqLworICAgIGZvciAoeiA9IDA7IHogPCAyOyB6KyspIHsKKyAgICAgIGludCBzY2FsZV9mYWN0b3IgPSAoKG5Db2xzSW4gPT0gNjQpICYmICgoMiAqIGogKyB6KSA8IHNjYWxlX2JvcmRlcikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2NhbGVfbGIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzY2FsZV9oYmU7CisgICAgICBjb2RlY1RlbXBfZSA9IHNjYWxlX2ZhY3RvciAtIDE7IC8qIC0yIGZvciBEaXYyIGFuZCBjb3Mvc2luIHNjYWxlIG9mIDEgKi8KKworICAgICAgZm9yIChrID0gMDsgayA8IGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemU7IGsrKykgeworICAgICAgICBpbnQga2kgPSBoUW1mVHJhbnNwb3Nlci0+a3N0YXJ0ICsgazsKKyAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkJ1ZmZlckNvZGVjVGVtcFNsb3RfRltrXSA9CisgICAgICAgICAgICBmTXVsdERpdjIoc2lnblByZU1vZCAqIGhRbWZUcmFuc3Bvc2VyLT5zeW50aGVzaXNRbWZQcmVNb2RDb3NfRltrXSwKKyAgICAgICAgICAgICAgICAgICAgICBxbWZCdWZmZXJDb2RlY1JlYWxbMiAqIGogKyB6XVtraV0pOworICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mQnVmZmVyQ29kZWNUZW1wU2xvdF9GW2tdICs9CisgICAgICAgICAgICBmTXVsdERpdjIoc2lnblByZU1vZCAqIGhRbWZUcmFuc3Bvc2VyLT5zeW50aGVzaXNRbWZQcmVNb2RTaW5fRltrXSwKKyAgICAgICAgICAgICAgICAgICAgICBxbWZCdWZmZXJDb2RlY0ltYWdbMiAqIGogKyB6XVtraV0pOworICAgICAgfQorCisgICAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgKEhCRV9NQVhfUU1GX0JBTkRTIDw8IDEpKTsKKworICAgICAgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdCgKKyAgICAgICAgICAmaFFtZlRyYW5zcG9zZXItPkhCRVN5bnRoZXNpc1FNRiwKKyAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mQnVmZmVyQ29kZWNUZW1wU2xvdF9GLCBOVUxMLCAwLAorICAgICAgICAgIC03IC0gaFFtZlRyYW5zcG9zZXItPkhCRVN5bnRoZXNpc1FNRi5maWx0ZXJTY2FsZSAtIGNvZGVjVGVtcF9lICsgMSwKKyAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+aW5CdWZfRiArIGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemUgKiAoeiArIDEpLCAxLAorICAgICAgICAgIHBXb3JrQnVmZmVyKTsKKworICAgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAoSEJFX01BWF9RTUZfQkFORFMgPDwgMSkpOworICAgIH0KKworICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAoSEJFX01BWF9RTUZfQkFORFMgPDwgMSkpOworCisgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KCZoUW1mVHJhbnNwb3Nlci0+SEJFQW5hbHlzaXNjUU1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0ZbUU1GX1dJTl9MRU4gLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW1FNRl9XSU5fTEVOIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5pbkJ1Zl9GICsgMSwgMSwgcFdvcmtCdWZmZXIpOworCisgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAoSEJFX01BWF9RTUZfQkFORFMgPDwgMSkpOworCisgICAgaWYgKChrZWVwU3RhdGVzU3luY2VkTW9kZSA9PSBLRUVQX1NUQVRFU19TWU5DRURfTk9STUFMKSAmJgorICAgICAgICBqIDw9IHFtZlZvY29kZXJDb2xzSW4gLSAoKExQQ19PUkRFUiArIG92X2xlbiArIFFNRl9XSU5fTEVOIC0gMSkgPj4gMSkpIHsKKyAgICAgIC8qIHVwZGF0ZSBpbiBidWZmZXIgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBRTUZfV0lOX0xFTiAtIDE7IGkrKykgeworICAgICAgICBGREttZW1jcHkoCisgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0ZbaV0sCisgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0ZbaSArIDFdLAorICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIGhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYubm9fY2hhbm5lbHMpOworICAgICAgICBGREttZW1jcHkoCisgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0ZbaV0sCisgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0ZbaSArIDFdLAorICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIGhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYubm9fY2hhbm5lbHMpOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZm9yIChzdHJldGNoID0gMjsgc3RyZXRjaCA8PSBoUW1mVHJhbnNwb3Nlci0+bWF4U3RyZXRjaDsgc3RyZXRjaCsrKSB7CisgICAgICBpbnQgc3RhcnQgPSBzbG90T2Zmc2V0IC0gd2luTGVuZ3RoW3N0cmV0Y2ggLSAyXSAvIDI7CisgICAgICBpbnQgc3RvcCA9IHNsb3RPZmZzZXQgKyB3aW5MZW5ndGhbc3RyZXRjaCAtIDJdIC8gMjsKKworICAgICAgRklYUF9EQkwgZmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMS5mIC8gMy5mKTsKKworICAgICAgZm9yIChiYW5kID0gaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mW3N0cmV0Y2ggLSAyXTsKKyAgICAgICAgICAgYmFuZCA8IGhRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZltzdHJldGNoIC0gMV07IGJhbmQrKykgeworICAgICAgICBGSVhQX0RCTCBnYW1tYUNlbnRlclJlYWxfbVsyXSA9IHsoRklYUF9EQkwpMCwgKEZJWFBfREJMKTB9LAorICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlckltYWdfbVsyXSA9IHsoRklYUF9EQkwpMCwgKEZJWFBfREJMKTB9OworICAgICAgICBJTlQgZ2FtbWFDZW50ZXJfZVsyXSA9IHswLCAwfTsKKworICAgICAgICBGSVhQX0RCTCBnYW1tYVZlY1JlYWxfbVsyXSA9IHsoRklYUF9EQkwpMCwgKEZJWFBfREJMKTB9LAorICAgICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVsyXSA9IHsoRklYUF9EQkwpMCwgKEZJWFBfREJMKTB9OworICAgICAgICBJTlQgZ2FtbWFWZWNfZVsyXSA9IHswLCAwfTsKKworICAgICAgICBGSVhQX0RCTCB3aW5nYWluID0gKEZJWFBfREJMKTA7CisKKyAgICAgICAgZ2FtbWFDZW50ZXJfZVswXSA9CisgICAgICAgICAgICBTQ0FMRTJFWFAoLWhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYub3V0U2NhbGVmYWN0b3IpOworICAgICAgICBnYW1tYUNlbnRlcl9lWzFdID0KKyAgICAgICAgICAgIFNDQUxFMkVYUCgtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisKKyAgICAgICAgLyogaW50ZXJwb2xhdGlvbiBmaWx0ZXJzIGZvciAzcmQgb3JkZXIgKi8KKyAgICAgICAgc291cmNlYmFuZCA9IDIgKiBiYW5kIC8gc3RyZXRjaCAtIHFtZk9mZnNldDsKKyAgICAgICAgRkRLX0FTU0VSVChzb3VyY2ViYW5kID49IDApOworCisgICAgICAgIC8qIG1heGltdW0gZ2FtbWFDZW50ZXJfZSA9PSAyMCAqLworICAgICAgICBjYWxjdWxhdGVDZW50ZXJGSVhQKAorICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW3Nsb3RPZmZzZXRdW3NvdXJjZWJhbmRdLAorICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3NvdXJjZWJhbmRdLAorICAgICAgICAgICAgJmdhbW1hQ2VudGVyUmVhbF9tWzBdLCAmZ2FtbWFDZW50ZXJJbWFnX21bMF0sICZnYW1tYUNlbnRlcl9lWzBdLAorICAgICAgICAgICAgc3RyZXRjaCwgc3RyZXRjaCAtIDIpOworCisgICAgICAgIGlmIChzdHJldGNoID09IDQpIHsKKyAgICAgICAgICByID0gYmFuZCAtIDIgKiAoYmFuZCAvIDIpOworICAgICAgICAgIHNvdXJjZWJhbmQgKz0gKHIgPT0gMCkgPyAtMSA6IDE7CisgICAgICAgICAgcFNsb3RTdHJldGNoID0gc2xvdF9zdHJldGNoNDsKKyAgICAgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgyLmYgLyAzLmYpOworICAgICAgICAgIHBGaWx0ID0gZmlsdF9kdW1teTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJldGNoID09IDIpIHsKKyAgICAgICAgICByID0gMDsKKyAgICAgICAgICBzb3VyY2ViYW5kID0gMiAqIGJhbmQgLyBzdHJldGNoIC0gcW1mT2Zmc2V0OworICAgICAgICAgIHBTbG90U3RyZXRjaCA9IHNsb3Rfc3RyZXRjaDI7CisgICAgICAgICAgZmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMS5mIC8gMy5mKTsKKyAgICAgICAgICBwRmlsdCA9IGZpbHRfZHVtbXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgciA9IDIgKiBiYW5kIC0gMyAqICgyICogYmFuZCAvIDMpOworICAgICAgICAgIHNvdXJjZWJhbmQgPSAyICogYmFuZCAvIHN0cmV0Y2ggLSBxbWZPZmZzZXQ7CisgICAgICAgICAgcFNsb3RTdHJldGNoID0gc2xvdF9zdHJldGNoMzsKKyAgICAgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgxLjQxNDJmIC8gMy4wZik7CisgICAgICAgICAgcEZpbHQgPSBmaWx0X3N0cmV0Y2gzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHIgPT0gMikgeworICAgICAgICAgIGNhbGN1bGF0ZUNlbnRlckZJWFAoCisgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltzbG90T2Zmc2V0XVtzb3VyY2ViYW5kICsgMV0sCisgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRltzbG90T2Zmc2V0XVtzb3VyY2ViYW5kICsgMV0sCisgICAgICAgICAgICAgICZnYW1tYUNlbnRlclJlYWxfbVsxXSwgJmdhbW1hQ2VudGVySW1hZ19tWzFdLCAmZ2FtbWFDZW50ZXJfZVsxXSwKKyAgICAgICAgICAgICAgc3RyZXRjaCwgc3RyZXRjaCAtIDIpOworCisgICAgICAgICAgZmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMS40MTQyZiAvIDYuMGYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHIgPT0gMikgeworICAgICAgICAgIGZvciAoayA9IHN0YXJ0OyBrIDwgc3RvcDsgaysrKSB7CisgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW3BTbG90U3RyZXRjaFtrXV1bc291cmNlYmFuZF07CisgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVsxXSA9CisgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW3BTbG90U3RyZXRjaFtrXV1bc291cmNlYmFuZCArIDFdOworICAgICAgICAgICAgZ2FtbWFWZWNJbWFnX21bMF0gPQorICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRltwU2xvdFN0cmV0Y2hba11dW3NvdXJjZWJhbmRdOworICAgICAgICAgICAgZ2FtbWFWZWNJbWFnX21bMV0gPQorICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRltwU2xvdFN0cmV0Y2hba11dW3NvdXJjZWJhbmQgKyAxXTsKKyAgICAgICAgICAgIGdhbW1hVmVjX2VbMF0gPSBnYW1tYVZlY19lWzFdID0KKyAgICAgICAgICAgICAgICBTQ0FMRTJFWFAoLWhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYub3V0U2NhbGVmYWN0b3IpOworCisgICAgICAgICAgICBpZiAocEZpbHRba10gPT0gMSkgeworICAgICAgICAgICAgICBGSVhQX0RCTCB0bXBSZWFsRiA9IGdhbW1hVmVjUmVhbF9tWzBdLCB0bXBJbWFnRjsKKyAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21bMF0gPQorICAgICAgICAgICAgICAgICAgKGZNdWx0KGdhbW1hVmVjUmVhbF9tWzBdLCBoaW50UmVhbF9GW3NvdXJjZWJhbmQgJSA0XVsxXSkgLQorICAgICAgICAgICAgICAgICAgIGZNdWx0KGdhbW1hVmVjSW1hZ19tWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRSZWFsX0ZbKHNvdXJjZWJhbmQgKyAzKSAlIDRdWzFdKSkgPj4KKyAgICAgICAgICAgICAgICAgIDE7IC8qIHN1bSBzaG91bGQgYmUgPD0gMSBiZWNhdXNlIG9mIHNpbi9jb3MgbXVsdGlwbGljYXRpb24gKi8KKyAgICAgICAgICAgICAgZ2FtbWFWZWNJbWFnX21bMF0gPQorICAgICAgICAgICAgICAgICAgKGZNdWx0KHRtcFJlYWxGLCBoaW50UmVhbF9GWyhzb3VyY2ViYW5kICsgMykgJSA0XVsxXSkgKworICAgICAgICAgICAgICAgICAgIGZNdWx0KGdhbW1hVmVjSW1hZ19tWzBdLCBoaW50UmVhbF9GW3NvdXJjZWJhbmQgJSA0XVsxXSkpID4+CisgICAgICAgICAgICAgICAgICAxOyAvKiBzdW0gc2hvdWxkIGJlIDw9IDEgYmVjYXVzZSBvZiBzaW4vY29zIG11bHRpcGxpY2F0aW9uICovCisKKyAgICAgICAgICAgICAgdG1wUmVhbEYgPSBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmUmVhbF9GW3BTbG90U3RyZXRjaFtrXSArIDFdW3NvdXJjZWJhbmRdOworICAgICAgICAgICAgICB0bXBJbWFnRiA9IGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZJbWFnX0ZbcFNsb3RTdHJldGNoW2tdICsgMV1bc291cmNlYmFuZF07CisKKyAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21bMF0gKz0KKyAgICAgICAgICAgICAgICAgIChmTXVsdCh0bXBSZWFsRiwgaGludFJlYWxfRltzb3VyY2ViYW5kICUgNF1bMV0pIC0KKyAgICAgICAgICAgICAgICAgICBmTXVsdCh0bXBJbWFnRiwgaGludFJlYWxfRlsoc291cmNlYmFuZCArIDEpICUgNF1bMV0pKSA+PgorICAgICAgICAgICAgICAgICAgMTsgLyogc3VtIHNob3VsZCBiZSA8PSAxIGJlY2F1c2Ugb2Ygc2luL2NvcyBtdWx0aXBsaWNhdGlvbiAqLworICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVswXSArPQorICAgICAgICAgICAgICAgICAgKGZNdWx0KHRtcFJlYWxGLCBoaW50UmVhbF9GWyhzb3VyY2ViYW5kICsgMSkgJSA0XVsxXSkgKworICAgICAgICAgICAgICAgICAgIGZNdWx0KHRtcEltYWdGLCBoaW50UmVhbF9GW3NvdXJjZWJhbmQgJSA0XVsxXSkpID4+CisgICAgICAgICAgICAgICAgICAxOyAvKiBzdW0gc2hvdWxkIGJlIDw9IDEgYmVjYXVzZSBvZiBzaW4vY29zIG11bHRpcGxpY2F0aW9uICovCisgICAgICAgICAgICAgIGdhbW1hVmVjX2VbMF0rKzsKKworICAgICAgICAgICAgICB0bXBSZWFsRiA9IGdhbW1hVmVjUmVhbF9tWzFdOworCisgICAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tWzFdID0KKyAgICAgICAgICAgICAgICAgIChmTXVsdChnYW1tYVZlY1JlYWxfbVsxXSwgaGludFJlYWxfRltzb3VyY2ViYW5kICUgNF1bMl0pIC0KKyAgICAgICAgICAgICAgICAgICBmTXVsdChnYW1tYVZlY0ltYWdfbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoaW50UmVhbF9GWyhzb3VyY2ViYW5kICsgMykgJSA0XVsyXSkpID4+CisgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVsxXSA9CisgICAgICAgICAgICAgICAgICAoZk11bHQodG1wUmVhbEYsIGhpbnRSZWFsX0ZbKHNvdXJjZWJhbmQgKyAzKSAlIDRdWzJdKSArCisgICAgICAgICAgICAgICAgICAgZk11bHQoZ2FtbWFWZWNJbWFnX21bMV0sIGhpbnRSZWFsX0Zbc291cmNlYmFuZCAlIDRdWzJdKSkgPj4KKyAgICAgICAgICAgICAgICAgIDE7CisKKyAgICAgICAgICAgICAgdG1wUmVhbEYgPQorICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmUmVhbF9GW3BTbG90U3RyZXRjaFtrXSArIDFdW3NvdXJjZWJhbmQgKyAxXTsKKyAgICAgICAgICAgICAgdG1wSW1hZ0YgPQorICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmSW1hZ19GW3BTbG90U3RyZXRjaFtrXSArIDFdW3NvdXJjZWJhbmQgKyAxXTsKKworICAgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVsxXSArPQorICAgICAgICAgICAgICAgICAgKGZNdWx0KHRtcFJlYWxGLCBoaW50UmVhbF9GW3NvdXJjZWJhbmQgJSA0XVsyXSkgLQorICAgICAgICAgICAgICAgICAgIGZNdWx0KHRtcEltYWdGLCBoaW50UmVhbF9GWyhzb3VyY2ViYW5kICsgMSkgJSA0XVsyXSkpID4+CisgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVsxXSArPQorICAgICAgICAgICAgICAgICAgKGZNdWx0KHRtcFJlYWxGLCBoaW50UmVhbF9GWyhzb3VyY2ViYW5kICsgMSkgJSA0XVsyXSkgKworICAgICAgICAgICAgICAgICAgIGZNdWx0KHRtcEltYWdGLCBoaW50UmVhbF9GW3NvdXJjZWJhbmQgJSA0XVsyXSkpID4+CisgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgICAgICBnYW1tYVZlY19lWzFdKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFkZEhpZ2hCYW5kUGFydChnYW1tYVZlY1JlYWxfbVsxXSwgZ2FtbWFWZWNJbWFnX21bMV0sIGdhbW1hVmVjX2VbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yLCBnYW1tYUNlbnRlclJlYWxfbVswXSwgZ2FtbWFDZW50ZXJJbWFnX21bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtbWFDZW50ZXJfZVswXSwgc3RyZXRjaCwgc2NhbGVfZmFjdG9yX2hiZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZlJlYWxfRltrXVtiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZkltYWdfRltrXVtiYW5kXSk7CisKKyAgICAgICAgICAgIGFkZEhpZ2hCYW5kUGFydChnYW1tYVZlY1JlYWxfbVswXSwgZ2FtbWFWZWNJbWFnX21bMF0sIGdhbW1hVmVjX2VbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yLCBnYW1tYUNlbnRlclJlYWxfbVsxXSwgZ2FtbWFDZW50ZXJJbWFnX21bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtbWFDZW50ZXJfZVsxXSwgc3RyZXRjaCwgc2NhbGVfZmFjdG9yX2hiZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZlJlYWxfRltrXVtiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZkltYWdfRltrXVtiYW5kXSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoayA9IHN0YXJ0OyBrIDwgc3RvcDsgaysrKSB7CisgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW3BTbG90U3RyZXRjaFtrXV1bc291cmNlYmFuZF07CisgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVswXSA9CisgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3BTbG90U3RyZXRjaFtrXV1bc291cmNlYmFuZF07CisgICAgICAgICAgICBnYW1tYVZlY19lWzBdID0KKyAgICAgICAgICAgICAgICBTQ0FMRTJFWFAoLWhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYub3V0U2NhbGVmYWN0b3IpOworCisgICAgICAgICAgICBpZiAocEZpbHRba10gPT0gMSkgeworICAgICAgICAgICAgICBGSVhQX0RCTCB0bXBSZWFsRiA9IGdhbW1hVmVjUmVhbF9tWzBdLCB0bXBJbWFnRjsKKyAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21bMF0gPQorICAgICAgICAgICAgICAgICAgKGZNdWx0KGdhbW1hVmVjUmVhbF9tWzBdLCBoaW50UmVhbF9GW3NvdXJjZWJhbmQgJSA0XVsxXSkgLQorICAgICAgICAgICAgICAgICAgIGZNdWx0KGdhbW1hVmVjSW1hZ19tWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRSZWFsX0ZbKHNvdXJjZWJhbmQgKyAzKSAlIDRdWzFdKSkgPj4KKyAgICAgICAgICAgICAgICAgIDE7IC8qIHN1bSBzaG91bGQgYmUgPD0gMSBiZWNhdXNlIG9mIHNpbi9jb3MgbXVsdGlwbGljYXRpb24gKi8KKyAgICAgICAgICAgICAgZ2FtbWFWZWNJbWFnX21bMF0gPQorICAgICAgICAgICAgICAgICAgKGZNdWx0KHRtcFJlYWxGLCBoaW50UmVhbF9GWyhzb3VyY2ViYW5kICsgMykgJSA0XVsxXSkgKworICAgICAgICAgICAgICAgICAgIGZNdWx0KGdhbW1hVmVjSW1hZ19tWzBdLCBoaW50UmVhbF9GW3NvdXJjZWJhbmQgJSA0XVsxXSkpID4+CisgICAgICAgICAgICAgICAgICAxOyAvKiBzdW0gc2hvdWxkIGJlIDw9IDEgYmVjYXVzZSBvZiBzaW4vY29zIG11bHRpcGxpY2F0aW9uICovCisKKyAgICAgICAgICAgICAgdG1wUmVhbEYgPSBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmUmVhbF9GW3BTbG90U3RyZXRjaFtrXSArIDFdW3NvdXJjZWJhbmRdOworICAgICAgICAgICAgICB0bXBJbWFnRiA9IGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZJbWFnX0ZbcFNsb3RTdHJldGNoW2tdICsgMV1bc291cmNlYmFuZF07CisKKyAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21bMF0gKz0KKyAgICAgICAgICAgICAgICAgIChmTXVsdCh0bXBSZWFsRiwgaGludFJlYWxfRltzb3VyY2ViYW5kICUgNF1bMV0pIC0KKyAgICAgICAgICAgICAgICAgICBmTXVsdCh0bXBJbWFnRiwgaGludFJlYWxfRlsoc291cmNlYmFuZCArIDEpICUgNF1bMV0pKSA+PgorICAgICAgICAgICAgICAgICAgMTsgLyogc3VtIHNob3VsZCBiZSA8PSAxIGJlY2F1c2Ugb2Ygc2luL2NvcyBtdWx0aXBsaWNhdGlvbiAqLworICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVswXSArPQorICAgICAgICAgICAgICAgICAgKGZNdWx0KHRtcFJlYWxGLCBoaW50UmVhbF9GWyhzb3VyY2ViYW5kICsgMSkgJSA0XVsxXSkgKworICAgICAgICAgICAgICAgICAgIGZNdWx0KHRtcEltYWdGLCBoaW50UmVhbF9GW3NvdXJjZWJhbmQgJSA0XVsxXSkpID4+CisgICAgICAgICAgICAgICAgICAxOyAvKiBzdW0gc2hvdWxkIGJlIDw9IDEgYmVjYXVzZSBvZiBzaW4vY29zIG11bHRpcGxpY2F0aW9uICovCisgICAgICAgICAgICAgIGdhbW1hVmVjX2VbMF0rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWRkSGlnaEJhbmRQYXJ0KGdhbW1hVmVjUmVhbF9tWzBdLCBnYW1tYVZlY0ltYWdfbVswXSwgZ2FtbWFWZWNfZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IsIGdhbW1hQ2VudGVyUmVhbF9tWzBdLCBnYW1tYUNlbnRlckltYWdfbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlcl9lWzBdLCBzdHJldGNoLCBzY2FsZV9mYWN0b3JfaGJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmUmVhbF9GW2tdW2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmSW1hZ19GW2tdW2JhbmRdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBwaXRjaEluQmlucyBpcyBnaXZlbiB3aXRoIHRoZSByZXNvbHV0aW9uIG9mIGEgNzY4IGJpbnMgRkZUIGFuZCB3ZQorICAgICAgICAgKiBuZWVkIDY0IFFNRiB1bml0cyBzbyBmYWN0b3IgNzY4LzY0ID0gMTIgKi8KKyAgICAgICAgaWYgKHBpdGNoSW5CaW5zID49IHBtaW4gKiAoMSArIGJTYnI0MSkpIHsKKyAgICAgICAgICBpbnQgdHIsIHRpMSwgdGkyLCBtVHIgPSAwLCB0czEgPSAwLCB0czIgPSAwLCBtVmFsX2UgPSAwLCB0ZW1wX2UgPSAwOworICAgICAgICAgIGludCBzcW1hZzBfZSA9CisgICAgICAgICAgICAgIFNDQUxFMkVYUCgtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisKKyAgICAgICAgICBGSVhQX0RCTCBtVmFsX0YgPSBGTDJGWENPTlNUX0RCTCgwLmYpLCBzcW1hZzBfRiwgc3FtYWcxX0YsIHNxbWFnMl9GLAorICAgICAgICAgICAgICAgICAgIHRlbXBfRiwgZjFfRjsgLyogYWxsIGVxdWFsIGV4cG9uZW50ICovCisgICAgICAgICAgc2lnbiA9IC0xOworCisgICAgICAgICAgc291cmNlYmFuZCA9IDIgKiBiYW5kIC8gc3RyZXRjaCAtIHFtZk9mZnNldDsgLyogY29uc2lzdGVudCB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgY29tcHV0ZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXRjaCA9IDMsNC4gKi8KKyAgICAgICAgICBGREtfQVNTRVJUKHNvdXJjZWJhbmQgPj0gMCk7CisKKyAgICAgICAgICBGSVhQX0RCTCBzcW1hZzBSX0YgPQorICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldF1bc291cmNlYmFuZF07CisgICAgICAgICAgRklYUF9EQkwgc3FtYWcwSV9GID0KKyAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3NvdXJjZWJhbmRdOworICAgICAgICAgIHNjYWxlVXAoJnNxbWFnMFJfRiwgJnNxbWFnMElfRiwgJnNxbWFnMF9lKTsKKworICAgICAgICAgIHNxbWFnMF9GID0gZlBvdzJEaXYyKHNxbWFnMFJfRik7CisgICAgICAgICAgc3FtYWcwX0YgKz0gZlBvdzJEaXYyKHNxbWFnMElfRik7CisgICAgICAgICAgc3FtYWcwX2UgPSAyICogc3FtYWcwX2UgKyAxOworCisgICAgICAgICAgZm9yICh0ciA9IDE7IHRyIDwgc3RyZXRjaDsgdHIrKykgeworICAgICAgICAgICAgaW50IHNxbWFnMV9lID0KKyAgICAgICAgICAgICAgICBTQ0FMRTJFWFAoLWhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYub3V0U2NhbGVmYWN0b3IpOworICAgICAgICAgICAgaW50IHNxbWFnMl9lID0KKyAgICAgICAgICAgICAgICBTQ0FMRTJFWFAoLWhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYub3V0U2NhbGVmYWN0b3IpOworCisgICAgICAgICAgICBGSVhQX0RCTCB0bXBfYmFuZCA9IGJhbmRfRltiYW5kXTsKKyAgICAgICAgICAgIEZJWFBfREJMIHRyX3AgPQorICAgICAgICAgICAgICAgIGZNdWx0KHBfRltwaXRjaEluQmluc10gPj4gYlNicjQxLCB0cl9zdHJbdHIgLSAxXSk7IC8qIHNjYWxlIDcgKi8KKyAgICAgICAgICAgIGYxX0YgPQorICAgICAgICAgICAgICAgIGZNdWx0KHRtcF9iYW5kIC0gdHJfcCwgc3RyZXRjaGZhY1tzdHJldGNoIC0gMl0pOyAvKiBzY2FsZSA3ICovCisgICAgICAgICAgICB0aTEgPSAoSU5UKShmMV9GID4+IChERlJBQ1RfQklUUyAtIDEgLSA3KSkgLSBxbWZPZmZzZXQ7CisgICAgICAgICAgICB0aTIgPSAoSU5UKSgoKGYxX0YpICsgKChwX0ZbcGl0Y2hJbkJpbnNdID4+IGJTYnI0MSkgPj4gMikpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAoREZSQUNUX0JJVFMgLSAxIC0gNykpIC0KKyAgICAgICAgICAgICAgICAgIHFtZk9mZnNldDsKKworICAgICAgICAgICAgaWYgKHRpMSA+PSAwICYmIHRpMiA8IDIgKiBoUW1mVHJhbnNwb3Nlci0+c3ludGhTaXplKSB7CisgICAgICAgICAgICAgIEZJWFBfREJMIHNxbWFnMVJfRiA9CisgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldF1bdGkxXTsKKyAgICAgICAgICAgICAgRklYUF9EQkwgc3FtYWcxSV9GID0KKyAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRltzbG90T2Zmc2V0XVt0aTFdOworICAgICAgICAgICAgICBzY2FsZVVwKCZzcW1hZzFSX0YsICZzcW1hZzFJX0YsICZzcW1hZzFfZSk7CisgICAgICAgICAgICAgIHNxbWFnMV9GID0gZlBvdzJEaXYyKHNxbWFnMVJfRik7CisgICAgICAgICAgICAgIHNxbWFnMV9GICs9IGZQb3cyRGl2MihzcW1hZzFJX0YpOworICAgICAgICAgICAgICBzcW1hZzFfZSA9IDIgKiBzcW1hZzFfZSArIDE7CisKKyAgICAgICAgICAgICAgRklYUF9EQkwgc3FtYWcyUl9GID0KKyAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltzbG90T2Zmc2V0XVt0aTJdOworICAgICAgICAgICAgICBGSVhQX0RCTCBzcW1hZzJJX0YgPQorICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3RpMl07CisgICAgICAgICAgICAgIHNjYWxlVXAoJnNxbWFnMlJfRiwgJnNxbWFnMklfRiwgJnNxbWFnMl9lKTsKKyAgICAgICAgICAgICAgc3FtYWcyX0YgPSBmUG93MkRpdjIoc3FtYWcyUl9GKTsKKyAgICAgICAgICAgICAgc3FtYWcyX0YgKz0gZlBvdzJEaXYyKHNxbWFnMklfRik7CisgICAgICAgICAgICAgIHNxbWFnMl9lID0gMiAqIHNxbWFnMl9lICsgMTsKKworICAgICAgICAgICAgICBpbnQgc2hpZnQxID0gZk1pbihmTWF4KHNxbWFnMV9lLCBzcW1hZzJfZSkgLSBzcW1hZzFfZSwgMzEpOworICAgICAgICAgICAgICBpbnQgc2hpZnQyID0gZk1pbihmTWF4KHNxbWFnMV9lLCBzcW1hZzJfZSkgLSBzcW1hZzJfZSwgMzEpOworCisgICAgICAgICAgICAgIHRlbXBfRiA9IGZNaW4oKHNxbWFnMV9GID4+IHNoaWZ0MSksIChzcW1hZzJfRiA+PiBzaGlmdDIpKTsKKyAgICAgICAgICAgICAgdGVtcF9lID0gZk1heChzcW1hZzFfZSwgc3FtYWcyX2UpOworCisgICAgICAgICAgICAgIGludCBzaGlmdDMgPSBmTWluKGZNYXgodGVtcF9lLCBtVmFsX2UpIC0gdGVtcF9lLCAzMSk7CisgICAgICAgICAgICAgIGludCBzaGlmdDQgPSBmTWluKGZNYXgodGVtcF9lLCBtVmFsX2UpIC0gbVZhbF9lLCAzMSk7CisKKyAgICAgICAgICAgICAgaWYgKCh0ZW1wX0YgPj4gc2hpZnQzKSA+IChtVmFsX0YgPj4gc2hpZnQ0KSkgeworICAgICAgICAgICAgICAgIG1WYWxfRiA9IHRlbXBfRjsKKyAgICAgICAgICAgICAgICBtVmFsX2UgPSB0ZW1wX2U7IC8qIGVxdWFscyBzcW1hZzJfZSArIHNoaWZ0MiAqLworICAgICAgICAgICAgICAgIG1UciA9IHRyOworICAgICAgICAgICAgICAgIHRzMSA9IHRpMTsKKyAgICAgICAgICAgICAgICB0czIgPSB0aTI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbnQgc2hpZnQxID0gZk1pbihmTWF4KHNxbWFnMF9lLCBtVmFsX2UpIC0gc3FtYWcwX2UsIDMxKTsKKyAgICAgICAgICBpbnQgc2hpZnQyID0gZk1pbihmTWF4KHNxbWFnMF9lLCBtVmFsX2UpIC0gbVZhbF9lLCAzMSk7CisKKyAgICAgICAgICBpZiAoKG1WYWxfRiA+PiBzaGlmdDIpID4gKHNxbWFnMF9GID4+IHNoaWZ0MSkgJiYgdHMxID49IDAgJiYKKyAgICAgICAgICAgICAgdHMyIDwgMiAqIGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemUpIHsKKyAgICAgICAgICAgIElOVCBnYW1tYU91dF9lWzJdOworICAgICAgICAgICAgRklYUF9EQkwgZ2FtbWFPdXRSZWFsX21bMl0sIGdhbW1hT3V0SW1hZ19tWzJdOworICAgICAgICAgICAgRklYUF9EQkwgdG1wUmVhbF9tID0gKEZJWFBfREJMKTAsIHRtcEltYWdfbSA9IChGSVhQX0RCTCkwOworCisgICAgICAgICAgICBpbnQgVGNlbnRlciwgVHZlYzsKKworICAgICAgICAgICAgVGNlbnRlciA9IHN0cmV0Y2ggLSBtVHI7IC8qIGRlZmF1bHQgcGhhc2UgcG93ZXIgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgVHZlYyA9IG1UcjsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RyZXRjaCkgLyogMiB0YXAgYmxvY2sgY3JlYXRpb24gZGVzaWduIGRlcGVuZHMgb24gc3RyZXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlciAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgd2luZ2FpbiA9CisgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDUuZiAvIDEyLmYpOyAvKiBzdW0gb2YgdGFwcyBkaXZpZGVkIGJ5IHR3byAqLworCisgICAgICAgICAgICAgICAgaWYgKGhRbWZUcmFuc3Bvc2VyLT5iWFByb2R1Y3RzWzBdKSB7CisgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlclJlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW3Nsb3RPZmZzZXRdW3RzMV07CisgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlckltYWdfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3RzMV07CisKKyAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAyOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21ba10gPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW3Nsb3RPZmZzZXQgLSAxICsga11bdHMyXTsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNJbWFnX21ba10gPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXQgLSAxICsga11bdHMyXTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgZ2FtbWFDZW50ZXJfZVswXSA9IFNDQUxFMkVYUCgKKyAgICAgICAgICAgICAgICAgICAgICAtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisgICAgICAgICAgICAgICAgICBnYW1tYVZlY19lWzBdID0gZ2FtbWFWZWNfZVsxXSA9IFNDQUxFMkVYUCgKKyAgICAgICAgICAgICAgICAgICAgICAtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICB3aW5nYWluID0KKyAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoNi5mIC8gMTIuZik7IC8qIHN1bSBvZiB0YXBzIGRpdmlkZWQgYnkgdHdvICovCisgICAgICAgICAgICAgICAgaWYgKGhRbWZUcmFuc3Bvc2VyLT5iWFByb2R1Y3RzWzJdKSB7CisgICAgICAgICAgICAgICAgICBpZiAobVRyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFDZW50ZXJSZWFsX21bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW3Nsb3RPZmZzZXRdW3RzMV07CisgICAgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVySW1hZ19tWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRltzbG90T2Zmc2V0XVt0czFdOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAyOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVtrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmUmVhbF9GW3Nsb3RPZmZzZXQgKyAyICogKGsgLSAxKV1bdHMyXTsKKyAgICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVtrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXQgKyAyICogKGsgLSAxKV1bdHMyXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVHIgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlclJlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldF1bdHMxXTsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFDZW50ZXJJbWFnX21bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3RzMV07CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tW2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldCArIChrIC0gMSldW3RzMl07CisgICAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNJbWFnX21ba10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZkltYWdfRltzbG90T2Zmc2V0ICsgKGsgLSAxKV1bdHMyXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSBlbHNlIC8qIChtVHIgPT0gMykgKi8KKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIFRjZW50ZXIgPSBtVHI7IC8qIG9wcG9zaXRlIHBoYXNlIHBvd2VyIHBhcmFtZXRlcnMgYXMgdHMyIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciAqLworICAgICAgICAgICAgICAgICAgICBUdmVjID0gc3RyZXRjaCAtIG1UcjsKKworICAgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlclJlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldF1bdHMyXTsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFDZW50ZXJJbWFnX21bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3RzMl07CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tW2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldCArIDIgKiAoayAtIDEpXVt0czFdOworICAgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjSW1hZ19tW2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldCArIDIgKiAoayAtIDEpXVt0czFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVyX2VbMF0gPSBTQ0FMRTJFWFAoCisgICAgICAgICAgICAgICAgICAgICAgLWhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYub3V0U2NhbGVmYWN0b3IpOworICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNfZVswXSA9IGdhbW1hVmVjX2VbMV0gPSBTQ0FMRTJFWFAoCisgICAgICAgICAgICAgICAgICAgICAgLWhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYub3V0U2NhbGVmYWN0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgd2luZ2FpbiA9IEZMMkZYQ09OU1RfREJMKDUuNjU2OGYgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMi5mKTsgLyogc3VtIG9mIHRhcHMgZGl2aWRlZCBieSB0d28gKi8KKworICAgICAgICAgICAgICAgIGlmIChoUW1mVHJhbnNwb3Nlci0+YlhQcm9kdWN0c1sxXSkgeworICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wUmVhbF9GLCB0bXBJbWFnX0Y7CisgICAgICAgICAgICAgICAgICBpZiAobVRyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFDZW50ZXJSZWFsX21bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW3Nsb3RPZmZzZXRdW3RzMV07CisgICAgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVySW1hZ19tWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRltzbG90T2Zmc2V0XVt0czFdOworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldF1bdHMyXTsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNJbWFnX21bMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3RzMl07CisKKyAgICAgICAgICAgICAgICAgICAgYWRkcnNoaWZ0ID0gLTI7CisgICAgICAgICAgICAgICAgICAgIHRtcFJlYWxfRiA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZSZWFsX0ZbYWRkcnNoaWZ0ICsgc2xvdE9mZnNldF1bdHMyXTsKKyAgICAgICAgICAgICAgICAgICAgdG1wSW1hZ19GID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZkltYWdfRlthZGRyc2hpZnQgKyBzbG90T2Zmc2V0XVt0czJdOworCisgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChmTXVsdChmYWN0b3JzW3RzMiAlIDRdLCB0bXBSZWFsX0YpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChmYWN0b3JzWyh0czIgKyAzKSAlIDRdLCB0bXBJbWFnX0YpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNJbWFnX21bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0KGZhY3RvcnNbKHRzMiArIDMpICUgNF0sIHRtcFJlYWxfRikgKworICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGZhY3RvcnNbdHMyICUgNF0sIHRtcEltYWdfRikpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAxOworCisgICAgICAgICAgICAgICAgICAgIHRtcFJlYWxfRiA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZSZWFsX0ZbYWRkcnNoaWZ0ICsgMSArIHNsb3RPZmZzZXRdW3RzMl07CisgICAgICAgICAgICAgICAgICAgIHRtcEltYWdfRiA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZJbWFnX0ZbYWRkcnNoaWZ0ICsgMSArIHNsb3RPZmZzZXRdW3RzMl07CisKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21bMF0gKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIChmTXVsdChmYWN0b3JzW3RzMiAlIDRdLCB0bXBSZWFsX0YpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChmYWN0b3JzWyh0czIgKyAxKSAlIDRdLCB0bXBJbWFnX0YpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNJbWFnX21bMF0gKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIChmTXVsdChmYWN0b3JzWyh0czIgKyAxKSAlIDRdLCB0bXBSZWFsX0YpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChmYWN0b3JzW3RzMiAlIDRdLCB0bXBJbWFnX0YpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgMTsKKworICAgICAgICAgICAgICAgICAgfSBlbHNlIC8qIChtVHIgPT0gMikgKi8KKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIFRjZW50ZXIgPSBtVHI7IC8qIG9wcG9zaXRlIHBoYXNlIHBvd2VyIHBhcmFtZXRlcnMgYXMgdHMyIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciAqLworICAgICAgICAgICAgICAgICAgICBUdmVjID0gc3RyZXRjaCAtIG1UcjsKKworICAgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlclJlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldF1bdHMyXTsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFDZW50ZXJJbWFnX21bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3RzMl07CisgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltzbG90T2Zmc2V0XVt0czFdOworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldF1bdHMxXTsKKworICAgICAgICAgICAgICAgICAgICBhZGRyc2hpZnQgPSAtMjsKKyAgICAgICAgICAgICAgICAgICAgdG1wUmVhbF9GID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZlJlYWxfRlthZGRyc2hpZnQgKyBzbG90T2Zmc2V0XVt0czFdOworICAgICAgICAgICAgICAgICAgICB0bXBJbWFnX0YgPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmSW1hZ19GW2FkZHJzaGlmdCArIHNsb3RPZmZzZXRdW3RzMV07CisKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0KGZhY3RvcnNbdHMxICUgNF0sIHRtcFJlYWxfRikgLQorICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGZhY3RvcnNbKHRzMSArIDMpICUgNF0sIHRtcEltYWdfRikpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHQoZmFjdG9yc1sodHMxICsgMykgJSA0XSwgdG1wUmVhbF9GKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoZmFjdG9yc1t0czEgJSA0XSwgdG1wSW1hZ19GKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDE7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wUmVhbF9GID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZlJlYWxfRlthZGRyc2hpZnQgKyAxICsgc2xvdE9mZnNldF1bdHMxXTsKKyAgICAgICAgICAgICAgICAgICAgdG1wSW1hZ19GID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZkltYWdfRlthZGRyc2hpZnQgKyAxICsgc2xvdE9mZnNldF1bdHMxXTsKKworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVswXSArPQorICAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0KGZhY3RvcnNbdHMxICUgNF0sIHRtcFJlYWxfRikgLQorICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGZhY3RvcnNbKHRzMSArIDEpICUgNF0sIHRtcEltYWdfRikpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVswXSArPQorICAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0KGZhY3RvcnNbKHRzMSArIDEpICUgNF0sIHRtcFJlYWxfRikgKworICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGZhY3RvcnNbdHMxICUgNF0sIHRtcEltYWdfRikpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlcl9lWzBdID0gZ2FtbWFWZWNfZVsxXSA9IFNDQUxFMkVYUCgKKyAgICAgICAgICAgICAgICAgICAgICAtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisgICAgICAgICAgICAgICAgICBnYW1tYVZlY19lWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICBTQ0FMRTJFWFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1oUW1mVHJhbnNwb3Nlci0+SEJFQW5hbHlzaXNjUU1GLm91dFNjYWxlZmFjdG9yKSArCisgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gLyogc3RyZXRjaCBjYXNlcyAqLworCisgICAgICAgICAgICAvKiBwYXJhbWV0ZXIgY29udHJvbGxlZCBwaGFzZSBtb2RpZmljYXRpb24gcGFydHMgKi8KKyAgICAgICAgICAgIC8qIG1heGltdW0gKl9lID09IDIwICovCisgICAgICAgICAgICBjYWxjdWxhdGVDZW50ZXJGSVhQKGdhbW1hQ2VudGVyUmVhbF9tWzBdLCBnYW1tYUNlbnRlckltYWdfbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdhbW1hQ2VudGVyUmVhbF9tWzBdLCAmZ2FtbWFDZW50ZXJJbWFnX21bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnYW1tYUNlbnRlcl9lWzBdLCBzdHJldGNoLCBUY2VudGVyIC0gMSk7CisgICAgICAgICAgICBjYWxjdWxhdGVDZW50ZXJGSVhQKGdhbW1hVmVjUmVhbF9tWzBdLCBnYW1tYVZlY0ltYWdfbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdhbW1hVmVjUmVhbF9tWzBdLCAmZ2FtbWFWZWNJbWFnX21bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnYW1tYVZlY19lWzBdLCBzdHJldGNoLCBUdmVjIC0gMSk7CisgICAgICAgICAgICBjYWxjdWxhdGVDZW50ZXJGSVhQKGdhbW1hVmVjUmVhbF9tWzFdLCBnYW1tYVZlY0ltYWdfbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdhbW1hVmVjUmVhbF9tWzFdLCAmZ2FtbWFWZWNJbWFnX21bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnYW1tYVZlY19lWzFdLCBzdHJldGNoLCBUdmVjIC0gMSk7CisKKyAgICAgICAgICAgIC8qICAgIEZpbmFsIG11bHRpcGxpY2F0aW9uIG9mIHByZXBhcmVkIHBhcnRzICAqLworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworICAgICAgICAgICAgICBnYW1tYU91dFJlYWxfbVtrXSA9CisgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoZ2FtbWFWZWNSZWFsX21ba10sIGdhbW1hQ2VudGVyUmVhbF9tWzBdKSAtCisgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoZ2FtbWFWZWNJbWFnX21ba10sIGdhbW1hQ2VudGVySW1hZ19tWzBdKTsKKyAgICAgICAgICAgICAgZ2FtbWFPdXRJbWFnX21ba10gPQorICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGdhbW1hVmVjUmVhbF9tW2tdLCBnYW1tYUNlbnRlckltYWdfbVswXSkgKworICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGdhbW1hVmVjSW1hZ19tW2tdLCBnYW1tYUNlbnRlclJlYWxfbVswXSk7CisgICAgICAgICAgICAgIGdhbW1hT3V0X2Vba10gPSBnYW1tYUNlbnRlcl9lWzBdICsgZ2FtbWFWZWNfZVtrXSArIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNjYWxlVXAoJmdhbW1hT3V0UmVhbF9tWzBdLCAmZ2FtbWFPdXRJbWFnX21bMF0sICZnYW1tYU91dF9lWzBdKTsKKyAgICAgICAgICAgIHNjYWxlVXAoJmdhbW1hT3V0UmVhbF9tWzFdLCAmZ2FtbWFPdXRJbWFnX21bMV0sICZnYW1tYU91dF9lWzFdKTsKKyAgICAgICAgICAgIEZES19BU1NFUlQoZ2FtbWFPdXRfZVswXSA+PSAwKTsKKyAgICAgICAgICAgIEZES19BU1NFUlQoZ2FtbWFPdXRfZVswXSA8IDMyKTsKKworICAgICAgICAgICAgdG1wUmVhbF9tID0gZ2FtbWFPdXRSZWFsX21bMF07CisgICAgICAgICAgICB0bXBJbWFnX20gPSBnYW1tYU91dEltYWdfbVswXTsKKworICAgICAgICAgICAgSU5UIG1vZHN0cmV0Y2g0ID0gKChzdHJldGNoID09IDQpICYmIChtVHIgPT0gMikpOworCisgICAgICAgICAgICBGSVhQX0RCTCBjb3NfdHdpZCA9IHR3aWRfbV9uZXdbc3RyZXRjaCAtIDIgLSBtb2RzdHJldGNoNF1bMF07CisgICAgICAgICAgICBGSVhQX0RCTCBzaW5fdHdpZCA9IHNpZ24gKiB0d2lkX21fbmV3W3N0cmV0Y2ggLSAyIC0gbW9kc3RyZXRjaDRdWzFdOworCisgICAgICAgICAgICBnYW1tYU91dFJlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgZk11bHQodG1wUmVhbF9tLCBjb3NfdHdpZCkgLQorICAgICAgICAgICAgICAgIGZNdWx0KHRtcEltYWdfbSwgc2luX3R3aWQpOyAvKiBzdW0gc2hvdWxkIGJlIDw9IDEgYmVjYXVzZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW4vY29zIG11bHRpcGxpY2F0aW9uICovCisgICAgICAgICAgICBnYW1tYU91dEltYWdfbVswXSA9CisgICAgICAgICAgICAgICAgZk11bHQodG1wSW1hZ19tLCBjb3NfdHdpZCkgKworICAgICAgICAgICAgICAgIGZNdWx0KHRtcFJlYWxfbSwgc2luX3R3aWQpOyAvKiBzdW0gc2hvdWxkIGJlIDw9IDEgYmVjYXVzZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW4vY29zIG11bHRpcGxpY2F0aW9uICovCisKKyAgICAgICAgICAgIC8qIHdpbmdhaW4gKi8KKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAyOyBrKyspIHsKKyAgICAgICAgICAgICAgZ2FtbWFPdXRSZWFsX21ba10gPSAoZk11bHQoZ2FtbWFPdXRSZWFsX21ba10sIHdpbmdhaW4pIDw8IDEpOworICAgICAgICAgICAgICBnYW1tYU91dEltYWdfbVtrXSA9IChmTXVsdChnYW1tYU91dEltYWdfbVtrXSwgd2luZ2FpbikgPDwgMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdhbW1hT3V0UmVhbF9tWzFdID4+PSAxOworICAgICAgICAgICAgZ2FtbWFPdXRJbWFnX21bMV0gPj49IDE7CisgICAgICAgICAgICBnYW1tYU91dF9lWzBdICs9IDI7CisgICAgICAgICAgICBnYW1tYU91dF9lWzFdICs9IDI7CisKKyAgICAgICAgICAgIC8qIE9MQSBpbmNsdWRpbmcgd2luZG93IHNjYWxpbmcgYnkgd2luZ2Fpbi8zICovCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjsgaysrKSAvKiBuZWVkIGs9MSB0byBjb3JyZXNwb25kIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFpbk1vZEltYWdbc2xvdE9mZnNldF0gLT4gb3V0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKjIrKHNsb3RPZmZzZXQtb2Zmc2V0KSAgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZlJlYWxfRlsoayArIHNsb3RPZmZzZXQgLSAxKV1bYmFuZF0gKz0KKyAgICAgICAgICAgICAgICAgIGdhbW1hT3V0UmVhbF9tW2tdID4+IChzY2FsZV9mYWN0b3JfaGJlIC0gZ2FtbWFPdXRfZVtrXSk7CisgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZJbWFnX0ZbKGsgKyBzbG90T2Zmc2V0IC0gMSldW2JhbmRdICs9CisgICAgICAgICAgICAgICAgICBnYW1tYU91dEltYWdfbVtrXSA+PiAoc2NhbGVfZmFjdG9yX2hiZSAtIGdhbW1hT3V0X2Vba10pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gLyogbVZhbCA+IHFUaHJRTUYgKiBxVGhyUU1GICogc3FtYWcwICYmIHRzMSA+IDAgJiYgdHMyIDwgNjQgKi8KKyAgICAgICAgfSAgIC8qIHAgPj0gcG1pbiAqLworICAgICAgfSAgICAgLyogZm9yIGJhbmQgKi8KKyAgICB9ICAgICAgIC8qIGZvciBzdHJldGNoICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgUU1GX1dJTl9MRU4gLSAxOyBpKyspIHsKKyAgICAgIEZES21lbWNweShoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0ZbaV0sCisgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW2kgKyAxXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5ub19jaGFubmVscyk7CisgICAgICBGREttZW1jcHkoaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW2ldLAorICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRltpICsgMV0sCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIGhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYubm9fY2hhbm5lbHMpOworICAgIH0KKworICAgIGlmIChrZWVwU3RhdGVzU3luY2VkTW9kZSAhPSBLRUVQX1NUQVRFU19TWU5DRURfTk9PVVQpIHsKKyAgICAgIGlmICgyICogaiA+PSBvZmZzZXQpIHsKKyAgICAgICAgLyogY29weSBmaXJzdCB0d28gc2xvdHMgb2YgaW50ZXJuYWwgYnVmZmVyIHRvIG91dHB1dCAqLworICAgICAgICBpZiAoa2VlcFN0YXRlc1N5bmNlZE1vZGUgPT0gS0VFUF9TVEFURVNfU1lOQ0VEX09VVERJRkYpIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBGREttZW1jcHkoJnBwUW1mQnVmZmVyT3V0UmVhbF9GWzIgKiBqIC0gb2Zmc2V0ICsgaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdXSwKKyAgICAgICAgICAgICAgICAgICAgICAmaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSEJFQnVmUmVhbF9GW2ldW2hRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZlswXV0sCisgICAgICAgICAgICAgICAgICAgICAgKFFNRl9TWU5USF9DSEFOTkVMUyAtIGhRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZlswXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICAgIEZES21lbWNweSgmcHBRbWZCdWZmZXJPdXRJbWFnX0ZbMiAqIGogLSBvZmZzZXQgKyBpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF1dLAorICAgICAgICAgICAgICAgICAgICAgICZoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZIQkVCdWZJbWFnX0ZbaV1baFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdXSwKKyAgICAgICAgICAgICAgICAgICAgICAoUU1GX1NZTlRIX0NIQU5ORUxTIC0gaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBGREttZW1jcHkoJnBwUW1mQnVmZmVyT3V0UmVhbF9GWzIgKiBqICsgaSArIG92X2xlbl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdXSwKKyAgICAgICAgICAgICAgICAgICAgICAmaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSEJFQnVmUmVhbF9GW2ldW2hRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZlswXV0sCisgICAgICAgICAgICAgICAgICAgICAgKFFNRl9TWU5USF9DSEFOTkVMUyAtIGhRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZlswXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICAgIEZES21lbWNweSgmcHBRbWZCdWZmZXJPdXRJbWFnX0ZbMiAqIGogKyBpICsgb3ZfbGVuXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF1dLAorICAgICAgICAgICAgICAgICAgICAgICZoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZIQkVCdWZJbWFnX0ZbaV1baFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdXSwKKyAgICAgICAgICAgICAgICAgICAgICAoUU1GX1NZTlRIX0NIQU5ORUxTIC0gaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIG1vdmUgc2xvdHMgdXAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgSEJFX01BWF9PVVRfU0xPVFMgLSAyOyBpKyspIHsKKyAgICAgIEZES21lbWNweSgKKyAgICAgICAgICAmaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZlJlYWxfRltpXVtoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF1dLAorICAgICAgICAgICZoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmUmVhbF9GW2kgKyAyXVtoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF1dLAorICAgICAgICAgIChRTUZfU1lOVEhfQ0hBTk5FTFMgLSBoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF0pICoKKyAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jcHkoCisgICAgICAgICAgJmhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZJbWFnX0ZbaV1baFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdXSwKKyAgICAgICAgICAmaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZkltYWdfRltpICsgMl1baFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdXSwKKyAgICAgICAgICAoUU1GX1NZTlRIX0NIQU5ORUxTIC0gaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdKSAqCisgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpOworICAgIH0KKworICAgIC8qIGZpbmFsbHkgc2V0IGxhc3QgdHdvIHNsb3QgdG8gemVybyAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIEZES21lbXNldCgmaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZlJlYWxfRltIQkVfTUFYX09VVF9TTE9UUyAtIDEgLSBpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZlswXV0sCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAoUU1GX1NZTlRIX0NIQU5ORUxTIC0gaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdKSAqCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtc2V0KCZoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmSW1hZ19GW0hCRV9NQVhfT1VUX1NMT1RTIC0gMSAtIGldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdXSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIChRTUZfU1lOVEhfQ0hBTk5FTFMgLSBoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF0pICoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQorICB9IC8qIHFtZlZvY29kZXJDb2xzSW4gKi8KKworICBpZiAoa2VlcFN0YXRlc1N5bmNlZE1vZGUgIT0gS0VFUF9TVEFURVNfU1lOQ0VEX05PT1VUKSB7CisgICAgaWYgKGtlZXBTdGF0ZXNTeW5jZWRNb2RlID09IEtFRVBfU1RBVEVTX1NZTkNFRF9PVVRESUZGKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgb3ZfbGVuICsgTFBDX09SREVSOyBpKyspIHsKKyAgICAgICAgZm9yIChiYW5kID0gaFFtZlRyYW5zcG9zZXItPnN0YXJ0QmFuZDsgYmFuZCA8IGhRbWZUcmFuc3Bvc2VyLT5zdG9wQmFuZDsKKyAgICAgICAgICAgICBiYW5kKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCB0bXBSID0gcHBRbWZCdWZmZXJPdXRSZWFsX0ZbaV1bYmFuZF07CisgICAgICAgICAgRklYUF9EQkwgdG1wSSA9IHBwUW1mQnVmZmVyT3V0SW1hZ19GW2ldW2JhbmRdOworCisgICAgICAgICAgcHBRbWZCdWZmZXJPdXRSZWFsX0ZbaV1bYmFuZF0gPQorICAgICAgICAgICAgICBmTXVsdCh0bXBSLCBjb3NfRltiYW5kXSkgLQorICAgICAgICAgICAgICBmTXVsdCh0bXBJLCAoLWNvc19GWzY0IC0gYmFuZCAtIDFdKSk7IC8qIHN1bSBzaG91bGQgYmUgPD0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2Ugb2Ygc2luL2NvcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpY2F0aW9uICovCisgICAgICAgICAgcHBRbWZCdWZmZXJPdXRJbWFnX0ZbaV1bYmFuZF0gPQorICAgICAgICAgICAgICBmTXVsdCh0bXBSLCAoLWNvc19GWzY0IC0gYmFuZCAtIDFdKSkgKworICAgICAgICAgICAgICBmTXVsdCh0bXBJLCBjb3NfRltiYW5kXSk7IC8qIHN1bSBzaG91bGQgYnkgPD0gMSBiZWNhdXNlIG9mIHNpbi9jb3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWNhdGlvbiAqLworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGhRbWZUcmFuc3Bvc2VyLT5ub0NvbHM7IGkrKykgeworICAgICAgICBmb3IgKGJhbmQgPSBoUW1mVHJhbnNwb3Nlci0+c3RhcnRCYW5kOyBiYW5kIDwgaFFtZlRyYW5zcG9zZXItPnN0b3BCYW5kOworICAgICAgICAgICAgIGJhbmQrKykgeworICAgICAgICAgIEZJWFBfREJMIHRtcFIgPSBwcFFtZkJ1ZmZlck91dFJlYWxfRltpICsgb3ZfbGVuXVtiYW5kXTsKKyAgICAgICAgICBGSVhQX0RCTCB0bXBJID0gcHBRbWZCdWZmZXJPdXRJbWFnX0ZbaSArIG92X2xlbl1bYmFuZF07CisKKyAgICAgICAgICBwcFFtZkJ1ZmZlck91dFJlYWxfRltpICsgb3ZfbGVuXVtiYW5kXSA9CisgICAgICAgICAgICAgIGZNdWx0KHRtcFIsIGNvc19GW2JhbmRdKSAtCisgICAgICAgICAgICAgIGZNdWx0KHRtcEksICgtY29zX0ZbNjQgLSBiYW5kIC0gMV0pKTsgLyogc3VtIHNob3VsZCBiZSA8PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSBvZiBzaW4vY29zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGljYXRpb24gKi8KKyAgICAgICAgICBwcFFtZkJ1ZmZlck91dEltYWdfRltpICsgb3ZfbGVuXVtiYW5kXSA9CisgICAgICAgICAgICAgIGZNdWx0KHRtcFIsICgtY29zX0ZbNjQgLSBiYW5kIC0gMV0pKSArCisgICAgICAgICAgICAgIGZNdWx0KHRtcEksIGNvc19GW2JhbmRdKTsgLyogc3VtIHNob3VsZCBieSA8PSAxIGJlY2F1c2Ugb2Ygc2luL2NvcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpY2F0aW9uICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAqc2NhbGVfaGIgPSBFWFAyU0NBTEUoc2NhbGVfZmFjdG9yX2hiZSk7Cit9CisKK2ludCogR2V0eE92ZXJCYW5kUW1mVHJhbnNwb3NlcihIQU5ETEVfSEJFX1RSQU5TUE9TRVIgaFFtZlRyYW5zcG9zZXIpIHsKKyAgaWYgKGhRbWZUcmFuc3Bvc2VyKQorICAgIHJldHVybiBoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWY7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IEdldDQxU2JyUW1mVHJhbnNwb3NlcihIQU5ETEVfSEJFX1RSQU5TUE9TRVIgaFFtZlRyYW5zcG9zZXIpIHsKKyAgaWYgKGhRbWZUcmFuc3Bvc2VyICE9IE5VTEwpCisgICAgcmV0dXJuIGhRbWZUcmFuc3Bvc2VyLT5iU2JyNDE7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvaGJlLmggYi9saWJTQlJkZWMvc3JjL2hiZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmZlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQlJkZWMvc3JjL2hiZS5oCkBAIC0wLDAgKzEsMjAwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSEJFX0gKKyNkZWZpbmUgSEJFX0gKKworI2luY2x1ZGUgInNicmRlY29kZXIuaCIKKworI2lmbmRlZiBRTUZfU1lOVEhfQ0hBTk5FTFMKKyNkZWZpbmUgUU1GX1NZTlRIX0NIQU5ORUxTICg2NCkKKyNlbmRpZgorCisjZGVmaW5lIEhCRV9RTUZfRklMVEVSX1NUQVRFX0FOQV9TSVpFICg0MDApCisjZGVmaW5lIEhCRV9RTUZfRklMVEVSX1NUQVRFX1NZTl9TSVpFICgyMDApCisKKyNpZm5kZWYgTUFYX05VTV9QQVRDSEVTX0hCRQorI2RlZmluZSBNQVhfTlVNX1BBVENIRVNfSEJFICg2KQorI2VuZGlmCisjZGVmaW5lIE1BWF9TVFJFVENIX0hCRSAoNCkKKwordHlwZWRlZiBlbnVtIHsKKyAgS0VFUF9TVEFURVNfU1lOQ0VEX09GRiA9IDAsICAgIC8qITwgbm9ybWFsIFFNRiB0cmFuc3Bvc2VyIGJlaGF2aW91ciAqLworICBLRUVQX1NUQVRFU19TWU5DRURfTk9STUFMID0gMSwgLyohPCBRTUYgdHJhbnNwb3NlciBjYWxsZWQgZm9yIHN5bmNpbmcgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcyB0aGUgbGFzdCA4LzE0IHNsb3RzIGFyZSBjYWxjdWxhdGVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG5leHQgZnJhbWUgaXMgSEJFICovCisgIEtFRVBfU1RBVEVTX1NZTkNFRF9PVVRESUZGID0KKyAgICAgIDIsIC8qITwgUU1GIHRyYW5zcG9zZXIgYmVoYXZpb3VyIGFzIGluIG5vcm1hbCBjYXNlLCBidXQgdGhlIGNhbGN1bGF0ZWQKKyAgICAgICAgICAgICAgc2xvdHMgYXJlIGRpcmVjdGx5IHdyaXR0ZW4gdG8gb3ZlcmxhcCBhcmVhIG9mIGJ1ZmZlcjsgb25seSB1c2VkIGluCisgICAgICAgICAgICAgIHJlc2V0U2JyRGVjIGZ1bmN0aW9uICovCisgIEtFRVBfU1RBVEVTX1NZTkNFRF9OT09VVCA9CisgICAgICAzIC8qITwgUU1GIHRyYW5zcG9zZXIgaXMgY2FsbGVkIGZvciBzeW5jaW5nIG9mIHN0YXRlcyBvbmx5LCBub3Qgb3V0cHV0CisgICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIGF0IGFsbDsgb25seSB1c2VkIGluIHJlc2V0U2JyRGVjIGZ1bmN0aW9uICovCit9IEtFRVBfU1RBVEVTX1NZTkNFRF9NT0RFOworCitzdHJ1Y3QgaGJlVHJhbnNwb3NlciB7CisgIGludCB4T3ZlclFtZltNQVhfTlVNX1BBVENIRVNfSEJFXTsKKworICBpbnQgbWF4U3RyZXRjaDsKKyAgaW50IHRpbWVEb21haW5XaW5MZW47CisgIGludCBxbWZJbkJ1ZlNpemU7CisgIGludCBxbWZPdXRCdWZTaXplOworICBpbnQgbm9Db2xzOworICBpbnQgbm9DaGFubmVsczsKKyAgaW50IHN0YXJ0QmFuZDsKKyAgaW50IHN0b3BCYW5kOworICBpbnQgYlNicjQxOworCisgIElOVF9QQ00gKmluQnVmX0Y7CisgIEZJWFBfREJMICoqcW1mSW5CdWZSZWFsX0Y7CisgIEZJWFBfREJMICoqcW1mSW5CdWZJbWFnX0Y7CisKKyAgRklYUF9EQkwgKnFtZkJ1ZmZlckNvZGVjVGVtcFNsb3RfRjsKKworICBRTUZfRklMVEVSX0JBTksgSEJFQW5hbHlzaXNjUU1GOworICBRTUZfRklMVEVSX0JBTksgSEJFU3ludGhlc2lzUU1GOworCisgIEZJWFBfREJMIGNvbnN0ICpzeW50aGVzaXNRbWZQcmVNb2RDb3NfRjsKKyAgRklYUF9EQkwgY29uc3QgKnN5bnRoZXNpc1FtZlByZU1vZFNpbl9GOworCisgIEZJWFBfUUFTIGFuYVFtZlN0YXRlc1tIQkVfUU1GX0ZJTFRFUl9TVEFURV9BTkFfU0laRV07CisgIEZJWFBfUVNTIHN5blFtZlN0YXRlc1tIQkVfUU1GX0ZJTFRFUl9TVEFURV9TWU5fU0laRV07CisKKyAgRklYUF9EQkwgKipxbWZIQkVCdWZSZWFsX0Y7CisgIEZJWFBfREJMICoqcW1mSEJFQnVmSW1hZ19GOworCisgIGludCBiWFByb2R1Y3RzW01BWF9TVFJFVENIX0hCRV07CisKKyAgaW50IGtzdGFydDsKKyAgaW50IHN5bnRoU2l6ZTsKKworICBpbnQgaGlnaGJhbmRfZXhwWzJdOworICBpbnQgdGFyZ2V0X2V4cFsyXTsKK307CisKK3R5cGVkZWYgc3RydWN0IGhiZVRyYW5zcG9zZXIgKkhBTkRMRV9IQkVfVFJBTlNQT1NFUjsKKworU0JSX0VSUk9SIFFtZlRyYW5zcG9zZXJDcmVhdGUoSEFORExFX0hCRV9UUkFOU1BPU0VSICpoUW1mVHJhbnNwb3NlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZVNpemUsIGludCBiRGlzYWJsZUNyb3NzUHJvZHVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYlNicjQxKTsKKworU0JSX0VSUk9SIFFtZlRyYW5zcG9zZXJSZUluaXQoSEFORExFX0hCRV9UUkFOU1BPU0VSIGhRbWZUcmFuc3Bvc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKkZyZXFCYW5kVGFibGVbMl0sIFVDSEFSIE5TZmJbMl0pOworCit2b2lkIFFtZlRyYW5zcG9zZXJDbG9zZShIQU5ETEVfSEJFX1RSQU5TUE9TRVIgaFFtZlRyYW5zcG9zZXIpOworCit2b2lkIFFtZlRyYW5zcG9zZXJBcHBseShIQU5ETEVfSEJFX1RSQU5TUE9TRVIgaFFtZlRyYW5zcG9zZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlckNvZGVjUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mQnVmZmVyQ29kZWNJbWFnLCBpbnQgbkNvbHNJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcHBRbWZCdWZmZXJPdXRSZWFsX0YsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnBwUW1mQnVmZmVyT3V0SW1hZ19GLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbHBjRmlsdGVyU3RhdGVzUmVhbFsyICsgKDMgKiAoNCkpXVsoNjQpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGxwY0ZpbHRlclN0YXRlc0ltYWdbMiArICgzICogKDQpKV1bKDY0KV0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hJbkJpbnMsIGludCBzY2FsZV9sYiwgaW50IHNjYWxlX2hiZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2NhbGVfaGIsIGludCB0aW1lU3RlcCwgaW50IGZpcnN0U2xvdE9mZnNzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgS0VFUF9TVEFURVNfU1lOQ0VEX01PREUga2VlcFN0YXRlc1N5bmNlZE1vZGUpOworCitpbnQgKkdldHhPdmVyQmFuZFFtZlRyYW5zcG9zZXIoSEFORExFX0hCRV9UUkFOU1BPU0VSIGhRbWZUcmFuc3Bvc2VyKTsKKworaW50IEdldDQxU2JyUW1mVHJhbnNwb3NlcihIQU5ETEVfSEJFX1RSQU5TUE9TRVIgaFFtZlRyYW5zcG9zZXIpOworI2VuZGlmIC8qIEhCRV9IICovCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL2h1ZmZfZGVjLmNwcCBiL2xpYlNCUmRlYy9zcmMvaHVmZl9kZWMuY3BwCmluZGV4IDMxZDY4NmQuLjkwYzk1NDEgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvaHVmZl9kZWMuY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvaHVmZl9kZWMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDExICs5MCwxOSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIEh1ZmZtYW4gRGVjb2RlciAgCisgIFxicmllZiAgSHVmZm1hbiBEZWNvZGVyCiAqLwogCiAjaW5jbHVkZSAiaHVmZl9kZWMuaCIKQEAgLTEwMSwyMCArMTIwLDE4IEBACiAgIFxhdXRob3IKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotRGVjb2RlSHVmZm1hbkNXIChIdWZmbWFuIGgsICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBodWZmbWFuIGNvZGVib29rIHRhYmxlICovCi0gICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcykgLyohPCBIYW5kbGUgdG8gQml0YnVmZmVyICovCitpbnQgRGVjb2RlSHVmZm1hbkNXKEh1ZmZtYW4gaCwgLyohPCBwb2ludGVyIHRvIGh1ZmZtYW4gY29kZWJvb2sgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKSAvKiE8IEhhbmRsZSB0byBCaXRidWZmZXIgKi8KIHsKICAgU0NIQVIgaW5kZXggPSAwOwogICBpbnQgdmFsdWUsIGJpdDsKIAogICB3aGlsZSAoaW5kZXggPj0gMCkgewotICAgIGJpdCA9IEZES3JlYWRCaXRzIChoQnMsIDEpOworICAgIGJpdCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CiAgICAgaW5kZXggPSBoW2luZGV4XVtiaXRdOwogICB9CiAKLSAgdmFsdWUgPSBpbmRleCs2NDsgLyogQWRkIG9mZnNldCAqLwotCisgIHZhbHVlID0gaW5kZXggKyA2NDsgLyogQWRkIG9mZnNldCAqLwogCiAgIHJldHVybiB2YWx1ZTsKIH0KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvaHVmZl9kZWMuaCBiL2xpYlNCUmRlYy9zcmMvaHVmZl9kZWMuaAppbmRleCA1NDQzNjU4Li45YWE2MmI0IDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL2h1ZmZfZGVjLmgKKysrIGIvbGliU0JSZGVjL3NyYy9odWZmX2RlYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIyICs5MCwyOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIEh1ZmZtYW4gRGVjb2RlciAgCisgIFxicmllZiAgSHVmZm1hbiBEZWNvZGVyCiAqLwotI2lmbmRlZiBfX0hVRkZfREVDX0gKLSNkZWZpbmUgX19IVUZGX0RFQ19ICisjaWZuZGVmIEhVRkZfREVDX0gKKyNkZWZpbmUgSFVGRl9ERUNfSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKIAogdHlwZWRlZiBjb25zdCBTQ0hBUiAoKkh1ZmZtYW4pWzJdOwogCi1pbnQKLURlY29kZUh1ZmZtYW5DVyAoSHVmZm1hbiBoLAotICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmKTsKK2ludCBEZWNvZGVIdWZmbWFuQ1coSHVmZm1hbiBoLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL2xwcF90cmFuLmNwcCBiL2xpYlNCUmRlYy9zcmMvbHBwX3RyYW4uY3BwCmluZGV4IGFlMjgyZDUuLjJlZjA3ZWIgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvbHBwX3RyYW4uY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvbHBwX3RyYW4uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE5ICs5MCwzMCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIExvdyBQb3dlciBQcm9maWxlIFRyYW5zcG9zZXIsICAKLSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIHRyYW5zcG9zZXIuIFRoZSBtYWluIGVudHJ5IHBvaW50IGlzIGxwcFRyYW5zcG9zZXIoKS4gVGhlIGZ1bmN0aW9uIGdlbmVyYXRlcwotICBoaWdoIGZyZXF1ZW5jeSBjb250ZW50IGJ5IGNvcHlpbmcgZGF0YSBmcm9tIHRoZSBsb3cgYmFuZCAocHJvdmlkZWQgYnkgY29yZSBjb2RlYykgaW50byB0aGUgaGlnaCBiYW5kLgotICBUaGlzIHByb2Nlc3MgaXMgYWxzbyByZWZlcnJlZCB0byBhcyAicGF0Y2hpbmciLiBUaGUgZnVuY3Rpb24gYWxzbyBpbXBsZW1lbnRzIHNwZWN0cmFsIHdoaXRlbmluZyBieSBtZWFucyBvZgotICBpbnZlcnNlIGZpbHRlcmluZyBiYXNlZCBvbiBMUEMgY29lZmZpY2llbnRzLgorICBcYnJpZWYgIExvdyBQb3dlciBQcm9maWxlIFRyYW5zcG9zZXIKKyAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIHRyYW5zcG9zZXIuIFRoZSBtYWluIGVudHJ5IHBvaW50IGlzIGxwcFRyYW5zcG9zZXIoKS4KKyAgVGhlIGZ1bmN0aW9uIGdlbmVyYXRlcyBoaWdoIGZyZXF1ZW5jeSBjb250ZW50IGJ5IGNvcHlpbmcgZGF0YSBmcm9tIHRoZSBsb3cKKyAgYmFuZCAocHJvdmlkZWQgYnkgY29yZSBjb2RlYykgaW50byB0aGUgaGlnaCBiYW5kLiBUaGlzIHByb2Nlc3MgaXMgYWxzbworICByZWZlcnJlZCB0byBhcyAicGF0Y2hpbmciLiBUaGUgZnVuY3Rpb24gYWxzbyBpbXBsZW1lbnRzIHNwZWN0cmFsIHdoaXRlbmluZyBieQorICBtZWFucyBvZiBpbnZlcnNlIGZpbHRlcmluZyBiYXNlZCBvbiBMUEMgY29lZmZpY2llbnRzLgogCi0gIFRvZ2V0aGVyIHdpdGggdGhlIFFNRiBmaWx0ZXJiYW5rIHRoZSB0cmFuc3Bvc2VyIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgYSBzdXBwbGllZCB0ZXN0IHByb2dyYW0uIFNlZSBtYWluX2F1ZGlvLmNwcCBmb3IgZGV0YWlscy4KLSAgVGhpcyBtb2R1bGUgZG9lcyB1c2UgZnJhY3Rpb25hbCBhcml0aG1ldGljIGFuZCB0aGUgYWNjdXJhY3kgb2YgdGhlIGNvbXB1dGF0aW9ucyBoYXMgYW4gaW1wYWN0IG9uIHRoZSBvdmVyYWxsIHNvdW5kIHF1YWxpdHkuCi0gIFRoZSBtb2R1bGUgYWxzbyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgZGlmZmVyZW50IHNjYWxpbmcgb2Ygc3BlY3RyYWwgZGF0YS4KKyAgVG9nZXRoZXIgd2l0aCB0aGUgUU1GIGZpbHRlcmJhbmsgdGhlIHRyYW5zcG9zZXIgY2FuIGJlIHRlc3RlZCB1c2luZyBhIHN1cHBsaWVkCisgIHRlc3QgcHJvZ3JhbS4gU2VlIG1haW5fYXVkaW8uY3BwIGZvciBkZXRhaWxzLiBUaGlzIG1vZHVsZSBkb2VzIHVzZSBmcmFjdGlvbmFsCisgIGFyaXRobWV0aWMgYW5kIHRoZSBhY2N1cmFjeSBvZiB0aGUgY29tcHV0YXRpb25zIGhhcyBhbiBpbXBhY3Qgb24gdGhlIG92ZXJhbGwKKyAgc291bmQgcXVhbGl0eS4gVGhlIG1vZHVsZSBhbHNvIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBkaWZmZXJlbnQKKyAgc2NhbGluZyBvZiBzcGVjdHJhbCBkYXRhLgogCiAgIFxzYSBscHBUcmFuc3Bvc2VyKCksIG1haW5fYXVkaW8uY3BwLCBzYnJfc2NhbGUuaCwgXHJlZiBkb2N1bWVudGF0aW9uT3ZlcnZpZXcKICovCkBAIC0xMDgsMTYgKzEzMCwxMyBAQAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAjaW5jbHVkZSAiYXV0b2NvcnIybmQuaCIKIAotCisjaW5jbHVkZSAiSEZnZW5fcHJlRmxhdC5oIgogCiAjaWYgZGVmaW5lZChfX2FybV9fKQogI2luY2x1ZGUgImFybS9scHBfdHJhbl9hcm0uY3BwIgogI2VuZGlmCiAKLQotCi0jZGVmaW5lIExQQ19TQ0FMRV9GQUNUT1IgIDIKLQorI2RlZmluZSBMUENfU0NBTEVfRkFDVE9SIDIKIAogLyohCiAgKgpAQCAtMTI5LDMzICsxNDgsMjggQEAKICAqIGxldmVsIGlzIGJlaW5nIGluc2VydGVkIHRvIGFjaGlldmUgYSBzbW9vdGggdHJhbnNpdGlvbi4KICAqLwogCi0jaWZuZGVmIEZVTkNUSU9OX21hcEludmZNb2RlCi1zdGF0aWMgRklYUF9EQkwKLW1hcEludmZNb2RlIChJTlZGX01PREUgbW9kZSwKLSAgICAgICAgICAgICBJTlZGX01PREUgcHJldk1vZGUsCi0gICAgICAgICAgICAgV0hJVEVOSU5HX0ZBQ1RPUlMgd2hGYWN0b3JzKQoteworc3RhdGljIEZJWFBfREJMIG1hcEludmZNb2RlKElOVkZfTU9ERSBtb2RlLCBJTlZGX01PREUgcHJldk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hJVEVOSU5HX0ZBQ1RPUlMgd2hGYWN0b3JzKSB7CiAgIHN3aXRjaCAobW9kZSkgewotICBjYXNlIElOVkZfTE9XX0xFVkVMOgotICAgIGlmKHByZXZNb2RlID09IElOVkZfT0ZGKQotICAgICAgcmV0dXJuIHdoRmFjdG9ycy50cmFuc2l0aW9uTGV2ZWw7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHdoRmFjdG9ycy5sb3dMZXZlbDsKKyAgICBjYXNlIElOVkZfTE9XX0xFVkVMOgorICAgICAgaWYgKHByZXZNb2RlID09IElOVkZfT0ZGKQorICAgICAgICByZXR1cm4gd2hGYWN0b3JzLnRyYW5zaXRpb25MZXZlbDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHdoRmFjdG9ycy5sb3dMZXZlbDsKIAotICBjYXNlIElOVkZfTUlEX0xFVkVMOgotICAgIHJldHVybiB3aEZhY3RvcnMubWlkTGV2ZWw7CisgICAgY2FzZSBJTlZGX01JRF9MRVZFTDoKKyAgICAgIHJldHVybiB3aEZhY3RvcnMubWlkTGV2ZWw7CiAKLSAgY2FzZSBJTlZGX0hJR0hfTEVWRUw6Ci0gICAgcmV0dXJuIHdoRmFjdG9ycy5oaWdoTGV2ZWw7CisgICAgY2FzZSBJTlZGX0hJR0hfTEVWRUw6CisgICAgICByZXR1cm4gd2hGYWN0b3JzLmhpZ2hMZXZlbDsKIAotICBkZWZhdWx0OgotICAgIGlmKHByZXZNb2RlID09IElOVkZfTE9XX0xFVkVMKQotICAgICAgcmV0dXJuIHdoRmFjdG9ycy50cmFuc2l0aW9uTGV2ZWw7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHdoRmFjdG9ycy5vZmY7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChwcmV2TW9kZSA9PSBJTlZGX0xPV19MRVZFTCkKKyAgICAgICAgcmV0dXJuIHdoRmFjdG9ycy50cmFuc2l0aW9uTGV2ZWw7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiB3aEZhY3RvcnMub2ZmOwogICB9CiB9Ci0jZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9tYXBJbnZmTW9kZSAqLwogCiAvKiEKICAqCkBAIC0xNjUsMTEyICsxNzksMTM2IEBACiAgKgogICovCiAKLSNpZm5kZWYgRlVOQ1RJT05faW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMKLXN0YXRpYyB2b2lkCi1pbnZlcnNlRmlsdGVyaW5nTGV2ZWxFbXBoYXNpcyhIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsLyohPCBIYW5kbGUgb2YgbHBwIHRyYW5zcG9zZXIgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBuSW52ZkJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGUsICAgICAgLyohPCBDdXJyZW50IGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGVfcHJldiwgLyohPCBQcmV2aW91cyBpbnZlcnNlIGZpbHRlcmluZyBtb2RlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiBid1ZlY3RvciAgICAgICAgICAgIC8qITwgUmVzdWx0aW5nIGZpbHRlcmluZyBsZXZlbHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IG5JbnZmQmFuZHM7IGkrKykgeworc3RhdGljIHZvaWQgaW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMoCisgICAgSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLCAvKiE8IEhhbmRsZSBvZiBscHAgdHJhbnNwb3NlciAgKi8KKyAgICBVQ0hBUiBuSW52ZkJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCisgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlLCAgICAgIC8qITwgQ3VycmVudCBpbnZlcnNlIGZpbHRlcmluZyBtb2RlcyAqLworICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZV9wcmV2LCAvKiE8IFByZXZpb3VzIGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCisgICAgRklYUF9EQkwgKmJ3VmVjdG9yICAgICAgICAgICAgIC8qITwgUmVzdWx0aW5nIGZpbHRlcmluZyBsZXZlbHMgKi8KKykgeworICBmb3IgKGludCBpID0gMDsgaSA8IG5JbnZmQmFuZHM7IGkrKykgewogICAgIEZJWFBfREJMIGFjY3U7Ci0gICAgRklYUF9EQkwgYndUbXAgPSBtYXBJbnZmTW9kZSAoc2JyX2ludmZfbW9kZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJfaW52Zl9tb2RlX3ByZXZbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaExwcFRyYW5zLT5wU2V0dGluZ3MtPndoRmFjdG9ycyk7CisgICAgRklYUF9EQkwgYndUbXAgPSBtYXBJbnZmTW9kZShzYnJfaW52Zl9tb2RlW2ldLCBzYnJfaW52Zl9tb2RlX3ByZXZbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTHBwVHJhbnMtPnBTZXR0aW5ncy0+d2hGYWN0b3JzKTsKIAotICAgIGlmKGJ3VG1wIDwgaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSkgewotICAgICAgYWNjdSA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjc1ZiksYndUbXApICsKLSAgICAgICAgICAgICBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC4yNWYpLGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0pOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGFjY3UgPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC45MDYyNWYpLGJ3VG1wKSArCi0gICAgICAgICAgICAgZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuMDkzNzVmKSxoTHBwVHJhbnMtPmJ3VmVjdG9yT2xkW2ldKTsKKyAgICBpZiAoYndUbXAgPCBoTHBwVHJhbnMtPmJ3VmVjdG9yT2xkW2ldKSB7CisgICAgICBhY2N1ID0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzVmKSwgYndUbXApICsKKyAgICAgICAgICAgICBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC4yNWYpLCBoTHBwVHJhbnMtPmJ3VmVjdG9yT2xkW2ldKTsKKyAgICB9IGVsc2UgeworICAgICAgYWNjdSA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjkwNjI1ZiksIGJ3VG1wKSArCisgICAgICAgICAgICAgZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuMDkzNzVmKSwgaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSk7CiAgICAgfQogCi0gICAgaWYgKGFjY3UgPCAgRkwyRlhDT05TVF9EQkwoMC4wMTU2MjVmKT4+MSkKKyAgICBpZiAoYWNjdTxGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpPj4gMSkgewogICAgICAgYndWZWN0b3JbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICBlbHNlCi0gICAgICBid1ZlY3RvcltpXSA9IGZpeE1pbihhY2N1PDwxLEZMMkZYQ09OU1RfREJMKDAuOTk2MDkzNzVmKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ3VmVjdG9yW2ldID0gZml4TWluKGFjY3UgPDwgMSwgRkwyRlhDT05TVF9EQkwoMC45OTYwOTM3NWYpKTsKKyAgICB9CiAgIH0KIH0KLSNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX2ludmVyc2VGaWx0ZXJpbmdMZXZlbEVtcGhhc2lzICovCiAKIC8qIFJlc3VsdGluZyBhdXRvY29ycmVsYXRpb24gZGV0ZXJtaW5hbnQgZXhwb25lbnQgKi8KLSNkZWZpbmUgQUNERVRfRVhQICgyKihERlJBQ1RfQklUUytzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUrMTAtYWMuZGV0X3NjYWxlKSkKLSNkZWZpbmUgQUNfRVhQICgtc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlK0xQQ19TQ0FMRV9GQUNUT1IpCi0jZGVmaW5lIEFMUEhBX0VYUCAoLXNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZStMUENfU0NBTEVfRkFDVE9SKzEpCi0vKiBSZXN1bHRpbmcgdHJhbnNwb3NlZCBRTUYgdmFsdWVzIGV4cG9uZW50IDE2IGJpdCBub3JtYWxpemVkIHNhbXBsZWJpdHMgYXNzdW1lZC4gKi8KLSNkZWZpbmUgUU1GT1VUX0VYUCAoKFNBTVBMRV9CSVRTLTE1KS1zYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpCisjZGVmaW5lIEFDREVUX0VYUCBcCisgICgyICogKERGUkFDVF9CSVRTICsgc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlICsgMTAgLSBhYy5kZXRfc2NhbGUpKQorI2RlZmluZSBBQ19FWFAgKC1zYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUgKyBMUENfU0NBTEVfRkFDVE9SKQorI2RlZmluZSBBTFBIQV9FWFAgKC1zYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUgKyBMUENfU0NBTEVfRkFDVE9SICsgMSkKKy8qIFJlc3VsdGluZyB0cmFuc3Bvc2VkIFFNRiB2YWx1ZXMgZXhwb25lbnQgMTYgYml0IG5vcm1hbGl6ZWQgc2FtcGxlYml0cworICogYXNzdW1lZC4gKi8KKyNkZWZpbmUgUU1GT1VUX0VYUCAoKFNBTVBMRV9CSVRTIC0gMTUpIC0gc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlKQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2FsY19xbWZCdWZmZXJSZWFsKEZJWFBfREJMICoqcW1mQnVmZmVyUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IGxvd0JhbmRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3RhcnRTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdG9wU2FtcGxlLCBjb25zdCBVQ0hBUiBoaUJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkeW5hbWljU2NhbGUsIGNvbnN0IGludCBkZXNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBhMHIsIGNvbnN0IEZJWFBfU0dMIGExcikgeworICBGSVhQX0RCTCBhY2N1MSwgYWNjdTI7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzdG9wU2FtcGxlIC0gc3RhcnRTYW1wbGU7IGkrKykgeworICAgIGFjY3UxID0gZk11bHREaXYyKGExciwgbG93QmFuZFJlYWxbaV0pOworICAgIGFjY3UxID0gKGZNdWx0RGl2MihhMHIsIGxvd0JhbmRSZWFsW2kgKyAxXSkgKyBhY2N1MSk7CisgICAgYWNjdTEgPSBhY2N1MSA+PiBkeW5hbWljU2NhbGU7CisKKyAgICBhY2N1MSA8PD0gMTsKKyAgICBhY2N1MiA9IChsb3dCYW5kUmVhbFtpICsgMl0gPj4gZGVzY2FsZSk7CisgICAgcW1mQnVmZmVyUmVhbFtpICsgc3RhcnRTYW1wbGVdW2hpQmFuZF0gPSBhY2N1MSArIGFjY3UyOworICB9Cit9CiAKIC8qIQogICoKICAqIFxicmllZiBQZXJmb3JtIHRyYW5zcG9zaXRpb24gYnkgcGF0Y2hpbmcgb2Ygc3ViYmFuZCBzYW1wbGVzLgotICogVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgYXMgdGhlIG1haW4gZW50cnkgcG9pbnQgaW50byB0aGUgbW9kdWxlLiBUaGUgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgYXJlYXMgZm9yIHRoZQotICogcGF0Y2hpbmcgcHJvY2VzcyAodGhlc2UgYXJlIHRoZSBzb3VyY2UgcmFuZ2UgYXMgd2VsbCBhcyB0aGUgdGFyZ2V0IHJhbmdlKSBhbmQgaW1wbGVtZW50cyBzcGVjdHJhbCB3aGl0ZW5pbmcKLSAqIGJ5IG1lYW5zIG9mIGludmVyc2UgZmlsdGVyaW5nLiBUaGUgZnVuY3Rpb24gYXV0b0NvcnJlbGF0aW9uMm5kKCkgaXMgYW4gYXV4aWxpYXJ5IGZ1bmN0aW9uIGZvciBjYWxjdWxhdGluZyB0aGUKLSAqIExQQyBjb2VmZmljaWVudHMgZm9yIHRoZSBmaWx0ZXJpbmcuICBUaGUgYWN0dWFsIGNhbGN1bGF0aW9uIG9mIHRoZSBMUEMgY29lZmZpY2llbnRzIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KLSAqIG9mIHRoZSBmaWx0ZXJpbmcgYXJlIGRvbmUgYXMgcGFydCBvZiBscHBUcmFuc3Bvc2VyKCkuCisgKiBUaGlzIGZ1bmN0aW9uIHNlcnZlcyBhcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBpbnRvIHRoZSBtb2R1bGUuIFRoZSBmdW5jdGlvbgorICogZGV0ZXJtaW5lcyB0aGUgYXJlYXMgZm9yIHRoZSBwYXRjaGluZyBwcm9jZXNzICh0aGVzZSBhcmUgdGhlIHNvdXJjZSByYW5nZSBhcworICogd2VsbCBhcyB0aGUgdGFyZ2V0IHJhbmdlKSBhbmQgaW1wbGVtZW50cyBzcGVjdHJhbCB3aGl0ZW5pbmcgYnkgbWVhbnMgb2YKKyAqIGludmVyc2UgZmlsdGVyaW5nLiBUaGUgZnVuY3Rpb24gYXV0b0NvcnJlbGF0aW9uMm5kKCkgaXMgYW4gYXV4aWxpYXJ5IGZ1bmN0aW9uCisgKiBmb3IgY2FsY3VsYXRpbmcgdGhlIExQQyBjb2VmZmljaWVudHMgZm9yIHRoZSBmaWx0ZXJpbmcuICBUaGUgYWN0dWFsCisgKiBjYWxjdWxhdGlvbiBvZiB0aGUgTFBDIGNvZWZmaWNpZW50cyBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBmaWx0ZXJpbmcKKyAqIGFyZSBkb25lIGFzIHBhcnQgb2YgbHBwVHJhbnNwb3NlcigpLgogICoKLSAqIE5vdGUgdGhhdCB0aGUgZmlsdGVyaW5nIGlzIGRvbmUgb24gYWxsIGF2YWlsYWJsZSBRTUYgc3Vic2FtcGxlcywgd2hlcmVhcyB0aGUgcGF0Y2hpbmcgaXMgb25seSBkb25lIG9uIHRob3NlIFFNRgotICogc3Vic2FtcGxlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgbmV4dCBRTUYgc3ludGhlc2lzLiBUaGUgZmlsdGVyaW5nIGlzIGFsc28gaW1wbGVtZW50ZWQgYmVmb3JlIHRoZSBwYXRjaGluZwotICogaW5jbHVkZXMgZnVydGhlciBkZXBlbmRlbmNpZXMgb24gcGFyYW1ldGVycyBmcm9tIHRoZSBTQlIgZGF0YS4KKyAqIE5vdGUgdGhhdCB0aGUgZmlsdGVyaW5nIGlzIGRvbmUgb24gYWxsIGF2YWlsYWJsZSBRTUYgc3Vic2FtcGxlcywgd2hlcmVhcyB0aGUKKyAqIHBhdGNoaW5nIGlzIG9ubHkgZG9uZSBvbiB0aG9zZSBRTUYgc3Vic2FtcGxlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgbmV4dAorICogUU1GIHN5bnRoZXNpcy4gVGhlIGZpbHRlcmluZyBpcyBhbHNvIGltcGxlbWVudGVkIGJlZm9yZSB0aGUgcGF0Y2hpbmcgaW5jbHVkZXMKKyAqIGZ1cnRoZXIgZGVwZW5kZW5jaWVzIG9uIHBhcmFtZXRlcnMgZnJvbSB0aGUgU0JSIGRhdGEuCiAgKgogICovCiAKLXZvaWQgbHBwVHJhbnNwb3NlciAoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLCAgICAvKiE8IEhhbmRsZSBvZiBscHAgdHJhbnNwb3NlciAgKi8KLSAgICAgICAgICAgICAgICAgICAgUU1GX1NDQUxFX0ZBQ1RPUiAgKnNiclNjYWxlRmFjdG9yLCAvKiE8IFNjYWxpbmcgZmFjdG9ycyAqLwotICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlclJlYWwsICAgICAgICAgIC8qITwgUG9pbnRlciB0byBwb2ludGVyIHRvIHJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKHNvdXJjZSkgKi8KK3ZvaWQgbHBwVHJhbnNwb3NlcigKKyAgICBIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsICAgLyohPCBIYW5kbGUgb2YgbHBwIHRyYW5zcG9zZXIgICovCisgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2JyU2NhbGVGYWN0b3IsIC8qITwgU2NhbGluZyBmYWN0b3JzICovCisgICAgRklYUF9EQkwgKipxbWZCdWZmZXJSZWFsLCAvKiE8IFBvaW50ZXIgdG8gcG9pbnRlciB0byByZWFsIHBhcnQgb2Ygc3ViYmFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyAoc291cmNlKSAqLwogCi0gICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkZWdyZWVBbGlhcywgICAgICAgICAgICAgLyohPCBWZWN0b3IgZm9yIHJlc3VsdHMgb2YgYWxpYXNpbmcgZXN0aW1hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlckltYWcsICAgICAgICAgIC8qITwgUG9pbnRlciB0byBwb2ludGVyIHRvIGltYWdpbmFyeSBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAoc291cmNlKSAqLwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXNlTFAsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0aW1lU3RlcCwgICAgICAgICAgICAgICAgLyohPCBUaW1lIHN0ZXAgb2YgZW52ZWxvcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZpcnN0U2xvdE9mZnMsICAgICAgICAgICAvKiE8IFN0YXJ0IHBvc2l0aW9uIGluIHRpbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxhc3RTbG90T2ZmcywgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBvdmVybGFwLXNsb3RzIGludG8gbmV4dCBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkludmZCYW5kcywgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGZvciBpbnZlcnNlIGZpbHRlcmluZyAqLwotICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGUsICAgICAgICAgIC8qITwgQ3VycmVudCBpbnZlcnNlIGZpbHRlcmluZyBtb2RlcyAqLwotICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGVfcHJldiAgICAgIC8qITwgUHJldmlvdXMgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgKQotewotICBJTlQgICAgYndJbmRleFtNQVhfTlVNX1BBVENIRVNdOwotICBGSVhQX0RCTCAgYndWZWN0b3JbTUFYX05VTV9QQVRDSEVTXTsgICAgICAgLyohPCBwb2xlIG1vdmluZyBmYWN0b3JzICovCisgICAgRklYUF9EQkwgKmRlZ3JlZUFsaWFzLCAgICAvKiE8IFZlY3RvciBmb3IgcmVzdWx0cyBvZiBhbGlhc2luZyBlc3RpbWF0aW9uICovCisgICAgRklYUF9EQkwgKipxbWZCdWZmZXJJbWFnLCAvKiE8IFBvaW50ZXIgdG8gcG9pbnRlciB0byBpbWFnaW5hcnkgcGFydCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViYmFuZCBzYW1wbGVzIChzb3VyY2UpICovCisgICAgY29uc3QgaW50IHVzZUxQLCBjb25zdCBpbnQgZlByZVdoaXRlbmluZywgY29uc3QgaW50IHZfa19tYXN0ZXIwLAorICAgIGNvbnN0IGludCB0aW1lU3RlcCwgICAgICAgLyohPCBUaW1lIHN0ZXAgb2YgZW52ZWxvcGUgKi8KKyAgICBjb25zdCBpbnQgZmlyc3RTbG90T2ZmcywgIC8qITwgU3RhcnQgcG9zaXRpb24gaW4gdGltZSAqLworICAgIGNvbnN0IGludCBsYXN0U2xvdE9mZnMsICAgLyohPCBOdW1iZXIgb2Ygb3ZlcmxhcC1zbG90cyBpbnRvIG5leHQgZnJhbWUgKi8KKyAgICBjb25zdCBpbnQgbkludmZCYW5kcywgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGZvciBpbnZlcnNlIGZpbHRlcmluZyAqLworICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZSwgLyohPCBDdXJyZW50IGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCisgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlX3ByZXYgLyohPCBQcmV2aW91cyBpbnZlcnNlIGZpbHRlcmluZyBtb2RlcyAqLworKSB7CisgIElOVCBid0luZGV4W01BWF9OVU1fUEFUQ0hFU107CisgIEZJWFBfREJMIGJ3VmVjdG9yW01BWF9OVU1fUEFUQ0hFU107IC8qITwgcG9sZSBtb3ZpbmcgZmFjdG9ycyAqLworICBGSVhQX0RCTCBwcmVXaGl0ZW5pbmdHYWluc1soNjQpIC8gMl07CisgIGludCBwcmVXaGl0ZW5pbmdHYWluc19leHBbKDY0KSAvIDJdOwogCi0gIGludCAgICBpOwotICBpbnQgICAgbG9CYW5kLCBzdGFydCwgc3RvcDsKKyAgaW50IGk7CisgIGludCBsb0JhbmQsIHN0YXJ0LCBzdG9wOwogICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MgPSBoTHBwVHJhbnMtPnBTZXR0aW5nczsKICAgUEFUQ0hfUEFSQU0gKnBhdGNoUGFyYW0gPSBwU2V0dGluZ3MtPnBhdGNoUGFyYW07Ci0gIGludCAgICBwYXRjaDsKKyAgaW50IHBhdGNoOwogCi0gIEZJWFBfU0dMICBhbHBoYXJbTFBDX09SREVSXSwgYTByLCBhMXI7Ci0gIEZJWFBfU0dMICBhbHBoYWlbTFBDX09SREVSXSwgYTBpPTAsIGExaT0wOwotICBGSVhQX1NHTCAgYncgPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKyAgRklYUF9TR0wgYWxwaGFyW0xQQ19PUkRFUl0sIGEwciwgYTFyOworICBGSVhQX1NHTCBhbHBoYWlbTFBDX09SREVSXSwgYTBpID0gMCwgYTFpID0gMDsKKyAgRklYUF9TR0wgYncgPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKIAotICBpbnQgICAgYXV0b0NvcnJMZW5ndGg7CisgIGludCBhdXRvQ29yckxlbmd0aDsKIAotICBGSVhQX0RCTCBrMSwgazFfYmVsb3c9MCwgazFfYmVsb3cyPTA7CisgIEZJWFBfREJMIGsxLCBrMV9iZWxvdyA9IDAsIGsxX2JlbG93MiA9IDA7CiAKICAgQUNPUlJfQ09FRlMgYWM7Ci0gIGludCAgICBzdGFydFNhbXBsZTsKLSAgaW50ICAgIHN0b3BTYW1wbGU7Ci0gIGludCAgICBzdG9wU2FtcGxlQ2xlYXI7CisgIGludCBzdGFydFNhbXBsZTsKKyAgaW50IHN0b3BTYW1wbGU7CisgIGludCBzdG9wU2FtcGxlQ2xlYXI7CiAKICAgaW50IGNvbUxvd0JhbmRTY2FsZTsKICAgaW50IG92TG93QmFuZFNoaWZ0OwogICBpbnQgbG93QmFuZFNoaWZ0OwotLyogIGludCBvdkhpZ2hCYW5kU2hpZnQ7Ki8KLQorICAvKiAgaW50IG92SGlnaEJhbmRTaGlmdDsqLwogCiAgIGFscGhhaVswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogICBhbHBoYWlbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKIAotCiAgIHN0YXJ0U2FtcGxlID0gZmlyc3RTbG90T2ZmcyAqIHRpbWVTdGVwOwotICBzdG9wU2FtcGxlICA9IHBTZXR0aW5ncy0+bkNvbHMgKyBsYXN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKKyAgc3RvcFNhbXBsZSA9IHBTZXR0aW5ncy0+bkNvbHMgKyBsYXN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKKyAgRkRLX0FTU0VSVCgobGFzdFNsb3RPZmZzICogdGltZVN0ZXApIDw9IHBTZXR0aW5ncy0+b3ZlcmxhcCk7CiAKLQotICBpbnZlcnNlRmlsdGVyaW5nTGV2ZWxFbXBoYXNpcyhoTHBwVHJhbnMsIG5JbnZmQmFuZHMsIHNicl9pbnZmX21vZGUsIHNicl9pbnZmX21vZGVfcHJldiwgYndWZWN0b3IpOworICBpbnZlcnNlRmlsdGVyaW5nTGV2ZWxFbXBoYXNpcyhoTHBwVHJhbnMsIG5JbnZmQmFuZHMsIHNicl9pbnZmX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNicl9pbnZmX21vZGVfcHJldiwgYndWZWN0b3IpOwogCiAgIHN0b3BTYW1wbGVDbGVhciA9IHN0b3BTYW1wbGU7CiAKQEAgLTI3OCwxMSArMzE2LDEyIEBACiAKICAgaWYgKHBTZXR0aW5ncy0+bm9PZlBhdGNoZXMgPiAwKSB7CiAgICAgLyogU2V0IHVwcGVyIHN1YmJhbmRzIHRvIHplcm86Ci0gICAgICAgVGhpcyBpcyByZXF1aXJlZCBpbiBjYXNlIHRoYXQgdGhlIHBhdGNoZXMgZG8gbm90IGNvdmVyIHRoZSBjb21wbGV0ZSBoaWdoYmFuZAotICAgICAgIChiZWNhdXNlIHRoZSBsYXN0IHBhdGNoIHdvdWxkIGJlIHRvbyBzaG9ydCkuCi0gICAgICAgUG9zc2libGUgb3B0aW1pemF0aW9uOiBDbGVhcmluZyBiYW5kcyB1cCB0byB1c2Igd291bGQgYmUgc3VmZmljaWVudCBoZXJlLiAqLwotICAgIGludCB0YXJnZXRTdG9wQmFuZCA9IHBhdGNoUGFyYW1bcFNldHRpbmdzLT5ub09mUGF0Y2hlcy0xXS50YXJnZXRTdGFydEJhbmQKLSAgICAgICAgICAgICAgICAgICArIHBhdGNoUGFyYW1bcFNldHRpbmdzLT5ub09mUGF0Y2hlcy0xXS5udW1CYW5kc0luUGF0Y2g7CisgICAgICAgVGhpcyBpcyByZXF1aXJlZCBpbiBjYXNlIHRoYXQgdGhlIHBhdGNoZXMgZG8gbm90IGNvdmVyIHRoZSBjb21wbGV0ZQorICAgICAgIGhpZ2hiYW5kIChiZWNhdXNlIHRoZSBsYXN0IHBhdGNoIHdvdWxkIGJlIHRvbyBzaG9ydCkuIFBvc3NpYmxlCisgICAgICAgb3B0aW1pemF0aW9uOiBDbGVhcmluZyBiYW5kcyB1cCB0byB1c2Igd291bGQgYmUgc3VmZmljaWVudCBoZXJlLiAqLworICAgIGludCB0YXJnZXRTdG9wQmFuZCA9CisgICAgICAgIHBhdGNoUGFyYW1bcFNldHRpbmdzLT5ub09mUGF0Y2hlcyAtIDFdLnRhcmdldFN0YXJ0QmFuZCArCisgICAgICAgIHBhdGNoUGFyYW1bcFNldHRpbmdzLT5ub09mUGF0Y2hlcyAtIDFdLm51bUJhbmRzSW5QYXRjaDsKIAogICAgIGludCBtZW1TaXplID0gKCg2NCkgLSB0YXJnZXRTdG9wQmFuZCkgKiBzaXplb2YoRklYUF9EQkwpOwogCkBAIC0yOTEsOSArMzMwLDEwIEBACiAgICAgICAgIEZES21lbWNsZWFyKCZxbWZCdWZmZXJSZWFsW2ldW3RhcmdldFN0b3BCYW5kXSwgbWVtU2l6ZSk7CiAgICAgICAgIEZES21lbWNsZWFyKCZxbWZCdWZmZXJJbWFnW2ldW3RhcmdldFN0b3BCYW5kXSwgbWVtU2l6ZSk7CiAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgZm9yIChpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlQ2xlYXI7IGkrKykgewotICAgICAgRkRLbWVtY2xlYXIoJnFtZkJ1ZmZlclJlYWxbaV1bdGFyZ2V0U3RvcEJhbmRdLCBtZW1TaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlQ2xlYXI7IGkrKykgeworICAgICAgICBGREttZW1jbGVhcigmcW1mQnVmZmVyUmVhbFtpXVt0YXJnZXRTdG9wQmFuZF0sIG1lbVNpemUpOworICAgICAgfQogICAgIH0KICAgfQogI2lmZGVmIF9fQU5EUk9JRF9fCkBAIC0zMDQsNjEgKzM0NCw3NyBAQAogI2VuZGlmCiAKICAgLyogaW5pdCBid0luZGV4IGZvciBlYWNoIHBhdGNoICovCi0gIEZES21lbWNsZWFyKGJ3SW5kZXgsIE1BWF9OVU1fUEFUQ0hFUypzaXplb2YoSU5UKSk7CisgIEZES21lbWNsZWFyKGJ3SW5kZXgsIHNpemVvZihid0luZGV4KSk7CiAKICAgLyoKICAgICBDYWxjIGNvbW1vbiBsb3cgYmFuZCBzY2FsZSBmYWN0b3IKICAgKi8KLSAgY29tTG93QmFuZFNjYWxlID0gZml4TWluKHNiclNjYWxlRmFjdG9yLT5vdl9sYl9zY2FsZSxzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpOworICBjb21Mb3dCYW5kU2NhbGUgPQorICAgICAgZml4TWluKHNiclNjYWxlRmFjdG9yLT5vdl9sYl9zY2FsZSwgc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlKTsKIAotICBvdkxvd0JhbmRTaGlmdCA9ICBzYnJTY2FsZUZhY3Rvci0+b3ZfbGJfc2NhbGUgLSBjb21Mb3dCYW5kU2NhbGU7Ci0gIGxvd0JhbmRTaGlmdCAgID0gIHNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSAtIGNvbUxvd0JhbmRTY2FsZTsKKyAgb3ZMb3dCYW5kU2hpZnQgPSBzYnJTY2FsZUZhY3Rvci0+b3ZfbGJfc2NhbGUgLSBjb21Mb3dCYW5kU2NhbGU7CisgIGxvd0JhbmRTaGlmdCA9IHNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSAtIGNvbUxvd0JhbmRTY2FsZTsKICAgLyogIG92SGlnaEJhbmRTaGlmdCA9IGZpcnN0U2xvdE9mZnMgPT0gMCA/IG92TG93QmFuZFNoaWZ0OjA7Ki8KIAorICBpZiAoZlByZVdoaXRlbmluZykgeworICAgIHNickRlY29kZXJfY2FsY3VsYXRlR2FpblZlYygKKyAgICAgICAgcW1mQnVmZmVyUmVhbCwgcW1mQnVmZmVySW1hZywKKyAgICAgICAgREZSQUNUX0JJVFMgLSAxIC0gMTYgLQorICAgICAgICAgICAgc2JyU2NhbGVGYWN0b3ItPm92X2xiX3NjYWxlLCAvKiBjb252ZXJ0IHNjYWxlIHRvIGV4cG9uZW50ICovCisgICAgICAgIERGUkFDVF9CSVRTIC0gMSAtIDE2IC0KKyAgICAgICAgICAgIHNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSwgLyogY29udmVydCBzY2FsZSB0byBleHBvbmVudCAqLworICAgICAgICBwU2V0dGluZ3MtPm92ZXJsYXAsIHByZVdoaXRlbmluZ0dhaW5zLCBwcmVXaGl0ZW5pbmdHYWluc19leHAsCisgICAgICAgIHZfa19tYXN0ZXIwLCBzdGFydFNhbXBsZSwgc3RvcFNhbXBsZSk7CisgIH0KKwogICAvKiBvdXRlciBsb29wIG92ZXIgYmFuZHMgdG8gZG8gYW5hbHlzaXMgb25seSBvbmNlIGZvciBlYWNoIGJhbmQgKi8KIAogICBpZiAoIXVzZUxQKSB7CiAgICAgc3RhcnQgPSBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZzsKICAgICBzdG9wID0gcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZzsKLSAgfSBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBzdGFydCA9IGZpeE1heCgxLCBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZyAtIDIpOwogICAgIHN0b3AgPSBwYXRjaFBhcmFtWzBdLnRhcmdldFN0YXJ0QmFuZDsKICAgfQogCi0KLSAgZm9yICggbG9CYW5kID0gc3RhcnQ7IGxvQmFuZCA8ICBzdG9wOyBsb0JhbmQrKyApIHsKLQotICAgIEZJWFBfREJMICBsb3dCYW5kUmVhbFsoKCgxMDI0KS8oMzIpKSsoNikpK0xQQ19PUkRFUl07CisgIGZvciAobG9CYW5kID0gc3RhcnQ7IGxvQmFuZCA8IHN0b3A7IGxvQmFuZCsrKSB7CisgICAgRklYUF9EQkwgbG93QmFuZFJlYWxbKCgoMTAyNCkgLyAoMzIpICogKDQpIC8gMikgKyAoMyAqICg0KSkpICsgTFBDX09SREVSXTsKICAgICBGSVhQX0RCTCAqcGxvd0JhbmRSZWFsID0gbG93QmFuZFJlYWw7Ci0gICAgRklYUF9EQkwgKipwcW1mQnVmZmVyUmVhbCA9IHFtZkJ1ZmZlclJlYWw7Ci0gICAgRklYUF9EQkwgIGxvd0JhbmRJbWFnWygoKDEwMjQpLygzMikpKyg2KSkrTFBDX09SREVSXTsKKyAgICBGSVhQX0RCTCAqKnBxbWZCdWZmZXJSZWFsID0KKyAgICAgICAgcW1mQnVmZmVyUmVhbCArIGZpcnN0U2xvdE9mZnMgKiB0aW1lU3RlcCAvKiArIHBTZXR0aW5ncy0+b3ZlcmxhcCAqLzsKKyAgICBGSVhQX0RCTCBsb3dCYW5kSW1hZ1soKCgxMDI0KSAvICgzMikgKiAoNCkgLyAyKSArICgzICogKDQpKSkgKyBMUENfT1JERVJdOwogICAgIEZJWFBfREJMICpwbG93QmFuZEltYWcgPSBsb3dCYW5kSW1hZzsKLSAgICBGSVhQX0RCTCAqKnBxbWZCdWZmZXJJbWFnID0gcW1mQnVmZmVySW1hZzsKLSAgICBpbnQgcmVzZXRMUENDb2VmZnM9MDsKLSAgICBpbnQgZHluYW1pY1NjYWxlID0gREZSQUNUX0JJVFMtMS1MUENfU0NBTEVfRkFDVE9SOworICAgIEZJWFBfREJMICoqcHFtZkJ1ZmZlckltYWcgPQorICAgICAgICBxbWZCdWZmZXJJbWFnICsgZmlyc3RTbG90T2ZmcyAqIHRpbWVTdGVwIC8qICsgcFNldHRpbmdzLT5vdmVybGFwICovOworICAgIGludCByZXNldExQQ0NvZWZmcyA9IDA7CisgICAgaW50IGR5bmFtaWNTY2FsZSA9IERGUkFDVF9CSVRTIC0gMSAtIExQQ19TQ0FMRV9GQUNUT1I7CiAgICAgaW50IGFjRGV0U2NhbGUgPSAwOyAvKiBzY2FsaW5nIG9mIGF1dG9jb3JyZWxhdGlvbiBkZXRlcm1pbmFudCAqLwogCi0gICAgZm9yKGk9MDtpPExQQ19PUkRFUjtpKyspewotICAgICAgKnBsb3dCYW5kUmVhbCsrID0gaExwcFRyYW5zLT5scGNGaWx0ZXJTdGF0ZXNSZWFsW2ldW2xvQmFuZF07CisgICAgZm9yIChpID0gMDsKKyAgICAgICAgIGkgPCBMUENfT1JERVIgKyBmaXJzdFNsb3RPZmZzICogdGltZVN0ZXAgLyorcFNldHRpbmdzLT5vdmVybGFwKi87CisgICAgICAgICBpKyspIHsKKyAgICAgICpwbG93QmFuZFJlYWwrKyA9IGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzUmVhbExlZ1NCUltpXVtsb0JhbmRdOwogICAgICAgaWYgKCF1c2VMUCkKLSAgICAgICAgKnBsb3dCYW5kSW1hZysrID0gaExwcFRyYW5zLT5scGNGaWx0ZXJTdGF0ZXNJbWFnW2ldW2xvQmFuZF07CisgICAgICAgICpwbG93QmFuZEltYWcrKyA9IGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzSW1hZ0xlZ1NCUltpXVtsb0JhbmRdOwogICAgIH0KIAogICAgIC8qCiAgICAgICBUYWtlIG9sZCBzbG9wZSBsZW5ndGggcW1mIHNsb3Qgc291cmNlIHZhbHVlcyBvdXQgb2YgKG92ZXJsYXApcW1mIGJ1ZmZlcgogICAgICovCiAgICAgaWYgKCF1c2VMUCkgewotICAgICAgZm9yKGk9MDtpPHBTZXR0aW5ncy0+bkNvbHMrcFNldHRpbmdzLT5vdmVybGFwO2krKyl7CisgICAgICBmb3IgKGkgPSAwOworICAgICAgICAgICBpIDwgcFNldHRpbmdzLT5uQ29scyArIHBTZXR0aW5ncy0+b3ZlcmxhcCAtIGZpcnN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKKyAgICAgICAgICAgaSsrKSB7CiAgICAgICAgICpwbG93QmFuZFJlYWwrKyA9ICgqcHFtZkJ1ZmZlclJlYWwrKylbbG9CYW5kXTsKICAgICAgICAgKnBsb3dCYW5kSW1hZysrID0gKCpwcW1mQnVmZmVySW1hZysrKVtsb0JhbmRdOwogICAgICAgfQotICAgIH0gZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgLyogcFNldHRpbmdzLT5vdmVybGFwIGlzIGFsd2F5cyBldmVuICovCiAgICAgICBGREtfQVNTRVJUKChwU2V0dGluZ3MtPm92ZXJsYXAgJiAxKSA9PSAwKTsKLQotICAgICAgZm9yKGk9MDtpPCgocFNldHRpbmdzLT5vdmVybGFwK3BTZXR0aW5ncy0+bkNvbHMpPj4xKTtpKyspIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoKHBTZXR0aW5ncy0+bkNvbHMgKyBwU2V0dGluZ3MtPm92ZXJsYXAgLQorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTbG90T2ZmcyAqIHRpbWVTdGVwKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgaSsrKSB7CiAgICAgICAgICpwbG93QmFuZFJlYWwrKyA9ICgqcHFtZkJ1ZmZlclJlYWwrKylbbG9CYW5kXTsKICAgICAgICAgKnBsb3dCYW5kUmVhbCsrID0gKCpwcW1mQnVmZmVyUmVhbCsrKVtsb0JhbmRdOwogICAgICAgfQpAQCAtMzcwLDYxICs0MjYsNzcgQEAKICAgICAvKgogICAgICAgRGV0ZXJtaW5lIGR5bmFtaWMgc2NhbGluZyB2YWx1ZS4KICAgICAgKi8KLSAgICBkeW5hbWljU2NhbGUgPSBmaXhNaW4oZHluYW1pY1NjYWxlLCBnZXRTY2FsZWZhY3Rvcihsb3dCYW5kUmVhbCwgTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcCkgKyBvdkxvd0JhbmRTaGlmdCk7Ci0gICAgZHluYW1pY1NjYWxlID0gZml4TWluKGR5bmFtaWNTY2FsZSwgZ2V0U2NhbGVmYWN0b3IoJmxvd0JhbmRSZWFsW0xQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzKSArIGxvd0JhbmRTaGlmdCk7CisgICAgZHluYW1pY1NjYWxlID0KKyAgICAgICAgZml4TWluKGR5bmFtaWNTY2FsZSwKKyAgICAgICAgICAgICAgIGdldFNjYWxlZmFjdG9yKGxvd0JhbmRSZWFsLCBMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXApICsKKyAgICAgICAgICAgICAgICAgICBvdkxvd0JhbmRTaGlmdCk7CisgICAgZHluYW1pY1NjYWxlID0KKyAgICAgICAgZml4TWluKGR5bmFtaWNTY2FsZSwKKyAgICAgICAgICAgICAgIGdldFNjYWxlZmFjdG9yKCZsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5uQ29scykgKworICAgICAgICAgICAgICAgICAgIGxvd0JhbmRTaGlmdCk7CiAgICAgaWYgKCF1c2VMUCkgewotICAgICAgZHluYW1pY1NjYWxlID0gZml4TWluKGR5bmFtaWNTY2FsZSwgZ2V0U2NhbGVmYWN0b3IobG93QmFuZEltYWcsIExQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXApICsgb3ZMb3dCYW5kU2hpZnQpOwotICAgICAgZHluYW1pY1NjYWxlID0gZml4TWluKGR5bmFtaWNTY2FsZSwgZ2V0U2NhbGVmYWN0b3IoJmxvd0JhbmRJbWFnW0xQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzKSArIGxvd0JhbmRTaGlmdCk7CisgICAgICBkeW5hbWljU2NhbGUgPQorICAgICAgICAgIGZpeE1pbihkeW5hbWljU2NhbGUsCisgICAgICAgICAgICAgICAgIGdldFNjYWxlZmFjdG9yKGxvd0JhbmRJbWFnLCBMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXApICsKKyAgICAgICAgICAgICAgICAgICAgIG92TG93QmFuZFNoaWZ0KTsKKyAgICAgIGR5bmFtaWNTY2FsZSA9CisgICAgICAgICAgZml4TWluKGR5bmFtaWNTY2FsZSwKKyAgICAgICAgICAgICAgICAgZ2V0U2NhbGVmYWN0b3IoJmxvd0JhbmRJbWFnW0xQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+bkNvbHMpICsKKyAgICAgICAgICAgICAgICAgICAgIGxvd0JhbmRTaGlmdCk7CiAgICAgfQotICAgIGR5bmFtaWNTY2FsZSA9IGZpeE1heCgwLCBkeW5hbWljU2NhbGUtMSk7IC8qIG9uZSBhZGRpdGlvbmFsIGJpdCBoZWFkcm9vbSB0byBwcmV2ZW50IC0xLjAgKi8KKyAgICBkeW5hbWljU2NhbGUgPSBmaXhNYXgoCisgICAgICAgIDAsIGR5bmFtaWNTY2FsZSAtIDEpOyAvKiBvbmUgYWRkaXRpb25hbCBiaXQgaGVhZHJvb20gdG8gcHJldmVudCAtMS4wICovCiAKICAgICAvKgogICAgICAgU2NhbGUgdGVtcG9yYWwgUU1GIGJ1ZmZlci4KICAgICAgKi8KLSAgICBzY2FsZVZhbHVlcygmbG93QmFuZFJlYWxbMF0sIExQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXAsIGR5bmFtaWNTY2FsZS1vdkxvd0JhbmRTaGlmdCk7Ci0gICAgc2NhbGVWYWx1ZXMoJmxvd0JhbmRSZWFsW0xQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzLCBkeW5hbWljU2NhbGUtbG93QmFuZFNoaWZ0KTsKKyAgICBzY2FsZVZhbHVlcygmbG93QmFuZFJlYWxbMF0sIExQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcCwKKyAgICAgICAgICAgICAgICBkeW5hbWljU2NhbGUgLSBvdkxvd0JhbmRTaGlmdCk7CisgICAgc2NhbGVWYWx1ZXMoJmxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcF0sIHBTZXR0aW5ncy0+bkNvbHMsCisgICAgICAgICAgICAgICAgZHluYW1pY1NjYWxlIC0gbG93QmFuZFNoaWZ0KTsKIAogICAgIGlmICghdXNlTFApIHsKLSAgICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kSW1hZ1swXSwgTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcCwgZHluYW1pY1NjYWxlLW92TG93QmFuZFNoaWZ0KTsKLSAgICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kSW1hZ1tMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwXSwgcFNldHRpbmdzLT5uQ29scywgZHluYW1pY1NjYWxlLWxvd0JhbmRTaGlmdCk7CisgICAgICBzY2FsZVZhbHVlcygmbG93QmFuZEltYWdbMF0sIExQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcCwKKyAgICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZSAtIG92TG93QmFuZFNoaWZ0KTsKKyAgICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kSW1hZ1tMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXBdLAorICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5uQ29scywgZHluYW1pY1NjYWxlIC0gbG93QmFuZFNoaWZ0KTsKICAgICB9CiAKKyAgICBpZiAoIXVzZUxQKSB7CisgICAgICBhY0RldFNjYWxlICs9IGF1dG9Db3JyMm5kX2NwbHgoJmFjLCBsb3dCYW5kUmVhbCArIExQQ19PUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dCYW5kSW1hZyArIExQQ19PUkRFUiwgYXV0b0NvcnJMZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICBhY0RldFNjYWxlICs9CisgICAgICAgICAgYXV0b0NvcnIybmRfcmVhbCgmYWMsIGxvd0JhbmRSZWFsICsgTFBDX09SREVSLCBhdXRvQ29yckxlbmd0aCk7CisgICAgfQogCi0gICAgICBpZiAoIXVzZUxQKSB7Ci0gICAgICAgIGFjRGV0U2NhbGUgKz0gYXV0b0NvcnIybmRfY3BseCgmYWMsIGxvd0JhbmRSZWFsK0xQQ19PUkRFUiwgbG93QmFuZEltYWcrTFBDX09SREVSLCBhdXRvQ29yckxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGFjRGV0U2NhbGUgKz0gYXV0b0NvcnIybmRfcmVhbCgmYWMsIGxvd0JhbmRSZWFsK0xQQ19PUkRFUiwgYXV0b0NvcnJMZW5ndGgpOwotICAgICAgfQorICAgIC8qIEV4YW1pbmUgZHluYW1pYyBvZiBkZXRlcm1pbmFudCBpbiBhdXRvY29ycmVsYXRpb24uICovCisgICAgYWNEZXRTY2FsZSArPSAyICogKGNvbUxvd0JhbmRTY2FsZSArIGR5bmFtaWNTY2FsZSk7CisgICAgYWNEZXRTY2FsZSAqPSAyOyAgICAgICAgICAgIC8qIHR3byB0aW1lcyByZWZsZWN0aW9uIGNvZWZmaWNlbnQgc2NhbGluZyAqLworICAgIGFjRGV0U2NhbGUgKz0gYWMuZGV0X3NjYWxlOyAvKiBhYyBzY2FsaW5nIG9mIGRldGVybWluYW50ICovCiAKLSAgICAgIC8qIEV4YW1pbmUgZHluYW1pYyBvZiBkZXRlcm1pbmFudCBpbiBhdXRvY29ycmVsYXRpb24uICovCi0gICAgICBhY0RldFNjYWxlICs9IDIqKGNvbUxvd0JhbmRTY2FsZSArIGR5bmFtaWNTY2FsZSk7Ci0gICAgICBhY0RldFNjYWxlICo9IDI7ICAgICAgICAgICAgICAvKiB0d28gdGltZXMgcmVmbGVjdGlvbiBjb2VmZmljZW50IHNjYWxpbmcgKi8KLSAgICAgIGFjRGV0U2NhbGUgKz0gYWMuZGV0X3NjYWxlOyAgIC8qIGFjIHNjYWxpbmcgb2YgZGV0ZXJtaW5hbnQgKi8KLQotICAgICAgLyogSW4gY2FzZSBvZiBkZXRlcm1pbmFudCA8IDEwXi0zOCwgcmVzZXRMUENDb2VmZnM9MSBoYXMgdG8gYmUgZW5mb3JjZWQuICovCi0gICAgICBpZiAoYWNEZXRTY2FsZT4xMjYgKSB7Ci0gICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKLSAgICAgIH0KLQorICAgIC8qIEluIGNhc2Ugb2YgZGV0ZXJtaW5hbnQgPCAxMF4tMzgsIHJlc2V0TFBDQ29lZmZzPTEgaGFzIHRvIGJlIGVuZm9yY2VkLiAqLworICAgIGlmIChhY0RldFNjYWxlID4gMTI2KSB7CisgICAgICByZXNldExQQ0NvZWZmcyA9IDE7CisgICAgfQogCiAgICAgYWxwaGFyWzFdID0gRkwyRlhDT05TVF9TR0woMC4wZik7Ci0gICAgaWYgKCF1c2VMUCkKLSAgICAgIGFscGhhaVsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgIGlmICghdXNlTFApIGFscGhhaVsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogCiAgICAgaWYgKGFjLmRldCAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewotICAgICAgRklYUF9EQkwgdG1wLGFic1RtcCxhYnNEZXQ7CisgICAgICBGSVhQX0RCTCB0bXAsIGFic1RtcCwgYWJzRGV0OwogCiAgICAgICBhYnNEZXQgPSBmaXhwX2FicyhhYy5kZXQpOwogCiAgICAgICBpZiAoIXVzZUxQKSB7Ci0gICAgICAgIHRtcCA9ICggZk11bHREaXYyKGFjLnIwMXIsYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKSAtCi0gICAgICAgICAgICAgICggKGZNdWx0RGl2MihhYy5yMDFpLGFjLnIxMmkpICsgZk11bHREaXYyKGFjLnIwMnIsYWMucjExcikpID4+IChMUENfU0NBTEVfRkFDVE9SLTEpICk7Ci0gICAgICB9IGVsc2UKLSAgICAgIHsKLSAgICAgICAgdG1wID0gKCBmTXVsdERpdjIoYWMucjAxcixhYy5yMTJyKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApIC0KLSAgICAgICAgICAgICAgKCBmTXVsdERpdjIoYWMucjAycixhYy5yMTFyKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApOworICAgICAgICB0bXAgPSAoZk11bHREaXYyKGFjLnIwMXIsIGFjLnIxMnIpID4+IChMUENfU0NBTEVfRkFDVE9SIC0gMSkpIC0KKyAgICAgICAgICAgICAgKChmTXVsdERpdjIoYWMucjAxaSwgYWMucjEyaSkgKyBmTXVsdERpdjIoYWMucjAyciwgYWMucjExcikpID4+CisgICAgICAgICAgICAgICAoTFBDX1NDQUxFX0ZBQ1RPUiAtIDEpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IChmTXVsdERpdjIoYWMucjAxciwgYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1IgLSAxKSkgLQorICAgICAgICAgICAgICAoZk11bHREaXYyKGFjLnIwMnIsIGFjLnIxMXIpID4+IChMUENfU0NBTEVfRkFDVE9SIC0gMSkpOwogICAgICAgfQogICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKIApAQCAtNDM0LDIzICs1MDYsMjMgQEAKICAgICAgIHsKICAgICAgICAgSU5UIHNjYWxlOwogICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGFic0RldCwgJnNjYWxlKTsKLSAgICAgICAgc2NhbGUgPSBzY2FsZSthYy5kZXRfc2NhbGU7CisgICAgICAgIHNjYWxlID0gc2NhbGUgKyBhYy5kZXRfc2NhbGU7CiAKLSAgICAgICAgaWYgKCAoc2NhbGUgPiAwKSAmJiAocmVzdWx0ID49IChGSVhQX0RCTClNQVhWQUxfREJMPj5zY2FsZSkgKSB7CisgICAgICAgIGlmICgoc2NhbGUgPiAwKSAmJiAocmVzdWx0ID49IChGSVhQX0RCTClNQVhWQUxfREJMID4+IHNjYWxlKSkgewogICAgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBhbHBoYXJbMV0gPSBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LHNjYWxlKSk7Ci0gICAgICAgICAgaWYoKHRtcDxGTDJGWF9EQkwoMC4wZikpIF4gKGFjLmRldDxGTDJGWF9EQkwoMC4wZikpKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWxwaGFyWzFdID0gRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCwgc2NhbGUpKTsKKyAgICAgICAgICBpZiAoKHRtcCA8IEZMMkZYX0RCTCgwLjBmKSkgXiAoYWMuZGV0IDwgRkwyRlhfREJMKDAuMGYpKSkgewogICAgICAgICAgICAgYWxwaGFyWzFdID0gLWFscGhhclsxXTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgaWYgKCF1c2VMUCkKLSAgICAgIHsKLSAgICAgICAgdG1wID0gICggZk11bHREaXYyKGFjLnIwMWksYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKSArCi0gICAgICAgICAgICAgICAoIChmTXVsdERpdjIoYWMucjAxcixhYy5yMTJpKSAtIChGSVhQX0RCTClmTXVsdERpdjIoYWMucjAyaSxhYy5yMTFyKSkgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKSA7CisgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgIHRtcCA9IChmTXVsdERpdjIoYWMucjAxaSwgYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1IgLSAxKSkgKworICAgICAgICAgICAgICAoKGZNdWx0RGl2MihhYy5yMDFyLCBhYy5yMTJpKSAtCisgICAgICAgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2MihhYy5yMDJpLCBhYy5yMTFyKSkgPj4KKyAgICAgICAgICAgICAgIChMUENfU0NBTEVfRkFDVE9SIC0gMSkpOwogCiAgICAgICAgIGFic1RtcCA9IGZpeHBfYWJzKHRtcCk7CiAKQEAgLTQ2MCwxNCArNTMyLDE1IEBACiAgICAgICAgIHsKICAgICAgICAgICBJTlQgc2NhbGU7CiAgICAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBhYnNEZXQsICZzY2FsZSk7Ci0gICAgICAgICAgc2NhbGUgPSBzY2FsZSthYy5kZXRfc2NhbGU7CisgICAgICAgICAgc2NhbGUgPSBzY2FsZSArIGFjLmRldF9zY2FsZTsKIAotICAgICAgICAgIGlmICggKHNjYWxlID4gMCkgJiYgKHJlc3VsdCA+PSAvKkZMMkZYQ09OU1RfREJMKDEuZikqLyAoRklYUF9EQkwpTUFYVkFMX0RCTD4+c2NhbGUpICkgeworICAgICAgICAgIGlmICgoc2NhbGUgPiAwKSAmJgorICAgICAgICAgICAgICAocmVzdWx0ID49IC8qRkwyRlhDT05TVF9EQkwoMS5mKSovIChGSVhQX0RCTClNQVhWQUxfREJMID4+CisgICAgICAgICAgICAgICBzY2FsZSkpIHsKICAgICAgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhbHBoYWlbMV0gPSBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LHNjYWxlKSk7Ci0gICAgICAgICAgICBpZigodG1wPEZMMkZYX0RCTCgwLjBmKSkgXiAoYWMuZGV0PEZMMkZYX0RCTCgwLjBmKSkpIHsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWxwaGFpWzFdID0gRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCwgc2NhbGUpKTsKKyAgICAgICAgICAgIGlmICgodG1wIDwgRkwyRlhfREJMKDAuMGYpKSBeIChhYy5kZXQgPCBGTDJGWF9EQkwoMC4wZikpKSB7CiAgICAgICAgICAgICAgIGFscGhhaVsxXSA9IC1hbHBoYWlbMV07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQpAQCAtNDc1LDI0ICs1NDgsMjMgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBhbHBoYXJbMF0gPSAgRkwyRlhDT05TVF9TR0woMC4wZik7Ci0gICAgaWYgKCF1c2VMUCkKLSAgICAgIGFscGhhaVswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgIGFscGhhclswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgIGlmICghdXNlTFApIGFscGhhaVswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogCi0gICAgaWYgKCBhYy5yMTFyICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotCisgICAgaWYgKGFjLnIxMXIgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgIC8qIGFjLnIxMXIgaXMgYWx3YXlzID49MCAqLwotICAgICAgRklYUF9EQkwgdG1wLGFic1RtcDsKKyAgICAgIEZJWFBfREJMIHRtcCwgYWJzVG1wOwogCiAgICAgICBpZiAoIXVzZUxQKSB7Ci0gICAgICAgIHRtcCA9IChhYy5yMDFyPj4oTFBDX1NDQUxFX0ZBQ1RPUisxKSkgKwotICAgICAgICAgICAgICAoZk11bHREaXYyKGFscGhhclsxXSxhYy5yMTJyKSArIGZNdWx0RGl2MihhbHBoYWlbMV0sYWMucjEyaSkpOwotICAgICAgfSBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmKGFjLnIwMXI+PUZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgICAgICAgIHRtcCA9IChhYy5yMDFyPj4oTFBDX1NDQUxFX0ZBQ1RPUisxKSkgKyBmTXVsdERpdjIoYWxwaGFyWzFdLGFjLnIxMnIpOworICAgICAgICB0bXAgPSAoYWMucjAxciA+PiAoTFBDX1NDQUxFX0ZBQ1RPUiArIDEpKSArCisgICAgICAgICAgICAgIChmTXVsdERpdjIoYWxwaGFyWzFdLCBhYy5yMTJyKSArIGZNdWx0RGl2MihhbHBoYWlbMV0sIGFjLnIxMmkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhYy5yMDFyID49IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgIHRtcCA9IChhYy5yMDFyID4+IChMUENfU0NBTEVfRkFDVE9SICsgMSkpICsKKyAgICAgICAgICAgICAgICBmTXVsdERpdjIoYWxwaGFyWzFdLCBhYy5yMTJyKTsKICAgICAgICAgZWxzZQotICAgICAgICAgIHRtcCA9IC0oKC1hYy5yMDFyKT4+KExQQ19TQ0FMRV9GQUNUT1IrMSkpICsgZk11bHREaXYyKGFscGhhclsxXSxhYy5yMTJyKTsKKyAgICAgICAgICB0bXAgPSAtKCgtYWMucjAxcikgPj4gKExQQ19TQ0FMRV9GQUNUT1IgKyAxKSkgKworICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhbHBoYXJbMV0sIGFjLnIxMnIpOwogICAgICAgfQogCiAgICAgICBhYnNUbXAgPSBmaXhwX2Ficyh0bXApOwpAQCAtNTAxLDExMSArNTczLDEwOCBAQAogICAgICAgICBRdWljayBjaGVjazogaXMgZmlyc3QgZmlsdGVyIGNvZWZmID49IDEoNCkKICAgICAgICovCiAKLSAgICAgIGlmIChhYnNUbXAgPj0gKGFjLnIxMXI+PjEpKSB7Ci0gICAgICAgIHJlc2V0TFBDQ29lZmZzPTE7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIGlmIChhYnNUbXAgPj0gKGFjLnIxMXIgPj4gMSkpIHsKKyAgICAgICAgcmVzZXRMUENDb2VmZnMgPSAxOworICAgICAgfSBlbHNlIHsKICAgICAgICAgSU5UIHNjYWxlOwogICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGZpeHBfYWJzKGFjLnIxMXIpLCAmc2NhbGUpOwotICAgICAgICBhbHBoYXJbMF0gPSAgRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCxzY2FsZSsxKSk7CisgICAgICAgIGFscGhhclswXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsIHNjYWxlICsgMSkpOwogCi0gICAgICAgIGlmKCh0bXA+RkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyPEZMMkZYX0RCTCgwLjBmKSkpCisgICAgICAgIGlmICgodG1wID4gRkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyIDwgRkwyRlhfREJMKDAuMGYpKSkKICAgICAgICAgICBhbHBoYXJbMF0gPSAtYWxwaGFyWzBdOwogICAgICAgfQogCi0gICAgICBpZiAoIXVzZUxQKQotICAgICAgewotICAgICAgICB0bXAgPSAoYWMucjAxaT4+KExQQ19TQ0FMRV9GQUNUT1IrMSkpICsKLSAgICAgICAgICAgICAgKGZNdWx0RGl2MihhbHBoYWlbMV0sYWMucjEycikgLSBmTXVsdERpdjIoYWxwaGFyWzFdLGFjLnIxMmkpKTsKKyAgICAgIGlmICghdXNlTFApIHsKKyAgICAgICAgdG1wID0gKGFjLnIwMWkgPj4gKExQQ19TQ0FMRV9GQUNUT1IgKyAxKSkgKworICAgICAgICAgICAgICAoZk11bHREaXYyKGFscGhhaVsxXSwgYWMucjEycikgLSBmTXVsdERpdjIoYWxwaGFyWzFdLCBhYy5yMTJpKSk7CiAKICAgICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKIAogICAgICAgICAvKgogICAgICAgICBRdWljayBjaGVjazogaXMgc2Vjb25kIGZpbHRlciBjb2VmZiA+PSAxKDQpCiAgICAgICAgICovCi0gICAgICAgIGlmIChhYnNUbXAgPj0gKGFjLnIxMXI+PjEpKSB7Ci0gICAgICAgICAgcmVzZXRMUENDb2VmZnM9MTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKGFic1RtcCA+PSAoYWMucjExciA+PiAxKSkgeworICAgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBJTlQgc2NhbGU7CiAgICAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBmaXhwX2FicyhhYy5yMTFyKSwgJnNjYWxlKTsKLSAgICAgICAgICBhbHBoYWlbMF0gPSBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LHNjYWxlKzEpKTsKLSAgICAgICAgICBpZigodG1wPkZMMkZYX0RCTCgwLjBmKSkgXiAoYWMucjExcjxGTDJGWF9EQkwoMC4wZikpKQorICAgICAgICAgIGFscGhhaVswXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsIHNjYWxlICsgMSkpOworICAgICAgICAgIGlmICgodG1wID4gRkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyIDwgRkwyRlhfREJMKDAuMGYpKSkKICAgICAgICAgICAgIGFscGhhaVswXSA9IC1hbHBoYWlbMF07CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLQotICAgIGlmICghdXNlTFApCi0gICAgeworICAgIGlmICghdXNlTFApIHsKICAgICAgIC8qIE5vdyBjaGVjayB0aGUgcXVhZHJhdGljIGNyaXRlcmlhICovCi0gICAgICBpZiggKGZNdWx0RGl2MihhbHBoYXJbMF0sYWxwaGFyWzBdKSArIGZNdWx0RGl2MihhbHBoYWlbMF0sYWxwaGFpWzBdKSkgPj0gRkwyRlhDT05TVF9EQkwoMC41ZikgKQotICAgICAgICByZXNldExQQ0NvZWZmcz0xOwotICAgICAgaWYoIChmTXVsdERpdjIoYWxwaGFyWzFdLGFscGhhclsxXSkgKyBmTXVsdERpdjIoYWxwaGFpWzFdLGFscGhhaVsxXSkpID49IEZMMkZYQ09OU1RfREJMKDAuNWYpICkKLSAgICAgICAgcmVzZXRMUENDb2VmZnM9MTsKKyAgICAgIGlmICgoZk11bHREaXYyKGFscGhhclswXSwgYWxwaGFyWzBdKSArIGZNdWx0RGl2MihhbHBoYWlbMF0sIGFscGhhaVswXSkpID49CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC41ZikpCisgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKKyAgICAgIGlmICgoZk11bHREaXYyKGFscGhhclsxXSwgYWxwaGFyWzFdKSArIGZNdWx0RGl2MihhbHBoYWlbMV0sIGFscGhhaVsxXSkpID49CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC41ZikpCisgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKICAgICB9CiAKLSAgICBpZihyZXNldExQQ0NvZWZmcyl7CisgICAgaWYgKHJlc2V0TFBDQ29lZmZzKSB7CiAgICAgICBhbHBoYXJbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKICAgICAgIGFscGhhclsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwotICAgICAgaWYgKCF1c2VMUCkKLSAgICAgIHsKKyAgICAgIGlmICghdXNlTFApIHsKICAgICAgICAgYWxwaGFpWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAgICAgICAgIGFscGhhaVsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogICAgICAgfQogICAgIH0KIAotICAgIGlmICh1c2VMUCkKLSAgICB7Ci0KKyAgICBpZiAodXNlTFApIHsKICAgICAgIC8qIEFsaWFzaW5nIGRldGVjdGlvbiAqLwotICAgICAgaWYoYWMucjExcj09RkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIGlmIChhYy5yMTFyID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgIGsxID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKCBmaXhwX2FicyhhYy5yMDFyKSA+PSBmaXhwX2FicyhhYy5yMTFyKSApIHsKLSAgICAgICAgICBpZiAoIGZNdWx0RGl2MihhYy5yMDFyLGFjLnIxMXIpIDwgRkwyRlhfREJMKDAuMGYpKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZml4cF9hYnMoYWMucjAxcikgPj0gZml4cF9hYnMoYWMucjExcikpIHsKKyAgICAgICAgICBpZiAoZk11bHREaXYyKGFjLnIwMXIsIGFjLnIxMXIpIDwgRkwyRlhfREJMKDAuMGYpKSB7CiAgICAgICAgICAgICBrMSA9IChGSVhQX0RCTClNQVhWQUxfREJMIC8qRkwyRlhDT05TVF9TR0woMS4wZikqLzsKLSAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAvKiBTaW5jZSB0aGlzIHZhbHVlIGlzIHNxdWFyZWQgbGF0ZXIsIGl0IG11c3Qgbm90IGV2ZXIgYmVjb21lIC0xLjBmLiAqLwotICAgICAgICAgICAgazEgPSAoRklYUF9EQkwpKE1JTlZBTF9EQkwrMSkgLypGTDJGWENPTlNUX1NHTCgtMS4wZikqLzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogU2luY2UgdGhpcyB2YWx1ZSBpcyBzcXVhcmVkIGxhdGVyLCBpdCBtdXN0IG5vdCBldmVyIGJlY29tZSAtMS4wZi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgazEgPSAoRklYUF9EQkwpKE1JTlZBTF9EQkwgKyAxKSAvKkZMMkZYQ09OU1RfU0dMKC0xLjBmKSovOwogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBJTlQgc2NhbGU7Ci0gICAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oZml4cF9hYnMoYWMucjAxciksIGZpeHBfYWJzKGFjLnIxMXIpLCAmc2NhbGUpOwotICAgICAgICAgIGsxID0gc2NhbGVWYWx1ZShyZXN1bHQsc2NhbGUpOworICAgICAgICAgIEZJWFBfREJMIHJlc3VsdCA9CisgICAgICAgICAgICAgIGZEaXZOb3JtKGZpeHBfYWJzKGFjLnIwMXIpLCBmaXhwX2FicyhhYy5yMTFyKSwgJnNjYWxlKTsKKyAgICAgICAgICBrMSA9IHNjYWxlVmFsdWUocmVzdWx0LCBzY2FsZSk7CiAKLSAgICAgICAgICBpZighKChhYy5yMDFyPEZMMkZYX0RCTCgwLjBmKSkgXiAoYWMucjExcjxGTDJGWF9EQkwoMC4wZikpKSkgeworICAgICAgICAgIGlmICghKChhYy5yMDFyIDwgRkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyIDwgRkwyRlhfREJMKDAuMGYpKSkpIHsKICAgICAgICAgICAgIGsxID0gLWsxOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgICAgaWYobG9CYW5kID4gMSl7CisgICAgICBpZiAoKGxvQmFuZCA+IDEpICYmIChsb0JhbmQgPCB2X2tfbWFzdGVyMCkpIHsKICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGdhaW4gc2hvdWxkIGJlIGxvY2tlZCAqLwotICAgICAgICBGSVhQX0RCTCBkZWcgPSAvKkZMMkZYQ09OU1RfREJMKDEuMGYpKi8gKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBmUG93MihrMV9iZWxvdyk7CisgICAgICAgIEZJWFBfREJMIGRlZyA9CisgICAgICAgICAgICAvKkZMMkZYQ09OU1RfREJMKDEuMGYpKi8gKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBmUG93MihrMV9iZWxvdyk7CiAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgICAgaWYgKCgobG9CYW5kICYgMSkgPT0gMCkgJiYgKGsxIDwgRkwyRlhDT05TVF9EQkwoMC4wZikpKXsKLSAgICAgICAgICBpZiAoazFfYmVsb3cgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeyAgICAgICAgIC8qIDItQ2ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCisgICAgICAgIGlmICgoKGxvQmFuZCAmIDEpID09IDApICYmIChrMSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgeworICAgICAgICAgIGlmIChrMV9iZWxvdyA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7IC8qIDItQ2ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCiAgICAgICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmRdID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLypGTDJGWENPTlNUX0RCTCgxLjBmKSovOwotICAgICAgICAgICAgaWYgKCBrMV9iZWxvdzIgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgICAgLyogMy1DaCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KLSAgICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kLTFdID0gZGVnOworICAgICAgICAgICAgaWYgKGsxX2JlbG93MiA+CisgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsgLyogMy1DaCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KKyAgICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kIC0gMV0gPSBkZWc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCBrMV9iZWxvdzIgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgLyogMy1DaCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KLSAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gICA9IGRlZzsKKyAgICAgICAgICB9IGVsc2UgaWYgKGsxX2JlbG93MiA+CisgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeyAvKiAzLUNoIEFsaWFzaW5nIERldGVjdGlvbiAqLworICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kXSA9IGRlZzsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCgobG9CYW5kICYgMSkgPT0gMSkgJiYgKGsxID4gRkwyRlhDT05TVF9EQkwoMC4wZikpKXsKLSAgICAgICAgICBpZiAoazFfYmVsb3cgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeyAgICAgICAgIC8qIDItQ0ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCisgICAgICAgIGlmICgoKGxvQmFuZCAmIDEpID09IDEpICYmIChrMSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgeworICAgICAgICAgIGlmIChrMV9iZWxvdyA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7IC8qIDItQ0ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCiAgICAgICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmRdID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLypGTDJGWENPTlNUX0RCTCgxLjBmKSovOwotICAgICAgICAgICAgaWYgKCBrMV9iZWxvdzIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgICAgLyogMy1DSCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KLSAgICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kLTFdID0gZGVnOworICAgICAgICAgICAgaWYgKGsxX2JlbG93MiA8CisgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsgLyogMy1DSCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KKyAgICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kIC0gMV0gPSBkZWc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCBrMV9iZWxvdzIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgLyogMy1DSCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KLSAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gICA9IGRlZzsKKyAgICAgICAgICB9IGVsc2UgaWYgKGsxX2JlbG93MiA8CisgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeyAvKiAzLUNIIEFsaWFzaW5nIERldGVjdGlvbiAqLworICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kXSA9IGRlZzsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTYxNiwyMyArNjg1LDI1IEBACiAKICAgICBwYXRjaCA9IDA7CiAKLSAgICB3aGlsZSAoIHBhdGNoIDwgcFNldHRpbmdzLT5ub09mUGF0Y2hlcyApIHsgLyogaW5uZXIgbG9vcCBvdmVyIGV2ZXJ5IHBhdGNoICovCisgICAgd2hpbGUgKHBhdGNoIDwgcFNldHRpbmdzLT5ub09mUGF0Y2hlcykgeyAvKiBpbm5lciBsb29wIG92ZXIgZXZlcnkgcGF0Y2ggKi8KIAogICAgICAgaW50IGhpQmFuZCA9IGxvQmFuZCArIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzOwogCi0gICAgICBpZiAoIGxvQmFuZCA8IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZAotICAgICAgICAgICB8fCBsb0JhbmQgPj0gcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQKLSAgICAgICAgICAgLy98fCBoaUJhbmQgPj0gaExwcFRyYW5zLT5wU2V0dGluZ3MtPm5vQ2hhbm5lbHMKLSAgICAgICAgICAgKSB7CisgICAgICBpZiAobG9CYW5kIDwgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kIHx8CisgICAgICAgICAgbG9CYW5kID49IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kCisgICAgICAgICAgLy98fCBoaUJhbmQgPj0gaExwcFRyYW5zLT5wU2V0dGluZ3MtPm5vQ2hhbm5lbHMKKyAgICAgICkgewogICAgICAgICAvKiBMb3diYW5kIG5vdCBpbiBjdXJyZW50IHBhdGNoIC0gcHJvY2VlZCAqLwogICAgICAgICBwYXRjaCsrOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KIAotICAgICAgRkRLX0FTU0VSVCggaGlCYW5kIDwgKDY0KSApOworICAgICAgRkRLX0FTU0VSVChoaUJhbmQgPCAoNjQpKTsKIAotICAgICAgLyogYndJbmRleFtwYXRjaF0gaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIHZhbHVlIGZyb20gcHJldmlvdXMgYmFuZCBpbnNpZGUgdGhpcyBwYXRjaCAqLwotICAgICAgd2hpbGUgKGhpQmFuZCA+PSBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tid0luZGV4W3BhdGNoXV0gJiYgYndJbmRleFtwYXRjaF0gPCBNQVhfTlVNX1BBVENIRVMtMSkgeworICAgICAgLyogYndJbmRleFtwYXRjaF0gaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIHZhbHVlIGZyb20gcHJldmlvdXMgYmFuZAorICAgICAgICogaW5zaWRlIHRoaXMgcGF0Y2ggKi8KKyAgICAgIHdoaWxlIChoaUJhbmQgPj0gcFNldHRpbmdzLT5id0JvcmRlcnNbYndJbmRleFtwYXRjaF1dICYmCisgICAgICAgICAgICAgYndJbmRleFtwYXRjaF0gPCBNQVhfTlVNX1BBVENIRVMgLSAxKSB7CiAgICAgICAgIGJ3SW5kZXhbcGF0Y2hdKys7CiAgICAgICB9CiAKQEAgLTY0MiwxMjEgKzcxMyw1MDYgQEAKICAgICAgICovCiAgICAgICBidyA9IEZYX0RCTDJGWF9TR0woYndWZWN0b3JbYndJbmRleFtwYXRjaF1dKTsKIAotICAgICAgYTByID0gRlhfREJMMkZYX1NHTChmTXVsdChidyxhbHBoYXJbMF0pKTsgLyogQXBwbHkgY3VycmVudCBiYW5kd2lkdGggZXhwYW5zaW9uIGZhY3RvciAqLworICAgICAgYTByID0gRlhfREJMMkZYX1NHTCgKKyAgICAgICAgICBmTXVsdChidywgYWxwaGFyWzBdKSk7IC8qIEFwcGx5IGN1cnJlbnQgYmFuZHdpZHRoIGV4cGFuc2lvbiBmYWN0b3IgKi8KIAotCi0gICAgICBpZiAoIXVzZUxQKQotICAgICAgICBhMGkgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LGFscGhhaVswXSkpOwotICAgICAgYncgPSAgRlhfREJMMkZYX1NHTChmUG93MihidykpOwotICAgICAgYTFyID0gRlhfREJMMkZYX1NHTChmTXVsdChidyxhbHBoYXJbMV0pKTsKLSAgICAgIGlmICghdXNlTFApCi0gICAgICAgIGExaSA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsYWxwaGFpWzFdKSk7Ci0KLQorICAgICAgaWYgKCF1c2VMUCkgYTBpID0gRlhfREJMMkZYX1NHTChmTXVsdChidywgYWxwaGFpWzBdKSk7CisgICAgICBidyA9IEZYX0RCTDJGWF9TR0woZlBvdzIoYncpKTsKKyAgICAgIGExciA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsIGFscGhhclsxXSkpOworICAgICAgaWYgKCF1c2VMUCkgYTFpID0gRlhfREJMMkZYX1NHTChmTXVsdChidywgYWxwaGFpWzFdKSk7CiAKICAgICAgIC8qCiAgICAgICAgIEZpbHRlciBTdGVwIDM6IGluc2VydCB0aGUgbWlkZGxlIHBhcnQgd2hpY2ggd29uJ3QgYmUgd2luZG93ZWQKICAgICAgICovCi0KLSAgICAgIGlmICggYncgPD0gRkwyRlhDT05TVF9TR0woMC4wZikgKSB7CisgICAgICBpZiAoYncgPD0gRkwyRlhDT05TVF9TR0woMC4wZikpIHsKICAgICAgICAgaWYgKCF1c2VMUCkgewotICAgICAgICAgIGludCBkZXNjYWxlID0gZml4TWluKERGUkFDVF9CSVRTLTEsIChMUENfU0NBTEVfRkFDVE9SK2R5bmFtaWNTY2FsZSkpOwotICAgICAgICAgIGZvcihpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlOyBpKysgKSB7Ci0gICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSBsb3dCYW5kUmVhbFtMUENfT1JERVIraV0+PmRlc2NhbGU7Ci0gICAgICAgICAgICBxbWZCdWZmZXJJbWFnW2ldW2hpQmFuZF0gPSBsb3dCYW5kSW1hZ1tMUENfT1JERVIraV0+PmRlc2NhbGU7CisgICAgICAgICAgaW50IGRlc2NhbGUgPQorICAgICAgICAgICAgICBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCAoTFBDX1NDQUxFX0ZBQ1RPUiArIGR5bmFtaWNTY2FsZSkpOworICAgICAgICAgIGZvciAoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrKSB7CisgICAgICAgICAgICBGSVhQX0RCTCBhY2N1MSwgYWNjdTI7CisgICAgICAgICAgICBhY2N1MSA9IGxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIGldID4+IGRlc2NhbGU7CisgICAgICAgICAgICBhY2N1MiA9IGxvd0JhbmRJbWFnW0xQQ19PUkRFUiArIGldID4+IGRlc2NhbGU7CisgICAgICAgICAgICBpZiAoZlByZVdoaXRlbmluZykgeworICAgICAgICAgICAgICBhY2N1MSA9IHNjYWxlVmFsdWVTYXR1cmF0ZSgKKyAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhY2N1MSwgcHJlV2hpdGVuaW5nR2FpbnNbbG9CYW5kXSksCisgICAgICAgICAgICAgICAgICBwcmVXaGl0ZW5pbmdHYWluc19leHBbbG9CYW5kXSArIDEpOworICAgICAgICAgICAgICBhY2N1MiA9IHNjYWxlVmFsdWVTYXR1cmF0ZSgKKyAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhY2N1MiwgcHJlV2hpdGVuaW5nR2FpbnNbbG9CYW5kXSksCisgICAgICAgICAgICAgICAgICBwcmVXaGl0ZW5pbmdHYWluc19leHBbbG9CYW5kXSArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcW1mQnVmZmVyUmVhbFtpXVtoaUJhbmRdID0gYWNjdTE7CisgICAgICAgICAgICBxbWZCdWZmZXJJbWFnW2ldW2hpQmFuZF0gPSBhY2N1MjsKICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgKExQQ19TQ0FMRV9GQUNUT1IrZHluYW1pY1NjYWxlKSk7Ci0gICAgICAgICAgZm9yKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGU7IGkrKyApIHsKLSAgICAgICAgICAgIHFtZkJ1ZmZlclJlYWxbaV1baGlCYW5kXSA9IGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpXT4+ZGVzY2FsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbnQgZGVzY2FsZSA9CisgICAgICAgICAgICAgIGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIChMUENfU0NBTEVfRkFDVE9SICsgZHluYW1pY1NjYWxlKSk7CisgICAgICAgICAgZm9yIChpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlOyBpKyspIHsKKyAgICAgICAgICAgIHFtZkJ1ZmZlclJlYWxbaV1baGlCYW5kXSA9IGxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIGldID4+IGRlc2NhbGU7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsgIC8qIGJ3IDw9IDAgKi8KKyAgICAgIH0gZWxzZSB7IC8qIGJ3IDw9IDAgKi8KIAogICAgICAgICBpZiAoIXVzZUxQKSB7Ci0gICAgICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgKExQQ19TQ0FMRV9GQUNUT1IrZHluYW1pY1NjYWxlKSk7CisgICAgICAgICAgaW50IGRlc2NhbGUgPQorICAgICAgICAgICAgICBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCAoTFBDX1NDQUxFX0ZBQ1RPUiArIGR5bmFtaWNTY2FsZSkpOwogI2lmZGVmIEZVTkNUSU9OX0xQUFRSQU5TUE9TRVJfZnVuYzEKLSAgICAgICAgICBscHBUcmFuc3Bvc2VyX2Z1bmMxKGxvd0JhbmRSZWFsK0xQQ19PUkRFUitzdGFydFNhbXBsZSxsb3dCYW5kSW1hZytMUENfT1JERVIrc3RhcnRTYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZCdWZmZXJSZWFsK3N0YXJ0U2FtcGxlLHFtZkJ1ZmZlckltYWcrc3RhcnRTYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wU2FtcGxlLXN0YXJ0U2FtcGxlLCAoaW50KSBoaUJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljU2NhbGUsZGVzY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEwciwgYTBpLCBhMXIsIGExaSk7CisgICAgICAgICAgbHBwVHJhbnNwb3Nlcl9mdW5jMSgKKyAgICAgICAgICAgICAgbG93QmFuZFJlYWwgKyBMUENfT1JERVIgKyBzdGFydFNhbXBsZSwKKyAgICAgICAgICAgICAgbG93QmFuZEltYWcgKyBMUENfT1JERVIgKyBzdGFydFNhbXBsZSwKKyAgICAgICAgICAgICAgcW1mQnVmZmVyUmVhbCArIHN0YXJ0U2FtcGxlLCBxbWZCdWZmZXJJbWFnICsgc3RhcnRTYW1wbGUsCisgICAgICAgICAgICAgIHN0b3BTYW1wbGUgLSBzdGFydFNhbXBsZSwgKGludCloaUJhbmQsIGR5bmFtaWNTY2FsZSwgZGVzY2FsZSwgYTByLAorICAgICAgICAgICAgICBhMGksIGExciwgYTFpLCBmUHJlV2hpdGVuaW5nLCBwcmVXaGl0ZW5pbmdHYWluc1tsb0JhbmRdLAorICAgICAgICAgICAgICBwcmVXaGl0ZW5pbmdHYWluc19leHBbbG9CYW5kXSArIDEpOwogI2Vsc2UKLSAgICAgICAgICBmb3IoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrICkgeworICAgICAgICAgIGZvciAoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrKSB7CiAgICAgICAgICAgICBGSVhQX0RCTCBhY2N1MSwgYWNjdTI7CiAKLSAgICAgICAgICAgIGFjY3UxID0gKGZNdWx0RGl2MihhMHIsbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMV0pIC0gZk11bHREaXYyKGEwaSxsb3dCYW5kSW1hZ1tMUENfT1JERVIraS0xXSkgKwotICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGExcixsb3dCYW5kUmVhbFtMUENfT1JERVIraS0yXSkgLSBmTXVsdERpdjIoYTFpLGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpLTJdKSk+PmR5bmFtaWNTY2FsZTsKLSAgICAgICAgICAgIGFjY3UyID0gKGZNdWx0RGl2MihhMGksbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMV0pICsgZk11bHREaXYyKGEwcixsb3dCYW5kSW1hZ1tMUENfT1JERVIraS0xXSkgKwotICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGExaSxsb3dCYW5kUmVhbFtMUENfT1JERVIraS0yXSkgKyBmTXVsdERpdjIoYTFyLGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpLTJdKSk+PmR5bmFtaWNTY2FsZTsKKyAgICAgICAgICAgIGFjY3UxID0gKGZNdWx0RGl2MihhMHIsIGxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIGkgLSAxXSkgLQorICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGEwaSwgbG93QmFuZEltYWdbTFBDX09SREVSICsgaSAtIDFdKSArCisgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTFyLCBsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBpIC0gMl0pIC0KKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhMWksIGxvd0JhbmRJbWFnW0xQQ19PUkRFUiArIGkgLSAyXSkpID4+CisgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZTsKKyAgICAgICAgICAgIGFjY3UyID0gKGZNdWx0RGl2MihhMGksIGxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIGkgLSAxXSkgKworICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGEwciwgbG93QmFuZEltYWdbTFBDX09SREVSICsgaSAtIDFdKSArCisgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTFpLCBsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBpIC0gMl0pICsKKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhMXIsIGxvd0JhbmRJbWFnW0xQQ19PUkRFUiArIGkgLSAyXSkpID4+CisgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZTsKIAotICAgICAgICAgICAgcW1mQnVmZmVyUmVhbFtpXVtoaUJhbmRdID0gKGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpXT4+ZGVzY2FsZSkgKyAoYWNjdTE8PDEpOwotICAgICAgICAgICAgcW1mQnVmZmVySW1hZ1tpXVtoaUJhbmRdID0gKGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpXT4+ZGVzY2FsZSkgKyAoYWNjdTI8PDEpOworICAgICAgICAgICAgYWNjdTEgPSAobG93QmFuZFJlYWxbTFBDX09SREVSICsgaV0gPj4gZGVzY2FsZSkgKyAoYWNjdTEgPDwgMSk7CisgICAgICAgICAgICBhY2N1MiA9IChsb3dCYW5kSW1hZ1tMUENfT1JERVIgKyBpXSA+PiBkZXNjYWxlKSArIChhY2N1MiA8PCAxKTsKKyAgICAgICAgICAgIGlmIChmUHJlV2hpdGVuaW5nKSB7CisgICAgICAgICAgICAgIGFjY3UxID0gc2NhbGVWYWx1ZVNhdHVyYXRlKAorICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGFjY3UxLCBwcmVXaGl0ZW5pbmdHYWluc1tsb0JhbmRdKSwKKyAgICAgICAgICAgICAgICAgIHByZVdoaXRlbmluZ0dhaW5zX2V4cFtsb0JhbmRdICsgMSk7CisgICAgICAgICAgICAgIGFjY3UyID0gc2NhbGVWYWx1ZVNhdHVyYXRlKAorICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGFjY3UyLCBwcmVXaGl0ZW5pbmdHYWluc1tsb0JhbmRdKSwKKyAgICAgICAgICAgICAgICAgIHByZVdoaXRlbmluZ0dhaW5zX2V4cFtsb0JhbmRdICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSBhY2N1MTsKKyAgICAgICAgICAgIHFtZkJ1ZmZlckltYWdbaV1baGlCYW5kXSA9IGFjY3UyOwogICAgICAgICAgIH0KICNlbmRpZgotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGludCBkZXNjYWxlID0gZml4TWluKERGUkFDVF9CSVRTLTEsIChMUENfU0NBTEVfRkFDVE9SK2R5bmFtaWNTY2FsZSkpOwotCisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgRkRLX0FTU0VSVChkeW5hbWljU2NhbGUgPj0gMCk7Ci0gICAgICAgICAgZm9yKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGU7IGkrKyApIHsKLSAgICAgICAgICAgIEZJWFBfREJMIGFjY3UxOwotCi0gICAgICAgICAgICBhY2N1MSA9IChmTXVsdERpdjIoYTByLGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpLTFdKSArIGZNdWx0RGl2MihhMXIsbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMl0pKT4+ZHluYW1pY1NjYWxlOwotCi0gICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSAobG93QmFuZFJlYWxbTFBDX09SREVSK2ldPj5kZXNjYWxlKSArIChhY2N1MTw8MSk7Ci0gICAgICAgICAgfQorICAgICAgICAgIGNhbGNfcW1mQnVmZmVyUmVhbCgKKyAgICAgICAgICAgICAgcW1mQnVmZmVyUmVhbCwgJihsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBzdGFydFNhbXBsZSAtIDJdKSwKKyAgICAgICAgICAgICAgc3RhcnRTYW1wbGUsIHN0b3BTYW1wbGUsIGhpQmFuZCwgZHluYW1pY1NjYWxlLAorICAgICAgICAgICAgICBmTWluKERGUkFDVF9CSVRTIC0gMSwgKExQQ19TQ0FMRV9GQUNUT1IgKyBkeW5hbWljU2NhbGUpKSwgYTByLAorICAgICAgICAgICAgICBhMXIpOwogICAgICAgICB9CiAgICAgICB9IC8qIGJ3IDw9IDAgKi8KIAogICAgICAgcGF0Y2grKzsKIAotICAgIH0gIC8qIGlubmVyIGxvb3Agb3ZlciBwYXRjaGVzICovCisgICAgfSAvKiBpbm5lciBsb29wIG92ZXIgcGF0Y2hlcyAqLwogCi0gICAgIC8qCisgICAgLyoKICAgICAgKiBzdG9yZSB0aGUgdW5tb2RpZmllZCBmaWx0ZXIgY29lZmZpY2llbnRzIGlmIHRoZXJlIGlzCiAgICAgICogYW4gb3ZlcmxhcHBpbmcgZW52ZWxvcGUKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyAgfSAvKiBvdXRlciBsb29wIG92ZXIgYmFuZHMgKGxvQmFuZCkgKi8KIAotICB9ICAvKiBvdXRlciBsb29wIG92ZXIgYmFuZHMgKGxvQmFuZCkgKi8KLQotICBpZiAodXNlTFApCi0gIHsKLSAgICBmb3IgKCBsb0JhbmQgPSBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZzsgbG9CYW5kIDwgIHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmc7IGxvQmFuZCsrICkgeworICBpZiAodXNlTFApIHsKKyAgICBmb3IgKGxvQmFuZCA9IHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nOworICAgICAgICAgbG9CYW5kIDwgcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZzsgbG9CYW5kKyspIHsKICAgICAgIHBhdGNoID0gMDsKLSAgICAgIHdoaWxlICggcGF0Y2ggPCBwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzICkgewotCisgICAgICB3aGlsZSAocGF0Y2ggPCBwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzKSB7CiAgICAgICAgIFVDSEFSIGhpQmFuZCA9IGxvQmFuZCArIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzOwogCi0gICAgICAgIGlmICggbG9CYW5kIDwgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kCi0gICAgICAgICAgfHwgbG9CYW5kID49IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kCi0gICAgICAgICAgfHwgaGlCYW5kID49ICg2NCkgICAgICAgICAgICAgIC8qIEhpZ2hiYW5kIG91dCBvZiByYW5nZSAoYml0ZXJyb3IpICovCi0gICAgICAgICAgKSB7Ci0gICAgICAgICAgLyogTG93YmFuZCBub3QgaW4gY3VycmVudCBwYXRjaCBvciBoaWdoYmFuZCBvdXQgb2YgcmFuZ2UgKG1pZ2h0IGJlIGNhdXNlZCBieSBiaXRlcnJvcnMpLSBwcm9jZWVkICovCisgICAgICAgIGlmIChsb0JhbmQgPCBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQgfHwKKyAgICAgICAgICAgIGxvQmFuZCA+PSBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdG9wQmFuZCB8fAorICAgICAgICAgICAgaGlCYW5kID49ICg2NCkgLyogSGlnaGJhbmQgb3V0IG9mIHJhbmdlIChiaXRlcnJvcikgKi8KKyAgICAgICAgKSB7CisgICAgICAgICAgLyogTG93YmFuZCBub3QgaW4gY3VycmVudCBwYXRjaCBvciBoaWdoYmFuZCBvdXQgb2YgcmFuZ2UgKG1pZ2h0IGJlCisgICAgICAgICAgICogY2F1c2VkIGJ5IGJpdGVycm9ycyktIHByb2NlZWQgKi8KICAgICAgICAgICBwYXRjaCsrOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYoaGlCYW5kICE9IHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldFN0YXJ0QmFuZCkKKyAgICAgICAgaWYgKGhpQmFuZCAhPSBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRTdGFydEJhbmQpCiAgICAgICAgICAgZGVncmVlQWxpYXNbaGlCYW5kXSA9IGRlZ3JlZUFsaWFzW2xvQmFuZF07CiAKICAgICAgICAgcGF0Y2grKzsKICAgICAgIH0KLSAgICB9LyogZW5kICBmb3IgbG9vcCAqLworICAgIH0gLyogZW5kICBmb3IgbG9vcCAqLwogICB9CiAKLSBmb3IgKGkgPSAwOyBpIDwgbkludmZCYW5kczsgaSsrICkgewotICAgaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSA9IGJ3VmVjdG9yW2ldOwotIH0KKyAgZm9yIChpID0gMDsgaSA8IG5JbnZmQmFuZHM7IGkrKykgeworICAgIGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0gPSBid1ZlY3RvcltpXTsKKyAgfQogCiAgIC8qCiAgICAgc2V0IGhpZ2ggYmFuZCBzY2FsZSBmYWN0b3IKICAgKi8KLSAgc2JyU2NhbGVGYWN0b3ItPmhiX3NjYWxlID0gY29tTG93QmFuZFNjYWxlLShMUENfU0NBTEVfRkFDVE9SKTsKKyAgc2JyU2NhbGVGYWN0b3ItPmhiX3NjYWxlID0gY29tTG93QmFuZFNjYWxlIC0gKExQQ19TQ0FMRV9GQUNUT1IpOworfQogCit2b2lkIGxwcFRyYW5zcG9zZXJIQkUoCisgICAgSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLCAvKiE8IEhhbmRsZSBvZiBscHAgdHJhbnNwb3NlciAgKi8KKyAgICBIQU5ETEVfSEJFX1RSQU5TUE9TRVIgaFFtZlRyYW5zcG9zZXIsCisgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2JyU2NhbGVGYWN0b3IsIC8qITwgU2NhbGluZyBmYWN0b3JzICovCisgICAgRklYUF9EQkwgKipxbWZCdWZmZXJSZWFsLCAvKiE8IFBvaW50ZXIgdG8gcG9pbnRlciB0byByZWFsIHBhcnQgb2Ygc3ViYmFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyAoc291cmNlKSAqLworICAgIEZJWFBfREJMICoqcW1mQnVmZmVySW1hZywgLyohPCBQb2ludGVyIHRvIHBvaW50ZXIgdG8gaW1hZ2luYXJ5IHBhcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmJhbmQgc2FtcGxlcyAoc291cmNlKSAqLworICAgIGNvbnN0IGludCB0aW1lU3RlcCwgICAgICAgLyohPCBUaW1lIHN0ZXAgb2YgZW52ZWxvcGUgKi8KKyAgICBjb25zdCBpbnQgZmlyc3RTbG90T2ZmcywgIC8qITwgU3RhcnQgcG9zaXRpb24gaW4gdGltZSAqLworICAgIGNvbnN0IGludCBsYXN0U2xvdE9mZnMsICAgLyohPCBOdW1iZXIgb2Ygb3ZlcmxhcC1zbG90cyBpbnRvIG5leHQgZnJhbWUgKi8KKyAgICBjb25zdCBpbnQgbkludmZCYW5kcywgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGZvciBpbnZlcnNlIGZpbHRlcmluZyAqLworICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZSwgLyohPCBDdXJyZW50IGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCisgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlX3ByZXYgLyohPCBQcmV2aW91cyBpbnZlcnNlIGZpbHRlcmluZyBtb2RlcyAqLworKSB7CisgIElOVCBid0luZGV4OworICBGSVhQX0RCTCBid1ZlY3RvcltNQVhfTlVNX1BBVENIRVNfSEJFXTsgLyohPCBwb2xlIG1vdmluZyBmYWN0b3JzICovCisKKyAgaW50IGk7CisgIGludCBsb0JhbmQsIHN0YXJ0LCBzdG9wOworICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MgPSBoTHBwVHJhbnMtPnBTZXR0aW5nczsKKyAgUEFUQ0hfUEFSQU0gKnBhdGNoUGFyYW0gPSBwU2V0dGluZ3MtPnBhdGNoUGFyYW07CisKKyAgRklYUF9TR0wgYWxwaGFyW0xQQ19PUkRFUl0sIGEwciwgYTFyOworICBGSVhQX1NHTCBhbHBoYWlbTFBDX09SREVSXSwgYTBpID0gMCwgYTFpID0gMDsKKyAgRklYUF9TR0wgYncgPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKworICBpbnQgYXV0b0NvcnJMZW5ndGg7CisKKyAgQUNPUlJfQ09FRlMgYWM7CisgIGludCBzdGFydFNhbXBsZTsKKyAgaW50IHN0b3BTYW1wbGU7CisgIGludCBzdG9wU2FtcGxlQ2xlYXI7CisKKyAgaW50IGNvbUJhbmRTY2FsZTsKKyAgaW50IG92TG93QmFuZFNoaWZ0OworICBpbnQgbG93QmFuZFNoaWZ0OworICAvKiAgaW50IG92SGlnaEJhbmRTaGlmdDsqLworCisgIGFscGhhaVswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICBhbHBoYWlbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKworICBzdGFydFNhbXBsZSA9IGZpcnN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKKyAgc3RvcFNhbXBsZSA9IHBTZXR0aW5ncy0+bkNvbHMgKyBsYXN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKKworICBpbnZlcnNlRmlsdGVyaW5nTGV2ZWxFbXBoYXNpcyhoTHBwVHJhbnMsIG5JbnZmQmFuZHMsIHNicl9pbnZmX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNicl9pbnZmX21vZGVfcHJldiwgYndWZWN0b3IpOworCisgIHN0b3BTYW1wbGVDbGVhciA9IHN0b3BTYW1wbGU7CisKKyAgYXV0b0NvcnJMZW5ndGggPSBwU2V0dGluZ3MtPm5Db2xzICsgcFNldHRpbmdzLT5vdmVybGFwOworCisgIGlmIChwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzID4gMCkgeworICAgIC8qIFNldCB1cHBlciBzdWJiYW5kcyB0byB6ZXJvOgorICAgICAgIFRoaXMgaXMgcmVxdWlyZWQgaW4gY2FzZSB0aGF0IHRoZSBwYXRjaGVzIGRvIG5vdCBjb3ZlciB0aGUgY29tcGxldGUKKyAgICAgICBoaWdoYmFuZCAoYmVjYXVzZSB0aGUgbGFzdCBwYXRjaCB3b3VsZCBiZSB0b28gc2hvcnQpLiBQb3NzaWJsZQorICAgICAgIG9wdGltaXphdGlvbjogQ2xlYXJpbmcgYmFuZHMgdXAgdG8gdXNiIHdvdWxkIGJlIHN1ZmZpY2llbnQgaGVyZS4gKi8KKyAgICBpbnQgdGFyZ2V0U3RvcEJhbmQgPQorICAgICAgICBwYXRjaFBhcmFtW3BTZXR0aW5ncy0+bm9PZlBhdGNoZXMgLSAxXS50YXJnZXRTdGFydEJhbmQgKworICAgICAgICBwYXRjaFBhcmFtW3BTZXR0aW5ncy0+bm9PZlBhdGNoZXMgLSAxXS5udW1CYW5kc0luUGF0Y2g7CisKKyAgICBpbnQgbWVtU2l6ZSA9ICgoNjQpIC0gdGFyZ2V0U3RvcEJhbmQpICogc2l6ZW9mKEZJWFBfREJMKTsKKworICAgIGZvciAoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZUNsZWFyOyBpKyspIHsKKyAgICAgIEZES21lbWNsZWFyKCZxbWZCdWZmZXJSZWFsW2ldW3RhcmdldFN0b3BCYW5kXSwgbWVtU2l6ZSk7CisgICAgICBGREttZW1jbGVhcigmcW1mQnVmZmVySW1hZ1tpXVt0YXJnZXRTdG9wQmFuZF0sIG1lbVNpemUpOworICAgIH0KKyAgfQorI2lmZGVmIF9fQU5EUk9JRF9fCisgIGVsc2UgeworICAgIC8vIFNhZmV0eW5ldCBsb2dnaW5nCisgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTIxNjA4NjgiKTsKKyAgfQorI2VuZGlmCisKKyAgLyoKKyAgQ2FsYyBjb21tb24gbG93IGJhbmQgc2NhbGUgZmFjdG9yCisgICovCisgIGNvbUJhbmRTY2FsZSA9IHNiclNjYWxlRmFjdG9yLT5oYl9zY2FsZTsKKworICBvdkxvd0JhbmRTaGlmdCA9IHNiclNjYWxlRmFjdG9yLT5oYl9zY2FsZSAtIGNvbUJhbmRTY2FsZTsKKyAgbG93QmFuZFNoaWZ0ID0gc2JyU2NhbGVGYWN0b3ItPmhiX3NjYWxlIC0gY29tQmFuZFNjYWxlOworICAvKiAgb3ZIaWdoQmFuZFNoaWZ0ID0gZmlyc3RTbG90T2ZmcyA9PSAwID8gb3ZMb3dCYW5kU2hpZnQ6MDsqLworCisgIC8qIG91dGVyIGxvb3Agb3ZlciBiYW5kcyB0byBkbyBhbmFseXNpcyBvbmx5IG9uY2UgZm9yIGVhY2ggYmFuZCAqLworCisgIHN0YXJ0ID0gaFFtZlRyYW5zcG9zZXItPnN0YXJ0QmFuZDsKKyAgc3RvcCA9IGhRbWZUcmFuc3Bvc2VyLT5zdG9wQmFuZDsKKworICBmb3IgKGxvQmFuZCA9IHN0YXJ0OyBsb0JhbmQgPCBzdG9wOyBsb0JhbmQrKykgeworICAgIGJ3SW5kZXggPSAwOworCisgICAgRklYUF9EQkwgbG93QmFuZFJlYWxbKCgoMTAyNCkgLyAoMzIpICogKDQpIC8gMikgKyAoMyAqICg0KSkpICsgTFBDX09SREVSXTsKKyAgICBGSVhQX0RCTCBsb3dCYW5kSW1hZ1soKCgxMDI0KSAvICgzMikgKiAoNCkgLyAyKSArICgzICogKDQpKSkgKyBMUENfT1JERVJdOworCisgICAgaW50IHJlc2V0TFBDQ29lZmZzID0gMDsKKyAgICBpbnQgZHluYW1pY1NjYWxlID0gREZSQUNUX0JJVFMgLSAxIC0gTFBDX1NDQUxFX0ZBQ1RPUjsKKyAgICBpbnQgYWNEZXRTY2FsZSA9IDA7IC8qIHNjYWxpbmcgb2YgYXV0b2NvcnJlbGF0aW9uIGRldGVybWluYW50ICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFBDX09SREVSOyBpKyspIHsKKyAgICAgIGxvd0JhbmRSZWFsW2ldID0gaExwcFRyYW5zLT5scGNGaWx0ZXJTdGF0ZXNSZWFsSEJFW2ldW2xvQmFuZF07CisgICAgICBsb3dCYW5kSW1hZ1tpXSA9IGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzSW1hZ0hCRVtpXVtsb0JhbmRdOworICAgIH0KKworICAgIGZvciAoOyBpIDwgTFBDX09SREVSICsgZmlyc3RTbG90T2ZmcyAqIHRpbWVTdGVwOyBpKyspIHsKKyAgICAgIGxvd0JhbmRSZWFsW2ldID0gaExwcFRyYW5zLT5scGNGaWx0ZXJTdGF0ZXNSZWFsSEJFW2ldW2xvQmFuZF07CisgICAgICBsb3dCYW5kSW1hZ1tpXSA9IGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzSW1hZ0hCRVtpXVtsb0JhbmRdOworICAgIH0KKworICAgIC8qCisgICAgVGFrZSBvbGQgc2xvcGUgbGVuZ3RoIHFtZiBzbG90IHNvdXJjZSB2YWx1ZXMgb3V0IG9mIChvdmVybGFwKXFtZiBidWZmZXIKKyAgICAqLworICAgIGZvciAoaSA9IGZpcnN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKKyAgICAgICAgIGkgPCBwU2V0dGluZ3MtPm5Db2xzICsgcFNldHRpbmdzLT5vdmVybGFwOyBpKyspIHsKKyAgICAgIGxvd0JhbmRSZWFsW2kgKyBMUENfT1JERVJdID0gcW1mQnVmZmVyUmVhbFtpXVtsb0JhbmRdOworICAgICAgbG93QmFuZEltYWdbaSArIExQQ19PUkRFUl0gPSBxbWZCdWZmZXJJbWFnW2ldW2xvQmFuZF07CisgICAgfQorCisgICAgLyogc3RvcmUgdW5tb2RpZmllZCB2YWx1ZXMgdG8gYnVmZmVyICovCisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcDsgaSsrKSB7CisgICAgICBoTHBwVHJhbnMtPmxwY0ZpbHRlclN0YXRlc1JlYWxIQkVbaV1bbG9CYW5kXSA9CisgICAgICAgICAgcW1mQnVmZmVyUmVhbFtwU2V0dGluZ3MtPm5Db2xzIC0gTFBDX09SREVSICsgaV1bbG9CYW5kXTsKKyAgICAgIGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzSW1hZ0hCRVtpXVtsb0JhbmRdID0KKyAgICAgICAgICBxbWZCdWZmZXJJbWFnW3BTZXR0aW5ncy0+bkNvbHMgLSBMUENfT1JERVIgKyBpXVtsb0JhbmRdOworICAgIH0KKworICAgIC8qCisgICAgRGV0ZXJtaW5lIGR5bmFtaWMgc2NhbGluZyB2YWx1ZS4KKyAgICAqLworICAgIGR5bmFtaWNTY2FsZSA9CisgICAgICAgIGZpeE1pbihkeW5hbWljU2NhbGUsCisgICAgICAgICAgICAgICBnZXRTY2FsZWZhY3Rvcihsb3dCYW5kUmVhbCwgTFBDX09SREVSICsgcFNldHRpbmdzLT5vdmVybGFwKSArCisgICAgICAgICAgICAgICAgICAgb3ZMb3dCYW5kU2hpZnQpOworICAgIGR5bmFtaWNTY2FsZSA9CisgICAgICAgIGZpeE1pbihkeW5hbWljU2NhbGUsCisgICAgICAgICAgICAgICBnZXRTY2FsZWZhY3RvcigmbG93QmFuZFJlYWxbTFBDX09SREVSICsgcFNldHRpbmdzLT5vdmVybGFwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+bkNvbHMpICsKKyAgICAgICAgICAgICAgICAgICBsb3dCYW5kU2hpZnQpOworICAgIGR5bmFtaWNTY2FsZSA9CisgICAgICAgIGZpeE1pbihkeW5hbWljU2NhbGUsCisgICAgICAgICAgICAgICBnZXRTY2FsZWZhY3Rvcihsb3dCYW5kSW1hZywgTFBDX09SREVSICsgcFNldHRpbmdzLT5vdmVybGFwKSArCisgICAgICAgICAgICAgICAgICAgb3ZMb3dCYW5kU2hpZnQpOworICAgIGR5bmFtaWNTY2FsZSA9CisgICAgICAgIGZpeE1pbihkeW5hbWljU2NhbGUsCisgICAgICAgICAgICAgICBnZXRTY2FsZWZhY3RvcigmbG93QmFuZEltYWdbTFBDX09SREVSICsgcFNldHRpbmdzLT5vdmVybGFwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+bkNvbHMpICsKKyAgICAgICAgICAgICAgICAgICBsb3dCYW5kU2hpZnQpOworCisgICAgZHluYW1pY1NjYWxlID0gZml4TWF4KAorICAgICAgICAwLCBkeW5hbWljU2NhbGUgLSAxKTsgLyogb25lIGFkZGl0aW9uYWwgYml0IGhlYWRyb29tIHRvIHByZXZlbnQgLTEuMCAqLworCisgICAgLyoKKyAgICBTY2FsZSB0ZW1wb3JhbCBRTUYgYnVmZmVyLgorICAgICovCisgICAgc2NhbGVWYWx1ZXMoJmxvd0JhbmRSZWFsWzBdLCBMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXAsCisgICAgICAgICAgICAgICAgZHluYW1pY1NjYWxlIC0gb3ZMb3dCYW5kU2hpZnQpOworICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzLAorICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZSAtIGxvd0JhbmRTaGlmdCk7CisgICAgc2NhbGVWYWx1ZXMoJmxvd0JhbmRJbWFnWzBdLCBMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXAsCisgICAgICAgICAgICAgICAgZHluYW1pY1NjYWxlIC0gb3ZMb3dCYW5kU2hpZnQpOworICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kSW1hZ1tMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzLAorICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZSAtIGxvd0JhbmRTaGlmdCk7CisKKyAgICBhY0RldFNjYWxlICs9IGF1dG9Db3JyMm5kX2NwbHgoJmFjLCBsb3dCYW5kUmVhbCArIExQQ19PUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93QmFuZEltYWcgKyBMUENfT1JERVIsIGF1dG9Db3JyTGVuZ3RoKTsKKworICAgIC8qIEV4YW1pbmUgZHluYW1pYyBvZiBkZXRlcm1pbmFudCBpbiBhdXRvY29ycmVsYXRpb24uICovCisgICAgYWNEZXRTY2FsZSArPSAyICogKGNvbUJhbmRTY2FsZSArIGR5bmFtaWNTY2FsZSk7CisgICAgYWNEZXRTY2FsZSAqPSAyOyAgICAgICAgICAgIC8qIHR3byB0aW1lcyByZWZsZWN0aW9uIGNvZWZmaWNlbnQgc2NhbGluZyAqLworICAgIGFjRGV0U2NhbGUgKz0gYWMuZGV0X3NjYWxlOyAvKiBhYyBzY2FsaW5nIG9mIGRldGVybWluYW50ICovCisKKyAgICAvKiBJbiBjYXNlIG9mIGRldGVybWluYW50IDwgMTBeLTM4LCByZXNldExQQ0NvZWZmcz0xIGhhcyB0byBiZSBlbmZvcmNlZC4gKi8KKyAgICBpZiAoYWNEZXRTY2FsZSA+IDEyNikgeworICAgICAgcmVzZXRMUENDb2VmZnMgPSAxOworICAgIH0KKworICAgIGFscGhhclsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgIGFscGhhaVsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworCisgICAgaWYgKGFjLmRldCAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgRklYUF9EQkwgdG1wLCBhYnNUbXAsIGFic0RldDsKKworICAgICAgYWJzRGV0ID0gZml4cF9hYnMoYWMuZGV0KTsKKworICAgICAgdG1wID0gKGZNdWx0RGl2MihhYy5yMDFyLCBhYy5yMTJyKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUiAtIDEpKSAtCisgICAgICAgICAgICAoKGZNdWx0RGl2MihhYy5yMDFpLCBhYy5yMTJpKSArIGZNdWx0RGl2MihhYy5yMDJyLCBhYy5yMTFyKSkgPj4KKyAgICAgICAgICAgICAoTFBDX1NDQUxFX0ZBQ1RPUiAtIDEpKTsKKyAgICAgIGFic1RtcCA9IGZpeHBfYWJzKHRtcCk7CisKKyAgICAgIC8qCisgICAgICBRdWljayBjaGVjazogaXMgZmlyc3QgZmlsdGVyIGNvZWZmID49IDEoNCkKKyAgICAgICovCisgICAgICB7CisgICAgICAgIElOVCBzY2FsZTsKKyAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBhYnNEZXQsICZzY2FsZSk7CisgICAgICAgIHNjYWxlID0gc2NhbGUgKyBhYy5kZXRfc2NhbGU7CisKKyAgICAgICAgaWYgKChzY2FsZSA+IDApICYmIChyZXN1bHQgPj0gKEZJWFBfREJMKU1BWFZBTF9EQkwgPj4gc2NhbGUpKSB7CisgICAgICAgICAgcmVzZXRMUENDb2VmZnMgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFscGhhclsxXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsIHNjYWxlKSk7CisgICAgICAgICAgaWYgKCh0bXAgPCBGTDJGWF9EQkwoMC4wZikpIF4gKGFjLmRldCA8IEZMMkZYX0RCTCgwLjBmKSkpIHsKKyAgICAgICAgICAgIGFscGhhclsxXSA9IC1hbHBoYXJbMV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRtcCA9IChmTXVsdERpdjIoYWMucjAxaSwgYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1IgLSAxKSkgKworICAgICAgICAgICAgKChmTXVsdERpdjIoYWMucjAxciwgYWMucjEyaSkgLQorICAgICAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGFjLnIwMmksIGFjLnIxMXIpKSA+PgorICAgICAgICAgICAgIChMUENfU0NBTEVfRkFDVE9SIC0gMSkpOworCisgICAgICBhYnNUbXAgPSBmaXhwX2Ficyh0bXApOworCisgICAgICAvKgorICAgICAgUXVpY2sgY2hlY2s6IGlzIHNlY29uZCBmaWx0ZXIgY29lZmYgPj0gMSg0KQorICAgICAgKi8KKyAgICAgIHsKKyAgICAgICAgSU5UIHNjYWxlOworICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGFic0RldCwgJnNjYWxlKTsKKyAgICAgICAgc2NhbGUgPSBzY2FsZSArIGFjLmRldF9zY2FsZTsKKworICAgICAgICBpZiAoKHNjYWxlID4gMCkgJiYKKyAgICAgICAgICAgIChyZXN1bHQgPj0gLypGTDJGWENPTlNUX0RCTCgxLmYpKi8gKEZJWFBfREJMKU1BWFZBTF9EQkwgPj4gc2NhbGUpKSB7CisgICAgICAgICAgcmVzZXRMUENDb2VmZnMgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFscGhhaVsxXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsIHNjYWxlKSk7CisgICAgICAgICAgaWYgKCh0bXAgPCBGTDJGWF9EQkwoMC4wZikpIF4gKGFjLmRldCA8IEZMMkZYX0RCTCgwLjBmKSkpIHsKKyAgICAgICAgICAgIGFscGhhaVsxXSA9IC1hbHBoYWlbMV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgYWxwaGFyWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisgICAgYWxwaGFpWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisKKyAgICBpZiAoYWMucjExciAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgLyogYWMucjExciBpcyBhbHdheXMgPj0wICovCisgICAgICBGSVhQX0RCTCB0bXAsIGFic1RtcDsKKworICAgICAgdG1wID0gKGFjLnIwMXIgPj4gKExQQ19TQ0FMRV9GQUNUT1IgKyAxKSkgKworICAgICAgICAgICAgKGZNdWx0RGl2MihhbHBoYXJbMV0sIGFjLnIxMnIpICsgZk11bHREaXYyKGFscGhhaVsxXSwgYWMucjEyaSkpOworCisgICAgICBhYnNUbXAgPSBmaXhwX2Ficyh0bXApOworCisgICAgICAvKgorICAgICAgUXVpY2sgY2hlY2s6IGlzIGZpcnN0IGZpbHRlciBjb2VmZiA+PSAxKDQpCisgICAgICAqLworCisgICAgICBpZiAoYWJzVG1wID49IChhYy5yMTFyID4+IDEpKSB7CisgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIElOVCBzY2FsZTsKKyAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBmaXhwX2FicyhhYy5yMTFyKSwgJnNjYWxlKTsKKyAgICAgICAgYWxwaGFyWzBdID0gRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCwgc2NhbGUgKyAxKSk7CisKKyAgICAgICAgaWYgKCh0bXAgPiBGTDJGWF9EQkwoMC4wZikpIF4gKGFjLnIxMXIgPCBGTDJGWF9EQkwoMC4wZikpKQorICAgICAgICAgIGFscGhhclswXSA9IC1hbHBoYXJbMF07CisgICAgICB9CisKKyAgICAgIHRtcCA9IChhYy5yMDFpID4+IChMUENfU0NBTEVfRkFDVE9SICsgMSkpICsKKyAgICAgICAgICAgIChmTXVsdERpdjIoYWxwaGFpWzFdLCBhYy5yMTJyKSAtIGZNdWx0RGl2MihhbHBoYXJbMV0sIGFjLnIxMmkpKTsKKworICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKKworICAgICAgLyoKKyAgICAgIFF1aWNrIGNoZWNrOiBpcyBzZWNvbmQgZmlsdGVyIGNvZWZmID49IDEoNCkKKyAgICAgICovCisgICAgICBpZiAoYWJzVG1wID49IChhYy5yMTFyID4+IDEpKSB7CisgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIElOVCBzY2FsZTsKKyAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBmaXhwX2FicyhhYy5yMTFyKSwgJnNjYWxlKTsKKyAgICAgICAgYWxwaGFpWzBdID0gRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCwgc2NhbGUgKyAxKSk7CisgICAgICAgIGlmICgodG1wID4gRkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyIDwgRkwyRlhfREJMKDAuMGYpKSkgeworICAgICAgICAgIGFscGhhaVswXSA9IC1hbHBoYWlbMF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBOb3cgY2hlY2sgdGhlIHF1YWRyYXRpYyBjcml0ZXJpYSAqLworICAgIGlmICgoZk11bHREaXYyKGFscGhhclswXSwgYWxwaGFyWzBdKSArIGZNdWx0RGl2MihhbHBoYWlbMF0sIGFscGhhaVswXSkpID49CisgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNWYpKSB7CisgICAgICByZXNldExQQ0NvZWZmcyA9IDE7CisgICAgfQorICAgIGlmICgoZk11bHREaXYyKGFscGhhclsxXSwgYWxwaGFyWzFdKSArIGZNdWx0RGl2MihhbHBoYWlbMV0sIGFscGhhaVsxXSkpID49CisgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNWYpKSB7CisgICAgICByZXNldExQQ0NvZWZmcyA9IDE7CisgICAgfQorCisgICAgaWYgKHJlc2V0TFBDQ29lZmZzKSB7CisgICAgICBhbHBoYXJbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKyAgICAgIGFscGhhclsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgICAgYWxwaGFpWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisgICAgICBhbHBoYWlbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKyAgICB9CisKKyAgICB3aGlsZSAoYndJbmRleCA8IE1BWF9OVU1fUEFUQ0hFUyAtIDEgJiYKKyAgICAgICAgICAgbG9CYW5kID49IHBTZXR0aW5ncy0+YndCb3JkZXJzW2J3SW5kZXhdKSB7CisgICAgICBid0luZGV4Kys7CisgICAgfQorCisgICAgLyoKKyAgICBGaWx0ZXIgU3RlcCAyOiBhZGQgdGhlIGxlZnQgc2xvcGUgd2l0aCB0aGUgY3VycmVudCBmaWx0ZXIgdG8gdGhlIGJ1ZmZlcgorICAgIHB1cmUgc291cmNlIHZhbHVlcyBhcmUgYWxyZWFkeSBpbiB0aGVyZQorICAgICovCisgICAgYncgPSBGWF9EQkwyRlhfU0dMKGJ3VmVjdG9yW2J3SW5kZXhdKTsKKworICAgIGEwciA9IEZYX0RCTDJGWF9TR0woCisgICAgICAgIGZNdWx0KGJ3LCBhbHBoYXJbMF0pKTsgLyogQXBwbHkgY3VycmVudCBiYW5kd2lkdGggZXhwYW5zaW9uIGZhY3RvciAqLworICAgIGEwaSA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsIGFscGhhaVswXSkpOworICAgIGJ3ID0gRlhfREJMMkZYX1NHTChmUG93MihidykpOworICAgIGExciA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsIGFscGhhclsxXSkpOworICAgIGExaSA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsIGFscGhhaVsxXSkpOworCisgICAgLyoKKyAgICBGaWx0ZXIgU3RlcCAzOiBpbnNlcnQgdGhlIG1pZGRsZSBwYXJ0IHdoaWNoIHdvbid0IGJlIHdpbmRvd2VkCisgICAgKi8KKyAgICBpZiAoYncgPD0gRkwyRlhDT05TVF9TR0woMC4wZikpIHsKKyAgICAgIGludCBkZXNjYWxlID0gZml4TWluKERGUkFDVF9CSVRTIC0gMSwgKExQQ19TQ0FMRV9GQUNUT1IgKyBkeW5hbWljU2NhbGUpKTsKKyAgICAgIGZvciAoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrKSB7CisgICAgICAgIHFtZkJ1ZmZlclJlYWxbaV1bbG9CYW5kXSA9IGxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIGldID4+IGRlc2NhbGU7CisgICAgICAgIHFtZkJ1ZmZlckltYWdbaV1bbG9CYW5kXSA9IGxvd0JhbmRJbWFnW0xQQ19PUkRFUiArIGldID4+IGRlc2NhbGU7CisgICAgICB9CisgICAgfSBlbHNlIHsgLyogYncgPD0gMCAqLworCisgICAgICBpbnQgZGVzY2FsZSA9IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIChMUENfU0NBTEVfRkFDVE9SICsgZHluYW1pY1NjYWxlKSk7CisKKyAgICAgIGZvciAoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrKSB7CisgICAgICAgIEZJWFBfREJMIGFjY3UxLCBhY2N1MjsKKworICAgICAgICBhY2N1MSA9IChmTXVsdERpdjIoYTByLCBsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBpIC0gMV0pIC0KKyAgICAgICAgICAgICAgICAgZk11bHREaXYyKGEwaSwgbG93QmFuZEltYWdbTFBDX09SREVSICsgaSAtIDFdKSArCisgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhMXIsIGxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIGkgLSAyXSkgLQorICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTFpLCBsb3dCYW5kSW1hZ1tMUENfT1JERVIgKyBpIC0gMl0pKSA+PgorICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZTsKKyAgICAgICAgYWNjdTIgPSAoZk11bHREaXYyKGEwaSwgbG93QmFuZFJlYWxbTFBDX09SREVSICsgaSAtIDFdKSArCisgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhMHIsIGxvd0JhbmRJbWFnW0xQQ19PUkRFUiArIGkgLSAxXSkgKworICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTFpLCBsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBpIC0gMl0pICsKKyAgICAgICAgICAgICAgICAgZk11bHREaXYyKGExciwgbG93QmFuZEltYWdbTFBDX09SREVSICsgaSAtIDJdKSkgPj4KKyAgICAgICAgICAgICAgICBkeW5hbWljU2NhbGU7CisKKyAgICAgICAgcW1mQnVmZmVyUmVhbFtpXVtsb0JhbmRdID0KKyAgICAgICAgICAgIChsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBpXSA+PiBkZXNjYWxlKSArIChhY2N1MSA8PCAxKTsKKyAgICAgICAgcW1mQnVmZmVySW1hZ1tpXVtsb0JhbmRdID0KKyAgICAgICAgICAgIChsb3dCYW5kSW1hZ1tMUENfT1JERVIgKyBpXSA+PiBkZXNjYWxlKSArIChhY2N1MiA8PCAxKTsKKyAgICAgIH0KKyAgICB9IC8qIGJ3IDw9IDAgKi8KKworICAgIC8qCisgICAgICogc3RvcmUgdGhlIHVubW9kaWZpZWQgZmlsdGVyIGNvZWZmaWNpZW50cyBpZiB0aGVyZSBpcworICAgICAqIGFuIG92ZXJsYXBwaW5nIGVudmVsb3BlCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIH0gLyogb3V0ZXIgbG9vcCBvdmVyIGJhbmRzIChsb0JhbmQpICovCisKKyAgZm9yIChpID0gMDsgaSA8IG5JbnZmQmFuZHM7IGkrKykgeworICAgIGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0gPSBid1ZlY3RvcltpXTsKKyAgfQorCisgIC8qCisgIHNldCBoaWdoIGJhbmQgc2NhbGUgZmFjdG9yCisgICovCisgIHNiclNjYWxlRmFjdG9yLT5oYl9zY2FsZSA9IGNvbUJhbmRTY2FsZSAtIChMUENfU0NBTEVfRkFDVE9SKTsKIH0KIAogLyohCkBAIC03NjYsMjEgKzEyMjIsMjAgQEAKICAqCiAgKi8KIFNCUl9FUlJPUgotY3JlYXRlTHBwVHJhbnNwb3NlciAoSEFORExFX1NCUl9MUFBfVFJBTlMgaHMsIC8qITwgSGFuZGxlIG9mIGxvdyBwb3dlciB0cmFuc3Bvc2VyICAqLwotICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLCAvKiE8IFBvaW50ZXIgdG8gc2V0dGluZ3MgKi8KLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgaGlnaEJhbmRTdGFydFNiLCAvKiE8ID8gKi8KLSAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLCAgICAgICAgIC8qITwgTWFzdGVyIHRhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtTWFzdGVyLCAgICAgICAvKiE8IFZhbGlkIGVudHJpZXMgaW4gbWFzdGVyIHRhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXNiLCAgICAgICAgICAgICAvKiE8IEhpZ2hiYW5kIGFyZWEgc3RvcCBzdWJiYW5kICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGltZVNsb3RzLCAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lIHNsb3RzICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkNvbHMsICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjb2x1bXMgKGNvZGVjIHFtZiBiYW5rKSAqLwotICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLCAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBub2lzZSBiYW5kcyB0byBRTUYgYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgbm9Ob2lzZUJhbmRzLCAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGJhbmRzICovCi0gICAgICAgICAgICAgICAgICAgICBVSU5UICAgZnMsICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsZSBGcmVxdWVuY3kgKi8KLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFuLCAgICAgICAgICAgIC8qITwgQ2hhbm5lbCBudW1iZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdmVybGFwCi0gICAgICAgICAgICAgICAgICAgICApCi17CitjcmVhdGVMcHBUcmFuc3Bvc2VyKAorICAgIEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhzLCAgICAgICAgLyohPCBIYW5kbGUgb2YgbG93IHBvd2VyIHRyYW5zcG9zZXIgICovCisgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLCAvKiE8IFBvaW50ZXIgdG8gc2V0dGluZ3MgKi8KKyAgICBjb25zdCBpbnQgaGlnaEJhbmRTdGFydFNiLCAgICAgIC8qITwgPyAqLworICAgIFVDSEFSICp2X2tfbWFzdGVyLCAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgdGFibGUgKi8KKyAgICBjb25zdCBpbnQgbnVtTWFzdGVyLCAgICAgICAgICAgIC8qITwgVmFsaWQgZW50cmllcyBpbiBtYXN0ZXIgdGFibGUgKi8KKyAgICBjb25zdCBpbnQgdXNiLCAgICAgICAgICAgICAgICAgIC8qITwgSGlnaGJhbmQgYXJlYSBzdG9wIHN1YmJhbmQgKi8KKyAgICBjb25zdCBpbnQgdGltZVNsb3RzLCAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUgc2xvdHMgKi8KKyAgICBjb25zdCBpbnQgbkNvbHMsICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNvbHVtcyAoY29kZWMgcW1mIGJhbmspICovCisgICAgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLCAgLyohPCBNYXBwaW5nIG9mIFNCUiBub2lzZSBiYW5kcyB0byBRTUYgYmFuZHMgKi8KKyAgICBjb25zdCBpbnQgbm9Ob2lzZUJhbmRzLCAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyAqLworICAgIFVJTlQgZnMsICAgICAgICAgICAgICAgIC8qITwgU2FtcGxlIEZyZXF1ZW5jeSAqLworICAgIGNvbnN0IGludCBjaGFuLCAgICAgICAgIC8qITwgQ2hhbm5lbCBudW1iZXIgKi8KKyAgICBjb25zdCBpbnQgb3ZlcmxhcCkgewogICAvKiBGQiBpbnZlcnNlIGZpbHRlcmluZyBzZXR0aW5ncyAqLwogICBocy0+cFNldHRpbmdzID0gcFNldHRpbmdzOwogCkBAIC03ODgsNTAgKzEyNDMsNDAgQEAKICAgcFNldHRpbmdzLT5vdmVybGFwID0gb3ZlcmxhcDsKIAogICBzd2l0Y2ggKHRpbWVTbG90cykgeworICAgIGNhc2UgMTU6CisgICAgY2FzZSAxNjoKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgMTU6Ci0gIGNhc2UgMTY6Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsgLyogVW5pbXBsZW1lbnRlZCAqLworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsgLyogVW5pbXBsZW1lbnRlZCAqLwogICB9CiAKLSAgaWYgKGNoYW49PTApIHsKKyAgaWYgKGNoYW4gPT0gMCkgewogICAgIC8qIEluaXQgY29tbW9uIGRhdGEgb25seSBvbmNlICovCiAgICAgaHMtPnBTZXR0aW5ncy0+bkNvbHMgPSBuQ29sczsKIAotICAgIHJldHVybiByZXNldExwcFRyYW5zcG9zZXIgKGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hCYW5kU3RhcnRTYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2tfbWFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU1hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub05vaXNlQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzKTsKKyAgICByZXR1cm4gcmVzZXRMcHBUcmFuc3Bvc2VyKGhzLCBoaWdoQmFuZFN0YXJ0U2IsIHZfa19tYXN0ZXIsIG51bU1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlQmFuZFRhYmxlLCBub05vaXNlQmFuZHMsIHVzYiwgZnMpOwogICB9CiAgIHJldHVybiBTQlJERUNfT0s7CiB9CiAKLQotc3RhdGljIGludCBmaW5kQ2xvc2VzdEVudHJ5KFVDSEFSIGdvYWxTYiwgVUNIQVIgKnZfa19tYXN0ZXIsIFVDSEFSIG51bU1hc3RlciwgVUNIQVIgZGlyZWN0aW9uKQoteworc3RhdGljIGludCBmaW5kQ2xvc2VzdEVudHJ5KFVDSEFSIGdvYWxTYiwgVUNIQVIgKnZfa19tYXN0ZXIsIFVDSEFSIG51bU1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBkaXJlY3Rpb24pIHsKICAgaW50IGluZGV4OwogCi0gIGlmKCBnb2FsU2IgPD0gdl9rX21hc3RlclswXSApCi0gICAgcmV0dXJuIHZfa19tYXN0ZXJbMF07CisgIGlmIChnb2FsU2IgPD0gdl9rX21hc3RlclswXSkgcmV0dXJuIHZfa19tYXN0ZXJbMF07CiAKLSAgaWYoIGdvYWxTYiA+PSB2X2tfbWFzdGVyW251bU1hc3Rlcl0gKQotICAgIHJldHVybiB2X2tfbWFzdGVyW251bU1hc3Rlcl07CisgIGlmIChnb2FsU2IgPj0gdl9rX21hc3RlcltudW1NYXN0ZXJdKSByZXR1cm4gdl9rX21hc3RlcltudW1NYXN0ZXJdOwogCi0gIGlmKGRpcmVjdGlvbikgeworICBpZiAoZGlyZWN0aW9uKSB7CiAgICAgaW5kZXggPSAwOwotICAgIHdoaWxlKCB2X2tfbWFzdGVyW2luZGV4XSA8IGdvYWxTYiApIHsKKyAgICB3aGlsZSAodl9rX21hc3RlcltpbmRleF0gPCBnb2FsU2IpIHsKICAgICAgIGluZGV4Kys7CiAgICAgfQogICB9IGVsc2UgewogICAgIGluZGV4ID0gbnVtTWFzdGVyOwotICAgIHdoaWxlKCB2X2tfbWFzdGVyW2luZGV4XSA+IGdvYWxTYiApIHsKKyAgICB3aGlsZSAodl9rX21hc3RlcltpbmRleF0gPiBnb2FsU2IpIHsKICAgICAgIGluZGV4LS07CiAgICAgfQogICB9CkBAIC04MzksNyArMTI4NCw2IEBACiAgIHJldHVybiB2X2tfbWFzdGVyW2luZGV4XTsKIH0KIAotCiAvKiEKICAqCiAgKiBcYnJpZWYgUmVzZXQgbWVtb3J5IGZvciBvbmUgbHBwIHRyYW5zcG9zZXIgaW5zdGFuY2UKQEAgLTg0NywxOCArMTI5MSwxOCBAQAogICogXHJldHVybiBTQlJERUNfT0sgb24gc3VjY2VzcywgU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRyBvbiBlcnJvcgogICovCiBTQlJfRVJST1IKLXJlc2V0THBwVHJhbnNwb3NlciAoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLCAgLyohPCBIYW5kbGUgb2YgbHBwIHRyYW5zcG9zZXIgICovCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICBoaWdoQmFuZFN0YXJ0U2IsICAgICAgICAgIC8qITwgSGlnaCBiYW5kIGFyZWE6IHN0YXJ0IHN1YmJhbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgIG51bU1hc3RlciwgICAgICAgICAgICAgICAgLyohPCBWYWxpZCBlbnRyaWVzIGluIG1hc3RlciB0YWJsZSAqLwotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqbm9pc2VCYW5kVGFibGUsICAgICAgICAgICAvKiE8IE1hcHBpbmcgb2YgU0JSIG5vaXNlIGJhbmRzIHRvIFFNRiBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgbm9Ob2lzZUJhbmRzLCAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgdXNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhpZ2ggYmFuZCBhcmVhOiBzdG9wIHN1YmJhbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgVUlOVCAgIGZzICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTQlIgb3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgICAgICAgICAgICAgICAgICApCi17CityZXNldExwcFRyYW5zcG9zZXIoCisgICAgSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLCAvKiE8IEhhbmRsZSBvZiBscHAgdHJhbnNwb3NlciAgKi8KKyAgICBVQ0hBUiBoaWdoQmFuZFN0YXJ0U2IsICAgICAgICAgIC8qITwgSGlnaCBiYW5kIGFyZWE6IHN0YXJ0IHN1YmJhbmQgKi8KKyAgICBVQ0hBUiAqdl9rX21hc3RlciwgICAgICAgICAgICAgIC8qITwgTWFzdGVyIHRhYmxlICovCisgICAgVUNIQVIgbnVtTWFzdGVyLCAgICAgICAgICAgICAgICAvKiE8IFZhbGlkIGVudHJpZXMgaW4gbWFzdGVyIHRhYmxlICovCisgICAgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLCAvKiE8IE1hcHBpbmcgb2YgU0JSIG5vaXNlIGJhbmRzIHRvIFFNRiBiYW5kcyAqLworICAgIFVDSEFSIG5vTm9pc2VCYW5kcywgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgKi8KKyAgICBVQ0hBUiB1c2IsICAgICAgICAgICAgIC8qITwgSGlnaCBiYW5kIGFyZWE6IHN0b3Agc3ViYmFuZCAqLworICAgIFVJTlQgZnMgICAgICAgICAgICAgICAgLyohPCBTQlIgb3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSAqLworKSB7CiAgIFRSQU5TUE9TRVJfU0VUVElOR1MgKnBTZXR0aW5ncyA9IGhMcHBUcmFucy0+cFNldHRpbmdzOwotICBQQVRDSF9QQVJBTSAgKnBhdGNoUGFyYW0gPSBwU2V0dGluZ3MtPnBhdGNoUGFyYW07CisgIFBBVENIX1BBUkFNICpwYXRjaFBhcmFtID0gcFNldHRpbmdzLT5wYXRjaFBhcmFtOwogCiAgIGludCBpLCBwYXRjaDsKICAgaW50IHRhcmdldFN0b3BCYW5kOwpAQCAtODY2LDQzICsxMzEwLDUyIEBACiAgIGludCBwYXRjaERpc3RhbmNlOwogICBpbnQgbnVtQmFuZHNJblBhdGNoOwogCi0gIGludCBsc2IgPSB2X2tfbWFzdGVyWzBdOyAgICAgICAgICAgICAgICAgLyogU3RhcnQgc3ViYmFuZCBleHByZXNzZWQgaW4gIm5vbi1jcml0aWNhbCIgc2FtcGxpbmcgdGVybXMqLwotICBpbnQgeG92ZXJPZmZzZXQgPSBoaWdoQmFuZFN0YXJ0U2IgLSBsc2I7IC8qIENhbGN1bGF0ZSBkaXN0YW5jZSBpbiBRTUYgYmFuZHMgYmV0d2VlbiBrMCBhbmQga3ggKi8KKyAgaW50IGxzYiA9IHZfa19tYXN0ZXJbMF07IC8qIFN0YXJ0IHN1YmJhbmQgZXhwcmVzc2VkIGluICJub24tY3JpdGljYWwiIHNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyovCisgIGludCB4b3Zlck9mZnNldCA9IGhpZ2hCYW5kU3RhcnRTYiAtCisgICAgICAgICAgICAgICAgICAgIGxzYjsgLyogQ2FsY3VsYXRlIGRpc3RhbmNlIGluIFFNRiBiYW5kcyBiZXR3ZWVuIGswIGFuZCBreCAqLwogICBpbnQgc3RhcnRGcmVxSHo7CiAKICAgaW50IGRlc2lyZWRCb3JkZXI7CiAKLSAgdXNiID0gZml4TWluKHVzYiwgdl9rX21hc3RlcltudW1NYXN0ZXJdKTsgLyogQXZvaWQgZW5kbGVzcyBsb29wcyAoY29tcGFyZSB3aXRoIGZsb2F0IGNvZGUpLiAqLworICB1c2IgPSBmaXhNaW4odXNiLCB2X2tfbWFzdGVyW251bU1hc3Rlcl0pOyAvKiBBdm9pZCBlbmRsZXNzIGxvb3BzIChjb21wYXJlIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY29kZSkuICovCiAKICAgLyoKICAgICogUGxhdXNpYmlsaXR5IGNoZWNrCiAgICAqLwogCi0gIGlmICggbHNiIC0gU0hJRlRfU1RBUlRfU0IgPCA0ICkgeworICBpZiAocFNldHRpbmdzLT5uQ29scyA9PSA2NCkgeworICAgIGlmIChsc2IgPCA0KSB7CisgICAgICAvKiA0OjEgU0JSIFJlcXVpcmVtZW50IGswID49IDQgbWlzc2VkISAqLworICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgICAgfQorICB9IGVsc2UgaWYgKGxzYiAtIFNISUZUX1NUQVJUX1NCIDwgNCkgewogICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICB9CiAKLQogICAvKgogICAgKiBJbml0aWFsaXplIHRoZSBwYXRjaGluZyBwYXJhbWV0ZXIKICAgICovCiAgIC8qIElTTy9JRUMgMTQ0OTYtMyAoRmlndXJlIDQuNDgpOiBnb2FsU2IgPSByb3VuZCggMi4wNDhlNiAvIGZzICkgKi8KLSAgZGVzaXJlZEJvcmRlciAgICA9ICgoKDIwNDgwMDAqMikgLyBmcykgKyAxKSA+PiAxOworICBkZXNpcmVkQm9yZGVyID0gKCgoMjA0ODAwMCAqIDIpIC8gZnMpICsgMSkgPj4gMTsKIAotICBkZXNpcmVkQm9yZGVyID0gZmluZENsb3Nlc3RFbnRyeShkZXNpcmVkQm9yZGVyLCB2X2tfbWFzdGVyLCBudW1NYXN0ZXIsIDEpOyAvKiBBZGFwdCByZWdpb24gdG8gbWFzdGVyLXRhYmxlICovCisgIGRlc2lyZWRCb3JkZXIgPSBmaW5kQ2xvc2VzdEVudHJ5KGRlc2lyZWRCb3JkZXIsIHZfa19tYXN0ZXIsIG51bU1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qIEFkYXB0IHJlZ2lvbiB0byBtYXN0ZXItdGFibGUgKi8KIAogICAvKiBGaXJzdCBwYXRjaCAqLwogICBzb3VyY2VTdGFydEJhbmQgPSBTSElGVF9TVEFSVF9TQiArIHhvdmVyT2Zmc2V0OwogICB0YXJnZXRTdG9wQmFuZCA9IGxzYiArIHhvdmVyT2Zmc2V0OyAvKiB1cHBlckJhbmQgKi8KIAotICAvKiBFdmVuIChvZGQpIG51bWJlcmVkIGNoYW5uZWwgbXVzdCBiZSBwYXRjaGVkIHRvIGV2ZW4gKG9kZCkgbnVtYmVyZWQgY2hhbm5lbCAqLworICAvKiBFdmVuIChvZGQpIG51bWJlcmVkIGNoYW5uZWwgbXVzdCBiZSBwYXRjaGVkIHRvIGV2ZW4gKG9kZCkgbnVtYmVyZWQgY2hhbm5lbAorICAgKi8KICAgcGF0Y2ggPSAwOwotICB3aGlsZSh0YXJnZXRTdG9wQmFuZCA8IHVzYikgewotCisgIHdoaWxlICh0YXJnZXRTdG9wQmFuZCA8IHVzYikgewogICAgIC8qIFRvbyBtYW55IHBhdGNoZXM/CiAgICAgICAgQWxsb3cgTUFYX05VTV9QQVRDSEVTKzEgcGF0Y2hlcyBoZXJlLgogICAgICAgIHdlIG5lZWQgdG8gY2hlY2sgbGF0ZXIgYWdhaW4sIHNpbmNlIHBhdGNoIG1pZ2h0IGJlIHRoZSBoaWdoZXN0IHBhdGNoCi0gICAgICAgQU5EIGNvbnRhaW4gbGVzcyB0aGFuIDMgYmFuZHMgPT4gYWN0dWFsIG51bWJlciBvZiBwYXRjaGVzIHdpbGwgYmUgcmVkdWNlZCBieSAxLgorICAgICAgIEFORCBjb250YWluIGxlc3MgdGhhbiAzIGJhbmRzID0+IGFjdHVhbCBudW1iZXIgb2YgcGF0Y2hlcyB3aWxsIGJlIHJlZHVjZWQKKyAgICAgICBieSAxLgogICAgICovCiAgICAgaWYgKHBhdGNoID4gTUFYX05VTV9QQVRDSEVTKSB7CiAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKQEAgLTkxMSwyNiArMTM2NCw0MiBAQAogICAgIHBhdGNoUGFyYW1bcGF0Y2hdLmd1YXJkU3RhcnRCYW5kID0gdGFyZ2V0U3RvcEJhbmQ7CiAgICAgcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0U3RhcnRCYW5kID0gdGFyZ2V0U3RvcEJhbmQ7CiAKLSAgICBudW1CYW5kc0luUGF0Y2ggPSBkZXNpcmVkQm9yZGVyIC0gdGFyZ2V0U3RvcEJhbmQ7ICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgZGVzaXJlZCByYW5nZSBvZiB0aGUgcGF0Y2ggKi8KKyAgICBudW1CYW5kc0luUGF0Y2ggPQorICAgICAgICBkZXNpcmVkQm9yZGVyIC0gdGFyZ2V0U3RvcEJhbmQ7IC8qIEdldCB0aGUgZGVzaXJlZCByYW5nZSBvZiB0aGUgcGF0Y2ggKi8KIAotICAgIGlmICggbnVtQmFuZHNJblBhdGNoID49IGxzYiAtIHNvdXJjZVN0YXJ0QmFuZCApIHsKKyAgICBpZiAobnVtQmFuZHNJblBhdGNoID49IGxzYiAtIHNvdXJjZVN0YXJ0QmFuZCkgewogICAgICAgLyogRGVzaXJlZCBudW1iZXIgYmFuZHMgYXJlIG5vdCBhdmFpbGFibGUgLT4gcGF0Y2ggd2hvbGUgc291cmNlIHJhbmdlICovCi0gICAgICBwYXRjaERpc3RhbmNlICAgPSB0YXJnZXRTdG9wQmFuZCAtIHNvdXJjZVN0YXJ0QmFuZDsgICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0T2Zmc2V0ICovCi0gICAgICBwYXRjaERpc3RhbmNlICAgPSBwYXRjaERpc3RhbmNlICYgfjE7ICAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kaW5nIG9mZiBvZGQgbnVtYmVycyBhbmQgbWFrZSBhbGwgZXZlbiAqLwotICAgICAgbnVtQmFuZHNJblBhdGNoID0gbHNiIC0gKHRhcmdldFN0b3BCYW5kIC0gcGF0Y2hEaXN0YW5jZSk7ICAvKiBVcGRhdGUgbnVtYmVyIG9mIGJhbmRzIHRvIGJlIHBhdGNoZWQgKi8KLSAgICAgIG51bUJhbmRzSW5QYXRjaCA9IGZpbmRDbG9zZXN0RW50cnkodGFyZ2V0U3RvcEJhbmQgKyBudW1CYW5kc0luUGF0Y2gsIHZfa19tYXN0ZXIsIG51bU1hc3RlciwgMCkgLQotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3RvcEJhbmQ7ICAvKiBBZGFwdCByZWdpb24gdG8gbWFzdGVyLXRhYmxlICovCisgICAgICBwYXRjaERpc3RhbmNlID0KKyAgICAgICAgICB0YXJnZXRTdG9wQmFuZCAtIHNvdXJjZVN0YXJ0QmFuZDsgLyogR2V0IHRoZSB0YXJnZXRPZmZzZXQgKi8KKyAgICAgIHBhdGNoRGlzdGFuY2UgPQorICAgICAgICAgIHBhdGNoRGlzdGFuY2UgJiB+MTsgLyogUm91bmRpbmcgb2ZmIG9kZCBudW1iZXJzIGFuZCBtYWtlIGFsbCBldmVuICovCisgICAgICBudW1CYW5kc0luUGF0Y2ggPQorICAgICAgICAgIGxzYiAtICh0YXJnZXRTdG9wQmFuZCAtCisgICAgICAgICAgICAgICAgIHBhdGNoRGlzdGFuY2UpOyAvKiBVcGRhdGUgbnVtYmVyIG9mIGJhbmRzIHRvIGJlIHBhdGNoZWQgKi8KKyAgICAgIG51bUJhbmRzSW5QYXRjaCA9IGZpbmRDbG9zZXN0RW50cnkodGFyZ2V0U3RvcEJhbmQgKyBudW1CYW5kc0luUGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfa19tYXN0ZXIsIG51bU1hc3RlciwgMCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3RvcEJhbmQ7IC8qIEFkYXB0IHJlZ2lvbiB0byBtYXN0ZXItdGFibGUgKi8KICAgICB9CiAKLSAgICAvKiBEZXNpcmVkIG51bWJlciBiYW5kcyBhcmUgYXZhaWxhYmxlIC0+IGdldCB0aGUgbWluaW1hbCBldmVuIHBhdGNoaW5nIGRpc3RhbmNlICovCi0gICAgcGF0Y2hEaXN0YW5jZSAgID0gbnVtQmFuZHNJblBhdGNoICsgdGFyZ2V0U3RvcEJhbmQgLSBsc2I7ICAvKiBHZXQgbWluaW1hbCBkaXN0YW5jZSAqLwotICAgIHBhdGNoRGlzdGFuY2UgICA9IChwYXRjaERpc3RhbmNlICsgMSkgJiB+MTsgICAgICAgICAgICAgICAgLyogUm91bmRpbmcgdXAgb2RkIG51bWJlcnMgYW5kIG1ha2UgYWxsIGV2ZW4gKi8KKyAgICBpZiAocFNldHRpbmdzLT5uQ29scyA9PSA2NCkgeworICAgICAgaWYgKG51bUJhbmRzSW5QYXRjaCA9PSAwICYmIHNvdXJjZVN0YXJ0QmFuZCA9PSBTSElGVF9TVEFSVF9TQikgeworICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEZXNpcmVkIG51bWJlciBiYW5kcyBhcmUgYXZhaWxhYmxlIC0+IGdldCB0aGUgbWluaW1hbCBldmVuIHBhdGNoaW5nCisgICAgICogZGlzdGFuY2UgKi8KKyAgICBwYXRjaERpc3RhbmNlID0KKyAgICAgICAgbnVtQmFuZHNJblBhdGNoICsgdGFyZ2V0U3RvcEJhbmQgLSBsc2I7IC8qIEdldCBtaW5pbWFsIGRpc3RhbmNlICovCisgICAgcGF0Y2hEaXN0YW5jZSA9IChwYXRjaERpc3RhbmNlICsgMSkgJgorICAgICAgICAgICAgICAgICAgICB+MTsgLyogUm91bmRpbmcgdXAgb2RkIG51bWJlcnMgYW5kIG1ha2UgYWxsIGV2ZW4gKi8KIAogICAgIGlmIChudW1CYW5kc0luUGF0Y2ggPiAwKSB7CiAgICAgICBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQgPSB0YXJnZXRTdG9wQmFuZCAtIHBhdGNoRGlzdGFuY2U7Ci0gICAgICBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRCYW5kT2ZmcyAgPSBwYXRjaERpc3RhbmNlOworICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0QmFuZE9mZnMgPSBwYXRjaERpc3RhbmNlOwogICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoID0gbnVtQmFuZHNJblBhdGNoOwotICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQgID0gcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kICsgbnVtQmFuZHNJblBhdGNoOworICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQgPQorICAgICAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZCArIG51bUJhbmRzSW5QYXRjaDsKIAogICAgICAgdGFyZ2V0U3RvcEJhbmQgKz0gcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoOwogICAgICAgcGF0Y2grKzsKQEAgLTk0MCwxOSArMTQwOSwxOSBAQAogICAgIHNvdXJjZVN0YXJ0QmFuZCA9IFNISUZUX1NUQVJUX1NCOwogCiAgICAgLyogQ2hlY2sgaWYgd2UgYXJlIGNsb3NlIHRvIGRlc2lyZWRCb3JkZXIgKi8KLSAgICBpZiggZGVzaXJlZEJvcmRlciAtIHRhcmdldFN0b3BCYW5kIDwgMykgIC8qIE1QRUcgZG9jICovCisgICAgaWYgKGRlc2lyZWRCb3JkZXIgLSB0YXJnZXRTdG9wQmFuZCA8IDMpIC8qIE1QRUcgZG9jICovCiAgICAgewogICAgICAgZGVzaXJlZEJvcmRlciA9IHVzYjsKICAgICB9Ci0KICAgfQogCiAgIHBhdGNoLS07CiAKICAgLyogSWYgaGlnaGVzdCBwYXRjaCBjb250YWlucyBsZXNzIHRoYW4gdGhyZWUgc3ViYmFuZDogc2tpcCBpdCAqLwotICBpZiAoIChwYXRjaD4wKSAmJiAocGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoIDwgMykgKSB7CisgIGlmICgocGF0Y2ggPiAwKSAmJiAocGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoIDwgMykpIHsKICAgICBwYXRjaC0tOwotICAgIHRhcmdldFN0b3BCYW5kID0gcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0U3RhcnRCYW5kICsgcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoOworICAgIHRhcmdldFN0b3BCYW5kID0KKyAgICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0U3RhcnRCYW5kICsgcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoOwogICB9CiAKICAgLyogbm93IGNoZWNrIGlmIHdlIGRvbid0IGhhdmUgb25lIHRvbyBtYW55ICovCkBAIC05NjQsMzUgKzE0MzMsMzYgQEAKIAogICAvKiBDaGVjayBsb3dlc3QgYW5kIGhpZ2hlc3Qgc291cmNlIHN1YmJhbmQgKi8KICAgcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmcgPSB0YXJnZXRTdG9wQmFuZDsKLSAgcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZyAgPSAwOwotICBmb3IgKCBwYXRjaCA9IDA7IHBhdGNoIDwgcFNldHRpbmdzLT5ub09mUGF0Y2hlczsgcGF0Y2grKyApIHsKLSAgICBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZyA9IGZpeE1pbiggcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmcsIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZCApOwotICAgIHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmcgID0gZml4TWF4KCBwU2V0dGluZ3MtPmxiU3RvcFBhdGNoaW5nLCBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdG9wQmFuZCApOworICBwU2V0dGluZ3MtPmxiU3RvcFBhdGNoaW5nID0gMDsKKyAgZm9yIChwYXRjaCA9IDA7IHBhdGNoIDwgcFNldHRpbmdzLT5ub09mUGF0Y2hlczsgcGF0Y2grKykgeworICAgIHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nID0KKyAgICAgICAgZml4TWluKHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nLCBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQpOworICAgIHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmcgPQorICAgICAgICBmaXhNYXgocFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZywgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQpOwogICB9CiAKLSAgZm9yKGkgPSAwIDsgaSA8IG5vTm9pc2VCYW5kczsgaSsrKXsKLSAgICBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tpXSA9IG5vaXNlQmFuZFRhYmxlW2krMV07CisgIGZvciAoaSA9IDA7IGkgPCBub05vaXNlQmFuZHM7IGkrKykgeworICAgIHBTZXR0aW5ncy0+YndCb3JkZXJzW2ldID0gbm9pc2VCYW5kVGFibGVbaSArIDFdOwogICB9Ci0gIGZvciAoO2kgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKSB7CisgIGZvciAoOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykgewogICAgIHBTZXR0aW5ncy0+YndCb3JkZXJzW2ldID0gMjU1OwogICB9CiAKLQogICAvKgogICAgKiBDaG9vc2Ugd2hpdGVuaW5nIGZhY3RvcnMKICAgICovCiAKLSAgc3RhcnRGcmVxSHogPSAoIChsc2IgKyB4b3Zlck9mZnNldCkqZnMgKSA+PiA3OyAgLyogU2hpZnQgZG9lcyBhIGRpdmlzaW9uIGJ5IDIqKDY0KSAqLworICBzdGFydEZyZXFIeiA9CisgICAgICAoKGxzYiArIHhvdmVyT2Zmc2V0KSAqIGZzKSA+PiA3OyAvKiBTaGlmdCBkb2VzIGEgZGl2aXNpb24gYnkgMiooNjQpICovCiAKLSAgZm9yKCBpID0gMTsgaSA8IE5VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTOyBpKysgKQotICB7Ci0gICAgaWYoIHN0YXJ0RnJlcUh6IDwgRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc0luZGV4W2ldKQotICAgICAgYnJlYWs7CisgIGZvciAoaSA9IDE7IGkgPCBOVU1fV0hGQUNUT1JfVEFCTEVfRU5UUklFUzsgaSsrKSB7CisgICAgaWYgKHN0YXJ0RnJlcUh6IDwgRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc0luZGV4W2ldKSBicmVhazsKICAgfQogICBpLS07CiAKICAgcFNldHRpbmdzLT53aEZhY3RvcnMub2ZmID0gRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW2ldWzBdOwotICBwU2V0dGluZ3MtPndoRmFjdG9ycy50cmFuc2l0aW9uTGV2ZWwgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bMV07CisgIHBTZXR0aW5ncy0+d2hGYWN0b3JzLnRyYW5zaXRpb25MZXZlbCA9CisgICAgICBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bMV07CiAgIHBTZXR0aW5ncy0+d2hGYWN0b3JzLmxvd0xldmVsID0gRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW2ldWzJdOwogICBwU2V0dGluZ3MtPndoRmFjdG9ycy5taWRMZXZlbCA9IEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNUYWJsZVtpXVszXTsKICAgcFNldHRpbmdzLT53aEZhY3RvcnMuaGlnaExldmVsID0gRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW2ldWzRdOwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9scHBfdHJhbi5oIGIvbGliU0JSZGVjL3NyYy9scHBfdHJhbi5oCmluZGV4IDAwM2E1NDcuLjUxYjQzOTUgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvbHBwX3RyYW4uaAorKysgYi9saWJTQlJkZWMvc3JjL2xwcF90cmFuLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTY0ICs5MCwxODYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBMb3cgUG93ZXIgUHJvZmlsZSBUcmFuc3Bvc2VyLCAgCisgIFxicmllZiAgTG93IFBvd2VyIFByb2ZpbGUgVHJhbnNwb3NlcgogKi8KIAotI2lmbmRlZiBfTFBQX1RSQU5TX0gKLSNkZWZpbmUgX0xQUF9UUkFOU19ICisjaWZuZGVmIExQUF9UUkFOX0gKKyNkZWZpbmUgTFBQX1RSQU5fSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorI2luY2x1ZGUgImhiZS5oIgogI2luY2x1ZGUgInFtZi5oIgogCiAvKgogICBDb21tb24KICovCi0jZGVmaW5lIFFNRl9PVVRfU0NBTEUgICAgICAgICAgICA4CisjZGVmaW5lIFFNRl9PVVRfU0NBTEUgOAorCisvKgorICBGcmVxdWVuY3kgc2NhbGVzCisqLwogCiAvKgogICBFbnYtQWRqdXN0CiAqLwotI2RlZmluZSBNQVhfTk9JU0VfRU5WRUxPUEVTICAgICAgMgotI2RlZmluZSBNQVhfTk9JU0VfQ09FRkZTICAgICAgICAgNQotI2RlZmluZSBNQVhfTlVNX05PSVNFX1ZBTFVFUyAgICAgKE1BWF9OT0lTRV9FTlZFTE9QRVMgKiBNQVhfTk9JU0VfQ09FRkZTKQotI2RlZmluZSBNQVhfTlVNX0xJTUlURVJTICAgICAgICAgMTIKKyNkZWZpbmUgTUFYX05PSVNFX0VOVkVMT1BFUyAyCisjZGVmaW5lIE1BWF9OT0lTRV9DT0VGRlMgNQorI2RlZmluZSBNQVhfTlVNX05PSVNFX1ZBTFVFUyAoTUFYX05PSVNFX0VOVkVMT1BFUyAqIE1BWF9OT0lTRV9DT0VGRlMpCisjZGVmaW5lIE1BWF9OVU1fTElNSVRFUlMgMTIKIAogLyogU2V0IE1BWF9FTlZFTE9QRVMgdG8gdGhlIGxhcmdlc3QgdmFsdWUgb2YgYWxsIHN1cHBvcnRlZCBCU0ZPUk1BVHMKICAgIGJ5IG92ZXJyaWRpbmcgTUFYX0VOVkVMT1BFUyBpbiB0aGUgY29ycmVjdCBvcmRlcjogKi8KLSNkZWZpbmUgTUFYX0VOVkVMT1BFU19IRUFBQyAgICAgIDUKLSNkZWZpbmUgTUFYX0VOVkVMT1BFUyAgICAgICAgICAgIE1BWF9FTlZFTE9QRVNfSEVBQUMKKyNkZWZpbmUgTUFYX0VOVkVMT1BFU19MRUdBQ1kgNQorI2RlZmluZSBNQVhfRU5WRUxPUEVTX1VTQUMgOAorI2RlZmluZSBNQVhfRU5WRUxPUEVTIE1BWF9FTlZFTE9QRVNfVVNBQwogCi0jZGVmaW5lIE1BWF9GUkVRX0NPRUZGUyAgICAgICAgICA0OAotI2RlZmluZSBNQVhfRlJFUV9DT0VGRlNfRlM0NDEwMCAgMzUKLSNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTX0ZTNDgwMDAgIDMyCisjZGVmaW5lIE1BWF9GUkVRX0NPRUZGU19EVUFMX1JBVEUgNDgKKyNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTX1FVQURfUkFURSA1NgorI2RlZmluZSBNQVhfRlJFUV9DT0VGRlMgTUFYX0ZSRVFfQ09FRkZTX1FVQURfUkFURQogCisjZGVmaW5lIE1BWF9GUkVRX0NPRUZGU19GUzQ0MTAwIDM1CisjZGVmaW5lIE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwIDMyCiAKLSNkZWZpbmUgTUFYX05VTV9FTlZFTE9QRV9WQUxVRVMgIChNQVhfRU5WRUxPUEVTICogTUFYX0ZSRVFfQ09FRkZTKQorI2RlZmluZSBNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFUyAoTUFYX0VOVkVMT1BFUyAqIE1BWF9GUkVRX0NPRUZGUykKIAotI2RlZmluZSBNQVhfR0FJTl9FWFAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgTUFYX0dBSU5fRVhQIDM0CiAvKiBNYXhpbXVtIGdhaW4gd2lsbCBiZSBzcXJ0KDAuNSAqIDJeTUFYX0dBSU5fRVhQKQogICAgZXhhbXBsZTogMzQ9OTlkQiAgICovCi0jZGVmaW5lIE1BWF9HQUlOX0NPTkNFQUxfRVhQICAgICAxCi0vKiBNYXhpbXVtIGdhaW4gd2lsbCBiZSBzcXJ0KDAuNSAqIDJeTUFYX0dBSU5fQ09OQ0VBTF9FWFApIGluIGNvbmNlYWxtZW50IGNhc2UgKDBkQikgKi8KKyNkZWZpbmUgTUFYX0dBSU5fQ09OQ0VBTF9FWFAgMQorLyogTWF4aW11bSBnYWluIHdpbGwgYmUgc3FydCgwLjUgKiAyXk1BWF9HQUlOX0NPTkNFQUxfRVhQKSBpbiBjb25jZWFsbWVudCBjYXNlCisgKiAoMGRCKSAqLwogCiAvKgogICBMUFAgVHJhbnNwb3NlcgogKi8KLSNkZWZpbmUgTFBDX09SREVSICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTFBDX09SREVSIDIKIAotI2RlZmluZSBNQVhfSU5WRl9CQU5EUyAgICAgICAgICAgTUFYX05PSVNFX0NPRUZGUworI2RlZmluZSBNQVhfSU5WRl9CQU5EUyBNQVhfTk9JU0VfQ09FRkZTCiAKLSNkZWZpbmUgTUFYX05VTV9QQVRDSEVTICAgICAgICAgIDYKLSNkZWZpbmUgU0hJRlRfU1RBUlRfU0IgICAgICAgICAgIDEgICAgICAgICAgICAgIC8qITwgbG93ZXN0IHN1YmJhbmQgb2Ygc291cmNlIHJhbmdlICovCisjZGVmaW5lIE1BWF9OVU1fUEFUQ0hFUyA2CisjZGVmaW5lIFNISUZUX1NUQVJUX1NCIDEgLyohPCBsb3dlc3Qgc3ViYmFuZCBvZiBzb3VyY2UgcmFuZ2UgKi8KIAotdHlwZWRlZiBlbnVtCi17Cit0eXBlZGVmIGVudW0gewogICBJTlZGX09GRiA9IDAsCiAgIElOVkZfTE9XX0xFVkVMLAogICBJTlZGX01JRF9MRVZFTCwKICAgSU5WRl9ISUdIX0xFVkVMLAogICBJTlZGX1NXSVRDSEVEIC8qIG5vdCBhIHJlYWwgY2hvaWNlIGJ1dCB1c2VkIGhlcmUgdG8gY29udHJvbCBiZWhhdmlvdXIgKi8KLX0KLUlOVkZfTU9ERTsKLQorfSBJTlZGX01PREU7CiAKIC8qKiBwYXJhbWV0ZXIgc2V0IGZvciBvbmUgc2luZ2xlIHBhdGNoICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIFVDSEFSICBzb3VyY2VTdGFydEJhbmQ7ICAgLyohPCBmaXJzdCBiYW5kIGluIGxvd2JhbmRzIHdoZXJlIHRvIHRha2UgdGhlIHNhbXBsZXMgZnJvbSAqLwotICBVQ0hBUiAgc291cmNlU3RvcEJhbmQ7ICAgIC8qITwgZmlyc3QgYmFuZCBpbiBsb3diYW5kcyB3aGljaCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHBhdGNoIGFueW1vcmUgKi8KLSAgVUNIQVIgIGd1YXJkU3RhcnRCYW5kOyAgICAvKiE8IGZpcnN0IGJhbmQgaW4gaGlnaGJhbmRzIHRvIGJlIGZpbGxlZCB3aXRoIHplcm9zIGluIG9yZGVyIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZSBpbnRlcmZlcmVuY2VzIGJldHdlZW4gcGF0Y2hlcyAqLwotICBVQ0hBUiAgdGFyZ2V0U3RhcnRCYW5kOyAgIC8qITwgZmlyc3QgYmFuZCBpbiBoaWdoYmFuZHMgdG8gYmUgZmlsbGVkIHdpdGggd2hpdGVuZWQgbG93YmFuZCBzaWduYWwgKi8KLSAgVUNIQVIgIHRhcmdldEJhbmRPZmZzOyAgICAvKiE8IGRpZmZlcmVuY2UgYmV0d2VlbiAnc3RhcnRUYXJnZXRCYW5kJyBhbmQgJ3N0YXJ0U291cmNlQmFuZCcgKi8KLSAgVUNIQVIgIG51bUJhbmRzSW5QYXRjaDsgICAvKiE8IG51bWJlciBvZiBjb25zZWN1dGl2ZSBiYW5kcyBpbiB0aGlzIG9uZSBwYXRjaCAqLworICBVQ0hBUiBzb3VyY2VTdGFydEJhbmQ7IC8qITwgZmlyc3QgYmFuZCBpbiBsb3diYW5kcyB3aGVyZSB0byB0YWtlIHRoZSBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAqLworICBVQ0hBUgorICBzb3VyY2VTdG9wQmFuZDsgICAgICAgLyohPCBmaXJzdCBiYW5kIGluIGxvd2JhbmRzIHdoaWNoIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoIGFueW1vcmUgKi8KKyAgVUNIQVIgZ3VhcmRTdGFydEJhbmQ7IC8qITwgZmlyc3QgYmFuZCBpbiBoaWdoYmFuZHMgdG8gYmUgZmlsbGVkIHdpdGggemVyb3MgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyIHRvIHJlZHVjZSBpbnRlcmZlcmVuY2VzIGJldHdlZW4gcGF0Y2hlcyAqLworICBVQ0hBUgorICB0YXJnZXRTdGFydEJhbmQ7ICAgICAgIC8qITwgZmlyc3QgYmFuZCBpbiBoaWdoYmFuZHMgdG8gYmUgZmlsbGVkIHdpdGggd2hpdGVuZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3diYW5kIHNpZ25hbCAqLworICBVQ0hBUiB0YXJnZXRCYW5kT2ZmczsgIC8qITwgZGlmZmVyZW5jZSBiZXR3ZWVuICdzdGFydFRhcmdldEJhbmQnIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGFydFNvdXJjZUJhbmQnICovCisgIFVDSEFSIG51bUJhbmRzSW5QYXRjaDsgLyohPCBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmFuZHMgaW4gdGhpcyBvbmUgcGF0Y2ggKi8KIH0gUEFUQ0hfUEFSQU07CiAKLQogLyoqIHdoaXRlbmluZyBmYWN0b3JzIGZvciBkaWZmZXJlbnQgbGV2ZWxzIG9mIHdoaXRlbmluZwogICAgIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgY29ycmVzcG9uZGluZyB0byBjcm9zc292ZXIgZnJlcXVlbmN5ICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIEZJWFBfREJMICBvZmY7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGJ3IGZhY3RvciBmb3Igc2lnbmFsIE9GRiAqLwotICBGSVhQX0RCTCAgdHJhbnNpdGlvbkxldmVsOwotICBGSVhQX0RCTCAgbG93TGV2ZWw7ICAgICAgICAgICAgICAgICAgLyohPCBidyBmYWN0b3IgZm9yIHNpZ25hbCBMT1dfTEVWRUwgKi8KLSAgRklYUF9EQkwgIG1pZExldmVsOyAgICAgICAgICAgICAgICAgIC8qITwgYncgZmFjdG9yIGZvciBzaWduYWwgTUlEX0xFVkVMICovCi0gIEZJWFBfREJMICBoaWdoTGV2ZWw7ICAgICAgICAgICAgICAgICAvKiE8IGJ3IGZhY3RvciBmb3Igc2lnbmFsIEhJR0hfTEVWRUwgKi8KKyAgRklYUF9EQkwgb2ZmOyAvKiE8IGJ3IGZhY3RvciBmb3Igc2lnbmFsIE9GRiAqLworICBGSVhQX0RCTCB0cmFuc2l0aW9uTGV2ZWw7CisgIEZJWFBfREJMIGxvd0xldmVsOyAgLyohPCBidyBmYWN0b3IgZm9yIHNpZ25hbCBMT1dfTEVWRUwgKi8KKyAgRklYUF9EQkwgbWlkTGV2ZWw7ICAvKiE8IGJ3IGZhY3RvciBmb3Igc2lnbmFsIE1JRF9MRVZFTCAqLworICBGSVhQX0RCTCBoaWdoTGV2ZWw7IC8qITwgYncgZmFjdG9yIGZvciBzaWduYWwgSElHSF9MRVZFTCAqLwogfSBXSElURU5JTkdfRkFDVE9SUzsKIAotCi0vKiEgVGhlIHRyYW5zcG9zZXIgc2V0dGluZ3MgYXJlIGNhbGN1bGF0ZWQgb24gYSBoZWFkZXIgcmVzZXQgYW5kIGFyZSBzaGFyZWQgYnkgYm90aCBjaGFubmVscy4gKi8KKy8qISBUaGUgdHJhbnNwb3NlciBzZXR0aW5ncyBhcmUgY2FsY3VsYXRlZCBvbiBhIGhlYWRlciByZXNldCBhbmQgYXJlIHNoYXJlZCBieQorICogYm90aCBjaGFubmVscy4gKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgVUNIQVIgIG5Db2xzOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgc3Vic2FtcGxlcyBvZiBhIGNvZGVjIGZyYW1lICovCi0gIFVDSEFSICBub09mUGF0Y2hlczsgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIHBhdGNoZXMgKi8KLSAgVUNIQVIgIGxiU3RhcnRQYXRjaGluZzsgICAgICAgICAgICAgLyohPCBmaXJzdCBiYW5kIG9mIGxvd2JhbmRzIHRoYXQgd2lsbCBiZSBwYXRjaGVkICovCi0gIFVDSEFSICBsYlN0b3BQYXRjaGluZzsgICAgICAgICAgICAgIC8qITwgZmlyc3QgYmFuZCB0aGF0IHdvbid0IGJlIHBhdGNoZWQgYW55bW9yZSovCi0gIFVDSEFSICBid0JvcmRlcnNbTUFYX05VTV9OT0lTRV9WQUxVRVNdOyAvKiE8IHNwZWN0cmFsIGJhbmRzIHdpdGggZGlmZmVyZW50IGludmVyc2UgZmlsdGVyaW5nIGxldmVscyAqLworICBVQ0hBUiBuQ29sczsgICAgICAgICAgIC8qITwgbnVtYmVyIHN1YnNhbXBsZXMgb2YgYSBjb2RlYyBmcmFtZSAqLworICBVQ0hBUiBub09mUGF0Y2hlczsgICAgIC8qITwgbnVtYmVyIG9mIHBhdGNoZXMgKi8KKyAgVUNIQVIgbGJTdGFydFBhdGNoaW5nOyAvKiE8IGZpcnN0IGJhbmQgb2YgbG93YmFuZHMgdGhhdCB3aWxsIGJlIHBhdGNoZWQgKi8KKyAgVUNIQVIgbGJTdG9wUGF0Y2hpbmc7ICAvKiE8IGZpcnN0IGJhbmQgdGhhdCB3b24ndCBiZSBwYXRjaGVkIGFueW1vcmUqLworICBVQ0hBUiBid0JvcmRlcnNbTUFYX05VTV9OT0lTRV9WQUxVRVNdOyAvKiE8IHNwZWN0cmFsIGJhbmRzIHdpdGggZGlmZmVyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2UgZmlsdGVyaW5nIGxldmVscyAqLwogCi0gIFBBVENIX1BBUkFNICAgIHBhdGNoUGFyYW1bTUFYX05VTV9QQVRDSEVTXTsgLyohPCBuZXcgcGFyYW1ldGVyIHNldCBmb3IgcGF0Y2hpbmcgKi8KLSAgV0hJVEVOSU5HX0ZBQ1RPUlMgd2hGYWN0b3JzOyAgICAgICAgICAgICAgICAvKiE8IHRoZSBwb2xlIG1vdmluZyBmYWN0b3JzIGZvciBjZXJ0YWluIHdoaXRlbmluZyBsZXZlbHMgYXMgaW5kaWNhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0c3RyZWFtIGRlcGVuZGluZyBvbiB0aGUgY3Jvc3NvdmVyIGZyZXF1ZW5jeSAqLwotICBVQ0hBUiAgb3ZlcmxhcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT3ZlcmxhcCBzaXplICovCisgIFBBVENIX1BBUkFNCisgIHBhdGNoUGFyYW1bTUFYX05VTV9QQVRDSEVTXTsgLyohPCBuZXcgcGFyYW1ldGVyIHNldCBmb3IgcGF0Y2hpbmcgKi8KKyAgV0hJVEVOSU5HX0ZBQ1RPUlMKKyAgd2hGYWN0b3JzOyAgICAgLyohPCB0aGUgcG9sZSBtb3ZpbmcgZmFjdG9ycyBmb3IgY2VydGFpbgorICAgICAgICAgICAgICAgICAgICB3aGl0ZW5pbmcgbGV2ZWxzIGFzIGluZGljYXRlZCAgICAgaW4gdGhlIGJpdHN0cmVhbQorICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlIGNyb3Nzb3ZlciBmcmVxdWVuY3kgKi8KKyAgVUNIQVIgb3ZlcmxhcDsgLyohPCBPdmVybGFwIHNpemUgKi8KIH0gVFJBTlNQT1NFUl9TRVRUSU5HUzsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3M7IC8qITwgQ29tbW9uIHNldHRpbmdzIGZvciBib3RoIGNoYW5uZWxzICovCisgIEZJWFBfREJMCisgIGJ3VmVjdG9yT2xkW01BWF9OVU1fUEFUQ0hFU107IC8qITwgcG9sZSBtb3ZpbmcgZmFjdG9ycyBvZiBwYXN0IGZyYW1lICovCisgIEZJWFBfREJMIGxwY0ZpbHRlclN0YXRlc1JlYWxMZWdTQlJbTFBDX09SREVSICsgKDMgKiAoNCkpXVsoCisgICAgICAzMildOyAvKiE8IHBvaW50ZXIgYXJyYXkgdG8gc2F2ZSBmaWx0ZXIgc3RhdGVzICovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFRSQU5TUE9TRVJfU0VUVElOR1MgKnBTZXR0aW5nczsgICAgICAgICAgICAgICAgLyohPCBDb21tb24gc2V0dGluZ3MgZm9yIGJvdGggY2hhbm5lbHMgKi8KLSAgRklYUF9EQkwgIGJ3VmVjdG9yT2xkW01BWF9OVU1fUEFUQ0hFU107ICAgICAgICAvKiE8IHBvbGUgbW92aW5nIGZhY3RvcnMgb2YgcGFzdCBmcmFtZSAqLwotICBGSVhQX0RCTCAgbHBjRmlsdGVyU3RhdGVzUmVhbFtMUENfT1JERVJdWygzMildOyAgICAgLyohPCBwb2ludGVyIGFycmF5IHRvIHNhdmUgZmlsdGVyIHN0YXRlcyAqLwotICBGSVhQX0RCTCAgbHBjRmlsdGVyU3RhdGVzSW1hZ1tMUENfT1JERVJdWygzMildOyAgICAgLyohPCBwb2ludGVyIGFycmF5IHRvIHNhdmUgZmlsdGVyIHN0YXRlcyAqLwotfQotU0JSX0xQUF9UUkFOUzsKKyAgRklYUF9EQkwgbHBjRmlsdGVyU3RhdGVzSW1hZ0xlZ1NCUltMUENfT1JERVIgKyAoMyAqICg0KSldWygKKyAgICAgIDMyKV07IC8qITwgcG9pbnRlciBhcnJheSB0byBzYXZlIGZpbHRlciBzdGF0ZXMgKi8KKworICBGSVhQX0RCTCBscGNGaWx0ZXJTdGF0ZXNSZWFsSEJFW0xQQ19PUkRFUiArICgzICogKDQpKV1bKAorICAgICAgNjQpXTsgLyohPCBwb2ludGVyIGFycmF5IHRvIHNhdmUgZmlsdGVyIHN0YXRlcyAqLworICBGSVhQX0RCTCBscGNGaWx0ZXJTdGF0ZXNJbWFnSEJFW0xQQ19PUkRFUiArICgzICogKDQpKV1bKAorICAgICAgNjQpXTsgLyohPCBwb2ludGVyIGFycmF5IHRvIHNhdmUgZmlsdGVyIHN0YXRlcyAqLworfSBTQlJfTFBQX1RSQU5TOwogCiB0eXBlZGVmIFNCUl9MUFBfVFJBTlMgKkhBTkRMRV9TQlJfTFBQX1RSQU5TOwogCit2b2lkIGxwcFRyYW5zcG9zZXIoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLAorICAgICAgICAgICAgICAgICAgIFFNRl9TQ0FMRV9GQUNUT1IgKnNiclNjYWxlRmFjdG9yLCBGSVhQX0RCTCAqKnFtZkJ1ZmZlclJlYWwsCiAKLXZvaWQgbHBwVHJhbnNwb3NlciAoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLAotICAgICAgICAgICAgICAgICAgICBRTUZfU0NBTEVfRkFDVE9SICAqc2JyU2NhbGVGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mQnVmZmVyUmVhbCwKKyAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGVncmVlQWxpYXMsIEZJWFBfREJMICoqcW1mQnVmZmVySW1hZywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXNlTFAsIGNvbnN0IGludCBmUHJlV2hpdGVuaW5nLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB2X2tfbWFzdGVyMCwgY29uc3QgaW50IHRpbWVTdGVwLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmaXJzdFNsb3RPZmZzZXQsIGNvbnN0IGludCBsYXN0U2xvdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkludmZCYW5kcywgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlLAorICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZV9wcmV2KTsKIAotICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGVncmVlQWxpYXMsCi0gICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHVzZUxQLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGltZVN0ZXAsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmaXJzdFNsb3RPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsYXN0U2xvdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5JbnZmQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlX3ByZXYKLSAgICAgICAgICAgICAgICAgICAgKTsKLQordm9pZCBscHBUcmFuc3Bvc2VySEJFKAorICAgIEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhMcHBUcmFucywgLyohPCBIYW5kbGUgb2YgbHBwIHRyYW5zcG9zZXIgICovCisgICAgSEFORExFX0hCRV9UUkFOU1BPU0VSIGhRbWZUcmFuc3Bvc2VyLAorICAgIFFNRl9TQ0FMRV9GQUNUT1IgKnNiclNjYWxlRmFjdG9yLCAvKiE8IFNjYWxpbmcgZmFjdG9ycyAqLworICAgIEZJWFBfREJMICoqcW1mQnVmZmVyUmVhbCwgLyohPCBQb2ludGVyIHRvIHBvaW50ZXIgdG8gcmVhbCBwYXJ0IG9mIHN1YmJhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKHNvdXJjZSkgKi8KKyAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlckltYWcsIC8qITwgUG9pbnRlciB0byBwb2ludGVyIHRvIGltYWdpbmFyeSBwYXJ0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJiYW5kIHNhbXBsZXMgKHNvdXJjZSkgKi8KKyAgICBjb25zdCBpbnQgdGltZVN0ZXAsICAgICAgIC8qITwgVGltZSBzdGVwIG9mIGVudmVsb3BlICovCisgICAgY29uc3QgaW50IGZpcnN0U2xvdE9mZnMsICAvKiE8IFN0YXJ0IHBvc2l0aW9uIGluIHRpbWUgKi8KKyAgICBjb25zdCBpbnQgbGFzdFNsb3RPZmZzLCAgIC8qITwgTnVtYmVyIG9mIG92ZXJsYXAtc2xvdHMgaW50byBuZXh0IGZyYW1lICovCisgICAgY29uc3QgaW50IG5JbnZmQmFuZHMsICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBmb3IgaW52ZXJzZSBmaWx0ZXJpbmcgKi8KKyAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGUsIC8qITwgQ3VycmVudCBpbnZlcnNlIGZpbHRlcmluZyBtb2RlcyAqLworICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZV9wcmV2IC8qITwgUHJldmlvdXMgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KKyk7CiAKIFNCUl9FUlJPUgotY3JlYXRlTHBwVHJhbnNwb3NlciAoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLAotICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBoaWdoQmFuZFN0YXJ0U2IsCi0gICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgbnVtTWFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICB1c2IsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIHRpbWVTbG90cywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgbkNvbHMsCi0gICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqbm9pc2VCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIG5vTm9pc2VCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgIFVJTlQgICBmcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgY2hhbiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdmVybGFwKTsKLQorY3JlYXRlTHBwVHJhbnNwb3NlcihIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsCisgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9TRVJfU0VUVElOR1MgKnBTZXR0aW5ncywgY29uc3QgaW50IGhpZ2hCYW5kU3RhcnRTYiwKKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsIGNvbnN0IGludCBudW1NYXN0ZXIsIGNvbnN0IGludCB1c2IsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0aW1lU2xvdHMsIGNvbnN0IGludCBuQ29scywgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbm9Ob2lzZUJhbmRzLCBVSU5UIGZzLCBjb25zdCBpbnQgY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG92ZXJsYXApOwogCiBTQlJfRVJST1IKLXJlc2V0THBwVHJhbnNwb3NlciAoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLAotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgaGlnaEJhbmRTdGFydFNiLAotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgIG51bU1hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgbm9Ob2lzZUJhbmRzLAotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgdXNiLAotICAgICAgICAgICAgICAgICAgICBVSU5UICAgZnMpOworcmVzZXRMcHBUcmFuc3Bvc2VyKEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhMcHBUcmFucywgVUNIQVIgaGlnaEJhbmRTdGFydFNiLAorICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLCBVQ0hBUiBudW1NYXN0ZXIsIFVDSEFSICpub2lzZUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICBVQ0hBUiBub05vaXNlQmFuZHMsIFVDSEFSIHVzYiwgVUlOVCBmcyk7CiAKLQotCi0jZW5kaWYgLyogX0xQUF9UUkFOU19IICovCi0KKyNlbmRpZiAvKiBMUFBfVFJBTl9IICovCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3BzYml0ZGVjLmNwcCBiL2xpYlNCUmRlYy9zcmMvcHNiaXRkZWMuY3BwCmluZGV4IDI5YmRkZjcuLmY0MGExNTYgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvcHNiaXRkZWMuY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvcHNiaXRkZWMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE3ICs5MCwyMyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJwc2JpdGRlYy5oIgogCi0KICNpbmNsdWRlICJzYnJfcm9tLmgiCiAjaW5jbHVkZSAiaHVmZl9kZWMuaCIKIAogLyogUFMgZGVjIHByaXZhdCBmdW5jdGlvbnMgKi8KIFNCUl9FUlJPUiBSZXNldFBzRGVjKEhBTkRMRV9QU19ERUMgaF9wc19kKTsKLXZvaWQgUmVzZXRQc0RlQ29yICAgKEhBTkRMRV9QU19ERUMgaF9wc19kKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQpAQCAtOTgsMjQgKzExNSwyNCBAQAogICBccmV0dXJuIGluZGV4IG9mIGh1ZmZtYW4gY29kZWJvb2sgdGFibGUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBTQ0hBUgotZGVjb2RlX2h1ZmZfY3cgKEh1ZmZtYW4gaCwgICAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGh1ZmZtYW4gY29kZWJvb2sgdGFibGUgKi8KLSAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCAgIC8qITwgSGFuZGxlIHRvIEJpdGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIGludCAqbGVuZ3RoKSAgICAgICAgICAgICAgICAgICAgLyohPCBsZW5ndGggb2YgaHVmZm1hbiBjb2Rld29yZCAob3IgTlVMTCkgKi8KK3N0YXRpYyBTQ0hBUiBkZWNvZGVfaHVmZl9jdygKKyAgICBIdWZmbWFuIGgsICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gaHVmZm1hbiBjb2RlYm9vayB0YWJsZSAqLworICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIC8qITwgSGFuZGxlIHRvIEJpdGJ1ZmZlciAqLworICAgIGludCAqbGVuZ3RoKSAgICAgICAgICAgICAgICAgIC8qITwgbGVuZ3RoIG9mIGh1ZmZtYW4gY29kZXdvcmQgKG9yIE5VTEwpICovCiB7CiAgIFVDSEFSIGJpdCA9IDA7CiAgIFNDSEFSIGluZGV4ID0gMDsKICAgVUNIQVIgYml0Q291bnQgPSAwOwogCiAgIHdoaWxlIChpbmRleCA+PSAwKSB7Ci0gICAgYml0ID0gRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOworICAgIGJpdCA9IEZES3JlYWRCaXRzKGhCaXRCdWYsIDEpOwogICAgIGJpdENvdW50Kys7CiAgICAgaW5kZXggPSBoW2luZGV4XVtiaXRdOwogICB9CiAgIGlmIChsZW5ndGgpIHsKICAgICAqbGVuZ3RoID0gYml0Q291bnQ7CiAgIH0KLSAgcmV0dXJuKCBpbmRleCs2NCApOyAvKiBBZGQgb2Zmc2V0ICovCisgIHJldHVybiAoaW5kZXggKyA2NCk7IC8qIEFkZCBvZmZzZXQgKi8KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyNiwxNCArMTQzLDEwIEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBTQ0hBUgotbGltaXRNaW5NYXgoU0NIQVIgaSwKLSAgICAgICAgICAgIFNDSEFSIG1pbiwKLSAgICAgICAgICAgIFNDSEFSIG1heCkKLXsKLSAgaWYgKGk8bWluKQorc3RhdGljIFNDSEFSIGxpbWl0TWluTWF4KFNDSEFSIGksIFNDSEFSIG1pbiwgU0NIQVIgbWF4KSB7CisgIGlmIChpIDwgbWluKQogICAgIHJldHVybiBtaW47Ci0gIGVsc2UgaWYgKGk+bWF4KQorICBlbHNlIGlmIChpID4gbWF4KQogICAgIHJldHVybiBtYXg7CiAgIGVsc2UKICAgICByZXR1cm4gaTsKQEAgLTE1MCw0NCArMTYzLDM4IEBACiAgIFxyZXR1cm4gbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWRlbHRhRGVjb2RlQXJyYXkoU0NIQVIgZW5hYmxlLAotICAgICAgICAgICAgICAgICBTQ0hBUiAqYUluZGV4LCAgICAgICAgICAvKiE8IElDQy9JSUQgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgICBTQ0hBUiAqYVByZXZGcmFtZUluZGV4LCAvKiE8IElDQy9JSUQgcGFyYW1ldGVycyAgb2YgcHJldmlvdXMgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgU0NIQVIgRHREZiwKLSAgICAgICAgICAgICAgICAgVUNIQVIgbnJFbGVtZW50cywgICAgICAgLyohPCBhcyBjb252ZXllZCBpbiBiaXRzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBvdXRwdXQgYXJyYXkgc2l6ZTogbnJFbGVtZW50cypzdHJpZGUgKi8KLSAgICAgICAgICAgICAgICAgVUNIQVIgc3RyaWRlLCAgICAgICAgICAgLyohPCAxPWRmbHQsIDI9aGFsZiBmcmVxLiByZXNvbHV0aW9uICovCi0gICAgICAgICAgICAgICAgIFNDSEFSIG1pbklkeCwKLSAgICAgICAgICAgICAgICAgU0NIQVIgbWF4SWR4KQoteworc3RhdGljIHZvaWQgZGVsdGFEZWNvZGVBcnJheSgKKyAgICBTQ0hBUiBlbmFibGUsIFNDSEFSICphSW5kZXgsICAvKiE8IElDQy9JSUQgcGFyYW1ldGVycyAqLworICAgIFNDSEFSICphUHJldkZyYW1lSW5kZXgsICAgICAgIC8qITwgSUNDL0lJRCBwYXJhbWV0ZXJzICBvZiBwcmV2aW91cyBmcmFtZSAqLworICAgIFNDSEFSIER0RGYsIFVDSEFSIG5yRWxlbWVudHMsIC8qITwgYXMgY29udmV5ZWQgaW4gYml0c3RyZWFtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBvdXRwdXQgYXJyYXkgc2l6ZTogbnJFbGVtZW50cypzdHJpZGUgKi8KKyAgICBVQ0hBUiBzdHJpZGUsICAgICAgICAgICAgICAgICAvKiE8IDE9ZGZsdCwgMj1oYWxmIGZyZXEuIHJlc29sdXRpb24gKi8KKyAgICBTQ0hBUiBtaW5JZHgsIFNDSEFSIG1heElkeCkgewogICBpbnQgaTsKIAogICAvKiBEZWx0YSBkZWNvZGUgKi8KLSAgaWYgKCBlbmFibGU9PTEgKSB7Ci0gICAgaWYgKER0RGYgPT0gMCkgIHsgICAvKiBEZWx0YSBjb2RlZCBpbiBmcmVxICovCisgIGlmIChlbmFibGUgPT0gMSkgeworICAgIGlmIChEdERmID09IDApIHsgLyogRGVsdGEgY29kZWQgaW4gZnJlcSAqLwogICAgICAgYUluZGV4WzBdID0gMCArIGFJbmRleFswXTsKLSAgICAgIGFJbmRleFswXSA9IGxpbWl0TWluTWF4KGFJbmRleFswXSxtaW5JZHgsbWF4SWR4KTsKKyAgICAgIGFJbmRleFswXSA9IGxpbWl0TWluTWF4KGFJbmRleFswXSwgbWluSWR4LCBtYXhJZHgpOwogICAgICAgZm9yIChpID0gMTsgaSA8IG5yRWxlbWVudHM7IGkrKykgewotICAgICAgICBhSW5kZXhbaV0gPSBhSW5kZXhbaS0xXSArIGFJbmRleFtpXTsKLSAgICAgICAgYUluZGV4W2ldID0gbGltaXRNaW5NYXgoYUluZGV4W2ldLG1pbklkeCxtYXhJZHgpOworICAgICAgICBhSW5kZXhbaV0gPSBhSW5kZXhbaSAtIDFdICsgYUluZGV4W2ldOworICAgICAgICBhSW5kZXhbaV0gPSBsaW1pdE1pbk1heChhSW5kZXhbaV0sIG1pbklkeCwgbWF4SWR4KTsKICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7IC8qIERlbHRhIHRpbWUgKi8KKyAgICB9IGVsc2UgeyAvKiBEZWx0YSB0aW1lICovCiAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnJFbGVtZW50czsgaSsrKSB7Ci0gICAgICAgIGFJbmRleFtpXSA9IGFQcmV2RnJhbWVJbmRleFtpKnN0cmlkZV0gKyBhSW5kZXhbaV07Ci0gICAgICAgIGFJbmRleFtpXSA9IGxpbWl0TWluTWF4KGFJbmRleFtpXSxtaW5JZHgsbWF4SWR4KTsKKyAgICAgICAgYUluZGV4W2ldID0gYVByZXZGcmFtZUluZGV4W2kgKiBzdHJpZGVdICsgYUluZGV4W2ldOworICAgICAgICBhSW5kZXhbaV0gPSBsaW1pdE1pbk1heChhSW5kZXhbaV0sIG1pbklkeCwgbWF4SWR4KTsKICAgICAgIH0KICAgICB9Ci0gIH0KLSAgZWxzZSB7IC8qIE5vIGRhdGEgaXMgc2VudCwgc2V0IGluZGV4IHRvIHplcm8gKi8KKyAgfSBlbHNlIHsgLyogTm8gZGF0YSBpcyBzZW50LCBzZXQgaW5kZXggdG8gemVybyAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBuckVsZW1lbnRzOyBpKyspIHsKICAgICAgIGFJbmRleFtpXSA9IDA7CiAgICAgfQogICB9Ci0gIGlmIChzdHJpZGU9PTIpIHsKLSAgICBmb3IgKGk9bnJFbGVtZW50cypzdHJpZGUtMTsgaT4wOyBpLS0pIHsKLSAgICAgIGFJbmRleFtpXSA9IGFJbmRleFtpPj4xXTsKKyAgaWYgKHN0cmlkZSA9PSAyKSB7CisgICAgZm9yIChpID0gbnJFbGVtZW50cyAqIHN0cmlkZSAtIDE7IGkgPiAwOyBpLS0pIHsKKyAgICAgIGFJbmRleFtpXSA9IGFJbmRleFtpID4+IDFdOwogICAgIH0KICAgfQogfQpAQCAtMTk5LDMzICsyMDYsMzIgQEAKICAgXHJldHVybiBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBtYXAzNEluZGV4VG8yMCAoU0NIQVIgKmFJbmRleCwgLyohPCBkZWNvZGVkIElDQy9JSUQgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIG5vQmlucykgIC8qITwgbnVtYmVyIG9mIHN0ZXJlbyBiYW5kcyAgICAgKi8KK3N0YXRpYyB2b2lkIG1hcDM0SW5kZXhUbzIwKFNDSEFSICphSW5kZXgsIC8qITwgZGVjb2RlZCBJQ0MvSUlEIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIG5vQmlucykgIC8qITwgbnVtYmVyIG9mIHN0ZXJlbyBiYW5kcyAgICAgKi8KIHsKLSAgYUluZGV4WzBdICA9ICgyKmFJbmRleFswXSthSW5kZXhbMV0pLzM7Ci0gIGFJbmRleFsxXSAgPSAoYUluZGV4WzFdKzIqYUluZGV4WzJdKS8zOwotICBhSW5kZXhbMl0gID0gKDIqYUluZGV4WzNdK2FJbmRleFs0XSkvMzsKLSAgYUluZGV4WzNdICA9IChhSW5kZXhbNF0rMiphSW5kZXhbNV0pLzM7Ci0gIGFJbmRleFs0XSAgPSAoYUluZGV4WzZdK2FJbmRleFs3XSkvMjsKLSAgYUluZGV4WzVdICA9IChhSW5kZXhbOF0rYUluZGV4WzldKS8yOwotICBhSW5kZXhbNl0gID0gYUluZGV4WzEwXTsKLSAgYUluZGV4WzddICA9IGFJbmRleFsxMV07Ci0gIGFJbmRleFs4XSAgPSAoYUluZGV4WzEyXSthSW5kZXhbMTNdKS8yOwotICBhSW5kZXhbOV0gID0gKGFJbmRleFsxNF0rYUluZGV4WzE1XSkvMjsKKyAgYUluZGV4WzBdID0gKDIgKiBhSW5kZXhbMF0gKyBhSW5kZXhbMV0pIC8gMzsKKyAgYUluZGV4WzFdID0gKGFJbmRleFsxXSArIDIgKiBhSW5kZXhbMl0pIC8gMzsKKyAgYUluZGV4WzJdID0gKDIgKiBhSW5kZXhbM10gKyBhSW5kZXhbNF0pIC8gMzsKKyAgYUluZGV4WzNdID0gKGFJbmRleFs0XSArIDIgKiBhSW5kZXhbNV0pIC8gMzsKKyAgYUluZGV4WzRdID0gKGFJbmRleFs2XSArIGFJbmRleFs3XSkgLyAyOworICBhSW5kZXhbNV0gPSAoYUluZGV4WzhdICsgYUluZGV4WzldKSAvIDI7CisgIGFJbmRleFs2XSA9IGFJbmRleFsxMF07CisgIGFJbmRleFs3XSA9IGFJbmRleFsxMV07CisgIGFJbmRleFs4XSA9IChhSW5kZXhbMTJdICsgYUluZGV4WzEzXSkgLyAyOworICBhSW5kZXhbOV0gPSAoYUluZGV4WzE0XSArIGFJbmRleFsxNV0pIC8gMjsKICAgYUluZGV4WzEwXSA9IGFJbmRleFsxNl07CiAgIC8qIEZvciBJUEQvT1BEIGl0IHN0b3BzIGhlcmUgKi8KIAotICBpZiAobm9CaW5zID09IE5PX0hJX1JFU19CSU5TKQotICB7CisgIGlmIChub0JpbnMgPT0gTk9fSElfUkVTX0JJTlMpIHsKICAgICBhSW5kZXhbMTFdID0gYUluZGV4WzE3XTsKICAgICBhSW5kZXhbMTJdID0gYUluZGV4WzE4XTsKICAgICBhSW5kZXhbMTNdID0gYUluZGV4WzE5XTsKLSAgICBhSW5kZXhbMTRdID0gKGFJbmRleFsyMF0rYUluZGV4WzIxXSkvMjsKLSAgICBhSW5kZXhbMTVdID0gKGFJbmRleFsyMl0rYUluZGV4WzIzXSkvMjsKLSAgICBhSW5kZXhbMTZdID0gKGFJbmRleFsyNF0rYUluZGV4WzI1XSkvMjsKLSAgICBhSW5kZXhbMTddID0gKGFJbmRleFsyNl0rYUluZGV4WzI3XSkvMjsKLSAgICBhSW5kZXhbMThdID0gKGFJbmRleFsyOF0rYUluZGV4WzI5XSthSW5kZXhbMzBdK2FJbmRleFszMV0pLzQ7Ci0gICAgYUluZGV4WzE5XSA9IChhSW5kZXhbMzJdK2FJbmRleFszM10pLzI7CisgICAgYUluZGV4WzE0XSA9IChhSW5kZXhbMjBdICsgYUluZGV4WzIxXSkgLyAyOworICAgIGFJbmRleFsxNV0gPSAoYUluZGV4WzIyXSArIGFJbmRleFsyM10pIC8gMjsKKyAgICBhSW5kZXhbMTZdID0gKGFJbmRleFsyNF0gKyBhSW5kZXhbMjVdKSAvIDI7CisgICAgYUluZGV4WzE3XSA9IChhSW5kZXhbMjZdICsgYUluZGV4WzI3XSkgLyAyOworICAgIGFJbmRleFsxOF0gPSAoYUluZGV4WzI4XSArIGFJbmRleFsyOV0gKyBhSW5kZXhbMzBdICsgYUluZGV4WzMxXSkgLyA0OworICAgIGFJbmRleFsxOV0gPSAoYUluZGV4WzMyXSArIGFJbmRleFszM10pIC8gMjsKICAgfQogfQogCkBAIC0yMzYsMjQgKzI0MiwyOCBAQAogICBccmV0dXJuIFBTIHByb2Nlc3NpbmcgZmxhZy4gSWYgc2V0IHRvIDEKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotRGVjb2RlUHMoIHN0cnVjdCBQU19ERUMgKmhfcHNfZCwgICAgICAvKiE8IFBTIGhhbmRsZSAqLwotICAgICAgICAgIGNvbnN0IFVDSEFSICAgIGZyYW1lRXJyb3IgKSAvKiE8IEZsYWcgdGVsbGluZyB0aGF0IGZyYW1lIGhhZCBlcnJvcnMgKi8KLXsKK2ludCBEZWNvZGVQcyhzdHJ1Y3QgUFNfREVDICpoX3BzX2QsICAvKiE8IFBTIGhhbmRsZSAqLworICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGZyYW1lRXJyb3IsIC8qITwgRmxhZyB0ZWxsaW5nIHRoYXQgZnJhbWUgaGFkIGVycm9ycyAqLworICAgICAgICAgICAgIFBTX0RFQ19DT0VGRklDSUVOVFMgKnBTY3JhdGNoKSB7CiAgIE1QRUdfUFNfQlNfREFUQSAqcEJzRGF0YTsKICAgVUNIQVIgZ3IsIGVudjsKLSAgaW50ICAgYlBzSGVhZGVyVmFsaWQsIGJQc0RhdGFBdmFpbDsKKyAgaW50IGJQc0hlYWRlclZhbGlkLCBiUHNEYXRhQXZhaWw7CisKKyAgLyogQXNzaWduIFNjcmF0Y2ggKi8KKyAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYgPSBwU2NyYXRjaDsKIAogICAvKiBTaG9ydGN1dHMgdG8gYXZvaWQgZGVmZXJlbmNpbmcgYW5kIGtlZXAgdGhlIGNvZGUgcmVhZGFibGUgKi8KICAgcEJzRGF0YSA9ICZoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPnByb2Nlc3NTbG90XS5tcGVnOwogICBiUHNIZWFkZXJWYWxpZCA9IHBCc0RhdGEtPmJQc0hlYWRlclZhbGlkOwotICBiUHNEYXRhQXZhaWwgPSAoaF9wc19kLT5iUHNEYXRhQXZhaWxbaF9wc19kLT5wcm9jZXNzU2xvdF0gPT0gcHB0X21wZWcpID8gMSA6IDA7CisgIGJQc0RhdGFBdmFpbCA9CisgICAgICAoaF9wc19kLT5iUHNEYXRhQXZhaWxbaF9wc19kLT5wcm9jZXNzU2xvdF0gPT0gcHB0X21wZWcpID8gMSA6IDA7CiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICogRGVjaWRlIHdoZXRoZXIgdG8gcHJvY2VzcyBvciB0byBjb25jZWFsIFBTIGRhdGEgb3Igbm90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiBEZWNpZGUgd2hldGhlciB0byBwcm9jZXNzIG9yIHRvIGNvbmNlYWwgUFMgZGF0YSBvciBub3QuICovCiAKLSAgaWYgKCAoIGhfcHNfZC0+cHNEZWNvZGVkUHJ2ICYmICFmcmFtZUVycm9yICYmICFiUHNEYXRhQXZhaWwpCi0gICAgfHwgKCFoX3BzX2QtPnBzRGVjb2RlZFBydiAmJiAoZnJhbWVFcnJvciB8fCAhYlBzRGF0YUF2YWlsIHx8ICFiUHNIZWFkZXJWYWxpZCkpICkgeworICBpZiAoKGhfcHNfZC0+cHNEZWNvZGVkUHJ2ICYmICFmcmFtZUVycm9yICYmICFiUHNEYXRhQXZhaWwpIHx8CisgICAgICAoIWhfcHNfZC0+cHNEZWNvZGVkUHJ2ICYmCisgICAgICAgKGZyYW1lRXJyb3IgfHwgIWJQc0RhdGFBdmFpbCB8fCAhYlBzSGVhZGVyVmFsaWQpKSkgewogICAgIC8qIERvbid0IGFwcGx5IFBTIHByb2Nlc3NpbmcuCiAgICAgICogRGVjbGFyZSBjdXJyZW50IFBTIGhlYWRlciBhbmQgYml0c3RyZWFtIGRhdGEgaW52YWxpZC4gKi8KICAgICBwQnNEYXRhLT5iUHNIZWFkZXJWYWxpZCA9IDA7CkBAIC0yNjEsODcgKzI3MSw4MCBAQAogICAgIHJldHVybiAoMCk7CiAgIH0KIAotICBpZiAoZnJhbWVFcnJvciB8fCAhYlBzSGVhZGVyVmFsaWQpCi0gIHsgLyogbm8gbmV3IFBTIGRhdGEgYXZhaWxhYmxlIChlLmcuIGZyYW1lIGxvc3MpICovCisgIGlmIChmcmFtZUVycm9yIHx8CisgICAgICAhYlBzSGVhZGVyVmFsaWQpIHsgLyogbm8gbmV3IFBTIGRhdGEgYXZhaWxhYmxlIChlLmcuIGZyYW1lIGxvc3MpICovCiAgICAgLyogPT4ga2VlcCBsYXRlc3QgZGF0YSBjb25zdGFudCAoaS5lLiBGSVggd2l0aCBub0Vudj0wKSAqLwogICAgIHBCc0RhdGEtPm5vRW52ID0gMDsKICAgfQogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqIERlY29kZSBiaXRzdHJlYW0gcGF5bG9hZCBvciBwcmVwYXJlIHBhcmFtZXRlciBmb3IgY29uY2VhbG1lbnQ6Ci0gICovCi0gIGZvciAoZW52PTA7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiBEZWNvZGUgYml0c3RyZWFtIHBheWxvYWQgb3IgcHJlcGFyZSBwYXJhbWV0ZXIgZm9yIGNvbmNlYWxtZW50OgorICAgKi8KKyAgZm9yIChlbnYgPSAwOyBlbnYgPCBwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKICAgICBTQ0hBUiAqYVByZXZJaWRJbmRleDsKICAgICBTQ0hBUiAqYVByZXZJY2NJbmRleDsKIAotICAgIFVDSEFSIG5vSWlkU3RlcHMgPSBwQnNEYXRhLT5iRmluZUlpZFE/Tk9fSUlEX1NURVBTX0ZJTkU6Tk9fSUlEX1NURVBTOworICAgIFVDSEFSIG5vSWlkU3RlcHMgPSBwQnNEYXRhLT5iRmluZUlpZFEgPyBOT19JSURfU1RFUFNfRklORSA6IE5PX0lJRF9TVEVQUzsKIAotICAgIGlmIChlbnY9PTApIHsKKyAgICBpZiAoZW52ID09IDApIHsKICAgICAgIGFQcmV2SWlkSW5kZXggPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hSWlkUHJldkZyYW1lSW5kZXg7CiAgICAgICBhUHJldkljY0luZGV4ID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYUljY1ByZXZGcmFtZUluZGV4OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGFQcmV2SWlkSW5kZXggPSBwQnNEYXRhLT5hYUlpZEluZGV4W2Vudi0xXTsKLSAgICAgIGFQcmV2SWNjSW5kZXggPSBwQnNEYXRhLT5hYUljY0luZGV4W2Vudi0xXTsKKyAgICB9IGVsc2UgeworICAgICAgYVByZXZJaWRJbmRleCA9IHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52IC0gMV07CisgICAgICBhUHJldkljY0luZGV4ID0gcEJzRGF0YS0+YWFJY2NJbmRleFtlbnYgLSAxXTsKICAgICB9CiAKLSAgICBkZWx0YURlY29kZUFycmF5KHBCc0RhdGEtPmJFbmFibGVJaWQsCi0gICAgICAgICAgICAgICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W2Vudl0sCi0gICAgICAgICAgICAgICAgICAgICBhUHJldklpZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgcEJzRGF0YS0+YWJJaWREdEZsYWdbZW52XSwKKyAgICBkZWx0YURlY29kZUFycmF5KHBCc0RhdGEtPmJFbmFibGVJaWQsIHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52XSwKKyAgICAgICAgICAgICAgICAgICAgIGFQcmV2SWlkSW5kZXgsIHBCc0RhdGEtPmFiSWlkRHRGbGFnW2Vudl0sCiAgICAgICAgICAgICAgICAgICAgICBGREtfc2JyRGVjb2Rlcl9hTm9JaWRCaW5zW3BCc0RhdGEtPmZyZXFSZXNJaWRdLAotICAgICAgICAgICAgICAgICAgICAgKHBCc0RhdGEtPmZyZXFSZXNJaWQpPzE6MiwKLSAgICAgICAgICAgICAgICAgICAgIC1ub0lpZFN0ZXBzLAotICAgICAgICAgICAgICAgICAgICAgbm9JaWRTdGVwcyk7CisgICAgICAgICAgICAgICAgICAgICAocEJzRGF0YS0+ZnJlcVJlc0lpZCkgPyAxIDogMiwgLW5vSWlkU3RlcHMsIG5vSWlkU3RlcHMpOwogCi0gICAgZGVsdGFEZWNvZGVBcnJheShwQnNEYXRhLT5iRW5hYmxlSWNjLAotICAgICAgICAgICAgICAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtlbnZdLAotICAgICAgICAgICAgICAgICAgICAgYVByZXZJY2NJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIHBCc0RhdGEtPmFiSWNjRHRGbGFnW2Vudl0sCisgICAgZGVsdGFEZWNvZGVBcnJheShwQnNEYXRhLT5iRW5hYmxlSWNjLCBwQnNEYXRhLT5hYUljY0luZGV4W2Vudl0sCisgICAgICAgICAgICAgICAgICAgICBhUHJldkljY0luZGV4LCBwQnNEYXRhLT5hYkljY0R0RmxhZ1tlbnZdLAogICAgICAgICAgICAgICAgICAgICAgRkRLX3NickRlY29kZXJfYU5vSWNjQmluc1twQnNEYXRhLT5mcmVxUmVzSWNjXSwKLSAgICAgICAgICAgICAgICAgICAgIChwQnNEYXRhLT5mcmVxUmVzSWNjKT8xOjIsCi0gICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgTk9fSUNDX1NURVBTLTEpOwotICB9ICAgLyogZm9yIChlbnY9MDsgZW52PHBCc0RhdGEtPm5vRW52OyBlbnYrKykgKi8KKyAgICAgICAgICAgICAgICAgICAgIChwQnNEYXRhLT5mcmVxUmVzSWNjKSA/IDEgOiAyLCAwLCBOT19JQ0NfU1RFUFMgLSAxKTsKKyAgfSAvKiBmb3IgKGVudj0wOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSAqLwogCiAgIC8qIGhhbmRsaW5nIG9mIEZJWCBub0Vudj0wICovCi0gIGlmIChwQnNEYXRhLT5ub0Vudj09MCkgeworICBpZiAocEJzRGF0YS0+bm9FbnYgPT0gMCkgewogICAgIC8qIHNldCBub0Vudj0xLCBrZWVwIGxhc3QgcGFyYW1ldGVycyBvciBmb3JjZSAwIGlmIG5vdCBlbmFibGVkICovCiAgICAgcEJzRGF0YS0+bm9FbnYgPSAxOwogCiAgICAgaWYgKHBCc0RhdGEtPmJFbmFibGVJaWQpIHsKKyAgICAgIHBCc0RhdGEtPmJGaW5lSWlkUSA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmJQcmV2RnJhbWVGaW5lSWlkUTsKICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IE5PX0hJX1JFU19JSURfQklOUzsgZ3IrKykgewotICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W3BCc0RhdGEtPm5vRW52LTFdW2dyXSA9Ci0gICAgICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYUlpZFByZXZGcmFtZUluZGV4W2dyXTsKKyAgICAgICAgcEJzRGF0YS0+YWFJaWRJbmRleFtwQnNEYXRhLT5ub0VudiAtIDFdW2dyXSA9CisgICAgICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hSWlkUHJldkZyYW1lSW5kZXhbZ3JdOwogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgZm9yIChnciA9IDA7IGdyIDwgTk9fSElfUkVTX0lJRF9CSU5TOyBncisrKSB7Ci0gICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdID0gMDsKKyAgICAgICAgcEJzRGF0YS0+YWFJaWRJbmRleFtwQnNEYXRhLT5ub0VudiAtIDFdW2dyXSA9IDA7CiAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHBCc0RhdGEtPmJFbmFibGVJY2MpIHsKICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IE5PX0hJX1JFU19JQ0NfQklOUzsgZ3IrKykgewotICAgICAgICBwQnNEYXRhLT5hYUljY0luZGV4W3BCc0RhdGEtPm5vRW52LTFdW2dyXSA9Ci0gICAgICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYUljY1ByZXZGcmFtZUluZGV4W2dyXTsKKyAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtwQnNEYXRhLT5ub0VudiAtIDFdW2dyXSA9CisgICAgICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hSWNjUHJldkZyYW1lSW5kZXhbZ3JdOwogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgZm9yIChnciA9IDA7IGdyIDwgTk9fSElfUkVTX0lDQ19CSU5TOyBncisrKSB7Ci0gICAgICAgIHBCc0RhdGEtPmFhSWNjSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdID0gMDsKKyAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtwQnNEYXRhLT5ub0VudiAtIDFdW2dyXSA9IDA7CiAgICAgICB9CiAgICAgfQogICB9CiAKKyAgLyogVXBkYXRlIHByZXZpb3VzIGZyYW1lIElpZCBxdWFudGl6YXRpb24gKi8KKyAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYlByZXZGcmFtZUZpbmVJaWRRID0gcEJzRGF0YS0+YkZpbmVJaWRROworCiAgIC8qIFVwZGF0ZSBwcmV2aW91cyBmcmFtZSBpbmRleCBidWZmZXJzICovCiAgIGZvciAoZ3IgPSAwOyBnciA8IE5PX0hJX1JFU19JSURfQklOUzsgZ3IrKykgewogICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFJaWRQcmV2RnJhbWVJbmRleFtncl0gPQotICAgICAgcEJzRGF0YS0+YWFJaWRJbmRleFtwQnNEYXRhLT5ub0Vudi0xXVtncl07CisgICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbcEJzRGF0YS0+bm9FbnYgLSAxXVtncl07CiAgIH0KICAgZm9yIChnciA9IDA7IGdyIDwgTk9fSElfUkVTX0lDQ19CSU5TOyBncisrKSB7CiAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYUljY1ByZXZGcmFtZUluZGV4W2dyXSA9Ci0gICAgICBwQnNEYXRhLT5hYUljY0luZGV4W3BCc0RhdGEtPm5vRW52LTFdW2dyXTsKKyAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtwQnNEYXRhLT5ub0VudiAtIDFdW2dyXTsKICAgfQogCiAgIC8qIFBTIGRhdGEgZnJvbSBiaXRzdHJlYW0gKGlmIGF2YWlsKSB3YXMgZGVjb2RlZCBub3cgKi8KQEAgLTM1MSwxNSArMzU0LDE0IEBACiAgIGlmIChwQnNEYXRhLT5iRnJhbWVDbGFzcyA9PSAwKSB7CiAgICAgLyogRklYX0JPUkRFUlMgTm9FbnY9MCwxLDIsNCAqLwogICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbMF0gPSAwOwotICAgIGZvciAoZW52PTE7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKKyAgICBmb3IgKGVudiA9IDE7IGVudiA8IHBCc0RhdGEtPm5vRW52OyBlbnYrKykgewogICAgICAgcEJzRGF0YS0+YUVudlN0YXJ0U3RvcFtlbnZdID0KLSAgICAgICAgKGVudiAqIGhfcHNfZC0+bm9TdWJTYW1wbGVzKSAvIHBCc0RhdGEtPm5vRW52OworICAgICAgICAgIChlbnYgKiBoX3BzX2QtPm5vU3ViU2FtcGxlcykgLyBwQnNEYXRhLT5ub0VudjsKICAgICB9CiAgICAgcEJzRGF0YS0+YUVudlN0YXJ0U3RvcFtwQnNEYXRhLT5ub0Vudl0gPSBoX3BzX2QtPm5vU3ViU2FtcGxlczsKICAgICAvKiAxMDI0ICgzMiBzbG90cykgZW52IGJvcmRlcnM6ICAwLCA4LCAxNiwgMjQsIDMyICovCiAgICAgLyogIDk2MCAoMzAgc2xvdHMpIGVudiBib3JkZXJzOiAgMCwgNywgMTUsIDIyLCAzMCAqLwotICB9Ci0gIGVsc2UgeyAgIC8qIGlmIChoX3BzX2QtPmJGcmFtZUNsYXNzID09IDApICovCisgIH0gZWxzZSB7IC8qIGlmIChoX3BzX2QtPmJGcmFtZUNsYXNzID09IDApICovCiAgICAgLyogVkFSX0JPUkRFUlMgTm9FbnY9MSwyLDMsNCAqLwogICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbMF0gPSAwOwogCkBAIC0zNjgsNTUgKzM3MCw1OSBAQAogICAgIGlmIChwQnNEYXRhLT5hRW52U3RhcnRTdG9wW3BCc0RhdGEtPm5vRW52XSA8IGhfcHNfZC0+bm9TdWJTYW1wbGVzKSB7CiAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUlEX0JJTlM7IGdyKyspIHsKICAgICAgICAgcEJzRGF0YS0+YWFJaWRJbmRleFtwQnNEYXRhLT5ub0Vudl1bZ3JdID0KLSAgICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W3BCc0RhdGEtPm5vRW52LTFdW2dyXTsKKyAgICAgICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbcEJzRGF0YS0+bm9FbnYgLSAxXVtncl07CiAgICAgICB9CiAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUNDX0JJTlM7IGdyKyspIHsKICAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtwQnNEYXRhLT5ub0Vudl1bZ3JdID0KLSAgICAgICAgICBwQnNEYXRhLT5hYUljY0luZGV4W3BCc0RhdGEtPm5vRW52LTFdW2dyXTsKKyAgICAgICAgICAgIHBCc0RhdGEtPmFhSWNjSW5kZXhbcEJzRGF0YS0+bm9FbnYgLSAxXVtncl07CiAgICAgICB9CiAgICAgICBwQnNEYXRhLT5ub0VudisrOwogICAgICAgcEJzRGF0YS0+YUVudlN0YXJ0U3RvcFtwQnNEYXRhLT5ub0Vudl0gPSBoX3BzX2QtPm5vU3ViU2FtcGxlczsKICAgICB9CiAKICAgICAvKiBlbmZvcmNlIHN0cmljdGx5IG1vbm90b25pYyBpbmNyZWFzaW5nIGJvcmRlcnMgKi8KLSAgICBmb3IgKGVudj0xOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CisgICAgZm9yIChlbnYgPSAxOyBlbnYgPCBwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKICAgICAgIFVDSEFSIHRocjsKICAgICAgIHRociA9IChVQ0hBUiloX3BzX2QtPm5vU3ViU2FtcGxlcyAtIChwQnNEYXRhLT5ub0VudiAtIGVudik7CiAgICAgICBpZiAocEJzRGF0YS0+YUVudlN0YXJ0U3RvcFtlbnZdID4gdGhyKSB7CiAgICAgICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52XSA9IHRocjsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICB0aHIgPSBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudi0xXSsxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyID0gcEJzRGF0YS0+YUVudlN0YXJ0U3RvcFtlbnYgLSAxXSArIDE7CiAgICAgICAgIGlmIChwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudl0gPCB0aHIpIHsKICAgICAgICAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudl0gPSB0aHI7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gIH0gICAvKiBpZiAoaF9wc19kLT5iRnJhbWVDbGFzcyA9PSAwKSAuLi4gZWxzZSAqLworICB9IC8qIGlmIChoX3BzX2QtPmJGcmFtZUNsYXNzID09IDApIC4uLiBlbHNlICovCiAKICAgLyogY29weSBkYXRhIHByaW9yIHRvIHBvc3NpYmxlIDIwPC0+MzQgaW4tcGxhY2UgbWFwcGluZyAqLwotICBmb3IgKGVudj0wOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CisgIGZvciAoZW52ID0gMDsgZW52IDwgcEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CiAgICAgVUNIQVIgaTsKLSAgICBmb3IgKGk9MDsgaTxOT19ISV9SRVNfSUlEX0JJTlM7IGkrKykgewotICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5hYUlpZEluZGV4TWFwcGVkW2Vudl1baV0gPSBwQnNEYXRhLT5hYUlpZEluZGV4W2Vudl1baV07CisgICAgZm9yIChpID0gMDsgaSA8IE5PX0hJX1JFU19JSURfQklOUzsgaSsrKSB7CisgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+YWFJaWRJbmRleE1hcHBlZFtlbnZdW2ldID0KKyAgICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W2Vudl1baV07CiAgICAgfQotICAgIGZvciAoaT0wOyBpPE5PX0hJX1JFU19JQ0NfQklOUzsgaSsrKSB7Ci0gICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLmFhSWNjSW5kZXhNYXBwZWRbZW52XVtpXSA9IHBCc0RhdGEtPmFhSWNjSW5kZXhbZW52XVtpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTk9fSElfUkVTX0lDQ19CSU5TOyBpKyspIHsKKyAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5hYUljY0luZGV4TWFwcGVkW2Vudl1baV0gPQorICAgICAgICAgIHBCc0RhdGEtPmFhSWNjSW5kZXhbZW52XVtpXTsKICAgICB9CiAgIH0KIAotCiAgIC8qIE1QRUcgYmFzZWxpbmUgUFMgKi8KLSAgLyogQmFzZWxpbmUgdmVyc2lvbiBvZiBQUyBhbHdheXMgdXNlcyB0aGUgaHlicmlkIGZpbHRlciBzdHJ1Y3R1cmUgd2l0aCAyMCBzdGVyZW8gYmFuZHMuICovCi0gIC8qIElmIElDQy9JSUQgcGFyYW1ldGVycyBmb3IgMzQgc3RlcmVvIGJhbmRzIGFyZSBkZWNvZGVkIHRoZXkgaGF2ZSB0byBiZSBtYXBwZWQgdG8gMjAgICAqLwotICAvKiBzdGVyZW8gYmFuZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQWRkaXRpb25hbHkgdGhlIElQRC9PUEQgcGFyYW1ldGVycyB3b24ndCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEJhc2VsaW5lIHZlcnNpb24gb2YgUFMgYWx3YXlzIHVzZXMgdGhlIGh5YnJpZCBmaWx0ZXIgc3RydWN0dXJlIHdpdGggMjAKKyAgICogc3RlcmVvIGJhbmRzLiAqLworICAvKiBJZiBJQ0MvSUlEIHBhcmFtZXRlcnMgZm9yIDM0IHN0ZXJlbyBiYW5kcyBhcmUgZGVjb2RlZCB0aGV5IGhhdmUgdG8gYmUKKyAgICogbWFwcGVkIHRvIDIwICAgKi8KKyAgLyogc3RlcmVvIGJhbmRzLiAqLworICAvKiBBZGRpdGlvbmFseSB0aGUgSVBEL09QRCBwYXJhbWV0ZXJzIHdvbid0IGJlIHVzZWQuICovCiAKLSAgZm9yIChlbnY9MDsgZW52PHBCc0RhdGEtPm5vRW52OyBlbnYrKykgeworICBmb3IgKGVudiA9IDA7IGVudiA8IHBCc0RhdGEtPm5vRW52OyBlbnYrKykgewogICAgIGlmIChwQnNEYXRhLT5mcmVxUmVzSWlkID09IDIpCi0gICAgICBtYXAzNEluZGV4VG8yMCAoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5hYUlpZEluZGV4TWFwcGVkW2Vudl0sIE5PX0hJX1JFU19JSURfQklOUyk7CisgICAgICBtYXAzNEluZGV4VG8yMChoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+YWFJaWRJbmRleE1hcHBlZFtlbnZdLAorICAgICAgICAgICAgICAgICAgICAgTk9fSElfUkVTX0lJRF9CSU5TKTsKICAgICBpZiAocEJzRGF0YS0+ZnJlcVJlc0ljYyA9PSAyKQotICAgICAgbWFwMzRJbmRleFRvMjAgKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJY2NJbmRleE1hcHBlZFtlbnZdLCBOT19ISV9SRVNfSUNDX0JJTlMpOworICAgICAgbWFwMzRJbmRleFRvMjAoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYtPmFhSWNjSW5kZXhNYXBwZWRbZW52XSwKKyAgICAgICAgICAgICAgICAgICAgIE5PX0hJX1JFU19JQ0NfQklOUyk7CiAKICAgICAvKiBJUEQvT1BEIGlzIGRpc2FibGVkIGluIGJhc2VsaW5lIHZlcnNpb24gYW5kIHRodXMgd2FzIHJlbW92ZWQgaGVyZSAqLwogICB9CkBAIC00MjQsNyArNDMwLDYgQEAKICAgcmV0dXJuICgxKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAKQEAgLTQzMyw2MiArNDM4LDYwIEBACiAgIFxyZXR1cm4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVuc2lnbmVkIGludAotUmVhZFBzRGF0YSAoSEFORExFX1BTX0RFQyBoX3BzX2QsICAgICAgICAgIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBQU19ERUMgKi8KLSAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLwotICAgICAgICAgICAgaW50IG5CaXRzTGVmdCAgICAgICAgICAgICAgICAgIC8qITwgbWF4IG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSAqLwotICAgICAgICAgICApCi17Cit1bnNpZ25lZCBpbnQgUmVhZFBzRGF0YSgKKyAgICBIQU5ETEVfUFNfREVDIGhfcHNfZCwgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgUFNfREVDICovCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwgLyohPCBoYW5kbGUgdG8gc3RydWN0IEJJVF9CVUYgKi8KKyAgICBpbnQgbkJpdHNMZWZ0ICAgICAgICAgICAgICAgICAvKiE8IG1heCBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgKi8KKykgewogICBNUEVHX1BTX0JTX0RBVEEgKnBCc0RhdGE7CiAKLSAgVUNIQVIgICAgIGdyLCBlbnY7Ci0gIFNDSEFSICAgICBkdEZsYWc7Ci0gIElOVCAgICAgICBzdGFydGJpdHM7Ci0gIEh1ZmZtYW4gICBDdXJyZW50VGFibGU7Ci0gIFNDSEFSICAgICBiRW5hYmxlSGVhZGVyOworICBVQ0hBUiBnciwgZW52OworICBTQ0hBUiBkdEZsYWc7CisgIElOVCBzdGFydGJpdHM7CisgIEh1ZmZtYW4gQ3VycmVudFRhYmxlOworICBTQ0hBUiBiRW5hYmxlSGVhZGVyOwogCi0gIGlmICghaF9wc19kKQotICAgIHJldHVybiAwOworICBpZiAoIWhfcHNfZCkgcmV0dXJuIDA7CiAKICAgcEJzRGF0YSA9ICZoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPmJzUmVhZFNsb3RdLm1wZWc7CiAKICAgaWYgKGhfcHNfZC0+YnNSZWFkU2xvdCAhPSBoX3BzX2QtPmJzTGFzdFNsb3QpIHsKICAgICAvKiBDb3B5IGxhc3QgaGVhZGVyIGRhdGEgKi8KLSAgICBGREttZW1jcHkocEJzRGF0YSwgJmhfcHNfZC0+YnNEYXRhW2hfcHNfZC0+YnNMYXN0U2xvdF0ubXBlZywgc2l6ZW9mKE1QRUdfUFNfQlNfREFUQSkpOworICAgIEZES21lbWNweShwQnNEYXRhLCAmaF9wc19kLT5ic0RhdGFbaF9wc19kLT5ic0xhc3RTbG90XS5tcGVnLAorICAgICAgICAgICAgICBzaXplb2YoTVBFR19QU19CU19EQVRBKSk7CiAgIH0KIAorICBzdGFydGJpdHMgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQml0QnVmKTsKIAotICBzdGFydGJpdHMgPSAoSU5UKSBGREtnZXRWYWxpZEJpdHMoaEJpdEJ1Zik7Ci0KLSAgYkVuYWJsZUhlYWRlciA9IChTQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOworICBiRW5hYmxlSGVhZGVyID0gKFNDSEFSKUZES3JlYWRCaXRzKGhCaXRCdWYsIDEpOwogCiAgIC8qIFJlYWQgaGVhZGVyICovCiAgIGlmIChiRW5hYmxlSGVhZGVyKSB7CiAgICAgcEJzRGF0YS0+YlBzSGVhZGVyVmFsaWQgPSAxOwotICAgIHBCc0RhdGEtPmJFbmFibGVJaWQgPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAxKTsKKyAgICBwQnNEYXRhLT5iRW5hYmxlSWlkID0gKFVDSEFSKUZES3JlYWRCaXRzKGhCaXRCdWYsIDEpOwogICAgIGlmIChwQnNEYXRhLT5iRW5hYmxlSWlkKSB7Ci0gICAgICBwQnNEYXRhLT5tb2RlSWlkID0gKFVDSEFSKSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMyk7CisgICAgICBwQnNEYXRhLT5tb2RlSWlkID0gKFVDSEFSKUZES3JlYWRCaXRzKGhCaXRCdWYsIDMpOwogICAgIH0KIAotICAgIHBCc0RhdGEtPmJFbmFibGVJY2MgPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAxKTsKKyAgICBwQnNEYXRhLT5iRW5hYmxlSWNjID0gKFVDSEFSKUZES3JlYWRCaXRzKGhCaXRCdWYsIDEpOwogICAgIGlmIChwQnNEYXRhLT5iRW5hYmxlSWNjKSB7Ci0gICAgICBwQnNEYXRhLT5tb2RlSWNjID0gKFVDSEFSKSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMyk7CisgICAgICBwQnNEYXRhLT5tb2RlSWNjID0gKFVDSEFSKUZES3JlYWRCaXRzKGhCaXRCdWYsIDMpOwogICAgIH0KIAotICAgIHBCc0RhdGEtPmJFbmFibGVFeHQgPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAxKTsKKyAgICBwQnNEYXRhLT5iRW5hYmxlRXh0ID0gKFVDSEFSKUZES3JlYWRCaXRzKGhCaXRCdWYsIDEpOwogICB9CiAKLSAgcEJzRGF0YS0+YkZyYW1lQ2xhc3MgPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAxKTsKKyAgcEJzRGF0YS0+YkZyYW1lQ2xhc3MgPSAoVUNIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMSk7CiAgIGlmIChwQnNEYXRhLT5iRnJhbWVDbGFzcyA9PSAwKSB7CiAgICAgLyogRklYX0JPUkRFUlMgTm9FbnY9MCwxLDIsNCAqLwotICAgIHBCc0RhdGEtPm5vRW52ID0gRkRLX3NickRlY29kZXJfYUZpeE5vRW52RGVjb2RlWyhVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDIpXTsKKyAgICBwQnNEYXRhLT5ub0VudiA9CisgICAgICAgIEZES19zYnJEZWNvZGVyX2FGaXhOb0VudkRlY29kZVsoVUNIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMildOwogICAgIC8qIGFsbCBhZGRpdGlvbmFsIGhhbmRsaW5nIG9mIGVudiBib3JkZXJzIGlzIG5vdyBpbiBEZWNvZGVQcygpICovCi0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgLyogVkFSX0JPUkRFUlMgTm9FbnY9MSwyLDMsNCAqLwotICAgIHBCc0RhdGEtPm5vRW52ID0gMSsoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAyKTsKLSAgICBmb3IgKGVudj0xOyBlbnY8cEJzRGF0YS0+bm9FbnYrMTsgZW52KyspCi0gICAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudl0gPSAoKFVDSEFSKSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgNSkpICsgMTsKKyAgICBwQnNEYXRhLT5ub0VudiA9IDEgKyAoVUNIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMik7CisgICAgZm9yIChlbnYgPSAxOyBlbnYgPCBwQnNEYXRhLT5ub0VudiArIDE7IGVudisrKQorICAgICAgcEJzRGF0YS0+YUVudlN0YXJ0U3RvcFtlbnZdID0gKChVQ0hBUilGREtyZWFkQml0cyhoQml0QnVmLCA1KSkgKyAxOwogICAgIC8qIGFsbCBhZGRpdGlvbmFsIGhhbmRsaW5nIG9mIGVudiBib3JkZXJzIGlzIG5vdyBpbiBEZWNvZGVQcygpICovCiAgIH0KIApAQCAtNDk3LDc3ICs1MDAsNzIgQEAKICAgICAvKiBubyB1c2VmdWwgUFMgZGF0YSBjb3VsZCBiZSByZWFkIGZyb20gYml0c3RyZWFtICovCiAgICAgaF9wc19kLT5iUHNEYXRhQXZhaWxbaF9wc19kLT5ic1JlYWRTbG90XSA9IHBwdF9ub25lOwogICAgIC8qIGRpc2NhcmQgYWxsIHJlbWFpbmluZyBiaXRzICovCi0gICAgbkJpdHNMZWZ0IC09IHN0YXJ0Yml0cyAtIEZES2dldFZhbGlkQml0cyhoQml0QnVmKTsKLSAgICB3aGlsZSAobkJpdHNMZWZ0KSB7CisgICAgbkJpdHNMZWZ0IC09IHN0YXJ0Yml0cyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCaXRCdWYpOworICAgIHdoaWxlIChuQml0c0xlZnQgPiAwKSB7CiAgICAgICBpbnQgaSA9IG5CaXRzTGVmdDsKLSAgICAgIGlmIChpPjgpIHsKKyAgICAgIGlmIChpID4gOCkgewogICAgICAgICBpID0gODsKICAgICAgIH0KLSAgICAgIEZES3JlYWRCaXRzIChoQml0QnVmLCBpKTsKKyAgICAgIEZES3JlYWRCaXRzKGhCaXRCdWYsIGkpOwogICAgICAgbkJpdHNMZWZ0IC09IGk7CiAgICAgfQotICAgIHJldHVybiAoc3RhcnRiaXRzIC0gRkRLZ2V0VmFsaWRCaXRzKGhCaXRCdWYpKTsKKyAgICByZXR1cm4gKFVJTlQpKHN0YXJ0Yml0cyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCaXRCdWYpKTsKICAgfQogCi0gIGlmIChwQnNEYXRhLT5tb2RlSWlkID4gMil7Ci0gICAgcEJzRGF0YS0+ZnJlcVJlc0lpZCA9IHBCc0RhdGEtPm1vZGVJaWQtMzsKKyAgaWYgKHBCc0RhdGEtPm1vZGVJaWQgPiAyKSB7CisgICAgcEJzRGF0YS0+ZnJlcVJlc0lpZCA9IHBCc0RhdGEtPm1vZGVJaWQgLSAzOwogICAgIHBCc0RhdGEtPmJGaW5lSWlkUSA9IDE7Ci0gIH0KLSAgZWxzZXsKKyAgfSBlbHNlIHsKICAgICBwQnNEYXRhLT5mcmVxUmVzSWlkID0gcEJzRGF0YS0+bW9kZUlpZDsKICAgICBwQnNEYXRhLT5iRmluZUlpZFEgPSAwOwogICB9CiAKLSAgaWYgKHBCc0RhdGEtPm1vZGVJY2MgPiAyKXsKLSAgICBwQnNEYXRhLT5mcmVxUmVzSWNjID0gcEJzRGF0YS0+bW9kZUljYy0zOwotICB9Ci0gIGVsc2V7CisgIGlmIChwQnNEYXRhLT5tb2RlSWNjID4gMikgeworICAgIHBCc0RhdGEtPmZyZXFSZXNJY2MgPSBwQnNEYXRhLT5tb2RlSWNjIC0gMzsKKyAgfSBlbHNlIHsKICAgICBwQnNEYXRhLT5mcmVxUmVzSWNjID0gcEJzRGF0YS0+bW9kZUljYzsKICAgfQogCi0KICAgLyogRXh0cmFjdCBJSUQgZGF0YSAqLwogICBpZiAocEJzRGF0YS0+YkVuYWJsZUlpZCkgewotICAgIGZvciAoZW52PTA7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKLSAgICAgIGR0RmxhZyA9IChTQ0hBUilGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMSk7Ci0gICAgICBpZiAoIWR0RmxhZykKLSAgICAgIHsKKyAgICBmb3IgKGVudiA9IDA7IGVudiA8IHBCc0RhdGEtPm5vRW52OyBlbnYrKykgeworICAgICAgZHRGbGFnID0gKFNDSEFSKUZES3JlYWRCaXRzKGhCaXRCdWYsIDEpOworICAgICAgaWYgKCFkdEZsYWcpIHsKICAgICAgICAgaWYgKHBCc0RhdGEtPmJGaW5lSWlkUSkKICAgICAgICAgICBDdXJyZW50VGFibGUgPSAoSHVmZm1hbikmYUJvb2tQc0lpZEZpbmVGcmVxRGVjb2RlOwogICAgICAgICBlbHNlCiAgICAgICAgICAgQ3VycmVudFRhYmxlID0gKEh1ZmZtYW4pJmFCb29rUHNJaWRGcmVxRGVjb2RlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHBCc0RhdGEtPmJGaW5lSWlkUSkKLSAgICAgICAgIEN1cnJlbnRUYWJsZSA9IChIdWZmbWFuKSZhQm9va1BzSWlkRmluZVRpbWVEZWNvZGU7CisgICAgICAgICAgQ3VycmVudFRhYmxlID0gKEh1ZmZtYW4pJmFCb29rUHNJaWRGaW5lVGltZURlY29kZTsKICAgICAgICAgZWxzZQogICAgICAgICAgIEN1cnJlbnRUYWJsZSA9IChIdWZmbWFuKSZhQm9va1BzSWlkVGltZURlY29kZTsKICAgICAgIH0KIAogICAgICAgZm9yIChnciA9IDA7IGdyIDwgRkRLX3NickRlY29kZXJfYU5vSWlkQmluc1twQnNEYXRhLT5mcmVxUmVzSWlkXTsgZ3IrKykKLSAgICAgICAgcEJzRGF0YS0+YWFJaWRJbmRleFtlbnZdW2dyXSA9IGRlY29kZV9odWZmX2N3KEN1cnJlbnRUYWJsZSxoQml0QnVmLE5VTEwpOworICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W2Vudl1bZ3JdID0KKyAgICAgICAgICAgIGRlY29kZV9odWZmX2N3KEN1cnJlbnRUYWJsZSwgaEJpdEJ1ZiwgTlVMTCk7CiAgICAgICBwQnNEYXRhLT5hYklpZER0RmxhZ1tlbnZdID0gZHRGbGFnOwogICAgIH0KICAgfQogCiAgIC8qIEV4dHJhY3QgSUNDIGRhdGEgKi8KICAgaWYgKHBCc0RhdGEtPmJFbmFibGVJY2MpIHsKLSAgICBmb3IgKGVudj0wOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSB7Ci0gICAgICBkdEZsYWcgPSAoU0NIQVIpRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOworICAgIGZvciAoZW52ID0gMDsgZW52IDwgcEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CisgICAgICBkdEZsYWcgPSAoU0NIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMSk7CiAgICAgICBpZiAoIWR0RmxhZykKICAgICAgICAgQ3VycmVudFRhYmxlID0gKEh1ZmZtYW4pJmFCb29rUHNJY2NGcmVxRGVjb2RlOwogICAgICAgZWxzZQogICAgICAgICBDdXJyZW50VGFibGUgPSAoSHVmZm1hbikmYUJvb2tQc0ljY1RpbWVEZWNvZGU7CiAKICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IEZES19zYnJEZWNvZGVyX2FOb0ljY0JpbnNbcEJzRGF0YS0+ZnJlcVJlc0ljY107IGdyKyspCi0gICAgICAgIHBCc0RhdGEtPmFhSWNjSW5kZXhbZW52XVtncl0gPSBkZWNvZGVfaHVmZl9jdyhDdXJyZW50VGFibGUsaEJpdEJ1ZixOVUxMKTsKKyAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtlbnZdW2dyXSA9CisgICAgICAgICAgICBkZWNvZGVfaHVmZl9jdyhDdXJyZW50VGFibGUsIGhCaXRCdWYsIE5VTEwpOwogICAgICAgcEJzRGF0YS0+YWJJY2NEdEZsYWdbZW52XSA9IGR0RmxhZzsKICAgICB9CiAgIH0KIAogICBpZiAocEJzRGF0YS0+YkVuYWJsZUV4dCkgewotCiAgICAgLyohCiAgICAgRGVjb2RlcnMgdGhhdCBzdXBwb3J0IG9ubHkgdGhlIGJhc2VsaW5lIHZlcnNpb24gb2YgdGhlIFBTIHRvb2wgYXJlIGFsbG93ZWQKICAgICB0byBpZ25vcmUgdGhlIElQRC9PUEQgZGF0YSwgYnV0IGFjY29yZGluZyBoZWFkZXIgZGF0YSBoYXMgdG8gYmUgcGFyc2VkLgpAQCAtNTc1LDE5ICs1NzMsMTQgQEAKICAgICAqLwogCiAgICAgaW50IGNudCA9IEZES3JlYWRCaXRzKGhCaXRCdWYsIFBTX0VYVEVOU0lPTl9TSVpFX0JJVFMpOwotICAgIGlmIChjbnQgPT0gKDE8PFBTX0VYVEVOU0lPTl9TSVpFX0JJVFMpLTEpIHsKKyAgICBpZiAoY250ID09ICgxIDw8IFBTX0VYVEVOU0lPTl9TSVpFX0JJVFMpIC0gMSkgewogICAgICAgY250ICs9IEZES3JlYWRCaXRzKGhCaXRCdWYsIFBTX0VYVEVOU0lPTl9FU0NfQ09VTlRfQklUUyk7CiAgICAgfQotICAgIHdoaWxlIChjbnQtLSkKLSAgICAgIEZES3JlYWRCaXRzKGhCaXRCdWYsIDgpOworICAgIHdoaWxlIChjbnQtLSkgRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgOCk7CiAgIH0KIAotCiAgIC8qIG5ldyBQUyBkYXRhIHdhcyByZWFkIGZyb20gYml0c3RyZWFtICovCiAgIGhfcHNfZC0+YlBzRGF0YUF2YWlsW2hfcHNfZC0+YnNSZWFkU2xvdF0gPSBwcHRfbXBlZzsKIAotCi0KLSAgcmV0dXJuIChzdGFydGJpdHMgLSBGREtnZXRWYWxpZEJpdHMoaEJpdEJ1ZikpOworICByZXR1cm4gKHN0YXJ0Yml0cyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCaXRCdWYpKTsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9wc2JpdGRlYy5oIGIvbGliU0JSZGVjL3NyYy9wc2JpdGRlYy5oCmluZGV4IGEyZDRkNmMuLmYwZmM0M2EgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvcHNiaXRkZWMuaAorKysgYi9saWJTQlJkZWMvc3JjL3BzYml0ZGVjLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjUgKzkwLDI3IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmbmRlZiBfX1BTQklUREVDX0gKLSNkZWZpbmUgX19QU0JJVERFQ19ICisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBTQklUREVDX0gKKyNkZWZpbmUgUFNCSVRERUNfSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogCi0KICNpbmNsdWRlICJwc2RlYy5oIgogCit1bnNpZ25lZCBpbnQgUmVhZFBzRGF0YShzdHJ1Y3QgUFNfREVDICpoX3BzX2QsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQml0c0xlZnQpOwogCi11bnNpZ25lZCBpbnQKLVJlYWRQc0RhdGEgKHN0cnVjdCBQU19ERUMgICpoX3BzX2QsCi0gICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzLAotICAgICAgICAgICAgaW50IG5CaXRzTGVmdCk7CitpbnQgRGVjb2RlUHMoc3RydWN0IFBTX0RFQyAqaF9wc19kLCBjb25zdCBVQ0hBUiBmcmFtZUVycm9yLAorICAgICAgICAgICAgIFBTX0RFQ19DT0VGRklDSUVOVFMgKnBDb2VmKTsKIAotaW50Ci1EZWNvZGVQcyhzdHJ1Y3QgUFNfREVDICpoX3BzX2QsCi0gICAgICAgICBjb25zdCBVQ0hBUiAgICBmcmFtZUVycm9yKTsKLQotCi0jZW5kaWYgLyogX19QU0JJVERFQ19IICovCisjZW5kaWYgLyogUFNCSVRERUNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9wc2RlYy5jcHAgYi9saWJTQlJkZWMvc3JjL3BzZGVjLmNwcAppbmRleCA5NjU5MTdhLi4xM2EyMWJmIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3BzZGVjLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL3BzZGVjLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxOSArOTAsMjQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyICAKKyAgXGJyaWVmICBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyCiAqLwogCiAjaW5jbHVkZSAicHNkZWMuaCIKIAotCi0KICNpbmNsdWRlICJGREtfYml0YnVmZmVyLmgiCi0jaW5jbHVkZSAicHNkZWNfaHlicmlkLmgiCiAKICNpbmNsdWRlICJzYnJfcm9tLmgiCiAjaW5jbHVkZSAic2JyX3JhbS5oIgpAQCAtMTAyLDMwICsxMTgsMTcgQEAKIAogI2luY2x1ZGUgIkZES190cmlnRmN0cy5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICBNTFFVQUwgREVGSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAjZGVmaW5lIEZSQUNUX1pFUk8gRlJBQ1RfQklUUy0xCisjZGVmaW5lIEZSQUNUX1pFUk8gRlJBQ1RfQklUUyAtIDEKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotU0JSX0VSUk9SIFJlc2V0UHNEZWMoIEhBTkRMRV9QU19ERUMgaF9wc19kICk7Ci0KLXZvaWQgUmVzZXRQc0RlQ29yKCBIQU5ETEVfUFNfREVDIGhfcHNfZCApOwotCitTQlJfRVJST1IgUmVzZXRQc0RlYyhIQU5ETEVfUFNfREVDIGhfcHNfZCk7CiAKIC8qKioqKiBIRUxQRVJTICoqKioqLwogCi1zdGF0aWMgdm9pZCBhc3NpZ25UaW1lU2xvdHNQUyAoRklYUF9EQkwgKmJ1ZkFkciwgRklYUF9EQkwgKipidWZQdHIsIGNvbnN0IGludCBudW1TbG90cywgY29uc3QgaW50IG51bUNoYW4pOwotCi0KLQotLyoqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRElWMyBGTDJGWENPTlNUX0RCTCgxLmYvMy5mKSAgICAgLyogZGl2aXNpb24gMy4wICovCi0jZGVmaW5lIERJVjFfNSBGTDJGWENPTlNUX0RCTCgyLmYvMy5mKSAgIC8qIGRpdmlzaW9uIDEuNSAqLwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgQ3JlYXRlcyBvbmUgaW5zdGFuY2Ugb2YgdGhlIFBTX0RFQyBzdHJ1Y3QKQEAgLTEzMywyMCArMTM2LDE2IEBACiAgIFxyZXR1cm4gRXJyb3IgaW5mbwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1DcmVhdGVQc0RlYyggSEFORExFX1BTX0RFQyAqaF9QU19ERUMsICAgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KLSAgICAgICAgICAgICBpbnQgYWFjU2FtcGxlc1BlckZyYW1lCi0gICAgICAgICAgICkKLXsKK2ludCBDcmVhdGVQc0RlYyhIQU5ETEVfUFNfREVDICpoX1BTX0RFQywgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBpbnQgYWFjU2FtcGxlc1BlckZyYW1lKSB7CiAgIFNCUl9FUlJPUiBlcnJvckluZm8gPSBTQlJERUNfT0s7Ci0gIEhBTkRMRV9QU19ERUMgIGhfcHNfZDsKKyAgSEFORExFX1BTX0RFQyBoX3BzX2Q7CiAgIGludCBpOwogCiAgIGlmICgqaF9QU19ERUMgPT0gTlVMTCkgewogICAgIC8qIEdldCBwcyBkZWMgcmFtICovCiAgICAgaF9wc19kID0gR2V0UmFtX3BzX2RlYygpOwogICAgIGlmIChoX3BzX2QgPT0gTlVMTCkgewotICAgICAgZXJyb3JJbmZvID0gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogICB9IGVsc2UgewpAQCAtMTU0LDUyICsxNTMsNjEgQEAKICAgICBoX3BzX2QgPSAqaF9QU19ERUM7CiAgIH0KIAotICAgLyogaW5pdGlhbGlzYXRpb24gKi8KKyAgLyoKKyAgICogQ3JlYXRlIEFuYWx5c2lzIEh5YnJpZCBmaWx0ZXJiYW5rLgorICAgKi8KKyAgRkRLaHlicmlkQW5hbHlzaXNPcGVuKCZoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWRBbmFseXNpcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBIeWJyaWRBbmFTdGF0ZXNMRmRteCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wSHlicmlkQW5hU3RhdGVzTEZkbXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7CisKKyAgLyogaW5pdGlhbGlzYXRpb24gKi8KICAgc3dpdGNoIChhYWNTYW1wbGVzUGVyRnJhbWUpIHsKLSAgY2FzZSA5NjA6Ci0gICAgaF9wc19kLT5ub1N1YlNhbXBsZXMgPSAzMDsgICAgICAgICAgICAgIC8qIGNvbCAqLwotICAgIGJyZWFrOwotICBjYXNlIDEwMjQ6Ci0gICAgaF9wc19kLT5ub1N1YlNhbXBsZXMgPSAzMjsgICAgICAgICAgICAgIC8qIGNvbCAqLwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGhfcHNfZC0+bm9TdWJTYW1wbGVzID0gLTE7Ci0gICAgYnJlYWs7CisgICAgY2FzZSA5NjA6CisgICAgICBoX3BzX2QtPm5vU3ViU2FtcGxlcyA9IDMwOyAvKiBjb2wgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTAyNDoKKyAgICAgIGhfcHNfZC0+bm9TdWJTYW1wbGVzID0gMzI7IC8qIGNvbCAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGhfcHNfZC0+bm9TdWJTYW1wbGVzID0gLTE7CisgICAgICBicmVhazsKICAgfQogCi0gIGlmIChoX3BzX2QtPm5vU3ViU2FtcGxlcyA+ICBNQVhfTlVNX0NPTAotICAgfHwgaF9wc19kLT5ub1N1YlNhbXBsZXMgPD0gMCkKLSAgeworICBpZiAoaF9wc19kLT5ub1N1YlNhbXBsZXMgPiBNQVhfTlVNX0NPTCB8fCBoX3BzX2QtPm5vU3ViU2FtcGxlcyA8PSAwKSB7CiAgICAgZ290byBiYWlsOwogICB9Ci0gIGhfcHNfZC0+bm9DaGFubmVscyAgID0gTk9fUU1GX0NIQU5ORUxTOyAgIC8qIHJvdyAqLworICBoX3BzX2QtPm5vQ2hhbm5lbHMgPSBOT19RTUZfQ0hBTk5FTFM7IC8qIHJvdyAqLwogCi0gIGhfcHNfZC0+cHNEZWNvZGVkUHJ2ICAgPSAgMDsKKyAgaF9wc19kLT5wc0RlY29kZWRQcnYgPSAwOwogICBoX3BzX2QtPnByb2NGcmFtZUJhc2VkID0gLTE7Ci0gIGZvciAoaSA9IDA7IGkgPCAoMSkrMTsgaSsrKSB7Ci0gICAgaF9wc19kLT5iUHNEYXRhQXZhaWxbaV0gID0gIHBwdF9ub25lOworICBmb3IgKGkgPSAwOyBpIDwgKDEpICsgMTsgaSsrKSB7CisgICAgaF9wc19kLT5iUHNEYXRhQXZhaWxbaV0gPSBwcHRfbm9uZTsKKyAgfQorICB7CisgICAgaW50IGVycm9yOworICAgIGVycm9yID0gRkRLZGVjb3JyZWxhdGVPcGVuKCYoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYXBEZWNvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuZGVjb3JyQnVmZmVyQ3BseCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiAqICgoODI1KSArICgzNzMpKSkpOworICAgIGlmIChlcnJvcikgZ290byBiYWlsOwogICB9CiAKLQotICBmb3IgKGkgPSAwOyBpIDwgKDEpKzE7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgKDEpICsgMTsgaSsrKSB7CiAgICAgRkRLbWVtY2xlYXIoJmhfcHNfZC0+YnNEYXRhW2ldLm1wZWcsIHNpemVvZihNUEVHX1BTX0JTX0RBVEEpKTsKICAgfQogCi0gIGVycm9ySW5mbyA9IFJlc2V0UHNEZWMoIGhfcHNfZCApOworICBlcnJvckluZm8gPSBSZXNldFBzRGVjKGhfcHNfZCk7CiAKLSAgaWYgKCBlcnJvckluZm8gIT0gU0JSREVDX09LICkKLSAgICBnb3RvIGJhaWw7Ci0KLSAgUmVzZXRQc0RlQ29yKCBoX3BzX2QgKTsKKyAgaWYgKGVycm9ySW5mbyAhPSBTQlJERUNfT0spIGdvdG8gYmFpbDsKIAogICAqaF9QU19ERUMgPSBoX3BzX2Q7CiAKLQotCiAgIHJldHVybiAwOwogCiBiYWlsOgotICBEZWxldGVQc0RlYygmaF9wc19kKTsKKyAgaWYgKGhfcHNfZCAhPSBOVUxMKSB7CisgICAgRGVsZXRlUHNEZWMoJmhfcHNfZCk7CisgIH0KIAogICByZXR1cm4gLTE7CiB9IC8qRU5EIENyZWF0ZVBzRGVjICovCkBAIC0yMTEsMTcgKzIxOSwxOSBAQAogICBccmV0dXJuIEVycm9yIGluZm8KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotRGVsZXRlUHNEZWMoIEhBTkRMRV9QU19ERUMgKmhfUFNfREVDKSAgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KK2ludCBEZWxldGVQc0RlYyhIQU5ETEVfUFNfREVDICpoX1BTX0RFQykgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KIHsKICAgaWYgKCpoX1BTX0RFQyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKKyAgeworICAgIEhBTkRMRV9QU19ERUMgaF9wc19kID0gKmhfUFNfREVDOworICAgIEZES2RlY29ycmVsYXRlQ2xvc2UoJihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hcERlY29yKSk7CisgIH0KIAogICBGcmVlUmFtX3BzX2RlYyhoX1BTX0RFQyk7CiAKLQogICByZXR1cm4gMDsKIH0gLypFTkQgRGVsZXRlUHNEZWMgKi8KIApAQCAtMjMyLDgyNSArMjQyLDE3OSBAQAogICBccmV0dXJuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1TQlJfRVJST1IgUmVzZXRQc0RlYyggSEFORExFX1BTX0RFQyBoX3BzX2QgKSAgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KK1NCUl9FUlJPUiBSZXNldFBzRGVjKEhBTkRMRV9QU19ERUMgaF9wc19kKSAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLwogewogICBTQlJfRVJST1IgZXJyb3JJbmZvID0gU0JSREVDX09LOwogICBJTlQgaTsKIAotICBjb25zdCBVQ0hBUiBub1FtZkJhbmRzSW5IeWJyaWQyMCA9IDM7Ci0gIC8qIGNvbnN0IFVDSEFSIG5vUW1mQmFuZHNJbkh5YnJpZDM0ID0gNTsgKi8KKyAgLyogZXhwbGljaXRseSBpbml0IHN0YXRlIHZhcmlhYmxlcyB0byBzYWZlIHZhbHVlcyAodW50aWwgZmlyc3QgcHMgaGVhZGVyCisgICAqIGFycml2ZXMpICovCiAKLSAgY29uc3QgVUNIQVIgYUh5YnJpZFJlc29sdXRpb24yMFtdID0geyBIWUJSSURfOF9DUExYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhZQlJJRF8yX1JFQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFlCUklEXzJfUkVBTCB9OworICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5sYXN0VXNiID0gMDsKIAotICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5kZWxheUJ1ZkluZGV4ICAgPSAwOworICAvKgorICAgKiBJbml0aWFsaXplIEFuYWx5c2lzIEh5YnJpZCBmaWx0ZXJiYW5rLgorICAgKi8KKyAgRkRLaHlicmlkQW5hbHlzaXNJbml0KCZoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWRBbmFseXNpcywgVEhSRUVfVE9fVEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgTk9fUU1GX0JBTkRTX0hZQlJJRDIwLCBOT19RTUZfQkFORFNfSFlCUklEMjAsIDEpOwogCi0gIC8qIGV4cGxpY2l0bHkgaW5pdCBzdGF0ZSB2YXJpYWJsZXMgdG8gc2FmZSB2YWx1ZXMgKHVudGlsIGZpcnN0IHBzIGhlYWRlciBhcnJpdmVzKSAqLwotCi0gIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmxhc3RVc2IgICAgICAgID0gIDA7Ci0KLSAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuc2NhbGVGYWN0b3JQc0RlbGF5QnVmZmVyID0gLShERlJBQ1RfQklUUy0xKTsKLQotICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hRGVsYXlCdWZJbmRleERlbGF5UW1mLCAoTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCKSpzaXplb2YoVUNIQVIpKTsKLSAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubm9TYW1wbGVEZWxheSA9IGRlbGF5SW5kZXhRbWZbMF07Ci0KLSAgZm9yIChpPTAgOyBpIDwgTk9fU0VSSUFMX0FMTFBBU1NfTElOS1M7IGkrKykgewotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFEZWxheVJCdWZJbmRleFNlcltpXSA9IDA7CisgIC8qCisgICAqIEluaXRpYWxpemUgU3ludGhlc2lzIEh5YnJpZCBmaWx0ZXJiYW5rLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIEZES2h5YnJpZFN5bnRoZXNpc0luaXQoJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZFN5bnRoZXNpc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUkVFX1RPX1RFTiwgTk9fUU1GX0NIQU5ORUxTLCBOT19RTUZfQ0hBTk5FTFMpOworICB9CisgIHsKKyAgICBJTlQgZXJyb3I7CisgICAgZXJyb3IgPSBGREtkZWNvcnJlbGF0ZUluaXQoJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFwRGVjb3IsIDcxLCBERUNPUlJfUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFVDS0VSX0FVVE9NQVRJQywgMCwgMCwgMCwgMCwgMSwgLyogaXNMZWdhY3lQUyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIGlmIChlcnJvcikgcmV0dXJuIFNCUkRFQ19OT1RfSU5JVElBTElaRUQ7CiAgIH0KIAotICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZbMF0gPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYVFtZkRlbGF5QnVmUmVhbDsKLQotICBhc3NpZ25UaW1lU2xvdHNQUyAoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZlswXSArIChOT19RTUZfQ0hBTk5FTFMtRklSU1RfREVMQVlfU0IpLAotICAgICAgICAgICAgICAgICAgICAgJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZlsxXSwKLSAgICAgICAgICAgICAgICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5ub1NhbXBsZURlbGF5LTEsCi0gICAgICAgICAgICAgICAgICAgICAgKE5PX0RFTEFZX0JVRkZFUl9CQU5EUy1GSVJTVF9ERUxBWV9TQikpOwotCi0gIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYUltYWdEZWxheUJ1ZmZlclFtZlswXSA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUW1mRGVsYXlCdWZJbWFnOwotCi0gIGFzc2lnblRpbWVTbG90c1BTICggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mWzBdICsgKE5PX1FNRl9DSEFOTkVMUy1GSVJTVF9ERUxBWV9TQiksCi0gICAgICAgICAgICAgICAgICAgICAmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mWzFdLAotICAgICAgICAgICAgICAgICAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLm5vU2FtcGxlRGVsYXktMSwKLSAgICAgICAgICAgICAgICAgICAgICAoTk9fREVMQVlfQlVGRkVSX0JBTkRTLUZJUlNUX0RFTEFZX1NCKSk7Ci0KLSAgLyogSHlicmlkIEZpbHRlciBCYW5rIDEgY3JlYXRpb24uICovCi0gIGVycm9ySW5mbyA9IEluaXRIeWJyaWRGaWx0ZXJCYW5rICggJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9wc19kLT5ub1N1YlNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vUW1mQmFuZHNJbkh5YnJpZDIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHlicmlkUmVzb2x1dGlvbjIwICk7Ci0KLSAgZm9yICggaSA9IDA7IGkgPCBOT19JSURfR1JPVVBTOyBpKysgKQotICB7CisgIGZvciAoaSA9IDA7IGkgPCBOT19JSURfR1JPVVBTOyBpKyspIHsKICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMTFyUHJldltpXSA9IEZMMkZYQ09OU1RfREJMKDAuNWYpOwogICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgxMnJQcmV2W2ldID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CiAgIH0KIAotICBGREttZW1jbGVhciggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIxclByZXYsIHNpemVvZiggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIxclByZXYgKSApOwotICBGREttZW1jbGVhciggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIyclByZXYsIHNpemVvZiggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIyclByZXYgKSApOworICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjFyUHJldiwKKyAgICAgICAgICAgICAgc2l6ZW9mKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMXJQcmV2KSk7CisgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMnJQcmV2LAorICAgICAgICAgICAgICBzaXplb2YoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIyclByZXYpKTsKIAogICByZXR1cm4gZXJyb3JJbmZvOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCi0gIFxicmllZiAgY2xlYXIgc29tZSBidWZmZXJzIHVzZWQgaW4gZGVjb3JyZWxhdGlvbiBwcm9jZXNzCi0KKyAgXGJyaWVmICBGZWVkIGRlbGF5bGluZXMgd2hlbiBwYXJhbWV0cmljIHN0ZXJlbyBpcyBzd2l0Y2hlZCBvbi4KICAgXHJldHVybgotCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBSZXNldFBzRGVDb3IoIEhBTkRMRV9QU19ERUMgaF9wc19kICkgIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCi17Ci0gIElOVCBpOwordm9pZCBQcmVwYXJlUHNQcm9jZXNzaW5nKEhBTkRMRV9QU19ERUMgaF9wc19kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAqY29uc3QgckludEJ1ZmZlckxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICpjb25zdCBpSW50QnVmZmVyTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JMb3dCYW5kKSB7CisgIGlmIChoX3BzX2QtPnByb2NGcmFtZUJhc2VkID09CisgICAgICAxKSAvKiBJZiB3ZSBoYXZlIHN3aXRjaGVkIGZyb20gZnJhbWUgdG8gc2xvdCBiYXNlZCBwcm9jZXNzaW5nICAqLworICB7ICAgICAgLyogZmlsbCBoeWJyaWQgZGVsYXkgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaSwgajsKIAotICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUGVha0RlY2F5RmFzdEJpbiwgTk9fTUlEX1JFU19CSU5TKnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldk5yZ0JpbiwgTk9fTUlEX1JFU19CSU5TKnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldlBlYWtEaWZmQmluLCBOT19NSURfUkVTX0JJTlMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQb3dlclByZXZTY2FsLCBOT19NSURfUkVTX0JJTlMqc2l6ZW9mKFNDSEFSKSk7CisgICAgZm9yIChpID0gMDsgaSA8IEhZQlJJRF9GSUxURVJfREVMQVk7IGkrKykgeworICAgICAgRklYUF9EQkwgcW1mSW5wdXREYXRhWzJdW05PX1FNRl9CQU5EU19IWUJSSUQyMF07CisgICAgICBGSVhQX0RCTCBoeWJyaWRPdXRwdXREYXRhWzJdW05PX1NVQl9RTUZfQ0hBTk5FTFNdOwogCi0gIGZvciAoaT0wIDsgaSA8IEZJUlNUX0RFTEFZX1NCIDsgaSsrKSB7Ci0gICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIH0KLSAgZm9yIChpPTAgOyBpIDwgTk9fU1VCX1FNRl9DSEFOTkVMUyA7IGkrKykgewotICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTKnNpemVvZihGSVhQX0RCTCkpOwotICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTKnNpemVvZihGSVhQX0RCTCkpOwotICB9Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIHNsb3QgYmFzZWQgZnVuY2lvbiBwcm90b3R5cGVzICovCi0KLXN0YXRpYyB2b2lkIGRlQ29ycmVsYXRlU2xvdEJhc2VkKCBIQU5ETEVfUFNfREVDIGhfcHNfZCwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkUmVhbExlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1IeWJyaWRJbWFnTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgc2ZfbUh5YnJpZExlZnQsCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqckludEJ1ZmZlckxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKmlJbnRCdWZmZXJMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICBzZl9JbnRCdWZmZXIsCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbUh5YnJpZFJlYWxSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbUh5YnJpZEltYWdSaWdodCwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpySW50QnVmZmVyUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKmlJbnRCdWZmZXJSaWdodCApOwotCi1zdGF0aWMgdm9pZCBhcHBseVNsb3RCYXNlZFJvdGF0aW9uKCBIQU5ETEVfUFNfREVDIGhfcHNfZCwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICptSHlicmlkUmVhbExlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRJbWFnTGVmdCwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpRbWZMZWZ0UmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUW1mTGVmdEltYWcsCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZFJlYWxSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZEltYWdSaWdodCwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpRbWZSaWdodFJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZlJpZ2h0SW1hZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIQotICBcYnJpZWYgIEdldCBzY2FsZSBmYWN0b3IgZm9yIGFsbCBwcyBkZWxheSBidWZmZXIuCi0KLSAgXHJldHVybgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi1pbnQgZ2V0U2NhbGVGYWN0b3JQc1N0YXRlc0J1ZmZlcihIQU5ETEVfUFNfREVDICAgaF9wc19kKQotewotICBJTlQgaTsKLSAgaW50IHNjYWxlID0gREZSQUNUX0JJVFMtMTsKLQotICBmb3IgKGk9MDsgaTxOT19RTUZfQkFORFNfSFlCUklEMjA7IGkrKykgewotICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkLm1RbWZCdWZmZXJSZWFsU2xvdFtpXSwgTk9fU1VCX1FNRl9DSEFOTkVMUykpOwotICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkLm1RbWZCdWZmZXJJbWFnU2xvdFtpXSwgTk9fU1VCX1FNRl9DSEFOTkVMUykpOwotICB9Ci0KLSAgZm9yIChpPTA7IGk8Tk9fU0FNUExFX0RFTEFZX0FMTFBBU1M7IGkrKykgewotICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFSZWFsRGVsYXlCdWZmZXJRbWZbaV0sIEZJUlNUX0RFTEFZX1NCKSk7Ci0gICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYUltYWdEZWxheUJ1ZmZlclFtZltpXSwgRklSU1RfREVMQVlfU0IpKTsKLSAgfQotCi0gIGZvciAoaT0wOyBpPE5PX1NBTVBMRV9ERUxBWV9BTExQQVNTOyBpKyspIHsKLSAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUmVhbERlbGF5QnVmZmVyU3ViUW1mW2ldLCBOT19TVUJfUU1GX0NIQU5ORUxTKSk7Ci0gICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYUltYWdEZWxheUJ1ZmZlclN1YlFtZltpXSwgTk9fU1VCX1FNRl9DSEFOTkVMUykpOwotICB9Ci0KLSAgZm9yIChpPTA7IGk8RklSU1RfREVMQVlfU0I7IGkrKykgewotICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMpKTsKLSAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTKSk7Ci0gIH0KLQotICBmb3IgKGk9MDsgaTxOT19TVUJfUU1GX0NIQU5ORUxTOyBpKyspIHsKLSAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTKSk7Ci0gICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUykpOwotICB9Ci0KLSAgZm9yIChpPTA7IGk8TUFYX0RFTEFZX0JVRkZFUl9TSVpFOyBpKyspCi0gIHsKLSAgICBJTlQgbGVuOwotICAgIGlmIChpPT0wKQotICAgICAgbGVuID0gTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCOwotICAgIGVsc2UKLSAgICAgIGxlbiA9IE5PX0RFTEFZX0JVRkZFUl9CQU5EUy1GSVJTVF9ERUxBWV9TQjsKLQotICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mW2ldLCBsZW4pKTsKLSAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYUltYWdEZWxheUJ1ZmZlclFtZltpXSwgbGVuKSk7Ci0gIH0KLQotICByZXR1cm4gKHNjYWxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIQotICBcYnJpZWYgIFJlc2NhbGUgYWxsIHBzIGRlbGF5IGJ1ZmZlci4KLQotICBccmV0dXJuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMKLXZvaWQgc2NhbGVQc1N0YXRlc0J1ZmZlcihIQU5ETEVfUFNfREVDIGhfcHNfZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIHNjYWxlKQotewotICBJTlQgaTsKLQotICBpZiAoc2NhbGUgPCAwKQotICAgIHNjYWxlID0gZml4TWF4KChJTlQpc2NhbGUsKElOVCktKERGUkFDVF9CSVRTLTEpKTsKLSAgZWxzZQotICAgIHNjYWxlID0gZml4TWluKChJTlQpc2NhbGUsKElOVClERlJBQ1RfQklUUy0xKTsKLQotICBmb3IgKGk9MDsgaTxOT19RTUZfQkFORFNfSFlCUklEMjA7IGkrKykgewotICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQubVFtZkJ1ZmZlclJlYWxTbG90W2ldLCBOT19TVUJfUU1GX0NIQU5ORUxTLCBzY2FsZSApOwotICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQubVFtZkJ1ZmZlckltYWdTbG90W2ldLCBOT19TVUJfUU1GX0NIQU5ORUxTLCBzY2FsZSApOwotICB9Ci0KLSAgZm9yIChpPTA7IGk8Tk9fU0FNUExFX0RFTEFZX0FMTFBBU1M7IGkrKykgewotICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYVJlYWxEZWxheUJ1ZmZlclFtZltpXSwgRklSU1RfREVMQVlfU0IsIHNjYWxlICk7Ci0gICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhSW1hZ0RlbGF5QnVmZmVyUW1mW2ldLCBGSVJTVF9ERUxBWV9TQiwgc2NhbGUgKTsKLSAgfQotCi0gIGZvciAoaT0wOyBpPE5PX1NBTVBMRV9ERUxBWV9BTExQQVNTOyBpKyspIHsKLSAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFSZWFsRGVsYXlCdWZmZXJTdWJRbWZbaV0sIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIHNjYWxlICk7Ci0gICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhSW1hZ0RlbGF5QnVmZmVyU3ViUW1mW2ldLCBOT19TVUJfUU1GX0NIQU5ORUxTLCBzY2FsZSApOwotICB9Ci0KLSAgZm9yIChpPTA7IGk8RklSU1RfREVMQVlfU0I7IGkrKykgewotICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUywgc2NhbGUgKTsKLSAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMsIHNjYWxlICk7Ci0gIH0KLQotICBmb3IgKGk9MDsgaTxOT19TVUJfUU1GX0NIQU5ORUxTOyBpKyspIHsKLSAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMsIHNjYWxlICk7Ci0gICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTLCBzY2FsZSApOwotICB9Ci0KLSAgZm9yIChpPTA7IGk8TUFYX0RFTEFZX0JVRkZFUl9TSVpFOyBpKyspIHsKLSAgICBJTlQgbGVuOwotICAgIGlmIChpPT0wKQotICAgICAgbGVuID0gTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCOwotICAgIGVsc2UKLSAgICAgIGxlbiA9IE5PX0RFTEFZX0JVRkZFUl9CQU5EUy1GSVJTVF9ERUxBWV9TQjsKLQotICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZbaV0sIGxlbiwgc2NhbGUgKTsKLSAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mW2ldLCBsZW4sIHNjYWxlICk7Ci0gIH0KLQotICBzY2FsZSA8PD0gMTsKLQotICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVBlYWtEZWNheUZhc3RCaW4sIE5PX01JRF9SRVNfQklOUywgc2NhbGUgKTsKLSAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2UGVha0RpZmZCaW4sIE5PX01JRF9SRVNfQklOUywgc2NhbGUgKTsKLSAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2TnJnQmluLCBOT19NSURfUkVTX0JJTlMsIHNjYWxlICk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiEKLSAgXGJyaWVmICBTY2FsZSBpbnB1dCBjaGFubmVsIHRvIHRoZSBzYW1lIHNjYWxlZmFjdG9yIGFuZCByZXNjYWxlIGh5YnJpZAotICAgICAgICAgIGZpbHRlcmJhbmsgdmFsdWVzCi0KLSAgXHJldHVybgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIHNjYWxGaWx0ZXJCYW5rVmFsdWVzKCBIQU5ETEVfUFNfREVDICAgaF9wc19kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqKmZpeHBRbWZSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqKmZpeHBRbWZJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxzYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdExvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAqc2NhbGVGYWN0b3JMb3dCYW5kX2xiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgKnNjYWxlRmFjdG9yTG93QmFuZF9oYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICpzY2FsZUZhY3RvckhpZ2hCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgIG5vQ29scwotICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgSU5UIG1heFNjYWw7Ci0KLSAgSU5UIGk7Ci0KLSAgc2NhbGVGYWN0b3JIaWdoQmFuZHMgICAgICAgID0gIC1zY2FsZUZhY3RvckhpZ2hCYW5kczsKLSAgc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRMb3cgID0gIC1zY2FsZUZhY3Rvckxvd0JhbmRTcGxpdExvdzsKLSAgc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRIaWdoID0gIC1zY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2g7Ci0KLSAgLyogZ2V0IG1heCBzY2FsZSBmYWN0b3IgKi8KLSAgbWF4U2NhbCA9IGZpeE1heChzY2FsZUZhY3RvckhpZ2hCYW5kcyxmaXhNYXgoc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRMb3csIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaCApKTsKLQotICB7Ci0gICAgaW50IGhlYWRyb29tICA9IGdldFNjYWxlRmFjdG9yUHNTdGF0ZXNCdWZmZXIoaF9wc19kKTsKLSAgICBtYXhTY2FsICAgPSBmaXhNYXgobWF4U2NhbCwoSU5UKShoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5zY2FsZUZhY3RvclBzRGVsYXlCdWZmZXItaGVhZHJvb20pKTsKLSAgICBtYXhTY2FsICArPSAxOwotICB9Ci0KLSAgLyogc2NhbGUgd2hvbGUgbGVmdCBjaGFubmVsIHRvIHRoZSBzYW1lIHNjYWxlIGZhY3RvciAqLwotCi0gIC8qIGxvdyBiYW5kICggb3ZlcmxhcCBidWZmZXIgKSAqLwotICBpZiAoIG1heFNjYWwgIT0gc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRMb3cgKSB7Ci0gICAgSU5UIHNjYWxlID0gc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRMb3cgLSBtYXhTY2FsOwotICAgIGZvciAoIGk9MDsgaTwoNik7IGkrKyApIHsKLSAgICAgIHNjYWxlVmFsdWVzKCBmaXhwUW1mUmVhbFtpXSwgbHNiLCBzY2FsZSApOwotICAgICAgc2NhbGVWYWx1ZXMoIGZpeHBRbWZJbWFnW2ldLCBsc2IsIHNjYWxlICk7Ci0gICAgfQotICB9Ci0gIC8qIGxvdyBiYW5kICggY3VycmVudCBmcmFtZSApICovCi0gIGlmICggbWF4U2NhbCAhPSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2ggKSB7Ci0gICAgSU5UIHNjYWxlID0gc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRIaWdoIC0gbWF4U2NhbDsKLSAgICAvKiBmb3IgKCBpPSg2KTsgaTwoNikrTUFYX05VTV9DT0w7IGkrKyApIHsgKi8KLSAgICBmb3IgKCBpPSg2KTsgaTwoNikrbm9Db2xzOyBpKysgKSB7Ci0gICAgICBzY2FsZVZhbHVlcyggZml4cFFtZlJlYWxbaV0sIGxzYiwgc2NhbGUgKTsKLSAgICAgIHNjYWxlVmFsdWVzKCBmaXhwUW1mSW1hZ1tpXSwgbHNiLCBzY2FsZSApOwotICAgIH0KLSAgfQotICAvKiBoaWdoIGJhbmQgKi8KLSAgaWYgKCBtYXhTY2FsICE9IHNjYWxlRmFjdG9ySGlnaEJhbmRzICkgewotICAgIElOVCBzY2FsZSA9IHNjYWxlRmFjdG9ySGlnaEJhbmRzIC0gbWF4U2NhbDsKLSAgICAvKiBmb3IgKCBpPTA7IGk8TUFYX05VTV9DT0w7IGkrKyApIHsgKi8KLSAgICBmb3IgKCBpPTA7IGk8bm9Db2xzOyBpKysgKSB7Ci0gICAgICBzY2FsZVZhbHVlcyggJmZpeHBRbWZSZWFsW2ldW2xzYl0sICg2NCktbHNiLCBzY2FsZSApOwotICAgICAgc2NhbGVWYWx1ZXMoICZmaXhwUW1mSW1hZ1tpXVtsc2JdLCAoNjQpLWxzYiwgc2NhbGUgKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIG1heFNjYWwgIT0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuc2NhbGVGYWN0b3JQc0RlbGF5QnVmZmVyICkKLSAgICBzY2FsZVBzU3RhdGVzQnVmZmVyKGhfcHNfZCwoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuc2NhbGVGYWN0b3JQc0RlbGF5QnVmZmVyLW1heFNjYWwpKTsKLQotICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQuc2ZfbVFtZkJ1ZmZlciA9IG1heFNjYWw7Ci0gIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnNjYWxlRmFjdG9yUHNEZWxheUJ1ZmZlciA9IG1heFNjYWw7Ci0KLSAgKnNjYWxlRmFjdG9ySGlnaEJhbmQgKz0gbWF4U2NhbCAtIHNjYWxlRmFjdG9ySGlnaEJhbmRzOwotCi0gIGhfcHNfZC0+cmVzY2FsID0gbWF4U2NhbCAtIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaDsKLSAgaF9wc19kLT5zZl9JbnRCdWZmZXIgPSBtYXhTY2FsOwotCi0gICpzY2FsZUZhY3Rvckxvd0JhbmRfbGIgKz0gbWF4U2NhbCAtIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0TG93OwotICAqc2NhbGVGYWN0b3JMb3dCYW5kX2hiICs9IG1heFNjYWwgLSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2g7Ci19Ci0KLXZvaWQgcmVzY2FsRmlsdGVyQmFua1ZhbHVlcyggSEFORExFX1BTX0RFQyAgIGhfcHNfZCwgICAgICAgICAgICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipRbWZCdWZmZXJSZWFsLCAgICAgICAgICAgICAgIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICoqUW1mQnVmZmVySW1hZywgICAgICAgICAgICAgICAvKiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxzYiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2JyIHN0YXJ0IHN1YmJhbmQgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICBub0NvbHMpCi17Ci0gIGludCBpOwotICAvKiBzY2FsZSBiYWNrIDYgdGltZXNsb3RzIGxvb2sgYWhlYWQgZm9yIGh5YnJpZCBmaWx0ZXJiYW5rIHRvIG9yaWdpbmFsIHZhbHVlICovCi0gIGZvciAoIGk9bm9Db2xzOyBpPG5vQ29scyArICg2KTsgaSsrICkgewotICAgIHNjYWxlVmFsdWVzKCBRbWZCdWZmZXJSZWFsW2ldLCBsc2IsIGhfcHNfZC0+cmVzY2FsICk7Ci0gICAgc2NhbGVWYWx1ZXMoIFFtZkJ1ZmZlckltYWdbaV0sIGxzYiwgaF9wc19kLT5yZXNjYWwgKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyohCi0gIFxicmllZiAgR2VuZXJhdGUgZGVjb3JyZWxhdGVkIHNpZGUgY2hhbm5lbCB1c2luZyBhbGxwYXNzL2RlbGF5Ci0KLSAgXHJldHVybgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWRlQ29ycmVsYXRlU2xvdEJhc2VkKCBIQU5ETEVfUFNfREVDIGhfcHNfZCwgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1IeWJyaWRSZWFsTGVmdCwgICAgLyohPCBsZWZ0IChtb25vKSBoeWJyaWQgdmFsdWVzIHJlYWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbUh5YnJpZEltYWdMZWZ0LCAgICAvKiE8IGxlZnQgKG1vbm8pIGh5YnJpZCB2YWx1ZXMgaW1hZyAqLwotICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICBzZl9tSHlicmlkTGVmdCwgICAgIC8qITwgc2NhbGVmYWN0b3IgZm9yIGxlZnQgKG1vbm8pIGh5YnJpZCBiYW5kcyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnJJbnRCdWZmZXJMZWZ0LCAgICAgLyohPCByZWFsIHFtZiBiYW5kcyBsZWZ0IChtb25vKSAoMzh4NjQpICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKmlJbnRCdWZmZXJMZWZ0LCAgICAgLyohPCByZWFsIHFtZiBiYW5kcyBsZWZ0IChtb25vKSAoMzh4NjQpICovCi0gICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgIHNmX0ludEJ1ZmZlciwgICAgICAgLyohPCBzY2FsZWZhY3RvciBmb3IgYWxsIGxlZnQgYW5kIHJpZ2h0IHFtZiBiYW5kcyAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbUh5YnJpZFJlYWxSaWdodCwgICAvKiE8IHJpZ2h0IChkZWNvcnJlbGF0ZWQpIGh5YnJpZCB2YWx1ZXMgcmVhbCAqLwotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkSW1hZ1JpZ2h0LCAgIC8qITwgcmlnaHQgKGRlY29ycmVsYXRlZCkgaHlicmlkIHZhbHVlcyBpbWFnICovCi0KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqckludEJ1ZmZlclJpZ2h0LCAgICAvKiE8IHJlYWwgcW1mIGJhbmRzIHJpZ2h0IChkZWNvcnJlbGF0ZWQpICgzOHg2NCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqaUludEJ1ZmZlclJpZ2h0ICkgICAvKiE8IHJlYWwgcW1mIGJhbmRzIHJpZ2h0IChkZWNvcnJlbGF0ZWQpICgzOHg2NCkgKi8KLXsKLQotICBJTlQgIGksIG0sIHNiLCBnciwgYmluOwotCi0gIEZJWFBfREJMIHBlYWtEaWZmLCBucmcsIHRyYW5zUmF0aW87Ci0KLSAgRklYUF9EQkwgKlJFU1RSSUNUIGFhTGVmdFJlYWw7Ci0gIEZJWFBfREJMICpSRVNUUklDVCBhYUxlZnRJbWFnOwotCi0gIEZJWFBfREJMICpSRVNUUklDVCBhYVJpZ2h0UmVhbDsKLSAgRklYUF9EQkwgKlJFU1RSSUNUIGFhUmlnaHRJbWFnOwotCi0gIEZJWFBfREJMICpSRVNUUklDVCBwUmVhbERlbGF5QnVmZmVyOwotICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEltYWdEZWxheUJ1ZmZlcjsKLQotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoYWFQb3dlclNsb3QsIEZJWFBfREJMLCBOT19NSURfUkVTX0JJTlMpOwotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoYWFUcmFuc1JhdGlvU2xvdCwgRklYUF9EQkwsIE5PX01JRF9SRVNfQklOUyk7Ci0KLS8qIQotPHByZT4KLSAgIHBhcmFtZXRlciBpbmRleCAgICAgICBxbWYgYmFuZHMgICAgICAgICAgICAgaHlicmlkIGJhbmRzCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAwLDcKLSAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAxLDYKLSAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAyCi0gICAgICAgICAzICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICAgSFlCUklEIEJBTkRTCi0gICAgICAgICA0ICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgOQotICAgICAgICAgNSAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgIDgKLSAgICAgICAgIDYgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDEwCi0gICAgICAgICA3ICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAxMQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICA4ICAgICAgICAgICAgICAgICAgIDMKLSAgICAgICAgIDkgICAgICAgICAgICAgICAgICAgNAotICAgICAgICAxMCAgICAgICAgICAgICAgICAgICA1Ci0gICAgICAgIDExICAgICAgICAgICAgICAgICAgIDYKLSAgICAgICAgMTIgICAgICAgICAgICAgICAgICAgNwotICAgICAgICAxMyAgICAgICAgICAgICAgICAgICA4Ci0gICAgICAgIDE0ICAgICAgICAgICAgICAgICAgIDksMTAgICAgICAoMiApICAgICAgICAgICAgICAgICAgICAgIFFNRiBCQU5EUwotICAgICAgICAxNSAgICAgICAgICAgICAgICAgICAxMSAtIDEzICAgKDMgKQotICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAxNCAtIDE3ICAgKDQgKQotICAgICAgICAxNyAgICAgICAgICAgICAgICAgICAxOCAtIDIyICAgKDUgKQotICAgICAgICAxOCAgICAgICAgICAgICAgICAgICAyMyAtIDM0ICAgKDEyKQotICAgICAgICAxOSAgICAgICAgICAgICAgICAgICAzNSAtIDYzICAgKDI5KQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi08L3ByZT4KLSovCi0KLSAgI2RlZmluZSBGTFRSX1NDQUxFIDMKLQotICAvKiBoeWJyaWQgYmFuZHMgKHBhcmFtZXRlciBpbmRleCAwIC0gNykgKi8KLSAgYWFMZWZ0UmVhbCAgPSBtSHlicmlkUmVhbExlZnQ7Ci0gIGFhTGVmdEltYWcgID0gbUh5YnJpZEltYWdMZWZ0OwotCi0gIGFhUG93ZXJTbG90WzBdID0gKCBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzBdLCAgYWFMZWZ0UmVhbFswXSksICBhYUxlZnRJbWFnWzBdLCAgYWFMZWZ0SW1hZ1swXSApID4+IEZMVFJfU0NBTEUgKSArCi0gICAgICAgICAgICAgICAgICAgKCBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzddLCAgYWFMZWZ0UmVhbFs3XSksICBhYUxlZnRJbWFnWzddLCAgYWFMZWZ0SW1hZ1s3XSApID4+IEZMVFJfU0NBTEUgKTsKLQotICBhYVBvd2VyU2xvdFsxXSA9ICggZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFsxXSwgIGFhTGVmdFJlYWxbMV0pLCAgYWFMZWZ0SW1hZ1sxXSwgIGFhTGVmdEltYWdbMV0gKSA+PiBGTFRSX1NDQUxFICkgKwotICAgICAgICAgICAgICAgICAgICggZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFs2XSwgIGFhTGVmdFJlYWxbNl0pLCAgYWFMZWZ0SW1hZ1s2XSwgIGFhTGVmdEltYWdbNl0gKSA+PiBGTFRSX1NDQUxFICk7Ci0KLSAgYWFQb3dlclNsb3RbMl0gPSAgIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbMl0sICBhYUxlZnRSZWFsWzJdKSwgIGFhTGVmdEltYWdbMl0sICBhYUxlZnRJbWFnWzJdICkgPj4gRkxUUl9TQ0FMRTsKLSAgYWFQb3dlclNsb3RbM10gPSAgIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbM10sICBhYUxlZnRSZWFsWzNdKSwgIGFhTGVmdEltYWdbM10sICBhYUxlZnRJbWFnWzNdICkgPj4gRkxUUl9TQ0FMRTsKLQotICBhYVBvd2VyU2xvdFs0XSA9ICAgZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFs5XSwgIGFhTGVmdFJlYWxbOV0pLCAgYWFMZWZ0SW1hZ1s5XSwgIGFhTGVmdEltYWdbOV0gKSA+PiBGTFRSX1NDQUxFOwotICBhYVBvd2VyU2xvdFs1XSA9ICAgZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFs4XSwgIGFhTGVmdFJlYWxbOF0pLCAgYWFMZWZ0SW1hZ1s4XSwgIGFhTGVmdEltYWdbOF0gKSA+PiBGTFRSX1NDQUxFOwotCi0gIGFhUG93ZXJTbG90WzZdID0gICBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzEwXSwgYWFMZWZ0UmVhbFsxMF0pLCBhYUxlZnRJbWFnWzEwXSwgYWFMZWZ0SW1hZ1sxMF0gKSA+PiBGTFRSX1NDQUxFOwotICBhYVBvd2VyU2xvdFs3XSA9ICAgZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFsxMV0sIGFhTGVmdFJlYWxbMTFdKSwgYWFMZWZ0SW1hZ1sxMV0sIGFhTGVmdEltYWdbMTFdICkgPj4gRkxUUl9TQ0FMRTsKLQotICAvKiBxbWYgYmFuZHMgKHBhcmFtZXRlciBpbmRleCA4IC0gMTkpICovCi0gIGZvciAoIGJpbiA9IDg7IGJpbiA8IE5PX01JRF9SRVNfQklOUzsgYmluKysgKSB7Ci0gICAgRklYUF9EQkwgc2xvdE5yZyA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0KLSAgICBmb3IgKCBpID0gZ3JvdXBCb3JkZXJzMjBbYmluKzJdOyBpIDwgZ3JvdXBCb3JkZXJzMjBbYmluKzNdOyBpKysgKSB7ICAvKiBtYXggbG9vcHM6IDI5ICovCi0gICAgICBzbG90TnJnICs9IGZNdWx0QWRkRGl2MiAoIGZNdWx0RGl2MihySW50QnVmZmVyTGVmdFtpXSwgckludEJ1ZmZlckxlZnRbaV0pLCBpSW50QnVmZmVyTGVmdFtpXSwgaUludEJ1ZmZlckxlZnRbaV0pID4+IEZMVFJfU0NBTEU7Ci0gICAgfQotICAgIGFhUG93ZXJTbG90W2Jpbl0gPSBzbG90TnJnOwotCi0gIH0KLQotCi0gIC8qIGNhbGN1bGF0aW9uIG9mIHRyYW5zaWVudCByYXRpbyAqLwotICBmb3IgKGJpbj0wOyBiaW4gPCBOT19NSURfUkVTX0JJTlM7IGJpbisrKSB7ICAgLyogbm9CaW5zID0gMjAgKCBCQVNFTElORV9QUyApICovCi0KLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUGVha0RlY2F5RmFzdEJpbltiaW5dID0gZk11bHQoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluW2Jpbl0sIFBFQUtfREVDQVlfRkFDVE9SICk7Ci0KLSAgICBpZiAoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVBlYWtEZWNheUZhc3RCaW5bYmluXSA8IGFhUG93ZXJTbG90W2Jpbl0pIHsKLSAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluW2Jpbl0gPSBhYVBvd2VyU2xvdFtiaW5dOwotICAgIH0KLQotICAgIC8qIGNhbGN1bGF0ZSBQU21vb3RoUGVha0RlY2F5RGlmZk5yZyAqLwotICAgIHBlYWtEaWZmID0gZk11bHRBZGQgKCAoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZQZWFrRGlmZkJpbltiaW5dPj4xKSwKLSAgICAgICAgICAgICAgICAgSU5UX0ZJTFRFUl9DT0VGRiwgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVBlYWtEZWNheUZhc3RCaW5bYmluXSAtIGFhUG93ZXJTbG90W2Jpbl0gLSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldlBlYWtEaWZmQmluW2Jpbl0pOwotCi0gICAgLyogc2F2ZSBwZWFrRGlmZiBmb3IgdGhlIG5leHQgZnJhbWUgKi8KLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldlBlYWtEaWZmQmluW2Jpbl0gPSBwZWFrRGlmZjsKLQotICAgIG5yZyA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2TnJnQmluW2Jpbl0gKyBmTXVsdCggSU5UX0ZJTFRFUl9DT0VGRiwgYWFQb3dlclNsb3RbYmluXSAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2TnJnQmluW2Jpbl0gKTsKLQotICAgIC8qIE5lZ2F0aXZlIGVuZXJnaWVzIGRvbid0IGV4aXN0LiBCdXQgc29tZXRpbWVzIHRoZXkgYXBwZWFyIGR1ZSB0byByb3VuZGluZy4gKi8KLQotICAgIG5yZyA9IGZpeE1heChucmcsRkwyRlhDT05TVF9EQkwoMC5mKSk7Ci0KLSAgICAvKiBzYXZlIG5yZyBmb3IgdGhlIG5leHQgZnJhbWUgKi8KLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldk5yZ0JpbltiaW5dID0gbnJnOwotCi0gICAgbnJnID0gZk11bHQoIG5yZywgVFJBTlNJRU5UX0lNUEFDVF9GQUNUT1IgKTsKLQotICAgIC8qIHNhdmUgdHJhbnNpZW50IGltcGFjdCBmYWN0b3IgKi8KLSAgICBpZiAoIHBlYWtEaWZmIDw9IG5yZyB8fCBwZWFrRGlmZiA9PSBGTDJGWENPTlNUX0RCTCgwLjApICkgewotICAgICAgYWFUcmFuc1JhdGlvU2xvdFtiaW5dID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLyogRkwyRlhDT05TVF9EQkwoMS4wZikqLzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG5yZyA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKLSAgICAgICAgYWFUcmFuc1JhdGlvU2xvdFtiaW5dID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIHNjYWxlIHRvIGRlbm9taW5hdG9yICovCi0gICAgICBJTlQgc2NhbGVfbGVmdCA9IGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MocGVha0RpZmYpIC0gMSk7Ci0gICAgICBhYVRyYW5zUmF0aW9TbG90W2Jpbl0gPSBzY2h1cl9kaXYoIG5yZzw8c2NhbGVfbGVmdCwgcGVha0RpZmY8PHNjYWxlX2xlZnQsIDE2KTsKLSAgICB9Ci0gIH0gLyogYmluICovCi0KLQotCi0KLSAgI2RlZmluZSBERUxBWV9HUk9VUF9PRkZTRVQgICAgMjAKLSAgI2RlZmluZSBOUl9PRl9ERUxBWV9HUk9VUFMgICAgIDIKLQotICBGSVhQX0RCTCByVG1wLCBpVG1wLCByVG1wMCwgaVRtcDAsIHJSMCwgaVIwOwotCi0gIElOVCBUZW1wRGVsYXkgICAgID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuZGVsYXlCdWZJbmRleDsgIC8qIHNldCBkZWxheSBpbmRpY2VzICovCi0KLSAgcFJlYWxEZWxheUJ1ZmZlciA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUmVhbERlbGF5QnVmZmVyU3ViUW1mW1RlbXBEZWxheV07Ci0gIHBJbWFnRGVsYXlCdWZmZXIgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYUltYWdEZWxheUJ1ZmZlclN1YlFtZltUZW1wRGVsYXldOwotCi0gIGFhTGVmdFJlYWwgID0gbUh5YnJpZFJlYWxMZWZ0OwotICBhYUxlZnRJbWFnICA9IG1IeWJyaWRJbWFnTGVmdDsKLSAgYWFSaWdodFJlYWwgPSBtSHlicmlkUmVhbFJpZ2h0OwotICBhYVJpZ2h0SW1hZyA9IG1IeWJyaWRJbWFnUmlnaHQ7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogSUNDIGdyb3VwcyA6ICAwIC0gIDkgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBnciA9IElDQyBncm91cHMgKi8KLSAgZm9yIChncj0wOyBnciA8IFNVQlFNRl9HUk9VUFM7IGdyKyspIHsKLQotICAgIHRyYW5zUmF0aW8gPSBhYVRyYW5zUmF0aW9TbG90W2JpbnMyZ3JvdXBNYXAyMFtncl1dOwotCi0gICAgLyogc2IgPSBzdWJRTUYvUU1GIHN1YmJhbmQgKi8KLSAgICBzYiA9IGdyb3VwQm9yZGVyczIwW2dyXTsKLQotICAgIC8qIFVwZGF0ZSBkZWxheSBidWZmZXJzLCBzYW1wbGUgZGVsYXkgYWxscGFzcyA9IDIgKi8KLSAgICByVG1wMCA9IHBSZWFsRGVsYXlCdWZmZXJbc2JdOwotICAgIGlUbXAwID0gcEltYWdEZWxheUJ1ZmZlcltzYl07Ci0KLSAgICBwUmVhbERlbGF5QnVmZmVyW3NiXSA9IGFhTGVmdFJlYWxbc2JdOwotICAgIHBJbWFnRGVsYXlCdWZmZXJbc2JdID0gYWFMZWZ0SW1hZ1tzYl07Ci0KLSAgICAvKiBkZWxheSBieSBmcmFjdGlvbiAqLwotICAgIGNwbHhNdWx0RGl2MigmclIwLCAmaVIwLCByVG1wMCwgaVRtcDAsIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yUmVTdWJRbWYyMFtzYl0sIGFhRnJhY3REZWxheVBoYXNlRmFjdG9ySW1TdWJRbWYyMFtzYl0pOwotICAgIHJSMDw8PTE7Ci0gICAgaVIwPDw9MTsKLQotICAgIEZJWFBfREJMICpwQWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZiA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWZbc2JdOwotICAgIEZJWFBfREJMICpwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclN1YlFtZiA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWZbc2JdOwotCi0gICAgZm9yIChtPTA7IG08Tk9fU0VSSUFMX0FMTFBBU1NfTElOS1MgOyBtKyspIHsKLQotICAgICAgSU5UIHRtcERlbGF5UlNlciA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFEZWxheVJCdWZJbmRleFNlclttXTsKLQotICAgICAgLyogZ2V0IGRlbGF5ZWQgdmFsdWVzIGZyb20gYWNjb3JkaW5nIGJ1ZmZlciA6IG0oMCk9MzsgbSgxKT00OyBtKDIpPTU7ICovCi0gICAgICByVG1wMCA9IHBBYWFSZWFsRGVsYXlSQnVmZmVyU2VyU3ViUW1mW3RtcERlbGF5UlNlcl07Ci0gICAgICBpVG1wMCA9IHBBYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mW3RtcERlbGF5UlNlcl07Ci0KLSAgICAgIC8qIGRlbGF5IGJ5IGZyYWN0aW9uICovCi0gICAgICBjcGx4TXVsdERpdjIoJnJUbXAsICZpVG1wLCByVG1wMCwgaVRtcDAsIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VyUmVTdWJRbWYyMFtzYl1bbV0sIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VySW1TdWJRbWYyMFtzYl1bbV0pOwotCi0gICAgICByVG1wID0gKHJUbXAgLSBmTXVsdERpdjIoYUFsbHBhc3NMaW5rRGVjYXlTZXJbbV0sIHJSMCkpIDw8IDE7Ci0gICAgICBpVG1wID0gKGlUbXAgLSBmTXVsdERpdjIoYUFsbHBhc3NMaW5rRGVjYXlTZXJbbV0sIGlSMCkpIDw8IDE7Ci0KLSAgICAgIHBBYWFSZWFsRGVsYXlSQnVmZmVyU2VyU3ViUW1mW3RtcERlbGF5UlNlcl0gPSByUjAgKyBmTXVsdChhQWxscGFzc0xpbmtEZWNheVNlclttXSwgclRtcCk7Ci0gICAgICBwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclN1YlFtZlt0bXBEZWxheVJTZXJdID0gaVIwICsgZk11bHQoYUFsbHBhc3NMaW5rRGVjYXlTZXJbbV0sIGlUbXApOwotCi0gICAgICByUjAgPSByVG1wOwotICAgICAgaVIwID0gaVRtcDsKLQotICAgICAgcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWYgKz0gYUFsbHBhc3NMaW5rRGVsYXlTZXJbbV07Ci0gICAgICBwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclN1YlFtZiArPSBhQWxscGFzc0xpbmtEZWxheVNlclttXTsKLQotICAgIH0gLyogbSAqLwotCi0gICAgLyogZHVjayBpZiBhIHBhc3QgdHJhbnNpZW50IGlzIGZvdW5kICovCi0gICAgYWFSaWdodFJlYWxbc2JdID0gZk11bHQodHJhbnNSYXRpbywgclIwKTsKLSAgICBhYVJpZ2h0SW1hZ1tzYl0gPSBmTXVsdCh0cmFuc1JhdGlvLCBpUjApOwotCi0gIH0gLyogZ3IgKi8KLQotCi0gIHNjYWxlVmFsdWVzKCBtSHlicmlkUmVhbExlZnQsICBOT19TVUJfUU1GX0NIQU5ORUxTLCAtU0NBTF9IRUFEUk9PTSApOwotICBzY2FsZVZhbHVlcyggbUh5YnJpZEltYWdMZWZ0LCAgTk9fU1VCX1FNRl9DSEFOTkVMUywgLVNDQUxfSEVBRFJPT00gKTsKLSAgc2NhbGVWYWx1ZXMoIG1IeWJyaWRSZWFsUmlnaHQsIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIC1TQ0FMX0hFQURST09NICk7Ci0gIHNjYWxlVmFsdWVzKCBtSHlicmlkSW1hZ1JpZ2h0LCBOT19TVUJfUU1GX0NIQU5ORUxTLCAtU0NBTF9IRUFEUk9PTSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBhYUxlZnRSZWFsICA9IHJJbnRCdWZmZXJMZWZ0OwotICBhYUxlZnRJbWFnICA9IGlJbnRCdWZmZXJMZWZ0OwotICBhYVJpZ2h0UmVhbCA9IHJJbnRCdWZmZXJSaWdodDsKLSAgYWFSaWdodEltYWcgPSBpSW50QnVmZmVyUmlnaHQ7Ci0KLSAgcFJlYWxEZWxheUJ1ZmZlciA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUmVhbERlbGF5QnVmZmVyUW1mW1RlbXBEZWxheV07Ci0gIHBJbWFnRGVsYXlCdWZmZXIgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYUltYWdEZWxheUJ1ZmZlclFtZltUZW1wRGVsYXldOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qIElDQyBncm91cHMgOiAxMCAtIDE5ICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBnciA9IElDQyBncm91cHMgKi8KLSAgZm9yIChncj1TVUJRTUZfR1JPVVBTOyBnciA8IE5PX0lJRF9HUk9VUFMgLSBOUl9PRl9ERUxBWV9HUk9VUFM7IGdyKyspIHsKLQotICAgIHRyYW5zUmF0aW8gPSBhYVRyYW5zUmF0aW9TbG90W2JpbnMyZ3JvdXBNYXAyMFtncl1dOwotCi0gICAgLyogc2IgPSBzdWJRTUYvUU1GIHN1YmJhbmQgKi8KLSAgICBmb3IgKHNiID0gZ3JvdXBCb3JkZXJzMjBbZ3JdOyBzYiA8IGdyb3VwQm9yZGVyczIwW2dyKzFdOyBzYisrKSB7Ci0gICAgICBGSVhQX0RCTCByZXNSLCByZXNJOwotCi0gICAgICAvKiBkZWNheVNjYWxlRmFjdG9yID0gMS4wZiArIGRlY2F5X2N1dG9mZiAqIERFQ0FZX1NMT1BFIC0gREVDQVlfU0xPUEUgKiBzYjsgREVDQVlfU0xPUEUgPSAwLjA1ICovCi0gICAgICBGSVhQX0RCTCBkZWNheVNjYWxlRmFjdG9yID0gZGVjYXlTY2FsZUZhY3RUYWJsZVtzYl07Ci0KLSAgICAgIC8qIFVwZGF0ZSBkZWxheSBidWZmZXJzLCBzYW1wbGUgZGVsYXkgYWxscGFzcyA9IDIgKi8KLSAgICAgIHJUbXAwID0gcFJlYWxEZWxheUJ1ZmZlcltzYl07Ci0gICAgICBpVG1wMCA9IHBJbWFnRGVsYXlCdWZmZXJbc2JdOwotCi0gICAgICBwUmVhbERlbGF5QnVmZmVyW3NiXSA9IGFhTGVmdFJlYWxbc2JdOwotICAgICAgcEltYWdEZWxheUJ1ZmZlcltzYl0gPSBhYUxlZnRJbWFnW3NiXTsKLQotICAgICAgLyogZGVsYXkgYnkgZnJhY3Rpb24gKi8KLSAgICAgIGNwbHhNdWx0RGl2MigmclIwLCAmaVIwLCByVG1wMCwgaVRtcDAsIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yUmVRbWZbc2JdLCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvckltUW1mW3NiXSk7Ci0gICAgICByUjA8PD0xOwotICAgICAgaVIwPDw9MTsKLQotICAgICAgcmVzUiA9IGZNdWx0KGRlY2F5U2NhbGVGYWN0b3IsIHJSMCk7Ci0gICAgICByZXNJID0gZk11bHQoZGVjYXlTY2FsZUZhY3RvciwgaVIwKTsKLQotICAgICAgRklYUF9EQkwgKnBBYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZltzYl07Ci0gICAgICBGSVhQX0RCTCAqcEFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWYgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mW3NiXTsKLQotICAgICAgZm9yIChtPTA7IG08Tk9fU0VSSUFMX0FMTFBBU1NfTElOS1MgOyBtKyspIHsKLQotICAgICAgICBJTlQgdG1wRGVsYXlSU2VyID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYURlbGF5UkJ1ZkluZGV4U2VyW21dOwotCi0gICAgICAgIC8qIGdldCBkZWxheWVkIHZhbHVlcyBmcm9tIGFjY29yZGluZyBidWZmZXIgOiBtKDApPTM7IG0oMSk9NDsgbSgyKT01OyAqLwotICAgICAgICByVG1wMCA9IHBBYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW3RtcERlbGF5UlNlcl07Ci0gICAgICAgIGlUbXAwID0gcEFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbdG1wRGVsYXlSU2VyXTsKLQotICAgICAgICAvKiBkZWxheSBieSBmcmFjdGlvbiAqLwotICAgICAgICBjcGx4TXVsdERpdjIoJnJUbXAsICZpVG1wLCByVG1wMCwgaVRtcDAsIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VyUmVRbWZbc2JdW21dLCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlckltUW1mW3NiXVttXSk7Ci0KLSAgICAgICAgclRtcCA9IChyVG1wIC0gZk11bHREaXYyKGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCByZXNSKSk8PDE7Ci0gICAgICAgIGlUbXAgPSAoaVRtcCAtIGZNdWx0RGl2MihhQWxscGFzc0xpbmtEZWNheVNlclttXSwgcmVzSSkpPDwxOwotCi0gICAgICAgIHJlc1IgPSBmTXVsdChkZWNheVNjYWxlRmFjdG9yLCByVG1wKTsKLSAgICAgICAgcmVzSSA9IGZNdWx0KGRlY2F5U2NhbGVGYWN0b3IsIGlUbXApOwotCi0gICAgICAgIHBBYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW3RtcERlbGF5UlNlcl0gPSByUjAgKyBmTXVsdChhQWxscGFzc0xpbmtEZWNheVNlclttXSwgcmVzUik7Ci0gICAgICAgIHBBYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mW3RtcERlbGF5UlNlcl0gPSBpUjAgKyBmTXVsdChhQWxscGFzc0xpbmtEZWNheVNlclttXSwgcmVzSSk7Ci0KLSAgICAgICAgclIwID0gclRtcDsKLSAgICAgICAgaVIwID0gaVRtcDsKLQotICAgICAgICBwQWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZiArPSBhQWxscGFzc0xpbmtEZWxheVNlclttXTsKLSAgICAgICAgcEFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWYgKz0gYUFsbHBhc3NMaW5rRGVsYXlTZXJbbV07Ci0KLSAgICAgIH0gLyogbSAqLwotCi0gICAgICAvKiBkdWNrIGlmIGEgcGFzdCB0cmFuc2llbnQgaXMgZm91bmQgKi8KLSAgICAgIGFhUmlnaHRSZWFsW3NiXSA9IGZNdWx0KHRyYW5zUmF0aW8sIHJSMCk7Ci0gICAgICBhYVJpZ2h0SW1hZ1tzYl0gPSBmTXVsdCh0cmFuc1JhdGlvLCBpUjApOwotCi0gICAgfSAvKiBzYiAqLwotICB9IC8qIGdyICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogSUNDIGdyb3VwcyA6IDIwLCAgMjEgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGdyID0gSUNDIGdyb3VwcyAqLwotICBmb3IgKGdyPURFTEFZX0dST1VQX09GRlNFVDsgZ3IgPCBOT19JSURfR1JPVVBTOyBncisrKSB7Ci0KLSAgICBJTlQgc2JTdGFydCA9IGdyb3VwQm9yZGVyczIwW2dyXTsKLSAgICBJTlQgc2JTdG9wICA9IGdyb3VwQm9yZGVyczIwW2dyKzFdOwotCi0gICAgVUNIQVIgKnBEZWxheUJ1ZklkeCA9ICZoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hRGVsYXlCdWZJbmRleERlbGF5UW1mW3NiU3RhcnQtRklSU1RfREVMQVlfU0JdOwotCi0gICAgdHJhbnNSYXRpbyA9IGFhVHJhbnNSYXRpb1Nsb3RbYmluczJncm91cE1hcDIwW2dyXV07Ci0KLSAgICAvKiBzYiA9IHN1YlFNRi9RTUYgc3ViYmFuZCAqLwotICAgIGZvciAoc2IgPSBzYlN0YXJ0OyBzYiA8IHNiU3RvcDsgc2IrKykgewotCi0gICAgICAvKiBVcGRhdGUgZGVsYXkgYnVmZmVycyAqLwotICAgICAgclIwID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mWypwRGVsYXlCdWZJZHhdW3NiLUZJUlNUX0RFTEFZX1NCXTsKLSAgICAgIGlSMCA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYUltYWdEZWxheUJ1ZmZlclFtZlsqcERlbGF5QnVmSWR4XVtzYi1GSVJTVF9ERUxBWV9TQl07Ci0KLSAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZlsqcERlbGF5QnVmSWR4XVtzYi1GSVJTVF9ERUxBWV9TQl0gPSBhYUxlZnRSZWFsW3NiXTsKLSAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYUltYWdEZWxheUJ1ZmZlclFtZlsqcERlbGF5QnVmSWR4XVtzYi1GSVJTVF9ERUxBWV9TQl0gPSBhYUxlZnRJbWFnW3NiXTsKLQotICAgICAgLyogZHVjayBpZiBhIHBhc3QgdHJhbnNpZW50IGlzIGZvdW5kICovCi0gICAgICBhYVJpZ2h0UmVhbFtzYl0gPSBmTXVsdCh0cmFuc1JhdGlvLCByUjApOwotICAgICAgYWFSaWdodEltYWdbc2JdID0gZk11bHQodHJhbnNSYXRpbywgaVIwKTsKLQotICAgICAgaWYgKCsrKCpwRGVsYXlCdWZJZHgpID49IGRlbGF5SW5kZXhRbWZbc2JdKSB7Ci0gICAgICAgICpwRGVsYXlCdWZJZHggPSAwOwotICAgICAgfQotICAgICAgcERlbGF5QnVmSWR4Kys7Ci0KLSAgICB9IC8qIHNiICovCi0gIH0gLyogZ3IgKi8KLQotCi0gIC8qIFVwZGF0ZSBkZWxheSBidWZmZXIgaW5kZXggKi8KLSAgaWYgKCsraF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuZGVsYXlCdWZJbmRleCA+PSBOT19TQU1QTEVfREVMQVlfQUxMUEFTUykKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5kZWxheUJ1ZkluZGV4ID0gMDsKLQotICBmb3IgKG09MDsgbTxOT19TRVJJQUxfQUxMUEFTU19MSU5LUyA7IG0rKykgewotICAgIGlmICgrK2hfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFEZWxheVJCdWZJbmRleFNlclttXSA+PSBhQWxscGFzc0xpbmtEZWxheVNlclttXSkKLSAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFEZWxheVJCdWZJbmRleFNlclttXSA9IDA7Ci0gIH0KLQotCi0gIHNjYWxlVmFsdWVzKCAmckludEJ1ZmZlckxlZnRbTk9fUU1GX0JBTkRTX0hZQlJJRDIwXSwgIE5PX1FNRl9DSEFOTkVMUy1OT19RTUZfQkFORFNfSFlCUklEMjAsIC1TQ0FMX0hFQURST09NICk7Ci0gIHNjYWxlVmFsdWVzKCAmaUludEJ1ZmZlckxlZnRbTk9fUU1GX0JBTkRTX0hZQlJJRDIwXSwgIE5PX1FNRl9DSEFOTkVMUy1OT19RTUZfQkFORFNfSFlCUklEMjAsIC1TQ0FMX0hFQURST09NICk7Ci0gIHNjYWxlVmFsdWVzKCAmckludEJ1ZmZlclJpZ2h0W05PX1FNRl9CQU5EU19IWUJSSUQyMF0sIE5PX1FNRl9DSEFOTkVMUy1OT19RTUZfQkFORFNfSFlCUklEMjAsIC1TQ0FMX0hFQURST09NICk7Ci0gIHNjYWxlVmFsdWVzKCAmaUludEJ1ZmZlclJpZ2h0W05PX1FNRl9CQU5EU19IWUJSSUQyMF0sIE5PX1FNRl9DSEFOTkVMUy1OT19RTUZfQkFORFNfSFlCUklEMjAsIC1TQ0FMX0hFQURST09NICk7Ci0KLSAgLyogZnJlZSBtZW1vcnkgb24gc2NyYXRjaCAqLwotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFhVHJhbnNSYXRpb1Nsb3QsIEZJWFBfREJMLCBOT19NSURfUkVTX0JJTlMpOwotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFhUG93ZXJTbG90LCBGSVhQX0RCTCwgTk9fTUlEX1JFU19CSU5TKTsKLX0KLQotCi12b2lkIGluaXRTbG90QmFzZWRSb3RhdGlvbiggSEFORExFX1BTX0RFQyBoX3BzX2QsIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7Ci0KLSAgSU5UICAgICBncm91cCA9IDA7Ci0gIElOVCAgICAgYmluID0gIDA7Ci0gIElOVCAgICAgbm9JaWRTdGVwczsKLQotLyogIGNvbnN0IFVDSEFSICpwUXVhbnRpemVkSUlEczsqLwotCi0gIEZJWFBfU0dMICBpbnZMOwotICBGSVhQX0RCTCAgU2NhbGVMLCBTY2FsZVI7Ci0gIEZJWFBfREJMICBBbHBoYSwgQmV0YTsKLSAgRklYUF9EQkwgIGgxMXIsIGgxMnIsIGgyMXIsIGgyMnI7Ci0KLSAgY29uc3QgRklYUF9EQkwgICpQU2NhbGVGYWN0b3JzOwotCi0gIC8qIE92ZXJ3cml0ZSBvbGQgdmFsdWVzIGluIGRlbGF5IGJ1ZmZlcnMgd2hlbiB1cHBlciBzdWJiYW5kIGlzIGhpZ2hlciB0aGFuIGluIGxhc3QgZnJhbWUgKi8KLSAgaWYgKGVudiA9PSAwKSB7Ci0KLSAgICBpZiAoKHVzYiA+IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmxhc3RVc2IpICYmIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmxhc3RVc2IpIHsKLQotICAgICAgSU5UIGksayxsZW5ndGg7Ci0KLSAgICAgIGZvciAoaT1oX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5sYXN0VXNiIDsgaSA8IEZJUlNUX0RFTEFZX1NCOyBpKyspIHsKLSAgICAgICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgZm9yIChqID0gMDsgaiA8IE5PX1FNRl9CQU5EU19IWUJSSUQyMDsgaisrKSB7CisgICAgICAgIHFtZklucHV0RGF0YVswXVtqXSA9CisgICAgICAgICAgICBzY2FsZVZhbHVlKHJJbnRCdWZmZXJMZWZ0W2ldW2pdLCBzY2FsZUZhY3Rvckxvd0JhbmQpOworICAgICAgICBxbWZJbnB1dERhdGFbMV1bal0gPQorICAgICAgICAgICAgc2NhbGVWYWx1ZShpSW50QnVmZmVyTGVmdFtpXVtqXSwgc2NhbGVGYWN0b3JMb3dCYW5kKTsKICAgICAgIH0KIAotICAgICAgZm9yIChrPTAgOyBrPE5PX1NBTVBMRV9ERUxBWV9BTExQQVNTOyBrKyspIHsKLSAgICAgICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mW2tdLCBGSVJTVF9ERUxBWV9TQipzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgIH0KLSAgICAgIGxlbmd0aCA9ICh1c2ItRklSU1RfREVMQVlfU0IpKnNpemVvZihGSVhQX0RCTCk7Ci0gICAgICBpZihsZW5ndGg+MCkgewotICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZbMF0sIGxlbmd0aCk7Ci0gICAgICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYUltYWdEZWxheUJ1ZmZlclFtZlswXSwgbGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIGxlbmd0aCA9IChmaXhNaW4oTk9fREVMQVlfQlVGRkVSX0JBTkRTLChJTlQpdXNiKS1GSVJTVF9ERUxBWV9TQikqc2l6ZW9mKEZJWFBfREJMKTsKLSAgICAgIGlmKGxlbmd0aD4wKSB7Ci0gICAgICAgIGZvciAoaz0xIDsgayA8IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLm5vU2FtcGxlRGVsYXk7IGsrKykgewotICAgICAgICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZltrXSwgbGVuZ3RoKTsKLSAgICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZba10sIGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgICAgIEZES2h5YnJpZEFuYWx5c2lzQXBwbHkoJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZEFuYWx5c2lzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZJbnB1dERhdGFbMF0sIHFtZklucHV0RGF0YVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkT3V0cHV0RGF0YVswXSwgaHlicmlkT3V0cHV0RGF0YVsxXSk7CiAgICAgfQotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmxhc3RVc2IgPSB1c2I7Ci0gIH0gLyogZW52ID09IDAgKi8KKyAgICBoX3BzX2QtPnByb2NGcmFtZUJhc2VkID0gMDsgLyogc3dpdGNoIHRvIHNsb3QgYmFzZWQgcHJvY2Vzc2luZy4gKi8KIAotICBpZiAoaF9wc19kLT5ic0RhdGFbaF9wc19kLT5wcm9jZXNzU2xvdF0ubXBlZy5iRmluZUlpZFEpCi0gIHsKKyAgfSAvKiBwcm9jRnJhbWVCYXNlZD09MSAqLworfQorCit2b2lkIGluaXRTbG90QmFzZWRSb3RhdGlvbigKKyAgICBIQU5ETEVfUFNfREVDIGhfcHNfZCwgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KKyAgICBpbnQgZW52LCBpbnQgdXNiKSB7CisgIElOVCBncm91cCA9IDA7CisgIElOVCBiaW4gPSAwOworICBJTlQgbm9JaWRTdGVwczsKKworICBGSVhQX1NHTCBpbnZMOworICBGSVhQX0RCTCBTY2FsZUwsIFNjYWxlUjsKKyAgRklYUF9EQkwgQWxwaGEsIEJldGE7CisgIEZJWFBfREJMIGgxMXIsIGgxMnIsIGgyMXIsIGgyMnI7CisKKyAgY29uc3QgRklYUF9EQkwgKlBTY2FsZUZhY3RvcnM7CisKKyAgaWYgKGhfcHNfZC0+YnNEYXRhW2hfcHNfZC0+cHJvY2Vzc1Nsb3RdLm1wZWcuYkZpbmVJaWRRKSB7CiAgICAgUFNjYWxlRmFjdG9ycyA9IFNjYWxlRmFjdG9yc0ZpbmU7IC8qIHZhbHVlcyBhcmUgc2hpZnRldCByaWdodCBieSBvbmUgKi8KICAgICBub0lpZFN0ZXBzID0gTk9fSUlEX1NURVBTX0ZJTkU7Ci0gICAgLypwUXVhbnRpemVkSUlEcyA9IHF1YW50aXplZElJRHNGaW5lOyovCi0gIH0KLQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBQU2NhbGVGYWN0b3JzID0gU2NhbGVGYWN0b3JzOyAvKiB2YWx1ZXMgYXJlIHNoaWZ0ZXQgcmlnaHQgYnkgb25lICovCiAgICAgbm9JaWRTdGVwcyA9IE5PX0lJRF9TVEVQUzsKLSAgICAvKnBRdWFudGl6ZWRJSURzID0gcXVhbnRpemVkSUlEczsqLwogICB9CiAKLQogICAvKiBkZXF1YW50aXplIGFuZCBkZWNvZGUgKi8KLSAgZm9yICggZ3JvdXAgPSAwOyBncm91cCA8IE5PX0lJRF9HUk9VUFM7IGdyb3VwKysgKSB7Ci0KKyAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgTk9fSUlEX0dST1VQUzsgZ3JvdXArKykgewogICAgIGJpbiA9IGJpbnMyZ3JvdXBNYXAyMFtncm91cF07CiAKICAgICAvKiEKICAgICA8aDM+IHR5cGUgJ0EnIHJvdGF0aW9uIDwvaDM+CiAgICAgbWl4aW5nIHByb2NlZHVyZSBSX2EsIHVzZWQgaW4gYmFzZWxpbmUgdmVyc2lvbjxicj4KIAotICAgICBTY2FsZS1mYWN0b3IgdmVjdG9ycyBjMSBhbmQgYzIgYXJlIHByZWNhbGN1bGF0ZWQgaW4gaW5pdFBzVGFibGVzICgpIGFuZCBzdG9yZWQgaW4KLSAgICAgc2NhbGVGYWN0b3JzW10gYW5kIHNjYWxlRmFjdG9yc0ZpbmVbXSA9IHBTY2FsZUZhY3RvcnMgW10uCi0gICAgIEZyb20gdGhlIGxpbmVhcml6ZWQgSUlEIHBhcmFtZXRlcnMgKGludGVuc2l0eSBkaWZmZXJlbmNlcyksIHR3byBzY2FsZSBmYWN0b3JzIGFyZQorICAgICBTY2FsZS1mYWN0b3IgdmVjdG9ycyBjMSBhbmQgYzIgYXJlIHByZWNhbGN1bGF0ZWQgaW4gaW5pdFBzVGFibGVzICgpIGFuZAorICAgIHN0b3JlZCBpbiBzY2FsZUZhY3RvcnNbXSBhbmQgc2NhbGVGYWN0b3JzRmluZVtdID0gcFNjYWxlRmFjdG9ycyBbXS4gRnJvbSB0aGUKKyAgICBsaW5lYXJpemVkIElJRCBwYXJhbWV0ZXJzIChpbnRlbnNpdHkgZGlmZmVyZW5jZXMpLCB0d28gc2NhbGUgZmFjdG9ycyBhcmUKICAgICAgY2FsY3VsYXRlZC4gVGhleSBhcmUgdXNlZCB0byBvYnRhaW4gdGhlIGNvZWZmaWNpZW50cyBoMTEuLi4gaDIyLgogICAgICovCiAKICAgICAvKiBTY2FsZVIgYW5kIFNjYWxlTCBhcmUgc2NhbGVkIGJ5IDEgc2hpZnQgcmlnaHQgKi8KIAotICAgIFNjYWxlUiA9IFBTY2FsZUZhY3RvcnNbbm9JaWRTdGVwcyArIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJaWRJbmRleE1hcHBlZFtlbnZdW2Jpbl1dOwotICAgIFNjYWxlTCA9IFBTY2FsZUZhY3RvcnNbbm9JaWRTdGVwcyAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJaWRJbmRleE1hcHBlZFtlbnZdW2Jpbl1dOworICAgIFNjYWxlUiA9IFBTY2FsZUZhY3RvcnNbbm9JaWRTdGVwcyArIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+YWFJaWRJbmRleE1hcHBlZFtlbnZdW2Jpbl1dOworICAgIFNjYWxlTCA9IFBTY2FsZUZhY3RvcnNbbm9JaWRTdGVwcyAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+YWFJaWRJbmRleE1hcHBlZFtlbnZdW2Jpbl1dOwogCi0gICAgQmV0YSAgID0gZk11bHQgKGZNdWx0KCBBbHBoYXNbaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5hYUljY0luZGV4TWFwcGVkW2Vudl1bYmluXV0sICggU2NhbGVSIC0gU2NhbGVMICkpLCBGSVhQX1NRUlQwNSk7Ci0gICAgQWxwaGEgID0gQWxwaGFzW2hfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJY2NJbmRleE1hcHBlZFtlbnZdW2Jpbl1dPj4xOworICAgIEJldGEgPSBmTXVsdCgKKyAgICAgICAgZk11bHQoQWxwaGFzW2hfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5hYUljY0luZGV4TWFwcGVkW2Vudl1bYmluXV0sCisgICAgICAgICAgICAgIChTY2FsZVIgLSBTY2FsZUwpKSwKKyAgICAgICAgRklYUF9TUVJUMDUpOworICAgIEFscGhhID0KKyAgICAgICAgQWxwaGFzW2hfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5hYUljY0luZGV4TWFwcGVkW2Vudl1bYmluXV0gPj4gMTsKIAogICAgIC8qIEFscGhhIGFuZCBCZXRhIGFyZSBub3cgYm90aCBzY2FsZWQgYnkgMiBzaGlmdHMgcmlnaHQgKi8KIAotICAgIC8qIGNhbGN1bGF0ZSB0aGUgY29lZmZpY2llbnRzIGgxMS4uLiBoMjIgZnJvbSBzY2FsZS1mYWN0b3JzIGFuZCBJQ0MgcGFyYW1ldGVycyAqLworICAgIC8qIGNhbGN1bGF0ZSB0aGUgY29lZmZpY2llbnRzIGgxMS4uLiBoMjIgZnJvbSBzY2FsZS1mYWN0b3JzIGFuZCBJQ0MKKyAgICAgKiBwYXJhbWV0ZXJzICovCiAKICAgICAvKiBoIHZhbHVlcyBhcmUgc2NhbGVkIGJ5IDEgc2hpZnQgcmlnaHQgKi8KICAgICB7CiAgICAgICBGSVhQX0RCTCB0cmlnRGF0YVs0XTsKIAogICAgICAgaW5saW5lX2ZpeHBfY29zX3NpbihCZXRhICsgQWxwaGEsIEJldGEgLSBBbHBoYSwgMiwgdHJpZ0RhdGEpOwotICAgICAgaDExciA9IGZNdWx0KCBTY2FsZUwsIHRyaWdEYXRhWzBdKTsKLSAgICAgIGgxMnIgPSBmTXVsdCggU2NhbGVSLCB0cmlnRGF0YVsyXSk7Ci0gICAgICBoMjFyID0gZk11bHQoIFNjYWxlTCwgdHJpZ0RhdGFbMV0pOwotICAgICAgaDIyciA9IGZNdWx0KCBTY2FsZVIsIHRyaWdEYXRhWzNdKTsKKyAgICAgIGgxMXIgPSBmTXVsdChTY2FsZUwsIHRyaWdEYXRhWzBdKTsKKyAgICAgIGgxMnIgPSBmTXVsdChTY2FsZVIsIHRyaWdEYXRhWzJdKTsKKyAgICAgIGgyMXIgPSBmTXVsdChTY2FsZUwsIHRyaWdEYXRhWzFdKTsKKyAgICAgIGgyMnIgPSBmTXVsdChTY2FsZVIsIHRyaWdEYXRhWzNdKTsKICAgICB9CiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIEludGVycG9sYXRpb24gb2YgdGhlIG1hdHJpY2VzIEgxMS4uLiBIMjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBJbnRlcnBvbGF0aW9uIG9mIHRoZSBtYXRyaWNlcyBIMTEuLi4gSDIyOiAqLwogICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBIMTEoayxuKSA9IEgxMShrLG5bZV0pICsgKG4tbltlXSkgKiAoSDExKGssbltlKzFdIC0gSDExKGssbltlXSkpIC8gKG5bZSsxXSAtIG5bZV0pICAgICovCi0gICAgLyogLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEgxMShrLG4pID0gSDExKGssbltlXSkgKyAobi1uW2VdKSAqIChIMTEoayxuW2UrMV0gLSBIMTEoayxuW2VdKSkgLworICAgICAqIChuW2UrMV0gLSBuW2VdKSAgICAqLworICAgIC8qIC4uLiAqLwogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogICAgIC8qIGludkwgPSAxLyhsZW5ndGggb2YgZW52ZWxvcGUpICovCi0gICAgaW52TCA9IEZYX0RCTDJGWF9TR0woR2V0SW52SW50KGhfcHNfZC0+YnNEYXRhW2hfcHNfZC0+cHJvY2Vzc1Nsb3RdLm1wZWcuYUVudlN0YXJ0U3RvcFtlbnYgKyAxXSAtIGhfcHNfZC0+YnNEYXRhW2hfcHNfZC0+cHJvY2Vzc1Nsb3RdLm1wZWcuYUVudlN0YXJ0U3RvcFtlbnZdKSk7CisgICAgaW52TCA9IEZYX0RCTDJGWF9TR0woR2V0SW52SW50KAorICAgICAgICBoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPnByb2Nlc3NTbG90XS5tcGVnLmFFbnZTdGFydFN0b3BbZW52ICsgMV0gLQorICAgICAgICBoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPnByb2Nlc3NTbG90XS5tcGVnLmFFbnZTdGFydFN0b3BbZW52XSkpOwogCi0gICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTFyW2dyb3VwXSAgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMTFyUHJldltncm91cF07Ci0gICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTJyW2dyb3VwXSAgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMTJyUHJldltncm91cF07Ci0gICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMjFyW2dyb3VwXSAgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjFyUHJldltncm91cF07Ci0gICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMjJyW2dyb3VwXSAgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjJyUHJldltncm91cF07CisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYtPkgxMXJbZ3JvdXBdID0KKyAgICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDExclByZXZbZ3JvdXBdOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5IMTJyW2dyb3VwXSA9CisgICAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgxMnJQcmV2W2dyb3VwXTsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+SDIxcltncm91cF0gPQorICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjFyUHJldltncm91cF07CisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYtPkgyMnJbZ3JvdXBdID0KKyAgICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIyclByZXZbZ3JvdXBdOwogCi0gICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgxMXJbZ3JvdXBdICA9IGZNdWx0ICggaDExciAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0sIGludkwgKTsKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkRlbHRhSDEycltncm91cF0gID0gZk11bHQgKCBoMTJyIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTJyW2dyb3VwXSwgaW52TCApOwotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMjFyW2dyb3VwXSAgPSBmTXVsdCAoIGgyMXIgLSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdLCBpbnZMICk7Ci0gICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMnJbZ3JvdXBdICA9IGZNdWx0ICggaDIyciAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIycltncm91cF0sIGludkwgKTsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+RGVsdGFIMTFyW2dyb3VwXSA9CisgICAgICAgIGZNdWx0KGgxMXIgLSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+SDExcltncm91cF0sIGludkwpOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5EZWx0YUgxMnJbZ3JvdXBdID0KKyAgICAgICAgZk11bHQoaDEyciAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5IMTJyW2dyb3VwXSwgaW52TCk7CisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYtPkRlbHRhSDIxcltncm91cF0gPQorICAgICAgICBmTXVsdChoMjFyIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYtPkgyMXJbZ3JvdXBdLCBpbnZMKTsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+RGVsdGFIMjJyW2dyb3VwXSA9CisgICAgICAgIGZNdWx0KGgyMnIgLSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+SDIycltncm91cF0sIGludkwpOwogCiAgICAgLyogdXBkYXRlIHByZXYgY29lZmZpY2llbnRzIGZvciBpbnRlcnBvbGF0aW9uIGluIG5leHQgZW52ZWxvcGUgKi8KIApAQCAtMTA2Miw3OSArNDI2LDY3IEBACiAgIH0gLyogZ3JvdXAgbG9vcCAqLwogfQogCitzdGF0aWMgY29uc3QgVUNIQVIgZ3JvdXBUYWJsZVtOT19JSURfR1JPVVBTICsgMV0gPSB7CisgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwKKyAgICAxMiwgMTMsIDE0LCAxNSwgMTYsIDE4LCAyMSwgMjUsIDMwLCA0MiwgNzF9OwogCi1zdGF0aWMgdm9pZCBhcHBseVNsb3RCYXNlZFJvdGF0aW9uKCBIQU5ETEVfUFNfREVDIGhfcHNfZCwgICAgICAgIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCitzdGF0aWMgdm9pZCBhcHBseVNsb3RCYXNlZFJvdGF0aW9uKAorICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLCAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRSZWFsTGVmdCwgIC8qITwgaHlicmlkIHZhbHVlcyByZWFsIGxlZnQgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRJbWFnTGVmdCwgIC8qITwgaHlicmlkIHZhbHVlcyBpbWFnIGxlZnQgICovCisgICAgRklYUF9EQkwgKm1IeWJyaWRSZWFsTGVmdCwgLyohPCBoeWJyaWQgdmFsdWVzIHJlYWwgbGVmdCAgKi8KKyAgICBGSVhQX0RCTCAqbUh5YnJpZEltYWdMZWZ0LCAvKiE8IGh5YnJpZCB2YWx1ZXMgaW1hZyBsZWZ0ICAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZkxlZnRSZWFsLCAgICAgIC8qITwgcmVhbCBiYW5kcyBsZWZ0IHFtZiBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZkxlZnRJbWFnLCAgICAgIC8qITwgaW1hZyBiYW5kcyBsZWZ0IHFtZiBjaGFubmVsICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZFJlYWxSaWdodCwgLyohPCBoeWJyaWQgdmFsdWVzIHJlYWwgcmlnaHQgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRJbWFnUmlnaHQsIC8qITwgaHlicmlkIHZhbHVlcyBpbWFnIHJpZ2h0ICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZlJpZ2h0UmVhbCwgICAgIC8qITwgcmVhbCBiYW5kcyByaWdodCBxbWYgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpRbWZSaWdodEltYWcgICAgICAvKiE8IGltYWcgYmFuZHMgcmlnaHQgcW1mIGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICBJTlQgICAgIGdyb3VwOwotICBJTlQgICAgIHN1YmJhbmQ7Ci0KLSAgRklYUF9EQkwgKlJFU1RSSUNUIEh5YnJMZWZ0UmVhbDsKLSAgRklYUF9EQkwgKlJFU1RSSUNUIEh5YnJMZWZ0SW1hZzsKLSAgRklYUF9EQkwgKlJFU1RSSUNUIEh5YnJSaWdodFJlYWw7Ci0gIEZJWFBfREJMICpSRVNUUklDVCBIeWJyUmlnaHRJbWFnOwotCi0gIEZJWFBfREJMIHRtcExlZnQsIHRtcFJpZ2h0OwotCisgICAgRklYUF9EQkwgKm1IeWJyaWRSZWFsUmlnaHQsIC8qITwgaHlicmlkIHZhbHVlcyByZWFsIHJpZ2h0ICAqLworICAgIEZJWFBfREJMICptSHlicmlkSW1hZ1JpZ2h0ICAvKiE8IGh5YnJpZCB2YWx1ZXMgaW1hZyByaWdodCAgKi8KKykgeworICBJTlQgZ3JvdXA7CisgIElOVCBzdWJiYW5kOwogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiEKICAgPGgyPiBNYXBwaW5nIDwvaDI+CiAKLSAgVGhlIG51bWJlciBvZiBzdGVyZW8gYmFuZHMgdGhhdCBpcyBhY3R1YWxseSB1c2VkIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBhdmFpbGJsZQotICBwYXJhbWV0ZXJzIGZvciBJSUQgYW5kIElDQzoKLSAgPHByZT4KLSAgIG5yLiBvZiBJSUQgcGFyYS58IG5yLiBvZiBJQ0MgcGFyYS4gfCBuci4gb2YgU3RlcmVvIGJhbmRzCisgIFRoZSBudW1iZXIgb2Ygc3RlcmVvIGJhbmRzIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YKKyAgYXZhaWxibGUgcGFyYW1ldGVycyBmb3IgSUlEIGFuZCBJQ0M6IDxwcmU+IG5yLiBvZiBJSUQgcGFyYS58IG5yLiBvZiBJQ0MgcGFyYS4KKyAgfCBuci4gb2YgU3RlcmVvIGJhbmRzCiAgICAtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIDEwLDIwICAgICAgICAgfCAgICAgMTAsMjAgICAgICAgIHwgICAgICAgIDIwCiAgICAgIDEwLDIwICAgICAgICAgfCAgICAgMzQgICAgICAgICAgIHwgICAgICAgIDM0CiAgICAgIDM0ICAgICAgICAgICAgfCAgICAgMTAsMjAgICAgICAgIHwgICAgICAgIDM0CiAgICAgIDM0ICAgICAgICAgICAgfCAgICAgMzQgICAgICAgICAgIHwgICAgICAgIDM0CiAgIDwvcHJlPgotICBJbiB0aGUgY2FzZSB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZm9yIElJUyBhbmQgSUNDIGRpZmZlcnMgZnJvbSB0aGUgbnVtYmVyIG9mIHN0ZXJlbwotICBiYW5kcywgYSBtYXBwaW5nIGZyb20gdGhlIGxvd2VyIG51bWJlciB0byB0aGUgaGlnaGVyIG51bWJlciBvZiBwYXJhbWV0ZXJzIGlzIGFwcGxpZWQuCi0gIEluZGV4IG1hcHBpbmcgb2YgSUlEIGFuZCBJQ0MgcGFyYW1ldGVycyBpcyBhbHJlYWR5IGRvbmUgaW4gcHNiaXRkZWMuY3BwLiBGdXJ0aGVyIG1hcHBpbmcgaXMKLSAgbm90IG5lZWRlZCBoZXJlIGluIGJhc2VsaW5lIHZlcnNpb24uCisgIEluIHRoZSBjYXNlIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBmb3IgSUlTIGFuZCBJQ0MgZGlmZmVycyBmcm9tIHRoZSBudW1iZXIKKyAgb2Ygc3RlcmVvIGJhbmRzLCBhIG1hcHBpbmcgZnJvbSB0aGUgbG93ZXIgbnVtYmVyIHRvIHRoZSBoaWdoZXIgbnVtYmVyIG9mCisgIHBhcmFtZXRlcnMgaXMgYXBwbGllZC4gSW5kZXggbWFwcGluZyBvZiBJSUQgYW5kIElDQyBwYXJhbWV0ZXJzIGlzIGFscmVhZHkgZG9uZQorICBpbiBwc2JpdGRlYy5jcHAuIEZ1cnRoZXIgbWFwcGluZyBpcyBub3QgbmVlZGVkIGhlcmUgaW4gYmFzZWxpbmUgdmVyc2lvbi4KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiEKICAgPGgyPiBNaXhpbmcgPC9oMj4KIAotICBUbyBnZW5lcmF0ZSB0aGUgUU1GIHN1YmJhbmQgc2lnbmFscyBmb3IgdGhlIHN1YmJhbmQgc2FtcGxlcyBuID0gbltlXSsxICwsLCBuX1tlKzFdIHRoZQotICBwYXJhbWV0ZXJzIGF0IHBvc2l0aW9uIG5bZV0gYW5kIG5bZSsxXSBhcmUgcmVxdWlyZWQgYXMgd2VsbCBhcyB0aGUgc3ViYmFuZCBkb21haW4gc2lnbmFscwotICBzX2sobikgYW5kIGRfayhuKSBmb3IgbiA9IG5bZV0rMS4uLiBuX1tlKzFdLiBuW2VdIHJlcHJlc2VudHMgdGhlIHN0YXJ0IHBvc2l0aW9uIGZvcgotICBlbnZlbG9wZSBlLiBUaGUgYm9yZGVyIHBvc2l0aW9ucyBuW2VdIGFyZSBoYW5kbGVkIGluIERlY29kZVBTKCkuCisgIFRvIGdlbmVyYXRlIHRoZSBRTUYgc3ViYmFuZCBzaWduYWxzIGZvciB0aGUgc3ViYmFuZCBzYW1wbGVzIG4gPSBuW2VdKzEgLCwsCisgIG5fW2UrMV0gdGhlIHBhcmFtZXRlcnMgYXQgcG9zaXRpb24gbltlXSBhbmQgbltlKzFdIGFyZSByZXF1aXJlZCBhcyB3ZWxsIGFzIHRoZQorICBzdWJiYW5kIGRvbWFpbiBzaWduYWxzIHNfayhuKSBhbmQgZF9rKG4pIGZvciBuID0gbltlXSsxLi4uIG5fW2UrMV0uIG5bZV0KKyAgcmVwcmVzZW50cyB0aGUgc3RhcnQgcG9zaXRpb24gZm9yIGVudmVsb3BlIGUuIFRoZSBib3JkZXIgcG9zaXRpb25zIG5bZV0gYXJlCisgIGhhbmRsZWQgaW4gRGVjb2RlUFMoKS4KIAogICBUaGUgc3RlcmVvIHN1YiBzdWJiYW5kIHNpZ25hbHMgYXJlIGNvbnN0cnVjdGVkIGFzOgogICA8cHJlPgogICBsX2sobikgPSBIMTEoayxuKSBzX2sobikgKyBIMjEoayxuKSBkX2sobikKICAgcl9rKG4pID0gSDIxKGssbikgc19rKG4pICsgSDIyKGssbikgZF9rKG4pCiAgIDwvcHJlPgotICBJbiBvcmRlciB0byBvYnRhaW4gdGhlIG1hdHJpY2VzIEgxMShrLG4pLi4uIEgyMiAoayxuKSwgdGhlIHZlY3RvcnMgaDExKGIpLi4uIGgyMihiKSBuZWVkIHRvCi0gIGJlIGNhbGN1bGF0ZWQgZmlyc3QgKGI6IHBhcmFtZXRlciBpbmRleCkuIERlcGVuZGluZyBvbiBJQ0MgbW9kZSBlaXRoZXIgbWl4aW5nIHByb2NlZHVyZSBSX2EKLSAgb3IgUl9iIGlzIHVzZWQgZm9yIHRoYXQuIEZvciBib3RoIHByb2NlZHVyZXMsIHRoZSBwYXJhbWV0ZXJzIGZvciBwYXJhbWV0ZXIgcG9zaXRpb24gbltlKzFdCi0gIGlzIHVzZWQuCisgIEluIG9yZGVyIHRvIG9idGFpbiB0aGUgbWF0cmljZXMgSDExKGssbikuLi4gSDIyIChrLG4pLCB0aGUgdmVjdG9ycyBoMTEoYikuLi4KKyAgaDIyKGIpIG5lZWQgdG8gYmUgY2FsY3VsYXRlZCBmaXJzdCAoYjogcGFyYW1ldGVyIGluZGV4KS4gRGVwZW5kaW5nIG9uIElDQyBtb2RlCisgIGVpdGhlciBtaXhpbmcgcHJvY2VkdXJlIFJfYSBvciBSX2IgaXMgdXNlZCBmb3IgdGhhdC4gRm9yIGJvdGggcHJvY2VkdXJlcywgdGhlCisgIHBhcmFtZXRlcnMgZm9yIHBhcmFtZXRlciBwb3NpdGlvbiBuW2UrMV0gaXMgdXNlZC4KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyohCiAgIDxoMj5QaGFzZSBwYXJhbWV0ZXJzIDwvaDI+Ci0gIFdpdGggZGlzYWJsZWQgcGhhc2UgcGFyYW1ldGVycyAod2hpY2ggaXMgdGhlIGNhc2UgaW4gYmFzZWxpbmUgdmVyc2lvbiksIHRoZSBILW1hdHJpY2VzIGFyZQotICBqdXN0IGNhbGN1bGF0ZWQgYnk6CisgIFdpdGggZGlzYWJsZWQgcGhhc2UgcGFyYW1ldGVycyAod2hpY2ggaXMgdGhlIGNhc2UgaW4gYmFzZWxpbmUgdmVyc2lvbiksIHRoZQorICBILW1hdHJpY2VzIGFyZSBqdXN0IGNhbGN1bGF0ZWQgYnk6CiAKICAgPHByZT4KICAgSDExKGssbltlKzFdID0gaDExKGIoaykpCkBAIC0xMTQ2LDY5ICs0OTgsNDQgQEAKICAgdGhpcyBsb29wIGluY2x1ZGVzIHRoZSBpbnRlcnBvbGF0aW9uIG9mIHRoZSBjb2VmZmljaWVudHMgSHh4CiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCi0gIC8qIGxvb3AgdGhydSBhbGwgZ3JvdXBzIC4uLiAqLwotICBIeWJyTGVmdFJlYWwgID0gbUh5YnJpZFJlYWxMZWZ0OwotICBIeWJyTGVmdEltYWcgID0gbUh5YnJpZEltYWdMZWZ0OwotICBIeWJyUmlnaHRSZWFsID0gbUh5YnJpZFJlYWxSaWdodDsKLSAgSHliclJpZ2h0SW1hZyA9IG1IeWJyaWRJbWFnUmlnaHQ7Ci0KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyogY29uc3RydWN0IHN0ZXJlbyBzdWIgc3ViYmFuZCBzaWduYWxzIGFjY29yZGluZyB0bzogKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogbF9rKG4pID0gSDExKGssbikgc19rKG4pICsgSDIxKGssbikgZF9rKG4pICAgICAgICAgKi8KICAgLyogcl9rKG4pID0gSDEyKGssbikgc19rKG4pICsgSDIyKGssbikgZF9rKG4pICAgICAgICAgKi8KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgZm9yICggZ3JvdXAgPSAwOyBncm91cCA8IFNVQlFNRl9HUk9VUFM7IGdyb3VwKysgKSB7CisgIFBTX0RFQ19DT0VGRklDSUVOVFMgKnBDb2VmID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWY7CiAKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMTFyW2dyb3VwXTsKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMTJyW2dyb3VwXTsKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMjFyW2dyb3VwXTsKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMjJyW2dyb3VwXTsKKyAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgTk9fSUlEX0dST1VQUzsgZ3JvdXArKykgeworICAgIHBDb2VmLT5IMTFyW2dyb3VwXSArPSBwQ29lZi0+RGVsdGFIMTFyW2dyb3VwXTsKKyAgICBwQ29lZi0+SDEycltncm91cF0gKz0gcENvZWYtPkRlbHRhSDEycltncm91cF07CisgICAgcENvZWYtPkgyMXJbZ3JvdXBdICs9IHBDb2VmLT5EZWx0YUgyMXJbZ3JvdXBdOworICAgIHBDb2VmLT5IMjJyW2dyb3VwXSArPSBwQ29lZi0+RGVsdGFIMjJyW2dyb3VwXTsKIAotICAgIHN1YmJhbmQgPSBncm91cEJvcmRlcnMyMFtncm91cF07CisgICAgY29uc3QgaW50IHN0YXJ0ID0gZ3JvdXBUYWJsZVtncm91cF07CisgICAgY29uc3QgaW50IHN0b3AgPSBncm91cFRhYmxlW2dyb3VwICsgMV07CisgICAgZm9yIChzdWJiYW5kID0gc3RhcnQ7IHN1YmJhbmQgPCBzdG9wOyBzdWJiYW5kKyspIHsKKyAgICAgIEZJWFBfREJMIHRtcExlZnQgPQorICAgICAgICAgIGZNdWx0QWRkKGZNdWx0RGl2MihwQ29lZi0+SDExcltncm91cF0sIG1IeWJyaWRSZWFsTGVmdFtzdWJiYW5kXSksCisgICAgICAgICAgICAgICAgICAgcENvZWYtPkgyMXJbZ3JvdXBdLCBtSHlicmlkUmVhbFJpZ2h0W3N1YmJhbmRdKTsKKyAgICAgIEZJWFBfREJMIHRtcFJpZ2h0ID0KKyAgICAgICAgICBmTXVsdEFkZChmTXVsdERpdjIocENvZWYtPkgxMnJbZ3JvdXBdLCBtSHlicmlkUmVhbExlZnRbc3ViYmFuZF0pLAorICAgICAgICAgICAgICAgICAgIHBDb2VmLT5IMjJyW2dyb3VwXSwgbUh5YnJpZFJlYWxSaWdodFtzdWJiYW5kXSk7CisgICAgICBtSHlicmlkUmVhbExlZnRbc3ViYmFuZF0gPSB0bXBMZWZ0OworICAgICAgbUh5YnJpZFJlYWxSaWdodFtzdWJiYW5kXSA9IHRtcFJpZ2h0OwogCi0gICAgdG1wTGVmdCAgPSBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdLCBIeWJyTGVmdFJlYWxbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdLCBIeWJyUmlnaHRSZWFsW3N1YmJhbmRdKTsKLSAgICB0bXBSaWdodCA9IGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDEycltncm91cF0sIEh5YnJMZWZ0UmVhbFtzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIycltncm91cF0sIEh5YnJSaWdodFJlYWxbc3ViYmFuZF0pOwotICAgIEh5YnJMZWZ0UmVhbCBbc3ViYmFuZF0gPSB0bXBMZWZ0PDwxOwotICAgIEh5YnJSaWdodFJlYWxbc3ViYmFuZF0gPSB0bXBSaWdodDw8MTsKLQotICAgIHRtcExlZnQgID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdLCBIeWJyTGVmdEltYWdbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdLCBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdKTsKLSAgICB0bXBSaWdodCA9IGZNdWx0QWRkKCBmTXVsdERpdjIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTJyW2dyb3VwXSwgSHlickxlZnRJbWFnW3N1YmJhbmRdKSwgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMjJyW2dyb3VwXSwgSHliclJpZ2h0SW1hZ1tzdWJiYW5kXSk7Ci0gICAgSHlickxlZnRJbWFnIFtzdWJiYW5kXSA9IHRtcExlZnQ7Ci0gICAgSHliclJpZ2h0SW1hZ1tzdWJiYW5kXSA9IHRtcFJpZ2h0OwotICB9Ci0KLSAgLyogY29udGludWUgaW4gdGhlIHFtZiBidWZmZXJzICovCi0gIEh5YnJMZWZ0UmVhbCAgPSBRbWZMZWZ0UmVhbDsKLSAgSHlickxlZnRJbWFnICA9IFFtZkxlZnRJbWFnOwotICBIeWJyUmlnaHRSZWFsID0gUW1mUmlnaHRSZWFsOwotICBIeWJyUmlnaHRJbWFnID0gUW1mUmlnaHRJbWFnOwotCi0gIGZvciAoOyBncm91cCA8IE5PX0lJRF9HUk9VUFM7IGdyb3VwKysgKSB7Ci0KLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMTFyW2dyb3VwXTsKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMTJyW2dyb3VwXTsKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMjFyW2dyb3VwXTsKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMjJyW2dyb3VwXTsKLQotICAgIGZvciAoIHN1YmJhbmQgPSBncm91cEJvcmRlcnMyMFtncm91cF07IHN1YmJhbmQgPCBncm91cEJvcmRlcnMyMFtncm91cCArIDFdOyBzdWJiYW5kKysgKQotICAgIHsKLSAgICAgIHRtcExlZnQgID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdLCBIeWJyTGVmdFJlYWxbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdLCBIeWJyUmlnaHRSZWFsW3N1YmJhbmRdKTsKLSAgICAgIHRtcFJpZ2h0ID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdLCBIeWJyTGVmdFJlYWxbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdLCBIeWJyUmlnaHRSZWFsW3N1YmJhbmRdKTsKLSAgICAgIEh5YnJMZWZ0UmVhbCBbc3ViYmFuZF0gPSB0bXBMZWZ0OwotICAgICAgSHliclJpZ2h0UmVhbFtzdWJiYW5kXSA9IHRtcFJpZ2h0OwotCi0gICAgICB0bXBMZWZ0ICA9IGZNdWx0QWRkKCBmTXVsdERpdjIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTFyW2dyb3VwXSwgSHlickxlZnRJbWFnW3N1YmJhbmRdKSwgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMjFyW2dyb3VwXSwgSHliclJpZ2h0SW1hZ1tzdWJiYW5kXSk7Ci0gICAgICB0bXBSaWdodCA9IGZNdWx0QWRkKCBmTXVsdERpdjIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTJyW2dyb3VwXSwgSHlickxlZnRJbWFnW3N1YmJhbmRdKSwgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMjJyW2dyb3VwXSwgSHliclJpZ2h0SW1hZ1tzdWJiYW5kXSk7Ci0gICAgICBIeWJyTGVmdEltYWcgW3N1YmJhbmRdID0gdG1wTGVmdDsKLSAgICAgIEh5YnJSaWdodEltYWdbc3ViYmFuZF0gPSB0bXBSaWdodDsKLQorICAgICAgdG1wTGVmdCA9CisgICAgICAgICAgZk11bHRBZGQoZk11bHREaXYyKHBDb2VmLT5IMTFyW2dyb3VwXSwgbUh5YnJpZEltYWdMZWZ0W3N1YmJhbmRdKSwKKyAgICAgICAgICAgICAgICAgICBwQ29lZi0+SDIxcltncm91cF0sIG1IeWJyaWRJbWFnUmlnaHRbc3ViYmFuZF0pOworICAgICAgdG1wUmlnaHQgPQorICAgICAgICAgIGZNdWx0QWRkKGZNdWx0RGl2MihwQ29lZi0+SDEycltncm91cF0sIG1IeWJyaWRJbWFnTGVmdFtzdWJiYW5kXSksCisgICAgICAgICAgICAgICAgICAgcENvZWYtPkgyMnJbZ3JvdXBdLCBtSHlicmlkSW1hZ1JpZ2h0W3N1YmJhbmRdKTsKKyAgICAgIG1IeWJyaWRJbWFnTGVmdFtzdWJiYW5kXSA9IHRtcExlZnQ7CisgICAgICBtSHlicmlkSW1hZ1JpZ2h0W3N1YmJhbmRdID0gdG1wUmlnaHQ7CiAgICAgfSAvKiBzdWJiYW5kICovCiAgIH0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgQXBwbGllcyBJSUQsIElDQywgSVBEIGFuZCBPUEQgcGFyYW1ldGVycyB0byB0aGUgY3VycmVudCBmcmFtZS4KQEAgLTEyMTYsMTk5ICs1NDMsMTcyIEBACiAgIFxyZXR1cm4gbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotQXBwbHlQc1Nsb3QoIEhBTkRMRV9QU19ERUMgaF9wc19kLCAgICAgICAgIC8qITwgaGFuZGxlIFBTX0RFQyovCi0gICAgICAgICAgICAgRklYUF9EQkwgICoqckludEJ1ZmZlckxlZnQsICAgLyohPCByZWFsIGJhbmRzIGxlZnQgcW1mIGNoYW5uZWwgKDM4eDY0KSAgKi8KLSAgICAgICAgICAgICBGSVhQX0RCTCAgKippSW50QnVmZmVyTGVmdCwgICAvKiE8IGltYWcgYmFuZHMgbGVmdCBxbWYgY2hhbm5lbCAoMzh4NjQpICAqLwotICAgICAgICAgICAgIEZJWFBfREJMICAqckludEJ1ZmZlclJpZ2h0LCAgIC8qITwgcmVhbCBiYW5kcyByaWdodCBxbWYgY2hhbm5lbCAoMzh4NjQpICovCi0gICAgICAgICAgICAgRklYUF9EQkwgICppSW50QnVmZmVyUmlnaHQgICAgLyohPCBpbWFnIGJhbmRzIHJpZ2h0IHFtZiBjaGFubmVsICgzOHg2NCkgKi8KLSAgICAgICAgICAgKQotewordm9pZCBBcHBseVBzU2xvdCgKKyAgICBIQU5ETEVfUFNfREVDIGhfcHNfZCwgICAgICAvKiE8IGhhbmRsZSBQU19ERUMqLworICAgIEZJWFBfREJMICoqckludEJ1ZmZlckxlZnQsIC8qITwgcmVhbCBiYW5kcyBsZWZ0IHFtZiBjaGFubmVsICgzOHg2NCkgICovCisgICAgRklYUF9EQkwgKippSW50QnVmZmVyTGVmdCwgLyohPCBpbWFnIGJhbmRzIGxlZnQgcW1mIGNoYW5uZWwgKDM4eDY0KSAgKi8KKyAgICBGSVhQX0RCTCAqckludEJ1ZmZlclJpZ2h0LCAvKiE8IHJlYWwgYmFuZHMgcmlnaHQgcW1mIGNoYW5uZWwgKDM4eDY0KSAqLworICAgIEZJWFBfREJMICppSW50QnVmZmVyUmlnaHQsIC8qITwgaW1hZyBiYW5kcyByaWdodCBxbWYgY2hhbm5lbCAoMzh4NjQpICovCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdiwgY29uc3QgaW50IHNjYWxlRmFjdG9yTG93QmFuZCwKKyAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JIaWdoQmFuZCwgY29uc3QgaW50IGxzYiwgY29uc3QgaW50IHVzYikgeworLyohCitUaGUgNjQtYmFuZCBRTUYgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vbmF1cmFsIHNpZ25hbCBnZW5lcmF0ZWQgYnkgdGhlIFNCUiB0b29sCitpcyB1c2VkIGFzIGlucHV0IG9mIHRoZSBQUyB0b29sLiBBZnRlciB0aGUgUFMgcHJvY2Vzc2luZywgdGhlIG91dHB1dHMgb2YgdGhlCitsZWZ0IGFuZCByaWdodCBoeWJyaWQgc3ludGhlc2lzIGZpbHRlcmJhbmtzIGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBzdGVyZW8KK291dHB1dCBzaWduYWwuCiAKLSAgLyohCi0gIFRoZSA2NC1iYW5kIFFNRiByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9uYXVyYWwgc2lnbmFsIGdlbmVyYXRlZCBieSB0aGUgU0JSIHRvb2wKLSAgaXMgdXNlZCBhcyBpbnB1dCBvZiB0aGUgUFMgdG9vbC4gQWZ0ZXIgdGhlIFBTIHByb2Nlc3NpbmcsIHRoZSBvdXRwdXRzIG9mIHRoZSBsZWZ0Ci0gIGFuZCByaWdodCBoeWJyaWQgc3ludGhlc2lzIGZpbHRlcmJhbmtzIGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBzdGVyZW8gb3V0cHV0Ci0gIHNpZ25hbC4KKzxwcmU+CiAKLSAgPHByZT4KKyAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAgICAgICAtLS0tLS0tLS0tLS0tCisgICAgICAgICAgfCBIeWJyaWQgICAgICB8IE1fbltrLG1dIHwgICAgICAgICAgfCBMX25bayxtXSB8IEh5YnJpZCAgICAgIHwgbFtuXQorIG1bbl0gLS0tPnwgYW5hbHlzaXMgICAgfC0tLS0tLS0tLT58ICAgICAgICAgIHwtLS0tLS0tLS0+fCBzeW50aGVzaXMgICB8LS0tLS0+CisgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgIHwgU3RlcmVvICAgfCAgICAgICAgICAgLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IHJlY29uLSAgIHwKKyAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCBzdHVjdGlvbiB8CisgICAgICAgICAgICAgICAgXHwvICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICB8ICAgICAgICAgIHwKKyAgICAgICAgICB8IERlLSAgICAgICAgIHwgRF9uW2ssbV0gfCAgICAgICAgICB8CisgICAgICAgICAgfCBjb3JyZWxhdGlvbiB8LS0tLS0tLS0tPnwgICAgICAgICAgfAorICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgIC0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8IFJfbltrLG1dIHwgSHlicmlkICAgICAgfCByW25dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfC0tLS0tLS0tLT58IHN5bnRoZXNpcyAgIHwtLS0tLT4KKyBJSUQsIElDQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fCAgICAgICAgICB8ICAgICAgICAgIHwgZmlsdGVyIGJhbmsgfAorKElQRCwgT1BEKSAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0KIAotICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAtLS0tLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgfCBIeWJyaWQgICAgICB8IE1fbltrLG1dIHwgICAgICAgICAgfCBMX25bayxtXSB8IEh5YnJpZCAgICAgIHwgbFtuXQotICAgbVtuXSAtLS0+fCBhbmFseXNpcyAgICB8LS0tLS0tLS0tPnwgICAgICAgICAgfC0tLS0tLS0tLT58IHN5bnRoZXNpcyAgIHwtLS0tLT4KLSAgICAgICAgICAgIHwgZmlsdGVyIGJhbmsgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCBmaWx0ZXIgYmFuayB8Ci0gICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgfCBTdGVyZW8gICB8ICAgICAgICAgICAtLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCByZWNvbi0gICB8Ci0gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCBzdHVjdGlvbiB8Ci0gICAgICAgICAgICAgICAgICBcfC8gICAgICAgICAgICAgICAgfCAgICAgICAgICB8Ci0gICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgfCAgICAgICAgICB8Ci0gICAgICAgICAgICB8IERlLSAgICAgICAgIHwgRF9uW2ssbV0gfCAgICAgICAgICB8Ci0gICAgICAgICAgICB8IGNvcnJlbGF0aW9uIHwtLS0tLS0tLS0+fCAgICAgICAgICB8Ci0gICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAtLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8IFJfbltrLG1dIHwgSHlicmlkICAgICAgfCByW25dCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8LS0tLS0tLS0tPnwgc3ludGhlc2lzICAgfC0tLS0tPgotICAgSUlELCBJQ0MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPnwgICAgICAgICAgfCAgICAgICAgICB8IGZpbHRlciBiYW5rIHwKLSAgKElQRCwgT1BEKSAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0KK21bbl06ICAgICAgUU1GIHJlcHJlc2FudGF0aW9uIG9mIHRoZSBtb25vIGlucHV0CitNX25bayxtXTogIChzdWItKXN1Yi1iYW5kIGRvbWFpbiBzaWduYWxzIG9mIHRoZSBtb25vIGlucHV0CitEX25bayxtXTogIGRlY29ycmVsYXRlZCAoc3ViLSlzdWItYmFuZCBkb21haW4gc2lnbmFscworTF9uW2ssbV06ICAoc3ViLSlzdWItYmFuZCBkb21haW4gc2lnbmFscyBvZiB0aGUgbGVmdCBvdXRwdXQKK1JfbltrLG1dOiAgKHN1Yi0pc3ViLWJhbmQgZG9tYWluIHNpZ25hbHMgb2YgdGhlIHJpZ2h0IG91dHB1dAorbFtuXSxyW25dOiBsZWZ0L3JpZ2h0IG91dHB1dCBzaWduYWxzCiAKLSAgbVtuXTogICAgICBRTUYgcmVwcmVzYW50YXRpb24gb2YgdGhlIG1vbm8gaW5wdXQKLSAgTV9uW2ssbV06ICAoc3ViLSlzdWItYmFuZCBkb21haW4gc2lnbmFscyBvZiB0aGUgbW9ubyBpbnB1dAotICBEX25bayxtXTogIGRlY29ycmVsYXRlZCAoc3ViLSlzdWItYmFuZCBkb21haW4gc2lnbmFscwotICBMX25bayxtXTogIChzdWItKXN1Yi1iYW5kIGRvbWFpbiBzaWduYWxzIG9mIHRoZSBsZWZ0IG91dHB1dAotICBSX25bayxtXTogIChzdWItKXN1Yi1iYW5kIGRvbWFpbiBzaWduYWxzIG9mIHRoZSByaWdodCBvdXRwdXQKLSAgbFtuXSxyW25dOiBsZWZ0L3JpZ2h0IG91dHB1dCBzaWduYWxzCis8L3ByZT4KKyovCisjZGVmaW5lIE5PX0hZQlJJRF9EQVRBX0JBTkRTICg3MSkKIAotICA8L3ByZT4KLSAgKi8KKyAgaW50IGk7CisgIEZJWFBfREJMIHFtZklucHV0RGF0YVsyXVtOT19RTUZfQkFORFNfSFlCUklEMjBdOworICBGSVhQX0RCTCAqaHlicmlkRGF0YVsyXVsyXTsKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBIeWJyaWREYXRhLCBGSVhQX0RCTCwgNCAqIE5PX0hZQlJJRF9EQVRBX0JBTkRTKTsKIAotICAvKiBnZXQgdGVtcG9yYXJ5IGh5YnJpZCBxbWYgdmFsdWVzIG9mIG9uZSB0aW1lc2xvdCAqLwotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoaHlicmlkUmVhbExlZnQsIEZJWFBfREJMLCBOT19TVUJfUU1GX0NIQU5ORUxTKTsKLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGh5YnJpZEltYWdMZWZ0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7Ci0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChoeWJyaWRSZWFsUmlnaHQsIEZJWFBfREJMLCBOT19TVUJfUU1GX0NIQU5ORUxTKTsKLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGh5YnJpZEltYWdSaWdodCwgRklYUF9EQkwsIE5PX1NVQl9RTUZfQ0hBTk5FTFMpOwotCi0gIFNDSEFSIHNmX0ludEJ1ZmZlciAgICAgPSBoX3BzX2QtPnNmX0ludEJ1ZmZlcjsKLQotICAvKiBjbGVhciB3b3JrYnVmZmVyICovCi0gIEZES21lbWNsZWFyKGh5YnJpZFJlYWxMZWZ0LCAgTk9fU1VCX1FNRl9DSEFOTkVMUypzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtY2xlYXIoaHlicmlkSW1hZ0xlZnQsICBOT19TVUJfUU1GX0NIQU5ORUxTKnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1jbGVhcihoeWJyaWRSZWFsUmlnaHQsIE5PX1NVQl9RTUZfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbWNsZWFyKGh5YnJpZEltYWdSaWdodCwgTk9fU1VCX1FNRl9DSEFOTkVMUypzaXplb2YoRklYUF9EQkwpKTsKLQorICBoeWJyaWREYXRhWzBdWzBdID0KKyAgICAgIHBIeWJyaWREYXRhICsgMCAqIE5PX0hZQlJJRF9EQVRBX0JBTkRTOyAvKiBsZWZ0IHJlYWwgaHlicmlkIGRhdGEgKi8KKyAgaHlicmlkRGF0YVswXVsxXSA9CisgICAgICBwSHlicmlkRGF0YSArIDEgKiBOT19IWUJSSURfREFUQV9CQU5EUzsgLyogbGVmdCBpbWFnIGh5YnJpZCBkYXRhICovCisgIGh5YnJpZERhdGFbMV1bMF0gPQorICAgICAgcEh5YnJpZERhdGEgKyAyICogTk9fSFlCUklEX0RBVEFfQkFORFM7IC8qIHJpZ2h0IHJlYWwgaHlicmlkIGRhdGEgKi8KKyAgaHlicmlkRGF0YVsxXVsxXSA9CisgICAgICBwSHlicmlkRGF0YSArIDMgKiBOT19IWUJSSURfREFUQV9CQU5EUzsgLyogcmlnaHQgaW1hZyBoeWJyaWQgZGF0YSAqLwogCiAgIC8qIQogICBIeWJyaWQgYW5hbHlzaXMgZmlsdGVyYmFuazoKLSAgVGhlIGxvd2VyIDMgKDUpIG9mIHRoZSA2NCBRTUYgc3ViYmFuZHMgYXJlIGZ1cnRoZXIgc3BsaXQgdG8gcHJvdmlkZSBiZXR0ZXIgZnJlcXVlbmN5IHJlc29sdXRpb24uCi0gIGZvciBQUyBwcm9jZXNzaW5nLgotICBGb3IgdGhlIDEwIGFuZCAyMCBzdGVyZW8gYmFuZHMgY29uZmlndXJhdGlvbiwgdGhlIFFNRiBiYW5kIEhfMCh3KSBpcyBzcGxpdAotICB1cCBpbnRvIDggKHN1Yi0pIHN1Yi1iYW5kcyBhbmQgdGhlIFFNRiBiYW5kcyBIXzEodykgYW5kIEhfMih3KSBhcmUgc3BpdCBpbnRvIDIgKHN1Yi0pCi0gIDR0aC4gKFNlZSBmaWd1cmVzIDguMjAgYW5kIDguMjIgb2YgSVNPL0lFQyAxNDQ5Ni0zOjIwMDEvRkRBTSAyOjIwMDQoRSkgKQorICBUaGUgbG93ZXIgMyAoNSkgb2YgdGhlIDY0IFFNRiBzdWJiYW5kcyBhcmUgZnVydGhlciBzcGxpdCB0byBwcm92aWRlIGJldHRlcgorICBmcmVxdWVuY3kgcmVzb2x1dGlvbi4gZm9yIFBTIHByb2Nlc3NpbmcuIEZvciB0aGUgMTAgYW5kIDIwIHN0ZXJlbyBiYW5kcworICBjb25maWd1cmF0aW9uLCB0aGUgUU1GIGJhbmQgSF8wKHcpIGlzIHNwbGl0IHVwIGludG8gOCAoc3ViLSkgc3ViLWJhbmRzIGFuZCB0aGUKKyAgUU1GIGJhbmRzIEhfMSh3KSBhbmQgSF8yKHcpIGFyZSBzcGl0IGludG8gMiAoc3ViLSkgNHRoLiAoU2VlIGZpZ3VyZXMgOC4yMAorICBhbmQgOC4yMiBvZiBJU08vSUVDIDE0NDk2LTM6MjAwMS9GREFNIDI6MjAwNChFKSApCiAgICovCiAKKyAgLyoKKyAgICogSHlicmlkIGFuYWx5c2lzLgorICAgKi8KIAotICBpZiAoaF9wc19kLT5wcm9jRnJhbWVCYXNlZCA9PSAxKSAgICAvKiBJZiB3ZSBoYXZlIHN3aXRjaGVkIGZyb20gZnJhbWUgdG8gc2xvdCBiYXNlZCBwcm9jZXNzaW5nICAqLwotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxsIGh5YnJpZCBkZWxheSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGhfcHNfZC0+cHJvY0ZyYW1lQmFzZWQgPSAwOwotCi0gICAgZmlsbEh5YnJpZERlbGF5TGluZSggckludEJ1ZmZlckxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaUludEJ1ZmZlckxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkUmVhbExlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ0xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkUmVhbFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQgKTsKKyAgLyogR2V0IHFtZiBpbnB1dCBkYXRhIGFuZCBhcHBseSBkZXNjYWxpbmcgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5PX1FNRl9CQU5EU19IWUJSSUQyMDsgaSsrKSB7CisgICAgcW1mSW5wdXREYXRhWzBdW2ldID0gc2NhbGVWYWx1ZShySW50QnVmZmVyTGVmdFtIWUJSSURfRklMVEVSX0RFTEFZXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdik7CisgICAgcW1mSW5wdXREYXRhWzFdW2ldID0gc2NhbGVWYWx1ZShpSW50QnVmZmVyTGVmdFtIWUJSSURfRklMVEVSX0RFTEFZXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdik7CiAgIH0KIAotICBzbG90QmFzZWRIeWJyaWRBbmFseXNpcyAoIHJJbnRCdWZmZXJMZWZ0W0hZQlJJRF9GSUxURVJfREVMQVldLCAvKiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpSW50QnVmZmVyTGVmdFtIWUJSSURfRklMVEVSX0RFTEFZXSwgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkUmVhbExlZnQsICAgICAgICAgICAgICAgICAgICAgIC8qIGh5YnJpZCBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdMZWZ0LCAgICAgICAgICAgICAgICAgICAgICAvKiBoeWJyaWQgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQpOyAgICAgICAgICAvKiBoeWJyaWQgZmlsdGVyYmFuayBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTEYgLSBwYXJ0ICovCisgIEZES2h5YnJpZEFuYWx5c2lzQXBwbHkoJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZEFuYWx5c2lzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFtZklucHV0RGF0YVswXSwgcW1mSW5wdXREYXRhWzFdLCBoeWJyaWREYXRhWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZERhdGFbMF1bMV0pOwogCisgIC8qIEhGIC0gcGFydCAqLworICAvKiBiYW5kcyB1cCB0byBsc2IgKi8KKyAgc2NhbGVWYWx1ZXMoJmh5YnJpZERhdGFbMF1bMF1bTk9fU1VCX1FNRl9DSEFOTkVMUyAtIDJdLAorICAgICAgICAgICAgICAmckludEJ1ZmZlckxlZnRbMF1bTk9fUU1GX0JBTkRTX0hZQlJJRDIwXSwKKyAgICAgICAgICAgICAgbHNiIC0gTk9fUU1GX0JBTkRTX0hZQlJJRDIwLCBzY2FsZUZhY3Rvckxvd0JhbmQpOworICBzY2FsZVZhbHVlcygmaHlicmlkRGF0YVswXVsxXVtOT19TVUJfUU1GX0NIQU5ORUxTIC0gMl0sCisgICAgICAgICAgICAgICZpSW50QnVmZmVyTGVmdFswXVtOT19RTUZfQkFORFNfSFlCUklEMjBdLAorICAgICAgICAgICAgICBsc2IgLSBOT19RTUZfQkFORFNfSFlCUklEMjAsIHNjYWxlRmFjdG9yTG93QmFuZCk7CiAKLSAgU0NIQVIgaHlicmlkU2NhbCA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZC5zZl9tUW1mQnVmZmVyOworICAvKiBiYW5kcyBmcm9tIGxzYiB0byB1c2IgKi8KKyAgc2NhbGVWYWx1ZXMoJmh5YnJpZERhdGFbMF1bMF1bbHNiICsgKE5PX1NVQl9RTUZfQ0hBTk5FTFMgLSAyIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX1FNRl9CQU5EU19IWUJSSUQyMCldLAorICAgICAgICAgICAgICAmckludEJ1ZmZlckxlZnRbMF1bbHNiXSwgdXNiIC0gbHNiLCBzY2FsZUZhY3RvckhpZ2hCYW5kKTsKKyAgc2NhbGVWYWx1ZXMoJmh5YnJpZERhdGFbMF1bMV1bbHNiICsgKE5PX1NVQl9RTUZfQ0hBTk5FTFMgLSAyIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX1FNRl9CQU5EU19IWUJSSUQyMCldLAorICAgICAgICAgICAgICAmaUludEJ1ZmZlckxlZnRbMF1bbHNiXSwgdXNiIC0gbHNiLCBzY2FsZUZhY3RvckhpZ2hCYW5kKTsKIAorICAvKiBiYW5kcyBmcm9tIHVzYiB0byBOT19TVUJfUU1GX0NIQU5ORUxTIHdoaWNoIHNob3VsZCBiZSB6ZXJvIGZvciBub24tb3ZlcmxhcAorICAgICBzbG90cyBidXQgY2FuIGJlIG5vbi16ZXJvIGZvciBvdmVybGFwIHNsb3RzICovCisgIEZES21lbWNweSgKKyAgICAgICZoeWJyaWREYXRhWzBdWzBdCisgICAgICAgICAgICAgICAgIFt1c2IgKyAoTk9fU1VCX1FNRl9DSEFOTkVMUyAtIDIgLSBOT19RTUZfQkFORFNfSFlCUklEMjApXSwKKyAgICAgICZySW50QnVmZmVyTGVmdFswXVt1c2JdLCBzaXplb2YoRklYUF9EQkwpICogKE5PX1FNRl9DSEFOTkVMUyAtIHVzYikpOworICBGREttZW1jcHkoCisgICAgICAmaHlicmlkRGF0YVswXVsxXQorICAgICAgICAgICAgICAgICBbdXNiICsgKE5PX1NVQl9RTUZfQ0hBTk5FTFMgLSAyIC0gTk9fUU1GX0JBTkRTX0hZQlJJRDIwKV0sCisgICAgICAmaUludEJ1ZmZlckxlZnRbMF1bdXNiXSwgc2l6ZW9mKEZJWFBfREJMKSAqIChOT19RTUZfQ0hBTk5FTFMgLSB1c2IpKTsKIAogICAvKiEKICAgRGVjb3JyZWxhdGlvbjoKLSAgQnkgbWVhbnMgb2YgYWxsLXBhc3MgZmlsdGVyaW5nIGFuZCBkZWxheWluZywgdGhlIChzdWItKXN1Yi1iYW5kIHNhbXBsZXMgc19rKG4pIGFyZQotICBjb252ZXJ0ZWQgaW50byBkZS1jb3JyZWxhdGVkIChzdWItKXN1Yi1iYW5kIHNhbXBsZXMgZF9rKG4pLgorICBCeSBtZWFucyBvZiBhbGwtcGFzcyBmaWx0ZXJpbmcgYW5kIGRlbGF5aW5nLCB0aGUgKHN1Yi0pc3ViLWJhbmQgc2FtcGxlcyBzX2sobikKKyAgYXJlIGNvbnZlcnRlZCBpbnRvIGRlLWNvcnJlbGF0ZWQgKHN1Yi0pc3ViLWJhbmQgc2FtcGxlcyBkX2sobikuCiAgIC0gazogZnJlcXVlbmN5IGluIGh5YnJpZCBzcGVjdHJ1bQogICAtIG46IHRpbWUgaW5kZXgKICAgKi8KIAotICBkZUNvcnJlbGF0ZVNsb3RCYXNlZCggaF9wc19kLCAgICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZFJlYWxMZWZ0LCAgICAgIC8qIGxlZnQgaHlicmlkIHRpbWUgc2xvdCAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRJbWFnTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZFNjYWwsICAgICAgLyogc2NhbGUgZmFjdG9yIG9mIGxlZnQgaHlicmlkIHRpbWUgc2xvdCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJJbnRCdWZmZXJMZWZ0WzBdLCAgIC8qIGxlZnQgcW1mIHRpbWUgc2xvdCAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpSW50QnVmZmVyTGVmdFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNmX0ludEJ1ZmZlciwgICAgICAgIC8qIHNjYWxlIGZhY3RvciBvZiBsZWZ0IGFuZCByaWdodCBxbWYgdGltZSBzbG90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRSZWFsUmlnaHQsICAgICAvKiByaWdodCBoeWJyaWQgdGltZSBzbG90ICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ1JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgckludEJ1ZmZlclJpZ2h0LCAgICAgLyogcmlnaHQgcW1mIHRpbWUgc2xvdCAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlJbnRCdWZmZXJSaWdodCApOwotCi0KKyAgRkRLZGVjb3JyZWxhdGVBcHBseSgmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYXBEZWNvciwKKyAgICAgICAgICAgICAgICAgICAgICAmaHlicmlkRGF0YVswXVswXVswXSwgLyogbGVmdCByZWFsIGh5YnJpZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgJmh5YnJpZERhdGFbMF1bMV1bMF0sIC8qIGxlZnQgaW1hZyBoeWJyaWQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICZoeWJyaWREYXRhWzFdWzBdWzBdLCAvKiByaWdodCByZWFsIGh5YnJpZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgJmh5YnJpZERhdGFbMV1bMV1bMF0sIC8qIHJpZ2h0IGltYWcgaHlicmlkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRIeWJCYW5kICovCisgICk7CiAKICAgLyohCiAgIFN0ZXJlbyBQcm9jZXNzaW5nOgotICBUaGUgc2V0cyBvZiAoc3ViLSlzdWItYmFuZCBzYW1wbGVzIHNfayhuKSBhbmQgZF9rKG4pIGFyZSBwcm9jZXNzZWQgYWNjb3JkaW5nIHRvCi0gIHRoZSBzdGVyZW8gY3VlcyB3aGljaCBhcmUgZGVmaW5lZCBwZXIgc3RlcmVvIGJhbmQuCisgIFRoZSBzZXRzIG9mIChzdWItKXN1Yi1iYW5kIHNhbXBsZXMgc19rKG4pIGFuZCBkX2sobikgYXJlIHByb2Nlc3NlZCBhY2NvcmRpbmcKKyAgdG8gdGhlIHN0ZXJlbyBjdWVzIHdoaWNoIGFyZSBkZWZpbmVkIHBlciBzdGVyZW8gYmFuZC4KICAgKi8KIAotCi0gIGFwcGx5U2xvdEJhc2VkUm90YXRpb24oIGhfcHNfZCwgICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRSZWFsTGVmdCwgICAgLyogbGVmdCBoeWJyaWQgdGltZSBzbG90ICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ0xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJJbnRCdWZmZXJMZWZ0WzBdLCAvKiBsZWZ0IHFtZiB0aW1lIHNsb3QgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBpSW50QnVmZmVyTGVmdFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkUmVhbFJpZ2h0LCAgIC8qIHJpZ2h0IGh5YnJpZCB0aW1lIHNsb3QgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgckludEJ1ZmZlclJpZ2h0LCAgIC8qIHJpZ2h0IHFtZiB0aW1lIHNsb3QgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlJbnRCdWZmZXJSaWdodCApOwotCi0KLQorICBhcHBseVNsb3RCYXNlZFJvdGF0aW9uKGhfcHNfZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaHlicmlkRGF0YVswXVswXVswXSwgLyogbGVmdCByZWFsIGh5YnJpZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgJmh5YnJpZERhdGFbMF1bMV1bMF0sIC8qIGxlZnQgaW1hZyBoeWJyaWQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICZoeWJyaWREYXRhWzFdWzBdWzBdLCAvKiByaWdodCByZWFsIGh5YnJpZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgJmh5YnJpZERhdGFbMV1bMV1bMF0gIC8qIHJpZ2h0IGltYWcgaHlicmlkIGRhdGEgKi8KKyAgKTsKIAogICAvKiEKICAgSHlicmlkIHN5bnRoZXNpcyBmaWx0ZXJiYW5rOgotICBUaGUgc3RlcmVvIHByb2Nlc3NlZCBoeWJyaWQgc3ViYmFuZCBzaWduYWxzIGxfayhuKSBhbmQgcl9rKG4pIGFyZSBmZWQgaW50byB0aGUgaHlicmlkIHN5bnRoZXNpcwotICBmaWx0ZXJiYW5rcyB3aGljaCBhcmUgaWRlbnRpY2FsIHRvIHRoZSA2NCBjb21wbGV4IHN5bnRoZXNpcyBmaWx0ZXJiYW5rIG9mIHRoZSBTQlIgdG9vbC4gVGhlCi0gIGlucHV0IHRvIHRoZSBmaWx0ZXJiYW5rIGFyZSBzbG90cyBvZiA2NCBRTUYgc2FtcGxlcy4gRm9yIGVhY2ggc2xvdCB0aGUgZmlsdGVyYmFuayBvdXRwdXRzIG9uZQotICBibG9jayBvZiA2NCBzYW1wbGVzIG9mIG9uZSByZWNvbnN0cnVjdGVkIHN0ZXJlbyBjaGFubmVsLiBUaGUgaHlicmlkIHN5bnRoZXNpcyBmaWx0ZXJiYW5rIGlzCi0gIGNvbXB1dGVkIHNlcGVyYXRseSBmb3IgdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwuCisgIFRoZSBzdGVyZW8gcHJvY2Vzc2VkIGh5YnJpZCBzdWJiYW5kIHNpZ25hbHMgbF9rKG4pIGFuZCByX2sobikgYXJlIGZlZCBpbnRvIHRoZQorICBoeWJyaWQgc3ludGhlc2lzIGZpbHRlcmJhbmtzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gdGhlIDY0IGNvbXBsZXggc3ludGhlc2lzCisgIGZpbHRlcmJhbmsgb2YgdGhlIFNCUiB0b29sLiBUaGUgaW5wdXQgdG8gdGhlIGZpbHRlcmJhbmsgYXJlIHNsb3RzIG9mIDY0IFFNRgorICBzYW1wbGVzLiBGb3IgZWFjaCBzbG90IHRoZSBmaWx0ZXJiYW5rIG91dHB1dHMgb25lIGJsb2NrIG9mIDY0IHNhbXBsZXMgb2Ygb25lCisgIHJlY29uc3RydWN0ZWQgc3RlcmVvIGNoYW5uZWwuIFRoZSBoeWJyaWQgc3ludGhlc2lzIGZpbHRlcmJhbmsgaXMgY29tcHV0ZWQKKyAgc2VwZXJhdGx5IGZvciB0aGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbC4KICAgKi8KIAotCi0gIC8qIGxlZnQgY2hhbm5lbCAqLwotICBzbG90QmFzZWRIeWJyaWRTeW50aGVzaXMgKCBoeWJyaWRSZWFsTGVmdCwgICAgICAgICAvKiBvbmUgdGltZXNsb3Qgb2YgaHlicmlkIGZpbHRlcmJhbmsgdmFsdWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBySW50QnVmZmVyTGVmdFswXSwgICAgICAvKiBvbmUgdGltZXNsb3Qgb2YgcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJbnRCdWZmZXJMZWZ0WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQgKTsgICAgICAvKiBoeWJyaWQgZmlsdGVyYmFuayBoYW5kbGUgICAgICAgICAgICAgICAgICovCi0KLSAgLyogcmlnaHQgY2hhbm5lbCAqLwotICBzbG90QmFzZWRIeWJyaWRTeW50aGVzaXMgKCBoeWJyaWRSZWFsUmlnaHQsICAgICAgICAvKiBvbmUgdGltZXNsb3Qgb2YgaHlicmlkIGZpbHRlcmJhbmsgdmFsdWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckludEJ1ZmZlclJpZ2h0LCAgICAgICAgLyogb25lIHRpbWVzbG90IG9mIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpSW50QnVmZmVyUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZCApOyAgICAgIC8qIGh5YnJpZCBmaWx0ZXJiYW5rIGhhbmRsZSAgICAgICAgICAgICAgICAgKi8KLQotCi0KLQotCi0KKyAgLyoKKyAgICogSHlicmlkIHN5bnRoZXNpcy4KKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICBGREtoeWJyaWRTeW50aGVzaXNBcHBseSgKKyAgICAgICAgJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZFN5bnRoZXNpc1tpXSwKKyAgICAgICAgaHlicmlkRGF0YVtpXVswXSwgLyogcmVhbCBoeWJyaWQgZGF0YSAqLworICAgICAgICBoeWJyaWREYXRhW2ldWzFdLCAvKiBpbWFnIGh5YnJpZCBkYXRhICovCisgICAgICAgIChpID09IDApID8gckludEJ1ZmZlckxlZnRbMF0KKyAgICAgICAgICAgICAgICAgOiBySW50QnVmZmVyUmlnaHQsIC8qIG91dHB1dCByZWFsIHFtZiBidWZmZXIgKi8KKyAgICAgICAgKGkgPT0gMCkgPyBpSW50QnVmZmVyTGVmdFswXQorICAgICAgICAgICAgICAgICA6IGlJbnRCdWZmZXJSaWdodCAvKiBvdXRwdXQgaW1hZyBxbWYgYnVmZmVyICovCisgICAgKTsKKyAgfQogCiAgIC8qIGZyZWUgdGVtcG9yYXJ5IGh5YnJpZCBxbWYgdmFsdWVzIG9mIG9uZSB0aW1lc2xvdCAqLwotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGh5YnJpZEltYWdSaWdodCwgRklYUF9EQkwsIE5PX1NVQl9RTUZfQ0hBTk5FTFMpOwotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGh5YnJpZFJlYWxSaWdodCwgRklYUF9EQkwsIE5PX1NVQl9RTUZfQ0hBTk5FTFMpOwotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGh5YnJpZEltYWdMZWZ0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7Ci0gIENfQUxMT0NfU0NSQVRDSF9FTkQoaHlicmlkUmVhbExlZnQsIEZJWFBfREJMLCBOT19TVUJfUU1GX0NIQU5ORUxTKTsKKyAgQ19BTExPQ19TQ1JBVENIX0VORChwSHlicmlkRGF0YSwgRklYUF9EQkwsIDQgKiBOT19IWUJSSURfREFUQV9CQU5EUyk7CiAKLX0vKiBFTkQgQXBwbHlQc1Nsb3QgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyohCi0KLSAgXGJyaWVmICBhc3NpZ25zIHRpbWVzbG90cyB0byBhbiBhcnJheQotCi0gIFxyZXR1cm4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYXNzaWduVGltZVNsb3RzUFMgKEZJWFBfREJMICpidWZBZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipidWZQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bVNsb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1DaGFuKQotewotICBGSVhQX0RCTCAgKnB0cjsKLSAgaW50IHNsb3Q7Ci0gIHB0ciA9IGJ1ZkFkcjsKLSAgZm9yKHNsb3Q9MDsgc2xvdCA8IG51bVNsb3RzOyBzbG90KyspIHsKLSAgIGJ1ZlB0ciBbc2xvdF0gPSBwdHI7Ci0gICAgcHRyICs9IG51bUNoYW47Ci0gIH0KLX0KLQorfSAvKiBFTkQgQXBwbHlQc1Nsb3QgKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvcHNkZWMuaCBiL2xpYlNCUmRlYy9zcmMvcHNkZWMuaAppbmRleCAzZGJjNzZkLi42YWUxNDczIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3BzZGVjLmgKKysrIGIvbGliU0JSZGVjL3NyYy9wc2RlYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE4ICs5MCwyNyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIFNiciBkZWNvZGVyICAKKyAgXGJyaWVmICBTYnIgZGVjb2RlcgogKi8KLSNpZm5kZWYgX19QU0RFQ19ICi0jZGVmaW5lIF9fUFNERUNfSAorI2lmbmRlZiBQU0RFQ19ICisjZGVmaW5lIFBTREVDX0gKIAogI2luY2x1ZGUgInNicmRlY29kZXIuaCIKKyNpbmNsdWRlICJGREtfaHlicmlkLmgiCiAKLQorI2luY2x1ZGUgIkZES19kZWNvcnJlbGF0ZS5oIgogCiAvKiBUaGlzIFBTIGRlY29kZXIgaW1wbGVtZW50cyB0aGUgYmFzZWxpbmUgdmVyc2lvbi4gU28gaXQgYWx3YXlzIHVzZXMgdGhlICAgICAqLwogLyogaHlicmlkIGZpbHRlciBzdHJ1Y3R1cmUgZm9yIDIwIHN0ZXJlbyBiYW5kcyBhbmQgZG9lcyBub3QgaW1wbGVtZXQgSVBEL09QRCAgKi8KQEAgLTk5LDI1NCArMTE5LDIxMSBAQAogLyogaXMgdXNlZCBpbiB0aGUgYml0c3RyZWFtIGZvciBJSVMvSUNDIHRoZSBkZWNvZGVkIHBhcmFtZXRlcnMgYXJlIG1hcHBlZCB0byAgKi8KIC8qIDIwIHN0ZXJlbyBiYW5kcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLQogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKIAotI2luY2x1ZGUgInBzZGVjX2h5YnJpZC5oIgorI2RlZmluZSBTQ0FMX0hFQURST09NICgyKQogCi0jZGVmaW5lIFNDQUxfSEVBRFJPT00gICAgICAgICAgICAgICAgICAgICAoIDIgKQorI2RlZmluZSBQU19FWFRFTlNJT05fU0laRV9CSVRTICg0KQorI2RlZmluZSBQU19FWFRFTlNJT05fRVNDX0NPVU5UX0JJVFMgKDgpCiAKLSNkZWZpbmUgUFNfRVhURU5TSU9OX1NJWkVfQklUUyAgICAgICAgICAgICggNCApCi0jZGVmaW5lIFBTX0VYVEVOU0lPTl9FU0NfQ09VTlRfQklUUyAgICAgICAoIDggKQorI2RlZmluZSBOT19RTUZfQ0hBTk5FTFMgKDY0KQorI2RlZmluZSBNQVhfTlVNX0NPTCAoMzIpCiAKLSNkZWZpbmUgTk9fUU1GX0NIQU5ORUxTICAgICAgICAgICAgICAgICAgICggNjQgKQotI2RlZmluZSBNQVhfTlVNX0NPTCAgICAgICAgICAgICAgICAgICAgICAgKCAzMiApCisjZGVmaW5lIE5PX1FNRl9CQU5EU19IWUJSSUQyMCAoMykKKyNkZWZpbmUgTk9fU1VCX1FNRl9DSEFOTkVMUyAoMTIpCisjZGVmaW5lIEhZQlJJRF9GSUxURVJfREVMQVkgKDYpCiAKKyNkZWZpbmUgTUFYX05PX1BTX0VOViAoNCArIDEpIC8qICsxIG5lZWRlZCBmb3IgVkFSX0JPUkRFUiAqLwogCi0gICNkZWZpbmUgTk9fUU1GX0JBTkRTX0hZQlJJRDIwICAgICAgICAgICAoIDMgICkKLSAgI2RlZmluZSBOT19TVUJfUU1GX0NIQU5ORUxTICAgICAgICAgICAgICggMTIgKQorI2RlZmluZSBOT19ISV9SRVNfQklOUyAoMzQpCisjZGVmaW5lIE5PX01JRF9SRVNfQklOUyAoMjApCisjZGVmaW5lIE5PX0xPV19SRVNfQklOUyAoMTApCiAKLSAgI2RlZmluZSBOUkdfSU5UX0NPRUZGICAgICAgICAgICAgICAgICAgICggMC43NWYgKQotICAjZGVmaW5lIElOVF9GSUxURVJfQ09FRkYgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKCAxLjBmIC0gTlJHX0lOVF9DT0VGRiApKQotICAjZGVmaW5lIFBFQUtfREVDQVlfRkFDVE9SICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKCAwLjc2NTkyODMzODM2NDY0OWYgKSkKLSAgI2RlZmluZSBUUkFOU0lFTlRfSU1QQUNUX0ZBQ1RPUiAgICAgICAgIChGTDJGWENPTlNUX0RCTCggMi4wIC8gMy4wICkpCisjZGVmaW5lIE5PX0hJX1JFU19JSURfQklOUyAoTk9fSElfUkVTX0JJTlMpCisjZGVmaW5lIE5PX0hJX1JFU19JQ0NfQklOUyAoTk9fSElfUkVTX0JJTlMpCiAKLSAgI2RlZmluZSBOT19TRVJJQUxfQUxMUEFTU19MSU5LUyAgICAgICAgICggMyApCi0gICNkZWZpbmUgTUFYX05PX1BTX0VOViAgICAgICAgICAgICAgICAgICAoIDQgKyAxICkgICAvKiArMSBuZWVkZWQgZm9yIFZBUl9CT1JERVIgKi8KKyNkZWZpbmUgTk9fTUlEX1JFU19JSURfQklOUyAoTk9fTUlEX1JFU19CSU5TKQorI2RlZmluZSBOT19NSURfUkVTX0lDQ19CSU5TIChOT19NSURfUkVTX0JJTlMpCiAKLSAgI2RlZmluZSBNQVhfREVMQVlfQlVGRkVSX1NJWkUgICAgICAgICAgICggMTQgKQotICAjZGVmaW5lIE5PX0RFTEFZX0JVRkZFUl9CQU5EUyAgICAgICAgICAgKCAzNSApCisjZGVmaW5lIE5PX0xPV19SRVNfSUlEX0JJTlMgKE5PX0xPV19SRVNfQklOUykKKyNkZWZpbmUgTk9fTE9XX1JFU19JQ0NfQklOUyAoTk9fTE9XX1JFU19CSU5TKQogCi0gICNkZWZpbmUgTk9fSElfUkVTX0JJTlMgICAgICAgICAgICAgICAgICAoIDM0ICkKLSAgI2RlZmluZSBOT19NSURfUkVTX0JJTlMgICAgICAgICAgICAgICAgICggMjAgKQotICAjZGVmaW5lIE5PX0xPV19SRVNfQklOUyAgICAgICAgICAgICAgICAgKCAxMCApCisjZGVmaW5lIFNVQlFNRl9HUk9VUFMgKDEwKQorI2RlZmluZSBRTUZfR1JPVVBTICgxMikKIAotICAjZGVmaW5lIEZJUlNUX0RFTEFZX1NCICAgICAgICAgICAgICAgICAgKCAyMyApCi0gICNkZWZpbmUgTk9fU0FNUExFX0RFTEFZX0FMTFBBU1MgICAgICAgICAoIDIgKQotICAjZGVmaW5lIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTICAgICAgICAgKCAxMiApICAgICAvKiBkKG0pOiBkKDApPTMgKyBkKDEpPTQgKyBkKDIpPTUgKi8KKy8vI2RlZmluZSBTVUJRTUZfR1JPVVBTX0hJX1JFUyAgICAgICAgICAgICggMzIgKQorLy8jZGVmaW5lIFFNRl9HUk9VUFNfSElfUkVTICAgICAgICAgICAgICAgKCAxOCApCiAKLSAgI2RlZmluZSBOT19ISV9SRVNfSUlEX0JJTlMgICAgICAgICAgICAgICggTk9fSElfUkVTX0JJTlMgKQotICAjZGVmaW5lIE5PX0hJX1JFU19JQ0NfQklOUyAgICAgICAgICAgICAgKCBOT19ISV9SRVNfQklOUyApCisjZGVmaW5lIE5PX0lJRF9HUk9VUFMgKFNVQlFNRl9HUk9VUFMgKyBRTUZfR1JPVVBTKQorLy8jZGVmaW5lIE5PX0lJRF9HUk9VUFNfSElfUkVTICAgICAgICAgICAgKCBTVUJRTUZfR1JPVVBTX0hJX1JFUyArCisvLyBRTUZfR1JPVVBTX0hJX1JFUyApCiAKLSAgI2RlZmluZSBOT19NSURfUkVTX0lJRF9CSU5TICAgICAgICAgICAgICggTk9fTUlEX1JFU19CSU5TICkKLSAgI2RlZmluZSBOT19NSURfUkVTX0lDQ19CSU5TICAgICAgICAgICAgICggTk9fTUlEX1JFU19CSU5TICkKKyNkZWZpbmUgTk9fSUlEX1NURVBTICg3KSAgICAgICAvKiAxIC4uICsgNyAqLworI2RlZmluZSBOT19JSURfU1RFUFNfRklORSAoMTUpIC8qIDEgLi4gKzE1ICovCisjZGVmaW5lIE5PX0lDQ19TVEVQUyAoOCkgICAgICAgLyogMCAuLiArIDcgKi8KIAotICAjZGVmaW5lIE5PX0xPV19SRVNfSUlEX0JJTlMgICAgICAgICAgICAgKCBOT19MT1dfUkVTX0JJTlMgKQotICAjZGVmaW5lIE5PX0xPV19SRVNfSUNDX0JJTlMgICAgICAgICAgICAgKCBOT19MT1dfUkVTX0JJTlMgKQorI2RlZmluZSBOT19JSURfTEVWRUxTICgyICogTk9fSUlEX1NURVBTICsgMSkgICAgICAgICAgIC8qIC0gNyAuLiAgKyA3ICovCisjZGVmaW5lIE5PX0lJRF9MRVZFTFNfRklORSAoMiAqIE5PX0lJRF9TVEVQU19GSU5FICsgMSkgLyogLTE1IC4uICArMTUgKi8KKyNkZWZpbmUgTk9fSUNDX0xFVkVMUyAoTk9fSUNDX1NURVBTKSAgICAgICAgICAgICAgICAgICAvKiAgIDAgLi4gICsgNyAqLwogCi0gICNkZWZpbmUgU1VCUU1GX0dST1VQUyAgICAgICAgICAgICAgICAgICAoIDEwICkKLSAgI2RlZmluZSBRTUZfR1JPVVBTICAgICAgICAgICAgICAgICAgICAgICggMTIgKQorI2RlZmluZSBGSVhQX1NRUlQwNSAoKEZJWFBfREJMKTB4NWE4Mjc5ODApIC8qIDEvU1FSVDIgKi8KIAotICAjZGVmaW5lIFNVQlFNRl9HUk9VUFNfSElfUkVTICAgICAgICAgICAgKCAzMiApCi0gICNkZWZpbmUgUU1GX0dST1VQU19ISV9SRVMgICAgICAgICAgICAgICAoIDE4ICkKK3N0cnVjdCBQU19ERUNfQ09FRkZJQ0lFTlRTIHsKKyAgRklYUF9EQkwgSDExcltOT19JSURfR1JPVVBTXTsgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAqLworICBGSVhQX0RCTCBIMTJyW05PX0lJRF9HUk9VUFNdOyAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICovCisgIEZJWFBfREJMIEgyMXJbTk9fSUlEX0dST1VQU107IC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgKi8KKyAgRklYUF9EQkwgSDIycltOT19JSURfR1JPVVBTXTsgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAqLwogCi0gICNkZWZpbmUgTk9fSUlEX0dST1VQUyAgICAgICAgICAgICAgICAgICAoIFNVQlFNRl9HUk9VUFMgKyBRTUZfR1JPVVBTICkKLSAgI2RlZmluZSBOT19JSURfR1JPVVBTX0hJX1JFUyAgICAgICAgICAgICggU1VCUU1GX0dST1VQU19ISV9SRVMgKyBRTUZfR1JPVVBTX0hJX1JFUyApCisgIEZJWFBfREJMCisgIERlbHRhSDExcltOT19JSURfR1JPVVBTXTsgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAqLworICBGSVhQX0RCTAorICBEZWx0YUgxMnJbTk9fSUlEX0dST1VQU107IC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgKi8KKyAgRklYUF9EQkwKKyAgRGVsdGFIMjFyW05PX0lJRF9HUk9VUFNdOyAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICovCisgIEZJWFBfREJMCisgIERlbHRhSDIycltOT19JSURfR1JPVVBTXTsgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAqLwogCi0gICNkZWZpbmUgTk9fSUlEX1NURVBTICAgICAgICAgICAgICAgICAgICAoIDcgKSAgLyogMSAuLiArIDcgKi8KLSAgI2RlZmluZSBOT19JSURfU1RFUFNfRklORSAgICAgICAgICAgICAgICggMTUgKSAvKiAxIC4uICsxNSAqLwotICAjZGVmaW5lIE5PX0lDQ19TVEVQUyAgICAgICAgICAgICAgICAgICAgKCA4ICkgIC8qIDAgLi4gKyA3ICovCisgIFNDSEFSCisgIGFhSWlkSW5kZXhNYXBwZWRbTUFYX05PX1BTX0VOVl0KKyAgICAgICAgICAgICAgICAgIFtOT19ISV9SRVNfSUlEX0JJTlNdOyAvKiE8IFRoZSBtYXBwZWQgSUlEIGluZGV4IGZvciBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZXMgYW5kIGFsbCBJSUQgYmlucyAqLworICBTQ0hBUgorICBhYUljY0luZGV4TWFwcGVkW01BWF9OT19QU19FTlZdCisgICAgICAgICAgICAgICAgICBbTk9fSElfUkVTX0lDQ19CSU5TXTsgLyohPCBUaGUgbWFwcGVkIElDQyBpbmRleCBmb3IgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVzIGFuZCBhbGwgSUNDIGJpbnMgKi8KK307CiAKLSAgI2RlZmluZSBOT19JSURfTEVWRUxTICAgICAgICAgICAgICAgICAgICggMiAqIE5PX0lJRF9TVEVQUyArIDEgKSAgICAgIC8qIC0gNyAuLiAgKyA3ICovCi0gICNkZWZpbmUgTk9fSUlEX0xFVkVMU19GSU5FICAgICAgICAgICAgICAoIDIgKiBOT19JSURfU1RFUFNfRklORSArIDEgKSAvKiAtMTUgLi4gICsxNSAqLwotICAjZGVmaW5lIE5PX0lDQ19MRVZFTFMgICAgICAgICAgICAgICAgICAgKCBOT19JQ0NfU1RFUFMgKSAgICAgICAgICAgICAgLyogICAwIC4uICArIDcgKi8KLQotICAjZGVmaW5lIEZJWFBfU1FSVDA1ICAgICAgICAgICAgICAgICAgICAgKChGSVhQX0RCTCkweDVhODI3OTgwKSAvKiAxL1NRUlQyICovCi0KLSAgc3RydWN0IFBTX0RFQ19DT0VGRklDSUVOVFMgewotCi0gICAgRklYUF9EQkwgSDExcltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGSVhQX0RCTCBIMTJyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZJWFBfREJMIEgyMXJbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRklYUF9EQkwgSDIycltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIEZJWFBfREJMIERlbHRhSDExcltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRklYUF9EQkwgRGVsdGFIMTJyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGSVhQX0RCTCBEZWx0YUgyMXJbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZJWFBfREJMIERlbHRhSDIycltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBTQ0hBUiBhYUlpZEluZGV4TWFwcGVkW01BWF9OT19QU19FTlZdW05PX0hJX1JFU19JSURfQklOU107ICAgICAgIC8qITwgVGhlIG1hcHBlZCBJSUQgaW5kZXggZm9yIGFsbCBlbnZlbG9wZXMgYW5kIGFsbCBJSUQgYmlucyAqLwotICAgIFNDSEFSIGFhSWNjSW5kZXhNYXBwZWRbTUFYX05PX1BTX0VOVl1bTk9fSElfUkVTX0lDQ19CSU5TXTsgICAgICAgLyohPCBUaGUgbWFwcGVkIElDQyBpbmRleCBmb3IgYWxsIGVudmVsb3BlcyBhbmQgYWxsIElDQyBiaW5zICovCi0KLSAgfTsKLQotCi0KLQotdHlwZWRlZiBlbnVtIHsKLSAgcHB0X25vbmUgPSAwLAotICBwcHRfbXBlZyA9IDEsCi0gIHBwdF9kcm0gID0gMgotfSBQU19QQVlMT0FEX1RZUEU7Ci0KK3R5cGVkZWYgZW51bSB7IHBwdF9ub25lID0gMCwgcHB0X21wZWcgPSAxLCBwcHRfZHJtID0gMiB9IFBTX1BBWUxPQURfVFlQRTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICBVQ0hBUiBiUHNIZWFkZXJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgc2V0IGlmIG5ldyBoZWFkZXIgaXMgYXZhaWxhYmxlIGZyb20gYml0c3RyZWFtICAgICAgICAgICAgICAgICAqLworICBVQ0hBUiBiUHNIZWFkZXJWYWxpZDsgLyohPCBzZXQgaWYgbmV3IGhlYWRlciBpcyBhdmFpbGFibGUgZnJvbSBiaXRzdHJlYW0gKi8KIAotICBVQ0hBUiBiRW5hYmxlSWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT25lIGJpdCBkZW5vdGluZyB0aGUgcHJlc2VuY2Ugb2YgSUlEIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAqLwotICBVQ0hBUiBiRW5hYmxlSWNjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT25lIGJpdCBkZW5vdGluZyB0aGUgcHJlc2VuY2Ugb2YgSUNDIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAqLwotICBVQ0hBUiBiRW5hYmxlRXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIFBTIGV4dGVuc2lvbiBsYXllciBpcyBlbmFibGVkIHVzaW5nIHRoZSBlbmFibGVfZXh0IGJpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGl0IGlzIHNldCB0byAlMSB0aGUgSVBEIGFuZCBPUEQgcGFyYW1ldGVycyBhcmUgc2VudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGl0IGlzIGRpc2FibGVkLCBpLmUuICUwLCB0aGUgZXh0ZW5zaW9uIGxheWVyIGlzIHNraXBwZWQuICAgKi8KKyAgVUNIQVIgYkVuYWJsZUlpZDsgLyohPCBPbmUgYml0IGRlbm90aW5nIHRoZSBwcmVzZW5jZSBvZiBJSUQgcGFyYW1ldGVycyAqLworICBVQ0hBUiBiRW5hYmxlSWNjOyAvKiE8IE9uZSBiaXQgZGVub3RpbmcgdGhlIHByZXNlbmNlIG9mIElDQyBwYXJhbWV0ZXJzICovCisgIFVDSEFSIGJFbmFibGVFeHQ7IC8qITwgVGhlIFBTIGV4dGVuc2lvbiBsYXllciBpcyBlbmFibGVkIHVzaW5nIHRoZSBlbmFibGVfZXh0CisgICAgICAgICAgICAgICAgICAgICAgIGJpdC4gSWYgaXQgaXMgc2V0IHRvICUxIHRoZSBJUEQgYW5kIE9QRCBwYXJhbWV0ZXJzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICBzZW50LiBJZiBpdCBpcyBkaXNhYmxlZCwgaS5lLiAlMCwgdGhlIGV4dGVuc2lvbiBsYXllciBpcworICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkLiAgICovCiAKLSAgVUNIQVIgbW9kZUlpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBjb25maWd1cmF0aW9uIG9mIElJRCBwYXJhbWV0ZXJzIChudW1iZXIgb2YgYmFuZHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGlzYXRpb24gZ3JpZCwgaWlkX3F1YW50KSBpcyBkZXRlcm1pbmVkIGJ5IGlpZF9tb2RlLiAgICAgICovCi0gIFVDSEFSIG1vZGVJY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgY29uZmlndXJhdGlvbiBvZiBJbnRlci1jaGFubmVsIENvaGVyZW5jZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVtYmVyIG9mIGJhbmRzIGFuZCBxdWFudGlzYXRpb24gZ3JpZCkgaXMgZGV0ZXJtaW5lZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX21vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBVQ0hBUgorICBtb2RlSWlkOyAgICAgICAvKiE8IFRoZSBjb25maWd1cmF0aW9uIG9mIElJRCBwYXJhbWV0ZXJzIChudW1iZXIgb2YgYmFuZHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpc2F0aW9uIGdyaWQsIGlpZF9xdWFudCkgaXMgZGV0ZXJtaW5lZCBieSBpaWRfbW9kZS4gICAqLworICBVQ0hBUiBtb2RlSWNjOyAvKiE8IFRoZSBjb25maWd1cmF0aW9uIG9mIEludGVyLWNoYW5uZWwgQ29oZXJlbmNlIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAobnVtYmVyIG9mIGJhbmRzIGFuZCBxdWFudGlzYXRpb24gZ3JpZCkgaXMgZGV0ZXJtaW5lZCBieQorICAgICAgICAgICAgICAgICAgICAgIGljY19tb2RlLiAqLwogCi0gIFVDSEFSIGZyZXFSZXNJaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAwPWxvdywgMT1taWQgb3IgMj1oaWdoIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBpaWQgICAgICAgICAgICovCi0gIFVDSEFSIGZyZXFSZXNJY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAwPWxvdywgMT1taWQgb3IgMj1oaWdoIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBpY2MgICAgICAgICAgICovCisgIFVDSEFSIGZyZXFSZXNJaWQ7IC8qITwgMD1sb3csIDE9bWlkIG9yIDI9aGlnaCBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgaWlkICovCisgIFVDSEFSIGZyZXFSZXNJY2M7IC8qITwgMD1sb3csIDE9bWlkIG9yIDI9aGlnaCBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgaWNjICovCiAKLSAgVUNIQVIgYkZpbmVJaWRROyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVzZSBmaW5lIElpZCBxdWFudGlzYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUNIQVIgYkZpbmVJaWRROyAvKiE8IFVzZSBmaW5lIElpZCBxdWFudGlzYXRpb24uICovCiAKLSAgVUNIQVIgYkZyYW1lQ2xhc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBmcmFtZV9jbGFzcyBiaXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9ucyBvZiB0aGUgY3VycmVudCBmcmFtZSBhcmUgdW5pZm9ybWx5IHNwYWNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjcm9zcyB0aGUgZnJhbWUgb3IgdGhleSBhcmUgZGVmaW5lZCB1c2luZyB0aGUgcG9zaXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliZWQgYnkgYm9yZGVyX3Bvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVDSEFSIGJGcmFtZUNsYXNzOyAvKiE8IFRoZSBmcmFtZV9jbGFzcyBiaXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zIG9mIHRoZSBjdXJyZW50IGZyYW1lIGFyZSB1bmlmb3JtbHkgc3BhY2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3Jvc3MgdGhlIGZyYW1lIG9yIHRoZXkgYXJlIGRlZmluZWQgdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbnMgZGVzY3JpYmVkIGJ5IGJvcmRlcl9wb3NpdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gIFVDSEFSIG5vRW52OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIGVudmVsb3BlcyBwZXIgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFVDSEFSIGFFbnZTdGFydFN0b3BbTUFYX05PX1BTX0VOVisxXTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbiBjYXNlIG9mIHZhcmlhYmxlIHBhcmFtZXRlciBzcGFjaW5nIHRoZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSBib3JkZXJfcG9zaXRpb24gICAgICAgICAgICAgICAgICAgKi8KKyAgVUNIQVIgbm9FbnY7IC8qITwgVGhlIG51bWJlciBvZiBlbnZlbG9wZXMgcGVyIGZyYW1lICovCisgIFVDSEFSIGFFbnZTdGFydFN0b3BbTUFYX05PX1BTX0VOViArIDFdOyAvKiE8IEluIGNhc2Ugb2YgdmFyaWFibGUgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nIHRoZSBwYXJhbWV0ZXIgcG9zaXRpb25zIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lZCBieSBib3JkZXJfcG9zaXRpb24gKi8KIAotICBTQ0hBUiBhYklpZER0RmxhZ1tNQVhfTk9fUFNfRU5WXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGVsdGFjb2RpbmcgdGltZS9mcmVxIGZsYWcgZm9yIElJRCwgMCA9PiBmcmVxICAgICAgICAgICAqLwotICBTQ0hBUiBhYkljY0R0RmxhZ1tNQVhfTk9fUFNfRU5WXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGVsdGFjb2RpbmcgdGltZS9mcmVxIGZsYWcgZm9yIElDQywgMCA9PiBmcmVxICAgICAgICAgICAqLworICBTQ0hBUiBhYklpZER0RmxhZ1tNQVhfTk9fUFNfRU5WXTsgLyohPCBEZWx0YWNvZGluZyB0aW1lL2ZyZXEgZmxhZyBmb3IgSUlELCAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBmcmVxICAgICAgICAgICAqLworICBTQ0hBUiBhYkljY0R0RmxhZ1tNQVhfTk9fUFNfRU5WXTsgLyohPCBEZWx0YWNvZGluZyB0aW1lL2ZyZXEgZmxhZyBmb3IgSUNDLCAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBmcmVxICAgICAgICAgICAqLwogCi0gIFNDSEFSIGFhSWlkSW5kZXhbTUFYX05PX1BTX0VOVl1bTk9fSElfUkVTX0lJRF9CSU5TXTsgICAgICAgICAgICAgLyohPCBUaGUgSUlEIGluZGV4IGZvciBhbGwgZW52ZWxvcGVzIGFuZCBhbGwgSUlEIGJpbnMgICAgICAgICovCi0gIFNDSEFSIGFhSWNjSW5kZXhbTUFYX05PX1BTX0VOVl1bTk9fSElfUkVTX0lDQ19CSU5TXTsgICAgICAgICAgICAgLyohPCBUaGUgSUNDIGluZGV4IGZvciBhbGwgZW52ZWxvcGVzIGFuZCBhbGwgSUNDIGJpbnMgICAgICAgICovCisgIFNDSEFSCisgIGFhSWlkSW5kZXhbTUFYX05PX1BTX0VOVl0KKyAgICAgICAgICAgIFtOT19ISV9SRVNfSUlEX0JJTlNdOyAvKiE8IFRoZSBJSUQgaW5kZXggZm9yIGFsbCBlbnZlbG9wZXMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIElJRCBiaW5zICAgICAgICAqLworICBTQ0hBUgorICBhYUljY0luZGV4W01BWF9OT19QU19FTlZdCisgICAgICAgICAgICBbTk9fSElfUkVTX0lDQ19CSU5TXTsgLyohPCBUaGUgSUNDIGluZGV4IGZvciBhbGwgZW52ZWxvcGVzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBJQ0MgYmlucyAgICAgICAgKi8KIAogfSBNUEVHX1BTX0JTX0RBVEE7CiAKLQotCiBzdHJ1Y3QgUFNfREVDIHsKLQogICBTQ0hBUiBub1N1YlNhbXBsZXM7CiAgIFNDSEFSIG5vQ2hhbm5lbHM7CiAKLSAgU0NIQVIgcHJvY0ZyYW1lQmFzZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhlbHBlciB0byBkZXRlY3RlZCBzd2l0Y2hpbmcgZnJvbSBmcmFtZSBiYXNlZCB0byBzbG90IGJhc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSIHByb2NGcmFtZUJhc2VkOyAvKiE8IEhlbHBlciB0byBkZXRlY3RlZCBzd2l0Y2hpbmcgZnJvbSBmcmFtZSBiYXNlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCBiYXNlZCBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotICBQU19QQVlMT0FEX1RZUEUgYlBzRGF0YUF2YWlsWygxKSsxXTsgICAvKiE8IHNldCBpZiBuZXcgZGF0YSBhdmFpbGFibGUgZnJvbSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVUNIQVIgcHNEZWNvZGVkUHJ2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHNldCBpZiBQUyBoYXMgYmVlbiBwcm9jZXNzZWQgaW4gdGhlIGxhc3QgZnJhbWUgICAgICAgICAgICAgICAgKi8KKyAgUFNfUEFZTE9BRF9UWVBFCisgIGJQc0RhdGFBdmFpbFsoMSkgKyAxXTsgLyohPCBzZXQgaWYgbmV3IGRhdGEgYXZhaWxhYmxlIGZyb20gYml0c3RyZWFtICovCisgIFVDSEFSIHBzRGVjb2RlZFBydjsgICAgLyohPCBzZXQgaWYgUFMgaGFzIGJlZW4gcHJvY2Vzc2VkIGluIHRoZSBsYXN0IGZyYW1lICovCiAKICAgLyogaGVscGVycyBmb3IgZnJhbWUgZGVsYXkgbGluZSAqLwotICBVQ0hBUiBic0xhc3RTbG90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5kZXggb2YgbGFzdCByZWFkIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBVQ0hBUiBic1JlYWRTbG90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5kZXggb2YgY3VycmVudCByZWFkIHNsb3QgZm9yIGFkZGl0aW9uYWwgZGVsYXkuICAgICAgICAgICAgICAqLwotICBVQ0hBUiBwcm9jZXNzU2xvdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5kZXggb2YgY3VycmVudCBzbG90IGZvciBwcm9jZXNzaW5nIChuZWVkIGZvciBhZGQuIGRlbGF5KS4gICAqLworICBVQ0hBUiBic0xhc3RTbG90OyAgLyohPCBJbmRleCBvZiBsYXN0IHJlYWQgc2xvdC4gICovCisgIFVDSEFSIGJzUmVhZFNsb3Q7ICAvKiE8IEluZGV4IG9mIGN1cnJlbnQgcmVhZCBzbG90IGZvciBhZGRpdGlvbmFsIGRlbGF5LiAgKi8KKyAgVUNIQVIgcHJvY2Vzc1Nsb3Q7IC8qITwgSW5kZXggb2YgY3VycmVudCBzbG90IGZvciBwcm9jZXNzaW5nIChuZWVkIGZvciBhZGQuCisgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSkuICAgKi8KIAorICB1bmlvbiB7IC8qIEJpdHN0cmVhbSBkYXRhICovCisgICAgTVBFR19QU19CU19EQVRBCisgICAgbXBlZzsgLyohPCBTdHJ1Y3QgY29udGFpbmluZyBhbGwgTVBFRyBzcGVjaWZpYyBQUyBkYXRhIGZyb20gYml0c3RyZWFtLgorICAgICAgICAgICAqLworICB9IGJzRGF0YVsoMSkgKyAxXTsKIAotICBJTlQgIHJlc2NhbDsKLSAgSU5UICBzZl9JbnRCdWZmZXI7Ci0KLSAgdW5pb24geyAgLyogQml0c3RyZWFtIGRhdGEgKi8KLSAgICBNUEVHX1BTX0JTX0RBVEEgIG1wZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN0cnVjdCBjb250YWluaW5nIGFsbCBNUEVHIHNwZWNpZmljIFBTIGRhdGEgZnJvbSBiaXRzdHJlYW0uICAgKi8KLSAgfSBic0RhdGFbKDEpKzFdOwotCi0gIHNob3VsZEJlVW5pb24geyAgLyogU3RhdGljIGRhdGEgKi8KKyAgc2hvdWxkQmVVbmlvbiB7IC8qIFN0YXRpYyBkYXRhICovCiAgICAgc3RydWN0IHsKLSAgICAgIFNDSEFSIGFJaWRQcmV2RnJhbWVJbmRleFtOT19ISV9SRVNfSUlEX0JJTlNdOyAgICAgICAgICAvKiE8IFRoZSBJSUQgaW5kZXggZm9yIHByZXZpb3VzIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIFNDSEFSIGFJY2NQcmV2RnJhbWVJbmRleFtOT19ISV9SRVNfSUNDX0JJTlNdOyAgICAgICAgICAvKiE8IFRoZSBJQ0MgaW5kZXggZm9yIHByZXZpb3VzIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIFNDSEFSIGFJaWRQcmV2RnJhbWVJbmRleFtOT19ISV9SRVNfSUlEX0JJTlNdOyAvKiE8IFRoZSBJSUQgaW5kZXggZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgIFNDSEFSIGFJY2NQcmV2RnJhbWVJbmRleFtOT19ISV9SRVNfSUNDX0JJTlNdOyAvKiE8IFRoZSBJQ0MgaW5kZXggZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgIFVDSEFSCisgICAgICBiUHJldkZyYW1lRmluZUlpZFE7IC8qITwgVGhlIElJRCBxdWFudGl6YXRpb24gb2YgdGhlIHByZXZpb3VzIGZyYW1lICovCisgICAgICBVQ0hBUiBsYXN0VXNiOyAvKiE8IHVwcGVybW9zdCBXTUYgZGVsYXkgYmFuZCBvZiBsYXN0IGZyYW1lICAgICAgICAgICovCiAKLSAgICAgIFVDSEFSIGRlbGF5QnVmSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gd2hlcmUgdGhlIGxhdGVzdCBzYW1wbGUgaXMgaW4gYnVmZmVyICAgICAgICAgKi8KLSAgICAgIFVDSEFSIG5vU2FtcGxlRGVsYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhvdyBtYW55IFFNRiBzYW1wbGVzIGRlbGF5IGlzIHVzZWQuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIFVDSEFSIGxhc3RVc2I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHVwcGVybW9zdCBXTUYgZGVsYXkgYmFuZCBvZiBsYXN0IGZyYW1lICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIEZJWFBfREJMIHBIeWJyaWRBbmFTdGF0ZXNMRmRteAorICAgICAgICAgIFsyICogMTMgKiBOT19RTUZfQkFORFNfSFlCUklEMjBdOyAvKiE8IE1lbW9yeSB1c2VkIGluIGh5YnJpZCBhbmFseXNpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaWx0ZXIgc3RhdGVzLiAqLworICAgICAgRkRLX0FOQV9IWUJfRklMVEVSIGh5YnJpZEFuYWx5c2lzOworICAgICAgRkRLX1NZTl9IWUJfRklMVEVSIGh5YnJpZFN5bnRoZXNpc1syXTsKIAotICAgICAgVUNIQVIgYURlbGF5UkJ1ZkluZGV4U2VyW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsgICAgICAgICAgICAgLyohPCBEZWxheSBidWZmZXIgZm9yIHJldmVyYiBmaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgVUNIQVIgYURlbGF5QnVmSW5kZXhEZWxheVFtZltOT19RTUZfQ0hBTk5FTFMtRklSU1RfREVMQVlfU0JdOyAgLyohPCBEZWxheSBidWZmZXIgZm9yIElDQyBncm91cCAyMCAmIDIxICAgICAgICAgICAgICAgICAgICAqLworICAgICAgREVDT1JSX0RFQyBhcERlY29yOyAvKiE8IERlY29ycmVsYXRvciBpbnN0YW5jZS4gKi8KKyAgICAgIEZJWFBfREJMIGRlY29yckJ1ZmZlckNwbHhbKDIgKiAoKDgyNSkgKyAoMzczKSkpXTsKIAotICAgICAgU0NIQVIgc2NhbGVGYWN0b3JQc0RlbGF5QnVmZmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTY2FsZSBmYWN0b3IgZm9yIHBzIGRlbGF5IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgRklYUF9EQkwgaDExclByZXZbTk9fSUlEX0dST1VQU107IC8qITwgcHJldmlvdXMgY2FsY3VsYXRlZCBoKHh5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50cyAqLworICAgICAgRklYUF9EQkwgaDEyclByZXZbTk9fSUlEX0dST1VQU107IC8qITwgcHJldmlvdXMgY2FsY3VsYXRlZCBoKHh5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50cyAqLworICAgICAgRklYUF9EQkwgaDIxclByZXZbTk9fSUlEX0dST1VQU107IC8qITwgcHJldmlvdXMgY2FsY3VsYXRlZCBoKHh5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50cyAqLworICAgICAgRklYUF9EQkwgaDIyclByZXZbTk9fSUlEX0dST1VQU107IC8qITwgcHJldmlvdXMgY2FsY3VsYXRlZCBoKHh5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50cyAqLwogCi0gICAgICAvKiBoeWJyaWQgZmlsdGVyIGJhbmsgZGVsYXkgbGluZXMgKi8KLSAgICAgIEZJWFBfREJMIGFhUW1mRGVsYXlCdWZSZWFsWyhOT19RTUZfQ0hBTk5FTFMtRklSU1RfREVMQVlfU0IpICsgKE1BWF9ERUxBWV9CVUZGRVJfU0laRS0xKSooTk9fREVMQVlfQlVGRkVSX0JBTkRTLUZJUlNUX0RFTEFZX1NCKV07Ci0gICAgICBGSVhQX0RCTCBhYVFtZkRlbGF5QnVmSW1hZ1soTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCKSArIChNQVhfREVMQVlfQlVGRkVSX1NJWkUtMSkqKE5PX0RFTEFZX0JVRkZFUl9CQU5EUy1GSVJTVF9ERUxBWV9TQildOwotCi0gICAgICBGSVhQX0RCTCAqcEFhUmVhbERlbGF5QnVmZmVyUW1mW01BWF9ERUxBWV9CVUZGRVJfU0laRV07ICAgICAgICAgIC8qITwgUmVhbCBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgRklYUF9EQkwgKnBBYUltYWdEZWxheUJ1ZmZlclFtZltNQVhfREVMQVlfQlVGRkVSX1NJWkVdOyAgICAgICAgICAvKiE8IEltYWdpbmFyeSBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgRklYUF9EQkwgYWFSZWFsRGVsYXlCdWZmZXJRbWZbTk9fU0FNUExFX0RFTEFZX0FMTFBBU1NdW0ZJUlNUX0RFTEFZX1NCXTsgLyohPCBSZWFsIHBhcnQgZGVsYXkgYnVmZmVyICAgICAqLwotICAgICAgRklYUF9EQkwgYWFJbWFnRGVsYXlCdWZmZXJRbWZbTk9fU0FNUExFX0RFTEFZX0FMTFBBU1NdW0ZJUlNUX0RFTEFZX1NCXTsgLyohPCBJbWFnaW5hcnkgcGFydCBkZWxheSBidWZmZXIqLwotCi0gICAgICBGSVhQX0RCTCBhYVJlYWxEZWxheUJ1ZmZlclN1YlFtZltOT19TQU1QTEVfREVMQVlfQUxMUEFTU11bTk9fU1VCX1FNRl9DSEFOTkVMU107ICAgICAgICAgIC8qITwgUmVhbCBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgICAgICAqLwotICAgICAgRklYUF9EQkwgYWFJbWFnRGVsYXlCdWZmZXJTdWJRbWZbTk9fU0FNUExFX0RFTEFZX0FMTFBBU1NdW05PX1NVQl9RTUZfQ0hBTk5FTFNdOyAgICAgICAgICAvKiE8IEltYWdpbmFyeSBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgKi8KLQotICAgICAgRklYUF9EQkwgYWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZltGSVJTVF9ERUxBWV9TQl1bTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlNdOyAgICAgICAgICAgICAvKiE8IFJlYWwgcGFydCBkZWxheSBidWZmZXIgICAgICAgICAgKi8KLSAgICAgIEZJWFBfREJMIGFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbRklSU1RfREVMQVlfU0JdW05PX0RFTEFZX0xFTkdUSF9WRUNUT1JTXTsgICAgICAgICAgICAgLyohPCBJbWFnaW5hcnkgcGFydCBkZWxheSBidWZmZXIgICAgICovCi0KLSAgICAgIEZJWFBfREJMIGFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWZbTk9fU1VCX1FNRl9DSEFOTkVMU11bTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlNdOyAgICAgLyohPCBSZWFsIHBhcnQgZGVsYXkgYnVmZmVyICAgICAgICAgICovCi0gICAgICBGSVhQX0RCTCBhYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX0RFTEFZX0xFTkdUSF9WRUNUT1JTXTsgICAgIC8qITwgSW1hZ2luYXJ5IHBhcnQgZGVsYXkgYnVmZmVyICAgICAqLwotCi0gICAgICBIWUJSSUQgaHlicmlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBoeWJyaWQgZmlsdGVyIGJhbmsgc3RydWN0IDEgb3IgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIEZJWFBfREJMIGFQcmV2TnJnQmluW05PX01JRF9SRVNfQklOU107ICAgICAgICAgICAgICAvKiE8IGVuZXJneSBvZiBwcmV2aW91cyBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBGSVhQX0RCTCBhUHJldlBlYWtEaWZmQmluW05PX01JRF9SRVNfQklOU107ICAgICAgICAgLyohPCBwZWFrIGRpZmZlcmVuY2Ugb2YgcHJldmlvdXMgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgRklYUF9EQkwgYVBlYWtEZWNheUZhc3RCaW5bTk9fTUlEX1JFU19CSU5TXTsgICAgICAgIC8qITwgU2F2ZWQgbWF4LiBwZWFrIGRlY2F5IHZhbHVlIHBlciBiaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIFNDSEFSIGFQb3dlclByZXZTY2FsW05PX01JRF9SRVNfQklOU107ICAgICAgICAgICAgICAvKiE8IExhc3QgcG93ZXIgdmFsdWUgKGVhY2ggYmluKSBvZiBwcmV2aW91cyBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIEZJWFBfREJMIGgxMXJQcmV2W05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAvKiE8IHByZXZpb3VzIGNhbGN1bGF0ZWQgaCh4eSkgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBGSVhQX0RCTCBoMTJyUHJldltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAgLyohPCBwcmV2aW91cyBjYWxjdWxhdGVkIGgoeHkpIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgRklYUF9EQkwgaDIxclByZXZbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgIC8qITwgcHJldmlvdXMgY2FsY3VsYXRlZCBoKHh5KSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIEZJWFBfREJMIGgyMnJQcmV2W05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAvKiE8IHByZXZpb3VzIGNhbGN1bGF0ZWQgaCh4eSkgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIFBTX0RFQ19DT0VGRklDSUVOVFMgIGNvZWY7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgdGVtcG9yYWwgY29lZmZpY2llbnRzIChyZXVzYWJsZSBzY3JhdGNoIG1lbW9yeSkgICAgICAgICAgICAgICAgICovCisgICAgICBQU19ERUNfQ09FRkZJQ0lFTlRTCisgICAgICAqcENvZWY7IC8qITwgdGVtcG9yYWwgY29lZmZpY2llbnRzIGFyZSBvbiByZXVzYWJsZSBzY3JhdGNoIG1lbW9yeSAqLwogCiAgICAgfSBtcGVnOwotCi0gIH0gc3BlY2lmaWNUbzsKLQotCisgIH0KKyAgc3BlY2lmaWNUbzsKIH07CiAKIHR5cGVkZWYgc3RydWN0IFBTX0RFQyAqSEFORExFX1BTX0RFQzsKIAotCiBpbnQgQ3JlYXRlUHNEZWMoSEFORExFX1BTX0RFQyAqaF9QU19ERUMsIGludCBhYWNTYW1wbGVzUGVyRnJhbWUpOwogCiBpbnQgRGVsZXRlUHNEZWMoSEFORExFX1BTX0RFQyAqaF9QU19ERUMpOwogCi12b2lkCi1zY2FsRmlsdGVyQmFua1ZhbHVlcyggSEFORExFX1BTX0RFQyAgIGhfcHNfZCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICoqZml4cFFtZlJlYWwsICAgICAgICAgICAgICAgICAgIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipmaXhwUW1mSW1hZywgICAgICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxzYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYnIgc3RhcnQgc3ViYmFuZCAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRMb3csCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAqc2NhbGVGYWN0b3JMb3dCYW5kX2xiLAotICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICpzY2FsZUZhY3Rvckxvd0JhbmRfaGIsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICpzY2FsZUZhY3RvckhpZ2hCYW5kLAotICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICBub0NvbHMpOwordm9pZCBQcmVwYXJlUHNQcm9jZXNzaW5nKEhBTkRMRV9QU19ERUMgaF9wc19kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAqY29uc3QgckludEJ1ZmZlckxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICpjb25zdCBpSW50QnVmZmVyTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JMb3dCYW5kKTsKIAotdm9pZAotcmVzY2FsRmlsdGVyQmFua1ZhbHVlcyggSEFORExFX1BTX0RFQyAgIGhfcHNfZCwgICAgICAgICAgICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICoqUW1mQnVmZmVyUmVhbCwgICAgICAgICAgICAgICAvKiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipRbWZCdWZmZXJJbWFnLCAgICAgICAgICAgICAgIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxzYiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2JyIHN0YXJ0IHN1YmJhbmQgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgbm9Db2xzKTsKK3ZvaWQgaW5pdFNsb3RCYXNlZFJvdGF0aW9uKEhBTkRMRV9QU19ERUMgaF9wc19kLCBpbnQgZW52LCBpbnQgdXNiKTsKIAordm9pZCBBcHBseVBzU2xvdCgKKyAgICBIQU5ETEVfUFNfREVDIGhfcHNfZCwgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAqLworICAgIEZJWFBfREJMICoqckludEJ1ZmZlckxlZnQsIC8qIHJlYWwgdmFsdWVzIG9mIGxlZnQgcW1mIHRpbWVzbG90ICAgICovCisgICAgRklYUF9EQkwgKippSW50QnVmZmVyTGVmdCwgLyogaW1hZyB2YWx1ZXMgb2YgbGVmdCBxbWYgdGltZXNsb3QgICAgKi8KKyAgICBGSVhQX0RCTCAqckludEJ1ZmZlclJpZ2h0LCAvKiByZWFsIHZhbHVlcyBvZiByaWdodCBxbWYgdGltZXNsb3QgICAqLworICAgIEZJWFBfREJMICppSW50QnVmZmVyUmlnaHQsIC8qIGltYWcgdmFsdWVzIG9mIHJpZ2h0IHFtZiB0aW1lc2xvdCAgICovCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdiwgY29uc3QgaW50IHNjYWxlRmFjdG9yTG93QmFuZCwKKyAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JIaWdoQmFuZCwgY29uc3QgaW50IGxzYiwgY29uc3QgaW50IHVzYik7CiAKLXZvaWQKLWluaXRTbG90QmFzZWRSb3RhdGlvbiggSEFORExFX1BTX0RFQyBoX3BzX2QsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCB1c2IpOwotCi12b2lkCi1BcHBseVBzU2xvdCggSEFORExFX1BTX0RFQyBoX3BzX2QsICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICAgKi8KLSAgICAgICAgICAgICBGSVhQX0RCTCAqKnJJbnRCdWZmZXJMZWZ0LCAgICAgICAvKiByZWFsIHZhbHVlcyBvZiBsZWZ0IHFtZiB0aW1lc2xvdCAgICAqLwotICAgICAgICAgICAgIEZJWFBfREJMICoqaUludEJ1ZmZlckxlZnQsICAgICAgIC8qIGltYWcgdmFsdWVzIG9mIGxlZnQgcW1mIHRpbWVzbG90ICAgICovCi0gICAgICAgICAgICAgRklYUF9EQkwgKnJJbnRCdWZmZXJSaWdodCwgICAgICAgLyogcmVhbCB2YWx1ZXMgb2YgcmlnaHQgcW1mIHRpbWVzbG90ICAgKi8KLSAgICAgICAgICAgICBGSVhQX0RCTCAqaUludEJ1ZmZlclJpZ2h0KTsgICAgICAvKiBpbWFnIHZhbHVlcyBvZiByaWdodCBxbWYgdGltZXNsb3QgICAqLwotCi0KLQotI2VuZGlmICAvKiBfX1BTREVDX0ggKi8KKyNlbmRpZiAvKiBQU0RFQ19IICovCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3BzZGVjX2RybS5jcHAgYi9saWJTQlJkZWMvc3JjL3BzZGVjX2RybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3MWY1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNCUmRlYy9zcmMvcHNkZWNfZHJtLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGZvciBEaWdpdGFsIHJhZGlvIG1vbmRpYWwKKyovCisKKyNpbmNsdWRlICJwc2RlY19kcm0uaCIKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvcHNkZWNfZHJtLmggYi9saWJTQlJkZWMvc3JjL3BzZGVjX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjU3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQlJkZWMvc3JjL3BzZGVjX2RybS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBmb3IgZGlnaXRhbCByYWRpbyBtb25kaWFsCisqLworCisjaWZuZGVmIFBTREVDX0RSTV9ICisjZGVmaW5lIFBTREVDX0RSTV9ICisKKyNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCisKKyNlbmRpZiAvKiBQU0RFQ19EUk1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9wc2RlY19oeWJyaWQuY3BwIGIvbGliU0JSZGVjL3NyYy9wc2RlY19oeWJyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmQwZTkyLi4wMDAwMDAwCi0tLSBhL2xpYlNCUmRlYy9zcmMvcHNkZWNfaHlicmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY1MiArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2luY2x1ZGUgInBzZGVjX2h5YnJpZC5oIgotCi0KLSNpbmNsdWRlICJmZnQuaCIKLSNpbmNsdWRlICJzYnJfcmFtLmgiCi0KLSNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCi0jaW5jbHVkZSAic2JyX3JvbS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEZ1bmN0aW9ubmFtZTogIEluaXRIeWJyaWRGaWx0ZXJCYW5rCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gRGVzY3JpcHRpb246ICAgSW5pdCBvbmUgaW5zdGFuY2Ugb2YgSEFORExFX0hZQlJJRCBzdHVjdAotCi0gQXJndW1lbnRzOgotCi0gUmV0dXJuOiAgICAgICAgbm9uZQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLVNCUl9FUlJPUgotSW5pdEh5YnJpZEZpbHRlckJhbmsgKCBIQU5ETEVfSFlCUklEIGhzLCAgICAgICAgICAvKiE8IEhhbmRsZSB0byBIWUJSSUQgc3RydWN0LiAqLwotICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBmcmFtZVNpemUsICAgICAgICAgICAvKiE8IEZyYW1lc2l6ZSAoaW4gUW1mIHP6YmJhbmQgc2FtcGxlcykuICovCi0gICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIG5vQmFuZHMsICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFtZiBiYW5kcyBmb3IgaHlicmlkIGZpbHRlcmluZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnBSZXNvbHV0aW9uICkgLyohPCBSZXNvbHV0aW9uIGluIFFtZiBiYW5kcyAobGVuZ3RoIG5vQmFuZHMpLiAqLwotewotICBTQ0hBUiBpOwotICBVQ0hBUiBtYXhOb0NoYW5uZWxzID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgbm9CYW5kczsgaSsrKSB7Ci0gICAgaHMtPnBSZXNvbHV0aW9uW2ldID0gcFJlc29sdXRpb25baV07Ci0gICAgaWYocFJlc29sdXRpb25baV0gPiBtYXhOb0NoYW5uZWxzKQotICAgICAgbWF4Tm9DaGFubmVscyA9IHBSZXNvbHV0aW9uW2ldOwotICB9Ci0KLSAgaHMtPm5RbWZCYW5kcyAgICAgPSBub0JhbmRzOwotICBocy0+ZnJhbWVTaXplICAgICA9IGZyYW1lU2l6ZTsKLSAgaHMtPnFtZkJ1ZmZlck1vdmUgPSBIWUJSSURfRklMVEVSX0xFTkdUSCAtIDE7Ci0KLSAgaHMtPnNmX21RbWZCdWZmZXIgPSAwOwotCi0gIHJldHVybiBTQlJERUNfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gRnVuY3Rpb25uYW1lOiAgZHVhbENoYW5uZWxGaWx0ZXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBEZXNjcmlwdGlvbjogICBmYXN0IDItY2hhbm5lbCByZWFsLXZhbHVlZCBmaWx0ZXJpbmcgd2l0aCA2LXRhcCBkZWxheS4KLQotIEFyZ3VtZW50czoKLQotIFJldHVybjogICAgICAgIG5vbmUKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyohCi0yIGNoYW5uZWwgZmlsdGVyCi08cHJlPgotICAgRmlsdGVyIENvZWZzOgotICAgMC4wLAotICAgMC4wMTg5OTQ4NzUyNjA0OSwKLSAgIDAuMCwKLSAgIC0wLjA3MjkzMTM5MTY3NTM4LAotICAgMC4wLAotICAgMC4zMDU5NjYzMDU0NTE2OCwKLSAgIDAuNSwKLSAgIDAuMzA1OTY2MzA1NDUxNjgsCi0gICAwLjAsCi0gICAtMC4wNzI5MzEzOTE2NzUzOCwKLSAgIDAuMCwKLSAgIDAuMDE4OTk0ODc1MjYwNDksCi0gICAwLjAKLQotCi0gICBGaWx0ZXIgZGVzaWduOgotICAgaFtxLG5dID0gZ1tuXSAqIGNvcygycGkvMiAqIHEgKiAobi02KSApOyAgbiA9IDAuLjEyLCAgcSA9IDAsMTsKLQotICAgLT4gIGhbMCxuXSA9IGdbbl0gKiAxOwotICAgLT4gIGhbMSxuXSA9IGdbbl0gKiBwb3coLTEsbik7Ci08L3ByZT4KLSovCi0KLXN0YXRpYyB2b2lkIHNsb3RCYXNlZER1YWxDaGFubmVsRmlsdGVyaW5nKCBjb25zdCBGSVhQX0RCTCAqcFFtZlJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnBRbWZJbWFnLAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKm1IeWJyaWRSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICptSHlicmlkSW1hZykKLXsKLQotICBGSVhQX0RCTCAgdDEsIHQzLCB0NSwgdDY7Ci0KLSAgLyogc3ltbWV0cmljIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLQotICAvKiAgeW91IGRvbid0IGhhdmUgdG8gc2hpZnQgdGhlIHJlc3VsdCBhZnRlciBmTXVsdCBiZWNhdXNlIG9mIHAyXzEzXzIwIDw9IDAuNSAqLwotICB0MSA9IGZNdWx0RGl2MihwMl8xM18yMFsxXSAsICggKHBRbWZSZWFsWzFdID4+IDEpICsgKHBRbWZSZWFsWzExXSA+PiAxKSkpOwotICB0MyA9IGZNdWx0RGl2MihwMl8xM18yMFszXSAsICggKHBRbWZSZWFsWzNdID4+IDEpICsgKHBRbWZSZWFsWyA5XSA+PiAxKSkpOwotICB0NSA9IGZNdWx0RGl2MihwMl8xM18yMFs1XSAsICggKHBRbWZSZWFsWzVdID4+IDEpICsgKHBRbWZSZWFsWyA3XSA+PiAxKSkpOwotICB0NiA9IGZNdWx0RGl2MihwMl8xM18yMFs2XSAsICAgKHBRbWZSZWFsWzZdID4+IDEpICk7Ci0KLSAgbUh5YnJpZFJlYWxbMF0gPSAodDEgKyB0MyArIHQ1ICsgdDYpIDw8IDI7Ci0gIG1IeWJyaWRSZWFsWzFdID0gKC0gdDEgLSB0MyAtIHQ1ICsgdDYpIDw8IDI7Ci0KLSAgdDEgPSBmTXVsdERpdjIocDJfMTNfMjBbMV0gLCAoIChwUW1mSW1hZ1sxXSA+PiAxKSArIChwUW1mSW1hZ1sxMV0gPj4gMSkpKTsKLSAgdDMgPSBmTXVsdERpdjIocDJfMTNfMjBbM10gLCAoIChwUW1mSW1hZ1szXSA+PiAxKSArIChwUW1mSW1hZ1sgOV0gPj4gMSkpKTsKLSAgdDUgPSBmTXVsdERpdjIocDJfMTNfMjBbNV0gLCAoIChwUW1mSW1hZ1s1XSA+PiAxKSArIChwUW1mSW1hZ1sgN10gPj4gMSkpKTsKLSAgdDYgPSBmTXVsdERpdjIocDJfMTNfMjBbNl0gLCAgICBwUW1mSW1hZ1s2XSA+PiAxICk7Ci0KLSAgbUh5YnJpZEltYWdbMF0gPSAodDEgKyB0MyArIHQ1ICsgdDYpIDw8IDI7Ci0gIG1IeWJyaWRJbWFnWzFdID0gKC0gdDEgLSB0MyAtIHQ1ICsgdDYpIDw8IDI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBGdW5jdGlvbm5hbWU6ICBlaWdodENoYW5uZWxGaWx0ZXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBEZXNjcmlwdGlvbjogICBmYXN0IDgtY2hhbm5lbCBjb21wbGV4LXZhbHVlZCBmaWx0ZXJpbmcgd2l0aCA2LXRhcCBkZWxheS4KLQotIEFyZ3VtZW50czoKLQotIFJldHVybjogICAgICAgIG5vbmUKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIQotICAgOCBjaGFubmVsIGZpbHRlcgotCi0gICBJbXBsZW1lbnRhdGlvbiB1c2luZyBhIEZGVCBvZiBsZW5ndGggOAotPHByZT4KLSAgIHByb3RvdHlwZSBmaWx0ZXIgY29lZmZpY2llbnRzOgotICAgMC4wMDc0NjA4Mjk0OTgxMiAgIDAuMDIyNzA0MjA5NDk4MjUgICAwLjA0NTQ2ODY1OTMwNDczICAgMC4wNzI2NjExMzkyOTU5MSAgIDAuMDk4ODUxMDg1NzUyNjQgICAwLjExNzkzNzEwNTY3MjE3Ci0gICAwLjEyNQotICAgMC4xMTc5MzcxMDU2NzIxNyAgIDAuMDk4ODUxMDg1NzUyNjQgICAwLjA3MjY2MTEzOTI5NTkxICAgMC4wNDU0Njg2NTkzMDQ3MyAgIDAuMDIyNzA0MjA5NDk4MjUgICAwLjAwNzQ2MDgyOTQ5ODEyCi0KLSAgIEZpbHRlciBkZXNpZ246Ci0gICBOID0gMTM7IFEgPSA4OwotICAgaFtxLG5dICAgICAgID0gZ1tuXSAqIGV4cChqICogMiAqIHBpIC8gUSAqIChxICsgLjUpICogKG4gLSA2KSk7ICBuID0gMC4uKE4tMSksICBxID0gMC4uKFEtMSk7Ci0KLSAgIFRpbWUgU2lnbmFsOiAgIHhbdF07Ci0gICBGaWx0ZXIgQmFuayBPdXRwdXQKLSAgIHlbcSx0XSA9IGNvbnYoeFt0XSxoW3EsdF0pID0gY29udihoW3EsdF0seFt0XSkgPSBzdW0oeFtrXSAqIGhbcSwgdCAtIGtdICkgPSBzdW0oaFtxLCBrXSAqIHhbdCAtIGtdICk7IGsgPSAwLi4oTi0xKTsKLQotICAgeVtxLHRdID0gICB4W3QgLSAxMl0qaFtxLCAxMl0gICsgIHhbdCAtIDExXSpoW3EsIDExXSAgKyAgeFt0IC0gMTBdKmhbcSwgMTBdICArICB4W3QgLSAgOV0qaFtxLCAgOV0KLSAgICAgICAgICAgKyAgeFt0IC0gIDhdKmhbcSwgIDhdICArICB4W3QgLSAgN10qaFtxLCAgN10KLSAgICAgICAgICAgKyAgeFt0IC0gIDZdKmhbcSwgIDZdCi0gICAgICAgICAgICsgIHhbdCAtICA1XSpoW3EsICA1XSAgKyAgeFt0IC0gIDRdKmhbcSwgIDRdCi0gICAgICAgICAgICsgIHhbdCAtICAzXSpoW3EsICAzXSAgKyAgeFt0IC0gIDJdKmhbcSwgIDJdICArICB4W3QgLSAgMV0qaFtxLCAgMV0gICsgIHhbdCAtICAwXSpoW3EsICAwXTsKLQotICAgaCdbcSwgbl0gPSBoW3EsKE4tMSktbl0gPSBnW25dICogZXhwKGogKiAyICogcGkgLyBRICogKHEgKyAuNSkgKiAoNiAtIG4pKTsgIG4gPSAwLi4oTi0xKSwgIHEgPSAwLi4oUS0xKTsKLQotICAgeVtxLHRdID0gICB4W3QgLSAxMl0qaCdbcSwgIDBdICArICB4W3QgLSAxMV0qaCdbcSwgIDFdICArICB4W3QgLSAxMF0qaCdbcSwgIDJdICArICB4W3QgLSAgOV0qaCdbcSwgIDNdCi0gICAgICAgICAgICsgIHhbdCAtICA4XSpoJ1txLCAgNF0gICsgIHhbdCAtICA3XSpoJ1txLCAgNV0KLSAgICAgICAgICAgKyAgeFt0IC0gIDZdKmgnW3EsICA2XQotICAgICAgICAgICArICB4W3QgLSAgNV0qaCdbcSwgIDddICArICB4W3QgLSAgNF0qaCdbcSwgIDhdCi0gICAgICAgICAgICsgIHhbdCAtICAzXSpoJ1txLCAgOV0gICsgIHhbdCAtICAyXSpoJ1txLCAxMF0gICsgIHhbdCAtICAxXSpoJ1txLCAxMV0gICsgIHhbdCAtICAwXSpoJ1txLCAxMl07Ci0KLSAgIFRyeSB0byBzcGxpdCBvZmYgRkZUIE1vZHVsYXRpb24gVGVybToKLSAgIEZGVCh4W3RdLCBxKSA9IHN1bSh4W3Qra10qZXhwKC1qKjIqcGkvTiAqcSAqIGspKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbQotICAgU3RlcCAxOiAgaCdbcSxuXSA9IGdbbl0gKiAoIGV4cChqICogMiAqIHBpIC8gOCAqIC41ICogKDYgLSBuKSkgKSAqICggZXhwIChqICogMiAqIHBpIC8gOCAqIHEgKiAoNiAtIG4pKSApOwotCi0gICAgaCdbcSxuXSA9IGdbbl0gKmNbbl0gKiBtW3Esbl07IChzZWUgYWJvdmUpCi0gICAgY1tuXSAgICA9IGV4cCggaiAqIDIgKiBwaSAvIDggKiAuNSAqICg2IC0gbikgKTsKLSAgICBtW3Esbl0gID0gZXhwKCBqICogMiAqIHBpIC8gOCAqICBxICogKDYgLSBuKSApOwotCi0gICAgeVtxLHRdID0geFt0IC0gIDBdKmdbMF0qY1swXSptW3EsMF0gICsgIHhbdCAtICAxXSpnWzFdKmNbIDFdKm1bcSwgMV0gICsgLi4uCi0gICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICsgIHhbdCAtIDEyXSpnWzJdKmNbMTJdKm1bcSwxMl07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICBuICAgICAgICAgICAgICAgICAgIG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4cCgtaioyKnBpKSAgICAgICAgICAgIHwgICBuJyAgICAgICAgICAgICAgICAgICBmZnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAwICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDggKiBxICogNikgLT4gIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogMikgICAgIHwgICAyICAgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAwKQotICAgIDEgICAgICAgZXhwKCBqICogMiAqIHBpIC8gOCAqIHEgKiA1KSAtPiAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAzKSAgICAgfCAgIDMgICAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDEpCi0gICAgMiAgICAgICBleHAoIGogKiAyICogcGkgLyA4ICogcSAqIDQpIC0+ICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDQpICAgICB8ICAgNCAgICAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogMikKLSAgICAzICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDggKiBxICogMykgLT4gIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNSkgICAgIHwgICA1ICAgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAzKQotICAgIDQgICAgICAgZXhwKCBqICogMiAqIHBpIC8gOCAqIHEgKiAyKSAtPiAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA2KSAgICAgfCAgIDYgICAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDQpCi0gICAgNSAgICAgICBleHAoIGogKiAyICogcGkgLyA4ICogcSAqIDEpIC0+ICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDcpICAgICB8ICAgNyAgICAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNSkKLSAgICA2ICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDggKiBxICogMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAwICAgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA2KQotICAgIDcgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEgICAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDcpCi0gICAgOCAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMgotICAgIDkgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDMKLSAgICAxMCAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0Ci0gICAgMTEgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNQotICAgIDEyICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDYKLQotCi0gICAgbm93IHVzZSBmZnQgbW9kdWxhdGlvbiBjb2VmZmljaWVudHMKLSAgICBtWzZdICA9ICAgICAgID0gZmZ0WzBdCi0gICAgbVs3XSAgPSAgICAgICA9IGZmdFsxXQotICAgIG1bOF0gID0gbVsgMF0gPSBmZnRbMl0KLSAgICBtWzldICA9IG1bIDFdID0gZmZ0WzNdCi0gICAgbVsxMF0gPSBtWyAyXSA9IGZmdFs0XQotICAgIG1bMTFdID0gbVsgM10gPSBmZnRbNV0KLSAgICBtWzEyXSA9IG1bIDRdID0gZmZ0WzZdCi0gICAgICAgICAgICBtWyA1XSA9IGZmdFs3XQotCi0gICAgeVtxLHRdID0gKCAgICAgICAgICAgICAgICAgICAgICAgeFt0LSA2XSpnWyA2XSpjWyA2XSApICogZmZ0W3EsMF0gICsKLSAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICB4W3QtIDddKmdbIDddKmNbIDddICkgKiBmZnRbcSwxXSAgKwotICAgICAgICAgICAgICggeFt0LSAwXSpnWyAwXSpjWyAwXSArIHhbdC0gOF0qZ1sgOF0qY1sgOF0gKSAqIGZmdFtxLDJdICArCi0gICAgICAgICAgICAgKCB4W3QtIDFdKmdbIDFdKmNbIDFdICsgeFt0LSA5XSpnWyA5XSpjWyA5XSApICogZmZ0W3EsM10gICsKLSAgICAgICAgICAgICAoIHhbdC0gMl0qZ1sgMl0qY1sgMl0gKyB4W3QtMTBdKmdbMTBdKmNbMTBdICkgKiBmZnRbcSw0XSAgKwotICAgICAgICAgICAgICggeFt0LSAzXSpnWyAzXSpjWyAzXSArIHhbdC0xMV0qZ1sxMV0qY1sxMV0gKSAqIGZmdFtxLDVdICArCi0gICAgICAgICAgICAgKCB4W3QtIDRdKmdbIDRdKmNbIDRdICsgeFt0LTEyXSpnWzEyXSpjWzEyXSApICogZmZ0W3EsNl0gICsKLSAgICAgICAgICAgICAoIHhbdC0gNV0qZ1sgNV0qY1sgNV0gICAgICAgICAgICAgICAgICAgICAgICkgKiBmZnRbcSw3XTsKLQotICAgIHByZSB0d2lkZGxlIGZhY3RvcnMgY1tuXSA9IGV4cChqICogMiAqIHBpIC8gOCAqIC41ICogKDYgLSBuKSk7Ci0gICAgbiAgICAgICAgICAgICAgICBjXSAgICAgICAgICAgfCAgbiAgICAgICAgICAgICAgICBjW25dICAgICAgICAgfCAgbiAgICAgICAgICAgICAgICBjW25dCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAwICAgICAgIGV4cCggaiAqIDYgKiBwaSAvIDgpICB8ICAxICAgICAgIGV4cCggaiAqIDUgKiBwaSAvIDgpICB8ICAyICAgICAgIGV4cCggaiAqIDQgKiBwaSAvIDgpCi0gICAgMyAgICAgICBleHAoIGogKiAzICogcGkgLyA4KSAgfCAgNCAgICAgICBleHAoIGogKiAyICogcGkgLyA4KSAgfCAgNSAgICAgICBleHAoIGogKiAxICogcGkgLyA4KQotICAgIDYgICAgICAgZXhwKCBqICogMCAqIHBpIC8gOCkgIHwgIDcgICAgICAgZXhwKC1qICogMSAqIHBpIC8gOCkgIHwgIDggICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCkKLSAgICA5ICAgICAgIGV4cCgtaiAqIDMgKiBwaSAvIDgpICB8IDEwICAgICAgIGV4cCgtaiAqIDQgKiBwaSAvIDgpICB8IDExICAgICAgIGV4cCgtaiAqIDUgKiBwaSAvIDgpCi0gICAxMiAgICAgICBleHAoLWogKiA2ICogcGkgLyA4KSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotPC9wcmU+Ci0qLwotCi0vKiBkZWZpbmluZyByb3RhdGlvbiBmYWN0b3JzIGZvciAqQ2hhbm5lbEZpbHRlcmluZyAqLwotCi0jZGVmaW5lIGNvczBQaSAgICBGTDJGWENPTlNUX0RCTCggMS5mKQotI2RlZmluZSBzaW4wUGkgICAgRkwyRlhDT05TVF9EQkwoIDAuZikKLQotI2RlZmluZSBjb3MxUGkgICAgRkwyRlhDT05TVF9EQkwoLTEuZikKLSNkZWZpbmUgc2luMVBpICAgIEZMMkZYQ09OU1RfREJMKCAwLmYpCi0KLSNkZWZpbmUgY29zMVBpXzIgIEZMMkZYQ09OU1RfREJMKCAwLmYpCi0jZGVmaW5lIHNpbjFQaV8yICBGTDJGWENPTlNUX0RCTCggMS5mKQotCi0jZGVmaW5lIGNvczFQaV8zICBGTDJGWENPTlNUX0RCTCggMC41ZikKLSNkZWZpbmUgc2luMVBpXzMgIEZMMkZYQ09OU1RfREJMKCAwLjg2NjAyNTQwMzc4NDQ0ZikKLQotI2RlZmluZSBjb3MwUGlfNCAgY29zMFBpCi0jZGVmaW5lIGNvczFQaV80ICBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU1ZikKLSNkZWZpbmUgY29zMlBpXzQgIGNvczFQaV8yCi0jZGVmaW5lIGNvczNQaV80ICAoLWNvczFQaV80KQotI2RlZmluZSBjb3M0UGlfNCAgKC1jb3MwUGlfNCkKLSNkZWZpbmUgY29zNVBpXzQgIGNvczNQaV80Ci0jZGVmaW5lIGNvczZQaV80ICBjb3MyUGlfNAotCi0jZGVmaW5lIHNpbjBQaV80ICBzaW4wUGkKLSNkZWZpbmUgc2luMVBpXzQgIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTVmKQotI2RlZmluZSBzaW4yUGlfNCAgc2luMVBpXzIKLSNkZWZpbmUgc2luM1BpXzQgIHNpbjFQaV80Ci0jZGVmaW5lIHNpbjRQaV80ICBzaW4wUGlfNAotI2RlZmluZSBzaW41UGlfNCAgKC1zaW4zUGlfNCkKLSNkZWZpbmUgc2luNlBpXzQgICgtc2luMlBpXzQpCi0KLSNkZWZpbmUgY29zMFBpXzggIGNvczBQaQotI2RlZmluZSBjb3MxUGlfOCAgRkwyRlhDT05TVF9EQkwoMC45MjM4Nzk1MzI1MTEyOWYpCi0jZGVmaW5lIGNvczJQaV84ICBjb3MxUGlfNAotI2RlZmluZSBjb3MzUGlfOCAgRkwyRlhDT05TVF9EQkwoMC4zODI2ODM0MzIzNjUwOWYpCi0jZGVmaW5lIGNvczRQaV84ICBjb3MyUGlfNAotI2RlZmluZSBjb3M1UGlfOCAgKC1jb3MzUGlfOCkKLSNkZWZpbmUgY29zNlBpXzggICgtY29zMlBpXzgpCi0KLSNkZWZpbmUgc2luMFBpXzggIHNpbjBQaQotI2RlZmluZSBzaW4xUGlfOCAgY29zM1BpXzgKLSNkZWZpbmUgc2luMlBpXzggIHNpbjFQaV80Ci0jZGVmaW5lIHNpbjNQaV84ICBjb3MxUGlfOAotI2RlZmluZSBzaW40UGlfOCAgc2luMlBpXzQKLSNkZWZpbmUgc2luNVBpXzggIHNpbjNQaV84Ci0jZGVmaW5lIHNpbjZQaV84ICBzaW4xUGlfNAotCi0jaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQotICAjZGVmaW5lIEZJWFBfSFlCIEZJWFBfU0dMCi0gICNkZWZpbmUgRklYUF9DQVNUIEZYX0RCTDJGWF9TR0wKLSNlbHNlCi0gICNkZWZpbmUgRklYUF9IWUIgRklYUF9EQkwKLSAgI2RlZmluZSBGSVhQX0NBU1QKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgRklYUF9IWUIgIGNyWzEzXSA9Ci17Ci0gICBGSVhQX0NBU1QoY29zNlBpXzgpLCBGSVhQX0NBU1QoY29zNVBpXzgpLCBGSVhQX0NBU1QoY29zNFBpXzgpLAotICAgRklYUF9DQVNUKGNvczNQaV84KSwgRklYUF9DQVNUKGNvczJQaV84KSwgRklYUF9DQVNUKGNvczFQaV84KSwKLSAgIEZJWFBfQ0FTVChjb3MwUGlfOCksCi0gICBGSVhQX0NBU1QoY29zMVBpXzgpLCBGSVhQX0NBU1QoY29zMlBpXzgpLCBGSVhQX0NBU1QoY29zM1BpXzgpLAotICAgRklYUF9DQVNUKGNvczRQaV84KSwgRklYUF9DQVNUKGNvczVQaV84KSwgRklYUF9DQVNUKGNvczZQaV84KQotfTsKLQotc3RhdGljIGNvbnN0IEZJWFBfSFlCICBjaVsxM10gPQotewotICAgRklYUF9DQVNUKCBzaW42UGlfOCksIEZJWFBfQ0FTVCggc2luNVBpXzgpLCBGSVhQX0NBU1QoIHNpbjRQaV84KSwKLSAgIEZJWFBfQ0FTVCggc2luM1BpXzgpLCBGSVhQX0NBU1QoIHNpbjJQaV84KSwgRklYUF9DQVNUKCBzaW4xUGlfOCksCi0gICBGSVhQX0NBU1QoIHNpbjBQaV84KSAsCi0gICBGSVhQX0NBU1QoLXNpbjFQaV84KSwgRklYUF9DQVNUKC1zaW4yUGlfOCksIEZJWFBfQ0FTVCgtc2luM1BpXzgpLAotICAgRklYUF9DQVNUKC1zaW40UGlfOCksIEZJWFBfQ0FTVCgtc2luNVBpXzgpLCBGSVhQX0NBU1QoLXNpbjZQaV84KQotfTsKLQotc3RhdGljIHZvaWQgc2xvdEJhc2VkRWlnaHRDaGFubmVsRmlsdGVyaW5nKCBjb25zdCBGSVhQX0RCTCAqcFFtZlJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpwUW1mSW1hZywKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRJbWFnKQotewotCi0gIGludCBiaW47Ci0gIEZJWFBfREJMIF9mZnRbMTI4ICsgQUxJR05NRU5UX0RFRkFVTFQgLSAxXTsKLSAgRklYUF9EQkwgKmZmdCA9IChGSVhQX0RCTCAqKUFMSUdOX1BUUihfZmZ0KTsKLQotI2lmIGRlZmluZWQoQVJDSF9QUkVGRVJfTVVMVF8zMngxNikKLSAgY29uc3QgRklYUF9TR0wgKnAgPSBwOF8xM18yMDsgLyogQkFTRUxJTkVfUFMgKi8KLSNlbHNlCi0gIGNvbnN0IEZJWFBfREJMICpwID0gcDhfMTNfMjA7IC8qIEJBU0VMSU5FX1BTICovCi0jZW5kaWYKLQotICAvKiBwcmUgdHdpZGRlbGluZyAqLwotCi0gIC8qICAgeCooYSpiICsgYypkKSA9IGZNdWx0RGl2Mih4LCBmTXVsdEFkZERpdjIoZk11bHREaXYyKGEsIGIpLCBjLCBkKSkgKi8KLSAgLyogICB4KihhKmIgLSBjKmQpID0gZk11bHREaXYyKHgsIGZNdWx0U3ViRGl2MihmTXVsdERpdjIoYSwgYiksIGMsIGQpKSAqLwotICBGSVhQX0RCTCBhY2N1MSwgYWNjdTIsIGFjY3UzLCBhY2N1NDsKLQotICAjZGVmaW5lIFRXSURETEVfMShuXzAsbl8xLG5fMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgcFFtZlJlYWxbbl8wXSwgcFFtZkltYWdbbl8wXSwgY3Jbbl8wXSwgY2lbbl8wXSk7ICBcCi0gICAgICAgICBhY2N1MSA9IGZNdWx0RGl2MihwW25fMF0sIGFjY3UxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgYWNjdTIgPSBmTXVsdERpdjIocFtuXzBdLCBhY2N1Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgcFFtZlJlYWxbbl8xXSwgcFFtZkltYWdbbl8xXSwgY3Jbbl8xXSwgY2lbbl8xXSk7ICBcCi0gICAgICAgICBhY2N1MyA9IGZNdWx0RGl2MihwW25fMV0sIGFjY3UzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgYWNjdTQgPSBmTXVsdERpdjIocFtuXzFdLCBhY2N1NCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGZmdFtGSVhQX0ZGVF9JRFhfUihuXzIpXSA9IGFjY3UxICsgYWNjdTM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBmZnRbRklYUF9GRlRfSURYX0kobl8yKV0gPSBhY2N1MiArIGFjY3U0OwotCi0gICNkZWZpbmUgVFdJRERMRV8wKG5fMCxuXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtuXzBdLCBwUW1mSW1hZ1tuXzBdLCBjcltuXzBdLCBjaVtuXzBdKTsgIFwKLSAgICAgICAgIGZmdFtGSVhQX0ZGVF9JRFhfUihuXzEpXSA9IGZNdWx0RGl2MihwW25fMF0sIGFjY3UxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBmZnRbRklYUF9GRlRfSURYX0kobl8xKV0gPSBmTXVsdERpdjIocFtuXzBdLCBhY2N1Mik7Ci0KLSAgVFdJRERMRV8wKCA2LCAwKQotICBUV0lERExFXzAoIDcsIDEpCi0KLSAgVFdJRERMRV8xKCAwLCA4LCAyKQotICBUV0lERExFXzEoIDEsIDksIDMpCi0gIFRXSURETEVfMSggMiwxMCwgNCkKLSAgVFdJRERMRV8xKCAzLDExLCA1KQotICBUV0lERExFXzEoIDQsMTIsIDYpCi0KLSAgVFdJRERMRV8wKCA1LCA3KQotCi0gIGZmdF84IChmZnQpOwotCi0gIC8qIHJlc29ydCBmZnQgZGF0YSBpbnRvIG91dHB1dCBhcnJheSovCi0gIGZvcihiaW49MDsgYmluPDg7YmluKysgKSB7Ci0gICAgbUh5YnJpZFJlYWxbYmluXSA9IGZmdFtGSVhQX0ZGVF9JRFhfUihiaW4pXSA8PCA0OwotICAgIG1IeWJyaWRJbWFnW2Jpbl0gPSBmZnRbRklYUF9GRlRfSURYX0koYmluKV0gPDwgNDsKLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gRnVuY3Rpb25uYW1lOiAgZmlsbEh5YnJpZERlbGF5TGluZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIERlc2NyaXB0aW9uOiAgIFRoZSBkZWxheSBsaW5lIG9mIHRoZSBoeWJyaWQgZmlsdGVyIGlzIGZpbGxlZCBhbmQgY29waWVkIGZyb20KLSAgICAgICAgICAgICAgICBsZWZ0IHRvIHJpZ2h0LgotCi0gUmV0dXJuOiAgICAgICAgbm9uZQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1maWxsSHlicmlkRGVsYXlMaW5lKCBGSVhQX0RCTCAqKmZpeHBRbWZSZWFsLCAgICAgICAgICAvKiE8IFFtZiByZWFsIFZhbHVlcyAgICAqLwotICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipmaXhwUW1mSW1hZywgICAgICAgICAgLyohPCBRbWYgaW1hZyBWYWx1ZXMgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgZml4cEh5YnJpZExlZnRSWzEyXSwgIC8qITwgSHlicmlkIHJlYWwgVmFsdWVzIGxlZnQgY2hhbm5lbCAgKi8KLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgZml4cEh5YnJpZExlZnRJWzEyXSwgIC8qITwgSHlicmlkIGltYWcgVmFsdWVzIGxlZnQgY2hhbm5lbCAgKi8KLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgZml4cEh5YnJpZFJpZ2h0UlsxMl0sIC8qITwgSHlicmlkIHJlYWwgVmFsdWVzIHJpZ2h0IGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgZml4cEh5YnJpZFJpZ2h0SVsxMl0sIC8qITwgSHlicmlkIGltYWcgVmFsdWVzIHJpZ2h0IGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9IWUJSSUQgaEh5YnJpZCApCi17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBIWUJSSURfRklMVEVSX0RFTEFZOyBpKyspIHsKLSAgICBzbG90QmFzZWRIeWJyaWRBbmFseXNpcyAoIGZpeHBRbWZSZWFsW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4cFFtZlJlYWxbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhwSHlicmlkTGVmdFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhwSHlicmlkTGVmdEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSHlicmlkICk7Ci0gIH0KLQotICBGREttZW1jcHkoZml4cEh5YnJpZFJpZ2h0UiwgZml4cEh5YnJpZExlZnRSLCBzaXplb2YoRklYUF9EQkwpKk5PX1NVQl9RTUZfQ0hBTk5FTFMpOwotICBGREttZW1jcHkoZml4cEh5YnJpZFJpZ2h0SSwgZml4cEh5YnJpZExlZnRJLCBzaXplb2YoRklYUF9EQkwpKk5PX1NVQl9RTUZfQ0hBTk5FTFMpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gRnVuY3Rpb25uYW1lOiAgc2xvdEJhc2VkSHlicmlkQW5hbHlzaXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBEZXNjcmlwdGlvbjogICBUaGUgbG93ZXIgUU1GIHN1YmJhbmRzIGFyZSBmdXJ0aGVyIHNwbGl0IHRvIHByb3ZpZGUgYmV0dGVyCi0gICAgICAgICAgICAgICAgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIFBTIHByb2Nlc3NpbmcuCi0KLSAgUmV0dXJuOiAgICAgICAgbm9uZQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXZvaWQKLXNsb3RCYXNlZEh5YnJpZEFuYWx5c2lzICggRklYUF9EQkwgKmZpeHBRbWZSZWFsLCAgICAgIC8qITwgUW1mIHJlYWwgVmFsdWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpmaXhwUW1mSW1hZywgICAgICAvKiE8IFFtZiBpbWFnIFZhbHVlcyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICBmaXhwSHlicmlkUmVhbFsxMl0sICAgLyohPCBIeWJyaWQgcmVhbCBWYWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIGZpeHBIeWJyaWRJbWFnWzEyXSwgICAvKiE8IEh5YnJpZCBpbWFnIFZhbHVlcyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9IWUJSSUQgaEh5YnJpZCkKLXsKLSAgaW50ICBrLCBiYW5kOwotICBIWUJSSURfUkVTIGh5YnJpZFJlczsKLSAgaW50ICBjaE9mZnNldCA9IDA7Ci0KLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBUZW1wUmVhbFNsb3QsIEZJWFBfREJMLCA0KkhZQlJJRF9GSUxURVJfTEVOR1RIKTsKLQotICBGSVhQX0RCTCAqcFRlbXBJbWFnU2xvdCA9IHBUZW1wUmVhbFNsb3QgKyBIWUJSSURfRklMVEVSX0xFTkdUSDsKLSAgRklYUF9EQkwgKnBXb3JrUmVhbFNsb3QgPSBwVGVtcEltYWdTbG90ICsgSFlCUklEX0ZJTFRFUl9MRU5HVEg7Ci0gIEZJWFBfREJMICpwV29ya0ltYWdTbG90ID0gcFdvcmtSZWFsU2xvdCArIEhZQlJJRF9GSUxURVJfTEVOR1RIOwotCi0gIC8qIQotICBIeWJyaWQgZmlsdGVyaW5nIGlzIGFwcGxpZWQgdG8gdGhlIGZpcnN0IGhIeWJyaWQtPm5RbWZCYW5kcyBRTUYgYmFuZHMgKDMgd2hlbiAxMCBvciAyMCBzdGVyZW8gYmFuZHMKLSAgYXJlIHVzZWQsIDUgd2hlbiAzNCBzdGVyZW8gYmFuZHMgYXJlIHVzZWQpLiBGb3IgdGhlIHJlbWFpbmluZyBRTUYgYmFuZHMgYSBkZWxheSB3b3VsZCBiZSBuZWNlc3NhcnkuCi0gIEJ1dCB0aGVyZSBpcyBubyBuZWVkIHRvIGltcGxlbWVudCBhIGRlbGF5IGJlY2F1c2UgdGhlcmUgaXMgYSBsb29rLWFoZWFkIG9mIEhZQlJJRF9GSUxURVJfREVMQVkgPSA2Ci0gIFFNRiBzYW1wbGVzIGluIHRoZSBsb3ctYmFuZCBidWZmZXIuCi0gICovCi0KLSAgZm9yKGJhbmQgPSAwOyBiYW5kIDwgaEh5YnJpZC0+blFtZkJhbmRzOyBiYW5kKyspIHsKLQotICAgIC8qICBnZXQgaHlicmlkIHJlc29sdXRpb24gcGVyIHFtZiBiYW5kICAgICAgICAgICAgICAgICovCi0gICAgLyogIGluIGNhc2Ugb2YgYmFzZWxpbmUgcHMgMTAvMjAgYmFuZCBzdGVyZW8gbW9kZSA6ICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgIHFtZkJhbmRbMF0gOiA4ICggSFlCUklEXzhfQ1BMWCApICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgcW1mQmFuZFsxXSA6IDIgKCBIWUJSSURfMl9SRUFMICkgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICBxbWZCYW5kWzJdIDogMiAoIEhZQlJJRF8yX1JFQUwgKSAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogIChzcGxpdCB0aGUgMyBsb3dlciBxbWYgYmFuZCB0byAxMiBoeWJyaWQgYmFuZHMpICAgKi8KLQotICAgIGh5YnJpZFJlcyA9IChIWUJSSURfUkVTKWhIeWJyaWQtPnBSZXNvbHV0aW9uW2JhbmRdOwotCi0gICAgRkRLbWVtY3B5KHBXb3JrUmVhbFNsb3QsIGhIeWJyaWQtPm1RbWZCdWZmZXJSZWFsU2xvdFtiYW5kXSwgaEh5YnJpZC0+cW1mQnVmZmVyTW92ZSAqIHNpemVvZihGSVhQX0RCTCkpOwotICAgIEZES21lbWNweShwV29ya0ltYWdTbG90LCBoSHlicmlkLT5tUW1mQnVmZmVySW1hZ1Nsb3RbYmFuZF0sIGhIeWJyaWQtPnFtZkJ1ZmZlck1vdmUgKiBzaXplb2YoRklYUF9EQkwpKTsKLQotICAgIHBXb3JrUmVhbFNsb3RbaEh5YnJpZC0+cW1mQnVmZmVyTW92ZV0gPSBmaXhwUW1mUmVhbFtiYW5kXTsKLSAgICBwV29ya0ltYWdTbG90W2hIeWJyaWQtPnFtZkJ1ZmZlck1vdmVdID0gZml4cFFtZkltYWdbYmFuZF07Ci0KLSAgICBGREttZW1jcHkoaEh5YnJpZC0+bVFtZkJ1ZmZlclJlYWxTbG90W2JhbmRdLCBwV29ya1JlYWxTbG90ICsgMSwgaEh5YnJpZC0+cW1mQnVmZmVyTW92ZSAqIHNpemVvZihGSVhQX0RCTCkpOwotICAgIEZES21lbWNweShoSHlicmlkLT5tUW1mQnVmZmVySW1hZ1Nsb3RbYmFuZF0sIHBXb3JrSW1hZ1Nsb3QgKyAxLCBoSHlicmlkLT5xbWZCdWZmZXJNb3ZlICogc2l6ZW9mKEZJWFBfREJMKSk7Ci0KLSAgICBpZiAoZml4cFFtZlJlYWwpIHsKLQotICAgICAgLyogYWN0dWFsIGZpbHRlcmluZyBvbmx5IGlmIG91dHB1dCBzaWduYWwgcmVxdWVzdGVkICovCi0gICAgICBzd2l0Y2goIGh5YnJpZFJlcyApIHsKLQotICAgICAgLyogSFlCUklEXzJfUkVBTCAmIEhZQlJJRF84X0NQTFggYXJlIG9ubHkgbmVlZGZ1bCBmb3IgYmFzZWxpbmUgcHMgKi8KLSAgICAgIGNhc2UgSFlCUklEXzJfUkVBTDoKLQotICAgICAgICBzbG90QmFzZWREdWFsQ2hhbm5lbEZpbHRlcmluZyggcFdvcmtSZWFsU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrSW1hZ1Nsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFJlYWxTbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBJbWFnU2xvdCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEhZQlJJRF84X0NQTFg6Ci0KLSAgICAgICAgc2xvdEJhc2VkRWlnaHRDaGFubmVsRmlsdGVyaW5nKCBwV29ya1JlYWxTbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrSW1hZ1Nsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBSZWFsU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEltYWdTbG90KTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEZES19BU1NFUlQoMCk7Ci0gICAgICB9Ci0KLSAgICAgIGZvcihrID0gMDsgayA8IChTQ0hBUiloeWJyaWRSZXM7IGsrKykgewotICAgICAgICBmaXhwSHlicmlkUmVhbCBbY2hPZmZzZXQgKyBrXSA9IHBUZW1wUmVhbFNsb3Rba107Ci0gICAgICAgIGZpeHBIeWJyaWRJbWFnIFtjaE9mZnNldCArIGtdID0gcFRlbXBJbWFnU2xvdFtrXTsKLSAgICAgIH0KLSAgICAgIGNoT2Zmc2V0ICs9IGh5YnJpZFJlczsKLSAgICB9IC8qIGlmIChtSHlicmlkUmVhbCkgKi8KLSAgfQotCi0gIC8qIGdyb3VwIGh5YnJpZCBjaGFubmVscyAzKzQgLT4gMyBhbmQgMis1IC0+IDIgKi8KLSAgZml4cEh5YnJpZFJlYWxbM10gKz0gZml4cEh5YnJpZFJlYWxbNF07Ci0gIGZpeHBIeWJyaWRJbWFnWzNdICs9IGZpeHBIeWJyaWRJbWFnWzRdOwotICBmaXhwSHlicmlkUmVhbFs0XSA9IChGSVhQX0RCTCkwOwotICBmaXhwSHlicmlkSW1hZ1s0XSA9IChGSVhQX0RCTCkwOwotCi0gIGZpeHBIeWJyaWRSZWFsWzJdICs9IGZpeHBIeWJyaWRSZWFsWzVdOwotICBmaXhwSHlicmlkSW1hZ1syXSArPSBmaXhwSHlicmlkSW1hZ1s1XTsKLSAgZml4cEh5YnJpZFJlYWxbNV0gPSAoRklYUF9EQkwpMDsKLSAgZml4cEh5YnJpZEltYWdbNV0gPSAoRklYUF9EQkwpMDsKLQotICAvKiBmcmVlIG1lbW9yeSBvbiBzY3JhdGNoICovCi0gIENfQUxMT0NfU0NSQVRDSF9FTkQocFRlbXBSZWFsU2xvdCwgRklYUF9EQkwsIDQqSFlCUklEX0ZJTFRFUl9MRU5HVEgpOwotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBGdW5jdGlvbm5hbWU6ICBzbG90QmFzZWRIeWJyaWRTeW50aGVzaXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBEZXNjcmlwdGlvbjogIFRoZSBjb2VmZmljaWVudHMgb2ZmZXJpbmcgaGlnaGVyIHJlc29sdXRpb24gZm9yIHRoZSBsb3dlciBRTUYKLSAgICAgICAgICAgICAgIGNoYW5uZWwgYXJlIHNpbXBseSBhZGRlZCBwcmlvciB0byB0aGUgc3ludGhlc2lzIHdpdGggdGhlIDU0Ci0gICAgICAgICAgICAgICBzdWJiYW5kcyBRTUYuCi0KLSBBcmd1bWVudHM6Ci0KLSBSZXR1cm46ICAgICAgICBub25lCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qISA8cHJlPgotICAgICAgbCxyMChuKSAtLS1cCi0gICAgICBsLHIxKG4pIC0tLS0gKyAtLVwKLSAgICAgIGwscjIobikgLS0tLyAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICArIC0tPiBGMCh3KQotICAgICAgbCxyMyhuKSAtLS1cICAgICAgLwotICAgICAgbCxyNChuKSAtLS0tICsgLS0vCi0gICAgICBsLHI1KG4pIC0tLS8KLQotCi0gICAgICBsLHI2KG4pIC0tLVwKLSAgICAgICAgICAgICAgICAgICsgLS0tLS0tLS0tPiBGMSh3KQotICAgICAgbCxyNyhuKSAtLS0vCi0KLQotICAgICAgbCxyOChuKSAtLS1cCi0gICAgICAgICAgICAgICAgICArIC0tLS0tLS0tLT4gRjIodykKLSAgICAgIGwscjkobikgLS0tLwotCi0gICAgPC9wcmU+Ci0gICAgICBIeWJyaWQgUU1GIHN5bnRoZXNpcyBmaWx0ZXJiYW5rIGZvciB0aGUgMTAgYW5kIDIwIHN0ZXJlby1iYW5kcyBjb25maWd1cmF0aW9ucy4gVGhlCi0gICAgICBjb2VmZmljaWVudHMgb2ZmZXJpbmcgaGlnaGVyIHJlc29sdXRpb24gZm9yIHRoZSBsb3dlciBRTUYgY2hhbm5lbCBhcmUgc2ltcGx5IGFkZGVkCi0gICAgICBwcmlvciB0byB0aGUgc3ludGhlc2lzIHdpdGggdGhlIDU0IHN1YmJhbmRzIFFNRi4KLQotICAgICAgW3NlZSBJU08vSUVDIDE0NDk2LTM6MjAwMS9GREFNIDI6MjAwNChFKSAtIFBhZ2UgNTJdCi0qLwotCi0KLXZvaWQKLXNsb3RCYXNlZEh5YnJpZFN5bnRoZXNpcyAoIEZJWFBfREJMICAqZml4cEh5YnJpZFJlYWwsICAvKiE8IEh5YnJpZCByZWFsIFZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpmaXhwSHlicmlkSW1hZywgIC8qITwgSHlicmlkIGltYWcgVmFsdWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKmZpeHBRbWZSZWFsLCAgICAgLyohPCBRbWYgcmVhbCBWYWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cFFtZkltYWcsICAgICAvKiE8IFFtZiBpbWFnIFZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0hZQlJJRCBoSHlicmlkICkgICAgIC8qITwgSGFuZGxlIHRvIEhZQlJJRCBzdHJ1Y3QuICovCi17Ci0gIGludCAgaywgYmFuZDsKLQotICBIWUJSSURfUkVTIGh5YnJpZFJlczsKLSAgaW50ICBjaE9mZnNldCA9IDA7Ci0KLSAgZm9yKGJhbmQgPSAwOyBiYW5kIDwgaEh5YnJpZC0+blFtZkJhbmRzOyBiYW5kKyspIHsKLQotICAgIEZJWFBfREJMIHFtZlJlYWwgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgIEZJWFBfREJMIHFtZkltYWcgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgIGh5YnJpZFJlcyA9IChIWUJSSURfUkVTKWhIeWJyaWQtPnBSZXNvbHV0aW9uW2JhbmRdOwotCi0gICAgZm9yKGsgPSAwOyBrIDwgKFNDSEFSKWh5YnJpZFJlczsgaysrKSB7Ci0gICAgICBxbWZSZWFsICs9IGZpeHBIeWJyaWRSZWFsW2NoT2Zmc2V0ICsga107Ci0gICAgICBxbWZJbWFnICs9IGZpeHBIeWJyaWRJbWFnW2NoT2Zmc2V0ICsga107Ci0gICAgfQotCi0gICAgZml4cFFtZlJlYWxbYmFuZF0gPSBxbWZSZWFsOwotICAgIGZpeHBRbWZJbWFnW2JhbmRdID0gcW1mSW1hZzsKLQotICAgIGNoT2Zmc2V0ICs9IGh5YnJpZFJlczsKLSAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9wc2RlY19oeWJyaWQuaCBiL2xpYlNCUmRlYy9zcmMvcHNkZWNfaHlicmlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZjllM2UuLjAwMDAwMDAKLS0tIGEvbGliU0JSZGVjL3NyYy9wc2RlY19oeWJyaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmbmRlZiBfX0hZQlJJRF9ICi0jZGVmaW5lIF9fSFlCUklEX0gKLQotI2luY2x1ZGUgInNicmRlY29kZXIuaCIKLQotCi0jZGVmaW5lIEhZQlJJRF9GSUxURVJfTEVOR1RIICAxMwotI2RlZmluZSBIWUJSSURfRklMVEVSX0RFTEFZICAgIDYKLQotCi0jZGVmaW5lIEZBU1RfRklMVEVSMgotI2RlZmluZSBGQVNUX0ZJTFRFUjQKLSNkZWZpbmUgRkFTVF9GSUxURVI4Ci0jZGVmaW5lIEZBU1RfRklMVEVSMTIKLQotI2RlZmluZSBGRlRfSURYX1IoYSkgICgyKmEpCi0jZGVmaW5lIEZGVF9JRFhfSShhKSAgKDIqYSsxKQotCi0jZGVmaW5lIEZJWFBfRkZUX0lEWF9SKGEpICAgKGE8PDEpCi0jZGVmaW5lIEZJWFBfRkZUX0lEWF9JKGEpICAoKGE8PDEpICsgMSkKLQotCi10eXBlZGVmIGVudW0gewotCi0gIEhZQlJJRF8yX1JFQUwgICAgID0gMiwKLSAgSFlCUklEXzRfQ1BMWCAgICAgPSA0LAotICBIWUJSSURfOF9DUExYICAgICA9IDgsCi0gIEhZQlJJRF8xMl9DUExYICAgID0gMTIKLQotfSBIWUJSSURfUkVTOwotCi10eXBlZGVmIHN0cnVjdAotewotICBTQ0hBUiAgIG5RbWZCYW5kczsKLSAgU0NIQVIgICBmcmFtZVNpemU7Ci0gIFNDSEFSICAgcW1mQnVmZmVyTW92ZTsKLQotICBVQ0hBUiAgIHBSZXNvbHV0aW9uWzNdOwotCi0gIEZJWFBfREJMIG1RbWZCdWZmZXJSZWFsU2xvdFszXVtIWUJSSURfRklMVEVSX0xFTkdUSF07ICAgLyoqPCBTdG9yZXMgb2xkIFFtZiBzYW1wbGVzLiAqLwotICBGSVhQX0RCTCBtUW1mQnVmZmVySW1hZ1Nsb3RbM11bSFlCUklEX0ZJTFRFUl9MRU5HVEhdOwotICBTQ0hBUiBzZl9tUW1mQnVmZmVyOwotCi19IEhZQlJJRDsKLQotdHlwZWRlZiBIWUJSSUQgKkhBTkRMRV9IWUJSSUQ7Ci0KLXZvaWQKLWZpbGxIeWJyaWREZWxheUxpbmUoIEZJWFBfREJMICoqZml4cFFtZlJlYWwsCi0gICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmZpeHBRbWZJbWFnLAotICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBmaXhwSHlicmlkTGVmdFJbMTJdLAotICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBmaXhwSHlicmlkTGVmdElbMTJdLAotICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBmaXhwSHlicmlkUmlnaHRSWzEyXSwKLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgZml4cEh5YnJpZFJpZ2h0SVsxMl0sCi0gICAgICAgICAgICAgICAgICAgICBIQU5ETEVfSFlCUklEIGhIeWJyaWQgKTsKLQotdm9pZAotc2xvdEJhc2VkSHlicmlkQW5hbHlzaXMgKCBGSVhQX0RCTCAqZml4cFFtZlJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpmaXhwUW1mSW1hZywKLQotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKmZpeHBIeWJyaWRSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKmZpeHBIeWJyaWRJbWFnLAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9IWUJSSUQgaEh5YnJpZCk7Ci0KLQotdm9pZAotc2xvdEJhc2VkSHlicmlkU3ludGhlc2lzICggRklYUF9EQkwgICpmaXhwSHlicmlkUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cEh5YnJpZEltYWcsCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cFFtZlJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKmZpeHBRbWZJbWFnLAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfSFlCUklEIGhIeWJyaWQgKTsKLQotU0JSX0VSUk9SIEluaXRIeWJyaWRGaWx0ZXJCYW5rICggSEFORExFX0hZQlJJRCAgaEh5YnJpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIG5vQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqcFJlc29sdXRpb24gKTsKLQotCi0jZW5kaWYgLyogX19IWUJSSURfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9wc2RlY3JvbV9kcm0uY3BwIGIvbGliU0JSZGVjL3NyYy9wc2RlY3JvbV9kcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzNhODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQlJkZWMvc3JjL3BzZGVjcm9tX2RybS5jcHAKQEAgLTAsMCArMSwxMDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgcm9tIHRhYmxlcyBmb3IgRHJtIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIKKyovCisKKyNpbmNsdWRlICJwc2RlY19kcm0uaCIKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvcHZjX2RlYy5jcHAgYi9saWJTQlJkZWMvc3JjL3B2Y19kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NzcxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQlJkZWMvc3JjL3B2Y19kZWMuY3BwCkBAIC0wLDAgKzEsNjgzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBIaWxkZW5icmFuZAorCisgICBEZXNjcmlwdGlvbjogRGVjb2RlIFByZWRpY3RpdmUgVmVjdG9yIENvZGluZyBEYXRhCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwdmNfZGVjLmgiCisKKy8qIFBWQyBpbnRlcmFsIGRlZmluaXRpb25zICovCisjZGVmaW5lIFBWQ19ESVZNT0RFX0JJVFMgMworI2RlZmluZSBQVkNfTlNNT0RFX0JJVFMgMQorI2RlZmluZSBQVkNfUkVVU0VQVkNJRF9CSVRTIDEKKyNkZWZpbmUgUFZDX1BWQ0lEX0JJVFMgNworI2RlZmluZSBQVkNfR1JJRElORk9fQklUUyAxCisjZGVmaW5lIFBWQ19OUU1GQkFORCA2NAorI2RlZmluZSBQVkNfTkJMT1cgMyAvKiBtYXguIG51bWJlciBvZiBncm91cGVkIFFNRiBzdWJiYW5kcyBiZWxvdyBTQlIgcmFuZ2UgKi8KKworI2RlZmluZSBQVkNfTlRBQjEgMworI2RlZmluZSBQVkNfTlRBQjIgMTI4CisjZGVmaW5lIFBWQ19JRF9OQklUIDcKKworLyogRXhwb25lbnQgb2YgcFB2Y1N0YXRpY0RhdGEtPkVzZyBhbmQgcHJlZGljdGVkRXNnIGluIGRCIGRvbWFpbi4KKyAgIG1heChFc2cpID0gMTAqbG9nMTAoMl4xNSoyXjE1KSA9IDkwLjMwOworICAgbWluKEVzZykgPSAxMCpsb2cxMCgwLjEpID0gLTEwCisgICBtYXggb2YgcHJlZGljdGVkIEVzZyBzZWVtcyB0byBiZSBoaWdoZXIgdGhhbiA5MGRCIGJ1dCA3IEJpdCBzaG91bGQgYmUgZW5vdWdoLgorKi8KKyNkZWZpbmUgUFZDX0VTR19FWFAgNworCisjZGVmaW5lIExPRzEwRkFDIDAuNzUyNTc0OTg5MTU5OTUzZiAgICAgLyogPT0gMTAvbG9nMigxMCkgKiAyXi0yICovCisjZGVmaW5lIExPRzEwRkFDX0lOViAwLjY2NDM4NTYxODk3NzQ3MmYgLyogPT0gbG9nMigxMCkvMTAgKiAyXjEgKi8KKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBwdmNfU0NfMTZbXSA9IHsKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxNDQxMzY5NSksIEZYX0RCTDJGWENPTlNUX1NHTCgweDE0MzRiNmNiKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxNDBmMjdjNyksIEZYX0RCTDJGWENPTlNUX1NHTCgweDEzZDA1OTFkKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxMzc3ZjUwMiksIEZYX0RCTDJGWENPTlNUX1NHTCgweDEzMDU3N2Q2KSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxMjc4MjI2NiksIEZYX0RCTDJGWENPTlNUX1NHTCgweDExY2VlNDU5KSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxMTA4M2EyYSksIEZYX0RCTDJGWENPTlNUX1NHTCgweDEwMjFmNWU5KSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgwZjE4ZTE3YyksIEZYX0RCTDJGWENPTlNUX1NHTCgweDBkZTgxNGNhKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgwYzg3YTU2OCksIEZYX0RCTDJGWENPTlNUX1NHTCgweDBhZTliMTY3KSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgwOGYyNDIyNiksIEZYX0RCTDJGWENPTlNUX1NHTCgweDA2NTc1ZWQ1KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitzdGF0aWMgY29uc3QgRklYUF9TR0wgcHZjX1NDXzEyW10gPSB7CisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MWFiYTZiM2UpLCBGWF9EQkwyRlhDT05TVF9TR0woMHgxYTlkMTY0ZSksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MWE0NGQ1NmQpLCBGWF9EQkwyRlhDT05TVF9TR0woMHgxOWIwZDc0MiksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MThkZjk2OWEpLCBGWF9EQkwyRlhDT05TVF9TR0woMHgxN2NlOTFhMCksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MTY3OWMzZmEpLCBGWF9EQkwyRlhDT05TVF9TR0woMHgxNGRhYWJmYyksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MTJlNjUyMjEpLCBGWF9EQkwyRlhDT05TVF9TR0woMHgxMDg4ZDEyNSksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MGQ5OTA3YjMpLCBGWF9EQkwyRlhDT05TVF9TR0woMHgwOWE4MGU5ZCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorc3RhdGljIGNvbnN0IEZJWFBfU0dMIHB2Y19TQ180W10gPSB7CisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4NGFkNmFiMGYpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDQ3ZWYwZGJlKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgzZWVlNzQ5NiksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MmU0YmQyOWQpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBwdmNfU0NfM1tdID0geworICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDYxMGRjNzYxKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHg1YTUxOWEzZCksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4NDRhMDllNjIpLAorfTsKKworc3RhdGljIGNvbnN0IFVDSEFSIGdfM2FfcHZjVGFiMV9tb2RlMVtQVkNfTlRBQjFdW1BWQ19OQkxPV11bUFZDX05CSElHSF9NT0RFMV0gPQorICAgIHt7ezB4NEYsIDB4NUIsIDB4NTcsIDB4NTIsIDB4NEQsIDB4NjUsIDB4NDUsIDB4NTd9LAorICAgICAgezB4RjMsIDB4MEYsIDB4MTgsIDB4MjAsIDB4MTksIDB4NEYsIDB4M0QsIDB4MjN9LAorICAgICAgezB4NzgsIDB4NTcsIDB4NTUsIDB4NTAsIDB4NTAsIDB4MjAsIDB4MzYsIDB4Mzd9fSwKKyAgICAge3sweDRDLCAweDVGLCAweDUzLCAweDM3LCAweDFFLCAweEZELCAweDE1LCAweDBBfSwKKyAgICAgIHsweDA1LCAweDBFLCAweDI4LCAweDQxLCAweDQ4LCAweDZFLCAweDU0LCAweDVCfSwKKyAgICAgIHsweDU5LCAweDQ3LCAweDQwLCAweDQwLCAweDNELCAweDMzLCAweDNGLCAweDM5fX0sCisgICAgIHt7MHg0NywgMHg1RiwgMHg1NywgMHgzNCwgMHgzQywgMHgyRSwgMHgyRSwgMHgzMX0sCisgICAgICB7MHhGQSwgMHgxMywgMHgyMywgMHg0RSwgMHg0NCwgMHg3QywgMHgzNCwgMHgzOH0sCisgICAgICB7MHg2MywgMHg0MywgMHg0MSwgMHgzRCwgMHgzNSwgMHgxOSwgMHgzRCwgMHgzM319fTsKKworc3RhdGljIGNvbnN0IFVDSEFSIGdfMmFfcHZjVGFiMl9tb2RlMVtQVkNfTlRBQjJdW1BWQ19OQkhJR0hfTU9ERTFdID0geworICAgIHsweENCLCAweEQxLCAweENDLCAweEQyLCAweEUyLCAweEVCLCAweEU3LCAweEU4fSwKKyAgICB7MHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MH0sCisgICAgezB4ODQsIDB4OEMsIDB4ODgsIDB4ODMsIDB4OTAsIDB4OTMsIDB4ODYsIDB4ODB9LAorICAgIHsweEQ3LCAweEQ4LCAweEMwLCAweEM3LCAweENGLCAweEU1LCAweEYxLCAweEY2fSwKKyAgICB7MHhBNSwgMHhBNiwgMHhBQSwgMHhBOCwgMHhCMCwgMHhCMSwgMHhCOCwgMHhCOH0sCisgICAgezB4RDcsIDB4Q0IsIDB4QzEsIDB4QzMsIDB4QzUsIDB4QzksIDB4QzksIDB4Q0V9LAorICAgIHsweENBLCAweEI1LCAweEI4LCAweEIzLCAweEFDLCAweEI2LCAweEJCLCAweEI4fSwKKyAgICB7MHhDMSwgMHhDNCwgMHhDMywgMHhDNSwgMHhDNiwgMHhDQSwgMHhDQSwgMHhDQn0sCisgICAgezB4RTAsIDB4RTEsIDB4RDgsIDB4Q0QsIDB4Q0IsIDB4Q0IsIDB4Q0UsIDB4Q0N9LAorICAgIHsweERCLCAweEUxLCAweERGLCAweERCLCAweERDLCAweEQ5LCAweEQ5LCAweEQ2fSwKKyAgICB7MHhFMCwgMHhERSwgMHhERCwgMHhERCwgMHhFMCwgMHhFMywgMHhFNSwgMHhFNn0sCisgICAgezB4Q0EsIDB4RDIsIDB4Q0QsIDB4Q0UsIDB4RDUsIDB4REIsIDB4RDksIDB4REJ9LAorICAgIHsweEQyLCAweEUwLCAweERCLCAweEQ1LCAweERCLCAweERFLCAweEUzLCAweEUxfSwKKyAgICB7MHhFNSwgMHhEQiwgMHhEMCwgMHhEMiwgMHhEOCwgMHhERCwgMHhEQiwgMHhERH0sCisgICAgezB4QzAsIDB4QjUsIDB4QkYsIDB4REQsIDB4RTMsIDB4REMsIDB4REMsIDB4RTR9LAorICAgIHsweERCLCAweENFLCAweEM2LCAweENGLCAweENGLCAweEQxLCAweEQzLCAweEQ0fSwKKyAgICB7MHhDOSwgMHhENywgMHhEQSwgMHhFMiwgMHhFOSwgMHhFNywgMHhERiwgMHhEQ30sCisgICAgezB4MEEsIDB4MDcsIDB4MEEsIDB4MDgsIDB4MTksIDB4MjQsIDB4MUYsIDB4MjJ9LAorICAgIHsweDFFLCAweDFGLCAweDExLCAweDBFLCAweDIyLCAweDJELCAweDMzLCAweDMyfSwKKyAgICB7MHhGMCwgMHhEQSwgMHhEQywgMHgxOCwgMHgxRiwgMHgxOSwgMHgwQSwgMHgxRX0sCisgICAgezB4MDksIDB4RjgsIDB4RTYsIDB4MDUsIDB4MTksIDB4MTEsIDB4MEUsIDB4MEJ9LAorICAgIHsweDA5LCAweDEwLCAweDBFLCAweEU2LCAweEY0LCAweDIwLCAweDIyLCAweEZBfSwKKyAgICB7MHhGMiwgMHhFNSwgMHhGOCwgMHgwRSwgMHgxOCwgMHgxNSwgMHgwRCwgMHgxMH0sCisgICAgezB4MTUsIDB4MTMsIDB4MTYsIDB4MEEsIDB4MEQsIDB4MUYsIDB4MUQsIDB4MUJ9LAorICAgIHsweEZBLCAweEZGLCAweEZFLCAweEZGLCAweDA5LCAweDExLCAweDAzLCAweDBCfSwKKyAgICB7MHhGRSwgMHhGQSwgMHhGMiwgMHhGOCwgMHgwQywgMHgxRSwgMHgxMSwgMHgxMn0sCisgICAgezB4RkEsIDB4RjgsIDB4MEIsIDB4MTcsIDB4MUQsIDB4MTcsIDB4MEUsIDB4MTZ9LAorICAgIHsweDAwLCAweEYzLCAweEZELCAweDBBLCAweDFDLCAweDE3LCAweEZELCAweDA4fSwKKyAgICB7MHhFQSwgMHhFQSwgMHgwMywgMHgxMiwgMHgxRSwgMHgxNCwgMHgwOSwgMHgwNH0sCisgICAgezB4MDIsIDB4RkUsIDB4MDQsIDB4RkIsIDB4MEMsIDB4MEUsIDB4MDcsIDB4MDJ9LAorICAgIHsweEY2LCAweDAyLCAweDA3LCAweDBCLCAweDE3LCAweDE3LCAweDAxLCAweEZGfSwKKyAgICB7MHhGNSwgMHhGQiwgMHhGRSwgMHgwNCwgMHgxMiwgMHgxNCwgMHgwQywgMHgwRH0sCisgICAgezB4MTAsIDB4MTAsIDB4MEUsIDB4MDQsIDB4MDcsIDB4MTEsIDB4MEYsIDB4MTN9LAorICAgIHsweDBDLCAweDBGLCAweEZCLCAweEYyLCAweDBBLCAweDEyLCAweDA5LCAweDBEfSwKKyAgICB7MHgwRCwgMHgxRCwgMHhGMSwgMHhGNCwgMHgyQSwgMHgwNiwgMHgzQiwgMHgzMn0sCisgICAgezB4RkMsIDB4MDgsIDB4MDYsIDB4MDIsIDB4MEUsIDB4MTcsIDB4MDgsIDB4MEV9LAorICAgIHsweDA3LCAweDAyLCAweEVFLCAweEVFLCAweDJCLCAweEY2LCAweDIzLCAweDEzfSwKKyAgICB7MHgwNCwgMHgwMiwgMHgwNSwgMHgwOCwgMHgwQiwgMHgwRSwgMHhGQiwgMHhGQn0sCisgICAgezB4MDAsIDB4MDQsIDB4MTAsIDB4MTgsIDB4MjIsIDB4MjUsIDB4MUQsIDB4MUZ9LAorICAgIHsweEZCLCAweDBELCAweDA3LCAweDAwLCAweDBDLCAweDBGLCAweEZDLCAweDAyfSwKKyAgICB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwNSwgMHgwNywgMHgwMywgMHgwNX0sCisgICAgezB4MDQsIDB4MDUsIDB4MDgsIDB4MTMsIDB4RkYsIDB4RUIsIDB4MEMsIDB4MDZ9LAorICAgIHsweDA1LCAweDEzLCAweDBFLCAweDBCLCAweDEyLCAweDE1LCAweDA5LCAweDBBfSwKKyAgICB7MHgwOSwgMHgwMywgMHgwOSwgMHgwNSwgMHgxMiwgMHgxNiwgMHgxMSwgMHgxMn0sCisgICAgezB4MTQsIDB4MUEsIDB4MDYsIDB4MDEsIDB4MTAsIDB4MTEsIDB4RkUsIDB4MDJ9LAorICAgIHsweDAxLCAweDBCLCAweDBCLCAweDBDLCAweDE4LCAweDIxLCAweDEwLCAweDEzfSwKKyAgICB7MHgxMiwgMHgwRCwgMHgwQSwgMHgxMCwgMHgxQywgMHgxRCwgMHgwRCwgMHgxMH0sCisgICAgezB4MDMsIDB4MDksIDB4MTQsIDB4MTUsIDB4MUIsIDB4MUEsIDB4MDEsIDB4RkZ9LAorICAgIHsweDA4LCAweDEyLCAweDEzLCAweDBFLCAweDE2LCAweDFELCAweDE0LCAweDFCfSwKKyAgICB7MHgwNywgMHgxNSwgMHgxQywgMHgxQiwgMHgyMCwgMHgyMSwgMHgxMSwgMHgwRX0sCisgICAgezB4MTIsIDB4MTgsIDB4MTksIDB4MTcsIDB4MjAsIDB4MjUsIDB4MUEsIDB4MUV9LAorICAgIHsweDBDLCAweDFBLCAweDFELCAweDIyLCAweDJGLCAweDMzLCAweDI3LCAweDI4fSwKKyAgICB7MHgwRSwgMHgxQSwgMHgxNywgMHgxMCwgMHgwQSwgMHgwRSwgMHhGRiwgMHgwNn0sCisgICAgezB4MUEsIDB4MUMsIDB4MTgsIDB4MTQsIDB4MUEsIDB4MTYsIDB4MEEsIDB4MEV9LAorICAgIHsweDFFLCAweDI3LCAweDI1LCAweDI2LCAweDI3LCAweDJBLCAweDIxLCAweDIxfSwKKyAgICB7MHhGMSwgMHgwQSwgMHgxNiwgMHgxQywgMHgyOCwgMHgyNSwgMHgxNSwgMHgxOX0sCisgICAgezB4MDgsIDB4MTIsIDB4MDksIDB4MDgsIDB4MTYsIDB4MTcsIDB4RUYsIDB4RjZ9LAorICAgIHsweDBDLCAweDBCLCAweDAwLCAweEZDLCAweDA0LCAweDA5LCAweEZDLCAweDAzfSwKKyAgICB7MHhGQiwgMHhGMSwgMHhGOCwgMHgyNiwgMHgyNCwgMHgxOCwgMHgxRCwgMHgyMH0sCisgICAgezB4RjksIDB4MDEsIDB4MEMsIDB4MEYsIDB4MDcsIDB4MDgsIDB4MDYsIDB4MDd9LAorICAgIHsweDA3LCAweDA2LCAweDA4LCAweDA0LCAweDA3LCAweDBELCAweDA3LCAweDA5fSwKKyAgICB7MHhGRSwgMHgwMSwgMHgwNiwgMHgwNSwgMHgxMywgMHgxQiwgMHgxNCwgMHgxOX0sCisgICAgezB4MDksIDB4MEMsIDB4MEUsIDB4MDEsIDB4MDgsIDB4MDUsIDB4RkIsIDB4RkR9LAorICAgIHsweDA3LCAweDA2LCAweDAzLCAweDBBLCAweDE2LCAweDEyLCAweDA0LCAweDA3fSwKKyAgICB7MHgwNCwgMHgwMSwgMHgwMCwgMHgwNCwgMHgxRiwgMHgyMCwgMHgwRSwgMHgwQX0sCisgICAgezB4MDMsIDB4RkYsIDB4RjYsIDB4RkIsIDB4MTUsIDB4MUEsIDB4MDAsIDB4MDN9LAorICAgIHsweEZDLCAweDE4LCAweDBCLCAweDJELCAweDM1LCAweDIzLCAweDEyLCAweDA5fSwKKyAgICB7MHgwMiwgMHhGRSwgMHgwMSwgMHhGRiwgMHgwQywgMHgxMSwgMHgwRCwgMHgwRn0sCisgICAgezB4RkEsIDB4RTksIDB4RDksIDB4RkYsIDB4MEQsIDB4MDUsIDB4MEQsIDB4MTB9LAorICAgIHsweEYxLCAweEUwLCAweEYwLCAweDAxLCAweDA2LCAweDA2LCAweDA2LCAweDEwfSwKKyAgICB7MHhFOSwgMHhENCwgMHhENywgMHgwRiwgMHgxNCwgMHgwQiwgMHgwRCwgMHgxNn0sCisgICAgezB4MDAsIDB4RkYsIDB4RUUsIDB4RTUsIDB4RkYsIDB4MDgsIDB4MDIsIDB4Rjl9LAorICAgIHsweEUwLCAweERBLCAweEU1LCAweEZFLCAweDA5LCAweDAyLCAweEY5LCAweDA0fSwKKyAgICB7MHhFMCwgMHhFMiwgMHhGNCwgMHgwOSwgMHgxMywgMHgwQywgMHgwRCwgMHgwOX0sCisgICAgezB4RkMsIDB4MDIsIDB4MDQsIDB4RkYsIDB4MDAsIDB4RkYsIDB4RjgsIDB4Rjd9LAorICAgIHsweEZFLCAweEZCLCAweEVELCAweEYyLCAweEZFLCAweEZFLCAweDA4LCAweDBDfSwKKyAgICB7MHhGMywgMHhFRiwgMHhEMCwgMHhFMywgMHgwNSwgMHgxMSwgMHhGRCwgMHhGRn0sCisgICAgezB4RkEsIDB4RUYsIDB4RUEsIDB4RkUsIDB4MEQsIDB4MEUsIDB4RkUsIDB4MDJ9LAorICAgIHsweEY3LCAweEZCLCAweERCLCAweERGLCAweDE0LCAweERELCAweDA3LCAweEZFfSwKKyAgICB7MHhGRSwgMHgwOCwgMHgwMCwgMHhEQiwgMHhFNSwgMHgxQSwgMHgxMywgMHhFRH0sCisgICAgezB4RjksIDB4RkUsIDB4RkYsIDB4RjQsIDB4RjMsIDB4MDAsIDB4MDUsIDB4MDJ9LAorICAgIHsweEVGLCAweERFLCAweEQ4LCAweEVCLCAweEVBLCAweEY1LCAweDBFLCAweDE5fSwKKyAgICB7MHhGQiwgMHhGQywgMHhGQSwgMHhFQywgMHhFQiwgMHhFRCwgMHhFRSwgMHhFOH0sCisgICAgezB4RUUsIDB4RkMsIDB4RkQsIDB4MDAsIDB4MDQsIDB4RkMsIDB4RjAsIDB4RjV9LAorICAgIHsweDAwLCAweEZBLCAweEY0LCAweEYxLCAweEY1LCAweEZBLCAweEZCLCAweEY5fSwKKyAgICB7MHhFQiwgMHhGMCwgMHhERiwgMHhFMywgMHhFRiwgMHgwNywgMHgwMiwgMHgwNX0sCisgICAgezB4RjcsIDB4RjAsIDB4RTYsIDB4RTcsIDB4MDYsIDB4MTUsIDB4MDYsIDB4MEN9LAorICAgIHsweEYxLCAweEU0LCAweEQ4LCAweEVBLCAweDA2LCAweEYyLCAweDA3LCAweDA5fSwKKyAgICB7MHhGRiwgMHhGRSwgMHhGRSwgMHhGOSwgMHhGRiwgMHhGRiwgMHgwMiwgMHhGOX0sCisgICAgezB4REQsIDB4RjQsIDB4RjAsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RUEsIDB4RjF9LAorICAgIHsweEYwLCAweEYxLCAweEZELCAweDAzLCAweDAzLCAweEZFLCAweDAwLCAweDA1fSwKKyAgICB7MHhGMSwgMHhGNiwgMHhFMCwgMHhERiwgMHhGNSwgMHgwMSwgMHhGNCwgMHhGOH0sCisgICAgezB4MDIsIDB4MDMsIDB4RTUsIDB4REMsIDB4RTcsIDB4RkQsIDB4MDIsIDB4MDh9LAorICAgIHsweEVDLCAweEYxLCAweEY1LCAweEVDLCAweEYyLCAweEY4LCAweEY2LCAweEVFfSwKKyAgICB7MHhGMywgMHhGNCwgMHhGNiwgMHhGNCwgMHhGNSwgMHhGMSwgMHhFNywgMHhFQX0sCisgICAgezB4RjcsIDB4RjMsIDB4RUMsIDB4RUEsIDB4RUYsIDB4RjAsIDB4RUUsIDB4RjF9LAorICAgIHsweEVCLCAweEY2LCAweEZCLCAweEZBLCAweEVGLCAweEYzLCAweEYzLCAweEY3fSwKKyAgICB7MHgwMSwgMHgwMywgMHhGMSwgMHhGNiwgMHgwNSwgMHhGOCwgMHhFMSwgMHhFQn0sCisgICAgezB4RjUsIDB4RjYsIDB4RjYsIDB4RjQsIDB4RkIsIDB4RkIsIDB4RkYsIDB4MDB9LAorICAgIHsweEY4LCAweDAxLCAweEZCLCAweEZBLCAweEZGLCAweDAzLCAweEZFLCAweDA0fSwKKyAgICB7MHgwNCwgMHhGQiwgMHgwMywgMHhGRCwgMHhGNSwgMHhGNywgMHhGNiwgMHhGQn0sCisgICAgezB4MDYsIDB4MDksIDB4RkIsIDB4RjQsIDB4RjksIDB4RkEsIDB4RkMsIDB4RkZ9LAorICAgIHsweEY1LCAweEY2LCAweEYxLCAweEVFLCAweEY1LCAweEY4LCAweEY1LCAweEY5fSwKKyAgICB7MHhGNSwgMHhGOSwgMHhGQSwgMHhGQywgMHgwNywgMHgwOSwgMHgwMSwgMHhGQn0sCisgICAgezB4RDcsIDB4RTksIDB4RTgsIDB4RUMsIDB4MDAsIDB4MEMsIDB4RkUsIDB4RjF9LAorICAgIHsweEVDLCAweDA0LCAweEU5LCAweERGLCAweDAzLCAweEU4LCAweDAwLCAweEZBfSwKKyAgICB7MHhFNiwgMHhFMiwgMHhGRiwgMHgwQSwgMHgxMywgMHgwMSwgMHgwMCwgMHhGN30sCisgICAgezB4RjEsIDB4RkEsIDB4RjcsIDB4RjUsIDB4MDEsIDB4MDYsIDB4MDUsIDB4MEF9LAorICAgIHsweEY2LCAweEY2LCAweEZDLCAweEY2LCAweEU4LCAweDExLCAweEYyLCAweEZFfSwKKyAgICB7MHhGRSwgMHgwOCwgMHgwNSwgMHgxMiwgMHhGRCwgMHhEMCwgMHgwRSwgMHgwN30sCisgICAgezB4RjEsIDB4RkUsIDB4RjcsIDB4RjIsIDB4RkIsIDB4MDIsIDB4RkEsIDB4Rjh9LAorICAgIHsweEY0LCAweEVBLCAweEVDLCAweEYzLCAweEZFLCAweDAxLCAweEY3LCAweEY2fSwKKyAgICB7MHhGRiwgMHhGQSwgMHhGQiwgMHhGOSwgMHhGRiwgMHgwMSwgMHgwNCwgMHgwM30sCisgICAgezB4MDAsIDB4RjksIDB4RjQsIDB4RkMsIDB4MDUsIDB4RkMsIDB4RjcsIDB4RkJ9LAorICAgIHsweEY4LCAweEZGLCAweEVGLCAweEVDLCAweEZCLCAweDA0LCAweEY4LCAweDAzfSwKKyAgICB7MHhFQiwgMHhGMSwgMHhFRCwgMHhGNCwgMHgwMiwgMHgwRSwgMHgwQiwgMHgwNH0sCisgICAgezB4RjcsIDB4MDEsIDB4RjgsIDB4RjQsIDB4RjgsIDB4RUYsIDB4RjgsIDB4MDR9LAorICAgIHsweEVCLCAweEYwLCAweEY3LCAweEZDLCAweDEwLCAweDBELCAweEY4LCAweEY4fSwKKyAgICB7MHhFOCwgMHhGRSwgMHhFRSwgMHhFOCwgMHhFRCwgMHhGNywgMHhGNSwgMHhGOH0sCisgICAgezB4RUQsIDB4RUIsIDB4RTksIDB4RUEsIDB4RjIsIDB4RjUsIDB4RjQsIDB4Rjl9LAorICAgIHsweEVBLCAweEYyLCAweEVGLCAweEVFLCAweEY5LCAweEZFLCAweEZELCAweDAyfSwKKyAgICB7MHhGQSwgMHhGRCwgMHgwMiwgMHgwRCwgMHhGQSwgMHhFNCwgMHgwRiwgMHgwMX0sCisgICAgezB4RkYsIDB4MDgsIDB4MDUsIDB4RjYsIDB4RjcsIDB4RkIsIDB4RjEsIDB4RjF9LAorICAgIHsweEY0LCAweEVDLCAweEVFLCAweEY2LCAweEVFLCAweEVFLCAweEY4LCAweDA2fSwKKyAgICB7MHhFOCwgMHhGQSwgMHhGOCwgMHhFOCwgMHhGOCwgMHhFOSwgMHhFRSwgMHhGOX0sCisgICAgezB4RTUsIDB4RTksIDB4RjAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RjMsIDB4Rjh9LAorICAgIHsweEY3LCAweEZCLCAweEZCLCAweEY3LCAweEY5LCAweEY5LCAweEY1LCAweEYwfSwKKyAgICB7MHhGRCwgMHhGRiwgMHhGMiwgMHhFRSwgMHhGMiwgMHhGNSwgMHhGMSwgMHhGM319OworCitzdGF0aWMgY29uc3QgVUNIQVIgZ18zYV9wdmNUYWIxX21vZGUyW1BWQ19OVEFCMV1bUFZDX05CTE9XXVtQVkNfTkJISUdIX01PREUyXSA9CisgICAge3t7MHgxMSwgMHgyNywgMHgwRiwgMHhGRCwgMHgwNCwgMHhGQ30sCisgICAgICB7MHgwMCwgMHhCRSwgMHhFMywgMHhGNCwgMHhEQiwgMHhGMH0sCisgICAgICB7MHgwOSwgMHgxRSwgMHgxOCwgMHgxQSwgMHgyMSwgMHgxQn19LAorICAgICB7ezB4MTYsIDB4MjgsIDB4MkIsIDB4MjksIDB4MjUsIDB4MzJ9LAorICAgICAgezB4RjIsIDB4RTksIDB4RTQsIDB4RTUsIDB4RTIsIDB4RDR9LAorICAgICAgezB4MEUsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEQsIDB4MEV9fSwKKyAgICAge3sweDJFLCAweDNDLCAweDIwLCAweDE2LCAweDFCLCAweDFBfSwKKyAgICAgIHsweEU0LCAweEM2LCAweEU1LCAweEY0LCAweERDLCAweERDfSwKKyAgICAgIHsweDBGLCAweDFCLCAweDE4LCAweDE0LCAweDFFLCAweDFBfX19OworCitzdGF0aWMgY29uc3QgVUNIQVIgZ18yYV9wdmNUYWIyX21vZGUyW1BWQ19OVEFCMl1bUFZDX05CSElHSF9NT0RFMl0gPSB7CisgICAgezB4MjYsIDB4MjUsIDB4MTEsIDB4MEMsIDB4RkEsIDB4MTV9LCB7MHgxQiwgMHgxOCwgMHgxMSwgMHgwRSwgMHgwRSwgMHgwRX0sCisgICAgezB4MTIsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTB9LCB7MHgxRSwgMHgyNCwgMHgxOSwgMHgxNSwgMHgxNCwgMHgxMn0sCisgICAgezB4MjQsIDB4MTYsIDB4MTIsIDB4MTMsIDB4MTUsIDB4MUN9LCB7MHhFQSwgMHhFRCwgMHhFQiwgMHhFQSwgMHhFQywgMHhFQn0sCisgICAgezB4RkMsIDB4RkQsIDB4RkQsIDB4RkMsIDB4RkUsIDB4RkV9LCB7MHgwRiwgMHgwQywgMHgwQiwgMHgwQSwgMHgwQiwgMHgwQn0sCisgICAgezB4MjIsIDB4MEIsIDB4MTYsIDB4MTgsIDB4MTMsIDB4MTl9LCB7MHgxQywgMHgxNCwgMHgxRCwgMHgyMCwgMHgxOSwgMHgxQX0sCisgICAgezB4MTAsIDB4MDgsIDB4MDAsIDB4RkYsIDB4MDIsIDB4MDV9LCB7MHgwNiwgMHgwNywgMHgwNSwgMHgwMywgMHgwNSwgMHgwNH0sCisgICAgezB4MkEsIDB4MUYsIDB4MTIsIDB4MTIsIDB4MTEsIDB4MTh9LCB7MHgxOSwgMHgxOSwgMHgwMiwgMHgwNCwgMHgwMCwgMHgwNH0sCisgICAgezB4MTgsIDB4MTcsIDB4MTcsIDB4MTUsIDB4MTYsIDB4MTV9LCB7MHgyMSwgMHgxRSwgMHgxQiwgMHgxOSwgMHgxQywgMHgxQn0sCisgICAgezB4M0MsIDB4MzUsIDB4MjAsIDB4MUQsIDB4MzAsIDB4MzR9LCB7MHgzQSwgMHgxRiwgMHgzNywgMHgzOCwgMHgzMywgMHgzMX0sCisgICAgezB4MzcsIDB4MzQsIDB4MjUsIDB4MjcsIDB4MzUsIDB4MzR9LCB7MHgzNCwgMHgyRSwgMHgzMiwgMHgzMSwgMHgzNCwgMHgzMX0sCisgICAgezB4MzYsIDB4MzMsIDB4MkYsIDB4MkYsIDB4MzIsIDB4MkZ9LCB7MHgzNSwgMHgyMCwgMHgyRiwgMHgzMiwgMHgyRiwgMHgyQ30sCisgICAgezB4MkUsIDB4MkIsIDB4MkYsIDB4MzQsIDB4MzYsIDB4MzB9LCB7MHgzRiwgMHgzOSwgMHgzMCwgMHgyOCwgMHgyOSwgMHgyOX0sCisgICAgezB4M0MsIDB4MzAsIDB4MzIsIDB4MzcsIDB4MzksIDB4MzZ9LCB7MHgzNywgMHgzNiwgMHgzMCwgMHgyQiwgMHgyNiwgMHgyNH0sCisgICAgezB4NDQsIDB4MzgsIDB4MkYsIDB4MkQsIDB4MkQsIDB4MkR9LCB7MHgzOCwgMHgyQiwgMHgyQywgMHgyQywgMHgzMCwgMHgyRH0sCisgICAgezB4MzcsIDB4MzYsIDB4MkYsIDB4MjMsIDB4MkQsIDB4MzJ9LCB7MHgzQywgMHgzOSwgMHgyOSwgMHgyRSwgMHgzOCwgMHgzN30sCisgICAgezB4M0IsIDB4M0EsIDB4MzUsIDB4MzIsIDB4MzEsIDB4MkR9LCB7MHgzMiwgMHgzMSwgMHgyRiwgMHgyQywgMHgyRCwgMHgyOH0sCisgICAgezB4MkMsIDB4MzEsIDB4MzIsIDB4MzAsIDB4MzIsIDB4MkR9LCB7MHgzNSwgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNSwgMHgzM30sCisgICAgezB4MzQsIDB4MzgsIDB4M0IsIDB4M0MsIDB4M0UsIDB4M0F9LCB7MHgzRSwgMHgzQywgMHgzQiwgMHgzQSwgMHgzQywgMHgzOX0sCisgICAgezB4M0QsIDB4NDEsIDB4NDYsIDB4NDEsIDB4M0QsIDB4Mzh9LCB7MHg0NCwgMHg0MSwgMHg0MCwgMHgzRSwgMHgzRiwgMHgzQX0sCisgICAgezB4NDcsIDB4NDcsIDB4NDcsIDB4NDIsIDB4NDQsIDB4NDB9LCB7MHg0QywgMHg0QSwgMHg0QSwgMHg0NiwgMHg0OSwgMHg0NX0sCisgICAgezB4NTMsIDB4NTIsIDB4NTIsIDB4NEMsIDB4NEUsIDB4NDl9LCB7MHg0MSwgMHgzRCwgMHgzOSwgMHgyQywgMHgyRSwgMHgyRX0sCisgICAgezB4MkQsIDB4MzcsIDB4MzYsIDB4MzAsIDB4MjgsIDB4MzZ9LCB7MHgzQiwgMHgzMiwgMHgyRSwgMHgyRCwgMHgyRCwgMHgyOX0sCisgICAgezB4NDAsIDB4MzksIDB4MzYsIDB4MzUsIDB4MzYsIDB4MzJ9LCB7MHgzMCwgMHgyRCwgMHgyRCwgMHgyRSwgMHgzMSwgMHgzMH0sCisgICAgezB4MzgsIDB4M0QsIDB4M0IsIDB4MzcsIDB4MzUsIDB4MzR9LCB7MHg0NCwgMHgzRCwgMHgzQywgMHgzOCwgMHgzNywgMHgzM30sCisgICAgezB4M0EsIDB4MzYsIDB4MzcsIDB4MzcsIDB4MzksIDB4MzZ9LCB7MHgzMiwgMHgzNiwgMHgzNywgMHgzMCwgMHgyRSwgMHgyQX0sCisgICAgezB4M0MsIDB4MzMsIDB4MzMsIDB4MzEsIDB4MzMsIDB4MzB9LCB7MHgzMCwgMHgzMSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzNH0sCisgICAgezB4MjYsIDB4MjcsIDB4MkUsIDB4MjksIDB4MUMsIDB4MTZ9LCB7MHgxNCwgMHgxNSwgMHgxRiwgMHgxNywgMHgxNSwgMHgxQ30sCisgICAgezB4MzgsIDB4MkQsIDB4MTgsIDB4MTMsIDB4MUUsIDB4MkJ9LCB7MHgzMCwgMHgyMiwgMHgxNywgMHgxQSwgMHgyNiwgMHgyQn0sCisgICAgezB4MjQsIDB4MjAsIDB4MUYsIDB4MTAsIDB4MEMsIDB4MTF9LCB7MHgyNywgMHgxRiwgMHgxMywgMHgxNywgMHgyNCwgMHgyQX0sCisgICAgezB4MkYsIDB4MTMsIDB4MTgsIDB4MTMsIDB4MkEsIDB4MzJ9LCB7MHgzMSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgyMSwgMHgyOH0sCisgICAgezB4MkEsIDB4MTIsIDB4MTksIDB4MTcsIDB4MTYsIDB4MjR9LCB7MHgyNywgMHgwRiwgMHgxNiwgMHgxRCwgMHgxNywgMHgxQ30sCisgICAgezB4MkYsIDB4MjYsIDB4MjUsIDB4MjIsIDB4MjAsIDB4MjJ9LCB7MHgxRSwgMHgxQiwgMHgxRSwgMHgxOCwgMHgxRSwgMHgyNH0sCisgICAgezB4MzEsIDB4MjYsIDB4MEUsIDB4MTUsIDB4MTUsIDB4MjV9LCB7MHgyRCwgMHgyMiwgMHgxRSwgMHgxNCwgMHgxMCwgMHgyMn0sCisgICAgezB4MjUsIDB4MUIsIDB4MTgsIDB4MTEsIDB4MTMsIDB4MUZ9LCB7MHgyRiwgMHgxQiwgMHgxMywgMHgxQiwgMHgxOCwgMHgyMn0sCisgICAgezB4MjEsIDB4MjQsIDB4MUQsIDB4MUMsIDB4MUQsIDB4MUJ9LCB7MHgyMywgMHgxRSwgMHgyOCwgMHgyOSwgMHgyNywgMHgyNX0sCisgICAgezB4MkUsIDB4MkEsIDB4MUQsIDB4MTcsIDB4MjYsIDB4MkR9LCB7MHgzMSwgMHgyQywgMHgxQSwgMHgwRSwgMHgxQSwgMHgyNH0sCisgICAgezB4MjYsIDB4MTYsIDB4MjAsIDB4MUQsIDB4MTQsIDB4MUV9LCB7MHgyOSwgMHgyMCwgMHgxQiwgMHgxQiwgMHgxNywgMHgxN30sCisgICAgezB4MUQsIDB4MDYsIDB4MUEsIDB4MUUsIDB4MUIsIDB4MUR9LCB7MHgyQiwgMHgyMywgMHgxRiwgMHgxRiwgMHgxRCwgMHgxQ30sCisgICAgezB4MjcsIDB4MUEsIDB4MEMsIDB4MEUsIDB4MEYsIDB4MUF9LCB7MHgyOSwgMHgxRCwgMHgxRSwgMHgyMiwgMHgyMiwgMHgyNH0sCisgICAgezB4MjAsIDB4MjEsIDB4MUIsIDB4MTgsIDB4MTMsIDB4MjF9LCB7MHgyNywgMHgwRSwgMHgxMCwgMHgxNCwgMHgxMCwgMHgxQX0sCisgICAgezB4MjYsIDB4MjQsIDB4MjUsIDB4MjUsIDB4MjYsIDB4Mjh9LCB7MHgxQSwgMHgyNCwgMHgyNSwgMHgyOSwgMHgyNiwgMHgyNH0sCisgICAgezB4MUQsIDB4MUQsIDB4MTUsIDB4MTIsIDB4MEYsIDB4MTh9LCB7MHgxRSwgMHgxNCwgMHgxMywgMHgxMiwgMHgxNCwgMHgxOH0sCisgICAgezB4MTYsIDB4MTMsIDB4MTMsIDB4MUEsIDB4MUIsIDB4MUR9LCB7MHgyMCwgMHgyNywgMHgyMiwgMHgyNCwgMHgxQSwgMHgxOX0sCisgICAgezB4MUYsIDB4MTcsIDB4MTksIDB4MTgsIDB4MTcsIDB4MTh9LCB7MHgyMCwgMHgxQiwgMHgxQywgMHgxQywgMHgxQiwgMHgxQX0sCisgICAgezB4MjMsIDB4MTksIDB4MUQsIDB4MUYsIDB4MUUsIDB4MjF9LCB7MHgyNiwgMHgxRiwgMHgxRCwgMHgxQiwgMHgxOSwgMHgxQX0sCisgICAgezB4MjMsIDB4MUUsIDB4MUYsIDB4MjAsIDB4MUYsIDB4MUV9LCB7MHgyOSwgMHgyMCwgMHgyMiwgMHgyMCwgMHgyMCwgMHgxRn0sCisgICAgezB4MjYsIDB4MjMsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjN9LCB7MHgyOSwgMHgxRiwgMHgyNCwgMHgyNSwgMHgyNiwgMHgyOX0sCisgICAgezB4MkIsIDB4MjIsIDB4MjUsIDB4MjcsIDB4MjMsIDB4MjF9LCB7MHgyOSwgMHgyMSwgMHgxOSwgMHgwRSwgMHgyMiwgMHgyRH0sCisgICAgezB4MzIsIDB4MjksIDB4MUYsIDB4MUMsIDB4MUIsIDB4MjF9LCB7MHgxRSwgMHgxQSwgMHgxRSwgMHgyNCwgMHgyNSwgMHgyNX0sCisgICAgezB4MjQsIDB4MUQsIDB4MjEsIDB4MjIsIDB4MjIsIDB4MjV9LCB7MHgyQywgMHgyNSwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNX0sCisgICAgezB4MjQsIDB4MUUsIDB4MjEsIDB4MjYsIDB4MkIsIDB4MkN9LCB7MHgyOCwgMHgyNCwgMHgxQiwgMHgxRiwgMHgyOCwgMHgyRH0sCisgICAgezB4MjMsIDB4MTMsIDB4MTYsIDB4MjIsIDB4MjIsIDB4Mjl9LCB7MHgxQiwgMHgyMywgMHgxQywgMHgyMCwgMHgxNCwgMHgwRH0sCisgICAgezB4MUUsIDB4MTYsIDB4MUEsIDB4MUUsIDB4MUMsIDB4MUR9LCB7MHgyQiwgMHgxQywgMHgxRCwgMHgyMCwgMHgxQiwgMHgxQ30sCisgICAgezB4MUMsIDB4MUIsIDB4MjMsIDB4MUYsIDB4MTksIDB4MUV9LCB7MHgyMSwgMHgyMywgMHgyNiwgMHgyMCwgMHgyMCwgMHgyMn0sCisgICAgezB4MUQsIDB4MEIsIDB4MTksIDB4MUUsIDB4MTEsIDB4MTl9LCB7MHgxOCwgMHgxNywgMHgxNiwgMHgxNywgMHgxNCwgMHgxNn0sCisgICAgezB4MTYsIDB4MTksIDB4MUMsIDB4MjAsIDB4MjEsIDB4MjJ9LCB7MHgzMCwgMHgxRSwgMHgyMiwgMHgyNCwgMHgyNSwgMHgyNn0sCisgICAgezB4MUIsIDB4MUYsIDB4MTcsIDB4MUQsIDB4MUUsIDB4MjF9LCB7MHgzMiwgMHgyQiwgMHgyNywgMHgxRiwgMHgxQiwgMHgxQX0sCisgICAgezB4MjgsIDB4MjAsIDB4MUEsIDB4MUIsIDB4MUYsIDB4MjN9LCB7MHgzMiwgMHgyMSwgMHgyMCwgMHgyMSwgMHgxRCwgMHgxRn0sCisgICAgezB4MjIsIDB4MTgsIDB4MTIsIDB4MTUsIDB4MUIsIDB4MjB9LCB7MHgyNywgMHgyNywgMHgyQSwgMHgyNCwgMHgyMSwgMHgyMX0sCisgICAgezB4MUUsIDB4MEYsIDB4MEQsIDB4MUEsIDB4MUQsIDB4MjN9LCB7MHgyOCwgMHgyNSwgMHgyNywgMHgyMSwgMHgxNywgMHgyNX0sCisgICAgezB4MkIsIDB4MjcsIDB4MjMsIDB4MTksIDB4MTMsIDB4MTR9LCB7MHgyNSwgMHgyQiwgMHgyMiwgMHgyMiwgMHgyMCwgMHgyMX0sCisgICAgezB4MjcsIDB4MUIsIDB4MTYsIDB4MTcsIDB4MEYsIDB4MTV9LCB7MHgyOSwgMHgyNiwgMHgyMywgMHgxNSwgMHgxRSwgMHgyOH0sCisgICAgezB4MjQsIDB4MUMsIDB4MTksIDB4MUEsIDB4MTgsIDB4MTl9LCB7MHgyRCwgMHgxNSwgMHgyNywgMHgyQiwgMHgyNCwgMHgyM30sCisgICAgezB4MkMsIDB4MTIsIDB4MUYsIDB4MjMsIDB4MUYsIDB4MjB9LCB7MHgyNSwgMHgwRiwgMHgyMiwgMHgyNywgMHgxRiwgMHgyMX19OworCitzdGF0aWMgY29uc3QgVUNIQVIgZ19hX3B2Y1RhYjFfZHBfbW9kZTFbUFZDX05UQUIxIC0gMV0gPSB7MTcsIDY4fTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBnX2FfcHZjVGFiMV9kcF9tb2RlMltQVkNfTlRBQjEgLSAxXSA9IHsxNiwgNTJ9OworLyogZnJhY3Rpb25hbCBleHBvbmVudCB3aGljaCBjb3JyZXNwb25kcyB0byBRIHJlcHJlc2VudGF0aW9uIHZhbHVlICovCitzdGF0aWMgY29uc3QgU0NIQVIgZ19hX3NjYWxpbmdDb2VmX21vZGUxW1BWQ19OQkxPVyArIDFdID0geworICAgIC0xLCAtMSwgMCwgNn07IC8qIHsgOCwgOCwgNywgMSB9OyBRIHNjYWxpbmcgKi8KK3N0YXRpYyBjb25zdCBTQ0hBUiBnX2Ffc2NhbGluZ0NvZWZfbW9kZTJbUFZDX05CTE9XICsgMV0gPSB7CisgICAgMCwgMCwgMSwgN307IC8qIHsgNywgNywgNiwgMCB9OyBRIHNjYWxpbmcgKi8KKworaW50IHB2Y0luaXRGcmFtZShQVkNfU1RBVElDX0RBVEEgKnBQdmNTdGF0aWNEYXRhLAorICAgICAgICAgICAgICAgICBQVkNfRFlOQU1JQ19EQVRBICpwUHZjRHluYW1pY0RhdGEsIGNvbnN0IFVDSEFSIHB2Y01vZGUsCisgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIG5zLCBjb25zdCBpbnQgUkFURSwgY29uc3QgaW50IGt4LAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcHZjQm9yZGVyMCwgY29uc3QgVUNIQVIgKnBQdmNJRCkgeworICBpbnQgbGJ3LCBoYncsIGksIHRlbXA7CisgIHBQdmNEeW5hbWljRGF0YS0+cHZjX21vZGUgPSBwdmNNb2RlOworICBwUHZjRHluYW1pY0RhdGEtPmt4ID0ga3g7CisgIHBQdmNEeW5hbWljRGF0YS0+UkFURSA9IFJBVEU7CisKKyAgc3dpdGNoIChwdmNNb2RlKSB7CisgICAgY2FzZSAwOgorICAgICAgLyogbGVnYWN5IFNCUiwgbm90aGluZyB0byBkbyAqLworICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSAxOgorICAgICAgcFB2Y0R5bmFtaWNEYXRhLT5uYkhpZ2ggPSA4OworICAgICAgcFB2Y0R5bmFtaWNEYXRhLT5wUFZDVGFiMSA9IChjb25zdCBVQ0hBUiAqKWdfM2FfcHZjVGFiMV9tb2RlMTsKKyAgICAgIHBQdmNEeW5hbWljRGF0YS0+cFBWQ1RhYjIgPSAoY29uc3QgVUNIQVIgKilnXzJhX3B2Y1RhYjJfbW9kZTE7CisgICAgICBwUHZjRHluYW1pY0RhdGEtPnBQVkNUYWIxX2RwID0gZ19hX3B2Y1RhYjFfZHBfbW9kZTE7CisgICAgICBwUHZjRHluYW1pY0RhdGEtPnBTY2FsaW5nQ29lZiA9IGdfYV9zY2FsaW5nQ29lZl9tb2RlMTsKKyAgICAgIGhidyA9IDggLyBSQVRFOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgcFB2Y0R5bmFtaWNEYXRhLT5uYkhpZ2ggPSA2OworICAgICAgcFB2Y0R5bmFtaWNEYXRhLT5wUFZDVGFiMSA9IChjb25zdCBVQ0hBUiAqKWdfM2FfcHZjVGFiMV9tb2RlMjsKKyAgICAgIHBQdmNEeW5hbWljRGF0YS0+cFBWQ1RhYjIgPSAoY29uc3QgVUNIQVIgKilnXzJhX3B2Y1RhYjJfbW9kZTI7CisgICAgICBwUHZjRHluYW1pY0RhdGEtPnBQVkNUYWIxX2RwID0gZ19hX3B2Y1RhYjFfZHBfbW9kZTI7CisgICAgICBwUHZjRHluYW1pY0RhdGEtPnBTY2FsaW5nQ29lZiA9IGdfYV9zY2FsaW5nQ29lZl9tb2RlMjsKKyAgICAgIGhidyA9IDEyIC8gUkFURTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBpbnZhbGlkIHB2Y01vZGUgKi8KKyAgICAgIHJldHVybiAxOworICB9CisKKyAgcFB2Y0R5bmFtaWNEYXRhLT5wdmNCb3JkZXIwID0gcHZjQm9yZGVyMDsKKyAgVUNIQVIgcHZjQm9yZGVyMF9sYXN0ID0gcFB2Y1N0YXRpY0RhdGEtPnB2Y0JvcmRlcjA7CisgIHBQdmNTdGF0aWNEYXRhLT5wdmNCb3JkZXIwID0gcHZjQm9yZGVyMDsKKyAgcFB2Y0R5bmFtaWNEYXRhLT5wUHZjSUQgPSBwUHZjSUQ7CisKKyAgcFB2Y0R5bmFtaWNEYXRhLT5ucyA9IG5zOworICBzd2l0Y2ggKG5zKSB7CisgICAgY2FzZSAxNjoKKyAgICAgIHBQdmNEeW5hbWljRGF0YS0+cFNDY29lZmZzID0gcHZjX1NDXzE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICAgIHBQdmNEeW5hbWljRGF0YS0+cFNDY29lZmZzID0gcHZjX1NDXzEyOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgcFB2Y0R5bmFtaWNEYXRhLT5wU0Njb2VmZnMgPSBwdmNfU0NfNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHBQdmNEeW5hbWljRGF0YS0+cFNDY29lZmZzID0gcHZjX1NDXzM7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDE7CisgIH0KKworICAvKiBpbiB0aGUgbG93ZXIgcGFydCBvZiBFc2ctYXJyYXkgdGhlcmUgYXJlIHByZXZpb3VzIHZhbHVlcyBvZiBFc2cgKGZyb20gbGFzdAorICAgICBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gSW4gY2FzZSBvZiBhbiBwcmV2aW91cyBsZWdheS1TQlIgZnJhbWUsIG9yIGlmIHRoZXJlCisgICAgIHdhcyBhIGNoYW5nZSBpbiBjcm9zcy1vdmVyIEZRIHRoZSB2YWx1ZSBvZiBmaXJzdCBQVkMgU0JSIHRpbWVzbG90IGlzCisgICAgIHByb3BhZ2F0ZWQgdG8gcHJldi12YWx1ZXMgaW4gb3JkZXIgdG8gaGF2ZSByZWFzb25hYmxlIHZhbHVlcyBmb3IKKyAgICAgc21vb3RoLWZpbHRlcmluZworICAqLworICBpZiAoKHBQdmNTdGF0aWNEYXRhLT5wdmNfbW9kZV9sYXN0ID09IDApIHx8IChwUHZjU3RhdGljRGF0YS0+a3hfbGFzdCAhPSBreCkpIHsKKyAgICBwUHZjRHluYW1pY0RhdGEtPnBhc3RFc2dTbG90c0F2YWlsID0gMDsKKyAgfSBlbHNlIHsKKyAgICBwUHZjRHluYW1pY0RhdGEtPnBhc3RFc2dTbG90c0F2YWlsID0gUFZDX05TX01BWCAtIHB2Y0JvcmRlcjBfbGFzdDsKKyAgfQorCisgIGxidyA9IDggLyBSQVRFOworCisgIHRlbXAgPSBreDsKKyAgZm9yIChpID0gUFZDX05CTE9XOyBpID49IDA7IGktLSkgeworICAgIHBQdmNEeW5hbWljRGF0YS0+c2dfb2Zmc2V0X2xvd1tpXSA9IHRlbXA7CisgICAgdGVtcCAtPSBsYnc7CisgIH0KKworICB0ZW1wID0gMDsKKyAgZm9yIChpID0gMDsgaSA8PSBwUHZjRHluYW1pY0RhdGEtPm5iSGlnaDsgaSsrKSB7CisgICAgcFB2Y0R5bmFtaWNEYXRhLT5zZ19vZmZzZXRfaGlnaF9reFtpXSA9IHRlbXA7CisgICAgdGVtcCArPSBoYnc7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyogY2FsbCBpZiBwdmNNb2RlID0gMSwyICovCit2b2lkIHB2Y0RlY29kZUZyYW1lKFBWQ19TVEFUSUNfREFUQSAqcFB2Y1N0YXRpY0RhdGEsCisgICAgICAgICAgICAgICAgICAgIFBWQ19EWU5BTUlDX0RBVEEgKnBQdmNEeW5hbWljRGF0YSwgRklYUF9EQkwgKipxbWZCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlckltYWcsIGNvbnN0IGludCBvdmVybGFwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcW1mRXhwb25lbnRPdmVybGFwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcW1mRXhwb25lbnRDdXJyZW50KSB7CisgIGludCB0OworICBGSVhQX0RCTCAqcHJlZGljdGVkRXNnU2xvdDsKKyAgaW50IFJBVEUgPSBwUHZjRHluYW1pY0RhdGEtPlJBVEU7CisgIGludCBwdmNCb3JkZXIwID0gcFB2Y0R5bmFtaWNEYXRhLT5wdmNCb3JkZXIwOworCisgIGZvciAodCA9IHB2Y0JvcmRlcjA7IHQgPCBQVkNfTlRJTUVTTE9UOyB0KyspIHsKKyAgICBpbnQgKnBQcmVkRXNnX2V4cCA9ICZwUHZjRHluYW1pY0RhdGEtPnByZWRFc2dfZXhwW3RdOworICAgIHByZWRpY3RlZEVzZ1Nsb3QgPSBwUHZjRHluYW1pY0RhdGEtPnByZWRFc2dbdF07CisKKyAgICBwdmNEZWNvZGVUaW1lU2xvdCgKKyAgICAgICAgcFB2Y1N0YXRpY0RhdGEsIHBQdmNEeW5hbWljRGF0YSwgJnFtZkJ1ZmZlclJlYWxbdCAqIFJBVEVdLAorICAgICAgICAmcW1mQnVmZmVySW1hZ1t0ICogUkFURV0sCisgICAgICAgICh0ICogUkFURSA8IG92ZXJsYXApID8gcW1mRXhwb25lbnRPdmVybGFwIDogcW1mRXhwb25lbnRDdXJyZW50LAorICAgICAgICBwdmNCb3JkZXIwLCB0LCBwcmVkaWN0ZWRFc2dTbG90LCBwUHJlZEVzZ19leHApOworICB9CisKKyAgcmV0dXJuOworfQorCit2b2lkIHB2Y0RlY29kZVRpbWVTbG90KFBWQ19TVEFUSUNfREFUQSAqcFB2Y1N0YXRpY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIFBWQ19EWU5BTUlDX0RBVEEgKnBQdmNEeW5hbWljRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZTbG90UmVhbCwgRklYUF9EQkwgKipxbWZTbG90SW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHFtZkV4cG9uZW50LCBjb25zdCBpbnQgcHZjQm9yZGVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVTbG90TnVtYmVyLCBGSVhQX0RCTCBwcmVkaWN0ZWRFc2dTbG90W10sCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqcHJlZGljdGVkRXNnX2V4cCkgeworICBpbnQgaSwgYmFuZCwga3NnLCBrc2dfc3RhcnQgPSAwOworICBpbnQgUkFURSA9IHBQdmNEeW5hbWljRGF0YS0+UkFURTsKKyAgaW50IEVzZ19pbmRleCA9IHBQdmNTdGF0aWNEYXRhLT5Fc2dfc2xvdF9pbmRleDsKKyAgY29uc3QgU0NIQVIgKnNnX2JvcmRlcnMgPSBwUHZjRHluYW1pY0RhdGEtPnNnX29mZnNldF9sb3c7CisgIEZJWFBfREJMICpwRXNnID0gcFB2Y1N0YXRpY0RhdGEtPkVzZ1tFc2dfaW5kZXhdOworICBGSVhQX0RCTCBFW1BWQ19OQkxPV10gPSB7MH07CisKKyAgLyogU3ViYmFuZCBncm91cGluZyBpbiBRTUYgc3ViYmFuZHMgYmVsb3cgU0JSIHJhbmdlICovCisgIC8qIFdpdGhpbiBvbmUgdGltZXNsb3QgKCBpID0gWzAuLi4oUkFURS0xKV0gUU1GIHN1YnNhbXBsZXMpIGNhbGN1bGF0ZSBlbmVyZ3kKKyAgICAgRShpYix0KSBhbmQgZ3JvdXAgdGhlbSB0byBFc2coa3NnLHQpLiBUaGVuIHRyYW5zZmVyIHZhbHVlcyB0byBsb2dhcml0aG1pY2FsCisgICAgIGRvbWFpbiBhbmQgc3RvcmUgdGhlbSBmb3IgdGltZSBkb21haW4gc21vb3RoaW5nLiAoNy41LjYuMyBTdWJiYW5kIGdyb3VwaW5nCisgICAgIGluIFFNRiBzdWJiYW5kcyBiZWxvdyBTQlIgcmFuZ2UpCisgICovCisgIGZvciAoa3NnID0gMDsgc2dfYm9yZGVyc1trc2ddIDwgMDsga3NnKyspIHsKKyAgICBwRXNnW2tzZ10gPSBGTDJGWENPTlNUX0RCTCgtMTAuMCAvICgxIDw8IFBWQ19FU0dfRVhQKSk7IC8qIDEwKmxvZzEwKDAuMSkgKi8KKyAgICBrc2dfc3RhcnQrKzsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBSQVRFOyBpKyspIHsKKyAgICBGSVhQX0RCTCAqcW1mUiwgKnFtZkk7CisgICAgcW1mUiA9IHFtZlNsb3RSZWFsW2ldOworICAgIHFtZkkgPSBxbWZTbG90SW1hZ1tpXTsKKyAgICBmb3IgKGtzZyA9IGtzZ19zdGFydDsga3NnIDwgUFZDX05CTE9XOyBrc2crKykgeworICAgICAgZm9yIChiYW5kID0gc2dfYm9yZGVyc1trc2ddOyBiYW5kIDwgc2dfYm9yZGVyc1trc2cgKyAxXTsgYmFuZCsrKSB7CisgICAgICAgIC8qIFRoZSBkaXZpc2lvbiBieSA4ID09IChSQVRFKmxidykgaXMgcmVxdWlyZWQgYWxnb3JpdGhtaWNhbGx5ICovCisgICAgICAgIEVba3NnXSArPSAoZlBvdzJEaXYyKHFtZlJbYmFuZF0pICsgZlBvdzJEaXYyKHFtZklbYmFuZF0pKSA+PiAyOworICAgICAgfQorICAgIH0KKyAgfQorICBmb3IgKGtzZyA9IGtzZ19zdGFydDsga3NnIDwgUFZDX05CTE9XOyBrc2crKykgeworICAgIGlmIChFW2tzZ10gPiAoRklYUF9EQkwpMCkgeworICAgICAgLyogMTAvbG9nMigxMCkgPSAwLjc1MjU3NDk4OTE1OTk1MyAqIDJeMiAqLworICAgICAgaW50IGV4cF9sb2c7CisgICAgICBGSVhQX0RCTCBucmcgPSBDYWxjTG9nMihFW2tzZ10sIDIgKiBxbWZFeHBvbmVudCwgJmV4cF9sb2cpOworICAgICAgbnJnID0gZk11bHQobnJnLCBGTDJGWENPTlNUX1NHTChMT0cxMEZBQykpOworICAgICAgbnJnID0gc2NhbGVWYWx1ZShucmcsIGV4cF9sb2cgLSBQVkNfRVNHX0VYUCArIDIpOworICAgICAgcEVzZ1trc2ddID0gZk1heChucmcsIEZMMkZYQ09OU1RfREJMKC0xMC4wIC8gKDEgPDwgUFZDX0VTR19FWFApKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBFc2dba3NnXSA9CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoLTEwLjAgLyAoMSA8PCBQVkNfRVNHX0VYUCkpOyAvKiAxMCpsb2cxMCgwLjEpICovCisgICAgfQorICB9CisKKyAgLyogVGltZSBkb21haW4gc21vb3RoaW5nIG9mIHN1YmJhbmQtZ3JvdXBlZCBlbmVyZ3kgKi8KKyAgeworICAgIGludCBpZHggPSBwUHZjU3RhdGljRGF0YS0+RXNnX3Nsb3RfaW5kZXg7CisgICAgRklYUF9EQkwgKnBFc2dfZmlsdDsKKyAgICBGSVhQX1NHTCBTQ2NvZWZmOworCisgICAgRVswXSA9IEVbMV0gPSBFWzJdID0gKEZJWFBfREJMKTA7CisgICAgZm9yIChpID0gMDsgaSA8IHBQdmNEeW5hbWljRGF0YS0+bnM7IGkrKykgeworICAgICAgU0Njb2VmZiA9IHBQdmNEeW5hbWljRGF0YS0+cFNDY29lZmZzW2ldOworICAgICAgcEVzZ19maWx0ID0gcFB2Y1N0YXRpY0RhdGEtPkVzZ1tpZHhdOworICAgICAgLyogRGl2MiBpcyBjb21wZW5zYXRlZCBieSBzY2FsaW5nIG9mIGNvZWZmIHRhYmxlICovCisgICAgICBFWzBdID0gZk11bHRBZGREaXYyKEVbMF0sIHBFc2dfZmlsdFswXSwgU0Njb2VmZik7CisgICAgICBFWzFdID0gZk11bHRBZGREaXYyKEVbMV0sIHBFc2dfZmlsdFsxXSwgU0Njb2VmZik7CisgICAgICBFWzJdID0gZk11bHRBZGREaXYyKEVbMl0sIHBFc2dfZmlsdFsyXSwgU0Njb2VmZik7CisgICAgICBpZiAoaSA+PSBwUHZjRHluYW1pY0RhdGEtPnBhc3RFc2dTbG90c0F2YWlsKSB7CisgICAgICAgIC8qIGlmIHBhc3QgRXNnIHZhbHVlcyBhcmUgbm90IGF2YWlsYWJsZSB1c2UgdGhlIG9uZXMgZnJvbSB0aGUgbGFzdCB2YWxpZAorICAgICAgICAgKiBzbG90ICovCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGlkeCA+IDApIHsKKyAgICAgICAgaWR4LS07CisgICAgICB9IGVsc2UgeworICAgICAgICBpZHggKz0gUFZDX05TX01BWCAtIDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogU0JSIGVudmVsb3BlIHNjYWxlZmFjdG9yIHByZWRpY3Rpb24gKi8KKyAgeworICAgIGludCBFX2hpZ2hfZXhwW1BWQ19OQkhJR0hfTUFYXTsKKyAgICBpbnQgRV9oaWdoX2V4cF9tYXggPSAwOworICAgIGludCBwdmNUYWIxSUQ7CisgICAgaW50IHB2Y1RhYjJJRCA9IChpbnQpcFB2Y0R5bmFtaWNEYXRhLT5wUHZjSURbdGltZVNsb3ROdW1iZXJdOworICAgIGNvbnN0IFVDSEFSICpwVGFiMSwgKnBUYWIyOworICAgIGlmIChwdmNUYWIySUQgPCBwUHZjRHluYW1pY0RhdGEtPnBQVkNUYWIxX2RwWzBdKSB7CisgICAgICBwdmNUYWIxSUQgPSAwOworICAgIH0gZWxzZSBpZiAocHZjVGFiMklEIDwgcFB2Y0R5bmFtaWNEYXRhLT5wUFZDVGFiMV9kcFsxXSkgeworICAgICAgcHZjVGFiMUlEID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgcHZjVGFiMUlEID0gMjsKKyAgICB9CisgICAgcFRhYjEgPSAmKHBQdmNEeW5hbWljRGF0YQorICAgICAgICAgICAgICAgICAgLT5wUFZDVGFiMVtwdmNUYWIxSUQgKiBQVkNfTkJMT1cgKiBwUHZjRHluYW1pY0RhdGEtPm5iSGlnaF0pOworICAgIHBUYWIyID0gJihwUHZjRHluYW1pY0RhdGEtPnBQVkNUYWIyW3B2Y1RhYjJJRCAqIHBQdmNEeW5hbWljRGF0YS0+bmJIaWdoXSk7CisgICAgZm9yIChrc2cgPSAwOyBrc2cgPCBwUHZjRHluYW1pY0RhdGEtPm5iSGlnaDsga3NnKyspIHsKKyAgICAgIEZJWFBfU0dMIHByZWRDb2VmZjsKKyAgICAgIEZJWFBfREJMIGFjY3U7CisgICAgICBpbnQgcHJlZENvZWZmX2V4cCwga2I7CisgICAgICBFX2hpZ2hfZXhwW2tzZ10gPSAwOworCisgICAgICAvKiByZXNpZHVhbCBwYXJ0ICovCisgICAgICBhY2N1ID0gKChMT05HKShTQ0hBUikqcFRhYjIrKykgPDwgKERGUkFDVF9CSVRTIC0gOCAtIFBWQ19FU0dfRVhQICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFB2Y0R5bmFtaWNEYXRhLT5wU2NhbGluZ0NvZWZbM10pOworCisgICAgICAvKiBsaW5lYXIgY29tYmluYXRpb24gb2YgbG93ZXIgZ3JvdXBlZCBlbmVyZ2llcyBwYXJ0ICovCisgICAgICBmb3IgKGtiID0gMDsga2IgPCBQVkNfTkJMT1c7IGtiKyspIHsKKyAgICAgICAgcHJlZENvZWZmID0gKEZJWFBfU0dMKSgKKyAgICAgICAgICAgIChTSE9SVCkoU0NIQVIpcFRhYjFba2IgKiBwUHZjRHluYW1pY0RhdGEtPm5iSGlnaCArIGtzZ10gPDwgOCk7CisgICAgICAgIHByZWRDb2VmZl9leHAgPSBwUHZjRHluYW1pY0RhdGEtPnBTY2FsaW5nQ29lZltrYl0gKworICAgICAgICAgICAgICAgICAgICAgICAgMTsgLyogKzEgdG8gY29tcGVuc2F0ZSBmb3IgRGl2MiAqLworICAgICAgICBhY2N1ICs9IGZNdWx0RGl2MihFW2tiXSwgcHJlZENvZWZmKSA8PCBwcmVkQ29lZmZfZXhwOworICAgICAgfQorICAgICAgLyogY29udmVydCBiYWNrIHRvIGxpbmVhciBkb21haW4gKi8KKyAgICAgIGFjY3UgPSBmTXVsdChhY2N1LCBGTDJGWENPTlNUX1NHTChMT0cxMEZBQ19JTlYpKTsKKyAgICAgIGFjY3UgPSBmMlBvdygKKyAgICAgICAgICBhY2N1LCBQVkNfRVNHX0VYUCAtIDEsCisgICAgICAgICAgJnByZWRDb2VmZl9leHApOyAvKiAtMSBjb21wZW5zYXRlcyBmb3IgZXhwb25lbnQgb2YgTE9HMTBGQUNfSU5WICovCisgICAgICBwcmVkaWN0ZWRFc2dTbG90W2tzZ10gPSBhY2N1OworICAgICAgRV9oaWdoX2V4cFtrc2ddID0gcHJlZENvZWZmX2V4cDsKKyAgICAgIGlmIChwcmVkQ29lZmZfZXhwID4gRV9oaWdoX2V4cF9tYXgpIHsKKyAgICAgICAgRV9oaWdoX2V4cF9tYXggPSBwcmVkQ29lZmZfZXhwOworICAgICAgfQorICAgIH0KKworICAgIC8qIHJlc2NhbGUgb3V0cHV0IHZlY3RvciBhY2NvcmRpbmcgdG8gbGFyZ2VzdCBleHBvbmVudCAqLworICAgIGZvciAoa3NnID0gMDsga3NnIDwgcFB2Y0R5bmFtaWNEYXRhLT5uYkhpZ2g7IGtzZysrKSB7CisgICAgICBpbnQgc2NhbGUgPSBFX2hpZ2hfZXhwW2tzZ10gLSBFX2hpZ2hfZXhwX21heDsKKyAgICAgIHByZWRpY3RlZEVzZ1Nsb3Rba3NnXSA9IHNjYWxlVmFsdWUocHJlZGljdGVkRXNnU2xvdFtrc2ddLCBzY2FsZSk7CisgICAgfQorICAgICpwcmVkaWN0ZWRFc2dfZXhwID0gRV9oaWdoX2V4cF9tYXg7CisgIH0KKworICBwUHZjU3RhdGljRGF0YS0+RXNnX3Nsb3RfaW5kZXggPQorICAgICAgKHBQdmNTdGF0aWNEYXRhLT5Fc2dfc2xvdF9pbmRleCArIDEpICYgKFBWQ19OU19NQVggLSAxKTsKKyAgcFB2Y0R5bmFtaWNEYXRhLT5wYXN0RXNnU2xvdHNBdmFpbCA9CisgICAgICBmTWluKHBQdmNEeW5hbWljRGF0YS0+cGFzdEVzZ1Nsb3RzQXZhaWwgKyAxLCBQVkNfTlNfTUFYIC0gMSk7CisgIHJldHVybjsKK30KKworLyogY2FsbCBpZiBwdmNNb2RlID0gMCwxLDIgKi8KK3ZvaWQgcHZjRW5kRnJhbWUoUFZDX1NUQVRJQ19EQVRBICpwUHZjU3RhdGljRGF0YSwKKyAgICAgICAgICAgICAgICAgUFZDX0RZTkFNSUNfREFUQSAqcFB2Y0R5bmFtaWNEYXRhKSB7CisgIHBQdmNTdGF0aWNEYXRhLT5wdmNfbW9kZV9sYXN0ID0gcFB2Y0R5bmFtaWNEYXRhLT5wdmNfbW9kZTsKKyAgcFB2Y1N0YXRpY0RhdGEtPmt4X2xhc3QgPSBwUHZjRHluYW1pY0RhdGEtPmt4OworCisgIGlmIChwUHZjRHluYW1pY0RhdGEtPnB2Y19tb2RlID09IDApIHJldHVybjsKKworICB7CisgICAgaW50IHQsIG1heCA9IC0xMDA7CisgICAgZm9yICh0ID0gcFB2Y0R5bmFtaWNEYXRhLT5wdmNCb3JkZXIwOyB0IDwgUFZDX05USU1FU0xPVDsgdCsrKSB7CisgICAgICBpZiAocFB2Y0R5bmFtaWNEYXRhLT5wcmVkRXNnX2V4cFt0XSA+IG1heCkgeworICAgICAgICBtYXggPSBwUHZjRHluYW1pY0RhdGEtPnByZWRFc2dfZXhwW3RdOworICAgICAgfQorICAgIH0KKyAgICBwUHZjRHluYW1pY0RhdGEtPnByZWRFc2dfZXhwTWF4ID0gbWF4OworICB9CisgIHJldHVybjsKK30KKwordm9pZCBleHBhbmRQcmVkRXNnKGNvbnN0IFBWQ19EWU5BTUlDX0RBVEEgKnBQdmNEeW5hbWljRGF0YSwgY29uc3QgaW50IHRpbWVTbG90LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsZW5ndGhPdXRwdXRWZWN0b3IsIEZJWFBfREJMICpwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgIFNDSEFSICpwT3V0cHV0X2V4cCkgeworICBpbnQgayA9IDAsIGtzZzsKKyAgY29uc3QgRklYUF9EQkwgKnByZWRFc2cgPSBwUHZjRHluYW1pY0RhdGEtPnByZWRFc2dbdGltZVNsb3RdOworCisgIGZvciAoa3NnID0gMDsga3NnIDwgcFB2Y0R5bmFtaWNEYXRhLT5uYkhpZ2g7IGtzZysrKSB7CisgICAgZm9yICg7IGsgPCBwUHZjRHluYW1pY0RhdGEtPnNnX29mZnNldF9oaWdoX2t4W2tzZyArIDFdOyBrKyspIHsKKyAgICAgIHBPdXRwdXRba10gPSBwcmVkRXNnW2tzZ107CisgICAgICBwT3V0cHV0X2V4cFtrXSA9IChTQ0hBUilwUHZjRHluYW1pY0RhdGEtPnByZWRFc2dfZXhwW3RpbWVTbG90XTsKKyAgICB9CisgIH0KKyAga3NnLS07CisgIGZvciAoOyBrIDwgbGVuZ3RoT3V0cHV0VmVjdG9yOyBrKyspIHsKKyAgICBwT3V0cHV0W2tdID0gcHJlZEVzZ1trc2ddOworICAgIHBPdXRwdXRfZXhwW2tdID0gKFNDSEFSKXBQdmNEeW5hbWljRGF0YS0+cHJlZEVzZ19leHBbdGltZVNsb3RdOworICB9CisKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9wdmNfZGVjLmggYi9saWJTQlJkZWMvc3JjL3B2Y19kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWE0NjdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0JSZGVjL3NyYy9wdmNfZGVjLmgKQEAgLTAsMCArMSwyMzggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOiBEZWNvZGUgUHJlZGljdGl2ZSBWZWN0b3IgQ29kaW5nIERhdGEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBQVkNfREVDX0gKKyNkZWZpbmUgUFZDX0RFQ19ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNkZWZpbmUgUFZDX0RJVk1PREVfQklUUyAzCisjZGVmaW5lIFBWQ19SRVVTRVBWQ0lEX0JJVFMgMQorI2RlZmluZSBQVkNfUFZDSURfQklUUyA3CisjZGVmaW5lIFBWQ19HUklESU5GT19CSVRTIDEKKworI2RlZmluZSBNQVhfUFZDX0VOVkVMT1BFUyAyCisjZGVmaW5lIFBWQ19OVElNRVNMT1QgMTYKKyNkZWZpbmUgUFZDX05CTE9XIDMgLyogbWF4LiBudW1iZXIgb2YgZ3JvdXBlZCBRTUYgc3ViYmFuZHMgYmVsb3cgU0JSIHJhbmdlICovCisKKyNkZWZpbmUgUFZDX05CSElHSF9NT0RFMSA4CisjZGVmaW5lIFBWQ19OQkhJR0hfTU9ERTIgNgorI2RlZmluZSBQVkNfTkJISUdIX01BWCAoUFZDX05CSElHSF9NT0RFMSkKKyNkZWZpbmUgUFZDX05TX01BWCAxNgorCisvKiogRGF0YSBmb3IgZWFjaCBQVkMgaW5zdGFuY2Ugd2hpY2ggbmVlZHMgdG8gYmUgcGVyc2lzdGVudCBhY2Nyb3NzIFNCUiBmcmFtZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBreF9sYXN0OyAgICAgICAgLyoqPCBYb3ZlciBmcmVxdWVuY3kgb2YgbGFzdCBmcmFtZSAqLworICBVQ0hBUiBwdmNfbW9kZV9sYXN0OyAgLyoqPCBQVkMgbW9kZSBvZiBsYXN0IGZyYW1lICovCisgIFVDSEFSIEVzZ19zbG90X2luZGV4OyAvKio8IFJpbmcgYnVmZmVyIGluZGV4IHRvIGN1cnJlbnQgRXNnIHRpbWUgc2xvdCAqLworICBVQ0hBUiBwdmNCb3JkZXIwOyAgICAgLyoqPCBTdGFydCBTQlIgdGltZSBzbG90IG9mIFBWQyBmcmFtZSAqLworICBGSVhQX0RCTCBFc2dbUFZDX05TX01BWF1bUFZDX05CTE9XXTsgLyoqPCBFc2coa3NnLHQpIG9mIGN1cnJlbnQgYW5kIDE1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyB0aW1lIHNsb3RzIChyaW5nIGJ1ZmZlcikgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2FyaXRobWljYWwgZG9tYWluICovCit9IFBWQ19TVEFUSUNfREFUQTsKKworLyoqIERhdGEgZm9yIGVhY2ggUFZDIGluc3RhbmNlIHdoaWNoIGlzIHZhbGlkIGR1cmluZyBvbmUgU0JSIGZyYW1lICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIHB2Y19tb2RlOyAgIC8qKjwgUFZDIG1vZGUgMSBvciAyLCAwIG1lYW5zIGxlZ2FjeSBTQlIgKi8KKyAgVUNIQVIgcHZjQm9yZGVyMDsgLyoqPCBTdGFydCBTQlIgdGltZSBzbG90IG9mIFBWQyBmcmFtZSAqLworICBVQ0hBUiBreDsgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBmaXJzdCBRTUYgc3ViYmFuZCBpbiB0aGUgU0JSIHJhbmdlICovCisgIFVDSEFSIFJBVEU7ICAgICAgIC8qKjwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kIHNhbXBsZXMgcGVyIHRpbWUgc2xvdCAoMiBvciA0KSAqLworICBVQ0hBUiBuczsgLyoqPCBOdW1iZXIgb2YgdGltZSBzbG90cyBmb3IgdGltZS1kb21haW4gc21vb3RoaW5nIG9mIEVzZyhrc2csdCkgKi8KKyAgY29uc3QgVUNIQVIKKyAgICAgICpwUHZjSUQ7IC8qKjwgUG9pbnRlciB0byBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IG1hdHJpeCBpbmRleCB0YWJsZSAqLworICBVQ0hBUiBwYXN0RXNnU2xvdHNBdmFpbDsgICAvKio8IE51bWJlciBvZiBwYXN0IEVzZyhrc2csdCkgd2hpY2ggYXJlIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc21vb3RoaW5nIGZpbHRlciAqLworICBjb25zdCBGSVhQX1NHTCAqcFNDY29lZmZzOyAvKio8IFBvaW50ZXIgdG8gc21vb3RoaW5nIHdpbmRvdyB0YWJsZSAqLworICBTQ0hBUgorICBzZ19vZmZzZXRfbG93W1BWQ19OQkxPVyArIDFdOyAvKio8IE9mZnNldCB0YWJsZSBmb3IgUFZDIGdyb3VwaW5nIG9mIFNCUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJiYW5kcyBiZWxvdyBTQlIgcmFuZ2UgKi8KKyAgU0NIQVIgc2dfb2Zmc2V0X2hpZ2hfa3hbUFZDX05CSElHSF9NQVggKyAxXTsgLyoqPCBPZmZzZXQgdGFibGUgZm9yIFBWQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZyBvZiBTQlIgc3ViYmFuZHMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSIHJhbmdlIChyZWxhdGl2IHRvIGt4KSAqLworICBVQ0hBUiBuYkhpZ2g7IC8qKjwgTnVtYmVyIG9mIGdyb3VwZWQgUU1GIHN1YmJhbmRzIGluIHRoZSBTQlIgcmFuZ2UgKi8KKyAgY29uc3QgU0NIQVIgKnBTY2FsaW5nQ29lZjsgLyoqPCBQb2ludGVyIHRvIHNjYWxpbmcgY29lZmYgdGFibGUgKi8KKyAgY29uc3QgVUNIQVIgKnBQVkNUYWIxOyAgICAgLyoqPCBQVkMgbW9kZSAxIHRhYmxlICovCisgIGNvbnN0IFVDSEFSICpwUFZDVGFiMjsgICAgIC8qKjwgUFZDIG1vZGUgMiB0YWJsZSAqLworICBjb25zdCBVQ0hBUiAqcFBWQ1RhYjFfZHA7ICAvKio8IE1hcHBpbmcgb2YgcHZjSUQgdG8gUFZDIG1vZGUgMSB0YWJsZSAqLworICBGSVhQX0RCTCBwcmVkRXNnW1BWQ19OVElNRVNMT1RdCisgICAgICAgICAgICAgICAgICBbUFZDX05CSElHSF9NQVhdOyAvKio8IFByZWRpY3RlZCBFbmVyZ3kgaW4gbGluZWFyIGRvbWFpbiAqLworICBpbnQgcHJlZEVzZ19leHBbUFZDX05USU1FU0xPVF07ICAgLyoqPCBFeHBvbmVudCBvZiBwcmVkaWN0ZWQgRW5lcmd5IGluIGxpbmVhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluICovCisgIGludCBwcmVkRXNnX2V4cE1heDsgICAgICAgICAgICAgICAvKio8IE1heGltdW0gb2YgcHJlZEVzZ19leHBbXSAqLworfSBQVkNfRFlOQU1JQ19EQVRBOworCisvKioKKyAqIFxicmllZiBJbml0aWFsaXplIFBWQyBkYXRhIHN0cnVjdHVyZXMgZm9yIGN1cnJlbnQgZnJhbWUgKGNhbGwgaWYgcHZjTW9kZSA9CisgKiAwLDEsMikKKyAqIFxwYXJhbVtpbl0gcFB2Y1N0YXRpY0RhdGEgUG9pbnRlciB0byBQVkMgcGVyc2lzdGVudCBkYXRhCisgKiBccGFyYW1bb3V0XSBwUHZjRHluYW1pY0RhdGEgUG9pbnRlciB0byBQVkMgZHluYW1pYyBkYXRhCisgKiBccGFyYW1baW5dIHB2Y01vZGUgUFZDIG1vZGUgMSBvciAyLCAwIG1lYW5zIGxlZ2FjeSBTQlIKKyAqIFxwYXJhbVtpbl0gbnMgTnVtYmVyIG9mIHRpbWUgc2xvdHMgZm9yIHRpbWUtZG9tYWluIHNtb290aGluZyBvZiBFc2coa3NnLHQpCisgKiBccGFyYW1baW5dIFJBVEUgTnVtYmVyIG9mIFFNRiBzdWJiYW5kIHNhbXBsZXMgcGVyIHRpbWUgc2xvdCAoMiBvciA0KQorICogXHBhcmFtW2luXSBreCBJbmRleCBvZiB0aGUgZmlyc3QgUU1GIHN1YmJhbmQgaW4gdGhlIFNCUiByYW5nZQorICogXHBhcmFtW2luXSBwdmNCb3JkZXIwIFN0YXJ0IFNCUiB0aW1lIHNsb3Qgb2YgUFZDIGZyYW1lCisgKiBccGFyYW1baW5dIHBQdmNJRCBQb2ludGVyIHRvIGFycmF5IG9mIFB2Y0lEcyByZWFkIGZyb20gYml0c3RyZWFtCisgKi8KK2ludCBwdmNJbml0RnJhbWUoUFZDX1NUQVRJQ19EQVRBICpwUHZjU3RhdGljRGF0YSwKKyAgICAgICAgICAgICAgICAgUFZDX0RZTkFNSUNfREFUQSAqcFB2Y0R5bmFtaWNEYXRhLCBjb25zdCBVQ0hBUiBwdmNNb2RlLAorICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBucywgY29uc3QgaW50IFJBVEUsIGNvbnN0IGludCBreCwKKyAgICAgICAgICAgICAgICAgY29uc3QgaW50IHB2Y0JvcmRlcjAsIGNvbnN0IFVDSEFSICpwUHZjSUQpOworCisvKioKKyAqIFxicmllZiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBwdmNEZWNvZGVUaW1lU2xvdCgpIHRvIGRlY29kZSBQVkMgZGF0YSBvZiBvbmUKKyAqIGZyYW1lIChjYWxsIGlmIHB2Y01vZGUgPSAxLDIpCisgKiBccGFyYW1baW4sb3V0XSBwUHZjU3RhdGljRGF0YSBQb2ludGVyIHRvIFBWQyBwZXJzaXN0ZW50IGRhdGEKKyAqIFxwYXJhbVtpbixvdXRdIHBQdmNEeW5hbWljRGF0YSBQb2ludGVyIHRvIFBWQyBkeW5hbWljIGRhdGEKKyAqIFxwYXJhbVtpbl0gcW1mQnVmZmVyUmVhbCBQb2ludGVyIHRvIGFycmF5IHdpdGggcmVhbCBRTUYgc3ViYmFuZHMKKyAqIFxwYXJhbVtpbl0gcW1mQnVmZmVySW1hZyBQb2ludGVyIHRvIGFycmF5IHdpdGggaW1hZyBRTUYgc3ViYmFuZHMKKyAqIFxwYXJhbVtpbl0gb3ZlcmxhcCBOdW1iZXIgb2YgUU1GIG92ZXJsYXAgc2xvdHMKKyAqIFxwYXJhbVtpbl0gcW1mRXhwb25lbnRPdmVybGFwIEV4cG9uZW50IG9mIHFtZkJ1ZmZlciAobG93IHBhcnQpIG9mIG92ZXJsYXAKKyAqIHNsb3RzCisgKiBccGFyYW1baW5dIHFtZkV4cG9uZW50Q3VycmVudCBFeHBvbmVudCBvZiBxbWZCdWZmZXIgKGxvdyBwYXJ0KQorICovCit2b2lkIHB2Y0RlY29kZUZyYW1lKFBWQ19TVEFUSUNfREFUQSAqcFB2Y1N0YXRpY0RhdGEsCisgICAgICAgICAgICAgICAgICAgIFBWQ19EWU5BTUlDX0RBVEEgKnBQdmNEeW5hbWljRGF0YSwgRklYUF9EQkwgKipxbWZCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlckltYWcsIGNvbnN0IGludCBvdmVybGFwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcW1mRXhwb25lbnRPdmVybGFwLCBjb25zdCBpbnQgcW1mRXhwb25lbnRDdXJyZW50KTsKKworLyoqCisgKiBcYnJpZWYgRGVjb2RlIFBWQyBkYXRhIGZvciBvbmUgU0JSIHRpbWUgc2xvdCAoY2FsbCBpZiBwdmNNb2RlID0gMSwyKQorICogXHBhcmFtW2luLG91dF0gcFB2Y1N0YXRpY0RhdGEgUG9pbnRlciB0byBQVkMgcGVyc2lzdGVudCBkYXRhCisgKiBccGFyYW1baW4sb3V0XSBwUHZjRHluYW1pY0RhdGEgUG9pbnRlciB0byBQVkMgZHluYW1pYyBkYXRhCisgKiBccGFyYW1baW5dIHFtZkJ1ZmZlclJlYWwgUG9pbnRlciB0byBhcnJheSB3aXRoIHJlYWwgUU1GIHN1YmJhbmRzCisgKiBccGFyYW1baW5dIHFtZkJ1ZmZlckltYWcgUG9pbnRlciB0byBhcnJheSB3aXRoIGltYWcgUU1GIHN1YmJhbmRzCisgKiBccGFyYW1baW5dIHFtZkV4cG9uZW50IEV4cG9uZW50IG9mIHFtZkJ1ZmZlciBvZiBjdXJyZW50IHRpbWUgc2xvdAorICogXHBhcmFtW2luXSBwdmNCb3JkZXIwIFN0YXJ0IFNCUiB0aW1lIHNsb3Qgb2YgUFZDIGZyYW1lCisgKiBccGFyYW1baW5dIHRpbWVTbG90TnVtYmVyIE51bWJlciBvZiBjdXJyZW50IFNCUiB0aW1lIHNsb3QgKDAuLjE1KQorICogXHBhcmFtW291dF0gcHJlZGljdGVkRXNnU2xvdCBQcmVkaWN0ZWQgRW5lcmd5IG9mIGN1cnJlbnQgdGltZSBzbG90CisgKiBccGFyYW1bb3V0XSBwcmVkaWN0ZWRFc2dfZXhwIEV4cG9uZW50IG9mIHByZWRpY3RlZCBFbmVyZ3kgb2YgY3VycmVudCB0aW1lCisgKiBzbG90CisgKi8KK3ZvaWQgcHZjRGVjb2RlVGltZVNsb3QoUFZDX1NUQVRJQ19EQVRBICpwUHZjU3RhdGljRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgUFZDX0RZTkFNSUNfREFUQSAqcFB2Y0R5bmFtaWNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZlNsb3RSZWFsLCBGSVhQX0RCTCAqKnFtZlNsb3RJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcW1mRXhwb25lbnQsIGNvbnN0IGludCBwdmNCb3JkZXIwLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGltZVNsb3ROdW1iZXIsIEZJWFBfREJMIHByZWRpY3RlZEVzZ1Nsb3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwcmVkaWN0ZWRFc2dfZXhwKTsKKworLyoqCisgKiBcYnJpZWYgRmluaXNoIHRoZSBjdXJyZW50IFBWQyBmcmFtZSAoY2FsbCBpZiBwdmNNb2RlID0gMCwxLDIpCisgKiBccGFyYW1baW4sb3V0XSBwUHZjU3RhdGljRGF0YSBQb2ludGVyIHRvIFBWQyBwZXJzaXN0ZW50IGRhdGEKKyAqIFxwYXJhbVtpbixvdXRdIHBQdmNEeW5hbWljRGF0YSBQb2ludGVyIHRvIFBWQyBkeW5hbWljIGRhdGEKKyAqLwordm9pZCBwdmNFbmRGcmFtZShQVkNfU1RBVElDX0RBVEEgKnBQdmNTdGF0aWNEYXRhLAorICAgICAgICAgICAgICAgICBQVkNfRFlOQU1JQ19EQVRBICpwUHZjRHluYW1pY0RhdGEpOworCisvKioKKyAqIFxicmllZiBFeHBhbmQgcHJlZGljdGVkIFBWQyBncm91cGVkIGVuZXJnaWVzIHRvIGZ1bGwgUU1GIHN1YmJhbmQgcmVzb2x1dGlvbgorICogXHBhcmFtW2luXSBwUHZjRHluYW1pY0RhdGEgUG9pbnRlciB0byBQVkMgZHluYW1pYyBkYXRhCisgKiBccGFyYW1baW5dIHRpbWVTbG90IE51bWJlciBvZiBjdXJyZW50IFNCUiB0aW1lIHNsb3QgKDAuLjE1KQorICogXHBhcmFtW2luXSBsZW5ndGhPdXRwdXRWZWN0b3IgTGVuZ2h0IG9mIG91dHB1dCB2ZWN0b3IKKyAqIFxwYXJhbVtvdXRdIHBPdXRwdXQgT3V0cHV0IGFycmF5IGZvciBwcmVkaWN0ZWQgZW5lcmdpZXMKKyAqIFxwYXJhbVtvdXRdIHBPdXRwdXRfZXhwIEV4cG9uZW50IG9mIHByZWRpY3RlZCBlbmVyZ2llcworICovCit2b2lkIGV4cGFuZFByZWRFc2coY29uc3QgUFZDX0RZTkFNSUNfREFUQSAqcFB2Y0R5bmFtaWNEYXRhLCBjb25zdCBpbnQgdGltZVNsb3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxlbmd0aE91dHB1dFZlY3RvciwgRklYUF9EQkwgKnBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgU0NIQVIgKnBPdXRwdXRfZXhwKTsKKworI2VuZGlmIC8qIFBWQ19ERUNfSCovCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9jcmMuY3BwIGIvbGliU0JSZGVjL3NyYy9zYnJfY3JjLmNwcAppbmRleCBhNDk1ZjEwLi5iYTBmZDA1IDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9jcmMuY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyX2NyYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTEgKzkwLDE5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgQ1JDIGNoZWNrIGNvdXRpbmVzICAKKyAgXGJyaWVmICBDUkMgY2hlY2sgY291dGluZXMKICovCiAKICNpbmNsdWRlICJzYnJfY3JjLmgiCkBAIC05MSwxNSArMTEwLDEzIEBACiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogI2luY2x1ZGUgInRyYW5zY2VuZGVudC5oIgogCi0jZGVmaW5lIE1BWENSQ1NURVAgICAgMTYKLSNkZWZpbmUgTUFYQ1JDU1RFUF9MRCAgNAorI2RlZmluZSBNQVhDUkNTVEVQIDE2CisjZGVmaW5lIE1BWENSQ1NURVBfTEQgNAogCiAvKiEKICAgXGJyaWVmICAgICBjcmMgY2FsY3VsYXRpb24KICovCi1zdGF0aWMgVUxPTkcKLWNhbGNDUkMgKEhBTkRMRV9DUkMgaENyY0J1ZiwgVUxPTkcgYlZhbHVlLCBpbnQgbkJpdHMpCi17CitzdGF0aWMgVUxPTkcgY2FsY0NSQyhIQU5ETEVfQ1JDIGhDcmNCdWYsIFVMT05HIGJWYWx1ZSwgaW50IG5CaXRzKSB7CiAgIGludCBpOwogICBVTE9ORyBiTWFzayA9ICgxVUwgPDwgKG5CaXRzIC0gMSkpOwogCkBAIC0xMDksNTIgKzEyNiw0NSBAQAogCiAgICAgZmxhZyBePSBmbGFnMTsKICAgICBoQ3JjQnVmLT5jcmNTdGF0ZSA8PD0gMTsKLSAgICBpZiAoZmxhZykKLSAgICAgIGhDcmNCdWYtPmNyY1N0YXRlIF49IGhDcmNCdWYtPmNyY1BvbHk7CisgICAgaWYgKGZsYWcpIGhDcmNCdWYtPmNyY1N0YXRlIF49IGhDcmNCdWYtPmNyY1BvbHk7CiAgIH0KIAogICByZXR1cm4gKGhDcmNCdWYtPmNyY1N0YXRlKTsKIH0KIAotCiAvKiEKICAgXGJyaWVmICAgICBjcmMKICovCi1zdGF0aWMgaW50Ci1nZXRDcmMgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgVUxPTkcgTnJCaXRzKQoteworc3RhdGljIGludCBnZXRDcmMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBVTE9ORyBOckJpdHMpIHsKICAgaW50IGk7CiAgIENSQ19CVUZGRVIgQ3JjQnVmOwogCiAgIENyY0J1Zi5jcmNTdGF0ZSA9IFNCUl9DUkNfU1RBUlQ7Ci0gIENyY0J1Zi5jcmNQb2x5ICA9IFNCUl9DUkNfUE9MWTsKLSAgQ3JjQnVmLmNyY01hc2sgID0gU0JSX0NSQ19NQVNLOworICBDcmNCdWYuY3JjUG9seSA9IFNCUl9DUkNfUE9MWTsKKyAgQ3JjQnVmLmNyY01hc2sgPSBTQlJfQ1JDX01BU0s7CiAKLSAgaW50IENyY1N0ZXAgPSBOckJpdHM+Pk1BWENSQ1NURVBfTEQ7CisgIGludCBDcmNTdGVwID0gTnJCaXRzID4+IE1BWENSQ1NURVBfTEQ7CiAKICAgaW50IENyY05yQml0c1Jlc3QgPSAoTnJCaXRzIC0gQ3JjU3RlcCAqIE1BWENSQ1NURVApOwogICBVTE9ORyBiVmFsdWU7CiAKICAgZm9yIChpID0gMDsgaSA8IENyY1N0ZXA7IGkrKykgewotICAgIGJWYWx1ZSA9IEZES3JlYWRCaXRzIChoQnMsIE1BWENSQ1NURVApOwotICAgIGNhbGNDUkMgKCZDcmNCdWYsIGJWYWx1ZSwgTUFYQ1JDU1RFUCk7CisgICAgYlZhbHVlID0gRkRLcmVhZEJpdHMoaEJzLCBNQVhDUkNTVEVQKTsKKyAgICBjYWxjQ1JDKCZDcmNCdWYsIGJWYWx1ZSwgTUFYQ1JDU1RFUCk7CiAgIH0KIAotICBiVmFsdWUgPSBGREtyZWFkQml0cyAoaEJzLCBDcmNOckJpdHNSZXN0KTsKLSAgY2FsY0NSQyAoJkNyY0J1ZiwgYlZhbHVlLCBDcmNOckJpdHNSZXN0KTsKKyAgYlZhbHVlID0gRkRLcmVhZEJpdHMoaEJzLCBDcmNOckJpdHNSZXN0KTsKKyAgY2FsY0NSQygmQ3JjQnVmLCBiVmFsdWUsIENyY05yQml0c1Jlc3QpOwogCiAgIHJldHVybiAoQ3JjQnVmLmNyY1N0YXRlICYgU0JSX0NSQ19SQU5HRSk7Ci0KIH0KIAotCiAvKiEKICAgXGJyaWVmICAgY3JjIGludGVyZmFjZQogICBccmV0dXJuICAxOiBDUkMgT0ssIDA6IENSQyBjaGVjayBmYWlsdXJlCiAqLwotaW50Ci1TYnJDcmNDaGVjayAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAvKiE8IGhhbmRsZSB0byBiaXQtYnVmZmVyICAqLwotICAgICAgICAgICAgIExPTkcgTnJCaXRzKSAgICAgICAgICAgICAgLyohPCBtYXguIENSQyBsZW5ndGggICAgICAgKi8KK2ludCBTYnJDcmNDaGVjayhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIC8qITwgaGFuZGxlIHRvIGJpdC1idWZmZXIgICovCisgICAgICAgICAgICAgICAgTE9ORyBOckJpdHMpICAgICAgICAgICAgICAvKiE8IG1heC4gQ1JDIGxlbmd0aCAgICAgICAqLwogewogICBpbnQgY3JjUmVzdWx0ID0gMTsKICAgVUxPTkcgTnJDcmNCaXRzOwpAQCAtMTYyLDE4ICsxNzIsMTcgQEAKICAgTE9ORyBOckJpdHNBdmFpbGFibGU7CiAgIFVMT05HIGNyY0NoZWNrU3VtOwogCi0gIGNyY0NoZWNrU3VtID0gRkRLcmVhZEJpdHMgKGhCcywgMTApOworICBjcmNDaGVja1N1bSA9IEZES3JlYWRCaXRzKGhCcywgMTApOwogCiAgIE5yQml0c0F2YWlsYWJsZSA9IEZES2dldFZhbGlkQml0cyhoQnMpOwotICBpZiAoTnJCaXRzQXZhaWxhYmxlIDw9IDApeworICBpZiAoTnJCaXRzQXZhaWxhYmxlIDw9IDApIHsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIE5yQ3JjQml0cyA9IGZpeE1pbiAoKElOVClOckJpdHMsIChJTlQpTnJCaXRzQXZhaWxhYmxlKTsKKyAgTnJDcmNCaXRzID0gZml4TWluKChJTlQpTnJCaXRzLCAoSU5UKU5yQml0c0F2YWlsYWJsZSk7CiAKLSAgY3JjQ2hlY2tSZXN1bHQgPSBnZXRDcmMgKGhCcywgTnJDcmNCaXRzKTsKLSAgRkRLcHVzaEJhY2soaEJzLCAoTnJCaXRzQXZhaWxhYmxlIC0gRkRLZ2V0VmFsaWRCaXRzKGhCcykpICk7Ci0KKyAgY3JjQ2hlY2tSZXN1bHQgPSBnZXRDcmMoaEJzLCBOckNyY0JpdHMpOworICBGREtwdXNoQmFjayhoQnMsIChOckJpdHNBdmFpbGFibGUgLSBGREtnZXRWYWxpZEJpdHMoaEJzKSkpOwogCiAgIGlmIChjcmNDaGVja1Jlc3VsdCAhPSBjcmNDaGVja1N1bSkgewogICAgIGNyY1Jlc3VsdCA9IDA7CmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9jcmMuaCBiL2xpYlNCUmRlYy9zcmMvc2JyX2NyYy5oCmluZGV4IDMwYjgzMjkuLjk2MzM3MTcgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX2NyYy5oCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyX2NyYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwyMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIENSQyBjaGVja2luZyByb3V0aW5lcyAgCisgIFxicmllZiAgQ1JDIGNoZWNraW5nIHJvdXRpbmVzCiAqLwotI2lmbmRlZiBfX1NCUl9DUkNfSAotI2RlZmluZSBfX1NCUl9DUkNfSAorI2lmbmRlZiBTQlJfQ1JDX0gKKyNkZWZpbmUgU0JSX0NSQ19ICiAKICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCiAKQEAgLTEwMCwyNCArMTE5LDIwIEBACiBjcmM4OiB4XjgreF4yK3greCsxCiAqLwogCi0vKiBkZWZhdWx0IFNCUiBDUkMgKi8gIC8qIEcoeCkgPSB4XjEwICsgeF45ICsgeF41ICsgeF40ICsgeCArIDEgKi8KLSNkZWZpbmUgU0JSX0NSQ19QT0xZICAgICAgICAgICAgICAgICAgMHgwMjMzCi0jZGVmaW5lIFNCUl9DUkNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBTQlJfQ1JDX1NUQVJUICAgICAgICAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgU0JSX0NSQ19SQU5HRSAgICAgICAgICAgICAgICAgMHgwM0ZGCisvKiBkZWZhdWx0IFNCUiBDUkMgKi8gLyogRyh4KSA9IHheMTAgKyB4XjkgKyB4XjUgKyB4XjQgKyB4ICsgMSAqLworI2RlZmluZSBTQlJfQ1JDX1BPTFkgMHgwMjMzCisjZGVmaW5lIFNCUl9DUkNfTUFTSyAweDAyMDAKKyNkZWZpbmUgU0JSX0NSQ19TVEFSVCAweDAwMDAKKyNkZWZpbmUgU0JSX0NSQ19SQU5HRSAweDAzRkYKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgVVNIT1JUIGNyY1N0YXRlOwogICBVU0hPUlQgY3JjTWFzazsKICAgVVNIT1JUIGNyY1BvbHk7Ci19Ci1DUkNfQlVGRkVSOworfSBDUkNfQlVGRkVSOwogCiB0eXBlZGVmIENSQ19CVUZGRVIgKkhBTkRMRV9DUkM7CiAKLWludCBTYnJDcmNDaGVjayAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgTE9ORyAgICAgICAgICAgICAgICAgTnJDcmNCaXRzKTsKLQoraW50IFNickNyY0NoZWNrKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIExPTkcgTnJDcmNCaXRzKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9kZWIuY3BwIGIvbGliU0JSZGVjL3NyYy9zYnJfZGViLmNwcAppbmRleCA5YmFmZjJlLi4xM2NkMjExIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9kZWIuY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyX2RlYi5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTIgKzkwLDE5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgUHJpbnQgc2VsZWN0ZWQgZGVidWcgbWVzc2FnZXMgICAKKyAgXGJyaWVmICBQcmludCBzZWxlY3RlZCBkZWJ1ZyBtZXNzYWdlcwogKi8KIAogI2luY2x1ZGUgInNicl9kZWIuaCIKLQpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJfZGViLmggYi9saWJTQlJkZWMvc3JjL3Nicl9kZWIuaAppbmRleCBjYjk1NGJhLi45N2Q1NzJhIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9kZWIuaAorKysgYi9saWJTQlJkZWMvc3JjL3Nicl9kZWIuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNSArOTAsMjMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBEZWJ1Z2dpbmcgYWlkcyAgIAorICBcYnJpZWYgIERlYnVnZ2luZyBhaWRzCiAqLwogCi0jaWZuZGVmIF9fU0JSX0RFQl9ICi0jZGVmaW5lIF9fU0JSX0RFQl9ICisjaWZuZGVmIFNCUl9ERUJfSAorI2RlZmluZSBTQlJfREVCX0gKIAogI2luY2x1ZGUgInNicmRlY29kZXIuaCIKIApkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJfZGVjLmNwcCBiL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5jcHAKaW5kZXggMDg2NDM0OC4uMmUxOGU2YyAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJfZGVjLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL3Nicl9kZWMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE5ICs5MCwyOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIFNiciBkZWNvZGVyICAKLSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGFjdHVhbCBkZWNvZGVyIGltcGxlbWVudGF0aW9uLiBUaGUgU0JSIGRhdGEgKHNpZGUgaW5mb3JtYXRpb24pIGlzIGFscmVhZHkKLSAgZGVjb2RlZC4gT25seSB0aHJlZSBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkOgorICBcYnJpZWYgIFNiciBkZWNvZGVyCisgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBhY3R1YWwgZGVjb2RlciBpbXBsZW1lbnRhdGlvbi4gVGhlIFNCUiBkYXRhIChzaWRlCisgIGluZm9ybWF0aW9uKSBpcyBhbHJlYWR5IGRlY29kZWQuIE9ubHkgdGhyZWUgZnVuY3Rpb25zIGFyZSBwcm92aWRlZDoKIAogICBcbGkgMS4pIGNyZWF0ZVNickRlYygpOiBPbmUgdGltZSBpbml0aWFsaXphdGlvbgotICBcbGkgMi4pIHJlc2V0U2JyRGVjKCk6IENhbGxlZCBieSBzYnJfQXBwbHkoKSB3aGVuIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gYW4gU0JSX0hFQURFUl9FTEVNRU5UIHJlcXVpcmVzIGEgcmVzZXQKLSAgYW5kIHJlY2FsY3VsYXRpb24gb2YgaW1wb3J0YW50IFNCUiBzdHJ1Y3R1cmVzLgotICBcbGkgMy4pIHNicl9kZWMoKTogVGhlIGFjdHVhbCBkZWNvZGVyLiBDYWxscyB0aGUgZGlmZmVyZW50IHRvb2xzIHN1Y2ggYXMgZmlsdGVyYmFua3MsIGxwcFRyYW5zcG9zZXIoKSwgYW5kIGNhbGN1bGF0ZVNickVudmVsb3BlKCkKLSAgW3RoZSBlbnZlbG9wZSBhZGp1c3Rlcl0uCisgIFxsaSAyLikgcmVzZXRTYnJEZWMoKTogQ2FsbGVkIGJ5IHNicl9BcHBseSgpIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbgorICBhbiBTQlJfSEVBREVSX0VMRU1FTlQgcmVxdWlyZXMgYSByZXNldCBhbmQgcmVjYWxjdWxhdGlvbiBvZiBpbXBvcnRhbnQgU0JSCisgIHN0cnVjdHVyZXMuIFxsaSAzLikgc2JyX2RlYygpOiBUaGUgYWN0dWFsIGRlY29kZXIuIENhbGxzIHRoZSBkaWZmZXJlbnQgdG9vbHMKKyAgc3VjaCBhcyBmaWx0ZXJiYW5rcywgbHBwVHJhbnNwb3NlcigpLCBhbmQgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSBbdGhlIGVudmVsb3BlCisgIGFkanVzdGVyXS4KIAogICBcc2Egc2JyX2RlYygpLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldwogKi8KQEAgLTEwMiwxNzggKzEyMiw5MCBAQAogI2luY2x1ZGUgImVudl9leHRyLmgiCiAjaW5jbHVkZSAiZW52X2NhbGMuaCIKICNpbmNsdWRlICJzY2FsZS5oIgorI2luY2x1ZGUgIkZES19tYXRyaXhDYWxsb2MuaCIKKyNpbmNsdWRlICJoYmUuaCIKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKICNpbmNsdWRlICJzYnJkZWNfZHJjLmgiCiAKK3N0YXRpYyB2b2lkIGNvcHlIYXJtb25pY1NwZWN0cnVtKGludCAqeE92ZXJRbWYsIEZJWFBfREJMICoqcW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mSW1hZywgaW50IG5vQ29scywgaW50IG92ZXJsYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRUVQX1NUQVRFU19TWU5DRURfTU9ERSBrZWVwU3RhdGVzU3luY2VkKSB7CisgIGludCBwYXRjaEJhbmRzOworICBpbnQgcGF0Y2gsIGJhbmQsIGNvbCwgdGFyZ2V0LCBzb3VyY2VCYW5kcywgaTsKKyAgaW50IG51bVBhdGNoZXMgPSAwOworICBpbnQgc2xvdE9mZnNldCA9IDA7CiAKKyAgRklYUF9EQkwgKipwcHFtZlJlYWwgPSBxbWZSZWFsICsgb3ZlcmxhcDsKKyAgRklYUF9EQkwgKipwcHFtZkltYWcgPSBxbWZJbWFnICsgb3ZlcmxhcDsKIAotc3RhdGljIHZvaWQgYXNzaWduTGNUaW1lU2xvdHMoIEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsICAgICAgICAgICAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gRGVjb2RlciBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICoqUW1mQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9Db2xzICkKLXsKLSAgaW50IHNsb3QsIGk7Ci0gIEZJWFBfREJMICAqcHRyOwotCi0gIC8qIE51bWJlciBvZiBRTUYgdGltZXNsb3RzIGluIHRoZSBvdmVybGFwIGJ1ZmZlcjogKi8KLSAgcHRyID0gaFNickRlYy0+cFNick92ZXJsYXBCdWZmZXI7Ci0gIGZvcihzbG90PTA7IHNsb3Q8aFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOyBzbG90KyspIHsKLSAgICBRbWZCdWZmZXJSZWFsW3Nsb3RdID0gcHRyOyBwdHIgKz0gKDY0KTsKKyAgaWYgKGtlZXBTdGF0ZXNTeW5jZWQgPT0gS0VFUF9TVEFURVNfU1lOQ0VEX05PUk1BTCkgeworICAgIHNsb3RPZmZzZXQgPSBub0NvbHMgLSBvdmVybGFwIC0gTFBDX09SREVSOwogICB9CiAKLSAgLyogQXNzaWduIHRpbWVzbG90cyB0byBXb3JrYnVmZmVyMSAqLwotICBwdHIgPSBoU2JyRGVjLT5Xb3JrQnVmZmVyMTsKLSAgZm9yKGk9MDsgaTxub0NvbHM7IGkrKykgewotICAgIFFtZkJ1ZmZlclJlYWxbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOwotICAgIHNsb3QrKzsKLSAgfQotfQotCi0KLXN0YXRpYyB2b2lkIGFzc2lnbkhxVGltZVNsb3RzKCBIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLCAgICAgICAgICAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKlFtZkJ1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICoqUW1mQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9Db2xzICkKLXsKLSAgRklYUF9EQkwgICpwdHI7Ci0gIGludCBzbG90OwotCi0gIC8qIE51bWJlciBvZiBRTUYgdGltZXNsb3RzIGluIG9uZSBoYWxmIG9mIGEgZnJhbWUgKHNpemUgb2YgV29ya2J1ZmZlcjEgb3IgMik6ICovCi0gIGludCBoYWxmbGVuID0gKG5vQ29scyA+PiAxKSArIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsKLSAgaW50IHRvdENvbHMgPSBub0NvbHMgKyBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7Ci0KLSAgLyogTnVtYmVyIG9mIFFNRiB0aW1lc2xvdHMgaW4gdGhlIG92ZXJsYXAgYnVmZmVyOiAqLwotICBwdHIgPSBoU2JyRGVjLT5wU2JyT3ZlcmxhcEJ1ZmZlcjsKLSAgZm9yKHNsb3Q9MDsgc2xvdDxoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7IHNsb3QrKykgewotICAgIFFtZkJ1ZmZlclJlYWxbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOwotICAgIFFtZkJ1ZmZlckltYWdbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOworICBpZiAoa2VlcFN0YXRlc1N5bmNlZCA9PSBLRUVQX1NUQVRFU19TWU5DRURfT1VURElGRikgeworICAgIHBwcW1mUmVhbCA9IHFtZlJlYWw7CisgICAgcHBxbWZJbWFnID0gcW1mSW1hZzsKICAgfQogCi0gIC8qIEFzc2lnbiBmaXJzdCBoYWxmIG9mIHRpbWVzbG90cyB0byBXb3JrYnVmZmVyMSAqLwotICBwdHIgPSBoU2JyRGVjLT5Xb3JrQnVmZmVyMTsKLSAgZm9yKDsgc2xvdDxoYWxmbGVuOyBzbG90KyspIHsKLSAgICBRbWZCdWZmZXJSZWFsW3Nsb3RdID0gcHRyOyBwdHIgKz0gKDY0KTsKLSAgICBRbWZCdWZmZXJJbWFnW3Nsb3RdID0gcHRyOyBwdHIgKz0gKDY0KTsKLSAgfQotCi0gIC8qIEFzc2lnbiBzZWNvbmQgaGFsZiBvZiB0aW1lc2xvdHMgdG8gV29ya2J1ZmZlcjIgKi8KLSAgcHRyID0gaFNickRlYy0+V29ya0J1ZmZlcjI7Ci0gIGZvcig7IHNsb3Q8dG90Q29sczsgc2xvdCsrKSB7Ci0gICAgUW1mQnVmZmVyUmVhbFtzbG90XSA9IHB0cjsgcHRyICs9ICg2NCk7Ci0gICAgUW1mQnVmZmVySW1hZ1tzbG90XSA9IHB0cjsgcHRyICs9ICg2NCk7Ci0gIH0KLX0KLQotCi1zdGF0aWMgdm9pZCBhc3NpZ25UaW1lU2xvdHMoIEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsICAgICAgICAgICAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gRGVjb2RlciBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VMUCApCi17Ci0gLyogYXNzaWduIHFtZiB0aW1lIHNsb3RzICovCi0gIGhTYnJEZWMtPnVzZUxQID0gdXNlTFA7Ci0gIGlmICh1c2VMUCkgewotICAgIGhTYnJEZWMtPlN5bnRoZXNpc1FNRi5mbGFncyB8PSBRTUZfRkxBR19MUDsKLSAgICBoU2JyRGVjLT5BbmFseXNpc2NRTUYuZmxhZ3MgfD0gUU1GX0ZMQUdfTFA7Ci0gIH0gZWxzZSB7Ci0gICAgaFNickRlYy0+U3ludGhlc2lzUU1GLmZsYWdzICY9IH5RTUZfRkxBR19MUDsKLSAgICBoU2JyRGVjLT5BbmFseXNpc2NRTUYuZmxhZ3MgJj0gflFNRl9GTEFHX0xQOwotICB9Ci0gIGlmICghdXNlTFApCi0gICAgYXNzaWduSHFUaW1lU2xvdHMoIGhTYnJEZWMsIGhTYnJEZWMtPlFtZkJ1ZmZlclJlYWwsIGhTYnJEZWMtPlFtZkJ1ZmZlckltYWcsIG5vQ29scyApOwotICBlbHNlCi0gIHsKLSAgICBhc3NpZ25MY1RpbWVTbG90cyggaFNickRlYywgaFNickRlYy0+UW1mQnVmZmVyUmVhbCwgbm9Db2xzICk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgY2hhbmdlUW1mVHlwZSggSEFORExFX1NCUl9ERUMgaFNickRlYywgICAgICAgICAgICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VMZFRpbWVBbGlnbiApCi17Ci0gIFVJTlQgc3luUW1mRmxhZ3MgPSBoU2JyRGVjLT5TeW50aGVzaXNRTUYuZmxhZ3M7Ci0gIFVJTlQgYW5hUW1mRmxhZ3MgPSBoU2JyRGVjLT5BbmFseXNpc2NRTUYuZmxhZ3M7Ci0gIGludCAgcmVzZXRTeW5RbWYgPSAwOwotICBpbnQgIHJlc2V0QW5hUW1mID0gMDsKLQotICAvKiBhc3NpZ24gcW1mIHR5cGUgKi8KLSAgaWYgKHVzZUxkVGltZUFsaWduKSB7Ci0gICAgaWYgKHN5blFtZkZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpIHsKLSAgICAgIC8qIGNoYW5nZSB0aGUgdHlwZSB0byBNUFNMRCAqLwotICAgICAgc3luUW1mRmxhZ3MgJj0gflFNRl9GTEFHX0NMREZCOwotICAgICAgc3luUW1mRmxhZ3MgfD0gIFFNRl9GTEFHX01QU0xERkI7Ci0gICAgICByZXNldFN5blFtZiA9IDE7Ci0gICAgfQotICAgIGlmIChhbmFRbWZGbGFncyAmIFFNRl9GTEFHX0NMREZCKSB7Ci0gICAgICAvKiBjaGFuZ2UgdGhlIHR5cGUgdG8gTVBTTEQgKi8KLSAgICAgIGFuYVFtZkZsYWdzICY9IH5RTUZfRkxBR19DTERGQjsKLSAgICAgIGFuYVFtZkZsYWdzIHw9ICBRTUZfRkxBR19NUFNMREZCOwotICAgICAgcmVzZXRBbmFRbWYgPSAxOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoc3luUW1mRmxhZ3MgJiBRTUZfRkxBR19NUFNMREZCKSB7Ci0gICAgICAvKiBjaGFuZ2UgdGhlIHR5cGUgdG8gQ0xERkIgKi8KLSAgICAgIHN5blFtZkZsYWdzICY9IH5RTUZfRkxBR19NUFNMREZCOwotICAgICAgc3luUW1mRmxhZ3MgfD0gIFFNRl9GTEFHX0NMREZCOwotICAgICAgcmVzZXRTeW5RbWYgPSAxOwotICAgIH0KLSAgICBpZiAoYW5hUW1mRmxhZ3MgJiBRTUZfRkxBR19NUFNMREZCKSB7Ci0gICAgICAvKiBjaGFuZ2UgdGhlIHR5cGUgdG8gQ0xERkIgKi8KLSAgICAgIGFuYVFtZkZsYWdzICY9IH5RTUZfRkxBR19NUFNMREZCOwotICAgICAgYW5hUW1mRmxhZ3MgfD0gIFFNRl9GTEFHX0NMREZCOwotICAgICAgcmVzZXRBbmFRbWYgPSAxOworICBmb3IgKGkgPSAxOyBpIDwgTUFYX05VTV9QQVRDSEVTOyBpKyspIHsKKyAgICBpZiAoeE92ZXJRbWZbaV0gIT0gMCkgeworICAgICAgbnVtUGF0Y2hlcysrOwogICAgIH0KICAgfQogCi0gIGlmIChyZXNldEFuYVFtZikgewotICAgIFFNRl9GSUxURVJfQkFOSyBwcnZBbmFRbWY7Ci0gICAgaW50ICBxbWZFcnI7CisgIGZvciAocGF0Y2ggPSAoTUFYX1NUUkVUQ0hfSEJFIC0gMSk7IHBhdGNoIDwgbnVtUGF0Y2hlczsgcGF0Y2grKykgeworICAgIHBhdGNoQmFuZHMgPSB4T3ZlclFtZltwYXRjaCArIDFdIC0geE92ZXJRbWZbcGF0Y2hdOworICAgIHRhcmdldCA9IHhPdmVyUW1mW3BhdGNoXTsKKyAgICBzb3VyY2VCYW5kcyA9IHhPdmVyUW1mW01BWF9TVFJFVENIX0hCRSAtIDFdIC0geE92ZXJRbWZbTUFYX1NUUkVUQ0hfSEJFIC0gMl07CiAKLSAgICAvKiBTdG9yZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBGREttZW1jcHkoJnBydkFuYVFtZiwgJmhTYnJEZWMtPkFuYWx5c2lzY1FNRiwgc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOwotCi0gICAgLyogUmVzZXQgYW5hbHlzaXMgUU1GICovCi0gICAgcW1mRXJyID0gcW1mSW5pdEFuYWx5c2lzRmlsdGVyQmFuayAoCi0gICAgICAgICAgICZoU2JyRGVjLT5BbmFseXNpc2NRTUYsCi0gICAgICAgICAgICBoU2JyRGVjLT5hbmFRbWZTdGF0ZXMsCi0gICAgICAgICAgICBoU2JyRGVjLT5BbmFseXNpc2NRTUYubm9fY29sLAotICAgICAgICAgICAgaFNickRlYy0+QW5hbHlzaXNjUU1GLmxzYiwKLSAgICAgICAgICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi51c2IsCi0gICAgICAgICAgICBoU2JyRGVjLT5BbmFseXNpc2NRTUYubm9fY2hhbm5lbHMsCi0gICAgICAgICAgICBhbmFRbWZGbGFncyB8IFFNRl9GTEFHX0tFRVBfU1RBVEVTCi0gICAgICAgICAgICApOwotCi0gICAgaWYgKHFtZkVyciAhPSAwKSB7Ci0gICAgICAvKiBSZXN0b3JlIG9sZCBjb25maWd1cmF0aW9uIG9mIGFuYWx5c2lzIFFNRiAqLwotICAgICAgRkRLbWVtY3B5KCZoU2JyRGVjLT5BbmFseXNpc2NRTUYsICZwcnZBbmFRbWYsIHNpemVvZihRTUZfRklMVEVSX0JBTkspKTsKLSAgICB9Ci0gIH0KLQotICBpZiAocmVzZXRTeW5RbWYpIHsKLSAgICBRTUZfRklMVEVSX0JBTksgcHJ2U3luUW1mOwotICAgIGludCAgcW1mRXJyOwotCi0gICAgLyogU3RvcmUgY3VycmVudCBjb25maWd1cmF0aW9uICovCi0gICAgRkRLbWVtY3B5KCZwcnZTeW5RbWYsICZoU2JyRGVjLT5TeW50aGVzaXNRTUYsIHNpemVvZihRTUZfRklMVEVSX0JBTkspKTsKLQotICAgIC8qIFJlc2V0IHN5bnRoZXNpcyBRTUYgKi8KLSAgICBxbWZFcnIgPSBxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuayAoCi0gICAgICAgICAgICZoU2JyRGVjLT5TeW50aGVzaXNRTUYsCi0gICAgICAgICAgICBoU2JyRGVjLT5wU3luUW1mU3RhdGVzLAotICAgICAgICAgICAgaFNickRlYy0+U3ludGhlc2lzUU1GLm5vX2NvbCwKLSAgICAgICAgICAgIGhTYnJEZWMtPlN5bnRoZXNpc1FNRi5sc2IsCi0gICAgICAgICAgICBoU2JyRGVjLT5TeW50aGVzaXNRTUYudXNiLAotICAgICAgICAgICAgaFNickRlYy0+U3ludGhlc2lzUU1GLm5vX2NoYW5uZWxzLAotICAgICAgICAgICAgc3luUW1mRmxhZ3MgfCBRTUZfRkxBR19LRUVQX1NUQVRFUwotICAgICAgICAgICAgKTsKLQotICAgIGlmIChxbWZFcnIgIT0gMCkgewotICAgICAgLyogUmVzdG9yZSBvbGQgY29uZmlndXJhdGlvbiBvZiBzeW50aGVzaXMgUU1GICovCi0gICAgICBGREttZW1jcHkoJmhTYnJEZWMtPlN5bnRoZXNpc1FNRiwgJnBydlN5blFtZiwgc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOworICAgIHdoaWxlIChwYXRjaEJhbmRzID4gMCkgeworICAgICAgaW50IG51bUJhbmRzID0gc291cmNlQmFuZHM7CisgICAgICBpbnQgc3RhcnRCYW5kID0geE92ZXJRbWZbTUFYX1NUUkVUQ0hfSEJFIC0gMV0gLSAxOworICAgICAgaWYgKHRhcmdldCArIG51bUJhbmRzID49IHhPdmVyUW1mW3BhdGNoICsgMV0pIHsKKyAgICAgICAgbnVtQmFuZHMgPSB4T3ZlclFtZltwYXRjaCArIDFdIC0gdGFyZ2V0OworICAgICAgfQorICAgICAgaWYgKCgoKHRhcmdldCArIG51bUJhbmRzIC0gMSkgJSAyKSArCisgICAgICAgICAgICgoeE92ZXJRbWZbTUFYX1NUUkVUQ0hfSEJFIC0gMV0gLSAxKSAlIDIpKSAlCisgICAgICAgICAgMikgeworICAgICAgICBpZiAobnVtQmFuZHMgPT0gc291cmNlQmFuZHMpIHsKKyAgICAgICAgICBudW1CYW5kcy0tOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0YXJ0QmFuZC0tOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoa2VlcFN0YXRlc1N5bmNlZCA9PSBLRUVQX1NUQVRFU19TWU5DRURfT1VURElGRikgeworICAgICAgICBmb3IgKGNvbCA9IHNsb3RPZmZzZXQ7IGNvbCA8IG92ZXJsYXAgKyBMUENfT1JERVI7IGNvbCsrKSB7CisgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgZm9yIChiYW5kID0gbnVtQmFuZHM7IGJhbmQgPiAwOyBiYW5kLS0pIHsKKyAgICAgICAgICAgIGlmICgodGFyZ2V0ICsgYmFuZCAtIDEgPCA2NCkgJiYKKyAgICAgICAgICAgICAgICAodGFyZ2V0ICsgYmFuZCAtIDEgPCB4T3ZlclFtZltwYXRjaCArIDFdKSkgeworICAgICAgICAgICAgICBwcHFtZlJlYWxbY29sXVt0YXJnZXQgKyBiYW5kIC0gMV0gPSBwcHFtZlJlYWxbY29sXVtzdGFydEJhbmQgLSBpXTsKKyAgICAgICAgICAgICAgcHBxbWZJbWFnW2NvbF1bdGFyZ2V0ICsgYmFuZCAtIDFdID0gcHBxbWZJbWFnW2NvbF1bc3RhcnRCYW5kIC0gaV07CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoY29sID0gc2xvdE9mZnNldDsgY29sIDwgbm9Db2xzOyBjb2wrKykgeworICAgICAgICAgIGkgPSAwOworICAgICAgICAgIGZvciAoYmFuZCA9IG51bUJhbmRzOyBiYW5kID4gMDsgYmFuZC0tKSB7CisgICAgICAgICAgICBpZiAoKHRhcmdldCArIGJhbmQgLSAxIDwgNjQpICYmCisgICAgICAgICAgICAgICAgKHRhcmdldCArIGJhbmQgLSAxIDwgeE92ZXJRbWZbcGF0Y2ggKyAxXSkpIHsKKyAgICAgICAgICAgICAgcHBxbWZSZWFsW2NvbF1bdGFyZ2V0ICsgYmFuZCAtIDFdID0gcHBxbWZSZWFsW2NvbF1bc3RhcnRCYW5kIC0gaV07CisgICAgICAgICAgICAgIHBwcW1mSW1hZ1tjb2xdW3RhcmdldCArIGJhbmQgLSAxXSA9IHBwcW1mSW1hZ1tjb2xdW3N0YXJ0QmFuZCAtIGldOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICB0YXJnZXQgKz0gbnVtQmFuZHM7CisgICAgICBwYXRjaEJhbmRzIC09IG51bUJhbmRzOwogICAgIH0KICAgfQogfQogCi0KIC8qIQogICBcYnJpZWYgICAgICBTQlIgZGVjb2RlciBjb3JlIGZ1bmN0aW9uIGZvciBvbmUgY2hhbm5lbAogCkBAIC0yODMsMjYgKzIxNSwyNiBAQAogICB0aGUgTFBQLVRyYW5zcG9zZXIsIHByb2Nlc3NpbmcgaXMgbWFpbmx5IGJhc2VkIG9uIGZvdXIgYnVmZmVyczoKICAgI3RpbWVJbiwgI3RpbWVPdXQsICNXb3JrQnVmZmVyMiBhbmQgI092ZXJsYXBCdWZmZXIuIFRoZSAjV29ya0J1ZmZlcjIKICAgaXMgcmV1c2VkIGZvciBhbGwgY2hhbm5lbHMgYW5kIG1pZ2h0IGJlIHVzZWQgYnkgdGhlIGNvcmUgZGVjb2RlciwgYQotICBzdGF0aWMgb3ZlcmxhcCBidWZmZXIgaXMgcmVxdWlyZWQgZm9yIGVhY2ggY2hhbm5lbC4gRHUgdG8gaW4tcGxhY2UKKyAgc3RhdGljIG92ZXJsYXAgYnVmZmVyIGlzIHJlcXVpcmVkIGZvciBlYWNoIGNoYW5uZWwuIER1ZSB0byBpbi1wbGFjZQogICBwcm9jZXNzaW5nLCAjdGltZUluIGFuZCAjdGltZU91dCBwb2ludCB0byBpZGVudGljYWwgbG9jYXRpb25zLgogCi0gIFRoZSBzcGVjdHJhbCBkYXRhIGlzIG9yZ2FuaXplZCBpbiBzby1jYWxsZWQgc2xvdHMsIGVhY2ggc2xvdAotICBjb250YWluaW5nIDY0IGJhbmRzIG9mIGNvbXBsZXggZGF0YS4gVGhlIG51bWJlciBvZiBzbG90cyBwZXIgZnJhbWUgaXMKLSAgZGVwZW5kZW5kIG9uIHRoZSBmcmFtZSBzaXplLiBGb3IgbXAzUFJPLCB0aGVyZSBhcmUgMTggc2xvdHMgcGVyIGZyYW1lCisgIFRoZSBzcGVjdHJhbCBkYXRhIGlzIG9yZ2FuaXplZCBpbiBzby1jYWxsZWQgc2xvdHMuIEVhY2ggc2xvdAorICBjb250YWlucyA2NCBiYW5kcyBvZiBjb21wbGV4IGRhdGEuIFRoZSBudW1iZXIgb2Ygc2xvdHMgcGVyIGZyYW1lCisgIGRlcGVuZHMgb24gdGhlIGZyYW1lIHNpemUuIEZvciBtcDNQUk8sIHRoZXJlIGFyZSAxOCBzbG90cyBwZXIgZnJhbWUKICAgYW5kIDYgc2xvdHMgcGVyICNPdmVybGFwQnVmZmVyLiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGhhdmUgdGhlIHNsb3RzCiAgIGluIGxvY2F0ZWQgY29uc2VjdXRpdmUgYWRkcmVzcyByYW5nZXMuCiAKICAgVG8gb3B0aW1pemUgbWVtb3J5IHVzYWdlIGFuZCB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIG1lbW9yeQotICBhY2Nlc3NlcywgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGlzIG9yZ2FuaXplZCBhcyBmb2xsb3dzIChTbG90IG51bWJlcnMKKyAgYWNjZXNzZXMsIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBpcyBvcmdhbml6ZWQgYXMgZm9sbG93cyAoc2xvdCBudW1iZXJzCiAgIGJhc2VkIG9uIG1wM1BSTyk6CiAKLSAgMS4pIElucHV0IHRpbWUgZG9tYWluIHNpZ25hbCBpcyBsb2NhdGVkIGluICN0aW1lSW4sIHRoZSBsYXN0IHNsb3RzCisgIDEuKSBJbnB1dCB0aW1lIGRvbWFpbiBzaWduYWwgaXMgbG9jYXRlZCBpbiAjdGltZUluLiBUaGUgbGFzdCBzbG90cwogICAoMC4uNSkgb2YgdGhlIHNwZWN0cmFsIGRhdGEgb2YgdGhlIHByZXZpb3VzIGZyYW1lIGFyZSBsb2NhdGVkIGluIHRoZQogICAjT3ZlcmxhcEJ1ZmZlci4gSW4gYWRkaXRpb24sICNmcmFtZURhdGEgb2YgdGhlIGN1cnJlbnQgZnJhbWUgcmVzaWRlcwogICBpbiB0aGUgdXBwZXIgcGFydCBvZiAjdGltZUluLgogCi0gIDIuKSBEdXJpbmcgdGhlIGNwbHhBbmFseXNpc1FtZkZpbHRlcmluZygpLCAzMiBzYW1wbGVzIGZyb20gI3RpbWVJbiBhcmUgdHJhbnNmb3JtZWQKLSAgaW50byBhIHNsb3Qgb2YgdXAgdG8gMzIgY29tcGxleCBzcGVjdHJhbCBsb3cgYmFuZCB2YWx1ZXMgYXQgYQorICAyLikgRHVyaW5nIHRoZSBjcGx4QW5hbHlzaXNRbWZGaWx0ZXJpbmcoKSwgMzIgc2FtcGxlcyBmcm9tICN0aW1lSW4gYXJlCisgIHRyYW5zZm9ybWVkIGludG8gYSBzbG90IG9mIHVwIHRvIDMyIGNvbXBsZXggc3BlY3RyYWwgbG93IGJhbmQgdmFsdWVzIGF0IGEKICAgdGltZS4gVGhlIGZpcnN0IHNwZWN0cmFsIHNsb3QgLS0gbnIuIDYgLS0gaXMgd3JpdHRlbiBhdCBzbG90IG51bWJlcgogICB6ZXJvIG9mICNXb3JrQnVmZmVyMi4gI1dvcmtCdWZmZXIyIHdpbGwgYmUgY29tcGxldGVseSBmaWxsZWQgd2l0aAogICBzcGVjdHJhbCBkYXRhLgpAQCAtMzI1LDczICsyNTcsNzcgQEAKIAogKi8KIAotdm9pZAotc2JyX2RlYyAoIEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsICAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gRGVjb2RlciBjaGFubmVsICovCi0gICAgICAgICAgSU5UX1BDTSAqdGltZUluLCAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gaW5wdXQgdGltZSBzaWduYWwgKi8KLSAgICAgICAgICBJTlRfUENNICp0aW1lT3V0LCAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgdGltZSBzaWduYWwgKi8KLSAgICAgICAgICBIQU5ETEVfU0JSX0RFQyBoU2JyRGVjUmlnaHQsICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCByaWdodCAqLwotICAgICAgICAgIElOVF9QQ00gKnRpbWVPdXRSaWdodCwgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCB0aW1lIHNpZ25hbCAqLwotICAgICAgICAgIGNvbnN0IGludCBzdHJpZGVJbiwgICAgICAgICAgICAgICAgLyohPCBUaW1lIGRhdGEgdHJhdmVyc2FsIHN0cmlkZUluICovCi0gICAgICAgICAgY29uc3QgaW50IHN0cmlkZU91dCwgICAgICAgICAgICAgICAvKiE8IFRpbWUgZGF0YSB0cmF2ZXJzYWwgc3RyaWRlT3V0ICovCi0gICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YSwgIC8qITwgQ29udHJvbCBkYXRhIG9mIGN1cnJlbnQgZnJhbWUgKi8KLSAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoUHJldkZyYW1lRGF0YSwgIC8qITwgU29tZSBjb250cm9sIGRhdGEgb2YgbGFzdCBmcmFtZSAqLwotICAgICAgICAgIGNvbnN0IGludCBhcHBseVByb2Nlc3NpbmcsICAgICAgICAgLyohPCBGbGFnIGZvciBTQlIgb3BlcmF0aW9uICovCi0gICAgICAgICAgSEFORExFX1BTX0RFQyBoX3BzX2QsCi0gICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgICBjb25zdCBpbnQgY29kZWNGcmFtZVNpemUKLSAgICAgICAgICkKLXsKK3ZvaWQgc2JyX2RlYygKKyAgICBIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLCAgICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgKi8KKyAgICBJTlRfUENNICp0aW1lSW4sICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gaW5wdXQgdGltZSBzaWduYWwgKi8KKyAgICBJTlRfUENNICp0aW1lT3V0LCAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gb3V0cHV0IHRpbWUgc2lnbmFsICovCisgICAgSEFORExFX1NCUl9ERUMgaFNickRlY1JpZ2h0LCAgICAgICAgLyohPCBoYW5kbGUgdG8gRGVjb2RlciBjaGFubmVsIHJpZ2h0ICovCisgICAgSU5UX1BDTSAqdGltZU91dFJpZ2h0LCAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCB0aW1lIHNpZ25hbCAqLworICAgIGNvbnN0IGludCBzdHJpZGVPdXQsICAgICAgICAgICAgICAgIC8qITwgVGltZSBkYXRhIHRyYXZlcnNhbCBzdHJpZGVPdXQgKi8KKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YSwgICAvKiE8IENvbnRyb2wgZGF0YSBvZiBjdXJyZW50IGZyYW1lICovCisgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEKKyAgICAgICAgaFByZXZGcmFtZURhdGEsICAgICAgICAvKiE8IFNvbWUgY29udHJvbCBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KKyAgICBjb25zdCBpbnQgYXBwbHlQcm9jZXNzaW5nLCAvKiE8IEZsYWcgZm9yIFNCUiBvcGVyYXRpb24gKi8KKyAgICBIQU5ETEVfUFNfREVDIGhfcHNfZCwgY29uc3QgVUlOVCBmbGFncywgY29uc3QgaW50IGNvZGVjRnJhbWVTaXplKSB7CiAgIGludCBpLCBzbG90LCByZXNlcnZlOwogICBpbnQgc2F2ZUxiU2NhbGU7Ci0gIGludCBvdl9sZW47CiAgIGludCBsYXN0U2xvdE9mZnM7CiAgIEZJWFBfREJMIG1heFZhbDsKIAotICAvKiAxKzEvMyBmcmFtZXMgb2Ygc3BlY3RyYWwgZGF0YTogKi8KLSAgRklYUF9EQkwgKipRbWZCdWZmZXJSZWFsID0gaFNickRlYy0+UW1mQnVmZmVyUmVhbDsKLSAgRklYUF9EQkwgKipRbWZCdWZmZXJJbWFnID0gaFNickRlYy0+UW1mQnVmZmVySW1hZzsKKyAgLyogdGVtcG9yYXJ5IHBvaW50ZXIgLyB2YXJpYWJsZSBmb3IgUU1GOworICAgICByZXF1aXJlZCBhcyB3ZSB3YW50IHRvIHVzZSB0ZW1wb3JhcnkgYnVmZmVyCisgICAgIGNyZWF0aW5nIG9uZSBmcmFtZSBkZWxheSBmb3IgSEJFIGluIExQIG1vZGUgKi8KKyAgSU5UX1BDTSAqcFRpbWVJblFtZiA9IHRpbWVJbjsKIAotIC8qIE51bWJlciBvZiBRTUYgdGltZXNsb3RzIGluIHRoZSBvdmVybGFwIGJ1ZmZlcjogKi8KLSBvdl9sZW4gPSBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7CisgIC8qIE51bWJlciBvZiBRTUYgdGltZXNsb3RzIGluIHRoZSBvdmVybGFwIGJ1ZmZlcjogKi8KKyAgaW50IG92X2xlbiA9IGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsKIAotIC8qIE51bWJlciBvZiBRTUYgc2xvdHMgcGVyIGZyYW1lICovCisgIC8qIE51bWJlciBvZiBRTUYgc2xvdHMgcGVyIGZyYW1lICovCiAgIGludCBub0NvbHMgPSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzICogaEhlYWRlckRhdGEtPnRpbWVTdGVwOwogCi0gLyogYXNzaWduIHFtZiB0aW1lIHNsb3RzICovCi0gIGlmICggKChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIgKSA/IDEgOiAwKSAhPSAoKGhTYnJEZWMtPlN5bnRoZXNpc1FNRi5mbGFncyAmIFFNRl9GTEFHX0xQKSA/IDEgOiAwKSApIHsKLSAgICBhc3NpZ25UaW1lU2xvdHMoIGhTYnJEZWMsIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXAsIGZsYWdzICYgU0JSREVDX0xPV19QT1dFUik7CisgIC8qIGNyZWF0ZSBwb2ludGVyIGFycmF5IGZvciBkYXRhIHRvIHVzZSBmb3IgSEJFIGFuZCBsZWdhY3kgc2JyICovCisgIEZJWFBfREJMICpwTG93QmFuZFJlYWxbKDMgKiA0KSArIDIgKiAoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpXTsKKyAgRklYUF9EQkwgKnBMb3dCYW5kSW1hZ1soMyAqIDQpICsgMiAqICgoMTAyNCkgLyAoMzIpICogKDQpIC8gMildOworCisgIC8qIHNldCBwUmVhbCB0byB3aGVyZSBRTUYgYW5hbHlzaXMgd3JpdGVzIGluIGNhc2Ugb2YgbGVnYWN5IFNCUiAqLworICBGSVhQX0RCTCAqKnBSZWFsID0gcExvd0JhbmRSZWFsICsgb3ZfbGVuOworICBGSVhQX0RCTCAqKnBJbWFnID0gcExvd0JhbmRJbWFnICsgb3ZfbGVuOworCisgIC8qIG1hcCBRTUYgYnVmZmVyIHRvIHBvaW50ZXIgYXJyYXkgKE92ZXJsYXAgKyBGcmFtZSkqLworICBmb3IgKGkgPSAwOyBpIDwgbm9Db2xzICsgb3ZfbGVuOyBpKyspIHsKKyAgICBwTG93QmFuZFJlYWxbaV0gPSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5oUW1mU2xvdHNSZWFsW2ldOworICAgIHBMb3dCYW5kSW1hZ1tpXSA9IGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmhRbWZTbG90c0ltYWdbaV07CiAgIH0KIAotICBpZiAoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpIHsKLSAgICAvKiBDaG9vc2UgdGhlIHJpZ2h0IGxvdyBkZWxheSBmaWx0ZXIgYmFuayAqLwotICAgIGNoYW5nZVFtZlR5cGUoIGhTYnJEZWMsIChmbGFncyAmIFNCUkRFQ19MRF9NUFNfUU1GKSA/IDEgOiAwICk7CisgIGlmICgoZmxhZ3MgJiBTQlJERUNfVVNBQ19IQVJNT05JQ1NCUikpIHsKKyAgICAvKiBpbiBjYXNlIG9mIGhhcm1vbmljIFNCUiBhbmQgbm8gSEJFX0xQIG1hcCBhZGRpdGlvbmFsIGJ1ZmZlciBmb3IKKyAgICAgICBvbmUgbW9yZSBmcmFtZSB0byBwb2ludGVyIGFycnkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbm9Db2xzOyBpKyspIHsKKyAgICAgIHBMb3dCYW5kUmVhbFtpICsgbm9Db2xzICsgb3ZfbGVuXSA9IGhTYnJEZWMtPmhRbWZIQkVTbG90c1JlYWxbaV07CisgICAgICBwTG93QmFuZEltYWdbaSArIG5vQ29scyArIG92X2xlbl0gPSBoU2JyRGVjLT5oUW1mSEJFU2xvdHNJbWFnW2ldOworICAgIH0KIAotICAgIC8qIElmIHRoZSBMRC1NUFMgUU1GIGlzIG5vdCBhdmFpbGFibGUgZGVsYXkgdGhlIHNpZ25hbCBieSAoOTYtNDgqbGRTYnJTYW1wbGluZ1JhdGUpCi0gICAgICogc2FtcGxlcyBhY2NvcmRpbmcgdG8gSVNPL0lFQyAxNDQ5Ni0zOjIwMDkvRkRBTSAyOjIwMTAoRSkgY2hhcHRlciA0LjUuMi4xMy4gKi8KLSAgICBpZiAoIChmbGFncyAmIFNCUkRFQ19MRF9NUFNfUU1GKQotICAgICAgJiYgKGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5mbGFncyAmIFFNRl9GTEFHX0NMREZCKSApCi0gICAgewotICAgICAgSU5UX1BDTSAqcERseUJ1ZiA9IGhTYnJEZWMtPmNvcmVEZWxheUJ1ZjsgIC8qIERMWUJVRiAqLwotICAgICAgaW50IHNtcGwsIGRlbGF5ID0gOTYgPj4gKCEoZmxhZ3MgJiBTQlJERUNfRE9XTlNBTVBMRSkgPyAxIDogMCk7Ci0gICAgICAvKiBDcmVhdGUgVE1QQlVGICovCi0gICAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHBjbVRlbXAsIElOVF9QQ00sICg5NikpOwotICAgICAgLyogQ29weSBkZWxheSBzYW1wbGVzIGZyb20gSU5CVUYgdG8gVE1QQlVGICovCi0gICAgICBmb3IgKHNtcGwgPSAwOyBzbXBsIDwgZGVsYXk7IHNtcGwgKz0gMSkgewotICAgICAgICBwY21UZW1wW3NtcGxdID0gdGltZUluWyhjb2RlY0ZyYW1lU2l6ZS1kZWxheStzbXBsKSpzdHJpZGVJbl07CisgICAgLyogc2hpZnQgc2NhbGUgdmFsdWVzIGFjY29yZGluZyB0byBidWZmZXIgKi8KKyAgICBoU2JyRGVjLT5zY2FsZV9vdiA9IGhTYnJEZWMtPnNjYWxlX2xiOworICAgIGhTYnJEZWMtPnNjYWxlX2xiID0gaFNickRlYy0+c2NhbGVfaGJlOworCisgICAgLyogc2V0IHBSZWFsIHRvIHdoZXJlIFFNRiBhbmFseXNpcyB3cml0ZXMgaW4gY2FzZSBvZiBIQkUgKi8KKyAgICBwUmVhbCArPSBub0NvbHM7CisgICAgcEltYWcgKz0gbm9Db2xzOworICAgIGlmIChmbGFncyAmIFNCUkRFQ19TS0lQX1FNRl9BTkEpIHsKKyAgICAgIC8qIHN0ZXJlb0NmZ0luZGV4MyB3aXRoIEhCRSAqLworICAgICAgRkRLX1FtZkRvbWFpbl9RbWZEYXRhMkhCRShoU2JyRGVjLT5xbWZEb21haW5JbkNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5oUW1mSEJFU2xvdHNSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5oUW1mSEJFU2xvdHNJbWFnKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogV2UgaGF2ZSB0byBtb3ZlIG9sZCBoYmUgZnJhbWUgZGF0YSB0byBsYiBhcmVhIG9mIGJ1ZmZlciAqLworICAgICAgZm9yIChpID0gMDsgaSA8IG5vQ29sczsgaSsrKSB7CisgICAgICAgIEZES21lbWNweShwTG93QmFuZFJlYWxbb3ZfbGVuICsgaV0sIGhTYnJEZWMtPmhRbWZIQkVTbG90c1JlYWxbaV0sCisgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+bnVtYmVyT2ZBbmFseXNpc0JhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNweShwTG93QmFuZEltYWdbb3ZfbGVuICsgaV0sIGhTYnJEZWMtPmhRbWZIQkVTbG90c0ltYWdbaV0sCisgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+bnVtYmVyT2ZBbmFseXNpc0JhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgICB9Ci0gICAgICAvKiBNb3ZlIGlucHV0IHNpZ25hbCByZW1haW5kZXIgdG8gdGhlIHZlcnkgZW5kIG9mIElOQlVGICovCi0gICAgICBmb3IgKHNtcGwgPSAoY29kZWNGcmFtZVNpemUtZGVsYXktMSkqc3RyaWRlSW47IHNtcGwgPj0gMDsgc21wbCAtPSBzdHJpZGVJbikgewotICAgICAgICB0aW1lSW5bc21wbCtkZWxheV0gPSB0aW1lSW5bc21wbF07Ci0gICAgICB9Ci0gICAgICAvKiBDb3B5IGRlbGF5ZWQgc2FtcGxlcyBmcm9tIGxhc3QgZnJhbWUgZnJvbSBETFlCVUYgdG8gdGhlIHZlcnkgYmVnaW5uaW5nIG9mIElOQlVGICovCi0gICAgICBmb3IgKHNtcGwgPSAwOyBzbXBsIDwgZGVsYXk7IHNtcGwgKz0gMSkgewotICAgICAgICB0aW1lSW5bc21wbCpzdHJpZGVJbl0gPSBwRGx5QnVmW3NtcGxdOwotICAgICAgfQotICAgICAgLyogQ29weSBUTVBCVUYgdG8gRExZQlVGICovCi0gICAgICBGREttZW1jcHkocERseUJ1ZiwgcGNtVGVtcCwgZGVsYXkqc2l6ZW9mKElOVF9QQ00pKTsKLSAgICAgIC8qIERlc3RvcnkgVE1QQlVGICovCi0gICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChwY21UZW1wLCBJTlRfUENNLCAoOTYpKTsKICAgICB9CiAgIH0KIApAQCAtMzk5LDIzNCArMzM1LDQzNyBAQAogICAgIGxvdyBiYW5kIGNvZGVjIHNpZ25hbCBzdWJiYW5kIGZpbHRlcmluZwogICAgKi8KIAotICB7Ci0gICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChxbWZUZW1wLCBGSVhQX0RCTCwgMiooNjQpKTsKKyAgaWYgKGZsYWdzICYgU0JSREVDX1NLSVBfUU1GX0FOQSkgeworICAgIGlmICghKGZsYWdzICYgU0JSREVDX1VTQUNfSEFSTU9OSUNTQlIpKSAvKiBzdGVyZW9DZmdJbmRleDMgdy9vIEhCRSAqLworICAgICAgRkRLX1FtZkRvbWFpbl9Xb3JrQnVmZmVyMlByb2NDaGFubmVsKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gpOworICB9IGVsc2UgeworICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocW1mVGVtcCwgRklYUF9EQkwsIDIgKiAoNjQpKTsKKyAgICBxbWZBbmFseXNpc0ZpbHRlcmluZygmaFNickRlYy0+cW1mRG9tYWluSW5DaC0+ZmIsIHBSZWFsLCBwSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZywgcFRpbWVJblFtZiwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBxbWZUZW1wKTsKIAotICAgIHFtZkFuYWx5c2lzRmlsdGVyaW5nKCAmaFNickRlYy0+QW5hbHlzaXNjUU1GLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVyUmVhbCArIG92X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlckltYWcgKyBvdl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRGVjLT5zYnJTY2FsZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mVGVtcAotICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLSAgICBDX0FBTExPQ19TQ1JBVENIX0VORChxbWZUZW1wLCBGSVhQX0RCTCwgMiooNjQpKTsKKyAgICBDX0FBTExPQ19TQ1JBVENIX0VORChxbWZUZW1wLCBGSVhQX0RCTCwgMiAqICg2NCkpOwogICB9CiAKICAgLyoKICAgICBDbGVhciB1cHBlciBoYWxmIG9mIHNwZWN0cnVtCiAgICovCi0gIHsKKyAgaWYgKCEoKGZsYWdzICYgU0JSREVDX1VTQUNfSEFSTU9OSUNTQlIpICYmCisgICAgICAgIChoRnJhbWVEYXRhLT5zYnJQYXRjaGluZ01vZGUgPT0gMCkpKSB7CiAgICAgaW50IG5BbmFseXNpc0JhbmRzID0gaEhlYWRlckRhdGEtPm51bWJlck9mQW5hbHlzaXNCYW5kczsKIAotICAgIGlmICghIChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpKSB7Ci0gICAgICBmb3IgKHNsb3QgPSBvdl9sZW47IHNsb3QgPCBub0NvbHMrb3ZfbGVuOyBzbG90KyspIHsKLSAgICAgICAgRkRLbWVtY2xlYXIoJlFtZkJ1ZmZlclJlYWxbc2xvdF1bbkFuYWx5c2lzQmFuZHNdLCgoNjQpLW5BbmFseXNpc0JhbmRzKSpzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgICAgRkRLbWVtY2xlYXIoJlFtZkJ1ZmZlckltYWdbc2xvdF1bbkFuYWx5c2lzQmFuZHNdLCgoNjQpLW5BbmFseXNpc0JhbmRzKSpzaXplb2YoRklYUF9EQkwpKTsKKyAgICBpZiAoIShmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpKSB7CisgICAgICBmb3IgKHNsb3QgPSBvdl9sZW47IHNsb3QgPCBub0NvbHMgKyBvdl9sZW47IHNsb3QrKykgeworICAgICAgICBGREttZW1jbGVhcigmcExvd0JhbmRSZWFsW3Nsb3RdW25BbmFseXNpc0JhbmRzXSwKKyAgICAgICAgICAgICAgICAgICAgKCg2NCkgLSBuQW5hbHlzaXNCYW5kcykgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY2xlYXIoJnBMb3dCYW5kSW1hZ1tzbG90XVtuQW5hbHlzaXNCYW5kc10sCisgICAgICAgICAgICAgICAgICAgICgoNjQpIC0gbkFuYWx5c2lzQmFuZHMpICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgZm9yIChzbG90ID0gb3ZfbGVuOyBzbG90IDwgbm9Db2xzK292X2xlbjsgc2xvdCsrKSB7Ci0gICAgICBGREttZW1jbGVhcigmUW1mQnVmZmVyUmVhbFtzbG90XVtuQW5hbHlzaXNCYW5kc10sKCg2NCktbkFuYWx5c2lzQmFuZHMpKnNpemVvZihGSVhQX0RCTCkpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHNsb3QgPSBvdl9sZW47IHNsb3QgPCBub0NvbHMgKyBvdl9sZW47IHNsb3QrKykgeworICAgICAgICBGREttZW1jbGVhcigmcExvd0JhbmRSZWFsW3Nsb3RdW25BbmFseXNpc0JhbmRzXSwKKyAgICAgICAgICAgICAgICAgICAgKCg2NCkgLSBuQW5hbHlzaXNCYW5kcykgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIAotCi0KICAgLyoKICAgICBTaGlmdCBzcGVjdHJhbCBkYXRhIGxlZnQgdG8gZ2FpbiBhY2N1cmFjeSBpbiB0cmFuc3Bvc2VyIGFuZCBhZGp1c3RvcgogICAqLwotICBtYXhWYWwgPSBtYXhTdWJiYW5kU2FtcGxlKCBRbWZCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpID8gTlVMTCA6IFFtZkJ1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5sc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Db2xzK292X2xlbiApOworICAvKiBSYW5nZSB3YXMgaW5jcmVhc2VkIGZyb20gbHNiIHRvIG5vX2NoYW5uZWxzIGJlY2F1c2UgaW4gc29tZSBjYXNlcyAoZS5nLgorICAgICBVU0FDIGNvbmYgZVNicl80X1B2Yy5tcDQgYW5kIHNvbWUgSEJFIGNhc2VzKSBpdCBjb3VsZCBiZSBvYnNlcnZlZCB0aGF0IHRoZQorICAgICBzaWduYWwgYmV0d2VlbiBsc2IgYW5kIG5vX2NoYW5uZWxzIGlzIHVzZWQgZm9yIHRoZSBwYXRjaGluZyBwcm9jZXNzLgorICAqLworICBtYXhWYWwgPSBtYXhTdWJiYW5kU2FtcGxlKHBSZWFsLCAoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSA/IE5VTEwgOiBwSW1hZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5mYi5ub19jaGFubmVscywgMCwgbm9Db2xzKTsKIAotICByZXNlcnZlID0gZml4TWF4KDAsQ250TGVhZGluZ1plcm9zKG1heFZhbCktMSkgOwotICByZXNlcnZlID0gZml4TWluKHJlc2VydmUsREZSQUNUX0JJVFMtMS1oU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5sYl9zY2FsZSk7CisgIHJlc2VydmUgPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxKTsKKyAgcmVzZXJ2ZSA9IGZpeE1pbihyZXNlcnZlLAorICAgICAgICAgICAgICAgICAgIERGUkFDVF9CSVRTIC0gMSAtIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcubGJfc2NhbGUpOwogCiAgIC8qIElmIGFsbCBkYXRhIGlzIHplcm8sIGxiX3NjYWxlIGNvdWxkIGJlY29tZSB0b28gbGFyZ2UgKi8KLSAgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKCBRbWZCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpID8gTlVMTCA6IFFtZkJ1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5BbmFseXNpc2NRTUYubHNiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG92X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBub0NvbHMrb3ZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmUpOworICByZXNjYWxlU3ViYmFuZFNhbXBsZXMocFJlYWwsIChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpID8gTlVMTCA6IHBJbWFnLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+cW1mRG9tYWluSW5DaC0+ZmIubm9fY2hhbm5lbHMsIDAsIG5vQ29scywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmUpOwogCi0gIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLmxiX3NjYWxlICs9IHJlc2VydmU7CisgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcubGJfc2NhbGUgKz0gcmVzZXJ2ZTsKIAorICBpZiAoKGZsYWdzICYgU0JSREVDX1VTQUNfSEFSTU9OSUNTQlIpKSB7CisgICAgLyogYWN0dWFsbHkgdGhpcyBpcyBvdXIgaGJlX3NjYWxlICovCisgICAgaFNickRlYy0+c2NhbGVfaGJlID0gaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5sYl9zY2FsZTsKKyAgICAvKiB0aGUgcmVhbCBsYl9zY2FsZSBpcyBzdG9yZWQgaW4gc2NhbGVfbGIgZnJvbSBzYnIgKi8KKyAgICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmxiX3NjYWxlID0gaFNickRlYy0+c2NhbGVfbGI7CisgIH0KICAgLyoKICAgICBzYXZlIGxvdyBiYW5kIHNjYWxlLCB3YXZlY29kaW5nIG9yIHBhcmFtZXRyaWMgc3RlcmVvIG1heSBtb2RpZnkgaXQKICAgKi8KLSAgc2F2ZUxiU2NhbGUgPSBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5sYl9zY2FsZTsKKyAgc2F2ZUxiU2NhbGUgPSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmxiX3NjYWxlOwogCi0KLSAgaWYgKGFwcGx5UHJvY2Vzc2luZykKLSAgewotICAgIFVDSEFSICogYm9yZGVycyA9IGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzOwotICAgIGxhc3RTbG90T2ZmcyA9ICBib3JkZXJzW2hGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzXSAtIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHM7CisgIGlmIChhcHBseVByb2Nlc3NpbmcpIHsKKyAgICBVQ0hBUiAqYm9yZGVycyA9IGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzOworICAgIGxhc3RTbG90T2ZmcyA9IGJvcmRlcnNbaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXNdIC0KKyAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzOwogCiAgICAgRklYUF9EQkwgZGVncmVlQWxpYXNbKDY0KV07CisgICAgUFZDX0RZTkFNSUNfREFUQSBwdmNEeW5hbWljRGF0YTsKKyAgICBwdmNJbml0RnJhbWUoCisgICAgICAgICZoU2JyRGVjLT5QdmNTdGF0aWNEYXRhLCAmcHZjRHluYW1pY0RhdGEsCisgICAgICAgIChoSGVhZGVyRGF0YS0+ZnJhbWVFcnJvckZsYWcgPyAwIDogaEhlYWRlckRhdGEtPmJzX2luZm8ucHZjX21vZGUpLAorICAgICAgICBoRnJhbWVEYXRhLT5ucywgaEhlYWRlckRhdGEtPnRpbWVTdGVwLAorICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmQsCisgICAgICAgIGhGcmFtZURhdGEtPmZyYW1lSW5mby5wdmNCb3JkZXJzWzBdLCBoRnJhbWVEYXRhLT5wdmNJRCk7CisKKyAgICBpZiAoIWhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZyAmJiAoaEhlYWRlckRhdGEtPmJzX2luZm8ucHZjX21vZGUgPiAwKSkgeworICAgICAgcHZjRGVjb2RlRnJhbWUoJmhTYnJEZWMtPlB2Y1N0YXRpY0RhdGEsICZwdmNEeW5hbWljRGF0YSwgcExvd0JhbmRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgcExvd0JhbmRJbWFnLCBvdl9sZW4sCisgICAgICAgICAgICAgICAgICAgICBTQ0FMRTJFWFAoaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5vdl9sYl9zY2FsZSksCisgICAgICAgICAgICAgICAgICAgICBTQ0FMRTJFWFAoaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5sYl9zY2FsZSkpOworICAgIH0KKyAgICBwdmNFbmRGcmFtZSgmaFNickRlYy0+UHZjU3RhdGljRGF0YSwgJnB2Y0R5bmFtaWNEYXRhKTsKIAogICAgIC8qIFRoZSB0cmFuc3Bvc2VyIHdpbGwgb3ZlcnJpZGUgbW9zdCB2YWx1ZXMgaW4gZGVncmVlQWxpYXNbXS4KLSAgICAgICBUaGUgYXJyYXkgbmVlZHMgdG8gYmUgY2xlYXJlZCBhdCBsZWFzdCBmcm9tIGxvd1N1YmJhbmQgdG8gaGlnaFN1YmJhbmQgYmVmb3JlLiAqLworICAgICAgIFRoZSBhcnJheSBuZWVkcyB0byBiZSBjbGVhcmVkIGF0IGxlYXN0IGZyb20gbG93U3ViYmFuZCB0byBoaWdoU3ViYmFuZAorICAgICAgIGJlZm9yZS4gKi8KICAgICBpZiAoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKQotICAgICAgRkRLbWVtY2xlYXIoJmRlZ3JlZUFsaWFzW2hIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZF0sIChoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmhpZ2hTdWJiYW5kLWhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZCkqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jbGVhcigmZGVncmVlQWxpYXNbaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kXSwKKyAgICAgICAgICAgICAgICAgIChoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmhpZ2hTdWJiYW5kIC0KKyAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmQpICoKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpKTsKIAogICAgIC8qCi0gICAgICBJbnZlcnNlIGZpbHRlcmluZyBvZiBsb3diYW5kIGFuZCB0cmFuc3Bvc2l0aW9uIGludG8gdGhlIFNCUi1mcmVxdWVuY3kgcmFuZ2UKKyAgICAgIEludmVyc2UgZmlsdGVyaW5nIG9mIGxvd2JhbmQgYW5kIHRyYW5zcG9zaXRpb24gaW50byB0aGUgU0JSLWZyZXF1ZW5jeQorICAgICAgcmFuZ2UKICAgICAqLwogCi0gICAgbHBwVHJhbnNwb3NlciAoICZoU2JyRGVjLT5McHBUcmFucywKLSAgICAgICAgICAgICAgICAgICAgJmhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICBkZWdyZWVBbGlhcywgICAgICAgICAgICAgICAgICAvLyBvbmx5IHVzZWQgaWYgdXNlTFAgPSAxCi0gICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzICYgU0JSREVDX0xPV19QT1dFUiwKLSAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPnRpbWVTdGVwLAotICAgICAgICAgICAgICAgICAgICBib3JkZXJzWzBdLAotICAgICAgICAgICAgICAgICAgICBsYXN0U2xvdE9mZnMsCi0gICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YS0+c2JyX2ludmZfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgaFByZXZGcmFtZURhdGEtPnNicl9pbnZmX21vZGUgKTsKKyAgICB7CisgICAgICBLRUVQX1NUQVRFU19TWU5DRURfTU9ERSBrZWVwU3RhdGVzU3luY2VkTW9kZSA9CisgICAgICAgICAgKChmbGFncyAmIFNCUkRFQ19VU0FDX0hBUk1PTklDU0JSKSAmJgorICAgICAgICAgICAoaEZyYW1lRGF0YS0+c2JyUGF0Y2hpbmdNb2RlICE9IDApKQorICAgICAgICAgICAgICA/IEtFRVBfU1RBVEVTX1NZTkNFRF9OT1JNQUwKKyAgICAgICAgICAgICAgOiBLRUVQX1NUQVRFU19TWU5DRURfT0ZGOwogCisgICAgICBpZiAoZmxhZ3MgJiBTQlJERUNfVVNBQ19IQVJNT05JQ1NCUikgeworICAgICAgICBpZiAoZmxhZ3MgJiBTQlJERUNfUVVBRF9SQVRFKSB7CisgICAgICAgICAgcFJlYWwgLT0gMzI7CisgICAgICAgICAgcEltYWcgLT0gMzI7CisgICAgICAgIH0KIAorICAgICAgICBpZiAoKGhTYnJEZWMtPnNhdmVkU3RhdGVzID09IDApICYmIChoRnJhbWVEYXRhLT5zYnJQYXRjaGluZ01vZGUgPT0gMSkpIHsKKyAgICAgICAgICAvKiBjb3B5IHNhdmVkIHN0YXRlcyBmcm9tIHByZXZpb3VzIGZyYW1lIHRvIGxlZ2FjeSBTQlIgbHBjIGZpbHRlcnN0YXRlCisgICAgICAgICAgICogYnVmZmVyICAgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTFBDX09SREVSICsgb3ZfbGVuOyBpKyspIHsKKyAgICAgICAgICAgIEZES21lbWNweSgKKyAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsTGVnU0JSW2ldLAorICAgICAgICAgICAgICAgIGhTYnJEZWMtPmNvZGVjUU1GQnVmZmVyUmVhbFtub0NvbHMgLSBMUENfT1JERVIgLSBvdl9sZW4gKyBpXSwKKyAgICAgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLT5ub0NoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgICBGREttZW1jcHkoCisgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ0xlZ1NCUltpXSwKKyAgICAgICAgICAgICAgICBoU2JyRGVjLT5jb2RlY1FNRkJ1ZmZlckltYWdbbm9Db2xzIC0gTFBDX09SREVSIC0gb3ZfbGVuICsgaV0sCisgICAgICAgICAgICAgICAgaFNickRlYy0+aEhCRS0+bm9DaGFubmVscyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQogCisgICAgICAgIC8qIHNhdmluZyB1bm1vZGlmaWVkIFFNRiBzdGF0ZXMgaW4gY2FzZSB3ZSBhcmUgc3dpdGNoaW5nIGZyb20gbGVnYWN5IFNCUgorICAgICAgICAgKiB0byBIQkUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhTYnJEZWMtPmhIQkUtPm5vQ29sczsgaSsrKSB7CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJEZWMtPmNvZGVjUU1GQnVmZmVyUmVhbFtpXSwgcExvd0JhbmRSZWFsW292X2xlbiArIGldLAorICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLT5ub0NoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJEZWMtPmNvZGVjUU1GQnVmZmVySW1hZ1tpXSwgcExvd0JhbmRJbWFnW292X2xlbiArIGldLAorICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLT5ub0NoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIH0KIAorICAgICAgICBRbWZUcmFuc3Bvc2VyQXBwbHkoCisgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLCBwUmVhbCwgcEltYWcsIG5vQ29scywgcExvd0JhbmRSZWFsLCBwTG93QmFuZEltYWcsCisgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsSEJFLAorICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ0hCRSwKKyAgICAgICAgICAgIGhGcmFtZURhdGEtPnNiclBpdGNoSW5CaW5zLCBoU2JyRGVjLT5zY2FsZV9sYiwgaFNickRlYy0+c2NhbGVfaGJlLAorICAgICAgICAgICAgJmhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcuaGJfc2NhbGUsIGhIZWFkZXJEYXRhLT50aW1lU3RlcCwKKyAgICAgICAgICAgIGJvcmRlcnNbMF0sIG92X2xlbiwga2VlcFN0YXRlc1N5bmNlZE1vZGUpOworCisgICAgICAgIGlmIChmbGFncyAmIFNCUkRFQ19RVUFEX1JBVEUpIHsKKyAgICAgICAgICBpbnQgKnhPdmVyUW1mID0gR2V0eE92ZXJCYW5kUW1mVHJhbnNwb3NlcihoU2JyRGVjLT5oSEJFKTsKKworICAgICAgICAgIGNvcHlIYXJtb25pY1NwZWN0cnVtKHhPdmVyUW1mLCBwTG93QmFuZFJlYWwsIHBMb3dCYW5kSW1hZywgbm9Db2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92X2xlbiwga2VlcFN0YXRlc1N5bmNlZE1vZGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKChmbGFncyAmIFNCUkRFQ19VU0FDX0hBUk1PTklDU0JSKSAmJgorICAgICAgICAoaEZyYW1lRGF0YS0+c2JyUGF0Y2hpbmdNb2RlID09IDApKSB7CisgICAgICBoU2JyRGVjLT5wcmV2X2ZyYW1lX2xTYnIgPSAwOworICAgICAgaFNickRlYy0+cHJldl9mcmFtZV9oYmVTYnIgPSAxOworCisgICAgICBscHBUcmFuc3Bvc2VySEJFKAorICAgICAgICAgICZoU2JyRGVjLT5McHBUcmFucywgaFNickRlYy0+aEhCRSwgJmhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcsCisgICAgICAgICAgcExvd0JhbmRSZWFsLCBwTG93QmFuZEltYWcsIGhIZWFkZXJEYXRhLT50aW1lU3RlcCwgYm9yZGVyc1swXSwKKyAgICAgICAgICBsYXN0U2xvdE9mZnMsIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kcywKKyAgICAgICAgICBoRnJhbWVEYXRhLT5zYnJfaW52Zl9tb2RlLCBoUHJldkZyYW1lRGF0YS0+c2JyX2ludmZfbW9kZSk7CisKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGZsYWdzICYgU0JSREVDX1VTQUNfSEFSTU9OSUNTQlIpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUiArIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsgaSsrKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICBTdG9yZSB0aGUgdW5tb2RpZmllZCBxbWYgU2xvdHMgdmFsdWVzIGZvciB1cHBlciBwYXJ0IG9mIHNwZWN0cnVtCisgICAgICAgICAgKHJlcXVpcmVkIGZvciBMUEMgZmlsdGVyaW5nKSByZXF1aXJlZCBpZiBuZXh0IGZyYW1lIGlzIGEgSEJFIGZyYW1lCisgICAgICAgICAgKi8KKyAgICAgICAgICBGREttZW1jcHkoaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbEhCRVtpXSwKKyAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+cW1mRG9tYWluSW5DaAorICAgICAgICAgICAgICAgICAgICAgICAgLT5oUW1mU2xvdHNSZWFsW2hTYnJEZWMtPmhIQkUtPm5vQ29scyAtIExQQ19PUkRFUiArIGldLAorICAgICAgICAgICAgICAgICAgICAoNjQpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc0ltYWdIQkVbaV0sCisgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+aFFtZlNsb3RzSW1hZ1toU2JyRGVjLT5oSEJFLT5ub0NvbHMgLSBMUENfT1JERVIgKyBpXSwKKyAgICAgICAgICAgICAgICAgICAgKDY0KSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICB7CisgICAgICAgIGhTYnJEZWMtPnByZXZfZnJhbWVfbFNiciA9IDE7CisgICAgICAgIGhTYnJEZWMtPnByZXZfZnJhbWVfaGJlU2JyID0gMDsKKyAgICAgIH0KKworICAgICAgbHBwVHJhbnNwb3NlcigKKyAgICAgICAgICAmaFNickRlYy0+THBwVHJhbnMsICZoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLCBwTG93QmFuZFJlYWwsCisgICAgICAgICAgZGVncmVlQWxpYXMsICAvLyBvbmx5IHVzZWQgaWYgdXNlTFAgPSAxCisgICAgICAgICAgcExvd0JhbmRJbWFnLCBmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIsCisgICAgICAgICAgaEhlYWRlckRhdGEtPmJzX2luZm8uc2JyX3ByZXByb2Nlc3NpbmcsCisgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS52X2tfbWFzdGVyWzBdLCBoSGVhZGVyRGF0YS0+dGltZVN0ZXAsCisgICAgICAgICAgYm9yZGVyc1swXSwgbGFzdFNsb3RPZmZzLCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5JbnZmQmFuZHMsCisgICAgICAgICAgaEZyYW1lRGF0YS0+c2JyX2ludmZfbW9kZSwgaFByZXZGcmFtZURhdGEtPnNicl9pbnZmX21vZGUpOworICAgIH0KIAogICAgIC8qCiAgICAgICBBZGp1c3QgZW52ZWxvcGUgb2YgY3VycmVudCBmcmFtZS4KICAgICAqLwogCi0gICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKCZoU2JyRGVjLT5zYnJTY2FsZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJEZWMtPlNickNhbGN1bGF0ZUVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSLAorICAgIGlmICgoaEZyYW1lRGF0YS0+c2JyUGF0Y2hpbmdNb2RlICE9CisgICAgICAgICBoU2JyRGVjLT5TYnJDYWxjdWxhdGVFbnZlbG9wZS5zYnJQYXRjaGluZ01vZGUpKSB7CisgICAgICBSZXNldExpbWl0ZXJCYW5kcyhoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxpbWl0ZXJCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAmaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5ub0xpbWl0ZXJCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+cGF0Y2hQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+bm9PZlBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhLT5zYnJQYXRjaGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTQlJERUNfVVNBQ19IQVJNT05JQ1NCUikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhGcmFtZURhdGEtPnNiclBhdGNoaW5nTW9kZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR2V0eE92ZXJCYW5kUW1mVHJhbnNwb3NlcihoU2JyRGVjLT5oSEJFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldDQxU2JyUW1mVHJhbnNwb3NlcihoU2JyRGVjLT5oSEJFKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlQWxpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnIHx8IGhQcmV2RnJhbWVEYXRhLT5mcmFtZUVycm9yRmxhZykpOworICAgICAgaFNickRlYy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUuc2JyUGF0Y2hpbmdNb2RlID0KKyAgICAgICAgICBoRnJhbWVEYXRhLT5zYnJQYXRjaGluZ01vZGU7CisgICAgfQogCisgICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUoCisgICAgICAgICZoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLCAmaFNickRlYy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUsCisgICAgICAgIGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhLCAmcHZjRHluYW1pY0RhdGEsIHBMb3dCYW5kUmVhbCwgcExvd0JhbmRJbWFnLAorICAgICAgICBmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIsCiAKKyAgICAgICAgZGVncmVlQWxpYXMsIGZsYWdzLAorICAgICAgICAoaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnIHx8IGhQcmV2RnJhbWVEYXRhLT5mcmFtZUVycm9yRmxhZykpOworCisjaWYgKFNCUkRFQ19NQVhfSEJfRkFERV9GUkFNRVMgPiAwKQorICAgIC8qIEF2b2lkIGhhcmQgb25zZXRzIG9mIGhpZ2ggYmFuZCAqLworICAgIGlmIChoSGVhZGVyRGF0YS0+ZnJhbWVFcnJvckZsYWcpIHsKKyAgICAgIGlmIChoU2JyRGVjLT5oaWdoQmFuZEZhZGVDbnQgPCBTQlJERUNfTUFYX0hCX0ZBREVfRlJBTUVTKSB7CisgICAgICAgIGhTYnJEZWMtPmhpZ2hCYW5kRmFkZUNudCArPSAxOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoaFNickRlYy0+aGlnaEJhbmRGYWRlQ250ID4KKyAgICAgICAgICAwKSB7IC8qIE1hbmlwdWxhdGUgaGlnaCBiYW5kIHNjYWxlIGZhY3RvciB0byBnZXQgYSBzbW9vdGggZmFkZS1pbiAqLworICAgICAgICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmhiX3NjYWxlICs9IGhTYnJEZWMtPmhpZ2hCYW5kRmFkZUNudDsKKyAgICAgICAgaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5oYl9zY2FsZSA9CisgICAgICAgICAgICBmTWluKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcuaGJfc2NhbGUsIERGUkFDVF9CSVRTIC0gMSk7CisgICAgICAgIGhTYnJEZWMtPmhpZ2hCYW5kRmFkZUNudCAtPSAxOworICAgICAgfQorICAgIH0KKworI2VuZGlmCiAgICAgLyoKICAgICAgIFVwZGF0ZSBoUHJldkZyYW1lRGF0YSAodG8gYmUgdXNlZCBpbiB0aGUgbmV4dCBmcmFtZSkKICAgICAqLwotICAgIGZvciAoaT0wOyBpPGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kczsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kczsgaSsrKSB7CiAgICAgICBoUHJldkZyYW1lRGF0YS0+c2JyX2ludmZfbW9kZVtpXSA9IGhGcmFtZURhdGEtPnNicl9pbnZmX21vZGVbaV07CiAgICAgfQogICAgIGhQcmV2RnJhbWVEYXRhLT5jb3VwbGluZyA9IGhGcmFtZURhdGEtPmNvdXBsaW5nOwogICAgIGhQcmV2RnJhbWVEYXRhLT5zdG9wUG9zID0gYm9yZGVyc1toRnJhbWVEYXRhLT5mcmFtZUluZm8ubkVudmVsb3Blc107CiAgICAgaFByZXZGcmFtZURhdGEtPmFtcFJlcyA9IGhGcmFtZURhdGEtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWU7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogUmVzZXQgaGJfc2NhbGUgaWYgbm8gaGlnaGJhbmQgaXMgcHJlc2VudCwgYmVjYXVzZSBoYl9zY2FsZSBpcyBjb25zaWRlcmVkIGluIHRoZSBRTUYtc3ludGhlc2lzICovCi0gICAgaFNickRlYy0+c2JyU2NhbGVGYWN0b3IuaGJfc2NhbGUgPSBzYXZlTGJTY2FsZTsKKyAgICBoUHJldkZyYW1lRGF0YS0+cHJldlNiclBpdGNoSW5CaW5zID0gaEZyYW1lRGF0YS0+c2JyUGl0Y2hJbkJpbnM7CisgICAgLyogY291bGQgYmUgZG9uZSBpbiBleHRyYWN0RnJhbWVJbmZvX3B2YygpIGJ1dCBoUHJldkZyYW1lRGF0YSBpcyBub3QKKyAgICAgKiBhdmFpbGFibGUgdGhlcmUgKi8KKyAgICBGREttZW1jcHkoJmhQcmV2RnJhbWVEYXRhLT5wcmV2RnJhbWVJbmZvLCAmaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLAorICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfSU5GTykpOworICB9IGVsc2UgeworICAgIC8qIHJlc2NhbGUgZnJvbSBsc2IgdG8gbkFuYWx5c2lzQmFuZHMgaW4gb3JkZXIgdG8gY29tcGVuc2F0ZSBzY2FsaW5nIHdpdGgKKyAgICAgKiBoYl9zY2FsZSBpbiB0aGlzIGFyZWEsIGRvbmUgYnkgc3ludGhlc2lzRmlsdGVyaW5nKi8KKyAgICBpbnQgcmVzY2FsZTsKKyAgICBpbnQgbHNiOworICAgIGludCBsZW5ndGg7CisKKyAgICAvKiBSZXNldCBoYl9zY2FsZSBpZiBubyBoaWdoYmFuZCBpcyBwcmVzZW50LCBiZWNhdXNlIGhiX3NjYWxlIGlzIGNvbnNpZGVyZWQKKyAgICAgKiBpbiB0aGUgUU1GLXN5bnRoZXNpcyAqLworICAgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcuaGJfc2NhbGUgPSBzYXZlTGJTY2FsZTsKKworICAgIHJlc2NhbGUgPSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmhiX3NjYWxlIC0KKyAgICAgICAgICAgICAgaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5vdl9sYl9zY2FsZTsKKyAgICBsc2IgPSBoU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIubHNiOworICAgIGxlbmd0aCA9IChoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5mYi5ub19jaGFubmVscyAtIGxzYik7CisKKyAgICBpZiAoKHJlc2NhbGUgPCAwKSAmJiAobGVuZ3RoID4gMCkpIHsKKyAgICAgIGlmICghKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG92X2xlbjsgaSsrKSB7CisgICAgICAgICAgc2NhbGVWYWx1ZXMoJnBMb3dCYW5kUmVhbFtpXVtsc2JdLCBsZW5ndGgsIHJlc2NhbGUpOworICAgICAgICAgIHNjYWxlVmFsdWVzKCZwTG93QmFuZEltYWdbaV1bbHNiXSwgbGVuZ3RoLCByZXNjYWxlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG92X2xlbjsgaSsrKSB7CisgICAgICAgICAgc2NhbGVWYWx1ZXMoJnBMb3dCYW5kUmVhbFtpXVtsc2JdLCBsZW5ndGgsIHJlc2NhbGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQogICB9CiAKKyAgaWYgKCEoZmxhZ3MgJiBTQlJERUNfVVNBQ19IQVJNT05JQ1NCUikpIHsKKyAgICBpbnQgbGVuZ3RoID0gaFNickRlYy0+cW1mRG9tYWluSW5DaC0+ZmIubHNiOworICAgIGlmIChmbGFncyAmIFNCUkRFQ19TWU5UQVhfVVNBQykgeworICAgICAgbGVuZ3RoID0gaFNickRlYy0+cW1mRG9tYWluSW5DaC0+ZmIubm9fY2hhbm5lbHM7CisgICAgfQogCi0gIGZvciAoaT0wOyBpPExQQ19PUkRFUjsgaSsrKXsKLSAgICAvKgotICAgICAgU3RvcmUgdGhlIHVubW9kaWZpZWQgcW1mIFNsb3RzIHZhbHVlcyAocmVxdWlyZWQgZm9yIExQQyBmaWx0ZXJpbmcpCi0gICAgKi8KLSAgICBpZiAoISAoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSkgewotICAgICAgRkRLbWVtY3B5KGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxbaV0sIFFtZkJ1ZmZlclJlYWxbbm9Db2xzLUxQQ19PUkRFUitpXSwgaFNickRlYy0+QW5hbHlzaXNjUU1GLmxzYipzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgIEZES21lbWNweShoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnW2ldLCBRbWZCdWZmZXJJbWFnW25vQ29scy1MUENfT1JERVIraV0sIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5sc2Iqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgfSBlbHNlCi0gICAgRkRLbWVtY3B5KGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxbaV0sIFFtZkJ1ZmZlclJlYWxbbm9Db2xzLUxQQ19PUkRFUitpXSwgaFNickRlYy0+QW5hbHlzaXNjUU1GLmxzYipzaXplb2YoRklYUF9EQkwpKTsKKyAgICAvKiBpbiBjYXNlIG9mIGxlZ2FjeSBzYnIgc2F2aW5nIG9mIGZpbHRlciBzdGF0ZXMgaGVyZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMUENfT1JERVIgKyBvdl9sZW47IGkrKykgeworICAgICAgLyoKKyAgICAgICAgU3RvcmUgdGhlIHVubW9kaWZpZWQgcW1mIFNsb3RzIHZhbHVlcyAocmVxdWlyZWQgZm9yIExQQyBmaWx0ZXJpbmcpCisgICAgICAqLworICAgICAgaWYgKCEoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSkgeworICAgICAgICBGREttZW1jcHkoaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbExlZ1NCUltpXSwKKyAgICAgICAgICAgICAgICAgIHBMb3dCYW5kUmVhbFtub0NvbHMgLSBMUENfT1JERVIgKyBpXSwKKyAgICAgICAgICAgICAgICAgIGxlbmd0aCAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICBGREttZW1jcHkoaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ0xlZ1NCUltpXSwKKyAgICAgICAgICAgICAgICAgIHBMb3dCYW5kSW1hZ1tub0NvbHMgLSBMUENfT1JERVIgKyBpXSwKKyAgICAgICAgICAgICAgICAgIGxlbmd0aCAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgfSBlbHNlCisgICAgICAgIEZES21lbWNweShoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsTGVnU0JSW2ldLAorICAgICAgICAgICAgICAgICAgcExvd0JhbmRSZWFsW25vQ29scyAtIExQQ19PUkRFUiArIGldLAorICAgICAgICAgICAgICAgICAgbGVuZ3RoICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQogICB9CiAKICAgLyoKICAgICBTeW50aGVzaXMgc3ViYmFuZCBmaWx0ZXJpbmcuCiAgICovCiAKLSAgaWYgKCAhIChmbGFncyAmIFNCUkRFQ19QU19ERUNPREVEKSApIHsKLQotICAgIHsKKyAgaWYgKCEoZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkpIHsKKyAgICBpZiAoIShmbGFncyAmIFNCUkRFQ19TS0lQX1FNRl9TWU4pKSB7CiAgICAgICBpbnQgb3V0U2NhbGVmYWN0b3IgPSAwOwogCiAgICAgICBpZiAoaF9wc19kICE9IE5VTEwpIHsKLSAgICAgICAgaF9wc19kLT5wcm9jRnJhbWVCYXNlZCA9IDE7ICAvKiB3ZSBoZXJlIGRvIGZyYW1lIGJhc2VkIHByb2Nlc3NpbmcgKi8KKyAgICAgICAgaF9wc19kLT5wcm9jRnJhbWVCYXNlZCA9IDE7IC8qIHdlIGhlcmUgZG8gZnJhbWUgYmFzZWQgcHJvY2Vzc2luZyAqLwogICAgICAgfQogCisgICAgICBzYnJEZWNvZGVyX2RyY0FwcGx5KCZoU2JyRGVjLT5zYnJEcmNDaGFubmVsLCBwTG93QmFuZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpID8gTlVMTCA6IHBMb3dCYW5kSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+cW1mRG9tYWluT3V0Q2gtPmZiLm5vX2NvbCwgJm91dFNjYWxlZmFjdG9yKTsKIAotICAgICAgc2JyRGVjb2Rlcl9kcmNBcHBseSgmaFNickRlYy0+c2JyRHJjQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSA/IE5VTEwgOiBRbWZCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+U3ludGhlc2lzUU1GLm5vX2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNjYWxlZmFjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLQotCi0gICAgICBxbWZDaGFuZ2VPdXRTY2FsZWZhY3RvcigmaFNickRlYy0+U3ludGhlc2lzUU1GLCBvdXRTY2FsZWZhY3RvciApOworICAgICAgcW1mQ2hhbmdlT3V0U2NhbGVmYWN0b3IoJmhTYnJEZWMtPnFtZkRvbWFpbk91dENoLT5mYiwgb3V0U2NhbGVmYWN0b3IpOwogCiAgICAgICB7Ci0gICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocW1mVGVtcCwgRklYUF9EQkwsIDIqKDY0KSk7CisgICAgICAgIEhBTkRMRV9GUkVRX0JBTkRfREFUQSBoRnJlcSA9ICZoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhOworICAgICAgICBpbnQgc2F2ZV91c2IgPSBoU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIudXNiOwogCi0gICAgICAgIHFtZlN5bnRoZXNpc0ZpbHRlcmluZyggJmhTYnJEZWMtPlN5bnRoZXNpc1FNRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikgPyBOVUxMIDogUW1mQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickRlYy0+c2JyU2NhbGVGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZUZW1wKTsKLQotICAgICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChxbWZUZW1wLCBGSVhQX0RCTCwgMiooNjQpKTsKKyNpZiAoUU1GX01BWF9TWU5USEVTSVNfQkFORFMgPD0gNjQpCisgICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocW1mVGVtcCwgRklYUF9EQkwsIDIgKiBRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyk7CisjZWxzZQorICAgICAgICBDX0FBTExPQ19TVEFDS19TVEFSVChxbWZUZW1wLCBGSVhQX0RCTCwgMiAqIFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTKTsKKyNlbmRpZgorICAgICAgICBpZiAoaFNickRlYy0+cW1mRG9tYWluT3V0Q2gtPmZiLnVzYiA8IGhGcmVxLT5vdl9oaWdoU3ViYmFuZCkgeworICAgICAgICAgIC8qIHdlIG5lZWQgdG8gcGF0Y2ggdXNiIGZvciB0aGlzIGZyYW1lIGFzIG92ZXJsYXAgbWF5IGNvbnRhaW4gaGlnaGVyCisgICAgICAgICAgICAgZnJlcXVlbmN5IHJhbmdlIGlmIGhlYWRlcmNoYW5nZSBvY2N1cmVkOyBmYi4gdXNiIGlzIGFsd2F5cyBsaW1pdGVkCisgICAgICAgICAgICAgdG8gbWF4aW11bSBmYi5ub19jaGFubmVsczsgSW4gY2FzZSBvZiB3cm9uZ2x5IGRlY29kZWQgaGVhZGVycyBpdAorICAgICAgICAgICAgIG1pZ2h0IGJlIHRoYXQgb3ZfaGlnaFN1YmJhbmQgaXMgaGlnaGVyIHRoYW4gdGhlIG51bWJlciBvZiBzeW50aGVzaXMKKyAgICAgICAgICAgICBjaGFubmVscyAoZmIubm9fY2hhbm5lbHMpLCB3aGljaCBpcyBmb3JiaWRkZW4sIHRoZXJlZm9yZSB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgbGltaXQgb3ZfaGlnaFN1YmJhbmQgd2l0aCBmTWluIGZ1bmN0aW9uIHRvIGF2b2lkIG5vdCBhbGxvd2VkIHVzYiBpbgorICAgICAgICAgICAgIHN5bnRoZXNpcyBmaWx0ZXJiYW5rLiAqLworICAgICAgICAgIGhTYnJEZWMtPnFtZkRvbWFpbk91dENoLT5mYi51c2IgPQorICAgICAgICAgICAgICBmTWluKChVSU5UKWhGcmVxLT5vdl9oaWdoU3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAoVUlOVCloU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIubm9fY2hhbm5lbHMpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICBxbWZTeW50aGVzaXNGaWx0ZXJpbmcoCisgICAgICAgICAgICAgICZoU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIsIHBMb3dCYW5kUmVhbCwKKyAgICAgICAgICAgICAgKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikgPyBOVUxMIDogcExvd0JhbmRJbWFnLAorICAgICAgICAgICAgICAmaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZywKKyAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwLCB0aW1lT3V0LCBzdHJpZGVPdXQsCisgICAgICAgICAgICAgIHFtZlRlbXApOworICAgICAgICB9CisgICAgICAgIC8qIHJlc3RvcmUgc2F2ZWQgdmFsdWUgKi8KKyAgICAgICAgaFNickRlYy0+cW1mRG9tYWluT3V0Q2gtPmZiLnVzYiA9IHNhdmVfdXNiOworICAgICAgICBoRnJlcS0+b3ZfaGlnaFN1YmJhbmQgPSBzYXZlX3VzYjsKKyNpZiAoUU1GX01BWF9TWU5USEVTSVNfQkFORFMgPD0gNjQpCisgICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHFtZlRlbXAsIEZJWFBfREJMLCAyICogUU1GX01BWF9TWU5USEVTSVNfQkFORFMpOworI2Vsc2UKKyAgICAgICAgQ19BQUxMT0NfU1RBQ0tfRU5EKHFtZlRlbXAsIEZJWFBfREJMLCAyICogUU1GX01BWF9TWU5USEVTSVNfQkFORFMpOworI2VuZGlmCiAgICAgICB9Ci0KICAgICB9CiAKICAgfSBlbHNlIHsgLyogKGZsYWdzICYgU0JSREVDX1BTX0RFQ09ERUQpICovCi0gICAgSU5UIGksIHNkaWZmLCBvdXRTY2FsZWZhY3Rvciwgc2NhbGVGYWN0b3JMb3dCYW5kLCBzY2FsZUZhY3RvckhpZ2hCYW5kOwotICAgIFNDSEFSIHNjYWxlRmFjdG9yTG93QmFuZF9vdiwgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292OworICAgIElOVCBzZGlmZjsKKyAgICBJTlQgc2NhbGVGYWN0b3JIaWdoQmFuZCwgc2NhbGVGYWN0b3JMb3dCYW5kX292LCBzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3Y7CiAKLSAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiAgICAgID0gJmhTYnJEZWMtPlN5bnRoZXNpc1FNRjsKLSAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZlJpZ2h0ID0gJmhTYnJEZWNSaWdodC0+U3ludGhlc2lzUU1GOworICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mID0gJmhTYnJEZWMtPnFtZkRvbWFpbk91dENoLT5mYjsKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZlJpZ2h0ID0gJmhTYnJEZWNSaWdodC0+cW1mRG9tYWluT3V0Q2gtPmZiOwogCiAgICAgLyogYWRhcHQgc2NhbGluZyAqLwotICAgIHNkaWZmID0gaFNickRlYy0+c2JyU2NhbGVGYWN0b3IubGJfc2NhbGUgLSByZXNlcnZlOyAgICAgICAgICAgICAgICAgIC8qIFNjYWxpbmcgZGlmZmVyZW5jZSAgICAgICAgICovCi0gICAgc2NhbGVGYWN0b3JIaWdoQmFuZCAgID0gc2RpZmYgLSBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5oYl9zY2FsZTsgICAgLyogU2NhbGUgb2YgY3VycmVudCBoaWdoIGJhbmQgKi8KLSAgICBzY2FsZUZhY3Rvckxvd0JhbmRfb3YgPSBzZGlmZiAtIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLm92X2xiX3NjYWxlOyAvKiBTY2FsZSBvZiBsb3cgYmFuZCBvdmVybGFwcGluZyBRTUYgZGF0YSAqLwotICAgIHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdiA9IHNkaWZmIC0gaFNickRlYy0+c2JyU2NhbGVGYWN0b3IubGJfc2NhbGU7IC8qIFNjYWxlIG9mIGxvdyBiYW5kIGN1cnJlbnQgUU1GIGRhdGEgICAgICovCi0gICAgb3V0U2NhbGVmYWN0b3IgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbCBvdXRwdXQgc2NhbGUgKi8KKyAgICBzZGlmZiA9IGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcubGJfc2NhbGUgLQorICAgICAgICAgICAgcmVzZXJ2ZTsgLyogU2NhbGluZyBkaWZmZXJlbmNlICovCisgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCA9IHNkaWZmIC0gaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5oYl9zY2FsZTsKKyAgICBzY2FsZUZhY3Rvckxvd0JhbmRfb3YgPSBzZGlmZiAtIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcub3ZfbGJfc2NhbGU7CisgICAgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292ID0gc2RpZmYgLSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmxiX3NjYWxlOwogCi0gICAgaWYgKGhfcHNfZC0+cHJvY0ZyYW1lQmFzZWQgPT0gMSkgICAgLyogSWYgd2UgaGF2ZSBzd2l0Y2hlZCBmcm9tIGZyYW1lIHRvIHNsb3QgYmFzZWQgcHJvY2Vzc2luZyBjb3B5IGZpbHRlciBzdGF0ZXMgKi8KLSAgICB7IC8qIHByb2NGcmFtZUJhc2VkIHdpbGwgYmUgdW5zZXQgbGF0ZXIgKi8KKyAgICAvKiBTY2FsZSBvZiBsb3cgYmFuZCBvdmVybGFwcGluZyBRTUYgZGF0YSAqLworICAgIHNjYWxlRmFjdG9yTG93QmFuZF9vdiA9CisgICAgICAgIGZNaW4oREZSQUNUX0JJVFMgLSAxLCBmTWF4KC0oREZSQUNUX0JJVFMgLSAxKSwgc2NhbGVGYWN0b3JMb3dCYW5kX292KSk7CisgICAgLyogU2NhbGUgb2YgbG93IGJhbmQgY3VycmVudCBRTUYgZGF0YSAgICAgKi8KKyAgICBzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3YgPSBmTWluKAorICAgICAgICBERlJBQ1RfQklUUyAtIDEsIGZNYXgoLShERlJBQ1RfQklUUyAtIDEpLCBzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3YpKTsKKyAgICAvKiBTY2FsZSBvZiBjdXJyZW50IGhpZ2ggYmFuZCAqLworICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQgPQorICAgICAgICBmTWluKERGUkFDVF9CSVRTIC0gMSwgZk1heCgtKERGUkFDVF9CSVRTIC0gMSksIHNjYWxlRmFjdG9ySGlnaEJhbmQpKTsKKworICAgIGlmIChoX3BzX2QtPnByb2NGcmFtZUJhc2VkID09IDEpIC8qIElmIHdlIGhhdmUgc3dpdGNoZWQgZnJvbSBmcmFtZSB0byBzbG90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgcHJvY2Vzc2luZyBjb3B5IGZpbHRlciBzdGF0ZXMgKi8KKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9jRnJhbWVCYXNlZCB3aWxsIGJlIHVuc2V0IGxhdGVyICovCiAgICAgICAvKiBjb3B5IGZpbHRlciBzdGF0ZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0ICovCi0gICAgICBGREttZW1jcHkoc3luUW1mUmlnaHQtPkZpbHRlclN0YXRlcywgc3luUW1mLT5GaWx0ZXJTdGF0ZXMsICgoNjQwKS0oNjQpKSpzaXplb2YoRklYUF9RU1MpKTsKKyAgICAgIC8qIHdhcyAoKDY0MCktKDY0KSkqc2l6ZW9mKEZJWFBfUVNTKQorICAgICAgICAgZmxleGlibGUgYW1vdW50IG9mIHN5bnRoZXNpcyBiYW5kcyBuZWVkZWQgZm9yIFFNRiBiYXNlZCByZXNhbXBsaW5nCisgICAgICAqLworICAgICAgRkRLX0FTU0VSVChoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5wR2xvYmFsQ29uZi0+bkJhbmRzU3ludGhlc2lzIDw9CisgICAgICAgICAgICAgICAgIFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTKTsKKyAgICAgIEZES21lbWNweShzeW5RbWZSaWdodC0+RmlsdGVyU3RhdGVzLCBzeW5RbWYtPkZpbHRlclN0YXRlcywKKyAgICAgICAgICAgICAgICA5ICogaFNickRlYy0+cW1mRG9tYWluSW5DaC0+cEdsb2JhbENvbmYtPm5CYW5kc1N5bnRoZXNpcyAqCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX1FTUykpOwogICAgIH0KIAotICAgIC8qIHNjYWxlIEFMTCBxbWYgdmFsZXMgKCByZWFsIGFuZCBpbWFnICkgb2YgbW9ubyAvIGxlZnQgY2hhbm5lbCB0byB0aGUKLSAgICAgICBzYW1lIHNjYWxlIGZhY3RvciAoIG92X2xiX3NmLCBsYl9zZiBhbmQgaHFfc2YgKSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHNjYWxGaWx0ZXJCYW5rVmFsdWVzKCBoX3BzX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVyUmVhbCwgICAgICAgICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlckltYWcsICAgICAgICAgICAgICAgICAgICAgIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5RbWYtPmxzYiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYnIgc3RhcnQgc3ViYmFuZCAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfbGJfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLmxiX3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZUZhY3Rvckxvd0JhbmRfb3YsICAgICAgICAgICAgICAvKiBhZGFwdCBzY2FsaW5nIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3YsICAgICAgICAgICAvKiBhZGFwdCBzY2FsaW5nIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5oYl9zY2FsZSwgICAvKiBjdXJyZW50IGZyYW1lICggaGlnaGJhbmQgKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZUZhY3RvckhpZ2hCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5RbWYtPm5vX2NvbCk7CisgICAgLyogRmVlZCBkZWxheWxpbmVzIHdoZW4gcGFyYW1ldHJpYyBzdGVyZW8gaXMgc3dpdGNoZWQgb24uICovCisgICAgUHJlcGFyZVBzUHJvY2Vzc2luZyhoX3BzX2QsIHBMb3dCYW5kUmVhbCwgcExvd0JhbmRJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kX292KTsKIAogICAgIC8qIHVzZSB0aGUgc2FtZSBzeW50aGVzZSBxbWYgdmFsdWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsICovCiAgICAgc3luUW1mUmlnaHQtPm5vX2NvbCA9IHN5blFtZi0+bm9fY29sOwotICAgIHN5blFtZlJpZ2h0LT5sc2IgICAgPSBzeW5RbWYtPmxzYjsKLSAgICBzeW5RbWZSaWdodC0+dXNiICAgID0gc3luUW1mLT51c2I7CisgICAgc3luUW1mUmlnaHQtPmxzYiA9IHN5blFtZi0+bHNiOworICAgIHN5blFtZlJpZ2h0LT51c2IgPSBzeW5RbWYtPnVzYjsKIAotICAgIGludCBlbnY9MDsKLQotICAgICAgb3V0U2NhbGVmYWN0b3IgKz0gKFNDQUxfSEVBRFJPT00rMSk7IC8qIHBzRGlmZlNjYWxlISAqLworICAgIGludCBlbnYgPSAwOwogCiAgICAgewotICAgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChwV29ya0J1ZmZlciwgRklYUF9EQkwsIDIqKDY0KSk7CisjaWYgKFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTIDw9IDY0KQorICAgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChwV29ya0J1ZmZlciwgRklYUF9EQkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyk7CisjZWxzZQorICAgICAgQ19BQUxMT0NfU1RBQ0tfU1RBUlQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAyICogUU1GX01BWF9TWU5USEVTSVNfQkFORFMpOworI2VuZGlmCiAKICAgICAgIGludCBtYXhTaGlmdCA9IDA7CiAKQEAgLTY0Miw5OSArNzgxLDgwIEBACiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgLyogY29weSBEUkMgZGF0YSB0byByaWdodCBjaGFubmVsICh3aXRoIFBTIGJvdGggY2hhbm5lbHMgdXNlIHRoZSBzYW1lIERSQyBnYWlucykgKi8KLSAgICAgIEZES21lbWNweSgmaFNickRlY1JpZ2h0LT5zYnJEcmNDaGFubmVsLCAmaFNickRlYy0+c2JyRHJjQ2hhbm5lbCwgc2l6ZW9mKFNCUkRFQ19EUkNfQ0hBTk5FTCkpOworICAgICAgLyogY29weSBEUkMgZGF0YSB0byByaWdodCBjaGFubmVsICh3aXRoIFBTIGJvdGggY2hhbm5lbHMgdXNlIHRoZSBzYW1lIERSQworICAgICAgICogZ2FpbnMpICovCisgICAgICBGREttZW1jcHkoJmhTYnJEZWNSaWdodC0+c2JyRHJjQ2hhbm5lbCwgJmhTYnJEZWMtPnNickRyY0NoYW5uZWwsCisgICAgICAgICAgICAgICAgc2l6ZW9mKFNCUkRFQ19EUkNfQ0hBTk5FTCkpOwogCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgc3luUW1mLT5ub19jb2w7IGkrKykgeyAgLyogLS0tLS0gbm9fY29sIGxvb3AgLS0tLS0gKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW5RbWYtPm5vX2NvbDsgaSsrKSB7IC8qIC0tLS0tIG5vX2NvbCBsb29wIC0tLS0tICovCiAKICAgICAgICAgSU5UIG91dFNjYWxlZmFjdG9yUiwgb3V0U2NhbGVmYWN0b3JMOwotICAgICAgICBvdXRTY2FsZWZhY3RvclIgPSBvdXRTY2FsZWZhY3RvckwgPSBvdXRTY2FsZWZhY3RvcjsKIAogICAgICAgICAvKiBxbWYgdGltZXNsb3Qgb2YgcmlnaHQgY2hhbm5lbCAqLwotICAgICAgICBGSVhQX0RCTCogclFtZlJlYWwgPSBwV29ya0J1ZmZlcjsKLSAgICAgICAgRklYUF9EQkwqIHJRbWZJbWFnID0gcFdvcmtCdWZmZXIgKyA2NDsKLQorICAgICAgICBGSVhQX0RCTCAqclFtZlJlYWwgPSBwV29ya0J1ZmZlcjsKKyAgICAgICAgRklYUF9EQkwgKnJRbWZJbWFnID0gcFdvcmtCdWZmZXIgKyBzeW5RbWYtPm5vX2NoYW5uZWxzOwogCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAoIGkgPT0gaF9wc19kLT5ic0RhdGFbaF9wc19kLT5wcm9jZXNzU2xvdF0ubXBlZy5hRW52U3RhcnRTdG9wW2Vudl0gKSB7Ci0gICAgICAgICAgICBpbml0U2xvdEJhc2VkUm90YXRpb24oIGhfcHNfZCwgZW52LCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmhpZ2hTdWJiYW5kICk7CisgICAgICAgICAgaWYgKGkgPT0KKyAgICAgICAgICAgICAgaF9wc19kLT5ic0RhdGFbaF9wc19kLT5wcm9jZXNzU2xvdF0ubXBlZy5hRW52U3RhcnRTdG9wW2Vudl0pIHsKKyAgICAgICAgICAgIGluaXRTbG90QmFzZWRSb3RhdGlvbihoX3BzX2QsIGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmhpZ2hTdWJiYW5kKTsKICAgICAgICAgICAgIGVudisrOwogICAgICAgICAgIH0KIAotICAgICAgICAgIEFwcGx5UHNTbG90KCBoX3BzX2QsICAgICAgICAgICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgaGFuZGxlICAqLwotICAgICAgICAgICAgICAgICAgICAgIChRbWZCdWZmZXJSZWFsICsgaSksICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvZiBsZWZ0L21vbm8gY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgIChRbWZCdWZmZXJJbWFnICsgaSksICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvZiBsZWZ0L21vbm8gY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgICByUW1mUmVhbCwgICAgICAgICAgICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvciByaWdodCBjaGFubmVsICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICByUW1mSW1hZyk7ICAgICAgICAgICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvciByaWdodCBjaGFubmVsICAgICAqLworICAgICAgICAgIEFwcGx5UHNTbG90KAorICAgICAgICAgICAgICBoX3BzX2QsICAgICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgaGFuZGxlICAqLworICAgICAgICAgICAgICAocExvd0JhbmRSZWFsICsgaSksIC8qIG9uZSB0aW1lc2xvdCBvZiBsZWZ0L21vbm8gY2hhbm5lbCAqLworICAgICAgICAgICAgICAocExvd0JhbmRJbWFnICsgaSksIC8qIG9uZSB0aW1lc2xvdCBvZiBsZWZ0L21vbm8gY2hhbm5lbCAqLworICAgICAgICAgICAgICByUW1mUmVhbCwgICAgICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvciByaWdodCBjaGFubmVsICAgICAqLworICAgICAgICAgICAgICByUW1mSW1hZywgICAgICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvciByaWdodCBjaGFubmVsICAgICAqLworICAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3YsCisgICAgICAgICAgICAgIChpIDwgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwKQorICAgICAgICAgICAgICAgICAgPyBzY2FsZUZhY3Rvckxvd0JhbmRfb3YKKyAgICAgICAgICAgICAgICAgIDogc2NhbGVGYWN0b3JMb3dCYW5kX25vX292LAorICAgICAgICAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kLCBzeW5RbWYtPmxzYiwgc3luUW1mLT51c2IpOworCisgICAgICAgICAgb3V0U2NhbGVmYWN0b3JMID0gb3V0U2NhbGVmYWN0b3JSID0gMTsgLyogcHNEaWZmU2NhbGUhIChNUEVHLVBTKSAqLwogICAgICAgICB9CiAKLQotICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQgPSAoaTwoNikpID8gc2NhbGVGYWN0b3JMb3dCYW5kX292IDogc2NhbGVGYWN0b3JMb3dCYW5kX25vX292OwotCi0KLSAgICAgICAgc2JyRGVjb2Rlcl9kcmNBcHBseVNsb3QgKCAvKiByaWdodCBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickRlY1JpZ2h0LT5zYnJEcmNDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJRbWZSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJRbWZJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luUW1mUmlnaHQtPm5vX2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaGlmdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBzYnJEZWNvZGVyX2RyY0FwcGx5U2xvdCgvKiByaWdodCBjaGFubmVsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRGVjUmlnaHQtPnNickRyY0NoYW5uZWwsIHJRbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByUW1mSW1hZywgaSwgc3luUW1mUmlnaHQtPm5vX2NvbCwgbWF4U2hpZnQpOwogCiAgICAgICAgIG91dFNjYWxlZmFjdG9yUiArPSBtYXhTaGlmdDsKIAotICAgICAgICBzYnJEZWNvZGVyX2RyY0FwcGx5U2xvdCAoIC8qIGxlZnQgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJEZWMtPnNickRyY0NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKFFtZkJ1ZmZlclJlYWwgKyBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooUW1mQnVmZmVySW1hZyArIGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luUW1mLT5ub19jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2hpZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgc2JyRGVjb2Rlcl9kcmNBcHBseVNsb3QoLyogbGVmdCBjaGFubmVsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRGVjLT5zYnJEcmNDaGFubmVsLCAqKHBMb3dCYW5kUmVhbCArIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBMb3dCYW5kSW1hZyArIGkpLCBpLCBzeW5RbWYtPm5vX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2hpZnQpOwogCiAgICAgICAgIG91dFNjYWxlZmFjdG9yTCArPSBtYXhTaGlmdDsKIAorICAgICAgICBpZiAoIShmbGFncyAmIFNCUkRFQ19TS0lQX1FNRl9TWU4pKSB7CisgICAgICAgICAgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdCgKKyAgICAgICAgICAgICAgc3luUW1mUmlnaHQsIHJRbWZSZWFsLCAvKiBRTUYgcmVhbCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgclFtZkltYWcsICAgICAgICAgICAgICAvKiBRTUYgaW1hZyBidWZmZXIgKi8KKyAgICAgICAgICAgICAgb3V0U2NhbGVmYWN0b3JMLCBvdXRTY2FsZWZhY3RvckwsCisgICAgICAgICAgICAgIHRpbWVPdXRSaWdodCArIChpICogc3luUW1mLT5ub19jaGFubmVscyAqIHN0cmlkZU91dCksIHN0cmlkZU91dCwKKyAgICAgICAgICAgICAgcFdvcmtCdWZmZXIpOwogCi0gICAgICAgIC8qIHNjYWxlIGZpbHRlciBzdGF0ZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgKi8KLSAgICAgICAgcW1mQ2hhbmdlT3V0U2NhbGVmYWN0b3IoIHN5blFtZiwgb3V0U2NhbGVmYWN0b3JMICk7Ci0gICAgICAgIHFtZkNoYW5nZU91dFNjYWxlZmFjdG9yKCBzeW5RbWZSaWdodCwgb3V0U2NhbGVmYWN0b3JSICk7Ci0KLSAgICAgICAgewotCi0gICAgICAgICAgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdCggc3luUW1mUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclFtZlJlYWwsICAgICAgICAgICAgICAgIC8qIFFNRiByZWFsIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJRbWZJbWFnLCAgICAgICAgICAgICAgICAvKiBRTUYgaW1hZyBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0UmlnaHQrKGkqc3luUW1mLT5ub19jaGFubmVscypzdHJpZGVPdXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlcik7Ci0KLSAgICAgICAgICBxbWZTeW50aGVzaXNGaWx0ZXJpbmdTbG90KCBzeW5RbWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooUW1mQnVmZmVyUmVhbCArIGkpLCAgICAgIC8qIFFNRiByZWFsIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKFFtZkJ1ZmZlckltYWcgKyBpKSwgICAgICAvKiBRTUYgaW1hZyBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0KyhpKnN5blFtZi0+bm9fY2hhbm5lbHMqc3RyaWRlT3V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIpOwotCisgICAgICAgICAgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdCgKKyAgICAgICAgICAgICAgc3luUW1mLCAqKHBMb3dCYW5kUmVhbCArIGkpLCAvKiBRTUYgcmVhbCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgKihwTG93QmFuZEltYWcgKyBpKSwgICAgICAgICAvKiBRTUYgaW1hZyBidWZmZXIgKi8KKyAgICAgICAgICAgICAgb3V0U2NhbGVmYWN0b3JSLCBvdXRTY2FsZWZhY3RvclIsCisgICAgICAgICAgICAgIHRpbWVPdXQgKyAoaSAqIHN5blFtZi0+bm9fY2hhbm5lbHMgKiBzdHJpZGVPdXQpLCBzdHJpZGVPdXQsCisgICAgICAgICAgICAgIHBXb3JrQnVmZmVyKTsKICAgICAgICAgfQogICAgICAgfSAvKiBub19jb2wgbG9vcCAgaSAgKi8KLQotICAgICAgLyogc2NhbGUgYmFjayAoNikgdGltZXNsb3RzIGxvb2sgYWhlYWQgZm9yIGh5YnJpZCBmaWx0ZXJiYW5rIHRvIG9yaWdpbmFsIHZhbHVlICovCi0gICAgICByZXNjYWxGaWx0ZXJCYW5rVmFsdWVzKCBoX3BzX2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5blFtZi0+bHNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luUW1mLT5ub19jb2wgKTsKLQotICAgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAyKig2NCkpOworI2lmIChRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyA8PSA2NCkKKyAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgMiAqIFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTKTsKKyNlbHNlCisgICAgICBDX0FBTExPQ19TVEFDS19FTkQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAyICogUU1GX01BWF9TWU5USEVTSVNfQkFORFMpOworI2VuZGlmCiAgICAgfQogICB9CiAKLSAgc2JyRGVjb2Rlcl9kcmNVcGRhdGVDaGFubmVsKCAmaFNickRlYy0+c2JyRHJjQ2hhbm5lbCApOwotCisgIHNickRlY29kZXJfZHJjVXBkYXRlQ2hhbm5lbCgmaFNickRlYy0+c2JyRHJjQ2hhbm5lbCk7CiAKICAgLyoKICAgICBVcGRhdGUgb3ZlcmxhcCBidWZmZXIKQEAgLTc0MiwxNTEgKzg2MiwxMjggQEAKICAgICB0aGUgc3RvcCBmcmVxdWVuY3kgcmFpc2VzLgogICAqLwogCi0gIGlmIChoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgPiAwKQotICB7Ci0gICAgaWYgKCEgKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikpIHsKLSAgICAgIGZvciAoIGk9MDsgaTxoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7IGkrKyApIHsKLSAgICAgICAgRkRLbWVtY3B5KFFtZkJ1ZmZlclJlYWxbaV0sIFFtZkJ1ZmZlclJlYWxbaStub0NvbHNdLCAoNjQpKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgICBGREttZW1jcHkoUW1mQnVmZmVySW1hZ1tpXSwgUW1mQnVmZmVySW1hZ1tpK25vQ29sc10sICg2NCkqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICBmb3IgKCBpPTA7IGk8aFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOyBpKysgKSB7Ci0gICAgICAgIEZES21lbWNweShRbWZCdWZmZXJSZWFsW2ldLCBRbWZCdWZmZXJSZWFsW2krbm9Db2xzXSwgKDY0KSpzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgIH0KKyAgaWYgKCEoZmxhZ3MgJiBTQlJERUNfU0tJUF9RTUZfU1lOKSkgeworICAgIHsKKyAgICAgIEZES19RbWZEb21haW5fU2F2ZU92ZXJsYXAoaFNickRlYy0+cW1mRG9tYWluSW5DaCwgMCk7CisgICAgICBGREtfQVNTRVJUKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcub3ZfbGJfc2NhbGUgPT0gc2F2ZUxiU2NhbGUpOworICAgIH0KICAgfQogCi0gIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLm92X2xiX3NjYWxlID0gc2F2ZUxiU2NhbGU7CisgIGhTYnJEZWMtPnNhdmVkU3RhdGVzID0gMDsKIAogICAvKiBTYXZlIGN1cnJlbnQgZnJhbWUgc3RhdHVzICovCiAgIGhQcmV2RnJhbWVEYXRhLT5mcmFtZUVycm9yRmxhZyA9IGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZzsKKyAgaFNickRlYy0+YXBwbHlTYnJQcm9jX29sZCA9IGFwcGx5UHJvY2Vzc2luZzsKIAotfSAvLyBzYnJfZGVjKCkKLQorfSAvKiBzYnJfZGVjKCkgKi8KIAogLyohCiAgIFxicmllZiAgICAgQ3JlYXRlcyBzYnIgZGVjb2RlciBzdHJ1Y3R1cmUKICAgXHJldHVybiAgICBlcnJvckNvZGUsIDAgaWYgc3VjY2Vzc2Z1bAogKi8KIFNCUl9FUlJPUgotY3JlYXRlU2JyRGVjIChTQlJfQ0hBTk5FTCAqIGhTYnJDaGFubmVsLAotICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICAgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLAotICAgICAgICAgICAgICBjb25zdCBpbnQgICAgIGRvd25zYW1wbGVGYWMsICAgICAgICAvKiE8IERvd25zYW1wbGluZyBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICBxbWZGbGFncywgICAgICAgICAgICAgLyohPCBmbGFncyAtPiAxOiBIUS9MUCBzZWxlY3RvciwgMjogQ0xERkIgKi8KLSAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICBmbGFncywKLSAgICAgICAgICAgICAgY29uc3QgaW50ICAgICBvdmVybGFwLCAKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICBjaGFuKSAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIGZvciB3aGljaCB0byBhc3NpZ24gYnVmZmVycyBldGMuICovCitjcmVhdGVTYnJEZWMoU0JSX0NIQU5ORUwgKmhTYnJDaGFubmVsLAorICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgICAgICAgICAgIFRSQU5TUE9TRVJfU0VUVElOR1MgKnBTZXR0aW5ncywKKyAgICAgICAgICAgICBjb25zdCBpbnQgZG93bnNhbXBsZUZhYywgLyohPCBEb3duc2FtcGxpbmcgZmFjdG9yICovCisgICAgICAgICAgICAgY29uc3QgVUlOVCBxbWZGbGFncywgLyohPCBmbGFncyAtPiAxOiBIUS9MUCBzZWxlY3RvciwgMjogQ0xERkIgKi8KKyAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBpbnQgb3ZlcmxhcCwKKyAgICAgICAgICAgICBpbnQgY2hhbiwgLyohPCBDaGFubmVsIGZvciB3aGljaCB0byBhc3NpZ24gYnVmZmVycyBldGMuICovCisgICAgICAgICAgICAgaW50IGNvZGVjRnJhbWVTaXplKQogCiB7CiAgIFNCUl9FUlJPUiBlcnIgPSBTQlJERUNfT0s7Ci0gIGludCB0aW1lU2xvdHMgPSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzOyAgIC8qIE51bWJlciBvZiBTQlIgc2xvdHMgcGVyIGZyYW1lICovCi0gIGludCBub0NvbHMgPSB0aW1lU2xvdHMgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXA7IC8qIE51bWJlciBvZiBRTUYgc2xvdHMgcGVyIGZyYW1lICovCisgIGludCB0aW1lU2xvdHMgPQorICAgICAgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90czsgLyogTnVtYmVyIG9mIFNCUiBzbG90cyBwZXIgZnJhbWUgKi8KKyAgaW50IG5vQ29scyA9CisgICAgICB0aW1lU2xvdHMgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXA7IC8qIE51bWJlciBvZiBRTUYgc2xvdHMgcGVyIGZyYW1lICovCiAgIEhBTkRMRV9TQlJfREVDIGhzID0gJihoU2JyQ2hhbm5lbC0+U2JyRGVjKTsKIAotICAvKiBJbml0aWFsaXplIHNjYWxlIGZhY3RvcnMgKi8KLSAgaHMtPnNiclNjYWxlRmFjdG9yLm92X2xiX3NjYWxlICA9IDA7Ci0gIGhzLT5zYnJTY2FsZUZhY3Rvci5vdl9oYl9zY2FsZSAgPSAwOwotICBocy0+c2JyU2NhbGVGYWN0b3IuaGJfc2NhbGUgICAgID0gMDsKKyNpZiAoU0JSREVDX01BWF9IQl9GQURFX0ZSQU1FUyA+IDApCisgIGhzLT5oaWdoQmFuZEZhZGVDbnQgPSBTQlJERUNfTUFYX0hCX0ZBREVfRlJBTUVTOwogCisjZW5kaWYKKyAgaHMtPnNjYWxlX2hiZSA9IDE1OworICBocy0+c2NhbGVfbGIgPSAxNTsKKyAgaHMtPnNjYWxlX292ID0gMTU7CisKKyAgaHMtPnByZXZfZnJhbWVfbFNiciA9IDA7CisgIGhzLT5wcmV2X2ZyYW1lX2hiZVNiciA9IDA7CisKKyAgaHMtPmNvZGVjRnJhbWVTaXplID0gY29kZWNGcmFtZVNpemU7CiAKICAgLyoKICAgICBjcmVhdGUgZW52ZWxvcGUgY2FsY3VsYXRvcgogICAqLwotICBlcnIgPSBjcmVhdGVTYnJFbnZlbG9wZUNhbGMgKCZocy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgIGVyciA9IGNyZWF0ZVNickVudmVsb3BlQ2FsYygmaHMtPlNickNhbGN1bGF0ZUVudmVsb3BlLCBoSGVhZGVyRGF0YSwgY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKICAgaWYgKGVyciAhPSBTQlJERUNfT0spIHsKICAgICByZXR1cm4gZXJyOwogICB9CiAKLSAgLyoKLSAgICBjcmVhdGUgUU1GIGZpbHRlciBiYW5rcwotICAqLwotICB7Ci0gICAgaW50IHFtZkVycjsKLSAgICAvKiBBZGFwdGVkIFFNRiBhbmFseXNpcyBwb3N0LXR3aWRkbGVzIGZvciBkb3duLXNhbXBsZWQgSFEgU0JSICovCi0gICAgY29uc3QgVUlOVCBkb3duU2FtcGxlZEZsYWcgPSAoZmxhZ3MgJiBTQlJERUNfRE9XTlNBTVBMRSkgPyBRTUZfRkxBR19ET1dOU0FNUExFRCA6IDA7Ci0KLSAgICBxbWZFcnIgPSBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rICgKLSAgICAgICAgICAgICAgICAgICAgJmhzLT5BbmFseXNpc2NRTUYsCi0gICAgICAgICAgICAgICAgICAgICBocy0+YW5hUW1mU3RhdGVzLAotICAgICAgICAgICAgICAgICAgICAgbm9Db2xzLAotICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kLAotICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5oaWdoU3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAocW1mRmxhZ3MgJiAoflFNRl9GTEFHX0tFRVBfU1RBVEVTKSkgfCBkb3duU2FtcGxlZEZsYWcKLSAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgaWYgKHFtZkVyciAhPSAwKSB7Ci0gICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKLSAgICB9Ci0gIH0KLSAgaWYgKGhzLT5wU3luUW1mU3RhdGVzID09IE5VTEwpIHsKLSAgICBocy0+cFN5blFtZlN0YXRlcyA9IEdldFJhbV9zYnJfUW1mU3RhdGVzU3ludGhlc2lzKGNoYW4pOwotICAgIGlmIChocy0+cFN5blFtZlN0YXRlcyA9PSBOVUxMKQotICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOwotICB9Ci0KLSAgewotICAgIGludCBxbWZFcnI7Ci0KLSAgICBxbWZFcnIgPSBxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuayAoCi0gICAgICAgICAgICZocy0+U3ludGhlc2lzUU1GLAotICAgICAgICAgICAgaHMtPnBTeW5RbWZTdGF0ZXMsCi0gICAgICAgICAgICBub0NvbHMsCi0gICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmQsCi0gICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmhpZ2hTdWJiYW5kLAotICAgICAgICAgICAgKDY0KSAvIGRvd25zYW1wbGVGYWMsCi0gICAgICAgICAgICBxbWZGbGFncyAmICh+UU1GX0ZMQUdfS0VFUF9TVEFURVMpCi0gICAgICAgICAgICApOwotCi0gICAgaWYgKHFtZkVyciAhPSAwKSB7Ci0gICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKLSAgICB9Ci0gIH0KLSAgaW5pdFNiclByZXZGcmFtZURhdGEgKCZoU2JyQ2hhbm5lbC0+cHJldkZyYW1lRGF0YSwgdGltZVNsb3RzKTsKKyAgaW5pdFNiclByZXZGcmFtZURhdGEoJmhTYnJDaGFubmVsLT5wcmV2RnJhbWVEYXRhLCB0aW1lU2xvdHMpOwogCiAgIC8qCiAgICAgY3JlYXRlIHRyYW5zcG9zZXIKICAgKi8KLSAgZXJyID0gY3JlYXRlTHBwVHJhbnNwb3NlciAoJmhzLT5McHBUcmFucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEudl9rX21hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5udW1NYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzLT5TeW50aGVzaXNRTUYudXNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzLT5BbmFseXNpc2NRTUYubm9fY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVOb2lzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uTmZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+c2JyUHJvY1NtcGxSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGFwICk7CisgIGVyciA9IGNyZWF0ZUxwcFRyYW5zcG9zZXIoCisgICAgICAmaHMtPkxwcFRyYW5zLCBwU2V0dGluZ3MsIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZCwKKyAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEudl9rX21hc3RlciwgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5udW1NYXN0ZXIsCisgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmhpZ2hTdWJiYW5kLCB0aW1lU2xvdHMsIG5vQ29scywKKyAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZU5vaXNlLAorICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uTmZiLCBoSGVhZGVyRGF0YS0+c2JyUHJvY1NtcGxSYXRlLCBjaGFuLAorICAgICAgb3ZlcmxhcCk7CiAgIGlmIChlcnIgIT0gU0JSREVDX09LKSB7CiAgICAgcmV0dXJuIGVycjsKICAgfQogCi0gIC8qIFRoZSBDTERGQiBkb2VzIG5vdCBoYXZlIG92ZXJsYXAgKi8KLSAgaWYgKChxbWZGbGFncyAmIFFNRl9GTEFHX0NMREZCKSA9PSAwKSB7Ci0gICAgaWYgKGhzLT5wU2JyT3ZlcmxhcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICBocy0+cFNick92ZXJsYXBCdWZmZXIgPSBHZXRSYW1fc2JyX092ZXJsYXBCdWZmZXIoY2hhbik7Ci0gICAgICBpZiAoaHMtPnBTYnJPdmVybGFwQnVmZmVyID09IE5VTEwpICB7Ci0gICAgICAgIHJldHVybiBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogQ2xlYXIgb3ZlcmxhcCBidWZmZXIgKi8KLSAgICAgIEZES21lbWNsZWFyKCBocy0+cFNick92ZXJsYXBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIDIgKiAoNikgKiAoNjQpCi0gICAgICAgICAgICAgICAgICk7CisgIGlmIChmbGFncyAmIFNCUkRFQ19VU0FDX0hBUk1PTklDU0JSKSB7CisgICAgaW50IG5vQ2hhbm5lbHMsIGJTYnI0MSA9IGZsYWdzICYgU0JSREVDX1FVQURfUkFURSA/IDEgOiAwOworCisgICAgbm9DaGFubmVscyA9CisgICAgICAgIFFNRl9TWU5USF9DSEFOTkVMUyAvCisgICAgICAgICgoYlNicjQxICsgMSkgKiAyKTsgLyogMzIgZm9yICgzMjo2NCBhbmQgMjQ6NjQpIGFuZCAxNiBmb3IgMTY6NjQgKi8KKworICAgIC8qIHNoYXJlZCBtZW1vcnkgYmV0d2VlbiBoYmVMaWdodFRpbWVEZWxheUJ1ZmZlciBhbmQgaFFtZkhCRVNsb3RzUmVhbCBpZgorICAgICAqIFNCUkRFQ19IQkVfRU5BQkxFICovCisgICAgaFNickNoYW5uZWwtPlNickRlYy50bXBfbWVtb3J5ID0gKEZJWFBfREJMICoqKWZka0NhbGxvY01hdHJpeDJEX2FsaWduZWQoCisgICAgICAgIG5vQ29scywgbm9DaGFubmVscywgc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgaWYgKGhTYnJDaGFubmVsLT5TYnJEZWMudG1wX21lbW9yeSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgaFNickNoYW5uZWwtPlNickRlYy5oUW1mSEJFU2xvdHNSZWFsID0gaFNickNoYW5uZWwtPlNickRlYy50bXBfbWVtb3J5OworICAgIGhTYnJDaGFubmVsLT5TYnJEZWMuaFFtZkhCRVNsb3RzSW1hZyA9CisgICAgICAgIChGSVhQX0RCTCAqKilmZGtDYWxsb2NNYXRyaXgyRF9hbGlnbmVkKG5vQ29scywgbm9DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgaWYgKGhTYnJDaGFubmVsLT5TYnJEZWMuaFFtZkhCRVNsb3RzSW1hZyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgLyogYnVmZmVycyBjb250YWluaW5nIHVubW9kaWZpZWQgcW1mIGRhdGE7IHJlcXVpcmVkIHdoZW4gc3dpdGNoaW5nIGZyb20KKyAgICAgKiBsZWdhY3kgU0JSIHRvIEhCRSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBidWZmZXIgY2FuIGJlIHVzZWQgYXMgTFBDRmlsdGVyc3RhdGVzIGJ1ZmZlciBiZWNhdXNlIGxlZ2FjeSBTQlIgbmVlZHMKKyAgICAgKiBleGFjdGx5IHRoZXNlIHZhbHVlcyBmb3IgTFBDIGZpbHRlcmluZyAqLworICAgIGhTYnJDaGFubmVsLT5TYnJEZWMuY29kZWNRTUZCdWZmZXJSZWFsID0KKyAgICAgICAgKEZJWFBfREJMICoqKWZka0NhbGxvY01hdHJpeDJEX2FsaWduZWQobm9Db2xzLCBub0NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBpZiAoaFNickNoYW5uZWwtPlNickRlYy5jb2RlY1FNRkJ1ZmZlclJlYWwgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKworICAgIGhTYnJDaGFubmVsLT5TYnJEZWMuY29kZWNRTUZCdWZmZXJJbWFnID0KKyAgICAgICAgKEZJWFBfREJMICoqKWZka0NhbGxvY01hdHJpeDJEX2FsaWduZWQobm9Db2xzLCBub0NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBpZiAoaFNickNoYW5uZWwtPlNickRlYy5jb2RlY1FNRkJ1ZmZlckltYWcgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKworICAgIGVyciA9IFFtZlRyYW5zcG9zZXJDcmVhdGUoJmhzLT5oSEJFLCBjb2RlY0ZyYW1lU2l6ZSwgMCwgYlNicjQxKTsKKyAgICBpZiAoZXJyICE9IFNCUkRFQ19PSykgeworICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAgIH0KIAotICAvKiBDbGVhciBpbnB1dCBkZWxheSBsaW5lICovCi0gIEZES21lbWNsZWFyKGhzLT5jb3JlRGVsYXlCdWYsICg5Nikqc2l6ZW9mKElOVF9QQ00pKTsKLQotICAvKiBhc3NpZ24gcW1mIHRpbWUgc2xvdHMgKi8KLSAgYXNzaWduVGltZVNsb3RzKCAmaFNickNoYW5uZWwtPlNickRlYywgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyAqIGhIZWFkZXJEYXRhLT50aW1lU3RlcCwgcW1mRmxhZ3MgJiBRTUZfRkxBR19MUCk7Ci0KICAgcmV0dXJuIGVycjsKIH0KIApAQCAtODk0LDY1ICs5OTEsODggQEAKICAgXGJyaWVmICAgICBEZWxldGUgc2JyIGRlY29kZXIgc3RydWN0dXJlCiAgIFxyZXR1cm4gICAgZXJyb3JDb2RlLCAwIGlmIHN1Y2Nlc3NmdWwKICovCi1pbnQKLWRlbGV0ZVNickRlYyAoU0JSX0NIQU5ORUwgKiBoU2JyQ2hhbm5lbCkKLXsKK2ludCBkZWxldGVTYnJEZWMoU0JSX0NIQU5ORUwgKmhTYnJDaGFubmVsKSB7CiAgIEhBTkRMRV9TQlJfREVDIGhzID0gJmhTYnJDaGFubmVsLT5TYnJEZWM7CiAKLSAgZGVsZXRlU2JyRW52ZWxvcGVDYWxjICgmaHMtPlNickNhbGN1bGF0ZUVudmVsb3BlKTsKKyAgZGVsZXRlU2JyRW52ZWxvcGVDYWxjKCZocy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUpOwogCi0gIC8qIGRlbGV0ZSBRTUYgZmlsdGVyIHN0YXRlcyAqLwotICBpZiAoaHMtPnBTeW5RbWZTdGF0ZXMgIT0gTlVMTCkgewotICAgIEZyZWVSYW1fc2JyX1FtZlN0YXRlc1N5bnRoZXNpcygmaHMtPnBTeW5RbWZTdGF0ZXMpOworICBpZiAoaHMtPnRtcF9tZW1vcnkgIT0gTlVMTCkgeworICAgIEZES19GUkVFX01FTU9SWV8yRF9BTElHTkVEKGhzLT50bXBfbWVtb3J5KTsKICAgfQogCisgIC8qIG1vZGlmeSBoZXJlICovCisgIEZES19GUkVFX01FTU9SWV8yRF9BTElHTkVEKGhzLT5oUW1mSEJFU2xvdHNJbWFnKTsKIAotICBpZiAoaHMtPnBTYnJPdmVybGFwQnVmZmVyICE9IE5VTEwpIHsKLSAgICBGcmVlUmFtX3Nicl9PdmVybGFwQnVmZmVyKCZocy0+cFNick92ZXJsYXBCdWZmZXIpOworICBpZiAoaHMtPmhIQkUgIT0gTlVMTCkgUW1mVHJhbnNwb3NlckNsb3NlKGhzLT5oSEJFKTsKKworICBpZiAoaHMtPmNvZGVjUU1GQnVmZmVyUmVhbCAhPSBOVUxMKSB7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEX0FMSUdORUQoaHMtPmNvZGVjUU1GQnVmZmVyUmVhbCk7CisgIH0KKworICBpZiAoaHMtPmNvZGVjUU1GQnVmZmVySW1hZyAhPSBOVUxMKSB7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEX0FMSUdORUQoaHMtPmNvZGVjUU1GQnVmZmVySW1hZyk7CiAgIH0KIAogICByZXR1cm4gMDsKIH0KIAotCiAvKiEKICAgXGJyaWVmICAgICByZXNldHMgc2JyIGRlY29kZXIgc3RydWN0dXJlCiAgIFxyZXR1cm4gICAgZXJyb3JDb2RlLCAwIGlmIHN1Y2Nlc3NmdWwKICovCiBTQlJfRVJST1IKLXJlc2V0U2JyRGVjIChIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLAotICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaFByZXZGcmFtZURhdGEsCi0gICAgICAgICAgICAgY29uc3QgaW50IHVzZUxQLAotICAgICAgICAgICAgIGNvbnN0IGludCBkb3duc2FtcGxlRmFjCi0gICAgICAgICAgICAgKQoteworcmVzZXRTYnJEZWMoSEFORExFX1NCUl9ERUMgaFNickRlYywgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhQcmV2RnJhbWVEYXRhLCBjb25zdCBpbnQgZG93bnNhbXBsZUZhYywKKyAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhKSB7CiAgIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKLSAgCi0gIGludCBvbGRfbHNiID0gaFNickRlYy0+U3ludGhlc2lzUU1GLmxzYjsKKyAgaW50IGk7CisgIEZJWFBfREJMICpwTG93QmFuZFJlYWxbMTI4XTsKKyAgRklYUF9EQkwgKnBMb3dCYW5kSW1hZ1sxMjhdOworICBpbnQgdXNlTFAgPSBmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVI7CisKKyAgaW50IG9sZF9sc2IgPSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5mYi5sc2I7CisgIGludCBvbGRfdXNiID0gaFNickRlYy0+cW1mRG9tYWluSW5DaC0+ZmIudXNiOwogICBpbnQgbmV3X2xzYiA9IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZDsKKyAgLyogaW50IG5ld191c2IgPSBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmhpZ2hTdWJiYW5kOyAqLwogICBpbnQgbCwgc3RhcnRCYW5kLCBzdG9wQmFuZCwgc3RhcnRTbG90LCBzaXplOwogCi0gIGludCBzb3VyY2Vfc2NhbGUsIHRhcmdldF9zY2FsZSwgZGVsdGFfc2NhbGUsIHRhcmdldF9sc2IsIHRhcmdldF91c2IsIHJlc2VydmU7Ci0gIEZJWFBfREJMIG1heFZhbDsKKyAgRklYUF9EQkwgKipPdmVybGFwQnVmZmVyUmVhbCA9IGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmhRbWZTbG90c1JlYWw7CisgIEZJWFBfREJMICoqT3ZlcmxhcEJ1ZmZlckltYWcgPSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5oUW1mU2xvdHNJbWFnOwogCi0gIC8qIG92ZXJsYXBCdWZmZXIgcG9pbnQgdG8gZmlyc3QgKDYpIHNsb3RzICovCi0gIEZJWFBfREJMICAqKk92ZXJsYXBCdWZmZXJSZWFsID0gaFNickRlYy0+UW1mQnVmZmVyUmVhbDsKLSAgRklYUF9EQkwgICoqT3ZlcmxhcEJ1ZmZlckltYWcgPSBoU2JyRGVjLT5RbWZCdWZmZXJJbWFnOworICAvKiBpbiBjYXNlIHRoZSBwcmV2aW91cyBmcmFtZSB3YXMgbm90IGFjdGl2ZSBpbiB0ZXJtcyBvZiBTQlIgcHJvY2Vzc2luZywgdGhlCisgICAgIGZ1bGwgYmFuZCBmcm9tIDAgdG8gbm9fY2hhbm5lbHMgd2FzIHJlc2NhbGVkIGFuZCBub3Qgb3ZlcndyaXR0ZW4uIFRoYXRzIHdoeQorICAgICB0aGUgc2NhbGluZyBmYWN0b3IgbGJfc2NhbGUgY2FuIGJlIHNlZW4gYXMgYXNzaWduZWQgdG8gYWxsIGJhbmRzIGZyb20gMCB0bworICAgICBub19jaGFubmVscyBpbiB0aGUgcHJldmlvdXMgZnJhbWUuIFRoZSBzYW1lIHN0YXRlcyBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgaWYKKyAgICAgdGhlIGN1cnJlbnQgZnJhbWUgaXMgbm90IGFjdGl2ZSBpbiB0ZXJtcyBvZiBTQlIgcHJvY2Vzc2luZworICAqLworICBpbnQgYXBwbHlTYnJQcm9jID0gKGhIZWFkZXJEYXRhLT5zeW5jU3RhdGUgPT0gU0JSX0FDVElWRSB8fAorICAgICAgICAgICAgICAgICAgICAgIChoSGVhZGVyRGF0YS0+ZnJhbWVFcnJvckZsYWcgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+c3luY1N0YXRlID09IFNCUl9IRUFERVIpKTsKKyAgaW50IGFwcGx5U2JyUHJvY19vbGQgPSBoU2JyRGVjLT5hcHBseVNiclByb2Nfb2xkOwogCi0gIC8qIGFzc2lnbiBxbWYgdGltZSBzbG90cyAqLwotICBhc3NpZ25UaW1lU2xvdHMoIGhTYnJEZWMsIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXAsIHVzZUxQKTsKKyAgaWYgKCFhcHBseVNiclByb2MpIHsKKyAgICBuZXdfbHNiID0gKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmZiKS5ub19jaGFubmVsczsKKyAgfQorICBpZiAoIWFwcGx5U2JyUHJvY19vbGQpIHsKKyAgICBvbGRfbHNiID0gKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmZiKS5ub19jaGFubmVsczsKKyAgICBvbGRfdXNiID0gb2xkX2xzYjsKKyAgfQogCisgIHJlc2V0U2JyRW52ZWxvcGVDYWxjKCZoU2JyRGVjLT5TYnJDYWxjdWxhdGVFbnZlbG9wZSk7CiAKLQotICByZXNldFNickVudmVsb3BlQ2FsYyAoJmhTYnJEZWMtPlNickNhbGN1bGF0ZUVudmVsb3BlKTsKLQotICBoU2JyRGVjLT5TeW50aGVzaXNRTUYubHNiID0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kOwotICBoU2JyRGVjLT5TeW50aGVzaXNRTUYudXNiID0gZml4TWluKChJTlQpaFNickRlYy0+U3ludGhlc2lzUU1GLm5vX2NoYW5uZWxzLCAoSU5UKWhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQpOwotCi0gIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5sc2IgPSBoU2JyRGVjLT5TeW50aGVzaXNRTUYubHNiOwotICBoU2JyRGVjLT5BbmFseXNpc2NRTUYudXNiID0gaFNickRlYy0+U3ludGhlc2lzUU1GLnVzYjsKLQorICAvKiBDaGFuZ2UgbHNiIGFuZCB1c2IgKi8KKyAgLyogU3ludGhlc2lzICovCisgIEZES19BU1NFUlQoaFNickRlYy0+cW1mRG9tYWluT3V0Q2ggIT0gTlVMTCk7CisgIGhTYnJEZWMtPnFtZkRvbWFpbk91dENoLT5mYi5sc2IgPQorICAgICAgZml4TWluKChJTlQpaFNickRlYy0+cW1mRG9tYWluT3V0Q2gtPmZiLm5vX2NoYW5uZWxzLAorICAgICAgICAgICAgIChJTlQpaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kKTsKKyAgaFNickRlYy0+cW1mRG9tYWluT3V0Q2gtPmZiLnVzYiA9CisgICAgICBmaXhNaW4oKElOVCloU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIubm9fY2hhbm5lbHMsCisgICAgICAgICAgICAgKElOVCloSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmhpZ2hTdWJiYW5kKTsKKyAgLyogQW5hbHlzaXMgKi8KKyAgRkRLX0FTU0VSVChoU2JyRGVjLT5xbWZEb21haW5JbkNoICE9IE5VTEwpOworICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5mYi5sc2IgPSBoU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIubHNiOworICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5mYi51c2IgPSBoU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIudXNiOwogCiAgIC8qCiAgICAgVGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBvZiBzcGVjdHJhbCBkYXRhIGluIHRoZSBvdmVybGFwIGJ1ZmZlcgpAQCAtOTY0LDEzNSArMTA4NCwzOTcgQEAKICAgICAgICBtdXN0IGJlIGNsZWFyZWQgYmVjYXVzZSB0aGUgd2hpdGVuaW5nIHdvdWxkIGJlIGFmZmVjdGVkCiAgICovCiAgIHN0YXJ0QmFuZCA9IG9sZF9sc2I7Ci0gIHN0b3BCYW5kICA9IG5ld19sc2I7Ci0gIHN0YXJ0U2xvdCA9IGhIZWFkZXJEYXRhLT50aW1lU3RlcCAqIChoUHJldkZyYW1lRGF0YS0+c3RvcFBvcyAtIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMpOwotICBzaXplICAgICAgPSBmaXhNYXgoMCxzdG9wQmFuZC1zdGFydEJhbmQpOworICBzdG9wQmFuZCA9IG5ld19sc2I7CisgIHN0YXJ0U2xvdCA9IGZNYXgoMCwgaEhlYWRlckRhdGEtPnRpbWVTdGVwICogKGhQcmV2RnJhbWVEYXRhLT5zdG9wUG9zIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cykpOworICBzaXplID0gZk1heCgwLCBzdG9wQmFuZCAtIHN0YXJ0QmFuZCk7CiAKLSAgLyoga2VlcCBhbHJlYWR5IGFkanVzdGVkIGRhdGEgaW4gdGhlIHgtb3Zlci1hcmVhICovCi0gIGlmICghdXNlTFApIHsKLSAgICBmb3IgKGw9c3RhcnRTbG90OyBsPGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsgbCsrKSB7Ci0gICAgICBGREttZW1jbGVhcigmT3ZlcmxhcEJ1ZmZlclJlYWxbbF1bc3RhcnRCYW5kXSwgc2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgIEZES21lbWNsZWFyKCZPdmVybGFwQnVmZmVySW1hZ1tsXVtzdGFydEJhbmRdLCBzaXplKnNpemVvZihGSVhQX0RCTCkpOworICAvKiBpbiBjYXNlIG9mIFVTQUMgd2UgZG9uJ3Qgd2FudCB0byB6ZXJvIG91dCB0aGUgbWVtb3J5LCBhcyB0aGlzIGNhbiBsZWFkIHRvCisgICAgIGhvbGVzIGluIHRoZSBzcGVjdHJ1bTsgZml4IHNoYWxsIG9ubHkgYmUgYXBwbGllZCBmb3IgVVNBQyBub3QgZm9yIE1QRUctNAorICAgICBTQlIsIGluIHRoaXMgY2FzZSBzZXR0aW5nIHplcm8gcmVtYWlucyAgICAgICAgICovCisgIGlmICghKGZsYWdzICYgU0JSREVDX1NZTlRBWF9VU0FDKSkgeworICAgIC8qIGtlZXAgYWxyZWFkeSBhZGp1c3RlZCBkYXRhIGluIHRoZSB4LW92ZXItYXJlYSAqLworICAgIGlmICghdXNlTFApIHsKKyAgICAgIGZvciAobCA9IHN0YXJ0U2xvdDsgbCA8IGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsgbCsrKSB7CisgICAgICAgIEZES21lbWNsZWFyKCZPdmVybGFwQnVmZmVyUmVhbFtsXVtzdGFydEJhbmRdLCBzaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNsZWFyKCZPdmVybGFwQnVmZmVySW1hZ1tsXVtzdGFydEJhbmRdLCBzaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAobCA9IHN0YXJ0U2xvdDsgbCA8IGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsgbCsrKSB7CisgICAgICAgIEZES21lbWNsZWFyKCZPdmVybGFwQnVmZmVyUmVhbFtsXVtzdGFydEJhbmRdLCBzaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICB9CiAgICAgfQotICB9IGVsc2UKLSAgZm9yIChsPXN0YXJ0U2xvdDsgbDxoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgOyBsKyspIHsKLSAgICBGREttZW1jbGVhcigmT3ZlcmxhcEJ1ZmZlclJlYWxbbF1bc3RhcnRCYW5kXSwgc2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKLSAgfQogCi0KLSAgLyoKKyAgICAvKgogICAgIHJlc2V0IExQQyBmaWx0ZXIgc3RhdGVzCi0gICovCi0gIHN0YXJ0QmFuZCA9IGZpeE1pbihvbGRfbHNiLG5ld19sc2IpOwotICBzdG9wQmFuZCAgPSBmaXhNYXgob2xkX2xzYixuZXdfbHNiKTsKLSAgc2l6ZSAgICAgID0gZml4TWF4KDAsc3RvcEJhbmQtc3RhcnRCYW5kKTsKKyAgICAqLworICAgIHN0YXJ0QmFuZCA9IGZpeE1pbihvbGRfbHNiLCBuZXdfbHNiKTsKKyAgICBzdG9wQmFuZCA9IGZpeE1heChvbGRfbHNiLCBuZXdfbHNiKTsKKyAgICBzaXplID0gZml4TWF4KDAsIHN0b3BCYW5kIC0gc3RhcnRCYW5kKTsKIAotICBGREttZW1jbGVhcigmaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbFswXVtzdGFydEJhbmRdLCBzaXplKnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1jbGVhcigmaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbFsxXVtzdGFydEJhbmRdLCBzaXplKnNpemVvZihGSVhQX0RCTCkpOwotICBpZiAoIXVzZUxQKSB7Ci0gICAgRkRLbWVtY2xlYXIoJmhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc0ltYWdbMF1bc3RhcnRCYW5kXSwgc2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKLSAgICBGREttZW1jbGVhcigmaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ1sxXVtzdGFydEJhbmRdLCBzaXplKnNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNsZWFyKCZoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsTGVnU0JSWzBdW3N0YXJ0QmFuZF0sCisgICAgICAgICAgICAgICAgc2l6ZSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNsZWFyKCZoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsTGVnU0JSWzFdW3N0YXJ0QmFuZF0sCisgICAgICAgICAgICAgICAgc2l6ZSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIGlmICghdXNlTFApIHsKKyAgICAgIEZES21lbWNsZWFyKCZoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnTGVnU0JSWzBdW3N0YXJ0QmFuZF0sCisgICAgICAgICAgICAgICAgICBzaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jbGVhcigmaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ0xlZ1NCUlsxXVtzdGFydEJhbmRdLAorICAgICAgICAgICAgICAgICAgc2l6ZSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIH0KICAgfQogCisgIGlmIChzdGFydFNsb3QgIT0gMCkgeworICAgIGludCBzb3VyY2VfZXhwLCB0YXJnZXRfZXhwLCBkZWx0YV9leHAsIHRhcmdldF9sc2IsIHRhcmdldF91c2IsIHJlc2VydmU7CisgICAgRklYUF9EQkwgbWF4VmFsOwogCi0gIC8qCi0gICAgUmVzY2FsZSBhbHJlYWR5IHByb2Nlc3NlZCBzcGVjdHJhbCBkYXRhIGJldHdlZW4gb2xkIGFuZCBuZXcgeC1vdmVyIGZyZXF1ZW5jeS4KLSAgICBUaGlzIG11c3QgYmUgZG9uZSBiZWNhdXNlIG9mIHRoZSBzZXBhcmF0ZSBzY2FsZWZhY3RvcnMgZm9yIGxvd2JhbmQgYW5kIGhpZ2hiYW5kLgotICAqLwotICBzdGFydEJhbmQgPSBmaXhNaW4ob2xkX2xzYixuZXdfbHNiKTsKLSAgc3RvcEJhbmQgPSAgZml4TWF4KG9sZF9sc2IsbmV3X2xzYik7CisgICAgLyoKKyAgICBSZXNjYWxlIGFscmVhZHkgcHJvY2Vzc2VkIHNwZWN0cmFsIGRhdGEgYmV0d2VlbiBvbGQgYW5kIG5ldyB4LW92ZXIKKyAgICBmcmVxdWVuY3kuIFRoaXMgbXVzdCBiZSBkb25lIGJlY2F1c2Ugb2YgdGhlIHNlcGFyYXRlIHNjYWxlZmFjdG9ycyBmb3IKKyAgICBsb3diYW5kIGFuZCBoaWdoYmFuZC4KKyAgICAqLwogCi0gIGlmIChuZXdfbHNiID4gb2xkX2xzYikgewotICAgIC8qIFRoZSB4LW92ZXItYXJlYSB3YXMgcGFydCBvZiB0aGUgaGlnaGJhbmQgYmVmb3JlIGFuZCB3aWxsIG5vdyBiZWxvbmcgdG8gdGhlIGxvd2JhbmQgKi8KLSAgICBzb3VyY2Vfc2NhbGUgPSBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5vdl9oYl9zY2FsZTsKLSAgICB0YXJnZXRfc2NhbGUgPSBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5vdl9sYl9zY2FsZTsKLSAgICB0YXJnZXRfbHNiICAgPSAwOwotICAgIHRhcmdldF91c2IgICA9IG9sZF9sc2I7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogVGhlIHgtb3Zlci1hcmVhIHdhcyBwYXJ0IG9mIHRoZSBsb3diYW5kIGJlZm9yZSBhbmQgd2lsbCBub3cgYmVsb25nIHRvIHRoZSBoaWdoYmFuZCAqLwotICAgIHNvdXJjZV9zY2FsZSA9IGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLm92X2xiX3NjYWxlOwotICAgIHRhcmdldF9zY2FsZSA9IGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLm92X2hiX3NjYWxlOwotICAgIC8qIGpkcjogVGhlIHZhbHVlcyBvbGRfbHNiIGFuZCBvbGRfdXNiIG1pZ2h0IGJlIHdyb25nIGJlY2F1c2UgdGhlIHByZXZpb3VzIGZyYW1lIG1pZ2h0IGhhdmUgYmVlbiAidXBzYW1saW5nIi4gKi8KLSAgICB0YXJnZXRfbHNiICAgPSBoU2JyRGVjLT5TeW50aGVzaXNRTUYubHNiOwotICAgIHRhcmdldF91c2IgICA9IGhTYnJEZWMtPlN5bnRoZXNpc1FNRi51c2I7Ci0gIH0KLQotICAvKiBTaGlmdCBsZWZ0IGFsbCBzYW1wbGVzIG9mIHRoZSB4LW92ZXItYXJlYSBhcyBtdWNoIGFzIHBvc3NpYmxlCi0gICAgIEFuIHVubmVjZXNzYXJ5IGNvYXJzZSBzY2FsZSBjb3VsZCBjYXVzZSBvdl9sYl9zY2FsZSBvciBvdl9oYl9zY2FsZSB0byBiZQotICAgICBhZGFwdGVkIGFuZCB0aGUgYWNjdXJhY3kgaW4gdGhlIG5leHQgZnJhbWUgd291bGQgc2VyaW91c2x5IHN1ZmZlciEgKi8KLQotICBtYXhWYWwgPSBtYXhTdWJiYW5kU2FtcGxlKCBPdmVybGFwQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBPdmVybGFwQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTbG90KTsKLQotICByZXNlcnZlID0gQ250TGVhZGluZ1plcm9zKG1heFZhbCktMTsKLSAgcmVzZXJ2ZSA9IGZpeE1pbihyZXNlcnZlLERGUkFDVF9CSVRTLTEtc291cmNlX3NjYWxlKTsKLQotICByZXNjYWxlU3ViYmFuZFNhbXBsZXMoIE92ZXJsYXBCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VMUCkgPyBOVUxMIDogT3ZlcmxhcEJ1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmUpOwotICBzb3VyY2Vfc2NhbGUgKz0gcmVzZXJ2ZTsKLQotICBkZWx0YV9zY2FsZSA9IHRhcmdldF9zY2FsZSAtIHNvdXJjZV9zY2FsZTsKLQotICBpZiAoZGVsdGFfc2NhbGUgPiAwKSB7IC8qIHgtb3Zlci1hcmVhIGlzIGRvbWluYW50ICovCi0gICAgZGVsdGFfc2NhbGUgPSAtZGVsdGFfc2NhbGU7Ci0gICAgc3RhcnRCYW5kID0gdGFyZ2V0X2xzYjsKLSAgICBzdG9wQmFuZCA9IHRhcmdldF91c2I7CisgICAgLyogV2UgaGF2ZSBmb3VyIHJlbGV2YW50IHRyYW5zaXRpb25zIHRvIGNvdmVyOgorICAgIDEuIG9sZF91c2IgaXMgbG93ZXIgdGhhbiBuZXdfbHNiOyBvbGQgU0JSIGFyZWEgaXMgY29tcGxldGVseSBiZWxvdyBuZXcgU0JSCisgICAgYXJlYS4KKyAgICAgICAtPiBlbnRpcmUgb2xkIGFyZWEgd2FzIGhpZ2hiYW5kIGFuZCBiZWxvbmdzIHRvIGxvd2JhbmQgbm93CisgICAgICAgICAgYW5kIGhhcyB0byBiZSByZXNjYWxlZC4KKyAgICAyLiBvbGRfbHNiIGlzIGhpZ2hlciB0aGFuIG5ld191c2I7IG5ldyBTQlIgYXJlYSBpcyBjb21wbGV0ZWx5IGJlbG93IG9sZCBTQlIKKyAgICBhcmVhLgorICAgICAgIC0+IG9sZCBhcmVhIGJldHdlZW4gbmV3X2xzYiBhbmQgb2xkX2xzYiB3YXMgbG93YmFuZCBhbmQgYmVsb25ncyB0bworICAgIGhpZ2hiYW5kIG5vdyBhbmQgaGFzIHRvIGJlIHJlc2NhbGVkIHRvIG1hdGNoIG5ldyBoaWdoYmFuZCBzY2FsZS4KKyAgICAzLiBvbGRfbHNiIGlzIGxvd2VyIGFuZCBvbGRfdXNiIGlzIGhpZ2hlciB0aGFuIG5ld19sc2I7IG9sZCBhbmQgbmV3IFNCUgorICAgIGFyZWFzIG92ZXJsYXAuCisgICAgICAgLT4gb2xkIGFyZWEgYmV0d2VlbiBvbGRfbHNiIGFuZCBuZXdfbHNiIHdhcyBoaWdoYmFuZCBhbmQgYmVsb25ncyB0bworICAgIGxvd2JhbmQgbm93IGFuZCBoYXMgdG8gYmUgcmVzY2FsZWQgdG8gbWF0Y2ggbmV3IGxvd2JhbmQgc2NhbGUuCisgICAgNC4gbmV3X2xzYiBpcyBsb3dlciBhbmQgbmV3X3VzYl9pcyBoaWdoZXIgdGhhbiBvbGRfbHNiOyBvbGQgYW5kIG5ldyBTQlIKKyAgICBhcmVhcyBvdmVybGFwLgorICAgICAgIC0+IG9sZCBhcmVhIGJldHdlZW4gbmV3X2xzYiBhbmQgb2xkX3VzYiB3YXMgbG93YmFuZCBhbmQgYmVsb25ncyB0bworICAgIGhpZ2hiYW5kIG5vdyBhbmQgaGFzIHRvIGJlIHJlc2NhbGVkIHRvIG1hdGNoIG5ldyBoaWdoYmFuZCBzY2FsZS4KKyAgICAqLwogCiAgICAgaWYgKG5ld19sc2IgPiBvbGRfbHNiKSB7Ci0gICAgICAvKiBUaGUgbG93YmFuZCBoYXMgdG8gYmUgcmVzY2FsZWQgKi8KLSAgICAgIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLm92X2xiX3NjYWxlID0gc291cmNlX3NjYWxlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIFRoZSBoaWdoYmFuZCBoYXMgYmUgYmUgcmVzY2FsZWQgKi8KLSAgICAgIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLm92X2hiX3NjYWxlID0gc291cmNlX3NjYWxlOwotICAgIH0KLSAgfQorICAgICAgLyogY2FzZSAxIGFuZCAzICovCisgICAgICBzb3VyY2VfZXhwID0gU0NBTEUyRVhQKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcub3ZfaGJfc2NhbGUpOworICAgICAgdGFyZ2V0X2V4cCA9IFNDQUxFMkVYUChoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLm92X2xiX3NjYWxlKTsKIAotICBGREtfQVNTRVJUKHN0YXJ0QmFuZCA8PSBzdG9wQmFuZCk7CisgICAgICBzdGFydEJhbmQgPSBvbGRfbHNiOwogCi0gIGlmICghdXNlTFApIHsKLSAgICBmb3IgKGw9MDsgbDxzdGFydFNsb3Q7IGwrKykgewotICAgICAgc2NhbGVWYWx1ZXMoIE92ZXJsYXBCdWZmZXJSZWFsW2xdICsgc3RhcnRCYW5kLCBzdG9wQmFuZC1zdGFydEJhbmQsIGRlbHRhX3NjYWxlICk7Ci0gICAgICBzY2FsZVZhbHVlcyggT3ZlcmxhcEJ1ZmZlckltYWdbbF0gKyBzdGFydEJhbmQsIHN0b3BCYW5kLXN0YXJ0QmFuZCwgZGVsdGFfc2NhbGUgKTsKKyAgICAgIGlmIChuZXdfbHNiID49IG9sZF91c2IpIHsKKyAgICAgICAgLyogY2FzZSAxICovCisgICAgICAgIHN0b3BCYW5kID0gb2xkX3VzYjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGNhc2UgMyAqLworICAgICAgICBzdG9wQmFuZCA9IG5ld19sc2I7CisgICAgICB9CisKKyAgICAgIHRhcmdldF9sc2IgPSAwOworICAgICAgdGFyZ2V0X3VzYiA9IG9sZF9sc2I7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGNhc2UgMiBhbmQgNCAqLworICAgICAgc291cmNlX2V4cCA9IFNDQUxFMkVYUChoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLm92X2xiX3NjYWxlKTsKKyAgICAgIHRhcmdldF9leHAgPSBTQ0FMRTJFWFAoaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5vdl9oYl9zY2FsZSk7CisKKyAgICAgIHN0YXJ0QmFuZCA9IG5ld19sc2I7CisgICAgICBzdG9wQmFuZCA9IG9sZF9sc2I7CisKKyAgICAgIHRhcmdldF9sc2IgPSBvbGRfbHNiOworICAgICAgdGFyZ2V0X3VzYiA9IG9sZF91c2I7CiAgICAgfQotICB9IGVsc2UKLSAgZm9yIChsPTA7IGw8c3RhcnRTbG90OyBsKyspIHsKLSAgICBzY2FsZVZhbHVlcyggT3ZlcmxhcEJ1ZmZlclJlYWxbbF0gKyBzdGFydEJhbmQsIHN0b3BCYW5kLXN0YXJ0QmFuZCwgZGVsdGFfc2NhbGUgKTsKLSAgfQogCisgICAgbWF4VmFsID0KKyAgICAgICAgbWF4U3ViYmFuZFNhbXBsZShPdmVybGFwQnVmZmVyUmVhbCwgKHVzZUxQKSA/IE5VTEwgOiBPdmVybGFwQnVmZmVySW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEJhbmQsIHN0b3BCYW5kLCAwLCBzdGFydFNsb3QpOworCisgICAgcmVzZXJ2ZSA9ICgoTE9ORyltYXhWYWwgIT0gMCA/IENudExlYWRpbmdaZXJvcyhtYXhWYWwpIC0gMSA6IDApOworICAgIHJlc2VydmUgPSBmaXhNaW4oCisgICAgICAgIHJlc2VydmUsCisgICAgICAgIERGUkFDVF9CSVRTIC0gMSAtCisgICAgICAgICAgICBFWFAyU0NBTEUoCisgICAgICAgICAgICAgICAgc291cmNlX2V4cCkpOyAvKiB3aGF0IGlzIHRoaXMgbGluZSBmb3IsIHdoeSBkbyB3ZSBuZWVkIGl0PyAqLworCisgICAgLyogcHJvY2VzcyBvbmx5IGlmIHgtb3Zlci1hcmVhIGlzIG5vdCBkb21pbmFudCBhZnRlciByZXNjYWxlOworICAgICAgIG90aGVyd2lzZSBJJ20gbm90IHN1cmUgaWYgYWxsIGJ1ZmZlcnMgYXJlIHNjYWxlZCBjb3JyZWN0bHk7CisgICAgKi8KKyAgICBpZiAodGFyZ2V0X2V4cCAtIChzb3VyY2VfZXhwIC0gcmVzZXJ2ZSkgPj0gMCkgeworICAgICAgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKE92ZXJsYXBCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VMUCkgPyBOVUxMIDogT3ZlcmxhcEJ1ZmZlckltYWcsIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wQmFuZCwgMCwgc3RhcnRTbG90LCByZXNlcnZlKTsKKyAgICAgIHNvdXJjZV9leHAgLT0gcmVzZXJ2ZTsKKyAgICB9CisKKyAgICBkZWx0YV9leHAgPSB0YXJnZXRfZXhwIC0gc291cmNlX2V4cDsKKworICAgIGlmIChkZWx0YV9leHAgPCAwKSB7IC8qIHgtb3Zlci1hcmVhIGlzIGRvbWluYW50ICovCisgICAgICBzdGFydEJhbmQgPSB0YXJnZXRfbHNiOworICAgICAgc3RvcEJhbmQgPSB0YXJnZXRfdXNiOworICAgICAgZGVsdGFfZXhwID0gLWRlbHRhX2V4cDsKKworICAgICAgaWYgKG5ld19sc2IgPiBvbGRfbHNiKSB7CisgICAgICAgIC8qIFRoZSBsb3diYW5kIGhhcyB0byBiZSByZXNjYWxlZCAqLworICAgICAgICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLm92X2xiX3NjYWxlID0gRVhQMlNDQUxFKHNvdXJjZV9leHApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVGhlIGhpZ2hiYW5kIGhhcyB0byBiZSByZXNjYWxlZCAqLworICAgICAgICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLm92X2hiX3NjYWxlID0gRVhQMlNDQUxFKHNvdXJjZV9leHApOworICAgICAgfQorICAgIH0KKworICAgIEZES19BU1NFUlQoc3RhcnRCYW5kIDw9IHN0b3BCYW5kKTsKKworICAgIGlmICghdXNlTFApIHsKKyAgICAgIGZvciAobCA9IDA7IGwgPCBzdGFydFNsb3Q7IGwrKykgeworICAgICAgICBzY2FsZVZhbHVlcyhPdmVybGFwQnVmZmVyUmVhbFtsXSArIHN0YXJ0QmFuZCwgc3RvcEJhbmQgLSBzdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgIC1kZWx0YV9leHApOworICAgICAgICBzY2FsZVZhbHVlcyhPdmVybGFwQnVmZmVySW1hZ1tsXSArIHN0YXJ0QmFuZCwgc3RvcEJhbmQgLSBzdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgIC1kZWx0YV9leHApOworICAgICAgfQorICAgIH0gZWxzZQorICAgICAgZm9yIChsID0gMDsgbCA8IHN0YXJ0U2xvdDsgbCsrKSB7CisgICAgICAgIHNjYWxlVmFsdWVzKE92ZXJsYXBCdWZmZXJSZWFsW2xdICsgc3RhcnRCYW5kLCBzdG9wQmFuZCAtIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgLWRlbHRhX2V4cCk7CisgICAgICB9CisgIH0gLyogc3RhcnRTbG90ICE9IDAgKi8KIAogICAvKgogICAgIEluaXRpYWxpemUgdHJhbnNwb3NlciBhbmQgbGltaXRlcgogICAqLwotICBzYnJFcnJvciA9IHJlc2V0THBwVHJhbnNwb3NlciAoJmhTYnJEZWMtPkxwcFRyYW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS52X2tfbWFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5udW1NYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVOb2lzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubk5mYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+c2JyUHJvY1NtcGxSYXRlKTsKLSAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykKLSAgICByZXR1cm4gc2JyRXJyb3I7CisgIHNickVycm9yID0gcmVzZXRMcHBUcmFuc3Bvc2VyKAorICAgICAgJmhTYnJEZWMtPkxwcFRyYW5zLCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmQsCisgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLnZfa19tYXN0ZXIsIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubnVtTWFzdGVyLAorICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTm9pc2UsCisgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5OZmIsIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQsCisgICAgICBoSGVhZGVyRGF0YS0+c2JyUHJvY1NtcGxSYXRlKTsKKyAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykgcmV0dXJuIHNickVycm9yOwogCi0gIHNickVycm9yID0gUmVzZXRMaW1pdGVyQmFuZHMgKCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxpbWl0ZXJCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5ub0xpbWl0ZXJCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYlswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+cGF0Y2hQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+bm9PZlBhdGNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyQmFuZHMpOworICBoU2JyRGVjLT5zYXZlZFN0YXRlcyA9IDA7CiAKKyAgaWYgKGZsYWdzICYgU0JSREVDX1VTQUNfSEFSTU9OSUNTQlIpIHsKKyAgICBzYnJFcnJvciA9IFFtZlRyYW5zcG9zZXJSZUluaXQoaFNickRlYy0+aEhCRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmIpOworICAgIGlmIChzYnJFcnJvciAhPSBTQlJERUNfT0spIHJldHVybiBzYnJFcnJvcjsKKworICAgIC8qIGNvcHkgc2F2ZWQgc3RhdGVzIGZyb20gcHJldmlvdXMgZnJhbWUgdG8gbGVnYWN5IFNCUiBscGMgZmlsdGVyc3RhdGUKKyAgICAgKiBidWZmZXIgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMUENfT1JERVIgKyBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7IGkrKykgeworICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxMZWdTQlJbaV0sCisgICAgICAgICAgaFNickRlYy0+Y29kZWNRTUZCdWZmZXJSZWFsW2hTYnJEZWMtPmhIQkUtPm5vQ29scyAtIExQQ19PUkRFUiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCArIGldLAorICAgICAgICAgIGhTYnJEZWMtPmhIQkUtPm5vQ2hhbm5lbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNweSgKKyAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnTGVnU0JSW2ldLAorICAgICAgICAgIGhTYnJEZWMtPmNvZGVjUU1GQnVmZmVySW1hZ1toU2JyRGVjLT5oSEJFLT5ub0NvbHMgLSBMUENfT1JERVIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKyBpXSwKKyAgICAgICAgICBoU2JyRGVjLT5oSEJFLT5ub0NoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQorICAgIGhTYnJEZWMtPnNhdmVkU3RhdGVzID0gMTsKKworICAgIHsKKyAgICAgIC8qIG1hcCBRTUYgYnVmZmVyIHRvIHBvaW50ZXIgYXJyYXkgKE92ZXJsYXAgKyBGcmFtZSkqLworICAgICAgZm9yIChpID0gMDsgaSA8IGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCArIExQQ19PUkRFUjsgaSsrKSB7CisgICAgICAgIHBMb3dCYW5kUmVhbFtpXSA9IGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxIQkVbaV07CisgICAgICAgIHBMb3dCYW5kSW1hZ1tpXSA9IGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc0ltYWdIQkVbaV07CisgICAgICB9CisKKyAgICAgIC8qIG1hcCBRTUYgYnVmZmVyIHRvIHBvaW50ZXIgYXJyYXkgKE92ZXJsYXAgKyBGcmFtZSkqLworICAgICAgZm9yIChpID0gMDsgaSA8IGhTYnJEZWMtPmhIQkUtPm5vQ29sczsgaSsrKSB7CisgICAgICAgIHBMb3dCYW5kUmVhbFtpICsgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsgTFBDX09SREVSXSA9CisgICAgICAgICAgICBoU2JyRGVjLT5jb2RlY1FNRkJ1ZmZlclJlYWxbaV07CisgICAgICAgIHBMb3dCYW5kSW1hZ1tpICsgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsgTFBDX09SREVSXSA9CisgICAgICAgICAgICBoU2JyRGVjLT5jb2RlY1FNRkJ1ZmZlckltYWdbaV07CisgICAgICB9CisKKyAgICAgIGlmIChmbGFncyAmIFNCUkRFQ19RVUFEX1JBVEUpIHsKKyAgICAgICAgaWYgKGhGcmFtZURhdGEtPnNiclBhdGNoaW5nTW9kZSA9PSAwKSB7CisgICAgICAgICAgaW50ICp4T3ZlclFtZiA9IEdldHhPdmVyQmFuZFFtZlRyYW5zcG9zZXIoaFNickRlYy0+aEhCRSk7CisKKyAgICAgICAgICAvKiBpbiBjYXNlIG9mIGhhcm1vbmljIFNCUiBhbmQgbm8gSEJFX0xQIG1hcCBhZGRpdGlvbmFsIGJ1ZmZlciBmb3IKKyAgICAgICAgICBvbmUgbW9yZSBmcmFtZSB0byBwb2ludGVyIGFycnkgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaFNickRlYy0+aEhCRS0+bm9Db2xzIC8gMjsgaSsrKSB7CisgICAgICAgICAgICBwTG93QmFuZFJlYWxbaSArIGhTYnJEZWMtPmhIQkUtPm5vQ29scyArCisgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsgTFBDX09SREVSXSA9CisgICAgICAgICAgICAgICAgaFNickRlYy0+aFFtZkhCRVNsb3RzUmVhbFtpXTsKKyAgICAgICAgICAgIHBMb3dCYW5kSW1hZ1tpICsgaFNickRlYy0+aEhCRS0+bm9Db2xzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKyBMUENfT1JERVJdID0KKyAgICAgICAgICAgICAgICBoU2JyRGVjLT5oUW1mSEJFU2xvdHNJbWFnW2ldOworICAgICAgICAgIH0KKworICAgICAgICAgIFFtZlRyYW5zcG9zZXJBcHBseSgKKyAgICAgICAgICAgICAgaFNickRlYy0+aEhCRSwKKyAgICAgICAgICAgICAgcExvd0JhbmRSZWFsICsgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsKKyAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPmhIQkUtPm5vQ29scyAvIDIgKyBMUENfT1JERVIsCisgICAgICAgICAgICAgIHBMb3dCYW5kSW1hZyArIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCArCisgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLT5ub0NvbHMgLyAyICsgTFBDX09SREVSLAorICAgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLT5ub0NvbHMsIHBMb3dCYW5kUmVhbCwgcExvd0JhbmRJbWFnLAorICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsSEJFLAorICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnSEJFLAorICAgICAgICAgICAgICBoUHJldkZyYW1lRGF0YS0+cHJldlNiclBpdGNoSW5CaW5zLCBoU2JyRGVjLT5zY2FsZV9sYiwKKyAgICAgICAgICAgICAgaFNickRlYy0+c2NhbGVfaGJlLCAmaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5oYl9zY2FsZSwKKyAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPnRpbWVTdGVwLCBoRnJhbWVEYXRhLT5mcmFtZUluZm8uYm9yZGVyc1swXSwKKyAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwLCBLRUVQX1NUQVRFU19TWU5DRURfT1VURElGRik7CisKKyAgICAgICAgICBjb3B5SGFybW9uaWNTcGVjdHJ1bSgKKyAgICAgICAgICAgICAgeE92ZXJRbWYsIHBMb3dCYW5kUmVhbCwgcExvd0JhbmRJbWFnLCBoU2JyRGVjLT5oSEJFLT5ub0NvbHMsCisgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCwgS0VFUF9TVEFURVNfU1lOQ0VEX09VVERJRkYpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBpbiBjYXNlIG9mIGhhcm1vbmljIFNCUiBhbmQgbm8gSEJFX0xQIG1hcCBhZGRpdGlvbmFsIGJ1ZmZlciBmb3IKKyAgICAgICAgb25lIG1vcmUgZnJhbWUgdG8gcG9pbnRlciBhcnJ5ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoU2JyRGVjLT5oSEJFLT5ub0NvbHM7IGkrKykgeworICAgICAgICAgIHBMb3dCYW5kUmVhbFtpICsgaFNickRlYy0+aEhCRS0+bm9Db2xzICsKKyAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsgTFBDX09SREVSXSA9CisgICAgICAgICAgICAgIGhTYnJEZWMtPmhRbWZIQkVTbG90c1JlYWxbaV07CisgICAgICAgICAgcExvd0JhbmRJbWFnW2kgKyBoU2JyRGVjLT5oSEJFLT5ub0NvbHMgKworICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKyBMUENfT1JERVJdID0KKyAgICAgICAgICAgICAgaFNickRlYy0+aFFtZkhCRVNsb3RzSW1hZ1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoRnJhbWVEYXRhLT5zYnJQYXRjaGluZ01vZGUgPT0gMCkgeworICAgICAgICAgIFFtZlRyYW5zcG9zZXJBcHBseSgKKyAgICAgICAgICAgICAgaFNickRlYy0+aEhCRSwKKyAgICAgICAgICAgICAgcExvd0JhbmRSZWFsICsgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsgTFBDX09SREVSLAorICAgICAgICAgICAgICBwTG93QmFuZEltYWcgKyBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKyBMUENfT1JERVIsCisgICAgICAgICAgICAgIGhTYnJEZWMtPmhIQkUtPm5vQ29scywgcExvd0JhbmRSZWFsLCBwTG93QmFuZEltYWcsCisgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxIQkUsCisgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc0ltYWdIQkUsCisgICAgICAgICAgICAgIDAgLyogbm90IHJlcXVpcmVkIGZvciBrZWVwaW5nIHN0YXRlcyB1cGRhdGVkIGluIHRoaXMgZnJhbWUqLywKKyAgICAgICAgICAgICAgaFNickRlYy0+c2NhbGVfbGIsIGhTYnJEZWMtPnNjYWxlX2xiLAorICAgICAgICAgICAgICAmaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5oYl9zY2FsZSwgaEhlYWRlckRhdGEtPnRpbWVTdGVwLAorICAgICAgICAgICAgICBoRnJhbWVEYXRhLT5mcmFtZUluZm8uYm9yZGVyc1swXSwKKyAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwLCBLRUVQX1NUQVRFU19TWU5DRURfTk9PVVQpOworICAgICAgICB9CisKKyAgICAgICAgUW1mVHJhbnNwb3NlckFwcGx5KAorICAgICAgICAgICAgaFNickRlYy0+aEhCRSwKKyAgICAgICAgICAgIHBMb3dCYW5kUmVhbCArIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCArCisgICAgICAgICAgICAgICAgaFNickRlYy0+aEhCRS0+bm9Db2xzICsgTFBDX09SREVSLAorICAgICAgICAgICAgcExvd0JhbmRJbWFnICsgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsKKyAgICAgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLT5ub0NvbHMgKyBMUENfT1JERVIsCisgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLT5ub0NvbHMsIHBMb3dCYW5kUmVhbCwgcExvd0JhbmRJbWFnLAorICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbEhCRSwKKyAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc0ltYWdIQkUsCisgICAgICAgICAgICBoUHJldkZyYW1lRGF0YS0+cHJldlNiclBpdGNoSW5CaW5zLCBoU2JyRGVjLT5zY2FsZV9sYiwKKyAgICAgICAgICAgIGhTYnJEZWMtPnNjYWxlX2hiZSwgJmhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcuaGJfc2NhbGUsCisgICAgICAgICAgICBoSGVhZGVyRGF0YS0+dGltZVN0ZXAsIGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzWzBdLAorICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwLCBLRUVQX1NUQVRFU19TWU5DRURfT1VURElGRik7CisgICAgICB9CisKKyAgICAgIGlmIChoRnJhbWVEYXRhLT5zYnJQYXRjaGluZ01vZGUgPT0gMCkgeworICAgICAgICBmb3IgKGkgPSBzdGFydFNsb3Q7IGkgPCBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7IGkrKykgeworICAgICAgICAgIC8qCisgICAgICAgICAgU3RvcmUgdGhlIHVubW9kaWZpZWQgcW1mIFNsb3RzIHZhbHVlcyBmb3IgdXBwZXIgcGFydCBvZiBzcGVjdHJ1bQorICAgICAgICAgIChyZXF1aXJlZCBmb3IgTFBDIGZpbHRlcmluZykgcmVxdWlyZWQgaWYgbmV4dCBmcmFtZSBpcyBhIEhCRSBmcmFtZQorICAgICAgICAgICovCisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmhRbWZTbG90c1JlYWxbaV0sCisgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxIQkVbaSArIExQQ19PUkRFUl0sCisgICAgICAgICAgICAgICAgICAgICg2NCkgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICBGREttZW1jcHkoaFNickRlYy0+cW1mRG9tYWluSW5DaC0+aFFtZlNsb3RzSW1hZ1tpXSwKKyAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ0hCRVtpICsgTFBDX09SREVSXSwKKyAgICAgICAgICAgICAgICAgICAgKDY0KSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gc3RhcnRTbG90OyBpIDwgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOyBpKyspIHsKKyAgICAgICAgICAvKgorICAgICAgICAgIFN0b3JlIHRoZSB1bm1vZGlmaWVkIHFtZiBTbG90cyB2YWx1ZXMgZm9yIHVwcGVyIHBhcnQgb2Ygc3BlY3RydW0KKyAgICAgICAgICAocmVxdWlyZWQgZm9yIExQQyBmaWx0ZXJpbmcpIHJlcXVpcmVkIGlmIG5leHQgZnJhbWUgaXMgYSBIQkUgZnJhbWUKKyAgICAgICAgICAqLworICAgICAgICAgIEZES21lbWNweSgKKyAgICAgICAgICAgICAgaFNickRlYy0+cW1mRG9tYWluSW5DaC0+aFFtZlNsb3RzUmVhbFtpXSwKKyAgICAgICAgICAgICAgaFNickRlYy0+Y29kZWNRTUZCdWZmZXJSZWFsW2hTYnJEZWMtPmhIQkUtPm5vQ29scyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV0sCisgICAgICAgICAgICAgIG5ld19sc2IgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICBGREttZW1jcHkoCisgICAgICAgICAgICAgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmhRbWZTbG90c0ltYWdbaV0sCisgICAgICAgICAgICAgIGhTYnJEZWMtPmNvZGVjUU1GQnVmZmVySW1hZ1toU2JyRGVjLT5oSEJFLT5ub0NvbHMgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGldLAorICAgICAgICAgICAgICBuZXdfbHNiICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICB7CisgICAgaW50IGFkYXB0X2xiID0gMCwgZGlmZiA9IDAsCisgICAgICAgIG5ld19zY2FsZSA9IGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcub3ZfbGJfc2NhbGU7CisKKyAgICBpZiAoKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcub3ZfbGJfc2NhbGUgIT0KKyAgICAgICAgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcubGJfc2NhbGUpICYmCisgICAgICAgIHN0YXJ0U2xvdCAhPSAwKSB7CisgICAgICAvKiB3ZSBuZWVkIHRvIGFkYXB0IHNwZWN0cnVtIHRvIGhhdmUgZXF1YWwgc2NhbGUgZmFjdG9yLCBhbHdheXMgbGFyZ2VyCisgICAgICAgKiB0aGFuIHplcm8gKi8KKyAgICAgIGRpZmYgPSBTQ0FMRTJFWFAoaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5vdl9sYl9zY2FsZSkgLQorICAgICAgICAgICAgIFNDQUxFMkVYUChoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmxiX3NjYWxlKTsKKworICAgICAgaWYgKGRpZmYgPiAwKSB7CisgICAgICAgIGFkYXB0X2xiID0gMTsKKyAgICAgICAgZGlmZiA9IC1kaWZmOworICAgICAgICBuZXdfc2NhbGUgPSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLm92X2xiX3NjYWxlOworICAgICAgfQorCisgICAgICBzdG9wQmFuZCA9IG5ld19sc2I7CisgICAgfQorCisgICAgaWYgKGhGcmFtZURhdGEtPnNiclBhdGNoaW5nTW9kZSA9PSAxKSB7CisgICAgICAvKiBzY2FsZSBzdGF0ZXMgZnJvbSBMZWdTQlIgZmlsdGVyc3RhdGVzIGJ1ZmZlciAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCArIExQQ19PUkRFUjsgaSsrKSB7CisgICAgICAgIHNjYWxlVmFsdWVzKGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxMZWdTQlJbaV0sIG5ld19sc2IsCisgICAgICAgICAgICAgICAgICAgIGRpZmYpOworICAgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgICAgc2NhbGVWYWx1ZXMoaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ0xlZ1NCUltpXSwgbmV3X2xzYiwKKyAgICAgICAgICAgICAgICAgICAgICBkaWZmKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZmxhZ3MgJiBTQlJERUNfU1lOVEFYX1VTQUMpIHsKKyAgICAgICAgLyogZ2V0IG1pc3Npbmcgc3RhdGVzIGJldHdlZW4gb2xkIGFuZCBuZXcgeF9vdmVyIGZyb20gTGVnU0JSCisgICAgICAgICAqIGZpbHRlcnN0YXRlcyBidWZmZXIgKi8KKyAgICAgICAgLyogaW4gY2FzZSBvZiBsZWdhY3kgU0JSIHdlIGxlYXZlIHRoZXNlIHZhbHVlcyB6ZXJvZWQgb3V0ICovCisgICAgICAgIGZvciAoaSA9IHN0YXJ0U2xvdDsgaSA8IGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsgaSsrKSB7CisgICAgICAgICAgRkRLbWVtY3B5KCZPdmVybGFwQnVmZmVyUmVhbFtpXVtvbGRfbHNiXSwKKyAgICAgICAgICAgICAgICAgICAgJmhTYnJEZWMtPkxwcFRyYW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgLmxwY0ZpbHRlclN0YXRlc1JlYWxMZWdTQlJbTFBDX09SREVSICsgaV1bb2xkX2xzYl0sCisgICAgICAgICAgICAgICAgICAgIGZNYXgobmV3X2xzYiAtIG9sZF9sc2IsIDApICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgaWYgKCF1c2VMUCkgeworICAgICAgICAgICAgRkRLbWVtY3B5KCZPdmVybGFwQnVmZmVySW1hZ1tpXVtvbGRfbHNiXSwKKyAgICAgICAgICAgICAgICAgICAgICAmaFNickRlYy0+THBwVHJhbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5scGNGaWx0ZXJTdGF0ZXNJbWFnTGVnU0JSW0xQQ19PUkRFUiArIGldW29sZF9sc2JdLAorICAgICAgICAgICAgICAgICAgICAgIGZNYXgobmV3X2xzYiAtIG9sZF9sc2IsIDApICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChuZXdfbHNiID4gb2xkX2xzYikgeworICAgICAgICBzdG9wQmFuZCA9IG9sZF9sc2I7CisgICAgICB9CisgICAgfQorICAgIGlmICgoYWRhcHRfbGIgPT0gMSkgJiYgKHN0b3BCYW5kID4gc3RhcnRCYW5kKSkgeworICAgICAgZm9yIChsID0gc3RhcnRTbG90OyBsIDwgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOyBsKyspIHsKKyAgICAgICAgc2NhbGVWYWx1ZXMoT3ZlcmxhcEJ1ZmZlclJlYWxbbF0gKyBzdGFydEJhbmQsIHN0b3BCYW5kIC0gc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICBkaWZmKTsKKyAgICAgICAgaWYgKCF1c2VMUCkgeworICAgICAgICAgIHNjYWxlVmFsdWVzKE92ZXJsYXBCdWZmZXJJbWFnW2xdICsgc3RhcnRCYW5kLCBzdG9wQmFuZCAtIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICBkaWZmKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLm92X2xiX3NjYWxlID0gbmV3X3NjYWxlOworICB9CisKKyAgc2JyRXJyb3IgPSBSZXNldExpbWl0ZXJCYW5kcyhoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxpbWl0ZXJCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubm9MaW1pdGVyQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPnBhdGNoUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5ub09mUGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YS0+c2JyUGF0Y2hpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldHhPdmVyQmFuZFFtZlRyYW5zcG9zZXIoaFNickRlYy0+aEhCRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0NDFTYnJRbWZUcmFuc3Bvc2VyKGhTYnJEZWMtPmhIQkUpKTsKKworICBoU2JyRGVjLT5TYnJDYWxjdWxhdGVFbnZlbG9wZS5zYnJQYXRjaGluZ01vZGUgPSBoRnJhbWVEYXRhLT5zYnJQYXRjaGluZ01vZGU7CiAKICAgcmV0dXJuIHNickVycm9yOwogfQpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJfZGVjLmggYi9saWJTQlJkZWMvc3JjL3Nicl9kZWMuaAppbmRleCBlZGRlNjM3Li4xNTZkYTAzIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9kZWMuaAorKysgYi9saWJTQlJkZWMvc3JjL3Nicl9kZWMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMjIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBTYnIgZGVjb2RlciAgCisgIFxicmllZiAgU2JyIGRlY29kZXIKICovCi0jaWZuZGVmIF9fU0JSX0RFQ19ICi0jZGVmaW5lIF9fU0JSX0RFQ19ICisjaWZuZGVmIFNCUl9ERUNfSAorI2RlZmluZSBTQlJfREVDX0gKIAogI2luY2x1ZGUgInNicmRlY29kZXIuaCIKIApAQCAtOTUsMTIwICsxMTQsOTEgQEAKICNpbmNsdWRlICJlbnZfY2FsYy5oIgogI2luY2x1ZGUgIkZES19hdWRpby5oIgogCi0KICNpbmNsdWRlICJzYnJkZWNfZHJjLmgiCiAKLSNkZWZpbmUgU0FDREVDX0FMSUdOTUVOVF9GSVgKKyNpbmNsdWRlICJwdmNfZGVjLmgiCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFFNRl9GSUxURVJfQkFOSyAgICAgQW5hbHlzaXNjUU1GOwotICBRTUZfRklMVEVSX0JBTksgICAgIFN5bnRoZXNpc1FNRjsKKyNpbmNsdWRlICJoYmUuaCIKIAotICBTQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFICBTYnJDYWxjdWxhdGVFbnZlbG9wZTsKLSAgU0JSX0xQUF9UUkFOUyAgICAgICAgICAgTHBwVHJhbnM7CitlbnVtIFNCUkRFQ19RTUZfU0tJUCB7CisgIHFtZlNraXBOb3RoaW5nID0gMCwKKyAgcW1mU2tpcEFuYWx5c2lzID0gMSA8PCAwLAorICBxbWZTa2lwU3ludGhlc2lzID0gMSA8PCAxCit9OwogCi0gIFFNRl9TQ0FMRV9GQUNUT1Igc2JyU2NhbGVGYWN0b3I7Ci0gIFFNRl9TQ0FMRV9GQUNUT1Igc2JyU2NhbGVGYWN0b3JSaWdodDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0JSX0NBTENVTEFURV9FTlZFTE9QRSBTYnJDYWxjdWxhdGVFbnZlbG9wZTsKKyAgU0JSX0xQUF9UUkFOUyBMcHBUcmFuczsKKyAgUFZDX1NUQVRJQ19EQVRBIFB2Y1N0YXRpY0RhdGE7CiAKLSAgLyohIERlbGF5ZWQgc3BlY3RyYWwgZGF0YSBuZWVkZWQgZm9yIHRoZSBkeW5hbWljIGZyYW1pbmcgb2YgU0JSLiBOb3QgcmVxdWlyZWQgaW4gY2FzZSBvZiBDTERGQiAqLwotICBGSVhQX0RCTCAqIHBTYnJPdmVybGFwQnVmZmVyOworICAvKiBkbyBzY2FsZSBoYW5kbGluZyBpbiBzYnIgYW4gbm90IGluIHFtZiAqLworICBTSE9SVCBzY2FsZV9vdjsKKyAgU0hPUlQgc2NhbGVfbGI7CisgIFNIT1JUIHNjYWxlX2hiZTsKIAotICAvKiBSZWZlcmVuY2VzIHRvIHdvcmtidWZmZXJzICovCi0gIEZJWFBfREJMICogV29ya0J1ZmZlcjE7Ci0gIEZJWFBfREJMICogV29ya0J1ZmZlcjI7CisgIFNIT1JUIHByZXZfZnJhbWVfbFNicjsKKyAgU0hPUlQgcHJldl9mcmFtZV9oYmVTYnI7CiAKLSAgLyogRGVsYXllZCB0aW1lIGlucHV0IHNpZ25hbCBuZWVkZWQgdG8gYWxpZ24gQ0xERkQgd2l0aCBMRC1NUFMgUU1GLiAqLwotICBJTlRfUENNICAgIGNvcmVEZWxheUJ1ZlsoOTYpXTsKKyAgaW50IGNvZGVjRnJhbWVTaXplOwogCi0gIC8qIFFNRiBmaWx0ZXIgc3RhdGVzICovCi0gIEZJWFBfUUFTICAgYW5hUW1mU3RhdGVzWygzMjApXTsKLSAgRklYUF9RU1MgKiBwU3luUW1mU3RhdGVzOworICBIQU5ETEVfSEJFX1RSQU5TUE9TRVIgaEhCRTsKIAotICAvKiBSZWZlcmVuY2UgcG9pbnRlciBhcnJheXMgZm9yIFFNRiB0aW1lIHNsb3RzLAotICAgICBtaXhlZCBhbW9uZyBvdmVybGFwIGFuZCBjdXJyZW50IHNsb3RzLiAqLwotICBGSVhQX0RCTCAqIFFtZkJ1ZmZlclJlYWxbKCgoMTAyNCkvKDMyKSkrKDYpKV07Ci0gIEZJWFBfREJMICogUW1mQnVmZmVySW1hZ1soKCgxMDI0KS8oMzIpKSsoNikpXTsKLSAgaW50IHVzZUxQOworICBIQU5ETEVfRkRLX1FNRl9ET01BSU5fSU4gcW1mRG9tYWluSW5DaDsKKyAgSEFORExFX0ZES19RTUZfRE9NQUlOX09VVCBxbWZEb21haW5PdXRDaDsKIAotICAvKiBRTUYgZG9tYWluIGV4dGVuc2lvbiB0aW1lIHNsb3QgcmVmZXJlbmNlIHBvaW50ZXIgYXJyYXkgKi8KKyAgU0JSREVDX0RSQ19DSEFOTkVMIHNickRyY0NoYW5uZWw7CiAKLSAgU0JSREVDX0RSQ19DSEFOTkVMICBzYnJEcmNDaGFubmVsOworI2lmIChTQlJERUNfTUFYX0hCX0ZBREVfRlJBTUVTID4gMCkKKyAgSU5UIGhpZ2hCYW5kRmFkZUNudDsgLyogY291bnRlciBmb3IgZmFkaW5nIGluIGhpZ2gtYmFuZCBzaWduYWwgc21vb3RobHkgKi8KIAorI2VuZGlmCisgIEZJWFBfREJMICoqdG1wX21lbW9yeTsgLyogc2hhcmVkIG1lbW9yeSBiZXR3ZWVuIGhiZUxpZ2h0VGltZURlbGF5QnVmZmVyIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZIQkVTbG90c1JlYWwgKi8KKworICBGSVhQX0RCTCAqKmhRbWZIQkVTbG90c1JlYWw7CisgIEZJWFBfREJMICoqaFFtZkhCRVNsb3RzSW1hZzsKKworICBGSVhQX0RCTCAqKmNvZGVjUU1GQnVmZmVyUmVhbDsKKyAgRklYUF9EQkwgKipjb2RlY1FNRkJ1ZmZlckltYWc7CisgIFVDSEFSIHNhdmVkU3RhdGVzOworICBpbnQgYXBwbHlTYnJQcm9jX29sZDsKIH0gU0JSX0RFQzsKIAogdHlwZWRlZiBTQlJfREVDICpIQU5ETEVfU0JSX0RFQzsKIAotCi10eXBlZGVmIHN0cnVjdAotewotICBTQlJfRlJBTUVfREFUQSAgICAgIGZyYW1lRGF0YVsoMSkrMV07Cit0eXBlZGVmIHN0cnVjdCB7CisgIFNCUl9GUkFNRV9EQVRBIGZyYW1lRGF0YVsoMSkgKyAxXTsKICAgU0JSX1BSRVZfRlJBTUVfREFUQSBwcmV2RnJhbWVEYXRhOwogICBTQlJfREVDIFNickRlYzsKLX0KLVNCUl9DSEFOTkVMOworfSBTQlJfQ0hBTk5FTDsKIAogdHlwZWRlZiBTQlJfQ0hBTk5FTCAqSEFORExFX1NCUl9DSEFOTkVMOwogCi12b2lkCi1TYnJEZWNvZGVBbmRQcm9jZXNzIChIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLAotICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqdGltZUluLAotICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaFByZXZGcmFtZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgYXBwbHlQcm9jZXNzaW5nLAotICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxOcgotICAgICAgICAgICAgICAgICAgICAgLCBVQ0hBUiB1c2VMUAotICAgICAgICAgICAgICAgICAgICAgKTsKLQotCi12b2lkCi1TYnJDb25zdHJ1Y3RUaW1lT3V0cHV0IChIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLCAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqdGltZU91dCwgICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgdGltZSBzaWduYWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoUHJldkZyYW1lRGF0YSwgIC8qITwgU29tZSBjb250cm9sIGRhdGEgb2YgbGFzdCBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxOcgotICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIgdXNlTFAKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLQotdm9pZAotc2JyX2RlYyAoSEFORExFX1NCUl9ERUMgaFNickRlYywgICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgKi8KLSAgICAgICAgIElOVF9QQ00gKnRpbWVJbiwgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGlucHV0IHRpbWUgc2lnbmFsICovCi0gICAgICAgICBJTlRfUENNICp0aW1lT3V0LCAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgdGltZSBzaWduYWwgKi8KLSAgICAgICAgIEhBTkRMRV9TQlJfREVDIGhTYnJEZWNSaWdodCwgICAgICAgLyohPCBoYW5kbGUgdG8gRGVjb2RlciBjaGFubmVsIHJpZ2h0ICovCi0gICAgICAgICBJTlRfUENNICp0aW1lT3V0UmlnaHQsICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgdGltZSBzaWduYWwgKi8KLSAgICAgICAgIGNvbnN0IGludCBzdHJpZGVJbiwgICAgICAgICAgICAgICAgLyohPCBUaW1lIGRhdGEgdHJhdmVyc2FsIHN0cmlkZUluICovCi0gICAgICAgICBjb25zdCBpbnQgc3RyaWRlT3V0LCAgICAgICAgICAgICAgIC8qITwgVGltZSBkYXRhIHRyYXZlcnNhbCBzdHJpZGVPdXQgKi8KLSAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YSwgIC8qITwgQ29udHJvbCBkYXRhIG9mIGN1cnJlbnQgZnJhbWUgKi8KLSAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhQcmV2RnJhbWVEYXRhLCAgLyohPCBTb21lIGNvbnRyb2wgZGF0YSBvZiBsYXN0IGZyYW1lICovCi0gICAgICAgICBjb25zdCBpbnQgYXBwbHlQcm9jZXNzaW5nLCAgICAgICAgIC8qITwgRmxhZyBmb3IgU0JSIG9wZXJhdGlvbiAqLwotICAgICAgICAgSEFORExFX1BTX0RFQyBoX3BzX2QsCi0gICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAotICAgICAgICAgY29uc3QgaW50IGNvZGVjRnJhbWVTaXplCi0gICAgICAgICk7Ci0KLQordm9pZCBzYnJfZGVjKAorICAgIEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsICAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCAqLworICAgIElOVF9QQ00gKnRpbWVJbiwgICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBpbnB1dCB0aW1lIHNpZ25hbCAqLworICAgIElOVF9QQ00gKnRpbWVPdXQsICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgdGltZSBzaWduYWwgKi8KKyAgICBIQU5ETEVfU0JSX0RFQyBoU2JyRGVjUmlnaHQsICAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgcmlnaHQgKi8KKyAgICBJTlRfUENNICp0aW1lT3V0UmlnaHQsICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gb3V0cHV0IHRpbWUgc2lnbmFsICovCisgICAgSU5UIHN0cmlkZU91dCwgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lIGRhdGEgdHJhdmVyc2FsIHN0cmlkZU91dCAqLworICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLCAgIC8qITwgQ29udHJvbCBkYXRhIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQQorICAgICAgICBoUHJldkZyYW1lRGF0YSwgICAgICAgIC8qITwgU29tZSBjb250cm9sIGRhdGEgb2YgbGFzdCBmcmFtZSAqLworICAgIGNvbnN0IGludCBhcHBseVByb2Nlc3NpbmcsIC8qITwgRmxhZyBmb3IgU0JSIG9wZXJhdGlvbiAqLworICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLCBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBpbnQgY29kZWNGcmFtZVNpemUpOwogCiBTQlJfRVJST1IKLWNyZWF0ZVNickRlYyAoU0JSX0NIQU5ORUwgKiBoU2JyQ2hhbm5lbCwKLSAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLAotICAgICAgICAgICAgICBjb25zdCBpbnQgZG93bnNhbXBsZUZhYywKLSAgICAgICAgICAgICAgY29uc3QgVUlOVCBxbWZGbGFncywKLSAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgICAgICAgY29uc3QgaW50IG92ZXJsYXAsCi0gICAgICAgICAgICAgIGludCBjaGFuKTsKK2NyZWF0ZVNickRlYyhTQlJfQ0hBTk5FTCAqaFNickNoYW5uZWwsIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLCBjb25zdCBpbnQgZG93bnNhbXBsZUZhYywKKyAgICAgICAgICAgICBjb25zdCBVSU5UIHFtZkZsYWdzLCBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBpbnQgb3ZlcmxhcCwgaW50IGNoYW4sCisgICAgICAgICAgICAgaW50IGNvZGVjRnJhbWVTaXplKTsKIAotaW50Ci1kZWxldGVTYnJEZWMgKFNCUl9DSEFOTkVMICogaFNickNoYW5uZWwpOworaW50IGRlbGV0ZVNickRlYyhTQlJfQ0hBTk5FTCAqaFNickNoYW5uZWwpOwogCiBTQlJfRVJST1IKLXJlc2V0U2JyRGVjIChIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLAotICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaFByZXZGcmFtZURhdGEsCi0gICAgICAgICAgICAgY29uc3QgaW50IHVzZUxQLAotICAgICAgICAgICAgIGNvbnN0IGludCBkb3duc2FtcGxlRmFjKTsKK3Jlc2V0U2JyRGVjKEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoUHJldkZyYW1lRGF0YSwgY29uc3QgaW50IGRvd25zYW1wbGVGYWMsCisgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLCBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJfcmFtLmNwcCBiL2xpYlNCUmRlYy9zcmMvc2JyX3JhbS5jcHAKaW5kZXggYzFjMjQ5OS4uOGIzNWZkMiAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJfcmFtLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL3Nicl9yYW0uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIzICs5MCwyNyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQogICBcYnJpZWYgTWVtb3J5IGxheW91dAotICAgCiAKICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgYWxsIHN0YXRpYyBhbmQgZHluYW1pYyBtZW1vcnkgc3BhY2VzCiAqLwogCiAjaW5jbHVkZSAic2JyX3JhbS5oIgogCi0KLQotCi0jZGVmaW5lIFdPUktCVUZGRVIxX1RBRyAwCi0jZGVmaW5lIFdPUktCVUZGRVIyX1RBRyAxCisjZGVmaW5lIFdPUktCVUZGRVIxX1RBRyAyCisjZGVmaW5lIFdPUktCVUZGRVIyX1RBRyAzCiAKIC8qIQogICBcbmFtZSBTdGF0aWNTYnJEYXRhCkBAIC0xMTEsMjQgKzEyNiwxNCBAQAogQ19BTExPQ19NRU0yKFJhbV9TYnJEZWNFbGVtZW50LCBTQlJfREVDT0RFUl9FTEVNRU5ULCAxLCAoOCkpCiAvKiEgU0JSIERlY29kZXIgaW5kaXZpZHVhbCBjaGFubmVsIGRhdGEgIDxicj4KICAgRGltZW5zaW9uOiAoOCkgKi8KLUNfQUxMT0NfTUVNMihSYW1fU2JyRGVjQ2hhbm5lbCwgU0JSX0NIQU5ORUwsIDEsICg4KSsxKQotCi0vKiEgRmlsdGVyIHN0YXRlcyBmb3IgUU1GLXN5bnRoZXNpcy4gIDxicj4KLSAgRGltZW5zaW9uOiAjKDgpICogKCNRTUZfRklMVEVSX1NUQVRFX1NZTl9TSVpFLSMoNjQpKSAqLwotQ19BQUxMT0NfTUVNMl9MKFJhbV9zYnJfUW1mU3RhdGVzU3ludGhlc2lzLCBGSVhQX1FTUywgKDY0MCktKDY0KSwgKDgpKzEsIFNFQ1RfREFUQV9MMSkKLQotLyohIERlbGF5ZWQgc3BlY3RyYWwgZGF0YSBuZWVkZWQgZm9yIHRoZSBkeW5hbWljIGZyYW1pbmcgb2YgU0JSLgotICBGb3IgbXAzUFJPLCAxLzMgb2YgYSBmcmFtZSBpcyBidWZmZXJlZCAoIyg2KSA2KSAqLwotQ19BQUxMT0NfTUVNMihSYW1fc2JyX092ZXJsYXBCdWZmZXIsIEZJWFBfREJMLCAyICogKDYpICogKDY0KSwgKDgpKzEpCitDX0FMTE9DX01FTTIoUmFtX1NickRlY0NoYW5uZWwsIFNCUl9DSEFOTkVMLCAxLCAoOCkgKyAxKQogCiAvKiEgU3RhdGljIERhdGEgb2YgUFMgKi8KIAotQ19BTExPQ19NRU0oUmFtX3BzX2RlYywgUFNfREVDLCAxKQotCitDX0FMTE9DX01FTShSYW1fcHNfZGVjLCBzdHJ1Y3QgUFNfREVDLCAxKQogCiAvKiBAfSAqLwogCi0KIC8qIQogICBcbmFtZSBEeW5hbWljU2JyRGF0YQogCkBAIC0xMzgsMTQgKzE0MywxMiBAQAogICBEZXBlbmRpbmcgb24gdGhlIG1vZGUgc2V0IGJ5IERPTlRfVVNFX0NPUkVfV09SS0JVRkZFUiwgd29ya2J1ZmZlcnMgYXJlCiAgIGRlZmluZWQgYWRkaXRpb25hbGx5IHRvIHRoZSBDb3JlV29ya2J1ZmZlci4KICAgPGJyPgotICBUaGUgc2l6ZSBvZiBXb3JrQnVmZmVycyBpcyAoKDEwMjQpLygzMikpKig2NCkgPSAyMDQ4LgorICBUaGUgc2l6ZSBvZiBXb3JrQnVmZmVycyBpcyAoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpKig2NCkgPSAyMDQ4LgogICA8YnI+Ci0gIFdvcmtCdWZmZXIyIGlzIGEgcG9pbnRlciB0byB0aGUgQ29yZVdvcmtCdWZmZXIgd2ljaCBpcyByZXVzZWQgaGVyZSBpbiB0aGUgU0JSIHBhcnQuIEluIGNhc2Ugb2YKLSAgRE9OVF9VU0VfQ09SRV9XT1JLQlVGRkVSLCB0aGUgQ29yZVdvcmtidWZmZXIgaXMgbm90IHVzZWQgYW5kIHRoZSBhY2NvcmRpbmcKLSAgV29ya2J1ZmZlcjIgaXMgZGVmaW5lZCBsb2NhbGx5IGluIHRoaXMgZmlsZS4KLSAgPGJyPgotICBXb3JrQnVmZmVyMSBpcyByZXVzZWQgaW4gdGhlIEFBQyBjb3JlICgtPiBhYWNkZWNvZGVyLmNwcCwgYWFjX3JhbS5jcHApCi0gIDxicj4KKyAgV29ya0J1ZmZlcjIgaXMgYSBwb2ludGVyIHRvIHRoZSBDb3JlV29ya0J1ZmZlciB3aWNoIGlzIHJldXNlZCBoZXJlIGluIHRoZSBTQlIKKyAgcGFydC4gSW4gY2FzZSBvZiBET05UX1VTRV9DT1JFX1dPUktCVUZGRVIsIHRoZSBDb3JlV29ya2J1ZmZlciBpcyBub3QgdXNlZCBhbmQKKyAgdGhlIGFjY29yZGluZyBXb3JrYnVmZmVyMiBpcyBkZWZpbmVkIGxvY2FsbHkgaW4gdGhpcyBmaWxlLiA8YnI+IFdvcmtCdWZmZXIxIGlzCisgIHJldXNlZCBpbiB0aGUgQUFDIGNvcmUgKC0+IGFhY2RlY29kZXIuY3BwLCBhYWNfcmFtLmNwcCkgPGJyPgogCiAgIFVzZSBvZiBXb3JrQnVmZmVyczoKICAgPHByZT4KQEAgLTE2OSwyNiArMTcyLDIwIEBACiAgICAgICAgIHxfX19fX19fX19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19fX19fX19fX3wKIAogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgSGlnaCBRdWFsaXR5IE1vZGUgKCFMT1dfUE9XRVJfU0JSX09OTFkgYW5kIHVzZUxQPTApLCBzZWUgYXNzaWduSHFUaW1lU2xvdHMoKQorICAgICAgSGlnaCBRdWFsaXR5IE1vZGUgKCFMT1dfUE9XRVJfU0JSX09OTFkgYW5kIHVzZUxQPTApLCBzZWUKKyAgYXNzaWduSHFUaW1lU2xvdHMoKQogCiAgICAgICAgICBTTE9UQkFTRURfUFMKIAogICAgICAgICAgV29ya0J1ZmZlcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtCdWZmZXIyKD1Db3JlV29ya2J1ZmZlcikKICAgICAgICAgIF9fX19fX19fX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fX19fX19fX19fCi0gICAgICAgIHwgUmVhbC9JbWFnICAgICAgfCAgaW50ZXJsZWF2ZWQgICAgICAgICAgICB8IFJlYWwvSW1hZyAgICAgIHwgIGludGVybGVhdmVkCi0gICAgICAgIHxfX19fX19fX19fX19fX19ffCAgZmlyc3QgaGFsZiBhY3R1YWwgY2ggICB8X19fX19fX19fX19fX19fX3wgIHNlY29uZCBoYWxmIGFjdHVhbCBjaAorICAgICAgICB8IFJlYWwvSW1hZyAgICAgIHwgIGludGVybGVhdmVkICAgICAgICAgICAgfCBSZWFsL0ltYWcgICAgICB8CisgIGludGVybGVhdmVkCisgICAgICAgIHxfX19fX19fX19fX19fX19ffCAgZmlyc3QgaGFsZiBhY3R1YWwgY2ggICB8X19fX19fX19fX19fX19fX3wgIHNlY29uZAorICBoYWxmIGFjdHVhbCBjaAogCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgIDwvcHJlPgogCiAqLwotLyogQHsgKi8KLUNfQUxMT0NfTUVNX09WRVJMQVkoUmFtX1NickRlY1dvcmtCdWZmZXIxLCBGSVhQX0RCTCwgKCgxMDI0KS8oMzIpKSooNjQpLCBTRUNUX0RBVEFfTDEsIFdPUktCVUZGRVIxX1RBRykKLUNfQUxMT0NfTUVNX09WRVJMQVkoUmFtX1NickRlY1dvcmtCdWZmZXIyLCBGSVhQX0RCTCwgKCgxMDI0KS8oMzIpKSooNjQpLCBTRUNUX0RBVEFfTDIsIFdPUktCVUZGRVIyX1RBRykKLQotLyogQH0gKi8KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJfcmFtLmggYi9saWJTQlJkZWMvc3JjL3Nicl9yYW0uaAppbmRleCA3YWI1MDQ0Li5lMDBmOGI1IDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9yYW0uaAorKysgYi9saWJTQlJkZWMvc3JjL3Nicl9yYW0uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw2NiArOTAsODYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKIFxmaWxlCiBcYnJpZWYgTWVtb3J5IGxheW91dAotIAogKi8KLSNpZm5kZWYgX1NCUl9SQU1fSF8KLSNkZWZpbmUgX1NCUl9SQU1fSF8KKyNpZm5kZWYgU0JSX1JBTV9ICisjZGVmaW5lIFNCUl9SQU1fSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogCiAjaW5jbHVkZSAiZW52X2V4dHIuaCIKICNpbmNsdWRlICJzYnJfZGVjLmgiCiAKKyNkZWZpbmUgU0JSREVDX01BWF9DSF9QRVJfRUxFTUVOVCAoMikKIAorI2RlZmluZSBGUkFNRV9PSyAoMCkKKyNkZWZpbmUgRlJBTUVfRVJST1IgKDEpCisjZGVmaW5lIEZSQU1FX0VSUk9SX0FMTFNMT1RTICgyKQogCi0jZGVmaW5lIFNCUkRFQ19NQVhfQ0hfUEVSX0VMRU1FTlQgICgyKQordHlwZWRlZiBzdHJ1Y3QgeworICBTQlJfQ0hBTk5FTCAqcFNickNoYW5uZWxbU0JSREVDX01BWF9DSF9QRVJfRUxFTUVOVF07CisgIFRSQU5TUE9TRVJfU0VUVElOR1MKKyAgdHJhbnNwb3NlclNldHRpbmdzOyAvKiBDb21tb24gdHJhbnNwb3J0IHNldHRpbmdzIGZvciBlYWNoIGluZGl2aWR1YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIG9mIGFuIGVsZW1lbnQgKi8KKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzOwogCi10eXBlZGVmIHN0cnVjdAotewotICBTQlJfQ0hBTk5FTCAgICAgICAgICAqcFNickNoYW5uZWxbU0JSREVDX01BWF9DSF9QRVJfRUxFTUVOVF07Ci0gIFRSQU5TUE9TRVJfU0VUVElOR1MgICB0cmFuc3Bvc2VyU2V0dGluZ3M7IC8qIENvbW1vbiB0cmFuc3BvcnQgc2V0dGluZ3MgZm9yIGVhY2ggaW5kaXZpZHVhbCBjaGFubmVsIG9mIGFuIGVsZW1lbnQgKi8KLSAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCczsKKyAgTVA0X0VMRU1FTlRfSUQKKyAgZWxlbWVudElEOyAgICAgLyogRWxlbWVudCBJRCBzZXQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBDYW4gYmUgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgY29uY2VhbG1lbnQgKi8KKyAgaW50IG5DaGFubmVsczsgLyogTnVtYmVyIG9mIGVsZW1lbnRzIG91dHB1dCBjaGFubmVscyAoPTIgaW4gY2FzZSBvZiBQUykgKi8KIAotICBNUDRfRUxFTUVOVF9JRCAgICAgICAgZWxlbWVudElEOyAgICAgICAgICAvKiBFbGVtZW50IElEIHNldCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIENhbiBiZSB1c2VkIGZvciBjb25jZWFsbWVudCAqLwotICBpbnQgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzOyAgICAgICAgICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgb3V0cHV0IGNoYW5uZWxzICg9MiBpbiBjYXNlIG9mIFBTKSAqLworICBVQ0hBUiBmcmFtZUVycm9yRmxhZ1soMSkgKyAxXTsgLyogRnJhbWUgZXJyb3Igc3RhdHVzIChmb3IgZXZlcnkgc2xvdCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5IGxpbmUpLiBXaWxsIGJlIGNvcGllZCBpbnRvIGhlYWRlciBhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIGRlY29kZUVsZW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZS4gKi8KIAotICBVQ0hBUiBmcmFtZUVycm9yRmxhZ1soMSkrMV07ICAvKiBGcmFtZSBlcnJvciBzdGF0dXMgKGZvciBldmVyeSBzbG90IGluIHRoZSBkZWxheSBsaW5lKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWxsIGJlIGNvcGllZCBpbnRvIGhlYWRlciBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgZGVjb2RlRWxlbWVudCgpIHJvdXRpbmUuICovCi0KLSAgVUNIQVIgdXNlRnJhbWVTbG90OyAgICAgICAgICAvKiBJbmRleCB3aGljaCBkZWZpbmVzIHdoaWNoIHNsb3Qgd2lsbCBiZSBkZWNvZGVkL2ZpbGxlZCBuZXh0ICh1c2VkIHdpdGggYWRkaXRpb25hbCBkZWxheSkgKi8KLSAgVUNIQVIgdXNlSGVhZGVyU2xvdFsoMSkrMV07ICAgLyogSW5kZXggYXJyYXkgdGhhdCBwcm92aWRlcyB0aGUgbGluayBiZXR3ZWVuIGhlYWRlciBhbmQgZnJhbWUgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbXBvcnRhbnQgd2hlbiBwcm9jZXNzaW5nIHdpdGggYWRkaXRpb25hbCBkZWxheSkuICovCisgIFVDSEFSIHVzZUZyYW1lU2xvdDsgLyogSW5kZXggd2hpY2ggZGVmaW5lcyB3aGljaCBzbG90IHdpbGwgYmUgZGVjb2RlZC9maWxsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ICh1c2VkIHdpdGggYWRkaXRpb25hbCBkZWxheSkgKi8KKyAgVUNIQVIgdXNlSGVhZGVyU2xvdFsoMSkgKyAxXTsgLyogSW5kZXggYXJyYXkgdGhhdCBwcm92aWRlcyB0aGUgbGluayBiZXR3ZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciBhbmQgZnJhbWUgZGF0YSAoaW1wb3J0YW50IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyB3aXRoIGFkZGl0aW9uYWwgZGVsYXkpLiAqLwogfSBTQlJfREVDT0RFUl9FTEVNRU5UOwogCitzdHJ1Y3QgU0JSX0RFQ09ERVJfSU5TVEFOQ0UgeworICBTQlJfREVDT0RFUl9FTEVNRU5UICpwU2JyRWxlbWVudFsoOCldOworICBTQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyWygKKyAgICAgIDgpXVsoMSkgKyAxXTsgLyogU2JyIGhlYWRlciBmb3IgZWFjaCBpbmRpdmlkdWFsIGNoYW5uZWwgb2YgYW4gZWxlbWVudCAqLwogCi1zdHJ1Y3QgU0JSX0RFQ09ERVJfSU5TVEFOQ0UKLXsKLSAgU0JSX0RFQ09ERVJfRUxFTUVOVCAgKnBTYnJFbGVtZW50Wyg4KV07Ci0gIFNCUl9IRUFERVJfREFUQSAgICAgICBzYnJIZWFkZXJbKDgpXVsoMSkrMV07ICAgICAgLyogU2JyIGhlYWRlciBmb3IgZWFjaCBpbmRpdmlkdWFsIGNoYW5uZWwgb2YgYW4gZWxlbWVudCAqLworICBIQU5ETEVfRkRLX1FNRl9ET01BSU4gcFFtZkRvbWFpbjsKIAotICBGSVhQX0RCTCAqd29ya0J1ZmZlcjE7Ci0gIEZJWFBfREJMICp3b3JrQnVmZmVyMjsKLQotICBIQU5ETEVfUFNfREVDICBoUGFyYW1ldHJpY1N0ZXJlb0RlYzsKKyAgSEFORExFX1BTX0RFQyBoUGFyYW1ldHJpY1N0ZXJlb0RlYzsKIAogICAvKiBHbG9iYWwgcGFyYW1ldGVycyAqLwogICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWM7IC8qIEFPVCBvZiBjb3JlIGNvZGVjICovCiAgIGludCBudW1TYnJFbGVtZW50czsKICAgaW50IG51bVNickNoYW5uZWxzOwotICBJTlQgc2FtcGxlUmF0ZUluOyAgICAgICAgICAgIC8qIFNCUiBkZWNvZGVyIGlucHV0IHNhbXBsaW5nIHJhdGU7IG1pZ2h0IGJlIGRpZmZlcmVudCB0aGFuIHRoZSB0cmFuc3Bvc2VyIGlucHV0IHNhbXBsaW5nIHJhdGUuICovCi0gIElOVCBzYW1wbGVSYXRlT3V0OyAgICAgICAgICAgLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgU0JSIGRlY29kZXIgb3V0cHV0IGF1ZGlvIHNhbXBsZXMuICovCisgIElOVCBzYW1wbGVSYXRlSW47ICAvKiBTQlIgZGVjb2RlciBpbnB1dCBzYW1wbGluZyByYXRlOyBtaWdodCBiZSBkaWZmZXJlbnQgdGhhbgorICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRyYW5zcG9zZXIgaW5wdXQgc2FtcGxpbmcgcmF0ZS4gKi8KKyAgSU5UIHNhbXBsZVJhdGVPdXQ7IC8qIFNhbXBsaW5nIHJhdGUgb2YgdGhlIFNCUiBkZWNvZGVyIG91dHB1dCBhdWRpbyBzYW1wbGVzLgorICAgICAgICAgICAgICAgICAgICAgICovCiAgIFVTSE9SVCBjb2RlY0ZyYW1lU2l6ZTsKICAgVUNIQVIgc3luRG93bnNhbXBsZUZhYzsKLSAgVUNIQVIgbnVtRGVsYXlGcmFtZXM7ICAgICAgICAvKiBUaGUgY3VycmVudCBudW1iZXIgb2YgYWRkaXRpb25hbCBkZWxheSBmcmFtZXMgdXNlZCBmb3IgcHJvY2Vzc2luZy4gKi8KLSAgVUNIQVIgbnVtRmx1c2hlZEZyYW1lczsgICAgICAvKiBUaGUgdmFyaWFibGUgY291bnRzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHdoaWNoIGFyZSBmbHVzaGVkIGNvbnNlY3V0aXZlbHkuICovCisgIElOVCBkb3duc2NhbGVGYWN0b3I7CisgIFVDSEFSIG51bURlbGF5RnJhbWVzOyAvKiBUaGUgY3VycmVudCBudW1iZXIgb2YgYWRkaXRpb25hbCBkZWxheSBmcmFtZXMgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHByb2Nlc3NpbmcuICovCisgIFVDSEFSIGhhcm1vbmljU0JSOworICBVQ0hBUgorICBudW1GbHVzaGVkRnJhbWVzOyAvKiBUaGUgdmFyaWFibGUgY291bnRzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHdoaWNoIGFyZQorICAgICAgICAgICAgICAgICAgICAgICBmbHVzaGVkIGNvbnNlY3V0aXZlbHkuICovCiAKICAgVUlOVCBmbGFnczsKLQogfTsKIAogSF9BTExPQ19NRU0oUmFtX1NickRlY0VsZW1lbnQsIFNCUl9ERUNPREVSX0VMRU1FTlQpCkBAIC0xNDgsMTIgKzE3OSw4IEBACiBIX0FMTE9DX01FTShSYW1fc2JyX1FtZlN0YXRlc1N5bnRoZXNpcywgRklYUF9RU1MpCiBIX0FMTE9DX01FTShSYW1fc2JyX092ZXJsYXBCdWZmZXIsIEZJWFBfREJMKQogCitIX0FMTE9DX01FTShSYW1fc2JyX0hCRU92ZXJsYXBCdWZmZXIsIEZJWFBfREJMKQogCiBIX0FMTE9DX01FTShSYW1fcHNfZGVjLCBQU19ERUMpCiAKLQotSF9BTExPQ19NRU1fT1ZFUkxBWShSYW1fU2JyRGVjV29ya0J1ZmZlcjEsIEZJWFBfREJMKQotSF9BTExPQ19NRU1fT1ZFUkxBWShSYW1fU2JyRGVjV29ya0J1ZmZlcjIsIEZJWFBfREJMKQotCi0KLSNlbmRpZiAvKiBfU0JSX1JBTV9IXyAqLworI2VuZGlmIC8qIFNCUl9SQU1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJfcm9tLmNwcCBiL2xpYlNCUmRlYy9zcmMvc2JyX3JvbS5jcHAKaW5kZXggNGYyY2M0OC4uOGE2Njg4YSAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJfcm9tLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL3Nicl9yb20uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQxICs5MCw3MSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQogICBcYnJpZWYgIERlZmluaXRpb24gb2YgY29uc3RhbnQgdGFibGVzCi0gICAKIAogICBUaGlzIG1vZHVsZSBjb250YWlucyBtb3N0IG9mIHRoZSBjb25zdGFudCBkYXRhIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiBST00uCiAqLwogCiAjaW5jbHVkZSAic2JyX3JvbS5oIgogCi0KLQotCiAvKiEKICAgXG5hbWUgICBTdGFydFN0b3BCYW5kcwogICBcYnJpZWYgIFN0YXJ0IGFuZCBzdG9wIHN1YmJhbmRzIG9mIHRoZSBoaWdoYmFuZC4KIAogICBrX28gPSBzdGFydE1pbiArIG9mZnNldFtic19zdGFydF9mcmVxXTsKLSAgc3RhcnRNaW4gPSB7MzAwMCw0MDAwLDUwMDB9ICogKDEyOC9GU19zYnIpIC8gRlNfc2JyIDwgMzJLaHosIDMyS2h6IDw9IEZTX3NiciA8IDY0S0h6LCA2NEtIeiA8PSBGU19zYnIKLSAgVGhlIHN0b3Agc3ViYmFuZCBjYW4gYWxzbyBiZSBjYWxjdWxhdGVkIHRvIHNhdmUgbWVtb3J5IGJ5IGRlZmluaW5nICNDQUxDX1NUT1BfQkFORC4KKyAgc3RhcnRNaW4gPSB7MzAwMCw0MDAwLDUwMDB9ICogKDEyOC9GU19zYnIpIC8gRlNfc2JyIDwgMzJLaHosIDMyS2h6IDw9IEZTX3NiciA8CisgIDY0S0h6LCA2NEtIeiA8PSBGU19zYnIgVGhlIHN0b3Agc3ViYmFuZCBjYW4gYWxzbyBiZSBjYWxjdWxhdGVkIHRvIHNhdmUgbWVtb3J5CisgIGJ5IGRlZmluaW5nICNDQUxDX1NUT1BfQkFORC4KICovCiAvL0B7Ci1jb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xNlsxNl0gPSB7MTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzF9OwotY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMjJbMTZdID0gezEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNiwgMjgsIDMwfTsKLWNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzI0WzE2XSA9IHsxMSwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNSwgMjcsIDI5LCAzMn07Ci1jb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8zMlsxNl0gPSB7MTAsIDEyLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjUsIDI3LCAyOSwgMzJ9OwotY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDBbMTZdID0gezEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjQsIDI2LCAyOCwgMzAsIDMyfTsKLWNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQ0WzE2XSA9IHsgOCwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIxLCAyMywgMjUsIDI4LCAzMn07Ci1jb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80OFsxNl0gPSB7IDcsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAyMCwgMjIsIDI0LCAyNywgMzF9OwotY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNjRbMTZdID0geyA2LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTksIDIxLCAyMywgMjYsIDMwfTsKLWNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzg4WzE2XSA9IHsgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTYsIDE4LCAyMCwgMjMsIDI3LCAzMX07Ci0vL0B9CisvKiB0YWJsZXMgd2VyZSBjcmVhdGVkIHdpdGggLi4vYWRkb24vb2N0YXZlL3Nicl9zdGFydF9mcmVxX3RhYmxlLm0gKi8KK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzE2W11bMTZdID0geworICAgIHsxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMX0sCisgICAgezQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5fX07Citjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8yMltdWzE2XSA9IHsKKyAgICB7MTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI2LCAyOCwgMzB9LAorICAgIHs0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTgsIDIwLCAyMn19OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMjRbXVsxNl0gPSB7CisgICAgezExLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI1LCAyNywgMjksIDMyfSwKKyAgICB7MywgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTcsIDE5LCAyMSwgMjR9fTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzMyW11bMTZdID0geworICAgIHsxMCwgMTIsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNSwgMjcsIDI5LCAzMn0sCisgICAgezIsIDQsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE3LCAxOSwgMjEsIDI0fX07Citjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80MFtdWzE2XSA9IHsKKyAgICB7MTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyNCwgMjYsIDI4LCAzMCwgMzJ9LAorICAgIHs1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNywgMTksIDIxLCAyMywgMjV9fTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQ0W11bMTZdID0geworICAgIHs4LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjEsIDIzLCAyNSwgMjgsIDMyfSwKKyAgICB7MiwgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE1LCAxNywgMTksIDIyLCAyNn19OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDhbXVsxNl0gPSB7CisgICAgezcsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDIwLCAyMiwgMjQsIDI3LCAzMX0sCisgICAgezEsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDE0LCAxNiwgMTgsIDIxLCAyNX19OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNjRbXVsxNl0gPSB7CisgICAgezYsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTksIDIxLCAyMywgMjYsIDMwfSwKKyAgICB7MSwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTQsIDE2LCAxOCwgMjEsIDI1fX07Citjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV84OFtdWzE2XSA9IHsKKyAgICB7NSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTgsIDIwLCAyMywgMjcsIDMxfSwKKyAgICB7MiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAyMCwgMjQsIDI4fX07Citjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xOTJbMTZdID0geworICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMiwgMTQsIDE2LCAxOSwgMjMsIDI3fTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzE3NlsxNl0gPSB7CisgICAgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAyMCwgMjQsIDI4fTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzEyOFsxNl0gPSB7CisgICAgMSwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTQsIDE2LCAxOCwgMjEsIDI1fTsKIAorLy9AfQogCiAvKiEKICAgXG5hbWUgICBXaGl0ZW5pbmcKQEAgLTEyMiwxNiArMTYzLDcgQEAKIC8vQHsKIC8qISBBc3NpZ25tZW50IG9mIHdoaXRlbmluZyB0dW5pbmcgZGVwZW5kaW5nIG9uIHRoZSBjcm9zc292ZXIgZnJlcXVlbmN5ICovCiBjb25zdCBVU0hPUlQgRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc0luZGV4W05VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTXSA9IHsKLSAgMCwKLSAgNTAwMCwKLSAgNjAwMCwKLSAgNjUwMCwKLSAgNzAwMCwKLSAgNzUwMCwKLSAgODAwMCwKLSAgOTAwMCwKLSAgMTAwMDAKLX07CisgICAgMCwgNTAwMCwgNjAwMCwgNjUwMCwgNzAwMCwgNzUwMCwgODAwMCwgOTAwMCwgMTAwMDB9OwogCiAvKiEKICAgXGJyaWVmIFdoaXRoZW5pbmcgbGV2ZWxzIHR1bmluZyB0YWJsZQpAQCAtMTQyLDIzICsxNzQsMzEgQEAKICAgXGxpICB0aGUgZmlyc3QgY29sb3VtbiBjYW4gYmUgZWxpbWluYXRlZC4KIAogKi8KLWNvbnN0IEZJWFBfREJMIEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNUYWJsZVtOVU1fV0hGQUNUT1JfVEFCTEVfRU5UUklFU11bNl0gPSB7Ci0gIC8qIE9GRl9MRVZFTCwgVFJBTlNJVElPTl9MRVZFTCwgTE9XX0xFVkVMLCBNSURfTEVWRUwsIEhJR0hfTEVWRUwgKi8KLSAgeyAgRkwyRlhDT05TVF9EQkwoMC4wMGYpLCBGTDJGWENPTlNUX0RCTCgwLjZmKSwgRkwyRlhDT05TVF9EQkwoMC43NWYpLCBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sICAvKiA8IDUwMDAgKi8KLSAgeyAgRkwyRlhDT05TVF9EQkwoMC4wMGYpLCBGTDJGWENPTlNUX0RCTCgwLjZmKSwgRkwyRlhDT05TVF9EQkwoMC43NWYpLCBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sICAvKiA1MDAwIDwgNjAwMCAqLwotICB7ICBGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgIC8qIDYwMDAgPCA2NTAwICovCi0gIHsgIEZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwgRkwyRlhDT05TVF9EQkwoMC45MGYpLCBGTDJGWENPTlNUX0RCTCgwLjk4Zil9LCAgLyogNjUwMCA8IDcwMDAgKi8KLSAgeyAgRkwyRlhDT05TVF9EQkwoMC4wMGYpLCBGTDJGWENPTlNUX0RCTCgwLjZmKSwgRkwyRlhDT05TVF9EQkwoMC43NWYpLCBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sICAvKiA3MDAwIDwgNzUwMCAqLwotICB7ICBGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgIC8qIDc1MDAgPCA4MDAwICovCi0gIHsgIEZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwgRkwyRlhDT05TVF9EQkwoMC45MGYpLCBGTDJGWENPTlNUX0RCTCgwLjk4Zil9LCAgLyogODAwMCA8IDkwMDAgKi8KLSAgeyAgRkwyRlhDT05TVF9EQkwoMC4wMGYpLCBGTDJGWENPTlNUX0RCTCgwLjZmKSwgRkwyRlhDT05TVF9EQkwoMC43NWYpLCBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sICAvKiA5MDAwIDwgMTAwMDAgKi8KLSAgeyAgRkwyRlhDT05TVF9EQkwoMC4wMGYpLCBGTDJGWENPTlNUX0RCTCgwLjZmKSwgRkwyRlhDT05TVF9EQkwoMC43NWYpLCBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sICAvKiA+IDEwMDAwICovCitjb25zdCBGSVhQX0RCTAorICAgIEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNUYWJsZVtOVU1fV0hGQUNUT1JfVEFCTEVfRU5UUklFU11bNl0gPSB7CisgICAgICAgIC8qIE9GRl9MRVZFTCwgVFJBTlNJVElPTl9MRVZFTCwgTE9XX0xFVkVMLCBNSURfTEVWRUwsIEhJR0hfTEVWRUwgKi8KKyAgICAgICAge0ZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwKKyAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgLyogPCA1MDAwICovCisgICAgICAgIHtGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksCisgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sIC8qIDUwMDAgPCA2MDAwICovCisgICAgICAgIHtGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksCisgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sIC8qIDYwMDAgPCA2NTAwICovCisgICAgICAgIHtGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksCisgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sIC8qIDY1MDAgPCA3MDAwICovCisgICAgICAgIHtGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksCisgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sIC8qIDcwMDAgPCA3NTAwICovCisgICAgICAgIHtGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksCisgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sIC8qIDc1MDAgPCA4MDAwICovCisgICAgICAgIHtGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksCisgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sIC8qIDgwMDAgPCA5MDAwICovCisgICAgICAgIHtGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksCisgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sIC8qIDkwMDAgPCAxMDAwMCAqLworICAgICAgICB7RkwyRlhDT05TVF9EQkwoMC4wMGYpLCBGTDJGWENPTlNUX0RCTCgwLjZmKSwgRkwyRlhDT05TVF9EQkwoMC43NWYpLAorICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC45MGYpLCBGTDJGWENPTlNUX0RCTCgwLjk4Zil9LCAvKiA+IDEwMDAwICovCiB9OwogCi0KIC8vQH0KIAotCiAvKiEKICAgXG5hbWUgICBFbnZBZGoKICAgXGJyaWVmICBDb25zdGFudHMgYW5kIHRhYmxlcyB1c2VkIGZvciBlbnZlbG9wZSBhZGp1c3RtZW50CkBAIC0xNjYsNTY1ICsyMDYsMTA2NSBAQAogLy9AewogCiAvKiEgTWFudGlzc2FzIG9mIGdhaW4gbGltaXRzICovCi1jb25zdCBGSVhQX1NHTCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfbVs0XSA9Ci17Ci0gIEZMMkZYQ09OU1RfU0dMKDAuNTAxMTkzMjAyNWYpLCAgIC8qITwgLTMgZEIuIEdhaW4gbGltaXQgd2hlbiBsaW1pdGVyR2FpbnMgaW4gZnJhbWVEYXRhIGlzIDAgKi8KLSAgRkwyRlhDT05TVF9TR0woMC41ZiksICAgICAgICAgICAgLyohPCAwIGRCLiAgR2FpbiBsaW1pdCB3aGVuIGxpbWl0ZXJHYWlucyBpbiBmcmFtZURhdGEgaXMgMSAqLwotICBGTDJGWENPTlNUX1NHTCgwLjk5NzYzNDYyNThmKSwgICAvKiE8ICszIGRCLiBHYWluIGxpbWl0IHdoZW4gbGltaXRlckdhaW5zIGluIGZyYW1lRGF0YSBpcyAyICovCi0gIEZMMkZYQ09OU1RfU0dMKDAuNjc3NjI2MzU3OGYpICAgIC8qITwgSW5mLiAgIEdhaW4gbGltaXQgd2hlbiBsaW1pdGVyR2FpbnMgaW4gZnJhbWVEYXRhIGlzIDMgKi8KK2NvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX3Nicl9saW1HYWluc19tWzRdID0geworICAgIEZMMkZYQ09OU1RfU0dMKDAuNTAxMTkzMjAyNWYpLCAvKiE8IC0zIGRCLiBHYWluIGxpbWl0IHdoZW4gbGltaXRlckdhaW5zIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGF0YSBpcyAwICovCisgICAgRkwyRlhDT05TVF9TR0woCisgICAgICAgIDAuNWYpLCAvKiE8IDAgZEIuICBHYWluIGxpbWl0IHdoZW4gbGltaXRlckdhaW5zIGluIGZyYW1lRGF0YSBpcyAxICovCisgICAgRkwyRlhDT05TVF9TR0woMC45OTc2MzQ2MjU4ZiksIC8qITwgKzMgZEIuIEdhaW4gbGltaXQgd2hlbiBsaW1pdGVyR2FpbnMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEYXRhIGlzIDIgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgwLjY3NzYyNjM1NzhmKSAgLyohPCBJbmYuICAgR2FpbiBsaW1pdCB3aGVuIGxpbWl0ZXJHYWlucyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZURhdGEgaXMgMyAqLwogfTsKIAogLyohIEV4cG9uZW50cyBvZiBnYWluIGxpbWl0cyAqLwotY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX2VbNF0gPQotewotICAwLCAxLCAxLCA2NwotfTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9saW1HYWluc19lWzRdID0gezAsIDEsIDEsIDY3fTsKIAogLyohIENvbnN0YW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZiBsaW1pdGVyIGJhbmRzICovCi1jb25zdCBGSVhQX1NHTCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltaXRlckJhbmRzUGVyT2N0YXZlRGl2NFs0XSA9Ci17Ci0gIEZMMkZYQ09OU1RfU0dMKDEuMGYgLyA0LjBmKSwKLSAgRkwyRlhDT05TVF9TR0woMS4yZiAvIDQuMGYpLAotICBGTDJGWENPTlNUX1NHTCgyLjBmIC8gNC4wZiksCi0gIEZMMkZYQ09OU1RfU0dMKDMuMGYgLyA0LjBmKQotfTsKK2NvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX3Nicl9saW1pdGVyQmFuZHNQZXJPY3RhdmVEaXY0WzRdID0geworICAgIEZMMkZYQ09OU1RfU0dMKDEuMGYgLyA0LjBmKSwgRkwyRlhDT05TVF9TR0woMS4yZiAvIDQuMGYpLAorICAgIEZMMkZYQ09OU1RfU0dMKDIuMGYgLyA0LjBmKSwgRkwyRlhDT05TVF9TR0woMy4wZiAvIDQuMGYpfTsKIAogLyohIENvbnN0YW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZiBsaW1pdGVyIGJhbmRzICovCi1jb25zdCBGSVhQX0RCTCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltaXRlckJhbmRzUGVyT2N0YXZlRGl2NF9EQkxbNF0gPQotewotICBGTDJGWENPTlNUX0RCTCgxLjBmIC8gNC4wZiksCi0gIEZMMkZYQ09OU1RfREJMKDEuMmYgLyA0LjBmKSwKLSAgRkwyRlhDT05TVF9EQkwoMi4wZiAvIDQuMGYpLAotICBGTDJGWENPTlNUX0RCTCgzLjBmIC8gNC4wZikKLX07Citjb25zdCBGSVhQX0RCTCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltaXRlckJhbmRzUGVyT2N0YXZlRGl2NF9EQkxbNF0gPSB7CisgICAgRkwyRlhDT05TVF9EQkwoMS4wZiAvIDQuMGYpLCBGTDJGWENPTlNUX0RCTCgxLjJmIC8gNC4wZiksCisgICAgRkwyRlhDT05TVF9EQkwoMi4wZiAvIDQuMGYpLCBGTDJGWENPTlNUX0RCTCgzLjBmIC8gNC4wZil9OwogCi0vKiEgUmF0aW8gb2Ygb2xkIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgZm9yIHRoZSBmaXJzdCA0IHRpbWVzbG90cyBvZiBhbiBlbnZlbG9wZSAqLworLyohIFJhdGlvIG9mIG9sZCBnYWlucyBhbmQgbm9pc2UgbGV2ZWxzIGZvciB0aGUgZmlyc3QgNCB0aW1lc2xvdHMgb2YgYW4gZW52ZWxvcGUKKyAqLwogY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX3Ntb290aEZpbHRlcls0XSA9IHsKLSAgRkwyRlhDT05TVF9TR0woMC42NjY2NjY2NjY2NjY2NmYpLAotICBGTDJGWENPTlNUX1NHTCgwLjM2NTE2MzgzNDI3MDg0ZiksCi0gIEZMMkZYQ09OU1RfU0dMKDAuMTQ2OTk0MzM1MjA4MzVmKSwKLSAgRkwyRlhDT05TVF9TR0woMC4wMzE4MzA1MDA5Mzc1MWYpCi19OwotCisgICAgRkwyRlhDT05TVF9TR0woMC42NjY2NjY2NjY2NjY2NmYpLCBGTDJGWENPTlNUX1NHTCgwLjM2NTE2MzgzNDI3MDg0ZiksCisgICAgRkwyRlhDT05TVF9TR0woMC4xNDY5OTQzMzUyMDgzNWYpLCBGTDJGWENPTlNUX1NHTCgwLjAzMTgzMDUwMDkzNzUxZil9OwogCiAvKiEgUmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnQgb2YgcmFuZG9tIG5vaXNlIHdoaWNoIHdpbGwgYmUgbW9kdWxhdGVkCiAgIHRvIHRoZSBkZXNpcmVkIGxldmVsLiBBbiBhY2N1cmFjeSBvZiAxMyBiaXRzIGlzIHN1ZmZpY2llbnQgZm9yIHRoZXNlCiAgIHJhbmRvbSBudW1iZXJzLgogKi8KIGNvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtTQlJfTkZfTk9fUkFORE9NX1ZBTF1bMl0gPSB7Ci0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk5NDgxNTMyNzgyOTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTk0ODM0MTc1MTY2MDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk3MTEzNDU0MzkzOTkxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjY3NTI4NTE1MjI1NjQ3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4xNDEzMDA1MTc1ODQ4N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NTA5MDk4MzU3NTY4OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDcwMDU0OTY3MDE2OTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzczNDA1NDk3Mjg2NDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgwNzA1MDYzNzY5MzUxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjI5NjUzNjY4Mjg0NDA4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zODk4MTQ3ODg5NjkyNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44OTU3MjYwNTcxNzA4N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDEwNTMwNDk4NjIwMjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjY5NTkwNTgwMzYxNjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkxMjY2MzY3OTU3MjkzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjExNTIyOTM4MTQwMDM0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC41NDg0MDQyMjkxMDMwOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43NTIyMTM2NzE3NjMwMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNDAwMDkyNTI4Njc5NTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg5Mjk0MDAzMzQ0MjFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5ODY3OTc0NzExODU1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg4MTQ3MDY4NjQ1MzU4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NTUzMTA3NjgwNTA0MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MDkwODc1NzE1NDU5M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDU3MjU5MzMzMTcxNDRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTY3MTYzMjM2NDY3NjBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjcyOTI5Njc1MDI5Mjc1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk4MDA4MjcyNzI3MzI0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43NTYyMjgwMTM5OTAzNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yMDk1MDMyOTk5NTU0OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMDcwNjk0NDI2MDEwNTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzgyNDc4OTg0NzA3MDZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc0NDk2MjUyOTI2MDU1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkxMTY5MDA0NDQ1ODA3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NjQ0MDE4MjcwMzg1NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NDczOTkxODI5NjYyMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMzA0MjQ2MjkzNjk1MzlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNDk0MzgyNjcwMTI0NzlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY2NTY1MDMzNzQ2OTI1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY0NjUyOTM1NTQyNDkxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45MTY5NzAwODAyMDU5NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xNzUxNDA5NzMzMjAwOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzA3NzQ5MTg3NjA0MjdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTI1NDg2NTM0MTY1NDNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjcwMDUxNDE1MzQ1NTYwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ1MzQwMDI4ODA4NzYzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTQ5NjUxMzA1NDc5N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MDA3MTkwODA2Njk3M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTgxNjQ0OTA3OTAxMjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzc0NjMxNTU1Mjg2OTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjU0NjcxNTgwNTQ4MTgxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjAyNTcwOTI4NTM2MDA0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wMTY4OTYyOTA2NTM4OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMDI4NzUwNjQ0NTczMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODYxMTAzNDk1MzE5ODZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDI1NDg1ODM3MjY0NzdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk4ODkyOTgwNTg2MDMyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg3ODgxMTMyMjY3NTU2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC41MTc1NjYyNzY3ODY5MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42NjkyNjc4NDcxMDEzOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk2MzUwMjY0MDk2NDBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTgxMDc3MzA1NzQ3NjVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5OTY5MzcwODYyMTYzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk4MzY5OTg5MzYwMjUwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC41NTI2NjI1ODYyNzE5NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41OTQ0OTA1NzQ2NTU5MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMzQ1ODExNzc3NDE2NzNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTQ4Nzk0MjEwNjE4NjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjYyNjY0MjA5NTc3OTk5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc0NDAyOTcwOTA2NDcxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43NzE0OTcwMTQwNDk3M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zMzg4MzY1ODA0MjgwMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTE1OTIyNDQyNTQ0MzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDM2ODc5MDEzNzY3MTNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc2Mjg1NDkyMzU3ODg3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkxMzcxODY3OTE5MTI0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43OTc4ODMzNzE5NTMzMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MzE4MDk3MTE5OTg0OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNTQ0NzMwODA2MTAyMDBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTE5MTkyMDYwMzcxODZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg1NjM5MjgxNjcxMDU4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQyNDI5ODU0NzYwNDUxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45Mjg4MjQwMjk3MTQyM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yNzg3MTgwOTA3ODYwOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMTE3MDgzNzEwNDY3NzRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk4MDA4NDM0NDQ5NjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjIxMzU2NzQ5ODE3NDkzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkwNzE2Mjk1NjI3MDMzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43NjE5MTY5MjU3MzkwOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTc2ODExODM1NjI2NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTgxMTEwNDMxMDA4ODRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTU4NTQ0NTk3MzQ0MDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg1OTEzMjY5ODk1NTcyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk1NzY2NTY2MTY4ODgwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45MzMwNzI0MjI1MzY5MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40OTQzMTc1NzY5NjQ2NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMzA0ODU3NTQ4Nzk2MzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzA1NDAwMzQzNTc1MjlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg1Mjg5NjUwOTI1MTkwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ2NzY2MTMxNzkxMDQ0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45MTMyODA4MjYxODEyNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTgzOTU5NzM2MTc2OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDU4OTAxOTk5MjQxNTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzA3NDE4Mjc4MTk0OTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjI4Mzk4Njg2MTUwMTQ4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM0NjMzNTU1NzAyMTg4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NTI1ODE2NDUzOTYxMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41NDg5MzQxNjAyNjkzOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzg1NjYzMjQxNjg1MDdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzU1Njg1NDEwNzk2OTFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1Nzg5NDk1NDQ3ODc3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjIwNDIzMTk0Njk2OTY2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44MjQxMTE1ODcxMTE5N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjY1NDYxODQzMjU2MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjUxODU0NDY3MzU4ODVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODg3MzQ5OTA3NzMyODlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkzNjQzNjAzMTM0NjY2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5ODcwNzkwNDQyMzg1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45MTQyNzE1OTUyOTYxOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45ODI5MDUwNTU0NDQ0NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzAzOTU2ODQwMzY4ODZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTg3OTY3OTgyMjEwMzlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjAwNTYzNzcxOTY5MzY1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjYxNzY4MTk2NzI3MjQ0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44OTA2NTA1MTkzMTg5NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41Mjc4MzM1MjY5NzU4NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjg2ODM3MDc3MTI3NjJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODA4MDY5NDQ3MTAzMzlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjcyMTY1MzQyNTE4NzE4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjY5MjU5ODU3MzQ5NTY0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42MjkyODI0NzczMDY2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xMzYyNzAzNzQwNzMzNWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMjk5Mzg0MzQwNjU1MTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNDYwNTEzMjk2ODIyNDZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkxNzgxOTU4ODc5MjgwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc0MDEyNzE2Njg0MTg2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTI5ODcxNzA0MzY4OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40MDgxNjYxMDA3NTY2MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODIzNjgyOTg2MjI3NDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzQwMzYwNDcxOTAxNzNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk4NTEyODMzMzg2ODMzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5OTcyMzMwNzA5NTk0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NTkxNTM2ODI0MjI1N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTIzNzgwMDQ2NjA0MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjE0MTExMjY1NzI3OTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTM0MjQ4MTkwNTI1NDVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY4ODIxNDc2MTA2ODg0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI2ODkyMzA2MzE1NDU3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45MTg1MTk5Nzk4MjMxN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wOTM1ODIyODkwMTc4NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTYwNjI3Njk1NTkxMjdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzYwOTkwOTUxMzM3MzlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjUxNjQ2MTg0OTIyMjg3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjcxMzczMzMyODczOTE3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC42MTEzMDcyMTEzOTY2OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40Njk1MDE0MTE3NTkxN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNDczMzYxMjkzNzEyOTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjczMzMxNzgyOTYxNjJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkwOTk4MzA4NzAzNTE5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2NzE1NjYyOTM4MTMyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40NDg0NDc5OTE5NDM1N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTIxMTU3NDYyODMwNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjY2MTQ4OTEwNzkwOTJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTY1OTAxNzYxNjkxMjFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc0OTIyMjM5MTI5MjM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg5ODc5ODU4ODI2MDg3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTU3MTU4ODUwNjQ4NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41Mjc4NTUyMTQ5NDM0OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTc0MDEwODI0Nzc1NjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTY4NTU4NzAwNzUxOTBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjcyNjgzNzQ3NzMzODc5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ4MDYwNzc0NDMyMjUxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NTQzMjE5MzQ1NzEyOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42ODg0OTYwMzQwODQ0MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzI5NjIyMDg0MjUxOTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzY2MDg0NDM0MjA5MTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg1MzU5NDc5MjMzNTM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg4NzM4MTI1OTAxNTc5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44MTQxMjQzMDMzODUzNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NzQ4MDc2ODA0OTYzN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODc5MzA3NzIzNTY3ODZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzQ3NDgzMDc2OTA0MzZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjcxNTczMzMxMDY0OTc3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk4NTcwNjA4MTc4OTIzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44MzUyNDMwMDAyODIyOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44MzcwMjUzNzA3NTE2M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDgwODYwNjU2MDE0MjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg4NDg1MDQ5MjM1MzFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk3MTM5MTI4NTc0Nzc4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgwMDkzNjIxMTk4MjM2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC41MTk5MjgyNTM0Nzg5NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44MDI0NzYzMTQwMDUxMGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDA4NDg1OTExOTUzMjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzY2NzAxMjgwMDA0ODZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjcwMjk0Mzc0MzAzMDM2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU1MzU5OTEwNDQ1NTc3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NTg5NDQyODE2ODE0MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40MzI2NTUwNDM0NDc4M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTcwNzkyNTI5NTAzMjFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDkzMjU4NTcyMzg2ODJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkyNDA0MjkzNjcwNzk3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg1NTA3NzA0MDI3ODU1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42OTUwNjQ2OTUwMDQ1MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45ODYzMzQxMjYyNTQ1OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMjY1NTkyMDM2MjAwMjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzMzMTQzMDc5NjY1MjRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjI4MDM4NDQzMzM2OTQzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjE0NTM3OTEzNjU0NDI3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43NDEzODEyNDgyNTUyM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTMxMDMzOTgwNzc2MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDE3NTI3OTU5OTU0NDRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODI2MTY2MzUyODQxNzhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjU1MTI2NzczMDk0OTMwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk4ODk4NTQzODYyMTUzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45Nzk2MDg5ODg1MDk5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NDAyMTQ0Njc1Mjg1MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTkxOTYzMDkxNDY5MzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjcwMTkwMTczNTg0NTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY3Njg0OTI4MDg1MjYwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjEyNjMxNDkxNjQ5Mzc4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wOTE0MDAzOTQ2NTUwMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yMDUzNzczMTQ1MzEwOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzE2NTg5NjU3NTE5OTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTc3ODgyMDAzOTEyMjRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgxMDE0NjQwMDc4OTI1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUzNzIyNjQ4MzYyNDQzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40MDYxNjk5MTY3MTIwNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yNjQ2OTAwODU5ODQ0OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjc2ODAxODg2ODI5NzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTQ1MDIwNTIzMzc2OTVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg2ODQ5Nzc0MzQ4NzQ5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE4MzMzNTk4NjQ3ODk5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTUwMDM4MTI4NDg1MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wMjYzNDEyMjA2ODU1MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODQzMjkxODkzNDA2NjdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTA0MDY5NTc0NjIyMTNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjA5MjE1OTY4NTMxNDQ2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY5NTQwMDEyMTAxMjUzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTk1NjE3MzMyNzIwNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xMjM1ODU0MjAwMTQwNGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzk3MzI3Nzk0NzM1MzVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTE1ODI1MjQ3MzYxNTlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk2MzQ5OTczNjQyNDA2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2NjQwNDU4MDQxMDAwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43OTk0Mjc3ODQ5NjU0N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42NDMyMzkwMjgyMjg1N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMTE1NjYwMzk4NTM4OTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMjg1ODc4NDYyNTM3MjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM5OTIyOTU0NTE0NjYyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk0MTI5NjAxNjE2OTY2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTA4OTE5NzU2NTk4N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MjA2MjYyNTU4MTU4N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMjg2MzEyODUxNzk5MDlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTEwMzUwNDcxNDM2MDNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgzMzAyNzI1NjA1NjA4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjY3MzMwNDEwODkyMDg0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NTQwNDQ0MzQwMjA3MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40OTE2Mjc2NTM5ODc0M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDY0NDk4NjM1Nzk0MzRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDMyNTA1NjA4MTMxMzVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NTc1MDU0NDg2MzExZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQyMzg5Nzg0NDY5NTA3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42NTUwMTE0Mjc5MDg0N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44MjU0NjExNDY1NTYyNGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODEyNTQ0NDE5MDg4ODdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTE2MjcyMzQ2NjA2MjlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NjQ2MzY5NDg1NDgxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg0NDkwNTMzNTIwNzUyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wMDI4Nzg0MDYwMzM0OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42NDc2ODI2MTE1ODE2NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzAxNzY5ODk0MDg0NTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjA0NTMwMjg1NzMzMjJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk2MzYxODgyMjcwMTkwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQwNzA2OTY3MTQwOTg5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42ODg4Mzc1ODE5MjQyNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MTMzODk1ODg0MDc3MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzQ4NzU1ODU1MDIyMzhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzE0NzIyOTA2OTMzMDBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxOTgwMDgxMjQzMDg3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY2NTA3NDU1NjQ0OTE5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTAwOTA0ODM0Mzg4MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44NTg2ODAyMTYwNDg0OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjg4NjU3OTE0NTgzOTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTU2NjAzMTY4MDk2NzhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NDg0NDAyMTI5MzY4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjIwMDUyNTU5MjU0OTM0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NDIxNDUxMTQwODAyM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTY5NjQyNTM2NzQ2MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjc0MTQ2MjY3OTM1NDRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDk1NDgyMjExODAwNzhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQ3MzM5MzUzNjg0NjY0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg1OTA0MzI4ODM0MDQ3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4xNDMyMzY1MTM4NzM2MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NDE0NTU5ODIyMjQ4OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjkyNjgyOTM1NzU2NzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDU3NTkyMjQ5Mjc5NTJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQzNzkzODYxNDU4NzU0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc4OTA0OTY5ODkyNzI0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zNjM0NTEyNjM3NDQ0MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42NDg3NDQzNTM1NzE2MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDg3NTA2MDQ2NTY4MjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTc2ODY5NDQzNjI1MjdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk2NDk1MjY3ODEyNTExZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjUzOTYwMzA1OTQ2NTExZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC41NTUyNjk0MDY1OTk0N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43ODg5MTUyMzczNDc3NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzM1MzgyMTU3NTI2MzBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTY0NTIwNzIzNzM0MDRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjMwODg5NzczOTE5NDM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjgwNjY0Mzg5Nzc2ODYwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wMzU3NDk5NTYyNjE5NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NzMyNTYxNjkwMDk1OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTg3MjA2ODQ2NjA0ODhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDg0MDkxMzM2OTE5NjJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgxNjg5Mjk2MjcxMjAzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkwODI3NzAzNjI4Mjk4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC42Nzg2Njg2MDExODIxNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44MTI4NDUwMzg3MDg1NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMTU4MDg1Njk3MzI1ODNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODUyNzk1NTUwMjQzODJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgwNzIzMzk1MTE0MzcxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI0NzE3NDE4NTE0NjA1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40Nzc4ODc1NzMyOTAzOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40NjMzMzE0NzgzOTI5NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTYzNjc1NTQ3NjMyMDFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzg0ODY3NDkzMDMyNDJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5MTQzODc1NzE2ODE4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI0OTQ1Mjc3MjM5ODA5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44MzA4MTg3NjkyNTgzM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NDc4MDg1MTQxNDc2M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNTg3NTMxOTE5MDUzNDFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDEyOTA3NzIzODkxNjNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk1NTM4MTA4MjIwOTYwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg1NTU3MDUyMDk2NTM4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NjQ5MDkyMDQ3NjIxMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42NDAyMDk3MDkyMzEwMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTczMjcxMDEwMjg1MjFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTIzNzgxMjgxMzMxMTBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxNDAwMzY2MDIyMTI0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU3OTcyNDcxMzQ2OTMwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTkyNTgzNzM2MzgyNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43MTA4NDg0Nzg2NDA2N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODY4NzU5MDM1MDczMTNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjAyOTE2OTkyMDM1NjRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjI2MjQwMDM0Nzk1MTI0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjY4MjY0NTU0MzY5MTA4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4yNDY2NDQxMjk1MzM4OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44NzY0MjI3MzExNTE4M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMDI0MTYyNzU4MDY4NjlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMjcxOTI5MTQyODg5MDVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgyMDY4NjE5NTkwNTE1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg1MDg3Nzg3OTk0NDc2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44ODU0NzM3Mzc2MDc1OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44OTYzNjgwMjkwMTQ2OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMTgxNzMwNzgxNTIyMjZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjYxNTIxNDUxNTY4MDBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA5MzU1NDc2NTU4NTM0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU0ODQ1MTIzMDQ1NjA0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC41NDY2ODQxNDIyNDA5MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NTk4MDc3NDAyMDIyMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMzcwNTA5OTA2MDQwOTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTk5MTAxNDAzODMxNzFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjcwMzczNTk0MjYyODkxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkxMjI3NjY1ODI3MDgxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zNDYwMDc4NTg3OTU5NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTQ0MTQyNjE0NDIwMGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjg3NzQ0ODE3MzEwMDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzAyMzg4Mzc5NTYyOTlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjI2ODQzMjkxMjUxMjM0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgzMTE1NjY4MDA0MzYyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40OTA3MjMzNDYxMzI0MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40NTM1OTcwODczNzc3NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMzg5NzU5OTMwOTM5NzVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTU1MTUzNTgwOTkxMjFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk3NzU3MTI1MjI0MTUwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjA1MzA1ODk0NTgwNjA2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4xNzMyNTU1Mjg1OTYxNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45Mjc3MDY3MjI1MDQ5NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk5NDgwMzUwMjU3NDRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTgyODU1NDU1NjM0MjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY0OTQ2MjQ2NTI3NDU4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY4NjQ1NTA3MTA0OTYwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4xMjAxNjkyMDU3NjQzN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41NzE0NzMyMjE1MzMxMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNTg5NDc0NTY1MTc3NTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzQ4NDcxMzI0NTQzODhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQxODE1MTQwNDU0NDY1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjE2Mjc2NDIyMzU4ODYxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTg4NTY1MDIwNDg4NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xMTEzNjA5NTQ5MDQ0NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNTY2NDk2MTQxMjgzODZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTA0OTQ4NjYzNjE1ODdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk0MTM4MDIxMDMyMzMwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM1MjgxOTE2NzMzMDE4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43NTcyNTA3NjUzNDY0MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41MzY1MDU0OTY0MDU4N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMjA1NDE5NzM2OTI2MzBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTQ0MzUxNDQzNjk5MThmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5OTgwMzcxMDIzMzUxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc5ODM1OTEzNTY1NTk5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4yOTA3ODI3NzYwNTc3NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zNTM5Mzc3NzkyMTUyMGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjI4NTg3NzIxMDMwMzBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzg3NjU2OTMzODcxMDJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQzNDQwOTA0NDY3Njg4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk4NTQ2MzMwNDYzMjMyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45ODI5ODU4Mzc2MjM5MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yMTAyMTUyNDYyNTIwOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMTk1MTMwMjkxNDY5MzRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTQyMzk4MzIyNTE4NjdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1NDc2NjYyNDAwMTAxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk4MzY0NTU0MTc5MTQzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45MzM3OTYzNTMwNDgxMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43MDg4MTk5NDU4MzY4MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODUyMzU0MTA1NzMzMzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDgzNDIzNDc5NjY0MTBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg2NDI1MDkzMDExMjQ1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ1Nzk1MDI1MDI5NDY2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4zODg3OTc3OTA1OTA0NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzI3NDQyOTM0NDU5M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTIwNDUxMjQ3MzU0OTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjI0MzM2NTI1MjQyMjBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg5MTYyNTMyMjUxODc4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU0OTUwOTU1NTcwNTYzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zNjgzNDMzNjk0OTI1MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjQ1ODI5ODAyMDk3NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTM4OTE3NjA5ODgwNDVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODk5NjgzNTM3NDAzODhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5MjY3NjU3NTY1MDk0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjAzNzU3MDM0MzE2OTU4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NDA2MzQ3MTYxNDE3NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40MTMzMjMzODUzODk2M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk3NDAyMjQxMTcwMTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTY4MzA0OTQ5OTYzNzBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM1ODk5NDEzMTcwNTU1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ2NjMzMjI2NjQ5NjEzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wNTIzNzIzNzI3NDk0N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yNTY0MDM2MTYwMjY2MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMzY3MDM1ODM5NTc0MjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzg2NTMyNjU2NDE4NzVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxNjUzMTgwMzY3OTEzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjMwNTg3NjI4NzI2NTk3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC42OTAwMDgwMzQ5OTMxNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MDk1MjE3MTM4NjEzMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzg2NTg3NTExMzM1MjdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk1MDE1NzEyMDg5ODVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjI5MjUwODE0MDI5ODUxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM3NDQ0OTk0MzQ0NjE1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42MDE4MjIwNDY3NzYwOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44Njc3OTY1MTAzNjEyM2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTc0MTg1ODgxNjMyMTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTY0Njg1MjM2NjY0NzVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg4NDYxNTc0MDAzOTYzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU3NTA4NDA1Mjc2NDE0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wNTE5ODkzMzA1NTE2MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yMTI2OTY2MTY2OTk2NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNTM0OTk2MjE5Nzk3MjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTcyNDE1NTM3MzEyMzdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQ5NDI5NTYwMjI2NDk3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk4MTgzODY1MjkxOTAzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45ODkzNTE0MjMzOTEzOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40MDI0OTE1OTAwNjkzM2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTgwODEzODAwOTExMzBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzI4NTY4OTU1MzQwNDFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjI3MzM4MTQ4ODM1NTMyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5OTUwOTIyNDQ3MjA5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wNjMxMDgwMjMzODMwMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41NDUzOTU4NzUyOTYxOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjA0NjE2NzcxOTk1MzlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTQyMDk5Nzc2Mjg0ODlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY2MjIzODQzMTQxNjQ3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjcyNTI4NTc5OTQwMzI2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44NDc2NDM0NTQ4MzY2NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMjM3MjMxNjgwMTI2MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODkwMzk4NjM0ODM4MTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODg4NjY1ODE0ODQ2MDJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk1OTAzMzA4NDc3OTg2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc2NzQ0OTI3MTczODczZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43MzUwNDEyMzkwOTg3OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wMzc0NzIwMzE3MzE5MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzE3NDQ0MzQ5NjYwNTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzY4MzQxMTE4ODM2NTJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM0MTEwODI3NTkxNjIzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQwMjExMjIyODA3NjkxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40NzgwMzg4MzcxNDE5OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zOTQyMzIxOTc4NjI4OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTgyOTkxOTU4Nzk1MTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDE5ODk3OTEzOTAwNDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjMwOTYzMDczMTI5NzUxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE4MDc2NzIwNTk5MzM2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTk5MjU4ODIyOTAxOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yNjI4MTg3MjA5NDI4OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTMxNDk3MzEwODA3NjdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTgzMTMxNjI1NzA0OTBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5OTIzNDcyMzAyNzczZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjgwMTQyOTkzNzY3NTU0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4yNjAyNDE2OTYzMzQxN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NTk5OTc1OTg1NTc1MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzU3MTI1MTQ3NDM1NjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTkyOTg5NjM3Njg1NzRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5ODk5MDg0NTA5NTMwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc0NjQ1MTU2OTkyNDkzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44NjU1NzE3MTU3OTQ1MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41NTU5Mzg2NjY5NjI5OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMzM0MDgwNDI0Mzg3NTJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODYxODU5NTM4NzQ3MDlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5MDEwNzM2Mzc0NzE2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjA0NjAyMzk3NTc2NjIzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42NjY5NDI2OTY5MTE5NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MTY0MzYxMTgxMDE0OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjQwMTY3OTIwNzk0ODBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTU2NDk1MzA4MzY4NTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5NTcwNTM0ODA0ODM2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ1ODQ0NTg2MDM4MTExZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42MzQzMTQ2Njk0NzM0MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yMTA3OTExNjQ1OTIzNGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDc3MDY4NDcwMDU5MzFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODk1ODE0MzcxMDEzMjlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk4NTkwMDkwNTc3NzI0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg4MjQxNzIxMTMzOTgxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44MDA5OTMzNTI1NDY3OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNjg1MTg5NjcxMDg1M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzgzNjgxMzEzOTI2NjZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDU1MDY5OTk4MDI1OTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA4NzA3ODA2NjcxNjkxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgwOTM4OTk0OTE4NzQ1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44NjgxMTg4MzA4MDcxMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zOTM0NzMwODY1NDcwNWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzk0NjY1Mjk3NDAzNzVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjY4MDk0MzIxMTQ0NTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk3ODc1MzI1NjQ5NjgzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjcyNDY3ODQwOTY3NzQ2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NTAzODU2MDI4ODg2NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44OTU2MzIxOTU4NzYyNWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMTcwMDUyMzk0MjQyMTJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTQ2ODMwNTM5NjI2NThmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc2OTEwNzkyMDI2ODQ4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk2MjI2NjE3NTQ5Mjk4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTc0MzI4MTAxNjg0NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40MjY5NzE1NzAzNzU2N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTU0MzczODM1NDk5NzNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTcwMDIzMjQxMDk5NTJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5NTc4OTA1MzY1NTY5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjU0MTA2ODI2MjU3MzU2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4yODA1ODI1OTgyOTk5MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44NTM2MTQyMDYzNDAzNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODUyNTY1MjQ0NzA1NzNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjQ1Njc2MDc3MzU1ODlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjUwNjA4NTQwMTA1MTI4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjY1ODQ2MDE1NDgwMzAwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NzIxMDczNTE4MzI0M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yMzA5NTIxMzA2Nzc5MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTU0MjQwNDgyMzQ0NDFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTkyNDAxNDcwOTEyMTlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk2OTI2NTcwNTI0MDIzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjczNzc1NjU0ODk2NTc0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4zMDg3MjE2MzIxNDcyNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40MTUxNDk2MDU1NjEyNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjQ1MjM4Mzk1NzI2MzlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjMyMDY2MzMzOTQ4MDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjMzODEzMjY1MDg2MDI0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjM4NjYxNzc5NDQxODk3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wNTgyNjgyODQyMDE0NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wNjk0MDc3NDE4ODAyOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjI4OTg0NjE0NTUwNTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTcwNTQ4NTMzMTYzMTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjE4NTA5OTE1MDE5ODgxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ3NTY1NzYyODkyMDg0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4xMDQ4ODIzODA0NTAwOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44Nzc2OTk0NzQwMjM5NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzE4ODY1ODYxODIwMzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzgwMzA5ODI0ODA1MzhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5NzkzODczNzM4NjU0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkwMDQxMzEwNDkxNDk3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC41NzU2MzMwNzYyNjEyMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MTAzNDMzNzM1MjA5N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMjg5MDk2NDYzODM3MTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTYzMDc3ODM5NzA1MzRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQyMTg4OTk4MzEyNTIwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ4MTQ4NjUxMjMwNDM3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45MzMzNTA0OTY4MTA0N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40MzUzNzAyMzg4MzU4OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTcwODczNzQ0MTgyNjdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODY2MzY0NDU3MTEzNjRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjM2NzIyODcxMjg2OTIzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY1MjkxNjU0MTcyOTYxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44MTA5MzAyNTY2NTY5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wODc3ODM3MDIyOTM2M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjYyNDA2MDMwNjIyMzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTI3NzQwOTUzNzkwOThmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgzOTk2NDk3OTg0NjA0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU1ODM5ODQ5MTM5NjQ3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTkwOTYxNTcyMDIyNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NjAyNDYwNTcxMzk3MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzQ2NDk0NjQxNTUwNjFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTIxNDQ4OTM2MDY0NjJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc0Nzc0NTk1NTY5ODA1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI2ODk4MDYyMDA4OTU5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NTc4MTY2NzQ2OTU2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43OTA0NzkyNzA1MjYyOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTU0NzIzMDg3MTMwOTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDg1ODg3NzYwMTk1NTBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ4NzA4MzMyNzQ2Mjk5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5OTk5MDQxNTc5NDMyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40NjMzMjAzODI0NzQ5N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xMDk2NDEyNjE4NTA2M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzY0OTcwMDQ5NDAxNjJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODkyMTA5MjkyNDIyMzhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjU3Mzk3Mzg5MzY0MzM5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM1Mjg5NzAzMzczNzYwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43NTM3NDMxNjk3NDQ5NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjcwNTIxNDY1MTMzNWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNTkxNzQzOTc2ODU3MTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODk0MDUzNzA0MjI3NTJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc1MDg3OTA2NjkxODkwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI5NjEyNjcyOTgyMzk2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45ODYwNzg1NzMzNjIzMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yNTAzNDkxMTczMDAyM2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDA3NjEwNTY2NDA1MDVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTAwNDU1NzM0NDQ2OTVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY2OTI5MjY2NzQwNDc3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk4NjI5NDkzNDAxNzQ4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NzQ2MzY5NTI1NzMxMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wMDE5MDIyMzMwMTMwMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTAxNDU1MDk0MDk4NTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk3ODEzOTAzNjU0NDZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg3MjU5Mjg5MDQ4MDQzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5MjMzNTg3MzUzNjY2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45MTUyOTQ2MTQ0NzY5MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xNTY5ODcwNzUzNDIwNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDMzMDU3Mzg4NDA3MDVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzcyMDUyNjI4NTk3NjRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA3MjIzMDUxMzY4MzM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg4ODA1MDAxNzMzNjI2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTQ5ODAxMjE4ODM1M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzA5NDM1ODExMzM4N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzQ5MDQ5Mzk1MDA1MTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk5ODU0ODM2NDE1MjFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA0NTg1MjI4NTc0MjExZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5ODEyMzM3NDQ0MDgyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44OTA1NDk1NDI1Nzk5M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zMTc5MTkxMzE4ODA2NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODM3ODIxNDQ2NTEyNTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTc2Mzc2MzI1NDc0NjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjMzNDU0ODA0OTMzODA0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg2MjMxNTE2ODAwNDA4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTcwNzU3OTM2MjgyNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MzIzNzk5MDA3OTQ0MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjI4Mjc1Mjc4NDM5OTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTg4NzQ3NTkzOTc5OTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY3MjQ4MDQ2Mjg5MTQzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjAzNjQ2MjExMzkwNTY5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wNTE0NjUzODE4Nzk0NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MjU5OTcwMDEyMDY3OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk5NDcyOTU3NDk5MDVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTM2MjUyMjk3MDc5MTJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY2OTUxMTI0MzkwMzYzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk4OTA1ODI1NjIzODkzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTYwMjk1NjU1OTE3OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40NDY1NDcxNTc1NzY4OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODIxMDQ5MDU0ODM1OTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk1NDA3NDE3MjQ5MjhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5MTg2NTEwOTg4NzgyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjcyMDIzMDAxMzEyOTQ3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42NTI4NDU5MjM5MjkxOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41MjE4NjcyMzI1MzYzN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTM4ODU0NDM3OTgxODhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzQ4OTUzMTI2MTUyNTlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk2NzM1MjQ4NzM4Mzg4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkwODkxODE2OTc4NjI5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4yMjIyNTk2ODg0MTExNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41NzEyNDAyOTc4MTIyOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDQxMzI3ODM3NTM0MTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTI2ODg4NDA2NTkyODBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg1Njk0OTc0MjE5NTc0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg4ODQ0NTMyNzE5ODQ0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45MTc4MzA0MjA5MTc2MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40NjM1Njg5MjM4Mzk3MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzI1NTY5NzQ0MTU2OTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk4OTk1NTU3NzA3NDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NzExNTgxODM0NTA4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU4MjExNTYwMTgwNDI2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43NzYzODk3NjM3MTk2NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NDMyMTgzNDg3MzgxOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMDc3MTczMjQyNTM5MjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTg2MzgzOTk4NTY1OTVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjU2MDQ5ODI5MTk0MTYzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgyNTIyMzAxNTY5MDM2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45ODM5ODg5MzYzOTk4OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zOTQ2NzQ0MDQyMDU2OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNDc1NDY5NDY4NDQ5MzhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjg2MTMwNDQ4MzY4MTFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY1Njc1MDg5MzE0NjMxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjE4MzMxNjM3MTM0ODgwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wMzI3MzM3NTQ1Nzk4MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NDkzMzEwOTU2NDEwOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzg2ODQxNDQ3ODQ3MzhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTEzMzczNDkwMzA0MDZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk3MzQ2MjY3OTQ0NTQ1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk2NTQ5MzY0Mzg0MDk4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC41MzI4MjE1NjA2MTk0MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MTQyMzI2NTA5MTM1NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk4MTczMTA3MzExNzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjExMzM1NzI0ODIxNDhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjUwMjU0NTAwNzcyNjM1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg4ODI5MzM4MTM0Mjk0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wMTk5NTg3MzIzODg1NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44NTIyMzUxNTA5Njc2NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk5MzAzODE5NzM4MDRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTQ1Nzg4OTYyOTY2NDlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgyOTA3NzY3NjAwNzgzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjA2MzIzNDQyNTk4MTI4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC41ODY2MDcwOTY2OTcyOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45Njg0MDc3MzgwNjU4MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMTc1NzM3MzY2NjcyNjdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNDgxNjY5MjA4NTk0ODVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgzNDM0MjkyNDAxMzQ2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjEzMDIzNDUwNjQ2OTk3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wNTk0NjQ5MTMwNzAyNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yMDUxMTA0NzA3NDg2NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODE1MDU0ODQ1NzQ2MDJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTQ2ODU5NDc4NjEzNjlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQ0OTc2MzgwOTU0ODYwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQwODk0NTcyNjcxNTQ1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44OTc0NjQ3NDYyNTY3MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTg0NjU3ODgzODUzN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMzk2NzcyNTYxMzA3OTJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzQ4NTQ2Njg2MDkzNTlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjA3NTg4OTQ4NTYzMDc5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc0MDk2MjE0MDg0MTcwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43NjM0MzE5ODk1MTQ0NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40MTc0NjYyOTQyMjYzNGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzQ0OTAxMDQ2OTk2MjZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTQ3MjU5MTE3NDQ2MTBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY0ODgwMTE5NzkyNzU5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQxMzM2NjYwODMwNTcxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC42MjMxOTUzNzQ2MjU0MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MzA5ODMxMzU1MjU5OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNDIyMTU4MTc1OTQ4MDdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDc3MTI3ODczODUyMDhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjAyNzA0NTU0MTQxODg1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjA1NDE3NTE4MDUzNjY2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44MDAwMTc3MzU2NjgxOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MTU0MjE5NTE0MTAzOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzkzNTE4MzIzNDg4MTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzYyMDg4OTc5ODkxMzZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjYzODcyMzU5MTUxNjM2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjA4MTI4MjUyNDkzNDQ0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC41Mjg5MDUyMDk2MDI5NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42MDA0ODg3MjQ1NTU5MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzQyMzg1NTI5MTQ1ODdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDQ0OTE5MTUyOTEwNDRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5MDk2MTMxNDQ5MjUwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE5NDUxMTgyODU0NDAyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44MDQxMjMyOTY0MzEwOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44ODUxMzgxODE5OTQ1N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjQ2MTI2MTYxMjk3MzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzIxOTg2NzQ4MDQ1NDRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjExNjU3NzcwNjYzMTkxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjgzNjYyODMzODE1MDQxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NTA1MzE4MjQ4ODEwMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NjkzOTkwNTEzODA4MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjIyMjg4NzI5Mjg2MjJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODI3NjcyNjI4NDY2NjFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjAzMDA0NDc1Nzg3MzE2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5NzM4ODk2MzMzMzg0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45Nzk4NzIxNDM0MTAzNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zNjUyNjEyOTY4NjQyNWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk5ODY5ODA3NDYyMDBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzYwMjE2MTAyOTk3MTVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg5MTEwNjQ4NTk5ODc5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk3ODk0MjUwMzQzMDQ0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4xMDQwNzk2MDUxMDU4MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43NzM1Nzc5MzgxMTYxOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTU5NjQ3Mzc4MjE3MjhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzU0MzU4MTgyODU1MDJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjUwODQzMjMzMTU5MTYyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2MTA3NjkxMjY2MjA1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4xNzAwNjMzNDY3MDYxNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43Njg1NDAyNTMxNDgyOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMjU4NzI2NzUwNjMzNjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk4OTMzMDM5MzM4MTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjAxMTE1OTk4NjgxOTM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk4NDk2MDE5NzQyNDQ0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43OTU5ODcwMjk3MzI2MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzEzODQxMTMxODg5NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTkyNjQ3MDg5NDgxMDFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk1NDI4MjI0MDI1MzZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5ODI5NjYzNzUyODE4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAxODc3MTM4ODI0MzExZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43MDgwMTAxNjU0ODE4NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zMzY4MDY4NTk0ODExN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzA0NjcwNTc3ODY4MjZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTMyNzI3Nzc1MDE4NTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5ODQ2MDIxOTA1MjU0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk4NzI1NzQ2MjU0NDMzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42MzM2NDk2ODUzNDY1MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xNjQ3MzU5NDQyMzc0NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMTYyNTgyMTc1MDA3OTJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTU5MzkxMjU0MDA4MDJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQzNjQ1NTk0MzYwNjMzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk0ODA1MDMwMTEzMjg0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTg0ODQ3MTcwMjk3NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjI0NTE2NjkyMzgwOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMTY3OTY0NTg5Njg5OThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg5ODc1MTE4OTA0NzBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg3OTc5MjI1NzQ1MjEzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjcxNzI1NzI1MDQxNjgwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40NDE4MzA5OTAyMTc4NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MzU2ODk3NDQ5ODc2MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTMzMTAxODAxMjU1MzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk5MTMzMDgwNjgyNDZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkzOTQxOTMxNzgyMDAyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjU2NDA5Mzc5NjQwMzU2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44ODU5MDAwMzE4ODY3N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40NzYyNDYwMDQ5MTM4MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk5NzE0NjM3MDM2OTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODM4ODk5NTQyNTM0NjJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc1Mzc2Mzg1NjM5OTc4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAwODE0NjQzNDM4NjI1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45Mzg4NzY4NTYxNTg3NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xMTI4NDUyODIwNDYzNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODUxMjY0MzU3ODIzMDlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTIzNDkyNTE1NDM1NDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjM5NzAxNDIxNDQ2MzgxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgxNzc5NjM0MTc0MzE2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zNzAyNDQ2NDE4NzQzN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44NzA3MTY1NjIyMjk1OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzYwMjQ4MjgyNDI4OTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzQ2NTU3MzU2NDgyODdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkzMzg4ODEyNTQ5MjA5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg0NDc2NTQxMDk2NDI5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42NTI5ODgwNDU1MjExOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xODQzOTU3NTQ1MDkyMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMTE5NjAzMTkwMDY4NDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk4OTkzNDY3ODAxNjhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk0MjkyNTY1NTUzMTYwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgzMTYzOTA2NTE4MjkzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43NTA4MTE0NTI4Njk0OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNTUzMzIyMzE0MjI2NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNTY3MjE5Nzk3NDgzOTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjQwNzY4MzY0MTQ0OTlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ2ODU3NzY2NzQ2MDI5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjMwMTQwMjMzNDU3MTk4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NzMxMjMxMzkyMzYzNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTU0ODE5MTYzMDAzMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzgyOTk5NzY1NjcwMTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTg1MTY5MDk3MTU0MjdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQxMDI1ODAwMDE5NDYzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAyMTE2NzM2OTM1NzM0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wOTYzODA2MjAwODA0OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wNDQxMTk4NDM4MTQ1N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODUyODMyNDkyNzUzOTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTE0NzU1NjM5MjI0MjFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg4ODY2ODA4OTU4MTI0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5NzM1MjY3MDgzMjI2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40ODIwMjQyOTUzNjk4OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NjgwNTYwODg4NDE2NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMjc1NzI1ODI0MTY1NjdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTg2MzQ3NTMzMzU4MzJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY1ODg5MTI5NjU5MTY4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU4ODM1NjM0MTM4NTgzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45ODgzODA4Njk1MzczMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTk5NDM0OTYwMDIzNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjA2NTEzNDk2MjA2ODlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTQ1OTMwNDQwNjYzNTVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYyMTI2NDE2MzU2OTIwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjU5ODkzNjgxNzAwMzkyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4yMDMyMDEwNTQxMDQzN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44Njg3OTE4MDM1NTI4OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTc3OTA1NDg2MDA1ODRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTYyOTA4MDY5OTkyNDJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjExMTEyNTM0NzM1MTI2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjIxNDg0NzYzMzEzMzAxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40MTM2ODMzNzMxNDE4MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yODIxNjgzNzY4MDM2NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMjQxMzMwMzg5OTI5NjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTEyOTQzNjI2MzAyMzhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY2MzkzNDEwNjc0ODg1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjA4MjQ5Njc5NjI5MDgxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC41MzY5NzgyOTE3ODc1MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NzY0OTkwMzkzNjIyOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTcyMjQ3Mzc4ODkzNDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMjIwODEzMzM1Nzk4MzdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg3MzkyNDc3MTQ0NTQ5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjEyNzk2MTczNzQwMzYxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4xOTA1MDM2MTAxNTc1M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMTYwMjYxNTM4NzE5NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDYzNTM0NDEyMTI3MjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTUyNDkwNDE1MzkwMDZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjA3MDY0MDk2MzM5MDIxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk0NDc5ODAzMjA1ODg2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45MjQ0NDA4NTQ4NDQ2NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xMDQ1NzU5MDE4NzQzNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODM4MjI1OTM1Nzg3MjhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDE2OTUwNDMyMDg4ODVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc1MjE0NjgxODExMTUwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5OTU1NjgxMDQyNjY1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40MjEwMjk5ODgyOTMzOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTcyMDk0MTk5OTM5NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzIwOTQ3ODYyMzc2OTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzUwMDg5NjE5MzQyNTVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc4ODQzMzExMDE5MjUxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUyODUxMzk4OTU4MjcxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NzM5NDAyNzg5NzQ0MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yNjY5NTk0NDA4NjU2MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTkyMDY0NjM0Nzc5NDZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTcwMTAxMjA4NDk0MjlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc2Nzg5NjA5NDYxNzk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc2NTE5MzU2NzMwOTY2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44MjAwMjQyMTgzNjQwOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43MzUzMDE3OTU1Mzc2N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODE5MjQ5OTAwMjU3MjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk2OTg0MjUyNTA1NzlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjI2NzE5ODUwODczMzU3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY4OTAzMzY5Nzc2MTkzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40MzMxMTI2MDM4MDk3NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44NTMyMTgxNTk0NzQ5MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTkxOTQ5Nzk2NzM4MzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTE4NzYyNDk3NjY0MjJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgwNjkyMDAxMjQ4NDg3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjMyNjI3NTQwNjYzMjE0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40MzA4MDAwMzY0OTk3NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yMTkxOTA5NTYzNjYzOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjc3MDk0OTE5MzczNTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTU0NzgwNzU4MjI5MDZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjU2MTUxNzcwNTY4MzE2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjcwNjkzODExNzQ3Nzc4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4xMDgzMTg2MjgxMDc0OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wODYyODgzNzE3NDU5MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTEyMjk0MTc1NDA0MzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjU5ODczNTE0MDg0MTBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQ4OTcyODkzOTMyMjc0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU2Mjg5MjQ2MzYyNjg2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44OTAzMzY1ODY4OTY5N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43MTY1NjU2Mzk4NzA4MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjUyNjk0NDc0NzUwOTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjU5MTYwMDQ4MzM5MzJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY3NDM5NDc4MTQxMTIxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjgxNjg0MzgwODQ2Nzk2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40Nzc3MDgzMjQxNjk3M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xNjc4OTU1NjIwMzAyNWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk3MTU5NzkyNjA4NzhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTM1NjU3ODQwMDc2NDhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkwODg5NTkzNjAyNTQ2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjYyMDM0Mzk3MDU0MzgwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wNjYxODYyMjU0ODE3N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yMzgxMjIxNzIyMTM1OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk0MzAyNjY5MTk3MjhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTg4MTI1NTUzMTc1NTNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk3Njg2NDAyMzgxODQzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI4NjY0NTM0MzY2NjIwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NDgxMzY1MDIyMTI2OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NzUwNjY0MDAyNzEyOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTU0MzQ0OTc0OTI4NTNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzk2MDc5Nzg1MDE5ODNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQ5MTA0NzgzMTM3MTUwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjMyODk1MjE0MzU5NjYzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTg4MTE3NTEyMDc1MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44ODk5Mzk4MzgzMTM1NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNTA0NDkxNjY3NjAzMDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODU5OTUwNzI0MDg0MzRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ3MTYyODkxMDY1MTA4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE4NjgwMjA0MDQ5NTY5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42MjA4MTU4MTM2MTg0MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43NTAwMDY3NjIxODk1NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDM4NjcwMTUyNTA4MTJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk5OTgwNjkyNDQzMjJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk4NjMwNTYzMjMyMDc1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjUzNTc4ODk5NjAwNjYyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42MTUxMDM2MjI3NzM3NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44OTUxNTAxOTg5OTk5N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDM4NDE1MTc2MDE4NDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjk4ODg4MTU2ODExNzlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjMwMTAyMTU3MzA0NjQ0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjA3NjY3ODA4OTIyMjA1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40MTg4MTI4NDE4MjY4M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMjE4ODA5ODkyMjI4MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODYxMzU0NTQ5NDEyMzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTg5NDc0ODA5MDkzNTlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY3MjI2ODYxMzkzNzg4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjEzNDk0Mzg5MDExMDE0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43MDczNzM5ODg0MjA2OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NjU0NzM0OTMyNTk5MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTQwNDQ5NDY2ODc5NjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDkwMjYyMDExNTc0MTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgyMzg2MzUyNTM0MzI3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjA4OTI0NzY4ODIzNjc2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zMjA3MDY2NjY5ODY1NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41MDE0MzQyMTkwODc1M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNTc1OTMxNjMyMjQ0ODdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg5NjY0MjI5MjE1MDlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM2MzI2MDE4NDE5OTY1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjA3NDQwMjQzMTIzMjI4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTk3OTA0NDY3NDM1MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xNDEzMDI4NzM0NzQwNWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTIzNjYwMjMzMjY5MzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTc5NzkyOTgwNjgxODBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQ0NjA3MTc4NTE4NTk4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjU0MjMzMjUyMDE2Mzk0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40NDIyNjgwMDkzMjk1NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43MTMyNjc1Njc0Mjc1MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMDM2NzE5MDcxNTgzMTJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjM2MDYzODkzNjY2NzVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjUyMTc1NDI0NjgyMTk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg1Mzk2ODI2NzM1NzA1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NDcwMTEzOTY5MDk1NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wMTgyNjM0ODE5NDI1NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTg3NTk2MDY5NDYwNDlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODIyODg3MTQzMDMwNzNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg3NDM0Nzk0NzQzNjI1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg5Mzk5NDk1NjU1NDMzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45MzQxMjA0MTc1ODc0NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40MTM3NDA1MjAyNDM2M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTYwNjM5NDMzMTU1MTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTMxMTY3MDk1NDEyODBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk3NTM0MjUzNDU3ODM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg2MTUwOTMwODEyNjg5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTY0MjQ2NjUwNDE2M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43MDE5MDA0MzQyNzUxMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTQ3MDUwODk2NjU5ODRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjk1ODAwNDI4MTQzMDZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxNTk5ODA3MDg3Mzc2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk4MTQ3ODMwMzg1NzgxZiAvIDguMCkgfQotfTsKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk5NDgxNTMyNzgyOTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNTk0ODM0MTc1MTY2MDdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTcxMTM0NTQzOTM5OTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNjc1Mjg1MTUyMjU2NDdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMTQxMzAwNTE3NTg0ODdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTUwOTA5ODM1NzU2ODlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjQ3MDA1NDk2NzAxNjk3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjM3MzQwNTQ5NzI4NjQ3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjgwNzA1MDYzNzY5MzUxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMjk2NTM2NjgyODQ0MDhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjM4OTgxNDc4ODk2OTI2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODk1NzI2MDU3MTcwODdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjAxMDUzMDQ5ODYyMDIwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjY2OTU5MDU4MDM2MTY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MTI2NjM2Nzk1NzI5M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xMTUyMjkzODE0MDAzNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41NDg0MDQyMjkxMDMwOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjc1MjIxMzY3MTc2MzAyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQwMDA5MjUyODY3OTU1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk4OTI5NDAwMzM0NDIxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTg2Nzk3NDcxMTg1NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44ODE0NzA2ODY0NTM1OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTU1MzEwNzY4MDUwNDBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45MDkwODc1NzE1NDU5M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDU3MjU5MzMzMTcxNDRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNTY3MTYzMjM2NDY3NjBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjcyOTI5Njc1MDI5Mjc1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk4MDA4MjcyNzI3MzI0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjc1NjIyODAxMzk5MDM2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMjA5NTAzMjk5OTU1NDlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDcwNjk0NDI2MDEwNTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzgyNDc4OTg0NzA3MDZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzQ0OTYyNTI5MjYwNTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTExNjkwMDQ0NDU4MDdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk2NDQwMTgyNzAzODU2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk0NzM5OTE4Mjk2NjIyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjMwNDI0NjI5MzY5NTM5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjQ5NDM4MjY3MDEyNDc5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjY2NTY1MDMzNzQ2OTI1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjQ2NTI5MzU1NDI0OTFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTE2OTcwMDgwMjA1OTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4xNzUxNDA5NzMzMjAwOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzA3NzQ5MTg3NjA0MjdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41MjU0ODY1MzQxNjU0M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzAwNTE0MTUzNDU1NjBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNDUzNDAwMjg4MDg3NjNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5NDk2NTEzMDU0Nzk3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkwMDcxOTA4MDY2OTczZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk4MTY0NDkwNzkwMTIzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjc3NDYzMTU1NTI4Njk3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC41NDY3MTU4MDU0ODE4MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wMjU3MDkyODUzNjAwNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDE2ODk2MjkwNjUzODlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wMDI4NzUwNjQ0NTczMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODYxMTAzNDk1MzE5ODZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40MjU0ODU4MzcyNjQ3N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTg4OTI5ODA1ODYwMzJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODc4ODExMzIyNjc1NTZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNTE3NTY2Mjc2Nzg2OTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42NjkyNjc4NDcxMDEzOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk2MzUwMjY0MDk2NDBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNTgxMDc3MzA1NzQ3NjVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5OTY5MzcwODYyMTYzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTgzNjk5ODkzNjAyNTBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNTUyNjYyNTg2MjcxOTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41OTQ0OTA1NzQ2NTU5MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4zNDU4MTE3Nzc0MTY3M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk0ODc5NDIxMDYxODY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjYyNjY0MjA5NTc3OTk5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjc0NDAyOTcwOTA2NDcxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43NzE0OTcwMTQwNDk3M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zMzg4MzY1ODA0MjgwMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTE1OTIyNDQyNTQ0MzJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wMzY4NzkwMTM3NjcxM2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzYyODU0OTIzNTc4ODdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTEzNzE4Njc5MTkxMjRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzk3ODgzMzcxOTUzMzFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTMxODA5NzExOTk4NDlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNTQ0NzMwODA2MTAyMDBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMTE5MTkyMDYwMzcxODZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg1NjM5MjgxNjcxMDU4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDI0Mjk4NTQ3NjA0NTFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjkyODgyNDAyOTcxNDIzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMjc4NzE4MDkwNzg2MDlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjExNzA4MzcxMDQ2Nzc0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk5ODAwODQzNDQ0OTY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjIxMzU2NzQ5ODE3NDkzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkwNzE2Mjk1NjI3MDMzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43NjE5MTY5MjU3MzkwOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5NzY4MTE4MzU2MjY1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk4MTExMDQzMTAwODg0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk1ODU0NDU5NzM0NDA3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44NTkxMzI2OTg5NTU3MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk1NzY2NTY2MTY4ODgwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MzMwNzI0MjI1MzY5MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQ5NDMxNzU3Njk2NDY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjMwNDg1NzU0ODc5NjMyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjcwNTQwMDM0MzU3NTI5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjg1Mjg5NjUwOTI1MTkwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDY3NjYxMzE3OTEwNDRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTEzMjgwODI2MTgxMjVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTk4Mzk1OTczNjE3NjlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjA1ODkwMTk5OTI0MTU0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzA3NDE4Mjc4MTk0OTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMjgzOTg2ODYxNTAxNDhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4zNDYzMzU1NTcwMjE4OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NTI1ODE2NDUzOTYxMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41NDg5MzQxNjAyNjkzOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzg1NjYzMjQxNjg1MDdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzU1Njg1NDEwNzk2OTFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk1Nzg5NDk1NDQ3ODc3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjIwNDIzMTk0Njk2OTY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjgyNDExMTU4NzExMTk3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTY2NTQ2MTg0MzI1NjJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjY1MTg1NDQ2NzM1ODg1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg4NzM0OTkwNzczMjg5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MzY0MzYwMzEzNDY2NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5ODcwNzkwNDQyMzg1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjkxNDI3MTU5NTI5NjE4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk4MjkwNTA1NTQ0NDQ0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43MDM5NTY4NDAzNjg4NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjU4Nzk2Nzk4MjIxMDM5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjAwNTYzNzcxOTY5MzY1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjE3NjgxOTY3MjcyNDRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODkwNjUwNTE5MzE4OTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41Mjc4MzM1MjY5NzU4NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjg2ODM3MDc3MTI3NjJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44MDgwNjk0NDcxMDMzOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC43MjE2NTM0MjUxODcxOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC42OTI1OTg1NzM0OTU2NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjI5MjgyNDc3MzA2NjdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4xMzYyNzAzNzQwNzMzNWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4yOTkzODQzNDA2NTUxNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC40NjA1MTMyOTY4MjI0NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTE3ODE5NTg4NzkyODBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzQwMTI3MTY2ODQxODZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTkyOTg3MTcwNDM2ODhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40MDgxNjYxMDA3NTY2MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44MjM2ODI5ODYyMjc0OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43NDAzNjA0NzE5MDE3M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTg1MTI4MzMzODY4MzNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTk5NzIzMzA3MDk1OTRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk1OTE1MzY4MjQyMjU3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk5MjM3ODAwNDY2MDQwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yMTQxMTEyNjU3Mjc5MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MzQyNDgxOTA1MjU0NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjg4MjE0NzYxMDY4ODRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjY4OTIzMDYzMTU0NTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTE4NTE5OTc5ODIzMTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wOTM1ODIyODkwMTc4NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTYwNjI3Njk1NTkxMjdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4zNjA5OTA5NTEzMzczOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41MTY0NjE4NDkyMjI4N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43MTM3MzMzMjg3MzkxN2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42MTEzMDcyMTEzOTY2OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQ2OTUwMTQxMTc1OTE3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQ3MzM2MTI5MzcxMjk5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjI3MzMzMTc4Mjk2MTYyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjkwOTk4MzA4NzAzNTE5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTY3MTU2NjI5MzgxMzJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNDQ4NDQ3OTkxOTQzNTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTIxMTU3NDYyODMwNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42NjYxNDg5MTA3OTA5MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk2NTkwMTc2MTY5MTIxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjc0OTIyMjM5MTI5MjM3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg5ODc5ODU4ODI2MDg3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTU3MTU4ODUwNjQ4NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjUyNzg1NTIxNDk0MzQ5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk3NDAxMDgyNDc3NTYzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE2ODU1ODcwMDc1MTkwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjcyNjgzNzQ3NzMzODc5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjQ4MDYwNzc0NDMyMjUxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk1NDMyMTkzNDU3MTI4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjg4NDk2MDM0MDg0NDFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjcyOTYyMjA4NDI1MTkxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjc2NjA4NDQzNDIwOTE3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44NTM1OTQ3OTIzMzUzN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg4NzM4MTI1OTAxNTc5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44MTQxMjQzMDMzODUzNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NzQ4MDc2ODA0OTYzN2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODc5MzA3NzIzNTY3ODZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC43NDc0ODMwNzY5MDQzNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzE1NzMzMzEwNjQ5NzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTg1NzA2MDgxNzg5MjNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODM1MjQzMDAwMjgyMjhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44MzcwMjUzNzA3NTE2M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDgwODYwNjU2MDE0MjNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTg4NDg1MDQ5MjM1MzFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTcxMzkxMjg1NzQ3NzhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44MDA5MzYyMTE5ODIzNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41MTk5MjgyNTM0Nzg5NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgwMjQ3NjMxNDAwNTEwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4wMDg0ODU5MTE5NTMyNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43NjY3MDEyODAwMDQ4NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzAyOTQzNzQzMDMwMzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41NTM1OTkxMDQ0NTU3N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTU4OTQ0MjgxNjgxNDBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNDMyNjU1MDQzNDQ3ODNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTcwNzkyNTI5NTAzMjFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wOTMyNTg1NzIzODY4MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTI0MDQyOTM2NzA3OTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44NTUwNzcwNDAyNzg1NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjk1MDY0Njk1MDA0NTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45ODYzMzQxMjYyNTQ1OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4yNjU1OTIwMzYyMDAyNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjczMzE0MzA3OTY2NTI0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjI4MDM4NDQzMzM2OTQzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMTQ1Mzc5MTM2NTQ0MjdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjc0MTM4MTI0ODI1NTIzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTkzMTAzMzk4MDc3NjJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjAxNzUyNzk1OTk1NDQ0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjgyNjE2NjM1Mjg0MTc4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC41NTEyNjc3MzA5NDkzMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45ODg5ODU0Mzg2MjE1M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45Nzk2MDg5ODg1MDk5NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NDAyMTQ0Njc1Mjg1MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTkxOTYzMDkxNDY5MzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42NzAxOTAxNzM1ODQ1NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjc2ODQ5MjgwODUyNjBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4xMjYzMTQ5MTY0OTM3OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wOTE0MDAzOTQ2NTUwMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yMDUzNzczMTQ1MzEwOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzE2NTg5NjU3NTE5OTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTc3ODgyMDAzOTEyMjRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODEwMTQ2NDAwNzg5MjVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41MzcyMjY0ODM2MjQ0M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40MDYxNjk5MTY3MTIwNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yNjQ2OTAwODU5ODQ0OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjc2ODAxODg2ODI5NzJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NDUwMjA1MjMzNzY5NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44Njg0OTc3NDM0ODc0OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xODMzMzU5ODY0Nzg5OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk1MDAzODEyODQ4NTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMDI2MzQxMjIwNjg1NTBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODQzMjkxODkzNDA2NjdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4xMDQwNjk1NzQ2MjIxM2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDkyMTU5Njg1MzE0NDZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42OTU0MDAxMjEwMTI1M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTk1NjE3MzMyNzIwNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xMjM1ODU0MjAwMTQwNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzk3MzI3Nzk0NzM1MzVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTE1ODI1MjQ3MzYxNTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTYzNDk5NzM2NDI0MDZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NjY0MDQ1ODA0MTAwMGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzk5NDI3Nzg0OTY1NDdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42NDMyMzkwMjgyMjg1N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMTE1NjYwMzk4NTM4OTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yODU4Nzg0NjI1MzcyNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMzk5MjI5NTQ1MTQ2NjJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NDEyOTYwMTYxNjk2NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTA4OTE5NzU2NTk4N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MjA2MjYyNTU4MTU4N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4yODYzMTI4NTE3OTkwOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MTAzNTA0NzE0MzYwM2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODMzMDI3MjU2MDU2MDhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNjczMzA0MTA4OTIwODRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTU0MDQ0NDM0MDIwNzJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40OTE2Mjc2NTM5ODc0M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDY0NDk4NjM1Nzk0MzRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wMzI1MDU2MDgxMzEzNWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk1NzUwNTQ0ODYzMTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40MjM4OTc4NDQ2OTUwN2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjU1MDExNDI3OTA4NDdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44MjU0NjExNDY1NTYyNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODEyNTQ0NDE5MDg4ODdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNTE2MjcyMzQ2NjA2MjlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5NjQ2MzY5NDg1NDgxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODQ0OTA1MzM1MjA3NTJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDAyODc4NDA2MDMzNDhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42NDc2ODI2MTE1ODE2NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC43MDE3Njk4OTQwODQ1NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yMDQ1MzAyODU3MzMyMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NjM2MTg4MjI3MDE5MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQwNzA2OTY3MTQwOTg5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42ODg4Mzc1ODE5MjQyNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjkxMzM4OTU4ODQwNzcyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zNDg3NTU4NTUwMjIzOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjcxNDcyMjkwNjkzMzAwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjkxOTgwMDgxMjQzMDg3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjY1MDc0NTU2NDQ5MTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5MDA5MDQ4MzQzODgxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODU4NjgwMjE2MDQ4NDhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNjg4NjU3OTE0NTgzOTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41NTY2MDMxNjgwOTY3OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk0ODQ0MDIxMjkzNjhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjAwNTI1NTkyNTQ5MzRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTQyMTQ1MTE0MDgwMjNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTk2OTY0MjUzNjc0NjFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjY3NDE0NjI2NzkzNTQ0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDk1NDgyMjExODAwNzhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjQ3MzM5MzUzNjg0NjY0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg1OTA0MzI4ODM0MDQ3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjE0MzIzNjUxMzg3MzYwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk0MTQ1NTk4MjIyNDg4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yOTI2ODI5MzU3NTY3MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjA1NzU5MjI0OTI3OTUyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQzNzkzODYxNDU4NzU0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjc4OTA0OTY5ODkyNzI0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zNjM0NTEyNjM3NDQ0MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjY0ODc0NDM1MzU3MTYyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4wODc1MDYwNDY1NjgyNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk3Njg2OTQ0MzYyNTI3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NjQ5NTI2NzgxMjUxMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41Mzk2MDMwNTk0NjUxMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41NTUyNjk0MDY1OTk0N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjc4ODkxNTIzNzM0Nzc0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjczNTM4MjE1NzUyNjMwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTY0NTIwNzIzNzM0MDRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjMwODg5NzczOTE5NDM3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjgwNjY0Mzg5Nzc2ODYwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjAzNTc0OTk1NjI2MTk0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk3MzI1NjE2OTAwOTU5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk4NzIwNjg0NjYwNDg4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDg0MDkxMzM2OTE5NjJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjgxNjg5Mjk2MjcxMjAzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkwODI3NzAzNjI4Mjk4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjY3ODY2ODYwMTE4MjE1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODEyODQ1MDM4NzA4NTZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjE1ODA4NTY5NzMyNTgzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODUyNzk1NTUwMjQzODJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODA3MjMzOTUxMTQzNzFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjQ3MTc0MTg1MTQ2MDVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNDc3ODg3NTczMjkwMzhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNDYzMzMxNDc4MzkyOTVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTYzNjc1NTQ3NjMyMDFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4zODQ4Njc0OTMwMzI0MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTkxNDM4NzU3MTY4MThmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjQ5NDUyNzcyMzk4MDlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODMwODE4NzY5MjU4MzNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTQ3ODA4NTE0MTQ3NjNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjU4NzUzMTkxOTA1MzQxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDEyOTA3NzIzODkxNjNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTU1MzgxMDgyMjA5NjBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODU1NTcwNTIwOTY1MzhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk2NDkwOTIwNDc2MjExZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjY0MDIwOTcwOTIzMTAyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NzMyNzEwMTAyODUyMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjEyMzc4MTI4MTMzMTEwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjkxNDAwMzY2MDIyMTI0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTc5NzI0NzEzNDY5MzBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5OTI1ODM3MzYzODI0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzEwODQ4NDc4NjQwNjdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg2ODc1OTAzNTA3MzEzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjIwMjkxNjk5MjAzNTY0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yNjI0MDAzNDc5NTEyNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC42ODI2NDU1NDM2OTEwOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMjQ2NjQ0MTI5NTMzODhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODc2NDIyNzMxMTUxODNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDI0MTYyNzU4MDY4NjlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yNzE5MjkxNDI4ODkwNWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44MjA2ODYxOTU5MDUxNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44NTA4Nzc4Nzk5NDQ3NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44ODU0NzM3Mzc2MDc1OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44OTYzNjgwMjkwMTQ2OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMTgxNzMwNzgxNTIyMjZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjYxNTIxNDUxNTY4MDBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDkzNTU0NzY1NTg1MzRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41NDg0NTEyMzA0NTYwNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNTQ2Njg0MTQyMjQwOTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NTk4MDc3NDAyMDIyMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4zNzA1MDk5MDYwNDA5MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41OTkxMDE0MDM4MzE3MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzAzNzM1OTQyNjI4OTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45MTIyNzY2NTgyNzA4MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMzQ2MDA3ODU4Nzk1OTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTk0NDE0MjYxNDQyMDBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjY4Nzc0NDgxNzMxMDA4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjMwMjM4ODM3OTU2Mjk5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yNjg0MzI5MTI1MTIzNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgzMTE1NjY4MDA0MzYyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQ5MDcyMzM0NjEzMjQyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjQ1MzU5NzA4NzM3Nzc1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjM4OTc1OTkzMDkzOTc1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTU1MTUzNTgwOTkxMjFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk3NzU3MTI1MjI0MTUwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDUzMDU4OTQ1ODA2MDZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjE3MzI1NTUyODU5NjE2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkyNzcwNjcyMjUwNDk0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5OTQ4MDM1MDI1NzQ0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTgyODU1NDU1NjM0MjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjY0OTQ2MjQ2NTI3NDU4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjg2NDU1MDcxMDQ5NjBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjEyMDE2OTIwNTc2NDM3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjU3MTQ3MzIyMTUzMzEyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC41ODk0NzQ1NjUxNzc1MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zNDg0NzEzMjQ1NDM4OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDE4MTUxNDA0NTQ0NjVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4xNjI3NjQyMjM1ODg2MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTg4NTY1MDIwNDg4NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjExMTM2MDk1NDkwNDQ0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC41NjY0OTYxNDEyODM4NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MDQ5NDg2NjM2MTU4N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NDEzODAyMTAzMjMzMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM1MjgxOTE2NzMzMDE4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43NTcyNTA3NjUzNDY0MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjUzNjUwNTQ5NjQwNTg3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjIwNTQxOTczNjkyNjMwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk0NDM1MTQ0MzY5OTE4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5OTgwMzcxMDIzMzUxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzk4MzU5MTM1NjU1OTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMjkwNzgyNzc2MDU3NzVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4zNTM5Mzc3NzkyMTUyMGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjI4NTg3NzIxMDMwMzBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4zODc2NTY5MzM4NzEwMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40MzQ0MDkwNDQ2NzY4OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45ODU0NjMzMDQ2MzIzMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTgyOTg1ODM3NjIzOTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yMTAyMTUyNDYyNTIwOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4xOTUxMzAyOTE0NjkzNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NDIzOTgzMjI1MTg2N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTU0NzY2NjI0MDAxMDFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45ODM2NDU1NDE3OTE0M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45MzM3OTYzNTMwNDgxMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43MDg4MTk5NDU4MzY4MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODUyMzU0MTA1NzMzMzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMDgzNDIzNDc5NjY0MTBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg2NDI1MDkzMDExMjQ1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjQ1Nzk1MDI1MDI5NDY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjM4ODc5Nzc5MDU5MDQ1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTcyNzQ0MjkzNDQ1OTNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTIwNDUxMjQ3MzU0OTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNjI0MzM2NTI1MjQyMjBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODkxNjI1MzIyNTE4NzhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41NDk1MDk1NTU3MDU2M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMzY4MzQzMzY5NDkyNTJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NjQ1ODI5ODAyMDk3NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45Mzg5MTc2MDk4ODA0NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44OTk2ODM1Mzc0MDM4OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTI2NzY1NzU2NTA5NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wMzc1NzAzNDMxNjk1OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTQwNjM0NzE2MTQxNzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40MTMzMjMzODUzODk2M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTc0MDIyNDExNzAxOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xNjgzMDQ5NDk5NjM3MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMzU4OTk0MTMxNzA1NTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNDY2MzMyMjY2NDk2MTNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDUyMzcyMzcyNzQ5NDdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjU2NDAzNjE2MDI2NjFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMzY3MDM1ODM5NTc0MjRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMzg2NTMyNjU2NDE4NzVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTE2NTMxODAzNjc5MTNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMzA1ODc2Mjg3MjY1OTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNjkwMDA4MDM0OTkzMTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45MDk1MjE3MTM4NjEzMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMzg2NTg3NTExMzM1MjdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTUwMTU3MTIwODk4NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMjkyNTA4MTQwMjk4NTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4zNzQ0NDk5NDM0NDYxNWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjAxODIyMDQ2Nzc2MDhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44Njc3OTY1MTAzNjEyM2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTc0MTg1ODgxNjMyMTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NjQ2ODUyMzY2NjQ3NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44ODQ2MTU3NDAwMzk2M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjU3NTA4NDA1Mjc2NDE0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjA1MTk4OTMzMDU1MTYyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMjEyNjk2NjE2Njk5NjRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjUzNDk5NjIxOTc5NzIwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTcyNDE1NTM3MzEyMzdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjQ5NDI5NTYwMjI2NDk3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTgxODM4NjUyOTE5MDNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk4OTM1MTQyMzM5MTM5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjQwMjQ5MTU5MDA2OTMzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45ODA4MTM4MDA5MTEzMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43Mjg1Njg5NTUzNDA0MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMjczMzgxNDg4MzU1MzJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTk1MDkyMjQ0NzIwOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wNjMxMDgwMjMzODMwMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41NDUzOTU4NzUyOTYxOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMjA0NjE2NzcxOTk1MzlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMTQyMDk5Nzc2Mjg0ODlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNjYyMjM4NDMxNDE2NDdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC43MjUyODU3OTk0MDMyNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODQ3NjQzNDU0ODM2NjVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wMjM3MjMxNjgwMTI2MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODkwMzk4NjM0ODM4MTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44ODg2NjU4MTQ4NDYwMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NTkwMzMwODQ3Nzk4NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjc2NzQ0OTI3MTczODczZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjczNTA0MTIzOTA5ODc5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjAzNzQ3MjAzMTczMTkyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zMTc0NDQzNDk2NjA1NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zNjgzNDExMTg4MzY1MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMzQxMTA4Mjc1OTE2MjNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40MDIxMTIyMjgwNzY5MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40NzgwMzg4MzcxNDE5OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zOTQyMzIxOTc4NjI4OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45ODI5OTE5NTg3OTUxNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjAxOTg5NzkxMzkwMDQ3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zMDk2MzA3MzEyOTc1MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xODA3NjcyMDU5OTMzNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTk5MjU4ODIyOTAxOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yNjI4MTg3MjA5NDI4OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTMxNDk3MzEwODA3NjdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTgzMTMxNjI1NzA0OTBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk5MjM0NzIzMDI3NzNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODAxNDI5OTM3Njc1NTRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjI2MDI0MTY5NjMzNDE3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjc1OTk5NzU5ODU1NzUyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zNTcxMjUxNDc0MzU2M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjE5Mjk4OTYzNzY4NTc0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTg5OTA4NDUwOTUzMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjc0NjQ1MTU2OTkyNDkzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjg2NTU3MTcxNTc5NDUyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTU1OTM4NjY2OTYyOTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMzM0MDgwNDI0Mzg3NTJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44NjE4NTk1Mzg3NDcwOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTAxMDczNjM3NDcxNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjA0NjAyMzk3NTc2NjIzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42NjY5NDI2OTY5MTE5NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MTY0MzYxMTgxMDE0OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42NDAxNjc5MjA3OTQ4MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjE1NjQ5NTMwODM2ODU2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5NTcwNTM0ODA0ODM2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDU4NDQ1ODYwMzgxMTFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjYzNDMxNDY2OTQ3MzQwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMjEwNzkxMTY0NTkyMzRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjA3NzA2ODQ3MDA1OTMxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg5NTgxNDM3MTAxMzI5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk4NTkwMDkwNTc3NzI0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODgyNDE3MjExMzM5ODFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODAwOTkzMzUyNTQ2NzhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMzY4NTE4OTY3MTA4NTNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzgzNjgxMzEzOTI2NjZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40NTUwNjk5OTgwMjU5N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wODcwNzgwNjY3MTY5MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgwOTM4OTk0OTE4NzQ1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44NjgxMTg4MzA4MDcxMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM5MzQ3MzA4NjU0NzA1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zOTQ2NjUyOTc0MDM3NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC42NjgwOTQzMjExNDQ1NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45Nzg3NTMyNTY0OTY4M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43MjQ2Nzg0MDk2Nzc0NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTUwMzg1NjAyODg4NjRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44OTU2MzIxOTU4NzYyNWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4xNzAwNTIzOTQyNDIxMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjU0NjgzMDUzOTYyNjU4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43NjkxMDc5MjAyNjg0OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NjIyNjYxNzU0OTI5OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTc0MzI4MTAxNjg0NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQyNjk3MTU3MDM3NTY3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk1NDM3MzgzNTQ5OTczZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTcwMDIzMjQxMDk5NTJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk1Nzg5MDUzNjU1NjlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNTQxMDY4MjYyNTczNTZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMjgwNTgyNTk4Mjk5OTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODUzNjE0MjA2MzQwMzZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODUyNTY1MjQ0NzA1NzNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNjQ1Njc2MDc3MzU1ODlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjUwNjA4NTQwMTA1MTI4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjY1ODQ2MDE1NDgwMzAwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NzIxMDczNTE4MzI0M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yMzA5NTIxMzA2Nzc5MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NTQyNDA0ODIzNDQ0MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45OTI0MDE0NzA5MTIxOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTY5MjY1NzA1MjQwMjNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC43Mzc3NTY1NDg5NjU3NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4zMDg3MjE2MzIxNDcyNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQxNTE0OTYwNTU2MTI2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yNDUyMzgzOTU3MjYzOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjYzMjA2NjMzMzk0ODA3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zMzgxMzI2NTA4NjAyNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zODY2MTc3OTQ0MTg5N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDU4MjY4Mjg0MjAxNDZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMDY5NDA3NzQxODgwMjlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjIyODk4NDYxNDU1MDU0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTcwNTQ4NTMzMTYzMTZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjE4NTA5OTE1MDE5ODgxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDc1NjU3NjI4OTIwODRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjEwNDg4MjM4MDQ1MDA5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg3NzY5OTQ3NDAyMzk0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43MTg4NjU4NjE4MjAzN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjc4MDMwOTgyNDgwNTM4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5NzkzODczNzM4NjU0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTAwNDEzMTA0OTE0OTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNTc1NjMzMDc2MjYxMjBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTEwMzQzMzczNTIwOTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMjg5MDk2NDYzODM3MTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NjMwNzc4Mzk3MDUzNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40MjE4ODk5ODMxMjUyMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQ4MTQ4NjUxMjMwNDM3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjkzMzM1MDQ5NjgxMDQ3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjQzNTM3MDIzODgzNTg4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NzA4NzM3NDQxODI2N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg2NjM2NDQ1NzExMzY0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjM2NzIyODcxMjg2OTIzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjUyOTE2NTQxNzI5NjFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjgxMDkzMDI1NjY1Njk2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDg3NzgzNzAyMjkzNjNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjI2MjQwNjAzMDYyMjM3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkyNzc0MDk1Mzc5MDk4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjgzOTk2NDk3OTg0NjA0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTU4Mzk4NDkxMzk2NDdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5OTA5NjE1NzIwMjI1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk2MDI0NjA1NzEzOTcwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjc0NjQ5NDY0MTU1MDYxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMTIxNDQ4OTM2MDY0NjJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjc0Nzc0NTk1NTY5ODA1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjI2ODk4MDYyMDA4OTU5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk1NzgxNjY3NDY5NTY3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjc5MDQ3OTI3MDUyNjI4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk1NDcyMzA4NzEzMDk5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjA4NTg4Nzc2MDE5NTUwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQ4NzA4MzMyNzQ2Mjk5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTk5OTkwNDE1Nzk0MzJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNDYzMzIwMzgyNDc0OTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4xMDk2NDEyNjE4NTA2M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzY0OTcwMDQ5NDAxNjJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44OTIxMDkyOTI0MjIzOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41NzM5NzM4OTM2NDMzOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM1Mjg5NzAzMzczNzYwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjc1Mzc0MzE2OTc0NDk1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTY3MDUyMTQ2NTEzMzVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjU5MTc0Mzk3Njg1NzE0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg5NDA1MzcwNDIyNzUyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjc1MDg3OTA2NjkxODkwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjI5NjEyNjcyOTgyMzk2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45ODYwNzg1NzMzNjIzMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjI1MDM0OTExNzMwMDIzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC40MDc2MTA1NjY0MDUwNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MDA0NTU3MzQ0NDY5NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42NjkyOTI2Njc0MDQ3N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk4NjI5NDkzNDAxNzQ4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NzQ2MzY5NTI1NzMxMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wMDE5MDIyMzMwMTMwMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45MDE0NTUwOTQwOTg1OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5NzgxMzkwMzY1NDQ2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44NzI1OTI4OTA0ODA0M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5MjMzNTg3MzUzNjY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MTUyOTQ2MTQ0NzY5MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xNTY5ODcwNzUzNDIwNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDMzMDU3Mzg4NDA3MDVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMzcyMDUyNjI4NTk3NjRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDcyMjMwNTEzNjgzMzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODg4MDUwMDE3MzM2MjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk0OTgwMTIxODgzNTNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NzA5NDM1ODExMzM4N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzQ5MDQ5Mzk1MDA1MTlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTk4NTQ4MzY0MTUyMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wNDU4NTIyODU3NDIxMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5ODEyMzM3NDQ0MDgyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44OTA1NDk1NDI1Nzk5M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zMTc5MTkxMzE4ODA2NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODM3ODIxNDQ2NTEyNTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NzYzNzYzMjU0NzQ2NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4zMzQ1NDgwNDkzMzgwNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44NjIzMTUxNjgwMDQwOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk3MDc1NzkzNjI4MjRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45MzIzNzk5MDA3OTQ0MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMjI4Mjc1Mjc4NDM5OTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4xODg3NDc1OTM5Nzk5N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42NzI0ODA0NjI4OTE0M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wMzY0NjIxMTM5MDU2OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDUxNDY1MzgxODc5NDRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTI1OTk3MDAxMjA2NzlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk5NDcyOTU3NDk5MDVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45MzYyNTIyOTcwNzkxMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42Njk1MTEyNDM5MDM2M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk4OTA1ODI1NjIzODkzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTYwMjk1NjU1OTE3OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC40NDY1NDcxNTc1NzY4OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44MjEwNDkwNTQ4MzU5MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5NTQwNzQxNzI0OTI4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5MTg2NTEwOTg4NzgyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzIwMjMwMDEzMTI5NDdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjY1Mjg0NTkyMzkyOTE4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTIxODY3MjMyNTM2MzdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTM4ODU0NDM3OTgxODhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzQ4OTUzMTI2MTUyNTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTY3MzUyNDg3MzgzODhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45MDg5MTgxNjk3ODYyOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMjIyMjU5Njg4NDExMTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41NzEyNDAyOTc4MTIyOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDQxMzI3ODM3NTM0MTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTI2ODg4NDA2NTkyODBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg1Njk0OTc0MjE5NTc0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODg4NDQ1MzI3MTk4NDRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTE3ODMwNDIwOTE3NjJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNDYzNTY4OTIzODM5NzBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzI1NTY5NzQ0MTU2OTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTk4OTk1NTU3NzA3NDdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5NzExNTgxODM0NTA4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTgyMTE1NjAxODA0MjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzc2Mzg5NzYzNzE5NjZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NDMyMTgzNDg3MzgxOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wNzcxNzMyNDI1MzkyNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjU4NjM4Mzk5ODU2NTk1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC41NjA0OTgyOTE5NDE2M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgyNTIyMzAxNTY5MDM2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk4Mzk4ODkzNjM5OTg4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMzk0Njc0NDA0MjA1NjlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNDc1NDY5NDY4NDQ5MzhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42ODYxMzA0NDgzNjgxMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42NTY3NTA4OTMxNDYzMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjE4MzMxNjM3MTM0ODgwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjAzMjczMzc1NDU3OTgwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjc0OTMzMTA5NTY0MTA4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zODY4NDE0NDc4NDczOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjUxMzM3MzQ5MDMwNDA2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NzM0NjI2Nzk0NDU0NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NjU0OTM2NDM4NDA5OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNTMyODIxNTYwNjE5NDJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTE0MjMyNjUwOTEzNTRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk4MTczMTA3MzExNzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42MTEzMzU3MjQ4MjE0OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNTAyNTQ1MDA3NzI2MzVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODg4MjkzMzgxMzQyOTRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDE5OTU4NzMyMzg4NTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44NTIyMzUxNTA5Njc2NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTkzMDM4MTk3MzgwNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk0NTc4ODk2Mjk2NjQ5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjgyOTA3NzY3NjAwNzgzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjA2MzIzNDQyNTk4MTI4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC41ODY2MDcwOTY2OTcyOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk2ODQwNzczODA2NTgyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4xNzU3MzczNjY2NzI2N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC40ODE2NjkyMDg1OTQ4NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44MzQzNDI5MjQwMTM0NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xMzAyMzQ1MDY0Njk5N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wNTk0NjQ5MTMwNzAyNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjIwNTExMDQ3MDc0ODY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjgxNTA1NDg0NTc0NjAyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk0Njg1OTQ3ODYxMzY5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC40NDk3NjM4MDk1NDg2MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQwODk0NTcyNjcxNTQ1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44OTc0NjQ3NDYyNTY3MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5ODQ2NTc4ODM4NTM3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjM5Njc3MjU2MTMwNzkyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjc0ODU0NjY4NjA5MzU5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4wNzU4ODk0ODU2MzA3OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjc0MDk2MjE0MDg0MTcwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjc2MzQzMTk4OTUxNDQ1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDE3NDY2Mjk0MjI2MzRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjc0NDkwMTA0Njk5NjI2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTQ3MjU5MTE3NDQ2MTBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNjQ4ODAxMTk3OTI3NTlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40MTMzNjY2MDgzMDU3MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42MjMxOTUzNzQ2MjU0MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MzA5ODMxMzU1MjU5OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40MjIxNTgxNzU5NDgwN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wNzcxMjc4NzM4NTIwOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wMjcwNDU1NDE0MTg4NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wNTQxNzUxODA1MzY2NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44MDAwMTc3MzU2NjgxOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjkxNTQyMTk1MTQxMDM5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43OTM1MTgzMjM0ODgxNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zNjIwODg5Nzk4OTEzNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42Mzg3MjM1OTE1MTYzNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjA4MTI4MjUyNDkzNDQ0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjUyODkwNTIwOTYwMjk1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjAwNDg4NzI0NTU1OTJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzQyMzg1NTI5MTQ1ODdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wNDQ5MTkxNTI5MTA0NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTA5NjEzMTQ0OTI1MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xOTQ1MTE4Mjg1NDQwMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODA0MTIzMjk2NDMxMDlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODg1MTM4MTgxOTk0NTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjY0NjEyNjE2MTI5NzM2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzIxOTg2NzQ4MDQ1NDRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMTE2NTc3NzA2NjMxOTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODM2NjI4MzM4MTUwNDFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk1MDUzMTgyNDg4MTAxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk2OTM5OTA1MTM4MDgyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42MjIyODg3MjkyODYyMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgyNzY3MjYyODQ2NjYxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjAzMDA0NDc1Nzg3MzE2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk5NzM4ODk2MzMzMzg0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45Nzk4NzIxNDM0MTAzNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM2NTI2MTI5Njg2NDI1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTk4Njk4MDc0NjIwMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zNjAyMTYxMDI5OTcxNWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44OTExMDY0ODU5OTg3OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45Nzg5NDI1MDM0MzA0NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4xMDQwNzk2MDUxMDU4MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjc3MzU3NzkzODExNjE5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk1OTY0NzM3ODIxNzI4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjM1NDM1ODE4Mjg1NTAyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjUwODQzMjMzMTU5MTYyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTYxMDc2OTEyNjYyMDVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMTcwMDYzMzQ2NzA2MTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzY4NTQwMjUzMTQ4MjlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMjU4NzI2NzUwNjMzNjBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTg5MzMwMzkzMzgxNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDExMTU5OTg2ODE5MzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45ODQ5NjAxOTc0MjQ0NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzk1OTg3MDI5NzMyNjFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NzEzODQxMTMxODg5NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTkyNjQ3MDg5NDgxMDFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTk1NDI4MjI0MDI1MzZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5ODI5NjYzNzUyODE4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDE4NzcxMzg4MjQzMTFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjcwODAxMDE2NTQ4MTg0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMzM2ODA2ODU5NDgxMTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjcwNDY3MDU3Nzg2ODI2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTMyNzI3Nzc1MDE4NTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk4NDYwMjE5MDUyNTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTg3MjU3NDYyNTQ0MzNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjYzMzY0OTY4NTM0NjUwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE2NDczNTk0NDIzNzQ2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4xNjI1ODIxNzUwMDc5MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NTkzOTEyNTQwMDgwMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDM2NDU1OTQzNjA2MzNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTQ4MDUwMzAxMTMyODRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5ODQ4NDcxNzAyOTc2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTYyNDUxNjY5MjM4MDlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjE2Nzk2NDU4OTY4OTk4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk4OTg3NTExODkwNDcwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44Nzk3OTIyNTc0NTIxM2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43MTcyNTcyNTA0MTY4MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40NDE4MzA5OTAyMTc4NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MzU2ODk3NDQ5ODc2MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45MzMxMDE4MDEyNTUzMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45OTkxMzMwODA2ODI0NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTM5NDE5MzE3ODIwMDJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNTY0MDkzNzk2NDAzNTZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg4NTkwMDAzMTg4Njc3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDc2MjQ2MDA0OTEzODJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk5NzE0NjM3MDM2OTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODM4ODk5NTQyNTM0NjJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjc1Mzc2Mzg1NjM5OTc4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDA4MTQ2NDM0Mzg2MjVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTM4ODc2ODU2MTU4NzVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMTEyODQ1MjgyMDQ2MzZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODUxMjY0MzU3ODIzMDlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41MjM0OTI1MTU0MzU0N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4zOTcwMTQyMTQ0NjM4MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgxNzc5NjM0MTc0MzE2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zNzAyNDQ2NDE4NzQzN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44NzA3MTY1NjIyMjk1OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMzYwMjQ4MjgyNDI4OTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4zNDY1NTczNTY0ODI4N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTMzODg4MTI1NDkyMDlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODQ0NzY1NDEwOTY0MjlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjY1Mjk4ODA0NTUyMTE5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE4NDM5NTc1NDUwOTIxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjExOTYwMzE5MDA2ODQzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTk4OTkzNDY3ODAxNjhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTQyOTI1NjU1NTMxNjBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44MzE2MzkwNjUxODI5M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC43NTA4MTE0NTI4Njk0OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zNTUzMzIyMzE0MjI2NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41NjcyMTk3OTc0ODM5NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yNDA3NjgzNjQxNDQ5OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40Njg1Nzc2Njc0NjAyOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zMDE0MDIzMzQ1NzE5OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NzMxMjMxMzkyMzYzNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45OTU0ODE5MTYzMDAzMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMzgyOTk5NzY1NjcwMTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45ODUxNjkwOTcxNTQyN2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40MTAyNTgwMDAxOTQ2M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjAyMTE2NzM2OTM1NzM0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjA5NjM4MDYyMDA4MDQ4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDQ0MTE5ODQzODE0NTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg1MjgzMjQ5Mjc1Mzk3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTE0NzU1NjM5MjI0MjFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODg4NjY4MDg5NTgxMjRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTk3MzUyNjcwODMyMjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjQ4MjAyNDI5NTM2OTg5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk2ODA1NjA4ODg0MTY0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjI3NTcyNTgyNDE2NTY3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTg2MzQ3NTMzMzU4MzJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjY1ODg5MTI5NjU5MTY4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTg4MzU2MzQxMzg1ODNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTg4MzgwODY5NTM3MzJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTk5NDM0OTYwMDIzNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMjA2NTEzNDk2MjA2ODlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41NDU5MzA0NDA2NjM1NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjIxMjY0MTYzNTY5MjBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNTk4OTM2ODE3MDAzOTJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMjAzMjAxMDU0MTA0MzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODY4NzkxODAzNTUyODlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk3NzkwNTQ4NjAwNTg0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTYyOTA4MDY5OTkyNDJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMTExMTI1MzQ3MzUxMjZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yMTQ4NDc2MzMxMzMwMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDEzNjgzMzczMTQxODJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yODIxNjgzNzY4MDM2NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4yNDEzMzAzODk5Mjk2MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjUxMjk0MzYyNjMwMjM4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42NjM5MzQxMDY3NDg4NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wODI0OTY3OTYyOTA4MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNTM2OTc4MjkxNzg3NTJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTc2NDk5MDM5MzYyMjhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk3MjI0NzM3ODg5MzQ4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMjIwODEzMzM1Nzk4MzdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODczOTI0NzcxNDQ1NDlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMTI3OTYxNzM3NDAzNjFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMTkwNTAzNjEwMTU3NTNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wMTYwMjYxNTM4NzE5NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDYzNTM0NDEyMTI3MjRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTUyNDkwNDE1MzkwMDZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjA3MDY0MDk2MzM5MDIxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk0NDc5ODAzMjA1ODg2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MjQ0NDA4NTQ4NDQ2NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xMDQ1NzU5MDE4NzQzNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODM4MjI1OTM1Nzg3MjhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMDE2OTUwNDMyMDg4ODVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzUyMTQ2ODE4MTExNTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTk5NTU2ODEwNDI2NjVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjQyMTAyOTk4ODI5MzM5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTk3MjA5NDE5OTkzOTRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjcyMDk0Nzg2MjM3Njk2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjM1MDA4OTYxOTM0MjU1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjc4ODQzMzExMDE5MjUxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTI4NTEzOTg5NTgyNzFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTczOTQwMjc4OTc0NDJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjY2OTU5NDQwODY1NjFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTkyMDY0NjM0Nzc5NDZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNTcwMTAxMjA4NDk0MjlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzY3ODk2MDk0NjE3OTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzY1MTkzNTY3MzA5NjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjgyMDAyNDIxODM2NDA5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjczNTMwMTc5NTUzNzY3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjgxOTI0OTkwMDI1NzI0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTk2OTg0MjUyNTA1NzlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjI2NzE5ODUwODczMzU3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjg5MDMzNjk3NzYxOTNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjQzMzExMjYwMzgwOTc1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODUzMjE4MTU5NDc0OTBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTkxOTQ5Nzk2NzM4MzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45MTg3NjI0OTc2NjQyMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODA2OTIwMDEyNDg0ODdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMzI2Mjc1NDA2NjMyMTRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNDMwODAwMDM2NDk5NzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjE5MTkwOTU2MzY2MzhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNjc3MDk0OTE5MzczNTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTU0NzgwNzU4MjI5MDZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNTYxNTE3NzA1NjgzMTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzA2OTM4MTE3NDc3NzhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMTA4MzE4NjI4MTA3NDlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMDg2Mjg4MzcxNzQ1OTJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTEyMjk0MTc1NDA0MzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNjU5ODczNTE0MDg0MTBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjQ4OTcyODkzOTMyMjc0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTYyODkyNDYzNjI2ODZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg5MDMzNjU4Njg5Njk3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjcxNjU2NTYzOTg3MDgyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjY1MjY5NDQ3NDc1MDk0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjU5MTYwMDQ4MzM5MzJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNjc0Mzk0NzgxNDExMjFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODE2ODQzODA4NDY3OTZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjQ3NzcwODMyNDE2OTczZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE2Nzg5NTU2MjAzMDI1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTcxNTk3OTI2MDg3OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MzU2NTc4NDAwNzY0OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTA4ODk1OTM2MDI1NDZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42MjAzNDM5NzA1NDM4MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDY2MTg2MjI1NDgxNzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjM4MTIyMTcyMjEzNTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk0MzAyNjY5MTk3MjhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4xODgxMjU1NTMxNzU1M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NzY4NjQwMjM4MTg0M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yODY2NDUzNDM2NjYyMGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NDgxMzY1MDIyMTI2OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NzUwNjY0MDAyNzEyOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTU0MzQ0OTc0OTI4NTNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzk2MDc5Nzg1MDE5ODNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjQ5MTA0NzgzMTM3MTUwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMzI4OTUyMTQzNTk2NjNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk4ODExNzUxMjA3NTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44ODk5Mzk4MzgzMTM1NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41MDQ0OTE2Njc2MDMwM2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44NTk5NTA3MjQwODQzNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40NzE2Mjg5MTA2NTEwOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xODY4MDIwNDA0OTU2OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjIwODE1ODEzNjE4NDBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC43NTAwMDY3NjIxODk1NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDM4NjcwMTUyNTA4MTJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTk5ODA2OTI0NDMyMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45ODYzMDU2MzIzMjA3NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41MzU3ODg5OTYwMDY2MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjE1MTAzNjIyNzczNzRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODk1MTUwMTk4OTk5OTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjAzODQxNTE3NjAxODQzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjY5ODg4ODE1NjgxMTc5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zMDEwMjE1NzMwNDY0NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wNzY2NzgwODkyMjIwNWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40MTg4MTI4NDE4MjY4M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjAyMTg4MDk4OTIyMjgyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44NjEzNTQ1NDk0MTIzN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk4OTQ3NDgwOTA5MzU5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjY3MjI2ODYxMzkzNzg4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjEzNDk0Mzg5MDExMDE0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43MDczNzM5ODg0MjA2OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43NjU0NzM0OTMyNTk5MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NDA0NDk0NjY4Nzk2M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjA5MDI2MjAxMTU3NDE2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44MjM4NjM1MjUzNDMyN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjA4OTI0NzY4ODIzNjc2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zMjA3MDY2NjY5ODY1NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjUwMTQzNDIxOTA4NzUzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjU3NTkzMTYzMjI0NDg3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk4OTY2NDIyOTIxNTA5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zNjMyNjAxODQxOTk2NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjA3NDQwMjQzMTIzMjI4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5OTc5MDQ0Njc0MzUwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE0MTMwMjg3MzQ3NDA1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MjM2NjAyMzMyNjkzMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45Nzk3OTI5ODA2ODE4MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDQ2MDcxNzg1MTg1OThmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNTQyMzMyNTIwMTYzOTRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNDQyMjY4MDA5MzI5NTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC43MTMyNjc1Njc0Mjc1MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wMzY3MTkwNzE1ODMxMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjYzNjA2Mzg5MzY2Njc1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjUyMTc1NDI0NjgyMTk1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg1Mzk2ODI2NzM1NzA1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NDcwMTEzOTY5MDk1NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wMTgyNjM0ODE5NDI1NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTg3NTk2MDY5NDYwNDlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44MjI4ODcxNDMwMzA3M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44NzQzNDc5NDc0MzYyNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg5Mzk5NDk1NjU1NDMzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MzQxMjA0MTc1ODc0NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQxMzc0MDUyMDI0MzYzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk2MDYzOTQzMzE1NTExZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTMxMTY3MDk1NDEyODBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTc1MzQyNTM0NTc4MzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44NjE1MDkzMDgxMjY4OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTY0MjQ2NjUwNDE2M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjcwMTkwMDQzNDI3NTEyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NDcwNTA4OTY2NTk4NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yOTU4MDA0MjgxNDMwNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45MTU5OTgwNzA4NzM3NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45ODE0NzgzMDM4NTc4MWYgLyA4LjApfX07CiAvL0B9CiAKIC8qCkBAIC03MzQsNzYgKzEyNzQsNjIgQEAKIH07CiAqLwogCi0KLS8qIFRoZSBDTERGQi04MCBpcyBub3QgbGluZWFyIHBoYXNlICh1bnN5bW1ldHJpYyksIGJ1dCB0aGUgZXhhY3QKLSAgIHBoYXNlIGRpZmZlcmVuY2UgYmV0d2VlbiBhZGphY2VudCBiYW5kcywgYXQgZXhhY3QgcG9zaXRpb25zCi0gICAoaW4gdGhpcyBjYXNlIGV4YWN0bHkgaW4gdGhlIGZyZXF1ZW5jeSBiYW5kIGNlbnRyZSksIGNhbiBvZgotICAgY291cnNlIGJlIGRldGVybWluZWQgYW55d2F5LiBXaGlsZSB0aGUgc3RhbmRhcmQgc3ltbWV0cmljIFFNRgotICAgYmFuayBoYXMgYSBwaGFzZSBkaWZmZXJlbmNlIG9mIDAuNSpwaSwgdGhlIENMREZCLTgwCi0gICBiYW5rIGhhcyB0aGUgZGlmZmVyZW5jZSAwLjIzMzcqcGkuICovCi1jb25zdCBGSVhQX1NHTCBoYXJtb25pY1BoYXNlWCBbMl1bNF0gPSB7Ci0gIHsgRkwyRlhDT05TVF9TR0woIDcuNDIzNzM1NDk0Nzc4MTUxZS0wMDEpLCBGTDJGWENPTlNUX1NHTCgtNi42OTk4NjIwMzYxNTk0NzVlLTAwMSksCi0gICAgRkwyRlhDT05TVF9TR0woLTcuNDIzNzM1NDk0Nzc4MTUyZS0wMDEpLCBGTDJGWENPTlNUX1NHTCggNi42OTk4NjIwMzYxNTk0NzRlLTAwMSkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggNy40MjM3MzU0OTQ3NzgxNTFlLTAwMSksIEZMMkZYQ09OU1RfU0dMKCA2LjY5OTg2MjAzNjE1OTQ3NmUtMDAxKSwKLSAgICBGTDJGWENPTlNUX1NHTCgtNy40MjM3MzU0OTQ3NzgxNTFlLTAwMSksIEZMMkZYQ09OU1RfU0dMKC02LjY5OTg2MjAzNjE1OTQ3NmUtMDAxKSB9Ci19OwotCiAvKiB0YWJsZXMgZm9yIFNCUiBhbmQgQUFDIExEICovCiAvKiB0YWJsZSBmb3IgOCB0aW1lIHNsb3QgaW5kZXggKi8KLWNvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzggWzhdWzVdID0gewotLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KLS8qIGJvcmRlcnMgZnJvbSBsZWZ0IHRvIHJpZ2h0IHNpZGU7IC0xID0gbm90IGluIHVzZSAqLwotICAgIC8qW3xULXwtLS0tLS1dKi8gIHsgMiwgMCwgMCwgMSwgLTEgfSwKLSAgICAvKlt8LVQtfC0tLS0tXSovICB7IDIsIDAsIDAsIDIsIC0xIH0sCi0gICAgLypbLS18VC18LS0tLV0qLyAgeyAzLCAxLCAxLCAyLCAgNCB9LAotICAgIC8qWy0tLXxULXwtLS1dKi8gIHsgMywgMSwgMSwgMywgIDUgfSwKLSAgICAvKlstLS0tfFQtfC0tXSovICB7IDMsIDEsIDEsIDQsICA2IH0sCi0gICAgLypbLS0tLS18VC0tfF0qLyAgeyAyLCAxLCAxLCA1LCAtMSB9LAotICAgIC8qWy0tLS0tLXxULXxdKi8gIHsgMiwgMSwgMSwgNiwgLTEgfSwKLSAgICAvKlstLS0tLS0tfFR8XSovICB7IDIsIDEsIDEsIDcsIC0xIH0sCitjb25zdCBpbnQgRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV84WzhdWzVdID0geworICAgIC8qIHRyYW5zaWVudEluZGV4ICBuRW52LCB0cmFuSWR4LCBzaG9ydEVudiwgYm9yZGVyMSwgYm9yZGVyMiwgLi4uICovCisgICAgLyogYm9yZGVycyBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCisgICAgLypbfFQtfC0tLS0tLV0qLyB7MiwgMCwgMCwgMSwgLTF9LAorICAgIC8qW3wtVC18LS0tLS1dKi8gezIsIDAsIDAsIDIsIC0xfSwKKyAgICAvKlstLXxULXwtLS0tXSovIHszLCAxLCAxLCAyLCA0fSwKKyAgICAvKlstLS18VC18LS0tXSovIHszLCAxLCAxLCAzLCA1fSwKKyAgICAvKlstLS0tfFQtfC0tXSovIHszLCAxLCAxLCA0LCA2fSwKKyAgICAvKlstLS0tLXxULS18XSovIHsyLCAxLCAxLCA1LCAtMX0sCisgICAgLypbLS0tLS0tfFQtfF0qLyB7MiwgMSwgMSwgNiwgLTF9LAorICAgIC8qWy0tLS0tLS18VHxdKi8gezIsIDEsIDEsIDcsIC0xfSwKIH07CiAKIC8qIHRhYmxlIGZvciAxNSB0aW1lIHNsb3QgaW5kZXggKi8KLWNvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE1IFsxNV1bNl0gPSB7Citjb25zdCBpbnQgRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV8xNVsxNV1bNl0gPSB7CiAgICAgLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KICAgICAvKiBsZW5ndGggZnJvbSBsZWZ0IHRvIHJpZ2h0IHNpZGU7IC0xID0gbm90IGluIHVzZSAqLwotICAgIC8qW3xULS0tfC0tLS0tLS0tLS0tLV0qLyB7IDIsIDAsIDAsIDQsIC0xLCAtMX0sCi0gICAgLypbfC1ULS0tfC0tLS0tLS0tLS0tXSovIHsgMiwgMCwgMCwgNSwgLTEsIC0xfSwKLSAgICAvKlt8LS18VC0tLXwtLS0tLS0tLS1dKi8geyAzLCAxLCAxLCAyLCAgNiwgLTF9LAotICAgIC8qW3wtLS18VC0tLXwtLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDMsICA3LCAtMX0sCi0gICAgLypbfC0tLS18VC0tLXwtLS0tLS0tXSovIHsgMywgMSwgMSwgNCwgIDgsIC0xfSwKLSAgICAvKlt8LS0tLS18VC0tLXwtLS0tLS1dKi8geyAzLCAxLCAxLCA1LCAgOSwgLTF9LAotICAgIC8qW3wtLS0tLS18VC0tLXwtLS0tLV0qLyB7IDMsIDEsIDEsIDYsIDEwLCAtMX0sCi0gICAgLypbfC0tLS0tLS18VC0tLXwtLS0tXSovIHsgMywgMSwgMSwgNywgMTEsIC0xfSwKLSAgICAvKlt8LS0tLS0tLS18VC0tLXwtLS1dKi8geyAzLCAxLCAxLCA4LCAxMiwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS18VC0tLXwtLV0qLyB7IDMsIDEsIDEsIDksIDEzLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS18VC0tLS18XSovIHsgMiwgMSwgMSwxMCwgLTEsIC0xfSwKLSAgICAvKlt8LS0tLS0tLS0tLS18VC0tLXxdKi8geyAyLCAxLCAxLDExLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tfF0qLyB7IDIsIDEsIDEsMTIsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLS18VC18XSovIHsgMiwgMSwgMSwxMywgLTEsIC0xfSwKLSAgICAvKlt8LS0tLS0tLS0tLS0tLS18VHxdKi8geyAyLCAxLCAxLDE0LCAtMSwgLTF9LAorICAgIC8qW3xULS0tfC0tLS0tLS0tLS0tLV0qLyB7MiwgMCwgMCwgNCwgLTEsIC0xfSwKKyAgICAvKlt8LVQtLS18LS0tLS0tLS0tLS1dKi8gezIsIDAsIDAsIDUsIC0xLCAtMX0sCisgICAgLypbfC0tfFQtLS18LS0tLS0tLS0tXSovIHszLCAxLCAxLCAyLCA2LCAtMX0sCisgICAgLypbfC0tLXxULS0tfC0tLS0tLS0tXSovIHszLCAxLCAxLCAzLCA3LCAtMX0sCisgICAgLypbfC0tLS18VC0tLXwtLS0tLS0tXSovIHszLCAxLCAxLCA0LCA4LCAtMX0sCisgICAgLypbfC0tLS0tfFQtLS18LS0tLS0tXSovIHszLCAxLCAxLCA1LCA5LCAtMX0sCisgICAgLypbfC0tLS0tLXxULS0tfC0tLS0tXSovIHszLCAxLCAxLCA2LCAxMCwgLTF9LAorICAgIC8qW3wtLS0tLS0tfFQtLS18LS0tLV0qLyB7MywgMSwgMSwgNywgMTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS18VC0tLXwtLS1dKi8gezMsIDEsIDEsIDgsIDEyLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLXxULS0tfC0tXSovIHszLCAxLCAxLCA5LCAxMywgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tfFQtLS0tfF0qLyB7MiwgMSwgMSwgMTAsIC0xLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLS0tfFQtLS18XSovIHsyLCAxLCAxLCAxMSwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tfFQtLXxdKi8gezIsIDEsIDEsIDEyLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tfFQtfF0qLyB7MiwgMSwgMSwgMTMsIC0xLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLS0tLS0tfFR8XSovIHsyLCAxLCAxLCAxNCwgLTEsIC0xfSwKIH07CiAKIC8qIHRhYmxlIGZvciAxNiB0aW1lIHNsb3QgaW5kZXggKi8KLWNvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE2IFsxNl1bNl0gPSB7Citjb25zdCBpbnQgRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV8xNlsxNl1bNl0gPSB7CiAgICAgLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KICAgICAvKiBsZW5ndGggZnJvbSBsZWZ0IHRvIHJpZ2h0IHNpZGU7IC0xID0gbm90IGluIHVzZSAqLwotICAgIC8qW3xULS0tfC0tLS0tLS0tLS0tLXxdKi8geyAyLCAwLCAwLCA0LCAtMSwgLTF9LAotICAgIC8qW3wtVC0tLXwtLS0tLS0tLS0tLXxdKi8geyAyLCAwLCAwLCA1LCAtMSwgLTF9LAotICAgIC8qW3wtLXxULS0tfC0tLS0tLS0tLS1dKi8geyAzLCAxLCAxLCAyLCAgNiwgLTF9LAotICAgIC8qW3wtLS18VC0tLXwtLS0tLS0tLS1dKi8geyAzLCAxLCAxLCAzLCAgNywgLTF9LAotICAgIC8qW3wtLS0tfFQtLS18LS0tLS0tLS1dKi8geyAzLCAxLCAxLCA0LCAgOCwgLTF9LAotICAgIC8qW3wtLS0tLXxULS0tfC0tLS0tLS1dKi8geyAzLCAxLCAxLCA1LCAgOSwgLTF9LAotICAgIC8qW3wtLS0tLS18VC0tLXwtLS0tLS1dKi8geyAzLCAxLCAxLCA2LCAxMCwgLTF9LAotICAgIC8qW3wtLS0tLS0tfFQtLS18LS0tLS1dKi8geyAzLCAxLCAxLCA3LCAxMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLXxULS0tfC0tLS1dKi8geyAzLCAxLCAxLCA4LCAxMiwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS18VC0tLXwtLS1dKi8geyAzLCAxLCAxLCA5LCAxMywgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tfFQtLS18LS1dKi8geyAzLCAxLCAxLDEwLCAxNCwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLXxULS0tLXxdKi8geyAyLCAxLCAxLDExLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tLXxdKi8geyAyLCAxLCAxLDEyLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS0tfFQtLXxdKi8geyAyLCAxLCAxLDEzLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS0tLXxULXxdKi8geyAyLCAxLCAxLDE0LCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS0tLS18VHxdKi8geyAyLCAxLCAxLDE1LCAtMSwgLTF9LAorICAgIC8qW3xULS0tfC0tLS0tLS0tLS0tLXxdKi8gezIsIDAsIDAsIDQsIC0xLCAtMX0sCisgICAgLypbfC1ULS0tfC0tLS0tLS0tLS0tfF0qLyB7MiwgMCwgMCwgNSwgLTEsIC0xfSwKKyAgICAvKlt8LS18VC0tLXwtLS0tLS0tLS0tXSovIHszLCAxLCAxLCAyLCA2LCAtMX0sCisgICAgLypbfC0tLXxULS0tfC0tLS0tLS0tLV0qLyB7MywgMSwgMSwgMywgNywgLTF9LAorICAgIC8qW3wtLS0tfFQtLS18LS0tLS0tLS1dKi8gezMsIDEsIDEsIDQsIDgsIC0xfSwKKyAgICAvKlt8LS0tLS18VC0tLXwtLS0tLS0tXSovIHszLCAxLCAxLCA1LCA5LCAtMX0sCisgICAgLypbfC0tLS0tLXxULS0tfC0tLS0tLV0qLyB7MywgMSwgMSwgNiwgMTAsIC0xfSwKKyAgICAvKlt8LS0tLS0tLXxULS0tfC0tLS0tXSovIHszLCAxLCAxLCA3LCAxMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLXxULS0tfC0tLS1dKi8gezMsIDEsIDEsIDgsIDEyLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLXxULS0tfC0tLV0qLyB7MywgMSwgMSwgOSwgMTMsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLXxULS0tfC0tXSovIHszLCAxLCAxLCAxMCwgMTQsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS18VC0tLS18XSovIHsyLCAxLCAxLCAxMSwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tfFQtLS18XSovIHsyLCAxLCAxLCAxMiwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tLXxULS18XSovIHsyLCAxLCAxLCAxMywgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tLS18VC18XSovIHsyLCAxLCAxLCAxNCwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tLS0tfFR8XSovIHsyLCAxLCAxLCAxNSwgLTEsIC0xfSwKIH07CiAKIC8qIQpAQCAtODEyLDIyICsxMzM4LDUzIEBACiAgIFByZWRlZmluZWQgZW52ZWxvcGUgcG9zaXRpb25zIGZvciB0aGUgRklYLUZJWCBjYXNlIChzdGF0aWMgZnJhbWluZykKICovCiAvL0B7Ci1jb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNSA9IHsgMCwgMSwgezAsIDE1LCAgMCwgIDAsICAwLCAwfSwgezEsIDAsIDAsIDAsIDB9LCAtMSwgMSwgezAsIDE1LCAgMH0gfTsKLWNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8yXzE1ID0geyAwLCAyLCB7MCwgIDgsIDE1LCAgMCwgIDAsIDB9LCB7MSwgMSwgMCwgMCwgMH0sIC0xLCAyLCB7MCwgIDgsIDE1fSB9OwotY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzRfMTUgPSB7IDAsIDQsIHswLCAgNCwgIDgsIDEyLCAxNSwgMH0sIHsxLCAxLCAxLCAxLCAwfSwgLTEsIDIsIHswLCAgOCwgMTV9IH07Citjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNSA9IHsKKyAgICAwLCAxLCB7MCwgMTUsIDAsIDAsIDAsIDB9LCB7MSwgMCwgMCwgMCwgMH0sIC0xLCAxLCB7MCwgMTUsIDB9LCB7MCwgMCwgMH0sCisgICAgMCwgMH07Citjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMl8xNSA9IHsKKyAgICAwLCAyLCB7MCwgOCwgMTUsIDAsIDAsIDB9LCB7MSwgMSwgMCwgMCwgMH0sIC0xLCAyLCB7MCwgOCwgMTV9LCB7MCwgMCwgMH0sCisgICAgMCwgMH07Citjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvNF8xNSA9IHsKKyAgICAwLCA0LCB7MCwgNCwgOCwgMTIsIDE1LCAwfSwgezEsIDEsIDEsIDEsIDB9LCAtMSwgMiwgezAsIDgsIDE1fSwgezAsIDAsIDB9LAorICAgIDAsIDB9OwogI2lmIChNQVhfRU5WRUxPUEVTID49IDgpCi1jb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvOF8xNSA9IHsgMCwgOCwgezAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE1fSwgezEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9LCAtMSwgMiwgezAsIDgsIDE1fSB9OworY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzhfMTUgPSB7CisgICAgMCwKKyAgICA4LAorICAgIHswLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNX0sCisgICAgezEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9LAorICAgIC0xLAorICAgIDIsCisgICAgezAsIDgsIDE1fSwKKyAgICB7MCwgMCwgMH0sCisgICAgMCwKKyAgICAwfTsKICNlbmRpZgogCi1jb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNiA9IHsgMCwgMSwgezAsIDE2LCAgMCwgIDAsICAwLCAwfSwgezEsIDAsIDAsIDAsIDB9LCAtMSwgMSwgezAsIDE2LCAwfSB9OwotY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzJfMTYgPSB7IDAsIDIsIHswLCAgOCwgMTYsICAwLCAgMCwgMH0sIHsxLCAxLCAwLCAwLCAwfSwgLTEsIDIsIHswLCA4LCAxNn0gfTsKLWNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm80XzE2ID0geyAwLCA0LCB7MCwgIDQsICA4LCAxMiwgMTYsIDB9LCB7MSwgMSwgMSwgMSwgMH0sIC0xLCAyLCB7MCwgOCwgMTZ9IH07Citjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNiA9IHsKKyAgICAwLCAxLCB7MCwgMTYsIDAsIDAsIDAsIDB9LCB7MSwgMCwgMCwgMCwgMH0sIC0xLCAxLCB7MCwgMTYsIDB9LCB7MCwgMCwgMH0sCisgICAgMCwgMH07Citjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMl8xNiA9IHsKKyAgICAwLCAyLCB7MCwgOCwgMTYsIDAsIDAsIDB9LCB7MSwgMSwgMCwgMCwgMH0sIC0xLCAyLCB7MCwgOCwgMTZ9LCB7MCwgMCwgMH0sCisgICAgMCwgMH07Citjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvNF8xNiA9IHsKKyAgICAwLCA0LCB7MCwgNCwgOCwgMTIsIDE2LCAwfSwgezEsIDEsIDEsIDEsIDB9LCAtMSwgMiwgezAsIDgsIDE2fSwgezAsIDAsIDB9LAorICAgIDAsIDB9OwogCiAjaWYgKE1BWF9FTlZFTE9QRVMgPj0gOCkKLWNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm84XzE2ID0geyAwLCA4LCB7MCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTZ9LCB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sIC0xLCAyLCB7MCwgOCwgMTZ9IH07Citjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvOF8xNiA9IHsKKyAgICAwLAorICAgIDgsCisgICAgezAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2fSwKKyAgICB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sCisgICAgLTEsCisgICAgMiwKKyAgICB7MCwgOCwgMTZ9LAorICAgIHswLCAwLCAwfSwKKyAgICAwLAorICAgIDB9OwogI2VuZGlmCiAKLQogLy9AfQogCiAvKiEKQEAgLTg2NCw0OTQgKzE0MjEsMjI1IEBACiAqLwogLy9AewogY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkxldmVsMTBUWzEyMF1bMl0gPSB7Ci0gIHsgICAxLCAgIDIgfSwgICAgeyAtNjQsIC02NSB9LCAgICB7ICAgMywgICA0IH0sICAgIHsgLTYzLCAtNjYgfSwKLSAgeyAgIDUsICAgNiB9LCAgICB7IC02MiwgLTY3IH0sICAgIHsgICA3LCAgIDggfSwgICAgeyAtNjEsIC02OCB9LAotICB7ICAgOSwgIDEwIH0sICAgIHsgLTYwLCAtNjkgfSwgICAgeyAgMTEsICAxMiB9LCAgICB7IC01OSwgLTcwIH0sCi0gIHsgIDEzLCAgMTQgfSwgICAgeyAtNTgsIC03MSB9LCAgICB7ICAxNSwgIDE2IH0sICAgIHsgLTU3LCAtNzIgfSwKLSAgeyAgMTcsICAxOCB9LCAgICB7IC03MywgLTU2IH0sICAgIHsgIDE5LCAgMjEgfSwgICAgeyAtNzQsICAyMCB9LAotICB7IC01NSwgLTc1IH0sICAgIHsgIDIyLCAgMjYgfSwgICAgeyAgMjMsICAyNCB9LCAgICB7IC01NCwgLTc2IH0sCi0gIHsgLTc3LCAgMjUgfSwgICAgeyAtNTMsIC03OCB9LCAgICB7ICAyNywgIDM0IH0sICAgIHsgIDI4LCAgMjkgfSwKLSAgeyAtNTIsIC03OSB9LCAgICB7ICAzMCwgIDMxIH0sICAgIHsgLTgwLCAtNTEgfSwgICAgeyAgMzIsICAzMyB9LAotICB7IC04MywgLTgyIH0sICAgIHsgLTgxLCAtNTAgfSwgICAgeyAgMzUsICA1NyB9LCAgICB7ICAzNiwgIDQwIH0sCi0gIHsgIDM3LCAgMzggfSwgICAgeyAtODgsIC04NCB9LCAgICB7IC00OCwgIDM5IH0sICAgIHsgLTkwLCAtODUgfSwKLSAgeyAgNDEsICA0NiB9LCAgICB7ICA0MiwgIDQzIH0sICAgIHsgLTQ5LCAtODcgfSwgICAgeyAgNDQsICA0NSB9LAotICB7IC04OSwgLTg2IH0sICAgIHstMTI0LC0xMjMgfSwgICAgeyAgNDcsICA1MCB9LCAgICB7ICA0OCwgIDQ5IH0sCi0gIHstMTIyLC0xMjEgfSwgICAgey0xMjAsLTExOSB9LCAgICB7ICA1MSwgIDU0IH0sICAgIHsgIDUyLCAgNTMgfSwKLSAgey0xMTgsLTExNyB9LCAgICB7LTExNiwtMTE1IH0sICAgIHsgIDU1LCAgNTYgfSwgICAgey0xMTQsLTExMyB9LAotICB7LTExMiwtMTExIH0sICAgIHsgIDU4LCAgODkgfSwgICAgeyAgNTksICA3NCB9LCAgICB7ICA2MCwgIDY3IH0sCi0gIHsgIDYxLCAgNjQgfSwgICAgeyAgNjIsICA2MyB9LCAgICB7LTExMCwtMTA5IH0sICAgIHstMTA4LC0xMDcgfSwKLSAgeyAgNjUsICA2NiB9LCAgICB7LTEwNiwtMTA1IH0sICAgIHstMTA0LC0xMDMgfSwgICAgeyAgNjgsICA3MSB9LAotICB7ICA2OSwgIDcwIH0sICAgIHstMTAyLC0xMDEgfSwgICAgey0xMDAsIC05OSB9LCAgICB7ICA3MiwgIDczIH0sCi0gIHsgLTk4LCAtOTcgfSwgICAgeyAtOTYsIC05NSB9LCAgICB7ICA3NSwgIDgyIH0sICAgIHsgIDc2LCAgNzkgfSwKLSAgeyAgNzcsICA3OCB9LCAgICB7IC05NCwgLTkzIH0sICAgIHsgLTkyLCAtOTEgfSwgICAgeyAgODAsICA4MSB9LAotICB7IC00NywgLTQ2IH0sICAgIHsgLTQ1LCAtNDQgfSwgICAgeyAgODMsICA4NiB9LCAgICB7ICA4NCwgIDg1IH0sCi0gIHsgLTQzLCAtNDIgfSwgICAgeyAtNDEsIC00MCB9LCAgICB7ICA4NywgIDg4IH0sICAgIHsgLTM5LCAtMzggfSwKLSAgeyAtMzcsIC0zNiB9LCAgICB7ICA5MCwgMTA1IH0sICAgIHsgIDkxLCAgOTggfSwgICAgeyAgOTIsICA5NSB9LAotICB7ICA5MywgIDk0IH0sICAgIHsgLTM1LCAtMzQgfSwgICAgeyAtMzMsIC0zMiB9LCAgICB7ICA5NiwgIDk3IH0sCi0gIHsgLTMxLCAtMzAgfSwgICAgeyAtMjksIC0yOCB9LCAgICB7ICA5OSwgMTAyIH0sICAgIHsgMTAwLCAxMDEgfSwKLSAgeyAtMjcsIC0yNiB9LCAgICB7IC0yNSwgLTI0IH0sICAgIHsgMTAzLCAxMDQgfSwgICAgeyAtMjMsIC0yMiB9LAotICB7IC0yMSwgLTIwIH0sICAgIHsgMTA2LCAxMTMgfSwgICAgeyAxMDcsIDExMCB9LCAgICB7IDEwOCwgMTA5IH0sCi0gIHsgLTE5LCAtMTggfSwgICAgeyAtMTcsIC0xNiB9LCAgICB7IDExMSwgMTEyIH0sICAgIHsgLTE1LCAtMTQgfSwKLSAgeyAtMTMsIC0xMiB9LCAgICB7IDExNCwgMTE3IH0sICAgIHsgMTE1LCAxMTYgfSwgICAgeyAtMTEsIC0xMCB9LAotICB7ICAtOSwgIC04IH0sICAgIHsgMTE4LCAxMTkgfSwgICAgeyAgLTcsICAtNiB9LCAgICB7ICAtNSwgIC00IH0KLX07CisgICAgezEsIDJ9LCAgICAgICB7LTY0LCAtNjV9LCAgIHszLCA0fSwgICAgICAgey02MywgLTY2fSwgICB7NSwgNn0sCisgICAgey02MiwgLTY3fSwgICB7NywgOH0sICAgICAgIHstNjEsIC02OH0sICAgezksIDEwfSwgICAgICB7LTYwLCAtNjl9LAorICAgIHsxMSwgMTJ9LCAgICAgey01OSwgLTcwfSwgICB7MTMsIDE0fSwgICAgIHstNTgsIC03MX0sICAgezE1LCAxNn0sCisgICAgey01NywgLTcyfSwgICB7MTcsIDE4fSwgICAgIHstNzMsIC01Nn0sICAgezE5LCAyMX0sICAgICB7LTc0LCAyMH0sCisgICAgey01NSwgLTc1fSwgICB7MjIsIDI2fSwgICAgIHsyMywgMjR9LCAgICAgey01NCwgLTc2fSwgICB7LTc3LCAyNX0sCisgICAgey01MywgLTc4fSwgICB7MjcsIDM0fSwgICAgIHsyOCwgMjl9LCAgICAgey01MiwgLTc5fSwgICB7MzAsIDMxfSwKKyAgICB7LTgwLCAtNTF9LCAgIHszMiwgMzN9LCAgICAgey04MywgLTgyfSwgICB7LTgxLCAtNTB9LCAgIHszNSwgNTd9LAorICAgIHszNiwgNDB9LCAgICAgezM3LCAzOH0sICAgICB7LTg4LCAtODR9LCAgIHstNDgsIDM5fSwgICAgey05MCwgLTg1fSwKKyAgICB7NDEsIDQ2fSwgICAgIHs0MiwgNDN9LCAgICAgey00OSwgLTg3fSwgICB7NDQsIDQ1fSwgICAgIHstODksIC04Nn0sCisgICAgey0xMjQsIC0xMjN9LCB7NDcsIDUwfSwgICAgIHs0OCwgNDl9LCAgICAgey0xMjIsIC0xMjF9LCB7LTEyMCwgLTExOX0sCisgICAgezUxLCA1NH0sICAgICB7NTIsIDUzfSwgICAgIHstMTE4LCAtMTE3fSwgey0xMTYsIC0xMTV9LCB7NTUsIDU2fSwKKyAgICB7LTExNCwgLTExM30sIHstMTEyLCAtMTExfSwgezU4LCA4OX0sICAgICB7NTksIDc0fSwgICAgIHs2MCwgNjd9LAorICAgIHs2MSwgNjR9LCAgICAgezYyLCA2M30sICAgICB7LTExMCwgLTEwOX0sIHstMTA4LCAtMTA3fSwgezY1LCA2Nn0sCisgICAgey0xMDYsIC0xMDV9LCB7LTEwNCwgLTEwM30sIHs2OCwgNzF9LCAgICAgezY5LCA3MH0sICAgICB7LTEwMiwgLTEwMX0sCisgICAgey0xMDAsIC05OX0sICB7NzIsIDczfSwgICAgIHstOTgsIC05N30sICAgey05NiwgLTk1fSwgICB7NzUsIDgyfSwKKyAgICB7NzYsIDc5fSwgICAgIHs3NywgNzh9LCAgICAgey05NCwgLTkzfSwgICB7LTkyLCAtOTF9LCAgIHs4MCwgODF9LAorICAgIHstNDcsIC00Nn0sICAgey00NSwgLTQ0fSwgICB7ODMsIDg2fSwgICAgIHs4NCwgODV9LCAgICAgey00MywgLTQyfSwKKyAgICB7LTQxLCAtNDB9LCAgIHs4NywgODh9LCAgICAgey0zOSwgLTM4fSwgICB7LTM3LCAtMzZ9LCAgIHs5MCwgMTA1fSwKKyAgICB7OTEsIDk4fSwgICAgIHs5MiwgOTV9LCAgICAgezkzLCA5NH0sICAgICB7LTM1LCAtMzR9LCAgIHstMzMsIC0zMn0sCisgICAgezk2LCA5N30sICAgICB7LTMxLCAtMzB9LCAgIHstMjksIC0yOH0sICAgezk5LCAxMDJ9LCAgICB7MTAwLCAxMDF9LAorICAgIHstMjcsIC0yNn0sICAgey0yNSwgLTI0fSwgICB7MTAzLCAxMDR9LCAgIHstMjMsIC0yMn0sICAgey0yMSwgLTIwfSwKKyAgICB7MTA2LCAxMTN9LCAgIHsxMDcsIDExMH0sICAgezEwOCwgMTA5fSwgICB7LTE5LCAtMTh9LCAgIHstMTcsIC0xNn0sCisgICAgezExMSwgMTEyfSwgICB7LTE1LCAtMTR9LCAgIHstMTMsIC0xMn0sICAgezExNCwgMTE3fSwgICB7MTE1LCAxMTZ9LAorICAgIHstMTEsIC0xMH0sICAgey05LCAtOH0sICAgICB7MTE4LCAxMTl9LCAgIHstNywgLTZ9LCAgICAgey01LCAtNH19OwogCiBjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52TGV2ZWwxMEZbMTIwXVsyXSA9IHsKLSAgeyAgIDEsICAgMiB9LCAgICB7IC02NCwgLTY1IH0sICAgIHsgICAzLCAgIDQgfSwgICAgeyAtNjMsIC02NiB9LAotICB7ICAgNSwgICA2IH0sICAgIHsgLTY3LCAtNjIgfSwgICAgeyAgIDcsICAgOCB9LCAgICB7IC02OCwgLTYxIH0sCi0gIHsgICA5LCAgMTAgfSwgICAgeyAtNjksIC02MCB9LCAgICB7ICAxMSwgIDEzIH0sICAgIHsgLTcwLCAgMTIgfSwKLSAgeyAtNTksIC03MSB9LCAgICB7ICAxNCwgIDE2IH0sICAgIHsgLTU4LCAgMTUgfSwgICAgeyAtNzIsIC01NyB9LAotICB7ICAxNywgIDE5IH0sICAgIHsgLTczLCAgMTggfSwgICAgeyAtNTYsIC03NCB9LCAgICB7ICAyMCwgIDIzIH0sCi0gIHsgIDIxLCAgMjIgfSwgICAgeyAtNTUsIC03NSB9LCAgICB7IC01NCwgLTUzIH0sICAgIHsgIDI0LCAgMjcgfSwKLSAgeyAgMjUsICAyNiB9LCAgICB7IC03NiwgLTUyIH0sICAgIHsgLTc3LCAtNTEgfSwgICAgeyAgMjgsICAzMSB9LAotICB7ICAyOSwgIDMwIH0sICAgIHsgLTUwLCAtNzggfSwgICAgeyAtNzksIC00OSB9LCAgICB7ICAzMiwgIDM2IH0sCi0gIHsgIDMzLCAgMzQgfSwgICAgeyAtNDgsIC00NyB9LCAgICB7IC04MCwgIDM1IH0sICAgIHsgLTgxLCAtODIgfSwKLSAgeyAgMzcsICA0NyB9LCAgICB7ICAzOCwgIDQxIH0sICAgIHsgIDM5LCAgNDAgfSwgICAgeyAtODMsIC00NiB9LAotICB7IC00NSwgLTg0IH0sICAgIHsgIDQyLCAgNDQgfSwgICAgeyAtODUsICA0MyB9LCAgICB7IC00NCwgLTQzIH0sCi0gIHsgIDQ1LCAgNDYgfSwgICAgeyAtODgsIC04NyB9LCAgICB7IC04NiwgLTkwIH0sICAgIHsgIDQ4LCAgNjYgfSwKLSAgeyAgNDksICA1NiB9LCAgICB7ICA1MCwgIDUzIH0sICAgIHsgIDUxLCAgNTIgfSwgICAgeyAtOTIsIC00MiB9LAotICB7IC00MSwgLTM5IH0sICAgIHsgIDU0LCAgNTUgfSwgICAgey0xMDUsIC04OSB9LCAgICB7IC0zOCwgLTM3IH0sCi0gIHsgIDU3LCAgNjAgfSwgICAgeyAgNTgsICA1OSB9LCAgICB7IC05NCwgLTkxIH0sICAgIHsgLTQwLCAtMzYgfSwKLSAgeyAgNjEsICA2MyB9LCAgICB7IC0yMCwgIDYyIH0sICAgIHstMTE1LC0xMTAgfSwgICAgeyAgNjQsICA2NSB9LAotICB7LTEwOCwtMTA3IH0sICAgIHstMTAxLCAtOTcgfSwgICAgeyAgNjcsICA4OSB9LCAgICB7ICA2OCwgIDc1IH0sCi0gIHsgIDY5LCAgNzIgfSwgICAgeyAgNzAsICA3MSB9LCAgICB7IC05NSwgLTkzIH0sICAgIHsgLTM0LCAtMjcgfSwKLSAgeyAgNzMsICA3NCB9LCAgICB7IC0yMiwgLTE3IH0sICAgIHsgLTE2LC0xMjQgfSwgICAgeyAgNzYsICA4MiB9LAotICB7ICA3NywgIDc5IH0sICAgIHstMTIzLCAgNzggfSwgICAgey0xMjIsLTEyMSB9LCAgICB7ICA4MCwgIDgxIH0sCi0gIHstMTIwLC0xMTkgfSwgICAgey0xMTgsLTExNyB9LCAgICB7ICA4MywgIDg2IH0sICAgIHsgIDg0LCAgODUgfSwKLSAgey0xMTYsLTExNCB9LCAgICB7LTExMywtMTEyIH0sICAgIHsgIDg3LCAgODggfSwgICAgey0xMTEsLTEwOSB9LAotICB7LTEwNiwtMTA0IH0sICAgIHsgIDkwLCAxMDUgfSwgICAgeyAgOTEsICA5OCB9LCAgICB7ICA5MiwgIDk1IH0sCi0gIHsgIDkzLCAgOTQgfSwgICAgey0xMDMsLTEwMiB9LCAgICB7LTEwMCwgLTk5IH0sICAgIHsgIDk2LCAgOTcgfSwKLSAgeyAtOTgsIC05NiB9LCAgICB7IC0zNSwgLTMzIH0sICAgIHsgIDk5LCAxMDIgfSwgICAgeyAxMDAsIDEwMSB9LAotICB7IC0zMiwgLTMxIH0sICAgIHsgLTMwLCAtMjkgfSwgICAgeyAxMDMsIDEwNCB9LCAgICB7IC0yOCwgLTI2IH0sCi0gIHsgLTI1LCAtMjQgfSwgICAgeyAxMDYsIDExMyB9LCAgICB7IDEwNywgMTEwIH0sICAgIHsgMTA4LCAxMDkgfSwKLSAgeyAtMjMsIC0yMSB9LCAgICB7IC0xOSwgLTE4IH0sICAgIHsgMTExLCAxMTIgfSwgICAgeyAtMTUsIC0xNCB9LAotICB7IC0xMywgLTEyIH0sICAgIHsgMTE0LCAxMTcgfSwgICAgeyAxMTUsIDExNiB9LCAgICB7IC0xMSwgLTEwIH0sCi0gIHsgIC05LCAgLTggfSwgICAgeyAxMTgsIDExOSB9LCAgICB7ICAtNywgIC02IH0sICAgIHsgIC01LCAgLTQgfQotfTsKKyAgICB7MSwgMn0sICAgICAgIHstNjQsIC02NX0sICAgezMsIDR9LCAgICAgICB7LTYzLCAtNjZ9LCAgIHs1LCA2fSwKKyAgICB7LTY3LCAtNjJ9LCAgIHs3LCA4fSwgICAgICAgey02OCwgLTYxfSwgICB7OSwgMTB9LCAgICAgIHstNjksIC02MH0sCisgICAgezExLCAxM30sICAgICB7LTcwLCAxMn0sICAgIHstNTksIC03MX0sICAgezE0LCAxNn0sICAgICB7LTU4LCAxNX0sCisgICAgey03MiwgLTU3fSwgICB7MTcsIDE5fSwgICAgIHstNzMsIDE4fSwgICAgey01NiwgLTc0fSwgICB7MjAsIDIzfSwKKyAgICB7MjEsIDIyfSwgICAgIHstNTUsIC03NX0sICAgey01NCwgLTUzfSwgICB7MjQsIDI3fSwgICAgIHsyNSwgMjZ9LAorICAgIHstNzYsIC01Mn0sICAgey03NywgLTUxfSwgICB7MjgsIDMxfSwgICAgIHsyOSwgMzB9LCAgICAgey01MCwgLTc4fSwKKyAgICB7LTc5LCAtNDl9LCAgIHszMiwgMzZ9LCAgICAgezMzLCAzNH0sICAgICB7LTQ4LCAtNDd9LCAgIHstODAsIDM1fSwKKyAgICB7LTgxLCAtODJ9LCAgIHszNywgNDd9LCAgICAgezM4LCA0MX0sICAgICB7MzksIDQwfSwgICAgIHstODMsIC00Nn0sCisgICAgey00NSwgLTg0fSwgICB7NDIsIDQ0fSwgICAgIHstODUsIDQzfSwgICAgey00NCwgLTQzfSwgICB7NDUsIDQ2fSwKKyAgICB7LTg4LCAtODd9LCAgIHstODYsIC05MH0sICAgezQ4LCA2Nn0sICAgICB7NDksIDU2fSwgICAgIHs1MCwgNTN9LAorICAgIHs1MSwgNTJ9LCAgICAgey05MiwgLTQyfSwgICB7LTQxLCAtMzl9LCAgIHs1NCwgNTV9LCAgICAgey0xMDUsIC04OX0sCisgICAgey0zOCwgLTM3fSwgICB7NTcsIDYwfSwgICAgIHs1OCwgNTl9LCAgICAgey05NCwgLTkxfSwgICB7LTQwLCAtMzZ9LAorICAgIHs2MSwgNjN9LCAgICAgey0yMCwgNjJ9LCAgICB7LTExNSwgLTExMH0sIHs2NCwgNjV9LCAgICAgey0xMDgsIC0xMDd9LAorICAgIHstMTAxLCAtOTd9LCAgezY3LCA4OX0sICAgICB7NjgsIDc1fSwgICAgIHs2OSwgNzJ9LCAgICAgezcwLCA3MX0sCisgICAgey05NSwgLTkzfSwgICB7LTM0LCAtMjd9LCAgIHs3MywgNzR9LCAgICAgey0yMiwgLTE3fSwgICB7LTE2LCAtMTI0fSwKKyAgICB7NzYsIDgyfSwgICAgIHs3NywgNzl9LCAgICAgey0xMjMsIDc4fSwgICB7LTEyMiwgLTEyMX0sIHs4MCwgODF9LAorICAgIHstMTIwLCAtMTE5fSwgey0xMTgsIC0xMTd9LCB7ODMsIDg2fSwgICAgIHs4NCwgODV9LCAgICAgey0xMTYsIC0xMTR9LAorICAgIHstMTEzLCAtMTEyfSwgezg3LCA4OH0sICAgICB7LTExMSwgLTEwOX0sIHstMTA2LCAtMTA0fSwgezkwLCAxMDV9LAorICAgIHs5MSwgOTh9LCAgICAgezkyLCA5NX0sICAgICB7OTMsIDk0fSwgICAgIHstMTAzLCAtMTAyfSwgey0xMDAsIC05OX0sCisgICAgezk2LCA5N30sICAgICB7LTk4LCAtOTZ9LCAgIHstMzUsIC0zM30sICAgezk5LCAxMDJ9LCAgICB7MTAwLCAxMDF9LAorICAgIHstMzIsIC0zMX0sICAgey0zMCwgLTI5fSwgICB7MTAzLCAxMDR9LCAgIHstMjgsIC0yNn0sICAgey0yNSwgLTI0fSwKKyAgICB7MTA2LCAxMTN9LCAgIHsxMDcsIDExMH0sICAgezEwOCwgMTA5fSwgICB7LTIzLCAtMjF9LCAgIHstMTksIC0xOH0sCisgICAgezExMSwgMTEyfSwgICB7LTE1LCAtMTR9LCAgIHstMTMsIC0xMn0sICAgezExNCwgMTE3fSwgICB7MTE1LCAxMTZ9LAorICAgIHstMTEsIC0xMH0sICAgey05LCAtOH0sICAgICB7MTE4LCAxMTl9LCAgIHstNywgLTZ9LCAgICAgey01LCAtNH19OwogCiBjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52QmFsYW5jZTEwVFs0OF1bMl0gPSB7Ci0gIHsgLTY0LCAgIDEgfSwgICAgeyAtNjMsICAgMiB9LCAgICB7IC02NSwgICAzIH0sICAgIHsgLTYyLCAgIDQgfSwKLSAgeyAtNjYsICAgNSB9LCAgICB7IC02MSwgICA2IH0sICAgIHsgLTY3LCAgIDcgfSwgICAgeyAtNjAsICAgOCB9LAotICB7IC02OCwgICA5IH0sICAgIHsgIDEwLCAgMTEgfSwgICAgeyAtNjksIC01OSB9LCAgICB7ICAxMiwgIDEzIH0sCi0gIHsgLTcwLCAtNTggfSwgICAgeyAgMTQsICAyOCB9LCAgICB7ICAxNSwgIDIxIH0sICAgIHsgIDE2LCAgMTggfSwKLSAgeyAtNTcsICAxNyB9LCAgICB7IC03MSwgLTU2IH0sICAgIHsgIDE5LCAgMjAgfSwgICAgeyAtODgsIC04NyB9LAotICB7IC04NiwgLTg1IH0sICAgIHsgIDIyLCAgMjUgfSwgICAgeyAgMjMsICAyNCB9LCAgICB7IC04NCwgLTgzIH0sCi0gIHsgLTgyLCAtODEgfSwgICAgeyAgMjYsICAyNyB9LCAgICB7IC04MCwgLTc5IH0sICAgIHsgLTc4LCAtNzcgfSwKLSAgeyAgMjksICAzNiB9LCAgICB7ICAzMCwgIDMzIH0sICAgIHsgIDMxLCAgMzIgfSwgICAgeyAtNzYsIC03NSB9LAotICB7IC03NCwgLTczIH0sICAgIHsgIDM0LCAgMzUgfSwgICAgeyAtNzIsIC01NSB9LCAgICB7IC01NCwgLTUzIH0sCi0gIHsgIDM3LCAgNDEgfSwgICAgeyAgMzgsICAzOSB9LCAgICB7IC01MiwgLTUxIH0sICAgIHsgLTUwLCAgNDAgfSwKLSAgeyAtNDksIC00OCB9LCAgICB7ICA0MiwgIDQ1IH0sICAgIHsgIDQzLCAgNDQgfSwgICAgeyAtNDcsIC00NiB9LAotICB7IC00NSwgLTQ0IH0sICAgIHsgIDQ2LCAgNDcgfSwgICAgeyAtNDMsIC00MiB9LCAgICB7IC00MSwgLTQwIH0KLX07CisgICAgey02NCwgMX0sICAgey02MywgMn0sICAgey02NSwgM30sICAgey02MiwgNH0sICAgey02NiwgNX0sICAgey02MSwgNn0sCisgICAgey02NywgN30sICAgey02MCwgOH0sICAgey02OCwgOX0sICAgezEwLCAxMX0sICAgey02OSwgLTU5fSwgezEyLCAxM30sCisgICAgey03MCwgLTU4fSwgezE0LCAyOH0sICAgezE1LCAyMX0sICAgezE2LCAxOH0sICAgey01NywgMTd9LCAgey03MSwgLTU2fSwKKyAgICB7MTksIDIwfSwgICB7LTg4LCAtODd9LCB7LTg2LCAtODV9LCB7MjIsIDI1fSwgICB7MjMsIDI0fSwgICB7LTg0LCAtODN9LAorICAgIHstODIsIC04MX0sIHsyNiwgMjd9LCAgIHstODAsIC03OX0sIHstNzgsIC03N30sIHsyOSwgMzZ9LCAgIHszMCwgMzN9LAorICAgIHszMSwgMzJ9LCAgIHstNzYsIC03NX0sIHstNzQsIC03M30sIHszNCwgMzV9LCAgIHstNzIsIC01NX0sIHstNTQsIC01M30sCisgICAgezM3LCA0MX0sICAgezM4LCAzOX0sICAgey01MiwgLTUxfSwgey01MCwgNDB9LCAgey00OSwgLTQ4fSwgezQyLCA0NX0sCisgICAgezQzLCA0NH0sICAgey00NywgLTQ2fSwgey00NSwgLTQ0fSwgezQ2LCA0N30sICAgey00MywgLTQyfSwgey00MSwgLTQwfX07CiAKIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTBGWzQ4XVsyXSA9IHsKLSAgeyAtNjQsICAgMSB9LCAgICB7IC02NSwgICAyIH0sICAgIHsgLTYzLCAgIDMgfSwgICAgeyAtNjYsICAgNCB9LAotICB7IC02MiwgICA1IH0sICAgIHsgLTYxLCAgIDYgfSwgICAgeyAtNjcsICAgNyB9LCAgICB7IC02OCwgICA4IH0sCi0gIHsgLTYwLCAgIDkgfSwgICAgeyAgMTAsICAxMSB9LCAgICB7IC02OSwgLTU5IH0sICAgIHsgLTcwLCAgMTIgfSwKLSAgeyAtNTgsICAxMyB9LCAgICB7ICAxNCwgIDE3IH0sICAgIHsgLTcxLCAgMTUgfSwgICAgeyAtNTcsICAxNiB9LAotICB7IC01NiwgLTczIH0sICAgIHsgIDE4LCAgMzIgfSwgICAgeyAgMTksICAyNSB9LCAgICB7ICAyMCwgIDIyIH0sCi0gIHsgLTcyLCAgMjEgfSwgICAgeyAtODgsIC04NyB9LCAgICB7ICAyMywgIDI0IH0sICAgIHsgLTg2LCAtODUgfSwKLSAgeyAtODQsIC04MyB9LCAgICB7ICAyNiwgIDI5IH0sICAgIHsgIDI3LCAgMjggfSwgICAgeyAtODIsIC04MSB9LAotICB7IC04MCwgLTc5IH0sICAgIHsgIDMwLCAgMzEgfSwgICAgeyAtNzgsIC03NyB9LCAgICB7IC03NiwgLTc1IH0sCi0gIHsgIDMzLCAgNDAgfSwgICAgeyAgMzQsICAzNyB9LCAgICB7ICAzNSwgIDM2IH0sICAgIHsgLTc0LCAtNTUgfSwKLSAgeyAtNTQsIC01MyB9LCAgICB7ICAzOCwgIDM5IH0sICAgIHsgLTUyLCAtNTEgfSwgICAgeyAtNTAsIC00OSB9LAotICB7ICA0MSwgIDQ0IH0sICAgIHsgIDQyLCAgNDMgfSwgICAgeyAtNDgsIC00NyB9LCAgICB7IC00NiwgLTQ1IH0sCi0gIHsgIDQ1LCAgNDYgfSwgICAgeyAtNDQsIC00MyB9LCAgICB7IC00MiwgIDQ3IH0sICAgIHsgLTQxLCAtNDAgfQotfTsKKyAgICB7LTY0LCAxfSwgICB7LTY1LCAyfSwgICB7LTYzLCAzfSwgICB7LTY2LCA0fSwgICB7LTYyLCA1fSwgICB7LTYxLCA2fSwKKyAgICB7LTY3LCA3fSwgICB7LTY4LCA4fSwgICB7LTYwLCA5fSwgICB7MTAsIDExfSwgICB7LTY5LCAtNTl9LCB7LTcwLCAxMn0sCisgICAgey01OCwgMTN9LCAgezE0LCAxN30sICAgey03MSwgMTV9LCAgey01NywgMTZ9LCAgey01NiwgLTczfSwgezE4LCAzMn0sCisgICAgezE5LCAyNX0sICAgezIwLCAyMn0sICAgey03MiwgMjF9LCAgey04OCwgLTg3fSwgezIzLCAyNH0sICAgey04NiwgLTg1fSwKKyAgICB7LTg0LCAtODN9LCB7MjYsIDI5fSwgICB7MjcsIDI4fSwgICB7LTgyLCAtODF9LCB7LTgwLCAtNzl9LCB7MzAsIDMxfSwKKyAgICB7LTc4LCAtNzd9LCB7LTc2LCAtNzV9LCB7MzMsIDQwfSwgICB7MzQsIDM3fSwgICB7MzUsIDM2fSwgICB7LTc0LCAtNTV9LAorICAgIHstNTQsIC01M30sIHszOCwgMzl9LCAgIHstNTIsIC01MX0sIHstNTAsIC00OX0sIHs0MSwgNDR9LCAgIHs0MiwgNDN9LAorICAgIHstNDgsIC00N30sIHstNDYsIC00NX0sIHs0NSwgNDZ9LCAgIHstNDQsIC00M30sIHstNDIsIDQ3fSwgIHstNDEsIC00MH19OwogCiBjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52TGV2ZWwxMVRbNjJdWzJdID0gewotICB7IC02NCwgICAxIH0sICAgIHsgLTY1LCAgIDIgfSwgICAgeyAtNjMsICAgMyB9LCAgICB7IC02NiwgICA0IH0sCi0gIHsgLTYyLCAgIDUgfSwgICAgeyAtNjcsICAgNiB9LCAgICB7IC02MSwgICA3IH0sICAgIHsgLTY4LCAgIDggfSwKLSAgeyAtNjAsICAgOSB9LCAgICB7ICAxMCwgIDExIH0sICAgIHsgLTY5LCAtNTkgfSwgICAgeyAgMTIsICAxNCB9LAotICB7IC03MCwgIDEzIH0sICAgIHsgLTcxLCAtNTggfSwgICAgeyAgMTUsICAxOCB9LCAgICB7ICAxNiwgIDE3IH0sCi0gIHsgLTcyLCAtNTcgfSwgICAgeyAtNzMsIC03NCB9LCAgICB7ICAxOSwgIDIyIH0sICAgIHsgLTU2LCAgMjAgfSwKLSAgeyAtNTUsICAyMSB9LCAgICB7IC01NCwgLTc3IH0sICAgIHsgIDIzLCAgMzEgfSwgICAgeyAgMjQsICAyNSB9LAotICB7IC03NSwgLTc2IH0sICAgIHsgIDI2LCAgMjcgfSwgICAgeyAtNzgsIC01MyB9LCAgICB7ICAyOCwgIDI5IH0sCi0gIHsgLTUyLCAtOTUgfSwgICAgeyAtOTQsICAzMCB9LCAgICB7IC05MywgLTkyIH0sICAgIHsgIDMyLCAgNDcgfSwKLSAgeyAgMzMsICA0MCB9LCAgICB7ICAzNCwgIDM3IH0sICAgIHsgIDM1LCAgMzYgfSwgICAgeyAtOTEsIC05MCB9LAotICB7IC04OSwgLTg4IH0sICAgIHsgIDM4LCAgMzkgfSwgICAgeyAtODcsIC04NiB9LCAgICB7IC04NSwgLTg0IH0sCi0gIHsgIDQxLCAgNDQgfSwgICAgeyAgNDIsICA0MyB9LCAgICB7IC04MywgLTgyIH0sICAgIHsgLTgxLCAtODAgfSwKLSAgeyAgNDUsICA0NiB9LCAgICB7IC03OSwgLTUxIH0sICAgIHsgLTUwLCAtNDkgfSwgICAgeyAgNDgsICA1NSB9LAotICB7ICA0OSwgIDUyIH0sICAgIHsgIDUwLCAgNTEgfSwgICAgeyAtNDgsIC00NyB9LCAgICB7IC00NiwgLTQ1IH0sCi0gIHsgIDUzLCAgNTQgfSwgICAgeyAtNDQsIC00MyB9LCAgICB7IC00MiwgLTQxIH0sICAgIHsgIDU2LCAgNTkgfSwKLSAgeyAgNTcsICA1OCB9LCAgICB7IC00MCwgLTM5IH0sICAgIHsgLTM4LCAtMzcgfSwgICAgeyAgNjAsICA2MSB9LAotICB7IC0zNiwgLTM1IH0sICAgIHsgLTM0LCAtMzMgfQotfTsKKyAgICB7LTY0LCAxfSwgICB7LTY1LCAyfSwgICB7LTYzLCAzfSwgICB7LTY2LCA0fSwgICB7LTYyLCA1fSwgICB7LTY3LCA2fSwKKyAgICB7LTYxLCA3fSwgICB7LTY4LCA4fSwgICB7LTYwLCA5fSwgICB7MTAsIDExfSwgICB7LTY5LCAtNTl9LCB7MTIsIDE0fSwKKyAgICB7LTcwLCAxM30sICB7LTcxLCAtNTh9LCB7MTUsIDE4fSwgICB7MTYsIDE3fSwgICB7LTcyLCAtNTd9LCB7LTczLCAtNzR9LAorICAgIHsxOSwgMjJ9LCAgIHstNTYsIDIwfSwgIHstNTUsIDIxfSwgIHstNTQsIC03N30sIHsyMywgMzF9LCAgIHsyNCwgMjV9LAorICAgIHstNzUsIC03Nn0sIHsyNiwgMjd9LCAgIHstNzgsIC01M30sIHsyOCwgMjl9LCAgIHstNTIsIC05NX0sIHstOTQsIDMwfSwKKyAgICB7LTkzLCAtOTJ9LCB7MzIsIDQ3fSwgICB7MzMsIDQwfSwgICB7MzQsIDM3fSwgICB7MzUsIDM2fSwgICB7LTkxLCAtOTB9LAorICAgIHstODksIC04OH0sIHszOCwgMzl9LCAgIHstODcsIC04Nn0sIHstODUsIC04NH0sIHs0MSwgNDR9LCAgIHs0MiwgNDN9LAorICAgIHstODMsIC04Mn0sIHstODEsIC04MH0sIHs0NSwgNDZ9LCAgIHstNzksIC01MX0sIHstNTAsIC00OX0sIHs0OCwgNTV9LAorICAgIHs0OSwgNTJ9LCAgIHs1MCwgNTF9LCAgIHstNDgsIC00N30sIHstNDYsIC00NX0sIHs1MywgNTR9LCAgIHstNDQsIC00M30sCisgICAgey00MiwgLTQxfSwgezU2LCA1OX0sICAgezU3LCA1OH0sICAgey00MCwgLTM5fSwgey0zOCwgLTM3fSwgezYwLCA2MX0sCisgICAgey0zNiwgLTM1fSwgey0zNCwgLTMzfX07CiAKIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExRls2Ml1bMl0gPSB7Ci0gIHsgLTY0LCAgIDEgfSwgICAgeyAtNjUsICAgMiB9LCAgICB7IC02MywgICAzIH0sICAgIHsgLTY2LCAgIDQgfSwKLSAgeyAtNjIsICAgNSB9LCAgICB7IC02NywgICA2IH0sICAgIHsgICA3LCAgIDggfSwgICAgeyAtNjEsIC02OCB9LAotICB7ICAgOSwgIDEwIH0sICAgIHsgLTYwLCAtNjkgfSwgICAgeyAgMTEsICAxMiB9LCAgICB7IC01OSwgLTcwIH0sCi0gIHsgIDEzLCAgMTQgfSwgICAgeyAtNTgsIC03MSB9LCAgICB7ICAxNSwgIDE2IH0sICAgIHsgLTU3LCAtNzIgfSwKLSAgeyAgMTcsICAxOSB9LCAgICB7IC01NiwgIDE4IH0sICAgIHsgLTU1LCAtNzMgfSwgICAgeyAgMjAsICAyNCB9LAotICB7ICAyMSwgIDIyIH0sICAgIHsgLTc0LCAtNTQgfSwgICAgeyAtNTMsICAyMyB9LCAgICB7IC03NSwgLTc2IH0sCi0gIHsgIDI1LCAgMzAgfSwgICAgeyAgMjYsICAyNyB9LCAgICB7IC01MiwgLTUxIH0sICAgIHsgIDI4LCAgMjkgfSwKLSAgeyAtNzcsIC03OSB9LCAgICB7IC01MCwgLTQ5IH0sICAgIHsgIDMxLCAgMzkgfSwgICAgeyAgMzIsICAzNSB9LAotICB7ICAzMywgIDM0IH0sICAgIHsgLTc4LCAtNDYgfSwgICAgeyAtODIsIC04OCB9LCAgICB7ICAzNiwgIDM3IH0sCi0gIHsgLTgzLCAtNDggfSwgICAgeyAtNDcsICAzOCB9LCAgICB7IC04NiwgLTg1IH0sICAgIHsgIDQwLCAgNDcgfSwKLSAgeyAgNDEsICA0NCB9LCAgICB7ICA0MiwgIDQzIH0sICAgIHsgLTgwLCAtNDQgfSwgICAgeyAtNDMsIC00MiB9LAotICB7ICA0NSwgIDQ2IH0sICAgIHsgLTM5LCAtODcgfSwgICAgeyAtODQsIC00MCB9LCAgICB7ICA0OCwgIDU1IH0sCi0gIHsgIDQ5LCAgNTIgfSwgICAgeyAgNTAsICA1MSB9LCAgICB7IC05NSwgLTk0IH0sICAgIHsgLTkzLCAtOTIgfSwKLSAgeyAgNTMsICA1NCB9LCAgICB7IC05MSwgLTkwIH0sICAgIHsgLTg5LCAtODEgfSwgICAgeyAgNTYsICA1OSB9LAotICB7ICA1NywgIDU4IH0sICAgIHsgLTQ1LCAtNDEgfSwgICAgeyAtMzgsIC0zNyB9LCAgICB7ICA2MCwgIDYxIH0sCi0gIHsgLTM2LCAtMzUgfSwgICAgeyAtMzQsIC0zMyB9Ci19OworICAgIHstNjQsIDF9LCAgIHstNjUsIDJ9LCAgIHstNjMsIDN9LCAgIHstNjYsIDR9LCAgIHstNjIsIDV9LCAgIHstNjcsIDZ9LAorICAgIHs3LCA4fSwgICAgIHstNjEsIC02OH0sIHs5LCAxMH0sICAgIHstNjAsIC02OX0sIHsxMSwgMTJ9LCAgIHstNTksIC03MH0sCisgICAgezEzLCAxNH0sICAgey01OCwgLTcxfSwgezE1LCAxNn0sICAgey01NywgLTcyfSwgezE3LCAxOX0sICAgey01NiwgMTh9LAorICAgIHstNTUsIC03M30sIHsyMCwgMjR9LCAgIHsyMSwgMjJ9LCAgIHstNzQsIC01NH0sIHstNTMsIDIzfSwgIHstNzUsIC03Nn0sCisgICAgezI1LCAzMH0sICAgezI2LCAyN30sICAgey01MiwgLTUxfSwgezI4LCAyOX0sICAgey03NywgLTc5fSwgey01MCwgLTQ5fSwKKyAgICB7MzEsIDM5fSwgICB7MzIsIDM1fSwgICB7MzMsIDM0fSwgICB7LTc4LCAtNDZ9LCB7LTgyLCAtODh9LCB7MzYsIDM3fSwKKyAgICB7LTgzLCAtNDh9LCB7LTQ3LCAzOH0sICB7LTg2LCAtODV9LCB7NDAsIDQ3fSwgICB7NDEsIDQ0fSwgICB7NDIsIDQzfSwKKyAgICB7LTgwLCAtNDR9LCB7LTQzLCAtNDJ9LCB7NDUsIDQ2fSwgICB7LTM5LCAtODd9LCB7LTg0LCAtNDB9LCB7NDgsIDU1fSwKKyAgICB7NDksIDUyfSwgICB7NTAsIDUxfSwgICB7LTk1LCAtOTR9LCB7LTkzLCAtOTJ9LCB7NTMsIDU0fSwgICB7LTkxLCAtOTB9LAorICAgIHstODksIC04MX0sIHs1NiwgNTl9LCAgIHs1NywgNTh9LCAgIHstNDUsIC00MX0sIHstMzgsIC0zN30sIHs2MCwgNjF9LAorICAgIHstMzYsIC0zNX0sIHstMzQsIC0zM319OwogCiBjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52QmFsYW5jZTExVFsyNF1bMl0gPSB7Ci0gIHsgLTY0LCAgIDEgfSwgICAgeyAtNjMsICAgMiB9LCAgICB7IC02NSwgICAzIH0sICAgIHsgLTY2LCAgIDQgfSwKLSAgeyAtNjIsICAgNSB9LCAgICB7IC02MSwgICA2IH0sICAgIHsgLTY3LCAgIDcgfSwgICAgeyAtNjgsICAgOCB9LAotICB7IC02MCwgICA5IH0sICAgIHsgIDEwLCAgMTYgfSwgICAgeyAgMTEsICAxMyB9LCAgICB7IC02OSwgIDEyIH0sCi0gIHsgLTc2LCAtNzUgfSwgICAgeyAgMTQsICAxNSB9LCAgICB7IC03NCwgLTczIH0sICAgIHsgLTcyLCAtNzEgfSwKLSAgeyAgMTcsICAyMCB9LCAgICB7ICAxOCwgIDE5IH0sICAgIHsgLTcwLCAtNTkgfSwgICAgeyAtNTgsIC01NyB9LAotICB7ICAyMSwgIDIyIH0sICAgIHsgLTU2LCAtNTUgfSwgICAgeyAtNTQsICAyMyB9LCAgICB7IC01MywgLTUyIH0KLX07CisgICAgey02NCwgMX0sICAgey02MywgMn0sICAgey02NSwgM30sICAgey02NiwgNH0sICAgey02MiwgNX0sICB7LTYxLCA2fSwKKyAgICB7LTY3LCA3fSwgICB7LTY4LCA4fSwgICB7LTYwLCA5fSwgICB7MTAsIDE2fSwgICB7MTEsIDEzfSwgIHstNjksIDEyfSwKKyAgICB7LTc2LCAtNzV9LCB7MTQsIDE1fSwgICB7LTc0LCAtNzN9LCB7LTcyLCAtNzF9LCB7MTcsIDIwfSwgIHsxOCwgMTl9LAorICAgIHstNzAsIC01OX0sIHstNTgsIC01N30sIHsyMSwgMjJ9LCAgIHstNTYsIC01NX0sIHstNTQsIDIzfSwgey01MywgLTUyfX07CiAKIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTFGWzI0XVsyXSA9IHsKLSAgeyAtNjQsICAgMSB9LCAgICB7IC02NSwgICAyIH0sICAgIHsgLTYzLCAgIDMgfSwgICAgeyAtNjYsICAgNCB9LAotICB7IC02MiwgICA1IH0sICAgIHsgLTYxLCAgIDYgfSwgICAgeyAtNjcsICAgNyB9LCAgICB7IC02OCwgICA4IH0sCi0gIHsgLTYwLCAgIDkgfSwgICAgeyAgMTAsICAxMyB9LCAgICB7IC02OSwgIDExIH0sICAgIHsgLTU5LCAgMTIgfSwKLSAgeyAtNTgsIC03NiB9LCAgICB7ICAxNCwgIDE3IH0sICAgIHsgIDE1LCAgMTYgfSwgICAgeyAtNzUsIC03NCB9LAotICB7IC03MywgLTcyIH0sICAgIHsgIDE4LCAgMjEgfSwgICAgeyAgMTksICAyMCB9LCAgICB7IC03MSwgLTcwIH0sCi0gIHsgLTU3LCAtNTYgfSwgICAgeyAgMjIsICAyMyB9LCAgICB7IC01NSwgLTU0IH0sICAgIHsgLTUzLCAtNTIgfQotfTsKKyAgICB7LTY0LCAxfSwgICB7LTY1LCAyfSwgICB7LTYzLCAzfSwgICB7LTY2LCA0fSwgICB7LTYyLCA1fSwgICB7LTYxLCA2fSwKKyAgICB7LTY3LCA3fSwgICB7LTY4LCA4fSwgICB7LTYwLCA5fSwgICB7MTAsIDEzfSwgICB7LTY5LCAxMX0sICB7LTU5LCAxMn0sCisgICAgey01OCwgLTc2fSwgezE0LCAxN30sICAgezE1LCAxNn0sICAgey03NSwgLTc0fSwgey03MywgLTcyfSwgezE4LCAyMX0sCisgICAgezE5LCAyMH0sICAgey03MSwgLTcwfSwgey01NywgLTU2fSwgezIyLCAyM30sICAgey01NSwgLTU0fSwgey01MywgLTUyfX07CiAKIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19Ob2lzZUxldmVsMTFUWzYyXVsyXSA9IHsKLSAgeyAtNjQsICAgMSB9LCAgICB7IC02MywgICAyIH0sICAgIHsgLTY1LCAgIDMgfSwgICAgeyAtNjYsICAgNCB9LAotICB7IC02MiwgICA1IH0sICAgIHsgLTY3LCAgIDYgfSwgICAgeyAgIDcsICAgOCB9LCAgICB7IC02MSwgLTY4IH0sCi0gIHsgICA5LCAgMzAgfSwgICAgeyAgMTAsICAxNSB9LCAgICB7IC02MCwgIDExIH0sICAgIHsgLTY5LCAgMTIgfSwKLSAgeyAgMTMsICAxNCB9LCAgICB7IC01OSwgLTUzIH0sICAgIHsgLTk1LCAtOTQgfSwgICAgeyAgMTYsICAyMyB9LAotICB7ICAxNywgIDIwIH0sICAgIHsgIDE4LCAgMTkgfSwgICAgeyAtOTMsIC05MiB9LCAgICB7IC05MSwgLTkwIH0sCi0gIHsgIDIxLCAgMjIgfSwgICAgeyAtODksIC04OCB9LCAgICB7IC04NywgLTg2IH0sICAgIHsgIDI0LCAgMjcgfSwKLSAgeyAgMjUsICAyNiB9LCAgICB7IC04NSwgLTg0IH0sICAgIHsgLTgzLCAtODIgfSwgICAgeyAgMjgsICAyOSB9LAotICB7IC04MSwgLTgwIH0sICAgIHsgLTc5LCAtNzggfSwgICAgeyAgMzEsICA0NiB9LCAgICB7ICAzMiwgIDM5IH0sCi0gIHsgIDMzLCAgMzYgfSwgICAgeyAgMzQsICAzNSB9LCAgICB7IC03NywgLTc2IH0sICAgIHsgLTc1LCAtNzQgfSwKLSAgeyAgMzcsICAzOCB9LCAgICB7IC03MywgLTcyIH0sICAgIHsgLTcxLCAtNzAgfSwgICAgeyAgNDAsICA0MyB9LAotICB7ICA0MSwgIDQyIH0sICAgIHsgLTU4LCAtNTcgfSwgICAgeyAtNTYsIC01NSB9LCAgICB7ICA0NCwgIDQ1IH0sCi0gIHsgLTU0LCAtNTIgfSwgICAgeyAtNTEsIC01MCB9LCAgICB7ICA0NywgIDU0IH0sICAgIHsgIDQ4LCAgNTEgfSwKLSAgeyAgNDksICA1MCB9LCAgICB7IC00OSwgLTQ4IH0sICAgIHsgLTQ3LCAtNDYgfSwgICAgeyAgNTIsICA1MyB9LAotICB7IC00NSwgLTQ0IH0sICAgIHsgLTQzLCAtNDIgfSwgICAgeyAgNTUsICA1OCB9LCAgICB7ICA1NiwgIDU3IH0sCi0gIHsgLTQxLCAtNDAgfSwgICAgeyAtMzksIC0zOCB9LCAgICB7ICA1OSwgIDYwIH0sICAgIHsgLTM3LCAtMzYgfSwKLSAgeyAtMzUsICA2MSB9LCAgICB7IC0zNCwgLTMzIH0KLX07CisgICAgey02NCwgMX0sICAgey02MywgMn0sICAgey02NSwgM30sICAgey02NiwgNH0sICAgey02MiwgNX0sICAgey02NywgNn0sCisgICAgezcsIDh9LCAgICAgey02MSwgLTY4fSwgezksIDMwfSwgICAgezEwLCAxNX0sICAgey02MCwgMTF9LCAgey02OSwgMTJ9LAorICAgIHsxMywgMTR9LCAgIHstNTksIC01M30sIHstOTUsIC05NH0sIHsxNiwgMjN9LCAgIHsxNywgMjB9LCAgIHsxOCwgMTl9LAorICAgIHstOTMsIC05Mn0sIHstOTEsIC05MH0sIHsyMSwgMjJ9LCAgIHstODksIC04OH0sIHstODcsIC04Nn0sIHsyNCwgMjd9LAorICAgIHsyNSwgMjZ9LCAgIHstODUsIC04NH0sIHstODMsIC04Mn0sIHsyOCwgMjl9LCAgIHstODEsIC04MH0sIHstNzksIC03OH0sCisgICAgezMxLCA0Nn0sICAgezMyLCAzOX0sICAgezMzLCAzNn0sICAgezM0LCAzNX0sICAgey03NywgLTc2fSwgey03NSwgLTc0fSwKKyAgICB7MzcsIDM4fSwgICB7LTczLCAtNzJ9LCB7LTcxLCAtNzB9LCB7NDAsIDQzfSwgICB7NDEsIDQyfSwgICB7LTU4LCAtNTd9LAorICAgIHstNTYsIC01NX0sIHs0NCwgNDV9LCAgIHstNTQsIC01Mn0sIHstNTEsIC01MH0sIHs0NywgNTR9LCAgIHs0OCwgNTF9LAorICAgIHs0OSwgNTB9LCAgIHstNDksIC00OH0sIHstNDcsIC00Nn0sIHs1MiwgNTN9LCAgIHstNDUsIC00NH0sIHstNDMsIC00Mn0sCisgICAgezU1LCA1OH0sICAgezU2LCA1N30sICAgey00MSwgLTQwfSwgey0zOSwgLTM4fSwgezU5LCA2MH0sICAgey0zNywgLTM2fSwKKyAgICB7LTM1LCA2MX0sICB7LTM0LCAtMzN9fTsKIAogY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX05vaXNlQmFsYW5jZTExVFsyNF1bMl0gPSB7Ci0gIHsgLTY0LCAgIDEgfSwgICAgeyAtNjUsICAgMiB9LCAgICB7IC02MywgICAzIH0sICAgIHsgICA0LCAgIDkgfSwKLSAgeyAtNjYsICAgNSB9LCAgICB7IC02MiwgICA2IH0sICAgIHsgICA3LCAgIDggfSwgICAgeyAtNzYsIC03NSB9LAotICB7IC03NCwgLTczIH0sICAgIHsgIDEwLCAgMTcgfSwgICAgeyAgMTEsICAxNCB9LCAgICB7ICAxMiwgIDEzIH0sCi0gIHsgLTcyLCAtNzEgfSwgICAgeyAtNzAsIC02OSB9LCAgICB7ICAxNSwgIDE2IH0sICAgIHsgLTY4LCAtNjcgfSwKLSAgeyAtNjEsIC02MCB9LCAgICB7ICAxOCwgIDIxIH0sICAgIHsgIDE5LCAgMjAgfSwgICAgeyAtNTksIC01OCB9LAotICB7IC01NywgLTU2IH0sICAgIHsgIDIyLCAgMjMgfSwgICAgeyAtNTUsIC01NCB9LCAgICB7IC01MywgLTUyIH0KLX07CisgICAgey02NCwgMX0sICAgey02NSwgMn0sICAgey02MywgM30sICAgezQsIDl9LCAgICAgey02NiwgNX0sICAgey02MiwgNn0sCisgICAgezcsIDh9LCAgICAgey03NiwgLTc1fSwgey03NCwgLTczfSwgezEwLCAxN30sICAgezExLCAxNH0sICAgezEyLCAxM30sCisgICAgey03MiwgLTcxfSwgey03MCwgLTY5fSwgezE1LCAxNn0sICAgey02OCwgLTY3fSwgey02MSwgLTYwfSwgezE4LCAyMX0sCisgICAgezE5LCAyMH0sICAgey01OSwgLTU4fSwgey01NywgLTU2fSwgezIyLCAyM30sICAgey01NSwgLTU0fSwgey01MywgLTUyfX07CiAvL0B9CiAKLQotCi0KIC8qIQogICBcbmFtZSAgcGFyYW1ldHJpYyBzdGVyZW8KICAgXGJyaWVmIGNvbnN0YW50cyB1c2VkIGJ5IHRoZSBwYXJhbWV0cmljIHN0ZXJlbyBwYXJ0IG9mIHRoZSBkZWNvZGVyCiAKICovCiAKLQogLyogY29uc3RhbnRzIHVzZWQgaW4gcHNiaXRkZWMuY3BwICovCiAKIC8qIEZJWF9CT1JERVIgY2FuIGhhdmUgMCwgMSwgMiwgNCBlbnZlbG9wZXMgKi8KIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX2FGaXhOb0VudkRlY29kZVs0XSA9IHswLCAxLCAyLCA0fTsKIAotCiAvKiBJSUQgJiBJQ0MgSHVmZm1hbiBjb2RlYm9va3MgKi8KIGNvbnN0IFNDSEFSIGFCb29rUHNJaWRUaW1lRGVjb2RlWzI4XVsyXSA9IHsKLSAgeyAtNjQsICAgMSB9LCAgICB7IC02NSwgICAyIH0sICAgIHsgLTYzLCAgIDMgfSwgICAgeyAtNjYsICAgNCB9LAotICB7IC02MiwgICA1IH0sICAgIHsgLTY3LCAgIDYgfSwgICAgeyAtNjEsICAgNyB9LCAgICB7IC02OCwgICA4IH0sCi0gIHsgLTYwLCAgIDkgfSwgICAgeyAtNjksICAxMCB9LCAgICB7IC01OSwgIDExIH0sICAgIHsgLTcwLCAgMTIgfSwKLSAgeyAtNTgsICAxMyB9LCAgICB7IC01NywgIDE0IH0sICAgIHsgLTcxLCAgMTUgfSwgICAgeyAgMTYsICAxNyB9LAotICB7IC01NiwgLTcyIH0sICAgIHsgIDE4LCAgMjEgfSwgICAgeyAgMTksICAyMCB9LCAgICB7IC01NSwgLTc4IH0sCi0gIHsgLTc3LCAtNzYgfSwgICAgeyAgMjIsICAyNSB9LCAgICB7ICAyMywgIDI0IH0sICAgIHsgLTc1LCAtNzQgfSwKLSAgeyAtNzMsIC01NCB9LCAgICB7ICAyNiwgIDI3IH0sICAgIHsgLTUzLCAtNTIgfSwgICAgeyAtNTEsIC01MCB9Ci19OworICAgIHstNjQsIDF9LCAgIHstNjUsIDJ9LCAgIHstNjMsIDN9LCAgIHstNjYsIDR9LCAgey02MiwgNX0sICAgey02NywgNn0sCisgICAgey02MSwgN30sICAgey02OCwgOH0sICAgey02MCwgOX0sICAgey02OSwgMTB9LCB7LTU5LCAxMX0sICB7LTcwLCAxMn0sCisgICAgey01OCwgMTN9LCAgey01NywgMTR9LCAgey03MSwgMTV9LCAgezE2LCAxN30sICB7LTU2LCAtNzJ9LCB7MTgsIDIxfSwKKyAgICB7MTksIDIwfSwgICB7LTU1LCAtNzh9LCB7LTc3LCAtNzZ9LCB7MjIsIDI1fSwgIHsyMywgMjR9LCAgIHstNzUsIC03NH0sCisgICAgey03MywgLTU0fSwgezI2LCAyN30sICAgey01MywgLTUyfSwgey01MSwgLTUwfX07CiAKIGNvbnN0IFNDSEFSIGFCb29rUHNJaWRGcmVxRGVjb2RlWzI4XVsyXSA9IHsKLSAgeyAtNjQsICAgMSB9LCAgICB7ICAgMiwgICAzIH0sICAgIHsgLTYzLCAtNjUgfSwgICAgeyAgIDQsICAgNSB9LAotICB7IC02MiwgLTY2IH0sICAgIHsgICA2LCAgIDcgfSwgICAgeyAtNjEsIC02NyB9LCAgICB7ICAgOCwgICA5IH0sCi0gIHsgLTY4LCAtNjAgfSwgICAgeyAtNTksICAxMCB9LCAgICB7IC02OSwgIDExIH0sICAgIHsgLTU4LCAgMTIgfSwKLSAgeyAtNzAsICAxMyB9LCAgICB7IC03MSwgIDE0IH0sICAgIHsgLTU3LCAgMTUgfSwgICAgeyAgMTYsICAxNyB9LAotICB7IC01NiwgLTcyIH0sICAgIHsgIDE4LCAgMTkgfSwgICAgeyAtNTUsIC01NCB9LCAgICB7ICAyMCwgIDIxIH0sCi0gIHsgLTczLCAtNTMgfSwgICAgeyAgMjIsICAyNCB9LCAgICB7IC03NCwgIDIzIH0sICAgIHsgLTc1LCAtNzggfSwKLSAgeyAgMjUsICAyNiB9LCAgICB7IC03NywgLTc2IH0sICAgIHsgLTUyLCAgMjcgfSwgICAgeyAtNTEsIC01MCB9Ci19OworICAgIHstNjQsIDF9LCAgIHsyLCAzfSwgICAgIHstNjMsIC02NX0sIHs0LCA1fSwgICAgey02MiwgLTY2fSwgezYsIDd9LAorICAgIHstNjEsIC02N30sIHs4LCA5fSwgICAgIHstNjgsIC02MH0sIHstNTksIDEwfSwgey02OSwgMTF9LCAgey01OCwgMTJ9LAorICAgIHstNzAsIDEzfSwgIHstNzEsIDE0fSwgIHstNTcsIDE1fSwgIHsxNiwgMTd9LCAgey01NiwgLTcyfSwgezE4LCAxOX0sCisgICAgey01NSwgLTU0fSwgezIwLCAyMX0sICAgey03MywgLTUzfSwgezIyLCAyNH0sICB7LTc0LCAyM30sICB7LTc1LCAtNzh9LAorICAgIHsyNSwgMjZ9LCAgIHstNzcsIC03Nn0sIHstNTIsIDI3fSwgIHstNTEsIC01MH19OwogCiBjb25zdCBTQ0hBUiBhQm9va1BzSWNjVGltZURlY29kZVsxNF1bMl0gPSB7Ci0gIHsgLTY0LCAgIDEgfSwgICAgeyAtNjMsICAgMiB9LCAgICB7IC02NSwgICAzIH0sICAgIHsgLTYyLCAgIDQgfSwKLSAgeyAtNjYsICAgNSB9LCAgICB7IC02MSwgICA2IH0sICAgIHsgLTY3LCAgIDcgfSwgICAgeyAtNjAsICAgOCB9LAotICB7IC02OCwgICA5IH0sICAgIHsgLTU5LCAgMTAgfSwgICAgeyAtNjksICAxMSB9LCAgICB7IC01OCwgIDEyIH0sCi0gIHsgLTcwLCAgMTMgfSwgICAgeyAtNzEsIC01NyB9Ci19OworICAgIHstNjQsIDF9LCB7LTYzLCAyfSwgey02NSwgM30sICB7LTYyLCA0fSwgIHstNjYsIDV9LCAgey02MSwgNn0sICB7LTY3LCA3fSwKKyAgICB7LTYwLCA4fSwgey02OCwgOX0sIHstNTksIDEwfSwgey02OSwgMTF9LCB7LTU4LCAxMn0sIHstNzAsIDEzfSwgey03MSwgLTU3fX07CiAKIGNvbnN0IFNDSEFSIGFCb29rUHNJY2NGcmVxRGVjb2RlWzE0XVsyXSA9IHsKLSAgeyAtNjQsICAgMSB9LCAgICB7IC02MywgICAyIH0sICAgIHsgLTY1LCAgIDMgfSwgICAgeyAtNjIsICAgNCB9LAotICB7IC02NiwgICA1IH0sICAgIHsgLTYxLCAgIDYgfSwgICAgeyAtNjcsICAgNyB9LCAgICB7IC02MCwgICA4IH0sCi0gIHsgLTU5LCAgIDkgfSwgICAgeyAtNjgsICAxMCB9LCAgICB7IC01OCwgIDExIH0sICAgIHsgLTY5LCAgMTIgfSwKLSAgeyAtNTcsICAxMyB9LCAgICB7IC03MCwgLTcxIH0KLX07CisgICAgey02NCwgMX0sIHstNjMsIDJ9LCB7LTY1LCAzfSwgIHstNjIsIDR9LCAgey02NiwgNX0sICB7LTYxLCA2fSwgIHstNjcsIDd9LAorICAgIHstNjAsIDh9LCB7LTU5LCA5fSwgey02OCwgMTB9LCB7LTU4LCAxMX0sIHstNjksIDEyfSwgey01NywgMTN9LCB7LTcwLCAtNzF9fTsKIAogLyogSUlELWZpbmUgSHVmZm1hbiBjb2RlYm9va3MgKi8KIAogY29uc3QgU0NIQVIgYUJvb2tQc0lpZEZpbmVUaW1lRGVjb2RlWzYwXVsyXSA9IHsKLSAgeyAgIDEsIC02NCB9LCAgICB7IC02MywgICAyIH0sICAgIHsgICAzLCAtNjUgfSwgICAgeyAgIDQsICA1OSB9LAotICB7ICAgNSwgICA3IH0sICAgIHsgICA2LCAtNjcgfSwgICAgeyAtNjgsIC02MCB9LCAgICB7IC02MSwgICA4IH0sCi0gIHsgICA5LCAgMTEgfSwgICAgeyAtNTksICAxMCB9LCAgICB7IC03MCwgLTU4IH0sICAgIHsgIDEyLCAgNDEgfSwKLSAgeyAgMTMsICAyMCB9LCAgICB7ICAxNCwgLTcxIH0sICAgIHsgLTU1LCAgMTUgfSwgICAgeyAtNTMsICAxNiB9LAotICB7ICAxNywgLTc3IH0sICAgIHsgIDE4LCAgMTkgfSwgICAgeyAtODUsIC04NCB9LCAgICB7IC00NiwgLTQ1IH0sCi0gIHsgLTU3LCAgMjEgfSwgICAgeyAgMjIsICA0MCB9LCAgICB7ICAyMywgIDI5IH0sICAgIHsgLTUxLCAgMjQgfSwKLSAgeyAgMjUsICAyNiB9LCAgICB7IC04MywgLTgyIH0sICAgIHsgIDI3LCAgMjggfSwgICAgeyAtOTAsIC0zOCB9LAotICB7IC05MiwgLTkxIH0sICAgIHsgIDMwLCAgMzcgfSwgICAgeyAgMzEsICAzNCB9LCAgICB7ICAzMiwgIDMzIH0sCi0gIHsgLTM1LCAtMzQgfSwgICAgeyAtMzcsIC0zNiB9LCAgICB7ICAzNSwgIDM2IH0sICAgIHsgLTk0LCAtOTMgfSwKLSAgeyAtODksIC0zOSB9LCAgICB7ICAzOCwgLTc5IH0sICAgIHsgIDM5LCAtODEgfSwgICAgeyAtODgsIC00MCB9LAotICB7IC03NCwgLTU0IH0sICAgIHsgIDQyLCAtNjkgfSwgICAgeyAgNDMsICA0NCB9LCAgICB7IC03MiwgLTU2IH0sCi0gIHsgIDQ1LCAgNTIgfSwgICAgeyAgNDYsICA1MCB9LCAgICB7ICA0NywgLTc2IH0sICAgIHsgLTQ5LCAgNDggfSwKLSAgeyAtNDcsICA0OSB9LCAgICB7IC04NywgLTQxIH0sICAgIHsgLTUyLCAgNTEgfSwgICAgeyAtNzgsIC01MCB9LAotICB7ICA1MywgLTczIH0sICAgIHsgIDU0LCAtNzUgfSwgICAgeyAgNTUsICA1NyB9LCAgICB7ICA1NiwgLTgwIH0sCi0gIHsgLTg2LCAtNDIgfSwgICAgeyAtNDgsICA1OCB9LCAgICB7IC00NCwgLTQzIH0sICAgIHsgLTY2LCAtNjIgfQotfTsKLQorICAgIHsxLCAtNjR9LCAgIHstNjMsIDJ9LCAgIHszLCAtNjV9LCAgIHs0LCA1OX0sICAgIHs1LCA3fSwgICAgIHs2LCAtNjd9LAorICAgIHstNjgsIC02MH0sIHstNjEsIDh9LCAgIHs5LCAxMX0sICAgIHstNTksIDEwfSwgIHstNzAsIC01OH0sIHsxMiwgNDF9LAorICAgIHsxMywgMjB9LCAgIHsxNCwgLTcxfSwgIHstNTUsIDE1fSwgIHstNTMsIDE2fSwgIHsxNywgLTc3fSwgIHsxOCwgMTl9LAorICAgIHstODUsIC04NH0sIHstNDYsIC00NX0sIHstNTcsIDIxfSwgIHsyMiwgNDB9LCAgIHsyMywgMjl9LCAgIHstNTEsIDI0fSwKKyAgICB7MjUsIDI2fSwgICB7LTgzLCAtODJ9LCB7MjcsIDI4fSwgICB7LTkwLCAtMzh9LCB7LTkyLCAtOTF9LCB7MzAsIDM3fSwKKyAgICB7MzEsIDM0fSwgICB7MzIsIDMzfSwgICB7LTM1LCAtMzR9LCB7LTM3LCAtMzZ9LCB7MzUsIDM2fSwgICB7LTk0LCAtOTN9LAorICAgIHstODksIC0zOX0sIHszOCwgLTc5fSwgIHszOSwgLTgxfSwgIHstODgsIC00MH0sIHstNzQsIC01NH0sIHs0MiwgLTY5fSwKKyAgICB7NDMsIDQ0fSwgICB7LTcyLCAtNTZ9LCB7NDUsIDUyfSwgICB7NDYsIDUwfSwgICB7NDcsIC03Nn0sICB7LTQ5LCA0OH0sCisgICAgey00NywgNDl9LCAgey04NywgLTQxfSwgey01MiwgNTF9LCAgey03OCwgLTUwfSwgezUzLCAtNzN9LCAgezU0LCAtNzV9LAorICAgIHs1NSwgNTd9LCAgIHs1NiwgLTgwfSwgIHstODYsIC00Mn0sIHstNDgsIDU4fSwgIHstNDQsIC00M30sIHstNjYsIC02Mn19OwogCiBjb25zdCBTQ0hBUiBhQm9va1BzSWlkRmluZUZyZXFEZWNvZGVbNjBdWzJdID0gewotICB7ICAgMSwgLTY0IH0sICAgIHsgICAyLCAgIDQgfSwgICAgeyAgIDMsIC02NSB9LCAgICB7IC02NiwgLTYyIH0sCi0gIHsgLTYzLCAgIDUgfSwgICAgeyAgIDYsICAgNyB9LCAgICB7IC02NywgLTYxIH0sICAgIHsgICA4LCAgIDkgfSwKLSAgeyAtNjgsIC02MCB9LCAgICB7ICAxMCwgIDExIH0sICAgIHsgLTY5LCAtNTkgfSwgICAgeyAgMTIsICAxMyB9LAotICB7IC03MCwgLTU4IH0sICAgIHsgIDE0LCAgMTggfSwgICAgeyAtNTcsICAxNSB9LCAgICB7ICAxNiwgLTcyIH0sCi0gIHsgLTU0LCAgMTcgfSwgICAgeyAtNzUsIC01MyB9LCAgICB7ICAxOSwgIDM3IH0sICAgIHsgLTU2LCAgMjAgfSwKLSAgeyAgMjEsIC03MyB9LCAgICB7ICAyMiwgIDI5IH0sICAgIHsgIDIzLCAtNzYgfSwgICAgeyAgMjQsIC03OCB9LAotICB7ICAyNSwgIDI4IH0sICAgIHsgIDI2LCAgMjcgfSwgICAgeyAtODUsIC00MyB9LCAgICB7IC04MywgLTQ1IH0sCi0gIHsgLTgxLCAtNDcgfSwgICAgeyAtNTIsICAzMCB9LCAgICB7IC01MCwgIDMxIH0sICAgIHsgIDMyLCAtNzkgfSwKLSAgeyAgMzMsICAzNCB9LCAgICB7IC04MiwgLTQ2IH0sICAgIHsgIDM1LCAgMzYgfSwgICAgeyAtOTAsIC04OSB9LAotICB7IC05MiwgLTkxIH0sICAgIHsgIDM4LCAtNzEgfSwgICAgeyAtNTUsICAzOSB9LCAgICB7ICA0MCwgLTc0IH0sCi0gIHsgIDQxLCAgNTAgfSwgICAgeyAgNDIsIC03NyB9LCAgICB7IC00OSwgIDQzIH0sICAgIHsgIDQ0LCAgNDcgfSwKLSAgeyAgNDUsICA0NiB9LCAgICB7IC04NiwgLTQyIH0sICAgIHsgLTg4LCAtODcgfSwgICAgeyAgNDgsICA0OSB9LAotICB7IC0zOSwgLTM4IH0sICAgIHsgLTQxLCAtNDAgfSwgICAgeyAtNTEsICA1MSB9LCAgICB7ICA1MiwgIDU5IH0sCi0gIHsgIDUzLCAgNTYgfSwgICAgeyAgNTQsICA1NSB9LCAgICB7IC0zNSwgLTM0IH0sICAgIHsgLTM3LCAtMzYgfSwKLSAgeyAgNTcsICA1OCB9LCAgICB7IC05NCwgLTkzIH0sICAgIHsgLTg0LCAtNDQgfSwgICAgeyAtODAsIC00OCB9Ci19OworICAgIHsxLCAtNjR9LCAgIHsyLCA0fSwgICAgIHszLCAtNjV9LCAgIHstNjYsIC02Mn0sIHstNjMsIDV9LCAgIHs2LCA3fSwKKyAgICB7LTY3LCAtNjF9LCB7OCwgOX0sICAgICB7LTY4LCAtNjB9LCB7MTAsIDExfSwgICB7LTY5LCAtNTl9LCB7MTIsIDEzfSwKKyAgICB7LTcwLCAtNTh9LCB7MTQsIDE4fSwgICB7LTU3LCAxNX0sICB7MTYsIC03Mn0sICB7LTU0LCAxN30sICB7LTc1LCAtNTN9LAorICAgIHsxOSwgMzd9LCAgIHstNTYsIDIwfSwgIHsyMSwgLTczfSwgIHsyMiwgMjl9LCAgIHsyMywgLTc2fSwgIHsyNCwgLTc4fSwKKyAgICB7MjUsIDI4fSwgICB7MjYsIDI3fSwgICB7LTg1LCAtNDN9LCB7LTgzLCAtNDV9LCB7LTgxLCAtNDd9LCB7LTUyLCAzMH0sCisgICAgey01MCwgMzF9LCAgezMyLCAtNzl9LCAgezMzLCAzNH0sICAgey04MiwgLTQ2fSwgezM1LCAzNn0sICAgey05MCwgLTg5fSwKKyAgICB7LTkyLCAtOTF9LCB7MzgsIC03MX0sICB7LTU1LCAzOX0sICB7NDAsIC03NH0sICB7NDEsIDUwfSwgICB7NDIsIC03N30sCisgICAgey00OSwgNDN9LCAgezQ0LCA0N30sICAgezQ1LCA0Nn0sICAgey04NiwgLTQyfSwgey04OCwgLTg3fSwgezQ4LCA0OX0sCisgICAgey0zOSwgLTM4fSwgey00MSwgLTQwfSwgey01MSwgNTF9LCAgezUyLCA1OX0sICAgezUzLCA1Nn0sICAgezU0LCA1NX0sCisgICAgey0zNSwgLTM0fSwgey0zNywgLTM2fSwgezU3LCA1OH0sICAgey05NCwgLTkzfSwgey04NCwgLTQ0fSwgey04MCwgLTQ4fX07CiAKIC8qIGNvbnN0YW50cyB1c2VkIGluIHBzZGVjLmNwcCAqLwogCi1jb25zdCBGSVhQX0RCTCBkZWNheVNjYWxlRmFjdFRhYmxlWzY0XSA9IHsKLQotIEZMMkZYQ09OU1RfREJMKDEuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMS4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgxLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDEuMDAwMDAwKSwKLSBGTDJGWENPTlNUX0RCTCgwLjk1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuOTAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC44NTAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjgwMDAwMCksCi0gRkwyRlhDT05TVF9EQkwoMC43NTAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjcwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNjUwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC42MDAwMDApLAotIEZMMkZYQ09OU1RfREJMKDAuNTUwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC41MDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjQ1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNDAwMDAwKSwKLSBGTDJGWENPTlNUX0RCTCgwLjM1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMzAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4yNTAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjIwMDAwMCksCi0gRkwyRlhDT05TVF9EQkwoMC4xNTAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjEwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDUwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLAotIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwKLSBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksCi0gRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLAotIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwKLSBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksCi0gRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLAotIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwKLSBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksCi0gRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLAotIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSB9OwotCiAvKiB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgMyB0YWJsZXMgYXJlIHNoaWZ0ZXQgcmlnaHQgYnkgMSAhICovCiBjb25zdCBGSVhQX0RCTCBTY2FsZUZhY3RvcnNbTk9fSUlEX0xFVkVMU10gPSB7CiAKICAgICAweDVhNWRlZDAwLCAweDU5Y2QwNDAwLCAweDU4YzI5NjgwLCAweDU2NGMyZTgwLCAweDUyYTNkNDgwLAogICAgIDB4NGM4YmUwODAsIDB4NDZkZjMwODAsIDB4NDAwMDAwMDAsIDB4Mzg0YmE1YzAsIDB4MzA0YzI5ODAsCi0gICAgMHgyNGU5ZjY0MCwgMHgxYjRhMjk0MCwgMHgxMWI1YzBhMCwgMHgwYjRlMjU0MCwgMHgwNTE0ZWE5MAotfTsKKyAgICAweDI0ZTlmNjQwLCAweDFiNGEyOTQwLCAweDExYjVjMGEwLCAweDBiNGUyNTQwLCAweDA1MTRlYTkwfTsKIAogY29uc3QgRklYUF9EQkwgU2NhbGVGYWN0b3JzRmluZVtOT19JSURfTEVWRUxTX0ZJTkVdID0gewogCi0gICAgMHg1YTgyNWMwMCwgMHg1YTgyMWMwMCwgMHg1YTgxNTEwMCwgMHg1YTdlZDAwMCwgMHg1YTc2ZTYwMCwKLSAgICAweDVhNWRlZDAwLCAweDVhMzliODgwLCAweDU5ZjFmZDAwLCAweDU5NjRkNjgwLCAweDU4NTJjYTAwLAotICAgIDB4NTY0YzJlODAsIDB4NTQxNzQ0ODAsIDB4NTBlYTc1MDAsIDB4NGM4YmUwODAsIDB4NDZkZjMwODAsCi0gICAgMHg0MDAwMDAwMCwgMHgzODRiYTVjMCwgMHgzMDRjMjk4MCwgMHgyODhkZDI0MCwgMHgyMTdhMjkwMCwKLSAgICAweDFiNGEyOTQwLCAweDEzYzVlY2UwLCAweDBlMmIwMDkwLCAweDBhMTc4ZWYwLCAweDA3MmFiNzk4LAotICAgIDB4MDUxNGVhOTAsIDB4MDJkYzU5NDQsIDB4MDE5YmY4N2MsIDB4MDBlN2IxNzMsIDB4MDA4MjRiOGIsCi0gICAgMHgwMDQ5NDU2OAotfTsKKyAgICAweDVhODI1YzAwLCAweDVhODIxYzAwLCAweDVhODE1MTAwLCAweDVhN2VkMDAwLCAweDVhNzZlNjAwLCAweDVhNWRlZDAwLAorICAgIDB4NWEzOWI4ODAsIDB4NTlmMWZkMDAsIDB4NTk2NGQ2ODAsIDB4NTg1MmNhMDAsIDB4NTY0YzJlODAsIDB4NTQxNzQ0ODAsCisgICAgMHg1MGVhNzUwMCwgMHg0YzhiZTA4MCwgMHg0NmRmMzA4MCwgMHg0MDAwMDAwMCwgMHgzODRiYTVjMCwgMHgzMDRjMjk4MCwKKyAgICAweDI4OGRkMjQwLCAweDIxN2EyOTAwLCAweDFiNGEyOTQwLCAweDEzYzVlY2UwLCAweDBlMmIwMDkwLCAweDBhMTc4ZWYwLAorICAgIDB4MDcyYWI3OTgsIDB4MDUxNGVhOTAsIDB4MDJkYzU5NDQsIDB4MDE5YmY4N2MsIDB4MDBlN2IxNzMsIDB4MDA4MjRiOGIsCisgICAgMHgwMDQ5NDU2OH07CiBjb25zdCBGSVhQX0RCTCBBbHBoYXNbTk9fSUNDX0xFVkVMU10gPSB7CiAKICAgICAweDAwMDAwMDAwLCAweDBiNmI1YmUwLCAweDEyNDg1ZjgwLCAweDFkYTJmYTQwLAotICAgIDB4MjYzN2ViYzAsIDB4MzI0M2Y2YzAsIDB4NDY2Yjc0ODAsIDB4NjQ4N2VkODAKLX07CisgICAgMHgyNjM3ZWJjMCwgMHgzMjQzZjZjMCwgMHg0NjZiNzQ4MCwgMHg2NDg3ZWQ4MH07CiAKLSNpZiBkZWZpbmVkKEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYpCi0jZGVmaW5lICBGSVhQX1BTIEZJWFBfU0dMCi0jZGVmaW5lICBGWFBfQ0FTVChhKSBGWF9EQkwyRlhfU0dMKChGSVhQX0RCTClhKQotI2RlZmluZSAgRkwyRlhDT05TVF9QUyBGTDJGWENPTlNUX1NHTAotI2Vsc2UKLSNkZWZpbmUgIEZJWFBfUFMgRklYUF9EQkwKLSNkZWZpbmUgIEZYUF9DQVNUKHgpICgoRklYUF9EQkwpKHgpKQotI2RlZmluZSAgRkwyRlhDT05TVF9QUyBGTDJGWENPTlNUX0RCTAotI2VuZGlmCitjb25zdCBVQ0hBUiBiaW5zMmdyb3VwTWFwMjBbTk9fSUlEX0dST1VQU10gPSB7CisgICAgMCwgMCwgMSwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTl9OwogCi1jb25zdCBGSVhQX1BTIGFBbGxwYXNzTGlua0RlY2F5U2VyW05PX1NFUklBTF9BTExQQVNTX0xJTktTXSA9IHsKLUZYUF9DQVNUKDB4NTM2MjViMDApLCBGWFBfQ0FTVCgweDQ4NDhhZjAwKSwgRlhQX0NBU1QoMHgzZWE5NGQwMCkgfTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX2FOb0lpZEJpbnNbM10gPSB7CisgICAgTk9fTE9XX1JFU19JSURfQklOUywgTk9fTUlEX1JFU19JSURfQklOUywgTk9fSElfUkVTX0lJRF9CSU5TfTsKIAotY29uc3QgRklYUF9QUyBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclJlUW1mW05PX1FNRl9DSEFOTkVMU10gPSB7Ci1GWFBfQ0FTVCgweDY4YjkyMTgwKSwgRlhQX0NBU1QoMHhkZTM5NjkwMCksIEZYUF9DQVNUKDB4ODA2NTAzODApLCBGWFBfQ0FTVCgweGNiNTM3ZTQwKSwgRlhQX0NBU1QoMHg1YmViOGYwMCksIEZYUF9DQVNUKDB4NzJmMjkyMDApLCBGWFBfQ0FTVCgweGYxZjQzYzUwKSwgRlhQX0NBU1QoMHg4Mzg5NjI4MCksCi1GWFBfQ0FTVCgweGI5Yjk5YzAwKSwgRlhQX0NBU1QoMHg0Y2RhOGYwMCksIEZYUF9DQVNUKDB4N2E1NzZlMDApLCBGWFBfQ0FTVCgweDA2MDc5OWUwKSwgRlhQX0NBU1QoMHg4OWJlNTI4MCksIEZYUF9DQVNUKDB4YTlkYWI2MDApLCBGWFBfQ0FTVCgweDNiZTUxYjAwKSwgRlhQX0NBU1QoMHg3ZWI5MTkwMCksCi1GWFBfQ0FTVCgweDE5ZjRmNTQwKSwgRlhQX0NBU1QoMHg5MmRjYjM4MCksIEZYUF9DQVNUKDB4OWMxYWQ3MDApLCBGWFBfQ0FTVCgweDI5NzYxOTQwKSwgRlhQX0NBU1QoMHg3ZmZiZjUwMCksIEZYUF9DQVNUKDB4MmQzZWIxODApLCBGWFBfQ0FTVCgweDllYWIwYTAwKSwgRlhQX0NBU1QoMHg5MGQwYWE4MCksCi1GWFBfQ0FTVCgweDE2MDFiY2MwKSwgRlhQX0NBU1QoMHg3ZTE4MGU4MCksIEZYUF9DQVNUKDB4M2Y2YjM5NDApLCBGWFBfQ0FTVCgweGFjZGVlYjAwKSwgRlhQX0NBU1QoMHg4ODQzNWIwMCksIEZYUF9DQVNUKDB4MDIwMmE3NjgpLCBGWFBfQ0FTVCgweDc5MTk0ZjgwKSwgRlhQX0NBU1QoMHg1MDA3ZmQwMCksCi1GWFBfQ0FTVCgweGJkMWVjZjAwKSwgRlhQX0NBU1QoMHg4MmE4ZDEwMCksIEZYUF9DQVNUKDB4ZWRmNmU1ZTApLCBGWFBfQ0FTVCgweDcxMWYzNTAwKSwgRlhQX0NBU1QoMHg1ZWFjNDQ4MCksIEZYUF9DQVNUKDB4Y2YwNDQ3YzApLCBGWFBfQ0FTVCgweDgwMjQ1ZjgwKSwgRlhQX0NBU1QoMHhkYTVjZDRjMCksCi1GWFBfQ0FTVCgweDY2NWMwODAwKSwgRlhQX0NBU1QoMHg2YWZiYzUwMCksIEZYUF9DQVNUKDB4ZTIxZTg1ZTApLCBGWFBfQ0FTVCgweDgwYzVlNTAwKSwgRlhQX0NBU1QoMHhjN2IwMDNjMCksIEZYUF9DQVNUKDB4NTkxMzlmODApLCBGWFBfQ0FTVCgweDc0YThlNDAwKSwgRlhQX0NBU1QoMHhmNWY1MWY0MCksCi1GWFBfQ0FTVCgweDg0ODk2NjgwKSwgRlhQX0NBU1QoMHhiNjY2MmIwMCksIEZYUF9DQVNUKDB4NDk5OWI2MDApLCBGWFBfQ0FTVCgweDdiNzZhMzAwKSwgRlhQX0NBU1QoMHgwYTBiMDY1MCksIEZYUF9DQVNUKDB4OGI1NzJiODApLCBGWFBfQ0FTVCgweGE2ZWM0NTgwKSwgRlhQX0NBU1QoMHgzODRmZGE4MCksCi1GWFBfQ0FTVCgweDdmM2ExZjAwKSwgRlhQX0NBU1QoMHgxZGUxOWVjMCksIEZYUF9DQVNUKDB4OTUwNDUwMDApLCBGWFBfQ0FTVCgweDk5YTNlMTgwKSwgRlhQX0NBU1QoMHgyNWEzMDc0MCksIEZYUF9DQVNUKDB4N2ZkYjllODApLCBGWFBfQ0FTVCgweDMwZmJkYjAwKSwgRlhQX0NBU1QoMHhhMTUzZDUwMCkgfTsKLQotY29uc3QgRklYUF9QUyBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvckltUW1mW05PX1FNRl9DSEFOTkVMU10gPSB7Ci1GWFBfQ0FTVCgweGI2NjYzYTgwKSwgRlhQX0NBU1QoMHg4NDg5NjIwMCksIEZYUF9DQVNUKDB4ZjVmNTBjNzApLCBGWFBfQ0FTVCgweDc0YThkYzgwKSwgRlhQX0NBU1QoMHg1OTEzYWQwMCksIEZYUF9DQVNUKDB4YzdiMDE0ODApLCBGWFBfQ0FTVCgweDgwYzVlMzAwKSwgRlhQX0NBU1QoMHhlMjFlNzNhMCksCi1GWFBfQ0FTVCgweDZhZmJiYTgwKSwgRlhQX0NBU1QoMHg2NjVjMTM4MCksIEZYUF9DQVNUKDB4ZGE1Y2U2YzApLCBGWFBfQ0FTVCgweDgwMjQ2MDgwKSwgRlhQX0NBU1QoMHhjZjA0MzY0MCksIEZYUF9DQVNUKDB4NWVhYzM4MDApLCBGWFBfQ0FTVCgweDcxMWYzZTAwKSwgRlhQX0NBU1QoMHhlZGY2ZjhhMCksCi1GWFBfQ0FTVCgweDgyYThkNTAwKSwgRlhQX0NBU1QoMHhiZDFlYmU4MCksIEZYUF9DQVNUKDB4NTAwN2VlMDApLCBGWFBfQ0FTVCgweDc5MTk1NTgwKSwgRlhQX0NBU1QoMHgwMjAyYmE0MCksIEZYUF9DQVNUKDB4ODg0MzYxODApLCBGWFBfQ0FTVCgweGFjZGVkYzgwKSwgRlhQX0NBU1QoMHgzZjZiMjhjMCksCi1GWFBfQ0FTVCgweDdlMTgxMTgwKSwgRlhQX0NBU1QoMHgxNjAxY2Y0MCksIEZYUF9DQVNUKDB4OTBkMGIzODApLCBGWFBfQ0FTVCgweDllYWFmZDgwKSwgRlhQX0NBU1QoMHgyZDNlOWZjMCksIEZYUF9DQVNUKDB4N2ZmYmY1ODApLCBGWFBfQ0FTVCgweDI5NzYyYjAwKSwgRlhQX0NBU1QoMHg5YzFhZTI4MCksCi1GWFBfQ0FTVCgweDkyZGNhOTgwKSwgRlhQX0NBU1QoMHgxOWY0ZTJjMCksIEZYUF9DQVNUKDB4N2ViOTE2ODApLCBGWFBfQ0FTVCgweDNiZTUyYjgwKSwgRlhQX0NBU1QoMHhhOWRhYzQwMCksIEZYUF9DQVNUKDB4ODliZTRiODApLCBGWFBfQ0FTVCgweDA2MDc4NzEwKSwgRlhQX0NBU1QoMHg3YTU3Njg4MCksCi1GWFBfQ0FTVCgweDRjZGE5ZTAwKSwgRlhQX0NBU1QoMHhiOWI5YWMwMCksIEZYUF9DQVNUKDB4ODM4OTVlMDApLCBGWFBfQ0FTVCgweGYxZjQyOTkwKSwgRlhQX0NBU1QoMHg3MmYyOGEwMCksIEZYUF9DQVNUKDB4NWJlYjljMDApLCBGWFBfQ0FTVCgweGNiNTM4ZjQwKSwgRlhQX0NBU1QoMHg4MDY1MDIwMCksCi1GWFBfQ0FTVCgweGRlMzk1NmMwKSwgRlhQX0NBU1QoMHg2OGI5MTY4MCksIEZYUF9DQVNUKDB4NjhiOTJjMDApLCBGWFBfQ0FTVCgweGRlMzk3YjQwKSwgRlhQX0NBU1QoMHg4MDY1MDUwMCksIEZYUF9DQVNUKDB4Y2I1MzZkMDApLCBGWFBfQ0FTVCgweDViZWI4MTgwKSwgRlhQX0NBU1QoMHg3MmYyOWE4MCksCi1GWFBfQ0FTVCgweGYxZjQ0ZjEwKSwgRlhQX0NBU1QoMHg4Mzg5NjcwMCksIEZYUF9DQVNUKDB4YjliOThjODApLCBGWFBfQ0FTVCgweDRjZGE4MDAwKSwgRlhQX0NBU1QoMHg3YTU3NzM4MCksIEZYUF9DQVNUKDB4MDYwN2FjYjgpLCBGWFBfQ0FTVCgweDg5YmU1YTAwKSwgRlhQX0NBU1QoMHhhOWRhYTgwMCkgfTsKLQotY29uc3QgRklYUF9QUyBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclJlU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU10gPSB7Ci1GWFBfQ0FTVCgweDdlODA3MzgwKSwgRlhQX0NBU1QoMHg3MmI5YmIwMCksIEZYUF9DQVNUKDB4NWM0NGVlODApLCBGWFBfQ0FTVCgweDNkMzkzOGMwKSwgRlhQX0NBU1QoMHg4MDAwMDAwMCksIEZYUF9DQVNUKDB4ODAwMDAwMDApLAotRlhQX0NBU1QoMHg3MmI5YmIwMCksIEZYUF9DQVNUKDB4N2U4MDczODApLCBGWFBfQ0FTVCgweGJhOTE0NzAwKSwgRlhQX0NBU1QoMHgwNTA2NzdiMCksIEZYUF9DQVNUKDB4ODk1Y2MzODApLCBGWFBfQ0FTVCgweDgzNGU0OTAwKSB9OwotCi1jb25zdCBGSVhQX1BTIGFhRnJhY3REZWxheVBoYXNlRmFjdG9ySW1TdWJRbWYyMFtOT19TVUJfUU1GX0NIQU5ORUxTXSA9IHsKLUZYUF9DQVNUKDB4ZWM3OTE3MjApLCBGWFBfQ0FTVCgweGM3M2NhMDgwKSwgRlhQX0NBU1QoMHhhNzQ4ZWEwMCksIEZYUF9DQVNUKDB4OGY5NzY5ODApLCBGWFBfQ0FTVCgweDAwMDAwMDAwKSwgRlhQX0NBU1QoMHgwMDAwMDAwMCksCi1GWFBfQ0FTVCgweDM4YzM1ZjgwKSwgRlhQX0NBU1QoMHgxMzg2ZThlMCksIEZYUF9DQVNUKDB4OTQ3N2QwMDApLCBGWFBfQ0FTVCgweDgwMTk0MzgwKSwgRlhQX0NBU1QoMHhjZmYyNjE0MCksIEZYUF9DQVNUKDB4MWNlNzBkNDApIH07Ci0KLWNvbnN0IEZJWFBfUFMgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJSZVFtZltOT19RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXSA9IHsKLXtGWFBfQ0FTVCgweDYzZTUyNDgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4NmQ3M2FmMDApfSwge0ZYUF9DQVNUKDB4YzdiMDEyODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHhmN2MzMWNiMCl9LCB7RlhQX0NBU1QoMHg4Mzg5NjIwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDhhZWUyNzAwKX0sCi17RlhQX0NBU1QoMHgwMjAyYjMzMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDliZmFiNTAwKX0sIHtGWFBfQ0FTVCgweDdkNTcyYzgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4MTg5M2I5NjApfSwge0ZYUF9DQVNUKDB4MzRhYzdmYzApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg3YWJmNzk4MCl9LAote0ZYUF9DQVNUKDB4OTlhM2VlMDApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg1OGVlYWQ4MCl9LCB7RlhQX0NBU1QoMHg5ZWFiMDU4MCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGQ3N2RhZTQwKX0sIHtGWFBfQ0FTVCgweDNiZTUyMTQwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4ODE5Yjg1MDApfSwKLXtGWFBfQ0FTVCgweDdiNzY5ZDgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4YjNhMTIyODApfSwge0ZYUF9DQVNUKDB4ZjlmODY4NzgpLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHgzN2M1MTljMCl9LCB7RlhQX0NBU1QoMHg4MWU3ZWY4MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDdmZjE2ODgwKX0sCi17RlhQX0NBU1QoMHhjZjA0M2NjMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDNlOGIyMzQwKX0sIHtGWFBfQ0FTVCgweDY4YjkyMjgwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4YjllNGE5MDApfSwge0ZYUF9DQVNUKDB4NWVhYzM5ODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg4MGEwNTIwMCl9LAote0ZYUF9DQVNUKDB4YzA5NGNkMDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHhkMDUxZGM4MCl9LCB7RlhQX0NBU1QoMHg4NWE4OTQwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDUzNDgzYjAwKX0sIHtGWFBfQ0FTVCgweDBhMGFmNWUwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4N2NiMWI2ODApfSwKLXtGWFBfQ0FTVCgweDdlYjkxOTAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4MjAwNmU4YzApfSwge0ZYUF9DQVNUKDB4MmQzZWE2ODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHhhMGVjMWMwMCl9LCB7RlhQX0NBU1QoMHg5NTA0NDE4MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDg4MGQyMTgwKX0sCi17RlhQX0NBU1QoMHhhNDE0NzMwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweGYwMjgyODcwKX0sIHtGWFBfQ0FTVCgweDQyZTEzZjgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4Njk0YzRhMDApfSwge0ZYUF9DQVNUKDB4NzkxOTUyMDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg3MTM3NDc4MCl9LAote0ZYUF9DQVNUKDB4ZjFmNDM1NTApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHhmZjY1OTNlYSl9LCB7RlhQX0NBU1QoMHg4MGM1ZTI4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDhlMzllYzAwKX0sIHtGWFBfQ0FTVCgweGQ2ODllNDgwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4OTc2NDgxMDApfSwKLXtGWFBfQ0FTVCgweDZkMjM1MzAwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4MTEwYTIwYzApfSwge0ZYUF9DQVNUKDB4NTkxM2E4MDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg3ODVkNGY4MCl9LCB7RlhQX0NBU1QoMHhiOWI5OWEwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDVlNDQwODgwKX0sCi17RlhQX0NBU1QoMHg4ODQzNjEwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweGRlY2U3MDAwKX0sIHtGWFBfQ0FTVCgweDEyMDkxMzIwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4ODMwOWY4MDApfSwge0ZYUF9DQVNUKDB4N2Y5YWZkMDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHhhZGEzM2YwMCl9LAote0ZYUF9DQVNUKDB4MjVhMzE3MDApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHgzMGNjMzYwMCl9LCB7RlhQX0NBU1QoMHg5MGQwYWI4MCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDdmN2NiZTgwKX0sIHtGWFBfQ0FTVCgweGE5ZGFiZjAwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4NDUxODI1ODApfSwKLXtGWFBfQ0FTVCgweDQ5OTljYjgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4YzA2ODFjODApfSwge0ZYUF9DQVNUKDB4NzY0MWFjODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg4MDE5NDM4MCl9LCB7RlhQX0NBU1QoMHhlOWZlMzMwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweGM5NTE4NGMwKX0sCi17RlhQX0NBU1QoMHg4MDI0NjAwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDRkNTVkODAwKX0sIHtGWFBfQ0FTVCgweGRlMzk2ZmMwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4N2UzMjQwMDApfSwge0ZYUF9DQVNUKDB4NzExZjNmMDApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHgyNzVjZTQ4MCl9LAote0ZYUF9DQVNUKDB4NTMyMTE3MDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHhhNjM0MzU4MCl9LCB7RlhQX0NBU1QoMHhiMzI1Njc4MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDg1OTk3YjgwKX0sIHtGWFBfQ0FTVCgweDhiNTcyNjgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4ZTg5YmE2NjApfSwKLXtGWFBfQ0FTVCgweDE5ZjRmNzgwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4NjRjNGUxMDApfSwge0ZYUF9DQVNUKDB4N2ZmYmY1ODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg3NDkzYTM4MCl9LCB7RlhQX0NBU1QoMHgxZGUxODEwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDA3MDg5N2YwKX0sCi17RlhQX0NBU1QoMHg4ZDBkNmE4MCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDkxZWQ2ZjAwKX0sIHtGWFBfQ0FTVCgweGFmZjgxMzgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4OTMyZGIwMDApfSwge0ZYUF9DQVNUKDB4NTAwN2ZiMDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHgwOTcwZmViMCl9LAote0ZYUF9DQVNUKDB4NzJmMjhkMDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg3NThkNjUwMCl9LCB7RlhQX0NBU1QoMHhlMjFlNmNjMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDYzNDM2ZjgwKX0sIHtGWFBfQ0FTVCgweDgwMDQwYjAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4ZTYzZDc2MDApfSwKLXtGWFBfQ0FTVCgweGU2MGIxYWUwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4ODRlYTVjODApfSwge0ZYUF9DQVNUKDB4NzRhOGUxMDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHhhN2YwNzUwMCl9LCB7RlhQX0NBU1QoMHg0Y2RhODk4MCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDI5YTZkMzQwKX0sCi17RlhQX0NBU1QoMHhhY2RlZGE4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDdlOTNkNjAwKX0sIHtGWFBfQ0FTVCgweDhlZTBjOTgwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4NGI2NjI2ODApfSwge0ZYUF9DQVNUKDB4MjFjNmEyODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHhjNzI1OGM4MCl9LAote0ZYUF9DQVNUKDB4N2ZkYjlmMDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg4MDA2ZDUwMCl9LCB7RlhQX0NBU1QoMHgxNjAxYmE2MCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweGMyODMwOTQwKX0sIHtGWFBfQ0FTVCgweDg5YmU0YzgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4NDcxY2YxMDApfSwKLXtGWFBfQ0FTVCgweGI2NjY0NDAwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4N2YzZmI4MDApfX07Ci0KLWNvbnN0IEZJWFBfUFMgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJJbVFtZltOT19RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXSA9IHsKLXtGWFBfQ0FTVCgweGFmZjgwYzgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4YmRhMjllMDApfSwge0ZYUF9DQVNUKDB4OGQwZDZmMDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg4MDQzZWU4MCl9LCB7RlhQX0NBU1QoMHgxZGUxOGEyMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGNjM2U3ODQwKX0sCi17RlhQX0NBU1QoMHg3ZmZiZjUwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDRmZGZjMTgwKX0sIHtGWFBfQ0FTVCgweDE5ZjRlZTQwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4N2Q5ZTRjMDApfSwge0ZYUF9DQVNUKDB4OGI1NzIzMDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHgyNDRhMjk0MCl9LAote0ZYUF9DQVNUKDB4YjMyNTZmMDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHhhM2YwYTUwMCl9LCB7RlhQX0NBU1QoMHg1MzIxMWUwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDg2OTQ0NTAwKX0sIHtGWFBfQ0FTVCgweDcxMWYzYTgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4ZWJjNzIwNDApfSwKLXtGWFBfQ0FTVCgweGRlMzk2NmMwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4NjZiODdlMDApfSwge0ZYUF9DQVNUKDB4ODAyNDYwODApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg3MzM2MmMwMCl9LCB7RlhQX0NBU1QoMHhlOWZlM2M0MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDAzZDFkMTEwKX0sCi17RlhQX0NBU1QoMHg3NjQxYjAwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDkwNTIwYzgwKX0sIHtGWFBfQ0FTVCgweDQ5OTljMzgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4OTRlODBhODApfSwge0ZYUF9DQVNUKDB4YTlkYWI4MDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHgwY2E1NzBlMCl9LAote0ZYUF9DQVNUKDB4OTBkMGIwMDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg3NmM5YmM4MCl9LCB7RlhQX0NBU1QoMHgyNWEzMjAwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDYxMzM4NTAwKX0sIHtGWFBfQ0FTVCgweDdmOWFmYzgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4ZTMxOGYwNjApfSwKLXtGWFBfQ0FTVCgweDEyMDkwOWMwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4ODQxMjRlMDApfSwge0ZYUF9DQVNUKDB4ODg0MzVkODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHhhYTRkMmY4MCl9LCB7RlhQX0NBU1QoMHhiOWI5YTIwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDJjYWUxODAwKX0sCi17RlhQX0NBU1QoMHg1OTEzYWU4MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDdmMDQwNjgwKX0sIHtGWFBfQ0FTVCgweDZkMjM0ZTAwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4NDhjNmExMDApfSwge0ZYUF9DQVNUKDB4ZDY4OWRiODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHhjNDQ4NjBjMCl9LAote0ZYUF9DQVNUKDB4ODBjNWUzODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg4MDAwNWQwMCl9LCB7RlhQX0NBU1QoMHhmMWY0M2ViMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGM1NWEzYTAwKX0sIHtGWFBfQ0FTVCgweDc5MTk1NTAwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4NDljM2RlMDApfSwKLXtGWFBfQ0FTVCgweDQyZTEzNzAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4N2VkYzViMDApfSwge0ZYUF9DQVNUKDB4YTQxNDZjODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHgyYjhjMmMwMCl9LCB7RlhQX0NBU1QoMHg5NTA0NDY4MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweGE5NjhjMTAwKX0sCi17RlhQX0NBU1QoMHgyZDNlYWY0MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDg0NjBmZDgwKX0sIHtGWFBfQ0FTVCgweDdlYjkxNzgwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4ZTQ0NjIxZTApfSwge0ZYUF9DQVNUKDB4MGEwYWVjODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg2MWZiNWMwMCl9LAote0ZYUF9DQVNUKDB4ODVhODkxMDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg3NjU1NTc4MCl9LCB7RlhQX0NBU1QoMHhjMDk0ZDUwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDBiNzFmNzkwKX0sIHtGWFBfQ0FTVCgweDVlYWM0MDAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4OTQ0MDFhODApfSwKLXtGWFBfQ0FTVCgweDY4YjkxZDgwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4OTBlYTM5ODApfSwge0ZYUF9DQVNUKDB4Y2YwNDM0NDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHgwNTA2N2EwOCl9LCB7RlhQX0NBU1QoMHg4MWU3ZjE4MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDczYmI2ZDAwKX0sCi17RlhQX0NBU1QoMHhmOWY4NzFlMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDY1ZmYwZTAwKX0sIHtGWFBfQ0FTVCgweDdiNzZhMDAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4ZWE5NjY0YzApfSwge0ZYUF9DQVNUKDB4M2JlNTE4YzApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg4NjMzZTg4MCl9LAote0ZYUF9DQVNUKDB4OWVhYWZmMDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHhhNGM4NDUwMCl9LCB7RlhQX0NBU1QoMHg5OWEzZjQwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDI1NzFlYWMwKX0sIHtGWFBfQ0FTVCgweDM0YWM4ODQwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4N2RkODJiMDApfSwKLXtGWFBfQ0FTVCgweDdkNTcyYTgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4NGVlZDg0MDApfSwge0ZYUF9DQVNUKDB4MDIwMmE5YzQpLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHhjYjI0OTcwMCl9LCB7RlhQX0NBU1QoMHg4Mzg5NjAwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDgwMzE4MjAwKX0sCi17RlhQX0NBU1QoMHhjN2IwMWIwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweGJlYWI3NTgwKX0sIHtGWFBfQ0FTVCgweDYzZTUyYTgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4NDM2NGI3MDApfSwge0ZYUF9DQVNUKDB4NjNlNTFmMDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg3ZmE2YmQwMCl9LAote0ZYUF9DQVNUKDB4YzdiMDBhMDApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHgzMmE2Nzk0MCl9LCB7RlhQX0NBU1QoMHg4Mzg5NjQwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweGFmMmZkMjAwKX0sIHtGWFBfQ0FTVCgweDAyMDJiYzljKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4ODI5ZTZlODApfSwKLXtGWFBfQ0FTVCgweDdkNTcyZTgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4ZGNkZTZiODApfSwge0ZYUF9DQVNUKDB4MzRhYzc3MDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg1Y2U0ZTI4MCl9LCB7RlhQX0NBU1QoMHg5OWEzZTg4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDc5MDg5YzAwKX0sCi17RlhQX0NBU1QoMHg5ZWFiMGI4MCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDEzMDdhZTgwKX0sIHtGWFBfQ0FTVCgweDNiZTUyOTgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4OTg5MDY4ODApfSwge0ZYUF9DQVNUKDB4N2I3NjliMDApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg4ZDUxYjMwMCl9LAote0ZYUF9DQVNUKDB4ZjlmODVmMTApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHhmZDYyZWUyNCl9LCB7RlhQX0NBU1QoMHg4MWU3ZWUwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDcwNDM5NjgwKX0sIHtGWFBfQ0FTVCgweGNmMDQ0NTgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4NmE2ZDk2MDApfSwKLXtGWFBfQ0FTVCgweDY4YjkyODAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4ZjIyNzVmODApfX07Ci0KLWNvbnN0IEZJWFBfUFMgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJSZVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXSA9IHsKLXtGWFBfQ0FTVCgweDdlMmRmMDAwKSwgRlhQX0NBU1QoMHg3YTdkMDU4MCksIEZYUF9DQVNUKDB4N2VkMDNlMDApfSwge0ZYUF9DQVNUKDB4NmZlYzlhODApLCBGWFBfQ0FTVCgweDUxMzNjYzgwKSwgRlhQX0NBU1QoMHg3NTczZGYwMCl9LCB7RlhQX0NBU1QoMHg1NTA2MzkwMCksIEZYUF9DQVNUKDB4MGM4YmQzNjApLCBGWFBfQ0FTVCgweDYzNmMwNDAwKX0sCi17RlhQX0NBU1QoMHgzMDg0Y2EwMCksIEZYUF9DQVNUKDB4YzNhOTQ1ODApLCBGWFBfQ0FTVCgweDRhMGQ2NzAwKX0sIHtGWFBfQ0FTVCgweDgwMDAwMDAwKSwgRlhQX0NBU1QoMHg4MDAwMDAwMCksIEZYUF9DQVNUKDB4ODAwMDAwMDApfSwge0ZYUF9DQVNUKDB4ODAwMDAwMDApLCBGWFBfQ0FTVCgweDgwMDAwMDAwKSwgRlhQX0NBU1QoMHg4MDAwMDAwMCl9LAote0ZYUF9DQVNUKDB4NmZlYzlhODApLCBGWFBfQ0FTVCgweDUxMzNjYzgwKSwgRlhQX0NBU1QoMHg3NTczZGYwMCl9LCB7RlhQX0NBU1QoMHg3ZTJkZjAwMCksIEZYUF9DQVNUKDB4N2E3ZDA1ODApLCBGWFBfQ0FTVCgweDdlZDAzZTAwKX0sIHtGWFBfQ0FTVCgweGE0Yzg0MjgwKSwgRlhQX0NBU1QoMHhiOGUzMTMwMCksIEZYUF9DQVNUKDB4ZDVhZjAxNDApfSwKLXtGWFBfQ0FTVCgweGYwZjQ4OGEwKSwgRlhQX0NBU1QoMHg4Mjc1YTEwMCksIEZYUF9DQVNUKDB4MWE3MmUzNjApfSwge0ZYUF9DQVNUKDB4ODBhYWE2ODApLCBGWFBfQ0FTVCgweDQ3MWNlZDAwKSwgRlhQX0NBU1QoMHg5ZDJlYWQ4MCl9LCB7RlhQX0NBU1QoMHg5NDc3ZDEwMCksIEZYUF9DQVNUKDB4N2Q4YTVmMDApLCBGWFBfQ0FTVCgweDgxNTFkZjgwKX19OwotCi1jb25zdCBGSVhQX1BTIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VySW1TdWJRbWYyMFtOT19TVUJfUU1GX0NIQU5ORUxTXVtOT19TRVJJQUxfQUxMUEFTU19MSU5LU10gPSB7Ci17RlhQX0NBU1QoMHhlYTdkMDhhMCksIEZYUF9DQVNUKDB4ZGFkN2YzYzApLCBGWFBfQ0FTVCgweGVlOWM5ZjYwKX0sIHtGWFBfQ0FTVCgweGMxZTU0MTQwKSwgRlhQX0NBU1QoMHg5ZDBkZmU4MCksIEZYUF9DQVNUKDB4Y2QxZTczMDApfSwge0ZYUF9DQVNUKDB4YTA1MWE1ODApLCBGWFBfQ0FTVCgweDgwOWRjOTgwKSwgRlhQX0NBU1QoMHhhZjYxYzQwMCl9LAote0ZYUF9DQVNUKDB4ODk4ZDRlMDApLCBGWFBfQ0FTVCgweDhmMWQzNDAwKSwgRlhQX0NBU1QoMHg5Nzk4ODI4MCl9LCB7RlhQX0NBU1QoMHgwMDAwMDAwMCksIEZYUF9DQVNUKDB4MDAwMDAwMDApLCBGWFBfQ0FTVCgweDAwMDAwMDAwKX0sIHtGWFBfQ0FTVCgweDAwMDAwMDAwKSwgRlhQX0NBU1QoMHgwMDAwMDAwMCksIEZYUF9DQVNUKDB4MDAwMDAwMDApfSwKLXtGWFBfQ0FTVCgweDNlMWFiZWMwKSwgRlhQX0NBU1QoMHg2MmYyMDE4MCksIEZYUF9DQVNUKDB4MzJlMThkMDApfSwge0ZYUF9DQVNUKDB4MTU4MmY3NjApLCBGWFBfQ0FTVCgweDI1MjgwYzQwKSwgRlhQX0NBU1QoMHgxMTYzNjBhMCl9LCB7RlhQX0NBU1QoMHhhNjM0MzgwMCksIEZYUF9DQVNUKDB4NmE2ZDk4ODApLCBGWFBfQ0FTVCgweDg3MzI3YTAwKX0sCi17RlhQX0NBU1QoMHg4MGUzMjIwMCksIEZYUF9DQVNUKDB4ZTcwNzQ3YzApLCBGWFBfQ0FTVCgweDgyYzMyYjAwKX0sIHtGWFBfQ0FTVCgweGYyZjQyNDIwKSwgRlhQX0NBU1QoMHg2YTZkOTg4MCksIEZYUF9DQVNUKDB4YWVhNDcwODApfSwge0ZYUF9DQVNUKDB4NDU2ZWJhMDApLCBGWFBfQ0FTVCgweGU3MDc0N2MwKSwgRlhQX0NBU1QoMHhlZGFhODY0MCl9fTsKLQotY29uc3QgRklYUF9QUyBwOF8xM18yMFsxM10gPQotewotICBGTDJGWENPTlNUX1BTKDAuMDA3NDYwODI5NDk4MTJmKSwgIEZMMkZYQ09OU1RfUFMoMC4wMjI3MDQyMDk0OTgyNWYpLCAgRkwyRlhDT05TVF9QUygwLjA0NTQ2ODY1OTMwNDczZiksICBGTDJGWENPTlNUX1BTKDAuMDcyNjYxMTM5Mjk1OTFmKSwKLSAgRkwyRlhDT05TVF9QUygwLjA5ODg1MTA4NTc1MjY0ZiksICBGTDJGWENPTlNUX1BTKDAuMTE3OTM3MTA1NjcyMTdmKSwgIEZMMkZYQ09OU1RfUFMoMC4xMjVmICAgICAgICAgICApLCAgRkwyRlhDT05TVF9QUygwLjExNzkzNzEwNTY3MjE3ZiksCi0gIEZMMkZYQ09OU1RfUFMoMC4wOTg4NTEwODU3NTI2NGYpLCAgRkwyRlhDT05TVF9QUygwLjA3MjY2MTEzOTI5NTkxZiksICBGTDJGWENPTlNUX1BTKDAuMDQ1NDY4NjU5MzA0NzNmKSwgIEZMMkZYQ09OU1RfUFMoMC4wMjI3MDQyMDk0OTgyNWYpLAotICBGTDJGWENPTlNUX1BTKDAuMDA3NDYwODI5NDk4MTJmKQotfTsKLQotY29uc3QgRklYUF9QUyBwMl8xM18yMFsxM10gPQotewotICBGTDJGWENPTlNUX1BTKDAuMGYpLCBGTDJGWENPTlNUX1BTKCAwLjAxODk5NDg3NTI2MDQ5ZiksICBGTDJGWENPTlNUX1BTKDAuMGYpLCBGTDJGWENPTlNUX1BTKC0wLjA3MjkzMTM5MTY3NTM4ZiksCi0gIEZMMkZYQ09OU1RfUFMoMC4wZiksIEZMMkZYQ09OU1RfUFMoIDAuMzA1OTY2MzA1NDUxNjhmKSwgIEZMMkZYQ09OU1RfUFMoMC41ZiksIEZMMkZYQ09OU1RfUFMoIDAuMzA1OTY2MzA1NDUxNjhmKSwKLSAgRkwyRlhDT05TVF9QUygwLjBmKSwgRkwyRlhDT05TVF9QUygtMC4wNzI5MzEzOTE2NzUzOGYpLCAgRkwyRlhDT05TVF9QUygwLjBmKSwgRkwyRlhDT05TVF9QUyggMC4wMTg5OTQ4NzUyNjA0OWYpLAotICBGTDJGWENPTlNUX1BTKDAuMGYpCi19OwotCi0KLQotY29uc3QgVUNIQVIgYUFsbHBhc3NMaW5rRGVsYXlTZXJbXSA9IHsgICAgMywgICAgIDQsICAgICA1fTsKLQotY29uc3QgVUNIQVIgZGVsYXlJbmRleFFtZltOT19RTUZfQ0hBTk5FTFNdID0gewotICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gIDE0LCAxNCwgMTQsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMQotfTsKLQotY29uc3QgVUNIQVIgZ3JvdXBCb3JkZXJzMjBbTk9fSUlEX0dST1VQUyArIDFdID0KLXsKLSAgIDYsICA3LCAgMCwgIDEsICAyLCAgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNiBzdWJxbWYgc3ViYmFuZHMgLSAwdGggcW1mIHN1YmJhbmQgKi8KLSAgIDksICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAxc3QgcW1mIHN1YmJhbmQgKi8KLSAgMTAsIDExLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAybmQgcW1mIHN1YmJhbmQgKi8KLSAgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwKLSAgIDksICAxMSwgMTQsIDE4LCAyMywgMzUsIDY0Ci19OwotCi1jb25zdCBVQ0hBUiBncm91cEJvcmRlcnMzNFtOT19JSURfR1JPVVBTX0hJX1JFUyArIDFdID0KLXsKLSAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsICAgLyogMTIgc3VicW1mIHN1YmJhbmRzIC0gMHRoIHFtZiBzdWJiYW5kICovCi0gIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgICAgICAgICAgICAgICAgICAgIC8qICA4IHN1YnFtZiBzdWJiYW5kcyAtIDFzdCBxbWYgc3ViYmFuZCAqLwotICAyMCwgMjEsIDIyLCAyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNCBzdWJxbWYgc3ViYmFuZHMgLSAybmQgcW1mIHN1YmJhbmQgKi8KLSAgMjQsIDI1LCAyNiwgMjcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDQgc3VicW1mIHN1YmJhbmRzIC0gM25kIHFtZiBzdWJiYW5kICovCi0gIDI4LCAyOSwgMzAsIDMxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA0IHN1YnFtZiBzdWJiYW5kcyAtIDRuZCBxbWYgc3ViYmFuZCAqLwotICAzMi0yNywgMzMtMjcsIDM0LTI3LCAzNS0yNywgMzYtMjcsIDM3LTI3LCAzOC0yNywKLSAgNDAtMjcsIDQyLTI3LCA0NC0yNywgNDYtMjcsIDQ4LTI3LCA1MS0yNywgNTQtMjcsCi0gIDU3LTI3LCA2MC0yNywgNjQtMjcsIDY4LTI3LCA5MS0yNwotfTsKLQotY29uc3QgVUNIQVIgYmluczJncm91cE1hcDIwW05PX0lJRF9HUk9VUFNdID0KLXsKLSAgMSwgMCwKLSAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTkKLX07Ci0KLWNvbnN0IFVDSEFSIHF1YW50aXplZElJRHNbTk9fSUlEX1NURVBTXSA9Ci17Ci0gICAgMiwgNCwgNywgMTAsIDE0LCAxOCwgMjUKLX07Ci1jb25zdCBVQ0hBUiBxdWFudGl6ZWRJSURzRmluZVtOT19JSURfU1RFUFNfRklORV0gPQotewotICAgIDIsIDQsIDYsIDgsIDEwLCAxMywgMTYsIDE5LCAyMiwgMjUsIDMwLCAzNSwgNDAsIDQ1LCA1MAotfTsKLQotY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfYU5vSWlkQmluc1szXSA9IHtOT19MT1dfUkVTX0lJRF9CSU5TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fTUlEX1JFU19JSURfQklOUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX0hJX1JFU19JSURfQklOU307Ci0KLWNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX2FOb0ljY0JpbnNbM10gPSB7Tk9fTE9XX1JFU19JQ0NfQklOUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX01JRF9SRVNfSUNDX0JJTlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOT19ISV9SRVNfSUNDX0JJTlN9OwotCi0KK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX2FOb0ljY0JpbnNbM10gPSB7CisgICAgTk9fTE9XX1JFU19JQ0NfQklOUywgTk9fTUlEX1JFU19JQ0NfQklOUywgTk9fSElfUkVTX0lDQ19CSU5TfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQpAQCAtMTM4NSwzOSArMTY3MywzMyBAQAogICAgICAgICAgaW52VGFibGVbaV0gPSBGTDJGWF9TR0woZCk7CiAgICAgICAgfQogKi8KLWNvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX2ludlRhYmxlW0lOVl9UQUJMRV9TSVpFXSA9Ci17Ci0gIDB4N2Y4MCwgMHg3ZjAxLCAweDdlODMsIDB4N2UwNywgMHg3ZDhiLCAweDdkMTEsIDB4N2M5NywgMHg3YzFlLAotICAweDdiYTYsIDB4N2IyZiwgMHg3YWI5LCAweDdhNDQsIDB4NzljZiwgMHg3OTVjLCAweDc4ZTksIDB4Nzg3OCwKLSAgMHg3ODA3LCAweDc3OTYsIDB4NzcyNywgMHg3NmI5LCAweDc2NGIsIDB4NzVkZSwgMHg3NTcyLCAweDc1MDYsCi0gIDB4NzQ5YywgMHg3NDMyLCAweDczYzksIDB4NzM2MCwgMHg3MmY5LCAweDcyOTIsIDB4NzIyYywgMHg3MWM2LAotICAweDcxNjEsIDB4NzBmZCwgMHg3MDlhLCAweDcwMzcsIDB4NmZkNSwgMHg2Zjc0LCAweDZmMTMsIDB4NmViMywKLSAgMHg2ZTU0LCAweDZkZjUsIDB4NmQ5NywgMHg2ZDM5LCAweDZjZGMsIDB4NmM4MCwgMHg2YzI0LCAweDZiYzksCi0gIDB4NmI2ZiwgMHg2YjE1LCAweDZhYmMsIDB4NmE2MywgMHg2YTBiLCAweDY5YjMsIDB4Njk1YywgMHg2OTA2LAotICAweDY4YjAsIDB4Njg1YSwgMHg2ODA2LCAweDY3YjEsIDB4Njc1ZSwgMHg2NzBhLCAweDY2YjgsIDB4NjY2NiwKLSAgMHg2NjE0LCAweDY1YzMsIDB4NjU3MiwgMHg2NTIyLCAweDY0ZDIsIDB4NjQ4MywgMHg2NDM0LCAweDYzZTYsCi0gIDB4NjM5OSwgMHg2MzRiLCAweDYyZmUsIDB4NjJiMiwgMHg2MjY2LCAweDYyMWIsIDB4NjFkMCwgMHg2MTg1LAotICAweDYxM2IsIDB4NjBmMiwgMHg2MGE4LCAweDYwNjAsIDB4NjAxNywgMHg1ZmNmLCAweDVmODgsIDB4NWY0MSwKLSAgMHg1ZWZhLCAweDVlYjQsIDB4NWU2ZSwgMHg1ZTI4LCAweDVkZTMsIDB4NWQ5ZiwgMHg1ZDVhLCAweDVkMTcsCi0gIDB4NWNkMywgMHg1YzkwLCAweDVjNGQsIDB4NWMwYiwgMHg1YmM5LCAweDViODcsIDB4NWI0NiwgMHg1YjA1LAotICAweDVhYzQsIDB4NWE4NCwgMHg1YTQ0LCAweDVhMDUsIDB4NTljNiwgMHg1OTg3LCAweDU5NDksIDB4NTkwYSwKLSAgMHg1OGNkLCAweDU4OGYsIDB4NTg1MiwgMHg1ODE1LCAweDU3ZDksIDB4NTc5ZCwgMHg1NzYxLCAweDU3MjUsCi0gIDB4NTZlYSwgMHg1NmFmLCAweDU2NzUsIDB4NTYzYiwgMHg1NjAxLCAweDU1YzcsIDB4NTU4ZSwgMHg1NTU1LAotICAweDU1MWMsIDB4NTRlMywgMHg1NGFiLCAweDU0NzMsIDB4NTQzYywgMHg1NDA1LCAweDUzY2UsIDB4NTM5NywKLSAgMHg1MzYwLCAweDUzMmEsIDB4NTJmNCwgMHg1MmJmLCAweDUyODksIDB4NTI1NCwgMHg1MjFmLCAweDUxZWIsCi0gIDB4NTFiNywgMHg1MTgzLCAweDUxNGYsIDB4NTExYiwgMHg1MGU4LCAweDUwYjUsIDB4NTA4MiwgMHg1MDUwLAotICAweDUwMWQsIDB4NGZlYiwgMHg0ZmJhLCAweDRmODgsIDB4NGY1NywgMHg0ZjI2LCAweDRlZjUsIDB4NGVjNCwKLSAgMHg0ZTk0LCAweDRlNjQsIDB4NGUzNCwgMHg0ZTA0LCAweDRkZDUsIDB4NGRhNiwgMHg0ZDc3LCAweDRkNDgsCi0gIDB4NGQxOSwgMHg0Y2ViLCAweDRjYmQsIDB4NGM4ZiwgMHg0YzYxLCAweDRjMzQsIDB4NGMwNywgMHg0YmQ5LAotICAweDRiYWQsIDB4NGI4MCwgMHg0YjU0LCAweDRiMjcsIDB4NGFmYiwgMHg0YWNmLCAweDRhYTQsIDB4NGE3OCwKLSAgMHg0YTRkLCAweDRhMjIsIDB4NDlmNywgMHg0OWNkLCAweDQ5YTIsIDB4NDk3OCwgMHg0OTRlLCAweDQ5MjQsCi0gIDB4NDhmYSwgMHg0OGQxLCAweDQ4YTcsIDB4NDg3ZSwgMHg0ODU1LCAweDQ4MmQsIDB4NDgwNCwgMHg0N2RjLAotICAweDQ3YjMsIDB4NDc4YiwgMHg0NzYzLCAweDQ3M2MsIDB4NDcxNCwgMHg0NmVkLCAweDQ2YzUsIDB4NDY5ZSwKLSAgMHg0Njc3LCAweDQ2NTEsIDB4NDYyYSwgMHg0NjA0LCAweDQ1ZGUsIDB4NDViOCwgMHg0NTkyLCAweDQ1NmMsCi0gIDB4NDU0NiwgMHg0NTIxLCAweDQ0ZmMsIDB4NDRkNywgMHg0NGIyLCAweDQ0OGQsIDB4NDQ2OCwgMHg0NDQ0LAotICAweDQ0MWYsIDB4NDNmYiwgMHg0M2Q3LCAweDQzYjMsIDB4NDM5MCwgMHg0MzZjLCAweDQzNDksIDB4NDMyNSwKLSAgMHg0MzAyLCAweDQyZGYsIDB4NDJiYywgMHg0Mjk5LCAweDQyNzcsIDB4NDI1NCwgMHg0MjMyLCAweDQyMTAsCi0gIDB4NDFlZSwgMHg0MWNjLCAweDQxYWEsIDB4NDE4OSwgMHg0MTY3LCAweDQxNDYsIDB4NDEyNSwgMHg0MTA0LAotICAweDQwZTMsIDB4NDBjMiwgMHg0MGExLCAweDQwODEsIDB4NDA2MCwgMHg0MDQwLCAweDQwMjAsIDB4NDAwMAotfTsKLQorY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfaW52VGFibGVbSU5WX1RBQkxFX1NJWkVdID0geworICAgIDB4N2Y4MCwgMHg3ZjAxLCAweDdlODMsIDB4N2UwNywgMHg3ZDhiLCAweDdkMTEsIDB4N2M5NywgMHg3YzFlLCAweDdiYTYsCisgICAgMHg3YjJmLCAweDdhYjksIDB4N2E0NCwgMHg3OWNmLCAweDc5NWMsIDB4NzhlOSwgMHg3ODc4LCAweDc4MDcsIDB4Nzc5NiwKKyAgICAweDc3MjcsIDB4NzZiOSwgMHg3NjRiLCAweDc1ZGUsIDB4NzU3MiwgMHg3NTA2LCAweDc0OWMsIDB4NzQzMiwgMHg3M2M5LAorICAgIDB4NzM2MCwgMHg3MmY5LCAweDcyOTIsIDB4NzIyYywgMHg3MWM2LCAweDcxNjEsIDB4NzBmZCwgMHg3MDlhLCAweDcwMzcsCisgICAgMHg2ZmQ1LCAweDZmNzQsIDB4NmYxMywgMHg2ZWIzLCAweDZlNTQsIDB4NmRmNSwgMHg2ZDk3LCAweDZkMzksIDB4NmNkYywKKyAgICAweDZjODAsIDB4NmMyNCwgMHg2YmM5LCAweDZiNmYsIDB4NmIxNSwgMHg2YWJjLCAweDZhNjMsIDB4NmEwYiwgMHg2OWIzLAorICAgIDB4Njk1YywgMHg2OTA2LCAweDY4YjAsIDB4Njg1YSwgMHg2ODA2LCAweDY3YjEsIDB4Njc1ZSwgMHg2NzBhLCAweDY2YjgsCisgICAgMHg2NjY2LCAweDY2MTQsIDB4NjVjMywgMHg2NTcyLCAweDY1MjIsIDB4NjRkMiwgMHg2NDgzLCAweDY0MzQsIDB4NjNlNiwKKyAgICAweDYzOTksIDB4NjM0YiwgMHg2MmZlLCAweDYyYjIsIDB4NjI2NiwgMHg2MjFiLCAweDYxZDAsIDB4NjE4NSwgMHg2MTNiLAorICAgIDB4NjBmMiwgMHg2MGE4LCAweDYwNjAsIDB4NjAxNywgMHg1ZmNmLCAweDVmODgsIDB4NWY0MSwgMHg1ZWZhLCAweDVlYjQsCisgICAgMHg1ZTZlLCAweDVlMjgsIDB4NWRlMywgMHg1ZDlmLCAweDVkNWEsIDB4NWQxNywgMHg1Y2QzLCAweDVjOTAsIDB4NWM0ZCwKKyAgICAweDVjMGIsIDB4NWJjOSwgMHg1Yjg3LCAweDViNDYsIDB4NWIwNSwgMHg1YWM0LCAweDVhODQsIDB4NWE0NCwgMHg1YTA1LAorICAgIDB4NTljNiwgMHg1OTg3LCAweDU5NDksIDB4NTkwYSwgMHg1OGNkLCAweDU4OGYsIDB4NTg1MiwgMHg1ODE1LCAweDU3ZDksCisgICAgMHg1NzlkLCAweDU3NjEsIDB4NTcyNSwgMHg1NmVhLCAweDU2YWYsIDB4NTY3NSwgMHg1NjNiLCAweDU2MDEsIDB4NTVjNywKKyAgICAweDU1OGUsIDB4NTU1NSwgMHg1NTFjLCAweDU0ZTMsIDB4NTRhYiwgMHg1NDczLCAweDU0M2MsIDB4NTQwNSwgMHg1M2NlLAorICAgIDB4NTM5NywgMHg1MzYwLCAweDUzMmEsIDB4NTJmNCwgMHg1MmJmLCAweDUyODksIDB4NTI1NCwgMHg1MjFmLCAweDUxZWIsCisgICAgMHg1MWI3LCAweDUxODMsIDB4NTE0ZiwgMHg1MTFiLCAweDUwZTgsIDB4NTBiNSwgMHg1MDgyLCAweDUwNTAsIDB4NTAxZCwKKyAgICAweDRmZWIsIDB4NGZiYSwgMHg0Zjg4LCAweDRmNTcsIDB4NGYyNiwgMHg0ZWY1LCAweDRlYzQsIDB4NGU5NCwgMHg0ZTY0LAorICAgIDB4NGUzNCwgMHg0ZTA0LCAweDRkZDUsIDB4NGRhNiwgMHg0ZDc3LCAweDRkNDgsIDB4NGQxOSwgMHg0Y2ViLCAweDRjYmQsCisgICAgMHg0YzhmLCAweDRjNjEsIDB4NGMzNCwgMHg0YzA3LCAweDRiZDksIDB4NGJhZCwgMHg0YjgwLCAweDRiNTQsIDB4NGIyNywKKyAgICAweDRhZmIsIDB4NGFjZiwgMHg0YWE0LCAweDRhNzgsIDB4NGE0ZCwgMHg0YTIyLCAweDQ5ZjcsIDB4NDljZCwgMHg0OWEyLAorICAgIDB4NDk3OCwgMHg0OTRlLCAweDQ5MjQsIDB4NDhmYSwgMHg0OGQxLCAweDQ4YTcsIDB4NDg3ZSwgMHg0ODU1LCAweDQ4MmQsCisgICAgMHg0ODA0LCAweDQ3ZGMsIDB4NDdiMywgMHg0NzhiLCAweDQ3NjMsIDB4NDczYywgMHg0NzE0LCAweDQ2ZWQsIDB4NDZjNSwKKyAgICAweDQ2OWUsIDB4NDY3NywgMHg0NjUxLCAweDQ2MmEsIDB4NDYwNCwgMHg0NWRlLCAweDQ1YjgsIDB4NDU5MiwgMHg0NTZjLAorICAgIDB4NDU0NiwgMHg0NTIxLCAweDQ0ZmMsIDB4NDRkNywgMHg0NGIyLCAweDQ0OGQsIDB4NDQ2OCwgMHg0NDQ0LCAweDQ0MWYsCisgICAgMHg0M2ZiLCAweDQzZDcsIDB4NDNiMywgMHg0MzkwLCAweDQzNmMsIDB4NDM0OSwgMHg0MzI1LCAweDQzMDIsIDB4NDJkZiwKKyAgICAweDQyYmMsIDB4NDI5OSwgMHg0Mjc3LCAweDQyNTQsIDB4NDIzMiwgMHg0MjEwLCAweDQxZWUsIDB4NDFjYywgMHg0MWFhLAorICAgIDB4NDE4OSwgMHg0MTY3LCAweDQxNDYsIDB4NDEyNSwgMHg0MTA0LCAweDQwZTMsIDB4NDBjMiwgMHg0MGExLCAweDQwODEsCisgICAgMHg0MDYwLCAweDQwNDAsIDB4NDAyMCwgMHg0MDAwfTsKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyX3JvbS5oIGIvbGliU0JSZGVjL3NyYy9zYnJfcm9tLmgKaW5kZXggMWY4MDBiYy4uMDM5NzQzYyAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJfcm9tLmgKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJfcm9tLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNjggKzkwLDgwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiBcZmlsZQogXGJyaWVmIERlY2xhcmF0aW9uIG9mIGNvbnN0YW50IHRhYmxlcwotCiAqLwotI2lmbmRlZiBfX3JvbV9ICi0jZGVmaW5lIF9fcm9tX0gKKyNpZm5kZWYgU0JSX1JPTV9ICisjZGVmaW5lIFNCUl9ST01fSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogI2luY2x1ZGUgImVudl9leHRyLmgiCiAjaW5jbHVkZSAicW1mLmgiCiAKLSNkZWZpbmUgSU5WX0lOVF9UQUJMRV9TSVpFICAgICAgNDkKLSNkZWZpbmUgU0JSX05GX05PX1JBTkRPTV9WQUwgIDUxMiAgIC8qITwgU2l6ZSBvZiByYW5kb20gbnVtYmVyIGFycmF5IGZvciBub2lzZSBmbG9vciAqLworI2RlZmluZSBJTlZfSU5UX1RBQkxFX1NJWkUgNDkKKyNkZWZpbmUgU0JSX05GX05PX1JBTkRPTV9WQUwgXAorICA1MTIgLyohPCBTaXplIG9mIHJhbmRvbSBudW1iZXIgYXJyYXkgZm9yIG5vaXNlIGZsb29yICovCiAKIC8qCiAgIEZyZXF1ZW5jeSBzY2FsZXMKICovCi1leHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMTZbMTZdOwotZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzIyWzE2XTsKLWV4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8yNFsxNl07Ci1leHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMzJbMTZdOwotZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQwWzE2XTsKLWV4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80NFsxNl07Ci1leHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDhbMTZdOwotZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzY0WzE2XTsKLWV4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV84OFsxNl07CisKKy8qIGlmIGRlZmluZWQoU0JSREVDX1JBVElPXzE2XzY0X0VOQUJMRSkgKCg0KSA9IDQpIGVsc2UgKCg0KSA9IDIpICovCitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMTZbKDQpIC8gMl1bMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzIyWyg0KSAvIDJdWzE2XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8yNFsoNCkgLyAyXVsxNl07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMzJbKDQpIC8gMl1bMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQwWyg0KSAvIDJdWzE2XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80NFsoNCkgLyAyXVsxNl07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDhbKDQpIC8gMl1bMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzY0Wyg0KSAvIDJdWzE2XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV84OFsoNCkgLyAyXVsxNl07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMTkyWzE2XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xNzZbMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzEyOFsxNl07CiAKIC8qCiAgIExvdy1Qb3dlci1Qcm9maWxlIFRyYW5zcG9zZXIKICovCi0jZGVmaW5lIE5VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTICA5Ci1leHRlcm4gY29uc3QgVVNIT1JUIEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNJbmRleFtOVU1fV0hGQUNUT1JfVEFCTEVfRU5UUklFU107Ci1leHRlcm4gY29uc3QgRklYUF9EQkwgRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW05VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTXVs2XTsKLQotCisjZGVmaW5lIE5VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTIDkKK2V4dGVybiBjb25zdCBVU0hPUlQKKyAgICBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzSW5kZXhbTlVNX1dIRkFDVE9SX1RBQkxFX0VOVFJJRVNdOworZXh0ZXJuIGNvbnN0IEZJWFBfREJMCisgICAgRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW05VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTXVs2XTsKIAogLyoKICAgRW52ZWxvcGUgQWRqdXN0b3IKICovCiBleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX21bNF07Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX2VbNF07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX2VbNF07CitleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zUHZjX21bNF07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zUHZjX2VbNF07CiBleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRbNF07CiBleHRlcm4gY29uc3QgRklYUF9EQkwgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRfREJMWzRdOwogZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX3Nicl9zbW9vdGhGaWx0ZXJbNF07CiBleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW1NCUl9ORl9OT19SQU5ET01fVkFMXVsyXTsKLWV4dGVybiBjb25zdCBGSVhQX1NHTCBoYXJtb25pY1BoYXNlWCBbMl1bNF07CiAKIC8qCiAgIEVudmVsb3BlIEV4dHJhY3RvcgogKi8KLWV4dGVybiBjb25zdCBpbnQgRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV84ICBbOF1bNV07Ci1leHRlcm4gY29uc3QgaW50IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfMTUgWzE1XVs2XTsKLWV4dGVybiBjb25zdCBpbnQgRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV8xNiBbMTZdWzZdOwotCitleHRlcm4gY29uc3QgaW50IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfOFs4XVs1XTsKK2V4dGVybiBjb25zdCBpbnQgRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV8xNVsxNV1bNl07CitleHRlcm4gY29uc3QgaW50IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfMTZbMTZdWzZdOwogZXh0ZXJuIGNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8xXzE1OwogZXh0ZXJuIGNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8yXzE1OwogZXh0ZXJuIGNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm80XzE1OwogZXh0ZXJuIGNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm84XzE1OwotCiBleHRlcm4gY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzFfMTY7CiBleHRlcm4gY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzJfMTY7CiBleHRlcm4gY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzRfMTY7CkBAIC0xNTcsMTQgKzE4MCwxMCBAQAogZXh0ZXJuIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19Ob2lzZUxldmVsMTFUWzYyXVsyXTsKIGV4dGVybiBjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfTm9pc2VCYWxhbmNlMTFUWzI0XVsyXTsKIAotCiAvKgogIFBhcmFtZXRyaWMgc3RlcmVvCiAqLwogCi0KLWV4dGVybiBjb25zdCBGSVhQX0RCTCBkZWNheVNjYWxlRmFjdFRhYmxlW05PX1FNRl9DSEFOTkVMU107Ci0KIC8qIEZJWF9CT1JERVIgY2FuIGhhdmUgMCwgMSwgMiwgNCBlbnZlbG9wcyAqLwogZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX2FGaXhOb0VudkRlY29kZVs0XTsKIApAQCAtMTg0LDUyICsyMDMsMTQgQEAKIGV4dGVybiBjb25zdCBGSVhQX0RCTCBTY2FsZUZhY3RvcnNGaW5lW05PX0lJRF9MRVZFTFNfRklORV07CiBleHRlcm4gY29uc3QgRklYUF9EQkwgQWxwaGFzW05PX0lDQ19MRVZFTFNdOwogCi0jaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQotZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGFBbGxwYXNzTGlua0RlY2F5U2VyW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsKLWV4dGVybiBjb25zdCBGSVhQX1NHTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclJlUW1mW05PX1FNRl9DSEFOTkVMU107Ci1leHRlcm4gY29uc3QgRklYUF9TR0wgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JJbVFtZltOT19RTUZfQ0hBTk5FTFNdOwotZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yUmVTdWJRbWYyMFtOT19TVUJfUU1GX0NIQU5ORUxTXTsKLWV4dGVybiBjb25zdCBGSVhQX1NHTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvckltU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU107Ci0KLWV4dGVybiBjb25zdCBGSVhQX1NHTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlclJlUW1mW05PX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOwotZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VySW1RbWZbTk9fUU1GX0NIQU5ORUxTXVtOT19TRVJJQUxfQUxMUEFTU19MSU5LU107Ci1leHRlcm4gY29uc3QgRklYUF9TR0wgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJSZVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsKLWV4dGVybiBjb25zdCBGSVhQX1NHTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlckltU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOwotCi1leHRlcm4gY29uc3QgRklYUF9TR0wgcDhfMTNfMjBbMTNdOwotZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIHAyXzEzXzIwWzEzXTsKLQotI2Vsc2UKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBhQWxscGFzc0xpbmtEZWNheVNlcltOT19TRVJJQUxfQUxMUEFTU19MSU5LU107Ci1leHRlcm4gY29uc3QgRklYUF9EQkwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JSZVFtZltOT19RTUZfQ0hBTk5FTFNdOwotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9ySW1RbWZbTk9fUU1GX0NIQU5ORUxTXTsKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclJlU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU107Ci1leHRlcm4gY29uc3QgRklYUF9EQkwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JJbVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdOwotCi1leHRlcm4gY29uc3QgRklYUF9EQkwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJSZVFtZltOT19RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlckltUW1mW05PX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOwotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VyUmVTdWJRbWYyMFtOT19TVUJfUU1GX0NIQU5ORUxTXVtOT19TRVJJQUxfQUxMUEFTU19MSU5LU107Ci1leHRlcm4gY29uc3QgRklYUF9EQkwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJJbVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsKLQotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIHA4XzEzXzIwWzEzXTsKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBwMl8xM18yMFsxM107Ci0jZW5kaWYKLQotZXh0ZXJuIGNvbnN0IFVDSEFSIGFBbGxwYXNzTGlua0RlbGF5U2VyWzNdOwotZXh0ZXJuIGNvbnN0IFVDSEFSIGRlbGF5SW5kZXhRbWZbTk9fUU1GX0NIQU5ORUxTXTsKLWV4dGVybiBjb25zdCBVQ0hBUiBncm91cEJvcmRlcnMyMFtOT19JSURfR1JPVVBTICsgMV07Ci1leHRlcm4gY29uc3QgVUNIQVIgZ3JvdXBCb3JkZXJzMzRbTk9fSUlEX0dST1VQU19ISV9SRVMgKyAxXTsKIGV4dGVybiBjb25zdCBVQ0hBUiBiaW5zMmdyb3VwTWFwMjBbTk9fSUlEX0dST1VQU107Ci1leHRlcm4gY29uc3QgVUNIQVIgcXVhbnRpemVkSUlEc1tOT19JSURfU1RFUFNdOwotZXh0ZXJuIGNvbnN0IFVDSEFSIHF1YW50aXplZElJRHNGaW5lW05PX0lJRF9TVEVQU19GSU5FXTsKIGV4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9hTm9JaWRCaW5zWzNdOwogZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX2FOb0ljY0JpbnNbM107CiAKLQogLyogTG9va3VwIHRhYmxlcyBmb3Igc29tZSBhcml0aG1ldGljIGZ1bmN0aW9ucyAqLwogCiAjZGVmaW5lIElOVl9UQUJMRV9CSVRTIDgKLSNkZWZpbmUgSU5WX1RBQkxFX1NJWkUgKDE8PElOVl9UQUJMRV9CSVRTKQorI2RlZmluZSBJTlZfVEFCTEVfU0laRSAoMSA8PCBJTlZfVEFCTEVfQklUUykKIGV4dGVybiBjb25zdCBGSVhQX1NHTCBGREtfc2JyRGVjb2Rlcl9pbnZUYWJsZVtJTlZfVEFCTEVfU0laRV07CiAKLSNlbmRpZiAvLyBfX3JvbV9ICisjZW5kaWYgIC8vIFNCUl9ST01fSApkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJfc2NhbGUuaCBiL2xpYlNCUmRlYy9zcmMvc2JyX3NjYWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmY2NkNzEuLjAwMDAwMDAKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJfc2NhbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyohCi1cZmlsZQotXGJyaWVmIFNiciBzY2FsaW5nIGZhY3RvcnMsICAKLVRvIGRlYWwgd2l0aCB0aGUgZHluYW1pYyByYW5nZSBpbiB0aGUgZGlmZmVyZW50IHByb2Nlc3Npbmcgc3RhZ2VzLCBhCi1maXhlZCBwb2ludCBzcGVjaWZpYyBjb2RlIGhhcyB0byByZWx5IG9uIHNjYWxpbmcgZmFjdG9ycy4gQSBmbG9hdGluZwotcG9pbnQgY29kZSBjYXJyaWVzIGEgc2NhbGluZyBmYWN0b3IgLS0gdGhlIGV4cG9uZW50IC0tIGZvciBlYWNoIHZhbHVlLAotc28gc2NhbGluZyBpcyBub3QgbmVjZXNzYXJ5IHRoZXJlLgotCi1UaGUgb3V0cHV0IG9mIHRoZSBjb3JlIGRlY29kZXIgKGxvdyBiYW5kKSBpcyBzY2FsZWQgdXAgdG8gY292ZXIgYXMgbXVjaAotYXMgcG9zc2libGUgYml0cyBmb3IgZWFjaCB2YWx1ZS4gQXMgaGlnaCBiYW5kIGFuZCBsb3cgYmFuZCBhcmUgcHJvY2Vzc2VkCi1pbiBkaWZmZXJlbnQgYWxnb3JpdGhtIHNlY3Rpb25zLCB0aGV5IHJlcXVpcmUgdGhlaXIgb3duIHNjYWxpbmcKLWZhY3RvcnMuIEluIGFkZGl0aW9uLCBhbnkgc3RhdGljIGJ1ZmZlcnMsIGUuZy4gZmlsdGVyIHN0YXRlcywgcmVxdWlyZSBhCi1zZXBhcmF0ZSBzY2FsaW5nIGZhY3RvciBhcyB3ZWxsLiBUaGUgY29kZSB0YWtlcyBjYXJlIHRvIGRvIHRoZSBwcm9wZXIKLWFkanVzdG1lbnQsIGlmIHNjYWxpbmcgZmFjdG9ycyBvZiBhIGZpbHRlciBzdGF0ZSBhbmQgdGhlIHRpbWUgc2lnbmFsIGRpZmZlci4KLQotXHNhICNRTUZfU0NBTEVfRkFDVE9SLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldwotKi8KLQotI2lmbmRlZiBfX1NCUl9TQ0FMRV9ICi0jZGVmaW5lIF9fU0JSX1NDQUxFX0gKLQotLyohCi1cdmVyYmF0aW0KLSAgc2NhbGU6Ci0gICAgMCAgICAgICAgICAgICBsZWZ0IGFsaWduZWQgZS5nLiB8bWF4fCA+PTAuNQotICAgIEZSQUNUX0JJVFMtMSAgemVybyBlLmcgfG1heHwgPSAwCi1cZW5kdmVyYmF0aW0KLQotICBEeW5hbWljIHNjYWxpbmcgaXMgdXNlZCB0byBhY2hpZXZlIHN1ZmZpY2llbnQgYWNjdXJhY3kgZXZlbiB3aGVuIHRoZSBzaWduYWwKLSAgZW5lcmd5IGlzIGxvdy4gIFRoZSBkeW5hbWljIGZyYW1pbmcgb2YgU0JSIHByb2R1Y2VzIGEgdmFyaWFibGUgb3ZlcmxhcCBhcmVhCi0gIHdoZXJlIHNhbXBsZXMgZnJvbSB0aGUgcHJldmlvdXMgUU1GLUFuYWx5c2lzIGFyZSBzdG9yZWQuIERlcGVuZGluZyBvbiB0aGUKLSAgc3RhcnQgcG9zaXRpb24gYW5kIHN0b3AgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgU0JSIGVudmVsb3BlcywgdGhlIHByb2Nlc3NpbmcKLSAgYnVmZmVyIGNvbnNpc3RzIG9mIGRpZmZlcmVudGx5IHNjYWxlZCByZWdpb25zIGxpa2UgaWxsdXN0cmF0ZWQgaW4gdGhlIGJlbG93Ci0gIGZpZ3VyZS4KLQotICBcaW1hZ2UgaHRtbCBzY2FsZXMucG5nIFNjYWxlCi0qLwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJkZWNfZHJjLmNwcCBiL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2RyYy5jcHAKaW5kZXggYTgzNGMwYi4uMmQ3M2YzMiAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJkZWNfZHJjLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL3NicmRlY19kcmMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIzICs5MCwyOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCisKICAgIERlc2NyaXB0aW9uOiBEeW5hbWljIHJhbmdlIGNvbnRyb2wgKERSQykgZGVjb2RlciB0b29sIGZvciBTQlIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInNicmRlY19kcmMuaCIKIAotCi0vKiBEUkMgLSBPZmZzZXQgdGFibGUgZm9yIFFNRiBpbnRlcnBvbGF0aW9uLiAqLwotc3RhdGljIGNvbnN0IGludCBvZmZzZXRUYWJbMl1bMTZdID0KLXsKLSAgeyAwLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMjgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwgIC8qIDEwMjQgZnJhbWluZyAqLwotICB7IDAsIDQsIDgsIDEyLCAxNiwgMTksIDIyLCAyNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9ICAgLyogIDk2MCBmcmFtaW5nICovCisvKiBEUkMgLSBPZmZzZXQgdGFibGUgZm9yIFFNRiBpbnRlcnBvbGF0aW9uLiBTaGlmdGVkIGJ5IG9uZSBpbmRleCBwb3NpdGlvbi4KKyAgIFRoZSB0YWJsZSBkZWZpbmVzIHRoZSAoc2hvcnQpIHdpbmRvdyBib3JkZXJzIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgUU1GCisgICB0aW1lc2xvdC4gSXQgaGFzIHRoZSBzaXplIDE2IGJlY2F1c2UgaXQgaXMgYWNjZXNzZWQgd2l0aCB0aGUKKyAgIGRyY0ludGVycG9sYXRpb25TY2hlbWUgdGhhdCBpcyByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRoIDQgYml0LiAqLworc3RhdGljIGNvbnN0IFVDSEFSIHdpbkJvcmRlclRvQ29sTWFwcGluZ1RhYlsyXVsxNl0gPSB7CisgICAgLyotMSwgMCwgMSwgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCAqLworICAgIHswLCAwLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMjgsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyfSwgLyogMTAyNCBmcmFtaW5nICovCisgICAgezAsIDAsIDQsIDgsIDExLCAxNSwgMTksIDIzLCAyNiwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwKKyAgICAgMzB9IC8qICA5NjAgZnJhbWluZyAqLwogfTsKIAogLyohCkBAIC0xMDUsOSArMTIxLDcgQEAKIAogICBccmV0dXJuIG5vbmUKICovCi12b2lkIHNickRlY29kZXJfZHJjSW5pdENoYW5uZWwgKAotICAgIEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgIGhEcmNEYXRhICkKLXsKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbChIQU5ETEVfU0JSX0RSQ19DSEFOTkVMIGhEcmNEYXRhKSB7CiAgIGludCBiYW5kOwogCiAgIGlmIChoRHJjRGF0YSA9PSBOVUxMKSB7CkBAIC0xMzksNyArMTUzLDYgQEAKICAgaERyY0RhdGEtPmVuYWJsZSA9IDA7CiB9CiAKLQogLyohCiAgIFxicmllZiBTd2FwIERSQyBRTUYgc2NhbGluZyBmYWN0b3JzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGFwcGxpZWQuCiAKQEAgLTE0Nyw5ICsxNjAsNyBAQAogCiAgIFxyZXR1cm4gbm9uZQogKi8KLXZvaWQgc2JyRGVjb2Rlcl9kcmNVcGRhdGVDaGFubmVsICgKLSAgICBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMICBoRHJjRGF0YSApCi17Cit2b2lkIHNickRlY29kZXJfZHJjVXBkYXRlQ2hhbm5lbChIQU5ETEVfU0JSX0RSQ19DSEFOTkVMIGhEcmNEYXRhKSB7CiAgIGlmIChoRHJjRGF0YSA9PSBOVUxMKSB7CiAgICAgcmV0dXJuOwogICB9CkBAIC0xNTgsMjQgKzE2OSwyMSBAQAogICB9CiAKICAgLyogc3dhcCBwcmV2aW91cyBkYXRhICovCi0gIEZES21lbWNweSggaERyY0RhdGEtPmN1cnJGYWN0X21hZywKLSAgICAgICAgICAgICBoRHJjRGF0YS0+bmV4dEZhY3RfbWFnLAotICAgICAgICAgICAgIFNCUkRFQ19NQVhfRFJDX0JBTkRTICogc2l6ZW9mKEZJWFBfREJMKSApOworICBGREttZW1jcHkoaERyY0RhdGEtPmN1cnJGYWN0X21hZywgaERyY0RhdGEtPm5leHRGYWN0X21hZywKKyAgICAgICAgICAgIFNCUkRFQ19NQVhfRFJDX0JBTkRTICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKICAgaERyY0RhdGEtPmN1cnJGYWN0X2V4cCA9IGhEcmNEYXRhLT5uZXh0RmFjdF9leHA7CiAKICAgaERyY0RhdGEtPm51bUJhbmRzQ3VyciA9IGhEcmNEYXRhLT5udW1CYW5kc05leHQ7CiAKLSAgRkRLbWVtY3B5KCBoRHJjRGF0YS0+YmFuZFRvcEN1cnIsCi0gICAgICAgICAgICAgaERyY0RhdGEtPmJhbmRUb3BOZXh0LAotICAgICAgICAgICAgIFNCUkRFQ19NQVhfRFJDX0JBTkRTICogc2l6ZW9mKFVTSE9SVCkgKTsKKyAgRkRLbWVtY3B5KGhEcmNEYXRhLT5iYW5kVG9wQ3VyciwgaERyY0RhdGEtPmJhbmRUb3BOZXh0LAorICAgICAgICAgICAgU0JSREVDX01BWF9EUkNfQkFORFMgKiBzaXplb2YoVVNIT1JUKSk7CiAKICAgaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVDdXJyID0gaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0OwogCiAgIGhEcmNEYXRhLT53aW5TZXF1ZW5jZUN1cnIgPSBoRHJjRGF0YS0+d2luU2VxdWVuY2VOZXh0OwogfQogCi0KIC8qIQogICBcYnJpZWYgQXBwbHkgRFJDIGZhY3RvcnMgc2xvdCBiYXNlZC4KIApAQCAtMTg4LDIwICsxOTYsMTUgQEAKIAogICBccmV0dXJuIE5vbmUuCiAqLwotdm9pZCBzYnJEZWNvZGVyX2RyY0FwcGx5U2xvdCAoCi0gICAgSEFORExFX1NCUl9EUkNfQ0hBTk5FTCAgaERyY0RhdGEsCi0gICAgRklYUF9EQkwgICAqcW1mUmVhbFNsb3QsCi0gICAgRklYUF9EQkwgICAqcW1mSW1hZ1Nsb3QsCi0gICAgaW50ICBjb2wsCi0gICAgaW50ICBudW1RbWZTdWJTYW1wbGVzLAotICAgIGludCAgbWF4U2hpZnQKLSAgKQotewotICBjb25zdCBpbnQgKm9mZnNldDsKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNBcHBseVNsb3QoSEFORExFX1NCUl9EUkNfQ0hBTk5FTCBoRHJjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnFtZlJlYWxTbG90LCBGSVhQX0RCTCAqcW1mSW1hZ1Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2wsIGludCBudW1RbWZTdWJTYW1wbGVzLCBpbnQgbWF4U2hpZnQpIHsKKyAgY29uc3QgVUNIQVIgKndpbkJvcmRlclRvQ29sTWFwOwogCiAgIGludCBiYW5kLCBib3R0b21NZGN0LCB0b3BNZGN0LCBiaW4sIHVzZUxQOwotICBpbnQgaW5keCA9IG51bVFtZlN1YlNhbXBsZXMgLSAobnVtUW1mU3ViU2FtcGxlcyA+PiAxKSAtIDEwOyAgIC8qIGxfYm9yZGVyICovCisgIGludCBpbmR4ID0gbnVtUW1mU3ViU2FtcGxlcyAtIChudW1RbWZTdWJTYW1wbGVzID4+IDEpIC0gMTA7IC8qIGxfYm9yZGVyICovCiAgIGludCBmcmFtZUxlbkZsYWcgPSAobnVtUW1mU3ViU2FtcGxlcyA9PSAzMCkgPyAxIDogMDsKKyAgaW50IGZyYW1lU2l6ZSA9IChmcmFtZUxlbkZsYWcgPT0gMSkgPyA5NjAgOiAxMDI0OwogCiAgIGNvbnN0IEZJWFBfREJMICpmYWN0X21hZyA9IE5VTEw7CiAgIElOVCBmYWN0X2V4cCA9IDA7CkBAIC0yMTgsMzEgKzIyMSwyOCBAQAogICAgIHJldHVybjsKICAgfQogCi0gIG9mZnNldCA9IG9mZnNldFRhYltmcmFtZUxlbkZsYWddOworICB3aW5Cb3JkZXJUb0NvbE1hcCA9IHdpbkJvcmRlclRvQ29sTWFwcGluZ1RhYltmcmFtZUxlbkZsYWddOwogCiAgIHVzZUxQID0gKHFtZkltYWdTbG90ID09IE5VTEwpID8gMSA6IDA7CiAKICAgY29sICs9IGluZHg7CiAgIGJvdHRvbU1kY3QgPSAwOwotICBiaW4gPSAwOwogCiAgIC8qIGdldCByZXNwZWN0aXZlIGRhdGEgYW5kIGNhbGMgaW50ZXJwb2xhdGlvbiBmYWN0b3IgKi8KLSAgaWYgKGNvbCA8IChudW1RbWZTdWJTYW1wbGVzPj4xKSkgeyAgLyogZmlyc3QgaGFsZiBvZiBjdXJyZW50IGZyYW1lICovCisgIGlmIChjb2wgPCAobnVtUW1mU3ViU2FtcGxlcyA+PiAxKSkgeyAgICAvKiBmaXJzdCBoYWxmIG9mIGN1cnJlbnQgZnJhbWUgKi8KICAgICBpZiAoaERyY0RhdGEtPndpblNlcXVlbmNlQ3VyciAhPSAyKSB7IC8qIGxvbmcgd2luZG93ICovCi0gICAgICBpbnQgaiA9IGNvbCArIChudW1RbWZTdWJTYW1wbGVzPj4xKTsKKyAgICAgIGludCBqID0gY29sICsgKG51bVFtZlN1YlNhbXBsZXMgPj4gMSk7CiAKICAgICAgIGlmIChoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZUN1cnIgPT0gMCkgewotICAgICAgICBJTlQgayA9IChmcmFtZUxlbkZsYWcpID8gMHg0NDQ0NDQ0IDogMHg0MDAwMDAwOworICAgICAgICBJTlQgayA9IChmcmFtZUxlbkZsYWcpID8gMHg0NDQ0NDQ1IDogMHg0MDAwMDAwOwogCiAgICAgICAgIGFscGhhVmFsdWUgPSAoRklYUF9EQkwpKGogKiBrKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoaiA+PSBvZmZzZXRbaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVDdXJyIC0gMV0pIHsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChqID49IChpbnQpd2luQm9yZGVyVG9Db2xNYXBbaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVDdXJyXSkgewogICAgICAgICAgIGFscGhhVmFsdWUgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICAgICAgfQogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsgIC8qIHNob3J0IHdpbmRvd3MgKi8KKyAgICB9IGVsc2UgeyAvKiBzaG9ydCB3aW5kb3dzICovCiAgICAgICBzaG9ydERyYyA9IDE7CiAgICAgfQogCkBAIC0yNTAsMTggKzI1MCwxNiBAQAogICAgIGZhY3RfZXhwID0gaERyY0RhdGEtPmN1cnJGYWN0X2V4cDsKICAgICBudW1CYW5kcyA9IGhEcmNEYXRhLT5udW1CYW5kc0N1cnI7CiAgICAgYmFuZFRvcCA9IGhEcmNEYXRhLT5iYW5kVG9wQ3VycjsKLSAgfQotICBlbHNlIGlmIChjb2wgPCBudW1RbWZTdWJTYW1wbGVzKSB7ICAvKiBzZWNvbmQgaGFsZiBvZiBjdXJyZW50IGZyYW1lICovCisgIH0gZWxzZSBpZiAoY29sIDwgbnVtUW1mU3ViU2FtcGxlcykgeyAgICAvKiBzZWNvbmQgaGFsZiBvZiBjdXJyZW50IGZyYW1lICovCiAgICAgaWYgKGhEcmNEYXRhLT53aW5TZXF1ZW5jZU5leHQgIT0gMikgeyAvKiBuZXh0OiBsb25nIHdpbmRvdyAqLwotICAgICAgaW50IGogPSBjb2wgLSAobnVtUW1mU3ViU2FtcGxlcz4+MSk7CisgICAgICBpbnQgaiA9IGNvbCAtIChudW1RbWZTdWJTYW1wbGVzID4+IDEpOwogCiAgICAgICBpZiAoaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0ID09IDApIHsKLSAgICAgICAgSU5UIGsgPSAoZnJhbWVMZW5GbGFnKSA/IDB4NDQ0NDQ0NCA6IDB4NDAwMDAwMDsKKyAgICAgICAgSU5UIGsgPSAoZnJhbWVMZW5GbGFnKSA/IDB4NDQ0NDQ0NSA6IDB4NDAwMDAwMDsKIAogICAgICAgICBhbHBoYVZhbHVlID0gKEZJWFBfREJMKShqICogayk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKGogPj0gb2Zmc2V0W2hEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dCAtIDFdKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaiA+PSAoaW50KXdpbkJvcmRlclRvQ29sTWFwW2hEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dF0pIHsKICAgICAgICAgICBhbHBoYVZhbHVlID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTI3MCwxNyArMjY4LDE1IEBACiAgICAgICBmYWN0X2V4cCA9IGhEcmNEYXRhLT5uZXh0RmFjdF9leHA7CiAgICAgICBudW1CYW5kcyA9IGhEcmNEYXRhLT5udW1CYW5kc05leHQ7CiAgICAgICBiYW5kVG9wID0gaERyY0RhdGEtPmJhbmRUb3BOZXh0OwotICAgIH0KLSAgICBlbHNlIHsgIC8qIG5leHQ6IHNob3J0IHdpbmRvd3MgKi8KLSAgICAgIGlmIChoRHJjRGF0YS0+d2luU2VxdWVuY2VDdXJyICE9IDIpIHsgIC8qIGN1cnJlbnQ6IGxvbmcgd2luZG93ICovCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQ6IHNob3J0IHdpbmRvd3MgKi8KKyAgICAgIGlmIChoRHJjRGF0YS0+d2luU2VxdWVuY2VDdXJyICE9IDIpIHsgLyogY3VycmVudDogbG9uZyB3aW5kb3cgKi8KICAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTCkwOwogCiAgICAgICAgIGZhY3RfbWFnID0gaERyY0RhdGEtPm5leHRGYWN0X21hZzsKICAgICAgICAgZmFjdF9leHAgPSBoRHJjRGF0YS0+bmV4dEZhY3RfZXhwOwogICAgICAgICBudW1CYW5kcyA9IGhEcmNEYXRhLT5udW1CYW5kc05leHQ7CiAgICAgICAgIGJhbmRUb3AgPSBoRHJjRGF0YS0+YmFuZFRvcE5leHQ7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsgIC8qIGN1cnJlbnQ6IHNob3J0IHdpbmRvd3MgKi8KKyAgICAgIH0gZWxzZSB7IC8qIGN1cnJlbnQ6IHNob3J0IHdpbmRvd3MgKi8KICAgICAgICAgc2hvcnREcmMgPSAxOwogCiAgICAgICAgIGZhY3RfbWFnID0gaERyY0RhdGEtPmN1cnJGYWN0X21hZzsKQEAgLTI4OSwyMyArMjg1LDIwIEBACiAgICAgICAgIGJhbmRUb3AgPSBoRHJjRGF0YS0+YmFuZFRvcEN1cnI7CiAgICAgICB9CiAgICAgfQotICB9Ci0gIGVsc2UgeyAgLyogZmlyc3QgaGFsZiBvZiBuZXh0IGZyYW1lICovCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBoYWxmIG9mIG5leHQgZnJhbWUgKi8KICAgICBpZiAoaERyY0RhdGEtPndpblNlcXVlbmNlTmV4dCAhPSAyKSB7IC8qIGxvbmcgd2luZG93ICovCi0gICAgICBpbnQgaiA9IGNvbCAtIChudW1RbWZTdWJTYW1wbGVzPj4xKTsKKyAgICAgIGludCBqID0gY29sIC0gKG51bVFtZlN1YlNhbXBsZXMgPj4gMSk7CiAKICAgICAgIGlmIChoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHQgPT0gMCkgewotICAgICAgICBJTlQgayA9IChmcmFtZUxlbkZsYWcpID8gMHg0NDQ0NDQ0IDogMHg0MDAwMDAwOworICAgICAgICBJTlQgayA9IChmcmFtZUxlbkZsYWcpID8gMHg0NDQ0NDQ1IDogMHg0MDAwMDAwOwogCiAgICAgICAgIGFscGhhVmFsdWUgPSAoRklYUF9EQkwpKGogKiBrKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoaiA+PSBvZmZzZXRbaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0IC0gMV0pIHsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChqID49IChpbnQpd2luQm9yZGVyVG9Db2xNYXBbaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0XSkgewogICAgICAgICAgIGFscGhhVmFsdWUgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICAgICAgfQogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsgIC8qIHNob3J0IHdpbmRvd3MgKi8KKyAgICB9IGVsc2UgeyAvKiBzaG9ydCB3aW5kb3dzICovCiAgICAgICBzaG9ydERyYyA9IDE7CiAgICAgfQogCkBAIC0zMTcsMzcgKzMxMCwzMyBAQAogICAgIGNvbCAtPSBudW1RbWZTdWJTYW1wbGVzOwogICB9CiAKLQogICAvKiBwcm9jZXNzIGJhbmRzICovCiAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAoaW50KW51bUJhbmRzOyBiYW5kKyspIHsKICAgICBpbnQgYm90dG9tUW1mLCB0b3BRbWY7CiAKICAgICBGSVhQX0RCTCBkcmNGYWN0X21hZyA9IChGSVhQX0RCTClNQVhWQUxfREJMOwogCi0gICAgdG9wTWRjdCA9IChiYW5kVG9wW2JhbmRdKzEpIDw8IDI7CisgICAgdG9wTWRjdCA9IChiYW5kVG9wW2JhbmRdICsgMSkgPDwgMjsKIAotICAgIGlmICghc2hvcnREcmMpIHsgIC8qIGxvbmcgd2luZG93ICovCisgICAgaWYgKCFzaG9ydERyYykgeyAvKiBsb25nIHdpbmRvdyAqLwogICAgICAgaWYgKGZyYW1lTGVuRmxhZykgewogICAgICAgICAvKiA5NjAgZnJhbWluZyAqLwotICAgICAgICBib3R0b21NZGN0ID0gMzAgKiAoYm90dG9tTWRjdCAvIDMwKTsKLSAgICAgICAgdG9wTWRjdCAgICA9IDMwICogKHRvcE1kY3QgLyAzMCk7CisgICAgICAgIGJvdHRvbVFtZiA9IGZNdWx0SWZsb29yKChGSVhQX0RCTCkweDQ0NDQ0NDUsIGJvdHRvbU1kY3QpOworICAgICAgICB0b3BRbWYgPSBmTXVsdElmbG9vcigoRklYUF9EQkwpMHg0NDQ0NDQ1LCB0b3BNZGN0KTsKIAotICAgICAgICBib3R0b21RbWYgPSBmTXVsdElmbG9vcigoRklYUF9EQkwpMHg0NDQ0NDQ0LCBib3R0b21NZGN0KTsKLSAgICAgICAgdG9wUW1mICAgID0gZk11bHRJZmxvb3IoKEZJWFBfREJMKTB4NDQ0NDQ0NCwgdG9wTWRjdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgICAgdG9wTWRjdCA9IDMwICogdG9wUW1mOworICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogMTAyNCBmcmFtaW5nICovCi0gICAgICAgIGJvdHRvbU1kY3QgJj0gfjB4MWY7Ci0gICAgICAgIHRvcE1kY3QgICAgJj0gfjB4MWY7CisgICAgICAgIHRvcE1kY3QgJj0gfjB4MWY7CiAKICAgICAgICAgYm90dG9tUW1mID0gYm90dG9tTWRjdCA+PiA1OwotICAgICAgICB0b3BRbWYgICAgPSB0b3BNZGN0ID4+IDU7CisgICAgICAgIHRvcFFtZiA9IHRvcE1kY3QgPj4gNTsKICAgICAgIH0KIAotICAgICAgaWYgKGJhbmQgPT0gKChpbnQpbnVtQmFuZHMtMSkpIHsKKyAgICAgIGlmIChiYW5kID09ICgoaW50KW51bUJhbmRzIC0gMSkpIHsKICAgICAgICAgdG9wUW1mID0gKDY0KTsKICAgICAgIH0KLSAgICAKKwogICAgICAgZm9yIChiaW4gPSBib3R0b21RbWY7IGJpbiA8IHRvcFFtZjsgYmluKyspIHsKICAgICAgICAgRklYUF9EQkwgZHJjRmFjdDFfbWFnID0gaERyY0RhdGEtPnByZXZGYWN0X21hZ1tiaW5dOwogICAgICAgICBGSVhQX0RCTCBkcmNGYWN0Ml9tYWcgPSBmYWN0X21hZ1tiYW5kXTsKQEAgLTM2Niw3ICszNTUsOSBAQAogICAgICAgICB9IGVsc2UgaWYgKGFscGhhVmFsdWUgPT0gKEZJWFBfREJMKU1BWFZBTF9EQkwpIHsKICAgICAgICAgICBkcmNGYWN0X21hZyA9IGRyY0ZhY3QyX21hZzsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBkcmNGYWN0X21hZyA9IGZNdWx0KGFscGhhVmFsdWUsIGRyY0ZhY3QyX21hZykgKyBmTXVsdCgoKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBhbHBoYVZhbHVlKSwgZHJjRmFjdDFfbWFnKTsKKyAgICAgICAgICBkcmNGYWN0X21hZyA9CisgICAgICAgICAgICAgIGZNdWx0KGFscGhhVmFsdWUsIGRyY0ZhY3QyX21hZykgKworICAgICAgICAgICAgICBmTXVsdCgoKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBhbHBoYVZhbHVlKSwgZHJjRmFjdDFfbWFnKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIGFwcGx5IHNjYWxpbmcgKi8KQEAgLTM3Niw1MyArMzY3LDc4IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKiBzYXZlIHByZXZpb3VzIGZhY3RvcnMgKi8KLSAgICAgICAgaWYgKGNvbCA9PSAobnVtUW1mU3ViU2FtcGxlcz4+MSktMSkgeworICAgICAgICBpZiAoY29sID09IChudW1RbWZTdWJTYW1wbGVzID4+IDEpIC0gMSkgewogICAgICAgICAgIGhEcmNEYXRhLT5wcmV2RmFjdF9tYWdbYmluXSA9IGZhY3RfbWFnW2JhbmRdOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgeyAgLyogc2hvcnQgd2luZG93cyAqLwotICAgICAgaW50IHN0YXJ0U2FtcGxlLCBzdG9wU2FtcGxlOwotICAgICAgRklYUF9EQkwgaW52RnJhbWVTaXplRGl2OCA9IChmcmFtZUxlbkZsYWcpID8gKEZJWFBfREJMKTB4MTExMTExMSA6IChGSVhQX0RCTCkweDEwMDAwMDA7CisgICAgfSBlbHNlIHsgLyogc2hvcnQgd2luZG93cyAqLworICAgICAgdW5zaWduZWQgc3RhcnRXaW5JZHgsIHN0b3BXaW5JZHg7CisgICAgICBpbnQgc3RhcnRDb2wsIHN0b3BDb2w7CisgICAgICBGSVhQX0RCTCBpbnZGcmFtZVNpemVEaXY4ID0KKyAgICAgICAgICAoZnJhbWVMZW5GbGFnKSA/IChGSVhQX0RCTCkweDExMTExMTIgOiAoRklYUF9EQkwpMHgxMDAwMDAwOworCisgICAgICAvKiBsaW1pdCB0b3AgYXQgdGhlIGZyYW1lIGJvcmRlcnMgKi8KKyAgICAgIGlmICh0b3BNZGN0IDwgMCkgeworICAgICAgICB0b3BNZGN0ID0gMDsKKyAgICAgIH0KKyAgICAgIGlmICh0b3BNZGN0ID49IGZyYW1lU2l6ZSkgeworICAgICAgICB0b3BNZGN0ID0gZnJhbWVTaXplIC0gMTsKKyAgICAgIH0KIAogICAgICAgaWYgKGZyYW1lTGVuRmxhZykgewogICAgICAgICAvKiAgOTYwIGZyYW1pbmcgKi8KLSAgICAgICAgYm90dG9tTWRjdCA9IDMwLzggKiAoYm90dG9tTWRjdCo4LzMwKTsKLSAgICAgICAgdG9wTWRjdCAgICA9IDMwLzggKiAodG9wTWRjdCo4LzMwKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgICB0b3BNZGN0ID0gZk11bHRJZmxvb3IoKEZJWFBfREJMKTB4NzgwMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdElmbG9vcigoRklYUF9EQkwpMHgyMjIyMjIyMywgdG9wTWRjdCkgPDwgMik7CisKKyAgICAgICAgc3RhcnRXaW5JZHggPSBmTXVsdElmbG9vcihpbnZGcmFtZVNpemVEaXY4LCBib3R0b21NZGN0KSArCisgICAgICAgICAgICAgICAgICAgICAgMTsgLyogd2luQm9yZGVyVG9Db2xNYXAgdGFibGUgaGFzIG9mZnNldCBvZiAxICovCisgICAgICAgIHN0b3BXaW5JZHggPSBmTXVsdEljZWlsKGludkZyYW1lU2l6ZURpdjggLSAoRklYUF9EQkwpMSwgdG9wTWRjdCkgKyAxOworICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogMTAyNCBmcmFtaW5nICovCi0gICAgICAgIGJvdHRvbU1kY3QgJj0gfjB4MDM7Ci0gICAgICAgIHRvcE1kY3QgICAgJj0gfjB4MDM7CisgICAgICAgIHRvcE1kY3QgJj0gfjB4MDM7CisKKyAgICAgICAgc3RhcnRXaW5JZHggPSBmTXVsdElmbG9vcihpbnZGcmFtZVNpemVEaXY4LCBib3R0b21NZGN0KSArIDE7CisgICAgICAgIHN0b3BXaW5JZHggPSBmTXVsdEljZWlsKGludkZyYW1lU2l6ZURpdjgsIHRvcE1kY3QpICsgMTsKICAgICAgIH0KIAotICAgICAgLyogc3RhcnRTYW1wbGUgaXMgdHJ1bmNhdGVkIHRvIHRoZSBuZWFyZXN0IGNvcnJlc3BvbmRpbmcgc3RhcnQgc3Vic2FtcGxlIGluCisgICAgICAvKiBzdGFydENvbCBpcyB0cnVuY2F0ZWQgdG8gdGhlIG5lYXJlc3QgY29ycmVzcG9uZGluZyBzdGFydCBzdWJzYW1wbGUgaW4KICAgICAgICAgIHRoZSBRTUYgb2YgdGhlIHNob3J0IHdpbmRvdyBib3R0b20gaXMgcHJlc2VudCBpbjoqLwotICAgICAgc3RhcnRTYW1wbGUgID0gKChmTXVsdElmbG9vciggaW52RnJhbWVTaXplRGl2OCwgYm90dG9tTWRjdCApICYgMHg3KSAqIG51bVFtZlN1YlNhbXBsZXMpID4+IDM7CisgICAgICBzdGFydENvbCA9IChpbnQpd2luQm9yZGVyVG9Db2xNYXBbc3RhcnRXaW5JZHhdOwogCi0gICAgICAvKiBzdG9wU2FtcGxlIGlzIHJvdW5kZWQgdXB3YXJkcyB0byB0aGUgbmVhcmVzdCBjb3JyZXNwb25kaW5nIHN0b3Agc3Vic2FtcGxlCisgICAgICAvKiBzdG9wQ29sIGlzIHJvdW5kZWQgdXB3YXJkcyB0byB0aGUgbmVhcmVzdCBjb3JyZXNwb25kaW5nIHN0b3Agc3Vic2FtcGxlCiAgICAgICAgICBpbiB0aGUgUU1GIG9mIHRoZSBzaG9ydCB3aW5kb3cgdG9wIGlzIHByZXNlbnQgaW4uICovCi0gICAgICBzdG9wU2FtcGxlICA9ICgoZk11bHRJY2VpbCggaW52RnJhbWVTaXplRGl2OCwgdG9wTWRjdCApICYgMHhmKSAqIG51bVFtZlN1YlNhbXBsZXMpID4+IDM7CisgICAgICBzdG9wQ29sID0gKGludCl3aW5Cb3JkZXJUb0NvbE1hcFtzdG9wV2luSWR4XTsKIAotICAgICAgYm90dG9tUW1mID0gZk11bHRJZmxvb3IoIGludkZyYW1lU2l6ZURpdjgsICgoYm90dG9tTWRjdCUobnVtUW1mU3ViU2FtcGxlczw8MikpIDw8IDUpICk7Ci0gICAgICB0b3BRbWYgICAgPSBmTXVsdElmbG9vciggaW52RnJhbWVTaXplRGl2OCwgKCh0b3BNZGN0JShudW1RbWZTdWJTYW1wbGVzPDwyKSkgPDwgNSkgKTsKKyAgICAgIGJvdHRvbVFtZiA9IGZNdWx0SWZsb29yKGludkZyYW1lU2l6ZURpdjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJvdHRvbU1kY3QgJSAobnVtUW1mU3ViU2FtcGxlcyA8PCAyKSkgPDwgNSkpOworICAgICAgdG9wUW1mID0gZk11bHRJZmxvb3IoaW52RnJhbWVTaXplRGl2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgodG9wTWRjdCAlIChudW1RbWZTdWJTYW1wbGVzIDw8IDIpKSA8PCA1KSk7CiAKICAgICAgIC8qIGV4dGVuZCBsYXN0IGJhbmQgKi8KLSAgICAgIGlmIChiYW5kID09ICgoaW50KW51bUJhbmRzLTEpKSB7CisgICAgICBpZiAoYmFuZCA9PSAoKGludCludW1CYW5kcyAtIDEpKSB7CiAgICAgICAgIHRvcFFtZiA9ICg2NCk7Ci0gICAgICAgIHN0b3BTYW1wbGUgPSBudW1RbWZTdWJTYW1wbGVzOworICAgICAgICBzdG9wQ29sID0gbnVtUW1mU3ViU2FtcGxlczsKKyAgICAgICAgc3RvcFdpbklkeCA9IDEwOwogICAgICAgfQogCiAgICAgICBpZiAodG9wUW1mID09IDApIHsKKyAgICAgICAgaWYgKGZyYW1lTGVuRmxhZykgeworICAgICAgICAgIEZJWFBfREJMIHJlbSA9IGZNdWx0KGludkZyYW1lU2l6ZURpdjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSh0b3BNZGN0IDw8IChERlJBQ1RfQklUUyAtIDEyKSkpOworICAgICAgICAgIGlmICgoTE9ORylyZW0gJiAoTE9ORykweDFGKSB7CisgICAgICAgICAgICBzdG9wV2luSWR4IC09IDE7CisgICAgICAgICAgICBzdG9wQ29sID0gKGludCl3aW5Cb3JkZXJUb0NvbE1hcFtzdG9wV2luSWR4XTsKKyAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgdG9wUW1mID0gKDY0KTsKICAgICAgIH0KIAogICAgICAgLyogc2F2ZSBwcmV2aW91cyBmYWN0b3JzICovCi0gICAgICBpZiAoc3RvcFNhbXBsZSA9PSBudW1RbWZTdWJTYW1wbGVzKSB7CisgICAgICBpZiAoc3RvcENvbCA9PSBudW1RbWZTdWJTYW1wbGVzKSB7CiAgICAgICAgIGludCB0bXBCb3R0b20gPSBib3R0b21RbWY7CiAKLSAgICAgICAgaWYgKCgobnVtUW1mU3ViU2FtcGxlcy0xKSAmIH4weDAzKSA+IHN0YXJ0U2FtcGxlKSB7Ci0gICAgICAgICAgICB0bXBCb3R0b20gPSAwOyAgICAvKiBiYW5kIHN0YXJ0cyBpbiBwcmV2aW91cyBzaG9ydCB3aW5kb3cgKi8KKyAgICAgICAgaWYgKChpbnQpd2luQm9yZGVyVG9Db2xNYXBbOF0gPiBzdGFydENvbCkgeworICAgICAgICAgIHRtcEJvdHRvbSA9IDA7IC8qIGJhbmQgc3RhcnRzIGluIHByZXZpb3VzIHNob3J0IHdpbmRvdyAqLwogICAgICAgICB9CiAKICAgICAgICAgZm9yIChiaW4gPSB0bXBCb3R0b207IGJpbiA8IHRvcFFtZjsgYmluKyspIHsKQEAgLTQzMSwxMiArNDQ3LDEyIEBACiAgICAgICB9CiAKICAgICAgIC8qIGFwcGx5ICovCi0gICAgICBpZiAoKGNvbCA+PSBzdGFydFNhbXBsZSkgJiYgKGNvbCA8IHN0b3BTYW1wbGUpKSB7Ci0gICAgICAgIGlmICgoY29sICYgfjB4MDMpID4gc3RhcnRTYW1wbGUpIHsKLSAgICAgICAgICAgIGJvdHRvbVFtZiA9IDA7ICAgIC8qIGJhbmQgc3RhcnRzIGluIHByZXZpb3VzIHNob3J0IHdpbmRvdyAqLworICAgICAgaWYgKChjb2wgPj0gc3RhcnRDb2wpICYmIChjb2wgPCBzdG9wQ29sKSkgeworICAgICAgICBpZiAoY29sID49IChpbnQpd2luQm9yZGVyVG9Db2xNYXBbc3RhcnRXaW5JZHggKyAxXSkgeworICAgICAgICAgIGJvdHRvbVFtZiA9IDA7IC8qIGJhbmQgc3RhcnRzIGluIHByZXZpb3VzIHNob3J0IHdpbmRvdyAqLwogICAgICAgICB9Ci0gICAgICAgIGlmIChjb2wgPCAoKHN0b3BTYW1wbGUtMSkgJiB+MHgwMykpIHsKLSAgICAgICAgICAgIHRvcFFtZiA9ICg2NCk7ICAgLyogYmFuZCBlbmRzIGluIG5leHQgc2hvcnQgd2luZG93ICovCisgICAgICAgIGlmIChjb2wgPCAoaW50KXdpbkJvcmRlclRvQ29sTWFwW3N0b3BXaW5JZHggLSAxXSkgeworICAgICAgICAgIHRvcFFtZiA9ICg2NCk7IC8qIGJhbmQgZW5kcyBpbiBuZXh0IHNob3J0IHdpbmRvdyAqLwogICAgICAgICB9CiAKICAgICAgICAgZHJjRmFjdF9tYWcgPSBmYWN0X21hZ1tiYW5kXTsKQEAgLTQ1NywxNCArNDczLDEzIEBACiAgICAgfQogCiAgICAgYm90dG9tTWRjdCA9IHRvcE1kY3Q7Ci0gIH0gICAvKiBlbmQgb2YgYmFuZHMgbG9vcCAqLworICB9IC8qIGVuZCBvZiBiYW5kcyBsb29wICovCiAKLSAgaWYgKGNvbCA9PSAobnVtUW1mU3ViU2FtcGxlcz4+MSktMSkgeworICBpZiAoY29sID09IChudW1RbWZTdWJTYW1wbGVzID4+IDEpIC0gMSkgewogICAgIGhEcmNEYXRhLT5wcmV2RmFjdF9leHAgPSBmYWN0X2V4cDsKICAgfQogfQogCi0KIC8qIQogICBcYnJpZWYgQXBwbHkgRFJDIGZhY3RvcnMgZnJhbWUgYmFzZWQuCiAKQEAgLTQ3NiwxNCArNDkxLDkgQEAKIAogICBccmV0dXJuIE5vbmUuCiAqLwotdm9pZCBzYnJEZWNvZGVyX2RyY0FwcGx5ICgKLSAgICBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMICBoRHJjRGF0YSwKLSAgICBGSVhQX0RCTCAqKlFtZkJ1ZmZlclJlYWwsCi0gICAgRklYUF9EQkwgKipRbWZCdWZmZXJJbWFnLAotICAgIGludCAgbnVtUW1mU3ViU2FtcGxlcywKLSAgICBpbnQgKnNjYWxlRmFjdG9yCi0gICkKLXsKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNBcHBseShIQU5ETEVfU0JSX0RSQ19DSEFOTkVMIGhEcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUW1mQnVmZmVyUmVhbCwgRklYUF9EQkwgKipRbWZCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1RbWZTdWJTYW1wbGVzLCBpbnQgKnNjYWxlRmFjdG9yKSB7CiAgIGludCBjb2w7CiAgIGludCBtYXhTaGlmdCA9IDA7CiAKQEAgLTQ5MSw3ICs1MDEsOCBAQAogICAgIHJldHVybjsKICAgfQogICBpZiAoaERyY0RhdGEtPmVuYWJsZSA9PSAwKSB7Ci0gICAgcmV0dXJuOyAgLyogQXZvaWQgY2hhbmdpbmcgdGhlIHNjYWxlRmFjdG9yIGV2ZW4gdGhvdWdoIHRoZSBwcm9jZXNzaW5nIGlzIGRpc2FibGVkLiAqLworICAgIHJldHVybjsgLyogQXZvaWQgY2hhbmdpbmcgdGhlIHNjYWxlRmFjdG9yIGV2ZW4gdGhvdWdoIHRoZSBwcm9jZXNzaW5nIGlzCisgICAgICAgICAgICAgICBkaXNhYmxlZC4gKi8KICAgfQogCiAgIC8qIGdldCBtYXggc2NhbGUgZmFjdG9yICovCkBAIC01MDUsMjEgKzUxNiwxMyBAQAogICAgIG1heFNoaWZ0ID0gaERyY0RhdGEtPm5leHRGYWN0X2V4cDsKICAgfQogCi0gIGZvciAoY29sID0gMDsgY29sIDwgbnVtUW1mU3ViU2FtcGxlczsgY29sKyspCi0gIHsKKyAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1RbWZTdWJTYW1wbGVzOyBjb2wrKykgewogICAgIEZJWFBfREJMICpxbWZTbG90UmVhbCA9IFFtZkJ1ZmZlclJlYWxbY29sXTsKICAgICBGSVhQX0RCTCAqcW1mU2xvdEltYWcgPSAoUW1mQnVmZmVySW1hZyA9PSBOVUxMKSA/IE5VTEwgOiBRbWZCdWZmZXJJbWFnW2NvbF07CiAKLSAgICBzYnJEZWNvZGVyX2RyY0FwcGx5U2xvdCAoCi0gICAgICBoRHJjRGF0YSwKLSAgICAgIHFtZlNsb3RSZWFsLAotICAgICAgcW1mU2xvdEltYWcsCi0gICAgICBjb2wsCi0gICAgICBudW1RbWZTdWJTYW1wbGVzLAotICAgICAgbWF4U2hpZnQKLSAgICApOworICAgIHNickRlY29kZXJfZHJjQXBwbHlTbG90KGhEcmNEYXRhLCBxbWZTbG90UmVhbCwgcW1mU2xvdEltYWcsIGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1RbWZTdWJTYW1wbGVzLCBtYXhTaGlmdCk7CiAgIH0KIAogICAqc2NhbGVGYWN0b3IgKz0gbWF4U2hpZnQ7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2RyYy5oIGIvbGliU0JSZGVjL3NyYy9zYnJkZWNfZHJjLmgKaW5kZXggN2VlZDUzYS4uMmViMGUyMCAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJkZWNfZHJjLmgKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJkZWNfZHJjLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNzMgKzkwLDYwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKKwogICAgRGVzY3JpcHRpb246IER5bmFtaWMgcmFuZ2UgY29udHJvbCAoRFJDKSBkZWNvZGVyIHRvb2wgZm9yIFNCUgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9TQlJERUNfRFJDX0hfCi0jZGVmaW5lIF9TQlJERUNfRFJDX0hfCisjaWZuZGVmIFNCUkRFQ19EUkNfSAorI2RlZmluZSBTQlJERUNfRFJDX0gKIAogI2luY2x1ZGUgInNicmRlY29kZXIuaCIKIAorI2RlZmluZSBTQlJERUNfTUFYX0RSQ19DSEFOTkVMUyAoOCkKKyNkZWZpbmUgU0JSREVDX01BWF9EUkNfQkFORFMgKDE2KQogCi0KLSNkZWZpbmUgU0JSREVDX01BWF9EUkNfQ0hBTk5FTFMgICg4KQotI2RlZmluZSBTQlJERUNfTUFYX0RSQ19CQU5EUyAgICAgKCAxNiApCi0KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIEZJWFBfREJMIHByZXZGYWN0X21hZ1soNjQpXTsKLSAgSU5UICAgICAgcHJldkZhY3RfZXhwOworICBJTlQgcHJldkZhY3RfZXhwOwogCiAgIEZJWFBfREJMIGN1cnJGYWN0X21hZ1tTQlJERUNfTUFYX0RSQ19CQU5EU107CiAgIEZJWFBfREJMIG5leHRGYWN0X21hZ1tTQlJERUNfTUFYX0RSQ19CQU5EU107Ci0gIElOVCAgICAgIGN1cnJGYWN0X2V4cDsKLSAgSU5UICAgICAgbmV4dEZhY3RfZXhwOworICBJTlQgY3VyckZhY3RfZXhwOworICBJTlQgbmV4dEZhY3RfZXhwOwogCi0gIFVJTlQgICAgIG51bUJhbmRzQ3VycjsKLSAgVUlOVCAgICAgbnVtQmFuZHNOZXh0OwotICBVU0hPUlQgICBiYW5kVG9wQ3VycltTQlJERUNfTUFYX0RSQ19CQU5EU107Ci0gIFVTSE9SVCAgIGJhbmRUb3BOZXh0W1NCUkRFQ19NQVhfRFJDX0JBTkRTXTsKKyAgVUlOVCBudW1CYW5kc0N1cnI7CisgIFVJTlQgbnVtQmFuZHNOZXh0OworICBVU0hPUlQgYmFuZFRvcEN1cnJbU0JSREVDX01BWF9EUkNfQkFORFNdOworICBVU0hPUlQgYmFuZFRvcE5leHRbU0JSREVDX01BWF9EUkNfQkFORFNdOwogCi0gIFNIT1JUICAgIGRyY0ludGVycG9sYXRpb25TY2hlbWVDdXJyOwotICBTSE9SVCAgICBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dDsKKyAgU0hPUlQgZHJjSW50ZXJwb2xhdGlvblNjaGVtZUN1cnI7CisgIFNIT1JUIGRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0OwogCi0gIFNIT1JUICAgIGVuYWJsZTsKKyAgU0hPUlQgZW5hYmxlOwogCi0gIFVDSEFSICAgIHdpblNlcXVlbmNlQ3VycjsKLSAgVUNIQVIgICAgd2luU2VxdWVuY2VOZXh0OworICBVQ0hBUiB3aW5TZXF1ZW5jZUN1cnI7CisgIFVDSEFSIHdpblNlcXVlbmNlTmV4dDsKIAogfSBTQlJERUNfRFJDX0NIQU5ORUw7CiAKLXR5cGVkZWYgU0JSREVDX0RSQ19DSEFOTkVMICogSEFORExFX1NCUl9EUkNfQ0hBTk5FTDsKK3R5cGVkZWYgU0JSREVDX0RSQ19DSEFOTkVMICpIQU5ETEVfU0JSX0RSQ19DSEFOTkVMOwogCit2b2lkIHNickRlY29kZXJfZHJjSW5pdENoYW5uZWwoSEFORExFX1NCUl9EUkNfQ0hBTk5FTCBoRHJjRGF0YSk7CiAKLXZvaWQgc2JyRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbCAoCi0gICAgSEFORExFX1NCUl9EUkNfQ0hBTk5FTCAgaERyY0RhdGEgKTsKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNVcGRhdGVDaGFubmVsKEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgaERyY0RhdGEpOwogCi12b2lkIHNickRlY29kZXJfZHJjVXBkYXRlQ2hhbm5lbCAoCi0gICAgSEFORExFX1NCUl9EUkNfQ0hBTk5FTCAgaERyY0RhdGEgKTsKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNBcHBseVNsb3QoSEFORExFX1NCUl9EUkNfQ0hBTk5FTCBoRHJjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnFtZlJlYWxTbG90LCBGSVhQX0RCTCAqcW1mSW1hZ1Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2wsIGludCBudW1RbWZTdWJTYW1wbGVzLCBpbnQgbWF4U2hpZnQpOwogCi12b2lkIHNickRlY29kZXJfZHJjQXBwbHlTbG90ICgKLSAgICBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMICBoRHJjRGF0YSwKLSAgICBGSVhQX0RCTCAqcW1mUmVhbFNsb3QsCi0gICAgRklYUF9EQkwgKnFtZkltYWdTbG90LAotICAgIGludCAgY29sLAotICAgIGludCAgbnVtUW1mU3ViU2FtcGxlcywKLSAgICBpbnQgIG1heFNoaWZ0ICk7Cit2b2lkIHNickRlY29kZXJfZHJjQXBwbHkoSEFORExFX1NCUl9EUkNfQ0hBTk5FTCBoRHJjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlFtZkJ1ZmZlclJlYWwsIEZJWFBfREJMICoqUW1mQnVmZmVySW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtUW1mU3ViU2FtcGxlcywgaW50ICpzY2FsZUZhY3Rvcik7CiAKLXZvaWQgc2JyRGVjb2Rlcl9kcmNBcHBseSAoCi0gICAgSEFORExFX1NCUl9EUkNfQ0hBTk5FTCAgaERyY0RhdGEsCi0gICAgRklYUF9EQkwgKipRbWZCdWZmZXJSZWFsLAotICAgIEZJWFBfREJMICoqUW1mQnVmZmVySW1hZywKLSAgICBpbnQgIG51bVFtZlN1YlNhbXBsZXMsCi0gICAgaW50ICpzY2FsZUZhY3RvciApOwotCi0KLSNlbmRpZiAgLyogX1NCUkRFQ19EUkNfSF8gKi8KKyNlbmRpZiAvKiBTQlJERUNfRFJDX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2ZyZXFfc2NhLmNwcCBiL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2ZyZXFfc2NhLmNwcAppbmRleCA4YWRmYmIxLi4xNjVmOTRiIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3NicmRlY19mcmVxX3NjYS5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJkZWNfZnJlcV9zY2EuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDExICs5MCwxOSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIEZyZXF1ZW5jeSBzY2FsZSBjYWxjdWxhdGlvbiAgCisgIFxicmllZiAgRnJlcXVlbmN5IHNjYWxlIGNhbGN1bGF0aW9uCiAqLwogCiAjaW5jbHVkZSAic2JyZGVjX2ZyZXFfc2NhLmgiCkBAIC05MiwxOCArMTExLDE2IEBACiAjaW5jbHVkZSAic2JyX3JvbS5oIgogI2luY2x1ZGUgImVudl9leHRyLmgiCiAKLSNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIiAgICAgIC8qIG5lZWQgbG9nKCkgZm9yIGRlYnVnLWNvZGUgb25seSAqLworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiIC8qIG5lZWQgbG9nKCkgZm9yIGRlYnVnLWNvZGUgb25seSAqLwogCi0jZGVmaW5lIE1BWF9PQ1RBVkUgICAgICAgICAyOQotI2RlZmluZSBNQVhfU0VDT05EX1JFR0lPTiAgNTAKKyNkZWZpbmUgTUFYX09DVEFWRSAyOQorI2RlZmluZSBNQVhfU0VDT05EX1JFR0lPTiA1MAogCi0KLXN0YXRpYyBpbnQgIG51bWJlck9mQmFuZHMoRklYUF9TR0wgYnBvX2RpdjE2LCBpbnQgc3RhcnQsIGludCBzdG9wLCBpbnQgd2FycEZsYWcpOwotc3RhdGljIHZvaWQgQ2FsY0JhbmRzKFVDSEFSICogZGlmZiwgVUNIQVIgc3RhcnQsIFVDSEFSIHN0b3AsIFVDSEFSIG51bV9iYW5kcyk7Ci1zdGF0aWMgU0JSX0VSUk9SIG1vZGlmeUJhbmRzKFVDSEFSIG1heF9iYW5kLCBVQ0hBUiAqIGRpZmYsIFVDSEFSIGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBjdW1TdW0oVUNIQVIgc3RhcnRfdmFsdWUsIFVDSEFSKiBkaWZmLCBVQ0hBUiBsZW5ndGgsIFVDSEFSICpzdGFydF9hZHJlc3MpOwotCi0KK3N0YXRpYyBpbnQgbnVtYmVyT2ZCYW5kcyhGSVhQX1NHTCBicG9fZGl2MTYsIGludCBzdGFydCwgaW50IHN0b3AsIGludCB3YXJwRmxhZyk7CitzdGF0aWMgdm9pZCBDYWxjQmFuZHMoVUNIQVIgKmRpZmYsIFVDSEFSIHN0YXJ0LCBVQ0hBUiBzdG9wLCBVQ0hBUiBudW1fYmFuZHMpOworc3RhdGljIFNCUl9FUlJPUiBtb2RpZnlCYW5kcyhVQ0hBUiBtYXhfYmFuZCwgVUNIQVIgKmRpZmYsIFVDSEFSIGxlbmd0aCk7CitzdGF0aWMgdm9pZCBjdW1TdW0oVUNIQVIgc3RhcnRfdmFsdWUsIFVDSEFSICpkaWZmLCBVQ0hBUiBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgVUNIQVIgKnN0YXJ0X2FkcmVzcyk7CiAKIC8qIQogICBcYnJpZWYgICAgIFJldHJpZXZlIFFNRi1iYW5kIHdoZXJlIHRoZSBTQlIgcmFuZ2Ugc3RhcnRzCkBAIC0xMTMsNDEgKzEzMCw2MSBAQAogCiAgIFxyZXR1cm4gIE51bWJlciBvZiBzdGFydCBiYW5kCiAqLwotc3RhdGljIFVDSEFSCi1nZXRTdGFydEJhbmQoVUlOVCAgIGZzLCAgICAgICAgICAgICAgIC8qITwgT3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgICAgICAgICAgIFVDSEFSICBzdGFydEZyZXEsICAgICAgICAvKiE8IEluZGV4IHRvIHRhYmxlIG9mIHBvc3NpYmxlIHN0YXJ0IGJhbmRzICovCi0gICAgICAgICAgICAgVUlOVCAgIGhlYWRlckRhdGFGbGFncykgIC8qITwgSW5mbyB0byBTQlIgbW9kZSAqLworc3RhdGljIFVDSEFSIGdldFN0YXJ0QmFuZCgKKyAgICBVSU5UIGZzLCAgICAgICAgICAgICAgLyohPCBPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCisgICAgVUNIQVIgc3RhcnRGcmVxLCAgICAgIC8qITwgSW5kZXggdG8gdGFibGUgb2YgcG9zc2libGUgc3RhcnQgYmFuZHMgKi8KKyAgICBVSU5UIGhlYWRlckRhdGFGbGFncykgLyohPCBJbmZvIHRvIFNCUiBtb2RlICovCiB7Ci0gIElOVCAgYmFuZDsKLSAgVUlOVCBmc01hcHBlZDsKKyAgSU5UIGJhbmQ7CisgIFVJTlQgZnNNYXBwZWQgPSBmczsKKyAgU0JSX1JBVEUgcmF0ZSA9IERVQUw7CiAKLSAgICBmc01hcHBlZCA9IGZzOworICBpZiAoaGVhZGVyRGF0YUZsYWdzICYgKFNCUkRFQ19TWU5UQVhfVVNBQyB8IFNCUkRFQ19TWU5UQVhfUlNWRDUwKSkgeworICAgIGlmIChoZWFkZXJEYXRhRmxhZ3MgJiBTQlJERUNfUVVBRF9SQVRFKSB7CisgICAgICByYXRlID0gUVVBRDsKKyAgICB9CisgICAgZnNNYXBwZWQgPSBzYnJkZWNfbWFwVG9TdGRTYW1wbGVSYXRlKGZzLCAxKTsKKyAgfQorCisgIEZES19BU1NFUlQoMiAqIChyYXRlICsgMSkgPD0gKDQpKTsKIAogICBzd2l0Y2ggKGZzTWFwcGVkKSB7CisgICAgY2FzZSAxOTIwMDA6CisgICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMTkyW3N0YXJ0RnJlcV07CisgICAgICBicmVhazsKKyAgICBjYXNlIDE3NjQwMDoKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xNzZbc3RhcnRGcmVxXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI4MDAwOgorICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzEyOFtzdGFydEZyZXFdOworICAgICAgYnJlYWs7CiAgICAgY2FzZSA5NjAwMDoKICAgICBjYXNlIDg4MjAwOgotICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzg4W3N0YXJ0RnJlcV07CisgICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfODhbcmF0ZV1bc3RhcnRGcmVxXTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgNjQwMDA6Ci0gICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNjRbc3RhcnRGcmVxXTsKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV82NFtyYXRlXVtzdGFydEZyZXFdOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSA0ODAwMDoKLSAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80OFtzdGFydEZyZXFdOworICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQ4W3JhdGVdW3N0YXJ0RnJlcV07CiAgICAgICBicmVhazsKICAgICBjYXNlIDQ0MTAwOgotICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQ0W3N0YXJ0RnJlcV07CisgICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDRbcmF0ZV1bc3RhcnRGcmVxXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDAwMDA6CisgICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDBbcmF0ZV1bc3RhcnRGcmVxXTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgMzIwMDA6Ci0gICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMzJbc3RhcnRGcmVxXTsKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8zMltyYXRlXVtzdGFydEZyZXFdOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSAyNDAwMDoKLSAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8yNFtzdGFydEZyZXFdOworICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzI0W3JhdGVdW3N0YXJ0RnJlcV07CiAgICAgICBicmVhazsKICAgICBjYXNlIDIyMDUwOgotICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzIyW3N0YXJ0RnJlcV07CisgICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMjJbcmF0ZV1bc3RhcnRGcmVxXTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTYwMDA6Ci0gICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMTZbc3RhcnRGcmVxXTsKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xNltyYXRlXVtzdGFydEZyZXFdOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIGJhbmQgPSAyNTU7CkBAIC0xNTYsNyArMTkzLDYgQEAKICAgcmV0dXJuIGJhbmQ7CiB9CiAKLQogLyohCiAgIFxicmllZiAgICAgUmV0cmlldmUgUU1GLWJhbmQgd2hlcmUgdGhlIFNCUiByYW5nZSBzdGFydHMKIApAQCAtMTY1LDI5ICsyMDEsMzIgQEAKIAogICBccmV0dXJuICBOdW1iZXIgb2Ygc3RhcnQgYmFuZAogKi8KLXN0YXRpYyBVQ0hBUgotZ2V0U3RvcEJhbmQoVUlOVCAgIGZzLCAgICAgICAgICAgICAgIC8qITwgT3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgICAgICAgICAgVUNIQVIgIHN0b3BGcmVxLCAgICAgICAgIC8qITwgSW5kZXggdG8gdGFibGUgb2YgcG9zc2libGUgc3RhcnQgYmFuZHMgKi8KLSAgICAgICAgICAgIFVJTlQgICBoZWFkZXJEYXRhRmxhZ3MsICAvKiE8IEluZm8gdG8gU0JSIG1vZGUgKi8KLSAgICAgICAgICAgIFVDSEFSICBrMCkgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGZyZXEgaW5kZXggKi8KK3N0YXRpYyBVQ0hBUiBnZXRTdG9wQmFuZCgKKyAgICBVSU5UIGZzLCAgICAgICAgICAgICAgLyohPCBPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCisgICAgVUNIQVIgc3RvcEZyZXEsICAgICAgIC8qITwgSW5kZXggdG8gdGFibGUgb2YgcG9zc2libGUgc3RhcnQgYmFuZHMgKi8KKyAgICBVSU5UIGhlYWRlckRhdGFGbGFncywgLyohPCBJbmZvIHRvIFNCUiBtb2RlICovCisgICAgVUNIQVIgazApICAgICAgICAgICAgIC8qITwgU3RhcnQgZnJlcSBpbmRleCAqLwogewogICBVQ0hBUiBrMjsKIAogICBpZiAoc3RvcEZyZXEgPCAxNCkgewotICAgIElOVCAgICBzdG9wTWluOwotICAgIFVDSEFSICBkaWZmX3RvdFtNQVhfT0NUQVZFICsgTUFYX1NFQ09ORF9SRUdJT05dOworICAgIElOVCBzdG9wTWluOworICAgIElOVCBudW0gPSAyICogKDY0KTsKKyAgICBVQ0hBUiBkaWZmX3RvdFtNQVhfT0NUQVZFICsgTUFYX1NFQ09ORF9SRUdJT05dOwogICAgIFVDSEFSICpkaWZmMCA9IGRpZmZfdG90OwotICAgIFVDSEFSICpkaWZmMSA9IGRpZmZfdG90K01BWF9PQ1RBVkU7CisgICAgVUNIQVIgKmRpZmYxID0gZGlmZl90b3QgKyBNQVhfT0NUQVZFOworCisgICAgaWYgKGhlYWRlckRhdGFGbGFncyAmIFNCUkRFQ19RVUFEX1JBVEUpIHsKKyAgICAgIG51bSA+Pj0gMTsKKyAgICB9CiAKICAgICBpZiAoZnMgPCAzMjAwMCkgewotICAgICAgc3RvcE1pbiA9ICgoKDIqNjAwMCoyKig2NCkpIC8gZnMpICsgMSkgPj4gMTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgICBzdG9wTWluID0gKCgoMiAqIDYwMDAgKiBudW0pIC8gZnMpICsgMSkgPj4gMTsKKyAgICB9IGVsc2UgewogICAgICAgaWYgKGZzIDwgNjQwMDApIHsKLSAgICAgICAgc3RvcE1pbiA9ICgoKDIqODAwMCoyKig2NCkpIC8gZnMpICsgMSkgPj4gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBzdG9wTWluID0gKCgoMioxMDAwMCoyKig2NCkpIC8gZnMpICsgMSkgPj4gMTsKKyAgICAgICAgc3RvcE1pbiA9ICgoKDIgKiA4MDAwICogbnVtKSAvIGZzKSArIDEpID4+IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdG9wTWluID0gKCgoMiAqIDEwMDAwICogbnVtKSAvIGZzKSArIDEpID4+IDE7CiAgICAgICB9CiAgICAgfQogCkBAIC0xOTYsNDQgKzIzNSw0OSBAQAogICAgICAgYmFzZWQgb24gYSBsb2dhcml0aG1pYyBzY2FsZS4KICAgICAgIFRoZSB2ZWN0b3JzIGRpZmYwIGFuZCBkaWZmMSBhcmUgdXNlZCB0ZW1wb3JhcmlseSBoZXJlLgogICAgICovCi0gICAgQ2FsY0JhbmRzKCBkaWZmMCwgc3RvcE1pbiwgNjQsIDEzKTsKLSAgICBzaGVsbHNvcnQoIGRpZmYwLCAxMyk7CisgICAgQ2FsY0JhbmRzKGRpZmYwLCBzdG9wTWluLCA2NCwgMTMpOworICAgIHNoZWxsc29ydChkaWZmMCwgMTMpOwogICAgIGN1bVN1bShzdG9wTWluLCBkaWZmMCwgMTMsIGRpZmYxKTsKICAgICBrMiA9IGRpZmYxW3N0b3BGcmVxXTsKLSAgfQotICBlbHNlIGlmIChzdG9wRnJlcT09MTQpCi0gICAgazIgPSAyKmswOworICB9IGVsc2UgaWYgKHN0b3BGcmVxID09IDE0KQorICAgIGsyID0gMiAqIGswOwogICBlbHNlCi0gICAgazIgPSAzKmswOworICAgIGsyID0gMyAqIGswOwogCiAgIC8qIExpbWl0IHRvIE55cXVpc3QgKi8KLSAgaWYgKGsyID4gKDY0KSkKLSAgICBrMiA9ICg2NCk7Ci0KKyAgaWYgKGsyID4gKDY0KSkgazIgPSAoNjQpOwogCiAgIC8qIFJhbmdlIGNoZWNrcyAqLwogICAvKiAxIDw9IGRpZmZlcmVuY2UgPD0gNDg7IDEgPD0gZnMgPD0gOTYwMDAgKi8KLSAgaWYgKCAoKGsyIC0gazApID4gTUFYX0ZSRVFfQ09FRkZTKSB8fCAoazIgPD0gazApICkgewotICAgIHJldHVybiAyNTU7CisgIHsKKyAgICBVQ0hBUiBtYXhfZnJlcV9jb2VmZnMgPSAoaGVhZGVyRGF0YUZsYWdzICYgU0JSREVDX1FVQURfUkFURSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNQVhfRlJFUV9DT0VGRlNfUVVBRF9SQVRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTUFYX0ZSRVFfQ09FRkZTOworICAgIGlmICgoKGsyIC0gazApID4gbWF4X2ZyZXFfY29lZmZzKSB8fCAoazIgPD0gazApKSB7CisgICAgICByZXR1cm4gMjU1OworICAgIH0KICAgfQogCi0gIGlmIChoZWFkZXJEYXRhRmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9VU0FDfFNCUkRFQ19TWU5UQVhfUlNWRDUwKSkgeworICBpZiAoaGVhZGVyRGF0YUZsYWdzICYgU0JSREVDX1FVQURfUkFURSkgeworICAgIHJldHVybiBrMjsgLyogc2tpcCBvdGhlciBjaGVja3M6IChrMiAtIGswKSBtdXN0IGJlIDw9CisgICAgICAgICAgICAgICAgICBNQVhfRlJFUV9DT0VGRlNfUVVBRF9SQVRFIGZvciBhbGwgZnMgKi8KKyAgfQorICBpZiAoaGVhZGVyRGF0YUZsYWdzICYgKFNCUkRFQ19TWU5UQVhfVVNBQyB8IFNCUkRFQ19TWU5UQVhfUlNWRDUwKSkgewogICAgIC8qIDEgPD0gZGlmZmVyZW5jZSA8PSAzNTsgNDIwMDAgPD0gZnMgPD0gOTYwMDAgKi8KLSAgICBpZiAoIChmcyA+PSA0MjAwMCkgJiYgKCAoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0NDEwMCApICkgeworICAgIGlmICgoZnMgPj0gNDIwMDApICYmICgoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0NDEwMCkpIHsKICAgICAgIHJldHVybiAyNTU7CiAgICAgfQogICAgIC8qIDEgPD0gZGlmZmVyZW5jZSA8PSAzMjsgNDYwMDkgPD0gZnMgPD0gOTYwMDAgKi8KLSAgICBpZiAoIChmcyA+PSA0NjAwOSkgJiYgKCAoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0ODAwMCApICkgeworICAgIGlmICgoZnMgPj0gNDYwMDkpICYmICgoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0ODAwMCkpIHsKICAgICAgIHJldHVybiAyNTU7CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIC8qIDEgPD0gZGlmZmVyZW5jZSA8PSAzNTsgZnMgPT0gNDQxMDAgKi8KLSAgICBpZiAoIChmcyA9PSA0NDEwMCkgJiYgKCAoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0NDEwMCApICkgeworICAgIGlmICgoZnMgPT0gNDQxMDApICYmICgoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0NDEwMCkpIHsKICAgICAgIHJldHVybiAyNTU7CiAgICAgfQogICAgIC8qIDEgPD0gZGlmZmVyZW5jZSA8PSAzMjsgNDgwMDAgPD0gZnMgPD0gOTYwMDAgKi8KLSAgICBpZiAoIChmcyA+PSA0ODAwMCkgJiYgKCAoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0ODAwMCApICkgeworICAgIGlmICgoZnMgPj0gNDgwMDApICYmICgoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0ODAwMCkpIHsKICAgICAgIHJldHVybiAyNTU7CiAgICAgfQogICB9CkBAIC0yNDEsNyArMjg1LDYgQEAKICAgcmV0dXJuIGsyOwogfQogCi0KIC8qIQogICBcYnJpZWYgICAgIEdlbmVyYXRlcyBtYXN0ZXIgZnJlcXVlbmN5IHRhYmxlcwogCkBAIC0yNTIsMjkgKzI5NSwzMyBAQAogICBccmV0dXJuICBlcnJvckNvZGUsIDAgaWYgc3VjY2Vzc2Z1bAogKi8KIFNCUl9FUlJPUgotc2JyZGVjVXBkYXRlRnJlcVNjYWxlKFVDSEFSICogdl9rX21hc3RlciwgICAgLyohPCBNYXN0ZXIgdGFibGUgdG8gYmUgY3JlYXRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpudW1NYXN0ZXIsICAgICAgLyohPCBOdW1iZXIgb2YgZW50cmllcyBpbiBtYXN0ZXIgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgZnMsICAgICAgICAgICAgIC8qITwgU0JSIHdvcmtpbmcgc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgQ29udHJvbCBkYXRhIGZyb20gYml0c3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgICAgVUlOVCBmbGFncykKLXsKLSAgRklYUF9TR0wgYnBvX2RpdjE2OyAgICAgICAgLyogYmFuZHNfcGVyX29jdGF2ZSBkaXZpZGVkIGJ5IDE2ICovCi0gIElOVCAgICAgIGRrPTA7CitzYnJkZWNVcGRhdGVGcmVxU2NhbGUoCisgICAgVUNIQVIgKnZfa19tYXN0ZXIsIC8qITwgTWFzdGVyIHRhYmxlIHRvIGJlIGNyZWF0ZWQgKi8KKyAgICBVQ0hBUiAqbnVtTWFzdGVyLCAgLyohPCBOdW1iZXIgb2YgZW50cmllcyBpbiBtYXN0ZXIgdGFibGUgKi8KKyAgICBVSU5UIGZzLCAgICAgICAgICAgLyohPCBTQlIgd29ya2luZyBzYW1wbGluZyByYXRlICovCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBDb250cm9sIGRhdGEgZnJvbSBiaXRzdHJlYW0gKi8KKyAgICBVSU5UIGZsYWdzKSB7CisgIEZJWFBfU0dMIGJwb19kaXYxNjsgLyogYmFuZHNfcGVyX29jdGF2ZSBkaXZpZGVkIGJ5IDE2ICovCisgIElOVCBkayA9IDA7CiAKICAgLyogSW50ZXJuYWwgdmFyaWFibGVzICovCi0gIFVDSEFSICBrMCwgazIsIGk7Ci0gIFVDSEFSICBudW1fYmFuZHMwID0gMDsKLSAgVUNIQVIgIG51bV9iYW5kczEgPSAwOwotICBVQ0hBUiAgZGlmZl90b3RbTUFYX09DVEFWRSArIE1BWF9TRUNPTkRfUkVHSU9OXTsKKyAgVUNIQVIgazAsIGsyLCBpOworICBVQ0hBUiBudW1fYmFuZHMwID0gMDsKKyAgVUNIQVIgbnVtX2JhbmRzMSA9IDA7CisgIFVDSEFSIGRpZmZfdG90W01BWF9PQ1RBVkUgKyBNQVhfU0VDT05EX1JFR0lPTl07CiAgIFVDSEFSICpkaWZmMCA9IGRpZmZfdG90OwotICBVQ0hBUiAqZGlmZjEgPSBkaWZmX3RvdCtNQVhfT0NUQVZFOwotICBJTlQgICAgazJfYWNoaXZlZDsKLSAgSU5UICAgIGsyX2RpZmY7Ci0gIElOVCAgICBpbmNyPTA7CisgIFVDSEFSICpkaWZmMSA9IGRpZmZfdG90ICsgTUFYX09DVEFWRTsKKyAgSU5UIGsyX2FjaGl2ZWQ7CisgIElOVCBrMl9kaWZmOworICBJTlQgaW5jciA9IDA7CiAKICAgLyoKICAgICBEZXRlcm1pbmUgc3RhcnQgYmFuZAogICAqLworICBpZiAoZmxhZ3MgJiBTQlJERUNfUVVBRF9SQVRFKSB7CisgICAgZnMgPj49IDE7CisgIH0KKwogICBrMCA9IGdldFN0YXJ0QmFuZChmcywgaEhlYWRlckRhdGEtPmJzX2RhdGEuc3RhcnRGcmVxLCBmbGFncyk7CiAgIGlmIChrMCA9PSAyNTUpIHsKICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKQEAgLTI4OCwxMjcgKzMzNSwxMzQgQEAKICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgfQogCi0gIGlmKGhIZWFkZXJEYXRhLT5ic19kYXRhLmZyZXFTY2FsZT4wKSB7IC8qIEJhcmsgKi8KKyAgaWYgKGhIZWFkZXJEYXRhLT5ic19kYXRhLmZyZXFTY2FsZSA+IDApIHsgLyogQmFyayAqLwogICAgIElOVCBrMTsKIAotICAgIGlmKGhIZWFkZXJEYXRhLT5ic19kYXRhLmZyZXFTY2FsZT09MSkgewotICAgICAgYnBvX2RpdjE2ID0gRkwyRlhDT05TVF9TR0woMTIuMGYvMTYuMGYpOwotICAgIH0KLSAgICBlbHNlIGlmKGhIZWFkZXJEYXRhLT5ic19kYXRhLmZyZXFTY2FsZT09MikgewotICAgICAgYnBvX2RpdjE2ID0gRkwyRlhDT05TVF9TR0woMTAuMGYvMTYuMGYpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGJwb19kaXYxNiA9ICBGTDJGWENPTlNUX1NHTCg4LjBmLzE2LjBmKTsKKyAgICBpZiAoaEhlYWRlckRhdGEtPmJzX2RhdGEuZnJlcVNjYWxlID09IDEpIHsKKyAgICAgIGJwb19kaXYxNiA9IEZMMkZYQ09OU1RfU0dMKDEyLjBmIC8gMTYuMGYpOworICAgIH0gZWxzZSBpZiAoaEhlYWRlckRhdGEtPmJzX2RhdGEuZnJlcVNjYWxlID09IDIpIHsKKyAgICAgIGJwb19kaXYxNiA9IEZMMkZYQ09OU1RfU0dMKDEwLjBmIC8gMTYuMGYpOworICAgIH0gZWxzZSB7CisgICAgICBicG9fZGl2MTYgPSBGTDJGWENPTlNUX1NHTCg4LjBmIC8gMTYuMGYpOwogICAgIH0KIAorICAgIC8qIFJlZjogSVNPL0lFQyAyMzAwMy0zLCBGaWd1cmUgMTIgLSBGbG93Y2hhcnQgY2FsY3VsYXRpb24gb2YgZk1hc3RlciBmb3IKKyAgICAgKiA0OjEgc3lzdGVtIHdoZW4gYnNfZnJlcV9zY2FsZSA+IDAgKi8KKyAgICBpZiAoZmxhZ3MgJiBTQlJERUNfUVVBRF9SQVRFKSB7CisgICAgICBpZiAoKFNIT1JUKWswIDwgKFNIT1JUKShicG9fZGl2MTYgPj4gKChGUkFDVF9CSVRTIC0gMSkgLSA0KSkpIHsKKyAgICAgICAgYnBvX2RpdjE2ID0gKEZJWFBfU0dMKShrMCAmIChVQ0hBUikweGZlKQorICAgICAgICAgICAgICAgICAgICA8PCAoKEZSQUNUX0JJVFMgLSAxKSAtIDQpOyAvKiBicG9fZGl2MTYgPSBmbG9vcihrMC8yKSoyICovCisgICAgICB9CisgICAgfQogCi0gICAgaWYoIDEwMDAgKiBrMiA+IDIyNDUgKiBrMCApIHsgLyogVHdvIG9yIG1vcmUgcmVnaW9ucyAqLwotICAgICAgazEgPSAyKmswOworICAgIGlmICgxMDAwICogazIgPiAyMjQ1ICogazApIHsgLyogVHdvIG9yIG1vcmUgcmVnaW9ucyAqLworICAgICAgazEgPSAyICogazA7CiAKICAgICAgIG51bV9iYW5kczAgPSBudW1iZXJPZkJhbmRzKGJwb19kaXYxNiwgazAsIGsxLCAwKTsKLSAgICAgIG51bV9iYW5kczEgPSBudW1iZXJPZkJhbmRzKGJwb19kaXYxNiwgazEsIGsyLCBoSGVhZGVyRGF0YS0+YnNfZGF0YS5hbHRlclNjYWxlICk7Ci0gICAgICBpZiAoIG51bV9iYW5kczAgPCAxKSB7CisgICAgICBudW1fYmFuZHMxID0KKyAgICAgICAgICBudW1iZXJPZkJhbmRzKGJwb19kaXYxNiwgazEsIGsyLCBoSGVhZGVyRGF0YS0+YnNfZGF0YS5hbHRlclNjYWxlKTsKKyAgICAgIGlmIChudW1fYmFuZHMwIDwgMSkgewogICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgICAgIH0KLSAgICAgIGlmICggbnVtX2JhbmRzMSA8IDEgKSB7CisgICAgICBpZiAobnVtX2JhbmRzMSA8IDEpIHsKICAgICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgICAgICB9CiAKICAgICAgIENhbGNCYW5kcyhkaWZmMCwgazAsIGsxLCBudW1fYmFuZHMwKTsKLSAgICAgIHNoZWxsc29ydCggZGlmZjAsIG51bV9iYW5kczApOworICAgICAgc2hlbGxzb3J0KGRpZmYwLCBudW1fYmFuZHMwKTsKICAgICAgIGlmIChkaWZmMFswXSA9PSAwKSB7Ci0jaWZkZWYgREVCVUdfVE9PTFMKLSNlbmRpZgogICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgICAgIH0KIAogICAgICAgY3VtU3VtKGswLCBkaWZmMCwgbnVtX2JhbmRzMCwgdl9rX21hc3Rlcik7CiAKICAgICAgIENhbGNCYW5kcyhkaWZmMSwgazEsIGsyLCBudW1fYmFuZHMxKTsKLSAgICAgIHNoZWxsc29ydCggZGlmZjEsIG51bV9iYW5kczEpOwotICAgICAgaWYoZGlmZjBbbnVtX2JhbmRzMC0xXSA+IGRpZmYxWzBdKSB7CisgICAgICBzaGVsbHNvcnQoZGlmZjEsIG51bV9iYW5kczEpOworICAgICAgaWYgKGRpZmYwW251bV9iYW5kczAgLSAxXSA+IGRpZmYxWzBdKSB7CiAgICAgICAgIFNCUl9FUlJPUiBlcnI7CiAKLSAgICAgICAgZXJyID0gbW9kaWZ5QmFuZHMoZGlmZjBbbnVtX2JhbmRzMC0xXSxkaWZmMSwgbnVtX2JhbmRzMSk7Ci0gICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgICAgICAgIGVyciA9IG1vZGlmeUJhbmRzKGRpZmYwW251bV9iYW5kczAgLSAxXSwgZGlmZjEsIG51bV9iYW5kczEpOworICAgICAgICBpZiAoZXJyKSByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgICAgIH0KIAogICAgICAgLyogQWRkIDJuZCByZWdpb24gKi8KICAgICAgIGN1bVN1bShrMSwgZGlmZjEsIG51bV9iYW5kczEsICZ2X2tfbWFzdGVyW251bV9iYW5kczBdKTsKLSAgICAgICpudW1NYXN0ZXIgPSBudW1fYmFuZHMwICsgbnVtX2JhbmRzMTsgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLworICAgICAgKm51bU1hc3RlciA9IG51bV9iYW5kczAgKyBudW1fYmFuZHMxOyAvKiBPdXRwdXQgbnIgb2YgYmFuZHMgKi8KIAotICAgIH0KLSAgICBlbHNlIHsgLyogT25seSBvbmUgcmVnaW9uICovCi0gICAgICBrMT1rMjsKKyAgICB9IGVsc2UgeyAvKiBPbmx5IG9uZSByZWdpb24gKi8KKyAgICAgIGsxID0gazI7CiAKICAgICAgIG51bV9iYW5kczAgPSBudW1iZXJPZkJhbmRzKGJwb19kaXYxNiwgazAsIGsxLCAwKTsKLSAgICAgIGlmICggbnVtX2JhbmRzMCA8IDEpIHsKKyAgICAgIGlmIChudW1fYmFuZHMwIDwgMSkgewogICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgICAgIH0KICAgICAgIENhbGNCYW5kcyhkaWZmMCwgazAsIGsxLCBudW1fYmFuZHMwKTsKICAgICAgIHNoZWxsc29ydChkaWZmMCwgbnVtX2JhbmRzMCk7CiAgICAgICBpZiAoZGlmZjBbMF0gPT0gMCkgewotI2lmZGVmIERFQlVHX1RPT0xTCi0jZW5kaWYKICAgICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgICAgICB9CiAKICAgICAgIGN1bVN1bShrMCwgZGlmZjAsIG51bV9iYW5kczAsIHZfa19tYXN0ZXIpOwotICAgICAgKm51bU1hc3RlciA9IG51bV9iYW5kczA7ICAgICAgICAvKiBPdXRwdXQgbnIgb2YgYmFuZHMgKi8KLQorICAgICAgKm51bU1hc3RlciA9IG51bV9iYW5kczA7IC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLwogICAgIH0KLSAgfQotICBlbHNlIHsgLyogTGluZWFyIG1vZGUgKi8KLSAgICAgaWYgKGhIZWFkZXJEYXRhLT5ic19kYXRhLmFsdGVyU2NhbGU9PTApIHsKLSAgICAgICAgZGsgPSAxOwotICAgICAgICAvKiBGTE9PUiB0byBnZXQgdG8gZmV3IG51bWJlciBvZiBiYW5kcyAobmV4dCBsb3dlciBldmVuIG51bWJlcikgKi8KLSAgICAgICAgbnVtX2JhbmRzMCA9IChrMiAtIGswKSAmIDI1NDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRrID0gMjsKLSAgICAgICAgbnVtX2JhbmRzMCA9ICggKChrMiAtIGswKSA+PiAxKSArIDEgKSAmIDI1NDsgLyogUk9VTkQgdG8gdGhlIGNsb3Nlc3QgZml0ICovCi0gICAgICB9CisgIH0gZWxzZSB7IC8qIExpbmVhciBtb2RlICovCisgICAgaWYgKGhIZWFkZXJEYXRhLT5ic19kYXRhLmFsdGVyU2NhbGUgPT0gMCkgeworICAgICAgZGsgPSAxOworICAgICAgLyogRkxPT1IgdG8gZ2V0IHRvIGZldyBudW1iZXIgb2YgYmFuZHMgKG5leHQgbG93ZXIgZXZlbiBudW1iZXIpICovCisgICAgICBudW1fYmFuZHMwID0gKGsyIC0gazApICYgMjU0OworICAgIH0gZWxzZSB7CisgICAgICBkayA9IDI7CisgICAgICBudW1fYmFuZHMwID0gKCgoazIgLSBrMCkgPj4gMSkgKyAxKSAmIDI1NDsgLyogUk9VTkQgdG8gdGhlIGNsb3Nlc3QgZml0ICovCisgICAgfQogCi0gICAgICBpZiAobnVtX2JhbmRzMCA8IDEpIHsKLSAgICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7Ci0gICAgICAgIC8qIFdlIG11c3QgcmV0dXJuIGFscmVhZHkgaGVyZSBiZWNhdXNlICdpJyBjYW4gYmVjb21lIG5lZ2F0aXZlIGJlbG93LiAqLwotICAgICAgfQorICAgIGlmIChudW1fYmFuZHMwIDwgMSkgeworICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgICAgICAvKiBXZSBtdXN0IHJldHVybiBhbHJlYWR5IGhlcmUgYmVjYXVzZSAnaScgY2FuIGJlY29tZSBuZWdhdGl2ZSBiZWxvdy4gKi8KKyAgICB9CiAKLSAgICAgIGsyX2FjaGl2ZWQgPSBrMCArIG51bV9iYW5kczAqZGs7Ci0gICAgICBrMl9kaWZmID0gazIgLSBrMl9hY2hpdmVkOworICAgIGsyX2FjaGl2ZWQgPSBrMCArIG51bV9iYW5kczAgKiBkazsKKyAgICBrMl9kaWZmID0gazIgLSBrMl9hY2hpdmVkOwogCi0gICAgICBmb3IoaT0wO2k8bnVtX2JhbmRzMDtpKyspCi0gICAgICAgIGRpZmZfdG90W2ldID0gZGs7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9iYW5kczA7IGkrKykgZGlmZl90b3RbaV0gPSBkazsKIAotICAgICAgLyogSWYgbGluZWFyIHNjYWxlIHdhc24ndCBhY2hpZXZlZCAqLwotICAgICAgLyogYW5kIHdlIGdvdCB0b28gd2lkZSBTQlIgYXJlYSAqLwotICAgICAgaWYgKGsyX2RpZmYgPCAwKSB7Ci0gICAgICAgICAgaW5jciA9IDE7Ci0gICAgICAgICAgaSA9IDA7Ci0gICAgICB9CisgICAgLyogSWYgbGluZWFyIHNjYWxlIHdhc24ndCBhY2hpZXZlZCAqLworICAgIC8qIGFuZCB3ZSBnb3QgdG9vIHdpZGUgU0JSIGFyZWEgKi8KKyAgICBpZiAoazJfZGlmZiA8IDApIHsKKyAgICAgIGluY3IgPSAxOworICAgICAgaSA9IDA7CisgICAgfQogCi0gICAgICAvKiBJZiBsaW5lYXIgc2NhbGUgd2Fzbid0IGFjaGlldmVkICovCi0gICAgICAvKiBhbmQgd2UgZ290IHRvbyBzbWFsbCBTQlIgYXJlYSAqLwotICAgICAgaWYgKGsyX2RpZmYgPiAwKSB7Ci0gICAgICAgICAgaW5jciA9IC0xOwotICAgICAgICAgIGkgPSBudW1fYmFuZHMwLTE7Ci0gICAgICB9CisgICAgLyogSWYgbGluZWFyIHNjYWxlIHdhc24ndCBhY2hpZXZlZCAqLworICAgIC8qIGFuZCB3ZSBnb3QgdG9vIHNtYWxsIFNCUiBhcmVhICovCisgICAgaWYgKGsyX2RpZmYgPiAwKSB7CisgICAgICBpbmNyID0gLTE7CisgICAgICBpID0gbnVtX2JhbmRzMCAtIDE7CisgICAgfQogCi0gICAgICAvKiBBZGp1c3QgZGlmZiB2ZWN0b3IgdG8gZ2V0IHNlcGMuIFNCUiByYW5nZSAqLwotICAgICAgd2hpbGUgKGsyX2RpZmYgIT0gMCkgewotICAgICAgICBkaWZmX3RvdFtpXSA9IGRpZmZfdG90W2ldIC0gaW5jcjsKLSAgICAgICAgaSA9IGkgKyBpbmNyOwotICAgICAgICBrMl9kaWZmID0gazJfZGlmZiArIGluY3I7Ci0gICAgICB9CisgICAgLyogQWRqdXN0IGRpZmYgdmVjdG9yIHRvIGdldCBzZXBjLiBTQlIgcmFuZ2UgKi8KKyAgICB3aGlsZSAoazJfZGlmZiAhPSAwKSB7CisgICAgICBkaWZmX3RvdFtpXSA9IGRpZmZfdG90W2ldIC0gaW5jcjsKKyAgICAgIGkgPSBpICsgaW5jcjsKKyAgICAgIGsyX2RpZmYgPSBrMl9kaWZmICsgaW5jcjsKKyAgICB9CiAKLSAgICAgIGN1bVN1bShrMCwgZGlmZl90b3QsIG51bV9iYW5kczAsIHZfa19tYXN0ZXIpOy8qIGN1bXN1bSAqLwotICAgICpudW1NYXN0ZXIgPSBudW1fYmFuZHMwOyAgLyogT3V0cHV0IG5yIG9mIGJhbmRzICovCisgICAgY3VtU3VtKGswLCBkaWZmX3RvdCwgbnVtX2JhbmRzMCwgdl9rX21hc3Rlcik7IC8qIGN1bXN1bSAqLworICAgICpudW1NYXN0ZXIgPSBudW1fYmFuZHMwOyAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgbnIgb2YgYmFuZHMgKi8KICAgfQogCiAgIGlmICgqbnVtTWFzdGVyIDwgMSkgewogICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICB9CiAKKyAgLyogUmVmOiBJU08vSUVDIDIzMDAzLTMgQ29yLjMsICJJbiA3LjUuNS4yLCBhZGQgdG8gdGhlIHJlcXVpcmVtZW50czoiKi8KKyAgaWYgKGZsYWdzICYgU0JSREVDX1FVQURfUkFURSkgeworICAgIGludCBrOworICAgIGZvciAoayA9IDE7IGsgPCAqbnVtTWFzdGVyOyBrKyspIHsKKyAgICAgIGlmICghKHZfa19tYXN0ZXJba10gLSB2X2tfbWFzdGVyW2sgLSAxXSA8PSBrMCAtIDIpKSB7CisgICAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgICAgfQorICAgIH0KKyAgfQogCiAgIC8qCiAgICAgUHJpbnQgb3V0IHRoZSBjYWxjdWxhdGVkIHRhYmxlCkBAIC00MTcsNyArNDcxLDYgQEAKICAgcmV0dXJuIFNCUkRFQ19PSzsKIH0KIAotCiAvKiEKICAgXGJyaWVmICAgICBDYWxjdWxhdGUgZnJlcXVlbmN5IHJhdGlvIG9mIG9uZSBTQlIgYmFuZAogCkBAIC00MjcsNTYgKzQ4MCw1MiBAQAogCiAgXHJldHVybiAgICBudW1fYmFuZC10aCByb290IG9mIGtfc3RhcnQva19zdG9wCiAqLwotc3RhdGljIEZJWFBfU0dMIGNhbGNGYWN0b3JQZXJCYW5kKGludCBrX3N0YXJ0LCBpbnQga19zdG9wLCBpbnQgbnVtX2JhbmRzKQotewotLyogU2NhbGVkIGJhbmRmYWN0b3IgYW5kIHN0ZXAgMSBiaXQgcmlnaHQgdG8gYXZvaWQgb3ZlcmZsb3cKLSAqIHVzZSBkb3VibGUgZGF0YSB0eXBlICovCitzdGF0aWMgRklYUF9TR0wgY2FsY0ZhY3RvclBlckJhbmQoaW50IGtfc3RhcnQsIGludCBrX3N0b3AsIGludCBudW1fYmFuZHMpIHsKKyAgLyogU2NhbGVkIGJhbmRmYWN0b3IgYW5kIHN0ZXAgMSBiaXQgcmlnaHQgdG8gYXZvaWQgb3ZlcmZsb3cKKyAgICogdXNlIGRvdWJsZSBkYXRhIHR5cGUgKi8KICAgRklYUF9EQkwgYmFuZGZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDAuMjVmKTsgLyogU3RhcnQgdmFsdWUgKi8KLSAgRklYUF9EQkwgc3RlcCA9IEZMMkZYQ09OU1RfREJMKDAuMTI1Zik7ICAgICAgLyogSW5pdGlhbCBpbmNyZW1lbnQgZm9yIGZhY3RvciAqLworICBGSVhQX0RCTCBzdGVwID0gRkwyRlhDT05TVF9EQkwoMC4xMjVmKTsgLyogSW5pdGlhbCBpbmNyZW1lbnQgZm9yIGZhY3RvciAqLwogCi0gIGludCAgICBkaXJlY3Rpb24gPSAxOworICBpbnQgZGlyZWN0aW9uID0gMTsKIAotLyogQmVjYXVzZSBzYXR1cmF0aW9uIGNhbid0IGJlIGRvbmUgaW4gSU5UIElJUywKLSAqIGNoYW5nZWQgc3RhcnQgYW5kIHN0b3AgZGF0YSB0eXBlIGZyb20gRklYUF9TR0wgdG8gRklYUF9EQkwgKi8KLSAgRklYUF9EQkwgc3RhcnQgPSBrX3N0YXJ0IDw8IChERlJBQ1RfQklUUy04KTsKLSAgRklYUF9EQkwgc3RvcCA9IGtfc3RvcCA8PCAoREZSQUNUX0JJVFMtOCk7CisgIC8qIEJlY2F1c2Ugc2F0dXJhdGlvbiBjYW4ndCBiZSBkb25lIGluIElOVCBJSVMsCisgICAqIGNoYW5nZWQgc3RhcnQgYW5kIHN0b3AgZGF0YSB0eXBlIGZyb20gRklYUF9TR0wgdG8gRklYUF9EQkwgKi8KKyAgRklYUF9EQkwgc3RhcnQgPSBrX3N0YXJ0IDw8IChERlJBQ1RfQklUUyAtIDgpOworICBGSVhQX0RCTCBzdG9wID0ga19zdG9wIDw8IChERlJBQ1RfQklUUyAtIDgpOwogCiAgIEZJWFBfREJMIHRlbXA7CiAKLSAgaW50ICAgaiwgaT0wOworICBpbnQgaiwgaSA9IDA7CiAKLSAgd2hpbGUgKCBzdGVwID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgd2hpbGUgKHN0ZXAgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewogICAgIGkrKzsKICAgICB0ZW1wID0gc3RvcDsKIAogICAgIC8qIENhbGN1bGF0ZSB0ZW1wXm51bV9iYW5kczogKi8KLSAgICBmb3IgKGo9MDsgajxudW1fYmFuZHM7IGorKykKLSAgICAgIC8vdGVtcCA9IGZNdWx0KHRlbXAsYmFuZGZhY3Rvcik7Ci0gICAgICB0ZW1wID0gZk11bHREaXYyKHRlbXAsYmFuZGZhY3Rvcik8PDI7CisgICAgZm9yIChqID0gMDsgaiA8IG51bV9iYW5kczsgaisrKQorICAgICAgLy8gdGVtcCA9IGZNdWx0KHRlbXAsYmFuZGZhY3Rvcik7CisgICAgICB0ZW1wID0gZk11bHREaXYyKHRlbXAsIGJhbmRmYWN0b3IpIDw8IDI7CiAKLSAgICBpZiAodGVtcDxzdGFydCkgeyAvKiBGYWN0b3IgdG9vIHN0cm9uZywgbWFrZSBpdCB3ZWFrZXIgKi8KKyAgICBpZiAodGVtcCA8IHN0YXJ0KSB7IC8qIEZhY3RvciB0b28gc3Ryb25nLCBtYWtlIGl0IHdlYWtlciAqLwogICAgICAgaWYgKGRpcmVjdGlvbiA9PSAwKQogICAgICAgICAvKiBIYWxmZW4gc3RlcC4gUmlnaHQgc2hpZnQgaXMgbm90IGRvbmUgYXMgZnJhY3QgYmVjYXVzZSBvdGhlcndpc2UgdGhlCiAgICAgICAgICAgIGxvd2VzdCBiaXQgY2Fubm90IGJlIGNsZWFyZWQgZHVlIHRvIHJvdW5kaW5nICovCiAgICAgICAgIHN0ZXAgPSAoRklYUF9EQkwpKChMT05HKXN0ZXAgPj4gMSk7CiAgICAgICBkaXJlY3Rpb24gPSAxOwogICAgICAgYmFuZGZhY3RvciA9IGJhbmRmYWN0b3IgKyBzdGVwOwotICAgIH0KLSAgICBlbHNlIHsgIC8qIEZhY3RvciBpcyB0b28gd2VhazogbWFrZSBpdCBzdHJvbmdlciAqLwotICAgICAgaWYgKGRpcmVjdGlvbiA9PSAxKQotICAgICAgICBzdGVwID0gKEZJWFBfREJMKSgoTE9ORylzdGVwID4+IDEpOworICAgIH0gZWxzZSB7IC8qIEZhY3RvciBpcyB0b28gd2VhazogbWFrZSBpdCBzdHJvbmdlciAqLworICAgICAgaWYgKGRpcmVjdGlvbiA9PSAxKSBzdGVwID0gKEZJWFBfREJMKSgoTE9ORylzdGVwID4+IDEpOwogICAgICAgZGlyZWN0aW9uID0gMDsKICAgICAgIGJhbmRmYWN0b3IgPSBiYW5kZmFjdG9yIC0gc3RlcDsKICAgICB9CiAKLSAgICBpZiAoaT4xMDApIHsKKyAgICBpZiAoaSA+IDEwMCkgewogICAgICAgc3RlcCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgIH0KICAgfQotICByZXR1cm4gRlhfREJMMkZYX1NHTChiYW5kZmFjdG9yPDwxKTsKKyAgcmV0dXJuIEZYX0RCTDJGWF9TR0woYmFuZGZhY3RvciA8PCAxKTsKIH0KIAotCiAvKiEKICAgXGJyaWVmICAgICBDYWxjdWxhdGUgbnVtYmVyIG9mIFNCUiBiYW5kcyBiZXR3ZWVuIHN0YXJ0IGFuZCBzdG9wIGJhbmQKIApAQCAtNDg3LDM0ICs1MzYsMzUgQEAKIAogICBccmV0dXJuICAgIG51bWJlciBvZiBiYW5kcwogKi8KLXN0YXRpYyBpbnQKLW51bWJlck9mQmFuZHMoRklYUF9TR0wgYnBvX2RpdjE2LCAvKiE8IElucHV0OiBudW1iZXIgb2YgYmFuZHMgcGVyIG9jdGF2ZSBkaXZpZGVkIGJ5IDE2ICovCi0gICAgICAgICAgICAgIGludCAgICBzdGFydCwgICAgIC8qITwgRmlyc3QgUU1GIGJhbmQgb2YgU0JSIGZyZXF1ZW5jeSByYW5nZSAqLwotICAgICAgICAgICAgICBpbnQgICAgc3RvcCwgICAgICAvKiE8IExhc3QgUU1GIGJhbmQgb2YgU0JSIGZyZXF1ZW5jeSByYW5nZSArIDEgKi8KLSAgICAgICAgICAgICAgaW50ICAgIHdhcnBGbGFnKSAgLyohPCBTdHJldGNoaW5nIGZsYWcgKi8KK3N0YXRpYyBpbnQgbnVtYmVyT2ZCYW5kcygKKyAgICBGSVhQX1NHTCBicG9fZGl2MTYsIC8qITwgSW5wdXQ6IG51bWJlciBvZiBiYW5kcyBwZXIgb2N0YXZlIGRpdmlkZWQgYnkgMTYgKi8KKyAgICBpbnQgc3RhcnQsICAgICAgICAgIC8qITwgRmlyc3QgUU1GIGJhbmQgb2YgU0JSIGZyZXF1ZW5jeSByYW5nZSAqLworICAgIGludCBzdG9wLCAgICAgICAgICAgLyohPCBMYXN0IFFNRiBiYW5kIG9mIFNCUiBmcmVxdWVuY3kgcmFuZ2UgKyAxICovCisgICAgaW50IHdhcnBGbGFnKSAgICAgICAvKiE8IFN0cmV0Y2hpbmcgZmxhZyAqLwogewogICBGSVhQX1NHTCBudW1fYmFuZHNfZGl2MTI4OwotICBpbnQgICAgbnVtX2JhbmRzOworICBpbnQgbnVtX2JhbmRzOwogCi0gIG51bV9iYW5kc19kaXYxMjggPSBGWF9EQkwyRlhfU0dMKGZNdWx0KEZES19nZXROdW1PY3RhdmVzRGl2OChzdGFydCxzdG9wKSxicG9fZGl2MTYpKTsKKyAgbnVtX2JhbmRzX2RpdjEyOCA9CisgICAgICBGWF9EQkwyRlhfU0dMKGZNdWx0KEZES19nZXROdW1PY3RhdmVzRGl2OChzdGFydCwgc3RvcCksIGJwb19kaXYxNikpOwogCiAgIGlmICh3YXJwRmxhZykgewogICAgIC8qIEFwcGx5IHRoZSB3YXJwIGZhY3RvciBvZiAxLjMgdG8gZ2V0IHdpZGVyIGJhbmRzLiAgV2UgdXNlIGEgdmFsdWUKICAgICAgICBvZiAzMjc2OC8yNTIwMCBpbnN0ZWFkIG9mIHRoZSBleGFjdCB2YWx1ZSB0byBhdm9pZCBjcml0aWNhbCBjYXNlcwogICAgICAgIG9mIHJvdW5kaW5nLgogICAgICovCi0gICAgbnVtX2JhbmRzX2RpdjEyOCA9IEZYX0RCTDJGWF9TR0woZk11bHQobnVtX2JhbmRzX2RpdjEyOCwgRkwyRlhDT05TVF9TR0woMjUyMDAuMC8zMjc2OC4wKSkpOworICAgIG51bV9iYW5kc19kaXYxMjggPSBGWF9EQkwyRlhfU0dMKAorICAgICAgICBmTXVsdChudW1fYmFuZHNfZGl2MTI4LCBGTDJGWENPTlNUX1NHTCgyNTIwMC4wIC8gMzI3NjguMCkpKTsKICAgfQogCiAgIC8qIGFkZCBzY2FsZWQgMSBmb3Igcm91bmRpbmcgdG8gZXZlbiBudW1iZXJzOiAqLwotICBudW1fYmFuZHNfZGl2MTI4ID0gbnVtX2JhbmRzX2RpdjEyOCArIEZMMkZYQ09OU1RfU0dMKCAxLjBmLzEyOC4wZiApOworICBudW1fYmFuZHNfZGl2MTI4ID0gbnVtX2JhbmRzX2RpdjEyOCArIEZMMkZYQ09OU1RfU0dMKDEuMGYgLyAxMjguMGYpOwogICAvKiBzY2FsZSBiYWNrIHRvIHJpZ2h0IGFsaWduZWQgaW50ZWdlciBhbmQgZG91YmxlIHRoZSB2YWx1ZTogKi8KICAgbnVtX2JhbmRzID0gMiAqICgoTE9ORyludW1fYmFuZHNfZGl2MTI4ID4+IChGUkFDVF9CSVRTIC0gNykpOwogCi0gIHJldHVybihudW1fYmFuZHMpOworICByZXR1cm4gKG51bV9iYW5kcyk7CiB9CiAKLQogLyohCiAgIFxicmllZiAgICAgQ2FsY3VsYXRlIHdpZHRoIG9mIFNCUiBiYW5kcwogCkBAIC01MjIsMTEgKzU3MiwxMCBAQAogICB0aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHdpZHRoIG9mIGVhY2ggU0JSIGJhbmQgaW4gUU1GIGNoYW5uZWxzLgogICBUaGUgYmFuZHMgZ2V0IHdpZGVyIGZyb20gc3RhcnQgdG8gc3RvcCAoYmFyayBzY2FsZSkuCiAqLwotc3RhdGljIHZvaWQKLUNhbGNCYW5kcyhVQ0hBUiAqIGRpZmYsICAgIC8qITwgVmVjdG9yIG9mIHdpZHRocyB0byBiZSBjYWxjdWxhdGVkICovCi0gICAgICAgICAgVUNIQVIgc3RhcnQsICAgICAvKiE8IExvd2VyIGVuZCBvZiBzdWJiYW5kIHJhbmdlICovCi0gICAgICAgICAgVUNIQVIgc3RvcCwgICAgICAvKiE8IFVwcGVyIGVuZCBvZiBzdWJiYW5kIHJhbmdlICovCi0gICAgICAgICAgVUNIQVIgbnVtX2JhbmRzKSAvKiE8IERlc2lyZWQgbnVtYmVyIG9mIGJhbmRzICovCitzdGF0aWMgdm9pZCBDYWxjQmFuZHMoVUNIQVIgKmRpZmYsICAgICAvKiE8IFZlY3RvciBvZiB3aWR0aHMgdG8gYmUgY2FsY3VsYXRlZCAqLworICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIHN0YXJ0LCAgICAgLyohPCBMb3dlciBlbmQgb2Ygc3ViYmFuZCByYW5nZSAqLworICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIHN0b3AsICAgICAgLyohPCBVcHBlciBlbmQgb2Ygc3ViYmFuZCByYW5nZSAqLworICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIG51bV9iYW5kcykgLyohPCBEZXNpcmVkIG51bWJlciBvZiBiYW5kcyAqLwogewogICBpbnQgaTsKICAgaW50IHByZXZpb3VzOwpAQCAtNTM1LDE4ICs1ODQsMjAgQEAKICAgRklYUF9TR0wgYmFuZGZhY3RvciA9IGNhbGNGYWN0b3JQZXJCYW5kKHN0YXJ0LCBzdG9wLCBudW1fYmFuZHMpOwogCiAgIHByZXZpb3VzID0gc3RvcDsgLyogU3RhcnQgd2l0aCBoaWdoZXN0IFFNRiBjaGFubmVsICovCi0gIGV4YWN0ID0gKEZJWFBfU0dMKShzdG9wIDw8IChGUkFDVF9CSVRTLTgpKTsgLyogU2hpZnQgbGVmdCB0byBnYWluIHNvbWUgYWNjdXJhY3kgKi8KKyAgZXhhY3QgPSAoRklYUF9TR0wpKAorICAgICAgc3RvcCA8PCAoRlJBQ1RfQklUUyAtIDgpKTsgLyogU2hpZnQgbGVmdCB0byBnYWluIHNvbWUgYWNjdXJhY3kgKi8KIAotICBmb3IoaT1udW1fYmFuZHMtMTsgaT49MDsgaS0tKSB7CisgIGZvciAoaSA9IG51bV9iYW5kcyAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgLyogQ2FsY3VsYXRlIGJvcmRlciBvZiBuZXh0IGxvd2VyIHNiciBiYW5kICovCi0gICAgZXhhY3QgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGV4YWN0LGJhbmRmYWN0b3IpKTsKKyAgICBleGFjdCA9IEZYX0RCTDJGWF9TR0woZk11bHQoZXhhY3QsIGJhbmRmYWN0b3IpKTsKIAogICAgIC8qIEFkZCBzY2FsZWQgMC41IGZvciByb3VuZGluZzoKLSAgICAgICBXZSB1c2UgYSB2YWx1ZSAxMjgvMjU2IGluc3RlYWQgb2YgMC41IHRvIGF2b2lkIHNvbWUgY3JpdGljYWwgY2FzZXMgb2Ygcm91bmRpbmcuICovCi0gICAgdGVtcCA9IGV4YWN0ICsgIEZMMkZYQ09OU1RfU0dMKDEyOC4wLzMyNzY4LjApOworICAgICAgIFdlIHVzZSBhIHZhbHVlIDEyOC8yNTYgaW5zdGVhZCBvZiAwLjUgdG8gYXZvaWQgc29tZSBjcml0aWNhbCBjYXNlcyBvZgorICAgICAgIHJvdW5kaW5nLiAqLworICAgIHRlbXAgPSBleGFjdCArIEZMMkZYQ09OU1RfU0dMKDEyOC4wIC8gMzI3NjguMCk7CiAKICAgICAvKiBzY2FsZSBiYWNrIHRvIHJpZ2h0IGFsaW5nZWQgaW50ZWdlcjogKi8KLSAgICBjdXJyZW50ID0gKExPTkcpdGVtcCA+PiAoRlJBQ1RfQklUUy04KTsKKyAgICBjdXJyZW50ID0gKExPTkcpdGVtcCA+PiAoRlJBQ1RfQklUUyAtIDgpOwogCiAgICAgLyogU2F2ZSB3aWR0aCBvZiBiYW5kIGkgKi8KICAgICBkaWZmW2ldID0gcHJldmlvdXMgLSBjdXJyZW50OwpAQCAtNTU0LDIwICs2MDUsMTcgQEAKICAgfQogfQogCi0KIC8qIQogICBcYnJpZWYgICAgIENhbGN1bGF0ZSBjdW11bGF0ZWQgc3VtIHZlY3RvciBmcm9tIGRlbHRhIHZlY3RvcgogKi8KLXN0YXRpYyB2b2lkCi1jdW1TdW0oVUNIQVIgc3RhcnRfdmFsdWUsIFVDSEFSKiBkaWZmLCBVQ0hBUiBsZW5ndGgsIFVDSEFSICpzdGFydF9hZHJlc3MpCi17CitzdGF0aWMgdm9pZCBjdW1TdW0oVUNIQVIgc3RhcnRfdmFsdWUsIFVDSEFSICpkaWZmLCBVQ0hBUiBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgVUNIQVIgKnN0YXJ0X2FkcmVzcykgewogICBpbnQgaTsKLSAgc3RhcnRfYWRyZXNzWzBdPXN0YXJ0X3ZhbHVlOwotICBmb3IoaT0xOyBpPD1sZW5ndGg7IGkrKykKLSAgICBzdGFydF9hZHJlc3NbaV0gPSBzdGFydF9hZHJlc3NbaS0xXSArIGRpZmZbaS0xXTsKKyAgc3RhcnRfYWRyZXNzWzBdID0gc3RhcnRfdmFsdWU7CisgIGZvciAoaSA9IDE7IGkgPD0gbGVuZ3RoOyBpKyspCisgICAgc3RhcnRfYWRyZXNzW2ldID0gc3RhcnRfYWRyZXNzW2kgLSAxXSArIGRpZmZbaSAtIDFdOwogfQogCi0KIC8qIQogICBcYnJpZWYgICAgIEFkYXB0IHdpZHRoIG9mIGZyZXF1ZW5jeSBiYW5kcyBpbiB0aGUgc2Vjb25kIHJlZ2lvbgogCkBAIC01NzUsMTE2ICs2MjMsOTYgQEAKICAgaXMgY2FsY3VsYXRlZCBzZXBhcmF0ZWx5LiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGF2b2lkIHRoYXQgdGhlIHNlY29uZCByZWdpb24KICAgc3RhcnRzIHdpdGggYSBiYW5kIHNtYWxsZXIgdGhhbiB0aGUgaGlnaGVzdCBiYW5kIG9mIHRoZSBmaXJzdCByZWdpb24uCiAqLwotc3RhdGljIFNCUl9FUlJPUgotbW9kaWZ5QmFuZHMoVUNIQVIgbWF4X2JhbmRfcHJldmlvdXMsIFVDSEFSICogZGlmZiwgVUNIQVIgbGVuZ3RoKQoteworc3RhdGljIFNCUl9FUlJPUiBtb2RpZnlCYW5kcyhVQ0hBUiBtYXhfYmFuZF9wcmV2aW91cywgVUNIQVIgKmRpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGxlbmd0aCkgewogICBpbnQgY2hhbmdlID0gbWF4X2JhbmRfcHJldmlvdXMgLSBkaWZmWzBdOwogCi0gIC8qIExpbWl0IHRoZSBjaGFuZ2Ugc28gdGhhdCB0aGUgbGFzdCBiYW5kIGNhbm5vdCBnZXQgbmFycm93ZXIgdGhhbiB0aGUgZmlyc3Qgb25lICovCi0gIGlmICggY2hhbmdlID4gKGRpZmZbbGVuZ3RoLTFdLWRpZmZbMF0pPj4xICkKLSAgICBjaGFuZ2UgPSAoZGlmZltsZW5ndGgtMV0tZGlmZlswXSk+PjE7CisgIC8qIExpbWl0IHRoZSBjaGFuZ2Ugc28gdGhhdCB0aGUgbGFzdCBiYW5kIGNhbm5vdCBnZXQgbmFycm93ZXIgdGhhbiB0aGUgZmlyc3QKKyAgICogb25lICovCisgIGlmIChjaGFuZ2UgPiAoZGlmZltsZW5ndGggLSAxXSAtIGRpZmZbMF0pID4+IDEpCisgICAgY2hhbmdlID0gKGRpZmZbbGVuZ3RoIC0gMV0gLSBkaWZmWzBdKSA+PiAxOwogCiAgIGRpZmZbMF0gKz0gY2hhbmdlOwotICBkaWZmW2xlbmd0aC0xXSAtPSBjaGFuZ2U7CisgIGRpZmZbbGVuZ3RoIC0gMV0gLT0gY2hhbmdlOwogICBzaGVsbHNvcnQoZGlmZiwgbGVuZ3RoKTsKIAogICByZXR1cm4gU0JSREVDX09LOwogfQogCi0KIC8qIQogICBcYnJpZWYgICBVcGRhdGUgaGlnaCByZXNvbHV0aW9uIGZyZXF1ZW5jeSBiYW5kIHRhYmxlCiAqLwotc3RhdGljIHZvaWQKLXNicmRlY1VwZGF0ZUhpUmVzKFVDSEFSICogaF9oaXJlcywKLSAgICAgICAgICAgICAgICAgIFVDSEFSICogbnVtX2hpcmVzLAotICAgICAgICAgICAgICAgICAgVUNIQVIgKiB2X2tfbWFzdGVyLAotICAgICAgICAgICAgICAgICAgVUNIQVIgbnVtX2JhbmRzLAotICAgICAgICAgICAgICAgICAgVUNIQVIgeG92ZXJfYmFuZCkKLXsKK3N0YXRpYyB2b2lkIHNicmRlY1VwZGF0ZUhpUmVzKFVDSEFSICpoX2hpcmVzLCBVQ0hBUiAqbnVtX2hpcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsIFVDSEFSIG51bV9iYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIHhvdmVyX2JhbmQpIHsKICAgVUNIQVIgaTsKIAotICAqbnVtX2hpcmVzID0gbnVtX2JhbmRzLXhvdmVyX2JhbmQ7CisgICpudW1faGlyZXMgPSBudW1fYmFuZHMgLSB4b3Zlcl9iYW5kOwogCi0gIGZvcihpPXhvdmVyX2JhbmQ7IGk8PW51bV9iYW5kczsgaSsrKSB7Ci0gICAgaF9oaXJlc1tpLXhvdmVyX2JhbmRdID0gdl9rX21hc3RlcltpXTsKKyAgZm9yIChpID0geG92ZXJfYmFuZDsgaSA8PSBudW1fYmFuZHM7IGkrKykgeworICAgIGhfaGlyZXNbaSAtIHhvdmVyX2JhbmRdID0gdl9rX21hc3RlcltpXTsKICAgfQogfQogCi0KIC8qIQogICBcYnJpZWYgIEJ1aWxkIGxvdyByZXNvbHV0aW9uIHRhYmxlIG91dCBvZiBoaWdoIHJlc29sdXRpb24gdGFibGUKICovCi1zdGF0aWMgdm9pZAotc2JyZGVjVXBkYXRlTG9SZXMoVUNIQVIgKiBoX2xvcmVzLAotICAgICAgICAgICAgICAgICAgVUNIQVIgKiBudW1fbG9yZXMsCi0gICAgICAgICAgICAgICAgICBVQ0hBUiAqIGhfaGlyZXMsCi0gICAgICAgICAgICAgICAgICBVQ0hBUiBudW1faGlyZXMpCi17CitzdGF0aWMgdm9pZCBzYnJkZWNVcGRhdGVMb1JlcyhVQ0hBUiAqaF9sb3JlcywgVUNIQVIgKm51bV9sb3JlcywgVUNIQVIgKmhfaGlyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBudW1faGlyZXMpIHsKICAgVUNIQVIgaTsKIAotICBpZiggKG51bV9oaXJlcyAmIDEpID09IDApIHsKKyAgaWYgKChudW1faGlyZXMgJiAxKSA9PSAwKSB7CiAgICAgLyogSWYgZXZlbiBudW1iZXIgb2YgaGlyZXMgYmFuZHMgKi8KICAgICAqbnVtX2xvcmVzID0gbnVtX2hpcmVzID4+IDE7CiAgICAgLyogVXNlIGV2ZXJ5IHNlY29uZCBsb3Jlcz1oaXJlc1swLDIsNC4uLl0gKi8KLSAgICBmb3IoaT0wOyBpPD0qbnVtX2xvcmVzOyBpKyspCi0gICAgICBoX2xvcmVzW2ldID0gaF9oaXJlc1tpKjJdOwotICB9Ci0gIGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPD0gKm51bV9sb3JlczsgaSsrKSBoX2xvcmVzW2ldID0gaF9oaXJlc1tpICogMl07CisgIH0gZWxzZSB7CiAgICAgLyogT2RkIG51bWJlciBvZiBoaXJlcywgd2hpY2ggbWVhbnMgeG92ZXIgaXMgb2RkICovCi0gICAgKm51bV9sb3JlcyA9IChudW1faGlyZXMrMSkgPj4gMTsKKyAgICAqbnVtX2xvcmVzID0gKG51bV9oaXJlcyArIDEpID4+IDE7CiAgICAgLyogVXNlIGxvcmVzPWhpcmVzWzAsMSwzLDUgLi4uXSAqLwogICAgIGhfbG9yZXNbMF0gPSBoX2hpcmVzWzBdOwotICAgIGZvcihpPTE7IGk8PSpudW1fbG9yZXM7IGkrKykgewotICAgICAgaF9sb3Jlc1tpXSA9IGhfaGlyZXNbaSoyLTFdOworICAgIGZvciAoaSA9IDE7IGkgPD0gKm51bV9sb3JlczsgaSsrKSB7CisgICAgICBoX2xvcmVzW2ldID0gaF9oaXJlc1tpICogMiAtIDFdOwogICAgIH0KICAgfQogfQogCi0KIC8qIQotICBcYnJpZWYgICBEZXJpdmUgYSBsb3ctcmVzb2x1dGlvbiBmcmVxdWVuY3ktdGFibGUgZnJvbSB0aGUgbWFzdGVyIGZyZXF1ZW5jeSB0YWJsZQorICBcYnJpZWYgICBEZXJpdmUgYSBsb3ctcmVzb2x1dGlvbiBmcmVxdWVuY3ktdGFibGUgZnJvbSB0aGUgbWFzdGVyIGZyZXF1ZW5jeQorICB0YWJsZQogKi8KLXZvaWQKLXNicmRlY0Rvd25TYW1wbGVMb1JlcyhVQ0hBUiAqdl9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbnVtX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZVJlZiwKLSAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBudW1fUmVmKQotewordm9pZCBzYnJkZWNEb3duU2FtcGxlTG9SZXMoVUNIQVIgKnZfcmVzdWx0LCBVQ0hBUiBudW1fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmZyZXFCYW5kVGFibGVSZWYsIFVDSEFSIG51bV9SZWYpIHsKICAgaW50IHN0ZXA7Ci0gIGludCBpLGo7Ci0gIGludCBvcmdfbGVuZ3RoLHJlc3VsdF9sZW5ndGg7Ci0gIGludCB2X2luZGV4W01BWF9GUkVRX0NPRUZGUz4+MV07CisgIGludCBpLCBqOworICBpbnQgb3JnX2xlbmd0aCwgcmVzdWx0X2xlbmd0aDsKKyAgaW50IHZfaW5kZXhbTUFYX0ZSRVFfQ09FRkZTID4+IDFdOwogCiAgIC8qIGluaXQgKi8KICAgb3JnX2xlbmd0aCA9IG51bV9SZWY7CiAgIHJlc3VsdF9sZW5ndGggPSBudW1fcmVzdWx0OwogCi0gIHZfaW5kZXhbMF0gPSAwOyAgIC8qIEFsd2F5cyB1c2UgbGVmdCBib3JkZXIgKi8KLSAgaT0wOwotICB3aGlsZShvcmdfbGVuZ3RoID4gMCkgeworICB2X2luZGV4WzBdID0gMDsgLyogQWx3YXlzIHVzZSBsZWZ0IGJvcmRlciAqLworICBpID0gMDsKKyAgd2hpbGUgKG9yZ19sZW5ndGggPiAwKSB7CiAgICAgLyogQ3JlYXRlIGRvd25zYW1wbGUgdmVjdG9yICovCiAgICAgaSsrOwogICAgIHN0ZXAgPSBvcmdfbGVuZ3RoIC8gcmVzdWx0X2xlbmd0aDsKICAgICBvcmdfbGVuZ3RoID0gb3JnX2xlbmd0aCAtIHN0ZXA7CiAgICAgcmVzdWx0X2xlbmd0aC0tOwotICAgIHZfaW5kZXhbaV0gPSB2X2luZGV4W2ktMV0gKyBzdGVwOworICAgIHZfaW5kZXhbaV0gPSB2X2luZGV4W2kgLSAxXSArIHN0ZXA7CiAgIH0KIAotICBmb3Ioaj0wO2o8PWk7aisrKSB7CisgIGZvciAoaiA9IDA7IGogPD0gaTsgaisrKSB7CiAgICAgLyogVXNlIGRvd25zYW1wbGUgdmVjdG9yIHRvIGluZGV4IExvUmVzb2x1dGlvbiB2ZWN0b3IgKi8KLSAgICB2X3Jlc3VsdFtqXT1mcmVxQmFuZFRhYmxlUmVmW3ZfaW5kZXhbal1dOworICAgIHZfcmVzdWx0W2pdID0gZnJlcUJhbmRUYWJsZVJlZlt2X2luZGV4W2pdXTsKICAgfQotCiB9CiAKLQogLyohCiAgIFxicmllZiAgIFNvcnRpbmcgcm91dGluZQogKi8KLXZvaWQgc2hlbGxzb3J0KFVDSEFSICppbiwgVUNIQVIgbikKLXsKLQordm9pZCBzaGVsbHNvcnQoVUNIQVIgKmluLCBVQ0hBUiBuKSB7CiAgIGludCBpLCBqLCB2LCB3OwogICBpbnQgaW5jID0gMTsKIApAQCAtNjk3LDExNSArNzI1LDExMCBAQAogICAgIGZvciAoaSA9IGluYzsgaSA8IG47IGkrKykgewogICAgICAgdiA9IGluW2ldOwogICAgICAgaiA9IGk7Ci0gICAgICB3aGlsZSAoKHc9aW5bai1pbmNdKSA+IHYpIHsKKyAgICAgIHdoaWxlICgodyA9IGluW2ogLSBpbmNdKSA+IHYpIHsKICAgICAgICAgaW5bal0gPSB3OwogICAgICAgICBqIC09IGluYzsKLSAgICAgICAgaWYgKGogPCBpbmMpCi0gICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChqIDwgaW5jKSBicmVhazsKICAgICAgIH0KICAgICAgIGluW2pdID0gdjsKICAgICB9CiAgIH0gd2hpbGUgKGluYyA+IDEpOwotCiB9CiAKLQotCiAvKiEKICAgXGJyaWVmICAgUmVzZXQgZnJlcXVlbmN5IGJhbmQgdGFibGVzCiAgIFxyZXR1cm4gIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCiAqLwogU0JSX0VSUk9SCi1yZXNldEZyZXFCYW5kVGFibGVzKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIGNvbnN0IFVJTlQgZmxhZ3MpCi17CityZXNldEZyZXFCYW5kVGFibGVzKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIGNvbnN0IFVJTlQgZmxhZ3MpIHsKICAgU0JSX0VSUk9SIGVyciA9IFNCUkRFQ19PSzsKLSAgaW50IGsyLGt4LCBsc2IsIHVzYjsKLSAgaW50ICAgICBpbnRUZW1wOwotICBVQ0hBUiAgICBuQmFuZHNMbywgbkJhbmRzSGk7CisgIGludCBrMiwga3gsIGxzYiwgdXNiOworICBpbnQgaW50VGVtcDsKKyAgVUNIQVIgbkJhbmRzTG8sIG5CYW5kc0hpOwogICBIQU5ETEVfRlJFUV9CQU5EX0RBVEEgaEZyZXEgPSAmaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YTsKIAogICAvKiBDYWxjdWxhdGUgbWFzdGVyIGZyZXF1ZW5jeSBmdW5jdGlvbiAqLwotICBlcnIgPSBzYnJkZWNVcGRhdGVGcmVxU2NhbGUoaEZyZXEtPnZfa19tYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEZyZXEtPm51bU1hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5zYnJQcm9jU21wbFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgZXJyID0gc2JyZGVjVXBkYXRlRnJlcVNjYWxlKGhGcmVxLT52X2tfbWFzdGVyLCAmaEZyZXEtPm51bU1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5zYnJQcm9jU21wbFJhdGUsIGhIZWFkZXJEYXRhLCBmbGFncyk7CiAKLSAgaWYgKCBlcnIgfHwgKGhIZWFkZXJEYXRhLT5ic19pbmZvLnhvdmVyX2JhbmQgPiBoRnJlcS0+bnVtTWFzdGVyKSApIHsKKyAgaWYgKGVyciB8fCAoaEhlYWRlckRhdGEtPmJzX2luZm8ueG92ZXJfYmFuZCA+IGhGcmVxLT5udW1NYXN0ZXIpKSB7CiAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgIH0KIAogICAvKiBEZXJpdmUgSGlyZXNvbHV0aW9uIGZyb20gbWFzdGVyIGZyZXF1ZW5jeSBmdW5jdGlvbiAqLwotICBzYnJkZWNVcGRhdGVIaVJlcyhoRnJlcS0+ZnJlcUJhbmRUYWJsZVsxXSwgJm5CYW5kc0hpLCBoRnJlcS0+dl9rX21hc3RlciwgaEZyZXEtPm51bU1hc3RlciwgaEhlYWRlckRhdGEtPmJzX2luZm8ueG92ZXJfYmFuZCApOworICBzYnJkZWNVcGRhdGVIaVJlcyhoRnJlcS0+ZnJlcUJhbmRUYWJsZVsxXSwgJm5CYW5kc0hpLCBoRnJlcS0+dl9rX21hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgaEZyZXEtPm51bU1hc3RlciwgaEhlYWRlckRhdGEtPmJzX2luZm8ueG92ZXJfYmFuZCk7CiAgIC8qIERlcml2ZSBMb3Jlc29sdXRpb24gZnJvbSBIaXJlc29sdXRpb24gKi8KLSAgc2JyZGVjVXBkYXRlTG9SZXMoaEZyZXEtPmZyZXFCYW5kVGFibGVbMF0sICZuQmFuZHNMbywgaEZyZXEtPmZyZXFCYW5kVGFibGVbMV0sIG5CYW5kc0hpKTsKLQorICBzYnJkZWNVcGRhdGVMb1JlcyhoRnJlcS0+ZnJlcUJhbmRUYWJsZVswXSwgJm5CYW5kc0xvLCBoRnJlcS0+ZnJlcUJhbmRUYWJsZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgbkJhbmRzSGkpOwogCiAgIGhGcmVxLT5uU2ZiWzBdID0gbkJhbmRzTG87CiAgIGhGcmVxLT5uU2ZiWzFdID0gbkJhbmRzSGk7CiAKICAgLyogQ2hlY2sgaW5kZXggdG8gZnJlcUJhbmRUYWJsZVswXSAqLwotICBpZiAoICEobkJhbmRzTG8gPiAwKSB8fCAobkJhbmRzTG8gPiAoTUFYX0ZSRVFfQ09FRkZTPj4xKSkgKSB7CisgIGlmICghKG5CYW5kc0xvID4gMCkgfHwKKyAgICAgIChuQmFuZHNMbyA+ICgoKGhIZWFkZXJEYXRhLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMgPT0gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICA/IE1BWF9GUkVRX0NPRUZGU19RVUFEX1JBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIDogTUFYX0ZSRVFfQ09FRkZTX0RVQUxfUkFURSkgPj4KKyAgICAgICAgICAgICAgICAgICAxKSkpIHsKICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgfQogCiAgIGxzYiA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlWzBdWzBdOwogICB1c2IgPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZVswXVtuQmFuZHNMb107CiAKLSAgLyogQWRkaXRpb25hbCBjaGVjayBmb3IgbHNiICovCi0gIGlmICggKGxzYiA+ICgzMikpIHx8IChsc2IgPj0gdXNiKSApIHsKKyAgLyogQ2hlY2sgZm9yIHN0YXJ0IGZyZXF1ZW5jeSBib3JkZXIga194OgorICAgICAtIElTTy9JRUMgMTQ0OTYtMyA0LjYuMTguMy42IFJlcXVpcmVtZW50cworICAgICAtIElTTy9JRUMgMjMwMDMtMyA3LjUuNS4yICAgIE1vZGlmaWNhdGlvbnMgYW5kIGFkZGl0aW9ucyB0byB0aGUgTVBFRy00IFNCUgorICAgICB0b29sCisgICovCisgIC8qIE5vdGUgdGhhdCBsc2IgPiBhcyBoSGVhZGVyRGF0YS0+bnVtYmVyT2ZBbmFseXNpc0JhbmRzIGlzIGEgdmFsaWQgU0JSIGNvbmZpZworICAgKiBmb3IgMjQgYmFuZCBRTUYgYW5hbHlzaXMuICovCisgIGlmICgobHNiID4gKChmbGFncyAmIFNCUkRFQ19RVUFEX1JBVEUpID8gMTYgOiAoMzIpKSkgfHwgKGxzYiA+PSB1c2IpKSB7CiAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgIH0KIAotCiAgIC8qIENhbGN1bGF0ZSBudW1iZXIgb2Ygbm9pc2UgYmFuZHMgKi8KIAogICBrMiA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlWzFdW25CYW5kc0hpXTsKICAga3ggPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZVsxXVswXTsKIAotICBpZiAoaEhlYWRlckRhdGEtPmJzX2RhdGEubm9pc2VfYmFuZHMgPT0gMCkKLSAgeworICBpZiAoaEhlYWRlckRhdGEtPmJzX2RhdGEubm9pc2VfYmFuZHMgPT0gMCkgewogICAgIGhGcmVxLT5uTmZiID0gMTsKLSAgfQotICBlbHNlIC8qIENhbGN1bGF0ZSBubyBvZiBub2lzZSBiYW5kcyAxLDIgb3IgMyBiYW5kcy9vY3RhdmUgKi8KKyAgfSBlbHNlIC8qIENhbGN1bGF0ZSBubyBvZiBub2lzZSBiYW5kcyAxLDIgb3IgMyBiYW5kcy9vY3RhdmUgKi8KICAgewogICAgIC8qIEZldGNoIG51bWJlciBvZiBvY3RhdmVzIGRpdmlkZWQgYnkgMzIgKi8KLSAgICBpbnRUZW1wID0gKExPTkcpRkRLX2dldE51bU9jdGF2ZXNEaXY4KGt4LGsyKSA+PiAyOworICAgIGludFRlbXAgPSAoTE9ORylGREtfZ2V0TnVtT2N0YXZlc0Rpdjgoa3gsIGsyKSA+PiAyOwogCiAgICAgLyogSW50ZWdlci1NdWx0aXBsaWNhdGlvbiB3aXRoIG51bWJlciBvZiBiYW5kczogKi8KICAgICBpbnRUZW1wID0gaW50VGVtcCAqIGhIZWFkZXJEYXRhLT5ic19kYXRhLm5vaXNlX2JhbmRzOwogCiAgICAgLyogQWRkIHNjYWxlZCAwLjUgZm9yIHJvdW5kaW5nOiAqLwotICAgIGludFRlbXAgPSBpbnRUZW1wICsgKExPTkcpRkwyRlhDT05TVF9TR0woMC41Zi8zMi4wZik7CisgICAgaW50VGVtcCA9IGludFRlbXAgKyAoTE9ORylGTDJGWENPTlNUX1NHTCgwLjVmIC8gMzIuMGYpOwogCiAgICAgLyogQ29udmVydCB0byByaWdodC1hbGlnbmVkIGludGVnZXI6ICovCiAgICAgaW50VGVtcCA9IGludFRlbXAgPj4gKEZSQUNUX0JJVFMgLSAxIC8qc2lnbiovIC0gNSAvKiByZXNjYWxlICovKTsKIAotICAgIC8qIENvbXBhcmUgd2l0aCBmbG9hdCBjYWxjdWxhdGlvbiAqLwotICAgIEZES19BU1NFUlQoIGludFRlbXAgPT0gIChpbnQpKChoSGVhZGVyRGF0YS0+YnNfZGF0YS5ub2lzZV9iYW5kcyAqIEZES2xvZyggKGZsb2F0KWsyL2t4KSAvIChmbG9hdCkoRkRLbG9nKDIuMCkpKSswLjUpICk7Ci0KLSAgICBpZiggaW50VGVtcD09MCkKLSAgICAgIGludFRlbXA9MTsKKyAgICBpZiAoaW50VGVtcCA9PSAwKSBpbnRUZW1wID0gMTsKIAogICAgIGhGcmVxLT5uTmZiID0gaW50VGVtcDsKICAgfQogCiAgIGhGcmVxLT5uSW52ZkJhbmRzID0gaEZyZXEtPm5OZmI7CiAKLSAgaWYoIGhGcmVxLT5uTmZiID4gTUFYX05PSVNFX0NPRUZGUyApIHsKKyAgaWYgKGhGcmVxLT5uTmZiID4gTUFYX05PSVNFX0NPRUZGUykgewogICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICB9CiAKICAgLyogR2V0IG5vaXNlIGJhbmRzICovCi0gIHNicmRlY0Rvd25TYW1wbGVMb1JlcyhoRnJlcS0+ZnJlcUJhbmRUYWJsZU5vaXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgaEZyZXEtPm5OZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICBoRnJlcS0+ZnJlcUJhbmRUYWJsZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5CYW5kc0xvKTsKKyAgc2JyZGVjRG93blNhbXBsZUxvUmVzKGhGcmVxLT5mcmVxQmFuZFRhYmxlTm9pc2UsIGhGcmVxLT5uTmZiLAorICAgICAgICAgICAgICAgICAgICAgICAgaEZyZXEtPmZyZXFCYW5kVGFibGVbMF0sIG5CYW5kc0xvKTsKIAorICAvKiBzYXZlIG9sZCBoaWdoYmFuZDsgcmVxdWlyZWQgZm9yIG92ZXJsYXAgaW4gdXNhYworICAgICB3aGVuIGhlYWRlcmNoYW5nZSBvY2N1cnMgYXQgWFZBUiBhbmQgVkFSWCBmcmFtZTsgKi8KKyAgaEZyZXEtPm92X2hpZ2hTdWJiYW5kID0gaEZyZXEtPmhpZ2hTdWJiYW5kOwogCi0KLQotICBoRnJlcS0+bG93U3ViYmFuZCAgPSBsc2I7CisgIGhGcmVxLT5sb3dTdWJiYW5kID0gbHNiOwogICBoRnJlcS0+aGlnaFN1YmJhbmQgPSB1c2I7CiAKICAgcmV0dXJuIFNCUkRFQ19PSzsKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2ZyZXFfc2NhLmggYi9saWJTQlJkZWMvc3JjL3NicmRlY19mcmVxX3NjYS5oCmluZGV4IGNmZTRmMGUuLjdlNmI4ZTggMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2ZyZXFfc2NhLmgKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJkZWNfZnJlcV9zY2EuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyMiArOTAsMzEgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICAgRnJlcXVlbmN5IHNjYWxlIHByb3RvdHlwZXMgIAorICBcYnJpZWYgICBGcmVxdWVuY3kgc2NhbGUgcHJvdG90eXBlcwogKi8KLSNpZm5kZWYgX19GUkVRX1NDQV9ICi0jZGVmaW5lIF9fRlJFUV9TQ0FfSAorI2lmbmRlZiBTQlJERUNfRlJFUV9TQ0FfSAorI2RlZmluZSBTQlJERUNfRlJFUV9TQ0FfSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogI2luY2x1ZGUgImVudl9leHRyLmgiCiAKLWludAotc2JyZGVjVXBkYXRlRnJlcVNjYWxlKFVDSEFSICogdl9rX21hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqbnVtTWFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaGVhZGVyRGF0YSk7Cit0eXBlZGVmIGVudW0geyBEVUFMLCBRVUFEIH0gU0JSX1JBVEU7CisKK1NCUl9FUlJPUgorc2JyZGVjVXBkYXRlRnJlcVNjYWxlKFVDSEFSICp2X2tfbWFzdGVyLCBVQ0hBUiAqbnVtTWFzdGVyLCBVSU5UIGZzLAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaGVhZGVyRGF0YSwgVUlOVCBmbGFncyk7CiAKIHZvaWQgc2JyZGVjRG93blNhbXBsZUxvUmVzKFVDSEFSICp2X3Jlc3VsdCwgVUNIQVIgbnVtX3Jlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlUmVmLCBVQ0hBUiBudW1fUmVmKTsKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyZGVjb2Rlci5jcHAgYi9saWJTQlJkZWMvc3JjL3NicmRlY29kZXIuY3BwCmluZGV4IGY5ZGVkNTQuLmUyNDU1ZGEgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyZGVjb2Rlci5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJkZWNvZGVyLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzOCArOTAsNDggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKICAgXGJyaWVmICBTQlIgZGVjb2RlciBmcm9udGVuZAotICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGZyb250ZW5kIHRvIHRoZSBTQlIgZGVjb2Rlci4gVGhlIGZ1bmN0aW9uIG9wZW5TQlIoKSBpcyBjYWxsZWQgZm9yCi0gIGluaXRpYWxpemF0aW9uLiBUaGUgZnVuY3Rpb24gc2JyRGVjb2Rlcl9BcHBseSgpIGlzIGNhbGxlZCBmb3IgZWFjaCBmcmFtZS4gc2JyX0FwcGx5KCkgd2lsbCBjYWxsIHRoZQotICByZXF1aXJlZCBmdW5jdGlvbnMgdG8gZGVjb2RlIHRoZSByYXcgU0JSIGRhdGEgKHByb3ZpZGVkIGJ5IGVudl9leHRyLmNwcCksIHRvIGRlY29kZSB0aGUgZW52ZWxvcGUgZGF0YSBhbmQgbm9pc2UgZmxvb3IgbGV2ZWxzIFtkZWNvZGVTYnJEYXRhKCldLAotICBhbmQgdG8gZmluYWxseSBhcHBseSBTQlIgdG8gdGhlIGN1cnJlbnQgZnJhbWUgW3Nicl9kZWMoKV0uCisgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZnJvbnRlbmQgdG8gdGhlIFNCUiBkZWNvZGVyLiBUaGUgZnVuY3Rpb24gb3BlblNCUigpIGlzCisgIGNhbGxlZCBmb3IgaW5pdGlhbGl6YXRpb24uIFRoZSBmdW5jdGlvbiBzYnJEZWNvZGVyX0FwcGx5KCkgaXMgY2FsbGVkIGZvciBlYWNoCisgIGZyYW1lLiBzYnJfQXBwbHkoKSB3aWxsIGNhbGwgdGhlIHJlcXVpcmVkIGZ1bmN0aW9ucyB0byBkZWNvZGUgdGhlIHJhdyBTQlIgZGF0YQorICAocHJvdmlkZWQgYnkgZW52X2V4dHIuY3BwKSwgdG8gZGVjb2RlIHRoZSBlbnZlbG9wZSBkYXRhIGFuZCBub2lzZSBmbG9vciBsZXZlbHMKKyAgW2RlY29kZVNickRhdGEoKV0sIGFuZCB0byBmaW5hbGx5IGFwcGx5IFNCUiB0byB0aGUgY3VycmVudCBmcmFtZSBbc2JyX2RlYygpXS4KIAogICBcc2Egc2JyRGVjb2Rlcl9BcHBseSgpLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldwogKi8KIAogLyohCi0gIFxwYWdlIGRvY3VtZW50YXRpb25PdmVydmlldyBPdmVydmlldyBvZiBpbXBvcnRhbnQgaW5mb3JtYXRpb24gcmVzb3VyY2VzIGFuZCBzb3VyY2UgY29kZSBkb2N1bWVudGF0aW9uCisgIFxwYWdlIGRvY3VtZW50YXRpb25PdmVydmlldyBPdmVydmlldyBvZiBpbXBvcnRhbnQgaW5mb3JtYXRpb24gcmVzb3VyY2VzIGFuZAorICBzb3VyY2UgY29kZSBkb2N1bWVudGF0aW9uCiAKLSAgVGhlIHByaW1hcnkgc291cmNlIGNvZGUgZG9jdW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBnZW5lcmF0ZWQgYW5kIGNyb3NzLXJlZmVyZW5jZWQgSFRNTCBmaWxlcyB1c2luZwotICA8YSBIUkVGPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnIj5kb3h5Z2VuPC9hPi4gQXMgcGFydCBvZiB0aGlzIGRvY3VtZW50YXRpb24KLSAgeW91IGNhbiBmaW5kIG1vcmUgZXh0ZW5zaXZlIGRlc2NyaXB0aW9ucyBhYm91dCBrZXkgY29uY2VwdHMgYW5kIGFsZ29yaXRobXMgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgIEFzIHBhcnQgb2YgdGhpcyBkb2N1bWVudGF0aW9uIHlvdSBjYW4gZmluZCBtb3JlIGV4dGVuc2l2ZSBkZXNjcmlwdGlvbnMgYWJvdXQKKyAga2V5IGNvbmNlcHRzIGFuZCBhbGdvcml0aG1zIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCiAgIDxoMj5Qcm9ncmFtbWluZzwvaDI+CiAKICAgXGxpIEJ1ZmZlciBtYW5hZ2VtZW50OiBzYnJEZWNvZGVyX0FwcGx5KCkgYW5kIHNicl9kZWMoKQotICBcbGkgSW50ZXJuYWwgc2NhbGUgZmFjdG9ycyB0byBtYXhpbWl6ZSBTTlIgb24gZml4ZWQgcG9pbnQgcHJvY2Vzc29yczogI1FNRl9TQ0FMRV9GQUNUT1IKLSAgXGxpIFNwZWNpYWwgbWFudGlzc2EtZXhwb25lbnQgZm9ybWF0OiBDcmVhdGVkIGluIHJlcXVhbnRpemVFbnZlbG9wZURhdGEoKSBhbmQgdXNlZCBpbiBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpCisgIFxsaSBJbnRlcm5hbCBzY2FsZSBmYWN0b3JzIHRvIG1heGltaXplIFNOUiBvbiBmaXhlZCBwb2ludCBwcm9jZXNzb3JzOgorICAjUU1GX1NDQUxFX0ZBQ1RPUiBcbGkgU3BlY2lhbCBtYW50aXNzYS1leHBvbmVudCBmb3JtYXQ6IENyZWF0ZWQgaW4KKyAgcmVxdWFudGl6ZUVudmVsb3BlRGF0YSgpIGFuZCB1c2VkIGluIGNhbGN1bGF0ZVNickVudmVsb3BlKCkKIAogICA8aDI+QWxnb3JpdGhtaWMgZGV0YWlsczwvaDI+Ci0gIFxsaSBBYm91dCB0aGUgU0JSIGRhdGEgZm9ybWF0OiBccmVmIFNCUl9IRUFERVJfRUxFTUVOVCBhbmQgXHJlZiBTQlJfU1RBTkRBUkRfRUxFTUVOVAotICBcbGkgRGV0YWlscyBhYm91dCB0aGUgYml0c3RyZWFtIGRlY29kZXI6IGVudl9leHRyLmNwcAotICBcbGkgRGV0YWlscyBhYm91dCB0aGUgUU1GIGZpbHRlcmJhbmsgYW5kIHRoZSBwcm92aWRlZCBwb2x5cGhhc2UgaW1wbGVtZW50YXRpb246IHFtZl9kZWMuY3BwCi0gIFxsaSBEZXRhaWxzIGFib3V0IHRoZSB0cmFuc3Bvc2VyOiBscHBfdHJhbi5jcHAKLSAgXGxpIERldGFpbHMgYWJvdXQgdGhlIGVudmVsb3BlIGFkanVzdGVyOiBlbnZfY2FsYy5jcHAKKyAgXGxpIEFib3V0IHRoZSBTQlIgZGF0YSBmb3JtYXQ6IFxyZWYgU0JSX0hFQURFUl9FTEVNRU5UIGFuZCBccmVmCisgIFNCUl9TVEFOREFSRF9FTEVNRU5UIFxsaSBEZXRhaWxzIGFib3V0IHRoZSBiaXRzdHJlYW0gZGVjb2RlcjogZW52X2V4dHIuY3BwIFxsaQorICBEZXRhaWxzIGFib3V0IHRoZSBRTUYgZmlsdGVyYmFuayBhbmQgdGhlIHByb3ZpZGVkIHBvbHlwaGFzZSBpbXBsZW1lbnRhdGlvbjoKKyAgcW1mX2RlYy5jcHAgXGxpIERldGFpbHMgYWJvdXQgdGhlIHRyYW5zcG9zZXI6IGxwcF90cmFuLmNwcCBcbGkgRGV0YWlscyBhYm91dAorICB0aGUgZW52ZWxvcGUgYWRqdXN0ZXI6IGVudl9jYWxjLmNwcAogCiAqLwogCkBAIC0xMzQsMTEgKzE1NSwxMCBAQAogCiAjaW5jbHVkZSAicHNiaXRkZWMuaCIKIAotCiAvKiBEZWNvZGVyIGxpYnJhcnkgaW5mbyAqLwotI2RlZmluZSBTQlJERUNPREVSX0xJQl9WTDAgMgotI2RlZmluZSBTQlJERUNPREVSX0xJQl9WTDEgMgotI2RlZmluZSBTQlJERUNPREVSX0xJQl9WTDIgMTIKKyNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwwIDMKKyNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwxIDAKKyNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwyIDAKICNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVElUTEUgIlNCUiBEZWNvZGVyIgogI2lmZGVmIF9fQU5EUk9JRF9fCiAjZGVmaW5lIFNCUkRFQ09ERVJfTElCX0JVSUxEX0RBVEUgIiIKQEAgLTE0OCwyMCArMTY4LDI4IEBACiAjZGVmaW5lIFNCUkRFQ09ERVJfTElCX0JVSUxEX1RJTUUgX19USU1FX18KICNlbmRpZgogCitzdGF0aWMgdm9pZCBzZXRGcmFtZUVycm9yRmxhZyhTQlJfREVDT0RFUl9FTEVNRU5UICpwU2JyRWxlbWVudCwgVUNIQVIgdmFsdWUpIHsKKyAgaWYgKHBTYnJFbGVtZW50ICE9IE5VTEwpIHsKKyAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICBjYXNlIEZSQU1FX0VSUk9SX0FMTFNMT1RTOgorICAgICAgICBGREttZW1zZXQocFNickVsZW1lbnQtPmZyYW1lRXJyb3JGbGFnLCBGUkFNRV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgIHNpemVvZihwU2JyRWxlbWVudC0+ZnJhbWVFcnJvckZsYWcpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBwU2JyRWxlbWVudC0+ZnJhbWVFcnJvckZsYWdbcFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF0gPSB2YWx1ZTsKKyAgICB9CisgIH0KK30KIAotCi0KLXN0YXRpYyBVQ0hBUiBnZXRIZWFkZXJTbG90KCBVQ0hBUiBjdXJyZW50U2xvdCwgVUNIQVIgaGRyU2xvdFVzYWdlWygxKSsxXSApCi17Ci0gIFVJTlQgIG9jY3VwaWVkID0gMDsKLSAgaW50ICAgczsKK3N0YXRpYyBVQ0hBUiBnZXRIZWFkZXJTbG90KFVDSEFSIGN1cnJlbnRTbG90LCBVQ0hBUiBoZHJTbG90VXNhZ2VbKDEpICsgMV0pIHsKKyAgVUlOVCBvY2N1cGllZCA9IDA7CisgIGludCBzOwogICBVQ0hBUiBzbG90ID0gaGRyU2xvdFVzYWdlW2N1cnJlbnRTbG90XTsKIAotICBGREtfQVNTRVJUKCgxKSsxIDwgMzIpOworICBGREtfQVNTRVJUKCgxKSArIDEgPCAzMik7CiAKLSAgZm9yIChzID0gMDsgcyA8ICgxKSsxOyBzKyspIHsKLSAgICBpZiAoIChoZHJTbG90VXNhZ2Vbc10gPT0gc2xvdCkKLSAgICAgICYmIChzICE9IHNsb3QpICkgeworICBmb3IgKHMgPSAwOyBzIDwgKDEpICsgMTsgcysrKSB7CisgICAgaWYgKChoZHJTbG90VXNhZ2Vbc10gPT0gc2xvdCkgJiYgKHMgIT0gc2xvdCkpIHsKICAgICAgIG9jY3VwaWVkID0gMTsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTE3MCwxMSArMTk4LDExIEBACiAgIGlmIChvY2N1cGllZCkgewogICAgIG9jY3VwaWVkID0gMDsKIAotICAgIGZvciAocyA9IDA7IHMgPCAoMSkrMTsgcysrKSB7CisgICAgZm9yIChzID0gMDsgcyA8ICgxKSArIDE7IHMrKykgewogICAgICAgb2NjdXBpZWQgfD0gMSA8PCBoZHJTbG90VXNhZ2Vbc107CiAgICAgfQotICAgIGZvciAocyA9IDA7IHMgPCAoMSkrMTsgcysrKSB7Ci0gICAgICBpZiAoICEob2NjdXBpZWQgJiAweDEpICkgeworICAgIGZvciAocyA9IDA7IHMgPCAoMSkgKyAxOyBzKyspIHsKKyAgICAgIGlmICghKG9jY3VwaWVkICYgMHgxKSkgewogICAgICAgICBzbG90ID0gczsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0xODUsMTggKzIxMywxOCBAQAogICByZXR1cm4gc2xvdDsKIH0KIAotc3RhdGljIHZvaWQgY29weVNickhlYWRlciggSEFORExFX1NCUl9IRUFERVJfREFUQSBoRHN0LCBjb25zdCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhTcmMgKQoteworc3RhdGljIHZvaWQgY29weVNickhlYWRlcihIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaFNyYykgewogICAvKiBjb3B5IHRoZSB3aG9sZSBoZWFkZXIgbWVtb3J5IChpbmNsdWRpbmcgcG9pbnRlcnMpICovCi0gIEZES21lbWNweSggaERzdCwgaFNyYywgc2l6ZW9mKFNCUl9IRUFERVJfREFUQSkgKTsKKyAgRkRLbWVtY3B5KGhEc3QsIGhTcmMsIHNpemVvZihTQlJfSEVBREVSX0RBVEEpKTsKIAogICAvKiB1cGRhdGUgcG9pbnRlcnMgKi8KLSAgaERzdC0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVbMF0gID0gaERzdC0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVMbzsKKyAgaERzdC0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVbMF0gPSBoRHN0LT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZUxvOwogICBoRHN0LT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZVsxXSA9IGhEc3QtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlSGk7CiB9CiAKLXN0YXRpYyBpbnQgY29tcGFyZVNickhlYWRlciggY29uc3QgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGRyMSwgY29uc3QgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGRyMiApCi17CitzdGF0aWMgaW50IGNvbXBhcmVTYnJIZWFkZXIoY29uc3QgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZHIyKSB7CiAgIGludCByZXN1bHQgPSAwOwogCiAgIC8qIGNvbXBhcmUgYmFzaWMgZGF0YSAqLwpAQCAtMjA0LDI1ICsyMzIsMzggQEAKICAgcmVzdWx0IHw9IChoSGRyMS0+c3RhdHVzICE9IGhIZHIyLT5zdGF0dXMpID8gMSA6IDA7CiAgIHJlc3VsdCB8PSAoaEhkcjEtPmZyYW1lRXJyb3JGbGFnICE9IGhIZHIyLT5mcmFtZUVycm9yRmxhZykgPyAxIDogMDsKICAgcmVzdWx0IHw9IChoSGRyMS0+bnVtYmVyVGltZVNsb3RzICE9IGhIZHIyLT5udW1iZXJUaW1lU2xvdHMpID8gMSA6IDA7Ci0gIHJlc3VsdCB8PSAoaEhkcjEtPm51bWJlck9mQW5hbHlzaXNCYW5kcyAhPSBoSGRyMi0+bnVtYmVyT2ZBbmFseXNpc0JhbmRzKSA/IDEgOiAwOworICByZXN1bHQgfD0KKyAgICAgIChoSGRyMS0+bnVtYmVyT2ZBbmFseXNpc0JhbmRzICE9IGhIZHIyLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMpID8gMSA6IDA7CiAgIHJlc3VsdCB8PSAoaEhkcjEtPnRpbWVTdGVwICE9IGhIZHIyLT50aW1lU3RlcCkgPyAxIDogMDsKICAgcmVzdWx0IHw9IChoSGRyMS0+c2JyUHJvY1NtcGxSYXRlICE9IGhIZHIyLT5zYnJQcm9jU21wbFJhdGUpID8gMSA6IDA7CiAKICAgLyogY29tcGFyZSBiaXRzdHJlYW0gZGF0YSAqLwotICByZXN1bHQgfD0gRkRLbWVtY21wKCAmaEhkcjEtPmJzX2RhdGEsICZoSGRyMi0+YnNfZGF0YSwgc2l6ZW9mKFNCUl9IRUFERVJfREFUQV9CUykgKTsKLSAgcmVzdWx0IHw9IEZES21lbWNtcCggJmhIZHIxLT5ic19pbmZvLCAmaEhkcjItPmJzX2luZm8sIHNpemVvZihTQlJfSEVBREVSX0RBVEFfQlNfSU5GTykgKTsKKyAgcmVzdWx0IHw9CisgICAgICBGREttZW1jbXAoJmhIZHIxLT5ic19kYXRhLCAmaEhkcjItPmJzX2RhdGEsIHNpemVvZihTQlJfSEVBREVSX0RBVEFfQlMpKTsKKyAgcmVzdWx0IHw9CisgICAgICBGREttZW1jbXAoJmhIZHIxLT5ic19kZmx0LCAmaEhkcjItPmJzX2RmbHQsIHNpemVvZihTQlJfSEVBREVSX0RBVEFfQlMpKTsKKyAgcmVzdWx0IHw9IEZES21lbWNtcCgmaEhkcjEtPmJzX2luZm8sICZoSGRyMi0+YnNfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU0JSX0hFQURFUl9EQVRBX0JTX0lORk8pKTsKIAogICAvKiBjb21wYXJlIGZyZXF1ZW5jeSBiYW5kIGRhdGEgKi8KLSAgcmVzdWx0IHw9IEZES21lbWNtcCggJmhIZHIxLT5mcmVxQmFuZERhdGEsICZoSGRyMi0+ZnJlcUJhbmREYXRhLCAoOCtNQVhfTlVNX0xJTUlURVJTKzEpKnNpemVvZihVQ0hBUikgKTsKLSAgcmVzdWx0IHw9IEZES21lbWNtcCggaEhkcjEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTG8sIGhIZHIyLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZUxvLCAoTUFYX0ZSRVFfQ09FRkZTLzIrMSkqc2l6ZW9mKFVDSEFSKSApOwotICByZXN1bHQgfD0gRkRLbWVtY21wKCBoSGRyMS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVIaSwgaEhkcjItPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlSGksIChNQVhfRlJFUV9DT0VGRlMrMSkqc2l6ZW9mKFVDSEFSKSApOwotICByZXN1bHQgfD0gRkRLbWVtY21wKCBoSGRyMS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVOb2lzZSwgaEhkcjItPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTm9pc2UsIChNQVhfTk9JU0VfQ09FRkZTKzEpKnNpemVvZihVQ0hBUikgKTsKLSAgcmVzdWx0IHw9IEZES21lbWNtcCggaEhkcjEtPmZyZXFCYW5kRGF0YS52X2tfbWFzdGVyLCBoSGRyMi0+ZnJlcUJhbmREYXRhLnZfa19tYXN0ZXIsIChNQVhfRlJFUV9DT0VGRlMrMSkqc2l6ZW9mKFVDSEFSKSApOworICByZXN1bHQgfD0gRkRLbWVtY21wKCZoSGRyMS0+ZnJlcUJhbmREYXRhLCAmaEhkcjItPmZyZXFCYW5kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAoOCArIE1BWF9OVU1fTElNSVRFUlMgKyAxKSAqIHNpemVvZihVQ0hBUikpOworICByZXN1bHQgfD0gRkRLbWVtY21wKGhIZHIxLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZUxvLAorICAgICAgICAgICAgICAgICAgICAgIGhIZHIyLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZUxvLAorICAgICAgICAgICAgICAgICAgICAgIChNQVhfRlJFUV9DT0VGRlMgLyAyICsgMSkgKiBzaXplb2YoVUNIQVIpKTsKKyAgcmVzdWx0IHw9IEZES21lbWNtcChoSGRyMS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVIaSwKKyAgICAgICAgICAgICAgICAgICAgICBoSGRyMi0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVIaSwKKyAgICAgICAgICAgICAgICAgICAgICAoTUFYX0ZSRVFfQ09FRkZTICsgMSkgKiBzaXplb2YoVUNIQVIpKTsKKyAgcmVzdWx0IHw9IEZES21lbWNtcChoSGRyMS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVOb2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICBoSGRyMi0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVOb2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAoTUFYX05PSVNFX0NPRUZGUyArIDEpICogc2l6ZW9mKFVDSEFSKSk7CisgIHJlc3VsdCB8PQorICAgICAgRkRLbWVtY21wKGhIZHIxLT5mcmVxQmFuZERhdGEudl9rX21hc3RlciwgaEhkcjItPmZyZXFCYW5kRGF0YS52X2tfbWFzdGVyLAorICAgICAgICAgICAgICAgIChNQVhfRlJFUV9DT0VGRlMgKyAxKSAqIHNpemVvZihVQ0hBUikpOwogCiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLQogLyohCiAgIFxicmllZiBSZXNldCBTQlIgZGVjb2Rlci4KIApAQCAtMjMxLDYwICsyNzIsNTQgQEAKIAogICBccmV0dXJuIEVycm9yIGNvZGUuCiAqLwotc3RhdGljCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9SZXNldEVsZW1lbnQgKAotICAgICAgICBIQU5ETEVfU0JSREVDT0RFUiAgICBzZWxmLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlSW4sCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVPdXQsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxlbWVudElELAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBlbGVtZW50SW5kZXgsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIG92ZXJsYXAKLSAgICAgICAgKQoteworc3RhdGljIFNCUl9FUlJPUiBzYnJEZWNvZGVyX1Jlc2V0RWxlbWVudChIQU5ETEVfU0JSREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlUmF0ZUluLCBpbnQgc2FtcGxlUmF0ZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxlbWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZWxlbWVudEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3ZlcmxhcCkgewogICBTQlJfRVJST1Igc2JyRXJyb3IgPSBTQlJERUNfT0s7CiAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaFNickhlYWRlcjsKICAgVUlOVCBxbWZGbGFncyA9IDA7CiAKICAgaW50IGksIHN5bkRvd25zYW1wbGVGYWM7CiAKKyAgLyogVVNBQzogYXNzdW1pbmcgdGhlb3JldGljYWwgY2FzZSA4IGtIeiBvdXRwdXQgc2FtcGxlIHJhdGUgd2l0aCA0OjEgU0JSICovCisgIGNvbnN0IGludCBzYnJfbWluX3NhbXBsZV9yYXRlX2luID0gSVNfVVNBQyhzZWxmLT5jb3JlQ29kZWMpID8gMjAwMCA6IDY0MDA7CisKICAgLyogQ2hlY2sgaW4vb3V0IHNhbXBsZXJhdGVzICovCi0gIGlmICggc2FtcGxlUmF0ZUluIDwgNjQwMAotICAgIHx8IHNhbXBsZVJhdGVJbiA+IDQ4MDAwCi0gICAgICkKLSAgeworICBpZiAoc2FtcGxlUmF0ZUluIDwgc2JyX21pbl9zYW1wbGVfcmF0ZV9pbiB8fCBzYW1wbGVSYXRlSW4gPiAoOTYwMDApKSB7CiAgICAgc2JyRXJyb3IgPSBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICAgIGdvdG8gYmFpbDsKICAgfQogCi0gIGlmICggc2FtcGxlUmF0ZU91dCA+IDk2MDAwICkKLSAgeworICBpZiAoc2FtcGxlUmF0ZU91dCA+ICg5NjAwMCkpIHsKICAgICBzYnJFcnJvciA9IFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgICAgZ290byBiYWlsOwogICB9CiAKICAgLyogU2V0IFFNRiBtb2RlIGZsYWdzICovCi0gIGlmIChzZWxmLT5mbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpCi0gICAgcW1mRmxhZ3MgfD0gUU1GX0ZMQUdfTFA7CisgIGlmIChzZWxmLT5mbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpIHFtZkZsYWdzIHw9IFFNRl9GTEFHX0xQOwogCiAgIGlmIChzZWxmLT5jb3JlQ29kZWMgPT0gQU9UX0VSX0FBQ19FTEQpIHsKICAgICBpZiAoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfTERfTVBTX1FNRikgewotICAgICAgcW1mRmxhZ3MgfD0gIFFNRl9GTEFHX01QU0xERkI7CisgICAgICBxbWZGbGFncyB8PSBRTUZfRkxBR19NUFNMREZCOwogICAgIH0gZWxzZSB7Ci0gICAgICBxbWZGbGFncyB8PSAgUU1GX0ZMQUdfQ0xERkI7CisgICAgICBxbWZGbGFncyB8PSBRTUZfRkxBR19DTERGQjsKICAgICB9CiAgIH0KIAogICAvKiBTZXQgZG93bnNhbXBsaW5nIGZhY3RvciBmb3Igc3ludGhlc2lzIGZpbHRlciBiYW5rICovCi0gIGlmIChzYW1wbGVSYXRlT3V0ID09IDApCi0gIHsKKyAgaWYgKHNhbXBsZVJhdGVPdXQgPT0gMCkgewogICAgIC8qIG5vIHNpbmdsZSByYXRlIG1vZGUgKi8KLSAgICAgIHNhbXBsZVJhdGVPdXQgPSBzYW1wbGVSYXRlSW48PDE7IC8qIEluIGNhc2Ugb2YgaW1wbGljaXQgc2lnbmFsbGluZywgYXNzdW1lIGR1YWwgcmF0ZSBTQlIgKi8KKyAgICBzYW1wbGVSYXRlT3V0ID0KKyAgICAgICAgc2FtcGxlUmF0ZUluCisgICAgICAgIDw8IDE7IC8qIEluIGNhc2Ugb2YgaW1wbGljaXQgc2lnbmFsbGluZywgYXNzdW1lIGR1YWwgcmF0ZSBTQlIgKi8KICAgfQogCi0gIGlmICggc2FtcGxlUmF0ZUluID09IHNhbXBsZVJhdGVPdXQgKSB7CisgIGlmIChzYW1wbGVSYXRlSW4gPT0gc2FtcGxlUmF0ZU91dCkgewogICAgIHN5bkRvd25zYW1wbGVGYWMgPSAyOwotICAgIHNlbGYtPmZsYWdzIHw9ICBTQlJERUNfRE9XTlNBTVBMRTsKKyAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfRE9XTlNBTVBMRTsKICAgfSBlbHNlIHsKICAgICBzeW5Eb3duc2FtcGxlRmFjID0gMTsKICAgICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX0RPV05TQU1QTEU7CkBAIC0yOTQsMjAgKzMyOSwyMyBAQAogICBzZWxmLT5zYW1wbGVSYXRlT3V0ID0gc2FtcGxlUmF0ZU91dDsKIAogICB7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgKDEpKzE7IGkrKykKLSAgICB7CisgICAgZm9yIChpID0gMDsgaSA8ICgxKSArIDE7IGkrKykgeworICAgICAgaW50IHNldERmbHQ7CiAgICAgICBoU2JySGVhZGVyID0gJihzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtpXSk7CisgICAgICBzZXREZmx0ID0gKChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gU0JSX05PVF9JTklUSUFMSVpFRCkgfHwKKyAgICAgICAgICAgICAgICAgKHNlbGYtPmZsYWdzICYgU0JSREVDX0ZPUkNFX1JFU0VUKSkKKyAgICAgICAgICAgICAgICAgICAgPyAxCisgICAgICAgICAgICAgICAgICAgIDogMDsKIAogICAgICAgLyogaW5pdCBhIGRlZmF1bHQgaGVhZGVyIHN1Y2ggdGhhdCB3ZSBjYW4gYXQgbGVhc3QgZG8gdXBzYW1wbGluZyBsYXRlciAqLwotICAgICAgc2JyRXJyb3IgPSBpbml0SGVhZGVyRGF0YSgKLSAgICAgICAgICAgICAgaFNickhlYWRlciwKLSAgICAgICAgICAgICAgc2FtcGxlUmF0ZUluLAotICAgICAgICAgICAgICBzYW1wbGVSYXRlT3V0LAotICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgIHNlbGYtPmZsYWdzCi0gICAgICAgICAgICAgICk7CisgICAgICBzYnJFcnJvciA9IGluaXRIZWFkZXJEYXRhKGhTYnJIZWFkZXIsIHNhbXBsZVJhdGVJbiwgc2FtcGxlUmF0ZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZG93bnNjYWxlRmFjdG9yLCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLCBzZXREZmx0KTsKKworICAgICAgLyogU2V0IHN5bmNoU3RhdGUgdG8gVVBTQU1QTElORyBpbiBjYXNlIGl0IGFscmVhZHkgaXMgaW5pdGlhbGl6ZWQgKi8KKyAgICAgIGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9IGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA+IFVQU0FNUExJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFVQU0FNUExJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGhTYnJIZWFkZXItPnN5bmNTdGF0ZTsKICAgICB9CiAgIH0KIApAQCAtMzE1LDIxICszNTMsMzggQEAKICAgICBnb3RvIGJhaWw7CiAgIH0KIAorICBpZiAoIXNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYucW1mRG9tYWluRXhwbGljaXRDb25maWcpIHsKKyAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLmZsYWdzX3JlcXVlc3RlZCB8PSBxbWZGbGFnczsKKyAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc0FuYWx5c2lzX3JlcXVlc3RlZCA9CisgICAgICAgIHNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdWzBdLm51bWJlck9mQW5hbHlzaXNCYW5kczsKKyAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc1N5bnRoZXNpc19yZXF1ZXN0ZWQgPQorICAgICAgICAoc3luRG93bnNhbXBsZUZhYyA9PSAxKSA/IDY0IDogMzI7IC8qIG1heSBiZSBvdmVyd3JpdHRlbiBieSBNUFMgKi8KKyAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc1N5bnRoZXNpc19yZXF1ZXN0ZWQgLz0KKyAgICAgICAgc2VsZi0+ZG93bnNjYWxlRmFjdG9yOworICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYublFtZlRpbWVTbG90c19yZXF1ZXN0ZWQgPQorICAgICAgICBzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVswXS5udW1iZXJUaW1lU2xvdHMgKgorICAgICAgICBzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVswXS50aW1lU3RlcDsKKyAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5RbWZPdlRpbWVTbG90c19yZXF1ZXN0ZWQgPSBvdmVybGFwOworICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYublFtZlByb2NCYW5kc19yZXF1ZXN0ZWQgPSA2NDsgLyogYWx3YXlzIDY0ICovCisgICAgc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uUW1mUHJvY0NoYW5uZWxzX3JlcXVlc3RlZCA9CisgICAgICAgIDE7IC8qIG1heSBiZSBvdmVyd3JpdHRlbiBieSBNUFMgKi8KKyAgfQorCiAgIC8qIEluaXQgU0JSIGNoYW5uZWxzIGdvaW5nIHRvIGJlIGFzc2lnbmVkIHRvIGEgU0JSIGVsZW1lbnQgKi8KICAgewogICAgIGludCBjaDsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5uQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIGludCBoZWFkZXJJbmRleCA9CisgICAgICAgICAgZ2V0SGVhZGVyU2xvdChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT51c2VGcmFtZVNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT51c2VIZWFkZXJTbG90KTsKIAotICAgIGZvciAoY2g9MDsgY2g8c2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+bkNoYW5uZWxzOyBjaCsrKQotICAgIHsKICAgICAgIC8qIGFuZCBjcmVhdGUgc2JyRGVjICovCi0gICAgICBzYnJFcnJvciA9IGNyZWF0ZVNickRlYyAoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JySGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT50cmFuc3Bvc2VyU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN5bkRvd25zYW1wbGVGYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHFtZkZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggKTsKKyAgICAgIHNickVycm9yID0KKyAgICAgICAgICBjcmVhdGVTYnJEZWMoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1baGVhZGVySW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dHJhbnNwb3NlclNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICBzeW5Eb3duc2FtcGxlRmFjLCBxbWZGbGFncywgc2VsZi0+ZmxhZ3MsIG92ZXJsYXAsIGNoLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5jb2RlY0ZyYW1lU2l6ZSk7CiAKICAgICAgIGlmIChzYnJFcnJvciAhPSBTQlJERUNfT0spIHsKICAgICAgICAgZ290byBiYWlsOwpAQCAtMzM3LDI4ICszOTIsMjkgQEAKICAgICB9CiAgIH0KIAotICAvL0ZES21lbWNsZWFyKHNicl9PdmVybGFwQnVmZmVyLCBzaXplb2Yoc2JyX092ZXJsYXBCdWZmZXIpKTsKKyAgLy8gRkRLbWVtY2xlYXIoc2JyX092ZXJsYXBCdWZmZXIsIHNpemVvZihzYnJfT3ZlcmxhcEJ1ZmZlcikpOwogCiAgIGlmIChzZWxmLT5udW1TYnJFbGVtZW50cyA9PSAxKSB7Ci0gICAgc3dpdGNoICggc2VsZi0+Y29yZUNvZGVjICkgewotICAgIGNhc2UgQU9UX0FBQ19MQzoKLSAgICBjYXNlIEFPVF9TQlI6Ci0gICAgY2FzZSBBT1RfUFM6Ci0gICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6Ci0gICAgY2FzZSBBT1RfRFJNX0FBQzoKLSAgICAgIGlmIChDcmVhdGVQc0RlYyAoICZzZWxmLT5oUGFyYW1ldHJpY1N0ZXJlb0RlYywgc2FtcGxlc1BlckZyYW1lICkpIHsKLSAgICAgICAgc2JyRXJyb3IgPSBTQlJERUNfQ1JFQVRFX0VSUk9SOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7CisgICAgc3dpdGNoIChzZWxmLT5jb3JlQ29kZWMpIHsKKyAgICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICAgIGNhc2UgQU9UX1NCUjoKKyAgICAgIGNhc2UgQU9UX1BTOgorICAgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6CisgICAgICBjYXNlIEFPVF9EUk1fQUFDOgorICAgICAgY2FzZSBBT1RfRFJNX1NVUlJPVU5EOgorICAgICAgICBpZiAoQ3JlYXRlUHNEZWMoJnNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjLCBzYW1wbGVzUGVyRnJhbWUpKSB7CisgICAgICAgICAgc2JyRXJyb3IgPSBTQlJERUNfQ1JFQVRFX0VSUk9SOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogCiAgIC8qIEluaXQgZnJhbWUgZGVsYXkgc2xvdCBoYW5kbGluZyAqLwogICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT51c2VGcmFtZVNsb3QgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgKCgxKSsxKTsgaSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCAoKDEpICsgMSk7IGkrKykgewogICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnVzZUhlYWRlclNsb3RbaV0gPSBpOwogICB9CiAKQEAgLTM2NywxMSArNDIzLDM3IEBACiAgIHJldHVybiBzYnJFcnJvcjsKIH0KIAorLyohCisgIFxicmllZiBBc3NpZ24gUU1GIGRvbWFpbiBwcm92aWRlZCBRTUYgY2hhbm5lbHMgdG8gU0JSIGNoYW5uZWxzLgogCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9PcGVuICggSEFORExFX1NCUkRFQ09ERVIgICogcFNlbGYgKQotewotICBIQU5ETEVfU0JSREVDT0RFUiAgICBzZWxmID0gTlVMTDsKKyAgXHJldHVybiB2b2lkCisqLworc3RhdGljIHZvaWQgc2JyRGVjb2Rlcl9Bc3NpZ25RbWZDaGFubmVsczJTYnJDaGFubmVscyhIQU5ETEVfU0JSREVDT0RFUiBzZWxmKSB7CisgIGludCBjaCwgZWwsIGFic0NoX29mZnNldCA9IDA7CisgIGZvciAoZWwgPSAwOyBlbCA8IHNlbGYtPm51bVNickVsZW1lbnRzOyBlbCsrKSB7CisgICAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsXSAhPSBOVUxMKSB7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5wU2JyRWxlbWVudFtlbF0tPm5DaGFubmVsczsgY2grKykgeworICAgICAgICBGREtfQVNTRVJUKCgoYWJzQ2hfb2Zmc2V0ICsgY2gpIDwgKCg4KSArICgxKSkpICYmCisgICAgICAgICAgICAgICAgICAgKChhYnNDaF9vZmZzZXQgKyBjaCkgPCAoKDgpICsgKDEpKSkpOworICAgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbF0tPnBTYnJDaGFubmVsW2NoXS0+U2JyRGVjLnFtZkRvbWFpbkluQ2ggPQorICAgICAgICAgICAgJnNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbkluW2Fic0NoX29mZnNldCArIGNoXTsKKyAgICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxdLT5wU2JyQ2hhbm5lbFtjaF0tPlNickRlYy5xbWZEb21haW5PdXRDaCA9CisgICAgICAgICAgICAmc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluT3V0W2Fic0NoX29mZnNldCArIGNoXTsKKyAgICAgIH0KKyAgICAgIGFic0NoX29mZnNldCArPSBzZWxmLT5wU2JyRWxlbWVudFtlbF0tPm5DaGFubmVsczsKKyAgICB9CisgIH0KK30KKworU0JSX0VSUk9SIHNickRlY29kZXJfT3BlbihIQU5ETEVfU0JSREVDT0RFUiAqcFNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfUU1GX0RPTUFJTiBwUW1mRG9tYWluKSB7CisgIEhBTkRMRV9TQlJERUNPREVSIHNlbGYgPSBOVUxMOwogICBTQlJfRVJST1Igc2JyRXJyb3IgPSBTQlJERUNfT0s7CisgIGludCBlbElkeDsKKworICBpZiAoKHBTZWxmID09IE5VTEwpIHx8IChwUW1mRG9tYWluID09IE5VTEwpKSB7CisgICAgcmV0dXJuIFNCUkRFQ19JTlZBTElEX0FSR1VNRU5UOworICB9CiAKICAgLyogR2V0IG1lbW9yeSBmb3IgdGhpcyBpbnN0YW5jZSAqLwogICBzZWxmID0gR2V0UmFtX1NickRlY29kZXIoKTsKQEAgLTM4MCwxNSArNDYyLDcgQEAKICAgICBnb3RvIGJhaWw7CiAgIH0KIAotICBzZWxmLT53b3JrQnVmZmVyMSA9IEdldFJhbV9TYnJEZWNXb3JrQnVmZmVyMSgpOwotICBzZWxmLT53b3JrQnVmZmVyMiA9IEdldFJhbV9TYnJEZWNXb3JrQnVmZmVyMigpOwotCi0gIGlmICggIHNlbGYtPndvcmtCdWZmZXIxID09IE5VTEwKLSAgICAgfHwgc2VsZi0+d29ya0J1ZmZlcjIgPT0gTlVMTCApCi0gIHsKLSAgICBzYnJFcnJvciA9IFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOwotICAgIGdvdG8gYmFpbDsKLSAgfQorICBzZWxmLT5wUW1mRG9tYWluID0gcFFtZkRvbWFpbjsKIAogICAvKgogICBBbHJlYWR5IHplcm8gYmVjYXVzZSBvZiBjYWxsb2MKQEAgLTM5Nyw3ICs0NzEsMTUgQEAKICAgc2VsZi0+Y29kZWNGcmFtZVNpemUgPSAwOwogICAqLwogCi0gIHNlbGYtPm51bURlbGF5RnJhbWVzID0gKDEpOyAgLyogc2V0IHRvIHRoZSBtYXggdmFsdWUgYnkgZGVmYXVsdCAqLworICBzZWxmLT5udW1EZWxheUZyYW1lcyA9ICgxKTsgLyogc2V0IHRvIHRoZSBtYXggdmFsdWUgYnkgZGVmYXVsdCAqLworCisgIC8qIEluaXRpYWxpemUgaGVhZGVyIHN5bmMgc3RhdGUgKi8KKyAgZm9yIChlbElkeCA9IDA7IGVsSWR4IDwgKDgpOyBlbElkeCArPSAxKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8ICgxKSArIDE7IGkgKz0gMSkgeworICAgICAgc2VsZi0+c2JySGVhZGVyW2VsSWR4XVtpXS5zeW5jU3RhdGUgPSBTQlJfTk9UX0lOSVRJQUxJWkVEOworICAgIH0KKyAgfQogCiAgICpwU2VsZiA9IHNlbGY7CiAKQEAgLTQxMCw5ICs0OTIsNyBAQAogICogXHBhcmFtIGNvcmVDb2RlYyBjb3JlIGNvZGVjIGF1ZGlvIG9iamVjdCB0eXBlLgogICogXHJldHVybiAxIGlmIFNCUiBjYW4gYmUgcHJvY2Vzc2VkLCAwIGlmIFNCUiBjYW5ub3QgYmUgcHJvY2Vzc2VkL2FwcGxpZWQuCiAgKi8KLXN0YXRpYwotaW50IHNickRlY29kZXJfaXNDb3JlQ29kZWNWYWxpZChBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMpCi17CitzdGF0aWMgaW50IHNickRlY29kZXJfaXNDb3JlQ29kZWNWYWxpZChBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMpIHsKICAgc3dpdGNoIChjb3JlQ29kZWMpIHsKICAgICBjYXNlIEFPVF9BQUNfTEM6CiAgICAgY2FzZSBBT1RfU0JSOgpAQCAtNDIwLDgwICs1MDAsMTA5IEBACiAgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6CiAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKICAgICBjYXNlIEFPVF9EUk1fQUFDOgorICAgIGNhc2UgQU9UX0RSTV9TVVJST1VORDoKKyAgICBjYXNlIEFPVF9VU0FDOgogICAgICAgcmV0dXJuIDE7CiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiAwOwogICB9CiB9CiAKLXN0YXRpYwotdm9pZCBzYnJEZWNvZGVyX0Rlc3Ryb3lFbGVtZW50ICgKLSAgICAgICAgSEFORExFX1NCUkRFQ09ERVIgICAgICAgc2VsZiwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgZWxlbWVudEluZGV4Ci0gICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIHNickRlY29kZXJfRGVzdHJveUVsZW1lbnQoSEFORExFX1NCUkRFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGVsZW1lbnRJbmRleCkgewogICBpZiAoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSAhPSBOVUxMKSB7CiAgICAgaW50IGNoOwogCi0gICAgZm9yIChjaD0wOyBjaDxTQlJERUNfTUFYX0NIX1BFUl9FTEVNRU5UOyBjaCsrKSB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgU0JSREVDX01BWF9DSF9QRVJfRUxFTUVOVDsgY2grKykgewogICAgICAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZVNickRlYyggc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdICk7Ci0gICAgICAgIEZyZWVSYW1fU2JyRGVjQ2hhbm5lbCggJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSApOworICAgICAgICBkZWxldGVTYnJEZWMoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdKTsKKyAgICAgICAgRnJlZVJhbV9TYnJEZWNDaGFubmVsKAorICAgICAgICAgICAgJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSk7CiAgICAgICAgIHNlbGYtPm51bVNickNoYW5uZWxzIC09IDE7CiAgICAgICB9CiAgICAgfQotICAgIEZyZWVSYW1fU2JyRGVjRWxlbWVudCggJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0gKTsKKyAgICBGcmVlUmFtX1NickRlY0VsZW1lbnQoJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0pOwogICAgIHNlbGYtPm51bVNickVsZW1lbnRzIC09IDE7CiAgIH0KIH0KIAotCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9Jbml0RWxlbWVudCAoCi0gICAgICAgIEhBTkRMRV9TQlJERUNPREVSICAgICAgIHNlbGYsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZVJhdGVJbiwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZU91dCwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCi0gICAgICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEICAgIGVsZW1lbnRJRCwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgZWxlbWVudEluZGV4Ci0gICAgICAgICkKLXsKK1NCUl9FUlJPUiBzYnJEZWNvZGVyX0luaXRFbGVtZW50KAorICAgIEhBTkRMRV9TQlJERUNPREVSIHNlbGYsIGNvbnN0IGludCBzYW1wbGVSYXRlSW4sIGNvbnN0IGludCBzYW1wbGVSYXRlT3V0LAorICAgIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50SUQsIGNvbnN0IGludCBlbGVtZW50SW5kZXgsCisgICAgY29uc3QgVUNIQVIgaGFybW9uaWNTQlIsIGNvbnN0IFVDSEFSIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkLCBjb25zdCBJTlQgZG93bnNjYWxlRmFjdG9yKSB7CiAgIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKLSAgaW50IGNoQ250PTA7Ci0gIGludCBuU2JyRWxlbWVudHNTdGFydCA9IHNlbGYtPm51bVNickVsZW1lbnRzOworICBpbnQgY2hDbnQgPSAwOworICBpbnQgblNickVsZW1lbnRzU3RhcnQ7CisgIGludCBuU2JyQ2hhbm5lbHNTdGFydDsKKyAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiBTQlJERUNfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorCisgIG5TYnJFbGVtZW50c1N0YXJ0ID0gc2VsZi0+bnVtU2JyRWxlbWVudHM7CisgIG5TYnJDaGFubmVsc1N0YXJ0ID0gc2VsZi0+bnVtU2JyQ2hhbm5lbHM7CiAKICAgLyogQ2hlY2sgY29yZSBjb2RlYyBBT1QgKi8KLSAgaWYgKCEgc2JyRGVjb2Rlcl9pc0NvcmVDb2RlY1ZhbGlkKGNvcmVDb2RlYykgfHwgZWxlbWVudEluZGV4ID49ICg4KSkgeworICBpZiAoIXNickRlY29kZXJfaXNDb3JlQ29kZWNWYWxpZChjb3JlQ29kZWMpIHx8IGVsZW1lbnRJbmRleCA+PSAoOCkpIHsKICAgICBzYnJFcnJvciA9IFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgICAgZ290byBiYWlsOwogICB9CiAKLSAgaWYgKCBlbGVtZW50SUQgIT0gSURfU0NFICYmIGVsZW1lbnRJRCAhPSBJRF9DUEUgJiYgZWxlbWVudElEICE9IElEX0xGRSApCi0gIHsKKyAgaWYgKGVsZW1lbnRJRCAhPSBJRF9TQ0UgJiYgZWxlbWVudElEICE9IElEX0NQRSAmJiBlbGVtZW50SUQgIT0gSURfTEZFKSB7CiAgICAgc2JyRXJyb3IgPSBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICAgIGdvdG8gYmFpbDsKICAgfQogCi0gIGlmICggIHNlbGYtPnNhbXBsZVJhdGVJbiA9PSBzYW1wbGVSYXRlSW4KLSAgICAgJiYgc2VsZi0+Y29kZWNGcmFtZVNpemUgPT0gc2FtcGxlc1BlckZyYW1lCi0gICAgICYmIHNlbGYtPmNvcmVDb2RlYyA9PSBjb3JlQ29kZWMKLSAgICAgJiYgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSAhPSBOVUxMCi0gICAgICYmIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPmVsZW1lbnRJRCA9PSBlbGVtZW50SUQKLSAgICAgJiYgIShzZWxmLT5mbGFncyAmIFNCUkRFQ19GT1JDRV9SRVNFVCkKLSAgICAgKQotICB7Ci0gICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KLSAgICAgcmV0dXJuIFNCUkRFQ19PSzsKKyAgaWYgKHNlbGYtPnNhbXBsZVJhdGVJbiA9PSBzYW1wbGVSYXRlSW4gJiYKKyAgICAgIHNlbGYtPmNvZGVjRnJhbWVTaXplID09IHNhbXBsZXNQZXJGcmFtZSAmJiBzZWxmLT5jb3JlQ29kZWMgPT0gY29yZUNvZGVjICYmCisgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdICE9IE5VTEwgJiYKKyAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPmVsZW1lbnRJRCA9PSBlbGVtZW50SUQgJiYKKyAgICAgICEoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfRk9SQ0VfUkVTRVQpICYmCisgICAgICAoKHNhbXBsZVJhdGVPdXQgPT0gMCkgPyAxIDogKHNlbGYtPnNhbXBsZVJhdGVPdXQgPT0gc2FtcGxlUmF0ZU91dCkpICYmCisgICAgICAoKGhhcm1vbmljU0JSID09IDIpID8gMQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IChzZWxmLT5oYXJtb25pY1NCUiA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJtb25pY1NCUikpIC8qIFRoZSB2YWx1ZSAyIHNpZ25hbGl6ZXMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcm1vbmljU0JSIHNoYWxsIGJlIGlnbm9yZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlnIGNoYW5nZSBkZXRlY3Rpb24gKi8KKyAgKSB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIHJldHVybiBTQlJERUNfT0s7CisgIH0gZWxzZSB7CisgICAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9ERVRfQ0ZHX0NIQU5HRSkgeworICAgICAgKmNvbmZpZ0NoYW5nZWQgPSAxOworICAgIH0KKyAgfQorCisgIC8qIHJlYWNoaW5nIHRoaXMgcG9pbnQgdGhlIFNCUi1kZWNvZGVyIGdldHMgKHJlLSljb25maWd1cmVkICovCisKKyAgLyogVGhlIGZsYWdzIGZpZWxkIGlzIHVzZWQgZm9yIGFsbCBlbGVtZW50cyEgKi8KKyAgc2VsZi0+ZmxhZ3MgJj0KKyAgICAgIChTQlJERUNfRk9SQ0VfUkVTRVQgfCBTQlJERUNfRkxVU0gpOyAvKiBLZWVwIHRoZSBnbG9iYWwgZmxhZ3MuIFRoZXkgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlc2V0IGFmdGVyIGRlY29kaW5nLiAqLworICBzZWxmLT5mbGFncyB8PSAoZG93bnNjYWxlRmFjdG9yID4gMSkgPyBTQlJERUNfRUxEX0RPV05TQ0FMRSA6IDA7CisgIHNlbGYtPmZsYWdzIHw9IChjb3JlQ29kZWMgPT0gQU9UX0VSX0FBQ19FTEQpID8gU0JSREVDX0VMRF9HUklEIDogMDsKKyAgc2VsZi0+ZmxhZ3MgfD0gKGNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX1NDQUwpID8gU0JSREVDX1NZTlRBWF9TQ0FMIDogMDsKKyAgc2VsZi0+ZmxhZ3MgfD0KKyAgICAgIChjb3JlQ29kZWMgPT0gQU9UX0RSTV9BQUMpID8gU0JSREVDX1NZTlRBWF9TQ0FMIHwgU0JSREVDX1NZTlRBWF9EUk0gOiAwOworICBzZWxmLT5mbGFncyB8PSAoY29yZUNvZGVjID09IEFPVF9EUk1fU1VSUk9VTkQpCisgICAgICAgICAgICAgICAgICAgICA/IFNCUkRFQ19TWU5UQVhfU0NBTCB8IFNCUkRFQ19TWU5UQVhfRFJNCisgICAgICAgICAgICAgICAgICAgICA6IDA7CisgIHNlbGYtPmZsYWdzIHw9IChjb3JlQ29kZWMgPT0gQU9UX1VTQUMpID8gU0JSREVDX1NZTlRBWF9VU0FDIDogMDsKKyAgLyogUm9idXN0bmVzczogVGFrZSBpbnRlZ2VyIGRpdmlzaW9uIHJvdW5kaW5nIGludG8gY29uc2lkZXJhdGlvbi4gRS5nLiAyMjA1MAorICAgKiBIeiB3aXRoIDQ6MSBTQlIgPT4gNTUxMiBIeiBjb3JlIHNhbXBsaW5nIHJhdGUuICovCisgIHNlbGYtPmZsYWdzIHw9IChzYW1wbGVSYXRlSW4gPT0gc2FtcGxlUmF0ZU91dCAvIDQpID8gU0JSREVDX1FVQURfUkFURSA6IDA7CisgIHNlbGYtPmZsYWdzIHw9IChoYXJtb25pY1NCUiA9PSAxKSA/IFNCUkRFQ19VU0FDX0hBUk1PTklDU0JSIDogMDsKKworICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0RFVF9DRkdfQ0hBTkdFKSB7CisgICAgcmV0dXJuIFNCUkRFQ19PSzsKICAgfQogCiAgIHNlbGYtPnNhbXBsZVJhdGVJbiA9IHNhbXBsZVJhdGVJbjsKICAgc2VsZi0+Y29kZWNGcmFtZVNpemUgPSBzYW1wbGVzUGVyRnJhbWU7CiAgIHNlbGYtPmNvcmVDb2RlYyA9IGNvcmVDb2RlYzsKLQotICBzZWxmLT5mbGFncyA9IDA7Ci0gIHNlbGYtPmZsYWdzIHw9IChjb3JlQ29kZWMgPT0gQU9UX0VSX0FBQ19FTEQpID8gU0JSREVDX0VMRF9HUklEIDogMDsKLSAgc2VsZi0+ZmxhZ3MgfD0gKGNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX1NDQUwpID8gU0JSREVDX1NZTlRBWF9TQ0FMIDogMDsKLSAgc2VsZi0+ZmxhZ3MgfD0gKGNvcmVDb2RlYyA9PSBBT1RfRFJNX0FBQykgICAgID8gU0JSREVDX1NZTlRBWF9TQ0FMfFNCUkRFQ19TWU5UQVhfRFJNIDogMDsKKyAgc2VsZi0+aGFybW9uaWNTQlIgPSBoYXJtb25pY1NCUjsKKyAgc2VsZi0+ZG93bnNjYWxlRmFjdG9yID0gZG93bnNjYWxlRmFjdG9yOwogCiAgIC8qIEluaXQgU0JSIGVsZW1lbnRzICovCiAgIHsKQEAgLTUwNSwzNCArNjE0LDM5IEBACiAgICAgICAgIHNickVycm9yID0gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CiAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgIH0KLSAgICAgIHNlbGYtPm51bVNickVsZW1lbnRzICsrOworICAgICAgc2VsZi0+bnVtU2JyRWxlbWVudHMrKzsKICAgICB9IGVsc2UgewogICAgICAgc2VsZi0+bnVtU2JyQ2hhbm5lbHMgLT0gc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+bkNoYW5uZWxzOwogICAgIH0KIAotICAgIC8qIFNhdmUgZWxlbWVudCBJRCBmb3Igc2FuaXR5IGNoZWNrcyBhbmQgdG8gaGF2ZSBhIGZhbGxiYWNrIGZvciBjb25jZWFsbWVudC4gKi8KKyAgICAvKiBTYXZlIGVsZW1lbnQgSUQgZm9yIHNhbml0eSBjaGVja3MgYW5kIHRvIGhhdmUgYSBmYWxsYmFjayBmb3IgY29uY2VhbG1lbnQuCisgICAgICovCiAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+ZWxlbWVudElEID0gZWxlbWVudElEOwogCiAgICAgLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBjaGFubmVscyBmb3IgdGhpcyBlbGVtZW50ICovCiAgICAgc3dpdGNoIChlbGVtZW50SUQpIHsKICAgICAgIGNhc2UgSURfTk9ORToKLSAgICAgIGNhc2UgSURfQ1BFOiBlbENoYW5uZWxzPTI7CisgICAgICBjYXNlIElEX0NQRToKKyAgICAgICAgZWxDaGFubmVscyA9IDI7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBJRF9MRkU6Ci0gICAgICBjYXNlIElEX1NDRTogZWxDaGFubmVscz0xOworICAgICAgY2FzZSBJRF9TQ0U6CisgICAgICAgIGVsQ2hhbm5lbHMgPSAxOwogICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6IGVsQ2hhbm5lbHM9MDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGVsQ2hhbm5lbHMgPSAwOwogICAgICAgICBicmVhazsKICAgICB9CiAKICAgICAvKiBIYW5kbGUgY2FzZSBvZiBQYXJhbWV0cmljIFN0ZXJlbyAqLwotICAgIGlmICggZWxlbWVudEluZGV4ID09IDAgJiYgZWxlbWVudElEID09IElEX1NDRSApIHsKKyAgICBpZiAoZWxlbWVudEluZGV4ID09IDAgJiYgZWxlbWVudElEID09IElEX1NDRSkgewogICAgICAgc3dpdGNoIChjb3JlQ29kZWMpIHsKICAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgogICAgICAgICBjYXNlIEFPVF9TQlI6CiAgICAgICAgIGNhc2UgQU9UX1BTOgogICAgICAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKICAgICAgICAgY2FzZSBBT1RfRFJNX0FBQzoKKyAgICAgICAgY2FzZSBBT1RfRFJNX1NVUlJPVU5EOgogICAgICAgICAgIGVsQ2hhbm5lbHMgPSAyOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtNTQwLDU3ICs2NTQsNzYgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICAvKiBTYW5pdHkgY2hlY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICovCisgICAgaWYgKGVsQ2hhbm5lbHMgPCBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5uQ2hhbm5lbHMpIHsKKyAgICAgIHNlbGYtPm51bVNickNoYW5uZWxzICs9IHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPm5DaGFubmVsczsKKyAgICAgIHNickVycm9yID0gU0JSREVDX1BBUlNFX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKwogICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPm5DaGFubmVscyA9IGVsQ2hhbm5lbHM7CiAKLSAgICBmb3IgKGNoPTA7IGNoPGVsQ2hhbm5lbHM7IGNoKyspCi0gICAgeworICAgIGZvciAoY2ggPSAwOyBjaCA8IGVsQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgIGlmIChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0gPT0gTlVMTCkgewotICAgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0gPSBHZXRSYW1fU2JyRGVjQ2hhbm5lbChjaENudCk7CisgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSA9CisgICAgICAgICAgICBHZXRSYW1fU2JyRGVjQ2hhbm5lbChjaENudCk7CiAgICAgICAgIGlmIChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0gPT0gTlVMTCkgewogICAgICAgICAgIHNickVycm9yID0gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CiAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBzZWxmLT5udW1TYnJDaGFubmVscyArKzsKKyAgICAgIHNlbGYtPm51bVNickNoYW5uZWxzKys7CiAKLSAgICAgIHNickRlY29kZXJfZHJjSW5pdENoYW5uZWwoICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0tPlNickRlYy5zYnJEcmNDaGFubmVsICk7CisgICAgICBzYnJEZWNvZGVyX2RyY0luaXRDaGFubmVsKCZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5wU2JyQ2hhbm5lbFtjaF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlNickRlYy5zYnJEcmNDaGFubmVsKTsKIAotICAgICAgLyogQWRkIHJlZmVyZW5jZSBwb2ludGVyIHRvIHdvcmtidWZmZXJzLiAqLwotICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdLT5TYnJEZWMuV29ya0J1ZmZlcjEgPSBzZWxmLT53b3JrQnVmZmVyMTsKLSAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXS0+U2JyRGVjLldvcmtCdWZmZXIyID0gc2VsZi0+d29ya0J1ZmZlcjI7CiAgICAgICBjaENudCsrOwogICAgIH0KLSAgICBpZiAoZWxDaGFubmVscyA9PSAxICYmIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSAhPSBOVUxMKSB7Ci0gICAgICBkZWxldGVTYnJEZWMoIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSApOwotICAgICAgRnJlZVJhbV9TYnJEZWNDaGFubmVsKCAmc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdICk7Ci0gICAgfQogICB9CiAKKyAgaWYgKCFzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLnFtZkRvbWFpbkV4cGxpY2l0Q29uZmlnKSB7CisgICAgc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uSW5wdXRDaGFubmVsc19yZXF1ZXN0ZWQgPQorICAgICAgICBzZWxmLT5udW1TYnJDaGFubmVsczsKKyAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5PdXRwdXRDaGFubmVsc19yZXF1ZXN0ZWQgPQorICAgICAgICBmTWF4KChJTlQpc2VsZi0+bnVtU2JyQ2hhbm5lbHMsCisgICAgICAgICAgICAgKElOVClzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5PdXRwdXRDaGFubmVsc19yZXF1ZXN0ZWQpOworICB9CisKKyAgLyogTWFrZSBzdXJlIGVhY2ggU0JSIGNoYW5uZWwgaGFzIG9uZSBRTUYgY2hhbm5lbCBhc3NpZ25lZCBldmVuIGlmCisgICAqIG51bVNickNoYW5uZWxzIG9yIGVsZW1lbnQgc2V0LXVwIGhhcyBjaGFuZ2VkLiAqLworICBzYnJEZWNvZGVyX0Fzc2lnblFtZkNoYW5uZWxzMlNickNoYW5uZWxzKHNlbGYpOworCiAgIC8qIGNsZWFyIGVycm9yIGZsYWdzIGZvciBhbGwgZGVsYXkgc2xvdHMgKi8KLSAgRkRLbWVtY2xlYXIoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+ZnJhbWVFcnJvckZsYWcsICgoMSkrMSkqc2l6ZW9mKFVDSEFSKSk7CisgIEZES21lbWNsZWFyKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPmZyYW1lRXJyb3JGbGFnLAorICAgICAgICAgICAgICAoKDEpICsgMSkgKiBzaXplb2YoVUNIQVIpKTsKIAotICAvKiBJbml0aWFsaXplIHRoaXMgaW5zdGFuY2UgKi8KLSAgc2JyRXJyb3IgPSBzYnJEZWNvZGVyX1Jlc2V0RWxlbWVudCgKLSAgICAgICAgICBzZWxmLAotICAgICAgICAgIHNhbXBsZVJhdGVJbiwKLSAgICAgICAgICBzYW1wbGVSYXRlT3V0LAotICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICBlbGVtZW50SUQsCi0gICAgICAgICAgZWxlbWVudEluZGV4LAotICAgICAgICAgIChjb3JlQ29kZWMgPT0gQU9UX0VSX0FBQ19FTEQpID8gMCA6ICg2KQotICAgICAgICAgICk7CisgIHsKKyAgICBpbnQgb3ZlcmxhcDsKIAotCisgICAgaWYgKGNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgICAgb3ZlcmxhcCA9IDA7CisgICAgfSBlbHNlIGlmIChzZWxmLT5mbGFncyAmIFNCUkRFQ19RVUFEX1JBVEUpIHsKKyAgICAgIG92ZXJsYXAgPSAoMyAqIDQpOworICAgIH0gZWxzZSB7CisgICAgICBvdmVybGFwID0gKDMgKiAyKTsKKyAgICB9CisgICAgLyogSW5pdGlhbGl6ZSB0aGlzIGluc3RhbmNlICovCisgICAgc2JyRXJyb3IgPSBzYnJEZWNvZGVyX1Jlc2V0RWxlbWVudChzZWxmLCBzYW1wbGVSYXRlSW4sIHNhbXBsZVJhdGVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIGVsZW1lbnRJRCwgZWxlbWVudEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcCk7CisgIH0KIAogYmFpbDoKICAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykgewotICAgIGlmIChuU2JyRWxlbWVudHNTdGFydCA8IHNlbGYtPm51bVNickVsZW1lbnRzKSB7CisgICAgaWYgKChuU2JyRWxlbWVudHNTdGFydCA8IHNlbGYtPm51bVNickVsZW1lbnRzKSB8fAorICAgICAgICAoblNickNoYW5uZWxzU3RhcnQgPCBzZWxmLT5udW1TYnJDaGFubmVscykpIHsKICAgICAgIC8qIEZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoaXMgZWxlbWVudCAqLwotICAgICAgc2JyRGVjb2Rlcl9EZXN0cm95RWxlbWVudCggc2VsZiwgZWxlbWVudEluZGV4ICk7Ci0gICAgfSBlbHNlIGlmICggKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0gIT0gTlVMTCkKLSAgICAgICAgICAgICAmJiAoZWxlbWVudEluZGV4IDwgKDgpKSkKLSAgICB7IC8qIFNldCBlcnJvciBmbGFnIHRvIHRyaWdnZXIgY29uY2VhbG1lbnQgKi8KLSAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPmZyYW1lRXJyb3JGbGFnW3NlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnVzZUZyYW1lU2xvdF0gPSAxOworICAgICAgc2JyRGVjb2Rlcl9EZXN0cm95RWxlbWVudChzZWxmLCBlbGVtZW50SW5kZXgpOworICAgIH0gZWxzZSBpZiAoKGVsZW1lbnRJbmRleCA8ICg4KSkgJiYKKyAgICAgICAgICAgICAgIChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdICE9CisgICAgICAgICAgICAgICAgTlVMTCkpIHsgLyogU2V0IGVycm9yIGZsYWcgdG8gdHJpZ2dlciBjb25jZWFsbWVudCAqLworICAgICAgc2V0RnJhbWVFcnJvckZsYWcoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSwgRlJBTUVfRVJST1IpOwogICAgIH0KICAgfQogCkBAIC01OTgsMjIgKzczMSw0MyBAQAogfQogCiAvKioKKyAqIFxicmllZiBGcmVlIGNvbmZpZyBkZXBlbmRlbnQgU0JSIG1lbW9yeS4KKyAqIFxwYXJhbSBzZWxmIFNCUiBkZWNvZGVyIGluc3RhbmNlIGhhbmRsZQorICovCitTQlJfRVJST1Igc2JyRGVjb2Rlcl9GcmVlTWVtKEhBTkRMRV9TQlJERUNPREVSICpzZWxmKSB7CisgIGludCBpOworICBpbnQgZWxJZHg7CisKKyAgaWYgKHNlbGYgIT0gTlVMTCAmJiAqc2VsZiAhPSBOVUxMKSB7CisgICAgZm9yIChpID0gMDsgaSA8ICg4KTsgaSsrKSB7CisgICAgICBzYnJEZWNvZGVyX0Rlc3Ryb3lFbGVtZW50KCpzZWxmLCBpKTsKKyAgICB9CisKKyAgICBmb3IgKGVsSWR4ID0gMDsgZWxJZHggPCAoOCk7IGVsSWR4ICs9IDEpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoMSkgKyAxOyBpICs9IDEpIHsKKyAgICAgICAgKCpzZWxmKS0+c2JySGVhZGVyW2VsSWR4XVtpXS5zeW5jU3RhdGUgPSBTQlJfTk9UX0lOSVRJQUxJWkVEOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBTQlJERUNfT0s7Cit9CisKKy8qKgogICogXGJyaWVmIEFwcGx5IGRlY29kZWQgU0JSIGhlYWRlciBmb3Igb25lIGVsZW1lbnQuCiAgKiBccGFyYW0gc2VsZiBTQlIgZGVjb2RlciBpbnN0YW5jZSBoYW5kbGUKICAqIFxwYXJhbSBoU2JySGVhZGVyIFNCUiBoZWFkZXIgaGFuZGxlIHRvIGJlIHByb2Nlc3NlZC4KLSAqIFxwYXJhbSBoU2JyQ2hhbm5lbCBwb2ludGVyIGFycmF5IHRvIHRoZSBTQlIgZWxlbWVudCBjaGFubmVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBTQlIgaGVhZGVyLgorICogXHBhcmFtIGhTYnJDaGFubmVsIHBvaW50ZXIgYXJyYXkgdG8gdGhlIFNCUiBlbGVtZW50IGNoYW5uZWxzIGNvcnJlc3BvbmRpbmcgdG8KKyAqIHRoZSBTQlIgaGVhZGVyLgogICogXHBhcmFtIGhlYWRlclN0YXR1cyBoZWFkZXIgc3RhdHVzIHZhbHVlIHJldHVybmVkIGZyb20gU0JSIGhlYWRlciBwYXJzZXIuCi0gKiBccGFyYW0gbnVtRWxlbWVudENoYW5uZWxzIGFtb3VudCBvZiBjaGFubmVscyBmb3IgdGhlIFNCUiBlbGVtZW50IHdob3MgaGVhZGVyIGlzIHRvIGJlIHByb2Nlc3NlZC4KKyAqIFxwYXJhbSBudW1FbGVtZW50Q2hhbm5lbHMgYW1vdW50IG9mIGNoYW5uZWxzIGZvciB0aGUgU0JSIGVsZW1lbnQgd2hvcyBoZWFkZXIKKyAqIGlzIHRvIGJlIHByb2Nlc3NlZC4KICAqLwotc3RhdGljCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9IZWFkZXJVcGRhdGUoCi0gICAgICAgIEhBTkRMRV9TQlJERUNPREVSIHNlbGYsCi0gICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaFNickhlYWRlciwKLSAgICAgICAgU0JSX0hFQURFUl9TVEFUVVMgaGVhZGVyU3RhdHVzLAotICAgICAgICBIQU5ETEVfU0JSX0NIQU5ORUwgaFNickNoYW5uZWxbXSwKLSAgICAgICAgY29uc3QgaW50IG51bUVsZW1lbnRDaGFubmVscwotICAgICAgICApCi17CitzdGF0aWMgU0JSX0VSUk9SIHNickRlY29kZXJfSGVhZGVyVXBkYXRlKEhBTkRMRV9TQlJERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaFNickhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0hFQURFUl9TVEFUVVMgaGVhZGVyU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NIQU5ORUwgaFNickNoYW5uZWxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUVsZW1lbnRDaGFubmVscykgewogICBTQlJfRVJST1IgZXJyb3JTdGF0dXMgPSBTQlJERUNfT0s7CiAKICAgLyoKQEAgLTYyMiw4ICs3NzYsMTQgQEAKICAgZXJyb3JTdGF0dXMgPSByZXNldEZyZXFCYW5kVGFibGVzKGhTYnJIZWFkZXIsIHNlbGYtPmZsYWdzKTsKIAogICBpZiAoZXJyb3JTdGF0dXMgPT0gU0JSREVDX09LKSB7Ci0gICAgaWYgKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBVUFNBTVBMSU5HICYmIGhlYWRlclN0YXR1cyAhPSBIRUFERVJfUkVTRVQpCi0gICAgeworICAgIGlmIChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gVVBTQU1QTElORyAmJiBoZWFkZXJTdGF0dXMgIT0gSEVBREVSX1JFU0VUKSB7CisjaWYgKFNCUkRFQ19NQVhfSEJfRkFERV9GUkFNRVMgPiAwKQorICAgICAgaW50IGNoOworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbnVtRWxlbWVudENoYW5uZWxzOyBjaCArPSAxKSB7CisgICAgICAgIGhTYnJDaGFubmVsW2NoXS0+U2JyRGVjLmhpZ2hCYW5kRmFkZUNudCA9IFNCUkRFQ19NQVhfSEJfRkFERV9GUkFNRVM7CisgICAgICB9CisKKyNlbmRpZgogICAgICAgLyogQXMgdGhlIGRlZmF1bHQgaGVhZGVyIHdvdWxkIGxpbWl0IHRoZSBmcmVxdWVuY3kgcmFuZ2UsCiAgICAgICAgICBsb3dTdWJiYW5kIGFuZCBoaWdoU3ViYmFuZCBtdXN0IGJlIHBhdGNoZWQuICovCiAgICAgICBoU2JySGVhZGVyLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZCA9IGhTYnJIZWFkZXItPm51bWJlck9mQW5hbHlzaXNCYW5kczsKQEAgLTYzNywxNTUgKzc5NywxNTMgQEAKICAgcmV0dXJuIGVycm9yU3RhdHVzOwogfQogCi1JTlQgc2JyRGVjb2Rlcl9IZWFkZXIgKAotICAgICAgICBIQU5ETEVfU0JSREVDT0RFUiAgICAgICBzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBoQnMsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlSW4sCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlT3V0LAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCi0gICAgICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEICAgIGVsZW1lbnRJRCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgZWxlbWVudEluZGV4Ci0gICAgICAgICkKLXsKK0lOVCBzYnJEZWNvZGVyX0hlYWRlcihIQU5ETEVfU0JSREVDT0RFUiBzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVJbiwgY29uc3QgSU5UIHNhbXBsZVJhdGVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxlbWVudElELCBjb25zdCBJTlQgZWxlbWVudEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGhhcm1vbmljU0JSLCBjb25zdCBVQ0hBUiBzdGVyZW9Db25maWdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBjb25maWdNb2RlLCBVQ0hBUiAqY29uZmlnQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZG93bnNjYWxlRmFjdG9yKSB7CiAgIFNCUl9IRUFERVJfU1RBVFVTIGhlYWRlclN0YXR1czsKICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyOwogICBTQlJfRVJST1Igc2JyRXJyb3IgPSBTQlJERUNfT0s7CiAgIGludCBoZWFkZXJJbmRleDsKKyAgVUlOVCBmbGFnc1NhdmVkID0KKyAgICAgIDA7IC8qIGZsYWdzIHNob3VsZCBub3QgYmUgY2hhbmdlZCBpbiBBQ19DTV9ERVRfQ0ZHX0NIQU5HRSAtIG1vZGUgYWZ0ZXIKKyAgICAgICAgICAgIHBhcnNpbmcgKi8KIAotICBpZiAoIHNlbGYgPT0gTlVMTCB8fCBlbGVtZW50SW5kZXggPiAoOCkgKQotICB7CisgIGlmIChzZWxmID09IE5VTEwgfHwgZWxlbWVudEluZGV4ID49ICg4KSkgewogICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICB9CiAKLSAgaWYgKCEgc2JyRGVjb2Rlcl9pc0NvcmVDb2RlY1ZhbGlkKGNvcmVDb2RlYykpIHsKKyAgaWYgKCFzYnJEZWNvZGVyX2lzQ29yZUNvZGVjVmFsaWQoY29yZUNvZGVjKSkgewogICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICB9CiAKKyAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9ERVRfQ0ZHX0NIQU5HRSkgeworICAgIGZsYWdzU2F2ZWQgPSBzZWxmLT5mbGFnczsgLyogc3RvcmUgKi8KKyAgfQorCiAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9Jbml0RWxlbWVudCgKLSAgICAgICAgICBzZWxmLAotICAgICAgICAgIHNhbXBsZVJhdGVJbiwKLSAgICAgICAgICBzYW1wbGVSYXRlT3V0LAotICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICBjb3JlQ29kZWMsCi0gICAgICAgICAgZWxlbWVudElELAotICAgICAgICAgIGVsZW1lbnRJbmRleAotICAgICAgICAgICk7CisgICAgICBzZWxmLCBzYW1wbGVSYXRlSW4sIHNhbXBsZVJhdGVPdXQsIHNhbXBsZXNQZXJGcmFtZSwgY29yZUNvZGVjLCBlbGVtZW50SUQsCisgICAgICBlbGVtZW50SW5kZXgsIGhhcm1vbmljU0JSLCBzdGVyZW9Db25maWdJbmRleCwgY29uZmlnTW9kZSwgY29uZmlnQ2hhbmdlZCwKKyAgICAgIGRvd25zY2FsZUZhY3Rvcik7CiAKLSAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykgeworICBpZiAoKHNickVycm9yICE9IFNCUkRFQ19PSykgfHwgKGVsZW1lbnRJRCA9PSBJRF9MRkUpKSB7CiAgICAgZ290byBiYWlsOwogICB9CiAKLSAgaGVhZGVySW5kZXggPSBnZXRIZWFkZXJTbG90KHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnVzZUZyYW1lU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnVzZUhlYWRlclNsb3QpOwotICBoU2JySGVhZGVyID0gJihzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtoZWFkZXJJbmRleF0pOworICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0RFVF9DRkdfQ0hBTkdFKSB7CisgICAgaFNickhlYWRlciA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgaGVhZGVySW5kZXggPSBnZXRIZWFkZXJTbG90KHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnVzZUZyYW1lU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dXNlSGVhZGVyU2xvdCk7CiAKLSAgaGVhZGVyU3RhdHVzID0gc2JyR2V0SGVhZGVyRGF0YSAoIGhTYnJIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGhTYnJIZWFkZXIgPSAmKHNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2hlYWRlckluZGV4XSk7CisgIH0KIAorICBoZWFkZXJTdGF0dXMgPSBzYnJHZXRIZWFkZXJEYXRhKGhTYnJIZWFkZXIsIGhCcywgc2VsZi0+ZmxhZ3MsIDAsIGNvbmZpZ01vZGUpOwogCi0gIHsKKyAgaWYgKGNvcmVDb2RlYyA9PSBBT1RfVVNBQykgeworICAgIGlmIChjb25maWdNb2RlICYgQUNfQ01fREVUX0NGR19DSEFOR0UpIHsKKyAgICAgIHNlbGYtPmZsYWdzID0gZmxhZ3NTYXZlZDsgLyogcmVzdG9yZSAqLworICAgIH0KKyAgICByZXR1cm4gc2JyRXJyb3I7CisgIH0KKworICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0FMTE9DX01FTSkgewogICAgIFNCUl9ERUNPREVSX0VMRU1FTlQgKnBTYnJFbGVtZW50OwogCiAgICAgcFNickVsZW1lbnQgPSBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdOwogCiAgICAgLyogU2FuaXR5IGNoZWNrICovCiAgICAgaWYgKHBTYnJFbGVtZW50ICE9IE5VTEwpIHsKLSAgICAgIGlmICggKGVsZW1lbnRJRCA9PSBJRF9DUEUgJiYgcFNickVsZW1lbnQtPm5DaGFubmVscyAhPSAyKQotICAgICAgICB8fCAoZWxlbWVudElEICE9IElEX0NQRSAmJiBwU2JyRWxlbWVudC0+bkNoYW5uZWxzICE9IDEpICkKLSAgICAgIHsKKyAgICAgIGlmICgoZWxlbWVudElEID09IElEX0NQRSAmJiBwU2JyRWxlbWVudC0+bkNoYW5uZWxzICE9IDIpIHx8CisgICAgICAgICAgKGVsZW1lbnRJRCAhPSBJRF9DUEUgJiYgcFNickVsZW1lbnQtPm5DaGFubmVscyAhPSAxKSkgewogICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgICAgIH0KLSAgICAgIGlmICggaGVhZGVyU3RhdHVzID09IEhFQURFUl9SRVNFVCApIHsKLQotICAgICAgICBzYnJFcnJvciA9IHNickRlY29kZXJfSGVhZGVyVXBkYXRlKAotICAgICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgICBoU2JySGVhZGVyLAotICAgICAgICAgICAgICBoZWFkZXJTdGF0dXMsCi0gICAgICAgICAgICAgIHBTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbCwKLSAgICAgICAgICAgICAgcFNickVsZW1lbnQtPm5DaGFubmVscwotICAgICAgICAgICAgICApOworICAgICAgaWYgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfUkVTRVQpIHsKKyAgICAgICAgc2JyRXJyb3IgPSBzYnJEZWNvZGVyX0hlYWRlclVwZGF0ZShzZWxmLCBoU2JySGVhZGVyLCBoZWFkZXJTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNickVsZW1lbnQtPnBTYnJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYnJFbGVtZW50LT5uQ2hhbm5lbHMpOwogCiAgICAgICAgIGlmIChzYnJFcnJvciA9PSBTQlJERUNfT0spIHsKICAgICAgICAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPSBTQlJfSEVBREVSOwotICAgICAgICAgIGhTYnJIZWFkZXItPnN0YXR1cyAgIHw9IFNCUkRFQ19IRFJfU1RBVF9VUERBVEU7CisgICAgICAgICAgaFNickhlYWRlci0+c3RhdHVzIHw9IFNCUkRFQ19IRFJfU1RBVF9VUERBVEU7CiAgICAgICAgIH0KICAgICAgICAgLyogZWxzZSB7Ci0gICAgICAgICAgU2luY2Ugd2UgYWxyZWFkeSBoYXZlIG92ZXJ3cml0dGVuIHRoZSBvbGQgU0JSIGhlYWRlciB0aGUgb25seSB3YXkgb3V0IGlzIFVQU0FNUExJTkchCi0gICAgICAgICAgVGhpcyB3aWxsIGJlIHByZXBhcmVkIGluIHRoZSBuZXh0IHN0ZXAuCisgICAgICAgICAgU2luY2Ugd2UgYWxyZWFkeSBoYXZlIG92ZXJ3cml0dGVuIHRoZSBvbGQgU0JSIGhlYWRlciB0aGUgb25seSB3YXkgb3V0CisgICAgICAgIGlzIFVQU0FNUExJTkchIFRoaXMgd2lsbCBiZSBwcmVwYXJlZCBpbiB0aGUgbmV4dCBzdGVwLgogICAgICAgICB9ICovCiAgICAgICB9CiAgICAgfQogICB9CiBiYWlsOgorICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0RFVF9DRkdfQ0hBTkdFKSB7CisgICAgc2VsZi0+ZmxhZ3MgPSBmbGFnc1NhdmVkOyAvKiByZXN0b3JlICovCisgIH0KICAgcmV0dXJuIHNickVycm9yOwogfQogCi0KLVNCUl9FUlJPUiBzYnJEZWNvZGVyX1NldFBhcmFtIChIQU5ETEVfU0JSREVDT0RFUiAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0JSREVDX1BBUkFNICBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIHZhbHVlICkKLXsKK1NCUl9FUlJPUiBzYnJEZWNvZGVyX1NldFBhcmFtKEhBTkRMRV9TQlJERUNPREVSIHNlbGYsIGNvbnN0IFNCUkRFQ19QQVJBTSBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB2YWx1ZSkgewogICBTQlJfRVJST1IgZXJyb3JTdGF0dXMgPSBTQlJERUNfT0s7CiAKICAgLyogY29uZmlndXJlIHRoZSBzdWJzeXN0ZW1zICovCi0gIHN3aXRjaCAocGFyYW0pCi0gIHsKLSAgY2FzZSBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWToKLSAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gKDEpKSB7Ci0gICAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19TRVRfUEFSQU1fRkFJTDsKKyAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgU0JSX1NZU1RFTV9CSVRTVFJFQU1fREVMQVk6CisgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gKDEpKSB7CisgICAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2VsZi0+bnVtRGVsYXlGcmFtZXMgPSAoVUNIQVIpdmFsdWU7CisgICAgICB9CiAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOwotICAgIH0gZWxzZSB7Ci0gICAgICBzZWxmLT5udW1EZWxheUZyYW1lcyA9IChVQ0hBUil2YWx1ZTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX1FNRl9NT0RFOgotICAgIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHZhbHVlID09IDEpIHsKLSAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gU0JSREVDX0xPV19QT1dFUjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfTE9XX1BPV0VSOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBTQlJfTERfUU1GX1RJTUVfQUxJR046Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAodmFsdWUgPT0gMSkgewotICAgICAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfTERfTVBTX1FNRjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfTERfTVBTX1FNRjsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX0ZMVVNIX0RBVEE6Ci0gICAgaWYgKHZhbHVlICE9IDApIHsKKyAgICBjYXNlIFNCUl9RTUZfTU9ERToKICAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gU0JSREVDX0ZMVVNIOworICAgICAgICBpZiAodmFsdWUgPT0gMSkgeworICAgICAgICAgIHNlbGYtPmZsYWdzIHw9IFNCUkRFQ19MT1dfUE9XRVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VsZi0+ZmxhZ3MgJj0gflNCUkRFQ19MT1dfUE9XRVI7CisgICAgICAgIH0KICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX0NMRUFSX0hJU1RPUlk6Ci0gICAgaWYgKHZhbHVlICE9IDApIHsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JSX0xEX1FNRl9USU1FX0FMSUdOOgogICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgewogICAgICAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19OT1RfSU5JVElBTElaRUQ7CiAgICAgICB9IGVsc2UgewotICAgICAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfRk9SQ0VfUkVTRVQ7CisgICAgICAgIGlmICh2YWx1ZSA9PSAxKSB7CisgICAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gU0JSREVDX0xEX01QU19RTUY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VsZi0+ZmxhZ3MgJj0gflNCUkRFQ19MRF9NUFNfUU1GOworICAgICAgICB9CiAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIFNCUl9CU19JTlRFUlJVUFRJT046Ci0gICAgeworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlJfRkxVU0hfREFUQToKKyAgICAgIGlmICh2YWx1ZSAhPSAwKSB7CisgICAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19OT1RfSU5JVElBTElaRUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gU0JSREVDX0ZMVVNIOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCUl9DTEVBUl9ISVNUT1JZOgorICAgICAgaWYgKHZhbHVlICE9IDApIHsKKyAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfRk9SQ0VfUkVTRVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JSX0JTX0lOVEVSUlVQVElPTjogewogICAgICAgaW50IGVsZW1lbnRJbmRleDsKIAogICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgewpAQCAtNzk0LDM4ICs5NTIsNTUgQEAKICAgICAgIH0KIAogICAgICAgLyogTG9vcCBvdmVyIFNCUiBlbGVtZW50cyAqLwotICAgICAgZm9yIChlbGVtZW50SW5kZXggPSAwOyBlbGVtZW50SW5kZXggPCBzZWxmLT5udW1TYnJFbGVtZW50czsgZWxlbWVudEluZGV4KyspIHsKLSAgICAgIGlmIChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaFNickhlYWRlcjsKLSAgICAgICAgaW50IGhlYWRlckluZGV4ID0gZ2V0SGVhZGVyU2xvdChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT51c2VGcmFtZVNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dXNlSGVhZGVyU2xvdCk7CisgICAgICBmb3IgKGVsZW1lbnRJbmRleCA9IDA7IGVsZW1lbnRJbmRleCA8IHNlbGYtPm51bVNickVsZW1lbnRzOworICAgICAgICAgICBlbGVtZW50SW5kZXgrKykgeworICAgICAgICBpZiAoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSAhPSBOVUxMKSB7CisgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyOworICAgICAgICAgIGludCBoZWFkZXJJbmRleCA9CisgICAgICAgICAgICAgIGdldEhlYWRlclNsb3Qoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dXNlRnJhbWVTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnVzZUhlYWRlclNsb3QpOwogCi0gICAgICAgIGhTYnJIZWFkZXIgPSAmKHNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2hlYWRlckluZGV4XSk7CisgICAgICAgICAgaFNickhlYWRlciA9ICYoc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1baGVhZGVySW5kZXhdKTsKIAotICAgICAgICAvKiBTZXQgc3luYyBzdGF0ZSBVUFNBTVBMSU5HIGZvciB0aGUgY29ycmVzcG9uZGluZyBzbG90LgotICAgICAgICAgICBUaGlzIHN3aXRjaGVzIG9mZiBiaXRzdHJlYW0gcGFyc2luZyB1bnRpbCBhIG5ldyBoZWFkZXIgYXJyaXZlcy4gKi8KLSAgICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gVVBTQU1QTElORzsKLSAgICAgICAgaFNickhlYWRlci0+c3RhdHVzICAgfD0gU0JSREVDX0hEUl9TVEFUX1VQREFURTsKLSAgICAgIH0gfQotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICBicmVhazsKLSAgfSAgLyogc3dpdGNoKHBhcmFtKSAqLworICAgICAgICAgIC8qIFNldCBzeW5jIHN0YXRlIFVQU0FNUExJTkcgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHNsb3QuCisgICAgICAgICAgICAgVGhpcyBzd2l0Y2hlcyBvZmYgYml0c3RyZWFtIHBhcnNpbmcgdW50aWwgYSBuZXcgaGVhZGVyIGFycml2ZXMuICovCisgICAgICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gVVBTQU1QTElORzsKKyAgICAgICAgICBoU2JySGVhZGVyLT5zdGF0dXMgfD0gU0JSREVDX0hEUl9TVEFUX1VQREFURTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gYnJlYWs7CisKKyAgICBjYXNlIFNCUl9TS0lQX1FNRjoKKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHZhbHVlID09IDEpIHsKKyAgICAgICAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfU0tJUF9RTUZfQU5BOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfU0tJUF9RTUZfQU5BOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSA9PSAyKSB7CisgICAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gU0JSREVDX1NLSVBfUU1GX1NZTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX1NLSVBfUU1GX1NZTjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgYnJlYWs7CisgIH0gLyogc3dpdGNoKHBhcmFtKSAqLwogCiAgIHJldHVybiAoZXJyb3JTdGF0dXMpOwogfQogCi1zdGF0aWMKLVNCUkRFQ19EUkNfQ0hBTk5FTCAqIHNickRlY29kZXJfZHJjR2V0Q2hhbm5lbCggY29uc3QgSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgY29uc3QgSU5UIGNoYW5uZWwgKQoteworc3RhdGljIFNCUkRFQ19EUkNfQ0hBTk5FTCAqc2JyRGVjb2Rlcl9kcmNHZXRDaGFubmVsKAorICAgIGNvbnN0IEhBTkRMRV9TQlJERUNPREVSIHNlbGYsIGNvbnN0IElOVCBjaGFubmVsKSB7CiAgIFNCUkRFQ19EUkNfQ0hBTk5FTCAqcFNickRyY0NoYW5uZWxEYXRhID0gTlVMTDsKLSAgaW50IGVsZW1lbnRJbmRleCwgZWxDaGFuSWR4PTAsIG51bUNoPTA7CisgIGludCBlbGVtZW50SW5kZXgsIGVsQ2hhbklkeCA9IDAsIG51bUNoID0gMDsKIAotICBmb3IgKGVsZW1lbnRJbmRleCA9IDA7IChlbGVtZW50SW5kZXggPCAoOCkpICYmIChudW1DaCA8PSBjaGFubmVsKTsgZWxlbWVudEluZGV4KyspCi0gIHsKKyAgZm9yIChlbGVtZW50SW5kZXggPSAwOyAoZWxlbWVudEluZGV4IDwgKDgpKSAmJiAobnVtQ2ggPD0gY2hhbm5lbCk7CisgICAgICAgZWxlbWVudEluZGV4KyspIHsKICAgICBTQlJfREVDT0RFUl9FTEVNRU5UICpwU2JyRWxlbWVudCA9IHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF07CiAgICAgaW50IGMsIGVsQ2hhbm5lbHM7CiAKQEAgLTgzNCwxOCArMTAwOSwyMSBAQAogCiAgICAgLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBjaGFubmVscyBmb3IgdGhpcyBlbGVtZW50ICovCiAgICAgc3dpdGNoIChwU2JyRWxlbWVudC0+ZWxlbWVudElEKSB7Ci0gICAgICBjYXNlIElEX0NQRTogZWxDaGFubmVscyA9IDI7CisgICAgICBjYXNlIElEX0NQRToKKyAgICAgICAgZWxDaGFubmVscyA9IDI7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBJRF9MRkU6Ci0gICAgICBjYXNlIElEX1NDRTogZWxDaGFubmVscyA9IDE7CisgICAgICBjYXNlIElEX1NDRToKKyAgICAgICAgZWxDaGFubmVscyA9IDE7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBJRF9OT05FOgotICAgICAgZGVmYXVsdDogZWxDaGFubmVscyA9IDA7CisgICAgICBkZWZhdWx0OgorICAgICAgICBlbENoYW5uZWxzID0gMDsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgLyogTGltaXQgd2l0aCBhY3R1YWwgYWxsb2NhdGVkIGVsZW1lbnQgY2hhbm5lbHMgKi8KLSAgICBlbENoYW5uZWxzID0gRkRLbWluKGVsQ2hhbm5lbHMsIHBTYnJFbGVtZW50LT5uQ2hhbm5lbHMpOworICAgIGVsQ2hhbm5lbHMgPSBmTWluKGVsQ2hhbm5lbHMsIHBTYnJFbGVtZW50LT5uQ2hhbm5lbHMpOwogCiAgICAgZm9yIChjID0gMDsgKGMgPCBlbENoYW5uZWxzKSAmJiAobnVtQ2ggPD0gY2hhbm5lbCk7IGMrKykgewogICAgICAgaWYgKHBTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbFtlbENoYW5JZHhdICE9IE5VTEwpIHsKQEAgLTg2MSwyNSArMTAzOSwyMiBAQAogICAgIHJldHVybiBOVUxMOwogICB9CiAKLSAgaWYgKCBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdICE9IE5VTEwgKSB7Ci0gICAgaWYgKCBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtlbENoYW5JZHhdICE9IE5VTEwgKQotICAgIHsKLSAgICAgIHBTYnJEcmNDaGFubmVsRGF0YSA9ICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtlbENoYW5JZHhdLT5TYnJEZWMuc2JyRHJjQ2hhbm5lbDsKKyAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0gIT0gTlVMTCkgeworICAgIGlmIChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtlbENoYW5JZHhdICE9IE5VTEwpIHsKKyAgICAgIHBTYnJEcmNDaGFubmVsRGF0YSA9ICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cFNickNoYW5uZWxbZWxDaGFuSWR4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlNickRlYy5zYnJEcmNDaGFubmVsOwogICAgIH0KICAgfQogCiAgIHJldHVybiAocFNickRyY0NoYW5uZWxEYXRhKTsKIH0KIAotU0JSX0VSUk9SIHNickRlY29kZXJfZHJjRmVlZENoYW5uZWwgKCBIQU5ETEVfU0JSREVDT0RFUiAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgIGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgbnVtQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgICpwTmV4dEZhY3RfbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgbmV4dEZhY3RfZXhwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAgICAgICAgICAgICAgZHJjSW50ZXJwb2xhdGlvblNjaGVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgIHdpblNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAqcEJhbmRUb3AgKQoteworU0JSX0VSUk9SIHNickRlY29kZXJfZHJjRmVlZENoYW5uZWwoSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgSU5UIGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBudW1CYW5kcywgRklYUF9EQkwgKnBOZXh0RmFjdF9tYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbmV4dEZhY3RfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgZHJjSW50ZXJwb2xhdGlvblNjaGVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIHdpblNlcXVlbmNlLCBVU0hPUlQgKnBCYW5kVG9wKSB7CiAgIFNCUkRFQ19EUkNfQ0hBTk5FTCAqcFNickRyY0NoYW5uZWxEYXRhID0gTlVMTDsKICAgaW50IGJhbmQsIGlzVmFsaWREYXRhID0gMDsKIApAQCAtODkxLDEzOCArMTA2NiwxMzYgQEAKICAgfQogCiAgIC8qIFNlYXJjaCBmb3IgZ2FpbiB2YWx1ZXMgZGlmZmVyZW50IHRvIDEuMGYgKi8KLSAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG51bUJhbmRzOyBiYW5kICs9IDEpIHsKLSAgICBpZiAoICEoKHBOZXh0RmFjdF9tYWdbYmFuZF0gPT0gRkwyRlhDT05TVF9EQkwoMC41KSkgICYmIChuZXh0RmFjdF9leHAgPT0gMSkpCi0gICAgICAmJiAhKChwTmV4dEZhY3RfbWFnW2JhbmRdID09IChGSVhQX0RCTClNQVhWQUxfREJMKSAmJiAobmV4dEZhY3RfZXhwID09IDApKSApIHsKKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IChpbnQpbnVtQmFuZHM7IGJhbmQgKz0gMSkgeworICAgIGlmICghKChwTmV4dEZhY3RfbWFnW2JhbmRdID09IEZMMkZYQ09OU1RfREJMKDAuNSkpICYmCisgICAgICAgICAgKG5leHRGYWN0X2V4cCA9PSAxKSkgJiYKKyAgICAgICAgISgocE5leHRGYWN0X21hZ1tiYW5kXSA9PSAoRklYUF9EQkwpTUFYVkFMX0RCTCkgJiYKKyAgICAgICAgICAobmV4dEZhY3RfZXhwID09IDApKSkgewogICAgICAgaXNWYWxpZERhdGEgPSAxOwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKICAgLyogRmluZCB0aGUgcmlnaHQgU0JSIGNoYW5uZWwgKi8KLSAgcFNickRyY0NoYW5uZWxEYXRhID0gc2JyRGVjb2Rlcl9kcmNHZXRDaGFubmVsKCBzZWxmLCBjaCApOworICBwU2JyRHJjQ2hhbm5lbERhdGEgPSBzYnJEZWNvZGVyX2RyY0dldENoYW5uZWwoc2VsZiwgY2gpOwogCi0gIGlmICggcFNickRyY0NoYW5uZWxEYXRhICE9IE5VTEwgKSB7Ci0gICAgaWYgKCBwU2JyRHJjQ2hhbm5lbERhdGEtPmVuYWJsZSB8fCBpc1ZhbGlkRGF0YSApCi0gIHsgLyogQWN0aXZhdGUgcHJvY2Vzc2luZyBvbmx5IHdpdGggcmVhbCBhbmQgdmFsaWQgZGF0YSAqLwotICAgIGludCBpOworICBpZiAocFNickRyY0NoYW5uZWxEYXRhICE9IE5VTEwpIHsKKyAgICBpZiAocFNickRyY0NoYW5uZWxEYXRhLT5lbmFibGUgfHwKKyAgICAgICAgaXNWYWxpZERhdGEpIHsgLyogQWN0aXZhdGUgcHJvY2Vzc2luZyBvbmx5IHdpdGggcmVhbCBhbmQgdmFsaWQgZGF0YSAqLworICAgICAgaW50IGk7CiAKLSAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPmVuYWJsZSAgID0gMTsKLSAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPm51bUJhbmRzTmV4dCA9IG51bUJhbmRzOworICAgICAgcFNickRyY0NoYW5uZWxEYXRhLT5lbmFibGUgPSAxOworICAgICAgcFNickRyY0NoYW5uZWxEYXRhLT5udW1CYW5kc05leHQgPSBudW1CYW5kczsKIAotICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+d2luU2VxdWVuY2VOZXh0ICAgICAgICAgICAgPSB3aW5TZXF1ZW5jZTsKLSAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0ID0gZHJjSW50ZXJwb2xhdGlvblNjaGVtZTsKLSAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPm5leHRGYWN0X2V4cCAgICAgICAgICAgICAgID0gbmV4dEZhY3RfZXhwOworICAgICAgcFNickRyY0NoYW5uZWxEYXRhLT53aW5TZXF1ZW5jZU5leHQgPSB3aW5TZXF1ZW5jZTsKKyAgICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHQgPSBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lOworICAgICAgcFNickRyY0NoYW5uZWxEYXRhLT5uZXh0RmFjdF9leHAgPSBuZXh0RmFjdF9leHA7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgKGludCludW1CYW5kczsgaSsrKSB7Ci0gICAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPmJhbmRUb3BOZXh0W2ldICA9IHBCYW5kVG9wW2ldOwotICAgICAgcFNickRyY0NoYW5uZWxEYXRhLT5uZXh0RmFjdF9tYWdbaV0gPSBwTmV4dEZhY3RfbWFnW2ldOworICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpbnVtQmFuZHM7IGkrKykgeworICAgICAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPmJhbmRUb3BOZXh0W2ldID0gcEJhbmRUb3BbaV07CisgICAgICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+bmV4dEZhY3RfbWFnW2ldID0gcE5leHRGYWN0X21hZ1tpXTsKKyAgICAgIH0KICAgICB9CiAgIH0KLSAgfQogCiAgIHJldHVybiBTQlJERUNfT0s7CiB9CiAKLQotdm9pZCBzYnJEZWNvZGVyX2RyY0Rpc2FibGUgKCBIQU5ETEVfU0JSREVDT0RFUiAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgIGNoICkKLXsKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNEaXNhYmxlKEhBTkRMRV9TQlJERUNPREVSIHNlbGYsIElOVCBjaCkgewogICBTQlJERUNfRFJDX0NIQU5ORUwgKnBTYnJEcmNDaGFubmVsRGF0YSA9IE5VTEw7CiAKLSAgaWYgKCAoc2VsZiA9PSBOVUxMKQotICAgIHx8IChjaCA+ICg4KSkKLSAgICB8fCAoc2VsZi0+bnVtU2JyRWxlbWVudHMgPT0gMCkKLSAgICB8fCAoc2VsZi0+bnVtU2JyQ2hhbm5lbHMgPT0gMCkgKSB7CisgIGlmICgoc2VsZiA9PSBOVUxMKSB8fCAoY2ggPiAoOCkpIHx8IChzZWxmLT5udW1TYnJFbGVtZW50cyA9PSAwKSB8fAorICAgICAgKHNlbGYtPm51bVNickNoYW5uZWxzID09IDApKSB7CiAgICAgcmV0dXJuOwogICB9CiAKICAgLyogRmluZCB0aGUgcmlnaHQgU0JSIGNoYW5uZWwgKi8KLSAgcFNickRyY0NoYW5uZWxEYXRhID0gc2JyRGVjb2Rlcl9kcmNHZXRDaGFubmVsKCBzZWxmLCBjaCApOworICBwU2JyRHJjQ2hhbm5lbERhdGEgPSBzYnJEZWNvZGVyX2RyY0dldENoYW5uZWwoc2VsZiwgY2gpOwogCi0gIGlmICggcFNickRyY0NoYW5uZWxEYXRhICE9IE5VTEwgKSB7Ci0gICAgc2JyRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbCggcFNickRyY0NoYW5uZWxEYXRhICk7CisgIGlmIChwU2JyRHJjQ2hhbm5lbERhdGEgIT0gTlVMTCkgeworICAgIHNickRlY29kZXJfZHJjSW5pdENoYW5uZWwocFNickRyY0NoYW5uZWxEYXRhKTsKICAgfQogfQogCi0KLQotU0JSX0VSUk9SIHNickRlY29kZXJfUGFyc2UoCi0gICAgICAgIEhBTkRMRV9TQlJERUNPREVSIHNlbGYsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQnMsCi0gICAgICAgIGludCAqY291bnQsCi0gICAgICAgIGludCAgYnNQYXlMZW4sCi0gICAgICAgIGludCAgY3JjRmxhZywKLSAgICAgICAgTVA0X0VMRU1FTlRfSUQgcHJldkVsZW1lbnQsCi0gICAgICAgIGludCBlbGVtZW50SW5kZXgsCi0gICAgICAgIGludCBmR2xvYmFsSW5kZXBlbmRlbmN5RmxhZwotICAgICAgICApCi17Ci0gIFNCUl9ERUNPREVSX0VMRU1FTlQgICAqaFNickVsZW1lbnQ7CitTQlJfRVJST1Igc2JyRGVjb2Rlcl9QYXJzZShIQU5ETEVfU0JSREVDT0RFUiBzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcERybUJzQnVmZmVyLCBVU0hPUlQgZHJtQnNCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb3VudCwgaW50IGJzUGF5TGVuLCBpbnQgY3JjRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNF9FTEVNRU5UX0lEIHByZXZFbGVtZW50LCBpbnQgZWxlbWVudEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhY0ZsYWdzLCBVSU5UIGFjRWxGbGFnc1tdKSB7CisgIFNCUl9ERUNPREVSX0VMRU1FTlQgKmhTYnJFbGVtZW50ID0gTlVMTDsKICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyID0gTlVMTDsKLSAgSEFORExFX1NCUl9DSEFOTkVMICAgICpwU2JyQ2hhbm5lbDsKKyAgSEFORExFX1NCUl9DSEFOTkVMICpwU2JyQ2hhbm5lbDsKIAotICBTQlJfRlJBTUVfREFUQSAqaEZyYW1lRGF0YUxlZnQ7Ci0gIFNCUl9GUkFNRV9EQVRBICpoRnJhbWVEYXRhUmlnaHQ7CisgIFNCUl9GUkFNRV9EQVRBICpoRnJhbWVEYXRhTGVmdCA9IE5VTEw7CisgIFNCUl9GUkFNRV9EQVRBICpoRnJhbWVEYXRhUmlnaHQgPSBOVUxMOworICBTQlJfRlJBTUVfREFUQSBmcmFtZURhdGFMZWZ0Q29weTsKKyAgU0JSX0ZSQU1FX0RBVEEgZnJhbWVEYXRhUmlnaHRDb3B5OwogCiAgIFNCUl9FUlJPUiBlcnJvclN0YXR1cyA9IFNCUkRFQ19PSzsKICAgU0JSX0hFQURFUl9TVEFUVVMgaGVhZGVyU3RhdHVzID0gSEVBREVSX05PVF9QUkVTRU5UOwogCi0gIElOVCAgc3RhcnRQb3M7Ci0gIElOVCAgQ1JDTGVuID0gMDsKKyAgSU5UIHN0YXJ0UG9zID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgIElOVCBDUkNMZW4gPSAwOwogICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnNPcmlnaW5hbCA9IGhCczsKLSAgRkRLX0NSQ0lORk8gIGNyY0luZm87ICAgICAgICAgLyogc2hhbGwgYmUgdXNlZCBmb3IgYWxsIG90aGVyIENSQ3MgaW4gdGhlIGZ1dHVyZSAoVEJEKSAqLwotICBJTlQgICAgICAgICAgY3JjUmVnID0gMDsKLSAgVVNIT1JUICAgICAgIGRybVNickNyYyA9IDA7CisgIEZES19CSVRTVFJFQU0gYnNCd2Q7CiAKLSAgaW50ICBzdGVyZW87Ci0gIGludCAgZkRvRGVjb2RlU2JyRGF0YSA9IDE7CisgIEZES19DUkNJTkZPIGNyY0luZm87CisgIElOVCBjcmNSZWcgPSAwOworICBVU0hPUlQgZHJtU2JyQ3JjID0gMDsKKyAgY29uc3QgaW50IGZHbG9iYWxJbmRlcGVuZGVuY3lGbGFnID0gYWNGbGFncyAmIEFDX0lOREVQOworICBjb25zdCBpbnQgYnNfcHZjID0gYWNFbEZsYWdzW2VsZW1lbnRJbmRleF0gJiBBQ19FTF9VU0FDX1BWQzsKKyAgY29uc3QgaW50IGJzX2ludGVyVGVzID0gYWNFbEZsYWdzW2VsZW1lbnRJbmRleF0gJiBBQ19FTF9VU0FDX0lURVM7CisgIGludCBzdGVyZW87CisgIGludCBmRG9EZWNvZGVTYnJEYXRhID0gMTsKIAotICBpbnQgbGFzdFNsb3QsIGxhc3RIZHJTbG90ID0gMCwgdGhpc0hkclNsb3Q7CisgIGludCBsYXN0U2xvdCwgbGFzdEhkclNsb3QgPSAwLCB0aGlzSGRyU2xvdCA9IDA7CisKKyAgLyogU0JSIHNhbml0eSBjaGVja3MgKi8KKyAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgIGVycm9yU3RhdHVzID0gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKKyAgICBnb3RvIGJhaWw7CisgIH0KIAogICAvKiBSZXZlcnNlIGJpdHMgb2YgRFJNIFNCUiBwYXlsb2FkICovCi0gIGlmICggKHNlbGYtPmZsYWdzICYgU0JSREVDX1NZTlRBWF9EUk0pICYmICpjb3VudCA+IDAgKQotICB7Ci0gICAgVUNIQVIgKmJzQnVmZmVyRHJtID0gKFVDSEFSKilzZWxmLT53b3JrQnVmZmVyMTsKLSAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnNCd2QgPSAoSEFORExFX0ZES19CSVRTVFJFQU0pIChic0J1ZmZlckRybSArICg1MTIpKTsKKyAgaWYgKChzZWxmLT5mbGFncyAmIFNCUkRFQ19TWU5UQVhfRFJNKSAmJiAqY291bnQgPiAwKSB7CiAgICAgaW50IGRhdGFCeXRlcywgZGF0YUJpdHM7CiAKKyAgICBGREtfQVNTRVJUKGRybUJzQnVmZmVyU2l6ZSA+PSAoNTEyKSk7CiAgICAgZGF0YUJpdHMgPSAqY291bnQ7CiAKLSAgICBpZiAoZGF0YUJpdHMgPiAoKDUxMikqOCkpIHsKKyAgICBpZiAoZGF0YUJpdHMgPiAoKDUxMikgKiA4KSkgewogICAgICAgLyogZG8gbm90IGZsaXAgbW9yZSBkYXRhIHRoYW4gbmVlZGVkICovCi0gICAgICBkYXRhQml0cyA9ICg1MTIpKjg7CisgICAgICBkYXRhQml0cyA9ICg1MTIpICogODsKICAgICB9CiAKLSAgICBkYXRhQnl0ZXMgPSAoZGF0YUJpdHMrNyk+PjM7CisgICAgZGF0YUJ5dGVzID0gKGRhdGFCaXRzICsgNykgPj4gMzsKIAogICAgIGludCBqOwogCiAgICAgaWYgKChqID0gKGludClGREtnZXRWYWxpZEJpdHMoaEJzKSkgIT0gOCkgewotICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoaEJzLCAoai04KSk7CisgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsIChqIC0gOCkpOwogICAgIH0KIAogICAgIGogPSAwOwotICAgIGZvciAoIDsgZGF0YUJ5dGVzID4gMDsgZGF0YUJ5dGVzLS0pCi0gICAgeworICAgIGZvciAoOyBkYXRhQnl0ZXMgPiAwOyBkYXRhQnl0ZXMtLSkgewogICAgICAgaW50IGk7CiAgICAgICBVQ0hBUiB0bXBCeXRlOwogICAgICAgVUNIQVIgYnVmZmVyID0gMHgwMDsKIAotICAgICAgdG1wQnl0ZSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoaEJzLCA4KTsKKyAgICAgIHRtcEJ5dGUgPSAoVUNIQVIpRkRLcmVhZEJpdHMoaEJzLCA4KTsKICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgaW50IHNoaWZ0ID0gMiAqIGkgKyAxOwotICAgICAgICBidWZmZXIgfD0gKHRtcEJ5dGUgJiAoMHgwOD4+aSkpIDw8IHNoaWZ0OwotICAgICAgICBidWZmZXIgfD0gKHRtcEJ5dGUgJiAoMHgxMDw8aSkpID4+IHNoaWZ0OworICAgICAgICBidWZmZXIgfD0gKHRtcEJ5dGUgJiAoMHgwOCA+PiBpKSkgPDwgc2hpZnQ7CisgICAgICAgIGJ1ZmZlciB8PSAodG1wQnl0ZSAmICgweDEwIDw8IGkpKSA+PiBzaGlmdDsKICAgICAgIH0KLSAgICAgIGJzQnVmZmVyRHJtW2orK10gPSBidWZmZXI7CisgICAgICBwRHJtQnNCdWZmZXJbaisrXSA9IGJ1ZmZlcjsKICAgICAgIEZES3B1c2hCYWNrKGhCcywgMTYpOwogICAgIH0KIAotICAgIEZES2luaXRCaXRTdHJlYW0oaEJzQndkLCBic0J1ZmZlckRybSwgKDUxMiksIGRhdGFCaXRzLCBCU19SRUFERVIpOworICAgIEZES2luaXRCaXRTdHJlYW0oJmJzQndkLCBwRHJtQnNCdWZmZXIsICg1MTIpLCBkYXRhQml0cywgQlNfUkVBREVSKTsKIAogICAgIC8qIFVzZSByZXZlcnNlZCBkYXRhICovCi0gICAgaEJzID0gaEJzQndkOworICAgIGhCcyA9ICZic0J3ZDsKICAgICBic1BheUxlbiA9ICpjb3VudDsKICAgfQogCkBAIC0xMDMwLDE2ICsxMjAzLDE5IEBACiAgIHN0YXJ0UG9zID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAKICAgLyogU0JSIHNhbml0eSBjaGVja3MgKi8KLSAgaWYgKCBzZWxmID09IE5VTEwgfHwgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSA9PSBOVUxMICkgeworICBpZiAoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSA9PSBOVUxMKSB7CiAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOwogICAgIGdvdG8gYmFpbDsKLSAgfSAKLQorICB9CiAgIGhTYnJFbGVtZW50ID0gc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XTsKIAotICBsYXN0U2xvdCAgICA9IChoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90ID4gMCkgPyBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90LTEgOiBzZWxmLT5udW1EZWxheUZyYW1lczsKLSAgbGFzdEhkclNsb3QgPSAgaFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3RbbGFzdFNsb3RdOwotICB0aGlzSGRyU2xvdCA9ICBnZXRIZWFkZXJTbG90KCBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90LCBoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdCApOyAgLyogR2V0IGEgZnJlZSBoZWFkZXIgc2xvdCBub3QgdXNlZCBieSBmcmFtZXMgbm90IHByb2Nlc3NlZCB5ZXQuICovCisgIGxhc3RTbG90ID0gKGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3QgPiAwKSA/IGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3QgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNlbGYtPm51bURlbGF5RnJhbWVzOworICBsYXN0SGRyU2xvdCA9IGhTYnJFbGVtZW50LT51c2VIZWFkZXJTbG90W2xhc3RTbG90XTsKKyAgdGhpc0hkclNsb3QgPSBnZXRIZWFkZXJTbG90KAorICAgICAgaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCwKKyAgICAgIGhTYnJFbGVtZW50LT51c2VIZWFkZXJTbG90KTsgLyogR2V0IGEgZnJlZSBoZWFkZXIgc2xvdCBub3QgdXNlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXMgbm90IHByb2Nlc3NlZCB5ZXQuICovCiAKICAgLyogQXNzaWduIHRoZSBmcmVlIHNsb3QgdG8gc3RvcmUgYSBuZXcgaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gKi8KICAgaFNickhlYWRlciA9ICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVt0aGlzSGRyU2xvdF07CkBAIC0xMDQ3LDkgKzEyMjMsMjAgQEAKICAgcFNickNoYW5uZWwgPSBoU2JyRWxlbWVudC0+cFNickNoYW5uZWw7CiAgIHN0ZXJlbyA9IChoU2JyRWxlbWVudC0+ZWxlbWVudElEID09IElEX0NQRSkgPyAxIDogMDsKIAotICBoRnJhbWVEYXRhTGVmdCAgPSAmc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbMF0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKLSAgaEZyYW1lRGF0YVJpZ2h0ID0gJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsWzFdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgIGhGcmFtZURhdGFMZWZ0ID0gJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0+cFNickNoYW5uZWxbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOworICBpZiAoc3RlcmVvKSB7CisgICAgaEZyYW1lRGF0YVJpZ2h0ID0gJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cFNickNoYW5uZWxbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOworICB9CiAKKyAgLyogc3RvcmUgZnJhbWVEYXRhOyBuZXcgcGFyc2VkIGZyYW1lRGF0YSBwb3NzaWJseSBjb3JydXB0ZWQgKi8KKyAgRkRLbWVtY3B5KCZmcmFtZURhdGFMZWZ0Q29weSwgaEZyYW1lRGF0YUxlZnQsIHNpemVvZihTQlJfRlJBTUVfREFUQSkpOworICBpZiAoc3RlcmVvKSB7CisgICAgRkRLbWVtY3B5KCZmcmFtZURhdGFSaWdodENvcHksIGhGcmFtZURhdGFSaWdodCwgc2l6ZW9mKFNCUl9GUkFNRV9EQVRBKSk7CisgIH0KIAogICAvKiByZXNldCBQUyBmbGFnOyB3aWxsIGJlIHNldCBhZnRlciBQUyB3YXMgZm91bmQgKi8KICAgc2VsZi0+ZmxhZ3MgJj0gflNCUkRFQ19QU19ERUNPREVEOwpAQCAtMTA1OCwyMyArMTI0NSwyMyBAQAogICAgIC8qIEdvdCBhIG5ldyBoZWFkZXIgZnJvbSBleHRlcm4gKGUuZy4gZnJvbSBhbiBBU0MpICovCiAgICAgaGVhZGVyU3RhdHVzID0gSEVBREVSX09LOwogICAgIGhTYnJIZWFkZXItPnN0YXR1cyAmPSB+U0JSREVDX0hEUl9TVEFUX1VQREFURTsKLSAgfQotICBlbHNlIGlmICh0aGlzSGRyU2xvdCAhPSBsYXN0SGRyU2xvdCkgeworICB9IGVsc2UgaWYgKHRoaXNIZHJTbG90ICE9IGxhc3RIZHJTbG90KSB7CiAgICAgLyogQ29weSB0aGUgbGFzdCBoZWFkZXIgaW50byB0aGlzIHNsb3Qgb3RoZXJ3aXNlIHRoZQogICAgICAgIGhlYWRlciBjb21wYXJlIHdpbGwgdHJpZ2dlciBtb3JlIEhFQURFUl9SRVNFVHMgdGhhbiBuZWVkZWQuICovCi0gICAgY29weVNickhlYWRlciggaFNickhlYWRlciwgJnNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2xhc3RIZHJTbG90XSApOworICAgIGNvcHlTYnJIZWFkZXIoaFNickhlYWRlciwgJnNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2xhc3RIZHJTbG90XSk7CiAgIH0KIAogICAvKgogICAgICBDaGVjayBpZiBiaXQgc3RyZWFtIGRhdGEgaXMgdmFsaWQgYW5kIG1hdGNoZXMgdGhlIGVsZW1lbnQgY29udGV4dAogICAqLwotICBpZiAoICgocHJldkVsZW1lbnQgIT0gSURfU0NFKSAmJiAocHJldkVsZW1lbnQgIT0gSURfQ1BFKSkgfHwgcHJldkVsZW1lbnQgIT0gaFNickVsZW1lbnQtPmVsZW1lbnRJRCkgewotICAgIC8qIEluIGNhc2Ugb2YgTEZFIHdlIGFsc28gbGFuZCBoZXJlLCBzaW5jZSB0aGVyZSBpcyBubyBMRkUgU0JSIGVsZW1lbnQgKGRvIHVwc2FtcGxpbmcgb25seSkgKi8KKyAgaWYgKCgocHJldkVsZW1lbnQgIT0gSURfU0NFKSAmJiAocHJldkVsZW1lbnQgIT0gSURfQ1BFKSkgfHwKKyAgICAgIHByZXZFbGVtZW50ICE9IGhTYnJFbGVtZW50LT5lbGVtZW50SUQpIHsKKyAgICAvKiBJbiBjYXNlIG9mIExGRSB3ZSBhbHNvIGxhbmQgaGVyZSwgc2luY2UgdGhlcmUgaXMgbm8gTEZFIFNCUiBlbGVtZW50IChkbworICAgICAqIHVwc2FtcGxpbmcgb25seSkgKi8KICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKICAgfQogCi0gIGlmIChmRG9EZWNvZGVTYnJEYXRhKQotICB7CisgIGlmIChmRG9EZWNvZGVTYnJEYXRhKSB7CiAgICAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgPD0gMCkgewogICAgICAgZkRvRGVjb2RlU2JyRGF0YSA9IDA7CiAgICAgfQpAQCAtMTA4MywyOSArMTI3MCwyOSBAQAogICAvKgogICAgICBTQlIgQ1JDLWNoZWNrCiAgICovCi0gIGlmIChmRG9EZWNvZGVTYnJEYXRhKQotICB7CisgIGlmIChmRG9EZWNvZGVTYnJEYXRhKSB7CiAgICAgaWYgKGNyY0ZsYWcpIHsKICAgICAgIHN3aXRjaCAoc2VsZi0+Y29yZUNvZGVjKSB7Ci0gICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgotICAgICAgICBGREtwdXNoRm9yIChoQnMsIDEwKTsKLSAgICAgICAgLyogY2hlY2sgc2JyY3JjIGxhdGVyOiB3ZSBkb24ndCBrbm93IHRoZSBwYXlsb2FkIGxlbmd0aCBub3cgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFPVF9EUk1fQUFDOgotICAgICAgICBkcm1TYnJDcmMgPSAoVVNIT1JUKUZES3JlYWRCaXRzKGhCcywgOCk7Ci0gICAgICAgIC8qIFNldHVwIENSQyBkZWNvZGVyICovCi0gICAgICAgIEZES2NyY0luaXQoJmNyY0luZm8sIDB4MDAxZCwgMHhGRkZGLCA4KTsKLSAgICAgICAgLyogU3RhcnQgQ1JDIHJlZ2lvbiAqLwotICAgICAgICBjcmNSZWcgPSBGREtjcmNTdGFydFJlZygmY3JjSW5mbywgaEJzLCAwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBDUkNMZW4gPSBic1BheUxlbiAtIDEwOyAgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5nZTogMCA9PiBpICovCi0gICAgICAgIGlmIChDUkNMZW4gPCAwKSB7Ci0gICAgICAgICAgZkRvRGVjb2RlU2JyRGF0YSA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZkRvRGVjb2RlU2JyRGF0YSA9IFNickNyY0NoZWNrIChoQnMsIENSQ0xlbik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgICAgICAgRkRLcHVzaEZvcihoQnMsIDEwKTsKKyAgICAgICAgICAvKiBjaGVjayBzYnJjcmMgbGF0ZXI6IHdlIGRvbid0IGtub3cgdGhlIHBheWxvYWQgbGVuZ3RoIG5vdyAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFPVF9EUk1fQUFDOgorICAgICAgICBjYXNlIEFPVF9EUk1fU1VSUk9VTkQ6CisgICAgICAgICAgZHJtU2JyQ3JjID0gKFVTSE9SVClGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgICAgIC8qIFNldHVwIENSQyBkZWNvZGVyICovCisgICAgICAgICAgRkRLY3JjSW5pdCgmY3JjSW5mbywgMHgwMDFkLCAweEZGRkYsIDgpOworICAgICAgICAgIC8qIFN0YXJ0IENSQyByZWdpb24gKi8KKyAgICAgICAgICBjcmNSZWcgPSBGREtjcmNTdGFydFJlZygmY3JjSW5mbywgaEJzLCAwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBDUkNMZW4gPSBic1BheUxlbiAtIDEwOyAvKiBjaGFuZ2U6IDAgPT4gaSAqLworICAgICAgICAgIGlmIChDUkNMZW4gPCAwKSB7CisgICAgICAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZkRvRGVjb2RlU2JyRGF0YSA9IFNickNyY0NoZWNrKGhCcywgQ1JDTGVuKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9IC8qIGlmIChmRG9EZWNvZGVTYnJEYXRhKSAqLwpAQCAtMTExMywzMCArMTMwMCwxMDYgQEAKICAgLyoKICAgICAgUmVhZCBpbiB0aGUgaGVhZGVyIGRhdGEgYW5kIGlzc3VlIGEgcmVzZXQgaWYgY2hhbmdlIG9jY3VyZWQKICAgKi8KLSAgaWYgKGZEb0RlY29kZVNickRhdGEpCi0gIHsKKyAgaWYgKGZEb0RlY29kZVNickRhdGEpIHsKICAgICBpbnQgc2JySGVhZGVyUHJlc2VudDsKIAotICAgIHsKKyAgICBpZiAoc2VsZi0+ZmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9SU1ZENTAgfCBTQlJERUNfU1lOVEFYX1VTQUMpKSB7CisgICAgICBTQlJfSEVBREVSX0RBVEFfQlNfSU5GTyBuZXdTYnJJbmZvOworICAgICAgaW50IHNickluZm9QcmVzZW50OworCisgICAgICBpZiAoYnNfaW50ZXJUZXMpIHsKKyAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gU0JSREVDX1VTQUNfSVRFUzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfVVNBQ19JVEVTOworICAgICAgfQorCisgICAgICBpZiAoZkdsb2JhbEluZGVwZW5kZW5jeUZsYWcpIHsKKyAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gU0JSREVDX1VTQUNfSU5ERVA7CisgICAgICAgIHNickluZm9QcmVzZW50ID0gMTsKKyAgICAgICAgc2JySGVhZGVyUHJlc2VudCA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX1VTQUNfSU5ERVA7CisgICAgICAgIHNickluZm9QcmVzZW50ID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICBpZiAoc2JySW5mb1ByZXNlbnQpIHsKKyAgICAgICAgICBzYnJIZWFkZXJQcmVzZW50ID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNickhlYWRlclByZXNlbnQgPSAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChzYnJJbmZvUHJlc2VudCkgeworICAgICAgICBuZXdTYnJJbmZvLmFtcFJlc29sdXRpb24gPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgIG5ld1NickluZm8ueG92ZXJfYmFuZCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICAgIG5ld1NickluZm8uc2JyX3ByZXByb2Nlc3NpbmcgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgIGlmIChic19wdmMpIHsKKyAgICAgICAgICBuZXdTYnJJbmZvLnB2Y19tb2RlID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICAgICAgICAvKiBic19wdmNfbW9kZTogMCAtPiBubyBQVkMsIDEgLT4gUFZDIG1vZGUgMSwgMiAtPiBQVkMgbW9kZSAyLCAzIC0+CisgICAgICAgICAgICogcmVzZXJ2ZWQgKi8KKyAgICAgICAgICBpZiAobmV3U2JySW5mby5wdmNfbW9kZSA+IDIpIHsKKyAgICAgICAgICAgIGhlYWRlclN0YXR1cyA9IEhFQURFUl9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN0ZXJlbyAmJiBuZXdTYnJJbmZvLnB2Y19tb2RlID4gMCkgeworICAgICAgICAgICAgLyogYnNfcHZjIGlzIGFsd2F5cyB0cmFuc21pdHRlZCBidXQgcHZjX21vZGUgaXMgc2V0IHRvIHplcm8gaW4gY2FzZQorICAgICAgICAgICAgICogb2Ygc3RlcmVvIFNCUi4gVGhlIGNvbmZpZyBtaWdodCBiZSB3cm9uZyBidXQgd2UgY2Fubm90IHRlbGwgZm9yCisgICAgICAgICAgICAgKiBzdXJlLiAqLworICAgICAgICAgICAgbmV3U2JySW5mby5wdmNfbW9kZSA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5ld1NickluZm8ucHZjX21vZGUgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChoZWFkZXJTdGF0dXMgIT0gSEVBREVSX0VSUk9SKSB7CisgICAgICAgICAgaWYgKEZES21lbWNtcCgmaFNickhlYWRlci0+YnNfaW5mbywgJm5ld1NickluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU0JSX0hFQURFUl9EQVRBX0JTX0lORk8pKSkgeworICAgICAgICAgICAgLyogaW4gY2FzZSBvZiBhbXBSZXNvbHV0aW9uIGFuZCBwcmVwcm9jZXNzaW5nIGNoYW5nZSBubyBmdWxsIHJlc2V0CisgICAgICAgICAgICAgKiByZXF1aXJlZCAgICAqLworICAgICAgICAgICAgLyogSEVBREVSIHJlc2V0IHdvdWxkIHRyaWdnZXIgSEJFIHRyYW5zcG9zZXIgcmVzZXQgd2hpY2ggYnJlYWtzCisgICAgICAgICAgICAgKiBlU2JyXzNfRWFhLm1wNCAqLworICAgICAgICAgICAgaWYgKChoU2JySGVhZGVyLT5ic19pbmZvLnB2Y19tb2RlICE9IG5ld1NickluZm8ucHZjX21vZGUpIHx8CisgICAgICAgICAgICAgICAgKGhTYnJIZWFkZXItPmJzX2luZm8ueG92ZXJfYmFuZCAhPSBuZXdTYnJJbmZvLnhvdmVyX2JhbmQpKSB7CisgICAgICAgICAgICAgIGhlYWRlclN0YXR1cyA9IEhFQURFUl9SRVNFVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGhlYWRlclN0YXR1cyA9IEhFQURFUl9PSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaFNickhlYWRlci0+YnNfaW5mbyA9IG5ld1NickluZm87CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhlYWRlclN0YXR1cyA9IEhFQURFUl9PSzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChoZWFkZXJTdGF0dXMgPT0gSEVBREVSX0VSUk9SKSB7CisgICAgICAgIC8qIENvcnJ1cHQgU0JSIGluZm8gZGF0YSwgZG8gbm90IGRlY29kZSBhbmQgc3dpdGNoIHRvIFVQU0FNUExJTkcgKi8KKyAgICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gVVBTQU1QTElORzsKKyAgICAgICAgZkRvRGVjb2RlU2JyRGF0YSA9IDA7CisgICAgICAgIHNickhlYWRlclByZXNlbnQgPSAwOworICAgICAgfQorCisgICAgICBpZiAoc2JySGVhZGVyUHJlc2VudCAmJiBmRG9EZWNvZGVTYnJEYXRhKSB7CisgICAgICAgIGludCB1c2VEZmx0SGVhZGVyOworCisgICAgICAgIHVzZURmbHRIZWFkZXIgPSBGREtyZWFkQml0KGhCcyk7CisKKyAgICAgICAgaWYgKHVzZURmbHRIZWFkZXIpIHsKKyAgICAgICAgICBzYnJIZWFkZXJQcmVzZW50ID0gMDsKKyAgICAgICAgICBpZiAoRkRLbWVtY21wKCZoU2JySGVhZGVyLT5ic19kYXRhLCAmaFNickhlYWRlci0+YnNfZGZsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTQlJfSEVBREVSX0RBVEFfQlMpKSB8fAorICAgICAgICAgICAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgIT0gU0JSX0FDVElWRSkgeworICAgICAgICAgICAgaFNickhlYWRlci0+YnNfZGF0YSA9IGhTYnJIZWFkZXItPmJzX2RmbHQ7CisgICAgICAgICAgICBoZWFkZXJTdGF0dXMgPSBIRUFERVJfUkVTRVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKICAgICAgIHNickhlYWRlclByZXNlbnQgPSBGREtyZWFkQml0KGhCcyk7CiAgICAgfQogCi0gICAgaWYgKCBzYnJIZWFkZXJQcmVzZW50ICkgewotICAgICAgaGVhZGVyU3RhdHVzID0gc2JyR2V0SGVhZGVyRGF0YSAoaFNickhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgaWYgKHNickhlYWRlclByZXNlbnQpIHsKKyAgICAgIGhlYWRlclN0YXR1cyA9IHNickdldEhlYWRlckRhdGEoaFNickhlYWRlciwgaEJzLCBzZWxmLT5mbGFncywgMSwgMCk7CiAgICAgfQogCi0gICAgaWYgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfUkVTRVQpCi0gICAgeworICAgIGlmIChoZWFkZXJTdGF0dXMgPT0gSEVBREVSX1JFU0VUKSB7CiAgICAgICBlcnJvclN0YXR1cyA9IHNickRlY29kZXJfSGVhZGVyVXBkYXRlKAotICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgIGhTYnJIZWFkZXIsCi0gICAgICAgICAgICBoZWFkZXJTdGF0dXMsCi0gICAgICAgICAgICBwU2JyQ2hhbm5lbCwKLSAgICAgICAgICAgIGhTYnJFbGVtZW50LT5uQ2hhbm5lbHMgCi0gICAgICAgICAgICApOworICAgICAgICAgIHNlbGYsIGhTYnJIZWFkZXIsIGhlYWRlclN0YXR1cywgcFNickNoYW5uZWwsIGhTYnJFbGVtZW50LT5uQ2hhbm5lbHMpOwogCiAgICAgICBpZiAoZXJyb3JTdGF0dXMgPT0gU0JSREVDX09LKSB7CiAgICAgICAgIGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9IFNCUl9IRUFERVI7CkBAIC0xMTU5LDMxICsxNDIyLDIyIEBACiAgIGlmICgoaFNickhlYWRlci0+c3luY1N0YXRlID49IFNCUl9IRUFERVIpICYmIGZEb0RlY29kZVNickRhdGEpIHsKICAgICBpbnQgc2JyRnJhbWVPazsKICAgICAvKiByZWFkIHRoZSBTQlIgZWxlbWVudCBkYXRhICovCi0gICAgaWYgKHN0ZXJlbykgewotICAgICAgc2JyRnJhbWVPayA9IHNickdldENoYW5uZWxQYWlyRWxlbWVudChoU2JySGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT50cmFuc3Bvc2VyU2V0dGluZ3Mub3ZlcmxhcCk7CisgICAgaWYgKCFzdGVyZW8gJiYgKHNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjICE9IE5VTEwpKSB7CisgICAgICAvKiB1cGRhdGUgc2xvdCBpbmRleCBmb3IgUFMgYml0c3RyZWFtIHBhcnNpbmcgKi8KKyAgICAgIHNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjLT5ic0xhc3RTbG90ID0KKyAgICAgICAgICBzZWxmLT5oUGFyYW1ldHJpY1N0ZXJlb0RlYy0+YnNSZWFkU2xvdDsKKyAgICAgIHNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjLT5ic1JlYWRTbG90ID0gaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdDsKICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpZiAoc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMgIT0gTlVMTCkgewotICAgICAgICAvKiB1cGRhdGUgc2xvdCBpbmRleCBmb3IgUFMgYml0c3RyZWFtIHBhcnNpbmcgKi8KLSAgICAgICAgc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzTGFzdFNsb3QgPSBzZWxmLT5oUGFyYW1ldHJpY1N0ZXJlb0RlYy0+YnNSZWFkU2xvdDsKLSAgICAgICAgc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzUmVhZFNsb3QgPSBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90OwotICAgICAgfQotICAgICAgc2JyRnJhbWVPayA9IHNickdldFNpbmdsZUNoYW5uZWxFbGVtZW50KGhTYnJIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnRyYW5zcG9zZXJTZXR0aW5ncy5vdmVybGFwKTsKLSAgICB9CisgICAgc2JyRnJhbWVPayA9IHNickdldENoYW5uZWxFbGVtZW50KAorICAgICAgICBoU2JySGVhZGVyLCBoRnJhbWVEYXRhTGVmdCwgKHN0ZXJlbykgPyBoRnJhbWVEYXRhUmlnaHQgOiBOVUxMLAorICAgICAgICAmcFNickNoYW5uZWxbMF0tPnByZXZGcmFtZURhdGEsCisgICAgICAgIHBTYnJDaGFubmVsWzBdLT5TYnJEZWMuUHZjU3RhdGljRGF0YS5wdmNfbW9kZV9sYXN0LCBoQnMsCisgICAgICAgIChzdGVyZW8pID8gTlVMTCA6IHNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjLCBzZWxmLT5mbGFncywKKyAgICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dHJhbnNwb3NlclNldHRpbmdzLm92ZXJsYXApOworCiAgICAgaWYgKCFzYnJGcmFtZU9rKSB7CiAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIElOVCB2YWxCaXRzOwogCiAgICAgICBpZiAoYnNQYXlMZW4gPiAwKSB7CkBAIC0xMTkyLDI4ICsxNDQ2LDMyIEBACiAgICAgICAgIHZhbEJpdHMgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOwogICAgICAgfQogCi0gICAgICBpZiAoIGNyY0ZsYWcgKSB7CisgICAgICBpZiAoY3JjRmxhZykgewogICAgICAgICBzd2l0Y2ggKHNlbGYtPmNvcmVDb2RlYykgewotICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgotICAgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOiB7CiAgICAgICAgICAgICAvKiBsYXRlIGNyYyBjaGVjayBmb3IgZWxkICovCi0gICAgICAgICAgICBJTlQgcGF5bG9hZGJpdHMgPSAoSU5UKXN0YXJ0UG9zIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSAtIHN0YXJ0UG9zOwotICAgICAgICAgICAgSU5UIGNyY0xlbiAgICAgID0gcGF5bG9hZGJpdHMgLSAxMDsKKyAgICAgICAgICAgIElOVCBwYXlsb2FkYml0cyA9CisgICAgICAgICAgICAgICAgKElOVClzdGFydFBvcyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgLSBzdGFydFBvczsKKyAgICAgICAgICAgIElOVCBjcmNMZW4gPSBwYXlsb2FkYml0cyAtIDEwOwogICAgICAgICAgICAgRkRLcHVzaEJhY2soaEJzLCBwYXlsb2FkYml0cyk7Ci0gICAgICAgICAgICBmRG9EZWNvZGVTYnJEYXRhICAgICAgPSBTYnJDcmNDaGVjayAoaEJzLCBjcmNMZW4pOworICAgICAgICAgICAgZkRvRGVjb2RlU2JyRGF0YSA9IFNickNyY0NoZWNrKGhCcywgY3JjTGVuKTsKICAgICAgICAgICAgIEZES3B1c2hGb3IoaEJzLCBjcmNMZW4pOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBT1RfRFJNX0FBQzoKLSAgICAgICAgICAvKiBFbmQgQ1JDIHJlZ2lvbiAqLwotICAgICAgICAgIEZES2NyY0VuZFJlZygmY3JjSW5mbywgaEJzLCBjcmNSZWcpOwotICAgICAgICAgIC8qIENoZWNrIENSQyAqLwotICAgICAgICAgIGlmICgoRkRLY3JjR2V0Q1JDKCZjcmNJbmZvKV4weEZGKSAhPSBkcm1TYnJDcmMpIHsKLSAgICAgICAgICAgIGZEb0RlY29kZVNickRhdGEgPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgIGNhc2UgQU9UX0RSTV9BQUM6CisgICAgICAgICAgY2FzZSBBT1RfRFJNX1NVUlJPVU5EOgorICAgICAgICAgICAgLyogRW5kIENSQyByZWdpb24gKi8KKyAgICAgICAgICAgIEZES2NyY0VuZFJlZygmY3JjSW5mbywgaEJzLCBjcmNSZWcpOworICAgICAgICAgICAgLyogQ2hlY2sgQ1JDICovCisgICAgICAgICAgICBpZiAoKEZES2NyY0dldENSQygmY3JjSW5mbykgXiAweEZGKSAhPSBkcm1TYnJDcmMpIHsKKyAgICAgICAgICAgICAgZkRvRGVjb2RlU2JyRGF0YSA9IDA7CisgICAgICAgICAgICAgIGlmIChoZWFkZXJTdGF0dXMgIT0gSEVBREVSX05PVF9QUkVTRU5UKSB7CisgICAgICAgICAgICAgICAgaGVhZGVyU3RhdHVzID0gSEVBREVSX0VSUk9SOworICAgICAgICAgICAgICAgIGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9IFNCUl9OT1RfSU5JVElBTElaRUQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQogCkBAIC0xMjIyLDM3ICsxNDgwLDQyIEBACiAgICAgICAgIGZEb0RlY29kZVNickRhdGEgPSAwOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgc3dpdGNoIChzZWxmLT5jb3JlQ29kZWMpIHsKLSAgICAgICAgY2FzZSBBT1RfU0JSOgotICAgICAgICBjYXNlIEFPVF9QUzoKLSAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoaXMgc2FuaXR5IGNoZWNrIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIEdlbmVyYWwgQXVkaW8gYml0c3RyZWFtcyAqLworICAgICAgICAgIGNhc2UgQU9UX1NCUjoKKyAgICAgICAgICBjYXNlIEFPVF9QUzoKKyAgICAgICAgICBjYXNlIEFPVF9BQUNfTEM6IHsKKyAgICAgICAgICAgIC8qIFRoaXMgc2FuaXR5IGNoZWNrIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIEdlbmVyYWwgQXVkaW8KKyAgICAgICAgICAgICAqIGJpdHN0cmVhbXMgKi8KICAgICAgICAgICAgIGludCBhbGlnbkJpdHMgPSB2YWxCaXRzICYgMHg3OwogCiAgICAgICAgICAgICBpZiAodmFsQml0cyA+IGFsaWduQml0cykgewogICAgICAgICAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgLyogTm8gc2FuaXR5IGNoZWNrIGF2YWlsYWJsZSAqLwotICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIE5vIHNhbml0eSBjaGVjayBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9IGVsc2UgewotICAgIC8qIFRoZSByZXR1cm5lZCBiaXQgY291bnQgd2lsbCBub3QgYmUgdGhlIGFjdHVhbCBwYXlsb2FkIHNpemUgc2luY2Ugd2UgZGlkIG5vdAotICAgICAgIHBhcnNlIHRoZSBmcmFtZSBkYXRhLiBSZXR1cm4gYW4gZXJyb3Igc28gdGhhdCB0aGUgY2FsbGVyIGNhbiByZWFjdCByZXNwZWN0aXZlbHkuICovCisgICAgLyogVGhlIHJldHVybmVkIGJpdCBjb3VudCB3aWxsIG5vdCBiZSB0aGUgYWN0dWFsIHBheWxvYWQgc2l6ZSBzaW5jZSB3ZSBkaWQKKyAgICAgICBub3QgcGFyc2UgdGhlIGZyYW1lIGRhdGEuIFJldHVybiBhbiBlcnJvciBzbyB0aGF0IHRoZSBjYWxsZXIgY2FuIHJlYWN0CisgICAgICAgcmVzcGVjdGl2ZWx5LiAqLwogICAgIGVycm9yU3RhdHVzID0gU0JSREVDX1BBUlNFX0VSUk9SOwogICB9CiAKICAgaWYgKCFmRG9EZWNvZGVTYnJEYXRhKSB7CiAgICAgLyogU2V0IGVycm9yIGZsYWcgZm9yIHRoaXMgc2xvdCB0byB0cmlnZ2VyIGNvbmNlYWxtZW50ICovCi0gICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+ZnJhbWVFcnJvckZsYWdbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF0gPSAxOworICAgIHNldEZyYW1lRXJyb3JGbGFnKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0sIEZSQU1FX0VSUk9SKTsKKyAgICAvKiByZXN0b3JlIG9sZCBmcmFtZURhdGEgZm9yIGNvbmNlYWxtZW50ICovCisgICAgRkRLbWVtY3B5KGhGcmFtZURhdGFMZWZ0LCAmZnJhbWVEYXRhTGVmdENvcHksIHNpemVvZihTQlJfRlJBTUVfREFUQSkpOworICAgIGlmIChzdGVyZW8pIHsKKyAgICAgIEZES21lbWNweShoRnJhbWVEYXRhUmlnaHQsICZmcmFtZURhdGFSaWdodENvcHksIHNpemVvZihTQlJfRlJBTUVfREFUQSkpOworICAgIH0KICAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19QQVJTRV9FUlJPUjsKICAgfSBlbHNlIHsKICAgICAvKiBFdmVyeXRoaW5nIHNlZW1zIHRvIGJlIG9rIHNvIGNsZWFyIHRoZSBlcnJvciBmbGFnICovCi0gICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+ZnJhbWVFcnJvckZsYWdbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF0gPSAwOworICAgIHNldEZyYW1lRXJyb3JGbGFnKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0sIEZSQU1FX09LKTsKICAgfQogCiAgIGlmICghc3RlcmVvKSB7CkBAIC0xMjYzLDExNiArMTUyNiwxMzggQEAKIAogYmFpbDoKIAotICBpZiAoIHNlbGYtPmZsYWdzICYgU0JSREVDX1NZTlRBWF9EUk0gKQotICB7Ci0gICAgaEJzID0gaEJzT3JpZ2luYWw7Ci0gIH0KLQotICBpZiAoIChlcnJvclN0YXR1cyA9PSBTQlJERUNfT0spCi0gICAgfHwgKCAoZXJyb3JTdGF0dXMgPT0gU0JSREVDX1BBUlNFX0VSUk9SKQotICAgICAgJiYgKGhlYWRlclN0YXR1cyAhPSBIRUFERVJfRVJST1IpICkgKQotICB7Ci0gICAgaW50IHVzZU9sZEhkciA9ICggKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfTk9UX1BSRVNFTlQpCi0gICAgICAgICAgICAgICAgICAgfHwgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfRVJST1IpICkgPyAxIDogMDsKLQotICAgIGlmICghdXNlT2xkSGRyICYmICh0aGlzSGRyU2xvdCAhPSBsYXN0SGRyU2xvdCkpIHsKLSAgICAgIHVzZU9sZEhkciB8PSAoIGNvbXBhcmVTYnJIZWFkZXIoIGhTYnJIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtsYXN0SGRyU2xvdF0gKSA9PSAwICkgPyAxIDogMDsKKyAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgIGlmIChzZWxmLT5mbGFncyAmIFNCUkRFQ19TWU5UQVhfRFJNKSB7CisgICAgICBoQnMgPSBoQnNPcmlnaW5hbDsKICAgICB9CiAKLSAgICBpZiAodXNlT2xkSGRyICE9IDApIHsKLSAgICAgIC8qIFVzZSB0aGUgb2xkIGhlYWRlciBmb3IgdGhpcyBmcmFtZSAqLwotICAgICAgaFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3RbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF0gPSBsYXN0SGRyU2xvdDsKLSAgICB9IGVsc2UgewotICAgICAgLyogVXNlIHRoZSBuZXcgaGVhZGVyIGZvciB0aGlzIGZyYW1lICovCi0gICAgICBoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdFtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XSA9IHRoaXNIZHJTbG90OwotICAgIH0KKyAgICBpZiAoZXJyb3JTdGF0dXMgIT0gU0JSREVDX05PVF9JTklUSUFMSVpFRCkgeworICAgICAgaW50IHVzZU9sZEhkciA9CisgICAgICAgICAgKChoZWFkZXJTdGF0dXMgPT0gSEVBREVSX05PVF9QUkVTRU5UKSB8fAorICAgICAgICAgICAoaGVhZGVyU3RhdHVzID09IEhFQURFUl9FUlJPUikgfHwKKyAgICAgICAgICAgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfUkVTRVQgJiYgZXJyb3JTdGF0dXMgPT0gU0JSREVDX1BBUlNFX0VSUk9SKSkKKyAgICAgICAgICAgICAgPyAxCisgICAgICAgICAgICAgIDogMDsKIAotICAgIC8qIE1vdmUgZnJhbWUgcG9pbnRlciB0byB0aGUgbmV4dCBzbG90IHdoaWNoIGlzIHVwIHRvIGJlIGRlY29kZWQvYXBwbGllZCBuZXh0ICovCi0gICAgaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCA9IChoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90KzEpICUgKHNlbGYtPm51bURlbGF5RnJhbWVzKzEpOworICAgICAgaWYgKCF1c2VPbGRIZHIgJiYgKHRoaXNIZHJTbG90ICE9IGxhc3RIZHJTbG90KSAmJiAoaFNickhlYWRlciAhPSBOVUxMKSkgeworICAgICAgICB1c2VPbGRIZHIgfD0KKyAgICAgICAgICAgIChjb21wYXJlU2JySGVhZGVyKGhTYnJIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1bbGFzdEhkclNsb3RdKSA9PSAwKQorICAgICAgICAgICAgICAgID8gMQorICAgICAgICAgICAgICAgIDogMDsKKyAgICAgIH0KKworICAgICAgaWYgKGhTYnJFbGVtZW50ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHVzZU9sZEhkciAhPSAwKSB7CisgICAgICAgICAgLyogVXNlIHRoZSBvbGQgaGVhZGVyIGZvciB0aGlzIGZyYW1lICovCisgICAgICAgICAgaFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3RbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF0gPSBsYXN0SGRyU2xvdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBVc2UgdGhlIG5ldyBoZWFkZXIgZm9yIHRoaXMgZnJhbWUgKi8KKyAgICAgICAgICBoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdFtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XSA9IHRoaXNIZHJTbG90OworICAgICAgICB9CisKKyAgICAgICAgLyogTW92ZSBmcmFtZSBwb2ludGVyIHRvIHRoZSBuZXh0IHNsb3Qgd2hpY2ggaXMgdXAgdG8gYmUgZGVjb2RlZC9hcHBsaWVkCisgICAgICAgICAqIG5leHQgKi8KKyAgICAgICAgaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCA9CisgICAgICAgICAgICAoaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCArIDEpICUgKHNlbGYtPm51bURlbGF5RnJhbWVzICsgMSk7CisgICAgICB9CisgICAgfQogICB9CiAKLSAgKmNvdW50IC09IHN0YXJ0UG9zIC0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgICpjb3VudCAtPSBzdGFydFBvcyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAKICAgcmV0dXJuIGVycm9yU3RhdHVzOwogfQogCi0KIC8qKgogICogXGJyaWVmIFJlbmRlciBvbmUgU0JSIGVsZW1lbnQgaW50byB0aW1lIGRvbWFpbiBzaWduYWwuCiAgKiBccGFyYW0gc2VsZiBTQlIgZGVjb2RlciBoYW5kbGUKICAqIFxwYXJhbSB0aW1lRGF0YSBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIKLSAqIFxwYXJhbSBpbnRlcmxlYXZlZCBmbGFnIGluZGljYXRpbmcgaW50ZXJsZWF2ZWQgY2hhbm5lbCBvdXRwdXQKLSAqIFxwYXJhbSBjaGFubmVsTWFwcGluZyBwb2ludGVyIHRvIFVDSEFSIGFycmF5IHdoZXJlIG5leHQgMiBjaGFubmVsIG9mZnNldHMgYXJlIHN0b3JlZC4gCisgKiBccGFyYW0gY2hhbm5lbE1hcHBpbmcgcG9pbnRlciB0byBVQ0hBUiBhcnJheSB3aGVyZSBuZXh0IDIgY2hhbm5lbCBvZmZzZXRzIGFyZQorICogc3RvcmVkLgogICogXHBhcmFtIGVsZW1lbnRJbmRleCBlbnVtZXJhdGluZyBpbmRleCBvZiB0aGUgU0JSIGVsZW1lbnQgdG8gcmVuZGVyLgotICogXHBhcmFtIG51bUluQ2hhbm5lbHMgbnVtYmVyIG9mIGNoYW5uZWxzIGZyb20gY29yZSBjb2RlciAocmVhZGluZyBzdHJpZGUpLgotICogXHBhcmFtIG51bU91dENoYW5uZWxzIHBvaW50ZXIgdG8gYSBsb2NhdGlvbiB0byByZXR1cm4gbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4KKyAqIFxwYXJhbSBudW1JbkNoYW5uZWxzIG51bWJlciBvZiBjaGFubmVscyBmcm9tIGNvcmUgY29kZXIuCisgKiBccGFyYW0gbnVtT3V0Q2hhbm5lbHMgcG9pbnRlciB0byBhIGxvY2F0aW9uIHRvIHJldHVybiBudW1iZXIgb2Ygb3V0cHV0CisgKiBjaGFubmVscy4KICAqIFxwYXJhbSBwc1Bvc3NpYmxlIGZsYWcgaW5kaWNhdGluZyBpZiBQUyBpcyBwb3NzaWJsZSBvciBub3QuCiAgKiBccmV0dXJuIFNCUkRFQ19PSyBpZiBzdWNjZXNzZnVsbCwgZWxzZSBlcnJvciBjb2RlCiAgKi8KLXN0YXRpYyBTQlJfRVJST1IKLXNickRlY29kZXJfRGVjb2RlRWxlbWVudCAoCi0gICAgICAgIEhBTkRMRV9TQlJERUNPREVSICAgIHNlbGYsCi0gICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKnRpbWVEYXRhLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBpbnRlcmxlYXZlZCwKLSAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAqY2hhbm5lbE1hcHBpbmcsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGVsZW1lbnRJbmRleCwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgbnVtSW5DaGFubmVscywKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqbnVtT3V0Q2hhbm5lbHMsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIHBzUG9zc2libGUKLSAgICAgICAgKQoteworc3RhdGljIFNCUl9FUlJPUiBzYnJEZWNvZGVyX0RlY29kZUVsZW1lbnQoCisgICAgSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgUURPTV9QQ00gKmlucHV0LCBJTlRfUENNICp0aW1lRGF0YSwKKyAgICBjb25zdCBpbnQgdGltZURhdGFTaXplLCBjb25zdCBGREtfY2hhbm5lbE1hcERlc2NyICpjb25zdCBtYXBEZXNjciwKKyAgICBjb25zdCBpbnQgbWFwSWR4LCBpbnQgY2hhbm5lbEluZGV4LCBjb25zdCBpbnQgZWxlbWVudEluZGV4LAorICAgIGNvbnN0IGludCBudW1JbkNoYW5uZWxzLCBpbnQgKm51bU91dENoYW5uZWxzLCBjb25zdCBpbnQgcHNQb3NzaWJsZSkgewogICBTQlJfREVDT0RFUl9FTEVNRU5UICpoU2JyRWxlbWVudCA9IHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF07Ci0gIEhBTkRMRV9TQlJfQ0hBTk5FTCAgICAqcFNickNoYW5uZWwgPSBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbDsKLSAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyID0gJnNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2hTYnJFbGVtZW50LT51c2VIZWFkZXJTbG90W2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdXTsKKyAgSEFORExFX1NCUl9DSEFOTkVMICpwU2JyQ2hhbm5lbCA9CisgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbDsKKyAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyID0KKyAgICAgICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XQorICAgICAgICAgICAgICAgICAgICAgIFtoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdFtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XV07CiAgIEhBTkRMRV9QU19ERUMgaF9wc19kID0gc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWM7CiAKICAgLyogZ2V0IG1lbW9yeSBmb3IgZnJhbWUgZGF0YSBmcm9tIHNjcmF0Y2ggKi8KLSAgU0JSX0ZSQU1FX0RBVEEgKmhGcmFtZURhdGFMZWZ0ICA9ICZoU2JyRWxlbWVudC0+cFNickNoYW5uZWxbMF0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKLSAgU0JSX0ZSQU1FX0RBVEEgKmhGcmFtZURhdGFSaWdodCA9ICZoU2JyRWxlbWVudC0+cFNickNoYW5uZWxbMV0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKKyAgU0JSX0ZSQU1FX0RBVEEgKmhGcmFtZURhdGFMZWZ0ID0gTlVMTDsKKyAgU0JSX0ZSQU1FX0RBVEEgKmhGcmFtZURhdGFSaWdodCA9IE5VTEw7CiAKICAgU0JSX0VSUk9SIGVycm9yU3RhdHVzID0gU0JSREVDX09LOwogCisgIElOVCBzdHJpZGVPdXQsIG9mZnNldDAgPSAyNTUsIG9mZnNldDBfYmxvY2sgPSAwLCBvZmZzZXQxID0gMjU1LAorICAgICAgICAgICAgICAgICBvZmZzZXQxX2Jsb2NrID0gMDsKKyAgSU5UIGNvZGVjRnJhbWVTaXplID0gc2VsZi0+Y29kZWNGcmFtZVNpemU7CiAKLSAgSU5UICBzdHJpZGVJbiwgc3RyaWRlT3V0LCBvZmZzZXQwLCBvZmZzZXQxOwotICBJTlQgIGNvZGVjRnJhbWVTaXplID0gc2VsZi0+Y29kZWNGcmFtZVNpemU7CisgIGludCBzdGVyZW8gPSAoaFNickVsZW1lbnQtPmVsZW1lbnRJRCA9PSBJRF9DUEUpID8gMSA6IDA7CisgIGludCBudW1FbGVtZW50Q2hhbm5lbHMgPQorICAgICAgaFNickVsZW1lbnQKKyAgICAgICAgICAtPm5DaGFubmVsczsgLyogTnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBjdXJyZW50IFNCUiBlbGVtZW50ICovCiAKLSAgaW50ICBzdGVyZW8gPSAoaFNickVsZW1lbnQtPmVsZW1lbnRJRCA9PSBJRF9DUEUpID8gMSA6IDA7Ci0gIGludCAgbnVtRWxlbWVudENoYW5uZWxzID0gaFNickVsZW1lbnQtPm5DaGFubmVsczsgLyogTnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBjdXJyZW50IFNCUiBlbGVtZW50ICovCisgIGhGcmFtZURhdGFMZWZ0ID0KKyAgICAgICZoU2JyRWxlbWVudC0+cFNickNoYW5uZWxbMF0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKKyAgaWYgKHN0ZXJlbykgeworICAgIGhGcmFtZURhdGFSaWdodCA9CisgICAgICAgICZoU2JyRWxlbWVudC0+cFNickNoYW5uZWxbMV0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKKyAgfQogCiAgIGlmIChzZWxmLT5mbGFncyAmIFNCUkRFQ19GTFVTSCkgewotICAgIGlmICggc2VsZi0+bnVtRmx1c2hlZEZyYW1lcyA+IHNlbGYtPm51bURlbGF5RnJhbWVzICkgeworICAgIGlmIChzZWxmLT5udW1GbHVzaGVkRnJhbWVzID4gc2VsZi0+bnVtRGVsYXlGcmFtZXMpIHsKICAgICAgIGludCBoZHJJZHg7Ci0gICAgICAvKiBObyB2YWxpZCBTQlIgcGF5bG9hZCBhdmFpbGFibGUsIGhlbmNlIHN3aXRjaCB0byB1cHNhbXBsaW5nIChpbiBhbGwgaGVhZGVycykgKi8KLSAgICAgIGZvciAoaGRySWR4ID0gMDsgaGRySWR4IDwgKCgxKSsxKTsgaGRySWR4ICs9IDEpIHsKKyAgICAgIC8qIE5vIHZhbGlkIFNCUiBwYXlsb2FkIGF2YWlsYWJsZSwgaGVuY2Ugc3dpdGNoIHRvIHVwc2FtcGxpbmcgKGluIGFsbAorICAgICAgICogaGVhZGVycykgKi8KKyAgICAgIGZvciAoaGRySWR4ID0gMDsgaGRySWR4IDwgKCgxKSArIDEpOyBoZHJJZHggKz0gMSkgewogICAgICAgICBzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtoZHJJZHhdLnN5bmNTdGF0ZSA9IFVQU0FNUExJTkc7CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLyogTW92ZSBmcmFtZSBwb2ludGVyIHRvIHRoZSBuZXh0IHNsb3Qgd2hpY2ggaXMgdXAgdG8gYmUgZGVjb2RlZC9hcHBsaWVkIG5leHQgKi8KLSAgICAgIGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3QgPSAoaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCsxKSAlIChzZWxmLT5udW1EZWxheUZyYW1lcysxKTsKLSAgICAgIC8qIFVwZGF0ZSBoZWFkZXIgYW5kIGZyYW1lIGRhdGEgcG9pbnRlciBiZWNhdXNlIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0ICovCi0gICAgICBoU2JySGVhZGVyID0gJnNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2hTYnJFbGVtZW50LT51c2VIZWFkZXJTbG90W2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdXTsKLSAgICAgIGhGcmFtZURhdGFMZWZ0ICA9ICZoU2JyRWxlbWVudC0+cFNickNoYW5uZWxbMF0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKLSAgICAgIGhGcmFtZURhdGFSaWdodCA9ICZoU2JyRWxlbWVudC0+cFNickNoYW5uZWxbMV0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKKyAgICB9IGVsc2UgeworICAgICAgLyogTW92ZSBmcmFtZSBwb2ludGVyIHRvIHRoZSBuZXh0IHNsb3Qgd2hpY2ggaXMgdXAgdG8gYmUgZGVjb2RlZC9hcHBsaWVkCisgICAgICAgKiBuZXh0ICovCisgICAgICBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90ID0KKyAgICAgICAgICAoaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCArIDEpICUgKHNlbGYtPm51bURlbGF5RnJhbWVzICsgMSk7CisgICAgICAvKiBVcGRhdGUgaGVhZGVyIGFuZCBmcmFtZSBkYXRhIHBvaW50ZXIgYmVjYXVzZSB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIHNldAorICAgICAgICovCisgICAgICBoU2JySGVhZGVyID0KKyAgICAgICAgICAmc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2hTYnJFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT51c2VIZWFkZXJTbG90W2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdXTsKKyAgICAgIGhGcmFtZURhdGFMZWZ0ID0KKyAgICAgICAgICAmaFNickVsZW1lbnQtPnBTYnJDaGFubmVsWzBdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgICAgICBpZiAoc3RlcmVvKSB7CisgICAgICAgIGhGcmFtZURhdGFSaWdodCA9CisgICAgICAgICAgICAmaFNickVsZW1lbnQtPnBTYnJDaGFubmVsWzFdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgICAgICB9CiAgICAgfQogICB9CiAKICAgLyogVXBkYXRlIHRoZSBoZWFkZXIgZXJyb3IgZmxhZyAqLwotICBoU2JySGVhZGVyLT5mcmFtZUVycm9yRmxhZyA9IGhTYnJFbGVtZW50LT5mcmFtZUVycm9yRmxhZ1toU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKKyAgaFNickhlYWRlci0+ZnJhbWVFcnJvckZsYWcgPQorICAgICAgaFNickVsZW1lbnQtPmZyYW1lRXJyb3JGbGFnW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOwogCiAgIC8qCiAgICAgIFByZXBhcmUgZmlsdGVyYmFuayBmb3IgdXBzYW1wbGluZyBpZiBubyB2YWxpZCBiaXQgc3RyZWFtIGRhdGEgaXMgYXZhaWxhYmxlLgogICAgKi8KLSAgaWYgKCBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gU0JSX05PVF9JTklUSUFMSVpFRCApCi0gIHsKLSAgICBlcnJvclN0YXR1cyA9IGluaXRIZWFkZXJEYXRhKAotICAgICAgICAgICAgaFNickhlYWRlciwKLSAgICAgICAgICAgIHNlbGYtPnNhbXBsZVJhdGVJbiwKLSAgICAgICAgICAgIHNlbGYtPnNhbXBsZVJhdGVPdXQsCi0gICAgICAgICAgICBjb2RlY0ZyYW1lU2l6ZSwKLSAgICAgICAgICAgIHNlbGYtPmZsYWdzCi0gICAgICAgICAgICApOworICBpZiAoaFNickhlYWRlci0+c3luY1N0YXRlID09IFNCUl9OT1RfSU5JVElBTElaRUQpIHsKKyAgICBlcnJvclN0YXR1cyA9CisgICAgICAgIGluaXRIZWFkZXJEYXRhKGhTYnJIZWFkZXIsIHNlbGYtPnNhbXBsZVJhdGVJbiwgc2VsZi0+c2FtcGxlUmF0ZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZG93bnNjYWxlRmFjdG9yLCBjb2RlY0ZyYW1lU2l6ZSwgc2VsZi0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIDEgLyogU0VUX0RFRkFVTFRfSERSICovCisgICAgICAgICk7CiAKICAgICBpZiAoZXJyb3JTdGF0dXMgIT0gU0JSREVDX09LKSB7CiAgICAgICByZXR1cm4gZXJyb3JTdGF0dXM7CkBAIC0xMzgwLDEzICsxNjY1LDggQEAKIAogICAgIGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9IFVQU0FNUExJTkc7CiAKLSAgICBlcnJvclN0YXR1cyA9IHNickRlY29kZXJfSGVhZGVyVXBkYXRlKAotICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgIGhTYnJIZWFkZXIsCi0gICAgICAgICAgICBIRUFERVJfTk9UX1BSRVNFTlQsCi0gICAgICAgICAgICBwU2JyQ2hhbm5lbCwKLSAgICAgICAgICAgIGhTYnJFbGVtZW50LT5uQ2hhbm5lbHMKLSAgICAgICAgICAgICk7CisgICAgZXJyb3JTdGF0dXMgPSBzYnJEZWNvZGVyX0hlYWRlclVwZGF0ZShzZWxmLCBoU2JySGVhZGVyLCBIRUFERVJfTk9UX1BSRVNFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2JyQ2hhbm5lbCwgaFNickVsZW1lbnQtPm5DaGFubmVscyk7CiAKICAgICBpZiAoZXJyb3JTdGF0dXMgIT0gU0JSREVDX09LKSB7CiAgICAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPSBTQlJfTk9UX0lOSVRJQUxJWkVEOwpAQCAtMTM5NywxNzAgKzE2NzcsMTYzIEBACiAgIC8qIHJlc2V0ICovCiAgIGlmIChoU2JySGVhZGVyLT5zdGF0dXMgJiBTQlJERUNfSERSX1NUQVRfUkVTRVQpIHsKICAgICBpbnQgY2g7Ci0gICAgZm9yIChjaCA9IDAgOyBjaCA8IG51bUVsZW1lbnRDaGFubmVsczsgY2grKykgeworICAgIGZvciAoY2ggPSAwOyBjaCA8IG51bUVsZW1lbnRDaGFubmVsczsgY2grKykgewogICAgICAgU0JSX0VSUk9SIGVycm9yU3RhdHVzVG1wID0gU0JSREVDX09LOwogCi0gICAgICBlcnJvclN0YXR1c1RtcCA9IHJlc2V0U2JyRGVjICgKLSAgICAgICAgICAgICAmcFNickNoYW5uZWxbY2hdLT5TYnJEZWMsCi0gICAgICAgICAgICAgIGhTYnJIZWFkZXIsCi0gICAgICAgICAgICAgJnBTYnJDaGFubmVsW2NoXS0+cHJldkZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSLAotICAgICAgICAgICAgICBzZWxmLT5zeW5Eb3duc2FtcGxlRmFjCi0gICAgICAgICAgICAgICk7CisgICAgICBlcnJvclN0YXR1c1RtcCA9IHJlc2V0U2JyRGVjKAorICAgICAgICAgICZwU2JyQ2hhbm5lbFtjaF0tPlNickRlYywgaFNickhlYWRlciwgJnBTYnJDaGFubmVsW2NoXS0+cHJldkZyYW1lRGF0YSwKKyAgICAgICAgICBzZWxmLT5zeW5Eb3duc2FtcGxlRmFjLCBzZWxmLT5mbGFncywgcFNickNoYW5uZWxbY2hdLT5mcmFtZURhdGEpOwogCiAgICAgICBpZiAoZXJyb3JTdGF0dXNUbXAgIT0gU0JSREVDX09LKSB7Ci0gICAgICAgIGVycm9yU3RhdHVzID0gZXJyb3JTdGF0dXNUbXA7CisgICAgICAgIGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9IFVQU0FNUExJTkc7CiAgICAgICB9CiAgICAgfQogICAgIGhTYnJIZWFkZXItPnN0YXR1cyAmPSB+U0JSREVDX0hEUl9TVEFUX1JFU0VUOwogICB9CiAKICAgLyogZGVjb2RpbmcgKi8KLSAgaWYgKCAoaFNickhlYWRlci0+c3luY1N0YXRlID09IFNCUl9BQ1RJVkUpCi0gICAgfHwgKChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gU0JSX0hFQURFUikgJiYgKGhTYnJIZWFkZXItPmZyYW1lRXJyb3JGbGFnID09IDApKSApCi0gIHsKKyAgaWYgKChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gU0JSX0FDVElWRSkgfHwKKyAgICAgICgoaFNickhlYWRlci0+c3luY1N0YXRlID09IFNCUl9IRUFERVIpICYmCisgICAgICAgKGhTYnJIZWFkZXItPmZyYW1lRXJyb3JGbGFnID09IDApKSkgewogICAgIGVycm9yU3RhdHVzID0gU0JSREVDX09LOwogCi0gICAgZGVjb2RlU2JyRGF0YSAoaFNickhlYWRlciwKLSAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhTGVmdCwKLSAgICAgICAgICAgICAgICAgICZwU2JyQ2hhbm5lbFswXS0+cHJldkZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAoc3RlcmVvKSA/IGhGcmFtZURhdGFSaWdodCA6IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgKHN0ZXJlbykgPyAmcFNickNoYW5uZWxbMV0tPnByZXZGcmFtZURhdGEgOiBOVUxMKTsKLQorICAgIGRlY29kZVNickRhdGEoaFNickhlYWRlciwgaEZyYW1lRGF0YUxlZnQsICZwU2JyQ2hhbm5lbFswXS0+cHJldkZyYW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgIChzdGVyZW8pID8gaEZyYW1lRGF0YVJpZ2h0IDogTlVMTCwKKyAgICAgICAgICAgICAgICAgIChzdGVyZW8pID8gJnBTYnJDaGFubmVsWzFdLT5wcmV2RnJhbWVEYXRhIDogTlVMTCk7CiAKICAgICAvKiBOb3cgd2UgaGF2ZSBhIGZ1bGwgcGFyYW1ldGVyIHNldCBhbmQgY2FuIGRvIHBhcmFtZXRlcgogICAgICAgIGJhc2VkIGNvbmNlYWxtZW50IGluc3RlYWQgb2YgcGxhaW4gdXBzYW1wbGluZy4gKi8KICAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPSBTQlJfQUNUSVZFOwogICB9CiAKLSAgLyogZGVjb2RlIFBTIGRhdGEgaWYgYXZhaWxhYmxlICovCi0gIGlmIChoX3BzX2QgIT0gTlVMTCAmJiBwc1Bvc3NpYmxlKSB7Ci0gICAgaW50IGFwcGx5UHMgPSAxOwotCi0gICAgLyogZGVmaW5lIHdoaWNoIGZyYW1lIGRlbGF5IGxpbmUgc2xvdCB0byBwcm9jZXNzICovCi0gICAgaF9wc19kLT5wcm9jZXNzU2xvdCA9IGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3Q7Ci0KLSAgICBhcHBseVBzID0gRGVjb2RlUHMoaF9wc19kLCBoU2JySGVhZGVyLT5mcmFtZUVycm9yRmxhZyk7Ci0gICAgc2VsZi0+ZmxhZ3MgfD0gKGFwcGx5UHMpID8gU0JSREVDX1BTX0RFQ09ERUQgOiAwOworICBpZiAodGltZURhdGFTaXplIDwKKyAgICAgIGhTYnJIZWFkZXItPm51bWJlclRpbWVTbG90cyAqIGhTYnJIZWFkZXItPnRpbWVTdGVwICoKKyAgICAgICAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc1N5bnRoZXNpcyAqCisgICAgICAgICAgKHBzUG9zc2libGUgPyBmTWF4KDIsIG51bUluQ2hhbm5lbHMpIDogbnVtSW5DaGFubmVscykpIHsKKyAgICByZXR1cm4gU0JSREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMOwogICB9CiAKLSAgLyogU2V0IHN0cmlkZXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgKi8KLSAgaWYgKGludGVybGVhdmVkKSB7Ci0gICAgc3RyaWRlSW4gPSBudW1JbkNoYW5uZWxzOwotICAgIGlmICggcHNQb3NzaWJsZSApCisgIHsKKyAgICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX1BTX0RFQ09ERUQ7CisgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBQc1NjcmF0Y2gsIHN0cnVjdCBQU19ERUNfQ09FRkZJQ0lFTlRTLCAxKQorCisgICAgLyogZGVjb2RlIFBTIGRhdGEgaWYgYXZhaWxhYmxlICovCisgICAgaWYgKGhfcHNfZCAhPSBOVUxMICYmIHBzUG9zc2libGUgJiYgKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfQUNUSVZFKSkgeworICAgICAgaW50IGFwcGx5UHMgPSAxOworCisgICAgICAvKiBkZWZpbmUgd2hpY2ggZnJhbWUgZGVsYXkgbGluZSBzbG90IHRvIHByb2Nlc3MgKi8KKyAgICAgIGhfcHNfZC0+cHJvY2Vzc1Nsb3QgPSBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90OworCisgICAgICBhcHBseVBzID0gRGVjb2RlUHMoaF9wc19kLCBoU2JySGVhZGVyLT5mcmFtZUVycm9yRmxhZywgcFBzU2NyYXRjaCk7CisgICAgICBzZWxmLT5mbGFncyB8PSAoYXBwbHlQcykgPyBTQlJERUNfUFNfREVDT0RFRCA6IDA7CisgICAgfQorCisgICAgb2Zmc2V0MCA9IEZES19jaE1hcERlc2NyX2dldE1hcFZhbHVlKG1hcERlc2NyLCBjaGFubmVsSW5kZXgsIG1hcElkeCk7CisgICAgb2Zmc2V0MF9ibG9jayA9IG9mZnNldDAgKiBjb2RlY0ZyYW1lU2l6ZTsKKyAgICBpZiAoc3RlcmVvIHx8IHBzUG9zc2libGUpIHsKKyAgICAgIC8qIHRoZSB2YWx1ZSBvZiBvZmZzZXQxIG9ubHkgbWF0dGVycyBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUsIGhvd2V2ZXIgaWYKKyAgICAgIGl0IGlzIG5vdCB0cnVlIGNoYW5uZWxJbmRleCsxIG1heSBleGNlZWQgdGhlIGNoYW5uZWwgbWFwIHJlc3V0bGluZyBpbiBhbgorICAgICAgZXJyb3IsIHRob3VnaCB0aGUgdmFsdWUgb2Ygb2Zmc2V0MSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcy4gVGhpcyBpcworICAgICAgcHJldmVudGVkIGhlcmUuICovCisgICAgICBvZmZzZXQxID0gRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUobWFwRGVzY3IsIGNoYW5uZWxJbmRleCArIDEsIG1hcElkeCk7CisgICAgICBvZmZzZXQxX2Jsb2NrID0gb2Zmc2V0MSAqIGNvZGVjRnJhbWVTaXplOworICAgIH0KKyAgICAvKiBTZXQgc3RyaWRlcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAqLworICAgIGlmIChwc1Bvc3NpYmxlKQogICAgICAgc3RyaWRlT3V0ID0gKG51bUluQ2hhbm5lbHMgPCAyKSA/IDIgOiBudW1JbkNoYW5uZWxzOwogICAgIGVsc2UKICAgICAgIHN0cmlkZU91dCA9IG51bUluQ2hhbm5lbHM7Ci0gICAgb2Zmc2V0MCA9IGNoYW5uZWxNYXBwaW5nWzBdOwotICAgIG9mZnNldDEgPSBjaGFubmVsTWFwcGluZ1sxXTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpZGVJbiAgPSAxOwotICAgIHN0cmlkZU91dCA9IDE7Ci0gICAgb2Zmc2V0MCA9IGNoYW5uZWxNYXBwaW5nWzBdKjIqY29kZWNGcmFtZVNpemU7Ci0gICAgb2Zmc2V0MSA9IGNoYW5uZWxNYXBwaW5nWzFdKjIqY29kZWNGcmFtZVNpemU7Ci0gIH0KIAotICAvKiB1c2Ugc2FtZSBidWZmZXJzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGFuZCBhcHBseSBQUyBwZXIgdGltZXNsb3QgKi8KLSAgLyogUHJvY2VzcyBsZWZ0IGNoYW5uZWwgKi8KLS8vRkRLcHJpbnRmKCJzZWxmLT5jb2RlY0ZyYW1lU2l6ZSAlZFx0JWRcbiIsc2VsZi0+Y29kZWNGcmFtZVNpemUsc2VsZi0+c2FtcGxlUmF0ZUluKTsKLSAgc2JyX2RlYyAoJnBTYnJDaGFubmVsWzBdLT5TYnJEZWMsCi0gICAgICAgICAgICB0aW1lRGF0YSArIG9mZnNldDAsCi0gICAgICAgICAgICB0aW1lRGF0YSArIG9mZnNldDAsCi0gICAgICAgICAgICZwU2JyQ2hhbm5lbFsxXS0+U2JyRGVjLAotICAgICAgICAgICAgdGltZURhdGEgKyBvZmZzZXQxLAotICAgICAgICAgICAgc3RyaWRlSW4sCi0gICAgICAgICAgICBzdHJpZGVPdXQsCi0gICAgICAgICAgICBoU2JySGVhZGVyLAotICAgICAgICAgICAgaEZyYW1lRGF0YUxlZnQsCi0gICAgICAgICAgICZwU2JyQ2hhbm5lbFswXS0+cHJldkZyYW1lRGF0YSwKLSAgICAgICAgICAgIChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gU0JSX0FDVElWRSksCi0gICAgICAgICAgICBoX3BzX2QsCi0gICAgICAgICAgICBzZWxmLT5mbGFncywKLSAgICAgICAgICAgIGNvZGVjRnJhbWVTaXplCi0gICAgICAgICAgKTsKKyAgICAvKiB1c2Ugc2FtZSBidWZmZXJzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGFuZCBhcHBseSBQUyBwZXIgdGltZXNsb3QgKi8KKyAgICAvKiBQcm9jZXNzIGxlZnQgY2hhbm5lbCAqLworICAgIHNicl9kZWMoJnBTYnJDaGFubmVsWzBdLT5TYnJEZWMsIGlucHV0ICsgb2Zmc2V0MF9ibG9jaywgdGltZURhdGEgKyBvZmZzZXQwLAorICAgICAgICAgICAgKHNlbGYtPmZsYWdzICYgU0JSREVDX1BTX0RFQ09ERUQpID8gJnBTYnJDaGFubmVsWzFdLT5TYnJEZWMgOiBOVUxMLAorICAgICAgICAgICAgdGltZURhdGEgKyBvZmZzZXQxLCBzdHJpZGVPdXQsIGhTYnJIZWFkZXIsIGhGcmFtZURhdGFMZWZ0LAorICAgICAgICAgICAgJnBTYnJDaGFubmVsWzBdLT5wcmV2RnJhbWVEYXRhLAorICAgICAgICAgICAgKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfQUNUSVZFKSwgaF9wc19kLCBzZWxmLT5mbGFncywKKyAgICAgICAgICAgIGNvZGVjRnJhbWVTaXplKTsKIAotICBpZiAoc3RlcmVvKSB7Ci0gICAgLyogUHJvY2VzcyByaWdodCBjaGFubmVsICovCi0gICAgc2JyX2RlYyAoJnBTYnJDaGFubmVsWzFdLT5TYnJEZWMsCi0gICAgICAgICAgICAgIHRpbWVEYXRhICsgb2Zmc2V0MSwKLSAgICAgICAgICAgICAgdGltZURhdGEgKyBvZmZzZXQxLAotICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICBzdHJpZGVJbiwKLSAgICAgICAgICAgICAgc3RyaWRlT3V0LAotICAgICAgICAgICAgICBoU2JySGVhZGVyLAotICAgICAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQsCi0gICAgICAgICAgICAgJnBTYnJDaGFubmVsWzFdLT5wcmV2RnJhbWVEYXRhLAotICAgICAgICAgICAgICAoaFNickhlYWRlci0+c3luY1N0YXRlID09IFNCUl9BQ1RJVkUpLAotICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICBzZWxmLT5mbGFncywKLSAgICAgICAgICAgICAgY29kZWNGcmFtZVNpemUKLSAgICAgICAgICAgICk7CisgICAgaWYgKHN0ZXJlbykgeworICAgICAgLyogUHJvY2VzcyByaWdodCBjaGFubmVsICovCisgICAgICBzYnJfZGVjKCZwU2JyQ2hhbm5lbFsxXS0+U2JyRGVjLCBpbnB1dCArIG9mZnNldDFfYmxvY2ssCisgICAgICAgICAgICAgIHRpbWVEYXRhICsgb2Zmc2V0MSwgTlVMTCwgTlVMTCwgc3RyaWRlT3V0LCBoU2JySGVhZGVyLAorICAgICAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQsICZwU2JyQ2hhbm5lbFsxXS0+cHJldkZyYW1lRGF0YSwKKyAgICAgICAgICAgICAgKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfQUNUSVZFKSwgTlVMTCwgc2VsZi0+ZmxhZ3MsCisgICAgICAgICAgICAgIGNvZGVjRnJhbWVTaXplKTsKKyAgICB9CisKKyAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBQc1NjcmF0Y2gsIHN0cnVjdCBQU19ERUNfQ09FRkZJQ0lFTlRTLCAxKQogICB9CiAKICAgaWYgKGhfcHNfZCAhPSBOVUxMKSB7CiAgICAgLyogc2F2ZSBQUyBzdGF0dXMgZm9yIG5leHQgcnVuICovCi0gICAgaF9wc19kLT5wc0RlY29kZWRQcnYgPSAoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkgPyAxIDogMCA7CisgICAgaF9wc19kLT5wc0RlY29kZWRQcnYgPSAoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkgPyAxIDogMDsKICAgfQogCi0gIGlmICggcHNQb3NzaWJsZSAKLSAgICApCi0gIHsKKyAgaWYgKHBzUG9zc2libGUgJiYgIShzZWxmLT5mbGFncyAmIFNCUkRFQ19TS0lQX1FNRl9TWU4pKSB7CiAgICAgRkRLX0FTU0VSVChzdHJpZGVPdXQgPiAxKTsKLSAgICBpZiAoICEoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkgKSB7Ci0gICAgICAvKiBBIGRlY29kZXIgd2hpY2ggaXMgYWJsZSB0byBkZWNvZGUgUFMgaGFzIHRvIHByb2R1Y2UgYSBzdGVyZW8gb3V0cHV0IGV2ZW4gaWYgbm8gUFMgZGF0YSBpcyBhdmFpbGJsZS4gKi8KLSAgICAgIC8qIFNvIGNvcHkgbGVmdCBjaGFubmVsIHRvIHJpZ2h0IGNoYW5uZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaW50IGNvcHlGcmFtZVNpemUgPSBjb2RlY0ZyYW1lU2l6ZSAqIDIgLyBzZWxmLT5zeW5Eb3duc2FtcGxlRmFjOwotICAgICAgaWYgKGludGVybGVhdmVkKSB7Ci0gICAgICAgIElOVF9QQ00gKnB0cjsKLSAgICAgICAgSU5UIGk7Ci0gICAgICAgIEZES19BU1NFUlQoc3RyaWRlT3V0ID09IDIpOworICAgIGlmICghKHNlbGYtPmZsYWdzICYgU0JSREVDX1BTX0RFQ09ERUQpKSB7CisgICAgICAvKiBBIGRlY29kZXIgd2hpY2ggaXMgYWJsZSB0byBkZWNvZGUgUFMgaGFzIHRvIHByb2R1Y2UgYSBzdGVyZW8gb3V0cHV0CisgICAgICAgKiBldmVuIGlmIG5vIFBTIGRhdGEgaXMgYXZhaWxhYmxlLiAqLworICAgICAgLyogU28gY29weSBsZWZ0IGNoYW5uZWwgdG8gcmlnaHQgY2hhbm5lbC4gKi8KKyAgICAgIGludCBjb3B5RnJhbWVTaXplID0KKyAgICAgICAgICBjb2RlY0ZyYW1lU2l6ZSAqIHNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbk91dC0+ZmIubm9fY2hhbm5lbHM7CisgICAgICBjb3B5RnJhbWVTaXplIC89IHNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbkluLT5mYi5ub19jaGFubmVsczsKKyAgICAgIElOVF9QQ00gKnB0cjsKKyAgICAgIElOVCBpOworICAgICAgRkRLX0FTU0VSVChzdHJpZGVPdXQgPT0gMik7CiAKLSAgICAgICAgcHRyID0gdGltZURhdGE7Ci0gICAgICAgIGZvciAoaSA9IGNvcHlGcmFtZVNpemU+PjE7IGktLTsgKQotICAgICAgICB7Ci0gICAgICAgICAgSU5UX1BDTSB0bXA7IC8qIFRoaXMgdGVtcG9yYWwgdmFyaWFibGUgaXMgcmVxdWlyZWQgYmVjYXVzZSBzb21lIGNvbXBpbGVycyBjYW4ndCBkbyAqcHRyKysgPSAqcHRyKysgY29ycmVjdGx5LiAqLwotICAgICAgICAgIHRtcCA9ICpwdHIrKzsgKnB0cisrID0gdG1wOwotICAgICAgICAgIHRtcCA9ICpwdHIrKzsgKnB0cisrID0gdG1wOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBGREttZW1jcHkoIHRpbWVEYXRhK2NvcHlGcmFtZVNpemUsIHRpbWVEYXRhLCBjb3B5RnJhbWVTaXplKnNpemVvZihJTlRfUENNKSApOworICAgICAgcHRyID0gdGltZURhdGE7CisgICAgICBmb3IgKGkgPSBjb3B5RnJhbWVTaXplID4+IDE7IGktLTspIHsKKyAgICAgICAgSU5UX1BDTSB0bXA7IC8qIFRoaXMgdGVtcG9yYWwgdmFyaWFibGUgaXMgcmVxdWlyZWQgYmVjYXVzZSBzb21lCisgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlcnMgY2FuJ3QgZG8gKnB0cisrID0gKnB0cisrIGNvcnJlY3RseS4gKi8KKyAgICAgICAgdG1wID0gKnB0cisrOworICAgICAgICAqcHRyKysgPSB0bXA7CisgICAgICAgIHRtcCA9ICpwdHIrKzsKKyAgICAgICAgKnB0cisrID0gdG1wOwogICAgICAgfQogICAgIH0KLSAgICAqbnVtT3V0Q2hhbm5lbHMgPSAyOyAgLyogT3V0cHV0IG1pbmltdW0gdHdvIGNoYW5uZWxzIHdoZW4gUFMgaXMgZW5hYmxlZC4gKi8KKyAgICAqbnVtT3V0Q2hhbm5lbHMgPSAyOyAvKiBPdXRwdXQgbWluaW11bSB0d28gY2hhbm5lbHMgd2hlbiBQUyBpcyBlbmFibGVkLiAqLwogICB9CiAKICAgcmV0dXJuIGVycm9yU3RhdHVzOwogfQogCi0KLVNCUl9FUlJPUiBzYnJEZWNvZGVyX0FwcGx5ICggSEFORExFX1NCUkRFQ09ERVIgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAgKnRpbWVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgKm51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgY2hhbm5lbE1hcHBpbmdbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICBpbnRlcmxlYXZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICBjb3JlRGVjb2RlZE9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgKnBzRGVjb2RlZCApCi17CitTQlJfRVJST1Igc2JyRGVjb2Rlcl9BcHBseShIQU5ETEVfU0JSREVDT0RFUiBzZWxmLCBJTlRfUENNICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnRpbWVEYXRhLCBjb25zdCBpbnQgdGltZURhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1DaGFubmVscywgaW50ICpzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciAqY29uc3QgbWFwRGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWFwSWR4LCBjb25zdCBpbnQgY29yZURlY29kZWRPaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwc0RlY29kZWQpIHsKICAgU0JSX0VSUk9SIGVycm9yU3RhdHVzID0gU0JSREVDX09LOwogCi0gIGludCAgIHBzUG9zc2libGUgPSAwOwotICBpbnQgICBzYnJFbGVtZW50TnVtOwotICBpbnQgICBudW1Db3JlQ2hhbm5lbHMgPSAqbnVtQ2hhbm5lbHM7Ci0gIGludCAgIG51bVNickNoYW5uZWxzICA9IDA7CisgIGludCBwc1Bvc3NpYmxlOworICBpbnQgc2JyRWxlbWVudE51bTsKKyAgaW50IG51bUNvcmVDaGFubmVsczsKKyAgaW50IG51bVNickNoYW5uZWxzID0gMDsKKworICBpZiAoKHNlbGYgPT0gTlVMTCkgfHwgKHRpbWVEYXRhID09IE5VTEwpIHx8IChudW1DaGFubmVscyA9PSBOVUxMKSB8fAorICAgICAgKHNhbXBsZVJhdGUgPT0gTlVMTCkgfHwgKHBzRGVjb2RlZCA9PSBOVUxMKSB8fAorICAgICAgIUZES19jaE1hcERlc2NyX2lzVmFsaWQobWFwRGVzY3IpKSB7CisgICAgcmV0dXJuIFNCUkRFQ19JTlZBTElEX0FSR1VNRU5UOworICB9CiAKICAgcHNQb3NzaWJsZSA9ICpwc0RlY29kZWQ7CisgIG51bUNvcmVDaGFubmVscyA9ICpudW1DaGFubmVsczsKKyAgaWYgKG51bUNvcmVDaGFubmVscyA8PSAwKSB7CisgICAgcmV0dXJuIFNCUkRFQ19JTlZBTElEX0FSR1VNRU5UOworICB9CiAKICAgaWYgKHNlbGYtPm51bVNickVsZW1lbnRzIDwgMSkgewogICAgIC8qIGV4aXQgaW1tZWRpYXRlbHkgdG8gYXZvaWQgYWNjZXNzIHZpb2xhdGlvbnMgKi8KLSAgICByZXR1cm4gU0JSREVDX0NSRUFURV9FUlJPUjsKKyAgICByZXR1cm4gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKICAgfQogCiAgIC8qIFNhbml0eSBjaGVjayBvZiBhbGxvY2F0ZWQgU0JSIGVsZW1lbnRzLiAqLwotICBmb3IgKHNickVsZW1lbnROdW09MDsgc2JyRWxlbWVudE51bTxzZWxmLT5udW1TYnJFbGVtZW50czsgc2JyRWxlbWVudE51bSsrKSB7CisgIGZvciAoc2JyRWxlbWVudE51bSA9IDA7IHNickVsZW1lbnROdW0gPCBzZWxmLT5udW1TYnJFbGVtZW50czsKKyAgICAgICBzYnJFbGVtZW50TnVtKyspIHsKICAgICBpZiAoc2VsZi0+cFNickVsZW1lbnRbc2JyRWxlbWVudE51bV0gPT0gTlVMTCkgewotICAgICAgcmV0dXJuIFNCUkRFQ19DUkVBVEVfRVJST1I7CisgICAgICByZXR1cm4gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKICAgICB9CiAgIH0KIApAQCAtMTU2OCw2OSArMTg0MSw2OCBAQAogICAgIHBzUG9zc2libGUgPSAwOwogICB9CiAKLQotICAvKiBJbiBjYXNlIG9mIG5vbi1pbnRlcmxlYXZlZCB0aW1lIGRvbWFpbiBkYXRhIGFuZCB1cHNhbXBsaW5nLCBtYWtlIHJvb20gZm9yIGJpZ2dlciBTQlIgb3V0cHV0LiAqLwotICBpZiAoc2VsZi0+c3luRG93bnNhbXBsZUZhYyA9PSAxICYmIGludGVybGVhdmVkID09IDApIHsKLSAgICBpbnQgYywgb3V0cHV0RnJhbWVTaXplOwotCi0gICAgb3V0cHV0RnJhbWVTaXplID0KLSAgICAgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50WzBdLT5wU2JyQ2hhbm5lbFswXS0+U2JyRGVjLlN5bnRoZXNpc1FNRi5ub19jaGFubmVscwotICAgICAgICAgICAgKiBzZWxmLT5wU2JyRWxlbWVudFswXS0+cFNickNoYW5uZWxbMF0tPlNickRlYy5TeW50aGVzaXNRTUYubm9fY29sOwotCi0gICAgZm9yIChjPW51bUNvcmVDaGFubmVscy0xOyBjPjA7IGMtLSkgewotICAgICAgRkRLbWVtbW92ZSh0aW1lRGF0YSArIGMqb3V0cHV0RnJhbWVTaXplLCB0aW1lRGF0YSArIGMqc2VsZi0+Y29kZWNGcmFtZVNpemUgLCBzZWxmLT5jb2RlY0ZyYW1lU2l6ZSpzaXplb2YoSU5UX1BDTSkpOwotICAgIH0KLSAgfQotCi0KLSAgLyogTWFrZSBzdXJlIHRoYXQgZXZlbiBpZiBubyBTQlIgZGF0YSB3YXMgZm91bmQvcGFyc2VkICpwc0RlY29kZWQgaXMgcmV0dXJuZWQgMSBpZiBwc1Bvc3NpYmxlIHdhcyAwLiAqLworICAvKiBNYWtlIHN1cmUgdGhhdCBldmVuIGlmIG5vIFNCUiBkYXRhIHdhcyBmb3VuZC9wYXJzZWQgKnBzRGVjb2RlZCBpcyByZXR1cm5lZAorICAgKiAxIGlmIHBzUG9zc2libGUgd2FzIDAuICovCiAgIGlmIChwc1Bvc3NpYmxlID09IDApIHsKICAgICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX1BTX0RFQ09ERUQ7CiAgIH0KIAotICBpZiAoIHNlbGYtPmZsYWdzICYgU0JSREVDX0ZMVVNIICkgeworICAvKiByZXBsYWNlcyBjaGFubmVsIGJhc2VkIHJlc2V0IGluc2lkZSBzYnJfZGVjKCkgKi8KKyAgaWYgKCgoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSA/IDEgOiAwKSAhPQorICAgICAgKChzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLmZsYWdzICYgUU1GX0ZMQUdfTFApID8gMSA6IDApKSB7CisgICAgaWYgKHNlbGYtPmZsYWdzICYgU0JSREVDX0xPV19QT1dFUikgeworICAgICAgc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5mbGFncyB8PSBRTUZfRkxBR19MUDsKKyAgICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYuZmxhZ3NfcmVxdWVzdGVkIHw9IFFNRl9GTEFHX0xQOworICAgIH0gZWxzZSB7CisgICAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLmZsYWdzICY9IH5RTUZfRkxBR19MUDsKKyAgICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYuZmxhZ3NfcmVxdWVzdGVkICY9IH5RTUZfRkxBR19MUDsKKyAgICB9CisgICAgaWYgKEZES19RbWZEb21haW5fSW5pdEZpbHRlckJhbmsoc2VsZi0+cFFtZkRvbWFpbiwgUU1GX0ZMQUdfS0VFUF9TVEFURVMpKSB7CisgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICB9CisgIH0KKyAgaWYgKHNlbGYtPm51bVNickNoYW5uZWxzID4gc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uSW5wdXRDaGFubmVscykgeworICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICB9CisKKyAgaWYgKHNlbGYtPmZsYWdzICYgU0JSREVDX0ZMVVNIKSB7CiAgICAgLyogZmx1c2hpbmcgaXMgc2lnbmFsaXplZCwgaGVuY2UgaW5jcmVtZW50IHRoZSBmbHVzaCBmcmFtZSBjb3VudGVyICovCiAgICAgc2VsZi0+bnVtRmx1c2hlZEZyYW1lcysrOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIC8qIG5vIGZsdXNoaW5nIGlzIHNpZ25hbGl6ZWQsIGhlbmNlIHJlc2V0IHRoZSBmbHVzaCBmcmFtZSBjb3VudGVyICovCiAgICAgc2VsZi0+bnVtRmx1c2hlZEZyYW1lcyA9IDA7CiAgIH0KIAogICAvKiBMb29wIG92ZXIgU0JSIGVsZW1lbnRzICovCi0gIGZvciAoc2JyRWxlbWVudE51bSA9IDA7IHNickVsZW1lbnROdW08c2VsZi0+bnVtU2JyRWxlbWVudHM7IHNickVsZW1lbnROdW0rKykKLSAgeworICBmb3IgKHNickVsZW1lbnROdW0gPSAwOyBzYnJFbGVtZW50TnVtIDwgc2VsZi0+bnVtU2JyRWxlbWVudHM7CisgICAgICAgc2JyRWxlbWVudE51bSsrKSB7CiAgICAgaW50IG51bUVsZW1lbnRDaGFuOwogCi0gICAgaWYgKHBzUG9zc2libGUgJiYgc2VsZi0+cFNickVsZW1lbnRbc2JyRWxlbWVudE51bV0tPnBTYnJDaGFubmVsWzFdID09IE5VTEwpIHsKKyAgICBpZiAocHNQb3NzaWJsZSAmJgorICAgICAgICBzZWxmLT5wU2JyRWxlbWVudFtzYnJFbGVtZW50TnVtXS0+cFNickNoYW5uZWxbMV0gPT0gTlVMTCkgewogICAgICAgLyogRGlzYWJsZSBQUyBhbmQgdHJ5IGRlY29kaW5nIFNCUiBtb25vLiAqLwogICAgICAgcHNQb3NzaWJsZSA9IDA7CiAgICAgfQogCi0gICAgbnVtRWxlbWVudENoYW4gPSAoc2VsZi0+cFNickVsZW1lbnRbc2JyRWxlbWVudE51bV0tPmVsZW1lbnRJRCA9PSBJRF9DUEUpID8gMiA6IDE7CisgICAgbnVtRWxlbWVudENoYW4gPQorICAgICAgICAoc2VsZi0+cFNickVsZW1lbnRbc2JyRWxlbWVudE51bV0tPmVsZW1lbnRJRCA9PSBJRF9DUEUpID8gMiA6IDE7CiAKICAgICAvKiBJZiBjb3JlIHNpZ25hbCBpcyBiYWQgdGhlbiBmb3JjZSB1cHNhbXBsaW5nICovCi0gICAgaWYgKCAhIGNvcmVEZWNvZGVkT2sgKSB7Ci0gICAgICBzZWxmLT5wU2JyRWxlbWVudFtzYnJFbGVtZW50TnVtXS0+ZnJhbWVFcnJvckZsYWdbc2VsZi0+cFNickVsZW1lbnRbc2JyRWxlbWVudE51bV0tPnVzZUZyYW1lU2xvdF0gPSAxOworICAgIGlmICghY29yZURlY29kZWRPaykgeworICAgICAgc2V0RnJhbWVFcnJvckZsYWcoc2VsZi0+cFNickVsZW1lbnRbc2JyRWxlbWVudE51bV0sIEZSQU1FX0VSUk9SX0FMTFNMT1RTKTsKICAgICB9CiAKLSAgICBlcnJvclN0YXR1cyA9IHNickRlY29kZXJfRGVjb2RlRWxlbWVudCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRWxlbWVudE51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNvcmVDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUVsZW1lbnRDaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNQb3NzaWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgZXJyb3JTdGF0dXMgPSBzYnJEZWNvZGVyX0RlY29kZUVsZW1lbnQoCisgICAgICAgIHNlbGYsIGlucHV0LCB0aW1lRGF0YSwgdGltZURhdGFTaXplLCBtYXBEZXNjciwgbWFwSWR4LCBudW1TYnJDaGFubmVscywKKyAgICAgICAgc2JyRWxlbWVudE51bSwKKyAgICAgICAgbnVtQ29yZUNoYW5uZWxzLCAvKiBpcyBjb3JyZWN0IGV2ZW4gZm9yIFVTQyBTQ0k9PTIgY2FzZSAqLworICAgICAgICAmbnVtRWxlbWVudENoYW4sIHBzUG9zc2libGUpOwogCiAgICAgaWYgKGVycm9yU3RhdHVzICE9IFNCUkRFQ19PSykgewogICAgICAgZ290byBiYWlsOwogICAgIH0KIAogICAgIG51bVNickNoYW5uZWxzICs9IG51bUVsZW1lbnRDaGFuOwotICAgIGNoYW5uZWxNYXBwaW5nICs9IG51bUVsZW1lbnRDaGFuOwogCiAgICAgaWYgKG51bVNickNoYW5uZWxzID49IG51bUNvcmVDaGFubmVscykgewogICAgICAgYnJlYWs7CkBAIC0xNjM4LDEzICsxOTEwLDE2IEBACiAgIH0KIAogICAvKiBVcGRhdGUgbnVtQ2hhbm5lbHMgYW5kIHNhbXBsZXJhdGUgKi8KLSAgKm51bUNoYW5uZWxzID0gbnVtU2JyQ2hhbm5lbHM7CisgIC8qIERvIG5vdCBtZXNzIHdpdGggb3V0cHV0IGNoYW5uZWxzIGluIGNhc2Ugb2YgVVNBQy4gbnVtU2JyQ2hhbm5lbHMgIT0KKyAgICogbnVtQ2hhbm5lbHMgZm9yIHN0ZXJlb0NvbmZpZ0luZGV4ID09IDIgKi8KKyAgaWYgKCEoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfU1lOVEFYX1VTQUMpKSB7CisgICAgKm51bUNoYW5uZWxzID0gbnVtU2JyQ2hhbm5lbHM7CisgIH0KICAgKnNhbXBsZVJhdGUgPSBzZWxmLT5zYW1wbGVSYXRlT3V0OwogICAqcHNEZWNvZGVkID0gKHNlbGYtPmZsYWdzICYgU0JSREVDX1BTX0RFQ09ERUQpID8gMSA6IDA7CiAKLQotCi0gIC8qIENsZWFyIHJlc2V0IGFuZCBmbHVzaCBmbGFnIGJlY2F1c2UgZXZlcnl0aGluZyBzZWVtcyB0byBiZSBkb25lIHN1Y2Nlc3NmdWxseS4gKi8KKyAgLyogQ2xlYXIgcmVzZXQgYW5kIGZsdXNoIGZsYWcgYmVjYXVzZSBldmVyeXRoaW5nIHNlZW1zIHRvIGJlIGRvbmUKKyAgICogc3VjY2Vzc2Z1bGx5LiAqLwogICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX0ZPUkNFX1JFU0VUOwogICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX0ZMVVNIOwogCkBAIC0xNjUzLDI3ICsxOTI4LDE3IEBACiAgIHJldHVybiBlcnJvclN0YXR1czsKIH0KIAotCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9DbG9zZSAoIEhBTkRMRV9TQlJERUNPREVSICpwU2VsZiApCi17CitTQlJfRVJST1Igc2JyRGVjb2Rlcl9DbG9zZShIQU5ETEVfU0JSREVDT0RFUiAqcFNlbGYpIHsKICAgSEFORExFX1NCUkRFQ09ERVIgc2VsZiA9ICpwU2VsZjsKICAgaW50IGk7CiAKLSAgaWYgKHNlbGYgIT0gTlVMTCkKLSAgeworICBpZiAoc2VsZiAhPSBOVUxMKSB7CiAgICAgaWYgKHNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjICE9IE5VTEwpIHsKLSAgICAgIERlbGV0ZVBzRGVjICggJnNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjICk7Ci0gICAgfQotCi0gICAgaWYgKHNlbGYtPndvcmtCdWZmZXIxICE9IE5VTEwpIHsKLSAgICAgIEZyZWVSYW1fU2JyRGVjV29ya0J1ZmZlcjEoJnNlbGYtPndvcmtCdWZmZXIxKTsKLSAgICB9Ci0gICAgaWYgKHNlbGYtPndvcmtCdWZmZXIyICE9IE5VTEwpIHsKLSAgICAgIEZyZWVSYW1fU2JyRGVjV29ya0J1ZmZlcjIoJnNlbGYtPndvcmtCdWZmZXIyKTsKKyAgICAgIERlbGV0ZVBzRGVjKCZzZWxmLT5oUGFyYW1ldHJpY1N0ZXJlb0RlYyk7CiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8ICg4KTsgaSsrKSB7Ci0gICAgICBzYnJEZWNvZGVyX0Rlc3Ryb3lFbGVtZW50KCBzZWxmLCBpICk7CisgICAgICBzYnJEZWNvZGVyX0Rlc3Ryb3lFbGVtZW50KHNlbGYsIGkpOwogICAgIH0KIAogICAgIEZyZWVSYW1fU2JyRGVjb2RlcihwU2VsZik7CkBAIC0xNjgyLDkgKzE5NDcsNyBAQAogICByZXR1cm4gU0JSREVDX09LOwogfQogCi0KLUlOVCBzYnJEZWNvZGVyX0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICkKLXsKK0lOVCBzYnJEZWNvZGVyX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pIHsKICAgaW50IGk7CiAKICAgaWYgKGluZm8gPT0gTlVMTCkgewpAQCAtMTY5Myw2MiArMTk1Niw1NSBAQAogCiAgIC8qIHNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLwogICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKLSAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpCi0gICAgICBicmVhazsKKyAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpIGJyZWFrOwogICB9Ci0gIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkKLSAgICByZXR1cm4gLTE7CisgIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgcmV0dXJuIC0xOwogICBpbmZvICs9IGk7CiAKICAgaW5mby0+bW9kdWxlX2lkID0gRkRLX1NCUkRFQzsKLSAgaW5mby0+dmVyc2lvbiA9IExJQl9WRVJTSU9OKFNCUkRFQ09ERVJfTElCX1ZMMCwgU0JSREVDT0RFUl9MSUJfVkwxLCBTQlJERUNPREVSX0xJQl9WTDIpOworICBpbmZvLT52ZXJzaW9uID0KKyAgICAgIExJQl9WRVJTSU9OKFNCUkRFQ09ERVJfTElCX1ZMMCwgU0JSREVDT0RFUl9MSUJfVkwxLCBTQlJERUNPREVSX0xJQl9WTDIpOwogICBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbyk7Ci0gIGluZm8tPmJ1aWxkX2RhdGUgPSAoY2hhciAqKVNCUkRFQ09ERVJfTElCX0JVSUxEX0RBVEU7Ci0gIGluZm8tPmJ1aWxkX3RpbWUgPSAoY2hhciAqKVNCUkRFQ09ERVJfTElCX0JVSUxEX1RJTUU7Ci0gIGluZm8tPnRpdGxlICAgICAgPSAoY2hhciAqKVNCUkRFQ09ERVJfTElCX1RJVExFOworICBpbmZvLT5idWlsZF9kYXRlID0gU0JSREVDT0RFUl9MSUJfQlVJTERfREFURTsKKyAgaW5mby0+YnVpbGRfdGltZSA9IFNCUkRFQ09ERVJfTElCX0JVSUxEX1RJTUU7CisgIGluZm8tPnRpdGxlID0gU0JSREVDT0RFUl9MSUJfVElUTEU7CiAKICAgLyogU2V0IGZsYWdzICovCi0gIGluZm8tPmZsYWdzID0gMAotICAgIHwgQ0FQRl9TQlJfSFEKLSAgICB8IENBUEZfU0JSX0xQCi0gICAgfCBDQVBGX1NCUl9QU19NUEVHCi0gICAgfCBDQVBGX1NCUl9EUk1fQlMKLSAgICB8IENBUEZfU0JSX0NPTkNFQUxNRU5UCi0gICAgfCBDQVBGX1NCUl9EUkMKLSAgICAgIDsKKyAgaW5mby0+ZmxhZ3MgPSAwIHwgQ0FQRl9TQlJfSFEgfCBDQVBGX1NCUl9MUCB8IENBUEZfU0JSX1BTX01QRUcgfAorICAgICAgICAgICAgICAgIENBUEZfU0JSX0RSTV9CUyB8IENBUEZfU0JSX0NPTkNFQUxNRU5UIHwgQ0FQRl9TQlJfRFJDIHwKKyAgICAgICAgICAgICAgICBDQVBGX1NCUl9FTERfRE9XTlNDQUxFIHwgQ0FQRl9TQlJfSEJFSFE7CiAgIC8qIEVuZCBvZiBmbGFncyAqLwogCiAgIHJldHVybiAwOwogfQogCi0KLVVJTlQgc2JyRGVjb2Rlcl9HZXREZWxheSggY29uc3QgSEFORExFX1NCUkRFQ09ERVIgc2VsZiApCi17CitVSU5UIHNickRlY29kZXJfR2V0RGVsYXkoY29uc3QgSEFORExFX1NCUkRFQ09ERVIgc2VsZikgewogICBVSU5UIG91dHB1dERlbGF5ID0gMDsKIAotICBpZiAoIHNlbGYgIT0gTlVMTCkgeworICBpZiAoc2VsZiAhPSBOVUxMKSB7CiAgICAgVUlOVCBmbGFncyA9IHNlbGYtPmZsYWdzOwogCiAgICAgLyogU2VlIGNoYXB0ZXIgMS42LjcuMiBvZiBJU08vSUVDIDE0NDk2LTMgZm9yIHRoZSBHQS1TQlIgZmlndXJlcyBiZWxvdy4gKi8KIAogICAgIC8qIEFyZSB3ZSBpbml0aWFsaXplZD8gKi8KLSAgICBpZiAoIChzZWxmLT5udW1TYnJDaGFubmVscyA+IDApCi0gICAgICAmJiAoc2VsZi0+bnVtU2JyRWxlbWVudHMgPiAwKSApCi0gICAgeworICAgIGlmICgoc2VsZi0+bnVtU2JyQ2hhbm5lbHMgPiAwKSAmJiAoc2VsZi0+bnVtU2JyRWxlbWVudHMgPiAwKSkgewogICAgICAgLyogQWRkIFFNRiBzeW50aGVzaXMgZGVsYXkgKi8KLSAgICAgIGlmICggKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKQotICAgICAgICAmJiBJU19MT1dERUxBWShzZWxmLT5jb3JlQ29kZWMpICkgeworICAgICAgaWYgKChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkgJiYgSVNfTE9XREVMQVkoc2VsZi0+Y29yZUNvZGVjKSkgewogICAgICAgICAvKiBMb3cgZGVsYXkgU0JSOiAqLwotICAgICAgICB7Ci0gICAgICAgICAgb3V0cHV0RGVsYXkgKz0gKGZsYWdzICYgU0JSREVDX0RPV05TQU1QTEUpID8gMzIgOiA2NDsgICAvKiBRTUYgc3ludGhlc2lzICovCisgICAgICAgIGlmICghKGZsYWdzICYgU0JSREVDX1NLSVBfUU1GX1NZTikpIHsKKyAgICAgICAgICBvdXRwdXREZWxheSArPQorICAgICAgICAgICAgICAoZmxhZ3MgJiBTQlJERUNfRE9XTlNBTVBMRSkgPyAzMiA6IDY0OyAvKiBRTUYgc3ludGhlc2lzICovCiAgICAgICAgICAgaWYgKGZsYWdzICYgU0JSREVDX0xEX01QU19RTUYpIHsKICAgICAgICAgICAgIG91dHB1dERlbGF5ICs9IDMyOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoIUlTX1VTQUMoc2VsZi0+Y29yZUNvZGVjKSkgewotICAgICAgICAvKiBCeSB0aGUgbWV0aG9kIG9mIGVsaW1pbmF0aW9uIHRoaXMgaXMgdGhlIEdBIChBQUMtTEMsIEhFLUFBQywgLi4uKSBicmFuY2g6ICovCisgICAgICB9IGVsc2UgaWYgKCFJU19VU0FDKHNlbGYtPmNvcmVDb2RlYykpIHsKKyAgICAgICAgLyogQnkgdGhlIG1ldGhvZCBvZiBlbGltaW5hdGlvbiB0aGlzIGlzIHRoZSBHQSAoQUFDLUxDLCBIRS1BQUMsIC4uLikKKyAgICAgICAgICogYnJhbmNoOiAqLwogICAgICAgICBvdXRwdXREZWxheSArPSAoZmxhZ3MgJiBTQlJERUNfRE9XTlNBTVBMRSkgPyA0ODEgOiA5NjI7CisgICAgICAgIGlmIChmbGFncyAmIFNCUkRFQ19TS0lQX1FNRl9TWU4pIHsKKyAgICAgICAgICBvdXRwdXREZWxheSAtPSAyNTc7IC8qIFFNRiBzeW50aGVzaXMgKi8KKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy90cmFuc2NlbmRlbnQuaCBiL2xpYlNCUmRlYy9zcmMvdHJhbnNjZW5kZW50LmgKaW5kZXggYWQ4OGJjOS4uMGU4MTVjMiAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy90cmFuc2NlbmRlbnQuaAorKysgYi9saWJTQlJkZWMvc3JjL3RyYW5zY2VuZGVudC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE1ICs5MCwyMyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIEZESyBGaXhlZCBQb2ludCBBcml0aG1ldGljIExpYnJhcnkgSW50ZXJmYWNlICAKKyAgXGJyaWVmICBGREsgRml4ZWQgUG9pbnQgQXJpdGhtZXRpYyBMaWJyYXJ5IEludGVyZmFjZQogKi8KIAotI2lmbmRlZiBfX1RSQU5TQ0VOREVOVF9ICi0jZGVmaW5lIF9fVFJBTlNDRU5ERU5UX0gKKyNpZm5kZWYgVFJBTlNDRU5ERU5UX0gKKyNkZWZpbmUgVFJBTlNDRU5ERU5UX0gKIAogI2luY2x1ZGUgInNicmRlY29kZXIuaCIKICNpbmNsdWRlICJzYnJfcm9tLmgiCkBAIC0xMDUsMTAgKzEyNCw5IEBACiBzdGF0aWMgaW5saW5lIEZJWFBfU0dMIEZES19nZXROdW1PY3RhdmVzRGl2OChJTlQgYSwgLyohPCBsb3dlciBiYW5kICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYikgLyohPCB1cHBlciBiYW5kICovCiB7Ci0gIHJldHVybiAoIChTSE9SVCkoKExPTkcpKENhbGNMZEludChiKSAtIENhbGNMZEludChhKSk+PihGUkFDVF9CSVRTLTMpKSApOworICByZXR1cm4gKChTSE9SVCkoKExPTkcpKENhbGNMZEludChiKSAtIENhbGNMZEludChhKSkgPj4gKEZSQUNUX0JJVFMgLSAzKSkpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKICAgXGJyaWVmICAgQWRkIHR3byB2YWx1ZXMgZ2l2ZW4gYnkgbWFudGlzc2EgYW5kIGV4cG9uZW50LgpAQCAtMTE4LDE1ICsxMzYsMTUgQEAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW5saW5lIHZvaWQgRkRLX2FkZF9NYW50RXhwKEZJWFBfU0dMIGFfbSwgLyohPCBNYW50aXNzYSBvZiAxc3Qgb3BlcmFuZCBhICovCi0gICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgYV9lLCAgICAgICAvKiE8IEV4cG9uZW50IG9mIDFzdCBvcGVyYW5kIGEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICBiX20sICAgICAgIC8qITwgTWFudGlzc2Egb2YgMm5kIG9wZXJhbmQgYiAqLwotICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGJfZSwgICAgICAgLyohPCBFeHBvbmVudCBvZiAybmQgb3BlcmFuZCBiICovCi0gICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAqcHRyU3VtX20sICAvKiE8IE1hbnRpc3NhIG9mIHJlc3VsdCAqLwotICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKnB0clN1bV9lKSAgLyohPCBFeHBvbmVudCBvZiByZXN1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBhX2UsICAgIC8qITwgRXhwb25lbnQgb2YgMXN0IG9wZXJhbmQgYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMIGJfbSwgLyohPCBNYW50aXNzYSBvZiAybmQgb3BlcmFuZCBiICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgYl9lLCAgICAvKiE8IEV4cG9uZW50IG9mIDJuZCBvcGVyYW5kIGIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAqcHRyU3VtX20sIC8qITwgTWFudGlzc2Egb2YgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKnB0clN1bV9lKSAgICAvKiE8IEV4cG9uZW50IG9mIHJlc3VsdCAqLwogewogICBGSVhQX0RCTCBhY2N1OwotICBpbnQgICBzaGlmdDsKLSAgaW50ICAgc2hpZnRBYnM7CisgIGludCBzaGlmdDsKKyAgaW50IHNoaWZ0QWJzOwogCiAgIEZJWFBfREJMIHNoaWZ0ZWRNYW50aXNzYTsKICAgRklYUF9EQkwgb3RoZXJNYW50aXNzYTsKQEAgLTEzNywzNCArMTU1LDM1IEBACiAKICAgc2hpZnQgPSAoaW50KShhX2UgLSBiX2UpOwogCi0gIHNoaWZ0QWJzID0gKHNoaWZ0PjApPyBzaGlmdCA6IC1zaGlmdDsKLSAgc2hpZnRBYnMgPSAoc2hpZnRBYnMgPCBERlJBQ1RfQklUUy0xKT8gc2hpZnRBYnMgOiBERlJBQ1RfQklUUy0xOwotICBzaGlmdGVkTWFudGlzc2EgPSAoc2hpZnQ+MCk/IChGWF9TR0wyRlhfREJMKGJfbSkgPj4gc2hpZnRBYnMpIDogKEZYX1NHTDJGWF9EQkwoYV9tKSA+PiBzaGlmdEFicyk7Ci0gIG90aGVyTWFudGlzc2EgPSAoc2hpZnQ+MCk/IEZYX1NHTDJGWF9EQkwoYV9tKSA6IEZYX1NHTDJGWF9EQkwoYl9tKTsKLSAgKnB0clN1bV9lID0gKHNoaWZ0PjApPyBhX2UgOiBiX2U7CisgIHNoaWZ0QWJzID0gKHNoaWZ0ID4gMCkgPyBzaGlmdCA6IC1zaGlmdDsKKyAgc2hpZnRBYnMgPSAoc2hpZnRBYnMgPCBERlJBQ1RfQklUUyAtIDEpID8gc2hpZnRBYnMgOiBERlJBQ1RfQklUUyAtIDE7CisgIHNoaWZ0ZWRNYW50aXNzYSA9IChzaGlmdCA+IDApID8gKEZYX1NHTDJGWF9EQkwoYl9tKSA+PiBzaGlmdEFicykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoRlhfU0dMMkZYX0RCTChhX20pID4+IHNoaWZ0QWJzKTsKKyAgb3RoZXJNYW50aXNzYSA9IChzaGlmdCA+IDApID8gRlhfU0dMMkZYX0RCTChhX20pIDogRlhfU0dMMkZYX0RCTChiX20pOworICAqcHRyU3VtX2UgPSAoc2hpZnQgPiAwKSA/IGFfZSA6IGJfZTsKIAogICBhY2N1ID0gKHNoaWZ0ZWRNYW50aXNzYSA+PiAxKSArIChvdGhlck1hbnRpc3NhID4+IDEpOwogICAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLwogCi0gIGlmICggKGFjY3UgPj0gKEZMMkZYQ09OU1RfREJMKDAuNWYpIC0gKEZJWFBfREJMKTEpKSB8fCAoYWNjdSA8PSBGTDJGWENPTlNUX0RCTCgtMC41ZikpICkKKyAgaWYgKChhY2N1ID49IChGTDJGWENPTlNUX0RCTCgwLjVmKSAtIChGSVhQX0RCTCkxKSkgfHwKKyAgICAgIChhY2N1IDw9IEZMMkZYQ09OU1RfREJMKC0wLjVmKSkpCiAgICAgKnB0clN1bV9lICs9IDE7CiAgIGVsc2UKICAgICBhY2N1ID0gKHNoaWZ0ZWRNYW50aXNzYSArIG90aGVyTWFudGlzc2EpOwogCiAgICpwdHJTdW1fbSA9IEZYX0RCTDJGWF9TR0woYWNjdSk7Ci0KIH0KIAotaW5saW5lIHZvaWQgRkRLX2FkZF9NYW50RXhwKEZJWFBfREJMIGEsICAgLyohPCBNYW50aXNzYSBvZiAxc3Qgb3BlcmFuZCBhICovCi0gICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgYV9lLCAgICAgICAvKiE8IEV4cG9uZW50IG9mIDFzdCBvcGVyYW5kIGEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICBiLCAgICAgICAgIC8qITwgTWFudGlzc2Egb2YgMm5kIG9wZXJhbmQgYiAqLwotICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGJfZSwgICAgICAgLyohPCBFeHBvbmVudCBvZiAybmQgb3BlcmFuZCBiICovCi0gICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcHRyU3VtLCAgICAvKiE8IE1hbnRpc3NhIG9mIHJlc3VsdCAqLwotICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKnB0clN1bV9lKSAgLyohPCBFeHBvbmVudCBvZiByZXN1bHQgKi8KK2lubGluZSB2b2lkIEZES19hZGRfTWFudEV4cChGSVhQX0RCTCBhLCAgICAgICAvKiE8IE1hbnRpc3NhIG9mIDFzdCBvcGVyYW5kIGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBhX2UsICAgICAgICAvKiE8IEV4cG9uZW50IG9mIDFzdCBvcGVyYW5kIGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBiLCAgICAgICAvKiE8IE1hbnRpc3NhIG9mIDJuZCBvcGVyYW5kIGIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBiX2UsICAgICAgICAvKiE8IEV4cG9uZW50IG9mIDJuZCBvcGVyYW5kIGIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcHRyU3VtLCAvKiE8IE1hbnRpc3NhIG9mIHJlc3VsdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpwdHJTdW1fZSkgIC8qITwgRXhwb25lbnQgb2YgcmVzdWx0ICovCiB7CiAgIEZJWFBfREJMIGFjY3U7Ci0gIGludCAgIHNoaWZ0OwotICBpbnQgICBzaGlmdEFiczsKKyAgaW50IHNoaWZ0OworICBpbnQgc2hpZnRBYnM7CiAKICAgRklYUF9EQkwgc2hpZnRlZE1hbnRpc3NhOwogICBGSVhQX0RCTCBvdGhlck1hbnRpc3NhOwpAQCAtMTc1LDIyICsxOTQsMjIgQEAKIAogICBzaGlmdCA9IChpbnQpKGFfZSAtIGJfZSk7CiAKLSAgc2hpZnRBYnMgPSAoc2hpZnQ+MCk/IHNoaWZ0IDogLXNoaWZ0OwotICBzaGlmdEFicyA9IChzaGlmdEFicyA8IERGUkFDVF9CSVRTLTEpPyBzaGlmdEFicyA6IERGUkFDVF9CSVRTLTE7Ci0gIHNoaWZ0ZWRNYW50aXNzYSA9IChzaGlmdD4wKT8gKGIgPj4gc2hpZnRBYnMpIDogKGEgPj4gc2hpZnRBYnMpOwotICBvdGhlck1hbnRpc3NhID0gKHNoaWZ0PjApPyBhIDogYjsKLSAgKnB0clN1bV9lID0gKHNoaWZ0PjApPyBhX2UgOiBiX2U7CisgIHNoaWZ0QWJzID0gKHNoaWZ0ID4gMCkgPyBzaGlmdCA6IC1zaGlmdDsKKyAgc2hpZnRBYnMgPSAoc2hpZnRBYnMgPCBERlJBQ1RfQklUUyAtIDEpID8gc2hpZnRBYnMgOiBERlJBQ1RfQklUUyAtIDE7CisgIHNoaWZ0ZWRNYW50aXNzYSA9IChzaGlmdCA+IDApID8gKGIgPj4gc2hpZnRBYnMpIDogKGEgPj4gc2hpZnRBYnMpOworICBvdGhlck1hbnRpc3NhID0gKHNoaWZ0ID4gMCkgPyBhIDogYjsKKyAgKnB0clN1bV9lID0gKHNoaWZ0ID4gMCkgPyBhX2UgOiBiX2U7CiAKICAgYWNjdSA9IChzaGlmdGVkTWFudGlzc2EgPj4gMSkgKyAob3RoZXJNYW50aXNzYSA+PiAxKTsKICAgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KIAotICBpZiAoIChhY2N1ID49IChGTDJGWENPTlNUX0RCTCgwLjVmKSAtIChGSVhQX0RCTCkxKSkgfHwgKGFjY3UgPD0gRkwyRlhDT05TVF9EQkwoLTAuNWYpKSApCisgIGlmICgoYWNjdSA+PSAoRkwyRlhDT05TVF9EQkwoMC41ZikgLSAoRklYUF9EQkwpMSkpIHx8CisgICAgICAoYWNjdSA8PSBGTDJGWENPTlNUX0RCTCgtMC41ZikpKQogICAgICpwdHJTdW1fZSArPSAxOwogICBlbHNlCiAgICAgYWNjdSA9IChzaGlmdGVkTWFudGlzc2EgKyBvdGhlck1hbnRpc3NhKTsKIAogICAqcHRyU3VtID0gYWNjdTsKLQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjA0LDE3ICsyMjMsMTggQEAKICAgd2hpY2ggbGltaXRzIGFjY3VyYWN5LgogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW5saW5lIHZvaWQgRkRLX2RpdmlkZV9NYW50RXhwKEZJWFBfU0dMIGFfbSwgICAgICAgICAgIC8qITwgTWFudGlzc2Egb2YgZGl2aWRlbmQgYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgYV9lLCAgICAgICAgICAvKiE8IEV4cG9uZW50IG9mIGRpdmlkZW5kIGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgIGJfbSwgICAgICAgICAgLyohPCBNYW50aXNzYSBvZiBkaXZpc29yIGIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGJfZSwgICAgICAgICAgLyohPCBFeHBvbmVudCBvZiBkaXZpc29yIGIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgKnB0clJlc3VsdF9tLCAgLyohPCBNYW50aXNzYSBvZiBxdW90aWVudCBhL2IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKnB0clJlc3VsdF9lKSAgLyohPCBFeHBvbmVudCBvZiBxdW90aWVudCBhL2IgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBGREtfZGl2aWRlX01hbnRFeHAoCisgICAgRklYUF9TR0wgYV9tLCAgICAgICAgICAvKiE8IE1hbnRpc3NhIG9mIGRpdmlkZW5kIGEgKi8KKyAgICBTQ0hBUiBhX2UsICAgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgZGl2aWRlbmQgYSAqLworICAgIEZJWFBfU0dMIGJfbSwgICAgICAgICAgLyohPCBNYW50aXNzYSBvZiBkaXZpc29yIGIgKi8KKyAgICBTQ0hBUiBiX2UsICAgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgZGl2aXNvciBiICovCisgICAgRklYUF9TR0wgKnB0clJlc3VsdF9tLCAvKiE8IE1hbnRpc3NhIG9mIHF1b3RpZW50IGEvYiAqLworICAgIFNDSEFSICpwdHJSZXN1bHRfZSkgICAgLyohPCBFeHBvbmVudCBvZiBxdW90aWVudCBhL2IgKi8KIAogewogICBpbnQgcHJlU2hpZnQsIHBvc3RTaGlmdCwgaW5kZXgsIHNoaWZ0OwogICBGSVhQX0RCTCByYXRpb19tOwotICBGSVhQX1NHTCAgYkludl9tID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisgIEZJWFBfU0dMIGJJbnZfbSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogCiAgIHByZVNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKEZYX1NHTDJGWF9EQkwoYl9tKSk7CiAKQEAgLTIzNiw0MSArMjU2LDQxIEBACiAgICovCiAgIHNoaWZ0ID0gKEZSQUNUX0JJVFMgLSAyIC0gSU5WX1RBQkxFX0JJVFMgLSBwcmVTaGlmdCk7CiAKLSAgaW5kZXggPSAoc2hpZnQ8MCk/IChMT05HKWJfbSA8PCAoLXNoaWZ0KSA6IChMT05HKWJfbSA+PiBzaGlmdDsKLQorICBpbmRleCA9IChzaGlmdCA8IDApID8gKExPTkcpYl9tIDw8ICgtc2hpZnQpIDogKExPTkcpYl9tID4+IHNoaWZ0OwogCiAgIC8qIFRoZSBpbmRleCBoYXMgSU5WX1RBQkxFX0JJVFMgKzEgdmFsaWQgYml0cyBoZXJlLiBDbGVhciB0aGUgb3RoZXIgYml0cy4gKi8KLSAgaW5kZXggJj0gKDEgPDwgKElOVl9UQUJMRV9CSVRTKzEpKSAtIDE7CisgIGluZGV4ICY9ICgxIDw8IChJTlZfVEFCTEVfQklUUyArIDEpKSAtIDE7CiAKLSAgICAvKiBSZW1vdmUgb2Zmc2V0IG9mIGhhbGYgYW4gaW50ZXJ2YWwgKi8KKyAgLyogUmVtb3ZlIG9mZnNldCBvZiBoYWxmIGFuIGludGVydmFsICovCiAgIGluZGV4LS07CiAKLSAgICAvKiBOb3cgdGhlIGxvd2VzdCBiaXQgaXMgc2hpZnRlZCBvdXQgKi8KKyAgLyogTm93IHRoZSBsb3dlc3QgYml0IGlzIHNoaWZ0ZWQgb3V0ICovCiAgIGluZGV4ID0gaW5kZXggPj4gMTsKIAotICAgIC8qIEZldGNoIGludmVyc2VkIG1hbnRpc3NhIGZyb20gdGFibGU6ICovCi0gIGJJbnZfbSA9IChpbmRleDwwKT8gYkludl9tIDogRkRLX3NickRlY29kZXJfaW52VGFibGVbaW5kZXhdOworICAvKiBGZXRjaCBpbnZlcnNlZCBtYW50aXNzYSBmcm9tIHRhYmxlOiAqLworICBiSW52X20gPSAoaW5kZXggPCAwKSA/IGJJbnZfbSA6IEZES19zYnJEZWNvZGVyX2ludlRhYmxlW2luZGV4XTsKIAotICAgIC8qIE11bHRpcGx5IGEgd2l0aCB0aGUgaW52ZXJzZSBvZiBiOiAqLwotICByYXRpb19tID0gKGluZGV4PDApPyBGWF9TR0wyRlhfREJMKGFfbSA+PiAxKSA6IGZNdWx0RGl2MihiSW52X20sYV9tKTsKKyAgLyogTXVsdGlwbHkgYSB3aXRoIHRoZSBpbnZlcnNlIG9mIGI6ICovCisgIHJhdGlvX20gPSAoaW5kZXggPCAwKSA/IEZYX1NHTDJGWF9EQkwoYV9tID4+IDEpIDogZk11bHREaXYyKGJJbnZfbSwgYV9tKTsKIAotICBwb3N0U2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MocmF0aW9fbSktMTsKKyAgcG9zdFNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKHJhdGlvX20pIC0gMTsKIAogICAqcHRyUmVzdWx0X20gPSBGWF9EQkwyRlhfU0dMKHJhdGlvX20gPDwgcG9zdFNoaWZ0KTsKICAgKnB0clJlc3VsdF9lID0gYV9lIC0gYl9lICsgMSArIHByZVNoaWZ0IC0gcG9zdFNoaWZ0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgRkRLX2RpdmlkZV9NYW50RXhwKEZJWFBfREJMIGFfbSwgICAgICAgICAgIC8qITwgTWFudGlzc2Egb2YgZGl2aWRlbmQgYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgYV9lLCAgICAgICAgICAvKiE8IEV4cG9uZW50IG9mIGRpdmlkZW5kIGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIGJfbSwgICAgICAgICAgLyohPCBNYW50aXNzYSBvZiBkaXZpc29yIGIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGJfZSwgICAgICAgICAgLyohPCBFeHBvbmVudCBvZiBkaXZpc29yIGIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnB0clJlc3VsdF9tLCAgLyohPCBNYW50aXNzYSBvZiBxdW90aWVudCBhL2IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKnB0clJlc3VsdF9lKSAgLyohPCBFeHBvbmVudCBvZiBxdW90aWVudCBhL2IgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBGREtfZGl2aWRlX01hbnRFeHAoCisgICAgRklYUF9EQkwgYV9tLCAgICAgICAgICAvKiE8IE1hbnRpc3NhIG9mIGRpdmlkZW5kIGEgKi8KKyAgICBTQ0hBUiBhX2UsICAgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgZGl2aWRlbmQgYSAqLworICAgIEZJWFBfREJMIGJfbSwgICAgICAgICAgLyohPCBNYW50aXNzYSBvZiBkaXZpc29yIGIgKi8KKyAgICBTQ0hBUiBiX2UsICAgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgZGl2aXNvciBiICovCisgICAgRklYUF9EQkwgKnB0clJlc3VsdF9tLCAvKiE8IE1hbnRpc3NhIG9mIHF1b3RpZW50IGEvYiAqLworICAgIFNDSEFSICpwdHJSZXN1bHRfZSkgICAgLyohPCBFeHBvbmVudCBvZiBxdW90aWVudCBhL2IgKi8KIAogewogICBpbnQgcHJlU2hpZnQsIHBvc3RTaGlmdCwgaW5kZXgsIHNoaWZ0OwogICBGSVhQX0RCTCByYXRpb19tOwotICBGSVhQX1NHTCAgYkludl9tID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisgIEZJWFBfU0dMIGJJbnZfbSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogCiAgIHByZVNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKGJfbSk7CiAKQEAgLTI5MiwyNSArMzEyLDI0IEBACiAgICovCiAgIHNoaWZ0ID0gKERGUkFDVF9CSVRTIC0gMiAtIElOVl9UQUJMRV9CSVRTIC0gcHJlU2hpZnQpOwogCi0gIGluZGV4ID0gKHNoaWZ0PDApPyAoTE9ORyliX20gPDwgKC1zaGlmdCkgOiAoTE9ORyliX20gPj4gc2hpZnQ7Ci0KKyAgaW5kZXggPSAoc2hpZnQgPCAwKSA/IChMT05HKWJfbSA8PCAoLXNoaWZ0KSA6IChMT05HKWJfbSA+PiBzaGlmdDsKIAogICAvKiBUaGUgaW5kZXggaGFzIElOVl9UQUJMRV9CSVRTICsxIHZhbGlkIGJpdHMgaGVyZS4gQ2xlYXIgdGhlIG90aGVyIGJpdHMuICovCi0gIGluZGV4ICY9ICgxIDw8IChJTlZfVEFCTEVfQklUUysxKSkgLSAxOworICBpbmRleCAmPSAoMSA8PCAoSU5WX1RBQkxFX0JJVFMgKyAxKSkgLSAxOwogCi0gICAgLyogUmVtb3ZlIG9mZnNldCBvZiBoYWxmIGFuIGludGVydmFsICovCisgIC8qIFJlbW92ZSBvZmZzZXQgb2YgaGFsZiBhbiBpbnRlcnZhbCAqLwogICBpbmRleC0tOwogCi0gICAgLyogTm93IHRoZSBsb3dlc3QgYml0IGlzIHNoaWZ0ZWQgb3V0ICovCisgIC8qIE5vdyB0aGUgbG93ZXN0IGJpdCBpcyBzaGlmdGVkIG91dCAqLwogICBpbmRleCA9IGluZGV4ID4+IDE7CiAKLSAgICAvKiBGZXRjaCBpbnZlcnNlZCBtYW50aXNzYSBmcm9tIHRhYmxlOiAqLwotICBiSW52X20gPSAoaW5kZXg8MCk/IGJJbnZfbSA6IEZES19zYnJEZWNvZGVyX2ludlRhYmxlW2luZGV4XTsKKyAgLyogRmV0Y2ggaW52ZXJzZWQgbWFudGlzc2EgZnJvbSB0YWJsZTogKi8KKyAgYkludl9tID0gKGluZGV4IDwgMCkgPyBiSW52X20gOiBGREtfc2JyRGVjb2Rlcl9pbnZUYWJsZVtpbmRleF07CiAKLSAgICAvKiBNdWx0aXBseSBhIHdpdGggdGhlIGludmVyc2Ugb2YgYjogKi8KLSAgcmF0aW9fbSA9IChpbmRleDwwKT8gKGFfbSA+PiAxKSA6IGZNdWx0RGl2MihiSW52X20sYV9tKTsKKyAgLyogTXVsdGlwbHkgYSB3aXRoIHRoZSBpbnZlcnNlIG9mIGI6ICovCisgIHJhdGlvX20gPSAoaW5kZXggPCAwKSA/IChhX20gPj4gMSkgOiBmTXVsdERpdjIoYkludl9tLCBhX20pOwogCi0gIHBvc3RTaGlmdCA9IENudExlYWRpbmdaZXJvcyhyYXRpb19tKS0xOworICBwb3N0U2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MocmF0aW9fbSkgLSAxOwogCiAgICpwdHJSZXN1bHRfbSA9IHJhdGlvX20gPDwgcG9zdFNoaWZ0OwogICAqcHRyUmVzdWx0X2UgPSBhX2UgLSBiX2UgKyAxICsgcHJlU2hpZnQgLSBwb3N0U2hpZnQ7CkBAIC0zMjYsMzAgKzM0NSwyOCBAQAogICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIHNxdWFyZSByb290IGlzIGJhc2VkIG9uIGEgdGFibGUgbG9va3VwCiAgIHdoaWNoIGxpbWl0cyBhY2N1cmFjeS4KICovCi1zdGF0aWMgaW5saW5lIHZvaWQgRkRLX3NxcnRfTWFudEV4cChGSVhQX0RCTCAqbWFudGlzc2EsICAgIC8qITwgUG9pbnRlciB0byBtYW50aXNzYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKmV4cG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgKmRlc3RTY2FsZSkKLXsKK3N0YXRpYyBpbmxpbmUgdm9pZCBGREtfc3FydF9NYW50RXhwKAorICAgIEZJWFBfREJMICptYW50aXNzYSwgLyohPCBQb2ludGVyIHRvIG1hbnRpc3NhICovCisgICAgU0NIQVIgKmV4cG9uZW50LCBjb25zdCBTQ0hBUiAqZGVzdFNjYWxlKSB7CiAgIEZJWFBfREJMIGlucHV0X20gPSAqbWFudGlzc2E7Ci0gIGludCAgIGlucHV0X2UgPSAoaW50KSAqZXhwb25lbnQ7CisgIGludCBpbnB1dF9lID0gKGludCkqZXhwb25lbnQ7CiAgIEZJWFBfREJMIHJlc3VsdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICBpbnQgICAgcmVzdWx0X2UgPSAtRlJBQ1RfQklUUzsKKyAgaW50IHJlc3VsdF9lID0gLUZSQUNUX0JJVFM7CiAKICAgLyogQ2FsbCBsb29rdXAgc3F1YXJlIHJvb3QsIHdoaWNoIGRvZXMgaW50ZXJuYWxseSBub3JtYWxpemF0aW9uLiAqLwotICByZXN1bHQgICA9IHNxcnRGaXhwX2xvb2t1cChpbnB1dF9tLCAmaW5wdXRfZSk7CisgIHJlc3VsdCA9IHNxcnRGaXhwX2xvb2t1cChpbnB1dF9tLCAmaW5wdXRfZSk7CiAgIHJlc3VsdF9lID0gaW5wdXRfZTsKIAogICAvKiBXcml0ZSByZXN1bHQgKi8KLSAgaWYgKGV4cG9uZW50PT1kZXN0U2NhbGUpIHsKKyAgaWYgKGV4cG9uZW50ID09IGRlc3RTY2FsZSkgewogICAgICptYW50aXNzYSA9IHJlc3VsdDsKICAgICAqZXhwb25lbnQgPSByZXN1bHRfZTsKICAgfSBlbHNlIHsKICAgICBpbnQgc2hpZnQgPSByZXN1bHRfZSAtICpkZXN0U2NhbGU7Ci0gICAgKm1hbnRpc3NhID0gKHNoaWZ0Pj0wKSA/IHJlc3VsdCA8PCAoSU5UKWZpeE1pbihERlJBQ1RfQklUUy0xLHNoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZXN1bHQgPj4gKElOVClmaXhNaW4oREZSQUNUX0JJVFMtMSwtc2hpZnQpOworICAgICptYW50aXNzYSA9IChzaGlmdCA+PSAwKSA/IHJlc3VsdCA8PCAoSU5UKWZpeE1pbihERlJBQ1RfQklUUyAtIDEsIHNoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlc3VsdCA+PiAoSU5UKWZpeE1pbihERlJBQ1RfQklUUyAtIDEsIC1zaGlmdCk7CiAgICAgKmV4cG9uZW50ID0gKmRlc3RTY2FsZTsKICAgfQogfQogCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL2luY2x1ZGUvc2JyX2VuY29kZXIuaCBiL2xpYlNCUmVuYy9pbmNsdWRlL3Nicl9lbmNvZGVyLmgKaW5kZXggYWVjMDM5OC4uZDk3OWJhNiAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL2luY2x1ZGUvc2JyX2VuY29kZXIuaAorKysgYi9saWJTQlJlbmMvaW5jbHVkZS9zYnJfZW5jb2Rlci5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE3ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTICoqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiBTQlIgZW5jb2RlciB0b3AgbGV2ZWwgcHJvY2Vzc2luZyBwcm90b3R5cGUKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfX1NCUl9FTkNPREVSX0gKLSNkZWZpbmUgX19TQlJfRU5DT0RFUl9ICisjaWZuZGVmIFNCUl9FTkNPREVSX0gKKyNkZWZpbmUgU0JSX0VOQ09ERVJfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogI2luY2x1ZGUgIkZES19hdWRpby5oIgpAQCAtOTcsMjAgKzEwOSwxNyBAQAogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKIAogLyogY29yZSBjb2RlciBoZWxwZXJzICovCi0jZGVmaW5lIE1BWF9UUkFOU19GQUMgICAgICAgICA4CisjZGVmaW5lIE1BWF9UUkFOU19GQUMgOAogI2RlZmluZSBNQVhfQ09ERUNfRlJBTUVfUkFUSU8gMgotI2RlZmluZSBNQVhfUEFZTE9BRF9TSVpFICAgIDI1NgorI2RlZmluZSBNQVhfUEFZTE9BRF9TSVpFIDI1NgogCi10eXBlZGVmIGVudW0gY29kZWNUeXBlCi17Ci0gIENPREVDX0FBQz0wLAotICBDT0RFQ19BQUNMRD0xLAotICBDT0RFQ19VTlNQRUNJRklFRD05OQordHlwZWRlZiBlbnVtIGNvZGVjVHlwZSB7CisgIENPREVDX0FBQyA9IDAsCisgIENPREVDX0FBQ0xEID0gMSwKKyAgQ09ERUNfVU5TUEVDSUZJRUQgPSA5OQogfSBDT0RFQ19UWVBFOwogCi0KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIElOVCBiaXRSYXRlOwogICBJTlQgbkNoYW5uZWxzOwogICBJTlQgc2FtcGxlRnJlcTsKQEAgLTExOCw4ICsxMjcsNyBAQAogICBJTlQgc3RhbmRhcmRCaXRyYXRlOwogfSBDT0RFQ19QQVJBTTsKIAotdHlwZWRlZiBlbnVtCi17Cit0eXBlZGVmIGVudW0gewogICBTQlJfTU9OTywKICAgU0JSX0xFRlRfUklHSFQsCiAgIFNCUl9DT1VQTElORywKQEAgLTEyNywxMzYgKzEzNSwxNDMgQEAKIH0gU0JSX1NURVJFT19NT0RFOwogCiAvKiBiaXRzdHJlYW0gc3ludGF4IGZsYWdzICovCi1lbnVtCi17CitlbnVtIHsKICAgU0JSX1NZTlRBWF9MT1dfREVMQVkgPSAweDAwMDEsCi0gIFNCUl9TWU5UQVhfU0NBTEFCTEUgID0gMHgwMDAyLAotICBTQlJfU1lOVEFYX0NSQyAgICAgICA9IDB4MDAwNCwKLSAgU0JSX1NZTlRBWF9EUk1fQ1JDICAgPSAweDAwMDgKKyAgU0JSX1NZTlRBWF9TQ0FMQUJMRSA9IDB4MDAwMiwKKyAgU0JSX1NZTlRBWF9DUkMgPSAweDAwMDQsCisgIFNCUl9TWU5UQVhfRFJNX0NSQyA9IDB4MDAwOCwKKyAgU0JSX1NZTlRBWF9FTERfUkVEVUNFRF9ERUxBWSA9IDB4MDAxMAogfTsKIAotdHlwZWRlZiBlbnVtCi17Ci0gIEZSRVFfUkVTX0xPVyA9IDAsCi0gIEZSRVFfUkVTX0hJR0gKLX0gRlJFUV9SRVM7Cit0eXBlZGVmIGVudW0geyBGUkVRX1JFU19MT1cgPSAwLCBGUkVRX1JFU19ISUdIIH0gRlJFUV9SRVM7CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIENPREVDX1RZUEUgICAgICAgY29yZUNvZGVyOyAgICAgICAgLyohPCBMQyBvciBFTEQgKi8KLSAgVUlOVCAgICAgICAgICAgICBiaXRyYXRlRnJvbTsgICAgICAvKiE8IGluY2x1c2l2ZSAqLwotICBVSU5UICAgICAgICAgICAgIGJpdHJhdGVUbzsgICAgICAgIC8qITwgZXhjbHVzaXZlICovCit0eXBlZGVmIHN0cnVjdCB7CisgIENPREVDX1RZUEUgY29yZUNvZGVyOyAvKiE8IExDIG9yIEVMRCAqLworICBVSU5UIGJpdHJhdGVGcm9tOyAgICAgLyohPCBpbmNsdXNpdmUgKi8KKyAgVUlOVCBiaXRyYXRlVG87ICAgICAgIC8qITwgZXhjbHVzaXZlICovCiAKLSAgVUlOVCAgICAgICAgICAgICBzYW1wbGVSYXRlOyAgICAgICAvKiE8ICAgKi8KLSAgVUNIQVIgICAgICAgICAgICBudW1DaGFubmVsczsgICAgICAvKiE8ICAgKi8KKyAgVUlOVCBzYW1wbGVSYXRlOyAgIC8qITwgICAqLworICBVQ0hBUiBudW1DaGFubmVsczsgLyohPCAgICovCiAKLSAgVUNIQVIgICAgICAgICAgICBzdGFydEZyZXE7ICAgICAgICAvKiE8IGJzX3N0YXJ0X2ZyZXEgKi8KLSAgVUNIQVIgICAgICAgICAgICBzdGFydEZyZXFTcGVlY2g7ICAvKiE8IGJzX3N0YXJ0X2ZyZXEgZm9yIHNwZWVjaCBjb25maWcgZmxhZyAqLwotICBVQ0hBUiAgICAgICAgICAgIHN0b3BGcmVxOyAgICAgICAgIC8qITwgYnNfc3RvcF9mcmVxICovCi0gIFVDSEFSICAgICAgICAgICAgc3RvcEZyZXFTcGVlY2g7ICAgLyohPCBic19zdG9wX2ZyZXEgZm9yIHNwZWVjaCBjb25maWcgZmxhZyAqLworICBVQ0hBUiBzdGFydEZyZXE7ICAgICAgIC8qITwgYnNfc3RhcnRfZnJlcSAqLworICBVQ0hBUiBzdGFydEZyZXFTcGVlY2g7IC8qITwgYnNfc3RhcnRfZnJlcSBmb3Igc3BlZWNoIGNvbmZpZyBmbGFnICovCisgIFVDSEFSIHN0b3BGcmVxOyAgICAgICAgLyohPCBic19zdG9wX2ZyZXEgKi8KKyAgVUNIQVIgc3RvcEZyZXFTcGVlY2g7ICAvKiE8IGJzX3N0b3BfZnJlcSBmb3Igc3BlZWNoIGNvbmZpZyBmbGFnICovCiAKLSAgVUNIQVIgICAgICAgICAgICBudW1Ob2lzZUJhbmRzOyAgICAvKiE8ICAgKi8KLSAgVUNIQVIgICAgICAgICAgICBub2lzZUZsb29yT2Zmc2V0OyAvKiE8ICAgKi8KLSAgU0NIQVIgICAgICAgICAgICBub2lzZU1heExldmVsOyAgICAvKiE8ICAgKi8KLSAgU0JSX1NURVJFT19NT0RFICBzdGVyZW9Nb2RlOyAgICAgICAvKiE8ICAgKi8KLSAgVUNIQVIgICAgICAgICAgICBmcmVxU2NhbGU7ICAgICAgICAvKiE8ICAgKi8KKyAgVUNIQVIgbnVtTm9pc2VCYW5kczsgICAgICAgIC8qITwgICAqLworICBVQ0hBUiBub2lzZUZsb29yT2Zmc2V0OyAgICAgLyohPCAgICovCisgIFNDSEFSIG5vaXNlTWF4TGV2ZWw7ICAgICAgICAvKiE8ICAgKi8KKyAgU0JSX1NURVJFT19NT0RFIHN0ZXJlb01vZGU7IC8qITwgICAqLworICBVQ0hBUiBmcmVxU2NhbGU7ICAgICAgICAgICAgLyohPCAgICovCiB9IHNiclR1bmluZ1RhYmxlX3Q7CiAKLXR5cGVkZWYgc3RydWN0IHNickNvbmZpZ3VyYXRpb24KLXsKK3R5cGVkZWYgc3RydWN0IHNickNvbmZpZ3VyYXRpb24gewogICAvKgogICAgICBjb3JlIGNvZGVyIGRlcGVuZGVudCBjb25maWd1cmF0aW9ucwogICAqLwotICBDT0RFQ19QQVJBTSBjb2RlY1NldHRpbmdzOyAgLyohPCBDb3JlIGNvZGVyIHNldHRpbmdzLiBUbyBiZSBzZXQgZnJvbSBjb3JlIGNvZGVyLiAqLwotICBJTlQgU2VuZEhlYWRlckRhdGFUaW1lOyAgICAgLyohPCBTQlIgaGVhZGVyIHNlbmQgdXBkYXRlIGZyZXF1ZW5jeSBpbiBtcy4gKi8KLSAgSU5UIHVzZVdhdmVDb2Rpbmc7ICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2Ygd2F2ZWNvZGluZyB0b29sLiAqLwotICBJTlQgY3JjU2JyOyAgICAgICAgICAgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiBTQlItQ1JDLiAqLwotICBJTlQgZHluQndTdXBwb3J0ZWQ7ICAgICAgICAgLyohPCBGbGFnOiBzdXBwb3J0IGZvciBkeW5hbWljIGJhbmR3aWR0aCBpbiB0aGlzIGNvbWJpbmF0aW9uLiAqLwotICBJTlQgcGFyYW1ldHJpY0NvZGluZzsgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiBwYXJhbWV0cmljIGNvZGluZyB0b29sLiAqLwotICBJTlQgZG93blNhbXBsZUZhY3RvcjsgICAgICAgLyohPCBTYW1wbGluZyByYXRlIHJlbGF0aW9uIGJldHdlZW4gdGhlIFNCUiBhbmQgdGhlIGNvcmUgZW5jb2Rlci4gKi8KLSAgRlJFUV9SRVMgZnJlcV9yZXNfZml4Zml4WzJdOy8qITwgRnJlcXVlbmN5IHJlc29sdXRpb24gb2YgZW52ZWxvcGVzIGluIGZyYW1lIGNsYXNzIEZJWEZJWCwgZm9yIG5vbi1zcGxpdCBjYXNlIGFuZCBzcGxpdCBjYXNlICovCi0gIFVDSEFSIGZSZXNUcmFuc0lzTG93OyAgICAgICAvKiE8IEZyZXF1ZW5jeSByZXNvbHV0aW9uIG9mIGVudmVsb3BlcyBpbiB0cmFuc2llbnQgZnJhbWVzOiBsb3cgKDApIG9yIHZhcmlhYmxlICgxKSAqLworICBDT0RFQ19QQVJBTQorICBjb2RlY1NldHRpbmdzOyAvKiE8IENvcmUgY29kZXIgc2V0dGluZ3MuIFRvIGJlIHNldCBmcm9tIGNvcmUgY29kZXIuICovCisgIElOVCBTZW5kSGVhZGVyRGF0YVRpbWU7IC8qITwgU0JSIGhlYWRlciBzZW5kIHVwZGF0ZSBmcmVxdWVuY3kgaW4gbXMuICovCisgIElOVCB1c2VXYXZlQ29kaW5nOyAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2Ygd2F2ZWNvZGluZyB0b29sLiAqLworICBJTlQgY3JjU2JyOyAgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIFNCUi1DUkMuICovCisgIElOVCBkeW5Cd1N1cHBvcnRlZDsgICAgIC8qITwgRmxhZzogc3VwcG9ydCBmb3IgZHluYW1pYyBiYW5kd2lkdGggaW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5hdGlvbi4gKi8KKyAgSU5UIHBhcmFtZXRyaWNDb2Rpbmc7ICAgLyohPCBGbGFnOiB1c2FnZSBvZiBwYXJhbWV0cmljIGNvZGluZyB0b29sLiAqLworICBJTlQgZG93blNhbXBsZUZhY3RvcjsgLyohPCBTYW1wbGluZyByYXRlIHJlbGF0aW9uIGJldHdlZW4gdGhlIFNCUiBhbmQgdGhlIGNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIuICovCisgIEZSRVFfUkVTIGZyZXFfcmVzX2ZpeGZpeFsyXTsgLyohPCBGcmVxdWVuY3kgcmVzb2x1dGlvbiBvZiBlbnZlbG9wZXMgaW4gZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBGSVhGSVgsIGZvciBub24tc3BsaXQgY2FzZSBhbmQgc3BsaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICovCisgIFVDSEFSIGZSZXNUcmFuc0lzTG93OyAvKiE8IEZyZXF1ZW5jeSByZXNvbHV0aW9uIG9mIGVudmVsb3BlcyBpbiB0cmFuc2llbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lczogbG93ICgwKSBvciB2YXJpYWJsZSAoMSkgKi8KIAogICAvKgogICAgICBjb3JlIGNvZGVyIGRlcGVuZGVudCB0dW5pbmcgcGFyYW1ldGVycwogICAqLwotICBJTlQgdHJhbl90aHI7ICAgICAgICAgICAgIC8qITwgU0JSIHRyYW5zaWVudCBkZXRlY3RvciB0aHJlc2hvbGQgKCogMTAwKS4gKi8KLSAgSU5UIG5vaXNlRmxvb3JPZmZzZXQ7ICAgICAvKiE8IE5vaXNlIGZsb29yIG9mZnNldC4gICAgICAqLwotICBVSU5UIHVzZVNwZWVjaENvbmZpZzsgICAgIC8qITwgRmxhZzogYWRhcHQgdHVuaW5nIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHNwZWVjaC4gKi8KLQotCisgIElOVCB0cmFuX3RocjsgICAgICAgICAvKiE8IFNCUiB0cmFuc2llbnQgZGV0ZWN0b3IgdGhyZXNob2xkICgqIDEwMCkuICovCisgIElOVCBub2lzZUZsb29yT2Zmc2V0OyAvKiE8IE5vaXNlIGZsb29yIG9mZnNldC4gICAgICAqLworICBVSU5UIHVzZVNwZWVjaENvbmZpZzsgLyohPCBGbGFnOiBhZGFwdCB0dW5pbmcgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gc3BlZWNoLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKICAgLyoKICAgICAgY29yZSBjb2RlciBpbmRlcGVuZGVudCBjb25maWd1cmF0aW9ucwogICAqLwotICBJTlQgc2JyRnJhbWVTaXplOyAgICAgICAgICAgLyohPCBTQlIgZnJhbWUgc2l6ZSBpbiBzYW1wbGVzLiBXaWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBjb3JlIGNvZGVyIHNldHRpbmdzLiAqLwotICBJTlQgc2JyX2RhdGFfZXh0cmE7ICAgICAgICAgLyohPCBGbGFnIHVzYWdlIG9mIGRhdGEgZXh0cmEuICovCi0gIElOVCBhbXBfcmVzOyAgICAgICAgICAgICAgICAvKiE8IEFtcGxpdHVkZSByZXNvbHV0aW9uLiAqLwotICBJTlQgYW5hX21heF9sZXZlbDsgICAgICAgICAgLyohPCBOb2lzZSBpbnNlcnRpb24gbWF4aW11bSBsZXZlbC4gKi8KLSAgSU5UIHRyYW5fZmM7ICAgICAgICAgICAgICAgIC8qITwgVHJhbnNpZW50IGRldGVjdG9yIHN0YXJ0IGZyZXF1ZW5jeS4gKi8KLSAgSU5UIHRyYW5fZGV0X21vZGU7ICAgICAgICAgIC8qITwgVHJhbnNpZW50IGRldGVjdG9yIG1vZGUuICovCi0gIElOVCBzcHJlYWQ7ICAgICAgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIFNCUiBzcHJlYWQuICovCi0gIElOVCBzdGF0OyAgICAgICAgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIHN0YXRpYyBmcmFtaW5nLiAqLwotICBJTlQgZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZW52ZWxvcGVzIHdoZW4gc3RhdGljIGZyYW1pbmcgaXMgY2hvc2VuLiAqLworICBJTlQgc2JyRnJhbWVTaXplOyAvKiE8IFNCUiBmcmFtZSBzaXplIGluIHNhbXBsZXMuIFdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIGNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgY29kZXIgc2V0dGluZ3MuICovCisgIElOVCBzYnJfZGF0YV9leHRyYTsgLyohPCBGbGFnIHVzYWdlIG9mIGRhdGEgZXh0cmEuICovCisgIElOVCBhbXBfcmVzOyAgICAgICAgLyohPCBBbXBsaXR1ZGUgcmVzb2x1dGlvbi4gKi8KKyAgSU5UIGFuYV9tYXhfbGV2ZWw7ICAvKiE8IE5vaXNlIGluc2VydGlvbiBtYXhpbXVtIGxldmVsLiAqLworICBJTlQgdHJhbl9mYzsgICAgICAgIC8qITwgVHJhbnNpZW50IGRldGVjdG9yIHN0YXJ0IGZyZXF1ZW5jeS4gKi8KKyAgSU5UIHRyYW5fZGV0X21vZGU7ICAvKiE8IFRyYW5zaWVudCBkZXRlY3RvciBtb2RlLiAqLworICBJTlQgc3ByZWFkOyAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgU0JSIHNwcmVhZC4gKi8KKyAgSU5UIHN0YXQ7ICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIHN0YXRpYyBmcmFtaW5nLiAqLworICBJTlQgZTsgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVudmVsb3BlcyB3aGVuIHN0YXRpYyBmcmFtaW5nIGlzIGNob3Nlbi4gKi8KICAgU0JSX1NURVJFT19NT0RFIHN0ZXJlb01vZGU7IC8qITwgU0JSIHN0ZXJlbyBtb2RlLiAqLwogICBJTlQgZGVsdGFUQWNyb3NzRnJhbWVzOyAgICAgLyohPCBGbGFnOiBhbGxvdyB0aW1lLWRlbHRhIGNvZGluZy4gKi8KLSAgRklYUF9EQkwgZEZfZWRnZV8xc3RFbnY7ICAgIC8qITwgRXh0cmEgZnJhY3Rpb24gZGVsdGEtRiBjb2RpbmcgaXMgYWxsb3dlZCB0byBiZSBtb3JlIGV4cGVuc2l2ZS4gKi8KLSAgRklYUF9EQkwgZEZfZWRnZV9pbmNyOyAgICAgIC8qITwgSW5jcmVtZW50IGRGX2VkZ2VfMXN0RW52IHRoaXMgbXVjaCBpZiBkVC1jb2Rpbmcgd2FzIHVzZWQgdGhpcyBmcmFtZS4gKi8KLSAgSU5UIHNicl9pbnZmX21vZGU7ICAgICAgICAgIC8qITwgSW52ZXJzZSBmaWx0ZXJpbmcgbW9kZS4gKi8KLSAgSU5UIHNicl94cG9zX21vZGU7ICAgICAgICAgIC8qITwgVHJhbnNwb3NlciBtb2RlLiAqLwotICBJTlQgc2JyX3hwb3NfY3RybDsgICAgICAgICAgLyohPCBUcmFuc3Bvc2VyIGNvbnRyb2wuICovCi0gIElOVCBzYnJfeHBvc19sZXZlbDsgICAgICAgICAvKiE8IFRyYW5zcG9zZXIgM3JkIG9yZGVyIGxldmVsLiAqLwotICBJTlQgc3RhcnRGcmVxOyAgICAgICAgICAgICAgLyohPCBUaGUgc3RhcnQgZnJlcXVlbmN5IHRhYmxlIGluZGV4LiAqLwotICBJTlQgc3RvcEZyZXE7ICAgICAgICAgICAgICAgLyohPCBUaGUgc3RvcCBmcmVxdWVuY3kgdGFibGUgaW5kZXguICovCi0gIElOVCB1c2VTYVBhbjsgICAgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIFNBUEFOIHN0ZXJlby4gKi8KLSAgSU5UIGR5bkJ3RW5hYmxlZDsgICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgZHluYW1pYyBiYW5kd2lkdGguICovCi0gIElOVCBiUGFyYW1ldHJpY1N0ZXJlbzsgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIHBhcmFtZXRyaWMgc3RlcmVvIGNvZGluZyB0b29sLiAqLworICBGSVhQX0RCTCBkRl9lZGdlXzFzdEVudjsgLyohPCBFeHRyYSBmcmFjdGlvbiBkZWx0YS1GIGNvZGluZyBpcyBhbGxvd2VkIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGV4cGVuc2l2ZS4gKi8KKyAgRklYUF9EQkwgZEZfZWRnZV9pbmNyOyAgIC8qITwgSW5jcmVtZW50IGRGX2VkZ2VfMXN0RW52IHRoaXMgbXVjaCBpZiBkVC1jb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyB1c2VkIHRoaXMgZnJhbWUuICovCisgIElOVCBzYnJfaW52Zl9tb2RlOyAgICAgICAvKiE8IEludmVyc2UgZmlsdGVyaW5nIG1vZGUuICovCisgIElOVCBzYnJfeHBvc19tb2RlOyAgICAgICAvKiE8IFRyYW5zcG9zZXIgbW9kZS4gKi8KKyAgSU5UIHNicl94cG9zX2N0cmw7ICAgICAgIC8qITwgVHJhbnNwb3NlciBjb250cm9sLiAqLworICBJTlQgc2JyX3hwb3NfbGV2ZWw7ICAgICAgLyohPCBUcmFuc3Bvc2VyIDNyZCBvcmRlciBsZXZlbC4gKi8KKyAgSU5UIHN0YXJ0RnJlcTsgICAgICAgICAgIC8qITwgVGhlIHN0YXJ0IGZyZXF1ZW5jeSB0YWJsZSBpbmRleC4gKi8KKyAgSU5UIHN0b3BGcmVxOyAgICAgICAgICAgIC8qITwgVGhlIHN0b3AgZnJlcXVlbmN5IHRhYmxlIGluZGV4LiAqLworICBJTlQgdXNlU2FQYW47ICAgICAgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiBTQVBBTiBzdGVyZW8uICovCisgIElOVCBkeW5Cd0VuYWJsZWQ7ICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIGR5bmFtaWMgYmFuZHdpZHRoLiAqLworICBJTlQgYlBhcmFtZXRyaWNTdGVyZW87ICAgLyohPCBGbGFnOiB1c2FnZSBvZiBwYXJhbWV0cmljIHN0ZXJlbyBjb2RpbmcgdG9vbC4gKi8KIAogICAvKgogICAgICBoZWFkZXJfZXh0cmExIGNvbmZpZ3VyYXRpb24KICAgKi8KLSAgVUNIQVIgZnJlcVNjYWxlOyAgICAgICAgICAgIC8qITwgRnJlcXVlbmN5IGdyb3VwaW5nLiAqLwotICBJTlQgYWx0ZXJTY2FsZTsgICAgICAgICAgICAgLyohPCBTY2FsZSByZXNvbHV0aW9uLiAqLwotICBJTlQgc2JyX25vaXNlX2JhbmRzOyAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMuICovCi0KKyAgVUNIQVIgZnJlcVNjYWxlOyAgICAgLyohPCBGcmVxdWVuY3kgZ3JvdXBpbmcuICovCisgIElOVCBhbHRlclNjYWxlOyAgICAgIC8qITwgU2NhbGUgcmVzb2x1dGlvbi4gKi8KKyAgSU5UIHNicl9ub2lzZV9iYW5kczsgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMuICovCiAKICAgLyoKICAgICAgaGVhZGVyX2V4dHJhMiBjb25maWd1cmF0aW9uCiAgICovCi0gIElOVCBzYnJfbGltaXRlcl9iYW5kczsgICAgICAvKiE8IE51bWJlciBvZiBsaW1pdGVyIGJhbmRzLiAqLwotICBJTlQgc2JyX2xpbWl0ZXJfZ2FpbnM7ICAgICAgLyohPCBHYWluIG9mIGxpbWl0ZXIuICovCi0gIElOVCBzYnJfaW50ZXJwb2xfZnJlcTsgICAgICAvKiE8IEZsYWc6IHVzZSBpbnRlcnBvbGF0aW9uIGluIGZyZXEuIGRpcmVjdGlvbi4gKi8KLSAgSU5UIHNicl9zbW9vdGhpbmdfbGVuZ3RoOyAgIC8qITwgRmxhZzogY2hvb3NlIGxlbmd0aCA0IG9yIDAgKD1vbiwgb2ZmKS4gKi8KKyAgSU5UIHNicl9saW1pdGVyX2JhbmRzOyAgICAvKiE8IE51bWJlciBvZiBsaW1pdGVyIGJhbmRzLiAqLworICBJTlQgc2JyX2xpbWl0ZXJfZ2FpbnM7ICAgIC8qITwgR2FpbiBvZiBsaW1pdGVyLiAqLworICBJTlQgc2JyX2ludGVycG9sX2ZyZXE7ICAgIC8qITwgRmxhZzogdXNlIGludGVycG9sYXRpb24gaW4gZnJlcS4gZGlyZWN0aW9uLiAqLworICBJTlQgc2JyX3Ntb290aGluZ19sZW5ndGg7IC8qITwgRmxhZzogY2hvb3NlIGxlbmd0aCA0IG9yIDAgKD1vbiwgb2ZmKS4gKi8KICAgVUNIQVIgaW5pdF9hbXBfcmVzX0ZGOwogICBGSVhQX0RCTCB0aHJlc2hvbGRfQW1wUmVzX0ZGX207CiAgIFNDSEFSIHRocmVzaG9sZF9BbXBSZXNfRkZfZTsKLX0gc2JyQ29uZmlndXJhdGlvbiwgKnNickNvbmZpZ3VyYXRpb25QdHIgOworfSBzYnJDb25maWd1cmF0aW9uLCAqc2JyQ29uZmlndXJhdGlvblB0cjsKIAotdHlwZWRlZiBzdHJ1Y3QgU0JSX0NPTkZJR19EQVRBCi17Ci0gIFVJTlQgc2JyU3ludGF4RmxhZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBTQlIgc3ludGF4IGZsYWdzIGRlcml2ZWQgZnJvbSBBT1QuICovCi0gIElOVCBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMuICAqLwordHlwZWRlZiBzdHJ1Y3QgU0JSX0NPTkZJR19EQVRBIHsKKyAgVUlOVCBzYnJTeW50YXhGbGFnczsgLyoqPCBTQlIgc3ludGF4IGZsYWdzIGRlcml2ZWQgZnJvbSBBT1QuICovCisgIElOVCBuQ2hhbm5lbHM7ICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzLiAgKi8KIAotICBJTlQgblNmYlsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFNCUiBzY2FsZWZhY3RvciBiYW5kcyBmb3IgTE9fUkVTIGFuZCBISV9SRVMgKD8pICovCi0gIElOVCBudW1fTWFzdGVyOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdl9rX21hc3Rlci4gKi8KLSAgSU5UIHNhbXBsZUZyZXE7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNCUiBzYW1wbGluZyBmcmVxdWVuY3kuICovCisgIElOVCBuU2ZiWzJdOyAvKio8IE51bWJlciBvZiBTQlIgc2NhbGVmYWN0b3IgYmFuZHMgZm9yIExPX1JFUyBhbmQgSElfUkVTICg/KSAqLworICBJTlQgbnVtX01hc3RlcjsgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdl9rX21hc3Rlci4gKi8KKyAgSU5UIHNhbXBsZUZyZXE7IC8qKjwgU0JSIHNhbXBsaW5nIGZyZXF1ZW5jeS4gKi8KICAgSU5UIGZyYW1lU2l6ZTsKLSAgSU5UIHhPdmVyRnJlcTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBTQlIgc3RhcnQgZnJlcXVlbmN5LiAqLwotICBJTlQgZHluWE92ZXJGcmVxOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNlZCBjcm9zc292ZXIgZnJlcXVlbmN5IHdoZW4gZHluYW1pYyBiYW5kd2lkdGggaXMgZW5hYmxlZC4gKi8KLSAgSU5UIG5vUW1mQmFuZHM7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBRTUYgZnJlcXVlbmN5IGJhbmRzLiAqLwotICBJTlQgbm9RbWZTbG90czsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFFNRiBzbG90cy4gKi8KKyAgSU5UIHhPdmVyRnJlcTsgICAgLyoqPCBUaGUgU0JSIHN0YXJ0IGZyZXF1ZW5jeS4gKi8KKyAgSU5UIGR5blhPdmVyRnJlcTsgLyoqPCBVc2VkIGNyb3Nzb3ZlciBmcmVxdWVuY3kgd2hlbiBkeW5hbWljIGJhbmR3aWR0aCBpcworICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLiAqLwogCi0gIFVDSEFSICpmcmVxQmFuZFRhYmxlWzJdOyAgICAgICAgICAgICAgLyoqPCBGcmVxdWVuY3kgdGFibGUgZm9yIGxvdyBhbmQgaGlyZXMsIG9ubHkgTUFYX0ZSRVFfQ09FRkZTLzIgKzEgY29lZmZzIGFjdHVhbGx5IG5lZWRlZCBmb3IgbG93cmVzLiAqLwotICBVQ0hBUiAqdl9rX21hc3RlcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgTWFzdGVyIEJhbmRUYWJsZSB3aGVyZSBmcmVxQmFuZFRhYmxlIGlzIGRlcml2ZWQgZnJvbS4gKi8KKyAgSU5UIG5vUW1mQmFuZHM7IC8qKjwgTnVtYmVyIG9mIFFNRiBmcmVxdWVuY3kgYmFuZHMuICovCisgIElOVCBub1FtZlNsb3RzOyAvKio8IE51bWJlciBvZiBRTUYgc2xvdHMuICovCiAKKyAgVUNIQVIgKmZyZXFCYW5kVGFibGVbMl07IC8qKjwgRnJlcXVlbmN5IHRhYmxlIGZvciBsb3cgYW5kIGhpcmVzLCBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfRlJFUV9DT0VGRlMvMiArMSBjb2VmZnMgYWN0dWFsbHkgbmVlZGVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93cmVzLiAqLworICBVQ0hBUgorICAqdl9rX21hc3RlcjsgLyoqPCBNYXN0ZXIgQmFuZFRhYmxlIHdoZXJlIGZyZXFCYW5kVGFibGUgaXMgZGVyaXZlZCBmcm9tLiAqLwogCiAgIFNCUl9TVEVSRU9fTU9ERSBzdGVyZW9Nb2RlOwotICBJTlQgbm9FbnZDaGFubmVsczsgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudmVsb3BlIGNoYW5uZWxzLiAqLworICBJTlQgbm9FbnZDaGFubmVsczsgLyoqPCBOdW1iZXIgb2YgZW52ZWxvcGUgY2hhbm5lbHMuICovCiAKLSAgSU5UIHVzZVdhdmVDb2Rpbmc7ICAgICAgICAgICAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHdhdmUgY29kaW5nIGF0IGFsbC4gICAgICAqLwotICBJTlQgdXNlUGFyYW1ldHJpY0NvZGluZzsgICAgICAgICAgICAgIC8qKjwgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgcGFyYSBjb2RpbmcgYXQgYWxsLiAgICAgICovCi0gIElOVCB4cG9zQ3RybFN3aXRjaDsgICAgICAgICAgICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHRvIHN3aXRjaCB4cG9zIGN0cmwgb24gdGhlIGZseS4gKi8KLSAgSU5UIHN3aXRjaFRyYW5zcG9zZXJzOyAgICAgICAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc3dpdGNoIHhwb3Mgb24gdGhlIGZseSAuICAgICAqLworICBJTlQgdXNlV2F2ZUNvZGluZzsgLyoqPCBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSB3YXZlIGNvZGluZyBhdCBhbGwuICovCisgIElOVCB1c2VQYXJhbWV0cmljQ29kaW5nOyAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHBhcmEgY29kaW5nIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuICAgICAgKi8KKyAgSU5UIHhwb3NDdHJsU3dpdGNoOyAgICAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc3dpdGNoIHhwb3MgY3RybCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHkuICovCisgIElOVCBzd2l0Y2hUcmFuc3Bvc2VyczsgLyoqPCBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHRvIHN3aXRjaCB4cG9zIG9uIHRoZSBmbHkgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBVQ0hBUiBpbml0QW1wUmVzRkY7CiAgIEZJWFBfREJMIHRocmVzaG9sZEFtcFJlc0ZGX207CiAgIFNDSEFSIHRocmVzaG9sZEFtcFJlc0ZGX2U7CkBAIC0yNjcsNiArMjgyLDggQEAKICAgSU5UIGJpdFJhdGU7CiAgIGludCBpbnN0YW5jZVRhZzsKICAgVUNIQVIgZlBhcmFtZXRyaWNTdGVyZW87CisgIFVDSEFSIGZEdWFsTW9ubzsgLyoqPCBUaGlzIGZsYWdzIGFsbG93cyB0byBkaXNhYmxlIGNvdXBsaW5nIGluIHNiciBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgcGFpciBlbGVtZW50ICovCiAgIFVDSEFSIG5DaGFubmVsc0luRWw7CiAgIFVDSEFSIENoYW5uZWxJbmRleFsyXTsKIH0gU0JSX0VMRU1FTlRfSU5GTzsKQEAgLTI3OCwxOSArMjk1LDE1IEBACiB0eXBlZGVmIHN0cnVjdCBTQlJfRU5DT0RFUiAqSEFORExFX1NCUl9FTkNPREVSOwogCiAvKioKLSAqIFxicmllZiAgR2V0IHRoZSBtYXggcmVxdWlyZWQgaW5wdXQgYnVmZmVyIHNpemUgaW5jbHVkaW5nIGRlbGF5IGJhbGFuY2luZyBzcGFjZQotICogICAgICAgICBmb3IgTiBhdWRpbyBjaGFubmVscy4KKyAqIFxicmllZiAgR2V0IHRoZSBtYXggcmVxdWlyZWQgaW5wdXQgYnVmZmVyIHNpemUgaW5jbHVkaW5nIGRlbGF5IGJhbGFuY2luZworICogc3BhY2UgZm9yIE4gYXVkaW8gY2hhbm5lbHMuCiAgKiBccGFyYW0gbm9DaGFubmVscyAgTnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLgogICogXHJldHVybiAgICAgICAgICAgIE1heCByZXF1aXJlZCBpbnB1dCBidWZmZXIgc2l6ZSBpbiBieXRlcy4KICAqLwogSU5UIHNickVuY29kZXJfR2V0SW5CdWZmZXJTaXplKGludCBub0NoYW5uZWxzKTsKIAotSU5UIHNickVuY29kZXJfT3BlbigKLSAgICAgICAgSEFORExFX1NCUl9FTkNPREVSICAqcGhTYnJFbmNvZGVyLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBuRWxlbWVudHMsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgc3VwcG9ydFBTCi0gICAgICAgICk7CitJTlQgc2JyRW5jb2Rlcl9PcGVuKEhBTkRMRV9TQlJfRU5DT0RFUiAqcGhTYnJFbmNvZGVyLCBJTlQgbkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICBJTlQgbkNoYW5uZWxzLCBJTlQgc3VwcG9ydFBTKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgICAgIEdldCBjbG9zZXN0IHdvcmtpbmcgYml0cmF0ZSB0byBzcGVjaWZpZWQgZGVzaXJlZApAQCAtMzAxLDggKzMxNCw4IEBACiAgKiBccGFyYW0gYW90ICAgICAgICAgICAgIFRoZSBjdXJyZW50IEF1ZGlvIE9iamVjdCBUeXBlCiAgKiBccmV0dXJuICAgICAgICAgICAgICAgIENsb3Nlc3Qgd29ya2luZyBiaXQgcmF0ZSB0byBiaXRSYXRlIHZhbHVlCiAgKi8KLVVJTlQgc2JyRW5jb2Rlcl9MaW1pdEJpdFJhdGUoVUlOVCBiaXRSYXRlLCBVSU5UIG51bUNoYW5uZWxzLCBVSU5UIGNvcmVTYW1wbGVSYXRlLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QpOwotCitVSU5UIHNickVuY29kZXJfTGltaXRCaXRSYXRlKFVJTlQgYml0UmF0ZSwgVUlOVCBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBjb3JlU2FtcGxlUmF0ZSwgQVVESU9fT0JKRUNUX1RZUEUgYW90KTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgICAgQ2hlY2sgd2hldGhlciBkb3duc2FtcGxlZCBTQlIgc2luZ2xlIHJhdGUgaXMgcG9zc2libGUKQEAgLTMxNiw1MCArMzI5LDUxIEBACiAvKioKICAqIFxicmllZiAgICAgICAgICAgICAgICAgIEluaXRpYWxpemUgU0JSIEVuY29kZXIgaW5zdGFuY2UuCiAgKiBccGFyYW0gcGhTYnJFbmNvZGVyICAgICBQb2ludGVyIHRvIGEgU0JSIEVuY29kZXIgaW5zdGFuY2UuCi0gKiBccGFyYW0gZWxJbmZvICAgICAgICAgICBTdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgdGhlIGVsZW1lbnQvY2hhbm5lbCBhcnJhbmdlbWVudC4KKyAqIFxwYXJhbSBlbEluZm8gICAgICAgICAgIFN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyB0aGUgZWxlbWVudC9jaGFubmVsCisgKiBhcnJhbmdlbWVudC4KICAqIFxwYXJhbSBub0VsZW1lbnRzICAgICAgIEFtb3VudCBvZiBlbGVtZW50cyBkZXNjcmliZWQgaW4gZWxJbmZvLgogICogXHBhcmFtIGlucHV0QnVmZmVyICAgICAgUG9pbnRlciB0byB0aGUgZW5jb2RlciBhdWRpbyBidWZmZXIKKyAqIFxwYXJhbSBpbnB1dEJ1ZmZlckJ1ZlNpemUgICAgQnVmZmVyIG9mZnNldCBvZiBvbmUgY2hhbm5lbCAoZnJhbWVTaXplICsgZGVsYXkpCiAgKiBccGFyYW0gYmFuZHdpZHRoICAgICAgICBSZXR1cm5zIHRoZSBjb3JlIGF1ZGlvIGVuY29kZXIgYmFuZHdpZHRoIChvdXRwdXQpCi0gKiBccGFyYW0gYnVmZmVyT2Zmc2V0ICAgICBSZXR1cm5zIHRoZSBvZmZzZXQgZm9yIHRoZSBhdWRpbyBpbnB1dCBkYXRhIGluIG9yZGVyIHRvIGRvIGRlbGF5IGJhbGFuY2luZy4KLSAqIFxwYXJhbSBudW1DaGFubmVscyAgICAgIElucHV0OiBFbmNvZGVyIGlucHV0IGNoYW5uZWxzLiBvdXRwdXQ6IGNvcmUgZW5jb2RlciBjaGFubmVscy4KLSAqIFxwYXJhbSBzYW1wbGVSYXRlICAgICAgIElucHV0OiBFbmNvZGVyIHNhbXBsZXJhdGUuIG91dHB1dCBjb3JlIGVuY29kZXIgc2FtcGxlcmF0ZS4KLSAqIFxwYXJhbSBkb3duU2FtcGxlRmFjdG9yIElucHV0OiBSZWxhdGlvbiBiZXR3ZWVuIFNCUiBhbmQgY29yZSBjb2RlciBzYW1wbGluZyByYXRlOwotICogXHBhcmFtIGZyYW1lTGVuZ3RoICAgICAgSW5wdXQ6IEVuY29kZXIgZnJhbWVMZW5ndGguIG91dHB1dCBjb3JlIGVuY29kZXIgZnJhbWVMZW5ndGguCi0gKiBccGFyYW0gYW90ICAgICAgICAgICAgICBJbnB1dDogRGVzaXJlZCBBT1QuIG91dHB1dCBBT1QgdG8gYmUgdXNlZCBhZnRlciBwYXJhbWV0ZXIgY2hlY2tpbmcuCi0gKiBccGFyYW0gZGVsYXkgICAgICAgICAgICBJbnB1dDogY29yZSBlbmNvZGVyIGRlbGF5LiBPdXRwdXQ6IHRvdGFsIGRlbGF5IGJlY2F1c2Ugb2YgU0JSLgorICogXHBhcmFtIGJ1ZmZlck9mZnNldCAgICAgUmV0dXJucyB0aGUgb2Zmc2V0IGZvciB0aGUgYXVkaW8gaW5wdXQgZGF0YSBpbiBvcmRlcgorICogdG8gZG8gZGVsYXkgYmFsYW5jaW5nLgorICogXHBhcmFtIG51bUNoYW5uZWxzICAgICAgSW5wdXQ6IEVuY29kZXIgaW5wdXQgY2hhbm5lbHMuIG91dHB1dDogY29yZSBlbmNvZGVyCisgKiBjaGFubmVscy4KKyAqIFxwYXJhbSBzYW1wbGVSYXRlICAgICAgIElucHV0OiBFbmNvZGVyIHNhbXBsZXJhdGUuIG91dHB1dCBjb3JlIGVuY29kZXIKKyAqIHNhbXBsZXJhdGUuCisgKiBccGFyYW0gZG93blNhbXBsZUZhY3RvciBJbnB1dDogUmVsYXRpb24gYmV0d2VlbiBTQlIgYW5kIGNvcmUgY29kZXIgc2FtcGxpbmcKKyAqIHJhdGU7CisgKiBccGFyYW0gZnJhbWVMZW5ndGggICAgICBJbnB1dDogRW5jb2RlciBmcmFtZUxlbmd0aC4gb3V0cHV0IGNvcmUgZW5jb2RlcgorICogZnJhbWVMZW5ndGguCisgKiBccGFyYW0gYW90ICAgICAgICAgICAgICBJbnB1dDogQU9ULi4KKyAqIFxwYXJhbSBkZWxheSAgICAgICAgICAgIElucHV0OiBjb3JlIGVuY29kZXIgZGVsYXkuIE91dHB1dDogdG90YWwgZGVsYXkKKyAqIGJlY2F1c2Ugb2YgU0JSLgogICogXHBhcmFtIHRyYW5zZm9ybUZhY3RvciAgVGhlIGNvcmUgZW5jb2RlciB0cmFuc2Zvcm0gZmFjdG9yIChibG9ja3N3aXRjaGluZykuCiAgKiBccGFyYW0gaGVhZGVyUGVyaW9kICAgICBSZXBldGl0aW9uIHJhdGUgb2YgdGhlIFNCUiBoZWFkZXI6CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKC0xKSBtZWFucyBpbnRlcm4gY29uZmlndXJhdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoMS0xMCkgY29ycmVzcG9uZHMgdG8gaGVhZGVyIHJlcGV0aXRpb24gcmF0ZSBpbiBmcmFtZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKDEtMTApIGNvcnJlc3BvbmRzIHRvIGhlYWRlciByZXBldGl0aW9uIHJhdGUgaW4KKyAqIGZyYW1lcy4KICAqIFxyZXR1cm4gICAgICAgICAgICAgICAgIDAgb24gc3VjY2VzcywgYW5kIG5vbi16ZXJvIGlmIGZhaWxlZC4KICAqLwotSU5UIHNickVuY29kZXJfSW5pdCgKLSAgICAgICAgSEFORExFX1NCUl9FTkNPREVSICAgaFNickVuY29kZXIsCi0gICAgICAgIFNCUl9FTEVNRU5UX0lORk8gICAgIGVsSW5mb1soOCldLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBub0VsZW1lbnRzLAotICAgICAgICBJTlRfUENNICAgICAgICAgICAgICppbnB1dEJ1ZmZlciwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqY29yZUJhbmR3aWR0aCwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqaW5wdXRCdWZmZXJPZmZzZXQsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgKm51bUNoYW5uZWxzLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlLAotICAgICAgICBVSU5UICAgICAgICAgICAgICAgICpkb3duU2FtcGxlRmFjdG9yLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpmcmFtZUxlbmd0aCwKLSAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgYW90LAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpkZWxheSwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtRmFjdG9yLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBoZWFkZXJQZXJpb2QsCi0gICAgICAgIFVMT05HICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnCi0gICAgICAgICk7CitJTlQgc2JyRW5jb2Rlcl9Jbml0KEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgU0JSX0VMRU1FTlRfSU5GTyBlbEluZm9bKDgpXSwgaW50IG5vRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKmlucHV0QnVmZmVyLCBVSU5UIGlucHV0QnVmZmVyQnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgSU5UICpjb3JlQmFuZHdpZHRoLCBJTlQgKmlucHV0QnVmZmVyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBJTlQgKm51bUNoYW5uZWxzLCBjb25zdCBVSU5UIHN5bnRheEZsYWdzLCBJTlQgKnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIFVJTlQgKmRvd25TYW1wbGVGYWN0b3IsIElOVCAqZnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwgaW50ICpkZWxheSwgaW50IHRyYW5zZm9ybUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGhlYWRlclBlcmlvZCwgVUxPTkcgc3RhdGVzSW5pdEZsYWcpOwogCiAvKioKLSAqIFxicmllZiAgICAgICAgICAgICBEbyBkZWxheSBsaW5lIGJ1ZmZlcnMgaG91c2VrZWVwaW5nLiBUbyBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBlbmNvZGVkIGF1ZGlvIGZyYW1lLgorICogXGJyaWVmICAgICAgICAgICAgIERvIGRlbGF5IGxpbmUgYnVmZmVycyBob3VzZWtlZXBpbmcuIFRvIGJlIGNhbGxlZCBhZnRlcgorICogZWFjaCBlbmNvZGVkIGF1ZGlvIGZyYW1lLgogICogXHBhcmFtIGhFbnZFbmMgICAgIFNCUiBFbmNvZGVyIGhhbmRsZS4KICAqIFxwYXJhbSB0aW1lQnVmZmVyICBQb2ludGVyIHRvIHRoZSBlbmNvZGVyIGF1ZGlvIGJ1ZmZlci4KKyAqIFxwYXJhbSB0aW1lQnVmZmVyQnVmU0l6ZSBidWZmZXIgc2l6ZSBmb3Igb25lIGNoYW5uZWwKICAqIFxyZXR1cm4gICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIGFuZCBub24temVybyBpZiBmYWlsZWQuCiAgKi8KLUlOVCBzYnJFbmNvZGVyX1VwZGF0ZUJ1ZmZlcnMoSEFORExFX1NCUl9FTkNPREVSIGhFbnZFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnRpbWVCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworSU5UIHNickVuY29kZXJfVXBkYXRlQnVmZmVycyhIQU5ETEVfU0JSX0VOQ09ERVIgaEVudkVuYywgSU5UX1BDTSAqdGltZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB0aW1lQnVmZmVyQnVmU0l6ZSk7CiAKIC8qKgogICogXGJyaWVmICAgICAgICAgICAgICAgQ2xvc2UgU0JSIGVuY29kZXIgaW5zdGFuY2UuCkBAIC0zNzEsMzEgKzM4NSw2MyBAQAogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgICBFbmNvZGUgU0JSIGRhdGEgb2Ygb25lIGNvbXBsZXRlIGF1ZGlvIGZyYW1lLgogICogXHBhcmFtIGhFbnZFbmNvZGVyICAgSGFuZGxlIG9mIFNCUiBlbmNvZGVyIGluc3RhbmNlLgotICogXHBhcmFtIHNhbXBsZXMgICAgICAgVGltZSBzYW1wbGVzLCBhbHdheXMgaW50ZXJsZWF2ZWQuCi0gKiBccGFyYW0gdGltZUluU3RyaWRlICBDaGFubmVsIHN0cmlkZSBmYWN0b3Igb2Ygc2FtcGxlcyBidWZmZXIuCisgKiBccGFyYW0gc2FtcGxlcyAgICAgICBUaW1lIHNhbXBsZXMsIG5vdCBpbnRlcmxlYXZlZC4KKyAqIFxwYXJhbSB0aW1lSW5TdHJpZGUgIENoYW5uZWwgb2Zmc2V0IG9mIHNhbXBsZXMgYnVmZmVyLgogICogXHBhcmFtIHNickRhdGFCaXRzICAgU2l6ZSBvZiBTQlIgcGF5bG9hZCBpbiBiaXRzLgogICogXHBhcmFtIHNickRhdGEgICAgICAgU0JSIHBheWxvYWQuCiAgKiBccmV0dXJuICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIGFuZCBub24temVybyBpZiBmYWlsZWQuCiAgKi8KLUlOVCBzYnJFbmNvZGVyX0VuY29kZUZyYW1lKEhBTkRMRV9TQlJfRU5DT0RFUiAgaEVudkVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAgKnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgc2JyRGF0YUJpdHNbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgc2JyRGF0YVsoOCldW01BWF9QQVlMT0FEX1NJWkVdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICk7CitJTlQgc2JyRW5jb2Rlcl9FbmNvZGVGcmFtZShIQU5ETEVfU0JSX0VOQ09ERVIgaEVudkVuY29kZXIsIElOVF9QQ00gKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsZXNCdWZTaXplLCBVSU5UIHNickRhdGFCaXRzWyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBzYnJEYXRhWyg4KV1bTUFYX1BBWUxPQURfU0laRV0pOwogCiAvKioKICAqIFxicmllZiAgICAgICAgICAgICAgIFdyaXRlIFNCUiBoZWFkZXJzIG9mIG9uZSBTQlIgZWxlbWVudC4KICAqIFxwYXJhbSBzYnJFbmNvZGVyICAgIEhhbmRsZSBvZiB0aGUgU0JSIGVuY29kZXIgaW5zdGFuY2UuCiAgKiBccGFyYW0gaEJzICAgICAgICAgICBIYW5kbGUgb2YgYml0IHN0cmVhbSBoYW5kbGUgdG8gd3JpdGUgU0JSIGhlYWRlciB0by4KICAqIFxwYXJhbSBlbGVtZW50X2luZGV4IEluZGV4IG9mIHRoZSBTQlIgZWxlbWVudCB3aGljaCBoZWFkZXIgc2hvdWxkIGJlIHdyaXR0ZW4uCi0gKiBccGFyYW0gZlNlbmRIZWFkZXJzICBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgU0JSIGVuY29kZXIgc2hvdWxkIHNlbmQgbW9yZSBoZWFkZXJzIGluIHRoZSBTQlIgcGF5bG9hZCBvciBub3QuCisgKiBccGFyYW0gZlNlbmRIZWFkZXJzICBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgU0JSIGVuY29kZXIgc2hvdWxkIHNlbmQgbW9yZQorICogaGVhZGVycyBpbiB0aGUgU0JSIHBheWxvYWQgb3Igbm90LgogICogXHJldHVybiAgICAgICAgICAgICAgdm9pZAogICovCi12b2lkIHNickVuY29kZXJfR2V0SGVhZGVyKEhBTkRMRV9TQlJfRU5DT0RFUiAgIHNickVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgZWxlbWVudF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZlNlbmRIZWFkZXJzKTsKK3ZvaWQgc2JyRW5jb2Rlcl9HZXRIZWFkZXIoSEFORExFX1NCUl9FTkNPREVSIHNickVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgSU5UIGVsZW1lbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmU2VuZEhlYWRlcnMpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICAgUmVxdWVzdCB0byB3cml0ZSBTQlIgaGVhZGVyLgorICogXHBhcmFtIGhTYnJFbmNvZGVyICBTQlIgZW5jb2RlciBoYW5kbGUuCisgKiBccmV0dXJuICAgICAgICAgICAgIDAgb24gc3VjY2VzcywgYW5kIG5vbi16ZXJvIGlmIGZhaWxlZC4KKyAqLworSU5UIHNickVuY29kZXJfU2VuZEhlYWRlcihIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICAgUmVxdWVzdCBpZiBsYXN0IHNiciBwYXlsb2FkIGNvbnRhaW5zIGFuIFNCUiBoZWFkZXIuCisgKiBccGFyYW0gaFNickVuY29kZXIgIFNCUiBlbmNvZGVyIGhhbmRsZS4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgMSBjb250YWlucyBzYnIgaGVhZGVyLCAwIHdpdGhvdXQgc2JyIGhlYWRlci4KKyAqLworSU5UIHNickVuY29kZXJfQ29udGFpbnNIZWFkZXIoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgIFNCUiBoZWFkZXIgZGVsYXkgaW4gZnJhbWVzLgorICogXHBhcmFtIGhTYnJFbmNvZGVyICBTQlIgZW5jb2RlciBoYW5kbGUuCisgKiBccmV0dXJuICAgICAgICAgICAgIERlbGF5IGluIGZyYW1lcywgLTEgb24gZmFpbHVyZS4KKyAqLworSU5UIHNickVuY29kZXJfR2V0SGVhZGVyRGVsYXkoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgIEJpdHN0cmVtIGRlbGF5IGluIFNCUiBmcmFtZXMuCisgKiBccGFyYW0gaFNickVuY29kZXIgIFNCUiBlbmNvZGVyIGhhbmRsZS4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgRGVsYXkgaW4gZnJhbWVzLCAtMSBvbiBmYWlsdXJlLgorICovCitJTlQgc2JyRW5jb2Rlcl9HZXRCc0RlbGF5KEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2Rlcik7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICBQcmVwYXJlIFNCUiBwYXlsb2FkIGZvciBTQVAuCisgKiBccGFyYW0gaFNickVuY29kZXIgIFNCUiBlbmNvZGVyIGhhbmRsZS4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBhbmQgbm9uLXplcm8gaWYgZmFpbGVkLgorICovCitJTlQgc2JyRW5jb2Rlcl9TQVBQcmVwYXJlKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2Rlcik7CiAKIC8qKgogICogXGJyaWVmICAgICAgICAgICAgICBTQlIgZW5jb2RlciBiaXRyYXRlIGVzdGltYXRpb24uCkBAIC00MDQsNyArNDUwLDYgQEAKICAqLwogSU5UIHNickVuY29kZXJfR2V0RXN0aW1hdGVCaXRyYXRlKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2Rlcik7CiAKLQogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgIERlbGF5IGJldHdlZW4gaW5wdXQgZGF0YSBhbmQgZG93bnNhbXBsZWQgb3V0cHV0IGRhdGEuCiAgKiBccGFyYW0gaFNickVuY29kZXIgIFNCUiBlbmNvZGVyIGhhbmRsZS4KQEAgLTQxMyw4ICs0NTgsMTYgQEAKIElOVCBzYnJFbmNvZGVyX0dldElucHV0RGF0YURlbGF5KEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2Rlcik7CiAKIC8qKgorICogXGJyaWVmICAgICAgICAgICAgICBEZWxheSBjYXVzZWQgYnkgdGhlIFNCUiBkZWNvZGVyLgorICogXHBhcmFtIGhTYnJFbmNvZGVyICBTQlIgZW5jb2RlciBoYW5kbGUuCisgKiBccmV0dXJuICAgICAgICAgICAgIERlbGF5LgorICovCitJTlQgc2JyRW5jb2Rlcl9HZXRTYnJEZWNEZWxheShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpOworCisvKioKICAqIFxicmllZiAgICAgICBHZXQgZGVjb2RlciBsaWJyYXJ5IHZlcnNpb24gaW5mby4KLSAqIFxwYXJhbSBpbmZvICBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3QsIHdoZXJlIGxpYnJhcnkgaW5mbyBpcyB3cml0dGVuIHRvLgorICogXHBhcmFtIGluZm8gIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdCwgd2hlcmUgbGlicmFyeSBpbmZvIGlzCisgKiB3cml0dGVuIHRvLgogICogXHJldHVybiAgICAgIDAgb24gc3VjZXNzLgogICovCiBJTlQgc2JyRW5jb2Rlcl9HZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKTsKQEAgLTQyNCw3ICs0NzcsNyBAQAogdm9pZCBzYnJQcmludFJPTSh2b2lkKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCi0gICAgICAgIH0KK30KICNlbmRpZgogCiAjZW5kaWYgLyogaWZuZGVmIF9fU0JSX01BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9iaXRfc2JyLmNwcCBiL2xpYlNCUmVuYy9zcmMvYml0X3Nici5jcHAKaW5kZXggOTIwMGUwMS4uNWE2NWU5OCAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9iaXRfc2JyLmNwcAorKysgYi9saWJTQlJlbmMvc3JjL2JpdF9zYnIuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwyMSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIFNCUiBiaXQgd3JpdGluZyByb3V0aW5lcyAgCisgIFxicmllZiAgU0JSIGJpdCB3cml0aW5nIHJvdXRpbmVzICRSZXZpc2lvbjogOTMzMDAgJAogKi8KIAotCiAjaW5jbHVkZSAiYml0X3Nici5oIgogCiAjaW5jbHVkZSAiY29kZV9lbnYuaCIKQEAgLTk1LDcxICsxMTMsNTQgQEAKIAogI2luY2x1ZGUgInBzX21haW4uaCIKIAotdHlwZWRlZiBlbnVtIHsKLSAgU0JSX0lEX1NDRSA9IDEsCi0gIFNCUl9JRF9DUEUKLX0gU0JSX0VMRU1FTlRfVFlQRTsKK3R5cGVkZWYgZW51bSB7IFNCUl9JRF9TQ0UgPSAxLCBTQlJfSURfQ1BFIH0gU0JSX0VMRU1FTlRfVFlQRTsKIAorc3RhdGljIElOVCBlbmNvZGVTYnJEYXRhKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSBjbW9uRGF0YSwgU0JSX0VMRU1FTlRfVFlQRSBzYnJFbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjb3VwbGluZywgVUlOVCBzYnJTeW50YXhGbGFncyk7CiAKLXN0YXRpYyBJTlQgZW5jb2RlU2JyRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSAgICAgICBzYnJFbnZEYXRhTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICBzYnJFbnZEYXRhUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgY21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX1RZUEUgICAgICAgICAgc2JyRWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICBjb3VwbGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7CitzdGF0aWMgSU5UIGVuY29kZVNickhlYWRlcihIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgY21vbkRhdGEpOwogCi1zdGF0aWMgSU5UIGVuY29kZVNickhlYWRlciAoSEFORExFX1NCUl9IRUFERVJfREFUQSAgICAgc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBICBzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgIGNtb25EYXRhKTsKK3N0YXRpYyBJTlQgZW5jb2RlU2JySGVhZGVyRGF0YShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSk7CiAKK3N0YXRpYyBJTlQgZW5jb2RlU2JyU2luZ2xlQ2hhbm5lbEVsZW1lbnQoCisgICAgSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywgY29uc3QgVUlOVCBzYnJTeW50YXhGbGFncyk7CiAKLXN0YXRpYyBJTlQgZW5jb2RlU2JySGVhZGVyRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRTdHJlYW0pOworc3RhdGljIElOVCBlbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQoCisgICAgSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhTGVmdCwgSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhUmlnaHQsCisgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgIGNvbnN0IElOVCBjb3VwbGluZywgY29uc3QgVUlOVCBzYnJTeW50YXhGbGFncyk7CiAKLXN0YXRpYyBJTlQgZW5jb2RlU2JyU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICBzYnJFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGhCaXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVSU5UICBzYnJTeW50YXhGbGFncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK3N0YXRpYyBJTlQgZW5jb2RlU2JyR3JpZChIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSk7CiAKK3N0YXRpYyBpbnQgZW5jb2RlTG93RGVsYXlTYnJHcmlkKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdHJhbnNtaXRGcmVxcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgc2JyU3ludGF4RmxhZ3MpOwogCitzdGF0aWMgSU5UIGVuY29kZVNickR0ZGYoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pOwogCi1zdGF0aWMgSU5UIGVuY29kZVNickNoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9FTlZfREFUQSAgICAgIHNickVudkRhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICBzYnJFbnZEYXRhUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICBjb3VwbGluZyk7CitzdGF0aWMgSU5UIHdyaXRlTm9pc2VMZXZlbERhdGEoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIElOVCBjb3VwbGluZyk7CiAKK3N0YXRpYyBJTlQgd3JpdGVFbnZlbG9wZURhdGEoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBJTlQgY291cGxpbmcpOwogCi1zdGF0aWMgSU5UIGVuY29kZVNickdyaWQgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICBzYnJFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbSk7CitzdGF0aWMgSU5UIHdyaXRlU3ludGhldGljQ29kaW5nRGF0YShIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKTsKIAotc3RhdGljIGludCBlbmNvZGVMb3dEZWxheVNickdyaWQgKCBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc21pdEZyZXFzKTsKK3N0YXRpYyBJTlQgZW5jb2RlRXh0ZW5kZWREYXRhKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pOwogCi1zdGF0aWMgSU5UIGVuY29kZVNickR0ZGYgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICBzYnJFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbSk7Ci0KLXN0YXRpYyBJTlQgd3JpdGVOb2lzZUxldmVsRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgY291cGxpbmcpOwotCi1zdGF0aWMgSU5UIHdyaXRlRW52ZWxvcGVEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgIGNvdXBsaW5nKTsKLQotc3RhdGljIElOVCB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSk7Ci0KLQotc3RhdGljIElOVCBlbmNvZGVFeHRlbmRlZERhdGEgKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgaEJpdFN0cmVhbSk7Ci0KLQotCi1zdGF0aWMgSU5UIGdldFNickV4dGVuZGVkRGF0YVNpemUgKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8pOworc3RhdGljIElOVCBnZXRTYnJFeHRlbmRlZERhdGFTaXplKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC0xNzAsNDAgKzE3MSwyNiBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19Xcml0ZUVudlNpbmdsZUNoYW5uZWxFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICAgICAgICAgc2JyRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgICAgICAgIGNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorSU5UIEZES3NickVuY19Xcml0ZUVudlNpbmdsZUNoYW5uZWxFbGVtZW50KAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKKyAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhLCBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCisgICAgSEFORExFX0NPTU1PTl9EQVRBIGNtb25EYXRhLCBVSU5UIHNiclN5bnRheEZsYWdzKQogCiB7CiAgIElOVCBwYXlsb2FkQml0cyA9IDA7CiAKLSAgY21vbkRhdGEtPnNickhkckJpdHMgID0gMDsKKyAgY21vbkRhdGEtPnNickhkckJpdHMgPSAwOwogICBjbW9uRGF0YS0+c2JyRGF0YUJpdHMgPSAwOwogCiAgIC8qIHdyaXRlIHB1cmUgc2JyIGRhdGEgKi8KICAgaWYgKHNickVudkRhdGEgIT0gTlVMTCkgewotCiAgICAgLyogd3JpdGUgaGVhZGVyICovCi0gICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JySGVhZGVyIChzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtb25EYXRhKTsKLQorICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickhlYWRlcihzYnJIZWFkZXJEYXRhLCBzYnJCaXRzdHJlYW1EYXRhLCBjbW9uRGF0YSk7CiAKICAgICAvKiB3cml0ZSBkYXRhICovCi0gICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRGF0YSAoc2JyRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9JRF9TQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7Ci0KKyAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEYXRhKHNickVudkRhdGEsIE5VTEwsIGhQYXJhbWV0cmljU3RlcmVvLCBjbW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9JRF9TQ0UsIDAsIHNiclN5bnRheEZsYWdzKTsKICAgfQogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CkBAIC0yMTcsODMgKzIwNCw2NSBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19Xcml0ZUVudkNoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9IRUFERVJfREFUQSAgICAgc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgIHNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgIHNickVudkRhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBICAgICAgICBzYnJFbnZEYXRhUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgIGNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncykKK0lOVCBGREtzYnJFbmNfV3JpdGVFbnZDaGFubmVsUGFpckVsZW1lbnQoCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEsCisgICAgSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhTGVmdCwgSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhUmlnaHQsCisgICAgSEFORExFX0NPTU1PTl9EQVRBIGNtb25EYXRhLCBVSU5UIHNiclN5bnRheEZsYWdzKQogCiB7CiAgIElOVCBwYXlsb2FkQml0cyA9IDA7Ci0gIGNtb25EYXRhLT5zYnJIZHJCaXRzICA9IDA7CisgIGNtb25EYXRhLT5zYnJIZHJCaXRzID0gMDsKICAgY21vbkRhdGEtPnNickRhdGFCaXRzID0gMDsKIAogICAvKiB3cml0ZSBwdXJlIHNiciBkYXRhICovCiAgIGlmICgoc2JyRW52RGF0YUxlZnQgIT0gTlVMTCkgJiYgKHNickVudkRhdGFSaWdodCAhPSBOVUxMKSkgewotCiAgICAgLyogd3JpdGUgaGVhZGVyICovCi0gICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JySGVhZGVyIChzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtb25EYXRhKTsKKyAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJIZWFkZXIoc2JySGVhZGVyRGF0YSwgc2JyQml0c3RyZWFtRGF0YSwgY21vbkRhdGEpOwogCiAgICAgLyogd3JpdGUgZGF0YSAqLwotICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickRhdGEgKHNickVudkRhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGFSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfSURfQ1BFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKLQorICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickRhdGEoc2JyRW52RGF0YUxlZnQsIHNickVudkRhdGFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLCBjbW9uRGF0YSwgU0JSX0lEX0NQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLCBzYnJTeW50YXhGbGFncyk7CiAgIH0KICAgcmV0dXJuIHBheWxvYWRCaXRzOwogfQogCi1JTlQKLUZES3NickVuY19Db3VudFNickNoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9IRUFERVJfREFUQSAgICAgc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgIHNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgIHNickVudkRhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBICAgICAgICBzYnJFbnZEYXRhUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgIGNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncykKLXsKK0lOVCBGREtzYnJFbmNfQ291bnRTYnJDaGFubmVsUGFpckVsZW1lbnQoCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEsCisgICAgSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhTGVmdCwgSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhUmlnaHQsCisgICAgSEFORExFX0NPTU1PTl9EQVRBIGNtb25EYXRhLCBVSU5UIHNiclN5bnRheEZsYWdzKSB7CiAgIElOVCBwYXlsb2FkQml0czsKICAgSU5UIGJpdFBvcyA9IEZES2dldFZhbGlkQml0cygmY21vbkRhdGEtPnNickJpdGJ1Zik7CiAKLSAgcGF5bG9hZEJpdHMgPSBGREtzYnJFbmNfV3JpdGVFbnZDaGFubmVsUGFpckVsZW1lbnQoc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGFSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7CisgIHBheWxvYWRCaXRzID0gRkRLc2JyRW5jX1dyaXRlRW52Q2hhbm5lbFBhaXJFbGVtZW50KAorICAgICAgc2JySGVhZGVyRGF0YSwgaFBhcmFtZXRyaWNTdGVyZW8sIHNickJpdHN0cmVhbURhdGEsIHNickVudkRhdGFMZWZ0LAorICAgICAgc2JyRW52RGF0YVJpZ2h0LCBjbW9uRGF0YSwgc2JyU3ludGF4RmxhZ3MpOwogCi0gIEZES3B1c2hCYWNrKCZjbW9uRGF0YS0+c2JyQml0YnVmLCAoRkRLZ2V0VmFsaWRCaXRzKCZjbW9uRGF0YS0+c2JyQml0YnVmKSAtIGJpdFBvcykgKTsKKyAgRkRLcHVzaEJhY2soJmNtb25EYXRhLT5zYnJCaXRidWYsCisgICAgICAgICAgICAgIChGREtnZXRWYWxpZEJpdHMoJmNtb25EYXRhLT5zYnJCaXRidWYpIC0gYml0UG9zKSk7CiAKICAgcmV0dXJuIHBheWxvYWRCaXRzOwogfQogCit2b2lkIHNickVuY29kZXJfR2V0SGVhZGVyKFNCUl9FTkNPREVSICpzYnJFbmNvZGVyLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBlbGVtZW50X2luZGV4LCBpbnQgZlNlbmRIZWFkZXJzKSB7CisgIGVuY29kZVNickhlYWRlckRhdGEoJnNickVuY29kZXItPnNickVsZW1lbnRbZWxlbWVudF9pbmRleF0tPnNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgaEJzKTsKIAotdm9pZCBzYnJFbmNvZGVyX0dldEhlYWRlcihTQlJfRU5DT0RFUiAgICpzYnJFbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgIGVsZW1lbnRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGZTZW5kSGVhZGVycykKLXsKLSAgZW5jb2RlU2JySGVhZGVyRGF0YSAoJnNickVuY29kZXItPnNickVsZW1lbnRbZWxlbWVudF9pbmRleF0tPnNickhlYWRlckRhdGEsIGhCcyk7Ci0gICAgCiAgIGlmIChmU2VuZEhlYWRlcnMgPT0gMCkgewogICAgIC8qIFByZXZlbnQgaGVhZGVyIGJlaW5nIGVtYmVkZGVkIGludG8gdGhlIFNCUiBwYXlsb2FkLiAqLwotICAgIHNickVuY29kZXItPnNickVsZW1lbnRbZWxlbWVudF9pbmRleF0tPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSA9IC0xOworICAgIHNickVuY29kZXItPnNickVsZW1lbnRbZWxlbWVudF9pbmRleF0tPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSA9CisgICAgICAgIC0xOwogICAgIHNickVuY29kZXItPnNickVsZW1lbnRbZWxlbWVudF9pbmRleF0tPnNickJpdHN0cmVhbURhdGEuSGVhZGVyQWN0aXZlID0gMDsKLSAgICBzYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsZW1lbnRfaW5kZXhdLT5zYnJCaXRzdHJlYW1EYXRhLkNvdW50U2VuZEhlYWRlckRhdGEgPSAtMTsKKyAgICBzYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsZW1lbnRfaW5kZXhdCisgICAgICAgIC0+c2JyQml0c3RyZWFtRGF0YS5Db3VudFNlbmRIZWFkZXJEYXRhID0gLTE7CiAgIH0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlU2JySGVhZGVyCkBAIC0zMDMsMjAgKzI3MiwxNiBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1lbmNvZGVTYnJIZWFkZXIgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgICAgIHNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgIHNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgIGNtb25EYXRhKQoteworc3RhdGljIElOVCBlbmNvZGVTYnJIZWFkZXIoSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBIGNtb25EYXRhKSB7CiAgIElOVCBwYXlsb2FkQml0cyA9IDA7CiAKICAgaWYgKHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSkgewotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoJmNtb25EYXRhLT5zYnJCaXRidWYsIDEsIDEpOwotICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickhlYWRlckRhdGEgKHNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtb25EYXRhLT5zYnJCaXRidWYpOwotICB9Ci0gIGVsc2UgewotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoJmNtb25EYXRhLT5zYnJCaXRidWYsIDAsIDEpOworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygmY21vbkRhdGEtPnNickJpdGJ1ZiwgMSwgMSk7CisgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JySGVhZGVyRGF0YShzYnJIZWFkZXJEYXRhLCAmY21vbkRhdGEtPnNickJpdGJ1Zik7CisgIH0gZWxzZSB7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKCZjbW9uRGF0YS0+c2JyQml0YnVmLCAwLCAxKTsKICAgfQogCiAgIGNtb25EYXRhLT5zYnJIZHJCaXRzID0gcGF5bG9hZEJpdHM7CkBAIC0zMjQsOCArMjg5LDYgQEAKICAgcmV0dXJuIHBheWxvYWRCaXRzOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNickhlYWRlckRhdGEKQEAgLTMzNiw1NyArMjk5LDU0IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWVuY29kZVNickhlYWRlckRhdGEgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCitzdGF0aWMgSU5UIGVuY29kZVNickhlYWRlckRhdGEoSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCiAKIHsKICAgSU5UIHBheWxvYWRCaXRzID0gMDsKICAgaWYgKHNickhlYWRlckRhdGEgIT0gTlVMTCkgewotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfQU1QX1JFU19CSVRTKTsKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9zdGFydF9mcmVxdWVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfU1RBUlRfRlJFUV9CSVRTKTsKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9zdG9wX2ZyZXF1ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9TVE9QX0ZSRVFfQklUUyk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfeG92ZXJfYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9YT1ZFUl9CQU5EX0JJVFMpOworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfYW1wX3JlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0FNUF9SRVNfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9zdGFydF9mcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9TVEFSVF9GUkVRX0JJVFMpOworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfc3RvcF9mcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9TVE9QX0ZSRVFfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl94b3Zlcl9iYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfWE9WRVJfQkFORF9CSVRTKTsKIAotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9SRVNFUlZFRF9CSVRTKTsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgU0lfU0JSX1JFU0VSVkVEX0JJVFMpOwogCi0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5oZWFkZXJfZXh0cmFfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9IRUFERVJfRVhUUkFfMV9CSVRTKTsKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0hFQURFUl9FWFRSQV8yX0JJVFMpOwotCisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfSEVBREVSX0VYVFJBXzFfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfSEVBREVSX0VYVFJBXzJfQklUUyk7CiAKICAgICBpZiAoc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzEpIHsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+ZnJlcVNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfRlJFUV9TQ0FMRV9CSVRTKTsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+YWx0ZXJTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0FMVEVSX1NDQUxFX0JJVFMpOwotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfbm9pc2VfYmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9OT0lTRV9CQU5EU19CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5mcmVxU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0ZSRVFfU0NBTEVfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+YWx0ZXJTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfQUxURVJfU0NBTEVfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX25vaXNlX2JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9OT0lTRV9CQU5EU19CSVRTKTsKICAgICB9IC8qIHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8xICovCiAKICAgICBpZiAoc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzIpIHsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2xpbWl0ZXJfYmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9MSU1JVEVSX0JBTkRTX0JJVFMpOwotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfbGltaXRlcl9nYWlucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0xJTUlURVJfR0FJTlNfQklUUyk7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9pbnRlcnBvbF9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfSU5URVJQT0xfRlJFUV9CSVRTKTsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX3Ntb290aGluZ19sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9TTU9PVEhJTkdfTEVOR1RIX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9saW1pdGVyX2JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9MSU1JVEVSX0JBTkRTX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9saW1pdGVyX2dhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9MSU1JVEVSX0dBSU5TX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9pbnRlcnBvbF9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9JTlRFUlBPTF9GUkVRX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0KKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX3Ntb290aGluZ19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9TTU9PVEhJTkdfTEVOR1RIX0JJVFMpOwogCiAgICAgfSAvKiBzYnJIZWFkZXJEYXRhLT5oZWFkZXJfZXh0cmFfMiAqLwotICB9IC8qIHNickhlYWRlckRhdGEgIT0gTlVMTCAqLworICB9ICAgLyogc2JySGVhZGVyRGF0YSAhPSBOVUxMICovCiAKICAgcmV0dXJuIHBheWxvYWRCaXRzOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJEYXRhCkBAIC0zOTYsMjcgKzM1NiwyNyBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1lbmNvZGVTYnJEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YUxlZnQsCi0gICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YVJpZ2h0LAotICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICAgY21vbkRhdGEsCi0gICAgICAgICAgICAgICBTQlJfRUxFTUVOVF9UWVBFICAgICAgc2JyRWxlbSwKLSAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICBjb3VwbGluZywKLSAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncykKLXsKK3N0YXRpYyBJTlQgZW5jb2RlU2JyRGF0YShIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgY21vbkRhdGEsIFNCUl9FTEVNRU5UX1RZUEUgc2JyRWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY291cGxpbmcsIFVJTlQgc2JyU3ludGF4RmxhZ3MpIHsKICAgSU5UIHBheWxvYWRCaXRzID0gMDsKIAogICBzd2l0Y2ggKHNickVsZW0pIHsKLSAgY2FzZSBTQlJfSURfU0NFOgotICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNiclNpbmdsZUNoYW5uZWxFbGVtZW50IChzYnJFbnZEYXRhTGVmdCwgJmNtb25EYXRhLT5zYnJCaXRidWYsIGhQYXJhbWV0cmljU3RlcmVvLCBzYnJTeW50YXhGbGFncyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX0lEX0NQRToKLSAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQgKHNickVudkRhdGFMZWZ0LCBzYnJFbnZEYXRhUmlnaHQsIGhQYXJhbWV0cmljU3RlcmVvLCAmY21vbkRhdGEtPnNickJpdGJ1ZiwgY291cGxpbmcpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIC8qIHdlIG5ldmVyIHNob3VsZCBhcHBseSBTQlIgdG8gYW55IG90aGVyIGVsZW1lbnQgdHlwZSAqLwotICAgIEZES19BU1NFUlQgKDApOworICAgIGNhc2UgU0JSX0lEX1NDRToKKyAgICAgIHBheWxvYWRCaXRzICs9CisgICAgICAgICAgZW5jb2RlU2JyU2luZ2xlQ2hhbm5lbEVsZW1lbnQoc2JyRW52RGF0YUxlZnQsICZjbW9uRGF0YS0+c2JyQml0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLCBzYnJTeW50YXhGbGFncyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCUl9JRF9DUEU6CisgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQoCisgICAgICAgICAgc2JyRW52RGF0YUxlZnQsIHNickVudkRhdGFSaWdodCwgaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgJmNtb25EYXRhLT5zYnJCaXRidWYsIGNvdXBsaW5nLCBzYnJTeW50YXhGbGFncyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogd2UgbmV2ZXIgc2hvdWxkIGFwcGx5IFNCUiB0byBhbnkgb3RoZXIgZWxlbWVudCB0eXBlICovCisgICAgICBGREtfQVNTRVJUKDApOwogICB9CiAKICAgY21vbkRhdGEtPnNickRhdGFCaXRzID0gcGF5bG9hZEJpdHM7CkBAIC00MjQsMTMgKzM4NCwxMCBAQAogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CiAKLSNkZWZpbmUgTU9ERV9GUkVRX1RBTlMgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTU9ERV9OT19GUkVRX1RSQU4gICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTERfVFJBTlNNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgIE1PREVfRlJFUV9UQU5TCi1zdGF0aWMgaW50IGVuY29kZUZyZXFzIChpbnQgbW9kZSkgewotICAgIHJldHVybiAoKG1vZGUgJiBNT0RFX0ZSRVFfVEFOUykgPyAxIDogMCk7Ci19Ci0KKyNkZWZpbmUgTU9ERV9GUkVRX1RBTlMgMQorI2RlZmluZSBNT0RFX05PX0ZSRVFfVFJBTiAwCisjZGVmaW5lIExEX1RSQU5TTUlTU0lPTiBNT0RFX0ZSRVFfVEFOUworc3RhdGljIGludCBlbmNvZGVGcmVxcyhpbnQgbW9kZSkgeyByZXR1cm4gKChtb2RlICYgTU9ERV9GUkVRX1RBTlMpID8gMSA6IDApOyB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC00NDEsNTEgKzM5OCw0NyBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1lbmNvZGVTYnJTaW5nbGVDaGFubmVsRWxlbWVudCAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVJTlQgIHNiclN5bnRheEZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworc3RhdGljIElOVCBlbmNvZGVTYnJTaW5nbGVDaGFubmVsRWxlbWVudCgKKyAgICBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLCBjb25zdCBVSU5UIHNiclN5bnRheEZsYWdzKSB7CiAgIElOVCBpLCBwYXlsb2FkQml0cyA9IDA7CiAKLSAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCAwLCBTSV9TQlJfREFUQV9FWFRSQV9CSVRTKTsgLyogbm8gcmVzZXJ2ZWQgYml0cyAqLworICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9EQVRBX0VYVFJBX0JJVFMpOyAvKiBubyByZXNlcnZlZCBiaXRzICovCiAKICAgaWYgKHNickVudkRhdGEtPmxkR3JpZCkgewotICAgICAgaWYgKCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzICE9IEZJWEZJWG9ubHkgKSB7Ci0gICAgICAgIC8qIGVuY29kZSBub3JtYWwgU2JyR3JpZCAqLwotICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIHVzZSBGSVhGSVhvbmx5IGZyYW1lIEdyaWQgKi8KLSAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlTG93RGVsYXlTYnJHcmlkICggc2JyRW52RGF0YSwgaEJpdFN0cmVhbSwgZW5jb2RlRnJlcXMoTERfVFJBTlNNSVNTSU9OKSk7Ci0gICAgICB9Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9TQ0FMQUJMRSkgewotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCAxLCBTSV9TQlJfQ09VUExJTkdfQklUUyk7CisgICAgaWYgKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgIT0gRklYRklYb25seSkgeworICAgICAgLyogZW5jb2RlIG5vcm1hbCBTYnJHcmlkICovCisgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkKHNickVudkRhdGEsIGhCaXRTdHJlYW0pOworICAgIH0gZWxzZSB7CisgICAgICAvKiB1c2UgRklYRklYb25seSBmcmFtZSBHcmlkICovCisgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVMb3dEZWxheVNickdyaWQoCisgICAgICAgICAgc2JyRW52RGF0YSwgaEJpdFN0cmVhbSwgZW5jb2RlRnJlcXMoTERfVFJBTlNNSVNTSU9OKSwgc2JyU3ludGF4RmxhZ3MpOwogICAgIH0KLSAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX1NDQUxBQkxFKSB7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMSwgU0lfU0JSX0NPVVBMSU5HX0JJVFMpOworICAgIH0KKyAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkKHNickVudkRhdGEsIGhCaXRTdHJlYW0pOwogICB9CiAKLSAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZiAoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSk7CisgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickR0ZGYoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSk7CiAKICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzOyBpKyspIHsKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPnNicl9pbnZmX21vZGVfdmVjW2ldLCBTSV9TQlJfSU5WRl9NT0RFX0JJVFMpOworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKICAgfQogCi0gIHBheWxvYWRCaXRzICs9IHdyaXRlRW52ZWxvcGVEYXRhIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtLCAwKTsKLSAgcGF5bG9hZEJpdHMgKz0gd3JpdGVOb2lzZUxldmVsRGF0YSAoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSwgMCk7CisgIHBheWxvYWRCaXRzICs9IHdyaXRlRW52ZWxvcGVEYXRhKHNickVudkRhdGEsIGhCaXRTdHJlYW0sIDApOworICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhKHNickVudkRhdGEsIGhCaXRTdHJlYW0sIDApOwogCi0gIHBheWxvYWRCaXRzICs9IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YSAoc2JyRW52RGF0YSxoQml0U3RyZWFtKTsKKyAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhKHNickVudkRhdGEsIGhCaXRTdHJlYW0pOwogCiAgIHBheWxvYWRCaXRzICs9IGVuY29kZUV4dGVuZGVkRGF0YShoUGFyYW1ldHJpY1N0ZXJlbywgaEJpdFN0cmVhbSk7CiAKICAgcmV0dXJuIHBheWxvYWRCaXRzOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQKQEAgLTQ5NSw5NyArNDQ4LDEwNCBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1lbmNvZGVTYnJDaGFubmVsUGFpckVsZW1lbnQgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICBzYnJFbnZEYXRhTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGFSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgY291cGxpbmcpCi17CitzdGF0aWMgSU5UIGVuY29kZVNickNoYW5uZWxQYWlyRWxlbWVudCgKKyAgICBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGFMZWZ0LCBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGFSaWdodCwKKyAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgY29uc3QgSU5UIGNvdXBsaW5nLCBjb25zdCBVSU5UIHNiclN5bnRheEZsYWdzKSB7CiAgIElOVCBwYXlsb2FkQml0cyA9IDA7CiAgIElOVCBpID0gMDsKIAotICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIDAsIFNJX1NCUl9EQVRBX0VYVFJBX0JJVFMpOyAvKiBubyByZXNlcnZlZCBiaXRzICovCisgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0RBVEFfRVhUUkFfQklUUyk7IC8qIG5vIHJlc2VydmVkIGJpdHMgKi8KIAotICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIGNvdXBsaW5nLCBTSV9TQlJfQ09VUExJTkdfQklUUyk7CisgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBjb3VwbGluZywgU0lfU0JSX0NPVVBMSU5HX0JJVFMpOwogCiAgIGlmIChjb3VwbGluZykgewogICAgIGlmIChzYnJFbnZEYXRhTGVmdC0+bGRHcmlkKSB7Ci0gICAgICAgICAgaWYgKCBzYnJFbnZEYXRhTGVmdC0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcyAhPSBGSVhGSVhvbmx5ICkgewotICAgICAgICAgICAgLyogbm9ybWFsIFNickdyaWQgKi8KLSAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtKTsKKyAgICAgIGlmIChzYnJFbnZEYXRhTGVmdC0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcyAhPSBGSVhGSVhvbmx5KSB7CisgICAgICAgIC8qIG5vcm1hbCBTYnJHcmlkICovCisgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0pOwogCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgLyogRklYRklYb25seSBmcmFtZSBHcmlkICovCi0gICAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtLCBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pKTsKLSAgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBGSVhGSVhvbmx5IGZyYW1lIEdyaWQgKi8KKyAgICAgICAgcGF5bG9hZEJpdHMgKz0KKyAgICAgICAgICAgIGVuY29kZUxvd0RlbGF5U2JyR3JpZChzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pLCBzYnJTeW50YXhGbGFncyk7CisgICAgICB9CiAgICAgfSBlbHNlCi0gICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtKTsKKyAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0pOwogCi0gICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZiAoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0pOwotICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickR0ZGYgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSk7CisgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZihzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSk7CisgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZihzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0pOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGFMZWZ0LT5ub09mbm9pc2ViYW5kczsgaSsrKSB7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGFMZWZ0LT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGFMZWZ0LT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKICAgICB9CiAKLSAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YSAgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSwxKTsKLSAgICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0sMSk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVFbnZlbG9wZURhdGEgIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0sMSk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVOb2lzZUxldmVsRGF0YSAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLDEpOworICAgIHBheWxvYWRCaXRzICs9IHdyaXRlRW52ZWxvcGVEYXRhKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtLCAxKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtLCAxKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YShzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0sIDEpOworICAgIHBheWxvYWRCaXRzICs9IHdyaXRlTm9pc2VMZXZlbERhdGEoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLCAxKTsKIAotICAgIHBheWxvYWRCaXRzICs9IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YSAoc2JyRW52RGF0YUxlZnQsaEJpdFN0cmVhbSk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChzYnJFbnZEYXRhUmlnaHQsaEJpdFN0cmVhbSk7CisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtKTsKIAogICB9IGVsc2UgeyAvKiBubyBjb3VwbGluZyAqLwogICAgIEZES19BU1NFUlQoc2JyRW52RGF0YUxlZnQtPmxkR3JpZCA9PSBzYnJFbnZEYXRhUmlnaHQtPmxkR3JpZCk7CiAKICAgICBpZiAoc2JyRW52RGF0YUxlZnQtPmxkR3JpZCB8fCBzYnJFbnZEYXRhUmlnaHQtPmxkR3JpZCkgewotICAgIC8qIHNickVudkRhdGFMZWZ0IChsZWZ0IGNoYW5uZWwpICovCi0gICAgICBpZiAoIHNickVudkRhdGFMZWZ0LT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzICE9IEZJWEZJWG9ubHkpIHsKKyAgICAgIC8qIHNickVudkRhdGFMZWZ0IChsZWZ0IGNoYW5uZWwpICovCisgICAgICBpZiAoc2JyRW52RGF0YUxlZnQtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgIT0gRklYRklYb25seSkgewogICAgICAgICAvKiBubyBGSVhGSVhvbmx5IEZyYW1lIHNvIHdlIGRvbnQgbmVlZCBlbmNvZGVMb3dEZWxheVNickdyaWQgKi8KICAgICAgICAgLyogbm9ybWFsIFNickdyaWQgKi8KLSAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YUxlZnQsICBoQml0U3RyZWFtKTsKKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZChzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSk7CiAKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIEZJWEZJWG9ubHkgZnJhbWUgR3JpZCAqLwotICAgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtLCBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pKTsKKyAgICAgICAgcGF5bG9hZEJpdHMgKz0KKyAgICAgICAgICAgIGVuY29kZUxvd0RlbGF5U2JyR3JpZChzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pLCBzYnJTeW50YXhGbGFncyk7CiAgICAgICB9CiAKICAgICAgIC8qIHNickVudkRhdGFSaWdodCAocmlnaHQgY2hhbm5lbCkgKi8KLSAgICAgIGlmICggc2JyRW52RGF0YVJpZ2h0LT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzICE9IEZJWEZJWG9ubHkpIHsKKyAgICAgIGlmIChzYnJFbnZEYXRhUmlnaHQtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgIT0gRklYRklYb25seSkgewogICAgICAgICAvKiBubyBGSVhGSVhvbmx5IEZyYW1lIHNvIHdlIGRvbnQgbmVlZCBlbmNvZGVMb3dEZWxheVNickdyaWQgKi8KICAgICAgICAgLyogbm9ybWFsIFNickdyaWQgKi8KLSAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtKTsKKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0pOwogCiAgICAgICB9IGVsc2UgewogICAgICAgICAvKiBGSVhGSVhvbmx5IGZyYW1lIEdyaWQgKi8KLSAgICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVMb3dEZWxheVNickdyaWQgKCBzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0sIGVuY29kZUZyZXFzKExEX1RSQU5TTUlTU0lPTikpOworICAgICAgICBwYXlsb2FkQml0cyArPQorICAgICAgICAgICAgZW5jb2RlTG93RGVsYXlTYnJHcmlkKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pLCBzYnJTeW50YXhGbGFncyk7CiAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0pOwotICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0pOworICAgIH0gZWxzZSB7CisgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtKTsKKyAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtKTsKICAgICB9Ci0gICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZiAoc2JyRW52RGF0YUxlZnQsICBoQml0U3RyZWFtKTsKLSAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEdGRmIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0pOworICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickR0ZGYoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0pOworICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickR0ZGYoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhTGVmdC0+bm9PZm5vaXNlYmFuZHM7IGkrKykgewotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhTGVmdC0+c2JyX2ludmZfbW9kZV92ZWNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9JTlZGX01PREVfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPQorICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhTGVmdC0+c2JyX2ludmZfbW9kZV92ZWNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9JTlZGX01PREVfQklUUyk7CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhUmlnaHQtPm5vT2Zub2lzZWJhbmRzOyBpKyspIHsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YVJpZ2h0LT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGFSaWdodC0+c2JyX2ludmZfbW9kZV92ZWNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9JTlZGX01PREVfQklUUyk7CiAgICAgfQogCi0gICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVFbnZlbG9wZURhdGEgIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0sMCk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVFbnZlbG9wZURhdGEgIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0sMCk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVOb2lzZUxldmVsRGF0YSAoc2JyRW52RGF0YUxlZnQsICBoQml0U3RyZWFtLDApOwotICAgIHBheWxvYWRCaXRzICs9IHdyaXRlTm9pc2VMZXZlbERhdGEgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwwKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YShzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSwgMCk7CisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVFbnZlbG9wZURhdGEoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLCAwKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtLCAwKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwgMCk7CiAKLSAgICBwYXlsb2FkQml0cyArPSB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKHNickVudkRhdGFMZWZ0LGhCaXRTdHJlYW0pOwotICAgIHBheWxvYWRCaXRzICs9IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YSAoc2JyRW52RGF0YVJpZ2h0LGhCaXRTdHJlYW0pOworICAgIHBheWxvYWRCaXRzICs9IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YShzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSk7CisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSk7CiAKICAgfSAvKiBjb3VwbGluZyAqLwogCkBAIC01OTQsMTQgKzU1NCwxMyBAQAogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CiAKLXN0YXRpYyBJTlQgY2VpbF9sbjIoSU5UIHgpCi17Ci0gIElOVCB0bXA9LTE7Ci0gIHdoaWxlKCgxPDwrK3RtcCkgPCB4KTsKLSAgcmV0dXJuKHRtcCk7CitzdGF0aWMgSU5UIGNlaWxfbG4yKElOVCB4KSB7CisgIElOVCB0bXAgPSAtMTsKKyAgd2hpbGUgKCgxIDw8ICsrdG1wKSA8IHgpCisgICAgOworICByZXR1cm4gKHRtcCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNickdyaWQKQEAgLTYxMiw5MSArNTcxLDk1IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWVuY29kZVNickdyaWQgKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKLXsKK3N0YXRpYyBJTlQgZW5jb2RlU2JyR3JpZChIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgewogICBJTlQgcGF5bG9hZEJpdHMgPSAwOwogICBJTlQgaSwgdGVtcDsKICAgSU5UIGJ1ZmZlckZyYW1lU3RhcnQgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5idWZmZXJGcmFtZVN0YXJ0OwotICBJTlQgbnVtYmVyVGltZVNsb3RzICA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm51bWJlclRpbWVTbG90czsKKyAgSU5UIG51bWJlclRpbWVTbG90cyA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm51bWJlclRpbWVTbG90czsKIAogICBpZiAoc2JyRW52RGF0YS0+bGRHcmlkKQotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfQ0xBX0JJVFNfTEQpOworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfQ0xBX0JJVFNfTEQpOwogICBlbHNlCi0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9DTEFfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9DTEFfQklUUyk7CiAKICAgc3dpdGNoIChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzKSB7Ci0gIGNhc2UgRklYRklYb25seToKLSAgICBGREtfQVNTRVJUKDAgLyogRmF0YWwgZXJyb3IgaW4gZW5jb2RlU2JyR3JpZCEgKi8pOwotICAgIGJyZWFrOwotICBjYXNlIEZJWEZJWDoKLSAgICB0ZW1wID0gY2VpbF9sbjIoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX2Vudik7Ci0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCB0ZW1wLCBTQlJfRU5WX0JJVFMpOwotICAgIGlmICgoc2JyRW52RGF0YS0+bGRHcmlkKSAmJiAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX2Vudj09MSkpCi0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+Y3VycmVudEFtcFJlc0ZGLCBTSV9TQlJfQU1QX1JFU19CSVRTKTsKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZlswXSwgU0JSX1JFU19CSVRTKTsKKyAgICBjYXNlIEZJWEZJWG9ubHk6CisgICAgICBGREtfQVNTRVJUKDAgLyogRmF0YWwgZXJyb3IgaW4gZW5jb2RlU2JyR3JpZCEgKi8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSVhGSVg6CisgICAgICB0ZW1wID0gY2VpbF9sbjIoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX2Vudik7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX0VOVl9CSVRTKTsKKyAgICAgIGlmICgoc2JyRW52RGF0YS0+bGRHcmlkKSAmJiAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX2VudiA9PSAxKSkKKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmN1cnJlbnRBbXBSZXNGRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9BTVBfUkVTX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfUkVTX0JJVFMpOwogCi0gICAgYnJlYWs7CisgICAgICBicmVhazsKIAotICBjYXNlIEZJWFZBUjoKLSAgY2FzZSBWQVJGSVg6Ci0gICAgaWYgKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgPT0gRklYVkFSKQotICAgICAgdGVtcCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkIC0gKGJ1ZmZlckZyYW1lU3RhcnQgKyBudW1iZXJUaW1lU2xvdHMpOwotICAgIGVsc2UKLSAgICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCAtIGJ1ZmZlckZyYW1lU3RhcnQ7CisgICAgY2FzZSBGSVhWQVI6CisgICAgY2FzZSBWQVJGSVg6CisgICAgICBpZiAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcyA9PSBGSVhWQVIpCisgICAgICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCAtCisgICAgICAgICAgICAgICAoYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90cyk7CisgICAgICBlbHNlCisgICAgICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCAtIGJ1ZmZlckZyYW1lU3RhcnQ7CiAKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9BQlNfQklUUyk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5uLCBTQlJfTlVNX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9BQlNfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPQorICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5uLCBTQlJfTlVNX0JJVFMpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm47IGkrKykgewotICAgICAgdGVtcCA9IChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19yZWxfYm9yZFtpXSAtIDIpID4+IDE7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9SRUxfQklUUyk7Ci0gICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm47IGkrKykgeworICAgICAgICB0ZW1wID0gKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX3JlbF9ib3JkW2ldIC0gMikgPj4gMTsKKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9SRUxfQklUUyk7CisgICAgICB9CiAKLSAgICB0ZW1wID0gY2VpbF9sbjIoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+biArIDIpOwotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+cCwgdGVtcCk7CisgICAgICB0ZW1wID0gY2VpbF9sbjIoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+biArIDIpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnAsIHRlbXApOwogCi0gICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm4gKyAxOyBpKyspIHsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+dl9mW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfUkVTX0JJVFMpOwotICAgIH0KLSAgICBicmVhazsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5uICsgMTsgaSsrKSB7CisgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT52X2ZbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfUkVTX0JJVFMpOworICAgICAgfQorICAgICAgYnJlYWs7CiAKLSAgY2FzZSBWQVJWQVI6Ci0gICAgdGVtcCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkXzAgLSBidWZmZXJGcmFtZVN0YXJ0OwotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX0FCU19CSVRTKTsKLSAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmRfMSAtIChidWZmZXJGcmFtZVN0YXJ0ICsgbnVtYmVyVGltZVNsb3RzKTsKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9BQlNfQklUUyk7CisgICAgY2FzZSBWQVJWQVI6CisgICAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmRfMCAtIGJ1ZmZlckZyYW1lU3RhcnQ7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX0FCU19CSVRTKTsKKyAgICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZF8xIC0KKyAgICAgICAgICAgICAoYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90cyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX0FCU19CSVRTKTsKIAotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wLCBTQlJfTlVNX0JJVFMpOwotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8xLCBTQlJfTlVNX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKAorICAgICAgICAgIGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMCwgU0JSX05VTV9CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygKKyAgICAgICAgICBoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzEsIFNCUl9OVU1fQklUUyk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wOyBpKyspIHsKLSAgICAgIHRlbXAgPSAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfcmVsX2JvcmRfMFtpXSAtIDIpID4+IDE7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9SRUxfQklUUyk7Ci0gICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMDsgaSsrKSB7CisgICAgICAgIHRlbXAgPSAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfcmVsX2JvcmRfMFtpXSAtIDIpID4+IDE7CisgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB0ZW1wLCBTQlJfUkVMX0JJVFMpOworICAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMTsgaSsrKSB7Ci0gICAgICB0ZW1wID0gKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX3JlbF9ib3JkXzFbaV0gLSAyKSA+PiAxOwotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCB0ZW1wLCBTQlJfUkVMX0JJVFMpOwotICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzE7IGkrKykgeworICAgICAgICB0ZW1wID0gKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX3JlbF9ib3JkXzFbaV0gLSAyKSA+PiAxOworICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX1JFTF9CSVRTKTsKKyAgICAgIH0KIAotICAgIHRlbXAgPSBjZWlsX2xuMihzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzEgKyAyKTsKLSAgICBwYXlsb2FkQml0cyArPSAgRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5wLCB0ZW1wKTsKKyAgICAgIHRlbXAgPSBjZWlsX2xuMihzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzAgKworICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMSArIDIpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnAsIHRlbXApOwogCi0gICAgdGVtcCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMCArCi0gICAgICAgICAgIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMSArIDE7CisgICAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wICsKKyAgICAgICAgICAgICBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzEgKyAxOwogCi0gICAgZm9yIChpID0gMDsgaSA8IHRlbXA7IGkrKykgewotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT52X2ZMUltpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX1JFU19CSVRTKTsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgdGVtcDsgaSsrKSB7CisgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygKKyAgICAgICAgICAgIGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZkxSW2ldLCBTQlJfUkVTX0JJVFMpOworICAgICAgfQorICAgICAgYnJlYWs7CiAgIH0KIAogICByZXR1cm4gcGF5bG9hZEJpdHM7CkBAIC03MTUsMTIgKzY3OCwxMCBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1lbmNvZGVMb3dEZWxheVNickdyaWQgKCAgSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zbWl0RnJlcXMKLSAgICAgICAgICAgICAgICAgICAgICAgKQoteworc3RhdGljIGludCBlbmNvZGVMb3dEZWxheVNickdyaWQoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0cmFuc21pdEZyZXFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBzYnJTeW50YXhGbGFncykgewogICBpbnQgcGF5bG9hZEJpdHMgPSAwOwogICBpbnQgaTsKIApAQCAtNzI4LDIxICs2ODksMjUgQEAKICAgLyogd3JpdGUgZnJhbWVDbGFzcyBbMSBiaXRdIGZvciBGSVhGSVhvbmx5IEdyaWQgKi8KICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDEsIFNCUl9DTEFfQklUU19MRCk7CiAKLSAgLyogYWJzb2x1dGUgQm9yZGVycyBhcmUgZml4OiAwLFgsWCxYLG5UaW1lU2xvdHM7IHNvIHdlIGRvbnQgaGF2ZSB0byB0cmFuc21pdCB0aGVtICovCisgIC8qIGFic29sdXRlIEJvcmRlcnMgYXJlIGZpeDogMCxYLFgsWCxuVGltZVNsb3RzOyBzbyB3ZSBkb250IGhhdmUgdG8gdHJhbnNtaXQKKyAgICogdGhlbSAqLwogICAvKiBvbmx5IHRyYW5zbWl0IHRoZSB0cmFuc2llbnQgcG9zaXRpb24hICovCiAgIC8qIHdpdGggdGhpcyBpbmZvIChiMSkgd2UgY2FuIHJlY29uc3RydWN0IHRoZSBGcmFtZSBvbiBEZWNvZGVyIHNpZGUgOiAqLwogICAvKiBib3JkZXJbMF0gPSAwOyBib3JkZXJbMV0gPSBiMTsgYm9yZGVyWzJdPWIxKzI7IGJvcmRlclszXSA9IG5yVGltZVNsb3RzICovCiAKICAgLyogdXNlIDMgb3IgNGJpdHMgZm9yIHRyYW5zaWVudCBib3JkZXIgKGJvcmRlcikgKi8KICAgaWYgKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm51bWJlclRpbWVTbG90cyA9PSA4KQotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoIGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkLCAzKTsKKyAgICBwYXlsb2FkQml0cyArPQorICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmQsIDMpOwogICBlbHNlCi0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzICggaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmQsIDQpOworICAgIHBheWxvYWRCaXRzICs9CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCwgNCk7CiAKICAgaWYgKHRyYW5zbWl0RnJlcXMpIHsKICAgICAvKiB3cml0ZSBGcmVxUmVzIGdyaWQgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX2VudjsgaSsrKSB7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZltpXSwgU0JSX1JFU19CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT52X2ZbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX1JFU19CSVRTKTsKICAgICB9CiAgIH0KIApAQCAtNzUyLDMwICs3MTcsMjggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJEdGRmCi0gICAgZGVzY3JpcHRpb246ICB3cml0ZXMgYml0cyB0aGF0IGRlc2NyaWJlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBlbnZlbG9wZXMgb2YgYSBmcmFtZQotICAgIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgotICAgIGlucHV0OgotICAgIG91dHB1dDoKKyAgICBkZXNjcmlwdGlvbjogIHdyaXRlcyBiaXRzIHRoYXQgZGVzY3JpYmVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGVudmVsb3BlcyBvZiBhCitmcmFtZSByZXR1cm5zOiAgICAgIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4gaW5wdXQ6IG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1lbmNvZGVTYnJEdGRmIChIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17CitzdGF0aWMgSU5UIGVuY29kZVNickR0ZGYoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKICAgSU5UIGksIHBheWxvYWRCaXRzID0gMCwgbm9PZk5vaXNlRW52ZWxvcGVzOwogCiAgIG5vT2ZOb2lzZUVudmVsb3BlcyA9IHNickVudkRhdGEtPm5vT2ZFbnZlbG9wZXMgPiAxID8gMiA6IDE7CiAKICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPm5vT2ZFbnZlbG9wZXM7ICsraSkgewotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+ZG9tYWluX3ZlY1tpXSwgU0JSX0RJUl9CSVRTKTsKKyAgICBwYXlsb2FkQml0cyArPQorICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+ZG9tYWluX3ZlY1tpXSwgU0JSX0RJUl9CSVRTKTsKICAgfQogICBmb3IgKGkgPSAwOyBpIDwgbm9PZk5vaXNlRW52ZWxvcGVzOyArK2kpIHsKLSAgICBwYXlsb2FkQml0cyArPSAgRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5kb21haW5fdmVjX25vaXNlW2ldLCBTQlJfRElSX0JJVFMpOworICAgIHBheWxvYWRCaXRzICs9CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5kb21haW5fdmVjX25vaXNlW2ldLCBTQlJfRElSX0JJVFMpOwogICB9CiAKICAgcmV0dXJuIHBheWxvYWRCaXRzOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiB3cml0ZU5vaXNlTGV2ZWxEYXRhCkBAIC03ODUsODcgKzc0OCwxMDEgQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVAotd3JpdGVOb2lzZUxldmVsRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBJTlQgY291cGxpbmcpCi17CitzdGF0aWMgSU5UIHdyaXRlTm9pc2VMZXZlbERhdGEoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIElOVCBjb3VwbGluZykgewogICBJTlQgaiwgaSwgcGF5bG9hZEJpdHMgPSAwOwogICBJTlQgbk5vaXNlRW52ZWxvcGVzID0gc2JyRW52RGF0YS0+bm9PZkVudmVsb3BlcyA+IDEgPyAyIDogMTsKIAogICBmb3IgKGkgPSAwOyBpIDwgbk5vaXNlRW52ZWxvcGVzOyBpKyspIHsKICAgICBzd2l0Y2ggKHNickVudkRhdGEtPmRvbWFpbl92ZWNfbm9pc2VbaV0pIHsKLSAgICBjYXNlIEZSRVE6Ci0gICAgICBpZiAoY291cGxpbmcgJiYgc2JyRW52RGF0YS0+YmFsYW5jZSkgewotICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tpICogc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9ub2lzZV9iaXRzX2JhbGFuY2UpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbaSAqIHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0cyk7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoaiA9IDEgKyBpICogc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHM7IGogPCAoc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHMgKiAoMSArIGkpKTsgaisrKSB7Ci0gICAgICAgIGlmIChjb3VwbGluZykgewotICAgICAgICAgIGlmIChzYnJFbnZEYXRhLT5iYWxhbmNlKSB7Ci0gICAgICAgICAgICAvKiBjb3VwbGluZyAmJiBiYWxhbmNlICovCi0gICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZUZyZXFDW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZUZyZXFMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMV0pOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjb3VwbGluZyAmJiAhYmFsYW5jZSAqLwotICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsRnJlcUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsRnJlcUxbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdKTsKLSAgICAgICAgICB9CisgICAgICBjYXNlIEZSRVE6CisgICAgICAgIGlmIChjb3VwbGluZyAmJiBzYnJFbnZEYXRhLT5iYWxhbmNlKSB7CisgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKAorICAgICAgICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2kgKiBzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kc10sCisgICAgICAgICAgICAgIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9ub2lzZV9iaXRzX2JhbGFuY2UpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qICFjb3VwbGluZyAqLwotICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlRnJlcUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUZyZXFMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdKTsKKyAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoCisgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgIHNickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbaSAqIHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzXSwKKyAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHMpOwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKIAotICAgIGNhc2UgVElNRToKLSAgICAgIGZvciAoaiA9IGkgKiBzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kczsgaiA8IChzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kcyAqICgxICsgaSkpOyBqKyspIHsKLSAgICAgICAgaWYgKGNvdXBsaW5nKSB7Ci0gICAgICAgICAgaWYgKHNickVudkRhdGEtPmJhbGFuY2UpIHsKLSAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmIGJhbGFuY2UgKi8KLSAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlVGltZUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlVGltZUxbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExXSk7CisgICAgICAgIGZvciAoaiA9IDEgKyBpICogc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHM7CisgICAgICAgICAgICAgaiA8IChzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kcyAqICgxICsgaSkpOyBqKyspIHsKKyAgICAgICAgICBpZiAoY291cGxpbmcpIHsKKyAgICAgICAgICAgIGlmIChzYnJFbnZEYXRhLT5iYWxhbmNlKSB7CisgICAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmIGJhbGFuY2UgKi8KKyAgICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VGcmVxQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZUZyZXFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTFdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmICFiYWxhbmNlICovCisgICAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygKKyAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsRnJlcUMKKyAgICAgICAgICAgICAgICAgICAgICBbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArIENPREVfQk9PS19TQ0ZfTEFWMTFdLAorICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbEZyZXFMCisgICAgICAgICAgICAgICAgICAgICAgW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKyBDT0RFX0JPT0tfU0NGX0xBVjExXSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmICFiYWxhbmNlICovCi0gICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lTFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0pOworICAgICAgICAgICAgLyogIWNvdXBsaW5nICovCisgICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoCisgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICBzYnJFbnZEYXRhCisgICAgICAgICAgICAgICAgICAgIC0+aHVmZnRhYmxlTm9pc2VGcmVxQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdLAorICAgICAgICAgICAgICAgIHNickVudkRhdGEKKyAgICAgICAgICAgICAgICAgICAgLT5odWZmdGFibGVOb2lzZUZyZXFMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0pOwogICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKiAhY291cGxpbmcgKi8KLSAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lTFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdKTsKICAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRJTUU6CisgICAgICAgIGZvciAoaiA9IGkgKiBzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kczsKKyAgICAgICAgICAgICBqIDwgKHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzICogKDEgKyBpKSk7IGorKykgeworICAgICAgICAgIGlmIChjb3VwbGluZykgeworICAgICAgICAgICAgaWYgKHNickVudkRhdGEtPmJhbGFuY2UpIHsKKyAgICAgICAgICAgICAgLyogY291cGxpbmcgJiYgYmFsYW5jZSAqLworICAgICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZVRpbWVDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlVGltZUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogY291cGxpbmcgJiYgIWJhbGFuY2UgKi8KKyAgICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKAorICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lQworICAgICAgICAgICAgICAgICAgICAgIFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsgQ09ERV9CT09LX1NDRl9MQVYxMV0sCisgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUwKKyAgICAgICAgICAgICAgICAgICAgICBbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArIENPREVfQk9PS19TQ0ZfTEFWMTFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogIWNvdXBsaW5nICovCisgICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoCisgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICBzYnJFbnZEYXRhCisgICAgICAgICAgICAgICAgICAgIC0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVDW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSwKKyAgICAgICAgICAgICAgICBzYnJFbnZEYXRhCisgICAgICAgICAgICAgICAgICAgIC0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IHdyaXRlRW52ZWxvcGVEYXRhCkBAIC04NzUsNjQgKzg1Miw4NSBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi13cml0ZUVudmVsb3BlRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBJTlQgY291cGxpbmcpCi17CitzdGF0aWMgSU5UIHdyaXRlRW52ZWxvcGVEYXRhKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgSU5UIGNvdXBsaW5nKSB7CiAgIElOVCBwYXlsb2FkQml0cyA9IDAsIGosIGksIGRlbHRhOwogCi0gIGZvciAoaiA9IDA7IGogPCBzYnJFbnZEYXRhLT5ub09mRW52ZWxvcGVzOyBqKyspIHsgLyogbG9vcCBvdmVyIGFsbCBlbnZlbG9wZXMgKi8KKyAgZm9yIChqID0gMDsgaiA8IHNickVudkRhdGEtPm5vT2ZFbnZlbG9wZXM7CisgICAgICAgaisrKSB7IC8qIGxvb3Agb3ZlciBhbGwgZW52ZWxvcGVzICovCiAgICAgaWYgKHNickVudkRhdGEtPmRvbWFpbl92ZWNbal0gPT0gRlJFUSkgewogICAgICAgaWYgKGNvdXBsaW5nICYmIHNickVudkRhdGEtPmJhbGFuY2UpIHsKLSAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5pZW52ZWxvcGVbal1bMF0sIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0c19iYWxhbmNlKTsKKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmllbnZlbG9wZVtqXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0c19iYWxhbmNlKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aWVudmVsb3BlW2pdWzBdLCBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHMpOworICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aWVudmVsb3BlW2pdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzKTsKICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKGkgPSAxIC0gc2JyRW52RGF0YS0+ZG9tYWluX3ZlY1tqXTsgaSA8IHNickVudkRhdGEtPm5vU2NmQmFuZHNbal07IGkrKykgeworICAgIGZvciAoaSA9IDEgLSBzYnJFbnZEYXRhLT5kb21haW5fdmVjW2pdOyBpIDwgc2JyRW52RGF0YS0+bm9TY2ZCYW5kc1tqXTsKKyAgICAgICAgIGkrKykgewogICAgICAgZGVsdGEgPSBzYnJFbnZEYXRhLT5pZW52ZWxvcGVbal1baV07CiAgICAgICBpZiAoY291cGxpbmcgJiYgc2JyRW52RGF0YS0+YmFsYW5jZSkgewotICAgICAgICBGREtfQVNTRVJUIChmaXhwX2FicyAoZGVsdGEpIDw9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZSk7CisgICAgICAgIEZES19BU1NFUlQoZml4cF9hYnMoZGVsdGEpIDw9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBGREtfQVNTRVJUIChmaXhwX2FicyAoZGVsdGEpIDw9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2KTsKKyAgICAgICAgRkRLX0FTU0VSVChmaXhwX2FicyhkZWx0YSkgPD0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXYpOwogICAgICAgfQogICAgICAgaWYgKGNvdXBsaW5nKSB7CiAgICAgICAgIGlmIChzYnJFbnZEYXRhLT5iYWxhbmNlKSB7CiAgICAgICAgICAgaWYgKHNickVudkRhdGEtPmRvbWFpbl92ZWNbal0pIHsKICAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmIGJhbGFuY2UgJiYgVElNRSAqLwotICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUNbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VdKTsKKyAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygKKyAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgIHNickVudkRhdGEKKyAgICAgICAgICAgICAgICAgICAgLT5odWZmdGFibGVCYWxhbmNlVGltZUNbZGVsdGEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VdLAorICAgICAgICAgICAgICAgIHNickVudkRhdGEKKyAgICAgICAgICAgICAgICAgICAgLT5odWZmdGFibGVCYWxhbmNlVGltZUxbZGVsdGEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2VdKTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogY291cGxpbmcgJiYgYmFsYW5jZSAmJiBGUkVRICovCi0gICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQ1tkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTFtkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0pOworICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKAorICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgc2JyRW52RGF0YQorICAgICAgICAgICAgICAgICAgICAtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQ1tkZWx0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0sCisgICAgICAgICAgICAgICAgc2JyRW52RGF0YQorICAgICAgICAgICAgICAgICAgICAtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTFtkZWx0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0pOwogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBpZiAoc2JyRW52RGF0YS0+ZG9tYWluX3ZlY1tqXSkgewogICAgICAgICAgICAgLyogY291cGxpbmcgJiYgIWJhbGFuY2UgJiYgVElNRSAqLwotICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKKyAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygKKyAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgIHNickVudkRhdGEKKyAgICAgICAgICAgICAgICAgICAgLT5odWZmdGFibGVMZXZlbFRpbWVDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAorICAgICAgICAgICAgICAgIHNickVudkRhdGEKKyAgICAgICAgICAgICAgICAgICAgLT5odWZmdGFibGVMZXZlbFRpbWVMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogY291cGxpbmcgJiYgIWJhbGFuY2UgJiYgRlJFUSAqLwotICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKKyAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygKKyAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgIHNickVudkRhdGEKKyAgICAgICAgICAgICAgICAgICAgLT5odWZmdGFibGVMZXZlbEZyZXFDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAorICAgICAgICAgICAgICAgIHNickVudkRhdGEKKyAgICAgICAgICAgICAgICAgICAgLT5odWZmdGFibGVMZXZlbEZyZXFMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChzYnJFbnZEYXRhLT5kb21haW5fdmVjW2pdKSB7CiAgICAgICAgICAgLyogIWNvdXBsaW5nICYmIFRJTUUgKi8KLSAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lQ1tkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKKyAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoCisgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAorICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lTFtkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgLyogIWNvdXBsaW5nICYmIEZSRVEgKi8KLSAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVGcmVxQ1tkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKKyAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoCisgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAorICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVGcmVxTFtkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2XSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC05NDAsNyArOTM4LDYgQEAKICAgcmV0dXJuIHBheWxvYWRCaXRzOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVFeHRlbmRlZERhdGEKQEAgLTk1MCw0OSArOTQ3LDUxIEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgZW5jb2RlRXh0ZW5kZWREYXRhIChIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17CitzdGF0aWMgSU5UIGVuY29kZUV4dGVuZGVkRGF0YShIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKSB7CiAgIElOVCBleHREYXRhU2l6ZTsKICAgSU5UIHBheWxvYWRCaXRzID0gMDsKIAogICBleHREYXRhU2l6ZSA9IGdldFNickV4dGVuZGVkRGF0YVNpemUoaFBhcmFtZXRyaWNTdGVyZW8pOwogCi0KICAgaWYgKGV4dERhdGFTaXplICE9IDApIHsKLSAgICBJTlQgbWF4RXh0U2l6ZSA9ICgxPDxTSV9TQlJfRVhURU5TSU9OX1NJWkVfQklUUykgLSAxOworICAgIElOVCBtYXhFeHRTaXplID0gKDEgPDwgU0lfU0JSX0VYVEVOU0lPTl9TSVpFX0JJVFMpIC0gMTsKICAgICBJTlQgd3JpdHRlbk5vQml0cyA9IDA7IC8qIG5lZWRlZCB0byBieXRlIGFsaWduIHRoZSBleHRlbmRlZCBkYXRhICovCiAKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIDEsIFNJX1NCUl9FWFRFTkRFRF9EQVRBX0JJVFMpOworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAxLCBTSV9TQlJfRVhURU5ERURfREFUQV9CSVRTKTsKICAgICBGREtfQVNTRVJUKGV4dERhdGFTaXplIDw9IFNCUl9FWFRFTkRFRF9EQVRBX01BWF9DTlQpOwogCiAgICAgaWYgKGV4dERhdGFTaXplIDwgbWF4RXh0U2l6ZSkgewotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBleHREYXRhU2l6ZSwgU0lfU0JSX0VYVEVOU0lPTl9TSVpFX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0KKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXh0RGF0YVNpemUsIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTKTsKICAgICB9IGVsc2UgewotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBtYXhFeHRTaXplLCBTSV9TQlJfRVhURU5TSU9OX1NJWkVfQklUUyk7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIGV4dERhdGFTaXplIC0gbWF4RXh0U2l6ZSwgU0lfU0JSX0VYVEVOU0lPTl9FU0NfQ09VTlRfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPQorICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBtYXhFeHRTaXplLCBTSV9TQlJfRVhURU5TSU9OX1NJWkVfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXh0RGF0YVNpemUgLSBtYXhFeHRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9FWFRFTlNJT05fRVNDX0NPVU5UX0JJVFMpOwogICAgIH0KIAogICAgIC8qIHBhcmFtZXRyaWMgY29kaW5nIHNpZ25hbGxlZCBoZXJlPyAqLwotICAgIGlmKGhQYXJhbWV0cmljU3RlcmVvKXsKLSAgICAgIHdyaXR0ZW5Ob0JpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBFWFRFTlNJT05fSURfUFNfQ09ESU5HLCBTSV9TQlJfRVhURU5TSU9OX0lEX0JJVFMpOwotICAgICAgd3JpdHRlbk5vQml0cyArPSBGREtzYnJFbmNfUFNFbmNfV3JpdGVQU0RhdGEoaFBhcmFtZXRyaWNTdGVyZW8sIGhCaXRTdHJlYW0pOworICAgIGlmIChoUGFyYW1ldHJpY1N0ZXJlbykgeworICAgICAgd3JpdHRlbk5vQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgRVhURU5TSU9OX0lEX1BTX0NPRElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9FWFRFTlNJT05fSURfQklUUyk7CisgICAgICB3cml0dGVuTm9CaXRzICs9CisgICAgICAgICAgRkRLc2JyRW5jX1BTRW5jX1dyaXRlUFNEYXRhKGhQYXJhbWV0cmljU3RlcmVvLCBoQml0U3RyZWFtKTsKICAgICB9CiAKICAgICBwYXlsb2FkQml0cyArPSB3cml0dGVuTm9CaXRzOwogCiAgICAgLyogYnl0ZSBhbGlnbm1lbnQgKi8KLSAgICB3cml0dGVuTm9CaXRzID0gd3JpdHRlbk5vQml0cyU4OwotICAgIGlmKHdyaXR0ZW5Ob0JpdHMpCisgICAgd3JpdHRlbk5vQml0cyA9IHdyaXR0ZW5Ob0JpdHMgJSA4OworICAgIGlmICh3cml0dGVuTm9CaXRzKQogICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsICg4IC0gd3JpdHRlbk5vQml0cykpOwogICB9IGVsc2UgewotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMCwgU0lfU0JSX0VYVEVOREVEX0RBVEFfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIFNJX1NCUl9FWFRFTkRFRF9EQVRBX0JJVFMpOwogICB9CiAKICAgcmV0dXJuIHBheWxvYWRCaXRzOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEKQEAgLTEwMDIsMTggKzEwMDEsMTggQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKK3N0YXRpYyBJTlQgd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCiAKIHsKICAgSU5UIGk7CiAgIElOVCBwYXlsb2FkQml0cyA9IDA7CiAKLSAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5hZGRIYXJtb25pY0ZsYWcsIDEpOworICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+YWRkSGFybW9uaWNGbGFnLCAxKTsKIAogICBpZiAoc2JyRW52RGF0YS0+YWRkSGFybW9uaWNGbGFnKSB7CiAgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPm5vSGFybW9uaWNzOyBpKyspIHsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+YWRkSGFybW9uaWNbaV0sIDEpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmFkZEhhcm1vbmljW2ldLCAxKTsKICAgICB9CiAgIH0KIApAQCAtMTAzMSw5ICsxMDMwLDcgQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVAotZ2V0U2JyRXh0ZW5kZWREYXRhU2l6ZSAoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbykKLXsKK3N0YXRpYyBJTlQgZ2V0U2JyRXh0ZW5kZWREYXRhU2l6ZShIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8pIHsKICAgSU5UIGV4dERhdGFCaXRzID0gMDsKIAogICAvKiBhZGQgeW91ciBuZXcgZXh0ZW5kZWQgZGF0YSBjb3VudGluZyBtZXRob2RzIGhlcmUgKi8KQEAgLTEwNDIsMTYgKzEwMzksMTEgQEAKICAgICBubyBleHRlbmRlZCBkYXRhCiAgICovCiAKLSAgaWYoaFBhcmFtZXRyaWNTdGVyZW8peworICBpZiAoaFBhcmFtZXRyaWNTdGVyZW8pIHsKICAgICAvKiBQUyBleHRlbmRlZCBkYXRhICovCiAgICAgZXh0RGF0YUJpdHMgKz0gU0lfU0JSX0VYVEVOU0lPTl9JRF9CSVRTOwogICAgIGV4dERhdGFCaXRzICs9IEZES3NickVuY19QU0VuY19Xcml0ZVBTRGF0YShoUGFyYW1ldHJpY1N0ZXJlbywgTlVMTCk7CiAgIH0KIAotICByZXR1cm4gKGV4dERhdGFCaXRzKzcpID4+IDM7CisgIHJldHVybiAoZXh0RGF0YUJpdHMgKyA3KSA+PiAzOwogfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvYml0X3Nici5oIGIvbGliU0JSZW5jL3NyYy9iaXRfc2JyLmgKaW5kZXggZGU0YWM4OS4uZTkwZjUyYyAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9iaXRfc2JyLmgKKysrIGIvbGliU0JSZW5jL3NyYy9iaXRfc2JyLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDIyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgU0JSIGJpdCB3cml0aW5nICAKKyAgXGJyaWVmICBTQlIgYml0IHdyaXRpbmcgJFJldmlzaW9uOiA5Mjc5MCAkCiAqLwotI2lmbmRlZiBfX0JJVF9TQlJfSAotI2RlZmluZSBfX0JJVF9TQlJfSAorI2lmbmRlZiBCSVRfU0JSX0gKKyNkZWZpbmUgQklUX1NCUl9ICiAKICNpbmNsdWRlICJzYnJfZGVmLmgiCiAjaW5jbHVkZSAiY21vbmRhdGEuaCIKQEAgLTk0LDIwICsxMTMsMjIgQEAKIAogc3RydWN0IFNCUl9FTlZfREFUQTsKIAotc3RydWN0IFNCUl9CSVRTVFJFQU1fREFUQQoteworc3RydWN0IFNCUl9CSVRTVFJFQU1fREFUQSB7CiAgIElOVCBUb3RhbEJpdHM7CiAgIElOVCBQYXlsb2FkQml0czsKICAgSU5UIEZpbGxCaXRzOwogICBJTlQgSGVhZGVyQWN0aXZlOwotICBJTlQgTnJTZW5kSGVhZGVyRGF0YTsgICAgICAgICAgICAvKio8IGlucHV0IGZyb20gY29tbWFuZGxpbmUgKi8KLSAgSU5UIENvdW50U2VuZEhlYWRlckRhdGE7ICAgICAgICAgLyoqPCBtb2R1bG8gY291bnQuIElmIDwgMCB0aGVuIG5vIGNvdW50aW5nIGlzIGRvbmUgKG5vIFNCUiBoZWFkZXJzKSAqLworICBJTlQgSGVhZGVyQWN0aXZlRGVsYXk7IC8qKjwgc2JyIHBheWxvYWQgYW5kIGl0cyBoZWFkZXIgaXMgZGVsYXllZCBkZXBlbmRpbmcgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyIGNvbmZpZ3VyYXRpb24qLworICBJTlQgTnJTZW5kSGVhZGVyRGF0YTsgIC8qKjwgaW5wdXQgZnJvbSBjb21tYW5kbGluZSAqLworICBJTlQgQ291bnRTZW5kSGVhZGVyRGF0YTsgLyoqPCBtb2R1bG8gY291bnQuIElmIDwgMCB0aGVuIG5vIGNvdW50aW5nIGlzIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChubyBTQlIgaGVhZGVycykgKi8KKyAgSU5UIHJpZ2h0Qm9yZGVyRklYOyAgICAgIC8qKjwgZm9yY2UgVkFSRklYIG9yIEZJWEZJWCBmcmFtZXMgKi8KIH07CiAKLXR5cGVkZWYgc3RydWN0IFNCUl9CSVRTVFJFQU1fREFUQSAgKkhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEE7Cit0eXBlZGVmIHN0cnVjdCBTQlJfQklUU1RSRUFNX0RBVEEgKkhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEE7CiAKLXN0cnVjdCBTQlJfSEVBREVSX0RBVEEKLXsKK3N0cnVjdCBTQlJfSEVBREVSX0RBVEEgewogICBBTVBfUkVTIHNicl9hbXBfcmVzOwogICBJTlQgc2JyX3N0YXJ0X2ZyZXF1ZW5jeTsKICAgSU5UIHNicl9zdG9wX2ZyZXF1ZW5jeTsKQEAgLTEzMywxMyArMTU0LDEwIEBACiAgIC8qCiAgICAgZWxlbWVudCBvZiBzaW5nbGVjaGFubmVsZWxlbWVudAogICAqLwotCiB9OwogdHlwZWRlZiBzdHJ1Y3QgU0JSX0hFQURFUl9EQVRBICpIQU5ETEVfU0JSX0hFQURFUl9EQVRBOwogCi1zdHJ1Y3QgU0JSX0VOVl9EQVRBCi17Ci0KK3N0cnVjdCBTQlJfRU5WX0RBVEEgewogICBJTlQgc2JyX3hwb3NfY3RybDsKICAgRlJFUV9SRVMgZnJlcV9yZXNfZml4Zml4WzJdOwogICBVQ0hBUiBmUmVzVHJhbnNJc0xvdzsKQEAgLTE2Nyw3ICsxODUsNiBAQAogICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlTGV2ZWxGcmVxTDsKICAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTDsKIAotCiAgIGNvbnN0IFVDSEFSICpodWZmdGFibGVOb2lzZVRpbWVMOwogICBjb25zdCBJTlQgKmh1ZmZ0YWJsZU5vaXNlVGltZUM7CiAgIGNvbnN0IFVDSEFSICpodWZmdGFibGVOb2lzZUZyZXFMOwpAQCAtMTg4LDcgKzIwNSw2IEBACiAgIElOVCBhZGRIYXJtb25pY0ZsYWc7CiAgIFVDSEFSIGFkZEhhcm1vbmljW01BWF9GUkVRX0NPRUZGU107CiAKLQogICAvKiBjYWxjdWxhdGVkIGhlbHBlciB2YXJzICovCiAgIElOVCBzaV9zYnJfc3RhcnRfZW52X2JpdHNfYmFsYW5jZTsKICAgSU5UIHNpX3Nicl9zdGFydF9lbnZfYml0czsKQEAgLTIwNSw3ICsyMjEsMTAgQEAKICAgSU5UIGJhbGFuY2U7CiAgIEFNUF9SRVMgaW5pdF9zYnJfYW1wX3JlczsKICAgQU1QX1JFUyBjdXJyZW50QW1wUmVzRkY7Ci0gIEZJWFBfREJMIHRvbl9IRltTQlJfR0xPQkFMX1RPTkFMSVRZX1ZBTFVFU107IC8qIHRvbmFsaXR5IGlzIHNjYWxlZCBieSAyXjE5LzAuNTI0Mjg4ZiAoZnJhY3QgcGFydCBvZiBSRUxBWEFUSU9OKSAqLworICBGSVhQX0RCTAorICB0b25fSEZbU0JSX0dMT0JBTF9UT05BTElUWV9WQUxVRVNdOyAvKiB0b25hbGl0eSBpcyBzY2FsZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl4xOS8wLjUyNDI4OGYgKGZyYWN0IHBhcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVMQVhBVElPTikgKi8KICAgRklYUF9EQkwgZ2xvYmFsX3RvbmFsaXR5OwogCiAgIC8qIGV4dGVuZGVkIGRhdGEgKi8KQEAgLTIxOCw0MSArMjM3LDMxIEBACiB9OwogdHlwZWRlZiBzdHJ1Y3QgU0JSX0VOVl9EQVRBICpIQU5ETEVfU0JSX0VOVl9EQVRBOwogCitJTlQgRkRLc2JyRW5jX1dyaXRlRW52U2luZ2xlQ2hhbm5lbEVsZW1lbnQoCisgICAgc3RydWN0IFNCUl9IRUFERVJfREFUQSAqc2JySGVhZGVyRGF0YSwKKyAgICBzdHJ1Y3QgVF9QQVJBTUVUUklDX1NURVJFTyAqaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgc3RydWN0IFNCUl9CSVRTVFJFQU1fREFUQSAqc2JyQml0c3RyZWFtRGF0YSwKKyAgICBzdHJ1Y3QgU0JSX0VOVl9EQVRBICpzYnJFbnZEYXRhLCBzdHJ1Y3QgQ09NTU9OX0RBVEEgKmNtb25EYXRhLAorICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MpOwogCitJTlQgRkRLc2JyRW5jX1dyaXRlRW52Q2hhbm5lbFBhaXJFbGVtZW50KAorICAgIHN0cnVjdCBTQlJfSEVBREVSX0RBVEEgKnNickhlYWRlckRhdGEsCisgICAgc3RydWN0IFRfUEFSQU1FVFJJQ19TVEVSRU8gKmhQYXJhbWV0cmljU3RlcmVvLAorICAgIHN0cnVjdCBTQlJfQklUU1RSRUFNX0RBVEEgKnNickJpdHN0cmVhbURhdGEsCisgICAgc3RydWN0IFNCUl9FTlZfREFUQSAqc2JyRW52RGF0YUxlZnQsIHN0cnVjdCBTQlJfRU5WX0RBVEEgKnNickVudkRhdGFSaWdodCwKKyAgICBzdHJ1Y3QgQ09NTU9OX0RBVEEgKmNtb25EYXRhLCBVSU5UIHNiclN5bnRheEZsYWdzKTsKIAotSU5UIEZES3NickVuY19Xcml0ZUVudlNpbmdsZUNoYW5uZWxFbGVtZW50KHN0cnVjdCBTQlJfSEVBREVSX0RBVEEgICAgKnNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVF9QQVJBTUVUUklDX1NURVJFTyAqaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBICpzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNCUl9FTlZfREFUQSAgICAgICAqc2JyRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDT01NT05fREFUQSAgICAgICAgKmNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpOwotCi0KLUlOVCBGREtzYnJFbmNfV3JpdGVFbnZDaGFubmVsUGFpckVsZW1lbnQoc3RydWN0IFNCUl9IRUFERVJfREFUQSAgICAqc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVF9QQVJBTUVUUklDX1NURVJFTyAqaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNCUl9CSVRTVFJFQU1fREFUQSAqc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0JSX0VOVl9EQVRBICAgICAgICpzYnJFbnZEYXRhTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0JSX0VOVl9EQVRBICAgICAgICpzYnJFbnZEYXRhUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENPTU1PTl9EQVRBICAgICAgICAqY21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpOwotCi0KLQotSU5UIEZES3NickVuY19Db3VudFNickNoYW5uZWxQYWlyRWxlbWVudCAoc3RydWN0IFNCUl9IRUFERVJfREFUQSAgICAgKnNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUX1BBUkFNRVRSSUNfU1RFUkVPICpoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNCUl9CSVRTVFJFQU1fREFUQSAgKnNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTQlJfRU5WX0RBVEEgICAgICAgICpzYnJFbnZEYXRhTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNCUl9FTlZfREFUQSAgICAgICAgKnNickVudkRhdGFSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENPTU1PTl9EQVRBICAgICAgICAgKmNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpOwotCi0KK0lOVCBGREtzYnJFbmNfQ291bnRTYnJDaGFubmVsUGFpckVsZW1lbnQoCisgICAgc3RydWN0IFNCUl9IRUFERVJfREFUQSAqc2JySGVhZGVyRGF0YSwKKyAgICBzdHJ1Y3QgVF9QQVJBTUVUUklDX1NURVJFTyAqaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgc3RydWN0IFNCUl9CSVRTVFJFQU1fREFUQSAqc2JyQml0c3RyZWFtRGF0YSwKKyAgICBzdHJ1Y3QgU0JSX0VOVl9EQVRBICpzYnJFbnZEYXRhTGVmdCwgc3RydWN0IFNCUl9FTlZfREFUQSAqc2JyRW52RGF0YVJpZ2h0LAorICAgIHN0cnVjdCBDT01NT05fREFUQSAqY21vbkRhdGEsIFVJTlQgc2JyU3ludGF4RmxhZ3MpOwogCiAvKiBkZWJ1Z2dpbmcgYW5kIHR1bmluZyBmdW5jdGlvbnMgKi8KIAogLyojZGVmaW5lIFNCUl9FTlZfU1RBVElTVElDUyAqLwogCi0KIC8qI2RlZmluZSBTQlJfUEFZTE9BRF9NT05JVE9SKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL2Ntb25kYXRhLmggYi9saWJTQlJlbmMvc3JjL2Ntb25kYXRhLmgKaW5kZXggMzJlNjk5My4uMDc3OWI0ZCAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9jbW9uZGF0YS5oCisrKyBiL2xpYlNCUmVuYy9zcmMvY21vbmRhdGEuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMiArOTAsMzggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBDb3JlIENvZGVyJ3MgYW5kIFNCUidzIHNoYXJlZCBkYXRhIHN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgXGJyaWVmICBDb3JlIENvZGVyJ3MgYW5kIFNCUidzIHNoYXJlZCBkYXRhIHN0cnVjdHVyZSBkZWZpbml0aW9uICRSZXZpc2lvbjoKKyAgOTI3OTAgJAogKi8KLSNpZm5kZWYgX19TQlJfQ01PTkRBVEFfSAotI2RlZmluZSBfX1NCUl9DTU9OREFUQV9ICisjaWZuZGVmIENNT05EQVRBX0gKKyNkZWZpbmUgQ01PTkRBVEFfSAogCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCi0KIHN0cnVjdCBDT01NT05fREFUQSB7Ci0gIElOVCAgICAgICAgICAgICAgICAgICBzYnJIZHJCaXRzOyAgICAgICAgICAgICAvKio8IG51bWJlciBvZiBTQlIgaGVhZGVyIGJpdHMgKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgIHNickRhdGFCaXRzOyAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIFNCUiBkYXRhIGJpdHMgKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgIHNickZpbGxCaXRzOyAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIFNCUiBmaWxsIGJpdHMgKi8KLSAgRkRLX0JJVFNUUkVBTSAgICAgICAgIHNickJpdGJ1ZjsgICAgICAgICAgICAgIC8qKjwgdGhlIFNCUiBkYXRhIGJpdGJ1ZmZlciAqLwotICBGREtfQklUU1RSRUFNICAgICAgICAgdG1wV3JpdGVCaXRidWY7ICAgICAgICAgLyoqPCBoZWxwZXIgdmFyIGZvciB3cml0aW5nIGhlYWRlciovCi0gIElOVCAgICAgICAgICAgICAgICAgICB4T3ZlckZyZXE7ICAgICAgICAgICAgICAvKio8IHRoZSBTQlIgY3Jvc3NvdmVyIGZyZXF1ZW5jeSAqLwotICBJTlQgICAgICAgICAgICAgICAgICAgZHluQndFbmFibGVkOyAgICAgICAgICAgLyoqPCBpbmRpY2F0ZXMgaWYgZHluYW1pYyBiYW5kd2lkdGggaXMgZW5hYmxlZCAqLwotICBJTlQgICAgICAgICAgICAgICAgICAgc2JyTnVtQ2hhbm5lbHM7ICAgICAgICAgLyoqPCBudW1iZXIgb2YgY2hhbm5lbHMgKG1lYW5pbmcgbW9ubyBvciBzdGVyZW8pICovCi0gIElOVCAgICAgICAgICAgICAgICAgICBkeW5YT3ZlckZyZXFFbmM7ICAgICAgICAvKio8IGVuY29kZXIgZHluYW1pYyBjcm9zc292ZXIgZnJlcXVlbmN5ICovCisgIElOVCBzYnJIZHJCaXRzOyAgICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIFNCUiBoZWFkZXIgYml0cyAqLworICBJTlQgc2JyRGF0YUJpdHM7ICAgICAgICAgICAgICAvKio8IG51bWJlciBvZiBTQlIgZGF0YSBiaXRzICovCisgIElOVCBzYnJGaWxsQml0czsgICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIFNCUiBmaWxsIGJpdHMgKi8KKyAgRkRLX0JJVFNUUkVBTSBzYnJCaXRidWY7ICAgICAgLyoqPCB0aGUgU0JSIGRhdGEgYml0YnVmZmVyICovCisgIEZES19CSVRTVFJFQU0gdG1wV3JpdGVCaXRidWY7IC8qKjwgaGVscGVyIHZhciBmb3Igd3JpdGluZyBoZWFkZXIqLworICBJTlQgeE92ZXJGcmVxOyAgICAgICAgICAgICAgICAvKio8IHRoZSBTQlIgY3Jvc3NvdmVyIGZyZXF1ZW5jeSAqLworICBJTlQgZHluQndFbmFibGVkOyAgICAvKio8IGluZGljYXRlcyBpZiBkeW5hbWljIGJhbmR3aWR0aCBpcyBlbmFibGVkICovCisgIElOVCBzYnJOdW1DaGFubmVsczsgIC8qKjwgbnVtYmVyIG9mIGNoYW5uZWxzIChtZWFuaW5nIG1vbm8gb3Igc3RlcmVvKSAqLworICBJTlQgZHluWE92ZXJGcmVxRW5jOyAvKio8IGVuY29kZXIgZHluYW1pYyBjcm9zc292ZXIgZnJlcXVlbmN5ICovCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBDT01NT05fREFUQSAqSEFORExFX0NPTU1PTl9EQVRBOwogCi0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL2NvZGVfZW52LmNwcCBiL2xpYlNCUmVuYy9zcmMvY29kZV9lbnYuY3BwCmluZGV4IGUxYTI4ZDUuLmZiMGY2YTQgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvY29kZV9lbnYuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvY29kZV9lbnYuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDEwICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJjb2RlX2Vudi5oIgotI2luY2x1ZGUgInNicl9yb20uaCIKKyNpbmNsdWRlICJzYnJlbmNfcm9tLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC05MywxMDAgKzExMiw5OCBAQAogIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcyAoSEFORExFX1NCUl9FTlZfREFUQSAgICAgICBzYnJFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSAgaGVudiwKLSAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NPREVfRU5WRUxPUEUgIGhub2lzZSwKLSAgICAgICAgICAgICAgICAgICAgICBBTVBfUkVTICAgICAgICAgICAgICAgICAgIGFtcF9yZXMpCi17Ci0gIGlmICggKCFoZW52KSAgfHwgICghaG5vaXNlKSAgfHwgKCFzYnJFbnZEYXRhKSApCi0gICAgcmV0dXJuICgxKTsgLyogbm90IGluaXQuICovCitJTlQgRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT0RFX0VOVkVMT1BFIGhlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSBobm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUF9SRVMgYW1wX3JlcykgeworICBpZiAoKCFoZW52KSB8fCAoIWhub2lzZSkgfHwgKCFzYnJFbnZEYXRhKSkgcmV0dXJuICgxKTsgLyogbm90IGluaXQuICovCiAKICAgc2JyRW52RGF0YS0+aW5pdF9zYnJfYW1wX3JlcyA9IGFtcF9yZXM7CiAKICAgc3dpdGNoIChhbXBfcmVzKSB7Ci0gIGNhc2UgIFNCUl9BTVBfUkVTXzNfMDoKLSAgICAvKmVudmVsb3BlIGRhdGEqLworICAgIGNhc2UgU0JSX0FNUF9SRVNfM18wOgorICAgICAgLyplbnZlbG9wZSBkYXRhKi8KIAotICAgIC8qTGV2ZWwvUGFuIC0gY29kaW5nICovCi0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lQyAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFUOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsVGltZUwgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDExVDsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUMgPSBib29rU2JyRW52QmFsYW5jZUMxMVQ7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVMID0gYm9va1NickVudkJhbGFuY2VMMTFUOworICAgICAgLypMZXZlbC9QYW4gLSBjb2RpbmcgKi8KKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsVGltZUMgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMVQ7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVMID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVDID0gYm9va1NickVudkJhbGFuY2VDMTFUOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVMID0gYm9va1NickVudkJhbGFuY2VMMTFUOwogCi0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxQyAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsRnJlcUwgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDExRjsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUMgPSBib29rU2JyRW52QmFsYW5jZUMxMUY7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZUZyZXFMID0gYm9va1NickVudkJhbGFuY2VMMTFGOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxQyA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRjsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsRnJlcUwgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUY7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUMgPSBib29rU2JyRW52QmFsYW5jZUMxMUY7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUwgPSBib29rU2JyRW52QmFsYW5jZUwxMUY7CiAKLSAgICAvKlJpZ2h0L0xlZnQgLSBjb2RpbmcgKi8KLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lQyAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMVQ7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUwgICAgICAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRjsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVGcmVxTCAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUY7CisgICAgICAvKlJpZ2h0L0xlZnQgLSBjb2RpbmcgKi8KKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVDID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFUOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUwgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMVQ7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVGcmVxQyA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRjsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFMID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGOwogCi0gICAgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlICA9IENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMTsKLSAgICBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdiAgICAgICAgID0gQ09ERV9CT09LX1NDRl9MQVYxMTsKKyAgICAgIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZSA9IENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMTsKKyAgICAgIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2ID0gQ09ERV9CT09LX1NDRl9MQVYxMTsKIAotICAgIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0cyAgICAgICAgICAgPSBTSV9TQlJfU1RBUlRfRU5WX0JJVFNfQU1QX1JFU18zXzA7Ci0gICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzX2JhbGFuY2UgICA9IFNJX1NCUl9TVEFSVF9FTlZfQklUU19CQUxBTkNFX0FNUF9SRVNfM18wOwotICAgIGJyZWFrOworICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzID0gU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0FNUF9SRVNfM18wOworICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzX2JhbGFuY2UgPQorICAgICAgICAgIFNJX1NCUl9TVEFSVF9FTlZfQklUU19CQUxBTkNFX0FNUF9SRVNfM18wOworICAgICAgYnJlYWs7CiAKLSAgY2FzZSBTQlJfQU1QX1JFU18xXzU6Ci0gICAvKmVudmVsb3BlIGRhdGEqLworICAgIGNhc2UgU0JSX0FNUF9SRVNfMV81OgorICAgICAgLyplbnZlbG9wZSBkYXRhKi8KIAotICAgIC8qTGV2ZWwvUGFuIC0gY29kaW5nICovCi0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lQyAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBUOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsVGltZUwgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwVDsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUMgPSBib29rU2JyRW52QmFsYW5jZUMxMFQ7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVMID0gYm9va1NickVudkJhbGFuY2VMMTBUOworICAgICAgLypMZXZlbC9QYW4gLSBjb2RpbmcgKi8KKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsVGltZUMgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMFQ7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVMID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBUOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVDID0gYm9va1NickVudkJhbGFuY2VDMTBUOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVMID0gYm9va1NickVudkJhbGFuY2VMMTBUOwogCi0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxQyAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBGOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsRnJlcUwgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwRjsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUMgPSBib29rU2JyRW52QmFsYW5jZUMxMEY7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZUZyZXFMID0gYm9va1NickVudkJhbGFuY2VMMTBGOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxQyA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwRjsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsRnJlcUwgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMEY7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUMgPSBib29rU2JyRW52QmFsYW5jZUMxMEY7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUwgPSBib29rU2JyRW52QmFsYW5jZUwxMEY7CiAKLSAgICAvKlJpZ2h0L0xlZnQgLSBjb2RpbmcgKi8KLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lQyAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMFQ7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUwgICAgICAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBUOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwRjsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVGcmVxTCAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMEY7CisgICAgICAvKlJpZ2h0L0xlZnQgLSBjb2RpbmcgKi8KKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVDID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBUOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUwgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMFQ7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVGcmVxQyA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwRjsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFMID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBGOwogCi0gICAgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlID0gQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTEwOwotICAgIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2ID0gQ09ERV9CT09LX1NDRl9MQVYxMDsKKyAgICAgIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZSA9IENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMDsKKyAgICAgIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2ID0gQ09ERV9CT09LX1NDRl9MQVYxMDsKIAotICAgIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0cyAgICAgICAgICAgPSBTSV9TQlJfU1RBUlRfRU5WX0JJVFNfQU1QX1JFU18xXzU7Ci0gICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzX2JhbGFuY2UgICA9IFNJX1NCUl9TVEFSVF9FTlZfQklUU19CQUxBTkNFX0FNUF9SRVNfMV81OwotICAgIGJyZWFrOworICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzID0gU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0FNUF9SRVNfMV81OworICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzX2JhbGFuY2UgPQorICAgICAgICAgIFNJX1NCUl9TVEFSVF9FTlZfQklUU19CQUxBTkNFX0FNUF9SRVNfMV81OworICAgICAgYnJlYWs7CiAKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gKDEpOyAvKiB1bmRlZmluZWQgYW1wX3JlcyBtb2RlICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoMSk7IC8qIHVuZGVmaW5lZCBhbXBfcmVzIG1vZGUgKi8KICAgfQogCiAgIC8qIHRoZXNlIGFyZSBjb21tb24gdG8gYm90aCBhbXBfcmVzIHZhbHVlcyAqLwogICAvKk5vaXNlIGRhdGEqLwogCiAgIC8qTGV2ZWwvUGFuIC0gY29kaW5nICovCi0gIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lQyAgID0gdl9IdWZmX05vaXNlTGV2ZWxDMTFUOwotICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUwgICA9IHZfSHVmZl9Ob2lzZUxldmVsTDExVDsKKyAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVDID0gdl9IdWZmX05vaXNlTGV2ZWxDMTFUOworICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUwgPSB2X0h1ZmZfTm9pc2VMZXZlbEwxMVQ7CiAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZVRpbWVDID0gYm9va1Nick5vaXNlQmFsYW5jZUMxMVQ7CiAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZVRpbWVMID0gYm9va1Nick5vaXNlQmFsYW5jZUwxMVQ7CiAKLSAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbEZyZXFDICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUY7Ci0gIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGOworICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsRnJlcUMgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUY7CisgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxTCA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDExRjsKICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUMgPSBib29rU2JyRW52QmFsYW5jZUMxMUY7CiAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZUZyZXFMID0gYm9va1NickVudkJhbGFuY2VMMTFGOwogCi0KICAgLypSaWdodC9MZWZ0IC0gY29kaW5nICovCi0gIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlVGltZUMgICAgICAgID0gdl9IdWZmX05vaXNlTGV2ZWxDMTFUOwotICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZVRpbWVMICAgICAgICA9IHZfSHVmZl9Ob2lzZUxldmVsTDExVDsKLSAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VGcmVxQyAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUY7Ci0gIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlRnJlcUwgICAgICAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGOworICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZVRpbWVDID0gdl9IdWZmX05vaXNlTGV2ZWxDMTFUOworICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZVRpbWVMID0gdl9IdWZmX05vaXNlTGV2ZWxMMTFUOworICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUZyZXFDID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGOworICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUZyZXFMID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGOwogCi0gIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9ub2lzZV9iaXRzICAgICAgICAgPSBTSV9TQlJfU1RBUlRfTk9JU0VfQklUU19BTVBfUkVTXzNfMDsKLSAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHNfYmFsYW5jZSA9IFNJX1NCUl9TVEFSVF9OT0lTRV9CSVRTX0JBTEFOQ0VfQU1QX1JFU18zXzA7Ci0KKyAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHMgPSBTSV9TQlJfU1RBUlRfTk9JU0VfQklUU19BTVBfUkVTXzNfMDsKKyAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHNfYmFsYW5jZSA9CisgICAgICBTSV9TQlJfU1RBUlRfTk9JU0VfQklUU19CQUxBTkNFX0FNUF9SRVNfM18wOwogCiAgIC8qIGluaXQgZW52ZWxvcGUgdGFibGVzIGFuZCBjb2RlYm9va3MgKi8KICAgaGVudi0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSA9IHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZTsKQEAgLTIwOSw3ICsyMjYsNiBAQAogICBoZW52LT5zdGFydF9iaXRzID0gc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzOwogICBoZW52LT5zdGFydF9iaXRzX2JhbGFuY2UgPSBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHNfYmFsYW5jZTsKIAotCiAgIC8qIGluaXQgbm9pc2UgdGFibGVzIGFuZCBjb2RlYm9va3MgKi8KIAogICBobm9pc2UtPmNvZGVCb29rU2NmTGF2QmFsYW5jZVRpbWUgPSBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTE7CkBAIC0yMjYsMTQgKzI0MiwxNCBAQAogICBobm9pc2UtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTCA9IHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZUZyZXFMOwogICBobm9pc2UtPmh1ZmZ0YWJsZUZyZXFMID0gc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VGcmVxTDsKIAotCiAgIGhub2lzZS0+c3RhcnRfYml0cyA9IHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9ub2lzZV9iaXRzOwogICBobm9pc2UtPnN0YXJ0X2JpdHNfYmFsYW5jZSA9IHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9ub2lzZV9iaXRzX2JhbGFuY2U7CiAKLSAgLyogTm8gZGVsdGEgY29kaW5nIGluIHRpbWUgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUgZHVlIHRvIDEuNWRCIEZJeC1GSVggcnVsZSAqLworICAvKiBObyBkZWx0YSBjb2RpbmcgaW4gdGltZSBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZSBkdWUgdG8gMS41ZEIgRkl4LUZJWCBydWxlCisgICAqLwogICBoZW52LT51cERhdGUgPSAwOwogICBobm9pc2UtPnVwRGF0ZSA9IDA7Ci0gIHJldHVybiAgKDApOworICByZXR1cm4gKDApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjQ4LDMzICsyNjQsMjQgQEAKICBSZXR1cm46ICAgICAgICBJTlQKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgaW5kZXhMb3cySGlnaChJTlQgb2Zmc2V0LCBJTlQgaW5kZXgsIEZSRVFfUkVTIHJlcykKLXsKLQotICBpZihyZXMgPT0gRlJFUV9SRVNfTE9XKQotICB7Ci0gICAgaWYgKG9mZnNldCA+PSAwKQotICAgIHsKLSAgICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQotICAgICAgICAgIHJldHVybihpbmRleCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4oMippbmRleCAtIG9mZnNldCk7CitzdGF0aWMgSU5UIGluZGV4TG93MkhpZ2goSU5UIG9mZnNldCwgSU5UIGluZGV4LCBGUkVRX1JFUyByZXMpIHsKKyAgaWYgKHJlcyA9PSBGUkVRX1JFU19MT1cpIHsKKyAgICBpZiAob2Zmc2V0ID49IDApIHsKKyAgICAgIGlmIChpbmRleCA8IG9mZnNldCkKKyAgICAgICAgcmV0dXJuIChpbmRleCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAoMiAqIGluZGV4IC0gb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKKyAgICAgIGlmIChpbmRleCA8IG9mZnNldCkKKyAgICAgICAgcmV0dXJuICgyICogaW5kZXggKyBpbmRleCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAoMiAqIGluZGV4ICsgb2Zmc2V0KTsKICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKLSAgICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQotICAgICAgICAgIHJldHVybigyKmluZGV4K2luZGV4KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHJldHVybigyKmluZGV4ICsgb2Zmc2V0KTsKLSAgICB9Ci0gIH0KLSAgZWxzZQotICAgIHJldHVybihpbmRleCk7CisgIH0gZWxzZQorICAgIHJldHVybiAoaW5kZXgpOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBtYXBMb3dSZXNFbmVyZ3lWYWwKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yODYsNDMgKzI5MywzMSBAQAogIFJldHVybjogICAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIG1hcExvd1Jlc0VuZXJneVZhbChTQ0hBUiBjdXJyVmFsLCBTQ0hBUiogcHJldkRhdGEsIElOVCBvZmZzZXQsIElOVCBpbmRleCwgRlJFUV9SRVMgcmVzKQotewotCi0gIGlmKHJlcyA9PSBGUkVRX1JFU19MT1cpCi0gIHsKLSAgICBpZiAob2Zmc2V0ID49IDApCi0gICAgewotICAgICAgICBpZihpbmRleCA8IG9mZnNldCkKLSAgICAgICAgICAgIHByZXZEYXRhW2luZGV4XSA9IGN1cnJWYWw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJldkRhdGFbMippbmRleCAtIG9mZnNldF0gPSBjdXJyVmFsOwotICAgICAgICAgICAgcHJldkRhdGFbMippbmRleCsxIC0gb2Zmc2V0XSA9IGN1cnJWYWw7Ci0gICAgICAgIH0KK3N0YXRpYyB2b2lkIG1hcExvd1Jlc0VuZXJneVZhbChTQ0hBUiBjdXJyVmFsLCBTQ0hBUiAqcHJldkRhdGEsIElOVCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGluZGV4LCBGUkVRX1JFUyByZXMpIHsKKyAgaWYgKHJlcyA9PSBGUkVRX1JFU19MT1cpIHsKKyAgICBpZiAob2Zmc2V0ID49IDApIHsKKyAgICAgIGlmIChpbmRleCA8IG9mZnNldCkKKyAgICAgICAgcHJldkRhdGFbaW5kZXhdID0gY3VyclZhbDsKKyAgICAgIGVsc2UgeworICAgICAgICBwcmV2RGF0YVsyICogaW5kZXggLSBvZmZzZXRdID0gY3VyclZhbDsKKyAgICAgICAgcHJldkRhdGFbMiAqIGluZGV4ICsgMSAtIG9mZnNldF0gPSBjdXJyVmFsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBvZmZzZXQgPSAtb2Zmc2V0OworICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KSB7CisgICAgICAgIHByZXZEYXRhWzMgKiBpbmRleF0gPSBjdXJyVmFsOworICAgICAgICBwcmV2RGF0YVszICogaW5kZXggKyAxXSA9IGN1cnJWYWw7CisgICAgICAgIHByZXZEYXRhWzMgKiBpbmRleCArIDJdID0gY3VyclZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByZXZEYXRhWzIgKiBpbmRleCArIG9mZnNldF0gPSBjdXJyVmFsOworICAgICAgICBwcmV2RGF0YVsyICogaW5kZXggKyAxICsgb2Zmc2V0XSA9IGN1cnJWYWw7CisgICAgICB9CiAgICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7Ci0gICAgICAgIGlmIChpbmRleCA8IG9mZnNldCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJldkRhdGFbMyppbmRleF0gPSBjdXJyVmFsOwotICAgICAgICAgICAgcHJldkRhdGFbMyppbmRleCsxXSA9IGN1cnJWYWw7Ci0gICAgICAgICAgICBwcmV2RGF0YVszKmluZGV4KzJdID0gY3VyclZhbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZXZEYXRhWzIqaW5kZXggKyBvZmZzZXRdID0gY3VyclZhbDsKLSAgICAgICAgICAgIHByZXZEYXRhWzIqaW5kZXggKyAxICsgb2Zmc2V0XSA9IGN1cnJWYWw7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZWxzZQorICB9IGVsc2UKICAgICBwcmV2RGF0YVtpbmRleF0gPSBjdXJyVmFsOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBjb21wdXRlQml0cwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMzOCwzNiArMzMzLDMxIEBACiAgUmV0dXJuOiAgICAgICAgSU5UCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1jb21wdXRlQml0cyAoU0NIQVIgKmRlbHRhLAotICAgICAgICAgICAgIElOVCBjb2RlQm9va1NjZkxhdkxldmVsLAotICAgICAgICAgICAgIElOVCBjb2RlQm9va1NjZkxhdkJhbGFuY2UsCi0gICAgICAgICAgICAgY29uc3QgVUNIQVIgKiBodWZmdGFibGVMZXZlbCwKLSAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqIGh1ZmZ0YWJsZUJhbGFuY2UsIElOVCBjb3VwbGluZywgSU5UIGNoYW5uZWwpCi17CitzdGF0aWMgSU5UIGNvbXB1dGVCaXRzKFNDSEFSICpkZWx0YSwgSU5UIGNvZGVCb29rU2NmTGF2TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIElOVCBjb2RlQm9va1NjZkxhdkJhbGFuY2UsIGNvbnN0IFVDSEFSICpodWZmdGFibGVMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZUJhbGFuY2UsIElOVCBjb3VwbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW5uZWwpIHsKICAgSU5UIGluZGV4OwogICBJTlQgZGVsdGFfYml0cyA9IDA7CiAKICAgaWYgKGNvdXBsaW5nKSB7Ci0gICAgaWYgKGNoYW5uZWwgPT0gMSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCpkZWx0YSA8IDApCi0gICAgICAgICAgaW5kZXggPSBmaXhNYXgoKmRlbHRhLCAtY29kZUJvb2tTY2ZMYXZCYWxhbmNlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGluZGV4ID0gZml4TWluKCpkZWx0YSwgIGNvZGVCb29rU2NmTGF2QmFsYW5jZSk7CisgICAgaWYgKGNoYW5uZWwgPT0gMSkgeworICAgICAgaWYgKCpkZWx0YSA8IDApCisgICAgICAgIGluZGV4ID0gZml4TWF4KCpkZWx0YSwgLWNvZGVCb29rU2NmTGF2QmFsYW5jZSk7CisgICAgICBlbHNlCisgICAgICAgIGluZGV4ID0gZml4TWluKCpkZWx0YSwgY29kZUJvb2tTY2ZMYXZCYWxhbmNlKTsKIAotICAgICAgICBpZiAoaW5kZXggIT0gKmRlbHRhKSB7Ci0gICAgICAgICAgKmRlbHRhID0gaW5kZXg7Ci0gICAgICAgICAgcmV0dXJuICgxMDAwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWx0YV9iaXRzID0gaHVmZnRhYmxlQmFsYW5jZVtpbmRleCArIGNvZGVCb29rU2NmTGF2QmFsYW5jZV07CisgICAgICBpZiAoaW5kZXggIT0gKmRlbHRhKSB7CisgICAgICAgICpkZWx0YSA9IGluZGV4OworICAgICAgICByZXR1cm4gKDEwMDAwKTsKICAgICAgIH0KLSAgICBlbHNlIHsKKworICAgICAgZGVsdGFfYml0cyA9IGh1ZmZ0YWJsZUJhbGFuY2VbaW5kZXggKyBjb2RlQm9va1NjZkxhdkJhbGFuY2VdOworICAgIH0gZWxzZSB7CiAgICAgICBpZiAoKmRlbHRhIDwgMCkKICAgICAgICAgaW5kZXggPSBmaXhNYXgoKmRlbHRhLCAtY29kZUJvb2tTY2ZMYXZMZXZlbCk7CiAgICAgICBlbHNlCi0gICAgICAgIGluZGV4ID0gZml4TWluKCpkZWx0YSwgIGNvZGVCb29rU2NmTGF2TGV2ZWwpOworICAgICAgICBpbmRleCA9IGZpeE1pbigqZGVsdGEsIGNvZGVCb29rU2NmTGF2TGV2ZWwpOwogCiAgICAgICBpZiAoaW5kZXggIT0gKmRlbHRhKSB7CiAgICAgICAgICpkZWx0YSA9IGluZGV4OwpAQCAtMzc1LDEyICszNjUsMTEgQEAKICAgICAgIH0KICAgICAgIGRlbHRhX2JpdHMgPSBodWZmdGFibGVMZXZlbFtpbmRleCArIGNvZGVCb29rU2NmTGF2TGV2ZWxdOwogICAgIH0KLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBpZiAoKmRlbHRhIDwgMCkKICAgICAgIGluZGV4ID0gZml4TWF4KCpkZWx0YSwgLWNvZGVCb29rU2NmTGF2TGV2ZWwpOwogICAgIGVsc2UKLSAgICAgIGluZGV4ID0gZml4TWluKCpkZWx0YSwgIGNvZGVCb29rU2NmTGF2TGV2ZWwpOworICAgICAgaW5kZXggPSBmaXhNaW4oKmRlbHRhLCBjb2RlQm9va1NjZkxhdkxldmVsKTsKIAogICAgIGlmIChpbmRleCAhPSAqZGVsdGEpIHsKICAgICAgICpkZWx0YSA9IGluZGV4OwpAQCAtMzkyLDkgKzM4MSw2IEBACiAgIHJldHVybiAoZGVsdGFfYml0cyk7CiB9CiAKLQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQxNCwxOCArNDAwLDEyIEBACiAgICAgICAgICAgICAgICAgKmRpcmVjdGlvblZlYyBpcyBtb2RpZmllZAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShTQ0hBUiAgICAgICAgICAgICAqc2ZiX25yZywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlJFUV9SRVMgICAgKmZyZXFfcmVzLAotICAgICAgICAgICAgICAgICAgICAgICBTQlJfQ09ERV9FTlZFTE9QRSAqaF9zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICpkaXJlY3Rpb25WZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBjb3VwbGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgIG5FbnZlbG9wZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgaGVhZGVyQWN0aXZlKQotewordm9pZCBGREtzYnJFbmNfY29kZUVudmVsb3BlKFNDSEFSICpzZmJfbnJnLCBjb25zdCBGUkVRX1JFUyAqZnJlcV9yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0NPREVfRU5WRUxPUEUgKmhfc2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqZGlyZWN0aW9uVmVjLCBJTlQgY291cGxpbmcsIElOVCBuRW52ZWxvcGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFubmVsLCBJTlQgaGVhZGVyQWN0aXZlKSB7CiAgIElOVCBpLCBub19vZl9iYW5kcywgYmFuZDsKLSAgRklYUF9EQkwgdG1wMSx0bXAyLHRtcDMsZEZfZWRnZV8xc3RFbnY7CisgIEZJWFBfREJMIHRtcDEsIHRtcDIsIHRtcDMsIGRGX2VkZ2VfMXN0RW52OwogICBTQ0hBUiAqcHRyX25yZzsKIAogICBJTlQgY29kZUJvb2tTY2ZMYXZMZXZlbFRpbWU7CkBAIC00NDcsOSArNDI3LDEwIEBACiAgIFNDSEFSIGRlbHRhX1RbTUFYX0ZSRVFfQ09FRkZTXTsKICAgU0NIQVIgbGFzdF9ucmcsIGN1cnJfbnJnOwogCi0gIHRtcDEgPSBGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiAoREZSQUNUX0JJVFMtMTYtMSk7Ci0gIHRtcDIgPSBoX3NickNvZGVFbnZlbG9wZS0+ZEZfZWRnZV8xc3RFbnYgPj4gKERGUkFDVF9CSVRTLTE2KTsKLSAgdG1wMyA9IChGSVhQX0RCTCkoKChJTlQpKExPTkcpaF9zYnJDb2RlRW52ZWxvcGUtPmRGX2VkZ2VfaW5jcipoX3NickNvZGVFbnZlbG9wZS0+ZEZfZWRnZV9pbmNyX2ZhYykgPj4gKERGUkFDVF9CSVRTLTE2KSk7CisgIHRtcDEgPSBGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiAoREZSQUNUX0JJVFMgLSAxNiAtIDEpOworICB0bXAyID0gaF9zYnJDb2RlRW52ZWxvcGUtPmRGX2VkZ2VfMXN0RW52ID4+IChERlJBQ1RfQklUUyAtIDE2KTsKKyAgdG1wMyA9IChGSVhQX0RCTClmTXVsdChoX3NickNvZGVFbnZlbG9wZS0+ZEZfZWRnZV9pbmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICgoRklYUF9EQkwpaF9zYnJDb2RlRW52ZWxvcGUtPmRGX2VkZ2VfaW5jcl9mYWMpIDw8IDE1KTsKIAogICBkRl9lZGdlXzFzdEVudiA9IHRtcDEgKyB0bXAyICsgdG1wMzsKIApAQCAtNDYyLDggKzQ0Myw3IEBACiAgICAgaHVmZnRhYmxlQmFsYW5jZVRpbWVMID0gaF9zYnJDb2RlRW52ZWxvcGUtPmh1ZmZ0YWJsZUJhbGFuY2VUaW1lTDsKICAgICBodWZmdGFibGVMZXZlbEZyZXFMID0gaF9zYnJDb2RlRW52ZWxvcGUtPmh1ZmZ0YWJsZUxldmVsRnJlcUw7CiAgICAgaHVmZnRhYmxlQmFsYW5jZUZyZXFMID0gaF9zYnJDb2RlRW52ZWxvcGUtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBjb2RlQm9va1NjZkxhdkxldmVsVGltZSA9IGhfc2JyQ29kZUVudmVsb3BlLT5jb2RlQm9va1NjZkxhdlRpbWU7CiAgICAgY29kZUJvb2tTY2ZMYXZMZXZlbEZyZXEgPSBoX3NickNvZGVFbnZlbG9wZS0+Y29kZUJvb2tTY2ZMYXZGcmVxOwogICAgIGNvZGVCb29rU2NmTGF2QmFsYW5jZVRpbWUgPSBoX3NickNvZGVFbnZlbG9wZS0+Y29kZUJvb2tTY2ZMYXZUaW1lOwpAQCAtNDc0LDI4ICs0NTQsMjMgQEAKICAgICBodWZmdGFibGVCYWxhbmNlRnJlcUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlRnJlcUw7CiAgIH0KIAotICBpZihjb3VwbGluZyA9PSAxICYmIGNoYW5uZWwgPT0gMSkKLSAgICBlbnZEYXRhVGFibGVDb21wRmFjdG9yID0gMTsgICAgICAgLypzaG91bGQgYmUgb25lIHdoZW4gdGhlIG5ldyBodWZmbWFuLXRhYmxlcyBhcmUgcmVhZHkqLworICBpZiAoY291cGxpbmcgPT0gMSAmJiBjaGFubmVsID09IDEpCisgICAgZW52RGF0YVRhYmxlQ29tcEZhY3RvciA9CisgICAgICAgIDE7IC8qc2hvdWxkIGJlIG9uZSB3aGVuIHRoZSBuZXcgaHVmZm1hbi10YWJsZXMgYXJlIHJlYWR5Ki8KICAgZWxzZQogICAgIGVudkRhdGFUYWJsZUNvbXBGYWN0b3IgPSAwOwogCi0KLSAgaWYgKGhfc2JyQ29kZUVudmVsb3BlLT5kZWx0YVRBY3Jvc3NGcmFtZXMgPT0gMCkKLSAgICBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMDsKKyAgaWYgKGhfc2JyQ29kZUVudmVsb3BlLT5kZWx0YVRBY3Jvc3NGcmFtZXMgPT0gMCkgaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSA9IDA7CiAKICAgLyogbm8gZGVsdGEgY29kaW5nIGluIHRpbWUgaW4gY2FzZSBvZiBhIGhlYWRlciAqLwotICBpZiAoaGVhZGVyQWN0aXZlKQotICAgIGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgPSAwOworICBpZiAoaGVhZGVyQWN0aXZlKSBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMDsKIAotCi0gIGZvciAoaSA9IDA7IGkgPCBuRW52ZWxvcGVzOyBpKyspCi0gIHsKKyAgZm9yIChpID0gMDsgaSA8IG5FbnZlbG9wZXM7IGkrKykgewogICAgIGlmIChmcmVxX3Jlc1tpXSA9PSBGUkVRX1JFU19ISUdIKQogICAgICAgbm9fb2ZfYmFuZHMgPSBoX3NickNvZGVFbnZlbG9wZS0+blNmYltGUkVRX1JFU19ISUdIXTsKICAgICBlbHNlCiAgICAgICBub19vZl9iYW5kcyA9IGhfc2JyQ29kZUVudmVsb3BlLT5uU2ZiW0ZSRVFfUkVTX0xPV107CiAKLQogICAgIHB0cl9ucmcgPSBzZmJfbnJnOwogICAgIGN1cnJfbnJnID0gKnB0cl9ucmc7CiAKQEAgLTUwNiwxMDcgKzQ4MSw5NiBAQAogICAgIGVsc2UKICAgICAgIGRlbHRhX0ZfYml0cyA9IGhfc2JyQ29kZUVudmVsb3BlLT5zdGFydF9iaXRzOwogCisgICAgaWYgKGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgIT0gMCkgeworICAgICAgZGVsdGFfVFswXSA9IChjdXJyX25yZyAtIGhfc2JyQ29kZUVudmVsb3BlLT5zZmJfbnJnX3ByZXZbMF0pID4+CisgICAgICAgICAgICAgICAgICAgZW52RGF0YVRhYmxlQ29tcEZhY3RvcjsKIAotICAgIGlmKGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgIT0gMCkKLSAgICB7Ci0gICAgICBkZWx0YV9UWzBdID0gKGN1cnJfbnJnIC0gaF9zYnJDb2RlRW52ZWxvcGUtPnNmYl9ucmdfcHJldlswXSkgPj4gZW52RGF0YVRhYmxlQ29tcEZhY3RvcjsKLQotICAgICAgZGVsdGFfVF9iaXRzID0gY29tcHV0ZUJpdHMgKCZkZWx0YV9UWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVCb29rU2NmTGF2TGV2ZWxUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVCb29rU2NmTGF2QmFsYW5jZVRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZnRhYmxlTGV2ZWxUaW1lTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmdGFibGVCYWxhbmNlVGltZUwsIGNvdXBsaW5nLCBjaGFubmVsKTsKKyAgICAgIGRlbHRhX1RfYml0cyA9IGNvbXB1dGVCaXRzKCZkZWx0YV9UWzBdLCBjb2RlQm9va1NjZkxhdkxldmVsVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVCb29rU2NmTGF2QmFsYW5jZVRpbWUsIGh1ZmZ0YWJsZUxldmVsVGltZUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmdGFibGVCYWxhbmNlVGltZUwsIGNvdXBsaW5nLCBjaGFubmVsKTsKICAgICB9CiAKLQotICAgIG1hcExvd1Jlc0VuZXJneVZhbChjdXJyX25yZywgaF9zYnJDb2RlRW52ZWxvcGUtPnNmYl9ucmdfcHJldiwgb2Zmc2V0LCAwLCBmcmVxX3Jlc1tpXSk7CisgICAgbWFwTG93UmVzRW5lcmd5VmFsKGN1cnJfbnJnLCBoX3NickNvZGVFbnZlbG9wZS0+c2ZiX25yZ19wcmV2LCBvZmZzZXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIGZyZXFfcmVzW2ldKTsKIAogICAgIC8qIGVuc3VyZSB0aGF0IG5yZyBkaWZmZXJlbmNlIGlzIG5vdCBoaWdoZXIgdGhhbiBjb2RlQm9va1NjZkxhdlhYWEZyZXEgKi8KLSAgICBpZiAoIGNvdXBsaW5nICYmIGNoYW5uZWwgPT0gMSApIHsKKyAgICBpZiAoY291cGxpbmcgJiYgY2hhbm5lbCA9PSAxKSB7CiAgICAgICBmb3IgKGJhbmQgPSBub19vZl9iYW5kcyAtIDE7IGJhbmQgPiAwOyBiYW5kLS0pIHsKLSAgICAgICAgaWYgKCBwdHJfbnJnW2JhbmRdIC0gcHRyX25yZ1tiYW5kLTFdID4gY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcSApIHsKLSAgICAgICAgICBwdHJfbnJnW2JhbmQtMV0gPSBwdHJfbnJnW2JhbmRdIC0gY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcTsKKyAgICAgICAgaWYgKHB0cl9ucmdbYmFuZF0gLSBwdHJfbnJnW2JhbmQgLSAxXSA+IGNvZGVCb29rU2NmTGF2QmFsYW5jZUZyZXEpIHsKKyAgICAgICAgICBwdHJfbnJnW2JhbmQgLSAxXSA9IHB0cl9ucmdbYmFuZF0gLSBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBmb3IgKGJhbmQgPSAxOyBiYW5kIDwgbm9fb2ZfYmFuZHM7IGJhbmQrKykgewotICAgICAgICBpZiAoIHB0cl9ucmdbYmFuZC0xXSAtIHB0cl9ucmdbYmFuZF0gPiBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxICkgewotICAgICAgICAgIHB0cl9ucmdbYmFuZF0gPSBwdHJfbnJnW2JhbmQtMV0gLSBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxOworICAgICAgICBpZiAocHRyX25yZ1tiYW5kIC0gMV0gLSBwdHJfbnJnW2JhbmRdID4gY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcSkgeworICAgICAgICAgIHB0cl9ucmdbYmFuZF0gPSBwdHJfbnJnW2JhbmQgLSAxXSAtIGNvZGVCb29rU2NmTGF2QmFsYW5jZUZyZXE7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIGZvciAoYmFuZCA9IG5vX29mX2JhbmRzIC0gMTsgYmFuZCA+IDA7IGJhbmQtLSkgewotICAgICAgICBpZiAoIHB0cl9ucmdbYmFuZF0gLSBwdHJfbnJnW2JhbmQtMV0gPiBjb2RlQm9va1NjZkxhdkxldmVsRnJlcSApIHsKLSAgICAgICAgICBwdHJfbnJnW2JhbmQtMV0gPSBwdHJfbnJnW2JhbmRdIC0gY29kZUJvb2tTY2ZMYXZMZXZlbEZyZXE7CisgICAgICAgIGlmIChwdHJfbnJnW2JhbmRdIC0gcHRyX25yZ1tiYW5kIC0gMV0gPiBjb2RlQm9va1NjZkxhdkxldmVsRnJlcSkgeworICAgICAgICAgIHB0cl9ucmdbYmFuZCAtIDFdID0gcHRyX25yZ1tiYW5kXSAtIGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBmb3IgKGJhbmQgPSAxOyBiYW5kIDwgbm9fb2ZfYmFuZHM7IGJhbmQrKykgewotICAgICAgICBpZiAoIHB0cl9ucmdbYmFuZC0xXSAtIHB0cl9ucmdbYmFuZF0gPiBjb2RlQm9va1NjZkxhdkxldmVsRnJlcSApIHsKLSAgICAgICAgICBwdHJfbnJnW2JhbmRdID0gcHRyX25yZ1tiYW5kLTFdIC0gY29kZUJvb2tTY2ZMYXZMZXZlbEZyZXE7CisgICAgICAgIGlmIChwdHJfbnJnW2JhbmQgLSAxXSAtIHB0cl9ucmdbYmFuZF0gPiBjb2RlQm9va1NjZkxhdkxldmVsRnJlcSkgeworICAgICAgICAgIHB0cl9ucmdbYmFuZF0gPSBwdHJfbnJnW2JhbmQgLSAxXSAtIGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogCi0KICAgICAvKiBDb2RpbmcgbG9vcCovCi0gICAgZm9yIChiYW5kID0gMTsgYmFuZCA8IG5vX29mX2JhbmRzOyBiYW5kKyspCi0gICAgeworICAgIGZvciAoYmFuZCA9IDE7IGJhbmQgPCBub19vZl9iYW5kczsgYmFuZCsrKSB7CiAgICAgICBsYXN0X25yZyA9ICgqcHRyX25yZyk7CiAgICAgICBwdHJfbnJnKys7CiAgICAgICBjdXJyX25yZyA9ICgqcHRyX25yZyk7CiAKICAgICAgIGRlbHRhX0ZbYmFuZF0gPSAoY3Vycl9ucmcgLSBsYXN0X25yZykgPj4gZW52RGF0YVRhYmxlQ29tcEZhY3RvcjsKIAotICAgICAgZGVsdGFfRl9iaXRzICs9IGNvbXB1dGVCaXRzICgmZGVsdGFfRltiYW5kXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZMZXZlbEZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVCb29rU2NmTGF2QmFsYW5jZUZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZ0YWJsZUxldmVsRnJlcUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZ0YWJsZUJhbGFuY2VGcmVxTCwgY291cGxpbmcsIGNoYW5uZWwpOworICAgICAgZGVsdGFfRl9iaXRzICs9IGNvbXB1dGVCaXRzKAorICAgICAgICAgICZkZWx0YV9GW2JhbmRdLCBjb2RlQm9va1NjZkxhdkxldmVsRnJlcSwgY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcSwKKyAgICAgICAgICBodWZmdGFibGVMZXZlbEZyZXFMLCBodWZmdGFibGVCYWxhbmNlRnJlcUwsIGNvdXBsaW5nLCBjaGFubmVsKTsKIAotICAgICAgaWYoaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwKQotICAgICAgewotICAgICAgICBkZWx0YV9UW2JhbmRdID0gY3Vycl9ucmcgLSBoX3NickNvZGVFbnZlbG9wZS0+c2ZiX25yZ19wcmV2W2luZGV4TG93MkhpZ2gob2Zmc2V0LCBiYW5kLCBmcmVxX3Jlc1tpXSldOworICAgICAgaWYgKGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgIT0gMCkgeworICAgICAgICBkZWx0YV9UW2JhbmRdID0KKyAgICAgICAgICAgIGN1cnJfbnJnIC0KKyAgICAgICAgICAgIGhfc2JyQ29kZUVudmVsb3BlCisgICAgICAgICAgICAgICAgLT5zZmJfbnJnX3ByZXZbaW5kZXhMb3cySGlnaChvZmZzZXQsIGJhbmQsIGZyZXFfcmVzW2ldKV07CiAgICAgICAgIGRlbHRhX1RbYmFuZF0gPSBkZWx0YV9UW2JhbmRdID4+IGVudkRhdGFUYWJsZUNvbXBGYWN0b3I7CiAgICAgICB9CiAKLSAgICAgIG1hcExvd1Jlc0VuZXJneVZhbChjdXJyX25yZywgaF9zYnJDb2RlRW52ZWxvcGUtPnNmYl9ucmdfcHJldiwgb2Zmc2V0LCBiYW5kLCBmcmVxX3Jlc1tpXSk7CisgICAgICBtYXBMb3dSZXNFbmVyZ3lWYWwoY3Vycl9ucmcsIGhfc2JyQ29kZUVudmVsb3BlLT5zZmJfbnJnX3ByZXYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLCBmcmVxX3Jlc1tpXSk7CiAKLSAgICAgIGlmKGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgZGVsdGFfVF9iaXRzICs9IGNvbXB1dGVCaXRzICgmZGVsdGFfVFtiYW5kXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlQm9va1NjZkxhdkxldmVsVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlQm9va1NjZkxhdkJhbGFuY2VUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZ0YWJsZUxldmVsVGltZUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZnRhYmxlQmFsYW5jZVRpbWVMLCBjb3VwbGluZywgY2hhbm5lbCk7CisgICAgICBpZiAoaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwKSB7CisgICAgICAgIGRlbHRhX1RfYml0cyArPSBjb21wdXRlQml0cygKKyAgICAgICAgICAgICZkZWx0YV9UW2JhbmRdLCBjb2RlQm9va1NjZkxhdkxldmVsVGltZSwgY29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSwKKyAgICAgICAgICAgIGh1ZmZ0YWJsZUxldmVsVGltZUwsIGh1ZmZ0YWJsZUJhbGFuY2VUaW1lTCwgY291cGxpbmcsIGNoYW5uZWwpOwogICAgICAgfQogICAgIH0KIAogICAgIC8qIFJlcGxhY2Ugc2ZiX25yZyB3aXRoIGRlbHRhY29kZWQgc2FtcGxlcyBhbmQgc2V0IGZsYWcgKi8KICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICBJTlQgdG1wX2JpdHM7Ci0gICAgICB0bXBfYml0cyA9ICgoKGRlbHRhX1RfYml0cyAqIGRGX2VkZ2VfMXN0RW52KSA+PiAoREZSQUNUX0JJVFMtMTgpKSArIChGSVhQX0RCTCkxKSA+PiAxOworICAgICAgdG1wX2JpdHMgPSAoKChkZWx0YV9UX2JpdHMgKiBkRl9lZGdlXzFzdEVudikgPj4gKERGUkFDVF9CSVRTIC0gMTgpKSArCisgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpMSkgPj4KKyAgICAgICAgICAgICAgICAgMTsKICAgICAgIHVzZV9kVCA9IChoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlICE9IDAgJiYgKGRlbHRhX0ZfYml0cyA+IHRtcF9iaXRzKSk7Ci0gICAgfQotICAgIGVsc2UKKyAgICB9IGVsc2UKICAgICAgIHVzZV9kVCA9IChkZWx0YV9UX2JpdHMgPCBkZWx0YV9GX2JpdHMgJiYgaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwKTsKIAotICAgIGlmICh1c2VfZFQpCi0gICAgeworICAgIGlmICh1c2VfZFQpIHsKICAgICAgIGRpcmVjdGlvblZlY1tpXSA9IFRJTUU7Ci0gICAgICBGREttZW1jcHkgKHNmYl9ucmcsIGRlbHRhX1QsIG5vX29mX2JhbmRzICogc2l6ZW9mIChTQ0hBUikpOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICAgIEZES21lbWNweShzZmJfbnJnLCBkZWx0YV9ULCBub19vZl9iYW5kcyAqIHNpemVvZihTQ0hBUikpOworICAgIH0gZWxzZSB7CiAgICAgICBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMDsKICAgICAgIGRpcmVjdGlvblZlY1tpXSA9IEZSRVE7Ci0gICAgICBGREttZW1jcHkgKHNmYl9ucmcsIGRlbHRhX0YsIG5vX29mX2JhbmRzICogc2l6ZW9mIChTQ0hBUikpOworICAgICAgRkRLbWVtY3B5KHNmYl9ucmcsIGRlbHRhX0YsIG5vX29mX2JhbmRzICogc2l6ZW9mKFNDSEFSKSk7CiAgICAgfQogICAgIHNmYl9ucmcgKz0gbm9fb2ZfYmFuZHM7CiAgICAgaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSA9IDE7CiAgIH0KLQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX0luaXRTYnJDb2RlRW52ZWxvcGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02MTgsMTUgKzU4MiwxMSBAQAogIFJldHVybjoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX0luaXRTYnJDb2RlRW52ZWxvcGUgKEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSAgaF9zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAqblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRlbHRhVEFjcm9zc0ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZEZfZWRnZV8xc3RFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGRGX2VkZ2VfaW5jcikKLXsKLQotICBGREttZW1jbGVhcihoX3NickNvZGVFbnZlbG9wZSxzaXplb2YoU0JSX0NPREVfRU5WRUxPUEUpKTsKK0lOVCBGREtzYnJFbmNfSW5pdFNickNvZGVFbnZlbG9wZShIQU5ETEVfU0JSX0NPREVfRU5WRUxPUEUgaF9zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpuU2ZiLCBJTlQgZGVsdGFUQWNyb3NzRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGRGX2VkZ2VfMXN0RW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGRGX2VkZ2VfaW5jcikgeworICBGREttZW1jbGVhcihoX3NickNvZGVFbnZlbG9wZSwgc2l6ZW9mKFNCUl9DT0RFX0VOVkVMT1BFKSk7CiAKICAgaF9zYnJDb2RlRW52ZWxvcGUtPmRlbHRhVEFjcm9zc0ZyYW1lcyA9IGRlbHRhVEFjcm9zc0ZyYW1lczsKICAgaF9zYnJDb2RlRW52ZWxvcGUtPmRGX2VkZ2VfMXN0RW52ID0gZEZfZWRnZV8xc3RFbnY7CkBAIC02MzUsNyArNTk1LDggQEAKICAgaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSA9IDA7CiAgIGhfc2JyQ29kZUVudmVsb3BlLT5uU2ZiW0ZSRVFfUkVTX0xPV10gPSBuU2ZiW0ZSRVFfUkVTX0xPV107CiAgIGhfc2JyQ29kZUVudmVsb3BlLT5uU2ZiW0ZSRVFfUkVTX0hJR0hdID0gblNmYltGUkVRX1JFU19ISUdIXTsKLSAgaF9zYnJDb2RlRW52ZWxvcGUtPm9mZnNldCA9IDIqaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfTE9XXSAtIGhfc2JyQ29kZUVudmVsb3BlLT5uU2ZiW0ZSRVFfUkVTX0hJR0hdOworICBoX3NickNvZGVFbnZlbG9wZS0+b2Zmc2V0ID0gMiAqIGhfc2JyQ29kZUVudmVsb3BlLT5uU2ZiW0ZSRVFfUkVTX0xPV10gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfSElHSF07CiAKICAgcmV0dXJuICgwKTsKIH0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvY29kZV9lbnYuaCBiL2xpYlNCUmVuYy9zcmMvY29kZV9lbnYuaAppbmRleCA1MGEzNjVlLi42NzNhNzgzIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2NvZGVfZW52LmgKKysrIGIvbGliU0JSZW5jL3NyYy9jb2RlX2Vudi5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIyICs5MCwyOSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIERQQ00gRW52ZWxvcGUgY29kaW5nICAKKyAgXGJyaWVmICBEUENNIEVudmVsb3BlIGNvZGluZyAkUmV2aXNpb246IDkyNzkwICQKICovCiAKLSNpZm5kZWYgX19DT0RFX0VOVl9ICi0jZGVmaW5lIF9fQ09ERV9FTlZfSAorI2lmbmRlZiBDT0RFX0VOVl9ICisjZGVmaW5lIENPREVfRU5WX0gKIAogI2luY2x1ZGUgInNicl9kZWYuaCIKICNpbmNsdWRlICJiaXRfc2JyLmgiCiAjaW5jbHVkZSAiZnJhbV9nZW4uaCIKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgSU5UIG9mZnNldDsKICAgSU5UIHVwRGF0ZTsKICAgSU5UIG5TZmJbMl07CkBAIC0xMDQsNyArMTIyLDYgQEAKICAgRklYUF9EQkwgZEZfZWRnZV9pbmNyOwogICBJTlQgZEZfZWRnZV9pbmNyX2ZhYzsKIAotCiAgIElOVCBjb2RlQm9va1NjZkxhdlRpbWU7CiAgIElOVCBjb2RlQm9va1NjZkxhdkZyZXE7CiAKQEAgLTExNiw3ICsxMzMsNiBAQAogICBJTlQgc3RhcnRfYml0czsKICAgSU5UIHN0YXJ0X2JpdHNfYmFsYW5jZTsKIAotCiAgIGNvbnN0IFVDSEFSICpodWZmdGFibGVUaW1lTDsKICAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZUZyZXFMOwogCkBAIC0xMjQsMzAgKzE0MCwyMiBAQAogICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlQmFsYW5jZVRpbWVMOwogICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlTGV2ZWxGcmVxTDsKICAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTDsKLX0KLVNCUl9DT0RFX0VOVkVMT1BFOworfSBTQlJfQ09ERV9FTlZFTE9QRTsKIHR5cGVkZWYgU0JSX0NPREVfRU5WRUxPUEUgKkhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRTsKIAordm9pZCBGREtzYnJFbmNfY29kZUVudmVsb3BlKFNDSEFSICpzZmJfbnJnLCBjb25zdCBGUkVRX1JFUyAqZnJlcV9yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0NPREVfRU5WRUxPUEUgKmhfc2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqZGlyZWN0aW9uVmVjLCBJTlQgY291cGxpbmcsIElOVCBuRW52ZWxvcGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFubmVsLCBJTlQgaGVhZGVyQWN0aXZlKTsKIAorSU5UIEZES3NickVuY19Jbml0U2JyQ29kZUVudmVsb3BlKEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSBoX3NickNvZGVFbnZlbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm5TZmIsIElOVCBkZWx0YVRBY3Jvc3NGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZEZfZWRnZV8xc3RFbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZEZfZWRnZV9pbmNyKTsKIAotdm9pZAotRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoU0NIQVIgKnNmYl9ucmcsCi0gICAgICAgICAgICAgIGNvbnN0IEZSRVFfUkVTICpmcmVxX3JlcywKLSAgICAgICAgICAgICAgU0JSX0NPREVfRU5WRUxPUEUgKiBoX3NickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgSU5UICpkaXJlY3Rpb25WZWMsIElOVCBjb3VwbGluZywgSU5UIG5FbnZlbG9wZXMsIElOVCBjaGFubmVsLAotICAgICAgICAgICAgICBJTlQgaGVhZGVyQWN0aXZlKTsKLQotSU5UCi1GREtzYnJFbmNfSW5pdFNickNvZGVFbnZlbG9wZSAoSEFORExFX1NCUl9DT0RFX0VOVkVMT1BFIGhfc2JyQ29kZUVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCBkZWx0YVRBY3Jvc3NGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGRGX2VkZ2VfMXN0RW52LAotICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBkRl9lZGdlX2luY3IpOwotCi1JTlQKLUZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcyAoc3RydWN0IFNCUl9FTlZfREFUQSogICAgICBzYnJFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSAgaGVudiwKLSAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NPREVfRU5WRUxPUEUgIGhub2lzZSwKLSAgICAgICAgICAgICAgICAgICAgICBBTVBfUkVTICAgICAgICAgICAgICAgICAgIGFtcF9yZXMpOworSU5UIEZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcyhzdHJ1Y3QgU0JSX0VOVl9EQVRBICpzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NPREVfRU5WRUxPUEUgaGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT0RFX0VOVkVMT1BFIGhub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1QX1JFUyBhbXBfcmVzKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL2Vudl9iaXQuY3BwIGIvbGliU0JSZW5jL3NyYy9lbnZfYml0LmNwcAppbmRleCBlYTMxMTgzLi40MTgxMmFjIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2Vudl9iaXQuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvZW52X2JpdC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNyArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKQEAgLTg5LDEzICsxMDgsMTIgQEAKICNpbmNsdWRlICJlbnZfYml0LmgiCiAjaW5jbHVkZSAiY21vbmRhdGEuaCIKIAotCiAjaWZuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoIGEgPCBiID8gYTpiKQorI2RlZmluZSBtaW4oYSwgYikgKGEgPCBiID8gYSA6IGIpCiAjZW5kaWYKIAogI2lmbmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKCBhID4gYiA/IGE6YikKKyNkZWZpbmUgbWF4KGEsIGIpIChhID4gYiA/IGEgOiBiKQogI2VuZGlmCiAKIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNyY0FkdmFuY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwNywyNyArMTI1LDIyIEBACiAgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGNyYyByZWdpc3RlcgogICoKICAqLwotc3RhdGljIHZvaWQgY3JjQWR2YW5jZShVU0hPUlQgY3JjUG9seSwKLSAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIGNyY01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAqY3JjLAotICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgIGJWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICBiQml0cwotICAgICAgICAgICAgICAgICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIGNyY0FkdmFuY2UoVVNIT1JUIGNyY1BvbHksIFVTSE9SVCBjcmNNYXNrLCBVU0hPUlQgKmNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgYlZhbHVlLCBJTlQgYkJpdHMpIHsKICAgSU5UIGk7CiAgIFVTSE9SVCBmbGFnOwogCi0gIGZvciAoaT1iQml0cy0xOyBpPj0wOyBpLS0pIHsKLSAgICBmbGFnID0gKCgqY3JjKSAmIGNyY01hc2spID8gKDEpIDogKDApIDsKLSAgICBmbGFnIF49IChiVmFsdWUgJiAoMTw8aSkpID8gKDEpIDogKDApIDsKKyAgZm9yIChpID0gYkJpdHMgLSAxOyBpID49IDA7IGktLSkgeworICAgIGZsYWcgPSAoKCpjcmMpICYgY3JjTWFzaykgPyAoMSkgOiAoMCk7CisgICAgZmxhZyBePSAoYlZhbHVlICYgKDEgPDwgaSkpID8gKDEpIDogKDApOwogCi0gICAgKCpjcmMpPDw9MTsKLSAgICBpZihmbGFnKSAoKmNyYykgXj0gY3JjUG9seTsKKyAgICAoKmNyYykgPDw9IDE7CisgICAgaWYgKGZsYWcpICgqY3JjKSBePSBjcmNQb2x5OwogICB9CiB9CiAKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRkRLc2JyRW5jX0luaXRTYnJCaXRzdHJlYW0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZES3NickVuY19Jbml0U2JyQml0c3RyZWFtCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqCiAgKiBAZm4KICAqIEBicmllZiAgICBJbml0dGlhbGlzYXRpb24gb2Ygc2JyIGJpdHN0cmVhbSwgd3JpdGUgb2YgZHVtbXkgaGVhZGVyIGFuZCBDUkMKQEAgLTEzNywzNiArMTUwLDM1IEBACiAgKgogICovCiAKLUlOVCAgRkRLc2JyRW5jX0luaXRTYnJCaXRzdHJlYW0oSEFORExFX0NPTU1PTl9EQVRBICBoQ21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAqbWVtb3J5QmFzZSwgICAgICAvKiE8IFBvaW50ZXIgdG8gYml0c3RyZWFtIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1lbW9yeVNpemUsICAgICAgLyohPCBMZW5ndGggb2YgYml0c3RyZWFtIGJ1ZmZlciBpbiBieXRlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gIGhDcmNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKSAgLyohPCBTQlIgc3ludGF4IGZsYWdzICovCitJTlQgRkRLc2JyRW5jX0luaXRTYnJCaXRzdHJlYW0oCisgICAgSEFORExFX0NPTU1PTl9EQVRBIGhDbW9uRGF0YSwKKyAgICBVQ0hBUiAqbWVtb3J5QmFzZSwgLyohPCBQb2ludGVyIHRvIGJpdHN0cmVhbSBidWZmZXIgKi8KKyAgICBJTlQgbWVtb3J5U2l6ZSwgICAgLyohPCBMZW5ndGggb2YgYml0c3RyZWFtIGJ1ZmZlciBpbiBieXRlcyAqLworICAgIEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbywgVUlOVCBzYnJTeW50YXhGbGFncykgLyohPCBTQlIgc3ludGF4IGZsYWdzICovCiB7CiAgIElOVCBjcmNSZWdpb24gPSAwOwogCiAgIC8qIHJlc2V0IGJpdCBidWZmZXIgKi8KICAgRkRLcmVzZXRCaXRidWZmZXIoJmhDbW9uRGF0YS0+c2JyQml0YnVmLCBCU19XUklURVIpOwogCi0gIEZES2luaXRCaXRTdHJlYW0oJmhDbW9uRGF0YS0+dG1wV3JpdGVCaXRidWYsIG1lbW9yeUJhc2UsCi0gICAgICAgICAgICAgICAgICAgbWVtb3J5U2l6ZSwgMCwgQlNfV1JJVEVSKTsKKyAgRkRLaW5pdEJpdFN0cmVhbSgmaENtb25EYXRhLT50bXBXcml0ZUJpdGJ1ZiwgbWVtb3J5QmFzZSwgbWVtb3J5U2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICBCU19XUklURVIpOwogCiAgIGlmIChzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfQ1JDKSB7Ci0gICAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9EUk1fQ1JDKQotICAgIHsgLyogSW5pdCBhbmQgc3RhcnQgQ1JDIHJlZ2lvbiAqLwotICAgICAgRkRLd3JpdGVCaXRzICgmaENtb25EYXRhLT5zYnJCaXRidWYsIDB4MCwgU0lfU0JSX0RSTV9DUkNfQklUUyk7Ci0gICAgICBGREtjcmNJbml0KCBoQ3JjSW5mbywgMHgwMDFkLCAweEZGRkYsIFNJX1NCUl9EUk1fQ1JDX0JJVFMgKTsKLSAgICAgIGNyY1JlZ2lvbiA9IEZES2NyY1N0YXJ0UmVnKCBoQ3JjSW5mbywgJmhDbW9uRGF0YS0+c2JyQml0YnVmLCAwICk7CisgICAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9EUk1fQ1JDKSB7IC8qIEluaXQgYW5kIHN0YXJ0IENSQyByZWdpb24gKi8KKyAgICAgIEZES3dyaXRlQml0cygmaENtb25EYXRhLT5zYnJCaXRidWYsIDB4MCwgU0lfU0JSX0RSTV9DUkNfQklUUyk7CisgICAgICBGREtjcmNJbml0KGhDcmNJbmZvLCAweDAwMWQsIDB4RkZGRiwgU0lfU0JSX0RSTV9DUkNfQklUUyk7CisgICAgICBjcmNSZWdpb24gPSBGREtjcmNTdGFydFJlZyhoQ3JjSW5mbywgJmhDbW9uRGF0YS0+c2JyQml0YnVmLCAwKTsKICAgICB9IGVsc2UgewotICAgICAgRkRLd3JpdGVCaXRzICgmaENtb25EYXRhLT5zYnJCaXRidWYsIDB4MCwgU0lfU0JSX0NSQ19CSVRTKTsKKyAgICAgIEZES3dyaXRlQml0cygmaENtb25EYXRhLT5zYnJCaXRidWYsIDB4MCwgU0lfU0JSX0NSQ19CSVRTKTsKICAgICB9CiAgIH0KIAogICByZXR1cm4gKGNyY1JlZ2lvbik7CiB9CiAKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKiogRkRLc2JyRW5jX0Fzc2VtYmxlU2JyQml0c3RyZWFtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKiBGREtzYnJFbmNfQXNzZW1ibGVTYnJCaXRzdHJlYW0KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKICAqIEBmbgogICogQGJyaWVmICAgIEZvcm1hdHMgdGhlIFNCUiBwYXlsb2FkCkBAIC0xNzYsNDggKzE4OCw0MyBAQAogICoKICAqLwogCi12b2lkCi1GREtzYnJFbmNfQXNzZW1ibGVTYnJCaXRzdHJlYW0oIEhBTkRMRV9DT01NT05fREFUQSAgaENtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gIGhDcmNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgIGNyY1JlZ2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncykKLXsKLSAgVVNIT1JUIGNyY1JlZyA9ICBTQlJfQ1JDSU5JVDsKLSAgSU5UIG51bUNyY0JpdHMsaTsKK3ZvaWQgRkRLc2JyRW5jX0Fzc2VtYmxlU2JyQml0c3RyZWFtKEhBTkRMRV9DT01NT05fREFUQSBoQ21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gaENyY0luZm8sIElOVCBjcmNSZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNiclN5bnRheEZsYWdzKSB7CisgIFVTSE9SVCBjcmNSZWcgPSBTQlJfQ1JDSU5JVDsKKyAgSU5UIG51bUNyY0JpdHMsIGk7CiAKICAgLyogY2hlY2sgaWYgU0JSIGlzIHByZXNlbnQgKi8KLSAgaWYgKCBoQ21vbkRhdGE9PU5VTEwgKQotICAgIHJldHVybjsKKyAgaWYgKGhDbW9uRGF0YSA9PSBOVUxMKSByZXR1cm47CiAKICAgaENtb25EYXRhLT5zYnJGaWxsQml0cyA9IDA7IC8qIEZpbGwgYml0cyBhcmUgd3JpdHRlbiBvbmx5IGZvciBHQSBzdHJlYW1zICovCiAKLSAgaWYgKCBzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfRFJNX0NSQyApCi0gIHsKKyAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9EUk1fQ1JDKSB7CiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgYW5kIHdyaXRlIERSTSBDUkMKICAgICAgKi8KLSAgICBGREtjcmNFbmRSZWcoIGhDcmNJbmZvLCAmaENtb25EYXRhLT5zYnJCaXRidWYsIGNyY1JlZ2lvbiApOwotICAgIEZES3dyaXRlQml0cyggJmhDbW9uRGF0YS0+dG1wV3JpdGVCaXRidWYsIEZES2NyY0dldENSQyhoQ3JjSW5mbyleMHhGRiwgU0lfU0JSX0RSTV9DUkNfQklUUyApOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGlmICggIShzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSApCi0gICAgewotICAgICAgLyogRG8gYWxpZ25tZW50IGhlcmUsIGJlY2F1c2UgaXRzIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgc2JyX2V4dGVuc2lvbl9kYXRhICovCisgICAgRkRLY3JjRW5kUmVnKGhDcmNJbmZvLCAmaENtb25EYXRhLT5zYnJCaXRidWYsIGNyY1JlZ2lvbik7CisgICAgRkRLd3JpdGVCaXRzKCZoQ21vbkRhdGEtPnRtcFdyaXRlQml0YnVmLCBGREtjcmNHZXRDUkMoaENyY0luZm8pIF4gMHhGRiwKKyAgICAgICAgICAgICAgICAgU0lfU0JSX0RSTV9DUkNfQklUUyk7CisgIH0gZWxzZSB7CisgICAgaWYgKCEoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkpIHsKKyAgICAgIC8qIERvIGFsaWdubWVudCBoZXJlLCBiZWNhdXNlIGl0cyBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlCisgICAgICAgKiBzYnJfZXh0ZW5zaW9uX2RhdGEgKi8KICAgICAgIGludCBzYnJMb2FkID0gaENtb25EYXRhLT5zYnJIZHJCaXRzICsgaENtb25EYXRhLT5zYnJEYXRhQml0czsKIAotICAgICAgaWYgKCBzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfQ1JDICkgeworICAgICAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9DUkMpIHsKICAgICAgICAgc2JyTG9hZCArPSBTSV9TQlJfQ1JDX0JJVFM7CiAgICAgICB9CiAKLSAgICAgIHNickxvYWQgKz0gNDsgICAgICAgICAvKiBEbyBieXRlIEFsaWduIHdpdGggNCBiaXQgb2Zmc2V0LiBJU08vSUVDIDE0NDk2LTM6MjAwNShFKSBwYWdlIDM5LiAqLworICAgICAgc2JyTG9hZCArPSA0OyAvKiBEbyBieXRlIEFsaWduIHdpdGggNCBiaXQgb2Zmc2V0LiBJU08vSUVDIDE0NDk2LTM6MjAwNShFKQorICAgICAgICAgICAgICAgICAgICAgICBwYWdlIDM5LiAqLwogCiAgICAgICBoQ21vbkRhdGEtPnNickZpbGxCaXRzID0gKDggLSAoc2JyTG9hZCAlIDgpKSAlIDg7CiAKICAgICAgIC8qCiAgICAgICAgIGFwcGVuZCBmaWxsIGJpdHMKICAgICAgICovCi0gICAgICBGREt3cml0ZUJpdHMoJmhDbW9uRGF0YS0+c2JyQml0YnVmLCAwLCAgaENtb25EYXRhLT5zYnJGaWxsQml0cyApOworICAgICAgRkRLd3JpdGVCaXRzKCZoQ21vbkRhdGEtPnNickJpdGJ1ZiwgMCwgaENtb25EYXRhLT5zYnJGaWxsQml0cyk7CiAKICAgICAgIEZES19BU1NFUlQoRkRLZ2V0VmFsaWRCaXRzKCZoQ21vbkRhdGEtPnNickJpdGJ1ZikgJSA4ID09IDQpOwogICAgIH0KQEAgLTIyNSwyNiArMjMyLDI2IEBACiAgICAgLyoKICAgICAgIGNhbGN1bGF0ZSBjcmMKICAgICAqLwotICAgIGlmICggc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0NSQyApIHsKLSAgICAgIEZES19CSVRTVFJFQU0gIHRtcENSQ0J1ZiA9IGhDbW9uRGF0YS0+c2JyQml0YnVmOwotICAgICAgRkRLcmVzZXRCaXRidWZmZXIoICZ0bXBDUkNCdWYsIEJTX1JFQURFUiApOworICAgIGlmIChzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfQ1JDKSB7CisgICAgICBGREtfQklUU1RSRUFNIHRtcENSQ0J1ZiA9IGhDbW9uRGF0YS0+c2JyQml0YnVmOworICAgICAgRkRLcmVzZXRCaXRidWZmZXIoJnRtcENSQ0J1ZiwgQlNfUkVBREVSKTsKIAotICAgICAgbnVtQ3JjQml0cyA9IGhDbW9uRGF0YS0+c2JySGRyQml0cyArIGhDbW9uRGF0YS0+c2JyRGF0YUJpdHMgKyBoQ21vbkRhdGEtPnNickZpbGxCaXRzOworICAgICAgbnVtQ3JjQml0cyA9IGhDbW9uRGF0YS0+c2JySGRyQml0cyArIGhDbW9uRGF0YS0+c2JyRGF0YUJpdHMgKworICAgICAgICAgICAgICAgICAgIGhDbW9uRGF0YS0+c2JyRmlsbEJpdHM7CiAKLSAgICAgIGZvcihpPTA7aTxudW1DcmNCaXRzO2krKyl7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ3JjQml0czsgaSsrKSB7CiAgICAgICAgIElOVCBiaXQ7Ci0gICAgICAgIGJpdCA9IEZES3JlYWRCaXRzKCZ0bXBDUkNCdWYsMSk7Ci0gICAgICAgIGNyY0FkdmFuY2UoU0JSX0NSQ19QT0xZLFNCUl9DUkNfTUFTSywmY3JjUmVnLGJpdCwxKTsKKyAgICAgICAgYml0ID0gRkRLcmVhZEJpdHMoJnRtcENSQ0J1ZiwgMSk7CisgICAgICAgIGNyY0FkdmFuY2UoU0JSX0NSQ19QT0xZLCBTQlJfQ1JDX01BU0ssICZjcmNSZWcsIGJpdCwgMSk7CiAgICAgICB9CiAgICAgICBjcmNSZWcgJj0gKFNCUl9DUkNfUkFOR0UpOwogCiAgICAgICAvKgogICAgICAgICogV3JpdGUgQ1JDIGRhdGEuCiAgICAgICAgKi8KLSAgICAgIEZES3dyaXRlQml0cyAoJmhDbW9uRGF0YS0+dG1wV3JpdGVCaXRidWYsIGNyY1JlZywgU0lfU0JSX0NSQ19CSVRTKTsKKyAgICAgIEZES3dyaXRlQml0cygmaENtb25EYXRhLT50bXBXcml0ZUJpdGJ1ZiwgY3JjUmVnLCBTSV9TQlJfQ1JDX0JJVFMpOwogICAgIH0KICAgfQogCiAgIEZES3N5bmNDYWNoZSgmaENtb25EYXRhLT50bXBXcml0ZUJpdGJ1Zik7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvZW52X2JpdC5oIGIvbGliU0JSZW5jL3NyYy9lbnZfYml0LmgKaW5kZXggMDM4YTMyYS4uYjkxODAyYyAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9lbnZfYml0LmgKKysrIGIvbGliU0JSZW5jL3NyYy9lbnZfYml0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDggKzkwLDQ2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCiAgIFxicmllZiAgUmVtYWluaW5nIFNCUiBCaXQgV3JpdGluZyBSb3V0aW5lcwogKi8KIAotI2lmbmRlZiBCSVRfRU5WX0gKLSNkZWZpbmUgQklUX0VOVl9ICisjaWZuZGVmIEVOVl9CSVRfSAorI2RlZmluZSBFTlZfQklUX0gKIAogI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCiAjaW5jbHVkZSAiRkRLX2NyYy5oIgogCiAvKiBHKHgpID0geF4xMCArIHheOSArIHheNSArIHheNCArIHggKyAxICovCi0jZGVmaW5lIFNCUl9DUkNfUE9MWSAgICAgKDB4MDIzMykKLSNkZWZpbmUgU0JSX0NSQ19NQVNLICAgICAoMHgwMjAwKQotI2RlZmluZSBTQlJfQ1JDX1JBTkdFICAgICgweDAzRkYpCi0jZGVmaW5lIFNCUl9DUkNfTUFYUkVHUyAgICAgMQotI2RlZmluZSBTQlJfQ1JDSU5JVCAgICAgICgweDApCisjZGVmaW5lIFNCUl9DUkNfUE9MWSAoMHgwMjMzKQorI2RlZmluZSBTQlJfQ1JDX01BU0sgKDB4MDIwMCkKKyNkZWZpbmUgU0JSX0NSQ19SQU5HRSAoMHgwM0ZGKQorI2RlZmluZSBTQlJfQ1JDX01BWFJFR1MgMQorI2RlZmluZSBTQlJfQ1JDSU5JVCAoMHgwKQogCi0KLSNkZWZpbmUgU0lfU0JSX0NSQ19FTkFCTEVfQklUUyAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU0lfU0JSX0NSQ19CSVRTICAgICAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgU0lfU0JSX0RSTV9DUkNfQklUUyAgICAgICAgICAgICAgICAgICAgIDgKLQorI2RlZmluZSBTSV9TQlJfQ1JDX0VOQUJMRV9CSVRTIDAKKyNkZWZpbmUgU0lfU0JSX0NSQ19CSVRTIDEwCisjZGVmaW5lIFNJX1NCUl9EUk1fQ1JDX0JJVFMgOAogCiBzdHJ1Y3QgQ09NTU9OX0RBVEE7CiAKLUlOVCBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbShzdHJ1Y3QgQ09NTU9OX0RBVEEgICpoQ21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAqbWVtb3J5QmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBtZW1vcnlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgIGhDcmNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKK0lOVCBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbShzdHJ1Y3QgQ09NTU9OX0RBVEEgKmhDbW9uRGF0YSwgVUNIQVIgKm1lbW9yeUJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1lbW9yeVNpemUsIEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNiclN5bnRheEZsYWdzKTsKIAotdm9pZAotRkRLc2JyRW5jX0Fzc2VtYmxlU2JyQml0c3RyZWFtIChzdHJ1Y3QgQ09NTU9OX0RBVEEgICpoQ21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgIGhDcmNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBjcmNSZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKK3ZvaWQgRkRLc2JyRW5jX0Fzc2VtYmxlU2JyQml0c3RyZWFtKHN0cnVjdCBDT01NT05fREFUQSAqaENtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19DUkNJTkZPIGhDcmNJbmZvLCBJTlQgY3JjUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYnJTeW50YXhGbGFncyk7CiAKLQotCi0KLQotI2VuZGlmIC8qICNpZm5kZWYgQklUX0VOVl9IICovCisjZW5kaWYgLyogI2lmbmRlZiBFTlZfQklUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvZW52X2VzdC5jcHAgYi9saWJTQlJlbmMvc3JjL2Vudl9lc3QuY3BwCmluZGV4IDRmY2RhNTEuLjBlYjg0MjUgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvZW52X2VzdC5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJlbnZfZXN0LmgiCiAjaW5jbHVkZSAidHJhbl9kZXQuaCIKQEAgLTg5LDIwICsxMDgsMTggQEAKICNpbmNsdWRlICJmcmFtX2dlbi5oIgogI2luY2x1ZGUgImJpdF9zYnIuaCIKICNpbmNsdWRlICJjbW9uZGF0YS5oIgotI2luY2x1ZGUgInNicl9yYW0uaCIKLQorI2luY2x1ZGUgInNicmVuY19yYW0uaCIKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKICNkZWZpbmUgUVVBTlRfRVJST1JfVEhSRVMgMjAwCiAjZGVmaW5lIFlfTlJHX1NDQUxFIDUgLyogbm9Db2xzID0gMzIgLT4gc2hpZnQoNSkgKi8KKyNkZWZpbmUgTUFYX05SR19TTE9UU19MRCAxNgogCi0KLXN0YXRpYyBjb25zdCBVQ0hBUiBwYW5UYWJsZVsyXVsxMF0gPSB7IHsgMCwgMiwgNCwgNiwgOCwxMiwxNiwyMCwyNH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDAsIDIsIDQsIDgsMTIsIDAsIDAsIDAsIDAgfSB9Oworc3RhdGljIGNvbnN0IFVDSEFSIHBhblRhYmxlWzJdWzEwXSA9IHt7MCwgMiwgNCwgNiwgOCwgMTIsIDE2LCAyMCwgMjR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMiwgNCwgOCwgMTIsIDAsIDAsIDAsIDB9fTsKIHN0YXRpYyBjb25zdCBVQ0hBUiBtYXhJbmRleFsyXSA9IHs5LCA1fTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX0dldFRvbmFsaXR5CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjQsNjQgKzE0MSw2NCBAQAogICAgICAgICAgICAgICBzY2FsZWQgYnkgMl4oUkVMQVhBVElPTl9TSElGVCsyKSpSRUxBWEFUSU9OX0ZSQUNUCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgRklYUF9EQkwgRkRLc2JyRW5jX0dldFRvbmFsaXR5KAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgKnF1b3RhTWF0cml4LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgIG5vRXN0UGVyRnJhbWUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgc3RhcnRJbmRleCwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICpFbmVyZ2llcywKLSAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICBzdGFydEJhbmQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgc3RvcEJhbmQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgbnVtYmVyQ29scwotICAgICAgICApCi17CitzdGF0aWMgRklYUF9EQkwgRkRLc2JyRW5jX0dldFRvbmFsaXR5KGNvbnN0IEZJWFBfREJMICpjb25zdCAqcXVvdGFNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBub0VzdFBlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RhcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICpFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgc3RhcnRCYW5kLCBjb25zdCBJTlQgc3RvcEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1iZXJDb2xzKSB7CiAgIFVDSEFSIGIsIGUsIGs7Ci0gIElOVCAgICAgIG5vX2VuTWF4QmFuZFtTQlJfTUFYX0VORVJHWV9WQUxVRVNdID0geyAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKLSAgRklYUF9EQkwgZW5lcmd5TWF4W1NCUl9NQVhfRU5FUkdZX1ZBTFVFU10gPSB7IEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSB9OworICBJTlQgbm9fZW5NYXhCYW5kW1NCUl9NQVhfRU5FUkdZX1ZBTFVFU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xfTsKKyAgRklYUF9EQkwgZW5lcmd5TWF4W1NCUl9NQVhfRU5FUkdZX1ZBTFVFU10gPSB7CisgICAgICBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpLAorICAgICAgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpfTsKICAgRklYUF9EQkwgZW5lcmd5TWF4TWluID0gTUFYVkFMX0RCTDsgLyogbWluLiBlbmVyZ3kgaW4gZW5lcmd5TWF4IGFycmF5ICovCi0gIFVDSEFSICAgIHBvc0VuZXJneU1heE1pbiA9IDA7ICAgICAgIC8qIG1pbi4gZW5lcmd5IGluIGVuZXJneU1heCBhcnJheSBwb3NpdGlvbiAqLwotICBGSVhQX0RCTCB0b25hbGl0eUJhbmRbU0JSX01BWF9FTkVSR1lfVkFMVUVTXSA9IHsgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpIH07CisgIFVDSEFSIHBvc0VuZXJneU1heE1pbiA9IDA7IC8qIG1pbi4gZW5lcmd5IGluIGVuZXJneU1heCBhcnJheSBwb3NpdGlvbiAqLworICBGSVhQX0RCTCB0b25hbGl0eUJhbmRbU0JSX01BWF9FTkVSR1lfVkFMVUVTXSA9IHsKKyAgICAgIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZiksCisgICAgICBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZil9OwogICBGSVhQX0RCTCBnbG9iYWxUb25hbGl0eSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICBGSVhQX0RCTCBlbmVyZ3lCYW5kW1FNRl9DSEFOTkVMU107Ci0gIElOVCAgICAgIG1heE5FbmVyZ3lWYWx1ZXM7IC8qIG1heC4gbnVtYmVyIG9mIG1heC4gZW5lcmd5IHZhbHVlcyAqLworICBGSVhQX0RCTCBlbmVyZ3lCYW5kWzY0XTsKKyAgSU5UIG1heE5FbmVyZ3lWYWx1ZXM7IC8qIG1heC4gbnVtYmVyIG9mIG1heC4gZW5lcmd5IHZhbHVlcyAqLwogCiAgIC8qKiogU3VtIHVwIGVuZXJnaWVzIGZvciBlYWNoIGJhbmQgKioqLwotICBGREtfQVNTRVJUKG51bWJlckNvbHM9PTE1fHxudW1iZXJDb2xzPT0xNik7CisgIEZES19BU1NFUlQobnVtYmVyQ29scyA9PSAxNSB8fCBudW1iZXJDb2xzID09IDE2KTsKICAgLyogbnVtYmVyQ29scyBpcyBhbHdheXMgMTUgb3IgMTYgZm9yIEVMRC4gSW4gY2FzZSBvZiAxNiBiYW5kcywgdGhlCiAgICAgICBlbmVyZ3lCYW5kcyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgWzE1XXRoIGNvbHVtbi4KICAgICAgIFRoZSByZXN0IG9mIHRoZSBjb2x1bW4gZW5lcmdpZXMgYXJlIGFkZGVkIGluIHRoZSBuZXh0IHN0ZXAuICAgKi8KLSAgaWYgKG51bWJlckNvbHM9PTE1KSB7Ci0gICAgZm9yIChiPXN0YXJ0QmFuZDsgYjxzdG9wQmFuZDsgYisrKSB7Ci0gICAgICBlbmVyZ3lCYW5kW2JdPUZMMkZYQ09OU1RfREJMKDAuMGYpOworICBpZiAobnVtYmVyQ29scyA9PSAxNSkgeworICAgIGZvciAoYiA9IHN0YXJ0QmFuZDsgYiA8IHN0b3BCYW5kOyBiKyspIHsKKyAgICAgIGVuZXJneUJhbmRbYl0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgZm9yIChiPXN0YXJ0QmFuZDsgYjxzdG9wQmFuZDsgYisrKSB7Ci0gICAgICBlbmVyZ3lCYW5kW2JdPUVuZXJnaWVzWzE1XVtiXT4+NDsKKyAgICBmb3IgKGIgPSBzdGFydEJhbmQ7IGIgPCBzdG9wQmFuZDsgYisrKSB7CisgICAgICBlbmVyZ3lCYW5kW2JdID0gRW5lcmdpZXNbMTVdW2JdID4+IDQ7CiAgICAgfQogICB9CiAKLSAgZm9yIChrPTA7IGs8MTU7IGsrKykgewotICAgIGZvciAoYj1zdGFydEJhbmQ7IGI8c3RvcEJhbmQ7IGIrKykgewotICAgICAgZW5lcmd5QmFuZFtiXSArPSBFbmVyZ2llc1trXVtiXT4+NDsKKyAgZm9yIChrID0gMDsgayA8IDE1OyBrKyspIHsKKyAgICBmb3IgKGIgPSBzdGFydEJhbmQ7IGIgPCBzdG9wQmFuZDsgYisrKSB7CisgICAgICBlbmVyZ3lCYW5kW2JdICs9IEVuZXJnaWVzW2tdW2JdID4+IDQ7CiAgICAgfQogICB9CiAKICAgLyoqKiBEZXRlcm1pbmUgNSBoaWdoZXN0IGJhbmQtZW5lcmdpZXMgKioqLwotICBtYXhORW5lcmd5VmFsdWVzID0gZk1pbihTQlJfTUFYX0VORVJHWV9WQUxVRVMsIHN0b3BCYW5kLXN0YXJ0QmFuZCk7CisgIG1heE5FbmVyZ3lWYWx1ZXMgPSBmTWluKFNCUl9NQVhfRU5FUkdZX1ZBTFVFUywgc3RvcEJhbmQgLSBzdGFydEJhbmQpOwogCiAgIC8qIEdldCBtaW4uIHZhbHVlIGluIGVuZXJneU1heCBhcnJheSAqLwogICBlbmVyZ3lNYXhNaW4gPSBlbmVyZ3lNYXhbMF0gPSBlbmVyZ3lCYW5kW3N0YXJ0QmFuZF07CiAgIG5vX2VuTWF4QmFuZFswXSA9IHN0YXJ0QmFuZDsKICAgcG9zRW5lcmd5TWF4TWluID0gMDsKLSAgZm9yIChrPTE7IGs8bWF4TkVuZXJneVZhbHVlczsgaysrKSB7Ci0gICAgZW5lcmd5TWF4W2tdID0gZW5lcmd5QmFuZFtzdGFydEJhbmQra107Ci0gICAgbm9fZW5NYXhCYW5kW2tdID0gc3RhcnRCYW5kK2s7CisgIGZvciAoayA9IDE7IGsgPCBtYXhORW5lcmd5VmFsdWVzOyBrKyspIHsKKyAgICBlbmVyZ3lNYXhba10gPSBlbmVyZ3lCYW5kW3N0YXJ0QmFuZCArIGtdOworICAgIG5vX2VuTWF4QmFuZFtrXSA9IHN0YXJ0QmFuZCArIGs7CiAgICAgaWYgKGVuZXJneU1heE1pbiA+IGVuZXJneU1heFtrXSkgewogICAgICAgZW5lcmd5TWF4TWluID0gZW5lcmd5TWF4W2tdOwogICAgICAgcG9zRW5lcmd5TWF4TWluID0gazsKICAgICB9CiAgIH0KIAotICBmb3IgKGI9c3RhcnRCYW5kK21heE5FbmVyZ3lWYWx1ZXM7IGI8c3RvcEJhbmQ7IGIrKykgeworICBmb3IgKGIgPSBzdGFydEJhbmQgKyBtYXhORW5lcmd5VmFsdWVzOyBiIDwgc3RvcEJhbmQ7IGIrKykgewogICAgIGlmIChlbmVyZ3lCYW5kW2JdID4gZW5lcmd5TWF4TWluKSB7CiAgICAgICBlbmVyZ3lNYXhbcG9zRW5lcmd5TWF4TWluXSA9IGVuZXJneUJhbmRbYl07CiAgICAgICBub19lbk1heEJhbmRbcG9zRW5lcmd5TWF4TWluXSA9IGI7CkBAIC0xODksNyArMjA2LDcgQEAKICAgICAgIC8qIEFnYWluLCBnZXQgbWluLiB2YWx1ZSBpbiBlbmVyZ3lNYXggYXJyYXkgKi8KICAgICAgIGVuZXJneU1heE1pbiA9IGVuZXJneU1heFswXTsKICAgICAgIHBvc0VuZXJneU1heE1pbiA9IDA7Ci0gICAgICBmb3IgKGs9MTsgazxtYXhORW5lcmd5VmFsdWVzOyBrKyspIHsKKyAgICAgIGZvciAoayA9IDE7IGsgPCBtYXhORW5lcmd5VmFsdWVzOyBrKyspIHsKICAgICAgICAgaWYgKGVuZXJneU1heE1pbiA+IGVuZXJneU1heFtrXSkgewogICAgICAgICAgIGVuZXJneU1heE1pbiA9IGVuZXJneU1heFtrXTsKICAgICAgICAgICBwb3NFbmVyZ3lNYXhNaW4gPSBrOwpAQCAtMjAwLDEyICsyMTcsMTMgQEAKICAgLyoqKiBFbmQgZGV0ZXJtaW5lIDUgaGlnaGVzdCBiYW5kLWVuZXJnaWVzICoqKi8KIAogICAvKiBHZXQgdG9uYWxpdHkgdmFsdWVzIGZvciA1IGhpZ2hlc3QgZW5lcmdpZXMgKi8KLSAgZm9yIChlPTA7IGU8bWF4TkVuZXJneVZhbHVlczsgZSsrKSB7Ci0gICAgdG9uYWxpdHlCYW5kW2VdPUZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgIGZvciAoaz0wOyBrPG5vRXN0UGVyRnJhbWU7IGsrKykgeworICBmb3IgKGUgPSAwOyBlIDwgbWF4TkVuZXJneVZhbHVlczsgZSsrKSB7CisgICAgdG9uYWxpdHlCYW5kW2VdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgZm9yIChrID0gMDsgayA8IG5vRXN0UGVyRnJhbWU7IGsrKykgewogICAgICAgdG9uYWxpdHlCYW5kW2VdICs9IHF1b3RhTWF0cml4W3N0YXJ0SW5kZXggKyBrXVtub19lbk1heEJhbmRbZV1dID4+IDE7CiAgICAgfQotICAgIGdsb2JhbFRvbmFsaXR5ICs9IHRvbmFsaXR5QmFuZFtlXSA+PiAyOyAvKiBoZWFkcm9vbSBvZiAyKzEgKG1heC4gNSBhZGRpdGlvbnMpICovCisgICAgZ2xvYmFsVG9uYWxpdHkgKz0KKyAgICAgICAgdG9uYWxpdHlCYW5kW2VdID4+IDI7IC8qIGhlYWRyb29tIG9mIDIrMSAobWF4LiA1IGFkZGl0aW9ucykgKi8KICAgfQogCiAgIHJldHVybiBnbG9iYWxUb25hbGl0eTsKQEAgLTIyMSwzNCArMjM5LDM2IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBMTktfU0VDVElPTl9DT0RFX0wxCi1zdGF0aWMgdm9pZAotRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YShGSVhQX0RCTCAqKlJFU1RSSUNUIGVuZXJneVZhbHVlcywvKiE8IHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHJlYWxWYWx1ZXMsICAvKiE8IHRoZSByZWFsIHBhcnQgb2YgdGhlIFFNRiBzdWJzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgaW1hZ1ZhbHVlcywgIC8qITwgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBRTUYgc3Vic2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBudW1iZXJCYW5kcywgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBRTUYgYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgbnVtYmVyQ29scywgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgUU1GIHN1YnNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgKnFtZlNjYWxlLCAgICAgICAgICAgICAgICAgLyohPCBzY2xlZmFjdG9yIG9mIFFNRiBzdWJzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICplbmVyZ3lTY2FsZSkgICAgICAgICAgICAgIC8qITwgc2NhbGVmYWN0b3Igb2YgZW5lcmdpZXMgKi8KK3N0YXRpYyB2b2lkIEZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGEoCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBlbmVyZ3lWYWx1ZXMsIC8qITwgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICovCisgICAgRklYUF9EQkwgKipSRVNUUklDVCByZWFsVmFsdWVzLCAvKiE8IHRoZSByZWFsIHBhcnQgb2YgdGhlIFFNRiBzdWJzYW1wbGVzICovCisgICAgRklYUF9EQkwgKipSRVNUUklDVAorICAgICAgICBpbWFnVmFsdWVzLCAgIC8qITwgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBRTUYgc3Vic2FtcGxlcyAqLworICAgIElOVCBudW1iZXJCYW5kcywgIC8qITwgbnVtYmVyIG9mIFFNRiBiYW5kcyAqLworICAgIElOVCBudW1iZXJDb2xzLCAgIC8qITwgbnVtYmVyIG9mIFFNRiBzdWJzYW1wbGVzICovCisgICAgSU5UICpxbWZTY2FsZSwgICAgLyohPCBzY2xlZmFjdG9yIG9mIFFNRiBzdWJzYW1wbGVzICovCisgICAgSU5UICplbmVyZ3lTY2FsZSkgLyohPCBzY2FsZWZhY3RvciBvZiBlbmVyZ2llcyAqLwogewogICBpbnQgaiwgazsKICAgaW50IHNjYWxlOwogICBGSVhQX0RCTCBtYXhfdmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKICAgLyogR2V0IFNjcmF0Y2ggYnVmZmVyICovCi0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBOcmcsIEZJWFBfREJMLCBRTUZfQ0hBTk5FTFMqUU1GX01BWF9USU1FX1NMT1RTLzIpOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodG1wTnJnLCBGSVhQX0RCTCwgMzIgKiA2NCAvIDIpCiAKICAgLyogR2V0IG1heCBwb3NzaWJsZSBzY2FsaW5nIG9mIFFNRiBkYXRhICovCiAgIHNjYWxlID0gREZSQUNUX0JJVFM7Ci0gIGZvciAoaz0wOyBrPG51bWJlckNvbHM7IGsrKykgewotICAgIHNjYWxlID0gZml4TWluKHNjYWxlLCBmaXhNaW4oZ2V0U2NhbGVmYWN0b3IocmVhbFZhbHVlc1trXSwgbnVtYmVyQmFuZHMpLCBnZXRTY2FsZWZhY3RvcihpbWFnVmFsdWVzW2tdLCBudW1iZXJCYW5kcykpKTsKKyAgZm9yIChrID0gMDsgayA8IG51bWJlckNvbHM7IGsrKykgeworICAgIHNjYWxlID0gZml4TWluKHNjYWxlLCBmaXhNaW4oZ2V0U2NhbGVmYWN0b3IocmVhbFZhbHVlc1trXSwgbnVtYmVyQmFuZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2NhbGVmYWN0b3IoaW1hZ1ZhbHVlc1trXSwgbnVtYmVyQmFuZHMpKSk7CiAgIH0KIAogICAvKiBUd2VhayBzY2FsaW5nIHN0YWJpbGl0eSBmb3IgemVybyBzaWduYWwgdG8gbm9uLXplcm8gc2lnbmFsIHRyYW5zaXRpb25zICovCi0gIGlmIChzY2FsZSA+PSBERlJBQ1RfQklUUy0xKSB7Ci0gICAgc2NhbGUgPSAoRlJBQ1RfQklUUy0xLSpxbWZTY2FsZSk7CisgIGlmIChzY2FsZSA+PSBERlJBQ1RfQklUUyAtIDEpIHsKKyAgICBzY2FsZSA9IChGUkFDVF9CSVRTIC0gMSAtICpxbWZTY2FsZSk7CiAgIH0KLSAgLyogcHJldmVudCBzY2FsaW5nIG9mIFFGTSB2YWx1ZXMgdG8gLTEuZiAqLwotICBzY2FsZSA9IGZpeE1heCgwLHNjYWxlLTEpOworICAvKiBwcmV2ZW50IHNjYWxpbmcgb2YgUU1GIHZhbHVlcyB0byAtMS5mICovCisgIHNjYWxlID0gZml4TWF4KDAsIHNjYWxlIC0gMSk7CiAKICAgLyogVXBkYXRlIFFNRiBzY2FsZSAqLwogICAqcW1mU2NhbGUgKz0gc2NhbGU7CkBAIC0yNTksMjIgKzI3OSwyMyBAQAogICAgKi8KICAgewogICAgIEZJWFBfREJMICpucmdWYWx1ZXMgPSB0bXBOcmc7Ci0gICAgZm9yIChrPTA7IGs8bnVtYmVyQ29sczsgays9MikKLSAgICB7CisgICAgZm9yIChrID0gMDsgayA8IG51bWJlckNvbHM7IGsgKz0gMikgewogICAgICAgLyogTG9hZCBiYW5kIHZlY3RvciBhZGRyZXNzZXMgb2YgMiBjb25zZWN1dGl2ZSB0aW1lc2xvdHMgKi8KICAgICAgIEZJWFBfREJMICpSRVNUUklDVCByMCA9IHJlYWxWYWx1ZXNba107CiAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgaTAgPSBpbWFnVmFsdWVzW2tdOwotICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHIxID0gcmVhbFZhbHVlc1trKzFdOwotICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGkxID0gaW1hZ1ZhbHVlc1trKzFdOwotICAgICAgZm9yIChqPTA7IGo8bnVtYmVyQmFuZHM7IGorKykKLSAgICAgIHsKLSAgICAgICAgRklYUF9EQkwgIGVuZXJneTsKLSAgICAgICAgRklYUF9EQkwgIHRyMCx0cjEsdGkwLHRpMTsKKyAgICAgIEZJWFBfREJMICpSRVNUUklDVCByMSA9IHJlYWxWYWx1ZXNbayArIDFdOworICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGkxID0gaW1hZ1ZhbHVlc1trICsgMV07CisgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyQmFuZHM7IGorKykgeworICAgICAgICBGSVhQX0RCTCBlbmVyZ3k7CisgICAgICAgIEZJWFBfREJMIHRyMCwgdHIxLCB0aTAsIHRpMTsKIAogICAgICAgICAvKiBSZWFkIFFNRiB2YWx1ZXMgb2YgMiB0aW1lc2xvdHMgKi8KLSAgICAgICAgdHIwID0gcjBbal07IHRyMSA9IHIxW2pdOyB0aTAgPSBpMFtqXTsgdGkxID0gaTFbal07CisgICAgICAgIHRyMCA9IHIwW2pdOworICAgICAgICB0cjEgPSByMVtqXTsKKyAgICAgICAgdGkwID0gaTBbal07CisgICAgICAgIHRpMSA9IGkxW2pdOwogCi0gICAgICAgIC8qIFNjYWxlIFFNRiBWYWx1ZXMgYW5kIENhbGMgRW5lcmd5IG9mIGJvdGggdGltZXNsb3RzICovCisgICAgICAgIC8qIFNjYWxlIFFNRiBWYWx1ZXMgYW5kIENhbGMgRW5lcmd5IGF2ZXJhZ2Ugb2YgYm90aCB0aW1lc2xvdHMgKi8KICAgICAgICAgdHIwIDw8PSBzY2FsZTsKICAgICAgICAgdGkwIDw8PSBzY2FsZTsKICAgICAgICAgZW5lcmd5ID0gZlBvdzJBZGREaXYyKGZQb3cyRGl2Mih0cjApLCB0aTApID4+IDE7CkBAIC0yODgsMTggKzMwOSwyMyBAQAogICAgICAgICBtYXhfdmFsID0gZml4TWF4KG1heF92YWwsIGVuZXJneSk7CiAKICAgICAgICAgLyogV3JpdGUgYmFjayBzY2FsZWQgUU1GIHZhbHVlcyAqLwotICAgICAgICByMFtqXSA9IHRyMDsgcjFbal0gPSB0cjE7IGkwW2pdID0gdGkwOyBpMVtqXSA9IHRpMTsKKyAgICAgICAgcjBbal0gPSB0cjA7CisgICAgICAgIHIxW2pdID0gdHIxOworICAgICAgICBpMFtqXSA9IHRpMDsKKyAgICAgICAgaTFbal0gPSB0aTE7CiAgICAgICB9CiAgICAgfQogICB9CiAgIC8qIGVuZXJneVNjYWxlOiBzY2FsZWZhY3RvciBlbmVyZ2llcyBvZiBjdXJyZW50IGZyYW1lICovCi0gICplbmVyZ3lTY2FsZSA9IDIqKCpxbWZTY2FsZSktMTsgICAgICAgLyogaWYgcW1mU2NhbGUgPiAwOiBuciBvZiByaWdodCBzaGlmdHMgb3RoZXJ3aXNlIG5yIG9mIGxlZnQgc2hpZnRzICovCisgICplbmVyZ3lTY2FsZSA9CisgICAgICAyICogKCpxbWZTY2FsZSkgLQorICAgICAgMTsgLyogaWYgcW1mU2NhbGUgPiAwOiBuciBvZiByaWdodCBzaGlmdHMgb3RoZXJ3aXNlIG5yIG9mIGxlZnQgc2hpZnRzICovCiAKICAgLyogU2NhbGUgdGltZXNsb3QgcGFpciBlbmVyZ2llcyBhbmQgd3JpdGUgdG8gb3V0cHV0IGJ1ZmZlciAqLwogICBzY2FsZSA9IENvdW50TGVhZGluZ0JpdHMobWF4X3ZhbCk7CiAgIHsKLSAgCUZJWFBfREJMICpucmdWYWx1ZXMgPSB0bXBOcmc7Ci0gICAgZm9yIChrPTA7IGs8bnVtYmVyQ29scz4+MTsgaysrKSB7CisgICAgRklYUF9EQkwgKm5yZ1ZhbHVlcyA9IHRtcE5yZzsKKyAgICBmb3IgKGsgPSAwOyBrPG51bWJlckNvbHM+PiAxOyBrKyspIHsKICAgICAgIHNjYWxlVmFsdWVzKGVuZXJneVZhbHVlc1trXSwgbnJnVmFsdWVzLCBudW1iZXJCYW5kcywgc2NhbGUpOwogICAgICAgbnJnVmFsdWVzICs9IG51bWJlckJhbmRzOwogICAgIH0KQEAgLTMwNyw0MSArMzMzLDQzIEBACiAgIH0KIAogICAvKiBGcmVlIFNjcmF0Y2ggYnVmZmVyICovCi0gIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wTnJnLCBGSVhQX0RCTCwgUU1GX0NIQU5ORUxTKlFNRl9NQVhfVElNRV9TTE9UUy8yKTsKKyAgQ19BTExPQ19TQ1JBVENIX0VORCh0bXBOcmcsIEZJWFBfREJMLCAzMiAqIDY0IC8gMikKIH0KIAogTE5LX1NFQ1RJT05fQ09ERV9MMQotc3RhdGljIHZvaWQKLUZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGFGdWxsKEZJWFBfREJMICoqUkVTVFJJQ1QgZW5lcmd5VmFsdWVzLC8qITwgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHJlYWxWYWx1ZXMsICAvKiE8IHRoZSByZWFsIHBhcnQgb2YgdGhlIFFNRiBzdWJzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIGltYWdWYWx1ZXMsICAvKiE8IHRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgUU1GIHN1YnNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIG51bWJlckJhbmRzLCAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIFFNRiBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbnVtYmVyQ29scywgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgUU1GIHN1YnNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICpxbWZTY2FsZSwgICAgICAgICAgICAgICAgIC8qITwgc2NsZWZhY3RvciBvZiBRTUYgc3Vic2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgKmVuZXJneVNjYWxlKSAgICAgICAgICAgICAgLyohPCBzY2FsZWZhY3RvciBvZiBlbmVyZ2llcyAqLworc3RhdGljIHZvaWQgRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YUZ1bGwoCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBlbmVyZ3lWYWx1ZXMsIC8qITwgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICovCisgICAgRklYUF9EQkwgKipSRVNUUklDVCByZWFsVmFsdWVzLCAvKiE8IHRoZSByZWFsIHBhcnQgb2YgdGhlIFFNRiBzdWJzYW1wbGVzICovCisgICAgRklYUF9EQkwgKipSRVNUUklDVAorICAgICAgICBpbWFnVmFsdWVzLCAgIC8qITwgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBRTUYgc3Vic2FtcGxlcyAqLworICAgIGludCBudW1iZXJCYW5kcywgIC8qITwgbnVtYmVyIG9mIFFNRiBiYW5kcyAqLworICAgIGludCBudW1iZXJDb2xzLCAgIC8qITwgbnVtYmVyIG9mIFFNRiBzdWJzYW1wbGVzICovCisgICAgaW50ICpxbWZTY2FsZSwgICAgLyohPCBzY2FsZWZhY3RvciBvZiBRTUYgc3Vic2FtcGxlcyAqLworICAgIGludCAqZW5lcmd5U2NhbGUpIC8qITwgc2NhbGVmYWN0b3Igb2YgZW5lcmdpZXMgKi8KIHsKICAgaW50IGosIGs7CiAgIGludCBzY2FsZTsKICAgRklYUF9EQkwgbWF4X3ZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCiAgIC8qIEdldCBTY3JhdGNoIGJ1ZmZlciAqLwotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodG1wTnJnLCBGSVhQX0RCTCwgUU1GX01BWF9USU1FX1NMT1RTKlFNRl9DSEFOTkVMUy8yKTsKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcE5yZywgRklYUF9EQkwsIE1BWF9OUkdfU0xPVFNfTEQgKiA2NCkKIAotICBGREtfQVNTRVJUKG51bWJlckJhbmRzIDw9IFFNRl9DSEFOTkVMUyk7Ci0gIEZES19BU1NFUlQobnVtYmVyQ29scyA8PSBRTUZfTUFYX1RJTUVfU0xPVFMvMik7CisgIEZES19BU1NFUlQobnVtYmVyQ29scyA8PSBNQVhfTlJHX1NMT1RTX0xEKTsKKyAgRkRLX0FTU0VSVChudW1iZXJCYW5kcyA8PSA2NCk7CiAKICAgLyogR2V0IG1heCBwb3NzaWJsZSBzY2FsaW5nIG9mIFFNRiBkYXRhICovCiAgIHNjYWxlID0gREZSQUNUX0JJVFM7Ci0gIGZvciAoaz0wOyBrPG51bWJlckNvbHM7IGsrKykgewotICAgIHNjYWxlID0gZml4TWluKHNjYWxlLCBmaXhNaW4oZ2V0U2NhbGVmYWN0b3IocmVhbFZhbHVlc1trXSwgbnVtYmVyQmFuZHMpLCBnZXRTY2FsZWZhY3RvcihpbWFnVmFsdWVzW2tdLCBudW1iZXJCYW5kcykpKTsKKyAgZm9yIChrID0gMDsgayA8IG51bWJlckNvbHM7IGsrKykgeworICAgIHNjYWxlID0gZml4TWluKHNjYWxlLCBmaXhNaW4oZ2V0U2NhbGVmYWN0b3IocmVhbFZhbHVlc1trXSwgbnVtYmVyQmFuZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2NhbGVmYWN0b3IoaW1hZ1ZhbHVlc1trXSwgbnVtYmVyQmFuZHMpKSk7CiAgIH0KIAogICAvKiBUd2VhayBzY2FsaW5nIHN0YWJpbGl0eSBmb3IgemVybyBzaWduYWwgdG8gbm9uLXplcm8gc2lnbmFsIHRyYW5zaXRpb25zICovCi0gIGlmIChzY2FsZSA+PSBERlJBQ1RfQklUUy0xKSB7Ci0gICAgc2NhbGUgPSAoRlJBQ1RfQklUUy0xLSpxbWZTY2FsZSk7CisgIGlmIChzY2FsZSA+PSBERlJBQ1RfQklUUyAtIDEpIHsKKyAgICBzY2FsZSA9IChGUkFDVF9CSVRTIC0gMSAtICpxbWZTY2FsZSk7CiAgIH0KICAgLyogcHJldmVudCBzY2FsaW5nIG9mIFFGTSB2YWx1ZXMgdG8gLTEuZiAqLwotICBzY2FsZSA9IGZpeE1heCgwLHNjYWxlLTEpOworICBzY2FsZSA9IGZpeE1heCgwLCBzY2FsZSAtIDEpOwogCiAgIC8qIFVwZGF0ZSBRTUYgc2NhbGUgKi8KICAgKnFtZlNjYWxlICs9IHNjYWxlOwpAQCAtMzUyLDIwICszODAsMTkgQEAKICAgICovCiAgIHsKICAgICBGSVhQX0RCTCAqbnJnVmFsdWVzID0gdG1wTnJnOwotICAgIGZvciAoaz0wOyBrPG51bWJlckNvbHM7IGsrKykKLSAgICB7Ci0gICAgICAvKiBMb2FkIGJhbmQgdmVjdG9yIGFkZHJlc3NlcyBvZiAyIGNvbnNlY3V0aXZlIHRpbWVzbG90cyAqLworICAgIGZvciAoayA9IDA7IGsgPCBudW1iZXJDb2xzOyBrKyspIHsKKyAgICAgIC8qIExvYWQgYmFuZCB2ZWN0b3IgYWRkcmVzc2VzIG9mIDEgdGltZXNsb3QgKi8KICAgICAgIEZJWFBfREJMICpSRVNUUklDVCByMCA9IHJlYWxWYWx1ZXNba107CiAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgaTAgPSBpbWFnVmFsdWVzW2tdOwotICAgICAgZm9yIChqPTA7IGo8bnVtYmVyQmFuZHM7IGorKykKLSAgICAgIHsKLSAgICAgICAgRklYUF9EQkwgIGVuZXJneTsKLSAgICAgICAgRklYUF9EQkwgIHRyMCx0aTA7CisgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyQmFuZHM7IGorKykgeworICAgICAgICBGSVhQX0RCTCBlbmVyZ3k7CisgICAgICAgIEZJWFBfREJMIHRyMCwgdGkwOwogCi0gICAgICAgIC8qIFJlYWQgUU1GIHZhbHVlcyBvZiAyIHRpbWVzbG90cyAqLwotICAgICAgICB0cjAgPSByMFtqXTsgdGkwID0gaTBbal07CisgICAgICAgIC8qIFJlYWQgUU1GIHZhbHVlcyBvZiAxIHRpbWVzbG90ICovCisgICAgICAgIHRyMCA9IHIwW2pdOworICAgICAgICB0aTAgPSBpMFtqXTsKIAotICAgICAgICAvKiBTY2FsZSBRTUYgVmFsdWVzIGFuZCBDYWxjIEVuZXJneSBvZiBib3RoIHRpbWVzbG90cyAqLworICAgICAgICAvKiBTY2FsZSBRTUYgVmFsdWVzIGFuZCBDYWxjIEVuZXJneSAqLwogICAgICAgICB0cjAgPDw9IHNjYWxlOwogICAgICAgICB0aTAgPDw9IHNjYWxlOwogICAgICAgICBlbmVyZ3kgPSBmUG93MkFkZERpdjIoZlBvdzJEaXYyKHRyMCksIHRpMCk7CkBAIC0zNzQsMTggKzQwMSwyMSBAQAogICAgICAgICBtYXhfdmFsID0gZml4TWF4KG1heF92YWwsIGVuZXJneSk7CiAKICAgICAgICAgLyogV3JpdGUgYmFjayBzY2FsZWQgUU1GIHZhbHVlcyAqLwotICAgICAgICByMFtqXSA9IHRyMDsgaTBbal0gPSB0aTA7CisgICAgICAgIHIwW2pdID0gdHIwOworICAgICAgICBpMFtqXSA9IHRpMDsKICAgICAgIH0KICAgICB9CiAgIH0KICAgLyogZW5lcmd5U2NhbGU6IHNjYWxlZmFjdG9yIGVuZXJnaWVzIG9mIGN1cnJlbnQgZnJhbWUgKi8KLSAgKmVuZXJneVNjYWxlID0gMiooKnFtZlNjYWxlKS0xOyAgICAgICAvKiBpZiBxbWZTY2FsZSA+IDA6IG5yIG9mIHJpZ2h0IHNoaWZ0cyBvdGhlcndpc2UgbnIgb2YgbGVmdCBzaGlmdHMgKi8KKyAgKmVuZXJneVNjYWxlID0KKyAgICAgIDIgKiAoKnFtZlNjYWxlKSAtCisgICAgICAxOyAvKiBpZiBxbWZTY2FsZSA+IDA6IG5yIG9mIHJpZ2h0IHNoaWZ0cyBvdGhlcndpc2UgbnIgb2YgbGVmdCBzaGlmdHMgKi8KIAogICAvKiBTY2FsZSB0aW1lc2xvdCBwYWlyIGVuZXJnaWVzIGFuZCB3cml0ZSB0byBvdXRwdXQgYnVmZmVyICovCiAgIHNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhtYXhfdmFsKTsKICAgewotICAJRklYUF9EQkwgKm5yZ1ZhbHVlcyA9IHRtcE5yZzsKLSAgICBmb3IgKGs9MDsgazxudW1iZXJDb2xzOyBrKyspIHsKKyAgICBGSVhQX0RCTCAqbnJnVmFsdWVzID0gdG1wTnJnOworICAgIGZvciAoayA9IDA7IGsgPCBudW1iZXJDb2xzOyBrKyspIHsKICAgICAgIHNjYWxlVmFsdWVzKGVuZXJneVZhbHVlc1trXSwgbnJnVmFsdWVzLCBudW1iZXJCYW5kcywgc2NhbGUpOwogICAgICAgbnJnVmFsdWVzICs9IG51bWJlckJhbmRzOwogICAgIH0KQEAgLTM5Myw3ICs0MjMsNyBAQAogICB9CiAKICAgLyogRnJlZSBTY3JhdGNoIGJ1ZmZlciAqLwotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcE5yZywgRklYUF9EQkwsIFFNRl9NQVhfVElNRV9TTE9UUypRTUZfQ0hBTk5FTFMvMik7CisgIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wTnJnLCBGSVhQX0RCTCwgTUFYX05SR19TTE9UU19MRCAqIDY0KQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDA0LDEyICs0MzQsMTAgQEAKICAgXHJldHVybiB0aGUgcXVhbnRpemVkIHBhbiB2YWx1ZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVAotbWFwUGFub3JhbWEoSU5UIG5yZ1ZhbCwgICAgIC8qISBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBlbmVyZ3kgKi8KLSAgICAgICAgICAgIElOVCBhbXBSZXMsICAgICAvKiEgYW1wbGl0dWRlIHJlc29sdXRpb24gWzEuNS8zZEJdICovCi0gICAgICAgICAgICBJTlQgKnF1YW50RXJyb3IgLyohIHF1YW50aXphdGlvbiBlcnJvciBvZiBlbmVyZ3kgdmFsKi8KLSAgICAgICAgICAgKQoteworc3RhdGljIElOVCBtYXBQYW5vcmFtYShJTlQgbnJnVmFsLCAgICAgLyohIGludGVnZXIgdmFsdWUgb2YgdGhlIGVuZXJneSAqLworICAgICAgICAgICAgICAgICAgICAgICBJTlQgYW1wUmVzLCAgICAgLyohIGFtcGxpdHVkZSByZXNvbHV0aW9uIFsxLjUvM2RCXSAqLworICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnF1YW50RXJyb3IgLyohIHF1YW50aXphdGlvbiBlcnJvciBvZiBlbmVyZ3kgdmFsKi8KKykgewogICBpbnQgaTsKICAgSU5UIG1pbl92YWwsIHZhbDsKICAgVUNIQVIgcGFuSW5kZXg7CkBAIC00MjIsNyArNDUwLDcgQEAKICAgbWluX3ZhbCA9IEZES19JTlRfTUFYOwogICBwYW5JbmRleCA9IDA7CiAgIGZvciAoaSA9IDA7IGkgPCBtYXhJbmRleFthbXBSZXNdOyBpKyspIHsKLSAgICB2YWwgPSBmaXhwX2FicyAoKG5yZ1ZhbCAtIChJTlQpcGFuVGFibGVbYW1wUmVzXVtpXSkpOworICAgIHZhbCA9IGZpeHBfYWJzKChucmdWYWwgLSAoSU5UKXBhblRhYmxlW2FtcFJlc11baV0pKTsKIAogICAgIGlmICh2YWwgPCBtaW5fdmFsKSB7CiAgICAgICBtaW5fdmFsID0gdmFsOwpAQCAtNDMwLDEyICs0NTgsMTIgQEAKICAgICB9CiAgIH0KIAotICAqcXVhbnRFcnJvcj1taW5fdmFsOworICAqcXVhbnRFcnJvciA9IG1pbl92YWw7CiAKLSAgcmV0dXJuIHBhblRhYmxlW2FtcFJlc11bbWF4SW5kZXhbYW1wUmVzXS0xXSArIHNpZ24gKiBwYW5UYWJsZVthbXBSZXNdW3BhbkluZGV4XTsKKyAgcmV0dXJuIHBhblRhYmxlW2FtcFJlc11bbWF4SW5kZXhbYW1wUmVzXSAtIDFdICsKKyAgICAgICAgIHNpZ24gKiBwYW5UYWJsZVthbXBSZXNdW3BhbkluZGV4XTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAKQEAgLTQ0NCwzNCArNDcyLDM3IEBACiAgIFxyZXR1cm4gdm9pZAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oU0NIQVIgICAgKlJFU1RSSUNUIGlOb2lzZUxldmVscywgLyohIHF1YW50aXplZCBub2lzZSBsZXZlbHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIE5vaXNlTGV2ZWxzLCAgLyohIHRoZSBub2lzZSBsZXZlbHMgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICBjb3VwbGluZyAgICAgICAgICAgICAgIC8qISB0aGUgY291cGxpbmcgZmxhZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oCisgICAgU0NIQVIgKlJFU1RSSUNUIGlOb2lzZUxldmVscywgLyohIHF1YW50aXplZCBub2lzZSBsZXZlbHMgKi8KKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QKKyAgICAgICAgTm9pc2VMZXZlbHMsIC8qISB0aGUgbm9pc2UgbGV2ZWxzLiBFeHBvbmVudCA9IExEX0RBVEFfU0hJRlQgICovCisgICAgSU5UIGNvdXBsaW5nICAgICAvKiEgdGhlIGNvdXBsaW5nIGZsYWcgKi8KKykgewogICBJTlQgaTsKICAgSU5UIHRtcCwgZHVtbXk7CiAKICAgLyogUXVhbnRpc2F0aW9uLCBzaW1pbGFyIHRvIHNmYiBxdWFudC4uLiAqLwogICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykgewotICAgIC8qIHRtcCA9IE5vaXNlTGV2ZWxzW2ldID4gKFBGTE9BVCkzMC4wZiA/IDMwOiAoSU5UKSAoTm9pc2VMZXZlbHNbaV0gKyAoUEZMT0FUKTAuNSk7ICovCi0gICAgLyogMzA+PjYgPSAwLjQ2ODc1ICovCisgICAgLyogdG1wID0gTm9pc2VMZXZlbHNbaV0gPiAoUEZMT0FUKTMwLjBmID8gMzA6IChJTlQpIChOb2lzZUxldmVsc1tpXSArCisgICAgICogKFBGTE9BVCkwLjUpOyAqLworICAgIC8qIDMwPj5MRF9EQVRBX1NISUZUID0gMC40Njg3NSAqLwogICAgIGlmICgoRklYUF9EQkwpTm9pc2VMZXZlbHNbaV0gPiBGTDJGWENPTlNUX0RCTCgwLjQ2ODc1ZikpIHsKICAgICAgIHRtcCA9IDMwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIHRtcCA9IChJTlQpKChGSVhQX0RCTClOb2lzZUxldmVsc1tpXSArIChGTDJGWENPTlNUX0RCTCgwLjVmKT4+KCovIC8qIEZSQUNUX0JJVFMrICovIC8qIDYtMSkpKTsqLwotICAgICAgLyogdG1wID0gdG1wID4+IChERlJBQ1RfQklUUy0xLTYpOyAqLyAvKiBjb252ZXJzaW9uIHRvIGludGVnZXIgaGFwcGVucyBoZXJlICovCi0gICAgICAvKiByb3VuZGluZyBpcyBkb25lIGJ5IHNoaWZ0aW5nIG9uZSBiaXQgbGVzcyB0aGFuIG5lY2Vzc2FyeSB0byB0aGUgcmlnaHQsIGFkZGluZyAnMScgYW5kIHRoZW4gc2hpZnRpbmcgdGhlIGZpbmFsIGJpdCAqLwotICAgICAgdG1wID0gKCgoKElOVClOb2lzZUxldmVsc1tpXSk+PihERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpKSApOyAvKiBjb252ZXJzaW9uIHRvIGludGVnZXIgKi8KLQkJCSBpZiAodG1wICE9IDApCi0JCQkgICB0bXAgKz0gMTsKKyAgICB9IGVsc2UgeworICAgICAgLyogdG1wID0gKElOVCkoKEZJWFBfREJMKU5vaXNlTGV2ZWxzW2ldICsgKEZMMkZYQ09OU1RfREJMKDAuNWYpPj4oKi8KKyAgICAgIC8qIEZSQUNUX0JJVFMrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNi0xKSkpOyovCisgICAgICAvKiB0bXAgPSB0bXAgPj4gKERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCk7ICovIC8qIGNvbnZlcnNpb24gdG8gaW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXBwZW5zIGhlcmUgKi8KKyAgICAgIC8qIHJvdW5kaW5nIGlzIGRvbmUgYnkgc2hpZnRpbmcgb25lIGJpdCBsZXNzIHRoYW4gbmVjZXNzYXJ5IHRvIHRoZSByaWdodCwKKyAgICAgICAqIGFkZGluZyAnMScgYW5kIHRoZW4gc2hpZnRpbmcgdGhlIGZpbmFsIGJpdCAqLworICAgICAgdG1wID0gKCgoKElOVClOb2lzZUxldmVsc1tpXSkgPj4KKyAgICAgICAgICAgICAgKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQpKSk7IC8qIGNvbnZlcnNpb24gdG8gaW50ZWdlciAqLworICAgICAgaWYgKHRtcCAhPSAwKSB0bXAgKz0gMTsKICAgICB9CiAKICAgICBpZiAoY291cGxpbmcpIHsKICAgICAgIHRtcCA9IHRtcCA8IC0zMCA/IC0zMCA6IHRtcDsKLSAgICAgIHRtcCA9IG1hcFBhbm9yYW1hICh0bXAsMSwmZHVtbXkpOworICAgICAgdG1wID0gbWFwUGFub3JhbWEodG1wLCAxLCAmZHVtbXkpOwogICAgIH0KICAgICBpTm9pc2VMZXZlbHNbaV0gPSB0bXA7CiAgIH0KQEAgLTQ4NSw2MCArNTE2LDc2IEBACiAgIFxyZXR1cm4gdm9pZAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWNvdXBsZU5vaXNlRmxvb3IoRklYUF9EQkwgKlJFU1RSSUNUIG5vaXNlX2xldmVsX2xlZnQsIC8qISBub2lzZSBsZXZlbCBsZWZ0ICAobW9kaWZpZWQpKi8KLSAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIG5vaXNlX2xldmVsX3JpZ2h0IC8qISBub2lzZSBsZXZlbCByaWdodCAobW9kaWZpZWQpKi8KLSAgICAgICAgICAgICAgICApCi17Ci0gIEZJWFBfREJMIGNtcFZhbExlZnQsY21wVmFsUmlnaHQ7CitzdGF0aWMgdm9pZCBjb3VwbGVOb2lzZUZsb29yKAorICAgIEZJWFBfREJMICpSRVNUUklDVCBub2lzZV9sZXZlbF9sZWZ0LCAvKiEgbm9pc2UgbGV2ZWwgbGVmdCAgKG1vZGlmaWVkKSovCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIG5vaXNlX2xldmVsX3JpZ2h0IC8qISBub2lzZSBsZXZlbCByaWdodCAobW9kaWZpZWQpKi8KKykgeworICBGSVhQX0RCTCBjbXBWYWxMZWZ0LCBjbXBWYWxSaWdodDsKICAgSU5UIGk7Ci0gIEZJWFBfREJMIHRlbXAxLHRlbXAyOworICBGSVhQX0RCTCB0ZW1wMSwgdGVtcDI7CiAKICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspIHsKLQogICAgIC8qIENhbGN1bGF0aW9uIG9mIHRoZSBwb3dlciBmdW5jdGlvbiB1c2luZyBsZDY0OgogICAgICAgIHogID0geF55OwogICAgICAgIHonID0gQ2FsY0xkNjQoeikgPSB5KkNhbGNMZDY0KHgpLzY0OwogICAgICAgIHogID0gQ2FsY0ludkxkNjQoeicpOwogICAgICovCi0gICAgY21wVmFsTGVmdCAgPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9sZWZ0W2ldOworICAgIGNtcFZhbExlZnQgPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9sZWZ0W2ldOwogICAgIGNtcFZhbFJpZ2h0ID0gTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gbm9pc2VfbGV2ZWxfcmlnaHRbaV07CiAKICAgICBpZiAoY21wVmFsUmlnaHQgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewogICAgICAgdGVtcDEgPSBDYWxjSW52TGREYXRhKE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX3JpZ2h0W2ldKTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIHRlbXAxID0gQ2FsY0ludkxkRGF0YShOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9yaWdodFtpXSk7Ci0gICAgICB0ZW1wMSA9IHRlbXAxIDw8IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMSk7ICAvKiBJTlQgdG8gZnJhY3QgY29udmVyc2lvbiBvZiByZXN1bHQsIGlmIGlucHV0IG9mIENhbGNJbnZMZERhdGEgaXMgcG9zaXRpdiAqLworICAgICAgdGVtcDEgPSB0ZW1wMSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCAtCisgICAgICAgICAgICAgICAgICAgICAgICAxKTsgLyogSU5UIHRvIGZyYWN0IGNvbnZlcnNpb24gb2YgcmVzdWx0LCBpZiBpbnB1dCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGNJbnZMZERhdGEgaXMgcG9zaXRpdiAqLwogICAgIH0KIAogICAgIGlmIChjbXBWYWxMZWZ0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgIHRlbXAyID0gQ2FsY0ludkxkRGF0YShOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9sZWZ0W2ldKTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIHRlbXAyID0gQ2FsY0ludkxkRGF0YShOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9sZWZ0W2ldKTsKLSAgICAgIHRlbXAyID0gdGVtcDIgPDwgKERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVC0xKTsgIC8qIElOVCB0byBmcmFjdCBjb252ZXJzaW9uIG9mIHJlc3VsdCwgaWYgaW5wdXQgb2YgQ2FsY0ludkxkRGF0YSBpcyBwb3NpdGl2ICovCisgICAgICB0ZW1wMiA9IHRlbXAyIDw8IChERlJBQ1RfQklUUyAtIDEgLSBMRF9EQVRBX1NISUZUIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKiBJTlQgdG8gZnJhY3QgY29udmVyc2lvbiBvZiByZXN1bHQsIGlmIGlucHV0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsY0ludkxkRGF0YSBpcyBwb3NpdGl2ICovCiAgICAgfQogCi0KLSAgICBpZiAoKGNtcFZhbExlZnQgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKGNtcFZhbFJpZ2h0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7Ci0gICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldICA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIChDYWxjTGREYXRhKCgodGVtcDE+PjEpICsgKHRlbXAyPj4xKSkpKTsgLyogbm8gc2NhbGluZyBuZWVkZWQhIGJvdGggdmFsdWVzIGFyZSBkZnJhY3QgKi8KKyAgICBpZiAoKGNtcFZhbExlZnQgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYKKyAgICAgICAgKGNtcFZhbFJpZ2h0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7CisgICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldID0KKyAgICAgICAgICBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLQorICAgICAgICAgIChDYWxjTGREYXRhKAorICAgICAgICAgICAgICAoKHRlbXAxID4+IDEpICsKKyAgICAgICAgICAgICAgICh0ZW1wMiA+PiAxKSkpKTsgLyogbm8gc2NhbGluZyBuZWVkZWQhIGJvdGggdmFsdWVzIGFyZSBkZnJhY3QgKi8KICAgICAgIG5vaXNlX2xldmVsX3JpZ2h0W2ldID0gQ2FsY0xkRGF0YSh0ZW1wMikgLSBDYWxjTGREYXRhKHRlbXAxKTsKICAgICB9CiAKLSAgICBpZiAoKGNtcFZhbExlZnQgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChjbXBWYWxSaWdodCA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKLSAgICAgIG5vaXNlX2xldmVsX2xlZnRbaV0gID0gTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gKENhbGNMZERhdGEoKCh0ZW1wMT4+MSkgKyAodGVtcDI+PjEpKSkgKyBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKTsgLyogc2NhbGVkIHdpdGggNy82NCAqLworICAgIGlmICgoY21wVmFsTGVmdCA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYKKyAgICAgICAgKGNtcFZhbFJpZ2h0ID49IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgeworICAgICAgbm9pc2VfbGV2ZWxfbGVmdFtpXSA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENhbGNMZERhdGEoKCh0ZW1wMSA+PiAxKSArICh0ZW1wMiA+PiAxKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4xMDkzNzVmKSk7IC8qIHNjYWxlZCB3aXRoIDcvNjQgKi8KICAgICAgIG5vaXNlX2xldmVsX3JpZ2h0W2ldID0gQ2FsY0xkRGF0YSh0ZW1wMikgLSBDYWxjTGREYXRhKHRlbXAxKTsKICAgICB9CiAKLSAgICBpZiAoKGNtcFZhbExlZnQgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChjbXBWYWxSaWdodCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgewotICAgICAgbm9pc2VfbGV2ZWxfbGVmdFtpXSAgPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSAoQ2FsY0xkRGF0YSgoKHRlbXAxPj4oNysxKSkgKyAodGVtcDI+PjEpKSkgKyBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKTsgLyogc2NhbGVkIHdpdGggNy82NCAqLwotICAgICAgbm9pc2VfbGV2ZWxfcmlnaHRbaV0gPSAoQ2FsY0xkRGF0YSh0ZW1wMikgKyBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKSAtIENhbGNMZERhdGEodGVtcDEpOworICAgIGlmICgoY21wVmFsTGVmdCA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYKKyAgICAgICAgKGNtcFZhbFJpZ2h0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7CisgICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldID0gTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2FsY0xkRGF0YSgoKHRlbXAxID4+ICg3ICsgMSkpICsgKHRlbXAyID4+IDEpKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKTsgLyogc2NhbGVkIHdpdGggNy82NCAqLworICAgICAgbm9pc2VfbGV2ZWxfcmlnaHRbaV0gPQorICAgICAgICAgIChDYWxjTGREYXRhKHRlbXAyKSArIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpIC0gQ2FsY0xkRGF0YSh0ZW1wMSk7CiAgICAgfQogCi0gICAgaWYgKChjbXBWYWxMZWZ0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChjbXBWYWxSaWdodCA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKLSAgICAgIG5vaXNlX2xldmVsX2xlZnRbaV0gID0gTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gKENhbGNMZERhdGEoKCh0ZW1wMT4+MSkgKyAodGVtcDI+Pig3KzEpKSkpICsgRkwyRlhDT05TVF9EQkwoMC4xMDkzNzVmKSk7IC8qIHNjYWxlZCB3aXRoIDcvNjQgKi8KLSAgICAgIG5vaXNlX2xldmVsX3JpZ2h0W2ldID0gQ2FsY0xkRGF0YSh0ZW1wMikgLSAoQ2FsY0xkRGF0YSh0ZW1wMSkgKyBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKTsgLyogc2NhbGVkIHdpdGggNy82NCAqLworICAgIGlmICgoY21wVmFsTGVmdCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJgorICAgICAgICAoY21wVmFsUmlnaHQgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7CisgICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldID0gTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2FsY0xkRGF0YSgoKHRlbXAxID4+IDEpICsgKHRlbXAyID4+ICg3ICsgMSkpKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKTsgLyogc2NhbGVkIHdpdGggNy82NCAqLworICAgICAgbm9pc2VfbGV2ZWxfcmlnaHRbaV0gPSBDYWxjTGREYXRhKHRlbXAyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDYWxjTGREYXRhKHRlbXAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKTsgLyogc2NhbGVkIHdpdGggNy82NCAqLwogICAgIH0KICAgfQogfQpAQCAtNTQ2LDIyICs1OTMsMjMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKIAotICBcYnJpZWYgIENhbGN1bGF0aW9uIG9mIGVuZXJneSBzdGFydGluZyBpbiBsb3dlciBiYW5kIChsaSkgdXAgdG8gdXBwZXIgYmFuZCAodWkpCi0gICAgICAgICAgb3ZlciBzbG90cyAoc3RhcnRfcG9zKSB0byAoc3RvcF9wb3MpCisgIFxicmllZiAgQ2FsY3VsYXRpb24gb2YgZW5lcmd5IHN0YXJ0aW5nIGluIGxvd2VyIGJhbmQgKGxpKSB1cCB0byB1cHBlciBiYW5kCisodWkpIG92ZXIgc2xvdHMgKHN0YXJ0X3BvcykgdG8gKHN0b3BfcG9zKQogCiAgIFxyZXR1cm4gdm9pZAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEZJWFBfREJMCi1nZXRFbnZTZmJFbmVyZ3koSU5UIGxpLCAgICAgICAgICAgICAgLyohIGxvd2VyIGJhbmQgKi8KLSAgICAgICAgICAgICAgICBJTlQgdWksICAgICAgICAgICAgICAvKiEgdXBwZXIgYmFuZCAqLwotICAgICAgICAgICAgICAgIElOVCBzdGFydF9wb3MsICAgICAgIC8qISBzdGFydCBzbG90ICovCi0gICAgICAgICAgICAgICAgSU5UIHN0b3BfcG9zLCAgICAgICAgLyohIHN0b3Agc2xvdCAqLwotICAgICAgICAgICAgICAgIElOVCBib3JkZXJfcG9zLCAgICAgIC8qISBzbG90cyBzY2FsaW5nIGJvcmRlciAqLwotICAgICAgICAgICAgICAgIEZJWFBfREJMICoqWUJ1ZmZlciwgIC8qISBzZmIgZW5lcmd5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIElOVCBZQnVmZmVyU3pTaGlmdCwgIC8qISBFbmVyZ3kgYnVmZmVyIGluZGV4IHNjYWxlICovCi0gICAgICAgICAgICAgICAgSU5UIHNjYWxlTnJnMCwgICAgICAgLyohIHNjYWxpbmcgb2YgbG93ZXIgc2xvdHMgKi8KLSAgICAgICAgICAgICAgICBJTlQgc2NhbGVOcmcxKSAgICAgICAvKiEgc2NhbGluZyBvZiB1cHBlciBzbG90cyAqLworCitzdGF0aWMgRklYUF9EQkwgZ2V0RW52U2ZiRW5lcmd5KAorICAgIElOVCBsaSwgICAgICAgICAgICAgLyohIGxvd2VyIGJhbmQgKi8KKyAgICBJTlQgdWksICAgICAgICAgICAgIC8qISB1cHBlciBiYW5kICovCisgICAgSU5UIHN0YXJ0X3BvcywgICAgICAvKiEgc3RhcnQgc2xvdCAqLworICAgIElOVCBzdG9wX3BvcywgICAgICAgLyohIHN0b3Agc2xvdCAqLworICAgIElOVCBib3JkZXJfcG9zLCAgICAgLyohIHNsb3RzIHNjYWxpbmcgYm9yZGVyICovCisgICAgRklYUF9EQkwgKipZQnVmZmVyLCAvKiEgc2ZiIGVuZXJneSBidWZmZXIgKi8KKyAgICBJTlQgWUJ1ZmZlclN6U2hpZnQsIC8qISBFbmVyZ3kgYnVmZmVyIGluZGV4IHNjYWxlICovCisgICAgSU5UIHNjYWxlTnJnMCwgICAgICAvKiEgc2NhbGluZyBvZiBsb3dlciBzbG90cyAqLworICAgIElOVCBzY2FsZU5yZzEpICAgICAgLyohIHNjYWxpbmcgb2YgdXBwZXIgc2xvdHMgKi8KIHsKICAgLyogdXNlIGR5bmFtaWMgc2NhbGluZyBmb3Igb3V0ZXIgZW5lcmd5IGxvb3A7CiAgICAgIGVuZXJnaWVzIGFyZSBjcml0aWNhbCBhbmQgZXZlcnkgYml0IGlzIGltcG9ydGFudCAqLwpAQCAtNTY5LDMwICs2MTcsMzMgQEAKIAogICBGSVhQX0RCTCBucmdTdW0sIG5yZzEsIG5yZzIsIGFjY3UxLCBhY2N1MjsKICAgSU5UIGR5blNjYWxlLCBkeW5TY2FsZTEsIGR5blNjYWxlMjsKLSAgaWYodWktbGk9PTApIGR5blNjYWxlID0gREZSQUNUX0JJVFMtMTsKKyAgaWYgKHVpIC0gbGkgPT0gMCkKKyAgICBkeW5TY2FsZSA9IERGUkFDVF9CSVRTIC0gMTsKICAgZWxzZQotICBkeW5TY2FsZSA9IENhbGNMZEludCh1aS1saSk+PihERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpOworICAgIGR5blNjYWxlID0gQ2FsY0xkSW50KHVpIC0gbGkpID4+IChERlJBQ1RfQklUUyAtIDEgLSBMRF9EQVRBX1NISUZUKTsKIAotICBzYzAgPSBmaXhNaW4oc2NhbGVOcmcwLFlfTlJHX1NDQUxFKTsgc2MxID0gZml4TWluKHNjYWxlTnJnMSxZX05SR19TQ0FMRSk7CisgIHNjMCA9IGZpeE1pbihzY2FsZU5yZzAsIFlfTlJHX1NDQUxFKTsKKyAgc2MxID0gZml4TWluKHNjYWxlTnJnMSwgWV9OUkdfU0NBTEUpOwogICAvKiBkeW5TY2FsZXsxLDJ9IGlzIHNldCBzdWNoIHRoYXQgdGhlIHJpZ2h0IHNoaWZ0IGJlbG93IGlzIHBvc2l0aXZlICovCi0gIGR5blNjYWxlMSA9IGZpeE1pbigoc2NhbGVOcmcwLXNjMCksZHluU2NhbGUpOwotICBkeW5TY2FsZTIgPSBmaXhNaW4oKHNjYWxlTnJnMS1zYzEpLGR5blNjYWxlKTsKKyAgZHluU2NhbGUxID0gZml4TWluKChzY2FsZU5yZzAgLSBzYzApLCBkeW5TY2FsZSk7CisgIGR5blNjYWxlMiA9IGZpeE1pbigoc2NhbGVOcmcxIC0gc2MxKSwgZHluU2NhbGUpOwogICBucmdTdW0gPSBhY2N1MSA9IGFjY3UyID0gKEZJWFBfREJMKTA7CiAKICAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CiAgICAgbnJnMSA9IG5yZzIgPSAoRklYUF9EQkwpMDsKICAgICBmb3IgKGwgPSBzdGFydF9wb3M7IGwgPCBib3JkZXJfcG9zOyBsKyspIHsKLSAgICAgIG5yZzEgKz0gWUJ1ZmZlcltsPj5ZQnVmZmVyU3pTaGlmdF1ba10gPj4gc2MwOworICAgICAgbnJnMSArPSBZQnVmZmVyW2wgPj4gWUJ1ZmZlclN6U2hpZnRdW2tdID4+IHNjMDsKICAgICB9CiAgICAgZm9yICg7IGwgPCBzdG9wX3BvczsgbCsrKSB7Ci0gICAgICBucmcyICs9IFlCdWZmZXJbbD4+WUJ1ZmZlclN6U2hpZnRdW2tdID4+IHNjMTsKKyAgICAgIG5yZzIgKz0gWUJ1ZmZlcltsID4+IFlCdWZmZXJTelNoaWZ0XVtrXSA+PiBzYzE7CiAgICAgfQotICAgIGFjY3UxICs9IChucmcxPj5keW5TY2FsZTEpOwotICAgIGFjY3UyICs9IChucmcyPj5keW5TY2FsZTIpOworICAgIGFjY3UxICs9IChucmcxID4+IGR5blNjYWxlMSk7CisgICAgYWNjdTIgKz0gKG5yZzIgPj4gZHluU2NhbGUyKTsKICAgfQogICAvKiBUaGlzIHNoaWZ0IGZhY3RvciBpcyBhbHdheXMgcG9zaXRpdmUuIFNlZSBjb21tZW50IGFib3ZlLiAqLwotICBucmdTdW0gKz0gKCBhY2N1MSA+PiBmaXhNaW4oKHNjYWxlTnJnMC1zYzAtZHluU2NhbGUxKSwoREZSQUNUX0JJVFMtMSkpICkKLSAgICAgICAgICArICAoIGFjY3UyID4+IGZpeE1pbigoc2NhbGVOcmcxLXNjMS1keW5TY2FsZTIpLChERlJBQ1RfQklUUy0xKSkgKTsKKyAgbnJnU3VtICs9CisgICAgICAoYWNjdTEgPj4gZml4TWluKChzY2FsZU5yZzAgLSBzYzAgLSBkeW5TY2FsZTEpLCAoREZSQUNUX0JJVFMgLSAxKSkpICsKKyAgICAgIChhY2N1MiA+PiBmaXhNaW4oKHNjYWxlTnJnMSAtIHNjMSAtIGR5blNjYWxlMiksIChERlJBQ1RfQklUUyAtIDEpKSk7CiAKICAgcmV0dXJuIG5yZ1N1bTsKIH0KQEAgLTYwNSwyNyArNjU2LDMwIEBACiAgIFxyZXR1cm4gdm9pZAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEZJWFBfREJMCi1taExvd2VyaW5nRW5lcmd5KEZJWFBfREJMIG5yZywgSU5UIE0pCi17CitzdGF0aWMgRklYUF9EQkwgbWhMb3dlcmluZ0VuZXJneShGSVhQX0RCTCBucmcsIElOVCBNKSB7CiAgIC8qCi0gICAgIENvbXBlbnNhdGluZyBmb3IgdGhlIGZhY3QgdGhhdCB3ZSBpbiB0aGUgZGVjb2RlciBtYXAgdGhlICJhdmVyYWdlIGVuZXJneSB0byBldmVyeSBRTUYKLSAgICAgYmFuZCwgYW5kIHVzZSB0aGlzIHdoZW4gd2UgY2FsY3VsYXRlIHRoZSBib29zdC1mYWN0b3IuIFNpbmNlIHRoZSBtYXBwZWQgZW5lcmd5IGlzbid0Ci0gICAgIHRoZSBhdmVyYWdlIGVuZXJneSBidXQgdGhlIG1heGltdW0gZW5lcmd5IGluIGNhc2Ugb2YgbWlzc2luZyBoYXJtb25pYyBjcmVhdGlvbiwgd2Ugd2lsbAotICAgICBpbiB0aGUgYm9vc3QgZnVuY3Rpb24gY2FsY3VsYXRlIHRoYXQgdG9vIG11Y2ggbGltaXRpbmcgaGFzIGJlZW4gYXBwbGllZCBhbmQgaGVuY2Ugd2Ugd2lsbAotICAgICBib29zdCB0aGUgc2lnbmFsIGFsdGhvdWdoIGl0IGlzbid0IGNhbGxlZCBmb3IuIEhlbmNlIHdlIG5lZWQgdG8gY29tcGVuc2F0ZSBmb3IgdGhpcyBieQotICAgICBsb3dlcmluZyB0aGUgdHJhbnNtaXR0ZWQgZW5lcmd5IHZhbHVlcyBmb3IgdGhlIHNpbmVzIHNvIHRoZXkgd2lsbCBnZXQgdGhlIGNvcnJlY3QgbGV2ZWwKKyAgICAgQ29tcGVuc2F0aW5nIGZvciB0aGUgZmFjdCB0aGF0IHdlIGluIHRoZSBkZWNvZGVyIG1hcCB0aGUgImF2ZXJhZ2UgZW5lcmd5IHRvCisgICAgIGV2ZXJ5IFFNRiBiYW5kLCBhbmQgdXNlIHRoaXMgd2hlbiB3ZSBjYWxjdWxhdGUgdGhlIGJvb3N0LWZhY3Rvci4gU2luY2UgdGhlCisgICAgIG1hcHBlZCBlbmVyZ3kgaXNuJ3QgdGhlIGF2ZXJhZ2UgZW5lcmd5IGJ1dCB0aGUgbWF4aW11bSBlbmVyZ3kgaW4gY2FzZSBvZgorICAgICBtaXNzaW5nIGhhcm1vbmljIGNyZWF0aW9uLCB3ZSB3aWxsIGluIHRoZSBib29zdCBmdW5jdGlvbiBjYWxjdWxhdGUgdGhhdCB0b28KKyAgICAgbXVjaCBsaW1pdGluZyBoYXMgYmVlbiBhcHBsaWVkIGFuZCBoZW5jZSB3ZSB3aWxsIGJvb3N0IHRoZSBzaWduYWwgYWx0aG91Z2gKKyAgICAgaXQgaXNuJ3QgY2FsbGVkIGZvci4gSGVuY2Ugd2UgbmVlZCB0byBjb21wZW5zYXRlIGZvciB0aGlzIGJ5IGxvd2VyaW5nIHRoZQorICAgICB0cmFuc21pdHRlZCBlbmVyZ3kgdmFsdWVzIGZvciB0aGUgc2luZXMgc28gdGhleSB3aWxsIGdldCB0aGUgY29ycmVjdCBsZXZlbAogICAgICBhZnRlciB0aGUgYm9vc3QgaXMgYXBwbGllZC4KICAgKi8KLSAgaWYoTSA+IDIpeworICBpZiAoTSA+IDIpIHsKICAgICBJTlQgdG1wU2NhbGU7CiAgICAgdG1wU2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKG5yZyk7CiAgICAgbnJnIDw8PSB0bXBTY2FsZTsKLSAgICBucmcgPSBmTXVsdChucmcsIEZMMkZYQ09OU1RfREJMKDAuMzk4MTA3MjY3ZikpOyAvKiBUaGUgbWF4aW11bSBib29zdCBpcyAxLjU4NDg5Mywgc28gdGhlIG1heGltdW0gYXR0ZW51YXRpb24gc2hvdWxkIGJlIHNxdWFyZSgxLzEuNTg0ODkzKSA9IDAuMzk4MTA3MjY3ICovCisgICAgbnJnID0gZk11bHQobnJnLCBGTDJGWENPTlNUX0RCTCgwLjM5ODEwNzI2N2YpKTsgLyogVGhlIG1heGltdW0gYm9vc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyAxLjU4NDg5Mywgc28gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSBhdHRlbnVhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxdWFyZSgxLzEuNTg0ODkzKSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zOTgxMDcyNjcgKi8KICAgICBucmcgPj49IHRtcFNjYWxlOwotICB9Ci0gIGVsc2V7Ci0gICAgaWYoTSA+IDEpeworICB9IGVsc2UgeworICAgIGlmIChNID4gMSkgewogICAgICAgbnJnID4+PSAxOwogICAgIH0KICAgfQpAQCAtNjQxLDIyICs2OTUsMTcgQEAKICAgXHJldHVybiB2b2lkCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgRklYUF9EQkwgbm1oTG93ZXJpbmdFbmVyZ3koCi0gICAgICAgIEZJWFBfREJMIG5yZywKLSAgICAgICAgY29uc3QgRklYUF9EQkwgbnJnU3VtLAotICAgICAgICBjb25zdCBJTlQgbnJnU3VtX3NjYWxlLAotICAgICAgICBjb25zdCBJTlQgTQotICAgICAgICApCi17Ci0gIGlmIChucmc+RkwyRlhDT05TVF9EQkwoMCkpIHsKLSAgICBpbnQgc2M9MDsKK3N0YXRpYyBGSVhQX0RCTCBubWhMb3dlcmluZ0VuZXJneShGSVhQX0RCTCBucmcsIGNvbnN0IEZJWFBfREJMIG5yZ1N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnJnU3VtX3NjYWxlLCBjb25zdCBJTlQgTSkgeworICBpZiAobnJnID4gRkwyRlhDT05TVF9EQkwoMCkpIHsKKyAgICBpbnQgc2MgPSAwOwogICAgIC8qIGdhaW4gPSBucmdTdW0gLyAobnJnKihNKzEpKSAqLwotICAgIEZJWFBfREJMIGdhaW4gPSBmTXVsdChmRGl2Tm9ybShucmdTdW0sIG5yZywgJnNjKSwgR2V0SW52SW50KE0rMSkpOworICAgIEZJWFBfREJMIGdhaW4gPSBmTXVsdChmRGl2Tm9ybShucmdTdW0sIG5yZywgJnNjKSwgR2V0SW52SW50KE0gKyAxKSk7CiAgICAgc2MgKz0gbnJnU3VtX3NjYWxlOwogCiAgICAgLyogcmVkdWNlIG5yZyBpZiBnYWluIHNtYWxsZXIgMS5mICovCi0gICAgaWYgKCAhKChzYz49MCkgJiYgKCBnYWluID4gKChGSVhQX0RCTClNQVhWQUxfREJMPj5zYykgKSkgKSB7Ci0gICAgICBucmcgPSBmTXVsdChzY2FsZVZhbHVlKGdhaW4sc2MpLCBucmcpOworICAgIGlmICghKChzYyA+PSAwKSAmJiAoZ2FpbiA+ICgoRklYUF9EQkwpTUFYVkFMX0RCTCA+PiBzYykpKSkgeworICAgICAgbnJnID0gZk11bHQoc2NhbGVWYWx1ZShnYWluLCBzYyksIG5yZyk7CiAgICAgfQogICB9CiAgIHJldHVybiBucmc7CkBAIC02NzEsOTEgKzcyMCw5MiBAQAogICBccmV0dXJuIHZvaWQKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1jYWxjdWxhdGVTYnJFbnZlbG9wZSAoRklYUF9EQkwgKipSRVNUUklDVCBZQnVmZmVyTGVmdCwgIC8qISBlbmVyZ3kgYnVmZmVyIGxlZnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIFlCdWZmZXJSaWdodCwgLyohIGVuZXJneSBidWZmZXIgcmlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnQgKlJFU1RSSUNUIFlCdWZmZXJTY2FsZUxlZnQsICAgLyohIHNjYWxlIGVuZXJneSBidWZmZXIgbGVmdCAqLwotICAgICAgICAgICAgICAgICAgICAgIGludCAqUkVTVFJJQ1QgWUJ1ZmZlclNjYWxlUmlnaHQsICAvKiEgc2NhbGUgZW5lcmd5IGJ1ZmZlciByaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPICpmcmFtZV9pbmZvLCAvKiEgZnJhbWUgaW5mbyB2ZWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqUkVTVFJJQ1Qgc2ZiX25yZ0xlZnQsICAgICAgLyohIHNmYiBlbmVyZ3kgYnVmZmVyIGxlZnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqUkVTVFJJQ1Qgc2ZiX25yZ1JpZ2h0LCAgICAgLyohIHNmYiBlbmVyZ3kgYnVmZmVyIHJpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwgICAgIC8qISBoYW5kbGUgdG8gY29uZmlnIGRhdGEgICAqLwotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX3NiciwgICAgICAgICAvKiEgZW52ZWxvcGUgY2hhbm5lbCBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICBTQlJfU1RFUkVPX01PREUgc3RlcmVvTW9kZSwgICAgICAgLyohIHN0ZXJlbyBjb2RpbmcgbW9kZSAqLwotICAgICAgICAgICAgICAgICAgICAgIElOVCogbWF4UXVhbnRFcnJvciwgICAgICAgICAgICAgICAvKiEgbWF4aW11bSBxdWFudGl6YXRpb24gZXJyb3IsIGZvciBwYW5vcmFtYS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlclN6U2hpZnQpICAgICAgICAgICAgICAgLyohIEVuZXJneSBidWZmZXIgaW5kZXggc2NhbGUgKi8KK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZVNickVudmVsb3BlKAorICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgWUJ1ZmZlckxlZnQsICAvKiEgZW5lcmd5IGJ1ZmZlciBsZWZ0ICovCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBZQnVmZmVyUmlnaHQsIC8qISBlbmVyZ3kgYnVmZmVyIHJpZ2h0ICovCisgICAgaW50ICpSRVNUUklDVCBZQnVmZmVyU2NhbGVMZWZ0LCAgIC8qISBzY2FsZSBlbmVyZ3kgYnVmZmVyIGxlZnQgKi8KKyAgICBpbnQgKlJFU1RSSUNUIFlCdWZmZXJTY2FsZVJpZ2h0LCAgLyohIHNjYWxlIGVuZXJneSBidWZmZXIgcmlnaHQgKi8KKyAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqZnJhbWVfaW5mbywgLyohIGZyYW1lIGluZm8gdmVjdG9yICovCisgICAgU0NIQVIgKlJFU1RSSUNUIHNmYl9ucmdMZWZ0LCAgICAgIC8qISBzZmIgZW5lcmd5IGJ1ZmZlciBsZWZ0ICovCisgICAgU0NIQVIgKlJFU1RSSUNUIHNmYl9ucmdSaWdodCwgICAgIC8qISBzZmIgZW5lcmd5IGJ1ZmZlciByaWdodCAqLworICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgaF9jb24sICAgICAvKiEgaGFuZGxlIHRvIGNvbmZpZyBkYXRhICAgKi8KKyAgICBIQU5ETEVfRU5WX0NIQU5ORUwgaF9zYnIsICAgICAgICAgLyohIGVudmVsb3BlIGNoYW5uZWwgaGFuZGxlICovCisgICAgU0JSX1NURVJFT19NT0RFIHN0ZXJlb01vZGUsICAgICAgIC8qISBzdGVyZW8gY29kaW5nIG1vZGUgKi8KKyAgICBJTlQgKm1heFF1YW50RXJyb3IsIC8qISBtYXhpbXVtIHF1YW50aXphdGlvbiBlcnJvciwgZm9yIHBhbm9yYW1hLiAqLworICAgIGludCBZQnVmZmVyU3pTaGlmdCkgLyohIEVuZXJneSBidWZmZXIgaW5kZXggc2NhbGUgKi8KIAogewotICBpbnQgaSwgaiwgbSA9IDA7CisgIGludCBlbnYsIGosIG0gPSAwOwogICBJTlQgbm9fb2ZfYmFuZHMsIHN0YXJ0X3Bvcywgc3RvcF9wb3MsIGxpLCB1aTsKICAgRlJFUV9SRVMgZnJlcV9yZXM7CiAKICAgSU5UIGNhID0gMiAtIGhfc2JyLT5lbmNFbnZEYXRhLmluaXRfc2JyX2FtcF9yZXM7CiAgIElOVCBvbmVCaXRMZXNzID0gMDsKICAgaWYgKGNhID09IDIpCi0gICAgb25lQml0TGVzcyA9IDE7IC8qIExEX0RBVEFfU0hJRlQgPT4gbGQ2NCBzY2FsaW5nOyBvbmUgYml0IGxlc3MgZm9yIHJvdW5kaW5nICovCisgICAgb25lQml0TGVzcyA9CisgICAgICAgIDE7IC8qIExEX0RBVEFfU0hJRlQgPT4gbGQ2NCBzY2FsaW5nOyBvbmUgYml0IGxlc3MgZm9yIHJvdW5kaW5nICovCiAKICAgSU5UIHF1YW50RXJyb3I7CiAgIElOVCBuRW52ZWxvcGVzID0gZnJhbWVfaW5mby0+bkVudmVsb3BlczsKICAgSU5UIHNob3J0X2VudiA9IGZyYW1lX2luZm8tPnNob3J0RW52IC0gMTsKICAgSU5UIHRpbWVTdGVwID0gaF9zYnItPnNickV4dHJhY3RFbnZlbG9wZS50aW1lX3N0ZXA7Ci0gIElOVCBjb21tb25TY2FsZSxzY2FsZUxlZnQwLHNjYWxlTGVmdDE7Ci0gIElOVCBzY2FsZVJpZ2h0MD0wLHNjYWxlUmlnaHQxPTA7CisgIElOVCBjb21tb25TY2FsZSwgc2NhbGVMZWZ0MCwgc2NhbGVMZWZ0MTsKKyAgSU5UIHNjYWxlUmlnaHQwID0gMCwgc2NhbGVSaWdodDEgPSAwOwogCi0gIGNvbW1vblNjYWxlID0gZml4TWluKFlCdWZmZXJTY2FsZUxlZnRbMF0sWUJ1ZmZlclNjYWxlTGVmdFsxXSk7CisgIGNvbW1vblNjYWxlID0gZml4TWluKFlCdWZmZXJTY2FsZUxlZnRbMF0sIFlCdWZmZXJTY2FsZUxlZnRbMV0pOwogCiAgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgewotICAgIGNvbW1vblNjYWxlID0gZml4TWluKGNvbW1vblNjYWxlLFlCdWZmZXJTY2FsZVJpZ2h0WzBdKTsKLSAgICBjb21tb25TY2FsZSA9IGZpeE1pbihjb21tb25TY2FsZSxZQnVmZmVyU2NhbGVSaWdodFsxXSk7CisgICAgY29tbW9uU2NhbGUgPSBmaXhNaW4oY29tbW9uU2NhbGUsIFlCdWZmZXJTY2FsZVJpZ2h0WzBdKTsKKyAgICBjb21tb25TY2FsZSA9IGZpeE1pbihjb21tb25TY2FsZSwgWUJ1ZmZlclNjYWxlUmlnaHRbMV0pOwogICB9CiAKICAgY29tbW9uU2NhbGUgPSBjb21tb25TY2FsZSAtIDc7CiAKICAgc2NhbGVMZWZ0MCA9IFlCdWZmZXJTY2FsZUxlZnRbMF0gLSBjb21tb25TY2FsZTsKLSAgc2NhbGVMZWZ0MSA9IFlCdWZmZXJTY2FsZUxlZnRbMV0gLSBjb21tb25TY2FsZSA7Ci0gIEZES19BU1NFUlQgKChzY2FsZUxlZnQwID49IDApICYmIChzY2FsZUxlZnQxID49IDApKTsKKyAgc2NhbGVMZWZ0MSA9IFlCdWZmZXJTY2FsZUxlZnRbMV0gLSBjb21tb25TY2FsZTsKKyAgRkRLX0FTU0VSVCgoc2NhbGVMZWZ0MCA+PSAwKSAmJiAoc2NhbGVMZWZ0MSA+PSAwKSk7CiAKICAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX0NPVVBMSU5HKSB7CiAgICAgc2NhbGVSaWdodDAgPSBZQnVmZmVyU2NhbGVSaWdodFswXSAtIGNvbW1vblNjYWxlOwogICAgIHNjYWxlUmlnaHQxID0gWUJ1ZmZlclNjYWxlUmlnaHRbMV0gLSBjb21tb25TY2FsZTsKLSAgICBGREtfQVNTRVJUICgoc2NhbGVSaWdodDAgPj0gMCkgJiYgKHNjYWxlUmlnaHQxID49IDApKTsKKyAgICBGREtfQVNTRVJUKChzY2FsZVJpZ2h0MCA+PSAwKSAmJiAoc2NhbGVSaWdodDEgPj0gMCkpOwogICAgICptYXhRdWFudEVycm9yID0gMDsKICAgfQogCi0gIGZvciAoaSA9IDA7IGkgPCBuRW52ZWxvcGVzOyBpKyspIHsKLQotICAgIEZJWFBfREJMIHBOcmdMZWZ0W1FNRl9NQVhfVElNRV9TTE9UU107Ci0gICAgRklYUF9EQkwgcE5yZ1JpZ2h0W1FNRl9NQVhfVElNRV9TTE9UU107CisgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKKyAgICBGSVhQX0RCTCBwTnJnTGVmdFszMl07CisgICAgRklYUF9EQkwgcE5yZ1JpZ2h0WzMyXTsKICAgICBpbnQgZW52TnJnX3NjYWxlOwotICAgIEZJWFBfREJMIGVudk5yZ0xlZnQgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgRklYUF9EQkwgZW52TnJnTGVmdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgIEZJWFBfREJMIGVudk5yZ1JpZ2h0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgaW50ICAgICAgbWlzc2luZ0hhcm1vbmljW1FNRl9NQVhfVElNRV9TTE9UU107Ci0gICAgaW50ICAgICAgY291bnRbUU1GX01BWF9USU1FX1NMT1RTXTsKKyAgICBpbnQgbWlzc2luZ0hhcm1vbmljWzMyXTsKKyAgICBpbnQgY291bnRbMzJdOwogCi0gICAgc3RhcnRfcG9zID0gdGltZVN0ZXAgKiBmcmFtZV9pbmZvLT5ib3JkZXJzW2ldOwotICAgIHN0b3BfcG9zID0gdGltZVN0ZXAgKiBmcmFtZV9pbmZvLT5ib3JkZXJzW2kgKyAxXTsKLSAgICBmcmVxX3JlcyA9IGZyYW1lX2luZm8tPmZyZXFSZXNbaV07CisgICAgc3RhcnRfcG9zID0gdGltZVN0ZXAgKiBmcmFtZV9pbmZvLT5ib3JkZXJzW2Vudl07CisgICAgc3RvcF9wb3MgPSB0aW1lU3RlcCAqIGZyYW1lX2luZm8tPmJvcmRlcnNbZW52ICsgMV07CisgICAgZnJlcV9yZXMgPSBmcmFtZV9pbmZvLT5mcmVxUmVzW2Vudl07CiAgICAgbm9fb2ZfYmFuZHMgPSBoX2Nvbi0+blNmYltmcmVxX3Jlc107Ci0gICAgZW52TnJnX3NjYWxlID0gREZSQUNUX0JJVFMtZk5vcm16KChGSVhQX0RCTClub19vZl9iYW5kcyk7Ci0KLSAgICBpZiAoaSA9PSBzaG9ydF9lbnYpIHsKLSAgICAgIHN0b3BfcG9zIC09IGZpeE1heCgyLCB0aW1lU3RlcCk7ICAvKiBjb25zaWRlciBhdCBsZWFzdCAyIFFNRiBzbG90cyBsZXNzIGZvciBzaG9ydCBlbnZlbG9wZXMgKGVudmVsb3BlcyBqdXN0IGJlZm9yZSB0cmFuc2llbnRzKSAqLworICAgIGVudk5yZ19zY2FsZSA9IERGUkFDVF9CSVRTIC0gZk5vcm16KChGSVhQX0RCTClub19vZl9iYW5kcyk7CisgICAgaWYgKGVudiA9PSBzaG9ydF9lbnYpIHsKKyAgICAgIGogPSBmTWF4KDIsIHRpbWVTdGVwKTsgLyogY29uc2lkZXIgYXQgbGVhc3QgMiBRTUYgc2xvdHMgbGVzcyBmb3Igc2hvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVzIChlbnZlbG9wZXMganVzdCBiZWZvcmUgdHJhbnNpZW50cykgKi8KKyAgICAgIGlmICgoc3RvcF9wb3MgLSBzdGFydF9wb3MgLSBqKSA+IDApIHsKKyAgICAgICAgc3RvcF9wb3MgPSBzdG9wX3BvcyAtIGo7CisgICAgICB9CiAgICAgfQotCiAgICAgZm9yIChqID0gMDsgaiA8IG5vX29mX2JhbmRzOyBqKyspIHsKLSAgICAgIEZJWFBfREJMIG5yZ0xlZnQgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBGSVhQX0RCTCBucmdMZWZ0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICBGSVhQX0RCTCBucmdSaWdodCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCiAgICAgICBsaSA9IGhfY29uLT5mcmVxQmFuZFRhYmxlW2ZyZXFfcmVzXVtqXTsKICAgICAgIHVpID0gaF9jb24tPmZyZXFCYW5kVGFibGVbZnJlcV9yZXNdW2ogKyAxXTsKIAotICAgICAgaWYoZnJlcV9yZXMgPT0gRlJFUV9SRVNfSElHSCl7Ci0gICAgICAgIGlmKGogPT0gMCAmJiB1aS1saSA+IDEpeworICAgICAgaWYgKGZyZXFfcmVzID09IEZSRVFfUkVTX0hJR0gpIHsKKyAgICAgICAgaWYgKGogPT0gMCAmJiB1aSAtIGxpID4gMSkgewogICAgICAgICAgIGxpKys7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2V7Ci0gICAgICAgIGlmKGogPT0gMCAmJiB1aS1saSA+IDIpeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGogPT0gMCAmJiB1aSAtIGxpID4gMikgewogICAgICAgICAgIGxpKys7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTc2NiwyNSArODE2LDI2IEBACiAgICAgICAqLwogICAgICAgbWlzc2luZ0hhcm1vbmljW2pdID0gMDsKIAotICAgICAgaWYoaF9zYnItPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnKXsKLQotICAgICAgICBpZihmcmVxX3JlcyA9PSBGUkVRX1JFU19ISUdIKXsKLSAgICAgICAgICBpZihoX3Nici0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY1tqXSl7ICAgIC8qQSBtaXNzaW5nIHNpbmUgaW4gdGhlIGN1cnJlbnQgYmFuZCovCisgICAgICBpZiAoaF9zYnItPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnKSB7CisgICAgICAgIGlmIChmcmVxX3JlcyA9PSBGUkVRX1JFU19ISUdIKSB7CisgICAgICAgICAgaWYgKGhfc2JyLT5lbmNFbnZEYXRhCisgICAgICAgICAgICAgICAgICAuYWRkSGFybW9uaWNbal0pIHsgLypBIG1pc3Npbmcgc2luZSBpbiB0aGUgY3VycmVudCBiYW5kKi8KICAgICAgICAgICAgIG1pc3NpbmdIYXJtb25pY1tqXSA9IDE7CiAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgSU5UIGk7CiAgICAgICAgICAgSU5UIHN0YXJ0QmFuZEhpZ2ggPSAwOwogICAgICAgICAgIElOVCBzdG9wQmFuZEhpZ2ggPSAwOwogCi0gICAgICAgICAgd2hpbGUoaF9jb24tPmZyZXFCYW5kVGFibGVbRlJFUV9SRVNfSElHSF1bc3RhcnRCYW5kSGlnaF0gPCBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtGUkVRX1JFU19MT1ddW2pdKQorICAgICAgICAgIHdoaWxlIChoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtGUkVRX1JFU19ISUdIXVtzdGFydEJhbmRIaWdoXSA8CisgICAgICAgICAgICAgICAgIGhfY29uLT5mcmVxQmFuZFRhYmxlW0ZSRVFfUkVTX0xPV11bal0pCiAgICAgICAgICAgICBzdGFydEJhbmRIaWdoKys7Ci0gICAgICAgICAgd2hpbGUoaF9jb24tPmZyZXFCYW5kVGFibGVbRlJFUV9SRVNfSElHSF1bc3RvcEJhbmRIaWdoXSA8IGhfY29uLT5mcmVxQmFuZFRhYmxlW0ZSRVFfUkVTX0xPV11baiArIDFdKQorICAgICAgICAgIHdoaWxlIChoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtGUkVRX1JFU19ISUdIXVtzdG9wQmFuZEhpZ2hdIDwKKyAgICAgICAgICAgICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbRlJFUV9SRVNfTE9XXVtqICsgMV0pCiAgICAgICAgICAgICBzdG9wQmFuZEhpZ2grKzsKIAotICAgICAgICAgIGZvcihpID0gc3RhcnRCYW5kSGlnaDsgaTxzdG9wQmFuZEhpZ2g7IGkrKyl7Ci0gICAgICAgICAgICBpZihoX3Nici0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY1tpXSl7CisgICAgICAgICAgZm9yIChpID0gc3RhcnRCYW5kSGlnaDsgaSA8IHN0b3BCYW5kSGlnaDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaF9zYnItPmVuY0VudkRhdGEuYWRkSGFybW9uaWNbaV0pIHsKICAgICAgICAgICAgICAgbWlzc2luZ0hhcm1vbmljW2pdID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CkBAIC03OTIsMTA1ICs4NDMsODIgQEAKICAgICAgIH0KIAogICAgICAgLyoKLSAgICAgICAgSWYgYSBzaW5lIGlzIG1pc3NpbmcgaW4gYSBzY2FsZWZhY3RvcmJhbmQsIHdpdGggbW9yZSB0aGFuIG9uZSBxbWYgY2hhbm5lbAotICAgICAgICB1c2UgdGhlIG5yZyBmcm9tIHRoZSBjaGFubmVsIHdpdGggdGhlIGxhcmdlc3QgbnJnIHJhdGhlciB0aGFuIHRoZSBtZWFuLgotICAgICAgICBDb21wZW5zYXRlIGZvciB0aGUgYm9vc3QgY2FsY3VsYXRpb24gaW4gdGhlIGRlY2RvZGVyLgorICAgICAgICBJZiBhIHNpbmUgaXMgbWlzc2luZyBpbiBhIHNjYWxlZmFjdG9yYmFuZCwgd2l0aCBtb3JlIHRoYW4gb25lIHFtZgorICAgICAgICBjaGFubmVsIHVzZSB0aGUgbnJnIGZyb20gdGhlIGNoYW5uZWwgd2l0aCB0aGUgbGFyZ2VzdCBucmcgcmF0aGVyIHRoYW4KKyAgICAgICAgdGhlIG1lYW4uIENvbXBlbnNhdGUgZm9yIHRoZSBib29zdCBjYWxjdWxhdGlvbiBpbiB0aGUgZGVjZG9kZXIuCiAgICAgICAqLwotICAgICAgaW50IGJvcmRlcl9wb3MgPSBmaXhNaW4oc3RvcF9wb3MsIGhfc2JyLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlcldyaXRlT2Zmc2V0PDxZQnVmZmVyU3pTaGlmdCk7CisgICAgICBpbnQgYm9yZGVyX3BvcyA9CisgICAgICAgICAgZml4TWluKHN0b3BfcG9zLCBoX3Nici0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJXcml0ZU9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFlCdWZmZXJTelNoaWZ0KTsKIAotICAgICAgaWYobWlzc2luZ0hhcm1vbmljW2pdKXsKLQorICAgICAgaWYgKG1pc3NpbmdIYXJtb25pY1tqXSkgewogICAgICAgICBpbnQgazsKICAgICAgICAgY291bnRbal0gPSBzdG9wX3BvcyAtIHN0YXJ0X3BvczsKICAgICAgICAgbnJnTGVmdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCiAgICAgICAgIGZvciAoayA9IGxpOyBrIDwgdWk7IGsrKykgewogICAgICAgICAgIEZJWFBfREJMIHRtcE5yZzsKLSAgICAgICAgICB0bXBOcmcgPSBnZXRFbnZTZmJFbmVyZ3koaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaysxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlTGVmdDAsCisgICAgICAgICAgdG1wTnJnID0gZ2V0RW52U2ZiRW5lcmd5KGssIGsgKyAxLCBzdGFydF9wb3MsIHN0b3BfcG9zLCBib3JkZXJfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyTGVmdCwgWUJ1ZmZlclN6U2hpZnQsIHNjYWxlTGVmdDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlTGVmdDEpOwogCiAgICAgICAgICAgbnJnTGVmdCA9IGZpeE1heChucmdMZWZ0LCB0bXBOcmcpOwogICAgICAgICB9CiAKICAgICAgICAgLyogRW5lcmd5IGxvd2VyaW5nIGNvbXBlbnNhdGlvbiAqLwotICAgICAgICBucmdMZWZ0ID0gbWhMb3dlcmluZ0VuZXJneShucmdMZWZ0LCB1aS1saSk7CisgICAgICAgIG5yZ0xlZnQgPSBtaExvd2VyaW5nRW5lcmd5KG5yZ0xlZnQsIHVpIC0gbGkpOwogCiAgICAgICAgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgewotCiAgICAgICAgICAgbnJnUmlnaHQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAogICAgICAgICAgIGZvciAoayA9IGxpOyBrIDwgdWk7IGsrKykgewogICAgICAgICAgICAgRklYUF9EQkwgdG1wTnJnOwotICAgICAgICAgICAgdG1wTnJnID0gZ2V0RW52U2ZiRW5lcmd5KGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaysxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVJpZ2h0MCwKKyAgICAgICAgICAgIHRtcE5yZyA9IGdldEVudlNmYkVuZXJneShrLCBrICsgMSwgc3RhcnRfcG9zLCBzdG9wX3BvcywgYm9yZGVyX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyUmlnaHQsIFlCdWZmZXJTelNoaWZ0LCBzY2FsZVJpZ2h0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVJpZ2h0MSk7CiAKICAgICAgICAgICAgIG5yZ1JpZ2h0ID0gZml4TWF4KG5yZ1JpZ2h0LCB0bXBOcmcpOwogICAgICAgICAgIH0KIAogICAgICAgICAgIC8qIEVuZXJneSBsb3dlcmluZyBjb21wZW5zYXRpb24gKi8KLSAgICAgICAgICBucmdSaWdodCA9IG1oTG93ZXJpbmdFbmVyZ3kobnJnUmlnaHQsIHVpLWxpKTsKKyAgICAgICAgICBucmdSaWdodCA9IG1oTG93ZXJpbmdFbmVyZ3kobnJnUmlnaHQsIHVpIC0gbGkpOwogICAgICAgICB9CiAgICAgICB9IC8qIGVuZCBtaXNzaW5nSGFybW9uaWMgKi8KLSAgICAgIGVsc2V7CisgICAgICBlbHNlIHsKICAgICAgICAgY291bnRbal0gPSAoc3RvcF9wb3MgLSBzdGFydF9wb3MpICogKHVpIC0gbGkpOwogCi0gICAgICAgIG5yZ0xlZnQgPSBnZXRFbnZTZmJFbmVyZ3kobGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcl9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlckxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVMZWZ0MCwKKyAgICAgICAgbnJnTGVmdCA9IGdldEVudlNmYkVuZXJneShsaSwgdWksIHN0YXJ0X3Bvcywgc3RvcF9wb3MsIGJvcmRlcl9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlckxlZnQsIFlCdWZmZXJTelNoaWZ0LCBzY2FsZUxlZnQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlTGVmdDEpOwogCiAgICAgICAgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgewotICAgICAgICAgIG5yZ1JpZ2h0ID0gZ2V0RW52U2ZiRW5lcmd5KGxpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVJpZ2h0MCwKKyAgICAgICAgICBucmdSaWdodCA9IGdldEVudlNmYkVuZXJneShsaSwgdWksIHN0YXJ0X3Bvcywgc3RvcF9wb3MsIGJvcmRlcl9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclJpZ2h0LCBZQnVmZmVyU3pTaGlmdCwgc2NhbGVSaWdodDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVSaWdodDEpOwogICAgICAgICB9CiAgICAgICB9IC8qICFtaXNzaW5nSGFybW9uaWMgKi8KIAogICAgICAgLyogc2F2ZSBlbmVyZ2llcyAqLwotICAgICAgcE5yZ0xlZnRbal0gID0gbnJnTGVmdDsKKyAgICAgIHBOcmdMZWZ0W2pdID0gbnJnTGVmdDsKICAgICAgIHBOcmdSaWdodFtqXSA9IG5yZ1JpZ2h0OwotICAgICAgZW52TnJnTGVmdCAgKz0gKG5yZ0xlZnQ+PmVudk5yZ19zY2FsZSk7Ci0gICAgICBlbnZOcmdSaWdodCArPSAobnJnUmlnaHQ+PmVudk5yZ19zY2FsZSk7CisgICAgICBlbnZOcmdMZWZ0ICs9IChucmdMZWZ0ID4+IGVudk5yZ19zY2FsZSk7CisgICAgICBlbnZOcmdSaWdodCArPSAobnJnUmlnaHQgPj4gZW52TnJnX3NjYWxlKTsKICAgICB9IC8qIGogKi8KIAogICAgIGZvciAoaiA9IDA7IGogPCBub19vZl9iYW5kczsgaisrKSB7Ci0KICAgICAgIEZJWFBfREJMIG5yZ0xlZnQyID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICBGSVhQX0RCTCBucmdMZWZ0ICA9IHBOcmdMZWZ0W2pdOworICAgICAgRklYUF9EQkwgbnJnTGVmdCA9IHBOcmdMZWZ0W2pdOwogICAgICAgRklYUF9EQkwgbnJnUmlnaHQgPSBwTnJnUmlnaHRbal07CiAKICAgICAgIC8qIE5vbmUgbWlzc2luZyBoYXJtb25pYyBFbmVyZ3kgbG93ZXJpbmcgY29tcGVuc2F0aW9uICovCi0gICAgICBpZighbWlzc2luZ0hhcm1vbmljW2pdICYmIGhfc2JyLT5mTGV2ZWxQcm90ZWN0KSB7CisgICAgICBpZiAoIW1pc3NpbmdIYXJtb25pY1tqXSAmJiBoX3Nici0+ZkxldmVsUHJvdGVjdCkgewogICAgICAgICAvKiBpbiBjYXNlIG9mIG1pc3NpbmcgZW5lcmd5IGluIGJhc2UgYmFuZCwKICAgICAgICAgICAgcmVkdWNlIHJlZmVyZW5jZSBlbmVyZ3kgdG8gcHJldmVudCBvdmVyZmxvd3MgaW4gZGVjb2RlciBvdXRwdXQgKi8KLSAgICAgICAgbnJnTGVmdCA9IG5taExvd2VyaW5nRW5lcmd5KG5yZ0xlZnQsIGVudk5yZ0xlZnQsIGVudk5yZ19zY2FsZSwgbm9fb2ZfYmFuZHMpOworICAgICAgICBucmdMZWZ0ID0KKyAgICAgICAgICAgIG5taExvd2VyaW5nRW5lcmd5KG5yZ0xlZnQsIGVudk5yZ0xlZnQsIGVudk5yZ19zY2FsZSwgbm9fb2ZfYmFuZHMpOwogICAgICAgICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKLSAgICAgICAgICBucmdSaWdodCA9IG5taExvd2VyaW5nRW5lcmd5KG5yZ1JpZ2h0LCBlbnZOcmdSaWdodCwgZW52TnJnX3NjYWxlLCBub19vZl9iYW5kcyk7CisgICAgICAgICAgbnJnUmlnaHQgPSBubWhMb3dlcmluZ0VuZXJneShucmdSaWdodCwgZW52TnJnUmlnaHQsIGVudk5yZ19zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX29mX2JhbmRzKTsKICAgICAgICAgfQogICAgICAgfQogCkBAIC05MDAsMzEgKzkyOCwzNCBAQAogICAgICAgICBucmdMZWZ0ID0gKG5yZ1JpZ2h0ICsgbnJnTGVmdCkgPj4gMTsKICAgICAgIH0KIAotICAgICAgLyogbnJnTGVmdCA9IGYyMF9sb2cyKG5yZ0xlZnQgLyAoUEZMT0FUKShjb3VudCAqIGhfc2JyLT5zYnJRbWYubm9fY2hhbm5lbHMpKSsoUEZMT0FUKTQ0OyAqLworICAgICAgLyogbnJnTGVmdCA9IGYyMF9sb2cyKG5yZ0xlZnQgLyAoUEZMT0FUKShjb3VudCAqIDY0KSkrKFBGTE9BVCk0NDsgKi8KICAgICAgIC8qIElmIG5yZ0xlZnQgPT0gMCB0aGVuIHRoZSBMb2cgY2FsY3VsYXRpb25zIGJlbG93IGRvIGZhaWwuICovCi0gICAgICBpZiAobnJnTGVmdCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgICAgewotICAgICAgICBGSVhQX0RCTCB0bXAwLHRtcDEsdG1wMix0bXAzOworICAgICAgaWYgKG5yZ0xlZnQgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICBGSVhQX0RCTCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwogICAgICAgICBJTlQgdG1wU2NhbGU7CiAKICAgICAgICAgdG1wU2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKG5yZ0xlZnQpOwogICAgICAgICBucmdMZWZ0ID0gbnJnTGVmdCA8PCB0bXBTY2FsZTsKIAotICAgICAgICB0bXAwID0gQ2FsY0xkRGF0YShucmdMZWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGVkIGJ5IDEvNjQgKi8KLSAgICAgICAgdG1wMSA9ICgoRklYUF9EQkwpIChjb21tb25TY2FsZSt0bXBTY2FsZSkpIDw8IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMSk7ICAgIC8qIHNjYWxlZCBieSAxLzY0ICovCi0gICAgICAgIHRtcDIgPSAoKEZJWFBfREJMKShjb3VudFtqXSpoX2Nvbi0+bm9RbWZCYW5kcykpIDw8IChERlJBQ1RfQklUUy0xLTE0LTEpOwotICAgICAgICB0bXAyID0gQ2FsY0xkRGF0YSh0bXAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGVkIGJ5IDEvNjQgKi8KLSAgICAgICAgdG1wMyA9IEZMMkZYQ09OU1RfREJMKDAuNjg3NWYtMC4yMTg3NWYtMC4wMTU2MjVmKT4+MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlZCBieSAxLzY0ICovCisgICAgICAgIHRtcDAgPSBDYWxjTGREYXRhKG5yZ0xlZnQpOyAvKiBzY2FsZWQgYnkgMS82NCAqLworICAgICAgICB0bXAxID0gKChGSVhQX0RCTCkoY29tbW9uU2NhbGUgKyB0bXBTY2FsZSkpCisgICAgICAgICAgICAgICA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCAtIDEpOyAvKiBzY2FsZWQgYnkgMS82NCAqLworICAgICAgICB0bXAyID0gKChGSVhQX0RCTCkoY291bnRbal0gKiA2NCkpIDw8IChERlJBQ1RfQklUUyAtIDEgLSAxNCAtIDEpOworICAgICAgICB0bXAyID0gQ2FsY0xkRGF0YSh0bXAyKTsgLyogc2NhbGVkIGJ5IDEvNjQgKi8KKyAgICAgICAgdG1wMyA9IEZMMkZYQ09OU1RfREJMKDAuNjg3NWYgLSAwLjIxODc1ZiAtIDAuMDE1NjI1ZikgPj4KKyAgICAgICAgICAgICAgIDE7IC8qIHNjYWxlZCBieSAxLzY0ICovCiAKLSAgICAgICAgbnJnTGVmdCA9ICgodG1wMC10bXAyKT4+MSkgKyAodG1wMyAtIHRtcDEpOworICAgICAgICBucmdMZWZ0ID0gKCh0bXAwIC0gdG1wMikgPj4gMSkgKyAodG1wMyAtIHRtcDEpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgbnJnTGVmdCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgICAgIH0KIAogICAgICAgLyogbGQ2NCB0byBpbnRlZ2VyIGNvbnZlcnNpb24gKi8KLSAgICAgIG5yZ0xlZnQgPSBmaXhNaW4oZml4TWF4KG5yZ0xlZnQsRkwyRlhDT05TVF9EQkwoMC4wZikpLChGTDJGWENPTlNUX0RCTCgwLjVmKT4+b25lQml0TGVzcykpOwotICAgICAgbnJnTGVmdCA9IChGSVhQX0RCTCkoTE9ORylucmdMZWZ0ID4+IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMS1vbmVCaXRMZXNzLTEpOwotICAgICAgc2ZiX25yZ0xlZnRbbV0gPSAoKElOVClucmdMZWZ0KzEpPj4xOyAvKiByb3VuZGluZyAqLworICAgICAgbnJnTGVmdCA9IGZpeE1pbihmaXhNYXgobnJnTGVmdCwgRkwyRlhDT05TVF9EQkwoMC4wZikpLAorICAgICAgICAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gb25lQml0TGVzcykpOworICAgICAgbnJnTGVmdCA9IChGSVhQX0RCTCkoTE9ORylucmdMZWZ0ID4+CisgICAgICAgICAgICAgICAgKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQgLSAxIC0gb25lQml0TGVzcyAtIDEpOworICAgICAgc2ZiX25yZ0xlZnRbbV0gPSAoKElOVClucmdMZWZ0ICsgMSkgPj4gMTsgLyogcm91bmRpbmcgKi8KIAogICAgICAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX0NPVVBMSU5HKSB7CiAgICAgICAgIEZJWFBfREJMIHNjYWxlRnJhY3Q7CkBAIC05MzYsMTQgKzk2NywyMCBAQAogICAgICAgICBzYzAgPSBDb3VudExlYWRpbmdCaXRzKG5yZ0xlZnQyKTsKICAgICAgICAgc2MxID0gQ291bnRMZWFkaW5nQml0cyhucmdSaWdodCk7CiAKLSAgICAgICAgc2NhbGVGcmFjdCA9ICgoRklYUF9EQkwpKHNjMC1zYzEpKSA8PCAoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKTsgLyogc2NhbGUgdmFsdWUgaW4gbGQ2NCByZXByZXNlbnRhdGlvbiAqLwotICAgICAgICBucmdSaWdodCA9IENhbGNMZERhdGEobnJnTGVmdDI8PHNjMCkgLSBDYWxjTGREYXRhKG5yZ1JpZ2h0PDxzYzEpIC0gc2NhbGVGcmFjdDsKKyAgICAgICAgc2NhbGVGcmFjdCA9CisgICAgICAgICAgICAoKEZJWFBfREJMKShzYzAgLSBzYzEpKQorICAgICAgICAgICAgPDwgKERGUkFDVF9CSVRTIC0gMSAtCisgICAgICAgICAgICAgICAgTERfREFUQV9TSElGVCk7IC8qIHNjYWxlIHZhbHVlIGluIGxkNjQgcmVwcmVzZW50YXRpb24gKi8KKyAgICAgICAgbnJnUmlnaHQgPSBDYWxjTGREYXRhKG5yZ0xlZnQyIDw8IHNjMCkgLSBDYWxjTGREYXRhKG5yZ1JpZ2h0IDw8IHNjMSkgLQorICAgICAgICAgICAgICAgICAgIHNjYWxlRnJhY3Q7CiAKICAgICAgICAgLyogbGQ2NCB0byBpbnRlZ2VyIGNvbnZlcnNpb24gKi8KLSAgICAgICAgbnJnUmlnaHQgPSAoRklYUF9EQkwpKExPTkcpKG5yZ1JpZ2h0KSA+PiAoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZULTEtb25lQml0TGVzcyk7Ci0gICAgICAgIG5yZ1JpZ2h0ICA9IChucmdSaWdodCsoRklYUF9EQkwpMSk+PjE7IC8qIHJvdW5kaW5nICovCisgICAgICAgIG5yZ1JpZ2h0ID0gKEZJWFBfREJMKShMT05HKShucmdSaWdodCkgPj4KKyAgICAgICAgICAgICAgICAgICAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCAtIDEgLSBvbmVCaXRMZXNzKTsKKyAgICAgICAgbnJnUmlnaHQgPSAobnJnUmlnaHQgKyAoRklYUF9EQkwpMSkgPj4gMTsgLyogcm91bmRpbmcgKi8KIAotICAgICAgICBzZmJfbnJnUmlnaHRbbV0gPSBtYXBQYW5vcmFtYSAobnJnUmlnaHQsaF9zYnItPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlcywmcXVhbnRFcnJvcik7CisgICAgICAgIHNmYl9ucmdSaWdodFttXSA9IG1hcFBhbm9yYW1hKAorICAgICAgICAgICAgbnJnUmlnaHQsIGhfc2JyLT5lbmNFbnZEYXRhLmluaXRfc2JyX2FtcF9yZXMsICZxdWFudEVycm9yKTsKIAogICAgICAgICAqbWF4UXVhbnRFcnJvciA9IGZpeE1heChxdWFudEVycm9yLCAqbWF4UXVhbnRFcnJvcik7CiAgICAgICB9CkBAIC05NTEsMjEgKzk4OCwyNSBAQAogICAgICAgbSsrOwogICAgIH0gLyogaiAqLwogCi0gICAgIC8qIERvIGVuZXJneSBjb21wZW5zYXRpb24gZm9yIHNpbmVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdHdvCi0gICAgICAgICBRTUYtYmFuZHMgaW4gdGhlIG9yaWdpbmFsLCBidXQgd2lsbCBvbmx5IG9jY3VyIGluIG9uZSBiYW5kIGluCi0gICAgICAgICB0aGUgZGVjb2RlciBkdWUgdG8gdGhlIHN5bnRoZXRpYyBzaW5lIGNvZGluZy4qLworICAgIC8qIERvIGVuZXJneSBjb21wZW5zYXRpb24gZm9yIHNpbmVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdHdvCisgICAgICAgIFFNRi1iYW5kcyBpbiB0aGUgb3JpZ2luYWwsIGJ1dCB3aWxsIG9ubHkgb2NjdXIgaW4gb25lIGJhbmQgaW4KKyAgICAgICAgdGhlIGRlY29kZXIgZHVlIHRvIHRoZSBzeW50aGV0aWMgc2luZSBjb2RpbmcuKi8KICAgICBpZiAoaF9jb24tPnVzZVBhcmFtZXRyaWNDb2RpbmcpIHsKLSAgICAgIG0tPW5vX29mX2JhbmRzOworICAgICAgbSAtPSBub19vZl9iYW5kczsKICAgICAgIGZvciAoaiA9IDA7IGogPCBub19vZl9iYW5kczsgaisrKSB7Ci0gICAgICAgIGlmIChmcmVxX3Jlcz09RlJFUV9SRVNfSElHSCAmJiBoX3Nici0+c2JyRXh0cmFjdEVudmVsb3BlLmVudmVsb3BlQ29tcGVuc2F0aW9uW2pdKXsKLSAgICAgICAgICBzZmJfbnJnTGVmdFttXSAtPSAoY2EgKiBmaXhwX2FicygoSU5UKWhfc2JyLT5zYnJFeHRyYWN0RW52ZWxvcGUuZW52ZWxvcGVDb21wZW5zYXRpb25bal0pKTsKKyAgICAgICAgaWYgKGZyZXFfcmVzID09IEZSRVFfUkVTX0hJR0ggJiYKKyAgICAgICAgICAgIGhfc2JyLT5zYnJFeHRyYWN0RW52ZWxvcGUuZW52ZWxvcGVDb21wZW5zYXRpb25bal0pIHsKKyAgICAgICAgICBzZmJfbnJnTGVmdFttXSAtPQorICAgICAgICAgICAgICAoY2EgKgorICAgICAgICAgICAgICAgZml4cF9hYnMoCisgICAgICAgICAgICAgICAgICAgKElOVCloX3Nici0+c2JyRXh0cmFjdEVudmVsb3BlLmVudmVsb3BlQ29tcGVuc2F0aW9uW2pdKSk7CiAgICAgICAgIH0KICAgICAgICAgc2ZiX25yZ0xlZnRbbV0gPSBmaXhNYXgoMCwgc2ZiX25yZ0xlZnRbbV0pOwogICAgICAgICBtKys7CiAgICAgICB9CiAgICAgfSAvKiB1c2VQYXJhbWV0cmljQ29kaW5nICovCiAKLSAgfSAvKiBpKi8KKyAgfSAvKiBlbnYgbG9vcCAqLwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTg0LDk2ICsxMDI1LDczIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBMTktfU0VDVElPTl9DT0RFX0wxCi12b2lkCi1GREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMSAoCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgaF9jb24sIC8qISBoYW5kbGUgdG8gY29uZmlnIGRhdGEgICAqLwotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMIGhFbnZDaGFuLAotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgaENtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICBTQlJfRU5WX1RFTVBfREFUQSAgICplRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU0JSX0ZSQU1FX1RFTVBfREFUQSAqZkRhdGEKLSAgICAgICAgICAgICAgICAgICApCi17Ci0KK3ZvaWQgRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTEoCisgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwgLyohIGhhbmRsZSB0byBjb25maWcgZGF0YSAgICovCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSwgSEFORExFX0VOVl9DSEFOTkVMIGhFbnZDaGFuLAorICAgIEhBTkRMRV9DT01NT05fREFUQSBoQ21vbkRhdGEsIFNCUl9FTlZfVEVNUF9EQVRBICplRGF0YSwKKyAgICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YSkgewogICBIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgc2JyRXh0ckVudiA9ICZoRW52Q2hhbi0+c2JyRXh0cmFjdEVudmVsb3BlOwogCiAgIGlmIChzYnJFeHRyRW52LT5ZQnVmZmVyU3pTaGlmdCA9PSAwKQotICAgIEZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGFGdWxsKCZzYnJFeHRyRW52LT5ZQnVmZmVyW3NickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+ckJ1ZmZlciArIHNickV4dHJFbnYtPnJCdWZmZXJSZWFkT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIgKyBzYnJFeHRyRW52LT5yQnVmZmVyUmVhZE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+bm9RbWZCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ub19jb2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5xbWZTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGVbMV0pOworICAgIEZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGFGdWxsKAorICAgICAgICAmc2JyRXh0ckVudi0+WUJ1ZmZlcltzYnJFeHRyRW52LT5ZQnVmZmVyV3JpdGVPZmZzZXRdLAorICAgICAgICBzYnJFeHRyRW52LT5yQnVmZmVyICsgc2JyRXh0ckVudi0+ckJ1ZmZlclJlYWRPZmZzZXQsCisgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIgKyBzYnJFeHRyRW52LT5yQnVmZmVyUmVhZE9mZnNldCwgaF9jb24tPm5vUW1mQmFuZHMsCisgICAgICAgIHNickV4dHJFbnYtPm5vX2NvbHMsICZoRW52Q2hhbi0+cW1mU2NhbGUsICZzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGVbMV0pOwogICBlbHNlCi0gICAgRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YSgmc2JyRXh0ckVudi0+WUJ1ZmZlcltzYnJFeHRyRW52LT5ZQnVmZmVyV3JpdGVPZmZzZXRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+ckJ1ZmZlciArIHNickV4dHJFbnYtPnJCdWZmZXJSZWFkT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+aUJ1ZmZlciArIHNickV4dHJFbnYtPnJCdWZmZXJSZWFkT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPm5vUW1mQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ub19jb2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnFtZlNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlWzFdKTsKKyAgICBGREtzYnJFbmNfZ2V0RW5lcmd5RnJvbUNwbHhRbWZEYXRhKAorICAgICAgICAmc2JyRXh0ckVudi0+WUJ1ZmZlcltzYnJFeHRyRW52LT5ZQnVmZmVyV3JpdGVPZmZzZXRdLAorICAgICAgICBzYnJFeHRyRW52LT5yQnVmZmVyICsgc2JyRXh0ckVudi0+ckJ1ZmZlclJlYWRPZmZzZXQsCisgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIgKyBzYnJFeHRyRW52LT5yQnVmZmVyUmVhZE9mZnNldCwgaF9jb24tPm5vUW1mQmFuZHMsCisgICAgICAgIHNickV4dHJFbnYtPm5vX2NvbHMsICZoRW52Q2hhbi0+cW1mU2NhbGUsICZzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGVbMV0pOwogCi0KKyAgLyogRW5lcmdpZSB2YWx1ZXMgPQorICAgKiBzYnJFeHRyRW52LT5ZQnVmZmVyW3NickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldF1beF0uZmxvYXRWYWwgKgorICAgKiAoMTw8Mio3LXNickV4dHJFbnYtPllCdWZmZXJTY2FsZVsxXSkgKi8KIAogICAvKgogICAgIFByZWNhbGN1bGF0aW9uIG9mIFRvbmFsaXR5IFF1b3RhcyAgQ09FRkYgVHJhbnNmb3JtIE9LCiAgICovCi0gIEZES3NickVuY19DYWxjdWxhdGVUb25hbGl0eVF1b3RhcygmaEVudkNoYW4tPlRvbkNvcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+ckJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5pQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5mcmVxQmFuZFRhYmxlW0hJXVtoX2Nvbi0+blNmYltISV1dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZDaGFuLT5xbWZTY2FsZSk7CisgIEZES3NickVuY19DYWxjdWxhdGVUb25hbGl0eVF1b3RhcygKKyAgICAgICZoRW52Q2hhbi0+VG9uQ29yciwgc2JyRXh0ckVudi0+ckJ1ZmZlciwgc2JyRXh0ckVudi0+aUJ1ZmZlciwKKyAgICAgIGhfY29uLT5mcmVxQmFuZFRhYmxlW0hJXVtoX2Nvbi0+blNmYltISV1dLCBoRW52Q2hhbi0+cW1mU2NhbGUpOwogCi0KLSAgaWYoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKLSAgICBGSVhQX0RCTCB0b25hbGl0eSA9IEZES3NickVuY19HZXRUb25hbGl0eSAoCi0gICAgICAgICAgaEVudkNoYW4tPlRvbkNvcnIucXVvdGFNYXRyaXgsCi0gICAgICAgICAgaEVudkNoYW4tPlRvbkNvcnIubnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwKLSAgICAgICAgICBoRW52Q2hhbi0+VG9uQ29yci5zdGFydEluZGV4TWF0cml4LAotICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXIgKyBzYnJFeHRyRW52LT5ZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbSEldWzBdKzEsCi0gICAgICAgICAgaF9jb24tPm5vUW1mQmFuZHMsCi0gICAgICAgICAgc2JyRXh0ckVudi0+bm9fY29scwotICAgICAgICApOworICBpZiAoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKKyAgICBGSVhQX0RCTCB0b25hbGl0eSA9IEZES3NickVuY19HZXRUb25hbGl0eSgKKyAgICAgICAgaEVudkNoYW4tPlRvbkNvcnIucXVvdGFNYXRyaXgsCisgICAgICAgIGhFbnZDaGFuLT5Ub25Db3JyLm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUsCisgICAgICAgIGhFbnZDaGFuLT5Ub25Db3JyLnN0YXJ0SW5kZXhNYXRyaXgsCisgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXIgKyBzYnJFeHRyRW52LT5ZQnVmZmVyV3JpdGVPZmZzZXQsCisgICAgICAgIGhfY29uLT5mcmVxQmFuZFRhYmxlW0hJXVswXSArIDEsIGhfY29uLT5ub1FtZkJhbmRzLAorICAgICAgICBzYnJFeHRyRW52LT5ub19jb2xzKTsKIAogICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLnRvbl9IRlsxXSA9IGhFbnZDaGFuLT5lbmNFbnZEYXRhLnRvbl9IRlswXTsKICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS50b25fSEZbMF0gPSB0b25hbGl0eTsKIAogICAgIC8qIHRvbmFsaXR5IGlzIHNjYWxlZCBieSAyXjE5LzAuNTI0Mjg4ZiAoZnJhY3QgcGFydCBvZiBSRUxBWEFUSU9OKSAqLwotICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmdsb2JhbF90b25hbGl0eSA9IChoRW52Q2hhbi0+ZW5jRW52RGF0YS50b25fSEZbMF0+PjEpICsgKGhFbnZDaGFuLT5lbmNFbnZEYXRhLnRvbl9IRlsxXT4+MSk7CisgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuZ2xvYmFsX3RvbmFsaXR5ID0KKyAgICAgICAgKGhFbnZDaGFuLT5lbmNFbnZEYXRhLnRvbl9IRlswXSA+PiAxKSArCisgICAgICAgIChoRW52Q2hhbi0+ZW5jRW52RGF0YS50b25fSEZbMV0gPj4gMSk7CiAgIH0KIAotCi0KICAgLyoKICAgICBUcmFuc2llbnQgZGV0ZWN0aW9uIENPRUZGIFRyYW5zZm9ybSBPSwogICAqLwotICBpZihoX2Nvbi0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkKLSAgewotICAgIEZES3NickVuY19mYXN0VHJhbnNpZW50RGV0ZWN0KAotICAgICAgICAgICAgJmhFbnZDaGFuLT5zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IsCi0gICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlciwKLSAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGUsCi0gICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgIGVEYXRhLT50cmFuc2llbnRfaW5mbwotICAgICAgICAgICAgICk7CiAKKyAgaWYgKGhfY29uLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSB7CisgICAgRkRLc2JyRW5jX2Zhc3RUcmFuc2llbnREZXRlY3QoJmhFbnZDaGFuLT5zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlciwgc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YS0+dHJhbnNpZW50X2luZm8pOworCisgIH0gZWxzZSB7CisgICAgRkRLc2JyRW5jX3RyYW5zaWVudERldGVjdCgKKyAgICAgICAgJmhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3Rvciwgc2JyRXh0ckVudi0+WUJ1ZmZlciwKKyAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlLCBlRGF0YS0+dHJhbnNpZW50X2luZm8sCisgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwgc2JyRXh0ckVudi0+WUJ1ZmZlclN6U2hpZnQsCisgICAgICAgIHNickV4dHJFbnYtPnRpbWVfc3RlcCwgaEVudkNoYW4tPlNickVudkZyYW1lLmZyYW1lTWlkZGxlU2xvdCk7CiAgIH0KLSAgZWxzZQotICB7Ci0gIEZES3NickVuY190cmFuc2llbnREZXRlY3QoJmhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YS0+dHJhbnNpZW50X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPnRpbWVfc3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPlNickVudkZyYW1lLmZyYW1lTWlkZGxlU2xvdCk7Ci0gIH0KLQotCiAKICAgLyoKICAgICBHZW5lcmF0ZSBmbGFncyBmb3IgMiBlbnYgaW4gYSBGSVhGSVgtZnJhbWUuCkBAIC0xMDgzLDE5ICsxMTAxLDEyIEBACiAgIC8qCiAgICAgZnJhbWUgU3BsaXR0ZXIgQ09FRkYgVHJhbnNmb3JtIE9LCiAgICovCi0gIEZES3NickVuY19mcmFtZVNwbGl0dGVyKHNickV4dHJFbnYtPllCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGEtPnRyYW5zaWVudF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJTelNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+blNmYlsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+dGltZV9zdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ub19jb2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+ZW5jRW52RGF0YS5nbG9iYWxfdG9uYWxpdHkpOwotCi0KKyAgRkRLc2JyRW5jX2ZyYW1lU3BsaXR0ZXIoCisgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyLCBzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGUsCisgICAgICAmaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLCBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVsxXSwKKyAgICAgIGVEYXRhLT50cmFuc2llbnRfaW5mbywgc2JyRXh0ckVudi0+WUJ1ZmZlcldyaXRlT2Zmc2V0LAorICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclN6U2hpZnQsIGhfY29uLT5uU2ZiWzFdLCBzYnJFeHRyRW52LT50aW1lX3N0ZXAsCisgICAgICBzYnJFeHRyRW52LT5ub19jb2xzLCAmaEVudkNoYW4tPmVuY0VudkRhdGEuZ2xvYmFsX3RvbmFsaXR5KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTExMjgsNTMgKzExMzksNDUgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIExOS19TRUNUSU9OX0NPREVfTDEKLXZvaWQKLUZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUyICgKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwgLyohIGhhbmRsZSB0byBjb25maWcgZGF0YSAgICovCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICAgIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCAgIGhfZW52Q2hhbjAsCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCAgIGhfZW52Q2hhbjEsCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgIGhDbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU0JSX0VOVl9URU1QX0RBVEEgICAqZURhdGEsCi0gICAgICAgICAgICAgICAgICAgIFNCUl9GUkFNRV9URU1QX0RBVEEgKmZEYXRhLAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBjbGVhck91dHB1dAotICAgICAgICAgICAgICAgICAgICkKLXsKK3ZvaWQgRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTIoCisgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwgLyohIGhhbmRsZSB0byBjb25maWcgZGF0YSAgICovCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEsIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX2VudkNoYW4wLAorICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX2VudkNoYW4xLCBIQU5ETEVfQ09NTU9OX0RBVEEgaENtb25EYXRhLAorICAgIFNCUl9FTlZfVEVNUF9EQVRBICplRGF0YSwgU0JSX0ZSQU1FX1RFTVBfREFUQSAqZkRhdGEsIGludCBjbGVhck91dHB1dCkgewogICBIQU5ETEVfRU5WX0NIQU5ORUwgaF9lbnZDaGFuW01BWF9OVU1fQ0hBTk5FTFNdID0ge2hfZW52Q2hhbjAsIGhfZW52Q2hhbjF9OwogICBpbnQgY2gsIGksIGosIGMsIFlTelNoaWZ0ID0gaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclN6U2hpZnQ7CiAKICAgU0JSX1NURVJFT19NT0RFIHN0ZXJlb01vZGUgPSBoX2Nvbi0+c3RlcmVvTW9kZTsKICAgaW50IG5DaGFubmVscyA9IGhfY29uLT5uQ2hhbm5lbHM7CiAgIGNvbnN0IGludCAqdl90dW5pbmc7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdl90dW5pbmdIRUFBQ1s2XSA9IHsgMCwgMiwgNCwgMCwgMCwgMCB9OworICBzdGF0aWMgY29uc3QgaW50IHZfdHVuaW5nSEVBQUNbNl0gPSB7MCwgMiwgNCwgMCwgMCwgMH07CiAKLSAgc3RhdGljIGNvbnN0IGludCB2X3R1bmluZ0VMRFs2XSA9IHsgMCwgMiwgMywgMCwgMCwgMCB9OworICBzdGF0aWMgY29uc3QgaW50IHZfdHVuaW5nRUxEWzZdID0gezAsIDIsIDMsIDAsIDAsIDB9OwogCiAgIGlmIChoX2Nvbi0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkKICAgICB2X3R1bmluZyA9IHZfdHVuaW5nRUxEOwogICBlbHNlCiAgICAgdl90dW5pbmcgPSB2X3R1bmluZ0hFQUFDOwogCi0KICAgLyoKICAgICBTZWxlY3Qgc3RlcmVvIG1vZGUuCiAgICovCiAgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgewogICAgIGlmIChlRGF0YVswXS50cmFuc2llbnRfaW5mb1sxXSAmJiBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1sxXSkgewotICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0gPSBmaXhNaW4oZURhdGFbMV0udHJhbnNpZW50X2luZm9bMF0sIGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdKTsKKyAgICAgIGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdID0KKyAgICAgICAgICBmaXhNaW4oZURhdGFbMV0udHJhbnNpZW50X2luZm9bMF0sIGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdKTsKICAgICAgIGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzBdID0gZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF07Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBpZiAoZURhdGFbMF0udHJhbnNpZW50X2luZm9bMV0gJiYgIWVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzFdKSB7CiAgICAgICAgIGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzBdID0gZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF07Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghZURhdGFbMF0udHJhbnNpZW50X2luZm9bMV0gJiYgZURhdGFbMV0udHJhbnNpZW50X2luZm9bMV0pCiAgICAgICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0gPSBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXTsKICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0gPSBmaXhNYXgoZURhdGFbMV0udHJhbnNpZW50X2luZm9bMF0sIGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdKTsKKyAgICAgICAgICBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXSA9CisgICAgICAgICAgICAgIGZpeE1heChlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSwgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0pOwogICAgICAgICAgIGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzBdID0gZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF07CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTExODQsMTgzICsxMTg3LDE3MSBAQAogICAvKgogICAgIERldGVybWluZSB0aW1lL2ZyZXF1ZW5jeSBkaXZpc2lvbiBvZiBjdXJyZW50IGdyYW51bGUKICAgKi8KLSAgZURhdGFbMF0uZnJhbWVfaW5mbyA9IEZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IoJmhfZW52Q2hhblswXS0+U2JyRW52RnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5wcmVfdHJhbnNpZW50X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5sZEdyaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfdHVuaW5nKTsKKyAgZURhdGFbMF0uZnJhbWVfaW5mbyA9IEZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IoCisgICAgICAmaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZSwgZURhdGFbMF0udHJhbnNpZW50X2luZm8sCisgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5yaWdodEJvcmRlckZJWCwKKyAgICAgIGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLnByZV90cmFuc2llbnRfaW5mbywKKyAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5sZEdyaWQsIHZfdHVuaW5nKTsKIAogICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuaFNickJTR3JpZCA9ICZoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLlNickdyaWQ7CiAKICAgLyogQUFDIExEIHBhdGNoIGZvciB0cmFuc2llbnQgcHJlZGljdGlvbiAqLwogICBpZiAoaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmxkR3JpZCAmJiBlRGF0YVswXS50cmFuc2llbnRfaW5mb1syXSkgewotICAgIC8qIGlmIG5leHQgZnJhbWUgd2lsbCBzdGFydCB3aXRoIHRyYW5zaWVudCwgc2V0IHNob3J0RW52IHRvIG51bUVudmVsb3BlcyhzaG9ydGVuZCBFbnZlbG9wZSA9IHNob3J0RW52LTEpKi8KLSAgICBoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLlNickZyYW1lSW5mby5zaG9ydEVudiA9IGhfZW52Q2hhblswXS0+U2JyRW52RnJhbWUuU2JyRnJhbWVJbmZvLm5FbnZlbG9wZXM7CisgICAgLyogaWYgbmV4dCBmcmFtZSB3aWxsIHN0YXJ0IHdpdGggdHJhbnNpZW50LCBzZXQgc2hvcnRFbnYgdG8KKyAgICAgKiBudW1FbnZlbG9wZXMoc2hvcnRlbmQgRW52ZWxvcGUgPSBzaG9ydEVudi0xKSovCisgICAgaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZS5TYnJGcmFtZUluZm8uc2hvcnRFbnYgPQorICAgICAgICBoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLlNickZyYW1lSW5mby5uRW52ZWxvcGVzOwogICB9CiAKLQogICBzd2l0Y2ggKHN0ZXJlb01vZGUpIHsKLSAgY2FzZSBTQlJfTEVGVF9SSUdIVDoKLSAgY2FzZSBTQlJfU1dJVENIX0xSQzoKLSAgICBlRGF0YVsxXS5mcmFtZV9pbmZvID0gRkRLc2JyRW5jX2ZyYW1lSW5mb0dlbmVyYXRvcigmaF9lbnZDaGFuWzFdLT5TYnJFbnZGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS50cmFuc2llbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5wcmVfdHJhbnNpZW50X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmxkR3JpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X3R1bmluZyk7CisgICAgY2FzZSBTQlJfTEVGVF9SSUdIVDoKKyAgICBjYXNlIFNCUl9TV0lUQ0hfTFJDOgorICAgICAgZURhdGFbMV0uZnJhbWVfaW5mbyA9IEZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IoCisgICAgICAgICAgJmhfZW52Q2hhblsxXS0+U2JyRW52RnJhbWUsIGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvLAorICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPnJpZ2h0Qm9yZGVyRklYLAorICAgICAgICAgIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLnByZV90cmFuc2llbnRfaW5mbywKKyAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEubGRHcmlkLCB2X3R1bmluZyk7CiAKLSAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuaFNickJTR3JpZCA9ICZoX2VudkNoYW5bMV0tPlNickVudkZyYW1lLlNickdyaWQ7CisgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuaFNickJTR3JpZCA9ICZoX2VudkNoYW5bMV0tPlNickVudkZyYW1lLlNickdyaWQ7CiAKLSAgICBpZiAoaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmxkR3JpZCAmJiBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1syXSkgewotICAgICAgLyogaWYgbmV4dCBmcmFtZSB3aWxsIHN0YXJ0IHdpdGggdHJhbnNpZW50LCBzZXQgc2hvcnRFbnYgdG8gbnVtRW52ZWxvcGVzKHNob3J0ZW5kIEVudmVsb3BlID0gc2hvcnRFbnYtMSkqLwotICAgICAgaF9lbnZDaGFuWzFdLT5TYnJFbnZGcmFtZS5TYnJGcmFtZUluZm8uc2hvcnRFbnYgPSBoX2VudkNoYW5bMV0tPlNickVudkZyYW1lLlNickZyYW1lSW5mby5uRW52ZWxvcGVzOwotICAgIH0KLQotICAgIC8qIGNvbXBhcmUgbGVmdCBhbmQgcmlnaHQgZnJhbWVfaW5mb3MgKi8KLSAgICBpZiAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyAhPSBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzKSB7Ci0gICAgICBzdGVyZW9Nb2RlID0gU0JSX0xFRlRfUklHSFQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzICsgMTsgaSsrKSB7Ci0gICAgICAgIGlmIChlRGF0YVswXS5mcmFtZV9pbmZvLT5ib3JkZXJzW2ldICE9IGVEYXRhWzFdLmZyYW1lX2luZm8tPmJvcmRlcnNbaV0pIHsKLSAgICAgICAgICBzdGVyZW9Nb2RlID0gU0JSX0xFRlRfUklHSFQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICAgIGlmIChoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEubGRHcmlkICYmIGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzJdKSB7CisgICAgICAgIC8qIGlmIG5leHQgZnJhbWUgd2lsbCBzdGFydCB3aXRoIHRyYW5zaWVudCwgc2V0IHNob3J0RW52IHRvCisgICAgICAgICAqIG51bUVudmVsb3BlcyhzaG9ydGVuZCBFbnZlbG9wZSA9IHNob3J0RW52LTEpKi8KKyAgICAgICAgaF9lbnZDaGFuWzFdLT5TYnJFbnZGcmFtZS5TYnJGcmFtZUluZm8uc2hvcnRFbnYgPQorICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5TYnJFbnZGcmFtZS5TYnJGcmFtZUluZm8ubkVudmVsb3BlczsKICAgICAgIH0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzOyBpKyspIHsKLSAgICAgICAgaWYgKGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXNbaV0gIT0gZURhdGFbMV0uZnJhbWVfaW5mby0+ZnJlcVJlc1tpXSkgewotICAgICAgICAgIHN0ZXJlb01vZGUgPSBTQlJfTEVGVF9SSUdIVDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGVEYXRhWzBdLmZyYW1lX2luZm8tPnNob3J0RW52ICE9IGVEYXRhWzFdLmZyYW1lX2luZm8tPnNob3J0RW52KSB7CisKKyAgICAgIC8qIGNvbXBhcmUgbGVmdCBhbmQgcmlnaHQgZnJhbWVfaW5mb3MgKi8KKyAgICAgIGlmIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzICE9IGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMpIHsKICAgICAgICAgc3RlcmVvTW9kZSA9IFNCUl9MRUZUX1JJR0hUOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgKyAxOyBpKyspIHsKKyAgICAgICAgICBpZiAoZURhdGFbMF0uZnJhbWVfaW5mby0+Ym9yZGVyc1tpXSAhPQorICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLT5ib3JkZXJzW2ldKSB7CisgICAgICAgICAgICBzdGVyZW9Nb2RlID0gU0JSX0xFRlRfUklHSFQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXM7IGkrKykgeworICAgICAgICAgIGlmIChlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzW2ldICE9CisgICAgICAgICAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8tPmZyZXFSZXNbaV0pIHsKKyAgICAgICAgICAgIHN0ZXJlb01vZGUgPSBTQlJfTEVGVF9SSUdIVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZURhdGFbMF0uZnJhbWVfaW5mby0+c2hvcnRFbnYgIT0gZURhdGFbMV0uZnJhbWVfaW5mby0+c2hvcnRFbnYpIHsKKyAgICAgICAgICBzdGVyZW9Nb2RlID0gU0JSX0xFRlRfUklHSFQ7CisgICAgICAgIH0KICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX0NPVVBMSU5HOgotICAgIGVEYXRhWzFdLmZyYW1lX2luZm8gPSBlRGF0YVswXS5mcmFtZV9pbmZvOwotICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5oU2JyQlNHcmlkID0gJmhfZW52Q2hhblswXS0+U2JyRW52RnJhbWUuU2JyR3JpZDsKLSAgICBicmVhazsKLSAgY2FzZSBTQlJfTU9OTzoKLSAgICAvKiBub3RoaW5nIHRvIGRvICovCi0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRkRLX0FTU0VSVCAoMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCUl9DT1VQTElORzoKKyAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8gPSBlRGF0YVswXS5mcmFtZV9pbmZvOworICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmhTYnJCU0dyaWQgPSAmaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZS5TYnJHcmlkOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlJfTU9OTzoKKyAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOwogICB9CiAKLQotICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKykKLSAgeworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgaEVudkNoYW4gPSBoX2VudkNoYW5bY2hdOwogICAgIEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBzYnJFeHRyRW52ID0gJmhFbnZDaGFuLT5zYnJFeHRyYWN0RW52ZWxvcGU7CiAgICAgU0JSX0VOVl9URU1QX0RBVEEgKmVkID0gJmVEYXRhW2NoXTsKIAotCiAgICAgLyoKICAgICAgICBTZW5kIHRyYW5zaWVudCBpbmZvIHRvIGJpdHN0cmVhbSBhbmQgc3RvcmUgZm9yIG5leHQgY2FsbAogICAgICovCi0gICAgc2JyRXh0ckVudi0+cHJlX3RyYW5zaWVudF9pbmZvWzBdID0gZWQtPnRyYW5zaWVudF9pbmZvWzBdOy8qIHRyYW5fcG9zICovCi0gICAgc2JyRXh0ckVudi0+cHJlX3RyYW5zaWVudF9pbmZvWzFdID0gZWQtPnRyYW5zaWVudF9pbmZvWzFdOy8qIHRyYW5fZmxhZyAqLwotICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLm5vT2ZFbnZlbG9wZXMgPSBlZC0+bkVudmVsb3BlcyA9IGVkLT5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzOyAgICAgLyogbnVtYmVyIG9mIGVudmVsb3BlcyBvZiBjdXJyZW50IGZyYW1lICovCisgICAgc2JyRXh0ckVudi0+cHJlX3RyYW5zaWVudF9pbmZvWzBdID0gZWQtPnRyYW5zaWVudF9pbmZvWzBdOyAvKiB0cmFuX3BvcyAqLworICAgIHNickV4dHJFbnYtPnByZV90cmFuc2llbnRfaW5mb1sxXSA9IGVkLT50cmFuc2llbnRfaW5mb1sxXTsgLyogdHJhbl9mbGFnICovCisgICAgaEVudkNoYW4tPmVuY0VudkRhdGEubm9PZkVudmVsb3BlcyA9IGVkLT5uRW52ZWxvcGVzID0KKyAgICAgICAgZWQtPmZyYW1lX2luZm8tPm5FbnZlbG9wZXM7IC8qIG51bWJlciBvZiBlbnZlbG9wZXMgb2YgY3VycmVudCBmcmFtZSAqLwogCiAgICAgLyoKLSAgICAgIENoZWNrIGlmIHRoZSBjdXJyZW50IGZyYW1lIGlzIGRpdmlkZWQgaW50byBvbmUgZW52ZWxvcGUgb25seS4gSWYgc28sIHNldCB0aGUgYW1wbGl0dWRlCi0gICAgICByZXNvbHV0aW9uIHRvIDEuNSBkQiwgb3RoZXJ3aXNlIG1heSBzZXQgYmFjayB0byBjaG9zZW4gdmFsdWUKKyAgICAgIENoZWNrIGlmIHRoZSBjdXJyZW50IGZyYW1lIGlzIGRpdmlkZWQgaW50byBvbmUgZW52ZWxvcGUgb25seS4gSWYgc28sIHNldAorICAgICAgdGhlIGFtcGxpdHVkZSByZXNvbHV0aW9uIHRvIDEuNSBkQiwgb3RoZXJ3aXNlIG1heSBzZXQgYmFjayB0byBjaG9zZW4gdmFsdWUKICAgICAqLwotICAgaWYoICggaEVudkNoYW4tPmVuY0VudkRhdGEuaFNickJTR3JpZC0+ZnJhbWVDbGFzcyA9PSBGSVhGSVggKQotICAgICAgICAmJiAoIGVkLT5uRW52ZWxvcGVzID09IDEgKSApCi0gICB7CisgICAgaWYgKChoRW52Q2hhbi0+ZW5jRW52RGF0YS5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzID09IEZJWEZJWCkgJiYKKyAgICAgICAgKGVkLT5uRW52ZWxvcGVzID09IDEpKSB7CisgICAgICBpZiAoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKKyAgICAgICAgLyogTm90ZTogZ2xvYmFsX3RvbmFsaXlfZmxvYXRfdmFsdWUgPT0KKyAgICAgICAgICAgKChmbG9hdCloRW52Q2hhbi0+ZW5jRW52RGF0YS5nbG9iYWxfdG9uYWxpdHkvKChJTlQ2NCkoMSk8PCgzMS0oMTkrMikpKS8wLjUyNDI4OCooMi4wLzMuMCkpKTsKKyAgICAgICAgICAgICAgICAgdGhyZXNob2xkX2Zsb2F0X3ZhbHVlID09CisgICAgICAgICAgICgoZmxvYXQpaF9jb24tPnRocmVzaG9sZEFtcFJlc0ZGX20vKChJTlQ2NCkoMSk8PCgzMS0oaF9jb24tPnRocmVzaG9sZEFtcFJlc0ZGX2UpKSkvMC41MjQyODgqKDIuMC8zLjApKSk7CisgICAgICAgICAqLworICAgICAgICAvKiBkZWNpc2lvbiBvZiBTQlJfQU1QX1JFUyAqLworICAgICAgICBpZiAoZklzTGVzc1RoYW4oLyogZ2xvYmFsX3RvbmFsaXR5ID4gdGhyZXNob2xkID8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT50aHJlc2hvbGRBbXBSZXNGRl9tLCBoX2Nvbi0+dGhyZXNob2xkQW1wUmVzRkZfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmdsb2JhbF90b25hbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFTEFYQVRJT05fU0hJRlQgKyAyKSkgeworICAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiA9IFNCUl9BTVBfUkVTXzFfNTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYgPSBTQlJfQU1QX1JFU18zXzA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZQorICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYgPSBTQlJfQU1QX1JFU18xXzU7CiAKLSAgICAgaWYgKGhfY29uLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKQotICAgICB7Ci0gICAgICAgLyogTm90ZTogZ2xvYmFsX3RvbmFsaXlfZmxvYXRfdmFsdWUgPT0gKChmbG9hdCloRW52Q2hhbi0+ZW5jRW52RGF0YS5nbG9iYWxfdG9uYWxpdHkvKChJTlQ2NCkoMSk8PCgzMS0oMTkrMikpKS8wLjUyNDI4OCooMi4wLzMuMCkpKTsKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGRfZmxvYXRfdmFsdWUgPT0gKChmbG9hdCloX2Nvbi0+dGhyZXNob2xkQW1wUmVzRkZfbS8oKElOVDY0KSgxKTw8KDMxLShoX2Nvbi0+dGhyZXNob2xkQW1wUmVzRkZfZSkpKS8wLjUyNDI4OCooMi4wLzMuMCkpKTsgKi8KLSAgICAgICAvKiBkZWNpc2lvbiBvZiBTQlJfQU1QX1JFUyAqLwotICAgICAgIGlmIChmSXNMZXNzVGhhbiggLyogZ2xvYmFsX3RvbmFsaXR5ID4gdGhyZXNob2xkID8gKi8KLSAgICAgICAgICAgICBoX2Nvbi0+dGhyZXNob2xkQW1wUmVzRkZfbSwgaF9jb24tPnRocmVzaG9sZEFtcFJlc0ZGX2UsCi0gICAgICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuZ2xvYmFsX3RvbmFsaXR5LCBSRUxBWEFUSU9OX1NISUZUKzIgKQotICAgICAgICAgICkKLSAgICAgICB7Ci0gICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYgPSBTQlJfQU1QX1JFU18xXzU7Ci0gICAgICAgfQotICAgICAgIGVsc2UgewotICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuY3VycmVudEFtcFJlc0ZGID0gU0JSX0FNUF9SRVNfM18wOwotICAgICAgIH0KLSAgICAgfSBlbHNlIHsKLSAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYgPSBTQlJfQU1QX1JFU18xXzU7Ci0gICAgIH0KLQotICAgICAgaWYgKCBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYgIT0gaEVudkNoYW4tPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlcykgewotCi0gICAgICAgIEZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcygmaEVudkNoYW4tPmVuY0VudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnNickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyQ29kZU5vaXNlRmxvb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYpOworICAgICAgaWYgKGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiAhPQorICAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmluaXRfc2JyX2FtcF9yZXMpIHsKKyAgICAgICAgRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzKAorICAgICAgICAgICAgJmhFbnZDaGFuLT5lbmNFbnZEYXRhLCAmaEVudkNoYW4tPnNickNvZGVFbnZlbG9wZSwKKyAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyQ29kZU5vaXNlRmxvb3IsIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRik7CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaWYoc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMgIT0gaEVudkNoYW4tPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlcyApIHsKLQotICAgICAgICBGREtzYnJFbmNfSW5pdFNickh1ZmZtYW5UYWJsZXMoJmhFbnZDaGFuLT5lbmNFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnNickNvZGVOb2lzZUZsb29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMgIT0gaEVudkNoYW4tPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlcykgeworICAgICAgICBGREtzYnJFbmNfSW5pdFNickh1ZmZtYW5UYWJsZXMoCisgICAgICAgICAgICAmaEVudkNoYW4tPmVuY0VudkRhdGEsICZoRW52Q2hhbi0+c2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgJmhFbnZDaGFuLT5zYnJDb2RlTm9pc2VGbG9vciwgc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMpOwogICAgICAgfQogICAgIH0KIAogICAgIGlmICghY2xlYXJPdXRwdXQpIHsKLQogICAgICAgLyoKLSAgICAgICAgVG9uYWxpdHkgY29ycmVjdGlvbiBwYXJhbWV0ZXIgZXh0cmFjdGlvbiAoaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWwsIG5vaXNlIGZsb29yIGFkZGl0aW9uYWwgc2luZXMpLgorICAgICAgICBUb25hbGl0eSBjb3JyZWN0aW9uIHBhcmFtZXRlciBleHRyYWN0aW9uIChpbnZlcnNlIGZpbHRlcmluZyBsZXZlbCwgbm9pc2UKKyAgICAgICAgZmxvb3IgYWRkaXRpb25hbCBzaW5lcykuCiAgICAgICAqLwotICAgICAgRkRLc2JyRW5jX1RvbkNvcnJQYXJhbUV4dHIoJmhFbnZDaGFuLT5Ub25Db3JyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGVfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkLT5ub2lzZUZsb29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5hZGRIYXJtb25pYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5lbnZlbG9wZUNvbXBlbnNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZC0+ZnJhbWVfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZC0+dHJhbnNpZW50X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbSEldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5uU2ZiW0hJXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5zYnJfeHBvc19tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5zYnJTeW50YXhGbGFncyk7Ci0KKyAgICAgIEZES3NickVuY19Ub25Db3JyUGFyYW1FeHRyKAorICAgICAgICAgICZoRW52Q2hhbi0+VG9uQ29yciwgaEVudkNoYW4tPmVuY0VudkRhdGEuc2JyX2ludmZfbW9kZV92ZWMsCisgICAgICAgICAgZWQtPm5vaXNlRmxvb3IsICZoRW52Q2hhbi0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY0ZsYWcsCisgICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuYWRkSGFybW9uaWMsIHNickV4dHJFbnYtPmVudmVsb3BlQ29tcGVuc2F0aW9uLAorICAgICAgICAgIGVkLT5mcmFtZV9pbmZvLCBlZC0+dHJhbnNpZW50X2luZm8sIGhfY29uLT5mcmVxQmFuZFRhYmxlW0hJXSwKKyAgICAgICAgICBoX2Nvbi0+blNmYltISV0sIGhFbnZDaGFuLT5lbmNFbnZEYXRhLnNicl94cG9zX21vZGUsCisgICAgICAgICAgaF9jb24tPnNiclN5bnRheEZsYWdzKTsKICAgICB9CiAKICAgICAvKiBMb3cgZW5lcmd5IGluIGxvdyBiYW5kIGZpeCAqLwotICAgIGlmICggaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLnByZXZMb3dCYW5kRW5lcmd5IDwgaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLnByZXZIaWdoQmFuZEVuZXJneQotICAgICAgJiYgaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLnByZXZIaWdoQmFuZEVuZXJneSA+IEZMMkZYX0RCTCgwLjAzKQotICAgICAgLyogVGhlIGZpeCBuZWVkcyB0aGUgbm9uLWZhc3QgdHJhbnNpZW50IGRldGVjdG9yIHJ1bm5pbmcuCi0gICAgICAgICBJdCBzZXRzIHByZXZMb3dCYW5kRW5lcmd5IGFuZCBwcmV2SGlnaEJhbmRFbmVyZ3kuICAgICAgKi8KLSAgICAgICYmICEoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpCi0gICAgICApCi0gICAgewotICAgICAgaW50IGk7Ci0KKyAgICBpZiAoaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLnByZXZMb3dCYW5kRW5lcmd5IDwKKyAgICAgICAgICAgIGhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3Rvci5wcmV2SGlnaEJhbmRFbmVyZ3kgJiYKKyAgICAgICAgaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLnByZXZIaWdoQmFuZEVuZXJneSA+IEZMMkZYX0RCTCgwLjAzKQorICAgICAgICAvKiBUaGUgZml4IG5lZWRzIHRoZSBub24tZmFzdCB0cmFuc2llbnQgZGV0ZWN0b3IgcnVubmluZy4KKyAgICAgICAgICAgSXQgc2V0cyBwcmV2TG93QmFuZEVuZXJneSBhbmQgcHJldkhpZ2hCYW5kRW5lcmd5LiAgICAgICovCisgICAgICAgICYmICEoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpKSB7CiAgICAgICBoRW52Q2hhbi0+ZkxldmVsUHJvdGVjdCA9IDE7CiAKLSAgICAgIGZvciAoaT0wOyBpPE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykKICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuc2JyX2ludmZfbW9kZV92ZWNbaV0gPSBJTlZGX0hJR0hfTEVWRUw7CiAgICAgfSBlbHNlIHsKICAgICAgIGhFbnZDaGFuLT5mTGV2ZWxQcm90ZWN0ID0gMDsKICAgICB9CiAKLSAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlID0gaEVudkNoYW4tPmVuY0VudkRhdGEuc2JyX2ludmZfbW9kZV92ZWNbMF07CisgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuc2JyX2ludmZfbW9kZSA9CisgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGVfdmVjWzBdOwogCi0gICAgaEVudkNoYW4tPmVuY0VudkRhdGEubm9PZm5vaXNlYmFuZHMgPSBoRW52Q2hhbi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzOwotCisgICAgaEVudkNoYW4tPmVuY0VudkRhdGEubm9PZm5vaXNlYmFuZHMgPQorICAgICAgICBoRW52Q2hhbi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzOwogCiAgIH0gLyogY2ggKi8KIAotCi0KLSAgIC8qCi0gICAgICBTYXZlIG51bWJlciBvZiBzY2YgYmFuZHMgcGVyIGVudmVsb3BlCi0gICAgKi8KLSAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzO2NoKyspIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZURhdGFbY2hdLm5FbnZlbG9wZXM7IGkrKyl7CisgIC8qCisgICAgIFNhdmUgbnVtYmVyIG9mIHNjZiBiYW5kcyBwZXIgZW52ZWxvcGUKKyAgICovCisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVtjaF0ubkVudmVsb3BlczsgaSsrKSB7CiAgICAgICBoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLm5vU2NmQmFuZHNbaV0gPQotICAgICAgKGVEYXRhW2NoXS5mcmFtZV9pbmZvLT5mcmVxUmVzW2ldID09IEZSRVFfUkVTX0hJR0ggPyBoX2Nvbi0+blNmYltGUkVRX1JFU19ISUdIXSA6IGhfY29uLT5uU2ZiW0ZSRVFfUkVTX0xPV10pOworICAgICAgICAgIChlRGF0YVtjaF0uZnJhbWVfaW5mby0+ZnJlcVJlc1tpXSA9PSBGUkVRX1JFU19ISUdICisgICAgICAgICAgICAgICA/IGhfY29uLT5uU2ZiW0ZSRVFfUkVTX0hJR0hdCisgICAgICAgICAgICAgICA6IGhfY29uLT5uU2ZiW0ZSRVFfUkVTX0xPV10pOwogICAgIH0KICAgfQogCkBAIC0xMzY4LDE2NSArMTM1OSwxNjkgQEAKICAgICBFeHRyYWN0IGVudmVsb3BlIG9mIGN1cnJlbnQgZnJhbWUuCiAgICovCiAgIHN3aXRjaCAoc3RlcmVvTW9kZSkgewotICBjYXNlIFNCUl9NT05POgotICAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLCBlRGF0YVswXS5zZmJfbnJnLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX2NvbiwgaF9lbnZDaGFuWzBdLCBTQlJfTU9OTywgTlVMTCwgWVN6U2hpZnQpOwotICAgIGJyZWFrOwotICBjYXNlIFNCUl9MRUZUX1JJR0hUOgotICAgIGNhbGN1bGF0ZVNickVudmVsb3BlIChoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmcsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLCBoX2VudkNoYW5bMF0sIFNCUl9NT05PLCBOVUxMLCBZU3pTaGlmdCk7Ci0gICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMV0uZnJhbWVfaW5mbyxlRGF0YVsxXS5zZmJfbnJnLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX2NvbiwgaF9lbnZDaGFuWzFdLCBTQlJfTU9OTywgTlVMTCwgWVN6U2hpZnQpOwotICAgIGJyZWFrOwotICBjYXNlIFNCUl9DT1VQTElORzoKLSAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmcsIGVEYXRhWzFdLnNmYl9ucmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLCBoX2VudkNoYW5bMF0sIFNCUl9DT1VQTElORywgJmZEYXRhLT5tYXhRdWFudEVycm9yLCBZU3pTaGlmdCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX1NXSVRDSF9MUkM6Ci0gICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mbywgZURhdGFbMF0uc2ZiX25yZywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24sIGhfZW52Q2hhblswXSwgU0JSX01PTk8sIE5VTEwsIFlTelNoaWZ0KTsKLSAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLCBlRGF0YVsxXS5zZmJfbnJnLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX2NvbiwgaF9lbnZDaGFuWzFdLCBTQlJfTU9OTyxOVUxMLCBZU3pTaGlmdCk7Ci0gICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLCBlRGF0YVswXS5zZmJfbnJnX2NvdXBsaW5nLCBlRGF0YVsxXS5zZmJfbnJnX2NvdXBsaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX2NvbiwgaF9lbnZDaGFuWzBdLCBTQlJfQ09VUExJTkcsICZmRGF0YS0+bWF4UXVhbnRFcnJvciwgWVN6U2hpZnQpOwotICAgIGJyZWFrOworICAgIGNhc2UgU0JSX01PTk86CisgICAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZShoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mbywgZURhdGFbMF0uc2ZiX25yZywgTlVMTCwgaF9jb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0sIFNCUl9NT05PLCBOVUxMLCBZU3pTaGlmdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCUl9MRUZUX1JJR0hUOgorICAgICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUoaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmcsIE5VTEwsIGhfY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLCBTQlJfTU9OTywgTlVMTCwgWVN6U2hpZnQpOworICAgICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUoaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8sIGVEYXRhWzFdLnNmYl9ucmcsIE5VTEwsIGhfY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLCBTQlJfTU9OTywgTlVMTCwgWVN6U2hpZnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlJfQ09VUExJTkc6CisgICAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZShoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5zZmJfbnJnLCBoX2NvbiwgaF9lbnZDaGFuWzBdLCBTQlJfQ09VUExJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZkRhdGEtPm1heFF1YW50RXJyb3IsIFlTelNoaWZ0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JSX1NXSVRDSF9MUkM6CisgICAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZShoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mbywgZURhdGFbMF0uc2ZiX25yZywgTlVMTCwgaF9jb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0sIFNCUl9NT05PLCBOVUxMLCBZU3pTaGlmdCk7CisgICAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZShoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMV0uZnJhbWVfaW5mbywgZURhdGFbMV0uc2ZiX25yZywgTlVMTCwgaF9jb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0sIFNCUl9NT05PLCBOVUxMLCBZU3pTaGlmdCk7CisgICAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZShoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmdfY291cGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5zZmJfbnJnX2NvdXBsaW5nLCBoX2NvbiwgaF9lbnZDaGFuWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0NPVVBMSU5HLCAmZkRhdGEtPm1heFF1YW50RXJyb3IsIFlTelNoaWZ0KTsKKyAgICAgIGJyZWFrOwogICB9CiAKLQotCiAgIC8qCiAgICAgTm9pc2UgZmxvb3IgcXVhbnRpc2F0aW9uIGFuZCBjb2RpbmcuCiAgICovCiAKICAgc3dpdGNoIChzdGVyZW9Nb2RlKSB7Ci0gIGNhc2UgU0JSX01PTk86Ci0gICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbCwgZURhdGFbMF0ubm9pc2VGbG9vciwgMCk7CisgICAgY2FzZSBTQlJfTU9OTzoKKyAgICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGVEYXRhWzBdLm5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogCi0gICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShlRGF0YVswXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVOb2lzZUZsb29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShlRGF0YVswXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CiAKLSAgICBicmVhazsKLSAgY2FzZSBTQlJfTEVGVF9SSUdIVDoKLSAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzBdLm5vaXNlX2xldmVsLGVEYXRhWzBdLm5vaXNlRmxvb3IsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlJfTEVGVF9SSUdIVDoKKyAgICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGVEYXRhWzBdLm5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogCi0gICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCi0gICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlTm9pc2VGbG9vciwKLSAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAwLAotICAgICAgICAgICAgICAgICAgKGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAotICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVOb2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwogCi0gICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVsxXS5ub2lzZV9sZXZlbCxlRGF0YVsxXS5ub2lzZUZsb29yLCAwKTsKKyAgICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMV0ubm9pc2VfbGV2ZWwsIGVEYXRhWzFdLm5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogCi0gICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMV0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCi0gICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlTm9pc2VGbG9vciwKLSAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAwLAotICAgICAgICAgICAgICAgICAgKGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAotICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoZURhdGFbMV0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVOb2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwogCi0gICAgYnJlYWs7CisgICAgICBicmVhazsKIAotICBjYXNlIFNCUl9DT1VQTElORzoKLSAgICBjb3VwbGVOb2lzZUZsb29yKGVEYXRhWzBdLm5vaXNlRmxvb3IsZURhdGFbMV0ubm9pc2VGbG9vcik7CisgICAgY2FzZSBTQlJfQ09VUExJTkc6CisgICAgICBjb3VwbGVOb2lzZUZsb29yKGVEYXRhWzBdLm5vaXNlRmxvb3IsIGVEYXRhWzFdLm5vaXNlRmxvb3IpOwogCi0gICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbCxlRGF0YVswXS5ub2lzZUZsb29yLCAwKTsKKyAgICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGVEYXRhWzBdLm5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogCi0gICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCi0gICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlTm9pc2VGbG9vciwKLSAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAotICAgICAgICAgICAgICAgICAgKGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAotICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVOb2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwogCi0gICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVsxXS5ub2lzZV9sZXZlbCxlRGF0YVsxXS5ub2lzZUZsb29yLCAxKTsKKyAgICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMV0ubm9pc2VfbGV2ZWwsIGVEYXRhWzFdLm5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwogCi0gICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMV0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCi0gICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlTm9pc2VGbG9vciwKLSAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAotICAgICAgICAgICAgICAgICAgKGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAxLAotICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoZURhdGFbMV0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVOb2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwogCi0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX1NXSVRDSF9MUkM6Ci0gICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbCxlRGF0YVswXS5ub2lzZUZsb29yLCAwKTsKLSAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzFdLm5vaXNlX2xldmVsLGVEYXRhWzFdLm5vaXNlRmxvb3IsIDApOwotICAgIGNvdXBsZU5vaXNlRmxvb3IoZURhdGFbMF0ubm9pc2VGbG9vcixlRGF0YVsxXS5ub2lzZUZsb29yKTsKLSAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzBdLm5vaXNlX2xldmVsX2NvdXBsaW5nLGVEYXRhWzBdLm5vaXNlRmxvb3IsIDApOwotICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMV0ubm9pc2VfbGV2ZWxfY291cGxpbmcsZURhdGFbMV0ubm9pc2VGbG9vciwgMSk7Ci0gICAgYnJlYWs7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCUl9TV0lUQ0hfTFJDOgorICAgICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbCwgZURhdGFbMF0ubm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzFdLm5vaXNlX2xldmVsLCBlRGF0YVsxXS5ub2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgIGNvdXBsZU5vaXNlRmxvb3IoZURhdGFbMF0ubm9pc2VGbG9vciwgZURhdGFbMV0ubm9pc2VGbG9vcik7CisgICAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzBdLm5vaXNlX2xldmVsX2NvdXBsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5ub2lzZUZsb29yLCAwKTsKKyAgICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMV0ubm9pc2VfbGV2ZWxfY291cGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLm5vaXNlRmxvb3IsIDEpOworICAgICAgYnJlYWs7CiAgIH0KIAotCi0KICAgLyoKICAgICBFbmNvZGUgZW52ZWxvcGUgb2YgY3VycmVudCBmcmFtZS4KICAgKi8KICAgc3dpdGNoIChzdGVyZW9Nb2RlKSB7Ci0gIGNhc2UgU0JSX01PTk86Ci0gICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAwOwotICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMDsKLSAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5zZmJfbnJnLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAotICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCi0gICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywKLSAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDAsCi0gICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwotICAgIGJyZWFrOwotICBjYXNlIFNCUl9MRUZUX1JJR0hUOgotICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMDsKKyAgICBjYXNlIFNCUl9NT05POgorICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAwOworICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSgKKyAgICAgICAgICBlRGF0YVswXS5zZmJfbnJnLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAorICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCisgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsIGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDAsCisgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JSX0xFRlRfUklHSFQ6CisgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDA7CiAKLSAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7Ci0gICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOworICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOworICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOwogCisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKAorICAgICAgICAgIGVEYXRhWzBdLnNmYl9ucmcsIGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXMsCisgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLCBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKKyAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywgZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKKyAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSgKKyAgICAgICAgICBlRGF0YVsxXS5zZmJfbnJnLCBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAorICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVFbnZlbG9wZSwgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCisgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsIGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDAsCisgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JSX0NPVVBMSU5HOgorICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAxOworICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOworICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAxOwogCi0gICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMF0uc2ZiX25yZywgZURhdGFbMF0uZnJhbWVfaW5mby0+ZnJlcVJlcywKLSAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLAotICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsCi0gICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAotICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKLSAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5zZmJfbnJnLCBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAotICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCi0gICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywKLSAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDAsCi0gICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwotICAgIGJyZWFrOwotICBjYXNlIFNCUl9DT1VQTElORzoKLSAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDE7Ci0gICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOwotICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMTsKLQotICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzBdLnNmYl9ucmcsIGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXMsCi0gICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKLSAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLAotICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKLSAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7Ci0gICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMV0uc2ZiX25yZywgZURhdGFbMV0uZnJhbWVfaW5mby0+ZnJlcVJlcywKLSAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLAotICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsCi0gICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAxLAotICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKLSAgICBicmVhazsKLSAgY2FzZSBTQlJfU1dJVENIX0xSQzoKLSAgICB7CisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKAorICAgICAgICAgIGVEYXRhWzBdLnNmYl9ucmcsIGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXMsCisgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLCBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKKyAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywgZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKKyAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSgKKyAgICAgICAgICBlRGF0YVsxXS5zZmJfbnJnLCBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAorICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVFbnZlbG9wZSwgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCisgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsIGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDEsCisgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JSX1NXSVRDSF9MUkM6IHsKICAgICAgIElOVCBwYXlsb2FkYml0c0xSOwogICAgICAgSU5UIHBheWxvYWRiaXRzQ09VUExJTkc7CiAKQEAgLTE1NDEsMTUgKzE1MzYsMTggQEAKICAgICAgIElOVCB0ZW1wRmxhZ0xlZnQgPSAwOwogCiAgICAgICAvKgotICAgICAgICAgU3RvcmUgcHJldmlvdXMgdmFsdWVzLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvICJ1bmRvIiB3aGF0IGlzIGJlaW5nIGRvbmUuCisgICAgICAgICBTdG9yZSBwcmV2aW91cyB2YWx1ZXMsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gInVuZG8iIHdoYXQgaXMgYmVpbmcKKyAgICAgICAgIGRvbmUuCiAgICAgICAqLwogCi0gICAgICBmb3IoY2ggPSAwOyBjaCA8IG5DaGFubmVscztjaCsrKXsKLSAgICAgICAgRkRLbWVtY3B5IChzZmJOcmdQcmV2VGVtcFtjaF0sIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS5zZmJfbnJnX3ByZXYsCi0gICAgICAgICAgICAgIE1BWF9GUkVRX0NPRUZGUyAqIHNpemVvZiAoU0NIQVIpKTsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgICAgICBGREttZW1jcHkoc2ZiTnJnUHJldlRlbXBbY2hdLAorICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnNmYl9ucmdfcHJldiwKKyAgICAgICAgICAgICAgICAgIE1BWF9GUkVRX0NPRUZGUyAqIHNpemVvZihTQ0hBUikpOwogCi0gICAgICAgIEZES21lbWNweSAobm9pc2VQcmV2VGVtcFtjaF0sIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnNmYl9ucmdfcHJldiwKLSAgICAgICAgICAgICAgTUFYX05VTV9OT0lTRV9DT0VGRlMgKiBzaXplb2YgKFNDSEFSKSk7CisgICAgICAgIEZES21lbWNweShub2lzZVByZXZUZW1wW2NoXSwKKyAgICAgICAgICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnNmYl9ucmdfcHJldiwKKyAgICAgICAgICAgICAgICAgIE1BWF9OVU1fTk9JU0VfQ09FRkZTICogc2l6ZW9mKFNDSEFSKSk7CiAKICAgICAgICAgdXBEYXRlTnJnVGVtcFtjaF0gPSBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlOwogICAgICAgICB1cERhdGVOb2lzZVRlbXBbY2hdID0gaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3IudXBEYXRlOwpAQCAtMTU1OCwyNDcgKzE1NTYsMjMzIEBACiAgICAgICAgICAgZm9yYmlkIHRpbWUgY29kaW5nIGluIHRoZSBmaXJzdCBlbnZlbG9wZSBpbiBjYXNlIG9mIGEgZGlmZmVyZW50CiAgICAgICAgICAgcHJldmlvdXMgc3RlcmVvbW9kZQogICAgICAgICAqLwotICAgICAgICBpZihzYnJIZWFkZXJEYXRhLT5wcmV2X2NvdXBsaW5nKXsKKyAgICAgICAgaWYgKHNickhlYWRlckRhdGEtPnByZXZfY291cGxpbmcpIHsKICAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlID0gMDsKICAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci51cERhdGUgPSAwOwogICAgICAgICB9CiAgICAgICB9IC8qIGNoICovCiAKLQogICAgICAgLyoKICAgICAgICAgIENvZGUgb3JkaW5hcnkgTGVmdC9SaWdodCBzdGVyZW8KICAgICAgICovCi0gICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5zZmJfbnJnLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAotICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLCAwLAotICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAotICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwotICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMV0uc2ZiX25yZywgZURhdGFbMV0uZnJhbWVfaW5mby0+ZnJlcVJlcywKLSAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywgMCwKLSAgICAgICAgICAgICAgICAgICAgZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKLSAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoZURhdGFbMF0uc2ZiX25yZywgZURhdGFbMF0uZnJhbWVfaW5mby0+ZnJlcVJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoZURhdGFbMV0uc2ZiX25yZywgZURhdGFbMV0uZnJhbWVfaW5mby0+ZnJlcVJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKIAogICAgICAgYyA9IDA7CiAgICAgICBmb3IgKGkgPSAwOyBpIDwgZURhdGFbMF0ubkVudmVsb3BlczsgaSsrKSB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEubm9TY2ZCYW5kc1tpXTsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPSBlRGF0YVswXS5zZmJfbnJnW2NdOwotICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmllbnZlbG9wZVtpXVtqXSA9IGVEYXRhWzFdLnNmYl9ucmdbY107Ci0gICAgICAgICAgICBjKys7Ci0gICAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLm5vU2NmQmFuZHNbaV07IGorKykgeworICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPSBlRGF0YVswXS5zZmJfbnJnW2NdOworICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPSBlRGF0YVsxXS5zZmJfbnJnW2NdOworICAgICAgICAgIGMrKzsKKyAgICAgICAgfQogICAgICAgfQogCi0KLQotICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCi0gICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVOb2lzZUZsb29yLAotICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAotICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwotCisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKGVEYXRhWzBdLm5vaXNlX2xldmVsLCBmRGF0YS0+cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlTm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKIAogICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspCiAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5zYnJfbm9pc2VfbGV2ZWxzW2ldID0gZURhdGFbMF0ubm9pc2VfbGV2ZWxbaV07CiAKLQotICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMV0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCi0gICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVOb2lzZUZsb29yLAotICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAotICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShlRGF0YVsxXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CiAKICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQogICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuc2JyX25vaXNlX2xldmVsc1tpXSA9IGVEYXRhWzFdLm5vaXNlX2xldmVsW2ldOwogCi0KICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMDsKICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMDsKICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMDsKIAotICAgICAgcGF5bG9hZGJpdHNMUiA9IEZES3NickVuY19Db3VudFNickNoYW5uZWxQYWlyRWxlbWVudCAoc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhDbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPnNiclN5bnRheEZsYWdzKTsKKyAgICAgIHBheWxvYWRiaXRzTFIgPSBGREtzYnJFbmNfQ291bnRTYnJDaGFubmVsUGFpckVsZW1lbnQoCisgICAgICAgICAgc2JySGVhZGVyRGF0YSwgaFBhcmFtZXRyaWNTdGVyZW8sIHNickJpdHN0cmVhbURhdGEsCisgICAgICAgICAgJmhfZW52Q2hhblswXS0+ZW5jRW52RGF0YSwgJmhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YSwgaENtb25EYXRhLAorICAgICAgICAgIGhfY29uLT5zYnJTeW50YXhGbGFncyk7CiAKICAgICAgIC8qCiAgICAgICAgIHN3YXAgc2F2ZWQgc3RvcmVkIHdpdGggY3VycmVudCB2YWx1ZXMKICAgICAgICovCi0gICAgICBmb3IoY2ggPSAwOyBjaCA8IG5DaGFubmVscztjaCsrKXsKLSAgICAgICAgSU5UICAgaXRtcDsKLSAgICAgICAgZm9yKGk9MDtpPE1BWF9GUkVRX0NPRUZGUztpKyspeworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIElOVCBpdG1wOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0ZSRVFfQ09FRkZTOyBpKyspIHsKICAgICAgICAgICAvKgogICAgICAgICAgICAgc3dhcCBzZmIgZW5lcmdpZXMKICAgICAgICAgICAqLwotICAgICAgICAgIGl0bXAgPSAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnNmYl9ucmdfcHJldltpXTsKLSAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUuc2ZiX25yZ19wcmV2W2ldPXNmYk5yZ1ByZXZUZW1wW2NoXVtpXTsKLSAgICAgICAgICBzZmJOcmdQcmV2VGVtcFtjaF1baV09aXRtcDsKKyAgICAgICAgICBpdG1wID0gaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnNmYl9ucmdfcHJldltpXTsKKyAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUuc2ZiX25yZ19wcmV2W2ldID0KKyAgICAgICAgICAgICAgc2ZiTnJnUHJldlRlbXBbY2hdW2ldOworICAgICAgICAgIHNmYk5yZ1ByZXZUZW1wW2NoXVtpXSA9IGl0bXA7CiAgICAgICAgIH0KLSAgICAgICAgZm9yKGk9MDtpPE1BWF9OVU1fTk9JU0VfQ09FRkZTO2krKyl7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX0NPRUZGUzsgaSsrKSB7CiAgICAgICAgICAgLyoKICAgICAgICAgICAgIHN3YXAgbm9pc2UgZW5lcmdpZXMKICAgICAgICAgICAqLwotICAgICAgICAgIGl0bXAgPSAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3Iuc2ZiX25yZ19wcmV2W2ldOwotICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnNmYl9ucmdfcHJldltpXT1ub2lzZVByZXZUZW1wW2NoXVtpXTsKLSAgICAgICAgICBub2lzZVByZXZUZW1wW2NoXVtpXT1pdG1wOwotICAgICAgIH0KKyAgICAgICAgICBpdG1wID0gaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3Iuc2ZiX25yZ19wcmV2W2ldOworICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnNmYl9ucmdfcHJldltpXSA9CisgICAgICAgICAgICAgIG5vaXNlUHJldlRlbXBbY2hdW2ldOworICAgICAgICAgIG5vaXNlUHJldlRlbXBbY2hdW2ldID0gaXRtcDsKKyAgICAgICAgfQogICAgICAgICAvKiBzd2FwIHVwZGF0ZSBmbGFncyAqLwotICAgICAgICBpdG1wICA9IGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGU7Ci0gICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGU9dXBEYXRlTnJnVGVtcFtjaF07CisgICAgICAgIGl0bXAgPSBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlOworICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlID0gdXBEYXRlTnJnVGVtcFtjaF07CiAgICAgICAgIHVwRGF0ZU5yZ1RlbXBbY2hdID0gaXRtcDsKIAotICAgICAgICBpdG1wID0gIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZTsKLSAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3IudXBEYXRlPXVwRGF0ZU5vaXNlVGVtcFtjaF07Ci0gICAgICAgIHVwRGF0ZU5vaXNlVGVtcFtjaF09aXRtcDsKKyAgICAgICAgaXRtcCA9IGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZTsKKyAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3IudXBEYXRlID0gdXBEYXRlTm9pc2VUZW1wW2NoXTsKKyAgICAgICAgdXBEYXRlTm9pc2VUZW1wW2NoXSA9IGl0bXA7CiAKICAgICAgICAgLyoKICAgICAgICAgICAgIHNhdmUgZG9tYWluIHZlY3MKICAgICAgICAgKi8KLSAgICAgICAgRkRLbWVtY3B5KGRvbWFpblZlY1RlbXBbY2hdLGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYyxzaXplb2YoSU5UKSpNQVhfRU5WRUxPUEVTKTsKLSAgICAgICAgRkRLbWVtY3B5KGRvbWFpblZlY05vaXNlVGVtcFtjaF0saF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLHNpemVvZihJTlQpKk1BWF9FTlZFTE9QRVMpOworICAgICAgICBGREttZW1jcHkoZG9tYWluVmVjVGVtcFtjaF0sIGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKKyAgICAgICAgICAgICAgICAgIHNpemVvZihJTlQpICogTUFYX0VOVkVMT1BFUyk7CisgICAgICAgIEZES21lbWNweShkb21haW5WZWNOb2lzZVRlbXBbY2hdLAorICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKElOVCkgKiBNQVhfRU5WRUxPUEVTKTsKIAogICAgICAgICAvKgogICAgICAgICAgIGZvcmJpZCB0aW1lIGNvZGluZyBpbiB0aGUgZmlyc3QgZW52ZWxvcGUgaW4gY2FzZSBvZiBhIGRpZmZlcmVudAogICAgICAgICAgIHByZXZpb3VzIHN0ZXJlb21vZGUKICAgICAgICAgKi8KIAotICAgICAgICBpZighc2JySGVhZGVyRGF0YS0+cHJldl9jb3VwbGluZyl7CisgICAgICAgIGlmICghc2JySGVhZGVyRGF0YS0+cHJldl9jb3VwbGluZykgewogICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGUgPSAwOwogICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZSA9IDA7CiAgICAgICAgIH0KICAgICAgIH0gLyogY2ggKi8KIAotCiAgICAgICAvKgogICAgICAgICAgQ291cGxpbmcKICAgICAgICAqLwogCi0gICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5zZmJfbnJnX2NvdXBsaW5nLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAotICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLCAxLAotICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAotICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSgKKyAgICAgICAgICBlRGF0YVswXS5zZmJfbnJnX2NvdXBsaW5nLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAorICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCisgICAgICAgICAgMSwgZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKKyAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwogCi0gICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5zZmJfbnJnX2NvdXBsaW5nLCBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAotICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLCAxLAotICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAxLAotICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwotCisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKAorICAgICAgICAgIGVEYXRhWzFdLnNmYl9ucmdfY291cGxpbmcsIGVEYXRhWzFdLmZyYW1lX2luZm8tPmZyZXFSZXMsCisgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLCBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKKyAgICAgICAgICAxLCBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAxLAorICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CiAKICAgICAgIGMgPSAwOwogICAgICAgZm9yIChpID0gMDsgaSA8IGVEYXRhWzBdLm5FbnZlbG9wZXM7IGkrKykgewogICAgICAgICBmb3IgKGogPSAwOyBqIDwgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLm5vU2NmQmFuZHNbaV07IGorKykgewotICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPSBlRGF0YVswXS5zZmJfbnJnX2NvdXBsaW5nW2NdOwotICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPSBlRGF0YVsxXS5zZmJfbnJnX2NvdXBsaW5nW2NdOworICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPQorICAgICAgICAgICAgICBlRGF0YVswXS5zZmJfbnJnX2NvdXBsaW5nW2NdOworICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPQorICAgICAgICAgICAgICBlRGF0YVsxXS5zZmJfbnJnX2NvdXBsaW5nW2NdOwogICAgICAgICAgIGMrKzsKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5ub2lzZV9sZXZlbF9jb3VwbGluZywgZkRhdGEtPnJlcywKLSAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZU5vaXNlRmxvb3IsCi0gICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAotICAgICAgICAgICAgICAgICAgICAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCi0gICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShlRGF0YVswXS5ub2lzZV9sZXZlbF9jb3VwbGluZywgZkRhdGEtPnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CiAKICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQotICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuc2JyX25vaXNlX2xldmVsc1tpXSA9IGVEYXRhWzBdLm5vaXNlX2xldmVsX2NvdXBsaW5nW2ldOworICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuc2JyX25vaXNlX2xldmVsc1tpXSA9CisgICAgICAgICAgICBlRGF0YVswXS5ub2lzZV9sZXZlbF9jb3VwbGluZ1tpXTsKIAotCi0gICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5ub2lzZV9sZXZlbF9jb3VwbGluZywgZkRhdGEtPnJlcywKLSAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZU5vaXNlRmxvb3IsCi0gICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAotICAgICAgICAgICAgICAgICAgICAoZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDEsCi0gICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKGVEYXRhWzFdLm5vaXNlX2xldmVsX2NvdXBsaW5nLCBmRGF0YS0+cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlTm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKIAogICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspCi0gICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5zYnJfbm9pc2VfbGV2ZWxzW2ldID0gZURhdGFbMV0ubm9pc2VfbGV2ZWxfY291cGxpbmdbaV07CisgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5zYnJfbm9pc2VfbGV2ZWxzW2ldID0KKyAgICAgICAgICAgIGVEYXRhWzFdLm5vaXNlX2xldmVsX2NvdXBsaW5nW2ldOwogCiAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDE7CiAKLSAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5iYWxhbmNlICA9IDA7Ci0gICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYmFsYW5jZSAgPSAxOworICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOworICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAxOwogCi0gICAgICB0ZW1wRmxhZ0xlZnQgID0gaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZzsKKyAgICAgIHRlbXBGbGFnTGVmdCA9IGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY0ZsYWc7CiAgICAgICB0ZW1wRmxhZ1JpZ2h0ID0gaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZzsKIAotICAgICAgcGF5bG9hZGJpdHNDT1VQTElORyA9Ci0gICAgICAgIEZES3NickVuY19Db3VudFNickNoYW5uZWxQYWlyRWxlbWVudCAoc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaENtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPnNiclN5bnRheEZsYWdzKTsKLQorICAgICAgcGF5bG9hZGJpdHNDT1VQTElORyA9IEZES3NickVuY19Db3VudFNickNoYW5uZWxQYWlyRWxlbWVudCgKKyAgICAgICAgICBzYnJIZWFkZXJEYXRhLCBoUGFyYW1ldHJpY1N0ZXJlbywgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLCAmaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLCBoQ21vbkRhdGEsCisgICAgICAgICAgaF9jb24tPnNiclN5bnRheEZsYWdzKTsKIAogICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZyA9IHRlbXBGbGFnTGVmdDsKICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY0ZsYWcgPSB0ZW1wRmxhZ1JpZ2h0OwogCiAgICAgICBpZiAocGF5bG9hZGJpdHNDT1VQTElORyA8IHBheWxvYWRiaXRzTFIpIHsKLQotICAgICAgICAgIC8qCi0gICAgICAgICAgICBjb3B5IGNvZGVkIGNvdXBsaW5nIGVudmVsb3BlIGFuZCBub2lzZSBkYXRhIHRvIGwvcgotICAgICAgICAgICovCi0gICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKyl7Ci0gICAgICAgICAgICBTQlJfRU5WX1RFTVBfREFUQSAqZWQgPSAmZURhdGFbY2hdOwotICAgICAgICAgICAgRkRLbWVtY3B5IChlZC0+c2ZiX25yZywgZWQtPnNmYl9ucmdfY291cGxpbmcsCi0gICAgICAgICAgICAgICAgICBNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFUyAqIHNpemVvZiAoU0NIQVIpKTsKLSAgICAgICAgICAgIEZES21lbWNweSAoZWQtPm5vaXNlX2xldmVsLCBlZC0+bm9pc2VfbGV2ZWxfY291cGxpbmcsCi0gICAgICAgICAgICAgICAgICBNQVhfTlVNX05PSVNFX1ZBTFVFUyAqIHNpemVvZiAoU0NIQVIpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDE7Ci0gICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgID0gMDsKLSAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYmFsYW5jZSAgPSAxOwotICAgICAgfQotICAgICAgZWxzZXsKLSAgICAgICAgICAvKgotICAgICAgICAgICAgcmVzdG9yZSBzYXZlZCBsL3IgaXRlbXMKLSAgICAgICAgICAqLwotICAgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgbkNoYW5uZWxzO2NoKyspewotCi0gICAgICAgICAgICBGREttZW1jcHkgKGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS5zZmJfbnJnX3ByZXYsCi0gICAgICAgICAgICAgICAgICAgIHNmYk5yZ1ByZXZUZW1wW2NoXSwgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mIChTQ0hBUikpOwotCi0gICAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlID0gdXBEYXRlTnJnVGVtcFtjaF07Ci0KLSAgICAgICAgICAgIEZES21lbWNweSAoaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3Iuc2ZiX25yZ19wcmV2LAotICAgICAgICAgICAgICAgICAgICBub2lzZVByZXZUZW1wW2NoXSwgTUFYX05VTV9OT0lTRV9DT0VGRlMgKiBzaXplb2YgKFNDSEFSKSk7Ci0KLSAgICAgICAgICAgIEZES21lbWNweSAoaF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLGRvbWFpblZlY1RlbXBbY2hdLHNpemVvZihJTlQpKk1BWF9FTlZFTE9QRVMpOwotICAgICAgICAgICAgRkRLbWVtY3B5IChoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsZG9tYWluVmVjTm9pc2VUZW1wW2NoXSxzaXplb2YoSU5UKSpNQVhfRU5WRUxPUEVTKTsKLQotICAgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3IudXBEYXRlID0gdXBEYXRlTm9pc2VUZW1wW2NoXTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDA7Ci0gICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgID0gMDsKLSAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYmFsYW5jZSAgPSAwOworICAgICAgICAvKgorICAgICAgICAgIGNvcHkgY29kZWQgY291cGxpbmcgZW52ZWxvcGUgYW5kIG5vaXNlIGRhdGEgdG8gbC9yCisgICAgICAgICovCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgICAgICAgIFNCUl9FTlZfVEVNUF9EQVRBICplZCA9ICZlRGF0YVtjaF07CisgICAgICAgICAgRkRLbWVtY3B5KGVkLT5zZmJfbnJnLCBlZC0+c2ZiX25yZ19jb3VwbGluZywKKyAgICAgICAgICAgICAgICAgICAgTUFYX05VTV9FTlZFTE9QRV9WQUxVRVMgKiBzaXplb2YoU0NIQVIpKTsKKyAgICAgICAgICBGREttZW1jcHkoZWQtPm5vaXNlX2xldmVsLCBlZC0+bm9pc2VfbGV2ZWxfY291cGxpbmcsCisgICAgICAgICAgICAgICAgICAgIE1BWF9OVU1fTk9JU0VfVkFMVUVTICogc2l6ZW9mKFNDSEFSKSk7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0gLyogc3dpdGNoICovCiAKKyAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAxOworICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CisgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qCisgICAgICAgICAgcmVzdG9yZSBzYXZlZCBsL3IgaXRlbXMKKyAgICAgICAgKi8KKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgRkRLbWVtY3B5KGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS5zZmJfbnJnX3ByZXYsCisgICAgICAgICAgICAgICAgICAgIHNmYk5yZ1ByZXZUZW1wW2NoXSwgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mKFNDSEFSKSk7CisKKyAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlID0gdXBEYXRlTnJnVGVtcFtjaF07CisKKyAgICAgICAgICBGREttZW1jcHkoaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3Iuc2ZiX25yZ19wcmV2LAorICAgICAgICAgICAgICAgICAgICBub2lzZVByZXZUZW1wW2NoXSwgTUFYX05VTV9OT0lTRV9DT0VGRlMgKiBzaXplb2YoU0NIQVIpKTsKKworICAgICAgICAgIEZES21lbWNweShoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsIGRvbWFpblZlY1RlbXBbY2hdLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoSU5UKSAqIE1BWF9FTlZFTE9QRVMpOworICAgICAgICAgIEZES21lbWNweShoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsCisgICAgICAgICAgICAgICAgICAgIGRvbWFpblZlY05vaXNlVGVtcFtjaF0sIHNpemVvZihJTlQpICogTUFYX0VOVkVMT1BFUyk7CisKKyAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci51cERhdGUgPSB1cERhdGVOb2lzZVRlbXBbY2hdOworICAgICAgICB9CisKKyAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAwOworICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CisgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMDsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICB9IC8qIHN3aXRjaCAqLwogCiAgIC8qIHRlbGwgdGhlIGVudmVsb3BlIGVuY29kZXJzIGhvdyBsb25nIGl0IGhhcyBiZWVuLCBzaW5jZSB3ZSBsYXN0IHNlbnQKICAgICAgYSBmcmFtZSBzdGFydGluZyB3aXRoIGEgZEYtY29kZWQgZW52ZWxvcGUgKi8KLSAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX01PTk8gKSB7CisgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9NT05PKSB7CiAgICAgaWYgKGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjWzBdID09IFRJTUUpCiAgICAgICBoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZS5kRl9lZGdlX2luY3JfZmFjKys7CiAgICAgZWxzZQogICAgICAgaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUuZEZfZWRnZV9pbmNyX2ZhYyA9IDA7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgaWYgKGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjWzBdID09IFRJTUUgfHwKICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNbMF0gPT0gVElNRSkgewogICAgICAgaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUuZEZfZWRnZV9pbmNyX2ZhYysrOwogICAgICAgaF9lbnZDaGFuWzFdLT5zYnJDb2RlRW52ZWxvcGUuZEZfZWRnZV9pbmNyX2ZhYysrOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUuZEZfZWRnZV9pbmNyX2ZhYyA9IDA7CiAgICAgICBoX2VudkNoYW5bMV0tPnNickNvZGVFbnZlbG9wZS5kRl9lZGdlX2luY3JfZmFjID0gMDsKICAgICB9CkBAIC0xODA3LDcgKzE3OTEsNyBAQAogICAvKgogICAgIFNlbmQgdGhlIGVuY29kZWQgZGF0YSB0byB0aGUgYml0c3RyZWFtCiAgICovCi0gIGZvcihjaCA9IDA7IGNoIDwgbkNoYW5uZWxzO2NoKyspeworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKICAgICBTQlJfRU5WX1RFTVBfREFUQSAqZWQgPSAmZURhdGFbY2hdOwogICAgIGMgPSAwOwogICAgIGZvciAoaSA9IDA7IGkgPCBlZC0+bkVudmVsb3BlczsgaSsrKSB7CkBAIC0xODE3LDQ1ICsxODAxLDM4IEBACiAgICAgICAgIGMrKzsKICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspeworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKSB7CiAgICAgICBoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLnNicl9ub2lzZV9sZXZlbHNbaV0gPSBlZC0+bm9pc2VfbGV2ZWxbaV07CiAgICAgfQotICB9LyogY2ggKi8KLQorICB9IC8qIGNoICovCiAKICAgLyoKICAgICBXcml0ZSBiaXRzdHJlYW0KICAgKi8KICAgaWYgKG5DaGFubmVscyA9PSAyKSB7Ci0gICAgRkRLc2JyRW5jX1dyaXRlRW52Q2hhbm5lbFBhaXJFbGVtZW50KHNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaENtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5zYnJTeW50YXhGbGFncyk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgRkRLc2JyRW5jX1dyaXRlRW52U2luZ2xlQ2hhbm5lbEVsZW1lbnQoc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQ21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOworICAgIEZES3NickVuY19Xcml0ZUVudkNoYW5uZWxQYWlyRWxlbWVudCgKKyAgICAgICAgc2JySGVhZGVyRGF0YSwgaFBhcmFtZXRyaWNTdGVyZW8sIHNickJpdHN0cmVhbURhdGEsCisgICAgICAgICZoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEsICZoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEsIGhDbW9uRGF0YSwKKyAgICAgICAgaF9jb24tPnNiclN5bnRheEZsYWdzKTsKKyAgfSBlbHNlIHsKKyAgICBGREtzYnJFbmNfV3JpdGVFbnZTaW5nbGVDaGFubmVsRWxlbWVudCgKKyAgICAgICAgc2JySGVhZGVyRGF0YSwgaFBhcmFtZXRyaWNTdGVyZW8sIHNickJpdHN0cmVhbURhdGEsCisgICAgICAgICZoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEsIGhDbW9uRGF0YSwgaF9jb24tPnNiclN5bnRheEZsYWdzKTsKICAgfQogCiAgIC8qCiAgICAqIFVwZGF0ZSBidWZmZXJzLgogICAgKi8KLSAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspCi0gIHsKLSAgICAgIGludCBZQnVmZmVyTGVuZ3RoID0gaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLm5vX2NvbHMgPj4gaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTelNoaWZ0OwotICAgICAgZm9yIChpID0gMDsgaSA8IGhfZW52Q2hhbltjaF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyV3JpdGVPZmZzZXQ7IGkrKykgewotICAgICAgICAgRkRLbWVtY3B5KGhfZW52Q2hhbltjaF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyW2ldLAotICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyW2kgKyBZQnVmZmVyTGVuZ3RoXSwKLSAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpKlFNRl9DSEFOTkVMUyk7Ci0gICAgICB9Ci0gICAgICBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlWzBdID0gaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZVsxXTsKKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgaW50IFlCdWZmZXJMZW5ndGggPSBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUubm9fY29scyA+PgorICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTelNoaWZ0OworICAgIGZvciAoaSA9IDA7IGkgPCBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlcldyaXRlT2Zmc2V0OyBpKyspIHsKKyAgICAgIEZES21lbWNweShoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlcltpXSwKKyAgICAgICAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlcltpICsgWUJ1ZmZlckxlbmd0aF0sCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIDY0KTsKKyAgICB9CisgICAgaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZVswXSA9CisgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGVbMV07CiAgIH0KIAogICBzYnJIZWFkZXJEYXRhLT5wcmV2X2NvdXBsaW5nID0gc2JySGVhZGVyRGF0YS0+Y291cGxpbmc7CkBAIC0xODY5LDQwICsxODQ2LDQzIEBACiAgIFxyZXR1cm4gZXJyb3Igc3RhdHVzCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19DcmVhdGVFeHRyYWN0U2JyRW52ZWxvcGUgKEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSAgaFNickN1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFubmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxJTlQgY2hJbkVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiogZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitJTlQgRkRLc2JyRW5jX0NyZWF0ZUV4dHJhY3RTYnJFbnZlbG9wZShIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNickN1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFubmVsLCBJTlQgY2hJbkVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmR5bmFtaWNfUkFNKSB7CiAgIElOVCBpOwotICBGSVhQX0RCTCogWUJ1ZmZlciA9IEdldFJhbV9TYnJfZW52WUJ1ZmZlcihjaGFubmVsKTsKKyAgRklYUF9EQkwgKnJCdWZmZXIsICppQnVmZmVyOworICBJTlQgbjsKKyAgRklYUF9EQkwgKllCdWZmZXJEeW47CiAKLSAgRkRLbWVtY2xlYXIoaFNickN1dCxzaXplb2YoU0JSX0VYVFJBQ1RfRU5WRUxPUEUpKTsKLSAgaFNickN1dC0+cF9ZQnVmZmVyID0gWUJ1ZmZlcjsKKyAgRkRLbWVtY2xlYXIoaFNickN1dCwgc2l6ZW9mKFNCUl9FWFRSQUNUX0VOVkVMT1BFKSk7CiAKLQotICBmb3IgKGkgPSAwOyBpIDwgKFFNRl9NQVhfVElNRV9TTE9UUz4+MSk7IGkrKykgewotICAgIGhTYnJDdXQtPllCdWZmZXJbaV0gPSBZQnVmZmVyICsgKGkqUU1GX0NIQU5ORUxTKTsKLSAgfQotICBGSVhQX0RCTCAqWUJ1ZmZlckR5biA9IEdldFJhbV9TYnJfZW52WUJ1ZmZlcihjaEluRWwsIGR5bmFtaWNfUkFNKTsKLSAgSU5UIG49MDsKLSAgZm9yICg7IGkgPCBRTUZfTUFYX1RJTUVfU0xPVFM7IGkrKyxuKyspIHsKLSAgICBoU2JyQ3V0LT5ZQnVmZmVyW2ldID0gWUJ1ZmZlckR5biArIChuKlFNRl9DSEFOTkVMUyk7CisgIGlmIChOVUxMID09IChoU2JyQ3V0LT5wX1lCdWZmZXIgPSBHZXRSYW1fU2JyX2VudllCdWZmZXIoY2hhbm5lbCkpKSB7CisgICAgZ290byBiYWlsOwogICB9CiAKLSAgRklYUF9EQkwqIHJCdWZmZXIgPSBHZXRSYW1fU2JyX2VudlJCdWZmZXIoMCwgZHluYW1pY19SQU0pOwotICBGSVhQX0RCTCogaUJ1ZmZlciA9IEdldFJhbV9TYnJfZW52SUJ1ZmZlcigwLCBkeW5hbWljX1JBTSk7CisgIGZvciAoaSA9IDA7IGkgPCAoMzIgPj4gMSk7IGkrKykgeworICAgIGhTYnJDdXQtPllCdWZmZXJbaV0gPSBoU2JyQ3V0LT5wX1lCdWZmZXIgKyAoaSAqIDY0KTsKKyAgfQorICBZQnVmZmVyRHluID0gR2V0UmFtX1Nicl9lbnZZQnVmZmVyKGNoSW5FbCwgZHluYW1pY19SQU0pOworICBmb3IgKG4gPSAwOyBpIDwgMzI7IGkrKywgbisrKSB7CisgICAgaFNickN1dC0+WUJ1ZmZlcltpXSA9IFlCdWZmZXJEeW4gKyAobiAqIDY0KTsKKyAgfQogCi0gIGZvciAoaSA9IDA7IGkgPCBRTUZfTUFYX1RJTUVfU0xPVFM7IGkrKykgewotICAgIGhTYnJDdXQtPnJCdWZmZXJbaV0gPSByQnVmZmVyICsgKGkqUU1GX0NIQU5ORUxTKTsKLSAgICBoU2JyQ3V0LT5pQnVmZmVyW2ldID0gaUJ1ZmZlciArIChpKlFNRl9DSEFOTkVMUyk7CisgIHJCdWZmZXIgPSBHZXRSYW1fU2JyX2VudlJCdWZmZXIoMCwgZHluYW1pY19SQU0pOworICBpQnVmZmVyID0gR2V0UmFtX1Nicl9lbnZJQnVmZmVyKDAsIGR5bmFtaWNfUkFNKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgIGhTYnJDdXQtPnJCdWZmZXJbaV0gPSByQnVmZmVyICsgKGkgKiA2NCk7CisgICAgaFNickN1dC0+aUJ1ZmZlcltpXSA9IGlCdWZmZXIgKyAoaSAqIDY0KTsKICAgfQogCiAgIHJldHVybiAwOwotfQogCitiYWlsOgorICBGREtzYnJFbmNfZGVsZXRlRXh0cmFjdFNickVudmVsb3BlKGhTYnJDdXQpOworCisgIHJldHVybiAtMTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQpAQCAtMTkxMiwzNiArMTg5MiwyMiBAQAogICBccmV0dXJuIGVycm9yIHN0YXR1cwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfSW5pdEV4dHJhY3RTYnJFbnZlbG9wZSAoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFICBoU2JyQ3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jb2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19yb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZV9zbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZV9zdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuX29mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBzdGF0ZXNJbml0RmxhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGludCBjaEluRWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiogZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVSU5UIHNiclN5bnRheEZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworSU5UIEZES3NickVuY19Jbml0RXh0cmFjdFNickVudmVsb3BlKEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBoU2JyQ3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jb2xzLCBpbnQgbm9fcm93cywgaW50IHN0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lX3Nsb3RzLCBpbnQgdGltZV9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuX29mZiwgVUxPTkcgc3RhdGVzSW5pdEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoSW5FbCwgVUNIQVIgKmR5bmFtaWNfUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MpIHsKICAgaW50IFlCdWZmZXJMZW5ndGgsIHJCdWZmZXJMZW5ndGg7CiAgIGludCBpOwogCiAgIGlmIChzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSB7CiAgICAgaW50IG9mZiA9IFRSQU5TSUVOVF9PRkZTRVRfTEQ7Ci0jaWZuZGVmIEZVTExfREVMQVkKLSAgICBoU2JyQ3V0LT5ZQnVmZmVyV3JpdGVPZmZzZXQgPSAobm9fY29scz4+MSkrb2ZmKnRpbWVfc3RlcDsKLSNlbHNlCi0gICAgaFNickN1dC0+WUJ1ZmZlcldyaXRlT2Zmc2V0ID0gbm9fY29scytvZmYqdGltZV9zdGVwOwotI2VuZGlmCi0gIH0gZWxzZQotICB7Ci0gICAgaFNickN1dC0+WUJ1ZmZlcldyaXRlT2Zmc2V0ID0gdHJhbl9vZmYqdGltZV9zdGVwOworICAgIGhTYnJDdXQtPllCdWZmZXJXcml0ZU9mZnNldCA9IChub19jb2xzID4+IDEpICsgb2ZmICogdGltZV9zdGVwOworICB9IGVsc2UgeworICAgIGhTYnJDdXQtPllCdWZmZXJXcml0ZU9mZnNldCA9IHRyYW5fb2ZmICogdGltZV9zdGVwOwogICB9Ci0gIGhTYnJDdXQtPnJCdWZmZXJSZWFkT2Zmc2V0ICA9IDA7Ci0KKyAgaFNickN1dC0+ckJ1ZmZlclJlYWRPZmZzZXQgPSAwOwogCiAgIFlCdWZmZXJMZW5ndGggPSBoU2JyQ3V0LT5ZQnVmZmVyV3JpdGVPZmZzZXQgKyBub19jb2xzOwogICByQnVmZmVyTGVuZ3RoID0gbm9fY29sczsKQEAgLTE5NDksNyArMTkxNSw2IEBACiAgIGhTYnJDdXQtPnByZV90cmFuc2llbnRfaW5mb1swXSA9IDA7CiAgIGhTYnJDdXQtPnByZV90cmFuc2llbnRfaW5mb1sxXSA9IDA7CiAKLQogICBoU2JyQ3V0LT5ub19jb2xzID0gbm9fY29sczsKICAgaFNickN1dC0+bm9fcm93cyA9IG5vX3Jvd3M7CiAgIGhTYnJDdXQtPnN0YXJ0X2luZGV4ID0gc3RhcnRfaW5kZXg7CkBAIC0xOTU3LDcgKzE5MjIsNyBAQAogICBoU2JyQ3V0LT50aW1lX3Nsb3RzID0gdGltZV9zbG90czsKICAgaFNickN1dC0+dGltZV9zdGVwID0gdGltZV9zdGVwOwogCi0gIEZES19BU1NFUlQobm9fcm93cyAgICAgICAgPD0gICBRTUZfQ0hBTk5FTFMpOworICBGREtfQVNTRVJUKG5vX3Jvd3MgPD0gNjQpOwogCiAgIC8qIFVzZSBoYWxmIHRoZSBFbmVyZ3kgdmFsdWVzIGlmIHRpbWUgc3RlcCBpcyAyIG9yIGdyZWF0ZXIgKi8KICAgaWYgKHRpbWVfc3RlcCA+PSAyKQpAQCAtMTk2NSw0MCArMTkzMCwzNyBAQAogICBlbHNlCiAgICAgaFNickN1dC0+WUJ1ZmZlclN6U2hpZnQgPSAwOwogCi0gIFlCdWZmZXJMZW5ndGggICAgICAgICAgICAgICA+Pj0gaFNickN1dC0+WUJ1ZmZlclN6U2hpZnQ7CisgIFlCdWZmZXJMZW5ndGggPj49IGhTYnJDdXQtPllCdWZmZXJTelNoaWZ0OwogICBoU2JyQ3V0LT5ZQnVmZmVyV3JpdGVPZmZzZXQgPj49IGhTYnJDdXQtPllCdWZmZXJTelNoaWZ0OwogCi0gIEZES19BU1NFUlQoWUJ1ZmZlckxlbmd0aDw9UU1GX01BWF9USU1FX1NMT1RTKTsKKyAgRkRLX0FTU0VSVChZQnVmZmVyTGVuZ3RoIDw9IDMyKTsKIAogICBGSVhQX0RCTCAqWUJ1ZmZlckR5biA9IEdldFJhbV9TYnJfZW52WUJ1ZmZlcihjaEluRWwsIGR5bmFtaWNfUkFNKTsKLSAgSU5UIG49MDsKLSAgZm9yIChpPShRTUZfTUFYX1RJTUVfU0xPVFM+PjEpOyBpIDwgUU1GX01BWF9USU1FX1NMT1RTOyBpKyssbisrKSB7Ci0gICAgaFNickN1dC0+WUJ1ZmZlcltpXSA9IFlCdWZmZXJEeW4gKyAobipRTUZfQ0hBTk5FTFMpOworICBJTlQgbiA9IDA7CisgIGZvciAoaSA9ICgzMiA+PiAxKTsgaSA8IDMyOyBpKyssIG4rKykgeworICAgIGhTYnJDdXQtPllCdWZmZXJbaV0gPSBZQnVmZmVyRHluICsgKG4gKiA2NCk7CiAgIH0KIAotICBpZihzdGF0ZXNJbml0RmxhZykgewotICAgIGZvciAoaT0wOyBpPFlCdWZmZXJMZW5ndGg7IGkrKykgewotICAgICAgRkRLbWVtY2xlYXIoIGhTYnJDdXQtPllCdWZmZXJbaV0sUU1GX0NIQU5ORUxTKnNpemVvZihGSVhQX0RCTCkpOworICBpZiAoc3RhdGVzSW5pdEZsYWcpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgWUJ1ZmZlckxlbmd0aDsgaSsrKSB7CisgICAgICBGREttZW1jbGVhcihoU2JyQ3V0LT5ZQnVmZmVyW2ldLCA2NCAqIHNpemVvZihGSVhQX0RCTCkpOwogICAgIH0KICAgfQogCiAgIGZvciAoaSA9IDA7IGkgPCByQnVmZmVyTGVuZ3RoOyBpKyspIHsKLSAgICBGREttZW1jbGVhciggaFNickN1dC0+ckJ1ZmZlcltpXSxRTUZfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgRkRLbWVtY2xlYXIoIGhTYnJDdXQtPmlCdWZmZXJbaV0sUU1GX0NIQU5ORUxTKnNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNsZWFyKGhTYnJDdXQtPnJCdWZmZXJbaV0sIDY0ICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY2xlYXIoaFNickN1dC0+aUJ1ZmZlcltpXSwgNjQgKiBzaXplb2YoRklYUF9EQkwpKTsKICAgfQogCi0gIEZES21lbWNsZWFyIChoU2JyQ3V0LT5lbnZlbG9wZUNvbXBlbnNhdGlvbixzaXplb2YoVUNIQVIpKk1BWF9GUkVRX0NPRUZGUyk7CisgIEZES21lbWNsZWFyKGhTYnJDdXQtPmVudmVsb3BlQ29tcGVuc2F0aW9uLCBzaXplb2YoVUNIQVIpICogTUFYX0ZSRVFfQ09FRkZTKTsKIAotICBpZihzdGF0ZXNJbml0RmxhZykgewotICAgIGhTYnJDdXQtPllCdWZmZXJTY2FsZVswXSA9IGhTYnJDdXQtPllCdWZmZXJTY2FsZVsxXSA9IEZSQUNUX0JJVFMtMTsKKyAgaWYgKHN0YXRlc0luaXRGbGFnKSB7CisgICAgaFNickN1dC0+WUJ1ZmZlclNjYWxlWzBdID0gaFNickN1dC0+WUJ1ZmZlclNjYWxlWzFdID0gRlJBQ1RfQklUUyAtIDE7CiAgIH0KIAogICByZXR1cm4gKDApOwogfQogCi0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAKQEAgLTIwMDgsMjMgKzE5NzAsMTYgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAotRkRLc2JyRW5jX2RlbGV0ZUV4dHJhY3RTYnJFbnZlbG9wZSAoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIGhTYnJDdXQpCi17Ci0KK3ZvaWQgRkRLc2JyRW5jX2RlbGV0ZUV4dHJhY3RTYnJFbnZlbG9wZShIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNickN1dCkgewogICBpZiAoaFNickN1dCkgewogICAgIEZyZWVSYW1fU2JyX2VudllCdWZmZXIoJmhTYnJDdXQtPnBfWUJ1ZmZlcik7CiAgIH0KIH0KIAotSU5UCi1GREtzYnJFbmNfR2V0RW52RXN0RGVsYXkoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIGhTYnIpCi17Ci0gIHJldHVybiBoU2JyLT5ub19yb3dzKigoaFNici0+WUJ1ZmZlcldyaXRlT2Zmc2V0KSoyICAgICAvKiBtdWx0IDIgYmVjYXVzZSBucmcncyBhcmUgZ3JvdXBlZCBoYWxmICovCi0gICAgICAgICAgICAgICAgICAgICAgICAtIGhTYnItPnJCdWZmZXJSZWFkT2Zmc2V0ICk7ICAgICAgIC8qIGluIHJlZmVyZW5jZSBob2xkIGhhbGYgc3BlYyBhbmQgY2FsYyBucmcncyBvbiBvdmVybGFwcGVkIHNwZWMgKi8KLQorSU5UIEZES3NickVuY19HZXRFbnZFc3REZWxheShIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNicikgeworICByZXR1cm4gaFNici0+bm9fcm93cyAqCisgICAgICAgICAoKGhTYnItPllCdWZmZXJXcml0ZU9mZnNldCkgKgorICAgICAgICAgICAgICAyIC8qIG11bHQgMiBiZWNhdXNlIG5yZydzIGFyZSBncm91cGVkIGhhbGYgKi8KKyAgICAgICAgICAtIGhTYnItPnJCdWZmZXJSZWFkT2Zmc2V0KTsgLyogaW4gcmVmZXJlbmNlIGhvbGQgaGFsZiBzcGVjIGFuZCBjYWxjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yZydzIG9uIG92ZXJsYXBwZWQgc3BlYyAqLwogfQotCi0KLQotCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL2Vudl9lc3QuaCBiL2xpYlNCUmVuYy9zcmMvZW52X2VzdC5oCmluZGV4IGUxN2E5NzQuLjAwNmY1NWIgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvZW52X2VzdC5oCisrKyBiL2xpYlNCUmVuYy9zcmMvZW52X2VzdC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwyMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIEVudmVsb3BlIGVzdGltYXRpb24gc3RydWN0cyBhbmQgcHJvdG90eXBlcyAgCisgIFxicmllZiAgRW52ZWxvcGUgZXN0aW1hdGlvbiBzdHJ1Y3RzIGFuZCBwcm90b3R5cGVzICRSZXZpc2lvbjogOTI3OTAgJAogKi8KLSNpZm5kZWYgX19FTlZfRVNUX0gKLSNkZWZpbmUgX19FTlZfRVNUX0gKKyNpZm5kZWYgRU5WX0VTVF9ICisjZGVmaW5lIEVOVl9FU1RfSAogCiAjaW5jbHVkZSAic2JyX2RlZi5oIgogI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiIC8qIFNCUiBlY29uZmlnIHN0cnVjdHMgKi8KQEAgLTk3LDIwICsxMTYsMTggQEAKICNpbmNsdWRlICJjb2RlX2Vudi5oIgogI2luY2x1ZGUgInRvbl9jb3JyLmgiCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEZJWFBfREJMICAqckJ1ZmZlcltRTUZfTUFYX1RJTUVfU0xPVFNdOwotICBGSVhQX0RCTCAgKmlCdWZmZXJbUU1GX01BWF9USU1FX1NMT1RTXTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9EQkwgKnJCdWZmZXJbMzJdOworICBGSVhQX0RCTCAqaUJ1ZmZlclszMl07CiAKLSAgRklYUF9EQkwgICpwX1lCdWZmZXI7CisgIEZJWFBfREJMICpwX1lCdWZmZXI7CiAKLSAgRklYUF9EQkwgICpZQnVmZmVyW1FNRl9NQVhfVElNRV9TTE9UU107Ci0gIGludCAgICAgICAgWUJ1ZmZlclNjYWxlWzJdOworICBGSVhQX0RCTCAqWUJ1ZmZlclszMl07CisgIGludCBZQnVmZmVyU2NhbGVbMl07CiAKICAgVUNIQVIgZW52ZWxvcGVDb21wZW5zYXRpb25bTUFYX0ZSRVFfQ09FRkZTXTsKICAgVUNIQVIgcHJlX3RyYW5zaWVudF9pbmZvWzJdOwogCi0KICAgaW50IFlCdWZmZXJXcml0ZU9mZnNldDsKICAgaW50IFlCdWZmZXJTelNoaWZ0OwogICBpbnQgckJ1ZmZlclJlYWRPZmZzZXQ7CkBAIC0xMjEsMjEgKzEzOCwxOCBAQAogCiAgIGludCB0aW1lX3Nsb3RzOwogICBpbnQgdGltZV9zdGVwOwotfQotU0JSX0VYVFJBQ1RfRU5WRUxPUEU7Cit9IFNCUl9FWFRSQUNUX0VOVkVMT1BFOwogdHlwZWRlZiBTQlJfRVhUUkFDVF9FTlZFTE9QRSAqSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFOwogCi1zdHJ1Y3QgRU5WX0NIQU5ORUwKLXsKK3N0cnVjdCBFTlZfQ0hBTk5FTCB7CiAgIEZBU1RfVFJBTl9ERVRFQ1RPUiBzYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3I7CiAgIFNCUl9UUkFOU0lFTlRfREVURUNUT1Igc2JyVHJhbnNpZW50RGV0ZWN0b3I7CiAgIFNCUl9DT0RFX0VOVkVMT1BFIHNickNvZGVFbnZlbG9wZTsKICAgU0JSX0NPREVfRU5WRUxPUEUgc2JyQ29kZU5vaXNlRmxvb3I7CiAgIFNCUl9FWFRSQUNUX0VOVkVMT1BFIHNickV4dHJhY3RFbnZlbG9wZTsKIAotCiAgIFNCUl9FTlZFTE9QRV9GUkFNRSBTYnJFbnZGcmFtZTsKLSAgU0JSX1RPTl9DT1JSX0VTVCAgIFRvbkNvcnI7CisgIFNCUl9UT05fQ09SUl9FU1QgVG9uQ29ycjsKIAogICBzdHJ1Y3QgU0JSX0VOVl9EQVRBIGVuY0VudkRhdGE7CiAKQEAgLTE0Niw4MCArMTYwLDY0IEBACiAKIC8qKioqKioqKioqKiogIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKiovCiAKLUlOVAotRkRLc2JyRW5jX0NyZWF0ZUV4dHJhY3RTYnJFbnZlbG9wZSAoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFICBoU2JyQ3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLElOVCBjaEluRWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSKiBkeW5hbWljX1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICk7CitJTlQgRkRLc2JyRW5jX0NyZWF0ZUV4dHJhY3RTYnJFbnZlbG9wZShIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNickN1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFubmVsLCBJTlQgY2hJbkVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmR5bmFtaWNfUkFNKTsKIAorSU5UIEZES3NickVuY19Jbml0RXh0cmFjdFNickVudmVsb3BlKEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBoU2JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jb2xzLCBpbnQgbm9fcm93cywgaW50IHN0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lX3Nsb3RzLCBpbnQgdGltZV9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuX29mZiwgVUxPTkcgc3RhdGVzSW5pdEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoSW5FbCwgVUNIQVIgKmR5bmFtaWNfUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MpOwogCi1JTlQKLUZES3NickVuY19Jbml0RXh0cmFjdFNickVudmVsb3BlICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIGhTYnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jb2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9fcm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZV9zbG90cywgaW50IHRpbWVfc3RlcCwgaW50IHRyYW5fb2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBzdGF0ZXNJbml0RmxhZwotICAgICAgICAgICAgICAgICAgICAgICAgICxpbnQgY2hJbkVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSKiBkeW5hbWljX1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICxVSU5UIHNiclN5bnRheEZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotdm9pZCBGREtzYnJFbmNfZGVsZXRlRXh0cmFjdFNickVudmVsb3BlIChIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNickN1dCk7Cit2b2lkIEZES3NickVuY19kZWxldGVFeHRyYWN0U2JyRW52ZWxvcGUoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIGhTYnJDdXQpOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgRlJFUV9SRVMgcmVzW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsKLSAgICBpbnQgbWF4UXVhbnRFcnJvcjsKKyAgRlJFUV9SRVMgcmVzW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsKKyAgaW50IG1heFF1YW50RXJyb3I7CiAKIH0gU0JSX0ZSQU1FX1RFTVBfREFUQTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPICpmcmFtZV9pbmZvOwotICAgIEZJWFBfREJMIG5vaXNlRmxvb3JbTUFYX05VTV9OT0lTRV9WQUxVRVNdOwotICAgIFNDSEFSIHNmYl9ucmdfY291cGxpbmdbTUFYX05VTV9FTlZFTE9QRV9WQUxVRVNdOyAvKiBvbmx5IHVzZWQgaWYgc3RlcmVvbW9kZSA9IFNXSVRDSF9MX1JfQyAqLwotICAgIFNDSEFSIHNmYl9ucmdbTUFYX05VTV9FTlZFTE9QRV9WQUxVRVNdOwotICAgIFNDSEFSIG5vaXNlX2xldmVsX2NvdXBsaW5nW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsgLyogb25seSB1c2VkIGlmIHN0ZXJlb21vZGUgPSBTV0lUQ0hfTF9SX0MgKi8KLSAgICBTQ0hBUiBub2lzZV9sZXZlbFtNQVhfTlVNX05PSVNFX1ZBTFVFU107Ci0gICAgVUNIQVIgdHJhbnNpZW50X2luZm9bM107Ci0gICAgVUNIQVIgbkVudmVsb3BlczsKKyAgY29uc3QgU0JSX0ZSQU1FX0lORk8gKmZyYW1lX2luZm87CisgIEZJWFBfREJMIG5vaXNlRmxvb3JbTUFYX05VTV9OT0lTRV9WQUxVRVNdOworICBTQ0hBUiBzZmJfbnJnX2NvdXBsaW5nCisgICAgICBbTUFYX05VTV9FTlZFTE9QRV9WQUxVRVNdOyAvKiBvbmx5IHVzZWQgaWYgc3RlcmVvbW9kZSA9IFNXSVRDSF9MX1JfQyAqLworICBTQ0hBUiBzZmJfbnJnW01BWF9OVU1fRU5WRUxPUEVfVkFMVUVTXTsKKyAgU0NIQVIgbm9pc2VfbGV2ZWxfY291cGxpbmcKKyAgICAgIFtNQVhfTlVNX05PSVNFX1ZBTFVFU107IC8qIG9ubHkgdXNlZCBpZiBzdGVyZW9tb2RlID0gU1dJVENIX0xfUl9DICovCisgIFNDSEFSIG5vaXNlX2xldmVsW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsKKyAgVUNIQVIgdHJhbnNpZW50X2luZm9bM107CisgIFVDSEFSIG5FbnZlbG9wZXM7CiB9IFNCUl9FTlZfVEVNUF9EQVRBOwogCiAvKgotICogRXh0cmFjdCBmZWF0dXJlcyBmcm9tIFFNRiBkYXRhLiBBZnRlcndhcmRzLCB0aGUgUU1GIGRhdGEgaXMgbm90IHJlcXVpcmVkIGFueW1vcmUuCisgKiBFeHRyYWN0IGZlYXR1cmVzIGZyb20gUU1GIGRhdGEuIEFmdGVyd2FyZHMsIHRoZSBRTUYgZGF0YSBpcyBub3QgcmVxdWlyZWQKKyAqIGFueW1vcmUuCiAgKi8KLXZvaWQKLUZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUxKAotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgICAgaF9jb24sCi0gICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSAgICBzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICAgICAgIGhfZW52Q2hhbiwKLSAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgICAgICAgIGNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgIFNCUl9FTlZfVEVNUF9EQVRBICAgKmVEYXRhLAotICAgICAgICAgICAgICAgICAgIFNCUl9GUkFNRV9URU1QX0RBVEEgKmZEYXRhCi0gICAgICAgICAgICAgICAgICAgICk7Ci0KK3ZvaWQgRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTEoSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX2VudkNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSBjbW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0VOVl9URU1QX0RBVEEgKmVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YSk7CiAKIC8qCiAgKiBQcm9jZXNzIHRoZSBwcmV2aW91c2x5IGZlYXR1cmVzIGV4dHJhY3RlZCBieSBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMQogICogYW5kIGNyZWF0ZS9lbmNvZGUgU0JSIGVudmVsb3Blcy4KICAqLwotdm9pZAotRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTIoCi0gICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSAgICAgaF9jb24sCi0gICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSAgICAgc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBICBzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCAgICAgICAgIHNickVudkNoYW5uZWwwLAotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCAgICAgICAgIHNickVudkNoYW5uZWwxLAotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgIGNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgIFNCUl9FTlZfVEVNUF9EQVRBICAgICAgICAgKmVEYXRhLAotICAgICAgICAgICAgICAgICAgIFNCUl9GUkFNRV9URU1QX0RBVEEgICAgICAgKmZEYXRhLAotICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyT3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgKTsKK3ZvaWQgRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTIoSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMIHNickVudkNoYW5uZWwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgc2JyRW52Q2hhbm5lbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSBjbW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0VOVl9URU1QX0RBVEEgKmVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YSwgaW50IGNsZWFyT3V0cHV0KTsKIAotSU5UCi1GREtzYnJFbmNfR2V0RW52RXN0RGVsYXkoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIGhTYnIpOworSU5UIEZES3NickVuY19HZXRFbnZFc3REZWxheShIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNicik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9mcmFtX2dlbi5jcHAgYi9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmNwcAppbmRleCA5YTM1MTExLi43ZWQ2ZTc5IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmNwcAorKysgYi9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyNzIgKzkwLDIzNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJmcmFtX2dlbi5oIgogI2luY2x1ZGUgInNicl9taXNjLmgiCiAKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCi1zdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMV8yMDQ4ID0gewotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHsgMCwgMTZ9LAotICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICB7MCwgMTZ9IH07CitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMV8yMDQ4ID0gezEsIHswLCAxNn0sIHtGUkVRX1JFU19ISUdIfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgICAgICAgezAsIDE2fX07CiAKIHN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzIwNDggPSB7Ci0gICAgICAgICAgICAyLAotICAgICAgICAgICAgeyAwLCAgOCwgMTZ9LAotICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA4LCAxNn0gfTsKKyAgICAyLCB7MCwgOCwgMTZ9LCB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sIDAsIDIsIHswLCA4LCAxNn19OwogCiBzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvNF8yMDQ4ID0gewotICAgICAgICAgICAgNCwKLSAgICAgICAgICAgIHsgMCwgIDQsICA4LCAxMiwgMTZ9LAotICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA4LCAxNn0gfTsKKyAgICA0LAorICAgIHswLCA0LCA4LCAxMiwgMTZ9LAorICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKKyAgICAwLAorICAgIDIsCisgICAgezAsIDgsIDE2fX07CiAKLXN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzIzMDQgPSB7Ci0gICAgICAgICAgICAxLAotICAgICAgICAgICAgeyAwLCAxOH0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHsgMCwgMTh9IH07CitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMV8yMzA0ID0gezEsIHswLCAxOH0sIHtGUkVRX1JFU19ISUdIfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgICAgICAgezAsIDE4fX07CiAKIHN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzIzMDQgPSB7Ci0gICAgICAgICAgICAyLAotICAgICAgICAgICAgeyAwLCAgOSwgMTh9LAotICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA5LCAxOH0gfTsKKyAgICAyLCB7MCwgOSwgMTh9LCB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sIDAsIDIsIHswLCA5LCAxOH19OwogCiBzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvNF8yMzA0ID0gewotICAgICAgICAgICAgNCwKLSAgICAgICAgICAgIHsgMCwgIDUsICA5LCAxNCwgMTh9LAotICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA5LCAxOH0gfTsKKyAgICA0LAorICAgIHswLCA1LCA5LCAxNCwgMTh9LAorICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKKyAgICAwLAorICAgIDIsCisgICAgezAsIDksIDE4fX07CiAKLXN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzE5MjAgPSB7Ci0gICAgICAgICAgICAxLAotICAgICAgICAgICAgeyAwLCAxNX0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHsgMCwgMTV9IH07CitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMV8xOTIwID0gezEsIHswLCAxNX0sIHtGUkVRX1JFU19ISUdIfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgICAgICAgezAsIDE1fX07CiAKIHN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzE5MjAgPSB7Ci0gICAgICAgICAgICAyLAotICAgICAgICAgICAgeyAwLCAgOCwgMTV9LAotICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA4LCAxNX0gfTsKKyAgICAyLCB7MCwgOCwgMTV9LCB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sIDAsIDIsIHswLCA4LCAxNX19OwogCiBzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvNF8xOTIwID0gewotICAgICAgICAgICAgNCwKLSAgICAgICAgICAgIHsgMCwgIDQsICA4LCAxMiwgMTV9LAotICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA4LCAxNX0gfTsKKyAgICA0LAorICAgIHswLCA0LCA4LCAxMiwgMTV9LAorICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKKyAgICAwLAorICAgIDIsCisgICAgezAsIDgsIDE1fX07CiAKLXN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzExNTIgPSB7Ci0gICAgICAgICAgICAxLAotICAgICAgICAgICAgeyAwLCAgOX0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHsgMCwgIDl9IH07CitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMV8xMTUyID0gezEsIHswLCA5fSwge0ZSRVFfUkVTX0hJR0h9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAgICAgIHswLCA5fX07CiAKIHN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzExNTIgPSB7Ci0gICAgICAgICAgICAyLAotICAgICAgICAgICAgeyAwLCAgNSwgIDl9LAotICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA1LCAgOX0gfTsKKyAgICAyLCB7MCwgNSwgOX0sIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwgMCwgMiwgezAsIDUsIDl9fTsKIAogc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzRfMTE1MiA9IHsKLSAgICAgICAgICAgIDQsCi0gICAgICAgICAgICB7IDAsICAyLCAgNSwKLSAgICAgICAgICAgICAgNywgIDl9LAotICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA1LCAgOX0gfTsKLQorICAgIDQsCisgICAgezAsIDIsIDUsIDcsIDl9LAorICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKKyAgICAwLAorICAgIDIsCisgICAgezAsIDUsIDl9fTsKIAogLyogQUFDTEQgZnJhbWUgaW5mbyAqLwotc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfNTEyTEQgPSB7Ci0gICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICB7MCwgOH0sCi0gICAgICAgICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICB7MCwgOH19Oworc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfNTEyTEQgPSB7MSwgezAsIDh9LCB7RlJFUV9SRVNfSElHSH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAgICAgIHswLCA4fX07CiAKIHN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzUxMkxEID0gewotICAgICAgICAgICAgICAgICAgIDIsCi0gICAgICAgICAgICAgICAgICAgezAsIDQsIDh9LAotICAgICAgICAgICAgICAgICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKLSAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgIDIsCi0gICAgICAgICAgICAgICAgICAgezAsIDQsIDh9fTsKKyAgICAyLCB7MCwgNCwgOH0sIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwgMCwgMiwgezAsIDQsIDh9fTsKIAogc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzRfNTEyTEQgPSB7Ci0gICAgICAgICAgICAgICAgICAgNCwKLSAgICAgICAgICAgICAgICAgICB7MCwgMiwgNCwgNiwgOH0sCi0gICAgICAgICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgMiwKLSAgICAgICAgICAgICAgICAgICB7MCwgNCwgOH19OworICAgIDQsCisgICAgezAsIDIsIDQsIDYsIDh9LAorICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKKyAgICAwLAorICAgIDIsCisgICAgezAsIDQsIDh9fTsKIAotc3RhdGljIGludAotY2FsY0ZpbGxMZW5ndGhNYXggKGludCB0cmFuUG9zLCAgICAgICAgICAvKiE8IGlucHV0IDogdHJhbnNpZW50IHBvc2l0aW9uIChyZWY6IHRyYW4gZGV0KSAqLwotICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMgICAvKiE8IGlucHV0IDogbnVtYmVyIG9mIHRpbWVzbG90cyAqLwotICAgICAgICAgICAgICAgICAgICk7CitzdGF0aWMgaW50IGNhbGNGaWxsTGVuZ3RoTWF4KAorICAgIGludCB0cmFuUG9zLCAgICAgICAgLyohPCBpbnB1dCA6IHRyYW5zaWVudCBwb3NpdGlvbiAocmVmOiB0cmFuIGRldCkgKi8KKyAgICBpbnQgbnVtYmVyVGltZVNsb3RzIC8qITwgaW5wdXQgOiBudW1iZXIgb2YgdGltZXNsb3RzICovCispOwogCi1zdGF0aWMgdm9pZAotZmlsbEZyYW1lVHJhbiAoY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sICAgICAgLyohPCB0dW5pbmc6IGRlc2lyZWQgc2VnbWVudCBsZW5ndGhzICovCi0gICAgICAgICAgICAgICBjb25zdCBpbnQgKnZfdHVuaW5nRnJlcSwgICAgICAvKiE8IHR1bmluZzogZGVzaXJlZCBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KLSAgICAgICAgICAgICAgIGludCB0cmFuLCAgICAgICAgICAgICAgICAgICAgIC8qITwgaW5wdXQgOiBwb3NpdGlvbiBvZiB0cmFuc2llbnQgKi8KLSAgICAgICAgICAgICAgIGludCAqdl9ib3JkLCAgICAgICAgICAgICAgICAgIC8qITwgbWVtTmV3OiBib3JkZXJzICovCi0gICAgICAgICAgICAgICBpbnQgKmxlbmd0aF92X2JvcmQsICAgICAgICAgICAvKiE8IG1lbU5ldzogIyBib3JkZXJzICovCi0gICAgICAgICAgICAgICBpbnQgKnZfZnJlcSwgICAgICAgICAgICAgICAgICAvKiE8IG1lbU5ldzogZnJlcXVlbmN5IHJlc29sdXRpb25zICovCi0gICAgICAgICAgICAgICBpbnQgKmxlbmd0aF92X2ZyZXEsICAgICAgICAgICAvKiE8IG1lbU5ldzogIyBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KLSAgICAgICAgICAgICAgIGludCAqYm1pbiwgICAgICAgICAgICAgICAgICAgIC8qITwgaGxwTmV3OiBmaXJzdCBtYW5kYXRvcnkgYm9yZGVyICovCi0gICAgICAgICAgICAgICBpbnQgKmJtYXggICAgICAgICAgICAgICAgICAgICAvKiE8IGhscE5ldzogbGFzdCAgbWFuZGF0b3J5IGJvcmRlciAqLwotICAgICAgICAgICAgICAgKTsKK3N0YXRpYyB2b2lkIGZpbGxGcmFtZVRyYW4oCisgICAgY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sIC8qITwgdHVuaW5nOiBkZXNpcmVkIHNlZ21lbnQgbGVuZ3RocyAqLworICAgIGNvbnN0IGludCAqdl90dW5pbmdGcmVxLCAvKiE8IHR1bmluZzogZGVzaXJlZCBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KKyAgICBpbnQgdHJhbiwgICAgICAgICAgICAgICAgLyohPCBpbnB1dCA6IHBvc2l0aW9uIG9mIHRyYW5zaWVudCAqLworICAgIGludCAqdl9ib3JkLCAgICAgICAgICAgICAvKiE8IG1lbU5ldzogYm9yZGVycyAqLworICAgIGludCAqbGVuZ3RoX3ZfYm9yZCwgICAgICAvKiE8IG1lbU5ldzogIyBib3JkZXJzICovCisgICAgaW50ICp2X2ZyZXEsICAgICAgICAgICAgIC8qITwgbWVtTmV3OiBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KKyAgICBpbnQgKmxlbmd0aF92X2ZyZXEsICAgICAgLyohPCBtZW1OZXc6ICMgZnJlcXVlbmN5IHJlc29sdXRpb25zICovCisgICAgaW50ICpibWluLCAgICAgICAgICAgICAgIC8qITwgaGxwTmV3OiBmaXJzdCBtYW5kYXRvcnkgYm9yZGVyICovCisgICAgaW50ICpibWF4ICAgICAgICAgICAgICAgIC8qITwgaGxwTmV3OiBsYXN0ICBtYW5kYXRvcnkgYm9yZGVyICovCispOwogCi1zdGF0aWMgdm9pZCBmaWxsRnJhbWVQcmUgKElOVCBkbWF4LCBJTlQgKnZfYm9yZCwgSU5UICpsZW5ndGhfdl9ib3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLCBJTlQgYm1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJlc3QpOworc3RhdGljIHZvaWQgZmlsbEZyYW1lUHJlKElOVCBkbWF4LCBJTlQgKnZfYm9yZCwgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCBibWluLCBJTlQgcmVzdCk7CiAKLXN0YXRpYyB2b2lkIGZpbGxGcmFtZVBvc3QgKElOVCAqcGFydHMsIElOVCAqZCwgSU5UIGRtYXgsIElOVCAqdl9ib3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UIGJtYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYnVmZmVyRnJhbWVTdGFydCwgSU5UIG51bWJlclRpbWVTbG90cywgSU5UIGZtYXgpOworc3RhdGljIHZvaWQgZmlsbEZyYW1lUG9zdChJTlQgKnBhcnRzLCBJTlQgKmQsIElOVCBkbWF4LCBJTlQgKnZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYm1heCwgSU5UIGJ1ZmZlckZyYW1lU3RhcnQsIElOVCBudW1iZXJUaW1lU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmbWF4KTsKIAotc3RhdGljIHZvaWQgZmlsbEZyYW1lSW50ZXIgKElOVCAqbkwsIGNvbnN0IGludCAqdl90dW5pbmdTZWdtLCBJTlQgKnZfYm9yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCBibWluLCBJTlQgKnZfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCAqdl9ib3JkRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywgSU5UICp2X2ZyZXFGb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LCBJTlQgaV9maWxsRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkbWluLCBJTlQgZG1heCwgSU5UIG51bWJlclRpbWVTbG90cyk7CitzdGF0aWMgdm9pZCBmaWxsRnJhbWVJbnRlcihJTlQgKm5MLCBjb25zdCBpbnQgKnZfdHVuaW5nU2VnbSwgSU5UICp2X2JvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCBibWluLCBJTlQgKnZfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UICp2X2JvcmRGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmRGb2xsb3csIElOVCAqdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LCBJTlQgaV9maWxsRm9sbG93LCBJTlQgZG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkbWF4LCBJTlQgbnVtYmVyVGltZVNsb3RzKTsKIAotc3RhdGljIHZvaWQgY2FsY0ZyYW1lQ2xhc3MgKEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzLCBGUkFNRV9DTEFTUyAqZnJhbWVDbGFzc09sZCwgSU5UIHRyYW5GbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc3ByZWFkRmxhZyk7CitzdGF0aWMgdm9pZCBjYWxjRnJhbWVDbGFzcyhGUkFNRV9DTEFTUyAqZnJhbWVDbGFzcywgRlJBTUVfQ0xBU1MgKmZyYW1lQ2xhc3NPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdHJhbkZsYWcsIElOVCAqc3ByZWFkRmxhZyk7CiAKLXN0YXRpYyB2b2lkIHNwZWNpYWxDYXNlIChJTlQgKnNwcmVhZEZsYWcsIElOVCBhbGxvd1NwcmVhZCwgSU5UICp2X2JvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcGFydHMsIElOVCBkKTsKK3N0YXRpYyB2b2lkIHNwZWNpYWxDYXNlKElOVCAqc3ByZWFkRmxhZywgSU5UIGFsbG93U3ByZWFkLCBJTlQgKnZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcGFydHMsIElOVCBkKTsKIAotc3RhdGljIHZvaWQgY2FsY0Ntb25Cb3JkZXIgKElOVCAqaV9jbW9uLCBJTlQgKmlfdHJhbiwgSU5UICp2X2JvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgdHJhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYnVmZmVyRnJhbWVTdGFydCwgSU5UIG51bWJlclRpbWVTbG90cyk7CitzdGF0aWMgdm9pZCBjYWxjQ21vbkJvcmRlcihJTlQgKmlfY21vbiwgSU5UICppX3RyYW4sIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgdHJhbiwgSU5UIGJ1ZmZlckZyYW1lU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtYmVyVGltZVNsb3RzKTsKIAotc3RhdGljIHZvaWQga2VlcEZvckZvbGxvd1VwIChJTlQgKnZfYm9yZEZvbGxvdywgSU5UICpsZW5ndGhfdl9ib3JkRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnZfZnJlcUZvbGxvdywgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmlfdHJhbkZvbGxvdywgSU5UICppX2ZpbGxGb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaV9jbW9uLCBJTlQgaV90cmFuLCBJTlQgcGFydHMsIElOVCBudW1iZXJUaW1lU2xvdHMpOworc3RhdGljIHZvaWQga2VlcEZvckZvbGxvd1VwKElOVCAqdl9ib3JkRm9sbG93LCBJTlQgKmxlbmd0aF92X2JvcmRGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICp2X2ZyZXFGb2xsb3csIElOVCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmlfdHJhbkZvbGxvdywgSU5UICppX2ZpbGxGb2xsb3csIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsIElOVCBpX2Ntb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGlfdHJhbiwgSU5UIHBhcnRzLCBJTlQgbnVtYmVyVGltZVNsb3RzKTsKIAotc3RhdGljIHZvaWQgY2FsY0N0cmxTaWduYWwgKEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwgRlJBTUVfQ0xBU1MgZnJhbWVDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnZfYm9yZCwgSU5UIGxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW5ndGhfdl9mcmVxLCBJTlQgaV9jbW9uLCBJTlQgaV90cmFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzcHJlYWRGbGFnLCBJTlQgbkwpOworc3RhdGljIHZvaWQgY2FsY0N0cmxTaWduYWwoSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLCBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICp2X2JvcmQsIElOVCBsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW5ndGhfdl9mcmVxLCBJTlQgaV9jbW9uLCBJTlQgaV90cmFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNwcmVhZEZsYWcsIElOVCBuTCk7CiAKLXN0YXRpYyB2b2lkIGN0cmxTaWduYWwyRnJhbWVJbmZvIChIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9JTkZPIGhGcmFtZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJFUV9SRVMgKmZyZXFfcmVzX2ZpeGZpeCk7Ci0KK3N0YXRpYyB2b2lkIGN0cmxTaWduYWwyRnJhbWVJbmZvKEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfSU5GTyBoRnJhbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJFUV9SRVMgKmZyZXFfcmVzX2ZpeGZpeCk7CiAKIC8qIHRhYmxlIGZvciA4IHRpbWUgc2xvdCBpbmRleCAqLwotc3RhdGljIGNvbnN0IGludCBlbnZlbG9wZVRhYmxlXzggWzhdWzVdID0gewotLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KLS8qIGJvcmRlcnMgZnJvbSBsZWZ0IHRvIHJpZ2h0IHNpZGU7IC0xID0gbm90IGluIHVzZSAqLwotICAgIC8qW3xULXwtLS0tLS1dKi8gIHsgMiwgMCwgMCwgMSwgLTEgfSwKLSAgICAvKlt8LVQtfC0tLS0tXSovICB7IDIsIDAsIDAsIDIsIC0xIH0sCi0gICAgLypbLS18VC18LS0tLV0qLyAgeyAzLCAxLCAxLCAyLCAgNCB9LAotICAgIC8qWy0tLXxULXwtLS1dKi8gIHsgMywgMSwgMSwgMywgIDUgfSwKLSAgICAvKlstLS0tfFQtfC0tXSovICB7IDMsIDEsIDEsIDQsICA2IH0sCi0gICAgLypbLS0tLS18VC0tfF0qLyAgeyAyLCAxLCAxLCA1LCAtMSB9LAotICAgIC8qWy0tLS0tLXxULXxdKi8gIHsgMiwgMSwgMSwgNiwgLTEgfSwKLSAgICAvKlstLS0tLS0tfFR8XSovICB7IDIsIDEsIDEsIDcsIC0xIH0sCitzdGF0aWMgY29uc3QgaW50IGVudmVsb3BlVGFibGVfOFs4XVs1XSA9IHsKKyAgICAvKiB0cmFuc2llbnRJbmRleCAgbkVudiwgdHJhbklkeCwgc2hvcnRFbnYsIGJvcmRlcjEsIGJvcmRlcjIsIC4uLiAqLworICAgIC8qIGJvcmRlcnMgZnJvbSBsZWZ0IHRvIHJpZ2h0IHNpZGU7IC0xID0gbm90IGluIHVzZSAqLworICAgIC8qW3xULXwtLS0tLS1dKi8gezIsIDAsIDAsIDEsIC0xfSwKKyAgICAvKlt8LVQtfC0tLS0tXSovIHsyLCAwLCAwLCAyLCAtMX0sCisgICAgLypbLS18VC18LS0tLV0qLyB7MywgMSwgMSwgMiwgNH0sCisgICAgLypbLS0tfFQtfC0tLV0qLyB7MywgMSwgMSwgMywgNX0sCisgICAgLypbLS0tLXxULXwtLV0qLyB7MywgMSwgMSwgNCwgNn0sCisgICAgLypbLS0tLS18VC0tfF0qLyB7MiwgMSwgMSwgNSwgLTF9LAorICAgIC8qWy0tLS0tLXxULXxdKi8gezIsIDEsIDEsIDYsIC0xfSwKKyAgICAvKlstLS0tLS0tfFR8XSovIHsyLCAxLCAxLCA3LCAtMX0sCiB9OwogCiAvKiB0YWJsZSBmb3IgMTYgdGltZSBzbG90IGluZGV4ICovCi1zdGF0aWMgY29uc3QgaW50IGVudmVsb3BlVGFibGVfMTYgWzE2XVs2XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgZW52ZWxvcGVUYWJsZV8xNlsxNl1bNl0gPSB7CiAgICAgLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KICAgICAvKiBsZW5ndGggZnJvbSBsZWZ0IHRvIHJpZ2h0IHNpZGU7IC0xID0gbm90IGluIHVzZSAqLwotICAgIC8qW3xULS0tfC0tLS0tLS0tLS0tLXxdKi8geyAyLCAwLCAwLCA0LCAtMSwgLTF9LAotICAgIC8qW3wtVC0tLXwtLS0tLS0tLS0tLXxdKi8geyAyLCAwLCAwLCA1LCAtMSwgLTF9LAotICAgIC8qW3wtLXxULS0tfC0tLS0tLS0tLS1dKi8geyAzLCAxLCAxLCAyLCAgNiwgLTF9LAotICAgIC8qW3wtLS18VC0tLXwtLS0tLS0tLS1dKi8geyAzLCAxLCAxLCAzLCAgNywgLTF9LAotICAgIC8qW3wtLS0tfFQtLS18LS0tLS0tLS1dKi8geyAzLCAxLCAxLCA0LCAgOCwgLTF9LAotICAgIC8qW3wtLS0tLXxULS0tfC0tLS0tLS1dKi8geyAzLCAxLCAxLCA1LCAgOSwgLTF9LAotICAgIC8qW3wtLS0tLS18VC0tLXwtLS0tLS1dKi8geyAzLCAxLCAxLCA2LCAxMCwgLTF9LAotICAgIC8qW3wtLS0tLS0tfFQtLS18LS0tLS1dKi8geyAzLCAxLCAxLCA3LCAxMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLXxULS0tfC0tLS1dKi8geyAzLCAxLCAxLCA4LCAxMiwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS18VC0tLXwtLS1dKi8geyAzLCAxLCAxLCA5LCAxMywgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tfFQtLS18LS1dKi8geyAzLCAxLCAxLDEwLCAxNCwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLXxULS0tLXxdKi8geyAyLCAxLCAxLDExLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tLXxdKi8geyAyLCAxLCAxLDEyLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS0tfFQtLXxdKi8geyAyLCAxLCAxLDEzLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS0tLXxULXxdKi8geyAyLCAxLCAxLDE0LCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS0tLS18VHxdKi8geyAyLCAxLCAxLDE1LCAtMSwgLTF9LAorICAgIC8qW3xULS0tfC0tLS0tLS0tLS0tLXxdKi8gezIsIDAsIDAsIDQsIC0xLCAtMX0sCisgICAgLypbfC1ULS0tfC0tLS0tLS0tLS0tfF0qLyB7MiwgMCwgMCwgNSwgLTEsIC0xfSwKKyAgICAvKlt8LS18VC0tLXwtLS0tLS0tLS0tXSovIHszLCAxLCAxLCAyLCA2LCAtMX0sCisgICAgLypbfC0tLXxULS0tfC0tLS0tLS0tLV0qLyB7MywgMSwgMSwgMywgNywgLTF9LAorICAgIC8qW3wtLS0tfFQtLS18LS0tLS0tLS1dKi8gezMsIDEsIDEsIDQsIDgsIC0xfSwKKyAgICAvKlt8LS0tLS18VC0tLXwtLS0tLS0tXSovIHszLCAxLCAxLCA1LCA5LCAtMX0sCisgICAgLypbfC0tLS0tLXxULS0tfC0tLS0tLV0qLyB7MywgMSwgMSwgNiwgMTAsIC0xfSwKKyAgICAvKlt8LS0tLS0tLXxULS0tfC0tLS0tXSovIHszLCAxLCAxLCA3LCAxMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLXxULS0tfC0tLS1dKi8gezMsIDEsIDEsIDgsIDEyLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLXxULS0tfC0tLV0qLyB7MywgMSwgMSwgOSwgMTMsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLXxULS0tfC0tXSovIHszLCAxLCAxLCAxMCwgMTQsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS18VC0tLS18XSovIHsyLCAxLCAxLCAxMSwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tfFQtLS18XSovIHsyLCAxLCAxLCAxMiwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tLXxULS18XSovIHsyLCAxLCAxLCAxMywgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tLS18VC18XSovIHsyLCAxLCAxLCAxNCwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tLS0tfFR8XSovIHsyLCAxLCAxLCAxNSwgLTEsIC0xfSwKIH07CiAKIC8qIHRhYmxlIGZvciAxNSB0aW1lIHNsb3QgaW5kZXggKi8KLXN0YXRpYyBjb25zdCBpbnQgZW52ZWxvcGVUYWJsZV8xNSBbMTVdWzZdID0geworc3RhdGljIGNvbnN0IGludCBlbnZlbG9wZVRhYmxlXzE1WzE1XVs2XSA9IHsKICAgICAvKiB0cmFuc2llbnRJbmRleCAgbkVudiwgdHJhbklkeCwgc2hvcnRFbnYsIGJvcmRlcjEsIGJvcmRlcjIsIC4uLiAqLwogICAgIC8qIGxlbmd0aCBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCi0gICAgLypbfFQtLS18LS0tLS0tLS0tLS0tXSovIHsgMiwgMCwgMCwgNCwgLTEsIC0xfSwKLSAgICAvKlt8LVQtLS18LS0tLS0tLS0tLS1dKi8geyAyLCAwLCAwLCA1LCAtMSwgLTF9LAotICAgIC8qW3wtLXxULS0tfC0tLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDIsICA2LCAtMX0sCi0gICAgLypbfC0tLXxULS0tfC0tLS0tLS0tXSovIHsgMywgMSwgMSwgMywgIDcsIC0xfSwKLSAgICAvKlt8LS0tLXxULS0tfC0tLS0tLS1dKi8geyAzLCAxLCAxLCA0LCAgOCwgLTF9LAotICAgIC8qW3wtLS0tLXxULS0tfC0tLS0tLV0qLyB7IDMsIDEsIDEsIDUsICA5LCAtMX0sCi0gICAgLypbfC0tLS0tLXxULS0tfC0tLS0tXSovIHsgMywgMSwgMSwgNiwgMTAsIC0xfSwKLSAgICAvKlt8LS0tLS0tLXxULS0tfC0tLS1dKi8geyAzLCAxLCAxLCA3LCAxMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLXxULS0tfC0tLV0qLyB7IDMsIDEsIDEsIDgsIDEyLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLXxULS0tfC0tXSovIHsgMywgMSwgMSwgOSwgMTMsIC0xfSwKLSAgICAvKlt8LS0tLS0tLS0tLXxULS0tLXxdKi8geyAyLCAxLCAxLDEwLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLXxULS0tfF0qLyB7IDIsIDEsIDEsMTEsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLXxULS18XSovIHsgMiwgMSwgMSwxMiwgLTEsIC0xfSwKLSAgICAvKlt8LS0tLS0tLS0tLS0tLXxULXxdKi8geyAyLCAxLCAxLDEzLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS0tLXxUfF0qLyB7IDIsIDEsIDEsMTQsIC0xLCAtMX0sCisgICAgLypbfFQtLS18LS0tLS0tLS0tLS0tXSovIHsyLCAwLCAwLCA0LCAtMSwgLTF9LAorICAgIC8qW3wtVC0tLXwtLS0tLS0tLS0tLV0qLyB7MiwgMCwgMCwgNSwgLTEsIC0xfSwKKyAgICAvKlt8LS18VC0tLXwtLS0tLS0tLS1dKi8gezMsIDEsIDEsIDIsIDYsIC0xfSwKKyAgICAvKlt8LS0tfFQtLS18LS0tLS0tLS1dKi8gezMsIDEsIDEsIDMsIDcsIC0xfSwKKyAgICAvKlt8LS0tLXxULS0tfC0tLS0tLS1dKi8gezMsIDEsIDEsIDQsIDgsIC0xfSwKKyAgICAvKlt8LS0tLS18VC0tLXwtLS0tLS1dKi8gezMsIDEsIDEsIDUsIDksIC0xfSwKKyAgICAvKlt8LS0tLS0tfFQtLS18LS0tLS1dKi8gezMsIDEsIDEsIDYsIDEwLCAtMX0sCisgICAgLypbfC0tLS0tLS18VC0tLXwtLS0tXSovIHszLCAxLCAxLCA3LCAxMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLXxULS0tfC0tLV0qLyB7MywgMSwgMSwgOCwgMTIsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tfFQtLS18LS1dKi8gezMsIDEsIDEsIDksIDEzLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLS18VC0tLS18XSovIHsyLCAxLCAxLCAxMCwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS18VC0tLXxdKi8gezIsIDEsIDEsIDExLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tfF0qLyB7MiwgMSwgMSwgMTIsIC0xLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLS0tLS18VC18XSovIHsyLCAxLCAxLCAxMywgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tLS18VHxdKi8gezIsIDEsIDEsIDE0LCAtMSwgLTF9LAogfTsKIAogc3RhdGljIGNvbnN0IGludCBtaW5GcmFtZVRyYW5EaXN0YW5jZSA9IDQ7CiAKLXN0YXRpYyBjb25zdCBGUkVRX1JFUyBmcmVxUmVzX3RhYmxlXzhbXSA9IHtGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywKLSAgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH07CitzdGF0aWMgY29uc3QgRlJFUV9SRVMgZnJlcVJlc190YWJsZV84W10gPSB7CisgICAgRlJFUV9SRVNfTE9XLCAgRlJFUV9SRVNfTE9XLCAgRlJFUV9SRVNfTE9XLCAgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csCisgICAgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH07CiAKIHN0YXRpYyBjb25zdCBGUkVRX1JFUyBmcmVxUmVzX3RhYmxlXzE2WzE2XSA9IHsKICAgICAvKiBzaXplIG9mIGVudmVsb3BlICovCi0vKiAwLTQgKi8gICAgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csCi0vKiA1LTkgKi8gICAgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILAotLyogMTAtMTYgKi8gIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsCi0gICAgICAgICAgICAgRlJFUV9SRVNfSElHSCB9OworICAgIC8qIDAtNCAqLyBGUkVRX1JFU19MT1csCisgICAgRlJFUV9SRVNfTE9XLAorICAgIEZSRVFfUkVTX0xPVywKKyAgICBGUkVRX1JFU19MT1csCisgICAgRlJFUV9SRVNfTE9XLAorICAgIC8qIDUtOSAqLyBGUkVRX1JFU19MT1csCisgICAgRlJFUV9SRVNfSElHSCwKKyAgICBGUkVRX1JFU19ISUdILAorICAgIEZSRVFfUkVTX0hJR0gsCisgICAgRlJFUV9SRVNfSElHSCwKKyAgICAvKiAxMC0xNiAqLyBGUkVRX1JFU19ISUdILAorICAgIEZSRVFfUkVTX0hJR0gsCisgICAgRlJFUV9SRVNfSElHSCwKKyAgICBGUkVRX1JFU19ISUdILAorICAgIEZSRVFfUkVTX0hJR0gsCisgICAgRlJFUV9SRVNfSElHSH07CiAKLXN0YXRpYyB2b2lkIGdlbmVyYXRlRml4Rml4T25seSAoIEhBTkRMRV9TQlJfRlJBTUVfSU5GTyBoU2JyRnJhbWVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5Qb3NJbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBmUmVzVHJhbnNJc0xvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQorc3RhdGljIHZvaWQgZ2VuZXJhdGVGaXhGaXhPbmx5KEhBTkRMRV9TQlJfRlJBTUVfSU5GTyBoU2JyRnJhbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwgaW50IHRyYW5Qb3NJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyVGltZVNsb3RzLCBVQ0hBUiBmUmVzVHJhbnNJc0xvdyk7CiAKIC8qIQogICBGdW5jdGlvbm5hbWU6IEZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IKQEAgLTM1MywyMCArMzI3LDE5IEBACiAKICAgQXJndW1lbnRzOiAgICBoU2JyRW52RnJhbWUgICAgICAgICAgLSBwb2ludGVyIHRvIHNiciBlbnZlbG9wZSBoYW5kbGUKICAgICAgICAgICAgICAgICB2X3ByZV90cmFuc2llbnRfaW5mbyAgLSBwb2ludGVyIHRvIHRyYW5zaWVudCBpbmZvIHZlY3RvcgotICAgICAgICAgICAgICAgIHZfdHJhbnNpZW50X2luZm8gICAgICAtIHBvaW50ZXIgdG8gcHJldmlvdXMgdHJhbnNpZW50IGluZm8gdmVjdG9yCi0gICAgICAgICAgICAgICAgdl90dW5pbmcgICAgICAgICAgICAgIC0gcG9pbnRlciB0byB0dW5pbmcgdmVjdG9yCisgICAgICAgICAgICAgICAgdl90cmFuc2llbnRfaW5mbyAgICAgIC0gcG9pbnRlciB0byBwcmV2aW91cyB0cmFuc2llbnQgaW5mbwordmVjdG9yIHZfdHVuaW5nICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gdHVuaW5nIHZlY3RvcgogCiAgUmV0dXJuOiAgICAgIGZyYW1lX2luZm8gICAgICAgIC0gcG9pbnRlciB0byBTQlJfRlJBTUVfSU5GTyBzdHJ1Y3QKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEhBTkRMRV9TQlJfRlJBTUVfSU5GTwotRkRLc2JyRW5jX2ZyYW1lSW5mb0dlbmVyYXRvciAoSEFORExFX1NCUl9FTlZFTE9QRV9GUkFNRSBoU2JyRW52RnJhbWUsCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X3RyYW5zaWVudF9pbmZvLAotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl90cmFuc2llbnRfaW5mb19wcmUsCi0gICAgICAgICAgICAgICAgICAgIGludCBsZEdyaWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqdl90dW5pbmcpCi17Ci0gIElOVCBudW1FbnYsIHRyYW5Qb3NJbnRlcm5hbD0wLCBibWluPTAsIGJtYXg9MCwgcGFydHMsIGQsIGlfY21vbj0wLCBpX3RyYW49MCwgbkw7CitGREtzYnJFbmNfZnJhbWVJbmZvR2VuZXJhdG9yKEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgaFNickVudkZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl90cmFuc2llbnRfaW5mbywgY29uc3QgSU5UIHJpZ2h0Qm9yZGVyRklYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl90cmFuc2llbnRfaW5mb19wcmUsIGludCBsZEdyaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqdl90dW5pbmcpIHsKKyAgSU5UIG51bUVudiwgdHJhblBvc0ludGVybmFsID0gMCwgYm1pbiA9IDAsIGJtYXggPSAwLCBwYXJ0cywgZCwgaV9jbW9uID0gMCwKKyAgICAgICAgICAgICAgaV90cmFuID0gMCwgbkw7CiAgIElOVCBmbWF4ID0gMDsKIAogICBJTlQgKnZfYm9yZCA9IGhTYnJFbnZGcmFtZS0+dl9ib3JkOwpAQCAtMzc0LDcgKzM0Nyw2IEBACiAgIElOVCAqdl9ib3JkRm9sbG93ID0gaFNickVudkZyYW1lLT52X2JvcmRGb2xsb3c7CiAgIElOVCAqdl9mcmVxRm9sbG93ID0gaFNickVudkZyYW1lLT52X2ZyZXFGb2xsb3c7CiAKLQogICBJTlQgKmxlbmd0aF92X2JvcmRGb2xsb3cgPSAmaFNickVudkZyYW1lLT5sZW5ndGhfdl9ib3JkRm9sbG93OwogICBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3cgPSAmaFNickVudkZyYW1lLT5sZW5ndGhfdl9mcmVxRm9sbG93OwogICBJTlQgKmxlbmd0aF92X2JvcmQgPSAmaFNickVudkZyYW1lLT5sZW5ndGhfdl9ib3JkOwpAQCAtMzg1LDcgKzM1Nyw2IEBACiAgIEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzT2xkID0gJmhTYnJFbnZGcmFtZS0+ZnJhbWVDbGFzc09sZDsKICAgRlJBTUVfQ0xBU1MgZnJhbWVDbGFzcyA9IEZJWEZJWDsKIAotCiAgIElOVCBhbGxvd1NwcmVhZCA9IGhTYnJFbnZGcmFtZS0+YWxsb3dTcHJlYWQ7CiAgIElOVCBudW1FbnZTdGF0aWMgPSBoU2JyRW52RnJhbWUtPm51bUVudlN0YXRpYzsKICAgSU5UIHN0YXRpY0ZyYW1pbmcgPSBoU2JyRW52RnJhbWUtPnN0YXRpY0ZyYW1pbmc7CkBAIC00MDUsMTAgKzM3NiwxMiBAQAogICBoU2JyRW52RnJhbWUtPnZfdHVuaW5nU2VnbSA9IHZfdHVuaW5nU2VnbTsKIAogICBpZiAobGRHcmlkKSB7Ci0gICAgLyogaW4gY2FzZSB0aGVyZSB3YXMgYSB0cmFuc2llbnQgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBwcmV2aW91cyBmcmFtZSwgc3RhcnQgd2l0aCBhIHRyYW5zaWVudCBlbnZlbG9wZSAqLwotICAgIGlmICggIXRyYW5GbGFnICYmIHZfdHJhbnNpZW50X2luZm9fcHJlWzFdICYmIChudW1iZXJUaW1lU2xvdHMgLSB2X3RyYW5zaWVudF9pbmZvX3ByZVswXSA8IG1pbkZyYW1lVHJhbkRpc3RhbmNlKSApeworICAgIC8qIGluIGNhc2UgdGhlcmUgd2FzIGEgdHJhbnNpZW50IGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgcHJldmlvdXMgZnJhbWUsCisgICAgICogc3RhcnQgd2l0aCBhIHRyYW5zaWVudCBlbnZlbG9wZSAqLworICAgIGlmICghdHJhbkZsYWcgJiYgdl90cmFuc2llbnRfaW5mb19wcmVbMV0gJiYKKyAgICAgICAgKG51bWJlclRpbWVTbG90cyAtIHZfdHJhbnNpZW50X2luZm9fcHJlWzBdIDwgbWluRnJhbWVUcmFuRGlzdGFuY2UpKSB7CiAgICAgICB0cmFuRmxhZyA9IDE7Ci0gICAgICB0cmFuUG9zICA9IDA7CisgICAgICB0cmFuUG9zID0gMDsKICAgICB9CiAgIH0KIApAQCAtNDYzLDIwICs0MzYsMjMgQEAKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAgICAgZnJhbWVDbGFzcyA9IEZJWEZJWDsKLSAgICBudW1FbnYgPSBudW1FbnZTdGF0aWM7ICAgICAgLyogezEsMiw0LDh9ICovCi0gICAgKmZyYW1lQ2xhc3NPbGQgPSBGSVhGSVg7ICAgIC8qIGZvciBjaGFuZ2UgdG8gZHluICovCisgICAgbnVtRW52ID0gbnVtRW52U3RhdGljOyAgIC8qIHsxLDIsNCw4fSAqLworICAgICpmcmFtZUNsYXNzT2xkID0gRklYRklYOyAvKiBmb3IgY2hhbmdlIHRvIGR5biAqLwogICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5ic19udW1fZW52ID0gbnVtRW52OwogICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICBDYWxjdWxhdGUgZnJhbWUgY2xhc3MgdG8gdXNlCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBjYWxjRnJhbWVDbGFzcyAoJmZyYW1lQ2xhc3MsIGZyYW1lQ2xhc3NPbGQsIHRyYW5GbGFnLCBzcHJlYWRGbGFnKTsKKyAgICBpZiAocmlnaHRCb3JkZXJGSVgpIHsKKyAgICAgIHRyYW5GbGFnID0gMDsKKyAgICAgICpzcHJlYWRGbGFnID0gMDsKKyAgICB9CisgICAgY2FsY0ZyYW1lQ2xhc3MoJmZyYW1lQ2xhc3MsIGZyYW1lQ2xhc3NPbGQsIHRyYW5GbGFnLCBzcHJlYWRGbGFnKTsKIAogICAgIC8qIHBhdGNoIGZvciBuZXcgZnJhbWUgY2xhc3MgRklYRklYb25seSBmb3IgQUFDIExEICovCiAgICAgaWYgKHRyYW5GbGFnICYmIGxkR3JpZCkgewotICAgICAgZnJhbWVDbGFzcyAgICAgPSBGSVhGSVhvbmx5OworICAgICAgZnJhbWVDbGFzcyA9IEZJWEZJWG9ubHk7CiAgICAgICAqZnJhbWVDbGFzc09sZCA9IEZJWEZJWDsKICAgICB9CiAKQEAgLTQ5NywyMzggKzQ3MywyMjYgQEAKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICBEZXNpZ24gZnJhbWUgKG9yIGZvbGxvdy11cCBvbGQgZGVzaWduKQogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaWYgKHRyYW5GbGFnKSB7ICAgICAgICAgICAgIC8qIEFsd2F5cyBmb3IgRml4VmFyLCBvZnRlbiBidXQgbm90IGFsd2F5cyBmb3IgVmFyVmFyICovCisgICAgaWYgKHRyYW5GbGFnKSB7CisgICAgICAvKiBBbHdheXMgZm9yIEZpeFZhciwgb2Z0ZW4gYnV0IG5vdCBhbHdheXMgZm9yIFZhclZhciAqLworCiAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIERlc2lnbiBwYXJ0IG9mIFQvRi1ncmlkIGFyb3VuZCB0aGUgbmV3IHRyYW5zaWVudAogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgICAgdHJhblBvc0ludGVybmFsID0gZnJhbWVNaWRkbGVTbG90ICsgdHJhblBvcyArIGJ1ZmZlckZyYW1lU3RhcnQgOyAgICAgIC8qIEZIIDAwLTA2LTI2ICovCisgICAgICB0cmFuUG9zSW50ZXJuYWwgPQorICAgICAgICAgIGZyYW1lTWlkZGxlU2xvdCArIHRyYW5Qb3MgKyBidWZmZXJGcmFtZVN0YXJ0OyAvKiBGSCAwMC0wNi0yNiAqLwogICAgICAgLyoKICAgICAgICAgYWRkIG1hbmRhdG9yeSBib3JkZXJzIGFyb3VuZCB0cmFuc2llbnQKICAgICAgICovCiAKLSAgICAgIGZpbGxGcmFtZVRyYW4gKCB2X3R1bmluZ1NlZ20sCi0gICAgICAgICAgICAgICAgICAgICAgdl90dW5pbmdGcmVxLAotICAgICAgICAgICAgICAgICAgICAgIHRyYW5Qb3NJbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICB2X2JvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZCwKLSAgICAgICAgICAgICAgICAgICAgICB2X2ZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICZibWluLAotICAgICAgICAgICAgICAgICAgICAgJmJtYXggKTsKKyAgICAgIGZpbGxGcmFtZVRyYW4odl90dW5pbmdTZWdtLCB2X3R1bmluZ0ZyZXEsIHRyYW5Qb3NJbnRlcm5hbCwgdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsICZibWluLCAmYm1heCk7CiAKICAgICAgIC8qIG1ha2Ugc3VyZSB3ZSBzdGF5IHdpdGhpbiB0aGUgbWF4aW11bSBTQlIgZnJhbWUgb3ZlcmxhcCAqLwogICAgICAgZm1heCA9IGNhbGNGaWxsTGVuZ3RoTWF4KHRyYW5Qb3MsIG51bWJlclRpbWVTbG90cyk7CiAgICAgfQogCiAgICAgc3dpdGNoIChmcmFtZUNsYXNzKSB7CisgICAgICBjYXNlIEZJWEZJWG9ubHk6CisgICAgICAgIEZES19BU1NFUlQobGRHcmlkKTsKKyAgICAgICAgdHJhblBvc0ludGVybmFsID0gdHJhblBvczsKKyAgICAgICAgZ2VuZXJhdGVGaXhGaXhPbmx5KCYoaFNickVudkZyYW1lLT5TYnJGcmFtZUluZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJihoU2JyRW52RnJhbWUtPlNickdyaWQpLCB0cmFuUG9zSW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJUaW1lU2xvdHMsIGhTYnJFbnZGcmFtZS0+ZlJlc1RyYW5zSXNMb3cpOwogCi0gICAgY2FzZSBGSVhGSVhvbmx5OgotICAgICAgRkRLX0FTU0VSVChsZEdyaWQpOwotICAgICAgdHJhblBvc0ludGVybmFsID0gdHJhblBvczsKLSAgICAgIGdlbmVyYXRlRml4Rml4T25seSAoICYoaFNickVudkZyYW1lLT5TYnJGcmFtZUluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJihoU2JyRW52RnJhbWUtPlNickdyaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhblBvc0ludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyVGltZVNsb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVudkZyYW1lLT5mUmVzVHJhbnNJc0xvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuICYoaFNickVudkZyYW1lLT5TYnJGcmFtZUluZm8pOwogCi0gICAgICByZXR1cm4gJihoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbyk7Ci0KLSAgICBjYXNlIEZJWFZBUjoKLQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgRGVzaWduIHJlbWFpbmluZyBwYXJ0cyBvZiBUL0YtZ3JpZCAoYXNzdW1pbmcgbmV4dCBmcmFtZSBpcyBWYXJGaXgpCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIEZpbGwgcmVnaW9uIGJlZm9yZSBuZXcgdHJhbnNpZW50OgotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgIGZpbGxGcmFtZVByZSAoZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsCi0gICAgICAgICAgICAgICAgICAgIGJtaW4sIGJtaW4gLSBidWZmZXJGcmFtZVN0YXJ0KTsgICAgIC8qIEZIIDAwLTA2LTI2ICovCi0KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgRmlsbCByZWdpb24gYWZ0ZXIgbmV3IHRyYW5zaWVudDoKLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICBmaWxsRnJhbWVQb3N0ICgmcGFydHMsICZkLCBkbWF4LCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEsIGJtYXgsIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cywgZm1heCk7Ci0KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgVGFrZSBjYXJlIG9mIHNwZWNpYWwgY2FzZToKLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICBpZiAocGFydHMgPT0gMSAmJiBkIDwgZG1pbikgICAgICAgLyogbm8gZmlsbCwgc2hvcnQgbGFzdCBlbnZlbG9wZSAqLwotICAgICAgICBzcGVjaWFsQ2FzZSAoc3ByZWFkRmxhZywgYWxsb3dTcHJlYWQsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwKLSAgICAgICAgICAgICAgICAgICAgIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgJnBhcnRzLCBkKTsKLQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBDYWxjdWxhdGUgY29tbW9uIGJvcmRlciAoc3BsaXQtcG9pbnQpCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgY2FsY0Ntb25Cb3JkZXIgKCZpX2Ntb24sICZpX3RyYW4sIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdHJhblBvc0ludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cyk7ICAgICAgIC8qIEZIIDAwLTA2LTI2ICovCi0KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgRXh0cmFjdCBkYXRhIGZvciBwcm9wZXIgZm9sbG93LXVwIGluIG5leHQgZnJhbWUKLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICBrZWVwRm9yRm9sbG93VXAgKHZfYm9yZEZvbGxvdywgbGVuZ3RoX3ZfYm9yZEZvbGxvdywgdl9mcmVxRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxRm9sbG93LCBpX3RyYW5Gb2xsb3csIGlfZmlsbEZvbGxvdywKLSAgICAgICAgICAgICAgICAgICAgICAgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGlfY21vbiwgaV90cmFuLCBwYXJ0cywgbnVtYmVyVGltZVNsb3RzKTsgIC8qIEZIIDAwLTA2LTI2ICovCi0KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgQ2FsY3VsYXRlIGNvbnRyb2wgc2lnbmFsCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgY2FsY0N0cmxTaWduYWwgKCZoU2JyRW52RnJhbWUtPlNickdyaWQsIGZyYW1lQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgdl9ib3JkLCAqbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCAqbGVuZ3RoX3ZfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICBpX2Ntb24sIGlfdHJhbiwgKnNwcmVhZEZsYWcsIERDKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVkFSRklYOgotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBGb2xsb3ctdXAgb2xkIHRyYW5zaWVudCAtIGNhbGN1bGF0ZSBjb250cm9sIHNpZ25hbAotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgIGNhbGNDdHJsU2lnbmFsICgmaFNickVudkZyYW1lLT5TYnJHcmlkLCBmcmFtZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgIHZfYm9yZEZvbGxvdywgKmxlbmd0aF92X2JvcmRGb2xsb3csIHZfZnJlcUZvbGxvdywKLSAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywgREMsICppX3RyYW5Gb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgKnNwcmVhZEZsYWcsIERDKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVkFSVkFSOgotICAgICAgaWYgKCpzcHJlYWRGbGFnKSB7ICAgICAgICAvKiBzcHJlYWQgYWNyb3NzIHRocmVlIGZyYW1lcyAqLwotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgRm9sbG93LXVwIG9sZCB0cmFuc2llbnQgLSBjYWxjdWxhdGUgY29udHJvbCBzaWduYWwKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgY2FsY0N0cmxTaWduYWwgKCZoU2JyRW52RnJhbWUtPlNickdyaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNsYXNzLCB2X2JvcmRGb2xsb3csICpsZW5ndGhfdl9ib3JkRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgdl9mcmVxRm9sbG93LCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywgREMsCi0gICAgICAgICAgICAgICAgICAgICAgICAqaV90cmFuRm9sbG93LCAqc3ByZWFkRmxhZywgREMpOwotCi0gICAgICAgICpzcHJlYWRGbGFnID0gMDsKKyAgICAgIGNhc2UgRklYVkFSOgogCiAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICBFeHRyYWN0IGRhdGEgZm9yIHByb3BlciBmb2xsb3ctdXAgaW4gbmV4dCBmcmFtZQorICAgICAgICAgICBEZXNpZ24gcmVtYWluaW5nIHBhcnRzIG9mIFQvRi1ncmlkIChhc3N1bWluZyBuZXh0IGZyYW1lIGlzIFZhckZpeCkKICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgdl9ib3JkRm9sbG93WzBdID0gaFNickVudkZyYW1lLT5TYnJHcmlkLmJzX2Fic19ib3JkXzEgLSBudW1iZXJUaW1lU2xvdHM7IC8qIEZIIDAwLTA2LTI2ICovCi0gICAgICAgIHZfZnJlcUZvbGxvd1swXSA9IDE7Ci0gICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93ID0gMTsKLSAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cgPSAxOwotCi0gICAgICAgICppX3RyYW5Gb2xsb3cgPSAtREM7Ci0gICAgICAgICppX2ZpbGxGb2xsb3cgPSAtREM7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgIERlc2lnbiByZW1haW5pbmcgcGFydHMgb2YgVC9GLWdyaWQgKGFzc3VtaW5nIG5leHQgZnJhbWUgaXMgVmFyRml4KQotICAgICAgICAgIGFkYXB0IG9yIGZpbGwgcmVnaW9uIGJlZm9yZSBuZXcgdHJhbnNpZW50OgotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICBmaWxsRnJhbWVJbnRlciAoJm5MLCB2X3R1bmluZ1NlZ20sIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9ib3JkRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZEZvbGxvdywgdl9mcmVxRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcUZvbGxvdywgKmlfZmlsbEZvbGxvdywgZG1pbiwgZG1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlclRpbWVTbG90cyk7CiAKICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgIEZpbGwgYWZ0ZXIgdHJhbnNpZW50OgorICAgICAgICAgIEZpbGwgcmVnaW9uIGJlZm9yZSBuZXcgdHJhbnNpZW50OgogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICBmaWxsRnJhbWVQb3N0ICgmcGFydHMsICZkLCBkbWF4LCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSwgYm1heCwgYnVmZmVyRnJhbWVTdGFydCwgbnVtYmVyVGltZVNsb3RzLCBmbWF4KTsKKyAgICAgICAgZmlsbEZyYW1lUHJlKGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCBibWluLAorICAgICAgICAgICAgICAgICAgICAgYm1pbiAtIGJ1ZmZlckZyYW1lU3RhcnQpOyAvKiBGSCAwMC0wNi0yNiAqLworCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBGaWxsIHJlZ2lvbiBhZnRlciBuZXcgdHJhbnNpZW50OgorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICBmaWxsRnJhbWVQb3N0KCZwYXJ0cywgJmQsIGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEsIGJtYXgsIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICBmbWF4KTsKIAogICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgVGFrZSBjYXJlIG9mIHNwZWNpYWwgY2FzZToKICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgaWYgKHBhcnRzID09IDEgJiYgZCA8IGRtaW4pICAgICAvKiUgbm8gZmlsbCwgc2hvcnQgbGFzdCBlbnZlbG9wZSAqLwotICAgICAgICAgIHNwZWNpYWxDYXNlIChzcHJlYWRGbGFnLCBhbGxvd1NwcmVhZCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLAotICAgICAgICAgICAgICAgICAgICAgICB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsICZwYXJ0cywgZCk7CisgICAgICAgIGlmIChwYXJ0cyA9PSAxICYmIGQgPCBkbWluKSAvKiBubyBmaWxsLCBzaG9ydCBsYXN0IGVudmVsb3BlICovCisgICAgICAgICAgc3BlY2lhbENhc2Uoc3ByZWFkRmxhZywgYWxsb3dTcHJlYWQsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEsICZwYXJ0cywgZCk7CiAKICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgIENhbGN1bGF0ZSBjb21tb24gYm9yZGVyIChzcGxpdC1wb2ludCkKICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgY2FsY0Ntb25Cb3JkZXIgKCZpX2Ntb24sICZpX3RyYW4sIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdHJhblBvc0ludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVTdGFydCwgbnVtYmVyVGltZVNsb3RzKTsKKyAgICAgICAgY2FsY0Ntb25Cb3JkZXIoJmlfY21vbiwgJmlfdHJhbiwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB0cmFuUG9zSW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cyk7IC8qIEZIIDAwLTA2LTI2ICovCiAKICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgIEV4dHJhY3QgZGF0YSBmb3IgcHJvcGVyIGZvbGxvdy11cCBpbiBuZXh0IGZyYW1lCiAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIGtlZXBGb3JGb2xsb3dVcCAodl9ib3JkRm9sbG93LCBsZW5ndGhfdl9ib3JkRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgIHZfZnJlcUZvbGxvdywgbGVuZ3RoX3ZfZnJlcUZvbGxvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpX3RyYW5Gb2xsb3csIGlfZmlsbEZvbGxvdywgdl9ib3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwgaV9jbW9uLCBpX3RyYW4sIHBhcnRzLCBudW1iZXJUaW1lU2xvdHMpOworICAgICAgICBrZWVwRm9yRm9sbG93VXAodl9ib3JkRm9sbG93LCBsZW5ndGhfdl9ib3JkRm9sbG93LCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxRm9sbG93LCBpX3RyYW5Gb2xsb3csIGlfZmlsbEZvbGxvdywgdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBpX2Ntb24sIGlfdHJhbiwgcGFydHMsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJUaW1lU2xvdHMpOyAvKiBGSCAwMC0wNi0yNiAqLwogCiAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICBDYWxjdWxhdGUgY29udHJvbCBzaWduYWwKICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgY2FsY0N0cmxTaWduYWwgKCZoU2JyRW52RnJhbWUtPlNickdyaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNsYXNzLCB2X2JvcmQsICpsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcSwgaV9jbW9uLCBpX3RyYW4sIDAsIG5MKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRklYRklYOgotICAgICAgaWYgKHRyYW5Qb3MgPT0gMCkKLSAgICAgICAgbnVtRW52ID0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgbnVtRW52ID0gMjsKKyAgICAgICAgY2FsY0N0cmxTaWduYWwoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwgZnJhbWVDbGFzcywgdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCAqbGVuZ3RoX3ZfZnJlcSwgaV9jbW9uLCBpX3RyYW4sCisgICAgICAgICAgICAgICAgICAgICAgICpzcHJlYWRGbGFnLCBEQyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWQVJGSVg6CisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBGb2xsb3ctdXAgb2xkIHRyYW5zaWVudCAtIGNhbGN1bGF0ZSBjb250cm9sIHNpZ25hbAorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICBjYWxjQ3RybFNpZ25hbCgmaFNickVudkZyYW1lLT5TYnJHcmlkLCBmcmFtZUNsYXNzLCB2X2JvcmRGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93LCB2X2ZyZXFGb2xsb3csICpsZW5ndGhfdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICBEQywgKmlfdHJhbkZvbGxvdywgKnNwcmVhZEZsYWcsIERDKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFZBUlZBUjoKKyAgICAgICAgaWYgKCpzcHJlYWRGbGFnKSB7IC8qIHNwcmVhZCBhY3Jvc3MgdGhyZWUgZnJhbWVzICovCisgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgRm9sbG93LXVwIG9sZCB0cmFuc2llbnQgLSBjYWxjdWxhdGUgY29udHJvbCBzaWduYWwKKyAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICAgIGNhbGNDdHJsU2lnbmFsKCZoU2JyRW52RnJhbWUtPlNickdyaWQsIGZyYW1lQ2xhc3MsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywgdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93LCBEQywgKmlfdHJhbkZvbGxvdywgKnNwcmVhZEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgREMpOwogCi0gICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuYnNfbnVtX2VudiA9IG51bUVudjsKLSAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKKyAgICAgICAgICAqc3ByZWFkRmxhZyA9IDA7CiAKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBGREtfQVNTRVJUKDApOworICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEV4dHJhY3QgZGF0YSBmb3IgcHJvcGVyIGZvbGxvdy11cCBpbiBuZXh0IGZyYW1lCisgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgICB2X2JvcmRGb2xsb3dbMF0gPSBoU2JyRW52RnJhbWUtPlNickdyaWQuYnNfYWJzX2JvcmRfMSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyVGltZVNsb3RzOyAvKiBGSCAwMC0wNi0yNiAqLworICAgICAgICAgIHZfZnJlcUZvbGxvd1swXSA9IDE7CisgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgPSAxOworICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93ID0gMTsKKworICAgICAgICAgICppX3RyYW5Gb2xsb3cgPSAtREM7CisgICAgICAgICAgKmlfZmlsbEZvbGxvdyA9IC1EQzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBEZXNpZ24gcmVtYWluaW5nIHBhcnRzIG9mIFQvRi1ncmlkIChhc3N1bWluZyBuZXh0IGZyYW1lIGlzIFZhckZpeCkKKyAgICAgICAgICAgIGFkYXB0IG9yIGZpbGwgcmVnaW9uIGJlZm9yZSBuZXcgdHJhbnNpZW50OgorICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgICAgZmlsbEZyYW1lSW50ZXIoJm5MLCB2X3R1bmluZ1NlZ20sIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm1pbiwgdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEsIHZfYm9yZEZvbGxvdywgbGVuZ3RoX3ZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2X2ZyZXFGb2xsb3csIGxlbmd0aF92X2ZyZXFGb2xsb3csICppX2ZpbGxGb2xsb3csIGRtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgZG1heCwgbnVtYmVyVGltZVNsb3RzKTsKKworICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEZpbGwgYWZ0ZXIgdHJhbnNpZW50OgorICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgICAgZmlsbEZyYW1lUG9zdCgmcGFydHMsICZkLCBkbWF4LCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEsIGJtYXgsIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZtYXgpOworCisgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgVGFrZSBjYXJlIG9mIHNwZWNpYWwgY2FzZToKKyAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICAgIGlmIChwYXJ0cyA9PSAxICYmIGQgPCBkbWluKSAvKiUgbm8gZmlsbCwgc2hvcnQgbGFzdCBlbnZlbG9wZSAqLworICAgICAgICAgICAgc3BlY2lhbENhc2Uoc3ByZWFkRmxhZywgYWxsb3dTcHJlYWQsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSwgJnBhcnRzLCBkKTsKKworICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIENhbGN1bGF0ZSBjb21tb24gYm9yZGVyIChzcGxpdC1wb2ludCkKKyAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICAgIGNhbGNDbW9uQm9yZGVyKCZpX2Ntb24sICZpX3RyYW4sIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuUG9zSW50ZXJuYWwsIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cyk7CisKKyAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBFeHRyYWN0IGRhdGEgZm9yIHByb3BlciBmb2xsb3ctdXAgaW4gbmV4dCBmcmFtZQorICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgICAga2VlcEZvckZvbGxvd1VwKHZfYm9yZEZvbGxvdywgbGVuZ3RoX3ZfYm9yZEZvbGxvdywgdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxRm9sbG93LCBpX3RyYW5Gb2xsb3csIGlfZmlsbEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGlfY21vbiwgaV90cmFuLCBwYXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyVGltZVNsb3RzKTsKKworICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIENhbGN1bGF0ZSBjb250cm9sIHNpZ25hbAorICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgICAgY2FsY0N0cmxTaWduYWwoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwgZnJhbWVDbGFzcywgdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsICpsZW5ndGhfdl9mcmVxLCBpX2Ntb24sIGlfdHJhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCBuTCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZJWEZJWDoKKyAgICAgICAgaWYgKHRyYW5Qb3MgPT0gMCkKKyAgICAgICAgICBudW1FbnYgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgbnVtRW52ID0gMjsKKworICAgICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuYnNfbnVtX2VudiA9IG51bUVudjsKKyAgICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOworCisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRkRLX0FTU0VSVCgwKTsKICAgICB9CiAgIH0KIAogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBDb252ZXJ0IGNvbnRyb2wgc2lnbmFsIHRvIGZyYW1lIGluZm8gc3RydWN0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIGN0cmxTaWduYWwyRnJhbWVJbmZvICgmaFNickVudkZyYW1lLT5TYnJHcmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbnZGcmFtZS0+U2JyRnJhbWVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbnZGcmFtZS0+ZnJlcV9yZXNfZml4Zml4KTsKKyAgY3RybFNpZ25hbDJGcmFtZUluZm8oJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwgJmhTYnJFbnZGcmFtZS0+U2JyRnJhbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW52RnJhbWUtPmZyZXFfcmVzX2ZpeGZpeCk7CiAKICAgcmV0dXJuICZoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbzsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCi0gIFxicmllZiAgICBHbmVyYXRlcyBmcmFtZSBpbmZvIGZvciBGSVhGSVhvbmx5IGZyYW1lIGNsYXNzIHVzZWQgZm9yIGxvdyBkZWxheSB2ZXJzaW9uCisgIFxicmllZiAgICBHbmVyYXRlcyBmcmFtZSBpbmZvIGZvciBGSVhGSVhvbmx5IGZyYW1lIGNsYXNzIHVzZWQgZm9yIGxvdyBkZWxheQorIHZlcnNpb24KIAogICBccmV0dXJuICAgbm90aGluZwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnZW5lcmF0ZUZpeEZpeE9ubHkgKCBIQU5ETEVfU0JSX0ZSQU1FX0lORk8gaFNickZyYW1lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuUG9zSW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyVGltZVNsb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgZlJlc1RyYW5zSXNMb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIGludCBuRW52LCBpLCBrPTAsIHRyYW5JZHg7CitzdGF0aWMgdm9pZCBnZW5lcmF0ZUZpeEZpeE9ubHkoSEFORExFX1NCUl9GUkFNRV9JTkZPIGhTYnJGcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLCBpbnQgdHJhblBvc0ludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMsIFVDSEFSIGZSZXNUcmFuc0lzTG93KSB7CisgIGludCBuRW52LCBpLCBrID0gMCwgdHJhbklkeDsKICAgY29uc3QgaW50ICpwVGFibGUgPSBOVUxMOwogICBjb25zdCBGUkVRX1JFUyAqZnJlcVJlc1RhYmxlID0gTlVMTDsKIAogICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykgewotICAgICAgY2FzZSA4OgotICAgICAgICAgIHBUYWJsZSA9IGVudmVsb3BlVGFibGVfOFt0cmFuUG9zSW50ZXJuYWxdOwotICAgICAgICAgIGZyZXFSZXNUYWJsZSA9IGZyZXFSZXNfdGFibGVfODsKLSAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgcFRhYmxlID0gZW52ZWxvcGVUYWJsZV8xNVt0cmFuUG9zSW50ZXJuYWxdOwotICAgICAgICAgIGZyZXFSZXNUYWJsZSA9IGZyZXFSZXNfdGFibGVfMTY7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE2OgotICAgICAgICAgIHBUYWJsZSA9IGVudmVsb3BlVGFibGVfMTZbdHJhblBvc0ludGVybmFsXTsKLSAgICAgICAgICBmcmVxUmVzVGFibGUgPSBmcmVxUmVzX3RhYmxlXzE2OwotICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgODogeworICAgICAgcFRhYmxlID0gZW52ZWxvcGVUYWJsZV84W3RyYW5Qb3NJbnRlcm5hbF07CisgICAgfQorICAgICAgZnJlcVJlc1RhYmxlID0gZnJlcVJlc190YWJsZV84OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNToKKyAgICAgIHBUYWJsZSA9IGVudmVsb3BlVGFibGVfMTVbdHJhblBvc0ludGVybmFsXTsKKyAgICAgIGZyZXFSZXNUYWJsZSA9IGZyZXFSZXNfdGFibGVfMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgcFRhYmxlID0gZW52ZWxvcGVUYWJsZV8xNlt0cmFuUG9zSW50ZXJuYWxdOworICAgICAgZnJlcVJlc1RhYmxlID0gZnJlcVJlc190YWJsZV8xNjsKKyAgICAgIGJyZWFrOwogICB9CiAKICAgLyogbG9vayBudW1iZXIgb2YgZW52b2xwZXMgaW4gdGFibGUgKi8KICAgbkVudiA9IHBUYWJsZVswXTsKICAgLyogbG9vayB1cCBlbnZvbHBlIGRpc3RyaWJ1dGlvbiBpbiB0YWJsZSAqLwotICBmb3IgKGk9MTsgaTxuRW52OyBpKyspCi0gICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IHBUYWJsZVtpKzJdOworICBmb3IgKGkgPSAxOyBpIDwgbkVudjsgaSsrKSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gcFRhYmxlW2kgKyAyXTsKIAogICAvKiBvcGVuIGFuZCBjbG9zZSBmcmFtZSBib3JkZXIgKi8KLSAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSAgICA9IDA7CisgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSAwOwogICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gbnVtYmVyVGltZVNsb3RzOwogCiAgIC8qIGFkanVzdCBzZWdtZW50LWZyZXF1ZW5jeS1yZXNvbHV0aW9uIGFjY29yZGluZyB0byB0aGUgc2VnbWVudC1sZW5ndGggKi8KLSAgZm9yIChpPTA7IGk8bkVudjsgaSsrKXsKLSAgICBrID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpKzFdIC0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXTsKKyAgZm9yIChpID0gMDsgaSA8IG5FbnY7IGkrKykgeworICAgIGsgPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2kgKyAxXSAtIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV07CiAgICAgaWYgKCFmUmVzVHJhbnNJc0xvdykKICAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNbaV0gPSBmcmVxUmVzVGFibGVba107CiAgICAgZWxzZQpAQCAtNzM4LDI0ICs3MDIsMjIgQEAKICAgfQogCiAgIGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSBuRW52OwotICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiAgID0gcFRhYmxlWzJdOworICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IHBUYWJsZVsyXTsKICAgLyogdHJhbnNpZW50IGlkeCAqLwogICB0cmFuSWR4ID0gcFRhYmxlWzFdOwogCiAgIC8qIGFkZCBub2lzZSBmbG9vcnMgKi8KICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gMDsKLSAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1t0cmFuSWR4P3RyYW5JZHg6MV07CisgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9CisgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW3RyYW5JZHggPyB0cmFuSWR4IDogMV07CiAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsyXSA9IG51bWJlclRpbWVTbG90czsKICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMjsKIAogICBoU2JyR3JpZC0+ZnJhbWVDbGFzcyA9IEZJWEZJWG9ubHk7CiAgIGhTYnJHcmlkLT5ic19hYnNfYm9yZCA9IHRyYW5Qb3NJbnRlcm5hbDsKICAgaFNickdyaWQtPmJzX251bV9lbnYgPSBuRW52OwotCiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19pbml0RnJhbWVJbmZvR2VuZXJhdG9yCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNzcwLDIxICs3MzIsMTQgQEAKICBSZXR1cm46ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX2luaXRGcmFtZUluZm9HZW5lcmF0b3IgKAotICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVkVMT1BFX0ZSQU1FIGhTYnJFbnZGcmFtZSwKLSAgICAgICAgICAgICAgSU5UICAgICAgIGFsbG93U3ByZWFkLAotICAgICAgICAgICAgICBJTlQgICAgICAgbnVtRW52U3RhdGljLAotICAgICAgICAgICAgICBJTlQgICAgICAgc3RhdGljRnJhbWluZywKLSAgICAgICAgICAgICAgSU5UICAgICAgIHRpbWVTbG90cywKLSAgICAgICAgY29uc3QgRlJFUV9SRVMqIGZyZXFfcmVzX2ZpeGZpeAotICAgICAgICAgICAgICxVQ0hBUiAgICAgZlJlc1RyYW5zSXNMb3csCi0gICAgICAgICAgICAgIElOVCAgICAgICBsZEdyaWQKLSAgICAgICAgKQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGSCAwMC0wNi0yNiAqLwordm9pZCBGREtzYnJFbmNfaW5pdEZyYW1lSW5mb0dlbmVyYXRvcihIQU5ETEVfU0JSX0VOVkVMT1BFX0ZSQU1FIGhTYnJFbnZGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFsbG93U3ByZWFkLCBJTlQgbnVtRW52U3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhdGljRnJhbWluZywgSU5UIHRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlJFUV9SRVMgKmZyZXFfcmVzX2ZpeGZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgZlJlc1RyYW5zSXNMb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZEdyaWQpIHsgLyogRkggMDAtMDYtMjYgKi8KIAotICBGREttZW1jbGVhcihoU2JyRW52RnJhbWUsc2l6ZW9mKFNCUl9FTlZFTE9QRV9GUkFNRSApKTsKLQorICBGREttZW1jbGVhcihoU2JyRW52RnJhbWUsIHNpemVvZihTQlJfRU5WRUxPUEVfRlJBTUUpKTsKIAogICAvKiBJbml0aWFsaXNhdGlvbiAqLwogICBoU2JyRW52RnJhbWUtPmZyYW1lQ2xhc3NPbGQgPSBGSVhGSVg7CkBAIC03OTUsNyArNzUwLDcgQEAKICAgaFNickVudkZyYW1lLT5zdGF0aWNGcmFtaW5nID0gc3RhdGljRnJhbWluZzsKICAgaFNickVudkZyYW1lLT5mcmVxX3Jlc19maXhmaXhbMF0gPSBmcmVxX3Jlc19maXhmaXhbMF07CiAgIGhTYnJFbnZGcmFtZS0+ZnJlcV9yZXNfZml4Zml4WzFdID0gZnJlcV9yZXNfZml4Zml4WzFdOwotICBoU2JyRW52RnJhbWUtPmZSZXNUcmFuc0lzTG93ICAgICA9IGZSZXNUcmFuc0lzTG93OworICBoU2JyRW52RnJhbWUtPmZSZXNUcmFuc0lzTG93ID0gZlJlc1RyYW5zSXNMb3c7CiAKICAgaFNickVudkZyYW1lLT5sZW5ndGhfdl9ib3JkID0gMDsKICAgaFNickVudkZyYW1lLT5sZW5ndGhfdl9ib3JkRm9sbG93ID0gMDsKQEAgLTgxMCw0MyArNzY1LDQxIEBACiAKICAgaWYgKGxkR3JpZCkgewogICAgIC8qY2FzZSBDT0RFQ19BQUNMRDoqLwotICAgICAgaFNickVudkZyYW1lLT5kbWluID0gMjsKLSAgICAgIGhTYnJFbnZGcmFtZS0+ZG1heCA9IDE2OwotICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF81MTJMRDsKLSAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKKyAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSAyOworICAgIGhTYnJFbnZGcmFtZS0+ZG1heCA9IDE2OworICAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90ID0gRlJBTUVfTUlERExFX1NMT1RfNTEyTEQ7CisgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOwogICB9IGVsc2UKLSAgc3dpdGNoKHRpbWVTbG90cyl7Ci0gICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgotICAgICAgaFNickVudkZyYW1lLT5kbWluID0gNDsKLSAgICAgIGhTYnJFbnZGcmFtZS0+ZG1heCA9IDEyOwotICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOwotICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF8xOTIwOwotICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKLSAgICAgIGhTYnJFbnZGcmFtZS0+ZG1pbiA9IDQ7Ci0gICAgICBoU2JyRW52RnJhbWUtPmRtYXggPSAxMjsKLSAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKLSAgICAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90ID0gRlJBTUVfTUlERExFX1NMT1RfMjA0ODsKLSAgICBicmVhazsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6Ci0gICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSAyOwotICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gODsKLSAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKLSAgICAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90ID0gRlJBTUVfTUlERExFX1NMT1RfMTE1MjsKLSAgICBicmVhazsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQ6Ci0gICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSA0OwotICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTU7Ci0gICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuYnVmZmVyRnJhbWVTdGFydCA9IDA7Ci0gICAgICBoU2JyRW52RnJhbWUtPmZyYW1lTWlkZGxlU2xvdCA9IEZSQU1FX01JRERMRV9TTE9UXzIzMDQ7Ci0gICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEZES19BU1NFUlQoMCk7Ci0gIH0KLQorICAgIHN3aXRjaCAodGltZVNsb3RzKSB7CisgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6CisgICAgICAgIGhTYnJFbnZGcmFtZS0+ZG1pbiA9IDQ7CisgICAgICAgIGhTYnJFbnZGcmFtZS0+ZG1heCA9IDEyOworICAgICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuYnVmZmVyRnJhbWVTdGFydCA9IDA7CisgICAgICAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90ID0gRlJBTUVfTUlERExFX1NMT1RfMTkyMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6CisgICAgICAgIGhTYnJFbnZGcmFtZS0+ZG1pbiA9IDQ7CisgICAgICAgIGhTYnJFbnZGcmFtZS0+ZG1heCA9IDEyOworICAgICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuYnVmZmVyRnJhbWVTdGFydCA9IDA7CisgICAgICAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90ID0gRlJBTUVfTUlERExFX1NMT1RfMjA0ODsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CisgICAgICAgIGhTYnJFbnZGcmFtZS0+ZG1pbiA9IDI7CisgICAgICAgIGhTYnJFbnZGcmFtZS0+ZG1heCA9IDg7CisgICAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKKyAgICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF8xMTUyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNDoKKyAgICAgICAgaFNickVudkZyYW1lLT5kbWluID0gNDsKKyAgICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTU7CisgICAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKKyAgICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF8yMzA0OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgZmlsbEZyYW1lVHJhbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg3MCwxOCArODIzLDE3IEBACiAgUmV0dXJuOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1maWxsRnJhbWVUcmFuIChjb25zdCBpbnQgKnZfdHVuaW5nU2VnbSwgICAgICAvKiE8IHR1bmluZzogZGVzaXJlZCBzZWdtZW50IGxlbmd0aHMgKi8KLSAgICAgICAgICAgICAgIGNvbnN0IGludCAqdl90dW5pbmdGcmVxLCAgICAgIC8qITwgdHVuaW5nOiBkZXNpcmVkIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLwotICAgICAgICAgICAgICAgaW50IHRyYW4sICAgICAgICAgICAgICAgICAgICAgLyohPCBpbnB1dCA6IHBvc2l0aW9uIG9mIHRyYW5zaWVudCAqLwotICAgICAgICAgICAgICAgaW50ICp2X2JvcmQsICAgICAgICAgICAgICAgICAgLyohPCBtZW1OZXc6IGJvcmRlcnMgKi8KLSAgICAgICAgICAgICAgIGludCAqbGVuZ3RoX3ZfYm9yZCwgICAgICAgICAgIC8qITwgbWVtTmV3OiAjIGJvcmRlcnMgKi8KLSAgICAgICAgICAgICAgIGludCAqdl9mcmVxLCAgICAgICAgICAgICAgICAgIC8qITwgbWVtTmV3OiBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KLSAgICAgICAgICAgICAgIGludCAqbGVuZ3RoX3ZfZnJlcSwgICAgICAgICAgIC8qITwgbWVtTmV3OiAjIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLwotICAgICAgICAgICAgICAgaW50ICpibWluLCAgICAgICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGZpcnN0IG1hbmRhdG9yeSBib3JkZXIgKi8KLSAgICAgICAgICAgICAgIGludCAqYm1heCAgICAgICAgICAgICAgICAgICAgIC8qITwgaGxwTmV3OiBsYXN0ICBtYW5kYXRvcnkgYm9yZGVyICovCi0gICAgICAgICAgICAgICApCi17CitzdGF0aWMgdm9pZCBmaWxsRnJhbWVUcmFuKAorICAgIGNvbnN0IGludCAqdl90dW5pbmdTZWdtLCAvKiE8IHR1bmluZzogZGVzaXJlZCBzZWdtZW50IGxlbmd0aHMgKi8KKyAgICBjb25zdCBpbnQgKnZfdHVuaW5nRnJlcSwgLyohPCB0dW5pbmc6IGRlc2lyZWQgZnJlcXVlbmN5IHJlc29sdXRpb25zICovCisgICAgaW50IHRyYW4sICAgICAgICAgICAgICAgIC8qITwgaW5wdXQgOiBwb3NpdGlvbiBvZiB0cmFuc2llbnQgKi8KKyAgICBpbnQgKnZfYm9yZCwgICAgICAgICAgICAgLyohPCBtZW1OZXc6IGJvcmRlcnMgKi8KKyAgICBpbnQgKmxlbmd0aF92X2JvcmQsICAgICAgLyohPCBtZW1OZXc6ICMgYm9yZGVycyAqLworICAgIGludCAqdl9mcmVxLCAgICAgICAgICAgICAvKiE8IG1lbU5ldzogZnJlcXVlbmN5IHJlc29sdXRpb25zICovCisgICAgaW50ICpsZW5ndGhfdl9mcmVxLCAgICAgIC8qITwgbWVtTmV3OiAjIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLworICAgIGludCAqYm1pbiwgICAgICAgICAgICAgICAvKiE8IGhscE5ldzogZmlyc3QgbWFuZGF0b3J5IGJvcmRlciAqLworICAgIGludCAqYm1heCAgICAgICAgICAgICAgICAvKiE8IGhscE5ldzogbGFzdCAgbWFuZGF0b3J5IGJvcmRlciAqLworKSB7CiAgIGludCBib3JkLCBpOwogCiAgICpsZW5ndGhfdl9ib3JkID0gMDsKQEAgLTg5MCwyNSArODQyLDI1IEBACiAgIC8qIGFkZCBhdHRhY2sgZW52IGxlYWRpbmcgYm9yZGVyIChvcHRpb25hbCkgKi8KICAgaWYgKHZfdHVuaW5nU2VnbVswXSkgewogICAgIC8qIHZfYm9yZCA9IFsoQmEpXSBzdGFydCBvZiBhdHRhY2sgZW52ICovCi0gICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsICh0cmFuIC0gdl90dW5pbmdTZWdtWzBdKSk7CisgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgKHRyYW4gLSB2X3R1bmluZ1NlZ21bMF0pKTsKIAogICAgIC8qIHZfZnJlcSA9IFsoRmEpXSByZXMgb2YgYXR0YWNrIGVudiAqLwotICAgIEZES3NickVuY19BZGRSaWdodCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X3R1bmluZ0ZyZXFbMF0pOworICAgIEZES3NickVuY19BZGRSaWdodCh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfdHVuaW5nRnJlcVswXSk7CiAgIH0KIAogICAvKiBhZGQgYXR0YWNrIGVudiB0cmFpbGluZyBib3JkZXIvZmlyc3QgZGVjYXkgZW52IGxlYWRpbmcgYm9yZGVyICovCiAgIGJvcmQgPSB0cmFuOwotICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdHJhbik7ICAgLyogdl9ib3JkID0gWyhCYSksQmQxXSAqLworICBGREtzYnJFbmNfQWRkUmlnaHQodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB0cmFuKTsgLyogdl9ib3JkID0gWyhCYSksQmQxXSAqLwogCiAgIC8qIGFkZCBmaXJzdCBkZWNheSBlbnYgdHJhaWxpbmcgYm9yZGVyLzI6bmQgZGVjYXkgZW52IGxlYWRpbmcgYm9yZGVyICovCiAgIGlmICh2X3R1bmluZ1NlZ21bMV0pIHsKICAgICBib3JkICs9IHZfdHVuaW5nU2VnbVsxXTsKIAogICAgIC8qIHZfYm9yZCA9IFsoQmEpLEJkMSxCZDJdICovCi0gICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIGJvcmQpOworICAgIEZES3NickVuY19BZGRSaWdodCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIGJvcmQpOwogCiAgICAgLyogdl9mcmVxID0gWyhGYSksRmQxXSAqLwotICAgIEZES3NickVuY19BZGRSaWdodCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X3R1bmluZ0ZyZXFbMV0pOworICAgIEZES3NickVuY19BZGRSaWdodCh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfdHVuaW5nRnJlcVsxXSk7CiAgIH0KIAogICAvKiBhZGQgMjpuZCBkZWNheSBlbnYgdHJhaWxpbmcgYm9yZGVyIChvcHRpb25hbCkgKi8KQEAgLTkxNiwzMSArODY4LDI1IEBACiAgICAgYm9yZCArPSB2X3R1bmluZ1NlZ21bMl07CiAKICAgICAvKiB2X2JvcmQgPSBbKEJhKSxCZDEsIEJkMiwoQmQzKV0gKi8KLSAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CisgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CiAKICAgICAvKiB2X2ZyZXEgPSBbKEZhKSxGZDEsKEZkMildICovCi0gICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfdHVuaW5nRnJlcVsyXSk7CisgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl90dW5pbmdGcmVxWzJdKTsKICAgfQogCiAgIC8qICB2X2ZyZXEgPSBbKEZhKSxGZDEsKEZkMiksMV0gKi8KLSAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOwotCisgIEZES3NickVuY19BZGRSaWdodCh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOwogCiAgIC8qICBjYWxjIG1pbiBhbmQgbWF4IHZhbHVlcyBvZiBtYW5kYXRvcnkgYm9yZGVycyAqLwogICAqYm1pbiA9IHZfYm9yZFswXTsKICAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9ib3JkOyBpKyspCi0gICAgaWYgKHZfYm9yZFtpXSA8ICpibWluKQotICAgICAgKmJtaW4gPSB2X2JvcmRbaV07CisgICAgaWYgKHZfYm9yZFtpXSA8ICpibWluKSAqYm1pbiA9IHZfYm9yZFtpXTsKIAogICAqYm1heCA9IHZfYm9yZFswXTsKICAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9ib3JkOyBpKyspCi0gICAgaWYgKHZfYm9yZFtpXSA+ICpibWF4KQotICAgICAgKmJtYXggPSB2X2JvcmRbaV07Ci0KKyAgICBpZiAodl9ib3JkW2ldID4gKmJtYXgpICpibWF4ID0gdl9ib3JkW2ldOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBmaWxsRnJhbWVQcmUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC05NjEsMTIgKzkwNyw4IEBACiAgUmV0dXJuOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1maWxsRnJhbWVQcmUgKElOVCBkbWF4LAotICAgICAgICAgICAgICBJTlQgKnZfYm9yZCwgSU5UICpsZW5ndGhfdl9ib3JkLAotICAgICAgICAgICAgICBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLAotICAgICAgICAgICAgICBJTlQgYm1pbiwgSU5UIHJlc3QpCi17CitzdGF0aWMgdm9pZCBmaWxsRnJhbWVQcmUoSU5UIGRtYXgsIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UIGJtaW4sIElOVCByZXN0KSB7CiAgIC8qCiAgICAgaW5wdXQgc3RhdGU6CiAgICAgdl9ib3JkID0gWyhCYSksQmQxLCBCZDIgLChCZDMpXQpAQCAtOTkwLDggKzkzMiw4IEBACiAgICAgcGFydHMrKzsKIAogICAgIHNlZ20gPSByZXN0IC8gcGFydHM7Ci0gICAgUyA9IChzZWdtIC0gMik+PjE7Ci0gICAgcyA9IGZpeE1pbiAoOCwgMiAqIFMgKyAyKTsKKyAgICBTID0gKHNlZ20gLSAyKSA+PiAxOworICAgIHMgPSBmaXhNaW4oOCwgMiAqIFMgKyAyKTsKICAgICBkID0gcmVzdCAtIChwYXJ0cyAtIDEpICogczsKICAgfQogCkBAIC0xMDA1LDEwICs5NDcsMTAgQEAKICAgICBib3JkID0gYm9yZCAtIHM7CiAKICAgICAvKiB2X2JvcmQgPSBbLi4uLChCZiksKEJhKSxCZDEsIEJkMiAsKEJkMyldICovCi0gICAgRkRLc2JyRW5jX0FkZExlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CisgICAgRkRLc2JyRW5jX0FkZExlZnQodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCBib3JkKTsKIAogICAgIC8qIHZfZnJlcSA9IFsuLi4sKDEgKSwoRmEpLEZkMSwoRmQyKSwgMSAgIF0gKi8KLSAgICBGREtzYnJFbmNfQWRkTGVmdCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAxKTsKKyAgICBGREtzYnJFbmNfQWRkTGVmdCh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOwogICB9CiB9CiAKQEAgLTEwMjIsMzkgKzk2NCwzNyBAQAogICBccmV0dXJuIHZvaWQKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLWNhbGNGaWxsTGVuZ3RoTWF4IChpbnQgdHJhblBvcywgICAgICAgICAgLyohPCBpbnB1dCA6IHRyYW5zaWVudCBwb3NpdGlvbiAocmVmOiB0cmFuIGRldCkgKi8KLSAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyVGltZVNsb3RzICAgLyohPCBpbnB1dCA6IG51bWJlciBvZiB0aW1lc2xvdHMgKi8KLSAgICAgICAgICAgICAgICAgICApCi17CitzdGF0aWMgaW50IGNhbGNGaWxsTGVuZ3RoTWF4KAorICAgIGludCB0cmFuUG9zLCAgICAgICAgLyohPCBpbnB1dCA6IHRyYW5zaWVudCBwb3NpdGlvbiAocmVmOiB0cmFuIGRldCkgKi8KKyAgICBpbnQgbnVtYmVyVGltZVNsb3RzIC8qITwgaW5wdXQgOiBudW1iZXIgb2YgdGltZXNsb3RzICovCispIHsKICAgaW50IGZtYXg7CiAKICAgLyoKICAgICBjYWxjdWxhdGUgdHJhbnNpZW50IHBvc2l0aW9uIHdpdGhpbiBlbnZlbG9wZSBidWZmZXIKICAgKi8KLSAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpCi0gIHsKKyAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6Ci0gICAgICAgIGlmICh0cmFuUG9zIDwgNCkKLSAgICAgICAgICBmbWF4ID0gNjsKLSAgICAgICAgZWxzZSBpZiAodHJhblBvcyA9PSA0IHx8IHRyYW5Qb3MgPT0gNSkKLSAgICAgICAgICBmbWF4ID0gNDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGZtYXggPSA4OwotICAgICAgICBicmVhazsKKyAgICAgIGlmICh0cmFuUG9zIDwgNCkKKyAgICAgICAgZm1heCA9IDY7CisgICAgICBlbHNlIGlmICh0cmFuUG9zID09IDQgfHwgdHJhblBvcyA9PSA1KQorICAgICAgICBmbWF4ID0gNDsKKyAgICAgIGVsc2UKKyAgICAgICAgZm1heCA9IDg7CisgICAgICBicmVhazsKIAogICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKLSAgICAgICAgaWYgKHRyYW5Qb3MgPCA0KQotICAgICAgICAgIGZtYXggPSA1OwotICAgICAgICBlbHNlIGlmICh0cmFuUG9zID09IDQgfHwgdHJhblBvcyA9PSA1KQotICAgICAgICAgIGZtYXggPSAzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZm1heCA9IDc7Ci0gICAgICAgIGJyZWFrOworICAgICAgaWYgKHRyYW5Qb3MgPCA0KQorICAgICAgICBmbWF4ID0gNTsKKyAgICAgIGVsc2UgaWYgKHRyYW5Qb3MgPT0gNCB8fCB0cmFuUG9zID09IDUpCisgICAgICAgIGZtYXggPSAzOworICAgICAgZWxzZQorICAgICAgICBmbWF4ID0gNzsKKyAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgICAgZm1heCA9IDg7Ci0gICAgICAgIGJyZWFrOworICAgICAgZm1heCA9IDg7CisgICAgICBicmVhazsKICAgfQogCiAgIHJldHVybiBmbWF4OwpAQCAtMTA4MywxMSArMTAyMywxMCBAQAogIFJldHVybjogICAgICBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotZmlsbEZyYW1lUG9zdCAoSU5UICpwYXJ0cywgSU5UICpkLCBJTlQgZG1heCwgSU5UICp2X2JvcmQsIElOVCAqbGVuZ3RoX3ZfYm9yZCwKLSAgICAgICAgICAgICAgIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCBibWF4LAotICAgICAgICAgICAgICAgSU5UIGJ1ZmZlckZyYW1lU3RhcnQsIElOVCBudW1iZXJUaW1lU2xvdHMsIElOVCBmbWF4KQoteworc3RhdGljIHZvaWQgZmlsbEZyYW1lUG9zdChJTlQgKnBhcnRzLCBJTlQgKmQsIElOVCBkbWF4LCBJTlQgKnZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYm1heCwgSU5UIGJ1ZmZlckZyYW1lU3RhcnQsIElOVCBudW1iZXJUaW1lU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmbWF4KSB7CiAgIElOVCBqLCByZXN0LCBzZWdtLCBTLCBzID0gMCwgYm9yZDsKIAogICAvKgpAQCAtMTEwMCw3ICsxMDM5LDcgQEAKICAgKmQgPSByZXN0OwogCiAgIGlmICgqZCA+IDApIHsKLSAgICAqcGFydHMgPSAxOyAgICAgICAgICAgLyogc3RhcnQgd2l0aCBvbmUgZW52ZWxvcGUgKi8KKyAgICAqcGFydHMgPSAxOyAvKiBzdGFydCB3aXRoIG9uZSBlbnZlbG9wZSAqLwogCiAgICAgLyogY2FsYyAjIG9mIGFkZGl0aW9uYWwgZW52ZWxvcGVzIGFuZCBjb3JyZXNwb25kaW5nIGxlbmd0aHMgKi8KIApAQCAtMTEwOCw4ICsxMDQ3LDggQEAKICAgICAgICpwYXJ0cyA9ICpwYXJ0cyArIDE7CiAKICAgICAgIHNlZ20gPSByZXN0IC8gKCpwYXJ0cyk7Ci0gICAgICBTID0gKHNlZ20gLSAyKT4+MTsKLSAgICAgIHMgPSBmaXhNaW4gKGZtYXgsIDIgKiBTICsgMik7CisgICAgICBTID0gKHNlZ20gLSAyKSA+PiAxOworICAgICAgcyA9IGZpeE1pbihmbWF4LCAyICogUyArIDIpOwogICAgICAgKmQgPSByZXN0IC0gKCpwYXJ0cyAtIDEpICogczsKICAgICB9CiAKQEAgLTExMjAsMjUgKzEwNTksMjEgQEAKICAgICAgIGJvcmQgKz0gczsKIAogICAgICAgLyogdl9ib3JkID0gIFsuLi4sKEJmKSwoQmEpLEJkMSwgQmQyICwoQmQzKSwoQmYpXSAqLwotICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIGJvcmQpOworICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CiAKICAgICAgIC8qIHZfZnJlcSA9ICBbLi4uLCgxICksKEZhKSxGZDEsKEZkMiksIDEgICAsIDEhICwxXSAqLwotICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOworICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgMSk7CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgICpwYXJ0cyA9IDE7CiAKICAgICAvKiByZW1vdmUgbGFzdCBlbGVtZW50IGZyb20gdl9ib3JkIGFuZCB2X2ZyZXEgKi8KIAogICAgICpsZW5ndGhfdl9ib3JkID0gKmxlbmd0aF92X2JvcmQgLSAxOwogICAgICpsZW5ndGhfdl9mcmVxID0gKmxlbmd0aF92X2ZyZXEgLSAxOwotCiAgIH0KIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgZmlsbEZyYW1lSW50ZXIKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTYzLDE3ICsxMDk4LDE1IEBACiAgUmV0dXJuOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1maWxsRnJhbWVJbnRlciAoSU5UICpuTCwgY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCi0gICAgICAgICAgICAgICAgSU5UIGJtaW4sIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCAqdl9ib3JkRm9sbG93LAotICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywgSU5UICp2X2ZyZXFGb2xsb3csCi0gICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LCBJTlQgaV9maWxsRm9sbG93LCBJTlQgZG1pbiwKLSAgICAgICAgICAgICAgICBJTlQgZG1heCwgSU5UIG51bWJlclRpbWVTbG90cykKLXsKK3N0YXRpYyB2b2lkIGZpbGxGcmFtZUludGVyKElOVCAqbkwsIGNvbnN0IGludCAqdl90dW5pbmdTZWdtLCBJTlQgKnZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UIGJtaW4sIElOVCAqdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9mcmVxLCBJTlQgKnZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywgSU5UICp2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3csIElOVCBpX2ZpbGxGb2xsb3csIElOVCBkbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRtYXgsIElOVCBudW1iZXJUaW1lU2xvdHMpIHsKICAgSU5UIG1pZGRsZSwgYl9uZXcsIG51bUJvcmRGb2xsb3csIGJvcmRNYXhGb2xsb3csIGk7CiAKICAgaWYgKG51bWJlclRpbWVTbG90cyAhPSBOVU1CRVJfVElNRV9TTE9UU18xMTUyKSB7Ci0KICAgICAvKiAlIHJlbW92ZSBmaWxsIGJvcmRlcnM6ICovCiAgICAgaWYgKGlfZmlsbEZvbGxvdyA+PSAxKSB7CiAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA9IGlfZmlsbEZvbGxvdzsKQEAgLTExOTcsNjUgKzExMzAsNjEgQEAKIAogICAgIGJfbmV3ID0gKmxlbmd0aF92X2JvcmQ7CiAKLQogICAgIGlmIChtaWRkbGUgPD0gZG1heCkgewotICAgICAgaWYgKG1pZGRsZSA+PSBkbWluKSB7ICAgICAgIC8qIGNvbmNhdGVuYXRlICovCi0gICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwotICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKKyAgICAgIGlmIChtaWRkbGUgPj0gZG1pbikgeyAvKiBjb25jYXRlbmF0ZSAqLworICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOworICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOwogICAgICAgfQogCiAgICAgICBlbHNlIHsKLSAgICAgICAgaWYgKHZfdHVuaW5nU2VnbVswXSAhPSAwKSB7ICAgICAgIC8qIHJlbW92ZSBvbmUgbmV3IGJvcmRlciBhbmQgY29uY2F0ZW5hdGUgKi8KKyAgICAgICAgaWYgKHZfdHVuaW5nU2VnbVswXSAhPSAwKSB7IC8qIHJlbW92ZSBvbmUgbmV3IGJvcmRlciBhbmQgY29uY2F0ZW5hdGUgKi8KICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZCA9IGJfbmV3IC0gMTsKLSAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCi0gICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKKyAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CiAKICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcSA9IGJfbmV3IC0gMTsKLSAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxICsgMSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAotICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKCpsZW5ndGhfdl9ib3JkRm9sbG93ID4gMSkgeyAvKiByZW1vdmUgb25lIG9sZCBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCi0gICAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCi0gICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgLSAxKTsKLSAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKLSAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyAtIDEpOworICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfZnJlcSArIDEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCpsZW5ndGhfdl9ib3JkRm9sbG93ID4KKyAgICAgICAgICAgICAgMSkgeyAvKiByZW1vdmUgb25lIG9sZCBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCisgICAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CisgICAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CiAKICAgICAgICAgICAgICpuTCA9ICpuTCAtIDE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBuZXcgInRyYW5zaWVudCIgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLworICAgICAgICAgIH0gZWxzZSB7IC8qIHJlbW92ZSBuZXcgInRyYW5zaWVudCIgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLwogCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQgLSAxOyBpKyspCi0gICAgICAgICAgICAgIHZfYm9yZFtpXSA9IHZfYm9yZFtpICsgMV07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQgLSAxOyBpKyspIHZfYm9yZFtpXSA9IHZfYm9yZFtpICsgMV07CiAKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfZnJlcSAtIDE7IGkrKykKLSAgICAgICAgICAgICAgdl9mcmVxW2ldID0gdl9mcmVxW2kgKyAxXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfZnJlcSAtIDE7IGkrKykgdl9mcmVxW2ldID0gdl9mcmVxW2kgKyAxXTsKIAogICAgICAgICAgICAgKmxlbmd0aF92X2JvcmQgPSBiX25ldyAtIDE7CiAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcSA9IGJfbmV3IC0gMTsKIAotICAgICAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAotICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKLSAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKLSAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CisgICAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKKyAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaWRkbGUgPiBkbWF4ICovCisgICAgfSBlbHNlIHsgLyogbWlkZGxlID4gZG1heCAqLwogCi0gICAgICBmaWxsRnJhbWVQcmUgKGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCBibWluLAotICAgICAgICAgIG1pZGRsZSk7Ci0gICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKLSAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOworICAgICAgZmlsbEZyYW1lUHJlKGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCBibWluLAorICAgICAgICAgICAgICAgICAgIG1pZGRsZSk7CisgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKKyAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOwogICAgIH0KIAorICB9IGVsc2UgeyAvKiBudW1iZXJUaW1lU2xvdHM9PU5VTUJFUl9USU1FX1NMT1RTXzExNTIgKi8KIAotICB9Ci0gIGVsc2UgeyAvKiBudW1iZXJUaW1lU2xvdHM9PU5VTUJFUl9USU1FX1NMT1RTXzExNTIgKi8KLQotICAgIElOVCBsLG07Ci0KKyAgICBJTlQgbCwgbTsKIAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICByZW1vdmUgZmlsbCBib3JkZXJzCkBAIC0xMjc3LDE3ICsxMjA2LDE1IEBACiAKICAgICAvKiBpbnRlcnZhbHM6CiAgICAgICAgaSkgICAgICAgICAgICAgbWlkZGxlIDwgIDAgICAgIDogb3ZlcmxhcCwgbXVzdCByZW1vdmUgYm9yZGVycwotICAgICAgIGlpKSAgICAgICAwIDw9IG1pZGRsZSA8ICBkbWluICA6IG5vIG92ZXJsYXAgYnV0IHRvbyB0aWdodCwgbXVzdCByZW1vdmUgYm9yZGVycwotICAgICAgIGlpaSkgICBkbWluIDw9IG1pZGRsZSA8PSBkbWF4ICA6IG9rLCBqdXN0IGNvbmNhdGVuYXRlCi0gICAgICAgaXYpICAgIGRtYXggPD0gbWlkZGxlICAgICAgICAgIDogdG9vIHdpZGUsIG11c3QgYWRkIGJvcmRlcnMKKyAgICAgICBpaSkgICAgICAgMCA8PSBtaWRkbGUgPCAgZG1pbiAgOiBubyBvdmVybGFwIGJ1dCB0b28gdGlnaHQsIG11c3QgcmVtb3ZlCisgICAgICAgYm9yZGVycyBpaWkpICAgZG1pbiA8PSBtaWRkbGUgPD0gZG1heCAgOiBvaywganVzdCBjb25jYXRlbmF0ZSBpdikgICAgZG1heAorICAgICAgIDw9IG1pZGRsZSAgICAgICAgICA6IHRvbyB3aWRlLCBtdXN0IGFkZCBib3JkZXJzCiAgICAgICovCiAKICAgICAvKiBmaXJzdCByZW1vdmUgb2xkIG5vbi1maWxsLWJvcmRlcnMuLi4gKi8KICAgICB3aGlsZSAobWlkZGxlIDwgMCkgewotCiAgICAgICAvKiAuLi5idXQgZG9uJ3QgcmVtb3ZlIGFsbCBvZiB0aGVtICovCi0gICAgICBpZiAobnVtQm9yZEZvbGxvdyA9PSAxKQotICAgICAgICBicmVhazsKKyAgICAgIGlmIChudW1Cb3JkRm9sbG93ID09IDEpIGJyZWFrOwogCiAgICAgICBudW1Cb3JkRm9sbG93LS07CiAgICAgICBib3JkTWF4Rm9sbG93ID0gdl9ib3JkRm9sbG93W251bUJvcmRGb2xsb3cgLSAxXTsKQEAgLTEyOTUsMTIgKzEyMjIsOSBAQAogICAgIH0KIAogICAgIC8qIGlmIHRoaXMgaXNuJ3QgZW5vdWdoLCByZW1vdmUgbmV3IG5vbi1maWxsIGJvcmRlcnMgKi8KLSAgICBpZiAobWlkZGxlIDwgMCkKLSAgICB7Ci0gICAgICBmb3IgKGwgPSAwLCBtID0gMCA7IGwgPCAqbGVuZ3RoX3ZfYm9yZCA7IGwrKykKLSAgICAgIHsKLSAgICAgICAgaWYodl9ib3JkW2xdPiBib3JkTWF4Rm9sbG93KQotICAgICAgICB7CisgICAgaWYgKG1pZGRsZSA8IDApIHsKKyAgICAgIGZvciAobCA9IDAsIG0gPSAwOyBsIDwgKmxlbmd0aF92X2JvcmQ7IGwrKykgeworICAgICAgICBpZiAodl9ib3JkW2xdID4gYm9yZE1heEZvbGxvdykgewogICAgICAgICAgIHZfYm9yZFttXSA9IHZfYm9yZFtsXTsKICAgICAgICAgICB2X2ZyZXFbbV0gPSB2X2ZyZXFbbF07CiAgICAgICAgICAgbSsrOwpAQCAtMTMxMSw3ICsxMjM1LDYgQEAKICAgICAgICpsZW5ndGhfdl9mcmVxID0gbDsKIAogICAgICAgYm1pbiA9IHZfYm9yZFswXTsKLQogICAgIH0KIAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMzMxLDY5ICsxMjU0LDYyIEBACiAgICAgLyogbm93IG1pZGRsZSBzaG91bGQgYmUgPj0gMCAqLwogICAgIG1pZGRsZSA9IGJtaW4gLSBib3JkTWF4Rm9sbG93OwogCi0gICAgaWYgKG1pZGRsZSA8PSBkbWluKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGlpKSAqLworICAgIGlmIChtaWRkbGUgPD0gZG1pbikgLyogKGlpKSAqLwogICAgIHsKICAgICAgIGJfbmV3ID0gKmxlbmd0aF92X2JvcmQ7CiAKLSAgICAgIGlmICh2X3R1bmluZ1NlZ21bMF0gIT0gMCkKLSAgICAgIHsKKyAgICAgIGlmICh2X3R1bmluZ1NlZ21bMF0gIT0gMCkgewogICAgICAgICAvKiByZW1vdmUgbmV3ICJsdXh1cnkiIGJvcmRlciBhbmQgY29uY2F0ZW5hdGUgKi8KICAgICAgICAgKmxlbmd0aF92X2JvcmQgPSBiX25ldyAtIDE7Ci0gICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKLSAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKKyAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKIAogICAgICAgICAqbGVuZ3RoX3ZfZnJlcSA9IGJfbmV3IC0gMTsKLSAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSArIDEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKLSAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKKyAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQodl9mcmVxICsgMSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCpsZW5ndGhfdl9ib3JkRm9sbG93ID4gMSkKLSAgICAgIHsKKyAgICAgIH0gZWxzZSBpZiAoKmxlbmd0aF92X2JvcmRGb2xsb3cgPiAxKSB7CiAgICAgICAgIC8qIHJlbW92ZSBvbGQgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLwotICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCi0gICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyAtIDEpOwotICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCi0gICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyAtIDEpOworICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgLSAxKTsKKyAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CiAKICAgICAgICAgKm5MID0gKm5MIC0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIHJlbW92ZSBuZXcgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQgLSAxOyBpKyspCi0gICAgICAgICAgdl9ib3JkW2ldID0gdl9ib3JkW2kgKyAxXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9ib3JkIC0gMTsgaSsrKSB2X2JvcmRbaV0gPSB2X2JvcmRbaSArIDFdOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfZnJlcSAtIDE7IGkrKykKLSAgICAgICAgICB2X2ZyZXFbaV0gPSB2X2ZyZXFbaSArIDFdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2ZyZXEgLSAxOyBpKyspIHZfZnJlcVtpXSA9IHZfZnJlcVtpICsgMV07CiAKICAgICAgICAgKmxlbmd0aF92X2JvcmQgPSBiX25ldyAtIDE7CiAgICAgICAgICpsZW5ndGhfdl9mcmVxID0gYl9uZXcgLSAxOwogCi0gICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKLSAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKLSAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAotICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOworICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOworICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOwogICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgobWlkZGxlID49IGRtaW4pICYmIChtaWRkbGUgPD0gZG1heCkpICAgICAgLyogKGlpaSkgKi8KKyAgICB9IGVsc2UgaWYgKChtaWRkbGUgPj0gZG1pbikgJiYgKG1pZGRsZSA8PSBkbWF4KSkgLyogKGlpaSkgKi8KICAgICB7CiAgICAgICAvKiBjb25jYXRlbmF0ZSAqLwotICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7Ci0gICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKKyAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOworICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAKLSAgICB9Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpdikgKi8KKyAgICB9IGVsc2UgLyogKGl2KSAqLwogICAgIHsKLSAgICAgIGZpbGxGcmFtZVByZSAoZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIGJtaW4sCi0gICAgICAgICAgbWlkZGxlKTsKLSAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwotICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CisgICAgICBmaWxsRnJhbWVQcmUoZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIGJtaW4sCisgICAgICAgICAgICAgICAgICAgbWlkZGxlKTsKKyAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOworICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAgICAgfQogICB9CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIGNhbGNGcmFtZUNsYXNzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQwNSw0MiArMTMyMSw0OSBAQAogIFJldHVybjogICAgICBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotY2FsY0ZyYW1lQ2xhc3MgKEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzLCBGUkFNRV9DTEFTUyAqZnJhbWVDbGFzc09sZCwgSU5UIHRyYW5GbGFnLAotICAgICAgICAgICAgICAgIElOVCAqc3ByZWFkRmxhZykKLXsKLQorc3RhdGljIHZvaWQgY2FsY0ZyYW1lQ2xhc3MoRlJBTUVfQ0xBU1MgKmZyYW1lQ2xhc3MsIEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRyYW5GbGFnLCBJTlQgKnNwcmVhZEZsYWcpIHsKICAgc3dpdGNoICgqZnJhbWVDbGFzc09sZCkgewotICBjYXNlIEZJWEZJWG9ubHk6Ci0gIGNhc2UgRklYRklYOgotICAgIGlmICh0cmFuRmxhZykgICpmcmFtZUNsYXNzID0gRklYVkFSOwotICAgIGVsc2UgICAgICAgICAgICpmcmFtZUNsYXNzID0gRklYRklYOwotICAgIGJyZWFrOwotICBjYXNlIEZJWFZBUjoKLSAgICBpZiAodHJhbkZsYWcpIHsgKmZyYW1lQ2xhc3MgPSBWQVJWQVI7ICpzcHJlYWRGbGFnID0gMDsgfQotICAgIGVsc2UgewotICAgICAgaWYgKCpzcHJlYWRGbGFnKSAgKmZyYW1lQ2xhc3MgPSBWQVJWQVI7Ci0gICAgICBlbHNlICAgICAgICAgICAgICAqZnJhbWVDbGFzcyA9IFZBUkZJWDsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVkFSRklYOgotICAgIGlmICh0cmFuRmxhZykgICpmcmFtZUNsYXNzID0gRklYVkFSOwotICAgIGVsc2UgICAgICAgICAgICpmcmFtZUNsYXNzID0gRklYRklYOwotICAgIGJyZWFrOwotICBjYXNlIFZBUlZBUjoKLSAgICBpZiAodHJhbkZsYWcpIHsgKmZyYW1lQ2xhc3MgPSBWQVJWQVI7ICpzcHJlYWRGbGFnID0gMDsgfQotICAgIGVsc2UgewotICAgICAgaWYgKCpzcHJlYWRGbGFnKSAgKmZyYW1lQ2xhc3MgPSBWQVJWQVI7Ci0gICAgICBlbHNlICAgICAgICAgICAgICAqZnJhbWVDbGFzcyA9IFZBUkZJWDsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgY2FzZSBGSVhGSVhvbmx5OgorICAgIGNhc2UgRklYRklYOgorICAgICAgaWYgKHRyYW5GbGFnKQorICAgICAgICAqZnJhbWVDbGFzcyA9IEZJWFZBUjsKKyAgICAgIGVsc2UKKyAgICAgICAgKmZyYW1lQ2xhc3MgPSBGSVhGSVg7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJWFZBUjoKKyAgICAgIGlmICh0cmFuRmxhZykgeworICAgICAgICAqZnJhbWVDbGFzcyA9IFZBUlZBUjsKKyAgICAgICAgKnNwcmVhZEZsYWcgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCpzcHJlYWRGbGFnKQorICAgICAgICAgICpmcmFtZUNsYXNzID0gVkFSVkFSOworICAgICAgICBlbHNlCisgICAgICAgICAgKmZyYW1lQ2xhc3MgPSBWQVJGSVg7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFZBUkZJWDoKKyAgICAgIGlmICh0cmFuRmxhZykKKyAgICAgICAgKmZyYW1lQ2xhc3MgPSBGSVhWQVI7CisgICAgICBlbHNlCisgICAgICAgICpmcmFtZUNsYXNzID0gRklYRklYOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWQVJWQVI6CisgICAgICBpZiAodHJhbkZsYWcpIHsKKyAgICAgICAgKmZyYW1lQ2xhc3MgPSBWQVJWQVI7CisgICAgICAgICpzcHJlYWRGbGFnID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqc3ByZWFkRmxhZykKKyAgICAgICAgICAqZnJhbWVDbGFzcyA9IFZBUlZBUjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICpmcmFtZUNsYXNzID0gVkFSRklYOworICAgICAgfQorICAgICAgYnJlYWs7CiAgIH07CiAKICAgKmZyYW1lQ2xhc3NPbGQgPSAqZnJhbWVDbGFzczsKIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgc3BlY2lhbENhc2UKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDU5LDI4ICsxMzgyLDI0IEBACiAgUmV0dXJuOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1zcGVjaWFsQ2FzZSAoSU5UICpzcHJlYWRGbGFnLCBJTlQgYWxsb3dTcHJlYWQsIElOVCAqdl9ib3JkLAotICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UICpwYXJ0cywKLSAgICAgICAgICAgICBJTlQgZCkKLXsKK3N0YXRpYyB2b2lkIHNwZWNpYWxDYXNlKElOVCAqc3ByZWFkRmxhZywgSU5UIGFsbG93U3ByZWFkLCBJTlQgKnZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcGFydHMsIElOVCBkKSB7CiAgIElOVCBMOwogCiAgIEwgPSAqbGVuZ3RoX3ZfYm9yZDsKIAotICBpZiAoYWxsb3dTcHJlYWQpIHsgICAgICAgICAgICAvKiBhZGQgb25lICJzdGVwIDgiICovCisgIGlmIChhbGxvd1NwcmVhZCkgeyAvKiBhZGQgb25lICJzdGVwIDgiICovCiAgICAgKnNwcmVhZEZsYWcgPSAxOwotICAgIEZES3NickVuY19BZGRSaWdodCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRbTCAtIDFdICsgOCk7Ci0gICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOworICAgIEZES3NickVuY19BZGRSaWdodCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZFtMIC0gMV0gKyA4KTsKKyAgICBGREtzYnJFbmNfQWRkUmlnaHQodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAxKTsKICAgICAoKnBhcnRzKSsrOwotICB9Ci0gIGVsc2UgewotICAgIGlmIChkID09IDEpIHsgICAgICAgICAgICAgICAvKiAgc3RyZXRjaCBvbmUgc2xvdCAqLworICB9IGVsc2UgeworICAgIGlmIChkID09IDEpIHsgLyogIHN0cmV0Y2ggb25lIHNsb3QgKi8KICAgICAgICpsZW5ndGhfdl9ib3JkID0gTCAtIDE7CiAgICAgICAqbGVuZ3RoX3ZfZnJlcSA9IEwgLSAxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmICgodl9ib3JkW0wgLSAxXSAtIHZfYm9yZFtMIC0gMl0pID4gMikgeyAgICAgICAgLyogY29tcHJlc3Mgb25lIHF1YW50IHN0ZXAgKi8KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCh2X2JvcmRbTCAtIDFdIC0gdl9ib3JkW0wgLSAyXSkgPiAyKSB7IC8qIGNvbXByZXNzIG9uZSBxdWFudCBzdGVwICovCiAgICAgICAgIHZfYm9yZFtMIC0gMV0gPSB2X2JvcmRbTCAtIDFdIC0gMjsKICAgICAgICAgdl9mcmVxWypsZW5ndGhfdl9mcmVxIC0gMV0gPSAwOyAvKiB1c2UgbG93IHJlcyBmb3Igc2hvcnQgc2VnbWVudCAqLwogICAgICAgfQpAQCAtMTQ4OCw4ICsxNDA3LDYgQEAKICAgfQogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBjYWxjQ21vbkJvcmRlcgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1MDUsMTQgKzE0MjIsMTMgQEAKICBSZXR1cm46ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWNhbGNDbW9uQm9yZGVyIChJTlQgKmlfY21vbiwgSU5UICppX3RyYW4sIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCi0gICAgICAgICAgICAgICAgSU5UIHRyYW4sIElOVCBidWZmZXJGcmFtZVN0YXJ0LCBJTlQgbnVtYmVyVGltZVNsb3RzKQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGSCAwMC0wNi0yNiAqLworc3RhdGljIHZvaWQgY2FsY0Ntb25Cb3JkZXIoSU5UICppX2Ntb24sIElOVCAqaV90cmFuLCBJTlQgKnZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UIHRyYW4sIElOVCBidWZmZXJGcmFtZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bWJlclRpbWVTbG90cykgeyAvKiBGSCAwMC0wNi0yNiAqLwogICBJTlQgaTsKIAogICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQ7IGkrKykKLSAgICBpZiAodl9ib3JkW2ldID49IGJ1ZmZlckZyYW1lU3RhcnQgKyBudW1iZXJUaW1lU2xvdHMpIHsgICAgICAvKiBGSCAwMC0wNi0yNiAqLworICAgIGlmICh2X2JvcmRbaV0gPj0gYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90cykgeyAvKiBGSCAwMC0wNi0yNiAqLwogICAgICAgKmlfY21vbiA9IGk7CiAgICAgICBicmVhazsKICAgICB9CkBAIC0xNTIyLDggKzE0MzgsNyBAQAogICAgIGlmICh2X2JvcmRbaV0gPj0gdHJhbikgewogICAgICAgKmlfdHJhbiA9IGk7CiAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZWxzZQorICAgIH0gZWxzZQogICAgICAgKmlfdHJhbiA9IEVNUFRZOwogfQogCkBAIC0xNTQ5LDEzICsxNDY0LDEyIEBACiAgUmV0dXJuOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1rZWVwRm9yRm9sbG93VXAgKElOVCAqdl9ib3JkRm9sbG93LCBJTlQgKmxlbmd0aF92X2JvcmRGb2xsb3csCi0gICAgICAgICAgICAgICAgIElOVCAqdl9mcmVxRm9sbG93LCBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3csCi0gICAgICAgICAgICAgICAgIElOVCAqaV90cmFuRm9sbG93LCBJTlQgKmlfZmlsbEZvbGxvdywgSU5UICp2X2JvcmQsCi0gICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsIElOVCBpX2Ntb24sIElOVCBpX3RyYW4sCi0gICAgICAgICAgICAgICAgIElOVCBwYXJ0cywgSU5UIG51bWJlclRpbWVTbG90cykKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkggMDAtMDYtMjYgKi8KK3N0YXRpYyB2b2lkIGtlZXBGb3JGb2xsb3dVcChJTlQgKnZfYm9yZEZvbGxvdywgSU5UICpsZW5ndGhfdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqdl9mcmVxRm9sbG93LCBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICppX3RyYW5Gb2xsb3csIElOVCAqaV9maWxsRm9sbG93LCBJTlQgKnZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLCBJTlQgaV9jbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBpX3RyYW4sIElOVCBwYXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtYmVyVGltZVNsb3RzKSB7IC8qIEZIIDAwLTA2LTI2ICovCiAgIElOVCBMLCBpLCBqOwogCiAgIEwgPSAqbGVuZ3RoX3ZfYm9yZDsKQEAgLTE1NjQsNyArMTQ3OCw3IEBACiAgICgqbGVuZ3RoX3ZfZnJlcUZvbGxvdykgPSAwOwogCiAgIGZvciAoaiA9IDAsIGkgPSBpX2Ntb247IGkgPCBMOyBpKyssIGorKykgewotICAgIHZfYm9yZEZvbGxvd1tqXSA9IHZfYm9yZFtpXSAtIG51bWJlclRpbWVTbG90czsgICAgICAvKiBGSCAwMC0wNi0yNiAqLworICAgIHZfYm9yZEZvbGxvd1tqXSA9IHZfYm9yZFtpXSAtIG51bWJlclRpbWVTbG90czsgLyogRkggMDAtMDYtMjYgKi8KICAgICB2X2ZyZXFGb2xsb3dbal0gPSB2X2ZyZXFbaV07CiAgICAgKCpsZW5ndGhfdl9ib3JkRm9sbG93KSsrOwogICAgICgqbGVuZ3RoX3ZfZnJlcUZvbGxvdykrKzsKQEAgLTE1NzQsNyArMTQ4OCw2IEBACiAgIGVsc2UKICAgICAqaV90cmFuRm9sbG93ID0gRU1QVFk7CiAgICppX2ZpbGxGb2xsb3cgPSBMIC0gKHBhcnRzIC0gMSkgLSBpX2Ntb247Ci0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1OTcsMTQgKzE1MTAsMTAgQEAKICBSZXR1cm46ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWNhbGNDdHJsU2lnbmFsIChIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsCi0gICAgICAgICAgICAgICAgRlJBTUVfQ0xBU1MgZnJhbWVDbGFzcywgSU5UICp2X2JvcmQsIElOVCBsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwKLSAgICAgICAgICAgICAgICBJTlQgbGVuZ3RoX3ZfZnJlcSwgSU5UIGlfY21vbiwgSU5UIGlfdHJhbiwgSU5UIHNwcmVhZEZsYWcsCi0gICAgICAgICAgICAgICAgSU5UIG5MKQotewotCi0KK3N0YXRpYyB2b2lkIGNhbGNDdHJsU2lnbmFsKEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwgRlJBTUVfQ0xBU1MgZnJhbWVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqdl9ib3JkLCBJTlQgbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuZ3RoX3ZfZnJlcSwgSU5UIGlfY21vbiwgSU5UIGlfdHJhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzcHJlYWRGbGFnLCBJTlQgbkwpIHsKICAgSU5UIGksIHIsIGEsIG4sIHAsIGIsIGFMLCBhUiwgbnRvdCwgbm1heCwgblI7CiAKICAgSU5UICp2X2YgPSBoU2JyR3JpZC0+dl9mOwpAQCAtMTYxOCwxNjQgKzE1MjcsMTUyIEBACiAgIElOVCBsZW5ndGhfdl9yTCA9IDA7CiAKICAgc3dpdGNoIChmcmFtZUNsYXNzKSB7Ci0gIGNhc2UgRklYVkFSOgotICAgIC8qIGFic29sdXRlIGJvcmRlcjogKi8KKyAgICBjYXNlIEZJWFZBUjoKKyAgICAgIC8qIGFic29sdXRlIGJvcmRlcjogKi8KIAotICAgIGEgPSB2X2JvcmRbaV9jbW9uXTsKLQotICAgIC8qIHJlbGF0aXZlIGJvcmRlcnM6ICovCi0gICAgbGVuZ3RoX3ZfciA9IDA7Ci0gICAgaSA9IGlfY21vbjsKLQotICAgIHdoaWxlIChpID49IDEpIHsKLSAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOwotICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X3IsICZsZW5ndGhfdl9yLCByKTsKLSAgICAgIGktLTsKLSAgICB9Ci0KLQotICAgIC8qICBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVyczogKi8KLSAgICBuID0gbGVuZ3RoX3ZfcjsKLQotCi0gICAgLyogZnJlcSByZXM6ICovCi0gICAgZm9yIChpID0gMDsgaSA8IGlfY21vbjsgaSsrKQotICAgICAgdl9mW2ldID0gdl9mcmVxW2lfY21vbiAtIDEgLSBpXTsKLSAgICB2X2ZbaV9jbW9uXSA9IDE7Ci0KLSAgICAvKiBwb2ludGVyOiAqLwotICAgIHAgPSAoaV9jbW9uID49IGlfdHJhbiAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGlfY21vbiAtIGlfdHJhbiArIDEpIDogKDApIDsKLQotICAgIGhTYnJHcmlkLT5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKLSAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmQgPSBhOwotICAgIGhTYnJHcmlkLT5uID0gbjsKLSAgICBoU2JyR3JpZC0+cCA9IHA7Ci0KLSAgICBicmVhazsKLSAgY2FzZSBWQVJGSVg6Ci0gICAgLyogYWJzb2x1dGUgYm9yZGVyOiAqLwotICAgIGEgPSB2X2JvcmRbMF07Ci0KLSAgICAvKiByZWxhdGl2ZSBib3JkZXJzOiAqLwotICAgIGxlbmd0aF92X3IgPSAwOwotCi0gICAgZm9yIChpID0gMTsgaSA8IGxlbmd0aF92X2JvcmQ7IGkrKykgewotICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07Ci0gICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfciwgJmxlbmd0aF92X3IsIHIpOwotICAgIH0KLQotICAgIC8qIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzOiAqLwotICAgIG4gPSBsZW5ndGhfdl9yOwotCi0gICAgLyogZnJlcSByZXM6ICovCi0gICAgRkRLbWVtY3B5ICh2X2YsIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSAqIHNpemVvZiAoSU5UKSk7Ci0KLQotICAgIC8qIHBvaW50ZXI6ICovCi0gICAgcCA9IChpX3RyYW4gPj0gMCAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGlfdHJhbiArIDEpIDogKDApIDsKLQotICAgIGhTYnJHcmlkLT5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKLSAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmQgPSBhOwotICAgIGhTYnJHcmlkLT5uID0gbjsKLSAgICBoU2JyR3JpZC0+cCA9IHA7Ci0KLSAgICBicmVhazsKLSAgY2FzZSBWQVJWQVI6Ci0gICAgaWYgKHNwcmVhZEZsYWcpIHsKLSAgICAgIC8qIGFic29sdXRlIGJvcmRlcnM6ICovCi0gICAgICBiID0gbGVuZ3RoX3ZfYm9yZDsKLQotICAgICAgYUwgPSB2X2JvcmRbMF07Ci0gICAgICBhUiA9IHZfYm9yZFtiIC0gMV07Ci0KLQotICAgICAgLyogbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnM6ICAgICovCi0gICAgICBudG90ID0gYiAtIDI7Ci0KLSAgICAgIG5tYXggPSAyOyAgICAgICAgICAgICAgICAgLyogbjogezAsMSwyfSAqLwotICAgICAgaWYgKG50b3QgPiBubWF4KSB7Ci0gICAgICAgIG5MID0gbm1heDsKLSAgICAgICAgblIgPSBudG90IC0gbm1heDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBuTCA9IG50b3Q7Ci0gICAgICAgIG5SID0gMDsKLSAgICAgIH0KKyAgICAgIGEgPSB2X2JvcmRbaV9jbW9uXTsKIAogICAgICAgLyogcmVsYXRpdmUgYm9yZGVyczogKi8KLSAgICAgIGxlbmd0aF92X3JMID0gMDsKLSAgICAgIGZvciAoaSA9IDE7IGkgPD0gbkw7IGkrKykgewotICAgICAgICByID0gdl9ib3JkW2ldIC0gdl9ib3JkW2kgLSAxXTsKLSAgICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X3JMLCAmbGVuZ3RoX3ZfckwsIHIpOwotICAgICAgfQorICAgICAgbGVuZ3RoX3ZfciA9IDA7CisgICAgICBpID0gaV9jbW9uOwogCi0gICAgICBsZW5ndGhfdl9yUiA9IDA7Ci0gICAgICBpID0gYiAtIDE7Ci0gICAgICB3aGlsZSAoaSA+PSBiIC0gblIpIHsKKyAgICAgIHdoaWxlIChpID49IDEpIHsKICAgICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07Ci0gICAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9yUiwgJmxlbmd0aF92X3JSLCByKTsKKyAgICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfciwgJmxlbmd0aF92X3IsIHIpOwogICAgICAgICBpLS07CiAgICAgICB9CiAKLSAgICAgIC8qIHBvaW50ZXIgKG9ubHkgb25lIGR1ZSB0byBjb25zdHJhaW50IGluIGZyYW1lIGluZm8pOiAqLwotICAgICAgcCA9IChpX3RyYW4gPiAwICYmIGlfdHJhbiAhPSBFTVBUWSkgPyAoYiAtIGlfdHJhbikgOiAoMCkgOworICAgICAgLyogIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzOiAqLworICAgICAgbiA9IGxlbmd0aF92X3I7CiAKICAgICAgIC8qIGZyZXEgcmVzOiAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGlfY21vbjsgaSsrKSB2X2ZbaV0gPSB2X2ZyZXFbaV9jbW9uIC0gMSAtIGldOworICAgICAgdl9mW2lfY21vbl0gPSAxOwogCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYiAtIDE7IGkrKykKLSAgICAgICAgdl9mTFJbaV0gPSB2X2ZyZXFbaV07Ci0gICAgfQotICAgIGVsc2UgeworICAgICAgLyogcG9pbnRlcjogKi8KKyAgICAgIHAgPSAoaV9jbW9uID49IGlfdHJhbiAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGlfY21vbiAtIGlfdHJhbiArIDEpIDogKDApOwogCi0gICAgICBsZW5ndGhfdl9ib3JkID0gaV9jbW9uICsgMTsKLSAgICAgIGxlbmd0aF92X2ZyZXEgPSBpX2Ntb24gKyAxOworICAgICAgaFNickdyaWQtPmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOworICAgICAgaFNickdyaWQtPmJzX2Fic19ib3JkID0gYTsKKyAgICAgIGhTYnJHcmlkLT5uID0gbjsKKyAgICAgIGhTYnJHcmlkLT5wID0gcDsKIAotCi0gICAgICAvKiBhYnNvbHV0ZSBib3JkZXJzOiAqLwotICAgICAgYiA9IGxlbmd0aF92X2JvcmQ7Ci0KLSAgICAgIGFMID0gdl9ib3JkWzBdOwotICAgICAgYVIgPSB2X2JvcmRbYiAtIDFdOwotCi0gICAgICAvKiBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVyczogICAqLwotICAgICAgbnRvdCA9IGIgLSAyOwotICAgICAgblIgPSBudG90IC0gbkw7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZBUkZJWDoKKyAgICAgIC8qIGFic29sdXRlIGJvcmRlcjogKi8KKyAgICAgIGEgPSB2X2JvcmRbMF07CiAKICAgICAgIC8qIHJlbGF0aXZlIGJvcmRlcnM6ICovCi0gICAgICBsZW5ndGhfdl9yTCA9IDA7Ci0gICAgICBmb3IgKGkgPSAxOyBpIDw9IG5MOyBpKyspIHsKKyAgICAgIGxlbmd0aF92X3IgPSAwOworCisgICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoX3ZfYm9yZDsgaSsrKSB7CiAgICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOwotICAgICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfckwsICZsZW5ndGhfdl9yTCwgcik7CisgICAgICAgIEZES3NickVuY19BZGRSaWdodCh2X3IsICZsZW5ndGhfdl9yLCByKTsKICAgICAgIH0KIAotICAgICAgbGVuZ3RoX3ZfclIgPSAwOwotICAgICAgaSA9IGIgLSAxOwotICAgICAgd2hpbGUgKGkgPj0gYiAtIG5SKSB7Ci0gICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOwotICAgICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfclIsICZsZW5ndGhfdl9yUiwgcik7Ci0gICAgICAgIGktLTsKLSAgICAgIH0KLQotICAgICAgLyogcG9pbnRlciAob25seSBvbmUgZHVlIHRvIGNvbnN0cmFpbnQgaW4gZnJhbWUgaW5mbyk6ICovCi0gICAgICBwID0gKGlfY21vbiA+PSBpX3RyYW4gJiYgaV90cmFuICE9IEVNUFRZKSA/IChpX2Ntb24gLSBpX3RyYW4gKyAxKSA6ICgwKSA7CisgICAgICAvKiBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVyczogKi8KKyAgICAgIG4gPSBsZW5ndGhfdl9yOwogCiAgICAgICAvKiBmcmVxIHJlczogKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBiIC0gMTsgaSsrKQotICAgICAgICB2X2ZMUltpXSA9IHZfZnJlcVtpXTsKLSAgICB9CisgICAgICBGREttZW1jcHkodl9mLCB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEgKiBzaXplb2YoSU5UKSk7CiAKLSAgICBoU2JyR3JpZC0+ZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7Ci0gICAgaFNickdyaWQtPmJzX2Fic19ib3JkXzAgPSBhTDsKLSAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMSA9IGFSOwotICAgIGhTYnJHcmlkLT5ic19udW1fcmVsXzAgPSBuTDsKLSAgICBoU2JyR3JpZC0+YnNfbnVtX3JlbF8xID0gblI7Ci0gICAgaFNickdyaWQtPnAgPSBwOworICAgICAgLyogcG9pbnRlcjogKi8KKyAgICAgIHAgPSAoaV90cmFuID49IDAgJiYgaV90cmFuICE9IEVNUFRZKSA/IChpX3RyYW4gKyAxKSA6ICgwKTsKIAotICAgIGJyZWFrOworICAgICAgaFNickdyaWQtPmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOworICAgICAgaFNickdyaWQtPmJzX2Fic19ib3JkID0gYTsKKyAgICAgIGhTYnJHcmlkLT5uID0gbjsKKyAgICAgIGhTYnJHcmlkLT5wID0gcDsKIAotICBkZWZhdWx0OgotICAgIC8qIGRvIG5vdGhpbmcgKi8KLSAgICBicmVhazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVkFSVkFSOgorICAgICAgaWYgKHNwcmVhZEZsYWcpIHsKKyAgICAgICAgLyogYWJzb2x1dGUgYm9yZGVyczogKi8KKyAgICAgICAgYiA9IGxlbmd0aF92X2JvcmQ7CisKKyAgICAgICAgYUwgPSB2X2JvcmRbMF07CisgICAgICAgIGFSID0gdl9ib3JkW2IgLSAxXTsKKworICAgICAgICAvKiBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVyczogICAgKi8KKyAgICAgICAgbnRvdCA9IGIgLSAyOworCisgICAgICAgIG5tYXggPSAyOyAvKiBuOiB7MCwxLDJ9ICovCisgICAgICAgIGlmIChudG90ID4gbm1heCkgeworICAgICAgICAgIG5MID0gbm1heDsKKyAgICAgICAgICBuUiA9IG50b3QgLSBubWF4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5MID0gbnRvdDsKKyAgICAgICAgICBuUiA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiByZWxhdGl2ZSBib3JkZXJzOiAqLworICAgICAgICBsZW5ndGhfdl9yTCA9IDA7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbkw7IGkrKykgeworICAgICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOworICAgICAgICAgIEZES3NickVuY19BZGRSaWdodCh2X3JMLCAmbGVuZ3RoX3ZfckwsIHIpOworICAgICAgICB9CisKKyAgICAgICAgbGVuZ3RoX3ZfclIgPSAwOworICAgICAgICBpID0gYiAtIDE7CisgICAgICAgIHdoaWxlIChpID49IGIgLSBuUikgeworICAgICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOworICAgICAgICAgIEZES3NickVuY19BZGRSaWdodCh2X3JSLCAmbGVuZ3RoX3ZfclIsIHIpOworICAgICAgICAgIGktLTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBvaW50ZXIgKG9ubHkgb25lIGR1ZSB0byBjb25zdHJhaW50IGluIGZyYW1lIGluZm8pOiAqLworICAgICAgICBwID0gKGlfdHJhbiA+IDAgJiYgaV90cmFuICE9IEVNUFRZKSA/IChiIC0gaV90cmFuKSA6ICgwKTsKKworICAgICAgICAvKiBmcmVxIHJlczogKi8KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYiAtIDE7IGkrKykgdl9mTFJbaV0gPSB2X2ZyZXFbaV07CisgICAgICB9IGVsc2UgeworICAgICAgICBsZW5ndGhfdl9ib3JkID0gaV9jbW9uICsgMTsKKworICAgICAgICAvKiBhYnNvbHV0ZSBib3JkZXJzOiAqLworICAgICAgICBiID0gbGVuZ3RoX3ZfYm9yZDsKKworICAgICAgICBhTCA9IHZfYm9yZFswXTsKKyAgICAgICAgYVIgPSB2X2JvcmRbYiAtIDFdOworCisgICAgICAgIC8qIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzOiAgICovCisgICAgICAgIG50b3QgPSBiIC0gMjsKKyAgICAgICAgblIgPSBudG90IC0gbkw7CisKKyAgICAgICAgLyogcmVsYXRpdmUgYm9yZGVyczogKi8KKyAgICAgICAgbGVuZ3RoX3ZfckwgPSAwOworICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG5MOyBpKyspIHsKKyAgICAgICAgICByID0gdl9ib3JkW2ldIC0gdl9ib3JkW2kgLSAxXTsKKyAgICAgICAgICBGREtzYnJFbmNfQWRkUmlnaHQodl9yTCwgJmxlbmd0aF92X3JMLCByKTsKKyAgICAgICAgfQorCisgICAgICAgIGxlbmd0aF92X3JSID0gMDsKKyAgICAgICAgaSA9IGIgLSAxOworICAgICAgICB3aGlsZSAoaSA+PSBiIC0gblIpIHsKKyAgICAgICAgICByID0gdl9ib3JkW2ldIC0gdl9ib3JkW2kgLSAxXTsKKyAgICAgICAgICBGREtzYnJFbmNfQWRkUmlnaHQodl9yUiwgJmxlbmd0aF92X3JSLCByKTsKKyAgICAgICAgICBpLS07CisgICAgICAgIH0KKworICAgICAgICAvKiBwb2ludGVyIChvbmx5IG9uZSBkdWUgdG8gY29uc3RyYWludCBpbiBmcmFtZSBpbmZvKTogKi8KKyAgICAgICAgcCA9IChpX2Ntb24gPj0gaV90cmFuICYmIGlfdHJhbiAhPSBFTVBUWSkgPyAoaV9jbW9uIC0gaV90cmFuICsgMSkgOiAoMCk7CisKKyAgICAgICAgLyogZnJlcSByZXM6ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiIC0gMTsgaSsrKSB2X2ZMUltpXSA9IHZfZnJlcVtpXTsKKyAgICAgIH0KKworICAgICAgaFNickdyaWQtPmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOworICAgICAgaFNickdyaWQtPmJzX2Fic19ib3JkXzAgPSBhTDsKKyAgICAgIGhTYnJHcmlkLT5ic19hYnNfYm9yZF8xID0gYVI7CisgICAgICBoU2JyR3JpZC0+YnNfbnVtX3JlbF8wID0gbkw7CisgICAgICBoU2JyR3JpZC0+YnNfbnVtX3JlbF8xID0gblI7CisgICAgICBoU2JyR3JpZC0+cCA9IHA7CisKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgIGJyZWFrOwogICB9CiB9CiAKQEAgLTE3OTUsNzkgKzE2OTIsNzcgQEAKICBXcml0dGVuOiAgICAgQW5kcmVhcyBTY2huZWlkZXIKICBSZXZpc2VkOgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1jcmVhdGVEZWZGcmFtZUluZm8oSEFORExFX1NCUl9GUkFNRV9JTkZPIGhTYnJGcmFtZUluZm8sIElOVCBuRW52LCBJTlQgblRpbWVTbG90cykKLXsKK3N0YXRpYyB2b2lkIGNyZWF0ZURlZkZyYW1lSW5mbyhIQU5ETEVfU0JSX0ZSQU1FX0lORk8gaFNickZyYW1lSW5mbywgSU5UIG5FbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5UaW1lU2xvdHMpIHsKICAgc3dpdGNoIChuRW52KSB7Ci0gIGNhc2UgMToKLSAgICBzd2l0Y2ggKG5UaW1lU2xvdHMpIHsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6Ci0gICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzE5MjAsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICBjYXNlIDE6CisgICAgICBzd2l0Y2ggKG5UaW1lU2xvdHMpIHsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV8xOTIwLCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV8yMDQ4LCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xMTUyOgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV8xMTUyLCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMzA0OgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV8yMzA0LCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKKyAgICAgICAgICBGREttZW1jcHkoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzFfNTEyTEQsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICB9CiAgICAgICBicmVhazsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6Ci0gICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzIwNDgsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICBjYXNlIDI6CisgICAgICBzd2l0Y2ggKG5UaW1lU2xvdHMpIHsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl8xOTIwLCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl8yMDQ4LCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xMTUyOgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl8xMTUyLCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMzA0OgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl8yMzA0LCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKKyAgICAgICAgICBGREttZW1jcHkoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzJfNTEyTEQsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICB9CiAgICAgICBicmVhazsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6Ci0gICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzExNTIsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNDoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzFfMjMwNCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzFfNTEyTEQsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICBjYXNlIDQ6CisgICAgICBzd2l0Y2ggKG5UaW1lU2xvdHMpIHsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF8xOTIwLCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF8yMDQ4LCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xMTUyOgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF8xMTUyLCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMzA0OgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF8yMzA0LCBzaXplb2YoU0JSX0ZSQU1FX0lORk8pKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKKyAgICAgICAgICBGREttZW1jcHkoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzRfNTEyTEQsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICB9CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgMjoKLSAgICBzd2l0Y2ggKG5UaW1lU2xvdHMpIHsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6Ci0gICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzE5MjAsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzJfMjA0OCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xMTUyOgotICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl8xMTUyLCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQ6Ci0gICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzIzMDQsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfNTEyTEQ6Ci0gICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzUxMkxELCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgNDoKLSAgICBzd2l0Y2ggKG5UaW1lU2xvdHMpIHsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6Ci0gICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzE5MjAsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzRfMjA0OCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xMTUyOgotICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF8xMTUyLCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQ6Ci0gICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzIzMDQsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfNTEyTEQ6Ci0gICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzUxMkxELCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRkRLX0FTU0VSVCgwKTsKICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgY3RybFNpZ25hbDJGcmFtZUluZm8KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xODg2LDE3MSArMTc4MSwxNzcgQEAKICBSZXR1cm46ICAgICAgdm9pZDsgaFNickZyYW1lSW5mbyBjb250YWlucyB0aGUgdXBkYXRlZCBGUkFNRV9JTkZPIHN0cnVjdAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWN0cmxTaWduYWwyRnJhbWVJbmZvICgKLSAgICAgICAgSEFORExFX1NCUl9HUklEICAgICAgICBoU2JyR3JpZCwgICAgICAgLyogaW5wdXQgOiB0aGUgZ3JpZCBoYW5kbGUgICAgICAgKi8KLSAgICAgICAgSEFORExFX1NCUl9GUkFNRV9JTkZPICBoU2JyRnJhbWVJbmZvLCAgLyogb3V0cHV0OiB0aGUgZnJhbWUgaW5mbyBoYW5kbGUgKi8KLSAgICAgICAgRlJFUV9SRVMgICAgICAgICAgICAgICpmcmVxX3Jlc19maXhmaXggLyogaW4vb3V0OiBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgRklYRklYIGZyYW1lcyAqLwotICAgICAgICApCi17CitzdGF0aWMgdm9pZCBjdHJsU2lnbmFsMkZyYW1lSW5mbygKKyAgICBIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsICAgICAgICAgICAgLyogaW5wdXQgOiB0aGUgZ3JpZCBoYW5kbGUgICAgICAgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0lORk8gaFNickZyYW1lSW5mbywgLyogb3V0cHV0OiB0aGUgZnJhbWUgaW5mbyBoYW5kbGUgKi8KKyAgICBGUkVRX1JFUworICAgICAgICAqZnJlcV9yZXNfZml4Zml4IC8qIGluL291dDogZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIEZJWEZJWCBmcmFtZXMgKi8KKykgewogICBJTlQgZnJhbWVTcGxpdCA9IDA7CiAgIElOVCBuRW52ID0gMCwgYm9yZGVyID0gMCwgaSwgaywgcCAvKj8qLzsKICAgSU5UICp2X3IgPSBoU2JyR3JpZC0+YnNfcmVsX2JvcmQ7CiAgIElOVCAqdl9mID0gaFNickdyaWQtPnZfZjsKIAogICBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzID0gaFNickdyaWQtPmZyYW1lQ2xhc3M7Ci0gIElOVCBidWZmZXJGcmFtZVN0YXJ0ICAgPSBoU2JyR3JpZC0+YnVmZmVyRnJhbWVTdGFydDsKLSAgSU5UIG51bWJlclRpbWVTbG90cyAgICA9IGhTYnJHcmlkLT5udW1iZXJUaW1lU2xvdHM7CisgIElOVCBidWZmZXJGcmFtZVN0YXJ0ID0gaFNickdyaWQtPmJ1ZmZlckZyYW1lU3RhcnQ7CisgIElOVCBudW1iZXJUaW1lU2xvdHMgPSBoU2JyR3JpZC0+bnVtYmVyVGltZVNsb3RzOwogCiAgIHN3aXRjaCAoZnJhbWVDbGFzcykgewotICBjYXNlIEZJWEZJWDoKLSAgICBjcmVhdGVEZWZGcmFtZUluZm8oaFNickZyYW1lSW5mbywgaFNickdyaWQtPmJzX251bV9lbnYsIG51bWJlclRpbWVTbG90cyk7CisgICAgY2FzZSBGSVhGSVg6CisgICAgICBjcmVhdGVEZWZGcmFtZUluZm8oaFNickZyYW1lSW5mbywgaFNickdyaWQtPmJzX251bV9lbnYsIG51bWJlclRpbWVTbG90cyk7CiAKLSAgICBmcmFtZVNwbGl0ID0gKGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXMgPiAxKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaFNickZyYW1lSW5mby0+bkVudmVsb3BlczsgaSsrKSB7Ci0gICAgICBoU2JyR3JpZC0+dl9mW2ldID0gaFNickZyYW1lSW5mby0+ZnJlcVJlc1tpXSA9IGZyZXFfcmVzX2ZpeGZpeFtmcmFtZVNwbGl0XTsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgICBmcmFtZVNwbGl0ID0gKGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXMgPiAxKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzOyBpKyspIHsKKyAgICAgICAgaFNickdyaWQtPnZfZltpXSA9IGhTYnJGcmFtZUluZm8tPmZyZXFSZXNbaV0gPQorICAgICAgICAgICAgZnJlcV9yZXNfZml4Zml4W2ZyYW1lU3BsaXRdOworICAgICAgfQorICAgICAgYnJlYWs7CiAKLSAgY2FzZSBGSVhWQVI6Ci0gIGNhc2UgVkFSRklYOgotICAgIG5FbnYgPSBoU2JyR3JpZC0+biArIDE7ICAgICAgLyogcmVhZCBuIFtTQlJfTlVNX0JJVFMgYml0c10gKi8gLyo/IHNuZCovCi0gICAgRkRLX0FTU0VSVChuRW52IDw9IE1BWF9FTlZFTE9QRVNfRklYVkFSX1ZBUkZJWCk7CisgICAgY2FzZSBGSVhWQVI6CisgICAgY2FzZSBWQVJGSVg6CisgICAgICBuRW52ID0gaFNickdyaWQtPm4gKyAxOyAvKiByZWFkIG4gW1NCUl9OVU1fQklUUyBiaXRzXSAqLyAvKj8gc25kKi8KKyAgICAgIEZES19BU1NFUlQobkVudiA8PSBNQVhfRU5WRUxPUEVTX0ZJWFZBUl9WQVJGSVgpOwogCi0gICAgaFNickZyYW1lSW5mby0+bkVudmVsb3BlcyA9IG5FbnY7CisgICAgICBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzID0gbkVudjsKIAotICAgIGJvcmRlciA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZDsgLyogcmVhZCB0aGUgYWJzb2x1dGUgYm9yZGVyICovCisgICAgICBib3JkZXIgPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmQ7IC8qIHJlYWQgdGhlIGFic29sdXRlIGJvcmRlciAqLwogCi0gICAgaWYgKG5FbnYgPT0gMSkKLSAgICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDE7Ci0gICAgZWxzZQotICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMjsKKyAgICAgIGlmIChuRW52ID09IDEpCisgICAgICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDE7CisgICAgICBlbHNlCisgICAgICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDI7CiAKLSAgICBicmVhazsKKyAgICAgIGJyZWFrOwogCi0gIGRlZmF1bHQ6Ci0gICAgLyogZG8gbm90aGluZyAqLwotICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBkbyBub3RoaW5nICovCisgICAgICBicmVhazsKICAgfQogCiAgIHN3aXRjaCAoZnJhbWVDbGFzcykgewotICBjYXNlIEZJWFZBUjoKLSAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gYnVmZmVyRnJhbWVTdGFydDsgLyogc3RhcnQtcG9zaXRpb24gb2YgMXN0IGVudmVsb3BlICovCisgICAgY2FzZSBGSVhWQVI6CisgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0KKyAgICAgICAgICBidWZmZXJGcmFtZVN0YXJ0OyAvKiBzdGFydC1wb3NpdGlvbiBvZiAxc3QgZW52ZWxvcGUgKi8KIAotICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudl0gPSBib3JkZXI7CisgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gYm9yZGVyOwogCi0gICAgZm9yIChrID0gMCwgaSA9IG5FbnYgLSAxOyBrIDwgbkVudiAtIDE7IGsrKywgaS0tKSB7Ci0gICAgICBib3JkZXIgLT0gdl9yW2tdOwotICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsKLSAgICB9CisgICAgICBmb3IgKGsgPSAwLCBpID0gbkVudiAtIDE7IGsgPCBuRW52IC0gMTsgaysrLCBpLS0pIHsKKyAgICAgICAgYm9yZGVyIC09IHZfcltrXTsKKyAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsKKyAgICAgIH0KIAotICAgIC8qIG1ha2UgZWl0aGVyIGVudmVsb3BlIG5yLiBuRW52ICsgMSAtIHAgc2hvcnQ7IG9yIGRvbid0IHNob3J0ZW4gaWYgcCA9PSAwICovCi0gICAgcCA9IGhTYnJHcmlkLT5wOwotICAgIGlmIChwID09IDApIHsKLSAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSBuRW52ICsgMSAtIHA7Ci0gICAgfQorICAgICAgLyogbWFrZSBlaXRoZXIgZW52ZWxvcGUgbnIuIG5FbnYgKyAxIC0gcCBzaG9ydDsgb3IgZG9uJ3Qgc2hvcnRlbiBpZiBwID09IDAKKyAgICAgICAqLworICAgICAgcCA9IGhTYnJHcmlkLT5wOworICAgICAgaWYgKHAgPT0gMCkgeworICAgICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IG5FbnYgKyAxIC0gcDsKKyAgICAgIH0KIAotICAgIGZvciAoayA9IDAsIGkgPSBuRW52IC0gMTsgayA8IG5FbnY7IGsrKywgaS0tKSB7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzW2ldID0gKEZSRVFfUkVTKXZfZltrXTsKLSAgICB9CisgICAgICBmb3IgKGsgPSAwLCBpID0gbkVudiAtIDE7IGsgPCBuRW52OyBrKyssIGktLSkgeworICAgICAgICBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzW2ldID0gKEZSRVFfUkVTKXZfZltrXTsKKyAgICAgIH0KIAotICAgIC8qIGlmIGVpdGhlciB0aGVyZSBpcyBubyBzaG9ydCBlbnZlbG9wZSBvciB0aGUgbGFzdCBlbnZlbG9wZSBpcyBzaG9ydC4uLiAqLwotICAgIGlmIChwID09IDAgfHwgcCA9PSAxKSB7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnYgLSAxXTsKLSAgICB9IGVsc2UgewotICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1toU2JyRnJhbWVJbmZvLT5zaG9ydEVudl07Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSBWQVJGSVg6Ci0gICAgLyogaW4gdGhpcyBjYXNlICdib3JkZXInIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgdGhlIDFzdCBlbnZlbG9wZSAqLwotICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBib3JkZXI7Ci0KLSAgICBmb3IgKGsgPSAwOyBrIDwgbkVudiAtIDE7IGsrKykgewotICAgICAgYm9yZGVyICs9IHZfcltrXTsKLSAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbayArIDFdID0gYm9yZGVyOwotICAgIH0KLQotICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudl0gPSBidWZmZXJGcmFtZVN0YXJ0ICsgbnVtYmVyVGltZVNsb3RzOwotCi0gICAgcCA9IGhTYnJHcmlkLT5wOwotICAgIGlmIChwID09IDAgfHwgcCA9PSAxKSB7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gcCAtIDE7Ci0gICAgfQotCi0gICAgZm9yIChrID0gMDsgayA8IG5FbnY7IGsrKykgewotICAgICAgaFNickZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IChGUkVRX1JFUyl2X2Zba107Ci0gICAgfQotCi0gICAgc3dpdGNoIChwKSB7Ci0gICAgY2FzZSAwOgotICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1sxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudiAtIDFdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaFNickZyYW1lSW5mby0+c2hvcnRFbnZdOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgVkFSVkFSOgotICAgIG5FbnYgPSBoU2JyR3JpZC0+YnNfbnVtX3JlbF8wICsgaFNickdyaWQtPmJzX251bV9yZWxfMSArIDE7Ci0gICAgRkRLX0FTU0VSVChuRW52IDw9IE1BWF9FTlZFTE9QRVNfVkFSVkFSKTsgLyoganVzdCB0byBiZSBzdXJlICovCi0gICAgaFNickZyYW1lSW5mby0+bkVudmVsb3BlcyA9IG5FbnY7Ci0KLSAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gYm9yZGVyID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzA7Ci0KLSAgICBmb3IgKGsgPSAwLCBpID0gMTsgayA8IGhTYnJHcmlkLT5ic19udW1fcmVsXzA7IGsrKywgaSsrKSB7Ci0gICAgICBib3JkZXIgKz0gaFNickdyaWQtPmJzX3JlbF9ib3JkXzBba107Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gYm9yZGVyOwotICAgIH0KLQotICAgIGJvcmRlciA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8xOwotICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudl0gPSBib3JkZXI7Ci0KLSAgICBmb3IgKGsgPSAwLCBpID0gbkVudiAtIDE7IGsgPCBoU2JyR3JpZC0+YnNfbnVtX3JlbF8xOyBrKyssIGktLSkgewotICAgICAgYm9yZGVyIC09IGhTYnJHcmlkLT5ic19yZWxfYm9yZF8xW2tdOwotICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsKLSAgICB9Ci0KLSAgICBwID0gaFNickdyaWQtPnA7Ci0gICAgaWYgKHAgPT0gMCkgewotICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IG5FbnYgKyAxIC0gcDsKLSAgICB9Ci0KLSAgICBmb3IgKGsgPSAwOyBrIDwgbkVudjsgaysrKSB7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzW2tdID0gKEZSRVFfUkVTKWhTYnJHcmlkLT52X2ZMUltrXTsKLSAgICB9Ci0KLSAgICBpZiAobkVudiA9PSAxKSB7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXMgPSAxOwotICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzA7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMTsKLSAgICB9IGVsc2UgewotICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMjsKLSAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVswXSA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8wOwotCisgICAgICAvKiBpZiBlaXRoZXIgdGhlcmUgaXMgbm8gc2hvcnQgZW52ZWxvcGUgb3IgdGhlIGxhc3QgZW52ZWxvcGUgaXMgc2hvcnQuLi4KKyAgICAgICAqLwogICAgICAgaWYgKHAgPT0gMCB8fCBwID09IDEpIHsKICAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52IC0gMV07CiAgICAgICB9IGVsc2UgewotICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2hTYnJGcmFtZUluZm8tPnNob3J0RW52XTsKKyAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0KKyAgICAgICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaFNickZyYW1lSW5mby0+c2hvcnRFbnZdOwogICAgICAgfQotICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzJdID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzE7Ci0gICAgfQotICAgIGJyZWFrOwogCi0gIGRlZmF1bHQ6Ci0gICAgLyogZG8gbm90aGluZyAqLwotICAgIGJyZWFrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFZBUkZJWDoKKyAgICAgIC8qIGluIHRoaXMgY2FzZSAnYm9yZGVyJyBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSAxc3QgZW52ZWxvcGUgKi8KKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBib3JkZXI7CisKKyAgICAgIGZvciAoayA9IDA7IGsgPCBuRW52IC0gMTsgaysrKSB7CisgICAgICAgIGJvcmRlciArPSB2X3Jba107CisgICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbayArIDFdID0gYm9yZGVyOworICAgICAgfQorCisgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90czsKKworICAgICAgcCA9IGhTYnJHcmlkLT5wOworICAgICAgaWYgKHAgPT0gMCB8fCBwID09IDEpIHsKKyAgICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSBwIC0gMTsKKyAgICAgIH0KKworICAgICAgZm9yIChrID0gMDsgayA8IG5FbnY7IGsrKykgeworICAgICAgICBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzW2tdID0gKEZSRVFfUkVTKXZfZltrXTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChwKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzFdOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52IC0gMV07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0KKyAgICAgICAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1toU2JyRnJhbWVJbmZvLT5zaG9ydEVudl07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVkFSVkFSOgorICAgICAgbkVudiA9IGhTYnJHcmlkLT5ic19udW1fcmVsXzAgKyBoU2JyR3JpZC0+YnNfbnVtX3JlbF8xICsgMTsKKyAgICAgIEZES19BU1NFUlQobkVudiA8PSBNQVhfRU5WRUxPUEVTX1ZBUlZBUik7IC8qIGp1c3QgdG8gYmUgc3VyZSAqLworICAgICAgaFNickZyYW1lSW5mby0+bkVudmVsb3BlcyA9IG5FbnY7CisKKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBib3JkZXIgPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMDsKKworICAgICAgZm9yIChrID0gMCwgaSA9IDE7IGsgPCBoU2JyR3JpZC0+YnNfbnVtX3JlbF8wOyBrKyssIGkrKykgeworICAgICAgICBib3JkZXIgKz0gaFNickdyaWQtPmJzX3JlbF9ib3JkXzBba107CisgICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBib3JkZXI7CisgICAgICB9CisKKyAgICAgIGJvcmRlciA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8xOworICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XSA9IGJvcmRlcjsKKworICAgICAgZm9yIChrID0gMCwgaSA9IG5FbnYgLSAxOyBrIDwgaFNickdyaWQtPmJzX251bV9yZWxfMTsgaysrLCBpLS0pIHsKKyAgICAgICAgYm9yZGVyIC09IGhTYnJHcmlkLT5ic19yZWxfYm9yZF8xW2tdOworICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gYm9yZGVyOworICAgICAgfQorCisgICAgICBwID0gaFNickdyaWQtPnA7CisgICAgICBpZiAocCA9PSAwKSB7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gbkVudiArIDEgLSBwOworICAgICAgfQorCisgICAgICBmb3IgKGsgPSAwOyBrIDwgbkVudjsgaysrKSB7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNba10gPSAoRlJFUV9SRVMpaFNickdyaWQtPnZfZkxSW2tdOworICAgICAgfQorCisgICAgICBpZiAobkVudiA9PSAxKSB7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDE7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVswXSA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8wOworICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDI7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVswXSA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8wOworCisgICAgICAgIGlmIChwID09IDAgfHwgcCA9PSAxKSB7CisgICAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52IC0gMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0KKyAgICAgICAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1toU2JyRnJhbWVJbmZvLT5zaG9ydEVudl07CisgICAgICAgIH0KKyAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzJdID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzE7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBkbyBub3RoaW5nICovCisgICAgICBicmVhazsKICAgfQogCiAgIGlmIChmcmFtZUNsYXNzID09IFZBUkZJWCB8fCBmcmFtZUNsYXNzID09IEZJWFZBUikgewpAQCAtMjA2Miw0ICsxOTYzLDMgQEAKICAgICB9CiAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9mcmFtX2dlbi5oIGIvbGliU0JSZW5jL3NyYy9mcmFtX2dlbi5oCmluZGV4IDAwNDczZDQuLjBjNWVkYzMgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvZnJhbV9nZW4uaAorKysgYi9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNTAgKzkwLDY0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgRnJhbWluZyBnZW5lcmF0b3IgcHJvdG90eXBlcyBhbmQgc3RydWN0cyAgCisgIFxicmllZiAgRnJhbWluZyBnZW5lcmF0b3IgcHJvdG90eXBlcyBhbmQgc3RydWN0cyAkUmV2aXNpb246IDkyNzkwICQKICovCi0jaWZuZGVmIF9GUkFNX0dFTl9ICi0jZGVmaW5lIF9GUkFNX0dFTl9ICisjaWZuZGVmIEZSQU1fR0VOX0gKKyNkZWZpbmUgRlJBTV9HRU5fSAogCiAjaW5jbHVkZSAic2JyX2RlZi5oIiAvKiBmb3IgTUFYX0VOVkVMT1BFUyBhbmQgTUFYX05PSVNFX0VOVkVMT1BFUyBpbiBzdHJ1Y3QgRlJBTUVfSU5GTyBhbmQgQ09ERUNfVFlQRSAqLwogI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiIC8qIGZvciBGUkVRX1JFUyAqLwogCi0jZGVmaW5lIE1BWF9FTlZFTE9QRVNfVkFSVkFSIE1BWF9FTlZFTE9QRVMgLyohPCB3b3JzdCBjYXNlIG51bWJlciBvZiBlbnZlbG9wZXMgaW4gYSBWQVJWQVIgZnJhbWUgKi8KLSNkZWZpbmUgTUFYX0VOVkVMT1BFU19GSVhWQVJfVkFSRklYIDQgLyohPCB3b3JzdCBjYXNlIG51bWJlciBvZiBlbnZlbG9wZXMgaW4gVkFSRklYIGFuZCBGSVhWQVIgZnJhbWVzICovCi0jZGVmaW5lIE1BWF9OVU1fUkVMIDMgLyohPCBtYXhpbXVtIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzIGluIGFueSBWQVIgZnJhbWUgKi8KKyNkZWZpbmUgTUFYX0VOVkVMT1BFU19WQVJWQVIgXAorICBNQVhfRU5WRUxPUEVTIC8qITwgd29yc3QgY2FzZSBudW1iZXIgb2YgZW52ZWxvcGVzIGluIGEgVkFSVkFSIGZyYW1lICovCisjZGVmaW5lIE1BWF9FTlZFTE9QRVNfRklYVkFSX1ZBUkZJWCBcCisgIDQgLyohPCB3b3JzdCBjYXNlIG51bWJlciBvZiBlbnZlbG9wZXMgaW4gVkFSRklYIGFuZCBGSVhWQVIgZnJhbWVzICovCisjZGVmaW5lIE1BWF9OVU1fUkVMIFwKKyAgMyAvKiE8IG1heGltdW0gbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnMgaW4gYW55IFZBUiBmcmFtZSAqLwogCiAvKiBTQlIgZnJhbWUgY2xhc3MgZGVmaW5pdGlvbnMgKi8KIHR5cGVkZWYgZW51bSB7Ci0gIEZJWEZJWCA9IDAsIC8qITwgYnNfZnJhbWVfY2xhc3M6IGxlYWRpbmcgYW5kIHRyYWlsaW5nIGZyYW1lIGJvcmRlcnMgYXJlIGZpeGVkICovCi0gIEZJWFZBUiwgICAgIC8qITwgYnNfZnJhbWVfY2xhc3M6IGxlYWRpbmcgZnJhbWUgYm9yZGVyIGlzIGZpeGVkLCB0cmFpbGluZyBmcmFtZSBib3JkZXIgaXMgdmFyaWFibGUgKi8KLSAgVkFSRklYLCAgICAgLyohPCBic19mcmFtZV9jbGFzczogbGVhZGluZyBmcmFtZSBib3JkZXIgaXMgdmFyaWFibGUsIHRyYWlsaW5nIGZyYW1lIGJvcmRlciBpcyBmaXhlZCAqLwotICBWQVJWQVIgICAgICAvKiE8IGJzX2ZyYW1lX2NsYXNzOiBsZWFkaW5nIGFuZCB0cmFpbGluZyBmcmFtZSBib3JkZXJzIGFyZSB2YXJpYWJsZSAqLwotICAsRklYRklYb25seSAgLyohPCBic19mcmFtZV9jbGFzczogbGVhZGluZyBib3JkZXIgZml4ZWQgKDApLCB0cmFpbGluZyBib3JkZXIgZml4ZWQgKG5yVGltZVNsb3RzKSBhbmQgZW5jYXNlZCBib3JkZXJzIGFyZSBkeW5hbWljYWxseSBkZXJpdmVkIGZyb20gdGhlIHRyYW5Qb3MgKi8KLX1GUkFNRV9DTEFTUzsKLQorICBGSVhGSVggPQorICAgICAgMCwgIC8qITwgYnNfZnJhbWVfY2xhc3M6IGxlYWRpbmcgYW5kIHRyYWlsaW5nIGZyYW1lIGJvcmRlcnMgYXJlIGZpeGVkICovCisgIEZJWFZBUiwgLyohPCBic19mcmFtZV9jbGFzczogbGVhZGluZyBmcmFtZSBib3JkZXIgaXMgZml4ZWQsIHRyYWlsaW5nIGZyYW1lCisgICAgICAgICAgICAgYm9yZGVyIGlzIHZhcmlhYmxlICovCisgIFZBUkZJWCwgLyohPCBic19mcmFtZV9jbGFzczogbGVhZGluZyBmcmFtZSBib3JkZXIgaXMgdmFyaWFibGUsIHRyYWlsaW5nIGZyYW1lCisgICAgICAgICAgICAgYm9yZGVyIGlzIGZpeGVkICovCisgIFZBUlZBUiAvKiE8IGJzX2ZyYW1lX2NsYXNzOiBsZWFkaW5nIGFuZCB0cmFpbGluZyBmcmFtZSBib3JkZXJzIGFyZSB2YXJpYWJsZSAqLworICAsCisgIEZJWEZJWG9ubHkgLyohPCBic19mcmFtZV9jbGFzczogbGVhZGluZyBib3JkZXIgZml4ZWQgKDApLCB0cmFpbGluZyBib3JkZXIKKyAgICAgICAgICAgICAgICBmaXhlZCAobnJUaW1lU2xvdHMpIGFuZCBlbmNhc2VkIGJvcmRlcnMgYXJlIGR5bmFtaWNhbGx5IGRlcml2ZWQKKyAgICAgICAgICAgICAgICBmcm9tIHRoZSB0cmFuUG9zICovCit9IEZSQU1FX0NMQVNTOwogCiAvKiBoZWxwZXIgY29uc3RhbnRzICovCi0jZGVmaW5lIERDICAgICAgNDcxMSAgICAgICAgLyohPCBoZWxwZXIgY29uc3RhbnQ6IGRvbid0IGNhcmUgKi8KLSNkZWZpbmUgRU1QVFkgICAoLTk5KSAgICAgICAvKiE8IGhlbHBlciBjb25zdGFudDogZW1wdHkgKi8KLQorI2RlZmluZSBEQyA0NzExICAgICAvKiE8IGhlbHBlciBjb25zdGFudDogZG9uJ3QgY2FyZSAqLworI2RlZmluZSBFTVBUWSAoLTk5KSAvKiE8IGhlbHBlciBjb25zdGFudDogZW1wdHkgKi8KIAogLyogc3lzdGVtIGNvbnN0YW50czogQUFDK1NCUiwgRFJNIEZyYW1lLUxlbmd0aCAqLwotI2RlZmluZSBGUkFNRV9NSURETEVfU0xPVF8xOTIwICA0Ci0jZGVmaW5lIE5VTUJFUl9USU1FX1NMT1RTXzE5MjAgIDE1CisjZGVmaW5lIEZSQU1FX01JRERMRV9TTE9UXzE5MjAgNAorI2RlZmluZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwIDE1CiAKLSNkZWZpbmUgTERfUFJFVFJBTl9PRkYgICAgICAgICAgIDMKLSNkZWZpbmUgRlJBTUVfTUlERExFX1NMT1RfNTEyTEQgIDQKLSNkZWZpbmUgTlVNQkVSX1RJTUVfU0xPVFNfNTEyTEQgIDgKLSNkZWZpbmUgVFJBTlNJRU5UX09GRlNFVF9MRCAgICAgIDAKLQotCisjZGVmaW5lIExEX1BSRVRSQU5fT0ZGIDMKKyNkZWZpbmUgRlJBTUVfTUlERExFX1NMT1RfNTEyTEQgNAorI2RlZmluZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRCA4CisjZGVmaW5lIFRSQU5TSUVOVF9PRkZTRVRfTEQgMAogCiAvKgotc3lzdGVtIGNvbnN0YW50czogQUFDK1NCUiBvciBhYWNQUk8gKGh5YnJpZCBmb3JtYXQpLCBTdGFuZGFyZCBGcmFtZS1MZW5ndGgsIE11bHRpLVJhdGUKK3N5c3RlbSBjb25zdGFudHM6IEFBQytTQlIgb3IgYWFjUFJPIChoeWJyaWQgZm9ybWF0KSwgU3RhbmRhcmQgRnJhbWUtTGVuZ3RoLAorTXVsdGktUmF0ZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOdW1iZXIgb2Ygc2xvdHMgKG51bWJlclRpbWVTbG90cyk6IDE2ICAoTlVNQkVSX1RJTUVfU0xPVFNfMjA0OCkKIERldGVjdG9yLW9mZnNldCAoZnJhbWVNaWRkbGVTbG90KTogIDQKQEAgLTE0MSwxMiArMTY2LDExIEBACiAKIHwtfC18LXwtfC18LXwtfC1CLXwtfC18LXwtfC18LXwtfC18LXwtfC18LXwtfC18LUItfC18LXwtfC18LXwtfC18LXwtfC18LXwtfC18LXwtfAogCi1mcmFtZS1nZW5lcmF0b3I6MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgMjQgICAgICAgICAgICAgIDMyCi1hbmFseXNpcy1idWZmZXI6OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgIDQwCitmcmFtZS1nZW5lcmF0b3I6MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgMjQgMzIKK2FuYWx5c2lzLWJ1ZmZlcjo4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0ICAgICAgICAgICAgICAzMiA0MAogKi8KLSNkZWZpbmUgRlJBTUVfTUlERExFX1NMT1RfMjA0OCAgNAotI2RlZmluZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4ICAxNgotCisjZGVmaW5lIEZSQU1FX01JRERMRV9TTE9UXzIwNDggNAorI2RlZmluZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4IDE2CiAKIC8qCiBzeXN0ZW0gY29uc3RhbnRzOiBtcDNQUk8sIE11bHRpLVJhdGUgJiBTaW5nbGUtUmF0ZQpAQCAtMTcxLDE0ICsxOTUsMTIgQEAKIGZyYW1lLWdlbmVyYXRvcjogMCAgICAgICAgICAgICAgICAgOSAgICAgICAxMyAgICAgICAgMTgKIGFuYWx5c2lzLWJ1ZmZlcjogNC41ICAgICAgICAgICAgICAgMTMuNSAgICAgICAgICAgICAgMjIuNQogKi8KLSNkZWZpbmUgRlJBTUVfTUlERExFX1NMT1RfMTE1MiAgNAotI2RlZmluZSBOVU1CRVJfVElNRV9TTE9UU18xMTUyICA5Ci0KKyNkZWZpbmUgRlJBTUVfTUlERExFX1NMT1RfMTE1MiA0CisjZGVmaW5lIE5VTUJFUl9USU1FX1NMT1RTXzExNTIgOQogCiAvKiBzeXN0ZW0gY29uc3RhbnRzOiBMYXllcjIrU0JSICovCi0jZGVmaW5lIEZSQU1FX01JRERMRV9TTE9UXzIzMDQgIDgKLSNkZWZpbmUgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNCAgMTgKLQorI2RlZmluZSBGUkFNRV9NSURETEVfU0xPVF8yMzA0IDgKKyNkZWZpbmUgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNCAxOAogCiAvKiEKICAgXHN0cnVjdCBTQlJfR1JJRApAQCAtMTg3LDEyMyArMjA5LDEzNSBAQAogICBUaGUgdmFyaWFibGVzIGhvbGQgdGhlIHNpZ25hbHMgKGUuZy4gbGVuZ3RocyBhbmQgbnVtYmVycykgaW4gImNsZWFyIHRleHQiCiAqLwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAvKiBzeXN0ZW0gY29uc3RhbnRzICovCi0gIElOVCBidWZmZXJGcmFtZVN0YXJ0OyAgICAgLyohPCBmcmFtZSBnZW5lcmF0b3IgdnMgYW5hbHlzaXMgYnVmZmVyIHRpbWUgYWxpZ25tZW50IChjdXJyZW50bHkgc2V0IHRvIDAsIG9mZnNldCBhZGRlZCBlbHNld2hlcmUpICovCi0gIElOVCBudW1iZXJUaW1lU2xvdHM7ICAgICAgLyohPCBudW1iZXIgb2YgU0JSIHRpbWVzbG90cyBwZXIgZnJhbWUgKi8KKyAgSU5UIGJ1ZmZlckZyYW1lU3RhcnQ7IC8qITwgZnJhbWUgZ2VuZXJhdG9yIHZzIGFuYWx5c2lzIGJ1ZmZlciB0aW1lIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRseSBzZXQgdG8gMCwgb2Zmc2V0IGFkZGVkIGVsc2V3aGVyZSkgKi8KKyAgSU5UIG51bWJlclRpbWVTbG90czsgIC8qITwgbnVtYmVyIG9mIFNCUiB0aW1lc2xvdHMgcGVyIGZyYW1lICovCiAKICAgLyogd2lsbCBiZSBhZGp1c3RlZCBmb3IgZXZlcnkgZnJhbWUgKi8KLSAgRlJBTUVfQ0xBU1MgZnJhbWVDbGFzczsgICAvKiE8IFNCUiBmcmFtZSBjbGFzcyAgKi8KLSAgSU5UIGJzX251bV9lbnY7ICAgICAgICAgICAvKiE8IGJzX251bV9lbnYsIG51bWJlciBvZiBlbnZlbG9wZXMgZm9yIEZJWEZJWCAqLwotICBJTlQgYnNfYWJzX2JvcmQ7ICAgICAgICAgIC8qITwgYnNfYWJzX2JvcmQsIGFic29sdXRlIGJvcmRlciBmb3IgVkFSRklYIGFuZCBGSVhWQVIgKi8KLSAgSU5UIG47ICAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzIGZvciBWQVJGSVggYW5kIEZJWFZBUiAgICovCi0gIElOVCBwOyAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyLXRvLXRyYW5zaWVudC1ib3JkZXIgICovCi0gIElOVCBic19yZWxfYm9yZFtNQVhfTlVNX1JFTF07ICAgICAgICAgLyohPCBic19yZWxfYm9yZCwgcmVsYXRpdmUgYm9yZGVycyBmb3IgYWxsIFZBUiAqLwotICBJTlQgdl9mW01BWF9FTlZFTE9QRVNfRklYVkFSX1ZBUkZJWF07IC8qITwgZW52ZWxvcGUgZnJlcXVlbmN5IHJlc29sdXRpb25zIGZvciBGSVhWQVIgYW5kIFZBUkZJWCAgKi8KKyAgRlJBTUVfQ0xBU1MgZnJhbWVDbGFzczsgLyohPCBTQlIgZnJhbWUgY2xhc3MgICovCisgIElOVCBic19udW1fZW52OyAgICAgICAgIC8qITwgYnNfbnVtX2VudiwgbnVtYmVyIG9mIGVudmVsb3BlcyBmb3IgRklYRklYICovCisgIElOVCBic19hYnNfYm9yZDsgLyohPCBic19hYnNfYm9yZCwgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJGSVggYW5kIEZJWFZBUiAqLworICBJTlQgbjsgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnMgZm9yIFZBUkZJWCBhbmQgRklYVkFSICAgKi8KKyAgSU5UIHA7ICAgICAgICAgICAvKiE8IHBvaW50ZXItdG8tdHJhbnNpZW50LWJvcmRlciAgKi8KKyAgSU5UIGJzX3JlbF9ib3JkW01BWF9OVU1fUkVMXTsgLyohPCBic19yZWxfYm9yZCwgcmVsYXRpdmUgYm9yZGVycyBmb3IgYWxsIFZBUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSU5UIHZfZltNQVhfRU5WRUxPUEVTX0ZJWFZBUl9WQVJGSVhdOyAvKiE8IGVudmVsb3BlIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhWQVIgYW5kIFZBUkZJWCAgKi8KIAotICBJTlQgYnNfYWJzX2JvcmRfMDsgICAgICAgIC8qITwgYnNfYWJzX2JvcmRfMCwgbGVhZGluZyBhYnNvbHV0ZSBib3JkZXIgZm9yIFZBUlZBUiAqLwotICBJTlQgYnNfYWJzX2JvcmRfMTsgICAgICAgIC8qITwgYnNfYWJzX2JvcmRfMSwgdHJhaWxpbmcgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJWQVIgKi8KLSAgSU5UIGJzX251bV9yZWxfMDsgICAgICAgICAvKiE8IGJzX251bV9yZWxfMCwgbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnMgYXNzb2NpYXRlZCB3aXRoIGxlYWRpbmcgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJWQVIgKi8KLSAgSU5UIGJzX251bV9yZWxfMTsgICAgICAgICAvKiE8IGJzX251bV9yZWxfMSwgbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnMgYXNzb2NpYXRlZCB3aXRoIHRyYWlsaW5nIGFic29sdXRlIGJvcmRlciBmb3IgVkFSVkFSICovCi0gIElOVCBic19yZWxfYm9yZF8wW01BWF9OVU1fUkVMXTsgICAgICAgLyohPCBic19yZWxfYm9yZF8wLCByZWxhdGl2ZSBib3JkZXJzIGFzc29jaWF0ZWQgd2l0aCBsZWFkaW5nIGFic29sdXRlIGJvcmRlciBmb3IgVkFSVkFSICovCi0gIElOVCBic19yZWxfYm9yZF8xW01BWF9OVU1fUkVMXTsgICAgICAgLyohPCBic19yZWxfYm9yZF8xLCByZWxhdGl2ZSBib3JkZXJzIGFzc29jaWF0ZWQgd2l0aCB0cmFpbGluZyBhYnNvbHV0ZSBib3JkZXIgZm9yIFZBUlZBUiAqLwotICBJTlQgdl9mTFJbTUFYX0VOVkVMT1BFU19WQVJWQVJdOyAgICAgIC8qITwgZW52ZWxvcGUgZnJlcXVlbmN5IHJlc29sdXRpb25zIGZvciBWQVJWQVIgICovCisgIElOVCBic19hYnNfYm9yZF8wOyAvKiE8IGJzX2Fic19ib3JkXzAsIGxlYWRpbmcgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJWQVIgKi8KKyAgSU5UIGJzX2Fic19ib3JkXzE7IC8qITwgYnNfYWJzX2JvcmRfMSwgdHJhaWxpbmcgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJWQVIgKi8KKyAgSU5UIGJzX251bV9yZWxfMDsgIC8qITwgYnNfbnVtX3JlbF8wLCBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVycyBhc3NvY2lhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGxlYWRpbmcgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJWQVIgKi8KKyAgSU5UIGJzX251bV9yZWxfMTsgIC8qITwgYnNfbnVtX3JlbF8xLCBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVycyBhc3NvY2lhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRyYWlsaW5nIGFic29sdXRlIGJvcmRlciBmb3IgVkFSVkFSICovCisgIElOVCBic19yZWxfYm9yZF8wW01BWF9OVU1fUkVMXTsgIC8qITwgYnNfcmVsX2JvcmRfMCwgcmVsYXRpdmUgYm9yZGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggIGxlYWRpbmcgYWJzb2x1dGUgYm9yZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAgVkFSVkFSICovCisgIElOVCBic19yZWxfYm9yZF8xW01BWF9OVU1fUkVMXTsgIC8qITwgYnNfcmVsX2JvcmRfMSwgcmVsYXRpdmUgYm9yZGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdHJhaWxpbmcgYWJzb2x1dGUgYm9yZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBWQVJWQVIgKi8KKyAgSU5UIHZfZkxSW01BWF9FTlZFTE9QRVNfVkFSVkFSXTsgLyohPCBlbnZlbG9wZSBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUlZBUiAgKi8KIAotfQotU0JSX0dSSUQ7Cit9IFNCUl9HUklEOwogdHlwZWRlZiBTQlJfR1JJRCAqSEFORExFX1NCUl9HUklEOwogCi0KLQogLyohCiAgIFxzdHJ1Y3QgU0JSX0ZSQU1FX0lORk8KICAgXGJyaWVmICB0aW1lL2ZyZXF1ZW5jeSBncmlkIGRlc2NyaXB0aW9uIGZvciBvbmUgZnJhbWUKICovCi10eXBlZGVmIHN0cnVjdAotewotICBJTlQgbkVudmVsb3BlczsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgZW52ZWxvcGVzICovCi0gIElOVCBib3JkZXJzW01BWF9FTlZFTE9QRVMrMV07ICAgICAgICAgICAvKiE8IGVudmVsb3BlIGJvcmRlcnMgaW4gU0JSIHRpbWVzbG90cyAqLwotICBGUkVRX1JFUyBmcmVxUmVzW01BWF9FTlZFTE9QRVNdOyAgICAgICAgLyohPCBmcmVxdWVuY3kgcmVzb2x1dGlvbiBvZiBlYWNoIGVudmVsb3BlICovCi0gIElOVCBzaG9ydEVudjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBhbiBlbnZlbG9wZSB0byBiZSBzaG9ydGVuZWQgKHN0YXJ0aW5nIGF0IDEpIG9yIDAgZm9yIG5vIHNob3J0ZW5lZCBlbnZlbG9wZSAqLwotICBJTlQgbk5vaXNlRW52ZWxvcGVzOyAgICAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2Ygbm9pc2UgZmxvb3JzICovCi0gIElOVCBib3JkZXJzTm9pc2VbTUFYX05PSVNFX0VOVkVMT1BFUysxXTsvKiE8IG5vaXNlIGZsb29yIGJvcmRlcnMgaW4gU0JSIHRpbWVzbG90cyAqLwotfQotU0JSX0ZSQU1FX0lORk87Ci0vKiBXQVJOSU5HOiBXaGVuIHJlYXJyYW5naW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzIHN0cnVjdCBrZWVwIGluIG1pbmQgdGhhdCB0aGUgc3RhdGljCi0gKiBpbml0aWFsaXphdGlvbnMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgQy1maWxlIGhhdmUgdG8gYmUgcmVhcnJhbmdlZCBhcyB3ZWxsIQotICogc25kIDIwMDIvMDEvMjMKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIG5FbnZlbG9wZXM7ICAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgZW52ZWxvcGVzICovCisgIElOVCBib3JkZXJzW01BWF9FTlZFTE9QRVMgKyAxXTsgIC8qITwgZW52ZWxvcGUgYm9yZGVycyBpbiBTQlIgdGltZXNsb3RzICovCisgIEZSRVFfUkVTIGZyZXFSZXNbTUFYX0VOVkVMT1BFU107IC8qITwgZnJlcXVlbmN5IHJlc29sdXRpb24gb2YgZWFjaCBlbnZlbG9wZSAqLworICBJTlQgc2hvcnRFbnY7IC8qITwgbnVtYmVyIG9mIGFuIGVudmVsb3BlIHRvIGJlIHNob3J0ZW5lZCAoc3RhcnRpbmcgYXQgMSkgb3IgMAorICAgICAgICAgICAgICAgICAgIGZvciBubyBzaG9ydGVuZWQgZW52ZWxvcGUgKi8KKyAgSU5UIG5Ob2lzZUVudmVsb3BlczsgLyohPCBudW1iZXIgb2Ygbm9pc2UgZmxvb3JzICovCisgIElOVCBib3JkZXJzTm9pc2VbTUFYX05PSVNFX0VOVkVMT1BFUyArCisgICAgICAgICAgICAgICAgICAgMV07IC8qITwgbm9pc2UgZmxvb3IgYm9yZGVycyBpbiBTQlIgdGltZXNsb3RzICovCit9IFNCUl9GUkFNRV9JTkZPOworLyogV0FSTklORzogV2hlbiByZWFycmFuZ2luZyB0aGUgZWxlbWVudHMgb2YgdGhpcyBzdHJ1Y3Qga2VlcCBpbiBtaW5kIHRoYXQgdGhlCisgKiBzdGF0aWMgaW5pdGlhbGl6YXRpb25zIGluIHRoZSBjb3JyZXNwb25kaW5nIEMtZmlsZSBoYXZlIHRvIGJlIHJlYXJyYW5nZWQgYXMKKyAqIHdlbGwhIHNuZCAyMDAyLzAxLzIzCiAgKi8KIHR5cGVkZWYgU0JSX0ZSQU1FX0lORk8gKkhBTkRMRV9TQlJfRlJBTUVfSU5GTzsKIAotCiAvKiEKICAgXHN0cnVjdCBTQlJfRU5WRUxPUEVfRlJBTUUKICAgXGJyaWVmICBmcmFtZSBnZW5lcmF0b3IgbWFpbiBzdHJ1Y3QKIAotICBDb250YWlucyB0dW5pbmcgcGFyYW1ldGVycywgdGltZS9mcmVxdWVuY3kgZ3JpZCBkZXNjcmlwdGlvbiwgc2JyX2dyaWQoKSBiaXRzdHJlYW0gZWxlbWVudHMsIGFuZCBnZW5lcmF0b3IgaW50ZXJuYWwgc2lnbmFscworICBDb250YWlucyB0dW5pbmcgcGFyYW1ldGVycywgdGltZS9mcmVxdWVuY3kgZ3JpZCBkZXNjcmlwdGlvbiwgc2JyX2dyaWQoKQorICBiaXRzdHJlYW0gZWxlbWVudHMsIGFuZCBnZW5lcmF0b3IgaW50ZXJuYWwgc2lnbmFscwogKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIC8qIHN5c3RlbSBjb25zdGFudHMgKi8KLSAgSU5UIGZyYW1lTWlkZGxlU2xvdDsgICAgICAvKiE8IHRyYW5zaWVudCBkZXRlY3RvciBvZmZzZXQgaW4gU0JSIHRpbWVzbG90cyAqLworICBJTlQgZnJhbWVNaWRkbGVTbG90OyAvKiE8IHRyYW5zaWVudCBkZXRlY3RvciBvZmZzZXQgaW4gU0JSIHRpbWVzbG90cyAqLwogCiAgIC8qIGJhc2ljIHR1bmluZyBwYXJhbWV0ZXJzICovCi0gIElOVCBzdGF0aWNGcmFtaW5nOyAgICAgICAgICAgLyohPCAxOiBydW4gc3RhdGljIGZyYW1pbmcgaW4gdGltZSwgaS5lLiBleGNsdXNpdmUgdXNlIG9mIGJzX2ZyYW1lX2NsYXNzID0gRklYRklYICovCi0gIElOVCBudW1FbnZTdGF0aWM7ICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgZW52ZWxvcGVzIHBlciBmcmFtZSBmb3Igc3RhdGljIGZyYW1pbmcgKi8KLSAgRlJFUV9SRVMgZnJlcV9yZXNfZml4Zml4WzJdOyAvKiE8IGVudmVsb3BlIGZyZXF1ZW5jeSByZXNvbHV0aW9uIHRvIHVzZSBmb3IgYnNfZnJhbWVfY2xhc3MgPSBGSVhGSVg7IHNpbmdsZSBlbnYgYW5kIHNwbGl0ICovCi0gIFVDSEFSIGZSZXNUcmFuc0lzTG93OyAgICAgICAgLyohPCBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgdHJhbnNpZW50IGZyYW1lcyAtIGFsd2F5cyBsb3cgKDApIG9yIGFjY29yZGluZyB0byB0YWJsZSAoMSkgKi8KKyAgSU5UIHN0YXRpY0ZyYW1pbmc7IC8qITwgMTogcnVuIHN0YXRpYyBmcmFtaW5nIGluIHRpbWUsIGkuZS4gZXhjbHVzaXZlIHVzZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgYnNfZnJhbWVfY2xhc3MgPSBGSVhGSVggKi8KKyAgSU5UIG51bUVudlN0YXRpYzsgIC8qITwgbnVtYmVyIG9mIGVudmVsb3BlcyBwZXIgZnJhbWUgZm9yIHN0YXRpYyBmcmFtaW5nICovCisgIEZSRVFfUkVTCisgIGZyZXFfcmVzX2ZpeGZpeFsyXTsgLyohPCBlbnZlbG9wZSBmcmVxdWVuY3kgcmVzb2x1dGlvbiB0byB1c2UgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgYnNfZnJhbWVfY2xhc3MgPSBGSVhGSVg7IHNpbmdsZSBlbnYgYW5kIHNwbGl0ICovCisgIFVDSEFSCisgIGZSZXNUcmFuc0lzTG93OyAvKiE8IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciB0cmFuc2llbnQgZnJhbWVzIC0gYWx3YXlzCisgICAgICAgICAgICAgICAgICAgICBsb3cgKDApIG9yIGFjY29yZGluZyB0byB0YWJsZSAoMSkgKi8KIAogICAvKiBleHBlcnQgdHVuaW5nIHBhcmFtZXRlcnMgKi8KLSAgY29uc3QgaW50ICp2X3R1bmluZ1NlZ207ICAvKiE8IHNlZ21lbnQgbGVuZ3RocyB0byB1c2UgYXJvdW5kIHRyYW5zaWVudCAqLwotICBjb25zdCBpbnQgKnZfdHVuaW5nRnJlcTsgIC8qITwgZnJlcXVlbmN5IHJlc29sdXRpb25zIHRvIHVzZSBhcm91bmQgdHJhbnNpZW50ICovCi0gIElOVCBkbWluOyAgICAgICAgICAgICAgICAgLyohPCBtaW5pbXVtIGxlbmd0aCBvZiBkZXBlbmRlbnQgc2VnbWVudHMgKi8KLSAgSU5UIGRtYXg7ICAgICAgICAgICAgICAgICAvKiE8IG1heGltdW0gbGVuZ3RoIG9mIGRlcGVuZGVudCBzZWdtZW50cyAqLwotICBJTlQgYWxsb3dTcHJlYWQ7ICAgICAgICAgIC8qITwgMTogYWxsb3cgaXNvbGF0ZWQgdHJhbnNpZW50IHRvIGluZmx1ZW5jZSBncmlkIG9mIDMgY29uc2VjdXRpdmUgZnJhbWVzICovCisgIGNvbnN0IGludCAqdl90dW5pbmdTZWdtOyAvKiE8IHNlZ21lbnQgbGVuZ3RocyB0byB1c2UgYXJvdW5kIHRyYW5zaWVudCAqLworICBjb25zdCBpbnQgKnZfdHVuaW5nRnJlcTsgLyohPCBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgdG8gdXNlIGFyb3VuZCB0cmFuc2llbnQgKi8KKyAgSU5UIGRtaW47ICAgICAgICAgICAgICAgIC8qITwgbWluaW11bSBsZW5ndGggb2YgZGVwZW5kZW50IHNlZ21lbnRzICovCisgIElOVCBkbWF4OyAgICAgICAgICAgICAgICAvKiE8IG1heGltdW0gbGVuZ3RoIG9mIGRlcGVuZGVudCBzZWdtZW50cyAqLworICBJTlQgYWxsb3dTcHJlYWQ7IC8qITwgMTogYWxsb3cgaXNvbGF0ZWQgdHJhbnNpZW50IHRvIGluZmx1ZW5jZSBncmlkIG9mIDMKKyAgICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZSBmcmFtZXMgKi8KIAogICAvKiBpbnRlcm5hbGx5IHVzZWQgc2lnbmFscyAqLwotICBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzT2xkOyAgICAgICAgICAgICAgICAvKiE8IGZyYW1lIGNsYXNzIHVzZWQgZm9yIHByZXZpb3VzIGZyYW1lICovCi0gIElOVCBzcHJlYWRGbGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMTogdXNlIFZBUlZBUiBpbnN0ZWFkIG9mIFZBUkZJWCB0byBmb2xsb3cgdXAgb2xkIHRyYW5zaWVudCAqLworICBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzT2xkOyAvKiE8IGZyYW1lIGNsYXNzIHVzZWQgZm9yIHByZXZpb3VzIGZyYW1lICovCisgIElOVCBzcHJlYWRGbGFnOyAvKiE8IDE6IHVzZSBWQVJWQVIgaW5zdGVhZCBvZiBWQVJGSVggdG8gZm9sbG93IHVwIG9sZAorICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50ICovCiAKLSAgSU5UIHZfYm9yZFsyICogTUFYX0VOVkVMT1BFU19WQVJWQVIgKyAxXTsgLyohPCBib3JkZXJzIGZvciBjdXJyZW50IGZyYW1lIGFuZCBwcmVsaW1pbmFyeSBib3JkZXJzIGZvciBuZXh0IGZyYW1lIChmaXhlZCBib3JkZXJzIGV4Y2x1ZGVkKSAqLwotICBJTlQgbGVuZ3RoX3ZfYm9yZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGhlbHBlciB2YXJpYWJsZTogbGVuZ3RoIG9mIHZfYm9yZCAqLwotICBJTlQgdl9mcmVxWzIgKiBNQVhfRU5WRUxPUEVTX1ZBUlZBUiArIDFdOyAvKiE8IGZyZXF1ZW5jeSByZXNvbHV0aW9ucyBmb3IgY3VycmVudCBmcmFtZSBhbmQgcHJlbGltaW5hcnkgcmVzb2x1dGlvbnMgZm9yIG5leHQgZnJhbWUgKi8KLSAgSU5UIGxlbmd0aF92X2ZyZXE7ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBoZWxwZXIgdmFyaWFibGU6IGxlbmd0aCBvZiB2X2ZyZXEgKi8KKyAgSU5UIHZfYm9yZFsyICogTUFYX0VOVkVMT1BFU19WQVJWQVIgKyAxXTsgLyohPCBib3JkZXJzIGZvciBjdXJyZW50IGZyYW1lIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsaW1pbmFyeSBib3JkZXJzIGZvciBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIChmaXhlZCBib3JkZXJzIGV4Y2x1ZGVkKSAqLworICBJTlQgbGVuZ3RoX3ZfYm9yZDsgLyohPCBoZWxwZXIgdmFyaWFibGU6IGxlbmd0aCBvZiB2X2JvcmQgKi8KKyAgSU5UIHZfZnJlcVsyICogTUFYX0VOVkVMT1BFU19WQVJWQVIgKyAxXTsgLyohPCBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZnJhbWUgYW5kIHByZWxpbWluYXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb25zIGZvciBuZXh0IGZyYW1lICovCisgIElOVCBsZW5ndGhfdl9mcmVxOyAvKiE8IGhlbHBlciB2YXJpYWJsZTogbGVuZ3RoIG9mIHZfZnJlcSAqLwogCi0gIElOVCB2X2JvcmRGb2xsb3dbTUFYX0VOVkVMT1BFU19WQVJWQVJdOyAgIC8qITwgcHJlbGltaW5hcnkgYm9yZGVycyBmb3IgY3VycmVudCBmcmFtZSAoY2FsY3VsYXRlZCBkdXJpbmcgcHJldmlvdXMgZnJhbWUpICovCi0gIElOVCBsZW5ndGhfdl9ib3JkRm9sbG93OyAgICAgICAgICAgICAgICAgIC8qITwgaGVscGVyIHZhcmlhYmxlOiBsZW5ndGggb2Ygdl9ib3JkRm9sbG93ICovCi0gIElOVCBpX3RyYW5Gb2xsb3c7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRzIHRvIHRyYW5zaWVudCBib3JkZXIgaW4gdl9ib3JkRm9sbG93IChtYXkgYmUgbmVnYXRpdmUsIHNlZSBrZWVwRm9yRm9sbG93VXAoKSkgKi8KLSAgSU5UIGlfZmlsbEZvbGxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludHMgdG8gZmlyc3QgZmlsbCBib3JkZXIgaW4gdl9ib3JkRm9sbG93ICovCi0gIElOVCB2X2ZyZXFGb2xsb3dbTUFYX0VOVkVMT1BFU19WQVJWQVJdOyAgIC8qITwgcHJlbGltaW5hcnkgZnJlcXVlbmN5IHJlc29sdXRpb25zIGZvciBjdXJyZW50IGZyYW1lIChjYWxjdWxhdGVkIGR1cmluZyBwcmV2aW91cyBmcmFtZSkgKi8KLSAgSU5UIGxlbmd0aF92X2ZyZXFGb2xsb3c7ICAgICAgICAgICAgICAgICAgLyohPCBoZWxwZXIgdmFyaWFibGU6IGxlbmd0aCBvZiB2X2ZyZXFGb2xsb3cgKi8KLQorICBJTlQgdl9ib3JkRm9sbG93W01BWF9FTlZFTE9QRVNfVkFSVkFSXTsgLyohPCBwcmVsaW1pbmFyeSBib3JkZXJzIGZvciBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSAoY2FsY3VsYXRlZCBkdXJpbmcgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lKSAqLworICBJTlQgbGVuZ3RoX3ZfYm9yZEZvbGxvdzsgLyohPCBoZWxwZXIgdmFyaWFibGU6IGxlbmd0aCBvZiB2X2JvcmRGb2xsb3cgKi8KKyAgSU5UIGlfdHJhbkZvbGxvdzsgLyohPCBwb2ludHMgdG8gdHJhbnNpZW50IGJvcmRlciBpbiB2X2JvcmRGb2xsb3cgKG1heSBiZQorICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSwgc2VlIGtlZXBGb3JGb2xsb3dVcCgpKSAqLworICBJTlQgaV9maWxsRm9sbG93OyAvKiE8IHBvaW50cyB0byBmaXJzdCBmaWxsIGJvcmRlciBpbiB2X2JvcmRGb2xsb3cgKi8KKyAgSU5UIHZfZnJlcUZvbGxvd1tNQVhfRU5WRUxPUEVTX1ZBUlZBUl07IC8qITwgcHJlbGltaW5hcnkgZnJlcXVlbmN5IHJlc29sdXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY3VycmVudCBmcmFtZSAoY2FsY3VsYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIHByZXZpb3VzIGZyYW1lKSAqLworICBJTlQgbGVuZ3RoX3ZfZnJlcUZvbGxvdzsgLyohPCBoZWxwZXIgdmFyaWFibGU6IGxlbmd0aCBvZiB2X2ZyZXFGb2xsb3cgKi8KIAogICAvKiBleHRlcm5hbGx5IG5lZWRlZCBzaWduYWxzICovCi0gIFNCUl9HUklEICAgICAgICAgU2JyR3JpZDsgICAgICAgICAvKiE8IHNicl9ncmlkKCkgc2lnbmFscyB0byBiZSBjb252ZXJ0ZWQgdG8gYml0c3RyZWFtIGVsZW1lbnRzICovCi0gIFNCUl9GUkFNRV9JTkZPICAgU2JyRnJhbWVJbmZvOyAgICAvKiE8IHRpbWUvZnJlcXVlbmN5IGdyaWQgZGVzY3JpcHRpb24gZm9yIG9uZSBmcmFtZSAqLwotfQotU0JSX0VOVkVMT1BFX0ZSQU1FOworICBTQlJfR1JJRAorICBTYnJHcmlkOyAvKiE8IHNicl9ncmlkKCkgc2lnbmFscyB0byBiZSBjb252ZXJ0ZWQgdG8gYml0c3RyZWFtIGVsZW1lbnRzICovCisgIFNCUl9GUkFNRV9JTkZPCisgIFNickZyYW1lSW5mbzsgLyohPCB0aW1lL2ZyZXF1ZW5jeSBncmlkIGRlc2NyaXB0aW9uIGZvciBvbmUgZnJhbWUgKi8KK30gU0JSX0VOVkVMT1BFX0ZSQU1FOwogdHlwZWRlZiBTQlJfRU5WRUxPUEVfRlJBTUUgKkhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUU7CiAKLQotCi12b2lkCi1GREtzYnJFbmNfaW5pdEZyYW1lSW5mb0dlbmVyYXRvciAoCi0gICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgaFNickVudkZyYW1lLAotICAgICAgICAgICAgICBJTlQgICAgICAgYWxsb3dTcHJlYWQsCi0gICAgICAgICAgICAgIElOVCAgICAgICBudW1FbnZTdGF0aWMsCi0gICAgICAgICAgICAgIElOVCAgICAgICBzdGF0aWNGcmFtaW5nLAotICAgICAgICAgICAgICBJTlQgICAgICAgdGltZVNsb3RzLAotICAgICAgICBjb25zdCBGUkVRX1JFUyogZnJlcV9yZXNfZml4Zml4Ci0gICAgICAgICAgICAgLFVDSEFSICAgICBmUmVzVHJhbnNJc0xvdywKLSAgICAgICAgICAgICAgSU5UICAgICAgIGxkR3JpZAotICAgICAgICApOwordm9pZCBGREtzYnJFbmNfaW5pdEZyYW1lSW5mb0dlbmVyYXRvcihIQU5ETEVfU0JSX0VOVkVMT1BFX0ZSQU1FIGhTYnJFbnZGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFsbG93U3ByZWFkLCBJTlQgbnVtRW52U3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhdGljRnJhbWluZywgSU5UIHRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlJFUV9SRVMgKmZyZXFfcmVzX2ZpeGZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgZlJlc1RyYW5zSXNMb3csIElOVCBsZEdyaWQpOwogCiBIQU5ETEVfU0JSX0ZSQU1FX0lORk8KLUZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IgKEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgaFNickVudkZyYW1lLAotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl90cmFuc2llbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfdHJhbnNpZW50X2luZm9fcHJlLAotICAgICAgICAgICAgICAgICAgICBpbnQgbGRHcmlkLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKnZfdHVuaW5nKTsKK0ZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IoSEFORExFX1NCUl9FTlZFTE9QRV9GUkFNRSBoU2JyRW52RnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X3RyYW5zaWVudF9pbmZvLCBjb25zdCBJTlQgcmlnaHRCb3JkZXJGSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X3RyYW5zaWVudF9pbmZvX3ByZSwgaW50IGxkR3JpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICp2X3R1bmluZyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9pbnZmX2VzdC5jcHAgYi9saWJTQlJlbmMvc3JjL2ludmZfZXN0LmNwcAppbmRleCAzMmRmNmQ5Li41M2I0N2FjIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2ludmZfZXN0LmNwcAorKysgYi9saWJTQlJlbmMvc3JjL2ludmZfZXN0LmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJpbnZmX2VzdC5oIgogI2luY2x1ZGUgInNicl9taXNjLmgiCkBAIC04Nyw0NiArMTA2LDY2IEBACiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAogI2RlZmluZSBNQVhfTlVNX1JFR0lPTlMgMTAKLSNkZWZpbmUgU0NBTEVfRkFDX1FVTyAgIDUxMi4wZgotI2RlZmluZSBTQ0FMRV9GQUNfTlJHICAgMjU2LjBmCisjZGVmaW5lIFNDQUxFX0ZBQ19RVU8gNTEyLjBmCisjZGVmaW5lIFNDQUxFX0ZBQ19OUkcgMjU2LjBmCiAKICNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICggYSA8IGIgPyBhOmIpCisjZGVmaW5lIG1pbihhLCBiKSAoYSA8IGIgPyBhIDogYikKICNlbmRpZgogCiAjaWZuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKSAoIGEgPiBiID8gYTpiKQorI2RlZmluZSBtYXgoYSwgYikgKGEgPiBiID8gYSA6IGIpCiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IEZJWFBfREJMIHF1YW50U3RlcHNTYnJbNF0gID0gIHsgMHgwMDQwMDAwMCwgMHgwMjgwMDAwMCwgMHgwMzgwMDAwMCwgMHgwNGMwMDAwMCB9IDsgICAgLyogdGFibGUgc2NhbGVkIHdpdGggU0NBTEVfRkFDX1FVTyAqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMIHF1YW50U3RlcHNPcmlnWzRdID0gIHsgMHgwMDAwMDAwMCwgMHgwMGMwMDAwMCwgMHgwMWMwMDAwMCwgMHgwMjgwMDAwMCB9IDsgICAgLyogdGFibGUgc2NhbGVkIHdpdGggU0NBTEVfRkFDX1FVTyAqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMIG5yZ0JvcmRlcnNbNF0gICAgID0gIHsgMHgwYzgwMDAwMCwgMHgwZjAwMDAwMCwgMHgxMTgwMDAwMCwgMHgxNDAwMDAwMCB9IDsgICAgLyogdGFibGUgc2NhbGVkIHdpdGggU0NBTEVfRkFDX05SRyAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIHF1YW50U3RlcHNTYnJbNF0gPSB7CisgICAgMHgwMDQwMDAwMCwgMHgwMjgwMDAwMCwgMHgwMzgwMDAwMCwKKyAgICAweDA0YzAwMDAwfTsgLyogdGFibGUgc2NhbGVkIHdpdGggU0NBTEVfRkFDX1FVTyAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIHF1YW50U3RlcHNPcmlnWzRdID0geworICAgIDB4MDAwMDAwMDAsIDB4MDBjMDAwMDAsIDB4MDFjMDAwMDAsCisgICAgMHgwMjgwMDAwMH07IC8qIHRhYmxlIHNjYWxlZCB3aXRoIFNDQUxFX0ZBQ19RVU8gKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBucmdCb3JkZXJzWzRdID0geworICAgIDB4MGM4MDAwMDAsIDB4MGYwMDAwMDAsIDB4MTE4MDAwMDAsCisgICAgMHgxNDAwMDAwMH07IC8qIHRhYmxlIHNjYWxlZCB3aXRoIFNDQUxFX0ZBQ19OUkcgKi8KIAogc3RhdGljIGNvbnN0IERFVEVDVE9SX1BBUkFNRVRFUlMgZGV0ZWN0b3JQYXJhbXNBQUMgPSB7CiAgICAgcXVhbnRTdGVwc1NiciwKICAgICBxdWFudFN0ZXBzT3JpZywKICAgICBucmdCb3JkZXJzLAotICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJvcmRlcnMgU0JSLiAqLwotICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJvcmRlcnMgb3JpZy4gKi8KLSAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBib3JkZXJzIE5yZy4gKi8KLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzcGFjZS4gKi8KLSAgICAgIHtJTlZGX01JRF9MRVZFTCwgICBJTlZGX0xPV19MRVZFTCwgIElOVkZfT0ZGLCAgICAgICAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9NSURfTEVWRUwsICAgSU5WRl9MT1dfTEVWRUwsICBJTlZGX09GRiwgICAgICAgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLwotICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9MT1dfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KLSAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0gIC8qICAgIHwgICAgICAqLwotICAgIH0sLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNwYWNlIHRyYW5zaWVudC4gKi8KLSAgICAgIHtJTlZGX0xPV19MRVZFTCwgICBJTlZGX0xPV19MRVZFTCwgIElOVkZfTE9XX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9MT1dfTEVWRUwsICAgSU5WRl9MT1dfTEVWRUwsICBJTlZGX0xPV19MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLwotICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9NSURfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KLSAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0gIC8qICAgIHwgICAgICAqLwotICAgIH0sLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHstNCwgLTMsIC0yLCAtMSwgMH0gLyogUmVkdWN0aW9uIGZhY3RvciBvZiB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgZm9yIGxvdyBlbmVyZ2llcy4qLworICAgIDQsIC8qIE51bWJlciBvZiBib3JkZXJzIFNCUi4gKi8KKyAgICA0LCAvKiBOdW1iZXIgb2YgYm9yZGVycyBvcmlnLiAqLworICAgIDQsIC8qIE51bWJlciBvZiBib3JkZXJzIE5yZy4gKi8KKyAgICB7CisgICAgICAgIC8qIFJlZ2lvbiBzcGFjZS4gKi8KKyAgICAgICAge0lOVkZfTUlEX0xFVkVMLCBJTlZGX0xPV19MRVZFTCwgSU5WRl9PRkYsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfTUlEX0xFVkVMLCBJTlZGX0xPV19MRVZFTCwgSU5WRl9PRkYsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsIElOVkZfTE9XX0xFVkVMLCBJTlZGX09GRiwKKyAgICAgICAgIElOVkZfT0ZGfSwgLyogcmVnaW9uU2JyICovCisgICAgICAgIHtJTlZGX0hJR0hfTEVWRUwsIElOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0gLyogICAgfCAgICAgICovCisgICAgfSwgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHsKKyAgICAgICAgLyogUmVnaW9uIHNwYWNlIHRyYW5zaWVudC4gKi8KKyAgICAgICAge0lOVkZfTE9XX0xFVkVMLCBJTlZGX0xPV19MRVZFTCwgSU5WRl9MT1dfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfTE9XX0xFVkVMLCBJTlZGX0xPV19MRVZFTCwgSU5WRl9MT1dfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCBJTlZGX09GRiwKKyAgICAgICAgIElOVkZfT0ZGfSwgLyogcmVnaW9uU2JyICovCisgICAgICAgIHtJTlZGX0hJR0hfTEVWRUwsIElOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0gLyogICAgfCAgICAgICovCisgICAgfSwgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHstNCwgLTMsIC0yLCAtMSwKKyAgICAgMH0gLyogUmVkdWN0aW9uIGZhY3RvciBvZiB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgZm9yIGxvdyBlbmVyZ2llcy4qLwogfTsKIAotc3RhdGljIGNvbnN0IEZJWFBfREJMIGh5c3RlcmVzaXMgPSAweDAwNDAwMDAwIDsgLyogRGVsdGEgdmFsdWUgZm9yIGh5c3RlcmVzaXMuIHNjYWxlZCB3aXRoIFNDQUxFX0ZBQ19RVU8gKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBoeXN0ZXJlc2lzID0KKyAgICAweDAwNDAwMDAwOyAvKiBEZWx0YSB2YWx1ZSBmb3IgaHlzdGVyZXNpcy4gc2NhbGVkIHdpdGggU0NBTEVfRkFDX1FVTyAqLwogCiAvKgogICogQUFDK1NCUiBQQVJBTUVURVJTIGZvciBTcGVlY2gKQEAgLTEzNSwyNCArMTc0LDM3IEBACiAgICAgcXVhbnRTdGVwc1NiciwKICAgICBxdWFudFN0ZXBzT3JpZywKICAgICBucmdCb3JkZXJzLAotICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJvcmRlcnMgU0JSLiAqLwotICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJvcmRlcnMgb3JpZy4gKi8KLSAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBib3JkZXJzIE5yZy4gKi8KLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzcGFjZS4gKi8KLSAgICAgIHtJTlZGX01JRF9MRVZFTCwgICBJTlZGX01JRF9MRVZFTCwgIElOVkZfTE9XX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9NSURfTEVWRUwsICAgSU5WRl9NSURfTEVWRUwsICBJTlZGX0xPV19MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLwotICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9NSURfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KLSAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0gIC8qICAgIHwgICAgICAqLwotICAgIH0sLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNwYWNlIHRyYW5zaWVudC4gKi8KLSAgICAgIHtJTlZGX01JRF9MRVZFTCwgICBJTlZGX01JRF9MRVZFTCwgIElOVkZfTE9XX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9NSURfTEVWRUwsICAgSU5WRl9NSURfTEVWRUwsICBJTlZGX0xPV19MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLwotICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9NSURfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KLSAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0gIC8qICAgIHwgICAgICAqLwotICAgIH0sLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHstNCwgLTMsIC0yLCAtMSwgMH0gLyogUmVkdWN0aW9uIGZhY3RvciBvZiB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgZm9yIGxvdyBlbmVyZ2llcy4qLworICAgIDQsIC8qIE51bWJlciBvZiBib3JkZXJzIFNCUi4gKi8KKyAgICA0LCAvKiBOdW1iZXIgb2YgYm9yZGVycyBvcmlnLiAqLworICAgIDQsIC8qIE51bWJlciBvZiBib3JkZXJzIE5yZy4gKi8KKyAgICB7CisgICAgICAgIC8qIFJlZ2lvbiBzcGFjZS4gKi8KKyAgICAgICAge0lOVkZfTUlEX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9MT1dfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfTUlEX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9MT1dfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCBJTlZGX09GRiwKKyAgICAgICAgIElOVkZfT0ZGfSwgLyogcmVnaW9uU2JyICovCisgICAgICAgIHtJTlZGX0hJR0hfTEVWRUwsIElOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0gLyogICAgfCAgICAgICovCisgICAgfSwgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHsKKyAgICAgICAgLyogUmVnaW9uIHNwYWNlIHRyYW5zaWVudC4gKi8KKyAgICAgICAge0lOVkZfTUlEX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9MT1dfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfTUlEX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9MT1dfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCBJTlZGX09GRiwKKyAgICAgICAgIElOVkZfT0ZGfSwgLyogcmVnaW9uU2JyICovCisgICAgICAgIHtJTlZGX0hJR0hfTEVWRUwsIElOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0gLyogICAgfCAgICAgICovCisgICAgfSwgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVnaW9uT3JpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHstNCwgLTMsIC0yLCAtMSwKKyAgICAgMH0gLyogUmVkdWN0aW9uIGZhY3RvciBvZiB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgZm9yIGxvdyBlbmVyZ2llcy4qLwogfTsKIAogLyoKQEAgLTE2MCwyMCArMjEyLDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqLwogdHlwZWRlZiBjb25zdCBGSVhQX0RCTCBGSVJfRklMVEVSWzVdOwogCi1zdGF0aWMgY29uc3QgRklSX0ZJTFRFUiBmaXJfMCA9IHsgMHg3ZmZmZmZmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IDsKLXN0YXRpYyBjb25zdCBGSVJfRklMVEVSIGZpcl8xID0geyAweDJhYWFhYTgwLCAweDU1NTU1NGZmLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gOwotc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgZmlyXzIgPSB7IDB4MTAwMDAwMDAsIDB4MzAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSA7Ci1zdGF0aWMgY29uc3QgRklSX0ZJTFRFUiBmaXJfMyA9IHsgMHgwNzdmODBlOCwgMHgxOTk5OTlhMCwgMHgyYmIzYjI0MCwgMHgzMzMzMzM0MCwgMHgwMDAwMDAwMCB9IDsKLXN0YXRpYyBjb25zdCBGSVJfRklMVEVSIGZpcl80ID0geyAweDA0MTMwNTk4LCAweDBlYmRiMDAwLCAweDFiZWNmYTYwLCAweDI2OTdhNGMwLCAweDJhYWFhYTgwIH0gOworc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgZmlyXzAgPSB7MHg3ZmZmZmZmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB9Oworc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgZmlyXzEgPSB7MHgyYWFhYWE4MCwgMHg1NTU1NTRmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB9Oworc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgZmlyXzIgPSB7MHgxMDAwMDAwMCwgMHgzMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB9Oworc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgZmlyXzMgPSB7MHgwNzdmODBlOCwgMHgxOTk5OTlhMCwgMHgyYmIzYjI0MCwgMHgzMzMzMzM0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB9Oworc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgZmlyXzQgPSB7MHgwNDEzMDU5OCwgMHgwZWJkYjAwMCwgMHgxYmVjZmE2MCwgMHgyNjk3YTRjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MmFhYWFhODB9OwogCi0KLXN0YXRpYyBjb25zdCBGSVJfRklMVEVSICpjb25zdCBmaXJfdGFibGVbNV0gPSB7Ci0gICZmaXJfMCwKLSAgJmZpcl8xLAotICAmZmlyXzIsCi0gICZmaXJfMywKLSAgJmZpcl80Ci19Oworc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgKmNvbnN0IGZpcl90YWJsZVs1XSA9IHsmZmlyXzAsICZmaXJfMSwgJmZpcl8yLCAmZmlyXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJfNH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQpAQCAtMTg0LDk4ICsyMzUsMTExIEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotY2FsY3VsYXRlRGV0ZWN0b3JWYWx1ZXMoRklYUF9EQkwgKipxdW90YU1hdHJpeE9yaWcsICAgICAgIC8qITwgTWF0cml4IGhvbGRpbmcgdGhlIHRvbmFsaXR5IHZhbHVlcyBvZiB0aGUgb3JpZ2luYWwuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqaW5kZXhWZWN0b3IsICAgICAgICAgICAgLyohPCBJbmRleCB2ZWN0b3IgdG8gb2J0YWluIHRoZSBwYXRjaGVkIGRhdGEuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnVmVjdG9yLCAgICAgICAgICAgICAgLyohPCBFbmVyZ3kgdmVjdG9yLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgREVURUNUT1JfVkFMVUVTICpkZXRlY3RvclZhbHVlcywgIC8qITwgcG9pbnRlciB0byBERVRFQ1RPUl9WQUxVRVMgc3RydWN0LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0Q2hhbm5lbCwgICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgY2hhbm5lbC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wQ2hhbm5lbCwgICAgICAgICAgICAgICAgICAvKiE8IFN0b3AgY2hhbm5lbC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydEluZGV4LCAgICAgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0b3BJbmRleCwgICAgICAgICAgICAgICAgICAgIC8qITwgU3RvcCBpbmRleC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1iZXJPZlN0cm9uZ2VzdCAgICAgICAgICAgICAvKiE8IFRoZSBudW1iZXIgb2Ygc29ydGVkIHRvbmFsIGNvbXBvbmVudHMgdG8gYmUgY29uc2lkZXJlZC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgSU5UIGksdGVtcCwgajsKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZURldGVjdG9yVmFsdWVzKAorICAgIEZJWFBfREJMICoqcXVvdGFNYXRyaXhPcmlnLCAvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSB0b25hbGl0eSB2YWx1ZXMgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLiAqLworICAgIFNDSEFSICppbmRleFZlY3RvciwgICAgICAgICAvKiE8IEluZGV4IHZlY3RvciB0byBvYnRhaW4gdGhlIHBhdGNoZWQgZGF0YS4gKi8KKyAgICBGSVhQX0RCTCAqbnJnVmVjdG9yLCAgICAgICAgLyohPCBFbmVyZ3kgdmVjdG9yLiAqLworICAgIERFVEVDVE9SX1ZBTFVFUyAqZGV0ZWN0b3JWYWx1ZXMsIC8qITwgcG9pbnRlciB0byBERVRFQ1RPUl9WQUxVRVMgc3RydWN0LiAqLworICAgIElOVCBzdGFydENoYW5uZWwsICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgY2hhbm5lbC4gKi8KKyAgICBJTlQgc3RvcENoYW5uZWwsICAgICAgICAgICAgICAgICAvKiE8IFN0b3AgY2hhbm5lbC4gKi8KKyAgICBJTlQgc3RhcnRJbmRleCwgICAgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4LiAqLworICAgIElOVCBzdG9wSW5kZXgsICAgICAgICAgICAgICAgICAgIC8qITwgU3RvcCBpbmRleC4gKi8KKyAgICBJTlQgbnVtYmVyT2ZTdHJvbmdlc3QgLyohPCBUaGUgbnVtYmVyIG9mIHNvcnRlZCB0b25hbCBjb21wb25lbnRzIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNpZGVyZWQuICovCispIHsKKyAgSU5UIGksIHRlbXAsIGo7CiAKLSAgY29uc3QgRklYUF9EQkwqIGZpbHRlciA9ICpmaXJfdGFibGVbSU5WRl9TTU9PVEhJTkdfTEVOR1RIXTsKKyAgY29uc3QgRklYUF9EQkwgKmZpbHRlciA9ICpmaXJfdGFibGVbSU5WRl9TTU9PVEhJTkdfTEVOR1RIXTsKICAgRklYUF9EQkwgb3JpZ1F1b3RhTWVhblN0cm9uZ2VzdCwgc2JyUXVvdGFNZWFuU3Ryb25nZXN0OwogICBGSVhQX0RCTCBvcmlnUXVvdGEsIHNiclF1b3RhOwogICBGSVhQX0RCTCBpbnZJbmRleCwgaW52Q2hhbm5lbCwgaW52VGVtcDsKICAgRklYUF9EQkwgcXVvdGFWZWNPcmlnWzY0XSwgcXVvdGFWZWNTYnJbNjRdOwogCi0gIEZES21lbWNsZWFyKHF1b3RhVmVjT3JpZyw2NCpzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtY2xlYXIocXVvdGFWZWNTYnIsNjQqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKHF1b3RhVmVjT3JpZywgNjQgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIocXVvdGFWZWNTYnIsIDY0ICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgaW52SW5kZXggPSBHZXRJbnZJbnQoc3RvcEluZGV4LXN0YXJ0SW5kZXgpOwotICBpbnZDaGFubmVsID0gR2V0SW52SW50KHN0b3BDaGFubmVsLXN0YXJ0Q2hhbm5lbCk7CisgIGludkluZGV4ID0gR2V0SW52SW50KHN0b3BJbmRleCAtIHN0YXJ0SW5kZXgpOworICBpbnZDaGFubmVsID0gR2V0SW52SW50KHN0b3BDaGFubmVsIC0gc3RhcnRDaGFubmVsKTsKIAogICAvKgotICAgQ2FsY3VsYXRlIHRoZSBtZWFuIHZhbHVlLCBvdmVyIHRoZSBjdXJyZW50IHRpbWUgc2VnbWVudCwgZm9yIHRoZSBvcmlnaW5hbCwgdGhlIEhGUgotICAgYW5kIHRoZSBkaWZmZXJlbmNlLCBvdmVyIGFsbCBjaGFubmVscyBpbiB0aGUgY3VycmVudCBmcmVxdWVuY3kgcmFuZ2UuCisgICBDYWxjdWxhdGUgdGhlIG1lYW4gdmFsdWUsIG92ZXIgdGhlIGN1cnJlbnQgdGltZSBzZWdtZW50LCBmb3IgdGhlIG9yaWdpbmFsLAorICAgdGhlIEhGUiBhbmQgdGhlIGRpZmZlcmVuY2UsIG92ZXIgYWxsIGNoYW5uZWxzIGluIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSByYW5nZS4KICAgIE5PVEU6IHRoZSBhdmVyYWdpbmcgaXMgZG9uZSBvbiB0aGUgdmFsdWVzIHF1b3RhLygxIC0gcXVvdGEgKyBSRUxBWEFUSU9OKS4KICAgICovCiAKICAgLyogVGhlIG9yaWdpbmFsLCB0aGUgc2JyIHNpZ25hbCBhbmQgdGhlIHRvdGFsIGVuZXJneSAqLwogICBkZXRlY3RvclZhbHVlcy0+YXZnTnJnID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gIGZvcihqPXN0YXJ0SW5kZXg7IGo8c3RvcEluZGV4OyBqKyspIHsKLSAgICBmb3IoaT1zdGFydENoYW5uZWw7IGk8c3RvcENoYW5uZWw7IGkrKykgeworICBmb3IgKGogPSBzdGFydEluZGV4OyBqIDwgc3RvcEluZGV4OyBqKyspIHsKKyAgICBmb3IgKGkgPSBzdGFydENoYW5uZWw7IGkgPCBzdG9wQ2hhbm5lbDsgaSsrKSB7CiAgICAgICBxdW90YVZlY09yaWdbaV0gKz0gZk11bHQocXVvdGFNYXRyaXhPcmlnW2pdW2ldLCBpbnZJbmRleCk7CiAKLSAgICAgIGlmKGluZGV4VmVjdG9yW2ldICE9IC0xKQorICAgICAgaWYgKGluZGV4VmVjdG9yW2ldICE9IC0xKQogICAgICAgICBxdW90YVZlY1NicltpXSArPSBmTXVsdChxdW90YU1hdHJpeE9yaWdbal1baW5kZXhWZWN0b3JbaV1dLCBpbnZJbmRleCk7CiAgICAgfQogICAgIGRldGVjdG9yVmFsdWVzLT5hdmdOcmcgKz0gZk11bHQobnJnVmVjdG9yW2pdLCBpbnZJbmRleCk7CiAgIH0KIAogICAvKgotICAgQ2FsY3VsYXRlIHRoZSBtZWFuIHZhbHVlLCBvdmVyIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSByYW5nZSwgZm9yIHRoZSBvcmlnaW5hbCwgdGhlIEhGUgotICAgYW5kIHRoZSBkaWZmZXJlbmNlLiBBbHNvIGNhbGN1bGF0ZSB0aGUgc2FtZSBtZWFuIHZhbHVlcyBmb3IgdGhlIHRocmVlIHZlY3RvcnMsIGJ1dCBvbmx5Ci0gICBpbmNsdWRlaW5nIHRoZSB4IHN0cm9uZ2VzdCBjb3BtcG9uZW50cy4KKyAgIENhbGN1bGF0ZSB0aGUgbWVhbiB2YWx1ZSwgb3ZlciB0aGUgY3VycmVudCBmcmVxdWVuY3kgcmFuZ2UsIGZvciB0aGUgb3JpZ2luYWwsCisgICB0aGUgSEZSIGFuZCB0aGUgZGlmZmVyZW5jZS4gQWxzbyBjYWxjdWxhdGUgdGhlIHNhbWUgbWVhbiB2YWx1ZXMgZm9yIHRoZSB0aHJlZQorICAgdmVjdG9ycywgYnV0IG9ubHkgaW5jbHVkZWluZyB0aGUgeCBzdHJvbmdlc3QgY29wbXBvbmVudHMuCiAgICAqLwogCiAgIG9yaWdRdW90YSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICBzYnJRdW90YSAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgZm9yKGk9c3RhcnRDaGFubmVsOyBpPHN0b3BDaGFubmVsOyBpKyspIHsKKyAgc2JyUXVvdGEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgZm9yIChpID0gc3RhcnRDaGFubmVsOyBpIDwgc3RvcENoYW5uZWw7IGkrKykgewogICAgIG9yaWdRdW90YSArPSBmTXVsdERpdjIocXVvdGFWZWNPcmlnW2ldLCBpbnZDaGFubmVsKTsKLSAgICBzYnJRdW90YSAgKz0gZk11bHREaXYyKHF1b3RhVmVjU2JyW2ldLCBpbnZDaGFubmVsKTsKKyAgICBzYnJRdW90YSArPSBmTXVsdERpdjIocXVvdGFWZWNTYnJbaV0sIGludkNoYW5uZWwpOwogICB9CiAKICAgLyoKICAgIENhbGN1bGF0ZSB0aGUgbWVhbiB2YWx1ZSBmb3IgdGhlIHggc3Ryb25nZXN0IGNvbXBvbmVudHMKICAgKi8KLSAgRkRLc2JyRW5jX1NoZWxsc29ydF9mcmFjdChxdW90YVZlY09yaWcrc3RhcnRDaGFubmVsLHN0b3BDaGFubmVsLXN0YXJ0Q2hhbm5lbCk7Ci0gIEZES3NickVuY19TaGVsbHNvcnRfZnJhY3QocXVvdGFWZWNTYnIrc3RhcnRDaGFubmVsLHN0b3BDaGFubmVsLXN0YXJ0Q2hhbm5lbCk7CisgIEZES3NickVuY19TaGVsbHNvcnRfZnJhY3QocXVvdGFWZWNPcmlnICsgc3RhcnRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BDaGFubmVsIC0gc3RhcnRDaGFubmVsKTsKKyAgRkRLc2JyRW5jX1NoZWxsc29ydF9mcmFjdChxdW90YVZlY1NiciArIHN0YXJ0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wQ2hhbm5lbCAtIHN0YXJ0Q2hhbm5lbCk7CiAKICAgb3JpZ1F1b3RhTWVhblN0cm9uZ2VzdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICBzYnJRdW90YU1lYW5TdHJvbmdlc3QgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIHNiclF1b3RhTWVhblN0cm9uZ2VzdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCiAgIHRlbXAgPSBtaW4oc3RvcENoYW5uZWwgLSBzdGFydENoYW5uZWwsIG51bWJlck9mU3Ryb25nZXN0KTsKICAgaW52VGVtcCA9IEdldEludkludCh0ZW1wKTsKIAotICBmb3IoaT0wOyBpPHRlbXA7IGkrKykgewotICAgIG9yaWdRdW90YU1lYW5TdHJvbmdlc3QgKz0gZk11bHREaXYyKHF1b3RhVmVjT3JpZ1tpICsgc3RvcENoYW5uZWwgLSB0ZW1wXSwgaW52VGVtcCk7Ci0gICAgc2JyUXVvdGFNZWFuU3Ryb25nZXN0ICArPSBmTXVsdERpdjIocXVvdGFWZWNTYnJbaSArIHN0b3BDaGFubmVsIC0gdGVtcF0sIGludlRlbXApOworICBmb3IgKGkgPSAwOyBpIDwgdGVtcDsgaSsrKSB7CisgICAgb3JpZ1F1b3RhTWVhblN0cm9uZ2VzdCArPQorICAgICAgICBmTXVsdERpdjIocXVvdGFWZWNPcmlnW2kgKyBzdG9wQ2hhbm5lbCAtIHRlbXBdLCBpbnZUZW1wKTsKKyAgICBzYnJRdW90YU1lYW5TdHJvbmdlc3QgKz0KKyAgICAgICAgZk11bHREaXYyKHF1b3RhVmVjU2JyW2kgKyBzdG9wQ2hhbm5lbCAtIHRlbXBdLCBpbnZUZW1wKTsKICAgfQogCiAgIC8qCiAgICBUaGUgdmFsdWUgZm9yIHRoZSBzdHJvbmdlc3QgY29tcG9uZW50CiAgICovCiAgIGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNYXggPSBxdW90YVZlY09yaWdbc3RvcENoYW5uZWwgLSAxXTsKLSAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWF4ICA9IHF1b3RhVmVjU2JyW3N0b3BDaGFubmVsIC0gMV07CisgIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1heCA9IHF1b3RhVmVjU2JyW3N0b3BDaGFubmVsIC0gMV07CiAKICAgLyoKICAgIEJ1ZmZlciB2YWx1ZXMKICAgKi8KLSAgRkRLbWVtbW92ZShkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbiwgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW4gKyAxLCBJTlZGX1NNT09USElOR19MRU5HVEgqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbW1vdmUoZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbiwgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbiArIDEsIElOVkZfU01PT1RISU5HX0xFTkdUSCpzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtbW92ZShkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhblN0cm9uZ2VzdCwgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5TdHJvbmdlc3QgKyAxLCBJTlZGX1NNT09USElOR19MRU5HVEgqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbW1vdmUoZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhblN0cm9uZ2VzdCwgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhblN0cm9uZ2VzdCArIDEsIElOVkZfU01PT1RISU5HX0xFTkdUSCpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtbW92ZShkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbiwgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW4gKyAxLAorICAgICAgICAgICAgIElOVkZfU01PT1RISU5HX0xFTkdUSCAqIHNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1tb3ZlKGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW4sIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW4gKyAxLAorICAgICAgICAgICAgIElOVkZfU01PT1RISU5HX0xFTkdUSCAqIHNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1tb3ZlKGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuU3Ryb25nZXN0LAorICAgICAgICAgICAgIGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuU3Ryb25nZXN0ICsgMSwKKyAgICAgICAgICAgICBJTlZGX1NNT09USElOR19MRU5HVEggKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtbW92ZShkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuU3Ryb25nZXN0LAorICAgICAgICAgICAgIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5TdHJvbmdlc3QgKyAxLAorICAgICAgICAgICAgIElOVkZfU01PT1RISU5HX0xFTkdUSCAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gIGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuW0lOVkZfU01PT1RISU5HX0xFTkdUSF0gICAgICAgICAgPSBvcmlnUXVvdGE8PDE7Ci0gIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5bSU5WRl9TTU9PVEhJTkdfTEVOR1RIXSAgICAgICAgICAgPSBzYnJRdW90YTw8MTsKLSAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5TdHJvbmdlc3RbSU5WRl9TTU9PVEhJTkdfTEVOR1RIXSA9IG9yaWdRdW90YU1lYW5TdHJvbmdlc3Q8PDE7Ci0gIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5TdHJvbmdlc3RbSU5WRl9TTU9PVEhJTkdfTEVOR1RIXSAgPSBzYnJRdW90YU1lYW5TdHJvbmdlc3Q8PDE7CisgIGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuW0lOVkZfU01PT1RISU5HX0xFTkdUSF0gPSBvcmlnUXVvdGEgPDwgMTsKKyAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbltJTlZGX1NNT09USElOR19MRU5HVEhdID0gc2JyUXVvdGEgPDwgMTsKKyAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5TdHJvbmdlc3RbSU5WRl9TTU9PVEhJTkdfTEVOR1RIXSA9CisgICAgICBvcmlnUXVvdGFNZWFuU3Ryb25nZXN0IDw8IDE7CisgIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5TdHJvbmdlc3RbSU5WRl9TTU9PVEhJTkdfTEVOR1RIXSA9CisgICAgICBzYnJRdW90YU1lYW5TdHJvbmdlc3QgPDwgMTsKIAogICAvKgogICAgRmlsdGVyIHZhbHVlcwpAQCAtMjg1LDExICszNDksMTUgQEAKICAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5TdHJvbmdlc3RGaWx0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5TdHJvbmdlc3RGaWx0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgZm9yKGk9MDtpPElOVkZfU01PT1RISU5HX0xFTkdUSCsxO2krKykgewotICAgIGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuRmlsdCArPSBmTXVsdChkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbltpXSwgZmlsdGVyW2ldKTsKLSAgICBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuRmlsdCAgKz0gZk11bHQoZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbltpXSwgZmlsdGVyW2ldKTsKLSAgICBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhblN0cm9uZ2VzdEZpbHQgKz0gZk11bHQoZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5TdHJvbmdlc3RbaV0sIGZpbHRlcltpXSk7Ci0gICAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhblN0cm9uZ2VzdEZpbHQgICs9IGZNdWx0KGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5TdHJvbmdlc3RbaV0sIGZpbHRlcltpXSk7CisgIGZvciAoaSA9IDA7IGkgPCBJTlZGX1NNT09USElOR19MRU5HVEggKyAxOyBpKyspIHsKKyAgICBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbkZpbHQgKz0KKyAgICAgICAgZk11bHQoZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5baV0sIGZpbHRlcltpXSk7CisgICAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbkZpbHQgKz0KKyAgICAgICAgZk11bHQoZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbltpXSwgZmlsdGVyW2ldKTsKKyAgICBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhblN0cm9uZ2VzdEZpbHQgKz0KKyAgICAgICAgZk11bHQoZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5TdHJvbmdlc3RbaV0sIGZpbHRlcltpXSk7CisgICAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhblN0cm9uZ2VzdEZpbHQgKz0KKyAgICAgICAgZk11bHQoZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhblN0cm9uZ2VzdFtpXSwgZmlsdGVyW2ldKTsKICAgfQogfQogCkBAIC0zMDMsMjkgKzM3MSwyOCBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVAotZmluZFJlZ2lvbihGSVhQX0RCTCBjdXJyVmFsLCAgICAgICAgLyohPCBUaGUgY3VycmVudCB2YWx1ZS4gKi8KLSAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmJvcmRlcnMsIC8qITwgVGhlIGJvcmRlciBvZiB0aGUgcmVnaW9ucy4gKi8KLSAgICAgICAgICAgY29uc3QgSU5UIG51bUJvcmRlcnMgICAgIC8qITwgVGhlIG51bWJlciBvZiBib3JkZXJzLiAqLwotICAgICAgICAgICApCi17CitzdGF0aWMgSU5UIGZpbmRSZWdpb24oCisgICAgRklYUF9EQkwgY3VyclZhbCwgICAgICAgIC8qITwgVGhlIGN1cnJlbnQgdmFsdWUuICovCisgICAgY29uc3QgRklYUF9EQkwgKmJvcmRlcnMsIC8qITwgVGhlIGJvcmRlciBvZiB0aGUgcmVnaW9ucy4gKi8KKyAgICBjb25zdCBJTlQgbnVtQm9yZGVycyAgICAgLyohPCBUaGUgbnVtYmVyIG9mIGJvcmRlcnMuICovCispIHsKICAgSU5UIGk7CiAKLSAgaWYoY3VyclZhbCA8IGJvcmRlcnNbMF0peworICBpZiAoY3VyclZhbCA8IGJvcmRlcnNbMF0pIHsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIGZvcihpID0gMTsgaSA8IG51bUJvcmRlcnM7IGkrKyl7Ci0gICAgaWYoIGN1cnJWYWwgPj0gYm9yZGVyc1tpLTFdICYmIGN1cnJWYWwgPCBib3JkZXJzW2ldKXsKKyAgZm9yIChpID0gMTsgaSA8IG51bUJvcmRlcnM7IGkrKykgeworICAgIGlmIChjdXJyVmFsID49IGJvcmRlcnNbaSAtIDFdICYmIGN1cnJWYWwgPCBib3JkZXJzW2ldKSB7CiAgICAgICByZXR1cm4gaTsKICAgICB9CiAgIH0KIAotICBpZihjdXJyVmFsID49IGJvcmRlcnNbbnVtQm9yZGVycy0xXSl7CisgIGlmIChjdXJyVmFsID49IGJvcmRlcnNbbnVtQm9yZGVycyAtIDFdKSB7CiAgICAgcmV0dXJuIG51bUJvcmRlcnM7CiAgIH0KIAotICByZXR1cm4gMDsgIC8qIFdlIG5ldmVyIGdldCBoZXJlLCBpdCdzIGp1c3QgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuKi8KKyAgcmV0dXJuIDA7IC8qIFdlIG5ldmVyIGdldCBoZXJlLCBpdCdzIGp1c3QgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuKi8KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzM3LDI1ICs0MDQsMjIgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlZGX01PREUKLWRlY2lzaW9uQWxnb3JpdGhtKGNvbnN0IERFVEVDVE9SX1BBUkFNRVRFUlMgKmRldGVjdG9yUGFyYW1zLCAgICAgLyohPCBTdHJ1Y3Qgd2l0aCB0aGUgZGV0ZWN0b3IgcGFyYW1ldGVycy4gKi8KLSAgICAgICAgICAgICAgICAgIERFVEVDVE9SX1ZBTFVFUyAqZGV0ZWN0b3JWYWx1ZXMsICAgICAgICAgICAgICAgLyohPCBTdHJ1Y3Qgd2l0aCB0aGUgZGV0ZWN0b3IgdmFsdWVzLiAqLwotICAgICAgICAgICAgICAgICAgSU5UIHRyYW5zaWVudEZsYWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBpZiB0aGVyZSBpcyBhIHRyYW5zaWVudCBwcmVzZW50LiovCi0gICAgICAgICAgICAgICAgICBJTlQqIHByZXZSZWdpb25TYnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHByZXZpb3VzIHJlZ2lvbiBpbiB3aGljaCB0aGUgU2JyIHZhbHVlIHdhcy4gKi8KLSAgICAgICAgICAgICAgICAgIElOVCogcHJldlJlZ2lvbk9yaWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgcHJldmlvdXMgcmVnaW9uIGluIHdoaWNoIHRoZSBPcmlnIHZhbHVlIHdhcy4gKi8KLSAgICAgICAgICAgICAgICAgICkKLXsKK3N0YXRpYyBJTlZGX01PREUgZGVjaXNpb25BbGdvcml0aG0oCisgICAgY29uc3QgREVURUNUT1JfUEFSQU1FVEVSUworICAgICAgICAqZGV0ZWN0b3JQYXJhbXMsIC8qITwgU3RydWN0IHdpdGggdGhlIGRldGVjdG9yIHBhcmFtZXRlcnMuICovCisgICAgREVURUNUT1JfVkFMVUVTICpkZXRlY3RvclZhbHVlcywgLyohPCBTdHJ1Y3Qgd2l0aCB0aGUgZGV0ZWN0b3IgdmFsdWVzLiAqLworICAgIElOVCB0cmFuc2llbnRGbGFnLCAgLyohPCBGbGFnIGluZGljYXRpbmcgaWYgdGhlcmUgaXMgYSB0cmFuc2llbnQgcHJlc2VudC4qLworICAgIElOVCAqcHJldlJlZ2lvblNiciwgLyohPCBUaGUgcHJldmlvdXMgcmVnaW9uIGluIHdoaWNoIHRoZSBTYnIgdmFsdWUgd2FzLiAqLworICAgIElOVCAqcHJldlJlZ2lvbk9yaWcgLyohPCBUaGUgcHJldmlvdXMgcmVnaW9uIGluIHdoaWNoIHRoZSBPcmlnIHZhbHVlIHdhcy4gKi8KKykgewogICBJTlQgaW52RmlsdExldmVsLCByZWdpb25TYnIsIHJlZ2lvbk9yaWcsIHJlZ2lvbk5yZzsKIAogICAvKgogICAgQ3VycmVudCB0aHJlc2hvbGRzLgogICAgKi8KLSAgY29uc3QgRklYUF9EQkwgKnF1YW50U3RlcHNTYnIgID0gZGV0ZWN0b3JQYXJhbXMtPnF1YW50U3RlcHNTYnI7Ci0gIGNvbnN0IEZJWFBfREJMICpxdWFudFN0ZXBzT3JpZyA9IGRldGVjdG9yUGFyYW1zLT5xdWFudFN0ZXBzT3JpZzsKLSAgY29uc3QgRklYUF9EQkwgKm5yZ0JvcmRlcnMgICAgID0gZGV0ZWN0b3JQYXJhbXMtPm5yZ0JvcmRlcnM7Ci0gIGNvbnN0IElOVCBudW1SZWdpb25zU2JyICAgICA9IGRldGVjdG9yUGFyYW1zLT5udW1SZWdpb25zU2JyOwotICBjb25zdCBJTlQgbnVtUmVnaW9uc09yaWcgICAgPSBkZXRlY3RvclBhcmFtcy0+bnVtUmVnaW9uc09yaWc7Ci0gIGNvbnN0IElOVCBudW1SZWdpb25zTnJnICAgICA9IGRldGVjdG9yUGFyYW1zLT5udW1SZWdpb25zTnJnOworICBjb25zdCBJTlQgbnVtUmVnaW9uc1NiciA9IGRldGVjdG9yUGFyYW1zLT5udW1SZWdpb25zU2JyOworICBjb25zdCBJTlQgbnVtUmVnaW9uc09yaWcgPSBkZXRlY3RvclBhcmFtcy0+bnVtUmVnaW9uc09yaWc7CisgIGNvbnN0IElOVCBudW1SZWdpb25zTnJnID0gZGV0ZWN0b3JQYXJhbXMtPm51bVJlZ2lvbnNOcmc7CiAKICAgRklYUF9EQkwgcXVhbnRTdGVwc1NiclRtcFtNQVhfTlVNX1JFR0lPTlNdOwogICBGSVhQX0RCTCBxdWFudFN0ZXBzT3JpZ1RtcFtNQVhfTlVNX1JFR0lPTlNdOwpAQCAtMzY3LDQwICs0MzEsNjUgQEAKICAgRklYUF9EQkwgc2JyUXVvdGFNZWFuRmlsdDsKICAgRklYUF9EQkwgbnJnOwogCi0gIC8qIDAuMzc1ID0gMy4wIC8gOC4wOyAwLjMxMTQzMDc1ODg5ID0gbG9nMihSRUxBWEFUSU9OKS82NC4wOyAwLjYyNSA9IGxvZygxNikvNjQuMDsgMC42ODc1ID0gNDQvNjQuMCAqLwotICBvcmlnUXVvdGFNZWFuRmlsdCA9IChmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMi5mKjAuMzc1ZiksIChGSVhQX0RCTCkoQ2FsY0xkRGF0YShtYXgoZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5GaWx0LChGSVhQX0RCTCkxKSkgKyBGTDJGWENPTlNUX0RCTCgwLjMxMTQzMDc1ODg5ZikpKSkgPDwgMDsgIC8qIHNjYWxlZCBieSAxLzJeOSAqLwotICBzYnJRdW90YU1lYW5GaWx0ICA9IChmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMi5mKjAuMzc1ZiksIChGSVhQX0RCTCkoQ2FsY0xkRGF0YShtYXgoZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbkZpbHQsKEZJWFBfREJMKTEpKSArIEZMMkZYQ09OU1RfREJMKDAuMzExNDMwNzU4ODlmKSkpKSA8PCAwOyAgIC8qIHNjYWxlZCBieSAxLzJeOSAqLwotICAvKiBJZiBlbmVyZ3kgaXMgemVybyB0aGVuIHdlIHdpbGwgZ2V0IGRpZmZlcmVudCByZXN1bHRzIGZvciBkaWZmZXJlbnQgd29yZCBsZW5ndGhzLiAqLwotICBucmcgICAgICAgICAgICAgICA9IChmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMi5mKjAuMzc1ZiksIChGSVhQX0RCTCkoQ2FsY0xkRGF0YShkZXRlY3RvclZhbHVlcy0+YXZnTnJnKyhGSVhQX0RCTCkxKSArIEZMMkZYQ09OU1RfREJMKDAuMDYyNWYpICsgRkwyRlhDT05TVF9EQkwoMC42ODc1ZikpKSkgPDwgMDsgICAgIC8qIHNjYWxlZCBieSAxLzJeODsgMl40NCAtPiBxbWYgZW5lcmd5IHNjYWxlICovCisgIC8qIDAuMzc1ID0gMy4wIC8gOC4wOyAwLjMxMTQzMDc1ODg5ID0gbG9nMihSRUxBWEFUSU9OKS82NC4wOyAwLjYyNSA9CisgICAqIGxvZygxNikvNjQuMDsgMC42ODc1ID0gNDQvNjQuMCAqLworICBvcmlnUXVvdGFNZWFuRmlsdCA9CisgICAgICAoZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDIuZiAqIDAuMzc1ZiksCisgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoQ2FsY0xkRGF0YShtYXgoZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5GaWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkxKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMzExNDMwNzU4ODlmKSkpKQorICAgICAgPDwgMDsgLyogc2NhbGVkIGJ5IDEvMl45ICovCisgIHNiclF1b3RhTWVhbkZpbHQgPQorICAgICAgKGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgyLmYgKiAwLjM3NWYpLAorICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKENhbGNMZERhdGEobWF4KGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5GaWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkxKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMzExNDMwNzU4ODlmKSkpKQorICAgICAgPDwgMDsgLyogc2NhbGVkIGJ5IDEvMl45ICovCisgIC8qIElmIGVuZXJneSBpcyB6ZXJvIHRoZW4gd2Ugd2lsbCBnZXQgZGlmZmVyZW50IHJlc3VsdHMgZm9yIGRpZmZlcmVudCB3b3JkCisgICAqIGxlbmd0aHMuICovCisgIG5yZyA9CisgICAgICAoZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDIuZiAqIDAuMzc1ZiksCisgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoQ2FsY0xkRGF0YShkZXRlY3RvclZhbHVlcy0+YXZnTnJnICsgKEZJWFBfREJMKTEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjA2MjVmKSArIEZMMkZYQ09OU1RfREJMKDAuNjg3NWYpKSkpCisgICAgICA8PCAwOyAvKiBzY2FsZWQgYnkgMS8yXjg7IDJeNDQgLT4gcW1mIGVuZXJneSBzY2FsZSAqLwogCi0gIEZES21lbWNweShxdWFudFN0ZXBzU2JyVG1wLHF1YW50U3RlcHNTYnIsbnVtUmVnaW9uc1NicipzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtY3B5KHF1YW50U3RlcHNPcmlnVG1wLHF1YW50U3RlcHNPcmlnLG51bVJlZ2lvbnNPcmlnKnNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jcHkocXVhbnRTdGVwc1NiclRtcCwgZGV0ZWN0b3JQYXJhbXMtPnF1YW50U3RlcHNTYnIsCisgICAgICAgICAgICBudW1SZWdpb25zU2JyICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNweShxdWFudFN0ZXBzT3JpZ1RtcCwgZGV0ZWN0b3JQYXJhbXMtPnF1YW50U3RlcHNPcmlnLAorICAgICAgICAgICAgbnVtUmVnaW9uc09yaWcgKiBzaXplb2YoRklYUF9EQkwpKTsKIAotICBpZigqcHJldlJlZ2lvblNiciA8IG51bVJlZ2lvbnNTYnIpCi0gICAgcXVhbnRTdGVwc1NiclRtcFsqcHJldlJlZ2lvblNicl0gPSBxdWFudFN0ZXBzU2JyWypwcmV2UmVnaW9uU2JyXSArIGh5c3RlcmVzaXM7Ci0gIGlmKCpwcmV2UmVnaW9uU2JyID4gMCkKLSAgICBxdWFudFN0ZXBzU2JyVG1wWypwcmV2UmVnaW9uU2JyIC0gMV0gPSBxdWFudFN0ZXBzU2JyWypwcmV2UmVnaW9uU2JyIC0gMV0gLSBoeXN0ZXJlc2lzOworICBpZiAoKnByZXZSZWdpb25TYnIgPCBudW1SZWdpb25zU2JyKQorICAgIHF1YW50U3RlcHNTYnJUbXBbKnByZXZSZWdpb25TYnJdID0KKyAgICAgICAgZGV0ZWN0b3JQYXJhbXMtPnF1YW50U3RlcHNTYnJbKnByZXZSZWdpb25TYnJdICsgaHlzdGVyZXNpczsKKyAgaWYgKCpwcmV2UmVnaW9uU2JyID4gMCkKKyAgICBxdWFudFN0ZXBzU2JyVG1wWypwcmV2UmVnaW9uU2JyIC0gMV0gPQorICAgICAgICBkZXRlY3RvclBhcmFtcy0+cXVhbnRTdGVwc1NiclsqcHJldlJlZ2lvblNiciAtIDFdIC0gaHlzdGVyZXNpczsKIAotICBpZigqcHJldlJlZ2lvbk9yaWcgPCBudW1SZWdpb25zT3JpZykKLSAgICBxdWFudFN0ZXBzT3JpZ1RtcFsqcHJldlJlZ2lvbk9yaWddID0gcXVhbnRTdGVwc09yaWdbKnByZXZSZWdpb25PcmlnXSArIGh5c3RlcmVzaXM7Ci0gIGlmKCpwcmV2UmVnaW9uT3JpZyA+IDApCi0gICAgcXVhbnRTdGVwc09yaWdUbXBbKnByZXZSZWdpb25PcmlnIC0gMV0gPSBxdWFudFN0ZXBzT3JpZ1sqcHJldlJlZ2lvbk9yaWcgLSAxXSAtIGh5c3RlcmVzaXM7CisgIGlmICgqcHJldlJlZ2lvbk9yaWcgPCBudW1SZWdpb25zT3JpZykKKyAgICBxdWFudFN0ZXBzT3JpZ1RtcFsqcHJldlJlZ2lvbk9yaWddID0KKyAgICAgICAgZGV0ZWN0b3JQYXJhbXMtPnF1YW50U3RlcHNPcmlnWypwcmV2UmVnaW9uT3JpZ10gKyBoeXN0ZXJlc2lzOworICBpZiAoKnByZXZSZWdpb25PcmlnID4gMCkKKyAgICBxdWFudFN0ZXBzT3JpZ1RtcFsqcHJldlJlZ2lvbk9yaWcgLSAxXSA9CisgICAgICAgIGRldGVjdG9yUGFyYW1zLT5xdWFudFN0ZXBzT3JpZ1sqcHJldlJlZ2lvbk9yaWcgLSAxXSAtIGh5c3RlcmVzaXM7CiAKLSAgcmVnaW9uU2JyICA9IGZpbmRSZWdpb24oc2JyUXVvdGFNZWFuRmlsdCwgcXVhbnRTdGVwc1NiclRtcCwgbnVtUmVnaW9uc1Nicik7CisgIHJlZ2lvblNiciA9IGZpbmRSZWdpb24oc2JyUXVvdGFNZWFuRmlsdCwgcXVhbnRTdGVwc1NiclRtcCwgbnVtUmVnaW9uc1Nicik7CiAgIHJlZ2lvbk9yaWcgPSBmaW5kUmVnaW9uKG9yaWdRdW90YU1lYW5GaWx0LCBxdWFudFN0ZXBzT3JpZ1RtcCwgbnVtUmVnaW9uc09yaWcpOwotICByZWdpb25OcmcgID0gZmluZFJlZ2lvbihucmcsbnJnQm9yZGVycyxudW1SZWdpb25zTnJnKTsKKyAgcmVnaW9uTnJnID0gZmluZFJlZ2lvbihucmcsIGRldGVjdG9yUGFyYW1zLT5ucmdCb3JkZXJzLCBudW1SZWdpb25zTnJnKTsKIAogICAqcHJldlJlZ2lvblNiciA9IHJlZ2lvblNicjsKICAgKnByZXZSZWdpb25PcmlnID0gcmVnaW9uT3JpZzsKIAogICAvKiBVc2UgZGlmZmVyZW50IHNldHRpbmdzIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQqLwotICBpbnZGaWx0TGV2ZWwgPSAodHJhbnNpZW50RmxhZyA9PSAxKSA/IGRldGVjdG9yUGFyYW1zLT5yZWdpb25TcGFjZVRyYW5zaWVudFtyZWdpb25TYnJdW3JlZ2lvbk9yaWddCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGV0ZWN0b3JQYXJhbXMtPnJlZ2lvblNwYWNlW3JlZ2lvblNicl1bcmVnaW9uT3JpZ107CisgIGludkZpbHRMZXZlbCA9CisgICAgICAodHJhbnNpZW50RmxhZyA9PSAxKQorICAgICAgICAgID8gZGV0ZWN0b3JQYXJhbXMtPnJlZ2lvblNwYWNlVHJhbnNpZW50W3JlZ2lvblNicl1bcmVnaW9uT3JpZ10KKyAgICAgICAgICA6IGRldGVjdG9yUGFyYW1zLT5yZWdpb25TcGFjZVtyZWdpb25TYnJdW3JlZ2lvbk9yaWddOwogCiAgIC8qIENvbXBlbnNhdGUgZm9yIGxvdyBlbmVyZ3kuKi8KLSAgaW52RmlsdExldmVsID0gbWF4KGludkZpbHRMZXZlbCArIGRldGVjdG9yUGFyYW1zLT5FbmVyZ3lDb21wRmFjdG9yW3JlZ2lvbk5yZ10sMCk7CisgIGludkZpbHRMZXZlbCA9CisgICAgICBtYXgoaW52RmlsdExldmVsICsgZGV0ZWN0b3JQYXJhbXMtPkVuZXJneUNvbXBGYWN0b3JbcmVnaW9uTnJnXSwgMCk7CiAKLSAgcmV0dXJuIChJTlZGX01PREUpIChpbnZGaWx0TGV2ZWwpOworICByZXR1cm4gKElOVkZfTU9ERSkoaW52RmlsdExldmVsKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDE2LDQ3ICs1MDUsMzkgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLUZES3NickVuY19xbWZJbnZlcnNlRmlsdGVyaW5nRGV0ZWN0b3IoSEFORExFX1NCUl9JTlZfRklMVF9FU1QgaEludkZpbHQsICAvKiE8IEhhbmRsZSB0byB0aGUgU0JSX0lOVl9GSUxUX0VTVCBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxdW90YU1hdHJpeCwgICAgICAgICAgICAvKiE8IFRoZSBtYXRyaXggaG9sZGluZyB0aGUgdG9uYWxpdHkgdmFsdWVzIG9mIHRoZSBvcmlnaW5hbC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnVmVjdG9yLCAgICAgICAgICAgICAgIC8qITwgVGhlIGVuZXJneSB2ZWN0b3IuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKmluZGV4VmVjdG9yLCAgICAgICAgICAgICAvKiE8IEluZGV4IHZlY3RvciB0byBvYnRhaW4gdGhlIHBhdGNoZWQgZGF0YS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnRJbmRleCwgICAgICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXguICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0b3BJbmRleCwgICAgICAgICAgICAgICAgICAgICAvKiE8IFN0b3AgaW5kZXguICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRyYW5zaWVudEZsYWcsICAgICAgICAgICAgICAgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBpZiBhIHRyYW5zaWVudCBpcyBwcmVzZW50IG9yIG5vdC4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSogaW5mVmVjICAgICAgICAgICAgICAgICAgLyohPCBWZWN0b3IgaG9sZGluZyB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWxzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK3ZvaWQgRkRLc2JyRW5jX3FtZkludmVyc2VGaWx0ZXJpbmdEZXRlY3RvcigKKyAgICBIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVAorICAgICAgICBoSW52RmlsdCwgICAgICAgICAgIC8qITwgSGFuZGxlIHRvIHRoZSBTQlJfSU5WX0ZJTFRfRVNUIHN0cnVjdC4gKi8KKyAgICBGSVhQX0RCTCAqKnF1b3RhTWF0cml4LCAvKiE8IFRoZSBtYXRyaXggaG9sZGluZyB0aGUgdG9uYWxpdHkgdmFsdWVzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLiAqLworICAgIEZJWFBfREJMICpucmdWZWN0b3IsICAgIC8qITwgVGhlIGVuZXJneSB2ZWN0b3IuICovCisgICAgU0NIQVIgKmluZGV4VmVjdG9yLCAgICAgLyohPCBJbmRleCB2ZWN0b3IgdG8gb2J0YWluIHRoZSBwYXRjaGVkIGRhdGEuICovCisgICAgSU5UIHN0YXJ0SW5kZXgsICAgICAgICAgLyohPCBTdGFydCBpbmRleC4gKi8KKyAgICBJTlQgc3RvcEluZGV4LCAgICAgICAgICAvKiE8IFN0b3AgaW5kZXguICovCisgICAgSU5UIHRyYW5zaWVudEZsYWcsIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQgb3Igbm90LiovCisgICAgSU5WRl9NT0RFICppbmZWZWMgIC8qITwgVmVjdG9yIGhvbGRpbmcgdGhlIGludmVyc2UgZmlsdGVyaW5nIGxldmVscy4gKi8KKykgewogICBJTlQgYmFuZDsKIAogICAvKgogICAgKiBEbyB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWwgZXN0aW1hdGlvbi4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBmb3IoYmFuZCA9IDAgOyBiYW5kIDwgaEludkZpbHQtPm5vRGV0ZWN0b3JCYW5kczsgYmFuZCsrKXsKKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IGhJbnZGaWx0LT5ub0RldGVjdG9yQmFuZHM7IGJhbmQrKykgewogICAgIElOVCBzdGFydENoYW5uZWwgPSBoSW52RmlsdC0+ZnJlcUJhbmRUYWJsZUludkZpbHRbYmFuZF07Ci0gICAgSU5UIHN0b3BDaGFubmVsICA9IGhJbnZGaWx0LT5mcmVxQmFuZFRhYmxlSW52RmlsdFtiYW5kKzFdOworICAgIElOVCBzdG9wQ2hhbm5lbCA9IGhJbnZGaWx0LT5mcmVxQmFuZFRhYmxlSW52RmlsdFtiYW5kICsgMV07CiAKKyAgICBjYWxjdWxhdGVEZXRlY3RvclZhbHVlcyhxdW90YU1hdHJpeCwgaW5kZXhWZWN0b3IsIG5yZ1ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEludkZpbHQtPmRldGVjdG9yVmFsdWVzW2JhbmRdLCBzdGFydENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcENoYW5uZWwsIHN0YXJ0SW5kZXgsIHN0b3BJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW52RmlsdC0+bnVtYmVyT2ZTdHJvbmdlc3QpOwogCi0gICAgY2FsY3VsYXRlRGV0ZWN0b3JWYWx1ZXMoIHF1b3RhTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJnVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoSW52RmlsdC0+ZGV0ZWN0b3JWYWx1ZXNbYmFuZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEludkZpbHQtPm51bWJlck9mU3Ryb25nZXN0KTsKLQotICAgIGluZlZlY1tiYW5kXT0gZGVjaXNpb25BbGdvcml0aG0oIGhJbnZGaWx0LT5kZXRlY3RvclBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoSW52RmlsdC0+ZGV0ZWN0b3JWYWx1ZXNbYmFuZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50RmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoSW52RmlsdC0+cHJldlJlZ2lvblNicltiYW5kXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoSW52RmlsdC0+cHJldlJlZ2lvbk9yaWdbYmFuZF0pOworICAgIGluZlZlY1tiYW5kXSA9IGRlY2lzaW9uQWxnb3JpdGhtKAorICAgICAgICBoSW52RmlsdC0+ZGV0ZWN0b3JQYXJhbXMsICZoSW52RmlsdC0+ZGV0ZWN0b3JWYWx1ZXNbYmFuZF0sCisgICAgICAgIHRyYW5zaWVudEZsYWcsICZoSW52RmlsdC0+cHJldlJlZ2lvblNicltiYW5kXSwKKyAgICAgICAgJmhJbnZGaWx0LT5wcmV2UmVnaW9uT3JpZ1tiYW5kXSk7CiAgIH0KLQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgICAgIEluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIGludmVyc2UgZmlsdGVyaW5nIGxldmVsIGVzdGltYXRvci4KQEAgLTQ2Niw0MyArNTQ3LDQzIEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19pbml0SW52RmlsdERldGVjdG9yIChIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVCBoSW52RmlsdCwgICAvKiE8IFBvaW50ZXIgdG8gYSBoYW5kbGUgdG8gdGhlIFNCUl9JTlZfRklMVF9FU1Qgc3RydWN0LiAqLwotICAgICAgICAgICAgICAgICAgICAgICBJTlQqIGZyZXFCYW5kVGFibGVEZXRlY3RvciwgICAgICAgICAgLyohPCBGcmVxdWVuY3kgYmFuZCB0YWJsZSBmb3IgdGhlIGludmVyc2UgZmlsdGVyaW5nLiAqLwotICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtRGV0ZWN0b3JCYW5kcywgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgaW52ZXJzZSBmaWx0ZXJpbmcgYmFuZHMuICovCi0gICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdXNlU3BlZWNoQ29uZmlnICAgICAgICAgLyohPCBGbGFnOiBhZGFwdCB0dW5pbmcgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gc3BlZWNoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKQoteworSU5UIEZES3NickVuY19pbml0SW52RmlsdERldGVjdG9yKAorICAgIEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUCisgICAgICAgIGhJbnZGaWx0LCAvKiE8IFBvaW50ZXIgdG8gYSBoYW5kbGUgdG8gdGhlIFNCUl9JTlZfRklMVF9FU1Qgc3RydWN0LiAqLworICAgIElOVCAqZnJlcUJhbmRUYWJsZURldGVjdG9yLCAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlIGZvciB0aGUgaW52ZXJzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJpbmcuICovCisgICAgSU5UIG51bURldGVjdG9yQmFuZHMsICAgICAgIC8qITwgTnVtYmVyIG9mIGludmVyc2UgZmlsdGVyaW5nIGJhbmRzLiAqLworICAgIFVJTlQKKyAgICAgICAgdXNlU3BlZWNoQ29uZmlnIC8qITwgRmxhZzogYWRhcHQgdHVuaW5nIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHNwZWVjaCovCispIHsKICAgSU5UIGk7CiAKLSAgRkRLbWVtY2xlYXIoIGhJbnZGaWx0LHNpemVvZihTQlJfSU5WX0ZJTFRfRVNUKSk7CisgIEZES21lbWNsZWFyKGhJbnZGaWx0LCBzaXplb2YoU0JSX0lOVl9GSUxUX0VTVCkpOwogCi0gIGhJbnZGaWx0LT5kZXRlY3RvclBhcmFtcyA9ICh1c2VTcGVlY2hDb25maWcpID8gJmRldGVjdG9yUGFyYW1zQUFDU3BlZWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmRldGVjdG9yUGFyYW1zQUFDIDsKKyAgaEludkZpbHQtPmRldGVjdG9yUGFyYW1zID0KKyAgICAgICh1c2VTcGVlY2hDb25maWcpID8gJmRldGVjdG9yUGFyYW1zQUFDU3BlZWNoIDogJmRldGVjdG9yUGFyYW1zQUFDOwogCiAgIGhJbnZGaWx0LT5ub0RldGVjdG9yQmFuZHNNYXggPSBudW1EZXRlY3RvckJhbmRzOwogCiAgIC8qCiAgICAgIE1lbW9yeSBpbml0aWFsaXNhdGlvbgogICAqLwotICBmb3IoaT0wO2k8aEludkZpbHQtPm5vRGV0ZWN0b3JCYW5kc01heDtpKyspeworICBmb3IgKGkgPSAwOyBpIDwgaEludkZpbHQtPm5vRGV0ZWN0b3JCYW5kc01heDsgaSsrKSB7CiAgICAgRkRLbWVtY2xlYXIoJmhJbnZGaWx0LT5kZXRlY3RvclZhbHVlc1tpXSwgc2l6ZW9mKERFVEVDVE9SX1ZBTFVFUykpOwotICAgIGhJbnZGaWx0LT5wcmV2SW52Zk1vZGVbaV0gICA9IElOVkZfT0ZGOworICAgIGhJbnZGaWx0LT5wcmV2SW52Zk1vZGVbaV0gPSBJTlZGX09GRjsKICAgICBoSW52RmlsdC0+cHJldlJlZ2lvbk9yaWdbaV0gPSAwOwotICAgIGhJbnZGaWx0LT5wcmV2UmVnaW9uU2JyW2ldICA9IDA7CisgICAgaEludkZpbHQtPnByZXZSZWdpb25TYnJbaV0gPSAwOwogICB9CiAKICAgLyoKICAgUmVzZXQgdGhlIGludmVyc2UgZmx0ZXJpbmcgZGV0ZWN0b3IuCiAgICovCi0gIEZES3NickVuY19yZXNldEludkZpbHREZXRlY3RvcihoSW52RmlsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZURldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBoSW52RmlsdC0+bm9EZXRlY3RvckJhbmRzTWF4KTsKKyAgRkRLc2JyRW5jX3Jlc2V0SW52RmlsdERldGVjdG9yKGhJbnZGaWx0LCBmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW52RmlsdC0+bm9EZXRlY3RvckJhbmRzTWF4KTsKIAogICByZXR1cm4gKDApOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgICAgIHJlc2V0cyBzYnIgaW52ZXJzZSBmaWx0ZXJpbmcgc3RydWN0dXJlLgpAQCAtNTEzLDE3ICs1OTQsMTcgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX3Jlc2V0SW52RmlsdERldGVjdG9yKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LCAvKiE8IEhhbmRsZSB0byB0aGUgU0JSX0lOVl9GSUxUX0VTVCBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgICAgICBJTlQqIGZyZXFCYW5kVGFibGVEZXRlY3RvciwgICAgICAgLyohPCBGcmVxdWVuY3kgYmFuZCB0YWJsZSBmb3IgdGhlIGludmVyc2UgZmlsdGVyaW5nLiAqLwotICAgICAgICAgICAgICAgICAgICAgSU5UIG51bURldGVjdG9yQmFuZHMpICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGludmVyc2UgZmlsdGVyaW5nIGJhbmRzLiAqLworSU5UIEZES3NickVuY19yZXNldEludkZpbHREZXRlY3RvcigKKyAgICBIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVAorICAgICAgICBoSW52RmlsdCwgICAgICAgICAgICAgICAvKiE8IEhhbmRsZSB0byB0aGUgU0JSX0lOVl9GSUxUX0VTVCBzdHJ1Y3QuICovCisgICAgSU5UICpmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGUgZm9yIHRoZSBpbnZlcnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmluZy4gKi8KKyAgICBJTlQgbnVtRGV0ZWN0b3JCYW5kcykgICAgICAgLyohPCBOdW1iZXIgb2YgaW52ZXJzZSBmaWx0ZXJpbmcgYmFuZHMuICovCiB7Ci0KLSAgaEludkZpbHQtPm51bWJlck9mU3Ryb25nZXN0ICAgICA9IDE7Ci0gIEZES21lbWNweShoSW52RmlsdC0+ZnJlcUJhbmRUYWJsZUludkZpbHQsZnJlcUJhbmRUYWJsZURldGVjdG9yLChudW1EZXRlY3RvckJhbmRzKzEpKnNpemVvZihJTlQpKTsKKyAgaEludkZpbHQtPm51bWJlck9mU3Ryb25nZXN0ID0gMTsKKyAgRkRLbWVtY3B5KGhJbnZGaWx0LT5mcmVxQmFuZFRhYmxlSW52RmlsdCwgZnJlcUJhbmRUYWJsZURldGVjdG9yLAorICAgICAgICAgICAgKG51bURldGVjdG9yQmFuZHMgKyAxKSAqIHNpemVvZihJTlQpKTsKICAgaEludkZpbHQtPm5vRGV0ZWN0b3JCYW5kcyA9IG51bURldGVjdG9yQmFuZHM7CiAKICAgcmV0dXJuICgwKTsKIH0KLQotCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL2ludmZfZXN0LmggYi9saWJTQlJlbmMvc3JjL2ludmZfZXN0LmgKaW5kZXggMmJkMmE3OC4uM2FiNjcyNiAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9pbnZmX2VzdC5oCisrKyBiL2xpYlNCUmVuYy9zcmMvaW52Zl9lc3QuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0MCArOTAsNDYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBJbnZlcnNlIEZpbHRlcmluZyBkZXRlY3Rpb24gcHJvdG90eXBlcyAgCisgIFxicmllZiAgSW52ZXJzZSBGaWx0ZXJpbmcgZGV0ZWN0aW9uIHByb3RvdHlwZXMgJFJldmlzaW9uOiA5Mjc5MCAkCiAqLwotI2lmbmRlZiBfSU5WX0ZJTFRfREVUX0gKLSNkZWZpbmUgX0lOVl9GSUxUX0RFVF9ICisjaWZuZGVmIElOVkZfRVNUX0gKKyNkZWZpbmUgSU5WRl9FU1RfSAogCiAjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKICNpbmNsdWRlICJzYnJfZGVmLmgiCiAKICNkZWZpbmUgSU5WRl9TTU9PVEhJTkdfTEVOR1RIIDIKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgY29uc3QgRklYUF9EQkwgKnF1YW50U3RlcHNTYnI7CiAgIGNvbnN0IEZJWFBfREJMICpxdWFudFN0ZXBzT3JpZzsKICAgY29uc3QgRklYUF9EQkwgKm5yZ0JvcmRlcnM7Ci0gIElOVCAgIG51bVJlZ2lvbnNTYnI7Ci0gIElOVCAgIG51bVJlZ2lvbnNPcmlnOwotICBJTlQgICBudW1SZWdpb25zTnJnOworICBJTlQgbnVtUmVnaW9uc1NicjsKKyAgSU5UIG51bVJlZ2lvbnNPcmlnOworICBJTlQgbnVtUmVnaW9uc05yZzsKICAgSU5WRl9NT0RFIHJlZ2lvblNwYWNlWzVdWzVdOwogICBJTlZGX01PREUgcmVnaW9uU3BhY2VUcmFuc2llbnRbNV1bNV07CiAgIElOVCBFbmVyZ3lDb21wRmFjdG9yWzVdOwogCi19REVURUNUT1JfUEFSQU1FVEVSUzsKK30gREVURUNUT1JfUEFSQU1FVEVSUzsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRklYUF9EQkwgIG9yaWdRdW90YU1lYW5bSU5WRl9TTU9PVEhJTkdfTEVOR1RIKzFdOwotICBGSVhQX0RCTCAgc2JyUXVvdGFNZWFuW0lOVkZfU01PT1RISU5HX0xFTkdUSCsxXTsKLSAgRklYUF9EQkwgIG9yaWdRdW90YU1lYW5TdHJvbmdlc3RbSU5WRl9TTU9PVEhJTkdfTEVOR1RIKzFdOwotICBGSVhQX0RCTCAgc2JyUXVvdGFNZWFuU3Ryb25nZXN0W0lOVkZfU01PT1RISU5HX0xFTkdUSCsxXTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9EQkwgb3JpZ1F1b3RhTWVhbltJTlZGX1NNT09USElOR19MRU5HVEggKyAxXTsKKyAgRklYUF9EQkwgc2JyUXVvdGFNZWFuW0lOVkZfU01PT1RISU5HX0xFTkdUSCArIDFdOworICBGSVhQX0RCTCBvcmlnUXVvdGFNZWFuU3Ryb25nZXN0W0lOVkZfU01PT1RISU5HX0xFTkdUSCArIDFdOworICBGSVhQX0RCTCBzYnJRdW90YU1lYW5TdHJvbmdlc3RbSU5WRl9TTU9PVEhJTkdfTEVOR1RIICsgMV07CiAKICAgRklYUF9EQkwgb3JpZ1F1b3RhTWVhbkZpbHQ7CiAgIEZJWFBfREJMIHNiclF1b3RhTWVhbkZpbHQ7CkBAIC0xMjMsMTIgKzE0MCw5IEBACiAgIEZJWFBfREJMIHNiclF1b3RhTWF4OwogCiAgIEZJWFBfREJMIGF2Z05yZzsKLX1ERVRFQ1RPUl9WQUxVRVM7Cit9IERFVEVDVE9SX1ZBTFVFUzsKIAotCi0KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIElOVCBudW1iZXJPZlN0cm9uZ2VzdDsKIAogICBJTlQgcHJldlJlZ2lvblNicltNQVhfTlVNX05PSVNFX1ZBTFVFU107CkBAIC0xNDUsMzEgKzE1OSwyMyBAQAogCiAgIEZJWFBfREJMIG5yZ0F2ZzsKICAgRklYUF9EQkwgd21RbWZbTUFYX05VTV9OT0lTRV9WQUxVRVNdOwotfQotU0JSX0lOVl9GSUxUX0VTVDsKK30gU0JSX0lOVl9GSUxUX0VTVDsKIAogdHlwZWRlZiBTQlJfSU5WX0ZJTFRfRVNUICpIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVDsKIAotdm9pZAotRkRLc2JyRW5jX3FtZkludmVyc2VGaWx0ZXJpbmdEZXRlY3RvcihIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVCBoSW52RmlsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKiBxdW90YU1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICppbmRleFZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0cmFuc2llbnRGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSogaW5mVmVjKTsKK3ZvaWQgRkRLc2JyRW5jX3FtZkludmVyc2VGaWx0ZXJpbmdEZXRlY3RvcihIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVCBoSW52RmlsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnF1b3RhTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKmluZGV4VmVjdG9yLCBJTlQgc3RhcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcEluZGV4LCBJTlQgdHJhbnNpZW50RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgKmluZlZlYyk7CiAKLUlOVAotRkRLc2JyRW5jX2luaXRJbnZGaWx0RGV0ZWN0b3IgKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LAotICAgICAgICAgICAgICAgICAgICAgICBJTlQqIGZyZXFCYW5kVGFibGVEZXRlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bURldGVjdG9yQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdXNlU3BlZWNoQ29uZmlnKTsKK0lOVCBGREtzYnJFbmNfaW5pdEludkZpbHREZXRlY3RvcihIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVCBoSW52RmlsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmZyZXFCYW5kVGFibGVEZXRlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtRGV0ZWN0b3JCYW5kcywgVUlOVCB1c2VTcGVlY2hDb25maWcpOwogCi1JTlQKLUZES3NickVuY19yZXNldEludkZpbHREZXRlY3RvcihIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVCBoSW52RmlsdCwKLSAgICAgICAgICAgICAgICAgICAgIElOVCogZnJlcUJhbmRUYWJsZURldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgSU5UIG51bURldGVjdG9yQmFuZHMpOworSU5UIEZES3NickVuY19yZXNldEludkZpbHREZXRlY3RvcihIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVCBoSW52RmlsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1EZXRlY3RvckJhbmRzKTsKIAogI2VuZGlmIC8qIF9RTUZfSU5WX0ZJTFRfSCAqLwotCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL21oX2RldC5jcHAgYi9saWJTQlJlbmMvc3JjL21oX2RldC5jcHAKaW5kZXggYmM4MGExNS4uMmYzYjM4NiAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9taF9kZXQuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvbWhfZGV0LmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw2MSArOTAsNzggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAibWhfZGV0LmgiCiAKLSNpbmNsdWRlICJzYnJfcmFtLmgiCisjaW5jbHVkZSAic2JyZW5jX3JhbS5oIgogI2luY2x1ZGUgInNicl9taXNjLmgiCiAKLQogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKLSNkZWZpbmUgU0ZNX1NISUZUIDIgICAgIC8qIEF0dGVudGlvbjogU0ZNX1NDQUxFIGRlcGVuZHMgb24gU0ZNX1NISUZUICovCi0jZGVmaW5lIFNGTV9TQ0FMRSAoTUFYVkFMX0RCTCA+PiBTRk1fU0hJRlQpICAgLyogMS4wID4+IFNGTV9TSElGVCAqLwotCisjZGVmaW5lIFNGTV9TSElGVCAyIC8qIEF0dGVudGlvbjogU0ZNX1NDQUxFIGRlcGVuZHMgb24gU0ZNX1NISUZUICovCisjZGVmaW5lIFNGTV9TQ0FMRSAoTUFYVkFMX0RCTCA+PiBTRk1fU0hJRlQpIC8qIDEuMCA+PiBTRk1fU0hJRlQgKi8KIAogLyohPCBEZXRlY3RvciBQYXJhbWV0ZXJzIGZvciBBQUMgY29yZSBjb2RlYy4gKi8KIHN0YXRpYyBjb25zdCBERVRFQ1RPUl9QQVJBTUVURVJTX01IIHBhcmFtc0FhYyA9IHsKLTksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBkZWx0YVRpbWUgKi8KLXsKLUZMMkZYQ09OU1RfREJMKDIwLjBmKlJFTEFYQVRJT05fRkxPQVQpLCAgICAgICAgLyohPCB0aHJlc0hvbGREaWZmICovCi1GTDJGWENPTlNUX0RCTCgxLjI2ZipSRUxBWEFUSU9OX0ZMT0FUKSwgICAgICAgIC8qITwgdGhyZXNIb2xkRGlmZkd1aWRlICovCi1GTDJGWENPTlNUX0RCTCgxNS4wZipSRUxBWEFUSU9OX0ZMT0FUKSwgICAgICAgIC8qITwgdGhyZXNIb2xkVG9uZSAqLwotRkwyRlhDT05TVF9EQkwoKDEuMGYvMTUuMGYpKlJFTEFYQVRJT05fRkxPQVQpLCAvKiE8IGludlRocmVzSG9sZFRvbmUgKi8KLUZMMkZYQ09OU1RfREJMKDEuMjZmKlJFTEFYQVRJT05fRkxPQVQpLCAgICAgICAgLyohPCB0aHJlc0hvbGRUb25lR3VpZGUgKi8KLUZMMkZYQ09OU1RfREJMKDAuM2YpPj5TRk1fU0hJRlQsICAgICAgICAgICAgICAgLyohPCBzZm1UaHJlc1NiciAqLwotRkwyRlhDT05TVF9EQkwoMC4xZik+PlNGTV9TSElGVCwgICAgICAgICAgICAgICAvKiE8IHNmbVRocmVzT3JpZyAqLwotRkwyRlhDT05TVF9EQkwoMC4zZiksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGRlY2F5R3VpZGVPcmlnICovCi1GTDJGWENPTlNUX0RCTCgwLjVmKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZGVjYXlHdWlkZURpZmYgKi8KLUZMMkZYQ09OU1RfREJMKC0wLjAwMDExMjk5MzI2OSksICAvKiBMRDY0KEZMMkZYQ09OU1RfREJMKDAuOTk1ZikpICovIC8qITwgZGVyaXZUaHJlc01heExENjQgKi8KLUZMMkZYQ09OU1RfREJMKC0wLjAwMDExMjk5MzI2OSksICAvKiBMRDY0KEZMMkZYQ09OU1RfREJMKDAuOTk1ZikpICovIC8qITwgZGVyaXZUaHJlc0JlbG93TEQ2NCAqLwotRkwyRlhDT05TVF9EQkwoLTAuMDA1MDMwMTI2NDgzZikgLyogTEQ2NChGTDJGWENPTlNUX0RCTCgwLjhmKSkgKi8gICAgLyohPCBkZXJpdlRocmVzQWJvdmVMRDY0ICovCi19LAotNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG1heENvbXAgKi8KKyAgICA5LCAvKiE8IGRlbHRhVGltZSAqLworICAgIHsKKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMjAuMGYgKiBSRUxBWEFUSU9OX0ZMT0FUKSwgLyohPCB0aHJlc0hvbGREaWZmICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMjZmICogUkVMQVhBVElPTl9GTE9BVCksIC8qITwgdGhyZXNIb2xkRGlmZkd1aWRlICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKDE1LjBmICogUkVMQVhBVElPTl9GTE9BVCksIC8qITwgdGhyZXNIb2xkVG9uZSAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgoMS4wZiAvIDE1LjBmKSAqCisgICAgICAgICAgICAgICAgICAgICAgIFJFTEFYQVRJT05fRkxPQVQpLCAgICAgICAgIC8qITwgaW52VGhyZXNIb2xkVG9uZSAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgxLjI2ZiAqIFJFTEFYQVRJT05fRkxPQVQpLCAvKiE8IHRocmVzSG9sZFRvbmVHdWlkZSAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjNmKSA+PiBTRk1fU0hJRlQsICAgICAgICAvKiE8IHNmbVRocmVzU2JyICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMWYpID4+IFNGTV9TSElGVCwgICAgICAgIC8qITwgc2ZtVGhyZXNPcmlnICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuM2YpLCAgICAgICAgICAgICAgICAgICAgIC8qITwgZGVjYXlHdWlkZU9yaWcgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMC41ZiksICAgICAgICAgICAgICAgICAgICAgLyohPCBkZWNheUd1aWRlRGlmZiAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgtMC4wMDAxMTI5OTMyNjkpLAorICAgICAgICAvKiBMRDY0KEZMMkZYQ09OU1RfREJMKDAuOTk1ZikpICovIC8qITwgZGVyaXZUaHJlc01heExENjQgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoLTAuMDAwMTEyOTkzMjY5KSwKKyAgICAgICAgLyogTEQ2NChGTDJGWENPTlNUX0RCTCgwLjk5NWYpKSAqLyAvKiE8IGRlcml2VGhyZXNCZWxvd0xENjQgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoCisgICAgICAgICAgICAtMC4wMDUwMzAxMjY0ODNmKSAvKiBMRDY0KEZMMkZYQ09OU1RfREJMKDAuOGYpKSAqLyAvKiE8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJpdlRocmVzQWJvdmVMRDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB9LAorICAgIDUwIC8qITwgbWF4Q29tcCAqLwogfTsKIAogLyohPCBEZXRlY3RvciBQYXJhbWV0ZXJzIGZvciBBQUMgTEQgY29yZSBjb2RlYy4gKi8KIHN0YXRpYyBjb25zdCBERVRFQ1RPUl9QQVJBTUVURVJTX01IIHBhcmFtc0FhY0xkID0gewotMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERlbHRhIHRpbWUuICovCi17Ci1GTDJGWENPTlNUX0RCTCgyNS4wZipSRUxBWEFUSU9OX0ZMT0FUKSwgICAgICAgIC8qITwgdGhyZXNIb2xkRGlmZiAqLwotRkwyRlhDT05TVF9EQkwoMS4yNmYqUkVMQVhBVElPTl9GTE9BVCksICAgICAgICAvKiE8IHRyZXNIb2xkRGlmZkd1aWRlICovCi1GTDJGWENPTlNUX0RCTCgxNS4wZipSRUxBWEFUSU9OX0ZMT0FUKSwgICAgICAgIC8qITwgdGhyZXNIb2xkVG9uZSAqLwotRkwyRlhDT05TVF9EQkwoKDEuMGYvMTUuMGYpKlJFTEFYQVRJT05fRkxPQVQpLCAvKiE8IGludlRocmVzSG9sZFRvbmUgKi8KLUZMMkZYQ09OU1RfREJMKDEuMjZmKlJFTEFYQVRJT05fRkxPQVQpLCAgICAgICAgLyohPCB0aHJlc0hvbGRUb25lR3VpZGUgKi8KLUZMMkZYQ09OU1RfREJMKDAuM2YpPj5TRk1fU0hJRlQsICAgICAgICAgICAgICAgLyohPCBzZm1UaHJlc1NiciAqLwotRkwyRlhDT05TVF9EQkwoMC4xZik+PlNGTV9TSElGVCwgICAgICAgICAgICAgICAvKiE8IHNmbVRocmVzT3JpZyAqLwotRkwyRlhDT05TVF9EQkwoMC4zZiksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGRlY2F5R3VpZGVPcmlnICovCi1GTDJGWENPTlNUX0RCTCgwLjJmKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZGVjYXlHdWlkZURpZmYgKi8KLUZMMkZYQ09OU1RfREJMKC0wLjAwMDExMjk5MzI2OSksICAvKiBMRDY0KEZMMkZYQ09OU1RfREJMKDAuOTk1ZikpICovICAvKiE8IGRlcml2VGhyZXNNYXhMRDY0ICovCi1GTDJGWENPTlNUX0RCTCgtMC4wMDAxMTI5OTMyNjkpLCAgLyogTEQ2NChGTDJGWENPTlNUX0RCTCgwLjk5NWYpKSAqLyAgLyohPCBkZXJpdlRocmVzQmVsb3dMRDY0ICovCi1GTDJGWENPTlNUX0RCTCgtMC4wMDUwMzAxMjY0ODNmKSAvKiBMRDY0KEZMMkZYQ09OU1RfREJMKDAuOGYpKSAqLyAgICAgLyohPCBkZXJpdlRocmVzQWJvdmVMRDY0ICovCi19LAotNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG1heENvbXAgKi8KKyAgICAxNiwgLyohPCBEZWx0YSB0aW1lLiAqLworICAgIHsKKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMjUuMGYgKiBSRUxBWEFUSU9OX0ZMT0FUKSwgLyohPCB0aHJlc0hvbGREaWZmICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMjZmICogUkVMQVhBVElPTl9GTE9BVCksIC8qITwgdHJlc0hvbGREaWZmR3VpZGUgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMTUuMGYgKiBSRUxBWEFUSU9OX0ZMT0FUKSwgLyohPCB0aHJlc0hvbGRUb25lICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKCgxLjBmIC8gMTUuMGYpICoKKyAgICAgICAgICAgICAgICAgICAgICAgUkVMQVhBVElPTl9GTE9BVCksICAgICAgICAgLyohPCBpbnZUaHJlc0hvbGRUb25lICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMjZmICogUkVMQVhBVElPTl9GTE9BVCksIC8qITwgdGhyZXNIb2xkVG9uZUd1aWRlICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuM2YpID4+IFNGTV9TSElGVCwgICAgICAgIC8qITwgc2ZtVGhyZXNTYnIgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4xZikgPj4gU0ZNX1NISUZULCAgICAgICAgLyohPCBzZm1UaHJlc09yaWcgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4zZiksICAgICAgICAgICAgICAgICAgICAgLyohPCBkZWNheUd1aWRlT3JpZyAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjJmKSwgICAgICAgICAgICAgICAgICAgICAvKiE8IGRlY2F5R3VpZGVEaWZmICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjAwMDExMjk5MzI2OSksCisgICAgICAgIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC45OTVmKSkgKi8gLyohPCBkZXJpdlRocmVzTWF4TEQ2NCAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgtMC4wMDAxMTI5OTMyNjkpLAorICAgICAgICAvKiBMRDY0KEZMMkZYQ09OU1RfREJMKDAuOTk1ZikpICovIC8qITwgZGVyaXZUaHJlc0JlbG93TEQ2NCAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgKKyAgICAgICAgICAgIC0wLjAwNTAzMDEyNjQ4M2YpIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC44ZikpICovIC8qITwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2VGhyZXNBYm92ZUxENjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIH0sCisgICAgNTAgLyohPCBtYXhDb21wICovCiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgICAgIENhbGN1bGF0ZXMgdGhlIGRpZmZlcmVuY2UgaW4gdG9uYWxpdHkgYmV0d2VlbiBvcmlnaW5hbCBhbmQgU0JSCkBAIC0xNDUsMzkgKzE3MywzNiBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZGlmZihGSVhQX0RCTCAqUkVTVFJJQ1QgcFRvbmFsaXR5T3JpZywKLSAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBEaWZmTWFwcGVkMlNjZmIsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpSRVNUUklDVCBwRnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgSU5UICAgICAgIG5TY2ZiLAotICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqaW5kZXhWZWN0b3IpCi17CitzdGF0aWMgdm9pZCBkaWZmKEZJWFBfREJMICpSRVNUUklDVCBwVG9uYWxpdHlPcmlnLCBGSVhQX0RCTCAqcERpZmZNYXBwZWQyU2NmYiwKKyAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKlJFU1RSSUNUIHBGcmVxQmFuZFRhYmxlLCBJTlQgblNjZmIsCisgICAgICAgICAgICAgICAgIFNDSEFSICppbmRleFZlY3RvcikgewogICBVQ0hBUiBpLCBsbCwgbHUsIGs7CiAgIEZJWFBfREJMIG1heFZhbE9yaWcsIG1heFZhbFNiciwgdG1wOwogICBJTlQgc2NhbGU7CiAKLSAgZm9yKGk9MDsgaSA8IG5TY2ZiOyBpKyspeworICBmb3IgKGkgPSAwOyBpIDwgblNjZmI7IGkrKykgewogICAgIGxsID0gcEZyZXFCYW5kVGFibGVbaV07Ci0gICAgbHUgPSBwRnJlcUJhbmRUYWJsZVtpKzFdOworICAgIGx1ID0gcEZyZXFCYW5kVGFibGVbaSArIDFdOwogCiAgICAgbWF4VmFsT3JpZyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgIG1heFZhbFNiciA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCi0gICAgZm9yKGs9bGw7azxsdTtrKyspeworICAgIGZvciAoayA9IGxsOyBrIDwgbHU7IGsrKykgewogICAgICAgbWF4VmFsT3JpZyA9IGZpeE1heChtYXhWYWxPcmlnLCBwVG9uYWxpdHlPcmlnW2tdKTsKICAgICAgIG1heFZhbFNiciA9IGZpeE1heChtYXhWYWxTYnIsIHBUb25hbGl0eU9yaWdbaW5kZXhWZWN0b3Jba11dKTsKICAgICB9CiAKICAgICBpZiAoKG1heFZhbFNiciA+PSBSRUxBWEFUSU9OKSkgewotICAgICAgICB0bXAgPSBmRGl2Tm9ybShtYXhWYWxPcmlnLCBtYXhWYWxTYnIsICZzY2FsZSk7Ci0gICAgICAgIHBEaWZmTWFwcGVkMlNjZmJbaV0gPSBzY2FsZVZhbHVlKGZNdWx0KHRtcCxSRUxBWEFUSU9OX0ZSQUNUKSwgZml4TWF4KC0oREZSQUNUX0JJVFMtMSksKHNjYWxlLVJFTEFYQVRJT05fU0hJRlQpKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBwRGlmZk1hcHBlZDJTY2ZiW2ldID0gbWF4VmFsT3JpZzsKKyAgICAgIHRtcCA9IGZEaXZOb3JtKG1heFZhbE9yaWcsIG1heFZhbFNiciwgJnNjYWxlKTsKKyAgICAgIHBEaWZmTWFwcGVkMlNjZmJbaV0gPQorICAgICAgICAgIHNjYWxlVmFsdWUoZk11bHQodG1wLCBSRUxBWEFUSU9OX0ZSQUNUKSwKKyAgICAgICAgICAgICAgICAgICAgIGZpeE1heCgtKERGUkFDVF9CSVRTIC0gMSksIChzY2FsZSAtIFJFTEFYQVRJT05fU0hJRlQpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBEaWZmTWFwcGVkMlNjZmJbaV0gPSBtYXhWYWxPcmlnOwogICAgIH0KICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgICAgIENhbGN1bGF0ZXMgYSBmbGF0bmVzcyBtZWFzdXJlIG9mIHRoZSB0b25hbGl0eSBtZWFzdXJlcy4KQEAgLTE5OSw4NyArMjI0LDgxIEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjYWxjdWxhdGVGbGF0bmVzc01lYXN1cmUoRklYUF9EQkwgKnBRdW90YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqaW5kZXhWZWN0b3IsCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVGbGF0bmVzc01lYXN1cmUoRklYUF9EQkwgKnBRdW90YUJ1ZmZlciwgU0NIQVIgKmluZGV4VmVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwU2ZtT3JpZ1ZlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcFNmbVNiclZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqcEZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgIG5TZmIpCi17Ci0gIElOVCBpLGo7Ci0gIEZJWFBfREJMIGludkJhbmRzLHRtcDEsdG1wMjsKLSAgSU5UIHNoaWZ0RmFjMCxzaGlmdEZhY1N1bTA7Ci0gIElOVCBzaGlmdEZhYzEsc2hpZnRGYWNTdW0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpwRnJlcUJhbmRUYWJsZSwgSU5UIG5TZmIpIHsKKyAgSU5UIGksIGo7CisgIEZJWFBfREJMIGludkJhbmRzLCB0bXAxLCB0bXAyOworICBJTlQgc2hpZnRGYWMwLCBzaGlmdEZhY1N1bTA7CisgIElOVCBzaGlmdEZhYzEsIHNoaWZ0RmFjU3VtMTsKICAgRklYUF9EQkwgYWNjdTsKIAotICBmb3IoaT0wO2k8blNmYjtpKyspCi0gIHsKKyAgZm9yIChpID0gMDsgaSA8IG5TZmI7IGkrKykgewogICAgIElOVCBsbCA9IHBGcmVxQmFuZFRhYmxlW2ldOwotICAgIElOVCBsdSA9IHBGcmVxQmFuZFRhYmxlW2krMV07Ci0gICAgcFNmbU9yaWdWZWNbaV0gPSAoRklYUF9EQkwpKE1BWFZBTF9EQkw+PjIpOwotICAgIHBTZm1TYnJWZWNbaV0gID0gKEZJWFBfREJMKShNQVhWQUxfREJMPj4yKTsKKyAgICBJTlQgbHUgPSBwRnJlcUJhbmRUYWJsZVtpICsgMV07CisgICAgcFNmbU9yaWdWZWNbaV0gPSAoRklYUF9EQkwpKE1BWFZBTF9EQkwgPj4gMik7CisgICAgcFNmbVNiclZlY1tpXSA9IChGSVhQX0RCTCkoTUFYVkFMX0RCTCA+PiAyKTsKIAotICAgIGlmKGx1IC0gbGwgPiAxKXsKLSAgICAgIEZJWFBfREJMIGFtT3JpZyxhbVRyYW5zcCxnbU9yaWcsZ21UcmFuc3Asc2ZtT3JpZyxzZm1UcmFuc3A7Ci0gICAgICBpbnZCYW5kcyA9IEdldEludkludChsdS1sbCk7CisgICAgaWYgKGx1IC0gbGwgPiAxKSB7CisgICAgICBGSVhQX0RCTCBhbU9yaWcsIGFtVHJhbnNwLCBnbU9yaWcsIGdtVHJhbnNwLCBzZm1PcmlnLCBzZm1UcmFuc3A7CisgICAgICBpbnZCYW5kcyA9IEdldEludkludChsdSAtIGxsKTsKICAgICAgIHNoaWZ0RmFjU3VtMCA9IDA7CiAgICAgICBzaGlmdEZhY1N1bTEgPSAwOwogICAgICAgYW1PcmlnID0gYW1UcmFuc3AgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgIGdtT3JpZyA9IGdtVHJhbnNwID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CiAKLSAgICAgIGZvcihqPSBsbDsgajxsdTsgaisrKSB7Ci0gICAgICAgIHNmbU9yaWcgICA9IHBRdW90YUJ1ZmZlcltqXTsKKyAgICAgIGZvciAoaiA9IGxsOyBqIDwgbHU7IGorKykgeworICAgICAgICBzZm1PcmlnID0gcFF1b3RhQnVmZmVyW2pdOwogICAgICAgICBzZm1UcmFuc3AgPSBwUXVvdGFCdWZmZXJbaW5kZXhWZWN0b3Jbal1dOwogCi0gICAgICAgIGFtT3JpZyAgICs9IGZNdWx0KHNmbU9yaWcsIGludkJhbmRzKTsKKyAgICAgICAgYW1PcmlnICs9IGZNdWx0KHNmbU9yaWcsIGludkJhbmRzKTsKICAgICAgICAgYW1UcmFuc3AgKz0gZk11bHQoc2ZtVHJhbnNwLCBpbnZCYW5kcyk7CiAKICAgICAgICAgc2hpZnRGYWMwID0gQ291bnRMZWFkaW5nQml0cyhzZm1PcmlnKTsKICAgICAgICAgc2hpZnRGYWMxID0gQ291bnRMZWFkaW5nQml0cyhzZm1UcmFuc3ApOwogCi0gICAgICAgIGdtT3JpZyAgID0gZk11bHQoZ21PcmlnLCBzZm1PcmlnPDxzaGlmdEZhYzApOwotICAgICAgICBnbVRyYW5zcCA9IGZNdWx0KGdtVHJhbnNwLCBzZm1UcmFuc3A8PHNoaWZ0RmFjMSk7CisgICAgICAgIGdtT3JpZyA9IGZNdWx0KGdtT3JpZywgc2ZtT3JpZyA8PCBzaGlmdEZhYzApOworICAgICAgICBnbVRyYW5zcCA9IGZNdWx0KGdtVHJhbnNwLCBzZm1UcmFuc3AgPDwgc2hpZnRGYWMxKTsKIAogICAgICAgICBzaGlmdEZhY1N1bTAgKz0gc2hpZnRGYWMwOwogICAgICAgICBzaGlmdEZhY1N1bTEgKz0gc2hpZnRGYWMxOwogICAgICAgfQogCiAgICAgICBpZiAoZ21PcmlnID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKLQotICAgICAgICB0bXAxID0gQ2FsY0xkRGF0YShnbU9yaWcpOyAgICAgIC8qIENhbGNMZDY0KHgpLzY0ICovCi0gICAgICAgIHRtcDEgPSBmTXVsdChpbnZCYW5kcywgdG1wMSk7ICAgLyogeSpDYWxjTGQ2NCh4KS82NCAqLworICAgICAgICB0bXAxID0gQ2FsY0xkRGF0YShnbU9yaWcpOyAgICAvKiBDYWxjTGQ2NCh4KS82NCAqLworICAgICAgICB0bXAxID0gZk11bHQoaW52QmFuZHMsIHRtcDEpOyAvKiB5KkNhbGNMZDY0KHgpLzY0ICovCiAKICAgICAgICAgLyogeSprLzY0ICovCi0gICAgICAgIGFjY3UgPSAoRklYUF9EQkwpLXNoaWZ0RmFjU3VtMCA8PCAoREZSQUNUX0JJVFMtMS04KTsKLSAgICAgICAgdG1wMiA9IGZNdWx0RGl2MihpbnZCYW5kcywgYWNjdSkgPDwgKDIrMSk7CisgICAgICAgIGFjY3UgPSAoRklYUF9EQkwpLXNoaWZ0RmFjU3VtMCA8PCAoREZSQUNUX0JJVFMgLSAxIC0gOCk7CisgICAgICAgIHRtcDIgPSBmTXVsdERpdjIoaW52QmFuZHMsIGFjY3UpIDw8ICgyICsgMSk7CiAKLSAgICAgICAgdG1wMiA9IHRtcDEgKyB0bXAyOyAgICAgICAgICAgICAvKiB5KkNhbGNMZDY0KHgpLzY0ICsgeSprLzY0ICovCi0gICAgICAgIGdtT3JpZyA9IENhbGNJbnZMZERhdGEodG1wMik7ICAgLyogQ2FsY0ludkxkNjQoeicpOyAqLwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICAgIHRtcDIgPSB0bXAxICsgdG1wMjsgICAgICAgICAgIC8qIHkqQ2FsY0xkNjQoeCkvNjQgKyB5KmsvNjQgKi8KKyAgICAgICAgZ21PcmlnID0gQ2FsY0ludkxkRGF0YSh0bXAyKTsgLyogQ2FsY0ludkxkNjQoeicpOyAqLworICAgICAgfSBlbHNlIHsKICAgICAgICAgZ21PcmlnID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICB9CiAKICAgICAgIGlmIChnbVRyYW5zcCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7Ci0KLSAgICAgICAgdG1wMSA9IENhbGNMZERhdGEoZ21UcmFuc3ApOyAgICAvKiBDYWxjTGQ2NCh4KS82NCAqLwotICAgICAgICB0bXAxID0gZk11bHQoaW52QmFuZHMsIHRtcDEpOyAgIC8qIHkqQ2FsY0xkNjQoeCkvNjQgKi8KKyAgICAgICAgdG1wMSA9IENhbGNMZERhdGEoZ21UcmFuc3ApOyAgLyogQ2FsY0xkNjQoeCkvNjQgKi8KKyAgICAgICAgdG1wMSA9IGZNdWx0KGludkJhbmRzLCB0bXAxKTsgLyogeSpDYWxjTGQ2NCh4KS82NCAqLwogCiAgICAgICAgIC8qIHkqay82NCAqLwotICAgICAgICBhY2N1ID0gKEZJWFBfREJMKS1zaGlmdEZhY1N1bTEgPDwgKERGUkFDVF9CSVRTLTEtOCk7Ci0gICAgICAgIHRtcDIgPSBmTXVsdERpdjIoaW52QmFuZHMsIGFjY3UpIDw8ICgyKzEpOworICAgICAgICBhY2N1ID0gKEZJWFBfREJMKS1zaGlmdEZhY1N1bTEgPDwgKERGUkFDVF9CSVRTIC0gMSAtIDgpOworICAgICAgICB0bXAyID0gZk11bHREaXYyKGludkJhbmRzLCBhY2N1KSA8PCAoMiArIDEpOwogCiAgICAgICAgIHRtcDIgPSB0bXAxICsgdG1wMjsgICAgICAgICAgICAgLyogeSpDYWxjTGQ2NCh4KS82NCArIHkqay82NCAqLwogICAgICAgICBnbVRyYW5zcCA9IENhbGNJbnZMZERhdGEodG1wMik7IC8qIENhbGNJbnZMZDY0KHonKTsgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgZ21UcmFuc3AgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgIH0KLSAgICAgIGlmICggYW1PcmlnICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpICkKLSAgICAgICAgcFNmbU9yaWdWZWNbaV0gPSBGREtzYnJFbmNfTFNJX2RpdmlkZV9zY2FsZV9mcmFjdChnbU9yaWcsYW1PcmlnLFNGTV9TQ0FMRSk7CisgICAgICBpZiAoYW1PcmlnICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICBwU2ZtT3JpZ1ZlY1tpXSA9CisgICAgICAgICAgICBGREtzYnJFbmNfTFNJX2RpdmlkZV9zY2FsZV9mcmFjdChnbU9yaWcsIGFtT3JpZywgU0ZNX1NDQUxFKTsKIAotICAgICAgaWYgKCBhbVRyYW5zcCAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSApCi0gICAgICAgIHBTZm1TYnJWZWNbaV0gPSBGREtzYnJFbmNfTFNJX2RpdmlkZV9zY2FsZV9mcmFjdChnbVRyYW5zcCxhbVRyYW5zcCxTRk1fU0NBTEUpOworICAgICAgaWYgKGFtVHJhbnNwICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICBwU2ZtU2JyVmVjW2ldID0KKyAgICAgICAgICAgIEZES3NickVuY19MU0lfZGl2aWRlX3NjYWxlX2ZyYWN0KGdtVHJhbnNwLCBhbVRyYW5zcCwgU0ZNX1NDQUxFKTsKICAgICB9CiAgIH0KIH0KQEAgLTI5MywzOSArMzEyLDI2IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjYWxjdWxhdGVEZXRlY3RvcklucHV0KEZJWFBfREJMICoqUkVTVFJJQ1QgcFF1b3RhQnVmZmVyLCAgLyohPCBQb2ludGVyIHRvIHRvbmFsaXR5IG1hdHJpeC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICpSRVNUUklDVCBpbmRleFZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipSRVNUUklDVCB0b25hbGl0eURpZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgcFNmbU9yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgcFNmbVNiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9Fc3RQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1vdmUpCi17CitzdGF0aWMgdm9pZCBjYWxjdWxhdGVEZXRlY3RvcklucHV0KAorICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgcFF1b3RhQnVmZmVyLCAvKiE8IFBvaW50ZXIgdG8gdG9uYWxpdHkgbWF0cml4LiAqLworICAgIFNDSEFSICpSRVNUUklDVCBpbmRleFZlY3RvciwgRklYUF9EQkwgKipSRVNUUklDVCB0b25hbGl0eURpZmYsCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBwU2ZtT3JpZywgRklYUF9EQkwgKipSRVNUUklDVCBwU2ZtU2JyLAorICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLCBJTlQgblNmYiwgSU5UIG5vRXN0UGVyRnJhbWUsIElOVCBtb3ZlKSB7CiAgIElOVCBlc3Q7CiAKICAgLyoKICAgTmV3IGVzdGltYXRlLgogICAqLwotICBmb3IgKGVzdD0wOyBlc3QgPCBub0VzdFBlckZyYW1lOyBlc3QrKykgeworICBmb3IgKGVzdCA9IDA7IGVzdCA8IG5vRXN0UGVyRnJhbWU7IGVzdCsrKSB7CisgICAgZGlmZihwUXVvdGFCdWZmZXJbZXN0ICsgbW92ZV0sIHRvbmFsaXR5RGlmZltlc3QgKyBtb3ZlXSwgZnJlcUJhbmRUYWJsZSwKKyAgICAgICAgIG5TZmIsIGluZGV4VmVjdG9yKTsKIAotICAgIGRpZmYocFF1b3RhQnVmZmVyW2VzdCttb3ZlXSwKLSAgICAgICAgIHRvbmFsaXR5RGlmZltlc3QrbW92ZV0sCi0gICAgICAgICBmcmVxQmFuZFRhYmxlLAotICAgICAgICAgblNmYiwKLSAgICAgICAgIGluZGV4VmVjdG9yKTsKLQotICAgIGNhbGN1bGF0ZUZsYXRuZXNzTWVhc3VyZShwUXVvdGFCdWZmZXJbZXN0KyBtb3ZlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZm1PcmlnW2VzdCArIG1vdmVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZtU2JyW2VzdCArIG1vdmVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU2ZiKTsKKyAgICBjYWxjdWxhdGVGbGF0bmVzc01lYXN1cmUocFF1b3RhQnVmZmVyW2VzdCArIG1vdmVdLCBpbmRleFZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmbU9yaWdbZXN0ICsgbW92ZV0sIHBTZm1TYnJbZXN0ICsgbW92ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGUsIG5TZmIpOwogICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgQ2hlY2tzIHRoYXQgdGhlIGRldGVjdGlvbiBpcyBub3QgZHVlIHRvIGEgTFAgZmlsdGVyCkBAIC0zNDAsOTcgKzM0Niw5NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgcmVtb3ZlTG93UGFzc0RldGVjdGlvbihVQ0hBUiAqUkVTVFJJQ1QgcEFkZEhhcm1TZmIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICoqUkVTVFJJQ1QgcERldGVjdGlvblZlY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnQsIElOVCBzdG9wLCBJTlQgblNmYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKlJFU1RSSUNUIHBGcmVxQmFuZFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcE5yZ1ZlY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSRVNfSE9MRFMgbWhUaHJlc2gpCiAKIHsKLSAgSU5UIGksZXN0OworICBJTlQgaSwgZXN0OwogICBJTlQgbWF4RGVyaXZQb3MgPSBwRnJlcUJhbmRUYWJsZVtuU2ZiXTsKICAgSU5UIG51bUJhbmRzID0gcEZyZXFCYW5kVGFibGVbblNmYl07Ci0gIEZJWFBfREJMIG5yZ0xvdyxucmdIaWdoOwotICBGSVhQX0RCTCBucmdMRDY0LG5yZ0xvd0xENjQsbnJnSGlnaExENjQsbnJnRGlmZkxENjQ7Ci0gIEZJWFBfREJMIHZhbExENjQsbWF4VmFsTEQ2NCxtYXhWYWxBYm92ZUxENjQ7CisgIEZJWFBfREJMIG5yZ0xvdywgbnJnSGlnaDsKKyAgRklYUF9EQkwgbnJnTEQ2NCwgbnJnTG93TEQ2NCwgbnJnSGlnaExENjQsIG5yZ0RpZmZMRDY0OworICBGSVhQX0RCTCB2YWxMRDY0LCBtYXhWYWxMRDY0LCBtYXhWYWxBYm92ZUxENjQ7CiAgIElOVCBiTFBzaWduYWwgPSAwOwogCiAgIG1heFZhbExENjQgPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7Ci0gIGZvcihpID0gbnVtQmFuZHMgLSAxIC0gMjsgaSA+IHBGcmVxQmFuZFRhYmxlWzBdO2ktLSl7Ci0gICAgbnJnTG93ICA9IHBOcmdWZWN0b3JbaV07CisgIGZvciAoaSA9IG51bUJhbmRzIC0gMSAtIDI7IGkgPiBwRnJlcUJhbmRUYWJsZVswXTsgaS0tKSB7CisgICAgbnJnTG93ID0gcE5yZ1ZlY3RvcltpXTsKICAgICBucmdIaWdoID0gcE5yZ1ZlY3RvcltpICsgMl07CiAKLSAgICBpZihucmdMb3cgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikgJiYgbnJnTG93ID4gbnJnSGlnaCl7Ci0gICAgICBucmdMb3dMRDY0ID0gQ2FsY0xkRGF0YShucmdMb3c+PjEpOwotICAgICAgbnJnRGlmZkxENjQgPSBDYWxjTGREYXRhKChucmdMb3c+PjEpLShucmdIaWdoPj4xKSk7Ci0gICAgICB2YWxMRDY0ID0gbnJnRGlmZkxENjQtbnJnTG93TEQ2NDsKLSAgICAgIGlmKHZhbExENjQgPiBtYXhWYWxMRDY0KXsKKyAgICBpZiAobnJnTG93ICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpICYmIG5yZ0xvdyA+IG5yZ0hpZ2gpIHsKKyAgICAgIG5yZ0xvd0xENjQgPSBDYWxjTGREYXRhKG5yZ0xvdyA+PiAxKTsKKyAgICAgIG5yZ0RpZmZMRDY0ID0gQ2FsY0xkRGF0YSgobnJnTG93ID4+IDEpIC0gKG5yZ0hpZ2ggPj4gMSkpOworICAgICAgdmFsTEQ2NCA9IG5yZ0RpZmZMRDY0IC0gbnJnTG93TEQ2NDsKKyAgICAgIGlmICh2YWxMRDY0ID4gbWF4VmFsTEQ2NCkgewogICAgICAgICBtYXhEZXJpdlBvcyA9IGk7CiAgICAgICAgIG1heFZhbExENjQgPSB2YWxMRDY0OwogICAgICAgfQotICAgICAgaWYobWF4VmFsTEQ2NCA+IG1oVGhyZXNoLmRlcml2VGhyZXNNYXhMRDY0KSB7CisgICAgICBpZiAobWF4VmFsTEQ2NCA+IG1oVGhyZXNoLmRlcml2VGhyZXNNYXhMRDY0KSB7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIC8qIEZpbmQgdGhlIGxhcmdlc3QgImdyYWRpZW50IiBhYm92ZS4gKHNob3VsZCBiZSByZWxhdGl2ZWx5IGZsYXQsIGhlbmNlIHdlIGV4cGVjdCBhIGxvdyB2YWx1ZQotICAgICBpZiB0aGUgc2lnbmFsIGlzIExQLiovCisgIC8qIEZpbmQgdGhlIGxhcmdlc3QgImdyYWRpZW50IiBhYm92ZS4gKHNob3VsZCBiZSByZWxhdGl2ZWx5IGZsYXQsIGhlbmNlIHdlCisgICAgIGV4cGVjdCBhIGxvdyB2YWx1ZSBpZiB0aGUgc2lnbmFsIGlzIExQLiovCiAgIG1heFZhbEFib3ZlTEQ2NCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKLSAgZm9yKGkgPSBudW1CYW5kcyAtIDEgLSAyOyBpID4gbWF4RGVyaXZQb3MgKyAyO2ktLSl7Ci0gICAgbnJnTG93ICA9IHBOcmdWZWN0b3JbaV07CisgIGZvciAoaSA9IG51bUJhbmRzIC0gMSAtIDI7IGkgPiBtYXhEZXJpdlBvcyArIDI7IGktLSkgeworICAgIG5yZ0xvdyA9IHBOcmdWZWN0b3JbaV07CiAgICAgbnJnSGlnaCA9IHBOcmdWZWN0b3JbaSArIDJdOwogCi0gICAgaWYobnJnTG93ICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpICYmIG5yZ0xvdyA+IG5yZ0hpZ2gpewotCQkgICBucmdMb3dMRDY0ID0gQ2FsY0xkRGF0YShucmdMb3c+PjEpOwotCQkgICBucmdEaWZmTEQ2NCA9IENhbGNMZERhdGEoKG5yZ0xvdz4+MSktKG5yZ0hpZ2g+PjEpKTsKLQkJCSB2YWxMRDY0ID0gbnJnRGlmZkxENjQtbnJnTG93TEQ2NDsKLSAgICAgIGlmKHZhbExENjQgPiBtYXhWYWxBYm92ZUxENjQpeworICAgIGlmIChucmdMb3cgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikgJiYgbnJnTG93ID4gbnJnSGlnaCkgeworICAgICAgbnJnTG93TEQ2NCA9IENhbGNMZERhdGEobnJnTG93ID4+IDEpOworICAgICAgbnJnRGlmZkxENjQgPSBDYWxjTGREYXRhKChucmdMb3cgPj4gMSkgLSAobnJnSGlnaCA+PiAxKSk7CisgICAgICB2YWxMRDY0ID0gbnJnRGlmZkxENjQgLSBucmdMb3dMRDY0OworICAgICAgaWYgKHZhbExENjQgPiBtYXhWYWxBYm92ZUxENjQpIHsKICAgICAgICAgbWF4VmFsQWJvdmVMRDY0ID0gdmFsTEQ2NDsKICAgICAgIH0KLSAgICB9Ci0JCSBlbHNlIHsKLSAgICAgIGlmKG5yZ0hpZ2ggIT0gRkwyRlhDT05TVF9EQkwoMC4wZikgJiYgbnJnSGlnaCA+IG5yZ0xvdyl7Ci0JCSAgICAgbnJnSGlnaExENjQgPSBDYWxjTGREYXRhKG5yZ0hpZ2g+PjEpOwotCQkgICAgIG5yZ0RpZmZMRDY0ID0gQ2FsY0xkRGF0YSgobnJnSGlnaD4+MSktKG5yZ0xvdz4+MSkpOwotCQkJICAgdmFsTEQ2NCA9IG5yZ0RpZmZMRDY0LW5yZ0hpZ2hMRDY0OwotICAgICAgICBpZih2YWxMRDY0ID4gbWF4VmFsQWJvdmVMRDY0KXsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG5yZ0hpZ2ggIT0gRkwyRlhDT05TVF9EQkwoMC4wZikgJiYgbnJnSGlnaCA+IG5yZ0xvdykgeworICAgICAgICBucmdIaWdoTEQ2NCA9IENhbGNMZERhdGEobnJnSGlnaCA+PiAxKTsKKyAgICAgICAgbnJnRGlmZkxENjQgPSBDYWxjTGREYXRhKChucmdIaWdoID4+IDEpIC0gKG5yZ0xvdyA+PiAxKSk7CisgICAgICAgIHZhbExENjQgPSBucmdEaWZmTEQ2NCAtIG5yZ0hpZ2hMRDY0OworICAgICAgICBpZiAodmFsTEQ2NCA+IG1heFZhbEFib3ZlTEQ2NCkgewogICAgICAgICAgIG1heFZhbEFib3ZlTEQ2NCA9IHZhbExENjQ7CiAgICAgICAgIH0KICAgICAgIH0KLQkJIH0KKyAgICB9CiAgIH0KIAotICBpZihtYXhWYWxMRDY0ID4gbWhUaHJlc2guZGVyaXZUaHJlc01heExENjQgJiYgbWF4VmFsQWJvdmVMRDY0IDwgbWhUaHJlc2guZGVyaXZUaHJlc0Fib3ZlTEQ2NCl7CisgIGlmIChtYXhWYWxMRDY0ID4gbWhUaHJlc2guZGVyaXZUaHJlc01heExENjQgJiYKKyAgICAgIG1heFZhbEFib3ZlTEQ2NCA8IG1oVGhyZXNoLmRlcml2VGhyZXNBYm92ZUxENjQpIHsKICAgICBiTFBzaWduYWwgPSAxOwogCi0gICAgZm9yKGkgPSBtYXhEZXJpdlBvcyAtIDE7IGkgPiBtYXhEZXJpdlBvcyAtIDUgJiYgaSA+PSAwIDsgaS0tKXsKLSAgICAgIGlmKHBOcmdWZWN0b3JbaV0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikgJiYgcE5yZ1ZlY3RvcltpXSA+IHBOcmdWZWN0b3JbbWF4RGVyaXZQb3MgKyAyXSl7Ci0JCSAgICAgbnJnRGlmZkxENjQgPSBDYWxjTGREYXRhKChwTnJnVmVjdG9yW2ldPj4xKS0ocE5yZ1ZlY3RvclttYXhEZXJpdlBvcyArIDJdPj4xKSk7Ci0JCQkJIG5yZ0xENjQgPSBDYWxjTGREYXRhKHBOcmdWZWN0b3JbaV0+PjEpOwotICAJCQkgdmFsTEQ2NCA9IG5yZ0RpZmZMRDY0LW5yZ0xENjQ7Ci0gICAgICAgIGlmKHZhbExENjQgPCBtaFRocmVzaC5kZXJpdlRocmVzQmVsb3dMRDY0KSB7CisgICAgZm9yIChpID0gbWF4RGVyaXZQb3MgLSAxOyBpID4gbWF4RGVyaXZQb3MgLSA1ICYmIGkgPj0gMDsgaS0tKSB7CisgICAgICBpZiAocE5yZ1ZlY3RvcltpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSAmJgorICAgICAgICAgIHBOcmdWZWN0b3JbaV0gPiBwTnJnVmVjdG9yW21heERlcml2UG9zICsgMl0pIHsKKyAgICAgICAgbnJnRGlmZkxENjQgPSBDYWxjTGREYXRhKChwTnJnVmVjdG9yW2ldID4+IDEpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTnJnVmVjdG9yW21heERlcml2UG9zICsgMl0gPj4gMSkpOworICAgICAgICBucmdMRDY0ID0gQ2FsY0xkRGF0YShwTnJnVmVjdG9yW2ldID4+IDEpOworICAgICAgICB2YWxMRDY0ID0gbnJnRGlmZkxENjQgLSBucmdMRDY0OworICAgICAgICBpZiAodmFsTEQ2NCA8IG1oVGhyZXNoLmRlcml2VGhyZXNCZWxvd0xENjQpIHsKICAgICAgICAgICBiTFBzaWduYWwgPSAwOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNleworICAgICAgfSBlbHNlIHsKICAgICAgICAgYkxQc2lnbmFsID0gMDsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgaWYoYkxQc2lnbmFsKXsKLSAgICBmb3IoaT0wO2k8blNmYjtpKyspewotICAgICAgaWYobWF4RGVyaXZQb3MgPj0gcEZyZXFCYW5kVGFibGVbaV0gJiYgbWF4RGVyaXZQb3MgPCBwRnJlcUJhbmRUYWJsZVtpKzFdKQorICBpZiAoYkxQc2lnbmFsKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG5TZmI7IGkrKykgeworICAgICAgaWYgKG1heERlcml2UG9zID49IHBGcmVxQmFuZFRhYmxlW2ldICYmCisgICAgICAgICAgbWF4RGVyaXZQb3MgPCBwRnJlcUJhbmRUYWJsZVtpICsgMV0pCiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmKHBBZGRIYXJtU2ZiW2ldKXsKKyAgICBpZiAocEFkZEhhcm1TZmJbaV0pIHsKICAgICAgIHBBZGRIYXJtU2ZiW2ldID0gMDsKLSAgICAgIGZvcihlc3QgPSBzdGFydDsgZXN0IDwgc3RvcCA7IGVzdCsrKXsKKyAgICAgIGZvciAoZXN0ID0gc3RhcnQ7IGVzdCA8IHN0b3A7IGVzdCsrKSB7CiAgICAgICAgIHBEZXRlY3Rpb25WZWN0b3JzW2VzdF1baV0gPSAwOwogICAgICAgfQogICAgIH0KQEAgLTQ0Nyw0NCArNDUzLDM3IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIGlzRGV0ZWN0aW9uT2ZOZXdUb25lQWxsb3dlZChjb25zdCBTQlJfRlJBTUVfSU5GTyAqcEZyYW1lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcERldGVjdGlvblN0YXJ0UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vRXN0UGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcHJldlRyYW5zaWVudEZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHByZXZUcmFuc2llbnRQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcHJldlRyYW5zaWVudEZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdHJhbnNpZW50UG9zT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRyYW5zaWVudEZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdHJhbnNpZW50UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRlbHRhVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IpCi17CitzdGF0aWMgSU5UIGlzRGV0ZWN0aW9uT2ZOZXdUb25lQWxsb3dlZCgKKyAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqcEZyYW1lSW5mbywgSU5UICpwRGV0ZWN0aW9uU3RhcnRQb3MsCisgICAgSU5UIG5vRXN0UGVyRnJhbWUsIElOVCBwcmV2VHJhbnNpZW50RnJhbWUsIElOVCBwcmV2VHJhbnNpZW50UG9zLAorICAgIElOVCBwcmV2VHJhbnNpZW50RmxhZywgSU5UIHRyYW5zaWVudFBvc09mZnNldCwgSU5UIHRyYW5zaWVudEZsYWcsCisgICAgSU5UIHRyYW5zaWVudFBvcywgSU5UIGRlbHRhVGltZSwKKyAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKSB7CiAgIElOVCB0cmFuc2llbnRGcmFtZSwgbmV3RGV0ZWN0aW9uQWxsb3dlZDsKIAotCiAgIC8qIERldGVybWluZSBpZiB0aGlzIGlzIGEgZnJhbWUgd2hlcmUgYSB0cmFuc2llbnQgc3RhcnRzLi4uCiAgICAqIElmIHRoZSB0cmFuc2llbnQgZmxhZyB3YXMgc2V0IHRoZSBwcmV2aW91cyBmcmFtZSBidXQgbm90IHRoZQogICAgKiB0cmFuc2llbnQgZnJhbWUgZmxhZywgdGhlIHRyYW5zaWVudCBmcmFtZSBmbGFnIGlzIHNldCBpbiB0aGUgY3VycmVudCBmcmFtZS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICB0cmFuc2llbnRGcmFtZSA9IDA7Ci0gIGlmKHRyYW5zaWVudEZsYWcpewotICAgIGlmKHRyYW5zaWVudFBvcyArIHRyYW5zaWVudFBvc09mZnNldCA8IHBGcmFtZUluZm8tPmJvcmRlcnNbcEZyYW1lSW5mby0+bkVudmVsb3Blc10pCisgIGlmICh0cmFuc2llbnRGbGFnKSB7CisgICAgaWYgKHRyYW5zaWVudFBvcyArIHRyYW5zaWVudFBvc09mZnNldCA8CisgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbcEZyYW1lSW5mby0+bkVudmVsb3Blc10pIHsKICAgICAgIHRyYW5zaWVudEZyYW1lID0gMTsKLSAgICAgIGlmKG5vRXN0UGVyRnJhbWUgPiAxKXsKLSAgICAgICAgaWYodHJhbnNpZW50UG9zICsgdHJhbnNpZW50UG9zT2Zmc2V0ID4gaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnRpbWVTbG90cyA+PiAxKXsKKyAgICAgIGlmIChub0VzdFBlckZyYW1lID4gMSkgeworICAgICAgICBpZiAodHJhbnNpZW50UG9zICsgdHJhbnNpZW50UG9zT2Zmc2V0ID4KKyAgICAgICAgICAgIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT50aW1lU2xvdHMgPj4gMSkgewogICAgICAgICAgICpwRGV0ZWN0aW9uU3RhcnRQb3MgPSBub0VzdFBlckZyYW1lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgKnBEZXRlY3Rpb25TdGFydFBvcyA9IG5vRXN0UGVyRnJhbWUgPj4gMTsKICAgICAgICAgfQogCi0gICAgICB9Ci0gICAgICBlbHNleworICAgICAgfSBlbHNlIHsKICAgICAgICAgKnBEZXRlY3Rpb25TdGFydFBvcyA9IG5vRXN0UGVyRnJhbWU7CiAgICAgICB9Ci0gIH0KLSAgZWxzZXsKLSAgICBpZihwcmV2VHJhbnNpZW50RmxhZyAmJiAhcHJldlRyYW5zaWVudEZyYW1lKXsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHByZXZUcmFuc2llbnRGbGFnICYmICFwcmV2VHJhbnNpZW50RnJhbWUpIHsKICAgICAgIHRyYW5zaWVudEZyYW1lID0gMTsKICAgICAgICpwRGV0ZWN0aW9uU3RhcnRQb3MgPSAwOwogICAgIH0KQEAgLTQ5NywyNSArNDk2LDI1IEBACiAgICAqIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBmcmFtZS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIG5ld0RldGVjdGlvbkFsbG93ZWQgPSAwOwotICBpZih0cmFuc2llbnRGcmFtZSl7CisgIGlmICh0cmFuc2llbnRGcmFtZSkgewogICAgIG5ld0RldGVjdGlvbkFsbG93ZWQgPSAxOwotICB9Ci0gIGVsc2UgewotICAgIGlmKHByZXZUcmFuc2llbnRGcmFtZSAmJgotICAgICAgIGZpeHBfYWJzKHBGcmFtZUluZm8tPmJvcmRlcnNbMF0gLSAocHJldlRyYW5zaWVudFBvcyArIHRyYW5zaWVudFBvc09mZnNldCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnRpbWVTbG90cykpIDwgZGVsdGFUaW1lKQorICB9IGVsc2UgeworICAgIGlmIChwcmV2VHJhbnNpZW50RnJhbWUgJiYKKyAgICAgICAgZml4cF9hYnMocEZyYW1lSW5mby0+Ym9yZGVyc1swXSAtCisgICAgICAgICAgICAgICAgIChwcmV2VHJhbnNpZW50UG9zICsgdHJhbnNpZW50UG9zT2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT50aW1lU2xvdHMpKSA8IGRlbHRhVGltZSkgewogICAgICAgbmV3RGV0ZWN0aW9uQWxsb3dlZCA9IDE7CiAgICAgICAqcERldGVjdGlvblN0YXJ0UG9zID0gMDsKKyAgICB9CiAgIH0KIAotICBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+cHJldmlvdXNUcmFuc2llbnRGbGFnICA9IHRyYW5zaWVudEZsYWc7CisgIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5wcmV2aW91c1RyYW5zaWVudEZsYWcgPSB0cmFuc2llbnRGbGFnOwogICBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+cHJldmlvdXNUcmFuc2llbnRGcmFtZSA9IHRyYW5zaWVudEZyYW1lOwotICBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+cHJldmlvdXNUcmFuc2llbnRQb3MgICA9IHRyYW5zaWVudFBvczsKKyAgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnByZXZpb3VzVHJhbnNpZW50UG9zID0gdHJhbnNpZW50UG9zOwogCiAgIHJldHVybiAobmV3RGV0ZWN0aW9uQWxsb3dlZCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgQ2xlYW5zIHVwIHRoZSBkZXRlY3Rpb24gYWZ0ZXIgYSB0cmFuc2llbnQuCkBAIC01MjUsNTEgKzUyNCw0MSBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdHJhbnNpZW50Q2xlYW5VcChGSVhQX0RCTCAqKnF1b3RhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKipkZXRlY3Rpb25WZWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcEFkZEhhcm1TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwUHJldkFkZEhhcm1TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqKiBzaWduQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqcEZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuZXdEZXRlY3Rpb25BbGxvd2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcE5yZ1ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSRVNfSE9MRFMgbWhUaHJlc2gpCi17Ci0gIElOVCBpLGosbGksIHVpLGVzdDsKK3N0YXRpYyB2b2lkIHRyYW5zaWVudENsZWFuVXAoRklYUF9EQkwgKipxdW90YUJ1ZmZlciwgSU5UIG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICoqZGV0ZWN0aW9uVmVjdG9ycywgVUNIQVIgKnBBZGRIYXJtU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcFByZXZBZGRIYXJtU2ZiLCBJTlQgKipzaWduQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqcEZyZXFCYW5kVGFibGUsIElOVCBzdGFydCwgSU5UIHN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuZXdEZXRlY3Rpb25BbGxvd2VkLCBGSVhQX0RCTCAqcE5yZ1ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSRVNfSE9MRFMgbWhUaHJlc2gpIHsKKyAgSU5UIGksIGosIGVzdDsKIAotICBmb3IoZXN0PXN0YXJ0OyBlc3QgPCBzdG9wOyBlc3QrKykgewotICAgIGZvcihpPTA7IGk8blNmYjsgaSsrKSB7CisgIGZvciAoZXN0ID0gc3RhcnQ7IGVzdCA8IHN0b3A7IGVzdCsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG5TZmI7IGkrKykgewogICAgICAgcEFkZEhhcm1TZmJbaV0gPSBwQWRkSGFybVNmYltpXSB8fCBkZXRlY3Rpb25WZWN0b3JzW2VzdF1baV07CiAgICAgfQogICB9CiAKLSAgaWYobmV3RGV0ZWN0aW9uQWxsb3dlZCA9PSAxKXsKKyAgaWYgKG5ld0RldGVjdGlvbkFsbG93ZWQgPT0gMSkgewogICAgIC8qCiAgICAgICogQ2hlY2sgZm9yIGR1cGxpY2F0aW9uIG9mIHNpbmVzIGxvY2F0ZWQKICAgICAgKiBvbiB0aGUgYm9yZGVyIG9mIHR3byBzY2YtYmFuZHMuCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgZm9yKGk9MDtpPG5TZmItMTtpKyspIHsKLSAgICAgIGxpID0gcEZyZXFCYW5kVGFibGVbaV07Ci0gICAgICB1aSA9IHBGcmVxQmFuZFRhYmxlW2krMV07Ci0KKyAgICBmb3IgKGkgPSAwOyBpIDwgblNmYiAtIDE7IGkrKykgewogICAgICAgLyogZGV0ZWN0aW9uIGluIGFkamFjZW50IGNoYW5uZWxzLiovCi0gICAgICBpZihwQWRkSGFybVNmYltpXSAmJiBwQWRkSGFybVNmYltpKzFdKSB7CisgICAgICBpZiAocEFkZEhhcm1TZmJbaV0gJiYgcEFkZEhhcm1TZmJbaSArIDFdKSB7CiAgICAgICAgIEZJWFBfREJMIG1heFZhbDEsIG1heFZhbDI7CiAgICAgICAgIElOVCBtYXhQb3MxLCBtYXhQb3MyLCBtYXhQb3NUaW1lMSwgbWF4UG9zVGltZTI7CiAKLSAgICAgICAgbGkgPSBwRnJlcUJhbmRUYWJsZVtpXTsKLSAgICAgICAgdWkgPSBwRnJlcUJhbmRUYWJsZVtpKzFdOworICAgICAgICBJTlQgbGkgPSBwRnJlcUJhbmRUYWJsZVtpXTsKKyAgICAgICAgSU5UIHVpID0gcEZyZXFCYW5kVGFibGVbaSArIDFdOwogCiAgICAgICAgIC8qIEZpbmQgbWF4aW11bSB0b25hbGl0eSBpbiB0aGUgdGhlIHR3byBzY2YgYmFuZHMuKi8KICAgICAgICAgbWF4UG9zVGltZTEgPSBzdGFydDsKICAgICAgICAgbWF4UG9zMSA9IGxpOwogICAgICAgICBtYXhWYWwxID0gcXVvdGFCdWZmZXJbc3RhcnRdW2xpXTsKLSAgICAgICAgZm9yKGVzdCA9IHN0YXJ0OyBlc3QgPCBzdG9wOyBlc3QrKyl7Ci0gICAgICAgICAgZm9yKGogPSBsaTsgajx1aTsgaisrKXsKLSAgICAgICAgICAgIGlmKHF1b3RhQnVmZmVyW2VzdF1bal0gPiBtYXhWYWwxKXsKKyAgICAgICAgZm9yIChlc3QgPSBzdGFydDsgZXN0IDwgc3RvcDsgZXN0KyspIHsKKyAgICAgICAgICBmb3IgKGogPSBsaTsgaiA8IHVpOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChxdW90YUJ1ZmZlcltlc3RdW2pdID4gbWF4VmFsMSkgewogICAgICAgICAgICAgICBtYXhWYWwxID0gcXVvdGFCdWZmZXJbZXN0XVtqXTsKICAgICAgICAgICAgICAgbWF4UG9zMSA9IGo7CiAgICAgICAgICAgICAgIG1heFBvc1RpbWUxID0gZXN0OwpAQCAtNTc3LDE2ICs1NjYsMTYgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBsaSA9IHBGcmVxQmFuZFRhYmxlW2krMV07Ci0gICAgICAgIHVpID0gcEZyZXFCYW5kVGFibGVbaSsyXTsKKyAgICAgICAgbGkgPSBwRnJlcUJhbmRUYWJsZVtpICsgMV07CisgICAgICAgIHVpID0gcEZyZXFCYW5kVGFibGVbaSArIDJdOwogCiAgICAgICAgIC8qIEZpbmQgbWF4aW11bSB0b25hbGl0eSBpbiB0aGUgdGhlIHR3byBzY2YgYmFuZHMuKi8KICAgICAgICAgbWF4UG9zVGltZTIgPSBzdGFydDsKICAgICAgICAgbWF4UG9zMiA9IGxpOwogICAgICAgICBtYXhWYWwyID0gcXVvdGFCdWZmZXJbc3RhcnRdW2xpXTsKLSAgICAgICAgZm9yKGVzdCA9IHN0YXJ0OyBlc3QgPCBzdG9wOyBlc3QrKyl7Ci0gICAgICAgICAgZm9yKGogPSBsaTsgajx1aTsgaisrKXsKLSAgICAgICAgICAgIGlmKHF1b3RhQnVmZmVyW2VzdF1bal0gPiBtYXhWYWwyKXsKKyAgICAgICAgZm9yIChlc3QgPSBzdGFydDsgZXN0IDwgc3RvcDsgZXN0KyspIHsKKyAgICAgICAgICBmb3IgKGogPSBsaTsgaiA8IHVpOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChxdW90YUJ1ZmZlcltlc3RdW2pdID4gbWF4VmFsMikgewogICAgICAgICAgICAgICBtYXhWYWwyID0gcXVvdGFCdWZmZXJbZXN0XVtqXTsKICAgICAgICAgICAgICAgbWF4UG9zMiA9IGo7CiAgICAgICAgICAgICAgIG1heFBvc1RpbWUyID0gZXN0OwpAQCAtNTk2LDQwICs1ODUsMzkgQEAKIAogICAgICAgICAvKiBJZiB0aGUgbWF4aW11bSB2YWx1ZXMgYXJlIGluIGFkamFjZW50IFFNRi1jaGFubmVscywgd2UgbmVlZCB0byByZW1vdmUKICAgICAgICAgICAgdGhlIGxvd2VzdCBvZiB0aGUgdHdvLiovCi0gICAgICAgIGlmKG1heFBvczItbWF4UG9zMSA8IDIpewotCi0gICAgICAgICAgaWYocFByZXZBZGRIYXJtU2ZiW2ldID09IDEgJiYgcFByZXZBZGRIYXJtU2ZiW2krMV0gPT0gMCl7CisgICAgICAgIGlmIChtYXhQb3MyIC0gbWF4UG9zMSA8IDIpIHsKKyAgICAgICAgICBpZiAocFByZXZBZGRIYXJtU2ZiW2ldID09IDEgJiYgcFByZXZBZGRIYXJtU2ZiW2kgKyAxXSA9PSAwKSB7CiAgICAgICAgICAgICAvKiBLZWVwIHRoZSBsb3dlciwgcmVtb3ZlIHRoZSB1cHBlci4qLwotICAgICAgICAgICAgcEFkZEhhcm1TZmJbaSsxXSA9IDA7Ci0gICAgICAgICAgICBmb3IoZXN0PXN0YXJ0OyBlc3Q8c3RvcDsgZXN0KyspewotICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF1baSsxXSA9IDA7CisgICAgICAgICAgICBwQWRkSGFybVNmYltpICsgMV0gPSAwOworICAgICAgICAgICAgZm9yIChlc3QgPSBzdGFydDsgZXN0IDwgc3RvcDsgZXN0KyspIHsKKyAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9yc1tlc3RdW2kgKyAxXSA9IDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICBpZihwUHJldkFkZEhhcm1TZmJbaV0gPT0gMCAmJiBwUHJldkFkZEhhcm1TZmJbaSsxXSA9PSAxKXsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBQcmV2QWRkSGFybVNmYltpXSA9PSAwICYmIHBQcmV2QWRkSGFybVNmYltpICsgMV0gPT0gMSkgewogICAgICAgICAgICAgICAvKiBLZWVwIHRoZSB1cHBlciwgcmVtb3ZlIHRoZSBsb3dlci4qLwogICAgICAgICAgICAgICBwQWRkSGFybVNmYltpXSA9IDA7Ci0gICAgICAgICAgICAgIGZvcihlc3Q9c3RhcnQ7IGVzdDxzdG9wOyBlc3QrKyl7CisgICAgICAgICAgICAgIGZvciAoZXN0ID0gc3RhcnQ7IGVzdCA8IHN0b3A7IGVzdCsrKSB7CiAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9yc1tlc3RdW2ldID0gMDsKICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAvKiBJZiB0aGUgbWF4aW11bSB2YWx1ZXMgYXJlIGluIGFkamFjZW50IFFNRi1jaGFubmVscywgYW5kIGlmIHRoZSBzaWducyBpbmRpY2F0ZSB0aGF0IGl0IGlzIHRoZSBzYW1lIHNpbmUsCi0gICAgICAgICAgICAgICAgd2UgbmVlZCB0byByZW1vdmUgdGhlIGxvd2VzdCBvZiB0aGUgdHdvLiovCi0gICAgICAgICAgICAgIGlmKG1heFZhbDEgPiBtYXhWYWwyKXsKLSAgICAgICAgICAgICAgICBpZihzaWduQnVmZmVyW21heFBvc1RpbWUxXVttYXhQb3MyXSA8IDAgJiYgc2lnbkJ1ZmZlclttYXhQb3NUaW1lMV1bbWF4UG9zMV0gPiAwKXsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIElmIHRoZSBtYXhpbXVtIHZhbHVlcyBhcmUgaW4gYWRqYWNlbnQgUU1GLWNoYW5uZWxzLCBhbmQgaWYgdGhlCisgICAgICAgICAgICAgICAgIHNpZ25zIGluZGljYXRlIHRoYXQgaXQgaXMgdGhlIHNhbWUgc2luZSwgd2UgbmVlZCB0byByZW1vdmUgdGhlCisgICAgICAgICAgICAgICAgIGxvd2VzdCBvZiB0aGUgdHdvLiovCisgICAgICAgICAgICAgIGlmIChtYXhWYWwxID4gbWF4VmFsMikgeworICAgICAgICAgICAgICAgIGlmIChzaWduQnVmZmVyW21heFBvc1RpbWUxXVttYXhQb3MyXSA8IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgc2lnbkJ1ZmZlclttYXhQb3NUaW1lMV1bbWF4UG9zMV0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAvKiBLZWVwIHRoZSBsb3dlciwgcmVtb3ZlIHRoZSB1cHBlci4qLwotICAgICAgICAgICAgICAgICAgcEFkZEhhcm1TZmJbaSsxXSA9IDA7Ci0gICAgICAgICAgICAgICAgICBmb3IoZXN0PXN0YXJ0OyBlc3Q8c3RvcDsgZXN0KyspewotICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF1baSsxXSA9IDA7CisgICAgICAgICAgICAgICAgICBwQWRkSGFybVNmYltpICsgMV0gPSAwOworICAgICAgICAgICAgICAgICAgZm9yIChlc3QgPSBzdGFydDsgZXN0IDwgc3RvcDsgZXN0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9yc1tlc3RdW2kgKyAxXSA9IDA7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgaWYoc2lnbkJ1ZmZlclttYXhQb3NUaW1lMl1bbWF4UG9zMl0gPCAwICYmIHNpZ25CdWZmZXJbbWF4UG9zVGltZTJdW21heFBvczFdID4gMCl7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHNpZ25CdWZmZXJbbWF4UG9zVGltZTJdW21heFBvczJdIDwgMCAmJgorICAgICAgICAgICAgICAgICAgICBzaWduQnVmZmVyW21heFBvc1RpbWUyXVttYXhQb3MxXSA+IDApIHsKICAgICAgICAgICAgICAgICAgIC8qIEtlZXAgdGhlIHVwcGVyLCByZW1vdmUgdGhlIGxvd2VyLiovCiAgICAgICAgICAgICAgICAgICBwQWRkSGFybVNmYltpXSA9IDA7Ci0gICAgICAgICAgICAgICAgICBmb3IoZXN0PXN0YXJ0OyBlc3Q8c3RvcDsgZXN0KyspeworICAgICAgICAgICAgICAgICAgZm9yIChlc3QgPSBzdGFydDsgZXN0IDwgc3RvcDsgZXN0KyspIHsKICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9yc1tlc3RdW2ldID0gMDsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC02NDEsMjggKzYyOSwxOSBAQAogICAgIH0KIAogICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXRlY3Rpb24gaXMgbm90IHRoZSBjdXQtb2ZmIG9mIGEgbG93IHBhc3MgZmlsdGVyLiAqLwotICAgIHJlbW92ZUxvd1Bhc3NEZXRlY3Rpb24ocEFkZEhhcm1TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ1ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1oVGhyZXNoKTsKLSAgfQotICBlbHNlIHsKLSAgIC8qCi0gICAgKiBJZiBhIG1pc3NpbmcgaGFybW9uaWMgd2Fzbid0IG1pc3NpbmcgdGhlIHByZXZpb3VzIGZyYW1lCi0gICAgKiB0aGUgdHJhbnNpZW50LWZsYWcgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIGJlIGFsbG93ZWQgdG8gZGV0ZWN0IGl0LgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgZm9yKGk9MDtpPG5TZmI7aSsrKXsKLSAgICAgIGlmKHBBZGRIYXJtU2ZiW2ldIC0gcFByZXZBZGRIYXJtU2ZiW2ldID4gMCkKLSAgICAgICAgcEFkZEhhcm1TZmJbaV0gPSAwOworICAgIHJlbW92ZUxvd1Bhc3NEZXRlY3Rpb24ocEFkZEhhcm1TZmIsIGRldGVjdGlvblZlY3RvcnMsIHN0YXJ0LCBzdG9wLCBuU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyZXFCYW5kVGFibGUsIHBOcmdWZWN0b3IsIG1oVGhyZXNoKTsKKyAgfSBlbHNlIHsKKyAgICAvKgorICAgICAqIElmIGEgbWlzc2luZyBoYXJtb25pYyB3YXNuJ3QgbWlzc2luZyB0aGUgcHJldmlvdXMgZnJhbWUKKyAgICAgKiB0aGUgdHJhbnNpZW50LWZsYWcgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIGJlIGFsbG93ZWQgdG8gZGV0ZWN0IGl0LgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGZvciAoaSA9IDA7IGkgPCBuU2ZiOyBpKyspIHsKKyAgICAgIGlmIChwQWRkSGFybVNmYltpXSAtIHBQcmV2QWRkSGFybVNmYltpXSA+IDApIHBBZGRIYXJtU2ZiW2ldID0gMDsKICAgICB9CiAgIH0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKICAgXGJyaWVmICAgICBEZXRlY3Rpb24gZm9yIG9uZSB0b25hbGl0eSBlc3RpbWF0ZS4KQEAgLTY4OSw0MiArNjY4LDM1IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBkZXRlY3Rpb24oRklYUF9EQkwgKnF1b3RhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwRGlmZlZlY1NjZmIsCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBIYXJtVmVjLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpwRnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZtT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZtU2JyLAotICAgICAgICAgICAgICAgICAgICAgIEdVSURFX1ZFQ1RPUlMgZ3VpZGVWZWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgIEdVSURFX1ZFQ1RPUlMgbmV3R3VpZGVWZWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgIFRIUkVTX0hPTERTIG1oVGhyZXNoKQotewotCi0gIElOVCBpLGosbGwsIGx1OwotICBGSVhQX0RCTCB0aHJlc1RlbXAsdGhyZXNPcmlnOworc3RhdGljIHZvaWQgZGV0ZWN0aW9uKEZJWFBfREJMICpxdW90YUJ1ZmZlciwgRklYUF9EQkwgKnBEaWZmVmVjU2NmYiwgSU5UIG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBIYXJtVmVjLCBjb25zdCBVQ0hBUiAqcEZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmbU9yaWcsIEZJWFBfREJMICpzZm1TYnIsCisgICAgICAgICAgICAgICAgICAgICAgR1VJREVfVkVDVE9SUyBndWlkZVZlY3RvcnMsIEdVSURFX1ZFQ1RPUlMgbmV3R3VpZGVWZWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgIFRIUkVTX0hPTERTIG1oVGhyZXNoKSB7CisgIElOVCBpLCBqLCBsbCwgbHU7CisgIEZJWFBfREJMIHRocmVzVGVtcCwgdGhyZXNPcmlnOwogCiAgIC8qCiAgICAqIERvIGRldGVjdGlvbiBvbiB0aGUgZGlmZmVyZW5jZSB2ZWN0b3IsIGkuZS4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgogICAgKiB0aGUgb3JpZ2luYWwgYW5kIHRoZSB0cmFuc3Bvc2VkLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBmb3IoaT0wO2k8blNmYjtpKyspewotCisgIGZvciAoaSA9IDA7IGkgPCBuU2ZiOyBpKyspIHsKICAgICB0aHJlc1RlbXAgPSAoZ3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yRGlmZltpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKLSAgICAgICAgICAgICAgICAgID8gZk1heChmTXVsdChtaFRocmVzaC5kZWNheUd1aWRlRGlmZixndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JEaWZmW2ldKSwgbWhUaHJlc2gudGhyZXNIb2xkRGlmZkd1aWRlKQotICAgICAgICAgICAgICAgICAgOiBtaFRocmVzaC50aHJlc0hvbGREaWZmOworICAgICAgICAgICAgICAgICAgICA/IGZNYXgoZk11bHQobWhUaHJlc2guZGVjYXlHdWlkZURpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JEaWZmW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1oVGhyZXNoLnRocmVzSG9sZERpZmZHdWlkZSkKKyAgICAgICAgICAgICAgICAgICAgOiBtaFRocmVzaC50aHJlc0hvbGREaWZmOwogCiAgICAgdGhyZXNUZW1wID0gZk1pbih0aHJlc1RlbXAsIG1oVGhyZXNoLnRocmVzSG9sZERpZmYpOwogCi0gICAgaWYocERpZmZWZWNTY2ZiW2ldID4gdGhyZXNUZW1wKXsKKyAgICBpZiAocERpZmZWZWNTY2ZiW2ldID4gdGhyZXNUZW1wKSB7CiAgICAgICBwSGFybVZlY1tpXSA9IDE7CiAgICAgICBuZXdHdWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JEaWZmW2ldID0gcERpZmZWZWNTY2ZiW2ldOwotICAgIH0KLSAgICBlbHNleworICAgIH0gZWxzZSB7CiAgICAgICAvKiBJZiB0aGUgZ3VpZGUgd2Fzbid0IHplcm8sIGJ1dCB0aGUgY3VycmVudCBsZXZlbCBpcyB0byBsb3csCiAgICAgICAgICBzdGFydCB0cmFja2luZyB0aGUgZGVjYXkgb24gdGhlIHRvbmUgaW4gdGhlIG9yaWdpbmFsIHJhdGhlcgogICAgICAgICAgdGhhbiB0aGUgZGlmZmVyZW5jZS4qLwotICAgICAgaWYoZ3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yRGlmZltpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSl7CisgICAgICBpZiAoZ3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yRGlmZltpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewogICAgICAgICBndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldID0gbWhUaHJlc2gudGhyZXNIb2xkVG9uZUd1aWRlOwogICAgICAgfQogICAgIH0KQEAgLTczNiwxNiArNzA4LDE4IEBACiAgICAqIG11bHRpcGxlIHRvbmVzIGluIHRoZSBzYnIgc2lnbmFsLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICBmb3IoaT0wO2k8blNmYjtpKyspeworICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CiAgICAgbGwgPSBwRnJlcUJhbmRUYWJsZVtpXTsKLSAgICBsdSA9IHBGcmVxQmFuZFRhYmxlW2krMV07CisgICAgbHUgPSBwRnJlcUJhbmRUYWJsZVtpICsgMV07CiAKLSAgICB0aHJlc09yaWcgPSBmaXhNYXgoZk11bHQoZ3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yT3JpZ1tpXSwgbWhUaHJlc2guZGVjYXlHdWlkZU9yaWcpLCBtaFRocmVzaC50aHJlc0hvbGRUb25lR3VpZGUpOworICAgIHRocmVzT3JpZyA9CisgICAgICAgIGZpeE1heChmTXVsdChndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldLCBtaFRocmVzaC5kZWNheUd1aWRlT3JpZyksCisgICAgICAgICAgICAgICBtaFRocmVzaC50aHJlc0hvbGRUb25lR3VpZGUpOwogICAgIHRocmVzT3JpZyA9IGZpeE1pbih0aHJlc09yaWcsIG1oVGhyZXNoLnRocmVzSG9sZFRvbmUpOwogCi0gICAgaWYoZ3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yT3JpZ1tpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSl7Ci0gICAgICBmb3Ioaj0gbGw7ajxsdTtqKyspewotICAgICAgICBpZihxdW90YUJ1ZmZlcltqXSA+IHRocmVzT3JpZyl7CisgICAgaWYgKGd1aWRlVmVjdG9ycy5ndWlkZVZlY3Rvck9yaWdbaV0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIGZvciAoaiA9IGxsOyBqIDwgbHU7IGorKykgeworICAgICAgICBpZiAocXVvdGFCdWZmZXJbal0gPiB0aHJlc09yaWcpIHsKICAgICAgICAgICBwSGFybVZlY1tpXSA9IDE7CiAgICAgICAgICAgbmV3R3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yT3JpZ1tpXSA9IHF1b3RhQnVmZmVyW2pdOwogICAgICAgICB9CkBAIC03NTksMzMgKzczMywzNiBAQAogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgdGhyZXNPcmlnID0gbWhUaHJlc2gudGhyZXNIb2xkVG9uZTsKIAotICBmb3IoaT0wO2k8blNmYjtpKyspeworICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CiAgICAgbGwgPSBwRnJlcUJhbmRUYWJsZVtpXTsKLSAgICBsdSA9IHBGcmVxQmFuZFRhYmxlW2krMV07CisgICAgbHUgPSBwRnJlcUJhbmRUYWJsZVtpICsgMV07CiAKLSAgICBpZihwSGFybVZlY1tpXSA9PSAwKXsKLSAgICAgIGlmKGx1IC1sbCA+IDEpewotICAgICAgICBmb3Ioaj0gbGw7ajxsdTtqKyspewotICAgICAgICAgIGlmKHF1b3RhQnVmZmVyW2pdID4gdGhyZXNPcmlnICYmIChzZm1TYnJbaV0gPiBtaFRocmVzaC5zZm1UaHJlc1NiciAmJiBzZm1PcmlnW2ldIDwgbWhUaHJlc2guc2ZtVGhyZXNPcmlnKSl7CisgICAgaWYgKHBIYXJtVmVjW2ldID09IDApIHsKKyAgICAgIGlmIChsdSAtIGxsID4gMSkgeworICAgICAgICBmb3IgKGogPSBsbDsgaiA8IGx1OyBqKyspIHsKKyAgICAgICAgICBpZiAocXVvdGFCdWZmZXJbal0gPiB0aHJlc09yaWcgJiYKKyAgICAgICAgICAgICAgKHNmbVNicltpXSA+IG1oVGhyZXNoLnNmbVRocmVzU2JyICYmCisgICAgICAgICAgICAgICBzZm1PcmlnW2ldIDwgbWhUaHJlc2guc2ZtVGhyZXNPcmlnKSkgewogICAgICAgICAgICAgcEhhcm1WZWNbaV0gPSAxOwogICAgICAgICAgICAgbmV3R3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yT3JpZ1tpXSA9IHF1b3RhQnVmZmVyW2pdOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZXsKLSAgICAgICAgaWYoaSA8IG5TZmIgLTEpeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGkgPCBuU2ZiIC0gMSkgewogICAgICAgICAgIGxsID0gcEZyZXFCYW5kVGFibGVbaV07CiAKLSAgICAgICAgICBpZihpPjApewotICAgICAgICAgICAgaWYocXVvdGFCdWZmZXJbbGxdID4gbWhUaHJlc2gudGhyZXNIb2xkVG9uZSAmJiAocERpZmZWZWNTY2ZiW2krMV0gPCBtaFRocmVzaC5pbnZUaHJlc0hvbGRUb25lIHx8IHBEaWZmVmVjU2NmYltpLTFdIDwgbWhUaHJlc2guaW52VGhyZXNIb2xkVG9uZSkpewotICAgICAgICAgICAgICAgIHBIYXJtVmVjW2ldID0gMTsKLSAgICAgICAgICAgICAgICBuZXdHdWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldID0gcXVvdGFCdWZmZXJbbGxdOworICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgaWYgKHF1b3RhQnVmZmVyW2xsXSA+IG1oVGhyZXNoLnRocmVzSG9sZFRvbmUgJiYKKyAgICAgICAgICAgICAgICAocERpZmZWZWNTY2ZiW2kgKyAxXSA8IG1oVGhyZXNoLmludlRocmVzSG9sZFRvbmUgfHwKKyAgICAgICAgICAgICAgICAgcERpZmZWZWNTY2ZiW2kgLSAxXSA8IG1oVGhyZXNoLmludlRocmVzSG9sZFRvbmUpKSB7CisgICAgICAgICAgICAgIHBIYXJtVmVjW2ldID0gMTsKKyAgICAgICAgICAgICAgbmV3R3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yT3JpZ1tpXSA9IHF1b3RhQnVmZmVyW2xsXTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgIGlmKHF1b3RhQnVmZmVyW2xsXSA+IG1oVGhyZXNoLnRocmVzSG9sZFRvbmUgJiYgcERpZmZWZWNTY2ZiW2krMV0gPCBtaFRocmVzaC5pbnZUaHJlc0hvbGRUb25lKXsKLSAgICAgICAgICAgICAgICBwSGFybVZlY1tpXSA9IDE7Ci0gICAgICAgICAgICAgICAgbmV3R3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yT3JpZ1tpXSA9IHF1b3RhQnVmZmVyW2xsXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHF1b3RhQnVmZmVyW2xsXSA+IG1oVGhyZXNoLnRocmVzSG9sZFRvbmUgJiYKKyAgICAgICAgICAgICAgICBwRGlmZlZlY1NjZmJbaSArIDFdIDwgbWhUaHJlc2guaW52VGhyZXNIb2xkVG9uZSkgeworICAgICAgICAgICAgICBwSGFybVZlY1tpXSA9IDE7CisgICAgICAgICAgICAgIG5ld0d1aWRlVmVjdG9ycy5ndWlkZVZlY3Rvck9yaWdbaV0gPSBxdW90YUJ1ZmZlcltsbF07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03OTQsNyArNzcxLDYgQEAKICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgICAgIERvIGRldGVjdGlvbiBmb3IgZXZlcnkgdG9uYWxpdHkgZXN0aW1hdGUsIHVzaW5nIGZvcndhcmQgcHJlZGljdGlvbi4KQEAgLTgwNCwxNDkgKzc4MCwxMTYgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGRldGVjdGlvbldpdGhQcmVkaWN0aW9uKEZJWFBfREJMICoqcXVvdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnBEaWZmVmVjU2NmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqKiBzaWduQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiogcEZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnNmbU9yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnNmbVNiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICoqZGV0ZWN0aW9uVmVjdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwUHJldkFkZEhhcm1TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVUlERV9WRUNUT1JTICpndWlkZVZlY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9Fc3RQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkZXRlY3Rpb25TdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0b3ROb0VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuZXdEZXRlY3Rpb25BbGxvd2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwQWRkSGFybUZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcEFkZEhhcm1TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcE5yZ1ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERFVEVDVE9SX1BBUkFNRVRFUlNfTUggKm1oUGFyYW1zKQotewotICBJTlQgZXN0ID0gMCxpOworc3RhdGljIHZvaWQgZGV0ZWN0aW9uV2l0aFByZWRpY3Rpb24oCisgICAgRklYUF9EQkwgKipxdW90YUJ1ZmZlciwgRklYUF9EQkwgKipwRGlmZlZlY1NjZmIsIElOVCAqKnNpZ25CdWZmZXIsIElOVCBuU2ZiLAorICAgIGNvbnN0IFVDSEFSICpwRnJlcUJhbmRUYWJsZSwgRklYUF9EQkwgKipzZm1PcmlnLCBGSVhQX0RCTCAqKnNmbVNiciwKKyAgICBVQ0hBUiAqKmRldGVjdGlvblZlY3RvcnMsIFVDSEFSICpwUHJldkFkZEhhcm1TZmIsCisgICAgR1VJREVfVkVDVE9SUyAqZ3VpZGVWZWN0b3JzLCBJTlQgbm9Fc3RQZXJGcmFtZSwgSU5UIGRldGVjdGlvblN0YXJ0LAorICAgIElOVCB0b3ROb0VzdCwgSU5UIG5ld0RldGVjdGlvbkFsbG93ZWQsIElOVCAqcEFkZEhhcm1GbGFnLAorICAgIFVDSEFSICpwQWRkSGFybVNmYiwgRklYUF9EQkwgKnBOcmdWZWN0b3IsCisgICAgY29uc3QgREVURUNUT1JfUEFSQU1FVEVSU19NSCAqbWhQYXJhbXMpIHsKKyAgSU5UIGVzdCA9IDAsIGk7CiAgIElOVCBzdGFydDsKIAotICBGREttZW1jbGVhcihwQWRkSGFybVNmYixuU2ZiKnNpemVvZihVQ0hBUikpOworICBGREttZW1jbGVhcihwQWRkSGFybVNmYiwgblNmYiAqIHNpemVvZihVQ0hBUikpOwogCi0gIGlmKG5ld0RldGVjdGlvbkFsbG93ZWQpewotCi0gICAgLyogU2luY2Ugd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIHRyYW5zaWVudCByZWdpb24gZm9yIGRldGVjdGlvbiAoc2luY2UgdGhlIHRvbmFsaXR5IHZhbHVlcwotICAgICAgIHRlbmQgdG8gYmUgYSBiaXQgdW5yZWxpYWJsZSBmb3IgdGhpcyByZWdpb24pIHRoZSBndWlkZS12YWx1ZXMgYXJlIGNvcGllZCB0byB0aGUgY3VycmVudAotICAgICAgIHN0YXJ0aW5nIHBvaW50LiAqLwotICAgIGlmKHRvdE5vRXN0ID4gMSl7Ci0gICAgICBzdGFydCA9IGRldGVjdGlvblN0YXJ0KzE7CisgIGlmIChuZXdEZXRlY3Rpb25BbGxvd2VkKSB7CisgICAgLyogU2luY2Ugd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIHRyYW5zaWVudCByZWdpb24gZm9yIGRldGVjdGlvbiAoc2luY2UgdGhlCisgICAgICAgdG9uYWxpdHkgdmFsdWVzIHRlbmQgdG8gYmUgYSBiaXQgdW5yZWxpYWJsZSBmb3IgdGhpcyByZWdpb24pIHRoZQorICAgICAgIGd1aWRlLXZhbHVlcyBhcmUgY29waWVkIHRvIHRoZSBjdXJyZW50IHN0YXJ0aW5nIHBvaW50LiAqLworICAgIGlmICh0b3ROb0VzdCA+IDEpIHsKKyAgICAgIHN0YXJ0ID0gZGV0ZWN0aW9uU3RhcnQgKyAxOwogCiAgICAgICBpZiAoc3RhcnQgIT0gMCkgewotICAgICAgICBGREttZW1jcHkoZ3VpZGVWZWN0b3JzW3N0YXJ0XS5ndWlkZVZlY3RvckRpZmYsZ3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGlmZixuU2ZiKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgICBGREttZW1jcHkoZ3VpZGVWZWN0b3JzW3N0YXJ0XS5ndWlkZVZlY3Rvck9yaWcsZ3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZyxuU2ZiKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbc3RhcnQtMV0uZ3VpZGVWZWN0b3JEZXRlY3RlZCxuU2ZiKnNpemVvZihVQ0hBUikpOworICAgICAgICBGREttZW1jcHkoZ3VpZGVWZWN0b3JzW3N0YXJ0XS5ndWlkZVZlY3RvckRpZmYsCisgICAgICAgICAgICAgICAgICBndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmLCBuU2ZiICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNweShndWlkZVZlY3RvcnNbc3RhcnRdLmd1aWRlVmVjdG9yT3JpZywKKyAgICAgICAgICAgICAgICAgIGd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3Rvck9yaWcsIG5TZmIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY2xlYXIoZ3VpZGVWZWN0b3JzW3N0YXJ0IC0gMV0uZ3VpZGVWZWN0b3JEZXRlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgblNmYiAqIHNpemVvZihVQ0hBUikpOwogICAgICAgfQotICAgIH0KLSAgICBlbHNleworICAgIH0gZWxzZSB7CiAgICAgICBzdGFydCA9IDA7CiAgICAgfQotICB9Ci0gIGVsc2V7CisgIH0gZWxzZSB7CiAgICAgc3RhcnQgPSAwOwogICB9CiAKLQotICBmb3IoZXN0ID0gc3RhcnQ7IGVzdCA8IHRvdE5vRXN0OyBlc3QrKyl7Ci0KKyAgZm9yIChlc3QgPSBzdGFydDsgZXN0IDwgdG90Tm9Fc3Q7IGVzdCsrKSB7CiAgICAgLyoKLSAgICAqIERvIGRldGVjdGlvbiBvbiB0aGUgY3VycmVudCBmcmFtZSB1c2luZwotICAgICogZ3VpZGUtaW5mbyBmcm9tIHRoZSBwcmV2aW91cy4KLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmKGVzdCA+IDApewotICAgICAgRkRLbWVtY3B5KGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yRGV0ZWN0ZWQsZGV0ZWN0aW9uVmVjdG9yc1tlc3QtMV0sblNmYipzaXplb2YoVUNIQVIpKTsKKyAgICAgKiBEbyBkZXRlY3Rpb24gb24gdGhlIGN1cnJlbnQgZnJhbWUgdXNpbmcKKyAgICAgKiBndWlkZS1pbmZvIGZyb20gdGhlIHByZXZpb3VzLgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChlc3QgPiAwKSB7CisgICAgICBGREttZW1jcHkoZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JEZXRlY3RlZCwKKyAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdCAtIDFdLCBuU2ZiICogc2l6ZW9mKFVDSEFSKSk7CiAgICAgfQogCi0gICAgRkRLbWVtY2xlYXIoZGV0ZWN0aW9uVmVjdG9yc1tlc3RdLCBuU2ZiKnNpemVvZihVQ0hBUikpOworICAgIEZES21lbWNsZWFyKGRldGVjdGlvblZlY3RvcnNbZXN0XSwgblNmYiAqIHNpemVvZihVQ0hBUikpOwogCi0gICAgaWYoZXN0IDwgdG90Tm9Fc3QtMSl7Ci0gICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbZXN0KzFdLmd1aWRlVmVjdG9yRGlmZixuU2ZiKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgRkRLbWVtY2xlYXIoZ3VpZGVWZWN0b3JzW2VzdCsxXS5ndWlkZVZlY3Rvck9yaWcsblNmYipzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tlc3QrMV0uZ3VpZGVWZWN0b3JEZXRlY3RlZCxuU2ZiKnNpemVvZihVQ0hBUikpOworICAgIGlmIChlc3QgPCB0b3ROb0VzdCAtIDEpIHsKKyAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tlc3QgKyAxXS5ndWlkZVZlY3RvckRpZmYsCisgICAgICAgICAgICAgICAgICBuU2ZiICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbZXN0ICsgMV0uZ3VpZGVWZWN0b3JPcmlnLAorICAgICAgICAgICAgICAgICAgblNmYiAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY2xlYXIoZ3VpZGVWZWN0b3JzW2VzdCArIDFdLmd1aWRlVmVjdG9yRGV0ZWN0ZWQsCisgICAgICAgICAgICAgICAgICBuU2ZiICogc2l6ZW9mKFVDSEFSKSk7CiAKLSAgICAgIGRldGVjdGlvbihxdW90YUJ1ZmZlcltlc3RdLAotICAgICAgICAgICAgICAgIHBEaWZmVmVjU2NmYltlc3RdLAotICAgICAgICAgICAgICAgIG5TZmIsCi0gICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9yc1tlc3RdLAotICAgICAgICAgICAgICAgIHBGcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgIHNmbU9yaWdbZXN0XSwKLSAgICAgICAgICAgICAgICBzZm1TYnJbZXN0XSwKLSAgICAgICAgICAgICAgICBndWlkZVZlY3RvcnNbZXN0XSwKLSAgICAgICAgICAgICAgICBndWlkZVZlY3RvcnNbZXN0KzFdLAorICAgICAgZGV0ZWN0aW9uKHF1b3RhQnVmZmVyW2VzdF0sIHBEaWZmVmVjU2NmYltlc3RdLCBuU2ZiLAorICAgICAgICAgICAgICAgIGRldGVjdGlvblZlY3RvcnNbZXN0XSwgcEZyZXFCYW5kVGFibGUsIHNmbU9yaWdbZXN0XSwKKyAgICAgICAgICAgICAgICBzZm1TYnJbZXN0XSwgZ3VpZGVWZWN0b3JzW2VzdF0sIGd1aWRlVmVjdG9yc1tlc3QgKyAxXSwKICAgICAgICAgICAgICAgICBtaFBhcmFtcy0+dGhyZXNIb2xkcyk7Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3RvckRpZmYsblNmYipzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yT3JpZyxuU2ZiKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgRkRLbWVtY2xlYXIoZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JEZXRlY3RlZCxuU2ZiKnNpemVvZihVQ0hBUikpOworICAgIH0gZWxzZSB7CisgICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3RvckRpZmYsIG5TZmIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yT3JpZywgblNmYiAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY2xlYXIoZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JEZXRlY3RlZCwgblNmYiAqIHNpemVvZihVQ0hBUikpOwogCi0gICAgICBkZXRlY3Rpb24ocXVvdGFCdWZmZXJbZXN0XSwKLSAgICAgICAgICAgICAgICBwRGlmZlZlY1NjZmJbZXN0XSwKLSAgICAgICAgICAgICAgICBuU2ZiLAotICAgICAgICAgICAgICAgIGRldGVjdGlvblZlY3RvcnNbZXN0XSwKLSAgICAgICAgICAgICAgICBwRnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICBzZm1PcmlnW2VzdF0sCi0gICAgICAgICAgICAgICAgc2ZtU2JyW2VzdF0sCi0gICAgICAgICAgICAgICAgZ3VpZGVWZWN0b3JzW2VzdF0sCi0gICAgICAgICAgICAgICAgZ3VpZGVWZWN0b3JzW2VzdF0sCisgICAgICBkZXRlY3Rpb24ocXVvdGFCdWZmZXJbZXN0XSwgcERpZmZWZWNTY2ZiW2VzdF0sIG5TZmIsCisgICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9yc1tlc3RdLCBwRnJlcUJhbmRUYWJsZSwgc2ZtT3JpZ1tlc3RdLAorICAgICAgICAgICAgICAgIHNmbVNicltlc3RdLCBndWlkZVZlY3RvcnNbZXN0XSwgZ3VpZGVWZWN0b3JzW2VzdF0sCiAgICAgICAgICAgICAgICAgbWhQYXJhbXMtPnRocmVzSG9sZHMpOwogICAgIH0KICAgfQogCi0KICAgLyogQ2xlYW4gdXAgdGhlIGRldGVjdGlvbi4qLwotICB0cmFuc2llbnRDbGVhblVwKHF1b3RhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9ycywKLSAgICAgICAgICAgICAgICAgICBwQWRkSGFybVNmYiwKLSAgICAgICAgICAgICAgICAgICBwUHJldkFkZEhhcm1TZmIsCi0gICAgICAgICAgICAgICAgICAgc2lnbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICBwRnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICB0b3ROb0VzdCwKLSAgICAgICAgICAgICAgICAgICBuZXdEZXRlY3Rpb25BbGxvd2VkLAotICAgICAgICAgICAgICAgICAgIHBOcmdWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgbWhQYXJhbXMtPnRocmVzSG9sZHMpOwotCisgIHRyYW5zaWVudENsZWFuVXAocXVvdGFCdWZmZXIsIG5TZmIsIGRldGVjdGlvblZlY3RvcnMsIHBBZGRIYXJtU2ZiLAorICAgICAgICAgICAgICAgICAgIHBQcmV2QWRkSGFybVNmYiwgc2lnbkJ1ZmZlciwgcEZyZXFCYW5kVGFibGUsIHN0YXJ0LCB0b3ROb0VzdCwKKyAgICAgICAgICAgICAgICAgICBuZXdEZXRlY3Rpb25BbGxvd2VkLCBwTnJnVmVjdG9yLCBtaFBhcmFtcy0+dGhyZXNIb2xkcyk7CiAKICAgLyogU2V0IGZsYWcuLi4gKi8KICAgKnBBZGRIYXJtRmxhZyA9IDA7Ci0gIGZvcihpPTA7IGk8blNmYjsgaSsrKXsKLSAgICBpZihwQWRkSGFybVNmYltpXSl7CisgIGZvciAoaSA9IDA7IGkgPCBuU2ZiOyBpKyspIHsKKyAgICBpZiAocEFkZEhhcm1TZmJbaV0pIHsKICAgICAgICpwQWRkSGFybUZsYWcgPSAxOwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKLSAgRkRLbWVtY3B5KHBQcmV2QWRkSGFybVNmYiwgcEFkZEhhcm1TZmIsIG5TZmIqc2l6ZW9mKFVDSEFSKSk7Ci0gIEZES21lbWNweShndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEZXRlY3RlZCxwQWRkSGFybVNmYixuU2ZiKnNpemVvZihJTlQpKTsKKyAgRkRLbWVtY3B5KHBQcmV2QWRkSGFybVNmYiwgcEFkZEhhcm1TZmIsIG5TZmIgKiBzaXplb2YoVUNIQVIpKTsKKyAgRkRLbWVtY3B5KGd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRldGVjdGVkLCBwQWRkSGFybVNmYiwKKyAgICAgICAgICAgIG5TZmIgKiBzaXplb2YoSU5UKSk7CiAKLSAgZm9yKGk9MDsgaTxuU2ZiIDsgaSsrKXsKLQorICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CiAgICAgZ3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGlmZltpXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgIGd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3Rvck9yaWdbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAotICAgIGlmKHBBZGRIYXJtU2ZiW2ldID09IDEpewotICAgICAgLyogSWYgd2UgaGFkIGEgZGV0ZWN0aW9uIHVzZSB0aGUgZ3VpZGUtdmFsdWUgaW4gdGhlIG5leHQgZnJhbWUgZnJvbSB0aGUgbGFzdCBlc3RpbWF0ZSB3ZXJlIHRoZSBkZXRlY3Rpb24KLSAgICAgIHdhcyBkb25lLiovCi0gICAgICBmb3IoZXN0PXN0YXJ0OyBlc3QgPCB0b3ROb0VzdDsgZXN0KyspewotICAgICAgICBpZihndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3RvckRpZmZbaV0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpewotICAgICAgICAgIGd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRpZmZbaV0gPSBndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3RvckRpZmZbaV07CisgICAgaWYgKHBBZGRIYXJtU2ZiW2ldID09IDEpIHsKKyAgICAgIC8qIElmIHdlIGhhZCBhIGRldGVjdGlvbiB1c2UgdGhlIGd1aWRlLXZhbHVlIGluIHRoZSBuZXh0IGZyYW1lIGZyb20gdGhlCisgICAgICBsYXN0IGVzdGltYXRlIHdlcmUgdGhlIGRldGVjdGlvbiB3YXMgZG9uZS4qLworICAgICAgZm9yIChlc3QgPSBzdGFydDsgZXN0IDwgdG90Tm9Fc3Q7IGVzdCsrKSB7CisgICAgICAgIGlmIChndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3RvckRpZmZbaV0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgICAgICBndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmW2ldID0KKyAgICAgICAgICAgICAgZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JEaWZmW2ldOwogICAgICAgICB9Ci0gICAgICAgIGlmKGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yT3JpZ1tpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSl7Ci0gICAgICAgICAgZ3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZ1tpXSA9IGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yT3JpZ1tpXTsKKyAgICAgICAgaWYgKGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yT3JpZ1tpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICAgIGd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3Rvck9yaWdbaV0gPQorICAgICAgICAgICAgICBndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3Rvck9yaWdbaV07CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KLQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgICAgIENhbGN1bGF0ZXMgYSBjb21wZW5zYXRpb24gdmVjdG9yIGZvciB0aGUgZW5lcmd5IGRhdGEuCkBAIC05NjMsMzggKzkwNiwzMCBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY2FsY3VsYXRlQ29tcFZlY3RvcihVQ0hBUiAqcEFkZEhhcm1TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcFRvbmFsaXR5TWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKiogcFNpZ25NYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwRW52Q29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdG90Tm9Fc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtYXhDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcFByZXZFbnZDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbmV3RGV0ZWN0aW9uQWxsb3dlZCkKLXsKLQotICBJTlQgc2NmQmFuZCxlc3QsbCxsbCxsdSxtYXhQb3NGLG1heFBvc1Q7CitzdGF0aWMgdm9pZCBjYWxjdWxhdGVDb21wVmVjdG9yKFVDSEFSICpwQWRkSGFybVNmYiwgRklYUF9EQkwgKipwVG9uYWxpdHlNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqKnBTaWduTWF0cml4LCBVQ0hBUiAqcEVudkNvbXAsIElOVCBuU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgSU5UIHRvdE5vRXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWF4Q29tcCwgVUNIQVIgKnBQcmV2RW52Q29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5ld0RldGVjdGlvbkFsbG93ZWQpIHsKKyAgSU5UIHNjZkJhbmQsIGVzdCwgbCwgbGwsIGx1LCBtYXhQb3NGLCBtYXhQb3NUOwogICBGSVhQX0RCTCBtYXhWYWw7CiAgIElOVCBjb21wVmFsdWU7CiAgIEZJWFBfREJMIHRtcDsKIAotICBGREttZW1jbGVhcihwRW52Q29tcCxuU2ZiKnNpemVvZihVQ0hBUikpOworICBGREttZW1jbGVhcihwRW52Q29tcCwgblNmYiAqIHNpemVvZihVQ0hBUikpOwogCi0gIGZvcihzY2ZCYW5kPTA7IHNjZkJhbmQgPCBuU2ZiOyBzY2ZCYW5kKyspewotCi0gICAgaWYocEFkZEhhcm1TZmJbc2NmQmFuZF0peyAvKiBBIG1pc3Npbmcgc2luZSB3YXMgZGV0ZWN0ZWQgKi8KKyAgZm9yIChzY2ZCYW5kID0gMDsgc2NmQmFuZCA8IG5TZmI7IHNjZkJhbmQrKykgeworICAgIGlmIChwQWRkSGFybVNmYltzY2ZCYW5kXSkgeyAvKiBBIG1pc3Npbmcgc2luZSB3YXMgZGV0ZWN0ZWQgKi8KICAgICAgIGxsID0gZnJlcUJhbmRUYWJsZVtzY2ZCYW5kXTsKLSAgICAgIGx1ID0gZnJlcUJhbmRUYWJsZVtzY2ZCYW5kKzFdOworICAgICAgbHUgPSBmcmVxQmFuZFRhYmxlW3NjZkJhbmQgKyAxXTsKIAotICAgICAgbWF4UG9zRiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgZmluZCB0aGUgbWF4aW11bSovCisgICAgICBtYXhQb3NGID0gMDsgLyogRmlyc3QgZmluZCB0aGUgbWF4aW11bSovCiAgICAgICBtYXhQb3NUID0gMDsKICAgICAgIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCi0gICAgICBmb3IoZXN0PTA7ZXN0PHRvdE5vRXN0O2VzdCsrKXsKLSAgICAgICAgZm9yKGw9bGw7IGw8bHU7IGwrKyl7Ci0gICAgICAgICAgaWYocFRvbmFsaXR5TWF0cml4W2VzdF1bbF0gPiBtYXhWYWwpeworICAgICAgZm9yIChlc3QgPSAwOyBlc3QgPCB0b3ROb0VzdDsgZXN0KyspIHsKKyAgICAgICAgZm9yIChsID0gbGw7IGwgPCBsdTsgbCsrKSB7CisgICAgICAgICAgaWYgKHBUb25hbGl0eU1hdHJpeFtlc3RdW2xdID4gbWF4VmFsKSB7CiAgICAgICAgICAgICBtYXhWYWwgPSBwVG9uYWxpdHlNYXRyaXhbZXN0XVtsXTsKICAgICAgICAgICAgIG1heFBvc0YgPSBsOwogICAgICAgICAgICAgbWF4UG9zVCA9IGVzdDsKQEAgLTEwMTAsNTcgKzk0NSw2MyBAQAogICAgICAgICogaW4gdGhlIFNCUiBkYXRhLCB3aGljaCB3aWxsIGNhdXNlIHByb2JsZW1zIGluIHRoZSBkZWNvZGVyLCB3aGVuIHdlCiAgICAgICAgKiBhZGQgYSBzaW5lIHRvIGp1c3Qgb25lIG9mIHRoZSBjaGFubmVscy4KICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICBpZihtYXhQb3NGID09IGxsICYmIHNjZkJhbmQpewotICAgICAgICBpZighcEFkZEhhcm1TZmJbc2NmQmFuZCAtIDFdKSB7ICAgICAvKiBObyBkZXRlY3Rpb24gYmVsb3cqLwotICAgICAgICAgIGlmIChwU2lnbk1hdHJpeFttYXhQb3NUXVttYXhQb3NGIC0gMV0gPiAwICYmIHBTaWduTWF0cml4W21heFBvc1RdW21heFBvc0ZdIDwgMCkgewotICAgICAgICAgICAgLyogVGhlIGNvbXAgdmFsdWUgaXMgY2FsdWxhdGVkIGFzIHRoZSB0b25hbGxpdHkgdmFsdWUsIGkuZSB3ZSB3YW50IHRvCi0gICAgICAgICAgICAgICByZWR1Y2UgdGhlIGVudmVsb3BlIGRhdGEgZm9yIHRoaXMgY2hhbm5lbCB3aXRoIGFzIG11Y2ggYXMgdGhlIHRvbmFsaXR5Ci0gICAgICAgICAgICAgICB0aGF0IGlzIHNwcmVhZCBmcm9tIHRoZSBjaGFubmVsIGFib3ZlLiAobGQ2NChSRUxBWEFUSU9OKSA9IDAuMzExNDMwNzU4ODkpICovCi0gICAgICAgICAgICB0bXAgPSBmaXhwX2FicygoRklYUF9EQkwpQ2FsY0xkRGF0YShwVG9uYWxpdHlNYXRyaXhbbWF4UG9zVF1bbWF4UG9zRiAtIDFdKSArIFJFTEFYQVRJT05fTEQ2NCk7Ci0gICAgICAgICAgICB0bXAgPSAodG1wID4+IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMSkpICsgKEZJWFBfREJMKTE7ICAvKiBzaGlmdCBvbmUgYml0IGxlc3MgZm9yIHJvdW5kaW5nICovCisgICAgICBpZiAobWF4UG9zRiA9PSBsbCAmJiBzY2ZCYW5kKSB7CisgICAgICAgIGlmICghcEFkZEhhcm1TZmJbc2NmQmFuZCAtIDFdKSB7IC8qIE5vIGRldGVjdGlvbiBiZWxvdyovCisgICAgICAgICAgaWYgKHBTaWduTWF0cml4W21heFBvc1RdW21heFBvc0YgLSAxXSA+IDAgJiYKKyAgICAgICAgICAgICAgcFNpZ25NYXRyaXhbbWF4UG9zVF1bbWF4UG9zRl0gPCAwKSB7CisgICAgICAgICAgICAvKiBUaGUgY29tcCB2YWx1ZSBpcyBjYWx1bGF0ZWQgYXMgdGhlIHRvbmFsbGl0eSB2YWx1ZSwgaS5lIHdlIHdhbnQKKyAgICAgICAgICAgICAgIHRvIHJlZHVjZSB0aGUgZW52ZWxvcGUgZGF0YSBmb3IgdGhpcyBjaGFubmVsIHdpdGggYXMgbXVjaCBhcyB0aGUKKyAgICAgICAgICAgICAgIHRvbmFsaXR5IHRoYXQgaXMgc3ByZWFkIGZyb20gdGhlIGNoYW5uZWwgYWJvdmUuIChsZDY0KFJFTEFYQVRJT04pCisgICAgICAgICAgICAgICA9IDAuMzExNDMwNzU4ODkpICovCisgICAgICAgICAgICB0bXAgPSBmaXhwX2FicygKKyAgICAgICAgICAgICAgICAoRklYUF9EQkwpQ2FsY0xkRGF0YShwVG9uYWxpdHlNYXRyaXhbbWF4UG9zVF1bbWF4UG9zRiAtIDFdKSArCisgICAgICAgICAgICAgICAgUkVMQVhBVElPTl9MRDY0KTsKKyAgICAgICAgICAgIHRtcCA9ICh0bXAgPj4gKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQgLSAxKSkgKworICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKTE7IC8qIHNoaWZ0IG9uZSBiaXQgbGVzcyBmb3Igcm91bmRpbmcgKi8KICAgICAgICAgICAgIGNvbXBWYWx1ZSA9ICgoSU5UKShMT05HKXRtcCkgPj4gMTsKIAotCQkJCQkJICAgICAgLyogbGltaXQgdGhlIGNvbXAtdmFsdWUqLwotICAgICAgICAgICAgaWYgKGNvbXBWYWx1ZSA+IG1heENvbXApCi0gICAgICAgICAgICAgIGNvbXBWYWx1ZSA9IG1heENvbXA7CisgICAgICAgICAgICAvKiBsaW1pdCB0aGUgY29tcC12YWx1ZSovCisgICAgICAgICAgICBpZiAoY29tcFZhbHVlID4gbWF4Q29tcCkgY29tcFZhbHVlID0gbWF4Q29tcDsKIAotICAgICAgICAgICAgcEVudkNvbXBbc2NmQmFuZC0xXSA9IGNvbXBWYWx1ZTsKLQkJCQkJICAgICB9Ci0JCQkJICAgIH0KKyAgICAgICAgICAgIHBFbnZDb21wW3NjZkJhbmQgLSAxXSA9IGNvbXBWYWx1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgIH0KIAogICAgICAgLyoKICAgICAgICAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBmb3IgdGhlIHVwcGVyIGVuZCBvZiB0aGUgc2NhbGVmYWN0b3ItYmFuZC4KICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICBpZihtYXhQb3NGID09IGx1LTEgJiYgc2NmQmFuZCsxIDwgblNmYil7ICAgICAgICAvKiBVcHBlciBib3JkZXIqLwotICAgICAgICBpZighcEFkZEhhcm1TZmJbc2NmQmFuZCArIDFdKSB7Ci0gICAgICAgICAgaWYgKHBTaWduTWF0cml4W21heFBvc1RdW21heFBvc0ZdID4gMCAmJiBwU2lnbk1hdHJpeFttYXhQb3NUXVttYXhQb3NGICsgMV0gPCAwKSB7Ci0gICAgICAgICAgICB0bXAgPSBmaXhwX2FicygoRklYUF9EQkwpQ2FsY0xkRGF0YShwVG9uYWxpdHlNYXRyaXhbbWF4UG9zVF1bbWF4UG9zRiArIDFdKSArIFJFTEFYQVRJT05fTEQ2NCk7Ci0gICAgICAgICAgICB0bXAgPSAodG1wID4+IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMSkpICsgKEZJWFBfREJMKTE7ICAvKiBzaGlmdCBvbmUgYml0IGxlc3MgZm9yIHJvdW5kaW5nICovCisgICAgICBpZiAobWF4UG9zRiA9PSBsdSAtIDEgJiYgc2NmQmFuZCArIDEgPCBuU2ZiKSB7IC8qIFVwcGVyIGJvcmRlciovCisgICAgICAgIGlmICghcEFkZEhhcm1TZmJbc2NmQmFuZCArIDFdKSB7CisgICAgICAgICAgaWYgKHBTaWduTWF0cml4W21heFBvc1RdW21heFBvc0ZdID4gMCAmJgorICAgICAgICAgICAgICBwU2lnbk1hdHJpeFttYXhQb3NUXVttYXhQb3NGICsgMV0gPCAwKSB7CisgICAgICAgICAgICB0bXAgPSBmaXhwX2FicygKKyAgICAgICAgICAgICAgICAoRklYUF9EQkwpQ2FsY0xkRGF0YShwVG9uYWxpdHlNYXRyaXhbbWF4UG9zVF1bbWF4UG9zRiArIDFdKSArCisgICAgICAgICAgICAgICAgUkVMQVhBVElPTl9MRDY0KTsKKyAgICAgICAgICAgIHRtcCA9ICh0bXAgPj4gKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQgLSAxKSkgKworICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKTE7IC8qIHNoaWZ0IG9uZSBiaXQgbGVzcyBmb3Igcm91bmRpbmcgKi8KICAgICAgICAgICAgIGNvbXBWYWx1ZSA9ICgoSU5UKShMT05HKXRtcCkgPj4gMTsKIAotICAgICAgICAgICAgaWYgKGNvbXBWYWx1ZSA+IG1heENvbXApCi0gICAgICAgICAgICAgIGNvbXBWYWx1ZSA9IG1heENvbXA7CisgICAgICAgICAgICBpZiAoY29tcFZhbHVlID4gbWF4Q29tcCkgY29tcFZhbHVlID0gbWF4Q29tcDsKIAotICAgICAgICAgICAgcEVudkNvbXBbc2NmQmFuZCsxXSA9IGNvbXBWYWx1ZTsKLQkJCQkJIH0KLQkJCQkgfQorICAgICAgICAgICAgcEVudkNvbXBbc2NmQmFuZCArIDFdID0gY29tcFZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfQotCQkgfQotCSB9CisgICAgfQorICB9CiAKLSAgaWYobmV3RGV0ZWN0aW9uQWxsb3dlZCA9PSAwKXsKLSAgICBmb3Ioc2NmQmFuZD0wO3NjZkJhbmQ8blNmYjtzY2ZCYW5kKyspewotICAgICAgaWYocEVudkNvbXBbc2NmQmFuZF0gIT0gMCAmJiBwUHJldkVudkNvbXBbc2NmQmFuZF0gPT0gMCkKKyAgaWYgKG5ld0RldGVjdGlvbkFsbG93ZWQgPT0gMCkgeworICAgIGZvciAoc2NmQmFuZCA9IDA7IHNjZkJhbmQgPCBuU2ZiOyBzY2ZCYW5kKyspIHsKKyAgICAgIGlmIChwRW52Q29tcFtzY2ZCYW5kXSAhPSAwICYmIHBQcmV2RW52Q29tcFtzY2ZCYW5kXSA9PSAwKQogICAgICAgICBwRW52Q29tcFtzY2ZCYW5kXSA9IDA7CiAgICAgfQogICB9CiAKICAgLyogcmVtZW1iZXIgdGhlIHZhbHVlIGZvciB0aGUgbmV4dCBmcmFtZS4qLwotICBGREttZW1jcHkocFByZXZFbnZDb21wLHBFbnZDb21wLG5TZmIqc2l6ZW9mKFVDSEFSKSk7CisgIEZES21lbWNweShwUHJldkVudkNvbXAsIHBFbnZDb21wLCBuU2ZiICogc2l6ZW9mKFVDSEFSKSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgRGV0ZWN0cyB3aGVyZSBzdHJvbmcgdG9uYWwgY29tcG9uZW50cyB3aWxsIGJlIG1pc3NpbmcgYWZ0ZXIKQEAgLTEwNzEsMzQgKzEwMTIsMjYgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLUZES3NickVuY19TYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3JRbWYoSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoX3Nick1IRGV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIHBRdW90YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKiogcFNpZ25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIqIGluZGV4VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPICpwRnJhbWVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSKiBwVHJhbkluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiBwQWRkSGFybW9uaWNzRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiogcEFkZEhhcm1vbmljc1NjYWxlRmFjdG9yQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIqIGZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIGVudmVsb3BlQ29tcGVuc2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwTnJnVmVjdG9yKQotewordm9pZCBGREtzYnJFbmNfU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yUW1mKAorICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaF9zYnJNSERldCwgRklYUF9EQkwgKipwUXVvdGFCdWZmZXIsCisgICAgSU5UICoqcFNpZ25CdWZmZXIsIFNDSEFSICppbmRleFZlY3RvciwgY29uc3QgU0JSX0ZSQU1FX0lORk8gKnBGcmFtZUluZm8sCisgICAgY29uc3QgVUNIQVIgKnBUcmFuSW5mbywgSU5UICpwQWRkSGFybW9uaWNzRmxhZywKKyAgICBVQ0hBUiAqcEFkZEhhcm1vbmljc1NjYWxlRmFjdG9yQmFuZHMsIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLCBJTlQgblNmYiwKKyAgICBVQ0hBUiAqZW52ZWxvcGVDb21wZW5zYXRpb24sIEZJWFBfREJMICpwTnJnVmVjdG9yKSB7CiAgIElOVCB0cmFuc2llbnRGbGFnID0gcFRyYW5JbmZvWzFdOwotICBJTlQgdHJhbnNpZW50UG9zICA9IHBUcmFuSW5mb1swXTsKKyAgSU5UIHRyYW5zaWVudFBvcyA9IHBUcmFuSW5mb1swXTsKICAgSU5UIG5ld0RldGVjdGlvbkFsbG93ZWQ7CiAgIElOVCB0cmFuc2llbnREZXRTdGFydCA9IDA7CiAKLSAgVUNIQVIgKiogZGV0ZWN0aW9uVmVjdG9ycyAgPSBoX3Nick1IRGV0LT5kZXRlY3Rpb25WZWN0b3JzOwotICBJTlQgbW92ZSAgICAgICAgICAgICAgICA9IGhfc2JyTUhEZXQtPm1vdmU7Ci0gIElOVCBub0VzdFBlckZyYW1lICAgICAgID0gaF9zYnJNSERldC0+bm9Fc3RQZXJGcmFtZTsKLSAgSU5UIHRvdE5vRXN0ICAgICAgICAgICAgPSBoX3Nick1IRGV0LT50b3ROb0VzdDsKLSAgSU5UIHByZXZUcmFuc2llbnRGbGFnICAgPSBoX3Nick1IRGV0LT5wcmV2aW91c1RyYW5zaWVudEZsYWc7Ci0gIElOVCBwcmV2VHJhbnNpZW50RnJhbWUgID0gaF9zYnJNSERldC0+cHJldmlvdXNUcmFuc2llbnRGcmFtZTsKLSAgSU5UIHRyYW5zaWVudFBvc09mZnNldCAgPSBoX3Nick1IRGV0LT50cmFuc2llbnRQb3NPZmZzZXQ7Ci0gIElOVCBwcmV2VHJhbnNpZW50UG9zICAgID0gaF9zYnJNSERldC0+cHJldmlvdXNUcmFuc2llbnRQb3M7Ci0gIEdVSURFX1ZFQ1RPUlMqIGd1aWRlVmVjdG9ycyA9IGhfc2JyTUhEZXQtPmd1aWRlVmVjdG9yczsKKyAgVUNIQVIgKipkZXRlY3Rpb25WZWN0b3JzID0gaF9zYnJNSERldC0+ZGV0ZWN0aW9uVmVjdG9yczsKKyAgSU5UIG1vdmUgPSBoX3Nick1IRGV0LT5tb3ZlOworICBJTlQgbm9Fc3RQZXJGcmFtZSA9IGhfc2JyTUhEZXQtPm5vRXN0UGVyRnJhbWU7CisgIElOVCB0b3ROb0VzdCA9IGhfc2JyTUhEZXQtPnRvdE5vRXN0OworICBJTlQgcHJldlRyYW5zaWVudEZsYWcgPSBoX3Nick1IRGV0LT5wcmV2aW91c1RyYW5zaWVudEZsYWc7CisgIElOVCBwcmV2VHJhbnNpZW50RnJhbWUgPSBoX3Nick1IRGV0LT5wcmV2aW91c1RyYW5zaWVudEZyYW1lOworICBJTlQgdHJhbnNpZW50UG9zT2Zmc2V0ID0gaF9zYnJNSERldC0+dHJhbnNpZW50UG9zT2Zmc2V0OworICBJTlQgcHJldlRyYW5zaWVudFBvcyA9IGhfc2JyTUhEZXQtPnByZXZpb3VzVHJhbnNpZW50UG9zOworICBHVUlERV9WRUNUT1JTICpndWlkZVZlY3RvcnMgPSBoX3Nick1IRGV0LT5ndWlkZVZlY3RvcnM7CiAgIElOVCBkZWx0YVRpbWUgPSBoX3Nick1IRGV0LT5taFBhcmFtcy0+ZGVsdGFUaW1lOwogICBJTlQgbWF4Q29tcCA9IGhfc2JyTUhEZXQtPm1oUGFyYW1zLT5tYXhDb21wOwogCkBAIC0xMTA3LDk2ICsxMDQwLDcwIEBACiAgIC8qCiAgIEJ1ZmZlciB2YWx1ZXMuCiAgICovCi0gIEZES19BU1NFUlQobW92ZTw9KE1BWF9OT19PRl9FU1RJTUFURVM+PjEpKTsKLSAgRkRLX0FTU0VSVChub0VzdFBlckZyYW1lPD0oTUFYX05PX09GX0VTVElNQVRFUz4+MSkpOworICBGREtfQVNTRVJUKG1vdmUgPD0gKE1BWF9OT19PRl9FU1RJTUFURVMgPj4gMSkpOworICBGREtfQVNTRVJUKG5vRXN0UGVyRnJhbWUgPD0gKE1BWF9OT19PRl9FU1RJTUFURVMgPj4gMSkpOwogCiAgIEZJWFBfREJMICpzZm1TYnJbTUFYX05PX09GX0VTVElNQVRFU107CiAgIEZJWFBfREJMICpzZm1PcmlnW01BWF9OT19PRl9FU1RJTUFURVNdOwogICBGSVhQX0RCTCAqdG9uYWxpdHlEaWZmW01BWF9OT19PRl9FU1RJTUFURVNdOwogCi0gIGZvciAoZXN0PTA7IGVzdCA8IE1BWF9OT19PRl9FU1RJTUFURVMvMjsgZXN0KyspIHsKLSAgICBzZm1TYnJbZXN0XSAgICAgICA9IGhfc2JyTUhEZXQtPnNmbVNicltlc3RdOwotICAgIHNmbU9yaWdbZXN0XSAgICAgID0gaF9zYnJNSERldC0+c2ZtT3JpZ1tlc3RdOworICBmb3IgKGVzdCA9IDA7IGVzdCA8IE1BWF9OT19PRl9FU1RJTUFURVMgLyAyOyBlc3QrKykgeworICAgIHNmbVNicltlc3RdID0gaF9zYnJNSERldC0+c2ZtU2JyW2VzdF07CisgICAgc2ZtT3JpZ1tlc3RdID0gaF9zYnJNSERldC0+c2ZtT3JpZ1tlc3RdOwogICAgIHRvbmFsaXR5RGlmZltlc3RdID0gaF9zYnJNSERldC0+dG9uYWxpdHlEaWZmW2VzdF07CiAgIH0KIAotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoc2NyYXRjaF9tZW0sIEZJWFBfREJMLCAoMypNQVhfTk9fT0ZfRVNUSU1BVEVTLzIqTUFYX0ZSRVFfQ09FRkZTKSk7Ci0gIEZJWFBfREJMICpzY3JhdGNoID0gc2NyYXRjaF9tZW07CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChfc2NyYXRjaCwgRklYUF9EQkwsCisgICAgICAgICAgICAgICAgICAgICAgICAzICogTUFYX05PX09GX0VTVElNQVRFUyAvIDIgKiBNQVhfRlJFUV9DT0VGRlMpCisgIEZJWFBfREJMICpzY3JhdGNoID0gX3NjcmF0Y2g7CiAgIGZvciAoOyBlc3QgPCBNQVhfTk9fT0ZfRVNUSU1BVEVTOyBlc3QrKykgewotICAgIHNmbVNicltlc3RdICAgICAgID0gc2NyYXRjaDsgc2NyYXRjaCs9TUFYX0ZSRVFfQ09FRkZTOwotICAgIHNmbU9yaWdbZXN0XSAgICAgID0gc2NyYXRjaDsgc2NyYXRjaCs9TUFYX0ZSRVFfQ09FRkZTOwotICAgIHRvbmFsaXR5RGlmZltlc3RdID0gc2NyYXRjaDsgc2NyYXRjaCs9TUFYX0ZSRVFfQ09FRkZTOworICAgIHNmbVNicltlc3RdID0gc2NyYXRjaDsKKyAgICBzY3JhdGNoICs9IE1BWF9GUkVRX0NPRUZGUzsKKyAgICBzZm1PcmlnW2VzdF0gPSBzY3JhdGNoOworICAgIHNjcmF0Y2ggKz0gTUFYX0ZSRVFfQ09FRkZTOworICAgIHRvbmFsaXR5RGlmZltlc3RdID0gc2NyYXRjaDsKKyAgICBzY3JhdGNoICs9IE1BWF9GUkVRX0NPRUZGUzsKICAgfQogCisgIC8qIERldGVybWluZSBpZiB3ZSdyZSBhbGxvd2VkIHRvIGRldGVjdCAibWlzc2luZyBoYXJtb25pY3MiIHRoYXQgd2Fzbid0CisgICAgIGRldGVjdGVkIGJlZm9yZS4gSW4gb3JkZXIgdG8gYmUgYWxsb3dlZCB0byBkbyBuZXcgZGV0ZWN0aW9uLCB0aGVyZSBtdXN0IGJlCisgICAgIGEgdHJhbnNpZW50IGluIHRoZSBjdXJyZW50IGZyYW1lLCBvciBhIHRyYW5zaWVudCBpbiB0aGUgcHJldmlvdXMgZnJhbWUKKyAgICAgc3VmZmljaWVudGx5IGNsb3NlIHRvIHRoZSBjdXJyZW50IGZyYW1lLiAqLworICBuZXdEZXRlY3Rpb25BbGxvd2VkID0gaXNEZXRlY3Rpb25PZk5ld1RvbmVBbGxvd2VkKAorICAgICAgcEZyYW1lSW5mbywgJnRyYW5zaWVudERldFN0YXJ0LCBub0VzdFBlckZyYW1lLCBwcmV2VHJhbnNpZW50RnJhbWUsCisgICAgICBwcmV2VHJhbnNpZW50UG9zLCBwcmV2VHJhbnNpZW50RmxhZywgdHJhbnNpZW50UG9zT2Zmc2V0LCB0cmFuc2llbnRGbGFnLAorICAgICAgdHJhbnNpZW50UG9zLCBkZWx0YVRpbWUsIGhfc2JyTUhEZXQpOwogCi0KLSAgLyogRGV0ZXJtaW5lIGlmIHdlJ3JlIGFsbG93ZWQgdG8gZGV0ZWN0ICJtaXNzaW5nIGhhcm1vbmljcyIgdGhhdCB3YXNuJ3QgZGV0ZWN0ZWQgYmVmb3JlLgotICAgICBJbiBvcmRlciB0byBiZSBhbGxvd2VkIHRvIGRvIG5ldyBkZXRlY3Rpb24sIHRoZXJlIG11c3QgYmUgYSB0cmFuc2llbnQgaW4gdGhlIGN1cnJlbnQKLSAgICAgZnJhbWUsIG9yIGEgdHJhbnNpZW50IGluIHRoZSBwcmV2aW91cyBmcmFtZSBzdWZmaWNpZW50bHkgY2xvc2UgdG8gdGhlIGN1cnJlbnQgZnJhbWUuICovCi0gIG5ld0RldGVjdGlvbkFsbG93ZWQgPSBpc0RldGVjdGlvbk9mTmV3VG9uZUFsbG93ZWQocEZyYW1lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNpZW50RGV0U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Fc3RQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2VHJhbnNpZW50RnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlRyYW5zaWVudFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2VHJhbnNpZW50RmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnRQb3NPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50RmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnRQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTUhEZXQpOwotCi0gIC8qIENhbHVsYXRlIHRoZSB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHVzZWQgc3Vic2VxdWVudGx5IGZvciB0aGUgYWN0dWFsIGRldGVjdGlvbiAqLwotICBjYWxjdWxhdGVEZXRlY3RvcklucHV0KHBRdW90YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0b25hbGl0eURpZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2ZtT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZm1TYnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5vRXN0UGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbW92ZSk7CisgIC8qIENhbHVsYXRlIHRoZSB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHVzZWQgc3Vic2VxdWVudGx5IGZvciB0aGUgYWN0dWFsCisgICAqIGRldGVjdGlvbiAqLworICBjYWxjdWxhdGVEZXRlY3RvcklucHV0KHBRdW90YUJ1ZmZlciwgaW5kZXhWZWN0b3IsIHRvbmFsaXR5RGlmZiwgc2ZtT3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZm1TYnIsIGZyZXFCYW5kVGFibGUsIG5TZmIsIG5vRXN0UGVyRnJhbWUsIG1vdmUpOwogCiAgIC8qIERvIHRoZSBhY3R1YWwgZGV0ZWN0aW9uIHVzaW5nIGluZm9ybWF0aW9uIGZyb20gcHJldmlvdXMgZGV0ZWN0aW9ucyAqLwotICBkZXRlY3Rpb25XaXRoUHJlZGljdGlvbihwUXVvdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRvbmFsaXR5RGlmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpZ25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNmbU9yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNmbVNiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJNSERldC0+Z3VpZGVTY2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZVZlY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5vRXN0UGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudERldFN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICB0b3ROb0VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV0ZWN0aW9uQWxsb3dlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZEhhcm1vbmljc0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRIYXJtb25pY3NTY2FsZUZhY3RvckJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJnVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick1IRGV0LT5taFBhcmFtcyk7CisgIGRldGVjdGlvbldpdGhQcmVkaWN0aW9uKHBRdW90YUJ1ZmZlciwgdG9uYWxpdHlEaWZmLCBwU2lnbkJ1ZmZlciwgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZSwgc2ZtT3JpZywgc2ZtU2JyLCBkZXRlY3Rpb25WZWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick1IRGV0LT5ndWlkZVNjZmIsIGd1aWRlVmVjdG9ycywgbm9Fc3RQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50RGV0U3RhcnQsIHRvdE5vRXN0LCBuZXdEZXRlY3Rpb25BbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkSGFybW9uaWNzRmxhZywgcEFkZEhhcm1vbmljc1NjYWxlRmFjdG9yQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdWZWN0b3IsIGhfc2JyTUhEZXQtPm1oUGFyYW1zKTsKIAogICAvKiBDYWxjdWxhdGUgdGhlIGNvbXAgdmVjdG9yLCBzbyB0aGF0IHRoZSBlbmVyZ3kgY2FuIGJlCiAgICAgIGNvbXBlbnNhdGVkIGZvciBhIHNpbmUgYmV0d2VlbiB0d28gUU1GLWJhbmRzLiAqLwotICBjYWxjdWxhdGVDb21wVmVjdG9yKHBBZGRIYXJtb25pY3NTY2FsZUZhY3RvckJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgIHBRdW90YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICBwU2lnbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZUNvbXBlbnNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgdG90Tm9Fc3QsCi0gICAgICAgICAgICAgICAgICAgICAgbWF4Q29tcCwKLSAgICAgICAgICAgICAgICAgICAgICBoX3Nick1IRGV0LT5wcmV2RW52ZWxvcGVDb21wZW5zYXRpb24sCisgIGNhbGN1bGF0ZUNvbXBWZWN0b3IocEFkZEhhcm1vbmljc1NjYWxlRmFjdG9yQmFuZHMsIHBRdW90YUJ1ZmZlciwgcFNpZ25CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVDb21wZW5zYXRpb24sIG5TZmIsIGZyZXFCYW5kVGFibGUsIHRvdE5vRXN0LAorICAgICAgICAgICAgICAgICAgICAgIG1heENvbXAsIGhfc2JyTUhEZXQtPnByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXRlY3Rpb25BbGxvd2VkKTsKIAotICBmb3IgKGVzdD0wOyBlc3QgPCBtb3ZlOyBlc3QrKykgewotICAgIEZES21lbWNweSh0b25hbGl0eURpZmZbZXN0XSwgdG9uYWxpdHlEaWZmW2VzdCArIG5vRXN0UGVyRnJhbWVdLCBzaXplb2YoRklYUF9EQkwpKk1BWF9GUkVRX0NPRUZGUyk7Ci0gICAgRkRLbWVtY3B5KHNmbU9yaWdbZXN0XSwgc2ZtT3JpZ1tlc3QgKyBub0VzdFBlckZyYW1lXSwgc2l6ZW9mKEZJWFBfREJMKSpNQVhfRlJFUV9DT0VGRlMpOwotICAgIEZES21lbWNweShzZm1TYnJbZXN0XSwgc2ZtU2JyW2VzdCArIG5vRXN0UGVyRnJhbWVdLCBzaXplb2YoRklYUF9EQkwpKk1BWF9GUkVRX0NPRUZGUyk7CisgIGZvciAoZXN0ID0gMDsgZXN0IDwgbW92ZTsgZXN0KyspIHsKKyAgICBGREttZW1jcHkodG9uYWxpdHlEaWZmW2VzdF0sIHRvbmFsaXR5RGlmZltlc3QgKyBub0VzdFBlckZyYW1lXSwKKyAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIE1BWF9GUkVRX0NPRUZGUyk7CisgICAgRkRLbWVtY3B5KHNmbU9yaWdbZXN0XSwgc2ZtT3JpZ1tlc3QgKyBub0VzdFBlckZyYW1lXSwKKyAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIE1BWF9GUkVRX0NPRUZGUyk7CisgICAgRkRLbWVtY3B5KHNmbVNicltlc3RdLCBzZm1TYnJbZXN0ICsgbm9Fc3RQZXJGcmFtZV0sCisgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBNQVhfRlJFUV9DT0VGRlMpOwogICB9Ci0gIENfQUxMT0NfU0NSQVRDSF9FTkQoc2NyYXRjaCwgRklYUF9EQkwsICgzKk1BWF9OT19PRl9FU1RJTUFURVMvMipNQVhfRlJFUV9DT0VGRlMpKTsKLQotCisgIENfQUxMT0NfU0NSQVRDSF9FTkQoX3NjcmF0Y2gsIEZJWFBfREJMLAorICAgICAgICAgICAgICAgICAgICAgIDMgKiBNQVhfTk9fT0ZfRVNUSU1BVEVTIC8gMiAqIE1BWF9GUkVRX0NPRUZGUykKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTIwOCwzNCArMTExNSw0OCBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfQ3JlYXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTUhEZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFuKQoteworSU5UIEZES3NickVuY19DcmVhdGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCisgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTUhEZXQsIElOVCBjaGFuKSB7CiAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaHMgPSBoU2JyTUhEZXQ7CiAgIElOVCBpOwogCi0gIFVDSEFSKiBkZXRlY3Rpb25WZWN0b3JzICAgID0gR2V0UmFtX1Nicl9kZXRlY3Rpb25WZWN0b3JzKGNoYW4pOwotICBVQ0hBUiogZ3VpZGVWZWN0b3JEZXRlY3RlZCA9IEdldFJhbV9TYnJfZ3VpZGVWZWN0b3JEZXRlY3RlZChjaGFuKTsKLSAgRklYUF9EQkwqIGd1aWRlVmVjdG9yRGlmZiAgPSBHZXRSYW1fU2JyX2d1aWRlVmVjdG9yRGlmZihjaGFuKTsKLSAgRklYUF9EQkwqIGd1aWRlVmVjdG9yT3JpZyAgPSBHZXRSYW1fU2JyX2d1aWRlVmVjdG9yT3JpZyhjaGFuKTsKKyAgVUNIQVIgKmRldGVjdGlvblZlY3RvcnMgPSBHZXRSYW1fU2JyX2RldGVjdGlvblZlY3RvcnMoY2hhbik7CisgIFVDSEFSICpndWlkZVZlY3RvckRldGVjdGVkID0gR2V0UmFtX1Nicl9ndWlkZVZlY3RvckRldGVjdGVkKGNoYW4pOworICBGSVhQX0RCTCAqZ3VpZGVWZWN0b3JEaWZmID0gR2V0UmFtX1Nicl9ndWlkZVZlY3RvckRpZmYoY2hhbik7CisgIEZJWFBfREJMICpndWlkZVZlY3Rvck9yaWcgPSBHZXRSYW1fU2JyX2d1aWRlVmVjdG9yT3JpZyhjaGFuKTsKIAotICBGREttZW1jbGVhciAoaHMsc2l6ZW9mKFNCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUikpOworICBGREttZW1jbGVhcihocywgc2l6ZW9mKFNCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUikpOwogCiAgIGhzLT5wcmV2RW52ZWxvcGVDb21wZW5zYXRpb24gPSBHZXRSYW1fU2JyX3ByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbihjaGFuKTsKLSAgaHMtPmd1aWRlU2NmYiAgICAgICAgICAgICAgICA9IEdldFJhbV9TYnJfZ3VpZGVTY2ZiKGNoYW4pOworICBocy0+Z3VpZGVTY2ZiID0gR2V0UmFtX1Nicl9ndWlkZVNjZmIoY2hhbik7CiAKLSAgZm9yKGk9MDsgaTxNQVhfTk9fT0ZfRVNUSU1BVEVTOyBpKyspIHsKLSAgICBocy0+Z3VpZGVWZWN0b3JzW2ldLmd1aWRlVmVjdG9yRGlmZiA9IGd1aWRlVmVjdG9yRGlmZiArIChpKk1BWF9GUkVRX0NPRUZGUyk7Ci0gICAgaHMtPmd1aWRlVmVjdG9yc1tpXS5ndWlkZVZlY3Rvck9yaWcgPSBndWlkZVZlY3Rvck9yaWcgKyAoaSpNQVhfRlJFUV9DT0VGRlMpOwotICAgIGhzLT5kZXRlY3Rpb25WZWN0b3JzW2ldID0gZGV0ZWN0aW9uVmVjdG9ycyArIChpKk1BWF9GUkVRX0NPRUZGUyk7Ci0gICAgaHMtPmd1aWRlVmVjdG9yc1tpXS5ndWlkZVZlY3RvckRldGVjdGVkID0gZ3VpZGVWZWN0b3JEZXRlY3RlZCArIChpKk1BWF9GUkVRX0NPRUZGUyk7CisgIGlmICgoTlVMTCA9PSBkZXRlY3Rpb25WZWN0b3JzKSB8fCAoTlVMTCA9PSBndWlkZVZlY3RvckRldGVjdGVkKSB8fAorICAgICAgKE5VTEwgPT0gZ3VpZGVWZWN0b3JEaWZmKSB8fCAoTlVMTCA9PSBndWlkZVZlY3Rvck9yaWcpIHx8CisgICAgICAoTlVMTCA9PSBocy0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uKSB8fCAoTlVMTCA9PSBocy0+Z3VpZGVTY2ZiKSkgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTk9fT0ZfRVNUSU1BVEVTOyBpKyspIHsKKyAgICBocy0+Z3VpZGVWZWN0b3JzW2ldLmd1aWRlVmVjdG9yRGlmZiA9CisgICAgICAgIGd1aWRlVmVjdG9yRGlmZiArIChpICogTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBocy0+Z3VpZGVWZWN0b3JzW2ldLmd1aWRlVmVjdG9yT3JpZyA9CisgICAgICAgIGd1aWRlVmVjdG9yT3JpZyArIChpICogTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBocy0+ZGV0ZWN0aW9uVmVjdG9yc1tpXSA9IGRldGVjdGlvblZlY3RvcnMgKyAoaSAqIE1BWF9GUkVRX0NPRUZGUyk7CisgICAgaHMtPmd1aWRlVmVjdG9yc1tpXS5ndWlkZVZlY3RvckRldGVjdGVkID0KKyAgICAgICAgZ3VpZGVWZWN0b3JEZXRlY3RlZCArIChpICogTUFYX0ZSRVFfQ09FRkZTKTsKICAgfQogCiAgIHJldHVybiAwOwotfQogCitiYWlsOgorICBocy0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGlmZiA9IGd1aWRlVmVjdG9yRGlmZjsKKyAgaHMtPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3Rvck9yaWcgPSBndWlkZVZlY3Rvck9yaWc7CisgIGhzLT5kZXRlY3Rpb25WZWN0b3JzWzBdID0gZGV0ZWN0aW9uVmVjdG9yczsKKyAgaHMtPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRldGVjdGVkID0gZ3VpZGVWZWN0b3JEZXRlY3RlZDsKKworICBGREtzYnJFbmNfRGVsZXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKGhzKTsKKyAgcmV0dXJuIC0xOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKQEAgLTEyNDYsNTQgKzExNjcsNDMgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX0luaXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhTYnJNSERldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZUZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcW1mTm9DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRvdE5vRXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbW92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vRXN0UGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitJTlQgRkRLc2JyRW5jX0luaXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCisgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTUhEZXQsIElOVCBzYW1wbGVGcmVxLAorICAgIElOVCBmcmFtZVNpemUsIElOVCBuU2ZiLCBJTlQgcW1mTm9DaGFubmVscywgSU5UIHRvdE5vRXN0LCBJTlQgbW92ZSwKKyAgICBJTlQgbm9Fc3RQZXJGcmFtZSwgVUlOVCBzYnJTeW50YXhGbGFncykgewogICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhzID0gaFNick1IRGV0OwogICBpbnQgaTsKIAogICBGREtfQVNTRVJUKHRvdE5vRXN0IDw9IE1BWF9OT19PRl9FU1RJTUFURVMpOwogCi0gIGlmIChzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKQotICB7Ci0gICAgc3dpdGNoKGZyYW1lU2l6ZSl7Ci0gICAgY2FzZSAxMDI0OgotICAgIGNhc2UgNTEyOgorICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgeworICAgIHN3aXRjaCAoZnJhbWVTaXplKSB7CisgICAgICBjYXNlIDEwMjQ6CisgICAgICBjYXNlIDUxMjoKICAgICAgICAgaHMtPnRyYW5zaWVudFBvc09mZnNldCA9IEZSQU1FX01JRERMRV9TTE9UXzUxMkxEOwotICAgICAgICBocy0+dGltZVNsb3RzICAgICAgICAgID0gMTY7CisgICAgICAgIGhzLT50aW1lU2xvdHMgPSAxNjsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NjA6Ci0gICAgY2FzZSA0ODA6CisgICAgICBjYXNlIDk2MDoKKyAgICAgIGNhc2UgNDgwOgogICAgICAgICBocy0+dHJhbnNpZW50UG9zT2Zmc2V0ID0gRlJBTUVfTUlERExFX1NMT1RfNTEyTEQ7Ci0gICAgICAgIGhzLT50aW1lU2xvdHMgICAgICAgICAgPSAxNTsKKyAgICAgICAgaHMtPnRpbWVTbG90cyA9IDE1OwogICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgorICAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgfSBlbHNlCi0gIHsKLSAgICBzd2l0Y2goZnJhbWVTaXplKXsKLSAgICBjYXNlIDIwNDg6Ci0gICAgY2FzZSAxMDI0OgorICB9IGVsc2UgeworICAgIHN3aXRjaCAoZnJhbWVTaXplKSB7CisgICAgICBjYXNlIDIwNDg6CisgICAgICBjYXNlIDEwMjQ6CiAgICAgICAgIGhzLT50cmFuc2llbnRQb3NPZmZzZXQgPSBGUkFNRV9NSURETEVfU0xPVF8yMDQ4OwotICAgICAgICBocy0+dGltZVNsb3RzICAgICAgICAgID0gTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODsKKyAgICAgICAgaHMtPnRpbWVTbG90cyA9IE5VTUJFUl9USU1FX1NMT1RTXzIwNDg7CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTkyMDoKLSAgICBjYXNlIDk2MDoKKyAgICAgIGNhc2UgMTkyMDoKKyAgICAgIGNhc2UgOTYwOgogICAgICAgICBocy0+dHJhbnNpZW50UG9zT2Zmc2V0ID0gRlJBTUVfTUlERExFX1NMT1RfMTkyMDsKLSAgICAgICAgaHMtPnRpbWVTbG90cyAgICAgICAgICA9IE5VTUJFUl9USU1FX1NMT1RTXzE5MjA7CisgICAgICAgIGhzLT50aW1lU2xvdHMgPSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOwogICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgorICAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgfQpAQCAtMTMwMSw3ICsxMjExLDcgQEAKICAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKICAgICBocy0+bWhQYXJhbXMgPSAmcGFyYW1zQWFjTGQ7CiAgIH0gZWxzZQotICBocy0+bWhQYXJhbXMgPSAmcGFyYW1zQWFjOworICAgIGhzLT5taFBhcmFtcyA9ICZwYXJhbXNBYWM7CiAKICAgaHMtPnFtZk5vQ2hhbm5lbHMgPSBxbWZOb0NoYW5uZWxzOwogICBocy0+c2FtcGxlRnJlcSA9IHNhbXBsZUZyZXE7CkBAIC0xMzExLDIyICsxMjIxLDI1IEBACiAgIGhzLT5tb3ZlID0gbW92ZTsKICAgaHMtPm5vRXN0UGVyRnJhbWUgPSBub0VzdFBlckZyYW1lOwogCi0gIGZvcihpPTA7IGk8dG90Tm9Fc3Q7IGkrKykgewotICAgIEZES21lbWNsZWFyIChocy0+Z3VpZGVWZWN0b3JzW2ldLmd1aWRlVmVjdG9yRGlmZixzaXplb2YoRklYUF9EQkwpKk1BWF9GUkVRX0NPRUZGUyk7Ci0gICAgRkRLbWVtY2xlYXIgKGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JPcmlnLHNpemVvZihGSVhQX0RCTCkqTUFYX0ZSRVFfQ09FRkZTKTsKLSAgICBGREttZW1jbGVhciAoaHMtPmRldGVjdGlvblZlY3RvcnNbaV0sc2l6ZW9mKFVDSEFSKSpNQVhfRlJFUV9DT0VGRlMpOwotICAgIEZES21lbWNsZWFyIChocy0+Z3VpZGVWZWN0b3JzW2ldLmd1aWRlVmVjdG9yRGV0ZWN0ZWQsc2l6ZW9mKFVDSEFSKSpNQVhfRlJFUV9DT0VGRlMpOworICBmb3IgKGkgPSAwOyBpIDwgdG90Tm9Fc3Q7IGkrKykgeworICAgIEZES21lbWNsZWFyKGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JEaWZmLAorICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBNQVhfRlJFUV9DT0VGRlMpOworICAgIEZES21lbWNsZWFyKGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JPcmlnLAorICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBNQVhfRlJFUV9DT0VGRlMpOworICAgIEZES21lbWNsZWFyKGhzLT5kZXRlY3Rpb25WZWN0b3JzW2ldLCBzaXplb2YoVUNIQVIpICogTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBGREttZW1jbGVhcihocy0+Z3VpZGVWZWN0b3JzW2ldLmd1aWRlVmVjdG9yRGV0ZWN0ZWQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKFVDSEFSKSAqIE1BWF9GUkVRX0NPRUZGUyk7CiAgIH0KIAotICAvL2ZvcihpPTA7IGk8dG90Tm9Fc3QvMjsgaSsrKSB7Ci0gIGZvcihpPTA7IGk8TUFYX05PX09GX0VTVElNQVRFUy8yOyBpKyspIHsKLSAgICBGREttZW1jbGVhciAoaHMtPnRvbmFsaXR5RGlmZltpXSxzaXplb2YoRklYUF9EQkwpKk1BWF9GUkVRX0NPRUZGUyk7Ci0gICAgRkRLbWVtY2xlYXIgKGhzLT5zZm1PcmlnW2ldLHNpemVvZihGSVhQX0RCTCkqTUFYX0ZSRVFfQ09FRkZTKTsKLSAgICBGREttZW1jbGVhciAoaHMtPnNmbVNicltpXSxzaXplb2YoRklYUF9EQkwpKk1BWF9GUkVRX0NPRUZGUyk7CisgIC8vIGZvcihpPTA7IGk8dG90Tm9Fc3QvMjsgaSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTk9fT0ZfRVNUSU1BVEVTIC8gMjsgaSsrKSB7CisgICAgRkRLbWVtY2xlYXIoaHMtPnRvbmFsaXR5RGlmZltpXSwgc2l6ZW9mKEZJWFBfREJMKSAqIE1BWF9GUkVRX0NPRUZGUyk7CisgICAgRkRLbWVtY2xlYXIoaHMtPnNmbU9yaWdbaV0sIHNpemVvZihGSVhQX0RCTCkgKiBNQVhfRlJFUV9DT0VGRlMpOworICAgIEZES21lbWNsZWFyKGhzLT5zZm1TYnJbaV0sIHNpemVvZihGSVhQX0RCTCkgKiBNQVhfRlJFUV9DT0VGRlMpOwogICB9CiAKLSAgRkRLbWVtY2xlYXIgKCBocy0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uLCBzaXplb2YoVUNIQVIpKk1BWF9GUkVRX0NPRUZGUyk7Ci0gIEZES21lbWNsZWFyICggaHMtPmd1aWRlU2NmYiwgc2l6ZW9mKFVDSEFSKSpNQVhfRlJFUV9DT0VGRlMpOworICBGREttZW1jbGVhcihocy0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uLCBzaXplb2YoVUNIQVIpICogTUFYX0ZSRVFfQ09FRkZTKTsKKyAgRkRLbWVtY2xlYXIoaHMtPmd1aWRlU2NmYiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9GUkVRX0NPRUZGUyk7CiAKICAgaHMtPnByZXZpb3VzVHJhbnNpZW50RmxhZyA9IDA7CiAgIGhzLT5wcmV2aW91c1RyYW5zaWVudEZyYW1lID0gMDsKQEAgLTEzNDQsOSArMTI1Nyw4IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1GREtzYnJFbmNfRGVsZXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaFNick1IRGV0KQotewordm9pZCBGREtzYnJFbmNfRGVsZXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKAorICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaFNick1IRGV0KSB7CiAgIGlmIChoU2JyTUhEZXQpIHsKICAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhzID0gaFNick1IRGV0OwogCkBAIC0xMzU2LDcgKzEyNjgsNiBAQAogICAgIEZyZWVSYW1fU2JyX2d1aWRlVmVjdG9yT3JpZygmaHMtPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3Rvck9yaWcpOwogICAgIEZyZWVSYW1fU2JyX3ByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbigmaHMtPnByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbik7CiAgICAgRnJlZVJhbV9TYnJfZ3VpZGVTY2ZiKCZocy0+Z3VpZGVTY2ZiKTsKLQogICB9CiB9CiAKQEAgLTEzNjksMTAgKzEyODAsOSBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfUmVzZXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYikKLXsKK0lOVCBGREtzYnJFbmNfUmVzZXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCisgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLAorICAgIElOVCBuU2ZiKSB7CiAgIGludCBpOwogICBGSVhQX0RCTCB0ZW1wR3VpZGVbTUFYX0ZSRVFfQ09FRkZTXTsKICAgVUNIQVIgdGVtcEd1aWRlSW50W01BWF9GUkVRX0NPRUZGU107CkBAIC0xMzgxLDkxICsxMjkxLDEwNiBAQAogICBuU2ZiUHJldiA9IGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPm5TZmI7CiAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPm5TZmIgPSBuU2ZiOwogCi0gIEZES21lbWNweSggdGVtcEd1aWRlSW50LCBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVNjZmIsIG5TZmJQcmV2ICogc2l6ZW9mKFVDSEFSKSApOworICBGREttZW1jcHkodGVtcEd1aWRlSW50LCBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVNjZmIsCisgICAgICAgICAgICBuU2ZiUHJldiAqIHNpemVvZihVQ0hBUikpOwogCi0gIGlmICggblNmYiA+IG5TZmJQcmV2ICkgewotICAgIGZvciAoIGkgPSAwOyBpIDwgKG5TZmIgLSBuU2ZiUHJldik7IGkrKyApIHsKKyAgaWYgKG5TZmIgPiBuU2ZiUHJldikgeworICAgIGZvciAoaSA9IDA7IGkgPCAoblNmYiAtIG5TZmJQcmV2KTsgaSsrKSB7CiAgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVNjZmJbaV0gPSAwOwogICAgIH0KIAotICAgIGZvciAoIGkgPSAwOyBpIDwgblNmYlByZXY7IGkrKyApIHsKLSAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlU2NmYltpICsgKG5TZmIgLSBuU2ZiUHJldildID0gdGVtcEd1aWRlSW50W2ldOworICAgIGZvciAoaSA9IDA7IGkgPCBuU2ZiUHJldjsgaSsrKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVNjZmJbaSArIChuU2ZiIC0gblNmYlByZXYpXSA9CisgICAgICAgICAgdGVtcEd1aWRlSW50W2ldOwogICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBmb3IgKCBpID0gMDsgaSA8IG5TZmI7IGkrKyApIHsKLSAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlU2NmYltpXSA9IHRlbXBHdWlkZUludFtpICsgKG5TZmJQcmV2LW5TZmIpXTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVNjZmJbaV0gPQorICAgICAgICAgIHRlbXBHdWlkZUludFtpICsgKG5TZmJQcmV2IC0gblNmYildOwogICAgIH0KICAgfQogCi0gIEZES21lbWNweSAoIHRlbXBHdWlkZSwgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGlmZiwgblNmYlByZXYgKiBzaXplb2YoRklYUF9EQkwpICk7CisgIEZES21lbWNweSh0ZW1wR3VpZGUsCisgICAgICAgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmLAorICAgICAgICAgICAgblNmYlByZXYgKiBzaXplb2YoRklYUF9EQkwpKTsKIAotICBpZiAoblNmYiA+IG5TZmJQcmV2ICkgewotICAgIGZvciAoIGkgPSAwOyBpIDwgKG5TZmIgLSBuU2ZiUHJldik7IGkrKyApIHsKLSAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRpZmZbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgaWYgKG5TZmIgPiBuU2ZiUHJldikgeworICAgIGZvciAoaSA9IDA7IGkgPCAoblNmYiAtIG5TZmJQcmV2KTsgaSsrKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmW2ldID0KKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICB9CiAKLSAgICBmb3IgKCBpID0gMDsgaSA8IG5TZmJQcmV2OyBpKysgKSB7Ci0gICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmW2kgKyAoblNmYiAtIG5TZmJQcmV2KV0gPSB0ZW1wR3VpZGVbaV07CisgICAgZm9yIChpID0gMDsgaSA8IG5TZmJQcmV2OyBpKyspIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXQorICAgICAgICAgIC5ndWlkZVZlY3RvckRpZmZbaSArIChuU2ZiIC0gblNmYlByZXYpXSA9IHRlbXBHdWlkZVtpXTsKICAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBuU2ZiOyBpKysgICkgewotICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGlmZltpXSA9IHRlbXBHdWlkZVtpICsgKG5TZmJQcmV2LW5TZmIpXTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmW2ldID0KKyAgICAgICAgICB0ZW1wR3VpZGVbaSArIChuU2ZiUHJldiAtIG5TZmIpXTsKICAgICB9CiAgIH0KIAotICBGREttZW1jcHkgKCB0ZW1wR3VpZGUsIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3Rvck9yaWcsIG5TZmJQcmV2ICogc2l6ZW9mKEZJWFBfREJMKSApOworICBGREttZW1jcHkodGVtcEd1aWRlLAorICAgICAgICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZywKKyAgICAgICAgICAgIG5TZmJQcmV2ICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgaWYgKCBuU2ZiID4gblNmYlByZXYgKSB7Ci0gICAgZm9yICggaSA9IDA7IGk8IChuU2ZiIC0gblNmYlByZXYpOyBpKysgKSB7Ci0gICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JPcmlnW2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIGlmIChuU2ZiID4gblNmYlByZXYpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKG5TZmIgLSBuU2ZiUHJldik7IGkrKykgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZ1tpXSA9CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgfQogCi0gICAgZm9yICggaSA9IDA7IGkgPCBuU2ZiUHJldjsgaSsrICkgewotICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZ1tpICsgKG5TZmIgLSBuU2ZiUHJldildID0gdGVtcEd1aWRlW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCBuU2ZiUHJldjsgaSsrKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0KKyAgICAgICAgICAuZ3VpZGVWZWN0b3JPcmlnW2kgKyAoblNmYiAtIG5TZmJQcmV2KV0gPSB0ZW1wR3VpZGVbaV07CiAgICAgfQotICB9Ci0gIGVsc2UgewotICAgIGZvciAoIGkgPSAwOyBpIDwgblNmYjsgaSsrICkgewotICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZ1tpXSA9IHRlbXBHdWlkZVtpICsgKG5TZmJQcmV2LW5TZmIpXTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JPcmlnW2ldID0KKyAgICAgICAgICB0ZW1wR3VpZGVbaSArIChuU2ZiUHJldiAtIG5TZmIpXTsKICAgICB9CiAgIH0KIAotICBGREttZW1jcHkgKCB0ZW1wR3VpZGVJbnQsIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRldGVjdGVkLCBuU2ZiUHJldiAqIHNpemVvZihVQ0hBUikgKTsKKyAgRkRLbWVtY3B5KHRlbXBHdWlkZUludCwKKyAgICAgICAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRldGVjdGVkLAorICAgICAgICAgICAgblNmYlByZXYgKiBzaXplb2YoVUNIQVIpKTsKIAotICBpZiAoIG5TZmIgPiBuU2ZiUHJldiApIHsKLSAgICBmb3IgKCBpID0gMDsgaSA8IChuU2ZiIC0gblNmYlByZXYpOyBpKysgKSB7CisgIGlmIChuU2ZiID4gblNmYlByZXYpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKG5TZmIgLSBuU2ZiUHJldik7IGkrKykgewogICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGV0ZWN0ZWRbaV0gPSAwOwogICAgIH0KIAotICAgIGZvciAoIGkgPSAwOyBpIDwgblNmYlByZXY7IGkrKyApIHsKLSAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRldGVjdGVkW2kgKyAoblNmYiAtIG5TZmJQcmV2KV0gPSB0ZW1wR3VpZGVJbnRbaV07CisgICAgZm9yIChpID0gMDsgaSA8IG5TZmJQcmV2OyBpKyspIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXQorICAgICAgICAgIC5ndWlkZVZlY3RvckRldGVjdGVkW2kgKyAoblNmYiAtIG5TZmJQcmV2KV0gPSB0ZW1wR3VpZGVJbnRbaV07CiAgICAgfQotICB9Ci0gIGVsc2UgewotICAgIGZvciAoIGkgPSAwOyBpIDwgblNmYjsgaSsrICkgewotICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGV0ZWN0ZWRbaV0gPSB0ZW1wR3VpZGVJbnRbaSArIChuU2ZiUHJldi1uU2ZiKV07CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IG5TZmI7IGkrKykgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGV0ZWN0ZWRbaV0gPQorICAgICAgICAgIHRlbXBHdWlkZUludFtpICsgKG5TZmJQcmV2IC0gblNmYildOwogICAgIH0KICAgfQogCi0gIEZES21lbWNweSAoIHRlbXBHdWlkZUludCwgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uLCBuU2ZiUHJldiAqIHNpemVvZihVQ0hBUikgKTsKKyAgRkRLbWVtY3B5KHRlbXBHdWlkZUludCwKKyAgICAgICAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbiwKKyAgICAgICAgICAgIG5TZmJQcmV2ICogc2l6ZW9mKFVDSEFSKSk7CiAKLSAgaWYgKCBuU2ZiID4gblNmYlByZXYgKSB7Ci0gICAgZm9yICggaSA9IDA7IGkgPCAoblNmYiAtIG5TZmJQcmV2KTsgaSsrICkgeworICBpZiAoblNmYiA+IG5TZmJQcmV2KSB7CisgICAgZm9yIChpID0gMDsgaSA8IChuU2ZiIC0gblNmYlByZXYpOyBpKyspIHsKICAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbltpXSA9IDA7CiAgICAgfQogCi0gICAgZm9yICggaSA9IDA7IGkgPCBuU2ZiUHJldjsgaSsrICkgewotICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uW2kgKyAoblNmYiAtIG5TZmJQcmV2KV0gPSB0ZW1wR3VpZGVJbnRbaV07CisgICAgZm9yIChpID0gMDsgaSA8IG5TZmJQcmV2OyBpKyspIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IKKyAgICAgICAgICAtPnByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbltpICsgKG5TZmIgLSBuU2ZiUHJldildID0gdGVtcEd1aWRlSW50W2ldOwogICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBmb3IgKCBpID0gMDsgaSA8IG5TZmI7IGkrKyApIHsKLSAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbltpXSA9IHRlbXBHdWlkZUludFtpICsgKG5TZmJQcmV2LW5TZmIpXTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5wcmV2RW52ZWxvcGVDb21wZW5zYXRpb25baV0gPQorICAgICAgICAgIHRlbXBHdWlkZUludFtpICsgKG5TZmJQcmV2IC0gblNmYildOwogICAgIH0KICAgfQogCiAgIHJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL21oX2RldC5oIGIvbGliU0JSZW5jL3NyYy9taF9kZXQuaAppbmRleCA3NGMyYTk5Li44OWQ4MWI1IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL21oX2RldC5oCisrKyBiL2xpYlNCUmVuYy9zcmMvbWhfZGV0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNTMgKzkwLDY3IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgbWlzc2luZyBoYXJtb25pY3MgZGV0ZWN0aW9uIGhlYWRlciBmaWxlICAKKyAgXGJyaWVmICBtaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rpb24gaGVhZGVyIGZpbGUgJFJldmlzaW9uOiA5Mjc5MCAkCiAqLwogCi0jaWZuZGVmIF9fTUhfREVURUNUX0gKLSNkZWZpbmUgX19NSF9ERVRFQ1RfSAorI2lmbmRlZiBNSF9ERVRfSAorI2RlZmluZSBNSF9ERVRfSAogCiAjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKICNpbmNsdWRlICJmcmFtX2dlbi5oIgogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBGSVhQX0RCTCB0aHJlc0hvbGREaWZmOyAgICAgIC8qITwgdGhyZXNob2xkIGZvciB0b25hbGl0eSBkaWZmZXJlbmNlICovCi0gIEZJWFBfREJMIHRocmVzSG9sZERpZmZHdWlkZTsgLyohPCB0aHJlc2hvbGQgZm9yIHRvbmFsaXR5IGRpZmZlcmVuY2UgZm9yIHRoZSBndWlkZSAqLworICBGSVhQX0RCTCB0aHJlc0hvbGREaWZmR3VpZGU7IC8qITwgdGhyZXNob2xkIGZvciB0b25hbGl0eSBkaWZmZXJlbmNlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSAqLwogICBGSVhQX0RCTCB0aHJlc0hvbGRUb25lOyAgICAgIC8qITwgdGhyZXNob2xkIGZvciB0b25hbGl0eSBmb3IgYSBzaW5lICovCiAgIEZJWFBfREJMIGludlRocmVzSG9sZFRvbmU7Ci0gIEZJWFBfREJMIHRocmVzSG9sZFRvbmVHdWlkZTsgLyohPCB0aHJlc2hvbGQgZm9yIHRvbmFsaXR5IGZvciBhIHNpbmUgZm9yIHRoZSBndWlkZSAqLwotICBGSVhQX0RCTCBzZm1UaHJlc1NicjsgICAgICAgIC8qITwgdG9uYWxpdHkgZmxhdG5lc3MgbWVhc3VyZSB0aHJlc2hvbGQgZm9yIHRoZSBTQlIgc2lnbmFsLiovCi0gIEZJWFBfREJMIHNmbVRocmVzT3JpZzsgICAgICAgLyohPCB0b25hbGl0eSBmbGF0bmVzcyBtZWFzdXJlIHRocmVzaG9sZCBmb3IgdGhlIG9yaWdpbmFsIHNpZ25hbC4qLwotICBGSVhQX0RCTCBkZWNheUd1aWRlT3JpZzsgICAgIC8qITwgZGVjYXkgdmFsdWUgb2YgdGhlIHRvbmFsaXR5IHZhbHVlIG9mIHRoZSBndWlkZSBmb3IgdGhlIHRvbmUuICovCi0gIEZJWFBfREJMIGRlY2F5R3VpZGVEaWZmOyAgICAgLyohPCBkZWNheSB2YWx1ZSBvZiB0aGUgdG9uYWxpdHkgdmFsdWUgb2YgdGhlIGd1aWRlIGZvciB0aGUgdG9uYWxpdHkgZGlmZmVyZW5jZS4gKi8KLSAgRklYUF9EQkwgZGVyaXZUaHJlc01heExENjQ7ICAgICAgLyohPCB0aHJlc2hvbGQgZm9yIGRldGVjdGluZyBMUCBjaGFyYWN0ZXIgaW4gYSBzaWduYWwuICovCi0gIEZJWFBfREJMIGRlcml2VGhyZXNCZWxvd0xENjQ7ICAgIC8qITwgdGhyZXNob2xkIGZvciBkZXRlY3RpbmcgTFAgY2hhcmFjdGVyIGluIGEgc2lnbmFsLiAqLwotICBGSVhQX0RCTCBkZXJpdlRocmVzQWJvdmVMRDY0OyAgICAvKiE8IHRocmVzaG9sZCBmb3IgZGV0ZWN0aW5nIExQIGNoYXJhY3RlciBpbiBhIHNpZ25hbC4gKi8KLX1USFJFU19IT0xEUzsKKyAgRklYUF9EQkwgdGhyZXNIb2xkVG9uZUd1aWRlOyAvKiE8IHRocmVzaG9sZCBmb3IgdG9uYWxpdHkgZm9yIGEgc2luZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgKi8KKyAgRklYUF9EQkwgc2ZtVGhyZXNTYnI7ICAgIC8qITwgdG9uYWxpdHkgZmxhdG5lc3MgbWVhc3VyZSB0aHJlc2hvbGQgZm9yIHRoZSBTQlIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbC4qLworICBGSVhQX0RCTCBzZm1UaHJlc09yaWc7ICAgLyohPCB0b25hbGl0eSBmbGF0bmVzcyBtZWFzdXJlIHRocmVzaG9sZCBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbCBzaWduYWwuKi8KKyAgRklYUF9EQkwgZGVjYXlHdWlkZU9yaWc7IC8qITwgZGVjYXkgdmFsdWUgb2YgdGhlIHRvbmFsaXR5IHZhbHVlIG9mIHRoZSBndWlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSB0b25lLiAqLworICBGSVhQX0RCTCBkZWNheUd1aWRlRGlmZjsgLyohPCBkZWNheSB2YWx1ZSBvZiB0aGUgdG9uYWxpdHkgdmFsdWUgb2YgdGhlIGd1aWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHRvbmFsaXR5IGRpZmZlcmVuY2UuICovCisgIEZJWFBfREJMIGRlcml2VGhyZXNNYXhMRDY0OyAgIC8qITwgdGhyZXNob2xkIGZvciBkZXRlY3RpbmcgTFAgY2hhcmFjdGVyIGluIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsLiAqLworICBGSVhQX0RCTCBkZXJpdlRocmVzQmVsb3dMRDY0OyAvKiE8IHRocmVzaG9sZCBmb3IgZGV0ZWN0aW5nIExQIGNoYXJhY3RlciBpbiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbC4gKi8KKyAgRklYUF9EQkwgZGVyaXZUaHJlc0Fib3ZlTEQ2NDsgLyohPCB0aHJlc2hvbGQgZm9yIGRldGVjdGluZyBMUCBjaGFyYWN0ZXIgaW4gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwuICovCit9IFRIUkVTX0hPTERTOwogCi10eXBlZGVmIHN0cnVjdAotewotICBJTlQgZGVsdGFUaW1lOyAgICAgICAgICAgIC8qITwgbWF4aW11bSBhbGxvd2VkIHRyYW5zaWVudCBkaXN0YW5jZSAoZnJvbSBmcmFtZSBib3JkZXIgaW4gbnVtYmVyIG9mIHFtZiBzdWJiYW5kIHNhbXBsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIGZyYW1lIHRvIGJlIGNvbnNpZGVyZWQgYSB0cmFuc2llbnQgZnJhbWUuKi8KLSAgVEhSRVNfSE9MRFMgdGhyZXNIb2xkczsgICAvKiE8IHRoZSB0aHJlc2hvbGRzIHVzZWQgZm9yIGRldGVjdGlvbi4gKi8KLSAgSU5UIG1heENvbXA7ICAgICAgICAgICAgICAvKiE8IG1heGltdW0gYWxsbG93ZWQgY29tcGVuc2F0aW9uIGZhY3RvciBmb3IgdGhlIGVudmVsb3BlIGRhdGEuICovCi19REVURUNUT1JfUEFSQU1FVEVSU19NSDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIGRlbHRhVGltZTsgLyohPCBtYXhpbXVtIGFsbG93ZWQgdHJhbnNpZW50IGRpc3RhbmNlIChmcm9tIGZyYW1lIGJvcmRlciBpbgorICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgcW1mIHN1YmJhbmQgc2FtcGxlKSBmb3IgYSBmcmFtZSB0byBiZSBjb25zaWRlcmVkIGEKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50IGZyYW1lLiovCisgIFRIUkVTX0hPTERTIHRocmVzSG9sZHM7IC8qITwgdGhlIHRocmVzaG9sZHMgdXNlZCBmb3IgZGV0ZWN0aW9uLiAqLworICBJTlQgbWF4Q29tcDsgLyohPCBtYXhpbXVtIGFsbGxvd2VkIGNvbXBlbnNhdGlvbiBmYWN0b3IgZm9yIHRoZSBlbnZlbG9wZSBkYXRhLgorICAgICAgICAgICAgICAgICovCit9IERFVEVDVE9SX1BBUkFNRVRFUlNfTUg7CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIEZJWFBfREJMICpndWlkZVZlY3RvckRpZmY7CiAgIEZJWFBfREJMICpndWlkZVZlY3Rvck9yaWc7Ci0gIFVDSEFSKiBndWlkZVZlY3RvckRldGVjdGVkOwotfUdVSURFX1ZFQ1RPUlM7CisgIFVDSEFSICpndWlkZVZlY3RvckRldGVjdGVkOworfSBHVUlERV9WRUNUT1JTOwogCi0KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIElOVCBxbWZOb0NoYW5uZWxzOwogICBJTlQgblNmYjsKICAgSU5UIHNhbXBsZUZyZXE7CkBAIC0xNDQsNTMgKzE2OSwzNiBAQAogICBVQ0hBUiAqZ3VpZGVTY2ZiOwogICBVQ0hBUiAqcHJldkVudmVsb3BlQ29tcGVuc2F0aW9uOwogICBVQ0hBUiAqZGV0ZWN0aW9uVmVjdG9yc1tNQVhfTk9fT0ZfRVNUSU1BVEVTXTsKLSAgRklYUF9EQkwgdG9uYWxpdHlEaWZmW01BWF9OT19PRl9FU1RJTUFURVMvMl1bTUFYX0ZSRVFfQ09FRkZTXTsKLSAgRklYUF9EQkwgc2ZtT3JpZ1tNQVhfTk9fT0ZfRVNUSU1BVEVTLzJdW01BWF9GUkVRX0NPRUZGU107Ci0gIEZJWFBfREJMIHNmbVNicltNQVhfTk9fT0ZfRVNUSU1BVEVTLzJdW01BWF9GUkVRX0NPRUZGU107CisgIEZJWFBfREJMIHRvbmFsaXR5RGlmZltNQVhfTk9fT0ZfRVNUSU1BVEVTIC8gMl1bTUFYX0ZSRVFfQ09FRkZTXTsKKyAgRklYUF9EQkwgc2ZtT3JpZ1tNQVhfTk9fT0ZfRVNUSU1BVEVTIC8gMl1bTUFYX0ZSRVFfQ09FRkZTXTsKKyAgRklYUF9EQkwgc2ZtU2JyW01BWF9OT19PRl9FU1RJTUFURVMgLyAyXVtNQVhfRlJFUV9DT0VGRlNdOwogICBjb25zdCBERVRFQ1RPUl9QQVJBTUVURVJTX01IICptaFBhcmFtczsKICAgR1VJREVfVkVDVE9SUyBndWlkZVZlY3RvcnNbTUFYX05PX09GX0VTVElNQVRFU107Ci19Ci1TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1I7Cit9IFNCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUjsKIAogdHlwZWRlZiBTQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgKkhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1I7CiAKLXZvaWQKLUZES3NickVuY19TYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3JRbWYoSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKiBwUXVvdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICoqIHBTaWduQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICppbmRleFZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqcEZyYW1lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiogcFRyYW5JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogcEFkZEhhcm1vbmljc0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIHBBZGRIYXJtb25pY3NTY2FsZUZhY3RvckJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSKiBmcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICogZW52ZWxvcGVDb21wZW5zYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBOcmdWZWN0b3IpOwordm9pZCBGREtzYnJFbmNfU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yUW1mKAorICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsCisgICAgRklYUF9EQkwgKipwUXVvdGFCdWZmZXIsIElOVCAqKnBTaWduQnVmZmVyLCBTQ0hBUiAqaW5kZXhWZWN0b3IsCisgICAgY29uc3QgU0JSX0ZSQU1FX0lORk8gKnBGcmFtZUluZm8sIGNvbnN0IFVDSEFSICpwVHJhbkluZm8sCisgICAgSU5UICpwQWRkSGFybW9uaWNzRmxhZywgVUNIQVIgKnBBZGRIYXJtb25pY3NTY2FsZUZhY3RvckJhbmRzLAorICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLCBJTlQgblNmYiwgVUNIQVIgKmVudmVsb3BlQ29tcGVuc2F0aW9uLAorICAgIEZJWFBfREJMICpwTnJnVmVjdG9yKTsKIAotSU5UCi1GREtzYnJFbmNfQ3JlYXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTUhEZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFuKTsKK0lOVCBGREtzYnJFbmNfQ3JlYXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKAorICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaFNick1IRGV0LCBJTlQgY2hhbik7CiAKLUlOVAotRkRLc2JyRW5jX0luaXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlRnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJhbWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBxbWZOb0NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0b3ROb0VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbW92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9Fc3RQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNiclN5bnRheEZsYWdzKTsKK0lOVCBGREtzYnJFbmNfSW5pdFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcigKKyAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLAorICAgIElOVCBzYW1wbGVGcmVxLCBJTlQgZnJhbWVTaXplLCBJTlQgblNmYiwgSU5UIHFtZk5vQ2hhbm5lbHMsIElOVCB0b3ROb0VzdCwKKyAgICBJTlQgbW92ZSwgSU5UIG5vRXN0UGVyRnJhbWUsIFVJTlQgc2JyU3ludGF4RmxhZ3MpOwogCi12b2lkCi1GREtzYnJFbmNfRGVsZXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yIChIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKTsKK3ZvaWQgRkRLc2JyRW5jX0RlbGV0ZVNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcigKKyAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKTsKIAotCi1JTlQKLUZES3NickVuY19SZXNldFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciAoSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYik7CitJTlQgRkRLc2JyRW5jX1Jlc2V0U2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKAorICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwKKyAgICBJTlQgblNmYik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9uZl9lc3QuY3BwIGIvbGliU0JSZW5jL3NyYy9uZl9lc3QuY3BwCmluZGV4IGE0YzU1NzQuLjI5MGVjMzUgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvbmZfZXN0LmNwcAorKysgYi9saWJTQlJlbmMvc3JjL25mX2VzdC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNyArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAibmZfZXN0LmgiCiAKQEAgLTg4LDIzICsxMDcsMjIgQEAKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCiAvKiBzbW9vdGhGaWx0ZXJbNF0gID0gezAuMDU4NTc4NjQzNzYyNjlmLCAwLjJmLCAwLjM0MTQyMTM1NjIzNzMxZiwgMC40Zn07ICovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgc21vb3RoRmlsdGVyWzRdICA9IHsgMHgwNzdmODEzZCwgMHgxOTk5OTk5NSwgMHgyYmIzYjFmNSwgMHgzMzMzMzMzNSB9Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHNtb290aEZpbHRlcls0XSA9IHsweDA3N2Y4MTNkLCAweDE5OTk5OTk1LCAweDJiYjNiMWY1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMzMzMzMzM1fTsKIAogLyogc3RhdGljIGNvbnN0IElOVCBzbW9vdGhGaWx0ZXJMZW5ndGggPSA0OyAqLwogCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgUXVhbnRPZmZzZXQgPSAoSU5UKTB4ZmMwMDAwMDA7ICAvKiBsZDY0KDAuMjUpICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgUXVhbnRPZmZzZXQgPSAoSU5UKTB4ZmMwMDAwMDA7IC8qIGxkNjQoMC4yNSkgKi8KIAogI2lmbmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKCBhIDwgYiA/IGE6YikKKyNkZWZpbmUgbWluKGEsIGIpIChhIDwgYiA/IGEgOiBiKQogI2VuZGlmCiAKICNpZm5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICggYSA+IGIgPyBhOmIpCisjZGVmaW5lIG1heChhLCBiKSAoYSA+IGIgPyBhIDogYikKICNlbmRpZgogCi0jZGVmaW5lIE5PSVNFX0ZMT09SX09GRlNFVF9TQ0FMSU5HICAoNCkKLQotCisjZGVmaW5lIE5PSVNFX0ZMT09SX09GRlNFVF9TQ0FMSU5HICg0KQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKQEAgLTExNiwzOCArMTM0LDQ1IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotc21vb3RoaW5nT2ZOb2lzZUxldmVscyhGSVhQX0RCTCAqTm9pc2VMZXZlbHMsICAgICAgICAvKiE8IHBvaW50ZXIgdG8gbm9pc2UtZmxvb3IgbGV2ZWxzLiovCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCBuRW52ZWxvcGVzLCAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGZsb29yIGVudmVsb3Blcy4qLwotICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9Ob2lzZUJhbmRzLCAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyBmb3IgZXZlcnkgbm9pc2UgZmxvb3IgZW52ZWxvcGUuICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHByZXZOb2lzZUxldmVsc1tORl9TTU9PVEhJTkdfTEVOR1RIXVtNQVhfTlVNX05PSVNFX1ZBTFVFU10sLyohPCBQcmV2aW91cyBub2lzZSBmbG9vciBlbnZlbG9wZXMuICovCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpzbW9vdGhGaWx0ZXIsIC8qITwgZmlsdGVyIHVzZWQgZm9yIHNtb290aGluZyB0aGUgbm9pc2UgZmxvb3IgbGV2ZWxzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICBJTlQgdHJhbnNpZW50RmxhZykgICAgICAgICAgICAvKiE8IGZsYWcgaW5kaWNhdGluZyBpZiBhIHRyYW5zaWVudCBpcyBwcmVzZW50Ki8KK3N0YXRpYyB2b2lkIHNtb290aGluZ09mTm9pc2VMZXZlbHMoCisgICAgRklYUF9EQkwgKk5vaXNlTGV2ZWxzLCAvKiE8IHBvaW50ZXIgdG8gbm9pc2UtZmxvb3IgbGV2ZWxzLiovCisgICAgSU5UIG5FbnZlbG9wZXMsICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBmbG9vciBlbnZlbG9wZXMuKi8KKyAgICBJTlQgbm9Ob2lzZUJhbmRzLCAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyBmb3IgZXZlcnkgbm9pc2UgZmxvb3IgZW52ZWxvcGUuCisgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgRklYUF9EQkwgcHJldk5vaXNlTGV2ZWxzW05GX1NNT09USElOR19MRU5HVEhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW01BWF9OVU1fTk9JU0VfVkFMVUVTXSwgLyohPCBQcmV2aW91cyBub2lzZSBmbG9vcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3Blcy4gKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqCisgICAgICAgIHBTbW9vdGhGaWx0ZXIsIC8qITwgZmlsdGVyIHVzZWQgZm9yIHNtb290aGluZyB0aGUgbm9pc2UgZmxvb3IgbGV2ZWxzLiAqLworICAgIElOVCB0cmFuc2llbnRGbGFnKSAvKiE8IGZsYWcgaW5kaWNhdGluZyBpZiBhIHRyYW5zaWVudCBpcyBwcmVzZW50Ki8KIAogewotICBJTlQgaSxiYW5kLGVudjsKKyAgSU5UIGksIGJhbmQsIGVudjsKICAgRklYUF9EQkwgYWNjdTsKIAotICBmb3IoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspewotICAgIGlmKHRyYW5zaWVudEZsYWcpewotICAgICAgZm9yIChpID0gMDsgaSA8IE5GX1NNT09USElOR19MRU5HVEg7IGkrKyl7Ci0gICAgICAgIEZES21lbWNweShwcmV2Tm9pc2VMZXZlbHNbaV0sTm9pc2VMZXZlbHMrZW52Km5vTm9pc2VCYW5kcyxub05vaXNlQmFuZHMqc2l6ZW9mKEZJWFBfREJMKSk7CisgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKKyAgICBpZiAodHJhbnNpZW50RmxhZykgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5GX1NNT09USElOR19MRU5HVEg7IGkrKykgeworICAgICAgICBGREttZW1jcHkocHJldk5vaXNlTGV2ZWxzW2ldLCBOb2lzZUxldmVscyArIGVudiAqIG5vTm9pc2VCYW5kcywKKyAgICAgICAgICAgICAgICAgIG5vTm9pc2VCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOwogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGZvciAoaSA9IDE7IGkgPCBORl9TTU9PVEhJTkdfTEVOR1RIOyBpKyspewotICAgICAgICBGREttZW1jcHkocHJldk5vaXNlTGV2ZWxzW2kgLSAxXSxwcmV2Tm9pc2VMZXZlbHNbaV0sbm9Ob2lzZUJhbmRzKnNpemVvZihGSVhQX0RCTCkpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgTkZfU01PT1RISU5HX0xFTkdUSDsgaSsrKSB7CisgICAgICAgIEZES21lbWNweShwcmV2Tm9pc2VMZXZlbHNbaSAtIDFdLCBwcmV2Tm9pc2VMZXZlbHNbaV0sCisgICAgICAgICAgICAgICAgICBub05vaXNlQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKICAgICAgIH0KLSAgICAgIEZES21lbWNweShwcmV2Tm9pc2VMZXZlbHNbTkZfU01PT1RISU5HX0xFTkdUSCAtIDFdLE5vaXNlTGV2ZWxzK2Vudipub05vaXNlQmFuZHMsbm9Ob2lzZUJhbmRzKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY3B5KHByZXZOb2lzZUxldmVsc1tORl9TTU9PVEhJTkdfTEVOR1RIIC0gMV0sCisgICAgICAgICAgICAgICAgTm9pc2VMZXZlbHMgKyBlbnYgKiBub05vaXNlQmFuZHMsCisgICAgICAgICAgICAgICAgbm9Ob2lzZUJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgfQogCi0gICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG5vTm9pc2VCYW5kczsgYmFuZCsrKXsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbm9Ob2lzZUJhbmRzOyBiYW5kKyspIHsKICAgICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBORl9TTU9PVEhJTkdfTEVOR1RIOyBpKyspewotICAgICAgICBhY2N1ICs9IGZNdWx0RGl2MihzbW9vdGhGaWx0ZXJbaV0sIHByZXZOb2lzZUxldmVsc1tpXVtiYW5kXSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTkZfU01PT1RISU5HX0xFTkdUSDsgaSsrKSB7CisgICAgICAgIGFjY3UgKz0gZk11bHREaXYyKHBTbW9vdGhGaWx0ZXJbaV0sIHByZXZOb2lzZUxldmVsc1tpXVtiYW5kXSk7CiAgICAgICB9Ci0gICAgICBGREtfQVNTRVJUKCAoYmFuZCArIGVudipub05vaXNlQmFuZHMpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVMpOwotICAgICAgTm9pc2VMZXZlbHNbYmFuZCsgZW52Km5vTm9pc2VCYW5kc10gPSBhY2N1PDwxOworICAgICAgRkRLX0FTU0VSVCgoYmFuZCArIGVudiAqIG5vTm9pc2VCYW5kcykgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUyk7CisgICAgICBOb2lzZUxldmVsc1tiYW5kICsgZW52ICogbm9Ob2lzZUJhbmRzXSA9IGFjY3UgPDwgMTsKICAgICB9CiAgIH0KIH0KQEAgLTE2Miw5MiArMTg3LDEwMCBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXFtZkJhc2VkTm9pc2VGbG9vckRldGVjdGlvbihGSVhQX0RCTCAqbm9pc2VMZXZlbCwgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byB2ZWN0b3IgdG8gc3RvcmUgdGhlIG5vaXNlIGxldmVscyBpbi4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIHF1b3RhTWF0cml4T3JpZywgICAgICAgLyohPCBNYXRyaXggaG9sZGluZyB0aGUgcXVvdGEgdmFsdWVzIG9mIHRoZSBvcmlnaW5hbC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqaW5kZXhWZWN0b3IsICAgICAgICAgICAgICAgIC8qITwgSW5kZXggdmVjdG9yIHRvIG9idGFpbiB0aGUgcGF0Y2hlZCBkYXRhLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydEluZGV4LCAgICAgICAgICAgICAgICAgICAgLyohPCBTdGFydCBpbmRleC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcEluZGV4LCAgICAgICAgICAgICAgICAgICAgIC8qITwgU3RvcCBpbmRleC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnRDaGFubmVsLCAgICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgY2hhbm5lbCBvZiB0aGUgY3VycmVudCBub2lzZSBmbG9vciBiYW5kLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0b3BDaGFubmVsLCAgICAgICAgICAgICAgICAgICAvKiE8IFN0b3AgY2hhbm5lbCBvZiB0aGUgY3VycmVudCBub2lzZSBmbG9vciBiYW5kLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGFuYV9tYXhfbGV2ZWwsICAgICAgICAgICAgLyohPCBNYXhpbXVtIGxldmVsIG9mIHRoZSBhZGFwdGl2ZSBub2lzZS4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIG5vaXNlRmxvb3JPZmZzZXQsICAgICAgICAgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1pc3NpbmdIYXJtb25pY0ZsYWcsICAgICAgICAgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBpZiBhIHN0cm9uZyB0b25hbCBjb21wb25lbnQgaXMgbWlzc2luZy4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHdlaWdodEZhYywgICAgICAgICAgICAgICAgLyohPCBXZWlnaHRlbmluZyBmYWN0b3IgZm9yIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb3JpZyBhbmQgc2JyLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSBkaWZmVGhyZXMsICAgICAgICAgICAgICAgLyohPCBUaHJlc2hvbGQgdmFsdWUgdG8gY29udHJvbCB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgZGVjaXNpb24uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgaW52ZXJzZUZpbHRlcmluZ0xldmVsKSAgIC8qITwgSW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWwgb2YgdGhlIGN1cnJlbnQgYmFuZC4qLworc3RhdGljIHZvaWQgcW1mQmFzZWROb2lzZUZsb29yRGV0ZWN0aW9uKAorICAgIEZJWFBfREJMICpub2lzZUxldmVsLCAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byB2ZWN0b3IgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSB0aGUgbm9pc2UgbGV2ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uKi8KKyAgICBGSVhQX0RCTCAqKnF1b3RhTWF0cml4T3JpZywgICAgICAvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSBxdW90YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBvZiB0aGUgb3JpZ2luYWwuICovCisgICAgU0NIQVIgKmluZGV4VmVjdG9yLCAgICAgICAgICAgICAgLyohPCBJbmRleCB2ZWN0b3IgdG8gb2J0YWluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoZWQgZGF0YS4gKi8KKyAgICBJTlQgc3RhcnRJbmRleCwgICAgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4LiAqLworICAgIElOVCBzdG9wSW5kZXgsICAgICAgICAgICAgICAgICAgIC8qITwgU3RvcCBpbmRleC4gKi8KKyAgICBJTlQgc3RhcnRDaGFubmVsLCAgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGNoYW5uZWwgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZSBmbG9vciBiYW5kLiovCisgICAgSU5UIHN0b3BDaGFubmVsLCAgICAgICAgICAgICAgICAgLyohPCBTdG9wIGNoYW5uZWwgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZSBmbG9vciBiYW5kLiAqLworICAgIEZJWFBfREJMIGFuYV9tYXhfbGV2ZWwsICAgICAgICAgIC8qITwgTWF4aW11bSBsZXZlbCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGl2ZSBub2lzZS4qLworICAgIEZJWFBfREJMIG5vaXNlRmxvb3JPZmZzZXQsICAgICAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAqLworICAgIElOVCBtaXNzaW5nSGFybW9uaWNGbGFnLCAgICAgICAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmcgdG9uYWwgY29tcG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbWlzc2luZy4qLworICAgIEZJWFBfREJMIHdlaWdodEZhYywgICAgICAgICAgICAgIC8qITwgV2VpZ2h0ZW5pbmcgZmFjdG9yIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlIGJldHdlZW4gb3JpZyBhbmQgc2JyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIElOVkZfTU9ERSBkaWZmVGhyZXMsICAgICAgICAgICAgIC8qITwgVGhyZXNob2xkIHZhbHVlIHRvIGNvbnRyb2wgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZSBmaWx0ZXJpbmcgZGVjaXNpb24uKi8KKyAgICBJTlZGX01PREUgaW52ZXJzZUZpbHRlcmluZ0xldmVsKSAvKiE8IEludmVyc2UgZmlsdGVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLiovCiB7CiAgIElOVCBzY2FsZSwgbCwgazsKLSAgRklYUF9EQkwgbWVhbk9yaWc9RkwyRlhDT05TVF9EQkwoMC4wZiksIG1lYW5TYnI9RkwyRlhDT05TVF9EQkwoMC4wZiksIGRpZmY7Ci0gIEZJWFBfREJMIGludkluZGV4ID0gR2V0SW52SW50KHN0b3BJbmRleC1zdGFydEluZGV4KTsKLSAgRklYUF9EQkwgaW52Q2hhbm5lbCA9IEdldEludkludChzdG9wQ2hhbm5lbC1zdGFydENoYW5uZWwpOworICBGSVhQX0RCTCBtZWFuT3JpZyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpLCBtZWFuU2JyID0gRkwyRlhDT05TVF9EQkwoMC4wZiksCisgICAgICAgICAgIGRpZmY7CisgIEZJWFBfREJMIGludkluZGV4ID0gR2V0SW52SW50KHN0b3BJbmRleCAtIHN0YXJ0SW5kZXgpOworICBGSVhQX0RCTCBpbnZDaGFubmVsID0gR2V0SW52SW50KHN0b3BDaGFubmVsIC0gc3RhcnRDaGFubmVsKTsKICAgRklYUF9EQkwgYWNjdTsKIAotICAgLyoKLSAgIENhbGN1bGF0ZSB0aGUgbWVhbiB2YWx1ZSwgb3ZlciB0aGUgY3VycmVudCB0aW1lIHNlZ21lbnQsIGZvciB0aGUgb3JpZ2luYWwsIHRoZSBIRlIKLSAgIGFuZCB0aGUgZGlmZmVyZW5jZSwgb3ZlciBhbGwgY2hhbm5lbHMgaW4gdGhlIGN1cnJlbnQgZnJlcXVlbmN5IHJhbmdlLgotICAgKi8KKyAgLyoKKyAgQ2FsY3VsYXRlIHRoZSBtZWFuIHZhbHVlLCBvdmVyIHRoZSBjdXJyZW50IHRpbWUgc2VnbWVudCwgZm9yIHRoZSBvcmlnaW5hbCwgdGhlCisgIEhGUiBhbmQgdGhlIGRpZmZlcmVuY2UsIG92ZXIgYWxsIGNoYW5uZWxzIGluIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSByYW5nZS4KKyAgKi8KIAotICBpZihtaXNzaW5nSGFybW9uaWNGbGFnID09IDEpewotICAgIGZvcihsID0gc3RhcnRDaGFubmVsOyBsIDwgc3RvcENoYW5uZWw7bCsrKXsKKyAgaWYgKG1pc3NpbmdIYXJtb25pY0ZsYWcgPT0gMSkgeworICAgIGZvciAobCA9IHN0YXJ0Q2hhbm5lbDsgbCA8IHN0b3BDaGFubmVsOyBsKyspIHsKICAgICAgIC8qIHRvbmFsaXR5T3JpZyAqLwogICAgICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgZm9yKGsgPSBzdGFydEluZGV4IDsgayA8IHN0b3BJbmRleDsgaysrKXsKKyAgICAgIGZvciAoayA9IHN0YXJ0SW5kZXg7IGsgPCBzdG9wSW5kZXg7IGsrKykgewogICAgICAgICBhY2N1ICs9IGZNdWx0RGl2MihxdW90YU1hdHJpeE9yaWdba11bbF0sIGludkluZGV4KTsKICAgICAgIH0KLSAgICAgIG1lYW5PcmlnID0gZml4TWF4KG1lYW5PcmlnLChhY2N1PDwxKSk7CisgICAgICBtZWFuT3JpZyA9IGZpeE1heChtZWFuT3JpZywgKGFjY3UgPDwgMSkpOwogCiAgICAgICAvKiB0b25hbGl0eVNiciAqLwogICAgICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgZm9yKGsgPSBzdGFydEluZGV4IDsgayA8IHN0b3BJbmRleDsgaysrKXsKKyAgICAgIGZvciAoayA9IHN0YXJ0SW5kZXg7IGsgPCBzdG9wSW5kZXg7IGsrKykgewogICAgICAgICBhY2N1ICs9IGZNdWx0RGl2MihxdW90YU1hdHJpeE9yaWdba11baW5kZXhWZWN0b3JbbF1dLCBpbnZJbmRleCk7CiAgICAgICB9Ci0gICAgICBtZWFuU2JyICA9IGZpeE1heChtZWFuU2JyLChhY2N1PDwxKSk7Ci0KKyAgICAgIG1lYW5TYnIgPSBmaXhNYXgobWVhblNiciwgKGFjY3UgPDwgMSkpOwogICAgIH0KLSAgfQotICBlbHNlewotICAgIGZvcihsID0gc3RhcnRDaGFubmVsOyBsIDwgc3RvcENoYW5uZWw7bCsrKXsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGwgPSBzdGFydENoYW5uZWw7IGwgPCBzdG9wQ2hhbm5lbDsgbCsrKSB7CiAgICAgICAvKiB0b25hbGl0eU9yaWcgKi8KICAgICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgIGZvcihrID0gc3RhcnRJbmRleCA7IGsgPCBzdG9wSW5kZXg7IGsrKyl7CisgICAgICBmb3IgKGsgPSBzdGFydEluZGV4OyBrIDwgc3RvcEluZGV4OyBrKyspIHsKICAgICAgICAgYWNjdSArPSBmTXVsdERpdjIocXVvdGFNYXRyaXhPcmlnW2tdW2xdLCBpbnZJbmRleCk7CiAgICAgICB9Ci0gICAgICBtZWFuT3JpZyArPSBmTXVsdCgoYWNjdTw8MSksIGludkNoYW5uZWwpOworICAgICAgbWVhbk9yaWcgKz0gZk11bHQoKGFjY3UgPDwgMSksIGludkNoYW5uZWwpOwogCiAgICAgICAvKiB0b25hbGl0eVNiciAqLwogICAgICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgZm9yKGsgPSBzdGFydEluZGV4IDsgayA8IHN0b3BJbmRleDsgaysrKXsKKyAgICAgIGZvciAoayA9IHN0YXJ0SW5kZXg7IGsgPCBzdG9wSW5kZXg7IGsrKykgewogICAgICAgICBhY2N1ICs9IGZNdWx0RGl2MihxdW90YU1hdHJpeE9yaWdba11baW5kZXhWZWN0b3JbbF1dLCBpbnZJbmRleCk7CiAgICAgICB9Ci0gICAgICBtZWFuU2JyICArPSBmTXVsdCgoYWNjdTw8MSksIGludkNoYW5uZWwpOworICAgICAgbWVhblNiciArPSBmTXVsdCgoYWNjdSA8PCAxKSwgaW52Q2hhbm5lbCk7CiAgICAgfQogICB9CiAKICAgLyogU21hbGwgZml4IHRvIGF2b2lkIG5vaXNlIGR1cmluZyBzaWxlbnQgcGFzc2FnZXMuKi8KLSAgaWYoIG1lYW5PcmlnIDw9IEZMMkZYQ09OU1RfREJMKDAuMDAwOTc2NTYyZipSRUxBWEFUSU9OX0ZMT0FUKSAmJgotICAgICAgbWVhblNiciA8PSBGTDJGWENPTlNUX0RCTCgwLjAwMDk3NjU2MmYqUkVMQVhBVElPTl9GTE9BVCkgKQotICB7Ci0gICAgbWVhbk9yaWcgPSBGTDJGWENPTlNUX0RCTCgxMDEuNTkzNjY3M2YqUkVMQVhBVElPTl9GTE9BVCk7Ci0gICAgbWVhblNiciAgPSBGTDJGWENPTlNUX0RCTCgxMDEuNTkzNjY3M2YqUkVMQVhBVElPTl9GTE9BVCk7CisgIGlmIChtZWFuT3JpZyA8PSBGTDJGWENPTlNUX0RCTCgwLjAwMDk3NjU2MmYgKiBSRUxBWEFUSU9OX0ZMT0FUKSAmJgorICAgICAgbWVhblNiciA8PSBGTDJGWENPTlNUX0RCTCgwLjAwMDk3NjU2MmYgKiBSRUxBWEFUSU9OX0ZMT0FUKSkgeworICAgIG1lYW5PcmlnID0gRkwyRlhDT05TVF9EQkwoMTAxLjU5MzY2NzNmICogUkVMQVhBVElPTl9GTE9BVCk7CisgICAgbWVhblNiciA9IEZMMkZYQ09OU1RfREJMKDEwMS41OTM2NjczZiAqIFJFTEFYQVRJT05fRkxPQVQpOwogICB9CiAKLSAgbWVhbk9yaWcgPSBmaXhNYXgobWVhbk9yaWcsUkVMQVhBVElPTik7Ci0gIG1lYW5TYnIgID0gZml4TWF4KG1lYW5TYnIsUkVMQVhBVElPTik7CisgIG1lYW5PcmlnID0gZml4TWF4KG1lYW5PcmlnLCBSRUxBWEFUSU9OKTsKKyAgbWVhblNiciA9IGZpeE1heChtZWFuU2JyLCBSRUxBWEFUSU9OKTsKIAotICBpZiAobWlzc2luZ0hhcm1vbmljRmxhZyA9PSAxIHx8Ci0gICAgICBpbnZlcnNlRmlsdGVyaW5nTGV2ZWwgPT0gSU5WRl9NSURfTEVWRUwgfHwKKyAgaWYgKG1pc3NpbmdIYXJtb25pY0ZsYWcgPT0gMSB8fCBpbnZlcnNlRmlsdGVyaW5nTGV2ZWwgPT0gSU5WRl9NSURfTEVWRUwgfHwKICAgICAgIGludmVyc2VGaWx0ZXJpbmdMZXZlbCA9PSBJTlZGX0xPV19MRVZFTCB8fAotICAgICAgaW52ZXJzZUZpbHRlcmluZ0xldmVsID09IElOVkZfT0ZGIHx8Ci0gICAgICBpbnZlcnNlRmlsdGVyaW5nTGV2ZWwgPD0gZGlmZlRocmVzKQotICB7CisgICAgICBpbnZlcnNlRmlsdGVyaW5nTGV2ZWwgPT0gSU5WRl9PRkYgfHwgaW52ZXJzZUZpbHRlcmluZ0xldmVsIDw9IGRpZmZUaHJlcykgewogICAgIGRpZmYgPSBSRUxBWEFUSU9OOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGFjY3UgPSBmRGl2Tm9ybShtZWFuU2JyLCBtZWFuT3JpZywgJnNjYWxlKTsKIAotICAgIGRpZmYgPSBmaXhNYXgoIFJFTEFYQVRJT04sCi0gICAgICAgICAgICAgICAgICAgZk11bHQoUkVMQVhBVElPTl9GUkFDVCxmTXVsdCh3ZWlnaHRGYWMsYWNjdSkpID4+KCBSRUxBWEFUSU9OX1NISUZULXNjYWxlICkgKSA7CisgICAgZGlmZiA9IGZpeE1heChSRUxBWEFUSU9OLCBmTXVsdChSRUxBWEFUSU9OX0ZSQUNULCBmTXVsdCh3ZWlnaHRGYWMsIGFjY3UpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRUxBWEFUSU9OX1NISUZUIC0gc2NhbGUpKTsKICAgfQogCiAgIC8qCkBAIC0yNTgsMjQgKzI5MSwyNyBAQAogICBhY2N1ID0gZkRpdk5vcm0oZGlmZiwgbWVhbk9yaWcsICZzY2FsZSk7CiAgIHNjYWxlIC09IDI7CiAKLSAgaWYgKCAoc2NhbGU+MCkgJiYgKGFjY3UgPiAoKEZJWFBfREJMKU1BWFZBTF9EQkwpPj5zY2FsZSkgKSB7CisgIGlmICgoc2NhbGUgPiAwKSAmJiAoYWNjdSA+ICgoRklYUF9EQkwpTUFYVkFMX0RCTCkgPj4gc2NhbGUpKSB7CiAgICAgKm5vaXNlTGV2ZWwgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICAqbm9pc2VMZXZlbCA9IHNjYWxlVmFsdWUoYWNjdSwgc2NhbGUpOwogICB9CiAKICAgLyoKICAgICogQWRkIGEgbm9pc2UgZmxvb3Igb2Zmc2V0IHRvIGNvbXBlbnNhdGUgZm9yIGJpYXMgaW4gdGhlIGRldGVjdG9yCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgaWYoIW1pc3NpbmdIYXJtb25pY0ZsYWcpIHsKLSAgICAqbm9pc2VMZXZlbCA9IGZpeE1pbihmTXVsdCgqbm9pc2VMZXZlbCwgbm9pc2VGbG9vck9mZnNldCksIChGSVhQX0RCTClNQVhWQUxfREJMPj5OT0lTRV9GTE9PUl9PRkZTRVRfU0NBTElORykgPDwgTk9JU0VfRkxPT1JfT0ZGU0VUX1NDQUxJTkc7CisgIGlmICghbWlzc2luZ0hhcm1vbmljRmxhZykgeworICAgICpub2lzZUxldmVsID0gZml4TWluKGZNdWx0KCpub2lzZUxldmVsLCBub2lzZUZsb29yT2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpTUFYVkFMX0RCTCA+PiBOT0lTRV9GTE9PUl9PRkZTRVRfU0NBTElORykKKyAgICAgICAgICAgICAgICAgIDw8IE5PSVNFX0ZMT09SX09GRlNFVF9TQ0FMSU5HOwogICB9CiAKICAgLyoKICAgICogY2hlY2sgdG8gc2VlIHRoYXQgd2UgZG9uJ3QgZXhjZWVkIHRoZSBtYXhpbXVtIGFsbG93ZWQgbGV2ZWwKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAqbm9pc2VMZXZlbCA9IGZpeE1pbigqbm9pc2VMZXZlbCwgYW5hX21heF9sZXZlbCk7ICAgICAvKiBhbmFfbWF4X2xldmVsIGlzIHNjYWxlZCB3aXRoIGZhY3RvciAwLjI1ICovCisgICpub2lzZUxldmVsID0KKyAgICAgIGZpeE1pbigqbm9pc2VMZXZlbCwKKyAgICAgICAgICAgICBhbmFfbWF4X2xldmVsKTsgLyogYW5hX21heF9sZXZlbCBpcyBzY2FsZWQgd2l0aCBmYWN0b3IgMC4yNSAqLwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yOTAsODUgKzMyNiw3OCBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX3Nick5vaXNlRmxvb3JFc3RpbWF0ZVFtZihIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLCAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0JSX0ZSQU1FX0lORk8gKmZyYW1lX2luZm8sICAgLyohPCBUaW1lIGZyZXF1ZW5jeSBncmlkIG9mIHRoZSBjdXJyZW50IGZyYW1lLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpub2lzZUxldmVscywgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byB2ZWN0b3IgdG8gc3RvcmUgdGhlIG5vaXNlIGxldmVscyBpbi4qLwotICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcXVvdGFNYXRyaXhPcmlnLCAgICAgICAgIC8qITwgTWF0cml4IGhvbGRpbmcgdGhlIHF1b3RhIHZhbHVlcyBvZiB0aGUgb3JpZ2luYWwuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKmluZGV4VmVjdG9yLCAgICAgICAgICAgICAgLyohPCBJbmRleCB2ZWN0b3IgdG8gb2J0YWluIHRoZSBwYXRjaGVkIGRhdGEuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1pc3NpbmdIYXJtb25pY3NGbGFnLCAgICAgICAgICAgLyohPCBGbGFnIGluZGljYXRpbmcgaWYgYSBzdHJvbmcgdG9uYWwgY29tcG9uZW50IHdpbGwgYmUgbWlzc2luZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwgICAgIC8qITwgVGhlIG51bWJlciBvZiB0b25hbGl0eSBlc3RpbWF0ZXMgcGVyIGZyYW1lLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc2llbnRGcmFtZSwgICAgICAgICAgICAgICAgIC8qITwgQSBmbGFnIGluZGljYXRpbmcgaWYgYSB0cmFuc2llbnQgaXMgcHJlc2VudC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUqIHBJbnZGaWx0TGV2ZWxzLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gdGhlIHZlY3RvciBob2xkaW5nIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBsZXZlbHMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYnJTeW50YXhGbGFncwotICAgICAgICAgICAgICAgICAgICAgICAgICkKK3ZvaWQgRkRLc2JyRW5jX3Nick5vaXNlRmxvb3JFc3RpbWF0ZVFtZigKKyAgICBIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFCisgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLCAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBjb25zdCBTQlJfRlJBTUVfSU5GTworICAgICAgICAqZnJhbWVfaW5mbywgLyohPCBUaW1lIGZyZXF1ZW5jeSBncmlkIG9mIHRoZSBjdXJyZW50IGZyYW1lLiAqLworICAgIEZJWFBfREJMCisgICAgICAgICpub2lzZUxldmVscywgLyohPCBQb2ludGVyIHRvIHZlY3RvciB0byBzdG9yZSB0aGUgbm9pc2UgbGV2ZWxzIGluLiovCisgICAgRklYUF9EQkwgKipxdW90YU1hdHJpeE9yaWcsIC8qITwgTWF0cml4IGhvbGRpbmcgdGhlIHF1b3RhIHZhbHVlcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwuICovCisgICAgU0NIQVIgKmluZGV4VmVjdG9yLCAgICAgICAgIC8qITwgSW5kZXggdmVjdG9yIHRvIG9idGFpbiB0aGUgcGF0Y2hlZCBkYXRhLiAqLworICAgIElOVCBtaXNzaW5nSGFybW9uaWNzRmxhZywgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBpZiBhIHN0cm9uZyB0b25hbCBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBtaXNzaW5nLiAqLworICAgIElOVCBzdGFydEluZGV4LCAgICAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4LiAqLworICAgIFVJTlQgbnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwgLyohPCBUaGUgbnVtYmVyIG9mIHRvbmFsaXR5IGVzdGltYXRlcyBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLiAqLworICAgIGludCB0cmFuc2llbnRGcmFtZSwgLyohPCBBIGZsYWcgaW5kaWNhdGluZyBpZiBhIHRyYW5zaWVudCBpcyBwcmVzZW50LiAqLworICAgIElOVkZfTU9ERSAqcEludkZpbHRMZXZlbHMsIC8qITwgUG9pbnRlciB0byB0aGUgdmVjdG9yIGhvbGRpbmcgdGhlIGludmVyc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJpbmcgbGV2ZWxzLiAqLworICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MpCiAKIHsKLQogICBJTlQgbk5vaXNlRW52ZWxvcGVzLCBzdGFydFBvc1syXSwgc3RvcFBvc1syXSwgZW52LCBiYW5kOwogCi0gIElOVCBub05vaXNlQmFuZHMgICAgICA9IGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub05vaXNlQmFuZHM7Ci0gIElOVCAqZnJlcUJhbmRUYWJsZSAgICA9IGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5mcmVxQmFuZFRhYmxlUW1mOworICBJTlQgbm9Ob2lzZUJhbmRzID0gaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vTm9pc2VCYW5kczsKKyAgSU5UICpmcmVxQmFuZFRhYmxlID0gaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmZyZXFCYW5kVGFibGVRbWY7CiAKICAgbk5vaXNlRW52ZWxvcGVzID0gZnJhbWVfaW5mby0+bk5vaXNlRW52ZWxvcGVzOwogCi0gIGlmIChzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSB7Ci0gICAgbk5vaXNlRW52ZWxvcGVzID0gMTsKLSAgICBzdGFydFBvc1swXSA9IHN0YXJ0SW5kZXg7Ci0gICAgc3RvcFBvc1swXSAgPSBzdGFydEluZGV4ICsgbWluKG51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUsMik7Ci0gIH0gZWxzZQotICBpZihuTm9pc2VFbnZlbG9wZXMgPT0gMSl7Ci0gICAgc3RhcnRQb3NbMF0gPSBzdGFydEluZGV4OwotICAgIHN0b3BQb3NbMF0gID0gc3RhcnRJbmRleCArIDI7Ci0gIH0KLSAgZWxzZXsKLSAgICBzdGFydFBvc1swXSA9IHN0YXJ0SW5kZXg7Ci0gICAgc3RvcFBvc1swXSAgPSBzdGFydEluZGV4ICsgMTsKKyAgc3RhcnRQb3NbMF0gPSBzdGFydEluZGV4OworCisgIGlmIChuTm9pc2VFbnZlbG9wZXMgPT0gMSkgeworICAgIHN0b3BQb3NbMF0gPSBzdGFydEluZGV4ICsgbWluKG51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUsIDIpOworICB9IGVsc2UgeworICAgIHN0b3BQb3NbMF0gPSBzdGFydEluZGV4ICsgMTsKICAgICBzdGFydFBvc1sxXSA9IHN0YXJ0SW5kZXggKyAxOwotICAgIHN0b3BQb3NbMV0gID0gc3RhcnRJbmRleCArIDI7CisgICAgc3RvcFBvc1sxXSA9IHN0YXJ0SW5kZXggKyBtaW4obnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwgMik7CiAgIH0KIAogICAvKgogICAgKiBFc3RpbWF0ZSB0aGUgbm9pc2UgZmxvb3IuCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgZm9yKGVudiA9IDA7IGVudiA8IG5Ob2lzZUVudmVsb3BlczsgZW52KyspewotICAgIGZvcihiYW5kID0gMDsgYmFuZCA8IG5vTm9pc2VCYW5kczsgYmFuZCsrKXsKLSAgICAgIEZES19BU1NFUlQoIChiYW5kICsgZW52Km5vTm9pc2VCYW5kcykgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUyk7Ci0gICAgICBxbWZCYXNlZE5vaXNlRmxvb3JEZXRlY3Rpb24oJm5vaXNlTGV2ZWxzW2JhbmQgKyBlbnYqbm9Ob2lzZUJhbmRzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90YU1hdHJpeE9yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NbZW52XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wUG9zW2Vudl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZVtiYW5kXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlW2JhbmQrMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmFuYV9tYXhfbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vaXNlRmxvb3JPZmZzZXRbYmFuZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0hhcm1vbmljc0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPndlaWdodEZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+ZGlmZlRocmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnZGaWx0TGV2ZWxzW2JhbmRdKTsKKyAgZm9yIChlbnYgPSAwOyBlbnYgPCBuTm9pc2VFbnZlbG9wZXM7IGVudisrKSB7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG5vTm9pc2VCYW5kczsgYmFuZCsrKSB7CisgICAgICBGREtfQVNTRVJUKChiYW5kICsgZW52ICogbm9Ob2lzZUJhbmRzKSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTKTsKKyAgICAgIHFtZkJhc2VkTm9pc2VGbG9vckRldGVjdGlvbigKKyAgICAgICAgICAmbm9pc2VMZXZlbHNbYmFuZCArIGVudiAqIG5vTm9pc2VCYW5kc10sIHF1b3RhTWF0cml4T3JpZywgaW5kZXhWZWN0b3IsCisgICAgICAgICAgc3RhcnRQb3NbZW52XSwgc3RvcFBvc1tlbnZdLCBmcmVxQmFuZFRhYmxlW2JhbmRdLAorICAgICAgICAgIGZyZXFCYW5kVGFibGVbYmFuZCArIDFdLCBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+YW5hX21heF9sZXZlbCwKKyAgICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9pc2VGbG9vck9mZnNldFtiYW5kXSwgbWlzc2luZ0hhcm1vbmljc0ZsYWcsCisgICAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPndlaWdodEZhYywKKyAgICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+ZGlmZlRocmVzLCBwSW52RmlsdExldmVsc1tiYW5kXSk7CiAgICAgfQogICB9CiAKLQogICAvKgogICAgKiBTbW9vdGhpbmcgb2YgdGhlIHZhbHVlcy4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBzbW9vdGhpbmdPZk5vaXNlTGV2ZWxzKG5vaXNlTGV2ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5Ob2lzZUVudmVsb3BlcywKKyAgc21vb3RoaW5nT2ZOb2lzZUxldmVscyhub2lzZUxldmVscywgbk5vaXNlRW52ZWxvcGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub05vaXNlQmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPnByZXZOb2lzZUxldmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+c21vb3RoRmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudEZyYW1lKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5zbW9vdGhGaWx0ZXIsIHRyYW5zaWVudEZyYW1lKTsKIAogICAvKiBxdWFudGlzYXRpb24qLwotICBmb3IoZW52ID0gMDsgZW52IDwgbk5vaXNlRW52ZWxvcGVzOyBlbnYrKyl7Ci0gICAgZm9yKGJhbmQgPSAwOyBiYW5kIDwgbm9Ob2lzZUJhbmRzOyBiYW5kKyspewotICAgICAgRkRLX0FTU0VSVCggKGJhbmQgKyBlbnYqbm9Ob2lzZUJhbmRzKSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTKTsKLSAgICAgIG5vaXNlTGV2ZWxzW2JhbmQgKyBlbnYqbm9Ob2lzZUJhbmRzXSA9Ci0gICAgICAgICAoRklYUF9EQkwpTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gKEZJWFBfREJMKUNhbGNMZERhdGEobm9pc2VMZXZlbHNbYmFuZCArIGVudipub05vaXNlQmFuZHNdKyhGSVhQX0RCTCkxKSArIFF1YW50T2Zmc2V0OworICBmb3IgKGVudiA9IDA7IGVudiA8IG5Ob2lzZUVudmVsb3BlczsgZW52KyspIHsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbm9Ob2lzZUJhbmRzOyBiYW5kKyspIHsKKyAgICAgIEZES19BU1NFUlQoKGJhbmQgKyBlbnYgKiBub05vaXNlQmFuZHMpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVMpOworICAgICAgbm9pc2VMZXZlbHNbYmFuZCArIGVudiAqIG5vTm9pc2VCYW5kc10gPQorICAgICAgICAgIChGSVhQX0RCTClOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLQorICAgICAgICAgIChGSVhQX0RCTClDYWxjTGREYXRhKG5vaXNlTGV2ZWxzW2JhbmQgKyBlbnYgKiBub05vaXNlQmFuZHNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpMSkgKworICAgICAgICAgIFF1YW50T2Zmc2V0OwogICAgIH0KICAgfQogfQpAQCAtMzgyLDM5ICs0MTEsMzkgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWRvd25TYW1wbGVMb1JlcyhJTlQgKnZfcmVzdWx0LCAgICAgICAgICAgICAgLyohPCAgICAqLwotICAgICAgICAgICAgICAgIElOVCBudW1fcmVzdWx0LCAgICAgICAgICAgICAvKiE8ICAgICovCi0gICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGVSZWYsLyohPCAgICAqLwotICAgICAgICAgICAgICAgIElOVCBudW1fUmVmKSAgICAgICAgICAgICAgICAvKiE8ICAgICovCitzdGF0aWMgSU5UIGRvd25TYW1wbGVMb1JlcyhJTlQgKnZfcmVzdWx0LCAgICAgICAgICAgICAgICAgLyohPCAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bV9yZXN1bHQsICAgICAgICAgICAgICAgIC8qITwgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlUmVmLCAvKiE8ICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtX1JlZikgICAgICAgICAgICAgICAgICAgLyohPCAgICAqLwogewogICBJTlQgc3RlcDsKLSAgSU5UIGksajsKLSAgSU5UIG9yZ19sZW5ndGgscmVzdWx0X2xlbmd0aDsKLSAgSU5UIHZfaW5kZXhbTUFYX0ZSRVFfQ09FRkZTLzJdOworICBJTlQgaSwgajsKKyAgSU5UIG9yZ19sZW5ndGgsIHJlc3VsdF9sZW5ndGg7CisgIElOVCB2X2luZGV4W01BWF9GUkVRX0NPRUZGUyAvIDJdOwogCiAgIC8qIGluaXQgKi8KLSAgb3JnX2xlbmd0aD1udW1fUmVmOwotICByZXN1bHRfbGVuZ3RoPW51bV9yZXN1bHQ7CisgIG9yZ19sZW5ndGggPSBudW1fUmVmOworICByZXN1bHRfbGVuZ3RoID0gbnVtX3Jlc3VsdDsKIAotICB2X2luZGV4WzBdPTA7CS8qIEFsd2F5cyB1c2UgbGVmdCBib3JkZXIgKi8KLSAgaT0wOwotICB3aGlsZShvcmdfbGVuZ3RoID4gMCkJLyogQ3JlYXRlIGRvd25zYW1wbGUgdmVjdG9yICovCi0gICAgewotICAgICAgaSsrOwotICAgICAgc3RlcD1vcmdfbGVuZ3RoL3Jlc3VsdF9sZW5ndGg7IC8qIGZsb29yOyAqLwotICAgICAgb3JnX2xlbmd0aD1vcmdfbGVuZ3RoIC0gc3RlcDsKLSAgICAgIHJlc3VsdF9sZW5ndGgtLTsKLSAgICAgIHZfaW5kZXhbaV09dl9pbmRleFtpLTFdK3N0ZXA7Ci0gICAgfQorICB2X2luZGV4WzBdID0gMDsgLyogQWx3YXlzIHVzZSBsZWZ0IGJvcmRlciAqLworICBpID0gMDsKKyAgd2hpbGUgKG9yZ19sZW5ndGggPiAwKSAvKiBDcmVhdGUgZG93bnNhbXBsZSB2ZWN0b3IgKi8KKyAgeworICAgIGkrKzsKKyAgICBzdGVwID0gb3JnX2xlbmd0aCAvIHJlc3VsdF9sZW5ndGg7IC8qIGZsb29yOyAqLworICAgIG9yZ19sZW5ndGggPSBvcmdfbGVuZ3RoIC0gc3RlcDsKKyAgICByZXN1bHRfbGVuZ3RoLS07CisgICAgdl9pbmRleFtpXSA9IHZfaW5kZXhbaSAtIDFdICsgc3RlcDsKKyAgfQogCi0gIGlmKGkgIT0gbnVtX3Jlc3VsdCApCS8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KLSAgICByZXR1cm4gKDEpOy8qIGVycm9yIGRvd25zYW1wbGluZyAqLworICBpZiAoaSAhPSBudW1fcmVzdWx0KSAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisgICAgcmV0dXJuICgxKTsgICAgICAgIC8qIGVycm9yIGRvd25zYW1wbGluZyAqLwogCi0gIGZvcihqPTA7ajw9aTtqKyspCS8qIFVzZSBkb3duc2FtcGxlIHZlY3RvciB0byBpbmRleCBMb1Jlc29sdXRpb24gdmVjdG9yLiAqLwotICAgIHsKLSAgICAgIHZfcmVzdWx0W2pdPWZyZXFCYW5kVGFibGVSZWZbdl9pbmRleFtqXV07Ci0gICAgfQorICBmb3IgKGogPSAwOyBqIDw9IGk7CisgICAgICAgaisrKSAvKiBVc2UgZG93bnNhbXBsZSB2ZWN0b3IgdG8gaW5kZXggTG9SZXNvbHV0aW9uIHZlY3Rvci4gKi8KKyAgeworICAgIHZfcmVzdWx0W2pdID0gZnJlcUJhbmRUYWJsZVJlZlt2X2luZGV4W2pdXTsKKyAgfQogCiAgIHJldHVybiAoMCk7CiB9CkBAIC00MjgsNDggKzQ1Nyw0OCBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfSW5pdFNick5vaXNlRmxvb3JFc3RpbWF0ZSAoSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsICAgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYW5hX21heF9sZXZlbCwgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWF4aW11bSBsZXZlbCBvZiB0aGUgYWRhcHRpdmUgbm9pc2UuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAgIC8qITwgRnJlcXVhbnkgYmFuZCB0YWJsZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub2lzZUJhbmRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgcGVyIG9jdGF2ZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vaXNlRmxvb3JPZmZzZXQsICAgICAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIGZsb29yIG9mZnNldC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRpbWVTbG90cywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lIHNsb3RzIGluIGEgZnJhbWUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdXNlU3BlZWNoQ29uZmlnICAgICAgICAgICAgIC8qITwgRmxhZzogYWRhcHQgdHVuaW5nIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHNwZWVjaCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK0lOVCBGREtzYnJFbmNfSW5pdFNick5vaXNlRmxvb3JFc3RpbWF0ZSgKKyAgICBIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFCisgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLCAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBJTlQgYW5hX21heF9sZXZlbCwgICAgICAgICAgIC8qITwgTWF4aW11bSBsZXZlbCBvZiB0aGUgYWRhcHRpdmUgbm9pc2UuICovCisgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGUsICAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlLiAqLworICAgIElOVCBuU2ZiLCAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZnJlcXVlbmN5IGJhbmRzLiAqLworICAgIElOVCBub2lzZUJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgcGVyIG9jdGF2ZS4gKi8KKyAgICBJTlQgbm9pc2VGbG9vck9mZnNldCwgICAgICAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAqLworICAgIElOVCB0aW1lU2xvdHMsICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyBpbiBhIGZyYW1lLiAqLworICAgIFVJTlQgdXNlU3BlZWNoQ29uZmlnIC8qITwgRmxhZzogYWRhcHQgdHVuaW5nIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHNwZWVjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworKSB7CiAgIElOVCBpLCBxZXhwLCBxdG1wOwogICBGSVhQX0RCTCB0bXAsIGV4cDsKIAotICBGREttZW1jbGVhcihoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSxzaXplb2YoU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFKSk7CisgIEZES21lbWNsZWFyKGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLCBzaXplb2YoU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFKSk7CiAKICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPnNtb290aEZpbHRlciA9IHNtb290aEZpbHRlcjsKICAgaWYgKHVzZVNwZWVjaENvbmZpZykgewogICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT53ZWlnaHRGYWMgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+ZGlmZlRocmVzID0gSU5WRl9MT1dfTEVWRUw7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPndlaWdodEZhYyA9IEZMMkZYQ09OU1RfREJMKDAuMjVmKTsKICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+ZGlmZlRocmVzID0gSU5WRl9NSURfTEVWRUw7CiAgIH0KIAotICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+dGltZVNsb3RzICAgICA9IHRpbWVTbG90czsKLSAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vaXNlQmFuZHMgICAgPSBub2lzZUJhbmRzOworICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+dGltZVNsb3RzID0gdGltZVNsb3RzOworICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9pc2VCYW5kcyA9IG5vaXNlQmFuZHM7CiAKICAgLyogaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmFuYV9tYXhfbGV2ZWwgaXMgc2NhbGVkIGJ5IDAuMjUgICovCi0gIHN3aXRjaChhbmFfbWF4X2xldmVsKQotICB7Ci0gIGNhc2UgNjoKKyAgc3dpdGNoIChhbmFfbWF4X2xldmVsKSB7CisgICAgY2FzZSA2OgogICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmFuYV9tYXhfbGV2ZWwgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICAgIGJyZWFrOwotICBjYXNlIDM6CisgICAgY2FzZSAzOgogICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmFuYV9tYXhfbGV2ZWwgPSBGTDJGWENPTlNUX0RCTCgwLjUpOwogICAgICAgYnJlYWs7Ci0gIGNhc2UgLTM6CisgICAgY2FzZSAtMzoKICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5hbmFfbWF4X2xldmVsID0gRkwyRlhDT05TVF9EQkwoMC4xMjUpOwogICAgICAgYnJlYWs7Ci0gIGRlZmF1bHQ6CisgICAgZGVmYXVsdDoKICAgICAgIC8qIFNob3VsZCBub3QgZW50ZXIgaGVyZSAqLwogICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmFuYV9tYXhfbGV2ZWwgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICAgIGJyZWFrOwpAQCAtNDc4LDI2ICs1MDcsMjYgQEAKICAgLyoKICAgICBjYWxjdWxhdGUgbnVtYmVyIG9mIG5vaXNlIGJhbmRzIGFuZCBhbGxvY2F0ZQogICAqLwotICBpZihGREtzYnJFbmNfcmVzZXRTYnJOb2lzZUZsb29yRXN0aW1hdGUoaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsZnJlcUJhbmRUYWJsZSxuU2ZiKSkKLSAgICByZXR1cm4oMSk7CisgIGlmIChGREtzYnJFbmNfcmVzZXRTYnJOb2lzZUZsb29yRXN0aW1hdGUoaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZSwgblNmYikpCisgICAgcmV0dXJuICgxKTsKIAotICBpZihub2lzZUZsb29yT2Zmc2V0ID09IDApIHsKLSAgICB0bXAgPSAoKEZJWFBfREJMKU1BWFZBTF9EQkwpPj5OT0lTRV9GTE9PUl9PRkZTRVRfU0NBTElORzsKLSAgfQotICBlbHNlIHsKKyAgaWYgKG5vaXNlRmxvb3JPZmZzZXQgPT0gMCkgeworICAgIHRtcCA9ICgoRklYUF9EQkwpTUFYVkFMX0RCTCkgPj4gTk9JU0VfRkxPT1JfT0ZGU0VUX1NDQUxJTkc7CisgIH0gZWxzZSB7CiAgICAgLyogbm9pc2VGbG9vck9mZnNldCBoYXMgdG8gYmUgc21hbGxlciB0aGFuIDEyLCBiZWNhdXNlCiAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgY2FsY3VsYXRpb24gYmVsb3cgbXVzdCBiZSBzbWFsbGVyIHRoYW4gMToKICAgICAgICAoMl4obm9pc2VGbG9vck9mZnNldC8zKSkqMl40PDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGREtfQVNTRVJUKG5vaXNlRmxvb3JPZmZzZXQ8MTIpOworICAgIEZES19BU1NFUlQobm9pc2VGbG9vck9mZnNldCA8IDEyKTsKIAogICAgIC8qIEFzc3VtZXMgdGhlIG5vaXNlIGZsb29yIG9mZnNldCBpbiB0dW5pbmcgdGFibGUgYXJlIGluIHEzMSAgICAqLwogICAgIC8qIENoYW5nZSB0aGUgcWZvcm1hdCBoZXJlIHdoZW4gbm9uLXplcm8gdmFsdWVzIHdvdWxkIGJlIGZpbGxlZCAqLwogICAgIGV4cCA9IGZEaXZOb3JtKChGSVhQX0RCTClub2lzZUZsb29yT2Zmc2V0LCAzLCAmcWV4cCk7Ci0gICAgdG1wID0gZlBvdygyLCBERlJBQ1RfQklUUy0xLCBleHAsIHFleHAsICZxdG1wKTsKLSAgICB0bXAgPSBzY2FsZVZhbHVlKHRtcCwgcXRtcC1OT0lTRV9GTE9PUl9PRkZTRVRfU0NBTElORyk7CisgICAgdG1wID0gZlBvdygyLCBERlJBQ1RfQklUUyAtIDEsIGV4cCwgcWV4cCwgJnF0bXApOworICAgIHRtcCA9IHNjYWxlVmFsdWUodG1wLCBxdG1wIC0gTk9JU0VfRkxPT1JfT0ZGU0VUX1NDQUxJTkcpOwogICB9CiAKLSAgZm9yKGk9MDtpPGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub05vaXNlQmFuZHM7aSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9Ob2lzZUJhbmRzOyBpKyspIHsKICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9pc2VGbG9vck9mZnNldFtpXSA9IHRtcDsKICAgfQogCkBAIC01MTQsNTIgKzU0Myw1MCBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfcmVzZXRTYnJOb2lzZUZsb29yRXN0aW1hdGUgKEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAgICAgICAgLyohPCBGcmVxdWFueSBiYW5kIHRhYmxlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgaW4gdGhlIGZyZXF1ZW5jeSBiYW5kIHRhYmxlLiAqLwotewotICAgIElOVCBrMixreDsKK0lOVCBGREtzYnJFbmNfcmVzZXRTYnJOb2lzZUZsb29yRXN0aW1hdGUoCisgICAgSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURQorICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSwgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGUsICAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlLiAqLworICAgIElOVCBuU2ZiIC8qITwgTnVtYmVyIG9mIGJhbmRzIGluIHRoZSBmcmVxdWVuY3kgYmFuZCB0YWJsZS4gKi8KKykgeworICBJTlQgazIsIGt4OwogCisgIC8qCisgICAqIENhbGN1bGF0ZSBudW1iZXIgb2Ygbm9pc2UgYmFuZHMKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBrMiA9IGZyZXFCYW5kVGFibGVbblNmYl07CisgIGt4ID0gZnJlcUJhbmRUYWJsZVswXTsKKyAgaWYgKGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub2lzZUJhbmRzID09IDApIHsKKyAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9Ob2lzZUJhbmRzID0gMTsKKyAgfSBlbHNlIHsKICAgICAvKgotICAgICogQ2FsY3VsYXRlIG51bWJlciBvZiBub2lzZSBiYW5kcwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGsyPWZyZXFCYW5kVGFibGVbblNmYl07Ci0gICAga3g9ZnJlcUJhbmRUYWJsZVswXTsKLSAgICBpZihoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9pc2VCYW5kcyA9PSAwKXsKLSAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vTm9pc2VCYW5kcyA9IDE7Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICAgIC8qCi0gICAgICAgICogQ2FsY3VsYXRlIG51bWJlciBvZiBub2lzZSBiYW5kcyAxLDIgb3IgMyBiYW5kcy9vY3RhdmUKLSAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIEZJWFBfREJMIHRtcCwgcmF0aW8sIGxnMjsKLSAgICAgICAgSU5UIHJhdGlvX2UsIHFsZzIsIG5Ob2lzZUJhbmRzOworICAgICAqIENhbGN1bGF0ZSBudW1iZXIgb2Ygbm9pc2UgYmFuZHMgMSwyIG9yIDMgYmFuZHMvb2N0YXZlCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIEZJWFBfREJMIHRtcCwgcmF0aW8sIGxnMjsKKyAgICBJTlQgcmF0aW9fZSwgcWxnMiwgbk5vaXNlQmFuZHM7CiAKLSAgICAgICAgcmF0aW8gPSBmRGl2Tm9ybShrMiwga3gsICZyYXRpb19lKTsKLSAgICAgICAgbGcyID0gZkxvZzIocmF0aW8sIHJhdGlvX2UsICZxbGcyKTsKLSAgICAgICAgdG1wID0gZk11bHQoKEZJWFBfREJMKShoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9pc2VCYW5kczw8MjQpLCBsZzIpOwotICAgICAgICB0bXAgPSBzY2FsZVZhbHVlKHRtcCwgcWxnMi0yMyk7CisgICAgcmF0aW8gPSBmRGl2Tm9ybShrMiwga3gsICZyYXRpb19lKTsKKyAgICBsZzIgPSBmTG9nMihyYXRpbywgcmF0aW9fZSwgJnFsZzIpOworICAgIHRtcCA9IGZNdWx0KChGSVhQX0RCTCkoaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vaXNlQmFuZHMgPDwgMjQpLCBsZzIpOworICAgIHRtcCA9IHNjYWxlVmFsdWUodG1wLCBxbGcyIC0gMjMpOwogCi0gICAgICAgIG5Ob2lzZUJhbmRzID0gKElOVCkoKHRtcCArIChGSVhQX0RCTCkxKSA+PiAxKTsKKyAgICBuTm9pc2VCYW5kcyA9IChJTlQpKCh0bXAgKyAoRklYUF9EQkwpMSkgPj4gMSk7CiAKLQotICAgICAgICBpZiAobk5vaXNlQmFuZHMgPiBNQVhfTlVNX05PSVNFX0NPRUZGUyApIHsKLSAgICAgICAgICBuTm9pc2VCYW5kcyA9IE1BWF9OVU1fTk9JU0VfQ09FRkZTOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG5Ob2lzZUJhbmRzID09IDAgKSB7Ci0gICAgICAgICAgbk5vaXNlQmFuZHMgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vTm9pc2VCYW5kcyA9IG5Ob2lzZUJhbmRzOwotCisgICAgaWYgKG5Ob2lzZUJhbmRzID4gTUFYX05VTV9OT0lTRV9DT0VGRlMpIHsKKyAgICAgIG5Ob2lzZUJhbmRzID0gTUFYX05VTV9OT0lTRV9DT0VGRlM7CiAgICAgfQogCisgICAgaWYgKG5Ob2lzZUJhbmRzID09IDApIHsKKyAgICAgIG5Ob2lzZUJhbmRzID0gMTsKKyAgICB9CiAKLSAgICByZXR1cm4oZG93blNhbXBsZUxvUmVzKGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5mcmVxQmFuZFRhYmxlUW1mLAotICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9Ob2lzZUJhbmRzLAotICAgICAgICBmcmVxQmFuZFRhYmxlLG5TZmIpKTsKKyAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9Ob2lzZUJhbmRzID0gbk5vaXNlQmFuZHM7CisgIH0KKworICByZXR1cm4gKGRvd25TYW1wbGVMb1JlcyhoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+ZnJlcUJhbmRUYWJsZVFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vTm9pc2VCYW5kcywgZnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYikpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01NzIsMTAgKzU5OSwxMSBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX2RlbGV0ZVNick5vaXNlRmxvb3JFc3RpbWF0ZSAoSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSkgIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QgKi8KK3ZvaWQgRkRLc2JyRW5jX2RlbGV0ZVNick5vaXNlRmxvb3JFc3RpbWF0ZSgKKyAgICBIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFCisgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlKSAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIHsKLQogICBpZiAoaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUpIHsKICAgICAvKgogICAgICAgbm90aGluZyB0byBkbwpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9uZl9lc3QuaCBiL2xpYlNCUmVuYy9zcmMvbmZfZXN0LmgKaW5kZXggZjI2Zjc0Zi4uYzJmMTZlOSAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9uZl9lc3QuaAorKysgYi9saWJTQlJlbmMvc3JjL25mX2VzdC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDY5ICs5MCw5NiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIE5vaXNlIGZsb29yIGVzdGltYXRpb24gc3RydWN0cyBhbmQgcHJvdG90eXBlcyAgCisgIFxicmllZiAgTm9pc2UgZmxvb3IgZXN0aW1hdGlvbiBzdHJ1Y3RzIGFuZCBwcm90b3R5cGVzICRSZXZpc2lvbjogOTI3OTAgJAogKi8KIAotI2lmbmRlZiBfX05GX0VTVF9ICi0jZGVmaW5lIF9fTkZfRVNUX0gKKyNpZm5kZWYgTkZfRVNUX0gKKyNkZWZpbmUgTkZfRVNUX0gKIAogI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCiAjaW5jbHVkZSAiZnJhbV9nZW4uaCIKIAotI2RlZmluZSBORl9TTU9PVEhJTkdfTEVOR1RIIDQgICAgICAgICAgICAgICAgICAgLyohPCBTbW9vdGhpbmcgbGVuZ3RoIG9mIHRoZSBub2lzZSBmbG9vcnMuICovCisjZGVmaW5lIE5GX1NNT09USElOR19MRU5HVEggNCAvKiE8IFNtb290aGluZyBsZW5ndGggb2YgdGhlIG5vaXNlIGZsb29ycy4gKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRklYUF9EQkwgcHJldk5vaXNlTGV2ZWxzW05GX1NNT09USElOR19MRU5HVEhdW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsgLyohPCBUaGUgcHJldmlvdXMgbm9pc2UgbGV2ZWxzLiAqLwotICBGSVhQX0RCTCBub2lzZUZsb29yT2Zmc2V0W01BWF9OVU1fTk9JU0VfVkFMVUVTXTsgICAvKiE8IE5vaXNlIGZsb29yIG9mZnNldCwgc2NhbGVkIHdpdGggTk9JU0VfRkxPT1JfT0ZGU0VUX1NDQUxJTkcgKi8KLSAgY29uc3QgRklYUF9EQkwgKnNtb290aEZpbHRlcjsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTbW9vdGhpbmcgZmlsdGVyIHRvIHVzZS4gKi8KLSAgRklYUF9EQkwgYW5hX21heF9sZXZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXggbGV2ZWwgYWxsb3dlZC4gICAqLwotICBGSVhQX0RCTCB3ZWlnaHRGYWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdlaWdodGVuaW5nIGZhY3RvciBmb3IgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvcmlnIGFuZCBzYnIuICovCi0gIElOVCBmcmVxQmFuZFRhYmxlUW1mW01BWF9OVU1fTk9JU0VfVkFMVUVTICsgMV07IC8qITwgRnJlcXVuY3kgYmFuZCB0YWJsZSBmb3IgdGhlIG5vaXNlIGZsb29yIGJhbmRzLiovCi0gIElOVCBub05vaXNlQmFuZHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlYmFuZHMuICovCi0gIElOVCBub2lzZUJhbmRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm9pc2VCYW5kcyBzd2l0Y2ggNCBiaXQuKi8KLSAgSU5UIHRpbWVTbG90czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZXNsb3RzIGluIGEgZnJhbWUuICovCi0gIElOVkZfTU9ERSBkaWZmVGhyZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhyZXNob2xkIHZhbHVlIHRvIGNvbnRyb2wgdGhlIGludmVyc2UgZmlsdGVyaW5nIGRlY2lzaW9uICovCi19Ci1TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEU7Cit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfREJMCisgIHByZXZOb2lzZUxldmVsc1tORl9TTU9PVEhJTkdfTEVOR1RIXQorICAgICAgICAgICAgICAgICBbTUFYX05VTV9OT0lTRV9WQUxVRVNdOyAvKiE8IFRoZSBwcmV2aW91cyBub2lzZSBsZXZlbHMuICovCisgIEZJWFBfREJMIG5vaXNlRmxvb3JPZmZzZXQKKyAgICAgIFtNQVhfTlVNX05PSVNFX1ZBTFVFU107ICAgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQsIHNjYWxlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PSVNFX0ZMT09SX09GRlNFVF9TQ0FMSU5HICovCisgIGNvbnN0IEZJWFBfREJMICpzbW9vdGhGaWx0ZXI7IC8qITwgU21vb3RoaW5nIGZpbHRlciB0byB1c2UuICovCisgIEZJWFBfREJMIGFuYV9tYXhfbGV2ZWw7ICAgICAgIC8qITwgTWF4IGxldmVsIGFsbG93ZWQuICAgKi8KKyAgRklYUF9EQkwgd2VpZ2h0RmFjOyAvKiE8IFdlaWdodGVuaW5nIGZhY3RvciBmb3IgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvcmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNici4gKi8KKyAgSU5UIGZyZXFCYW5kVGFibGVRbWZbTUFYX05VTV9OT0lTRV9WQUxVRVMgKworICAgICAgICAgICAgICAgICAgICAgICAxXTsgLyohPCBGcmVxdW5jeSBiYW5kIHRhYmxlIGZvciB0aGUgbm9pc2UgZmxvb3IgYmFuZHMuKi8KKyAgSU5UIG5vTm9pc2VCYW5kczsgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlYmFuZHMuICovCisgIElOVCBub2lzZUJhbmRzOyAgICAgICAgICAvKiE8IE5vaXNlQmFuZHMgc3dpdGNoIDQgYml0LiovCisgIElOVCB0aW1lU2xvdHM7ICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lc2xvdHMgaW4gYSBmcmFtZS4gKi8KKyAgSU5WRl9NT0RFIGRpZmZUaHJlczsgICAgIC8qITwgVGhyZXNob2xkIHZhbHVlIHRvIGNvbnRyb2wgdGhlIGludmVyc2UgZmlsdGVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpc2lvbiAqLworfSBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEU7CiAKIHR5cGVkZWYgU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFICpIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFOwogCi12b2lkCi1GREtzYnJFbmNfc2JyTm9pc2VGbG9vckVzdGltYXRlUW1mKEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqZnJhbWVfaW5mbywgICAvKiE8IFRpbWUgZnJlcXVlbmN5IGdyaWQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5vaXNlTGV2ZWxzLCAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHZlY3RvciB0byBzdG9yZSB0aGUgbm9pc2UgbGV2ZWxzIGluLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxdW90YU1hdHJpeE9yaWcsICAgICAgICAgLyohPCBNYXRyaXggaG9sZGluZyB0aGUgcXVvdGEgdmFsdWVzIG9mIHRoZSBvcmlnaW5hbC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiogaW5kZXhWZWN0b3IsICAgICAgICAgICAgICAgICAvKiE8IEluZGV4IHZlY3RvciB0byBvYnRhaW4gdGhlIHBhdGNoZWQgZGF0YS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWlzc2luZ0hhcm1vbmljc0ZsYWcsICAgICAgICAgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBpZiBhIHN0cm9uZyB0b25hbCBjb21wb25lbnQgd2lsbCBiZSBtaXNzaW5nLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydEluZGV4LCAgICAgICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXguICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBudW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLCAgICAgLyohPCBUaGUgbnVtYmVyIG9mIHRvbmFsaXR5IGVzdGltYXRlcyBwZXIgZnJhbWUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRyYW5zaWVudEZyYW1lLCAgICAgICAgICAgICAgICAgLyohPCBBIGZsYWcgaW5kaWNhdGluZyBpZiBhIHRyYW5zaWVudCBpcyBwcmVzZW50LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSogcEludkZpbHRMZXZlbHMsICAgICAgICAgIC8qITwgUG9pbnRlciB0byB0aGUgdmVjdG9yIGhvbGRpbmcgdGhlIGludmVyc2UgZmlsdGVyaW5nIGxldmVscy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNiclN5bnRheEZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKTsKK3ZvaWQgRkRLc2JyRW5jX3Nick5vaXNlRmxvb3JFc3RpbWF0ZVFtZigKKyAgICBIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFCisgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLCAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBjb25zdCBTQlJfRlJBTUVfSU5GTworICAgICAgICAqZnJhbWVfaW5mbywgLyohPCBUaW1lIGZyZXF1ZW5jeSBncmlkIG9mIHRoZSBjdXJyZW50IGZyYW1lLiAqLworICAgIEZJWFBfREJMCisgICAgICAgICpub2lzZUxldmVscywgLyohPCBQb2ludGVyIHRvIHZlY3RvciB0byBzdG9yZSB0aGUgbm9pc2UgbGV2ZWxzIGluLiovCisgICAgRklYUF9EQkwgKipxdW90YU1hdHJpeE9yaWcsIC8qITwgTWF0cml4IGhvbGRpbmcgdGhlIHF1b3RhIHZhbHVlcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwuICovCisgICAgU0NIQVIgKmluZGV4VmVjdG9yLCAgICAgICAgIC8qITwgSW5kZXggdmVjdG9yIHRvIG9idGFpbiB0aGUgcGF0Y2hlZCBkYXRhLiAqLworICAgIElOVCBtaXNzaW5nSGFybW9uaWNzRmxhZywgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBpZiBhIHN0cm9uZyB0b25hbCBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBtaXNzaW5nLiAqLworICAgIElOVCBzdGFydEluZGV4LCAgICAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4LiAqLworICAgIFVJTlQgbnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwgLyohPCBUaGUgbnVtYmVyIG9mIHRvbmFsaXR5IGVzdGltYXRlcyBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLiAqLworICAgIElOVCB0cmFuc2llbnRGcmFtZSwgLyohPCBBIGZsYWcgaW5kaWNhdGluZyBpZiBhIHRyYW5zaWVudCBpcyBwcmVzZW50LiAqLworICAgIElOVkZfTU9ERSAqcEludkZpbHRMZXZlbHMsIC8qITwgUG9pbnRlciB0byB0aGUgdmVjdG9yIGhvbGRpbmcgdGhlIGludmVyc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJpbmcgbGV2ZWxzLiAqLworICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MpOwogCi1JTlQKLUZES3NickVuY19Jbml0U2JyTm9pc2VGbG9vckVzdGltYXRlIChIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSwgICAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhbmFfbWF4X2xldmVsLCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXhpbXVtIGxldmVsIG9mIHRoZSBhZGFwdGl2ZSBub2lzZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGUsICAgICAgLyohPCBGcmVxdWFueSBiYW5kIHRhYmxlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vaXNlQmFuZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyBwZXIgb2N0YXZlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9pc2VGbG9vck9mZnNldCwgICAgICAgICAgICAgICAgICAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdGltZVNsb3RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUgc2xvdHMgaW4gYSBmcmFtZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB1c2VTcGVlY2hDb25maWcgICAgICAgICAgICAgLyohPCBGbGFnOiBhZGFwdCB0dW5pbmcgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gc3BlZWNoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitJTlQgRkRLc2JyRW5jX0luaXRTYnJOb2lzZUZsb29yRXN0aW1hdGUoCisgICAgSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURQorICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSwgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgSU5UIGFuYV9tYXhfbGV2ZWwsICAgICAgICAgICAvKiE8IE1heGltdW0gbGV2ZWwgb2YgdGhlIGFkYXB0aXZlIG5vaXNlLiAqLworICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgLyohPCBGcmVxdWFueSBiYW5kIHRhYmxlLiAqLworICAgIElOVCBuU2ZiLCAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZnJlcXVlbmN5IGJhbmRzLiAqLworICAgIElOVCBub2lzZUJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgcGVyIG9jdGF2ZS4gKi8KKyAgICBJTlQgbm9pc2VGbG9vck9mZnNldCwgICAgICAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAqLworICAgIElOVCB0aW1lU2xvdHMsICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyBpbiBhIGZyYW1lLiAqLworICAgIFVJTlQgdXNlU3BlZWNoQ29uZmlnIC8qITwgRmxhZzogYWRhcHQgdHVuaW5nIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHNwZWVjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworKTsKIAotSU5UCi1GREtzYnJFbmNfcmVzZXRTYnJOb2lzZUZsb29yRXN0aW1hdGUgKEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAvKiE8IEZyZXF1YW55IGJhbmQgdGFibGUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBpbiB0aGUgZnJlcXVlbmN5IGJhbmQgdGFibGUuICovCitJTlQgRkRLc2JyRW5jX3Jlc2V0U2JyTm9pc2VGbG9vckVzdGltYXRlKAorICAgIEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUKKyAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgLyohPCBGcmVxdWFueSBiYW5kIHRhYmxlLiAqLworICAgIElOVCBuU2ZiKTsgLyohPCBOdW1iZXIgb2YgYmFuZHMgaW4gdGhlIGZyZXF1ZW5jeSBiYW5kIHRhYmxlLiAqLwogCi12b2lkCi1GREtzYnJFbmNfZGVsZXRlU2JyTm9pc2VGbG9vckVzdGltYXRlIChIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlKTsgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdCAqLwordm9pZCBGREtzYnJFbmNfZGVsZXRlU2JyTm9pc2VGbG9vckVzdGltYXRlKAorICAgIEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUKKyAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUpOyAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9wc19iaXRlbmMuY3BwIGIvbGliU0JSZW5jL3NyYy9wc19iaXRlbmMuY3BwCmluZGV4IDQyMGVhMTUuLmUzMGFmMmEgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvcHNfYml0ZW5jLmNwcAorKysgYi9saWJTQlJlbmMvc3JjL3BzX2JpdGVuYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzcgKzkwLDM1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE4uIFJldHRlbGJhY2gKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQYXJhbWV0cmljIFN0ZXJlbyBiaXRzdHJlYW0gZW5jb2RlcgorICAgQXV0aG9yKHMpOiAgIE4uIFJldHRlbGJhY2gKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBhcmFtZXRyaWMgU3RlcmVvIGJpdHN0cmVhbSBlbmNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwc19iaXRlbmMuaCIKIAogI2luY2x1ZGUgInBzX21haW4uaCIKIAotCi0jaW5jbHVkZSAicHNfY29uc3QuaCIKLSNpbmNsdWRlICJwc19iaXRlbmMuaCIKLQotc3RhdGljCi1pbmxpbmUgVUNIQVIgRkRLc2JyRW5jX1dyaXRlQml0c19wcyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBVSU5UIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpCi17CitzdGF0aWMgaW5saW5lIFVDSEFSIEZES3NickVuY19Xcml0ZUJpdHNfcHMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSB7CiAgIC8qIGhCaXRTdHJlYW0gPT0gTlVMTCBoYXBwZW5zIGhlcmUgaW50ZW50aW9uYWxseSAqLwotICBpZihoQml0U3RyZWFtIT1OVUxMKXsKKyAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewogICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB2YWx1ZSwgbnVtYmVyT2ZCaXRzKTsKICAgfQogICByZXR1cm4gbnVtYmVyT2ZCaXRzOwogfQogCi0jZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fRVNDX0NPVU5UX0JJVFMgICAgICAgICA4Ci0jZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fSURfQklUUyAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEVYVEVOU0lPTl9JRF9QU19DT0RJTkcgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFBTX0VYVF9JRF9WMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTIDQKKyNkZWZpbmUgU0lfU0JSX0VYVEVOU0lPTl9FU0NfQ09VTlRfQklUUyA4CisjZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fSURfQklUUyAyCisjZGVmaW5lIEVYVEVOU0lPTl9JRF9QU19DT0RJTkcgMgorI2RlZmluZSBQU19FWFRfSURfVjAgMAogCiBzdGF0aWMgY29uc3QgSU5UIGlpZERlbHRhQ29hcnNlX09mZnNldCA9IDE0Owogc3RhdGljIGNvbnN0IElOVCBpaWREZWx0YUNvYXJzZV9NYXhWYWwgPSAyODsKQEAgLTExNyw0OTkgKzEyNiw0MjUgQEAKIHN0YXRpYyBjb25zdCBJTlQgaWlkRGVsdGFGaW5lX01heFZhbCA9IDYwOwogCiAvKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpaWREZWx0YUZyZXFDb2Fyc2UgKi8KLXN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhRnJlcUNvYXJzZV9MZW5ndGhbXSA9Ci17Ci0gIDE3LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNiwgIDE1LCAgICAxMywgICAgMTAsICAgICA5LCAgICAgNywKLSAgIDYsICAgICA1LCAgICAgNCwgICAgIDMsICAgICAxLCAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA2LAotICAgOCwgICAgMTEsICAgIDEzLCAgICAxNCwgICAgMTQsICAxNSwgICAgMTcsICAgIDE4LCAgICAxOAotfTsKLXN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhRnJlcUNvYXJzZV9Db2RlW10gID0KLXsKLSAgMHgwMDAxZmZmYiwgIDB4MDAwMWZmZmMsICAweDAwMDFmZmZkLCAgMHgwMDAxZmZmYSwgIDB4MDAwMGZmZmMsICAweDAwMDA3ZmZjLCAgMHgwMDAwMWZmZCwgIDB4MDAwMDAzZmUsICAweDAwMDAwMWZlLCAgMHgwMDAwMDA3ZSwKLSAgMHgwMDAwMDAzYywgIDB4MDAwMDAwMWQsICAweDAwMDAwMDBkLCAgMHgwMDAwMDAwNSwgIDAwMDAwMDAwMDAsICAweDAwMDAwMDA0LCAgMHgwMDAwMDAwYywgIDB4MDAwMDAwMWMsICAweDAwMDAwMDNkLCAgMHgwMDAwMDAzZSwKLSAgMHgwMDAwMDBmZSwgIDB4MDAwMDA3ZmUsICAweDAwMDAxZmZjLCAgMHgwMDAwM2ZmYywgIDB4MDAwMDNmZmQsICAweDAwMDA3ZmZkLCAgMHgwMDAxZmZmZSwgIDB4MDAwM2ZmZmUsICAweDAwMDNmZmZmCi19Oworc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFGcmVxQ29hcnNlX0xlbmd0aFtdID0geworICAgIDE3LCAxNywgMTcsIDE3LCAxNiwgMTUsIDEzLCAxMCwgOSwgIDcsICA2LCAgNSwgIDQsICAzLCAxLAorICAgIDMsICA0LCAgNSwgIDYsICA2LCAgOCwgIDExLCAxMywgMTQsIDE0LCAxNSwgMTcsIDE4LCAxOH07CitzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YUZyZXFDb2Fyc2VfQ29kZVtdID0geworICAgIDB4MDAwMWZmZmIsIDB4MDAwMWZmZmMsIDB4MDAwMWZmZmQsIDB4MDAwMWZmZmEsIDB4MDAwMGZmZmMsIDB4MDAwMDdmZmMsCisgICAgMHgwMDAwMWZmZCwgMHgwMDAwMDNmZSwgMHgwMDAwMDFmZSwgMHgwMDAwMDA3ZSwgMHgwMDAwMDAzYywgMHgwMDAwMDAxZCwKKyAgICAweDAwMDAwMDBkLCAweDAwMDAwMDA1LCAwMDAwMDAwMDAwLCAweDAwMDAwMDA0LCAweDAwMDAwMDBjLCAweDAwMDAwMDFjLAorICAgIDB4MDAwMDAwM2QsIDB4MDAwMDAwM2UsIDB4MDAwMDAwZmUsIDB4MDAwMDA3ZmUsIDB4MDAwMDFmZmMsIDB4MDAwMDNmZmMsCisgICAgMHgwMDAwM2ZmZCwgMHgwMDAwN2ZmZCwgMHgwMDAxZmZmZSwgMHgwMDAzZmZmZSwgMHgwMDAzZmZmZn07CiAKIC8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGlpZERlbHRhRnJlcUZpbmUgKi8KLXN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhRnJlcUZpbmVfTGVuZ3RoW10gPQotewotICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTcsCi0gIDE4LCAgICAxNywgICAgMTcsICAgIDE2LCAgICAxNiwgIDE1LCAgICAxNCwgICAgMTQsICAgIDEzLCAgICAxMiwKLSAgMTIsICAgIDExLCAgICAxMCwgICAgMTAsICAgICA4LCAgIDcsICAgICA2LCAgICAgNSwgICAgIDQsICAgICAzLAotICAgMSwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsCi0gIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNCwgIDE1LCAgICAxNiwgICAgMTYsICAgIDE3LCAgICAxNywKLSAgMTgsICAgIDE3LCAgICAxOCwgICAgMTgsICAgIDE4LCAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LAotICAxOAotfTsKLXN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhRnJlcUZpbmVfQ29kZVtdID0KLXsKLSAgMHgwMDAxZmViNCwgIDB4MDAwMWZlYjUsICAweDAwMDFmZDc2LCAgMHgwMDAxZmQ3NywgIDB4MDAwMWZkNzQsICAweDAwMDFmZDc1LCAgMHgwMDAxZmU4YSwgIDB4MDAwMWZlOGIsICAweDAwMDFmZTg4LCAgMHgwMDAwZmU4MCwKLSAgMHgwMDAxZmViNiwgIDB4MDAwMGZlODIsICAweDAwMDBmZWI4LCAgMHgwMDAwN2Y0MiwgIDB4MDAwMDdmYWUsICAweDAwMDAzZmFmLCAgMHgwMDAwMWZkMSwgIDB4MDAwMDFmZTksICAweDAwMDAwZmU5LCAgMHgwMDAwMDdlYSwKLSAgMHgwMDAwMDdmYiwgIDB4MDAwMDAzZmIsICAweDAwMDAwMWZiLCAgMHgwMDAwMDFmZiwgIDB4MDAwMDAwN2MsICAweDAwMDAwMDNjLCAgMHgwMDAwMDAxYywgIDB4MDAwMDAwMGMsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwMSwKLSAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwZCwgIDB4MDAwMDAwMWQsICAweDAwMDAwMDNkLCAgMHgwMDAwMDA3ZCwgIDB4MDAwMDAwZmMsICAweDAwMDAwMWZjLCAgMHgwMDAwMDNmYywKLSAgMHgwMDAwMDNmNCwgIDB4MDAwMDA3ZWIsICAweDAwMDAwZmVhLCAgMHgwMDAwMWZlYSwgIDB4MDAwMDFmZDYsICAweDAwMDAzZmQwLCAgMHgwMDAwN2ZhZiwgIDB4MDAwMDdmNDMsICAweDAwMDBmZWI5LCAgMHgwMDAwZmU4MywKLSAgMHgwMDAxZmViNywgIDB4MDAwMGZlODEsICAweDAwMDFmZTg5LCAgMHgwMDAxZmU4ZSwgIDB4MDAwMWZlOGYsICAweDAwMDFmZThjLCAgMHgwMDAxZmU4ZCwgIDB4MDAwMWZlYjIsICAweDAwMDFmZWIzLCAgMHgwMDAxZmViMCwKLSAgMHgwMDAxZmViMQotfTsKK3N0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhRnJlcUZpbmVfTGVuZ3RoW10gPSB7CisgICAgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTcsIDE4LCAxNywgMTcsIDE2LCAxNiwgMTUsCisgICAgMTQsIDE0LCAxMywgMTIsIDEyLCAxMSwgMTAsIDEwLCA4LCAgNywgIDYsICA1LCAgNCwgIDMsICAxLCAgMywKKyAgICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDExLCAxMiwgMTMsIDE0LCAxNCwgMTUsIDE2LCAxNiwKKyAgICAxNywgMTcsIDE4LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOH07CitzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YUZyZXFGaW5lX0NvZGVbXSA9IHsKKyAgICAweDAwMDFmZWI0LCAweDAwMDFmZWI1LCAweDAwMDFmZDc2LCAweDAwMDFmZDc3LCAweDAwMDFmZDc0LCAweDAwMDFmZDc1LAorICAgIDB4MDAwMWZlOGEsIDB4MDAwMWZlOGIsIDB4MDAwMWZlODgsIDB4MDAwMGZlODAsIDB4MDAwMWZlYjYsIDB4MDAwMGZlODIsCisgICAgMHgwMDAwZmViOCwgMHgwMDAwN2Y0MiwgMHgwMDAwN2ZhZSwgMHgwMDAwM2ZhZiwgMHgwMDAwMWZkMSwgMHgwMDAwMWZlOSwKKyAgICAweDAwMDAwZmU5LCAweDAwMDAwN2VhLCAweDAwMDAwN2ZiLCAweDAwMDAwM2ZiLCAweDAwMDAwMWZiLCAweDAwMDAwMWZmLAorICAgIDB4MDAwMDAwN2MsIDB4MDAwMDAwM2MsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMGMsIDAwMDAwMDAwMDAsIDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwZCwgMHgwMDAwMDAxZCwgMHgwMDAwMDAzZCwKKyAgICAweDAwMDAwMDdkLCAweDAwMDAwMGZjLCAweDAwMDAwMWZjLCAweDAwMDAwM2ZjLCAweDAwMDAwM2Y0LCAweDAwMDAwN2ViLAorICAgIDB4MDAwMDBmZWEsIDB4MDAwMDFmZWEsIDB4MDAwMDFmZDYsIDB4MDAwMDNmZDAsIDB4MDAwMDdmYWYsIDB4MDAwMDdmNDMsCisgICAgMHgwMDAwZmViOSwgMHgwMDAwZmU4MywgMHgwMDAxZmViNywgMHgwMDAwZmU4MSwgMHgwMDAxZmU4OSwgMHgwMDAxZmU4ZSwKKyAgICAweDAwMDFmZThmLCAweDAwMDFmZThjLCAweDAwMDFmZThkLCAweDAwMDFmZWIyLCAweDAwMDFmZWIzLCAweDAwMDFmZWIwLAorICAgIDB4MDAwMWZlYjF9OwogCiAvKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpaWREZWx0YVRpbWVDb2Fyc2UgKi8KLXN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUNvYXJzZV9MZW5ndGhbXSA9Ci17Ci0gIDE5LCAgICAxOSwgICAgMTksICAgIDIwLCAgICAyMCwgIDIwLCAgICAxNywgICAgMTUsICAgIDEyLCAgICAxMCwKLSAgIDgsICAgICA2LCAgICAgNCwgICAgIDIsICAgICAxLCAgIDMsICAgICA1LCAgICAgNywgICAgIDksICAgIDExLAotICAxMywgICAgMTQsICAgIDE3LCAgICAxOSwgICAgMjAsICAyMCwgICAgMjAsICAgIDIwLCAgICAyMAotfTsKLXN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUNvYXJzZV9Db2RlW10gPQotewotICAweDAwMDdmZmY5LCAgMHgwMDA3ZmZmYSwgIDB4MDAwN2ZmZmIsICAweDAwMGZmZmY4LCAgMHgwMDBmZmZmOSwgIDB4MDAwZmZmZmEsICAweDAwMDFmZmZkLCAgMHgwMDAwN2ZmZSwgIDB4MDAwMDBmZmUsICAweDAwMDAwM2ZlLAotICAweDAwMDAwMGZlLCAgMHgwMDAwMDAzZSwgIDB4MDAwMDAwMGUsICAweDAwMDAwMDAyLCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDYsICAweDAwMDAwMDFlLCAgMHgwMDAwMDA3ZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwN2ZlLAotICAweDAwMDAxZmZlLCAgMHgwMDAwM2ZmZSwgIDB4MDAwMWZmZmMsICAweDAwMDdmZmY4LCAgMHgwMDBmZmZmYiwgIDB4MDAwZmZmZmMsICAweDAwMGZmZmZkLCAgMHgwMDBmZmZmZSwgIDB4MDAwZmZmZmYKLX07CitzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YVRpbWVDb2Fyc2VfTGVuZ3RoW10gPSB7CisgICAgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMTcsIDE1LCAxMiwgMTAsIDgsICA2LCAgNCwgIDIsIDEsCisgICAgMywgIDUsICA3LCAgOSwgIDExLCAxMywgMTQsIDE3LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIwfTsKK3N0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUNvYXJzZV9Db2RlW10gPSB7CisgICAgMHgwMDA3ZmZmOSwgMHgwMDA3ZmZmYSwgMHgwMDA3ZmZmYiwgMHgwMDBmZmZmOCwgMHgwMDBmZmZmOSwgMHgwMDBmZmZmYSwKKyAgICAweDAwMDFmZmZkLCAweDAwMDA3ZmZlLCAweDAwMDAwZmZlLCAweDAwMDAwM2ZlLCAweDAwMDAwMGZlLCAweDAwMDAwMDNlLAorICAgIDB4MDAwMDAwMGUsIDB4MDAwMDAwMDIsIDAwMDAwMDAwMDAsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMWUsIDB4MDAwMDAwN2UsCisgICAgMHgwMDAwMDFmZSwgMHgwMDAwMDdmZSwgMHgwMDAwMWZmZSwgMHgwMDAwM2ZmZSwgMHgwMDAxZmZmYywgMHgwMDA3ZmZmOCwKKyAgICAweDAwMGZmZmZiLCAweDAwMGZmZmZjLCAweDAwMGZmZmZkLCAweDAwMGZmZmZlLCAweDAwMGZmZmZmfTsKIAogLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaWlkRGVsdGFUaW1lRmluZSAqLwotc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFUaW1lRmluZV9MZW5ndGhbXSA9Ci17Ci0gIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgICAxNiwgIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgICAxNSwKLSAgMTUsICAgIDE1LCAgICAxNSwgICAgMTUsICAgIDE1LCAgMTQsICAgIDE0LCAgICAxMywgICAgMTMsICAgIDEzLAotICAxMiwgICAgMTIsICAgIDExLCAgICAxMCwgICAgIDksICAgOSwgICAgIDcsICAgICA2LCAgICAgNSwgICAgIDMsCi0gICAxLCAgICAgMiwgICAgIDUsICAgICA2LCAgICAgNywgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMSwKLSAgMTIsICAgIDEyLCAgICAxMywgICAgMTMsICAgIDE0LCAgMTQsICAgIDE1LCAgICAxNSwgICAgMTUsICAgIDE1LAotICAxNiwgICAgMTYsICAgIDE2LCAgICAxNiwgICAgMTYsICAxNiwgICAgMTYsICAgIDE2LCAgICAxNiwgICAgMTYsCi0gIDE2Ci19Owotc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFUaW1lRmluZV9Db2RlW10gPQotewotICAweDAwMDA0ZWQ0LCAgMHgwMDAwNGVkNSwgIDB4MDAwMDRlY2UsICAweDAwMDA0ZWNmLCAgMHgwMDAwNGVjYywgIDB4MDAwMDRlZDYsICAweDAwMDA0ZWQ4LCAgMHgwMDAwNGY0NiwgIDB4MDAwMDRmNjAsICAweDAwMDAyNzE4LAotICAweDAwMDAyNzE5LCAgMHgwMDAwMjc2NCwgIDB4MDAwMDI3NjUsICAweDAwMDAyNzZkLCAgMHgwMDAwMjdiMSwgIDB4MDAwMDEzYjcsICAweDAwMDAxM2Q2LCAgMHgwMDAwMDljNywgIDB4MDAwMDA5ZTksICAweDAwMDAwOWVkLAotICAweDAwMDAwNGVlLCAgMHgwMDAwMDRmNywgIDB4MDAwMDAyNzgsICAweDAwMDAwMTM5LCAgMHgwMDAwMDA5YSwgIDB4MDAwMDAwOWYsICAweDAwMDAwMDIwLCAgMHgwMDAwMDAxMSwgIDB4MDAwMDAwMGEsICAweDAwMDAwMDAzLAotICAweDAwMDAwMDAxLCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMGIsICAweDAwMDAwMDEyLCAgMHgwMDAwMDAyMSwgIDB4MDAwMDAwNGMsICAweDAwMDAwMDliLCAgMHgwMDAwMDEzYSwgIDB4MDAwMDAyNzksICAweDAwMDAwMjcwLAotICAweDAwMDAwNGVmLCAgMHgwMDAwMDRlMiwgIDB4MDAwMDA5ZWEsICAweDAwMDAwOWQ4LCAgMHgwMDAwMTNkNywgIDB4MDAwMDEzZDAsICAweDAwMDAyN2IyLCAgMHgwMDAwMjdhMiwgIDB4MDAwMDI3MWEsICAweDAwMDAyNzFiLAotICAweDAwMDA0ZjY2LCAgMHgwMDAwNGY2NywgIDB4MDAwMDRmNjEsICAweDAwMDA0ZjQ3LCAgMHgwMDAwNGVkOSwgIDB4MDAwMDRlZDcsICAweDAwMDA0ZWNkLCAgMHgwMDAwNGVkMiwgIDB4MDAwMDRlZDMsICAweDAwMDA0ZWQwLAotICAweDAwMDA0ZWQxCi19Oworc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFUaW1lRmluZV9MZW5ndGhbXSA9IHsKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwKKyAgICAxNCwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMSwgMTAsIDksICA5LCAgNywgIDYsICA1LCAgMywgIDEsICAyLAorICAgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2fTsKK3N0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUZpbmVfQ29kZVtdID0geworICAgIDB4MDAwMDRlZDQsIDB4MDAwMDRlZDUsIDB4MDAwMDRlY2UsIDB4MDAwMDRlY2YsIDB4MDAwMDRlY2MsIDB4MDAwMDRlZDYsCisgICAgMHgwMDAwNGVkOCwgMHgwMDAwNGY0NiwgMHgwMDAwNGY2MCwgMHgwMDAwMjcxOCwgMHgwMDAwMjcxOSwgMHgwMDAwMjc2NCwKKyAgICAweDAwMDAyNzY1LCAweDAwMDAyNzZkLCAweDAwMDAyN2IxLCAweDAwMDAxM2I3LCAweDAwMDAxM2Q2LCAweDAwMDAwOWM3LAorICAgIDB4MDAwMDA5ZTksIDB4MDAwMDA5ZWQsIDB4MDAwMDA0ZWUsIDB4MDAwMDA0ZjcsIDB4MDAwMDAyNzgsIDB4MDAwMDAxMzksCisgICAgMHgwMDAwMDA5YSwgMHgwMDAwMDA5ZiwgMHgwMDAwMDAyMCwgMHgwMDAwMDAxMSwgMHgwMDAwMDAwYSwgMHgwMDAwMDAwMywKKyAgICAweDAwMDAwMDAxLCAwMDAwMDAwMDAwLCAweDAwMDAwMDBiLCAweDAwMDAwMDEyLCAweDAwMDAwMDIxLCAweDAwMDAwMDRjLAorICAgIDB4MDAwMDAwOWIsIDB4MDAwMDAxM2EsIDB4MDAwMDAyNzksIDB4MDAwMDAyNzAsIDB4MDAwMDA0ZWYsIDB4MDAwMDA0ZTIsCisgICAgMHgwMDAwMDllYSwgMHgwMDAwMDlkOCwgMHgwMDAwMTNkNywgMHgwMDAwMTNkMCwgMHgwMDAwMjdiMiwgMHgwMDAwMjdhMiwKKyAgICAweDAwMDAyNzFhLCAweDAwMDAyNzFiLCAweDAwMDA0ZjY2LCAweDAwMDA0ZjY3LCAweDAwMDA0ZjYxLCAweDAwMDA0ZjQ3LAorICAgIDB4MDAwMDRlZDksIDB4MDAwMDRlZDcsIDB4MDAwMDRlY2QsIDB4MDAwMDRlZDIsIDB4MDAwMDRlZDMsIDB4MDAwMDRlZDAsCisgICAgMHgwMDAwNGVkMX07CiAKLXN0YXRpYyBjb25zdCBJTlQgaWNjRGVsdGFfT2Zmc2V0ID0gIDc7CitzdGF0aWMgY29uc3QgSU5UIGljY0RlbHRhX09mZnNldCA9IDc7CiBzdGF0aWMgY29uc3QgSU5UIGljY0RlbHRhX01heFZhbCA9IDE0OwogLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaWNjRGVsdGFGcmVxICovCi1zdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YUZyZXFfTGVuZ3RoW10gPQotewotICAxNCwgICAgMTQsICAgIDEyLCAgICAxMCwgICAgIDcsICAgNSwgICAgIDMsICAgICAxLCAgICAgMiwgICAgIDQsCi0gICA2LCAgICAgOCwgICAgIDksICAgIDExLCAgICAxMwotfTsKLXN0YXRpYyBjb25zdCBVSU5UIGljY0RlbHRhRnJlcV9Db2RlW10gPQotewotICAweDAwMDAzZmZmLCAgMHgwMDAwM2ZmZSwgIDB4MDAwMDBmZmUsICAweDAwMDAwM2ZlLCAgMHgwMDAwMDA3ZSwgIDB4MDAwMDAwMWUsICAweDAwMDAwMDA2LCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDBlLAotICAweDAwMDAwMDNlLCAgMHgwMDAwMDBmZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwN2ZlLCAgMHgwMDAwMWZmZQotfTsKK3N0YXRpYyBjb25zdCBVSU5UIGljY0RlbHRhRnJlcV9MZW5ndGhbXSA9IHsxNCwgMTQsIDEyLCAxMCwgNywgNSwgIDMsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgIDQsICA2LCAgOCwgIDksIDExLCAxM307CitzdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YUZyZXFfQ29kZVtdID0geworICAgIDB4MDAwMDNmZmYsIDB4MDAwMDNmZmUsIDB4MDAwMDBmZmUsIDB4MDAwMDAzZmUsIDB4MDAwMDAwN2UsCisgICAgMHgwMDAwMDAxZSwgMHgwMDAwMDAwNiwgMDAwMDAwMDAwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwZSwKKyAgICAweDAwMDAwMDNlLCAweDAwMDAwMGZlLCAweDAwMDAwMWZlLCAweDAwMDAwN2ZlLCAweDAwMDAxZmZlfTsKIAogLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaWNjRGVsdGFUaW1lICovCi1zdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YVRpbWVfTGVuZ3RoW10gPQotewotICAxNCwgICAgMTMsICAgIDExLCAgICAgOSwgICAgIDcsICAgNSwgICAgIDMsICAgICAxLCAgICAgMiwgICAgIDQsCi0gICA2LCAgICAgOCwgICAgMTAsICAgIDEyLCAgICAxNAotfTsKLXN0YXRpYyBjb25zdCBVSU5UIGljY0RlbHRhVGltZV9Db2RlW10gPQotewotICAweDAwMDAzZmZlLCAgMHgwMDAwMWZmZSwgIDB4MDAwMDA3ZmUsICAweDAwMDAwMWZlLCAgMHgwMDAwMDA3ZSwgIDB4MDAwMDAwMWUsICAweDAwMDAwMDA2LCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDBlLAotICAweDAwMDAwMDNlLCAgMHgwMDAwMDBmZSwgIDB4MDAwMDAzZmUsICAweDAwMDAwZmZlLCAgMHgwMDAwM2ZmZgotfTsKLQotCitzdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YVRpbWVfTGVuZ3RoW10gPSB7MTQsIDEzLCAxMSwgOSwgNywgIDUsICAzLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICA0LCAgNiwgIDgsIDEwLCAxMiwgMTR9Oworc3RhdGljIGNvbnN0IFVJTlQgaWNjRGVsdGFUaW1lX0NvZGVbXSA9IHsKKyAgICAweDAwMDAzZmZlLCAweDAwMDAxZmZlLCAweDAwMDAwN2ZlLCAweDAwMDAwMWZlLCAweDAwMDAwMDdlLAorICAgIDB4MDAwMDAwMWUsIDB4MDAwMDAwMDYsIDAwMDAwMDAwMDAsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMGUsCisgICAgMHgwMDAwMDAzZSwgMHgwMDAwMDBmZSwgMHgwMDAwMDNmZSwgMHgwMDAwMGZmZSwgMHgwMDAwM2ZmZn07CiAKIHN0YXRpYyBjb25zdCBJTlQgaXBkRGVsdGFfT2Zmc2V0ID0gMDsKIHN0YXRpYyBjb25zdCBJTlQgaXBkRGVsdGFfTWF4VmFsID0gNzsKIC8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGlwZERlbHRhRnJlcSAqLwotc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFGcmVxX0xlbmd0aFtdID0KLXsKLSAgIDEsICAgICAzLCAgICAgNCwgICAgIDQsICAgICA0LCAgIDQsICAgICA0LCAgICAgNAotfTsKLXN0YXRpYyBjb25zdCBVSU5UIGlwZERlbHRhRnJlcV9Db2RlW10gPQotewotICAweDAwMDAwMDAxLCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDYsICAweDAwMDAwMDA0LCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMDMsICAweDAwMDAwMDA1LCAgMHgwMDAwMDAwNwotfTsKK3N0YXRpYyBjb25zdCBVSU5UIGlwZERlbHRhRnJlcV9MZW5ndGhbXSA9IHsxLCAzLCA0LCA0LCA0LCA0LCA0LCA0fTsKK3N0YXRpYyBjb25zdCBVSU5UIGlwZERlbHRhRnJlcV9Db2RlW10gPSB7MHgwMDAwMDAwMSwgMDAwMDAwMDAwMCwgMHgwMDAwMDAwNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNSwgMHgwMDAwMDAwN307CiAKIC8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGlwZERlbHRhVGltZSAqLwotc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFUaW1lX0xlbmd0aFtdID0KLXsKLSAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA1LCAgIDQsICAgICA0LCAgICAgMwotfTsKLXN0YXRpYyBjb25zdCBVSU5UIGlwZERlbHRhVGltZV9Db2RlW10gPQotewotICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAzLCAgMHgwMDAwMDAwMiwgIDAwMDAwMDAwMDAsICAweDAwMDAwMDAzLCAgMHgwMDAwMDAwMwotfTsKLQorc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFUaW1lX0xlbmd0aFtdID0gezEsIDMsIDQsIDUsIDUsIDQsIDQsIDN9Oworc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFUaW1lX0NvZGVbXSA9IHsweDAwMDAwMDAxLCAweDAwMDAwMDAyLCAweDAwMDAwMDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzLCAweDAwMDAwMDAyLCAwMDAwMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzLCAweDAwMDAwMDAzfTsKIAogc3RhdGljIGNvbnN0IElOVCBvcGREZWx0YV9PZmZzZXQgPSAwOwogc3RhdGljIGNvbnN0IElOVCBvcGREZWx0YV9NYXhWYWwgPSA3OwogLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogb3BkRGVsdGFGcmVxICovCi1zdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YUZyZXFfTGVuZ3RoW10gPQotewotICAgMSwgICAgIDMsICAgICA0LCAgICAgNCwgICAgIDUsICAgNSwgICAgIDQsICAgICAzCi19Owotc3RhdGljIGNvbnN0IFVJTlQgb3BkRGVsdGFGcmVxX0NvZGVbXSA9Ci17Ci0gIDB4MDAwMDAwMDEsICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwNiwgIDB4MDAwMDAwMDQsICAweDAwMDAwMDBmLCAgMHgwMDAwMDAwZSwgIDB4MDAwMDAwMDUsICAwMDAwMDAwMDAwLAorc3RhdGljIGNvbnN0IFVJTlQgb3BkRGVsdGFGcmVxX0xlbmd0aFtdID0gezEsIDMsIDQsIDQsIDUsIDUsIDQsIDN9Oworc3RhdGljIGNvbnN0IFVJTlQgb3BkRGVsdGFGcmVxX0NvZGVbXSA9IHsKKyAgICAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDA2LCAweDAwMDAwMDA0LAorICAgIDB4MDAwMDAwMGYsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMDUsIDAwMDAwMDAwMDAsCiB9OwogCiAvKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBvcGREZWx0YVRpbWUgKi8KLXN0YXRpYyBjb25zdCBVSU5UIG9wZERlbHRhVGltZV9MZW5ndGhbXSA9Ci17Ci0gICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNSwgICA0LCAgICAgNCwgICAgIDMKLX07Ci1zdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YVRpbWVfQ29kZVtdID0KLXsKLSAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwNywgIDB4MDAwMDAwMDYsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMDMKLX07CitzdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YVRpbWVfTGVuZ3RoW10gPSB7MSwgMywgNCwgNSwgNSwgNCwgNCwgM307CitzdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YVRpbWVfQ29kZVtdID0gezB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDYsIDAwMDAwMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDN9OwogCi1zdGF0aWMgSU5UIGdldE5vQmFuZHMoY29uc3QgSU5UIG1vZGUpCi17CitzdGF0aWMgSU5UIGdldE5vQmFuZHMoY29uc3QgSU5UIG1vZGUpIHsKICAgSU5UIG5vQmFuZHMgPSAwOwogCiAgIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2UgMDogY2FzZSAzOiAvKiBjb2Fyc2UgKi8KKyAgICBjYXNlIDA6CisgICAgY2FzZSAzOiAvKiBjb2Fyc2UgKi8KICAgICAgIG5vQmFuZHMgPSBQU19CQU5EU19DT0FSU0U7CiAgICAgICBicmVhazsKLSAgICBjYXNlIDE6IGNhc2UgNDogLyogbWlkICovCisgICAgY2FzZSAxOgorICAgIGNhc2UgNDogLyogbWlkICovCiAgICAgICBub0JhbmRzID0gUFNfQkFORFNfTUlEOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOiBjYXNlIDU6IC8qIGZpbmUgbm90IHN1cHBvcnRlZCAqLwotICAgIGRlZmF1bHQ6ICAgICAgICAvKiBjb2Fyc2UgYXMgZGVmYXVsdCAqLworICAgIGNhc2UgMjoKKyAgICBjYXNlIDU6ICAvKiBmaW5lIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBkZWZhdWx0OiAvKiBjb2Fyc2UgYXMgZGVmYXVsdCAqLwogICAgICAgbm9CYW5kcyA9IFBTX0JBTkRTX0NPQVJTRTsKICAgfQogCiAgIHJldHVybiBub0JhbmRzOwogfQogCi1zdGF0aWMgSU5UIGdldElJRFJlcyhJTlQgaWlkTW9kZSkKLXsKLSAgaWYoaWlkTW9kZTwzKQorc3RhdGljIElOVCBnZXRJSURSZXMoSU5UIGlpZE1vZGUpIHsKKyAgaWYgKGlpZE1vZGUgPCAzKQogICAgIHJldHVybiBQU19JSURfUkVTX0NPQVJTRTsKICAgZWxzZQogICAgIHJldHVybiBQU19JSURfUkVTX0ZJTkU7CiB9CiAKLXN0YXRpYyBJTlQKLWVuY29kZURlbHRhRnJlcShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAqdmFsLAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbkJhbmRzLAotICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKmNvZGVUYWJsZSwKLSAgICAgICAgICAgICAgICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZSwKLSAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIHRhYmxlT2Zmc2V0LAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbWF4VmFsLAotICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAqZXJyb3IpCi17CitzdGF0aWMgSU5UIGVuY29kZURlbHRhRnJlcShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCBjb25zdCBJTlQgKnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQmFuZHMsIGNvbnN0IFVJTlQgKmNvZGVUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlLCBjb25zdCBJTlQgdGFibGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWF4VmFsLCBJTlQgKmVycm9yKSB7CiAgIElOVCBiaXRDbnQgPSAwOwogICBJTlQgbGFzdFZhbCA9IDA7CiAgIElOVCBiYW5kOwogCi0gIGZvcihiYW5kPTA7YmFuZDxuQmFuZHM7YmFuZCsrKSB7CisgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBuQmFuZHM7IGJhbmQrKykgewogICAgIElOVCBkZWx0YSA9ICh2YWxbYmFuZF0gLSBsYXN0VmFsKSArIHRhYmxlT2Zmc2V0OwogICAgIGxhc3RWYWwgPSB2YWxbYmFuZF07Ci0gICAgaWYoIChkZWx0YT5tYXhWYWwpIHx8IChkZWx0YTwwKSApIHsKKyAgICBpZiAoKGRlbHRhID4gbWF4VmFsKSB8fCAoZGVsdGEgPCAwKSkgewogICAgICAgKmVycm9yID0gMTsKLSAgICAgIGRlbHRhID0gZGVsdGE+MD9tYXhWYWw6MDsKKyAgICAgIGRlbHRhID0gZGVsdGEgPiAwID8gbWF4VmFsIDogMDsKICAgICB9Ci0gICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgY29kZVRhYmxlW2RlbHRhXSwgbGVuZ3RoVGFibGVbZGVsdGFdKTsKKyAgICBiaXRDbnQgKz0KKyAgICAgICAgRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBjb2RlVGFibGVbZGVsdGFdLCBsZW5ndGhUYWJsZVtkZWx0YV0pOwogICB9CiAKICAgcmV0dXJuIGJpdENudDsKIH0KIAotc3RhdGljIElOVAotZW5jb2RlRGVsdGFUaW1lKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICp2YWwsCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICp2YWxMYXN0LAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbkJhbmRzLAotICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKmNvZGVUYWJsZSwKLSAgICAgICAgICAgICAgICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZSwKLSAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIHRhYmxlT2Zmc2V0LAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbWF4VmFsLAotICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAqZXJyb3IpCi17CitzdGF0aWMgSU5UIGVuY29kZURlbHRhVGltZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCBjb25zdCBJTlQgKnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqdmFsTGFzdCwgY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKmNvZGVUYWJsZSwgY29uc3QgVUlOVCAqbGVuZ3RoVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdGFibGVPZmZzZXQsIGNvbnN0IElOVCBtYXhWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmVycm9yKSB7CiAgIElOVCBiaXRDbnQgPSAwOwogICBJTlQgYmFuZDsKIAotICBmb3IoYmFuZD0wO2JhbmQ8bkJhbmRzO2JhbmQrKykgeworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbkJhbmRzOyBiYW5kKyspIHsKICAgICBJTlQgZGVsdGEgPSAodmFsW2JhbmRdIC0gdmFsTGFzdFtiYW5kXSkgKyB0YWJsZU9mZnNldDsKLSAgICBpZiggKGRlbHRhPm1heFZhbCkgfHwgKGRlbHRhPDApICkgeworICAgIGlmICgoZGVsdGEgPiBtYXhWYWwpIHx8IChkZWx0YSA8IDApKSB7CiAgICAgICAqZXJyb3IgPSAxOwotICAgICAgZGVsdGEgPSBkZWx0YT4wP21heFZhbDowOworICAgICAgZGVsdGEgPSBkZWx0YSA+IDAgPyBtYXhWYWwgOiAwOwogICAgIH0KLSAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBjb2RlVGFibGVbZGVsdGFdLCBsZW5ndGhUYWJsZVtkZWx0YV0pOworICAgIGJpdENudCArPQorICAgICAgICBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIGNvZGVUYWJsZVtkZWx0YV0sIGxlbmd0aFRhYmxlW2RlbHRhXSk7CiAgIH0KIAogICByZXR1cm4gYml0Q250OwogfQogCi1JTlQgRkRLc2JyRW5jX0VuY29kZUlpZChIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgKmlpZFZhbCwKLSAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgKmlpZFZhbExhc3QsCi0gICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICBuQmFuZHMsCi0gICAgICAgICAgICAgIGNvbnN0IFBTX0lJRF9SRVNPTFVUSU9OICByZXMsCi0gICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICAgICAgICAgICBtb2RlLAotICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAqZXJyb3IpCi17CitJTlQgRkRLc2JyRW5jX0VuY29kZUlpZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCBjb25zdCBJTlQgKmlpZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqaWlkVmFsTGFzdCwgY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0lJRF9SRVNPTFVUSU9OIHJlcywgY29uc3QgUFNfREVMVEEgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqZXJyb3IpIHsKICAgY29uc3QgVUlOVCAqY29kZVRhYmxlOwogICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZTsKICAgSU5UIGJpdENudCA9IDA7CiAKICAgYml0Q250ID0gMDsKIAotICBzd2l0Y2gobW9kZSkgewotICBjYXNlIFBTX0RFTFRBX0ZSRVE6Ci0gICAgc3dpdGNoKHJlcykgewotICAgIGNhc2UgUFNfSUlEX1JFU19DT0FSU0U6Ci0gICAgICBjb2RlVGFibGUgICA9IGlpZERlbHRhRnJlcUNvYXJzZV9Db2RlOwotICAgICAgbGVuZ3RoVGFibGUgPSBpaWREZWx0YUZyZXFDb2Fyc2VfTGVuZ3RoOwotICAgICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBpaWRWYWwsIG5CYW5kcywgY29kZVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWlkRGVsdGFDb2Fyc2VfT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWREZWx0YUNvYXJzZV9NYXhWYWwsIGVycm9yKTsKLSAgICBicmVhazsKLSAgICBjYXNlIFBTX0lJRF9SRVNfRklORToKLSAgICAgIGNvZGVUYWJsZSAgID0gaWlkRGVsdGFGcmVxRmluZV9Db2RlOwotICAgICAgbGVuZ3RoVGFibGUgPSBpaWREZWx0YUZyZXFGaW5lX0xlbmd0aDsKLSAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1ZiwgaWlkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGlpZERlbHRhRmluZV9PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZERlbHRhRmluZV9NYXhWYWwsIGVycm9yKTsKLSAgICBicmVhazsKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBQU19ERUxUQV9GUkVROgorICAgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgICAgY2FzZSBQU19JSURfUkVTX0NPQVJTRToKKyAgICAgICAgICBjb2RlVGFibGUgPSBpaWREZWx0YUZyZXFDb2Fyc2VfQ29kZTsKKyAgICAgICAgICBsZW5ndGhUYWJsZSA9IGlpZERlbHRhRnJlcUNvYXJzZV9MZW5ndGg7CisgICAgICAgICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBpaWRWYWwsIG5CYW5kcywgY29kZVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGlpZERlbHRhQ29hcnNlX09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZERlbHRhQ29hcnNlX01heFZhbCwgZXJyb3IpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBTX0lJRF9SRVNfRklORToKKyAgICAgICAgICBjb2RlVGFibGUgPSBpaWREZWx0YUZyZXFGaW5lX0NvZGU7CisgICAgICAgICAgbGVuZ3RoVGFibGUgPSBpaWREZWx0YUZyZXFGaW5lX0xlbmd0aDsKKyAgICAgICAgICBiaXRDbnQgKz0KKyAgICAgICAgICAgICAgZW5jb2RlRGVsdGFGcmVxKGhCaXRCdWYsIGlpZFZhbCwgbkJhbmRzLCBjb2RlVGFibGUsIGxlbmd0aFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkRGVsdGFGaW5lX09mZnNldCwgaWlkRGVsdGFGaW5lX01heFZhbCwgZXJyb3IpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICplcnJvciA9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUFNfREVMVEFfVElNRToKKyAgICAgIHN3aXRjaCAocmVzKSB7CisgICAgICAgIGNhc2UgUFNfSUlEX1JFU19DT0FSU0U6CisgICAgICAgICAgY29kZVRhYmxlID0gaWlkRGVsdGFUaW1lQ29hcnNlX0NvZGU7CisgICAgICAgICAgbGVuZ3RoVGFibGUgPSBpaWREZWx0YVRpbWVDb2Fyc2VfTGVuZ3RoOworICAgICAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YVRpbWUoCisgICAgICAgICAgICAgIGhCaXRCdWYsIGlpZFZhbCwgaWlkVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsIGxlbmd0aFRhYmxlLAorICAgICAgICAgICAgICBpaWREZWx0YUNvYXJzZV9PZmZzZXQsIGlpZERlbHRhQ29hcnNlX01heFZhbCwgZXJyb3IpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBTX0lJRF9SRVNfRklORToKKyAgICAgICAgICBjb2RlVGFibGUgPSBpaWREZWx0YVRpbWVGaW5lX0NvZGU7CisgICAgICAgICAgbGVuZ3RoVGFibGUgPSBpaWREZWx0YVRpbWVGaW5lX0xlbmd0aDsKKyAgICAgICAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIGlpZFZhbCwgaWlkVmFsTGFzdCwgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZVRhYmxlLCBsZW5ndGhUYWJsZSwgaWlkRGVsdGFGaW5lX09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZERlbHRhRmluZV9NYXhWYWwsIGVycm9yKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAqZXJyb3IgPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisKICAgICBkZWZhdWx0OgogICAgICAgKmVycm9yID0gMTsKLSAgICB9Ci0gICAgYnJlYWs7CisgIH0KIAotICBjYXNlIFBTX0RFTFRBX1RJTUU6Ci0gICAgc3dpdGNoKHJlcykgewotICAgIGNhc2UgUFNfSUlEX1JFU19DT0FSU0U6Ci0gICAgICBjb2RlVGFibGUgICA9IGlpZERlbHRhVGltZUNvYXJzZV9Db2RlOwotICAgICAgbGVuZ3RoVGFibGUgPSBpaWREZWx0YVRpbWVDb2Fyc2VfTGVuZ3RoOwotICAgICAgYml0Q250ICs9IGVuY29kZURlbHRhVGltZShoQml0QnVmLCBpaWRWYWwsIGlpZFZhbExhc3QsIG5CYW5kcywgY29kZVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWlkRGVsdGFDb2Fyc2VfT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWREZWx0YUNvYXJzZV9NYXhWYWwsIGVycm9yKTsKLSAgICBicmVhazsKLSAgICBjYXNlIFBTX0lJRF9SRVNfRklORToKLSAgICAgIGNvZGVUYWJsZSAgID0gaWlkRGVsdGFUaW1lRmluZV9Db2RlOwotICAgICAgbGVuZ3RoVGFibGUgPSBpaWREZWx0YVRpbWVGaW5lX0xlbmd0aDsKLSAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YVRpbWUoaEJpdEJ1ZiwgaWlkVmFsLCBpaWRWYWxMYXN0LCBuQmFuZHMsIGNvZGVUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGlpZERlbHRhRmluZV9PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZERlbHRhRmluZV9NYXhWYWwsIGVycm9yKTsKLSAgICBicmVhazsKKyAgcmV0dXJuIGJpdENudDsKK30KKworSU5UIEZES3NickVuY19FbmNvZGVJY2MoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwgY29uc3QgSU5UICppY2NWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmljY1ZhbExhc3QsIGNvbnN0IElOVCBuQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSBtb2RlLCBJTlQgKmVycm9yKSB7CisgIGNvbnN0IFVJTlQgKmNvZGVUYWJsZTsKKyAgY29uc3QgVUlOVCAqbGVuZ3RoVGFibGU7CisgIElOVCBiaXRDbnQgPSAwOworCisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgUFNfREVMVEFfRlJFUToKKyAgICAgIGNvZGVUYWJsZSA9IGljY0RlbHRhRnJlcV9Db2RlOworICAgICAgbGVuZ3RoVGFibGUgPSBpY2NEZWx0YUZyZXFfTGVuZ3RoOworICAgICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBpY2NWYWwsIG5CYW5kcywgY29kZVRhYmxlLCBsZW5ndGhUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjRGVsdGFfT2Zmc2V0LCBpY2NEZWx0YV9NYXhWYWwsIGVycm9yKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQU19ERUxUQV9USU1FOgorICAgICAgY29kZVRhYmxlID0gaWNjRGVsdGFUaW1lX0NvZGU7CisgICAgICBsZW5ndGhUYWJsZSA9IGljY0RlbHRhVGltZV9MZW5ndGg7CisKKyAgICAgIGJpdENudCArPQorICAgICAgICAgIGVuY29kZURlbHRhVGltZShoQml0QnVmLCBpY2NWYWwsIGljY1ZhbExhc3QsIG5CYW5kcywgY29kZVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWNjRGVsdGFfT2Zmc2V0LCBpY2NEZWx0YV9NYXhWYWwsIGVycm9yKTsKKyAgICAgIGJyZWFrOworCiAgICAgZGVmYXVsdDoKICAgICAgICplcnJvciA9IDE7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgKmVycm9yID0gMTsKICAgfQogCiAgIHJldHVybiBiaXRDbnQ7CiB9CiAKLQotSU5UIEZES3NickVuY19FbmNvZGVJY2MoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmljY1ZhbCwKLSAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmljY1ZhbExhc3QsCi0gICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQmFuZHMsCi0gICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICBtb2RlLAotICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqZXJyb3IpCi17CitJTlQgRkRLc2JyRW5jX0VuY29kZUlwZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCBjb25zdCBJTlQgKmlwZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqaXBkVmFsTGFzdCwgY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBIG1vZGUsIElOVCAqZXJyb3IpIHsKICAgY29uc3QgVUlOVCAqY29kZVRhYmxlOwogICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZTsKICAgSU5UIGJpdENudCA9IDA7CiAKLSAgc3dpdGNoKG1vZGUpIHsKLSAgY2FzZSBQU19ERUxUQV9GUkVROgotICAgIGNvZGVUYWJsZSAgID0gaWNjRGVsdGFGcmVxX0NvZGU7Ci0gICAgbGVuZ3RoVGFibGUgPSBpY2NEZWx0YUZyZXFfTGVuZ3RoOwotICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1ZiwgaWNjVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpY2NEZWx0YV9PZmZzZXQsIGljY0RlbHRhX01heFZhbCwgZXJyb3IpOwotICAgIGJyZWFrOworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFBTX0RFTFRBX0ZSRVE6CisgICAgICBjb2RlVGFibGUgPSBpcGREZWx0YUZyZXFfQ29kZTsKKyAgICAgIGxlbmd0aFRhYmxlID0gaXBkRGVsdGFGcmVxX0xlbmd0aDsKKyAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1ZiwgaXBkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwgbGVuZ3RoVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwZERlbHRhX09mZnNldCwgaXBkRGVsdGFfTWF4VmFsLCBlcnJvcik7CisgICAgICBicmVhazsKIAotICBjYXNlIFBTX0RFTFRBX1RJTUU6Ci0gICAgY29kZVRhYmxlICAgPSBpY2NEZWx0YVRpbWVfQ29kZTsKLSAgICBsZW5ndGhUYWJsZSA9IGljY0RlbHRhVGltZV9MZW5ndGg7CisgICAgY2FzZSBQU19ERUxUQV9USU1FOgorICAgICAgY29kZVRhYmxlID0gaXBkRGVsdGFUaW1lX0NvZGU7CisgICAgICBsZW5ndGhUYWJsZSA9IGlwZERlbHRhVGltZV9MZW5ndGg7CiAKLSAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIGljY1ZhbCwgaWNjVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWNjRGVsdGFfT2Zmc2V0LCBpY2NEZWx0YV9NYXhWYWwsIGVycm9yKTsKLSAgICBicmVhazsKKyAgICAgIGJpdENudCArPQorICAgICAgICAgIGVuY29kZURlbHRhVGltZShoQml0QnVmLCBpcGRWYWwsIGlwZFZhbExhc3QsIG5CYW5kcywgY29kZVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaXBkRGVsdGFfT2Zmc2V0LCBpcGREZWx0YV9NYXhWYWwsIGVycm9yKTsKKyAgICAgIGJyZWFrOwogCi0gIGRlZmF1bHQ6Ci0gICAgKmVycm9yID0gMTsKKyAgICBkZWZhdWx0OgorICAgICAgKmVycm9yID0gMTsKICAgfQogCiAgIHJldHVybiBiaXRDbnQ7CiB9CiAKLUlOVCBGREtzYnJFbmNfRW5jb2RlSXBkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsCi0gICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppcGRWYWwsCi0gICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppcGRWYWxMYXN0LAotICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkJhbmRzLAotICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSAgbW9kZSwKLSAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKmVycm9yKQoteworSU5UIEZES3NickVuY19FbmNvZGVPcGQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwgY29uc3QgSU5UICpvcGRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKm9wZFZhbExhc3QsIGNvbnN0IElOVCBuQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSBtb2RlLCBJTlQgKmVycm9yKSB7CiAgIGNvbnN0IFVJTlQgKmNvZGVUYWJsZTsKICAgY29uc3QgVUlOVCAqbGVuZ3RoVGFibGU7CiAgIElOVCBiaXRDbnQgPSAwOwogCi0gIHN3aXRjaChtb2RlKSB7Ci0gIGNhc2UgUFNfREVMVEFfRlJFUToKLSAgICBjb2RlVGFibGUgICA9IGlwZERlbHRhRnJlcV9Db2RlOwotICAgIGxlbmd0aFRhYmxlID0gaXBkRGVsdGFGcmVxX0xlbmd0aDsKLSAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFGcmVxKGhCaXRCdWYsIGlwZFZhbCwgbkJhbmRzLCBjb2RlVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaXBkRGVsdGFfT2Zmc2V0LCBpcGREZWx0YV9NYXhWYWwsIGVycm9yKTsKLSAgICBicmVhazsKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBQU19ERUxUQV9GUkVROgorICAgICAgY29kZVRhYmxlID0gb3BkRGVsdGFGcmVxX0NvZGU7CisgICAgICBsZW5ndGhUYWJsZSA9IG9wZERlbHRhRnJlcV9MZW5ndGg7CisgICAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFGcmVxKGhCaXRCdWYsIG9wZFZhbCwgbkJhbmRzLCBjb2RlVGFibGUsIGxlbmd0aFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGREZWx0YV9PZmZzZXQsIG9wZERlbHRhX01heFZhbCwgZXJyb3IpOworICAgICAgYnJlYWs7CiAKLSAgY2FzZSBQU19ERUxUQV9USU1FOgotICAgIGNvZGVUYWJsZSAgID0gaXBkRGVsdGFUaW1lX0NvZGU7Ci0gICAgbGVuZ3RoVGFibGUgPSBpcGREZWx0YVRpbWVfTGVuZ3RoOworICAgIGNhc2UgUFNfREVMVEFfVElNRToKKyAgICAgIGNvZGVUYWJsZSA9IG9wZERlbHRhVGltZV9Db2RlOworICAgICAgbGVuZ3RoVGFibGUgPSBvcGREZWx0YVRpbWVfTGVuZ3RoOwogCi0gICAgYml0Q250ICs9IGVuY29kZURlbHRhVGltZShoQml0QnVmLCBpcGRWYWwsIGlwZFZhbExhc3QsIG5CYW5kcywgY29kZVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGlwZERlbHRhX09mZnNldCwgaXBkRGVsdGFfTWF4VmFsLCBlcnJvcik7Ci0gICAgYnJlYWs7CisgICAgICBiaXRDbnQgKz0KKyAgICAgICAgICBlbmNvZGVEZWx0YVRpbWUoaEJpdEJ1Ziwgb3BkVmFsLCBvcGRWYWxMYXN0LCBuQmFuZHMsIGNvZGVUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIG9wZERlbHRhX09mZnNldCwgb3BkRGVsdGFfTWF4VmFsLCBlcnJvcik7CisgICAgICBicmVhazsKIAotICBkZWZhdWx0OgotICAgICplcnJvciA9IDE7CisgICAgZGVmYXVsdDoKKyAgICAgICplcnJvciA9IDE7CiAgIH0KIAogICByZXR1cm4gYml0Q250OwogfQogCi1JTlQgRkRLc2JyRW5jX0VuY29kZU9wZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLAotICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqb3BkVmFsLAotICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqb3BkVmFsTGFzdCwKLSAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5CYW5kcywKLSAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgIG1vZGUsCi0gICAgICAgICAgICAgIElOVCAgICAgICAgICAgICplcnJvcikKLXsKLSAgY29uc3QgVUlOVCAqY29kZVRhYmxlOwotICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZTsKK3N0YXRpYyBJTlQgZW5jb2RlSXBkT3BkKEhBTkRMRV9QU19PVVQgcHNPdXQsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYpIHsKICAgSU5UIGJpdENudCA9IDA7Ci0KLSAgc3dpdGNoKG1vZGUpIHsKLSAgY2FzZSBQU19ERUxUQV9GUkVROgotICAgIGNvZGVUYWJsZSAgID0gb3BkRGVsdGFGcmVxX0NvZGU7Ci0gICAgbGVuZ3RoVGFibGUgPSBvcGREZWx0YUZyZXFfTGVuZ3RoOwotICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1Ziwgb3BkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBvcGREZWx0YV9PZmZzZXQsIG9wZERlbHRhX01heFZhbCwgZXJyb3IpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgUFNfREVMVEFfVElNRToKLSAgICBjb2RlVGFibGUgICA9IG9wZERlbHRhVGltZV9Db2RlOwotICAgIGxlbmd0aFRhYmxlID0gb3BkRGVsdGFUaW1lX0xlbmd0aDsKLQotICAgIGJpdENudCArPSBlbmNvZGVEZWx0YVRpbWUoaEJpdEJ1Ziwgb3BkVmFsLCBvcGRWYWxMYXN0LCBuQmFuZHMsIGNvZGVUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBvcGREZWx0YV9PZmZzZXQsIG9wZERlbHRhX01heFZhbCwgZXJyb3IpOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgKmVycm9yID0gMTsKLSAgfQotCi0gIHJldHVybiBiaXRDbnQ7Ci19Ci0KLXN0YXRpYyBJTlQgZW5jb2RlSXBkT3BkKEhBTkRMRV9QU19PVVQgICAgICAgIHBzT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiApCi17Ci0gIElOVCBiaXRDbnQgPSAwOwotICBJTlQgZXJyb3IgID0gMDsKKyAgSU5UIGVycm9yID0gMDsKICAgSU5UIGVudjsKIAogICBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIHBzT3V0LT5lbmFibGVJcGRPcGQsIDEpOwogCi0gIGlmKHBzT3V0LT5lbmFibGVJcGRPcGQ9PTEpIHsKKyAgaWYgKHBzT3V0LT5lbmFibGVJcGRPcGQgPT0gMSkgewogICAgIElOVCAqaXBkTGFzdCA9IHBzT3V0LT5pcGRMYXN0OwogICAgIElOVCAqb3BkTGFzdCA9IHBzT3V0LT5vcGRMYXN0OwogCi0gICAgZm9yKGVudj0wOyBlbnY8cHNPdXQtPm5FbnZlbG9wZXM7IGVudisrKSB7Ci0gICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmRlbHRhSVBEW2Vudl0sIDEpOwotICAgICAgYml0Q250ICs9IEZES3NickVuY19FbmNvZGVJcGQoIGhCaXRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+aXBkW2Vudl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpcGRMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9CYW5kcyhwc091dC0+aWlkTW9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+ZGVsdGFJUERbZW52XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgICAgZm9yIChlbnYgPSAwOyBlbnYgPCBwc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKKyAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIHBzT3V0LT5kZWx0YUlQRFtlbnZdLCAxKTsKKyAgICAgIGJpdENudCArPSBGREtzYnJFbmNfRW5jb2RlSXBkKGhCaXRCdWYsIHBzT3V0LT5pcGRbZW52XSwgaXBkTGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vQmFuZHMocHNPdXQtPmlpZE1vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNPdXQtPmRlbHRhSVBEW2Vudl0sICZlcnJvcik7CiAKLSAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZGVsdGFPUERbZW52XSwgMSk7Ci0gICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX0VuY29kZU9wZCggaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5vcGRbZW52XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZExhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb0JhbmRzKHBzT3V0LT5paWRNb2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5kZWx0YU9QRFtlbnZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICk7CisgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBwc091dC0+ZGVsdGFPUERbZW52XSwgMSk7CisgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX0VuY29kZU9wZChoQml0QnVmLCBwc091dC0+b3BkW2Vudl0sIG9wZExhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb0JhbmRzKHBzT3V0LT5paWRNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5kZWx0YU9QRFtlbnZdLCAmZXJyb3IpOwogICAgIH0KICAgICAvKiByZXNlcnZlZCBiaXQgKi8KLSAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgMCwgMSk7CisgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgMCwgMSk7CiAgIH0KIAotCiAgIHJldHVybiBiaXRDbnQ7CiB9CiAKLXN0YXRpYyBJTlQgZ2V0RW52SWR4KGNvbnN0IElOVCBuRW52ZWxvcGVzLCBjb25zdCBJTlQgZnJhbWVDbGFzcykKLXsKK3N0YXRpYyBJTlQgZ2V0RW52SWR4KGNvbnN0IElOVCBuRW52ZWxvcGVzLCBjb25zdCBJTlQgZnJhbWVDbGFzcykgewogICBJTlQgZW52SWR4ID0gMDsKIAotICBzd2l0Y2gobkVudmVsb3BlcykgewotICBjYXNlIDA6Ci0gICAgZW52SWR4ID0gMDsKLSAgICBicmVhazsKLQotICBjYXNlIDE6Ci0gICAgaWYgKGZyYW1lQ2xhc3M9PTApCi0gICAgICBlbnZJZHggPSAxOwotICAgIGVsc2UKKyAgc3dpdGNoIChuRW52ZWxvcGVzKSB7CisgICAgY2FzZSAwOgogICAgICAgZW52SWR4ID0gMDsKLSAgICBicmVhazsKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgMjoKLSAgICBpZiAoZnJhbWVDbGFzcz09MCkKKyAgICBjYXNlIDE6CisgICAgICBpZiAoZnJhbWVDbGFzcyA9PSAwKQorICAgICAgICBlbnZJZHggPSAxOworICAgICAgZWxzZQorICAgICAgICBlbnZJZHggPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgICBpZiAoZnJhbWVDbGFzcyA9PSAwKQorICAgICAgICBlbnZJZHggPSAyOworICAgICAgZWxzZQorICAgICAgICBlbnZJZHggPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDM6CiAgICAgICBlbnZJZHggPSAyOwotICAgIGVsc2UKLSAgICAgIGVudklkeCA9IDE7Ci0gICAgYnJlYWs7CisgICAgICBicmVhazsKIAotICBjYXNlIDM6Ci0gICAgZW52SWR4ID0gMjsKLSAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBlbnZJZHggPSAzOworICAgICAgYnJlYWs7CiAKLSAgY2FzZSA0OgotICAgIGVudklkeCA9IDM7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICAvKiB1bnN1cHBvcnRlZCBudW1iZXIgb2YgZW52ZWxvcGVzICovCi0gICAgZW52SWR4ID0gMDsKKyAgICBkZWZhdWx0OgorICAgICAgLyogdW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGVudmVsb3BlcyAqLworICAgICAgZW52SWR4ID0gMDsKICAgfQogCiAgIHJldHVybiBlbnZJZHg7CiB9CiAKLQotc3RhdGljIElOVCBlbmNvZGVQU0V4dGVuc2lvbihjb25zdCBIQU5ETEVfUFNfT1VUICAgcHNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0QnVmICkKLXsKK3N0YXRpYyBJTlQgZW5jb2RlUFNFeHRlbnNpb24oY29uc3QgSEFORExFX1BTX09VVCBwc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZikgewogICBJTlQgYml0Q250ID0gMDsKIAotICBpZihwc091dC0+ZW5hYmxlSXBkT3BkPT0xKSB7CisgIGlmIChwc091dC0+ZW5hYmxlSXBkT3BkID09IDEpIHsKICAgICBJTlQgaXBkT3BkQml0cyA9IDA7Ci0gICAgSU5UIGV4dFNpemUgPSAoMiArIGVuY29kZUlwZE9wZChwc091dCxOVUxMKSs3KT4+MzsKKyAgICBJTlQgZXh0U2l6ZSA9ICgyICsgZW5jb2RlSXBkT3BkKHBzT3V0LCBOVUxMKSArIDcpID4+IDM7CiAKLSAgICBpZihleHRTaXplPDE1KSB7Ci0gICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCAgZXh0U2l6ZSwgNCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgICAgICAgICAgMTUgLCA0KTsKLSAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIChleHRTaXplLTE1KSwgOCk7CisgICAgaWYgKGV4dFNpemUgPCAxNSkgeworICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgZXh0U2l6ZSwgNCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIDE1LCA0KTsKKyAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIChleHRTaXplIC0gMTUpLCA4KTsKICAgICB9CiAKICAgICAvKiB3cml0ZSBpcGQgb3BkIGRhdGEgKi8KICAgICBpcGRPcGRCaXRzICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgUFNfRVhUX0lEX1YwLCAyKTsKLSAgICBpcGRPcGRCaXRzICs9IGVuY29kZUlwZE9wZChwc091dCwgaEJpdEJ1ZiApOworICAgIGlwZE9wZEJpdHMgKz0gZW5jb2RlSXBkT3BkKHBzT3V0LCBoQml0QnVmKTsKIAogICAgIC8qIGJ5dGUgYWxpZ24gdGhlIGlwZCBvcGQgZGF0YSAgKi8KLSAgICBpZihpcGRPcGRCaXRzJTgpCi0gICAgICBpcGRPcGRCaXRzICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgMCwgKDgtKGlwZE9wZEJpdHMlOCkpICk7CisgICAgaWYgKGlwZE9wZEJpdHMgJSA4KQorICAgICAgaXBkT3BkQml0cyArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIDAsICg4IC0gKGlwZE9wZEJpdHMgJSA4KSkpOwogCiAgICAgYml0Q250ICs9IGlwZE9wZEJpdHM7CiAgIH0KQEAgLTYxNyw3NyArNTUyLDY5IEBACiAgIHJldHVybiAoYml0Q250KTsKIH0KIAotSU5UIEZES3NickVuY19Xcml0ZVBTQml0c3RyZWFtKGNvbnN0IEhBTkRMRV9QU19PVVQgICBwc091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdEJ1ZiApCi17CitJTlQgRkRLc2JyRW5jX1dyaXRlUFNCaXRzdHJlYW0oY29uc3QgSEFORExFX1BTX09VVCBwc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmKSB7CiAgIElOVCBwc0V4dEVuYWJsZSA9IDA7CiAgIElOVCBiaXRDbnQgPSAwOwogICBJTlQgZXJyb3IgPSAwOwogICBJTlQgZW52OwogCi0gIGlmKHBzT3V0ICE9IE5VTEwpewotCisgIGlmIChwc091dCAhPSBOVUxMKSB7CiAgICAgLyogUFMgSEVBREVSICovCi0gICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5lbmFibGVQU0hlYWRlciwgMSk7CisgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZVBTSGVhZGVyLCAxKTsKIAotICAgIGlmKHBzT3V0LT5lbmFibGVQU0hlYWRlcikgewotCi0gICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZUlJRCwgMSk7Ci0gICAgICBpZihwc091dC0+ZW5hYmxlSUlEKSB7Ci0gICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+aWlkTW9kZSwgMyk7CisgICAgaWYgKHBzT3V0LT5lbmFibGVQU0hlYWRlcikgeworICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZUlJRCwgMSk7CisgICAgICBpZiAocHNPdXQtPmVuYWJsZUlJRCkgeworICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBwc091dC0+aWlkTW9kZSwgMyk7CiAgICAgICB9Ci0gICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZUlDQywgMSk7Ci0gICAgICBpZihwc091dC0+ZW5hYmxlSUNDKSB7Ci0gICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+aWNjTW9kZSwgMyk7CisgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBwc091dC0+ZW5hYmxlSUNDLCAxKTsKKyAgICAgIGlmIChwc091dC0+ZW5hYmxlSUNDKSB7CisgICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIHBzT3V0LT5pY2NNb2RlLCAzKTsKICAgICAgIH0KLSAgICAgIGlmKHBzT3V0LT5lbmFibGVJcGRPcGQpIHsKKyAgICAgIGlmIChwc091dC0+ZW5hYmxlSXBkT3BkKSB7CiAgICAgICAgIHBzRXh0RW5hYmxlID0gMTsKICAgICAgIH0KLSAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc0V4dEVuYWJsZSwgMSk7CisgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBwc0V4dEVuYWJsZSwgMSk7CiAgICAgfQogCiAgICAgLyogRnJhbWUgY2xhc3MsIG51bWJlciBvZiBlbnZlbG9wZXMgKi8KLSAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmZyYW1lQ2xhc3MsIDEpOwotICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBnZXRFbnZJZHgocHNPdXQtPm5FbnZlbG9wZXMsIHBzT3V0LT5mcmFtZUNsYXNzKSwgMik7CisgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgcHNPdXQtPmZyYW1lQ2xhc3MsIDEpOworICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKAorICAgICAgICBoQml0QnVmLCBnZXRFbnZJZHgocHNPdXQtPm5FbnZlbG9wZXMsIHBzT3V0LT5mcmFtZUNsYXNzKSwgMik7CiAKLSAgICBpZihwc091dC0+ZnJhbWVDbGFzcz09MSkgewotICAgICAgZm9yKGVudj0wOyBlbnY8cHNPdXQtPm5FbnZlbG9wZXM7IGVudisrKSB7Ci0gICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZnJhbWVCb3JkZXJbZW52XSwgNSk7CisgICAgaWYgKHBzT3V0LT5mcmFtZUNsYXNzID09IDEpIHsKKyAgICAgIGZvciAoZW52ID0gMDsgZW52IDwgcHNPdXQtPm5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIHBzT3V0LT5mcmFtZUJvcmRlcltlbnZdLCA1KTsKICAgICAgIH0KICAgICB9CiAKLSAgICBpZihwc091dC0+ZW5hYmxlSUlEPT0xKSB7CisgICAgaWYgKHBzT3V0LT5lbmFibGVJSUQgPT0gMSkgewogICAgICAgSU5UICppaWRMYXN0ID0gcHNPdXQtPmlpZExhc3Q7Ci0gICAgICBmb3IoZW52PTA7IGVudjxwc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKLSAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5kZWx0YUlJRFtlbnZdLCAxKTsKLSAgICAgICAgYml0Q250ICs9IEZES3NickVuY19FbmNvZGVJaWQoIGhCaXRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5paWRbZW52XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkTGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9CYW5kcyhwc091dC0+aWlkTW9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU19JSURfUkVTT0xVVElPTilnZXRJSURSZXMocHNPdXQtPmlpZE1vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+ZGVsdGFJSURbZW52XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICk7CisgICAgICBmb3IgKGVudiA9IDA7IGVudiA8IHBzT3V0LT5uRW52ZWxvcGVzOyBlbnYrKykgeworICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBwc091dC0+ZGVsdGFJSURbZW52XSwgMSk7CisgICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfRW5jb2RlSWlkKAorICAgICAgICAgICAgaEJpdEJ1ZiwgcHNPdXQtPmlpZFtlbnZdLCBpaWRMYXN0LCBnZXROb0JhbmRzKHBzT3V0LT5paWRNb2RlKSwKKyAgICAgICAgICAgIChQU19JSURfUkVTT0xVVElPTilnZXRJSURSZXMocHNPdXQtPmlpZE1vZGUpLCBwc091dC0+ZGVsdGFJSURbZW52XSwKKyAgICAgICAgICAgICZlcnJvcik7CiAKICAgICAgICAgaWlkTGFzdCA9IHBzT3V0LT5paWRbZW52XTsKICAgICAgIH0KICAgICB9CiAKLSAgICBpZihwc091dC0+ZW5hYmxlSUNDPT0xKSB7CisgICAgaWYgKHBzT3V0LT5lbmFibGVJQ0MgPT0gMSkgewogICAgICAgSU5UICppY2NMYXN0ID0gcHNPdXQtPmljY0xhc3Q7Ci0gICAgICBmb3IoZW52PTA7IGVudjxwc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKLSAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5kZWx0YUlDQ1tlbnZdLCAxKTsKLSAgICAgICAgYml0Q250ICs9IEZES3NickVuY19FbmNvZGVJY2MoIGhCaXRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5pY2NbZW52XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjTGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9CYW5kcyhwc091dC0+aWNjTW9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5kZWx0YUlDQ1tlbnZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgICAgZm9yIChlbnYgPSAwOyBlbnYgPCBwc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKKyAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgcHNPdXQtPmRlbHRhSUNDW2Vudl0sIDEpOworICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX0VuY29kZUljYyhoQml0QnVmLCBwc091dC0+aWNjW2Vudl0sIGljY0xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vQmFuZHMocHNPdXQtPmljY01vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+ZGVsdGFJQ0NbZW52XSwgJmVycm9yKTsKIAogICAgICAgICBpY2NMYXN0ID0gcHNPdXQtPmljY1tlbnZdOwogICAgICAgfQogICAgIH0KIAotICAgIGlmKHBzRXh0RW5hYmxlIT0wKSB7CisgICAgaWYgKHBzRXh0RW5hYmxlICE9IDApIHsKICAgICAgIGJpdENudCArPSBlbmNvZGVQU0V4dGVuc2lvbihwc091dCwgaEJpdEJ1Zik7CiAgICAgfQogCkBAIC02OTUsNCArNjIyLDMgQEAKIAogICByZXR1cm4gYml0Q250OwogfQotCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3BzX2JpdGVuYy5oIGIvbGliU0JSZW5jL3NyYy9wc19iaXRlbmMuaAppbmRleCBlOThmZTU4Li4xZDM4M2UzIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3BzX2JpdGVuYy5oCisrKyBiL2xpYlNCUmVuYy9zcmMvcHNfYml0ZW5jLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE4uIFJldHRlbGJhY2gKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQYXJhbWV0cmljIFN0ZXJlbyBiaXRzdHJlYW0gZW5jb2RlcgorICAgQXV0aG9yKHMpOiAgIE4uIFJldHRlbGJhY2gKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBhcmFtZXRyaWMgU3RlcmVvIGJpdHN0cmVhbSBlbmNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJwc19tYWluLmgiCiAjaW5jbHVkZSAicHNfY29uc3QuaCIKQEAgLTk2LDgyICsxMDgsNjYgQEAKICNkZWZpbmUgUFNfQklURU5DX0gKIAogdHlwZWRlZiBzdHJ1Y3QgVF9QU19PVVQgeworICBJTlQgZW5hYmxlUFNIZWFkZXI7CisgIElOVCBlbmFibGVJSUQ7CisgIElOVCBpaWRNb2RlOworICBJTlQgZW5hYmxlSUNDOworICBJTlQgaWNjTW9kZTsKKyAgSU5UIGVuYWJsZUlwZE9wZDsKIAotICBJTlQgICAgICAgICBlbmFibGVQU0hlYWRlcjsKLSAgSU5UICAgICAgICAgZW5hYmxlSUlEOwotICBJTlQgICAgICAgICBpaWRNb2RlOwotICBJTlQgICAgICAgICBlbmFibGVJQ0M7Ci0gIElOVCAgICAgICAgIGljY01vZGU7Ci0gIElOVCAgICAgICAgIGVuYWJsZUlwZE9wZDsKLQotICBJTlQgICAgICAgICBmcmFtZUNsYXNzOwotICBJTlQgICAgICAgICBuRW52ZWxvcGVzOworICBJTlQgZnJhbWVDbGFzczsKKyAgSU5UIG5FbnZlbG9wZXM7CiAgIC8qIEVOViBkYXRhICovCi0gIElOVCAgICAgICAgIGZyYW1lQm9yZGVyW1BTX01BWF9FTlZFTE9QRVNdOworICBJTlQgZnJhbWVCb3JkZXJbUFNfTUFYX0VOVkVMT1BFU107CiAKICAgLyogaWlkIGRhdGEgICovCi0gIFBTX0RFTFRBICAgIGRlbHRhSUlEW1BTX01BWF9FTlZFTE9QRVNdOwotICBJTlQgICAgICAgICBpaWRbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKLSAgSU5UICAgICAgICAgaWlkTGFzdFtQU19NQVhfQkFORFNdOworICBQU19ERUxUQSBkZWx0YUlJRFtQU19NQVhfRU5WRUxPUEVTXTsKKyAgSU5UIGlpZFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBJTlQgaWlkTGFzdFtQU19NQVhfQkFORFNdOwogCiAgIC8qIGljYyBkYXRhICAqLwotICBQU19ERUxUQSAgICBkZWx0YUlDQ1tQU19NQVhfRU5WRUxPUEVTXTsKLSAgSU5UICAgICAgICAgaWNjW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107Ci0gIElOVCAgICAgICAgIGljY0xhc3RbUFNfTUFYX0JBTkRTXTsKKyAgUFNfREVMVEEgZGVsdGFJQ0NbUFNfTUFYX0VOVkVMT1BFU107CisgIElOVCBpY2NbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKKyAgSU5UIGljY0xhc3RbUFNfTUFYX0JBTkRTXTsKIAogICAvKiBpcGQgZGF0YSAgKi8KLSAgUFNfREVMVEEgICAgZGVsdGFJUERbUFNfTUFYX0VOVkVMT1BFU107Ci0gIElOVCAgICAgICAgIGlwZFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOwotICBJTlQgICAgICAgICBpcGRMYXN0W1BTX01BWF9CQU5EU107CisgIFBTX0RFTFRBIGRlbHRhSVBEW1BTX01BWF9FTlZFTE9QRVNdOworICBJTlQgaXBkW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107CisgIElOVCBpcGRMYXN0W1BTX01BWF9CQU5EU107CiAKICAgLyogb3BkIGRhdGEgICovCi0gIFBTX0RFTFRBICAgIGRlbHRhT1BEW1BTX01BWF9FTlZFTE9QRVNdOwotICBJTlQgICAgICAgICBvcGRbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKLSAgSU5UICAgICAgICAgb3BkTGFzdFtQU19NQVhfQkFORFNdOworICBQU19ERUxUQSBkZWx0YU9QRFtQU19NQVhfRU5WRUxPUEVTXTsKKyAgSU5UIG9wZFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBJTlQgb3BkTGFzdFtQU19NQVhfQkFORFNdOwogCiB9IFBTX09VVCwgKkhBTkRMRV9QU19PVVQ7CiAKLQogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCi1JTlQgRkRLc2JyRW5jX0VuY29kZUlpZChIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppaWRWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaWlkVmFsTGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU19JSURfUkVTT0xVVElPTiByZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICplcnJvcik7CitJTlQgRkRLc2JyRW5jX0VuY29kZUlpZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCBjb25zdCBJTlQgKmlpZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqaWlkVmFsTGFzdCwgY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0lJRF9SRVNPTFVUSU9OIHJlcywgY29uc3QgUFNfREVMVEEgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqZXJyb3IpOwogCi1JTlQgRkRLc2JyRW5jX0VuY29kZUljYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppY2NWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaWNjVmFsTGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICplcnJvcik7CitJTlQgRkRLc2JyRW5jX0VuY29kZUljYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCBjb25zdCBJTlQgKmljY1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqaWNjVmFsTGFzdCwgY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBIG1vZGUsIElOVCAqZXJyb3IpOwogCi1JTlQgRkRLc2JyRW5jX0VuY29kZUlwZChIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppcGRWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaXBkVmFsTGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICplcnJvcik7CitJTlQgRkRLc2JyRW5jX0VuY29kZUlwZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCBjb25zdCBJTlQgKmlwZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqaXBkVmFsTGFzdCwgY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBIG1vZGUsIElOVCAqZXJyb3IpOwogCi1JTlQgRkRLc2JyRW5jX0VuY29kZU9wZChIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpvcGRWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqb3BkVmFsTGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICplcnJvcik7CitJTlQgRkRLc2JyRW5jX0VuY29kZU9wZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCBjb25zdCBJTlQgKm9wZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqb3BkVmFsTGFzdCwgY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBIG1vZGUsIElOVCAqZXJyb3IpOwogCi1JTlQgRkRLc2JyRW5jX1dyaXRlUFNCaXRzdHJlYW0oY29uc3QgSEFORExFX1BTX09VVCAgIHBzT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0QnVmKTsKLQorSU5UIEZES3NickVuY19Xcml0ZVBTQml0c3RyZWFtKGNvbnN0IEhBTkRMRV9QU19PVVQgcHNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1Zik7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAKLQotI2VuZGlmICAvKiAjaWZuZGVmIFBTX0JJVEVOQ19IICovCisjZW5kaWYgLyogZGVmaW5lZChQU0VOQ19FTkFCTEUpICovCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3BzX2NvbnN0LmggYi9saWJTQlJlbmMvc3JjL3BzX2NvbnN0LmgKaW5kZXggNjMzZDIxMC4uYjlhMzNmOSAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9wc19jb25zdC5oCisrKyBiL2xpYlNCUmVuYy9zcmMvcHNfY29uc3QuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw1NiArOTAsNDYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUcgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTi4gUmV0dGVsYmFjaAotICAgY29udGVudHMvZGVzY3JpcHRpb246IFBhcmFtZXRyaWMgU3RlcmVvIGNvbnN0YW50cworICAgQXV0aG9yKHMpOiAgIE4uIFJldHRlbGJhY2gKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBhcmFtZXRyaWMgU3RlcmVvIGNvbnN0YW50cworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFBTX0NPTlNUX0gKICNkZWZpbmUgUFNfQ09OU1RfSAogCi0jZGVmaW5lIE1BWF9QU19DSEFOTkVMUyAgICAgICAgICAoICAyICkKLSNkZWZpbmUgSFlCUklEX01BWF9RTUZfQkFORFMgICAgICggIDMgKQotI2RlZmluZSBIWUJSSURfRklMVEVSX0xFTkdUSCAgICAgKCAxMyApCi0jZGVmaW5lIEhZQlJJRF9GSUxURVJfREVMQVkgICAgICAoIChIWUJSSURfRklMVEVSX0xFTkdUSC0xKS8yICkKKyNkZWZpbmUgTUFYX1BTX0NIQU5ORUxTICgyKQorI2RlZmluZSBIWUJSSURfTUFYX1FNRl9CQU5EUyAoMykKKyNkZWZpbmUgSFlCUklEX0ZJTFRFUl9MRU5HVEggKDEzKQorI2RlZmluZSBIWUJSSURfRklMVEVSX0RFTEFZICgoSFlCUklEX0ZJTFRFUl9MRU5HVEggLSAxKSAvIDIpCiAKLSNkZWZpbmUgIEhZQlJJRF9GUkFNRVNJWkUgICAgICAgICggUU1GX01BWF9USU1FX1NMT1RTICkKLSNkZWZpbmUgIEhZQlJJRF9SRUFEX09GRlNFVCAgICAgICggMTAgKQorI2RlZmluZSBIWUJSSURfRlJBTUVTSVpFICgzMikKKyNkZWZpbmUgSFlCUklEX1JFQURfT0ZGU0VUICgxMCkKIAotI2RlZmluZSBNQVhfSFlCUklEX0JBTkRTICAgICAgICAgKCAoUU1GX0NIQU5ORUxTLUhZQlJJRF9NQVhfUU1GX0JBTkRTKzEwKSApCi0KKyNkZWZpbmUgTUFYX0hZQlJJRF9CQU5EUyAoKDY0IC0gSFlCUklEX01BWF9RTUZfQkFORFMgKyAxMCkpCiAKIHR5cGVkZWYgZW51bSB7Ci0gIFBTX1JFU19DT0FSU0UgID0gMCwKLSAgUFNfUkVTX01JRCAgICAgPSAxLAotICBQU19SRVNfRklORSAgICA9IDIKKyAgUFNfUkVTX0NPQVJTRSA9IDAsCisgIFBTX1JFU19NSUQgPSAxLAorICBQU19SRVNfRklORSA9IDIKIH0gUFNfUkVTT0xVVElPTjsKIAogdHlwZWRlZiBlbnVtIHsKLSAgUFNfQkFORFNfQ09BUlNFICA9IDEwLAotICBQU19CQU5EU19NSUQgICAgID0gMjAsCi0gIFBTX01BWF9CQU5EUyAgICAgPSBQU19CQU5EU19NSUQKKyAgUFNfQkFORFNfQ09BUlNFID0gMTAsCisgIFBTX0JBTkRTX01JRCA9IDIwLAorICBQU19NQVhfQkFORFMgPSBQU19CQU5EU19NSUQKIH0gUFNfQkFORFM7CiAKLXR5cGVkZWYgZW51bSB7Ci0gIFBTX0lJRF9SRVNfQ09BUlNFPTAsCi0gIFBTX0lJRF9SRVNfRklORQotfSBQU19JSURfUkVTT0xVVElPTjsKK3R5cGVkZWYgZW51bSB7IFBTX0lJRF9SRVNfQ09BUlNFID0gMCwgUFNfSUlEX1JFU19GSU5FIH0gUFNfSUlEX1JFU09MVVRJT047CiAKLXR5cGVkZWYgZW51bSB7Ci0gIFBTX0lDQ19ST1RfQT0wLAotICBQU19JQ0NfUk9UX0IKLX0gUFNfSUNDX1JPVEFUSU9OX01PREU7Cit0eXBlZGVmIGVudW0geyBQU19JQ0NfUk9UX0EgPSAwLCBQU19JQ0NfUk9UX0IgfSBQU19JQ0NfUk9UQVRJT05fTU9ERTsKIAotdHlwZWRlZiBlbnVtIHsKLSAgUFNfREVMVEFfRlJFUSwKLSAgUFNfREVMVEFfVElNRQotfSBQU19ERUxUQTsKLQordHlwZWRlZiBlbnVtIHsgUFNfREVMVEFfRlJFUSwgUFNfREVMVEFfVElNRSB9IFBTX0RFTFRBOwogCiB0eXBlZGVmIGVudW0gewogICBQU19NQVhfRU5WRUxPUEVTID0gNApAQCAtMTM2LDEzICsxMzcsMTQgQEAKIH0gUFNfQ09OU1RTOwogCiB0eXBlZGVmIGVudW0gewotICAgIFBTRU5DX09LICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMCwgICAvKiE8IE5vIGVycm9yIGhhcHBlbmVkLiBBbGwgZmluZS4gKi8KLSAgICBQU0VOQ19JTlZBTElEX0hBTkRMRSAgICAgICAgPSAweDAwMjAsICAgLyohPCBIYW5kbGUgcGFzc2VkIHRvIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQuICovCi0gICAgUFNFTkNfTUVNT1JZX0VSUk9SICAgICAgICAgID0gMHgwMDIxLCAgIC8qITwgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwotICAgIFBTRU5DX0lOSVRfRVJST1IgICAgICAgICAgICA9IDB4MDA0MCwgICAvKiE8IEdlbmVyYWwgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCi0gICAgUFNFTkNfRU5DT0RFX0VSUk9SICAgICAgICAgID0gMHgwMDYwICAgIC8qITwgVGhlIGVuY29kaW5nIHByb2Nlc3Mgd2FzIGludGVycnVwdGVkIGJ5IGFuIHVuZXhwZWN0ZWQgZXJyb3IuICovCisgIFBTRU5DX09LID0gMHgwMDAwLCAvKiE8IE5vIGVycm9yIGhhcHBlbmVkLiBBbGwgZmluZS4gKi8KKyAgUFNFTkNfSU5WQUxJRF9IQU5ETEUgPQorICAgICAgMHgwMDIwLCAvKiE8IEhhbmRsZSBwYXNzZWQgdG8gZnVuY3Rpb24gY2FsbCB3YXMgaW52YWxpZC4gKi8KKyAgUFNFTkNfTUVNT1JZX0VSUk9SID0gMHgwMDIxLCAvKiE8IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KKyAgUFNFTkNfSU5JVF9FUlJPUiA9IDB4MDA0MCwgICAvKiE8IEdlbmVyYWwgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCisgIFBTRU5DX0VOQ09ERV9FUlJPUiA9IDB4MDA2MCAgLyohPCBUaGUgZW5jb2RpbmcgcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnkgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkIGVycm9yLiAqLwogCiB9IEZES19QU0VOQ19FUlJPUjsKIAotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvcHNfZW5jb2RlLmNwcCBiL2xpYlNCUmVuYy9zcmMvcHNfZW5jb2RlLmNwcAppbmRleCBmZWMzOWU4Li44OGQzMTMxIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3BzX2VuY29kZS5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy9wc19lbmNvZGUuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDEyMSArOTAsMTA5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBBdXRob3JzOiAgICAgIE0uIE5ldWVuZG9yZiwgTi4gUmV0dGVsYmFjaCwgTS4gTXVsdHJ1cwotICAgQ29udGVudHMvRGVzY3JpcHRpb246IFBTIHBhcmFtZXRlciBleHRyYWN0aW9uLCBlbmNvZGluZworICAgQXV0aG9yKHMpOiAgIE0uIE5ldWVuZG9yZiwgTi4gUmV0dGVsYmFjaCwgTS4gTXVsdHJ1cwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUFMgcGFyYW1ldGVyIGV4dHJhY3Rpb24sIGVuY29kaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIFBTIHBhcmFtZXRlciBleHRyYWN0aW9uLCBlbmNvZGluZyBmdW5jdGlvbnMgIAorICBcYnJpZWYgIFBTIHBhcmFtZXRlciBleHRyYWN0aW9uLCBlbmNvZGluZyBmdW5jdGlvbnMgJFJldmlzaW9uOiA5NjQ0MSAkCiAqLwogCiAjaW5jbHVkZSAicHNfbWFpbi5oIgotCi0KLSNpbmNsdWRlICJzYnJfcmFtLmgiCiAjaW5jbHVkZSAicHNfZW5jb2RlLmgiCi0KICNpbmNsdWRlICJxbWYuaCIKLQotI2luY2x1ZGUgInBzX2NvbnN0LmgiCiAjaW5jbHVkZSAic2JyX21pc2MuaCIKKyNpbmNsdWRlICJzYnJlbmNfcmFtLmgiCiAKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCi1pbmxpbmUgdm9pZCBGREtzYnJFbmNfYWRkRklYUF9EQkwoY29uc3QgRklYUF9EQkwgKlgsIGNvbnN0IEZJWFBfREJMICpZLCBGSVhQX0RCTCAqWiwgSU5UIG4pCi17Ci0gIGZvciAoSU5UIGk9MDsgaTxuOyBpKyspCi0gICAgWltpXSA9IChYW2ldPj4xKSArIChZW2ldPj4xKTsKK2lubGluZSB2b2lkIEZES3NickVuY19hZGRGSVhQX0RCTChjb25zdCBGSVhQX0RCTCAqWCwgY29uc3QgRklYUF9EQkwgKlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlosIElOVCBuKSB7CisgIGZvciAoSU5UIGkgPSAwOyBpIDwgbjsgaSsrKSBaW2ldID0gKFhbaV0gPj4gMSkgKyAoWVtpXSA+PiAxKTsKIH0KIAotI2RlZmluZSBMT0cxMF8yXzEwICAgICAgICAgICAgIDMuMDEwMjk5OTU2NjRmIC8qIDEwLjBmKmxvZzEwKDIuZikgKi8KKyNkZWZpbmUgTE9HMTBfMl8xMCAzLjAxMDI5OTk1NjY0ZiAvKiAxMC4wZipsb2cxMCgyLmYpICovCiAKLXN0YXRpYyBjb25zdCBJTlQgaWlkR3JvdXBCb3JkZXJzTG9SZXNbUU1GX0dST1VQU19MT19SRVMgKyBTVUJRTUZfR1JPVVBTX0xPX1JFUyArIDFdID0KLXsKLSAgMCwgMSwgMiwgMywgNCwgNSwgICAgLyogNiBzdWJxbWYgc3ViYmFuZHMgLSAwdGggcW1mIHN1YmJhbmQgKi8KLSAgNiwgNywgICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAxc3QgcW1mIHN1YmJhbmQgKi8KLSAgOCwgOSwgICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAybmQgcW1mIHN1YmJhbmQgKi8KLSAgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE4LCAyMSwgMjUsIDMwLCA0MiwgNzEKLX07CitzdGF0aWMgY29uc3QgSU5UCisgICAgaWlkR3JvdXBCb3JkZXJzTG9SZXNbUU1GX0dST1VQU19MT19SRVMgKyBTVUJRTUZfR1JPVVBTX0xPX1JFUyArIDFdID0geworICAgICAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIC8qIDYgc3VicW1mIHN1YmJhbmRzIC0gMHRoIHFtZiBzdWJiYW5kICovCisgICAgICAgIDYsICA3LCAgICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAxc3QgcW1mIHN1YmJhbmQgKi8KKyAgICAgICAgOCwgIDksICAgICAgICAgICAgICAgICAvKiAyIHN1YnFtZiBzdWJiYW5kcyAtIDJuZCBxbWYgc3ViYmFuZCAqLworICAgICAgICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTgsIDIxLCAyNSwgMzAsIDQyLCA3MX07CiAKLXN0YXRpYyBjb25zdCBVQ0hBUiBpaWRHcm91cFdpZHRoTGRMb1Jlc1tRTUZfR1JPVVBTX0xPX1JFUyArIFNVQlFNRl9HUk9VUFNfTE9fUkVTXSA9Ci17Ci0gIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsCi0gIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDIsIDIsIDMsIDQsIDUKLX07Ci0KK3N0YXRpYyBjb25zdCBVQ0hBUgorICAgIGlpZEdyb3VwV2lkdGhMZExvUmVzW1FNRl9HUk9VUFNfTE9fUkVTICsgU1VCUU1GX0dST1VQU19MT19SRVNdID0geworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAyLCAyLCAzLCA0LCA1fTsKIAogc3RhdGljIGNvbnN0IElOVCBzdWJiYW5kMnBhcmFtZXRlcjIwW1FNRl9HUk9VUFNfTE9fUkVTICsgU1VCUU1GX0dST1VQU19MT19SRVNdID0KLXsKLSAgMSwgMCwgMCwgMSwgMiwgMywgICAvKiA2IHN1YnFtZiBzdWJiYW5kcyAtIDB0aCBxbWYgc3ViYmFuZCAqLwotICA0LCA1LCAgICAgICAgICAgICAgIC8qIDIgc3VicW1mIHN1YmJhbmRzIC0gMXN0IHFtZiBzdWJiYW5kICovCi0gIDYsIDcsICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAybmQgcW1mIHN1YmJhbmQgKi8KLSAgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTkKLX07Ci0KKyAgICB7MSwgMCwgMCwgIDEsICAyLCAgMywgLyogNiBzdWJxbWYgc3ViYmFuZHMgLSAwdGggcW1mIHN1YmJhbmQgKi8KKyAgICAgNCwgNSwgICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAxc3QgcW1mIHN1YmJhbmQgKi8KKyAgICAgNiwgNywgICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAybmQgcW1mIHN1YmJhbmQgKi8KKyAgICAgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTl9OwogCiB0eXBlZGVmIGVudW0gewogICBNQVhfVElNRV9ESUZGX0ZSQU1FUyA9IDIwLAotICBNQVhfUFNfTk9IRUFERVJfQ05UICA9IDEwLAotICBNQVhfTk9FTlZfQ05UICAgICAgICA9IDEwLAorICBNQVhfUFNfTk9IRUFERVJfQ05UID0gMTAsCisgIE1BWF9OT0VOVl9DTlQgPSAxMCwKICAgRE9fTk9UX1VTRV9USElTX01PREUgPSAweDdGRkZGRgogfSBfX1BTX0NPTlNUQU5UUzsKIAotCi0KIHN0YXRpYyBjb25zdCBGSVhQX0RCTCBpaWRRdWFudF9meFsxNV0gPSB7Ci0gIChGSVhQX0RCTCkweGNlMDAwMDAwLCAoRklYUF9EQkwpMHhkYzAwMDAwMCwgKEZJWFBfREJMKTB4ZTQwMDAwMDAsIChGSVhQX0RCTCkweGVjMDAwMDAwLCAoRklYUF9EQkwpMHhmMjAwMDAwMCwgKEZJWFBfREJMKTB4ZjgwMDAwMDAsIChGSVhQX0RCTCkweGZjMDAwMDAwLCAoRklYUF9EQkwpMHgwMDAwMDAwMCwKLSAgKEZJWFBfREJMKTB4MDQwMDAwMDAsIChGSVhQX0RCTCkweDA4MDAwMDAwLCAoRklYUF9EQkwpMHgwZTAwMDAwMCwgKEZJWFBfREJMKTB4MTQwMDAwMDAsIChGSVhQX0RCTCkweDFjMDAwMDAwLCAoRklYUF9EQkwpMHgyNDAwMDAwMCwgKEZJWFBfREJMKTB4MzIwMDAwMDAKLX07CisgICAgKEZJWFBfREJMKTB4Y2UwMDAwMDAsIChGSVhQX0RCTCkweGRjMDAwMDAwLCAoRklYUF9EQkwpMHhlNDAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHhlYzAwMDAwMCwgKEZJWFBfREJMKTB4ZjIwMDAwMDAsIChGSVhQX0RCTCkweGY4MDAwMDAwLAorICAgIChGSVhQX0RCTCkweGZjMDAwMDAwLCAoRklYUF9EQkwpMHgwMDAwMDAwMCwgKEZJWFBfREJMKTB4MDQwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4MDgwMDAwMDAsIChGSVhQX0RCTCkweDBlMDAwMDAwLCAoRklYUF9EQkwpMHgxNDAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHgxYzAwMDAwMCwgKEZJWFBfREJMKTB4MjQwMDAwMDAsIChGSVhQX0RCTCkweDMyMDAwMDAwfTsKIAogc3RhdGljIGNvbnN0IEZJWFBfREJMIGlpZFF1YW50RmluZV9meFszMV0gPSB7Ci0gIChGSVhQX0RCTCkweDljMDAwMDAxLCAoRklYUF9EQkwpMHhhNjAwMDAwMSwgKEZJWFBfREJMKTB4YjAwMDAwMDEsIChGSVhQX0RCTCkweGJhMDAwMDAxLCAoRklYUF9EQkwpMHhjNDAwMDAwMCwgKEZJWFBfREJMKTB4Y2UwMDAwMDAsIChGSVhQX0RCTCkweGQ0MDAwMDAwLCAoRklYUF9EQkwpMHhkYTAwMDAwMCwKLSAgKEZJWFBfREJMKTB4ZTAwMDAwMDAsIChGSVhQX0RCTCkweGU2MDAwMDAwLCAoRklYUF9EQkwpMHhlYzAwMDAwMCwgKEZJWFBfREJMKTB4ZjAwMDAwMDAsIChGSVhQX0RCTCkweGY0MDAwMDAwLCAoRklYUF9EQkwpMHhmODAwMDAwMCwgKEZJWFBfREJMKTB4ZmMwMDAwMDAsIChGSVhQX0RCTCkweDAwMDAwMDAwLAotICAoRklYUF9EQkwpMHgwNDAwMDAwMCwgKEZJWFBfREJMKTB4MDgwMDAwMDAsIChGSVhQX0RCTCkweDBjMDAwMDAwLCAoRklYUF9EQkwpMHgxMDAwMDAwMCwgKEZJWFBfREJMKTB4MTQwMDAwMDAsIChGSVhQX0RCTCkweDFhMDAwMDAwLCAoRklYUF9EQkwpMHgyMDAwMDAwMCwgKEZJWFBfREJMKTB4MjYwMDAwMDAsCi0gIChGSVhQX0RCTCkweDJjMDAwMDAwLCAoRklYUF9EQkwpMHgzMjAwMDAwMCwgKEZJWFBfREJMKTB4M2MwMDAwMDAsIChGSVhQX0RCTCkweDQ1ZmZmZmZmLCAoRklYUF9EQkwpMHg0ZmZmZmZmZiwgKEZJWFBfREJMKTB4NTlmZmZmZmYsIChGSVhQX0RCTCkweDYzZmZmZmZmCi19OwotCi0KKyAgICAoRklYUF9EQkwpMHg5YzAwMDAwMSwgKEZJWFBfREJMKTB4YTYwMDAwMDEsIChGSVhQX0RCTCkweGIwMDAwMDAxLAorICAgIChGSVhQX0RCTCkweGJhMDAwMDAxLCAoRklYUF9EQkwpMHhjNDAwMDAwMCwgKEZJWFBfREJMKTB4Y2UwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4ZDQwMDAwMDAsIChGSVhQX0RCTCkweGRhMDAwMDAwLCAoRklYUF9EQkwpMHhlMDAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHhlNjAwMDAwMCwgKEZJWFBfREJMKTB4ZWMwMDAwMDAsIChGSVhQX0RCTCkweGYwMDAwMDAwLAorICAgIChGSVhQX0RCTCkweGY0MDAwMDAwLCAoRklYUF9EQkwpMHhmODAwMDAwMCwgKEZJWFBfREJMKTB4ZmMwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4MDAwMDAwMDAsIChGSVhQX0RCTCkweDA0MDAwMDAwLCAoRklYUF9EQkwpMHgwODAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHgwYzAwMDAwMCwgKEZJWFBfREJMKTB4MTAwMDAwMDAsIChGSVhQX0RCTCkweDE0MDAwMDAwLAorICAgIChGSVhQX0RCTCkweDFhMDAwMDAwLCAoRklYUF9EQkwpMHgyMDAwMDAwMCwgKEZJWFBfREJMKTB4MjYwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4MmMwMDAwMDAsIChGSVhQX0RCTCkweDMyMDAwMDAwLCAoRklYUF9EQkwpMHgzYzAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHg0NWZmZmZmZiwgKEZJWFBfREJMKTB4NGZmZmZmZmYsIChGSVhQX0RCTCkweDU5ZmZmZmZmLAorICAgIChGSVhQX0RCTCkweDYzZmZmZmZmfTsKIAogc3RhdGljIGNvbnN0IEZJWFBfREJMIGljY1F1YW50WzhdID0gewotICAoRklYUF9EQkwpMHg3ZmZmZmZmZiwgKEZJWFBfREJMKTB4NzdlZjlkN2YsIChGSVhQX0RCTCkweDZiYWJjOTdmLCAoRklYUF9EQkwpMHg0Y2VhZjI3ZiwgKEZJWFBfREJMKTB4MmYwZWQzYzAsIChGSVhQX0RCTCkweDAwMDAwMDAwLCAoRklYUF9EQkwpMHhiNDliYTYwMSwgKEZJWFBfREJMKTB4ODAwMDAwMDAKLX07CisgICAgKEZJWFBfREJMKTB4N2ZmZmZmZmYsIChGSVhQX0RCTCkweDc3ZWY5ZDdmLCAoRklYUF9EQkwpMHg2YmFiYzk3ZiwKKyAgICAoRklYUF9EQkwpMHg0Y2VhZjI3ZiwgKEZJWFBfREJMKTB4MmYwZWQzYzAsIChGSVhQX0RCTCkweDAwMDAwMDAwLAorICAgIChGSVhQX0RCTCkweGI0OWJhNjAxLCAoRklYUF9EQkwpMHg4MDAwMDAwMH07CiAKLXN0YXRpYyBGREtfUFNFTkNfRVJST1IgSW5pdFBTRGF0YSgKLSAgICAgICAgSEFORExFX1BTX0RBVEEgICAgICAgICAgICBoUHNEYXRhCi0gICAgICAgICkKLXsKK3N0YXRpYyBGREtfUFNFTkNfRVJST1IgSW5pdFBTRGF0YShIQU5ETEVfUFNfREFUQSBoUHNEYXRhKSB7CiAgIEZES19QU0VOQ19FUlJPUiBlcnJvciA9IFBTRU5DX09LOwogCi0gIGlmKGhQc0RhdGEgPT0gTlVMTCkgeworICBpZiAoaFBzRGF0YSA9PSBOVUxMKSB7CiAgICAgZXJyb3IgPSBQU0VOQ19JTlZBTElEX0hBTkRMRTsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBpbnQgaSwgZW52OwotICAgIEZES21lbWNsZWFyKGhQc0RhdGEsc2l6ZW9mKFBTX0RBVEEpKTsKKyAgICBGREttZW1jbGVhcihoUHNEYXRhLCBzaXplb2YoUFNfREFUQSkpOwogCi0gICAgZm9yIChpPTA7IGk8UFNfTUFYX0JBTkRTOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUFNfTUFYX0JBTkRTOyBpKyspIHsKICAgICAgIGhQc0RhdGEtPmlpZElkeExhc3RbaV0gPSAwOwogICAgICAgaFBzRGF0YS0+aWNjSWR4TGFzdFtpXSA9IDA7CiAgICAgfQogCi0gICAgaFBzRGF0YS0+aWlkRW5hYmxlICAgID0gaFBzRGF0YS0+aWlkRW5hYmxlTGFzdCA9IDA7Ci0gICAgaFBzRGF0YS0+aWNjRW5hYmxlICAgID0gaFBzRGF0YS0+aWNjRW5hYmxlTGFzdCA9IDA7CisgICAgaFBzRGF0YS0+aWlkRW5hYmxlID0gaFBzRGF0YS0+aWlkRW5hYmxlTGFzdCA9IDA7CisgICAgaFBzRGF0YS0+aWNjRW5hYmxlID0gaFBzRGF0YS0+aWNjRW5hYmxlTGFzdCA9IDA7CiAgICAgaFBzRGF0YS0+aWlkUXVhbnRNb2RlID0gaFBzRGF0YS0+aWlkUXVhbnRNb2RlTGFzdCA9IFBTX0lJRF9SRVNfQ09BUlNFOwogICAgIGhQc0RhdGEtPmljY1F1YW50TW9kZSA9IGhQc0RhdGEtPmljY1F1YW50TW9kZUxhc3QgPSBQU19JQ0NfUk9UX0E7CiAKLSAgICBmb3IoZW52PTA7IGVudjxQU19NQVhfRU5WRUxPUEVTOyBlbnYrKykgeworICAgIGZvciAoZW52ID0gMDsgZW52IDwgUFNfTUFYX0VOVkVMT1BFUzsgZW52KyspIHsKICAgICAgIGhQc0RhdGEtPmljY0RpZmZNb2RlW2Vudl0gPSBQU19ERUxUQV9GUkVROwogICAgICAgaFBzRGF0YS0+aWNjRGlmZk1vZGVbZW52XSA9IFBTX0RFTFRBX0ZSRVE7CiAKLSAgICAgIGZvciAoaT0wOyBpPFBTX01BWF9CQU5EUzsgaSsrKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgUFNfTUFYX0JBTkRTOyBpKyspIHsKICAgICAgICAgaFBzRGF0YS0+aWlkSWR4W2Vudl1baV0gPSAwOwogICAgICAgICBoUHNEYXRhLT5pY2NJZHhbZW52XVtpXSA9IDA7CiAgICAgICB9CkBAIC0yMDEsOTQgKzIwMCw4NCBAQAogCiAgICAgaFBzRGF0YS0+bkVudmVsb3Blc0xhc3QgPSAwOwogCi0gICAgaFBzRGF0YS0+aGVhZGVyQ250ICA9IE1BWF9QU19OT0hFQURFUl9DTlQ7CisgICAgaFBzRGF0YS0+aGVhZGVyQ250ID0gTUFYX1BTX05PSEVBREVSX0NOVDsKICAgICBoUHNEYXRhLT5paWRUaW1lQ250ID0gTUFYX1RJTUVfRElGRl9GUkFNRVM7CiAgICAgaFBzRGF0YS0+aWNjVGltZUNudCA9IE1BWF9USU1FX0RJRkZfRlJBTUVTOwotICAgIGhQc0RhdGEtPm5vRW52Q250ICAgPSBNQVhfTk9FTlZfQ05UOworICAgIGhQc0RhdGEtPm5vRW52Q250ID0gTUFYX05PRU5WX0NOVDsKICAgfQogCiAgIHJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIEZJWFBfREJMIHF1YW50aXplQ29lZiggY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBxdWFudFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIGlkeE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuUXVhbnRTdGVwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICpSRVNUUklDVCBxdWFudE91dCkKLXsKK3N0YXRpYyBGSVhQX0RCTCBxdWFudGl6ZUNvZWYoY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIGlucHV0LCBjb25zdCBJTlQgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgcXVhbnRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGlkeE9mZnNldCwgY29uc3QgSU5UIG5RdWFudFN0ZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIHF1YW50T3V0KSB7CiAgIElOVCBpZHgsIGJhbmQ7CiAgIEZJWFBfREJMIHF1YW50RXJyID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKIAotICBmb3IgKGJhbmQ9MDsgYmFuZDxuQmFuZHM7YmFuZCsrKSB7Ci0gICAgZm9yKGlkeD0wOyBpZHg8blF1YW50U3RlcHMtMTsgaWR4KyspewotICAgICAgaWYoIGZpeHBfYWJzKChpbnB1dFtiYW5kXT4+MSktKHF1YW50VGFibGVbaWR4KzFdPj4xKSkgPgotICAgICAgICAgIGZpeHBfYWJzKChpbnB1dFtiYW5kXT4+MSktKHF1YW50VGFibGVbaWR4XT4+MSkpICkKLSAgICAgIHsKKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG5CYW5kczsgYmFuZCsrKSB7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBuUXVhbnRTdGVwcyAtIDE7IGlkeCsrKSB7CisgICAgICBpZiAoZml4cF9hYnMoKGlucHV0W2JhbmRdID4+IDEpIC0gKHF1YW50VGFibGVbaWR4ICsgMV0gPj4gMSkpID4KKyAgICAgICAgICBmaXhwX2FicygoaW5wdXRbYmFuZF0gPj4gMSkgLSAocXVhbnRUYWJsZVtpZHhdID4+IDEpKSkgewogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9Ci0gICAgcXVhbnRFcnIgICAgICArPSAoZml4cF9hYnMoaW5wdXRbYmFuZF0tcXVhbnRUYWJsZVtpZHhdKT4+UFNfUVVBTlRfU0NBTEUpOyAgIC8qIGRvbid0IHNjYWxlIGJlZm9yZSBzdWJ0cmFjdGlvbjsgZGlmZiBzbWFsbGVyICg2NC0yNSkvNjQgKi8KKyAgICBxdWFudEVyciArPSAoZml4cF9hYnMoaW5wdXRbYmFuZF0gLSBxdWFudFRhYmxlW2lkeF0pID4+CisgICAgICAgICAgICAgICAgIFBTX1FVQU5UX1NDQUxFKTsgLyogZG9uJ3Qgc2NhbGUgYmVmb3JlIHN1YnRyYWN0aW9uOyBkaWZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxlciAoNjQtMjUpLzY0ICovCiAgICAgcXVhbnRPdXRbYmFuZF0gPSBpZHggLSBpZHhPZmZzZXQ7CiAgIH0KIAogICByZXR1cm4gcXVhbnRFcnI7CiB9CiAKLXN0YXRpYyBJTlQgZ2V0SUNDTW9kZShjb25zdCBJTlQgbkJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCByb3RUeXBlKQoteworc3RhdGljIElOVCBnZXRJQ0NNb2RlKGNvbnN0IElOVCBuQmFuZHMsIGNvbnN0IElOVCByb3RUeXBlKSB7CiAgIElOVCBtb2RlID0gMDsKIAotICBzd2l0Y2gobkJhbmRzKSB7Ci0gIGNhc2UgUFNfQkFORFNfQ09BUlNFOgotICAgIG1vZGUgPSBQU19SRVNfQ09BUlNFOwotICAgIGJyZWFrOwotICBjYXNlIFBTX0JBTkRTX01JRDoKLSAgICBtb2RlID0gUFNfUkVTX01JRDsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBtb2RlID0gMDsKKyAgc3dpdGNoIChuQmFuZHMpIHsKKyAgICBjYXNlIFBTX0JBTkRTX0NPQVJTRToKKyAgICAgIG1vZGUgPSBQU19SRVNfQ09BUlNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU19CQU5EU19NSUQ6CisgICAgICBtb2RlID0gUFNfUkVTX01JRDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBtb2RlID0gMDsKICAgfQotICBpZihyb3RUeXBlPT1QU19JQ0NfUk9UX0IpeworICBpZiAocm90VHlwZSA9PSBQU19JQ0NfUk9UX0IpIHsKICAgICBtb2RlICs9IDM7CiAgIH0KIAogICByZXR1cm4gbW9kZTsKIH0KIAotCi1zdGF0aWMgSU5UIGdldElJRE1vZGUoY29uc3QgSU5UIG5CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaWlkUmVzKQoteworc3RhdGljIElOVCBnZXRJSURNb2RlKGNvbnN0IElOVCBuQmFuZHMsIGNvbnN0IElOVCBpaWRSZXMpIHsKICAgSU5UIG1vZGUgPSAwOwogCi0gIHN3aXRjaChuQmFuZHMpIHsKLSAgY2FzZSBQU19CQU5EU19DT0FSU0U6Ci0gICAgbW9kZSA9IFBTX1JFU19DT0FSU0U7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgUFNfQkFORFNfTUlEOgotICAgIG1vZGUgPSBQU19SRVNfTUlEOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG1vZGUgPSAwOwotICAgIGJyZWFrOworICBzd2l0Y2ggKG5CYW5kcykgeworICAgIGNhc2UgUFNfQkFORFNfQ09BUlNFOgorICAgICAgbW9kZSA9IFBTX1JFU19DT0FSU0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTX0JBTkRTX01JRDoKKyAgICAgIG1vZGUgPSBQU19SRVNfTUlEOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG1vZGUgPSAwOworICAgICAgYnJlYWs7CiAgIH0KIAotICBpZihpaWRSZXMgPT0gUFNfSUlEX1JFU19GSU5FKXsKKyAgaWYgKGlpZFJlcyA9PSBQU19JSURfUkVTX0ZJTkUpIHsKICAgICBtb2RlICs9IDM7CiAgIH0KIAogICByZXR1cm4gbW9kZTsKIH0KIAotCiBzdGF0aWMgSU5UIGVudmVsb3BlUmVkdWNpYmxlKEZJWFBfREJMIGlpZFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBpY2NbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHBzQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuRW52ZWxvcGVzKQotewotICAjZGVmaW5lIFRIUkVTSF9TQ0FMRSAgICAgNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcHNCYW5kcywgSU5UIG5FbnZlbG9wZXMpIHsKKyNkZWZpbmUgVEhSRVNIX1NDQUxFIDcKIAogICBJTlQgcmVkdWNpYmxlID0gMTsgLyogdHJ1ZSAqLwogICBJTlQgZSA9IDAsIGIgPSAwOwpAQCAtMjk5LDMxICsyODgsMzYgQEAKICAgRklYUF9EQkwgaWlkTWVhbkVycm9yLCBpY2NNZWFuRXJyb3I7CiAKICAgLyogc3F1YXJlIHZhbHVlcyB0byBwcmV2ZW50IHNxcnQsCi0gICAgIG11bHRpcGx5IGJhbmRzIHRvIHByZXZlbnQgZGl2aXNpb247IGJhbmRzIHNoaWZ0ZWQgREZSQUNUX0JJVFMgaW5zdGVhZCAoREZSQUNUX0JJVFMtMSkgYmVjYXVzZSBmTXVsdERpdjIgdXNlZCovCi0gIGlpZEVyclRocmVzaG9sZCA9IGZNdWx0RGl2MiAoIEZMMkZYQ09OU1RfREJMKDYuNWYqNi41Zi8oSUlEX1NDQUxFX0ZUKklJRF9TQ0FMRV9GVCkpLCAoRklYUF9EQkwpKHBzQmFuZHM8PCgoREZSQUNUX0JJVFMpLVRIUkVTSF9TQ0FMRSkpICk7Ci0gIGljY0VyclRocmVzaG9sZCA9IGZNdWx0RGl2MiAoIEZMMkZYQ09OU1RfREJMKDAuNzVmKjAuNzVmKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHBzQmFuZHM8PCgoREZSQUNUX0JJVFMpLVRIUkVTSF9TQ0FMRSkpICk7CisgICAgIG11bHRpcGx5IGJhbmRzIHRvIHByZXZlbnQgZGl2aXNpb247IGJhbmRzIHNoaWZ0ZWQgREZSQUNUX0JJVFMgaW5zdGVhZAorICAgICAoREZSQUNUX0JJVFMtMSkgYmVjYXVzZSBmTXVsdERpdjIgdXNlZCovCisgIGlpZEVyclRocmVzaG9sZCA9CisgICAgICBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoNi41ZiAqIDYuNWYgLyAoSUlEX1NDQUxFX0ZUICogSUlEX1NDQUxFX0ZUKSksCisgICAgICAgICAgICAgICAgKEZJWFBfREJMKShwc0JhbmRzIDw8ICgoREZSQUNUX0JJVFMpLVRIUkVTSF9TQ0FMRSkpKTsKKyAgaWNjRXJyVGhyZXNob2xkID0KKyAgICAgIGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjc1ZiAqIDAuNzVmKSwKKyAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHBzQmFuZHMgPDwgKChERlJBQ1RfQklUUyktVEhSRVNIX1NDQUxFKSkpOwogCiAgIGlmIChuRW52ZWxvcGVzIDw9IDEpIHsKICAgICByZWR1Y2libGUgPSAwOwogICB9IGVsc2UgewotCiAgICAgLyogbWVhbiBlcnJvciBjcml0ZXJpb24gKi8KLSAgICBmb3IgKGU9MDsgKGUgPCBuRW52ZWxvcGVzLzIpICYmIChyZWR1Y2libGUhPTAgKSA7IGUrKykgeworICAgIGZvciAoZSA9IDA7IChlIDwgbkVudmVsb3BlcyAvIDIpICYmIChyZWR1Y2libGUgIT0gMCk7IGUrKykgewogICAgICAgaWlkTWVhbkVycm9yID0gaWNjTWVhbkVycm9yID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgIGZvcihiPTA7IGI8cHNCYW5kczsgYisrKSB7Ci0gICAgICAgIGRJaWQgPSAoaWlkWzIqZV1bYl0+PjEpIC0gKGlpZFsyKmUrMV1bYl0+PjEpOyAgIC8qIHNjYWxlIDEgYml0OyBzcXVhcmVkIC0+IDIgYml0ICovCi0gICAgICAgIGRJY2MgPSAoaWNjWzIqZV1bYl0+PjEpIC0gKGljY1syKmUrMV1bYl0+PjEpOwotICAgICAgICBpaWRNZWFuRXJyb3IgKz0gZlBvdzJEaXYyKGRJaWQpPj4oNS0xKTsgICAgLyogKyAoYmFuZHM9MjApIHNjYWxlID0gNSAqLwotICAgICAgICBpY2NNZWFuRXJyb3IgKz0gZlBvdzJEaXYyKGRJY2MpPj4oNS0xKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0+IHNjYWxpbmcgPSA3IGJpdCA9IFRIUkVTSF9TQ0FMRSAhISAqLworICAgICAgZm9yIChiID0gMDsgYiA8IHBzQmFuZHM7IGIrKykgeworICAgICAgICBkSWlkID0gKGlpZFsyICogZV1bYl0gPj4gMSkgLQorICAgICAgICAgICAgICAgKGlpZFsyICogZSArIDFdW2JdID4+IDEpOyAvKiBzY2FsZSAxIGJpdDsgc3F1YXJlZCAtPiAyIGJpdCAqLworICAgICAgICBkSWNjID0gKGljY1syICogZV1bYl0gPj4gMSkgLSAoaWNjWzIgKiBlICsgMV1bYl0gPj4gMSk7CisgICAgICAgIGlpZE1lYW5FcnJvciArPSBmUG93MkRpdjIoZElpZCkgPj4gKDUgLSAxKTsgLyogKyAoYmFuZHM9MjApIHNjYWxlID0gNSAqLworICAgICAgICBpY2NNZWFuRXJyb3IgKz0gZlBvdzJEaXYyKGRJY2MpID4+ICg1IC0gMSk7CisgICAgICB9IC8qIC0tPiBzY2FsaW5nID0gNyBiaXQgPSBUSFJFU0hfU0NBTEUgISEgKi8KIAogICAgICAgLyogaW5zdGVhZCBzcXJ0IHZhbHVlcyBhcmUgc3F1YXJlZCEKICAgICAgICAgIGluc3RlYWQgb2YgZGl2aXNpb24sIG11bHRpcGx5IHRocmVzaG9sZCB3aXRoIHBzQmFuZHMKICAgICAgICAgIHNjYWxpbmcgbmVjZXNzYXJ5ISEgKi8KIAogICAgICAgLyogcXVpdCBhcyBzb29uIGFzIHRocmVzaG9sZCBpcyByZWFjaGVkICovCi0gICAgICBpZiAoIChpaWRNZWFuRXJyb3IgPiAoaWlkRXJyVGhyZXNob2xkKSkgfHwKLSAgICAgICAgICAgKGljY01lYW5FcnJvciA+IChpY2NFcnJUaHJlc2hvbGQpKSApIHsKKyAgICAgIGlmICgoaWlkTWVhbkVycm9yID4gKGlpZEVyclRocmVzaG9sZCkpIHx8CisgICAgICAgICAgKGljY01lYW5FcnJvciA+IChpY2NFcnJUaHJlc2hvbGQpKSkgewogICAgICAgICByZWR1Y2libGUgPSAwOwogICAgICAgfQogICAgIH0KQEAgLTMzMiwzMDUgKzMyNiwzMTQgQEAKICAgcmV0dXJuIHJlZHVjaWJsZTsKIH0KIAotCi1zdGF0aWMgdm9pZCBwcm9jZXNzSWlkRGF0YShQU19EQVRBICAgICAgICpwc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICBpaWRbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIHBzQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICBuRW52ZWxvcGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgcXVhbnRFcnJvclRocmVzaG9sZCkKLXsKLSAgSU5UIGlpZElkeEZpbmUgIFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworc3RhdGljIHZvaWQgcHJvY2Vzc0lpZERhdGEoUFNfREFUQSAqcHNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgaWlkW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgcHNCYW5kcywgY29uc3QgSU5UIG5FbnZlbG9wZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBxdWFudEVycm9yVGhyZXNob2xkKSB7CisgIElOVCBpaWRJZHhGaW5lW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107CiAgIElOVCBpaWRJZHhDb2Fyc2VbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKIAogICBGSVhQX0RCTCBlcnJJSUQgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICBGSVhQX0RCTCBlcnJJSURGaW5lID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgSU5UICAgYml0c0lpZEZyZXEgPSAwOwotICBJTlQgICBiaXRzSWlkVGltZSA9IDA7Ci0gIElOVCAgIGJpdHNGaW5lVG90ID0gMDsKLSAgSU5UICAgYml0c0NvYXJzZVRvdCA9IDA7Ci0gIElOVCAgIGVycm9yID0gMDsKLSAgSU5UICAgZW52LCBiYW5kOwotICBJTlQgICBkaWZmTW9kZVtQU19NQVhfRU5WRUxPUEVTXSwgZGlmZk1vZGVGaW5lW1BTX01BWF9FTlZFTE9QRVNdOworICBJTlQgYml0c0lpZEZyZXEgPSAwOworICBJTlQgYml0c0lpZFRpbWUgPSAwOworICBJTlQgYml0c0ZpbmVUb3QgPSAwOworICBJTlQgYml0c0NvYXJzZVRvdCA9IDA7CisgIElOVCBlcnJvciA9IDA7CisgIElOVCBlbnYsIGJhbmQ7CisgIElOVCBkaWZmTW9kZVtQU19NQVhfRU5WRUxPUEVTXSwgZGlmZk1vZGVGaW5lW1BTX01BWF9FTlZFTE9QRVNdOwogICBJTlQgbG91ZG5EaWZmID0gMDsKICAgSU5UIGlpZFRyYW5zbWl0ID0gMDsKIAotICBiaXRzSWlkRnJlcSA9IGJpdHNJaWRUaW1lID0gMDsKLQogICAvKiBRdWFudGl6ZSBJSUQgY29lZmZpY2llbnRzICovCi0gIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKLSAgICBlcnJJSUQgICAgICs9IHF1YW50aXplQ29lZihpaWRbZW52XSwgcHNCYW5kcywgaWlkUXVhbnRfZngsICAgICAgNywgMTUsIGlpZElkeENvYXJzZVtlbnZdKTsKLSAgICBlcnJJSURGaW5lICs9IHF1YW50aXplQ29lZihpaWRbZW52XSwgcHNCYW5kcywgaWlkUXVhbnRGaW5lX2Z4LCAxNSwgMzEsIGlpZElkeEZpbmVbZW52XSk7CisgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKKyAgICBlcnJJSUQgKz0KKyAgICAgICAgcXVhbnRpemVDb2VmKGlpZFtlbnZdLCBwc0JhbmRzLCBpaWRRdWFudF9meCwgNywgMTUsIGlpZElkeENvYXJzZVtlbnZdKTsKKyAgICBlcnJJSURGaW5lICs9IHF1YW50aXplQ29lZihpaWRbZW52XSwgcHNCYW5kcywgaWlkUXVhbnRGaW5lX2Z4LCAxNSwgMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkSWR4RmluZVtlbnZdKTsKICAgfQogCiAgIC8qIG5vcm1hbGl6ZSBlcnJvciB0byBudW1iZXIgb2YgZW52ZWxvcGVzLCBwcyBiYW5kcwogICAgICBlcnJJSUQgLz0gcHNCYW5kcypuRW52ZWxvcGVzOwogICAgICBlcnJJSURGaW5lIC89IHBzQmFuZHMqbkVudmVsb3BlczsgKi8KIAotCiAgIC8qIENoZWNrIGlmIElJRCBjb2VmZmljaWVudHMgc2hvdWxkIGJlIHVzZWQgaW4gdGhpcyBmcmFtZSAqLwogICBwc0RhdGEtPmlpZEVuYWJsZSA9IDA7Ci0gIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKLSAgICBmb3IoYmFuZD0wO2JhbmQ8cHNCYW5kcztiYW5kKyspIHsKLSAgICAgIGxvdWRuRGlmZiAgICs9IGZpeHBfYWJzKGlpZElkeENvYXJzZVtlbnZdW2JhbmRdKTsKLSAgICAgIGlpZFRyYW5zbWl0ICsrOworICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHBzQmFuZHM7IGJhbmQrKykgeworICAgICAgbG91ZG5EaWZmICs9IGZpeHBfYWJzKGlpZElkeENvYXJzZVtlbnZdW2JhbmRdKTsKKyAgICAgIGlpZFRyYW5zbWl0Kys7CiAgICAgfQogICB9CiAKLSAgaWYobG91ZG5EaWZmID4gZk11bHRJKEZMMkZYQ09OU1RfREJMKDAuN2YpLGlpZFRyYW5zbWl0KSl7ICAgIC8qIDAuN2YgZW1waXJpYyB2YWx1ZSAqLworICBpZiAobG91ZG5EaWZmID4KKyAgICAgIGZNdWx0SShGTDJGWENPTlNUX0RCTCgwLjdmKSwgaWlkVHJhbnNtaXQpKSB7IC8qIDAuN2YgZW1waXJpYyB2YWx1ZSAqLwogICAgIHBzRGF0YS0+aWlkRW5hYmxlID0gMTsKICAgfQogCiAgIC8qIGlmIGlpZCBub3QgYWN0aXZlIC0+IFJFU0VUIGRhdGEgKi8KLSAgaWYocHNEYXRhLT5paWRFbmFibGU9PTApIHsKKyAgaWYgKHBzRGF0YS0+aWlkRW5hYmxlID09IDApIHsKICAgICBwc0RhdGEtPmlpZFRpbWVDbnQgPSBNQVhfVElNRV9ESUZGX0ZSQU1FUzsKLSAgICBmb3IoZW52PTA7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgewogICAgICAgcHNEYXRhLT5paWREaWZmTW9kZVtlbnZdID0gUFNfREVMVEFfRlJFUTsKLSAgICAgIEZES21lbWNsZWFyKHBzRGF0YS0+aWlkSWR4W2Vudl0sIHNpemVvZihJTlQpKnBzQmFuZHMpOworICAgICAgRkRLbWVtY2xlYXIocHNEYXRhLT5paWRJZHhbZW52XSwgc2l6ZW9mKElOVCkgKiBwc0JhbmRzKTsKICAgICB9CiAgICAgcmV0dXJuOwogICB9CiAKICAgLyogY291bnQgQ09BUlNFIHF1YW50aXphdGlvbiBiaXRzIGZvciBmaXJzdCBlbnZlbG9wZSovCi0gIGJpdHNJaWRGcmVxID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhDb2Fyc2VbMF0sIE5VTEwsIHBzQmFuZHMsIFBTX0lJRF9SRVNfQ09BUlNFLCBQU19ERUxUQV9GUkVRLCAmZXJyb3IpOworICBiaXRzSWlkRnJlcSA9IEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4Q29hcnNlWzBdLCBOVUxMLCBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfSUlEX1JFU19DT0FSU0UsIFBTX0RFTFRBX0ZSRVEsICZlcnJvcik7CiAKLSAgaWYoIChwc0RhdGEtPmlpZFRpbWVDbnQ+PU1BWF9USU1FX0RJRkZfRlJBTUVTKSB8fCAocHNEYXRhLT5paWRRdWFudE1vZGVMYXN0PT1QU19JSURfUkVTX0ZJTkUpICkgewotICAgIGJpdHNJaWRUaW1lICAgICA9IERPX05PVF9VU0VfVEhJU19NT0RFOwotICB9Ci0gIGVsc2UgewotICAgIGJpdHNJaWRUaW1lICAgICA9IEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4Q29hcnNlWzBdLCBwc0RhdGEtPmlpZElkeExhc3QsIHBzQmFuZHMsIFBTX0lJRF9SRVNfQ09BUlNFLCBQU19ERUxUQV9USU1FLCAmZXJyb3IpOworICBpZiAoKHBzRGF0YS0+aWlkVGltZUNudCA+PSBNQVhfVElNRV9ESUZGX0ZSQU1FUykgfHwKKyAgICAgIChwc0RhdGEtPmlpZFF1YW50TW9kZUxhc3QgPT0gUFNfSUlEX1JFU19GSU5FKSkgeworICAgIGJpdHNJaWRUaW1lID0gRE9fTk9UX1VTRV9USElTX01PREU7CisgIH0gZWxzZSB7CisgICAgYml0c0lpZFRpbWUgPQorICAgICAgICBGREtzYnJFbmNfRW5jb2RlSWlkKE5VTEwsIGlpZElkeENvYXJzZVswXSwgcHNEYXRhLT5paWRJZHhMYXN0LCBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0lJRF9SRVNfQ09BUlNFLCBQU19ERUxUQV9USU1FLCAmZXJyb3IpOwogICB9CiAKICAgLyogZGVjaXNpb24gREVMVEFfRlJFUSB2cyBERUxUQV9USU1FICovCi0gIGlmKGJpdHNJaWRUaW1lPmJpdHNJaWRGcmVxKSB7Ci0gICAgZGlmZk1vZGVbMF0gICA9IFBTX0RFTFRBX0ZSRVE7CisgIGlmIChiaXRzSWlkVGltZSA+IGJpdHNJaWRGcmVxKSB7CisgICAgZGlmZk1vZGVbMF0gPSBQU19ERUxUQV9GUkVROwogICAgIGJpdHNDb2Fyc2VUb3QgPSBiaXRzSWlkRnJlcTsKLSAgfQotICBlbHNlIHsKLSAgICBkaWZmTW9kZVswXSAgID0gUFNfREVMVEFfVElNRTsKKyAgfSBlbHNlIHsKKyAgICBkaWZmTW9kZVswXSA9IFBTX0RFTFRBX1RJTUU7CiAgICAgYml0c0NvYXJzZVRvdCA9IGJpdHNJaWRUaW1lOwogICB9CiAKICAgLyogY291bnQgQ09BUlNFIHF1YW50aXphdGlvbiBiaXRzIGZvciBmb2xsb3dpbmcgZW52ZWxvcGVzKi8KLSAgZm9yKGVudj0xO2VudjxuRW52ZWxvcGVzOyBlbnYrKykgewotICAgIGJpdHNJaWRGcmVxICA9IEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4Q29hcnNlW2Vudl0sIE5VTEwsICAgICAgICAgICAgICAgIHBzQmFuZHMsIFBTX0lJRF9SRVNfQ09BUlNFLCBQU19ERUxUQV9GUkVRLCAmZXJyb3IpOwotICAgIGJpdHNJaWRUaW1lICA9IEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4Q29hcnNlW2Vudl0sIGlpZElkeENvYXJzZVtlbnYtMV0sIHBzQmFuZHMsIFBTX0lJRF9SRVNfQ09BUlNFLCBQU19ERUxUQV9USU1FLCAmZXJyb3IpOworICBmb3IgKGVudiA9IDE7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgYml0c0lpZEZyZXEgPSBGREtzYnJFbmNfRW5jb2RlSWlkKE5VTEwsIGlpZElkeENvYXJzZVtlbnZdLCBOVUxMLCBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19JSURfUkVTX0NPQVJTRSwgUFNfREVMVEFfRlJFUSwgJmVycm9yKTsKKyAgICBiaXRzSWlkVGltZSA9CisgICAgICAgIEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4Q29hcnNlW2Vudl0sIGlpZElkeENvYXJzZVtlbnYgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0JhbmRzLCBQU19JSURfUkVTX0NPQVJTRSwgUFNfREVMVEFfVElNRSwgJmVycm9yKTsKIAogICAgIC8qIGRlY2lzaW9uIERFTFRBX0ZSRVEgdnMgREVMVEFfVElNRSAqLwotICAgIGlmKGJpdHNJaWRUaW1lPmJpdHNJaWRGcmVxKSB7Ci0gICAgICBkaWZmTW9kZVtlbnZdICA9IFBTX0RFTFRBX0ZSRVE7CisgICAgaWYgKGJpdHNJaWRUaW1lID4gYml0c0lpZEZyZXEpIHsKKyAgICAgIGRpZmZNb2RlW2Vudl0gPSBQU19ERUxUQV9GUkVROwogICAgICAgYml0c0NvYXJzZVRvdCArPSBiaXRzSWlkRnJlcTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBkaWZmTW9kZVtlbnZdICA9IFBTX0RFTFRBX1RJTUU7CisgICAgfSBlbHNlIHsKKyAgICAgIGRpZmZNb2RlW2Vudl0gPSBQU19ERUxUQV9USU1FOwogICAgICAgYml0c0NvYXJzZVRvdCArPSBiaXRzSWlkVGltZTsKICAgICB9CiAgIH0KIAotCiAgIC8qIGNvdW50IEZJTkUgcXVhbnRpemF0aW9uIGJpdHMgZm9yIGZpcnN0IGVudmVsb3BlKi8KLSAgYml0c0lpZEZyZXEgPSBGREtzYnJFbmNfRW5jb2RlSWlkKE5VTEwsIGlpZElkeEZpbmVbMF0sICAgTlVMTCwgcHNCYW5kcywgUFNfSUlEX1JFU19GSU5FLCAgIFBTX0RFTFRBX0ZSRVEsICZlcnJvcik7CisgIGJpdHNJaWRGcmVxID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhGaW5lWzBdLCBOVUxMLCBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfSUlEX1JFU19GSU5FLCBQU19ERUxUQV9GUkVRLCAmZXJyb3IpOwogCi0gIGlmKCAocHNEYXRhLT5paWRUaW1lQ250Pj1NQVhfVElNRV9ESUZGX0ZSQU1FUykgfHwgKHBzRGF0YS0+aWlkUXVhbnRNb2RlTGFzdD09UFNfSUlEX1JFU19DT0FSU0UpICkgeworICBpZiAoKHBzRGF0YS0+aWlkVGltZUNudCA+PSBNQVhfVElNRV9ESUZGX0ZSQU1FUykgfHwKKyAgICAgIChwc0RhdGEtPmlpZFF1YW50TW9kZUxhc3QgPT0gUFNfSUlEX1JFU19DT0FSU0UpKSB7CiAgICAgYml0c0lpZFRpbWUgPSBET19OT1RfVVNFX1RISVNfTU9ERTsKLSAgfQotICBlbHNlIHsKLSAgICBiaXRzSWlkVGltZSA9IEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4RmluZVswXSwgIHBzRGF0YS0+aWlkSWR4TGFzdCwgcHNCYW5kcywgUFNfSUlEX1JFU19GSU5FLCBQU19ERUxUQV9USU1FLCAmZXJyb3IpOworICB9IGVsc2UgeworICAgIGJpdHNJaWRUaW1lID0KKyAgICAgICAgRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhGaW5lWzBdLCBwc0RhdGEtPmlpZElkeExhc3QsIHBzQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfSUlEX1JFU19GSU5FLCBQU19ERUxUQV9USU1FLCAmZXJyb3IpOwogICB9CiAKICAgLyogZGVjaXNpb24gREVMVEFfRlJFUSB2cyBERUxUQV9USU1FICovCi0gIGlmKGJpdHNJaWRUaW1lPmJpdHNJaWRGcmVxKSB7Ci0gICAgZGlmZk1vZGVGaW5lWzBdICAgPSBQU19ERUxUQV9GUkVROwotICAgIGJpdHNGaW5lVG90ICAgICAgID0gYml0c0lpZEZyZXE7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZGlmZk1vZGVGaW5lWzBdICAgPSBQU19ERUxUQV9USU1FOwotICAgIGJpdHNGaW5lVG90ICAgICAgID0gYml0c0lpZFRpbWU7CisgIGlmIChiaXRzSWlkVGltZSA+IGJpdHNJaWRGcmVxKSB7CisgICAgZGlmZk1vZGVGaW5lWzBdID0gUFNfREVMVEFfRlJFUTsKKyAgICBiaXRzRmluZVRvdCA9IGJpdHNJaWRGcmVxOworICB9IGVsc2UgeworICAgIGRpZmZNb2RlRmluZVswXSA9IFBTX0RFTFRBX1RJTUU7CisgICAgYml0c0ZpbmVUb3QgPSBiaXRzSWlkVGltZTsKICAgfQogCiAgIC8qIGNvdW50IEZJTkUgcXVhbnRpemF0aW9uIGJpdHMgZm9yIGZvbGxvd2luZyBlbnZlbG9wZXMqLwotICBmb3IoZW52PTE7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7Ci0gICAgYml0c0lpZEZyZXEgPSBGREtzYnJFbmNfRW5jb2RlSWlkKE5VTEwsIGlpZElkeEZpbmVbZW52XSwgICBOVUxMLCAgICAgICAgICAgICAgcHNCYW5kcywgUFNfSUlEX1JFU19GSU5FLCBQU19ERUxUQV9GUkVRLCAmZXJyb3IpOwotICAgIGJpdHNJaWRUaW1lID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhGaW5lW2Vudl0sICAgaWlkSWR4RmluZVtlbnYtMV0sIHBzQmFuZHMsIFBTX0lJRF9SRVNfRklORSwgUFNfREVMVEFfVElNRSwgJmVycm9yKTsKKyAgZm9yIChlbnYgPSAxOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGJpdHNJaWRGcmVxID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhGaW5lW2Vudl0sIE5VTEwsIHBzQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0lJRF9SRVNfRklORSwgUFNfREVMVEFfRlJFUSwgJmVycm9yKTsKKyAgICBiaXRzSWlkVGltZSA9CisgICAgICAgIEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4RmluZVtlbnZdLCBpaWRJZHhGaW5lW2VudiAtIDFdLCBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0lJRF9SRVNfRklORSwgUFNfREVMVEFfVElNRSwgJmVycm9yKTsKIAogICAgIC8qIGRlY2lzaW9uIERFTFRBX0ZSRVEgdnMgREVMVEFfVElNRSAqLwotICAgIGlmKGJpdHNJaWRUaW1lPmJpdHNJaWRGcmVxKSB7Ci0gICAgICBkaWZmTW9kZUZpbmVbZW52XSAgPSBQU19ERUxUQV9GUkVROworICAgIGlmIChiaXRzSWlkVGltZSA+IGJpdHNJaWRGcmVxKSB7CisgICAgICBkaWZmTW9kZUZpbmVbZW52XSA9IFBTX0RFTFRBX0ZSRVE7CiAgICAgICBiaXRzRmluZVRvdCArPSBiaXRzSWlkRnJlcTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBkaWZmTW9kZUZpbmVbZW52XSAgPSBQU19ERUxUQV9USU1FOwotICAgICAgYml0c0ZpbmVUb3QgICAgICAgKz0gYml0c0lpZFRpbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGRpZmZNb2RlRmluZVtlbnZdID0gUFNfREVMVEFfVElNRTsKKyAgICAgIGJpdHNGaW5lVG90ICs9IGJpdHNJaWRUaW1lOwogICAgIH0KICAgfQogCi0gIGlmKGJpdHNGaW5lVG90ID09IGJpdHNDb2Fyc2VUb3QpewotICAgIC8qIGlmIHNhbWUgbnVtYmVyIG9mIGJpdHMgaXMgbmVlZGVkLCB1c2UgdGhlIHF1YW50aXphdGlvbiB3aXRoIGxvd2VyIGVycm9yICovCi0gICAgaWYoZXJySUlERmluZSA8IGVycklJRCl7CisgIGlmIChiaXRzRmluZVRvdCA9PSBiaXRzQ29hcnNlVG90KSB7CisgICAgLyogaWYgc2FtZSBudW1iZXIgb2YgYml0cyBpcyBuZWVkZWQsIHVzZSB0aGUgcXVhbnRpemF0aW9uIHdpdGggbG93ZXIgZXJyb3IKKyAgICAgKi8KKyAgICBpZiAoZXJySUlERmluZSA8IGVycklJRCkgewogICAgICAgYml0c0NvYXJzZVRvdCA9IERPX05PVF9VU0VfVEhJU19NT0RFOwogICAgIH0gZWxzZSB7CiAgICAgICBiaXRzRmluZVRvdCA9IERPX05PVF9VU0VfVEhJU19NT0RFOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICAvKiBjb25zdCBGSVhQX0RCTCBtaW5UaHJlc2hvbGQgPSBGTDJGWENPTlNUX0RCTCgwLjJmLyhJSURfU0NBTEVfRlQqUFNfUVVBTlRfU0NBTEVfRlQpKihwc0JhbmRzKm5FbnZlbG9wZXMpKTsgKi8KLSAgICBjb25zdCBGSVhQX0RCTCBtaW5UaHJlc2hvbGQgPSAoRklYUF9EQkwpKChMT05HKTB4MDAwMTk5OTkgKiAocHNCYW5kcypuRW52ZWxvcGVzKSk7CisgICAgLyogY29uc3QgRklYUF9EQkwgbWluVGhyZXNob2xkID0KKyAgICAgKiBGTDJGWENPTlNUX0RCTCgwLjJmLyhJSURfU0NBTEVfRlQqUFNfUVVBTlRfU0NBTEVfRlQpKihwc0JhbmRzKm5FbnZlbG9wZXMpKTsKKyAgICAgKi8KKyAgICBjb25zdCBGSVhQX0RCTCBtaW5UaHJlc2hvbGQgPQorICAgICAgICAoRklYUF9EQkwpKChMT05HKTB4MDAwMTk5OTkgKiAocHNCYW5kcyAqIG5FbnZlbG9wZXMpKTsKIAogICAgIC8qIGRlY2lzaW9uIFJFU19GSU5FIHZzIFJFU19DT0FSU0UgICAgICAgICAgICAgICAgICovCiAgICAgLyogdGVzdCBpZiBlcnJJSURGaW5lKnF1YW50RXJyb3JUaHJlc2hvbGQgPCBlcnJJSUQgKi8KICAgICAvKiBzaGlmdFZhbCAyIGNvbWVzIGZyb20gc2NhbGluZyBvZiBxdWFudEVycm9yVGhyZXNob2xkICovCi0gICAgaWYoZml4TWF4KCgoZXJySUlERmluZT4+MSkrKG1pblRocmVzaG9sZD4+MSkpPj4xLCBmTXVsdChxdWFudEVycm9yVGhyZXNob2xkLGVycklJREZpbmUpKSA8IChlcnJJSUQ+PjIpICkgeworICAgIGlmIChmaXhNYXgoKChlcnJJSURGaW5lID4+IDEpICsgKG1pblRocmVzaG9sZCA+PiAxKSkgPj4gMSwKKyAgICAgICAgICAgICAgIGZNdWx0KHF1YW50RXJyb3JUaHJlc2hvbGQsIGVycklJREZpbmUpKSA8IChlcnJJSUQgPj4gMikpIHsKICAgICAgIGJpdHNDb2Fyc2VUb3QgPSBET19OT1RfVVNFX1RISVNfTU9ERTsKLSAgICB9Ci0gICAgZWxzZSBpZihmaXhNYXgoKChlcnJJSUQ+PjEpKyhtaW5UaHJlc2hvbGQ+PjEpKT4+MSwgZk11bHQocXVhbnRFcnJvclRocmVzaG9sZCxlcnJJSUQpKSA8IChlcnJJSURGaW5lPj4yKSApIHsKKyAgICB9IGVsc2UgaWYgKGZpeE1heCgoKGVycklJRCA+PiAxKSArIChtaW5UaHJlc2hvbGQgPj4gMSkpID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgZk11bHQocXVhbnRFcnJvclRocmVzaG9sZCwgZXJySUlEKSkgPCAoZXJySUlERmluZSA+PiAyKSkgewogICAgICAgYml0c0ZpbmVUb3QgPSBET19OT1RfVVNFX1RISVNfTU9ERTsKICAgICB9CiAgIH0KIAogICAvKiBkZWNpc2lvbiBSRVNfRklORSB2cyBSRVNfQ09BUlNFICovCi0gIGlmKGJpdHNGaW5lVG90PGJpdHNDb2Fyc2VUb3QpIHsKKyAgaWYgKGJpdHNGaW5lVG90IDwgYml0c0NvYXJzZVRvdCkgewogICAgIHBzRGF0YS0+aWlkUXVhbnRNb2RlID0gUFNfSUlEX1JFU19GSU5FOwotICAgIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKKyAgICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CiAgICAgICBwc0RhdGEtPmlpZERpZmZNb2RlW2Vudl0gPSBkaWZmTW9kZUZpbmVbZW52XTsKLSAgICAgIEZES21lbWNweShwc0RhdGEtPmlpZElkeFtlbnZdLCBpaWRJZHhGaW5lW2Vudl0sIHBzQmFuZHMqc2l6ZW9mKElOVCkpOworICAgICAgRkRLbWVtY3B5KHBzRGF0YS0+aWlkSWR4W2Vudl0sIGlpZElkeEZpbmVbZW52XSwgcHNCYW5kcyAqIHNpemVvZihJTlQpKTsKICAgICB9Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgcHNEYXRhLT5paWRRdWFudE1vZGUgPSBQU19JSURfUkVTX0NPQVJTRTsKLSAgICBmb3IoZW52PTA7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgewogICAgICAgcHNEYXRhLT5paWREaWZmTW9kZVtlbnZdID0gZGlmZk1vZGVbZW52XTsKLSAgICAgIEZES21lbWNweShwc0RhdGEtPmlpZElkeFtlbnZdLCBpaWRJZHhDb2Fyc2VbZW52XSwgcHNCYW5kcypzaXplb2YoSU5UKSk7CisgICAgICBGREttZW1jcHkocHNEYXRhLT5paWRJZHhbZW52XSwgaWlkSWR4Q29hcnNlW2Vudl0sIHBzQmFuZHMgKiBzaXplb2YoSU5UKSk7CiAgICAgfQogICB9CiAKICAgLyogQ291bnQgREVMVEFfVElNRSBlbmNvZGluZyBzdHJlYWtzICovCi0gIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKLSAgICBpZihwc0RhdGEtPmlpZERpZmZNb2RlW2Vudl09PVBTX0RFTFRBX1RJTUUpCisgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKKyAgICBpZiAocHNEYXRhLT5paWREaWZmTW9kZVtlbnZdID09IFBTX0RFTFRBX1RJTUUpCiAgICAgICBwc0RhdGEtPmlpZFRpbWVDbnQrKzsKICAgICBlbHNlCi0gICAgICBwc0RhdGEtPmlpZFRpbWVDbnQ9MDsKKyAgICAgIHBzRGF0YS0+aWlkVGltZUNudCA9IDA7CiAgIH0KIH0KIAotCi1zdGF0aWMgSU5UIHNpbWlsYXJJaWQoUFNfREFUQSAgICpwc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICBwc0JhbmRzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgbkVudmVsb3BlcykKLXsKK3N0YXRpYyBJTlQgc2ltaWxhcklpZChQU19EQVRBICpwc0RhdGEsIGNvbnN0IElOVCBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuRW52ZWxvcGVzKSB7CiAgIGNvbnN0IElOVCBkaWZmVGhyID0gKHBzRGF0YS0+aWlkUXVhbnRNb2RlID09IFBTX0lJRF9SRVNfQ09BUlNFKSA/IDIgOiAzOwotICBjb25zdCBJTlQgc3VtRGlmZlRociA9IGRpZmZUaHIgKiBwc0JhbmRzLzQ7CisgIGNvbnN0IElOVCBzdW1EaWZmVGhyID0gZGlmZlRociAqIHBzQmFuZHMgLyA0OwogICBJTlQgc2ltaWxhciA9IDA7Ci0gIElOVCBkaWZmICAgID0gMDsKKyAgSU5UIGRpZmYgPSAwOwogICBJTlQgc3VtRGlmZiA9IDA7CiAgIElOVCBlbnYgPSAwOwotICBJTlQgYiAgID0gMDsKLSAgaWYgKChuRW52ZWxvcGVzID09IHBzRGF0YS0+bkVudmVsb3Blc0xhc3QpICYmIChuRW52ZWxvcGVzPT0xKSkgeworICBJTlQgYiA9IDA7CisgIGlmICgobkVudmVsb3BlcyA9PSBwc0RhdGEtPm5FbnZlbG9wZXNMYXN0KSAmJiAobkVudmVsb3BlcyA9PSAxKSkgewogICAgIHNpbWlsYXIgPSAxOwotICAgIGZvciAoZW52PTA7IGVudjxuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKICAgICAgIHN1bURpZmYgPSAwOwogICAgICAgYiA9IDA7CiAgICAgICBkbyB7CiAgICAgICAgIGRpZmYgPSBmaXhwX2Ficyhwc0RhdGEtPmlpZElkeFtlbnZdW2JdIC0gcHNEYXRhLT5paWRJZHhMYXN0W2JdKTsKICAgICAgICAgc3VtRGlmZiArPSBkaWZmOwotICAgICAgICBpZiAoIChkaWZmID4gZGlmZlRocikgLyogbW9yZSB0aGFuIHggcXVhbnRpemF0aW9uIHN0ZXBzIGluIGFueSBiYW5kICovCi0gICAgICAgICAgICAgfHwgKHN1bURpZmYgPiBzdW1EaWZmVGhyKSApIHsgIC8qIG1vcmUgdGhhbiB4IHF1YW50aXNhdGlvbnMgc3RlcHMgb3ZlcmFsbCBkaWZmZXJlbmNlICovCisgICAgICAgIGlmICgoZGlmZiA+IGRpZmZUaHIpIC8qIG1vcmUgdGhhbiB4IHF1YW50aXphdGlvbiBzdGVwcyBpbiBhbnkgYmFuZCAqLworICAgICAgICAgICAgfHwgKHN1bURpZmYgPiBzdW1EaWZmVGhyKSkgeyAvKiBtb3JlIHRoYW4geCBxdWFudGlzYXRpb25zIHN0ZXBzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGwgZGlmZmVyZW5jZSAqLwogICAgICAgICAgIHNpbWlsYXIgPSAwOwogICAgICAgICB9CiAgICAgICAgIGIrKzsKLSAgICAgIH0gd2hpbGUgKChiPHBzQmFuZHMpICYmIChzaW1pbGFyPjApKTsKKyAgICAgIH0gd2hpbGUgKChiIDwgcHNCYW5kcykgJiYgKHNpbWlsYXIgPiAwKSk7CiAgICAgfQogICB9IC8qIG5FbnZlbG9wZXM9PTEgICovCiAKICAgcmV0dXJuIHNpbWlsYXI7CiB9CiAKLQotc3RhdGljIElOVCBzaW1pbGFySWNjKFBTX0RBVEEgKnBzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgcHNCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgbkVudmVsb3BlcykKLXsKK3N0YXRpYyBJTlQgc2ltaWxhckljYyhQU19EQVRBICpwc0RhdGEsIGNvbnN0IElOVCBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuRW52ZWxvcGVzKSB7CiAgIGNvbnN0IElOVCBkaWZmVGhyID0gMjsKLSAgY29uc3QgSU5UIHN1bURpZmZUaHIgPSBkaWZmVGhyICogcHNCYW5kcy80OworICBjb25zdCBJTlQgc3VtRGlmZlRociA9IGRpZmZUaHIgKiBwc0JhbmRzIC8gNDsKICAgSU5UIHNpbWlsYXIgPSAwOwotICBJTlQgZGlmZiAgICA9IDA7CisgIElOVCBkaWZmID0gMDsKICAgSU5UIHN1bURpZmYgPSAwOwogICBJTlQgZW52ID0gMDsKLSAgSU5UIGIgICA9IDA7Ci0gIGlmICgobkVudmVsb3BlcyA9PSBwc0RhdGEtPm5FbnZlbG9wZXNMYXN0KSAmJiAobkVudmVsb3Blcz09MSkpIHsKKyAgSU5UIGIgPSAwOworICBpZiAoKG5FbnZlbG9wZXMgPT0gcHNEYXRhLT5uRW52ZWxvcGVzTGFzdCkgJiYgKG5FbnZlbG9wZXMgPT0gMSkpIHsKICAgICBzaW1pbGFyID0gMTsKLSAgICBmb3IgKGVudj0wOyBlbnY8bkVudmVsb3BlczsgZW52KyspIHsKKyAgICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CiAgICAgICBzdW1EaWZmID0gMDsKICAgICAgIGIgPSAwOwogICAgICAgZG8gewogICAgICAgICBkaWZmID0gZml4cF9hYnMocHNEYXRhLT5pY2NJZHhbZW52XVtiXSAtIHBzRGF0YS0+aWNjSWR4TGFzdFtiXSk7CiAgICAgICAgIHN1bURpZmYgKz0gZGlmZjsKLSAgICAgICAgaWYgKCAoZGlmZiA+IGRpZmZUaHIpIC8qIG1vcmUgdGhhbiB4IHF1YW50aXNhdGlvbiBzdGVwIGluIGFueSBiYW5kICovCi0gICAgICAgICAgICAgfHwgKHN1bURpZmYgPiBzdW1EaWZmVGhyKSApIHsgIC8qIG1vcmUgdGhhbiB4IHF1YW50aXNhdGlvbnMgc3RlcHMgb3ZlcmFsbCBkaWZmZXJlbmNlICovCisgICAgICAgIGlmICgoZGlmZiA+IGRpZmZUaHIpIC8qIG1vcmUgdGhhbiB4IHF1YW50aXNhdGlvbiBzdGVwIGluIGFueSBiYW5kICovCisgICAgICAgICAgICB8fCAoc3VtRGlmZiA+IHN1bURpZmZUaHIpKSB7IC8qIG1vcmUgdGhhbiB4IHF1YW50aXNhdGlvbnMgc3RlcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbCBkaWZmZXJlbmNlICovCiAgICAgICAgICAgc2ltaWxhciA9IDA7CiAgICAgICAgIH0KICAgICAgICAgYisrOwotICAgICAgfSB3aGlsZSAoKGI8cHNCYW5kcykgJiYgKHNpbWlsYXI+MCkpOworICAgICAgfSB3aGlsZSAoKGIgPCBwc0JhbmRzKSAmJiAoc2ltaWxhciA+IDApKTsKICAgICB9CiAgIH0gLyogbkVudmVsb3Blcz09MSAgKi8KIAogICByZXR1cm4gc2ltaWxhcjsKIH0KIAotc3RhdGljIHZvaWQgcHJvY2Vzc0ljY0RhdGEoUFNfREFUQSAgICpwc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgIGljY1tQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLCAvKiBjb25zdCBpbnB1dCB2YWx1ZXM6IHVuYWJsZSB0byBkZWNsYXJlIGFzIGNvbnN0LCBzaW5jZSBpdCBkb2VzIG5vdCBwb0lOVCB0byBjb25zdCBtZW1vcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgcHNCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgbkVudmVsb3BlcykKLXsKK3N0YXRpYyB2b2lkIHByb2Nlc3NJY2NEYXRhKAorICAgIFBTX0RBVEEgKnBzRGF0YSwKKyAgICBGSVhQX0RCTCBpY2NbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwgLyogY29uc3QgaW5wdXQgdmFsdWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gZGVjbGFyZSBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCwgc2luY2UgaXQgZG9lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcG9JTlQgdG8gY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICovCisgICAgY29uc3QgSU5UIHBzQmFuZHMsIGNvbnN0IElOVCBuRW52ZWxvcGVzKSB7CiAgIEZJWFBfREJMIGVycklDQyA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gIElOVCAgIGVudiwgYmFuZDsKLSAgSU5UICAgYml0c0ljY0ZyZXEsIGJpdHNJY2NUaW1lOwotICBJTlQgICBlcnJvciA9IDA7Ci0gIElOVCAgIGluQ29oZXJlbmNlPTAsIGljY1RyYW5zbWl0PTA7Ci0gIElOVCAgKmljY0lkeExhc3Q7CisgIElOVCBlbnYsIGJhbmQ7CisgIElOVCBiaXRzSWNjRnJlcSwgYml0c0ljY1RpbWU7CisgIElOVCBlcnJvciA9IDA7CisgIElOVCBpbkNvaGVyZW5jZSA9IDAsIGljY1RyYW5zbWl0ID0gMDsKKyAgSU5UICppY2NJZHhMYXN0OwogCiAgIGljY0lkeExhc3QgPSBwc0RhdGEtPmljY0lkeExhc3Q7CiAKICAgLyogUXVhbnRpemUgSUNDIGNvZWZmaWNpZW50cyAqLwotICBmb3IoZW52PTA7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7Ci0gICAgZXJySUNDICs9IHF1YW50aXplQ29lZihpY2NbZW52XSwgcHNCYW5kcywgaWNjUXVhbnQsIDAsIDgsIHBzRGF0YS0+aWNjSWR4W2Vudl0pOworICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgZXJySUNDICs9CisgICAgICAgIHF1YW50aXplQ29lZihpY2NbZW52XSwgcHNCYW5kcywgaWNjUXVhbnQsIDAsIDgsIHBzRGF0YS0+aWNjSWR4W2Vudl0pOwogICB9CiAKICAgLyogQ2hlY2sgaWYgSUNDIGNvZWZmaWNpZW50cyBzaG91bGQgYmUgdXNlZCAqLwogICBwc0RhdGEtPmljY0VuYWJsZSA9IDA7Ci0gIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKLSAgICBmb3IoYmFuZD0wO2JhbmQ8cHNCYW5kcztiYW5kKyspIHsKKyAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBwc0JhbmRzOyBiYW5kKyspIHsKICAgICAgIGluQ29oZXJlbmNlICs9IHBzRGF0YS0+aWNjSWR4W2Vudl1bYmFuZF07Ci0gICAgICBpY2NUcmFuc21pdCArKzsKKyAgICAgIGljY1RyYW5zbWl0Kys7CiAgICAgfQogICB9Ci0gIGlmKGluQ29oZXJlbmNlID4gZk11bHRJKEZMMkZYQ09OU1RfREJMKDAuNWYpLGljY1RyYW5zbWl0KSl7ICAgLyogMC41ZiBlbXBpcmljIHZhbHVlICovCisgIGlmIChpbkNvaGVyZW5jZSA+CisgICAgICBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC41ZiksIGljY1RyYW5zbWl0KSkgeyAvKiAwLjVmIGVtcGlyaWMgdmFsdWUgKi8KICAgICBwc0RhdGEtPmljY0VuYWJsZSA9IDE7CiAgIH0KIAotICBpZihwc0RhdGEtPmljY0VuYWJsZT09MCkgeworICBpZiAocHNEYXRhLT5pY2NFbmFibGUgPT0gMCkgewogICAgIHBzRGF0YS0+aWNjVGltZUNudCA9IE1BWF9USU1FX0RJRkZfRlJBTUVTOwotICAgIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKKyAgICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CiAgICAgICBwc0RhdGEtPmljY0RpZmZNb2RlW2Vudl0gPSBQU19ERUxUQV9GUkVROwotICAgICAgRkRLbWVtY2xlYXIocHNEYXRhLT5pY2NJZHhbZW52XSwgc2l6ZW9mKElOVCkqcHNCYW5kcyk7CisgICAgICBGREttZW1jbGVhcihwc0RhdGEtPmljY0lkeFtlbnZdLCBzaXplb2YoSU5UKSAqIHBzQmFuZHMpOwogICAgIH0KICAgICByZXR1cm47CiAgIH0KIAotICBmb3IoZW52PTA7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7Ci0gICAgYml0c0ljY0ZyZXEgID0gRkRLc2JyRW5jX0VuY29kZUljYyhOVUxMLCBwc0RhdGEtPmljY0lkeFtlbnZdLCAgIE5VTEwsICAgICAgIHBzQmFuZHMsIFBTX0RFTFRBX0ZSRVEsICZlcnJvcik7CisgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKKyAgICBiaXRzSWNjRnJlcSA9IEZES3NickVuY19FbmNvZGVJY2MoTlVMTCwgcHNEYXRhLT5pY2NJZHhbZW52XSwgTlVMTCwgcHNCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfREVMVEFfRlJFUSwgJmVycm9yKTsKIAotICAgIGlmKHBzRGF0YS0+aWNjVGltZUNudDxNQVhfVElNRV9ESUZGX0ZSQU1FUykgewotICAgICAgYml0c0ljY1RpbWUgID0gRkRLc2JyRW5jX0VuY29kZUljYyhOVUxMLCBwc0RhdGEtPmljY0lkeFtlbnZdLCBpY2NJZHhMYXN0LCBwc0JhbmRzLCBQU19ERUxUQV9USU1FLCAmZXJyb3IpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGJpdHNJY2NUaW1lICA9IERPX05PVF9VU0VfVEhJU19NT0RFOworICAgIGlmIChwc0RhdGEtPmljY1RpbWVDbnQgPCBNQVhfVElNRV9ESUZGX0ZSQU1FUykgeworICAgICAgYml0c0ljY1RpbWUgPSBGREtzYnJFbmNfRW5jb2RlSWNjKE5VTEwsIHBzRGF0YS0+aWNjSWR4W2Vudl0sIGljY0lkeExhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCYW5kcywgUFNfREVMVEFfVElNRSwgJmVycm9yKTsKKyAgICB9IGVsc2UgeworICAgICAgYml0c0ljY1RpbWUgPSBET19OT1RfVVNFX1RISVNfTU9ERTsKICAgICB9CiAKLSAgICBpZihiaXRzSWNjRnJlcT5iaXRzSWNjVGltZSkgeworICAgIGlmIChiaXRzSWNjRnJlcSA+IGJpdHNJY2NUaW1lKSB7CiAgICAgICBwc0RhdGEtPmljY0RpZmZNb2RlW2Vudl0gPSBQU19ERUxUQV9USU1FOwogICAgICAgcHNEYXRhLT5pY2NUaW1lQ250Kys7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBwc0RhdGEtPmljY0RpZmZNb2RlW2Vudl0gPSBQU19ERUxUQV9GUkVROwotICAgICAgcHNEYXRhLT5pY2NUaW1lQ250PTA7CisgICAgICBwc0RhdGEtPmljY1RpbWVDbnQgPSAwOwogICAgIH0KICAgICBpY2NJZHhMYXN0ID0gcHNEYXRhLT5pY2NJZHhbZW52XTsKICAgfQpAQCAtNjM5LDE2MyArNjQyLDE0OCBAQAogc3RhdGljIHZvaWQgY2FsY3VsYXRlSUlEKEZJWFBfREJMIGxkUHdyTFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGxkUHdyUltQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGlpZFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIG5FbnZlbG9wZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgcHNCYW5kcykKLXsKLSAgSU5UIGk9MDsKLSAgSU5UIGVudj0wOwotICBmb3IoZW52PTA7IGVudjxuRW52ZWxvcGVzO2VudisrKSB7Ci0gICAgZm9yIChpPTA7IGk8cHNCYW5kczsgaSsrKSB7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbkVudmVsb3BlcywgSU5UIHBzQmFuZHMpIHsKKyAgSU5UIGkgPSAwOworICBJTlQgZW52ID0gMDsKKyAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBwc0JhbmRzOyBpKyspIHsKICAgICAgIC8qIGlpZFtlbnZdW2ldID0gMTAuMGYqKGZsb2F0KWxvZzEwKHB3ckxbZW52XVtpXS9wd3JSW2Vudl1baV0pOwotICAgICAgKi8KLSAgICAgIEZJWFBfREJMIElJRCA9IGZNdWx0RGl2MiggRkwyRlhDT05TVF9EQkwoTE9HMTBfMl8xMC9JSURfU0NBTEVfRlQpLCAobGRQd3JMW2Vudl1baV0tbGRQd3JSW2Vudl1baV0pICk7CisgICAgICAgKi8KKyAgICAgIEZJWFBfREJMIElJRCA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTChMT0cxMF8yXzEwIC8gSUlEX1NDQUxFX0ZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGRQd3JMW2Vudl1baV0gLSBsZFB3clJbZW52XVtpXSkpOwogCi0gICAgICBJSUQgPSBmaXhNaW4oIElJRCwgKEZJWFBfREJMKShNQVhWQUxfREJMPj4oTERfREFUQV9TSElGVCsxKSkgKTsKLSAgICAgIElJRCA9IGZpeE1heCggSUlELCAoRklYUF9EQkwpKE1JTlZBTF9EQkw+PihMRF9EQVRBX1NISUZUKzEpKSApOwotICAgICAgaWlkW2Vudl1baV0gPSBJSUQgPDwgKExEX0RBVEFfU0hJRlQrMSk7CisgICAgICBJSUQgPSBmaXhNaW4oSUlELCAoRklYUF9EQkwpKE1BWFZBTF9EQkwgPj4gKExEX0RBVEFfU0hJRlQgKyAxKSkpOworICAgICAgSUlEID0gZml4TWF4KElJRCwgKEZJWFBfREJMKShNSU5WQUxfREJMID4+IChMRF9EQVRBX1NISUZUICsgMSkpKTsKKyAgICAgIGlpZFtlbnZdW2ldID0gSUlEIDw8IChMRF9EQVRBX1NISUZUICsgMSk7CiAgICAgfQogICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNhbGN1bGF0ZUlDQyhGSVhQX0RCTCBsZFB3ckxbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBsZFB3clJbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZUlDQyhGSVhQX0RCTCBwd3JMW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgcHdyUltQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHB3ckNyW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgcHdyQ2lbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBpY2NbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBuRW52ZWxvcGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHBzQmFuZHMpCi17CisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5FbnZlbG9wZXMsIElOVCBwc0JhbmRzKSB7CiAgIElOVCBpID0gMDsKICAgSU5UIGVudiA9IDA7CiAgIElOVCBib3JkZXIgPSBwc0JhbmRzOwogCiAgIHN3aXRjaCAocHNCYW5kcykgewotICBjYXNlIFBTX0JBTkRTX0NPQVJTRToKLSAgICBib3JkZXIgPSA1OwotICAgIGJyZWFrOwotICBjYXNlIFBTX0JBTkRTX01JRDoKLSAgICBib3JkZXIgPSAxMTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBicmVhazsKKyAgICBjYXNlIFBTX0JBTkRTX0NPQVJTRToKKyAgICAgIGJvcmRlciA9IDU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTX0JBTkRTX01JRDoKKyAgICAgIGJvcmRlciA9IDExOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOwogICB9CiAKLSAgZm9yKGVudj0wOyBlbnY8bkVudmVsb3BlcztlbnYrKykgewotICAgIGZvciAoaT0wOyBpPGJvcmRlcjsgaSsrKSB7Ci0KLSAgICAgIC8qIGljY1tlbnZdW2ldID0gbWluKCBwd3JDcltlbnZdW2ldIC8gKGZsb2F0KSBzcXJ0KHB3ckxbZW52XVtpXSAqIHB3clJbZW52XVtpXSkgLCAxLmYpOwotICAgICAgKi8KLSAgICAgIEZJWFBfREJMIElDQywgaW52TnJnID0gQ2FsY0ludkxkRGF0YSAoIC0oKGxkUHdyTFtlbnZdW2ldPj4xKSArIChsZFB3clJbZW52XVtpXT4+MSkgKyAoRklYUF9EQkwpMSkgKTsKLSAgICAgIElOVCAgICAgIHNjYWxlLCBpbnZTY2FsZSA9IENvdW50TGVhZGluZ0JpdHMoaW52TnJnKTsKLQotICAgICAgc2NhbGUgPSAoREZSQUNUX0JJVFMtMSkgLSBpbnZTY2FsZTsKLSAgICAgIElDQyA9IGZNdWx0KHB3ckNyW2Vudl1baV0sIGludk5yZzw8aW52U2NhbGUpIDsKLSAgICAgIGljY1tlbnZdW2ldID0gU0FUVVJBVEVfTEVGVF9TSElGVChJQ0MsIHNjYWxlLCBERlJBQ1RfQklUUyk7CisgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYm9yZGVyOyBpKyspIHsKKyAgICAgIC8qIGljY1tlbnZdW2ldID0gbWluKCBwd3JDcltlbnZdW2ldIC8gKGZsb2F0KSBzcXJ0KHB3ckxbZW52XVtpXSAqCisgICAgICAgKiBwd3JSW2Vudl1baV0pICwgMS5mKTsKKyAgICAgICAqLworICAgICAgaW50IHNjYWxlOworICAgICAgRklYUF9EQkwgaW52TnJnID0gaW52U3FydE5vcm0yKAorICAgICAgICAgIGZNYXgoZk11bHQocHdyTFtlbnZdW2ldLCBwd3JSW2Vudl1baV0pLCAoRklYUF9EQkwpMSksICZzY2FsZSk7CisgICAgICBpY2NbZW52XVtpXSA9CisgICAgICAgICAgU0FUVVJBVEVfTEVGVF9TSElGVChmTXVsdChwd3JDcltlbnZdW2ldLCBpbnZOcmcpLCBzY2FsZSwgREZSQUNUX0JJVFMpOwogICAgIH0KIAotICAgIGZvciAoOyBpPHBzQmFuZHM7IGkrKykgewotICAgICAgSU5UIHNjMSwgc2MyOwotICAgICAgRklYUF9EQkwgY05yZ1IsIGNOcmdJLCBJQ0M7CisgICAgZm9yICg7IGkgPCBwc0JhbmRzOyBpKyspIHsKKyAgICAgIGludCBkZW5vbV9lOworICAgICAgRklYUF9EQkwgZGVub21fbSA9IGZNdWx0Tm9ybShwd3JMW2Vudl1baV0sIHB3clJbZW52XVtpXSwgJmRlbm9tX2UpOwogCi0gICAgICBzYzEgPSBDb3VudExlYWRpbmdCaXRzKCBmaXhNYXgoZml4cF9hYnMocHdyQ3JbZW52XVtpXSksZml4cF9hYnMocHdyQ2lbZW52XVtpXSkpICkgOwotICAgICAgY05yZ1IgPSBmUG93MkRpdjIoKHB3ckNyW2Vudl1baV08PHNjMSkpOyAgICAgICAvKiBzcXVhcmVkIG5yZydzIGV4cGVjdCBleHBsaWNpdCBzY2FsaW5nICovCi0gICAgICBjTnJnSSA9IGZQb3cyRGl2MigocHdyQ2lbZW52XVtpXTw8c2MxKSk7CisgICAgICBpZiAoZGVub21fbSA9PSAoRklYUF9EQkwpMCkgeworICAgICAgICBpY2NbZW52XVtpXSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IG51bV9lLCByZXN1bHRfZTsKKyAgICAgICAgRklYUF9EQkwgbnVtX20sIHJlc3VsdF9tOwogCi0gICAgICBJQ0MgPSBDYWxjSW52TGREYXRhKCAoQ2FsY0xkRGF0YSgoY05yZ1IgKyBjTnJnSSk+PjEpPj4xKSAtIChGSVhQX0RCTCkoKHNjMS0xKTw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpICk7CisgICAgICAgIG51bV9lID0gQ291bnRMZWFkaW5nQml0cygKKyAgICAgICAgICAgIGZpeE1heChmaXhwX2Ficyhwd3JDcltlbnZdW2ldKSwgZml4cF9hYnMocHdyQ2lbZW52XVtpXSkpKTsKKyAgICAgICAgbnVtX20gPSBmUG93MkRpdjIoKHB3ckNyW2Vudl1baV0gPDwgbnVtX2UpKSArCisgICAgICAgICAgICAgICAgZlBvdzJEaXYyKChwd3JDaVtlbnZdW2ldIDw8IG51bV9lKSk7CiAKLSAgICAgIEZJWFBfREJMIGludk5yZyA9IENhbGNJbnZMZERhdGEgKCAtKChsZFB3ckxbZW52XVtpXT4+MSkgKyAobGRQd3JSW2Vudl1baV0+PjEpICsgKEZJWFBfREJMKTEpICk7Ci0gICAgICBzYzEgPSBDb3VudExlYWRpbmdCaXRzKGludk5yZyk7Ci0gICAgICBpbnZOcmcgPDw9IHNjMTsKLQotICAgICAgc2MyID0gQ291bnRMZWFkaW5nQml0cyhJQ0MpOwotICAgICAgSUNDID0gZk11bHQoSUNDPDxzYzIsaW52TnJnKTsKLQotICAgICAgc2MxID0gKCAoREZSQUNUX0JJVFMtMSkgLSBzYzEgLSBzYzIgKTsKLSAgICAgIGlmIChzYzEgPCAwKSB7Ci0gICAgICAgICAgSUNDID4+PSAtc2MxOworICAgICAgICByZXN1bHRfbSA9IGZEaXZOb3JtKG51bV9tLCBkZW5vbV9tLCAmcmVzdWx0X2UpOworICAgICAgICByZXN1bHRfZSArPSAoLTIgKiBudW1fZSArIDEpIC0gZGVub21fZTsKKyAgICAgICAgaWNjW2Vudl1baV0gPSBzY2FsZVZhbHVlU2F0dXJhdGUoc3FydEZpeHAocmVzdWx0X20gPj4gKHJlc3VsdF9lICYgMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0X2UgKyAocmVzdWx0X2UgJiAxKSkgPj4gMSk7CiAgICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoSUNDID49ICgoRklYUF9EQkwpTUFYVkFMX0RCTD4+c2MxKSApCi0gICAgICAgICAgICAgIElDQyA9IChGSVhQX0RCTClNQVhWQUxfREJMOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgSUNDIDw8PSBzYzE7Ci0gICAgICB9Ci0KLSAgICAgIGljY1tlbnZdW2ldID0gSUNDOwogICAgIH0KICAgfQogfQogCi12b2lkIEZES3NickVuY19pbml0UHNCYW5kTnJnU2NhbGUoSEFORExFX1BTX0VOQ09ERSBoUHNFbmNvZGUpCi17Cit2b2lkIEZES3NickVuY19pbml0UHNCYW5kTnJnU2NhbGUoSEFORExFX1BTX0VOQ09ERSBoUHNFbmNvZGUpIHsKICAgSU5UIGdyb3VwLCBiaW47Ci0gIElOVCBuSWlkR3JvdXBzICAgPSBoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgKyBoUHNFbmNvZGUtPm5TdWJRbWZJaWRHcm91cHM7CisgIElOVCBuSWlkR3JvdXBzID0gaFBzRW5jb2RlLT5uUW1mSWlkR3JvdXBzICsgaFBzRW5jb2RlLT5uU3ViUW1mSWlkR3JvdXBzOwogCi0gIEZES21lbWNsZWFyKGhQc0VuY29kZS0+cHNCYW5kTnJnU2NhbGUsIFBTX01BWF9CQU5EUypzaXplb2YoU0NIQVIpKTsKKyAgRkRLbWVtY2xlYXIoaFBzRW5jb2RlLT5wc0JhbmROcmdTY2FsZSwgUFNfTUFYX0JBTkRTICogc2l6ZW9mKFNDSEFSKSk7CiAKLSAgZm9yIChncm91cD0wOyBncm91cCA8IG5JaWRHcm91cHM7IGdyb3VwKyspIHsKKyAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgbklpZEdyb3VwczsgZ3JvdXArKykgewogICAgIC8qIFRyYW5zbGF0ZSBncm91cCB0byBiaW4gKi8KICAgICBiaW4gPSBoUHNFbmNvZGUtPnN1YmJhbmQycGFyYW1ldGVySW5kZXhbZ3JvdXBdOwogCiAgICAgLyogVHJhbnNsYXRlIGZyb20gMjAgYmlucyB0byAxMCBiaW5zICovCiAgICAgaWYgKGhQc0VuY29kZS0+cHNFbmNNb2RlID09IFBTX0JBTkRTX0NPQVJTRSkgewotICAgICAgYmluID0gYmluPj4xOworICAgICAgYmluID0gYmluID4+IDE7CiAgICAgfQogCi0gICAgaFBzRW5jb2RlLT5wc0JhbmROcmdTY2FsZVtiaW5dID0gKGhQc0VuY29kZS0+cHNCYW5kTnJnU2NhbGVbYmluXT09MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoaFBzRW5jb2RlLT5paWRHcm91cFdpZHRoTGRbZ3JvdXBdICsgNSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZml4TWF4KGhQc0VuY29kZS0+aWlkR3JvdXBXaWR0aExkW2dyb3VwXSxoUHNFbmNvZGUtPnBzQmFuZE5yZ1NjYWxlW2Jpbl0pICsgMSkgOwotCisgICAgaFBzRW5jb2RlLT5wc0JhbmROcmdTY2FsZVtiaW5dID0KKyAgICAgICAgKGhQc0VuY29kZS0+cHNCYW5kTnJnU2NhbGVbYmluXSA9PSAwKQorICAgICAgICAgICAgPyAoaFBzRW5jb2RlLT5paWRHcm91cFdpZHRoTGRbZ3JvdXBdICsgNSkKKyAgICAgICAgICAgIDogKGZpeE1heChoUHNFbmNvZGUtPmlpZEdyb3VwV2lkdGhMZFtncm91cF0sCisgICAgICAgICAgICAgICAgICAgICAgaFBzRW5jb2RlLT5wc0JhbmROcmdTY2FsZVtiaW5dKSArCisgICAgICAgICAgICAgICAxKTsKICAgfQogfQogCi1GREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX0NyZWF0ZVBTRW5jb2RlKAotICAgICAgICBIQU5ETEVfUFNfRU5DT0RFICAgICAgICAgKnBoUHNFbmNvZGUKLSAgICAgICAgKQoteworRkRLX1BTRU5DX0VSUk9SIEZES3NickVuY19DcmVhdGVQU0VuY29kZShIQU5ETEVfUFNfRU5DT0RFICpwaFBzRW5jb2RlKSB7CiAgIEZES19QU0VOQ19FUlJPUiBlcnJvciA9IFBTRU5DX09LOwogCi0gIGlmIChwaFBzRW5jb2RlPT1OVUxMKSB7CisgIGlmIChwaFBzRW5jb2RlID09IE5VTEwpIHsKICAgICBlcnJvciA9IFBTRU5DX0lOVkFMSURfSEFORExFOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIEhBTkRMRV9QU19FTkNPREUgaFBzRW5jb2RlID0gTlVMTDsKLSAgICBpZiAoTlVMTD09KGhQc0VuY29kZSA9IEdldFJhbV9Qc0VuY29kZSgpKSkgeworICAgIGlmIChOVUxMID09IChoUHNFbmNvZGUgPSBHZXRSYW1fUHNFbmNvZGUoKSkpIHsKICAgICAgIGVycm9yID0gUFNFTkNfTUVNT1JZX0VSUk9SOwogICAgICAgZ290byBiYWlsOwogICAgIH0KLSAgICBGREttZW1jbGVhcihoUHNFbmNvZGUsc2l6ZW9mKFBTX0VOQ09ERSkpOworICAgIEZES21lbWNsZWFyKGhQc0VuY29kZSwgc2l6ZW9mKFBTX0VOQ09ERSkpOwogICAgICpwaFBzRW5jb2RlID0gaFBzRW5jb2RlOyAvKiByZXR1cm4gYWxsb2NhdGVkIGhhbmRsZSAqLwogICB9CiBiYWlsOgogICByZXR1cm4gZXJyb3I7CiB9CiAKLUZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfSW5pdFBTRW5jb2RlKAotICAgICAgICBIQU5ETEVfUFNfRU5DT0RFICAgICAgICAgIGhQc0VuY29kZSwKLSAgICAgICAgY29uc3QgUFNfQkFORFMgICAgICAgICAgICBwc0VuY01vZGUsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgaWlkUXVhbnRFcnJvclRocmVzaG9sZAotICAgICAgICApCi17CitGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX0luaXRQU0VuY29kZShIQU5ETEVfUFNfRU5DT0RFIGhQc0VuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0JBTkRTIHBzRW5jTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGlpZFF1YW50RXJyb3JUaHJlc2hvbGQpIHsKICAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CiAKLSAgaWYgKE5VTEw9PWhQc0VuY29kZSkgeworICBpZiAoTlVMTCA9PSBoUHNFbmNvZGUpIHsKICAgICBlcnJvciA9IFBTRU5DX0lOVkFMSURfSEFORExFOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGlmIChQU0VOQ19PSyAhPSAoSW5pdFBTRGF0YSgmaFBzRW5jb2RlLT5wc0RhdGEpKSkgewogICAgICAgZ290byBiYWlsOwogICAgIH0KIAotICAgIHN3aXRjaChwc0VuY01vZGUpeworICAgIHN3aXRjaCAocHNFbmNNb2RlKSB7CiAgICAgICBjYXNlIFBTX0JBTkRTX0NPQVJTRToKICAgICAgIGNhc2UgUFNfQkFORFNfTUlEOgotICAgICAgICBoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgICAgPSBRTUZfR1JPVVBTX0xPX1JFUzsKKyAgICAgICAgaFBzRW5jb2RlLT5uUW1mSWlkR3JvdXBzID0gUU1GX0dST1VQU19MT19SRVM7CiAgICAgICAgIGhQc0VuY29kZS0+blN1YlFtZklpZEdyb3VwcyA9IFNVQlFNRl9HUk9VUFNfTE9fUkVTOwotICAgICAgICBGREttZW1jcHkoaFBzRW5jb2RlLT5paWRHcm91cEJvcmRlcnMsICAgICAgICBpaWRHcm91cEJvcmRlcnNMb1JlcywgKGhQc0VuY29kZS0+blFtZklpZEdyb3VwcyArIGhQc0VuY29kZS0+blN1YlFtZklpZEdyb3VwcyArIDEpKnNpemVvZihJTlQpKTsKLSAgICAgICAgRkRLbWVtY3B5KGhQc0VuY29kZS0+c3ViYmFuZDJwYXJhbWV0ZXJJbmRleCwgc3ViYmFuZDJwYXJhbWV0ZXIyMCwgIChoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgKyBoUHNFbmNvZGUtPm5TdWJRbWZJaWRHcm91cHMpICAgICpzaXplb2YoSU5UKSk7Ci0gICAgICAgIEZES21lbWNweShoUHNFbmNvZGUtPmlpZEdyb3VwV2lkdGhMZCwgICAgICAgIGlpZEdyb3VwV2lkdGhMZExvUmVzLCAoaFBzRW5jb2RlLT5uUW1mSWlkR3JvdXBzICsgaFBzRW5jb2RlLT5uU3ViUW1mSWlkR3JvdXBzKSAgICAqc2l6ZW9mKFVDSEFSKSk7CisgICAgICAgIEZES21lbWNweShoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVycywgaWlkR3JvdXBCb3JkZXJzTG9SZXMsCisgICAgICAgICAgICAgICAgICAoaFBzRW5jb2RlLT5uUW1mSWlkR3JvdXBzICsgaFBzRW5jb2RlLT5uU3ViUW1mSWlkR3JvdXBzICsgMSkgKgorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihJTlQpKTsKKyAgICAgICAgRkRLbWVtY3B5KGhQc0VuY29kZS0+c3ViYmFuZDJwYXJhbWV0ZXJJbmRleCwgc3ViYmFuZDJwYXJhbWV0ZXIyMCwKKyAgICAgICAgICAgICAgICAgIChoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgKyBoUHNFbmNvZGUtPm5TdWJRbWZJaWRHcm91cHMpICoKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSU5UKSk7CisgICAgICAgIEZES21lbWNweShoUHNFbmNvZGUtPmlpZEdyb3VwV2lkdGhMZCwgaWlkR3JvdXBXaWR0aExkTG9SZXMsCisgICAgICAgICAgICAgICAgICAoaFBzRW5jb2RlLT5uUW1mSWlkR3JvdXBzICsgaFBzRW5jb2RlLT5uU3ViUW1mSWlkR3JvdXBzKSAqCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFVDSEFSKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKICAgICAgICAgZXJyb3IgPSBQU0VOQ19JTklUX0VSUk9SOwpAQCAtODEwLDE0ICs3OTgsMTAgQEAKICAgcmV0dXJuIGVycm9yOwogfQogCi0KLUZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfRGVzdHJveVBTRW5jb2RlKAotICAgICAgICBIQU5ETEVfUFNfRU5DT0RFICAgICAgICAgKnBoUHNFbmNvZGUKLSAgICAgICAgKQoteworRkRLX1BTRU5DX0VSUk9SIEZES3NickVuY19EZXN0cm95UFNFbmNvZGUoSEFORExFX1BTX0VOQ09ERSAqcGhQc0VuY29kZSkgewogICBGREtfUFNFTkNfRVJST1IgZXJyb3IgPSBQU0VOQ19PSzsKIAotICBpZiAoTlVMTCAhPXBoUHNFbmNvZGUpIHsKKyAgaWYgKE5VTEwgIT0gcGhQc0VuY29kZSkgewogICAgIEZyZWVSYW1fUHNFbmNvZGUocGhQc0VuY29kZSk7CiAgIH0KIApAQCAtODM0LDQ5ICs4MTgsNDMgQEAKIAogfSBQU19QV1JfREFUQTsKIAotCiBGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX1BTRW5jb2RlKAotICAgICAgICBIQU5ETEVfUFNfRU5DT0RFICAgICAgICAgIGhQc0VuY29kZSwKLSAgICAgICAgSEFORExFX1BTX09VVCAgICAgICAgICAgICBoUHNPdXQsCi0gICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAqZHluQmFuZFNjYWxlLAotICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgIG1heEVudmVsb3BlcywKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpoeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl0sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgZnJhbWVTaXplLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHNlbmRIZWFkZXIKLSAgICAgICAgKQoteworICAgIEhBTkRMRV9QU19FTkNPREUgaFBzRW5jb2RlLCBIQU5ETEVfUFNfT1VUIGhQc091dCwgVUNIQVIgKmR5bkJhbmRTY2FsZSwKKyAgICBVSU5UIG1heEVudmVsb3BlcywKKyAgICBGSVhQX0RCTCAqaHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdLAorICAgIGNvbnN0IElOVCBmcmFtZVNpemUsIGNvbnN0IElOVCBzZW5kSGVhZGVyKSB7CiAgIEZES19QU0VOQ19FUlJPUiBlcnJvciA9IFBTRU5DX09LOwogCiAgIEhBTkRMRV9QU19EQVRBIGhQc0RhdGEgPSAmaFBzRW5jb2RlLT5wc0RhdGE7Ci0gIEZJWFBfREJMIGlpZCBbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKLSAgRklYUF9EQkwgaWNjIFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOwotICBpbnQgZW52Qm9yZGVyW1BTX01BWF9FTlZFTE9QRVMrMV07CisgIEZJWFBfREJMIGlpZFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBGSVhQX0RCTCBpY2NbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKKyAgaW50IGVudkJvcmRlcltQU19NQVhfRU5WRUxPUEVTICsgMV07CiAKICAgaW50IGdyb3VwLCBiaW4sIGNvbCwgc3ViYmFuZCwgYmFuZDsKICAgaW50IGkgPSAwOwogCiAgIGludCBlbnYgPSAwOwotICBpbnQgcHNCYW5kcyAgICAgID0gKGludCkgaFBzRW5jb2RlLT5wc0VuY01vZGU7Ci0gIGludCBuSWlkR3JvdXBzICAgPSBoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgKyBoUHNFbmNvZGUtPm5TdWJRbWZJaWRHcm91cHM7Ci0gIGludCBuRW52ZWxvcGVzICAgPSBmaXhNaW4obWF4RW52ZWxvcGVzLCAoVUlOVClQU19NQVhfRU5WRUxPUEVTKTsKKyAgaW50IHBzQmFuZHMgPSAoaW50KWhQc0VuY29kZS0+cHNFbmNNb2RlOworICBpbnQgbklpZEdyb3VwcyA9IGhQc0VuY29kZS0+blFtZklpZEdyb3VwcyArIGhQc0VuY29kZS0+blN1YlFtZklpZEdyb3VwczsKKyAgaW50IG5FbnZlbG9wZXMgPSBmaXhNaW4obWF4RW52ZWxvcGVzLCAoVUlOVClQU19NQVhfRU5WRUxPUEVTKTsKIAotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocHdyRGF0YSwgUFNfUFdSX0RBVEEsIDEpOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocHdyRGF0YSwgUFNfUFdSX0RBVEEsIDEpCiAKLSAgZm9yKGVudj0wOyBlbnY8bkVudmVsb3BlcysxO2VudisrKSB7Ci0gICAgZW52Qm9yZGVyW2Vudl0gPSBmTXVsdEkoR2V0SW52SW50KG5FbnZlbG9wZXMpLGZyYW1lU2l6ZSplbnYpOworICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXMgKyAxOyBlbnYrKykgeworICAgIGVudkJvcmRlcltlbnZdID0gZk11bHRJKEdldEludkludChuRW52ZWxvcGVzKSwgZnJhbWVTaXplICogZW52KTsKICAgfQogCi0gIGZvcihlbnY9MDsgZW52PG5FbnZlbG9wZXM7ZW52KyspIHsKLQorICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CiAgICAgLyogY2xlYXIgZW5lcmd5IGFycmF5ICovCi0gICAgZm9yIChiYW5kPTA7IGJhbmQ8cHNCYW5kczsgYmFuZCsrKSB7Ci0gICAgICBwd3JEYXRhLT5wd3JMW2Vudl1bYmFuZF0gPSBwd3JEYXRhLT5wd3JSW2Vudl1bYmFuZF0gPSBwd3JEYXRhLT5wd3JDcltlbnZdW2JhbmRdID0gcHdyRGF0YS0+cHdyQ2lbZW52XVtiYW5kXSA9IEZJWFBfREJMKDEpOworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBwc0JhbmRzOyBiYW5kKyspIHsKKyAgICAgIHB3ckRhdGEtPnB3ckxbZW52XVtiYW5kXSA9IHB3ckRhdGEtPnB3clJbZW52XVtiYW5kXSA9CisgICAgICAgICAgcHdyRGF0YS0+cHdyQ3JbZW52XVtiYW5kXSA9IHB3ckRhdGEtPnB3ckNpW2Vudl1bYmFuZF0gPSBGSVhQX0RCTCgxKTsKICAgICB9CiAKICAgICAvKioqKiBjYWxjdWxhdGUgZW5lcmdpZXMgYW5kIGNvcnJlbGF0aW9uICoqKiovCiAKICAgICAvKiBzdGFydCB3aXRoIGh5YnJpZCBkYXRhICovCi0gICAgZm9yIChncm91cD0wOyBncm91cCA8IG5JaWRHcm91cHM7IGdyb3VwKyspIHsKKyAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBuSWlkR3JvdXBzOyBncm91cCsrKSB7CiAgICAgICAvKiBUcmFuc2xhdGUgZ3JvdXAgdG8gYmluICovCiAgICAgICBiaW4gPSBoUHNFbmNvZGUtPnN1YmJhbmQycGFyYW1ldGVySW5kZXhbZ3JvdXBdOwogCkBAIC04OTQsMjIgKzg3MiwyNiBAQAogICAgICAgRklYUF9EQkwgcHdyQ2lfZW52X2JpbiA9IHB3ckRhdGEtPnB3ckNpW2Vudl1bYmluXTsKIAogICAgICAgaW50IHNjYWxlID0gKGludClkeW5CYW5kU2NhbGVbYmluXTsKLSAgICAgIGZvciAoY29sPWVudkJvcmRlcltlbnZdOyBjb2w8ZW52Qm9yZGVyW2VudisxXTsgY29sKyspIHsKLSAgICAgICAgZm9yIChzdWJiYW5kID0gaFBzRW5jb2RlLT5paWRHcm91cEJvcmRlcnNbZ3JvdXBdOyBzdWJiYW5kIDwgaFBzRW5jb2RlLT5paWRHcm91cEJvcmRlcnNbZ3JvdXArMV07IHN1YmJhbmQrKykgewotICAgICAgICAgIEZJWFBfUU1GIGxfcmVhbCA9IChoeWJyaWREYXRhW2NvbF1bMF1bMF1bc3ViYmFuZF0pIDw8IHNjYWxlOwotICAgICAgICAgIEZJWFBfUU1GIGxfaW1hZyA9IChoeWJyaWREYXRhW2NvbF1bMF1bMV1bc3ViYmFuZF0pIDw8IHNjYWxlOwotICAgICAgICAgIEZJWFBfUU1GIHJfcmVhbCA9IChoeWJyaWREYXRhW2NvbF1bMV1bMF1bc3ViYmFuZF0pIDw8IHNjYWxlOwotICAgICAgICAgIEZJWFBfUU1GIHJfaW1hZyA9IChoeWJyaWREYXRhW2NvbF1bMV1bMV1bc3ViYmFuZF0pIDw8IHNjYWxlOworICAgICAgZm9yIChjb2wgPSBlbnZCb3JkZXJbZW52XTsgY29sIDwgZW52Qm9yZGVyW2VudiArIDFdOyBjb2wrKykgeworICAgICAgICBmb3IgKHN1YmJhbmQgPSBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cF07CisgICAgICAgICAgICAgc3ViYmFuZCA8IGhQc0VuY29kZS0+aWlkR3JvdXBCb3JkZXJzW2dyb3VwICsgMV07IHN1YmJhbmQrKykgeworICAgICAgICAgIEZJWFBfREJMIGxfcmVhbCA9IChoeWJyaWREYXRhW2NvbF1bMF1bMF1bc3ViYmFuZF0pIDw8IHNjYWxlOworICAgICAgICAgIEZJWFBfREJMIGxfaW1hZyA9IChoeWJyaWREYXRhW2NvbF1bMF1bMV1bc3ViYmFuZF0pIDw8IHNjYWxlOworICAgICAgICAgIEZJWFBfREJMIHJfcmVhbCA9IChoeWJyaWREYXRhW2NvbF1bMV1bMF1bc3ViYmFuZF0pIDw8IHNjYWxlOworICAgICAgICAgIEZJWFBfREJMIHJfaW1hZyA9IChoeWJyaWREYXRhW2NvbF1bMV1bMV1bc3ViYmFuZF0pIDw8IHNjYWxlOwogCi0gICAgICAgICAgcHdyTF9lbnZfYmluICArPSAoZlBvdzJEaXYyKGxfcmVhbCkgKyBmUG93MkRpdjIobF9pbWFnKSkgPj4gYlNjYWxlOwotICAgICAgICAgIHB3clJfZW52X2JpbiAgKz0gKGZQb3cyRGl2MihyX3JlYWwpICsgZlBvdzJEaXYyKHJfaW1hZykpID4+IGJTY2FsZTsKLSAgICAgICAgICBwd3JDcl9lbnZfYmluICs9IChmTXVsdERpdjIobF9yZWFsLCByX3JlYWwpICsgZk11bHREaXYyKGxfaW1hZywgcl9pbWFnKSkgPj4gYlNjYWxlOwotICAgICAgICAgIHB3ckNpX2Vudl9iaW4gKz0gKGZNdWx0RGl2MihyX3JlYWwsIGxfaW1hZykgLSBmTXVsdERpdjIobF9yZWFsLCByX2ltYWcpKSA+PiBiU2NhbGU7CisgICAgICAgICAgcHdyTF9lbnZfYmluICs9IChmUG93MkRpdjIobF9yZWFsKSArIGZQb3cyRGl2MihsX2ltYWcpKSA+PiBiU2NhbGU7CisgICAgICAgICAgcHdyUl9lbnZfYmluICs9IChmUG93MkRpdjIocl9yZWFsKSArIGZQb3cyRGl2MihyX2ltYWcpKSA+PiBiU2NhbGU7CisgICAgICAgICAgcHdyQ3JfZW52X2JpbiArPQorICAgICAgICAgICAgICAoZk11bHREaXYyKGxfcmVhbCwgcl9yZWFsKSArIGZNdWx0RGl2MihsX2ltYWcsIHJfaW1hZykpID4+IGJTY2FsZTsKKyAgICAgICAgICBwd3JDaV9lbnZfYmluICs9CisgICAgICAgICAgICAgIChmTXVsdERpdjIocl9yZWFsLCBsX2ltYWcpIC0gZk11bHREaXYyKGxfcmVhbCwgcl9pbWFnKSkgPj4gYlNjYWxlOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICAvKiBhc3N1cmUsIG5yZydzIG9mIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYXJlIG5vdCBuZWdhdGl2ZTsgbmVjZXNzYXJ5IG9uIDE2IGJpdCBtdWx0aXBseSB1bml0cyAqLwotICAgICAgcHdyRGF0YS0+cHdyTFtlbnZdW2Jpbl0gPSBmaXhNYXgoKEZJWFBfREJMKTAscHdyTF9lbnZfYmluKTsKLSAgICAgIHB3ckRhdGEtPnB3clJbZW52XVtiaW5dID0gZml4TWF4KChGSVhQX0RCTCkwLHB3clJfZW52X2Jpbik7CisgICAgICAvKiBhc3N1cmUsIG5yZydzIG9mIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYXJlIG5vdCBuZWdhdGl2ZTsgbmVjZXNzYXJ5IG9uCisgICAgICAgKiAxNiBiaXQgbXVsdGlwbHkgdW5pdHMgKi8KKyAgICAgIHB3ckRhdGEtPnB3ckxbZW52XVtiaW5dID0gZml4TWF4KChGSVhQX0RCTCkwLCBwd3JMX2Vudl9iaW4pOworICAgICAgcHdyRGF0YS0+cHdyUltlbnZdW2Jpbl0gPSBmaXhNYXgoKEZJWFBfREJMKTAsIHB3clJfZW52X2Jpbik7CiAKICAgICAgIHB3ckRhdGEtPnB3ckNyW2Vudl1bYmluXSA9IHB3ckNyX2Vudl9iaW47CiAgICAgICBwd3JEYXRhLT5wd3JDaVtlbnZdW2Jpbl0gPSBwd3JDaV9lbnZfYmluOwpAQCAtOTI0LDEyNiArOTA2LDEyMiBAQAogCiAgIC8qIGNhbGN1bGF0ZSBpaWQgYW5kIGljYyAqLwogICBjYWxjdWxhdGVJSUQocHdyRGF0YS0+bGRQd3JMLCBwd3JEYXRhLT5sZFB3clIsIGlpZCwgbkVudmVsb3BlcywgcHNCYW5kcyk7Ci0gIGNhbGN1bGF0ZUlDQyhwd3JEYXRhLT5sZFB3ckwsIHB3ckRhdGEtPmxkUHdyUiwgcHdyRGF0YS0+cHdyQ3IsIHB3ckRhdGEtPnB3ckNpLCBpY2MsIG5FbnZlbG9wZXMsIHBzQmFuZHMpOworICBjYWxjdWxhdGVJQ0MocHdyRGF0YS0+cHdyTCwgcHdyRGF0YS0+cHdyUiwgcHdyRGF0YS0+cHdyQ3IsIHB3ckRhdGEtPnB3ckNpLAorICAgICAgICAgICAgICAgaWNjLCBuRW52ZWxvcGVzLCBwc0JhbmRzKTsKIAogICAvKioqIEVudmVsb3BlIFJlZHVjdGlvbiAqKiovCi0gIHdoaWxlIChlbnZlbG9wZVJlZHVjaWJsZShpaWQsaWNjLHBzQmFuZHMsbkVudmVsb3BlcykpIHsKLSAgICBpbnQgZT0wOworICB3aGlsZSAoZW52ZWxvcGVSZWR1Y2libGUoaWlkLCBpY2MsIHBzQmFuZHMsIG5FbnZlbG9wZXMpKSB7CisgICAgaW50IGUgPSAwOwogICAgIC8qIHN1bSBlbmVyZ2llcyBvZiB0d28gbmVpZ2hib3JpbmcgZW52ZWxvcGVzICovCiAgICAgbkVudmVsb3BlcyA+Pj0gMTsKLSAgICBmb3IgKGU9MDsgZTxuRW52ZWxvcGVzOyBlKyspIHsKLSAgICAgIEZES3NickVuY19hZGRGSVhQX0RCTChwd3JEYXRhLT5wd3JMWzIqZV0sIHB3ckRhdGEtPnB3ckxbMiplKzFdLCBwd3JEYXRhLT5wd3JMW2VdLCBwc0JhbmRzKTsKLSAgICAgIEZES3NickVuY19hZGRGSVhQX0RCTChwd3JEYXRhLT5wd3JSWzIqZV0sIHB3ckRhdGEtPnB3clJbMiplKzFdLCBwd3JEYXRhLT5wd3JSW2VdLCBwc0JhbmRzKTsKLSAgICAgIEZES3NickVuY19hZGRGSVhQX0RCTChwd3JEYXRhLT5wd3JDclsyKmVdLHB3ckRhdGEtPnB3ckNyWzIqZSsxXSxwd3JEYXRhLT5wd3JDcltlXSxwc0JhbmRzKTsKLSAgICAgIEZES3NickVuY19hZGRGSVhQX0RCTChwd3JEYXRhLT5wd3JDaVsyKmVdLHB3ckRhdGEtPnB3ckNpWzIqZSsxXSxwd3JEYXRhLT5wd3JDaVtlXSxwc0JhbmRzKTsKKyAgICBmb3IgKGUgPSAwOyBlIDwgbkVudmVsb3BlczsgZSsrKSB7CisgICAgICBGREtzYnJFbmNfYWRkRklYUF9EQkwocHdyRGF0YS0+cHdyTFsyICogZV0sIHB3ckRhdGEtPnB3ckxbMiAqIGUgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd3JEYXRhLT5wd3JMW2VdLCBwc0JhbmRzKTsKKyAgICAgIEZES3NickVuY19hZGRGSVhQX0RCTChwd3JEYXRhLT5wd3JSWzIgKiBlXSwgcHdyRGF0YS0+cHdyUlsyICogZSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ckRhdGEtPnB3clJbZV0sIHBzQmFuZHMpOworICAgICAgRkRLc2JyRW5jX2FkZEZJWFBfREJMKHB3ckRhdGEtPnB3ckNyWzIgKiBlXSwgcHdyRGF0YS0+cHdyQ3JbMiAqIGUgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd3JEYXRhLT5wd3JDcltlXSwgcHNCYW5kcyk7CisgICAgICBGREtzYnJFbmNfYWRkRklYUF9EQkwocHdyRGF0YS0+cHdyQ2lbMiAqIGVdLCBwd3JEYXRhLT5wd3JDaVsyICogZSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ckRhdGEtPnB3ckNpW2VdLCBwc0JhbmRzKTsKIAogICAgICAgLyogY2FsYyBsb2dhcml0aG1pYyBlbmVyZ3kgKi8KICAgICAgIExkRGF0YVZlY3Rvcihwd3JEYXRhLT5wd3JMW2VdLCBwd3JEYXRhLT5sZFB3ckxbZV0sIHBzQmFuZHMpOwogICAgICAgTGREYXRhVmVjdG9yKHB3ckRhdGEtPnB3clJbZV0sIHB3ckRhdGEtPmxkUHdyUltlXSwgcHNCYW5kcyk7CiAKICAgICAgIC8qIHJlZHVjZSBudW1iZXIgb2YgZW52ZWxvcGVzIGFuZCBhZGp1c3QgYm9yZGVycyAqLwotICAgICAgZW52Qm9yZGVyW2VdID0gZW52Qm9yZGVyWzIqZV07CisgICAgICBlbnZCb3JkZXJbZV0gPSBlbnZCb3JkZXJbMiAqIGVdOwogICAgIH0KLSAgICBlbnZCb3JkZXJbbkVudmVsb3Blc10gPSBlbnZCb3JkZXJbMipuRW52ZWxvcGVzXTsKKyAgICBlbnZCb3JkZXJbbkVudmVsb3Blc10gPSBlbnZCb3JkZXJbMiAqIG5FbnZlbG9wZXNdOwogCiAgICAgLyogcmUtY2FsY3VsYXRlIGlpZCBhbmQgaWNjICovCiAgICAgY2FsY3VsYXRlSUlEKHB3ckRhdGEtPmxkUHdyTCwgcHdyRGF0YS0+bGRQd3JSLCBpaWQsIG5FbnZlbG9wZXMsIHBzQmFuZHMpOwotICAgIGNhbGN1bGF0ZUlDQyhwd3JEYXRhLT5sZFB3ckwsIHB3ckRhdGEtPmxkUHdyUiwgcHdyRGF0YS0+cHdyQ3IsIHB3ckRhdGEtPnB3ckNpLCBpY2MsIG5FbnZlbG9wZXMsIHBzQmFuZHMpOworICAgIGNhbGN1bGF0ZUlDQyhwd3JEYXRhLT5wd3JMLCBwd3JEYXRhLT5wd3JSLCBwd3JEYXRhLT5wd3JDciwgcHdyRGF0YS0+cHdyQ2ksCisgICAgICAgICAgICAgICAgIGljYywgbkVudmVsb3BlcywgcHNCYW5kcyk7CiAgIH0KIAotCiAgIC8qICAqLwotICBpZihzZW5kSGVhZGVyKSB7Ci0gICAgaFBzRGF0YS0+aGVhZGVyQ250ICA9IE1BWF9QU19OT0hFQURFUl9DTlQ7CisgIGlmIChzZW5kSGVhZGVyKSB7CisgICAgaFBzRGF0YS0+aGVhZGVyQ250ID0gTUFYX1BTX05PSEVBREVSX0NOVDsKICAgICBoUHNEYXRhLT5paWRUaW1lQ250ID0gTUFYX1RJTUVfRElGRl9GUkFNRVM7CiAgICAgaFBzRGF0YS0+aWNjVGltZUNudCA9IE1BWF9USU1FX0RJRkZfRlJBTUVTOwotICAgIGhQc0RhdGEtPm5vRW52Q250ICAgPSBNQVhfTk9FTlZfQ05UOworICAgIGhQc0RhdGEtPm5vRW52Q250ID0gTUFYX05PRU5WX0NOVDsKICAgfQogCiAgIC8qKiogUGFyYW1ldGVyIHByb2Nlc3NpbmcsIHF1YW50aXNhdGlvbiBldGMgKioqLwotICBwcm9jZXNzSWlkRGF0YShoUHNEYXRhLCBpaWQsIHBzQmFuZHMsIG5FbnZlbG9wZXMsIGhQc0VuY29kZS0+aWlkUXVhbnRFcnJvclRocmVzaG9sZCk7CisgIHByb2Nlc3NJaWREYXRhKGhQc0RhdGEsIGlpZCwgcHNCYW5kcywgbkVudmVsb3BlcywKKyAgICAgICAgICAgICAgICAgaFBzRW5jb2RlLT5paWRRdWFudEVycm9yVGhyZXNob2xkKTsKICAgcHJvY2Vzc0ljY0RhdGEoaFBzRGF0YSwgaWNjLCBwc0JhbmRzLCBuRW52ZWxvcGVzKTsKIAotCiAgIC8qKiogSW5pdGlhbGl6ZSBvdXRwdXQgc3RydWN0ICoqKi8KIAogICAvKiBQUyBIZWFkZXIgb24vb2ZmID8gKi8KLSAgaWYoIChoUHNEYXRhLT5oZWFkZXJDbnQ8TUFYX1BTX05PSEVBREVSX0NOVCkKLSAgICAgICAmJiAoIChoUHNEYXRhLT5paWRRdWFudE1vZGUgPT0gaFBzRGF0YS0+aWlkUXVhbnRNb2RlTGFzdCkgJiYgKGhQc0RhdGEtPmljY1F1YW50TW9kZSA9PSBoUHNEYXRhLT5pY2NRdWFudE1vZGVMYXN0KSApCi0gICAgICAgJiYgKCAoaFBzRGF0YS0+aWlkRW5hYmxlICAgID09IGhQc0RhdGEtPmlpZEVuYWJsZUxhc3QpICAgICYmIChoUHNEYXRhLT5pY2NFbmFibGUgICAgPT0gaFBzRGF0YS0+aWNjRW5hYmxlTGFzdCkgICkgKSB7CisgIGlmICgoaFBzRGF0YS0+aGVhZGVyQ250IDwgTUFYX1BTX05PSEVBREVSX0NOVCkgJiYKKyAgICAgICgoaFBzRGF0YS0+aWlkUXVhbnRNb2RlID09IGhQc0RhdGEtPmlpZFF1YW50TW9kZUxhc3QpICYmCisgICAgICAgKGhQc0RhdGEtPmljY1F1YW50TW9kZSA9PSBoUHNEYXRhLT5pY2NRdWFudE1vZGVMYXN0KSkgJiYKKyAgICAgICgoaFBzRGF0YS0+aWlkRW5hYmxlID09IGhQc0RhdGEtPmlpZEVuYWJsZUxhc3QpICYmCisgICAgICAgKGhQc0RhdGEtPmljY0VuYWJsZSA9PSBoUHNEYXRhLT5pY2NFbmFibGVMYXN0KSkpIHsKICAgICBoUHNPdXQtPmVuYWJsZVBTSGVhZGVyID0gMDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBoUHNPdXQtPmVuYWJsZVBTSGVhZGVyID0gMTsKICAgICBoUHNEYXRhLT5oZWFkZXJDbnQgPSAwOwogICB9CiAKICAgLyogbkVudmVsb3BlcyA9IDAgPyAqLwotICBpZiAoIChoUHNEYXRhLT5ub0VudkNudCA8IE1BWF9OT0VOVl9DTlQpCi0gICAgICAgJiYgKHNpbWlsYXJJaWQoaFBzRGF0YSwgcHNCYW5kcywgbkVudmVsb3BlcykpCi0gICAgICAgJiYgKHNpbWlsYXJJY2MoaFBzRGF0YSwgcHNCYW5kcywgbkVudmVsb3BlcykpICkgeworICBpZiAoKGhQc0RhdGEtPm5vRW52Q250IDwgTUFYX05PRU5WX0NOVCkgJiYKKyAgICAgIChzaW1pbGFySWlkKGhQc0RhdGEsIHBzQmFuZHMsIG5FbnZlbG9wZXMpKSAmJgorICAgICAgKHNpbWlsYXJJY2MoaFBzRGF0YSwgcHNCYW5kcywgbkVudmVsb3BlcykpKSB7CiAgICAgaFBzT3V0LT5uRW52ZWxvcGVzID0gbkVudmVsb3BlcyA9IDA7CiAgICAgaFBzRGF0YS0+bm9FbnZDbnQrKzsKICAgfSBlbHNlIHsKICAgICBoUHNEYXRhLT5ub0VudkNudCA9IDA7CiAgIH0KIAorICBpZiAobkVudmVsb3BlcyA+IDApIHsKKyAgICBoUHNPdXQtPmVuYWJsZUlJRCA9IGhQc0RhdGEtPmlpZEVuYWJsZTsKKyAgICBoUHNPdXQtPmlpZE1vZGUgPSBnZXRJSURNb2RlKHBzQmFuZHMsIGhQc0RhdGEtPmlpZFF1YW50TW9kZSk7CiAKLSAgaWYgKG5FbnZlbG9wZXM+MCkgeworICAgIGhQc091dC0+ZW5hYmxlSUNDID0gaFBzRGF0YS0+aWNjRW5hYmxlOworICAgIGhQc091dC0+aWNjTW9kZSA9IGdldElDQ01vZGUocHNCYW5kcywgaFBzRGF0YS0+aWNjUXVhbnRNb2RlKTsKIAotICAgIGhQc091dC0+ZW5hYmxlSUlEICAgICAgPSBoUHNEYXRhLT5paWRFbmFibGU7Ci0gICAgaFBzT3V0LT5paWRNb2RlICAgICAgICA9IGdldElJRE1vZGUocHNCYW5kcywgaFBzRGF0YS0+aWlkUXVhbnRNb2RlKTsKKyAgICBoUHNPdXQtPmVuYWJsZUlwZE9wZCA9IDA7CisgICAgaFBzT3V0LT5mcmFtZUNsYXNzID0gMDsKKyAgICBoUHNPdXQtPm5FbnZlbG9wZXMgPSBuRW52ZWxvcGVzOwogCi0gICAgaFBzT3V0LT5lbmFibGVJQ0MgICAgICA9IGhQc0RhdGEtPmljY0VuYWJsZTsKLSAgICBoUHNPdXQtPmljY01vZGUgICAgICAgID0gZ2V0SUNDTW9kZShwc0JhbmRzLCBoUHNEYXRhLT5pY2NRdWFudE1vZGUpOwotCi0gICAgaFBzT3V0LT5lbmFibGVJcGRPcGQgID0gMDsKLSAgICBoUHNPdXQtPmZyYW1lQ2xhc3MgICAgPSAwOwotICAgIGhQc091dC0+bkVudmVsb3BlcyAgICA9IG5FbnZlbG9wZXM7Ci0KLSAgICBmb3IoZW52PTA7IGVudjxuRW52ZWxvcGVzOyBlbnYrKykgewotICAgICAgaFBzT3V0LT5mcmFtZUJvcmRlcltlbnZdID0gZW52Qm9yZGVyW2VudisxXTsKLSAgICB9Ci0KLSAgICBmb3IoZW52PTA7IGVudjxoUHNPdXQtPm5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgeworICAgICAgaFBzT3V0LT5mcmFtZUJvcmRlcltlbnZdID0gZW52Qm9yZGVyW2VudiArIDFdOwogICAgICAgaFBzT3V0LT5kZWx0YUlJRFtlbnZdID0gKFBTX0RFTFRBKWhQc0RhdGEtPmlpZERpZmZNb2RlW2Vudl07Ci0KLSAgICAgIGZvcihiYW5kPTA7IGJhbmQ8cHNCYW5kczsgYmFuZCsrKSB7Ci0gICAgICAgIGhQc091dC0+aWlkW2Vudl1bYmFuZF0gPSBoUHNEYXRhLT5paWRJZHhbZW52XVtiYW5kXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IoZW52PTA7IGVudjxoUHNPdXQtPm5FbnZlbG9wZXM7IGVudisrKSB7CiAgICAgICBoUHNPdXQtPmRlbHRhSUNDW2Vudl0gPSAoUFNfREVMVEEpaFBzRGF0YS0+aWNjRGlmZk1vZGVbZW52XTsKLSAgICAgIGZvcihiYW5kPTA7IGJhbmQ8cHNCYW5kczsgYmFuZCsrKSB7CisgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgcHNCYW5kczsgYmFuZCsrKSB7CisgICAgICAgIGhQc091dC0+aWlkW2Vudl1bYmFuZF0gPSBoUHNEYXRhLT5paWRJZHhbZW52XVtiYW5kXTsKICAgICAgICAgaFBzT3V0LT5pY2NbZW52XVtiYW5kXSA9IGhQc0RhdGEtPmljY0lkeFtlbnZdW2JhbmRdOwogICAgICAgfQogICAgIH0KIAogICAgIC8qIElQRCBPUEQgbm90IHN1cHBvcnRlZCByaWdodCBub3cgKi8KLSAgICBGREttZW1jbGVhcihoUHNPdXQtPmlwZCwgUFNfTUFYX0VOVkVMT1BFUypQU19NQVhfQkFORFMqc2l6ZW9mKFBTX0RFTFRBKSk7Ci0gICAgZm9yKGVudj0wOyBlbnY8UFNfTUFYX0VOVkVMT1BFUzsgZW52KyspIHsKKyAgICBGREttZW1jbGVhcihoUHNPdXQtPmlwZCwKKyAgICAgICAgICAgICAgICBQU19NQVhfRU5WRUxPUEVTICogUFNfTUFYX0JBTkRTICogc2l6ZW9mKFBTX0RFTFRBKSk7CisgICAgZm9yIChlbnYgPSAwOyBlbnYgPCBQU19NQVhfRU5WRUxPUEVTOyBlbnYrKykgewogICAgICAgaFBzT3V0LT5kZWx0YUlQRFtlbnZdID0gUFNfREVMVEFfRlJFUTsKICAgICAgIGhQc091dC0+ZGVsdGFPUERbZW52XSA9IFBTX0RFTFRBX0ZSRVE7CiAgICAgfQogCi0gICAgRkRLbWVtY2xlYXIoaFBzT3V0LT5pcGRMYXN0LCBQU19NQVhfQkFORFMqc2l6ZW9mKElOVCkpOwotICAgIEZES21lbWNsZWFyKGhQc091dC0+b3BkTGFzdCwgUFNfTUFYX0JBTkRTKnNpemVvZihJTlQpKTsKKyAgICBGREttZW1jbGVhcihoUHNPdXQtPmlwZExhc3QsIFBTX01BWF9CQU5EUyAqIHNpemVvZihJTlQpKTsKKyAgICBGREttZW1jbGVhcihoUHNPdXQtPm9wZExhc3QsIFBTX01BWF9CQU5EUyAqIHNpemVvZihJTlQpKTsKIAotICAgIGZvcihiYW5kPTA7IGJhbmQ8UFNfTUFYX0JBTkRTOyBiYW5kKyspIHsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgUFNfTUFYX0JBTkRTOyBiYW5kKyspIHsKICAgICAgIGhQc091dC0+aWlkTGFzdFtiYW5kXSA9IGhQc0RhdGEtPmlpZElkeExhc3RbYmFuZF07CiAgICAgICBoUHNPdXQtPmljY0xhc3RbYmFuZF0gPSBoUHNEYXRhLT5pY2NJZHhMYXN0W2JhbmRdOwogICAgIH0KIAogICAgIC8qIHNhdmUgaWlkcyBhbmQgaWNjcyBmb3IgZGlmZmVyZW50aWFsIHRpbWUgY29kaW5nIGluIHRoZSBuZXh0IGZyYW1lICovCi0gICAgaFBzRGF0YS0+bkVudmVsb3Blc0xhc3QgICA9IG5FbnZlbG9wZXM7Ci0gICAgaFBzRGF0YS0+aWlkRW5hYmxlTGFzdCAgICA9IGhQc0RhdGEtPmlpZEVuYWJsZTsKLSAgICBoUHNEYXRhLT5pY2NFbmFibGVMYXN0ICAgID0gaFBzRGF0YS0+aWNjRW5hYmxlOworICAgIGhQc0RhdGEtPm5FbnZlbG9wZXNMYXN0ID0gbkVudmVsb3BlczsKKyAgICBoUHNEYXRhLT5paWRFbmFibGVMYXN0ID0gaFBzRGF0YS0+aWlkRW5hYmxlOworICAgIGhQc0RhdGEtPmljY0VuYWJsZUxhc3QgPSBoUHNEYXRhLT5pY2NFbmFibGU7CiAgICAgaFBzRGF0YS0+aWlkUXVhbnRNb2RlTGFzdCA9IGhQc0RhdGEtPmlpZFF1YW50TW9kZTsKICAgICBoUHNEYXRhLT5pY2NRdWFudE1vZGVMYXN0ID0gaFBzRGF0YS0+aWNjUXVhbnRNb2RlOwotICAgIGZvciAoaT0wOyBpPHBzQmFuZHM7IGkrKykgewotICAgICAgaFBzRGF0YS0+aWlkSWR4TGFzdFtpXSA9IGhQc0RhdGEtPmlpZElkeFtuRW52ZWxvcGVzLTFdW2ldOwotICAgICAgaFBzRGF0YS0+aWNjSWR4TGFzdFtpXSA9IGhQc0RhdGEtPmljY0lkeFtuRW52ZWxvcGVzLTFdW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCBwc0JhbmRzOyBpKyspIHsKKyAgICAgIGhQc0RhdGEtPmlpZElkeExhc3RbaV0gPSBoUHNEYXRhLT5paWRJZHhbbkVudmVsb3BlcyAtIDFdW2ldOworICAgICAgaFBzRGF0YS0+aWNjSWR4TGFzdFtpXSA9IGhQc0RhdGEtPmljY0lkeFtuRW52ZWxvcGVzIC0gMV1baV07CiAgICAgfQogICB9IC8qIEVudmVsb3BlID4gMCAqLwogCkBAIC0xMDUxLDQgKzEwMjksMyBAQAogCiAgIHJldHVybiBlcnJvcjsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9wc19lbmNvZGUuaCBiL2xpYlNCUmVuYy9zcmMvcHNfZW5jb2RlLmgKaW5kZXggZjcyOGQ0Ny4uNDIzN2EwMCAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9wc19lbmNvZGUuaAorKysgYi9saWJTQlJlbmMvc3JjL3BzX2VuY29kZS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDU3ICs5MCw1NyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBOZXVlbmRvcmYsIE4uIFJldHRlbGJhY2gsIE0uIE11bHRydXMKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQUyBQYXJhbWV0ZXIgZXh0cmFjdGlvbiwgZW5jb2RpbmcKKyAgIEF1dGhvcihzKTogICBNLiBOZXVlbmRvcmYsIE4uIFJldHRlbGJhY2gsIE0uIE11bHRydXMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBTIFBhcmFtZXRlciBleHRyYWN0aW9uLCBlbmNvZGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBQUyBwYXJhbWV0ZXIgZXh0cmFjdGlvbiwgZW5jb2RpbmcgZnVuY3Rpb25zICAKKyAgXGJyaWVmICBQUyBwYXJhbWV0ZXIgZXh0cmFjdGlvbiwgZW5jb2RpbmcgZnVuY3Rpb25zICRSZXZpc2lvbjogOTI3OTAgJAogKi8KIAotI2lmbmRlZiBfX0lOQ0xVREVEX1BTX0VOQ09ERV9ICi0jZGVmaW5lIF9fSU5DTFVERURfUFNfRU5DT0RFX0gKKyNpZm5kZWYgUFNfRU5DT0RFX0gKKyNkZWZpbmUgUFNfRU5DT0RFX0gKIAogI2luY2x1ZGUgInBzX2NvbnN0LmgiCiAjaW5jbHVkZSAicHNfYml0ZW5jLmgiCiAKKyNkZWZpbmUgSUlEX1NDQUxFX0ZUICg2NC5mKSAvKiBtYXhWYWwgaW4gUXVhbnQgdGFiIGlzICsvLSA1MCAqLworI2RlZmluZSBJSURfU0NBTEUgNiAgICAgICAgIC8qIG1heFZhbCBpbiBRdWFudCB0YWIgaXMgKy8tIDUwICovCisjZGVmaW5lIElJRF9NQVhWQUwgKDEgPDwgSUlEX1NDQUxFKQogCi0jZGVmaW5lIElJRF9TQ0FMRV9GVCAgICAgICg2NC5mKSAgICAvKiBtYXhWYWwgaW4gUXVhbnQgdGFiIGlzICsvLSA1MCAqLwotI2RlZmluZSBJSURfU0NBTEUgICAgICAgICA2ICAgICAgICAgLyogbWF4VmFsIGluIFF1YW50IHRhYiBpcyArLy0gNTAgKi8KLSNkZWZpbmUgSUlEX01BWFZBTCAgICAgICAgKDE8PElJRF9TQ0FMRSkKKyNkZWZpbmUgUFNfUVVBTlRfU0NBTEVfRlQgXAorICAoNjQuZikgLyogZXJyb3Igc21hbGxlciAoNjQtMjUpLzY0ICogMjAgYmFuZHMgKiA0IGVudiAtPiBRdWFudFNjYWxlIDY0ICovCisjZGVmaW5lIFBTX1FVQU5UX1NDQUxFIFwKKyAgNiAvKiBlcnJvciBzbWFsbGVyICg2NC0yNSkvNjQgKiAyMCBiYW5kcyAqIDQgZW52IC0+IFF1YW50U2NhbGUgNiBiaXQgKi8KIAotI2RlZmluZSBQU19RVUFOVF9TQ0FMRV9GVCAoNjQuZikgICAgIC8qIGVycm9yIHNtYWxsZXIgKDY0LTI1KS82NCAqIDIwIGJhbmRzICogNCBlbnYgLT4gUXVhbnRTY2FsZSA2NCAqLwotI2RlZmluZSBQU19RVUFOVF9TQ0FMRSAgICA2ICAgICAgICAgIC8qIGVycm9yIHNtYWxsZXIgKDY0LTI1KS82NCAqIDIwIGJhbmRzICogNCBlbnYgLT4gUXVhbnRTY2FsZSA2IGJpdCAqLwotCi0KLSNkZWZpbmUgUU1GX0dST1VQU19MT19SRVMgICAgICAxMgotI2RlZmluZSBTVUJRTUZfR1JPVVBTX0xPX1JFUyAgIDEwCi0jZGVmaW5lIFFNRl9HUk9VUFNfSElfUkVTICAgICAgMTgKLSNkZWZpbmUgU1VCUU1GX0dST1VQU19ISV9SRVMgICAzMAotCisjZGVmaW5lIFFNRl9HUk9VUFNfTE9fUkVTIDEyCisjZGVmaW5lIFNVQlFNRl9HUk9VUFNfTE9fUkVTIDEwCisjZGVmaW5lIFFNRl9HUk9VUFNfSElfUkVTIDE4CisjZGVmaW5lIFNVQlFNRl9HUk9VUFNfSElfUkVTIDMwCiAKIHR5cGVkZWYgc3RydWN0IFRfUFNfREFUQSB7Ci0KICAgSU5UIGlpZEVuYWJsZTsKICAgSU5UIGlpZEVuYWJsZUxhc3Q7CiAgIElOVCBpaWRRdWFudE1vZGU7CiAgIElOVCBpaWRRdWFudE1vZGVMYXN0OwogICBJTlQgaWlkRGlmZk1vZGVbUFNfTUFYX0VOVkVMT1BFU107Ci0gIElOVCBpaWRJZHggICAgIFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOwotICBJTlQgaWlkSWR4TGFzdCBbUFNfTUFYX0JBTkRTXTsKKyAgSU5UIGlpZElkeFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBJTlQgaWlkSWR4TGFzdFtQU19NQVhfQkFORFNdOwogCiAgIElOVCBpY2NFbmFibGU7CiAgIElOVCBpY2NFbmFibGVMYXN0OwogICBJTlQgaWNjUXVhbnRNb2RlOwogICBJTlQgaWNjUXVhbnRNb2RlTGFzdDsKICAgSU5UIGljY0RpZmZNb2RlW1BTX01BWF9FTlZFTE9QRVNdOwotICBJTlQgaWNjSWR4ICAgICBbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKLSAgSU5UIGljY0lkeExhc3QgW1BTX01BWF9CQU5EU107CisgIElOVCBpY2NJZHhbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKKyAgSU5UIGljY0lkeExhc3RbUFNfTUFYX0JBTkRTXTsKIAogICBJTlQgbkVudmVsb3Blc0xhc3Q7CiAKQEAgLTE0MCw0OCArMTUxLDM1IEBACiAKIH0gUFNfREFUQSwgKkhBTkRMRV9QU19EQVRBOwogCit0eXBlZGVmIHN0cnVjdCBUX1BTX0VOQ09ERSB7CisgIFBTX0RBVEEgcHNEYXRhOwogCi10eXBlZGVmIHN0cnVjdCBUX1BTX0VOQ09ERXsKKyAgUFNfQkFORFMgcHNFbmNNb2RlOworICBJTlQgblFtZklpZEdyb3VwczsKKyAgSU5UIG5TdWJRbWZJaWRHcm91cHM7CisgIElOVCBpaWRHcm91cEJvcmRlcnNbUU1GX0dST1VQU19ISV9SRVMgKyBTVUJRTUZfR1JPVVBTX0hJX1JFUyArIDFdOworICBJTlQgc3ViYmFuZDJwYXJhbWV0ZXJJbmRleFtRTUZfR1JPVVBTX0hJX1JFUyArIFNVQlFNRl9HUk9VUFNfSElfUkVTXTsKKyAgVUNIQVIgaWlkR3JvdXBXaWR0aExkW1FNRl9HUk9VUFNfSElfUkVTICsgU1VCUU1GX0dST1VQU19ISV9SRVNdOworICBGSVhQX0RCTCBpaWRRdWFudEVycm9yVGhyZXNob2xkOwogCi0gIFBTX0RBVEEgICAgICAgICBwc0RhdGE7Ci0KLSAgUFNfQkFORFMgICAgICAgIHBzRW5jTW9kZTsKLSAgSU5UICAgICAgICAgICAgIG5RbWZJaWRHcm91cHM7Ci0gIElOVCAgICAgICAgICAgICBuU3ViUW1mSWlkR3JvdXBzOwotICBJTlQgICAgICAgICAgICAgaWlkR3JvdXBCb3JkZXJzW1FNRl9HUk9VUFNfSElfUkVTICsgU1VCUU1GX0dST1VQU19ISV9SRVMgKyAxXTsKLSAgSU5UICAgICAgICAgICAgIHN1YmJhbmQycGFyYW1ldGVySW5kZXhbUU1GX0dST1VQU19ISV9SRVMgKyBTVUJRTUZfR1JPVVBTX0hJX1JFU107Ci0gIFVDSEFSICAgICAgICAgICBpaWRHcm91cFdpZHRoTGRbUU1GX0dST1VQU19ISV9SRVMgKyBTVUJRTUZfR1JPVVBTX0hJX1JFU107Ci0gIEZJWFBfREJMICAgICAgICBpaWRRdWFudEVycm9yVGhyZXNob2xkOwotCi0gIFVDSEFSICAgICAgICAgICBwc0JhbmROcmdTY2FsZSBbUFNfTUFYX0JBTkRTXTsKKyAgVUNIQVIgcHNCYW5kTnJnU2NhbGVbUFNfTUFYX0JBTkRTXTsKIAogfSBQU19FTkNPREU7CiAKLQogdHlwZWRlZiBzdHJ1Y3QgVF9QU19FTkNPREUgKkhBTkRMRV9QU19FTkNPREU7CiAKLUZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfQ3JlYXRlUFNFbmNvZGUoCi0gICAgICAgIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAqcGhQc0VuY29kZQotICAgICAgICApOworRkRLX1BTRU5DX0VSUk9SIEZES3NickVuY19DcmVhdGVQU0VuY29kZShIQU5ETEVfUFNfRU5DT0RFICpwaFBzRW5jb2RlKTsKIAotRkRLX1BTRU5DX0VSUk9SIEZES3NickVuY19Jbml0UFNFbmNvZGUoCi0gICAgICAgIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAgaFBzRW5jb2RlLAotICAgICAgICBjb25zdCBQU19CQU5EUyAgICAgICAgICAgIHBzRW5jTW9kZSwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICBpaWRRdWFudEVycm9yVGhyZXNob2xkCi0gICAgICAgICk7CitGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX0luaXRQU0VuY29kZShIQU5ETEVfUFNfRU5DT0RFIGhQc0VuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0JBTkRTIHBzRW5jTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGlpZFF1YW50RXJyb3JUaHJlc2hvbGQpOwogCi1GREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX0Rlc3Ryb3lQU0VuY29kZSgKLSAgICAgICAgSEFORExFX1BTX0VOQ09ERSAgICAgICAgICpwaFBzRW5jb2RlCi0gICAgICAgICk7CitGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX0Rlc3Ryb3lQU0VuY29kZShIQU5ETEVfUFNfRU5DT0RFICpwaFBzRW5jb2RlKTsKIAogRkRLX1BTRU5DX0VSUk9SIEZES3NickVuY19QU0VuY29kZSgKLSAgICAgICAgSEFORExFX1BTX0VOQ09ERSAgICAgICAgICBoUHNFbmNvZGUsCi0gICAgICAgIEhBTkRMRV9QU19PVVQgICAgICAgICAgICAgaFBzT3V0LAotICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgKmR5bkJhbmRTY2FsZSwKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICBtYXhFbnZlbG9wZXMsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAqaHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBzZW5kSGVhZGVyCi0gICAgICAgICk7CisgICAgSEFORExFX1BTX0VOQ09ERSBoUHNFbmNvZGUsIEhBTkRMRV9QU19PVVQgaFBzT3V0LCBVQ0hBUiAqZHluQmFuZFNjYWxlLAorICAgIFVJTlQgbWF4RW52ZWxvcGVzLAorICAgIEZJWFBfREJMICpoeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl0sCisgICAgY29uc3QgSU5UIGZyYW1lU2l6ZSwgY29uc3QgSU5UIHNlbmRIZWFkZXIpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvcHNfbWFpbi5jcHAgYi9saWJTQlJlbmMvc3JjL3BzX21haW4uY3BwCmluZGV4IGFiMTgzZTIuLjRkN2E3YTUgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvcHNfbWFpbi5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy9wc19tYWluLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw5MiArOTAsODIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUcgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIEF1dGhvcnM6ICAgICAgTS4gTXVsdHJ1cwotICAgQ29udGVudHMvRGVzY3JpcHRpb246IFBTIFdyYXBwZXIsIERvd25taXgKKyAgIEF1dGhvcihzKTogICBNLiBNdWx0cnVzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBQUyBXcmFwcGVyLCBEb3dubWl4CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJwc19tYWluLmgiCiAKLQogLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicHNfY29uc3QuaCIKICNpbmNsdWRlICJwc19iaXRlbmMuaCIKLQotI2luY2x1ZGUgInNicl9yYW0uaCIKKyNpbmNsdWRlICJzYnJlbmNfcmFtLmgiCiAKIC8qLS0tLS0tLS0tLS0tLS0tIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBwc0ZpbmRCZXN0U2NhbGluZygKLSAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpoeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl0sCi0gICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAqZHluQmFuZFNjYWxlLAotICAgICAgICBGSVhQX1FNRiAgICAgICAgICAgICAgICAgKm1heEJhbmRWYWx1ZSwKLSAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgICAgICpkbXhTY2FsZQotICAgICAgICApOworICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICBGSVhQX0RCTCAqaHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdLAorICAgIFVDSEFSICpkeW5CYW5kU2NhbGUsIEZJWFBfREJMICptYXhCYW5kVmFsdWUsIFNDSEFSICpkbXhTY2FsZSk7CiAKIC8qLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tKi8KLUZES19QU0VOQ19FUlJPUiBQU0VuY19DcmVhdGUoCi0gICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAqcGhQYXJhbWV0cmljU3RlcmVvCi0gICAgICAgICkKLXsKK0ZES19QU0VOQ19FUlJPUiBQU0VuY19DcmVhdGUoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICpwaFBhcmFtZXRyaWNTdGVyZW8pIHsKICAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CisgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbyA9IE5VTEw7CiAKLSAgaWYgKHBoUGFyYW1ldHJpY1N0ZXJlbz09TlVMTCkgeworICBpZiAocGhQYXJhbWV0cmljU3RlcmVvID09IE5VTEwpIHsKICAgICBlcnJvciA9IFBTRU5DX0lOVkFMSURfSEFORExFOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGludCBpOwotICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbyA9IE5VTEw7CiAKLSAgICBpZiAoTlVMTD09KGhQYXJhbWV0cmljU3RlcmVvID0gR2V0UmFtX1BhcmFtU3RlcmVvKCkpKSB7CisgICAgaWYgKE5VTEwgPT0gKGhQYXJhbWV0cmljU3RlcmVvID0gR2V0UmFtX1BhcmFtU3RlcmVvKCkpKSB7CiAgICAgICBlcnJvciA9IFBTRU5DX01FTU9SWV9FUlJPUjsKICAgICAgIGdvdG8gYmFpbDsKICAgICB9CiAgICAgRkRLbWVtY2xlYXIoaFBhcmFtZXRyaWNTdGVyZW8sIHNpemVvZihQQVJBTUVUUklDX1NURVJFTykpOwogCi0gICAgaWYgKFBTRU5DX09LICE9IChlcnJvciA9IEZES3NickVuY19DcmVhdGVQU0VuY29kZSgmaFBhcmFtZXRyaWNTdGVyZW8tPmhQc0VuY29kZSkpKSB7CisgICAgaWYgKFBTRU5DX09LICE9CisgICAgICAgIChlcnJvciA9IEZES3NickVuY19DcmVhdGVQU0VuY29kZSgmaFBhcmFtZXRyaWNTdGVyZW8tPmhQc0VuY29kZSkpKSB7CisgICAgICBlcnJvciA9IFBTRU5DX01FTU9SWV9FUlJPUjsKICAgICAgIGdvdG8gYmFpbDsKICAgICB9CiAKLSAgICBmb3IgKGk9MDsgaTxNQVhfUFNfQ0hBTk5FTFM7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUFNfQ0hBTk5FTFM7IGkrKykgewogICAgICAgaWYgKEZES2h5YnJpZEFuYWx5c2lzT3BlbigKLSAgICAgICAgICAgICZoUGFyYW1ldHJpY1N0ZXJlby0+ZmRrSHliQW5hRmlsdGVyW2ldLAotICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YkFuYVN0YXRlc0xGW2ldLAotICAgICAgICAgICAgIHNpemVvZihoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJBbmFTdGF0ZXNMRltpXSksCi0gICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHliQW5hU3RhdGVzSEZbaV0sCi0gICAgICAgICAgICAgc2l6ZW9mKGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YkFuYVN0YXRlc0hGW2ldKQotICAgICAgICAgICAgICkgIT0wICkKLSAgICAgIHsKKyAgICAgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJBbmFGaWx0ZXJbaV0sCisgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YkFuYVN0YXRlc0xGW2ldLAorICAgICAgICAgICAgICBzaXplb2YoaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHliQW5hU3RhdGVzTEZbaV0pLAorICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJBbmFTdGF0ZXNIRltpXSwKKyAgICAgICAgICAgICAgc2l6ZW9mKGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YkFuYVN0YXRlc0hGW2ldKSkgIT0gMCkgewogICAgICAgICBlcnJvciA9IFBTRU5DX01FTU9SWV9FUlJPUjsKICAgICAgICAgZ290byBiYWlsOwogICAgICAgfQogICAgIH0KKyAgfQogCitiYWlsOgorICBpZiAocGhQYXJhbWV0cmljU3RlcmVvICE9IE5VTEwpIHsKICAgICAqcGhQYXJhbWV0cmljU3RlcmVvID0gaFBhcmFtZXRyaWNTdGVyZW87IC8qIHJldHVybiBhbGxvY2F0ZWQgaGFuZGxlICovCiAgIH0KLWJhaWw6CisKKyAgaWYgKGVycm9yICE9IFBTRU5DX09LKSB7CisgICAgUFNFbmNfRGVzdHJveShwaFBhcmFtZXRyaWNTdGVyZW8pOworICB9CiAgIHJldHVybiBlcnJvcjsKIH0KIAotRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0luaXQoCi0gICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgIGNvbnN0IEhBTkRMRV9QU0VOQ19DT05GSUcgaFBzRW5jQ29uZmlnLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIG5vUW1mU2xvdHMsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgbm9RbWZCYW5kcwotICAgICAgICxVQ0hBUiAgICAgICAgICAgICAgICAgICAgKmR5bmFtaWNfUkFNCi0gICAgICAgICkKLXsKK0ZES19QU0VOQ19FUlJPUiBQU0VuY19Jbml0KEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhBTkRMRV9QU0VOQ19DT05GSUcgaFBzRW5jQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vUW1mU2xvdHMsIElOVCBub1FtZkJhbmRzLCBVQ0hBUiAqZHluYW1pY19SQU0pIHsKICAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CiAKLSAgaWYgKCAoTlVMTD09aFBhcmFtZXRyaWNTdGVyZW8pIHx8IChOVUxMPT1oUHNFbmNDb25maWcpICkgeworICBpZiAoKE5VTEwgPT0gaFBhcmFtZXRyaWNTdGVyZW8pIHx8IChOVUxMID09IGhQc0VuY0NvbmZpZykpIHsKICAgICBlcnJvciA9IFBTRU5DX0lOVkFMSURfSEFORExFOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGludCBjaCwgaTsKIAogICAgIGhQYXJhbWV0cmljU3RlcmVvLT5pbml0UFMgPSAxOwpAQCAtMTcyLDgyICsxNzMsODMgQEAKICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZCYW5kcyA9IG5vUW1mQmFuZHM7CiAKICAgICAvKiBjbGVhciBkZWxheSBsaW5lcyAqLwotICAgIEZES21lbWNsZWFyKGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheUxpbmVzLCBzaXplb2YoaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5TGluZXMpKTsKKyAgICBGREttZW1jbGVhcihoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlMaW5lcywKKyAgICAgICAgICAgICAgICBzaXplb2YoaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5TGluZXMpKTsKIAotICAgIGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlID0gRlJBQ1RfQklUUy0xOworICAgIGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlID0gRlJBQ1RfQklUUyAtIDE7CiAKICAgICAvKiBjcmVhdGUgY29uZmlndXJhdGlvbiBmb3IgaHlicmlkIGZpbHRlciBiYW5rICovCi0gICAgZm9yIChjaD0wOyBjaDxNQVhfUFNfQ0hBTk5FTFM7IGNoKyspIHsKLSAgICAgIEZES2h5YnJpZEFuYWx5c2lzSW5pdCgKLSAgICAgICAgICAgICZoUGFyYW1ldHJpY1N0ZXJlby0+ZmRrSHliQW5hRmlsdGVyW2NoXSwKLSAgICAgICAgICAgICBUSFJFRV9UT19URU4sCi0gICAgICAgICAgICAgUU1GX0NIQU5ORUxTLAotICAgICAgICAgICAgIFFNRl9DSEFOTkVMUywKLSAgICAgICAgICAgICAxCi0gICAgICAgICAgICAgKTsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBNQVhfUFNfQ0hBTk5FTFM7IGNoKyspIHsKKyAgICAgIEZES2h5YnJpZEFuYWx5c2lzSW5pdCgmaFBhcmFtZXRyaWNTdGVyZW8tPmZka0h5YkFuYUZpbHRlcltjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSRUVfVE9fVEVOLCA2NCwgNjQsIDEpOwogICAgIH0gLyogY2ggKi8KIAotICAgIEZES2h5YnJpZFN5bnRoZXNpc0luaXQoCi0gICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJTeW5GaWx0ZXIsCi0gICAgICAgICAgIFRIUkVFX1RPX1RFTiwKLSAgICAgICAgICAgUU1GX0NIQU5ORUxTLAotICAgICAgICAgICBRTUZfQ0hBTk5FTFMKLSAgICAgICAgICAgKTsKKyAgICBGREtoeWJyaWRTeW50aGVzaXNJbml0KCZoUGFyYW1ldHJpY1N0ZXJlby0+ZmRrSHliU3luRmlsdGVyLCBUSFJFRV9UT19URU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCwgNjQpOwogCiAgICAgLyogZGV0ZXJtaW5lIGF2ZXJhZ2UgZGVsYXkgKi8KLSAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cHNEZWxheSA9IChIWUJSSURfRklMVEVSX0RFTEFZKmhQYXJhbWV0cmljU3RlcmVvLT5ub1FtZkJhbmRzKTsKKyAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cHNEZWxheSA9CisgICAgICAgIChIWUJSSURfRklMVEVSX0RFTEFZICogaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mQmFuZHMpOwogCi0gICAgaWYgKCAoaFBzRW5jQ29uZmlnLT5tYXhFbnZlbG9wZXMgPCBQU0VOQ19ORU5WXzEpIHx8IChoUHNFbmNDb25maWctPm1heEVudmVsb3BlcyA+IFBTRU5DX05FTlZfTUFYKSApIHsKKyAgICBpZiAoKGhQc0VuY0NvbmZpZy0+bWF4RW52ZWxvcGVzIDwgUFNFTkNfTkVOVl8xKSB8fAorICAgICAgICAoaFBzRW5jQ29uZmlnLT5tYXhFbnZlbG9wZXMgPiBQU0VOQ19ORU5WX01BWCkpIHsKICAgICAgIGhQc0VuY0NvbmZpZy0+bWF4RW52ZWxvcGVzID0gUFNFTkNfTkVOVl9ERUZBVUxUOwogICAgIH0KICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+bWF4RW52ZWxvcGVzID0gaFBzRW5jQ29uZmlnLT5tYXhFbnZlbG9wZXM7CiAKLSAgICBpZiAoUFNFTkNfT0sgIT0gKGVycm9yID0gRkRLc2JyRW5jX0luaXRQU0VuY29kZShoUGFyYW1ldHJpY1N0ZXJlby0+aFBzRW5jb2RlLCAoUFNfQkFORFMpIGhQc0VuY0NvbmZpZy0+blN0ZXJlb0JhbmRzLCBoUHNFbmNDb25maWctPmlpZFF1YW50RXJyb3JUaHJlc2hvbGQpKSl7CisgICAgaWYgKFBTRU5DX09LICE9CisgICAgICAgIChlcnJvciA9IEZES3NickVuY19Jbml0UFNFbmNvZGUoCisgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPmhQc0VuY29kZSwgKFBTX0JBTkRTKWhQc0VuY0NvbmZpZy0+blN0ZXJlb0JhbmRzLAorICAgICAgICAgICAgIGhQc0VuY0NvbmZpZy0+aWlkUXVhbnRFcnJvclRocmVzaG9sZCkpKSB7CiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCi0gICAgZm9yIChjaCA9IDA7IGNoPE1BWF9QU19DSEFOTkVMUzsgY2ggKyspIHsKLSAgICAgIEZJWFBfREJMICpwRHluUmVhbCA9IEdldFJhbV9TYnJfZW52UkJ1ZmZlciAoY2gsIGR5bmFtaWNfUkFNKTsKLSAgICAgIEZJWFBfREJMICpwRHluSW1hZyA9IEdldFJhbV9TYnJfZW52SUJ1ZmZlciAoY2gsIGR5bmFtaWNfUkFNKTsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBNQVhfUFNfQ0hBTk5FTFM7IGNoKyspIHsKKyAgICAgIEZJWFBfREJMICpwRHluUmVhbCA9IEdldFJhbV9TYnJfZW52UkJ1ZmZlcihjaCwgZHluYW1pY19SQU0pOworICAgICAgRklYUF9EQkwgKnBEeW5JbWFnID0gR2V0UmFtX1Nicl9lbnZJQnVmZmVyKGNoLCBkeW5hbWljX1JBTSk7CiAKLSAgICAgIGZvciAoaT0wOyBpPEhZQlJJRF9GUkFNRVNJWkU7IGkrKykgewotICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaStIWUJSSURfUkVBRF9PRkZTRVRdW2NoXVswXSA9ICZwRHluUmVhbFtpKk1BWF9IWUJSSURfQkFORFNdOwotICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaStIWUJSSURfUkVBRF9PRkZTRVRdW2NoXVsxXSA9ICZwRHluSW1hZ1tpKk1BWF9IWUJSSURfQkFORFNdOzsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBIWUJSSURfRlJBTUVTSVpFOyBpKyspIHsKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2kgKyBIWUJSSURfUkVBRF9PRkZTRVRdW2NoXVswXSA9CisgICAgICAgICAgICAmcER5blJlYWxbaSAqIE1BWF9IWUJSSURfQkFORFNdOworICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaSArIEhZQlJJRF9SRUFEX09GRlNFVF1bY2hdWzFdID0KKyAgICAgICAgICAgICZwRHluSW1hZ1tpICogTUFYX0hZQlJJRF9CQU5EU107CisgICAgICAgIDsKICAgICAgIH0KIAotICAgICAgZm9yIChpPTA7IGk8SFlCUklEX1JFQURfT0ZGU0VUOyBpKyspIHsKLSAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2ldW2NoXVswXSA9IGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YnJpZERhdGFbaV1bY2hdWzBdOwotICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaV1bY2hdWzFdID0gaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHlicmlkRGF0YVtpXVtjaF1bMV07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgSFlCUklEX1JFQURfT0ZGU0VUOyBpKyspIHsKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2ldW2NoXVswXSA9CisgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJyaWREYXRhW2ldW2NoXVswXTsKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2ldW2NoXVsxXSA9CisgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJyaWREYXRhW2ldW2NoXVsxXTsKICAgICAgIH0KICAgICB9IC8qIGNoICovCiAKICAgICAvKiBjbGVhciBzdGF0aWMgaHlicmlkIGJ1ZmZlciAqLwotICAgIEZES21lbWNsZWFyKGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YnJpZERhdGEsIHNpemVvZihoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJyaWREYXRhKSk7CisgICAgRkRLbWVtY2xlYXIoaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHlicmlkRGF0YSwKKyAgICAgICAgICAgICAgICBzaXplb2YoaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHlicmlkRGF0YSkpOwogCiAgICAgLyogY2xlYXIgYnMgYnVmZmVyICovCiAgICAgRkRLbWVtY2xlYXIoaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0LCBzaXplb2YoaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0KSk7CiAKLSAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXRbMF0uZW5hYmxlUFNIZWFkZXIgPSAxOyAvKiB3cml0ZSBwcyBoZWFkZXIgaW4gZmlyc3QgZnJhbWUgKi8KKyAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXRbMF0uZW5hYmxlUFNIZWFkZXIgPQorICAgICAgICAxOyAvKiB3cml0ZSBwcyBoZWFkZXIgaW4gZmlyc3QgZnJhbWUgKi8KIAogICAgIC8qIGNsZWFyIHNjYWxpbmcgYnVmZmVyICovCi0gICAgRkRLbWVtY2xlYXIoaFBhcmFtZXRyaWNTdGVyZW8tPmR5bkJhbmRTY2FsZSwgc2l6ZW9mKFVDSEFSKSpQU19NQVhfQkFORFMpOwotICAgIEZES21lbWNsZWFyKGhQYXJhbWV0cmljU3RlcmVvLT5tYXhCYW5kVmFsdWUsIHNpemVvZihGSVhQX1FNRikqUFNfTUFYX0JBTkRTKTsKKyAgICBGREttZW1jbGVhcihoUGFyYW1ldHJpY1N0ZXJlby0+ZHluQmFuZFNjYWxlLCBzaXplb2YoVUNIQVIpICogUFNfTUFYX0JBTkRTKTsKKyAgICBGREttZW1jbGVhcihoUGFyYW1ldHJpY1N0ZXJlby0+bWF4QmFuZFZhbHVlLAorICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBQU19NQVhfQkFORFMpOwogCiAgIH0gLyogdmFsaWQgaGFuZGxlICovCiBiYWlsOgogICByZXR1cm4gZXJyb3I7CiB9CiAKLQotRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0Rlc3Ryb3koCi0gICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAqcGhQYXJhbWV0cmljU3RlcmVvCi0gICAgICAgICkKLXsKK0ZES19QU0VOQ19FUlJPUiBQU0VuY19EZXN0cm95KEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAqcGhQYXJhbWV0cmljU3RlcmVvKSB7CiAgIEZES19QU0VOQ19FUlJPUiBlcnJvciA9IFBTRU5DX09LOwogCi0gIGlmIChOVUxMIT1waFBhcmFtZXRyaWNTdGVyZW8pIHsKKyAgaWYgKE5VTEwgIT0gcGhQYXJhbWV0cmljU3RlcmVvKSB7CiAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvID0gKnBoUGFyYW1ldHJpY1N0ZXJlbzsKLSAgICBpZihoUGFyYW1ldHJpY1N0ZXJlbyAhPSBOVUxMKXsKKyAgICBpZiAoaFBhcmFtZXRyaWNTdGVyZW8gIT0gTlVMTCkgewogICAgICAgRkRLc2JyRW5jX0Rlc3Ryb3lQU0VuY29kZSgmaFBhcmFtZXRyaWNTdGVyZW8tPmhQc0VuY29kZSk7CiAgICAgICBGcmVlUmFtX1BhcmFtU3RlcmVvKHBoUGFyYW1ldHJpY1N0ZXJlbyk7CiAgICAgfQpAQCAtMjU3LDMyICsyNTksMjQgQEAKIH0KIAogc3RhdGljIEZES19QU0VOQ19FUlJPUiBFeHRyYWN0UFNQYXJhbWV0ZXJzKAotICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgIHNlbmRIZWFkZXIsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAqaHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdCi0gICAgICAgICkKLXsKKyAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sIGNvbnN0IGludCBzZW5kSGVhZGVyLAorICAgIEZJWFBfREJMICpoeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl0pIHsKICAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CiAKICAgaWYgKGhQYXJhbWV0cmljU3RlcmVvID09IE5VTEwpIHsKICAgICBlcnJvciA9IFBTRU5DX0lOVkFMSURfSEFORExFOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIC8qIGNhbGwgcHMgZW5jb2RlIGZ1bmN0aW9uICovCi0gICAgaWYgKGhQYXJhbWV0cmljU3RlcmVvLT5pbml0UFMpeworICAgIGlmIChoUGFyYW1ldHJpY1N0ZXJlby0+aW5pdFBTKSB7CiAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXRbMV0gPSBoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXRbMF07CiAgICAgfQogICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wc091dFswXSA9IGhQYXJhbWV0cmljU3RlcmVvLT5wc091dFsxXTsKIAotICAgIGlmIChQU0VOQ19PSyAhPSAoZXJyb3IgPSBGREtzYnJFbmNfUFNFbmNvZGUoCi0gICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+aFBzRW5jb2RlLAotICAgICAgICAgICAmaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0WzFdLAotICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPmR5bkJhbmRTY2FsZSwKLSAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5tYXhFbnZlbG9wZXMsCi0gICAgICAgICAgICBoeWJyaWREYXRhLAotICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mU2xvdHMsCi0gICAgICAgICAgICBzZW5kSGVhZGVyKSkpCi0gICAgeworICAgIGlmIChQU0VOQ19PSyAhPQorICAgICAgICAoZXJyb3IgPSBGREtzYnJFbmNfUFNFbmNvZGUoCisgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPmhQc0VuY29kZSwgJmhQYXJhbWV0cmljU3RlcmVvLT5wc091dFsxXSwKKyAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+ZHluQmFuZFNjYWxlLCBoUGFyYW1ldHJpY1N0ZXJlby0+bWF4RW52ZWxvcGVzLAorICAgICAgICAgICAgIGh5YnJpZERhdGEsIGhQYXJhbWV0cmljU3RlcmVvLT5ub1FtZlNsb3RzLCBzZW5kSGVhZGVyKSkpIHsKICAgICAgIGdvdG8gYmFpbDsKICAgICB9CiAKQEAgLTI5NSwyMDkgKzI4OSwyMDEgQEAKICAgcmV0dXJuIGVycm9yOwogfQogCi0KIHN0YXRpYyBGREtfUFNFTkNfRVJST1IgRG93bm1peFBTUW1mRGF0YSgKLSAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgICAgc2JyU3ludGhRbWYsCi0gICAgICAgRklYUF9RTUYgICAgICAgKipSRVNUUklDVCBtaXhSZWFsUW1mRGF0YSwKLSAgICAgICBGSVhQX1FNRiAgICAgICAqKlJFU1RSSUNUIG1peEltYWdRbWZEYXRhLAotICAgICAgIElOVF9QQ00gICAgICAgICAgICAgICAgICAqZG93bnNhbXBsZWRPdXRTaWduYWwsCi0gICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpoeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl0sCi0gICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBub1FtZlNsb3RzLAotICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgcHNRbWZTY2FsZVtNQVhfUFNfQ0hBTk5FTFNdLAotICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICAgICAqcW1mU2NhbGUKLSAgICAgICApCi17CisgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc2JyU3ludGhRbWYsIEZJWFBfREJMICoqUkVTVFJJQ1QgbWl4UmVhbFFtZkRhdGEsCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBtaXhJbWFnUW1mRGF0YSwgSU5UX1BDTSAqZG93bnNhbXBsZWRPdXRTaWduYWwsCisgICAgY29uc3QgVUlOVCBkb3duc2FtcGxlZE91dFNpZ25hbEJ1ZlNpemUsCisgICAgRklYUF9EQkwgKmh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRV1bTUFYX1BTX0NIQU5ORUxTXVsyXSwKKyAgICBjb25zdCBJTlQgbm9RbWZTbG90cywgY29uc3QgSU5UIHBzUW1mU2NhbGVbTUFYX1BTX0NIQU5ORUxTXSwKKyAgICBTQ0hBUiAqcW1mU2NhbGUpIHsKICAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CiAKLSAgaWYoaFBhcmFtZXRyaWNTdGVyZW8gPT0gTlVMTCl7CisgIGlmIChoUGFyYW1ldHJpY1N0ZXJlbyA9PSBOVUxMKSB7CiAgICAgZXJyb3IgPSBQU0VOQ19JTlZBTElEX0hBTkRMRTsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBpbnQgbiwgazsKLSAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHBXb3JrQnVmZmVyLCBGSVhQX1FNRiwgMipRTUZfQ0hBTk5FTFMpCisgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChwV29ya0J1ZmZlciwgRklYUF9EQkwsIDIgKiA2NCkKIAogICAgIC8qIGRlZmluZSBzY2FsaW5ncyAqLwotICAgIGludCBkeW5RbWZTY2FsZSA9IGZpeE1heCgwLCBoUGFyYW1ldHJpY1N0ZXJlby0+ZG14U2NhbGUtMSk7IC8qIHNjYWxlIG9uZSBiaXQgbW9yZSBmb3IgYWRkaXRpb24gb2YgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICBpbnQgZHluUW1mU2NhbGUgPSBmaXhNYXgoCisgICAgICAgIDAsIGhQYXJhbWV0cmljU3RlcmVvLT5kbXhTY2FsZSAtCisgICAgICAgICAgICAgICAxKTsgLyogc2NhbGUgb25lIGJpdCBtb3JlIGZvciBhZGRpdGlvbiBvZiBsZWZ0IGFuZCByaWdodCAqLwogICAgIGludCBkb3dubWl4U2NhbGUgPSBwc1FtZlNjYWxlWzBdIC0gZHluUW1mU2NhbGU7CiAgICAgY29uc3QgRklYUF9EQkwgbWF4U3RlcmVvU2NhbGVGYWN0b3IgPSBNQVhWQUxfREJMOyAvKiAyLmYvMi5mICovCiAKLSAgICBmb3IgKG4gPSAwOyBuPG5vUW1mU2xvdHM7IG4rKykgewotCisgICAgZm9yIChuID0gMDsgbiA8IG5vUW1mU2xvdHM7IG4rKykgewogICAgICAgRklYUF9EQkwgdG1wSHlicmlkWzJdW01BWF9IWUJSSURfQkFORFNdOwogCi0gICAgICBmb3IoayA9IDA7IGs8NzE7IGsrKyl7Ci0gICAgICAgICAgaW50IGR5blNjYWxlLCBzYzsgLyogc2NhbGluZyAqLwotICAgICAgICAgIEZJWFBfUU1GIHRtcExlZnRSZWFsLCB0bXBSaWdodFJlYWwsIHRtcExlZnRJbWFnLCB0bXBSaWdodEltYWc7Ci0gICAgICAgICAgRklYUF9EQkwgdG1wU2NhbGVGYWN0b3IsIHN0ZXJlb1NjYWxlRmFjdG9yOworICAgICAgZm9yIChrID0gMDsgayA8IDcxOyBrKyspIHsKKyAgICAgICAgaW50IGR5blNjYWxlLCBzYzsgLyogc2NhbGluZyAqLworICAgICAgICBGSVhQX0RCTCB0bXBMZWZ0UmVhbCwgdG1wUmlnaHRSZWFsLCB0bXBMZWZ0SW1hZywgdG1wUmlnaHRJbWFnOworICAgICAgICBGSVhQX0RCTCB0bXBTY2FsZUZhY3Rvciwgc3RlcmVvU2NhbGVGYWN0b3I7CiAKLSAgICAgICAgICB0bXBMZWZ0UmVhbCAgPSBoeWJyaWREYXRhW25dWzBdWzBdW2tdOwotICAgICAgICAgIHRtcExlZnRJbWFnICA9IGh5YnJpZERhdGFbbl1bMF1bMV1ba107Ci0gICAgICAgICAgdG1wUmlnaHRSZWFsID0gaHlicmlkRGF0YVtuXVsxXVswXVtrXTsKLSAgICAgICAgICB0bXBSaWdodEltYWcgPSBoeWJyaWREYXRhW25dWzFdWzFdW2tdOworICAgICAgICB0bXBMZWZ0UmVhbCA9IGh5YnJpZERhdGFbbl1bMF1bMF1ba107CisgICAgICAgIHRtcExlZnRJbWFnID0gaHlicmlkRGF0YVtuXVswXVsxXVtrXTsKKyAgICAgICAgdG1wUmlnaHRSZWFsID0gaHlicmlkRGF0YVtuXVsxXVswXVtrXTsKKyAgICAgICAgdG1wUmlnaHRJbWFnID0gaHlicmlkRGF0YVtuXVsxXVsxXVtrXTsKIAotICAgICAgICAgIHNjID0gZml4TWF4KDAsQ250TGVhZGluZ1plcm9zKCBmaXhNYXgoZml4TWF4KGZpeHBfYWJzKHRtcExlZnRSZWFsKSxmaXhwX2Ficyh0bXBMZWZ0SW1hZykpLGZpeE1heChmaXhwX2Ficyh0bXBSaWdodFJlYWwpLGZpeHBfYWJzKHRtcFJpZ2h0SW1hZykpKSApLTIpOworICAgICAgICBzYyA9IGZpeE1heCgKKyAgICAgICAgICAgIDAsIENudExlYWRpbmdaZXJvcyhmaXhNYXgoCisgICAgICAgICAgICAgICAgICAgZml4TWF4KGZpeHBfYWJzKHRtcExlZnRSZWFsKSwgZml4cF9hYnModG1wTGVmdEltYWcpKSwKKyAgICAgICAgICAgICAgICAgICBmaXhNYXgoZml4cF9hYnModG1wUmlnaHRSZWFsKSwgZml4cF9hYnModG1wUmlnaHRJbWFnKSkpKSAtCisgICAgICAgICAgICAgICAgICAgMik7CiAKLSAgICAgICAgICB0bXBMZWZ0UmVhbCAgPDw9IHNjOyB0bXBMZWZ0SW1hZyAgPDw9IHNjOwotICAgICAgICAgIHRtcFJpZ2h0UmVhbCA8PD0gc2M7IHRtcFJpZ2h0SW1hZyA8PD0gc2M7Ci0gICAgICAgICAgZHluU2NhbGUgPSBmaXhNaW4oc2MtZHluUW1mU2NhbGUsREZSQUNUX0JJVFMtMSk7CisgICAgICAgIHRtcExlZnRSZWFsIDw8PSBzYzsKKyAgICAgICAgdG1wTGVmdEltYWcgPDw9IHNjOworICAgICAgICB0bXBSaWdodFJlYWwgPDw9IHNjOworICAgICAgICB0bXBSaWdodEltYWcgPDw9IHNjOworICAgICAgICBkeW5TY2FsZSA9IGZpeE1pbihzYyAtIGR5blFtZlNjYWxlLCBERlJBQ1RfQklUUyAtIDEpOwogCi0gICAgICAgICAgLyogY2FsYyBzdGVyZW8gc2NhbGUgZmFjdG9yIHRvIGF2b2lkIGxvc3Mgb2YgZW5lcmd5IGluIGJhbmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogc3RlcmVvIHNjYWxlIGZhY3RvciA9IG1pbigyLjBmLCBzcXJ0KCAoYWJzKGwoaywgbileMiArIGFicyhyKGssIG4pXjIgKSkpLygwLjVmKmFicyhsKGssIG4pICsgcihrLCBuKSkpICkpICovCi0gICAgICAgICAgc3RlcmVvU2NhbGVGYWN0b3IgPSBmUG93MkRpdjIodG1wTGVmdFJlYWwpICArIGZQb3cyRGl2Mih0bXBMZWZ0SW1hZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZQb3cyRGl2Mih0bXBSaWdodFJlYWwpICsgZlBvdzJEaXYyKHRtcFJpZ2h0SW1hZykgOworICAgICAgICAvKiBjYWxjIHN0ZXJlbyBzY2FsZSBmYWN0b3IgdG8gYXZvaWQgbG9zcyBvZiBlbmVyZ3kgaW4gYmFuZHMgKi8KKyAgICAgICAgLyogc3RlcmVvIHNjYWxlIGZhY3RvciA9IG1pbigyLjBmLCBzcXJ0KCAoYWJzKGwoaywgbileMiArIGFicyhyKGssIG4pXjIKKyAgICAgICAgICogKSkpLygwLjVmKmFicyhsKGssIG4pICsgcihrLCBuKSkpICkpICovCisgICAgICAgIHN0ZXJlb1NjYWxlRmFjdG9yID0gZlBvdzJEaXYyKHRtcExlZnRSZWFsKSArIGZQb3cyRGl2Mih0bXBMZWZ0SW1hZykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQb3cyRGl2Mih0bXBSaWdodFJlYWwpICsgZlBvdzJEaXYyKHRtcFJpZ2h0SW1hZyk7CiAKLSAgICAgICAgICAvKiBtaWdodCBiZSB0aGF0IHRtcFNjYWxlRmFjdG9yIGJlY29tZXMgbmVnYXRpdmUsIHNvIGZhYnMoLikgKi8KLSAgICAgICAgICB0bXBTY2FsZUZhY3RvciAgICA9IGZpeHBfYWJzKHN0ZXJlb1NjYWxlRmFjdG9yICsgZk11bHQodG1wTGVmdFJlYWwsdG1wUmlnaHRSZWFsKSArIGZNdWx0KHRtcExlZnRJbWFnLHRtcFJpZ2h0SW1hZykpOworICAgICAgICAvKiBtaWdodCBiZSB0aGF0IHRtcFNjYWxlRmFjdG9yIGJlY29tZXMgbmVnYXRpdmUsIHNvIGZhYnMoLikgKi8KKyAgICAgICAgdG1wU2NhbGVGYWN0b3IgPQorICAgICAgICAgICAgZml4cF9hYnMoc3RlcmVvU2NhbGVGYWN0b3IgKyBmTXVsdCh0bXBMZWZ0UmVhbCwgdG1wUmlnaHRSZWFsKSArCisgICAgICAgICAgICAgICAgICAgICBmTXVsdCh0bXBMZWZ0SW1hZywgdG1wUmlnaHRJbWFnKSk7CiAKLSAgICAgICAgICAvKiBtaW4oMi4wZiwgc3FydChzdGVyZW9TY2FsZUZhY3Rvci8oMC41Zip0bXBTY2FsZUZhY3RvcikpKSAgKi8KLSAgICAgICAgICBpZiAoIChzdGVyZW9TY2FsZUZhY3Rvcj4+MSkgPCBmTXVsdChtYXhTdGVyZW9TY2FsZUZhY3Rvcix0bXBTY2FsZUZhY3RvcikgKSB7CisgICAgICAgIC8qIG1pbigyLjBmLCBzcXJ0KHN0ZXJlb1NjYWxlRmFjdG9yLygwLjVmKnRtcFNjYWxlRmFjdG9yKSkpICAqLworICAgICAgICBpZiAoKHN0ZXJlb1NjYWxlRmFjdG9yID4+IDEpIDwKKyAgICAgICAgICAgIGZNdWx0KG1heFN0ZXJlb1NjYWxlRmFjdG9yLCB0bXBTY2FsZUZhY3RvcikpIHsKKyAgICAgICAgICBpbnQgc2NfbnVtID0gQ291bnRMZWFkaW5nQml0cyhzdGVyZW9TY2FsZUZhY3Rvcik7CisgICAgICAgICAgaW50IHNjX2RlbnVtID0gQ291bnRMZWFkaW5nQml0cyh0bXBTY2FsZUZhY3Rvcik7CisgICAgICAgICAgc2MgPSAtKHNjX251bSAtIHNjX2RlbnVtKTsKIAotICAgICAgICAgICAgICBpbnQgc2NfbnVtICAgPSBDb3VudExlYWRpbmdCaXRzKHN0ZXJlb1NjYWxlRmFjdG9yKSA7Ci0gICAgICAgICAgICAgIGludCBzY19kZW51bSA9IENvdW50TGVhZGluZ0JpdHModG1wU2NhbGVGYWN0b3IpIDsKLSAgICAgICAgICAgICAgc2MgICAgICAgPSAtKHNjX251bS1zY19kZW51bSk7CisgICAgICAgICAgdG1wU2NhbGVGYWN0b3IgPSBzY2h1cl9kaXYoKHN0ZXJlb1NjYWxlRmFjdG9yIDw8IChzY19udW0pKSA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFNjYWxlRmFjdG9yIDw8IHNjX2RlbnVtLCAxNik7CiAKLSAgICAgICAgICAgICAgdG1wU2NhbGVGYWN0b3IgPSBzY2h1cl9kaXYoKHN0ZXJlb1NjYWxlRmFjdG9yPDwoc2NfbnVtKSk+PjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBTY2FsZUZhY3Rvcjw8c2NfZGVudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNikgOwotCi0gICAgICAgICAgICAgIC8qIHByZXZlbnQgb2RkIHNjYWxpbmcgZm9yIG5leHQgc3FydCBjYWxjdWxhdGlvbiAqLwotICAgICAgICAgICAgICBpZiAoc2MmMHgxKSB7Ci0gICAgICAgICAgICAgICAgc2MrKzsKLSAgICAgICAgICAgICAgICB0bXBTY2FsZUZhY3Rvcj4+PTE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgc3RlcmVvU2NhbGVGYWN0b3IgPSBzcXJ0Rml4cCh0bXBTY2FsZUZhY3Rvcik7Ci0gICAgICAgICAgICAgIHN0ZXJlb1NjYWxlRmFjdG9yIDw8PSAoc2M+PjEpOworICAgICAgICAgIC8qIHByZXZlbnQgb2RkIHNjYWxpbmcgZm9yIG5leHQgc3FydCBjYWxjdWxhdGlvbiAqLworICAgICAgICAgIGlmIChzYyAmIDB4MSkgeworICAgICAgICAgICAgc2MrKzsKKyAgICAgICAgICAgIHRtcFNjYWxlRmFjdG9yID4+PSAxOwogICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgc3RlcmVvU2NhbGVGYWN0b3IgPSBtYXhTdGVyZW9TY2FsZUZhY3RvcjsKLSAgICAgICAgICB9CisgICAgICAgICAgc3RlcmVvU2NhbGVGYWN0b3IgPSBzcXJ0Rml4cCh0bXBTY2FsZUZhY3Rvcik7CisgICAgICAgICAgc3RlcmVvU2NhbGVGYWN0b3IgPDw9IChzYyA+PiAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGVyZW9TY2FsZUZhY3RvciA9IG1heFN0ZXJlb1NjYWxlRmFjdG9yOworICAgICAgICB9CiAKLSAgICAgICAgICAvKiB3cml0ZSBkYXRhIHRvIGh5YnJpZCBvdXRwdXQgKi8KLSAgICAgICAgICB0bXBIeWJyaWRbMF1ba10gPSBmTXVsdERpdjIoc3RlcmVvU2NhbGVGYWN0b3IsIChGSVhQX1FNRikodG1wTGVmdFJlYWwgKyB0bXBSaWdodFJlYWwpKT4+ZHluU2NhbGU7Ci0gICAgICAgICAgdG1wSHlicmlkWzFdW2tdID0gZk11bHREaXYyKHN0ZXJlb1NjYWxlRmFjdG9yLCAoRklYUF9RTUYpKHRtcExlZnRJbWFnICsgdG1wUmlnaHRJbWFnKSk+PmR5blNjYWxlOworICAgICAgICAvKiB3cml0ZSBkYXRhIHRvIGh5YnJpZCBvdXRwdXQgKi8KKyAgICAgICAgdG1wSHlicmlkWzBdW2tdID0gZk11bHREaXYyKHN0ZXJlb1NjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSh0bXBMZWZ0UmVhbCArIHRtcFJpZ2h0UmVhbCkpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIGR5blNjYWxlOworICAgICAgICB0bXBIeWJyaWRbMV1ba10gPSBmTXVsdERpdjIoc3RlcmVvU2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHRtcExlZnRJbWFnICsgdG1wUmlnaHRJbWFnKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHluU2NhbGU7CiAKICAgICAgIH0gLyogaHlicmlkIGJhbmRzIC0gayAqLwogCi0gICAgICBGREtoeWJyaWRTeW50aGVzaXNBcHBseSgKLSAgICAgICAgICAgICZoUGFyYW1ldHJpY1N0ZXJlby0+ZmRrSHliU3luRmlsdGVyLAotICAgICAgICAgICAgIHRtcEh5YnJpZFswXSwKLSAgICAgICAgICAgICB0bXBIeWJyaWRbMV0sCi0gICAgICAgICAgICAgbWl4UmVhbFFtZkRhdGFbbl0sCi0gICAgICAgICAgICAgbWl4SW1hZ1FtZkRhdGFbbl0pOworICAgICAgRkRLaHlicmlkU3ludGhlc2lzQXBwbHkoJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJTeW5GaWx0ZXIsIHRtcEh5YnJpZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcEh5YnJpZFsxXSwgbWl4UmVhbFFtZkRhdGFbbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhJbWFnUW1mRGF0YVtuXSk7CiAKICAgICAgIHFtZlN5bnRoZXNpc0ZpbHRlcmluZ1Nsb3QoCi0gICAgICAgICAgICBzYnJTeW50aFFtZiwKLSAgICAgICAgICAgIG1peFJlYWxRbWZEYXRhW25dLAotICAgICAgICAgICAgbWl4SW1hZ1FtZkRhdGFbbl0sCi0gICAgICAgICAgICBkb3dubWl4U2NhbGUtNywKLSAgICAgICAgICAgIGRvd25taXhTY2FsZS03LAotICAgICAgICAgICAgZG93bnNhbXBsZWRPdXRTaWduYWwrKG4qc2JyU3ludGhRbWYtPm5vX2NoYW5uZWxzKSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICBwV29ya0J1ZmZlcik7CisgICAgICAgICAgc2JyU3ludGhRbWYsIG1peFJlYWxRbWZEYXRhW25dLCBtaXhJbWFnUW1mRGF0YVtuXSwgZG93bm1peFNjYWxlIC0gNywKKyAgICAgICAgICBkb3dubWl4U2NhbGUgLSA3LAorICAgICAgICAgIGRvd25zYW1wbGVkT3V0U2lnbmFsICsgKG4gKiBzYnJTeW50aFFtZi0+bm9fY2hhbm5lbHMpLCAxLAorICAgICAgICAgIHBXb3JrQnVmZmVyKTsKIAogICAgIH0gLyogc2xvdHMgKi8KIAogICAgICpxbWZTY2FsZSA9IC1kb3dubWl4U2NhbGUgKyA3OwogCi0gICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocFdvcmtCdWZmZXIsIEZJWFBfUU1GLCAyKlFNRl9DSEFOTkVMUykKKyAgICBDX0FBTExPQ19TQ1JBVENIX0VORChwV29ya0J1ZmZlciwgRklYUF9EQkwsIDIgKiA2NCkKIAotICB7Ci0gICAgY29uc3QgSU5UIG5vUW1mU2xvdHMyID0gaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mU2xvdHM+PjE7Ci0gICAgY29uc3QgaW50IG5vUW1mQmFuZHMgID0gaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mQmFuZHM7CisgICAgeworICAgICAgY29uc3QgSU5UIG5vUW1mU2xvdHMyID0gaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mU2xvdHMgPj4gMTsKKyAgICAgIGNvbnN0IGludCBub1FtZkJhbmRzID0gaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mQmFuZHM7CiAKLSAgICBJTlQgc2NhbGUsIGksIGosIHNsb3RPZmZzZXQ7CisgICAgICBJTlQgc2NhbGUsIGksIGosIHNsb3RPZmZzZXQ7CiAKLSAgICBGSVhQX1FNRiB0bXBbMl1bUU1GX0NIQU5ORUxTXTsKKyAgICAgIEZJWFBfREJMIHRtcFsyXVs2NF07CiAKLSAgICBmb3IgKGk9MDsgaTxub1FtZlNsb3RzMjsgaSsrKSB7Ci0gICAgICBGREttZW1jcHkodG1wWzBdLCBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlMaW5lc1swXVtpXSwgbm9RbWZCYW5kcypzaXplb2YoRklYUF9RTUYpKTsKLSAgICAgIEZES21lbWNweSh0bXBbMV0sIGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheUxpbmVzWzFdW2ldLCBub1FtZkJhbmRzKnNpemVvZihGSVhQX1FNRikpOworICAgICAgZm9yIChpID0gMDsgaSA8IG5vUW1mU2xvdHMyOyBpKyspIHsKKyAgICAgICAgRkRLbWVtY3B5KHRtcFswXSwgaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5TGluZXNbMF1baV0sCisgICAgICAgICAgICAgICAgICBub1FtZkJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNweSh0bXBbMV0sIGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheUxpbmVzWzFdW2ldLAorICAgICAgICAgICAgICAgICAgbm9RbWZCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gICAgICBGREttZW1jcHkoaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5TGluZXNbMF1baV0sIG1peFJlYWxRbWZEYXRhW2krbm9RbWZTbG90czJdLCBub1FtZkJhbmRzKnNpemVvZihGSVhQX1FNRikpOwotICAgICAgRkRLbWVtY3B5KGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheUxpbmVzWzFdW2ldLCBtaXhJbWFnUW1mRGF0YVtpK25vUW1mU2xvdHMyXSwgbm9RbWZCYW5kcypzaXplb2YoRklYUF9RTUYpKTsKKyAgICAgICAgRkRLbWVtY3B5KGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheUxpbmVzWzBdW2ldLAorICAgICAgICAgICAgICAgICAgbWl4UmVhbFFtZkRhdGFbaSArIG5vUW1mU2xvdHMyXSwKKyAgICAgICAgICAgICAgICAgIG5vUW1mQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY3B5KGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheUxpbmVzWzFdW2ldLAorICAgICAgICAgICAgICAgICAgbWl4SW1hZ1FtZkRhdGFbaSArIG5vUW1mU2xvdHMyXSwKKyAgICAgICAgICAgICAgICAgIG5vUW1mQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKIAotICAgICAgRkRLbWVtY3B5KG1peFJlYWxRbWZEYXRhW2krbm9RbWZTbG90czJdLCBtaXhSZWFsUW1mRGF0YVtpXSwgbm9RbWZCYW5kcypzaXplb2YoRklYUF9RTUYpKTsKLSAgICAgIEZES21lbWNweShtaXhJbWFnUW1mRGF0YVtpK25vUW1mU2xvdHMyXSwgbWl4SW1hZ1FtZkRhdGFbaV0sIG5vUW1mQmFuZHMqc2l6ZW9mKEZJWFBfUU1GKSk7CisgICAgICAgIEZES21lbWNweShtaXhSZWFsUW1mRGF0YVtpICsgbm9RbWZTbG90czJdLCBtaXhSZWFsUW1mRGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgIG5vUW1mQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY3B5KG1peEltYWdRbWZEYXRhW2kgKyBub1FtZlNsb3RzMl0sIG1peEltYWdRbWZEYXRhW2ldLAorICAgICAgICAgICAgICAgICAgbm9RbWZCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gICAgICBGREttZW1jcHkobWl4UmVhbFFtZkRhdGFbaV0sIHRtcFswXSwgbm9RbWZCYW5kcypzaXplb2YoRklYUF9RTUYpKTsKLSAgICAgIEZES21lbWNweShtaXhJbWFnUW1mRGF0YVtpXSwgdG1wWzFdLCBub1FtZkJhbmRzKnNpemVvZihGSVhQX1FNRikpOwotICAgIH0KLQotICAgIGlmIChoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlTY2FsZSA+ICpxbWZTY2FsZSkgewotICAgICAgc2NhbGUgPSBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlTY2FsZSAtICpxbWZTY2FsZTsKLSAgICAgIHNsb3RPZmZzZXQgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHNjYWxlID0gKnFtZlNjYWxlIC0gaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5U2NhbGU7Ci0gICAgICBzbG90T2Zmc2V0ID0gbm9RbWZTbG90czI7Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGk8bm9RbWZTbG90czI7IGkrKykgewotICAgICAgZm9yIChqPTA7IGo8bm9RbWZCYW5kczsgaisrKSB7Ci0gICAgICAgIG1peFJlYWxRbWZEYXRhW2krc2xvdE9mZnNldF1bal0gPj49IHNjYWxlOwotICAgICAgICBtaXhJbWFnUW1mRGF0YVtpK3Nsb3RPZmZzZXRdW2pdID4+PSBzY2FsZTsKKyAgICAgICAgRkRLbWVtY3B5KG1peFJlYWxRbWZEYXRhW2ldLCB0bXBbMF0sIG5vUW1mQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY3B5KG1peEltYWdRbWZEYXRhW2ldLCB0bXBbMV0sIG5vUW1mQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKICAgICAgIH0KLSAgICB9CiAKLSAgICBzY2FsZSA9ICpxbWZTY2FsZTsKLSAgICAqcW1mU2NhbGUgPSBGREttaW4oKnFtZlNjYWxlLCBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlTY2FsZSk7Ci0gICAgaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5U2NhbGUgPSBzY2FsZTsKLSAgfQorICAgICAgaWYgKGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlID4gKnFtZlNjYWxlKSB7CisgICAgICAgIHNjYWxlID0gaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5U2NhbGUgLSAqcW1mU2NhbGU7CisgICAgICAgIHNsb3RPZmZzZXQgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2NhbGUgPSAqcW1mU2NhbGUgLSBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlTY2FsZTsKKyAgICAgICAgc2xvdE9mZnNldCA9IG5vUW1mU2xvdHMyOworICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9RbWZTbG90czI7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbm9RbWZCYW5kczsgaisrKSB7CisgICAgICAgICAgbWl4UmVhbFFtZkRhdGFbaSArIHNsb3RPZmZzZXRdW2pdID4+PSBzY2FsZTsKKyAgICAgICAgICBtaXhJbWFnUW1mRGF0YVtpICsgc2xvdE9mZnNldF1bal0gPj49IHNjYWxlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHNjYWxlID0gKnFtZlNjYWxlOworICAgICAgKnFtZlNjYWxlID0gZk1pbigqcW1mU2NhbGUsIGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlKTsKKyAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlID0gc2NhbGU7CisgICAgfQogCiAgIH0gLyogdmFsaWQgaGFuZGxlICovCiAKICAgcmV0dXJuIGVycm9yOwogfQogCi0KLUlOVCBGREtzYnJFbmNfUFNFbmNfV3JpdGVQU0RhdGEoCi0gICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgaEJpdHN0cmVhbQotICAgICAgICApCi17Ci0gIHJldHVybiAoIChoUGFyYW1ldHJpY1N0ZXJlbyE9TlVMTCkgPyBGREtzYnJFbmNfV3JpdGVQU0JpdHN0cmVhbSgmaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0WzBdLCBoQml0c3RyZWFtKSA6IDAgKTsKK0lOVCBGREtzYnJFbmNfUFNFbmNfV3JpdGVQU0RhdGEoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKSB7CisgIHJldHVybiAoCisgICAgICAoaFBhcmFtZXRyaWNTdGVyZW8gIT0gTlVMTCkKKyAgICAgICAgICA/IEZES3NickVuY19Xcml0ZVBTQml0c3RyZWFtKCZoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXRbMF0sIGhCaXRzdHJlYW0pCisgICAgICAgICAgOiAwKTsKIH0KIAotCiBGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX1BTRW5jX1BhcmFtZXRyaWNTdGVyZW9Qcm9jZXNzaW5nKAotICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICBJTlRfUENNICAgICAgICAgICAgICAgICAgKnNhbXBsZXNbMl0sCi0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAotICAgICAgICBRTUZfRklMVEVSX0JBTksgICAgICAgICAqKmhRbWZBbmFseXNpcywKLSAgICAgICAgRklYUF9RTUYgKipSRVNUUklDVCAgICAgICBkb3dubWl4ZWRSZWFsUW1mRGF0YSwKLSAgICAgICAgRklYUF9RTUYgKipSRVNUUklDVCAgICAgICBkb3dubWl4ZWRJbWFnUW1mRGF0YSwKLSAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAgICAgICpkb3duc2FtcGxlZE91dFNpZ25hbCwKLSAgICAgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyAgICBzYnJTeW50aFFtZiwKLSAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgICAgICpxbWZTY2FsZSwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICBzZW5kSGVhZGVyCi0gICAgICAgICkKLXsKKyAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sIElOVF9QQ00gKnNhbXBsZXNbMl0sCisgICAgVUlOVCBzYW1wbGVzQnVmU2l6ZSwgUU1GX0ZJTFRFUl9CQU5LICoqaFFtZkFuYWx5c2lzLAorICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgZG93bm1peGVkUmVhbFFtZkRhdGEsCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBkb3dubWl4ZWRJbWFnUW1mRGF0YSwgSU5UX1BDTSAqZG93bnNhbXBsZWRPdXRTaWduYWwsCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzYnJTeW50aFFtZiwgU0NIQVIgKnFtZlNjYWxlLCBjb25zdCBpbnQgc2VuZEhlYWRlcikgewogICBGREtfUFNFTkNfRVJST1IgZXJyb3IgPSBQU0VOQ19PSzsKICAgSU5UIHBzUW1mU2NhbGVbTUFYX1BTX0NIQU5ORUxTXSA9IHswfTsKICAgaW50IHBzQ2gsIGk7Ci0gIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocFdvcmtCdWZmZXIsIEZJWFBfUU1GLCA0KlFNRl9DSEFOTkVMUykKKyAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChwV29ya0J1ZmZlciwgRklYUF9EQkwsIDQgKiA2NCkKIAotICBmb3IgKHBzQ2ggPSAwOyBwc0NoPE1BWF9QU19DSEFOTkVMUzsgcHNDaCArKykgewotCisgIGZvciAocHNDaCA9IDA7IHBzQ2ggPCBNQVhfUFNfQ0hBTk5FTFM7IHBzQ2grKykgewogICAgIGZvciAoaSA9IDA7IGkgPCBoUW1mQW5hbHlzaXNbcHNDaF0tPm5vX2NvbDsgaSsrKSB7Ci0KICAgICAgIHFtZkFuYWx5c2lzRmlsdGVyaW5nU2xvdCgKLSAgICAgICAgICBoUW1mQW5hbHlzaXNbcHNDaF0sCi0gICAgICAgICAmcFdvcmtCdWZmZXJbMipRTUZfQ0hBTk5FTFNdLCAvKiBxbWZSZWFsW1FNRl9DSEFOTkVMU10gKi8KLSAgICAgICAgICZwV29ya0J1ZmZlclszKlFNRl9DSEFOTkVMU10sIC8qIHFtZkltYWdbUU1GX0NIQU5ORUxTXSAqLwotICAgICAgICAgIHNhbXBsZXNbcHNDaF0raSooaFFtZkFuYWx5c2lzW3BzQ2hdLT5ub19jaGFubmVscyp0aW1lSW5TdHJpZGUpLAotICAgICAgICAgIHRpbWVJblN0cmlkZSwKLSAgICAgICAgICZwV29ya0J1ZmZlclswKlFNRl9DSEFOTkVMU10gIC8qIHFtZiB3b3JrYnVmZmVyIDIqUU1GX0NIQU5ORUxTICovCi0gICAgICAgICAgKTsKKyAgICAgICAgICBoUW1mQW5hbHlzaXNbcHNDaF0sICZwV29ya0J1ZmZlclsyICogNjRdLCAvKiBxbWZSZWFsWzY0XSAqLworICAgICAgICAgICZwV29ya0J1ZmZlclszICogNjRdLCAgICAgICAgICAgICAgICAgICAgIC8qIHFtZkltYWdbNjRdICovCisgICAgICAgICAgc2FtcGxlc1twc0NoXSArIGkgKiBoUW1mQW5hbHlzaXNbcHNDaF0tPm5vX2NoYW5uZWxzLCAxLAorICAgICAgICAgICZwV29ya0J1ZmZlclswICogNjRdIC8qIHFtZiB3b3JrYnVmZmVyIDIqNjQgKi8KKyAgICAgICk7CiAKICAgICAgIEZES2h5YnJpZEFuYWx5c2lzQXBwbHkoCi0gICAgICAgICAmaFBhcmFtZXRyaWNTdGVyZW8tPmZka0h5YkFuYUZpbHRlcltwc0NoXSwKLSAgICAgICAgICZwV29ya0J1ZmZlclsyKlFNRl9DSEFOTkVMU10sICAvKiBxbWZSZWFsW1FNRl9DSEFOTkVMU10gKi8KLSAgICAgICAgICZwV29ya0J1ZmZlclszKlFNRl9DSEFOTkVMU10sICAvKiBxbWZJbWFnW1FNRl9DSEFOTkVMU10gKi8KLSAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaStIWUJSSURfUkVBRF9PRkZTRVRdW3BzQ2hdWzBdLAotICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpK0hZQlJJRF9SRUFEX09GRlNFVF1bcHNDaF1bMV0KLSAgICAgICAgICApOworICAgICAgICAgICZoUGFyYW1ldHJpY1N0ZXJlby0+ZmRrSHliQW5hRmlsdGVyW3BzQ2hdLAorICAgICAgICAgICZwV29ya0J1ZmZlclsyICogNjRdLCAvKiBxbWZSZWFsWzY0XSAqLworICAgICAgICAgICZwV29ya0J1ZmZlclszICogNjRdLCAvKiBxbWZJbWFnWzY0XSAqLworICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpICsgSFlCUklEX1JFQURfT0ZGU0VUXVtwc0NoXVswXSwKKyAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaSArIEhZQlJJRF9SRUFEX09GRlNFVF1bcHNDaF1bMV0pOwogCiAgICAgfSAvKiBub19jb2wgbG9vcCAgaSAgKi8KIApAQCAtNTA1LDMxICs0OTEsNDggQEAKIAogICB9IC8qIGZvciBwc0NoICovCiAKLSAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocFdvcmtCdWZmZXIsIEZJWFBfUU1GLCA0KlFNRl9DSEFOTkVMUykKKyAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCA0ICogNjQpCiAKICAgLyogZmluZCBiZXN0IHNjYWxpbmcgaW4gbmV3IFFNRiBhbmQgSHlicmlkIGRhdGEgKi8KLSAgcHNGaW5kQmVzdFNjYWxpbmcoIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAmaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW0hZQlJJRF9SRUFEX09GRlNFVF0sCi0gICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+ZHluQmFuZFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPm1heEJhbmRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5kbXhTY2FsZSApIDsKLQorICBwc0ZpbmRCZXN0U2NhbGluZygKKyAgICAgIGhQYXJhbWV0cmljU3RlcmVvLCAmaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW0hZQlJJRF9SRUFEX09GRlNFVF0sCisgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+ZHluQmFuZFNjYWxlLCBoUGFyYW1ldHJpY1N0ZXJlby0+bWF4QmFuZFZhbHVlLAorICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5kbXhTY2FsZSk7CiAKICAgLyogZXh0cmFjdCB0aGUgcHMgcGFyYW1ldGVycyAqLwotICBpZihQU0VOQ19PSyAhPSAoZXJyb3IgPSBFeHRyYWN0UFNQYXJhbWV0ZXJzKGhQYXJhbWV0cmljU3RlcmVvLCBzZW5kSGVhZGVyLCAmaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhWzBdKSkpeworICBpZiAoUFNFTkNfT0sgIT0KKyAgICAgIChlcnJvciA9IEV4dHJhY3RQU1BhcmFtZXRlcnMoaFBhcmFtZXRyaWNTdGVyZW8sIHNlbmRIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbMF0pKSkgewogICAgIGdvdG8gYmFpbDsKICAgfQogCiAgIC8qIHNhdmUgaHlicmlkIGRhdGUgZm9yIG5leHQgZnJhbWUgKi8KLSAgZm9yIChpPTA7IGk8SFlCUklEX1JFQURfT0ZGU0VUOyBpKyspIHsKLSAgICBGREttZW1jcHkoaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2ldWzBdWzBdLCBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRStpXVswXVswXSwgTUFYX0hZQlJJRF9CQU5EUypzaXplb2YoRklYUF9EQkwpKTsgLyogbGVmdCwgcmVhbCAqLwotICAgIEZES21lbWNweShoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaV1bMF1bMV0sIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFK2ldWzBdWzFdLCBNQVhfSFlCUklEX0JBTkRTKnNpemVvZihGSVhQX0RCTCkpOyAvKiBsZWZ0LCBpbWFnICovCi0gICAgRkRLbWVtY3B5KGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpXVsxXVswXSwgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkUraV1bMV1bMF0sIE1BWF9IWUJSSURfQkFORFMqc2l6ZW9mKEZJWFBfREJMKSk7IC8qIHJpZ2h0LCByZWFsICovCi0gICAgRkRLbWVtY3B5KGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpXVsxXVsxXSwgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkUraV1bMV1bMV0sIE1BWF9IWUJSSURfQkFORFMqc2l6ZW9mKEZJWFBfREJMKSk7IC8qIHJpZ2h0LCBpbWFnICovCisgIGZvciAoaSA9IDA7IGkgPCBIWUJSSURfUkVBRF9PRkZTRVQ7IGkrKykgeworICAgIEZES21lbWNweSgKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2ldWzBdWzBdLAorICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mU2xvdHMgKyBpXVswXVswXSwKKyAgICAgICAgTUFYX0hZQlJJRF9CQU5EUyAqIHNpemVvZihGSVhQX0RCTCkpOyAvKiBsZWZ0LCByZWFsICovCisgICAgRkRLbWVtY3B5KAorICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaV1bMF1bMV0sCisgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZTbG90cyArIGldWzBdWzFdLAorICAgICAgICBNQVhfSFlCUklEX0JBTkRTICogc2l6ZW9mKEZJWFBfREJMKSk7IC8qIGxlZnQsIGltYWcgKi8KKyAgICBGREttZW1jcHkoCisgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpXVsxXVswXSwKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2hQYXJhbWV0cmljU3RlcmVvLT5ub1FtZlNsb3RzICsgaV1bMV1bMF0sCisgICAgICAgIE1BWF9IWUJSSURfQkFORFMgKiBzaXplb2YoRklYUF9EQkwpKTsgLyogcmlnaHQsIHJlYWwgKi8KKyAgICBGREttZW1jcHkoCisgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpXVsxXVsxXSwKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2hQYXJhbWV0cmljU3RlcmVvLT5ub1FtZlNsb3RzICsgaV1bMV1bMV0sCisgICAgICAgIE1BWF9IWUJSSURfQkFORFMgKiBzaXplb2YoRklYUF9EQkwpKTsgLyogcmlnaHQsIGltYWcgKi8KICAgfQogCiAgIC8qIGRvd25taXggYW5kIGh5YnJpZCBzeW50aGVzaXMgKi8KLSAgaWYgKFBTRU5DX09LICE9IChlcnJvciA9IERvd25taXhQU1FtZkRhdGEoaFBhcmFtZXRyaWNTdGVyZW8sIHNiclN5bnRoUW1mLCBkb3dubWl4ZWRSZWFsUW1mRGF0YSwgZG93bm1peGVkSW1hZ1FtZkRhdGEsIGRvd25zYW1wbGVkT3V0U2lnbmFsLCAmaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW0hZQlJJRF9SRUFEX09GRlNFVF0sIGhQYXJhbWV0cmljU3RlcmVvLT5ub1FtZlNsb3RzLCBwc1FtZlNjYWxlLCBxbWZTY2FsZSkpKSB7CisgIGlmIChQU0VOQ19PSyAhPQorICAgICAgKGVycm9yID0gRG93bm1peFBTUW1mRGF0YSgKKyAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sIHNiclN5bnRoUW1mLCBkb3dubWl4ZWRSZWFsUW1mRGF0YSwKKyAgICAgICAgICAgZG93bm1peGVkSW1hZ1FtZkRhdGEsIGRvd25zYW1wbGVkT3V0U2lnbmFsLCBzYW1wbGVzQnVmU2l6ZSwKKyAgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtIWUJSSURfUkVBRF9PRkZTRVRdLAorICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZTbG90cywgcHNRbWZTY2FsZSwgcW1mU2NhbGUpKSkgewogICAgIGdvdG8gYmFpbDsKICAgfQogCkBAIC01MzksMjggKzU0MiwyNCBAQAogfQogCiBzdGF0aWMgdm9pZCBwc0ZpbmRCZXN0U2NhbGluZygKLSAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpoeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl0sCi0gICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAqZHluQmFuZFNjYWxlLAotICAgICAgICBGSVhQX1FNRiAgICAgICAgICAgICAgICAgKm1heEJhbmRWYWx1ZSwKLSAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgICAgICpkbXhTY2FsZQotICAgICAgICApCi17Ci0gIEhBTkRMRV9QU19FTkNPREUgaFBzRW5jb2RlICAgICAgPSAgaFBhcmFtZXRyaWNTdGVyZW8tPmhQc0VuY29kZTsKKyAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgRklYUF9EQkwgKmh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRV1bTUFYX1BTX0NIQU5ORUxTXVsyXSwKKyAgICBVQ0hBUiAqZHluQmFuZFNjYWxlLCBGSVhQX0RCTCAqbWF4QmFuZFZhbHVlLCBTQ0hBUiAqZG14U2NhbGUpIHsKKyAgSEFORExFX1BTX0VOQ09ERSBoUHNFbmNvZGUgPSBoUGFyYW1ldHJpY1N0ZXJlby0+aFBzRW5jb2RlOwogCiAgIElOVCBncm91cCwgYmluLCBjb2wsIGJhbmQ7Ci0gIGNvbnN0IElOVCBmcmFtZVNpemUgID0gaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mU2xvdHM7Ci0gIGNvbnN0IElOVCBwc0JhbmRzICAgID0gKElOVCkgaFBzRW5jb2RlLT5wc0VuY01vZGU7CisgIGNvbnN0IElOVCBmcmFtZVNpemUgPSBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZTbG90czsKKyAgY29uc3QgSU5UIHBzQmFuZHMgPSAoSU5UKWhQc0VuY29kZS0+cHNFbmNNb2RlOwogICBjb25zdCBJTlQgbklpZEdyb3VwcyA9IGhQc0VuY29kZS0+blFtZklpZEdyb3VwcyArIGhQc0VuY29kZS0+blN1YlFtZklpZEdyb3VwczsKIAogICAvKiBncm91cCB3aXNlIHNjYWxpbmcgKi8KLSAgRklYUF9RTUYgbWF4VmFsIFsyXVtQU19NQVhfQkFORFNdOwotICBGSVhQX1FNRiBtYXhWYWx1ZSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgIEZJWFBfREJMIG1heFZhbFsyXVtQU19NQVhfQkFORFNdOworICBGSVhQX0RCTCBtYXhWYWx1ZSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAKICAgRkRLbWVtY2xlYXIobWF4VmFsLCBzaXplb2YobWF4VmFsKSk7CiAKICAgLyogc3RhcnQgd2l0aCBoeWJyaWQgZGF0YSAqLwotICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgbklpZEdyb3VwczsgZ3JvdXArKykgeworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBuSWlkR3JvdXBzOyBncm91cCsrKSB7CiAgICAgLyogVHJhbnNsYXRlIGdyb3VwIHRvIGJpbiAqLwogICAgIGJpbiA9IGhQc0VuY29kZS0+c3ViYmFuZDJwYXJhbWV0ZXJJbmRleFtncm91cF07CiAKQEAgLTU3MCw0OSArNTY5LDM4IEBACiAgICAgfQogCiAgICAgLyogUU1GIGRvd25taXggc2NhbGluZyAqLwotICAgIHsKLSAgICAgIEZJWFBfUU1GIHRtcCA9IG1heFZhbFswXVtiaW5dOwotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGNvbD0wOyBjb2w8ZnJhbWVTaXplLUhZQlJJRF9SRUFEX09GRlNFVDsgY29sKyspIHsKLSAgICAgICAgZm9yIChpID0gaFBzRW5jb2RlLT5paWRHcm91cEJvcmRlcnNbZ3JvdXBdOyBpIDwgaFBzRW5jb2RlLT5paWRHcm91cEJvcmRlcnNbZ3JvdXArMV07IGkrKykgewotICAgICAgICAgIHRtcCA9IGZpeE1heCh0bXAsIChGSVhQX1FNRilmaXhwX2FicyhoeWJyaWREYXRhW2NvbF1bMF1bMF1baV0pKTsKLSAgICAgICAgICB0bXAgPSBmaXhNYXgodG1wLCAoRklYUF9RTUYpZml4cF9hYnMoaHlicmlkRGF0YVtjb2xdWzBdWzFdW2ldKSk7Ci0gICAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfUU1GKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVsxXVswXVtpXSkpOwotICAgICAgICAgIHRtcCA9IGZpeE1heCh0bXAsIChGSVhQX1FNRilmaXhwX2FicyhoeWJyaWREYXRhW2NvbF1bMV1bMV1baV0pKTsKLSAgICAgICAgfQorICAgIGZvciAoY29sID0gMDsgY29sIDwgZnJhbWVTaXplOyBjb2wrKykgeworICAgICAgaW50IGksIHNlY3Rpb24gPSAoY29sIDwgZnJhbWVTaXplIC0gSFlCUklEX1JFQURfT0ZGU0VUKSA/IDAgOiAxOworICAgICAgRklYUF9EQkwgdG1wID0gbWF4VmFsW3NlY3Rpb25dW2Jpbl07CisgICAgICBmb3IgKGkgPSBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cF07CisgICAgICAgICAgIGkgPCBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cCArIDFdOyBpKyspIHsKKyAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfREJMKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVswXVswXVtpXSkpOworICAgICAgICB0bXAgPSBmaXhNYXgodG1wLCAoRklYUF9EQkwpZml4cF9hYnMoaHlicmlkRGF0YVtjb2xdWzBdWzFdW2ldKSk7CisgICAgICAgIHRtcCA9IGZpeE1heCh0bXAsIChGSVhQX0RCTClmaXhwX2FicyhoeWJyaWREYXRhW2NvbF1bMV1bMF1baV0pKTsKKyAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfREJMKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVsxXVsxXVtpXSkpOwogICAgICAgfQotICAgICAgbWF4VmFsWzBdW2Jpbl0gPSB0bXA7Ci0KLSAgICAgIHRtcCA9IG1heFZhbFsxXVtiaW5dOwotICAgICAgZm9yIChjb2w9ZnJhbWVTaXplLUhZQlJJRF9SRUFEX09GRlNFVDsgY29sPGZyYW1lU2l6ZTsgY29sKyspIHsKLSAgICAgICAgZm9yIChpID0gaFBzRW5jb2RlLT5paWRHcm91cEJvcmRlcnNbZ3JvdXBdOyBpIDwgaFBzRW5jb2RlLT5paWRHcm91cEJvcmRlcnNbZ3JvdXArMV07IGkrKykgewotICAgICAgICAgIHRtcCA9IGZpeE1heCh0bXAsIChGSVhQX1FNRilmaXhwX2FicyhoeWJyaWREYXRhW2NvbF1bMF1bMF1baV0pKTsKLSAgICAgICAgICB0bXAgPSBmaXhNYXgodG1wLCAoRklYUF9RTUYpZml4cF9hYnMoaHlicmlkRGF0YVtjb2xdWzBdWzFdW2ldKSk7Ci0gICAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfUU1GKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVsxXVswXVtpXSkpOwotICAgICAgICAgIHRtcCA9IGZpeE1heCh0bXAsIChGSVhQX1FNRilmaXhwX2FicyhoeWJyaWREYXRhW2NvbF1bMV1bMV1baV0pKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgbWF4VmFsWzFdW2Jpbl0gPSB0bXA7CisgICAgICBtYXhWYWxbc2VjdGlvbl1bYmluXSA9IHRtcDsKICAgICB9CiAgIH0gLyogbklpZEdyb3VwcyAqLwogCiAgIC8qIGNvbnZlcnQgbWF4U3BlYyB0byBtYXhTY2FsaW5nLCBmaW5kIHNjYWxpbmcgc3BhY2UgKi8KLSAgZm9yIChiYW5kPTA7IGJhbmQ8cHNCYW5kczsgYmFuZCsrKSB7CisgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBwc0JhbmRzOyBiYW5kKyspIHsKICNpZm5kZWYgTVVMVF8xNngxNgotICAgIGR5bkJhbmRTY2FsZVtiYW5kXSA9IENvdW50TGVhZGluZ0JpdHMoZml4TWF4KG1heFZhbFswXVtiYW5kXSxtYXhCYW5kVmFsdWVbYmFuZF0pKTsKKyAgICBkeW5CYW5kU2NhbGVbYmFuZF0gPQorICAgICAgICBDb3VudExlYWRpbmdCaXRzKGZpeE1heChtYXhWYWxbMF1bYmFuZF0sIG1heEJhbmRWYWx1ZVtiYW5kXSkpOwogI2Vsc2UKLSAgICBkeW5CYW5kU2NhbGVbYmFuZF0gPSBmaXhNYXgoMCxDb3VudExlYWRpbmdCaXRzKGZpeE1heChtYXhWYWxbMF1bYmFuZF0sbWF4QmFuZFZhbHVlW2JhbmRdKSktRlJBQ1RfQklUUyk7CisgICAgZHluQmFuZFNjYWxlW2JhbmRdID0gZml4TWF4KAorICAgICAgICAwLCBDb3VudExlYWRpbmdCaXRzKGZpeE1heChtYXhWYWxbMF1bYmFuZF0sIG1heEJhbmRWYWx1ZVtiYW5kXSkpIC0KKyAgICAgICAgICAgICAgIEZSQUNUX0JJVFMpOwogI2VuZGlmCi0gICAgbWF4VmFsdWUgPSBmaXhNYXgobWF4VmFsdWUsZml4TWF4KG1heFZhbFswXVtiYW5kXSxtYXhWYWxbMV1bYmFuZF0pKTsKKyAgICBtYXhWYWx1ZSA9IGZpeE1heChtYXhWYWx1ZSwgZml4TWF4KG1heFZhbFswXVtiYW5kXSwgbWF4VmFsWzFdW2JhbmRdKSk7CiAgICAgbWF4QmFuZFZhbHVlW2JhbmRdID0gZml4TWF4KG1heFZhbFswXVtiYW5kXSwgbWF4VmFsWzFdW2JhbmRdKTsKICAgfQogCi0gIC8qIGNhbGN1bGF0ZSBtYXhpbWFsIHNjYWxpbmcgZm9yIFFNRiBkb3dubWl4ICovCisgICAgLyogY2FsY3VsYXRlIG1heGltYWwgc2NhbGluZyBmb3IgUU1GIGRvd25taXggKi8KICNpZm5kZWYgTVVMVF8xNngxNgogICAqZG14U2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMsIENvdW50TGVhZGluZ0JpdHMobWF4VmFsdWUpKTsKICNlbHNlCi0gICpkbXhTY2FsZSA9IGZpeE1heCgwLGZpeE1pbihGUkFDVF9CSVRTLCBDb3VudExlYWRpbmdCaXRzKEZYX1FNRjJGWF9EQkwobWF4VmFsdWUpKSkpOworICAqZG14U2NhbGUgPSBmaXhNYXgoMCwgZml4TWluKEZSQUNUX0JJVFMsIENvdW50TGVhZGluZ0JpdHMoKG1heFZhbHVlKSkpKTsKICNlbmRpZgotCiB9Ci0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvcHNfbWFpbi5oIGIvbGliU0JSZW5jL3NyYy9wc19tYWluLmgKaW5kZXggMjFiMzJmZi4uODhiMjk5MyAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9wc19tYWluLmgKKysrIGIvbGliU0JSZW5jL3NyYy9wc19tYWluLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTEzICs5MCwxMTYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUcgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIEF1dGhvcnM6ICAgICAgTWFya3VzIE11bHRydXMKLSAgIENvbnRlbnRzL0Rlc2NyaXB0aW9uOiBQUyBXcmFwcGVyLCBEb3dubWl4IGhlYWRlciBmaWxlCisgICBBdXRob3Iocyk6ICAgTWFya3VzIE11bHRydXMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBTIFdyYXBwZXIsIERvd25taXggaGVhZGVyIGZpbGUKIAotI2lmbmRlZiBfX0lOQ0xVREVEX1BTX01BSU5fSAotI2RlZmluZSBfX0lOQ0xVREVEX1BTX01BSU5fSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBQU19NQUlOX0gKKyNkZWZpbmUgUFNfTUFJTl9ICiAKIC8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2luY2x1ZGUgInNicl9kZWYuaCIKICNpbmNsdWRlICJxbWYuaCIKICNpbmNsdWRlICJwc19lbmNvZGUuaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAjaW5jbHVkZSAiRkRLX2h5YnJpZC5oIgogCi0KIC8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHR5cGVkZWYgZW51bSB7CiAgIFBTRU5DX1NURVJFT19CQU5EU19JTlZBTElEID0gMCwKLSAgUFNFTkNfU1RFUkVPX0JBTkRTXzEwICAgICAgPSAxMCwKLSAgUFNFTkNfU1RFUkVPX0JBTkRTXzIwICAgICAgPSAyMAorICBQU0VOQ19TVEVSRU9fQkFORFNfMTAgPSAxMCwKKyAgUFNFTkNfU1RFUkVPX0JBTkRTXzIwID0gMjAKIAogfSBQU0VOQ19TVEVSRU9fQkFORFNfQ09ORklHOwogCiB0eXBlZGVmIGVudW0gewotICBQU0VOQ19ORU5WXzEgICAgICAgICAgICAgICA9IDEsCi0gIFBTRU5DX05FTlZfMiAgICAgICAgICAgICAgID0gMiwKLSAgUFNFTkNfTkVOVl80ICAgICAgICAgICAgICAgPSA0LAotICBQU0VOQ19ORU5WX0RFRkFVTFQgICAgICAgICA9IFBTRU5DX05FTlZfMiwKLSAgUFNFTkNfTkVOVl9NQVggICAgICAgICAgICAgPSBQU0VOQ19ORU5WXzQKKyAgUFNFTkNfTkVOVl8xID0gMSwKKyAgUFNFTkNfTkVOVl8yID0gMiwKKyAgUFNFTkNfTkVOVl80ID0gNCwKKyAgUFNFTkNfTkVOVl9ERUZBVUxUID0gUFNFTkNfTkVOVl8yLAorICBQU0VOQ19ORU5WX01BWCA9IFBTRU5DX05FTlZfNAogCiB9IFBTRU5DX05FTlZfQ09ORklHOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlRnJvbTsgICAvKiBpbmNsdXNpdmUgKi8KLSAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGVUbzsgICAgIC8qIGV4Y2x1c2l2ZSAqLwotICBQU0VOQ19TVEVSRU9fQkFORFNfQ09ORklHICAgblN0ZXJlb0JhbmRzOwotICBQU0VOQ19ORU5WX0NPTkZJRyAgICAgICAgICAgbkVudmVsb3BlczsKLSAgTE9ORyAgICAgICAgICAgICAgICAgICAgICAgIGlpZFF1YW50RXJyb3JUaHJlc2hvbGQ7ICAvKiBxdWFudGl6YXRpb24gdGhyZXNob2xkIHRvIHN3aXRjaCBiZXR3ZWVuIGNvYXJzZSBhbmQgZmluZSBpaWQgcXVhbnRpemF0aW9uICovCisgIFVJTlQgYml0cmF0ZUZyb207IC8qIGluY2x1c2l2ZSAqLworICBVSU5UIGJpdHJhdGVUbzsgICAvKiBleGNsdXNpdmUgKi8KKyAgUFNFTkNfU1RFUkVPX0JBTkRTX0NPTkZJRyBuU3RlcmVvQmFuZHM7CisgIFBTRU5DX05FTlZfQ09ORklHIG5FbnZlbG9wZXM7CisgIExPTkcgaWlkUXVhbnRFcnJvclRocmVzaG9sZDsgLyogcXVhbnRpemF0aW9uIHRocmVzaG9sZCB0byBzd2l0Y2ggYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvYXJzZSBhbmQgZmluZSBpaWQgcXVhbnRpemF0aW9uICovCiAKIH0gcHNUdW5pbmdUYWJsZV90OwogCiAvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IFRfUEFSQU1FVFJJQ19TVEVSRU8gewotICBIQU5ETEVfUFNfRU5DT0RFICAgICAgICAgICAgaFBzRW5jb2RlOwotICBQU19PVVQgICAgICAgICAgICAgICAgICAgICAgcHNPdXRbMl07CisgIEhBTkRMRV9QU19FTkNPREUgaFBzRW5jb2RlOworICBQU19PVVQgcHNPdXRbMl07CiAKLSAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAgIF9fc3RhdGljSHlicmlkRGF0YVtIWUJSSURfUkVBRF9PRkZTRVRdW01BWF9QU19DSEFOTkVMU11bMl1bTUFYX0hZQlJJRF9CQU5EU107Ci0gIEZJWFBfREJMICAgICAgICAgICAgICAgICAgICpwSHlicmlkRGF0YVtIWUJSSURfUkVBRF9PRkZTRVQrSFlCUklEX0ZSQU1FU0laRV1bTUFYX1BTX0NIQU5ORUxTXVsyXTsKKyAgRklYUF9EQkwgX19zdGF0aWNIeWJyaWREYXRhW0hZQlJJRF9SRUFEX09GRlNFVF1bTUFYX1BTX0NIQU5ORUxTXVsyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTUFYX0hZQlJJRF9CQU5EU107CisgIEZJWFBfREJMCisgICpwSHlicmlkRGF0YVtIWUJSSURfUkVBRF9PRkZTRVQgKyBIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdOwogCi0gIEZJWFBfUU1GICAgICAgICAgICAgICAgICAgICBxbWZEZWxheUxpbmVzWzJdW1FNRl9NQVhfVElNRV9TTE9UUz4+MV1bUU1GX0NIQU5ORUxTXTsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHFtZkRlbGF5U2NhbGU7CisgIEZJWFBfREJMIHFtZkRlbGF5TGluZXNbMl1bMzIgPj4gMV1bNjRdOworICBpbnQgcW1mRGVsYXlTY2FsZTsKIAotICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgcHNEZWxheTsKLSAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgIG1heEVudmVsb3BlczsKLSAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgIGR5bkJhbmRTY2FsZVtQU19NQVhfQkFORFNdOwotICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgbWF4QmFuZFZhbHVlW1BTX01BWF9CQU5EU107Ci0gIFNDSEFSICAgICAgICAgICAgICAgICAgICAgICBkbXhTY2FsZTsKLSAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRQUzsKLSAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIG5vUW1mU2xvdHM7Ci0gIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBub1FtZkJhbmRzOworICBJTlQgcHNEZWxheTsKKyAgVUlOVCBtYXhFbnZlbG9wZXM7CisgIFVDSEFSIGR5bkJhbmRTY2FsZVtQU19NQVhfQkFORFNdOworICBGSVhQX0RCTCBtYXhCYW5kVmFsdWVbUFNfTUFYX0JBTkRTXTsKKyAgU0NIQVIgZG14U2NhbGU7CisgIElOVCBpbml0UFM7CisgIElOVCBub1FtZlNsb3RzOworICBJTlQgbm9RbWZCYW5kczsKIAotICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgX19zdGF0aWNIeWJBbmFTdGF0ZXNMRltNQVhfUFNfQ0hBTk5FTFNdWzIqSFlCUklEX0ZJTFRFUl9MRU5HVEgqSFlCUklEX01BWF9RTUZfQkFORFNdOwotICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgX19zdGF0aWNIeWJBbmFTdGF0ZXNIRltNQVhfUFNfQ0hBTk5FTFNdWzIqSFlCUklEX0ZJTFRFUl9ERUxBWSooUU1GX0NIQU5ORUxTLUhZQlJJRF9NQVhfUU1GX0JBTkRTKV07Ci0gIEZES19BTkFfSFlCX0ZJTFRFUiAgICAgICAgICBmZGtIeWJBbmFGaWx0ZXJbTUFYX1BTX0NIQU5ORUxTXTsKLSAgRkRLX1NZTl9IWUJfRklMVEVSICAgICAgICAgIGZka0h5YlN5bkZpbHRlcjsKKyAgRklYUF9EQkwgX19zdGF0aWNIeWJBbmFTdGF0ZXNMRltNQVhfUFNfQ0hBTk5FTFNdWzIgKiBIWUJSSURfRklMVEVSX0xFTkdUSCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIWUJSSURfTUFYX1FNRl9CQU5EU107CisgIEZJWFBfREJMIF9fc3RhdGljSHliQW5hU3RhdGVzSEZbTUFYX1BTX0NIQU5ORUxTXVsyICogSFlCUklEX0ZJTFRFUl9ERUxBWSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNjQgLSBIWUJSSURfTUFYX1FNRl9CQU5EUyldOworICBGREtfQU5BX0hZQl9GSUxURVIgZmRrSHliQW5hRmlsdGVyW01BWF9QU19DSEFOTkVMU107CisgIEZES19TWU5fSFlCX0ZJTFRFUiBmZGtIeWJTeW5GaWx0ZXI7CiAKIH0gUEFSQU1FVFJJQ19TVEVSRU87CiAKLQogdHlwZWRlZiBzdHJ1Y3QgVF9QU0VOQ19DT05GSUcgewotICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplOwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgcW1mRmlsdGVyTW9kZTsKLSAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIHNiclBzRGVsYXk7Ci0gIFBTRU5DX1NURVJFT19CQU5EU19DT05GSUcgICBuU3RlcmVvQmFuZHM7Ci0gIFBTRU5DX05FTlZfQ09ORklHICAgICAgICAgICBtYXhFbnZlbG9wZXM7Ci0gIEZJWFBfREJMICAgICAgICAgICAgICAgICAgICBpaWRRdWFudEVycm9yVGhyZXNob2xkOworICBJTlQgZnJhbWVTaXplOworICBJTlQgcW1mRmlsdGVyTW9kZTsKKyAgSU5UIHNiclBzRGVsYXk7CisgIFBTRU5DX1NURVJFT19CQU5EU19DT05GSUcgblN0ZXJlb0JhbmRzOworICBQU0VOQ19ORU5WX0NPTkZJRyBtYXhFbnZlbG9wZXM7CisgIEZJWFBfREJMIGlpZFF1YW50RXJyb3JUaHJlc2hvbGQ7CiAKIH0gUFNFTkNfQ09ORklHLCAqSEFORExFX1BTRU5DX0NPTkZJRzsKIAogdHlwZWRlZiBzdHJ1Y3QgVF9QQVJBTUVUUklDX1NURVJFTyAqSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPOwogCi0KIC8qKgogICogXGJyaWVmICBDcmVhdGUgYSBwYXJhbWV0cmljIHN0ZXJlbyBlbmNvZGVyIGluc3RhbmNlLgogICoKLSAqIFxwYXJhbSBwaFBhcmFtZXRyaWNTdGVyZW8gICAgQSBwb2ludGVyIHRvIGEgcGFyYW1ldHJpYyBzdGVyZW8gaGFuZGxlIHRvIGJlIGFsbG9jYXRlZC4gSW5pdGlhbGl6ZWQgb24gcmV0dXJuLgorICogXHBhcmFtIHBoUGFyYW1ldHJpY1N0ZXJlbyAgICBBIHBvaW50ZXIgdG8gYSBwYXJhbWV0cmljIHN0ZXJlbyBoYW5kbGUgdG8gYmUKKyAqIGFsbG9jYXRlZC4gSW5pdGlhbGl6ZWQgb24gcmV0dXJuLgogICoKICAqIFxyZXR1cm4KICAqICAgICAgICAgIC0gUFNFTkNfT0ssIG9uIHN1Y2Nlcy4KICAqICAgICAgICAgIC0gUFNFTkNfSU5WQUxJRF9IQU5ETEUsIFBTRU5DX01FTU9SWV9FUlJPUiwgb24gZmFpbHVyZS4KICAqLwotRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0NyZWF0ZSgKLSAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICpwaFBhcmFtZXRyaWNTdGVyZW8KLSAgICAgICAgKTsKLQorRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0NyZWF0ZShIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gKnBoUGFyYW1ldHJpY1N0ZXJlbyk7CiAKIC8qKgogICogXGJyaWVmICBJbml0aWFsaXplIGEgcGFyYW1ldHJpYyBzdGVyZW8gZW5jb2RlciBpbnN0YW5jZS4KICAqCiAgKiBccGFyYW0gaFBhcmFtZXRyaWNTdGVyZW8gICAgIE1ldGEgRGF0YSBoYW5kbGUuCi0gKiBccGFyYW0gaFBzRW5jQ29uZmlnICAgICAgICAgIEZpbGxlZCBwYXJhbWV0cmljIHN0ZXJlbyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBoUHNFbmNDb25maWcgICAgICAgICAgRmlsbGVkIHBhcmFtZXRyaWMgc3RlcmVvIGNvbmZpZ3VyYXRpb24KKyAqIHN0cnVjdHVyZS4KICAqIFxwYXJhbSBub1FtZlNsb3RzICAgICAgICAgICAgTnVtYmVyIG9mIHNsb3RzIHdpdGhpbiBvbmUgYXVkaW8gZnJhbWUuCiAgKiBccGFyYW0gbm9RbWZCYW5kcyAgICAgICAgICAgIE51bWJlciBvZiBRTUYgYmFuZHMuCiAgKiBccGFyYW0gZHluYW1pY19SQU0gICAgICAgICAgIFBvaW50ZXIgdG8gcHJlYWxsb2NhdGVkIHdvcmtidWZmZXIuCkBAIC0xOTQsMzAgKzIwOCwyMyBAQAogICogICAgICAgICAgLSBQU0VOQ19PSywgb24gc3VjY2VzLgogICogICAgICAgICAgLSBQU0VOQ19JTlZBTElEX0hBTkRMRSwgUFNFTkNfSU5JVF9FUlJPUiwgb24gZmFpbHVyZS4KICAqLwotRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0luaXQoCi0gICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgIGNvbnN0IEhBTkRMRV9QU0VOQ19DT05GSUcgaFBzRW5jQ29uZmlnLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIG5vUW1mU2xvdHMsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgbm9RbWZCYW5kcwotICAgICAgICxVQ0hBUiAgICAgICAgICAgICAgICAgICAgKmR5bmFtaWNfUkFNCi0gICAgICAgICk7Ci0KK0ZES19QU0VOQ19FUlJPUiBQU0VuY19Jbml0KEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhBTkRMRV9QU0VOQ19DT05GSUcgaFBzRW5jQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vUW1mU2xvdHMsIElOVCBub1FtZkJhbmRzLCBVQ0hBUiAqZHluYW1pY19SQU0pOwogCiAvKioKICAqIFxicmllZiAgRGVzdHJveSBwYXJhbWV0cmljIHN0ZXJlbyBlbmNvZGVyIGluc3RhbmNlLgogICoKICAqIERlYWxsb2NhdGUgaW5zdGFuY2UgYW5kIGZyZWUgd2hvbGUgbWVtb3J5LgogICoKLSAqIFxwYXJhbSBwaFBhcmFtZXRyaWNTdGVyZW8gICAgUG9pbnRlciB0byB0aGUgcGFyYW1ldHJpYyBzdGVyZW8gaGFuZGxlIHRvIGJlIGRlYWxsb2NhdGVkLgorICogXHBhcmFtIHBoUGFyYW1ldHJpY1N0ZXJlbyAgICBQb2ludGVyIHRvIHRoZSBwYXJhbWV0cmljIHN0ZXJlbyBoYW5kbGUgdG8gYmUKKyAqIGRlYWxsb2NhdGVkLgogICoKICAqIFxyZXR1cm4KICAqICAgICAgICAgIC0gUFNFTkNfT0ssIG9uIHN1Y2Nlcy4KICAqICAgICAgICAgIC0gUFNFTkNfSU5WQUxJRF9IQU5ETEUsIG9uIGZhaWx1cmUuCiAgKi8KLUZES19QU0VOQ19FUlJPUiBQU0VuY19EZXN0cm95KAotICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gKnBoUGFyYW1ldHJpY1N0ZXJlbwotICAgICAgICApOwotCitGREtfUFNFTkNfRVJST1IgUFNFbmNfRGVzdHJveShIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gKnBoUGFyYW1ldHJpY1N0ZXJlbyk7CiAKIC8qKgogICogXGJyaWVmICBBcHBseSBwYXJhbWV0cmljIHN0ZXJlbyBwcm9jZXNzaW5nLgpAQCAtMjI4LDcgKzIzNSw4IEBACiAgKiBccGFyYW0gaFFtZkFuYWx5c2lzLCAgICAgICAgIFBvaW50ZXIgdG8gUU1GIGFuYWx5c2lzIGZpbHRlcmJhbmtzLgogICogXHBhcmFtIGRvd25taXhlZFJlYWxRbWZEYXRhICBQb2ludGVyIHRvIHJlYWwgUU1GIGJ1ZmZlciB0byBiZSB3cml0dGVuIHRvLgogICogXHBhcmFtIGRvd25taXhlZEltYWdRbWZEYXRhICBQb2ludGVyIHRvIGltYWcgUU1GIGJ1ZmZlciB0byBiZSB3cml0dGVuIHRvLgotICogXHBhcmFtIGRvd25zYW1wbGVkT3V0U2lnbmFsICBQb2ludGVyIHRvIGJ1ZmZlciB3aGVyZSB0byB3cml0ZSBkb3dubWl4ZWQgdGltZXNpZ25hbC4KKyAqIFxwYXJhbSBkb3duc2FtcGxlZE91dFNpZ25hbCAgUG9pbnRlciB0byBidWZmZXIgd2hlcmUgdG8gd3JpdGUgZG93bm1peGVkCisgKiB0aW1lc2lnbmFsLgogICogXHBhcmFtIHNiclN5bnRoUW1mICAgICAgICAgICBQb2ludGVyIHRvIFFNRiBzeW50aGVzaXMgZmlsdGVyYmFuay4KICAqIFxwYXJhbSBxbWZTY2FsZSAgICAgICAgICAgICAgUmV0dXJuIHNjYWxpbmcgZmFjdG9yIG9mIHRoZSBxbWYgZGF0YS4KICAqIFxwYXJhbSBzZW5kSGVhZGVyICAgICAgICAgICAgU2lnbmFsIHdoZXRoZXIgdG8gd3JpdGUgaGVhZGVyIGRhdGEuCkBAIC0yMzgsMTggKzI0NiwxMSBAQAogICogICAgICAgICAgLSBQU0VOQ19JTlZBTElEX0hBTkRMRSwgUFNFTkNfRU5DT0RFX0VSUk9SLCBvbiBmYWlsdXJlLgogICovCiBGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX1BTRW5jX1BhcmFtZXRyaWNTdGVyZW9Qcm9jZXNzaW5nKAotICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICBJTlRfUENNICAgICAgICAgICAgICAgICAgKnNhbXBsZXNbMl0sCi0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAotICAgICAgICBRTUZfRklMVEVSX0JBTksgICAgICAgICAqKmhRbWZBbmFseXNpcywKLSAgICAgICAgRklYUF9RTUYgKipSRVNUUklDVCAgICAgICBkb3dubWl4ZWRSZWFsUW1mRGF0YSwKLSAgICAgICAgRklYUF9RTUYgKipSRVNUUklDVCAgICAgICBkb3dubWl4ZWRJbWFnUW1mRGF0YSwKLSAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAgICAgICpkb3duc2FtcGxlZE91dFNpZ25hbCwKLSAgICAgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyAgICBzYnJTeW50aFFtZiwKLSAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgICAgICpxbWZTY2FsZSwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICBzZW5kSGVhZGVyCi0gICAgICAgICk7Ci0KKyAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sIElOVF9QQ00gKnNhbXBsZXNbMl0sCisgICAgVUlOVCB0aW1lSW5TdHJpZGUsIFFNRl9GSUxURVJfQkFOSyAqKmhRbWZBbmFseXNpcywKKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIGRvd25taXhlZFJlYWxRbWZEYXRhLAorICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgZG93bm1peGVkSW1hZ1FtZkRhdGEsIElOVF9QQ00gKmRvd25zYW1wbGVkT3V0U2lnbmFsLAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc2JyU3ludGhRbWYsIFNDSEFSICpxbWZTY2FsZSwgY29uc3QgaW50IHNlbmRIZWFkZXIpOwogCiAvKioKICAqIFxicmllZiAgV3JpdGUgcGFyYW1ldHJpYyBzdGVyZW8gYml0c3RyZWFtLgpAQCAtMjYzLDkgKzI2NCw3IEBACiAgKiBccmV0dXJuCiAgKiAgICAgICAgICAtIG51bWJlciBvZiB3cml0dGVuIGJpdHMuCiAgKi8KLUlOVCBGREtzYnJFbmNfUFNFbmNfV3JpdGVQU0RhdGEoCi0gICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgaEJpdHN0cmVhbQotICAgICAgICApOworSU5UIEZES3NickVuY19QU0VuY19Xcml0ZVBTRGF0YShIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pOwogCi0jZW5kaWYgLyogX19JTkNMVURFRF9QU19NQUlOX0ggKi8KKyNlbmRpZiAvKiBQU19NQUlOX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvcmVzYW1wbGVyLmNwcCBiL2xpYlNCUmVuYy9zcmMvcmVzYW1wbGVyLmNwcAppbmRleCA0YWRiMjQzLi5iMTc4MWE3IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3Jlc2FtcGxlci5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy9yZXNhbXBsZXIuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDExICs5MCwxOSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIEZESyByZXNhbXBsZXIgdG9vbCBib3g6IAorICBcYnJpZWYgIEZESyByZXNhbXBsZXIgdG9vbCBib3g6JFJldmlzaW9uOiA5MTY1NSAkCiAgIFxhdXRob3IgTS4gV2VybmVyCiAqLwogCkBAIC05MSw3ICsxMTAsNiBAQAogCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICBCSVFVQUQgRmlsdGVyIFNwZWNpZmljYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDEsOTIgKzExOSw5MyBAQAogI2RlZmluZSBBMSAyCiAjZGVmaW5lIEEyIDMKIAotI2RlZmluZSBCUUMoeCkgRkwyRlhDT05TVF9TR0woeC8yKQotCisjZGVmaW5lIEJRQyh4KSBGTDJGWENPTlNUX1NHTCh4IC8gMikKIAogc3RydWN0IEZJTFRFUl9QQVJBTSB7Ci0gIGNvbnN0IEZJWFBfU0dMICpjb2VmZmE7ICAgIC8qISBTT1MgbWF0cml4IE9uZSByb3cvc2VjdGlvbi4gU2NhbGVkIHVzaW5nIEJRQygpLiBPcmRlciBvZiBjb2VmZmljaWVudHM6IEIxLEIyLEExLEEyLiBCMD1BMD0xLjAgKi8KLSAgRklYUF9EQkwgZzsgICAgICAgICAgICAgICAgLyohIG92ZXJhbGwgZ2FpbiAqLwotICBpbnQgV2M7ICAgICAgICAgICAgICAgICAgICAvKiEgbm9ybWFsaXplZCBwYXNzYmFuZCBiYW5kd2lkdGggYXQgaW5wdXQgc2FtcGxlcmF0ZSAqIDEwMDAgKi8KLSAgaW50IG5vQ29lZmZzOyAgICAgICAgICAgICAgLyohIG51bWJlciBvZiBmaWx0ZXIgY29lZmZzICovCi0gIGludCBkZWxheTsgICAgICAgICAgICAgICAgIC8qISBkZWxheSBpbiBzYW1wbGVzIGF0IGlucHV0IHNhbXBsZXJhdGUgKi8KKyAgY29uc3QgRklYUF9TR0wgKmNvZWZmYTsgLyohIFNPUyBtYXRyaXggT25lIHJvdy9zZWN0aW9uLiBTY2FsZWQgdXNpbmcgQlFDKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyIG9mIGNvZWZmaWNpZW50czogQjEsQjIsQTEsQTIuIEIwPUEwPTEuMCAqLworICBGSVhQX0RCTCBnOyAgICAgICAgICAgICAvKiEgb3ZlcmFsbCBnYWluICovCisgIGludCBXYzsgICAgICAgLyohIG5vcm1hbGl6ZWQgcGFzc2JhbmQgYmFuZHdpZHRoIGF0IGlucHV0IHNhbXBsZXJhdGUgKiAxMDAwICovCisgIGludCBub0NvZWZmczsgLyohIG51bWJlciBvZiBmaWx0ZXIgY29lZmZzICovCisgIGludCBkZWxheTsgICAgLyohIGRlbGF5IGluIHNhbXBsZXMgYXQgaW5wdXQgc2FtcGxlcmF0ZSAqLwogfTsKIAogI2RlZmluZSBCSVFVQURfQ09FRlNURVAgNAogCiAvKioKICAqXGJyaWVmIExvdyBQYXNzCi0gV2MgPSAwLDUsIG9yZGVyIDMwLCBTdG9wIEJhbmQgLTk2ZEIuIFdjIGNyaXRlcmlhIGlzICJhbG1vc3QgMGRCIHBhc3NiYW5kIiwgbm90IHRoZSB1c3VhbCAtM2RiIGdhaW4gcG9pbnQuCi0gW2IsYV09Y2hlYnkyKDMwLDk2LDAuNTA1KQotIFtzb3MsZ109dGYyc29zKGIsYSkKKyBXYyA9IDAsNSwgb3JkZXIgMzAsIFN0b3AgQmFuZCAtOTZkQi4gV2MgY3JpdGVyaWEgaXMgImFsbW9zdCAwZEIgcGFzc2JhbmQiLCBub3QKKyB0aGUgdXN1YWwgLTNkYiBnYWluIHBvaW50LiBbYixhXT1jaGVieTIoMzAsOTYsMC41MDUpIFtzb3MsZ109dGYyc29zKGIsYSkKICBiYW5kd2lkdGggMC40OAogICovCiBzdGF0aWMgY29uc3QgRklYUF9TR0wgc29zNDhbXSA9IHsKLSBCUUMoMS45ODk0MTA3NTY4MTkzOCksICAgQlFDKDAuOTk5OTk5OTk2ODkwODExKSwgQlFDKDAuODYzMjY0NTI3MjAxOTYzKSwgICAgIEJRQyggMC4xODk1NTM3OTk5NjA2NjMpLAotIEJRQygxLjkwNzMzODA0ODIyNDQ1KSwgICBCUUMoMS4wMDAwMDAwMTczNjE4OSksICBCUUMoMC44MzYzMjE1NzU4NDE2OTEpLCAgICAgQlFDKCAwLjIwMzUwNTgwOTI2NjU2NCksCi0gQlFDKDEuNzU2MTY2NjU0OTUzMjUpLCAgIEJRQygwLjk5OTk5OTk0NjA3OTcyMSksIEJRQygwLjc4NDY5OTIyNTEyMTU4OCksICAgICBCUUMoIDAuMjMwNDcxMjY1NTA2OTg2KSwKLSBCUUMoMS41NTcyNzc0NTUxMjcyNiksICAgQlFDKDEuMDAwMDAwMTE3Mzc4MTUpLCAgQlFDKDAuNzEyNTE1NDIzNTg4MzUxKSwgICAgIEJRQyggMC4yNjg3NTI3MjM5MDA0OTgpLAotIEJRQygxLjMzNDA3NTkxOTQzNjQzKSwgICBCUUMoMC45OTk5OTk3OTU5NTMyMjgpLCBCUUMoMC42MjUwNTkxMTczMzA5ODkpLCAgICAgQlFDKCAwLjMxNjE5NDY4NTI4ODk2NSksCi0gQlFDKDEuMTA2ODk4OTg0MTI0NTgpLCAgIEJRQygxLjAwMDAwMDM1MDU3MTE0KSwgIEJRQygwLjUyODAzNTE0MzY2Mzk4KSwgICAgICBCUUMoIDAuMzcwNTE3ODQzMjI0NjY5KSwKLSBCUUMoMC44OTA2MDM3MTA3ODQ1NCksICAgQlFDKDAuOTk5OTk5MzQzOTYyODIyKSwgQlFDKDAuNDI2OTIwNDYyMTY1MjU3KSwgICAgIEJRQyggMC40Mjk2MDgyMDAyMDc3NDYpLAotIEJRQygwLjY5NDQzODI2MTIwOTQzMyksICBCUUMoIDEuMDAwMDAwODYyOTc5MiksICBCUUMoMC4zMjY1MzA2OTk1NjE3MTYpLCAgICAgQlFDKCAwLjQ5MTcxNDQ1MDY1NDE3NCksCi0gQlFDKDAuNTIzMjM3ODAwOTM1MzIyKSwgIEJRQygxLjAwMDAwMTAxMzQ5NzgyKSwgIEJRQygwLjIzMDgyOTU1NjI3NDg1MSksICAgICBCUUMoIDAuNTU1NTU5MDM0ODQzMjgxKSwKLSBCUUMoMC4zNzg2MzExNjU5Mjk1NjMpLCAgQlFDKDAuOTk5OTg5ODY0ODI2NjUpLCAgQlFDKDAuMTQyOTA2NDIyMDM2MDk1KSwgICAgIEJRQyggMC42MjAzMzg4NzQ0NDI0MTEpLAotIEJRQygwLjI2MDc4NjkxMTMwODQzNyksICBCUUMoMS4wMDAwMzI2MTQ2MDE3OCksICBCUUMoMC4wNjUxMDA4NTc2MjU2NTA1KSwgICAgQlFDKCAwLjY4NTc1OTkyMzkyNjI2MiksCi0gQlFDKDAuMTY4NDA5NDI5MTg4MDk4KSwgIEJRQygwLjk5OTkzMzA0OTY5NTgyOCksIEJRQygtMC4wMDA3OTAwNjc3ODk5NzU1NjIpLCBCUUMoIDAuNzUxOTA1ODk2NjAyMzI1KSwKLSBCUUMoMC4xMDA3MjQ1MzM4MTg2MjgpLCAgQlFDKDEuMDAwMDk0NzI2Njk4NzIpLCAgQlFDKC0wLjA1MzM3NzI4MzAyNTcwNDEpLCAgIEJRQyggMC44MTkzMDc0NDM4NDUyNSksCi0gQlFDKDAuMDU2MTQzNDM1Nzg2NzM2MyksIEJRQygwLjk5OTkxMTYzNjMwNDI3NiksIEJRQygtMC4wOTEzNTUwMjk5MjM2NDA1KSwgICBCUUMoIDAuODg4ODM2MjU4NzU5MTUpLAotIEJRQygwLjAzNDE2ODA2Nzg2NjIwNTcpLCBCUUMoMS4wMDAwMzY2NzUwODY3NiksICBCUUMoLTAuMTEzNDA1MTg1NTM2Njk3KSwgICAgQlFDKCAwLjk2MTc1NjYzODI2ODQ0NikKLX07CisgICAgQlFDKDEuOTg5NDEwNzU2ODE5MzgpLCAgICAgIEJRQygwLjk5OTk5OTk5Njg5MDgxMSksCisgICAgQlFDKDAuODYzMjY0NTI3MjAxOTYzKSwgICAgIEJRQygwLjE4OTU1Mzc5OTk2MDY2MyksCisgICAgQlFDKDEuOTA3MzM4MDQ4MjI0NDUpLCAgICAgIEJRQygxLjAwMDAwMDAxNzM2MTg5KSwKKyAgICBCUUMoMC44MzYzMjE1NzU4NDE2OTEpLCAgICAgQlFDKDAuMjAzNTA1ODA5MjY2NTY0KSwKKyAgICBCUUMoMS43NTYxNjY2NTQ5NTMyNSksICAgICAgQlFDKDAuOTk5OTk5OTQ2MDc5NzIxKSwKKyAgICBCUUMoMC43ODQ2OTkyMjUxMjE1ODgpLCAgICAgQlFDKDAuMjMwNDcxMjY1NTA2OTg2KSwKKyAgICBCUUMoMS41NTcyNzc0NTUxMjcyNiksICAgICAgQlFDKDEuMDAwMDAwMTE3Mzc4MTUpLAorICAgIEJRQygwLjcxMjUxNTQyMzU4ODM1MSksICAgICBCUUMoMC4yNjg3NTI3MjM5MDA0OTgpLAorICAgIEJRQygxLjMzNDA3NTkxOTQzNjQzKSwgICAgICBCUUMoMC45OTk5OTk3OTU5NTMyMjgpLAorICAgIEJRQygwLjYyNTA1OTExNzMzMDk4OSksICAgICBCUUMoMC4zMTYxOTQ2ODUyODg5NjUpLAorICAgIEJRQygxLjEwNjg5ODk4NDEyNDU4KSwgICAgICBCUUMoMS4wMDAwMDAzNTA1NzExNCksCisgICAgQlFDKDAuNTI4MDM1MTQzNjYzOTgpLCAgICAgIEJRQygwLjM3MDUxNzg0MzIyNDY2OSksCisgICAgQlFDKDAuODkwNjAzNzEwNzg0NTQpLCAgICAgIEJRQygwLjk5OTk5OTM0Mzk2MjgyMiksCisgICAgQlFDKDAuNDI2OTIwNDYyMTY1MjU3KSwgICAgIEJRQygwLjQyOTYwODIwMDIwNzc0NiksCisgICAgQlFDKDAuNjk0NDM4MjYxMjA5NDMzKSwgICAgIEJRQygxLjAwMDAwMDg2Mjk3OTIpLAorICAgIEJRQygwLjMyNjUzMDY5OTU2MTcxNiksICAgICBCUUMoMC40OTE3MTQ0NTA2NTQxNzQpLAorICAgIEJRQygwLjUyMzIzNzgwMDkzNTMyMiksICAgICBCUUMoMS4wMDAwMDEwMTM0OTc4MiksCisgICAgQlFDKDAuMjMwODI5NTU2Mjc0ODUxKSwgICAgIEJRQygwLjU1NTU1OTAzNDg0MzI4MSksCisgICAgQlFDKDAuMzc4NjMxMTY1OTI5NTYzKSwgICAgIEJRQygwLjk5OTk4OTg2NDgyNjY1KSwKKyAgICBCUUMoMC4xNDI5MDY0MjIwMzYwOTUpLCAgICAgQlFDKDAuNjIwMzM4ODc0NDQyNDExKSwKKyAgICBCUUMoMC4yNjA3ODY5MTEzMDg0MzcpLCAgICAgQlFDKDEuMDAwMDMyNjE0NjAxNzgpLAorICAgIEJRQygwLjA2NTEwMDg1NzYyNTY1MDUpLCAgICBCUUMoMC42ODU3NTk5MjM5MjYyNjIpLAorICAgIEJRQygwLjE2ODQwOTQyOTE4ODA5OCksICAgICBCUUMoMC45OTk5MzMwNDk2OTU4MjgpLAorICAgIEJRQygtMC4wMDA3OTAwNjc3ODk5NzU1NjIpLCBCUUMoMC43NTE5MDU4OTY2MDIzMjUpLAorICAgIEJRQygwLjEwMDcyNDUzMzgxODYyOCksICAgICBCUUMoMS4wMDAwOTQ3MjY2OTg3MiksCisgICAgQlFDKC0wLjA1MzM3NzI4MzAyNTcwNDEpLCAgIEJRQygwLjgxOTMwNzQ0Mzg0NTI1KSwKKyAgICBCUUMoMC4wNTYxNDM0MzU3ODY3MzYzKSwgICAgQlFDKDAuOTk5OTExNjM2MzA0Mjc2KSwKKyAgICBCUUMoLTAuMDkxMzU1MDI5OTIzNjQwNSksICAgQlFDKDAuODg4ODM2MjU4NzU5MTUpLAorICAgIEJRQygwLjAzNDE2ODA2Nzg2NjIwNTcpLCAgICBCUUMoMS4wMDAwMzY2NzUwODY3NiksCisgICAgQlFDKC0wLjExMzQwNTE4NTUzNjY5NyksICAgIEJRQygwLjk2MTc1NjYzODI2ODQ0Nil9OwogCi0jaWZkZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ4ID0gRkwyRlhDT05TVF9EQkwoMC42NzQzNjUzMjA2MTE2MTk5MjY4MjQwNDQ4MDcxNzY3MSAtIDAuMDAxKTsKLSNlbHNlCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ4ID0gRkwyRlhDT05TVF9EQkwoMC4wMDI3MTI4NjY1MzAwNDcpIC0gKEZJWFBfREJMKTB4ODAwMDsKLSNlbmRpZgorc3RhdGljIGNvbnN0IEZJWFBfREJMIGc0OCA9CisgICAgRkwyRlhDT05TVF9EQkwoMC4wMDI3MTI4NjY1MzAwNDcpIC0gKEZJWFBfREJMKTB4ODAwMDsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBGSUxURVJfUEFSQU0gcGFyYW1fc2V0NDggPSB7Ci0gIHNvczQ4LAotICBnNDgsCi0gIDQ4MCwKLSAgMTUsCi0gIDQgLyogTEYgMiAqLworICAgIHNvczQ4LCBnNDgsIDQ4MCwgMTUsIDQgLyogTEYgMiAqLwogfTsKIAogLyoqCiAgKlxicmllZiBMb3cgUGFzcwotIFdjID0gMCw1LCBvcmRlciAyNCwgU3RvcCBCYW5kIC05NmRCLiBXYyBjcml0ZXJpYSBpcyAiYWxtb3N0IDBkQiBwYXNzYmFuZCIsIG5vdCB0aGUgdXN1YWwgLTNkYiBnYWluIHBvaW50LgotIFtiLGFdPWNoZWJ5MigyNCw5NiwwLjUpCi0gW3NvcyxnXT10ZjJzb3MoYixhKQorIFdjID0gMCw1LCBvcmRlciAyNCwgU3RvcCBCYW5kIC05NmRCLiBXYyBjcml0ZXJpYSBpcyAiYWxtb3N0IDBkQiBwYXNzYmFuZCIsIG5vdAorIHRoZSB1c3VhbCAtM2RiIGdhaW4gcG9pbnQuIFtiLGFdPWNoZWJ5MigyNCw5NiwwLjUpIFtzb3MsZ109dGYyc29zKGIsYSkKICBiYW5kd2lkdGggMC40NQogICovCiBzdGF0aWMgY29uc3QgRklYUF9TR0wgc29zNDVbXSA9IHsKLSAgQlFDKDEuOTgyOTYyNjAxNDQ0KSwgICAgIEJRQygxLjAwMDAwMDAwMDA3NTA0KSwgIEJRQygwLjY0NjExMzMwMzczNzgzNiksICAgQlFDKCAwLjEwODUxMTQ5OTc5OTgxKSwKLSAgQlFDKDEuODUzMzQwOTQyODExMTEpLCAgIEJRQygwLjk5OTk5OTk5OTY3NzE5MiksIEJRQygwLjYxMjA3MzIyMDEwMjAwNiksICAgQlFDKCAwLjEzMDAyMjE0MTY5ODA0NCksCi0gIEJRQygxLjYyNTQxMDUxNDE1NDI1KSwgICBCUUMoMS4wMDAwMDAwMDA4MDM5OCksICBCUUMoMC41NDc4Nzk3MDI4NTU5NTkpLCAgIEJRQyggMC4xNzExNjU4MjUxMzMxOTIpLAotICBCUUMoMS4zNDU1NDY1NjkyMzI0NyksICAgQlFDKDAuOTk5OTk5OTk4MDE2OSksICAgQlFDKDAuNDYwMzczOTE0NTA4NDkxKSwgICBCUUMoIDAuMjI4Njc3NDYzMzc2MzU0KSwKLSAgQlFDKDEuMDU2NTY1Njg1MDMxMTYpLCAgIEJRQygxLjAwMDAwMDAwNTY5MzYzKSwgIEJRQygwLjM1Nzg5MTg5NDAzODI4NyksICAgQlFDKCAwLjI5ODY3Njg0MzkxMjE4NSksCi0gIEJRQygwLjc4Nzk2NzU4Nzg3NzMxMiksICBCUUMoMC45OTk5OTk5ODQ0MTUwMTcpLCBCUUMoMC4yNDg4MjY4OTMyMTE4NzcpLCAgIEJRQyggMC4zNzc0NDE4MDM1MTI5NzgpLAotICBCUUMoMC41NTU0ODA5NzExMjA0OTcpLCAgQlFDKDEuMDAwMDAwMDM1ODMzMDcpLCAgQlFDKDAuMTQwNjE0MjYzMzQ1MzE1KSwgICBCUUMoIDAuNDYxOTc5MzAyMjEzNjc5KSwKLSAgQlFDKDAuMzY0OTg2MjA3MDcwOTY0KSwgIEJRQygwLjk5OTk5OTkzMjA4NDMwMyksIEJRQygwLjAzOTI2Njk0NDYwNzQ1MTYpLCAgQlFDKCAwLjU1MDMzNDUxMTgwODI1KSwKLSAgQlFDKDAuMjE2ODI3MjY3NjMxNTU4KSwgIEJRQygxLjAwMDAwMDEwNTM0NjgyKSwgIEJRQygtMC4wNTA2MjMyMjI4ODY1MTAzKSwgQlFDKCAwLjY0MTY5MTU4MTU2MDk0NiksCi0gIEJRQygwLjEwODk1MTY3MjI3NzExOSksICBCUUMoMC45OTk5OTk4NzExNjc1MTYpLCBCUUMoLTAuMTI1NTg0ODQwMTgzMjI1KSwgIEJRQyggMC43MzYzNjc3NDg3NzE4MDMpLAotICBCUUMoMC4wMzg3OTg4NjA3MjI5MDM1KSwgQlFDKDEuMDAwMDAwMTEyMDU1NzQpLCAgQlFDKC0wLjE4MjgxNDg0OTA5Nzk3NCksICBCUUMoIDAuODM1ODAyMTA4NzE0OTY0KSwKLSAgQlFDKDAuMDA0Mjg2NjE3NTgwOTIyNSksIEJRQygwLjk5OTk5OTk1NDgzMDgxMyksIEJRQygtMC4yMTk2NTc0MDYxNzE1MSksICAgQlFDKCAwLjk0MjYyMzA0Nzc4MjM2MykKLX07CisgICAgQlFDKDEuOTgyOTYyNjAxNDQ0KSwgICAgIEJRQygxLjAwMDAwMDAwMDA3NTA0KSwgICAgQlFDKDAuNjQ2MTEzMzAzNzM3ODM2KSwKKyAgICBCUUMoMC4xMDg1MTE0OTk3OTk4MSksICAgQlFDKDEuODUzMzQwOTQyODExMTEpLCAgICBCUUMoMC45OTk5OTk5OTk2NzcxOTIpLAorICAgIEJRQygwLjYxMjA3MzIyMDEwMjAwNiksICBCUUMoMC4xMzAwMjIxNDE2OTgwNDQpLCAgIEJRQygxLjYyNTQxMDUxNDE1NDI1KSwKKyAgICBCUUMoMS4wMDAwMDAwMDA4MDM5OCksICAgQlFDKDAuNTQ3ODc5NzAyODU1OTU5KSwgICBCUUMoMC4xNzExNjU4MjUxMzMxOTIpLAorICAgIEJRQygxLjM0NTU0NjU2OTIzMjQ3KSwgICBCUUMoMC45OTk5OTk5OTgwMTY5KSwgICAgIEJRQygwLjQ2MDM3MzkxNDUwODQ5MSksCisgICAgQlFDKDAuMjI4Njc3NDYzMzc2MzU0KSwgIEJRQygxLjA1NjU2NTY4NTAzMTE2KSwgICAgQlFDKDEuMDAwMDAwMDA1NjkzNjMpLAorICAgIEJRQygwLjM1Nzg5MTg5NDAzODI4NyksICBCUUMoMC4yOTg2NzY4NDM5MTIxODUpLCAgIEJRQygwLjc4Nzk2NzU4Nzg3NzMxMiksCisgICAgQlFDKDAuOTk5OTk5OTg0NDE1MDE3KSwgIEJRQygwLjI0ODgyNjg5MzIxMTg3NyksICAgQlFDKDAuMzc3NDQxODAzNTEyOTc4KSwKKyAgICBCUUMoMC41NTU0ODA5NzExMjA0OTcpLCAgQlFDKDEuMDAwMDAwMDM1ODMzMDcpLCAgICBCUUMoMC4xNDA2MTQyNjMzNDUzMTUpLAorICAgIEJRQygwLjQ2MTk3OTMwMjIxMzY3OSksICBCUUMoMC4zNjQ5ODYyMDcwNzA5NjQpLCAgIEJRQygwLjk5OTk5OTkzMjA4NDMwMyksCisgICAgQlFDKDAuMDM5MjY2OTQ0NjA3NDUxNiksIEJRQygwLjU1MDMzNDUxMTgwODI1KSwgICAgQlFDKDAuMjE2ODI3MjY3NjMxNTU4KSwKKyAgICBCUUMoMS4wMDAwMDAxMDUzNDY4MiksICAgQlFDKC0wLjA1MDYyMzIyMjg4NjUxMDMpLCBCUUMoMC42NDE2OTE1ODE1NjA5NDYpLAorICAgIEJRQygwLjEwODk1MTY3MjI3NzExOSksICBCUUMoMC45OTk5OTk4NzExNjc1MTYpLCAgIEJRQygtMC4xMjU1ODQ4NDAxODMyMjUpLAorICAgIEJRQygwLjczNjM2Nzc0ODc3MTgwMyksICBCUUMoMC4wMzg3OTg4NjA3MjI5MDM1KSwgIEJRQygxLjAwMDAwMDExMjA1NTc0KSwKKyAgICBCUUMoLTAuMTgyODE0ODQ5MDk3OTc0KSwgQlFDKDAuODM1ODAyMTA4NzE0OTY0KSwgICBCUUMoMC4wMDQyODY2MTc1ODA5MjI1KSwKKyAgICBCUUMoMC45OTk5OTk5NTQ4MzA4MTMpLCAgQlFDKC0wLjIxOTY1NzQwNjE3MTUxKSwgICBCUUMoMC45NDI2MjMwNDc3ODIzNjMpfTsKIAotI2lmZGVmIFJTX0JJUVVBRF9TQ0FUVEVSR0FJTgotc3RhdGljIGNvbnN0IEZJWFBfREJMIGc0NSA9IEZMMkZYQ09OU1RfREJMKDAuNjA1NDc0Mjg4OTEzNDEzMTkwNTExNDI2Mjk3MDY3MjMgLSAwLjAwMSk7Ci0jZWxzZQotc3RhdGljIGNvbnN0IEZJWFBfREJMIGc0NSA9IEZMMkZYQ09OU1RfREJMKDAuMDAyNDI3NDM5ODA5MDk1MjQpIC0gKEZJWFBfREJMKTB4ODAwMDsKLSNlbmRpZgorc3RhdGljIGNvbnN0IEZJWFBfREJMIGc0NSA9CisgICAgRkwyRlhDT05TVF9EQkwoMC4wMDI0Mjc0Mzk4MDkwOTUyNCkgLSAoRklYUF9EQkwpMHg4MDAwOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSBwYXJhbV9zZXQ0NSA9IHsKLSAgc29zNDUsCi0gIGc0NSwKLSAgNDUwLAotICAxMiwKLSAgNCAvKiBMRiAyICovCisgICAgc29zNDUsIGc0NSwgNDUwLCAxMiwgNCAvKiBMRiAyICovCiB9OwogCiAvKgpAQCAtMTk3LDMwICsyMTYsMjMgQEAKICBiYW5kd2lkdGggPSAwLjQxCiAgKi8KIAotc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczQxW10gPQotewotICBCUUMoMS45NjE5MzYyNTI5MiksICAgICAgIEJRQygwLjk5OTk5OTk5OTk5OTk2NCksIEJRQygwLjE2OTI2NjE3ODc4Njc4OSksICAgQlFDKDAuMDEyODgyMzMwMDQ3NTkwNyksCi0gIEJRQygxLjY4OTEzNDM3NjYyMDkyKSwgICAgQlFDKDEuMDAwMDAwMDAwMDAwNTMpLCAgQlFDKDAuMTI0NzUxNTAzMjA2NTUyKSwgICBCUUMoMC4wNTM3NDcyMjczOTUwOTg5KSwKLSAgQlFDKDEuMjcyNzQ2OTIzNjYwMTcpLCAgICBCUUMoMC45OTk5OTk5OTk5OTU2NzQpLCBCUUMoMC4wNDMzMTA4NjI1MTc4MzU3KSwgIEJRQygwLjEzMTAxNTc1MzIzNjMxNyksCi0gIEJRQygwLjg1MjE0MTc1MDg4Mzk1KSwgICAgQlFDKDEuMDAwMDAwMDAwMDE4MTMpLCAgQlFDKC0wLjA2MjU2NTgxNTI1NTA0MDgpLCBCUUMoMC4yMzc3NjM3Nzg5OTM4MDYpLAotICBCUUMoMC41MDM4NDE1Nzk5MzkwMDkpLCAgIEJRQygwLjk5OTk5OTk5OTk1MzIyMyksIEJRQygtMC4xNzkxNzYxMjg3MjI4NjUpLCAgQlFDKDAuMzY3NDc1MjM2NDI0NDc0KSwKLSAgQlFDKDAuMjQ5OTkwNzExOTg2MTYyKSwgICBCUUMoMS4wMDAwMDAwMDAwNzk1MiksICBCUUMoLTAuMjk0NDI1MTY1ODI0Njc2KSwgIEJRQygwLjUxNjU5NDg1NzE3MDIxMiksCi0gIEJRQygwLjA4Nzk3MTY2ODY4MDI4NiksICAgQlFDKDAuOTk5OTk5OTk5OTE1NTI4KSwgQlFDKC0wLjM5ODk1NjU2Njc3NzkyOCksICBCUUMoMC42ODY0MTc3Njc4MDExMjMpLAotICBCUUMoMC4wMDk2NTM3MzMyNTM1MDI5NCksIEJRQygxLjAwMDAwMDAwMDAzNzQ0KSwgIEJRQygtMC40ODU3OTE3Mzc2NDgxNyksICAgQlFDKDAuODg0OTMxNTM0MjM5MDY4KQotfTsKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBzb3M0MVtdID0geworICAgIEJRQygxLjk2MTkzNjI1MjkyKSwgICAgICBCUUMoMC45OTk5OTk5OTk5OTk5NjQpLCAgIEJRQygwLjE2OTI2NjE3ODc4Njc4OSksCisgICAgQlFDKDAuMDEyODgyMzMwMDQ3NTkwNyksIEJRQygxLjY4OTEzNDM3NjYyMDkyKSwgICAgQlFDKDEuMDAwMDAwMDAwMDAwNTMpLAorICAgIEJRQygwLjEyNDc1MTUwMzIwNjU1MiksICBCUUMoMC4wNTM3NDcyMjczOTUwOTg5KSwgIEJRQygxLjI3Mjc0NjkyMzY2MDE3KSwKKyAgICBCUUMoMC45OTk5OTk5OTk5OTU2NzQpLCAgQlFDKDAuMDQzMzEwODYyNTE3ODM1NyksICBCUUMoMC4xMzEwMTU3NTMyMzYzMTcpLAorICAgIEJRQygwLjg1MjE0MTc1MDg4Mzk1KSwgICBCUUMoMS4wMDAwMDAwMDAwMTgxMyksICAgIEJRQygtMC4wNjI1NjU4MTUyNTUwNDA4KSwKKyAgICBCUUMoMC4yMzc3NjM3Nzg5OTM4MDYpLCAgQlFDKDAuNTAzODQxNTc5OTM5MDA5KSwgICBCUUMoMC45OTk5OTk5OTk5NTMyMjMpLAorICAgIEJRQygtMC4xNzkxNzYxMjg3MjI4NjUpLCBCUUMoMC4zNjc0NzUyMzY0MjQ0NzQpLCAgIEJRQygwLjI0OTk5MDcxMTk4NjE2MiksCisgICAgQlFDKDEuMDAwMDAwMDAwMDc5NTIpLCAgIEJRQygtMC4yOTQ0MjUxNjU4MjQ2NzYpLCAgQlFDKDAuNTE2NTk0ODU3MTcwMjEyKSwKKyAgICBCUUMoMC4wODc5NzE2Njg2ODAyODYpLCAgQlFDKDAuOTk5OTk5OTk5OTE1NTI4KSwgICBCUUMoLTAuMzk4OTU2NTY2Nzc3OTI4KSwKKyAgICBCUUMoMC42ODY0MTc3Njc4MDExMjMpLCAgQlFDKDAuMDA5NjUzNzMzMjUzNTAyOTQpLCBCUUMoMS4wMDAwMDAwMDAwMzc0NCksCisgICAgQlFDKC0wLjQ4NTc5MTczNzY0ODE3KSwgIEJRQygwLjg4NDkzMTUzNDIzOTA2OCl9OwogCi0jaWZkZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgZzQxID0gRkwyRlhDT05TVF9EQkwoMC40NDU3ODUxNDQ3NjQ3NjY3OTc1MDgxMTIyMjEyMzU2OSk7Ci0jZWxzZQogc3RhdGljIGNvbnN0IEZJWFBfREJMIGc0MSA9IEZMMkZYQ09OU1RfREJMKDAuMDAxNTU5NTY5NTExNjkyNDgpOwotI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNIHBhcmFtX3NldDQxID0gewotICBzb3M0MSwKLSAgZzQxLAotICA0MTAsCi0gIDgsCi0gIDUgLyogTEYgMyAqLworICAgIHNvczQxLCBnNDEsIDQxMCwgOCwgNSAvKiBMRiAzICovCiB9OwogCiAvKgpAQCAtMjI5LDI5ICsyNDEsMTkgQEAKICBbYixhXT1jaGVieTIoMTIsOTYsMC41KTsKICBbc29zLGddPXRmMnNvcyhiLGEpCiAqLwotc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczM1W10gPQotewotICBCUUMoMS45MzI5OTMyNTIzNTc2MiksICAgQlFDKDAuOTk5OTk5OTk5OTk5OTg1KSwgQlFDKC0wLjE0MDczMzE4NzI0NjU5NiksIEJRQygwLjAxMjQxMzk0OTc4MzYwNjIpLAotICBCUUMoMS40ODkwNDE2NzY0MTA5KSwgICAgQlFDKDEuMDAwMDAwMDAwMDAwMTEpLCAgQlFDKC0wLjE5ODIxNTQwMjU4ODUwNCksIEJRQygwLjA3NDY3MzA2MTY1ODQxMzgpLAotICBCUUMoMC45MTg0NTAxNjEzMDk3OTUpLCAgQlFDKDAuOTk5OTk5OTk5OTk5NjE5KSwgQlFDKC0wLjMwMTMzOTEyNzkxOTQxKSwgIEJRQygwLjE5MjI3NjQ2ODgzOTUyOSksCi0gIEJRQygwLjQ1NDg3NzAyNDI0NjgxOCksICBCUUMoMS4wMDAwMDAwMDAwMDA4NiksICBCUUMoLTAuNDMyMzM3MzI4ODA5ODE1KSwgQlFDKDAuMzU2ODUyOTMzNjQyODE1KSwKLSAgQlFDKDAuMTU4MDE3MTQ3MTE4NTA3KSwgIEJRQygwLjk5OTk5OTk5OTk5ODg3NiksIEJRQygtMC41NzQ4MTc0OTQyNDk3NzcpLCBCUUMoMC41NjYzODA0MzY5NzA4MzMpLAotICBCUUMoMC4wMTcxODM0NjQ5NDc4NzQ5KSwgQlFDKDEuMDAwMDAwMDAwMDAwNTUpLCAgQlFDKC0wLjcxODU4MTE3ODA0MTE2NSksIEJRQygwLjgzMzY3NDg0NDg3ODg5KQotfTsKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBzb3MzNVtdID0geworICAgIEJRQygxLjkzMjk5MzI1MjM1NzYyKSwgICBCUUMoMC45OTk5OTk5OTk5OTk5ODUpLCAgQlFDKC0wLjE0MDczMzE4NzI0NjU5NiksCisgICAgQlFDKDAuMDEyNDEzOTQ5NzgzNjA2MiksIEJRQygxLjQ4OTA0MTY3NjQxMDkpLCAgICBCUUMoMS4wMDAwMDAwMDAwMDAxMSksCisgICAgQlFDKC0wLjE5ODIxNTQwMjU4ODUwNCksIEJRQygwLjA3NDY3MzA2MTY1ODQxMzgpLCBCUUMoMC45MTg0NTAxNjEzMDk3OTUpLAorICAgIEJRQygwLjk5OTk5OTk5OTk5OTYxOSksICBCUUMoLTAuMzAxMzM5MTI3OTE5NDEpLCAgQlFDKDAuMTkyMjc2NDY4ODM5NTI5KSwKKyAgICBCUUMoMC40NTQ4NzcwMjQyNDY4MTgpLCAgQlFDKDEuMDAwMDAwMDAwMDAwODYpLCAgIEJRQygtMC40MzIzMzczMjg4MDk4MTUpLAorICAgIEJRQygwLjM1Njg1MjkzMzY0MjgxNSksICBCUUMoMC4xNTgwMTcxNDcxMTg1MDcpLCAgQlFDKDAuOTk5OTk5OTk5OTk4ODc2KSwKKyAgICBCUUMoLTAuNTc0ODE3NDk0MjQ5Nzc3KSwgQlFDKDAuNTY2MzgwNDM2OTcwODMzKSwgIEJRQygwLjAxNzE4MzQ2NDk0Nzg3NDkpLAorICAgIEJRQygxLjAwMDAwMDAwMDAwMDU1KSwgICBCUUMoLTAuNzE4NTgxMTc4MDQxMTY1KSwgQlFDKDAuODMzNjc0ODQ0ODc4ODkpfTsKIAotI2lmZGVmIFJTX0JJUVVBRF9TQ0FUVEVSR0FJTgotc3RhdGljIGNvbnN0IEZJWFBfREJMIGczNSA9IEZMMkZYQ09OU1RfREJMKDAuMzQyOTA4NTM1NzQ5NzM4OTg2OTQ1MjEyNjc2MDY3OTIpOwotI2Vsc2UKIHN0YXRpYyBjb25zdCBGSVhQX0RCTCBnMzUgPSBGTDJGWENPTlNUX0RCTCgwLjAwMTYyNTgwOTk0MTI1MTMxKTsKLSNlbmRpZgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSBwYXJhbV9zZXQzNSA9IHsKLSAgc29zMzUsCi0gIGczNSwKLSAgMzUwLAotICA2LAotICA0Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBGSUxURVJfUEFSQU0gcGFyYW1fc2V0MzUgPSB7c29zMzUsIGczNSwgMzUwLCA2LCA0fTsKIAogLyoKICAjIENyZWF0ZWQgYnkgT2N0YXZlIDIuMS43MywgTW9uIE9jdCAxMyAxODoxNTozOCAyMDA4IENFU1QKQEAgLTI1OSw2NiArMjYxLDUzIEBACiAgW2IsYV09Y2hlYnkyKDgsOTYsMC41KTsKICBbc29zLGddPXRmMnNvcyhiLGEpCiAqLwotc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczI1W10gPQotewotICBCUUMoMS44NTMzNDA5NDMwMTIyNSksICAgQlFDKDEuMCksICAgICAgICAgICAgICAgQlFDKC0wLjcwMjEyNzIxNDIxMjY2MyksIEJRQygwLjEzMjQ1MjQwMzk5ODc2NyksCi0gIEJRQygxLjA1NjU2NTY4MjE2NyksICAgICBCUUMoMC45OTk5OTk5OTk5OTk5OTcpLCBCUUMoLTAuNzg5NTAzNjY3ODgwNzg1KSwgQlFDKDAuMjM2MzI4NjkzNTY5MTI4KSwKLSAgQlFDKDAuMzY0OTg2MzA3NDU1NDg5KSwgIEJRQygwLjk5OTk5OTk5OTk5OTk5NiksIEJRQygtMC45NTUxOTExODk4NDMzNzUpLCBCUUMoMC40NDI5NjY0NTc5MzYzNzkpLAotICBCUUMoMC4wMzg3OTg1NzUxNjQyMTI1KSwgQlFDKDEuMCksICAgICAgICAgICAgICAgQlFDKC0xLjE5ODE3Nzg2MDg4MDg0KSwgIEJRQygwLjc3MDQ5Mzg5NTQ1NjMyOCkKLX07CitzdGF0aWMgY29uc3QgRklYUF9TR0wgc29zMjVbXSA9IHsKKyAgICBCUUMoMS44NTMzNDA5NDMwMTIyNSksICAgQlFDKDEuMCksCisgICAgQlFDKC0wLjcwMjEyNzIxNDIxMjY2MyksIEJRQygwLjEzMjQ1MjQwMzk5ODc2NyksCisgICAgQlFDKDEuMDU2NTY1NjgyMTY3KSwgICAgIEJRQygwLjk5OTk5OTk5OTk5OTk5NyksCisgICAgQlFDKC0wLjc4OTUwMzY2Nzg4MDc4NSksIEJRQygwLjIzNjMyODY5MzU2OTEyOCksCisgICAgQlFDKDAuMzY0OTg2MzA3NDU1NDg5KSwgIEJRQygwLjk5OTk5OTk5OTk5OTk5NiksCisgICAgQlFDKC0wLjk1NTE5MTE4OTg0MzM3NSksIEJRQygwLjQ0Mjk2NjQ1NzkzNjM3OSksCisgICAgQlFDKDAuMDM4Nzk4NTc1MTY0MjEyNSksIEJRQygxLjApLAorICAgIEJRQygtMS4xOTgxNzc4NjA4ODA4NCksICBCUUMoMC43NzA0OTM4OTU0NTYzMjgpfTsKIAotI2lmZGVmIFJTX0JJUVVBRF9TQ0FUVEVSR0FJTgotc3RhdGljIGNvbnN0IEZJWFBfREJMIGcyNSA9IEZMMkZYQ09OU1RfREJMKDAuMTc1MzM5MTc0MDg5MzYzNDY5NjAwODAyNTk5NTA0NzEpOwotI2Vsc2UKIHN0YXRpYyBjb25zdCBGSVhQX0RCTCBnMjUgPSBGTDJGWENPTlNUX0RCTCgwLjAwMDk0NTE4MjgzNTI5NDU1OSk7Ci0jZW5kaWYKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBGSUxURVJfUEFSQU0gcGFyYW1fc2V0MjUgPSB7Ci0gIHNvczI1LAotICBnMjUsCi0gIDI1MCwKLSAgNCwKLSAgNQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNIHBhcmFtX3NldDI1ID0ge3NvczI1LCBnMjUsIDI1MCwgNCwgNX07CiAKIC8qIE11c3QgYmUgc29ydGVkIGluIGRlc2NlbmRpbmcgb3JkZXIgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNICpjb25zdCBmaWx0ZXJfcGFyYW1TZXRbXSA9IHsKLSAgJnBhcmFtX3NldDQ4LAotICAmcGFyYW1fc2V0NDUsCi0gICZwYXJhbV9zZXQ0MSwKLSAgJnBhcmFtX3NldDM1LAotICAmcGFyYW1fc2V0MjUKLX07Ci0KKyAgICAmcGFyYW1fc2V0NDgsICZwYXJhbV9zZXQ0NSwgJnBhcmFtX3NldDQxLCAmcGFyYW1fc2V0MzUsICZwYXJhbV9zZXQyNX07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2FtcGxlciBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiAvKiEKICAgXGJyaWVmICAgUmVzZXQgZG93bnNhbXBsZXIgaW5zdGFuY2UgYW5kIGNsZWFyIGRlbGF5IGxpbmVzCiAKICAgXHJldHVybiAgc3VjY2VzcyBvZiBvcGVyYXRpb24KICovCiAKLUlOVCBGREthYWNFbmNfSW5pdERvd25zYW1wbGVyKERPV05TQU1QTEVSICpEb3duU2FtcGxlciwgLyohPCBwb2ludGVyIHRvIGRvd25zYW1wbGVyIGluc3RhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgV2MsICAgICAgICAgICAgICAgICAgIC8qITwgbm9ybWFsaXplZCBjdXRvZmYgZnJlcSAqIDEwMDAqICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdGlvKSAgICAgICAgICAgICAgICAvKiE8IGRvd25zYW1wbGVyIHJhdGlvIChvbmx5IDIgc3VwcG9ydGVkIGF0IHRoZSBtb21tZW50KSAqLworSU5UIEZES2FhY0VuY19Jbml0RG93bnNhbXBsZXIoCisgICAgRE9XTlNBTVBMRVIgKkRvd25TYW1wbGVyLCAvKiE8IHBvaW50ZXIgdG8gZG93bnNhbXBsZXIgaW5zdGFuY2UgKi8KKyAgICBpbnQgV2MsICAgICAgICAgICAgICAgICAgIC8qITwgbm9ybWFsaXplZCBjdXRvZmYgZnJlcSAqIDEwMDAqICAqLworICAgIGludCByYXRpbykgICAgICAgICAgICAgICAgLyohPCBkb3duc2FtcGxlciByYXRpbyAqLwogCiB7CiAgIFVJTlQgaTsKLSAgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSAqY3VycmVudFNldD1OVUxMOworICBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNICpjdXJyZW50U2V0ID0gTlVMTDsKIAotICBGREtfQVNTRVJUKHJhdGlvID09IDIpOwotICBGREttZW1jbGVhcihEb3duU2FtcGxlci0+ZG93bkZpbHRlci5zdGF0ZXMsIHNpemVvZihEb3duU2FtcGxlci0+ZG93bkZpbHRlci5zdGF0ZXMpKTsKLSAgRG93blNhbXBsZXItPmRvd25GaWx0ZXIucHRyICAgPSAgIDA7CisgIEZES21lbWNsZWFyKERvd25TYW1wbGVyLT5kb3duRmlsdGVyLnN0YXRlcywKKyAgICAgICAgICAgICAgc2l6ZW9mKERvd25TYW1wbGVyLT5kb3duRmlsdGVyLnN0YXRlcykpOworICBEb3duU2FtcGxlci0+ZG93bkZpbHRlci5wdHIgPSAwOwogCiAgIC8qCiAgICAgZmluZCBhcHBsaWNhYmxlIHBhcmFtZXRlciBzZXQKICAgKi8KICAgY3VycmVudFNldCA9IGZpbHRlcl9wYXJhbVNldFswXTsKLSAgZm9yKGk9MTtpPHNpemVvZihmaWx0ZXJfcGFyYW1TZXQpL3NpemVvZihzdHJ1Y3QgRklMVEVSX1BBUkFNICopO2krKyl7CisgIGZvciAoaSA9IDE7IGkgPCBzaXplb2YoZmlsdGVyX3BhcmFtU2V0KSAvIHNpemVvZihzdHJ1Y3QgRklMVEVSX1BBUkFNICopOworICAgICAgIGkrKykgewogICAgIGlmIChmaWx0ZXJfcGFyYW1TZXRbaV0tPldjIDw9IFdjKSB7CiAgICAgICBicmVhazsKICAgICB9CkBAIC0zMjcsMjAgKzMxNiwxOCBAQAogCiAgIERvd25TYW1wbGVyLT5kb3duRmlsdGVyLmNvZWZmYSA9IGN1cnJlbnRTZXQtPmNvZWZmYTsKIAotCiAgIERvd25TYW1wbGVyLT5kb3duRmlsdGVyLmdhaW4gPSBjdXJyZW50U2V0LT5nOwotICBGREtfQVNTRVJUKGN1cnJlbnRTZXQtPm5vQ29lZmZzIDw9IE1BWE5SX1NFQ1RJT05TKjIpOworICBGREtfQVNTRVJUKGN1cnJlbnRTZXQtPm5vQ29lZmZzIDw9IE1BWE5SX1NFQ1RJT05TICogMik7CiAKICAgRG93blNhbXBsZXItPmRvd25GaWx0ZXIubm9Db2VmZnMgPSBjdXJyZW50U2V0LT5ub0NvZWZmczsKICAgRG93blNhbXBsZXItPmRlbGF5ID0gY3VycmVudFNldC0+ZGVsYXk7CiAgIERvd25TYW1wbGVyLT5kb3duRmlsdGVyLldjID0gY3VycmVudFNldC0+V2M7CiAKLSAgRG93blNhbXBsZXItPnJhdGlvID0gICByYXRpbzsKLSAgRG93blNhbXBsZXItPnBlbmRpbmcgPSByYXRpby0xOwotICByZXR1cm4oMSk7CisgIERvd25TYW1wbGVyLT5yYXRpbyA9IHJhdGlvOworICBEb3duU2FtcGxlci0+cGVuZGluZyA9IHJhdGlvIC0gMTsKKyAgcmV0dXJuICgxKTsKIH0KIAotCiAvKiEKICAgXGJyaWVmICAgZmFzdGVyIHNpbXBsZSBmb2xkaW5nIG9wZXJhdGlvbgogICAgICAgICAgICBGaWx0ZXI6CkBAIC0zNTEsNjQgKzMzOCw1NCBAQAogICBccmV0dXJuICBmaWx0ZXJlZCB2YWx1ZQogKi8KIAotc3RhdGljIGlubGluZSBJTlRfUENNIEFkdmFuY2VGaWx0ZXIoTFBfRklMVEVSICpkb3duRmlsdGVyLCAgLyohPCBwb2ludGVyIHRvIGlpciBmaWx0ZXIgaW5zdGFuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAqcElucHV0LCAgICAgICAgICAvKiE8IGlucHV0IG9mIGZpbHRlciAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb3duUmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluU3RyaWRlKQoteworc3RhdGljIGlubGluZSBJTlRfUENNIEFkdmFuY2VGaWx0ZXIoCisgICAgTFBfRklMVEVSICpkb3duRmlsdGVyLCAvKiE8IHBvaW50ZXIgdG8gaWlyIGZpbHRlciBpbnN0YW5jZSAqLworICAgIElOVF9QQ00gKnBJbnB1dCwgICAgICAgLyohPCBpbnB1dCBvZiBmaWx0ZXIgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgZG93blJhdGlvKSB7CiAgIElOVF9QQ00gb3V0cHV0OwogICBpbnQgaSwgbjsKIAotCi0jaWZkZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOCi0jZGVmaW5lIEJJUVVBRF9TQ0FMRSAzCi0jZWxzZQogI2RlZmluZSBCSVFVQURfU0NBTEUgMTIKLSNlbmRpZgogCiAgIEZJWFBfREJMIHkgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgRklYUF9EQkwgaW5wdXQ7CiAKLSAgZm9yIChuPTA7IG48ZG93blJhdGlvOyBuKyspCi0gIHsKLSAgICBGSVhQX0JRUyAoKnN0YXRlcylbMl0gPSBkb3duRmlsdGVyLT5zdGF0ZXM7CisgIGZvciAobiA9IDA7IG4gPCBkb3duUmF0aW87IG4rKykgeworICAgIEZJWFBfQlFTKCpzdGF0ZXMpWzJdID0gZG93bkZpbHRlci0+c3RhdGVzOwogICAgIGNvbnN0IEZJWFBfU0dMICpjb2VmZiA9IGRvd25GaWx0ZXItPmNvZWZmYTsKLSAgICBpbnQgczEsczI7CisgICAgaW50IHMxLCBzMjsKIAogICAgIHMxID0gZG93bkZpbHRlci0+cHRyOwogICAgIHMyID0gczEgXiAxOwogCiAjaWYgKFNBTVBMRV9CSVRTID09IDE2KQotICAgIGlucHV0ID0gICgoRklYUF9EQkwpcElucHV0W24qaW5TdHJpZGVdKSA8PCAoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMtQklRVUFEX1NDQUxFKTsKKyAgICBpbnB1dCA9ICgoRklYUF9EQkwpcElucHV0W25dKSA8PCAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyAtIEJJUVVBRF9TQ0FMRSk7CiAjZWxpZiAoU0FNUExFX0JJVFMgPT0gMzIpCi0gICAgaW5wdXQgPSAgcElucHV0W24qaW5TdHJpZGVdID4+IEJJUVVBRF9TQ0FMRTsKKyAgICBpbnB1dCA9IHBJbnB1dFtuXSA+PiBCSVFVQURfU0NBTEU7CiAjZWxzZQogI2Vycm9yIE5PVCBJTVBMRU1FTlRFRAogI2VuZGlmCiAKLSNpZm5kZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOIC8qIE1lcmdlZCBEaXJlY3QgZm9ybSBJICovCi0KICAgICBGSVhQX0JRUyBzdGF0ZTEsIHN0YXRlMiwgc3RhdGUxYiwgc3RhdGUyYjsKIAogICAgIHN0YXRlMSA9IHN0YXRlc1swXVtzMV07CiAgICAgc3RhdGUyID0gc3RhdGVzWzBdW3MyXTsKIAogICAgIC8qIExvb3Agb3ZlciBzZWN0aW9ucyAqLwotICAgIGZvciAoaT0wOyBpPGRvd25GaWx0ZXItPm5vQ29lZmZzOyBpKyspCi0gICAgeworICAgIGZvciAoaSA9IDA7IGkgPCBkb3duRmlsdGVyLT5ub0NvZWZmczsgaSsrKSB7CiAgICAgICBGSVhQX0RCTCBzdGF0ZTA7CiAKICAgICAgIC8qIExvYWQgbWVyZ2VkIHN0YXRlcyAoZnJvbSBuZXh0IHNlY3Rpb24pICovCi0gICAgICBzdGF0ZTFiID0gc3RhdGVzW2krMV1bczFdOwotICAgICAgc3RhdGUyYiA9IHN0YXRlc1tpKzFdW3MyXTsKKyAgICAgIHN0YXRlMWIgPSBzdGF0ZXNbaSArIDFdW3MxXTsKKyAgICAgIHN0YXRlMmIgPSBzdGF0ZXNbaSArIDFdW3MyXTsKIAotICAgICAgc3RhdGUwID0gaW5wdXQgICsgZk11bHQoc3RhdGUxLCBjb2VmZltCMV0pICsgZk11bHQoc3RhdGUyLCBjb2VmZltCMl0pOwotICAgICAgeSAgICAgID0gc3RhdGUwIC0gZk11bHQoc3RhdGUxYiwgY29lZmZbQTFdKSAtIGZNdWx0KHN0YXRlMmIsIGNvZWZmW0EyXSk7CisgICAgICBzdGF0ZTAgPSBpbnB1dCArIGZNdWx0KHN0YXRlMSwgY29lZmZbQjFdKSArIGZNdWx0KHN0YXRlMiwgY29lZmZbQjJdKTsKKyAgICAgIHkgPSBzdGF0ZTAgLSBmTXVsdChzdGF0ZTFiLCBjb2VmZltBMV0pIC0gZk11bHQoc3RhdGUyYiwgY29lZmZbQTJdKTsKIAogICAgICAgLyogU3RvcmUgbmV3IGZlZWQgZm9yd2FyZCBtZXJnZSBzdGF0ZSAqLwotICAgICAgc3RhdGVzW2krMV1bczJdID0geTw8MTsKKyAgICAgIHN0YXRlc1tpICsgMV1bczJdID0geSA8PCAxOwogICAgICAgLyogU3RvcmUgbmV3IGZlZWQgYmFja3dhcmQgc3RhdGUgKi8KLSAgICAgIHN0YXRlc1tpXVtzMl0gPSBpbnB1dDw8MTsKKyAgICAgIHN0YXRlc1tpXVtzMl0gPSBpbnB1dCA8PCAxOwogCiAgICAgICAvKiBGZWVkYmFjayBvdXRwdXQgdG8gbmV4dCBzZWN0aW9uLiAqLwogICAgICAgaW5wdXQgPSB5OwpAQCAtNDI1LDU3ICs0MDIsMjAgQEAKICAgLyogQXBwbHkgZ2xvYmFsIGdhaW4gKi8KICAgeSA9IGZNdWx0KHksIGRvd25GaWx0ZXItPmdhaW4pOwogCi0jZWxzZSAvKiBEaXJlY3QgZm9ybSBJSSAqLwotCi0gICAgLyogTG9vcCBvdmVyIHNlY3Rpb25zICovCi0gICAgZm9yIChpPTA7IGk8ZG93bkZpbHRlci0+bm9Db2VmZnM7IGkrKykKLSAgICB7Ci0gICAgICBGSVhQX0JRUyBzdGF0ZTEsIHN0YXRlMjsKLSAgICAgIEZJWFBfREJMIHN0YXRlMDsKLQotICAgICAgLyogTG9hZCBzdGF0ZXMgKi8KLSAgICAgIHN0YXRlMSA9IHN0YXRlc1tpXVtzMV07Ci0gICAgICBzdGF0ZTIgPSBzdGF0ZXNbaV1bczJdOwotCi0gICAgICBzdGF0ZTAgPSBpbnB1dCAgLSBmTXVsdChzdGF0ZTEsIGNvZWZmW0ExXSkgLSBmTXVsdChzdGF0ZTIsIGNvZWZmW0EyXSk7Ci0gICAgICB5ID0gc3RhdGUwICAgICAgKyBmTXVsdChzdGF0ZTEsIGNvZWZmW0IxXSkgKyBmTXVsdChzdGF0ZTIsIGNvZWZmW0IyXSk7Ci0gICAgICAvKiBBcHBseSBzY2F0dGVyZWQgZ2FpbiAqLwotICAgICAgeSA9IGZNdWx0KHksIGRvd25GaWx0ZXItPmdhaW4pOwotCi0gICAgICAvKiBTdG9yZSBuZXcgc3RhdGUgaW4gbm9ybWFsaXplZCBmb3JtICovCi0jaWZkZWYgUlNfQklRVUFEX1NUQVRFUzE2Ci0gICAgICAvKiBEbyBub3Qgc2F0dXJhdGUgYW55IHN0YXRlIHZhbHVlICEgVGhlIHJlc3VsdCB3b3VsZCBiZSB1bmFjY2VwdGFibGUuIFJvdW5kaW5nIG1ha2VzIFNOUiBhcm91bmQgMTBkQiBiZXR0ZXIuICovCi0gICAgICBzdGF0ZXNbaV1bczJdID0gKEZJWFBfQlFTKShMT05HKSgoc3RhdGUwICsgKEZJWFBfREJMKSgxPDwoREZSQUNUX0JJVFMtRlJBQ1RfQklUUy0yKSkpID4+IChERlJBQ1RfQklUUy1GUkFDVF9CSVRTLTEpKTsKLSNlbHNlCi0gICAgICBzdGF0ZXNbaV1bczJdID0gc3RhdGUwPDwxOwotI2VuZGlmCi0KLSAgICAgIC8qIEZlZWRiYWNrIG91dHB1dCB0byBuZXh0IHNlY3Rpb24uICovCi0gICAgICBpbnB1dD15OwotCi0gICAgICAvKiBTdGVwIHRvIG5leHQgY29lZiBzZXQgKi8KLSAgICAgIGNvZWZmICs9IEJJUVVBRF9DT0VGU1RFUDsKLSAgICB9Ci0gICAgZG93bkZpbHRlci0+cHRyIF49IDE7Ci0gIH0KLQotI2VuZGlmCi0KICAgLyogQXBwbHkgZmluYWwgZ2Fpbi9zY2FsaW5nIHRvIG91dHB1dCAqLwogI2lmIChTQU1QTEVfQklUUyA9PSAxNikKLSAgb3V0cHV0ID0gKElOVF9QQ00pIFNBVFVSQVRFX1JJR0hUX1NISUZUKHkrKEZJWFBfREJMKSgxPDwoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMtQklRVUFEX1NDQUxFLTEpKSwgREZSQUNUX0JJVFMtU0FNUExFX0JJVFMtQklRVUFEX1NDQUxFLCBTQU1QTEVfQklUUyk7Ci0gIC8vb3V0cHV0ID0gKElOVF9QQ00pIFNBVFVSQVRFX1JJR0hUX1NISUZUKHksIERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLUJJUVVBRF9TQ0FMRSwgU0FNUExFX0JJVFMpOworICBvdXRwdXQgPSAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCgKKyAgICAgIHkgKyAoRklYUF9EQkwpKDEgPDwgKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMgLSBCSVFVQURfU0NBTEUgLSAxKSksCisgICAgICBERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTIC0gQklRVUFEX1NDQUxFLCBTQU1QTEVfQklUUyk7CisgIC8vIG91dHB1dCA9IChJTlRfUENNKSBTQVRVUkFURV9SSUdIVF9TSElGVCh5LAorICAvLyBERlJBQ1RfQklUUy1TQU1QTEVfQklUUy1CSVFVQURfU0NBTEUsIFNBTVBMRV9CSVRTKTsKICNlbHNlCiAgIG91dHB1dCA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoeSwgQklRVUFEX1NDQUxFLCBTQU1QTEVfQklUUyk7CiAjZW5kaWYKIAotCiAgIHJldHVybiBvdXRwdXQ7CiB9CiAKLQotCi0KIC8qIQogICBcYnJpZWYgICBGREthYWNFbmNfRG93bnNhbXBsZSBudW1JblNhbXBsZXMgb2YgdHlwZSBJTlRfUENNCiAgICAgICAgICAgIFJldHVybnMgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIGluIG51bU91dFNhbXBsZXMKQEAgLTQ4MywyNSArNDIzLDIyIEBACiAgIFxyZXR1cm4gIHN1Y2Nlc3Mgb2Ygb3BlcmF0aW9uCiAqLwogCi1JTlQgRkRLYWFjRW5jX0Rvd25zYW1wbGUoRE9XTlNBTVBMRVIgKkRvd25TYW1wbGVyLCAgLyohPCBwb2ludGVyIHRvIGRvd25zYW1wbGVyIGluc3RhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqaW5TYW1wbGVzLCAgICAgICAgLyohPCBwb2ludGVyIHRvIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtSW5TYW1wbGVzLCAgICAgICAgICAvKiE8IG51bWJlciAgb2YgaW5wdXQgc2FtcGxlcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaW5TdHJpZGUsICAgICAgICAgICAgICAvKiE8IGluY3JlbWVudCBvZiBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqb3V0U2FtcGxlcywgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpudW1PdXRTYW1wbGVzLCAgICAgICAgLyohPCBwb2ludGVyIHRwIG51bWJlciBvZiBvdXRwdXQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBvdXRTdHJpZGUgICAgICAgICAgICAgIC8qITwgaW5jcmVtZW50IG9mIG91dHB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIElOVCBpOwotICAgICpudW1PdXRTYW1wbGVzPTA7CitJTlQgRkRLYWFjRW5jX0Rvd25zYW1wbGUoCisgICAgRE9XTlNBTVBMRVIgKkRvd25TYW1wbGVyLCAvKiE8IHBvaW50ZXIgdG8gZG93bnNhbXBsZXIgaW5zdGFuY2UgKi8KKyAgICBJTlRfUENNICppblNhbXBsZXMsICAgICAgIC8qITwgcG9pbnRlciB0byBpbnB1dCBzYW1wbGVzICovCisgICAgSU5UIG51bUluU2FtcGxlcywgICAgICAgICAvKiE8IG51bWJlciAgb2YgaW5wdXQgc2FtcGxlcyAgKi8KKyAgICBJTlRfUENNICpvdXRTYW1wbGVzLCAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgc2FtcGxlcyAqLworICAgIElOVCAqbnVtT3V0U2FtcGxlcyAgICAgICAgLyohPCBwb2ludGVyIHRwIG51bWJlciBvZiBvdXRwdXQgc2FtcGxlcyAqLworKSB7CisgIElOVCBpOworICAqbnVtT3V0U2FtcGxlcyA9IDA7CiAKLSAgICBmb3IoaT0wOyBpPG51bUluU2FtcGxlczsgaSs9RG93blNhbXBsZXItPnJhdGlvKQotICAgIHsKLSAgICAgICpvdXRTYW1wbGVzID0gQWR2YW5jZUZpbHRlcigmKERvd25TYW1wbGVyLT5kb3duRmlsdGVyKSwgJmluU2FtcGxlc1tpKmluU3RyaWRlXSwgRG93blNhbXBsZXItPnJhdGlvLCBpblN0cmlkZSk7Ci0gICAgICBvdXRTYW1wbGVzICs9IG91dFN0cmlkZTsKLSAgICB9Ci0gICAgKm51bU91dFNhbXBsZXMgPSBudW1JblNhbXBsZXMvRG93blNhbXBsZXItPnJhdGlvOworICBmb3IgKGkgPSAwOyBpIDwgbnVtSW5TYW1wbGVzOyBpICs9IERvd25TYW1wbGVyLT5yYXRpbykgeworICAgICpvdXRTYW1wbGVzID0gQWR2YW5jZUZpbHRlcigmKERvd25TYW1wbGVyLT5kb3duRmlsdGVyKSwgJmluU2FtcGxlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG93blNhbXBsZXItPnJhdGlvKTsKKyAgICBvdXRTYW1wbGVzKys7CisgIH0KKyAgKm51bU91dFNhbXBsZXMgPSBudW1JblNhbXBsZXMgLyBEb3duU2FtcGxlci0+cmF0aW87CiAKLSAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvcmVzYW1wbGVyLmggYi9saWJTQlJlbmMvc3JjL3Jlc2FtcGxlci5oCmluZGV4IDAxOTI5NzAuLjdhYTFjYWUgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvcmVzYW1wbGVyLmgKKysrIGIvbGliU0JSZW5jL3NyYy9yZXNhbXBsZXIuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3MyArOTAsNzAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWZuZGVmIF9fUkVTQU1QTEVSX0gKLSNkZWZpbmUgX19SRVNBTVBMRVJfSAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfSAorI2RlZmluZSBSRVNBTVBMRVJfSAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgRml4ZWQgUG9pbnQgUmVzYW1wbGVyIFRvb2wgQm94ICAKKyAgXGJyaWVmICBGaXhlZCBQb2ludCBSZXNhbXBsZXIgVG9vbCBCb3ggJFJldmlzaW9uOiA5Mjc5MCAkCiAqLwogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEJJUVVBRCBGaWx0ZXIgU3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBNQVhOUl9TRUNUSU9OUyAgKDE1KQorI2RlZmluZSBNQVhOUl9TRUNUSU9OUyAoMTUpCiAKLSNpZmRlZiBSU19CSVFVQURfU1RBVEVTMTYKLXR5cGVkZWYgRklYUF9TR0wgRklYUF9CUVM7Ci0jZWxzZQogdHlwZWRlZiBGSVhQX0RCTCBGSVhQX0JRUzsKLSNlbmRpZgogCi10eXBlZGVmIHN0cnVjdAotewotICBGSVhQX0JRUyBzdGF0ZXNbTUFYTlJfU0VDVElPTlMrMV1bMl07ICAgLyohIHN0YXRlIGJ1ZmZlciAqLwotICBjb25zdCBGSVhQX1NHTCAqY29lZmZhOyAgICAgICAgICAgICAgIC8qISBwb2ludGVyIHRvIGZpbHRlciBjb2VmZnMgKi8KLSAgRklYUF9EQkwgZ2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiEgb3ZlcmFsbCBnYWluIGZhY3RvciAqLwotICBpbnQgV2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qISBub3JtYWxpemVkIGN1dG9mZiBmcmVxICogMTAwMCAqLwotICBpbnQgbm9Db2VmZnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qISBudW1iZXIgb2YgZmlsdGVyIGNvZWZmcyBzZXRzICovCi0gIGludCBwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohIGluZGV4IHRvIHJpbmJ1ZmZlcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9CUVMgc3RhdGVzW01BWE5SX1NFQ1RJT05TICsgMV1bMl07IC8qISBzdGF0ZSBidWZmZXIgKi8KKyAgY29uc3QgRklYUF9TR0wgKmNvZWZmYTsgICAgICAgICAgICAgICAgIC8qISBwb2ludGVyIHRvIGZpbHRlciBjb2VmZnMgKi8KKyAgRklYUF9EQkwgZ2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qISBvdmVyYWxsIGdhaW4gZmFjdG9yICovCisgIGludCBXYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiEgbm9ybWFsaXplZCBjdXRvZmYgZnJlcSAqIDEwMDAgKi8KKyAgaW50IG5vQ29lZmZzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qISBudW1iZXIgb2YgZmlsdGVyIGNvZWZmcyBzZXRzICovCisgIGludCBwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiEgaW5kZXggdG8gcmluYnVmZmVycyAqLwogfSBMUF9GSUxURVI7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICBEb3duc2FtcGxlciBTdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmIHN0cnVjdAotewotICBMUF9GSUxURVIgZG93bkZpbHRlcjsgICAgICAgICAgIC8qISBmaWx0ZXIgaW5zdGFuY2UgKi8KLSAgaW50IHJhdGlvOyAgICAgICAgICAgICAgICAgICAgICAvKiEgZG93bnNhbXBsaW5nIHJhdGlvbiAqLwotICBpbnQgZGVsYXk7ICAgICAgICAgICAgICAgICAgICAgIC8qISBkb3duc2FtcGxpbmcgZGVsYXkgKHNvdXJjZSBmcykgICAqLwotICBpbnQgcGVuZGluZzsgICAgICAgICAgICAgICAgICAgIC8qISBudW1iZXIgb2YgcGVuZGluZyBvdXRwdXQgc2FtcGxlcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBMUF9GSUxURVIgZG93bkZpbHRlcjsgLyohIGZpbHRlciBpbnN0YW5jZSAqLworICBpbnQgcmF0aW87ICAgICAgICAgICAgLyohIGRvd25zYW1wbGluZyByYXRpb24gKi8KKyAgaW50IGRlbGF5OyAgICAgICAgICAgIC8qISBkb3duc2FtcGxpbmcgZGVsYXkgKHNvdXJjZSBmcykgICAqLworICBpbnQgcGVuZGluZzsgICAgICAgICAgLyohIG51bWJlciBvZiBwZW5kaW5nIG91dHB1dCBzYW1wbGVzICovCiB9IERPV05TQU1QTEVSOwogCi0KIC8qKgogICogXGJyaWVmIEluaXRpYWxpemVkIGEgZ2l2ZW4gZG93bnNhbXBsZXIgc3RydWN0dXJlLgogICovCi1JTlQgRkRLYWFjRW5jX0luaXREb3duc2FtcGxlcihET1dOU0FNUExFUiAqRG93blNhbXBsZXIsIC8qITwgcG9pbnRlciB0byBkb3duc2FtcGxlciBpbnN0YW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIFdjLCAgICAgICAgICAgICAgICAgICAvKiE8IG5vcm1hbGl6ZWQgY3V0b2ZmIGZyZXEgKiAxMDAwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcmF0aW8pOyAgICAgICAgICAgICAgIC8qITwgZG93bnNhbXBsZXIgcmF0aW8gKi8KK0lOVCBGREthYWNFbmNfSW5pdERvd25zYW1wbGVyKAorICAgIERPV05TQU1QTEVSICpEb3duU2FtcGxlciwgLyohPCBwb2ludGVyIHRvIGRvd25zYW1wbGVyIGluc3RhbmNlICovCisgICAgSU5UIFdjLCAgICAgICAgICAgICAgICAgICAvKiE8IG5vcm1hbGl6ZWQgY3V0b2ZmIGZyZXEgKiAxMDAwICovCisgICAgSU5UIHJhdGlvKTsgICAgICAgICAgICAgICAvKiE8IGRvd25zYW1wbGVyIHJhdGlvICovCiAKIC8qKgotICogXGJyaWVmIERvd25zYW1wbGUgYSBzZXQgb2YgYXVkaW8gc2FtcGxlcy4gbnVtSW5TYW1wbGVzIG11c3QgYmUgYXQgbGVhc3QgZXF1YWwgdG8gdGhlCi0gKiAgICAgICAgZG93bnNhbXBsZXIgcmF0aW8uCisgKiBcYnJpZWYgRG93bnNhbXBsZSBhIHNldCBvZiBhdWRpbyBzYW1wbGVzLiBudW1JblNhbXBsZXMgbXVzdCBiZSBhdCBsZWFzdCBlcXVhbAorICogdG8gdGhlIGRvd25zYW1wbGVyIHJhdGlvLgogICovCi1JTlQgRkRLYWFjRW5jX0Rvd25zYW1wbGUoRE9XTlNBTVBMRVIgKkRvd25TYW1wbGVyLCAgLyohPCBwb2ludGVyIHRvIGRvd25zYW1wbGVyIGluc3RhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqaW5TYW1wbGVzLCAgICAgICAgLyohPCBwb2ludGVyIHRvIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtSW5TYW1wbGVzLCAgICAgICAgICAvKiE8IG51bWJlciAgb2YgaW5wdXQgc2FtcGxlcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaW5TdHJpZGUsICAgICAgICAgICAgICAvKiE8IGluY3JlbWVudCBvZiBpbnB1dCBzYW1wbGVzICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICpvdXRTYW1wbGVzLCAgICAgICAvKiE8IHBvaW50ZXIgdG8gb3V0cHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm51bU91dFNhbXBsZXMsICAgICAgICAvKiE8IHBvaW50ZXIgdHAgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG91dHN0cmlkZSk7ICAgICAgICAgICAgLyohPCBpbmNyZW1lbnQgb2Ygb3V0cHV0IHNhbXBsZXMgKi8KK0lOVCBGREthYWNFbmNfRG93bnNhbXBsZSgKKyAgICBET1dOU0FNUExFUiAqRG93blNhbXBsZXIsIC8qITwgcG9pbnRlciB0byBkb3duc2FtcGxlciBpbnN0YW5jZSAqLworICAgIElOVF9QQ00gKmluU2FtcGxlcywgICAgICAgLyohPCBwb2ludGVyIHRvIGlucHV0IHNhbXBsZXMgKi8KKyAgICBJTlQgbnVtSW5TYW1wbGVzLCAgICAgICAgIC8qITwgbnVtYmVyICBvZiBpbnB1dCBzYW1wbGVzICAqLworICAgIElOVF9QQ00gKm91dFNhbXBsZXMsICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCBzYW1wbGVzICovCisgICAgSU5UICpudW1PdXRTYW1wbGVzKTsgICAgICAvKiE8IHBvaW50ZXIgdHAgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzICovCiAKLQotCi0jZW5kaWYgLyogX19SRVNBTVBMRVJfSCAqLworI2VuZGlmIC8qIFJFU0FNUExFUl9IICovCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Nici5oIGIvbGliU0JSZW5jL3NyYy9zYnIuaAppbmRleCBjNzRhZDJhLi4zNDFkY2FiIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3Nici5oCisrKyBiL2xpYlNCUmVuYy9zcmMvc2JyLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTUgKzkwLDIzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgTWFpbiBTQlIgc3RydWN0cyBkZWZpbml0aW9ucyAgCisgIFxicmllZiAgTWFpbiBTQlIgc3RydWN0cyBkZWZpbml0aW9ucyAkUmV2aXNpb246IDkyNzkwICQKICovCiAKLSNpZm5kZWYgX19TQlJfSAotI2RlZmluZSBfX1NCUl9ICisjaWZuZGVmIFNCUl9ICisjZGVmaW5lIFNCUl9ICiAKICNpbmNsdWRlICJmcmFtX2dlbi5oIgogI2luY2x1ZGUgImJpdF9zYnIuaCIKQEAgLTEwMSw2NiArMTIwLDc1IEBACiAKICNpbmNsdWRlICJ0b25fY29yci5oIgogCi0KIC8qIFNCUiBiaXRzdHJlYW0gZGVsYXkgKi8KLSAgI2RlZmluZSBERUxBWV9GUkFNRVMgMgorI2RlZmluZSBNQVhfREVMQVlfRlJBTUVTIDIKIAorLyogc2JyIGVuY29kZXIgZG93bnNhbXBsaW5nIHR5cGUgKi8KK3R5cGVkZWYgZW51bSB7IFNCUkVOQ19EU19OT05FLCBTQlJFTkNfRFNfVElNRSwgU0JSRU5DX0RTX1FNRiB9IFNCUkVOQ19EU19UWVBFOwogCiB0eXBlZGVmIHN0cnVjdCBTQlJfQ0hBTk5FTCB7Ci0gICAgc3RydWN0IEVOVl9DSEFOTkVMICAgICAgICBoRW52Q2hhbm5lbDsKLSAgICAvL0lOVF9QQ00gICAgICAgICAgICAgICAgICAqcERTT3V0QnVmZmVyOyAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byBkb3duc2FtcGxlZCBhdWRpbyBvdXRwdXQgb2YgU0JSIGVuY29kZXIgKi8KLSAgICBET1dOU0FNUExFUiAgICAgICAgICAgICAgIGRvd25TYW1wbGVyOworICBzdHJ1Y3QgRU5WX0NIQU5ORUwgaEVudkNoYW5uZWw7CisgIC8vIElOVF9QQ00gICAgICAgICAgICAgICAgICAqcERTT3V0QnVmZmVyOyAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0bworICAvLyBkb3duc2FtcGxlZCBhdWRpbyBvdXRwdXQgb2YgU0JSIGVuY29kZXIgKi8KKyAgRE9XTlNBTVBMRVIgZG93blNhbXBsZXI7CiAKIH0gU0JSX0NIQU5ORUw7CiB0eXBlZGVmIFNCUl9DSEFOTkVMKiBIQU5ETEVfU0JSX0NIQU5ORUw7CiAKIHR5cGVkZWYgc3RydWN0IFNCUl9FTEVNRU5UIHsKLSAgICBIQU5ETEVfU0JSX0NIQU5ORUwgICAgICAgIHNickNoYW5uZWxbMl07Ci0gICAgUU1GX0ZJTFRFUl9CQU5LICAgICAgICAgICpoUW1mQW5hbHlzaXNbMl07Ci0gICAgU0JSX0NPTkZJR19EQVRBICAgICAgICAgICBzYnJDb25maWdEYXRhOwotICAgIFNCUl9IRUFERVJfREFUQSAgICAgICAgICAgc2JySGVhZGVyRGF0YTsKLSAgICBTQlJfQklUU1RSRUFNX0RBVEEgICAgICAgIHNickJpdHN0cmVhbURhdGE7Ci0gICAgQ09NTU9OX0RBVEEgICAgICAgICAgICAgICBDbW9uRGF0YTsKLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIGR5blhPdmVyRnJlcURlbGF5WzVdOyAgICAvKio8IHRvIGRlbGF5IGEgZnJhbWUgKEkgZG9uJ3QgbGlrZSBpdCB0aGF0IG11Y2ggdGhhdCB3YXkgLSBocmMpICovCi0gICAgU0JSX0VMRU1FTlRfSU5GTyAgICAgICAgICBlbEluZm87CisgIEhBTkRMRV9TQlJfQ0hBTk5FTCBzYnJDaGFubmVsWzJdOworICBRTUZfRklMVEVSX0JBTksqIGhRbWZBbmFseXNpc1syXTsKKyAgU0JSX0NPTkZJR19EQVRBIHNickNvbmZpZ0RhdGE7CisgIFNCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhOworICBTQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YTsKKyAgQ09NTU9OX0RBVEEgQ21vbkRhdGE7CisgIElOVCBkeW5YT3ZlckZyZXFEZWxheVs1XTsgLyoqPCB0byBkZWxheSBhIGZyYW1lIChJIGRvbid0IGxpa2UgaXQgdGhhdCBtdWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3YXkgLSBocmMpICovCisgIFNCUl9FTEVNRU5UX0lORk8gZWxJbmZvOwogCi0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkRGVsYXlMaW5lWzErREVMQVlfRlJBTUVTXVtNQVhfUEFZTE9BRF9TSVpFXTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWREZWxheUxpbmVTaXplWzErREVMQVlfRlJBTUVTXTsgICAgICAgICAgICAgICAgIC8qIFNpemVzIGluIGJpdHMgKi8KKyAgVUNIQVIgcGF5bG9hZERlbGF5TGluZVsxICsgTUFYX0RFTEFZX0ZSQU1FU11bTUFYX1BBWUxPQURfU0laRV07CisgIFVJTlQgcGF5bG9hZERlbGF5TGluZVNpemVbMSArIE1BWF9ERUxBWV9GUkFNRVNdOyAvKiBTaXplcyBpbiBiaXRzICovCiAKIH0gU0JSX0VMRU1FTlQsICpIQU5ETEVfU0JSX0VMRU1FTlQ7CiAKLXR5cGVkZWYgc3RydWN0IFNCUl9FTkNPREVSCi17Ci0gIEhBTkRMRV9TQlJfRUxFTUVOVCAgIHNickVsZW1lbnRbKDgpXTsKLSAgSEFORExFX1NCUl9DSEFOTkVMICAgcFNickNoYW5uZWxbKDgpXTsKLSAgUU1GX0ZJTFRFUl9CQU5LICAgICAgUW1mQW5hbHlzaXNbKDgpXTsKLSAgRE9XTlNBTVBMRVIgICAgICAgICAgbGZlRG93blNhbXBsZXI7Ci0gIGludCAgICAgICAgICAgICAgICAgIGxmZUNoSWR4OyAgICAgICAgICAgICAgICAgLyogLTEgZGVmYXVsdCBmb3Igbm8gbGZlLCBlbHNlIGFzc2lnbiBjaGFubmVsIGluZGV4ICovCi0gIGludCAgICAgICAgICAgICAgICAgIG5vRWxlbWVudHM7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzICovCi0gIGludCAgICAgICAgICAgICAgICAgIG5DaGFubmVsczsgICAgICAgICAgICAgICAgLyogVG90YWwgY2hhbm5lbCBjb3VudCBhY3Jvc3MgYWxsIGVsZW1lbnRzLiAqLwotICBpbnQgICAgICAgICAgICAgICAgICBmcmFtZVNpemU7ICAgICAgICAgICAgICAgIC8qIFNCUiBmcmFtZWxlbmd0aC4gKi8KLSAgaW50ICAgICAgICAgICAgICAgICAgYnVmZmVyT2Zmc2V0OyAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIFNCUiBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBpbiB0aW1lIGRvbWFpbiBpbnB1dCBidWZmZXIuICovCi0gIGludCAgICAgICAgICAgICAgICAgIGRvd25zYW1wbGVkT2Zmc2V0OyAgICAgICAgLyogT2Zmc2V0IG9mIGRvd25zYW1wbGVkL21peGVkIG91dHB1dCBmb3IgY29yZSBlbmNvZGVyLiAqLwotICBpbnQgICAgICAgICAgICAgICAgICBkb3dubWl4U2l6ZTsgICAgICAgICAgICAgIC8qIFNpemUgaW4gc2FtcGxlcyBvZiBkb3duc2FtcGxlZC9taXhlZCBvdXRwdXQgZm9yIGNvcmUgZW5jb2Rlci4gKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgZG93blNhbXBsZUZhY3RvcjsgICAgICAgICAvKiBTYW1wbGluZyByYXRlIHJlbGF0aW9uIGJldHdlZW4gdGhlIFNCUiBhbmQgdGhlIGNvcmUgZW5jb2Rlci4gKi8KLSAgaW50ICAgICAgICAgICAgICAgICAgZlRpbWVEb21haW5Eb3duc2FtcGxpbmc7ICAvKiBGbGFnIHNpZ25hbGxpbmcgdGltZSBkb21haW4gZG93bnNhbXBsaW5nIGluc3RlYWQgb2YgUU1GIGRvd25zYW1wbGluZy4gKi8KLSAgaW50ICAgICAgICAgICAgICAgICAgbkJpdHN0ckRlbGF5OyAgICAgICAgICAgICAvKiBBbW91bnQgb2YgU0JSIGZyYW1lcyB0byBiZSBkZWxheWVkIGluIGJpdHN0cmVhbSBkb21haW4uICovCi0gIElOVCAgICAgICAgICAgICAgICAgIGVzdGltYXRlQml0cmF0ZTsgICAgICAgICAgLyogZXN0aW1hdGUgYml0cmF0ZSBvZiBTQlIgZW5jb2RlciAqLwotICBJTlQgICAgICAgICAgICAgICAgICBpbnB1dERhdGFEZWxheTsgICAgICAgICAgIC8qIGRlbGF5IGNhdXNlZCBieSBkb3duc2FtcGxlciwgaW4vb3V0IGJ1ZmZlciBhdCBzYnJFbmNvZGVyX0VuY29kZUZyYW1lICovCit0eXBlZGVmIHN0cnVjdCBTQlJfRU5DT0RFUiB7CisgIEhBTkRMRV9TQlJfRUxFTUVOVCBzYnJFbGVtZW50Wyg4KV07CisgIEhBTkRMRV9TQlJfQ0hBTk5FTCBwU2JyQ2hhbm5lbFsoOCldOworICBRTUZfRklMVEVSX0JBTksgUW1mQW5hbHlzaXNbKDgpXTsKKyAgRE9XTlNBTVBMRVIgbGZlRG93blNhbXBsZXI7CisgIGludCBsZmVDaElkeDsgICAgIC8qIC0xIGRlZmF1bHQgZm9yIG5vIGxmZSwgZWxzZSBhc3NpZ24gY2hhbm5lbCBpbmRleC4gKi8KKyAgaW50IG5vRWxlbWVudHM7ICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzLiAqLworICBpbnQgbkNoYW5uZWxzOyAgICAvKiBUb3RhbCBjaGFubmVsIGNvdW50IGFjcm9zcyBhbGwgZWxlbWVudHMuICovCisgIGludCBmcmFtZVNpemU7ICAgIC8qIFNCUiBmcmFtZWxlbmd0aC4gKi8KKyAgaW50IGJ1ZmZlck9mZnNldDsgLyogT2Zmc2V0IGZvciBTQlIgcGFyYW1ldGVyIGV4dHJhY3Rpb24gaW4gdGltZSBkb21haW4gaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLiAqLworICBpbnQgZG93bnNhbXBsZWRPZmZzZXQ7IC8qIE9mZnNldCBvZiBkb3duc2FtcGxlZC9taXhlZCBvdXRwdXQgZm9yIGNvcmUgZW5jb2Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGRvd25taXhTaXplOyAgICAgICAvKiBTaXplIGluIHNhbXBsZXMgb2YgZG93bnNhbXBsZWQvbWl4ZWQgb3V0cHV0IGZvciBjb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci4gKi8KKyAgSU5UIGRvd25TYW1wbGVGYWN0b3I7ICAvKiBTYW1wbGluZyByYXRlIHJlbGF0aW9uIGJldHdlZW4gdGhlIFNCUiBhbmQgdGhlIGNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLiAqLworICBTQlJFTkNfRFNfVFlQRQorICBkb3duc2FtcGxpbmdNZXRob2Q7IC8qIE1ldGhvZCBvZiBkb3duc21hcGxpbmcsIHRpbWUtZG9tYWluLCBRTUYgb3Igbm9uZS4KKyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IG5CaXRzdHJEZWxheTsgICAvKiBBbW91bnQgb2YgU0JSIGZyYW1lcyB0byBiZSBkZWxheWVkIGluIGJpdHN0cmVhbSBkb21haW4uCisgICAgICAgICAgICAgICAgICAgICAgICovCisgIGludCBzYnJEZWNEZWxheTsgICAgLyogU0JSIGRlY29kZXIgZGVsYXkgaW4gc2FtcGxlcyAqLworICBJTlQgZXN0aW1hdGVCaXRyYXRlOyAvKiBFc3RpbWF0ZSBiaXRyYXRlIG9mIFNCUiBlbmNvZGVyLiAqLworICBJTlQgaW5wdXREYXRhRGVsYXk7ICAvKiBEZWxheSBjYXVzZWQgYnkgZG93bnNhbXBsZXIsIGluL291dCBidWZmZXIgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW5jb2Rlcl9FbmNvZGVGcmFtZS4gKi8KIAogICBVQ0hBUiogZHluYW1pY1JhbTsKICAgVUNIQVIqIHBTQlJkeW5hbWljX1JBTTsKIAotICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvOwotICBRTUZfRklMVEVSX0JBTksgICAgICAgICAgIHFtZlN5bnRoZXNpc1BTOworICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW87CisgIFFNRl9GSUxURVJfQkFOSyBxbWZTeW50aGVzaXNQUzsKIAogICAvKiBwYXJhbWV0ZXJzIGRlc2NyaWJpbmcgYWxsb2NhdGlvbiB2b2x1bWUgb2YgcHJlc2VudCBpbnN0YW5jZSAqLwotICBJTlQgICAgICAgICAgICAgICAgICBtYXhFbGVtZW50czsKLSAgSU5UICAgICAgICAgICAgICAgICAgbWF4Q2hhbm5lbHM7Ci0gIElOVCAgICAgICAgICAgICAgICAgIHN1cHBvcnRQUzsKLQorICBJTlQgbWF4RWxlbWVudHM7CisgIElOVCBtYXhDaGFubmVsczsKKyAgSU5UIHN1cHBvcnRQUzsKIAogfSBTQlJfRU5DT0RFUjsKIAotCi0jZW5kaWYgLyogX19TQlJfSCAqLworI2VuZGlmIC8qIFNCUl9IICovCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Nicl9kZWYuaCBiL2xpYlNCUmVuYy9zcmMvc2JyX2RlZi5oCmluZGV4IDg1YWM1ODcuLjUzZWJhNzEgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvc2JyX2RlZi5oCisrKyBiL2xpYlNCUmVuYy9zcmMvc2JyX2RlZi5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIxICs5MCwyOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIFNCUiBtYWluIGRlZmluaXRpb25zICAKKyAgXGJyaWVmICBTQlIgbWFpbiBkZWZpbml0aW9ucyAkUmV2aXNpb246IDkyNzkwICQKICovCi0jaWZuZGVmIF9fU0JSX0RFRl9ICi0jZGVmaW5lIF9fU0JSX0RFRl9ICisjaWZuZGVmIFNCUl9ERUZfSAorI2RlZmluZSBTQlJfREVGX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogI2RlZmluZSBub0Vycm9yIDAKICNkZWZpbmUgSEFORExFX0VSUk9SX0lORk8gSU5UCi0jZGVmaW5lIEVSUk9SKGEsYikgMQotI2RlZmluZSBoYW5kQmFjaworI2RlZmluZSBFUlJPUihhLCBiKSAxCiAKIC8qICNkZWZpbmUgU0JSX0VOVl9TVEFUSVNUSUNTX0JJVFJBVEUgKi8KICN1bmRlZiBTQlJfRU5WX1NUQVRJU1RJQ1NfQklUUkFURQpAQCAtMTA0LDE3MiArMTIyLDE1NSBAQAogLyogI2RlZmluZSBTQlJfUEFZTE9BRF9NT05JVE9SICovCiAjdW5kZWYgU0JSX1BBWUxPQURfTU9OSVRPUgogCi0jZGVmaW5lIFNXQVAoYSxiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wcj1hLCBhPWIsIGI9dGVtcHIKLSNkZWZpbmUgVFJVRSAgMQorI2RlZmluZSBTV0FQKGEsIGIpIHRlbXByID0gYSwgYSA9IGIsIGIgPSB0ZW1wcgorI2RlZmluZSBUUlVFIDEKICNkZWZpbmUgRkFMU0UgMAogCi0KIC8qIENvbnN0YW50cyAqLwotI2RlZmluZSBFUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWUtMTIKLSNkZWZpbmUgTE9HMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjkzMTQ3MTgwNTZmICAvKiBuYXR1cmFsIGxvZ2FyaXRobSBvZiAyICovCi0jZGVmaW5lIElMT0cyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ0MjY5NTA0MWYgICAgLyogMS9MT0cyICovCi0jZGVmaW5lIFJFTEFYQVRJT05fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAoMWUtNmYpCi0jZGVmaW5lIFJFTEFYQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoUkVMQVhBVElPTl9GTE9BVCkpCi0jZGVmaW5lIFJFTEFYQVRJT05fRlJBQ1QgICAgICAgICAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoMC41MjQyODhmKSkgICAgIC8qIDAuNTI0Mjg4ZiBpcyBmcmFjdGlvbmFsIHBhcnQgb2YgUkVMQVhBVElPTiAqLwotI2RlZmluZSBSRUxBWEFUSU9OX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgKDE5KQotI2RlZmluZSBSRUxBWEFUSU9OX0xENjQgICAgICAgICAgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKDAuMzExNDMwNzU4ODlmKSkvKiAobGQ2NChSRUxBWEFUSU9OKSAqLworI2RlZmluZSBFUFMgMWUtMTIKKyNkZWZpbmUgTE9HMiAwLjY5MzE0NzE4MDU2ZiAvKiBuYXR1cmFsIGxvZ2FyaXRobSBvZiAyICovCisjZGVmaW5lIElMT0cyIDEuNDQyNjk1MDQxZiAgLyogMS9MT0cyICovCisjZGVmaW5lIFJFTEFYQVRJT05fRkxPQVQgKDFlLTZmKQorI2RlZmluZSBSRUxBWEFUSU9OIChGTDJGWENPTlNUX0RCTChSRUxBWEFUSU9OX0ZMT0FUKSkKKyNkZWZpbmUgUkVMQVhBVElPTl9GUkFDVCBcCisgIChGTDJGWENPTlNUX0RCTCgwLjUyNDI4OGYpKSAvKiAwLjUyNDI4OGYgaXMgZnJhY3Rpb25hbCBwYXJ0IG9mIFJFTEFYQVRJT04gKi8KKyNkZWZpbmUgUkVMQVhBVElPTl9TSElGVCAoMTkpCisjZGVmaW5lIFJFTEFYQVRJT05fTEQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEZMMkZYQ09OU1RfREJMKDAuMzExNDMwNzU4ODlmKSkgLyogKGxkNjQoUkVMQVhBVElPTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogLyoqKioqKioqKioqKiAgRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqLwotI2RlZmluZSBTQlJfQ09NUF9NT0RFX0RFTFRBICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTQlJfQ09NUF9NT0RFX0NUUyAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTQlJfTUFYX0VORVJHWV9WQUxVRVMgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBTQlJfR0xPQkFMX1RPTkFMSVRZX1ZBTFVFUyAgICAgICAgICAgICAgMgorI2RlZmluZSBTQlJfQ09NUF9NT0RFX0RFTFRBIDAKKyNkZWZpbmUgU0JSX0NPTVBfTU9ERV9DVFMgMQorI2RlZmluZSBTQlJfTUFYX0VORVJHWV9WQUxVRVMgNQorI2RlZmluZSBTQlJfR0xPQkFMX1RPTkFMSVRZX1ZBTFVFUyAyCiAKLSNkZWZpbmUgTUFYX05VTV9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX05VTV9DSEFOTkVMUyAyCiAKLSNkZWZpbmUgTUFYX05PSVNFX0VOVkVMT1BFUyAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUFYX05VTV9OT0lTRV9DT0VGRlMgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgTUFYX05VTV9OT0lTRV9WQUxVRVMgICAgICAgICAgICAgICAgICAgIChNQVhfTlVNX05PSVNFX0NPRUZGUypNQVhfTk9JU0VfRU5WRUxPUEVTKQorI2RlZmluZSBNQVhfTk9JU0VfRU5WRUxPUEVTIDIKKyNkZWZpbmUgTUFYX05VTV9OT0lTRV9DT0VGRlMgNQorI2RlZmluZSBNQVhfTlVNX05PSVNFX1ZBTFVFUyAoTUFYX05VTV9OT0lTRV9DT0VGRlMgKiBNQVhfTk9JU0VfRU5WRUxPUEVTKQogCi0jZGVmaW5lIE1BWF9OVU1fRU5WRUxPUEVfVkFMVUVTICAgICAgICAgICAgICAgICAoTUFYX0VOVkVMT1BFUyAqIE1BWF9GUkVRX0NPRUZGUykKLSNkZWZpbmUgTUFYX0VOVkVMT1BFUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTICAgICAgICAgICAgICAgICAgICAgICAgIDQ4CisjZGVmaW5lIE1BWF9OVU1fRU5WRUxPUEVfVkFMVUVTIChNQVhfRU5WRUxPUEVTICogTUFYX0ZSRVFfQ09FRkZTKQorI2RlZmluZSBNQVhfRU5WRUxPUEVTIDUKKyNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTIDQ4CiAKLSNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTX0ZTNDQxMDAgICAgICAgICAgICAgICAgIDM1Ci0jZGVmaW5lIE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBNQVhfRlJFUV9DT0VGRlNfRlM0NDEwMCAzNQorI2RlZmluZSBNQVhfRlJFUV9DT0VGRlNfRlM0ODAwMCAzMgogCisjZGVmaW5lIE5PX09GX0VTVElNQVRFU19MQyA0CisjZGVmaW5lIE5PX09GX0VTVElNQVRFU19MRCAzCisjZGVmaW5lIE1BWF9OT19PRl9FU1RJTUFURVMgNAogCi0jZGVmaW5lIFFNRl9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NAotI2RlZmluZSBRTUZfRklMVEVSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICA2NDAKLSNkZWZpbmUgUU1GX01BWF9USU1FX1NMT1RTICAgICAgICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIE5PX09GX0VTVElNQVRFU19MQyAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIE5PX09GX0VTVElNQVRFU19MRCAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE1BWF9OT19PRl9FU1RJTUFURVMgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5PSVNFX0ZMT09SX09GRlNFVCA2CisjZGVmaW5lIE5PSVNFX0ZMT09SX09GRlNFVF82NCAoRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpKQogCisjZGVmaW5lIExPV19SRVMgMAorI2RlZmluZSBISUdIX1JFUyAxCiAKLSNkZWZpbmUgTk9JU0VfRkxPT1JfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgTk9JU0VfRkxPT1JfT0ZGU0VUXzY0ICAgICAgICAgICAgICAgICAgIChGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZikpCisjZGVmaW5lIExPIDAKKyNkZWZpbmUgSEkgMQogCi0jZGVmaW5lIExPV19SRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEhJR0hfUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExFTkdUSF9TQlJfRlJBTUVfSU5GTyAzNSAvKiAxOSAqLwogCi0jZGVmaW5lIExPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEhJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNCUl9OU0ZCX0xPV19SRVMgOSAgIC8qICA4ICovCisjZGVmaW5lIFNCUl9OU0ZCX0hJR0hfUkVTIDE4IC8qIDE2ICovCiAKLSNkZWZpbmUgTEVOR1RIX1NCUl9GUkFNRV9JTkZPICAgICAgICAgICAgICAgICAgIDM1ICAgICAgLyogMTkgKi8KKyNkZWZpbmUgU0JSX1hQT1NfQ1RSTF9ERUZBVUxUIDIKIAotI2RlZmluZSBTQlJfTlNGQl9MT1dfUkVTICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgICAvKiAgOCAqLwotI2RlZmluZSBTQlJfTlNGQl9ISUdIX1JFUyAgICAgICAgICAgICAgICAgICAgICAgMTggICAgICAvKiAxNiAqLworI2RlZmluZSBTQlJfRlJFUV9TQ0FMRV9ERUZBVUxUIDIKKyNkZWZpbmUgU0JSX0FMVEVSX1NDQUxFX0RFRkFVTFQgMQorI2RlZmluZSBTQlJfTk9JU0VfQkFORFNfREVGQVVMVCAyCiAKLQotI2RlZmluZSBTQlJfWFBPU19DVFJMX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgMgotCi0jZGVmaW5lIFNCUl9GUkVRX1NDQUxFX0RFRkFVTFQgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFNCUl9BTFRFUl9TQ0FMRV9ERUZBVUxUICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNCUl9OT0lTRV9CQU5EU19ERUZBVUxUICAgICAgICAgICAgICAgICAyCi0KLSNkZWZpbmUgU0JSX0xJTUlURVJfQkFORFNfREVGQVVMVCAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgU0JSX0xJTUlURVJfR0FJTlNfREVGQVVMVCAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgU0JSX0xJTUlURVJfR0FJTlNfSU5GSU5JVEUgICAgICAgICAgICAgIDMKLSNkZWZpbmUgU0JSX0lOVEVSUE9MX0ZSRVFfREVGQVVMVCAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU0JSX1NNT09USElOR19MRU5HVEhfREVGQVVMVCAgICAgICAgICAgIDAKLQorI2RlZmluZSBTQlJfTElNSVRFUl9CQU5EU19ERUZBVUxUIDIKKyNkZWZpbmUgU0JSX0xJTUlURVJfR0FJTlNfREVGQVVMVCAyCisjZGVmaW5lIFNCUl9MSU1JVEVSX0dBSU5TX0lORklOSVRFIDMKKyNkZWZpbmUgU0JSX0lOVEVSUE9MX0ZSRVFfREVGQVVMVCAxCisjZGVmaW5lIFNCUl9TTU9PVEhJTkdfTEVOR1RIX0RFRkFVTFQgMAogCiAvKiBzYnJfaGVhZGVyICovCi0jZGVmaW5lIFNJX1NCUl9BTVBfUkVTX0JJVFMgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNJX1NCUl9DT1VQTElOR19CSVRTICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNJX1NCUl9TVEFSVF9GUkVRX0JJVFMgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNJX1NCUl9TVE9QX0ZSRVFfQklUUyAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNJX1NCUl9YT1ZFUl9CQU5EX0JJVFMgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFNJX1NCUl9SRVNFUlZFRF9CSVRTICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFNJX1NCUl9EQVRBX0VYVFJBX0JJVFMgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNJX1NCUl9IRUFERVJfRVhUUkFfMV9CSVRTICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNJX1NCUl9IRUFERVJfRVhUUkFfMl9CSVRTICAgICAgICAgICAgICAxCisjZGVmaW5lIFNJX1NCUl9BTVBfUkVTX0JJVFMgMQorI2RlZmluZSBTSV9TQlJfQ09VUExJTkdfQklUUyAxCisjZGVmaW5lIFNJX1NCUl9TVEFSVF9GUkVRX0JJVFMgNAorI2RlZmluZSBTSV9TQlJfU1RPUF9GUkVRX0JJVFMgNAorI2RlZmluZSBTSV9TQlJfWE9WRVJfQkFORF9CSVRTIDMKKyNkZWZpbmUgU0lfU0JSX1JFU0VSVkVEX0JJVFMgMgorI2RlZmluZSBTSV9TQlJfREFUQV9FWFRSQV9CSVRTIDEKKyNkZWZpbmUgU0lfU0JSX0hFQURFUl9FWFRSQV8xX0JJVFMgMQorI2RlZmluZSBTSV9TQlJfSEVBREVSX0VYVFJBXzJfQklUUyAxCiAKIC8qIHNicl9oZWFkZXIgZXh0cmEgMSAqLwotI2RlZmluZSBTSV9TQlJfRlJFUV9TQ0FMRV9CSVRTICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBTSV9TQlJfQUxURVJfU0NBTEVfQklUUyAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTSV9TQlJfTk9JU0VfQkFORFNfQklUUyAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTSV9TQlJfRlJFUV9TQ0FMRV9CSVRTIDIKKyNkZWZpbmUgU0lfU0JSX0FMVEVSX1NDQUxFX0JJVFMgMQorI2RlZmluZSBTSV9TQlJfTk9JU0VfQkFORFNfQklUUyAyCiAKIC8qIHNicl9oZWFkZXIgZXh0cmEgMiAqLwotI2RlZmluZSBTSV9TQlJfTElNSVRFUl9CQU5EU19CSVRTICAgICAgICAgICAgICAgMgotI2RlZmluZSBTSV9TQlJfTElNSVRFUl9HQUlOU19CSVRTICAgICAgICAgICAgICAgMgotI2RlZmluZSBTSV9TQlJfSU5URVJQT0xfRlJFUV9CSVRTICAgICAgICAgICAgICAgMQotI2RlZmluZSBTSV9TQlJfU01PT1RISU5HX0xFTkdUSF9CSVRTICAgICAgICAgICAgMQorI2RlZmluZSBTSV9TQlJfTElNSVRFUl9CQU5EU19CSVRTIDIKKyNkZWZpbmUgU0lfU0JSX0xJTUlURVJfR0FJTlNfQklUUyAyCisjZGVmaW5lIFNJX1NCUl9JTlRFUlBPTF9GUkVRX0JJVFMgMQorI2RlZmluZSBTSV9TQlJfU01PT1RISU5HX0xFTkdUSF9CSVRTIDEKIAogLyogc2JyX2dyaWQgKi8KLSNkZWZpbmUgU0JSX0NMQV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAvKiE8IHNpemUgb2YgYnNfZnJhbWVfY2xhc3MgKi8KLSNkZWZpbmUgU0JSX0NMQV9CSVRTX0xEICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAvKiE8IHNpemUgb2YgYnNfZnJhbWVfY2xhc3MgKi8KLSNkZWZpbmUgU0JSX0VOVl9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAvKiE8IHNpemUgb2YgYnNfbnVtX2Vudl9yYXcgKi8KLSNkZWZpbmUgU0JSX0FCU19CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAvKiE8IHNpemUgb2YgYnNfYWJzX2JvcmRfcmF3IGZvciBIRS1BQUMgKi8KLSNkZWZpbmUgU0JSX05VTV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAvKiE8IHNpemUgb2YgYnNfbnVtX3JlbCAqLwotI2RlZmluZSBTQlJfUkVMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgIC8qITwgc2l6ZSBvZiBic19yZWxfYm9yZF9yYXcgKi8KLSNkZWZpbmUgU0JSX1JFU19CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAvKiE8IHNpemUgb2YgYnNfZnJlcV9yZXNfZmxhZyAqLwotI2RlZmluZSBTQlJfRElSX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgIC8qITwgc2l6ZSBvZiBic19kZl9mbGFnICovCi0KKyNkZWZpbmUgU0JSX0NMQV9CSVRTIDIgICAgLyohPCBzaXplIG9mIGJzX2ZyYW1lX2NsYXNzICovCisjZGVmaW5lIFNCUl9DTEFfQklUU19MRCAxIC8qITwgc2l6ZSBvZiBic19mcmFtZV9jbGFzcyAqLworI2RlZmluZSBTQlJfRU5WX0JJVFMgMiAgICAvKiE8IHNpemUgb2YgYnNfbnVtX2Vudl9yYXcgKi8KKyNkZWZpbmUgU0JSX0FCU19CSVRTIDIgICAgLyohPCBzaXplIG9mIGJzX2Fic19ib3JkX3JhdyBmb3IgSEUtQUFDICovCisjZGVmaW5lIFNCUl9OVU1fQklUUyAyICAgIC8qITwgc2l6ZSBvZiBic19udW1fcmVsICovCisjZGVmaW5lIFNCUl9SRUxfQklUUyAyICAgIC8qITwgc2l6ZSBvZiBic19yZWxfYm9yZF9yYXcgKi8KKyNkZWZpbmUgU0JSX1JFU19CSVRTIDEgICAgLyohPCBzaXplIG9mIGJzX2ZyZXFfcmVzX2ZsYWcgKi8KKyNkZWZpbmUgU0JSX0RJUl9CSVRTIDEgICAgLyohPCBzaXplIG9mIGJzX2RmX2ZsYWcgKi8KIAogLyogc2JyX2RhdGEgKi8KLSNkZWZpbmUgU0lfU0JSX0lOVkZfTU9ERV9CSVRTICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU0lfU0JSX0lOVkZfTU9ERV9CSVRTIDIKIAotCi0jZGVmaW5lIFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzNfMCAgICAgICAgICAgNgotI2RlZmluZSBTSV9TQlJfU1RBUlRfRU5WX0JJVFNfQkFMQU5DRV9BTVBfUkVTXzNfMCAgIDUKLSNkZWZpbmUgU0lfU0JSX1NUQVJUX05PSVNFX0JJVFNfQU1QX1JFU18zXzAgICAgICAgICA1CisjZGVmaW5lIFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzNfMCA2CisjZGVmaW5lIFNJX1NCUl9TVEFSVF9FTlZfQklUU19CQUxBTkNFX0FNUF9SRVNfM18wIDUKKyNkZWZpbmUgU0lfU0JSX1NUQVJUX05PSVNFX0JJVFNfQU1QX1JFU18zXzAgNQogI2RlZmluZSBTSV9TQlJfU1RBUlRfTk9JU0VfQklUU19CQUxBTkNFX0FNUF9SRVNfM18wIDUKIAotI2RlZmluZSBTSV9TQlJfU1RBUlRfRU5WX0JJVFNfQU1QX1JFU18xXzUgICAgICAgICAgIDcKLSNkZWZpbmUgU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0JBTEFOQ0VfQU1QX1JFU18xXzUgICA2CisjZGVmaW5lIFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzFfNSA3CisjZGVmaW5lIFNJX1NCUl9TVEFSVF9FTlZfQklUU19CQUxBTkNFX0FNUF9SRVNfMV81IDYKIAorI2RlZmluZSBTSV9TQlJfRVhURU5ERURfREFUQV9CSVRTIDEKKyNkZWZpbmUgU0lfU0JSX0VYVEVOU0lPTl9TSVpFX0JJVFMgNAorI2RlZmluZSBTSV9TQlJfRVhURU5TSU9OX0VTQ19DT1VOVF9CSVRTIDgKKyNkZWZpbmUgU0lfU0JSX0VYVEVOU0lPTl9JRF9CSVRTIDIKIAotI2RlZmluZSBTSV9TQlJfRVhURU5ERURfREFUQV9CSVRTICAgICAgICAgICAgICAgMQotI2RlZmluZSBTSV9TQlJfRVhURU5TSU9OX1NJWkVfQklUUyAgICAgICAgICAgICAgNAotI2RlZmluZSBTSV9TQlJfRVhURU5TSU9OX0VTQ19DT1VOVF9CSVRTICAgICAgICAgOAotI2RlZmluZSBTSV9TQlJfRVhURU5TSU9OX0lEX0JJVFMgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTQlJfRVhURU5ERURfREFUQV9NQVhfQ05UICgxNSArIDI1NSkKIAotI2RlZmluZSBTQlJfRVhURU5ERURfREFUQV9NQVhfQ05UICAgICAgICAgICAgICAgKDE1KzI1NSkKLQotI2RlZmluZSBFWFRFTlNJT05fSURfUFNfQ09ESU5HICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBFWFRFTlNJT05fSURfUFNfQ09ESU5HIDIKIAogLyogRW52ZWxvcGUgY29kaW5nIGNvbnN0YW50cyAqLwotI2RlZmluZSBGUkVRICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgVElNRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZSRVEgMAorI2RlZmluZSBUSU1FIDEKIAogLyogcW1mIGRhdGEgc2NhbGluZyAqLwotI2RlZmluZSBRTUZfU0NBTEVfT0ZGU0VUICAgICAgICAgIDcKKyNkZWZpbmUgUU1GX1NDQUxFX09GRlNFVCA3CiAKIC8qIGh1ZmZtYW4gdGFibGVzICovCi0jZGVmaW5lIENPREVfQk9PS19TQ0ZfTEFWMDAgICAgICAgICA2MAotI2RlZmluZSBDT0RFX0JPT0tfU0NGX0xBVjAxICAgICAgICAgMzEKLSNkZWZpbmUgQ09ERV9CT09LX1NDRl9MQVYxMCAgICAgICAgIDYwCi0jZGVmaW5lIENPREVfQk9PS19TQ0ZfTEFWMTEgICAgICAgICAzMQorI2RlZmluZSBDT0RFX0JPT0tfU0NGX0xBVjAwIDYwCisjZGVmaW5lIENPREVfQk9PS19TQ0ZfTEFWMDEgMzEKKyNkZWZpbmUgQ09ERV9CT09LX1NDRl9MQVYxMCA2MAorI2RlZmluZSBDT0RFX0JPT0tfU0NGX0xBVjExIDMxCiAjZGVmaW5lIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMSAxMgogI2RlZmluZSBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTAgMjQKIAotdHlwZWRlZiBlbnVtCi17Ci0gIFNCUl9BTVBfUkVTXzFfNT0wLAotICBTQlJfQU1QX1JFU18zXzAKLX0KLUFNUF9SRVM7Cit0eXBlZGVmIGVudW0geyBTQlJfQU1QX1JFU18xXzUgPSAwLCBTQlJfQU1QX1JFU18zXzAgfSBBTVBfUkVTOwogCi10eXBlZGVmIGVudW0KLXsKK3R5cGVkZWYgZW51bSB7CiAgIFhQT1NfTURDVCwKICAgWFBPU19NRENUX0NST1NTLAogICBYUE9TX0xDLAogICBYUE9TX1JFU0VSVkVELAogICBYUE9TX1NXSVRDSEVEIC8qIG5vdCBhIHJlYWwgY2hvaWNlIGJ1dCB1c2VkIGhlcmUgdG8gY29udHJvbCBiZWhhdmlvdXIgKi8KLX0KLVhQT1NfTU9ERTsKK30gWFBPU19NT0RFOwogCi10eXBlZGVmIGVudW0KLXsKK3R5cGVkZWYgZW51bSB7CiAgIElOVkZfT0ZGID0gMCwKICAgSU5WRl9MT1dfTEVWRUwsCiAgIElOVkZfTUlEX0xFVkVMLAogICBJTlZGX0hJR0hfTEVWRUwsCiAgIElOVkZfU1dJVENIRUQgLyogbm90IGEgcmVhbCBjaG9pY2UgYnV0IHVzZWQgaGVyZSB0byBjb250cm9sIGJlaGF2aW91ciAqLwotfQotSU5WRl9NT0RFOworfSBJTlZGX01PREU7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9zYnJfZW5jb2Rlci5jcHAgYi9saWJTQlJlbmMvc3JjL3Nicl9lbmNvZGVyLmNwcAppbmRleCA3MWFhYjc4Li5kZjllOTk2IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3Nicl9lbmNvZGVyLmNwcAorKysgYi9saWJTQlJlbmMvc3JjL3Nicl9lbmNvZGVyLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxOSArOTAsMjAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6IEFuZHJlYXMgRWhyZXQsIFRvYmlhcyBDaGFsdXBrYQorICAgQXV0aG9yKHMpOiAgIEFuZHJlYXMgRWhyZXQsIFRvYmlhcyBDaGFsdXBrYQorCiAgICBEZXNjcmlwdGlvbjogU0JSIGVuY29kZXIgdG9wIGxldmVsIHByb2Nlc3NpbmcuCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgogCi0jaW5jbHVkZSAic2JyX3JhbS5oIgotI2luY2x1ZGUgInNicl9yb20uaCIKKyNpbmNsdWRlICJzYnJlbmNfcmFtLmgiCisjaW5jbHVkZSAic2JyZW5jX3JvbS5oIgogI2luY2x1ZGUgInNicmVuY19mcmVxX3NjYS5oIgogI2luY2x1ZGUgImVudl9iaXQuaCIKICNpbmNsdWRlICJjbW9uZGF0YS5oIgpAQCAtMTAxLDExICsxMTMsOSBAQAogCiAjaW5jbHVkZSAicHNfbWFpbi5oIgogCi0jZGVmaW5lIFNCUkVOQ09ERVJfTElCX1ZMMCAzCi0jZGVmaW5lIFNCUkVOQ09ERVJfTElCX1ZMMSAzCi0jZGVmaW5lIFNCUkVOQ09ERVJfTElCX1ZMMiAxMgotCi0KKyNkZWZpbmUgU0JSRU5DT0RFUl9MSUJfVkwwIDQKKyNkZWZpbmUgU0JSRU5DT0RFUl9MSUJfVkwxIDAKKyNkZWZpbmUgU0JSRU5DT0RFUl9MSUJfVkwyIDAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCkBAIC0xMTksMzQgKzEyOSw4MyBAQAogICAgICAgICAgICAoY29yZTJzYnIgZGVsYXkgICAgICkgICAgICAgICAgZHMgICAgIChyZWFkLCBjb3JlIGFuZCBkcyBhcmVhKQogKi8KIAotI2RlZmluZSBTRkIoZHduc21wKSAgICAgICAgKDMyIDw8IChkd25zbXAtMSkpICAgICAvKiBTQlIgRnJlcXVlbmN5IGJhbmRzOiA2NCBmb3IgZHVhbC1yYXRlLCAzMiBmb3Igc2luZ2xlLXJhdGUgKi8KLSNkZWZpbmUgU1RTKGZsKSAgICAgICAgICAgICgoKGZsKT09MTAyNCk/MzI6MzApICAgLyogU0JSIFRpbWUgU2xvdHM6IDMyIGZvciBjb3JlIGZyYW1lIGxlbmd0aCAxMDI0LCAzMCBmb3IgY29yZSBmcmFtZSBsZW5ndGggOTYwICovCisjZGVmaW5lIFNGQihkd25zbXApIFwKKyAgKDMyIDw8IChkd25zbXAgLSAgXAorICAgICAgICAgIDEpKSAvKiBTQlIgRnJlcXVlbmN5IGJhbmRzOiA2NCBmb3IgZHVhbC1yYXRlLCAzMiBmb3Igc2luZ2xlLXJhdGUgKi8KKyNkZWZpbmUgU1RTKGZsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChmbCkgPT0gMTAyNCkgPyAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICA6IDMwKSAvKiBTQlIgVGltZSBTbG90czogMzIgZm9yIGNvcmUgZnJhbWUgbGVuZ3RoIDEwMjQsIDMwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjb3JlIGZyYW1lIGxlbmd0aCA5NjAgKi8KIAotI2RlZmluZSBERUxBWV9RTUZfQU5BKGR3bnNtcCkgKCgzMjA8PCgoZHduc21wKS0xKSkgLSAoMzI8PCgoZHduc21wKS0xKSkpIC8qIEZ1bGwgYmFuZHdpZHRoICovCi0jZGVmaW5lIERFTEFZX0hZQl9BTkEgICAgICAgICAoMTAqNjQpICAgICAgIC8qICsgMC41ICovICAgICAgICAgICAgICAvKiAgKi8KLSNkZWZpbmUgREVMQVlfSFlCX1NZTiAgICAgICAgICg2KjY0IC0gMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAqLwotI2RlZmluZSBERUxBWV9RTUZfUE9TVFBST0MoZHduc21wKSAoMzIqKGR3bnNtcCkpICAgICAgICAgICAgICAgICAgICAgLyogUU1GIHBvc3Rwcm9jZXNzaW5nIGRlbGF5ICovCi0jZGVmaW5lIERFTEFZX0RFQ19RTUYoZHduc21wKSAoNiAqIFNGQihkd25zbXApICkgICAgICAgICAgICAgICAgICAgICAvKiBEZWNvZGVyIFFNRiBvdmVybGFwICovCi0jZGVmaW5lIERFTEFZX1FNRl9TWU4gICAgICAgICAoMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT19QT0xZLzI9Mi41LCByb3VuZGVkIGRvd24gdG8gMiAqLwotI2RlZmluZSBERUxBWV9RTUZfRFMgICAgICAgICAgKDMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUU1GIHN5bnRoZXNpcyBmb3IgZG93bnNhbXBsZWQgdGltZSBzaWduYWwgKi8KKyNkZWZpbmUgREVMQVlfUU1GX0FOQShkd25zbXApIFwKKyAgKCgzMjAgPDwgKChkd25zbXApLTEpKSAtICgzMiA8PCAoKGR3bnNtcCktMSkpKSAvKiBGdWxsIGJhbmR3aWR0aCAqLworI2RlZmluZSBERUxBWV9IWUJfQU5BICgxMCAqIDY0KSAvKiArIDAuNSAqLyAgICAgIC8qICAqLworI2RlZmluZSBERUxBWV9IWUJfU1lOICg2ICogNjQgLSAzMikgICAgICAgICAgICAgIC8qICAqLworI2RlZmluZSBERUxBWV9RTUZfUE9TVFBST0MoZHduc21wKSBcCisgICgzMiAqIChkd25zbXApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRTUYgcG9zdHByb2Nlc3NpbmcgZGVsYXkgKi8KKyNkZWZpbmUgREVMQVlfREVDX1FNRihkd25zbXApICg2ICogU0ZCKGR3bnNtcCkpIC8qIERlY29kZXIgUU1GIG92ZXJsYXAgKi8KKyNkZWZpbmUgREVMQVlfUU1GX1NZTihkd25zbXApIFwKKyAgKDEgPDwgKGR3bnNtcCAtICAgICAgICAgICAgIFwKKyAgICAgICAgIDEpKSAvKiBRTUZfTk9fUE9MWS8yPTIuNSwgcm91bmRlZCBkb3duIHRvIDIsIGhhbGYgZm9yIHNpbmdsZS1yYXRlICovCisjZGVmaW5lIERFTEFZX1FNRl9EUyAoMzIpIC8qIFFNRiBzeW50aGVzaXMgZm9yIGRvd25zYW1wbGVkIHRpbWUgc2lnbmFsICovCiAKIC8qIERlbGF5IGluIFFNRiBwYXRocyAqLwotI2RlZmluZSBERUxBWV9TQlIoZmwsZHduc21wKSAgICAgKERFTEFZX1FNRl9BTkEoZHduc21wKSArIChTRkIoZHduc21wKSpTVFMoZmwpIC0gMSkgKyBERUxBWV9RTUZfU1lOKQotI2RlZmluZSBERUxBWV9QUyhmbCxkd25zbXApICAgICAgKERFTEFZX1FNRl9BTkEoZHduc21wKSArIERFTEFZX0hZQl9BTkEgKyBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKyAoU0ZCKGR3bnNtcCkqU1RTKGZsKS0xKSArIERFTEFZX0hZQl9TWU4gKyBERUxBWV9RTUZfU1lOKQotI2RlZmluZSBERUxBWV9FTERTQlIoZmwsZHduc21wKSAgKCAoICgoZmwpLzIpKihkd25zbXApICkgLSAxICsgREVMQVlfUU1GX1BPU1RQUk9DKGR3bnNtcCkgKQorI2RlZmluZSBERUxBWV9TQlIoZmwsIGR3bnNtcCkgXAorICAoREVMQVlfUU1GX0FOQShkd25zbXApICsgKFNGQihkd25zbXApICogU1RTKGZsKSAtIDEpICsgREVMQVlfUU1GX1NZTihkd25zbXApKQorI2RlZmluZSBERUxBWV9QUyhmbCwgZHduc21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKERFTEFZX1FNRl9BTkEoZHduc21wKSArIERFTEFZX0hZQl9BTkEgKyBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKyBcCisgICAoU0ZCKGR3bnNtcCkgKiBTVFMoZmwpIC0gMSkgKyBERUxBWV9IWUJfU1lOICsgREVMQVlfUU1GX1NZTihkd25zbXApKQorI2RlZmluZSBERUxBWV9FTERTQlIoZmwsIGR3bnNtcCkgXAorICAoKCgoZmwpIC8gMikgKiAoZHduc21wKSkgLSAxICsgREVMQVlfUU1GX1BPU1RQUk9DKGR3bnNtcCkpCisjZGVmaW5lIERFTEFZX0VMRHYyU0JSKGZsLCBkd25zbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKGZsKSAvIDIpICogKGR3bnNtcCkpIC0gMSArIDgwICogKGR3bnNtcCkpIC8qIDgwIGlzIHRoZSBkZWxheSBjYXVzZWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIHN1bSBvZiB0aGUgQ0xEICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXNpcyBhbmQgdGhlIE1QU0xEIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoZXNpcyBmaWx0ZXJiYW5rICovCiAKLS8qIERlbGF5IGRpZmZlcmVuY2VzIGZvciBTQlIgYW5kIFNCUitQUyAqLwotI2RlZmluZSBNQVhfRFNfRklMVEVSX0RFTEFZICg1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYWRkaXRpb25hbCBtYXggZG93bnNhbXBsZXIgZmlsdGVyIGRlbGF5IChzb3VyY2UgZnMpICovCi0jZGVmaW5lIERFTEFZX0FBQzJTQlIoZmwsZHduc21wKSAoKERFTEFZX1FNRl9BTkEoZHduc21wKSArIERFTEFZX0RFQ19RTUYoZHduc21wKSArIERFTEFZX1FNRl9TWU4pIC0gREVMQVlfU0JSKChmbCksKGR3bnNtcCkpKQotI2RlZmluZSBERUxBWV9FTEQyU0JSKGZsLGR3bnNtcCkgKChERUxBWV9RTUZfUE9TVFBST0MoZHduc21wKSkgLSBERUxBWV9FTERTQlIoZmwsZHduc21wKSkKLSNkZWZpbmUgREVMQVlfQUFDMlBTKGZsLGR3bnNtcCkgKChERUxBWV9RTUZfQU5BKGR3bnNtcCkgKyBERUxBWV9RTUZfRFMgKyAvKihERUxBWV9BQUMoZmwpKjIpICsgKi8gREVMQVlfUU1GX0FOQShkd25zbXApICsgREVMQVlfREVDX1FNRihkd25zbXApICsgREVMQVlfSFlCX1NZTiArIERFTEFZX1FNRl9TWU4pIC0gREVMQVlfUFMoZmwsZHduc21wKSkgLyogMjA0OCAtIDQ2MyoyICovCisvKiBEZWxheSBpbiBjb3JlIHBhdGggKGNvcmUgYW5kIGRvd25zYW1wbGVyIG5vdCB0YWtlbiBpbnRvIGFjY291bnQpICovCisjZGVmaW5lIERFTEFZX0NPUkVQQVRIX1NCUihmbCwgZHduc21wKSBcCisgICgoREVMQVlfUU1GX0FOQShkd25zbXApICsgREVMQVlfREVDX1FNRihkd25zbXApICsgREVMQVlfUU1GX1NZTihkd25zbXApKSkKKyNkZWZpbmUgREVMQVlfQ09SRVBBVEhfRUxEU0JSKGZsLCBkd25zbXApICgoREVMQVlfUU1GX1BPU1RQUk9DKGR3bnNtcCkpKQorI2RlZmluZSBERUxBWV9DT1JFUEFUSF9FTER2MlNCUihmbCwgZHduc21wKSAoMTI4ICogKGR3bnNtcCkpIC8qIDQgc2xvdHMgKi8KKyNkZWZpbmUgREVMQVlfQ09SRVBBVEhfUFMoZmwsIGR3bnNtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKERFTEFZX1FNRl9BTkEoZHduc21wKSArIERFTEFZX1FNRl9EUyArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyooREVMQVlfQUFDKGZsKSoyKSArICovIERFTEFZX1FNRl9BTkEoZHduc21wKSArIERFTEFZX0RFQ19RTUYoZHduc21wKSArIFwKKyAgICBERUxBWV9IWUJfU1lOICsgREVMQVlfUU1GX1NZTihkd25zbXApKSkgLyogMjA0OCAtIDQ2MyoyICovCiAKLS8qIEFzc3VtcHRpb246IFRoZSBzYW1wbGUgZGVsYXkgcmVzdWx0aW5nIG9mIG9mIERFTEFZX0FBQzJQUyBpcyBhbHdheXMgc21hbGxlciB0aGFuIHRoZSBzYW1wbGUgZGVsYXkgaW1wbGllZCBieSBERUxBWV9BQUMyU0JSICovCi0jZGVmaW5lIE1BWF9TQU1QTEVfREVMQVkgICAgICAgKERFTEFZX0FBQzJTQlIoMTAyNCwyKSArIE1BWF9EU19GSUxURVJfREVMQVkpIC8qIG1heGltdW0gZGVsYXk6IGZyYW1lIGxlbmd0aCBvZiAxMDI0IGFuZCBkdWFsLXJhdGUgc2JyICovCisvKiBEZWxheSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFNCUi0gYW5kIGRvd25zYW1wbGVkIHBhdGggZm9yIFNCUiBhbmQgU0JSK1BTICovCisjZGVmaW5lIERFTEFZX0FBQzJTQlIoZmwsIGR3bnNtcCkgXAorICAoKERFTEFZX0NPUkVQQVRIX1NCUihmbCwgZHduc21wKSkgLSBERUxBWV9TQlIoKGZsKSwgKGR3bnNtcCkpKQorI2RlZmluZSBERUxBWV9FTEQyU0JSKGZsLCBkd25zbXApIFwKKyAgKChERUxBWV9DT1JFUEFUSF9FTERTQlIoZmwsIGR3bnNtcCkpIC0gREVMQVlfRUxEU0JSKGZsLCBkd25zbXApKQorI2RlZmluZSBERUxBWV9BQUMyUFMoZmwsIGR3bnNtcCkgXAorICAoKERFTEFZX0NPUkVQQVRIX1BTKGZsLCBkd25zbXApKSAtIERFTEFZX1BTKGZsLCBkd25zbXApKSAvKiAyMDQ4IC0gNDYzKjIgKi8KKworLyogQXNzdW1wdGlvbjogVGhlIHNhbXBsZSBkZWxheSByZXN1bHRpbmcgb2Ygb2YgREVMQVlfQUFDMlBTIGlzIGFsd2F5cyBzbWFsbGVyCisgKiB0aGFuIHRoZSBzYW1wbGUgZGVsYXkgaW1wbGllZCBieSBERUxBWV9BQUMyU0JSICovCisjZGVmaW5lIE1BWF9EU19GSUxURVJfREVMQVkgXAorICAoNSkgLyogdGhlIGFkZGl0aW9uYWwgbWF4IGRvd25zYW1wbGVyIGZpbHRlciBkZWxheSAoc291cmNlIGZzKSAqLworI2RlZmluZSBNQVhfU0FNUExFX0RFTEFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKERFTEFZX0FBQzJTQlIoMTAyNCwgMikgKyBNQVhfRFNfRklMVEVSX0RFTEFZKSAvKiBtYXhpbXVtIGRlbGF5OiBmcmFtZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIG9mIDEwMjQgYW5kICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1YWwtcmF0ZSBzYnIgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCisvKioqKioqKioqKioqKioqIERlbGF5IHBhcmFtZXRlcnMgZm9yIHNickVuY29kZXJfSW5pdF9kZWxheSgpICoqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgZHNEZWxheTsgICAgICAgIC8qIHRoZSBkZWxheSBvZiB0aGUgKHRpbWUtZG9tYWluKSBkb3duc2FtcGxlciBpdHNlbGYgKi8KKyAgaW50IGRlbGF5OyAgICAgICAgICAvKiBvdmVyYWxsIGRlbGF5IC8gc2FtcGxlcyAgKi8KKyAgaW50IHNickRlY0RlbGF5OyAgICAvKiBTQlIgZGVjb2RlcidzIGRlbGF5ICovCisgIGludCBjb3JlUGF0aE9mZnNldDsgLyogY29yZSBwYXRoIG9mZnNldCAvIHNhbXBsZXM7IGFkZGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW5jb2Rlcl9Jbml0X2RlbGF5KCkgKi8KKyAgaW50IHNiclBhdGhPZmZzZXQ7ICAvKiBTQlIgcGF0aCBvZmZzZXQgLyBzYW1wbGVzOyBhZGRlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgIHNickVuY29kZXJfSW5pdF9kZWxheSgpICovCisgIGludCBiaXRzdHJEZWxheTsgLyogYml0c3RyZWFtIGRlbGF5IC8gZnJhbWVzOyBhZGRlZCBieSBzYnJFbmNvZGVyX0luaXRfZGVsYXkoKQorICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgZGVsYXlJbnB1dDJDb3JlOyAvKiBkZWxheSBvZiB0aGUgaW5wdXQgdG8gdGhlIGNvcmUgLyBzYW1wbGVzICovCit9IERFTEFZX1BBUkFNOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2RlZmluZSBJTlZBTElEX1RBQkxFX0lEWCAtMQogCkBAIC0xNjAsNDQgKzIxOSwzOCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBESVNUQU5DRV9DRUlMX1ZBTFVFIDUwMDAwMDAKLXN0YXRpYyBJTlQKLWdldFNiclR1bmluZ1RhYmxlSW5kZXgoVUlOVCBiaXRyYXRlLCAgICAvKiEgdGhlIHRvdGFsIGJpdHJhdGUgaW4gYml0cy9zZWMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBudW1DaGFubmVscywvKiEgdGhlIG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhlIGNvcmUgY29kZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYW1wbGVSYXRlLCAgLyohIHRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBjb3JlIGNvZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBCaXRSYXRlQ2xvc2VzdAotICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIGludCBpLCBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXg9LTEsIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleD0tMSwgZm91bmQgPSAwOwotICBVSU5UIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSAwLCBiaXRSYXRlQ2xvc2VzdExvd2VyPURJU1RBTkNFX0NFSUxfVkFMVUU7CitzdGF0aWMgSU5UIGdldFNiclR1bmluZ1RhYmxlSW5kZXgoCisgICAgVUlOVCBiaXRyYXRlLCAgICAgLyohIHRoZSB0b3RhbCBiaXRyYXRlIGluIGJpdHMvc2VjICovCisgICAgVUlOVCBudW1DaGFubmVscywgLyohIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIHRoZSBjb3JlIGNvZGVyICovCisgICAgVUlOVCBzYW1wbGVSYXRlLCAgLyohIHRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBjb3JlIGNvZGVyICovCisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZSwgVUlOVCAqcEJpdFJhdGVDbG9zZXN0KSB7CisgIGludCBpLCBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPSAtMSwgYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4ID0gLTEsCisgICAgICAgICBmb3VuZCA9IDA7CisgIFVJTlQgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IDAsIGJpdFJhdGVDbG9zZXN0TG93ZXIgPSBESVNUQU5DRV9DRUlMX1ZBTFVFOwogCi0gICNkZWZpbmUgaXNGb3JUaGlzQ29yZShpKSBcCi0gICAgKCAoIHNiclR1bmluZ1RhYmxlW2ldLmNvcmVDb2RlciA9PSBDT0RFQ19BQUNMRCAmJiBjb3JlID09IEFPVF9FUl9BQUNfRUxEICkgfHwgXAotICAgICAgKCBzYnJUdW5pbmdUYWJsZVtpXS5jb3JlQ29kZXIgPT0gQ09ERUNfQUFDICAgJiYgY29yZSAhPSBBT1RfRVJfQUFDX0VMRCApICkKKyNkZWZpbmUgaXNGb3JUaGlzQ29yZShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHNiclR1bmluZ1RhYmxlW2ldLmNvcmVDb2RlciA9PSBDT0RFQ19BQUNMRCAmJiBjb3JlID09IEFPVF9FUl9BQUNfRUxEKSB8fCBcCisgICAoc2JyVHVuaW5nVGFibGVbaV0uY29yZUNvZGVyID09IENPREVDX0FBQyAmJiBjb3JlICE9IEFPVF9FUl9BQUNfRUxEKSkKIAotICBmb3IgKGk9MDsgaSA8IHNiclR1bmluZ1RhYmxlU2l6ZSA7IGkrKykgewotICAgIGlmICggaXNGb3JUaGlzQ29yZShpKSApIC8qIHR1bmluZyB0YWJsZSBpcyBmb3IgdGhpcyBjb3JlIGNvZGVjICovCisgIGZvciAoaSA9IDA7IGkgPCBzYnJUdW5pbmdUYWJsZVNpemU7IGkrKykgeworICAgIGlmIChpc0ZvclRoaXNDb3JlKGkpKSAvKiB0dW5pbmcgdGFibGUgaXMgZm9yIHRoaXMgY29yZSBjb2RlYyAqLwogICAgIHsKLSAgICAgIGlmICggbnVtQ2hhbm5lbHMgPT0gc2JyVHVuaW5nVGFibGUgW2ldLm51bUNoYW5uZWxzCi0gICAgICAgICYmIHNhbXBsZVJhdGUgPT0gc2JyVHVuaW5nVGFibGUgW2ldLnNhbXBsZVJhdGUgKQotICAgICAgeworICAgICAgaWYgKG51bUNoYW5uZWxzID09IHNiclR1bmluZ1RhYmxlW2ldLm51bUNoYW5uZWxzICYmCisgICAgICAgICAgc2FtcGxlUmF0ZSA9PSBzYnJUdW5pbmdUYWJsZVtpXS5zYW1wbGVSYXRlKSB7CiAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgaWYgKChiaXRyYXRlID49IHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbSkgJiYKLSAgICAgICAgICAgIChiaXRyYXRlIDwgc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUbykpIHsKLSAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RMb3dlciA9IGJpdHJhdGU7Ci0gICAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSBiaXRyYXRlOwotICAgICAgICAgICAgICAvL0ZES3ByaW50ZigiZW50cnkgJWRcbiIsIGkpOwotICAgICAgICAgIHJldHVybiBpIDsKKyAgICAgICAgaWYgKChiaXRyYXRlID49IHNiclR1bmluZ1RhYmxlW2ldLmJpdHJhdGVGcm9tKSAmJgorICAgICAgICAgICAgKGJpdHJhdGUgPCBzYnJUdW5pbmdUYWJsZVtpXS5iaXRyYXRlVG8pKSB7CisgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKCBzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20gPiBiaXRyYXRlICkgewotICAgICAgICAgICAgaWYgKHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbSA8IGJpdFJhdGVDbG9zZXN0TG93ZXIpIHsKLSAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RMb3dlciA9IHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbTsKKyAgICAgICAgICBpZiAoc2JyVHVuaW5nVGFibGVbaV0uYml0cmF0ZUZyb20gPiBiaXRyYXRlKSB7CisgICAgICAgICAgICBpZiAoc2JyVHVuaW5nVGFibGVbaV0uYml0cmF0ZUZyb20gPCBiaXRSYXRlQ2xvc2VzdExvd2VyKSB7CisgICAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXIgPSBzYnJUdW5pbmdUYWJsZVtpXS5iaXRyYXRlRnJvbTsKICAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4ID0gaTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCBzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvIDw9IGJpdHJhdGUgKSB7Ci0gICAgICAgICAgICBpZiAoc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUbyA+IGJpdFJhdGVDbG9zZXN0VXBwZXIpIHsKLSAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8tMTsKKyAgICAgICAgICBpZiAoc2JyVHVuaW5nVGFibGVbaV0uYml0cmF0ZVRvIDw9IGJpdHJhdGUpIHsKKyAgICAgICAgICAgIGlmIChzYnJUdW5pbmdUYWJsZVtpXS5iaXRyYXRlVG8gPiBiaXRSYXRlQ2xvc2VzdFVwcGVyKSB7CisgICAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSBzYnJUdW5pbmdUYWJsZVtpXS5iaXRyYXRlVG8gLSAxOwogICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXggPSBpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KQEAgLTIwNiwyMCArMjU5LDI1IEBACiAgICAgfQogICB9CiAKLSAgaWYgKHBCaXRSYXRlQ2xvc2VzdCAhPSBOVUxMKQotICB7Ci0gICAgLyogSWYgdGhlcmUgd2FzIGF0IGxlYXN0IG9uZSBtYXRjaGluZyB0dW5pbmcgZW50cnkgZm91bmQgdGhlbiBwaWNrIHRoZSBsZWFzdCBkaXN0YW5jZSBiaXQgcmF0ZSAqLwotICAgIGlmIChmb3VuZCkKLSAgICB7Ci0gICAgICBpbnQgZGlzdGFuY2VVcHBlcj1ESVNUQU5DRV9DRUlMX1ZBTFVFLCBkaXN0YW5jZUxvd2VyPURJU1RBTkNFX0NFSUxfVkFMVUU7CisgIGlmIChiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXggPj0gMCkgeworICAgIHJldHVybiBiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXg7CisgIH0KKworICBpZiAocEJpdFJhdGVDbG9zZXN0ICE9IE5VTEwpIHsKKyAgICAvKiBJZiB0aGVyZSB3YXMgYXQgbGVhc3Qgb25lIG1hdGNoaW5nIHR1bmluZyBlbnRyeSBwaWNrIHRoZSBsZWFzdCBkaXN0YW5jZQorICAgICAqIGJpdCByYXRlICovCisgICAgaWYgKGZvdW5kKSB7CisgICAgICBpbnQgZGlzdGFuY2VVcHBlciA9IERJU1RBTkNFX0NFSUxfVkFMVUUsCisgICAgICAgICAgZGlzdGFuY2VMb3dlciA9IERJU1RBTkNFX0NFSUxfVkFMVUU7CiAgICAgICBpZiAoYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4ID49IDApIHsKLSAgICAgICAgZGlzdGFuY2VMb3dlciA9IHNiclR1bmluZ1RhYmxlIFtiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXhdLmJpdHJhdGVGcm9tIC0gYml0cmF0ZTsKKyAgICAgICAgZGlzdGFuY2VMb3dlciA9CisgICAgICAgICAgICBzYnJUdW5pbmdUYWJsZVtiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXhdLmJpdHJhdGVGcm9tIC0gYml0cmF0ZTsKICAgICAgIH0KICAgICAgIGlmIChiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXggPj0gMCkgewotICAgICAgICBkaXN0YW5jZVVwcGVyID0gYml0cmF0ZSAtIHNiclR1bmluZ1RhYmxlIFtiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXhdLmJpdHJhdGVUbzsKKyAgICAgICAgZGlzdGFuY2VVcHBlciA9CisgICAgICAgICAgICBiaXRyYXRlIC0gc2JyVHVuaW5nVGFibGVbYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4XS5iaXRyYXRlVG87CiAgICAgICB9Ci0gICAgICBpZiAoIGRpc3RhbmNlVXBwZXIgPCBkaXN0YW5jZUxvd2VyICkKLSAgICAgIHsKKyAgICAgIGlmIChkaXN0YW5jZVVwcGVyIDwgZGlzdGFuY2VMb3dlcikgewogICAgICAgICAqcEJpdFJhdGVDbG9zZXN0ID0gYml0UmF0ZUNsb3Nlc3RVcHBlcjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgICpwQml0UmF0ZUNsb3Nlc3QgPSBiaXRSYXRlQ2xvc2VzdExvd2VyOwpAQCAtMjQxLDQ0ICsyOTksNDcgQEAKICAgXHJldHVybiBJbmRleCB0byB0aGUgYXBwcm9wcmlhdGUgdGFibGUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWdldFBzVHVuaW5nVGFibGVJbmRleChVSU5UIGJpdHJhdGUsIFVJTlQgKnBCaXRSYXRlQ2xvc2VzdCl7CitzdGF0aWMgSU5UIGdldFBzVHVuaW5nVGFibGVJbmRleChVSU5UIGJpdHJhdGUsIFVJTlQgKnBCaXRSYXRlQ2xvc2VzdCkgeworICBJTlQgaSwgcGFyYW1TZXRzID0gc2l6ZW9mKHBzVHVuaW5nVGFibGUpIC8gc2l6ZW9mKHBzVHVuaW5nVGFibGVbMF0pOworICBpbnQgYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4ID0gLTEsIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA9IC0xOworICBVSU5UIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSAwLCBiaXRSYXRlQ2xvc2VzdExvd2VyID0gRElTVEFOQ0VfQ0VJTF9WQUxVRTsKIAotICBJTlQgaSwgcGFyYW1TZXRzID0gc2l6ZW9mIChwc1R1bmluZ1RhYmxlKSAvIHNpemVvZiAocHNUdW5pbmdUYWJsZSBbMF0pOwotICBpbnQgYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4PS0xLCBiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXg9LTE7Ci0gIFVJTlQgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IDAsIGJpdFJhdGVDbG9zZXN0TG93ZXI9RElTVEFOQ0VfQ0VJTF9WQUxVRTsKLQotICBmb3IgKGkgPSAwIDsgaSA8IHBhcmFtU2V0cyA7IGkrKykgIHsKLSAgICBpZiAoKGJpdHJhdGUgPj0gcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20pICYmCi0gICAgICAgIChiaXRyYXRlIDwgcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvKSkgewotICAgICAgcmV0dXJuIGkgOworICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1TZXRzOyBpKyspIHsKKyAgICBpZiAoKGJpdHJhdGUgPj0gcHNUdW5pbmdUYWJsZVtpXS5iaXRyYXRlRnJvbSkgJiYKKyAgICAgICAgKGJpdHJhdGUgPCBwc1R1bmluZ1RhYmxlW2ldLmJpdHJhdGVUbykpIHsKKyAgICAgIHJldHVybiBpOwogICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tID4gYml0cmF0ZSApIHsKLSAgICAgICAgaWYgKHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tIDwgYml0UmF0ZUNsb3Nlc3RMb3dlcikgewotICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXIgPSBwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbTsKKyAgICAgIGlmIChwc1R1bmluZ1RhYmxlW2ldLmJpdHJhdGVGcm9tID4gYml0cmF0ZSkgeworICAgICAgICBpZiAocHNUdW5pbmdUYWJsZVtpXS5iaXRyYXRlRnJvbSA8IGJpdFJhdGVDbG9zZXN0TG93ZXIpIHsKKyAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VyID0gcHNUdW5pbmdUYWJsZVtpXS5iaXRyYXRlRnJvbTsKICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPSBpOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBpZiAoIHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUbyA8PSBiaXRyYXRlICkgewotICAgICAgICBpZiAocHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvID4gYml0UmF0ZUNsb3Nlc3RVcHBlcikgewotICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSBwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8tMTsKKyAgICAgIGlmIChwc1R1bmluZ1RhYmxlW2ldLmJpdHJhdGVUbyA8PSBiaXRyYXRlKSB7CisgICAgICAgIGlmIChwc1R1bmluZ1RhYmxlW2ldLmJpdHJhdGVUbyA+IGJpdFJhdGVDbG9zZXN0VXBwZXIpIHsKKyAgICAgICAgICBiaXRSYXRlQ2xvc2VzdFVwcGVyID0gcHNUdW5pbmdUYWJsZVtpXS5iaXRyYXRlVG8gLSAxOwogICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA9IGk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIAotICBpZiAocEJpdFJhdGVDbG9zZXN0ICE9IE5VTEwpCi0gIHsKLSAgICBpbnQgZGlzdGFuY2VVcHBlcj1ESVNUQU5DRV9DRUlMX1ZBTFVFLCBkaXN0YW5jZUxvd2VyPURJU1RBTkNFX0NFSUxfVkFMVUU7CisgIGlmIChiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXggPj0gMCkgeworICAgIHJldHVybiBiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXg7CisgIH0KKworICBpZiAocEJpdFJhdGVDbG9zZXN0ICE9IE5VTEwpIHsKKyAgICBpbnQgZGlzdGFuY2VVcHBlciA9IERJU1RBTkNFX0NFSUxfVkFMVUUsCisgICAgICAgIGRpc3RhbmNlTG93ZXIgPSBESVNUQU5DRV9DRUlMX1ZBTFVFOwogICAgIGlmIChiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPj0gMCkgewotICAgICAgZGlzdGFuY2VMb3dlciA9IHNiclR1bmluZ1RhYmxlIFtiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXhdLmJpdHJhdGVGcm9tIC0gYml0cmF0ZTsKKyAgICAgIGRpc3RhbmNlTG93ZXIgPQorICAgICAgICAgIHNiclR1bmluZ1RhYmxlW2JpdFJhdGVDbG9zZXN0TG93ZXJJbmRleF0uYml0cmF0ZUZyb20gLSBiaXRyYXRlOwogICAgIH0KICAgICBpZiAoYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4ID49IDApIHsKLSAgICAgIGRpc3RhbmNlVXBwZXIgPSBiaXRyYXRlIC0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0VXBwZXJJbmRleF0uYml0cmF0ZVRvOworICAgICAgZGlzdGFuY2VVcHBlciA9CisgICAgICAgICAgYml0cmF0ZSAtIHNiclR1bmluZ1RhYmxlW2JpdFJhdGVDbG9zZXN0VXBwZXJJbmRleF0uYml0cmF0ZVRvOwogICAgIH0KLSAgICBpZiAoIGRpc3RhbmNlVXBwZXIgPCBkaXN0YW5jZUxvd2VyICkKLSAgICB7CisgICAgaWYgKGRpc3RhbmNlVXBwZXIgPCBkaXN0YW5jZUxvd2VyKSB7CiAgICAgICAqcEJpdFJhdGVDbG9zZXN0ID0gYml0UmF0ZUNsb3Nlc3RVcHBlcjsKICAgICB9IGVsc2UgewogICAgICAgKnBCaXRSYXRlQ2xvc2VzdCA9IGJpdFJhdGVDbG9zZXN0TG93ZXI7CkBAIC0zMDAsNDEgKzM2MSwyOSBAQAogICBcaW5ncm91cCBTYnJFbmNDZmcKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLUZES3NickVuY19HZXREb3duc2FtcGxlZFN0b3BGcmVxICgKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVDb3JlLAotICAgICAgICBjb25zdCBJTlQgc3RhcnRGcmVxLAotICAgICAgICAgICAgICBJTlQgc3RvcEZyZXEsCi0gICAgICAgIGNvbnN0IElOVCBkb3duU2FtcGxlRmFjdG9yCi0gICAgICAgICkKLXsKK3N0YXRpYyBJTlQgRkRLc2JyRW5jX0dldERvd25zYW1wbGVkU3RvcEZyZXEoY29uc3QgSU5UIHNhbXBsZVJhdGVDb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RhcnRGcmVxLCBJTlQgc3RvcEZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkb3duU2FtcGxlRmFjdG9yKSB7CiAgIElOVCBtYXhTdG9wRnJlcVJhdyA9IHNhbXBsZVJhdGVDb3JlIC8gMjsKICAgSU5UIHN0YXJ0QmFuZCwgc3RvcEJhbmQ7CiAgIEhBTkRMRV9FUlJPUl9JTkZPIGVycjsKIAotICB3aGlsZSAoc3RvcEZyZXEgPiAwICYmIEZES3NickVuY19nZXRTYnJTdG9wRnJlcVJBVyhzdG9wRnJlcSwgc2FtcGxlUmF0ZUNvcmUpID4gbWF4U3RvcEZyZXFSYXcpIHsKKyAgd2hpbGUgKHN0b3BGcmVxID4gMCAmJiBGREtzYnJFbmNfZ2V0U2JyU3RvcEZyZXFSQVcoc3RvcEZyZXEsIHNhbXBsZVJhdGVDb3JlKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFN0b3BGcmVxUmF3KSB7CiAgICAgc3RvcEZyZXEtLTsKICAgfQogCi0gIGlmIChGREtzYnJFbmNfZ2V0U2JyU3RvcEZyZXFSQVcoIHN0b3BGcmVxLCBzYW1wbGVSYXRlQ29yZSkgPiBtYXhTdG9wRnJlcVJhdykKKyAgaWYgKEZES3NickVuY19nZXRTYnJTdG9wRnJlcVJBVyhzdG9wRnJlcSwgc2FtcGxlUmF0ZUNvcmUpID4gbWF4U3RvcEZyZXFSYXcpCiAgICAgcmV0dXJuIC0xOwogCi0gIGVyciA9IEZES3NickVuY19GaW5kU3RhcnRBbmRTdG9wQmFuZCAoCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUNvcmU8PChkb3duU2FtcGxlRmFjdG9yLTEpLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVDb3JlLAotICAgICAgICAgICAgICAgIDMyPDwoZG93blNhbXBsZUZhY3Rvci0xKSwKLSAgICAgICAgICAgICAgICBzdGFydEZyZXEsCi0gICAgICAgICAgICAgICAgc3RvcEZyZXEsCi0gICAgICAgICAgICAgICAmc3RhcnRCYW5kLAotICAgICAgICAgICAgICAgJnN0b3BCYW5kCi0gICAgICAgICAgICAgICAgKTsKLSAgaWYgKGVycikKLSAgICByZXR1cm4gLTE7CisgIGVyciA9IEZES3NickVuY19GaW5kU3RhcnRBbmRTdG9wQmFuZCgKKyAgICAgIHNhbXBsZVJhdGVDb3JlIDw8IChkb3duU2FtcGxlRmFjdG9yIC0gMSksIHNhbXBsZVJhdGVDb3JlLAorICAgICAgMzIgPDwgKGRvd25TYW1wbGVGYWN0b3IgLSAxKSwgc3RhcnRGcmVxLCBzdG9wRnJlcSwgJnN0YXJ0QmFuZCwgJnN0b3BCYW5kKTsKKyAgaWYgKGVycikgcmV0dXJuIC0xOwogCiAgIHJldHVybiBzdG9wRnJlcTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAKQEAgLTM0NSwyMiArMzk0LDE4IEBACiAgIFxyZXR1cm4gYSBmbGFnIGluZGljYXRpbmcgc3VjY2VzczogeWVzICgxKSBvciBubyAoMCkKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBVSU5UCi1GREtzYnJFbmNfSXNTYnJTZXR0aW5nQXZhaWwgKAotICAgICAgICBVSU5UIGJpdHJhdGUsICAgICAgICAgICAvKiEgdGhlIHRvdGFsIGJpdHJhdGUgaW4gYml0cy9zZWMgKi8KLSAgICAgICAgVUlOVCB2YnJNb2RlLCAgICAgICAgICAgLyohIHRoZSB2YnIgcGFyYW10ZXIsIDAgbWVhbnMgY29uc3RhbnQgYml0cmF0ZSAqLwotICAgICAgICBVSU5UIG51bU91dHB1dENoYW5uZWxzLCAvKiEgdGhlIG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhlIGNvcmUgY29kZXIgKi8KLSAgICAgICAgVUlOVCBzYW1wbGVSYXRlSW5wdXQsICAgLyohIHRoZSBpbnB1dCBzYW1wbGUgcmF0ZSBbaW4gSHpdICovCi0gICAgICAgIFVJTlQgc2FtcGxlUmF0ZUNvcmUsICAgIC8qISB0aGUgY29yZSdzIHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZQotICAgICAgICApCi17CitzdGF0aWMgVUlOVCBGREtzYnJFbmNfSXNTYnJTZXR0aW5nQXZhaWwoCisgICAgVUlOVCBiaXRyYXRlLCAgICAgICAgICAgLyohIHRoZSB0b3RhbCBiaXRyYXRlIGluIGJpdHMvc2VjICovCisgICAgVUlOVCB2YnJNb2RlLCAgICAgICAgICAgLyohIHRoZSB2YnIgcGFyYW10ZXIsIDAgbWVhbnMgY29uc3RhbnQgYml0cmF0ZSAqLworICAgIFVJTlQgbnVtT3V0cHV0Q2hhbm5lbHMsIC8qISB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGUgY29yZSBjb2RlciAqLworICAgIFVJTlQgc2FtcGxlUmF0ZUlucHV0LCAgIC8qISB0aGUgaW5wdXQgc2FtcGxlIHJhdGUgW2luIEh6XSAqLworICAgIFVJTlQgc2FtcGxlUmF0ZUNvcmUsICAgIC8qISB0aGUgY29yZSdzIHNhbXBsaW5nIHJhdGUgKi8KKyAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlKSB7CiAgIElOVCBpZHggPSBJTlZBTElEX1RBQkxFX0lEWDsKIAotICBpZiAoc2FtcGxlUmF0ZUlucHV0IDwgMTYwMDApCi0gICAgcmV0dXJuIDA7CisgIGlmIChzYW1wbGVSYXRlSW5wdXQgPCAxNjAwMCkgcmV0dXJuIDA7CiAKLSAgaWYgKGJpdHJhdGU9PTApIHsKKyAgaWYgKGJpdHJhdGUgPT0gMCkgewogICAgIC8qIG1hcCB2YnIgcXVhbGl0eSB0byBiaXRyYXRlICovCiAgICAgaWYgKHZick1vZGUgPCAzMCkKICAgICAgIGJpdHJhdGUgPSAyNDAwMDsKQEAgLTM3NSwxMiArNDIwLDEyIEBACiAgICAgYml0cmF0ZSAqPSBudW1PdXRwdXRDaGFubmVsczsKICAgfQogCi0gIGlkeCA9IGdldFNiclR1bmluZ1RhYmxlSW5kZXgoYml0cmF0ZSwgbnVtT3V0cHV0Q2hhbm5lbHMsIHNhbXBsZVJhdGVDb3JlLCBjb3JlLCBOVUxMKTsKKyAgaWR4ID0gZ2V0U2JyVHVuaW5nVGFibGVJbmRleChiaXRyYXRlLCBudW1PdXRwdXRDaGFubmVscywgc2FtcGxlUmF0ZUNvcmUsIGNvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAKICAgcmV0dXJuIChpZHggPT0gSU5WQUxJRF9UQUJMRV9JRFggPyAwIDogMSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogCkBAIC0zOTAsNDYgKzQzNSw0NiBAQAogICBccmV0dXJuIEEgZmxhZyBpbmRpY2F0aW5nIHN1Y2Nlc3M6IHllcyAoMSkgb3Igbm8gKDApCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgVUlOVAotRkRLc2JyRW5jX0FkanVzdFNiclNldHRpbmdzIChjb25zdCBzYnJDb25maWd1cmF0aW9uUHRyIGNvbmZpZywgLyohIG91dHB1dCwgbW9kaWZpZWQgKi8KLSAgICAgICAgICAgICAgICAgICBVSU5UIGJpdFJhdGUsICAgICAgICAgICAgIC8qISB0aGUgdG90YWwgYml0cmF0ZSBpbiBiaXRzL3NlYyAqLwotICAgICAgICAgICAgICAgICAgIFVJTlQgbnVtQ2hhbm5lbHMsICAgICAgICAgLyohIHRoZSBjb3JlIGNvZGVyIG51bWJlciBvZiBjaGFubmVscyAqLwotICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxlUmF0ZUNvcmUsICAgICAgLyohIHRoZSBjb3JlIGNvZGVyIHNhbXBsaW5nIHJhdGUgaW4gSHogKi8KLSAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsZVJhdGVTYnIsICAgICAgIC8qISB0aGUgc2JyIGNvZGVyIHNhbXBsaW5nIHJhdGUgaW4gSHogKi8KLSAgICAgICAgICAgICAgICAgICBVSU5UIHRyYW5zRmFjLCAgICAgICAgICAgIC8qISB0aGUgc2hvcnQgYmxvY2sgdG8gbG9uZyBibG9jayByYXRpbyAqLwotICAgICAgICAgICAgICAgICAgIFVJTlQgc3RhbmRhcmRCaXRyYXRlLCAgICAgLyohIHRoZSBzdGFuZGFyZCBiaXRyYXRlIHBlciBjaGFubmVsIGluIGJpdHMvc2VjICovCi0gICAgICAgICAgICAgICAgICAgVUlOVCB2YnJNb2RlLCAgICAgICAgICAgICAvKiEgdGhlIHZiciBwYXJhbXRlciwgMCBwb29yIHF1YWxpdHkgLi4gMTAwIGhpZ2ggcXVhbGl0eSovCi0gICAgICAgICAgICAgICAgICAgVUlOVCB1c2VTcGVlY2hDb25maWcsICAgICAvKiE8IGFkYXB0IHR1bmluZyBwYXJhbWV0ZXJzIGZvciBzcGVlY2ggPyAqLwotICAgICAgICAgICAgICAgICAgIFVJTlQgbGNzTW9kZSwgICAgICAgICAgICAgLyohIHRoZSBsb3cgY29tcGxleGl0eSBzdGVyZW8gbW9kZSAqLwotICAgICAgICAgICAgICAgICAgIFVJTlQgYlBhcmFtZXRyaWNTdGVyZW8sICAgLyohPCB1c2UgcGFyYW1ldHJpYyBzdGVyZW8gKi8KLSAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlKSAgIC8qIENvcmUgYXVkaW8gY29kZWMgb2JqZWN0IHR5cGUgKi8KK3N0YXRpYyBVSU5UIEZES3NickVuY19BZGp1c3RTYnJTZXR0aW5ncygKKyAgICBjb25zdCBzYnJDb25maWd1cmF0aW9uUHRyIGNvbmZpZywgLyohIG91dHB1dCwgbW9kaWZpZWQgKi8KKyAgICBVSU5UIGJpdFJhdGUsICAgICAgICAgICAgICAgICAgICAgLyohIHRoZSB0b3RhbCBiaXRyYXRlIGluIGJpdHMvc2VjICovCisgICAgVUlOVCBudW1DaGFubmVscywgICAgICAgICAgICAgICAgIC8qISB0aGUgY29yZSBjb2RlciBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBVSU5UIHNhbXBsZVJhdGVDb3JlLCAgICAgICAgICAgICAgLyohIHRoZSBjb3JlIGNvZGVyIHNhbXBsaW5nIHJhdGUgaW4gSHogKi8KKyAgICBVSU5UIHNhbXBsZVJhdGVTYnIsICAgICAgICAgICAgICAgLyohIHRoZSBzYnIgY29kZXIgc2FtcGxpbmcgcmF0ZSBpbiBIeiAqLworICAgIFVJTlQgdHJhbnNGYWMsICAgICAgICAgICAgICAgICAgICAvKiEgdGhlIHNob3J0IGJsb2NrIHRvIGxvbmcgYmxvY2sgcmF0aW8gKi8KKyAgICBVSU5UIHN0YW5kYXJkQml0cmF0ZSwgLyohIHRoZSBzdGFuZGFyZCBiaXRyYXRlIHBlciBjaGFubmVsIGluIGJpdHMvc2VjICovCisgICAgVUlOVCB2YnJNb2RlLCAvKiEgdGhlIHZiciBwYXJhbXRlciwgMCBwb29yIHF1YWxpdHkgLi4gMTAwIGhpZ2ggcXVhbGl0eSovCisgICAgVUlOVCB1c2VTcGVlY2hDb25maWcsICAgLyohPCBhZGFwdCB0dW5pbmcgcGFyYW1ldGVycyBmb3Igc3BlZWNoID8gKi8KKyAgICBVSU5UIGxjc01vZGUsICAgICAgICAgICAvKiEgdGhlIGxvdyBjb21wbGV4aXR5IHN0ZXJlbyBtb2RlICovCisgICAgVUlOVCBiUGFyYW1ldHJpY1N0ZXJlbywgLyohPCB1c2UgcGFyYW1ldHJpYyBzdGVyZW8gKi8KKyAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlKSAvKiBDb3JlIGF1ZGlvIGNvZGVjIG9iamVjdCB0eXBlICovCiB7CiAgIElOVCBpZHggPSBJTlZBTElEX1RBQkxFX0lEWDsKICAgLyogc2V0IHRoZSBjb3JlIGNvZGVjIHNldHRpbmdzICovCi0gIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5iaXRSYXRlICAgICAgICAgPSBiaXRSYXRlOwotICBjb25maWctPmNvZGVjU2V0dGluZ3MubkNoYW5uZWxzICAgICAgID0gbnVtQ2hhbm5lbHM7Ci0gIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5zYW1wbGVGcmVxICAgICAgPSBzYW1wbGVSYXRlQ29yZTsKLSAgY29uZmlnLT5jb2RlY1NldHRpbmdzLnRyYW5zRmFjICAgICAgICA9IHRyYW5zRmFjOworICBjb25maWctPmNvZGVjU2V0dGluZ3MuYml0UmF0ZSA9IGJpdFJhdGU7CisgIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHMgPSBudW1DaGFubmVsczsKKyAgY29uZmlnLT5jb2RlY1NldHRpbmdzLnNhbXBsZUZyZXEgPSBzYW1wbGVSYXRlQ29yZTsKKyAgY29uZmlnLT5jb2RlY1NldHRpbmdzLnRyYW5zRmFjID0gdHJhbnNGYWM7CiAgIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5zdGFuZGFyZEJpdHJhdGUgPSBzdGFuZGFyZEJpdHJhdGU7CiAKICAgaWYgKGJpdFJhdGUgPCAyODAwMCkgewogICAgIGNvbmZpZy0+dGhyZXNob2xkX0FtcFJlc19GRl9tID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CiAgICAgY29uZmlnLT50aHJlc2hvbGRfQW1wUmVzX0ZGX2UgPSA3OwotICB9Ci0gIGVsc2UgaWYgKGJpdFJhdGUgPj0gMjgwMDAgJiYgYml0UmF0ZSA8PSA0ODAwMCkgeworICB9IGVsc2UgaWYgKGJpdFJhdGUgPj0gMjgwMDAgJiYgYml0UmF0ZSA8PSA0ODAwMCkgewogICAgIC8qIFRoZSBmbG9hdCB0aHJlc2hvbGQgaXMgNzUKLSAgICAgICAwLjUyNDI4OGYgaXMgZnJhY3Rpb25hbCBwYXJ0IG9mIFJFTEFYQVRJT04sIHRoZSBxdW90YU1hdHJpeCBhbmQgdGhlcmVmb3JlIHRvbmFsaXR5IGFyZSBzY2FsZWQgYnkgdGhpcwotICAgICAgIDIvMyBpcyBiZWNhdXNlIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBkaXZpZGVzIHRoZSB0b25hbGl0eSB2YWx1ZXMgYnkgMywgaGVyZSBpdCdzIGRpdmlkZWQgYnkgMgotICAgICAgIDEyOCBjb21wZW5zYXRlcyB0aGUgbmVjZXNzYXJ5IHNoaWZ0ZmFjdG9yIG9mIDcgKi8KLSAgICBjb25maWctPnRocmVzaG9sZF9BbXBSZXNfRkZfbSA9IEZMMkZYQ09OU1RfREJMKDc1LjBmKjAuNTI0Mjg4Zi8oMi4wZi8zLjBmKS8xMjguMGYpOworICAgICAgIDAuNTI0Mjg4ZiBpcyBmcmFjdGlvbmFsIHBhcnQgb2YgUkVMQVhBVElPTiwgdGhlIHF1b3RhTWF0cml4IGFuZCB0aGVyZWZvcmUKKyAgICAgICB0b25hbGl0eSBhcmUgc2NhbGVkIGJ5IHRoaXMgMi8zIGlzIGJlY2F1c2UgdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uCisgICAgICAgZGl2aWRlcyB0aGUgdG9uYWxpdHkgdmFsdWVzIGJ5IDMsIGhlcmUgaXQncyBkaXZpZGVkIGJ5IDIgMTI4IGNvbXBlbnNhdGVzCisgICAgICAgdGhlIG5lY2Vzc2FyeSBzaGlmdGZhY3RvciBvZiA3ICovCisgICAgY29uZmlnLT50aHJlc2hvbGRfQW1wUmVzX0ZGX20gPQorICAgICAgICBGTDJGWENPTlNUX0RCTCg3NS4wZiAqIDAuNTI0Mjg4ZiAvICgyLjBmIC8gMy4wZikgLyAxMjguMGYpOwogICAgIGNvbmZpZy0+dGhyZXNob2xkX0FtcFJlc19GRl9lID0gNzsKLSAgfQotICBlbHNlIGlmIChiaXRSYXRlID4gNDgwMDApIHsKKyAgfSBlbHNlIGlmIChiaXRSYXRlID4gNDgwMDApIHsKICAgICBjb25maWctPnRocmVzaG9sZF9BbXBSZXNfRkZfbSA9IEZMMkZYQ09OU1RfREJMKDApOwogICAgIGNvbmZpZy0+dGhyZXNob2xkX0FtcFJlc19GRl9lID0gMDsKICAgfQogCi0gIGlmIChiaXRSYXRlPT0wKSB7CisgIGlmIChiaXRSYXRlID09IDApIHsKICAgICAvKiBtYXAgdmJyIHF1YWxpdHkgdG8gYml0cmF0ZSAqLwogICAgIGlmICh2YnJNb2RlIDwgMzApCiAgICAgICBiaXRSYXRlID0gMjQwMDA7CkBAIC00NDMsMzEgKzQ4OCwyOSBAQAogICAgICAgYml0UmF0ZSA9IDQ4MDAwOwogICAgIGJpdFJhdGUgKj0gbnVtQ2hhbm5lbHM7CiAgICAgLyogZml4IHRvIGVuYWJsZSBtb25vIHZick1vZGU8NDAgQCA0NC4xIG9mIDQ4a0h6ICovCi0gICAgaWYgKG51bUNoYW5uZWxzPT0xKSB7Ci0gICAgICBpZiAoc2FtcGxlUmF0ZVNicj09NDQxMDAgfHwgc2FtcGxlUmF0ZVNicj09NDgwMDApIHsKLSAgICAgICAgaWYgKHZick1vZGU8NDApIGJpdFJhdGUgPSAzMjAwMDsKKyAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMSkgeworICAgICAgaWYgKHNhbXBsZVJhdGVTYnIgPT0gNDQxMDAgfHwgc2FtcGxlUmF0ZVNiciA9PSA0ODAwMCkgeworICAgICAgICBpZiAodmJyTW9kZSA8IDQwKSBiaXRSYXRlID0gMzIwMDA7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgaWR4ID0gZ2V0U2JyVHVuaW5nVGFibGVJbmRleChiaXRSYXRlLG51bUNoYW5uZWxzLHNhbXBsZVJhdGVDb3JlLCBjb3JlLCBOVUxMKTsKKyAgaWR4ID0KKyAgICAgIGdldFNiclR1bmluZ1RhYmxlSW5kZXgoYml0UmF0ZSwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGVDb3JlLCBjb3JlLCBOVUxMKTsKIAogICBpZiAoaWR4ICE9IElOVkFMSURfVEFCTEVfSURYKSB7Ci0gICAgY29uZmlnLT5zdGFydEZyZXEgICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0YXJ0RnJlcSA7Ci0gICAgY29uZmlnLT5zdG9wRnJlcSAgICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0b3BGcmVxIDsKKyAgICBjb25maWctPnN0YXJ0RnJlcSA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RhcnRGcmVxOworICAgIGNvbmZpZy0+c3RvcEZyZXEgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0b3BGcmVxOwogICAgIGlmICh1c2VTcGVlY2hDb25maWcpIHsKLSAgICAgIGNvbmZpZy0+c3RhcnRGcmVxICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RhcnRGcmVxU3BlZWNoOwotICAgICAgY29uZmlnLT5zdG9wRnJlcSAgICAgID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdG9wRnJlcVNwZWVjaDsKKyAgICAgIGNvbmZpZy0+c3RhcnRGcmVxID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdGFydEZyZXFTcGVlY2g7CisgICAgICBjb25maWctPnN0b3BGcmVxID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdG9wRnJlcVNwZWVjaDsKICAgICB9CiAKICAgICAvKiBBZGFwdCBzdG9wIGZyZXF1ZW5jeSBpbiBjYXNlIG9mIGRvd25zYW1wbGVkIFNCUiAtIG9ubHkgMzIgYmFuZHMgdGhlbiAqLwogICAgIGlmICgxID09IGNvbmZpZy0+ZG93blNhbXBsZUZhY3RvcikgewogICAgICAgSU5UIGRzU3RvcEZyZXEgPSBGREtzYnJFbmNfR2V0RG93bnNhbXBsZWRTdG9wRnJlcSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlQ29yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnN0YXJ0RnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnN0b3BGcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+ZG93blNhbXBsZUZhY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgc2FtcGxlUmF0ZUNvcmUsIGNvbmZpZy0+c3RhcnRGcmVxLCBjb25maWctPnN0b3BGcmVxLAorICAgICAgICAgIGNvbmZpZy0+ZG93blNhbXBsZUZhY3Rvcik7CiAgICAgICBpZiAoZHNTdG9wRnJlcSA8IDApIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CkBAIC00NzUsNTIgKzUxOCw2OCBAQAogICAgICAgY29uZmlnLT5zdG9wRnJlcSA9IGRzU3RvcEZyZXE7CiAgICAgfQogCi0gICAgY29uZmlnLT5zYnJfbm9pc2VfYmFuZHMgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLm51bU5vaXNlQmFuZHMgOwotICAgIGlmIChjb3JlID09IEFPVF9FUl9BQUNfRUxEKQotICAgICAgY29uZmlnLT5pbml0X2FtcF9yZXNfRkYgPSBTQlJfQU1QX1JFU18xXzU7Ci0gICAgY29uZmlnLT5ub2lzZUZsb29yT2Zmc2V0PSBzYnJUdW5pbmdUYWJsZVtpZHhdLm5vaXNlRmxvb3JPZmZzZXQ7CisgICAgY29uZmlnLT5zYnJfbm9pc2VfYmFuZHMgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLm51bU5vaXNlQmFuZHM7CisgICAgaWYgKGNvcmUgPT0gQU9UX0VSX0FBQ19FTEQpIGNvbmZpZy0+aW5pdF9hbXBfcmVzX0ZGID0gU0JSX0FNUF9SRVNfMV81OworICAgIGNvbmZpZy0+bm9pc2VGbG9vck9mZnNldCA9IHNiclR1bmluZ1RhYmxlW2lkeF0ubm9pc2VGbG9vck9mZnNldDsKIAotICAgIGNvbmZpZy0+YW5hX21heF9sZXZlbCAgID0gc2JyVHVuaW5nVGFibGVbaWR4XS5ub2lzZU1heExldmVsIDsKLSAgICBjb25maWctPnN0ZXJlb01vZGUgICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RlcmVvTW9kZSA7Ci0gICAgY29uZmlnLT5mcmVxU2NhbGUgICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLmZyZXFTY2FsZSA7CisgICAgY29uZmlnLT5hbmFfbWF4X2xldmVsID0gc2JyVHVuaW5nVGFibGVbaWR4XS5ub2lzZU1heExldmVsOworICAgIGNvbmZpZy0+c3RlcmVvTW9kZSA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RlcmVvTW9kZTsKKyAgICBjb25maWctPmZyZXFTY2FsZSA9IHNiclR1bmluZ1RhYmxlW2lkeF0uZnJlcVNjYWxlOwogCiAgICAgaWYgKG51bUNoYW5uZWxzID09IDEpIHsKICAgICAgIC8qIHN0ZXJlbyBjYXNlICovCiAgICAgICBzd2l0Y2ggKGNvcmUpIHsKICAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgotICAgICAgICAgIGlmIChiaXRSYXRlIDw9ICh1c2VTcGVlY2hDb25maWc/MjQwMDBVOjIwMDAwVSkpIHsKLSAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzBdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBub24tc3BsaXQgZnJhbWVzICovCi0gICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igc3BsaXQgZnJhbWVzICovCisgICAgICAgICAgaWYgKGJpdFJhdGUgPD0gKHVzZVNwZWVjaENvbmZpZyA/IDI0MDAwVSA6IDIwMDAwVSkpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzBdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLXNwbGl0IGZyYW1lcyAqLworICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMV0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBmb3Igc3BsaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXMgKi8KICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CiAgICAgICAgICAgaWYgKGJpdFJhdGUgPCAzNjAwMCkKLSAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzFdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBzcGxpdCBmcmFtZXMgKi8KKyAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzFdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gZm9yIHNwbGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzICovCiAgICAgICAgICAgaWYgKGJpdFJhdGUgPCAyNjAwMCkgewotICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMF0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIG5vbi1zcGxpdCBmcmFtZXMgKi8KLSAgICAgICAgICAgIGNvbmZpZy0+ZlJlc1RyYW5zSXNMb3cgPSAxOyAgICAgICAgICAgICAgICAvKiBmb3IgdHJhbnNpZW50IGZyYW1lcywgc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLworICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMF0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tc3BsaXQgZnJhbWVzICovCisgICAgICAgICAgICBjb25maWctPmZSZXNUcmFuc0lzTG93ID0KKyAgICAgICAgICAgICAgICAxOyAvKiBmb3IgdHJhbnNpZW50IGZyYW1lcywgc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIC8qIHN0ZXJlbyBjYXNlICovCiAgICAgICBzd2l0Y2ggKGNvcmUpIHsKICAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgogICAgICAgICAgIGlmIChiaXRSYXRlIDw9IDI4MDAwKSB7Ci0gICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igbm9uLXNwbGl0IGZyYW1lcyAqLwotICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMV0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIHNwbGl0IGZyYW1lcyAqLworICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMF0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tc3BsaXQgZnJhbWVzICovCisgICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uIGZvciBzcGxpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcyAqLwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKICAgICAgICAgICBpZiAoYml0UmF0ZSA8IDcyMDAwKSB7Ci0gICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igc3BsaXQgZnJhbWVzICovCisgICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uIGZvciBzcGxpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcyAqLwogICAgICAgICAgIH0KICAgICAgICAgICBpZiAoYml0UmF0ZSA8IDUyMDAwKSB7Ci0gICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igbm9uLXNwbGl0IGZyYW1lcyAqLwotICAgICAgICAgICAgY29uZmlnLT5mUmVzVHJhbnNJc0xvdyA9IDE7ICAgICAgICAgICAgICAgIC8qIGZvciB0cmFuc2llbnQgZnJhbWVzLCBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCisgICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1zcGxpdCBmcmFtZXMgKi8KKyAgICAgICAgICAgIGNvbmZpZy0+ZlJlc1RyYW5zSXNMb3cgPQorICAgICAgICAgICAgICAgIDE7IC8qIGZvciB0cmFuc2llbnQgZnJhbWVzLCBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtNTM1LDI0ICs1OTQsMjIgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICAvKiBhZGp1c3QgdXNhZ2Ugb2YgcGFyYW1ldHJpYyBjb2RpbmcgZGVwZW5kZW50IG9uIGJpdHJhdGUgYW5kIHNwZWVjaCBjb25maWcgZmxhZyAqLwotICAgIGlmICh1c2VTcGVlY2hDb25maWcpCi0gICAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgID0gMDsKKyAgICAvKiBhZGp1c3QgdXNhZ2Ugb2YgcGFyYW1ldHJpYyBjb2RpbmcgZGVwZW5kZW50IG9uIGJpdHJhdGUgYW5kIHNwZWVjaCBjb25maWcKKyAgICAgKiBmbGFnICovCisgICAgaWYgKHVzZVNwZWVjaENvbmZpZykgY29uZmlnLT5wYXJhbWV0cmljQ29kaW5nID0gMDsKIAogICAgIGlmIChjb3JlID09IEFPVF9FUl9BQUNfRUxEKSB7Ci0gICAgICBpZiAoYml0UmF0ZSA8IDI4MDAwKQotICAgICAgICBjb25maWctPmluaXRfYW1wX3Jlc19GRiA9IFNCUl9BTVBfUkVTXzNfMDsKKyAgICAgIGlmIChiaXRSYXRlIDwgMjgwMDApIGNvbmZpZy0+aW5pdF9hbXBfcmVzX0ZGID0gU0JSX0FNUF9SRVNfM18wOwogICAgICAgY29uZmlnLT5TZW5kSGVhZGVyRGF0YVRpbWUgPSAtMTsKICAgICB9CiAKICAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMSkgewogICAgICAgaWYgKGJpdFJhdGUgPCAxNjAwMCkgewotICAgICAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgID0gMDsKKyAgICAgICAgY29uZmlnLT5wYXJhbWV0cmljQ29kaW5nID0gMDsKICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIGlmIChiaXRSYXRlIDwgMjAwMDApIHsKLSAgICAgICAgY29uZmlnLT5wYXJhbWV0cmljQ29kaW5nICA9IDA7CisgICAgICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyA9IDA7CiAgICAgICB9CiAgICAgfQogCkBAIC01NjEsMTcgKzYxOCwxNiBAQAogICAgIC8qIFBTIHNldHRpbmdzICovCiAgICAgY29uZmlnLT5iUGFyYW1ldHJpY1N0ZXJlbyA9IGJQYXJhbWV0cmljU3RlcmVvOwogCi0gICAgcmV0dXJuIDEgOwotICB9Ci0gIGVsc2UgewotICAgIHJldHVybiAwIDsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKICAgfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogIGZ1bmN0aW9ubmFtZTogRkRLc2JyRW5jX0luaXRpYWxpemVTYnJEZWZhdWx0cwotIGRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZXMgdGhlIFNCUiBjb25maWZ1cmF0aW9uCisgZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyB0aGUgU0JSIGNvbmZpZ3VyYXRpb24KICByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cwogIGlucHV0OiAgICAgICAgLSBjb3JlIGNvZGVjIHR5cGUsCiAgICAgICAgICAgICAgICAtIGZhY3RvciBvZiBTQlIgdG8gY29yZSBmcmFtZSBsZW5ndGgsCkBAIC01NzksNzcgKzYzNSw3NCBAQAogIG91dHB1dDogICAgICAgaW5pdGlhbGl6ZWQgU0JSIGNvbmZpZ3VyYXRpb24KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgVUlOVAotRkRLc2JyRW5jX0luaXRpYWxpemVTYnJEZWZhdWx0cyAoc2JyQ29uZmlndXJhdGlvblB0ciBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgIGRvd25TYW1wbGVGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgIGNvZGVjR3JhbnVsZUxlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsY29uc3QgSU5UICAgICAgICAgICBpc0xvd0RlbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgaWYgKCAoZG93blNhbXBsZUZhY3RvciA8IDEgfHwgZG93blNhbXBsZUZhY3RvciA+IDIpIHx8Ci0gICAgICAgICAoY29kZWNHcmFudWxlTGVuKmRvd25TYW1wbGVGYWN0b3IgPiBRTUZfQ0hBTk5FTFMqUU1GX01BWF9USU1FX1NMT1RTKSApCi0gICAgICAgcmV0dXJuKDApOyAvKiBlcnJvciAqLworc3RhdGljIFVJTlQgRkRLc2JyRW5jX0luaXRpYWxpemVTYnJEZWZhdWx0cyhzYnJDb25maWd1cmF0aW9uUHRyIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRvd25TYW1wbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgY29kZWNHcmFudWxlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaXNMb3dEZWxheSkgeworICBpZiAoKGRvd25TYW1wbGVGYWN0b3IgPCAxIHx8IGRvd25TYW1wbGVGYWN0b3IgPiAyKSB8fAorICAgICAgKGNvZGVjR3JhbnVsZUxlbiAqIGRvd25TYW1wbGVGYWN0b3IgPiA2NCAqIDMyKSkKKyAgICByZXR1cm4gKDApOyAvKiBlcnJvciAqLwogCi0gICAgY29uZmlnLT5TZW5kSGVhZGVyRGF0YVRpbWUgICAgID0gMTAwMDsKLSAgICBjb25maWctPnVzZVdhdmVDb2RpbmcgICAgICAgICAgPSAwOwotICAgIGNvbmZpZy0+Y3JjU2JyICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgY29uZmlnLT5keW5Cd1N1cHBvcnRlZCAgICAgICAgID0gMTsKLSAgICBpZiAoaXNMb3dEZWxheSkKLSAgICAgIGNvbmZpZy0+dHJhbl90aHIgICAgICAgICAgICAgPSA2MDAwOwotICAgIGVsc2UKLSAgICAgIGNvbmZpZy0+dHJhbl90aHIgICAgICAgICAgICAgPSAxMzAwMDsKKyAgY29uZmlnLT5TZW5kSGVhZGVyRGF0YVRpbWUgPSAxMDAwOworICBjb25maWctPnVzZVdhdmVDb2RpbmcgPSAwOworICBjb25maWctPmNyY1NiciA9IDA7CisgIGNvbmZpZy0+ZHluQndTdXBwb3J0ZWQgPSAxOworICBpZiAoaXNMb3dEZWxheSkKKyAgICBjb25maWctPnRyYW5fdGhyID0gNjAwMDsKKyAgZWxzZQorICAgIGNvbmZpZy0+dHJhbl90aHIgPSAxMzAwMDsKIAotICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyAgICAgICA9IDE7CisgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyA9IDE7CiAKLSAgICBjb25maWctPnNickZyYW1lU2l6ZSAgICAgICAgICAgPSBjb2RlY0dyYW51bGVMZW4gKiBkb3duU2FtcGxlRmFjdG9yOwotICAgIGNvbmZpZy0+ZG93blNhbXBsZUZhY3RvciAgICAgICA9IGRvd25TYW1wbGVGYWN0b3I7CisgIGNvbmZpZy0+c2JyRnJhbWVTaXplID0gY29kZWNHcmFudWxlTGVuICogZG93blNhbXBsZUZhY3RvcjsKKyAgY29uZmlnLT5kb3duU2FtcGxlRmFjdG9yID0gZG93blNhbXBsZUZhY3RvcjsKIAotICAgIC8qIHNiciBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KLSAgICBjb25maWctPnNicl9kYXRhX2V4dHJhICAgICAgICAgPSAwOwotICAgIGNvbmZpZy0+YW1wX3JlcyAgICAgICAgICAgICAgICA9IFNCUl9BTVBfUkVTXzNfMCA7Ci0gICAgY29uZmlnLT50cmFuX2ZjICAgICAgICAgICAgICAgID0gMCA7Ci0gICAgY29uZmlnLT50cmFuX2RldF9tb2RlICAgICAgICAgID0gMSA7Ci0gICAgY29uZmlnLT5zcHJlYWQgICAgICAgICAgICAgICAgID0gMSA7Ci0gICAgY29uZmlnLT5zdGF0ICAgICAgICAgICAgICAgICAgID0gMCA7Ci0gICAgY29uZmlnLT5lICAgICAgICAgICAgICAgICAgICAgID0gMSA7Ci0gICAgY29uZmlnLT5kZWx0YVRBY3Jvc3NGcmFtZXMgICAgID0gMSA7Ci0gICAgY29uZmlnLT5kRl9lZGdlXzFzdEVudiAgICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4zZikgOwotICAgIGNvbmZpZy0+ZEZfZWRnZV9pbmNyICAgICAgICAgICA9IEZMMkZYQ09OU1RfREJMKDAuM2YpIDsKKyAgLyogc2JyIGRlZmF1bHQgcGFyYW1ldGVycyAqLworICBjb25maWctPnNicl9kYXRhX2V4dHJhID0gMDsKKyAgY29uZmlnLT5hbXBfcmVzID0gU0JSX0FNUF9SRVNfM18wOworICBjb25maWctPnRyYW5fZmMgPSAwOworICBjb25maWctPnRyYW5fZGV0X21vZGUgPSAxOworICBjb25maWctPnNwcmVhZCA9IDE7CisgIGNvbmZpZy0+c3RhdCA9IDA7CisgIGNvbmZpZy0+ZSA9IDE7CisgIGNvbmZpZy0+ZGVsdGFUQWNyb3NzRnJhbWVzID0gMTsKKyAgY29uZmlnLT5kRl9lZGdlXzFzdEVudiA9IEZMMkZYQ09OU1RfREJMKDAuM2YpOworICBjb25maWctPmRGX2VkZ2VfaW5jciA9IEZMMkZYQ09OU1RfREJMKDAuM2YpOwogCi0gICAgY29uZmlnLT5zYnJfaW52Zl9tb2RlICAgPSBJTlZGX1NXSVRDSEVEOwotICAgIGNvbmZpZy0+c2JyX3hwb3NfbW9kZSAgID0gWFBPU19MQzsKLSAgICBjb25maWctPnNicl94cG9zX2N0cmwgICA9IFNCUl9YUE9TX0NUUkxfREVGQVVMVDsKLSAgICBjb25maWctPnNicl94cG9zX2xldmVsICA9IDA7Ci0gICAgY29uZmlnLT51c2VTYVBhbiAgICAgICAgPSAwOwotICAgIGNvbmZpZy0+ZHluQndFbmFibGVkICAgID0gMDsKKyAgY29uZmlnLT5zYnJfaW52Zl9tb2RlID0gSU5WRl9TV0lUQ0hFRDsKKyAgY29uZmlnLT5zYnJfeHBvc19tb2RlID0gWFBPU19MQzsKKyAgY29uZmlnLT5zYnJfeHBvc19jdHJsID0gU0JSX1hQT1NfQ1RSTF9ERUZBVUxUOworICBjb25maWctPnNicl94cG9zX2xldmVsID0gMDsKKyAgY29uZmlnLT51c2VTYVBhbiA9IDA7CisgIGNvbmZpZy0+ZHluQndFbmFibGVkID0gMDsKIAorICAvKiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIG92ZXJ3cml0dGVuIGJ5IHRoZQorICAgICBGREtzYnJFbmNfQWRqdXN0U2JyU2V0dGluZ3MoKSBmdW5jdGlvbiBzaW5jZSB0aGV5IGFyZSBpbmNsdWRlZCBpbiB0aGUKKyAgICAgdHVuaW5nIHRhYmxlICovCisgIGNvbmZpZy0+c3RlcmVvTW9kZSA9IFNCUl9TV0lUQ0hfTFJDOworICBjb25maWctPmFuYV9tYXhfbGV2ZWwgPSA2OworICBjb25maWctPm5vaXNlRmxvb3JPZmZzZXQgPSAwOworICBjb25maWctPnN0YXJ0RnJlcSA9IDU7IC8qICA1LjkgcmVzcGVjdGl2ZWx5ICA2LjAga0h6IGF0IGZzID0gNDQuMS80OCBrSHogKi8KKyAgY29uZmlnLT5zdG9wRnJlcSA9IDk7ICAvKiAxNi4yIHJlc3BlY3RpdmVseSAxNi44IGtIeiBhdCBmcyA9IDQ0LjEvNDgga0h6ICovCisgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzBdID0gRlJFUV9SRVNfSElHSDsgLyogbm9uLXNwbGl0IGNhc2UgKi8KKyAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMV0gPSBGUkVRX1JFU19ISUdIOyAvKiBzcGxpdCBjYXNlICovCisgIGNvbmZpZy0+ZlJlc1RyYW5zSXNMb3cgPSAwOyAvKiBmb3IgdHJhbnNpZW50IGZyYW1lcywgc2V0IHZhcmlhYmxlIGZyZXF1ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBhY2NvcmRpbmcgdG8gZnJlcVJlc1RhYmxlICovCiAKLSAgICAvKiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBGREtzYnJFbmNfQWRqdXN0U2JyU2V0dGluZ3MoKSBmdW5jdGlvbiBzaW5jZQotICAgICAgIHRoZXkgYXJlIGluY2x1ZGVkIGluIHRoZSB0dW5pbmcgdGFibGUgKi8KLSAgICBjb25maWctPnN0ZXJlb01vZGUgICAgICAgICAgICAgPSBTQlJfU1dJVENIX0xSQzsKLSAgICBjb25maWctPmFuYV9tYXhfbGV2ZWwgICAgICAgICAgPSA2OwotICAgIGNvbmZpZy0+bm9pc2VGbG9vck9mZnNldCAgICAgICA9IDA7Ci0gICAgY29uZmlnLT5zdGFydEZyZXEgICAgICAgICAgICAgID0gNTsgLyogIDUuOSByZXNwZWN0aXZlbHkgIDYuMCBrSHogYXQgZnMgPSA0NC4xLzQ4IGtIeiAqLwotICAgIGNvbmZpZy0+c3RvcEZyZXEgICAgICAgICAgICAgICA9IDk7IC8qIDE2LjIgcmVzcGVjdGl2ZWx5IDE2Ljgga0h6IGF0IGZzID0gNDQuMS80OCBrSHogKi8KLSAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSAgICAgPSBGUkVRX1JFU19ISUdIOyAgLyogbm9uLXNwbGl0IGNhc2UgKi8KLSAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSAgICAgPSBGUkVRX1JFU19ISUdIOyAgLyogc3BsaXQgY2FzZSAqLwotICAgIGNvbmZpZy0+ZlJlc1RyYW5zSXNMb3cgPSAwOyAgLyogZm9yIHRyYW5zaWVudCBmcmFtZXMsIHNldCB2YXJpYWJsZSBmcmVxdWVuY3kgcmVzb2x1dGlvbiBhY2NvcmRpbmcgdG8gZnJlcVJlc1RhYmxlICovCisgIC8qIGhlYWRlcl9leHRyYV8xICovCisgIGNvbmZpZy0+ZnJlcVNjYWxlID0gU0JSX0ZSRVFfU0NBTEVfREVGQVVMVDsKKyAgY29uZmlnLT5hbHRlclNjYWxlID0gU0JSX0FMVEVSX1NDQUxFX0RFRkFVTFQ7CisgIGNvbmZpZy0+c2JyX25vaXNlX2JhbmRzID0gU0JSX05PSVNFX0JBTkRTX0RFRkFVTFQ7CiAKLSAgICAvKiBoZWFkZXJfZXh0cmFfMSAqLwotICAgIGNvbmZpZy0+ZnJlcVNjYWxlICAgICAgID0gU0JSX0ZSRVFfU0NBTEVfREVGQVVMVDsKLSAgICBjb25maWctPmFsdGVyU2NhbGUgICAgICA9IFNCUl9BTFRFUl9TQ0FMRV9ERUZBVUxUOwotICAgIGNvbmZpZy0+c2JyX25vaXNlX2JhbmRzID0gU0JSX05PSVNFX0JBTkRTX0RFRkFVTFQ7CisgIC8qIGhlYWRlcl9leHRyYV8yICovCisgIGNvbmZpZy0+c2JyX2xpbWl0ZXJfYmFuZHMgPSBTQlJfTElNSVRFUl9CQU5EU19ERUZBVUxUOworICBjb25maWctPnNicl9saW1pdGVyX2dhaW5zID0gU0JSX0xJTUlURVJfR0FJTlNfREVGQVVMVDsKKyAgY29uZmlnLT5zYnJfaW50ZXJwb2xfZnJlcSA9IFNCUl9JTlRFUlBPTF9GUkVRX0RFRkFVTFQ7CisgIGNvbmZpZy0+c2JyX3Ntb290aGluZ19sZW5ndGggPSBTQlJfU01PT1RISU5HX0xFTkdUSF9ERUZBVUxUOwogCi0gICAgLyogaGVhZGVyX2V4dHJhXzIgKi8KLSAgICBjb25maWctPnNicl9saW1pdGVyX2JhbmRzICAgID0gU0JSX0xJTUlURVJfQkFORFNfREVGQVVMVDsKLSAgICBjb25maWctPnNicl9saW1pdGVyX2dhaW5zICAgID0gU0JSX0xJTUlURVJfR0FJTlNfREVGQVVMVDsKLSAgICBjb25maWctPnNicl9pbnRlcnBvbF9mcmVxICAgID0gU0JSX0lOVEVSUE9MX0ZSRVFfREVGQVVMVDsKLSAgICBjb25maWctPnNicl9zbW9vdGhpbmdfbGVuZ3RoID0gU0JSX1NNT09USElOR19MRU5HVEhfREVGQVVMVDsKLQotICAgIHJldHVybiAxOworICByZXR1cm4gMTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogIGZ1bmN0aW9ubmFtZTogRGVsZXRlRW52Q2hhbm5lbApAQCAtNjU5LDE5ICs3MTIsMTQgQEAKICBvdXRwdXQ6ICAgICAgIHJlbGVhc2VkIGhhbmRsZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1kZWxldGVFbnZDaGFubmVsIChIQU5ETEVfRU5WX0NIQU5ORUwgaEVudkN1dCkKLXsKK3N0YXRpYyB2b2lkIGRlbGV0ZUVudkNoYW5uZWwoSEFORExFX0VOVl9DSEFOTkVMIGhFbnZDdXQpIHsKICAgaWYgKGhFbnZDdXQpIHsKLQogICAgIEZES3NickVuY19EZWxldGVUb25Db3JyUGFyYW1FeHRyKCZoRW52Q3V0LT5Ub25Db3JyKTsKIAotICAgIEZES3NickVuY19kZWxldGVFeHRyYWN0U2JyRW52ZWxvcGUgKCZoRW52Q3V0LT5zYnJFeHRyYWN0RW52ZWxvcGUpOworICAgIEZES3NickVuY19kZWxldGVFeHRyYWN0U2JyRW52ZWxvcGUoJmhFbnZDdXQtPnNickV4dHJhY3RFbnZlbG9wZSk7CiAgIH0KLQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgZnVuY3Rpb25uYW1lOiBzYnJFbmNvZGVyX0NoYW5uZWxDbG9zZQpAQCAtNjgxLDEyICs3MjksOSBAQAogIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotc2JyRW5jb2Rlcl9DaGFubmVsQ2xvc2UoSEFORExFX1NCUl9DSEFOTkVMIGhTYnJDaGFubmVsKQotewotICBpZiAoaFNickNoYW5uZWwgIT0gTlVMTCkKLSAgewotICAgIGRlbGV0ZUVudkNoYW5uZWwgKCZoU2JyQ2hhbm5lbC0+aEVudkNoYW5uZWwpOworc3RhdGljIHZvaWQgc2JyRW5jb2Rlcl9DaGFubmVsQ2xvc2UoSEFORExFX1NCUl9DSEFOTkVMIGhTYnJDaGFubmVsKSB7CisgIGlmIChoU2JyQ2hhbm5lbCAhPSBOVUxMKSB7CisgICAgZGVsZXRlRW52Q2hhbm5lbCgmaFNickNoYW5uZWwtPmhFbnZDaGFubmVsKTsKICAgfQogfQogCkBAIC02OTksNjcgKzc0NCw2MCBAQAogIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotc2JyRW5jb2Rlcl9FbGVtZW50Q2xvc2UoSEFORExFX1NCUl9FTEVNRU5UICpwaFNickVsZW1lbnQpCi17CitzdGF0aWMgdm9pZCBzYnJFbmNvZGVyX0VsZW1lbnRDbG9zZShIQU5ETEVfU0JSX0VMRU1FTlQgKnBoU2JyRWxlbWVudCkgewogICBIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsZW1lbnQgPSAqcGhTYnJFbGVtZW50OwogCi0gIGlmIChoU2JyRWxlbWVudCE9TlVMTCkgeworICBpZiAoaFNickVsZW1lbnQgIT0gTlVMTCkgewogICAgIGlmIChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyKQogICAgICAgRnJlZVJhbV9TYnJfdl9rX21hc3RlcigmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudl9rX21hc3Rlcik7CiAgICAgaWYgKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dKQotICAgICAgRnJlZVJhbV9TYnJfZnJlcUJhbmRUYWJsZUxPKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0xPXSk7CisgICAgICBGcmVlUmFtX1Nicl9mcmVxQmFuZFRhYmxlTE8oCisgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dKTsKICAgICBpZiAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV0pCi0gICAgICBGcmVlUmFtX1Nicl9mcmVxQmFuZFRhYmxlSEkoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbSEldKTsKKyAgICAgIEZyZWVSYW1fU2JyX2ZyZXFCYW5kVGFibGVISSgKKyAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV0pOwogCiAgICAgRnJlZVJhbV9TYnJFbGVtZW50KHBoU2JyRWxlbWVudCk7CiAgIH0KLSAgcmV0dXJuIDsKLQorICByZXR1cm47CiB9CiAKLQotdm9pZCBzYnJFbmNvZGVyX0Nsb3NlIChIQU5ETEVfU0JSX0VOQ09ERVIgKnBoU2JyRW5jb2RlcikKLXsKK3ZvaWQgc2JyRW5jb2Rlcl9DbG9zZShIQU5ETEVfU0JSX0VOQ09ERVIgKnBoU2JyRW5jb2RlcikgewogICBIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIgPSAqcGhTYnJFbmNvZGVyOwogCi0gIGlmIChoU2JyRW5jb2RlciAhPSBOVUxMKQotICB7CisgIGlmIChoU2JyRW5jb2RlciAhPSBOVUxMKSB7CiAgICAgaW50IGVsLCBjaDsKIAotICAgIGZvciAoZWw9MDsgZWw8KDgpOyBlbCsrKQotICAgIHsKLSAgICAgIGlmIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0hPU5VTEwpIHsKKyAgICBmb3IgKGVsID0gMDsgZWwgPCAoOCk7IGVsKyspIHsKKyAgICAgIGlmIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0gIT0gTlVMTCkgewogICAgICAgICBzYnJFbmNvZGVyX0VsZW1lbnRDbG9zZSgmaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdKTsKICAgICAgIH0KICAgICB9CiAKICAgICAvKiBDbG9zZSBzYnIgQ2hhbm5lbHMgKi8KLSAgICBmb3IgKGNoPTA7IGNoPCg4KTsgY2grKykKLSAgICB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgKDgpOyBjaCsrKSB7CiAgICAgICBpZiAoaFNickVuY29kZXItPnBTYnJDaGFubmVsW2NoXSkgewogICAgICAgICBzYnJFbmNvZGVyX0NoYW5uZWxDbG9zZShoU2JyRW5jb2Rlci0+cFNickNoYW5uZWxbY2hdKTsKICAgICAgICAgRnJlZVJhbV9TYnJDaGFubmVsKCZoU2JyRW5jb2Rlci0+cFNickNoYW5uZWxbY2hdKTsKICAgICAgIH0KIAogICAgICAgaWYgKGhTYnJFbmNvZGVyLT5RbWZBbmFseXNpc1tjaF0uRmlsdGVyU3RhdGVzKQotICAgICAgICBGcmVlUmFtX1Nicl9RbWZTdGF0ZXNBbmFseXNpcygoRklYUF9RQVMqKikmaFNickVuY29kZXItPlFtZkFuYWx5c2lzW2NoXS5GaWx0ZXJTdGF0ZXMpOwotCi0KKyAgICAgICAgRnJlZVJhbV9TYnJfUW1mU3RhdGVzQW5hbHlzaXMoCisgICAgICAgICAgICAoRklYUF9RQVMgKiopJmhTYnJFbmNvZGVyLT5RbWZBbmFseXNpc1tjaF0uRmlsdGVyU3RhdGVzKTsKICAgICB9CiAKICAgICBpZiAoaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKQogICAgICAgUFNFbmNfRGVzdHJveSgmaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKTsKICAgICBpZiAoaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLkZpbHRlclN0YXRlcykKLSAgICAgIEZyZWVSYW1fUHNRbWZTdGF0ZXNTeW50aGVzaXMoKEZJWFBfREJMKiopJmhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXMpOworICAgICAgRnJlZVJhbV9Qc1FtZlN0YXRlc1N5bnRoZXNpcygKKyAgICAgICAgICAoRklYUF9EQkwgKiopJmhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXMpOwogCiAgICAgLyogUmVsZWFzZSBPdmVybGF5ICovCi0gICAgRnJlZVJhbV9TYnJEeW5hbWljX1JBTSgoRklYUF9EQkwqKikmaFNickVuY29kZXItPnBTQlJkeW5hbWljX1JBTSk7Ci0KKyAgICBpZiAoaFNickVuY29kZXItPnBTQlJkeW5hbWljX1JBTSkKKyAgICAgIEZyZWVSYW1fU2JyRHluYW1pY19SQU0oKEZJWFBfREJMICoqKSZoU2JyRW5jb2Rlci0+cFNCUmR5bmFtaWNfUkFNKTsKIAogICAgIEZyZWVSYW1fU2JyRW5jb2RlcihwaFNickVuY29kZXIpOwogICB9Ci0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03NzEsNjcgKzgwOSw0NCBAQAogIG91dHB1dDogICAgICAgZXJyb3IgaW5mbwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgdXBkYXRlRnJlcUJhbmRUYWJsZSgKLSAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSAgc2JyQ29uZmlnRGF0YSwKLSAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSAgc2JySGVhZGVyRGF0YSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgZG93blNhbXBsZUZhY3RvcgotICAgICAgICApCi17CitzdGF0aWMgSU5UIHVwZGF0ZUZyZXFCYW5kVGFibGUoSEFORExFX1NCUl9DT05GSUdfREFUQSBzYnJDb25maWdEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZG93blNhbXBsZUZhY3RvcikgewogICBJTlQgazAsIGsyOwogCi0gIGlmKCBGREtzYnJFbmNfRmluZFN0YXJ0QW5kU3RvcEJhbmQgKAotICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxLAotICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxID4+IChkb3duU2FtcGxlRmFjdG9yLTEpLAotICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzLAotICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfc3RhcnRfZnJlcXVlbmN5LAotICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfc3RvcF9mcmVxdWVuY3ksCi0gICAgICAgICAgICAgJmswLAotICAgICAgICAgICAgICZrMgotICAgICAgICAgICAgICApCi0gICAgKQotICAgIHJldHVybigxKTsKKyAgaWYgKEZES3NickVuY19GaW5kU3RhcnRBbmRTdG9wQmFuZCgKKyAgICAgICAgICBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxLAorICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEgPj4gKGRvd25TYW1wbGVGYWN0b3IgLSAxKSwKKyAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzLCBzYnJIZWFkZXJEYXRhLT5zYnJfc3RhcnRfZnJlcXVlbmN5LAorICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9zdG9wX2ZyZXF1ZW5jeSwgJmswLCAmazIpKQorICAgIHJldHVybiAoMSk7CiAKKyAgaWYgKEZES3NickVuY19VcGRhdGVGcmVxU2NhbGUoCisgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+dl9rX21hc3RlciwgJnNickNvbmZpZ0RhdGEtPm51bV9NYXN0ZXIsIGswLCBrMiwKKyAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5mcmVxU2NhbGUsIHNickhlYWRlckRhdGEtPmFsdGVyU2NhbGUpKQorICAgIHJldHVybiAoMSk7CiAKLSAgaWYoIEZES3NickVuY19VcGRhdGVGcmVxU2NhbGUoCi0gICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnZfa19tYXN0ZXIsCi0gICAgICAgICAgICAgJnNickNvbmZpZ0RhdGEtPm51bV9NYXN0ZXIsCi0gICAgICAgICAgICAgIGswLAotICAgICAgICAgICAgICBrMiwKLSAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+ZnJlcVNjYWxlLAotICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5hbHRlclNjYWxlCi0gICAgICAgICAgICAgICkKLSAgICApCi0gICAgcmV0dXJuKDEpOworICBzYnJIZWFkZXJEYXRhLT5zYnJfeG92ZXJfYmFuZCA9IDA7CiAKLQotICBzYnJIZWFkZXJEYXRhLT5zYnJfeG92ZXJfYmFuZD0wOwotCi0KLSAgaWYoIEZES3NickVuY19VcGRhdGVIaVJlcygKLSAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtISV0sCi0gICAgICAgICAgICAgICZzYnJDb25maWdEYXRhLT5uU2ZiW0hJXSwKLSAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+dl9rX21hc3RlciwKLSAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bnVtX01hc3RlciwKLSAgICAgICAgICAgICAgJnNickhlYWRlckRhdGEtPnNicl94b3Zlcl9iYW5kCi0gICAgICAgICAgICAgICkKLSAgICApCi0gICAgcmV0dXJuKDEpOwotCisgIGlmIChGREtzYnJFbmNfVXBkYXRlSGlSZXMoc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtISV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNickNvbmZpZ0RhdGEtPm5TZmJbSEldLCBzYnJDb25maWdEYXRhLT52X2tfbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm51bV9NYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNickhlYWRlckRhdGEtPnNicl94b3Zlcl9iYW5kKSkKKyAgICByZXR1cm4gKDEpOwogCiAgIEZES3NickVuY19VcGRhdGVMb1JlcygKLSAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0xPXSwKLSAgICAgICAgICAmc2JyQ29uZmlnRGF0YS0+blNmYltMT10sCi0gICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtISV0sCi0gICAgICAgICAgc2JyQ29uZmlnRGF0YS0+blNmYltISV0KLSAgICAgICAgICApOworICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtMT10sICZzYnJDb25maWdEYXRhLT5uU2ZiW0xPXSwKKyAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbSEldLCBzYnJDb25maWdEYXRhLT5uU2ZiW0hJXSk7CiAKLQotICBzYnJDb25maWdEYXRhLT54T3ZlckZyZXEgPSAoc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtMT1dfUkVTXVswXSAqIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEgLyBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzKzEpPj4xOworICBzYnJDb25maWdEYXRhLT54T3ZlckZyZXEgPQorICAgICAgKHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbTE9XX1JFU11bMF0gKiBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxIC8KKyAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcyArCisgICAgICAgMSkgPj4KKyAgICAgIDE7CiAKICAgcmV0dXJuICgwKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogIGZ1bmN0aW9ubmFtZTogcmVzZXRFbnZDaGFubmVsCkBAIC04NDEsMjcgKzg1NiwyNiBAQAogIG91dHB1dDogICAgICAgaEVudgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgcmVzZXRFbnZDaGFubmVsIChIQU5ETEVfU0JSX0NPTkZJR19EQVRBICBzYnJDb25maWdEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgIHNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMICAgICAgaEVudikKLXsKLSAgLyogbm90ZSAhISEgaEVudi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kcyB3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgaW4gZnVuY3Rpb24gRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZSAhISEqLwotICBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub2lzZUJhbmRzID0gIHNickhlYWRlckRhdGEtPnNicl9ub2lzZV9iYW5kczsKK3N0YXRpYyBJTlQgcmVzZXRFbnZDaGFubmVsKEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgc2JyQ29uZmlnRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoRW52KSB7CisgIC8qIG5vdGUgISEhIGhFbnYtPmVuY0VudkRhdGEubm9PZm5vaXNlYmFuZHMgd2lsbCBiZSB1cGRhdGVkIGxhdGVyIGluIGZ1bmN0aW9uCisgICAqIEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUgISEhKi8KKyAgaEVudi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9pc2VCYW5kcyA9CisgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfbm9pc2VfYmFuZHM7CiAKKyAgaWYgKEZES3NickVuY19SZXNldFRvbkNvcnJQYXJhbUV4dHIoCisgICAgICAgICAgJmhFbnYtPlRvbkNvcnIsIHNickNvbmZpZ0RhdGEtPnhwb3NDdHJsU3dpdGNoLAorICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbSEldWzBdLCBzYnJDb25maWdEYXRhLT52X2tfbWFzdGVyLAorICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm51bV9NYXN0ZXIsIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEsCisgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZSwgc2JyQ29uZmlnRGF0YS0+blNmYiwKKyAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzKSkKKyAgICByZXR1cm4gKDEpOwogCi0gIGlmKEZES3NickVuY19SZXNldFRvbkNvcnJQYXJhbUV4dHIoJmhFbnYtPlRvbkNvcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT54cG9zQ3RybFN3aXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbSEldWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+dl9rX21hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm51bV9NYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzKSkKLSAgICByZXR1cm4oMSk7Ci0KLSAgaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IublNmYltMT10gPSBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7Ci0gIGhFbnYtPnNickNvZGVOb2lzZUZsb29yLm5TZmJbSEldID0gaEVudi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzOworICBoRW52LT5zYnJDb2RlTm9pc2VGbG9vci5uU2ZiW0xPXSA9CisgICAgICBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7CisgIGhFbnYtPnNickNvZGVOb2lzZUZsb29yLm5TZmJbSEldID0KKyAgICAgIGhFbnYtPlRvbkNvcnIuc2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kczsKIAogICBoRW52LT5zYnJDb2RlRW52ZWxvcGUublNmYltMT10gPSBzYnJDb25maWdEYXRhLT5uU2ZiW0xPXTsKICAgaEVudi0+c2JyQ29kZUVudmVsb3BlLm5TZmJbSEldID0gc2JyQ29uZmlnRGF0YS0+blNmYltISV07CkBAIC04NzQsMTYgKzg4OCwxNyBAQAogICByZXR1cm4gKDApOwogfQogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRkRLc2JyRW5jX1NickdldFhPdmVyRnJlcSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRkRLc2JyRW5jX1NickdldFhPdmVyRnJlcQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqCiAgKiBAZm4KICAqIEBicmllZiAgICAgICBjYWxjdWxhdGVzIHRoZSBjbG9zZXN0IHBvc3NpYmxlIGNyb3Nzb3ZlciBmcmVxdWVuY3kKICAqIEByZXR1cm4gICAgICB0aGUgY3Jvc3NvdmVyIGZyZXF1ZW5jeSBTQlIgYWNjZXB0cwogICoKICAqLwotc3RhdGljIElOVAotRkRLc2JyRW5jX1NickdldFhPdmVyRnJlcShIQU5ETEVfU0JSX0VMRU1FTlQgIGhFbnYsICAgICAgICAvKiE8IGhhbmRsZSB0byBTQlIgZW5jb2RlciBpbnN0YW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgIHhvdmVyRnJlcSkgICAvKiE8IGZyb20gY29yZSBjb2RlciBzdWdnZXN0ZWQgY3Jvc3NvdmVyIGZyZXF1ZW5jeSAqLworc3RhdGljIElOVCBGREtzYnJFbmNfU2JyR2V0WE92ZXJGcmVxKAorICAgIEhBTkRMRV9TQlJfRUxFTUVOVCBoRW52LCAvKiE8IGhhbmRsZSB0byBTQlIgZW5jb2RlciBpbnN0YW5jZSAqLworICAgIElOVCB4b3ZlckZyZXEpIC8qITwgZnJvbSBjb3JlIGNvZGVyIHN1Z2dlc3RlZCBjcm9zc292ZXIgZnJlcXVlbmN5ICovCiB7CiAgIElOVCBiYW5kOwogICBJTlQgbGFzdERpZmYsIG5ld0RpZmY7CkBAIC04OTIsMTMgKzkwNywxNSBAQAogICBVQ0hBUiAqUkVTVFJJQ1QgcFZLTWFzdGVyID0gaEVudi0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyOwogCiAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgY3V0b2ZmIGZyZXF1ZW5jeSBpbiB0aGUgbWFzdGVyIHRhYmxlICovCi0gIGN1dG9mZlNiID0gKDQqeG92ZXJGcmVxICogaEVudi0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzIC8gaEVudi0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxICsgMSk+PjE7CisgIGN1dG9mZlNiID0gKDQgKiB4b3ZlckZyZXEgKiBoRW52LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMgLworICAgICAgICAgICAgICAgICAgaEVudi0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxICsKKyAgICAgICAgICAgICAgMSkgPj4KKyAgICAgICAgICAgICAxOwogICBsYXN0RGlmZiA9IGN1dG9mZlNiOwogICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgaEVudi0+c2JyQ29uZmlnRGF0YS5udW1fTWFzdGVyOyBiYW5kKyspIHsKLQogICAgIG5ld0RpZmYgPSBmaXhwX2FicygoSU5UKXBWS01hc3RlcltiYW5kXSAtIGN1dG9mZlNiKTsKIAotICAgIGlmKG5ld0RpZmYgPj0gbGFzdERpZmYpIHsKKyAgICBpZiAobmV3RGlmZiA+PSBsYXN0RGlmZikgewogICAgICAgYmFuZC0tOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtOTA2LDcgKzkyMywxMCBAQAogICAgIGxhc3REaWZmID0gbmV3RGlmZjsKICAgfQogCi0gIHJldHVybiAoKHBWS01hc3RlcltiYW5kXSAqIGhFbnYtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcS9oRW52LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMrMSk+PjEpOworICByZXR1cm4gKChwVktNYXN0ZXJbYmFuZF0gKiBoRW52LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgLworICAgICAgICAgICAgICAgaEVudi0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzICsKKyAgICAgICAgICAgMSkgPj4KKyAgICAgICAgICAxKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC05MTgsMzIgKzkzOCwyNyBAQAogIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19FbnZFbmNvZGVGcmFtZShIQU5ETEVfU0JSX0VOQ09ERVIgICBoRW52RW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBpRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAgICpzYW1wbGVzLCAgICAgICAgICAgICAgICAgLyohPCB0aW1lIHNhbXBsZXMsIGFsd2F5cyBpbnRlcmxlYXZlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwgICAgICAgICAgICAvKiE8IHRpbWUgYnVmZmVyIGNoYW5uZWwgaW50ZXJsZWF2aW5nIHN0cmlkZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgKnNickRhdGFCaXRzLCAgICAgICAgICAgICAvKiE8IFNpemUgb2YgU0JSIHBheWxvYWQgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAqc2JyRGF0YSwgICAgICAgICAgICAgICAgIC8qITwgU0JSIHBheWxvYWQgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgY2xlYXJPdXRwdXQgICAgICAgICAgICAgIC8qITwgRG8gbm90IGNvbnNpZGVyIGFueSBpbnB1dCBzaWduYWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK0lOVCBGREtzYnJFbmNfRW52RW5jb2RlRnJhbWUoCisgICAgSEFORExFX1NCUl9FTkNPREVSIGhFbnZFbmNvZGVyLCBpbnQgaUVsZW1lbnQsCisgICAgSU5UX1BDTSAqc2FtcGxlcywgICAgLyohPCB0aW1lIHNhbXBsZXMsIGFsd2F5cyBkZWludGVybGVhdmVkICovCisgICAgVUlOVCBzYW1wbGVzQnVmU2l6ZSwgLyohPCB0aW1lIGJ1ZmZlciBjaGFubmVsIHN0cmlkZSAqLworICAgIFVJTlQgKnNickRhdGFCaXRzLCAgIC8qITwgU2l6ZSBvZiBTQlIgcGF5bG9hZCAgKi8KKyAgICBVQ0hBUiAqc2JyRGF0YSwgICAgICAvKiE8IFNCUiBwYXlsb2FkICAqLworICAgIGludCBjbGVhck91dHB1dCAgICAgIC8qITwgRG8gbm90IGNvbnNpZGVyIGFueSBpbnB1dCBzaWduYWwgKi8KKykgewogICBIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsZW1lbnQgPSBOVUxMOwotICBGREtfQ1JDSU5GTyAgY3JjSW5mbzsKLSAgSU5UICAgIGNyY1JlZzsKLSAgSU5UICAgIGNoOwotICBJTlQgICAgYmFuZDsKLSAgSU5UICAgIGN1dG9mZlNiOwotICBJTlQgICAgbmV3WE92ZXI7CisgIEZES19DUkNJTkZPIGNyY0luZm87CisgIElOVCBjcmNSZWc7CisgIElOVCBjaDsKKyAgSU5UIGJhbmQ7CisgIElOVCBjdXRvZmZTYjsKKyAgSU5UIG5ld1hPdmVyOwogCi0gIGlmIChoRW52RW5jb2RlciA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKKyAgaWYgKGhFbnZFbmNvZGVyID09IE5VTEwpIHJldHVybiAtMTsKIAogICBoU2JyRWxlbWVudCA9IGhFbnZFbmNvZGVyLT5zYnJFbGVtZW50W2lFbGVtZW50XTsKIAotICBpZiAoaFNickVsZW1lbnQgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KKyAgaWYgKGhTYnJFbGVtZW50ID09IE5VTEwpIHJldHVybiAtMTsKIAogICAvKiBoZWFkZXIgYml0c3RyZWFtIGhhbmRsaW5nICovCiAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSA9ICZoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YTsKQEAgLTk1MSwzMyArOTY2LDMzIEBACiAgIElOVCBwc0hlYWRlckFjdGl2ZSA9IDA7CiAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSA9IDA7CiAKLSAgLyogQW50aWNpcGF0ZSBQUyBoZWFkZXIgYmVjYXVzZSBvZiBpbnRlcm5hbCBQUyBiaXRzdHJlYW0gZGVsYXkgaW4gb3JkZXIgdG8gYmUgaW4gc3luYyB3aXRoIFNCUiBoZWFkZXIuICovCi0gIGlmICggc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YT09KHNickJpdHN0cmVhbURhdGEtPk5yU2VuZEhlYWRlckRhdGEtMSkgKQotICB7Ci0gICAgICBwc0hlYWRlckFjdGl2ZSA9IDE7CisgIC8qIEFudGljaXBhdGUgUFMgaGVhZGVyIGJlY2F1c2Ugb2YgaW50ZXJuYWwgUFMgYml0c3RyZWFtIGRlbGF5IGluIG9yZGVyIHRvIGJlCisgICAqIGluIHN5bmMgd2l0aCBTQlIgaGVhZGVyLiAqLworICBpZiAoc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSA9PQorICAgICAgKHNickJpdHN0cmVhbURhdGEtPk5yU2VuZEhlYWRlckRhdGEgLSAxKSkgeworICAgIHBzSGVhZGVyQWN0aXZlID0gMTsKICAgfQogCiAgIC8qIFNpZ25hbCBTQlIgaGVhZGVyIHRvIGJlIHdyaXR0ZW4gaW50byBiaXRzdHJlYW0gKi8KLSAgaWYgKCBzYnJCaXRzdHJlYW1EYXRhLT5Db3VudFNlbmRIZWFkZXJEYXRhPT0wICApCi0gIHsKLSAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlID0gMTsKKyAgaWYgKHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgPT0gMCkgeworICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSA9IDE7CiAgIH0KIAogICAvKiBJbmNyZW1lbnQgaGVhZGVyIGludGVydmFsIGNvdW50ZXIgKi8KICAgaWYgKHNickJpdHN0cmVhbURhdGEtPk5yU2VuZEhlYWRlckRhdGEgPT0gMCkgewogICAgIHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgPSAxOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGlmIChzYnJCaXRzdHJlYW1EYXRhLT5Db3VudFNlbmRIZWFkZXJEYXRhID49IDApIHsKICAgICAgIHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGErKzsKLSAgICAgIHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgJT0gc2JyQml0c3RyZWFtRGF0YS0+TnJTZW5kSGVhZGVyRGF0YTsKKyAgICAgIHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgJT0KKyAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5OclNlbmRIZWFkZXJEYXRhOwogICAgIH0KICAgfQogCi0gIGlmIChoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluQndFbmFibGVkICkgeworICBpZiAoaFNickVsZW1lbnQtPkNtb25EYXRhLmR5bkJ3RW5hYmxlZCkgewogICAgIElOVCBpOwotICAgIGZvciAoIGkgPSA0OyBpID4gMDsgaS0tICkKLSAgICAgIGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpXSA9IGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpLTFdOworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBpLS0pCisgICAgICBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbaV0gPSBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbaSAtIDFdOwogCiAgICAgaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzBdID0gaFNickVsZW1lbnQtPkNtb25EYXRhLmR5blhPdmVyRnJlcUVuYzsKICAgICBpZiAoaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzFdID4gaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzJdKQpAQCAtOTg2LDQxICsxMDAxLDM4IEBACiAgICAgICBuZXdYT3ZlciA9IGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVsxXTsKIAogICAgIC8qIGhhcyB0aGUgY3Jvc3NvdmVyIGZyZXF1ZW5jeSBjaGFuZ2VkPyAqLwotICAgIGlmICggaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZHluWE92ZXJGcmVxICE9IG5ld1hPdmVyICkgewotCisgICAgaWYgKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmR5blhPdmVyRnJlcSAhPSBuZXdYT3ZlcikgewogICAgICAgLyogZ2V0IGNvcnJlc3BvbmRpbmcgbWFzdGVyIGJhbmQgKi8KLSAgICAgIGN1dG9mZlNiID0gKCg0KiBuZXdYT3ZlciAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMKLSAgICAgICAgICAgICAgICAgIC8gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcSkrMSk+PjE7CisgICAgICBjdXRvZmZTYiA9ICgoNCAqIG5ld1hPdmVyICogaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcyAvCisgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcSkgKworICAgICAgICAgICAgICAgICAgMSkgPj4KKyAgICAgICAgICAgICAgICAgMTsKIAotICAgICAgZm9yICggYmFuZCA9IDA7IGJhbmQgPCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5udW1fTWFzdGVyOyBiYW5kKysgKSB7Ci0gICAgICAgIGlmICggY3V0b2ZmU2IgPT0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudl9rX21hc3RlcltiYW5kXSApCi0gICAgICAgICAgYnJlYWs7CisgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubnVtX01hc3RlcjsgYmFuZCsrKSB7CisgICAgICAgIGlmIChjdXRvZmZTYiA9PSBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyW2JhbmRdKSBicmVhazsKICAgICAgIH0KLSAgICAgIEZES19BU1NFUlQoIGJhbmQgPCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5udW1fTWFzdGVyICk7CisgICAgICBGREtfQVNTRVJUKGJhbmQgPCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5udW1fTWFzdGVyKTsKIAogICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZHluWE92ZXJGcmVxID0gbmV3WE92ZXI7CiAgICAgICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfeG92ZXJfYmFuZCA9IGJhbmQ7Ci0gICAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5IZWFkZXJBY3RpdmU9MTsKKyAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLkhlYWRlckFjdGl2ZSA9IDE7CiAgICAgICBwc0hlYWRlckFjdGl2ZSA9IDE7IC8qIHBzIGhlYWRlciBpcyBvbmUgZnJhbWUgZGVsYXllZCAqLwogCiAgICAgICAvKgogICAgICAgICB1cGRhdGUgdmtfbWFzdGVyIHRhYmxlCiAgICAgICAqLwotICAgICAgaWYodXBkYXRlRnJlcUJhbmRUYWJsZSgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkVuY29kZXItPmRvd25TYW1wbGVGYWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKLSAgICAgICAgcmV0dXJuKDEpOwotCisgICAgICBpZiAodXBkYXRlRnJlcUJhbmRUYWJsZSgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52RW5jb2Rlci0+ZG93blNhbXBsZUZhY3RvcikpCisgICAgICAgIHJldHVybiAoMSk7CiAKICAgICAgIC8qIHJlc2V0IFNCUiBjaGFubmVscyAqLwogICAgICAgSU5UIG5FbnZDaCA9IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsKLSAgICAgIGZvciAoIGNoID0gMDsgY2ggPCBuRW52Q2g7IGNoKysgKSB7Ci0gICAgICAgIGlmKHJlc2V0RW52Q2hhbm5lbCAoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLAorICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkVudkNoOyBjaCsrKSB7CisgICAgICAgIGlmIChyZXNldEVudkNoYW5uZWwoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5oRW52Q2hhbm5lbCkpCi0gICAgICAgICAgcmV0dXJuKDEpOwotCisgICAgICAgICAgcmV0dXJuICgxKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTEwMjgsMTEgKzEwNDAsMTEgQEAKICAgLyoKICAgICBhbGxvY2F0ZSBzcGFjZSBmb3IgZHVtbXkgaGVhZGVyIGFuZCBjcmMKICAgKi8KLSAgY3JjUmVnID0gRkRLc2JyRW5jX0luaXRTYnJCaXRzdHJlYW0oJmhTYnJFbGVtZW50LT5DbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBWUxPQURfU0laRSpzaXplb2YoVUNIQVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JjSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzKTsKKyAgY3JjUmVnID0gRkRLc2JyRW5jX0luaXRTYnJCaXRzdHJlYW0oCisgICAgICAmaFNickVsZW1lbnQtPkNtb25EYXRhLAorICAgICAgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVbaEVudkVuY29kZXItPm5CaXRzdHJEZWxheV0sCisgICAgICBNQVhfUEFZTE9BRF9TSVpFICogc2l6ZW9mKFVDSEFSKSwgJmNyY0luZm8sCisgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyk7CiAKICAgLyogVGVtcG9yYWwgRW52ZWxvcGUgRGF0YSAqLwogICBTQlJfRlJBTUVfVEVNUF9EQVRBIF9mRGF0YTsKQEAgLTEwNDcsNjEgKzEwNTksNDcgQEAKICAgICBGREttZW1jbGVhcigmZURhdGFbMV0sIHNpemVvZihTQlJfRU5WX1RFTVBfREFUQSkpOwogICAgIEZES21lbWNsZWFyKGZEYXRhLCBzaXplb2YoU0JSX0ZSQU1FX1RFTVBfREFUQSkpOwogCi0gICAgZm9yKGk9MDsgaTxNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQotICAgICAgZkRhdGEtPnJlc1tpXSA9IEZSRVFfUkVTX0hJR0g7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspIGZEYXRhLT5yZXNbaV0gPSBGUkVRX1JFU19ISUdIOwogICB9CiAKLQotICBpZiAoIWNsZWFyT3V0cHV0KQotICB7CisgIGlmICghY2xlYXJPdXRwdXQpIHsKICAgICAvKgogICAgICAqIFRyYW5zZm9ybSBhdWRpbyBkYXRhIGludG8gUU1GIGRvbWFpbgogICAgICAqLwotICAgIGZvcihjaCA9IDA7IGNoIDwgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOyBjaCsrKQotICAgIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX2VudkNoYW4gPSAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5oRW52Q2hhbm5lbDsKICAgICAgIEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBzYnJFeHRyRW52ID0gJmhfZW52Q2hhbi0+c2JyRXh0cmFjdEVudmVsb3BlOwogCi0gICAgICBpZihoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvID09IDApCi0gICAgICB7CisgICAgICBpZiAoaFNickVsZW1lbnQtPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbyA9PSAwKSB7CiAgICAgICAgIFFNRl9TQ0FMRV9GQUNUT1IgdG1wU2NhbGU7CiAgICAgICAgIEZJWFBfREJMICoqcFFtZlJlYWwsICoqcFFtZkltYWc7Ci0gICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocW1mV29ya0J1ZmZlciwgRklYUF9EQkwsIFFNRl9DSEFOTkVMUyoyKQotCisgICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocW1mV29ya0J1ZmZlciwgRklYUF9EQkwsIDY0ICogMikKIAogICAgICAgICAvKiBPYnRhaW4gcG9pbnRlcnMgdG8gUU1GIGJ1ZmZlcnMuICovCiAgICAgICAgIHBRbWZSZWFsID0gc2JyRXh0ckVudi0+ckJ1ZmZlcjsKICAgICAgICAgcFFtZkltYWcgPSBzYnJFeHRyRW52LT5pQnVmZmVyOwogCi0gICAgICAgIHFtZkFuYWx5c2lzRmlsdGVyaW5nKCBoU2JyRWxlbWVudC0+aFFtZkFuYWx5c2lzW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZXb3JrQnVmZmVyICk7CisgICAgICAgIHFtZkFuYWx5c2lzRmlsdGVyaW5nKAorICAgICAgICAgICAgaFNickVsZW1lbnQtPmhRbWZBbmFseXNpc1tjaF0sIHBRbWZSZWFsLCBwUW1mSW1hZywgJnRtcFNjYWxlLAorICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4W2NoXSAqIHNhbXBsZXNCdWZTaXplLCAwLAorICAgICAgICAgICAgMSwgcW1mV29ya0J1ZmZlcik7CiAKICAgICAgICAgaF9lbnZDaGFuLT5xbWZTY2FsZSA9IHRtcFNjYWxlLmxiX3NjYWxlICsgNzsKIAotCi0gICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHFtZldvcmtCdWZmZXIsIEZJWFBfREJMLCBRTUZfQ0hBTk5FTFMqMikKKyAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocW1mV29ya0J1ZmZlciwgRklYUF9EQkwsIDY0ICogMikKIAogICAgICAgfSAvKiBmUGFyYW1ldHJpY1N0ZXJlbyA9PSAwICovCiAKLQogICAgICAgLyoKICAgICAgICAgUGFyYW1ldHJpYyBTdGVyZW8gcHJvY2Vzc2luZwogICAgICAgKi8KLSAgICAgIGlmIChoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvKQotICAgICAgeworICAgICAgaWYgKGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8pIHsKICAgICAgICAgSU5UIGVycm9yID0gbm9FcnJvcjsKIAotCiAgICAgICAgIC8qIExpbWl0IFBhcmFtZXRyaWMgU3RlcmVvIHRvIG9uZSBpbnN0YW5jZSAqLwogICAgICAgICBGREtfQVNTRVJUKGNoID09IDApOwogCi0KLSAgICAgICAgaWYoZXJyb3IgPT0gbm9FcnJvcil7CisgICAgICAgIGlmIChlcnJvciA9PSBub0Vycm9yKSB7CiAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gcHJvY2Vzc2luZzoKICAgICAgICAgICAgICAtIGlucHV0OgogICAgICAgICAgICAgICAgbyBsZWZ0IGFuZCByaWdodCB0aW1lIGRvbWFpbiBzYW1wbGVzCkBAIC0xMTExLDI4ICsxMTA5LDIyIEBACiAgICAgICAgICAgICAgICBvIHBzIHBhcmFtZXRlciBleHRyYWN0aW9uCiAgICAgICAgICAgICAgICBvIGRvd25taXggKyBoeWJyaWQgc3ludGhlc2lzCiAgICAgICAgICAgICAgLSBvdXRwdXQ6Ci0gICAgICAgICAgICAgICBvIGRvd25taXhlZCBxbWYgZGF0YSBpcyB3cml0dGVuIHRvIHNickV4dHJFbnYtPnJCdWZmZXIgYW5kIHNickV4dHJFbnYtPmlCdWZmZXIKKyAgICAgICAgICAgICAgIG8gZG93bm1peGVkIHFtZiBkYXRhIGlzIHdyaXR0ZW4gdG8gc2JyRXh0ckVudi0+ckJ1ZmZlciBhbmQKKyAgICAgICAgICAgICBzYnJFeHRyRW52LT5pQnVmZmVyCiAgICAgICAgICAgKi8KICAgICAgICAgICBTQ0hBUiBxbWZTY2FsZTsKLSAgICAgICAgICBJTlRfUENNKiBwU2FtcGxlc1syXSA9IHtzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbMF0sc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4WzFdfTsKLSAgICAgICAgICBlcnJvciA9IEZES3NickVuY19QU0VuY19QYXJhbWV0cmljU3RlcmVvUHJvY2Vzc2luZyggaEVudkVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+aFFtZkFuYWx5c2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5yQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5pQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52RW5jb2Rlci0+cW1mU3ludGhlc2lzUFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFtZlNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0hlYWRlckFjdGl2ZSApOwotICAgICAgICAgIGlmIChub0Vycm9yICE9IGVycm9yKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yID0gaGFuZEJhY2soZXJyb3IpOwotICAgICAgICAgIH0KKyAgICAgICAgICBJTlRfUENNICpwU2FtcGxlc1syXSA9IHsKKyAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4WzBdICogc2FtcGxlc0J1ZlNpemUsCisgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFsxXSAqIHNhbXBsZXNCdWZTaXplfTsKKyAgICAgICAgICBlcnJvciA9IEZES3NickVuY19QU0VuY19QYXJhbWV0cmljU3RlcmVvUHJvY2Vzc2luZygKKyAgICAgICAgICAgICAgaEVudkVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvLCBwU2FtcGxlcywgc2FtcGxlc0J1ZlNpemUsCisgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXMsIHNickV4dHJFbnYtPnJCdWZmZXIsCisgICAgICAgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIsCisgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0gKiBzYW1wbGVzQnVmU2l6ZSwKKyAgICAgICAgICAgICAgJmhFbnZFbmNvZGVyLT5xbWZTeW50aGVzaXNQUywgJnFtZlNjYWxlLCBwc0hlYWRlckFjdGl2ZSk7CiAgICAgICAgICAgaF9lbnZDaGFuLT5xbWZTY2FsZSA9IChpbnQpcW1mU2NhbGU7CiAgICAgICAgIH0KIAotCiAgICAgICB9IC8qIGlmIChoRW52RW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8pICovCiAKICAgICAgIC8qCkBAIC0xMTQwLDg0ICsxMTMyLDE1MCBAQAogICAgICAgICAgRXh0cmFjdCBFbnZlbG9wZSByZWxldmFudCB0aGluZ3MgZnJvbSBRTUYgZGF0YQogCiAgICAgICAqLwotICAgICAgRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+Q21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlRGF0YVtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUxKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YSwgaF9lbnZDaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5DbW9uRGF0YSwgJmVEYXRhW2NoXSwgZkRhdGEpOwogCiAgICAgfSAvKiBoRW52RW5jb2Rlci0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHMgKi8KLSB9CisgIH0KIAogICAvKgotICAgICBQcm9jZXNzIEVudmVsb3BlIHJlbGV2YW50IHRoaW5ncyBhbmQgY2FsY3VsYXRlIGVudmVsb3BlIGRhdGEgYW5kIHdyaXRlIHBheWxvYWQKKyAgICAgUHJvY2VzcyBFbnZlbG9wZSByZWxldmFudCB0aGluZ3MgYW5kIGNhbGN1bGF0ZSBlbnZlbG9wZSBkYXRhIGFuZCB3cml0ZQorICAgICBwYXlsb2FkCiAgICovCiAgIEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8pID8gaEVudkVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvIDogTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbMF0tPmhFbnZDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbMV0tPmhFbnZDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPkNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyT3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAorICAgICAgKGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8pID8gaEVudkVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMLAorICAgICAgJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLCAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbMF0tPmhFbnZDaGFubmVsLAorICAgICAgKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnN0ZXJlb01vZGUgIT0gU0JSX01PTk8pCisgICAgICAgICAgPyAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbMV0tPmhFbnZDaGFubmVsCisgICAgICAgICAgOiBOVUxMLAorICAgICAgJmhTYnJFbGVtZW50LT5DbW9uRGF0YSwgZURhdGEsIGZEYXRhLCBjbGVhck91dHB1dCk7CisKKyAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEucmlnaHRCb3JkZXJGSVggPSAwOwogCiAgIC8qCiAgICAgZm9ybWF0IHBheWxvYWQsIGNhbGN1bGF0ZSBjcmMKICAgKi8KLSAgRkRLc2JyRW5jX0Fzc2VtYmxlU2JyQml0c3RyZWFtKCZoU2JyRWxlbWVudC0+Q21vbkRhdGEsICZjcmNJbmZvLCBjcmNSZWcsIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzKTsKKyAgRkRLc2JyRW5jX0Fzc2VtYmxlU2JyQml0c3RyZWFtKCZoU2JyRWxlbWVudC0+Q21vbkRhdGEsICZjcmNJbmZvLCBjcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyk7CiAKICAgLyoKICAgICBzYXZlIG5ldyBwYXlsb2FkLCBzZXQgdG8gemVybyBsZW5ndGggaWYgZ3JlYXRlciB0aGFuIE1BWF9QQVlMT0FEX1NJWkUKICAgKi8KLSAgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldID0gRkRLZ2V0VmFsaWRCaXRzKCZoU2JyRWxlbWVudC0+Q21vbkRhdGEuc2JyQml0YnVmKTsKKyAgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldID0KKyAgICAgIEZES2dldFZhbGlkQml0cygmaFNickVsZW1lbnQtPkNtb25EYXRhLnNickJpdGJ1Zik7CiAKLSAgaWYoaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldID4gKE1BWF9QQVlMT0FEX1NJWkU8PDMpKQotICAgIGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XT0wOworICBpZiAoaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldID4KKyAgICAgIChNQVhfUEFZTE9BRF9TSVpFIDw8IDMpKQorICAgIGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XSA9IDA7CiAKICAgLyogV2hpbGUgZmlsbGluZyB0aGUgRGVsYXkgbGluZXMsIHNickRhdGEgaXMgTlVMTCAqLwogICBpZiAoc2JyRGF0YSkgewogICAgICpzYnJEYXRhQml0cyA9IGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVswXTsKLSAgICBGREttZW1jcHkoc2JyRGF0YSwgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVbMF0sIChoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVNpemVbMF0rNyk+PjMpOwotCi0KKyAgICBGREttZW1jcHkoc2JyRGF0YSwgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgIChoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVNpemVbMF0gKyA3KSA+PiAzKTsKICAgfQogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIGlmIChoRW52RW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcpCi0gIHsKLSAgICBpbnQgY2g7Ci0gICAgaW50IG5DaGFubmVscyA9IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsKLQotICAgIGZvciAoY2g9MDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCi0gICAgewotICAgICAgSU5UIG5PdXRTYW1wbGVzOwotCi0gICAgICBGREthYWNFbmNfRG93bnNhbXBsZSgmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdICsgaEVudkVuY29kZXItPmJ1ZmZlck9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmbk91dFNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkVuY29kZXItPm5DaGFubmVscyk7CisgIC8qIGRlbGF5IGhlYWRlciBhY3RpdmUgZmxhZyAqLworICBpZiAoaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuSGVhZGVyQWN0aXZlID09IDEpIHsKKyAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5IZWFkZXJBY3RpdmVEZWxheSA9CisgICAgICAgIDEgKyBoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5OworICB9IGVsc2UgeworICAgIGlmIChoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5IZWFkZXJBY3RpdmVEZWxheSA+IDApIHsKKyAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLkhlYWRlckFjdGl2ZURlbGF5LS07CiAgICAgfQotICB9IC8qIGRvd25zYW1wbGUgKi8KLQorICB9CiAKICAgcmV0dXJuICgwKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKKyBmdW5jdGlvbm5hbWU6IEZES3NickVuY19Eb3duc2FtcGxlCisgZGVzY3JpcHRpb246IHBlcmZvcm1zIGRvd25zYW1wbGluZyBhbmQgZGVsYXkgY29tcGVuc2F0aW9uIG9mIHRoZSBjb3JlIHBhdGgKKyByZXR1cm5zOgorIGlucHV0OgorIG91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQgRkRLc2JyRW5jX0Rvd25zYW1wbGUoCisgICAgSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyLAorICAgIElOVF9QQ00gKnNhbXBsZXMsICAgIC8qITwgdGltZSBzYW1wbGVzLCBhbHdheXMgZGVpbnRlcmxlYXZlZCAqLworICAgIFVJTlQgc2FtcGxlc0J1ZlNpemUsIC8qITwgdGltZSBidWZmZXIgc2l6ZSBwZXIgY2hhbm5lbCAqLworICAgIFVJTlQgbnVtQ2hhbm5lbHMsICAgIC8qITwgbnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgVUlOVCAqc2JyRGF0YUJpdHMsICAgLyohPCBTaXplIG9mIFNCUiBwYXlsb2FkICAqLworICAgIFVDSEFSICpzYnJEYXRhLCAgICAgIC8qITwgU0JSIHBheWxvYWQgICovCisgICAgaW50IGNsZWFyT3V0cHV0ICAgICAgLyohPCBEbyBub3QgY29uc2lkZXIgYW55IGlucHV0IHNpZ25hbCAqLworKSB7CisgIEhBTkRMRV9TQlJfRUxFTUVOVCBoU2JyRWxlbWVudCA9IE5VTEw7CisgIElOVCBuT3V0U2FtcGxlczsKKyAgaW50IGVsOworICBpZiAoaFNickVuY29kZXItPmRvd25TYW1wbGVGYWN0b3IgPiAxKSB7CisgICAgLyogRG8gZG93bnNhbXBsaW5nICovCisKKyAgICAvKiBMb29wIG92ZXIgZWxlbWVudHMgKExGRSBpcyBoYW5kbGVkIGxhdGVyKSAqLworICAgIGZvciAoZWwgPSAwOyBlbCA8IGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKSB7CisgICAgICBoU2JyRWxlbWVudCA9IGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXTsKKyAgICAgIGlmIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0gIT0gTlVMTCkgeworICAgICAgICBpZiAoaFNickVuY29kZXItPmRvd25zYW1wbGluZ01ldGhvZCA9PSBTQlJFTkNfRFNfVElNRSkgeworICAgICAgICAgIGludCBjaDsKKyAgICAgICAgICBpbnQgbkNoYW5uZWxzID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOworCisgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBGREthYWNFbmNfRG93bnNhbXBsZSgKKyAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlciwKKyAgICAgICAgICAgICAgICBzYW1wbGVzICsKKyAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdICogc2FtcGxlc0J1ZlNpemUgKworICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0IC8gbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJhbWVTaXplLAorICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0gKiBzYW1wbGVzQnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAmbk91dFNhbXBsZXMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIEhhbmRsZSBMRkUgKGlmIGV4aXN0aW5nKSAqLworICAgIGlmIChoU2JyRW5jb2Rlci0+bGZlQ2hJZHggIT0gLTEpIHsgLyogbGZlIGRvd25zYW1wbGVyICovCisgICAgICBGREthYWNFbmNfRG93bnNhbXBsZSgmaFNickVuY29kZXItPmxmZURvd25TYW1wbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbmNvZGVyLT5sZmVDaElkeCAqIHNhbXBsZXNCdWZTaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0IC8gbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbmNvZGVyLT5sZmVDaElkeCAqIHNhbXBsZXNCdWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5PdXRTYW1wbGVzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogTm8gZG93bnNhbXBsaW5nLiBTdGlsbCwgc29tZSBidWZmZXIgc2hpZnRpbmcgZm9yIGNvcnJlY3QgZGVsYXkgKi8KKyAgICBpbnQgc2FtcGxlczJDb3B5ID0gaFNickVuY29kZXItPmZyYW1lU2l6ZTsKKyAgICBpZiAoaFNickVuY29kZXItPmJ1ZmZlck9mZnNldCAvIChpbnQpbnVtQ2hhbm5lbHMgPCBzYW1wbGVzMkNvcHkpIHsKKyAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgKGludCludW1DaGFubmVsczsgYysrKSB7CisgICAgICAgIC8qIERvIG1lbW1vdmUgd2hpbGUgdGFraW5nIGNhcmUgb2Ygb3ZlcmxhcHBpbmcgbWVtb3J5IGFyZWFzLiAobWVtY3B5CisgICAgICAgICAgIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHRha2UgY2FyZSkgRGlzdGluZ3Vpc2ggYmV0d2VlbiBvZXZlcmxhcHBpbmcgYW5kCisgICAgICAgICAgIG5vbiBvdmVybGFwcGluZyB2ZXJzaW9uIGR1ZSB0byByZWFzb25zIG9mIGNvbXBsZXhpdHkuICovCisgICAgICAgIEZES21lbW1vdmUoc2FtcGxlcyArIGMgKiBzYW1wbGVzQnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICBzYW1wbGVzICsgYyAqIHNhbXBsZXNCdWZTaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPmJ1ZmZlck9mZnNldCAvIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgIHNhbXBsZXMyQ29weSAqIHNpemVvZihJTlRfUENNKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgKGludCludW1DaGFubmVsczsgYysrKSB7CisgICAgICAgIC8qIFNpbXBsZSBtZW1jcHkgc2luY2UgdGhlIG1lbW9yeSBhcmVhcyBhcmUgbm90IG92ZXJsYXBwaW5nICovCisgICAgICAgIEZES21lbWNweShzYW1wbGVzICsgYyAqIHNhbXBsZXNCdWZTaXplLAorICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGMgKiBzYW1wbGVzQnVmU2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPmJ1ZmZlck9mZnNldCAvIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgc2FtcGxlczJDb3B5ICogc2l6ZW9mKElOVF9QQ00pKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKICBmdW5jdGlvbm5hbWU6IGNyZWF0ZUVudkNoYW5uZWwKICBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIHBhcmFtZXRlcnMgYW5kIGFsbG9jYXRlcyBtZW1vcnkKICByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cwpAQCAtMTIyNiwyNyArMTI4NCwxNyBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIElOVAotY3JlYXRlRW52Q2hhbm5lbCAoSEFORExFX0VOVl9DSEFOTkVMICAgICBoRW52LAotICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICBjaGFubmVsCi0gICAgICAgICAgICAgICAgICxVQ0hBUiogICAgICAgICAgICAgICAgIGR5bmFtaWNfUkFNCi0gICAgICAgICAgICAgICAgICkKLXsKLSAgRkRLbWVtY2xlYXIoaEVudixzaXplb2YgKHN0cnVjdCBFTlZfQ0hBTk5FTCkpOworc3RhdGljIElOVCBjcmVhdGVFbnZDaGFubmVsKEhBTkRMRV9FTlZfQ0hBTk5FTCBoRW52LCBJTlQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZHluYW1pY19SQU0pIHsKKyAgRkRLbWVtY2xlYXIoaEVudiwgc2l6ZW9mKHN0cnVjdCBFTlZfQ0hBTk5FTCkpOwogCi0gIGlmICggRkRLc2JyRW5jX0NyZWF0ZVRvbkNvcnJQYXJhbUV4dHIoJmhFbnYtPlRvbkNvcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwpICkKLSAgewotICAgIHJldHVybigxKTsKKyAgaWYgKEZES3NickVuY19DcmVhdGVUb25Db3JyUGFyYW1FeHRyKCZoRW52LT5Ub25Db3JyLCBjaGFubmVsKSkgeworICAgIHJldHVybiAoMSk7CiAgIH0KIAotICBpZiAoIEZES3NickVuY19DcmVhdGVFeHRyYWN0U2JyRW52ZWxvcGUgKCZoRW52LT5zYnJFeHRyYWN0RW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLC8qY2hhbiovMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNfUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICkKLSAgewotICAgIHJldHVybigxKTsKKyAgaWYgKEZES3NickVuY19DcmVhdGVFeHRyYWN0U2JyRW52ZWxvcGUoJmhFbnYtPnNickV4dHJhY3RFbnZlbG9wZSwgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjaGFuKi8gMCwgZHluYW1pY19SQU0pKSB7CisgICAgcmV0dXJuICgxKTsKICAgfQogCiAgIHJldHVybiAwOwpAQCAtMTI2MSwyMSArMTMwOSwxNiBAQAogIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1pbml0RW52Q2hhbm5lbCAoICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBIHNickNvbmZpZ0RhdGEsCi0gICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICAgIGhFbnYsCi0gICAgICAgICAgICAgICAgICBzYnJDb25maWd1cmF0aW9uUHRyICAgIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgIFVMT05HICAgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcKLSAgICAgICAgICAgICAgICAgLElOVCAgICAgICAgICAgICAgICAgICAgY2hhbkluRWwKLSAgICAgICAgICAgICAgICAgLFVDSEFSKiAgICAgICAgICAgICAgICAgZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgKQotewotICBpbnQgZnJhbWVTaGlmdCwgdHJhbl9vZmY9MDsKK3N0YXRpYyBJTlQgaW5pdEVudkNoYW5uZWwoSEFORExFX1NCUl9DT05GSUdfREFUQSBzYnJDb25maWdEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoRW52LCBzYnJDb25maWd1cmF0aW9uUHRyIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgc3RhdGVzSW5pdEZsYWcsIElOVCBjaGFuSW5FbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmR5bmFtaWNfUkFNKSB7CisgIGludCBmcmFtZVNoaWZ0LCB0cmFuX29mZiA9IDA7CiAgIElOVCBlOwogICBJTlQgdHJhbl9mYzsKICAgSU5UIHRpbWVTbG90cywgdGltZVN0ZXAsIHN0YXJ0SW5kZXg7Ci0gIElOVCBub2lzZUJhbmRzWzJdID0geyAzLCAzIH07CisgIElOVCBub2lzZUJhbmRzWzJdID0gezMsIDN9OwogCiAgIGUgPSAxIDw8IHBhcmFtcy0+ZTsKIApAQCAtMTI4MywxMSArMTMyNiwxMiBAQAogCiAgIGhFbnYtPmVuY0VudkRhdGEuZnJlcV9yZXNfZml4Zml4WzBdID0gcGFyYW1zLT5mcmVxX3Jlc19maXhmaXhbMF07CiAgIGhFbnYtPmVuY0VudkRhdGEuZnJlcV9yZXNfZml4Zml4WzFdID0gcGFyYW1zLT5mcmVxX3Jlc19maXhmaXhbMV07Ci0gIGhFbnYtPmVuY0VudkRhdGEuZlJlc1RyYW5zSXNMb3cgICAgID0gcGFyYW1zLT5mUmVzVHJhbnNJc0xvdzsKKyAgaEVudi0+ZW5jRW52RGF0YS5mUmVzVHJhbnNJc0xvdyA9IHBhcmFtcy0+ZlJlc1RyYW5zSXNMb3c7CiAKICAgaEVudi0+ZkxldmVsUHJvdGVjdCA9IDA7CiAKLSAgaEVudi0+ZW5jRW52RGF0YS5sZEdyaWQgPSAoc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgPyAxIDogMDsKKyAgaEVudi0+ZW5jRW52RGF0YS5sZEdyaWQgPQorICAgICAgKHNickNvbmZpZ0RhdGEtPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpID8gMSA6IDA7CiAKICAgaEVudi0+ZW5jRW52RGF0YS5zYnJfeHBvc19tb2RlID0gKFhQT1NfTU9ERSlwYXJhbXMtPnNicl94cG9zX21vZGU7CiAKQEAgLTEyOTgsMTkgKzEzNDIsMTYgQEAKICAgICAqLwogICAgIHNickNvbmZpZ0RhdGEtPnN3aXRjaFRyYW5zcG9zZXJzID0gVFJVRTsKICAgICBoRW52LT5lbmNFbnZEYXRhLnNicl94cG9zX21vZGUgPSBYUE9TX01EQ1Q7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgc2JyQ29uZmlnRGF0YS0+c3dpdGNoVHJhbnNwb3NlcnMgPSBGQUxTRTsKICAgfQogCiAgIGhFbnYtPmVuY0VudkRhdGEuc2JyX3hwb3NfY3RybCA9IHBhcmFtcy0+c2JyX3hwb3NfY3RybDsKIAotCiAgIC8qIGV4dGVuZGVkIGRhdGEgKi8KLSAgaWYocGFyYW1zLT5wYXJhbWV0cmljQ29kaW5nKSB7CisgIGlmIChwYXJhbXMtPnBhcmFtZXRyaWNDb2RpbmcpIHsKICAgICBoRW52LT5lbmNFbnZEYXRhLmV4dGVuZGVkX2RhdGEgPSAxOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGhFbnYtPmVuY0VudkRhdGEuZXh0ZW5kZWRfZGF0YSA9IDA7CiAgIH0KIApAQCAtMTMxOSw0MCArMTM2MCwzNyBAQAogICBzdGFydEluZGV4ID0gUU1GX0ZJTFRFUl9QUk9UT1RZUEVfU0laRSAtIHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHM7CiAKICAgc3dpdGNoIChwYXJhbXMtPnNickZyYW1lU2l6ZSkgewotICBjYXNlIDIzMDQ6Ci0gICAgdGltZVNsb3RzID0gMTg7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgMjA0ODoKLSAgY2FzZSAxMDI0OgotICBjYXNlIDUxMjoKLSAgICB0aW1lU2xvdHMgPSAxNjsKLSAgICBicmVhazsKLSAgY2FzZSAxOTIwOgotICBjYXNlIDk2MDoKLSAgY2FzZSA0ODA6Ci0gICAgdGltZVNsb3RzID0gMTU7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgMTE1MjoKLSAgICB0aW1lU2xvdHMgPSA5OwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHJldHVybiAoMSk7IC8qIElsbGVnYWwgZnJhbWUgc2l6ZSAqLworICAgIGNhc2UgMjMwNDoKKyAgICAgIHRpbWVTbG90cyA9IDE4OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDQ4OgorICAgIGNhc2UgMTAyNDoKKyAgICBjYXNlIDUxMjoKKyAgICAgIHRpbWVTbG90cyA9IDE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTIwOgorICAgIGNhc2UgOTYwOgorICAgIGNhc2UgNDgwOgorICAgICAgdGltZVNsb3RzID0gMTU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDExNTI6CisgICAgICB0aW1lU2xvdHMgPSA5OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoMSk7IC8qIElsbGVnYWwgZnJhbWUgc2l6ZSAqLwogICB9CiAKICAgdGltZVN0ZXAgPSBzYnJDb25maWdEYXRhLT5ub1FtZlNsb3RzIC8gdGltZVNsb3RzOwogCi0gIGlmICggRkRLc2JyRW5jX0luaXRUb25Db3JyUGFyYW1FeHRyKHBhcmFtcy0+c2JyRnJhbWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52LT5Ub25Db3JyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+c2JyX3hwb3NfY3RybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5hbmFfbWF4X2xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfbm9pc2VfYmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+bm9pc2VGbG9vck9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT51c2VTcGVlY2hDb25maWcpICkKLSAgICByZXR1cm4oMSk7CisgIGlmIChGREtzYnJFbmNfSW5pdFRvbkNvcnJQYXJhbUV4dHIoCisgICAgICAgICAgcGFyYW1zLT5zYnJGcmFtZVNpemUsICZoRW52LT5Ub25Db3JyLCBzYnJDb25maWdEYXRhLCB0aW1lU2xvdHMsCisgICAgICAgICAgcGFyYW1zLT5zYnJfeHBvc19jdHJsLCBwYXJhbXMtPmFuYV9tYXhfbGV2ZWwsCisgICAgICAgICAgc2JySGVhZGVyRGF0YS0+c2JyX25vaXNlX2JhbmRzLCBwYXJhbXMtPm5vaXNlRmxvb3JPZmZzZXQsCisgICAgICAgICAgcGFyYW1zLT51c2VTcGVlY2hDb25maWcpKQorICAgIHJldHVybiAoMSk7CiAKLSAgaEVudi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kcyA9IGhFbnYtPlRvbkNvcnIuc2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kczsKKyAgaEVudi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kcyA9CisgICAgICBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7CiAKICAgbm9pc2VCYW5kc1swXSA9IGhFbnYtPmVuY0VudkRhdGEubm9PZm5vaXNlYmFuZHM7CiAgIG5vaXNlQmFuZHNbMV0gPSBoRW52LT5lbmNFbnZEYXRhLm5vT2Zub2lzZWJhbmRzOwpAQCAtMTM2MiwxMDYgKzE0MDAsOTAgQEAKICAgaWYgKGhFbnYtPmVuY0VudkRhdGEuc2JyX2ludmZfbW9kZSA9PSBJTlZGX1NXSVRDSEVEKSB7CiAgICAgaEVudi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlID0gSU5WRl9NSURfTEVWRUw7CiAgICAgaEVudi0+VG9uQ29yci5zd2l0Y2hJbnZlcnNlRmlsdCA9IFRSVUU7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgaEVudi0+VG9uQ29yci5zd2l0Y2hJbnZlcnNlRmlsdCA9IEZBTFNFOwogICB9CiAKLQotICB0cmFuX2ZjICA9IHBhcmFtcy0+dHJhbl9mYzsKKyAgdHJhbl9mYyA9IHBhcmFtcy0+dHJhbl9mYzsKIAogICBpZiAodHJhbl9mYyA9PSAwKSB7Ci0gICAgdHJhbl9mYyA9IGZpeE1pbiAoNTAwMCwgRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVyAoc2JySGVhZGVyRGF0YS0+c2JyX3N0YXJ0X2ZyZXF1ZW5jeSxwYXJhbXMtPmNvZGVjU2V0dGluZ3Muc2FtcGxlRnJlcSkpOworICAgIHRyYW5fZmMgPSBmaXhNaW4oCisgICAgICAgIDUwMDAsIEZES3NickVuY19nZXRTYnJTdGFydEZyZXFSQVcoc2JySGVhZGVyRGF0YS0+c2JyX3N0YXJ0X2ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmNvZGVjU2V0dGluZ3Muc2FtcGxlRnJlcSkpOwogICB9CiAKLSAgdHJhbl9mYyA9ICh0cmFuX2ZjKjQqc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcy9zYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxICsgMSk+PjE7CisgIHRyYW5fZmMgPQorICAgICAgKHRyYW5fZmMgKiA0ICogc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcyAvIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEgKworICAgICAgIDEpID4+CisgICAgICAxOwogCiAgIGlmIChzYnJDb25maWdEYXRhLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSB7CiAgICAgZnJhbWVTaGlmdCA9IExEX1BSRVRSQU5fT0ZGOwotICAgIHRyYW5fb2ZmID0gTERfUFJFVFJBTl9PRkYgKyBGUkFNRV9NSURETEVfU0xPVF81MTJMRCp0aW1lU3RlcDsKLSAgfSBlbHNlCi0gIHsKKyAgICB0cmFuX29mZiA9IExEX1BSRVRSQU5fT0ZGICsgRlJBTUVfTUlERExFX1NMT1RfNTEyTEQgKiB0aW1lU3RlcDsKKyAgfSBlbHNlIHsKICAgICBmcmFtZVNoaWZ0ID0gMDsKICAgICBzd2l0Y2ggKHRpbWVTbG90cykgewogICAgICAgLyogVGhlIGZhY3RvciBvZiAyIGlzIGJ5IGRlZmluaXRpb24uICovCi0gICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6IHRyYW5fb2ZmID0gOCArIEZSQU1FX01JRERMRV9TTE9UXzIwNDggKiB0aW1lU3RlcDsgYnJlYWs7Ci0gICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6IHRyYW5fb2ZmID0gNyArIEZSQU1FX01JRERMRV9TTE9UXzE5MjAgKiB0aW1lU3RlcDsgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gMTsKKyAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKKyAgICAgICAgdHJhbl9vZmYgPSA4ICsgRlJBTUVfTUlERExFX1NMT1RfMjA0OCAqIHRpbWVTdGVwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKKyAgICAgICAgdHJhbl9vZmYgPSA3ICsgRlJBTUVfTUlERExFX1NMT1RfMTkyMCAqIHRpbWVTdGVwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgfQotICBpZiAoIEZES3NickVuY19Jbml0RXh0cmFjdFNickVudmVsb3BlICgmaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcywgc3RhcnRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsIHRpbWVTdGVwLCB0cmFuX29mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXNJbml0RmxhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGNoYW5JbkVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzYnJDb25maWdEYXRhLT5zYnJTeW50YXhGbGFncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKQotICAgIHJldHVybigxKTsKKyAgaWYgKEZES3NickVuY19Jbml0RXh0cmFjdFNickVudmVsb3BlKAorICAgICAgICAgICZoRW52LT5zYnJFeHRyYWN0RW52ZWxvcGUsIHNickNvbmZpZ0RhdGEtPm5vUW1mU2xvdHMsCisgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcywgc3RhcnRJbmRleCwgdGltZVNsb3RzLCB0aW1lU3RlcCwgdHJhbl9vZmYsCisgICAgICAgICAgc3RhdGVzSW5pdEZsYWcsIGNoYW5JbkVsLCBkeW5hbWljX1JBTSwgc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MpKQorICAgIHJldHVybiAoMSk7CiAKLSAgaWYoRkRLc2JyRW5jX0luaXRTYnJDb2RlRW52ZWxvcGUgKCZoRW52LT5zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+blNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRlbHRhVEFjcm9zc0ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRGX2VkZ2VfMXN0RW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZEZfZWRnZV9pbmNyKSkKLSAgICByZXR1cm4oMSk7CisgIGlmIChGREtzYnJFbmNfSW5pdFNickNvZGVFbnZlbG9wZSgmaEVudi0+c2JyQ29kZUVudmVsb3BlLCBzYnJDb25maWdEYXRhLT5uU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kZWx0YVRBY3Jvc3NGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRGX2VkZ2VfMXN0RW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kRl9lZGdlX2luY3IpKQorICAgIHJldHVybiAoMSk7CiAKLSAgaWYoRkRLc2JyRW5jX0luaXRTYnJDb2RlRW52ZWxvcGUgKCZoRW52LT5zYnJDb2RlTm9pc2VGbG9vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZUJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZGVsdGFUQWNyb3NzRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCkpCi0gICAgcmV0dXJuKDEpOworICBpZiAoRkRLc2JyRW5jX0luaXRTYnJDb2RlRW52ZWxvcGUoJmhFbnYtPnNickNvZGVOb2lzZUZsb29yLCBub2lzZUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kZWx0YVRBY3Jvc3NGcmFtZXMsIDAsIDApKQorICAgIHJldHVybiAoMSk7CiAKICAgc2JyQ29uZmlnRGF0YS0+aW5pdEFtcFJlc0ZGID0gcGFyYW1zLT5pbml0X2FtcF9yZXNfRkY7CiAKLSAgaWYoRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzICgmaEVudi0+ZW5jRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52LT5zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfYW1wX3JlcykpCi0gICByZXR1cm4oMSk7CisgIGlmIChGREtzYnJFbmNfSW5pdFNickh1ZmZtYW5UYWJsZXMoJmhFbnYtPmVuY0VudkRhdGEsICZoRW52LT5zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnYtPnNickNvZGVOb2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9hbXBfcmVzKSkKKyAgICByZXR1cm4gKDEpOwogCi0gIEZES3NickVuY19pbml0RnJhbWVJbmZvR2VuZXJhdG9yICgmaEVudi0+U2JyRW52RnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zcHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnN0YXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVNsb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnYtPmVuY0VudkRhdGEuZnJlcV9yZXNfZml4Zml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnYtPmVuY0VudkRhdGEuZlJlc1RyYW5zSXNMb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+ZW5jRW52RGF0YS5sZEdyaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICBGREtzYnJFbmNfaW5pdEZyYW1lSW5mb0dlbmVyYXRvcigKKyAgICAgICZoRW52LT5TYnJFbnZGcmFtZSwgcGFyYW1zLT5zcHJlYWQsIGUsIHBhcmFtcy0+c3RhdCwgdGltZVNsb3RzLAorICAgICAgaEVudi0+ZW5jRW52RGF0YS5mcmVxX3Jlc19maXhmaXgsIGhFbnYtPmVuY0VudkRhdGEuZlJlc1RyYW5zSXNMb3csCisgICAgICBoRW52LT5lbmNFbnZEYXRhLmxkR3JpZCk7CiAKLSAgaWYoc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkKKyAgaWYgKHNickNvbmZpZ0RhdGEtPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpCisKICAgewotICAgIElOVCBiYW5kd2lkdGhfcW1mX3Nsb3QgPSAoc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcT4+MSkgLyAoc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcyk7Ci0gICAgaWYoRkRLc2JyRW5jX0luaXRTYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IoCi0gICAgICAgICAgICAgICZoRW52LT5zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IsCi0gICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZlNsb3RzLAotICAgICAgICAgICAgICAgYmFuZHdpZHRoX3FtZl9zbG90LAotICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcywKLSAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbMF1bMF0KLSAgICAgICAgICAgICAgICkpCi0gICAgICByZXR1cm4oMSk7CisgICAgSU5UIGJhbmR3aWR0aF9xbWZfc2xvdCA9CisgICAgICAgIChzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxID4+IDEpIC8gKHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMpOworICAgIGlmIChGREtzYnJFbmNfSW5pdFNickZhc3RUcmFuc2llbnREZXRlY3RvcigKKyAgICAgICAgICAgICZoRW52LT5zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IsIHNickNvbmZpZ0RhdGEtPm5vUW1mU2xvdHMsCisgICAgICAgICAgICBiYW5kd2lkdGhfcW1mX3Nsb3QsIHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMsCisgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlWzBdWzBdKSkKKyAgICAgIHJldHVybiAoMSk7CiAgIH0KIAogICAvKiBUaGUgdHJhbnNpZW50IGRldGVjdG9yIGhhcyB0byBiZSBpbml0aWFsaXplZCBhbHNvIGlmIHRoZSBmYXN0IHRyYW5zaWVudAogICAgICBkZXRlY3RvciB3YXMgYWN0aXZlLCBiZWNhdXNlIHRoZSB2YWx1ZXMgZnJvbSB0aGUgdHJhbnNpZW50IGRldGVjdG9yCiAgICAgIHN0cnVjdHVyZSBhcmUgdXNlZC4gKi8KLSAgaWYoRkRLc2JyRW5jX0luaXRTYnJUcmFuc2llbnREZXRlY3RvciAoJmhFbnYtPnNiclRyYW5zaWVudERldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbl9mYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnYtPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuX29mZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKLSAgcmV0dXJuKDEpOwotCisgIGlmIChGREtzYnJFbmNfSW5pdFNiclRyYW5zaWVudERldGVjdG9yKAorICAgICAgICAgICZoRW52LT5zYnJUcmFuc2llbnREZXRlY3Rvciwgc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MsCisgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJhbWVTaXplLCBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxLCBwYXJhbXMsIHRyYW5fZmMsCisgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZTbG90cywgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcywKKyAgICAgICAgICBoRW52LT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlcldyaXRlT2Zmc2V0LAorICAgICAgICAgIGhFbnYtPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU3pTaGlmdCwgZnJhbWVTaGlmdCwgdHJhbl9vZmYpKQorICAgIHJldHVybiAoMSk7CiAKICAgc2JyQ29uZmlnRGF0YS0+eHBvc0N0cmxTd2l0Y2ggPSBwYXJhbXMtPnNicl94cG9zX2N0cmw7CiAKQEAgLTE0NzEsODMgKzE0OTMsODAgQEAKICAgcmV0dXJuICgwKTsKIH0KIAotSU5UIHNickVuY29kZXJfT3BlbigKLSAgICAgICAgSEFORExFX1NCUl9FTkNPREVSICAqcGhTYnJFbmNvZGVyLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBuRWxlbWVudHMsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgc3VwcG9ydFBTCi0gICAgICAgICkKLXsKK0lOVCBzYnJFbmNvZGVyX09wZW4oSEFORExFX1NCUl9FTkNPREVSICpwaFNickVuY29kZXIsIElOVCBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgIElOVCBuQ2hhbm5lbHMsIElOVCBzdXBwb3J0UFMpIHsKICAgSU5UIGk7CiAgIElOVCBlcnJvclN0YXR1cyA9IDE7CiAgIEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlciA9IE5VTEw7CiAKLSAgaWYgKHBoU2JyRW5jb2Rlcj09TlVMTAotICAgICApCi0gIHsKKyAgaWYgKHBoU2JyRW5jb2RlciA9PSBOVUxMKSB7CiAgICAgZ290byBiYWlsOwogICB9CiAKICAgaFNickVuY29kZXIgPSBHZXRSYW1fU2JyRW5jb2RlcigpOwotICBpZiAoaFNickVuY29kZXI9PU5VTEwpIHsKKyAgaWYgKGhTYnJFbmNvZGVyID09IE5VTEwpIHsKICAgICBnb3RvIGJhaWw7CiAgIH0KICAgRkRLbWVtY2xlYXIoaFNickVuY29kZXIsIHNpemVvZihTQlJfRU5DT0RFUikpOwogCi0gICAgICBoU2JyRW5jb2Rlci0+cFNCUmR5bmFtaWNfUkFNID0gKFVDSEFSKilHZXRSYW1fU2JyRHluYW1pY19SQU0oKTsKLSAgICAgIGhTYnJFbmNvZGVyLT5keW5hbWljUmFtID0gaFNickVuY29kZXItPnBTQlJkeW5hbWljX1JBTTsKKyAgaWYgKE5VTEwgPT0KKyAgICAgIChoU2JyRW5jb2Rlci0+cFNCUmR5bmFtaWNfUkFNID0gKFVDSEFSICopR2V0UmFtX1NickR5bmFtaWNfUkFNKCkpKSB7CisgICAgZ290byBiYWlsOworICB9CisgIGhTYnJFbmNvZGVyLT5keW5hbWljUmFtID0gaFNickVuY29kZXItPnBTQlJkeW5hbWljX1JBTTsKIAotICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgeworICAvKiBDcmVhdGUgU0JSIGVsZW1lbnRzICovCisgIGZvciAoaSA9IDA7IGkgPCBuRWxlbWVudHM7IGkrKykgewogICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldID0gR2V0UmFtX1NickVsZW1lbnQoaSk7Ci0gICAgaWYgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldPT1OVUxMKSB7Ci0gICAgICAgIGdvdG8gYmFpbDsKKyAgICBpZiAoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0gPT0gTlVMTCkgeworICAgICAgZ290byBiYWlsOwogICAgIH0KICAgICBGREttZW1jbGVhcihoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXSwgc2l6ZW9mKFNCUl9FTEVNRU5UKSk7Ci0gICAgaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtMT10gPSAgR2V0UmFtX1Nicl9mcmVxQmFuZFRhYmxlTE8oaSk7Ci0gICAgaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV0gPSAgR2V0UmFtX1Nicl9mcmVxQmFuZFRhYmxlSEkoaSk7Ci0gICAgaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEudl9rX21hc3RlciAgICAgICAgPSAgR2V0UmFtX1Nicl92X2tfbWFzdGVyKGkpOwotICAgIGlmICggKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dPT1OVUxMKSB8fAotICAgICAgICAgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbSEldPT1OVUxMKSB8fAotICAgICAgICAgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXI9PU5VTEwpICkKLSAgICB7Ci0gICAgICAgIGdvdG8gYmFpbDsKKyAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0xPXSA9CisgICAgICAgIEdldFJhbV9TYnJfZnJlcUJhbmRUYWJsZUxPKGkpOworICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbSEldID0KKyAgICAgICAgR2V0UmFtX1Nicl9mcmVxQmFuZFRhYmxlSEkoaSk7CisgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEudl9rX21hc3RlciA9CisgICAgICAgIEdldFJhbV9TYnJfdl9rX21hc3RlcihpKTsKKyAgICBpZiAoKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dID09IE5VTEwpIHx8CisgICAgICAgIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0hJXSA9PSBOVUxMKSB8fAorICAgICAgICAoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEudl9rX21hc3RlciA9PSBOVUxMKSkgeworICAgICAgZ290byBiYWlsOwogICAgIH0KICAgfQogCi0gIGZvciAoaT0wOyBpPG5DaGFubmVsczsgaSsrKSB7CisgIC8qIENyZWF0ZSBTQlIgY2hhbm5lbHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IG5DaGFubmVsczsgaSsrKSB7CiAgICAgaFNickVuY29kZXItPnBTYnJDaGFubmVsW2ldID0gR2V0UmFtX1NickNoYW5uZWwoaSk7Ci0gICAgaWYgKGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXT09TlVMTCkgewotICAgICAgICBnb3RvIGJhaWw7CisgICAgaWYgKGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXSA9PSBOVUxMKSB7CisgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCi0gICAgaWYgKCBjcmVhdGVFbnZDaGFubmVsKCZoU2JyRW5jb2Rlci0+cFNickNoYW5uZWxbaV0tPmhFbnZDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaQotICAgICAgICAgICAgICAgICAgICAgICAgICAsaFNickVuY29kZXItPmR5bmFtaWNSYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKQotICAgIHsKLSAgICAgICAgZ290byBiYWlsOworICAgIGlmIChjcmVhdGVFbnZDaGFubmVsKCZoU2JyRW5jb2Rlci0+cFNickNoYW5uZWxbaV0tPmhFbnZDaGFubmVsLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5keW5hbWljUmFtKSkgeworICAgICAgZ290byBiYWlsOwogICAgIH0KLQogICB9CiAKLSAgZm9yIChpPTA7IGk8Zml4TWF4KG5DaGFubmVscywoc3VwcG9ydFBTKT8yOjApOyBpKyspIHsKKyAgLyogQ3JlYXRlIFFNRiBTdGF0ZXMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGZpeE1heChuQ2hhbm5lbHMsIChzdXBwb3J0UFMpID8gMiA6IDApOyBpKyspIHsKICAgICBoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbaV0uRmlsdGVyU3RhdGVzID0gR2V0UmFtX1Nicl9RbWZTdGF0ZXNBbmFseXNpcyhpKTsKLSAgICBpZiAoaFNickVuY29kZXItPlFtZkFuYWx5c2lzW2ldLkZpbHRlclN0YXRlcz09TlVMTCkgewotICAgICAgICBnb3RvIGJhaWw7CisgICAgaWYgKGhTYnJFbmNvZGVyLT5RbWZBbmFseXNpc1tpXS5GaWx0ZXJTdGF0ZXMgPT0gTlVMTCkgeworICAgICAgZ290byBiYWlsOwogICAgIH0KICAgfQogCisgIC8qIENyZWF0ZSBQYXJhbWV0cmljIFN0ZXJlbyBoYW5kbGUgKi8KICAgaWYgKHN1cHBvcnRQUykgewotICAgIGlmIChQU0VuY19DcmVhdGUoJmhTYnJFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbykpCi0gICAgeworICAgIGlmIChQU0VuY19DcmVhdGUoJmhTYnJFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbykpIHsKICAgICAgIGdvdG8gYmFpbDsKICAgICB9CiAKICAgICBoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzID0gR2V0UmFtX1BzUW1mU3RhdGVzU3ludGhlc2lzKCk7Ci0gICAgaWYgKGhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXM9PU5VTEwpIHsKKyAgICBpZiAoaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLkZpbHRlclN0YXRlcyA9PSBOVUxMKSB7CiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQotICB9ICAvKiBzdXBwb3J0UFMgKi8KKyAgfSAvKiBzdXBwb3J0UFMgKi8KIAogICAqcGhTYnJFbmNvZGVyID0gaFNickVuY29kZXI7CiAKQEAgLTE1NjAsNTYgKzE1NzksNzQgQEAKICAgcmV0dXJuIGVycm9yU3RhdHVzOwogfQogCi1zdGF0aWMKLUlOVCBGREtzYnJFbmNfUmVhbGxvY2F0ZSgKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTkNPREVSICAgaFNickVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX0lORk8gICAgIGVsSW5mb1soOCldLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICBub0VsZW1lbnRzKQoteworc3RhdGljIElOVCBGREtzYnJFbmNfUmVhbGxvY2F0ZShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX0lORk8gZWxJbmZvWyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBub0VsZW1lbnRzKSB7CiAgIElOVCB0b3RhbENoID0gMDsKICAgSU5UIHRvdGFsUW1mID0gMDsKICAgSU5UIGNvcmVFbDsKLSAgSU5UIGVsPS0xOworICBJTlQgZWwgPSAtMTsKIAogICBoU2JyRW5jb2Rlci0+bGZlQ2hJZHggPSAtMTsgLyogZGVmYXVsdCB2YWx1ZSwgdW50aWwgbGZlIGZvdW5kICovCiAKLSAgZm9yIChjb3JlRWw9MDsgY29yZUVsPG5vRWxlbWVudHM7IGNvcmVFbCsrKQotICB7CisgIGZvciAoY29yZUVsID0gMDsgY29yZUVsIDwgbm9FbGVtZW50czsgY29yZUVsKyspIHsKICAgICAvKiBTQlIgb25seSBoYW5kbGVzIFNDRSBhbmQgQ1BFJ3MgKi8KICAgICBpZiAoZWxJbmZvW2NvcmVFbF0uZWxUeXBlID09IElEX1NDRSB8fCBlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfQ1BFKSB7CiAgICAgICBlbCsrOwogICAgIH0gZWxzZSB7CiAgICAgICBpZiAoZWxJbmZvW2NvcmVFbF0uZWxUeXBlID09IElEX0xGRSkgewotICAgICAgICAgIGhTYnJFbmNvZGVyLT5sZmVDaElkeCA9IGVsSW5mb1tjb3JlRWxdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgICAgaFNickVuY29kZXItPmxmZUNoSWR4ID0gZWxJbmZvW2NvcmVFbF0uQ2hhbm5lbEluZGV4WzBdOwogICAgICAgfQogICAgICAgY29udGludWU7CiAgICAgfQogCi0gICAgU0JSX0VMRU1FTlRfSU5GTyAgICAqcGVsSW5mbyA9ICZlbEluZm9bY29yZUVsXTsKLSAgICBIQU5ETEVfU0JSX0VMRU1FTlQgIGhTYnJFbGVtZW50ID0gaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdOworICAgIFNCUl9FTEVNRU5UX0lORk8gKnBlbEluZm8gPSAmZWxJbmZvW2NvcmVFbF07CisgICAgSEFORExFX1NCUl9FTEVNRU5UIGhTYnJFbGVtZW50ID0gaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdOwogCiAgICAgaW50IGNoOwotICAgIGZvciAoIGNoID0gMDsgY2ggPCBwZWxJbmZvLT5uQ2hhbm5lbHNJbkVsOyBjaCsrICkgeworICAgIGZvciAoY2ggPSAwOyBjaCA8IHBlbEluZm8tPm5DaGFubmVsc0luRWw7IGNoKyspIHsKICAgICAgIGhTYnJFbGVtZW50LT5zYnJDaGFubmVsW2NoXSA9IGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFt0b3RhbENoXTsKICAgICAgIHRvdGFsQ2grKzsKICAgICB9CiAgICAgLyogYW5hbHlzaXMgUU1GICovCi0gICAgZm9yICggY2ggPSAwOyBjaCA8ICgocGVsSW5mby0+ZlBhcmFtZXRyaWNTdGVyZW8pPzI6cGVsSW5mby0+bkNoYW5uZWxzSW5FbCk7IGNoKysgKSB7CisgICAgZm9yIChjaCA9IDA7CisgICAgICAgICBjaCA8ICgocGVsSW5mby0+ZlBhcmFtZXRyaWNTdGVyZW8pID8gMiA6IHBlbEluZm8tPm5DaGFubmVsc0luRWwpOworICAgICAgICAgY2grKykgewogICAgICAgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdID0gcGVsSW5mby0+Q2hhbm5lbEluZGV4W2NoXTsKICAgICAgIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdID0gJmhTYnJFbmNvZGVyLT5RbWZBbmFseXNpc1t0b3RhbFFtZisrXTsKICAgICB9CiAKICAgICAvKiBDb3B5IEVsZW1lbnQgaW5mbyAqLwotICAgIGhTYnJFbGVtZW50LT5lbEluZm8uZWxUeXBlICAgICAgICAgICAgPSBwZWxJbmZvLT5lbFR5cGU7Ci0gICAgaFNickVsZW1lbnQtPmVsSW5mby5pbnN0YW5jZVRhZyAgICAgICA9IHBlbEluZm8tPmluc3RhbmNlVGFnOwotICAgIGhTYnJFbGVtZW50LT5lbEluZm8ubkNoYW5uZWxzSW5FbCAgICAgPSBwZWxJbmZvLT5uQ2hhbm5lbHNJbkVsOworICAgIGhTYnJFbGVtZW50LT5lbEluZm8uZWxUeXBlID0gcGVsSW5mby0+ZWxUeXBlOworICAgIGhTYnJFbGVtZW50LT5lbEluZm8uaW5zdGFuY2VUYWcgPSBwZWxJbmZvLT5pbnN0YW5jZVRhZzsKKyAgICBoU2JyRWxlbWVudC0+ZWxJbmZvLm5DaGFubmVsc0luRWwgPSBwZWxJbmZvLT5uQ2hhbm5lbHNJbkVsOwogICAgIGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8gPSBwZWxJbmZvLT5mUGFyYW1ldHJpY1N0ZXJlbzsKKyAgICBoU2JyRWxlbWVudC0+ZWxJbmZvLmZEdWFsTW9ubyA9IHBlbEluZm8tPmZEdWFsTW9ubzsKICAgfSAvKiBjb3JlRWwgKi8KIAogICByZXR1cm4gMDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKKyBmdW5jdGlvbm5hbWU6IEZES3NickVuY19ic0J1ZkluaXQKKyBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIGJpdHN0cmVhbSBidWZmZXIKKyByZXR1cm5zOiAgICAgIGluaXRpYWxpemVkIGJpdHN0cmVhbSBidWZmZXIgaW4gZW52IGVuY29kZXIKKyBpbnB1dDoKKyBvdXRwdXQ6ICAgICAgIGhFbnYKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIEZES3NickVuY19ic0J1ZkluaXQoSEFORExFX1NCUl9FTEVNRU5UIGhTYnJFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQml0c3RyRGVsYXkpIHsKKyAgVUNIQVIgKmJpdHN0cmVhbUJ1ZmZlcjsKKworICAvKiBpbml0aWFsaXplIHRoZSBiaXRzdHJlYW0gYnVmZmVyICovCisgIGJpdHN0cmVhbUJ1ZmZlciA9IGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lW25CaXRzdHJEZWxheV07CisgIEZES2luaXRCaXRTdHJlYW0oJmhTYnJFbGVtZW50LT5DbW9uRGF0YS5zYnJCaXRidWYsIGJpdHN0cmVhbUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBNQVhfUEFZTE9BRF9TSVpFICogc2l6ZW9mKFVDSEFSKSwgMCwgQlNfV1JJVEVSKTsKKworICByZXR1cm4gKDApOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIApAQCAtMTYyMCwxMTMgKzE2NTcsMTA5IEBACiAgb3V0cHV0OiAgICAgICBoRW52CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi1JTlQgRkRLc2JyRW5jX0VudkluaXQgKAotICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VMRU1FTlQgICBoU2JyRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlndXJhdGlvblB0ciBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICpjb3JlQmFuZFdpdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5CaXRzdHJEZWxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGVhZGVyUGVyaW9kLAotICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgICAgc3RhdGVzSW5pdEZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBmVGltZURvbWFpbkRvd25zYW1wbGluZwotICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAqZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIFVDSEFSICAgICpiaXRzdHJlYW1CdWZmZXI7CitzdGF0aWMgSU5UIEZES3NickVuY19FbnZJbml0KEhBTkRMRV9TQlJfRUxFTUVOVCBoU2JyRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlndXJhdGlvblB0ciBwYXJhbXMsIElOVCAqY29yZUJhbmRXaXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhb3QsIGludCBuRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGhlYWRlclBlcmlvZCwgVUxPTkcgc3RhdGVzSW5pdEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNCUkVOQ19EU19UWVBFIGRvd25zYW1wbGluZ01ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmR5bmFtaWNfUkFNKSB7CiAgIGludCBjaCwgaTsKIAotICBpZiAoKHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHMgPCAxKSB8fCAocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA+IE1BWF9OVU1fQ0hBTk5FTFMpKXsKLSAgICByZXR1cm4oMSk7CisgIGlmICgocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA8IDEpIHx8CisgICAgICAocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA+IE1BWF9OVU1fQ0hBTk5FTFMpKSB7CisgICAgcmV0dXJuICgxKTsKICAgfQogCi0gIC8qIGluaXRpYWxpemUgdGhlIGVuY29kZXIgaGFuZGxlICBhbmQgc3RydWN0cyovCi0gIGJpdHN0cmVhbUJ1ZmZlciA9IGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lW25CaXRzdHJEZWxheV07Ci0KICAgLyogaW5pdCBhbmQgc2V0IHN5bnRheCBmbGFncyAqLwogICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyA9IDA7CiAKICAgc3dpdGNoIChhb3QpIHsKLSAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKLSAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyB8PSBTQlJfU1lOVEFYX0xPV19ERUxBWTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBicmVhazsKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgfD0gU0JSX1NZTlRBWF9MT1dfREVMQVk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CiAgIH0KICAgaWYgKHBhcmFtcy0+Y3JjU2JyKSB7CiAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgfD0gU0JSX1NZTlRBWF9DUkM7CiAgIH0KIAotICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzID0gUU1GX0NIQU5ORUxTPj4oMi1wYXJhbXMtPmRvd25TYW1wbGVGYWN0b3IpOwotICBzd2l0Y2ggKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMpCi0gIHsKLSAgICBjYXNlIDY0OiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzID0gcGFyYW1zLT5zYnJGcmFtZVNpemU+PjY7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjogaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cyA9IHBhcmFtcy0+c2JyRnJhbWVTaXplPj41OwotICAgICAgICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMgPSBwYXJhbXMtPnNickZyYW1lU2l6ZT4+NjsKLSAgICAgICAgICAgICByZXR1cm4oMik7CisgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMgPSA2NCA+PiAoMiAtIHBhcmFtcy0+ZG93blNhbXBsZUZhY3Rvcik7CisgIHN3aXRjaCAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcykgeworICAgIGNhc2UgNjQ6CisgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzID0gcGFyYW1zLT5zYnJGcmFtZVNpemUgPj4gNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzID0gcGFyYW1zLT5zYnJGcmFtZVNpemUgPj4gNTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzID0gcGFyYW1zLT5zYnJGcmFtZVNpemUgPj4gNjsKKyAgICAgIHJldHVybiAoMik7CiAgIH0KIAotICBGREtpbml0Qml0U3RyZWFtKCZoU2JyRWxlbWVudC0+Q21vbkRhdGEuc2JyQml0YnVmLCBiaXRzdHJlYW1CdWZmZXIsIE1BWF9QQVlMT0FEX1NJWkUqc2l6ZW9mKFVDSEFSKSwgMCwgQlNfV1JJVEVSKTsKLQogICAvKgogICAgIG5vdyBpbml0aWFsaXplIHNickNvbmZpZ0RhdGEsIHNickhlYWRlckRhdGEgYW5kIHNickJpdHN0cmVhbURhdGEsCiAgICovCiAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVscyA9IHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHM7CiAKLSAgaWYocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA9PSAyKQotICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zdGVyZW9Nb2RlID0gcGFyYW1zLT5zdGVyZW9Nb2RlOwotICBlbHNlCi0gICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnN0ZXJlb01vZGUgPSBTQlJfTU9OTzsKKyAgaWYgKHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHMgPT0gMikgeworICAgIGlmICgoaFNickVsZW1lbnQtPmVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSAmJgorICAgICAgICAoKGhTYnJFbGVtZW50LT5lbEluZm8uZkR1YWxNb25vID09IDEpKSkgeworICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc3RlcmVvTW9kZSA9IFNCUl9MRUZUX1JJR0hUOworICAgIH0gZWxzZSB7CisgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zdGVyZW9Nb2RlID0gcGFyYW1zLT5zdGVyZW9Nb2RlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zdGVyZW9Nb2RlID0gU0JSX01PTk87CisgIH0KIAotICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUgICA9IHBhcmFtcy0+c2JyRnJhbWVTaXplOworICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUgPSBwYXJhbXMtPnNickZyYW1lU2l6ZTsKIAotICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxID0gcGFyYW1zLT5kb3duU2FtcGxlRmFjdG9yICogcGFyYW1zLT5jb2RlY1NldHRpbmdzLnNhbXBsZUZyZXE7CisgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgPQorICAgICAgcGFyYW1zLT5kb3duU2FtcGxlRmFjdG9yICogcGFyYW1zLT5jb2RlY1NldHRpbmdzLnNhbXBsZUZyZXE7CiAKICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuQ291bnRTZW5kSGVhZGVyRGF0YSA9IDA7Ci0gIGlmIChwYXJhbXMtPlNlbmRIZWFkZXJEYXRhVGltZSA+IDAgKSB7Ci0KLSAgICBpZiAoaGVhZGVyUGVyaW9kPT0tMSkgewotCi0gICAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gKElOVCkocGFyYW1zLT5TZW5kSGVhZGVyRGF0YVRpbWUgKiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKDEwMDAgKiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUpKTsKLSAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSBmaXhNYXgoaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSwxKTsKLSAgICB9Ci0gICAgZWxzZSB7CisgIGlmIChwYXJhbXMtPlNlbmRIZWFkZXJEYXRhVGltZSA+IDApIHsKKyAgICBpZiAoaGVhZGVyUGVyaW9kID09IC0xKSB7CisgICAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gKElOVCkoCisgICAgICAgICAgcGFyYW1zLT5TZW5kSGVhZGVyRGF0YVRpbWUgKiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxIC8KKyAgICAgICAgICAoMTAwMCAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyYW1lU2l6ZSkpOworICAgICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSA9CisgICAgICAgICAgZml4TWF4KGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEsIDEpOworICAgIH0gZWxzZSB7CiAgICAgICAvKiBhc3N1cmUgaGVhZGVyIHBlcmlvZCBhdCBsZWFzdCBvbmNlIHBlciBzZWNvbmQgKi8KLSAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSBmaXhNaW4oZml4TWF4KGhlYWRlclBlcmlvZCwxKSwoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcS9oU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUpKTsKKyAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSBmaXhNaW4oCisgICAgICAgICAgZml4TWF4KGhlYWRlclBlcmlvZCwgMSksIChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyYW1lU2l6ZSkpOwogICAgIH0KLSAgfQotICBlbHNlIHsKLSAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSAwOworICB9IGVsc2UgeworICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSAwOwogICB9CiAKICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2RhdGFfZXh0cmEgPSBwYXJhbXMtPnNicl9kYXRhX2V4dHJhOwogICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5IZWFkZXJBY3RpdmUgPSAwOworICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5yaWdodEJvcmRlckZJWCA9IDA7CiAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9zdGFydF9mcmVxdWVuY3kgPSBwYXJhbXMtPnN0YXJ0RnJlcTsKLSAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3N0b3BfZnJlcXVlbmN5ICA9IHBhcmFtcy0+c3RvcEZyZXE7CisgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9zdG9wX2ZyZXF1ZW5jeSA9IHBhcmFtcy0+c3RvcEZyZXE7CiAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl94b3Zlcl9iYW5kID0gMDsKICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2xjX3N0ZXJlb19tb2RlID0gMDsKIAogICAvKiBkYXRhX2V4dHJhICovCi0gIGlmIChwYXJhbXMtPnNicl94cG9zX2N0cmwhPSBTQlJfWFBPU19DVFJMX0RFRkFVTFQpCi0gICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9kYXRhX2V4dHJhID0gMTsKKyAgaWYgKHBhcmFtcy0+c2JyX3hwb3NfY3RybCAhPSBTQlJfWFBPU19DVFJMX0RFRkFVTFQpCisgICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2RhdGFfZXh0cmEgPSAxOwogCiAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9hbXBfcmVzID0gKEFNUF9SRVMpcGFyYW1zLT5hbXBfcmVzOwogCiAgIC8qIGhlYWRlcl9leHRyYV8xICovCi0gIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmZyZXFTY2FsZSAgPSBwYXJhbXMtPmZyZXFTY2FsZTsKKyAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuZnJlcVNjYWxlID0gcGFyYW1zLT5mcmVxU2NhbGU7CiAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmFsdGVyU2NhbGUgPSBwYXJhbXMtPmFsdGVyU2NhbGU7CiAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9ub2lzZV9iYW5kcyA9IHBhcmFtcy0+c2JyX25vaXNlX2JhbmRzOwogICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5oZWFkZXJfZXh0cmFfMSA9IDA7CiAKICAgaWYgKChwYXJhbXMtPmZyZXFTY2FsZSAhPSBTQlJfRlJFUV9TQ0FMRV9ERUZBVUxUKSB8fAogICAgICAgKHBhcmFtcy0+YWx0ZXJTY2FsZSAhPSBTQlJfQUxURVJfU0NBTEVfREVGQVVMVCkgfHwKLSAgICAgIChwYXJhbXMtPnNicl9ub2lzZV9iYW5kcyAhPSBTQlJfTk9JU0VfQkFORFNfREVGQVVMVCkpCi0gIHsKLSAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmhlYWRlcl9leHRyYV8xID0gMTsKKyAgICAgIChwYXJhbXMtPnNicl9ub2lzZV9iYW5kcyAhPSBTQlJfTk9JU0VfQkFORFNfREVGQVVMVCkpIHsKKyAgICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5oZWFkZXJfZXh0cmFfMSA9IDE7CiAgIH0KIAogICAvKiBoZWFkZXJfZXh0cmFfMiAqLwpAQCAtMTczNCw5NSArMTc2Nyw5MiBAQAogICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfbGltaXRlcl9nYWlucyA9IHBhcmFtcy0+c2JyX2xpbWl0ZXJfZ2FpbnM7CiAKICAgaWYgKChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxID4gNDgwMDApICYmCi0gICAgICAoaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3N0YXJ0X2ZyZXF1ZW5jeSA+PSA5KSkKLSAgeworICAgICAgKGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9zdGFydF9mcmVxdWVuY3kgPj0gOSkpIHsKICAgICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfbGltaXRlcl9nYWlucyA9IFNCUl9MSU1JVEVSX0dBSU5TX0lORklOSVRFOwogICB9CiAKICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2ludGVycG9sX2ZyZXEgPSBwYXJhbXMtPnNicl9pbnRlcnBvbF9mcmVxOwotICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfc21vb3RoaW5nX2xlbmd0aCA9IHBhcmFtcy0+c2JyX3Ntb290aGluZ19sZW5ndGg7CisgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9zbW9vdGhpbmdfbGVuZ3RoID0KKyAgICAgIHBhcmFtcy0+c2JyX3Ntb290aGluZ19sZW5ndGg7CiAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmhlYWRlcl9leHRyYV8yID0gMDsKIAogICBpZiAoKHBhcmFtcy0+c2JyX2xpbWl0ZXJfYmFuZHMgIT0gU0JSX0xJTUlURVJfQkFORFNfREVGQVVMVCkgfHwKICAgICAgIChwYXJhbXMtPnNicl9saW1pdGVyX2dhaW5zICE9IFNCUl9MSU1JVEVSX0dBSU5TX0RFRkFVTFQpIHx8CiAgICAgICAocGFyYW1zLT5zYnJfaW50ZXJwb2xfZnJlcSAhPSBTQlJfSU5URVJQT0xfRlJFUV9ERUZBVUxUKSB8fAotICAgICAgKHBhcmFtcy0+c2JyX3Ntb290aGluZ19sZW5ndGggIT0gU0JSX1NNT09USElOR19MRU5HVEhfREVGQVVMVCkpCi0gIHsKLSAgICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuaGVhZGVyX2V4dHJhXzIgPSAxOworICAgICAgKHBhcmFtcy0+c2JyX3Ntb290aGluZ19sZW5ndGggIT0gU0JSX1NNT09USElOR19MRU5HVEhfREVGQVVMVCkpIHsKKyAgICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5oZWFkZXJfZXh0cmFfMiA9IDE7CiAgIH0KIAotICAgLyogb3RoZXIgc3dpdGNoZXMgKi8KLSAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudXNlV2F2ZUNvZGluZyAgICAgICAgICAgICA9IHBhcmFtcy0+dXNlV2F2ZUNvZGluZzsKLSAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudXNlUGFyYW1ldHJpY0NvZGluZyAgICAgICA9IHBhcmFtcy0+cGFyYW1ldHJpY0NvZGluZzsKLSAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudGhyZXNob2xkQW1wUmVzRkZfbSAgICAgICA9IHBhcmFtcy0+dGhyZXNob2xkX0FtcFJlc19GRl9tOwotICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS50aHJlc2hvbGRBbXBSZXNGRl9lICAgICAgID0gcGFyYW1zLT50aHJlc2hvbGRfQW1wUmVzX0ZGX2U7CisgIC8qIG90aGVyIHN3aXRjaGVzICovCisgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnVzZVdhdmVDb2RpbmcgPSBwYXJhbXMtPnVzZVdhdmVDb2Rpbmc7CisgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnVzZVBhcmFtZXRyaWNDb2RpbmcgPSBwYXJhbXMtPnBhcmFtZXRyaWNDb2Rpbmc7CisgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnRocmVzaG9sZEFtcFJlc0ZGX20gPQorICAgICAgcGFyYW1zLT50aHJlc2hvbGRfQW1wUmVzX0ZGX207CisgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnRocmVzaG9sZEFtcFJlc0ZGX2UgPQorICAgICAgcGFyYW1zLT50aHJlc2hvbGRfQW1wUmVzX0ZGX2U7CiAKICAgLyogaW5pdCBmcmVxIGJhbmQgdGFibGUgKi8KLSAgaWYodXBkYXRlRnJlcUJhbmRUYWJsZSgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZG93blNhbXBsZUZhY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICkpCi0gIHsKLSAgICByZXR1cm4oMSk7CisgIGlmICh1cGRhdGVGcmVxQmFuZFRhYmxlKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRvd25TYW1wbGVGYWN0b3IpKSB7CisgICAgcmV0dXJuICgxKTsKICAgfQogCiAgIC8qIG5vdyBjcmVhdGUgZW52ZWxvcGUgZXh0IGFuZCBRTUYgZm9yIGVhY2ggYXZhaWxhYmxlIGNoYW5uZWwgKi8KLSAgZm9yICggY2ggPSAwOyBjaCA8IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsgY2grKyApIHsKLQotICAgICBpZiAoIGluaXRFbnZDaGFubmVsKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJDaGFubmVsW2NoXS0+aEVudkNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcKLSAgICAgICAgICAgICAgICAgICAgICAgICxjaAotICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNfUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgKSApCi0gICAgIHsKLSAgICAgICByZXR1cm4oMSk7Ci0gICAgIH0KLQorICBmb3IgKGNoID0gMDsgY2ggPCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBpZiAoaW5pdEVudkNoYW5uZWwoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLCAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFtjaF0tPmhFbnZDaGFubmVsLCBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnLCBjaCwgZHluYW1pY19SQU0pKSB7CisgICAgICByZXR1cm4gKDEpOworICAgIH0KIAogICB9IC8qIG5DaGFubmVscyAqLwogCiAgIC8qIHJlc2V0IGFuZCBpbnRpYWxpemUgYW5hbHlzaXMgcW1mICovCi0gIGZvciAoIGNoID0gMDsgY2ggPCAoKGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8pPzI6aFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzKTsgY2grKyApCi0gIHsKKyAgZm9yIChjaCA9IDA7IGNoIDwgKChoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gMgorICAgICAgICAgICAgICAgICAgICAgICAgIDogaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzKTsKKyAgICAgICBjaCsrKSB7CiAgICAgaW50IGVycjsKLSAgICBVSU5UIHFtZkZsYWdzID0gKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpID8gUU1GX0ZMQUdfQ0xERkIgOiAwOworICAgIFVJTlQgcW1mRmxhZ3MgPQorICAgICAgICAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkKKyAgICAgICAgICAgID8gUU1GX0ZMQUdfQ0xERkIKKyAgICAgICAgICAgIDogMDsKICAgICBpZiAoc3RhdGVzSW5pdEZsYWcpCiAgICAgICBxbWZGbGFncyAmPSB+UU1GX0ZMQUdfS0VFUF9TVEFURVM7CiAgICAgZWxzZQotICAgICAgcW1mRmxhZ3MgfD0gIFFNRl9GTEFHX0tFRVBfU1RBVEVTOworICAgICAgcW1mRmxhZ3MgfD0gUU1GX0ZMQUdfS0VFUF9TVEFURVM7CiAKLSAgICBlcnIgPSBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rKCBoU2JyRWxlbWVudC0+aFFtZkFuYWx5c2lzW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9RQVMqKWhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdLT5GaWx0ZXJTdGF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZGbGFncyApOwotICAgIGlmICgwIT1lcnIpIHsKKyAgICBlcnIgPSBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rKAorICAgICAgICBoU2JyRWxlbWVudC0+aFFtZkFuYWx5c2lzW2NoXSwKKyAgICAgICAgKEZJWFBfUUFTICopaFNickVsZW1lbnQtPmhRbWZBbmFseXNpc1tjaF0tPkZpbHRlclN0YXRlcywKKyAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cywKKyAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcywKKyAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcywKKyAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcywgcW1mRmxhZ3MpOworICAgIGlmICgwICE9IGVycikgewogICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAgIH0KIAogICAvKiAgKi8KICAgaFNickVsZW1lbnQtPkNtb25EYXRhLnhPdmVyRnJlcSA9IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnhPdmVyRnJlcTsKLSAgaFNickVsZW1lbnQtPkNtb25EYXRhLmR5bkJ3RW5hYmxlZCA9IChwYXJhbXMtPmR5bkJ3U3VwcG9ydGVkICYmIHBhcmFtcy0+ZHluQndFbmFibGVkKTsKLSAgaFNickVsZW1lbnQtPkNtb25EYXRhLmR5blhPdmVyRnJlcUVuYyA9IEZES3NickVuY19TYnJHZXRYT3ZlckZyZXEoIGhTYnJFbGVtZW50LCBoU2JyRWxlbWVudC0+Q21vbkRhdGEueE92ZXJGcmVxKTsKLSAgZm9yICggaSA9IDA7IGkgPCA1OyBpKysgKQotICAgICAgaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5W2ldID0gaFNickVsZW1lbnQtPkNtb25EYXRhLmR5blhPdmVyRnJlcUVuYzsKLSAgaFNickVsZW1lbnQtPkNtb25EYXRhLnNick51bUNoYW5uZWxzICA9IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsKKyAgaFNickVsZW1lbnQtPkNtb25EYXRhLmR5bkJ3RW5hYmxlZCA9CisgICAgICAocGFyYW1zLT5keW5Cd1N1cHBvcnRlZCAmJiBwYXJhbXMtPmR5bkJ3RW5hYmxlZCk7CisgIGhTYnJFbGVtZW50LT5DbW9uRGF0YS5keW5YT3ZlckZyZXFFbmMgPQorICAgICAgRkRLc2JyRW5jX1NickdldFhPdmVyRnJlcShoU2JyRWxlbWVudCwgaFNickVsZW1lbnQtPkNtb25EYXRhLnhPdmVyRnJlcSk7CisgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5W2ldID0gaFNickVsZW1lbnQtPkNtb25EYXRhLmR5blhPdmVyRnJlcUVuYzsKKyAgaFNickVsZW1lbnQtPkNtb25EYXRhLnNick51bUNoYW5uZWxzID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOwogICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5keW5YT3ZlckZyZXEgPSBoU2JyRWxlbWVudC0+Q21vbkRhdGEueE92ZXJGcmVxOwogCiAgIC8qIFVwZGF0ZSBCYW5kd2l0aCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvcmUgZW5jb2RlciAqLwogICAqY29yZUJhbmRXaXRoID0gaFNickVsZW1lbnQtPkNtb25EYXRhLnhPdmVyRnJlcTsKIAotICByZXR1cm4oMCk7Ci0gfQorICByZXR1cm4gKDApOworfQogCi1JTlQgc2JyRW5jb2Rlcl9HZXRJbkJ1ZmZlclNpemUoaW50IG5vQ2hhbm5lbHMpCi17CitJTlQgc2JyRW5jb2Rlcl9HZXRJbkJ1ZmZlclNpemUoaW50IG5vQ2hhbm5lbHMpIHsKICAgSU5UIHRlbXA7CiAKICAgdGVtcCA9ICgyMDQ4KTsKQEAgLTE4MzUsNTMgKzE4NjUsNDIgQEAKIC8qCiAgKiBFbmNvZGUgRHVtbXkgU0JSIHBheWxvYWQgZnJhbWVzIHRvIGZpbGwgdGhlIGRlbGF5IGxpbmVzLgogICovCi1zdGF0aWMKLUlOVCBGREtzYnJFbmNfRGVsYXlDb21wZW5zYXRpb24gKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiBoRW52RW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnRpbWVCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBpbnQgbiwgZWw7CitzdGF0aWMgSU5UIEZES3NickVuY19EZWxheUNvbXBlbnNhdGlvbihIQU5ETEVfU0JSX0VOQ09ERVIgaEVudkVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnRpbWVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHRpbWVCdWZmZXJCdWZTaXplKSB7CisgIGludCBuLCBlbDsKIAotICAgIGZvciAobj1oRW52RW5jLT5uQml0c3RyRGVsYXk7IG4+MDsgbi0tKQotICAgIHsKLSAgICAgIGZvciAoZWw9MDsgZWw8aEVudkVuYy0+bm9FbGVtZW50czsgZWwrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKEZES3NickVuY19FbnZFbmNvZGVGcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52RW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVCdWZmZXIgKyBoRW52RW5jLT5kb3duc2FtcGxlZE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52RW5jLT5zYnJFbGVtZW50W2VsXS0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCi0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgc2JyRW5jb2Rlcl9VcGRhdGVCdWZmZXJzKGhFbnZFbmMsIHRpbWVCdWZmZXIpOworICBmb3IgKG4gPSBoRW52RW5jLT5uQml0c3RyRGVsYXk7IG4gPiAwOyBuLS0pIHsKKyAgICBmb3IgKGVsID0gMDsgZWwgPCBoRW52RW5jLT5ub0VsZW1lbnRzOyBlbCsrKSB7CisgICAgICBpZiAoRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lKAorICAgICAgICAgICAgICBoRW52RW5jLCBlbCwKKyAgICAgICAgICAgICAgdGltZUJ1ZmZlciArIGhFbnZFbmMtPmRvd25zYW1wbGVkT2Zmc2V0IC8gaEVudkVuYy0+bkNoYW5uZWxzLAorICAgICAgICAgICAgICB0aW1lQnVmZmVyQnVmU2l6ZSwgTlVMTCwgTlVMTCwgMSkpCisgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0JICByZXR1cm4gMDsKKyAgICBzYnJFbmNvZGVyX1VwZGF0ZUJ1ZmZlcnMoaEVudkVuYywgdGltZUJ1ZmZlciwgdGltZUJ1ZmZlckJ1ZlNpemUpOworICB9CisgIHJldHVybiAwOwogfQogCi1VSU5UIHNickVuY29kZXJfTGltaXRCaXRSYXRlKFVJTlQgYml0UmF0ZSwgVUlOVCBudW1DaGFubmVscywgVUlOVCBjb3JlU2FtcGxlUmF0ZSwgQVVESU9fT0JKRUNUX1RZUEUgYW90KQotewotICBVSU5UIG5ld0JpdFJhdGU7CitVSU5UIHNickVuY29kZXJfTGltaXRCaXRSYXRlKFVJTlQgYml0UmF0ZSwgVUlOVCBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBjb3JlU2FtcGxlUmF0ZSwgQVVESU9fT0JKRUNUX1RZUEUgYW90KSB7CisgIFVJTlQgbmV3Qml0UmF0ZSA9IGJpdFJhdGU7CiAgIElOVCBpbmRleDsKIAogICBGREtfQVNTRVJUKG51bUNoYW5uZWxzID4gMCAmJiBudW1DaGFubmVscyA8PSAyKTsKICAgaWYgKGFvdCA9PSBBT1RfUFMpIHsKLSAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMikgeworICAgIGlmIChudW1DaGFubmVscyA9PSAxKSB7CiAgICAgICBpbmRleCA9IGdldFBzVHVuaW5nVGFibGVJbmRleChiaXRSYXRlLCAmbmV3Qml0UmF0ZSk7CiAgICAgICBpZiAoaW5kZXggPT0gSU5WQUxJRF9UQUJMRV9JRFgpIHsKICAgICAgICAgYml0UmF0ZSA9IG5ld0JpdFJhdGU7CiAgICAgICB9Ci0gICAgICAvKiBTZXQgbnVtQ2hhbm5lbHMgdG8gMSBiZWNhdXNlIGZvciBQUyB3ZSBuZWVkIGEgU0JSIFNDRSAobW9ubykgZWxlbWVudC4gKi8KLSAgICAgIG51bUNoYW5uZWxzID0gMTsKICAgICB9IGVsc2UgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9Ci0gIGluZGV4ID0gZ2V0U2JyVHVuaW5nVGFibGVJbmRleChiaXRSYXRlLCBudW1DaGFubmVscywgY29yZVNhbXBsZVJhdGUsIGFvdCwgJm5ld0JpdFJhdGUpOworICBpbmRleCA9IGdldFNiclR1bmluZ1RhYmxlSW5kZXgoYml0UmF0ZSwgbnVtQ2hhbm5lbHMsIGNvcmVTYW1wbGVSYXRlLCBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3Qml0UmF0ZSk7CiAgIGlmIChpbmRleCAhPSBJTlZBTElEX1RBQkxFX0lEWCkgewogICAgIG5ld0JpdFJhdGUgPSBiaXRSYXRlOwogICB9CkBAIC0xODg5LDUyMyArMTkwOCw2NDAgQEAKICAgcmV0dXJuIG5ld0JpdFJhdGU7CiB9CiAKLVVJTlQgc2JyRW5jb2Rlcl9Jc1NpbmdsZVJhdGVQb3NzaWJsZShBVURJT19PQkpFQ1RfVFlQRSBhb3QpCi17Ci0gIFVJTlQgaXNQb3NzaWJsZT0oQU9UX1BTPT1hb3QpPzA6MTsKK1VJTlQgc2JyRW5jb2Rlcl9Jc1NpbmdsZVJhdGVQb3NzaWJsZShBVURJT19PQkpFQ1RfVFlQRSBhb3QpIHsKKyAgVUlOVCBpc1Bvc3NpYmxlID0gKEFPVF9QUyA9PSBhb3QpID8gMCA6IDE7CiAgIHJldHVybiBpc1Bvc3NpYmxlOwogfQogCi1JTlQgc2JyRW5jb2Rlcl9Jbml0KAotICAgICAgICBIQU5ETEVfU0JSX0VOQ09ERVIgICBoU2JyRW5jb2RlciwKLSAgICAgICAgU0JSX0VMRU1FTlRfSU5GTyAgICAgZWxJbmZvWyg4KV0sCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIG5vRWxlbWVudHMsCi0gICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKmlucHV0QnVmZmVyLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpjb3JlQmFuZHdpZHRoLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICppbnB1dEJ1ZmZlck9mZnNldCwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqbnVtQ2hhbm5lbHMsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmNvcmVTYW1wbGVSYXRlLAotICAgICAgICBVSU5UICAgICAgICAgICAgICAgICpkb3duU2FtcGxlRmFjdG9yLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpmcmFtZUxlbmd0aCwKLSAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgYW90LAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpkZWxheSwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtRmFjdG9yLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBoZWFkZXJQZXJpb2QsCi0gICAgICAgIFVMT05HICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnCi0gICAgICAgICkKLXsKLSAgICBIQU5ETEVfRVJST1JfSU5GTyBlcnJvckluZm8gPSBub0Vycm9yOwotICAgIHNickNvbmZpZ3VyYXRpb24gc2JyQ29uZmlnWyg4KV07Ci0gICAgSU5UIGVycm9yID0gMDsKLSAgICBJTlQgbG93ZXN0QmFuZHdpZHRoOwotICAgIC8qIFNhdmUgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIElOVCBpbnB1dFNhbXBsZVJhdGUgPSAqY29yZVNhbXBsZVJhdGU7Ci0gICAgaW50IGNvcmVGcmFtZUxlbmd0aCA9ICpmcmFtZUxlbmd0aDsKLSAgICBpbnQgaW5wdXRCYW5kV2lkdGggPSAqY29yZUJhbmR3aWR0aDsKLSAgICBpbnQgaW5wdXRDaGFubmVscyA9ICpudW1DaGFubmVsczsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qZnVuY3Rpb25uYW1lOiBzYnJFbmNvZGVyX0luaXRfZGVsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qZGVzY3JpcHRpb246ICBEZXRlcm1pbmUgRGVsYXkgYmFsYW5jaW5nIGFuZCBuZXcgZW5jb2RlciBkZWxheSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qcmV0dXJuczogICAgICAtIGVycm9yIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qaW5wdXQ6ICAgICAgICAtIGZyYW1lIGxlbmd0aCBvZiB0aGUgY29yZSAoaS5lLiBlLmcuIEFBQykgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAtIG51bWJlciBvZiBjaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAtIGRvd25zYW1wbGUgZmFjdG9yICgxIGZvciBkb3duc2FtcGxlZCwgMiBmb3IgZHVhbC1yYXRlIFNCUikgKi8KKy8qICAgICAgICAgICAgICAtIGxvdyBkZWxheSBwcmVzZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAtIHBzIHByZXNlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAtIGRvd25zYW1wbGluZyBtZXRob2Q6IFFNRi0sIHRpbWUgZG9tYWluIG9yIG5vIGRvd25zYW1wbGluZyAgKi8KKy8qICAgICAgICAgICAgICAtIHZhcmlvdXMgZGVsYXkgdmFsdWVzIChzZWUgREVMQVlfUEFSQU0gc3RydWN0IGRlc2NyaXB0aW9uKSAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qRXhhbXBsZTogRGVsYXkgYmFsYW5jaW5nIGZvciBhIEhFLUFBQ3YxIGVuY29kZXIgKHRpbWUtZG9tYWluIGRvd25zYW1wbGluZykgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICstLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLS0rICstLS0tLS0tLSsgKy0tLS0tLS0tKyArLS0tLS0tLS0rICAgICAgKi8KKy8qICAgIHxjb3JlICAgIHwgICAgICAgICAgICB8ZHMgMjoxICB8IHxBQUMgICAgIHwgfFFNRiAgICAgfCB8UU1GICAgICB8ICAgICAgKi8KKy8qICArLStwYXRoICAgICstLS0tLS0tLS0tLS0rICAgICAgICArLStjb3JlICAgICstK2FuYWx5c2lzKy0rb3ZlcmxhcCArLSsgICAgKi8KKy8qICB8IHxvZmZzZXQgIHwgICAgICAgICAgICB8ICAgICAgICB8IHwgICAgICAgIHwgfDMyIGJhbmRzfCB8ICAgICAgICB8IHwgICAgKi8KKy8qICB8ICstLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLS0rICstLS0tLS0tLSsgKy0tLS0tLS0tKyArLS0tLS0tLS0rIHwgICAgKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZSBwYXRoICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsrICAgKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8UU1GICAgICB8ICAgKi8KKy8qLT4rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArc3ludGguICArLT4gKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8NjQgYmFuZHN8ICAgKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsrICAgKi8KKy8qICB8ICstLS0tLS0tLSsgKy0tLS0tLS0tKyArLS0tLS0tLS0rICstLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgIHwgICAgKi8KKy8qICB8IHxTQlIgcGF0aHwgfFFNRiAgICAgfCB8c3ViYmFuZCB8IHxicyBkZWxheXwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgKi8KKy8qICArLStvZmZzZXQgICstK2FuYWx5c2lzKy0rc2FtcGxlICArLSsoZnVsbCAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgKi8KKy8qICAgIHwgICAgICAgIHwgfDY0IGJhbmRzfCB8YnVmZmVyICB8IHwgZnJhbWVzKXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICstLS0tLS0tLSsgKy0tLS0tLS0tKyArLS0tLS0tLS0rICstLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSIHBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQgc2JyRW5jb2Rlcl9Jbml0X2RlbGF5KAorICAgIGNvbnN0IGludCBjb3JlRnJhbWVMZW5ndGgsICAgICAgICAgICAgICAgLyogaW5wdXQgKi8KKyAgICBjb25zdCBpbnQgbnVtQ2hhbm5lbHMsICAgICAgICAgICAgICAgICAgIC8qIGlucHV0ICovCisgICAgY29uc3QgaW50IGRvd25TYW1wbGVGYWN0b3IsICAgICAgICAgICAgICAvKiBpbnB1dCAqLworICAgIGNvbnN0IGludCBsb3dEZWxheSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgKi8KKyAgICBjb25zdCBpbnQgdXNlUHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0ICovCisgICAgY29uc3QgaW50IGlzMjEyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCAqLworICAgIGNvbnN0IFNCUkVOQ19EU19UWVBFIGRvd25zYW1wbGluZ01ldGhvZCwgLyogaW5wdXQgKi8KKyAgICBERUxBWV9QQVJBTSAqaERlbGF5UGFyYW0gICAgICAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCAqLworKSB7CisgIGludCBkZWxheUNvcmVQYXRoID0gMDsgICAvKiBkZWxheSBpbiBjb3JlIHBhdGggKi8KKyAgaW50IGRlbGF5U2JyUGF0aCA9IDA7ICAgIC8qIGRlbGF5IGRpZmZlcmVuY2UgaW4gUU1GIGFrYSBTQlIgcGF0aCAqLworICBpbnQgZGVsYXlJbnB1dDJDb3JlID0gMDsgLyogZGVsYXkgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIGNvcmUgKi8KKyAgaW50IGRlbGF5U2JyRGVjID0gMDsgICAgIC8qIGRlbGF5IG9mIHRoZSBkZWNvZGVyJ3MgU0JSIG1vZHVsZSAqLwogCi0gICAgaW50IGRvd25zYW1wbGVkT2Zmc2V0ID0gMDsKLSAgICBpbnQgc2JyT2Zmc2V0ID0gMDsKLSAgICBpbnQgZG93bnNhbXBsZXJEZWxheSA9IDA7Ci0gICAgaW50IHRpbWVEb21haW5Eb3duc2FtcGxlID0gMDsKLSAgICBpbnQgbkJpdHN0ckRlbGF5ID0gMDsKLSAgICBpbnQgaGlnaGVzdFNiclN0YXJ0RnJlcSwgaGlnaGVzdFNiclN0b3BGcmVxOwotICAgIGludCBsb3dEZWxheSA9IDA7Ci0gICAgaW50IHVzZVBzID0gMDsKKyAgaW50IGRlbGF5Q29yZSA9IGhEZWxheVBhcmFtLT5kZWxheTsgLyogZGVsYXkgb2YgdGhlIGNvcmUgKi8KIAotICAgIC8qIGNoZWNrIHdoZXRoZXIgU0JSIHNldHRpbmcgaXMgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKGJpdHJhdGUsIHNhbXBsZXJhdGUpICovCi0gICAgaWYgKCFzYnJFbmNvZGVyX0lzU2luZ2xlUmF0ZVBvc3NpYmxlKGFvdCkpIHsKLSAgICAgICpkb3duU2FtcGxlRmFjdG9yID0gMjsKKyAgLyogQWRkZWQgZGVsYXkgYnkgdGhlIFNCUiBkZWxheSBpbml0aWFsaXphdGlvbiAqLworICBpbnQgY29yZVBhdGhPZmZzZXQgPSAwOyAvKiBjb3JlIHBhdGggKi8KKyAgaW50IHNiclBhdGhPZmZzZXQgPSAwOyAgLyogc2JyIHBhdGggKi8KKyAgaW50IGJpdHN0cmVhbURlbGF5ID0gMDsgLyogc2JyIHBhdGgsIGZyYW1ld2lzZSAqLworCisgIGludCBmbENvcmUgPSBjb3JlRnJhbWVMZW5ndGg7IC8qIGNvcmUgZnJhbWUgbGVuZ3RoICovCisKKyAgaW50IHJldHVyblZhbHVlID0gMDsgLyogcmV0dXJuIHZhbHVlIC0gMCBtZWFuczogbm8gZXJyb3IgKi8KKworICAvKiAxKSBDYWxjdWxhdGUgYWN0dWFsIGRlbGF5ICBmb3IgY29yZSBhbmQgU0JSIHBhdGggKi8KKyAgaWYgKGlzMjEyKSB7CisgICAgZGVsYXlDb3JlUGF0aCA9IERFTEFZX0NPUkVQQVRIX0VMRHYyU0JSKGZsQ29yZSwgZG93blNhbXBsZUZhY3Rvcik7CisgICAgZGVsYXlTYnJQYXRoID0gREVMQVlfRUxEdjJTQlIoZmxDb3JlLCBkb3duU2FtcGxlRmFjdG9yKTsKKyAgICBkZWxheVNickRlYyA9ICgoZmxDb3JlKSAvIDIpICogKGRvd25TYW1wbGVGYWN0b3IpOworICB9IGVsc2UgaWYgKGxvd0RlbGF5KSB7CisgICAgZGVsYXlDb3JlUGF0aCA9IERFTEFZX0NPUkVQQVRIX0VMRFNCUihmbENvcmUsIGRvd25TYW1wbGVGYWN0b3IpOworICAgIGRlbGF5U2JyUGF0aCA9IERFTEFZX0VMRFNCUihmbENvcmUsIGRvd25TYW1wbGVGYWN0b3IpOworICAgIGRlbGF5U2JyRGVjID0gREVMQVlfUU1GX1BPU1RQUk9DKGRvd25TYW1wbGVGYWN0b3IpOworICB9IGVsc2UgaWYgKHVzZVBzKSB7CisgICAgZGVsYXlDb3JlUGF0aCA9IERFTEFZX0NPUkVQQVRIX1BTKGZsQ29yZSwgZG93blNhbXBsZUZhY3Rvcik7CisgICAgZGVsYXlTYnJQYXRoID0gREVMQVlfUFMoZmxDb3JlLCBkb3duU2FtcGxlRmFjdG9yKTsKKyAgICBkZWxheVNickRlYyA9IERFTEFZX0NPUkVQQVRIX1NCUihmbENvcmUsIGRvd25TYW1wbGVGYWN0b3IpOworICB9IGVsc2UgeworICAgIGRlbGF5Q29yZVBhdGggPSBERUxBWV9DT1JFUEFUSF9TQlIoZmxDb3JlLCBkb3duU2FtcGxlRmFjdG9yKTsKKyAgICBkZWxheVNiclBhdGggPSBERUxBWV9TQlIoZmxDb3JlLCBkb3duU2FtcGxlRmFjdG9yKTsKKyAgICBkZWxheVNickRlYyA9IERFTEFZX0NPUkVQQVRIX1NCUihmbENvcmUsIGRvd25TYW1wbGVGYWN0b3IpOworICB9CisgIGRlbGF5Q29yZVBhdGggKz0gZGVsYXlDb3JlICogZG93blNhbXBsZUZhY3RvcjsKKyAgZGVsYXlDb3JlUGF0aCArPQorICAgICAgKGRvd25zYW1wbGluZ01ldGhvZCA9PSBTQlJFTkNfRFNfVElNRSkgPyBoRGVsYXlQYXJhbS0+ZHNEZWxheSA6IDA7CisKKyAgLyogMikgTWFuYWdlIGNvdXBsaW5nIG9mIHBhdGhzICovCisgIGlmIChkb3duc2FtcGxpbmdNZXRob2QgPT0gU0JSRU5DX0RTX1FNRiAmJiBkZWxheUNvcmVQYXRoID4gZGVsYXlTYnJQYXRoKSB7CisgICAgLyogSW4gY2FzZSBvZiBRTUYgZG93bnNhbXBsaW5nLCBib3RoIHBhdGhzIGFyZSBjb3VwbGVkLCBpLmUuIHRoZSBTQlIgcGF0aAorICAgICAgIG9mZnNldCB3b3VsZCBiZSBhZGRlZCB0byBib3RoIHRoZSBTQlIgcGF0aCBhbmQgdG8gdGhlIGNvcmUgcGF0aAorICAgICAgIGFzIHdlbGwsIHRodXMgbWFraW5nIGl0IGltcG9zc2libGUgdG8gYWNoaWV2ZSBkZWxheSBiYWxhbmNpbmcuCisgICAgICAgVG8gb3ZlcmNvbWUgdGhhdCBwcm9ibGVtLCBhIGZyYW1ld2lzZSBkZWxheSBpcyBhZGRlZCB0byB0aGUgU0JSIHBhdGgKKyAgICAgICBmaXJzdCwgdW50aWwgdGhlIG92ZXJhbGwgZGVsYXkgb2YgdGhlIGNvcmUgcGF0aCBpcyBzaG9ydGVyIHRoYW4KKyAgICAgICB0aGUgZGVsYXkgb2YgdGhlIFNCUiBwYXRoLiBXaGVuIHRoaXMgaXMgYWNoaWV2ZWQsIHRoZSBtaXNzaW5nIGRlbGF5CisgICAgICAgZGlmZmVyZW5jZSBjYW4gYmUgYWRkZWQgYXMgZG93bnNhbXBsZWQgb2Zmc2V0IHRvIHRoZSBjb3JlIHBhdGguCisgICAgKi8KKyAgICB3aGlsZSAoZGVsYXlDb3JlUGF0aCA+IGRlbGF5U2JyUGF0aCkgeworICAgICAgLyogQWRkIG9uZSBmcmFtZSBkZWxheSB0byBTQlIgcGF0aCAqLworICAgICAgZGVsYXlTYnJQYXRoICs9IGZsQ29yZSAqIGRvd25TYW1wbGVGYWN0b3I7CisgICAgICBiaXRzdHJlYW1EZWxheSArPSAxOwogICAgIH0KKyAgfQogCi0KLQotICAgIGlmICggYW90PT1BT1RfUFMgKSB7Ci0gICAgICAgIHVzZVBzID0gMTsKKyAgLyogMykgQ2FsY3VsYXRlIG5lY2Vzc2FyeSBhZGRpdGlvbmFsIGRlbGF5IHRvIGJhbGFuY2UgdGhlIHBhdGhzICovCisgIGlmIChkZWxheUNvcmVQYXRoID4gZGVsYXlTYnJQYXRoKSB7CisgICAgLyogRGVsYXkgUU1GIGlucHV0ICovCisgICAgd2hpbGUgKGRlbGF5Q29yZVBhdGggPiBkZWxheVNiclBhdGggKyAoaW50KWZsQ29yZSAqIChpbnQpZG93blNhbXBsZUZhY3RvcikgeworICAgICAgLyogRG8gYml0c3RyZWFtIGZyYW1lLXdpc2UgZGVsYXkgYmFsYW5jaW5nIGlmIHRoZXJlIGFyZQorICAgICAgICAgbW9yZSB0aGFuIFNCUiBmcmFtZWxlbmd0aCBzYW1wbGVzIGRlbGF5IGRpZmZlcmVuY2UgKi8KKyAgICAgIGRlbGF5U2JyUGF0aCArPSBmbENvcmUgKiBkb3duU2FtcGxlRmFjdG9yOworICAgICAgYml0c3RyZWFtRGVsYXkgKz0gMTsKICAgICB9Ci0gICAgaWYgKCBhb3Q9PUFPVF9FUl9BQUNfRUxEICkgewotICAgICAgICBsb3dEZWxheSA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBhb3Q9PUFPVF9FUl9BQUNfTEQgKSB7Ci0gICAgICAgIGVycm9yID0gMTsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KKyAgICAvKiBNdWx0aXBseSBpbnB1dCBvZmZzZXQgYnkgaW5wdXQgY2hhbm5lbHMgKi8KKyAgICBjb3JlUGF0aE9mZnNldCA9IDA7CisgICAgc2JyUGF0aE9mZnNldCA9IChkZWxheUNvcmVQYXRoIC0gZGVsYXlTYnJQYXRoKSAqIG51bUNoYW5uZWxzOworICB9IGVsc2UgeworICAgIC8qIERlbGF5IEFBQyBkYXRhICovCisgICAgLyogTXVsdGlwbHkgZG93bnNhbXBsZWQgb2Zmc2V0IGJ5IEFBQyBjb3JlIGNoYW5uZWxzLiBEaXZpZGUgYnkgMiBiZWNhdXNlIG9mCisgICAgICAgaGFsZiBzYW1wbGVyYXRlIG9mIGRvd25zYW1wbGVkIGRhdGEuICovCisgICAgY29yZVBhdGhPZmZzZXQgPSAoKGRlbGF5U2JyUGF0aCAtIGRlbGF5Q29yZVBhdGgpICogbnVtQ2hhbm5lbHMpID4+CisgICAgICAgICAgICAgICAgICAgICAoZG93blNhbXBsZUZhY3RvciAtIDEpOworICAgIHNiclBhdGhPZmZzZXQgPSAwOworICB9CiAKLSAgICAvKiBQYXJhbWV0cmljIFN0ZXJlbyAqLwotICAgIGlmICggdXNlUHMgKSB7Ci0gICAgICBpZiAoICpudW1DaGFubmVscyA9PSAyICYmIG5vRWxlbWVudHMgPT0gMSkgewotICAgICAgICAvKiBPdmVycmlkZSBFbGVtZW50IHR5cGUgaW4gY2FzZSBvZiBQYXJhbWV0cmljIHN0ZXJlbyAqLwotICAgICAgICBlbEluZm9bMF0uZWxUeXBlID0gSURfU0NFOwotICAgICAgICBlbEluZm9bMF0uZlBhcmFtZXRyaWNTdGVyZW8gPSAxOwotICAgICAgICBlbEluZm9bMF0ubkNoYW5uZWxzSW5FbCA9IDE7Ci0gICAgICAgIC8qIGNvcmUgZW5jb2RlciBnZXRzIGRvd25taXhlZCBtb25vIHNpZ25hbCAqLwotICAgICAgICAqbnVtQ2hhbm5lbHMgID0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVycm9yID0gMTsKLSAgICAgICAgZ290byBiYWlsOwotICAgICAgfQotICAgIH0gLyogdXNlUHMgKi8KKyAgLyogNCkgQ2FsY3VsYXRlIGRlbGF5IGZyb20gaW5wdXQgdG8gY29yZSAqLworICBpZiAodXNlUHMpIHsKKyAgICBkZWxheUlucHV0MkNvcmUgPQorICAgICAgICAoREVMQVlfUU1GX0FOQShkb3duU2FtcGxlRmFjdG9yKSArIERFTEFZX1FNRl9EUyArIERFTEFZX0hZQl9TWU4pICsKKyAgICAgICAgKGRvd25TYW1wbGVGYWN0b3IgKiBjb3JlUGF0aE9mZnNldCkgKyAxOworICB9IGVsc2UgaWYgKGRvd25zYW1wbGluZ01ldGhvZCA9PSBTQlJFTkNfRFNfVElNRSkgeworICAgIGRlbGF5SW5wdXQyQ29yZSA9IGNvcmVQYXRoT2Zmc2V0ICsgaERlbGF5UGFyYW0tPmRzRGVsYXk7CisgIH0gZWxzZSB7CisgICAgZGVsYXlJbnB1dDJDb3JlID0gY29yZVBhdGhPZmZzZXQ7CisgIH0KIAotICAgIC8qIHNldCB0aGUgY29yZSdzIHNhbXBsZSByYXRlICovCi0gICAgc3dpdGNoICgqZG93blNhbXBsZUZhY3RvcikgeworICAvKiA2KSBTZXQgb3V0cHV0IHBhcmFtZXRlcnMgKi8KKyAgaERlbGF5UGFyYW0tPmRlbGF5ID0gRkRLbWF4KGRlbGF5Q29yZVBhdGgsIGRlbGF5U2JyUGF0aCk7IC8qIG92ZXJhbGwgZGVsYXkgKi8KKyAgaERlbGF5UGFyYW0tPnNickRlY0RlbGF5ID0gZGVsYXlTYnJEZWM7ICAgICAgICAgLyogU0JSIGRlY29kZXIgZGVsYXkgKi8KKyAgaERlbGF5UGFyYW0tPmRlbGF5SW5wdXQyQ29yZSA9IGRlbGF5SW5wdXQyQ29yZTsgLyogZGVsYXkgaW5wdXQgLSBjb3JlICovCisgIGhEZWxheVBhcmFtLT5iaXRzdHJEZWxheSA9IGJpdHN0cmVhbURlbGF5OyAgICAvKiBiaXRzdHJlYW0gZGVsYXksIGluIGZyYW1lcyAqLworICBoRGVsYXlQYXJhbS0+Y29yZVBhdGhPZmZzZXQgPSBjb3JlUGF0aE9mZnNldDsgLyogb2Zmc2V0IGFkZGVkIHRvIGNvcmUgcGF0aCAqLworICBoRGVsYXlQYXJhbS0+c2JyUGF0aE9mZnNldCA9IHNiclBhdGhPZmZzZXQ7ICAgLyogb2Zmc2V0IGFkZGVkIHRvIFNCUiBwYXRoICovCisKKyAgcmV0dXJuIHJldHVyblZhbHVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIGZ1bmN0aW9ubmFtZTogc2JyRW5jb2Rlcl9Jbml0CisgZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyB0aGUgU0JSIGVuY29kZXIKKyByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVCBzYnJFbmNvZGVyX0luaXQoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICBTQlJfRUxFTUVOVF9JTkZPIGVsSW5mb1soOCldLCBpbnQgbm9FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqaW5wdXRCdWZmZXIsIFVJTlQgaW5wdXRCdWZmZXJCdWZTaXplLAorICAgICAgICAgICAgICAgICAgICBJTlQgKmNvcmVCYW5kd2lkdGgsIElOVCAqaW5wdXRCdWZmZXJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIElOVCAqbnVtQ2hhbm5lbHMsIGNvbnN0IFVJTlQgc3ludGF4RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIElOVCAqY29yZVNhbXBsZVJhdGUsIFVJTlQgKmRvd25TYW1wbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIElOVCAqZnJhbWVMZW5ndGgsIEFVRElPX09CSkVDVF9UWVBFIGFvdCwgaW50ICpkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zZm9ybUZhY3RvciwgY29uc3QgaW50IGhlYWRlclBlcmlvZCwKKyAgICAgICAgICAgICAgICAgICAgVUxPTkcgc3RhdGVzSW5pdEZsYWcpIHsKKyAgSEFORExFX0VSUk9SX0lORk8gZXJyb3JJbmZvID0gbm9FcnJvcjsKKyAgc2JyQ29uZmlndXJhdGlvbiBzYnJDb25maWdbKDgpXTsKKyAgSU5UIGVycm9yID0gMDsKKyAgSU5UIGxvd2VzdEJhbmR3aWR0aDsKKyAgLyogU2F2ZSBpbnB1dCBwYXJhbWV0ZXJzICovCisgIElOVCBpbnB1dFNhbXBsZVJhdGUgPSAqY29yZVNhbXBsZVJhdGU7CisgIGludCBjb3JlRnJhbWVMZW5ndGggPSAqZnJhbWVMZW5ndGg7CisgIGludCBpbnB1dEJhbmRXaWR0aCA9ICpjb3JlQmFuZHdpZHRoOworICBpbnQgaW5wdXRDaGFubmVscyA9ICpudW1DaGFubmVsczsKKworICBTQlJFTkNfRFNfVFlQRSBkb3duc2FtcGxpbmdNZXRob2QgPSBTQlJFTkNfRFNfTk9ORTsKKyAgaW50IGhpZ2hlc3RTYnJTdGFydEZyZXEsIGhpZ2hlc3RTYnJTdG9wRnJlcTsKKyAgaW50IGxvd0RlbGF5ID0gMDsKKyAgaW50IHVzZVBzID0gMDsKKyAgaW50IGlzMjEyID0gMDsKKworICBERUxBWV9QQVJBTSBkZWxheVBhcmFtOworCisgIC8qIGNoZWNrIHdoZXRoZXIgU0JSIHNldHRpbmcgaXMgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBlbmNvZGVyCisgICAqIGNvbmZpZ3VyYXRpb24gKGJpdHJhdGUsIHNhbXBsZXJhdGUpICovCisgIGlmICghc2JyRW5jb2Rlcl9Jc1NpbmdsZVJhdGVQb3NzaWJsZShhb3QpKSB7CisgICAgKmRvd25TYW1wbGVGYWN0b3IgPSAyOworICB9CisKKyAgaWYgKGFvdCA9PSBBT1RfUFMpIHsKKyAgICB1c2VQcyA9IDE7CisgIH0KKyAgaWYgKGFvdCA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgIGxvd0RlbGF5ID0gMTsKKyAgfSBlbHNlIGlmIChhb3QgPT0gQU9UX0VSX0FBQ19MRCkgeworICAgIGVycm9yID0gMTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBQYXJhbWV0cmljIFN0ZXJlbyAqLworICBpZiAodXNlUHMpIHsKKyAgICBpZiAoKm51bUNoYW5uZWxzID09IDIgJiYgbm9FbGVtZW50cyA9PSAxKSB7CisgICAgICAvKiBPdmVycmlkZSBFbGVtZW50IHR5cGUgaW4gY2FzZSBvZiBQYXJhbWV0cmljIHN0ZXJlbyAqLworICAgICAgZWxJbmZvWzBdLmVsVHlwZSA9IElEX1NDRTsKKyAgICAgIGVsSW5mb1swXS5mUGFyYW1ldHJpY1N0ZXJlbyA9IDE7CisgICAgICBlbEluZm9bMF0ubkNoYW5uZWxzSW5FbCA9IDE7CisgICAgICAvKiBjb3JlIGVuY29kZXIgZ2V0cyBkb3dubWl4ZWQgbW9ubyBzaWduYWwgKi8KKyAgICAgICpudW1DaGFubmVscyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGVycm9yID0gMTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0gLyogdXNlUHMgKi8KKworICAvKiBzZXQgdGhlIGNvcmUncyBzYW1wbGUgcmF0ZSAqLworICBzd2l0Y2ggKCpkb3duU2FtcGxlRmFjdG9yKSB7CiAgICAgY2FzZSAxOgogICAgICAgKmNvcmVTYW1wbGVSYXRlID0gaW5wdXRTYW1wbGVSYXRlOworICAgICAgZG93bnNhbXBsaW5nTWV0aG9kID0gU0JSRU5DX0RTX05PTkU7CiAgICAgICBicmVhazsKICAgICBjYXNlIDI6Ci0gICAgICAqY29yZVNhbXBsZVJhdGUgPSBpbnB1dFNhbXBsZVJhdGU+PjE7CisgICAgICAqY29yZVNhbXBsZVJhdGUgPSBpbnB1dFNhbXBsZVJhdGUgPj4gMTsKKyAgICAgIGRvd25zYW1wbGluZ01ldGhvZCA9IHVzZVBzID8gU0JSRU5DX0RTX1FNRiA6IFNCUkVOQ19EU19USU1FOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICpjb3JlU2FtcGxlUmF0ZSA9IGlucHV0U2FtcGxlUmF0ZT4+MTsKKyAgICAgICpjb3JlU2FtcGxlUmF0ZSA9IGlucHV0U2FtcGxlUmF0ZSA+PiAxOwogICAgICAgcmV0dXJuIDA7IC8qIHJldHVybiBlcnJvciAqLworICB9CisKKyAgLyogY2hlY2sgd2hldGhlciBTQlIgc2V0dGluZyBpcyBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IGVuY29kZXIKKyAgICogY29uZmlndXJhdGlvbiAoYml0cmF0ZSwgY29yZVNhbXBsZVJhdGUpICovCisgIHsKKyAgICBpbnQgZWwsIGNvcmVFbDsKKworICAgIC8qIENoZWNrIGlmIGV2ZXJ5IGVsZW1lbnQgY29uZmlnIGlzIGZlYXNpYmxlICovCisgICAgZm9yIChjb3JlRWwgPSAwOyBjb3JlRWwgPCBub0VsZW1lbnRzOyBjb3JlRWwrKykgeworICAgICAgLyogU0JSIG9ubHkgaGFuZGxlcyBTQ0UgYW5kIENQRSdzICovCisgICAgICBpZiAoZWxJbmZvW2NvcmVFbF0uZWxUeXBlICE9IElEX1NDRSAmJiBlbEluZm9bY29yZUVsXS5lbFR5cGUgIT0gSURfQ1BFKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLyogY2hlY2sgaWYgZGVzaXJlZCBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZSAqLworICAgICAgaWYgKCFGREtzYnJFbmNfSXNTYnJTZXR0aW5nQXZhaWwoZWxJbmZvW2NvcmVFbF0uYml0UmF0ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsSW5mb1tjb3JlRWxdLm5DaGFubmVsc0luRWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNhbXBsZVJhdGUsICpjb3JlU2FtcGxlUmF0ZSwgYW90KSkgeworICAgICAgICBlcnJvciA9IDE7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KICAgICB9CiAKLSAgICAvKiBjaGVjayB3aGV0aGVyIFNCUiBzZXR0aW5nIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgZW5jb2RlciBjb25maWd1cmF0aW9uIChiaXRyYXRlLCBjb3JlU2FtcGxlUmF0ZSkgKi8KLSAgICB7Ci0gICAgICBpbnQgZGVsYXlEaWZmID0gMDsKLSAgICAgIGludCBlbCwgY29yZUVsOworICAgIGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHMgPSAqbnVtQ2hhbm5lbHM7CisgICAgaFNickVuY29kZXItPmZyYW1lU2l6ZSA9IGNvcmVGcmFtZUxlbmd0aCAqICpkb3duU2FtcGxlRmFjdG9yOworICAgIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxpbmdNZXRob2QgPSBkb3duc2FtcGxpbmdNZXRob2Q7CisgICAgaFNickVuY29kZXItPmRvd25TYW1wbGVGYWN0b3IgPSAqZG93blNhbXBsZUZhY3RvcjsKKyAgICBoU2JyRW5jb2Rlci0+ZXN0aW1hdGVCaXRyYXRlID0gMDsKKyAgICBoU2JyRW5jb2Rlci0+aW5wdXREYXRhRGVsYXkgPSAwOworICAgIGlzMjEyID0gKChhb3QgPT0gQU9UX0VSX0FBQ19FTEQpICYmIChzeW50YXhGbGFncyAmIEFDX0xEX01QUykpID8gMSA6IDA7CiAKLSAgICAgIC8qIENoZWNrIGlmIGV2ZXJ5IGVsZW1lbnQgY29uZmlnIGlzIGZlYXNpYmxlICovCi0gICAgICBmb3IgKGNvcmVFbD0wOyBjb3JlRWw8bm9FbGVtZW50czsgY29yZUVsKyspCi0gICAgICB7Ci0gICAgICAgIC8qIFNCUiBvbmx5IGhhbmRsZXMgU0NFIGFuZCBDUEUncyAqLwotICAgICAgICBpZiAoZWxJbmZvW2NvcmVFbF0uZWxUeXBlICE9IElEX1NDRSAmJiBlbEluZm9bY29yZUVsXS5lbFR5cGUgIT0gSURfQ1BFKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLyogY2hlY2sgaWYgZGVzaXJlZCBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZSAqLwotICAgICAgICBpZiAoICFGREtzYnJFbmNfSXNTYnJTZXR0aW5nQXZhaWwgKGVsSW5mb1tjb3JlRWxdLmJpdFJhdGUsIDAsIGVsSW5mb1tjb3JlRWxdLm5DaGFubmVsc0luRWwsIGlucHV0U2FtcGxlUmF0ZSwgKmNvcmVTYW1wbGVSYXRlLCBhb3QpICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3IgPSAxOwotICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9Ci0gICAgICB9CisgICAgLyogT3BlbiBTQlIgZWxlbWVudHMgKi8KKyAgICBlbCA9IC0xOworICAgIGhpZ2hlc3RTYnJTdGFydEZyZXEgPSBoaWdoZXN0U2JyU3RvcEZyZXEgPSAwOworICAgIGxvd2VzdEJhbmR3aWR0aCA9IDk5OTk5OwogCi0gICAgICAvKiBEZXRlcm1pbmUgRGVsYXkgYmFsYW5jaW5nIGFuZCBuZXcgZW5jb2RlciBkZWxheSAqLwotICAgICAgaWYgKGxvd0RlbGF5KSB7Ci0gICAgICAgIHsKLSAgICAgICAgZGVsYXlEaWZmID0gKCpkZWxheSAqICpkb3duU2FtcGxlRmFjdG9yKSArIERFTEFZX0VMRDJTQlIoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKLSAgICAgICAgKmRlbGF5ID0gREVMQVlfRUxEU0JSKGNvcmVGcmFtZUxlbmd0aCwqZG93blNhbXBsZUZhY3Rvcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHVzZVBzKSB7Ci0gICAgICAgIGRlbGF5RGlmZiA9ICgqZGVsYXkgKiAqZG93blNhbXBsZUZhY3RvcikgKyBERUxBWV9BQUMyUFMoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKLSAgICAgICAgKmRlbGF5ID0gREVMQVlfUFMoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBkZWxheURpZmYgPSBERUxBWV9BQUMyU0JSKGNvcmVGcmFtZUxlbmd0aCwqZG93blNhbXBsZUZhY3Rvcik7Ci0gICAgICAgIGRlbGF5RGlmZiArPSAoKmRlbGF5ICogKmRvd25TYW1wbGVGYWN0b3IpOwotICAgICAgICAqZGVsYXkgPSBERUxBWV9TQlIoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCF1c2VQcykgewotICAgICAgICAgIHRpbWVEb21haW5Eb3duc2FtcGxlID0gKmRvd25TYW1wbGVGYWN0b3ItMTsgIC8qIGFjdGl2YXRlIHRpbWUgZG9tYWluIGRvd25zYW1wbGVyIHdoZW4gZG93blNhbXBsZUZhY3RvciBpcyAhPSAxICovCi0gICAgICB9Ci0KLQotICAgICAgLyogVGFrZSBjYXJlIGFib3V0IGRvd25zYW1wbGVkIGRhdGEgYm91bmQgdG8gdGhlIFNCUiBwYXRoICovCi0gICAgICBpZiAoIXRpbWVEb21haW5Eb3duc2FtcGxlICYmIGRlbGF5RGlmZiA+IDApIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgbXVzdCB0d2VhayB0aGUgYmFsYW5jaW5nIGludG8gYSBzaXR1YXRpb24gd2hlcmUgdGhlIGRvd25zYW1wbGVkIHBhdGgKLSAgICAgICAgICogaXMgdGhlIG9uZSB0byBiZSBkZWxheWVkLCBiZWNhdXNlIGRlbGF5aW5nIHRoZSBRTUYgZG9tYWluIGlucHV0LCBhbHNvIGRlbGF5cwotICAgICAgICAgKiB0aGUgZG93bnNhbXBsZWQgYXVkaW8sIGNvdW50ZXJhY3RpbmcgdG8gdGhlIHB1cnBvc2Ugb2YgZGVsYXkgYmFsYW5jaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgd2hpbGUgKCBkZWxheURpZmYgPiAwICkKLSAgICAgICAgewotICAgICAgICAgIC8qIEVuY29kZXIgZGVsYXkgaW5jcmVhc2VzICovCi0gICAgICAgICAgewotICAgICAgICAgICAgKmRlbGF5ICs9IGNvcmVGcmFtZUxlbmd0aCAqICpkb3duU2FtcGxlRmFjdG9yOwotICAgICAgICAgICAgLyogQWRkIG9uZSBmcmFtZSBkZWxheSB0byBTQlIgcGF0aCAqLwotICAgICAgICAgICAgZGVsYXlEaWZmIC09IGNvcmVGcmFtZUxlbmd0aCAqICpkb3duU2FtcGxlRmFjdG9yOwotICAgICAgICAgIH0KLSAgICAgICAgICBuQml0c3RyRGVsYXkgKz0gMTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICB7Ci0gICAgICAgICpkZWxheSArPSBmaXhwX2FicyhkZWxheURpZmYpOwotICAgICAgfQotCi0gICAgICBpZiAoZGVsYXlEaWZmIDwgMCkgewotICAgICAgICAvKiBEZWxheSBBQUMgZGF0YSAqLwotICAgICAgICBkZWxheURpZmYgPSAtZGVsYXlEaWZmOwotICAgICAgICAvKiBNdWx0aXBseSBkb3duc2FtcGxlZCBvZmZzZXQgYnkgQUFDIGNvcmUgY2hhbm5lbHMuIERpdmlkZSBieSAyIGJlY2F1c2Ugb2YgaGFsZiBzYW1wbGVyYXRlIG9mIGRvd25zYW1wbGVkIGRhdGEuICovCi0gICAgICAgIEZES19BU1NFUlQoKmRvd25TYW1wbGVGYWN0b3I+MCAmJiAqZG93blNhbXBsZUZhY3Rvcjw9Mik7Ci0gICAgICAgIGRvd25zYW1wbGVkT2Zmc2V0ID0gKGRlbGF5RGlmZiooKm51bUNoYW5uZWxzKSk+PigqZG93blNhbXBsZUZhY3Rvci0xKTsKLSAgICAgICAgc2JyT2Zmc2V0ID0gMDsKKyAgICAvKiBMb29wIHRocm91Z2ggZWFjaCBjb3JlIGVuY29kZXIgZWxlbWVudCBhbmQgZ2V0IGEgbWF0Y2hpbmcgU0JSIGVsZW1lbnQKKyAgICAgKiBjb25maWcgKi8KKyAgICBmb3IgKGNvcmVFbCA9IDA7IGNvcmVFbCA8IG5vRWxlbWVudHM7IGNvcmVFbCsrKSB7CisgICAgICAvKiBTQlIgb25seSBoYW5kbGVzIFNDRSBhbmQgQ1BFJ3MgKi8KKyAgICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfU0NFIHx8IGVsSW5mb1tjb3JlRWxdLmVsVHlwZSA9PSBJRF9DUEUpIHsKKyAgICAgICAgZWwrKzsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIERlbGF5IFNCUiBpbnB1dCAqLwotICAgICAgICBpZiAoIGRlbGF5RGlmZiA+IChpbnQpY29yZUZyYW1lTGVuZ3RoICogKGludCkqZG93blNhbXBsZUZhY3RvciApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBEbyBiaXRzdHJlYW0gZnJhbWUtd2lzZSBkZWxheSBiYWxhbmNpbmcgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gU0JSIGZyYW1lbGVuZ3RoIHNhbXBsZXMgZGVsYXkgZGlmZmVyZW5jZSAqLwotICAgICAgICAgIGRlbGF5RGlmZiAtPSBjb3JlRnJhbWVMZW5ndGggKiAqZG93blNhbXBsZUZhY3RvcjsKLSAgICAgICAgICBuQml0c3RyRGVsYXkgPSAxOwotICAgICAgICB9Ci0gICAgICAgIC8qIE11bHRpcGx5IGlucHV0IG9mZnNldCBieSBpbnB1dCBjaGFubmVscyAqLwotICAgICAgICBzYnJPZmZzZXQgPSBkZWxheURpZmYqKCpudW1DaGFubmVscyk7Ci0gICAgICAgIGRvd25zYW1wbGVkT2Zmc2V0ID0gMDsKLSAgICAgIH0KLSAgICAgIGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkgICAgICAgICAgICA9IG5CaXRzdHJEZWxheTsKLSAgICAgIGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHMgICAgICAgICAgICAgICA9ICpudW1DaGFubmVsczsKLSAgICAgIGhTYnJFbmNvZGVyLT5mcmFtZVNpemUgICAgICAgICAgICAgICA9IGNvcmVGcmFtZUxlbmd0aCAqICpkb3duU2FtcGxlRmFjdG9yOwotICAgICAgaFNickVuY29kZXItPmZUaW1lRG9tYWluRG93bnNhbXBsaW5nID0gdGltZURvbWFpbkRvd25zYW1wbGU7Ci0gICAgICBoU2JyRW5jb2Rlci0+ZG93blNhbXBsZUZhY3RvciAgICAgICAgPSAqZG93blNhbXBsZUZhY3RvcjsKLSAgICAgIGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGUgICAgICAgICA9IDA7Ci0gICAgICBoU2JyRW5jb2Rlci0+aW5wdXREYXRhRGVsYXkgICAgICAgICAgPSAwOwotCi0KLSAgICAgIC8qIE9wZW4gU0JSIGVsZW1lbnRzICovCi0gICAgICBlbCA9IC0xOwotICAgICAgaGlnaGVzdFNiclN0YXJ0RnJlcSA9IGhpZ2hlc3RTYnJTdG9wRnJlcSA9IDA7Ci0gICAgICBsb3dlc3RCYW5kd2lkdGggPSA5OTk5OTsKLQotICAgICAgLyogTG9vcCB0aHJvdWdoIGVhY2ggY29yZSBlbmNvZGVyIGVsZW1lbnQgYW5kIGdldCBhIG1hdGNoaW5nIFNCUiBlbGVtZW50IGNvbmZpZyAqLwotICAgICAgZm9yIChjb3JlRWw9MDsgY29yZUVsPG5vRWxlbWVudHM7IGNvcmVFbCsrKQotICAgICAgewotICAgICAgICAvKiBTQlIgb25seSBoYW5kbGVzIFNDRSBhbmQgQ1BFJ3MgKi8KLSAgICAgICAgaWYgKGVsSW5mb1tjb3JlRWxdLmVsVHlwZSA9PSBJRF9TQ0UgfHwgZWxJbmZvW2NvcmVFbF0uZWxUeXBlID09IElEX0NQRSkgewotICAgICAgICAgIGVsKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTZXQgcGFyYW1ldHJpYyBTdGVyZW8gRmxhZy4gKi8KLSAgICAgICAgaWYgKHVzZVBzKSB7Ci0gICAgICAgICAgZWxJbmZvW2NvcmVFbF0uZlBhcmFtZXRyaWNTdGVyZW8gPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGVsSW5mb1tjb3JlRWxdLmZQYXJhbWV0cmljU3RlcmVvID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEluaXQgc2JyQ29uZmlnIHN0cnVjdHVyZQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCAhIEZES3NickVuY19Jbml0aWFsaXplU2JyRGVmYXVsdHMgKCAmc2JyQ29uZmlnW2VsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZG93blNhbXBsZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZUZyYW1lTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19MT1dERUxBWShhb3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSAxOwotICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE1vZGlmeSBzYnJDb25maWcgc3RydWN0dXJlIGFjY29yZGluZyB0byBFbGVtZW50IHBhcmFtZXRlcnMKLSAgICAgICAgICovCi0gICAgICAgIGlmICggISBGREtzYnJFbmNfQWRqdXN0U2JyU2V0dGluZ3MgKCZzYnJDb25maWdbZWxdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxJbmZvW2NvcmVFbF0uYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsSW5mb1tjb3JlRWxdLm5DaGFubmVsc0luRWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb3JlU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAvKiB1c2VTcGVlY2hDb25maWcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAvKiBsY3NNb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQcywgLyogYlBhcmFtZXRyaWNTdGVyZW8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCkgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSAxOwotICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbmQgY29tbW9uIGZyZXF1ZW5jeSBib3JkZXIgZm9yIGFsbCBTQlIgZWxlbWVudHMgKi8KLSAgICAgICAgaGlnaGVzdFNiclN0YXJ0RnJlcSA9IGZpeE1heChoaWdoZXN0U2JyU3RhcnRGcmVxLCBzYnJDb25maWdbZWxdLnN0YXJ0RnJlcSk7Ci0gICAgICAgIGhpZ2hlc3RTYnJTdG9wRnJlcSA9IGZpeE1heChoaWdoZXN0U2JyU3RvcEZyZXEsIHNickNvbmZpZ1tlbF0uc3RvcEZyZXEpOwotCi0gICAgICB9IC8qIGZpcnN0IGVsZW1lbnQgbG9vcCAqLwotCi0gICAgICAvKiBTZXQgZWxlbWVudCBjb3VudCAoY2FuIGJlIGxlc3MgdGhhbiBjb3JlIGVuY29kZXIgZWxlbWVudCBjb3VudCkgKi8KLSAgICAgIGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzID0gZWwrMTsKLQotICAgICAgRkRLc2JyRW5jX1JlYWxsb2NhdGUoaFNickVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBub0VsZW1lbnRzKTsKLQotICAgICAgZm9yIChlbD0wOyBlbDxoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykgewotCi0gICAgICAgIGludCBiYW5kd2lkdGggPSAqY29yZUJhbmR3aWR0aDsKLQotICAgICAgICAvKiBVc2UgbG93ZXN0IGNvbW1vbiBiYW5kd2lkdGggKi8KLSAgICAgICAgc2JyQ29uZmlnW2VsXS5zdGFydEZyZXEgPSBoaWdoZXN0U2JyU3RhcnRGcmVxOwotICAgICAgICBzYnJDb25maWdbZWxdLnN0b3BGcmVxID0gaGlnaGVzdFNiclN0b3BGcmVxOwotCi0gICAgICAgIC8qIGluaXRpYWxpemUgU0JSIGVsZW1lbnQsIGFuZCBnZXQgY29yZSBiYW5kd2lkdGggKi8KLSAgICAgICAgZXJyb3IgPSBGREtzYnJFbmNfRW52SW5pdChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNickNvbmZpZ1tlbF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQml0c3RyRGVsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaFNickVuY29kZXItPmR5bmFtaWNSYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgIGlmIChlcnJvciAhPSAwKSB7Ci0gICAgICAgICAgZXJyb3IgPSAyOwotICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdldCBsb3dlc3QgY29yZSBlbmNvZGVyIGJhbmR3aWR0aCB0byBiZSByZXR1cm5lZCBsYXRlci4gKi8KLSAgICAgICAgbG93ZXN0QmFuZHdpZHRoID0gZml4TWluKGxvd2VzdEJhbmR3aWR0aCwgYmFuZHdpZHRoKTsKLQotICAgICAgfSAvKiBzZWNvbmQgZWxlbWVudCBsb29wICovCi0KLSAgICAgIC8qIEluaXRpYWxpemUgYSBkb3duc2FtcGxlciBmb3IgZWFjaCBjaGFubmVsIGluIGVhY2ggU0JSIGVsZW1lbnQgKi8KLSAgICAgIGlmIChoU2JyRW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcpCi0gICAgICB7Ci0gICAgICAgIGZvciAoZWw9MDsgZWw8aFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspCi0gICAgICAgIHsKLSAgICAgICAgICBIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsID0gaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdOwotICAgICAgICAgIElOVCBXYywgY2g7Ci0KLSAgICAgICAgICAvKiBDYWxjdWxhdGVkIHJlcXVpcmVkIG5vcm1hbGl6ZWQgY3V0b2ZmIGZyZXF1ZW5jeSAoV2MgPSAxLjAgLT4gbG93ZXN0QmFuZHdpZHRoID0gaW5wdXRTYW1wbGVSYXRlLzIpICovCi0gICAgICAgICAgV2MgPSAoMipsb3dlc3RCYW5kd2lkdGgpKjEwMDAgLyBpbnB1dFNhbXBsZVJhdGU7Ci0KLSAgICAgICAgICBmb3IgKGNoPTA7IGNoPGhTYnJFbC0+ZWxJbmZvLm5DaGFubmVsc0luRWw7IGNoKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgRkRLYWFjRW5jX0luaXREb3duc2FtcGxlciAoJmhTYnJFbC0+c2JyQ2hhbm5lbFtjaF0tPmRvd25TYW1wbGVyLCBXYywgKmRvd25TYW1wbGVGYWN0b3IpOwotICAgICAgICAgICAgRkRLX0FTU0VSVCAoaFNickVsLT5zYnJDaGFubmVsW2NoXS0+ZG93blNhbXBsZXIuZGVsYXkgPD1NQVhfRFNfRklMVEVSX0RFTEFZKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBkb3duc2FtcGxlckRlbGF5ID0gaFNickVsLT5zYnJDaGFubmVsWzBdLT5kb3duU2FtcGxlci5kZWxheTsKLSAgICAgICAgfSAvKiB0aGlyZCBlbGVtZW50IGxvb3AgKi8KLQotICAgICAgICAvKiBsZmUgKi8KLSAgICAgICAgRkRLYWFjRW5jX0luaXREb3duc2FtcGxlciAoJmhTYnJFbmNvZGVyLT5sZmVEb3duU2FtcGxlciwgMCwgKmRvd25TYW1wbGVGYWN0b3IpOwotCi0gICAgICAgIC8qIEFkZCB0aGUgcmVzYW1wbGVyIGFkZGl0aW9uYWwgZGVsYXkgdG8gZ2V0IHRoZSBmaW5hbCBkZWxheSBhbmQgYnVmZmVyIG9mZnNldCB2YWx1ZXMuICovCi0gICAgICAgIGlmIChzYnJPZmZzZXQgPiAwIHx8IGRvd25zYW1wbGVkT2Zmc2V0IDw9ICgoZG93bnNhbXBsZXJEZWxheSAqICgqbnVtQ2hhbm5lbHMpKT4+KCpkb3duU2FtcGxlRmFjdG9yLTEpKSkgewotICAgICAgICAgIHNick9mZnNldCArPSAoZG93bnNhbXBsZXJEZWxheSAtIGRvd25zYW1wbGVkT2Zmc2V0KSAqICgqbnVtQ2hhbm5lbHMpIDsKLSAgICAgICAgICAqZGVsYXkgKz0gZG93bnNhbXBsZXJEZWxheSAtIGRvd25zYW1wbGVkT2Zmc2V0OwotICAgICAgICAgIGRvd25zYW1wbGVkT2Zmc2V0ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBkb3duc2FtcGxlZE9mZnNldCAtPSAoZG93bnNhbXBsZXJEZWxheSAqICgqbnVtQ2hhbm5lbHMpKT4+KCpkb3duU2FtcGxlRmFjdG9yLTEpOwotICAgICAgICAgIHNick9mZnNldCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBoU2JyRW5jb2Rlci0+aW5wdXREYXRhRGVsYXkgPSBkb3duc2FtcGxlckRlbGF5OworICAgICAgICBjb250aW51ZTsKICAgICAgIH0KIAotICAgICAgLyogQXNzaWduIGNvcmUgZW5jb2RlciBCYW5kd2lkdGggKi8KLSAgICAgICpjb3JlQmFuZHdpZHRoID0gbG93ZXN0QmFuZHdpZHRoOworICAgICAgLyogU2V0IHBhcmFtZXRyaWMgU3RlcmVvIEZsYWcuICovCisgICAgICBpZiAodXNlUHMpIHsKKyAgICAgICAgZWxJbmZvW2NvcmVFbF0uZlBhcmFtZXRyaWNTdGVyZW8gPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZWxJbmZvW2NvcmVFbF0uZlBhcmFtZXRyaWNTdGVyZW8gPSAwOworICAgICAgfQogCi0gICAgICAvKiBFc3RpbWF0ZSBzYnIgYml0cmF0ZSwgMi41IGtCaXQvcyBwZXIgc2JyIGNoYW5uZWwgKi8KLSAgICAgIGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGUgKz0gMjUwMCAqICgqbnVtQ2hhbm5lbHMpOworICAgICAgLyoKKyAgICAgICAqIEluaXQgc2JyQ29uZmlnIHN0cnVjdHVyZQorICAgICAgICovCisgICAgICBpZiAoIUZES3NickVuY19Jbml0aWFsaXplU2JyRGVmYXVsdHMoJnNickNvbmZpZ1tlbF0sICpkb3duU2FtcGxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVGcmFtZUxlbmd0aCwgSVNfTE9XREVMQVkoYW90KSkpIHsKKyAgICAgICAgZXJyb3IgPSAxOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CiAKLSAgICAgIC8qIGluaXRpYWxpemUgcGFyYW1ldHJpYyBzdGVyZW8gKi8KLSAgICAgIGlmICh1c2VQcykKLSAgICAgIHsKLSAgICAgICAgUFNFTkNfQ09ORklHIHBzRW5jQ29uZmlnOwotICAgICAgICBGREtfQVNTRVJUKGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzID09IDEpOwotICAgICAgICBJTlQgcHNUdW5pbmdUYWJsZUlkeCA9IGdldFBzVHVuaW5nVGFibGVJbmRleChlbEluZm9bMF0uYml0UmF0ZSwgTlVMTCk7CisgICAgICAvKgorICAgICAgICogTW9kaWZ5IHNickNvbmZpZyBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIEVsZW1lbnQgcGFyYW1ldGVycworICAgICAgICovCisgICAgICBpZiAoIUZES3NickVuY19BZGp1c3RTYnJTZXR0aW5ncygKKyAgICAgICAgICAgICAgJnNickNvbmZpZ1tlbF0sIGVsSW5mb1tjb3JlRWxdLmJpdFJhdGUsCisgICAgICAgICAgICAgIGVsSW5mb1tjb3JlRWxdLm5DaGFubmVsc0luRWwsICpjb3JlU2FtcGxlUmF0ZSwgaW5wdXRTYW1wbGVSYXRlLAorICAgICAgICAgICAgICB0cmFuc2Zvcm1GYWN0b3IsIDI0MDAwLCAwLCAwLCAvKiB1c2VTcGVlY2hDb25maWcgKi8KKyAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGNzTW9kZSAqLworICAgICAgICAgICAgICB1c2VQcywgICAgICAgICAgICAgICAgICAgICAgICAvKiBiUGFyYW1ldHJpY1N0ZXJlbyAqLworICAgICAgICAgICAgICBhb3QpKSB7CisgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQogCi0gICAgICAgIHBzRW5jQ29uZmlnLmZyYW1lU2l6ZSAgICAgICAgICAgPSBjb3JlRnJhbWVMZW5ndGg7IC8vc2JyQ29uZmlnLnNickZyYW1lU2l6ZTsKLSAgICAgICAgcHNFbmNDb25maWcucW1mRmlsdGVyTW9kZSAgICAgICA9IDA7Ci0gICAgICAgIHBzRW5jQ29uZmlnLnNiclBzRGVsYXkgICAgICAgICAgPSAwOworICAgICAgLyogRmluZCBjb21tb24gZnJlcXVlbmN5IGJvcmRlciBmb3IgYWxsIFNCUiBlbGVtZW50cyAqLworICAgICAgaGlnaGVzdFNiclN0YXJ0RnJlcSA9CisgICAgICAgICAgZml4TWF4KGhpZ2hlc3RTYnJTdGFydEZyZXEsIHNickNvbmZpZ1tlbF0uc3RhcnRGcmVxKTsKKyAgICAgIGhpZ2hlc3RTYnJTdG9wRnJlcSA9IGZpeE1heChoaWdoZXN0U2JyU3RvcEZyZXEsIHNickNvbmZpZ1tlbF0uc3RvcEZyZXEpOwogCi0gICAgICAgIC8qIHR1bmluZyBwYXJhbWV0ZXJzICovCi0gICAgICAgIGlmIChwc1R1bmluZ1RhYmxlSWR4ICAhPSBJTlZBTElEX1RBQkxFX0lEWCkgewotICAgICAgICAgIHBzRW5jQ29uZmlnLm5TdGVyZW9CYW5kcyAgICAgICAgICAgPSBwc1R1bmluZ1RhYmxlW3BzVHVuaW5nVGFibGVJZHhdLm5TdGVyZW9CYW5kczsKLSAgICAgICAgICBwc0VuY0NvbmZpZy5tYXhFbnZlbG9wZXMgICAgICAgICAgID0gcHNUdW5pbmdUYWJsZVtwc1R1bmluZ1RhYmxlSWR4XS5uRW52ZWxvcGVzOwotICAgICAgICAgIHBzRW5jQ29uZmlnLmlpZFF1YW50RXJyb3JUaHJlc2hvbGQgPSAoRklYUF9EQkwpcHNUdW5pbmdUYWJsZVtwc1R1bmluZ1RhYmxlSWR4XS5paWRRdWFudEVycm9yVGhyZXNob2xkOworICAgIH0gLyogZmlyc3QgZWxlbWVudCBsb29wICovCiAKLSAgICAgICAgICAvKiBjYWxjdWxhdGlvbiBpcyBub3QgcXVpdGUgbGluZWFyLCBpbmNyZWFzZWQgbnVtYmVyIG9mIGVudmVsb3BlcyBjYXVzZXMgbW9yZSBiaXRzICovCi0gICAgICAgICAgLyogYXNzdW1lIGF2Zy4gNTAgYml0cyBwZXIgZnJhbWUgZm9yIDEwIHN0ZXJlbyBiYW5kcyAvIDEgZW52ZWxvcGUgY29uZmlndXJhdGlvbiAqLwotICAgICAgICAgIGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGUgKz0gKCAoKCgqY29yZVNhbXBsZVJhdGUpICogNSAqIHBzRW5jQ29uZmlnLm5TdGVyZW9CYW5kcyAqIHBzRW5jQ29uZmlnLm1heEVudmVsb3BlcykgLyBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplKSk7CisgICAgLyogU2V0IGVsZW1lbnQgY291bnQgKGNhbiBiZSBsZXNzIHRoYW4gY29yZSBlbmNvZGVyIGVsZW1lbnQgY291bnQpICovCisgICAgaFNickVuY29kZXItPm5vRWxlbWVudHMgPSBlbCArIDE7CiAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBlcnJvciA9IEVSUk9SKENESSwgIkludmFsaWQgcHMgdHVuaW5nIHRhYmxlIGluZGV4LiIpOwotICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICBGREtzYnJFbmNfUmVhbGxvY2F0ZShoU2JyRW5jb2RlciwgZWxJbmZvLCBub0VsZW1lbnRzKTsKKworICAgIGZvciAoZWwgPSAwOyBlbCA8IGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKSB7CisgICAgICBpbnQgYmFuZHdpZHRoID0gKmNvcmVCYW5kd2lkdGg7CisKKyAgICAgIC8qIFVzZSBsb3dlc3QgY29tbW9uIGJhbmR3aWR0aCAqLworICAgICAgc2JyQ29uZmlnW2VsXS5zdGFydEZyZXEgPSBoaWdoZXN0U2JyU3RhcnRGcmVxOworICAgICAgc2JyQ29uZmlnW2VsXS5zdG9wRnJlcSA9IGhpZ2hlc3RTYnJTdG9wRnJlcTsKKworICAgICAgLyogaW5pdGlhbGl6ZSBTQlIgZWxlbWVudCwgYW5kIGdldCBjb3JlIGJhbmR3aWR0aCAqLworICAgICAgZXJyb3IgPSBGREtzYnJFbmNfRW52SW5pdChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0sICZzYnJDb25maWdbZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFuZHdpZHRoLCBhb3QsIGVsLCBoZWFkZXJQZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnLCBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsaW5nTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+ZHluYW1pY1JhbSk7CisKKyAgICAgIGlmIChlcnJvciAhPSAwKSB7CisgICAgICAgIGVycm9yID0gMjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICAvKiBHZXQgbG93ZXN0IGNvcmUgZW5jb2RlciBiYW5kd2lkdGggdG8gYmUgcmV0dXJuZWQgbGF0ZXIuICovCisgICAgICBsb3dlc3RCYW5kd2lkdGggPSBmaXhNaW4obG93ZXN0QmFuZHdpZHRoLCBiYW5kd2lkdGgpOworCisgICAgfSAvKiBzZWNvbmQgZWxlbWVudCBsb29wICovCisKKyAgICAvKiBJbml0aWFsaXplIGEgZG93bnNhbXBsZXIgZm9yIGVhY2ggY2hhbm5lbCBpbiBlYWNoIFNCUiBlbGVtZW50ICovCisgICAgaWYgKGhTYnJFbmNvZGVyLT5kb3duc2FtcGxpbmdNZXRob2QgPT0gU0JSRU5DX0RTX1RJTUUpIHsKKyAgICAgIGZvciAoZWwgPSAwOyBlbCA8IGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKSB7CisgICAgICAgIEhBTkRMRV9TQlJfRUxFTUVOVCBoU2JyRWwgPSBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF07CisgICAgICAgIElOVCBXYywgY2g7CisKKyAgICAgICAgV2MgPSA1MDA7IC8qIEN1dG9mZiBmcmVxdWVuY3kgd2l0aCBmdWxsIGJhbmR3aWR0aCAqLworCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGhTYnJFbC0+ZWxJbmZvLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgICAgICAgICBGREthYWNFbmNfSW5pdERvd25zYW1wbGVyKCZoU2JyRWwtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlciwgV2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZG93blNhbXBsZUZhY3Rvcik7CisgICAgICAgICAgRkRLX0FTU0VSVChoU2JyRWwtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlci5kZWxheSA8PQorICAgICAgICAgICAgICAgICAgICAgTUFYX0RTX0ZJTFRFUl9ERUxBWSk7CiAgICAgICAgIH0KKyAgICAgIH0gLyogdGhpcmQgZWxlbWVudCBsb29wICovCiAKLSAgICAgICAgcW1mSW5pdFN5bnRoZXNpc0ZpbHRlckJhbmsoJmhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCopaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLkZpbHRlclN0YXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzPj4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcz4+MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHM+PjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGVzSW5pdEZsYWcpID8gMCA6IFFNRl9GTEFHX0tFRVBfU1RBVEVTKTsKLQotICAgICAgICBpZihlcnJvckluZm8gPT0gbm9FcnJvcil7Ci0gICAgICAgICAgLyogdXBkYXRlIGRlbGF5ICovCi0gICAgICAgICAgcHNFbmNDb25maWcuc2JyUHNEZWxheSA9IEZES3NickVuY19HZXRFbnZFc3REZWxheSgmaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNoYW5uZWxbMF0tPmhFbnZDaGFubmVsLnNickV4dHJhY3RFbnZlbG9wZSk7Ci0KLSAgICAgICAgICBpZihub0Vycm9yICE9IChlcnJvckluZm8gPSBQU0VuY19Jbml0KCBoU2JyRW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNFbmNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaFNickVuY29kZXItPmR5bmFtaWNSYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvckluZm8gPSBoYW5kQmFjayhlcnJvckluZm8pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIFFNRiBhbmFseXNpcyArIEh5YnJpZCBhbmFseXNpcyArIEh5YnJpZCBzeW50aGVzaXMgKyBRTUYgc3ludGhlc2lzICsgZG93bnNhbXBsZWQgaW5wdXQgYnVmZmVyIGRlbGF5ICovCi0gICAgICAgIGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheSA9ICg2NCoxMC8yKSArICg2KjY0KSArICAoMCkgKyAoNjQqMTAvMi02NCsxKSArICgoKmRvd25TYW1wbGVGYWN0b3IpKmRvd25zYW1wbGVkT2Zmc2V0KTsKLSAgICAgIH0KLQotICAgICAgaFNickVuY29kZXItPmRvd25zYW1wbGVkT2Zmc2V0ID0gZG93bnNhbXBsZWRPZmZzZXQ7Ci0gICAgICB7Ci0gICAgICAgIGhTYnJFbmNvZGVyLT5kb3dubWl4U2l6ZSA9IGNvcmVGcmFtZUxlbmd0aCooKm51bUNoYW5uZWxzKTsKLSAgICAgIH0KLQotICAgICAgaFNickVuY29kZXItPmJ1ZmZlck9mZnNldCA9IHNick9mZnNldDsKLSAgICAgIC8qIERlbGF5IENvbXBlbnNhdGlvbjogZmlsbCBiaXRzdHJlYW0gZGVsYXkgYnVmZmVyIHdpdGggemVybyBpbnB1dCBzaWduYWwgKi8KLSAgICAgIGlmICggaFNickVuY29kZXItPm5CaXRzdHJEZWxheSA+IDAgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZES3NickVuY19EZWxheUNvbXBlbnNhdGlvbiAoaFNickVuY29kZXIsIGlucHV0QnVmZmVyKTsKLSAgICAgICAgaWYgKGVycm9yICE9IDApCi0gICAgICAgICAgZ290byBiYWlsOwotICAgICAgfQotCi0gICAgICAvKiBTZXQgT3V0cHV0IGZyYW1lIGxlbmd0aCAqLwotICAgICAgKmZyYW1lTGVuZ3RoID0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7Ci0gICAgICAvKiBJbnB1dCBidWZmZXIgb2Zmc2V0ICovCi0gICAgICAqaW5wdXRCdWZmZXJPZmZzZXQgPSBmaXhNYXgoc2JyT2Zmc2V0LCBkb3duc2FtcGxlZE9mZnNldCk7Ci0KLQorICAgICAgLyogbGZlICovCisgICAgICBGREthYWNFbmNfSW5pdERvd25zYW1wbGVyKCZoU2JyRW5jb2Rlci0+bGZlRG93blNhbXBsZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkb3duU2FtcGxlRmFjdG9yKTsKICAgICB9CiAKLSAgICByZXR1cm4gZXJyb3I7CisgICAgLyogR2V0IGRlbGF5IGluZm9ybWF0aW9uICovCisgICAgZGVsYXlQYXJhbS5kc0RlbGF5ID0KKyAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNoYW5uZWxbMF0tPmRvd25TYW1wbGVyLmRlbGF5OworICAgIGRlbGF5UGFyYW0uZGVsYXkgPSAqZGVsYXk7CisKKyAgICBlcnJvciA9IHNickVuY29kZXJfSW5pdF9kZWxheShjb3JlRnJhbWVMZW5ndGgsICpudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZG93blNhbXBsZUZhY3RvciwgbG93RGVsYXksIHVzZVBzLCBpczIxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duc2FtcGxpbmdNZXRob2QsICZkZWxheVBhcmFtKTsKKworICAgIGlmIChlcnJvciAhPSAwKSB7CisgICAgICBlcnJvciA9IDM7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaFNickVuY29kZXItPm5CaXRzdHJEZWxheSA9IGRlbGF5UGFyYW0uYml0c3RyRGVsYXk7CisgICAgaFNickVuY29kZXItPnNickRlY0RlbGF5ID0gZGVsYXlQYXJhbS5zYnJEZWNEZWxheTsKKyAgICBoU2JyRW5jb2Rlci0+aW5wdXREYXRhRGVsYXkgPSBkZWxheVBhcmFtLmRlbGF5SW5wdXQyQ29yZTsKKworICAgIC8qIEFzc2lnbiBjb3JlIGVuY29kZXIgQmFuZHdpZHRoICovCisgICAgKmNvcmVCYW5kd2lkdGggPSBsb3dlc3RCYW5kd2lkdGg7CisKKyAgICAvKiBFc3RpbWF0ZSBzYnIgYml0cmF0ZSwgMi41IGtCaXQvcyBwZXIgc2JyIGNoYW5uZWwgKi8KKyAgICBoU2JyRW5jb2Rlci0+ZXN0aW1hdGVCaXRyYXRlICs9IDI1MDAgKiAoKm51bUNoYW5uZWxzKTsKKworICAgIC8qIEluaXRpYWxpemUgYml0c3RyZWFtIGJ1ZmZlciBmb3IgZWFjaCBlbGVtZW50ICovCisgICAgZm9yIChlbCA9IDA7IGVsIDwgaFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspIHsKKyAgICAgIEZES3NickVuY19ic0J1ZkluaXQoaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLCBkZWxheVBhcmFtLmJpdHN0ckRlbGF5KTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIHBhcmFtZXRyaWMgc3RlcmVvICovCisgICAgaWYgKHVzZVBzKSB7CisgICAgICBQU0VOQ19DT05GSUcgcHNFbmNDb25maWc7CisgICAgICBGREtfQVNTRVJUKGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzID09IDEpOworICAgICAgSU5UIHBzVHVuaW5nVGFibGVJZHggPSBnZXRQc1R1bmluZ1RhYmxlSW5kZXgoZWxJbmZvWzBdLmJpdFJhdGUsIE5VTEwpOworCisgICAgICBwc0VuY0NvbmZpZy5mcmFtZVNpemUgPSBjb3JlRnJhbWVMZW5ndGg7ICAvLyBzYnJDb25maWcuc2JyRnJhbWVTaXplOworICAgICAgcHNFbmNDb25maWcucW1mRmlsdGVyTW9kZSA9IDA7CisgICAgICBwc0VuY0NvbmZpZy5zYnJQc0RlbGF5ID0gMDsKKworICAgICAgLyogdHVuaW5nIHBhcmFtZXRlcnMgKi8KKyAgICAgIGlmIChwc1R1bmluZ1RhYmxlSWR4ICE9IElOVkFMSURfVEFCTEVfSURYKSB7CisgICAgICAgIHBzRW5jQ29uZmlnLm5TdGVyZW9CYW5kcyA9IHBzVHVuaW5nVGFibGVbcHNUdW5pbmdUYWJsZUlkeF0ublN0ZXJlb0JhbmRzOworICAgICAgICBwc0VuY0NvbmZpZy5tYXhFbnZlbG9wZXMgPSBwc1R1bmluZ1RhYmxlW3BzVHVuaW5nVGFibGVJZHhdLm5FbnZlbG9wZXM7CisgICAgICAgIHBzRW5jQ29uZmlnLmlpZFF1YW50RXJyb3JUaHJlc2hvbGQgPQorICAgICAgICAgICAgKEZJWFBfREJMKXBzVHVuaW5nVGFibGVbcHNUdW5pbmdUYWJsZUlkeF0uaWlkUXVhbnRFcnJvclRocmVzaG9sZDsKKworICAgICAgICAvKiBjYWxjdWxhdGlvbiBpcyBub3QgcXVpdGUgbGluZWFyLCBpbmNyZWFzZWQgbnVtYmVyIG9mIGVudmVsb3BlcyBjYXVzZXMKKyAgICAgICAgICogbW9yZSBiaXRzICovCisgICAgICAgIC8qIGFzc3VtZSBhdmcuIDUwIGJpdHMgcGVyIGZyYW1lIGZvciAxMCBzdGVyZW8gYmFuZHMgLyAxIGVudmVsb3BlCisgICAgICAgICAqIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgaFNickVuY29kZXItPmVzdGltYXRlQml0cmF0ZSArPQorICAgICAgICAgICAgKCgoKCpjb3JlU2FtcGxlUmF0ZSkgKiA1ICogcHNFbmNDb25maWcublN0ZXJlb0JhbmRzICoKKyAgICAgICAgICAgICAgIHBzRW5jQ29uZmlnLm1heEVudmVsb3BlcykgLworICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplKSk7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVycm9yID0gRVJST1IoQ0RJLCAiSW52YWxpZCBwcyB0dW5pbmcgdGFibGUgaW5kZXguIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKworICAgICAgcW1mSW5pdFN5bnRoZXNpc0ZpbHRlckJhbmsoCisgICAgICAgICAgJmhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUywKKyAgICAgICAgICAoRklYUF9EQkwgKiloU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzLAorICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMsCisgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcyA+PiAxLAorICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMgPj4gMSwKKyAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzID4+IDEsCisgICAgICAgICAgKHN0YXRlc0luaXRGbGFnKSA/IDAgOiBRTUZfRkxBR19LRUVQX1NUQVRFUyk7CisKKyAgICAgIGlmIChlcnJvckluZm8gPT0gbm9FcnJvcikgeworICAgICAgICAvKiB1cGRhdGUgZGVsYXkgKi8KKyAgICAgICAgcHNFbmNDb25maWcuc2JyUHNEZWxheSA9CisgICAgICAgICAgICBGREtzYnJFbmNfR2V0RW52RXN0RGVsYXkoJmhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNickNoYW5uZWxbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+aEVudkNoYW5uZWwuc2JyRXh0cmFjdEVudmVsb3BlKTsKKworICAgICAgICBlcnJvckluZm8gPQorICAgICAgICAgICAgUFNFbmNfSW5pdChoU2JyRW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8sICZwc0VuY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPmR5bmFtaWNSYW0pOworICAgICAgfQorICAgIH0KKworICAgIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCA9IGRlbGF5UGFyYW0uY29yZVBhdGhPZmZzZXQ7CisgICAgaFNickVuY29kZXItPmJ1ZmZlck9mZnNldCA9IGRlbGF5UGFyYW0uc2JyUGF0aE9mZnNldDsKKyAgICAqZGVsYXkgPSBkZWxheVBhcmFtLmRlbGF5OworCisgICAgeyBoU2JyRW5jb2Rlci0+ZG93bm1peFNpemUgPSBjb3JlRnJhbWVMZW5ndGggKiAoKm51bUNoYW5uZWxzKTsgfQorCisgICAgLyogRGVsYXkgQ29tcGVuc2F0aW9uOiBmaWxsIGJpdHN0cmVhbSBkZWxheSBidWZmZXIgd2l0aCB6ZXJvIGlucHV0IHNpZ25hbCAqLworICAgIGlmIChoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5ID4gMCkgeworICAgICAgZXJyb3IgPSBGREtzYnJFbmNfRGVsYXlDb21wZW5zYXRpb24oaFNickVuY29kZXIsIGlucHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJCdWZTaXplKTsKKyAgICAgIGlmIChlcnJvciAhPSAwKSBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogU2V0IE91dHB1dCBmcmFtZSBsZW5ndGggKi8KKyAgICAqZnJhbWVMZW5ndGggPSBjb3JlRnJhbWVMZW5ndGggKiAqZG93blNhbXBsZUZhY3RvcjsKKyAgICAvKiBJbnB1dCBidWZmZXIgb2Zmc2V0ICovCisgICAgKmlucHV0QnVmZmVyT2Zmc2V0ID0KKyAgICAgICAgZml4TWF4KGRlbGF5UGFyYW0uc2JyUGF0aE9mZnNldCwgZGVsYXlQYXJhbS5jb3JlUGF0aE9mZnNldCk7CisgIH0KKworICByZXR1cm4gZXJyb3I7CiAKIGJhaWw6Ci0gICAgLyogUmVzdG9yZSBpbnB1dCBzZXR0aW5ncyAqLwotICAgICpjb3JlU2FtcGxlUmF0ZSA9IGlucHV0U2FtcGxlUmF0ZTsKLSAgICAqZnJhbWVMZW5ndGggPSBjb3JlRnJhbWVMZW5ndGg7Ci0gICAgKm51bUNoYW5uZWxzID0gaW5wdXRDaGFubmVsczsKLSAgICAqY29yZUJhbmR3aWR0aCA9IGlucHV0QmFuZFdpZHRoOworICAvKiBSZXN0b3JlIGlucHV0IHNldHRpbmdzICovCisgICpjb3JlU2FtcGxlUmF0ZSA9IGlucHV0U2FtcGxlUmF0ZTsKKyAgKmZyYW1lTGVuZ3RoID0gY29yZUZyYW1lTGVuZ3RoOworICAqbnVtQ2hhbm5lbHMgPSBpbnB1dENoYW5uZWxzOworICAqY29yZUJhbmR3aWR0aCA9IGlucHV0QmFuZFdpZHRoOwogCi0gICAgcmV0dXJuIGVycm9yOwotIH0KKyAgcmV0dXJuIGVycm9yOworfQogCi0KLUlOVAotc2JyRW5jb2Rlcl9FbmNvZGVGcmFtZSggIEhBTkRMRV9TQlJfRU5DT0RFUiAgIGhTYnJFbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIHNickRhdGFCaXRzWyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgc2JyRGF0YVsoOCldW01BWF9QQVlMT0FEX1NJWkVdCi0gICAgICAgICAgICAgICAgICAgICAgICApCi17CitJTlQgc2JyRW5jb2Rlcl9FbmNvZGVGcmFtZShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIsIElOVF9QQ00gKnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsZXNCdWZTaXplLCBVSU5UIHNickRhdGFCaXRzWyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBzYnJEYXRhWyg4KV1bTUFYX1BBWUxPQURfU0laRV0pIHsKICAgSU5UIGVycm9yOwogICBpbnQgZWw7CiAKLSAgZm9yIChlbD0wOyBlbDxoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykKLSAgewotICAgIGlmIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0gIT0gTlVMTCkKLSAgICB7CisgIGZvciAoZWwgPSAwOyBlbCA8IGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKSB7CisgICAgaWYgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSAhPSBOVUxMKSB7CiAgICAgICBlcnJvciA9IEZES3NickVuY19FbnZFbmNvZGVGcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzICsgaFNickVuY29kZXItPmRvd25zYW1wbGVkT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYnJEYXRhQml0c1tlbF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRGF0YVtlbF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgIGlmIChlcnJvcikKLSAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICAgIGhTYnJFbmNvZGVyLCBlbCwKKyAgICAgICAgICBzYW1wbGVzICsgaFNickVuY29kZXItPmRvd25zYW1wbGVkT2Zmc2V0IC8gaFNickVuY29kZXItPm5DaGFubmVscywKKyAgICAgICAgICBzYW1wbGVzQnVmU2l6ZSwgJnNickRhdGFCaXRzW2VsXSwgc2JyRGF0YVtlbF0sIDApOworICAgICAgaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CiAgICAgfQogICB9CiAKLSAgaWYgKCAoIGhTYnJFbmNvZGVyLT5sZmVDaElkeCE9LTEpICYmIChoU2JyRW5jb2Rlci0+ZG93blNhbXBsZUZhY3RvciA+IDEpICkKLSAgeyAgIC8qIGxmZSBkb3duc2FtcGxlciAqLwotICAgICAgSU5UIG5PdXRTYW1wbGVzOwotCi0gICAgICBGREthYWNFbmNfRG93bnNhbXBsZSgmaFNickVuY29kZXItPmxmZURvd25TYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQgKyBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0ICsgaFNickVuY29kZXItPmxmZUNoSWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5mcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQgKyBoU2JyRW5jb2Rlci0+bGZlQ2hJZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmbk91dFNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPm5DaGFubmVscyk7Ci0KLQotICB9CisgIGVycm9yID0gRkRLc2JyRW5jX0Rvd25zYW1wbGUoCisgICAgICBoU2JyRW5jb2RlciwKKyAgICAgIHNhbXBsZXMgKyBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQgLyBoU2JyRW5jb2Rlci0+bkNoYW5uZWxzLAorICAgICAgc2FtcGxlc0J1ZlNpemUsIGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHMsICZzYnJEYXRhQml0c1tlbF0sIHNickRhdGFbZWxdLCAwKTsKKyAgaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CiAKICAgcmV0dXJuIDA7CiB9CiAKK0lOVCBzYnJFbmNvZGVyX1VwZGF0ZUJ1ZmZlcnMoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICp0aW1lQnVmZmVyLCBVSU5UIHRpbWVCdWZmZXJCdWZTaXplKSB7CisgIGlmIChoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQgPiAwKSB7CisgICAgaW50IGM7CisgICAgaW50IG5kID0gaFNickVuY29kZXItPmRvd25taXhTaXplIC8gaFNickVuY29kZXItPm5DaGFubmVsczsKIAotSU5UIHNickVuY29kZXJfVXBkYXRlQnVmZmVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqdGltZUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSB7Ci0gICAgaWYgKCBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQgPiAwICkgeworICAgIGZvciAoYyA9IDA7IGMgPCBoU2JyRW5jb2Rlci0+bkNoYW5uZWxzOyBjKyspIHsKICAgICAgIC8qIE1vdmUgZGVsYXllZCBkb3duc2FtcGxlZCBkYXRhICovCi0gICAgICBGREttZW1jcHkgKCB0aW1lQnVmZmVyLAotICAgICAgICAgICAgICAgICAgdGltZUJ1ZmZlciArIGhTYnJFbmNvZGVyLT5kb3dubWl4U2l6ZSwKLSAgICAgICAgICAgICAgICAgIHNpemVvZihJTlRfUENNKSAqIChoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQpICk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE1vdmUgZGVsYXllZCBpbnB1dCBkYXRhICovCi0gICAgICBGREttZW1jcHkgKCB0aW1lQnVmZmVyLAotICAgICAgICB0aW1lQnVmZmVyICsgaFNickVuY29kZXItPm5DaGFubmVscyAqIGhTYnJFbmNvZGVyLT5mcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICBzaXplb2YoSU5UX1BDTSkgKiBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0ICk7CisgICAgICBGREttZW1jcHkodGltZUJ1ZmZlciArIHRpbWVCdWZmZXJCdWZTaXplICogYywKKyAgICAgICAgICAgICAgICB0aW1lQnVmZmVyICsgdGltZUJ1ZmZlckJ1ZlNpemUgKiBjICsgbmQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKElOVF9QQ00pICoKKyAgICAgICAgICAgICAgICAgICAgKGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCAvIGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHMpKTsKICAgICB9Ci0gICAgaWYgKCBoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5ID4gMCAgKQotICAgIHsKLSAgICAgIGludCBlbDsKKyAgfSBlbHNlIHsKKyAgICBpbnQgYzsKIAotICAgICAgZm9yIChlbD0wOyBlbDxoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykKLSAgICAgIHsKLSAgICAgICAgRkRLbWVtbW92ZSAoIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+cGF5bG9hZERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+cGF5bG9hZERlbGF5TGluZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZihVQ0hBUikgKiAoaFNickVuY29kZXItPm5CaXRzdHJEZWxheSpNQVhfUEFZTE9BRF9TSVpFKSApOworICAgIGZvciAoYyA9IDA7IGMgPCBoU2JyRW5jb2Rlci0+bkNoYW5uZWxzOyBjKyspIHsKKyAgICAgIC8qIE1vdmUgZGVsYXllZCBpbnB1dCBkYXRhICovCisgICAgICBGREttZW1jcHkoCisgICAgICAgICAgdGltZUJ1ZmZlciArIHRpbWVCdWZmZXJCdWZTaXplICogYywKKyAgICAgICAgICB0aW1lQnVmZmVyICsgdGltZUJ1ZmZlckJ1ZlNpemUgKiBjICsgaFNickVuY29kZXItPmZyYW1lU2l6ZSwKKyAgICAgICAgICBzaXplb2YoSU5UX1BDTSkgKiBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0IC8gaFNickVuY29kZXItPm5DaGFubmVscyk7CisgICAgfQorICB9CisgIGlmIChoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5ID4gMCkgeworICAgIGludCBlbDsKIAotICAgICAgICBGREttZW1tb3ZlKCAmaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVswXSwKLSAgICAgICAgICAgICAgICAgICAgJmhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+cGF5bG9hZERlbGF5TGluZVNpemVbMV0sCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihVSU5UKSAqIChoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5KSApOworICAgIGZvciAoZWwgPSAwOyBlbCA8IGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKSB7CisgICAgICBGREttZW1tb3ZlKAorICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+cGF5bG9hZERlbGF5TGluZVswXSwKKyAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0tPnBheWxvYWREZWxheUxpbmVbMV0sCisgICAgICAgICAgc2l6ZW9mKFVDSEFSKSAqIChoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5ICogTUFYX1BBWUxPQURfU0laRSkpOworCisgICAgICBGREttZW1tb3ZlKCZoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0tPnBheWxvYWREZWxheUxpbmVTaXplWzBdLAorICAgICAgICAgICAgICAgICAmaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKFVJTlQpICogKGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK0lOVCBzYnJFbmNvZGVyX1NlbmRIZWFkZXIoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKSB7CisgIElOVCBlcnJvciA9IC0xOworICBpZiAoaFNickVuY29kZXIpIHsKKyAgICBpbnQgZWw7CisgICAgZm9yIChlbCA9IDA7IGVsIDwgaFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspIHsKKyAgICAgIGlmICgoaFNickVuY29kZXItPm5vRWxlbWVudHMgPT0gMSkgJiYKKyAgICAgICAgICAoaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbyA9PSAxKSkgeworICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0tPnNickJpdHN0cmVhbURhdGEuQ291bnRTZW5kSGVhZGVyRGF0YSA9CisgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0tPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSAtIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0tPnNickJpdHN0cmVhbURhdGEuQ291bnRTZW5kSGVhZGVyRGF0YSA9IDA7CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOwotIH0KKyAgICBlcnJvciA9IDA7CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQogCitJTlQgc2JyRW5jb2Rlcl9Db250YWluc0hlYWRlcihIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpIHsKKyAgSU5UIHNickhlYWRlciA9IDE7CisgIGlmIChoU2JyRW5jb2RlcikgeworICAgIGludCBlbDsKKyAgICBmb3IgKGVsID0gMDsgZWwgPCBoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykgeworICAgICAgc2JySGVhZGVyICY9CisgICAgICAgICAgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+c2JyQml0c3RyZWFtRGF0YS5IZWFkZXJBY3RpdmVEZWxheSA9PSAxKQorICAgICAgICAgICAgICA/IDEKKyAgICAgICAgICAgICAgOiAwOworICAgIH0KKyAgfQorICByZXR1cm4gc2JySGVhZGVyOworfQogCi1JTlQgc2JyRW5jb2Rlcl9HZXRFc3RpbWF0ZUJpdHJhdGUoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKQoteworSU5UIHNickVuY29kZXJfR2V0SGVhZGVyRGVsYXkoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKSB7CisgIElOVCBkZWxheSA9IC0xOworCisgIGlmIChoU2JyRW5jb2RlcikgeworICAgIGlmICgoaFNickVuY29kZXItPm5vRWxlbWVudHMgPT0gMSkgJiYKKyAgICAgICAgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8gPT0gMSkpIHsKKyAgICAgIGRlbGF5ID0gaFNickVuY29kZXItPm5CaXRzdHJEZWxheSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlbGF5ID0gaFNickVuY29kZXItPm5CaXRzdHJEZWxheTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGRlbGF5OworfQorSU5UIHNickVuY29kZXJfR2V0QnNEZWxheShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpIHsKKyAgSU5UIGRlbGF5ID0gLTE7CisKKyAgaWYgKGhTYnJFbmNvZGVyKSB7CisgICAgZGVsYXkgPSBoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5OworICB9CisgIHJldHVybiBkZWxheTsKK30KKworSU5UIHNickVuY29kZXJfU0FQUHJlcGFyZShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpIHsKKyAgSU5UIGVycm9yID0gLTE7CisgIGlmIChoU2JyRW5jb2RlcikgeworICAgIGludCBlbDsKKyAgICBmb3IgKGVsID0gMDsgZWwgPCBoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykgeworICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5zYnJCaXRzdHJlYW1EYXRhLnJpZ2h0Qm9yZGVyRklYID0gMTsKKyAgICB9CisgICAgZXJyb3IgPSAwOworICB9CisgIHJldHVybiBlcnJvcjsKK30KKworSU5UIHNickVuY29kZXJfR2V0RXN0aW1hdGVCaXRyYXRlKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlcikgewogICBJTlQgZXN0aW1hdGVCaXRyYXRlID0gMDsKIAotICBpZihoU2JyRW5jb2RlcikgeworICBpZiAoaFNickVuY29kZXIpIHsKICAgICBlc3RpbWF0ZUJpdHJhdGUgKz0gaFNickVuY29kZXItPmVzdGltYXRlQml0cmF0ZTsKICAgfQogCiAgIHJldHVybiBlc3RpbWF0ZUJpdHJhdGU7CiB9CiAKLUlOVCBzYnJFbmNvZGVyX0dldElucHV0RGF0YURlbGF5KEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlcikKLXsKK0lOVCBzYnJFbmNvZGVyX0dldElucHV0RGF0YURlbGF5KEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlcikgewogICBJTlQgZGVsYXkgPSAtMTsKIAotICBpZihoU2JyRW5jb2RlcikgeworICBpZiAoaFNickVuY29kZXIpIHsKICAgICBkZWxheSA9IGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheTsKICAgfQogICByZXR1cm4gZGVsYXk7CiB9CiAKK0lOVCBzYnJFbmNvZGVyX0dldFNickRlY0RlbGF5KEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlcikgeworICBJTlQgZGVsYXkgPSAtMTsKIAotSU5UIHNickVuY29kZXJfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKQoteworICBpZiAoaFNickVuY29kZXIpIHsKKyAgICBkZWxheSA9IGhTYnJFbmNvZGVyLT5zYnJEZWNEZWxheTsKKyAgfQorICByZXR1cm4gZGVsYXk7Cit9CisKK0lOVCBzYnJFbmNvZGVyX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pIHsKICAgaW50IGk7CiAKICAgaWYgKGluZm8gPT0gTlVMTCkgewpAQCAtMjQyMSw3ICsyNTU3LDggQEAKICAgaW5mbyArPSBpOwogCiAgIGluZm8tPm1vZHVsZV9pZCA9IEZES19TQlJFTkM7Ci0gIGluZm8tPnZlcnNpb24gPSBMSUJfVkVSU0lPTihTQlJFTkNPREVSX0xJQl9WTDAsIFNCUkVOQ09ERVJfTElCX1ZMMSwgU0JSRU5DT0RFUl9MSUJfVkwyKTsKKyAgaW5mby0+dmVyc2lvbiA9CisgICAgICBMSUJfVkVSU0lPTihTQlJFTkNPREVSX0xJQl9WTDAsIFNCUkVOQ09ERVJfTElCX1ZMMSwgU0JSRU5DT0RFUl9MSUJfVkwyKTsKICAgTElCX1ZFUlNJT05fU1RSSU5HKGluZm8pOwogI2lmZGVmIF9fQU5EUk9JRF9fCiAgIGluZm8tPmJ1aWxkX2RhdGUgPSAiIjsKQEAgLTI0MzMsMTAgKzI1NzAsNyBAQAogICBpbmZvLT50aXRsZSA9ICJTQlIgRW5jb2RlciI7CiAKICAgLyogU2V0IGZsYWdzICovCi0gIGluZm8tPmZsYWdzID0gMAotICAgIHwgQ0FQRl9TQlJfSFEKLSAgICB8IENBUEZfU0JSX1BTX01QRUcKLSAgICA7CisgIGluZm8tPmZsYWdzID0gMCB8IENBUEZfU0JSX0hRIHwgQ0FQRl9TQlJfUFNfTVBFRzsKICAgLyogRW5kIG9mIGZsYWdzICovCiAKICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Nicl9taXNjLmNwcCBiL2xpYlNCUmVuYy9zcmMvc2JyX21pc2MuY3BwCmluZGV4IGM2NzNiODEuLjgzZDdlMzYgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvc2JyX21pc2MuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvc2JyX21pc2MuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE3ICs5MCwyMyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIFNiciBtaXNjZWxsYW5lb3VzIGhlbHBlciBmdW5jdGlvbnMgIAorICBcYnJpZWYgIFNiciBtaXNjZWxsYW5lb3VzIGhlbHBlciBmdW5jdGlvbnMgJFJldmlzaW9uOiAzNjc1MCAkCiAqLwogI2luY2x1ZGUgInNicl9taXNjLmgiCiAKLQotdm9pZCBGREtzYnJFbmNfU2hlbGxzb3J0X2ZyYWN0IChGSVhQX0RCTCAqaW4sIElOVCBuKQotewordm9pZCBGREtzYnJFbmNfU2hlbGxzb3J0X2ZyYWN0KEZJWFBfREJMICppbiwgSU5UIG4pIHsKICAgRklYUF9EQkwgdjsKICAgSU5UIGksIGo7CiAgIElOVCBpbmMgPSAxOwpAQCAtMTAxLDI0ICsxMTgsMjAgQEAKICAgZG8gewogICAgIGluYyA9IGluYyAvIDM7CiAgICAgZm9yIChpID0gaW5jICsgMTsgaSA8PSBuOyBpKyspIHsKLSAgICAgIHYgPSBpbltpLTFdOworICAgICAgdiA9IGluW2kgLSAxXTsKICAgICAgIGogPSBpOwotICAgICAgd2hpbGUgKGluW2otaW5jLTFdID4gdikgewotICAgICAgICBpbltqLTFdID0gaW5bai1pbmMtMV07CisgICAgICB3aGlsZSAoaW5baiAtIGluYyAtIDFdID4gdikgeworICAgICAgICBpbltqIC0gMV0gPSBpbltqIC0gaW5jIC0gMV07CiAgICAgICAgIGogLT0gaW5jOwotICAgICAgICBpZiAoaiA8PSBpbmMpCi0gICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChqIDw9IGluYykgYnJlYWs7CiAgICAgICB9Ci0gICAgICBpbltqLTFdID0gdjsKKyAgICAgIGluW2ogLSAxXSA9IHY7CiAgICAgfQogICB9IHdoaWxlIChpbmMgPiAxKTsKLQogfQogCiAvKiBTb3J0aW5nIHJvdXRpbmUgKi8KLXZvaWQgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQgKElOVCAqaW4sIElOVCBuKQotewotCit2b2lkIEZES3NickVuY19TaGVsbHNvcnRfaW50KElOVCAqaW4sIElOVCBuKSB7CiAgIElOVCBpLCBqLCB2OwogICBJTlQgaW5jID0gMTsKIApAQCAtMTI5LDIyICsxNDIsMTggQEAKICAgZG8gewogICAgIGluYyA9IGluYyAvIDM7CiAgICAgZm9yIChpID0gaW5jICsgMTsgaSA8PSBuOyBpKyspIHsKLSAgICAgIHYgPSBpbltpLTFdOworICAgICAgdiA9IGluW2kgLSAxXTsKICAgICAgIGogPSBpOwotICAgICAgd2hpbGUgKGluW2otaW5jLTFdID4gdikgewotICAgICAgICBpbltqLTFdID0gaW5bai1pbmMtMV07CisgICAgICB3aGlsZSAoaW5baiAtIGluYyAtIDFdID4gdikgeworICAgICAgICBpbltqIC0gMV0gPSBpbltqIC0gaW5jIC0gMV07CiAgICAgICAgIGogLT0gaW5jOwotICAgICAgICBpZiAoaiA8PSBpbmMpCi0gICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChqIDw9IGluYykgYnJlYWs7CiAgICAgICB9Ci0gICAgICBpbltqLTFdID0gdjsKKyAgICAgIGluW2ogLSAxXSA9IHY7CiAgICAgfQogICB9IHdoaWxlIChpbmMgPiAxKTsKLQogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfQWRkVmVjTGVmdAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1NiwxNiArMTY1LDEzIEBACiAgUmV0dXJuOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLUZES3NickVuY19BZGRWZWNMZWZ0IChJTlQgKmRzdCwgSU5UICpsZW5ndGhfZHN0LCBJTlQgKnNyYywgSU5UIGxlbmd0aF9zcmMpCi17Cit2b2lkIEZES3NickVuY19BZGRWZWNMZWZ0KElOVCAqZHN0LCBJTlQgKmxlbmd0aF9kc3QsIElOVCAqc3JjLCBJTlQgbGVuZ3RoX3NyYykgewogICBJTlQgaTsKIAogICBmb3IgKGkgPSBsZW5ndGhfc3JjIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgRkRLc2JyRW5jX0FkZExlZnQgKGRzdCwgbGVuZ3RoX2RzdCwgc3JjW2ldKTsKKyAgICBGREtzYnJFbmNfQWRkTGVmdChkc3QsIGxlbmd0aF9kc3QsIHNyY1tpXSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfQWRkTGVmdAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE3NywxOCArMTgzLDE0IEBACiAgUmV0dXJuOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLUZES3NickVuY19BZGRMZWZ0IChJTlQgKnZlY3RvciwgSU5UICpsZW5ndGhfdmVjdG9yLCBJTlQgdmFsdWUpCi17Cit2b2lkIEZES3NickVuY19BZGRMZWZ0KElOVCAqdmVjdG9yLCBJTlQgKmxlbmd0aF92ZWN0b3IsIElOVCB2YWx1ZSkgewogICBJTlQgaTsKIAotICBmb3IgKGkgPSAqbGVuZ3RoX3ZlY3RvcjsgaSA+IDA7IGktLSkKLSAgICB2ZWN0b3JbaV0gPSB2ZWN0b3JbaSAtIDFdOworICBmb3IgKGkgPSAqbGVuZ3RoX3ZlY3RvcjsgaSA+IDA7IGktLSkgdmVjdG9yW2ldID0gdmVjdG9yW2kgLSAxXTsKICAgdmVjdG9yWzBdID0gdmFsdWU7CiAgICgqbGVuZ3RoX3ZlY3RvcikrKzsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19BZGRSaWdodAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIwMCwxNSArMjAyLDExIEBACiAgUmV0dXJuOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLUZES3NickVuY19BZGRSaWdodCAoSU5UICp2ZWN0b3IsIElOVCAqbGVuZ3RoX3ZlY3RvciwgSU5UIHZhbHVlKQotewordm9pZCBGREtzYnJFbmNfQWRkUmlnaHQoSU5UICp2ZWN0b3IsIElOVCAqbGVuZ3RoX3ZlY3RvciwgSU5UIHZhbHVlKSB7CiAgIHZlY3RvclsqbGVuZ3RoX3ZlY3Rvcl0gPSB2YWx1ZTsKICAgKCpsZW5ndGhfdmVjdG9yKSsrOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfQWRkVmVjUmlnaHQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMjAsMTUgKzIxOCwxMiBAQAogIFJldHVybjogICAgICBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1GREtzYnJFbmNfQWRkVmVjUmlnaHQgKElOVCAqZHN0LCBJTlQgKmxlbmd0aF9kc3QsIElOVCAqc3JjLCBJTlQgbGVuZ3RoX3NyYykKLXsKK3ZvaWQgRkRLc2JyRW5jX0FkZFZlY1JpZ2h0KElOVCAqZHN0LCBJTlQgKmxlbmd0aF9kc3QsIElOVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbmd0aF9zcmMpIHsKICAgSU5UIGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGhfc3JjOyBpKyspCi0gICAgRkRLc2JyRW5jX0FkZFJpZ2h0IChkc3QsIGxlbmd0aF9kc3QsIHNyY1tpXSk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGhfc3JjOyBpKyspIEZES3NickVuY19BZGRSaWdodChkc3QsIGxlbmd0aF9kc3QsIHNyY1tpXSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfTFNJX2RpdmlkZV9zY2FsZV9mcmFjdApAQCAtMjM4LDM1ICsyMzMsMzMgQEAKICAgcmV0dXJuOiAgICAgICBudW0qc2NhbGUvZGVub20KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1GSVhQX0RCTCBGREtzYnJFbmNfTFNJX2RpdmlkZV9zY2FsZV9mcmFjdChGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tLCBGSVhQX0RCTCBzY2FsZSkKLXsKK0ZJWFBfREJMIEZES3NickVuY19MU0lfZGl2aWRlX3NjYWxlX2ZyYWN0KEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBzY2FsZSkgewogICBGSVhQX0RCTCB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgaWYgKG51bSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewotCiAgICAgSU5UIHNoaWZ0Q29tbW9uOwotICAgIElOVCBzaGlmdE51bSAgID0gQ291bnRMZWFkaW5nQml0cyhudW0pOworICAgIElOVCBzaGlmdE51bSA9IENvdW50TGVhZGluZ0JpdHMobnVtKTsKICAgICBJTlQgc2hpZnREZW5vbSA9IENvdW50TGVhZGluZ0JpdHMoZGVub20pOwogICAgIElOVCBzaGlmdFNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhzY2FsZSk7CiAKLSAgICBudW0gICA9IG51bSAgIDw8IHNoaWZ0TnVtOworICAgIG51bSA9IG51bSA8PCBzaGlmdE51bTsKICAgICBzY2FsZSA9IHNjYWxlIDw8IHNoaWZ0U2NhbGU7CiAKLSAgICB0bXAgPSBmTXVsdERpdjIobnVtLHNjYWxlKTsKKyAgICB0bXAgPSBmTXVsdERpdjIobnVtLCBzY2FsZSk7CiAKLSAgICBpZiAoIGRlbm9tID4gKHRtcCA+PiBmaXhNaW4oc2hpZnROdW0rc2hpZnRTY2FsZS0xLChERlJBQ1RfQklUUy0xKSkpICkgeworICAgIGlmIChkZW5vbSA+ICh0bXAgPj4gZml4TWluKHNoaWZ0TnVtICsgc2hpZnRTY2FsZSAtIDEsIChERlJBQ1RfQklUUyAtIDEpKSkpIHsKICAgICAgIGRlbm9tID0gZGVub20gPDwgc2hpZnREZW5vbTsKLSAgICAgIHRtcCA9IHNjaHVyX2Rpdih0bXAsZGVub20sMTUpOwotICAgICAgc2hpZnRDb21tb24gPSBmaXhNaW4oKHNoaWZ0TnVtLXNoaWZ0RGVub20rc2hpZnRTY2FsZS0xKSwoREZSQUNUX0JJVFMtMSkpOworICAgICAgdG1wID0gc2NodXJfZGl2KHRtcCwgZGVub20sIDE1KTsKKyAgICAgIHNoaWZ0Q29tbW9uID0KKyAgICAgICAgICBmaXhNaW4oKHNoaWZ0TnVtIC0gc2hpZnREZW5vbSArIHNoaWZ0U2NhbGUgLSAxKSwgKERGUkFDVF9CSVRTIC0gMSkpOwogICAgICAgaWYgKHNoaWZ0Q29tbW9uIDwgMCkKICAgICAgICAgdG1wIDw8PSAtc2hpZnRDb21tb247CiAgICAgICBlbHNlCi0gICAgICAgIHRtcCA+Pj0gIHNoaWZ0Q29tbW9uOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICAgICAgdG1wID4+PSBzaGlmdENvbW1vbjsKKyAgICB9IGVsc2UgewogICAgICAgdG1wID0gLypGTDJGWENPTlNUX0RCTCgxLjApKi8gKEZJWFBfREJMKU1BWFZBTF9EQkw7CiAgICAgfQogICB9CiAKICAgcmV0dXJuICh0bXApOwogfQotCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Nicl9taXNjLmggYi9saWJTQlJlbmMvc3JjL3Nicl9taXNjLmgKaW5kZXggZjQ3MTk3NC4uZmFkODUzZiAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9zYnJfbWlzYy5oCisrKyBiL2xpYlNCUmVuYy9zcmMvc2JyX21pc2MuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyOCArOTAsMzggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBTYnIgbWlzY2VsbGFuZW91cyBoZWxwZXIgZnVuY3Rpb25zIHByb3RvdHlwZXMgIAorICBcYnJpZWYgIFNiciBtaXNjZWxsYW5lb3VzIGhlbHBlciBmdW5jdGlvbnMgcHJvdG90eXBlcyAkUmV2aXNpb246IDkyNzkwICQKICAgXGF1dGhvcgogKi8KIAotI2lmbmRlZiBfU0JSX01JU0NfSAotI2RlZmluZSBfU0JSX01JU0NfSAorI2lmbmRlZiBTQlJfTUlTQ19ICisjZGVmaW5lIFNCUl9NSVNDX0gKIAogI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCiAKIC8qIFNvcnRpbmcgcm91dGluZXMgKi8KLXZvaWQgRkRLc2JyRW5jX1NoZWxsc29ydF9mcmFjdCAoRklYUF9EQkwgKmluLCBJTlQgbik7Ci12b2lkIEZES3NickVuY19TaGVsbHNvcnRfaW50ICAgKElOVCAqaW4sIElOVCBuKTsKK3ZvaWQgRkRLc2JyRW5jX1NoZWxsc29ydF9mcmFjdChGSVhQX0RCTCAqaW4sIElOVCBuKTsKK3ZvaWQgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoSU5UICppbiwgSU5UIG4pOwogCi12b2lkIEZES3NickVuY19BZGRMZWZ0IChJTlQgKnZlY3RvciwgSU5UICpsZW5ndGhfdmVjdG9yLCBJTlQgdmFsdWUpOwotdm9pZCBGREtzYnJFbmNfQWRkUmlnaHQgKElOVCAqdmVjdG9yLCBJTlQgKmxlbmd0aF92ZWN0b3IsIElOVCB2YWx1ZSk7Ci12b2lkIEZES3NickVuY19BZGRWZWNMZWZ0IChJTlQgKmRzdCwgSU5UICpsZW5ndGhfZHN0LCBJTlQgKnNyYywgSU5UIGxlbmd0aF9zcmMpOwotdm9pZCBGREtzYnJFbmNfQWRkVmVjUmlnaHQgKElOVCAqZHN0LCBJTlQgKmxlbmd0aF92ZWN0b3JfZHN0LCBJTlQgKnNyYywgSU5UIGxlbmd0aF9zcmMpOwordm9pZCBGREtzYnJFbmNfQWRkTGVmdChJTlQgKnZlY3RvciwgSU5UICpsZW5ndGhfdmVjdG9yLCBJTlQgdmFsdWUpOwordm9pZCBGREtzYnJFbmNfQWRkUmlnaHQoSU5UICp2ZWN0b3IsIElOVCAqbGVuZ3RoX3ZlY3RvciwgSU5UIHZhbHVlKTsKK3ZvaWQgRkRLc2JyRW5jX0FkZFZlY0xlZnQoSU5UICpkc3QsIElOVCAqbGVuZ3RoX2RzdCwgSU5UICpzcmMsIElOVCBsZW5ndGhfc3JjKTsKK3ZvaWQgRkRLc2JyRW5jX0FkZFZlY1JpZ2h0KElOVCAqZHN0LCBJTlQgKmxlbmd0aF92ZWN0b3JfZHN0LCBJTlQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW5ndGhfc3JjKTsKIAotRklYUF9EQkwgRkRLc2JyRW5jX0xTSV9kaXZpZGVfc2NhbGVfZnJhY3QoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSwgRklYUF9EQkwgc2NhbGUpOworRklYUF9EQkwgRkRLc2JyRW5jX0xTSV9kaXZpZGVfc2NhbGVfZnJhY3QoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHNjYWxlKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Nicl9yYW0uY3BwIGIvbGliU0JSZW5jL3NyYy9zYnJfcmFtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2YzM3Zi4uMDAwMDAwMAotLS0gYS9saWJTQlJlbmMvc3JjL3Nicl9yYW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiEKLSAgXGZpbGUKLSAgXGJyaWVmIE1lbW9yeSBsYXlvdXQKLSAgIAotCi0gIFRoaXMgbW9kdWxlIGRlY2xhcmVzIGFsbCBzdGF0aWMgYW5kIGR5bmFtaWMgbWVtb3J5IHNwYWNlcwotKi8KLSNpbmNsdWRlICJzYnJfcmFtLmgiCi0KLSNpbmNsdWRlICJzYnIuaCIKLSNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgotCi1DX0FMTE9DX01FTSAoUmFtX1NickR5bmFtaWNfUkFNLCBGSVhQX0RCTCwgKChTQlJfRU5DX0RZTl9SQU1fU0laRSkvc2l6ZW9mKEZJWFBfREJMKSkpCi0KLS8qIQotICBcbmFtZSBTdGF0aWNTYnJEYXRhCi0KLSAgU3RhdGljIG1lbW9yeSBhcmVhcywgbXVzdCBub3QgYmUgb3ZlcndyaXR0ZW4gaW4gb3RoZXIgc2VjdGlvbnMgb2YgdGhlIGVuY29kZXIKLSovCi0vKiBAeyAqLwotCi0vKiEgc3RhdGljIHNiciBlbmNvZGVyIGluc3RhbmNlIGZvciBvbmUgZW5jb2RlciAoMiBjaGFubmVscykKLSAgYWxsIG1ham9yIHN0YXRpYyBhbmQgZHluYW1pYyBtZW1vcnkgYXJlYXMgYXJlIGxvY2F0ZWQKLSAgaW4gbW9kdWxlIHNicl9yYW0gYW5kIHNiciByb20KLSovCi1DX0FMTE9DX01FTSAoUmFtX1NickVuY29kZXIsIFNCUl9FTkNPREVSLCAxKQotQ19BTExPQ19NRU0yKFJhbV9TYnJDaGFubmVsLCBTQlJfQ0hBTk5FTCwgMSwgKDgpKQotQ19BTExPQ19NRU0yKFJhbV9TYnJFbGVtZW50LCBTQlJfRUxFTUVOVCwgMSwgKDgpKQotCi0vKiEgRmlsdGVyIHN0YXRlcyBmb3IgUU1GLWFuYWx5c2lzLiA8YnI+Ci0gIERpbWVuc2lvbjogI01BWE5SU0JSQ0hBTk5FTFMgKiAjU0JSX1FNRl9GSUxURVJfTEVOR1RICi0qLwotQ19BQUxMT0NfTUVNMl9MIChSYW1fU2JyX1FtZlN0YXRlc0FuYWx5c2lzLCBGSVhQX1FBUywgUU1GX0ZJTFRFUl9MRU5HVEgsICg4KSwgU0VDVF9EQVRBX0wxKQotCi0KLS8qISBNYXRyaXggaG9sZGluZyB0aGUgcXVvdGEgdmFsdWVzIGZvciBhbGwgZXN0aW1hdGVzLCBhbGwgY2hhbm5lbHMKLSAgRGltZW5zaW9uICNNQVhOUlNCUkNIQU5ORUxTICogKyNTQlJfUU1GX0NIQU5ORUxTKiAjTUFYX05PX09GX0VTVElNQVRFUwotKi8KLUNfQUxMT0NfTUVNMl9MIChSYW1fU2JyX3F1b3RhTWF0cml4LCBGSVhQX0RCTCwgKE1BWF9OT19PRl9FU1RJTUFURVMqUU1GX0NIQU5ORUxTKSwgKDgpLCBTRUNUX0RBVEFfTDEpCi0KLS8qISBNYXRyaXggaG9sZGluZyB0aGUgc2lnbiB2YWx1ZXMgZm9yIGFsbCBlc3RpbWF0ZXMsIGFsbCBjaGFubmVscwotICBEaW1lbnNpb24gI01BWE5SU0JSQ0hBTk5FTFMgKiArI1NCUl9RTUZfQ0hBTk5FTFMqICNNQVhfTk9fT0ZfRVNUSU1BVEVTCi0qLwotQ19BTExPQ19NRU0yIChSYW1fU2JyX3NpZ25NYXRyaXgsIElOVCwgKE1BWF9OT19PRl9FU1RJTUFURVMqUU1GX0NIQU5ORUxTKSwgKDgpKQotCi0vKiEgRnJlcXVlbmN5IGJhbmQgdGFibGUgKGxvdyByZXMpIDxicj4KLSAgRGltZW5zaW9uICNNQVhfRlJFUV9DT0VGRlMvMisxCi0qLwotQ19BTExPQ19NRU0yIChSYW1fU2JyX2ZyZXFCYW5kVGFibGVMTywgVUNIQVIsIChNQVhfRlJFUV9DT0VGRlMvMisxKSwgKDgpKQotCi0vKiEgRnJlcXVlbmN5IGJhbmQgdGFibGUgKGhpZ2ggcmVzKSA8YnI+Ci0gIERpbWVuc2lvbiAjTUFYX0ZSRVFfQ09FRkZTICsxCi0qLwotQ19BTExPQ19NRU0yIChSYW1fU2JyX2ZyZXFCYW5kVGFibGVISSwgVUNIQVIsIChNQVhfRlJFUV9DT0VGRlMrMSksICg4KSkKLQotLyohIHZrIG1hdHNlciB0YWJsZSA8YnI+Ci0gIERpbWVuc2lvbiAjTUFYX0ZSRVFfQ09FRkZTICsxCi0qLwotQ19BTExPQ19NRU0yIChSYW1fU2JyX3Zfa19tYXN0ZXIsIFVDSEFSLCAoTUFYX0ZSRVFfQ09FRkZTKzEpLCAoOCkpCi0KLQotLyoKLSAgTWlzc2luZyBoYXJtb25pY3MgZGV0ZWN0aW9uCi0qLwotCi0vKiEgc2JyX2RldGVjdGlvblZlY3RvcnMgPGJyPgotICBEaW1lbnNpb24gI01BWF9OVU1fQ0hBTk5FTFMqI01BWF9OT19PRl9FU1RJTUFURVMqI01BWF9GUkVRX0NPRUZGU10KLSovCi1DX0FMTE9DX01FTTIgKFJhbV9TYnJfZGV0ZWN0aW9uVmVjdG9ycywgVUNIQVIsIChNQVhfTk9fT0ZfRVNUSU1BVEVTKk1BWF9GUkVRX0NPRUZGUyksICg4KSkKLQotLyohIHNicl9wcmV2Q29tcFZlY1sgPGJyPgotICBEaW1lbnNpb24gI01BWF9OVU1fQ0hBTk5FTFMqI01BWF9GUkVRX0NPRUZGU10KLSovCi1DX0FMTE9DX01FTTIgKFJhbV9TYnJfcHJldkVudmVsb3BlQ29tcGVuc2F0aW9uLCBVQ0hBUiwgTUFYX0ZSRVFfQ09FRkZTLCAoOCkpCi0vKiEgc2JyX2d1aWRlU2NmYlsgPGJyPgotICBEaW1lbnNpb24gI01BWF9OVU1fQ0hBTk5FTFMqI01BWF9GUkVRX0NPRUZGU10KLSovCi1DX0FMTE9DX01FTTIgKFJhbV9TYnJfZ3VpZGVTY2ZiLCBVQ0hBUiwgTUFYX0ZSRVFfQ09FRkZTLCAoOCkpCi0KLS8qISBzYnJfZ3VpZGVWZWN0b3JEZXRlY3RlZCA8YnI+Ci0gIERpbWVuc2lvbiAjTUFYX05VTV9DSEFOTkVMUyojTUFYX05PX09GX0VTVElNQVRFUyojTUFYX0ZSRVFfQ09FRkZTXQotKi8KLUNfQUxMT0NfTUVNMiAoUmFtX1Nicl9ndWlkZVZlY3RvckRldGVjdGVkLCBVQ0hBUiwgKE1BWF9OT19PRl9FU1RJTUFURVMqTUFYX0ZSRVFfQ09FRkZTKSwgKDgpKQotQ19BTExPQ19NRU0yIChSYW1fU2JyX2d1aWRlVmVjdG9yRGlmZiwgRklYUF9EQkwsIChNQVhfTk9fT0ZfRVNUSU1BVEVTKk1BWF9GUkVRX0NPRUZGUyksICg4KSkKLUNfQUxMT0NfTUVNMiAoUmFtX1Nicl9ndWlkZVZlY3Rvck9yaWcsIEZJWFBfREJMLCAoTUFYX05PX09GX0VTVElNQVRFUypNQVhfRlJFUV9DT0VGRlMpLCAoOCkpCi0KLS8qCi0gIFN0YXRpYyBQYXJhbWV0cmljIFN0ZXJlbyBtZW1vcnkKLSovCi1DX0FBTExPQ19NRU1fTChSYW1fUHNRbWZTdGF0ZXNTeW50aGVzaXMsIEZJWFBfREJMLCBRTUZfRklMVEVSX0xFTkdUSC8yLCBTRUNUX0RBVEFfTDEpCi0KLUNfQUxMT0NfTUVNX0wgKFJhbV9Qc0VuY29kZSwgICAgUFNfRU5DT0RFLCAxLCBTRUNUX0RBVEFfTDEpCi1DX0FMTE9DX01FTSAgIChSYW1fUGFyYW1TdGVyZW8sIFBBUkFNRVRSSUNfU1RFUkVPLCAxKQotCi0KLQotLyogQH0gKi8KLQotCi0vKiEKLSAgXG5hbWUgRHluYW1pY1NickRhdGEKLQotICBEeW5hbWljIG1lbW9yeSBhcmVhcywgbWlnaHQgYmUgcmV1c2VkIGluIG90aGVyIGFsZ29yaXRobSBzZWN0aW9ucywKLSAgZS5nLiB0aGUgY29yZSBlbmNvZGVyLgotKi8KLS8qIEB7ICovCi0KLSAgLyohIEVuZXJneSBidWZmZXIgZm9yIGVudmVsb3BlIGV4dHJhY3Rpb24gPGJyPgotICAgIERpbWVuc2lvbiAjTUFYTlJTQlJDSEFOTkVMUyAqICsjU0JSX1FNRl9TTE9UUyAqICAjU0JSX1FNRl9DSEFOTkVMUwotICAqLwotICBDX0FMTE9DX01FTTIgKFJhbV9TYnJfZW52WUJ1ZmZlciwgRklYUF9EQkwsIChRTUZfTUFYX1RJTUVfU0xPVFMvMiAqIFFNRl9DSEFOTkVMUyksICg4KSkKLQotICBGSVhQX0RCTCogR2V0UmFtX1Nicl9lbnZZQnVmZmVyIChpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKSB7Ci0gICAgRkRLX0FTU0VSVChkeW5hbWljX1JBTSE9MCk7Ci0gICAgcmV0dXJuICgoRklYUF9EQkwqKSAoZHluYW1pY19SQU0gKyBPRkZTRVRfTlJHICsgKG4qWV8yX0JVRl9CWVRFKSApKTsKLSAgfQotCi0gIC8qCi0gICAqIFFNRiBkYXRhCi0gICAqLwotICAvKiBUaGUgU0JSIGVuY29kZXIgdXNlcyBhIHNpbmdsZSBjaGFubmVsIG92ZXJsYXBwaW5nIGJ1ZmZlciBzZXQgKGFsd2F5cyBuPTApLCBidXQgUFMgZG9lcyBub3QuICovCi0gIEZJWFBfREJMKiBHZXRSYW1fU2JyX2VudlJCdWZmZXIgKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pIHsKLSAgICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNIT0wKTsKLSAgICByZXR1cm4gKChGSVhQX0RCTCopIChkeW5hbWljX1JBTSArIE9GRlNFVF9RTUYgKyAobiooRU5WX1JfQlVGRl9CWVRFK0VOVl9JX0JVRkZfQllURSkpICkpOwotICB9Ci0gIEZJWFBfREJMKiBHZXRSYW1fU2JyX2VudklCdWZmZXIgKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pIHsKLSAgICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNIT0wKTsKLSAgICByZXR1cm4gKChGSVhQX0RCTCopIChkeW5hbWljX1JBTSArIE9GRlNFVF9RTUYgKyAoRU5WX1JfQlVGRl9CWVRFKSArIChuKihFTlZfUl9CVUZGX0JZVEUrRU5WX0lfQlVGRl9CWVRFKSkpKTsKLSAgfQotCi0KLQotCi0vKiBAfSAqLwotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvc2JyX3JhbS5oIGIvbGliU0JSZW5jL3NyYy9zYnJfcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlM2QwYzguLjAwMDAwMDAKLS0tIGEvbGliU0JSZW5jL3NyYy9zYnJfcmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIQotXGZpbGUKLVxicmllZiBNZW1vcnkgbGF5b3V0Ci0gCi0qLwotI2lmbmRlZiBfX1NCUl9SQU1fSAotI2RlZmluZSBfX1NCUl9SQU1fSAotCi0jaW5jbHVkZSAic2JyX2RlZi5oIgotI2luY2x1ZGUgImVudl9lc3QuaCIKLSNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgotI2luY2x1ZGUgInNici5oIgotCi0KLQotI2luY2x1ZGUgInBzX21haW4uaCIKLSNpbmNsdWRlICJwc19lbmNvZGUuaCIKLQotCi0jZGVmaW5lIEVOVl9UUkFOU0lFTlRTX0JZVEUgICggKHNpemVvZihGSVhQX0RCTCkqKE1BWF9OVU1fQ0hBTk5FTFMqMypRTUZfTUFYX1RJTUVfU0xPVFMpKSApCi0KLSAgI2RlZmluZSBFTlZfUl9CVUZGX0JZVEUgICAgICAoIChzaXplb2YoRklYUF9EQkwpKigoUU1GX01BWF9USU1FX1NMT1RTKSAqIE1BWF9IWUJSSURfQkFORFMpKSApCi0gICNkZWZpbmUgRU5WX0lfQlVGRl9CWVRFICAgICAgKCAoc2l6ZW9mKEZJWFBfREJMKSooKFFNRl9NQVhfVElNRV9TTE9UUykgKiBNQVhfSFlCUklEX0JBTkRTKSkgKQotICAjZGVmaW5lIFlfQlVGX0NIX0JZVEUgICAgICAgICggKDIqc2l6ZW9mKEZJWFBfREJMKSooKFFNRl9NQVhfVElNRV9TTE9UUykgKiBNQVhfSFlCUklEX0JBTkRTKSkgKQotCi0KLSNkZWZpbmUgRU5WX1JfQlVGX1BTX0JZVEUgICAgKCAoc2l6ZW9mKEZJWFBfREJMKSpRTUZfTUFYX1RJTUVfU0xPVFMgKiBRTUZfQ0hBTk5FTFMgLyAyKSApCi0jZGVmaW5lIEVOVl9JX0JVRl9QU19CWVRFICAgICggKHNpemVvZihGSVhQX0RCTCkqUU1GX01BWF9USU1FX1NMT1RTICogUU1GX0NIQU5ORUxTIC8gMikgKQotCi0jZGVmaW5lIFRPTl9CVUZfQ0hfQllURSAgICAgICggKHNpemVvZihGSVhQX0RCTCkqKE1BWF9OT19PRl9FU1RJTUFURVMqTUFYX0ZSRVFfQ09FRkZTKSkgKQotCi0jZGVmaW5lIFlfMl9CVUZfQllURSAgICAgICAgICggWV9CVUZfQ0hfQllURT4+MSApCi0KLQotLyogV29ya2J1ZmZlciBSQU0gLSBBbGxvY2F0aW9uICovCi0vKgotICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLSB8ICAgICAgICBPRkZTRVRfUU1GICAgICAgIHwgICAgICAgIE9GRlNFVF9OUkcgICAgICB8Ci0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAwLjUgKiAgICAgICAgICB8Ci0gfCAgICAgc2JyX2VudlJCdWZmZXIgICAgICB8IHNicl9lbnZZQnVmZmVyX3NpemUgICAgfAotIHwgICAgIHNicl9lbnZJQnVmZmVyICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSovCi0gICNkZWZpbmUgQlVGX05SR19TSVpFICAgKCAoTUFYX05VTV9DSEFOTkVMUyAqIFlfMl9CVUZfQllURSkgKQotICAjZGVmaW5lIEJVRl9RTUZfU0laRSAgKEVOVl9SX0JVRkZfQllURSArIEVOVl9JX0JVRkZfQllURSkKLQotICAvKiBTaXplIG9mIHRoZSBzaGFyZWFibGUgbWVtb3J5IHJlZ2lvbiB0aGFuIGNhbiBiZSByZXVzZWQgKi8KLSAgI2RlZmluZSBTQlJfRU5DX0RZTl9SQU1fU0laRSAgKCBCVUZfUU1GX1NJWkUgKyBCVUZfTlJHX1NJWkUgKQotCi0gICNkZWZpbmUgT0ZGU0VUX1FNRiAgICAgICAgICggMCApCi0gICNkZWZpbmUgT0ZGU0VUX05SRyAgICAgICAgICggT0ZGU0VUX1FNRiArIEJVRl9RTUZfU0laRSApCi0KLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSAgSF9BTExPQ19NRU0oUmFtX1NickR5bmFtaWNfUkFNLCBGSVhQX0RCTCkKLQotICBIX0FMTE9DX01FTShSYW1fU2JyRW5jb2RlciwgU0JSX0VOQ09ERVIpCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJDaGFubmVsLCBTQlJfQ0hBTk5FTCkKLSAgSF9BTExPQ19NRU0oUmFtX1NickVsZW1lbnQsIFNCUl9FTEVNRU5UKQotCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJfcXVvdGFNYXRyaXgsIEZJWFBfREJMKQotICBIX0FMTE9DX01FTShSYW1fU2JyX3NpZ25NYXRyaXgsIElOVCkKLQotICBIX0FMTE9DX01FTShSYW1fU2JyX1FtZlN0YXRlc0FuYWx5c2lzLCBGSVhQX1FBUykKLQotICBIX0FMTE9DX01FTShSYW1fU2JyX2ZyZXFCYW5kVGFibGVMTywgVUNIQVIpCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJfZnJlcUJhbmRUYWJsZUhJLCBVQ0hBUikKLSAgSF9BTExPQ19NRU0oUmFtX1Nicl92X2tfbWFzdGVyLCBVQ0hBUikKLQotICBIX0FMTE9DX01FTShSYW1fU2JyX2RldGVjdGlvblZlY3RvcnMsIFVDSEFSKQotICBIX0FMTE9DX01FTShSYW1fU2JyX3ByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbiwgVUNIQVIpCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJfZ3VpZGVTY2ZiLCBVQ0hBUikKLSAgSF9BTExPQ19NRU0oUmFtX1Nicl9ndWlkZVZlY3RvckRldGVjdGVkLCBVQ0hBUikKLQotICAvKiBEeW5hbWljIE1lbW9yeSBBbGxvY2F0aW9uICovCi0KLSAgSF9BTExPQ19NRU0oUmFtX1Nicl9lbnZZQnVmZmVyLCBGSVhQX0RCTCkKLSAgRklYUF9EQkwqIEdldFJhbV9TYnJfZW52WUJ1ZmZlciAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7Ci0gIEZJWFBfREJMKiBHZXRSYW1fU2JyX2VudlJCdWZmZXIgKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pOwotICBGSVhQX0RCTCogR2V0UmFtX1Nicl9lbnZJQnVmZmVyIChpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKTsKLQotICBIX0FMTE9DX01FTShSYW1fU2JyX2d1aWRlVmVjdG9yRGlmZiwgRklYUF9EQkwpCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJfZ3VpZGVWZWN0b3JPcmlnLCBGSVhQX0RCTCkKLQotCi0gIEhfQUxMT0NfTUVNKFJhbV9Qc1FtZlN0YXRlc1N5bnRoZXNpcywgRklYUF9EQkwpCi0KLSAgSF9BTExPQ19NRU0oUmFtX1BzRW5jb2RlLCBQU19FTkNPREUpCi0KLSAgRklYUF9EQkwqIEZES3NickVuY19TbGljZVJhbV9Qc1JxbWYgKEZJWFBfREJMKiByUW1mRGF0YSwgVUNIQVIqIGR5bmFtaWNfUkFNLCBpbnQgbiwgaW50IGksIGludCBxbWZTbG90cyk7Ci0gIEZJWFBfREJMKiBGREtzYnJFbmNfU2xpY2VSYW1fUHNJcW1mIChGSVhQX0RCTCogaVFtZkRhdGEsIFVDSEFSKiBkeW5hbWljX1JBTSwgaW50IG4sIGludCBpLCBpbnQgcW1mU2xvdHMpOwotCi0gIEhfQUxMT0NfTUVNKFJhbV9QYXJhbVN0ZXJlbywgUEFSQU1FVFJJQ19TVEVSRU8pCi0KLQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9zYnJfcm9tLmNwcCBiL2xpYlNCUmVuYy9zcmMvc2JyX3JvbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTE2NjguLjAwMDAwMDAKLS0tIGEvbGliU0JSZW5jL3NyYy9zYnJfcm9tLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc5NSArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyohCi0gIFxmaWxlCi0gIFxicmllZiAgRGVmaW5pdGlvbiBvZiBjb25zdGFudCB0YWJsZXMKLSAgIAotCi0gIFRoaXMgbW9kdWxlIGNvbnRhaW5zIG1vc3Qgb2YgdGhlIGNvbnN0YW50IGRhdGEgdGhhdCBjYW4gYmUgc3RvcmVkIGluIFJPTS4KLSovCi0KLSNpbmNsdWRlICJzYnJfcm9tLmgiCi0jaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKLQotLy9AewotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgVGFibGUgT3ZlcnZpZXc6Ci0KLSBvIGVudmVsb3BlIGxldmVsLCAgIDEuNSBkQjoKLSAgICAxYSkgIHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwVFsxMjFdCi0gICAgMWIpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMFRbMTIxXQotICAgIDJhKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBGWzEyMV0KLSAgICAyYikgIHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwRlsxMjFdCi0KLSBvIGVudmVsb3BlIGJhbGFuY2UsIDEuNSBkQjoKLSAgICAzYSkgIGJvb2tTYnJFbnZCYWxhbmNlQzEwVFs0OV0KLSAgICAzYikgIGJvb2tTYnJFbnZCYWxhbmNlTDEwVFs0OV0KLSAgICA0YSkgIGJvb2tTYnJFbnZCYWxhbmNlQzEwRls0OV0KLSAgICA0YikgIGJvb2tTYnJFbnZCYWxhbmNlTDEwRls0OV0KLQotIG8gZW52ZWxvcGUgbGV2ZWwsICAgMy4wIGRCOgotICAgIDVhKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFUWzYzXQotICAgIDViKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUWzYzXQotICAgIDZhKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGWzYzXQotICAgIDZiKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGWzYzXQotCi0gbyBlbnZlbG9wZSBiYWxhbmNlLCAzLjAgZEI6Ci0gICAgN2EpICBib29rU2JyRW52QmFsYW5jZUMxMVRbMjVdCi0gICAgN2IpICBib29rU2JyRW52QmFsYW5jZUwxMVRbMjVdCi0gICAgOGEpICBib29rU2JyRW52QmFsYW5jZUMxMUZbMjVdCi0gICAgOGIpICBib29rU2JyRW52QmFsYW5jZUwxMUZbMjVdCi0KLSBvIG5vaXNlIGxldmVsLCAgICAgIDMuMCBkQjoKLSAgICA5YSkgIHZfSHVmZl9Ob2lzZUxldmVsQzExVFs2M10KLSAgICA5YikgIHZfSHVmZl9Ob2lzZUxldmVsTDExVFs2M10KLSAgICAtICkgKHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRls2M10gaXMgdXNlZCBmb3IgZnJlcSBkaXIpCi0gICAgLSApICh2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUZbNjNdIGlzIHVzZWQgZm9yIGZyZXEgZGlyKQotCi0gbyBub2lzZSBiYWxhbmNlLCAgICAzLjAgZEI6Ci0gICAxMGEpICBib29rU2JyTm9pc2VCYWxhbmNlQzExVFsyNV0KLSAgIDEwYikgIGJvb2tTYnJOb2lzZUJhbGFuY2VMMTFUWzI1XQotICAgIC0gKSAoYm9va1NickVudkJhbGFuY2VDMTFGWzI1XSBpcyB1c2VkIGZvciBmcmVxIGRpcikKLSAgICAtICkgKGJvb2tTYnJFbnZCYWxhbmNlTDExRlsyNV0gaXMgdXNlZCBmb3IgZnJlcSBkaXIpCi0KLQotICAoMS41IGRCIGlzIG5ldmVyIHVzZWQgZm9yIG5vaXNlKQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIHRhYmxlICAgICAgIDogZW52ZWxvcGUgbGV2ZWwsIDEuNSBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogdGhlb3IgcmFuZ2UgOiBbLTU4LDU4XSwgQ09ERV9CT09LX1NDRl9MQVYgICA9IDU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBpbXBsZW0gcmFuZ2U6IFstNjAsNjBdLCBDT0RFX0JPT0tfU0NGX0xBVjEwID0gNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIHJhdyBzdGF0cyAgIDogZW52ZWxvcGVMZXZlbF8wMCAoeWVzLCB3cm9uZyBzdWZmaXggaW4gbmFtZSkgIEtLIDAxLTAzLTA5ICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGRpcmVjdGlvbjogdGltZQotICAgY29udGVudHMgOiBjb2Rld29yZHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQzJGSVgubS9lbnZlbG9wZUxldmVsXzAwVF9jRi5tYXQvdl9uQ2hleF9jRgotICAgYnVpbHQgYnkgOiBGSCAwMS0wNy0wNSAqLwotCi1jb25zdCBJTlQgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBUWzEyMV0gPQotewotICAweDAwMDNGRkQ2LCAweDAwMDNGRkQ3LCAweDAwMDNGRkQ4LCAweDAwMDNGRkQ5LCAweDAwMDNGRkRBLCAweDAwMDNGRkRCLCAweDAwMDdGRkI4LCAweDAwMDdGRkI5LAotICAweDAwMDdGRkJBLCAweDAwMDdGRkJCLCAweDAwMDdGRkJDLCAweDAwMDdGRkJELCAweDAwMDdGRkJFLCAweDAwMDdGRkJGLCAweDAwMDdGRkMwLCAweDAwMDdGRkMxLAotICAweDAwMDdGRkMyLCAweDAwMDdGRkMzLCAweDAwMDdGRkM0LCAweDAwMDdGRkM1LCAweDAwMDdGRkM2LCAweDAwMDdGRkM3LCAweDAwMDdGRkM4LCAweDAwMDdGRkM5LAotICAweDAwMDdGRkNBLCAweDAwMDdGRkNCLCAweDAwMDdGRkNDLCAweDAwMDdGRkNELCAweDAwMDdGRkNFLCAweDAwMDdGRkNGLCAweDAwMDdGRkQwLCAweDAwMDdGRkQxLAotICAweDAwMDdGRkQyLCAweDAwMDdGRkQzLCAweDAwMDFGRkU2LCAweDAwMDNGRkQ0LCAweDAwMDBGRkYwLCAweDAwMDFGRkU5LCAweDAwMDNGRkQ1LCAweDAwMDFGRkU3LAotICAweDAwMDBGRkYxLCAweDAwMDBGRkVDLCAweDAwMDBGRkVELCAweDAwMDBGRkVFLCAweDAwMDA3RkY0LCAweDAwMDAzRkY5LCAweDAwMDAzRkY3LCAweDAwMDAxRkZBLAotICAweDAwMDAxRkY5LCAweDAwMDAwRkZCLCAweDAwMDAwN0ZDLCAweDAwMDAwM0ZDLCAweDAwMDAwMUZELCAweDAwMDAwMEZELCAweDAwMDAwMDdELCAweDAwMDAwMDNELAotICAweDAwMDAwMDFELCAweDAwMDAwMDBELCAweDAwMDAwMDA1LCAweDAwMDAwMDAxLCAweDAwMDAwMDAwLCAweDAwMDAwMDA0LCAweDAwMDAwMDBDLCAweDAwMDAwMDFDLAotICAweDAwMDAwMDNDLCAweDAwMDAwMDdDLCAweDAwMDAwMEZDLCAweDAwMDAwMUZDLCAweDAwMDAwM0ZELCAweDAwMDAwRkZBLCAweDAwMDAxRkY4LCAweDAwMDAzRkY2LAotICAweDAwMDAzRkY4LCAweDAwMDA3RkY1LCAweDAwMDBGRkVGLCAweDAwMDFGRkU4LCAweDAwMDBGRkYyLCAweDAwMDdGRkQ0LCAweDAwMDdGRkQ1LCAweDAwMDdGRkQ2LAotICAweDAwMDdGRkQ3LCAweDAwMDdGRkQ4LCAweDAwMDdGRkQ5LCAweDAwMDdGRkRBLCAweDAwMDdGRkRCLCAweDAwMDdGRkRDLCAweDAwMDdGRkRELCAweDAwMDdGRkRFLAotICAweDAwMDdGRkRGLCAweDAwMDdGRkUwLCAweDAwMDdGRkUxLCAweDAwMDdGRkUyLCAweDAwMDdGRkUzLCAweDAwMDdGRkU0LCAweDAwMDdGRkU1LCAweDAwMDdGRkU2LAotICAweDAwMDdGRkU3LCAweDAwMDdGRkU4LCAweDAwMDdGRkU5LCAweDAwMDdGRkVBLCAweDAwMDdGRkVCLCAweDAwMDdGRkVDLCAweDAwMDdGRkVELCAweDAwMDdGRkVFLAotICAweDAwMDdGRkVGLCAweDAwMDdGRkYwLCAweDAwMDdGRkYxLCAweDAwMDdGRkYyLCAweDAwMDdGRkYzLCAweDAwMDdGRkY0LCAweDAwMDdGRkY1LCAweDAwMDdGRkY2LAotICAweDAwMDdGRkY3LCAweDAwMDdGRkY4LCAweDAwMDdGRkY5LCAweDAwMDdGRkZBLCAweDAwMDdGRkZCLCAweDAwMDdGRkZDLCAweDAwMDdGRkZELCAweDAwMDdGRkZFLAotICAweDAwMDdGRkZGCi19OwotCi0KLS8qIGRpcmVjdGlvbjogdGltZQotICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlM0MyRklYLm0vZW52ZWxvcGVMZXZlbF8wMFRfY0YubWF0L3ZfbkxoZXhfY0YKLSAgIGJ1aWx0IGJ5IDogRkggMDEtMDctMDUgKi8KLQotY29uc3QgVUNIQVIgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBUWzEyMV0gPQotewotICAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAotICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAotICAweDEzLCAweDEzLCAweDExLCAweDEyLCAweDEwLCAweDExLCAweDEyLCAweDExLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDBGLCAweDBFLCAweDBFLCAweDBELAotICAweDBELCAweDBDLCAweDBCLCAweDBBLCAweDA5LCAweDA4LCAweDA3LCAweDA2LCAweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAotICAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBDLCAweDBELCAweDBFLCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEwLCAweDEzLCAweDEzLCAweDEzLAotICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAotICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAotICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzCi19OwotCi0KLS8qIGRpcmVjdGlvbjogZnJlcQotICAgY29udGVudHMgOiBjb2Rld29yZHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQzJGSVgubS9lbnZlbG9wZUxldmVsXzAwRl9jRi5tYXQvdl9uQ2hleF9jRgotICAgYnVpbHQgYnkgOiBGSCAwMS0wNy0wNSAqLwotCi1jb25zdCBJTlQgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBGWzEyMV0gPQotewotICAweDAwMDdGRkU3LCAweDAwMDdGRkU4LCAweDAwMEZGRkQyLCAweDAwMEZGRkQzLCAweDAwMEZGRkQ0LCAweDAwMEZGRkQ1LCAweDAwMEZGRkQ2LCAweDAwMEZGRkQ3LAotICAweDAwMEZGRkQ4LCAweDAwMDdGRkRBLCAweDAwMEZGRkQ5LCAweDAwMEZGRkRBLCAweDAwMEZGRkRCLCAweDAwMEZGRkRDLCAweDAwMDdGRkRCLCAweDAwMEZGRkRELAotICAweDAwMDdGRkRDLCAweDAwMDdGRkRELCAweDAwMEZGRkRFLCAweDAwMDNGRkU0LCAweDAwMEZGRkRGLCAweDAwMEZGRkUwLCAweDAwMEZGRkUxLCAweDAwMDdGRkRFLAotICAweDAwMEZGRkUyLCAweDAwMEZGRkUzLCAweDAwMEZGRkU0LCAweDAwMDdGRkRGLCAweDAwMEZGRkU1LCAweDAwMDdGRkUwLCAweDAwMDNGRkU4LCAweDAwMDdGRkUxLAotICAweDAwMDNGRkUwLCAweDAwMDNGRkU5LCAweDAwMDFGRkVGLCAweDAwMDNGRkU1LCAweDAwMDFGRkVDLCAweDAwMDFGRkVELCAweDAwMDFGRkVFLCAweDAwMDBGRkY0LAotICAweDAwMDBGRkYzLCAweDAwMDBGRkYwLCAweDAwMDA3RkY3LCAweDAwMDA3RkY2LCAweDAwMDAzRkZBLCAweDAwMDAxRkZBLCAweDAwMDAxRkY5LCAweDAwMDAwRkZBLAotICAweDAwMDAwRkY4LCAweDAwMDAwN0Y5LCAweDAwMDAwM0ZCLCAweDAwMDAwMUZDLCAweDAwMDAwMUZBLCAweDAwMDAwMEZCLCAweDAwMDAwMDdDLCAweDAwMDAwMDNDLAotICAweDAwMDAwMDFDLCAweDAwMDAwMDBDLCAweDAwMDAwMDA1LCAweDAwMDAwMDAxLCAweDAwMDAwMDAwLCAweDAwMDAwMDA0LCAweDAwMDAwMDBELCAweDAwMDAwMDFELAotICAweDAwMDAwMDNELCAweDAwMDAwMEZBLCAweDAwMDAwMEZDLCAweDAwMDAwMUZCLCAweDAwMDAwM0ZBLCAweDAwMDAwN0Y4LCAweDAwMDAwN0ZBLCAweDAwMDAwN0ZCLAotICAweDAwMDAwRkY5LCAweDAwMDAwRkZCLCAweDAwMDAxRkY4LCAweDAwMDAxRkZCLCAweDAwMDAzRkY4LCAweDAwMDAzRkY5LCAweDAwMDBGRkYxLCAweDAwMDBGRkYyLAotICAweDAwMDFGRkVBLCAweDAwMDFGRkVCLCAweDAwMDNGRkUxLCAweDAwMDNGRkUyLCAweDAwMDNGRkVBLCAweDAwMDNGRkUzLCAweDAwMDNGRkU2LCAweDAwMDNGRkU3LAotICAweDAwMDNGRkVCLCAweDAwMEZGRkU2LCAweDAwMDdGRkUyLCAweDAwMEZGRkU3LCAweDAwMEZGRkU4LCAweDAwMEZGRkU5LCAweDAwMEZGRkVBLCAweDAwMEZGRkVCLAotICAweDAwMEZGRkVDLCAweDAwMDdGRkUzLCAweDAwMEZGRkVELCAweDAwMEZGRkVFLCAweDAwMEZGRkVGLCAweDAwMEZGRkYwLCAweDAwMDdGRkU0LCAweDAwMEZGRkYxLAotICAweDAwMDNGRkVDLCAweDAwMEZGRkYyLCAweDAwMEZGRkYzLCAweDAwMDdGRkU1LCAweDAwMDdGRkU2LCAweDAwMEZGRkY0LCAweDAwMEZGRkY1LCAweDAwMEZGRkY2LAotICAweDAwMEZGRkY3LCAweDAwMEZGRkY4LCAweDAwMEZGRkY5LCAweDAwMEZGRkZBLCAweDAwMEZGRkZCLCAweDAwMEZGRkZDLCAweDAwMEZGRkZELCAweDAwMEZGRkZFLAotICAweDAwMEZGRkZGCi19OwotCi0KLS8qIGRpcmVjdGlvbjogZnJlcQotICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlM0MyRklYLm0vZW52ZWxvcGVMZXZlbF8wMEZfY0YubWF0L3ZfbkxoZXhfY0YKLSAgIGJ1aWx0IGJ5IDogRkggMDEtMDctMDUgKi8KLQotY29uc3QgVUNIQVIgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBGWzEyMV0gPQotewotICAweDEzLCAweDEzLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDEzLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDEzLCAweDE0LAotICAweDEzLCAweDEzLCAweDE0LCAweDEyLCAweDE0LCAweDE0LCAweDE0LCAweDEzLCAweDE0LCAweDE0LCAweDE0LCAweDEzLCAweDE0LCAweDEzLCAweDEyLCAweDEzLAotICAweDEyLCAweDEyLCAweDExLCAweDEyLCAweDExLCAweDExLCAweDExLCAweDEwLCAweDEwLCAweDEwLCAweDBGLCAweDBGLCAweDBFLCAweDBELCAweDBELCAweDBDLAotICAweDBDLCAweDBCLCAweDBBLCAweDA5LCAweDA5LCAweDA4LCAweDA3LCAweDA2LCAweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAotICAweDA2LCAweDA4LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBCLCAweDBCLCAweDBDLCAweDBDLCAweDBELCAweDBELCAweDBFLCAweDBFLCAweDEwLCAweDEwLAotICAweDExLCAweDExLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDE0LCAweDEzLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAotICAweDE0LCAweDEzLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDEzLCAweDE0LCAweDEyLCAweDE0LCAweDE0LCAweDEzLCAweDEzLCAweDE0LCAweDE0LCAweDE0LAotICAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0Ci19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdGFibGUgICAgICAgOiBlbnZlbG9wZSBiYWxhbmNlLCAxLjUgZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiB0aGVvciByYW5nZSA6IFstNDgsNDhdLCBDT0RFX0JPT0tfU0NGX0xBViA9IDQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGltcGxlbSByYW5nZTogc2FtZSBidXQgbWFwcGVkIHRvIFstMjQsMjRdLCBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTAgPSAyNCAqLwotLyogcmF3IHN0YXRzICAgOiBlbnZlbG9wZVBhbl8wMCAoeWVzLCB3cm9uZyBzdWZmaXggaW4gbmFtZSkgIEtLIDAxLTAzLTA5ICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZGlyZWN0aW9uOiB0aW1lCi0gICBjb250ZW50cyA6IGNvZGV3b3JkcwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVQYW5fMDBULm1hdC92X25CaGV4Ci0gICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCi0KLWNvbnN0IElOVCBib29rU2JyRW52QmFsYW5jZUMxMFRbNDldID0KLXsKLSAgMHgwMDAwRkZFNCwgMHgwMDAwRkZFNSwgMHgwMDAwRkZFNiwgMHgwMDAwRkZFNywgMHgwMDAwRkZFOCwgMHgwMDAwRkZFOSwgMHgwMDAwRkZFQSwgMHgwMDAwRkZFQiwKLSAgMHgwMDAwRkZFQywgMHgwMDAwRkZFRCwgMHgwMDAwRkZFRSwgMHgwMDAwRkZFRiwgMHgwMDAwRkZGMCwgMHgwMDAwRkZGMSwgMHgwMDAwRkZGMiwgMHgwMDAwRkZGMywKLSAgMHgwMDAwRkZGNCwgMHgwMDAwRkZFMiwgMHgwMDAwMEZGQywgMHgwMDAwMDdGQywgMHgwMDAwMDFGRSwgMHgwMDAwMDA3RSwgMHgwMDAwMDAxRSwgMHgwMDAwMDAwNiwKLSAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwRSwgMHgwMDAwMDAzRSwgMHgwMDAwMDBGRSwgMHgwMDAwMDdGRCwgMHgwMDAwMEZGRCwgMHgwMDAwN0ZGMCwKLSAgMHgwMDAwRkZFMywgMHgwMDAwRkZGNSwgMHgwMDAwRkZGNiwgMHgwMDAwRkZGNywgMHgwMDAwRkZGOCwgMHgwMDAwRkZGOSwgMHgwMDAwRkZGQSwgMHgwMDAxRkZGNiwKLSAgMHgwMDAxRkZGNywgMHgwMDAxRkZGOCwgMHgwMDAxRkZGOSwgMHgwMDAxRkZGQSwgMHgwMDAxRkZGQiwgMHgwMDAxRkZGQywgMHgwMDAxRkZGRCwgMHgwMDAxRkZGRSwKLSAgMHgwMDAxRkZGRgotfTsKLQotCi0vKiBkaXJlY3Rpb246IHRpbWUKLSAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVQYW5fMDBULm1hdC92X25MaGV4Ci0gICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCi0KLWNvbnN0IFVDSEFSIGJvb2tTYnJFbnZCYWxhbmNlTDEwVFs0OV0gPQotewotICAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAotICAweDEwLCAweDEwLCAweDBDLCAweDBCLCAweDA5LCAweDA3LCAweDA1LCAweDAzLCAweDAxLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBCLCAweDBDLCAweDBGLAotICAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLAotICAweDExCi19OwotCi0KLS8qIGRpcmVjdGlvbjogZnJlcQotICAgY29udGVudHMgOiBjb2Rld29yZHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL2VudmVsb3BlUGFuXzAwRi5tYXQvdl9uQmhleAotICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLwotCi1jb25zdCBJTlQgYm9va1NickVudkJhbGFuY2VDMTBGWzQ5XSA9Ci17Ci0gIDB4MDAwM0ZGRTIsIDB4MDAwM0ZGRTMsIDB4MDAwM0ZGRTQsIDB4MDAwM0ZGRTUsIDB4MDAwM0ZGRTYsIDB4MDAwM0ZGRTcsIDB4MDAwM0ZGRTgsIDB4MDAwM0ZGRTksCi0gIDB4MDAwM0ZGRUEsIDB4MDAwM0ZGRUIsIDB4MDAwM0ZGRUMsIDB4MDAwM0ZGRUQsIDB4MDAwM0ZGRUUsIDB4MDAwM0ZGRUYsIDB4MDAwM0ZGRjAsIDB4MDAwMEZGRjcsCi0gIDB4MDAwMUZGRjAsIDB4MDAwMDNGRkMsIDB4MDAwMDA3RkUsIDB4MDAwMDA3RkMsIDB4MDAwMDAwRkUsIDB4MDAwMDAwN0UsIDB4MDAwMDAwMEUsIDB4MDAwMDAwMDIsCi0gIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMUUsIDB4MDAwMDAwM0UsIDB4MDAwMDAxRkUsIDB4MDAwMDA3RkQsIDB4MDAwMDBGRkUsIDB4MDAwMDdGRkEsCi0gIDB4MDAwMEZGRjYsIDB4MDAwM0ZGRjEsIDB4MDAwM0ZGRjIsIDB4MDAwM0ZGRjMsIDB4MDAwM0ZGRjQsIDB4MDAwM0ZGRjUsIDB4MDAwM0ZGRjYsIDB4MDAwM0ZGRjcsCi0gIDB4MDAwM0ZGRjgsIDB4MDAwM0ZGRjksIDB4MDAwM0ZGRkEsIDB4MDAwM0ZGRkIsIDB4MDAwM0ZGRkMsIDB4MDAwM0ZGRkQsIDB4MDAwM0ZGRkUsIDB4MDAwN0ZGRkUsCi0gIDB4MDAwN0ZGRkYKLX07Ci0KLQotLyogZGlyZWN0aW9uOiBmcmVxCi0gICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL2VudmVsb3BlUGFuXzAwRi5tYXQvdl9uTGhleAotICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLwotCi1jb25zdCBVQ0hBUiBib29rU2JyRW52QmFsYW5jZUwxMEZbNDldID0KLXsKLSAgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMCwKLSAgMHgxMSwgMHgwRSwgMHgwQiwgMHgwQiwgMHgwOCwgMHgwNywgMHgwNCwgMHgwMiwgMHgwMSwgMHgwMywgMHgwNSwgMHgwNiwgMHgwOSwgMHgwQiwgMHgwQywgMHgwRiwKLSAgMHgxMCwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMywKLSAgMHgxMwotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIHRhYmxlICAgICAgIDogZW52ZWxvcGUgbGV2ZWwsIDMuMCBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogdGhlb3IgcmFuZ2UgOiBbLTI5LDI5XSwgQ09ERV9CT09LX1NDRl9MQVYgICA9IDI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBpbXBsZW0gcmFuZ2U6IFstMzEsMzFdLCBDT0RFX0JPT0tfU0NGX0xBVjExID0gMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIHJhdyBzdGF0cyAgIDogZW52ZWxvcGVMZXZlbF8xMSAgS0sgMDAtMDItMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGRpcmVjdGlvbjogdGltZQotICAgY29udGVudHMgOiBjb2Rld29yZHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUyLm0KLSAgIGJ1aWx0IGJ5IDogRkggMDAtMDItMDQgKi8KLQotY29uc3QgSU5UIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExVFs2M10gPSB7Ci0gIDB4MDAwM0ZGRUQsIDB4MDAwM0ZGRUUsIDB4MDAwN0ZGREUsIDB4MDAwN0ZGREYsIDB4MDAwN0ZGRTAsIDB4MDAwN0ZGRTEsIDB4MDAwN0ZGRTIsIDB4MDAwN0ZGRTMsCi0gIDB4MDAwN0ZGRTQsIDB4MDAwN0ZGRTUsIDB4MDAwN0ZGRTYsIDB4MDAwN0ZGRTcsIDB4MDAwN0ZGRTgsIDB4MDAwN0ZGRTksIDB4MDAwN0ZGRUEsIDB4MDAwN0ZGRUIsCi0gIDB4MDAwN0ZGRUMsIDB4MDAwMUZGRjQsIDB4MDAwMEZGRjcsIDB4MDAwMEZGRjksIDB4MDAwMEZGRjgsIDB4MDAwMDNGRkIsIDB4MDAwMDNGRkEsIDB4MDAwMDNGRjgsCi0gIDB4MDAwMDFGRkEsIDB4MDAwMDBGRkMsIDB4MDAwMDA3RkMsIDB4MDAwMDAwRkUsIDB4MDAwMDAwM0UsIDB4MDAwMDAwMEUsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMDYsIDB4MDAwMDAwMUUsIDB4MDAwMDAwN0UsIDB4MDAwMDAxRkUsIDB4MDAwMDA3RkQsIDB4MDAwMDFGRkIsIDB4MDAwMDNGRjksIDB4MDAwMDNGRkMsCi0gIDB4MDAwMDdGRkEsIDB4MDAwMEZGRjYsIDB4MDAwMUZGRjUsIDB4MDAwM0ZGRUMsIDB4MDAwN0ZGRUQsIDB4MDAwN0ZGRUUsIDB4MDAwN0ZGRUYsIDB4MDAwN0ZGRjAsCi0gIDB4MDAwN0ZGRjEsIDB4MDAwN0ZGRjIsIDB4MDAwN0ZGRjMsIDB4MDAwN0ZGRjQsIDB4MDAwN0ZGRjUsIDB4MDAwN0ZGRjYsIDB4MDAwN0ZGRjcsIDB4MDAwN0ZGRjgsCi0gIDB4MDAwN0ZGRjksIDB4MDAwN0ZGRkEsIDB4MDAwN0ZGRkIsIDB4MDAwN0ZGRkMsIDB4MDAwN0ZGRkQsIDB4MDAwN0ZGRkUsIDB4MDAwN0ZGRkYKLX07Ci0KLQotLyogZGlyZWN0aW9uOiB0aW1lCi0gICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUyLm0KLSAgIGJ1aWx0IGJ5IDogRkggMDAtMDItMDQgKi8KLQotY29uc3QgVUNIQVIgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUWzYzXSA9IHsKLSAgMHgxMiwgMHgxMiwgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKLSAgMHgxMywgMHgxMSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgwRSwgMHgwRSwgMHgwRSwgMHgwRCwgMHgwQywgMHgwQiwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMiwgMHgwMSwKLSAgMHgwMywgMHgwNSwgMHgwNywgMHgwOSwgMHgwQiwgMHgwRCwgMHgwRSwgMHgwRSwgMHgwRiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxMywgMHgxMywgMHgxMywKLSAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMwotfTsKLQotCi0vKiBkaXJlY3Rpb246IGZyZXEKLSAgIGNvbnRlbnRzIDogY29kZXdvcmRzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCi0gICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCi0KLWNvbnN0IElOVCB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUZbNjNdID0gewotICAweDAwMEZGRkYwLCAweDAwMEZGRkYxLCAweDAwMEZGRkYyLCAweDAwMEZGRkYzLCAweDAwMEZGRkY0LCAweDAwMEZGRkY1LCAweDAwMEZGRkY2LCAweDAwMDNGRkYzLAotICAweDAwMDdGRkY1LCAweDAwMDdGRkVFLCAweDAwMDdGRkVGLCAweDAwMDdGRkY2LCAweDAwMDNGRkY0LCAweDAwMDNGRkYyLCAweDAwMEZGRkY3LCAweDAwMDdGRkYwLAotICAweDAwMDFGRkY1LCAweDAwMDNGRkYwLCAweDAwMDFGRkY0LCAweDAwMDBGRkY3LCAweDAwMDBGRkY2LCAweDAwMDA3RkY4LCAweDAwMDAzRkZCLCAweDAwMDAwRkZELAotICAweDAwMDAwN0ZELCAweDAwMDAwM0ZELCAweDAwMDAwMUZELCAweDAwMDAwMEZELCAweDAwMDAwMDNFLCAweDAwMDAwMDBFLCAweDAwMDAwMDAyLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDA2LCAweDAwMDAwMDFFLCAweDAwMDAwMEZDLCAweDAwMDAwMUZDLCAweDAwMDAwM0ZDLCAweDAwMDAwN0ZDLCAweDAwMDAwRkZDLCAweDAwMDAxRkZDLAotICAweDAwMDAzRkZBLCAweDAwMDA3RkY5LCAweDAwMDA3RkZBLCAweDAwMDBGRkY4LCAweDAwMDBGRkY5LCAweDAwMDFGRkY2LCAweDAwMDFGRkY3LCAweDAwMDNGRkY1LAotICAweDAwMDNGRkY2LCAweDAwMDNGRkYxLCAweDAwMEZGRkY4LCAweDAwMDdGRkYxLCAweDAwMDdGRkYyLCAweDAwMDdGRkYzLCAweDAwMEZGRkY5LCAweDAwMDdGRkY3LAotICAweDAwMDdGRkY0LCAweDAwMEZGRkZBLCAweDAwMEZGRkZCLCAweDAwMEZGRkZDLCAweDAwMEZGRkZELCAweDAwMEZGRkZFLCAweDAwMEZGRkZGCi19OwotCi0KLS8qIGRpcmVjdGlvbjogZnJlcQotICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCi0gICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCi0KLWNvbnN0IFVDSEFSIHZfSHVmZl9lbnZlbG9wZUxldmVsTDExRls2M10gPSB7Ci0gIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTIsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTIsIDB4MTIsIDB4MTQsIDB4MTMsCi0gIDB4MTEsIDB4MTIsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MEYsIDB4MEUsIDB4MEMsIDB4MEIsIDB4MEEsIDB4MDksIDB4MDgsIDB4MDYsIDB4MDQsIDB4MDIsIDB4MDEsCi0gIDB4MDMsIDB4MDUsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsIDB4MEYsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTIsCi0gIDB4MTIsIDB4MTIsIDB4MTQsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQKLX07Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIHRhYmxlICAgICAgIDogZW52ZWxvcGUgYmFsYW5jZSwgMy4wIGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogdGhlb3IgcmFuZ2UgOiBbLTI0LDI0XSwgQ09ERV9CT09LX1NDRl9MQVYgPSAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBpbXBsZW0gcmFuZ2U6IHNhbWUgYnV0IG1hcHBlZCB0byBbLTEyLDEyXSwgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExID0gMTIgKi8KLS8qIHJhdyBzdGF0cyAgIDogZW52ZWxvcGVCYWxhbmNlXzExICBLSyAwMC0wMi0wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGRpcmVjdGlvbjogdGltZQotICAgY29udGVudHMgOiBjb2Rld29yZHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL2VudmVsb3BlQmFsYW5jZV8xMVQubWF0L3ZfbkJoZXgKLSAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KLQotY29uc3QgSU5UIGJvb2tTYnJFbnZCYWxhbmNlQzExVFsyNV0gPQotewotICAweDAwMDAxRkYyLCAweDAwMDAxRkYzLCAweDAwMDAxRkY0LCAweDAwMDAxRkY1LCAweDAwMDAxRkY2LCAweDAwMDAxRkY3LCAweDAwMDAxRkY4LCAweDAwMDAwRkY4LAotICAweDAwMDAwMEZFLCAweDAwMDAwMDdFLCAweDAwMDAwMDBFLCAweDAwMDAwMDA2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAyLCAweDAwMDAwMDFFLCAweDAwMDAwMDNFLAotICAweDAwMDAwMUZFLCAweDAwMDAxRkY5LCAweDAwMDAxRkZBLCAweDAwMDAxRkZCLCAweDAwMDAxRkZDLCAweDAwMDAxRkZELCAweDAwMDAxRkZFLCAweDAwMDAzRkZFLAotICAweDAwMDAzRkZGCi19OwotCi0KLS8qIGRpcmVjdGlvbjogdGltZQotICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZUJhbGFuY2VfMTFULm1hdC92X25MaGV4Ci0gICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCi0KLWNvbnN0IFVDSEFSIGJvb2tTYnJFbnZCYWxhbmNlTDExVFsyNV0gPQotewotICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBDLCAweDA4LCAweDA3LCAweDA0LCAweDAzLCAweDAxLCAweDAyLCAweDA1LCAweDA2LAotICAweDA5LCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBFLCAweDBFCi19OwotCi0KLS8qIGRpcmVjdGlvbjogZnJlcQotICAgY29udGVudHMgOiBjb2Rld29yZHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL2VudmVsb3BlQmFsYW5jZV8xMUYubWF0L3ZfbkJoZXgKLSAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KLQotY29uc3QgSU5UIGJvb2tTYnJFbnZCYWxhbmNlQzExRlsyNV0gPQotewotICAweDAwMDAxRkY3LCAweDAwMDAxRkY4LCAweDAwMDAxRkY5LCAweDAwMDAxRkZBLCAweDAwMDAxRkZCLCAweDAwMDAzRkY4LCAweDAwMDAzRkY5LCAweDAwMDAwN0ZDLAotICAweDAwMDAwMEZFLCAweDAwMDAwMDdFLCAweDAwMDAwMDBFLCAweDAwMDAwMDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDA2LCAweDAwMDAwMDFFLCAweDAwMDAwMDNFLAotICAweDAwMDAwMUZFLCAweDAwMDAwRkZBLCAweDAwMDAxRkY2LCAweDAwMDAzRkZBLCAweDAwMDAzRkZCLCAweDAwMDAzRkZDLCAweDAwMDAzRkZELCAweDAwMDAzRkZFLAotICAweDAwMDAzRkZGCi19OwotCi0KLS8qIGRpcmVjdGlvbjogZnJlcQotICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZUJhbGFuY2VfMTFGLm1hdC92X25MaGV4Ci0gICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCi0KLWNvbnN0IFVDSEFSIGJvb2tTYnJFbnZCYWxhbmNlTDExRlsyNV0gPQotewotICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBFLCAweDBFLCAweDBCLCAweDA4LCAweDA3LCAweDA0LCAweDAyLCAweDAxLCAweDAzLCAweDA1LCAweDA2LAotICAweDA5LCAweDBDLCAweDBELCAweDBFLCAweDBFLCAweDBFLCAweDBFLCAweDBFLCAweDBFCi19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdGFibGUgICAgICAgOiBub2lzZSBsZXZlbCwgMy4wIGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiB0aGVvciByYW5nZSA6IFstMjksMjldLCBDT0RFX0JPT0tfU0NGX0xBViAgID0gMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGltcGxlbSByYW5nZTogWy0zMSwzMV0sIENPREVfQk9PS19TQ0ZfTEFWMTEgPSAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogcmF3IHN0YXRzICAgOiBub2lzZUxldmVsXzExICBLSyAwMC0wMi0wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZGlyZWN0aW9uOiB0aW1lCi0gICBjb250ZW50cyA6IGNvZGV3b3JkcwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTIubQotICAgYnVpbHQgYnkgOiBGSCAwMC0wMi0wNCAqLwotCi1jb25zdCBJTlQgdl9IdWZmX05vaXNlTGV2ZWxDMTFUWzYzXSA9IHsKLSAgMHgwMDAwMUZDRSwgMHgwMDAwMUZDRiwgMHgwMDAwMUZEMCwgMHgwMDAwMUZEMSwgMHgwMDAwMUZEMiwgMHgwMDAwMUZEMywgMHgwMDAwMUZENCwgMHgwMDAwMUZENSwKLSAgMHgwMDAwMUZENiwgMHgwMDAwMUZENywgMHgwMDAwMUZEOCwgMHgwMDAwMUZEOSwgMHgwMDAwMUZEQSwgMHgwMDAwMUZEQiwgMHgwMDAwMUZEQywgMHgwMDAwMUZERCwKLSAgMHgwMDAwMUZERSwgMHgwMDAwMUZERiwgMHgwMDAwMUZFMCwgMHgwMDAwMUZFMSwgMHgwMDAwMUZFMiwgMHgwMDAwMUZFMywgMHgwMDAwMUZFNCwgMHgwMDAwMUZFNSwKLSAgMHgwMDAwMUZFNiwgMHgwMDAwMUZFNywgMHgwMDAwMDdGMiwgMHgwMDAwMDBGRCwgMHgwMDAwMDAzRSwgMHgwMDAwMDAwRSwgMHgwMDAwMDAwNiwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAwMiwgMHgwMDAwMDAxRSwgMHgwMDAwMDBGQywgMHgwMDAwMDNGOCwgMHgwMDAwMUZDQywgMHgwMDAwMUZFOCwgMHgwMDAwMUZFOSwgMHgwMDAwMUZFQSwKLSAgMHgwMDAwMUZFQiwgMHgwMDAwMUZFQywgMHgwMDAwMUZDRCwgMHgwMDAwMUZFRCwgMHgwMDAwMUZFRSwgMHgwMDAwMUZFRiwgMHgwMDAwMUZGMCwgMHgwMDAwMUZGMSwKLSAgMHgwMDAwMUZGMiwgMHgwMDAwMUZGMywgMHgwMDAwMUZGNCwgMHgwMDAwMUZGNSwgMHgwMDAwMUZGNiwgMHgwMDAwMUZGNywgMHgwMDAwMUZGOCwgMHgwMDAwMUZGOSwKLSAgMHgwMDAwMUZGQSwgMHgwMDAwMUZGQiwgMHgwMDAwMUZGQywgMHgwMDAwMUZGRCwgMHgwMDAwMUZGRSwgMHgwMDAwM0ZGRSwgMHgwMDAwM0ZGRgotfTsKLQotCi0vKiBkaXJlY3Rpb246IHRpbWUKLSAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTIubQotICAgYnVpbHQgYnkgOiBGSCAwMC0wMi0wNCAqLwotCi1jb25zdCBVQ0hBUiB2X0h1ZmZfTm9pc2VMZXZlbEwxMVRbNjNdID0gewotICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELAotICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELAotICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELAotICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBCLCAweDAwMDAwMDA4LCAweDAwMDAwMDA2LCAweDAwMDAwMDA0LCAweDAwMDAwMDAzLCAweDAwMDAwMDAxLAotICAweDAwMDAwMDAyLCAweDAwMDAwMDA1LCAweDAwMDAwMDA4LCAweDAwMDAwMDBBLCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELAotICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELAotICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELAotICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBFLCAweDAwMDAwMDBFCi19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdGFibGUgICAgICAgOiBub2lzZSBiYWxhbmNlLCAzLjAgZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiB0aGVvciByYW5nZSA6IFstMjQsMjRdLCBDT0RFX0JPT0tfU0NGX0xBViA9IDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGltcGxlbSByYW5nZTogc2FtZSBidXQgbWFwcGVkIHRvIFstMTIsMTJdLCBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTEgPSAxMiAqLwotLyogcmF3IHN0YXRzICAgOiBub2lzZUJhbGFuY2VfMTEgIEtLIDAwLTAyLTAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZGlyZWN0aW9uOiB0aW1lCi0gICBjb250ZW50cyA6IGNvZGV3b3JkcwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vbm9pc2VCYWxhbmNlXzExLm1hdC92X25CaGV4Ci0gICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCi0KLWNvbnN0IElOVCBib29rU2JyTm9pc2VCYWxhbmNlQzExVFsyNV0gPQotewotICAweDAwMDAwMEVDLCAweDAwMDAwMEVELCAweDAwMDAwMEVFLCAweDAwMDAwMEVGLCAweDAwMDAwMEYwLCAweDAwMDAwMEYxLCAweDAwMDAwMEYyLCAweDAwMDAwMEYzLAotICAweDAwMDAwMEY0LCAweDAwMDAwMEY1LCAweDAwMDAwMDFDLCAweDAwMDAwMDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDA2LCAweDAwMDAwMDNBLCAweDAwMDAwMEY2LAotICAweDAwMDAwMEY3LCAweDAwMDAwMEY4LCAweDAwMDAwMEY5LCAweDAwMDAwMEZBLCAweDAwMDAwMEZCLCAweDAwMDAwMEZDLCAweDAwMDAwMEZELCAweDAwMDAwMEZFLAotICAweDAwMDAwMEZGCi19OwotCi0KLS8qIGRpcmVjdGlvbjogdGltZQotICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9ub2lzZUJhbGFuY2VfMTEubWF0L3ZfbkxoZXgKLSAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KLQotY29uc3QgVUNIQVIgYm9va1Nick5vaXNlQmFsYW5jZUwxMVRbMjVdID0KLXsKLSAgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwNSwgMHgwMiwgMHgwMSwgMHgwMywgMHgwNiwgMHgwOCwKLSAgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOAotfTsKLQotLyoKLSAgIHR1bmluZ1RhYmxlCi0qLwotY29uc3Qgc2JyVHVuaW5nVGFibGVfdCBzYnJUdW5pbmdUYWJsZVtdID0KLXsKLSAgLyogU29tZSBvZiB0aGUgbG93IGJpdHJhdGVzIGFyZSBjb21tZW50ZWQgb3V0IGhlcmUsIHRoaXMgaXMgYmVjYXVzZSB0aGUKLSAgICAgZW5jb2RlciBjb3VsZCBsb3NlIGZyYW1lcyBhdCB0aG9zZSBiaXRyYXRlcyBhbmQgdGhyb3cgYW4gZXJyb3IgYmVjYXVzZQotICAgICBpdCBoYXMgaW5zdWZmaWNpZW50IGJpdHMgdG8gZW5jb2RlIGZvciBzb21lIHRlc3QgaXRlbXMuCi0gICovCi0KLSAgLyoqKiBIRS1BQUMgc2VjdGlvbiAqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgc2Ysc2ZzcCxzZixzZnNwLG5uYixuZm8sc2FtbCxTTSxGUyovCi0KLSAgLyoqKiBtb25vICoqKi8KLQotICAvKiA4LzE2IGtIeiBkdWFsIHJhdGUgKi8KLSAgeyBDT0RFQ19BQUMsICAgODAwMCwgMTAwMDAsICAgODAwMCwgMSwgIDcsIDYsIDExLDEwLCAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LAotICB7IENPREVDX0FBQywgIDEwMDAwLCAxMjAwMCwgICA4MDAwLCAxLCAxMSwgNywgMTMsMTIsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sCi0gIHsgQ09ERUNfQUFDLCAgMTIwMDAsIDE2MDAxLCAgIDgwMDAsIDEsIDE0LDEwLCAxMywxMywgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwKLSAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMjQwMDAsICAgODAwMCwgMSwgMTQsMTAsIDE0LDE0LCAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBwbGFjZWJvICovCi0gIHsgQ09ERUNfQUFDLCAgMjQwMDAsIDMyMDAwLCAgIDgwMDAsIDEsIDE0LDEwLCAxNCwxNCwgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogcGxhY2VibyAqLwotICB7IENPREVDX0FBQywgIDMyMDAwLCA0ODAwMSwgICA4MDAwLCAxLCAxNCwxMSwgMTUsMTUsIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIHBsYWNlYm8gKi8gLyogYml0cmF0ZXMgaGlnaGVyIHRoYW4gNDgwMDAgbm90IHN1cHBvcnRlZCBieSBBQUMgY29yZSAqLwotCi0gIC8qIDExLzIyIGtIeiBkdWFsIHJhdGUgKi8KLSAgeyBDT0RFQ19BQUMsICAgODAwMCwgMTAwMDAsICAxMTAyNSwgMSwgIDUsIDQsICA2LCA2LCAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LAotICB7IENPREVDX0FBQywgIDEwMDAwLCAxMjAwMCwgIDExMDI1LCAxLCAgOCwgNSwgMTIsIDksIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sCi0gIHsgQ09ERUNfQUFDLCAgMTIwMDAsIDE2MDAwLCAgMTEwMjUsIDEsIDEyLCA4LCAxMywgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwKLSAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMjAwMDAsICAxMTAyNSwgMSwgMTIsIDgsIDEzLCA4LCAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBhdCBzdWNoICJoaWdoIiBiaXRyYXRlcyBpdCdzIGJldHRlciB0byB1cHNhbXBsZSB0aGUgaW5wdXQgKi8KLSAgeyBDT0RFQ19BQUMsICAyMDAwMCwgMjQwMDEsICAxMTAyNSwgMSwgMTMsIDksIDEzLCA4LCAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBzaWduYWwgYnkgYSBmYWN0b3Igb2YgMiBiZWZvcmUgc2VuZGluZyBpdCBpbnRvIHRoZSBlbmNvZGVyICovCi0gIHsgQ09ERUNfQUFDLCAgMjQwMDAsIDMyMDAwLCAgMTEwMjUsIDEsIDE0LDEwLCAxNCwgOSwgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogcGxhY2VibyAqLwotICB7IENPREVDX0FBQywgIDMyMDAwLCA0ODAwMCwgIDExMDI1LCAxLCAxNSwxMSwgMTUsMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIHBsYWNlYm8gKi8KLSAgeyBDT0RFQ19BQUMsICA0ODAwMCwgNjQwMDEsICAxMTAyNSwgMSwgMTUsMTEsIDE1LDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBwbGFjZWJvICovCi0KLSAgLyogMTIvMjQga0h6IGR1YWwgcmF0ZSAqLwotICB7IENPREVDX0FBQywgICA4MDAwLCAxMDAwMCwgIDEyMDAwLCAxLCAgNCwgMywgIDYsIDYsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6ICA4IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDEwMDAwLCAxMjAwMCwgIDEyMDAwLCAxLCAgNywgNCwgMTEsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDEwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDEyMDAwLCAxNjAwMCwgIDEyMDAwLCAxLCAxMSwgNywgMTIsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDEyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDE2MDAwLCAyMDAwMCwgIDEyMDAwLCAxLCAxMSwgNywgMTIsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDE2IGtiaXQvcyAqLyAvKiBhdCBzdWNoICJoaWdoIiBiaXRyYXRlcyBpdCdzIGJldHRlciB0byB1cHNhbXBsZSB0aGUgaW5wdXQgKi8KLSAgeyBDT0RFQ19BQUMsICAyMDAwMCwgMjQwMDEsICAxMjAwMCwgMSwgMTIsIDgsIDEyLCA4LCAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8gLyogc2lnbmFsIGJ5IGEgZmFjdG9yIG9mIDIgYmVmb3JlIHNlbmRpbmcgaXQgaW50byB0aGUgZW5jb2RlciAqLwotICB7IENPREVDX0FBQywgIDI0MDAwLCAzMjAwMCwgIDEyMDAwLCAxLCAxMywgOSwgMTMsIDksIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIHBsYWNlYm8gKi8KLSAgeyBDT0RFQ19BQUMsICAzMjAwMCwgNDgwMDAsICAxMjAwMCwgMSwgMTQsMTAsIDE0LDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBwbGFjZWJvICovCi0gIHsgQ09ERUNfQUFDLCAgNDgwMDAsIDY0MDAxLCAgMTIwMDAsIDEsIDE0LDExLCAxNSwxMSwgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogcGxhY2VibyAqLwotCi0gIC8qIDE2LzMyIGtIeiBkdWFsIHJhdGUgKi8KLSAgeyBDT0RFQ19BQUMsICAgODAwMCwgMTAwMDAsICAxNjAwMCwgMSwgIDEsIDEsIDAsIDAsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAgOCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAxMDAwMCwgMTIwMDAsICAxNjAwMCwgMSwgIDIsIDEsIDYsIDAsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAxMCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAxMjAwMCwgMTYwMDAsICAxNjAwMCwgMSwgIDQsIDIsIDYsIDAsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAxMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMTgwMDAsICAxNjAwMCwgMSwgIDQsIDIsIDgsIDMsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAxNiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAxODAwMCwgMjIwMDAsICAxNjAwMCwgMSwgIDYsIDUsMTEsIDcsICAyLCAwLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyMjAwMCwgMjgwMDAsICAxNjAwMCwgMSwgMTAsIDksMTIsIDgsICAyLCAwLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzYwMDAsICAxNjAwMCwgMSwgMTIsMTIsMTMsMTMsICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAzNjAwMCwgNDQwMDAsICAxNjAwMCwgMSwgMTQsMTQsMTMsMTMsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA0NDAwMCwgNjQwMDEsICAxNjAwMCwgMSwgMTQsMTQsMTMsMTMsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KLQotICAvKiAyMi4wNS80NC4xIGtIeiBkdWFsIHJhdGUgKi8KLSAgLyogeyBDT0RFQ19BQUMsICAgODAwMCwgMTEzNjksICAyMjA1MCwgMSwgIDEsIDEsIDEsIDEsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAqLyAvKiBub21pbmFsOiAgOCBrYml0L3MgKi8gICAvKiBlbmNvZGVyIGNhbiBub3Qgd29yayBzdGFibGUgYXQgdGhpcyBleHRyZW1lbHkgbG93IGJpdHJhdGUgKi8KLSAgeyBDT0RFQ19BQUMsICAxMTM2OSwgMTYwMDAsICAyMjA1MCwgMSwgIDMsIDEsIDQsIDQsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAxMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMTgwMDAsICAyMjA1MCwgMSwgIDMsIDEsIDUsIDQsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAxNiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAxODAwMCwgMjIwMDAsICAyMjA1MCwgMSwgIDQsIDQsIDgsIDUsICAyLCAwLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyMjAwMCwgMjgwMDAsICAyMjA1MCwgMSwgIDcsIDYsIDgsIDYsICAyLCAwLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzYwMDAsICAyMjA1MCwgMSwgMTAsMTAsIDksIDksICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAzNjAwMCwgNDQwMDAsICAyMjA1MCwgMSwgMTEsMTEsMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA0NDAwMCwgNjQwMDEsICAyMjA1MCwgMSwgMTMsMTMsMTIsMTIsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KLQotICAvKiAyNC80OCBrSHogZHVhbCByYXRlICovCi0gIC8qIHsgQ09ERUNfQUFDLCAgIDgwMDAsIDEyMDAwLCAgMjQwMDAsIDEsICAxLCAxLCAxLCAxLCAgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgKi8gLyogbm9taW5hbDogIDgga2JpdC9zICovICAgLyogZW5jb2RlciBjYW4gbm90IHdvcmsgc3RhYmxlIGF0IHRoaXMgZXh0cmVtZWx5IGxvdyBiaXRyYXRlICovCi0gIHsgQ09ERUNfQUFDLCAgMTIwMDAsIDE2MDAwLCAgMjQwMDAsIDEsICAzLCAxLCA0LCA0LCAgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMTIga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMTYwMDAsIDE4MDAwLCAgMjQwMDAsIDEsICAzLCAxLCA1LCA0LCAgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMTYga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMTgwMDAsIDIyMDAwLCAgMjQwMDAsIDEsICA0LCAzLCA4LCA1LCAgMiwgMCwgNiwgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogMjAga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMjIwMDAsIDI4MDAwLCAgMjQwMDAsIDEsICA3LCA2LCA4LCA2LCAgMiwgMCwgNiwgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogMjQga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMjgwMDAsIDM2MDAwLCAgMjQwMDAsIDEsIDEwLDEwLCA5LCA5LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMzYwMDAsIDQ0MDAwLCAgMjQwMDAsIDEsIDExLDExLDEwLDEwLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogNDAga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNDQwMDAsIDY0MDAxLCAgMjQwMDAsIDEsIDEzLDEzLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogNDgga2JpdC9zICovCi0KLSAgLyogMzIvNjQga0h6IGR1YWwgcmF0ZSAqLyAgLyogcGxhY2VibyBzZXR0aW5ncyAqLwotICB7IENPREVDX0FBQywgICAyNDAwMCwgMzYwMDAsIDMyMDAwLCAxLCAgNCwgNCwgNCwgNCwgIDIsIDAsIDMsIFNCUl9NT05PLCAzIH0sIC8qIGxvd2VzdCByYW5nZSAgKi8KLSAgeyBDT0RFQ19BQUMsICAgMzYwMDAsIDYwMDAwLCAzMjAwMCwgMSwgIDcsIDcsIDYsIDYsICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBsb3dlc3QgcmFuZ2UgKi8KLSAgeyBDT0RFQ19BQUMsICAgNjAwMDAsIDcyMDAwLCAzMjAwMCwgMSwgIDksIDksIDgsIDgsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBsb3cgcmFuZ2UgKi8KLSAgeyBDT0RFQ19BQUMsICAgNzIwMDAsMTAwMDAwLCAzMjAwMCwgMSwgMTEsMTEsMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBTQlIgc3dlZXQgc3BvdCAqLwotICB7IENPREVDX0FBQywgIDEwMDAwMCwxNjAwMDEsIDMyMDAwLCAxLCAxMywxMywxMSwxMSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIGJhY2t3YXJkcyBjb21wYXRpYmxlICovCi0KLSAgLyogNDQuMS84OC4yIGtIeiBkdWFsIHJhdGUgKi8gIC8qIHBsYWNlYm8gc2V0dGluZ3MgKi8KLSAgeyBDT0RFQ19BQUMsICAgMjQwMDAsIDM2MDAwLCA0NDEwMCwgMSwgIDQsIDQsIDQsIDQsICAyLCAwLCAzLCBTQlJfTU9OTywgMyB9LCAvKiBsb3dlc3QgcmFuZ2UgKG11bHRpY2hhbm5lbCByZWFyKSAqLwotICB7IENPREVDX0FBQywgICAzNjAwMCwgNjAwMDAsIDQ0MTAwLCAxLCAgNywgNywgNiwgNiwgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCi0gIHsgQ09ERUNfQUFDLCAgIDYwMDAwLCA3MjAwMCwgNDQxMDAsIDEsICA5LCA5LCA4LCA4LCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbG93IHJhbmdlICovCi0gIHsgQ09ERUNfQUFDLCAgIDcyMDAwLDEwMDAwMCwgNDQxMDAsIDEsIDExLDExLDEwLDEwLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogU0JSIHN3ZWV0IHNwb3QgKi8KLSAgeyBDT0RFQ19BQUMsICAxMDAwMDAsMTYwMDAxLCA0NDEwMCwgMSwgMTMsMTMsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLwotCi0gIC8qIDQ4Lzk2IGtIeiBkdWFsIHJhdGUgKi8gIC8qIG5vdCB5ZXQgZmluYWxseSB0dW5lZCAqLwotICB7IENPREVDX0FBQywgICAzMjAwMCwgMzYwMDAsIDQ4MDAwLCAxLCAgNCwgNCwgOSwgOSwgIDIsIDAsIDMsIFNCUl9NT05PLCAzIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCi0gIHsgQ09ERUNfQUFDLCAgIDM2MDAwLCA2MDAwMCwgNDgwMDAsIDEsICA3LCA3LDEwLDEwLCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogNDAgKi8KLSAgeyBDT0RFQ19BQUMsICAgNjAwMDAsIDcyMDAwLCA0ODAwMCwgMSwgIDksIDksMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA2NCAqLwotICB7IENPREVDX0FBQywgICA3MjAwMCwxMDAwMDAsIDQ4MDAwLCAxLCAxMSwxMSwxMSwxMSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDgwICovCi0gIHsgQ09ERUNfQUFDLCAgMTAwMDAwLDE2MDAwMSwgNDgwMDAsIDEsIDEzLDEzLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogMTI4ICovCi0KLSAgLyoqKiBzdGVyZW8gKioqLwotICAvKiAwOC8xNiBrSHogZHVhbCByYXRlICovCi0gIHsgQ09ERUNfQUFDLCAgMTYwMDAsIDI0MDAwLCAgIDgwMDAsIDIsICA2LCA2LCAgOSwgNywgMSwgMCwtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbm9taW5hbDogMjAga2JpdC9zICovIC8qIHBsYWNlYm8gKi8KLSAgeyBDT0RFQ19BQUMsICAyNDAwMCwgMjgwMDAsICAgODAwMCwgMiwgIDksIDksIDExLCA5LCAxLCAwLC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzYwMDAsICAgODAwMCwgMiwgMTEsIDksIDExLCA5LCAyLCAwLC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAzNjAwMCwgNDQwMDAsICAgODAwMCwgMiwgMTMsMTEsIDEzLDExLCAyLCAwLC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA0NDAwMCwgNTIwMDAsICAgODAwMCwgMiwgMTQsMTIsIDEzLDEyLCAyLCAwLC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA1MjAwMCwgNjAwMDAsICAgODAwMCwgMiwgMTQsMTQsIDEzLDEzLCAzLCAwLC0zLCBTQlJfU1dJVENIX0xSQywgMSB9LCAvKiBub21pbmFsOiA1NiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA2MDAwMCwgNzYwMDAsICAgODAwMCwgMiwgMTQsMTQsIDEzLDEzLCAzLCAwLC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA2NCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA3NjAwMCwxMjgwMDEsICAgODAwMCwgMiwgMTQsMTQsIDEzLDEzLCAzLCAwLC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA4MCBrYml0L3MgKi8KLQotICAvKiAxMS8yMiBrSHogZHVhbCByYXRlICovCi0gIHsgQ09ERUNfQUFDLCAgMTYwMDAsIDI0MDAwLCAgMTEwMjUsIDIsICA3LCA1LCA5LCA3LCAgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLyAvKiBwbGFjZWJvICovCi0gIHsgQ09ERUNfQUFDLCAgMjQwMDAsIDI4MDAwLCAgMTEwMjUsIDIsIDEwLCA4LDEwLCA4LCAgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIG5vbWluYWw6IDI0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDI4MDAwLCAzNjAwMCwgIDExMDI1LCAyLCAxMiwgOCwxMiwgOCwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAzNjAwMCwgNDQwMDAsICAxMTAyNSwgMiwgMTMsIDksMTMsIDksICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDAga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNDQwMDAsIDUyMDAwLCAgMTEwMjUsIDIsIDE0LDExLDEzLDExLCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDUyMDAwLCA2MDAwMCwgIDExMDI1LCAyLCAxNSwxNSwxMywxMywgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMSB9LCAvKiBub21pbmFsOiA1NiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA2MDAwMCwgNzYwMDAsICAxMTAyNSwgMiwgMTUsMTUsMTMsMTMsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogNjQga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNzYwMDAsMTI4MDAxLCAgMTEwMjUsIDIsIDE1LDE1LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDgwIGtiaXQvcyAqLwotCi0gIC8qIDEyLzI0IGtIeiBkdWFsIHJhdGUgKi8KLSAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMjQwMDAsICAxMjAwMCwgMiwgIDYsIDQsIDksIDcsICAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbm9taW5hbDogMjAga2JpdC9zICovIC8qIHBsYWNlYm8gKi8KLSAgeyBDT0RFQ19BQUMsICAyNDAwMCwgMjgwMDAsICAxMjAwMCwgMiwgIDksIDcsMTAsIDgsICAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbm9taW5hbDogMjQga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMjgwMDAsIDM2MDAwLCAgMTIwMDAsIDIsIDExLCA3LDEyLCA4LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgIDEyMDAwLCAyLCAxMiwgOSwxMiwgOSwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA0NDAwMCwgNTIwMDAsICAxMjAwMCwgMiwgMTMsMTIsMTMsMTIsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDgga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNTIwMDAsIDYwMDAwLCAgMTIwMDAsIDIsIDE0LDE0LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDYwMDAwLCA3NjAwMCwgIDEyMDAwLCAyLCAxNCwxNCwxMywxMywgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA2NCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA3NjAwMCwxMjgwMDEsICAxMjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCi0KLSAgLyogMTYvMzIga0h6IGR1YWwgcmF0ZSAqLwotICB7IENPREVDX0FBQywgIDE2MDAwLCAyNDAwMCwgIDE2MDAwLCAyLCAgNCwgMiwgMSwgMCwgIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyNDAwMCwgMjgwMDAsICAxNjAwMCwgMiwgIDgsIDcsMTAsIDgsICAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbm9taW5hbDogMjQga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMjgwMDAsIDM2MDAwLCAgMTYwMDAsIDIsIDEwLCA5LDEyLDExLCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgIDE2MDAwLCAyLCAxMywxMywxMywxMywgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA0NDAwMCwgNTIwMDAsICAxNjAwMCwgMiwgMTQsMTQsMTMsMTMsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDgga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNTIwMDAsIDYwMDAwLCAgMTYwMDAsIDIsIDE0LDE0LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDYwMDAwLCA3NjAwMCwgIDE2MDAwLCAyLCAxNCwxNCwxMywxMywgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA2NCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA3NjAwMCwxMjgwMDEsICAxNjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCi0KLSAgLyogMjIuMDUvNDQuMSBrSHogZHVhbCByYXRlICovCi0gIHsgQ09ERUNfQUFDLCAgMTYwMDAsIDI0MDAwLCAgMjIwNTAsIDIsICAyLCAxLCAxLCAwLCAgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDI0MDAwLCAyODAwMCwgIDIyMDUwLCAyLCAgNSwgNCwgNiwgNSwgIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzIwMDAsICAyMjA1MCwgMiwgIDUsIDQsIDgsIDcsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMjgga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMzIwMDAsIDM2MDAwLCAgMjIwNTAsIDIsICA3LCA2LCA4LCA3LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgIDIyMDUwLCAyLCAxMCwxMCwgOSwgOSwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA0NDAwMCwgNTIwMDAsICAyMjA1MCwgMiwgMTIsMTIsIDksIDksICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDgga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNTIwMDAsIDYwMDAwLCAgMjIwNTAsIDIsIDEzLDEzLDEwLDEwLCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDYwMDAwLCA3NjAwMCwgIDIyMDUwLCAyLCAxNCwxNCwxMiwxMiwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA2NCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA3NjAwMCwxMjgwMDEsICAyMjA1MCwgMiwgMTQsMTQsMTIsMTIsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCi0KLSAgLyogMjQvNDgga0h6IGR1YWwgcmF0ZSAqLwotICB7IENPREVDX0FBQywgIDE2MDAwLCAyNDAwMCwgIDI0MDAwLCAyLCAgMiwgMSwgMSwgMCwgIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyNDAwMCwgMjgwMDAsICAyNDAwMCwgMiwgIDUsIDUsIDYsIDYsICAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbm9taW5hbDogMjQga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMjgwMDAsIDM2MDAwLCAgMjQwMDAsIDIsICA3LCA2LCA4LCA3LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgIDI0MDAwLCAyLCAxMCwxMCwgOSwgOSwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA0NDAwMCwgNTIwMDAsICAyNDAwMCwgMiwgMTIsMTIsIDksIDksICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDgga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNTIwMDAsIDYwMDAwLCAgMjQwMDAsIDIsIDEzLDEzLDEwLDEwLCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDYwMDAwLCA3NjAwMCwgIDI0MDAwLCAyLCAxNCwxNCwxMiwxMiwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA2NCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA3NjAwMCwxMjgwMDEsICAyNDAwMCwgMiwgMTQsMTQsMTIsMTIsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCi0KLSAgLyogMzIvNjQga0h6IGR1YWwgcmF0ZSAqLyAgLyogcGxhY2VibyBzZXR0aW5ncyAqLwotICB7IENPREVDX0FBQywgICAzMjAwMCwgNjAwMDAsIDMyMDAwLCAyLCAgNCwgNCwgNCwgNCwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBsb3dlc3QgcmFuZ2UgKG11bHRpY2hhbm5lbCByZWFyKSAqLwotICB7IENPREVDX0FBQywgICA2MDAwMCwgODAwMDAsIDMyMDAwLCAyLCAgNywgNywgNiwgNiwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBsb3dlc3QgcmFuZ2UgKG11bHRpY2hhbm5lbCByZWFyKSAqLwotICB7IENPREVDX0FBQywgICA4MDAwMCwxMTIwMDAsIDMyMDAwLCAyLCAgOSwgOSwgOCwgOCwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBsb3cgcmFuZ2UgKi8KLSAgeyBDT0RFQ19BQUMsICAxMTIwMDAsMTQ0MDAwLCAzMjAwMCwgMiwgMTEsMTEsMTAsMTAsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogU0JSIHN3ZWV0IHNwb3QgKi8KLSAgeyBDT0RFQ19BQUMsICAxNDQwMDAsMjU2MDAxLCAzMjAwMCwgMiwgMTMsMTMsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogYmFja3dhcmRzIGNvbXBhdGlibGUgKi8KLQotICAvKiA0NC4xLzg4LjIga0h6IGR1YWwgcmF0ZSAqLyAgLyogcGxhY2VibyBzZXR0aW5ncyAqLwotICB7IENPREVDX0FBQywgICAzMjAwMCwgNjAwMDAsIDQ0MTAwLCAyLCAgNCwgNCwgNCwgNCwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBsb3dlc3QgcmFuZ2UgKG11bHRpY2hhbm5lbCByZWFyKSAqLwotICB7IENPREVDX0FBQywgICA2MDAwMCwgODAwMDAsIDQ0MTAwLCAyLCAgNywgNywgNiwgNiwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBsb3dlc3QgcmFuZ2UgKG11bHRpY2hhbm5lbCByZWFyKSAqLwotICB7IENPREVDX0FBQywgICA4MDAwMCwxMTIwMDAsIDQ0MTAwLCAyLCAgOSwgOSwgOCwgOCwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBsb3cgcmFuZ2UgKi8KLSAgeyBDT0RFQ19BQUMsICAxMTIwMDAsMTQ0MDAwLCA0NDEwMCwgMiwgMTEsMTEsMTAsMTAsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogU0JSIHN3ZWV0IHNwb3QgKi8KLSAgeyBDT0RFQ19BQUMsICAxNDQwMDAsMjU2MDAxLCA0NDEwMCwgMiwgMTMsMTMsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogYmFja3dhcmRzIGNvbXBhdGlibGUgKi8KLQotICAvKiA0OC85NiBrSHogZHVhbCByYXRlICovICAvKiBub3QgeWV0IGZpbmFsbHkgdHVuZWQgKi8KLSAgeyBDT0RFQ19BQUMsICAgMzYwMDAsIDYwMDAwLCA0ODAwMCwgMiwgIDQsIDQsIDksIDksICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbG93ZXN0IHJhbmdlIChtdWx0aWNoYW5uZWwgcmVhcikgKi8KLSAgeyBDT0RFQ19BQUMsICAgNjAwMDAsIDgwMDAwLCA0ODAwMCwgMiwgIDcsIDcsIDksIDksICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNjQgKi8KLSAgeyBDT0RFQ19BQUMsICAgODAwMDAsMTEyMDAwLCA0ODAwMCwgMiwgIDksIDksMTAsMTAsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogOTYgKi8KLSAgeyBDT0RFQ19BQUMsICAxMTIwMDAsMTQ0MDAwLCA0ODAwMCwgMiwgMTEsMTEsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogMTI4ICovCi0gIHsgQ09ERUNfQUFDLCAgMTQ0MDAwLDI1NjAwMSwgNDgwMDAsIDIsIDEzLDEzLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDE5MiAqLwotCi0KLSAgLyoqIEFBQyBMT1cgREVMQVkgU0VDVElPTiAqKi8KLQotICAvKiAyNCBrSHogZHVhbCByYXRlIC0gMTJrSHogc2luZ2xlcmF0ZSBpcyBub3QgYWxsb3dlZCAoZGVhY3RpdmF0ZWQgaW4gRkRLc2JyRW5jX0lzU2JyU2V0dGluZ0F2YWlsKCkpICovCi0gIHsgQ09ERUNfQUFDTEQsICAgODAwMCwgMzIwMDAsICAxMjAwMCwgMSwgIDEsIDEsIDAsIDAsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAgOCBrYml0L3MgKi8KLQotICAvKioqIG1vbm8gKioqLwotICAvKiAxNi8zMiBrSHogZHVhbCByYXRlIG5vdCB5ZXQgdHVuZWQgLT5hbGIgY29waWVkIGZyb20gbm9uIExEIHRhYmxlcyovCi0gIHsgQ09ERUNfQUFDTEQsICAxNjAwMCwgMTgwMDAsICAxNjAwMCwgMSwgIDQsIDUsIDksIDcsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAxNiBrYml0L3Mgd3JyOiB0dW5lZCAqLwotICB7IENPREVDX0FBQ0xELCAgMTgwMDAsIDIyMDAwLCAgMTYwMDAsIDEsICA3LCA3LDEyLDEyLCAgMSwgNiwgOSwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMjAga2JpdC9zIHdycjogdHVuZWQgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDIyMDAwLCAyODAwMCwgIDE2MDAwLCAxLCAgNiwgNiwgOSwgOSwgIDIsIDMsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDI0IGtiaXQvcyB3cnI6IHR1bmVkICovCi0gIHsgQ09ERUNfQUFDTEQsICAyODAwMCwgMzYwMDAsICAxNjAwMCwgMSwgIDgsIDgsMTIsIDcsICAyLCA5LDEyLCBTQlJfTU9OTywgMyB9LCAvKiBqZ3I6IHNwZWNpYWwgKi8gLyogd3JyOiB0dW5lZCAqLwotICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDQ0MDAwLCAgMTYwMDAsIDEsIDEwLDE0LDEyLDEzLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogNDAga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA0NDAwMCwgNjQwMDEsICAxNjAwMCwgMSwgMTEsMTQsMTMsMTMsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KLQotICAvKiAyMi4wNS80NC4xIGtIeiBkdWFsIHJhdGUgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDE4MDAwLCAyMjAwMCwgIDIyMDUwLCAxLCAgNCwgNCwgNSwgNSwgIDIsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgMjIwMDAsIDI4MDAwLCAgMjIwNTAsIDEsICA1LCA1LCA2LCA2LCAgMiwgMCwgNiwgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogMjQga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICAyODAwMCwgMzYwMDAsICAyMjA1MCwgMSwgIDcsIDgsIDgsIDgsICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDM2MDAwLCA0NDAwMCwgIDIyMDUwLCAxLCAgOSwgOSwgOSwgOSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNDQwMDAsIDUyMDAwLCAgMjIwNTAsIDEsIDEyLDExLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogNDgga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA1MjAwMCwgNjQwMDEsICAyMjA1MCwgMSwgMTMsMTEsMTEsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA1NiBrYml0L3MgKi8KLQotICAvKiAyNC80OCBrSHogZHVhbCByYXRlICovCi0gIHsgQ09ERUNfQUFDTEQsICAyMDAwMCwgMjIwMDAsICAyNDAwMCwgMSwgIDMsIDQsIDgsIDgsICAyLCAwLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDIyMDAwLCAyODAwMCwgIDI0MDAwLCAxLCAgMywgOCwgOCwgNywgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDI0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgMjgwMDAsIDM2MDAwLCAgMjQwMDAsIDEsICA0LCA4LCA4LCA3LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICAzNjAwMCwgNTYwMDAsICAyNDAwMCwgMSwgIDgsIDksIDksIDgsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDU2MDAwLCA2NDAwMSwgIDI0MDAwLCAxLCAxMywxMSwxMSwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLwotCi0gIC8qIDMyLzY0IGtIeiBkdWFsIHJhdGUgKi8gIC8qIHBsYWNlYm8gc2V0dGluZ3MgKi8gIC8qamdyOiBuZXcsIGNvcHkgZnJvbSBDT0RFQ19BQUMgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDI0MDAwLCAzNjAwMCwgIDMyMDAwLCAxLCAgNCwgNCwgNCwgNCwgIDIsIDAsIDMsIFNCUl9NT05PLCAzIH0sIC8qIGxvd2VzdCByYW5nZSAgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDM2MDAwLCA2MDAwMCwgIDMyMDAwLCAxLCAgNywgNywgNiwgNiwgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIGxvd2VzdCByYW5nZSAqLwotICB7IENPREVDX0FBQ0xELCAgNjAwMDAsIDcyMDAwLCAgMzIwMDAsIDEsICA5LCA5LCA4LCA4LCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbG93IHJhbmdlICovCi0gIHsgQ09ERUNfQUFDTEQsICA3MjAwMCwxMDAwMDAsICAzMjAwMCwgMSwgMTEsMTEsMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBTQlIgc3dlZXQgc3BvdCAqLwotICB7IENPREVDX0FBQ0xELCAxMDAwMDAsMTYwMDAxLCAgMzIwMDAsIDEsIDEzLDEzLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogYmFja3dhcmRzIGNvbXBhdGlibGUgKi8KLQotICAvKiA0NC84OCBrSHogZHVhbCByYXRlICovICAvKiBub3QgeWV0IGZpbmFsbHkgdHVuZWQgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDM2MDAwLCA2MDAwMCwgIDQ0MTAwLCAxLCAgOCwgNywgNiwgOSwgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDQwICovCi0gIHsgQ09ERUNfQUFDTEQsICA2MDAwMCwgNzIwMDAsICA0NDEwMCwgMSwgIDksIDksMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA2NCAqLwotICB7IENPREVDX0FBQ0xELCAgNzIwMDAsMTAwMDAwLCAgNDQxMDAsIDEsIDExLDExLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogODAgKi8KLSAgeyBDT0RFQ19BQUNMRCwgMTAwMDAwLDE2MDAwMSwgIDQ0MTAwLCAxLCAxMywxMywxMSwxMSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDEyOCAqLwotCi0gIC8qIDQ4Lzk2IGtIeiBkdWFsIHJhdGUgKi8gIC8qIDMyIGFuZCA0MGticHMgbGluZSB0dW5lZCBmb3IgZHVhbC1yYXRlIFNCUiAqLwotICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDYwMDAwLCAgNDgwMDAsIDEsICA0LCA3LCA0LCA0LCAgMiwgMCwgMywgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogNDAgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDYwMDAwLCA3MjAwMCwgIDQ4MDAwLCAxLCAgOSwgOSwxMCwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDY0ICovCi0gIHsgQ09ERUNfQUFDTEQsICA3MjAwMCwxMDAwMDAsICA0ODAwMCwgMSwgMTEsMTEsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA4MCAqLwotICB7IENPREVDX0FBQ0xELCAxMDAwMDAsMTYwMDAxLCAgNDgwMDAsIDEsIDEzLDEzLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogMTI4ICovCi0KLSAgLyoqKiBzdGVyZW8gKioqLwotICAvKiAxNi8zMiBrSHogZHVhbCByYXRlIG5vdCB5ZXQgdHVuZWQgLT5hbGIgY29waWVkIGZyb20gbm9uIExEIHRhYmxlcyovCi0gIHsgQ09ERUNfQUFDTEQsICAzMjAwMCwgMzYwMDAsICAxNjAwMCwgMiwgMTAsIDksMTIsMTEsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICAzNjAwMCwgNDQwMDAsICAxNjAwMCwgMiwgMTMsMTMsMTMsMTMsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDAga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA0NDAwMCwgNTIwMDAsICAxNjAwMCwgMiwgMTAsIDksMTEsIDksICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogdHVuZTEyIG5vbWluYWw6IDQ4IGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNTIwMDAsIDYwMDAwLCAgMTYwMDAsIDIsIDE0LDE0LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNjAwMDAsIDc2MDAwLCAgMTYwMDAsIDIsIDE0LDE0LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNzYwMDAsMTI4MDAxLCAgMTYwMDAsIDIsIDE0LDE0LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDgwIGtiaXQvcyAqLwotCi0gIC8qIDIyLjA1LzQ0LjEga0h6IGR1YWwgcmF0ZSAqLwotICB7IENPREVDX0FBQ0xELCAgMzIwMDAsIDM2MDAwLCAgMjIwNTAsIDIsICA1LCA0LCA3LCA2LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDQ0MDAwLCAgMjIwNTAsIDIsICA1LCA4LCA4LCA4LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNDQwMDAsIDUyMDAwLCAgMjIwNTAsIDIsICA3LDEwLCA4LCA4LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNTIwMDAsIDYwMDAwLCAgMjIwNTAsIDIsICA5LDExLCA5LCA5LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNjAwMDAsIDc2MDAwLCAgMjIwNTAsIDIsIDEwLDEyLDEwLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNzYwMDAsIDgyMDAwLCAgMjIwNTAsIDIsIDEyLDEyLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDgwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgODIwMDAsMTI4MDAxLCAgMjIwNTAsIDIsIDEzLDEyLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDgwIGtiaXQvcyAqLwotCi0gIC8qIDI0LzQ4IGtIeiBkdWFsIHJhdGUgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDMyMDAwLCAzNjAwMCwgIDI0MDAwLCAyLCAgNSwgNCwgNywgNiwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDM2MDAwLCA0NDAwMCwgIDI0MDAwLCAyLCAgNCwgOCwgOCwgOCwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDQ0MDAwLCA1MjAwMCwgIDI0MDAwLCAyLCAgNiwxMCwgOCwgOCwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDUyMDAwLCA2MDAwMCwgIDI0MDAwLCAyLCAgOSwxMSwgOSwgOSwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMSB9LCAvKiBub21pbmFsOiA1NiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDYwMDAwLCA3NjAwMCwgIDI0MDAwLCAyLCAxMSwxMiwxMCwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA2NCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDc2MDAwLCA4ODAwMCwgIDI0MDAwLCAyLCAxMiwxMywxMSwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA4MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDg4MDAwLDEyODAwMSwgIDI0MDAwLCAyLCAxMywxMywxMSwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA5MiBrYml0L3MgKi8KLQotICAvKiAzMi82NCBrSHogZHVhbCByYXRlICovICAvKiBwbGFjZWJvIHNldHRpbmdzICovIC8qamdyOiBuZXcsIGNvcHkgZnJvbSBDT0RFQ19BQUMgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDYwMDAwLCA4MDAwMCwgIDMyMDAwLCAyLCAgNywgNywgNiwgNiwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBsb3dlc3QgcmFuZ2UgKG11bHRpY2hhbm5lbCByZWFyKSAqLwotICB7IENPREVDX0FBQ0xELCAgODAwMDAsMTEyMDAwLCAgMzIwMDAsIDIsICA5LCA5LCA4LCA4LCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGxvdyByYW5nZSAqLwotICB7IENPREVDX0FBQ0xELCAxMTIwMDAsMTQ0MDAwLCAgMzIwMDAsIDIsIDExLDExLDEwLDEwLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIFNCUiBzd2VldCBzcG90ICovCi0gIHsgQ09ERUNfQUFDTEQsIDE0NDAwMCwyNTYwMDEsICAzMjAwMCwgMiwgMTMsMTMsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogYmFja3dhcmRzIGNvbXBhdGlibGUgKi8KLQotICAvKiA0NC4xLzg4LjIga0h6IGR1YWwgcmF0ZSAqLyAgLyogcGxhY2VibyBzZXR0aW5ncyAqLyAvKndycjogbmV3LCBjb3B5IGZyb20gQ09ERUNfQUFDICovCi0gIHsgQ09ERUNfQUFDTEQsICA2MDAwMCwgODAwMDAsICA0NDEwMCwgMiwgIDcsIDcsIDYsIDYsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbG93ZXN0IHJhbmdlIChtdWx0aWNoYW5uZWwgcmVhcikgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDgwMDAwLDExMjAwMCwgIDQ0MTAwLCAyLCAxMCwxMCwgOCwgOCwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBobG0gMTEtMDgtMjkgKi8KLSAgeyBDT0RFQ19BQUNMRCwgMTEyMDAwLDE0NDAwMCwgIDQ0MTAwLCAyLCAxMiwxMiwxMCwxMCwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBobG0gMTEtMDgtMjkgKi8KLSAgeyBDT0RFQ19BQUNMRCwgMTQ0MDAwLDI1NjAwMSwgIDQ0MTAwLCAyLCAxMywxMywxMSwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLwotCi0gIC8qIDQ4Lzk2IGtIeiBkdWFsIHJhdGUgKi8gIC8qIG5vdCB5ZXQgZmluYWxseSB0dW5lZCAqLyAvKndycjogbmV3LCBjb3B5IGZyb20gQ09ERUNfQUFDICovCi0gIHsgQ09ERUNfQUFDTEQsICA2MDAwMCwgODAwMDAsICA0ODAwMCwgMiwgIDcsIDcsMTAsMTAsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNjQgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDgwMDAwLDExMjAwMCwgIDQ4MDAwLCAyLCAgOSwgOSwxMCwxMCwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA5NiAqLwotICB7IENPREVDX0FBQ0xELCAxMTIwMDAsMTQ0MDAwLCAgNDgwMDAsIDIsIDExLDExLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDEyOCAqLwotICB7IENPREVDX0FBQ0xELCAxNDQwMDAsMTc2MDAwLCAgNDgwMDAsIDIsIDEyLDEyLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGhsbSAwOS0xMC0xOSAqLwotICB7IENPREVDX0FBQ0xELCAxNzYwMDAsMjU2MDAxLCAgNDgwMDAsIDIsIDEzLDEzLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGhsbSAwOS0xMC0xOSAqLwotCi19OwotCi1jb25zdCBpbnQgc2JyVHVuaW5nVGFibGVTaXplID0gc2l6ZW9mKHNiclR1bmluZ1RhYmxlKS9zaXplb2Yoc2JyVHVuaW5nVGFibGVbMF0pOwotCi1jb25zdCBwc1R1bmluZ1RhYmxlX3QgcHNUdW5pbmdUYWJsZVs0XSA9Ci17Ci0gIHsgIDgwMDAsICAyMjAwMCwgUFNFTkNfU1RFUkVPX0JBTkRTXzEwLCBQU0VOQ19ORU5WXzEsIEZMMkZYQ09OU1RfREJMKDMuMGYvNC4wZikgfSwKLSAgeyAyMjAwMCwgIDI4MDAwLCBQU0VOQ19TVEVSRU9fQkFORFNfMjAsIFBTRU5DX05FTlZfMSwgRkwyRlhDT05TVF9EQkwoMi4wZi80LjBmKSB9LAotICB7IDI4MDAwLCAgMzYwMDAsIFBTRU5DX1NURVJFT19CQU5EU18yMCwgUFNFTkNfTkVOVl8yLCBGTDJGWENPTlNUX0RCTCgxLjVmLzQuMGYpIH0sCi0gIHsgMzYwMDAsIDE2MDAwMSwgUFNFTkNfU1RFUkVPX0JBTkRTXzIwLCBQU0VOQ19ORU5WXzQsIEZMMkZYQ09OU1RfREJMKDEuMWYvNC4wZikgfSwKLX07Ci0KLQotLy9AfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9zYnJfcm9tLmggYi9saWJTQlJlbmMvc3JjL3Nicl9yb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhOTI0ZS4uMDAwMDAwMAotLS0gYS9saWJTQlJlbmMvc3JjL3Nicl9yb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyohCi1cZmlsZQotXGJyaWVmIERlY2xhcmF0aW9uIG9mIGNvbnN0YW50IHRhYmxlcwotIAotKi8KLSNpZm5kZWYgX19TQlJfUk9NX0gKLSNkZWZpbmUgX19TQlJfUk9NX0gKLQotI2luY2x1ZGUgInNicl9kZWYuaCIKLSNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgotCi0jaW5jbHVkZSAicHNfbWFpbi5oIgotCi0vKgotICBodWZmbWFuIHRhYmxlcwotKi8KLWV4dGVybiBjb25zdCBJTlQgICAgICAgICAgIHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwVFsxMjFdOwotZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgICAgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBUWzEyMV07Ci1leHRlcm4gY29uc3QgSU5UICAgICAgICAgICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMEZbMTIxXTsKLWV4dGVybiBjb25zdCBVQ0hBUiAgICAgICAgIHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwRlsxMjFdOwotZXh0ZXJuIGNvbnN0IElOVCAgICAgICAgICAgYm9va1NickVudkJhbGFuY2VDMTBUWzQ5XTsKLWV4dGVybiBjb25zdCBVQ0hBUiAgICAgICAgIGJvb2tTYnJFbnZCYWxhbmNlTDEwVFs0OV07Ci1leHRlcm4gY29uc3QgSU5UICAgICAgICAgICBib29rU2JyRW52QmFsYW5jZUMxMEZbNDldOwotZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgICAgYm9va1NickVudkJhbGFuY2VMMTBGWzQ5XTsKLWV4dGVybiBjb25zdCBJTlQgICAgICAgICAgIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExVFs2M107Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICAgICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMVRbNjNdOwotZXh0ZXJuIGNvbnN0IElOVCAgICAgICAgICAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGWzYzXTsKLWV4dGVybiBjb25zdCBVQ0hBUiAgICAgICAgIHZfSHVmZl9lbnZlbG9wZUxldmVsTDExRls2M107Ci1leHRlcm4gY29uc3QgSU5UICAgICAgICAgICBib29rU2JyRW52QmFsYW5jZUMxMVRbMjVdOwotZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgICAgYm9va1NickVudkJhbGFuY2VMMTFUWzI1XTsKLWV4dGVybiBjb25zdCBJTlQgICAgICAgICAgIGJvb2tTYnJFbnZCYWxhbmNlQzExRlsyNV07Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICAgICBib29rU2JyRW52QmFsYW5jZUwxMUZbMjVdOwotZXh0ZXJuIGNvbnN0IElOVCAgICAgICAgICAgdl9IdWZmX05vaXNlTGV2ZWxDMTFUWzYzXTsKLWV4dGVybiBjb25zdCBVQ0hBUiAgICAgICAgIHZfSHVmZl9Ob2lzZUxldmVsTDExVFs2M107Ci1leHRlcm4gY29uc3QgSU5UICAgICAgICAgICBib29rU2JyTm9pc2VCYWxhbmNlQzExVFsyNV07Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICAgICBib29rU2JyTm9pc2VCYWxhbmNlTDExVFsyNV07Ci0KLWV4dGVybiBjb25zdCBzYnJUdW5pbmdUYWJsZV90IHNiclR1bmluZ1RhYmxlW107Ci1leHRlcm4gY29uc3QgaW50IHNiclR1bmluZ1RhYmxlU2l6ZTsKLQotZXh0ZXJuIGNvbnN0IHBzVHVuaW5nVGFibGVfdCBwc1R1bmluZ1RhYmxlWzRdOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9zYnJlbmNfZnJlcV9zY2EuY3BwIGIvbGliU0JSZW5jL3NyYy9zYnJlbmNfZnJlcV9zY2EuY3BwCmluZGV4IDMwYmM1Y2EuLmM4NmUwNDcgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvc2JyZW5jX2ZyZXFfc2NhLmNwcAorKysgYi9saWJTQlJlbmMvc3JjL3NicmVuY19mcmVxX3NjYS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTIgKzkwLDE5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgZnJlcXVlbmN5IHNjYWxlICAKLSAgXGF1dGhvciBUb2JpYXMgQ2hhbHVwa2EKKyAgXGJyaWVmICBmcmVxdWVuY3kgc2NhbGUgJFJldmlzaW9uOiA5NTIyNSAkCiAqLwogCiAjaW5jbHVkZSAic2JyZW5jX2ZyZXFfc2NhLmgiCkBAIC05OCwxMiArMTE2LDEwIEBACiAvKiBTdG9wRnJlcSAqLwogc3RhdGljIElOVCBnZXRTdG9wRnJlcShJTlQgZnNDb3JlLCBjb25zdCBJTlQgc3RvcF9mcmVxKTsKIAotc3RhdGljIElOVCAgbnVtYmVyT2ZCYW5kcyhJTlQgYl9wX28sIElOVCBzdGFydCwgSU5UIHN0b3AsIEZJWFBfREJMIHdhcnBfZmFjdG9yKTsKLXN0YXRpYyB2b2lkIENhbGNCYW5kcyhJTlQgKiBkaWZmLCBJTlQgc3RhcnQgLCBJTlQgc3RvcCAsIElOVCBudW1fYmFuZHMpOwotc3RhdGljIElOVCAgbW9kaWZ5QmFuZHMoSU5UIG1heF9iYW5kLCBJTlQgKiBkaWZmLCBJTlQgbGVuZ3RoKTsKLXN0YXRpYyB2b2lkIGN1bVN1bShJTlQgc3RhcnRfdmFsdWUsIElOVCogZGlmZiwgSU5UIGxlbmd0aCwgVUNIQVIgICpzdGFydF9hZHJlc3MpOwotCi0KK3N0YXRpYyBJTlQgbnVtYmVyT2ZCYW5kcyhJTlQgYl9wX28sIElOVCBzdGFydCwgSU5UIHN0b3AsIEZJWFBfREJMIHdhcnBfZmFjdG9yKTsKK3N0YXRpYyB2b2lkIENhbGNCYW5kcyhJTlQgKmRpZmYsIElOVCBzdGFydCwgSU5UIHN0b3AsIElOVCBudW1fYmFuZHMpOworc3RhdGljIElOVCBtb2RpZnlCYW5kcyhJTlQgbWF4X2JhbmQsIElOVCAqZGlmZiwgSU5UIGxlbmd0aCk7CitzdGF0aWMgdm9pZCBjdW1TdW0oSU5UIHN0YXJ0X3ZhbHVlLCBJTlQgKmRpZmYsIElOVCBsZW5ndGgsIFVDSEFSICpzdGFydF9hZHJlc3MpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19nZXRTYnJTdGFydEZyZXFSQVcKQEAgLTExNSwyNCArMTMxLDIyIEBACiAgUmV0dXJuOgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUlOVAotRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVyAoSU5UIHN0YXJ0RnJlcSwgSU5UIGZzQ29yZSkKLXsKK0lOVCBGREtzYnJFbmNfZ2V0U2JyU3RhcnRGcmVxUkFXKElOVCBzdGFydEZyZXEsIElOVCBmc0NvcmUpIHsKICAgSU5UIHJlc3VsdDsKIAotICBpZiAoIHN0YXJ0RnJlcSA8IDAgfHwgc3RhcnRGcmVxID4gMTUpIHsKKyAgaWYgKHN0YXJ0RnJlcSA8IDAgfHwgc3RhcnRGcmVxID4gMTUpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KICAgLyogVXBkYXRlIHN0YXJ0RnJlcSBzdHJ1Y3QgKi8KICAgcmVzdWx0ID0gZ2V0U3RhcnRGcmVxKGZzQ29yZSwgc3RhcnRGcmVxKTsKIAotICByZXN1bHQgPSAocmVzdWx0Kihmc0NvcmU+PjUpKzEpPj4xOyAvKiAocmVzdWx0KmZzU0JSL1FNRmJhbmRzKzEpPj4xOyAqLworICByZXN1bHQgPQorICAgICAgKHJlc3VsdCAqIChmc0NvcmUgPj4gNSkgKyAxKSA+PiAxOyAvKiAocmVzdWx0KmZzU0JSL1FNRmJhbmRzKzEpPj4xOyAqLwogCiAgIHJldHVybiAocmVzdWx0KTsKIAogfSAvKiBFbmQgRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVyAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgZ2V0U2JyU3RvcEZyZXEKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDIsMjEgKzE1NiwxOSBAQAogCiAgUmV0dXJuOgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQgRkRLc2JyRW5jX2dldFNiclN0b3BGcmVxUkFXICAoSU5UIHN0b3BGcmVxLCBJTlQgZnNDb3JlKQoteworSU5UIEZES3NickVuY19nZXRTYnJTdG9wRnJlcVJBVyhJTlQgc3RvcEZyZXEsIElOVCBmc0NvcmUpIHsKICAgSU5UIHJlc3VsdDsKIAotICBpZiAoIHN0b3BGcmVxIDwgMCB8fCBzdG9wRnJlcSA+IDEzKQotICAgIHJldHVybiAtMTsKKyAgaWYgKHN0b3BGcmVxIDwgMCB8fCBzdG9wRnJlcSA+IDEzKSByZXR1cm4gLTE7CiAKICAgLyogVXBwZGF0ZSBzdG9wRnJlcSBzdHJ1Y3QgKi8KICAgcmVzdWx0ID0gZ2V0U3RvcEZyZXEoZnNDb3JlLCBzdG9wRnJlcSk7Ci0gIHJlc3VsdCA9IChyZXN1bHQqKGZzQ29yZT4+NSkrMSk+PjE7IC8qIChyZXN1bHQqZnNTQlIvUU1GYmFuZHMrMSk+PjE7ICovCisgIHJlc3VsdCA9CisgICAgICAocmVzdWx0ICogKGZzQ29yZSA+PiA1KSArIDEpID4+IDE7IC8qIChyZXN1bHQqZnNTQlIvUU1GYmFuZHMrMSk+PjE7ICovCiAKICAgcmV0dXJuIChyZXN1bHQpOwogfSAvKiBFbmQgZ2V0U2JyU3RvcEZyZXEgKi8KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIGdldFN0YXJ0RnJlcQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE2Nyw4MiArMTc5LDgwIEBACiAKICBSZXR1cm46CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWdldFN0YXJ0RnJlcShJTlQgZnNDb3JlLCBjb25zdCBJTlQgc3RhcnRfZnJlcSkKLXsKK3N0YXRpYyBJTlQgZ2V0U3RhcnRGcmVxKElOVCBmc0NvcmUsIGNvbnN0IElOVCBzdGFydF9mcmVxKSB7CiAgIElOVCBrMF9taW47CiAKLSAgc3dpdGNoKGZzQ29yZSl7Ci0gIGNhc2UgIDgwMDA6IGswX21pbiA9IDI0OyAvKiAoMzAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KLSAgICBicmVhazsKLSAgY2FzZSAxMTAyNTogazBfbWluID0gMTc7IC8qICgzMDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwotICAgIGJyZWFrOwotICBjYXNlIDEyMDAwOiBrMF9taW4gPSAxNjsgLyogKDMwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgMTYwMDA6IGswX21pbiA9IDE2OyAvKiAoNDAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KLSAgICBicmVhazsKLSAgY2FzZSAyMjA1MDogazBfbWluID0gMTI7IC8qICg0MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwotICAgIGJyZWFrOwotICBjYXNlIDI0MDAwOiBrMF9taW4gPSAxMTsgLyogKDQwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgMzIwMDA6IGswX21pbiA9IDEwOyAvKiAoNTAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KLSAgICBicmVhazsKLSAgY2FzZSA0NDEwMDogazBfbWluID0gNzsgIC8qICg1MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwotICAgIGJyZWFrOwotICBjYXNlIDQ4MDAwOiBrMF9taW4gPSA3OyAgLyogKDUwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgOTYwMDA6IGswX21pbiA9IDM7ICAvKiAoNTAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBrMF9taW49MTE7IC8qIGlsbGVnYWwgZnMgKi8KKyAgc3dpdGNoIChmc0NvcmUpIHsKKyAgICBjYXNlIDgwMDA6CisgICAgICBrMF9taW4gPSAyNDsgLyogKDMwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDExMDI1OgorICAgICAgazBfbWluID0gMTc7IC8qICgzMDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjAwMDoKKyAgICAgIGswX21pbiA9IDE2OyAvKiAoMzAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTYwMDA6CisgICAgICBrMF9taW4gPSAxNjsgLyogKDQwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDIyMDUwOgorICAgICAgazBfbWluID0gMTI7IC8qICg0MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIGswX21pbiA9IDExOyAvKiAoNDAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzIwMDA6CisgICAgICBrMF9taW4gPSAxMDsgLyogKDUwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDQ0MTAwOgorICAgICAgazBfbWluID0gNzsgLyogKDUwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDAwOgorICAgICAgazBfbWluID0gNzsgLyogKDUwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDk2MDAwOgorICAgICAgazBfbWluID0gMzsgLyogKDUwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgazBfbWluID0gMTE7IC8qIGlsbGVnYWwgZnMgKi8KICAgfQogCi0KICAgc3dpdGNoIChmc0NvcmUpIHsKLQotICBjYXNlICA4MDAwOgotICAgIHsKLSAgICAgIElOVCB2X29mZnNldFtdPSB7LTgsIC03LCAtNiwgLTUsIC00LCAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKKyAgICBjYXNlIDgwMDA6IHsKKyAgICAgIElOVCB2X29mZnNldFtdID0gey04LCAtNywgLTYsIC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgN307CiAgICAgICByZXR1cm4gKGswX21pbiArIHZfb2Zmc2V0W3N0YXJ0X2ZyZXFdKTsKICAgICB9Ci0gIGNhc2UgMTEwMjU6Ci0gICAgewotICAgICAgSU5UIHZfb2Zmc2V0W109IHstNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxM307CisgICAgY2FzZSAxMTAyNTogeworICAgICAgSU5UIHZfb2Zmc2V0W10gPSB7LTUsIC00LCAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA5LCAxMSwgMTN9OwogICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CiAgICAgfQotICBjYXNlIDEyMDAwOgotICAgIHsKLSAgICAgIElOVCB2X29mZnNldFtdPSB7LTUsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxMywgMTZ9OworICAgIGNhc2UgMTIwMDA6IHsKKyAgICAgIElOVCB2X29mZnNldFtdID0gey01LCAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA5LCAxMSwgMTMsIDE2fTsKICAgICAgIHJldHVybiAoazBfbWluICsgdl9vZmZzZXRbc3RhcnRfZnJlcV0pOwogICAgIH0KLSAgY2FzZSAxNjAwMDoKLSAgICB7Ci0gICAgICBJTlQgdl9vZmZzZXRbXT0gey02LCAtNCwgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA5LCAxMSwgMTMsIDE2fTsKKyAgICBjYXNlIDE2MDAwOiB7CisgICAgICBJTlQgdl9vZmZzZXRbXSA9IHstNiwgLTQsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOSwgMTEsIDEzLCAxNn07CiAgICAgICByZXR1cm4gKGswX21pbiArIHZfb2Zmc2V0W3N0YXJ0X2ZyZXFdKTsKICAgICB9Ci0gIGNhc2UgMjIwNTA6Ci0gIGNhc2UgMjQwMDA6Ci0gIGNhc2UgMzIwMDA6Ci0gICAgewotICAgICAgSU5UIHZfb2Zmc2V0W109IHstNCwgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA5LCAxMSwgMTMsIDE2LCAyMH07CisgICAgY2FzZSAyMjA1MDoKKyAgICBjYXNlIDI0MDAwOgorICAgIGNhc2UgMzIwMDA6IHsKKyAgICAgIElOVCB2X29mZnNldFtdID0gey00LCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxMywgMTYsIDIwfTsKICAgICAgIHJldHVybiAoazBfbWluICsgdl9vZmZzZXRbc3RhcnRfZnJlcV0pOwogICAgIH0KLSAgY2FzZSA0NDEwMDoKLSAgY2FzZSA0ODAwMDoKLSAgY2FzZSA5NjAwMDoKLSAgICB7Ci0gICAgICBJTlQgdl9vZmZzZXRbXT0gey0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOSwgMTEsIDEzLCAxNiwgMjAsIDI0fTsKKyAgICBjYXNlIDQ0MTAwOgorICAgIGNhc2UgNDgwMDA6CisgICAgY2FzZSA5NjAwMDogeworICAgICAgSU5UIHZfb2Zmc2V0W10gPSB7LTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA5LCAxMSwgMTMsIDE2LCAyMCwgMjR9OwogICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CiAgICAgfQotICBkZWZhdWx0OgotICAgIHsKLSAgICAgIElOVCB2X29mZnNldFtdPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOSwgMTEsIDEzLCAxNiwgMjAsIDI0LCAyOCwgMzN9OworICAgIGRlZmF1bHQ6IHsKKyAgICAgIElOVCB2X29mZnNldFtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxMywgMTYsIDIwLCAyNCwgMjgsIDMzfTsKICAgICAgIHJldHVybiAoazBfbWluICsgdl9vZmZzZXRbc3RhcnRfZnJlcV0pOwogICAgIH0KICAgfQogfSAvKiBFbmQgZ2V0U3RhcnRGcmVxICovCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBnZXRTdG9wRnJlcQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI1Miw3OCArMjYyLDkzIEBACiAKICBSZXR1cm46CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSBzdGF0aWMgSU5UCi1nZXRTdG9wRnJlcShJTlQgZnNDb3JlLCBjb25zdCBJTlQgc3RvcF9mcmVxKQotewotICBJTlQgcmVzdWx0LGk7CitzdGF0aWMgSU5UIGdldFN0b3BGcmVxKElOVCBmc0NvcmUsIGNvbnN0IElOVCBzdG9wX2ZyZXEpIHsKKyAgSU5UIHJlc3VsdCwgaTsKICAgSU5UIGsxX21pbjsKICAgSU5UIHZfZHN0b3BbMTNdOwogCiAgIElOVCAqdl9zdG9wX2ZyZXEgPSBOVUxMOwotICBJTlQgdl9zdG9wX2ZyZXFfMTZbMTRdID0gezQ4LDQ5LDUwLDUxLDUyLDU0LDU1LDU2LDU3LDU5LDYwLDYxLDYzLDY0fTsKLSAgSU5UIHZfc3RvcF9mcmVxXzIyWzE0XSA9IHszNSwzNywzOCw0MCw0Miw0NCw0Niw0OCw1MSw1Myw1Niw1OCw2MSw2NH07Ci0gIElOVCB2X3N0b3BfZnJlcV8yNFsxNF0gPSB7MzIsMzQsMzYsMzgsNDAsNDIsNDQsNDYsNDksNTIsNTUsNTgsNjEsNjR9OwotICBJTlQgdl9zdG9wX2ZyZXFfMzJbMTRdID0gezMyLDM0LDM2LDM4LDQwLDQyLDQ0LDQ2LDQ5LDUyLDU1LDU4LDYxLDY0fTsKLSAgSU5UIHZfc3RvcF9mcmVxXzQ0WzE0XSA9IHsyMywyNSwyNywyOSwzMiwzNCwzNyw0MCw0Myw0Nyw1MSw1NSw1OSw2NH07Ci0gIElOVCB2X3N0b3BfZnJlcV80OFsxNF0gPSB7MjEsMjMsMjUsMjcsMzAsMzIsMzUsMzgsNDIsNDUsNDksNTQsNTksNjR9OwotICBJTlQgdl9zdG9wX2ZyZXFfNjRbMTRdID0gezIwLDIyLDI0LDI2LDI5LDMxLDM0LDM3LDQxLDQ1LDQ5LDU0LDU5LDY0fTsKLSAgSU5UIHZfc3RvcF9mcmVxXzg4WzE0XSA9IHsxNSwxNywxOSwyMSwyMywyNiwyOSwzMywzNyw0MSw0Niw1MSw1Nyw2NH07Ci0gIElOVCB2X3N0b3BfZnJlcV85NlsxNF0gPSB7MTMsMTUsMTcsMTksMjEsMjQsMjcsMzEsMzUsMzksNDQsNTAsNTcsNjR9OwotICBJTlQgdl9zdG9wX2ZyZXFfMTkyWzE0XSA9IHs3LCA4LDEwLDEyLDE0LDE2LDE5LDIzLDI3LDMyLDM4LDQ2LDU0LDY0fTsKKyAgSU5UIHZfc3RvcF9mcmVxXzE2WzE0XSA9IHs0OCwgNDksIDUwLCA1MSwgNTIsIDU0LCA1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NiwgNTcsIDU5LCA2MCwgNjEsIDYzLCA2NH07CisgIElOVCB2X3N0b3BfZnJlcV8yMlsxNF0gPSB7MzUsIDM3LCAzOCwgNDAsIDQyLCA0NCwgNDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsIDUxLCA1MywgNTYsIDU4LCA2MSwgNjR9OworICBJTlQgdl9zdG9wX2ZyZXFfMjRbMTRdID0gezMyLCAzNCwgMzYsIDM4LCA0MCwgNDIsIDQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LCA0OSwgNTIsIDU1LCA1OCwgNjEsIDY0fTsKKyAgSU5UIHZfc3RvcF9mcmVxXzMyWzE0XSA9IHszMiwgMzQsIDM2LCAzOCwgNDAsIDQyLCA0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwgNDksIDUyLCA1NSwgNTgsIDYxLCA2NH07CisgIElOVCB2X3N0b3BfZnJlcV80NFsxNF0gPSB7MjMsIDI1LCAyNywgMjksIDMyLCAzNCwgMzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsIDQzLCA0NywgNTEsIDU1LCA1OSwgNjR9OworICBJTlQgdl9zdG9wX2ZyZXFfNDhbMTRdID0gezIxLCAyMywgMjUsIDI3LCAzMCwgMzIsIDM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LCA0MiwgNDUsIDQ5LCA1NCwgNTksIDY0fTsKKyAgSU5UIHZfc3RvcF9mcmVxXzY0WzE0XSA9IHsyMCwgMjIsIDI0LCAyNiwgMjksIDMxLCAzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywgNDEsIDQ1LCA0OSwgNTQsIDU5LCA2NH07CisgIElOVCB2X3N0b3BfZnJlcV84OFsxNF0gPSB7MTUsIDE3LCAxOSwgMjEsIDIzLCAyNiwgMjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMsIDM3LCA0MSwgNDYsIDUxLCA1NywgNjR9OworICBJTlQgdl9zdG9wX2ZyZXFfOTZbMTRdID0gezEzLCAxNSwgMTcsIDE5LCAyMSwgMjQsIDI3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxLCAzNSwgMzksIDQ0LCA1MCwgNTcsIDY0fTsKKyAgSU5UIHZfc3RvcF9mcmVxXzE5MlsxNF0gPSB7NywgIDgsICAxMCwgMTIsIDE0LCAxNiwgMTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzLCAyNywgMzIsIDM4LCA0NiwgNTQsIDY0fTsKIAotICBzd2l0Y2goZnNDb3JlKXsKLSAgY2FzZSAgODAwMDogazFfbWluID0gNDg7Ci0gICAgICAgICAgICAgIHZfc3RvcF9mcmVxID12X3N0b3BfZnJlcV8xNjsKLSAgICBicmVhazsKLSAgY2FzZSAxMTAyNTogazFfbWluID0gMzU7Ci0gICAgICAgICAgICAgIHZfc3RvcF9mcmVxID12X3N0b3BfZnJlcV8yMjsKLSAgICBicmVhazsKLSAgY2FzZSAxMjAwMDogazFfbWluID0gMzI7Ci0gICAgICAgICAgICAgIHZfc3RvcF9mcmVxID12X3N0b3BfZnJlcV8yNDsKLSAgICBicmVhazsKLSAgY2FzZSAxNjAwMDogazFfbWluID0gMzI7Ci0gICAgICAgICAgICAgIHZfc3RvcF9mcmVxID12X3N0b3BfZnJlcV8zMjsKLSAgICBicmVhazsKLSAgY2FzZSAyMjA1MDogazFfbWluID0gMjM7Ci0gICAgICAgICAgICAgIHZfc3RvcF9mcmVxID12X3N0b3BfZnJlcV80NDsKLSAgICBicmVhazsKLSAgY2FzZSAyNDAwMDogazFfbWluID0gMjE7Ci0gICAgICAgICAgICAgIHZfc3RvcF9mcmVxID12X3N0b3BfZnJlcV80ODsKLSAgICBicmVhazsKLSAgY2FzZSAzMjAwMDogazFfbWluID0gMjA7Ci0gICAgICAgICAgICAgIHZfc3RvcF9mcmVxID12X3N0b3BfZnJlcV82NDsKLSAgICBicmVhazsKLSAgY2FzZSA0NDEwMDogazFfbWluID0gMTU7Ci0gICAgICAgICAgICAgIHZfc3RvcF9mcmVxID12X3N0b3BfZnJlcV84ODsKLSAgICBicmVhazsKLSAgY2FzZSA0ODAwMDogazFfbWluID0gMTM7Ci0gICAgICAgICAgICAgIHZfc3RvcF9mcmVxID12X3N0b3BfZnJlcV85NjsKLSAgICBicmVhazsKLSAgY2FzZSA5NjAwMDogazFfbWluID0gIDc7Ci0gICAgICAgICAgICAgIHZfc3RvcF9mcmVxID12X3N0b3BfZnJlcV8xOTI7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgazFfbWluID0gMjE7IC8qIGlsbGVnYWwgZnMgICovCisgIHN3aXRjaCAoZnNDb3JlKSB7CisgICAgY2FzZSA4MDAwOgorICAgICAgazFfbWluID0gNDg7CisgICAgICB2X3N0b3BfZnJlcSA9IHZfc3RvcF9mcmVxXzE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTAyNToKKyAgICAgIGsxX21pbiA9IDM1OworICAgICAgdl9zdG9wX2ZyZXEgPSB2X3N0b3BfZnJlcV8yMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTIwMDA6CisgICAgICBrMV9taW4gPSAzMjsKKyAgICAgIHZfc3RvcF9mcmVxID0gdl9zdG9wX2ZyZXFfMjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgazFfbWluID0gMzI7CisgICAgICB2X3N0b3BfZnJlcSA9IHZfc3RvcF9mcmVxXzMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgIGsxX21pbiA9IDIzOworICAgICAgdl9zdG9wX2ZyZXEgPSB2X3N0b3BfZnJlcV80NDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQwMDA6CisgICAgICBrMV9taW4gPSAyMTsKKyAgICAgIHZfc3RvcF9mcmVxID0gdl9zdG9wX2ZyZXFfNDg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyMDAwOgorICAgICAgazFfbWluID0gMjA7CisgICAgICB2X3N0b3BfZnJlcSA9IHZfc3RvcF9mcmVxXzY0OworICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgIGsxX21pbiA9IDE1OworICAgICAgdl9zdG9wX2ZyZXEgPSB2X3N0b3BfZnJlcV84ODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDgwMDA6CisgICAgICBrMV9taW4gPSAxMzsKKyAgICAgIHZfc3RvcF9mcmVxID0gdl9zdG9wX2ZyZXFfOTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDk2MDAwOgorICAgICAgazFfbWluID0gNzsKKyAgICAgIHZfc3RvcF9mcmVxID0gdl9zdG9wX2ZyZXFfMTkyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGsxX21pbiA9IDIxOyAvKiBpbGxlZ2FsIGZzICAqLwogICB9CiAKLSAgLyogaWYgbm8gdmFsaWQgY29yZSBzYW1wbGluZ3JhdGUgaXMgdXNlZCB0aGlzIGxvb3AgcHJvZHVjZXMKLSAgICAgYSBzZWdmYXVsdCwgYmVjYXVzZSB2X3N0b3BfZnJlcSBpcyBub3QgaW5pdGlhbGl6ZWQgKi8KICAgLyogRW5zdXJlIGluY3JlYXNpbmcgYmFuZHdpZHRoICovCi0gIGZvcihpID0gMDsgaSA8PSAxMjsgaSsrKSB7Ci0gICAgdl9kc3RvcFtpXSA9IHZfc3RvcF9mcmVxW2krMV0gLSB2X3N0b3BfZnJlcVtpXTsKKyAgZm9yIChpID0gMDsgaSA8PSAxMjsgaSsrKSB7CisgICAgdl9kc3RvcFtpXSA9IHZfc3RvcF9mcmVxW2kgKyAxXSAtIHZfc3RvcF9mcmVxW2ldOwogICB9CiAKICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQodl9kc3RvcCwgMTMpOyAvKiBTb3J0IGJhbmR3aWR0aCBjaGFuZ2VzICovCiAKICAgcmVzdWx0ID0gazFfbWluOwotICBmb3IoaSA9IDA7IGkgPCBzdG9wX2ZyZXE7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgc3RvcF9mcmVxOyBpKyspIHsKICAgICByZXN1bHQgPSByZXN1bHQgKyB2X2RzdG9wW2ldOwogICB9CiAKLSAgcmV0dXJuKHJlc3VsdCk7CisgIHJldHVybiAocmVzdWx0KTsKIAotfS8qIEVuZCBnZXRTdG9wRnJlcSAqLwotCit9IC8qIEVuZCBnZXRTdG9wRnJlcSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19GaW5kU3RhcnRBbmRTdG9wQmFuZApAQCAtMzQxLDMxICszNjYsMjMgQEAKIAogIFJldHVybjogICAgICAgRXJyb3IgY29kZSAoMCBpcyBPSykKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfRmluZFN0YXJ0QW5kU3RvcEJhbmQoCi0gICAgICAgIGNvbnN0IElOVCBzclNiciwKLSAgICAgICAgY29uc3QgSU5UIHNyQ29yZSwKLSAgICAgICAgY29uc3QgSU5UIG5vQ2hhbm5lbHMsCi0gICAgICAgIGNvbnN0IElOVCBzdGFydEZyZXEsCi0gICAgICAgIGNvbnN0IElOVCBzdG9wRnJlcSwKLSAgICAgICAgSU5UICprMCwKLSAgICAgICAgSU5UICprMgotICAgICAgICApCi17Ci0KK0lOVCBGREtzYnJFbmNfRmluZFN0YXJ0QW5kU3RvcEJhbmQoY29uc3QgSU5UIHNyU2JyLCBjb25zdCBJTlQgc3JDb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbm9DaGFubmVscywgY29uc3QgSU5UIHN0YXJ0RnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN0b3BGcmVxLCBJTlQgKmswLCBJTlQgKmsyKSB7CiAgIC8qIFVwZGF0ZSBzdGFydEZyZXEgc3RydWN0ICovCiAgICprMCA9IGdldFN0YXJ0RnJlcShzckNvcmUsIHN0YXJ0RnJlcSk7CiAKICAgLyogVGVzdCBpZiBzdGFydCBmcmVxIGlzIG91dHNpZGUgY29yZWNvZGVyIHJhbmdlICovCi0gIGlmKCBzclNicipub0NoYW5uZWxzIDwgKmswICogc3JDb3JlICkgewotICAgIHJldHVybiAoMSk7IC8qIHJhaXNlIHRoZSBjcm9zcy1vdmVyIGZyZXF1ZW5jeSBhbmQvb3IgbG93ZXIgdGhlIG51bWJlcgotICAgICAgICAgICAgICAgICAgIG9mIHRhcmdldCBiYW5kcyBwZXIgb2N0YXZlIChvciBsb3dlciB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5KSAqLworICBpZiAoc3JTYnIgKiBub0NoYW5uZWxzIDwgKmswICogc3JDb3JlKSB7CisgICAgcmV0dXJuICgKKyAgICAgICAgMSk7IC8qIHJhaXNlIHRoZSBjcm9zcy1vdmVyIGZyZXF1ZW5jeSBhbmQvb3IgbG93ZXIgdGhlIG51bWJlcgorICAgICAgICAgICAgICAgb2YgdGFyZ2V0IGJhbmRzIHBlciBvY3RhdmUgKG9yIGxvd2VyIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kpICovCiAgIH0KIAogICAvKlVwZGF0ZSBzdG9wRnJlcSBzdHJ1Y3QgKi8KLSAgaWYgKCBzdG9wRnJlcSA8IDE0ICkgeworICBpZiAoc3RvcEZyZXEgPCAxNCkgewogICAgICprMiA9IGdldFN0b3BGcmVxKHNyQ29yZSwgc3RvcEZyZXEpOwotICB9IGVsc2UgaWYoIHN0b3BGcmVxID09IDE0ICkgeworICB9IGVsc2UgaWYgKHN0b3BGcmVxID09IDE0KSB7CiAgICAgKmsyID0gMiAqICprMDsKICAgfSBlbHNlIHsKICAgICAqazIgPSAzICogKmswOwpAQCAtMzc2LDIzICszOTMsMjEgQEAKICAgICAqazIgPSBub0NoYW5uZWxzOwogICB9CiAKLQotCiAgIC8qIFRlc3QgZm9yIGludmFsaWQgIGswIGsyIGNvbWJpbmF0aW9ucyAqLwotICBpZiAoIChzckNvcmUgPT0gMjIwNTApICYmICggKCprMiAtICprMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0NDEwMCApICkKLSAgICByZXR1cm4gKDEpOyAvKiBOdW1iZXIgb2YgYmFuZHMgZXhjZWVkcyB2YWxpZCByYW5nZSBvZiBNQVhfRlJFUV9DT0VGRlMgZm9yIGZzPTQ0LjFrSHogKi8KKyAgaWYgKChzckNvcmUgPT0gMjIwNTApICYmICgoKmsyIC0gKmswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ0MTAwKSkKKyAgICByZXR1cm4gKDEpOyAvKiBOdW1iZXIgb2YgYmFuZHMgZXhjZWVkcyB2YWxpZCByYW5nZSBvZiBNQVhfRlJFUV9DT0VGRlMgZm9yCisgICAgICAgICAgICAgICAgICAgZnM9NDQuMWtIeiAqLwogCi0gIGlmICggKHNyQ29yZSA+PSAyNDAwMCkgJiYgKCAoKmsyIC0gKmswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwICkgKQotICAgIHJldHVybiAoMSk7IC8qIE51bWJlciBvZiBiYW5kcyBleGNlZWRzIHZhbGlkIHJhbmdlIG9mIE1BWF9GUkVRX0NPRUZGUyBmb3IgZnM+PTQ4a0h6ICovCisgIGlmICgoc3JDb3JlID49IDI0MDAwKSAmJiAoKCprMiAtICprMCkgPiBNQVhfRlJFUV9DT0VGRlNfRlM0ODAwMCkpCisgICAgcmV0dXJuICgxKTsgLyogTnVtYmVyIG9mIGJhbmRzIGV4Y2VlZHMgdmFsaWQgcmFuZ2Ugb2YgTUFYX0ZSRVFfQ09FRkZTIGZvcgorICAgICAgICAgICAgICAgICAgIGZzPj00OGtIeiAqLwogCiAgIGlmICgoKmsyIC0gKmswKSA+IE1BWF9GUkVRX0NPRUZGUykKLSAgICByZXR1cm4gKDEpOy8qTnVtYmVyIG9mIGJhbmRzIGV4Y2VlZHMgdmFsaWQgcmFuZ2Ugb2YgTUFYX0ZSRVFfQ09FRkZTICovCisgICAgcmV0dXJuICgxKTsgLypOdW1iZXIgb2YgYmFuZHMgZXhjZWVkcyB2YWxpZCByYW5nZSBvZiBNQVhfRlJFUV9DT0VGRlMgKi8KIAotICBpZiAoKCprMiAtICprMCkgPCAwKQotICAgIHJldHVybiAoMSk7LyogTnVtYmVyIG9mIGJhbmRzIGlzIG5lZ2F0aXZlICovCisgIGlmICgoKmsyIC0gKmswKSA8IDApIHJldHVybiAoMSk7IC8qIE51bWJlciBvZiBiYW5kcyBpcyBuZWdhdGl2ZSAqLwogCi0KLSAgcmV0dXJuKDApOworICByZXR1cm4gKDApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDA0LDIwNyArNDE5LDE4OCBAQAogCiAgUmV0dXJuOgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19VcGRhdGVGcmVxU2NhbGUoCi0gICAgICAgIFVDSEFSICAgICAqdl9rX21hc3RlciwKLSAgICAgICAgSU5UICAgICAgICpoX251bV9iYW5kcywKLSAgICAgICAgY29uc3QgSU5UICBrMCwKLSAgICAgICAgY29uc3QgSU5UICBrMiwKLSAgICAgICAgY29uc3QgSU5UICBmcmVxU2NhbGUsCi0gICAgICAgIGNvbnN0IElOVCAgYWx0ZXJTY2FsZQotICAgICAgICApCitJTlQgRkRLc2JyRW5jX1VwZGF0ZUZyZXFTY2FsZShVQ0hBUiAqdl9rX21hc3RlciwgSU5UICpoX251bV9iYW5kcywgY29uc3QgSU5UIGswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGsyLCBjb25zdCBJTlQgZnJlcVNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGFsdGVyU2NhbGUpCiAKIHsKLQotICBJTlQgICAgIGJfcF9vID0gMDsgICAgICAgIC8qIGJhbmRzX3Blcl9vY3RhdmUgKi8KKyAgSU5UIGJfcF9vID0gMDsgLyogYmFuZHNfcGVyX29jdGF2ZSAqLwogICBGSVhQX0RCTCB3YXJwID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gIElOVCAgICAgZGsgPSAwOworICBJTlQgZGsgPSAwOwogCiAgIC8qIEludGVybmFsIHZhcmlhYmxlcyAqLwotICBJTlQgICAgIGsxID0gMCwgaTsKLSAgSU5UICAgICBudW1fYmFuZHMwOwotICBJTlQgICAgIG51bV9iYW5kczE7Ci0gIElOVCAgICAgZGlmZl90b3RbTUFYX09DVEFWRSArIE1BWF9TRUNPTkRfUkVHSU9OXTsKLSAgSU5UICAgICAqZGlmZjAgPSBkaWZmX3RvdDsKLSAgSU5UICAgICAqZGlmZjEgPSBkaWZmX3RvdCtNQVhfT0NUQVZFOwotICBJTlQgICAgIGsyX2FjaGl2ZWQ7Ci0gIElOVCAgICAgazJfZGlmZjsKLSAgSU5UICAgICBpbmNyID0gMDsKKyAgSU5UIGsxID0gMCwgaTsKKyAgSU5UIG51bV9iYW5kczA7CisgIElOVCBudW1fYmFuZHMxOworICBJTlQgZGlmZl90b3RbTUFYX09DVEFWRSArIE1BWF9TRUNPTkRfUkVHSU9OXTsKKyAgSU5UICpkaWZmMCA9IGRpZmZfdG90OworICBJTlQgKmRpZmYxID0gZGlmZl90b3QgKyBNQVhfT0NUQVZFOworICBJTlQgazJfYWNoaXZlZDsKKyAgSU5UIGsyX2RpZmY7CisgIElOVCBpbmNyID0gMDsKIAogICAvKiBJbml0ICovCi0gIGlmIChmcmVxU2NhbGU9PTEpICBiX3BfbyA9IDEyOwotICBpZiAoZnJlcVNjYWxlPT0yKSAgYl9wX28gPSAxMDsKLSAgaWYgKGZyZXFTY2FsZT09MykgIGJfcF9vID0gODsKKyAgaWYgKGZyZXFTY2FsZSA9PSAxKSBiX3BfbyA9IDEyOworICBpZiAoZnJlcVNjYWxlID09IDIpIGJfcF9vID0gMTA7CisgIGlmIChmcmVxU2NhbGUgPT0gMykgYl9wX28gPSA4OwogCisgIGlmIChmcmVxU2NhbGUgPiAwKSAvKkJhcmsqLworICB7CisgICAgaWYgKGFsdGVyU2NhbGUgPT0gMCkKKyAgICAgIHdhcnAgPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsgLyogMS4wLygxLjAqMi4wKSAqLworICAgIGVsc2UKKyAgICAgIHdhcnAgPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gMi42Zik7IC8qIDEuMC8oMS4zKjIuMCk7ICovCiAKLSAgaWYoZnJlcVNjYWxlID4gMCkgLypCYXJrKi8KKyAgICBpZiAoNCAqIGsyID49IDkgKiBrMCkgLyp0d28gb3IgbW9yZSByZWdpb25zIChob3cgbWFueSB0aW1lcyB0aGUgYmFzaXMgYmFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBjb3BpZWQpKi8KICAgICB7Ci0gICAgICBpZihhbHRlclNjYWxlPT0wKQotICAgICAgICB3YXJwID0gRkwyRlhDT05TVF9EQkwoMC41Zik7ICAgICAgICAvKiAxLjAvKDEuMCoyLjApICovCi0gICAgICBlbHNlCi0gICAgICAgIHdhcnAgPSBGTDJGWENPTlNUX0RCTCgxLjBmLzIuNmYpOyAgIC8qIDEuMC8oMS4zKjIuMCk7ICovCisgICAgICBrMSA9IDIgKiBrMDsKIAorICAgICAgbnVtX2JhbmRzMCA9IG51bWJlck9mQmFuZHMoYl9wX28sIGswLCBrMSwgRkwyRlhDT05TVF9EQkwoMC41ZikpOworICAgICAgbnVtX2JhbmRzMSA9IG51bWJlck9mQmFuZHMoYl9wX28sIGsxLCBrMiwgd2FycCk7CiAKLSAgICAgIGlmKDQqazIgPj0gOSprMCkgIC8qdHdvIG9yIG1vcmUgcmVnaW9ucyAoaG93IG1hbnkgdGltZXMgdGhlIGJhc2lzIGJhbmQgaXMgY29waWVkKSovCi0gICAgICAgIHsKLSAgICAgICAgICBrMT0yKmswOworICAgICAgQ2FsY0JhbmRzKGRpZmYwLCBrMCwgazEsIG51bV9iYW5kczApOyAgICAgICAvKkNhbGNCYW5kczEgPT4gZGlmZjAgKi8KKyAgICAgIEZES3NickVuY19TaGVsbHNvcnRfaW50KGRpZmYwLCBudW1fYmFuZHMwKTsgLypTb3J0QmFuZHMgc29ydCBkaWZmMCAqLwogCi0gICAgICAgICAgbnVtX2JhbmRzMD1udW1iZXJPZkJhbmRzKGJfcF9vLCBrMCwgazEsIEZMMkZYQ09OU1RfREJMKDAuNWYpKTsKLSAgICAgICAgICBudW1fYmFuZHMxPW51bWJlck9mQmFuZHMoYl9wX28sIGsxLCBrMiwgd2FycCk7CisgICAgICBpZiAoZGlmZjBbMF0gPT0gMCkgLyogdG9vIHdpZGUgRkIgYmFuZHMgZm9yIHRhcmdldCB0dW5pbmcgKi8KKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICgxKTsgLyogcmFpc2UgdGhlIGNyb3NzLW92ZXIgZnJlcXVlbmN5IGFuZC9vciBsb3dlciB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgIG9mIHRhcmdldCBiYW5kcyBwZXIgb2N0YXZlIChvciBsb3dlciB0aGUgc2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ICovCisgICAgICB9CiAKLSAgICAgICAgICBDYWxjQmFuZHMoZGlmZjAsIGswLCBrMSwgbnVtX2JhbmRzMCk7LypDYWxjQmFuZHMxID0+IGRpZmYwICovCi0gICAgICAgICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoIGRpZmYwLCBudW1fYmFuZHMwKTsvKlNvcnRCYW5kcyBzb3J0IGRpZmYwICovCisgICAgICBjdW1TdW0oazAsIGRpZmYwLCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsgLyogY3Vtc3VtICovCiAKLSAgICAgICAgICBpZiAoZGlmZjBbMF0gPT0gMCkgLyogdG9vIHdpZGUgRkIgYmFuZHMgZm9yIHRhcmdldCB0dW5pbmcgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKDEpOy8qIHJhaXNlIHRoZSBjcm9zcy1vdmVyIGZyZXF1ZW5jeSBhbmQvb3IgbG93ZXIgdGhlIG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0YXJnZXQgYmFuZHMgcGVyIG9jdGF2ZSAob3IgbG93ZXIgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgICAgICAgIH0KKyAgICAgIENhbGNCYW5kcyhkaWZmMSwgazEsIGsyLCBudW1fYmFuZHMxKTsgICAgICAgLyogQ2FsY0JhbmRzMiA9PiBkaWZmMSAqLworICAgICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoZGlmZjEsIG51bV9iYW5kczEpOyAvKiBTb3J0QmFuZHMgc29ydCBkaWZmMSAqLworICAgICAgaWYgKGRpZmYwW251bV9iYW5kczAgLSAxXSA+IGRpZmYxWzBdKSAgICAgICAvKiBtYXgoMSkgPiBtaW4oMikgKi8KKyAgICAgIHsKKyAgICAgICAgaWYgKG1vZGlmeUJhbmRzKGRpZmYwW251bV9iYW5kczAgLSAxXSwgZGlmZjEsIG51bV9iYW5kczEpKSByZXR1cm4gKDEpOworICAgICAgfQogCi0gICAgICAgICAgY3VtU3VtKGswLCBkaWZmMCwgbnVtX2JhbmRzMCwgdl9rX21hc3Rlcik7IC8qIGN1bXN1bSAqLworICAgICAgLyogQWRkIDInbmQgcmVnaW9uICovCisgICAgICBjdW1TdW0oazEsIGRpZmYxLCBudW1fYmFuZHMxLCAmdl9rX21hc3RlcltudW1fYmFuZHMwXSk7CisgICAgICAqaF9udW1fYmFuZHMgPSBudW1fYmFuZHMwICsgbnVtX2JhbmRzMTsgLyogT3V0cHV0IG5yIG9mIGJhbmRzICovCiAKLSAgICAgICAgICBDYWxjQmFuZHMoZGlmZjEsIGsxLCBrMiwgbnVtX2JhbmRzMSk7ICAgICAvKiBDYWxjQmFuZHMyID0+IGRpZmYxICovCi0gICAgICAgICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoIGRpZmYxLCBudW1fYmFuZHMxKTsgICAgICAgICAgICAvKiBTb3J0QmFuZHMgc29ydCBkaWZmMSAqLwotICAgICAgICAgIGlmKGRpZmYwW251bV9iYW5kczAtMV0gPiBkaWZmMVswXSkgICAgICAgIC8qIG1heCgxKSA+IG1pbigyKSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZihtb2RpZnlCYW5kcyhkaWZmMFtudW1fYmFuZHMwLTFdLGRpZmYxLCBudW1fYmFuZHMxKSkKLSAgICAgICAgICAgICAgICByZXR1cm4oMSk7Ci0gICAgICAgICAgICB9CisgICAgfSBlbHNlIC8qIG9uZSByZWdpb24gKi8KKyAgICB7CisgICAgICBrMSA9IGsyOwogCi0gICAgICAgICAgLyogQWRkIDInbmQgcmVnaW9uICovCi0gICAgICAgICAgY3VtU3VtKGsxLCBkaWZmMSwgbnVtX2JhbmRzMSwgJnZfa19tYXN0ZXJbbnVtX2JhbmRzMF0pOwotICAgICAgICAgICpoX251bV9iYW5kcz1udW1fYmFuZHMwK251bV9iYW5kczE7ICAgICAvKiBPdXRwdXQgbnIgb2YgYmFuZHMgKi8KKyAgICAgIG51bV9iYW5kczAgPSBudW1iZXJPZkJhbmRzKGJfcF9vLCBrMCwgazEsIEZMMkZYQ09OU1RfREJMKDAuNWYpKTsKKyAgICAgIENhbGNCYW5kcyhkaWZmMCwgazAsIGsxLCBudW1fYmFuZHMwKTsgICAgICAgLyogQ2FsY0JhbmRzMSA9PiBkaWZmMCAqLworICAgICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoZGlmZjAsIG51bV9iYW5kczApOyAvKiBTb3J0QmFuZHMgc29ydCBkaWZmMCAqLwogCi0gICAgICAgIH0KLSAgICAgIGVsc2UgLyogb25lIHJlZ2lvbiAqLwotICAgICAgICB7Ci0gICAgICAgICAgazE9azI7CisgICAgICBpZiAoZGlmZjBbMF0gPT0gMCkgLyogdG9vIHdpZGUgRkIgYmFuZHMgZm9yIHRhcmdldCB0dW5pbmcgKi8KKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICgxKTsgLyogcmFpc2UgdGhlIGNyb3NzLW92ZXIgZnJlcXVlbmN5IGFuZC9vciBsb3dlciB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgIG9mIHRhcmdldCBiYW5kcyBwZXIgb2N0YXZlIChvciBsb3dlciB0aGUgc2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ICovCisgICAgICB9CiAKLSAgICAgICAgICBudW1fYmFuZHMwPW51bWJlck9mQmFuZHMoYl9wX28sIGswLCBrMSwgRkwyRlhDT05TVF9EQkwoMC41ZikpOwotICAgICAgICAgIENhbGNCYW5kcyhkaWZmMCwgazAsIGsxLCBudW1fYmFuZHMwKTsvKiBDYWxjQmFuZHMxID0+IGRpZmYwICovCi0gICAgICAgICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoIGRpZmYwLCBudW1fYmFuZHMwKTsgICAgICAgLyogU29ydEJhbmRzIHNvcnQgZGlmZjAgKi8KLQotICAgICAgICAgIGlmIChkaWZmMFswXSA9PSAwKSAvKiB0b28gd2lkZSBGQiBiYW5kcyBmb3IgdGFyZ2V0IHR1bmluZyAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoMSk7IC8qIHJhaXNlIHRoZSBjcm9zcy1vdmVyIGZyZXF1ZW5jeSBhbmQvb3IgbG93ZXIgdGhlIG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGFyZ2V0IGJhbmRzIHBlciBvY3RhdmUgKG9yIGxvd2VyIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjdW1TdW0oazAsIGRpZmYwLCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsvKiBjdW1zdW0gKi8KLSAgICAgICAgICAqaF9udW1fYmFuZHM9bnVtX2JhbmRzMDsgICAgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLwotCi0gICAgICAgIH0KKyAgICAgIGN1bVN1bShrMCwgZGlmZjAsIG51bV9iYW5kczAsIHZfa19tYXN0ZXIpOyAvKiBjdW1zdW0gKi8KKyAgICAgICpoX251bV9iYW5kcyA9IG51bV9iYW5kczA7ICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgbnIgb2YgYmFuZHMgKi8KICAgICB9Ci0gIGVsc2UgLyogTGluZWFyIG1vZGUgKi8KLSAgICB7Ci0gICAgICBpZiAoYWx0ZXJTY2FsZT09MCkgewotICAgICAgICBkayA9IDE7Ci0gICAgICAgIG51bV9iYW5kczAgPSAyICogKChrMiAtIGswKS8yKTsgICAgICAgICAvKiBGTE9PUiB0byBnZXQgdG8gZmV3IG51bWJlciBvZiBiYW5kcyovCi0gICAgICB9IGVsc2UgewotICAgICAgICBkayA9IDI7Ci0gICAgICAgIG51bV9iYW5kczAgPSAyICogKCgoazIgLSBrMCkvZGsgKzEpLzIpOyAvKiBST1VORCB0byBnZXQgY2xvc2VzdCBmaXQgKi8KLSAgICAgIH0KLQotICAgICAgazJfYWNoaXZlZCA9IGswICsgbnVtX2JhbmRzMCpkazsKLSAgICAgIGsyX2RpZmYgPSBrMiAtIGsyX2FjaGl2ZWQ7Ci0KLSAgICAgIGZvcihpPTA7aTxudW1fYmFuZHMwO2krKykKLSAgICAgICAgZGlmZl90b3RbaV0gPSBkazsKLQotICAgICAgLyogSWYgbGluZWFyIHNjYWxlIHdhc24ndCBhY2hpdmVkICovCi0gICAgICAvKiBhbmQgd2UgZ290IHdpZGUgU0JSIGFyZSAqLwotICAgICAgaWYgKGsyX2RpZmYgPCAwKSB7Ci0gICAgICAgICAgaW5jciA9IDE7Ci0gICAgICAgICAgaSA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIElmIGxpbmVhciBzY2FsZSB3YXNuJ3QgYWNoaXZlZCAqLwotICAgICAgLyogYW5kIHdlIGdvdCBzbWFsbCBTQlIgYXJlICovCi0gICAgICBpZiAoazJfZGlmZiA+IDApIHsKLSAgICAgICAgICBpbmNyID0gLTE7Ci0gICAgICAgICAgaSA9IG51bV9iYW5kczAtMTsKLSAgICAgIH0KLQotICAgICAgLyogQWRqdXN0IGRpZmYgdmVjdG9yIHRvIGdldCBzZXBjLiBTQlIgcmFuZ2UgKi8KLSAgICAgIHdoaWxlIChrMl9kaWZmICE9IDApIHsKLSAgICAgICAgZGlmZl90b3RbaV0gPSBkaWZmX3RvdFtpXSAtIGluY3I7Ci0gICAgICAgIGkgPSBpICsgaW5jcjsKLSAgICAgICAgazJfZGlmZiA9IGsyX2RpZmYgKyBpbmNyOwotICAgICAgfQotCi0gICAgICBjdW1TdW0oazAsIGRpZmZfdG90LCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsvKiBjdW1zdW0gKi8KLSAgICAgICpoX251bV9iYW5kcz1udW1fYmFuZHMwOyAgICAgICAgLyogT3V0cHV0IG5yIG9mIGJhbmRzICovCi0KKyAgfSBlbHNlIC8qIExpbmVhciBtb2RlICovCisgIHsKKyAgICBpZiAoYWx0ZXJTY2FsZSA9PSAwKSB7CisgICAgICBkayA9IDE7CisgICAgICBudW1fYmFuZHMwID0gMiAqICgoazIgLSBrMCkgLyAyKTsgLyogRkxPT1IgdG8gZ2V0IHRvIGZldyBudW1iZXIgb2YgYmFuZHMqLworICAgIH0gZWxzZSB7CisgICAgICBkayA9IDI7CisgICAgICBudW1fYmFuZHMwID0KKyAgICAgICAgICAyICogKCgoazIgLSBrMCkgLyBkayArIDEpIC8gMik7IC8qIFJPVU5EIHRvIGdldCBjbG9zZXN0IGZpdCAqLwogICAgIH0KIAotICBpZiAoKmhfbnVtX2JhbmRzIDwgMSkKLSAgICByZXR1cm4oMSk7IC8qVG8gc21hbGwgc2JyIGFyZWEgKi8KKyAgICBrMl9hY2hpdmVkID0gazAgKyBudW1fYmFuZHMwICogZGs7CisgICAgazJfZGlmZiA9IGsyIC0gazJfYWNoaXZlZDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYmFuZHMwOyBpKyspIGRpZmZfdG90W2ldID0gZGs7CisKKyAgICAvKiBJZiBsaW5lYXIgc2NhbGUgd2Fzbid0IGFjaGl2ZWQgKi8KKyAgICAvKiBhbmQgd2UgZ290IHdpZGUgU0JSIGFyZSAqLworICAgIGlmIChrMl9kaWZmIDwgMCkgeworICAgICAgaW5jciA9IDE7CisgICAgICBpID0gMDsKKyAgICB9CisKKyAgICAvKiBJZiBsaW5lYXIgc2NhbGUgd2Fzbid0IGFjaGl2ZWQgKi8KKyAgICAvKiBhbmQgd2UgZ290IHNtYWxsIFNCUiBhcmUgKi8KKyAgICBpZiAoazJfZGlmZiA+IDApIHsKKyAgICAgIGluY3IgPSAtMTsKKyAgICAgIGkgPSBudW1fYmFuZHMwIC0gMTsKKyAgICB9CisKKyAgICAvKiBBZGp1c3QgZGlmZiB2ZWN0b3IgdG8gZ2V0IHNlcGMuIFNCUiByYW5nZSAqLworICAgIHdoaWxlIChrMl9kaWZmICE9IDApIHsKKyAgICAgIGRpZmZfdG90W2ldID0gZGlmZl90b3RbaV0gLSBpbmNyOworICAgICAgaSA9IGkgKyBpbmNyOworICAgICAgazJfZGlmZiA9IGsyX2RpZmYgKyBpbmNyOworICAgIH0KKworICAgIGN1bVN1bShrMCwgZGlmZl90b3QsIG51bV9iYW5kczAsIHZfa19tYXN0ZXIpOyAvKiBjdW1zdW0gKi8KKyAgICAqaF9udW1fYmFuZHMgPSBudW1fYmFuZHMwOyAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IG5yIG9mIGJhbmRzICovCisgIH0KKworICBpZiAoKmhfbnVtX2JhbmRzIDwgMSkgcmV0dXJuICgxKTsgLypUbyBzbWFsbCBzYnIgYXJlYSAqLwogCiAgIHJldHVybiAoMCk7Ci19LyogRW5kIEZES3NickVuY19VcGRhdGVGcmVxU2NhbGUgKi8KK30gLyogRW5kIEZES3NickVuY19VcGRhdGVGcmVxU2NhbGUgKi8KIAotc3RhdGljIElOVAotbnVtYmVyT2ZCYW5kcyhJTlQgYl9wX28sIElOVCBzdGFydCwgSU5UIHN0b3AsIEZJWFBfREJMIHdhcnBfZmFjdG9yKQotewotICBJTlQgcmVzdWx0PTA7Ci0gIC8qIHJlc3VsdCA9IDIqIChJTlQpICggKGRvdWJsZSliX3BfbyAqIChkb3VibGUpKEZES2xvZygoZG91YmxlKXN0b3AvKGRvdWJsZSlzdGFydCkvRkRLbG9nKChkb3VibGUpMikpICogKGRvdWJsZSlGWF9EQkwyRkwod2FycF9mYWN0b3IpICsgMC41KTsgKi8KLSAgcmVzdWx0ID0gKCAoIGJfcF9vICogZk11bHQoIChDYWxjTGRJbnQoc3RvcCkgLSBDYWxjTGRJbnQoc3RhcnQpKSwgIHdhcnBfZmFjdG9yKSArIChGTDJGWF9EQkwoMC41Zik+PkxEX0RBVEFfU0hJRlQpCi0gICAgICAgICAgICAgICApID4+ICgoREZSQUNUX0JJVFMtMSktTERfREFUQV9TSElGVCkgKSA8PCAxOyAvKiBkbyBub3Qgb3B0aW1pemUgYW55bW9yZSAocm91bmRpbmchISkgKi8KK3N0YXRpYyBJTlQgbnVtYmVyT2ZCYW5kcyhJTlQgYl9wX28sIElOVCBzdGFydCwgSU5UIHN0b3AsIEZJWFBfREJMIHdhcnBfZmFjdG9yKSB7CisgIElOVCByZXN1bHQgPSAwOworICAvKiByZXN1bHQgPSAyKiAoSU5UKSAoIChkb3VibGUpYl9wX28gKgorICAgKiAoZG91YmxlKShGREtsb2coKGRvdWJsZSlzdG9wLyhkb3VibGUpc3RhcnQpL0ZES2xvZygoZG91YmxlKTIpKSAqCisgICAqIChkb3VibGUpRlhfREJMMkZMKHdhcnBfZmFjdG9yKSArIDAuNSk7ICovCisgIHJlc3VsdCA9ICgoYl9wX28gKiBmTXVsdCgoQ2FsY0xkSW50KHN0b3ApIC0gQ2FsY0xkSW50KHN0YXJ0KSksIHdhcnBfZmFjdG9yKSArCisgICAgICAgICAgICAgKEZMMkZYX0RCTCgwLjVmKSA+PiBMRF9EQVRBX1NISUZUKSkgPj4KKyAgICAgICAgICAgICgoREZSQUNUX0JJVFMgLSAxKSAtIExEX0RBVEFfU0hJRlQpKQorICAgICAgICAgICA8PCAxOyAvKiBkbyBub3Qgb3B0aW1pemUgYW55bW9yZSAocm91bmRpbmchISkgKi8KIAotICByZXR1cm4ocmVzdWx0KTsKKyAgcmV0dXJuIChyZXN1bHQpOwogfQogCitzdGF0aWMgdm9pZCBDYWxjQmFuZHMoSU5UICpkaWZmLCBJTlQgc3RhcnQsIElOVCBzdG9wLCBJTlQgbnVtX2JhbmRzKSB7CisgIElOVCBpLCBxYiwgcWUsIHF0bXA7CisgIElOVCBwcmV2aW91czsKKyAgSU5UIGN1cnJlbnQ7CisgIEZJWFBfREJMIGJhc2UsIGV4cCwgdG1wOwogCi1zdGF0aWMgdm9pZAotQ2FsY0JhbmRzKElOVCAqIGRpZmYsIElOVCBzdGFydCAsIElOVCBzdG9wICwgSU5UIG51bV9iYW5kcykKLXsKLSAgICBJTlQgaSwgcWIsIHFlLCBxdG1wOwotICAgIElOVCBwcmV2aW91czsKLSAgICBJTlQgY3VycmVudDsKLSAgICBGSVhQX0RCTCBiYXNlLCBleHAsIHRtcDsKKyAgcHJldmlvdXMgPSBzdGFydDsKKyAgZm9yIChpID0gMTsgaSA8PSBudW1fYmFuZHM7IGkrKykgeworICAgIGJhc2UgPSBmRGl2Tm9ybSgoRklYUF9EQkwpc3RvcCwgKEZJWFBfREJMKXN0YXJ0LCAmcWIpOworICAgIGV4cCA9IGZEaXZOb3JtKChGSVhQX0RCTClpLCAoRklYUF9EQkwpbnVtX2JhbmRzLCAmcWUpOworICAgIHRtcCA9IGZQb3coYmFzZSwgcWIsIGV4cCwgcWUsICZxdG1wKTsKKyAgICB0bXAgPSBmTXVsdCh0bXAsIChGSVhQX0RCTCkoc3RhcnQgPDwgMjQpKTsKKyAgICBjdXJyZW50ID0gKElOVClzY2FsZVZhbHVlKHRtcCwgcXRtcCAtIDIzKTsKKyAgICBjdXJyZW50ID0gKGN1cnJlbnQgKyAxKSA+PiAxOyAvKiByb3VuZGluZyovCisgICAgZGlmZltpIC0gMV0gPSBjdXJyZW50IC0gcHJldmlvdXM7CisgICAgcHJldmlvdXMgPSBjdXJyZW50OworICB9CiAKLSAgICBwcmV2aW91cz1zdGFydDsKLSAgICBmb3IoaT0xOyBpPD0gbnVtX2JhbmRzOyBpKyspCi0gICAgewotICAgICAgICBiYXNlID0gZkRpdk5vcm0oKEZJWFBfREJMKXN0b3AsIChGSVhQX0RCTClzdGFydCwgJnFiKTsKLSAgICAgICAgZXhwID0gZkRpdk5vcm0oKEZJWFBfREJMKWksIChGSVhQX0RCTCludW1fYmFuZHMsICZxZSk7Ci0gICAgICAgIHRtcCA9IGZQb3coYmFzZSwgcWIsIGV4cCwgcWUsICZxdG1wKTsKLSAgICAgICAgdG1wID0gZk11bHQodG1wLCAoRklYUF9EQkwpKHN0YXJ0PDwyNCkpOwotICAgICAgICBjdXJyZW50ICAgPSAoSU5UKXNjYWxlVmFsdWUodG1wLCBxdG1wLTIzKTsKLSAgICAgICAgY3VycmVudCAgID0gKGN1cnJlbnQrMSkgPj4gMTsgLyogcm91bmRpbmcqLwotICAgICAgICBkaWZmW2ktMV0gPSBjdXJyZW50LXByZXZpb3VzOwotICAgICAgICBwcmV2aW91cyAgPSBjdXJyZW50OwotICAgIH0KK30gLyogRW5kIENhbGNCYW5kcyAqLwogCi19LyogRW5kIENhbGNCYW5kcyAqLwotCi0KLXN0YXRpYyB2b2lkCi1jdW1TdW0oSU5UIHN0YXJ0X3ZhbHVlLCBJTlQqIGRpZmYsIElOVCBsZW5ndGgsICBVQ0hBUiAqc3RhcnRfYWRyZXNzKQoteworc3RhdGljIHZvaWQgY3VtU3VtKElOVCBzdGFydF92YWx1ZSwgSU5UICpkaWZmLCBJTlQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIFVDSEFSICpzdGFydF9hZHJlc3MpIHsKICAgSU5UIGk7Ci0gIHN0YXJ0X2FkcmVzc1swXT1zdGFydF92YWx1ZTsKLSAgZm9yKGk9MTtpPD1sZW5ndGg7aSsrKQotICAgIHN0YXJ0X2FkcmVzc1tpXT1zdGFydF9hZHJlc3NbaS0xXStkaWZmW2ktMV07CisgIHN0YXJ0X2FkcmVzc1swXSA9IHN0YXJ0X3ZhbHVlOworICBmb3IgKGkgPSAxOyBpIDw9IGxlbmd0aDsgaSsrKQorICAgIHN0YXJ0X2FkcmVzc1tpXSA9IHN0YXJ0X2FkcmVzc1tpIC0gMV0gKyBkaWZmW2kgLSAxXTsKIH0gLyogRW5kIGN1bVN1bSAqLwogCitzdGF0aWMgSU5UIG1vZGlmeUJhbmRzKElOVCBtYXhfYmFuZF9wcmV2aW91cywgSU5UICpkaWZmLCBJTlQgbGVuZ3RoKSB7CisgIElOVCBjaGFuZ2UgPSBtYXhfYmFuZF9wcmV2aW91cyAtIGRpZmZbMF07CiAKLXN0YXRpYyBJTlQKLW1vZGlmeUJhbmRzKElOVCBtYXhfYmFuZF9wcmV2aW91cywgSU5UICogZGlmZiwgSU5UIGxlbmd0aCkKLXsKLSAgSU5UIGNoYW5nZT1tYXhfYmFuZF9wcmV2aW91cy1kaWZmWzBdOwotCi0gIC8qIExpbWl0IHRoZSBjaGFuZ2Ugc28gdGhhdCB0aGUgbGFzdCBiYW5kIGNhbm5vdCBnZXQgbmFycm93ZXIgdGhhbiB0aGUgZmlyc3Qgb25lICovCi0gIGlmICggY2hhbmdlID4gKGRpZmZbbGVuZ3RoLTFdIC0gZGlmZlswXSkgLyAyICkKLSAgICBjaGFuZ2UgPSAoZGlmZltsZW5ndGgtMV0gLSBkaWZmWzBdKSAvIDI7CisgIC8qIExpbWl0IHRoZSBjaGFuZ2Ugc28gdGhhdCB0aGUgbGFzdCBiYW5kIGNhbm5vdCBnZXQgbmFycm93ZXIgdGhhbiB0aGUgZmlyc3QKKyAgICogb25lICovCisgIGlmIChjaGFuZ2UgPiAoZGlmZltsZW5ndGggLSAxXSAtIGRpZmZbMF0pIC8gMikKKyAgICBjaGFuZ2UgPSAoZGlmZltsZW5ndGggLSAxXSAtIGRpZmZbMF0pIC8gMjsKIAogICBkaWZmWzBdICs9IGNoYW5nZTsKLSAgZGlmZltsZW5ndGgtMV0gLT0gY2hhbmdlOworICBkaWZmW2xlbmd0aCAtIDFdIC09IGNoYW5nZTsKICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoZGlmZiwgbGVuZ3RoKTsKIAotICByZXR1cm4oMCk7Ci19LyogRW5kIG1vZGlmeUJhbmRzICovCi0KKyAgcmV0dXJuICgwKTsKK30gLyogRW5kIG1vZGlmeUJhbmRzICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX1VwZGF0ZUhpUmVzCkBAIC02MTYsNDMgKzYxMiwzNCBAQAogCiAgUmV0dXJuOgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19VcGRhdGVIaVJlcygKLSAgICAgICAgVUNIQVIgICAqaF9oaXJlcywKLSAgICAgICAgSU5UICAgICAqbnVtX2hpcmVzLAotICAgICAgICBVQ0hBUiAgICp2X2tfbWFzdGVyLAotICAgICAgICBJTlQgICAgICBudW1fbWFzdGVyLAotICAgICAgICBJTlQgICAgICp4b3Zlcl9iYW5kCi0gICAgICAgICkKLXsKK0lOVCBGREtzYnJFbmNfVXBkYXRlSGlSZXMoVUNIQVIgKmhfaGlyZXMsIElOVCAqbnVtX2hpcmVzLCBVQ0hBUiAqdl9rX21hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bV9tYXN0ZXIsIElOVCAqeG92ZXJfYmFuZCkgewogICBJTlQgaTsKLSAgSU5UIG1heDEsbWF4MjsKKyAgSU5UIG1heDEsIG1heDI7CiAKLSAgaWYoICh2X2tfbWFzdGVyWyp4b3Zlcl9iYW5kXSA+IDMyICkgfHwgLyogdl9rX21hc3RlclsqeG92ZXJfYmFuZF0gPiBub1FNRkNoYW5uZWxzKGR1YWxSYXRlKS9kaXZpZGVyICovCi0gICAgICAoICp4b3Zlcl9iYW5kID4gbnVtX21hc3RlciApICkgIHsKLSAgICAgIC8qIHhvdmVyX2JhbmQgZXJyb3IsIHRvbyBiaWcgZm9yIHRoaXMgc3RhcnRGcmVxLiBXaWxsIGJlIGNsaXBwZWQgKi8KKyAgaWYgKCh2X2tfbWFzdGVyWyp4b3Zlcl9iYW5kXSA+CisgICAgICAgMzIpIHx8IC8qIHZfa19tYXN0ZXJbKnhvdmVyX2JhbmRdID4gbm9RTUZDaGFubmVscyhkdWFsUmF0ZSkvZGl2aWRlciAqLworICAgICAgKCp4b3Zlcl9iYW5kID4gbnVtX21hc3RlcikpIHsKKyAgICAvKiB4b3Zlcl9iYW5kIGVycm9yLCB0b28gYmlnIGZvciB0aGlzIHN0YXJ0RnJlcS4gV2lsbCBiZSBjbGlwcGVkICovCiAKICAgICAvKiBDYWxjdWxhdGUgbWF4aW11bSB2YWx1ZSBmb3IgeG92ZXJfYmFuZCAqLwotICAgIG1heDE9MDsKLSAgICBtYXgyPW51bV9tYXN0ZXI7Ci0gICAgd2hpbGUoICh2X2tfbWFzdGVyW21heDErMV0gPCAzMiApICYmIC8qIG5vUU1GQ2hhbm5lbHMoZHVhbFJhdGUpL2RpdmlkZXIgKi8KLSAgICAgICAgICAgKCAobWF4MSsxKSA8IG1heDIpICkKLSAgICAgIHsKLSAgICAgICAgbWF4MSsrOwotICAgICAgfQorICAgIG1heDEgPSAwOworICAgIG1heDIgPSBudW1fbWFzdGVyOworICAgIHdoaWxlICgodl9rX21hc3RlclttYXgxICsgMV0gPCAzMikgJiYgLyogbm9RTUZDaGFubmVscyhkdWFsUmF0ZSkvZGl2aWRlciAqLworICAgICAgICAgICAoKG1heDEgKyAxKSA8IG1heDIpKSB7CisgICAgICBtYXgxKys7CisgICAgfQogCi0gICAgKnhvdmVyX2JhbmQ9bWF4MTsKKyAgICAqeG92ZXJfYmFuZCA9IG1heDE7CiAgIH0KIAogICAqbnVtX2hpcmVzID0gbnVtX21hc3RlciAtICp4b3Zlcl9iYW5kOwotICBmb3IoaSA9ICp4b3Zlcl9iYW5kOyBpIDw9IG51bV9tYXN0ZXI7IGkrKykKLSAgICB7Ci0gICAgICBoX2hpcmVzW2kgLSAqeG92ZXJfYmFuZF0gPSB2X2tfbWFzdGVyW2ldOwotICAgIH0KKyAgZm9yIChpID0gKnhvdmVyX2JhbmQ7IGkgPD0gbnVtX21hc3RlcjsgaSsrKSB7CisgICAgaF9oaXJlc1tpIC0gKnhvdmVyX2JhbmRdID0gdl9rX21hc3RlcltpXTsKKyAgfQogCiAgIHJldHVybiAoMCk7Ci19LyogRW5kIEZES3NickVuY19VcGRhdGVIaVJlcyAqLwotCit9IC8qIEVuZCBGREtzYnJFbmNfVXBkYXRlSGlSZXMgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfVXBkYXRlTG9SZXMKQEAgLTY2MywyOSArNjUwLDI1IEBACiAKICBSZXR1cm46CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLUZES3NickVuY19VcGRhdGVMb1JlcyhVQ0hBUiAqIGhfbG9yZXMsIElOVCAqbnVtX2xvcmVzLCBVQ0hBUiAqIGhfaGlyZXMsIElOVCBudW1faGlyZXMpCi17Cit2b2lkIEZES3NickVuY19VcGRhdGVMb1JlcyhVQ0hBUiAqaF9sb3JlcywgSU5UICpudW1fbG9yZXMsIFVDSEFSICpoX2hpcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bV9oaXJlcykgewogICBJTlQgaTsKIAotICBpZihudW1faGlyZXMlMiA9PSAwKSAvKiBpZiBldmVuIG51bWJlciBvZiBoaXJlcyBiYW5kcyAqLwotICAgIHsKLSAgICAgICpudW1fbG9yZXM9bnVtX2hpcmVzLzI7Ci0gICAgICAvKiBVc2UgZXZlcnkgc2Vjb25kIGxvcmVzPWhpcmVzWzAsMiw0Li4uXSAqLwotICAgICAgZm9yKGk9MDtpPD0qbnVtX2xvcmVzO2krKykKLSAgICAgICAgaF9sb3Jlc1tpXT1oX2hpcmVzW2kqMl07CisgIGlmIChudW1faGlyZXMgJSAyID09IDApIC8qIGlmIGV2ZW4gbnVtYmVyIG9mIGhpcmVzIGJhbmRzICovCisgIHsKKyAgICAqbnVtX2xvcmVzID0gbnVtX2hpcmVzIC8gMjsKKyAgICAvKiBVc2UgZXZlcnkgc2Vjb25kIGxvcmVzPWhpcmVzWzAsMiw0Li4uXSAqLworICAgIGZvciAoaSA9IDA7IGkgPD0gKm51bV9sb3JlczsgaSsrKSBoX2xvcmVzW2ldID0gaF9oaXJlc1tpICogMl07CiAKKyAgfSBlbHNlIC8qIG9kZCBudW1iZXIgb2YgaGlyZXMgd2hpY2ggbWVhbnMgeG92ZXIgaXMgb2RkICovCisgIHsKKyAgICAqbnVtX2xvcmVzID0gKG51bV9oaXJlcyArIDEpIC8gMjsKKworICAgIC8qIFVzZSBsb3Jlcz1oaXJlc1swLDEsMyw1IC4uLl0gKi8KKyAgICBoX2xvcmVzWzBdID0gaF9oaXJlc1swXTsKKyAgICBmb3IgKGkgPSAxOyBpIDw9ICpudW1fbG9yZXM7IGkrKykgeworICAgICAgaF9sb3Jlc1tpXSA9IGhfaGlyZXNbaSAqIDIgLSAxXTsKICAgICB9Ci0gIGVsc2UgICAgICAgICAgICAvKiBvZGQgbnVtYmVyIG9mIGhpcmVzIHdoaWNoIG1lYW5zIHhvdmVyIGlzIG9kZCAqLwotICAgIHsKLSAgICAgICpudW1fbG9yZXM9KG51bV9oaXJlcysxKS8yOworICB9CiAKLSAgICAgIC8qIFVzZSBsb3Jlcz1oaXJlc1swLDEsMyw1IC4uLl0gKi8KLSAgICAgIGhfbG9yZXNbMF09aF9oaXJlc1swXTsKLSAgICAgIGZvcihpPTE7aTw9Km51bV9sb3JlcztpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBoX2xvcmVzW2ldPWhfaGlyZXNbaSoyLTFdOwotICAgICAgICB9Ci0gICAgfQotCi19LyogRW5kIEZES3NickVuY19VcGRhdGVMb1JlcyAqLworfSAvKiBFbmQgRkRLc2JyRW5jX1VwZGF0ZUxvUmVzICovCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3NicmVuY19mcmVxX3NjYS5oIGIvbGliU0JSZW5jL3NyYy9zYnJlbmNfZnJlcV9zY2EuaAppbmRleCA2ZjJiYjg0Li45YjhkMzYwIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3NicmVuY19mcmVxX3NjYS5oCisrKyBiL2xpYlNCUmVuYy9zcmMvc2JyZW5jX2ZyZXFfc2NhLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNTkgKzkwLDQzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgZnJlcXVlbmN5IHNjYWxlIHByb3RvdHlwZXMgIAorICBcYnJpZWYgIGZyZXF1ZW5jeSBzY2FsZSBwcm90b3R5cGVzICRSZXZpc2lvbjogOTI3OTAgJAogKi8KLSNpZm5kZWYgX19GUkVRX1NDQTJfSAotI2RlZmluZSBfX0ZSRVFfU0NBMl9ICisjaWZuZGVmIFNCUkVOQ19GUkVRX1NDQV9ICisjZGVmaW5lIFNCUkVOQ19GUkVRX1NDQV9ICiAKICNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgogI2luY2x1ZGUgInNicl9kZWYuaCIKIAotI2RlZmluZSBNQVhfT0NUQVZFICAgICAgICAyOQorI2RlZmluZSBNQVhfT0NUQVZFIDI5CiAjZGVmaW5lIE1BWF9TRUNPTkRfUkVHSU9OIDUwCiAKK0lOVCBGREtzYnJFbmNfVXBkYXRlRnJlcVNjYWxlKFVDSEFSICp2X2tfbWFzdGVyLCBJTlQgKmhfbnVtX2JhbmRzLCBjb25zdCBJTlQgazAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgazIsIGNvbnN0IElOVCBmcmVxX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGFsdGVyX3NjYWxlKTsKIAotSU5UCi1GREtzYnJFbmNfVXBkYXRlRnJlcVNjYWxlKAotICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwKLSAgICAgICAgSU5UICAgKmhfbnVtX2JhbmRzLAotICAgICAgICBjb25zdCAgSU5UIGswLAotICAgICAgICBjb25zdCAgSU5UIGsyLAotICAgICAgICBjb25zdCAgSU5UIGZyZXFfc2NhbGUsCi0gICAgICAgIGNvbnN0ICBJTlQgYWx0ZXJfc2NhbGUKLSAgICAgICAgKTsKK0lOVCBGREtzYnJFbmNfVXBkYXRlSGlSZXMoVUNIQVIgKmhfaGlyZXMsIElOVCAqbnVtX2hpcmVzLCBVQ0hBUiAqdl9rX21hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bV9tYXN0ZXIsIElOVCAqeG92ZXJfYmFuZCk7CiAKLUlOVAotRkRLc2JyRW5jX1VwZGF0ZUhpUmVzKAotICAgICAgICBVQ0hBUiAqaF9oaXJlcywKLSAgICAgICAgSU5UICAgKm51bV9oaXJlcywKLSAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsCi0gICAgICAgIElOVCAgICBudW1fbWFzdGVyLAotICAgICAgICBJTlQgICAqeG92ZXJfYmFuZAotICAgICAgICApOwordm9pZCBGREtzYnJFbmNfVXBkYXRlTG9SZXMoVUNIQVIgKnZfbG9yZXMsIElOVCAqbnVtX2xvcmVzLCBVQ0hBUiAqdl9oaXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1faGlyZXMpOwogCi12b2lkICBGREtzYnJFbmNfVXBkYXRlTG9SZXMoCi0gICAgICAgIFVDSEFSICp2X2xvcmVzLAotICAgICAgICBJTlQgICAqbnVtX2xvcmVzLAotICAgICAgICBVQ0hBUiAqdl9oaXJlcywKLSAgICAgICAgSU5UICAgIG51bV9oaXJlcwotICAgICAgICApOworSU5UIEZES3NickVuY19GaW5kU3RhcnRBbmRTdG9wQmFuZChjb25zdCBJTlQgc3JTYnIsIGNvbnN0IElOVCBzckNvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBub0NoYW5uZWxzLCBjb25zdCBJTlQgc3RhcnRGcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RvcF9mcmVxLCBJTlQgKmswLCBJTlQgKmsyKTsKIAotSU5UCi1GREtzYnJFbmNfRmluZFN0YXJ0QW5kU3RvcEJhbmQoCi0gICAgICAgIGNvbnN0IElOVCBzclNiciwKLSAgICAgICAgY29uc3QgSU5UIHNyQ29yZSwKLSAgICAgICAgY29uc3QgSU5UIG5vQ2hhbm5lbHMsCi0gICAgICAgIGNvbnN0IElOVCBzdGFydEZyZXEsCi0gICAgICAgIGNvbnN0IElOVCBzdG9wX2ZyZXEsCi0gICAgICAgIElOVCAqazAsCi0gICAgICAgIElOVCAqazIKLSAgICAgICAgKTsKLQotSU5UIEZES3NickVuY19nZXRTYnJTdGFydEZyZXFSQVcgKElOVCBzdGFydEZyZXEsIElOVCBmc0NvcmUpOwotSU5UIEZES3NickVuY19nZXRTYnJTdG9wRnJlcVJBVyAgKElOVCBzdG9wRnJlcSwgSU5UIGZzQ29yZSk7CitJTlQgRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVyhJTlQgc3RhcnRGcmVxLCBJTlQgZnNDb3JlKTsKK0lOVCBGREtzYnJFbmNfZ2V0U2JyU3RvcEZyZXFSQVcoSU5UIHN0b3BGcmVxLCBJTlQgZnNDb3JlKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9zYnJlbmNfcmFtLmNwcCBiL2xpYlNCUmVuYy9zcmMvc2JyZW5jX3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzMGZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNCUmVuYy9zcmMvc2JyZW5jX3JhbS5jcHAKQEAgLTAsMCArMSwyNDkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiBNZW1vcnkgbGF5b3V0CisgICRSZXZpc2lvbjogOTI4NjQgJAorCisgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIGFsbCBzdGF0aWMgYW5kIGR5bmFtaWMgbWVtb3J5IHNwYWNlcworKi8KKyNpbmNsdWRlICJzYnJlbmNfcmFtLmgiCisKKyNpbmNsdWRlICJzYnIuaCIKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCitDX0FBTExPQ19NRU0oUmFtX1NickR5bmFtaWNfUkFNLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAoKFNCUl9FTkNfRFlOX1JBTV9TSVpFKSAvIHNpemVvZihGSVhQX0RCTCkpKQorCisvKiEKKyAgXG5hbWUgU3RhdGljU2JyRGF0YQorCisgIFN0YXRpYyBtZW1vcnkgYXJlYXMsIG11c3Qgbm90IGJlIG92ZXJ3cml0dGVuIGluIG90aGVyIHNlY3Rpb25zIG9mIHRoZSBlbmNvZGVyCisqLworLyogQHsgKi8KKworLyohIHN0YXRpYyBzYnIgZW5jb2RlciBpbnN0YW5jZSBmb3Igb25lIGVuY29kZXIgKDIgY2hhbm5lbHMpCisgIGFsbCBtYWpvciBzdGF0aWMgYW5kIGR5bmFtaWMgbWVtb3J5IGFyZWFzIGFyZSBsb2NhdGVkCisgIGluIG1vZHVsZSBzYnJfcmFtIGFuZCBzYnIgcm9tCisqLworQ19BTExPQ19NRU0oUmFtX1NickVuY29kZXIsIFNCUl9FTkNPREVSLCAxKQorQ19BTExPQ19NRU0yKFJhbV9TYnJDaGFubmVsLCBTQlJfQ0hBTk5FTCwgMSwgKDgpKQorQ19BTExPQ19NRU0yKFJhbV9TYnJFbGVtZW50LCBTQlJfRUxFTUVOVCwgMSwgKDgpKQorCisvKiEgRmlsdGVyIHN0YXRlcyBmb3IgUU1GLWFuYWx5c2lzLiA8YnI+CisgIERpbWVuc2lvbjogI01BWE5SU0JSQ0hBTk5FTFMgKiAjU0JSX1FNRl9GSUxURVJfTEVOR1RICisqLworQ19BQUxMT0NfTUVNMl9MKFJhbV9TYnJfUW1mU3RhdGVzQW5hbHlzaXMsIEZJWFBfUUFTLCA2NDAsICg4KSwgU0VDVF9EQVRBX0wxKQorCisvKiEgTWF0cml4IGhvbGRpbmcgdGhlIHF1b3RhIHZhbHVlcyBmb3IgYWxsIGVzdGltYXRlcywgYWxsIGNoYW5uZWxzCisgIERpbWVuc2lvbiAjTUFYTlJTQlJDSEFOTkVMUyAqICsjU0JSX1FNRl9DSEFOTkVMUyogI01BWF9OT19PRl9FU1RJTUFURVMKKyovCitDX0FMTE9DX01FTTJfTChSYW1fU2JyX3F1b3RhTWF0cml4LCBGSVhQX0RCTCwgKE1BWF9OT19PRl9FU1RJTUFURVMgKiA2NCksICg4KSwKKyAgICAgICAgICAgICAgIFNFQ1RfREFUQV9MMSkKKworLyohIE1hdHJpeCBob2xkaW5nIHRoZSBzaWduIHZhbHVlcyBmb3IgYWxsIGVzdGltYXRlcywgYWxsIGNoYW5uZWxzCisgIERpbWVuc2lvbiAjTUFYTlJTQlJDSEFOTkVMUyAqICsjU0JSX1FNRl9DSEFOTkVMUyogI01BWF9OT19PRl9FU1RJTUFURVMKKyovCitDX0FMTE9DX01FTTIoUmFtX1Nicl9zaWduTWF0cml4LCBJTlQsIChNQVhfTk9fT0ZfRVNUSU1BVEVTICogNjQpLCAoOCkpCisKKy8qISBGcmVxdWVuY3kgYmFuZCB0YWJsZSAobG93IHJlcykgPGJyPgorICBEaW1lbnNpb24gI01BWF9GUkVRX0NPRUZGUy8yKzEKKyovCitDX0FMTE9DX01FTTIoUmFtX1Nicl9mcmVxQmFuZFRhYmxlTE8sIFVDSEFSLCAoTUFYX0ZSRVFfQ09FRkZTIC8gMiArIDEpLCAoOCkpCisKKy8qISBGcmVxdWVuY3kgYmFuZCB0YWJsZSAoaGlnaCByZXMpIDxicj4KKyAgRGltZW5zaW9uICNNQVhfRlJFUV9DT0VGRlMgKzEKKyovCitDX0FMTE9DX01FTTIoUmFtX1Nicl9mcmVxQmFuZFRhYmxlSEksIFVDSEFSLCAoTUFYX0ZSRVFfQ09FRkZTICsgMSksICg4KSkKKworLyohIHZrIG1hdHNlciB0YWJsZSA8YnI+CisgIERpbWVuc2lvbiAjTUFYX0ZSRVFfQ09FRkZTICsxCisqLworQ19BTExPQ19NRU0yKFJhbV9TYnJfdl9rX21hc3RlciwgVUNIQVIsIChNQVhfRlJFUV9DT0VGRlMgKyAxKSwgKDgpKQorCisvKgorICBNaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rpb24KKyovCisKKy8qISBzYnJfZGV0ZWN0aW9uVmVjdG9ycyA8YnI+CisgIERpbWVuc2lvbiAjTUFYX05VTV9DSEFOTkVMUyojTUFYX05PX09GX0VTVElNQVRFUyojTUFYX0ZSRVFfQ09FRkZTXQorKi8KK0NfQUxMT0NfTUVNMihSYW1fU2JyX2RldGVjdGlvblZlY3RvcnMsIFVDSEFSLAorICAgICAgICAgICAgIChNQVhfTk9fT0ZfRVNUSU1BVEVTICogTUFYX0ZSRVFfQ09FRkZTKSwgKDgpKQorCisvKiEgc2JyX3ByZXZDb21wVmVjWyA8YnI+CisgIERpbWVuc2lvbiAjTUFYX05VTV9DSEFOTkVMUyojTUFYX0ZSRVFfQ09FRkZTXQorKi8KK0NfQUxMT0NfTUVNMihSYW1fU2JyX3ByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbiwgVUNIQVIsIE1BWF9GUkVRX0NPRUZGUywgKDgpKQorLyohIHNicl9ndWlkZVNjZmJbIDxicj4KKyAgRGltZW5zaW9uICNNQVhfTlVNX0NIQU5ORUxTKiNNQVhfRlJFUV9DT0VGRlNdCisqLworQ19BTExPQ19NRU0yKFJhbV9TYnJfZ3VpZGVTY2ZiLCBVQ0hBUiwgTUFYX0ZSRVFfQ09FRkZTLCAoOCkpCisKKy8qISBzYnJfZ3VpZGVWZWN0b3JEZXRlY3RlZCA8YnI+CisgIERpbWVuc2lvbiAjTUFYX05VTV9DSEFOTkVMUyojTUFYX05PX09GX0VTVElNQVRFUyojTUFYX0ZSRVFfQ09FRkZTXQorKi8KK0NfQUxMT0NfTUVNMihSYW1fU2JyX2d1aWRlVmVjdG9yRGV0ZWN0ZWQsIFVDSEFSLAorICAgICAgICAgICAgIChNQVhfTk9fT0ZfRVNUSU1BVEVTICogTUFYX0ZSRVFfQ09FRkZTKSwgKDgpKQorQ19BTExPQ19NRU0yKFJhbV9TYnJfZ3VpZGVWZWN0b3JEaWZmLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAoTUFYX05PX09GX0VTVElNQVRFUyAqIE1BWF9GUkVRX0NPRUZGUyksICg4KSkKK0NfQUxMT0NfTUVNMihSYW1fU2JyX2d1aWRlVmVjdG9yT3JpZywgRklYUF9EQkwsCisgICAgICAgICAgICAgKE1BWF9OT19PRl9FU1RJTUFURVMgKiBNQVhfRlJFUV9DT0VGRlMpLCAoOCkpCisKKy8qCisgIFN0YXRpYyBQYXJhbWV0cmljIFN0ZXJlbyBtZW1vcnkKKyovCitDX0FBTExPQ19NRU1fTChSYW1fUHNRbWZTdGF0ZXNTeW50aGVzaXMsIEZJWFBfREJMLCA2NDAgLyAyLCBTRUNUX0RBVEFfTDEpCisKK0NfQUxMT0NfTUVNX0woUmFtX1BzRW5jb2RlLCBQU19FTkNPREUsIDEsIFNFQ1RfREFUQV9MMSkKK0NfQUxMT0NfTUVNKFJhbV9QYXJhbVN0ZXJlbywgUEFSQU1FVFJJQ19TVEVSRU8sIDEpCisKKy8qIEB9ICovCisKKy8qIQorICBcbmFtZSBEeW5hbWljU2JyRGF0YQorCisgIER5bmFtaWMgbWVtb3J5IGFyZWFzLCBtaWdodCBiZSByZXVzZWQgaW4gb3RoZXIgYWxnb3JpdGhtIHNlY3Rpb25zLAorICBlLmcuIHRoZSBjb3JlIGVuY29kZXIuCisqLworLyogQHsgKi8KKworLyohIEVuZXJneSBidWZmZXIgZm9yIGVudmVsb3BlIGV4dHJhY3Rpb24gPGJyPgorICBEaW1lbnNpb24gI01BWE5SU0JSQ0hBTk5FTFMgKiArI1NCUl9RTUZfU0xPVFMgKiAgI1NCUl9RTUZfQ0hBTk5FTFMKKyovCitDX0FMTE9DX01FTTIoUmFtX1Nicl9lbnZZQnVmZmVyLCBGSVhQX0RCTCwgKDMyIC8gMiAqIDY0KSwgKDgpKQorCitGSVhQX0RCTCogR2V0UmFtX1Nicl9lbnZZQnVmZmVyKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pIHsKKyAgRkRLX0FTU0VSVChkeW5hbWljX1JBTSAhPSAwKTsKKyAgLyogVGhlIHJlaW50ZXJwcmV0X2Nhc3QgaXMgdXNlZCB0byBzdXBwcmVzcyBhIGNvbXBpbGVyIHdhcm5pbmcuIFdlIGtub3cgdGhhdAorICAgKiAoZHluYW1pY19SQU0gKyBPRkZTRVRfTlJHICsgKG4qWV8yX0JVRl9CWVRFKSkgaXMgc3VmZmljaWVudGx5IGFsaWduZWQsIHNvCisgICAqIHRoZSBjYXN0IGlzIHNhZmUgKi8KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RklYUF9EQkwqPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGR5bmFtaWNfUkFNICsgT0ZGU0VUX05SRyArIChuICogWV8yX0JVRl9CWVRFKSkpOworfQorCisvKgorICogUU1GIGRhdGEKKyAqLworLyogVGhlIFNCUiBlbmNvZGVyIHVzZXMgYSBzaW5nbGUgY2hhbm5lbCBvdmVybGFwcGluZyBidWZmZXIgc2V0IChhbHdheXMgbj0wKSwKKyAqIGJ1dCBQUyBkb2VzIG5vdC4gKi8KK0ZJWFBfREJMKiBHZXRSYW1fU2JyX2VudlJCdWZmZXIoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSkgeworICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNICE9IDApOworICAvKiBUaGUgcmVpbnRlcnByZXRfY2FzdCBpcyB1c2VkIHRvIHN1cHByZXNzIGEgY29tcGlsZXIgd2FybmluZy4gV2Uga25vdyB0aGF0CisgICAqIChkeW5hbWljX1JBTSArIE9GRlNFVF9RTUYgKyAobiooRU5WX1JfQlVGRl9CWVRFK0VOVl9JX0JVRkZfQllURSkpKSBpcworICAgKiBzdWZmaWNpZW50bHkgYWxpZ25lZCwgc28gdGhlIGNhc3QgaXMgc2FmZSAqLworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGSVhQX0RCTCo+KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KAorICAgICAgZHluYW1pY19SQU0gKyBPRkZTRVRfUU1GICsgKG4gKiAoRU5WX1JfQlVGRl9CWVRFICsgRU5WX0lfQlVGRl9CWVRFKSkpKTsKK30KK0ZJWFBfREJMKiBHZXRSYW1fU2JyX2VudklCdWZmZXIoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSkgeworICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNICE9IDApOworICAvKiBUaGUgcmVpbnRlcnByZXRfY2FzdCBpcyB1c2VkIHRvIHN1cHByZXNzIGEgY29tcGlsZXIgd2FybmluZy4gV2Uga25vdyB0aGF0CisgICAqIChkeW5hbWljX1JBTSArIE9GRlNFVF9RTUYgKyAoRU5WX1JfQlVGRl9CWVRFKSArCisgICAqIChuKihFTlZfUl9CVUZGX0JZVEUrRU5WX0lfQlVGRl9CWVRFKSkpIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLCBzbyB0aGUgY2FzdAorICAgKiBpcyBzYWZlICovCisgIHJldHVybiByZWludGVycHJldF9jYXN0PEZJWFBfREJMKj4oCisgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihkeW5hbWljX1JBTSArIE9GRlNFVF9RTUYgKyAoRU5WX1JfQlVGRl9CWVRFKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobiAqIChFTlZfUl9CVUZGX0JZVEUgKyBFTlZfSV9CVUZGX0JZVEUpKSkpOworfQorCisvKiBAfSAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9zYnJlbmNfcmFtLmggYi9saWJTQlJlbmMvc3JjL3NicmVuY19yYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjIzMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0JSZW5jL3NyYy9zYnJlbmNfcmFtLmgKQEAgLTAsMCArMSwxOTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyohCitcZmlsZQorXGJyaWVmIE1lbW9yeSBsYXlvdXQKKyRSZXZpc2lvbjogOTI3OTAgJAorKi8KKyNpZm5kZWYgU0JSRU5DX1JBTV9ICisjZGVmaW5lIFNCUkVOQ19SQU1fSAorCisjaW5jbHVkZSAic2JyX2RlZi5oIgorI2luY2x1ZGUgImVudl9lc3QuaCIKKyNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgorI2luY2x1ZGUgInNici5oIgorCisjaW5jbHVkZSAicHNfbWFpbi5oIgorI2luY2x1ZGUgInBzX2VuY29kZS5oIgorCisjZGVmaW5lIEVOVl9UUkFOU0lFTlRTX0JZVEUgKChzaXplb2YoRklYUF9EQkwpICogKE1BWF9OVU1fQ0hBTk5FTFMgKiAzICogMzIpKSkKKworI2RlZmluZSBFTlZfUl9CVUZGX0JZVEUgKChzaXplb2YoRklYUF9EQkwpICogKCgzMikgKiBNQVhfSFlCUklEX0JBTkRTKSkpCisjZGVmaW5lIEVOVl9JX0JVRkZfQllURSAoKHNpemVvZihGSVhQX0RCTCkgKiAoKDMyKSAqIE1BWF9IWUJSSURfQkFORFMpKSkKKyNkZWZpbmUgWV9CVUZfQ0hfQllURSBcCisgICgoMiAqIHNpemVvZihGSVhQX0RCTCkgKiAoKCgzMikgLSAoMzIgLyAyKSkgKiBNQVhfSFlCUklEX0JBTkRTKSkpCisKKyNkZWZpbmUgRU5WX1JfQlVGX1BTX0JZVEUgKChzaXplb2YoRklYUF9EQkwpICogMzIgKiA2NCAvIDIpKQorI2RlZmluZSBFTlZfSV9CVUZfUFNfQllURSAoKHNpemVvZihGSVhQX0RCTCkgKiAzMiAqIDY0IC8gMikpCisKKyNkZWZpbmUgVE9OX0JVRl9DSF9CWVRFIFwKKyAgKChzaXplb2YoRklYUF9EQkwpICogKE1BWF9OT19PRl9FU1RJTUFURVMgKiBNQVhfRlJFUV9DT0VGRlMpKSkKKworI2RlZmluZSBZXzJfQlVGX0JZVEUgKFlfQlVGX0NIX0JZVEUpCisKKy8qIFdvcmtidWZmZXIgUkFNIC0gQWxsb2NhdGlvbiAqLworLyoKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgfCAgICAgICAgT0ZGU0VUX1FNRiAgICAgICB8ICAgICAgICBPRkZTRVRfTlJHICAgICAgfAorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgMC41ICogICAgICAgICAgfAorIHwgICAgIHNicl9lbnZSQnVmZmVyICAgICAgfCBzYnJfZW52WUJ1ZmZlcl9zaXplICAgIHwKKyB8ICAgICBzYnJfZW52SUJ1ZmZlciAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqLworI2RlZmluZSBCVUZfTlJHX1NJWkUgKChNQVhfTlVNX0NIQU5ORUxTICogWV8yX0JVRl9CWVRFKSkKKyNkZWZpbmUgQlVGX1FNRl9TSVpFIChFTlZfUl9CVUZGX0JZVEUgKyBFTlZfSV9CVUZGX0JZVEUpCisKKy8qIFNpemUgb2YgdGhlIHNoYXJlYWJsZSBtZW1vcnkgcmVnaW9uIHRoYW4gY2FuIGJlIHJldXNlZCAqLworI2RlZmluZSBTQlJfRU5DX0RZTl9SQU1fU0laRSAoQlVGX1FNRl9TSVpFICsgQlVGX05SR19TSVpFKQorCisjZGVmaW5lIE9GRlNFVF9RTUYgKDApCisjZGVmaW5lIE9GRlNFVF9OUkcgKE9GRlNFVF9RTUYgKyBCVUZfUU1GX1NJWkUpCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitIX0FMTE9DX01FTShSYW1fU2JyRHluYW1pY19SQU0sIEZJWFBfREJMKQorCitIX0FMTE9DX01FTShSYW1fU2JyRW5jb2RlciwgU0JSX0VOQ09ERVIpCitIX0FMTE9DX01FTShSYW1fU2JyQ2hhbm5lbCwgU0JSX0NIQU5ORUwpCitIX0FMTE9DX01FTShSYW1fU2JyRWxlbWVudCwgU0JSX0VMRU1FTlQpCisKK0hfQUxMT0NfTUVNKFJhbV9TYnJfcXVvdGFNYXRyaXgsIEZJWFBfREJMKQorSF9BTExPQ19NRU0oUmFtX1Nicl9zaWduTWF0cml4LCBJTlQpCisKK0hfQUxMT0NfTUVNKFJhbV9TYnJfUW1mU3RhdGVzQW5hbHlzaXMsIEZJWFBfUUFTKQorCitIX0FMTE9DX01FTShSYW1fU2JyX2ZyZXFCYW5kVGFibGVMTywgVUNIQVIpCitIX0FMTE9DX01FTShSYW1fU2JyX2ZyZXFCYW5kVGFibGVISSwgVUNIQVIpCitIX0FMTE9DX01FTShSYW1fU2JyX3Zfa19tYXN0ZXIsIFVDSEFSKQorCitIX0FMTE9DX01FTShSYW1fU2JyX2RldGVjdGlvblZlY3RvcnMsIFVDSEFSKQorSF9BTExPQ19NRU0oUmFtX1Nicl9wcmV2RW52ZWxvcGVDb21wZW5zYXRpb24sIFVDSEFSKQorSF9BTExPQ19NRU0oUmFtX1Nicl9ndWlkZVNjZmIsIFVDSEFSKQorSF9BTExPQ19NRU0oUmFtX1Nicl9ndWlkZVZlY3RvckRldGVjdGVkLCBVQ0hBUikKKworLyogRHluYW1pYyBNZW1vcnkgQWxsb2NhdGlvbiAqLworCitIX0FMTE9DX01FTShSYW1fU2JyX2VudllCdWZmZXIsIEZJWFBfREJMKQorRklYUF9EQkwqIEdldFJhbV9TYnJfZW52WUJ1ZmZlcihpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKTsKK0ZJWFBfREJMKiBHZXRSYW1fU2JyX2VudlJCdWZmZXIoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7CitGSVhQX0RCTCogR2V0UmFtX1Nicl9lbnZJQnVmZmVyKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pOworCitIX0FMTE9DX01FTShSYW1fU2JyX2d1aWRlVmVjdG9yRGlmZiwgRklYUF9EQkwpCitIX0FMTE9DX01FTShSYW1fU2JyX2d1aWRlVmVjdG9yT3JpZywgRklYUF9EQkwpCisKK0hfQUxMT0NfTUVNKFJhbV9Qc1FtZlN0YXRlc1N5bnRoZXNpcywgRklYUF9EQkwpCisKK0hfQUxMT0NfTUVNKFJhbV9Qc0VuY29kZSwgUFNfRU5DT0RFKQorCitGSVhQX0RCTCogRkRLc2JyRW5jX1NsaWNlUmFtX1BzUnFtZihGSVhQX0RCTCogclFtZkRhdGEsIFVDSEFSKiBkeW5hbWljX1JBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgaSwgaW50IHFtZlNsb3RzKTsKK0ZJWFBfREJMKiBGREtzYnJFbmNfU2xpY2VSYW1fUHNJcW1mKEZJWFBfREJMKiBpUW1mRGF0YSwgVUNIQVIqIGR5bmFtaWNfUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCBpLCBpbnQgcW1mU2xvdHMpOworCitIX0FMTE9DX01FTShSYW1fUGFyYW1TdGVyZW8sIFBBUkFNRVRSSUNfU1RFUkVPKQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3NicmVuY19yb20uY3BwIGIvbGliU0JSZW5jL3NyYy9zYnJlbmNfcm9tLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzdhZmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0JSZW5jL3NyYy9zYnJlbmNfcm9tLmNwcApAQCAtMCwwICsxLDkxMCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgVG9iaWFzIENoYWx1cGthCisKKyAgIERlc2NyaXB0aW9uOiBEZWZpbml0aW9uIG9mIGNvbnN0YW50IHRhYmxlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBEZWZpbml0aW9uIG9mIGNvbnN0YW50IHRhYmxlcworICAkUmV2aXNpb246IDk1NDA0ICQKKworICBUaGlzIG1vZHVsZSBjb250YWlucyBtb3N0IG9mIHRoZSBjb25zdGFudCBkYXRhIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiBST00uCisqLworCisjaW5jbHVkZSAic2JyZW5jX3JvbS5oIgorI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKy8vQHsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIFRhYmxlIE92ZXJ2aWV3OgorCisgbyBlbnZlbG9wZSBsZXZlbCwgICAxLjUgZEI6CisgICAgMWEpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMFRbMTIxXQorICAgIDFiKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBUWzEyMV0KKyAgICAyYSkgIHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwRlsxMjFdCisgICAgMmIpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMEZbMTIxXQorCisgbyBlbnZlbG9wZSBiYWxhbmNlLCAxLjUgZEI6CisgICAgM2EpICBib29rU2JyRW52QmFsYW5jZUMxMFRbNDldCisgICAgM2IpICBib29rU2JyRW52QmFsYW5jZUwxMFRbNDldCisgICAgNGEpICBib29rU2JyRW52QmFsYW5jZUMxMEZbNDldCisgICAgNGIpICBib29rU2JyRW52QmFsYW5jZUwxMEZbNDldCisKKyBvIGVudmVsb3BlIGxldmVsLCAgIDMuMCBkQjoKKyAgICA1YSkgIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExVFs2M10KKyAgICA1YikgIHZfSHVmZl9lbnZlbG9wZUxldmVsTDExVFs2M10KKyAgICA2YSkgIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRls2M10KKyAgICA2YikgIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRls2M10KKworIG8gZW52ZWxvcGUgYmFsYW5jZSwgMy4wIGRCOgorICAgIDdhKSAgYm9va1NickVudkJhbGFuY2VDMTFUWzI1XQorICAgIDdiKSAgYm9va1NickVudkJhbGFuY2VMMTFUWzI1XQorICAgIDhhKSAgYm9va1NickVudkJhbGFuY2VDMTFGWzI1XQorICAgIDhiKSAgYm9va1NickVudkJhbGFuY2VMMTFGWzI1XQorCisgbyBub2lzZSBsZXZlbCwgICAgICAzLjAgZEI6CisgICAgOWEpICB2X0h1ZmZfTm9pc2VMZXZlbEMxMVRbNjNdCisgICAgOWIpICB2X0h1ZmZfTm9pc2VMZXZlbEwxMVRbNjNdCisgICAgLSApICh2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUZbNjNdIGlzIHVzZWQgZm9yIGZyZXEgZGlyKQorICAgIC0gKSAodl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGWzYzXSBpcyB1c2VkIGZvciBmcmVxIGRpcikKKworIG8gbm9pc2UgYmFsYW5jZSwgICAgMy4wIGRCOgorICAgMTBhKSAgYm9va1Nick5vaXNlQmFsYW5jZUMxMVRbMjVdCisgICAxMGIpICBib29rU2JyTm9pc2VCYWxhbmNlTDExVFsyNV0KKyAgICAtICkgKGJvb2tTYnJFbnZCYWxhbmNlQzExRlsyNV0gaXMgdXNlZCBmb3IgZnJlcSBkaXIpCisgICAgLSApIChib29rU2JyRW52QmFsYW5jZUwxMUZbMjVdIGlzIHVzZWQgZm9yIGZyZXEgZGlyKQorCisKKyAgKDEuNSBkQiBpcyBuZXZlciB1c2VkIGZvciBub2lzZSkKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGFibGUgICAgICAgOiBlbnZlbG9wZSBsZXZlbCwgMS41IGRCICovCisvKiB0aGVvciByYW5nZSA6IFstNTgsNThdLCBDT0RFX0JPT0tfU0NGX0xBViAgID0gNTggKi8KKy8qIGltcGxlbSByYW5nZTogWy02MCw2MF0sIENPREVfQk9PS19TQ0ZfTEFWMTAgPSA2MCAqLworLyogcmF3IHN0YXRzICAgOiBlbnZlbG9wZUxldmVsXzAwICh5ZXMsIHdyb25nIHN1ZmZpeCBpbiBuYW1lKSAgS0sgMDEtMDMtMDkgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MyRklYLm0vZW52ZWxvcGVMZXZlbF8wMFRfY0YubWF0L3ZfbkNoZXhfY0YKKyAgIGJ1aWx0IGJ5IDogRkggMDEtMDctMDUgKi8KKworY29uc3QgSU5UIHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwVFsxMjFdID0geworICAgIDB4MDAwM0ZGRDYsIDB4MDAwM0ZGRDcsIDB4MDAwM0ZGRDgsIDB4MDAwM0ZGRDksIDB4MDAwM0ZGREEsIDB4MDAwM0ZGREIsCisgICAgMHgwMDA3RkZCOCwgMHgwMDA3RkZCOSwgMHgwMDA3RkZCQSwgMHgwMDA3RkZCQiwgMHgwMDA3RkZCQywgMHgwMDA3RkZCRCwKKyAgICAweDAwMDdGRkJFLCAweDAwMDdGRkJGLCAweDAwMDdGRkMwLCAweDAwMDdGRkMxLCAweDAwMDdGRkMyLCAweDAwMDdGRkMzLAorICAgIDB4MDAwN0ZGQzQsIDB4MDAwN0ZGQzUsIDB4MDAwN0ZGQzYsIDB4MDAwN0ZGQzcsIDB4MDAwN0ZGQzgsIDB4MDAwN0ZGQzksCisgICAgMHgwMDA3RkZDQSwgMHgwMDA3RkZDQiwgMHgwMDA3RkZDQywgMHgwMDA3RkZDRCwgMHgwMDA3RkZDRSwgMHgwMDA3RkZDRiwKKyAgICAweDAwMDdGRkQwLCAweDAwMDdGRkQxLCAweDAwMDdGRkQyLCAweDAwMDdGRkQzLCAweDAwMDFGRkU2LCAweDAwMDNGRkQ0LAorICAgIDB4MDAwMEZGRjAsIDB4MDAwMUZGRTksIDB4MDAwM0ZGRDUsIDB4MDAwMUZGRTcsIDB4MDAwMEZGRjEsIDB4MDAwMEZGRUMsCisgICAgMHgwMDAwRkZFRCwgMHgwMDAwRkZFRSwgMHgwMDAwN0ZGNCwgMHgwMDAwM0ZGOSwgMHgwMDAwM0ZGNywgMHgwMDAwMUZGQSwKKyAgICAweDAwMDAxRkY5LCAweDAwMDAwRkZCLCAweDAwMDAwN0ZDLCAweDAwMDAwM0ZDLCAweDAwMDAwMUZELCAweDAwMDAwMEZELAorICAgIDB4MDAwMDAwN0QsIDB4MDAwMDAwM0QsIDB4MDAwMDAwMUQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwQywgMHgwMDAwMDAxQywgMHgwMDAwMDAzQywgMHgwMDAwMDA3QywKKyAgICAweDAwMDAwMEZDLCAweDAwMDAwMUZDLCAweDAwMDAwM0ZELCAweDAwMDAwRkZBLCAweDAwMDAxRkY4LCAweDAwMDAzRkY2LAorICAgIDB4MDAwMDNGRjgsIDB4MDAwMDdGRjUsIDB4MDAwMEZGRUYsIDB4MDAwMUZGRTgsIDB4MDAwMEZGRjIsIDB4MDAwN0ZGRDQsCisgICAgMHgwMDA3RkZENSwgMHgwMDA3RkZENiwgMHgwMDA3RkZENywgMHgwMDA3RkZEOCwgMHgwMDA3RkZEOSwgMHgwMDA3RkZEQSwKKyAgICAweDAwMDdGRkRCLCAweDAwMDdGRkRDLCAweDAwMDdGRkRELCAweDAwMDdGRkRFLCAweDAwMDdGRkRGLCAweDAwMDdGRkUwLAorICAgIDB4MDAwN0ZGRTEsIDB4MDAwN0ZGRTIsIDB4MDAwN0ZGRTMsIDB4MDAwN0ZGRTQsIDB4MDAwN0ZGRTUsIDB4MDAwN0ZGRTYsCisgICAgMHgwMDA3RkZFNywgMHgwMDA3RkZFOCwgMHgwMDA3RkZFOSwgMHgwMDA3RkZFQSwgMHgwMDA3RkZFQiwgMHgwMDA3RkZFQywKKyAgICAweDAwMDdGRkVELCAweDAwMDdGRkVFLCAweDAwMDdGRkVGLCAweDAwMDdGRkYwLCAweDAwMDdGRkYxLCAweDAwMDdGRkYyLAorICAgIDB4MDAwN0ZGRjMsIDB4MDAwN0ZGRjQsIDB4MDAwN0ZGRjUsIDB4MDAwN0ZGRjYsIDB4MDAwN0ZGRjcsIDB4MDAwN0ZGRjgsCisgICAgMHgwMDA3RkZGOSwgMHgwMDA3RkZGQSwgMHgwMDA3RkZGQiwgMHgwMDA3RkZGQywgMHgwMDA3RkZGRCwgMHgwMDA3RkZGRSwKKyAgICAweDAwMDdGRkZGfTsKKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQzJGSVgubS9lbnZlbG9wZUxldmVsXzAwVF9jRi5tYXQvdl9uTGhleF9jRgorICAgYnVpbHQgYnkgOiBGSCAwMS0wNy0wNSAqLworCitjb25zdCBVQ0hBUiB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMFRbMTIxXSA9IHsKKyAgICAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorICAgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgICAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKKyAgICAweDEzLCAweDExLCAweDEyLCAweDEwLCAweDExLCAweDEyLCAweDExLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorICAgIDB4MEYsIDB4MEUsIDB4MEUsIDB4MEQsIDB4MEQsIDB4MEMsIDB4MEIsIDB4MEEsIDB4MDksIDB4MDgsIDB4MDcsCisgICAgMHgwNiwgMHgwNSwgMHgwNCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAweDA4LCAweDA5LCAweDBBLCAweDBDLCAweDBELCAweDBFLCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEwLAorICAgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgICAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorICAgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTN9OworCisvKiBkaXJlY3Rpb246IGZyZXEKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MyRklYLm0vZW52ZWxvcGVMZXZlbF8wMEZfY0YubWF0L3ZfbkNoZXhfY0YKKyAgIGJ1aWx0IGJ5IDogRkggMDEtMDctMDUgKi8KKworY29uc3QgSU5UIHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwRlsxMjFdID0geworICAgIDB4MDAwN0ZGRTcsIDB4MDAwN0ZGRTgsIDB4MDAwRkZGRDIsIDB4MDAwRkZGRDMsIDB4MDAwRkZGRDQsIDB4MDAwRkZGRDUsCisgICAgMHgwMDBGRkZENiwgMHgwMDBGRkZENywgMHgwMDBGRkZEOCwgMHgwMDA3RkZEQSwgMHgwMDBGRkZEOSwgMHgwMDBGRkZEQSwKKyAgICAweDAwMEZGRkRCLCAweDAwMEZGRkRDLCAweDAwMDdGRkRCLCAweDAwMEZGRkRELCAweDAwMDdGRkRDLCAweDAwMDdGRkRELAorICAgIDB4MDAwRkZGREUsIDB4MDAwM0ZGRTQsIDB4MDAwRkZGREYsIDB4MDAwRkZGRTAsIDB4MDAwRkZGRTEsIDB4MDAwN0ZGREUsCisgICAgMHgwMDBGRkZFMiwgMHgwMDBGRkZFMywgMHgwMDBGRkZFNCwgMHgwMDA3RkZERiwgMHgwMDBGRkZFNSwgMHgwMDA3RkZFMCwKKyAgICAweDAwMDNGRkU4LCAweDAwMDdGRkUxLCAweDAwMDNGRkUwLCAweDAwMDNGRkU5LCAweDAwMDFGRkVGLCAweDAwMDNGRkU1LAorICAgIDB4MDAwMUZGRUMsIDB4MDAwMUZGRUQsIDB4MDAwMUZGRUUsIDB4MDAwMEZGRjQsIDB4MDAwMEZGRjMsIDB4MDAwMEZGRjAsCisgICAgMHgwMDAwN0ZGNywgMHgwMDAwN0ZGNiwgMHgwMDAwM0ZGQSwgMHgwMDAwMUZGQSwgMHgwMDAwMUZGOSwgMHgwMDAwMEZGQSwKKyAgICAweDAwMDAwRkY4LCAweDAwMDAwN0Y5LCAweDAwMDAwM0ZCLCAweDAwMDAwMUZDLCAweDAwMDAwMUZBLCAweDAwMDAwMEZCLAorICAgIDB4MDAwMDAwN0MsIDB4MDAwMDAwM0MsIDB4MDAwMDAwMUMsIDB4MDAwMDAwMEMsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAxRCwgMHgwMDAwMDAzRCwgMHgwMDAwMDBGQSwKKyAgICAweDAwMDAwMEZDLCAweDAwMDAwMUZCLCAweDAwMDAwM0ZBLCAweDAwMDAwN0Y4LCAweDAwMDAwN0ZBLCAweDAwMDAwN0ZCLAorICAgIDB4MDAwMDBGRjksIDB4MDAwMDBGRkIsIDB4MDAwMDFGRjgsIDB4MDAwMDFGRkIsIDB4MDAwMDNGRjgsIDB4MDAwMDNGRjksCisgICAgMHgwMDAwRkZGMSwgMHgwMDAwRkZGMiwgMHgwMDAxRkZFQSwgMHgwMDAxRkZFQiwgMHgwMDAzRkZFMSwgMHgwMDAzRkZFMiwKKyAgICAweDAwMDNGRkVBLCAweDAwMDNGRkUzLCAweDAwMDNGRkU2LCAweDAwMDNGRkU3LCAweDAwMDNGRkVCLCAweDAwMEZGRkU2LAorICAgIDB4MDAwN0ZGRTIsIDB4MDAwRkZGRTcsIDB4MDAwRkZGRTgsIDB4MDAwRkZGRTksIDB4MDAwRkZGRUEsIDB4MDAwRkZGRUIsCisgICAgMHgwMDBGRkZFQywgMHgwMDA3RkZFMywgMHgwMDBGRkZFRCwgMHgwMDBGRkZFRSwgMHgwMDBGRkZFRiwgMHgwMDBGRkZGMCwKKyAgICAweDAwMDdGRkU0LCAweDAwMEZGRkYxLCAweDAwMDNGRkVDLCAweDAwMEZGRkYyLCAweDAwMEZGRkYzLCAweDAwMDdGRkU1LAorICAgIDB4MDAwN0ZGRTYsIDB4MDAwRkZGRjQsIDB4MDAwRkZGRjUsIDB4MDAwRkZGRjYsIDB4MDAwRkZGRjcsIDB4MDAwRkZGRjgsCisgICAgMHgwMDBGRkZGOSwgMHgwMDBGRkZGQSwgMHgwMDBGRkZGQiwgMHgwMDBGRkZGQywgMHgwMDBGRkZGRCwgMHgwMDBGRkZGRSwKKyAgICAweDAwMEZGRkZGfTsKKworLyogZGlyZWN0aW9uOiBmcmVxCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQzJGSVgubS9lbnZlbG9wZUxldmVsXzAwRl9jRi5tYXQvdl9uTGhleF9jRgorICAgYnVpbHQgYnkgOiBGSCAwMS0wNy0wNSAqLworCitjb25zdCBVQ0hBUiB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMEZbMTIxXSA9IHsKKyAgICAweDEzLCAweDEzLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDEzLCAweDE0LAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTIsIDB4MTQsIDB4MTQsCisgICAgMHgxNCwgMHgxMywgMHgxNCwgMHgxNCwgMHgxNCwgMHgxMywgMHgxNCwgMHgxMywgMHgxMiwgMHgxMywgMHgxMiwKKyAgICAweDEyLCAweDExLCAweDEyLCAweDExLCAweDExLCAweDExLCAweDEwLCAweDEwLCAweDEwLCAweDBGLCAweDBGLAorICAgIDB4MEUsIDB4MEQsIDB4MEQsIDB4MEMsIDB4MEMsIDB4MEIsIDB4MEEsIDB4MDksIDB4MDksIDB4MDgsIDB4MDcsCisgICAgMHgwNiwgMHgwNSwgMHgwNCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwOCwKKyAgICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBCLCAweDBCLCAweDBDLCAweDBDLCAweDBELCAweDBELCAweDBFLAorICAgIDB4MEUsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsCisgICAgMHgxMiwgMHgxNCwgMHgxMywgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxMywgMHgxNCwKKyAgICAweDE0LCAweDE0LCAweDE0LCAweDEzLCAweDE0LCAweDEyLCAweDE0LCAweDE0LCAweDEzLCAweDEzLCAweDE0LAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTR9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHRhYmxlICAgICAgIDogZW52ZWxvcGUgYmFsYW5jZSwgMS41IGRCICovCisvKiB0aGVvciByYW5nZSA6IFstNDgsNDhdLCBDT0RFX0JPT0tfU0NGX0xBViA9IDQ4ICovCisvKiBpbXBsZW0gcmFuZ2U6IHNhbWUgYnV0IG1hcHBlZCB0byBbLTI0LDI0XSwgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTEwID0gMjQKKyAqLworLyogcmF3IHN0YXRzICAgOiBlbnZlbG9wZVBhbl8wMCAoeWVzLCB3cm9uZyBzdWZmaXggaW4gbmFtZSkgIEtLIDAxLTAzLTA5ICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkcworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVQYW5fMDBULm1hdC92X25CaGV4CisgICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCisKK2NvbnN0IElOVCBib29rU2JyRW52QmFsYW5jZUMxMFRbNDldID0geworICAgIDB4MDAwMEZGRTQsIDB4MDAwMEZGRTUsIDB4MDAwMEZGRTYsIDB4MDAwMEZGRTcsIDB4MDAwMEZGRTgsIDB4MDAwMEZGRTksCisgICAgMHgwMDAwRkZFQSwgMHgwMDAwRkZFQiwgMHgwMDAwRkZFQywgMHgwMDAwRkZFRCwgMHgwMDAwRkZFRSwgMHgwMDAwRkZFRiwKKyAgICAweDAwMDBGRkYwLCAweDAwMDBGRkYxLCAweDAwMDBGRkYyLCAweDAwMDBGRkYzLCAweDAwMDBGRkY0LCAweDAwMDBGRkUyLAorICAgIDB4MDAwMDBGRkMsIDB4MDAwMDA3RkMsIDB4MDAwMDAxRkUsIDB4MDAwMDAwN0UsIDB4MDAwMDAwMUUsIDB4MDAwMDAwMDYsCisgICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwRSwgMHgwMDAwMDAzRSwgMHgwMDAwMDBGRSwgMHgwMDAwMDdGRCwKKyAgICAweDAwMDAwRkZELCAweDAwMDA3RkYwLCAweDAwMDBGRkUzLCAweDAwMDBGRkY1LCAweDAwMDBGRkY2LCAweDAwMDBGRkY3LAorICAgIDB4MDAwMEZGRjgsIDB4MDAwMEZGRjksIDB4MDAwMEZGRkEsIDB4MDAwMUZGRjYsIDB4MDAwMUZGRjcsIDB4MDAwMUZGRjgsCisgICAgMHgwMDAxRkZGOSwgMHgwMDAxRkZGQSwgMHgwMDAxRkZGQiwgMHgwMDAxRkZGQywgMHgwMDAxRkZGRCwgMHgwMDAxRkZGRSwKKyAgICAweDAwMDFGRkZGfTsKKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL2VudmVsb3BlUGFuXzAwVC5tYXQvdl9uTGhleAorICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLworCitjb25zdCBVQ0hBUiBib29rU2JyRW52QmFsYW5jZUwxMFRbNDldID0geworICAgIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisgICAgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgwQywgMHgwQiwKKyAgICAweDA5LCAweDA3LCAweDA1LCAweDAzLCAweDAxLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBCLAorICAgIDB4MEMsIDB4MEYsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTEsCisgICAgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMX07CisKKy8qIGRpcmVjdGlvbjogZnJlcQorICAgY29udGVudHMgOiBjb2Rld29yZHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL2VudmVsb3BlUGFuXzAwRi5tYXQvdl9uQmhleAorICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLworCitjb25zdCBJTlQgYm9va1NickVudkJhbGFuY2VDMTBGWzQ5XSA9IHsKKyAgICAweDAwMDNGRkUyLCAweDAwMDNGRkUzLCAweDAwMDNGRkU0LCAweDAwMDNGRkU1LCAweDAwMDNGRkU2LCAweDAwMDNGRkU3LAorICAgIDB4MDAwM0ZGRTgsIDB4MDAwM0ZGRTksIDB4MDAwM0ZGRUEsIDB4MDAwM0ZGRUIsIDB4MDAwM0ZGRUMsIDB4MDAwM0ZGRUQsCisgICAgMHgwMDAzRkZFRSwgMHgwMDAzRkZFRiwgMHgwMDAzRkZGMCwgMHgwMDAwRkZGNywgMHgwMDAxRkZGMCwgMHgwMDAwM0ZGQywKKyAgICAweDAwMDAwN0ZFLCAweDAwMDAwN0ZDLCAweDAwMDAwMEZFLCAweDAwMDAwMDdFLCAweDAwMDAwMDBFLCAweDAwMDAwMDAyLAorICAgIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMUUsIDB4MDAwMDAwM0UsIDB4MDAwMDAxRkUsIDB4MDAwMDA3RkQsCisgICAgMHgwMDAwMEZGRSwgMHgwMDAwN0ZGQSwgMHgwMDAwRkZGNiwgMHgwMDAzRkZGMSwgMHgwMDAzRkZGMiwgMHgwMDAzRkZGMywKKyAgICAweDAwMDNGRkY0LCAweDAwMDNGRkY1LCAweDAwMDNGRkY2LCAweDAwMDNGRkY3LCAweDAwMDNGRkY4LCAweDAwMDNGRkY5LAorICAgIDB4MDAwM0ZGRkEsIDB4MDAwM0ZGRkIsIDB4MDAwM0ZGRkMsIDB4MDAwM0ZGRkQsIDB4MDAwM0ZGRkUsIDB4MDAwN0ZGRkUsCisgICAgMHgwMDA3RkZGRn07CisKKy8qIGRpcmVjdGlvbjogZnJlcQorICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZVBhbl8wMEYubWF0L3ZfbkxoZXgKKyAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KKworY29uc3QgVUNIQVIgYm9va1NickVudkJhbGFuY2VMMTBGWzQ5XSA9IHsKKyAgICAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLAorICAgIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTAsIDB4MTEsIDB4MEUsIDB4MEIsIDB4MEIsCisgICAgMHgwOCwgMHgwNywgMHgwNCwgMHgwMiwgMHgwMSwgMHgwMywgMHgwNSwgMHgwNiwgMHgwOSwgMHgwQiwKKyAgICAweDBDLCAweDBGLCAweDEwLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLAorICAgIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTMsIDB4MTN9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHRhYmxlICAgICAgIDogZW52ZWxvcGUgbGV2ZWwsIDMuMCBkQiAqLworLyogdGhlb3IgcmFuZ2UgOiBbLTI5LDI5XSwgQ09ERV9CT09LX1NDRl9MQVYgICA9IDI5ICovCisvKiBpbXBsZW0gcmFuZ2U6IFstMzEsMzFdLCBDT0RFX0JPT0tfU0NGX0xBVjExID0gMzEgKi8KKy8qIHJhdyBzdGF0cyAgIDogZW52ZWxvcGVMZXZlbF8xMSAgS0sgMDAtMDItMDMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCisgICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCisKK2NvbnN0IElOVCB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMVRbNjNdID0geworICAgIDB4MDAwM0ZGRUQsIDB4MDAwM0ZGRUUsIDB4MDAwN0ZGREUsIDB4MDAwN0ZGREYsIDB4MDAwN0ZGRTAsIDB4MDAwN0ZGRTEsCisgICAgMHgwMDA3RkZFMiwgMHgwMDA3RkZFMywgMHgwMDA3RkZFNCwgMHgwMDA3RkZFNSwgMHgwMDA3RkZFNiwgMHgwMDA3RkZFNywKKyAgICAweDAwMDdGRkU4LCAweDAwMDdGRkU5LCAweDAwMDdGRkVBLCAweDAwMDdGRkVCLCAweDAwMDdGRkVDLCAweDAwMDFGRkY0LAorICAgIDB4MDAwMEZGRjcsIDB4MDAwMEZGRjksIDB4MDAwMEZGRjgsIDB4MDAwMDNGRkIsIDB4MDAwMDNGRkEsIDB4MDAwMDNGRjgsCisgICAgMHgwMDAwMUZGQSwgMHgwMDAwMEZGQywgMHgwMDAwMDdGQywgMHgwMDAwMDBGRSwgMHgwMDAwMDAzRSwgMHgwMDAwMDAwRSwKKyAgICAweDAwMDAwMDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDA2LCAweDAwMDAwMDFFLCAweDAwMDAwMDdFLCAweDAwMDAwMUZFLAorICAgIDB4MDAwMDA3RkQsIDB4MDAwMDFGRkIsIDB4MDAwMDNGRjksIDB4MDAwMDNGRkMsIDB4MDAwMDdGRkEsIDB4MDAwMEZGRjYsCisgICAgMHgwMDAxRkZGNSwgMHgwMDAzRkZFQywgMHgwMDA3RkZFRCwgMHgwMDA3RkZFRSwgMHgwMDA3RkZFRiwgMHgwMDA3RkZGMCwKKyAgICAweDAwMDdGRkYxLCAweDAwMDdGRkYyLCAweDAwMDdGRkYzLCAweDAwMDdGRkY0LCAweDAwMDdGRkY1LCAweDAwMDdGRkY2LAorICAgIDB4MDAwN0ZGRjcsIDB4MDAwN0ZGRjgsIDB4MDAwN0ZGRjksIDB4MDAwN0ZGRkEsIDB4MDAwN0ZGRkIsIDB4MDAwN0ZGRkMsCisgICAgMHgwMDA3RkZGRCwgMHgwMDA3RkZGRSwgMHgwMDA3RkZGRn07CisKKy8qIGRpcmVjdGlvbjogdGltZQorICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCisgICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCisKK2NvbnN0IFVDSEFSIHZfSHVmZl9lbnZlbG9wZUxldmVsTDExVFs2M10gPSB7CisgICAgMHgxMiwgMHgxMiwgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDExLCAweDEwLCAweDEwLCAweDEwLCAweDBFLAorICAgIDB4MEUsIDB4MEUsIDB4MEQsIDB4MEMsIDB4MEIsIDB4MDgsIDB4MDYsIDB4MDQsIDB4MDIsIDB4MDEsIDB4MDMsCisgICAgMHgwNSwgMHgwNywgMHgwOSwgMHgwQiwgMHgwRCwgMHgwRSwgMHgwRSwgMHgwRiwgMHgxMCwgMHgxMSwgMHgxMiwKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorICAgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTN9OworCisvKiBkaXJlY3Rpb246IGZyZXEKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCisgICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCisKK2NvbnN0IElOVCB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUZbNjNdID0geworICAgIDB4MDAwRkZGRjAsIDB4MDAwRkZGRjEsIDB4MDAwRkZGRjIsIDB4MDAwRkZGRjMsIDB4MDAwRkZGRjQsIDB4MDAwRkZGRjUsCisgICAgMHgwMDBGRkZGNiwgMHgwMDAzRkZGMywgMHgwMDA3RkZGNSwgMHgwMDA3RkZFRSwgMHgwMDA3RkZFRiwgMHgwMDA3RkZGNiwKKyAgICAweDAwMDNGRkY0LCAweDAwMDNGRkYyLCAweDAwMEZGRkY3LCAweDAwMDdGRkYwLCAweDAwMDFGRkY1LCAweDAwMDNGRkYwLAorICAgIDB4MDAwMUZGRjQsIDB4MDAwMEZGRjcsIDB4MDAwMEZGRjYsIDB4MDAwMDdGRjgsIDB4MDAwMDNGRkIsIDB4MDAwMDBGRkQsCisgICAgMHgwMDAwMDdGRCwgMHgwMDAwMDNGRCwgMHgwMDAwMDFGRCwgMHgwMDAwMDBGRCwgMHgwMDAwMDAzRSwgMHgwMDAwMDAwRSwKKyAgICAweDAwMDAwMDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDA2LCAweDAwMDAwMDFFLCAweDAwMDAwMEZDLCAweDAwMDAwMUZDLAorICAgIDB4MDAwMDAzRkMsIDB4MDAwMDA3RkMsIDB4MDAwMDBGRkMsIDB4MDAwMDFGRkMsIDB4MDAwMDNGRkEsIDB4MDAwMDdGRjksCisgICAgMHgwMDAwN0ZGQSwgMHgwMDAwRkZGOCwgMHgwMDAwRkZGOSwgMHgwMDAxRkZGNiwgMHgwMDAxRkZGNywgMHgwMDAzRkZGNSwKKyAgICAweDAwMDNGRkY2LCAweDAwMDNGRkYxLCAweDAwMEZGRkY4LCAweDAwMDdGRkYxLCAweDAwMDdGRkYyLCAweDAwMDdGRkYzLAorICAgIDB4MDAwRkZGRjksIDB4MDAwN0ZGRjcsIDB4MDAwN0ZGRjQsIDB4MDAwRkZGRkEsIDB4MDAwRkZGRkIsIDB4MDAwRkZGRkMsCisgICAgMHgwMDBGRkZGRCwgMHgwMDBGRkZGRSwgMHgwMDBGRkZGRn07CisKKy8qIGRpcmVjdGlvbjogZnJlcQorICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCisgICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCisKK2NvbnN0IFVDSEFSIHZfSHVmZl9lbnZlbG9wZUxldmVsTDExRls2M10gPSB7CisgICAgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxMiwgMHgxMywgMHgxMywgMHgxMywKKyAgICAweDEzLCAweDEyLCAweDEyLCAweDE0LCAweDEzLCAweDExLCAweDEyLCAweDExLCAweDEwLCAweDEwLCAweDBGLAorICAgIDB4MEUsIDB4MEMsIDB4MEIsIDB4MEEsIDB4MDksIDB4MDgsIDB4MDYsIDB4MDQsIDB4MDIsIDB4MDEsIDB4MDMsCisgICAgMHgwNSwgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwgMHgwRiwgMHgxMCwKKyAgICAweDEwLCAweDExLCAweDExLCAweDEyLCAweDEyLCAweDEyLCAweDE0LCAweDEzLCAweDEzLCAweDEzLCAweDE0LAorICAgIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTR9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHRhYmxlICAgICAgIDogZW52ZWxvcGUgYmFsYW5jZSwgMy4wIGRCICovCisvKiB0aGVvciByYW5nZSA6IFstMjQsMjRdLCBDT0RFX0JPT0tfU0NGX0xBViA9IDI0ICovCisvKiBpbXBsZW0gcmFuZ2U6IHNhbWUgYnV0IG1hcHBlZCB0byBbLTEyLDEyXSwgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExID0gMTIKKyAqLworLyogcmF3IHN0YXRzICAgOiBlbnZlbG9wZUJhbGFuY2VfMTEgIEtLIDAwLTAyLTAzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkcworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVCYWxhbmNlXzExVC5tYXQvdl9uQmhleAorICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLworCitjb25zdCBJTlQgYm9va1NickVudkJhbGFuY2VDMTFUWzI1XSA9IHsKKyAgICAweDAwMDAxRkYyLCAweDAwMDAxRkYzLCAweDAwMDAxRkY0LCAweDAwMDAxRkY1LCAweDAwMDAxRkY2LAorICAgIDB4MDAwMDFGRjcsIDB4MDAwMDFGRjgsIDB4MDAwMDBGRjgsIDB4MDAwMDAwRkUsIDB4MDAwMDAwN0UsCisgICAgMHgwMDAwMDAwRSwgMHgwMDAwMDAwNiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAxRSwKKyAgICAweDAwMDAwMDNFLCAweDAwMDAwMUZFLCAweDAwMDAxRkY5LCAweDAwMDAxRkZBLCAweDAwMDAxRkZCLAorICAgIDB4MDAwMDFGRkMsIDB4MDAwMDFGRkQsIDB4MDAwMDFGRkUsIDB4MDAwMDNGRkUsIDB4MDAwMDNGRkZ9OworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVCYWxhbmNlXzExVC5tYXQvdl9uTGhleAorICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLworCitjb25zdCBVQ0hBUiBib29rU2JyRW52QmFsYW5jZUwxMVRbMjVdID0geworICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEMsIDB4MDgsCisgICAgMHgwNywgMHgwNCwgMHgwMywgMHgwMSwgMHgwMiwgMHgwNSwgMHgwNiwgMHgwOSwgMHgwRCwKKyAgICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBFLCAweDBFfTsKKworLyogZGlyZWN0aW9uOiBmcmVxCisgICBjb250ZW50cyA6IGNvZGV3b3JkcworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVCYWxhbmNlXzExRi5tYXQvdl9uQmhleAorICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLworCitjb25zdCBJTlQgYm9va1NickVudkJhbGFuY2VDMTFGWzI1XSA9IHsKKyAgICAweDAwMDAxRkY3LCAweDAwMDAxRkY4LCAweDAwMDAxRkY5LCAweDAwMDAxRkZBLCAweDAwMDAxRkZCLAorICAgIDB4MDAwMDNGRjgsIDB4MDAwMDNGRjksIDB4MDAwMDA3RkMsIDB4MDAwMDAwRkUsIDB4MDAwMDAwN0UsCisgICAgMHgwMDAwMDAwRSwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwNiwgMHgwMDAwMDAxRSwKKyAgICAweDAwMDAwMDNFLCAweDAwMDAwMUZFLCAweDAwMDAwRkZBLCAweDAwMDAxRkY2LCAweDAwMDAzRkZBLAorICAgIDB4MDAwMDNGRkIsIDB4MDAwMDNGRkMsIDB4MDAwMDNGRkQsIDB4MDAwMDNGRkUsIDB4MDAwMDNGRkZ9OworCisvKiBkaXJlY3Rpb246IGZyZXEKKyAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVCYWxhbmNlXzExRi5tYXQvdl9uTGhleAorICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLworCitjb25zdCBVQ0hBUiBib29rU2JyRW52QmFsYW5jZUwxMUZbMjVdID0geworICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEUsIDB4MEUsIDB4MEIsIDB4MDgsCisgICAgMHgwNywgMHgwNCwgMHgwMiwgMHgwMSwgMHgwMywgMHgwNSwgMHgwNiwgMHgwOSwgMHgwQywKKyAgICAweDBELCAweDBFLCAweDBFLCAweDBFLCAweDBFLCAweDBFLCAweDBFfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0YWJsZSAgICAgICA6IG5vaXNlIGxldmVsLCAzLjAgZEIgKi8KKy8qIHRoZW9yIHJhbmdlIDogWy0yOSwyOV0sIENPREVfQk9PS19TQ0ZfTEFWICAgPSAyOSAqLworLyogaW1wbGVtIHJhbmdlOiBbLTMxLDMxXSwgQ09ERV9CT09LX1NDRl9MQVYxMSA9IDMxICovCisvKiByYXcgc3RhdHMgICA6IG5vaXNlTGV2ZWxfMTEgIEtLIDAwLTAyLTAzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkcworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTIubQorICAgYnVpbHQgYnkgOiBGSCAwMC0wMi0wNCAqLworCitjb25zdCBJTlQgdl9IdWZmX05vaXNlTGV2ZWxDMTFUWzYzXSA9IHsKKyAgICAweDAwMDAxRkNFLCAweDAwMDAxRkNGLCAweDAwMDAxRkQwLCAweDAwMDAxRkQxLCAweDAwMDAxRkQyLCAweDAwMDAxRkQzLAorICAgIDB4MDAwMDFGRDQsIDB4MDAwMDFGRDUsIDB4MDAwMDFGRDYsIDB4MDAwMDFGRDcsIDB4MDAwMDFGRDgsIDB4MDAwMDFGRDksCisgICAgMHgwMDAwMUZEQSwgMHgwMDAwMUZEQiwgMHgwMDAwMUZEQywgMHgwMDAwMUZERCwgMHgwMDAwMUZERSwgMHgwMDAwMUZERiwKKyAgICAweDAwMDAxRkUwLCAweDAwMDAxRkUxLCAweDAwMDAxRkUyLCAweDAwMDAxRkUzLCAweDAwMDAxRkU0LCAweDAwMDAxRkU1LAorICAgIDB4MDAwMDFGRTYsIDB4MDAwMDFGRTcsIDB4MDAwMDA3RjIsIDB4MDAwMDAwRkQsIDB4MDAwMDAwM0UsIDB4MDAwMDAwMEUsCisgICAgMHgwMDAwMDAwNiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAxRSwgMHgwMDAwMDBGQywgMHgwMDAwMDNGOCwKKyAgICAweDAwMDAxRkNDLCAweDAwMDAxRkU4LCAweDAwMDAxRkU5LCAweDAwMDAxRkVBLCAweDAwMDAxRkVCLCAweDAwMDAxRkVDLAorICAgIDB4MDAwMDFGQ0QsIDB4MDAwMDFGRUQsIDB4MDAwMDFGRUUsIDB4MDAwMDFGRUYsIDB4MDAwMDFGRjAsIDB4MDAwMDFGRjEsCisgICAgMHgwMDAwMUZGMiwgMHgwMDAwMUZGMywgMHgwMDAwMUZGNCwgMHgwMDAwMUZGNSwgMHgwMDAwMUZGNiwgMHgwMDAwMUZGNywKKyAgICAweDAwMDAxRkY4LCAweDAwMDAxRkY5LCAweDAwMDAxRkZBLCAweDAwMDAxRkZCLCAweDAwMDAxRkZDLCAweDAwMDAxRkZELAorICAgIDB4MDAwMDFGRkUsIDB4MDAwMDNGRkUsIDB4MDAwMDNGRkZ9OworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTIubQorICAgYnVpbHQgYnkgOiBGSCAwMC0wMi0wNCAqLworCitjb25zdCBVQ0hBUiB2X0h1ZmZfTm9pc2VMZXZlbEwxMVRbNjNdID0geworICAgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgICAgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwKKyAgICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELAorICAgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgICAgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwQiwgMHgwMDAwMDAwOCwgMHgwMDAwMDAwNiwgMHgwMDAwMDAwNCwKKyAgICAweDAwMDAwMDAzLCAweDAwMDAwMDAxLCAweDAwMDAwMDAyLCAweDAwMDAwMDA1LCAweDAwMDAwMDA4LCAweDAwMDAwMDBBLAorICAgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgICAgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwKKyAgICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELAorICAgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgICAgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRSwgMHgwMDAwMDAwRX07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGFibGUgICAgICAgOiBub2lzZSBiYWxhbmNlLCAzLjAgZEIgKi8KKy8qIHRoZW9yIHJhbmdlIDogWy0yNCwyNF0sIENPREVfQk9PS19TQ0ZfTEFWID0gMjQgKi8KKy8qIGltcGxlbSByYW5nZTogc2FtZSBidXQgbWFwcGVkIHRvIFstMTIsMTJdLCBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTEgPSAxMgorICovCisvKiByYXcgc3RhdHMgICA6IG5vaXNlQmFsYW5jZV8xMSAgS0sgMDAtMDItMDMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9ub2lzZUJhbGFuY2VfMTEubWF0L3ZfbkJoZXgKKyAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KKworY29uc3QgSU5UIGJvb2tTYnJOb2lzZUJhbGFuY2VDMTFUWzI1XSA9IHsKKyAgICAweDAwMDAwMEVDLCAweDAwMDAwMEVELCAweDAwMDAwMEVFLCAweDAwMDAwMEVGLCAweDAwMDAwMEYwLAorICAgIDB4MDAwMDAwRjEsIDB4MDAwMDAwRjIsIDB4MDAwMDAwRjMsIDB4MDAwMDAwRjQsIDB4MDAwMDAwRjUsCisgICAgMHgwMDAwMDAxQywgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwNiwgMHgwMDAwMDAzQSwKKyAgICAweDAwMDAwMEY2LCAweDAwMDAwMEY3LCAweDAwMDAwMEY4LCAweDAwMDAwMEY5LCAweDAwMDAwMEZBLAorICAgIDB4MDAwMDAwRkIsIDB4MDAwMDAwRkMsIDB4MDAwMDAwRkQsIDB4MDAwMDAwRkUsIDB4MDAwMDAwRkZ9OworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vbm9pc2VCYWxhbmNlXzExLm1hdC92X25MaGV4CisgICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCisKK2NvbnN0IFVDSEFSIGJvb2tTYnJOb2lzZUJhbGFuY2VMMTFUWzI1XSA9IHsKKyAgICAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LAorICAgIDB4MDgsIDB4MDUsIDB4MDIsIDB4MDEsIDB4MDMsIDB4MDYsIDB4MDgsIDB4MDgsIDB4MDgsCisgICAgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOH07CisKKy8qCisgICB0dW5pbmdUYWJsZQorKi8KK2NvbnN0IHNiclR1bmluZ1RhYmxlX3Qgc2JyVHVuaW5nVGFibGVbXSA9IHsKKyAgICAvKiBTb21lIG9mIHRoZSBsb3cgYml0cmF0ZXMgYXJlIGNvbW1lbnRlZCBvdXQgaGVyZSwgdGhpcyBpcyBiZWNhdXNlIHRoZQorICAgICAgIGVuY29kZXIgY291bGQgbG9zZSBmcmFtZXMgYXQgdGhvc2UgYml0cmF0ZXMgYW5kIHRocm93IGFuIGVycm9yCisgICAgICAgYmVjYXVzZSBpdCBoYXMgaW5zdWZmaWNpZW50IGJpdHMgdG8gZW5jb2RlIGZvciBzb21lIHRlc3QgaXRlbXMuCisgICAgKi8KKworICAgIC8qKiogSEUtQUFDIHNlY3Rpb24gKioqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgc2Ysc2ZzcCxzZixzZnNwLG5uYixuZm8sc2FtbCxTTSxGUyovCisKKyAgICAvKioqIG1vbm8gKioqLworCisgICAgLyogOC8xNiBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQywgODAwMCwgMTAwMDAsIDgwMDAsIDEsIDcsIDYsIDExLCAxMCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDEwMDAwLCAxMjAwMCwgODAwMCwgMSwgMTEsIDcsIDEzLCAxMiwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDEyMDAwLCAxNjAwMSwgODAwMCwgMSwgMTQsIDEwLCAxMywgMTMsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAxNjAwMCwgMjQwMDAsIDgwMDAsIDEsIDE0LCAxMCwgMTQsIDE0LCAyLCAwLCAzLCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgMjQwMDAsIDMyMDAwLCA4MDAwLCAxLCAxNCwgMTAsIDE0LCAxNCwgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDMyMDAwLCA0ODAwMSwgODAwMCwgMSwgMTQsIDExLCAxNSwgMTUsIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKworICAgIC8qIDExLzIyIGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCA4MDAwLCAxMDAwMCwgMTEwMjUsIDEsIDUsIDQsIDYsIDYsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAxMDAwMCwgMTIwMDAsIDExMDI1LCAxLCA4LCA1LCAxMiwgOSwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDEyMDAwLCAxNjAwMCwgMTEwMjUsIDEsIDEyLCA4LCAxMywgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDE2MDAwLCAyMDAwMCwgMTEwMjUsIDEsIDEyLCA4LCAxMywgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDIwMDAwLCAyNDAwMSwgMTEwMjUsIDEsIDEzLCA5LCAxMywgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDI0MDAwLCAzMjAwMCwgMTEwMjUsIDEsIDE0LCAxMCwgMTQsIDksIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDLCAzMjAwMCwgNDgwMDAsIDExMDI1LCAxLCAxNSwgMTEsIDE1LCAxMCwgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDQ4MDAwLCA2NDAwMSwgMTEwMjUsIDEsIDE1LCAxMSwgMTUsIDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisKKyAgICAvKiAxMi8yNCBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQywgODAwMCwgMTAwMDAsIDEyMDAwLCAxLCA0LCAzLCA2LCA2LCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMTAwMDAsIDEyMDAwLCAxMjAwMCwgMSwgNywgNCwgMTEsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAxMjAwMCwgMTYwMDAsIDEyMDAwLCAxLCAxMSwgNywgMTIsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAxNjAwMCwgMjAwMDAsIDEyMDAwLCAxLCAxMSwgNywgMTIsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAyMDAwMCwgMjQwMDEsIDEyMDAwLCAxLCAxMiwgOCwgMTIsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAyNDAwMCwgMzIwMDAsIDEyMDAwLCAxLCAxMywgOSwgMTMsIDksIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDLCAzMjAwMCwgNDgwMDAsIDEyMDAwLCAxLCAxNCwgMTAsIDE0LCAxMCwgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDQ4MDAwLCA2NDAwMSwgMTIwMDAsIDEsIDE0LCAxMSwgMTUsIDExLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisKKyAgICAvKiAxNi8zMiBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQywgODAwMCwgMTAwMDAsIDE2MDAwLCAxLCAxLCAxLCAwLCAwLCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMTAwMDAsIDEyMDAwLCAxNjAwMCwgMSwgMiwgMSwgNiwgMCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDEyMDAwLCAxNjAwMCwgMTYwMDAsIDEsIDQsIDIsIDYsIDAsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAxNjAwMCwgMTgwMDAsIDE2MDAwLCAxLCA0LCAyLCA4LCAzLCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMTgwMDAsIDIyMDAwLCAxNjAwMCwgMSwgNiwgNSwgMTEsIDcsIDIsIDAsIDYsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDLCAyMjAwMCwgMjgwMDAsIDE2MDAwLCAxLCAxMCwgOSwgMTIsIDgsIDIsIDAsIDYsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDLCAyODAwMCwgMzYwMDAsIDE2MDAwLCAxLCAxMiwgMTIsIDEzLCAxMywgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDM2MDAwLCA0NDAwMCwgMTYwMDAsIDEsIDE0LCAxNCwgMTMsIDEzLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQywgNDQwMDAsIDY0MDAxLCAxNjAwMCwgMSwgMTQsIDE0LCAxMywgMTMsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKworICAgIC8qIDIyLjA1LzQ0LjEga0h6IGR1YWwgcmF0ZSAqLworICAgIC8qIHsgQ09ERUNfQUFDLCAgIDgwMDAsIDExMzY5LCAgMjIwNTAsIDEsICAxLCAxLCAxLCAxLCAgMSwgMCwgNiwKKyAgICAgICBTQlJfTU9OTywgMyB9LCAqLworICAgIHtDT0RFQ19BQUMsIDExMzY5LCAxNjAwMCwgMjIwNTAsIDEsIDMsIDEsIDQsIDQsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAxNjAwMCwgMTgwMDAsIDIyMDUwLCAxLCAzLCAxLCA1LCA0LCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMTgwMDAsIDIyMDAwLCAyMjA1MCwgMSwgNCwgNCwgOCwgNSwgMiwgMCwgNiwgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDIyMDAwLCAyODAwMCwgMjIwNTAsIDEsIDcsIDYsIDgsIDYsIDIsIDAsIDYsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDLCAyODAwMCwgMzYwMDAsIDIyMDUwLCAxLCAxMCwgMTAsIDksIDksIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDLCAzNjAwMCwgNDQwMDAsIDIyMDUwLCAxLCAxMSwgMTEsIDEwLCAxMCwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorICAgIHtDT0RFQ19BQUMsIDQ0MDAwLCA2NDAwMSwgMjIwNTAsIDEsIDEzLCAxMywgMTIsIDEyLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisKKyAgICAvKiAyNC80OCBrSHogZHVhbCByYXRlICovCisgICAgLyogeyBDT0RFQ19BQUMsICAgODAwMCwgMTIwMDAsICAyNDAwMCwgMSwgIDEsIDEsIDEsIDEsICAxLCAwLCA2LAorICAgICAgIFNCUl9NT05PLCAzIH0sICovCisgICAge0NPREVDX0FBQywgMTIwMDAsIDE2MDAwLCAyNDAwMCwgMSwgMywgMSwgNCwgNCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDE2MDAwLCAxODAwMCwgMjQwMDAsIDEsIDMsIDEsIDUsIDQsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAxODAwMCwgMjIwMDAsIDI0MDAwLCAxLCA0LCAzLCA4LCA1LCAyLCAwLCA2LCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgMjIwMDAsIDI4MDAwLCAyNDAwMCwgMSwgNywgNiwgOCwgNiwgMiwgMCwgNiwgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDI4MDAwLCAzNjAwMCwgMjQwMDAsIDEsIDEwLCAxMCwgOSwgOSwgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDM2MDAwLCA0NDAwMCwgMjQwMDAsIDEsIDExLCAxMSwgMTAsIDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQywgNDQwMDAsIDY0MDAxLCAyNDAwMCwgMSwgMTMsIDEzLCAxMSwgMTEsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKworICAgIC8qIDMyLzY0IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCAyNDAwMCwgMzYwMDAsIDMyMDAwLCAxLCA0LCA0LCA0LCA0LCAyLCAwLCAzLCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMzYwMDAsIDYwMDAwLCAzMjAwMCwgMSwgNywgNywgNiwgNiwgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDYwMDAwLCA3MjAwMCwgMzIwMDAsIDEsIDksIDksIDgsIDgsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKyAgICB7Q09ERUNfQUFDLCA3MjAwMCwgMTAwMDAwLCAzMjAwMCwgMSwgMTEsIDExLCAxMCwgMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKyAgICB7Q09ERUNfQUFDLCAxMDAwMDAsIDE2MDAwMSwgMzIwMDAsIDEsIDEzLCAxMywgMTEsIDExLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisKKyAgICAvKiA0NC4xLzg4LjIga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUMsIDI0MDAwLCAzNjAwMCwgNDQxMDAsIDEsIDQsIDQsIDQsIDQsIDIsIDAsIDMsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAzNjAwMCwgNjAwMDAsIDQ0MTAwLCAxLCA3LCA3LCA2LCA2LCAyLCAwLCAzLCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgNjAwMDAsIDcyMDAwLCA0NDEwMCwgMSwgOSwgOSwgOCwgOCwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorICAgIHtDT0RFQ19BQUMsIDcyMDAwLCAxMDAwMDAsIDQ0MTAwLCAxLCAxMSwgMTEsIDEwLCAxMCwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorICAgIHtDT0RFQ19BQUMsIDEwMDAwMCwgMTYwMDAxLCA0NDEwMCwgMSwgMTMsIDEzLCAxMSwgMTEsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKworICAgIC8qIDQ4Lzk2IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCAzMjAwMCwgMzYwMDAsIDQ4MDAwLCAxLCA0LCA0LCA5LCA5LCAyLCAwLCAzLCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMzYwMDAsIDYwMDAwLCA0ODAwMCwgMSwgNywgNywgMTAsIDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgNjAwMDAsIDcyMDAwLCA0ODAwMCwgMSwgOSwgOSwgMTAsIDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQywgNzIwMDAsIDEwMDAwMCwgNDgwMDAsIDEsIDExLCAxMSwgMTEsIDExLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQywgMTAwMDAwLCAxNjAwMDEsIDQ4MDAwLCAxLCAxMywgMTMsIDExLCAxMSwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorCisgICAgLyoqKiBzdGVyZW8gKioqLworICAgIC8qIDA4LzE2IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCAxNjAwMCwgMjQwMDAsIDgwMDAsIDIsIDYsIDYsIDksIDcsIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgM30sCisgICAge0NPREVDX0FBQywgMjQwMDAsIDI4MDAwLCA4MDAwLCAyLCA5LCA5LCAxMSwgOSwgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAzfSwKKyAgICB7Q09ERUNfQUFDLCAyODAwMCwgMzYwMDAsIDgwMDAsIDIsIDExLCA5LCAxMSwgOSwgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDLCAzNjAwMCwgNDQwMDAsIDgwMDAsIDIsIDEzLCAxMSwgMTMsIDExLCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDQ0MDAwLCA1MjAwMCwgODAwMCwgMiwgMTQsIDEyLCAxMywgMTIsIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgNTIwMDAsIDYwMDAwLCA4MDAwLCAyLCAxNCwgMTQsIDEzLCAxMywgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAxfSwKKyAgICB7Q09ERUNfQUFDLCA2MDAwMCwgNzYwMDAsIDgwMDAsIDIsIDE0LCAxNCwgMTMsIDEzLCAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsCisgICAgIDF9LAorICAgIHtDT0RFQ19BQUMsIDc2MDAwLCAxMjgwMDEsIDgwMDAsIDIsIDE0LCAxNCwgMTMsIDEzLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorCisgICAgLyogMTEvMjIga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUMsIDE2MDAwLCAyNDAwMCwgMTEwMjUsIDIsIDcsIDUsIDksIDcsIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgM30sCisgICAge0NPREVDX0FBQywgMjQwMDAsIDI4MDAwLCAxMTAyNSwgMiwgMTAsIDgsIDEwLCA4LCAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDN9LAorICAgIHtDT0RFQ19BQUMsIDI4MDAwLCAzNjAwMCwgMTEwMjUsIDIsIDEyLCA4LCAxMiwgOCwgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDLCAzNjAwMCwgNDQwMDAsIDExMDI1LCAyLCAxMywgOSwgMTMsIDksIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgNDQwMDAsIDUyMDAwLCAxMTAyNSwgMiwgMTQsIDExLCAxMywgMTEsIDIsIDAsIC0zLAorICAgICBTQlJfU1dJVENIX0xSQywgMn0sCisgICAge0NPREVDX0FBQywgNTIwMDAsIDYwMDAwLCAxMTAyNSwgMiwgMTUsIDE1LCAxMywgMTMsIDMsIDAsIC0zLAorICAgICBTQlJfU1dJVENIX0xSQywgMX0sCisgICAge0NPREVDX0FBQywgNjAwMDAsIDc2MDAwLCAxMTAyNSwgMiwgMTUsIDE1LCAxMywgMTMsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQywgNzYwMDAsIDEyODAwMSwgMTEwMjUsIDIsIDE1LCAxNSwgMTMsIDEzLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorCisgICAgLyogMTIvMjQga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUMsIDE2MDAwLCAyNDAwMCwgMTIwMDAsIDIsIDYsIDQsIDksIDcsIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgM30sCisgICAge0NPREVDX0FBQywgMjQwMDAsIDI4MDAwLCAxMjAwMCwgMiwgOSwgNywgMTAsIDgsIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgM30sCisgICAge0NPREVDX0FBQywgMjgwMDAsIDM2MDAwLCAxMjAwMCwgMiwgMTEsIDcsIDEyLCA4LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDM2MDAwLCA0NDAwMCwgMTIwMDAsIDIsIDEyLCA5LCAxMiwgOSwgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDLCA0NDAwMCwgNTIwMDAsIDEyMDAwLCAyLCAxMywgMTIsIDEzLCAxMiwgMiwgMCwgLTMsCisgICAgIFNCUl9TV0lUQ0hfTFJDLCAyfSwKKyAgICB7Q09ERUNfQUFDLCA1MjAwMCwgNjAwMDAsIDEyMDAwLCAyLCAxNCwgMTQsIDEzLCAxMywgMywgMCwgLTMsCisgICAgIFNCUl9TV0lUQ0hfTFJDLCAxfSwKKyAgICB7Q09ERUNfQUFDLCA2MDAwMCwgNzYwMDAsIDEyMDAwLCAyLCAxNCwgMTQsIDEzLCAxMywgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDLCA3NjAwMCwgMTI4MDAxLCAxMjAwMCwgMiwgMTQsIDE0LCAxMywgMTMsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisKKyAgICAvKiAxNi8zMiBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQywgMTYwMDAsIDI0MDAwLCAxNjAwMCwgMiwgNCwgMiwgMSwgMCwgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAzfSwKKyAgICB7Q09ERUNfQUFDLCAyNDAwMCwgMjgwMDAsIDE2MDAwLCAyLCA4LCA3LCAxMCwgOCwgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAzfSwKKyAgICB7Q09ERUNfQUFDLCAyODAwMCwgMzYwMDAsIDE2MDAwLCAyLCAxMCwgOSwgMTIsIDExLCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDM2MDAwLCA0NDAwMCwgMTYwMDAsIDIsIDEzLCAxMywgMTMsIDEzLCAyLCAwLCAtMywKKyAgICAgU0JSX1NXSVRDSF9MUkMsIDJ9LAorICAgIHtDT0RFQ19BQUMsIDQ0MDAwLCA1MjAwMCwgMTYwMDAsIDIsIDE0LCAxNCwgMTMsIDEzLCAyLCAwLCAtMywKKyAgICAgU0JSX1NXSVRDSF9MUkMsIDJ9LAorICAgIHtDT0RFQ19BQUMsIDUyMDAwLCA2MDAwMCwgMTYwMDAsIDIsIDE0LCAxNCwgMTMsIDEzLCAzLCAwLCAtMywKKyAgICAgU0JSX1NXSVRDSF9MUkMsIDF9LAorICAgIHtDT0RFQ19BQUMsIDYwMDAwLCA3NjAwMCwgMTYwMDAsIDIsIDE0LCAxNCwgMTMsIDEzLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUMsIDc2MDAwLCAxMjgwMDEsIDE2MDAwLCAyLCAxNCwgMTQsIDEzLCAxMywgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworICAgIC8qIDIyLjA1LzQ0LjEga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUMsIDE2MDAwLCAyNDAwMCwgMjIwNTAsIDIsIDIsIDEsIDEsIDAsIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgM30sCisgICAge0NPREVDX0FBQywgMjQwMDAsIDI4MDAwLCAyMjA1MCwgMiwgNSwgNCwgNiwgNSwgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAzfSwKKyAgICB7Q09ERUNfQUFDLCAyODAwMCwgMzIwMDAsIDIyMDUwLCAyLCA1LCA0LCA4LCA3LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDMyMDAwLCAzNjAwMCwgMjIwNTAsIDIsIDcsIDYsIDgsIDcsIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgMzYwMDAsIDQ0MDAwLCAyMjA1MCwgMiwgMTAsIDEwLCA5LCA5LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDQ0MDAwLCA1MjAwMCwgMjIwNTAsIDIsIDEyLCAxMiwgOSwgOSwgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDLCA1MjAwMCwgNjAwMDAsIDIyMDUwLCAyLCAxMywgMTMsIDEwLCAxMCwgMywgMCwgLTMsCisgICAgIFNCUl9TV0lUQ0hfTFJDLCAxfSwKKyAgICB7Q09ERUNfQUFDLCA2MDAwMCwgNzYwMDAsIDIyMDUwLCAyLCAxNCwgMTQsIDEyLCAxMiwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDLCA3NjAwMCwgMTI4MDAxLCAyMjA1MCwgMiwgMTQsIDE0LCAxMiwgMTIsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisKKyAgICAvKiAyNC80OCBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQywgMTYwMDAsIDI0MDAwLCAyNDAwMCwgMiwgMiwgMSwgMSwgMCwgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAzfSwKKyAgICB7Q09ERUNfQUFDLCAyNDAwMCwgMjgwMDAsIDI0MDAwLCAyLCA1LCA1LCA2LCA2LCAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDN9LAorICAgIHtDT0RFQ19BQUMsIDI4MDAwLCAzNjAwMCwgMjQwMDAsIDIsIDcsIDYsIDgsIDcsIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgMzYwMDAsIDQ0MDAwLCAyNDAwMCwgMiwgMTAsIDEwLCA5LCA5LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDQ0MDAwLCA1MjAwMCwgMjQwMDAsIDIsIDEyLCAxMiwgOSwgOSwgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDLCA1MjAwMCwgNjAwMDAsIDI0MDAwLCAyLCAxMywgMTMsIDEwLCAxMCwgMywgMCwgLTMsCisgICAgIFNCUl9TV0lUQ0hfTFJDLCAxfSwKKyAgICB7Q09ERUNfQUFDLCA2MDAwMCwgNzYwMDAsIDI0MDAwLCAyLCAxNCwgMTQsIDEyLCAxMiwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDLCA3NjAwMCwgMTI4MDAxLCAyNDAwMCwgMiwgMTQsIDE0LCAxMiwgMTIsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisKKyAgICAvKiAzMi82NCBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQywgMzIwMDAsIDYwMDAwLCAzMjAwMCwgMiwgNCwgNCwgNCwgNCwgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAzfSwKKyAgICB7Q09ERUNfQUFDLCA2MDAwMCwgODAwMDAsIDMyMDAwLCAyLCA3LCA3LCA2LCA2LCAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDgwMDAwLCAxMTIwMDAsIDMyMDAwLCAyLCA5LCA5LCA4LCA4LCAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsCisgICAgIDF9LAorICAgIHtDT0RFQ19BQUMsIDExMjAwMCwgMTQ0MDAwLCAzMjAwMCwgMiwgMTEsIDExLCAxMCwgMTAsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQywgMTQ0MDAwLCAyNTYwMDEsIDMyMDAwLCAyLCAxMywgMTMsIDExLCAxMSwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworICAgIC8qIDQ0LjEvODguMiBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQywgMzIwMDAsIDYwMDAwLCA0NDEwMCwgMiwgNCwgNCwgNCwgNCwgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAzfSwKKyAgICB7Q09ERUNfQUFDLCA2MDAwMCwgODAwMDAsIDQ0MTAwLCAyLCA3LCA3LCA2LCA2LCAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDgwMDAwLCAxMTIwMDAsIDQ0MTAwLCAyLCA5LCA5LCA4LCA4LCAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsCisgICAgIDF9LAorICAgIHtDT0RFQ19BQUMsIDExMjAwMCwgMTQ0MDAwLCA0NDEwMCwgMiwgMTEsIDExLCAxMCwgMTAsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQywgMTQ0MDAwLCAyNTYwMDEsIDQ0MTAwLCAyLCAxMywgMTMsIDExLCAxMSwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworICAgIC8qIDQ4Lzk2IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCAzNjAwMCwgNjAwMDAsIDQ4MDAwLCAyLCA0LCA0LCA5LCA5LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDN9LAorICAgIHtDT0RFQ19BQUMsIDYwMDAwLCA4MDAwMCwgNDgwMDAsIDIsIDcsIDcsIDksIDksIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgODAwMDAsIDExMjAwMCwgNDgwMDAsIDIsIDksIDksIDEwLCAxMCwgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULAorICAgICAxfSwKKyAgICB7Q09ERUNfQUFDLCAxMTIwMDAsIDE0NDAwMCwgNDgwMDAsIDIsIDExLCAxMSwgMTEsIDExLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUMsIDE0NDAwMCwgMjU2MDAxLCA0ODAwMCwgMiwgMTMsIDEzLCAxMSwgMTEsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisKKyAgICAvKiogQUFDIExPVyBERUxBWSBTRUNUSU9OICoqLworCisgICAgLyogMjQga0h6IGR1YWwgcmF0ZSAtIDEya0h6IHNpbmdsZXJhdGUgaXMgbm90IGFsbG93ZWQgKGRlYWN0aXZhdGVkIGluCisgICAgICAgRkRLc2JyRW5jX0lzU2JyU2V0dGluZ0F2YWlsKCkpICovCisgICAge0NPREVDX0FBQ0xELCA4MDAwLCAzMjAwMCwgMTIwMDAsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKworICAgIC8qKiogbW9ubyAqKiovCisgICAgLyogMTYvMzIga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUNMRCwgMTYwMDAsIDE4MDAwLCAxNjAwMCwgMSwgNCwgNSwgOSwgNywgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUNMRCwgMTgwMDAsIDIyMDAwLCAxNjAwMCwgMSwgNywgNywgMTIsIDEyLCAxLCA2LCA5LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQ0xELCAyMjAwMCwgMjgwMDAsIDE2MDAwLCAxLCA2LCA2LCA5LCA5LCAyLCAzLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQ0xELCAyODAwMCwgMzYwMDAsIDE2MDAwLCAxLCA4LCA4LCAxMiwgNywgMiwgOSwgMTIsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDTEQsIDM2MDAwLCA0NDAwMCwgMTYwMDAsIDEsIDEwLCAxNCwgMTIsIDEzLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQ0xELCA0NDAwMCwgNjQwMDEsIDE2MDAwLCAxLCAxMSwgMTQsIDEzLCAxMywgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorCisgICAgLyogMjIuMDUvNDQuMSBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQ0xELCAxODAwMCwgMjIwMDAsIDIyMDUwLCAxLCA0LCA0LCA1LCA1LCAyLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQ0xELCAyMjAwMCwgMjgwMDAsIDIyMDUwLCAxLCA1LCA1LCA2LCA2LCAyLCAwLCA2LCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQ0xELCAyODAwMCwgMzYwMDAsIDIyMDUwLCAxLCA3LCA4LCA4LCA4LCAyLCAwLCAzLCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQ0xELCAzNjAwMCwgNDQwMDAsIDIyMDUwLCAxLCA5LCA5LCA5LCA5LCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQ0xELCA0NDAwMCwgNTIwMDAsIDIyMDUwLCAxLCAxMiwgMTEsIDExLCAxMSwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgNTIwMDAsIDY0MDAxLCAyMjA1MCwgMSwgMTMsIDExLCAxMSwgMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKworICAgIC8qIDI0LzQ4IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDTEQsIDIwMDAwLCAyMjAwMCwgMjQwMDAsIDEsIDMsIDQsIDgsIDgsIDIsIDAsIDYsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDIyMDAwLCAyODAwMCwgMjQwMDAsIDEsIDMsIDgsIDgsIDcsIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDI4MDAwLCAzNjAwMCwgMjQwMDAsIDEsIDQsIDgsIDgsIDcsIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDM2MDAwLCA1NjAwMCwgMjQwMDAsIDEsIDgsIDksIDksIDgsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDU2MDAwLCA2NDAwMSwgMjQwMDAsIDEsIDEzLCAxMSwgMTEsIDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisKKyAgICAvKiAzMi82NCBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQ0xELCAyNDAwMCwgMzYwMDAsIDMyMDAwLCAxLCA0LCA0LCA0LCA0LCAyLCAwLCAzLCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQ0xELCAzNjAwMCwgNjAwMDAsIDMyMDAwLCAxLCA3LCA3LCA2LCA2LCAyLCAwLCAzLCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQ0xELCA2MDAwMCwgNzIwMDAsIDMyMDAwLCAxLCA5LCA5LCA4LCA4LCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQ0xELCA3MjAwMCwgMTAwMDAwLCAzMjAwMCwgMSwgMTEsIDExLCAxMCwgMTAsIDIsIDAsIDMsIFNCUl9NT05PLAorICAgICAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDEwMDAwMCwgMTYwMDAxLCAzMjAwMCwgMSwgMTMsIDEzLCAxMSwgMTEsIDIsIDAsIDMsIFNCUl9NT05PLAorICAgICAxfSwKKworICAgIC8qIDQ0Lzg4IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDTEQsIDM2MDAwLCA2MDAwMCwgNDQxMDAsIDEsIDgsIDcsIDYsIDksIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDYwMDAwLCA3MjAwMCwgNDQxMDAsIDEsIDksIDksIDEwLCAxMCwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgNzIwMDAsIDEwMDAwMCwgNDQxMDAsIDEsIDExLCAxMSwgMTEsIDExLCAyLCAwLCAzLCBTQlJfTU9OTywKKyAgICAgMX0sCisgICAge0NPREVDX0FBQ0xELCAxMDAwMDAsIDE2MDAwMSwgNDQxMDAsIDEsIDEzLCAxMywgMTEsIDExLCAyLCAwLCAzLCBTQlJfTU9OTywKKyAgICAgMX0sCisKKyAgICAvKiA0OC85NiBrSHogZHVhbCByYXRlICovIC8qIDMyIGFuZCA0MGticHMgbGluZSB0dW5lZCBmb3IgZHVhbC1yYXRlIFNCUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAge0NPREVDX0FBQ0xELCAzNjAwMCwgNjAwMDAsIDQ4MDAwLCAxLCA0LCA3LCA0LCA0LCAyLCAwLCAzLCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQ0xELCA2MDAwMCwgNzIwMDAsIDQ4MDAwLCAxLCA5LCA5LCAxMCwgMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDcyMDAwLCAxMDAwMDAsIDQ4MDAwLCAxLCAxMSwgMTEsIDExLCAxMSwgMiwgMCwgMywgU0JSX01PTk8sCisgICAgIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgMTAwMDAwLCAxNjAwMDEsIDQ4MDAwLCAxLCAxMywgMTMsIDExLCAxMSwgMiwgMCwgMywgU0JSX01PTk8sCisgICAgIDF9LAorCisgICAgLyoqKiBzdGVyZW8gKioqLworICAgIC8qIDE2LzMyIGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDTEQsIDMyMDAwLCAzNjAwMCwgMTYwMDAsIDIsIDEwLCA5LCAxMiwgMTEsIDIsIDAsIC0zLAorICAgICBTQlJfU1dJVENIX0xSQywgMn0sCisgICAge0NPREVDX0FBQ0xELCAzNjAwMCwgNDQwMDAsIDE2MDAwLCAyLCAxMywgMTMsIDEzLCAxMywgMiwgMCwgLTMsCisgICAgIFNCUl9TV0lUQ0hfTFJDLCAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDQ0MDAwLCA1MjAwMCwgMTYwMDAsIDIsIDEwLCA5LCAxMSwgOSwgMiwgMCwgLTMsCisgICAgIFNCUl9TV0lUQ0hfTFJDLCAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDUyMDAwLCA2MDAwMCwgMTYwMDAsIDIsIDE0LCAxNCwgMTMsIDEzLCAzLCAwLCAtMywKKyAgICAgU0JSX1NXSVRDSF9MUkMsIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgNjAwMDAsIDc2MDAwLCAxNjAwMCwgMiwgMTQsIDE0LCAxMywgMTMsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQ0xELCA3NjAwMCwgMTI4MDAxLCAxNjAwMCwgMiwgMTQsIDE0LCAxMywgMTMsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisKKyAgICAvKiAyMi4wNS80NC4xIGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDTEQsIDMyMDAwLCAzNjAwMCwgMjIwNTAsIDIsIDUsIDQsIDcsIDYsIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQ0xELCAzNjAwMCwgNDQwMDAsIDIyMDUwLCAyLCA1LCA4LCA4LCA4LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgNDQwMDAsIDUyMDAwLCAyMjA1MCwgMiwgNywgMTAsIDgsIDgsIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQ0xELCA1MjAwMCwgNjAwMDAsIDIyMDUwLCAyLCA5LCAxMSwgOSwgOSwgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDYwMDAwLCA3NjAwMCwgMjIwNTAsIDIsIDEwLCAxMiwgMTAsIDExLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgNzYwMDAsIDgyMDAwLCAyMjA1MCwgMiwgMTIsIDEyLCAxMSwgMTEsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQ0xELCA4MjAwMCwgMTI4MDAxLCAyMjA1MCwgMiwgMTMsIDEyLCAxMSwgMTEsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisKKyAgICAvKiAyNC80OCBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQ0xELCAzMjAwMCwgMzYwMDAsIDI0MDAwLCAyLCA1LCA0LCA3LCA2LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgMzYwMDAsIDQ0MDAwLCAyNDAwMCwgMiwgNCwgOCwgOCwgOCwgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDQ0MDAwLCA1MjAwMCwgMjQwMDAsIDIsIDYsIDEwLCA4LCA4LCAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgNTIwMDAsIDYwMDAwLCAyNDAwMCwgMiwgOSwgMTEsIDksIDksIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMX0sCisgICAge0NPREVDX0FBQ0xELCA2MDAwMCwgNzYwMDAsIDI0MDAwLCAyLCAxMSwgMTIsIDEwLCAxMSwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDc2MDAwLCA4ODAwMCwgMjQwMDAsIDIsIDEyLCAxMywgMTEsIDExLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgODgwMDAsIDEyODAwMSwgMjQwMDAsIDIsIDEzLCAxMywgMTEsIDExLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorCisgICAgLyogMzIvNjQga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUNMRCwgNjAwMDAsIDgwMDAwLCAzMjAwMCwgMiwgNywgNywgNiwgNiwgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDgwMDAwLCAxMTIwMDAsIDMyMDAwLCAyLCA5LCA5LCA4LCA4LCAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsCisgICAgIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgMTEyMDAwLCAxNDQwMDAsIDMyMDAwLCAyLCAxMSwgMTEsIDEwLCAxMCwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDE0NDAwMCwgMjU2MDAxLCAzMjAwMCwgMiwgMTMsIDEzLCAxMSwgMTEsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisKKyAgICAvKiA0NC4xLzg4LjIga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUNMRCwgNjAwMDAsIDgwMDAwLCA0NDEwMCwgMiwgNywgNywgNiwgNiwgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDgwMDAwLCAxMTIwMDAsIDQ0MTAwLCAyLCAxMCwgMTAsIDgsIDgsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQ0xELCAxMTIwMDAsIDE0NDAwMCwgNDQxMDAsIDIsIDEyLCAxMiwgMTAsIDEwLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgMTQ0MDAwLCAyNTYwMDEsIDQ0MTAwLCAyLCAxMywgMTMsIDExLCAxMSwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworICAgIC8qIDQ4Lzk2IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDTEQsIDYwMDAwLCA4MDAwMCwgNDgwMDAsIDIsIDcsIDcsIDEwLCAxMCwgMiwgMCwgLTMsCisgICAgIFNCUl9TV0lUQ0hfTFJDLCAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDgwMDAwLCAxMTIwMDAsIDQ4MDAwLCAyLCA5LCA5LCAxMCwgMTAsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQ0xELCAxMTIwMDAsIDE0NDAwMCwgNDgwMDAsIDIsIDExLCAxMSwgMTEsIDExLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgMTQ0MDAwLCAxNzYwMDAsIDQ4MDAwLCAyLCAxMiwgMTIsIDExLCAxMSwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDE3NjAwMCwgMjU2MDAxLCA0ODAwMCwgMiwgMTMsIDEzLCAxMSwgMTEsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisKK307CisKK2NvbnN0IGludCBzYnJUdW5pbmdUYWJsZVNpemUgPQorICAgIHNpemVvZihzYnJUdW5pbmdUYWJsZSkgLyBzaXplb2Yoc2JyVHVuaW5nVGFibGVbMF0pOworCitjb25zdCBwc1R1bmluZ1RhYmxlX3QgcHNUdW5pbmdUYWJsZVs0XSA9IHsKKyAgICB7ODAwMCwgMjIwMDAsIFBTRU5DX1NURVJFT19CQU5EU18xMCwgUFNFTkNfTkVOVl8xLAorICAgICBGTDJGWENPTlNUX0RCTCgzLjBmIC8gNC4wZil9LAorICAgIHsyMjAwMCwgMjgwMDAsIFBTRU5DX1NURVJFT19CQU5EU18yMCwgUFNFTkNfTkVOVl8xLAorICAgICBGTDJGWENPTlNUX0RCTCgyLjBmIC8gNC4wZil9LAorICAgIHsyODAwMCwgMzYwMDAsIFBTRU5DX1NURVJFT19CQU5EU18yMCwgUFNFTkNfTkVOVl8yLAorICAgICBGTDJGWENPTlNUX0RCTCgxLjVmIC8gNC4wZil9LAorICAgIHszNjAwMCwgMTYwMDAxLCBQU0VOQ19TVEVSRU9fQkFORFNfMjAsIFBTRU5DX05FTlZfNCwKKyAgICAgRkwyRlhDT05TVF9EQkwoMS4xZiAvIDQuMGYpfSwKK307CisKKy8vQH0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvc2JyZW5jX3JvbS5oIGIvbGliU0JSZW5jL3NyYy9zYnJlbmNfcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjMWZiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNCUmVuYy9zcmMvc2JyZW5jX3JvbS5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIQorXGZpbGUKK1xicmllZiBEZWNsYXJhdGlvbiBvZiBjb25zdGFudCB0YWJsZXMKKyRSZXZpc2lvbjogOTI3OTAgJAorKi8KKyNpZm5kZWYgU0JSRU5DX1JPTV9ICisjZGVmaW5lIFNCUkVOQ19ST01fSAorCisjaW5jbHVkZSAic2JyX2RlZi5oIgorI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCisKKyNpbmNsdWRlICJwc19tYWluLmgiCisKKy8qCisgIGh1ZmZtYW4gdGFibGVzCisqLworZXh0ZXJuIGNvbnN0IElOVCB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMFRbMTIxXTsKK2V4dGVybiBjb25zdCBVQ0hBUiB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMFRbMTIxXTsKK2V4dGVybiBjb25zdCBJTlQgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBGWzEyMV07CitleHRlcm4gY29uc3QgVUNIQVIgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBGWzEyMV07CitleHRlcm4gY29uc3QgSU5UIGJvb2tTYnJFbnZCYWxhbmNlQzEwVFs0OV07CitleHRlcm4gY29uc3QgVUNIQVIgYm9va1NickVudkJhbGFuY2VMMTBUWzQ5XTsKK2V4dGVybiBjb25zdCBJTlQgYm9va1NickVudkJhbGFuY2VDMTBGWzQ5XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBib29rU2JyRW52QmFsYW5jZUwxMEZbNDldOworZXh0ZXJuIGNvbnN0IElOVCB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMVRbNjNdOworZXh0ZXJuIGNvbnN0IFVDSEFSIHZfSHVmZl9lbnZlbG9wZUxldmVsTDExVFs2M107CitleHRlcm4gY29uc3QgSU5UIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRls2M107CitleHRlcm4gY29uc3QgVUNIQVIgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGWzYzXTsKK2V4dGVybiBjb25zdCBJTlQgYm9va1NickVudkJhbGFuY2VDMTFUWzI1XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBib29rU2JyRW52QmFsYW5jZUwxMVRbMjVdOworZXh0ZXJuIGNvbnN0IElOVCBib29rU2JyRW52QmFsYW5jZUMxMUZbMjVdOworZXh0ZXJuIGNvbnN0IFVDSEFSIGJvb2tTYnJFbnZCYWxhbmNlTDExRlsyNV07CitleHRlcm4gY29uc3QgSU5UIHZfSHVmZl9Ob2lzZUxldmVsQzExVFs2M107CitleHRlcm4gY29uc3QgVUNIQVIgdl9IdWZmX05vaXNlTGV2ZWxMMTFUWzYzXTsKK2V4dGVybiBjb25zdCBJTlQgYm9va1Nick5vaXNlQmFsYW5jZUMxMVRbMjVdOworZXh0ZXJuIGNvbnN0IFVDSEFSIGJvb2tTYnJOb2lzZUJhbGFuY2VMMTFUWzI1XTsKKworZXh0ZXJuIGNvbnN0IHNiclR1bmluZ1RhYmxlX3Qgc2JyVHVuaW5nVGFibGVbXTsKK2V4dGVybiBjb25zdCBpbnQgc2JyVHVuaW5nVGFibGVTaXplOworCitleHRlcm4gY29uc3QgcHNUdW5pbmdUYWJsZV90IHBzVHVuaW5nVGFibGVbNF07CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy90b25fY29yci5jcHAgYi9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmNwcAppbmRleCBhZjVhZmJhLi4xYzA1MGUyIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmNwcAorKysgYi9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyMiArOTAsMjYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidG9uX2NvcnIuaCIKIAotI2luY2x1ZGUgInNicl9yYW0uaCIKKyNpbmNsdWRlICJzYnJlbmNfcmFtLmgiCiAjaW5jbHVkZSAic2JyX21pc2MuaCIKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogI2luY2x1ZGUgImF1dG9jb3JyMm5kLmgiCiAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgU2VuZCBhdXRvQ29yclNlY29uZE9yZGVyIHRvIG1sZmlsZQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBCQU5EX1ZfU0laRSAzMgorI2RlZmluZSBOVU1fVl9DT01CSU5FIFwKKyAgOCAvKiBNdXN0IGJlIGEgZGl2aXNvciBvZiA2NCBhbmQgZnVsZmlsbCB0aGUgQVNTRVJUcyBiZWxvdyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKQEAgLTEwNyw3ICsxMjIsNyBAQAogICAgKG5vaXNlIGVuZXJneSBCKS4gSGVuY2UgdGhlIHF1b3RhLW1hdHJpeCBjb250YWlucyBBL0IgPSBxLygxLXEpLgogCiAgICBUaGUgc2FtcGxlcyBpbiBucmdWZWN0b3IgYXJlIHNjYWxlZCBieSAxLjAvMTYuMAotCQlUaGUgc2FtcGxlcyBpbiBwTnJnVmVjdG9yRnJlcQlhcmUgc2NhbGVkIGJ5IDEuMC8yLjAKKyAgIFRoZSBzYW1wbGVzIGluIHBOcmdWZWN0b3JGcmVxICBhcmUgc2NhbGVkIGJ5IDEuMC8yLjAKICAgIFRoZSBzYW1wbGVzIGluIHF1b3RhTWF0cml4IGFyZSBzY2FsZWQgYnkgUkVMQVhBVElPTgogCiAgIFxyZXR1cm4gbm9uZS4KQEAgLTExNSw4NCArMTMwLDgzIEBACiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1GREtzYnJFbmNfQ2FsY3VsYXRlVG9uYWxpdHlRdW90YXMoIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAgICAgIC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1Qgc291cmNlQnVmZmVyUmVhbCwgIC8qITwgVGhlIHJlYWwgcGFydCBvZiB0aGUgUU1GLW1hdHJpeC4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1Qgc291cmNlQnVmZmVySW1hZywgIC8qITwgVGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBRTUYtbWF0cml4LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdXNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHVwcGVyIHNpZGUgYmFuZCwgaGlnaGVzdCArIDEgUU1GIGJhbmQgaW4gdGhlIFNCUiByYW5nZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHFtZlNjYWxlICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHNjbGVmYWN0b3Igb2YgUU1GIHN1YnNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgSU5UICAgICBpLCBrLCByLCByMiwgdGltZUluZGV4LCBhdXRvQ29yclNjYWxpbmc7Cit2b2lkIEZES3NickVuY19DYWxjdWxhdGVUb25hbGl0eVF1b3RhcygKKyAgICBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUCisgICAgICAgIHNvdXJjZUJ1ZmZlclJlYWwsIC8qITwgVGhlIHJlYWwgcGFydCBvZiB0aGUgUU1GLW1hdHJpeC4gICovCisgICAgRklYUF9EQkwgKipSRVNUUklDVAorICAgICAgICBzb3VyY2VCdWZmZXJJbWFnLCAvKiE8IFRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgUU1GLW1hdHJpeC4gKi8KKyAgICBJTlQgdXNiLCAgICAgLyohPCB1cHBlciBzaWRlIGJhbmQsIGhpZ2hlc3QgKyAxIFFNRiBiYW5kIGluIHRoZSBTQlIgcmFuZ2UuICovCisgICAgSU5UIHFtZlNjYWxlIC8qITwgc2NsZWZhY3RvciBvZiBRTUYgc3Vic2FtcGxlcyAqLworKSB7CisgIElOVCBpLCBrLCByLCByMiwgdGltZUluZGV4LCBhdXRvQ29yclNjYWxpbmc7CiAKLSAgSU5UICAgICBzdGFydEluZGV4TWF0cml4ICA9IGhUb25Db3JyLT5zdGFydEluZGV4TWF0cml4OwotICBJTlQgICAgIHRvdE5vRXN0ICAgICAgICAgID0gaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzOwotICBJTlQgICAgIG5vRXN0UGVyRnJhbWUgICAgID0gaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWU7Ci0gIElOVCAgICAgbW92ZSAgICAgICAgICAgICAgPSBoVG9uQ29yci0+bW92ZTsKLSAgSU5UICAgICBub1FtZkNoYW5uZWxzICAgICA9IGhUb25Db3JyLT5ub1FtZkNoYW5uZWxzOyAgICAgLyogTnVtZXIgb2YgQmFuZHMgKi8KLSAgSU5UICAgICBidWZmTGVuICAgICAgICAgICA9IGhUb25Db3JyLT5idWZmZXJMZW5ndGg7ICAgICAgLyogTnVtZXIgb2YgU2xvdHMgKi8KLSAgSU5UICAgICBzdGVwU2l6ZSAgICAgICAgICA9IGhUb25Db3JyLT5zdGVwU2l6ZTsKLSAgSU5UICAgICpwQmxvY2tMZW5ndGggICAgICA9IGhUb25Db3JyLT5scGNMZW5ndGg7Ci0gIElOVCoqICAgUkVTVFJJQ1Qgc2lnbk1hdHJpeCAgICAgICAgPSBoVG9uQ29yci0+c2lnbk1hdHJpeDsKLSAgRklYUF9EQkwqIFJFU1RSSUNUICBucmdWZWN0b3IgICAgICA9IGhUb25Db3JyLT5ucmdWZWN0b3I7Ci0gIEZJWFBfREJMKiogUkVTVFJJQ1QgcXVvdGFNYXRyaXggICAgPSBoVG9uQ29yci0+cXVvdGFNYXRyaXg7Ci0gIEZJWFBfREJMKiAgUkVTVFJJQ1QgcE5yZ1ZlY3RvckZyZXEgPSBoVG9uQ29yci0+bnJnVmVjdG9yRnJlcTsKLQotI2RlZmluZSBCQU5EX1ZfU0laRSBRTUZfTUFYX1RJTUVfU0xPVFMKLSNkZWZpbmUgTlVNX1ZfQ09NQklORSA4IC8qIE11c3QgYmUgYSBkaXZpc29yIG9mIDY0IGFuZCBmdWxmaWxsIHRoZSBBU1NFUlRzIGJlbG93ICovCisgIElOVCBzdGFydEluZGV4TWF0cml4ID0gaFRvbkNvcnItPnN0YXJ0SW5kZXhNYXRyaXg7CisgIElOVCB0b3ROb0VzdCA9IGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlczsKKyAgSU5UIG5vRXN0UGVyRnJhbWUgPSBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZTsKKyAgSU5UIG1vdmUgPSBoVG9uQ29yci0+bW92ZTsKKyAgSU5UIG5vUW1mQ2hhbm5lbHMgPSBoVG9uQ29yci0+bm9RbWZDaGFubmVsczsgLyogTnVtYmVyIG9mIEJhbmRzICovCisgIElOVCBidWZmTGVuID0gaFRvbkNvcnItPmJ1ZmZlckxlbmd0aDsgICAgICAgIC8qIE51bWJlciBvZiBTbG90cyAqLworICBJTlQgc3RlcFNpemUgPSBoVG9uQ29yci0+c3RlcFNpemU7CisgIElOVCAqcEJsb2NrTGVuZ3RoID0gaFRvbkNvcnItPmxwY0xlbmd0aDsKKyAgSU5UICoqUkVTVFJJQ1Qgc2lnbk1hdHJpeCA9IGhUb25Db3JyLT5zaWduTWF0cml4OworICBGSVhQX0RCTCAqUkVTVFJJQ1QgbnJnVmVjdG9yID0gaFRvbkNvcnItPm5yZ1ZlY3RvcjsKKyAgRklYUF9EQkwgKipSRVNUUklDVCBxdW90YU1hdHJpeCA9IGhUb25Db3JyLT5xdW90YU1hdHJpeDsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIHBOcmdWZWN0b3JGcmVxID0gaFRvbkNvcnItPm5yZ1ZlY3RvckZyZXE7CiAKICAgRklYUF9EQkwgKnJlYWxCdWY7CiAgIEZJWFBfREJMICppbWFnQnVmOwogCi0gIEZJWFBfREJMICBhbHBoYXJbMl0sYWxwaGFpWzJdLGZhYzsKKyAgRklYUF9EQkwgYWxwaGFyWzJdLCBhbHBoYWlbMl0sIGZhYzsKIAotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoYWMsIEFDT1JSX0NPRUZTLCAxKTsKLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHJlYWxCdWZSZWYsIEZJWFBfREJMLCAyKkJBTkRfVl9TSVpFKk5VTV9WX0NPTUJJTkUpOwotCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhYywgQUNPUlJfQ09FRlMsIDEpCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChyZWFsQnVmUmVmLCBGSVhQX0RCTCwgMiAqIEJBTkRfVl9TSVpFICogTlVNX1ZfQ09NQklORSkKICAgcmVhbEJ1ZiA9IHJlYWxCdWZSZWY7Ci0gIGltYWdCdWYgPSByZWFsQnVmICsgQkFORF9WX1NJWkUqTlVNX1ZfQ09NQklORTsKLQorICBpbWFnQnVmID0gcmVhbEJ1ZiArIEJBTkRfVl9TSVpFICogTlVNX1ZfQ09NQklORTsKIAogICBGREtfQVNTRVJUKGJ1ZmZMZW4gPD0gQkFORF9WX1NJWkUpOwotICBGREtfQVNTRVJUKHNpemVvZihGSVhQX0RCTCkqTlVNX1ZfQ09NQklORSpCQU5EX1ZfU0laRSoyIDwgKDEwMjQqc2l6ZW9mKEZJWFBfREJMKS1zaXplb2YoQUNPUlJfQ09FRlMpKSApOworICBGREtfQVNTRVJUKHNpemVvZihGSVhQX0RCTCkgKiBOVU1fVl9DT01CSU5FICogQkFORF9WX1NJWkUgKiAyIDwKKyAgICAgICAgICAgICAoMTAyNCAqIHNpemVvZihGSVhQX0RCTCkgLSBzaXplb2YoQUNPUlJfQ09FRlMpKSk7CiAKICAgLyoKICAgICogQnVmZmVyaW5nIG9mIHRoZSBxdW90YU1hdHJpeCBhbmQgdGhlIHF1b3RhTWF0cml4VHJhbnNwLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBmb3IoaSA9ICAwIDsgaSA8IG1vdmU7IGkrKyl7Ci0gICAgRkRLbWVtY3B5KHF1b3RhTWF0cml4W2ldLHF1b3RhTWF0cml4W2kgKyBub0VzdFBlckZyYW1lXSxub1FtZkNoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgRkRLbWVtY3B5KHNpZ25NYXRyaXhbaV0sc2lnbk1hdHJpeFtpICsgbm9Fc3RQZXJGcmFtZV0sbm9RbWZDaGFubmVscyAqIHNpemVvZihJTlQpKTsKKyAgZm9yIChpID0gMDsgaSA8IG1vdmU7IGkrKykgeworICAgIEZES21lbWNweShxdW90YU1hdHJpeFtpXSwgcXVvdGFNYXRyaXhbaSArIG5vRXN0UGVyRnJhbWVdLAorICAgICAgICAgICAgICBub1FtZkNoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY3B5KHNpZ25NYXRyaXhbaV0sIHNpZ25NYXRyaXhbaSArIG5vRXN0UGVyRnJhbWVdLAorICAgICAgICAgICAgICBub1FtZkNoYW5uZWxzICogc2l6ZW9mKElOVCkpOwogICB9CiAKLSAgRkRLbWVtbW92ZShucmdWZWN0b3IsbnJnVmVjdG9yK25vRXN0UGVyRnJhbWUsbW92ZSpzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtY2xlYXIobnJnVmVjdG9yK3N0YXJ0SW5kZXhNYXRyaXgsKHRvdE5vRXN0LXN0YXJ0SW5kZXhNYXRyaXgpKnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1jbGVhcihwTnJnVmVjdG9yRnJlcSxub1FtZkNoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbW1vdmUobnJnVmVjdG9yLCBucmdWZWN0b3IgKyBub0VzdFBlckZyYW1lLCBtb3ZlICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKG5yZ1ZlY3RvciArIHN0YXJ0SW5kZXhNYXRyaXgsCisgICAgICAgICAgICAgICh0b3ROb0VzdCAtIHN0YXJ0SW5kZXhNYXRyaXgpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKHBOcmdWZWN0b3JGcmVxLCBub1FtZkNoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKICAgLyoKICAgICogQ2FsY3VsYXRlIHRoZSBxdW90YXMgZm9yIHRoZSBjdXJyZW50IHRpbWUgc3RlcHMuCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICBmb3IgKHIgPSAwOyByIDwgdXNiOyByKyspCi0gIHsKKyAgZm9yIChyID0gMDsgciA8IHVzYjsgcisrKSB7CiAgICAgaW50IGJsb2NrTGVuZ3RoOwogCiAgICAgayA9IGhUb25Db3JyLT5uZXh0U2FtcGxlOyAvKiBzdGFydFNhbXBsZSAqLwogICAgIHRpbWVJbmRleCA9IHN0YXJ0SW5kZXhNYXRyaXg7Ci0gICAgLyogQ29weSBhcyBtYW55IGFzIHBvc3NpYmxlIEJhbmQgYWNjcm9zcyBhbGwgU2xvdHMgYXQgb25jZSAqLworICAgIC8qIENvcHkgYXMgbWFueSBhcyBwb3NzaWJsZSBCYW5kIGFjcm9zcyBhbGwgU2xvdHMgYXQgb25jZSAqLwogICAgIGlmIChyZWFsQnVmICE9IHJlYWxCdWZSZWYpIHsKICAgICAgIHJlYWxCdWYgLT0gQkFORF9WX1NJWkU7CiAgICAgICBpbWFnQnVmIC09IEJBTkRfVl9TSVpFOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFsQnVmICs9IEJBTkRfVl9TSVpFKihOVU1fVl9DT01CSU5FLTEpOwotICAgICAgaW1hZ0J1ZiArPSBCQU5EX1ZfU0laRSooTlVNX1ZfQ09NQklORS0xKTsKKyAgICAgIHJlYWxCdWYgKz0gQkFORF9WX1NJWkUgKiAoTlVNX1ZfQ09NQklORSAtIDEpOworICAgICAgaW1hZ0J1ZiArPSBCQU5EX1ZfU0laRSAqIChOVU1fVl9DT01CSU5FIC0gMSk7CisKICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWZmTGVuOyBpKyspIHsKICAgICAgICAgaW50IHY7CiAgICAgICAgIEZJWFBfREJMICpwdHI7Ci0gICAgICAgIHB0ciA9IHJlYWxCdWYraTsKLSAgICAgICAgZm9yICh2PTA7IHY8TlVNX1ZfQ09NQklORTsgdisrKQotICAgICAgICB7Ci0gICAgICAgICAgcHRyWzBdID0gc291cmNlQnVmZmVyUmVhbFtpXVtyK3ZdOwotICAgICAgICAgIHB0clswK0JBTkRfVl9TSVpFKk5VTV9WX0NPTUJJTkVdID0gc291cmNlQnVmZmVySW1hZ1tpXVtyK3ZdOworICAgICAgICBwdHIgPSByZWFsQnVmICsgaTsKKyAgICAgICAgZm9yICh2ID0gMDsgdiA8IE5VTV9WX0NPTUJJTkU7IHYrKykgeworICAgICAgICAgIHB0clswXSA9IHNvdXJjZUJ1ZmZlclJlYWxbaV1bciArIHZdOworICAgICAgICAgIHB0clswICsgQkFORF9WX1NJWkUgKiBOVU1fVl9DT01CSU5FXSA9IHNvdXJjZUJ1ZmZlckltYWdbaV1bciArIHZdOwogICAgICAgICAgIHB0ciAtPSBCQU5EX1ZfU0laRTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMjAwLDU0ICsyMTQsNjYgQEAKIAogICAgIGJsb2NrTGVuZ3RoID0gcEJsb2NrTGVuZ3RoWzBdOwogCi0gICAgd2hpbGUoayA8PSBidWZmTGVuIC0gYmxvY2tMZW5ndGgpCi0gICAgewotICAgICAgYXV0b0NvcnJTY2FsaW5nID0gZml4TWluKGdldFNjYWxlZmFjdG9yKCZyZWFsQnVmW2stTFBDX09SREVSXSwgTFBDX09SREVSK2Jsb2NrTGVuZ3RoKSwgZ2V0U2NhbGVmYWN0b3IoJmltYWdCdWZbay1MUENfT1JERVJdLCBMUENfT1JERVIrYmxvY2tMZW5ndGgpKTsKLSAgICAgIGF1dG9Db3JyU2NhbGluZyA9IGZpeE1heCgwLCBhdXRvQ29yclNjYWxpbmctMSk7CisgICAgd2hpbGUgKGsgPD0gYnVmZkxlbiAtIGJsb2NrTGVuZ3RoKSB7CisgICAgICBhdXRvQ29yclNjYWxpbmcgPSBmaXhNaW4oCisgICAgICAgICAgZ2V0U2NhbGVmYWN0b3IoJnJlYWxCdWZbayAtIExQQ19PUkRFUl0sIExQQ19PUkRFUiArIGJsb2NrTGVuZ3RoKSwKKyAgICAgICAgICBnZXRTY2FsZWZhY3RvcigmaW1hZ0J1ZltrIC0gTFBDX09SREVSXSwgTFBDX09SREVSICsgYmxvY2tMZW5ndGgpKTsKKyAgICAgIGF1dG9Db3JyU2NhbGluZyA9IGZpeE1heCgwLCBhdXRvQ29yclNjYWxpbmcgLSAxKTsKIAotICAgICAgc2NhbGVWYWx1ZXMoJnJlYWxCdWZbay1MUENfT1JERVJdLCBMUENfT1JERVIrYmxvY2tMZW5ndGgsIGF1dG9Db3JyU2NhbGluZyk7Ci0gICAgICBzY2FsZVZhbHVlcygmaW1hZ0J1ZltrLUxQQ19PUkRFUl0sIExQQ19PUkRFUitibG9ja0xlbmd0aCwgYXV0b0NvcnJTY2FsaW5nKTsKKyAgICAgIHNjYWxlVmFsdWVzKCZyZWFsQnVmW2sgLSBMUENfT1JERVJdLCBMUENfT1JERVIgKyBibG9ja0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgIGF1dG9Db3JyU2NhbGluZyk7CisgICAgICBzY2FsZVZhbHVlcygmaW1hZ0J1ZltrIC0gTFBDX09SREVSXSwgTFBDX09SREVSICsgYmxvY2tMZW5ndGgsCisgICAgICAgICAgICAgICAgICBhdXRvQ29yclNjYWxpbmcpOwogCiAgICAgICBhdXRvQ29yclNjYWxpbmcgPDw9IDE7IC8qIGNvbnNpZGVyIHFtZiBidWZmZXIgc2NhbGluZyB0d2ljZSAqLwotICAgICAgYXV0b0NvcnJTY2FsaW5nICs9IGF1dG9Db3JyMm5kX2NwbHggKCBhYywgcmVhbEJ1ZitrLCBpbWFnQnVmK2ssIGJsb2NrTGVuZ3RoICk7CisgICAgICBhdXRvQ29yclNjYWxpbmcgKz0KKyAgICAgICAgICBhdXRvQ29ycjJuZF9jcGx4KGFjLCByZWFsQnVmICsgaywgaW1hZ0J1ZiArIGssIGJsb2NrTGVuZ3RoKTsKIAotCi0gICAgICBpZihhYy0+ZGV0ID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKXsKKyAgICAgIGlmIChhYy0+ZGV0ID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgIGFscGhhclsxXSA9IGFscGhhaVsxXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCi0gICAgICAgIGFscGhhclswXSA9IChhYy0+cjAxcik+PjI7Ci0gICAgICAgIGFscGhhaVswXSA9IChhYy0+cjAxaSk+PjI7CisgICAgICAgIGFscGhhclswXSA9IChhYy0+cjAxcikgPj4gMjsKKyAgICAgICAgYWxwaGFpWzBdID0gKGFjLT5yMDFpKSA+PiAyOwogCi0gICAgICAgIGZhYyA9IGZNdWx0RGl2MihhYy0+cjAwciwgYWMtPnIxMXIpPj4xOwotICAgICAgfQotICAgICAgZWxzZXsKLSAgICAgICAgYWxwaGFyWzFdID0gKGZNdWx0RGl2MihhYy0+cjAxciwgYWMtPnIxMnIpPj4xKSAtIChmTXVsdERpdjIoYWMtPnIwMWksIGFjLT5yMTJpKT4+MSkgLSAoZk11bHREaXYyKGFjLT5yMDJyLCBhYy0+cjExcik+PjEpOwotICAgICAgICBhbHBoYWlbMV0gPSAoZk11bHREaXYyKGFjLT5yMDFpLCBhYy0+cjEycik+PjEpICsgKGZNdWx0RGl2MihhYy0+cjAxciwgYWMtPnIxMmkpPj4xKSAtIChmTXVsdERpdjIoYWMtPnIwMmksIGFjLT5yMTFyKT4+MSk7CisgICAgICAgIGZhYyA9IGZNdWx0RGl2MihhYy0+cjAwciwgYWMtPnIxMXIpID4+IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBhbHBoYXJbMV0gPSAoZk11bHREaXYyKGFjLT5yMDFyLCBhYy0+cjEycikgPj4gMSkgLQorICAgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKGFjLT5yMDFpLCBhYy0+cjEyaSkgPj4gMSkgLQorICAgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKGFjLT5yMDJyLCBhYy0+cjExcikgPj4gMSk7CisgICAgICAgIGFscGhhaVsxXSA9IChmTXVsdERpdjIoYWMtPnIwMWksIGFjLT5yMTJyKSA+PiAxKSArCisgICAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIoYWMtPnIwMXIsIGFjLT5yMTJpKSA+PiAxKSAtCisgICAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIoYWMtPnIwMmksIGFjLT5yMTFyKSA+PiAxKTsKIAotICAgICAgICBhbHBoYXJbMF0gPSAoZk11bHREaXYyKGFjLT5yMDFyLCBhYy0+ZGV0KT4+KGFjLT5kZXRfc2NhbGUrMSkpICsgZk11bHQoYWxwaGFyWzFdLCBhYy0+cjEycikgKyBmTXVsdChhbHBoYWlbMV0sIGFjLT5yMTJpKTsKLSAgICAgICAgYWxwaGFpWzBdID0gKGZNdWx0RGl2MihhYy0+cjAxaSwgYWMtPmRldCk+PihhYy0+ZGV0X3NjYWxlKzEpKSArIGZNdWx0KGFscGhhaVsxXSwgYWMtPnIxMnIpIC0gZk11bHQoYWxwaGFyWzFdLCBhYy0+cjEyaSk7CisgICAgICAgIGFscGhhclswXSA9IChmTXVsdERpdjIoYWMtPnIwMXIsIGFjLT5kZXQpID4+IChhYy0+ZGV0X3NjYWxlICsgMSkpICsKKyAgICAgICAgICAgICAgICAgICAgZk11bHQoYWxwaGFyWzFdLCBhYy0+cjEycikgKyBmTXVsdChhbHBoYWlbMV0sIGFjLT5yMTJpKTsKKyAgICAgICAgYWxwaGFpWzBdID0gKGZNdWx0RGl2MihhYy0+cjAxaSwgYWMtPmRldCkgPj4gKGFjLT5kZXRfc2NhbGUgKyAxKSkgKworICAgICAgICAgICAgICAgICAgICBmTXVsdChhbHBoYWlbMV0sIGFjLT5yMTJyKSAtIGZNdWx0KGFscGhhclsxXSwgYWMtPnIxMmkpOwogCi0gICAgICAgIGZhYyA9IGZNdWx0RGl2MihhYy0+cjAwciwgZk11bHQoYWMtPmRldCwgYWMtPnIxMXIpKT4+KGFjLT5kZXRfc2NhbGUrMSk7CisgICAgICAgIGZhYyA9IGZNdWx0RGl2MihhYy0+cjAwciwgZk11bHQoYWMtPmRldCwgYWMtPnIxMXIpKSA+PgorICAgICAgICAgICAgICAoYWMtPmRldF9zY2FsZSArIDEpOwogICAgICAgfQogCi0gICAgICBpZihmYWMgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpeworICAgICAgaWYgKGZhYyA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewogICAgICAgICBxdW90YU1hdHJpeFt0aW1lSW5kZXhdW3JdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgIHNpZ25NYXRyaXhbdGltZUluZGV4XVtyXSA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIHF1b3RhTWF0cml4IGlzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IgUkVMQVhBVElPTgotICAgICAgICAgICBwYXJzZSBSRUxBWEFUSU9OIGluIGZyYWN0aW9uYWwgcGFydCBhbmQgc2hpZnQgZmFjdG9yOiAxLygxLzAuNTI0Mjg4ICogMl5SRUxBWEFUSU9OX1NISUZUKSAqLwotICAgICAgICBGSVhQX0RCTCB0bXAsbnVtLGRlbm9tOwotICAgICAgICBJTlQgbnVtU2hpZnQsZGVub21TaGlmdCxjb21tb25TaGlmdDsKKyAgICAgICAgICAgcGFyc2UgUkVMQVhBVElPTiBpbiBmcmFjdGlvbmFsIHBhcnQgYW5kIHNoaWZ0IGZhY3RvcjogMS8oMS8wLjUyNDI4OCAqCisgICAgICAgICAgIDJeUkVMQVhBVElPTl9TSElGVCkgKi8KKyAgICAgICAgRklYUF9EQkwgdG1wLCBudW0sIGRlbm9tOworICAgICAgICBJTlQgbnVtU2hpZnQsIGRlbm9tU2hpZnQsIGNvbW1vblNoaWZ0OwogICAgICAgICBJTlQgc2lnbjsKIAotICAgICAgICBudW0gPSBmTXVsdERpdjIoYWxwaGFyWzBdLCBhYy0+cjAxcikgKyBmTXVsdERpdjIoYWxwaGFpWzBdLCBhYy0+cjAxaSkgLSBmTXVsdERpdjIoYWxwaGFyWzFdLCBmTXVsdChhYy0+cjAyciwgYWMtPnIxMXIpKSAtIGZNdWx0RGl2MihhbHBoYWlbMV0sIGZNdWx0KGFjLT5yMDJpLCBhYy0+cjExcikpOworICAgICAgICBudW0gPSBmTXVsdERpdjIoYWxwaGFyWzBdLCBhYy0+cjAxcikgKyBmTXVsdERpdjIoYWxwaGFpWzBdLCBhYy0+cjAxaSkgLQorICAgICAgICAgICAgICBmTXVsdERpdjIoYWxwaGFyWzFdLCBmTXVsdChhYy0+cjAyciwgYWMtPnIxMXIpKSAtCisgICAgICAgICAgICAgIGZNdWx0RGl2MihhbHBoYWlbMV0sIGZNdWx0KGFjLT5yMDJpLCBhYy0+cjExcikpOwogICAgICAgICBudW0gPSBmaXhwX2FicyhudW0pOwogCi0gICAgICAgIGRlbm9tID0gKGZhYz4+MSkgKyAoZk11bHREaXYyKGZhYyxSRUxBWEFUSU9OX0ZSQUNUKT4+UkVMQVhBVElPTl9TSElGVCkgLSBudW07CisgICAgICAgIGRlbm9tID0gKGZhYyA+PiAxKSArCisgICAgICAgICAgICAgICAgKGZNdWx0RGl2MihmYWMsIFJFTEFYQVRJT05fRlJBQ1QpID4+IFJFTEFYQVRJT05fU0hJRlQpIC0gbnVtOwogICAgICAgICBkZW5vbSA9IGZpeHBfYWJzKGRlbm9tKTsKIAotICAgICAgICBudW0gPSBmTXVsdChudW0sUkVMQVhBVElPTl9GUkFDVCk7CisgICAgICAgIG51bSA9IGZNdWx0KG51bSwgUkVMQVhBVElPTl9GUkFDVCk7CiAKICAgICAgICAgbnVtU2hpZnQgPSBDb3VudExlYWRpbmdCaXRzKG51bSkgLSAyOwogICAgICAgICBudW0gPSBzY2FsZVZhbHVlKG51bSwgbnVtU2hpZnQpOwpAQCAtMjU2LDQ2ICsyODIsNTMgQEAKICAgICAgICAgZGVub20gPSAoRklYUF9EQkwpZGVub20gPDwgZGVub21TaGlmdDsKIAogICAgICAgICBpZiAoKG51bSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJiAoZGVub20gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7Ci0gICAgICAgICAgY29tbW9uU2hpZnQgPSBmaXhNaW4obnVtU2hpZnQgLSBkZW5vbVNoaWZ0ICsgUkVMQVhBVElPTl9TSElGVCwgREZSQUNUX0JJVFMtMSk7CisgICAgICAgICAgY29tbW9uU2hpZnQgPQorICAgICAgICAgICAgICBmaXhNaW4obnVtU2hpZnQgLSBkZW5vbVNoaWZ0ICsgUkVMQVhBVElPTl9TSElGVCwgREZSQUNUX0JJVFMgLSAxKTsKICAgICAgICAgICBpZiAoY29tbW9uU2hpZnQgPCAwKSB7CiAgICAgICAgICAgICBjb21tb25TaGlmdCA9IC1jb21tb25TaGlmdDsKLSAgICAgICAgICAgIHRtcCA9IHNjaHVyX2RpdihudW0sZGVub20sMTYpOwotICAgICAgICAgICAgY29tbW9uU2hpZnQgPSBmaXhNaW4oY29tbW9uU2hpZnQsQ291bnRMZWFkaW5nQml0cyh0bXApKTsKKyAgICAgICAgICAgIHRtcCA9IHNjaHVyX2RpdihudW0sIGRlbm9tLCAxNik7CisgICAgICAgICAgICBjb21tb25TaGlmdCA9IGZpeE1pbihjb21tb25TaGlmdCwgQ291bnRMZWFkaW5nQml0cyh0bXApKTsKICAgICAgICAgICAgIHF1b3RhTWF0cml4W3RpbWVJbmRleF1bcl0gPSB0bXAgPDwgY29tbW9uU2hpZnQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHF1b3RhTWF0cml4W3RpbWVJbmRleF1bcl0gPQorICAgICAgICAgICAgICAgIHNjaHVyX2RpdihudW0sIGRlbm9tLCAxNikgPj4gY29tbW9uU2hpZnQ7CiAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgcXVvdGFNYXRyaXhbdGltZUluZGV4XVtyXSA9IHNjaHVyX2RpdihudW0sZGVub20sMTYpID4+IGNvbW1vblNoaWZ0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBxdW90YU1hdHJpeFt0aW1lSW5kZXhdW3JdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYWMtPnIxMXIgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKLSAgICAgICAgICBpZiAoICAoIChhYy0+cjAxciA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSApICYmICggYWMtPnIxMXIgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikgKSApCi0gICAgICAgICAgICAgIHx8KCAoYWMtPnIwMXIgPCAgRkwyRlhDT05TVF9EQkwoMC4wZikgKSAmJiAoIGFjLT5yMTFyIDwgIEZMMkZYQ09OU1RfREJMKDAuMGYpICkgKSAgKSB7CisgICAgICAgICAgaWYgKCgoYWMtPnIwMXIgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmCisgICAgICAgICAgICAgICAoYWMtPnIxMXIgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpKSB8fAorICAgICAgICAgICAgICAoKGFjLT5yMDFyIDwgRkwyRlhDT05TVF9EQkwoMC4wZikpICYmCisgICAgICAgICAgICAgICAoYWMtPnIxMXIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkpKSB7CiAgICAgICAgICAgICBzaWduID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNpZ24gPSAtMTsKICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgc2lnbiA9IDE7CiAgICAgICAgIH0KIAotICAgICAgICBpZihzaWduIDwgMCkgewotICAgICAgICAgIHIyID0gcjsgICAgICAgLyogKElOVCkgcG93KC0xLCBiYW5kKTsgKi8KKyAgICAgICAgaWYgKHNpZ24gPCAwKSB7CisgICAgICAgICAgcjIgPSByOyAvKiAoSU5UKSBwb3coLTEsIGJhbmQpOyAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHIyID0gciArIDE7IC8qIChJTlQpIHBvdygtMSwgYmFuZCsxKTsgKi8KICAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICByMiA9IHIgKyAxOyAgIC8qIChJTlQpIHBvdygtMSwgYmFuZCsxKTsgKi8KLSAgICAgICAgfQotICAgICAgICBzaWduTWF0cml4W3RpbWVJbmRleF1bcl0gPSAxIC0gMioocjIgJiAweDEpOworICAgICAgICBzaWduTWF0cml4W3RpbWVJbmRleF1bcl0gPSAxIC0gMiAqIChyMiAmIDB4MSk7CiAgICAgICB9CiAKLSAgICAgIG5yZ1ZlY3Rvclt0aW1lSW5kZXhdICs9ICgoYWMtPnIwMHIpID4+IGZpeE1pbihERlJBQ1RfQklUUy0xLCgyKnFtZlNjYWxlK2F1dG9Db3JyU2NhbGluZyArIFNDQUxFX05SR1ZFQykpKTsKLSAgICAgIC8qIHBOcmdWZWN0b3JGcmVxW3JdIGZpbmFsbHkgaGFzIHRvIGJlIGRpdmlkZWQgYnkgbm9Fc3RQZXJGcmFtZSwgcmVwbGFjZWQgZGl2aXNpb24gYnkgc2hpZnRpbmcgd2l0aCBvbmUgKi8KLSAgICAgIHBOcmdWZWN0b3JGcmVxW3JdID0gcE5yZ1ZlY3RvckZyZXFbcl0gKyAoKGFjLT5yMDByKSA+PiBmaXhNaW4oREZSQUNUX0JJVFMtMSwoMipxbWZTY2FsZSthdXRvQ29yclNjYWxpbmcgKyBTQ0FMRV9OUkdWRUMpKSk7CisgICAgICBucmdWZWN0b3JbdGltZUluZGV4XSArPQorICAgICAgICAgICgoYWMtPnIwMHIpID4+CisgICAgICAgICAgIGZpeE1pbihERlJBQ1RfQklUUyAtIDEsCisgICAgICAgICAgICAgICAgICAoMiAqIHFtZlNjYWxlICsgYXV0b0NvcnJTY2FsaW5nICsgU0NBTEVfTlJHVkVDKSkpOworICAgICAgLyogcE5yZ1ZlY3RvckZyZXFbcl0gZmluYWxseSBoYXMgdG8gYmUgZGl2aWRlZCBieSBub0VzdFBlckZyYW1lLCByZXBsYWNlZAorICAgICAgICogZGl2aXNpb24gYnkgc2hpZnRpbmcgd2l0aCBvbmUgKi8KKyAgICAgIHBOcmdWZWN0b3JGcmVxW3JdID0KKyAgICAgICAgICBwTnJnVmVjdG9yRnJlcVtyXSArCisgICAgICAgICAgKChhYy0+cjAwcikgPj4KKyAgICAgICAgICAgZml4TWluKERGUkFDVF9CSVRTIC0gMSwKKyAgICAgICAgICAgICAgICAgICgyICogcW1mU2NhbGUgKyBhdXRvQ29yclNjYWxpbmcgKyBTQ0FMRV9OUkdWRUMpKSk7CiAKICAgICAgIGJsb2NrTGVuZ3RoID0gcEJsb2NrTGVuZ3RoWzFdOwogICAgICAgayArPSBzdGVwU2l6ZTsKQEAgLTMwMyw5ICszMzYsOCBAQAogICAgIH0KICAgfQogCi0KLSAgQ19BTExPQ19TQ1JBVENIX0VORChyZWFsQnVmLCBGSVhQX0RCTCwgMipCQU5EX1ZfU0laRSpOVU1fVl9DT01CSU5FKTsKLSAgQ19BTExPQ19TQ1JBVENIX0VORChhYywgQUNPUlJfQ09FRlMsIDEpOworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHJlYWxCdWZSZWYsIEZJWFBfREJMLCAyICogQkFORF9WX1NJWkUgKiBOVU1fVl9DT01CSU5FKQorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFjLCBBQ09SUl9DT0VGUywgMSkKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzI0LDExNyArMzU2LDEwMSBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX1RvbkNvcnJQYXJhbUV4dHIoSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSogaW5mVmVjLCAgICAgICAgICAgICAgIC8qITwgVmVjdG9yIHdoZXJlIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBsZXZlbHMgd2lsbCBiZSBzdG9yZWQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqIG5vaXNlTGV2ZWxzLCAgICAgICAgICAvKiE8IFZlY3RvciB3aGVyZSB0aGUgbm9pc2UgbGV2ZWxzIHdpbGwgYmUgc3RvcmVkLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiBtaXNzaW5nSGFybW9uaWNGbGFnLCAgICAgICAgLyohPCBGbGFnIHNldCB0byBvbmUgb3IgemVybywgZGVwZW5kZW50IG9uIGlmIGFueSBzdHJvbmcgc2luZXMgYXJlIG1pc3NpbmcuKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICogbWlzc2luZ0hhcm1vbmljc0luZGV4LCAgIC8qITwgVmVjdG9yIGluZGljYXRpbmcgd2hlcmUgc2luZXMgYXJlIG1pc3NpbmcuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqIGVudmVsb3BlQ29tcGVuc2F0aW9uLCAgICAvKiE8IFZlY3RvciB0byBzdG9yZSBjb21wZW5zYXRpb24gdmFsdWVzIGZvciB0aGUgZW5lcmdpZXMgaW4uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqZnJhbWVJbmZvLCAvKiE8IEZyYW1lIGluZm8gc3RydWN0LCBjb250YWlucyB0aGUgdGltZSBhbmQgZnJlcXVlbmN5IGdyaWQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiB0cmFuc2llbnRJbmZvLCAgICAgICAgICAgIC8qITwgVHJhbnNpZW50IGluZm8uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBmcmVxQmFuZFRhYmxlLCAgICAgICAgICAgIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGVzIGZvciBoaWdoLXJlcy4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIGhpZ2gtcmVzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgWFBPU19NT0RFIHhwb3NUeXBlLCAgICAgICAgICAgICAgLyohPCBUeXBlIG9mIHRyYW5zcG9zZXIgdXNlZCBpbiB0aGUgZGVjb2Rlci4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYnJTeW50YXhGbGFncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewordm9pZCBGREtzYnJFbmNfVG9uQ29yclBhcmFtRXh0cigKKyAgICBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KKyAgICBJTlZGX01PREUgKmluZlZlYywgLyohPCBWZWN0b3Igd2hlcmUgdGhlIGludmVyc2UgZmlsdGVyaW5nIGxldmVscyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZC4gKi8KKyAgICBGSVhQX0RCTCAqbm9pc2VMZXZlbHMsIC8qITwgVmVjdG9yIHdoZXJlIHRoZSBub2lzZSBsZXZlbHMgd2lsbCBiZSBzdG9yZWQuICovCisgICAgSU5UICptaXNzaW5nSGFybW9uaWNGbGFnLCAvKiE8IEZsYWcgc2V0IHRvIG9uZSBvciB6ZXJvLCBkZXBlbmRlbnQgb24gaWYgYW55CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmcgc2luZXMgYXJlIG1pc3NpbmcuKi8KKyAgICBVQ0hBUiAqbWlzc2luZ0hhcm1vbmljc0luZGV4LCAvKiE8IFZlY3RvciBpbmRpY2F0aW5nIHdoZXJlIHNpbmVzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcuICovCisgICAgVUNIQVIgKmVudmVsb3BlQ29tcGVuc2F0aW9uLCAgLyohPCBWZWN0b3IgdG8gc3RvcmUgY29tcGVuc2F0aW9uIHZhbHVlcyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW5lcmdpZXMgaW4uICovCisgICAgY29uc3QgU0JSX0ZSQU1FX0lORk8gKmZyYW1lSW5mbywgLyohPCBGcmFtZSBpbmZvIHN0cnVjdCwgY29udGFpbnMgdGhlIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZnJlcXVlbmN5IGdyaWQgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS4qLworICAgIFVDSEFSICp0cmFuc2llbnRJbmZvLCAgICAgICAgICAgIC8qITwgVHJhbnNpZW50IGluZm8uKi8KKyAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAgICAgICAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlcyBmb3IgaGlnaC1yZXMuKi8KKyAgICBJTlQgblNmYiwgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmRzIGZvciBoaWdoLXJlcy4gKi8KKyAgICBYUE9TX01PREUgeHBvc1R5cGUsIC8qITwgVHlwZSBvZiB0cmFuc3Bvc2VyIHVzZWQgaW4gdGhlIGRlY29kZXIuKi8KKyAgICBVSU5UIHNiclN5bnRheEZsYWdzKSB7CiAgIElOVCBiYW5kOwotICBJTlQgdHJhbnNpZW50RmxhZyA9IHRyYW5zaWVudEluZm9bMV0gOyAgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBpZiBhIHRyYW5zaWVudCBpcyBwcmVzZW50IGluIHRoZSBjdXJyZW50IGZyYW1lLiAqLwotICBJTlQgdHJhbnNpZW50UG9zICA9IHRyYW5zaWVudEluZm9bMF07ICAgICAvKiE8IFBvc2l0aW9uIG9mIHRoZSB0cmFuc2llbnQuKi8KKyAgSU5UIHRyYW5zaWVudEZsYWcgPSB0cmFuc2llbnRJbmZvWzFdOyAvKiE8IEZsYWcgaW5kaWNhdGluZyBpZiBhIHRyYW5zaWVudCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgZnJhbWUuICovCisgIElOVCB0cmFuc2llbnRQb3MgPSB0cmFuc2llbnRJbmZvWzBdOyAgLyohPCBQb3NpdGlvbiBvZiB0aGUgdHJhbnNpZW50LiovCiAgIElOVCB0cmFuc2llbnRGcmFtZSwgdHJhbnNpZW50RnJhbWVJbnZmRXN0OwotICBJTlZGX01PREUqIGluZlZlY1B0cjsKLQorICBJTlZGX01PREUgKmluZlZlY1B0cjsKIAogICAvKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGZyYW1lIHdoZXJlIGEgdHJhbnNpZW50IHN0YXJ0cy4uLgogCi0gIFRoZSBkZXRlY3Rpb24gb2Ygbm9pc2UtZmxvb3IsIG1pc3NpbmcgaGFybW9uaWNzIGFuZCBpbnZmX2VzdCwgaXMgbm90IGluIHN5bmMgZm9yIHRoZQotICBub24tYnVmLW9wdCBkZWNvZGVyIHN1Y2ggYXMgQUFDLiBIZW5jZSB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb24gdGhlIHRyYW5zaWVudCBpbiB0aGUKLSAgcHJlc2VudCBmcmFtZSBhcyB3ZWxsIGFzIGluIHRoZSBuZXh0LgorICBUaGUgZGV0ZWN0aW9uIG9mIG5vaXNlLWZsb29yLCBtaXNzaW5nIGhhcm1vbmljcyBhbmQgaW52Zl9lc3QsIGlzIG5vdCBpbiBzeW5jCisgIGZvciB0aGUgbm9uLWJ1Zi1vcHQgZGVjb2RlciBzdWNoIGFzIEFBQy4gSGVuY2Ugd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9uIHRoZQorICB0cmFuc2llbnQgaW4gdGhlIHByZXNlbnQgZnJhbWUgYXMgd2VsbCBhcyBpbiB0aGUgbmV4dC4KICAgKi8KICAgdHJhbnNpZW50RnJhbWUgPSAwOwotICBpZihoVG9uQ29yci0+dHJhbnNpZW50TmV4dEZyYW1lKXsgICAgICAgLyogVGhlIHRyYW5zaWVudCB3YXMgZGV0ZWN0ZWQgaW4gdGhlIHByZXZpb3VzIGZyYW1lLCBidXQgaXMgYWN0dWFsbHkgKi8KKyAgaWYgKGhUb25Db3JyLT50cmFuc2llbnROZXh0RnJhbWUpIHsgLyogVGhlIHRyYW5zaWVudCB3YXMgZGV0ZWN0ZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIGZyYW1lLCBidXQgaXMgYWN0dWFsbHkgKi8KICAgICB0cmFuc2llbnRGcmFtZSA9IDE7CiAgICAgaFRvbkNvcnItPnRyYW5zaWVudE5leHRGcmFtZSA9IDA7CiAKLSAgICBpZih0cmFuc2llbnRGbGFnKXsKLSAgICAgIGlmKHRyYW5zaWVudFBvcyArIGhUb25Db3JyLT50cmFuc2llbnRQb3NPZmZzZXQgPj0gZnJhbWVJbmZvLT5ib3JkZXJzW2ZyYW1lSW5mby0+bkVudmVsb3Blc10peworICAgIGlmICh0cmFuc2llbnRGbGFnKSB7CisgICAgICBpZiAodHJhbnNpZW50UG9zICsgaFRvbkNvcnItPnRyYW5zaWVudFBvc09mZnNldCA+PQorICAgICAgICAgIGZyYW1lSW5mby0+Ym9yZGVyc1tmcmFtZUluZm8tPm5FbnZlbG9wZXNdKSB7CiAgICAgICAgIGhUb25Db3JyLT50cmFuc2llbnROZXh0RnJhbWUgPSAxOwogICAgICAgfQogICAgIH0KLSAgfQotICBlbHNlewotICAgIGlmKHRyYW5zaWVudEZsYWcpewotICAgICAgaWYodHJhbnNpZW50UG9zICsgaFRvbkNvcnItPnRyYW5zaWVudFBvc09mZnNldCA8IGZyYW1lSW5mby0+Ym9yZGVyc1tmcmFtZUluZm8tPm5FbnZlbG9wZXNdKXsKKyAgfSBlbHNlIHsKKyAgICBpZiAodHJhbnNpZW50RmxhZykgeworICAgICAgaWYgKHRyYW5zaWVudFBvcyArIGhUb25Db3JyLT50cmFuc2llbnRQb3NPZmZzZXQgPAorICAgICAgICAgIGZyYW1lSW5mby0+Ym9yZGVyc1tmcmFtZUluZm8tPm5FbnZlbG9wZXNdKSB7CiAgICAgICAgIHRyYW5zaWVudEZyYW1lID0gMTsKICAgICAgICAgaFRvbkNvcnItPnRyYW5zaWVudE5leHRGcmFtZSA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNleworICAgICAgfSBlbHNlIHsKICAgICAgICAgaFRvbkNvcnItPnRyYW5zaWVudE5leHRGcmFtZSA9IDE7CiAgICAgICB9CiAgICAgfQogICB9CiAgIHRyYW5zaWVudEZyYW1lSW52ZkVzdCA9IHRyYW5zaWVudEZyYW1lOwogCi0KICAgLyoKICAgICBFc3RpbWF0ZSB0aGUgcmVxdWlyZWQgaW52ZXNlIGZpbHRlcmVpbmcgbGV2ZWwuCiAgICovCiAgIGlmIChoVG9uQ29yci0+c3dpdGNoSW52ZXJzZUZpbHQpCi0gICAgRkRLc2JyRW5jX3FtZkludmVyc2VGaWx0ZXJpbmdEZXRlY3RvcigmaFRvbkNvcnItPnNickludkZpbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+cXVvdGFNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+bnJnVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPmluZGV4VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPmZyYW1lU3RhcnRJbmRleEludmZFc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSArIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXhJbnZmRXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50RnJhbWVJbnZmRXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mVmVjKTsKKyAgICBGREtzYnJFbmNfcW1mSW52ZXJzZUZpbHRlcmluZ0RldGVjdG9yKAorICAgICAgICAmaFRvbkNvcnItPnNickludkZpbHQsIGhUb25Db3JyLT5xdW90YU1hdHJpeCwgaFRvbkNvcnItPm5yZ1ZlY3RvciwKKyAgICAgICAgaFRvbkNvcnItPmluZGV4VmVjdG9yLCBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCwKKyAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUgKyBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCwKKyAgICAgICAgdHJhbnNpZW50RnJhbWVJbnZmRXN0LCBpbmZWZWMpOwogCiAgIC8qCiAgICAgICBEZXRlY3Qgd2hhdCB0b25lcyB3aWxsIGJlIG1pc3NpbmcuCiAgICAqLwotICBpZiAoeHBvc1R5cGUgPT0gWFBPU19MQyApewotICAgIEZES3NickVuY19TYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3JRbWYoJmhUb25Db3JyLT5zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+cXVvdGFNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+c2lnbk1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5pbmRleFZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSGFybW9uaWNGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0hhcm1vbmljc0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZUNvbXBlbnNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5ucmdWZWN0b3JGcmVxKTsKLSAgfQotICBlbHNleworICBpZiAoeHBvc1R5cGUgPT0gWFBPU19MQykgeworICAgIEZES3NickVuY19TYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3JRbWYoCisgICAgICAgICZoVG9uQ29yci0+c2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLCBoVG9uQ29yci0+cXVvdGFNYXRyaXgsCisgICAgICAgIGhUb25Db3JyLT5zaWduTWF0cml4LCBoVG9uQ29yci0+aW5kZXhWZWN0b3IsIGZyYW1lSW5mbywgdHJhbnNpZW50SW5mbywKKyAgICAgICAgbWlzc2luZ0hhcm1vbmljRmxhZywgbWlzc2luZ0hhcm1vbmljc0luZGV4LCBmcmVxQmFuZFRhYmxlLCBuU2ZiLAorICAgICAgICBlbnZlbG9wZUNvbXBlbnNhdGlvbiwgaFRvbkNvcnItPm5yZ1ZlY3RvckZyZXEpOworICB9IGVsc2UgewogICAgICptaXNzaW5nSGFybW9uaWNGbGFnID0gMDsKLSAgICBGREttZW1jbGVhcihtaXNzaW5nSGFybW9uaWNzSW5kZXgsblNmYipzaXplb2YoVUNIQVIpKTsKKyAgICBGREttZW1jbGVhcihtaXNzaW5nSGFybW9uaWNzSW5kZXgsIG5TZmIgKiBzaXplb2YoVUNIQVIpKTsKICAgfQogCi0KLQogICAvKgogICAgIE5vaXNlIGZsb29yIGVzdGltYXRpb24KICAgKi8KIAogICBpbmZWZWNQdHIgPSBoVG9uQ29yci0+c2JySW52RmlsdC5wcmV2SW52Zk1vZGU7CiAKLSAgRkRLc2JyRW5jX3Nick5vaXNlRmxvb3JFc3RpbWF0ZVFtZigmaFRvbkNvcnItPnNick5vaXNlRmxvb3JFc3RpbWF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9pc2VMZXZlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPnF1b3RhTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5pbmRleFZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbWlzc2luZ0hhcm1vbmljRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudEZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZlZlY1B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7Ci0KKyAgRkRLc2JyRW5jX3Nick5vaXNlRmxvb3JFc3RpbWF0ZVFtZigKKyAgICAgICZoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLCBmcmFtZUluZm8sIG5vaXNlTGV2ZWxzLAorICAgICAgaFRvbkNvcnItPnF1b3RhTWF0cml4LCBoVG9uQ29yci0+aW5kZXhWZWN0b3IsICptaXNzaW5nSGFybW9uaWNGbGFnLAorICAgICAgaFRvbkNvcnItPmZyYW1lU3RhcnRJbmRleCwgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUsCisgICAgICB0cmFuc2llbnRGcmFtZSwgaW5mVmVjUHRyLCBzYnJTeW50YXhGbGFncyk7CiAKICAgLyogU3RvcmUgdGhlIGludmZWZWMgZGF0YSBmb3IgdGhlIG5leHQgZnJhbWUuLi4qLwotICBmb3IoYmFuZCA9IDAgOyBiYW5kIDwgaFRvbkNvcnItPnNickludkZpbHQubm9EZXRlY3RvckJhbmRzOyBiYW5kKyspeworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgaFRvbkNvcnItPnNickludkZpbHQubm9EZXRlY3RvckJhbmRzOyBiYW5kKyspIHsKICAgICBoVG9uQ29yci0+c2JySW52RmlsdC5wcmV2SW52Zk1vZGVbYmFuZF0gPSBpbmZWZWNbYmFuZF07CiAgIH0KIH0KQEAgLTQ0OSwyOCArNDY1LDIyIEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1maW5kQ2xvc2VzdEVudHJ5KElOVCBnb2FsU2IsCi0gICAgICAgICAgICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLAotICAgICAgICAgICAgICAgICBJTlQgbnVtTWFzdGVyLAotICAgICAgICAgICAgICAgICBJTlQgZGlyZWN0aW9uKQoteworc3RhdGljIElOVCBmaW5kQ2xvc2VzdEVudHJ5KElOVCBnb2FsU2IsIFVDSEFSICp2X2tfbWFzdGVyLCBJTlQgbnVtTWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkaXJlY3Rpb24pIHsKICAgSU5UIGluZGV4OwogCi0gIGlmKCBnb2FsU2IgPD0gdl9rX21hc3RlclswXSApCi0gICAgcmV0dXJuIHZfa19tYXN0ZXJbMF07CisgIGlmIChnb2FsU2IgPD0gdl9rX21hc3RlclswXSkgcmV0dXJuIHZfa19tYXN0ZXJbMF07CiAKLSAgaWYoIGdvYWxTYiA+PSB2X2tfbWFzdGVyW251bU1hc3Rlcl0gKQotICAgIHJldHVybiB2X2tfbWFzdGVyW251bU1hc3Rlcl07CisgIGlmIChnb2FsU2IgPj0gdl9rX21hc3RlcltudW1NYXN0ZXJdKSByZXR1cm4gdl9rX21hc3RlcltudW1NYXN0ZXJdOwogCi0gIGlmKGRpcmVjdGlvbikgeworICBpZiAoZGlyZWN0aW9uKSB7CiAgICAgaW5kZXggPSAwOwotICAgIHdoaWxlKCB2X2tfbWFzdGVyW2luZGV4XSA8IGdvYWxTYiApIHsKKyAgICB3aGlsZSAodl9rX21hc3RlcltpbmRleF0gPCBnb2FsU2IpIHsKICAgICAgIGluZGV4Kys7CiAgICAgfQogICB9IGVsc2UgewogICAgIGluZGV4ID0gbnVtTWFzdGVyOwotICAgIHdoaWxlKCB2X2tfbWFzdGVyW2luZGV4XSA+IGdvYWxTYiApIHsKKyAgICB3aGlsZSAodl9rX21hc3RlcltpbmRleF0gPiBnb2FsU2IpIHsKICAgICAgIGluZGV4LS07CiAgICAgfQogICB9CkBAIC00NzgsNyArNDg4LDYgQEAKICAgcmV0dXJuIHZfa19tYXN0ZXJbaW5kZXhdOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgICAgIHJlc2V0cyB0aGUgcGF0Y2gKQEAgLTQ4OSwzMiArNDk4LDM2IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1yZXNldFBhdGNoKEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KLSAgICAgICAgICAgSU5UIHhwb3NjdHJsLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpZmZlcmVudCBwYXRjaCBtb2Rlcy4gKi8KLSAgICAgICAgICAgSU5UIGhpZ2hCYW5kU3RhcnRTYiwgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGJhbmQgb2YgdGhlIFNCUiByYW5nZS4gKi8KLSAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsICAgICAgICAgICAgICAgICAgIC8qITwgTWFzdGVyIGZyZXF1ZW5jeSB0YWJsZSBmcm9tIHdoaWNoIGFsbCBvdGhlciB0YWJsZSBhcmUgZGVyaXZlZC4qLwotICAgICAgICAgICBJTlQgbnVtTWFzdGVyLCAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXN0ZXIgdGFibGUuICovCi0gICAgICAgICAgIElOVCBmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kuICovCi0gICAgICAgICAgIElOVCBub0NoYW5uZWxzKSAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgUU1GLWNoYW5uZWxzLiAqLworc3RhdGljIElOVCByZXNldFBhdGNoKAorICAgIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgIElOVCB4cG9zY3RybCwgICAgICAgICAgICAgICAgICAgICAvKiE8IERpZmZlcmVudCBwYXRjaCBtb2Rlcy4gKi8KKyAgICBJTlQgaGlnaEJhbmRTdGFydFNiLCAgICAgICAgICAgICAgLyohPCBTdGFydCBiYW5kIG9mIHRoZSBTQlIgcmFuZ2UuICovCisgICAgVUNIQVIgKnZfa19tYXN0ZXIsIC8qITwgTWFzdGVyIGZyZXF1ZW5jeSB0YWJsZSBmcm9tIHdoaWNoIGFsbCBvdGhlciB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZGVyaXZlZC4qLworICAgIElOVCBudW1NYXN0ZXIsICAgICAvKiE8IE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFzdGVyIHRhYmxlLiAqLworICAgIElOVCBmcywgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIGZyZXF1ZW5jeS4gKi8KKyAgICBJTlQgbm9DaGFubmVscykgICAgLyohPCBOdW1iZXIgb2YgUU1GLWNoYW5uZWxzLiAqLwogewotICBJTlQgcGF0Y2gsayxpOworICBJTlQgcGF0Y2gsIGssIGk7CiAgIElOVCB0YXJnZXRTdG9wQmFuZDsKIAotICBQQVRDSF9QQVJBTSAgKnBhdGNoUGFyYW0gPSBoVG9uQ29yci0+cGF0Y2hQYXJhbTsKKyAgUEFUQ0hfUEFSQU0gKnBhdGNoUGFyYW0gPSBoVG9uQ29yci0+cGF0Y2hQYXJhbTsKIAogICBJTlQgc2JHdWFyZCA9IGhUb25Db3JyLT5ndWFyZDsKICAgSU5UIHNvdXJjZVN0YXJ0QmFuZDsKICAgSU5UIHBhdGNoRGlzdGFuY2U7CiAgIElOVCBudW1CYW5kc0luUGF0Y2g7CiAKLSAgSU5UIGxzYiA9IHZfa19tYXN0ZXJbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93ZXN0IHN1YmJhbmQgcmVsYXRlZCB0byB0aGUgc3ludGhlc2lzIGZpbHRlcmJhbmsgKi8KLSAgSU5UIHVzYiA9IHZfa19tYXN0ZXJbbnVtTWFzdGVyXTsgICAgICAgICAgICAgICAgICAgLyogU3RvcCBzdWJiYW5kIHJlbGF0ZWQgdG8gdGhlIHN5bnRoZXNpcyBmaWx0ZXJiYW5rICovCi0gIElOVCB4b3Zlck9mZnNldCA9IGhpZ2hCYW5kU3RhcnRTYiAtIHZfa19tYXN0ZXJbMF07IC8qIENhbGN1bGF0ZSBkaXN0YW5jZSBpbiBzdWJiYW5kcyBiZXR3ZWVuIGswIGFuZCBreCAqLworICBJTlQgbHNiID0KKyAgICAgIHZfa19tYXN0ZXJbMF07IC8qIExvd2VzdCBzdWJiYW5kIHJlbGF0ZWQgdG8gdGhlIHN5bnRoZXNpcyBmaWx0ZXJiYW5rICovCisgIElOVCB1c2IgPSB2X2tfbWFzdGVyW251bU1hc3Rlcl07IC8qIFN0b3Agc3ViYmFuZCByZWxhdGVkIHRvIHRoZSBzeW50aGVzaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyYmFuayAqLworICBJTlQgeG92ZXJPZmZzZXQgPQorICAgICAgaGlnaEJhbmRTdGFydFNiIC0KKyAgICAgIHZfa19tYXN0ZXJbMF07IC8qIENhbGN1bGF0ZSBkaXN0YW5jZSBpbiBzdWJiYW5kcyBiZXR3ZWVuIGswIGFuZCBreCAqLwogCiAgIElOVCBnb2FsU2I7CiAKLQogICAvKgogICAgKiBJbml0aWFsaXplIHRoZSBwYXRjaGluZyBwYXJhbWV0ZXIKICAgICovCkBAIC01MjQsNDcgKzUzNyw1NSBAQAogICAgIHhvdmVyT2Zmc2V0ID0gMDsKICAgfQogCi0gIGdvYWxTYiA9IChJTlQpKCAoMiAqIG5vQ2hhbm5lbHMgKiAxNjAwMCArIChmcz4+MSkpIC8gZnMgKTsgLyogMTYga0h6IGJhbmQgKi8KLSAgZ29hbFNiID0gZmluZENsb3Nlc3RFbnRyeShnb2FsU2IsIHZfa19tYXN0ZXIsIG51bU1hc3RlciwgMSk7IC8qIEFkYXB0IHJlZ2lvbiB0byBtYXN0ZXItdGFibGUgKi8KKyAgZ29hbFNiID0gKElOVCkoKDIgKiBub0NoYW5uZWxzICogMTYwMDAgKyAoZnMgPj4gMSkpIC8gZnMpOyAvKiAxNiBrSHogYmFuZCAqLworICBnb2FsU2IgPSBmaW5kQ2xvc2VzdEVudHJ5KGdvYWxTYiwgdl9rX21hc3RlciwgbnVtTWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKiBBZGFwdCByZWdpb24gdG8gbWFzdGVyLXRhYmxlICovCiAKICAgLyogRmlyc3QgcGF0Y2ggKi8KICAgc291cmNlU3RhcnRCYW5kID0gaFRvbkNvcnItPnNoaWZ0U3RhcnRTYiArIHhvdmVyT2Zmc2V0OwogICB0YXJnZXRTdG9wQmFuZCA9IGxzYiArIHhvdmVyT2Zmc2V0OwogCi0gIC8qIGV2ZW4gKG9kZCkgbnVtYmVyZWQgY2hhbm5lbCBtdXN0IGJlIHBhdGNoZWQgdG8gZXZlbiAob2RkKSBudW1iZXJlZCBjaGFubmVsICovCisgIC8qIGV2ZW4gKG9kZCkgbnVtYmVyZWQgY2hhbm5lbCBtdXN0IGJlIHBhdGNoZWQgdG8gZXZlbiAob2RkKSBudW1iZXJlZCBjaGFubmVsCisgICAqLwogICBwYXRjaCA9IDA7Ci0gIHdoaWxlKHRhcmdldFN0b3BCYW5kIDwgdXNiKSB7Ci0KKyAgd2hpbGUgKHRhcmdldFN0b3BCYW5kIDwgdXNiKSB7CiAgICAgLyogVG8gbWFueSBwYXRjaGVzICovCi0gICAgaWYgKHBhdGNoID49IE1BWF9OVU1fUEFUQ0hFUykKLSAgICAgIHJldHVybigxKTsgLypOdW1iZXIgb2YgcGF0Y2hlcyB0byBoaWdoICovCisgICAgaWYgKHBhdGNoID49IE1BWF9OVU1fUEFUQ0hFUykgcmV0dXJuICgxKTsgLypOdW1iZXIgb2YgcGF0Y2hlcyB0byBoaWdoICovCiAKICAgICBwYXRjaFBhcmFtW3BhdGNoXS5ndWFyZFN0YXJ0QmFuZCA9IHRhcmdldFN0b3BCYW5kOwogICAgIHRhcmdldFN0b3BCYW5kICs9IHNiR3VhcmQ7CiAgICAgcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0U3RhcnRCYW5kID0gdGFyZ2V0U3RvcEJhbmQ7CiAKLSAgICBudW1CYW5kc0luUGF0Y2ggPSBnb2FsU2IgLSB0YXJnZXRTdG9wQmFuZDsgICAgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBkZXNpcmVkIHJhbmdlIG9mIHRoZSBwYXRjaCAqLworICAgIG51bUJhbmRzSW5QYXRjaCA9CisgICAgICAgIGdvYWxTYiAtIHRhcmdldFN0b3BCYW5kOyAvKiBnZXQgdGhlIGRlc2lyZWQgcmFuZ2Ugb2YgdGhlIHBhdGNoICovCiAKLSAgICBpZiAoIG51bUJhbmRzSW5QYXRjaCA+PSBsc2IgLSBzb3VyY2VTdGFydEJhbmQgKSB7CisgICAgaWYgKG51bUJhbmRzSW5QYXRjaCA+PSBsc2IgLSBzb3VyY2VTdGFydEJhbmQpIHsKICAgICAgIC8qIGRlc2lyZWQgbnVtYmVyIGJhbmRzIGFyZSBub3QgYXZhaWxhYmxlIC0+IHBhdGNoIHdob2xlIHNvdXJjZSByYW5nZSAqLwotICAgICAgcGF0Y2hEaXN0YW5jZSAgID0gdGFyZ2V0U3RvcEJhbmQgLSBzb3VyY2VTdGFydEJhbmQ7ICAgICAgICAvKiBnZXQgdGhlIHRhcmdldE9mZnNldCAqLwotICAgICAgcGF0Y2hEaXN0YW5jZSAgID0gcGF0Y2hEaXN0YW5jZSAmIH4xOyAgICAgICAgICAgICAgICAgICAgICAvKiByb3VuZGluZyBvZmYgb2RkIG51bWJlcnMgYW5kIG1ha2UgYWxsIGV2ZW4gKi8KKyAgICAgIHBhdGNoRGlzdGFuY2UgPQorICAgICAgICAgIHRhcmdldFN0b3BCYW5kIC0gc291cmNlU3RhcnRCYW5kOyAvKiBnZXQgdGhlIHRhcmdldE9mZnNldCAqLworICAgICAgcGF0Y2hEaXN0YW5jZSA9CisgICAgICAgICAgcGF0Y2hEaXN0YW5jZSAmIH4xOyAvKiByb3VuZGluZyBvZmYgb2RkIG51bWJlcnMgYW5kIG1ha2UgYWxsIGV2ZW4gKi8KICAgICAgIG51bUJhbmRzSW5QYXRjaCA9IGxzYiAtICh0YXJnZXRTdG9wQmFuZCAtIHBhdGNoRGlzdGFuY2UpOwotICAgICAgbnVtQmFuZHNJblBhdGNoID0gZmluZENsb3Nlc3RFbnRyeSh0YXJnZXRTdG9wQmFuZCArIG51bUJhbmRzSW5QYXRjaCwgdl9rX21hc3RlciwgbnVtTWFzdGVyLCAwKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTdG9wQmFuZDsgIC8qIEFkYXB0IHJlZ2lvbiB0byBtYXN0ZXItdGFibGUgKi8KKyAgICAgIG51bUJhbmRzSW5QYXRjaCA9IGZpbmRDbG9zZXN0RW50cnkodGFyZ2V0U3RvcEJhbmQgKyBudW1CYW5kc0luUGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfa19tYXN0ZXIsIG51bU1hc3RlciwgMCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3RvcEJhbmQ7IC8qIEFkYXB0IHJlZ2lvbiB0byBtYXN0ZXItdGFibGUgKi8KICAgICB9CiAKLSAgICAvKiBkZXNpcmVkIG51bWJlciBiYW5kcyBhcmUgYXZhaWxhYmxlIC0+IGdldCB0aGUgbWluaW1hbCBldmVuIHBhdGNoaW5nIGRpc3RhbmNlICovCi0gICAgcGF0Y2hEaXN0YW5jZSAgID0gbnVtQmFuZHNJblBhdGNoICsgdGFyZ2V0U3RvcEJhbmQgLSBsc2I7ICAvKiBnZXQgbWluaW1hbCBkaXN0YW5jZSAqLwotICAgIHBhdGNoRGlzdGFuY2UgICA9IChwYXRjaERpc3RhbmNlICsgMSkgJiB+MTsgICAgICAgICAgICAgICAgLyogcm91bmRpbmcgdXAgb2RkIG51bWJlcnMgYW5kIG1ha2UgYWxsIGV2ZW4gKi8KKyAgICAvKiBkZXNpcmVkIG51bWJlciBiYW5kcyBhcmUgYXZhaWxhYmxlIC0+IGdldCB0aGUgbWluaW1hbCBldmVuIHBhdGNoaW5nCisgICAgICogZGlzdGFuY2UgKi8KKyAgICBwYXRjaERpc3RhbmNlID0KKyAgICAgICAgbnVtQmFuZHNJblBhdGNoICsgdGFyZ2V0U3RvcEJhbmQgLSBsc2I7IC8qIGdldCBtaW5pbWFsIGRpc3RhbmNlICovCisgICAgcGF0Y2hEaXN0YW5jZSA9IChwYXRjaERpc3RhbmNlICsgMSkgJgorICAgICAgICAgICAgICAgICAgICB+MTsgLyogcm91bmRpbmcgdXAgb2RkIG51bWJlcnMgYW5kIG1ha2UgYWxsIGV2ZW4gKi8KIAogICAgIGlmIChudW1CYW5kc0luUGF0Y2ggPD0gMCkgewogICAgICAgcGF0Y2gtLTsKICAgICB9IGVsc2UgewogICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kID0gdGFyZ2V0U3RvcEJhbmQgLSBwYXRjaERpc3RhbmNlOwotICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0QmFuZE9mZnMgID0gcGF0Y2hEaXN0YW5jZTsKKyAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzID0gcGF0Y2hEaXN0YW5jZTsKICAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaCA9IG51bUJhbmRzSW5QYXRjaDsKLSAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kICA9IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZCArIG51bUJhbmRzSW5QYXRjaDsKKyAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kID0KKyAgICAgICAgICBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQgKyBudW1CYW5kc0luUGF0Y2g7CiAKICAgICAgIHRhcmdldFN0b3BCYW5kICs9IHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaDsKICAgICB9CkBAIC01NzMsNDIgKzU5NCwzOCBAQAogICAgIHNvdXJjZVN0YXJ0QmFuZCA9IGhUb25Db3JyLT5zaGlmdFN0YXJ0U2I7CiAKICAgICAvKiBDaGVjayBpZiB3ZSBhcmUgY2xvc2UgdG8gZ29hbFNiICovCi0gICAgaWYoIGZpeHBfYWJzKHRhcmdldFN0b3BCYW5kIC0gZ29hbFNiKSA8IDMpIHsKKyAgICBpZiAoZml4cF9hYnModGFyZ2V0U3RvcEJhbmQgLSBnb2FsU2IpIDwgMykgewogICAgICAgZ29hbFNiID0gdXNiOwogICAgIH0KIAogICAgIHBhdGNoKys7Ci0KICAgfQogCiAgIHBhdGNoLS07CiAKICAgLyogaWYgaGlnaGVzdCBwYXRjaCBjb250YWlucyBsZXNzIHRoYW4gdGhyZWUgc3ViYmFuZDogc2tpcCBpdCAqLwotICBpZiAoIHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaCA8IDMgJiYgcGF0Y2ggPiAwICkgeworICBpZiAocGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoIDwgMyAmJiBwYXRjaCA+IDApIHsKICAgICBwYXRjaC0tOwotICAgIHRhcmdldFN0b3BCYW5kID0gcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0U3RhcnRCYW5kICsgcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoOwogICB9CiAKICAgaFRvbkNvcnItPm5vT2ZQYXRjaGVzID0gcGF0Y2ggKyAxOwogCi0KICAgLyogQXNzaWduIHRoZSBpbmRleC12ZWN0b3IsIHNvIHdlIGtub3cgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGhpZ2gtYmFuZC4KICAgICAgLTEgcmVwcmVzZW50cyBhIGd1YXJkLWJhbmQuICovCi0gIGZvcihrID0gMDsgayA8IGhUb25Db3JyLT5wYXRjaFBhcmFtWzBdLmd1YXJkU3RhcnRCYW5kOyBrKyspCisgIGZvciAoayA9IDA7IGsgPCBoVG9uQ29yci0+cGF0Y2hQYXJhbVswXS5ndWFyZFN0YXJ0QmFuZDsgaysrKQogICAgIGhUb25Db3JyLT5pbmRleFZlY3RvcltrXSA9IGs7CiAKLSAgZm9yKGkgPSAwOyBpIDwgaFRvbkNvcnItPm5vT2ZQYXRjaGVzOyBpKyspCi0gIHsKLSAgICBJTlQgc291cmNlU3RhcnQgICAgPSBoVG9uQ29yci0+cGF0Y2hQYXJhbVtpXS5zb3VyY2VTdGFydEJhbmQ7Ci0gICAgSU5UIHRhcmdldFN0YXJ0ICAgID0gaFRvbkNvcnItPnBhdGNoUGFyYW1baV0udGFyZ2V0U3RhcnRCYW5kOwotICAgIElOVCBudW1iZXJPZkJhbmRzICA9IGhUb25Db3JyLT5wYXRjaFBhcmFtW2ldLm51bUJhbmRzSW5QYXRjaDsKKyAgZm9yIChpID0gMDsgaSA8IGhUb25Db3JyLT5ub09mUGF0Y2hlczsgaSsrKSB7CisgICAgSU5UIHNvdXJjZVN0YXJ0ID0gaFRvbkNvcnItPnBhdGNoUGFyYW1baV0uc291cmNlU3RhcnRCYW5kOworICAgIElOVCB0YXJnZXRTdGFydCA9IGhUb25Db3JyLT5wYXRjaFBhcmFtW2ldLnRhcmdldFN0YXJ0QmFuZDsKKyAgICBJTlQgbnVtYmVyT2ZCYW5kcyA9IGhUb25Db3JyLT5wYXRjaFBhcmFtW2ldLm51bUJhbmRzSW5QYXRjaDsKICAgICBJTlQgc3RhcnRHdWFyZEJhbmQgPSBoVG9uQ29yci0+cGF0Y2hQYXJhbVtpXS5ndWFyZFN0YXJ0QmFuZDsKIAotICAgIGZvcihrID0gMDsgayA8ICh0YXJnZXRTdGFydC0gc3RhcnRHdWFyZEJhbmQpOyBrKyspCi0gICAgICBoVG9uQ29yci0+aW5kZXhWZWN0b3Jbc3RhcnRHdWFyZEJhbmQra10gPSAtMTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgKHRhcmdldFN0YXJ0IC0gc3RhcnRHdWFyZEJhbmQpOyBrKyspCisgICAgICBoVG9uQ29yci0+aW5kZXhWZWN0b3Jbc3RhcnRHdWFyZEJhbmQgKyBrXSA9IC0xOwogCi0gICAgZm9yKGsgPSAwOyBrIDwgbnVtYmVyT2ZCYW5kczsgaysrKQotICAgICAgaFRvbkNvcnItPmluZGV4VmVjdG9yW3RhcmdldFN0YXJ0K2tdID0gc291cmNlU3RhcnQrazsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtYmVyT2ZCYW5kczsgaysrKQorICAgICAgaFRvbkNvcnItPmluZGV4VmVjdG9yW3RhcmdldFN0YXJ0ICsga10gPSBzb3VyY2VTdGFydCArIGs7CiAgIH0KIAogICByZXR1cm4gKDApOwpAQCAtNjI0LDI4ICs2NDEsNDIgQEAKICAgXHJldHVybiAgIGVycm9yQ29kZSwgbm9FcnJvciBpZiBzdWNjZXNzZnVsLgogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX0NyZWF0ZVRvbkNvcnJQYXJhbUV4dHIoSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsIC8qITwgUG9pbnRlciB0byBoYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgIGNoYW4pICAgICAvKiE8IENoYW5uZWwgaW5kZXgsIG5lZWRlZCBmb3IgbWVtIGFsbG9jYXRpb24gKi8KK0lOVCBGREtzYnJFbmNfQ3JlYXRlVG9uQ29yclBhcmFtRXh0cigKKyAgICBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVAorICAgICAgICBoVG9uQ29yciwgLyohPCBQb2ludGVyIHRvIGhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgIElOVCBjaGFuKSAgICAgLyohPCBDaGFubmVsIGluZGV4LCBuZWVkZWQgZm9yIG1lbSBhbGxvY2F0aW9uICovCiB7CiAgIElOVCBpOwotICBGSVhQX0RCTCogcXVvdGFNYXRyaXggPSBHZXRSYW1fU2JyX3F1b3RhTWF0cml4KGNoYW4pOwotICBJTlQqICAgICAgc2lnbk1hdHJpeCAgPSBHZXRSYW1fU2JyX3NpZ25NYXRyaXgoY2hhbik7CisgIEZJWFBfREJMICpxdW90YU1hdHJpeCA9IEdldFJhbV9TYnJfcXVvdGFNYXRyaXgoY2hhbik7CisgIElOVCAqc2lnbk1hdHJpeCA9IEdldFJhbV9TYnJfc2lnbk1hdHJpeChjaGFuKTsKKworICBpZiAoKE5VTEwgPT0gcXVvdGFNYXRyaXgpIHx8IChOVUxMID09IHNpZ25NYXRyaXgpKSB7CisgICAgZ290byBiYWlsOworICB9CiAKICAgRkRLbWVtY2xlYXIoaFRvbkNvcnIsIHNpemVvZihTQlJfVE9OX0NPUlJfRVNUKSk7CiAKLSAgZm9yIChpPTA7IGk8TUFYX05PX09GX0VTVElNQVRFUzsgaSsrKSB7Ci0gICAgaFRvbkNvcnItPnF1b3RhTWF0cml4W2ldID0gcXVvdGFNYXRyaXggKyAoaSpRTUZfQ0hBTk5FTFMpOwotICAgIGhUb25Db3JyLT5zaWduTWF0cml4W2ldICA9IHNpZ25NYXRyaXggICsgKGkqUU1GX0NIQU5ORUxTKTsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9FU1RJTUFURVM7IGkrKykgeworICAgIGhUb25Db3JyLT5xdW90YU1hdHJpeFtpXSA9IHF1b3RhTWF0cml4ICsgKGkgKiA2NCk7CisgICAgaFRvbkNvcnItPnNpZ25NYXRyaXhbaV0gPSBzaWduTWF0cml4ICsgKGkgKiA2NCk7CiAgIH0KIAotICBGREtzYnJFbmNfQ3JlYXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yICgmaFRvbkNvcnItPnNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwgY2hhbik7CisgIGlmICgwICE9IEZES3NickVuY19DcmVhdGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCisgICAgICAgICAgICAgICAmaFRvbkNvcnItPnNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwgY2hhbikpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KIAogICByZXR1cm4gMDsKKworYmFpbDoKKyAgaFRvbkNvcnItPnF1b3RhTWF0cml4WzBdID0gcXVvdGFNYXRyaXg7CisgIGhUb25Db3JyLT5zaWduTWF0cml4WzBdID0gc2lnbk1hdHJpeDsKKworICBGREtzYnJFbmNfRGVsZXRlVG9uQ29yclBhcmFtRXh0cihoVG9uQ29ycik7CisKKyAgcmV0dXJuIC0xOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgdG9uYWxpdHkgY29ycmVjdGlvbiBwYXJhbWV0ZXIgbW9kdWxlLgpAQCAtNjU2LDI3ICs2ODcsMjkgQEAKICAgXHJldHVybiAgIGVycm9yQ29kZSwgbm9FcnJvciBpZiBzdWNjZXNzZnVsLgogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX0luaXRUb25Db3JyUGFyYW1FeHRyIChJTlQgZnJhbWVTaXplLCAgICAgICAgICAgICAgICAgICAgIC8qITwgQ3VycmVudCBTQlIgZnJhbWUgc2l6ZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsICAvKiE8IFBvaW50ZXIgdG8gaGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgc2JyQ2ZnLCAgICAgLyohPCBQb2ludGVyIHRvIFNCUiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0aW1lU2xvdHMsICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZS1zbG90cyBwZXIgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHhwb3NDdHJsLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpZmZlcmVudCBwYXRjaCBtb2Rlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFuYV9tYXhfbGV2ZWwsICAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gbGV2ZWwgb2YgdGhlIGFkYXB0aXZlIG5vaXNlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9pc2VCYW5kcywgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGJhbmRzIHBlciBvY3RhdmUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub2lzZUZsb29yT2Zmc2V0LCAgICAgICAgICAgICAgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdXNlU3BlZWNoQ29uZmlnKSAgICAgICAgICAgICAgLyohPCBTcGVlY2ggb3IgbXVzaWMgdHVuaW5nLiAqLworSU5UIEZES3NickVuY19Jbml0VG9uQ29yclBhcmFtRXh0cigKKyAgICBJTlQgZnJhbWVTaXplLCAvKiE8IEN1cnJlbnQgU0JSIGZyYW1lIHNpemUuICovCisgICAgSEFORExFX1NCUl9UT05fQ09SUl9FU1QKKyAgICAgICAgaFRvbkNvcnIsIC8qITwgUG9pbnRlciB0byBoYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KKyAgICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBCisgICAgICAgIHNickNmZywgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBTQlIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiAqLworICAgIElOVCB0aW1lU2xvdHMsICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lLXNsb3RzIHBlciBmcmFtZSAqLworICAgIElOVCB4cG9zQ3RybCwgICAgICAgICAvKiE8IERpZmZlcmVudCBwYXRjaCBtb2Rlcy4gKi8KKyAgICBJTlQgYW5hX21heF9sZXZlbCwgICAgLyohPCBNYXhpbXVtIGxldmVsIG9mIHRoZSBhZGFwdGl2ZSBub2lzZS4gKi8KKyAgICBJTlQgbm9pc2VCYW5kcywgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgcGVyIG9jdGF2ZS4gKi8KKyAgICBJTlQgbm9pc2VGbG9vck9mZnNldCwgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQuICovCisgICAgVUlOVCB1c2VTcGVlY2hDb25maWcpIC8qITwgU3BlZWNoIG9yIG11c2ljIHR1bmluZy4gKi8KIHsKICAgSU5UIG5Db2xzID0gc2JyQ2ZnLT5ub1FtZlNsb3RzOwotICBJTlQgZnMgICAgPSBzYnJDZmctPnNhbXBsZUZyZXE7CisgIElOVCBmcyA9IHNickNmZy0+c2FtcGxlRnJlcTsKICAgSU5UIG5vUW1mQ2hhbm5lbHMgPSBzYnJDZmctPm5vUW1mQmFuZHM7CiAKICAgSU5UIGhpZ2hCYW5kU3RhcnRTYiA9IHNickNmZy0+ZnJlcUJhbmRUYWJsZVtMT1dfUkVTXVswXTsKLSAgVUNIQVIgKnZfa19tYXN0ZXIgICA9IHNickNmZy0+dl9rX21hc3RlcjsKLSAgSU5UIG51bU1hc3RlciAgICAgICA9IHNickNmZy0+bnVtX01hc3RlcjsKKyAgVUNIQVIgKnZfa19tYXN0ZXIgPSBzYnJDZmctPnZfa19tYXN0ZXI7CisgIElOVCBudW1NYXN0ZXIgPSBzYnJDZmctPm51bV9NYXN0ZXI7CiAKLSAgVUNIQVIgKipmcmVxQmFuZFRhYmxlICAgPSBzYnJDZmctPmZyZXFCYW5kVGFibGU7Ci0gIElOVCAgICAqblNmYiAgICAgICAgICAgID0gc2JyQ2ZnLT5uU2ZiOworICBVQ0hBUiAqKmZyZXFCYW5kVGFibGUgPSBzYnJDZmctPmZyZXFCYW5kVGFibGU7CisgIElOVCAqblNmYiA9IHNickNmZy0+blNmYjsKIAogICBJTlQgaTsKIApAQCAtNjg2LDExMyArNzE5LDEwMiBAQAogICAqLwogICBpZiAoc2JyQ2ZnLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSB7CiAgICAgc3dpdGNoICh0aW1lU2xvdHMpIHsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6Ci0gICAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzBdICAgICAgICAgICAgICA9IDggLSBMUENfT1JERVI7Ci0gICAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzFdICAgICAgICAgICAgICA9IDcgLSBMUENfT1JERVI7Ci0gICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXMgICAgICAgICA9IE5PX09GX0VTVElNQVRFU19MRDsKLSAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lID0gMjsgLyogc2JyQ2ZnLT5ub1FtZlNsb3RzIC8gNyAqLwotICAgICAgaFRvbkNvcnItPmZyYW1lU3RhcnRJbmRleEludmZFc3QgICAgPSAwOwotICAgICAgaFRvbkNvcnItPnRyYW5zaWVudFBvc09mZnNldCAgICAgICAgPSBGUkFNRV9NSURETEVfU0xPVF81MTJMRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKLSAgICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMF0gICAgICAgICAgICAgID0gOCAtIExQQ19PUkRFUjsKLSAgICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMV0gICAgICAgICAgICAgID0gOCAtIExQQ19PUkRFUjsKLSAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlcyAgICAgICAgID0gTk9fT0ZfRVNUSU1BVEVTX0xEOwotICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUgPSAyOyAvKiBzYnJDZmctPm5vUW1mU2xvdHMgLyA4ICovCi0gICAgICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCAgICA9IDA7Ci0gICAgICBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0ICAgICAgICA9IEZSQU1FX01JRERMRV9TTE9UXzUxMkxEOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6CisgICAgICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMF0gPSA4IC0gTFBDX09SREVSOworICAgICAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzFdID0gNyAtIExQQ19PUkRFUjsKKyAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzID0gTk9fT0ZfRVNUSU1BVEVTX0xEOworICAgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IDI7IC8qIHNickNmZy0+bm9RbWZTbG90cyAvIDcgKi8KKyAgICAgICAgaFRvbkNvcnItPmZyYW1lU3RhcnRJbmRleEludmZFc3QgPSAwOworICAgICAgICBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0ID0gRlJBTUVfTUlERExFX1NMT1RfNTEyTEQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgorICAgICAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzBdID0gOCAtIExQQ19PUkRFUjsKKyAgICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFsxXSA9IDggLSBMUENfT1JERVI7CisgICAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlcyA9IE5PX09GX0VTVElNQVRFU19MRDsKKyAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUgPSAyOyAvKiBzYnJDZmctPm5vUW1mU2xvdHMgLyA4ICovCisgICAgICAgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXhJbnZmRXN0ID0gMDsKKyAgICAgICAgaFRvbkNvcnItPnRyYW5zaWVudFBvc09mZnNldCA9IEZSQU1FX01JRERMRV9TTE9UXzUxMkxEOworICAgICAgICBicmVhazsKICAgICB9CiAgIH0gZWxzZQotICBzd2l0Y2ggKHRpbWVTbG90cykgewotICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6Ci0gICAgaFRvbkNvcnItPmxwY0xlbmd0aFswXSAgICAgICAgICAgICAgPSAxNiAtIExQQ19PUkRFUjsgLyogYmxvY2tMZW5ndGhbMF0gKi8KLSAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzFdICAgICAgICAgICAgICA9IDE2IC0gTFBDX09SREVSOyAvKiBibG9ja0xlbmd0aFswXSAqLwotICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlcyAgICAgICAgID0gTk9fT0ZfRVNUSU1BVEVTX0xDOwotICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lID0gc2JyQ2ZnLT5ub1FtZlNsb3RzIC8gMTY7Ci0gICAgaFRvbkNvcnItPmZyYW1lU3RhcnRJbmRleEludmZFc3QgICAgPSAwOwotICAgIGhUb25Db3JyLT50cmFuc2llbnRQb3NPZmZzZXQgICAgICAgID0gRlJBTUVfTUlERExFX1NMT1RfMjA0ODsKLSAgICBicmVhazsKLSAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgotICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMF0gICAgICAgICAgICAgID0gMTUgLSBMUENfT1JERVI7IC8qIGJsb2NrTGVuZ3RoWzBdICovCi0gICAgaFRvbkNvcnItPmxwY0xlbmd0aFsxXSAgICAgICAgICAgICAgPSAxNSAtIExQQ19PUkRFUjsgLyogYmxvY2tMZW5ndGhbMF0gKi8KLSAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXMgICAgICAgICA9IE5PX09GX0VTVElNQVRFU19MQzsKLSAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IHNickNmZy0+bm9RbWZTbG90cyAvIDE1OwotICAgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXhJbnZmRXN0ICAgID0gMDsKLSAgICBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0ICAgICAgICA9IEZSQU1FX01JRERMRV9TTE9UXzE5MjA7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6CisgICAgc3dpdGNoICh0aW1lU2xvdHMpIHsKKyAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKKyAgICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFswXSA9IDE2IC0gTFBDX09SREVSOyAvKiBibG9ja0xlbmd0aFswXSAqLworICAgICAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzFdID0gMTYgLSBMUENfT1JERVI7IC8qIGJsb2NrTGVuZ3RoWzBdICovCisgICAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlcyA9IE5PX09GX0VTVElNQVRFU19MQzsKKyAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUgPSBzYnJDZmctPm5vUW1mU2xvdHMgLyAxNjsKKyAgICAgICAgaFRvbkNvcnItPmZyYW1lU3RhcnRJbmRleEludmZFc3QgPSAwOworICAgICAgICBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0ID0gRlJBTUVfTUlERExFX1NMT1RfMjA0ODsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6CisgICAgICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMF0gPSAxNSAtIExQQ19PUkRFUjsgLyogYmxvY2tMZW5ndGhbMF0gKi8KKyAgICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFsxXSA9IDE1IC0gTFBDX09SREVSOyAvKiBibG9ja0xlbmd0aFswXSAqLworICAgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXMgPSBOT19PRl9FU1RJTUFURVNfTEM7CisgICAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lID0gc2JyQ2ZnLT5ub1FtZlNsb3RzIC8gMTU7CisgICAgICAgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXhJbnZmRXN0ID0gMDsKKyAgICAgICAgaFRvbkNvcnItPnRyYW5zaWVudFBvc09mZnNldCA9IEZSQU1FX01JRERMRV9TTE9UXzE5MjA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBoVG9uQ29yci0+YnVmZmVyTGVuZ3RoID0gbkNvbHM7CisgIGhUb25Db3JyLT5zdGVwU2l6ZSA9CisgICAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzBdICsgTFBDX09SREVSOyAvKiBzdGVwU2l6ZVswXSBpbXBsaWNpdGx5IDAuICovCisKKyAgaFRvbkNvcnItPm5leHRTYW1wbGUgPSBMUENfT1JERVI7IC8qIGZpcnN0U2FtcGxlICovCisgIGhUb25Db3JyLT5tb3ZlID0gaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzIC0KKyAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZTsgLyogTnVtYmVyIG9mIGVzdGltYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBtb3ZlIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyaW5nLiovCisgIGlmIChoVG9uQ29yci0+bW92ZSA8IDApIHsKICAgICByZXR1cm4gLTE7CiAgIH0KLQotICBoVG9uQ29yci0+YnVmZmVyTGVuZ3RoICAgICAgICAgICAgICA9IG5Db2xzOwotICBoVG9uQ29yci0+c3RlcFNpemUgICAgICAgICAgICAgICAgICA9IGhUb25Db3JyLT5scGNMZW5ndGhbMF0gKyBMUENfT1JERVI7IC8qIHN0ZXBTaXplWzBdIGltcGxpY2l0bHkgMC4gKi8KLQotICBoVG9uQ29yci0+bmV4dFNhbXBsZSAgICAgICAgICAgICAgICA9IExQQ19PUkRFUjsgLyogZmlyc3RTYW1wbGUgKi8KLSAgaFRvbkNvcnItPm1vdmUgICAgICAgICAgICAgICAgICAgICAgPSBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXMgLSBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZTsgICAgLyogTnVtYmVyIG9mIGVzdGltYXRlcyB0byBtb3ZlIHdoZW4gYnVmZmVyaW5nLiovCi0gIGhUb25Db3JyLT5zdGFydEluZGV4TWF0cml4ICAgICAgICAgID0gaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzIC0gaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWU7ICAgIC8qIFdoZXJlIHRvIHN0b3JlIHRoZSBsYXRlc3QgZXN0aW1hdGlvbnMgaW4gdGhlIHRvbmFsaXR5IE1hdHJpeC4qLwotICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4ICAgICAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIFdoZXJlIGluIHRoZSB0b25hbGl0eSBtYXRyaXggdGhlIGN1cnJlbnQgZnJhbWUgKHRvIGJlIHNlbnQgdG8gdGhlIGRlY29kZXIpIHN0YXJ0cy4gKi8KKyAgaFRvbkNvcnItPnN0YXJ0SW5kZXhNYXRyaXggPQorICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzIC0KKyAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lOyAvKiBXaGVyZSB0byBzdG9yZSB0aGUgbGF0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGlvbnMgaW4gdGhlIHRvbmFsaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4LiovCisgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXggPSAwOyAvKiBXaGVyZSBpbiB0aGUgdG9uYWxpdHkgbWF0cml4IHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSAodG8gYmUgc2VudCB0byB0aGUgZGVjb2Rlcikgc3RhcnRzLiAqLwogICBoVG9uQ29yci0+cHJldlRyYW5zaWVudEZsYWcgPSAwOwogICBoVG9uQ29yci0+dHJhbnNpZW50TmV4dEZyYW1lID0gMDsKIAogICBoVG9uQ29yci0+bm9RbWZDaGFubmVscyA9IG5vUW1mQ2hhbm5lbHM7CiAKLSAgZm9yIChpPTA7IGk8aFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzOyBpKyspIHsKLSAgICBGREttZW1jbGVhciAoaFRvbkNvcnItPnF1b3RhTWF0cml4W2ldICwgc2l6ZW9mKEZJWFBfREJMKSpub1FtZkNoYW5uZWxzKTsKLSAgICBGREttZW1jbGVhciAoaFRvbkNvcnItPnNpZ25NYXRyaXhbaV0gLCBzaXplb2YoSU5UKSpub1FtZkNoYW5uZWxzKTsKKyAgZm9yIChpID0gMDsgaSA8IGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlczsgaSsrKSB7CisgICAgRkRLbWVtY2xlYXIoaFRvbkNvcnItPnF1b3RhTWF0cml4W2ldLCBzaXplb2YoRklYUF9EQkwpICogbm9RbWZDaGFubmVscyk7CisgICAgRkRLbWVtY2xlYXIoaFRvbkNvcnItPnNpZ25NYXRyaXhbaV0sIHNpemVvZihJTlQpICogbm9RbWZDaGFubmVscyk7CiAgIH0KIAotICAgLyogUmVzZXQgdGhlIHBhdGNoLiovCisgIC8qIFJlc2V0IHRoZSBwYXRjaC4qLwogICBoVG9uQ29yci0+Z3VhcmQgPSAwOwogICBoVG9uQ29yci0+c2hpZnRTdGFydFNiID0gMTsKIAotICBpZihyZXNldFBhdGNoKGhUb25Db3JyLAotICAgICAgICAgICAgICAgIHhwb3NDdHJsLAotICAgICAgICAgICAgICAgIGhpZ2hCYW5kU3RhcnRTYiwKLSAgICAgICAgICAgICAgICB2X2tfbWFzdGVyLAotICAgICAgICAgICAgICAgIG51bU1hc3RlciwKLSAgICAgICAgICAgICAgICBmcywKLSAgICAgICAgICAgICAgICBub1FtZkNoYW5uZWxzKSkKLSAgICByZXR1cm4oMSk7CisgIGlmIChyZXNldFBhdGNoKGhUb25Db3JyLCB4cG9zQ3RybCwgaGlnaEJhbmRTdGFydFNiLCB2X2tfbWFzdGVyLCBudW1NYXN0ZXIsIGZzLAorICAgICAgICAgICAgICAgICBub1FtZkNoYW5uZWxzKSkKKyAgICByZXR1cm4gKDEpOwogCi0gIGlmKEZES3NickVuY19Jbml0U2JyTm9pc2VGbG9vckVzdGltYXRlICgmaFRvbkNvcnItPnNick5vaXNlRmxvb3JFc3RpbWF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hX21heF9sZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZVtMT10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmJbTE9dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZUJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZUZsb29yT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVNwZWVjaENvbmZpZykpCi0gICAgcmV0dXJuKDEpOworICBpZiAoRkRLc2JyRW5jX0luaXRTYnJOb2lzZUZsb29yRXN0aW1hdGUoCisgICAgICAgICAgJmhUb25Db3JyLT5zYnJOb2lzZUZsb29yRXN0aW1hdGUsIGFuYV9tYXhfbGV2ZWwsIGZyZXFCYW5kVGFibGVbTE9dLAorICAgICAgICAgIG5TZmJbTE9dLCBub2lzZUJhbmRzLCBub2lzZUZsb29yT2Zmc2V0LCB0aW1lU2xvdHMsIHVzZVNwZWVjaENvbmZpZykpCisgICAgcmV0dXJuICgxKTsKIAorICBpZiAoRkRLc2JyRW5jX2luaXRJbnZGaWx0RGV0ZWN0b3IoCisgICAgICAgICAgJmhUb25Db3JyLT5zYnJJbnZGaWx0LAorICAgICAgICAgIGhUb25Db3JyLT5zYnJOb2lzZUZsb29yRXN0aW1hdGUuZnJlcUJhbmRUYWJsZVFtZiwKKyAgICAgICAgICBoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kcywgdXNlU3BlZWNoQ29uZmlnKSkKKyAgICByZXR1cm4gKDEpOwogCi0gIGlmKEZES3NickVuY19pbml0SW52RmlsdERldGVjdG9yKCZoVG9uQ29yci0+c2JySW52RmlsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLmZyZXFCYW5kVGFibGVRbWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlU3BlZWNoQ29uZmlnKSkKLSAgICByZXR1cm4oMSk7Ci0KLQotCi0gIGlmKEZES3NickVuY19Jbml0U2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVG9uQ29yci0+c2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU2ZiW0hJXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub1FtZkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+bW92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDZmctPnNiclN5bnRheEZsYWdzKSkKLSAgICByZXR1cm4oMSk7Ci0KLQorICBpZiAoRkRLc2JyRW5jX0luaXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCisgICAgICAgICAgJmhUb25Db3JyLT5zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsIGZzLCBmcmFtZVNpemUsIG5TZmJbSEldLAorICAgICAgICAgIG5vUW1mQ2hhbm5lbHMsIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlcywgaFRvbkNvcnItPm1vdmUsCisgICAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUsIHNickNmZy0+c2JyU3ludGF4RmxhZ3MpKQorICAgIHJldHVybiAoMSk7CiAKICAgcmV0dXJuICgwKTsKIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgICAgIHJlc2V0cyB0b25hbGl0eSBjb3JyZWN0aW9uIHBhcmFtZXRlciBtb2R1bGUuCkBAIC04MDMsNTkgKzgyNSw0OCBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfUmVzZXRUb25Db3JyUGFyYW1FeHRyKEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLwotICAgICAgICAgICAgICAgICAgICAgIElOVCB4cG9zY3RybCwgICAgICAgICAgICAgICAgICAgICAvKiE8IERpZmZlcmVudCBwYXRjaCBtb2Rlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBJTlQgaGlnaEJhbmRTdGFydFNiLCAgICAgICAgICAgICAgLyohPCBTdGFydCBiYW5kIG9mIHRoZSBTQlIgcmFuZ2UuICovCi0gICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsICAgICAgICAvKiE8IE1hc3RlciBmcmVxdWVuY3kgdGFibGUgZnJvbSB3aGljaCBhbGwgb3RoZXIgdGFibGUgYXJlIGRlcml2ZWQuKi8KLSAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtTWFzdGVyLCAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hc3RlciB0YWJsZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBJTlQgZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kgKG9mIHRoZSBTQlIgcGFydCkuICovCi0gICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKiogZnJlcUJhbmRUYWJsZSwgICAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlIGZvciBsb3ctcmVzIGFuZCBoaWdoLXJlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBJTlQqIG5TZmIsICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZnJlcXVlbmN5IGJhbmRzIChoaWctcmVzIGFuZCBsb3ctcmVzKS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9RbWZDaGFubmVscyAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgUU1GIGNoYW5uZWxzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQorSU5UIEZES3NickVuY19SZXNldFRvbkNvcnJQYXJhbUV4dHIoCisgICAgSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsIC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCisgICAgSU5UIHhwb3NjdHJsLCAgICAgICAgICAgICAgICAgICAgIC8qITwgRGlmZmVyZW50IHBhdGNoIG1vZGVzLiAqLworICAgIElOVCBoaWdoQmFuZFN0YXJ0U2IsICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGJhbmQgb2YgdGhlIFNCUiByYW5nZS4gKi8KKyAgICBVQ0hBUiAqdl9rX21hc3RlciwgLyohPCBNYXN0ZXIgZnJlcXVlbmN5IHRhYmxlIGZyb20gd2hpY2ggYWxsIG90aGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBkZXJpdmVkLiovCisgICAgSU5UIG51bU1hc3RlciwgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXN0ZXIgdGFibGUuICovCisgICAgSU5UIGZzLCAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgZnJlcXVlbmN5IChvZiB0aGUgU0JSIHBhcnQpLiAqLworICAgIFVDSEFSICoKKyAgICAgICAgKmZyZXFCYW5kVGFibGUsIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGUgZm9yIGxvdy1yZXMgYW5kIGhpZ2gtcmVzLiAqLworICAgIElOVCAqblNmYiwgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZnJlcXVlbmN5IGJhbmRzIChoaWctcmVzIGFuZCBsb3ctcmVzKS4gKi8KKyAgICBJTlQgbm9RbWZDaGFubmVscyAgIC8qITwgTnVtYmVyIG9mIFFNRiBjaGFubmVscy4gKi8KKykgewogICAvKiBSZXNldCB0aGUgcGF0Y2guKi8KICAgaFRvbkNvcnItPmd1YXJkID0gMDsKICAgaFRvbkNvcnItPnNoaWZ0U3RhcnRTYiA9IDE7CiAKLSAgaWYocmVzZXRQYXRjaChoVG9uQ29yciwKLSAgICAgICAgICAgICAgICB4cG9zY3RybCwKLSAgICAgICAgICAgICAgICBoaWdoQmFuZFN0YXJ0U2IsCi0gICAgICAgICAgICAgICAgdl9rX21hc3RlciwKLSAgICAgICAgICAgICAgICBudW1NYXN0ZXIsCi0gICAgICAgICAgICAgICAgZnMsCi0gICAgICAgICAgICAgICAgbm9RbWZDaGFubmVscykpCi0gICAgcmV0dXJuKDEpOwotCi0KKyAgaWYgKHJlc2V0UGF0Y2goaFRvbkNvcnIsIHhwb3NjdHJsLCBoaWdoQmFuZFN0YXJ0U2IsIHZfa19tYXN0ZXIsIG51bU1hc3RlciwgZnMsCisgICAgICAgICAgICAgICAgIG5vUW1mQ2hhbm5lbHMpKQorICAgIHJldHVybiAoMSk7CiAKICAgLyogUmVzZXQgdGhlIG5vaXNlIGZsb29yIGVzdGltYXRlLiovCi0gIGlmKEZES3NickVuY19yZXNldFNick5vaXNlRmxvb3JFc3RpbWF0ZSAoJmhUb25Db3JyLT5zYnJOb2lzZUZsb29yRXN0aW1hdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlW0xPXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmJbTE9dKSkKLSAgICByZXR1cm4oMSk7CisgIGlmIChGREtzYnJFbmNfcmVzZXRTYnJOb2lzZUZsb29yRXN0aW1hdGUoJmhUb25Db3JyLT5zYnJOb2lzZUZsb29yRXN0aW1hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZVtMT10sIG5TZmJbTE9dKSkKKyAgICByZXR1cm4gKDEpOwogCiAgIC8qCiAgIFJlc2V0IHRoZSBpbnZlZXJzZSBmaWx0ZXJlaW5nIGRldGVjdG9yLgogICAqLwotICBpZihGREtzYnJFbmNfcmVzZXRJbnZGaWx0RGV0ZWN0b3IoJmhUb25Db3JyLT5zYnJJbnZGaWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPnNick5vaXNlRmxvb3JFc3RpbWF0ZS5mcmVxQmFuZFRhYmxlUW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHMpKQotICAgIHJldHVybigxKTsKLS8qIFJlc2V0IHRoZSBtaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rvci4gKi8KLSAgaWYoRkRLc2JyRW5jX1Jlc2V0U2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yICgmaFRvbkNvcnItPnNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmJbSEldKSkKLSAgICByZXR1cm4oMSk7CisgIGlmIChGREtzYnJFbmNfcmVzZXRJbnZGaWx0RGV0ZWN0b3IoCisgICAgICAgICAgJmhUb25Db3JyLT5zYnJJbnZGaWx0LAorICAgICAgICAgIGhUb25Db3JyLT5zYnJOb2lzZUZsb29yRXN0aW1hdGUuZnJlcUJhbmRUYWJsZVFtZiwKKyAgICAgICAgICBoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kcykpCisgICAgcmV0dXJuICgxKTsKKyAgLyogUmVzZXQgdGhlIG1pc3NpbmcgaGFybW9uaWNzIGRldGVjdG9yLiAqLworICBpZiAoRkRLc2JyRW5jX1Jlc2V0U2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKAorICAgICAgICAgICZoVG9uQ29yci0+c2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLCBuU2ZiW0hJXSkpCisgICAgcmV0dXJuICgxKTsKIAogICByZXR1cm4gKDApOwogfQogCi0KLQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgIERlbGV0ZXMgdGhlIHRvbmFsaXR5IGNvcnJlY3Rpb24gcGFyYW10ZXJlIG1vZHVsZS4KQEAgLTg2NiwxNiArODc3LDE1IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1GREtzYnJFbmNfRGVsZXRlVG9uQ29yclBhcmFtRXh0ciAoSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIpIC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCit2b2lkIEZES3NickVuY19EZWxldGVUb25Db3JyUGFyYW1FeHRyKAorICAgIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyKSAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLwogewotCiAgIGlmIChoVG9uQ29ycikgeworICAgIEZyZWVSYW1fU2JyX3F1b3RhTWF0cml4KGhUb25Db3JyLT5xdW90YU1hdHJpeCk7CiAKLSAgIEZyZWVSYW1fU2JyX3F1b3RhTWF0cml4KGhUb25Db3JyLT5xdW90YU1hdHJpeCk7CisgICAgRnJlZVJhbV9TYnJfc2lnbk1hdHJpeChoVG9uQ29yci0+c2lnbk1hdHJpeCk7CiAKLSAgIEZyZWVSYW1fU2JyX3NpZ25NYXRyaXgoaFRvbkNvcnItPnNpZ25NYXRyaXgpOwotCi0gICBGREtzYnJFbmNfRGVsZXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yICgmaFRvbkNvcnItPnNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvcik7CisgICAgRkRLc2JyRW5jX0RlbGV0ZVNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcigKKyAgICAgICAgJmhUb25Db3JyLT5zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmggYi9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmgKaW5kZXggNTA0YWIwMy4uOTFhYTI3OCAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy90b25fY29yci5oCisrKyBiL2xpYlNCUmVuYy9zcmMvdG9uX2NvcnIuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMzQgKzkwLDE2OSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQogICBcYnJpZWYgIEdlbmVyYWwgdG9uYWxpdHkgY29ycmVjdGlvbiBkZXRlY3RvciBtb2R1bGUuCiAqLwotI2lmbmRlZiBfVE9OX0NPUlJfRVNUX0gKLSNkZWZpbmUgX1RPTl9DT1JSX0VTVF9ICisjaWZuZGVmIFRPTl9DT1JSX0gKKyNkZWZpbmUgVE9OX0NPUlJfSAogCiAjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKICNpbmNsdWRlICJtaF9kZXQuaCIKICNpbmNsdWRlICJuZl9lc3QuaCIKICNpbmNsdWRlICJpbnZmX2VzdC5oIgogCi0KICNkZWZpbmUgTUFYX05VTV9QQVRDSEVTIDYKICNkZWZpbmUgU0NBTEVfTlJHVkVDIDQKIAogLyoqIHBhcmFtZXRlciBzZXQgZm9yIG9uZSBzaW5nbGUgcGF0Y2ggKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgSU5UICAgIHNvdXJjZVN0YXJ0QmFuZDsgICAgICAgICAvKiE8IGZpcnN0IGJhbmQgaW4gbG93YmFuZHMgd2hlcmUgdG8gdGFrZSB0aGUgc2FtcGxlcyBmcm9tICovCi0gIElOVCAgICBzb3VyY2VTdG9wQmFuZDsgICAgICAgICAgLyohPCBmaXJzdCBiYW5kIGluIGxvd2JhbmRzIHdoaWNoIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcGF0Y2ggYW55bW9yZSAqLwotICBJTlQgICAgZ3VhcmRTdGFydEJhbmQ7ICAgICAgICAgIC8qITwgZmlyc3QgYmFuZCBpbiBoaWdoYmFuZHMgdG8gYmUgZmlsbGVkIHdpdGggemVyb3MgaW4gb3JkZXIgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlIGludGVyZmVyZW5jZXMgYmV0d2VlbiBwYXRjaGVzICovCi0gIElOVCAgICB0YXJnZXRTdGFydEJhbmQ7ICAgICAgICAgLyohPCBmaXJzdCBiYW5kIGluIGhpZ2hiYW5kcyB0byBiZSBmaWxsZWQgd2l0aCB3aGl0ZW5lZCBsb3diYW5kIHNpZ25hbCAqLwotICBJTlQgICAgdGFyZ2V0QmFuZE9mZnM7ICAgICAgICAgIC8qITwgZGlmZmVyZW5jZSBiZXR3ZWVuICdzdGFydFRhcmdldEJhbmQnIGFuZCAnc3RhcnRTb3VyY2VCYW5kJyAqLwotICBJTlQgICAgbnVtQmFuZHNJblBhdGNoOyAgICAgICAgIC8qITwgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJhbmRzIGluIHRoaXMgb25lIHBhdGNoICovCisgIElOVCBzb3VyY2VTdGFydEJhbmQ7IC8qITwgZmlyc3QgYmFuZCBpbiBsb3diYW5kcyB3aGVyZSB0byB0YWtlIHRoZSBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKi8KKyAgSU5UIHNvdXJjZVN0b3BCYW5kOyAgLyohPCBmaXJzdCBiYW5kIGluIGxvd2JhbmRzIHdoaWNoIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2ggYW55bW9yZSAqLworICBJTlQgZ3VhcmRTdGFydEJhbmQ7ICAvKiE8IGZpcnN0IGJhbmQgaW4gaGlnaGJhbmRzIHRvIGJlIGZpbGxlZCB3aXRoIHplcm9zIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyIHRvICByZWR1Y2UgaW50ZXJmZXJlbmNlcyBiZXR3ZWVuIHBhdGNoZXMgKi8KKyAgSU5UIHRhcmdldFN0YXJ0QmFuZDsgLyohPCBmaXJzdCBiYW5kIGluIGhpZ2hiYW5kcyB0byBiZSBmaWxsZWQgd2l0aCB3aGl0ZW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb3diYW5kIHNpZ25hbCAqLworICBJTlQgdGFyZ2V0QmFuZE9mZnM7ICAvKiE8IGRpZmZlcmVuY2UgYmV0d2VlbiAnc3RhcnRUYXJnZXRCYW5kJyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXJ0U291cmNlQmFuZCcgKi8KKyAgSU5UIG51bUJhbmRzSW5QYXRjaDsgLyohPCBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmFuZHMgaW4gdGhpcyBvbmUgcGF0Y2ggKi8KIH0gUEFUQ0hfUEFSQU07CiAKLQotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIElOVCBzd2l0Y2hJbnZlcnNlRmlsdDsgICAgICAgICAgLyohPCBGbGFnIHRvIGVuYWJsZSBkeW5hbWljIGFkYXB0aW9uIG9mIGludmYuIGRldGVjdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgc3dpdGNoSW52ZXJzZUZpbHQ7IC8qITwgRmxhZyB0byBlbmFibGUgZHluYW1pYyBhZGFwdGlvbiBvZiBpbnZmLiBkZXRlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgSU5UIG5vUW1mQ2hhbm5lbHM7Ci0gIElOVCBidWZmZXJMZW5ndGg7ICAgICAgICAgICAgICAgLyohPCBMZW5ndGggb2YgdGhlIHIgYW5kIGkgYnVmZmVycy4gKi8KLSAgSU5UIHN0ZXBTaXplOyAgICAgICAgICAgICAgICAgICAvKiE8IFN0cmlkZSBmb3IgdGhlIGxwYyBlc3RpbWF0ZS4gKi8KLSAgSU5UIG51bWJlck9mRXN0aW1hdGVzOyAgICAgICAgICAvKiE8IFRoZSB0b3RhbCBudW1iZXIgb2YgZXN0aWFtdGVzLCBhdmFpbGFibGUgaW4gdGhlIHF1b3RhTWF0cml4LiovCi0gIFVJTlQgbnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZTsgLyohPCBUaGUgbnVtYmVyIG9mIGVzdGltYXRlcyBwZXIgZnJhbWUgYXZhaWxhYmxlIGluIHRoZSBxdW90YU1hdHJpeC4qLwotICBJTlQgbHBjTGVuZ3RoWzJdOyAgICAgICAgICAgICAgIC8qITwgU2VnbWVudCBsZW5ndGggdXNlZCBmb3Igc2Vjb25kIG9yZGVyIExQQyBhbmFseXNpcy4qLwotICBJTlQgbmV4dFNhbXBsZTsgICAgICAgICAgICAgICAgIC8qITwgV2hlcmUgdG8gc3RhcnQgdGhlIExQQyBhbmFseXNpcyBvZiB0aGUgY3VycmVudCBmcmFtZS4qLwotICBJTlQgbW92ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSG93IG1hbnkgZXN0aW1hdGVzIHRvIG1vdmUgaW4gdGhlIHF1b3RhTWF0cml4LCB3aGVuIGJ1ZmZlcmluZy4gKi8KLSAgSU5UIGZyYW1lU3RhcnRJbmRleDsgICAgICAgICAgICAvKiE8IFRoZSBzdGFydCBpbmRleCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgaW4gdGhlIHIgYW5kIGkgYnVmZmVycy4gKi8KLSAgSU5UIHN0YXJ0SW5kZXhNYXRyaXg7ICAgICAgICAgICAvKiE8IFRoZSBzdGFydCBpbmRleCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgaW4gdGhlIHF1b3RhTWF0cml4LiAqLwotICBJTlQgZnJhbWVTdGFydEluZGV4SW52ZkVzdDsgICAgIC8qITwgVGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBpbnZlcnNlIGZpbHRlcmluZywgbm90IHRoZSBzYW1lIGFzIHRoZSBvdGhlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnQgb24gd2hhdCBkZWNvZGVyIGlzIHVzZWQgKGJ1ZmZlciBvcHQsIG9yIG5vIGJ1ZmZlciBvcHQpLiAqLwotICBJTlQgcHJldlRyYW5zaWVudEZsYWc7ICAgICAgICAgIC8qITwgVGhlIHRyYW5zaXNlbnQgZmxhZyAoZnJvbSB0aGUgdHJhbnNpZW50IGRldGVjdG9yKSBmb3IgdGhlIHByZXZpb3VzIGZyYW1lLiAqLwotICBJTlQgdHJhbnNpZW50TmV4dEZyYW1lOyAgICAgICAgIC8qITwgRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmFuc2llbnQgd2lsbCBzaG93IHVwIGluIHRoZSBuZXh0IGZyYW1lLiAqLwotICBJTlQgdHJhbnNpZW50UG9zT2Zmc2V0OyAgICAgICAgIC8qITwgQW4gb2Zmc2V0IHZhbHVlIHRvIG1hdGNoIHRoZSB0cmFuc2llbnQgcG9zIGFzIGNhbGN1bGF0ZWQgYnkgdGhlIHRyYW5zaWVudCBkZXRlY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgYWN0dWFsIHBvc2l0aW9uIGluIHRoZSBmcmFtZS4qLworICBJTlQgYnVmZmVyTGVuZ3RoOyAgICAgIC8qITwgTGVuZ3RoIG9mIHRoZSByIGFuZCBpIGJ1ZmZlcnMuICovCisgIElOVCBzdGVwU2l6ZTsgICAgICAgICAgLyohPCBTdHJpZGUgZm9yIHRoZSBscGMgZXN0aW1hdGUuICovCisgIElOVCBudW1iZXJPZkVzdGltYXRlczsgLyohPCBUaGUgdG90YWwgbnVtYmVyIG9mIGVzdGlhbXRlcywgYXZhaWxhYmxlIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RhTWF0cml4LiovCisgIFVJTlQgbnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZTsgLyohPCBUaGUgbnVtYmVyIG9mIGVzdGltYXRlcyBwZXIgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgaW4gdGhlIHF1b3RhTWF0cml4LiovCisgIElOVCBscGNMZW5ndGhbMl07IC8qITwgU2VnbWVudCBsZW5ndGggdXNlZCBmb3Igc2Vjb25kIG9yZGVyIExQQyBhbmFseXNpcy4qLworICBJTlQgbmV4dFNhbXBsZTsgICAvKiE8IFdoZXJlIHRvIHN0YXJ0IHRoZSBMUEMgYW5hbHlzaXMgb2YgdGhlIGN1cnJlbnQgZnJhbWUuKi8KKyAgSU5UIG1vdmU7IC8qITwgSG93IG1hbnkgZXN0aW1hdGVzIHRvIG1vdmUgaW4gdGhlIHF1b3RhTWF0cml4LCB3aGVuIGJ1ZmZlcmluZy4KKyAgICAgICAgICAgICAqLworICBJTlQgZnJhbWVTdGFydEluZGV4OyAvKiE8IFRoZSBzdGFydCBpbmRleCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgaW4gdGhlIHIgYW5kIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVycy4gKi8KKyAgSU5UIHN0YXJ0SW5kZXhNYXRyaXg7ICAgICAgIC8qITwgVGhlIHN0YXJ0IGluZGV4IGZvciB0aGUgY3VycmVudCBmcmFtZSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RhTWF0cml4LiAqLworICBJTlQgZnJhbWVTdGFydEluZGV4SW52ZkVzdDsgLyohPCBUaGUgc3RhcnQgaW5kZXggb2YgdGhlIGludmVyc2UgZmlsdGVyaW5nLCBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIGFzIHRoZSBvdGhlcnMsIGRlcGVuZGVudCBvbiB3aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyIGlzIHVzZWQgKGJ1ZmZlciBvcHQsIG9yIG5vIGJ1ZmZlciBvcHQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIElOVCBwcmV2VHJhbnNpZW50RmxhZzsgIC8qITwgVGhlIHRyYW5zaXNlbnQgZmxhZyAoZnJvbSB0aGUgdHJhbnNpZW50IGRldGVjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHByZXZpb3VzIGZyYW1lLiAqLworICBJTlQgdHJhbnNpZW50TmV4dEZyYW1lOyAvKiE8IEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdHJhbnNpZW50IHdpbGwgc2hvdyB1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgbmV4dCBmcmFtZS4gKi8KKyAgSU5UIHRyYW5zaWVudFBvc09mZnNldDsgLyohPCBBbiBvZmZzZXQgdmFsdWUgdG8gbWF0Y2ggdGhlIHRyYW5zaWVudCBwb3MgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZCBieSB0aGUgdHJhbnNpZW50IGRldGVjdG9yIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCBwb3NpdGlvbiBpbiB0aGUgZnJhbWUuKi8KIAotICBJTlQgKnNpZ25NYXRyaXhbTUFYX05PX09GX0VTVElNQVRFU107ICAgICAgLyohPCBNYXRyaXggaG9sZGluZyB0aGUgc2lnbiBvZiBlYWNoIGNoYW5uZSwgaS5lLiBpbmRpY2F0aW5nIGluIHdoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCBvZiBhIFFNRiBjaGFubmVsIGEgcG9zc2libGUgc2luZSBpcy4gKi8KKyAgSU5UKiBzaWduTWF0cml4W01BWF9OT19PRl9FU1RJTUFURVNdOyAvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSBzaWduIG9mIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmUsIGkuZS4gaW5kaWNhdGluZyBpbiB3aGF0IHBhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBhIFFNRiBjaGFubmVsIGEgcG9zc2libGUgc2luZSBpcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotICBGSVhQX0RCTCAqcXVvdGFNYXRyaXhbTUFYX05PX09GX0VTVElNQVRFU107LyohPCBNYXRyaXggaG9sZGluZyB0aGUgcXVvdGEgdmFsdWVzIGZvciBhbGwgZXN0aW1hdGVzLCBhbGwgY2hhbm5lbHMuICovCisgIEZJWFBfREJMKiBxdW90YU1hdHJpeFtNQVhfTk9fT0ZfRVNUSU1BVEVTXTsgLyohPCBNYXRyaXggaG9sZGluZyB0aGUgcXVvdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgZm9yIGFsbCBlc3RpbWF0ZXMsIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLiAqLwogCi0gIEZJWFBfREJMIG5yZ1ZlY3RvcltNQVhfTk9fT0ZfRVNUSU1BVEVTXTsgICAvKiE8IFZlY3RvciBob2xkaW5nIHRoZSBhdmVyYWdlZCBlbmVyZ2llcyBmb3IgZXZlcnkgUU1GIGJhbmQuICovCi0gIEZJWFBfREJMIG5yZ1ZlY3RvckZyZXFbUU1GX0NIQU5ORUxTXTsgICAgICAvKiE8IFZlY3RvciBob2xkaW5nIHRoZSBhdmVyYWdlZCBlbmVyZ2llcyBmb3IgZXZlcnkgUU1GIGNoYW5uZWwgKi8KKyAgRklYUF9EQkwgbnJnVmVjdG9yW01BWF9OT19PRl9FU1RJTUFURVNdOyAvKiE8IFZlY3RvciBob2xkaW5nIHRoZSBhdmVyYWdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZXJnaWVzIGZvciBldmVyeSBRTUYgYmFuZC4gKi8KKyAgRklYUF9EQkwgbnJnVmVjdG9yRnJlcVs2NF07IC8qITwgVmVjdG9yIGhvbGRpbmcgdGhlIGF2ZXJhZ2VkIGVuZXJnaWVzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlcnkgUU1GIGNoYW5uZWwgKi8KIAotICBTQ0hBUiBpbmRleFZlY3RvcltRTUZfQ0hBTk5FTFNdOyAgICAgICAgICAgLyohPCBJbmRleCB2ZWN0b3IgcG9JTlRpbmcgdG8gdGhlIGNvcnJlY3QgbG93YmFuZCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGluZGV4aW5nIGEgaGlnaGJhbmQgY2hhbm5lbCwgLTEgcmVwcmVzZW50cyBhIGd1YXJkIGJhbmQgKi8KLSAgUEFUQ0hfUEFSQU0gIHBhdGNoUGFyYW1bTUFYX05VTV9QQVRDSEVTXTsgIC8qITwgbmV3IHBhcmFtZXRlciBzZXQgZm9yIHBhdGNoaW5nICovCi0gIElOVCAgICBndWFyZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBndWFyZGJhbmRzIGJldHdlZW4gZXZlcnkgcGF0Y2ggKi8KLSAgSU5UICAgIHNoaWZ0U3RhcnRTYjsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgbG93ZXN0IHN1YmJhbmQgb2Ygc291cmNlIHJhbmdlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBwYXRjaGVzICovCi0gIElOVCAgICBub09mUGF0Y2hlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBwYXRjaGVzICovCisgIFNDSEFSIGluZGV4VmVjdG9yWzY0XTsgLyohPCBJbmRleCB2ZWN0b3IgcG9JTlRpbmcgdG8gdGhlIGNvcnJlY3QgbG93YmFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsIHdoZW4gaW5kZXhpbmcgYSBoaWdoYmFuZCBjaGFubmVsLCAtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgYSBndWFyZCBiYW5kICovCisgIFBBVENIX1BBUkFNCisgIHBhdGNoUGFyYW1bTUFYX05VTV9QQVRDSEVTXTsgLyohPCBuZXcgcGFyYW1ldGVyIHNldCBmb3IgcGF0Y2hpbmcgKi8KKyAgSU5UIGd1YXJkOyAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBndWFyZGJhbmRzIGJldHdlZW4gZXZlcnkgcGF0Y2ggKi8KKyAgSU5UIHNoaWZ0U3RhcnRTYjsgLyohPCBsb3dlc3Qgc3ViYmFuZCBvZiBzb3VyY2UgcmFuZ2UgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoZXMgKi8KKyAgSU5UIG5vT2ZQYXRjaGVzOyAgLyohPCBudW1iZXIgb2YgcGF0Y2hlcyAqLwogCi0gIFNCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBzYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3I7ICAvKiE8IFNCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBzdHJ1Y3QuICovCi0gIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzYnJOb2lzZUZsb29yRXN0aW1hdGU7ICAgICAgICAgICAgICAvKiE8IFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QuICovCi0gIFNCUl9JTlZfRklMVF9FU1Qgc2JySW52RmlsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNCUl9JTlZfRklMVF9FU1Qgc3RydWN0LiAqLwotfQotU0JSX1RPTl9DT1JSX0VTVDsKKyAgU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SCisgIHNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcjsgLyohPCBTQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1Igc3RydWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUKKyAgc2JyTm9pc2VGbG9vckVzdGltYXRlOyAgICAgICAvKiE8IFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QuICovCisgIFNCUl9JTlZfRklMVF9FU1Qgc2JySW52RmlsdDsgLyohPCBTQlJfSU5WX0ZJTFRfRVNUIHN0cnVjdC4gKi8KK30gU0JSX1RPTl9DT1JSX0VTVDsKIAotdHlwZWRlZiBTQlJfVE9OX0NPUlJfRVNUICpIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVDsKK3R5cGVkZWYgU0JSX1RPTl9DT1JSX0VTVCogSEFORExFX1NCUl9UT05fQ09SUl9FU1Q7CiAKLXZvaWQKLUZES3NickVuY19Ub25Db3JyUGFyYW1FeHRyKEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAgIC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgIElOVkZfTU9ERSogaW5mVmVjLCAgICAgICAgICAgICAgICAgIC8qITwgVmVjdG9yIHdoZXJlIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBsZXZlbHMgd2lsbCBiZSBzdG9yZWQuICovCi0gICAgICAgICAgICAgICAgIEZJWFBfREJMICogbm9pc2VMZXZlbHMsICAgICAgICAgICAgIC8qITwgVmVjdG9yIHdoZXJlIHRoZSBub2lzZSBsZXZlbHMgd2lsbCBiZSBzdG9yZWQuICovCi0gICAgICAgICAgICAgICAgIElOVCogbWlzc2luZ0hhcm1vbmljRmxhZywgICAgICAgICAgIC8qITwgRmxhZyBzZXQgdG8gb25lIG9yIHplcm8sIGRlcGVuZGVudCBvbiBpZiBhbnkgc3Ryb25nIHNpbmVzIGFyZSBtaXNzaW5nLiovCi0gICAgICAgICAgICAgICAgIFVDSEFSKiBtaXNzaW5nSGFybW9uaWNzSW5kZXgsICAgICAgIC8qITwgVmVjdG9yIGluZGljYXRpbmcgd2hlcmUgc2luZXMgYXJlIG1pc3NpbmcuICovCi0gICAgICAgICAgICAgICAgIFVDSEFSKiBlbnZlbG9wZUNvbXBlbnNhdGlvbiwgICAgICAgIC8qITwgVmVjdG9yIHRvIHN0b3JlIGNvbXBlbnNhdGlvbiB2YWx1ZXMgZm9yIHRoZSBlbmVyZ2llcyBpbi4gKi8KLSAgICAgICAgICAgICAgICAgY29uc3QgU0JSX0ZSQU1FX0lORk8gKmZyYW1lSW5mbywgICAgLyohPCBGcmFtZSBpbmZvIHN0cnVjdCwgY29udGFpbnMgdGhlIHRpbWUgYW5kIGZyZXF1ZW5jeSBncmlkIG9mIHRoZSBjdXJyZW50IGZyYW1lLiovCi0gICAgICAgICAgICAgICAgIFVDSEFSKiB0cmFuc2llbnRJbmZvLCAgICAgICAgICAgICAgIC8qITwgVHJhbnNpZW50IGluZm8uKi8KLSAgICAgICAgICAgICAgICAgVUNIQVIgKiBmcmVxQmFuZFRhYmxlLCAgICAgICAgICAgICAgLyohPCBGcmVxdWVuY3kgYmFuZCB0YWJsZXMgZm9yIGhpZ2gtcmVzLiovCi0gICAgICAgICAgICAgICAgIElOVCBuU2ZiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmRzIGZvciBoaWdoLXJlcy4gKi8KLSAgICAgICAgICAgICAgICAgWFBPU19NT0RFIHhwb3NUeXBlLCAgICAgICAgICAgICAgICAgLyohPCBUeXBlIG9mIHRyYW5zcG9zZXIgdXNlZCBpbiB0aGUgZGVjb2Rlci4qLwotICAgICAgICAgICAgICAgICBVSU5UIHNiclN5bnRheEZsYWdzCi0gICAgICAgICAgICAgICAgICk7Cit2b2lkIEZES3NickVuY19Ub25Db3JyUGFyYW1FeHRyKAorICAgIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgIElOVkZfTU9ERSogaW5mVmVjLCAvKiE8IFZlY3RvciB3aGVyZSB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWxzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkLiAqLworICAgIEZJWFBfREJMKiBub2lzZUxldmVscywgLyohPCBWZWN0b3Igd2hlcmUgdGhlIG5vaXNlIGxldmVscyB3aWxsIGJlIHN0b3JlZC4gKi8KKyAgICBJTlQqIG1pc3NpbmdIYXJtb25pY0ZsYWcsIC8qITwgRmxhZyBzZXQgdG8gb25lIG9yIHplcm8sIGRlcGVuZGVudCBvbiBpZiBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9uZyBzaW5lcyBhcmUgbWlzc2luZy4qLworICAgIFVDSEFSKiBtaXNzaW5nSGFybW9uaWNzSW5kZXgsIC8qITwgVmVjdG9yIGluZGljYXRpbmcgd2hlcmUgc2luZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZy4gKi8KKyAgICBVQ0hBUiogZW52ZWxvcGVDb21wZW5zYXRpb24sICAvKiE8IFZlY3RvciB0byBzdG9yZSBjb21wZW5zYXRpb24gdmFsdWVzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbmVyZ2llcyBpbi4gKi8KKyAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyogZnJhbWVJbmZvLCAvKiE8IEZyYW1lIGluZm8gc3RydWN0LCBjb250YWlucyB0aGUgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmcmVxdWVuY3kgZ3JpZCBvZiB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLiovCisgICAgVUNIQVIqIHRyYW5zaWVudEluZm8sICAgICAgICAgICAgLyohPCBUcmFuc2llbnQgaW5mby4qLworICAgIFVDSEFSKiBmcmVxQmFuZFRhYmxlLCAgICAgICAgICAgIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGVzIGZvciBoaWdoLXJlcy4qLworICAgIElOVCBuU2ZiLCAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIGhpZ2gtcmVzLiAqLworICAgIFhQT1NfTU9ERSB4cG9zVHlwZSwgLyohPCBUeXBlIG9mIHRyYW5zcG9zZXIgdXNlZCBpbiB0aGUgZGVjb2Rlci4qLworICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MpOwogCi1JTlQKLUZES3NickVuY19DcmVhdGVUb25Db3JyUGFyYW1FeHRyKEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAvKiE8IFBvaW50ZXIgdG8gaGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICBjaGFuKTsgICAgLyohPCBDaGFubmVsIGluZGV4LCBuZWVkZWQgZm9yIG1lbSBhbGxvY2F0aW9uICovCitJTlQgRkRLc2JyRW5jX0NyZWF0ZVRvbkNvcnJQYXJhbUV4dHIoCisgICAgSEFORExFX1NCUl9UT05fQ09SUl9FU1QKKyAgICAgICAgaFRvbkNvcnIsIC8qITwgUG9pbnRlciB0byBoYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KKyAgICBJTlQgY2hhbik7ICAgIC8qITwgQ2hhbm5lbCBpbmRleCwgbmVlZGVkIGZvciBtZW0gYWxsb2NhdGlvbiAqLwogCi1JTlQKLUZES3NickVuY19Jbml0VG9uQ29yclBhcmFtRXh0cihJTlQgZnJhbWVTaXplLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IEN1cnJlbnQgU0JSIGZyYW1lIHNpemUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsICAgLyohPCBQb2ludGVyIHRvIGhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgc2JyQ2ZnLCAgICAgIC8qITwgUG9pbnRlciB0byBTQlIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0aW1lU2xvdHMsICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUtc2xvdHMgcGVyIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHhwb3NDdHJsLCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEaWZmZXJlbnQgcGF0Y2ggbW9kZXMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFuYV9tYXhfbGV2ZWwsICAgICAgICAgICAgICAgICAgLyohPCBNYXhpbXVtIGxldmVsIG9mIHRoZSBhZGFwdGl2ZSBub2lzZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9pc2VCYW5kcywgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyBwZXIgb2N0YXZlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub2lzZUZsb29yT2Zmc2V0LCAgICAgICAgICAgICAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdXNlU3BlZWNoQ29uZmlnICAgICAgICAgICAgICAgIC8qITwgU3BlZWNoIG9yIG11c2ljIHR1bmluZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitJTlQgRkRLc2JyRW5jX0luaXRUb25Db3JyUGFyYW1FeHRyKAorICAgIElOVCBmcmFtZVNpemUsIC8qITwgQ3VycmVudCBTQlIgZnJhbWUgc2l6ZS4gKi8KKyAgICBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVAorICAgICAgICBoVG9uQ29yciwgLyohPCBQb2ludGVyIHRvIGhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEKKyAgICAgICAgc2JyQ2ZnLCAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIFNCUiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuICovCisgICAgSU5UIHRpbWVTbG90cywgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUtc2xvdHMgcGVyIGZyYW1lICovCisgICAgSU5UIHhwb3NDdHJsLCAgICAgICAgIC8qITwgRGlmZmVyZW50IHBhdGNoIG1vZGVzLiAqLworICAgIElOVCBhbmFfbWF4X2xldmVsLCAgICAvKiE8IE1heGltdW0gbGV2ZWwgb2YgdGhlIGFkYXB0aXZlIG5vaXNlLiAqLworICAgIElOVCBub2lzZUJhbmRzLCAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyBwZXIgb2N0YXZlLiAqLworICAgIElOVCBub2lzZUZsb29yT2Zmc2V0LCAvKiE8IE5vaXNlIGZsb29yIG9mZnNldC4gKi8KKyAgICBVSU5UIHVzZVNwZWVjaENvbmZpZyAgLyohPCBTcGVlY2ggb3IgbXVzaWMgdHVuaW5nLiAqLworKTsKIAotdm9pZAotRkRLc2JyRW5jX0RlbGV0ZVRvbkNvcnJQYXJhbUV4dHIoSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIpOyAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLwordm9pZCBGREtzYnJFbmNfRGVsZXRlVG9uQ29yclBhcmFtRXh0cigKKyAgICBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29ycik7IC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCiAKK3ZvaWQgRkRLc2JyRW5jX0NhbGN1bGF0ZVRvbmFsaXR5UXVvdGFzKAorICAgIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCBGSVhQX0RCTCoqIHNvdXJjZUJ1ZmZlclJlYWwsCisgICAgRklYUF9EQkwqKiBzb3VyY2VCdWZmZXJJbWFnLCBJTlQgdXNiLAorICAgIElOVCBxbWZTY2FsZSAvKiE8IHNjbGVmYWN0b3Igb2YgUU1GIHN1YnNhbXBsZXMgKi8KKyk7CiAKLXZvaWQKLUZES3NickVuY19DYWxjdWxhdGVUb25hbGl0eVF1b3RhcyhIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqc291cmNlQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqc291cmNlQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2IsCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlQgcW1mU2NhbGUgICAgICAgICAgICAgICAgICAgIC8qITwgc2NsZWZhY3RvciBvZiBRTUYgc3Vic2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICApOwotCi1JTlQKLUZES3NickVuY19SZXNldFRvbkNvcnJQYXJhbUV4dHIoSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsIC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIHhwb3NjdHJsLCAgICAgICAgICAgICAgICAgICAgIC8qITwgRGlmZmVyZW50IHBhdGNoIG1vZGVzLiAqLwotICAgICAgICAgICAgICAgICAgICAgIElOVCBoaWdoQmFuZFN0YXJ0U2IsICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGJhbmQgb2YgdGhlIFNCUiByYW5nZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwgICAgICAgIC8qITwgTWFzdGVyIGZyZXF1ZW5jeSB0YWJsZSBmcm9tIHdoaWNoIGFsbCBvdGhlciB0YWJsZSBhcmUgZGVyaXZlZC4qLwotICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1NYXN0ZXIsICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFzdGVyIHRhYmxlLiAqLwotICAgICAgICAgICAgICAgICAgICAgIElOVCBmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIGZyZXF1ZW5jeSAob2YgdGhlIFNCUiBwYXJ0KS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBVQ0hBUioqIGZyZXFCYW5kVGFibGUsICAgIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGUgZm9yIGxvdy1yZXMgYW5kIGhpZ2gtcmVzLiAqLwotICAgICAgICAgICAgICAgICAgICAgIElOVCogblNmYiwgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMgKGhpZy1yZXMgYW5kIGxvdy1yZXMpLiAqLwotICAgICAgICAgICAgICAgICAgICAgIElOVCBub1FtZkNoYW5uZWxzICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgY2hhbm5lbHMuICovCi0gICAgICAgICAgICAgICAgICAgICAgKTsKK0lOVCBGREtzYnJFbmNfUmVzZXRUb25Db3JyUGFyYW1FeHRyKAorICAgIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgIElOVCB4cG9zY3RybCwgICAgICAgICAgICAgICAgICAgICAvKiE8IERpZmZlcmVudCBwYXRjaCBtb2Rlcy4gKi8KKyAgICBJTlQgaGlnaEJhbmRTdGFydFNiLCAgICAgICAgICAgICAgLyohPCBTdGFydCBiYW5kIG9mIHRoZSBTQlIgcmFuZ2UuICovCisgICAgVUNIQVIqIHZfa19tYXN0ZXIsIC8qITwgTWFzdGVyIGZyZXF1ZW5jeSB0YWJsZSBmcm9tIHdoaWNoIGFsbCBvdGhlciB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZGVyaXZlZC4qLworICAgIElOVCBudW1NYXN0ZXIsICAgICAvKiE8IE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFzdGVyIHRhYmxlLiAqLworICAgIElOVCBmcywgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIGZyZXF1ZW5jeSAob2YgdGhlIFNCUiBwYXJ0KS4gKi8KKyAgICBVQ0hBUioqCisgICAgICAgIGZyZXFCYW5kVGFibGUsIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGUgZm9yIGxvdy1yZXMgYW5kIGhpZ2gtcmVzLiAqLworICAgIElOVCogblNmYiwgICAgICAgICAvKiE8IE51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMgKGhpZy1yZXMgYW5kIGxvdy1yZXMpLiAqLworICAgIElOVCBub1FtZkNoYW5uZWxzICAvKiE8IE51bWJlciBvZiBRTUYgY2hhbm5lbHMuICovCispOwogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvdHJhbl9kZXQuY3BwIGIvbGliU0JSZW5jL3NyYy90cmFuX2RldC5jcHAKaW5kZXggMzNlYTYwZS4uM2I2NzY1YSAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy90cmFuX2RldC5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy90cmFuX2RldC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTkgKzkwLDI4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIFRvYmlhcyBDaGFsdXBrYQorCisgICBEZXNjcmlwdGlvbjogU0JSIGVuY29kZXIgdHJhbnNpZW50IGRldGVjdG9yCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0cmFuX2RldC5oIgogCiAjaW5jbHVkZSAiZnJhbV9nZW4uaCIKLSNpbmNsdWRlICJzYnJfcmFtLmgiCisjaW5jbHVkZSAic2JyZW5jX3JhbS5oIgogI2luY2x1ZGUgInNicl9taXNjLmgiCiAKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCiAjZGVmaW5lIE5PUk1fUU1GX0VORVJHWSA5LjMxMzIyNTc0NjE1NDc5RS0xMCAvKiAyXi0zMCAqLwogCi0vKiBzdGF0aWMgRklYUF9EQkwgQUJTX1RIUkVTID0gZml4TWF4KCBGTDJGWENPTlNUX0RCTCgxLjI4ZTUgKiAgTk9STV9RTUZfRU5FUkdZKSwgKEZJWFBfREJMKTEpICBNaW5pbXVtIHRocmVzaG9sZCBmb3IgZGV0ZWN0aW5nIGNoYW5nZXMgKi8KKy8qIHN0YXRpYyBGSVhQX0RCTCBBQlNfVEhSRVMgPSBmaXhNYXgoIEZMMkZYQ09OU1RfREJMKDEuMjhlNSAqCisgKiBOT1JNX1FNRl9FTkVSR1kpLCAoRklYUF9EQkwpMSkgIE1pbmltdW0gdGhyZXNob2xkIGZvciBkZXRlY3RpbmcgY2hhbmdlcyAqLwogI2RlZmluZSBBQlNfVEhSRVMgKChGSVhQX0RCTCkxNikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwNiwxMjYgKzEyNiwxMjggQEAKIAogIFxyZXR1cm4gIGNhbGN1bGF0ZWQgdmFsdWUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE5SR19TSElGVCAgMyAvKiBmb3IgZW5lcmd5IHN1bW1hdGlvbiAqLworI2RlZmluZSBOUkdfU0hJRlQgMyAvKiBmb3IgZW5lcmd5IHN1bW1hdGlvbiAqLwogCi1zdGF0aWMgRklYUF9EQkwgc3BlY3RyYWxDaGFuZ2UoRklYUF9EQkwgRW5lcmdpZXNbTlVNQkVSX1RJTUVfU0xPVFNfMjMwNF1bTUFYX0ZSRVFfQ09FRkZTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjYWxlRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgRW5lcmd5VG90YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnJlc3VsdF9lKQotewotICBJTlQgaSxqOwotICBJTlQgbGVuMSxsZW4yOwotICBTQ0hBUiBlbmVyZ2llc19lX2RpZmZbTlVNQkVSX1RJTUVfU0xPVFNfMjMwNF0sIGVuZXJnaWVzX2UsIGVuZXJneVRvdGFsX2U9MTksIGVuZXJnaWVzX2VfYWRkOworc3RhdGljIEZJWFBfREJMIHNwZWN0cmFsQ2hhbmdlKAorICAgIEZJWFBfREJMIEVuZXJnaWVzW05VTUJFUl9USU1FX1NMT1RTXzIzMDRdW01BWF9GUkVRX0NPRUZGU10sCisgICAgSU5UICpzY2FsZUVuZXJnaWVzLCBGSVhQX0RCTCBFbmVyZ3lUb3RhbCwgSU5UIG5TZmIsIElOVCBzdGFydCwgSU5UIGJvcmRlciwKKyAgICBJTlQgWUJ1ZmZlcldyaXRlT2Zmc2V0LCBJTlQgc3RvcCwgSU5UICpyZXN1bHRfZSkgeworICBJTlQgaSwgajsKKyAgSU5UIGxlbjEsIGxlbjI7CisgIFNDSEFSIGVuZXJnaWVzX2VfZGlmZltOVU1CRVJfVElNRV9TTE9UU18yMzA0XSwgZW5lcmdpZXNfZSwgZW5lcmd5VG90YWxfZSA9IDE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZXJnaWVzX2VfYWRkOwogICBTQ0hBUiBwcmV2RW5lcmdpZXNfZV9kaWZmLCBuZXdFbmVyZ2llc19lX2RpZmY7Ci0gIEZJWFBfREJMIHRtcDAsdG1wMTsKLSAgRklYUF9EQkwgYWNjdTEsYWNjdTIsYWNjdTFfaW5pdCxhY2N1Ml9pbml0OworICBGSVhQX0RCTCB0bXAwLCB0bXAxOwogICBGSVhQX0RCTCBkZWx0YSwgZGVsdGFfc3VtOwogICBJTlQgYWNjdV9lLCB0bXBfZTsKIAogICBkZWx0YV9zdW0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgKnJlc3VsdF9lID0gMDsKIAotICBsZW4xID0gYm9yZGVyLXN0YXJ0OwotICBsZW4yID0gc3RvcC1ib3JkZXI7CisgIGxlbjEgPSBib3JkZXIgLSBzdGFydDsKKyAgbGVuMiA9IHN0b3AgLSBib3JkZXI7CiAKICAgLyogcHJlZmVyIGJvcmRlcnMgbmVhciB0aGUgbWlkZGxlIG9mIHRoZSBmcmFtZSAqLwotICBGSVhQX0RCTCAgIHBvc193ZWlnaHQ7Ci0gIHBvc193ZWlnaHQgPSBGTDJGWENPTlNUX0RCTCgwLjVmKSAtIChsZW4xKkdldEludkludChsZW4xK2xlbjIpKTsKLSAgcG9zX3dlaWdodCA9IC8qRkwyRlhDT05TVF9EQkwoMS4wKSovIChGSVhQX0RCTClNQVhWQUxfREJMIC0gKGZNdWx0KHBvc193ZWlnaHQsIHBvc193ZWlnaHQpPDwyKTsKKyAgRklYUF9EQkwgcG9zX3dlaWdodDsKKyAgcG9zX3dlaWdodCA9IEZMMkZYQ09OU1RfREJMKDAuNWYpIC0gKGxlbjEgKiBHZXRJbnZJbnQobGVuMSArIGxlbjIpKTsKKyAgcG9zX3dlaWdodCA9IC8qRkwyRlhDT05TVF9EQkwoMS4wKSovIChGSVhQX0RCTClNQVhWQUxfREJMIC0KKyAgICAgICAgICAgICAgIChmTXVsdChwb3Nfd2VpZ2h0LCBwb3Nfd2VpZ2h0KSA8PCAyKTsKIAogICAvKioqIENhbGMgc2NhbGluZyBmb3IgZW5lcmdpZXMgKioqLwogICBGREtfQVNTRVJUKHNjYWxlRW5lcmdpZXNbMF0gPj0gMCk7CiAgIEZES19BU1NFUlQoc2NhbGVFbmVyZ2llc1sxXSA+PSAwKTsKIAotICBlbmVyZ2llc19lID0gMTkgLSBGREttaW4oc2NhbGVFbmVyZ2llc1swXSwgc2NhbGVFbmVyZ2llc1sxXSk7CisgIGVuZXJnaWVzX2UgPSAxOSAtIGZNaW4oc2NhbGVFbmVyZ2llc1swXSwgc2NhbGVFbmVyZ2llc1sxXSk7CiAKICAgLyogbGltaXQgc2hpZnQgZm9yIGVuZXJneSBhY2N1bXVsYXRpb24sIGVuZXJnaWVzX2UgY2FuIGJlIC0xMCBtaW4uICovCiAgIGlmIChlbmVyZ2llc19lIDwgLTEwKSB7Ci0gICAgIGVuZXJnaWVzX2VfYWRkID0gLTEwIC0gZW5lcmdpZXNfZTsKLSAgICAgZW5lcmdpZXNfZSA9IC0xMDsKKyAgICBlbmVyZ2llc19lX2FkZCA9IC0xMCAtIGVuZXJnaWVzX2U7CisgICAgZW5lcmdpZXNfZSA9IC0xMDsKICAgfSBlbHNlIGlmIChlbmVyZ2llc19lID4gMTcpIHsKLSAgICAgZW5lcmdpZXNfZV9hZGQgPSBlbmVyZ2llc19lIC0gMTc7Ci0gICAgIGVuZXJnaWVzX2UgPSAxNzsKKyAgICBlbmVyZ2llc19lX2FkZCA9IGVuZXJnaWVzX2UgLSAxNzsKKyAgICBlbmVyZ2llc19lID0gMTc7CiAgIH0gZWxzZSB7Ci0gICAgIGVuZXJnaWVzX2VfYWRkID0gMDsKKyAgICBlbmVyZ2llc19lX2FkZCA9IDA7CiAgIH0KIAotICAvKiBjb21wZW5zYXRlIHNjYWxpbmcgZGlmZmVyZW5jZXMgYmV0d2VlbiBzY2FsZUVuZXJnaWVzWzBdIGFuZCBzY2FsZUVuZXJnaWVzWzFdICAqLwotICBwcmV2RW5lcmdpZXNfZV9kaWZmID0gc2NhbGVFbmVyZ2llc1swXSAtIEZES21pbihzY2FsZUVuZXJnaWVzWzBdLCBzY2FsZUVuZXJnaWVzWzFdKSArIGVuZXJnaWVzX2VfYWRkICsgTlJHX1NISUZUOwotICBuZXdFbmVyZ2llc19lX2RpZmYgID0gc2NhbGVFbmVyZ2llc1sxXSAtIEZES21pbihzY2FsZUVuZXJnaWVzWzBdLCBzY2FsZUVuZXJnaWVzWzFdKSArIGVuZXJnaWVzX2VfYWRkICsgTlJHX1NISUZUOworICAvKiBjb21wZW5zYXRlIHNjYWxpbmcgZGlmZmVyZW5jZXMgYmV0d2VlbiBzY2FsZUVuZXJnaWVzWzBdIGFuZAorICAgKiBzY2FsZUVuZXJnaWVzWzFdICAqLworICBwcmV2RW5lcmdpZXNfZV9kaWZmID0gc2NhbGVFbmVyZ2llc1swXSAtCisgICAgICAgICAgICAgICAgICAgICAgICBmTWluKHNjYWxlRW5lcmdpZXNbMF0sIHNjYWxlRW5lcmdpZXNbMV0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZXJnaWVzX2VfYWRkICsgTlJHX1NISUZUOworICBuZXdFbmVyZ2llc19lX2RpZmYgPSBzY2FsZUVuZXJnaWVzWzFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgZk1pbihzY2FsZUVuZXJnaWVzWzBdLCBzY2FsZUVuZXJnaWVzWzFdKSArCisgICAgICAgICAgICAgICAgICAgICAgIGVuZXJnaWVzX2VfYWRkICsgTlJHX1NISUZUOwogCi0gIHByZXZFbmVyZ2llc19lX2RpZmYgPSBmTWluKHByZXZFbmVyZ2llc19lX2RpZmYsIERGUkFDVF9CSVRTLTEpOwotICBuZXdFbmVyZ2llc19lX2RpZmYgID0gZk1pbihuZXdFbmVyZ2llc19lX2RpZmYsICBERlJBQ1RfQklUUy0xKTsKKyAgcHJldkVuZXJnaWVzX2VfZGlmZiA9IGZNaW4ocHJldkVuZXJnaWVzX2VfZGlmZiwgREZSQUNUX0JJVFMgLSAxKTsKKyAgbmV3RW5lcmdpZXNfZV9kaWZmID0gZk1pbihuZXdFbmVyZ2llc19lX2RpZmYsIERGUkFDVF9CSVRTIC0gMSk7CiAKLSAgZm9yIChpPXN0YXJ0OyBpPFlCdWZmZXJXcml0ZU9mZnNldDsgaSsrKSB7CisgIGZvciAoaSA9IHN0YXJ0OyBpIDwgWUJ1ZmZlcldyaXRlT2Zmc2V0OyBpKyspIHsKICAgICBlbmVyZ2llc19lX2RpZmZbaV0gPSBwcmV2RW5lcmdpZXNfZV9kaWZmOwogICB9Ci0gIGZvciAoaT1ZQnVmZmVyV3JpdGVPZmZzZXQ7IGk8c3RvcDsgaSsrKSB7CisgIGZvciAoaSA9IFlCdWZmZXJXcml0ZU9mZnNldDsgaSA8IHN0b3A7IGkrKykgewogICAgIGVuZXJnaWVzX2VfZGlmZltpXSA9IG5ld0VuZXJnaWVzX2VfZGlmZjsKICAgfQogCiAgIC8qIFN1bSB1cCBlbmVyZ2llcyBvZiBhbGwgUU1GLXRpbWVzbG90cyBmb3IgYm90aCBoYWxmcyAqLwotICBGREtfQVNTRVJUKGxlbjE8PTgpOyAvKiBvdGhlcndpc2UgYW4gb3ZlcmZsb3cgaXMgcG9zc2libGUgKi8KLSAgRkRLX0FTU0VSVChsZW4yPD04KTsgLyogb3RoZXJ3aXNlIGFuIG92ZXJmbG93IGlzIHBvc3NpYmxlICovCi0gIC8qIGluaXQgd2l0aCBzb21lIGVuZXJneSB0byBwcmV2ZW50IGRpdmlzaW9uIGJ5IHplcm8KLSAgICAgIGFuZCB0byBwcmV2ZW50IHNwbGl0dGluZyBmb3IgdmVyeSBsb3cgbGV2ZWxzICovCi0gIGFjY3UxX2luaXQgPSBzY2FsZVZhbHVlKChGTDJGWENPTlNUX0RCTCgoMS4wZTYqTk9STV9RTUZfRU5FUkdZKSkpLC1lbmVyZ2llc19lKTsKLSAgYWNjdTJfaW5pdCA9IHNjYWxlVmFsdWUoKEZMMkZYQ09OU1RfREJMKCgxLjBlNipOT1JNX1FNRl9FTkVSR1kpKSksLWVuZXJnaWVzX2UpOwotICBhY2N1MV9pbml0ID0gZk11bHQoYWNjdTFfaW5pdCwgKEZJWFBfREJMKWxlbjE8PCgoREZSQUNUX0JJVFMtMSktTlJHX1NISUZULTEpKTw8MTsKLSAgYWNjdTJfaW5pdCA9IGZNdWx0KGFjY3UyX2luaXQsIChGSVhQX0RCTClsZW4yPDwoKERGUkFDVF9CSVRTLTEpLU5SR19TSElGVC0xKSk8PDE7CisgIEZES19BU1NFUlQobGVuMSA8PSA4KTsgLyogb3RoZXJ3aXNlIGFuIG92ZXJmbG93IGlzIHBvc3NpYmxlICovCisgIEZES19BU1NFUlQobGVuMiA8PSA4KTsgLyogb3RoZXJ3aXNlIGFuIG92ZXJmbG93IGlzIHBvc3NpYmxlICovCiAKLSAgZm9yIChqPTA7IGo8blNmYjsgaisrKSB7Ci0KLSAgICBhY2N1MSA9IGFjY3UxX2luaXQ7Ci0gICAgYWNjdTIgPSBhY2N1Ml9pbml0OwotICAgIGFjY3VfZSA9IGVuZXJnaWVzX2UrMzsKKyAgZm9yIChqID0gMDsgaiA8IG5TZmI7IGorKykgeworICAgIEZJWFBfREJMIGFjY3UxID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICBGSVhQX0RCTCBhY2N1MiA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgYWNjdV9lID0gZW5lcmdpZXNfZSArIDM7CiAKICAgICAvKiBTdW0gdXAgZW5lcmdpZXMgaW4gZmlyc3QgaGFsZiAqLwotICAgIGZvciAoaT1zdGFydDsgaTxib3JkZXI7IGkrKykgeworICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgYm9yZGVyOyBpKyspIHsKICAgICAgIGFjY3UxICs9IHNjYWxlVmFsdWUoRW5lcmdpZXNbaV1bal0sIC1lbmVyZ2llc19lX2RpZmZbaV0pOwogICAgIH0KIAogICAgIC8qIFN1bSB1cCBlbmVyZ2llcyBpbiBzZWNvbmQgaGFsZiAqLwotICAgIGZvciAoaT1ib3JkZXI7IGk8c3RvcDsgaSsrKSB7CisgICAgZm9yIChpID0gYm9yZGVyOyBpIDwgc3RvcDsgaSsrKSB7CiAgICAgICBhY2N1MiArPSBzY2FsZVZhbHVlKEVuZXJnaWVzW2ldW2pdLCAtZW5lcmdpZXNfZV9kaWZmW2ldKTsKICAgICB9CiAKLSAgICAvKiBFbmVyZ3kgY2hhbmdlIGluIGN1cnJlbnQgYmFuZCAqLwotICAgICNkZWZpbmUgTE4yIEZMMkZYQ09OU1RfREJMKDAuNjkzMTQ3MTgwNmYpIC8qIGxuKDIpICovCisgICAgLyogRW5zdXJlIGNlcnRhaW4gZW5lcmd5IHRvIHByZXZlbnQgZGl2aXNpb24gYnkgemVybyBhbmQgdG8gcHJldmVudAorICAgICAqIHNwbGl0dGluZyBmb3IgdmVyeSBsb3cgbGV2ZWxzICovCisgICAgYWNjdTEgPSBmTWF4KGFjY3UxLCAoRklYUF9EQkwpbGVuMSk7CisgICAgYWNjdTIgPSBmTWF4KGFjY3UyLCAoRklYUF9EQkwpbGVuMik7CisKKy8qIEVuZXJneSBjaGFuZ2UgaW4gY3VycmVudCBiYW5kICovCisjZGVmaW5lIExOMiBGTDJGWENPTlNUX0RCTCgwLjY5MzE0NzE4MDZmKSAvKiBsbigyKSAqLwogICAgIHRtcDAgPSBmTG9nMihhY2N1MiwgYWNjdV9lKSAtIGZMb2cyKGFjY3UxLCBhY2N1X2UpOwogICAgIHRtcDEgPSBmTG9nMigoRklYUF9EQkwpbGVuMSwgMzEpIC0gZkxvZzIoKEZJWFBfREJMKWxlbjIsIDMxKTsKICAgICBkZWx0YSA9IGZNdWx0KExOMiwgKHRtcDAgKyB0bXAxKSk7Ci0gICAgZGVsdGEgPSAoRklYUF9EQkwpRkRLYWJzKCBkZWx0YSApOworICAgIGRlbHRhID0gKEZJWFBfREJMKWZBYnMoZGVsdGEpOwogCiAgICAgLyogV2VpZ2h0aW5nIHdpdGggYW1wbGl0dWRlIHJhdGlvIG9mIHRoaXMgYmFuZCAqLwotICAgIGFjY3VfZSsrOwotICAgIGFjY3UxPj49MTsKLSAgICBhY2N1Mj4+PTE7CisgICAgYWNjdV9lKys7IC8qIHNjYWxlIGF0IGxlYXN0IG9uZSBiaXQgZHVlIHRvIChhY2N1MSthY2N1MikgKi8KKyAgICBhY2N1MSA+Pj0gMTsKKyAgICBhY2N1MiA+Pj0gMTsKKwogICAgIGlmIChhY2N1X2UgJiAxKSB7Ci0gICAgICBhY2N1X2UrKzsKLSAgICAgIGFjY3UxPj49MTsKLSAgICAgIGFjY3UyPj49MTsKKyAgICAgIGFjY3VfZSsrOyAvKiBmb3IgYSBkZWZpbmVkIHNxdWFyZSByZXN1bHQgZXhwb25lbnQsIHRoZSBleHBvbmVudCBoYXMgdG8gYmUKKyAgICAgICAgICAgICAgICAgICBldmVuICovCisgICAgICBhY2N1MSA+Pj0gMTsKKyAgICAgIGFjY3UyID4+PSAxOwogICAgIH0KIAotICAgIGRlbHRhX3N1bSArPSBmTXVsdChzcXJ0Rml4cChhY2N1MSthY2N1MiksIGRlbHRhKTsKLSAgICAqcmVzdWx0X2UgPSAoKGFjY3VfZT4+MSkgKyBMRF9EQVRBX1NISUZUKTsKKyAgICBkZWx0YV9zdW0gKz0gZk11bHQoc3FydEZpeHAoYWNjdTEgKyBhY2N1MiksIGRlbHRhKTsKKyAgICAqcmVzdWx0X2UgPSAoKGFjY3VfZSA+PiAxKSArIExEX0RBVEFfU0hJRlQpOwogICB9CiAKLSAgZW5lcmd5VG90YWxfZSs9MTsgLyogZm9yIGEgZGVmaW5lZCBzcXVhcmUgcmVzdWx0IGV4cG9uZW50LCB0aGUgZXhwb25lbnQgaGFzIHRvIGJlIGV2ZW4gKi8KLSAgRW5lcmd5VG90YWw8PD0xOworICBpZiAoZW5lcmd5VG90YWxfZSAmIDEpIHsKKyAgICBlbmVyZ3lUb3RhbF9lICs9IDE7IC8qIGZvciBhIGRlZmluZWQgc3F1YXJlIHJlc3VsdCBleHBvbmVudCwgdGhlIGV4cG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgdG8gYmUgZXZlbiAqLworICAgIEVuZXJneVRvdGFsID4+PSAxOworICB9CisKICAgZGVsdGFfc3VtID0gZk11bHQoZGVsdGFfc3VtLCBpbnZTcXJ0Tm9ybTIoRW5lcmd5VG90YWwsICZ0bXBfZSkpOwotICAqcmVzdWx0X2UgPSAqcmVzdWx0X2UgKyAodG1wX2UtKGVuZXJneVRvdGFsX2U+PjEpKTsKKyAgKnJlc3VsdF9lID0gKnJlc3VsdF9lICsgKHRtcF9lIC0gKGVuZXJneVRvdGFsX2UgPj4gMSkpOwogCiAgIHJldHVybiBmTXVsdChkZWx0YV9zdW0sIHBvc193ZWlnaHQpOwotCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBhZGRMb3diYW5kRW5lcmdpZXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMzgsNDAgKzI2MCw0NyBAQAogCiAgXHJldHVybiAgdG90YWwgZW5lcmd5IGluIHRoZSBsb3diYW5kLCBzY2FsZWQgYnkgdGhlIGZhY3RvciAyXjE5CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEZJWFBfREJMIGFkZExvd2JhbmRFbmVyZ2llcyhGSVhQX0RCTCAqKkVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgKnNjYWxlRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG5yZ1N6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgdHJhbl9vZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAqZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBzbG90cykKLXsKLSAgRklYUF9EQkwgbnJnVG90YWw7CitzdGF0aWMgRklYUF9EQkwgYWRkTG93YmFuZEVuZXJnaWVzKEZJWFBfREJMICoqRW5lcmdpZXMsIGludCAqc2NhbGVFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwgaW50IG5yZ1N6U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuX29mZiwgVUNIQVIgKmZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbG90cykgeworICBJTlQgbnJnVG90YWxfZTsKKyAgRklYUF9EQkwgbnJnVG90YWxfbTsKICAgRklYUF9EQkwgYWNjdTEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgRklYUF9EQkwgYWNjdTIgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgaW50IHRyYW5fb2ZmZGl2MiA9IHRyYW5fb2ZmPj5ucmdTelNoaWZ0OwotICBpbnQgdHMsazsKKyAgaW50IHRyYW5fb2ZmZGl2MiA9IHRyYW5fb2ZmID4+IG5yZ1N6U2hpZnQ7CisgIGNvbnN0IGludCBzYzEgPQorICAgICAgREZSQUNUX0JJVFMgLQorICAgICAgZk5vcm16KChGSVhQX0RCTClmTWF4KAorICAgICAgICAgIDEsIChmcmVxQmFuZFRhYmxlWzBdICogKFlCdWZmZXJXcml0ZU9mZnNldCAtIHRyYW5fb2ZmZGl2MikgLSAxKSkpOworICBjb25zdCBpbnQgc2MyID0KKyAgICAgIERGUkFDVF9CSVRTIC0KKyAgICAgIGZOb3JteigoRklYUF9EQkwpZk1heCgKKyAgICAgICAgICAxLCAoZnJlcUJhbmRUYWJsZVswXSAqCisgICAgICAgICAgICAgICAgICAodHJhbl9vZmZkaXYyICsgKHNsb3RzID4+IG5yZ1N6U2hpZnQpIC0gWUJ1ZmZlcldyaXRlT2Zmc2V0KSAtCisgICAgICAgICAgICAgIDEpKSk7CisgIGludCB0cywgazsKIAogICAvKiBTdW0gdXAgbG93YmFuZCBlbmVyZ3kgZnJvbSBvbmUgZnJhbWUgYXQgb2Zmc2V0IHRyYW5fb2ZmICovCiAgIC8qIGZyZXFCYW5kVGFibGVbTE9SRVNdIGhhcyBNQVhfRlJFUV9DT0VGRlMvMiArMSBjb2VlZnMgbWF4LiAqLwotICBmb3IgKHRzPXRyYW5fb2ZmZGl2MjsgdHM8WUJ1ZmZlcldyaXRlT2Zmc2V0OyB0cysrKSB7CisgIGZvciAodHMgPSB0cmFuX29mZmRpdjI7IHRzIDwgWUJ1ZmZlcldyaXRlT2Zmc2V0OyB0cysrKSB7CiAgICAgZm9yIChrID0gMDsgayA8IGZyZXFCYW5kVGFibGVbMF07IGsrKykgewotICAgICAgYWNjdTEgKz0gRW5lcmdpZXNbdHNdW2tdID4+IDY7CisgICAgICBhY2N1MSArPSBFbmVyZ2llc1t0c11ba10gPj4gc2MxOwogICAgIH0KICAgfQotICBmb3IgKDsgdHM8dHJhbl9vZmZkaXYyKyhzbG90cz4+bnJnU3pTaGlmdCk7IHRzKyspIHsKKyAgZm9yICg7IHRzIDwgdHJhbl9vZmZkaXYyICsgKHNsb3RzID4+IG5yZ1N6U2hpZnQpOyB0cysrKSB7CiAgICAgZm9yIChrID0gMDsgayA8IGZyZXFCYW5kVGFibGVbMF07IGsrKykgewotICAgICAgYWNjdTIgKz0gRW5lcmdpZXNbdHNdW2tdID4+IDk7CisgICAgICBhY2N1MiArPSBFbmVyZ2llc1t0c11ba10gPj4gc2MyOwogICAgIH0KICAgfQogCi0gIG5yZ1RvdGFsID0gKCBzY2FsZVZhbHVlU2F0dXJhdGUoYWNjdTEsIDEtc2NhbGVFbmVyZ2llc1swXSkgKQotICAgICAgICAgICArICggc2NhbGVWYWx1ZVNhdHVyYXRlKGFjY3UyLCA0LXNjYWxlRW5lcmdpZXNbMV0pICk7CisgIG5yZ1RvdGFsX20gPSBmQWRkTm9ybShhY2N1MSwgKHNjMSAtIDUpIC0gc2NhbGVFbmVyZ2llc1swXSwgYWNjdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAoc2MyIC0gNSkgLSBzY2FsZUVuZXJnaWVzWzFdLCAmbnJnVG90YWxfZSk7CisgIG5yZ1RvdGFsX20gPSBzY2FsZVZhbHVlU2F0dXJhdGUobnJnVG90YWxfbSwgbnJnVG90YWxfZSk7CiAKLSAgcmV0dXJuKG5yZ1RvdGFsKTsKKyAgcmV0dXJuIChucmdUb3RhbF9tKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIGFkZEhpZ2hiYW5kRW5lcmdpZXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yODksMzUgKzMxOCwzNSBAQAogIFxyZXR1cm4gIHRvdGFsIGVuZXJneSBpbiB0aGUgaGlnaGJhbmQsIHNjYWxlZCBieSBmYWN0b3IgMl4xOQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIEZJWFBfREJMIGFkZEhpZ2hiYW5kRW5lcmdpZXMoRklYUF9EQkwgKipSRVNUUklDVCBFbmVyZ2llcywgLyohPCBpbnB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpzY2FsZUVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgIEVuZXJnaWVzTVtOVU1CRVJfVElNRV9TTE9UU18yMzA0XVtNQVhfRlJFUV9DT0VGRlNdLCAvKiE8IENvbWJpbmVkIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICpSRVNUUklDVCBmcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICBzYnJTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgdGltZVN0ZXApCi17Ci0gIElOVCBpLGosayxzbG90SW4sc2xvdE91dCxzY2FsZVsyXTsKLSAgSU5UIGxpLHVpOworc3RhdGljIEZJWFBfREJMIGFkZEhpZ2hiYW5kRW5lcmdpZXMoCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBFbmVyZ2llcywgLyohPCBpbnB1dCAqLworICAgIElOVCAqc2NhbGVFbmVyZ2llcywgSU5UIFlCdWZmZXJXcml0ZU9mZnNldCwKKyAgICBGSVhQX0RCTCBFbmVyZ2llc01bTlVNQkVSX1RJTUVfU0xPVFNfMjMwNF0KKyAgICAgICAgICAgICAgICAgICAgICBbTUFYX0ZSRVFfQ09FRkZTXSwgLyohPCBDb21iaW5lZCBvdXRwdXQgKi8KKyAgICBVQ0hBUiAqUkVTVFJJQ1QgZnJlcUJhbmRUYWJsZSwgSU5UIG5TZmIsIElOVCBzYnJTbG90cywgSU5UIHRpbWVTdGVwKSB7CisgIElOVCBpLCBqLCBrLCBzbG90SW4sIHNsb3RPdXQsIHNjYWxlWzJdOworICBJTlQgbGksIHVpOwogICBGSVhQX0RCTCBucmdUb3RhbDsKICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCiAgIC8qIENvbWJpbmUgUU1GLXRpbWVzbG90cyB0byBTQlItdGltZXNsb3RzLAogICAgICBjb21iaW5lIFFNRi1iYW5kcyB0byBTQlItYmFuZHMsCiAgICAgIGNvbWJpbmUgTGVmdCBhbmQgUmlnaHQgY2hhbm5lbCAqLwotICBmb3IgKHNsb3RPdXQ9MDsgc2xvdE91dDxzYnJTbG90czsgc2xvdE91dCsrKSB7Ci0gICAgc2xvdEluID0gdGltZVN0ZXAqc2xvdE91dDsKKyAgZm9yIChzbG90T3V0ID0gMDsgc2xvdE91dCA8IHNiclNsb3RzOyBzbG90T3V0KyspIHsKKyAgICAvKiBOb3RlOiBCZWxvdyBzbG90SW4gPSBzbG90T3V0IGFuZCBub3Qgc2xvdEluID0gdGltZVN0ZXAqc2xvdE91dAorICAgICAgIGJlY2F1c2UgdGhlIEVuZXJnaWVzW10gdGltZSByZXNvbHV0aW9uIGlzIGFsd2F5cyB0aGUgU0JSIHNsb3QgcmVzb2x1dGlvbgorICAgICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIHRpbWVTdGVwLiAqLworICAgIHNsb3RJbiA9IHNsb3RPdXQ7CiAKLSAgICBmb3IgKGo9MDsgajxuU2ZiOyBqKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgblNmYjsgaisrKSB7CiAgICAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKICAgICAgIGxpID0gZnJlcUJhbmRUYWJsZVtqXTsKICAgICAgIHVpID0gZnJlcUJhbmRUYWJsZVtqICsgMV07CiAKLSAgICAgIGZvciAoaz1saTsgazx1aTsgaysrKSB7Ci0gICAgICAgIGZvciAoaT0wOyBpPHRpbWVTdGVwOyBpKyspIHsKLSAgICAgICAgIGFjY3UgKz0gKEVuZXJnaWVzWyhzbG90SW4raSk+PjFdW2tdID4+IDUpOworICAgICAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aW1lU3RlcDsgaSsrKSB7CisgICAgICAgICAgYWNjdSArPSBFbmVyZ2llc1tzbG90SW5dW2tdID4+IDU7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIEVuZXJnaWVzTVtzbG90T3V0XVtqXSA9IGFjY3U7CkBAIC0zMjUsMzQgKzM1NCwzNCBAQAogICB9CiAKICAgLyogc2NhbGUgZW5lcmdpZXMgZG93biBiZWZvcmUgYWRkIHVwICovCi0gIHNjYWxlWzBdID0gZml4TWluKDgsc2NhbGVFbmVyZ2llc1swXSk7Ci0gIHNjYWxlWzFdID0gZml4TWluKDgsc2NhbGVFbmVyZ2llc1sxXSk7CisgIHNjYWxlWzBdID0gZml4TWluKDgsIHNjYWxlRW5lcmdpZXNbMF0pOworICBzY2FsZVsxXSA9IGZpeE1pbig4LCBzY2FsZUVuZXJnaWVzWzFdKTsKIAotICBpZiAoKHNjYWxlRW5lcmdpZXNbMF0tc2NhbGVbMF0pID4gKERGUkFDVF9CSVRTLTEpIHx8IChzY2FsZUVuZXJnaWVzWzFdLXNjYWxlWzBdKSA+IChERlJBQ1RfQklUUy0xKSkKKyAgaWYgKChzY2FsZUVuZXJnaWVzWzBdIC0gc2NhbGVbMF0pID4gKERGUkFDVF9CSVRTIC0gMSkgfHwKKyAgICAgIChzY2FsZUVuZXJnaWVzWzFdIC0gc2NhbGVbMV0pID4gKERGUkFDVF9CSVRTIC0gMSkpCiAgICAgbnJnVG90YWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgZWxzZSB7CiAgICAgLyogTm93IGFkZCBhbGwgZW5lcmdpZXMgKi8KICAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgICBmb3IgKHNsb3RPdXQ9MDsgc2xvdE91dDxZQnVmZmVyV3JpdGVPZmZzZXQ7IHNsb3RPdXQrKykgewotICAgICAgZm9yIChqPTA7IGo8blNmYjsgaisrKSB7CisgICAgZm9yIChzbG90T3V0ID0gMDsgc2xvdE91dCA8IFlCdWZmZXJXcml0ZU9mZnNldDsgc2xvdE91dCsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgblNmYjsgaisrKSB7CiAgICAgICAgIGFjY3UgKz0gKEVuZXJnaWVzTVtzbG90T3V0XVtqXSA+PiBzY2FsZVswXSk7CiAgICAgICB9CiAgICAgfQotICAgIG5yZ1RvdGFsID0gYWNjdSA+PiAoc2NhbGVFbmVyZ2llc1swXS1zY2FsZVswXSk7CisgICAgbnJnVG90YWwgPSBhY2N1ID4+IChzY2FsZUVuZXJnaWVzWzBdIC0gc2NhbGVbMF0pOwogCi0gICAgZm9yIChzbG90T3V0PVlCdWZmZXJXcml0ZU9mZnNldDsgc2xvdE91dDxzYnJTbG90czsgc2xvdE91dCsrKSB7Ci0gICAgICBmb3IgKGo9MDsgajxuU2ZiOyBqKyspIHsKKyAgICBmb3IgKHNsb3RPdXQgPSBZQnVmZmVyV3JpdGVPZmZzZXQ7IHNsb3RPdXQgPCBzYnJTbG90czsgc2xvdE91dCsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgblNmYjsgaisrKSB7CiAgICAgICAgIGFjY3UgKz0gKEVuZXJnaWVzTVtzbG90T3V0XVtqXSA+PiBzY2FsZVswXSk7CiAgICAgICB9CiAgICAgfQotICAgIG5yZ1RvdGFsID0gYWNjdSA+PiAoc2NhbGVFbmVyZ2llc1sxXS1zY2FsZVsxXSk7CisgICAgbnJnVG90YWwgPSBmQWRkU2F0dXJhdGUobnJnVG90YWwsIGFjY3UgPj4gKHNjYWxlRW5lcmdpZXNbMV0gLSBzY2FsZVsxXSkpOwogICB9CiAKLSAgcmV0dXJuKG5yZ1RvdGFsKTsKKyAgcmV0dXJuIChucmdUb3RhbCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfZnJhbWVTcGxpdHRlcgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM2MSw3MyArMzkwLDU1IEBACiAgSWYgbm8gdHJhbnNpZW50IGhhcyBiZWVuIGRldGVjdGVkIGJlZm9yZSwgdGhlIGZyYW1lIGNhbiBzdGlsbCBiZSBzcGxpdHRlZAogIGludG8gMiBlbnZlbG9wZXMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX2ZyYW1lU3BsaXR0ZXIoRklYUF9EQkwgKipFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp0cmFuX3ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jb2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIHRvbmFsaXR5KQotewotICBpZiAodHJhbl92ZWN0b3JbMV09PTApIC8qIG5vIHRyYW5zaWVudCB3YXMgZGV0ZWN0ZWQgKi8KK3ZvaWQgRkRLc2JyRW5jX2ZyYW1lU3BsaXR0ZXIoCisgICAgRklYUF9EQkwgKipFbmVyZ2llcywgSU5UICpzY2FsZUVuZXJnaWVzLAorICAgIEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsIFVDSEFSICpmcmVxQmFuZFRhYmxlLAorICAgIFVDSEFSICp0cmFuX3ZlY3RvciwgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwgaW50IFlCdWZmZXJTelNoaWZ0LCBpbnQgblNmYiwKKyAgICBpbnQgdGltZVN0ZXAsIGludCBub19jb2xzLCBGSVhQX0RCTCAqdG9uYWxpdHkpIHsKKyAgaWYgKHRyYW5fdmVjdG9yWzFdID09IDApIC8qIG5vIHRyYW5zaWVudCB3YXMgZGV0ZWN0ZWQgKi8KICAgewogICAgIEZJWFBfREJMIGRlbHRhOwogICAgIElOVCBkZWx0YV9lOwotICAgIEZJWFBfREJMICgqRW5lcmdpZXNNKVtNQVhfRlJFUV9DT0VGRlNdOwotICAgIEZJWFBfREJMIEVuZXJneVRvdGFsLG5ld0xvd2JhbmRFbmVyZ3ksbmV3SGlnaGJhbmRFbmVyZ3k7CisgICAgRklYUF9EQkwoKkVuZXJnaWVzTSlbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgICBGSVhQX0RCTCBFbmVyZ3lUb3RhbCwgbmV3TG93YmFuZEVuZXJneSwgbmV3SGlnaGJhbmRFbmVyZ3k7CiAgICAgSU5UIGJvcmRlcjsKLSAgICBJTlQgc2JyU2xvdHMgPSBmTXVsdEkoR2V0SW52SW50KHRpbWVTdGVwKSxub19jb2xzKTsKLSAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoX0VuZXJnaWVzTSwgRklYUF9EQkwsIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQqTUFYX0ZSRVFfQ09FRkZTKQorICAgIElOVCBzYnJTbG90cyA9IGZNdWx0SShHZXRJbnZJbnQodGltZVN0ZXApLCBub19jb2xzKTsKKyAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoX0VuZXJnaWVzTSwgRklYUF9EQkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQgKiBNQVhfRlJFUV9DT0VGRlMpCiAKLSAgICBGREtfQVNTRVJUKCBzYnJTbG90cyAqIHRpbWVTdGVwID09IG5vX2NvbHMgKTsKKyAgICBGREtfQVNTRVJUKHNiclNsb3RzICogdGltZVN0ZXAgPT0gbm9fY29scyk7CiAKICAgICBFbmVyZ2llc00gPSAoRklYUF9EQkwoKilbTUFYX0ZSRVFfQ09FRkZTXSlfRW5lcmdpZXNNOwogCiAgICAgLyoKLSAgICAgIEdldCBMb3diYW5kLWVuZXJneSBvdmVyIGEgcmFuZ2Ugb2YgMiBmcmFtZXMgKExvb2sgaGFsZiBhIGZyYW1lIGJhY2sgYW5kIGFoZWFkKS4KKyAgICAgIEdldCBMb3diYW5kLWVuZXJneSBvdmVyIGEgcmFuZ2Ugb2YgMiBmcmFtZXMgKExvb2sgaGFsZiBhIGZyYW1lIGJhY2sgYW5kCisgICAgICBhaGVhZCkuCiAgICAgKi8KLSAgICBuZXdMb3diYW5kRW5lcmd5ID0gYWRkTG93YmFuZEVuZXJnaWVzKEVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJTelNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+dHJhbl9vZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fY29scyk7CisgICAgbmV3TG93YmFuZEVuZXJneSA9IGFkZExvd2JhbmRFbmVyZ2llcygKKyAgICAgICAgRW5lcmdpZXMsIHNjYWxlRW5lcmdpZXMsIFlCdWZmZXJXcml0ZU9mZnNldCwgWUJ1ZmZlclN6U2hpZnQsCisgICAgICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fb2ZmLCBmcmVxQmFuZFRhYmxlLCBub19jb2xzKTsKIAotICAgIG5ld0hpZ2hiYW5kRW5lcmd5ID0gYWRkSGlnaGJhbmRFbmVyZ2llcyhFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmVyZ2llc00sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclNsb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU3RlcCk7CisgICAgbmV3SGlnaGJhbmRFbmVyZ3kgPQorICAgICAgICBhZGRIaWdoYmFuZEVuZXJnaWVzKEVuZXJnaWVzLCBzY2FsZUVuZXJnaWVzLCBZQnVmZmVyV3JpdGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5lcmdpZXNNLCBmcmVxQmFuZFRhYmxlLCBuU2ZiLCBzYnJTbG90cywgdGltZVN0ZXApOwogCiAgICAgewotICAgICAgLyogcHJldkxvd0JhbmRFbmVyZ3k6IENvcnJlc3BvbmRzIHRvIDEgZnJhbWUsIHN0YXJ0aW5nIHdpdGggaGFsZiBhIGZyYW1lIGxvb2stYmVoaW5kCi0gICAgICAgICBuZXdMb3diYW5kRW5lcmd5OiAgQ29ycmVzcG9uZHMgdG8gMSBmcmFtZSwgc3RhcnRpbmcgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY3VycmVudCBmcmFtZSAqLwotICAgICAgRW5lcmd5VG90YWwgPSAobmV3TG93YmFuZEVuZXJneSArIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnByZXZMb3dCYW5kRW5lcmd5KSA+PiAxOwotICAgICAgRW5lcmd5VG90YWwgKz0gbmV3SGlnaGJhbmRFbmVyZ3k7CisgICAgICAvKiBwcmV2TG93QmFuZEVuZXJneTogQ29ycmVzcG9uZHMgdG8gMSBmcmFtZSwgc3RhcnRpbmcgd2l0aCBoYWxmIGEgZnJhbWUKKyAgICAgICAgIGxvb2stYmVoaW5kIG5ld0xvd2JhbmRFbmVyZ3k6ICBDb3JyZXNwb25kcyB0byAxIGZyYW1lLCBzdGFydGluZyBpbiB0aGUKKyAgICAgICAgIG1pZGRsZSBvZiB0aGUgY3VycmVudCBmcmFtZSAqLworICAgICAgRW5lcmd5VG90YWwgPSAobmV3TG93YmFuZEVuZXJneSA+PiAxKSArCisgICAgICAgICAgICAgICAgICAgIChoX3NiclRyYW5zaWVudERldGVjdG9yLT5wcmV2TG93QmFuZEVuZXJneSA+PgorICAgICAgICAgICAgICAgICAgICAgMSk7IC8qIG1lYW4gb2YgbmV3IGFuZCBwcmV2IExCIE5SRyAqLworICAgICAgRW5lcmd5VG90YWwgPQorICAgICAgICAgIGZBZGRTYXR1cmF0ZShFbmVyZ3lUb3RhbCwgbmV3SGlnaGJhbmRFbmVyZ3kpOyAvKiBBZGQgSEIgTlJHICovCiAgICAgICAvKiBUaGUgYmVsb3cgYm9yZGVyIHNob3VsZCBzcGVjaWZ5IHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRoZSBtaWRkbGUgYm9yZGVyCiAgICAgICAgICBvZiBhIEZJWEZJWC1mcmFtZSB3aXRoIDIgZW52ZWxvcGVzLiAqLwotICAgICAgYm9yZGVyID0gKHNiclNsb3RzKzEpID4+IDE7CisgICAgICBib3JkZXIgPSAoc2JyU2xvdHMgKyAxKSA+PiAxOwogCi0gICAgICBpZiAoIChJTlQpRW5lcmd5VG90YWwmMHhmZmZmZmZlMCAmJiAoc2NhbGVFbmVyZ2llc1swXTwzMiB8fCBzY2FsZUVuZXJnaWVzWzFdPDMyKSApIC8qIGkuZS4gPiAzMSAqLyB7Ci0gICAgICBkZWx0YSA9IHNwZWN0cmFsQ2hhbmdlKEVuZXJnaWVzTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5lcmd5VG90YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFfZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgaWYgKChJTlQpRW5lcmd5VG90YWwgJiAweGZmZmZmZmUwICYmCisgICAgICAgICAgKHNjYWxlRW5lcmdpZXNbMF0gPCAzMiB8fCBzY2FsZUVuZXJnaWVzWzFdIDwgMzIpKSAvKiBpLmUuID4gMzEgKi8geworICAgICAgICBkZWx0YSA9IHNwZWN0cmFsQ2hhbmdlKEVuZXJnaWVzTSwgc2NhbGVFbmVyZ2llcywgRW5lcmd5VG90YWwsIG5TZmIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLCBZQnVmZmVyV3JpdGVPZmZzZXQsIHNiclNsb3RzLCAmZGVsdGFfZSk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBkZWx0YSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgICBkZWx0YV9lID0gMDsKQEAgLTQzNywxMDAgKzQ0OCw5OCBAQAogICAgICAgICAqdG9uYWxpdHkgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgIH0KIAotCi0gICAgICBpZiAoIGZJc0xlc3NUaGFuKGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3Rocl9tLCBoX3NiclRyYW5zaWVudERldGVjdG9yLT5zcGxpdF90aHJfZSwgZGVsdGEsIGRlbHRhX2UpICkgeworICAgICAgaWYgKGZJc0xlc3NUaGFuKGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3Rocl9tLAorICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3Rocl9lLCBkZWx0YSwgZGVsdGFfZSkpIHsKICAgICAgICAgdHJhbl92ZWN0b3JbMF0gPSAxOyAvKiBTZXQgZmxhZyBmb3Igc3BsaXR0aW5nICovCiAgICAgICB9IGVsc2UgewogICAgICAgICB0cmFuX3ZlY3RvclswXSA9IDA7CiAgICAgICB9Ci0KICAgICB9CiAKICAgICAvKiBVcGRhdGUgcHJldkxvd0JhbmRFbmVyZ3kgKi8KICAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5wcmV2TG93QmFuZEVuZXJneSA9IG5ld0xvd2JhbmRFbmVyZ3k7CiAgICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+cHJldkhpZ2hCYW5kRW5lcmd5ID0gbmV3SGlnaGJhbmRFbmVyZ3k7Ci0gICAgQ19BTExPQ19TQ1JBVENIX0VORChfRW5lcmdpZXNNLCBGSVhQX0RCTCwgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNCpNQVhfRlJFUV9DT0VGRlMpCisgICAgQ19BTExPQ19TQ1JBVENIX0VORChfRW5lcmdpZXNNLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQgKiBNQVhfRlJFUV9DT0VGRlMpCiAgIH0KIH0KIAogLyoKICAqIENhbGN1bGF0ZSB0cmFuc2llbnQgZW5lcmd5IHRocmVzaG9sZCBmb3IgZWFjaCBRTUYgYmFuZAogICovCi1zdGF0aWMgdm9pZAotY2FsY3VsYXRlVGhyZXNob2xkcyhGSVhQX0RCTCAqKlJFU1RSSUNUIEVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKlJFU1RSSUNUIHNjYWxlRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUkVTVFJJQ1QgdGhyZXNob2xkcywKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbm9Db2xzLAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG5vUm93cywKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICB0cmFuX29mZikKLXsKLSAgRklYUF9EQkwgbWVhbl92YWwsc3RkX3ZhbCx0ZW1wOworc3RhdGljIHZvaWQgY2FsY3VsYXRlVGhyZXNob2xkcyhGSVhQX0RCTCAqKlJFU1RSSUNUIEVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIHNjYWxlRW5lcmdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCB0aHJlc2hvbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlcldyaXRlT2Zmc2V0LCBpbnQgWUJ1ZmZlclN6U2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbHMsIGludCBub1Jvd3MsIGludCB0cmFuX29mZikgeworICBGSVhQX0RCTCBtZWFuX3ZhbCwgc3RkX3ZhbCwgdGVtcDsKICAgRklYUF9EQkwgaV9ub0NvbHM7CiAgIEZJWFBfREJMIGlfbm9Db2xzMTsKLSAgRklYUF9EQkwgYWNjdSxhY2N1MCxhY2N1MTsKLSAgaW50IHNjYWxlRmFjdG9yMCxzY2FsZUZhY3RvcjEsY29tbW9uU2NhbGU7Ci0gIGludCBpLGo7CisgIEZJWFBfREJMIGFjY3UsIGFjY3UwLCBhY2N1MTsKKyAgaW50IHNjYWxlRmFjdG9yMCwgc2NhbGVGYWN0b3IxLCBjb21tb25TY2FsZTsKKyAgaW50IGksIGo7CiAKLSAgaV9ub0NvbHMgID0gR2V0SW52SW50KG5vQ29scyArIHRyYW5fb2ZmICkgPDwgWUJ1ZmZlclN6U2hpZnQ7CisgIGlfbm9Db2xzID0gR2V0SW52SW50KG5vQ29scyArIHRyYW5fb2ZmKSA8PCBZQnVmZmVyU3pTaGlmdDsKICAgaV9ub0NvbHMxID0gR2V0SW52SW50KG5vQ29scyArIHRyYW5fb2ZmIC0gMSkgPDwgWUJ1ZmZlclN6U2hpZnQ7CiAKICAgLyogY2FsYyBtaW5pbXVtIHNjYWxlIG9mIGVuZXJnaWVzIG9mIHByZXZpb3VzIGFuZCBjdXJyZW50IGZyYW1lICovCi0gIGNvbW1vblNjYWxlID0gZml4TWluKHNjYWxlRW5lcmdpZXNbMF0sc2NhbGVFbmVyZ2llc1sxXSk7CisgIGNvbW1vblNjYWxlID0gZml4TWluKHNjYWxlRW5lcmdpZXNbMF0sIHNjYWxlRW5lcmdpZXNbMV0pOwogCiAgIC8qIGNhbGMgc2NhbGVmYWN0b3JzIHRvIGFkYXB0IGVuZXJnaWVzIHRvIGNvbW1vbiBzY2FsZSAqLwotICBzY2FsZUZhY3RvcjAgPSBmaXhNaW4oKHNjYWxlRW5lcmdpZXNbMF0tY29tbW9uU2NhbGUpLCAoREZSQUNUX0JJVFMtMSkpOwotICBzY2FsZUZhY3RvcjEgPSBmaXhNaW4oKHNjYWxlRW5lcmdpZXNbMV0tY29tbW9uU2NhbGUpLCAoREZSQUNUX0JJVFMtMSkpOworICBzY2FsZUZhY3RvcjAgPSBmaXhNaW4oKHNjYWxlRW5lcmdpZXNbMF0gLSBjb21tb25TY2FsZSksIChERlJBQ1RfQklUUyAtIDEpKTsKKyAgc2NhbGVGYWN0b3IxID0gZml4TWluKChzY2FsZUVuZXJnaWVzWzFdIC0gY29tbW9uU2NhbGUpLCAoREZSQUNUX0JJVFMgLSAxKSk7CiAKICAgRkRLX0FTU0VSVCgoc2NhbGVGYWN0b3IwID49IDApICYmIChzY2FsZUZhY3RvcjEgPj0gMCkpOwogCiAgIC8qIGNhbGN1bGF0ZSBzdGFuZGFyZCBkZXZpYXRpb24gaW4gZXZlcnkgc3ViYmFuZCAqLwotICBmb3IgKGk9MDsgaTxub1Jvd3M7IGkrKykKLSAgewotICAgIGludCBzdGFydEVuZXJneSA9ICh0cmFuX29mZj4+WUJ1ZmZlclN6U2hpZnQpOwotICAgIGludCBlbmRFbmVyZ3kgPSAoKG5vQ29scz4+WUJ1ZmZlclN6U2hpZnQpK3RyYW5fb2ZmKTsKKyAgZm9yIChpID0gMDsgaSA8IG5vUm93czsgaSsrKSB7CisgICAgaW50IHN0YXJ0RW5lcmd5ID0gKHRyYW5fb2ZmID4+IFlCdWZmZXJTelNoaWZ0KTsKKyAgICBpbnQgZW5kRW5lcmd5ID0gKChub0NvbHMgPj4gWUJ1ZmZlclN6U2hpZnQpICsgdHJhbl9vZmYpOwogICAgIGludCBzaGlmdDsKIAogICAgIC8qIGNhbGN1bGF0ZSBtZWFuIHZhbHVlIG92ZXIgZGVjaW1hdGVkIGVuZXJneSB2YWx1ZXMgKGRvd25zYW1wbGVkIGJ5IDIpLiAqLwogICAgIGFjY3UwID0gYWNjdTEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAotICAgIGZvciAoaj1zdGFydEVuZXJneTsgajxZQnVmZmVyV3JpdGVPZmZzZXQ7IGorKykKLSAgICAgIGFjY3UwICs9IGZNdWx0KEVuZXJnaWVzW2pdW2ldLCBpX25vQ29scyk7Ci0gICAgZm9yICg7IGo8ZW5kRW5lcmd5OyBqKyspCi0gICAgICBhY2N1MSArPSBmTXVsdChFbmVyZ2llc1tqXVtpXSwgaV9ub0NvbHMpOworICAgIGZvciAoaiA9IHN0YXJ0RW5lcmd5OyBqIDwgWUJ1ZmZlcldyaXRlT2Zmc2V0OyBqKyspCisgICAgICBhY2N1MCA9IGZNdWx0QWRkRGl2MihhY2N1MCwgRW5lcmdpZXNbal1baV0sIGlfbm9Db2xzKTsKKyAgICBmb3IgKDsgaiA8IGVuZEVuZXJneTsgaisrKQorICAgICAgYWNjdTEgPSBmTXVsdEFkZERpdjIoYWNjdTEsIEVuZXJnaWVzW2pdW2ldLCBpX25vQ29scyk7CiAKLSAgICBtZWFuX3ZhbCA9IChhY2N1MCA+PiBzY2FsZUZhY3RvcjApICsgKGFjY3UxID4+IHNjYWxlRmFjdG9yMSk7ICAvKiBhdmVyYWdlICovCi0gICAgc2hpZnQgICAgPSBmaXhNYXgoMCxDb3VudExlYWRpbmdCaXRzKG1lYW5fdmFsKS02KTsgICAgICAgICAgICAgLyogLTYgdG8ga2VlcCByb29tIGZvciBhY2N1bXVsYXRpbmcgdXB0byBOID0gMjQgdmFsdWVzICovCisgICAgbWVhbl92YWwgPSAoKGFjY3UwIDw8IDEpID4+IHNjYWxlRmFjdG9yMCkgKworICAgICAgICAgICAgICAgKChhY2N1MSA8PCAxKSA+PiBzY2FsZUZhY3RvcjEpOyAvKiBhdmVyYWdlICovCisgICAgc2hpZnQgPSBmaXhNYXgoCisgICAgICAgIDAsIENvdW50TGVhZGluZ0JpdHMobWVhbl92YWwpIC0KKyAgICAgICAgICAgICAgIDYpOyAvKiAtNiB0byBrZWVwIHJvb20gZm9yIGFjY3VtdWxhdGluZyB1cHRvIE4gPSAyNCB2YWx1ZXMgKi8KIAogICAgIC8qIGNhbGN1bGF0ZSBzdGFuZGFyZCBkZXZpYXRpb24gKi8KICAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKICAgICAvKiBzdW1tZSB7ICgobWVhbl92YWwtbnJnKV4yKSAqIGlfbm9Db2xzMSB9ICovCi0gICAgZm9yIChqPXN0YXJ0RW5lcmd5OyBqPFlCdWZmZXJXcml0ZU9mZnNldDsgaisrKSB7Ci0gICAgICB0ZW1wID0gKChGSVhQX0RCTCltZWFuX3ZhbCAtICgoRklYUF9EQkwpRW5lcmdpZXNbal1baV0gPj4gc2NhbGVGYWN0b3IwKSk8PHNoaWZ0OwotICAgICAgdGVtcCA9IGZQb3cyKHRlbXApOwotICAgICAgdGVtcCA9IGZNdWx0KHRlbXAsIGlfbm9Db2xzMSk7Ci0gICAgICBhY2N1ICs9IHRlbXA7CisgICAgZm9yIChqID0gc3RhcnRFbmVyZ3k7IGogPCBZQnVmZmVyV3JpdGVPZmZzZXQ7IGorKykgeworICAgICAgdGVtcCA9ICgoRklYUF9EQkwpbWVhbl92YWwgLSAoKEZJWFBfREJMKUVuZXJnaWVzW2pdW2ldID4+IHNjYWxlRmFjdG9yMCkpCisgICAgICAgICAgICAgPDwgc2hpZnQ7CisgICAgICB0ZW1wID0gZlBvdzJEaXYyKHRlbXApOworICAgICAgYWNjdSA9IGZNdWx0QWRkRGl2MihhY2N1LCB0ZW1wLCBpX25vQ29sczEpOwogICAgIH0KLSAgICBmb3IgKDsgajxlbmRFbmVyZ3k7IGorKykgewotICAgICAgdGVtcCA9ICgoRklYUF9EQkwpbWVhbl92YWwgLSAoKEZJWFBfREJMKUVuZXJnaWVzW2pdW2ldID4+IHNjYWxlRmFjdG9yMSkpPDxzaGlmdDsKLSAgICAgIHRlbXAgPSBmUG93Mih0ZW1wKTsKLSAgICAgIHRlbXAgPSBmTXVsdCh0ZW1wLCBpX25vQ29sczEpOwotICAgICAgYWNjdSArPSB0ZW1wOworICAgIGZvciAoOyBqIDwgZW5kRW5lcmd5OyBqKyspIHsKKyAgICAgIHRlbXAgPSAoKEZJWFBfREJMKW1lYW5fdmFsIC0gKChGSVhQX0RCTClFbmVyZ2llc1tqXVtpXSA+PiBzY2FsZUZhY3RvcjEpKQorICAgICAgICAgICAgIDw8IHNoaWZ0OworICAgICAgdGVtcCA9IGZQb3cyRGl2Mih0ZW1wKTsKKyAgICAgIGFjY3UgPSBmTXVsdEFkZERpdjIoYWNjdSwgdGVtcCwgaV9ub0NvbHMxKTsKICAgICB9Ci0KLSAgICBzdGRfdmFsID0gc3FydEZpeHAoYWNjdSk+PnNoaWZ0OyAgICAgLyogc3RhbmRhcmQgZGV2aWF0aW9uICovCisgICAgYWNjdSA8PD0gMjsKKyAgICBzdGRfdmFsID0gc3FydEZpeHAoYWNjdSkgPj4gc2hpZnQ7IC8qIHN0YW5kYXJkIGRldmlhdGlvbiAqLwogCiAgICAgLyoKICAgICBUYWtlIG5ldyB0aHJlc2hvbGQgYXMgYXZlcmFnZSBvZiBjYWxjdWxhdGVkIHN0YW5kYXJkIGRldmlhdGlvbiByYXRpbwogICAgIGFuZCBvbGQgdGhyZXNob2xkIGlmIGdyZWF0ZXIgdGhhbiBhYnNvbHV0ZSB0aHJlc2hvbGQKICAgICAqLwotICAgIHRlbXAgPSAoIGNvbW1vblNjYWxlPD0oREZSQUNUX0JJVFMtMSkgKQotICAgICAgICAgICAgPyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjY2ZiksIHRocmVzaG9sZHNbaV0pICsgKGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMzRmKSwgc3RkX3ZhbCkgPj4gY29tbW9uU2NhbGUpCi0gICAgICAgICAgICA6IChGSVhQX0RCTCkgMDsKKyAgICB0ZW1wID0gKGNvbW1vblNjYWxlIDw9IChERlJBQ1RfQklUUyAtIDEpKQorICAgICAgICAgICAgICAgPyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjY2ZiksIHRocmVzaG9sZHNbaV0pICsKKyAgICAgICAgICAgICAgICAgICAgIChmTXVsdChGTDJGWENPTlNUX0RCTCgwLjM0ZiksIHN0ZF92YWwpID4+IGNvbW1vblNjYWxlKQorICAgICAgICAgICAgICAgOiAoRklYUF9EQkwpMDsKIAotICAgIHRocmVzaG9sZHNbaV0gPSBmaXhNYXgoQUJTX1RIUkVTLHRlbXApOworICAgIHRocmVzaG9sZHNbaV0gPSBmaXhNYXgoQUJTX1RIUkVTLCB0ZW1wKTsKIAogICAgIEZES19BU1NFUlQoY29tbW9uU2NhbGUgPj0gMCk7CiAgIH0KQEAgLTUzOSwyNiArNTQ4LDE3IEBACiAvKgogICogQ2FsY3VsYXRlIHRyYW5zaWVudCBsZXZlbHMgZm9yIGVhY2ggUU1GIHRpbWUgc2xvdC4KICAqLwotc3RhdGljIHZvaWQKLWV4dHJhY3RUcmFuc2llbnRDYW5kaWRhdGVzKEZJWFBfREJMICAqKlJFU1RSSUNUIEVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqUkVTVFJJQ1Qgc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHRocmVzaG9sZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpSRVNUUklDVCB0cmFuc2llbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBub0NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBzdGFydF9iYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgc3RvcF9iYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgdHJhbl9vZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBhZGRQcmV2U2FtcGxlcykKLXsKK3N0YXRpYyB2b2lkIGV4dHJhY3RUcmFuc2llbnRDYW5kaWRhdGVzKAorICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgRW5lcmdpZXMsIElOVCAqUkVTVFJJQ1Qgc2NhbGVFbmVyZ2llcywKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgdGhyZXNob2xkcywgRklYUF9EQkwgKlJFU1RSSUNUIHRyYW5zaWVudHMsCisgICAgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwgaW50IFlCdWZmZXJTelNoaWZ0LCBpbnQgbm9Db2xzLCBpbnQgc3RhcnRfYmFuZCwKKyAgICBpbnQgc3RvcF9iYW5kLCBpbnQgdHJhbl9vZmYsIGludCBhZGRQcmV2U2FtcGxlcykgewogICBGSVhQX0RCTCBpX3RocmVzOwotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoRW5lcmdpZXNUZW1wLCBGSVhQX0RCTCwgMipRTUZfTUFYX1RJTUVfU0xPVFMpOwotICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEVuZXJnaWVzVGVtcCA9IEVuZXJnaWVzVGVtcDsKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKEVuZXJnaWVzVGVtcCwgRklYUF9EQkwsIDIgKiAzMikKICAgaW50IHRtcFNjYWxlRW5lcmdpZXMwLCB0bXBTY2FsZUVuZXJnaWVzMTsKICAgaW50IGVuZENvbmQ7Ci0gIGludCBzdGFydEVuZXJnLGVuZEVuZXJnOwotICBpbnQgaSxqLGpJbmRleCxqcEJNOworICBpbnQgc3RhcnRFbmVyZywgZW5kRW5lcmc7CisgIGludCBpLCBqLCBqSW5kZXgsIGpwQk07CiAKICAgdG1wU2NhbGVFbmVyZ2llczAgPSBzY2FsZUVuZXJnaWVzWzBdOwogICB0bXBTY2FsZUVuZXJnaWVzMSA9IHNjYWxlRW5lcmdpZXNbMV07CkBAIC01NzEsMjM3ICs1NzEsMjI3IEBACiAgIEZES19BU1NFUlQoKHRtcFNjYWxlRW5lcmdpZXMwID49IDApICYmICh0bXBTY2FsZUVuZXJnaWVzMSA+PSAwKSk7CiAKICAgLyogS2VlcCBhZGRQcmV2U2FtcGxlcyBleHRyYSBwcmV2aW91cyB0cmFuc2llbnQgY2FuZGlkYXRlcy4gKi8KLSAgRkRLbWVtbW92ZSh0cmFuc2llbnRzLCB0cmFuc2llbnRzICsgbm9Db2xzIC0gYWRkUHJldlNhbXBsZXMsICh0cmFuX29mZithZGRQcmV2U2FtcGxlcykgKiBzaXplb2YgKEZJWFBfREJMKSk7Ci0gIEZES21lbWNsZWFyKHRyYW5zaWVudHMgKyB0cmFuX29mZiArIGFkZFByZXZTYW1wbGVzLCBub0NvbHMgKiBzaXplb2YgKEZJWFBfREJMKSk7CisgIEZES21lbW1vdmUodHJhbnNpZW50cywgdHJhbnNpZW50cyArIG5vQ29scyAtIGFkZFByZXZTYW1wbGVzLAorICAgICAgICAgICAgICh0cmFuX29mZiArIGFkZFByZXZTYW1wbGVzKSAqIHNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jbGVhcih0cmFuc2llbnRzICsgdHJhbl9vZmYgKyBhZGRQcmV2U2FtcGxlcywKKyAgICAgICAgICAgICAgbm9Db2xzICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKICAgZW5kQ29uZCA9IG5vQ29sczsgLyogQW1vdW50IG9mIG5ldyB0cmFuc2llbnQgdmFsdWVzIHRvIGJlIGNhbGN1bGF0ZWQuICovCi0gIHN0YXJ0RW5lcmcgPSAodHJhbl9vZmYtMyk+PllCdWZmZXJTelNoaWZ0OyAvKiA+PllCdWZmZXJTelNoaWZ0IGJlY2F1c2Ugb2YgYW1vdW50IG9mIGVuZXJneSB2YWx1ZXMuIC0zIGJlY2F1c2Ugb2YgbmVpZ2hib3JzIGJlaW5nIHdhdGNoZWQuICovCi0gIGVuZEVuZXJnID0gKChub0NvbHMrIChZQnVmZmVyV3JpdGVPZmZzZXQ8PFlCdWZmZXJTelNoaWZ0KSktMSk+PllCdWZmZXJTelNoaWZ0OyAvKiBZQnVmZmVyU3pTaGlmdCBzaGlmdHMgYmVjYXVzZSBvZiBoYWxmIGVuZXJneSB2YWx1ZXMuICovCisgIHN0YXJ0RW5lcmcgPSAodHJhbl9vZmYgLSAzKSA+PiBZQnVmZmVyU3pTaGlmdDsgLyogPj5ZQnVmZmVyU3pTaGlmdCBiZWNhdXNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50IG9mIGVuZXJneSB2YWx1ZXMuIC0zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSBvZiBuZWlnaGJvcnMgYmVpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaGVkLiAqLworICBlbmRFbmVyZyA9CisgICAgICAoKG5vQ29scyArIChZQnVmZmVyV3JpdGVPZmZzZXQgPDwgWUJ1ZmZlclN6U2hpZnQpKSAtIDEpID4+CisgICAgICBZQnVmZmVyU3pTaGlmdDsgLyogWUJ1ZmZlclN6U2hpZnQgc2hpZnRzIGJlY2F1c2Ugb2YgaGFsZiBlbmVyZ3kgdmFsdWVzLiAqLwogCi0gIC8qIENvbXB1dGUgZGlmZmVyZW50aWFsIHZhbHVlcyB3aXRoIHR3byBkaWZmZXJlbnQgd2VpZ2h0aW5ncyBpbiBldmVyeSBzdWJiYW5kICovCi0gIGZvciAoaT1zdGFydF9iYW5kOyBpPHN0b3BfYmFuZDsgaSsrKQotICB7CisgIC8qIENvbXB1dGUgZGlmZmVyZW50aWFsIHZhbHVlcyB3aXRoIHR3byBkaWZmZXJlbnQgd2VpZ2h0aW5ncyBpbiBldmVyeSBzdWJiYW5kCisgICAqLworICBmb3IgKGkgPSBzdGFydF9iYW5kOyBpIDwgc3RvcF9iYW5kOyBpKyspIHsKICAgICBGSVhQX0RCTCB0aHJlcyA9IHRocmVzaG9sZHNbaV07CiAKLSAgICBpZigoTE9ORyl0aHJlc2hvbGRzW2ldPj0yNTYpCi0gICAgICBpX3RocmVzID0gKExPTkcpKCAoTE9ORylNQVhWQUxfREJMIC8gKCgoKExPTkcpdGhyZXNob2xkc1tpXSkpKzEpICk8PCgzMi0yNCk7CisgICAgaWYgKChMT05HKXRocmVzaG9sZHNbaV0gPj0gMjU2KQorICAgICAgaV90aHJlcyA9IChMT05HKSgoTE9ORylNQVhWQUxfREJMIC8gKCgoKExPTkcpdGhyZXNob2xkc1tpXSkpICsgMSkpCisgICAgICAgICAgICAgICAgPDwgKDMyIC0gMjQpOwogICAgIGVsc2UKICAgICAgIGlfdGhyZXMgPSAoTE9ORylNQVhWQUxfREJMOwogCiAgICAgLyogQ29weSBvbmUgdGltZXNsb3QgYW5kIGRlLXNjYWxlIGFuZCBkZS1zcXVpc2ggKi8KICAgICBpZiAoWUJ1ZmZlclN6U2hpZnQgPT0gMSkgewotICAgICAgZm9yKGo9c3RhcnRFbmVyZzsgajxZQnVmZmVyV3JpdGVPZmZzZXQ7IGorKykgeworICAgICAgZm9yIChqID0gc3RhcnRFbmVyZzsgaiA8IFlCdWZmZXJXcml0ZU9mZnNldDsgaisrKSB7CiAgICAgICAgIEZJWFBfREJMIHRtcCA9IEVuZXJnaWVzW2pdW2ldOwotICAgICAgICBFbmVyZ2llc1RlbXBbKGo8PDEpKzFdID0gRW5lcmdpZXNUZW1wW2o8PDFdID0gdG1wPj50bXBTY2FsZUVuZXJnaWVzMDsKKyAgICAgICAgRW5lcmdpZXNUZW1wWyhqIDw8IDEpICsgMV0gPSBFbmVyZ2llc1RlbXBbaiA8PCAxXSA9CisgICAgICAgICAgICB0bXAgPj4gdG1wU2NhbGVFbmVyZ2llczA7CiAgICAgICB9Ci0gICAgICBmb3IoOyBqPD1lbmRFbmVyZzsgaisrKSB7CisgICAgICBmb3IgKDsgaiA8PSBlbmRFbmVyZzsgaisrKSB7CiAgICAgICAgIEZJWFBfREJMIHRtcCA9IEVuZXJnaWVzW2pdW2ldOwotICAgICAgICBFbmVyZ2llc1RlbXBbKGo8PDEpKzFdID0gRW5lcmdpZXNUZW1wW2o8PDFdID0gdG1wPj50bXBTY2FsZUVuZXJnaWVzMTsKKyAgICAgICAgRW5lcmdpZXNUZW1wWyhqIDw8IDEpICsgMV0gPSBFbmVyZ2llc1RlbXBbaiA8PCAxXSA9CisgICAgICAgICAgICB0bXAgPj4gdG1wU2NhbGVFbmVyZ2llczE7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIGZvcihqPXN0YXJ0RW5lcmc7IGo8WUJ1ZmZlcldyaXRlT2Zmc2V0OyBqKyspIHsKKyAgICAgIGZvciAoaiA9IHN0YXJ0RW5lcmc7IGogPCBZQnVmZmVyV3JpdGVPZmZzZXQ7IGorKykgewogICAgICAgICBGSVhQX0RCTCB0bXAgPSBFbmVyZ2llc1tqXVtpXTsKLSAgICAgICAgRW5lcmdpZXNUZW1wW2pdID0gdG1wPj50bXBTY2FsZUVuZXJnaWVzMDsKKyAgICAgICAgRW5lcmdpZXNUZW1wW2pdID0gdG1wID4+IHRtcFNjYWxlRW5lcmdpZXMwOwogICAgICAgfQotICAgICAgZm9yKDsgajw9ZW5kRW5lcmc7IGorKykgeworICAgICAgZm9yICg7IGogPD0gZW5kRW5lcmc7IGorKykgewogICAgICAgICBGSVhQX0RCTCB0bXAgPSBFbmVyZ2llc1tqXVtpXTsKLSAgICAgICAgRW5lcmdpZXNUZW1wW2pdID0gdG1wPj50bXBTY2FsZUVuZXJnaWVzMTsKKyAgICAgICAgRW5lcmdpZXNUZW1wW2pdID0gdG1wID4+IHRtcFNjYWxlRW5lcmdpZXMxOwogICAgICAgfQogICAgIH0KIAogICAgIC8qIERldGVjdCBwZWFrcyBpbiBlbmVyZ3kgdmFsdWVzLiAqLwogCiAgICAgakluZGV4ID0gdHJhbl9vZmY7Ci0gICAganBCTSA9IGpJbmRleCthZGRQcmV2U2FtcGxlczsKKyAgICBqcEJNID0gakluZGV4ICsgYWRkUHJldlNhbXBsZXM7CiAKLSAgICBmb3IgKGo9ZW5kQ29uZDsgai0tOyBqSW5kZXgrKywganBCTSsrKQotICAgIHsKLQorICAgIGZvciAoaiA9IGVuZENvbmQ7IGotLTsgakluZGV4KyssIGpwQk0rKykgewogICAgICAgRklYUF9EQkwgZGVsdGEsIHRyYW47CiAgICAgICBpbnQgZDsKIAogICAgICAgZGVsdGEgPSAoRklYUF9EQkwpMDsKLSAgICAgIHRyYW4gID0gKEZJWFBfREJMKTA7CisgICAgICB0cmFuID0gKEZJWFBfREJMKTA7CiAKLSAgICAgIGZvciAoZD0xOyBkPDQ7IGQrKykgewotICAgICAgICBkZWx0YSArPSBwRW5lcmdpZXNUZW1wW2pJbmRleCtkXTsgLyogUiAqLwotICAgICAgICBkZWx0YSAtPSBwRW5lcmdpZXNUZW1wW2pJbmRleC1kXTsgLyogTCAqLworICAgICAgZm9yIChkID0gMTsgZCA8IDQ7IGQrKykgeworICAgICAgICBkZWx0YSArPSBFbmVyZ2llc1RlbXBbakluZGV4ICsgZF07IC8qIFIgKi8KKyAgICAgICAgZGVsdGEgLT0gRW5lcmdpZXNUZW1wW2pJbmRleCAtIGRdOyAvKiBMICovCiAgICAgICAgIGRlbHRhIC09IHRocmVzOwogCi0gICAgICAgIGlmICggZGVsdGEgPiAoRklYUF9EQkwpMCApIHsKLSAgICAgICAgICB0cmFuICs9IGZNdWx0KGlfdGhyZXMsIGRlbHRhKTsKKyAgICAgICAgaWYgKGRlbHRhID4gKEZJWFBfREJMKTApIHsKKyAgICAgICAgICB0cmFuID0gZk11bHRBZGREaXYyKHRyYW4sIGlfdGhyZXMsIGRlbHRhKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgdHJhbnNpZW50c1tqcEJNXSArPSB0cmFuOworICAgICAgdHJhbnNpZW50c1tqcEJNXSArPSAodHJhbiA8PCAxKTsKICAgICB9CiAgIH0KLSAgQ19BTExPQ19TQ1JBVENIX0VORChFbmVyZ2llc1RlbXAsIEZJWFBfREJMLCAyKlFNRl9NQVhfVElNRV9TTE9UUyk7CisgIENfQUxMT0NfU0NSQVRDSF9FTkQoRW5lcmdpZXNUZW1wLCBGSVhQX0RCTCwgMiAqIDMyKQogfQogCi12b2lkCi1GREtzYnJFbmNfdHJhbnNpZW50RGV0ZWN0KEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2FsZUVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdHJhbnNpZW50X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVNaWRkbGVCb3JkZXIpCi17Cit2b2lkIEZES3NickVuY190cmFuc2llbnREZXRlY3QoSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqRW5lcmdpZXMsIElOVCAqc2NhbGVFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdHJhbnNpZW50X2luZm8sIGludCBZQnVmZmVyV3JpdGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJTelNoaWZ0LCBpbnQgdGltZVN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lTWlkZGxlQm9yZGVyKSB7CiAgIGludCBub19jb2xzID0gaF9zYnJUcmFuLT5ub19jb2xzOwogICBpbnQgcW1mU3RhcnRTYW1wbGU7CiAgIGludCBhZGRQcmV2U2FtcGxlczsKLSAgaW50IHRpbWVTdGVwU2hpZnQ9MDsKKyAgaW50IHRpbWVTdGVwU2hpZnQgPSAwOwogICBpbnQgaSwgY29uZDsKIAogICAvKiBXaGVyZSB0byBzdGFydCBsb29raW5nIGZvciB0cmFuc2llbnRzIGluIHRoZSB0cmFuc2llbnQgY2FuZGlkYXRlIGJ1ZmZlciAqLwogICBxbWZTdGFydFNhbXBsZSA9IHRpbWVTdGVwICogZnJhbWVNaWRkbGVCb3JkZXI7Ci0gIC8qIFdlIG5lZWQgdG8gbG9vayBvbmUgdmFsdWUgYmFja3dhcmRzIGluIHRoZSB0cmFuc2llbnRzLCBzbyB3ZSBtaWdodCBuZWVkIG9uZSBtb3JlIHByZXZpb3VzIHZhbHVlLiAqLwotICBhZGRQcmV2U2FtcGxlcyA9IChxbWZTdGFydFNhbXBsZSA+IDApID8gMDogMTsKKyAgLyogV2UgbmVlZCB0byBsb29rIG9uZSB2YWx1ZSBiYWNrd2FyZHMgaW4gdGhlIHRyYW5zaWVudHMsIHNvIHdlIG1pZ2h0IG5lZWQgb25lCisgICAqIG1vcmUgcHJldmlvdXMgdmFsdWUuICovCisgIGFkZFByZXZTYW1wbGVzID0gKHFtZlN0YXJ0U2FtcGxlID4gMCkgPyAwIDogMTsKIAogICBzd2l0Y2ggKHRpbWVTdGVwKSB7Ci0gICAgY2FzZSAxOiB0aW1lU3RlcFNoaWZ0ID0gMDsgYnJlYWs7Ci0gICAgY2FzZSAyOiB0aW1lU3RlcFNoaWZ0ID0gMTsgYnJlYWs7Ci0gICAgY2FzZSA0OiB0aW1lU3RlcFNoaWZ0ID0gMjsgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgdGltZVN0ZXBTaGlmdCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICB0aW1lU3RlcFNoaWZ0ID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIHRpbWVTdGVwU2hpZnQgPSAyOworICAgICAgYnJlYWs7CiAgIH0KIAotICBjYWxjdWxhdGVUaHJlc2hvbGRzKEVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuLT50aHJlc2hvbGRzLAotICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPm5vX2NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuLT5ub19yb3dzLAotICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+dHJhbl9vZmYpOworICBjYWxjdWxhdGVUaHJlc2hvbGRzKEVuZXJnaWVzLCBzY2FsZUVuZXJnaWVzLCBoX3NiclRyYW4tPnRocmVzaG9sZHMsCisgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LCBZQnVmZmVyU3pTaGlmdCwgaF9zYnJUcmFuLT5ub19jb2xzLAorICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+bm9fcm93cywgaF9zYnJUcmFuLT50cmFuX29mZik7CiAKLSAgZXh0cmFjdFRyYW5zaWVudENhbmRpZGF0ZXMoRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+dGhyZXNob2xkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuLT50cmFuc2llbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJTelNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPm5vX2NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+bm9fcm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuLT50cmFuX29mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUHJldlNhbXBsZXMgKTsKKyAgZXh0cmFjdFRyYW5zaWVudENhbmRpZGF0ZXMoCisgICAgICBFbmVyZ2llcywgc2NhbGVFbmVyZ2llcywgaF9zYnJUcmFuLT50aHJlc2hvbGRzLCBoX3NiclRyYW4tPnRyYW5zaWVudHMsCisgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsIFlCdWZmZXJTelNoaWZ0LCBoX3NiclRyYW4tPm5vX2NvbHMsIDAsCisgICAgICBoX3NiclRyYW4tPm5vX3Jvd3MsIGhfc2JyVHJhbi0+dHJhbl9vZmYsIGFkZFByZXZTYW1wbGVzKTsKIAogICB0cmFuc2llbnRfaW5mb1swXSA9IDA7CiAgIHRyYW5zaWVudF9pbmZvWzFdID0gMDsKICAgdHJhbnNpZW50X2luZm9bMl0gPSAwOwogCi0gIC8qIE9mZnNldCBieSB0aGUgYW1vdW50IG9mIGFkZGl0aW9uYWwgcHJldmlvdXMgdHJhbnNpZW50IGNhbmRpZGF0ZXMgYmVpbmcga2VwdC4gKi8KKyAgLyogT2Zmc2V0IGJ5IHRoZSBhbW91bnQgb2YgYWRkaXRpb25hbCBwcmV2aW91cyB0cmFuc2llbnQgY2FuZGlkYXRlcyBiZWluZworICAgKiBrZXB0LiAqLwogICBxbWZTdGFydFNhbXBsZSArPSBhZGRQcmV2U2FtcGxlczsKIAotICAvKiBDaGVjayBmb3IgdHJhbnNpZW50cyBpbiBzZWNvbmQgZ3JhbnVsZSAocGljayB0aGUgbGFzdCB2YWx1ZSBvZiBzdWJzZXF1ZW50IHZhbHVlcykgICovCi0gIGZvciAoaT1xbWZTdGFydFNhbXBsZTsgaTxxbWZTdGFydFNhbXBsZSArIG5vX2NvbHM7IGkrKykgewotICAgIGNvbmQgPSAgICAoaF9zYnJUcmFuLT50cmFuc2llbnRzW2ldIDwgZk11bHQoRkwyRlhDT05TVF9EQkwoMC45ZiksIGhfc2JyVHJhbi0+dHJhbnNpZW50c1tpIC0gMV0pICkKLSAgICAgICAgICAgJiYgKGhfc2JyVHJhbi0+dHJhbnNpZW50c1tpIC0gMV0gPiBoX3NiclRyYW4tPnRyYW5fdGhyKTsKKyAgLyogQ2hlY2sgZm9yIHRyYW5zaWVudHMgaW4gc2Vjb25kIGdyYW51bGUgKHBpY2sgdGhlIGxhc3QgdmFsdWUgb2Ygc3Vic2VxdWVudAorICAgKiB2YWx1ZXMpICAqLworICBmb3IgKGkgPSBxbWZTdGFydFNhbXBsZTsgaSA8IHFtZlN0YXJ0U2FtcGxlICsgbm9fY29sczsgaSsrKSB7CisgICAgY29uZCA9IChoX3NiclRyYW4tPnRyYW5zaWVudHNbaV0gPAorICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMC45ZiksIGhfc2JyVHJhbi0+dHJhbnNpZW50c1tpIC0gMV0pKSAmJgorICAgICAgICAgICAoaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSA+IGhfc2JyVHJhbi0+dHJhbl90aHIpOwogCiAgICAgaWYgKGNvbmQpIHsKLSAgICAgIHRyYW5zaWVudF9pbmZvWzBdID0gKGkgLSBxbWZTdGFydFNhbXBsZSk+PnRpbWVTdGVwU2hpZnQ7CisgICAgICB0cmFuc2llbnRfaW5mb1swXSA9IChpIC0gcW1mU3RhcnRTYW1wbGUpID4+IHRpbWVTdGVwU2hpZnQ7CiAgICAgICB0cmFuc2llbnRfaW5mb1sxXSA9IDE7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KIAotICBpZiAoIGhfc2JyVHJhbi0+ZnJhbWVTaGlmdCAhPSAwKSB7Ci0gICAgICAvKiB0cmFuc2llbnQgcHJlZGljdGlvbiBmb3IgTERTQlIgKi8KLSAgICAgIC8qIENoZWNrIGZvciB0cmFuc2llbnRzIGluIGZpcnN0IDxmcmFtZVNoaWZ0PiBxbWYtc2xvdHMgb2Ygc2Vjb25kIGZyYW1lICovCi0gICAgICBmb3IgKGk9cW1mU3RhcnRTYW1wbGUrbm9fY29sczsgaTxxbWZTdGFydFNhbXBsZSArIG5vX2NvbHMraF9zYnJUcmFuLT5mcmFtZVNoaWZ0OyBpKyspIHsKKyAgaWYgKGhfc2JyVHJhbi0+ZnJhbWVTaGlmdCAhPSAwKSB7CisgICAgLyogdHJhbnNpZW50IHByZWRpY3Rpb24gZm9yIExEU0JSICovCisgICAgLyogQ2hlY2sgZm9yIHRyYW5zaWVudHMgaW4gZmlyc3QgPGZyYW1lU2hpZnQ+IHFtZi1zbG90cyBvZiBzZWNvbmQgZnJhbWUgKi8KKyAgICBmb3IgKGkgPSBxbWZTdGFydFNhbXBsZSArIG5vX2NvbHM7CisgICAgICAgICBpIDwgcW1mU3RhcnRTYW1wbGUgKyBub19jb2xzICsgaF9zYnJUcmFuLT5mcmFtZVNoaWZ0OyBpKyspIHsKKyAgICAgIGNvbmQgPSAoaF9zYnJUcmFuLT50cmFuc2llbnRzW2ldIDwKKyAgICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMC45ZiksIGhfc2JyVHJhbi0+dHJhbnNpZW50c1tpIC0gMV0pKSAmJgorICAgICAgICAgICAgIChoX3NiclRyYW4tPnRyYW5zaWVudHNbaSAtIDFdID4gaF9zYnJUcmFuLT50cmFuX3Rocik7CiAKLSAgICAgICAgY29uZCA9ICAgIChoX3NiclRyYW4tPnRyYW5zaWVudHNbaV0gPCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjlmKSwgaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSkgKQotICAgICAgICAgICAgICAgJiYgKGhfc2JyVHJhbi0+dHJhbnNpZW50c1tpIC0gMV0gPiBoX3NiclRyYW4tPnRyYW5fdGhyKTsKLQotICAgICAgICBpZiAoY29uZCkgewotICAgICAgICAgIGludCBwb3MgPSAoaW50KSAoIChpIC0gcW1mU3RhcnRTYW1wbGUtbm9fY29scykgPj4gdGltZVN0ZXBTaGlmdCApOwotICAgICAgICAgIGlmICgocG9zIDwgMykgJiYgKHRyYW5zaWVudF9pbmZvWzFdPT0wKSkgewotICAgICAgICAgICAgdHJhbnNpZW50X2luZm9bMl0gPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChjb25kKSB7CisgICAgICAgIGludCBwb3MgPSAoaW50KSgoaSAtIHFtZlN0YXJ0U2FtcGxlIC0gbm9fY29scykgPj4gdGltZVN0ZXBTaGlmdCk7CisgICAgICAgIGlmICgocG9zIDwgMykgJiYgKHRyYW5zaWVudF9pbmZvWzFdID09IDApKSB7CisgICAgICAgICAgdHJhbnNpZW50X2luZm9bMl0gPSAxOwogICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgICAgfQorICAgIH0KICAgfQogfQogCi1pbnQKLUZES3NickVuY19Jbml0U2JyVHJhbnNpZW50RGV0ZWN0b3IoSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuc2llbnREZXRlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgc2JyU3ludGF4RmxhZ3MsIC8qIFNCUiBzeW50YXggZmxhZ3MgZGVyaXZlZCBmcm9tIEFPVC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgZnJhbWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBzYW1wbGVGcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWd1cmF0aW9uUHRyIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgdHJhbl9mYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbm9fY29scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbm9fcm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgZnJhbWVTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgdHJhbl9vZmYpCi17Ci0gICAgSU5UIHRvdGFsQml0cmF0ZSA9IHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5zdGFuZGFyZEJpdHJhdGUgKiBwYXJhbXMtPmNvZGVjU2V0dGluZ3MubkNoYW5uZWxzOwotICAgIElOVCBjb2RlY0JpdHJhdGUgPSBwYXJhbXMtPmNvZGVjU2V0dGluZ3MuYml0UmF0ZTsKLSAgICBGSVhQX0RCTCBiaXRyYXRlRmFjdG9yX20sIGZyYW1lZHVyX2ZpeDsKLSAgICBJTlQgYml0cmF0ZUZhY3Rvcl9lLCB0bXBfZTsKK2ludCBGREtzYnJFbmNfSW5pdFNiclRyYW5zaWVudERldGVjdG9yKAorICAgIEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsCisgICAgVUlOVCBzYnJTeW50YXhGbGFncywgLyogU0JSIHN5bnRheCBmbGFncyBkZXJpdmVkIGZyb20gQU9ULiAqLworICAgIElOVCBmcmFtZVNpemUsIElOVCBzYW1wbGVGcmVxLCBzYnJDb25maWd1cmF0aW9uUHRyIHBhcmFtcywgaW50IHRyYW5fZmMsCisgICAgaW50IG5vX2NvbHMsIGludCBub19yb3dzLCBpbnQgWUJ1ZmZlcldyaXRlT2Zmc2V0LCBpbnQgWUJ1ZmZlclN6U2hpZnQsCisgICAgaW50IGZyYW1lU2hpZnQsIGludCB0cmFuX29mZikgeworICBJTlQgdG90YWxCaXRyYXRlID0KKyAgICAgIHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5zdGFuZGFyZEJpdHJhdGUgKiBwYXJhbXMtPmNvZGVjU2V0dGluZ3MubkNoYW5uZWxzOworICBJTlQgY29kZWNCaXRyYXRlID0gcGFyYW1zLT5jb2RlY1NldHRpbmdzLmJpdFJhdGU7CisgIEZJWFBfREJMIGJpdHJhdGVGYWN0b3JfbSwgZnJhbWVkdXJfZml4OworICBJTlQgYml0cmF0ZUZhY3Rvcl9lLCB0bXBfZTsKIAotICAgIEZES21lbWNsZWFyKGhfc2JyVHJhbnNpZW50RGV0ZWN0b3Isc2l6ZW9mKFNCUl9UUkFOU0lFTlRfREVURUNUT1IpKTsKKyAgRkRLbWVtY2xlYXIoaF9zYnJUcmFuc2llbnREZXRlY3Rvciwgc2l6ZW9mKFNCUl9UUkFOU0lFTlRfREVURUNUT1IpKTsKIAotICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPmZyYW1lU2hpZnQgPSBmcmFtZVNoaWZ0OwotICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fb2ZmID0gdHJhbl9vZmY7CisgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPmZyYW1lU2hpZnQgPSBmcmFtZVNoaWZ0OworICBoX3NiclRyYW5zaWVudERldGVjdG9yLT50cmFuX29mZiA9IHRyYW5fb2ZmOwogCi0gICAgaWYoY29kZWNCaXRyYXRlKSB7Ci0gICAgICBiaXRyYXRlRmFjdG9yX20gPSBmRGl2Tm9ybSgoRklYUF9EQkwpdG90YWxCaXRyYXRlLCAoRklYUF9EQkwpKGNvZGVjQml0cmF0ZTw8MiksJmJpdHJhdGVGYWN0b3JfZSk7Ci0gICAgICBiaXRyYXRlRmFjdG9yX2UgKz0gMjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBiaXRyYXRlRmFjdG9yX20gPSBGTDJGWENPTlNUX0RCTCgxLjAvNC4wKTsKLSAgICAgIGJpdHJhdGVGYWN0b3JfZSA9IDI7Ci0gICAgfQorICBpZiAoY29kZWNCaXRyYXRlKSB7CisgICAgYml0cmF0ZUZhY3Rvcl9tID0gZkRpdk5vcm0oKEZJWFBfREJMKXRvdGFsQml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKGNvZGVjQml0cmF0ZSA8PCAyKSwgJmJpdHJhdGVGYWN0b3JfZSk7CisgICAgYml0cmF0ZUZhY3Rvcl9lICs9IDI7CisgIH0gZWxzZSB7CisgICAgYml0cmF0ZUZhY3Rvcl9tID0gRkwyRlhDT05TVF9EQkwoMS4wIC8gNC4wKTsKKyAgICBiaXRyYXRlRmFjdG9yX2UgPSAyOworICB9CiAKLSAgICBmcmFtZWR1cl9maXggPSBmRGl2Tm9ybShmcmFtZVNpemUsIHNhbXBsZUZyZXEpOworICBmcmFtZWR1cl9maXggPSBmRGl2Tm9ybShmcmFtZVNpemUsIHNhbXBsZUZyZXEpOwogCi0gICAgLyogVGhlIGxvbmdlciB0aGUgZnJhbWVzLCB0aGUgbW9yZSBvZnRlbiBzaG91bGQgdGhlIEZJWEZJWC0KLSAgICBjYXNlIHRyYW5zbWl0IDIgZW52ZWxvcGVzIGluc3RlYWQgb2YgMS4KLSAgICBGcmFtZSBkdXJhdGlvbnMgYmVsb3cgMTAgbXMgcHJvZHVjZSB0aGUgaGlnaGVzdCB0aHJlc2hvbGQKLSAgICBzbyB0aGF0IHByYWN0aWNhbGx5IGFsd2F5cyBvbmx5IDEgZW52IGlzIHRyYW5zbWl0dGVkLiAqLwotICAgIEZJWFBfREJMIHRtcCA9IGZyYW1lZHVyX2ZpeCAtIEZMMkZYQ09OU1RfREJMKDAuMDEwKTsKKyAgLyogVGhlIGxvbmdlciB0aGUgZnJhbWVzLCB0aGUgbW9yZSBvZnRlbiBzaG91bGQgdGhlIEZJWEZJWC0KKyAgY2FzZSB0cmFuc21pdCAyIGVudmVsb3BlcyBpbnN0ZWFkIG9mIDEuCisgIEZyYW1lIGR1cmF0aW9ucyBiZWxvdyAxMCBtcyBwcm9kdWNlIHRoZSBoaWdoZXN0IHRocmVzaG9sZAorICBzbyB0aGF0IHByYWN0aWNhbGx5IGFsd2F5cyBvbmx5IDEgZW52IGlzIHRyYW5zbWl0dGVkLiAqLworICBGSVhQX0RCTCB0bXAgPSBmcmFtZWR1cl9maXggLSBGTDJGWENPTlNUX0RCTCgwLjAxMCk7CiAKLSAgICB0bXAgPSBmaXhNYXgodG1wLCBGTDJGWENPTlNUX0RCTCgwLjAwMDEpKTsKLSAgICB0bXAgPSBmRGl2Tm9ybShGTDJGWENPTlNUX0RCTCgwLjAwMDA3NSksIGZQb3cyKHRtcCksICZ0bXBfZSk7CisgIHRtcCA9IGZpeE1heCh0bXAsIEZMMkZYQ09OU1RfREJMKDAuMDAwMSkpOworICB0bXAgPSBmRGl2Tm9ybShGTDJGWENPTlNUX0RCTCgwLjAwMDA3NSksIGZQb3cyKHRtcCksICZ0bXBfZSk7CiAKLSAgICBiaXRyYXRlRmFjdG9yX2UgPSAodG1wX2UgKyBiaXRyYXRlRmFjdG9yX2UpOworICBiaXRyYXRlRmFjdG9yX2UgPSAodG1wX2UgKyBiaXRyYXRlRmFjdG9yX2UpOwogCi0gIGlmKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKKyAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKICAgICBiaXRyYXRlRmFjdG9yX2UtLTsgLyogZGl2aWRlIGJ5IDIgKi8KICAgfQogCi0gICAgRkRLX0FTU0VSVChub19jb2xzIDw9IFFNRl9NQVhfVElNRV9TTE9UUyk7Ci0gICAgRkRLX0FTU0VSVChub19yb3dzIDw9IFFNRl9DSEFOTkVMUyk7CisgIEZES19BU1NFUlQobm9fY29scyA8PSAzMik7CisgIEZES19BU1NFUlQobm9fcm93cyA8PSA2NCk7CiAKLSAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5ub19jb2xzID0gbm9fY29sczsKLSAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT50cmFuX3RociA9IChGSVhQX0RCTCkoKHBhcmFtcy0+dHJhbl90aHIgPDwgKDMyLTI0LTEpKSAvIG5vX3Jvd3MpOwotICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fZmMgPSB0cmFuX2ZjOwotICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3Rocl9tID0gZk11bHQodG1wLCBiaXRyYXRlRmFjdG9yX20pOwotICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3Rocl9lID0gYml0cmF0ZUZhY3Rvcl9lOwotICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPm5vX3Jvd3MgPSBub19yb3dzOwotICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPm1vZGUgPSBwYXJhbXMtPnRyYW5fZGV0X21vZGU7Ci0gICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+cHJldkxvd0JhbmRFbmVyZ3kgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+bm9fY29scyA9IG5vX2NvbHM7CisgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fdGhyID0KKyAgICAgIChGSVhQX0RCTCkoKHBhcmFtcy0+dHJhbl90aHIgPDwgKDMyIC0gMjQgLSAxKSkgLyBub19yb3dzKTsKKyAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+dHJhbl9mYyA9IHRyYW5fZmM7CisgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3Rocl9tID0gZk11bHQodG1wLCBiaXRyYXRlRmFjdG9yX20pOworICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5zcGxpdF90aHJfZSA9IGJpdHJhdGVGYWN0b3JfZTsKKyAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+bm9fcm93cyA9IG5vX3Jvd3M7CisgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPm1vZGUgPSBwYXJhbXMtPnRyYW5fZGV0X21vZGU7CisgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnByZXZMb3dCYW5kRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgICByZXR1cm4gKDApOworICByZXR1cm4gKDApOwogfQogCi0KICNkZWZpbmUgRU5FUkdZX1NDQUxJTkdfU0laRSAzMgogCiBJTlQgRkRLc2JyRW5jX0luaXRTYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IoCi0gICAgICAgIEhBTkRMRV9GQVNUX1RSQU5fREVUIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLAotICAgICAgICBjb25zdCBJTlQgdGltZV9zbG90c19wZXJfZnJhbWUsCi0gICAgICAgIGNvbnN0IElOVCBiYW5kd2lkdGhfcW1mX3Nsb3QsCi0gICAgICAgIGNvbnN0IElOVCBub19xbWZfY2hhbm5lbHMsCi0gICAgICAgIGNvbnN0IElOVCBzYnJfcW1mXzFzdF9iYW5kCi0gICAgICAgICkKLXsKLQotICBpbnQgaSwgZTsKKyAgICBIQU5ETEVfRkFTVF9UUkFOX0RFVCBoX3NickZhc3RUcmFuc2llbnREZXRlY3RvciwKKyAgICBjb25zdCBJTlQgdGltZV9zbG90c19wZXJfZnJhbWUsIGNvbnN0IElOVCBiYW5kd2lkdGhfcW1mX3Nsb3QsCisgICAgY29uc3QgSU5UIG5vX3FtZl9jaGFubmVscywgY29uc3QgSU5UIHNicl9xbWZfMXN0X2JhbmQpIHsKKyAgaW50IGk7CiAgIGludCBidWZmX3NpemU7CiAgIEZJWFBfREJMIG15RXhwOwogICBGSVhQX0RCTCBteUV4cFNsb3Q7CkBAIC04MDksOSArNzk5LDEwIEBACiAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5sb29rYWhlYWQgPSBUUkFOX0RFVF9MT09LQUhFQUQ7CiAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5uVGltZVNsb3RzID0gdGltZV9zbG90c19wZXJfZnJhbWU7CiAKLSAgYnVmZl9zaXplID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPm5UaW1lU2xvdHMgKyBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+bG9va2FoZWFkOworICBidWZmX3NpemUgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+blRpbWVTbG90cyArCisgICAgICAgICAgICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5sb29rYWhlYWQ7CiAKLSAgZm9yKGk9MDsgaTwgYnVmZl9zaXplOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IGJ1ZmZfc2l6ZTsgaSsrKSB7CiAgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRlbHRhX2VuZXJneVtpXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5lbmVyZ3lfdGltZVNsb3RzW2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmxvd3Bhc3NfZW5lcmd5W2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CkBAIC04MTksNzcgKzgxMCw5MiBAQAogICB9CiAKICAgRkRLX0FTU0VSVChiYW5kd2lkdGhfcW1mX3Nsb3QgPiAwLmYpOwotICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQgID0gZk1pbihUUkFOX0RFVF9TVE9QX0ZSRVEvYmFuZHdpZHRoX3FtZl9zbG90LCBub19xbWZfY2hhbm5lbHMpOwotICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RhcnRCYW5kID0gZk1pbihzYnJfcW1mXzFzdF9iYW5kLCBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQgLSBUUkFOX0RFVF9NSU5fUU1GQkFORFMpOworICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQgPQorICAgICAgZk1pbihUUkFOX0RFVF9TVE9QX0ZSRVEgLyBiYW5kd2lkdGhfcW1mX3Nsb3QsIG5vX3FtZl9jaGFubmVscyk7CisgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdGFydEJhbmQgPQorICAgICAgZk1pbihzYnJfcW1mXzFzdF9iYW5kLAorICAgICAgICAgICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQgLSBUUkFOX0RFVF9NSU5fUU1GQkFORFMpOwogCiAgIEZES19BU1NFUlQoaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZCA8IG5vX3FtZl9jaGFubmVscyk7Ci0gIEZES19BU1NFUlQoaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZCA8IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZCk7CisgIEZES19BU1NFUlQoaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZCA8CisgICAgICAgICAgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0b3BCYW5kKTsKICAgRkRLX0FTU0VSVChoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RhcnRCYW5kID4gMSk7CiAgIEZES19BU1NFUlQoaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0b3BCYW5kID4gMSk7CiAKICAgLyogdGhlIGVuZXJneSB3ZWlnaHRpbmcgYW5kIGFkZGluZyB1cCBoYXMgYSBoZWFkcm9vbSBvZiA2IEJpdHMsCiAgICAgIHNvIHVwIHRvIDY0IGJhbmRzIGNhbiBiZSBhZGRlZCB3aXRob3V0IHBvdGVudGlhbCBvdmVyZmxvdy4gKi8KLSAgRkRLX0FTU0VSVChoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQgLSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RhcnRCYW5kIDw9IDY0KTsKKyAgRkRLX0FTU0VSVChoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQgLQorICAgICAgICAgICAgICAgICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RhcnRCYW5kIDw9CisgICAgICAgICAgICAgNjQpOwogCi0gIC8qIFFNRl9IUF9kQl9TTE9QRV9GSVggc2F5cyB0aGF0IHdlIHdhbnQgYSAyMCBkQiBwZXIgMTYga0h6IEhQIGZpbHRlci4KLSAgICAgVGhlIGZvbGxvd2luZyBsaW5lcyBtYXAgdGhpcyB0byB0aGUgUU1GIGJhbmR3aWR0aC4gKi8KLSAgI2RlZmluZSBFWFBfRSA3IC8qIFFNRl9DSEFOTkVMUyAoPTY0KSBtdWx0aXBsaWNhdGlvbnMgbWF4LCBtYXguIGFsbG93ZWQgc3VtIGlzIDAuNSAqLwotICBteUV4cCA9IGZNdWx0Tm9ybShRTUZfSFBfZEJkX1NMT1BFX0ZJWCwgKEZJWFBfREJMKWJhbmR3aWR0aF9xbWZfc2xvdCwgJmUpOwotICBteUV4cCA9IHNjYWxlVmFsdWVTYXR1cmF0ZShteUV4cCwgZSswK0RGUkFDVF9CSVRTLTEtRVhQX0UpOworLyogUU1GX0hQX2RCX1NMT1BFX0ZJWCBzYXlzIHRoYXQgd2Ugd2FudCBhIDIwIGRCIHBlciAxNiBrSHogSFAgZmlsdGVyLgorICAgVGhlIGZvbGxvd2luZyBsaW5lcyBtYXAgdGhpcyB0byB0aGUgUU1GIGJhbmR3aWR0aC4gKi8KKyNkZWZpbmUgRVhQX0UgNyAvKiA2NCAoPTY0KSBtdWx0aXBsaWNhdGlvbnMgbWF4LCBtYXguIGFsbG93ZWQgc3VtIGlzIDAuNSAqLworICBteUV4cCA9IGZNdWx0Tm9ybShRTUZfSFBfZEJkX1NMT1BFX0ZJWCwgMCwgKEZJWFBfREJMKWJhbmR3aWR0aF9xbWZfc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgREZSQUNUX0JJVFMgLSAxLCBFWFBfRSk7CiAgIG15RXhwU2xvdCA9IG15RXhwOwogCi0gIGZvcihpPTA7IGk8UU1GX0NIQU5ORUxTOyBpKyspeworICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewogICAgIC8qIENhbGN1bGF0ZSBkQmYgb3ZlciBhbGwgcW1mIGJhbmRzOgogICAgICAgIGRCZiA9ICgxMF4oMC4wMDIyNjZmLzEwKmJ3KHNsb3QpKSleKGJhbmQpID0KICAgICAgICAgICAgPSAyXihsb2cyKDEwKSowLjAwMjI2NmYvMTAqYncoc2xvdCkqYmFuZCkgPQogICAgICAgICAgICA9IDJeKDAuMDAwNzUyNzVmKmJ3KHNsb3QpKmJhbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gICAgRklYUF9EQkwgZEJmX207ICAgICAgICAvKiBkQmYgbWFudGlzc2EgICAgICAgICovCi0gICAgSU5UIGRCZl9lOyAgICAgICAgICAgICAvKiBkQmYgZXhwb25lbnQgICAgICAgICovCisgICAgRklYUF9EQkwgZEJmX207IC8qIGRCZiBtYW50aXNzYSAgICAgICAgKi8KKyAgICBJTlQgZEJmX2U7ICAgICAgLyogZEJmIGV4cG9uZW50ICAgICAgICAqLwogICAgIElOVCB0bXA7CiAKLSAgICBJTlQgZEJmX2ludDsgICAgICAgICAgIC8qIGRCZiBpbnRlZ2VyIHBhcnQgICAgKi8KLSAgICBGSVhQX0RCTCBkQmZfZnJhY3Q7ICAgIC8qIGRCZiBmcmFjdGlvbmFsIHBhcnQgKi8KKyAgICBJTlQgZEJmX2ludDsgICAgICAgIC8qIGRCZiBpbnRlZ2VyIHBhcnQgICAgKi8KKyAgICBGSVhQX0RCTCBkQmZfZnJhY3Q7IC8qIGRCZiBmcmFjdGlvbmFsIHBhcnQgKi8KIAogICAgIC8qIG15RXhwKihpKzEpID0gbXlFeHBfaW50IC0gbXlFeHBfZnJhY3QKICAgICAgICBteUV4cCooaSsxKSBpcyBzcGxpdCB1cCBoZXJlIGZvciBiZXR0ZXIgYWNjdXJhY3kgb2YgQ2FsY0ludkxkRGF0YSgpLAogICAgICAgIGZvciBpdHMgcmVzdWx0IGNhbiBiZSBzcGxpdCB1cCBpbnRvIGFuIGludGVnZXIgYW5kIGEgZnJhY3Rpb25hbCBwYXJ0ICovCiAKICAgICAvKiBSb3VuZCB1cCB0byBuZXh0IGludGVnZXIgKi8KLSAgICBGSVhQX0RCTCBteUV4cF9pbnQgICA9IChteUV4cFNsb3QgJiAoRklYUF9EQkwpMHhmZTAwMDAwMCkgKyAoRklYUF9EQkwpMHgwMjAwMDAwMDsKKyAgICBGSVhQX0RCTCBteUV4cF9pbnQgPQorICAgICAgICAobXlFeHBTbG90ICYgKEZJWFBfREJMKTB4ZmUwMDAwMDApICsgKEZJWFBfREJMKTB4MDIwMDAwMDA7CiAKICAgICAvKiBUaGlzIGlzIHRoZSBmcmFjdGlvbmFsIHBhcnQgdGhhdCBuZWVkcyB0byBiZSBzdWJzdHJhY3RlZCAqLwogICAgIEZJWFBfREJMIG15RXhwX2ZyYWN0ID0gbXlFeHBfaW50IC0gbXlFeHBTbG90OwogCiAgICAgLyogQ2FsYyBpbnRlZ2VyIHBhcnQgKi8KLSAgICBkQmZfaW50ICAgPSBDYWxjSW52TGREYXRhKG15RXhwX2ludCk7Ci0gICAgLyogVGhlIHJlc3VsdCBuZWVkcyB0byBiZSByZS1zY2FsZWQuIFRoZSBsZChteUV4cF9pbnQpIGhhZCBiZWVuIHNjYWxlZCBieSBFWFBfRSwKLSAgICAgICB0aGUgQ2FsY0ludkxkRGF0YSBleHBlY3RzIHRoZSBvcGVyYW5kIHRvIGJlIHNjYWxlZCBieSBMRF9EQVRBX1NISUZULgotICAgICAgIFRoZXJlZm9yZSwgdGhlIGNvcnJlY3RseSBzY2FsZWQgcmVzdWx0IGlzIGRCZl9pbnReKDJeKEVYUF9FLUxEX0RBVEFfU0hJRlQpKSwKLSAgICAgICB3aGljaCBpcyBkQmZfaW50XjIgKi8KLSAgICBkQmZfaW50ICAqPSBkQmZfaW50OworICAgIGRCZl9pbnQgPSBDYWxjSW52TGREYXRhKG15RXhwX2ludCk7CisgICAgLyogVGhlIHJlc3VsdCBuZWVkcyB0byBiZSByZS1zY2FsZWQuIFRoZSBsZChteUV4cF9pbnQpIGhhZCBiZWVuIHNjYWxlZCBieQorICAgICAgIEVYUF9FLCB0aGUgQ2FsY0ludkxkRGF0YSBleHBlY3RzIHRoZSBvcGVyYW5kIHRvIGJlIHNjYWxlZCBieQorICAgICAgIExEX0RBVEFfU0hJRlQuIFRoZXJlZm9yZSwgdGhlIGNvcnJlY3RseSBzY2FsZWQgcmVzdWx0IGlzCisgICAgICAgZEJmX2ludF4oMl4oRVhQX0UtTERfREFUQV9TSElGVCkpLCB3aGljaCBpcyBkQmZfaW50XjIgKi8KIAotICAgIC8qIENhbGMgZnJhY3Rpb25hbCBwYXJ0ICovCi0gICAgZEJmX2ZyYWN0ID0gQ2FsY0ludkxkRGF0YSgtbXlFeHBfZnJhY3QpOwotICAgIC8qIFRoZSByZXN1bHQgbmVlZHMgdG8gYmUgcmUtc2NhbGVkLiBUaGUgbGQobXlFeHBfZnJhY3QpIGhhZCBiZWVuIHNjYWxlZCBieSBFWFBfRSwKLSAgICAgICB0aGUgQ2FsY0ludkxkRGF0YSBleHBlY3RzIHRoZSBvcGVyYW5kIHRvIGJlIHNjYWxlZCBieSBMRF9EQVRBX1NISUZULgotICAgICAgIFRoZXJlZm9yZSwgdGhlIGNvcnJlY3RseSBzY2FsZWQgcmVzdWx0IGlzIGRCZl9mcmFjdF4oMl4oRVhQX0UtTERfREFUQV9TSElGVCkpLAotICAgICAgIHdoaWNoIGlzIGRCZl9mcmFjdF4yICovCi0gICAgZEJmX2ZyYWN0ID0gZk11bHROb3JtKGRCZl9mcmFjdCwgZEJmX2ZyYWN0LCAmdG1wKTsKKyAgICBpZiAoZEJmX2ludCA8PQorICAgICAgICA0NjM0MCkgeyAvKiBjb21wYXJlIHdpdGggbWF4aW11bSBhbGxvd2VkIHZhbHVlIGZvciBzaWduZWQgaW50ZWdlcgorICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWNhdGlvbiwgNDYzNDAgPQorICAgICAgICAgICAgICAgICAgICAoSU5UKWZsb29yKHNxcnQoKGRvdWJsZSkoKChVSU5UKTE8PChERlJBQ1RfQklUUy0xKSktMSkpKSAqLworICAgICAgZEJmX2ludCAqPSBkQmZfaW50OwogCi0gICAgLyogR2V0IHdvcnN0IGNhc2Ugc2NhbGluZyBvZiBtdWx0aXBsaWNhdGlvbiByZXN1bHQgKi8KLSAgICBkQmZfZSA9IChERlJBQ1RfQklUUy0xIC0gdG1wKSAtIENvdW50TGVhZGluZ0JpdHMoZEJmX2ludCk7CisgICAgICAvKiBDYWxjIGZyYWN0aW9uYWwgcGFydCAqLworICAgICAgZEJmX2ZyYWN0ID0gQ2FsY0ludkxkRGF0YSgtbXlFeHBfZnJhY3QpOworICAgICAgLyogVGhlIHJlc3VsdCBuZWVkcyB0byBiZSByZS1zY2FsZWQuIFRoZSBsZChteUV4cF9mcmFjdCkgaGFkIGJlZW4gc2NhbGVkCisgICAgICAgICBieSBFWFBfRSwgdGhlIENhbGNJbnZMZERhdGEgZXhwZWN0cyB0aGUgb3BlcmFuZCB0byBiZSBzY2FsZWQgYnkKKyAgICAgICAgIExEX0RBVEFfU0hJRlQuIFRoZXJlZm9yZSwgdGhlIGNvcnJlY3RseSBzY2FsZWQgcmVzdWx0IGlzCisgICAgICAgICBkQmZfZnJhY3ReKDJeKEVYUF9FLUxEX0RBVEFfU0hJRlQpKSwgd2hpY2ggaXMgZEJmX2ZyYWN0XjIgKi8KKyAgICAgIGRCZl9mcmFjdCA9IGZNdWx0Tm9ybShkQmZfZnJhY3QsIGRCZl9mcmFjdCwgJnRtcCk7CiAKLSAgICAvKiBOb3cgbXVsdGlwbHkgaW50ZWdlciB3aXRoIGZyYWN0aW9uYWwgcGFydCBvZiB0aGUgcmVzdWx0LCB0aHVzIHJlc3VsdGluZwotICAgICAgIGluIHRoZSBvdmVyYWxsIGFjY3VyYXRlIGZyYWN0aW9uYWwgcmVzdWx0ICovCi0gICAgZEJmX20gPSBmTXVsdE5vcm0oZEJmX2ludCwgZEJmX2ZyYWN0LCAmZSk7Ci0gICAgZEJmX20gPSBzY2FsZVZhbHVlU2F0dXJhdGUoZEJmX20sIGUrREZSQUNUX0JJVFMtMSt0bXAtZEJmX2UpOwotICAgIG15RXhwU2xvdCArPSBteUV4cDsKKyAgICAgIC8qIEdldCB3b3JzdCBjYXNlIHNjYWxpbmcgb2YgbXVsdGlwbGljYXRpb24gcmVzdWx0ICovCisgICAgICBkQmZfZSA9IChERlJBQ1RfQklUUyAtIDEgLSB0bXApIC0gQ291bnRMZWFkaW5nQml0cyhkQmZfaW50KTsKKworICAgICAgLyogTm93IG11bHRpcGx5IGludGVnZXIgd2l0aCBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlIHJlc3VsdCwgdGh1cyByZXN1bHRpbmcKKyAgICAgICAgIGluIHRoZSBvdmVyYWxsIGFjY3VyYXRlIGZyYWN0aW9uYWwgcmVzdWx0ICovCisgICAgICBkQmZfbSA9IGZNdWx0Tm9ybShkQmZfaW50LCBERlJBQ1RfQklUUyAtIDEsIGRCZl9mcmFjdCwgdG1wLCBkQmZfZSk7CisKKyAgICAgIG15RXhwU2xvdCArPSBteUV4cDsKKyAgICB9IGVsc2UgeworICAgICAgZEJmX20gPSAoRklYUF9EQkwpMDsKKyAgICAgIGRCZl9lID0gMDsKKyAgICB9CiAKICAgICAvKiBLZWVwIHRoZSByZXN1bHRzICovCiAgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRCZl9tW2ldID0gZEJmX207CiAgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRCZl9lW2ldID0gZEJmX2U7Ci0KICAgfQogCiAgIC8qIE1ha2Ugc3VyZSB0aGF0IGRCZiBpcyBncmVhdGVyIHRoYW4gMS4wIChiZWNhdXNlIGl0IHNob3VsZCBiZSBhIGhpZ2hwYXNzKSAqLwpAQCAtODk5LDg0ICs5MDUsOTEgQEAKIH0KIAogdm9pZCBGREtzYnJFbmNfZmFzdFRyYW5zaWVudERldGVjdCgKLSAgICAgICAgY29uc3QgSEFORExFX0ZBU1RfVFJBTl9ERVQgICAgICAgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgICAqY29uc3QgKkVuZXJnaWVzLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICAgKmNvbnN0ICBzY2FsZUVuZXJnaWVzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAqY29uc3QgIHRyYW5fdmVjdG9yCi0gICAgICAgICkKLXsKKyAgICBjb25zdCBIQU5ETEVfRkFTVF9UUkFOX0RFVCBoX3NickZhc3RUcmFuc2llbnREZXRlY3RvciwKKyAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgKkVuZXJnaWVzLCBjb25zdCBpbnQgKmNvbnN0IHNjYWxlRW5lcmdpZXMsCisgICAgY29uc3QgSU5UIFlCdWZmZXJXcml0ZU9mZnNldCwgVUNIQVIgKmNvbnN0IHRyYW5fdmVjdG9yKSB7CiAgIGludCB0aW1lU2xvdCwgYmFuZDsKIAotICBGSVhQX0RCTCBtYXhfZGVsdGFfZW5lcmd5OyAgIC8qIGhlbHBlciB0byBzdG9yZSBtYXhpbXVtIGVuZXJneSByYXRpbyAgICAgICAgICAqLwotICBpbnQgbWF4X2RlbHRhX2VuZXJneV9zY2FsZTsgIC8qIGhlbHBlciB0byBzdG9yZSBzY2FsZSBvZiBtYXhpbXVtIGVuZXJneSByYXRpbyAqLwotICBpbnQgaW5kX21heCAgICAgICAgICAgICA9IDA7IC8qIGhlbHBlciB0byBzdG9yZSBpbmRleCBvZiBtYXhpbXVtIGVuZXJneSByYXRpbyAqLwotICBpbnQgaXNUcmFuc2llbnRJbkZyYW1lICA9IDA7CisgIEZJWFBfREJMIG1heF9kZWx0YV9lbmVyZ3k7IC8qIGhlbHBlciB0byBzdG9yZSBtYXhpbXVtIGVuZXJneSByYXRpbyAgICAgICAgICAqLworICBpbnQgbWF4X2RlbHRhX2VuZXJneV9zY2FsZTsgLyogaGVscGVyIHRvIHN0b3JlIHNjYWxlIG9mIG1heGltdW0gZW5lcmd5IHJhdGlvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGluZF9tYXggPSAwOyAvKiBoZWxwZXIgdG8gc3RvcmUgaW5kZXggb2YgbWF4aW11bSBlbmVyZ3kgcmF0aW8gKi8KKyAgaW50IGlzVHJhbnNpZW50SW5GcmFtZSA9IDA7CiAKLSAgY29uc3QgaW50IG5UaW1lU2xvdHMgICAgICAgICA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5uVGltZVNsb3RzOwotICBjb25zdCBpbnQgbG9va2FoZWFkICAgICAgICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmxvb2thaGVhZDsKLSAgY29uc3QgaW50IHN0YXJ0QmFuZCAgICAgICAgICA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdGFydEJhbmQ7Ci0gIGNvbnN0IGludCBzdG9wQmFuZCAgICAgICAgICAgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQ7CisgIGNvbnN0IGludCBuVGltZVNsb3RzID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPm5UaW1lU2xvdHM7CisgIGNvbnN0IGludCBsb29rYWhlYWQgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+bG9va2FoZWFkOworICBjb25zdCBpbnQgc3RhcnRCYW5kID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZDsKKyAgY29uc3QgaW50IHN0b3BCYW5kID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0b3BCYW5kOwogCi0gIGludCAqIHRyYW5zaWVudENhbmRpZGF0ZXMgICAgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+dHJhbnNpZW50Q2FuZGlkYXRlczsKKyAgaW50ICp0cmFuc2llbnRDYW5kaWRhdGVzID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5zaWVudENhbmRpZGF0ZXM7CiAKLSAgRklYUF9EQkwgKiBlbmVyZ3lfdGltZVNsb3RzICA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5lbmVyZ3lfdGltZVNsb3RzOwotICBpbnQgKiBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmVuZXJneV90aW1lU2xvdHNfc2NhbGU7CisgIEZJWFBfREJMICplbmVyZ3lfdGltZVNsb3RzID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmVuZXJneV90aW1lU2xvdHM7CisgIGludCAqZW5lcmd5X3RpbWVTbG90c19zY2FsZSA9CisgICAgICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZW5lcmd5X3RpbWVTbG90c19zY2FsZTsKIAotICBGSVhQX0RCTCAqIGRlbHRhX2VuZXJneSAgICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRlbHRhX2VuZXJneTsKLSAgaW50ICogZGVsdGFfZW5lcmd5X3NjYWxlICAgICA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5kZWx0YV9lbmVyZ3lfc2NhbGU7CisgIEZJWFBfREJMICpkZWx0YV9lbmVyZ3kgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZGVsdGFfZW5lcmd5OworICBpbnQgKmRlbHRhX2VuZXJneV9zY2FsZSA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5kZWx0YV9lbmVyZ3lfc2NhbGU7CiAKLSAgY29uc3QgRklYUF9EQkwgdGhyICAgICAgICAgICA9IFRSQU5fREVUX1RIUlNITEQ7Ci0gIGNvbnN0IElOVCAgICAgIHRocl9zY2FsZSAgICAgPSBUUkFOX0RFVF9USFJTSExEX1NDQUxFOworICBjb25zdCBGSVhQX0RCTCB0aHIgPSBUUkFOX0RFVF9USFJTSExEOworICBjb25zdCBJTlQgdGhyX3NjYWxlID0gVFJBTl9ERVRfVEhSU0hMRF9TQ0FMRTsKIAogICAvKnJlc2V0IHRyYW5zaWVudCBpbmZvKi8KICAgdHJhbl92ZWN0b3JbMl0gPSAwOwogCiAgIC8qIHJlc2V0IHRyYW5zaWVudCBjYW5kaWRhdGVzICovCi0gIEZES21lbWNsZWFyKHRyYW5zaWVudENhbmRpZGF0ZXMrbG9va2FoZWFkLCBuVGltZVNsb3RzKnNpemVvZihpbnQpKTsKKyAgRkRLbWVtY2xlYXIodHJhbnNpZW50Q2FuZGlkYXRlcyArIGxvb2thaGVhZCwgblRpbWVTbG90cyAqIHNpemVvZihpbnQpKTsKIAotICBmb3IodGltZVNsb3QgPSBsb29rYWhlYWQ7IHRpbWVTbG90IDwgblRpbWVTbG90cyArIGxvb2thaGVhZDsgdGltZVNsb3QrKykgeworICBmb3IgKHRpbWVTbG90ID0gbG9va2FoZWFkOyB0aW1lU2xvdCA8IG5UaW1lU2xvdHMgKyBsb29rYWhlYWQ7IHRpbWVTbG90KyspIHsKICAgICBpbnQgaSwgbm9ybTsKLSAgICBGSVhQX0RCTCB0bXBFICAgICAgICAgICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgIGludCBoZWFkcm9vbUVuU2xvdCAgICAgID0gREZSQUNUX0JJVFMtMTsKKyAgICBGSVhQX0RCTCB0bXBFID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgaW50IGhlYWRyb29tRW5TbG90ID0gREZSQUNUX0JJVFMgLSAxOwogCiAgICAgRklYUF9EQkwgc21hbGxOUkcgPSBGTDJGWENPTlNUX0RCTCgxZS0yZik7CiAgICAgRklYUF9EQkwgZGVub21pbmF0b3I7CiAgICAgSU5UIGRlbm9taW5hdG9yX3NjYWxlOwogCiAgICAgLyogZGV0ZXJtaW5lIG1pbmltdW0gaGVhZHJvb20gb2YgZW5lcmd5IHZhbHVlcyBmb3IgdGhpcyB0aW1lc2xvdCAqLwotICAgIGZvcihiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKykgewotICAgICAgaW50IHRtcF9oZWFkcm9vbSA9IGZOb3JteihFbmVyZ2llc1t0aW1lU2xvdF1bYmFuZF0pLTE7Ci0gICAgICBpZih0bXBfaGVhZHJvb20gPCBoZWFkcm9vbUVuU2xvdCl7CisgICAgZm9yIChiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKykgeworICAgICAgaW50IHRtcF9oZWFkcm9vbSA9IGZOb3JteihFbmVyZ2llc1t0aW1lU2xvdF1bYmFuZF0pIC0gMTsKKyAgICAgIGlmICh0bXBfaGVhZHJvb20gPCBoZWFkcm9vbUVuU2xvdCkgewogICAgICAgICBoZWFkcm9vbUVuU2xvdCA9IHRtcF9oZWFkcm9vbTsKICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IoaSA9IDAsIGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBzdG9wQmFuZDsgYmFuZCsrLCBpKyspIHsKKyAgICBmb3IgKGkgPSAwLCBiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKywgaSsrKSB7CiAgICAgICAvKiBlbmVyZ3kgaXMgd2VpZ2h0ZWQgYnkgd2VpZ2h0aW5nZmFjdG9yIHN0b3JlZCBpbiBkQmZfbSBhcnJheSAqLwogICAgICAgLyogZEJmX20gaW5kZXggcnVucyBmcm9tIDAgdG8gc3RvcEJhbmQtc3RhcnRiYW5kICAgICAgICAgICAgICAgKi8KICAgICAgIC8qIGVuZXJneSBzaGlmdGVkIGJ5IGNhbGN1bGF0ZWQgaGVhZHJvb20gZm9yIG1heGltdW0gcHJlY2lzaW9uICovCi0gICAgICBGSVhQX0RCTCB3ZWlnaHRlZEVuZXJneSA9IGZNdWx0KEVuZXJnaWVzW3RpbWVTbG90XVtiYW5kXTw8aGVhZHJvb21FblNsb3QsIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5kQmZfbVtpXSk7CisgICAgICBGSVhQX0RCTCB3ZWlnaHRlZEVuZXJneSA9CisgICAgICAgICAgZk11bHQoRW5lcmdpZXNbdGltZVNsb3RdW2JhbmRdIDw8IGhlYWRyb29tRW5TbG90LAorICAgICAgICAgICAgICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5kQmZfbVtpXSk7CiAKICAgICAgIC8qIGVuZXJneSBpcyBhZGRlZCB1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAvKiBzaGlmdCBieSA2IHRvIGhhdmUgYSBoZWFkcm9vbSBmb3IgbWF4aW11bSA2NCBhZGRpdGlvbnMgICAgICAgICAgICAqLwogICAgICAgLyogc2hpZnQgYnkgZEJmX2UgdG8gaGFuZGxlIHdlaWdodGluZyBmYWN0b3IgZGVwZW5kZW50IHNjYWxlIGZhY3RvcnMgKi8KLSAgICAgIHRtcEUgKz0gd2VpZ2h0ZWRFbmVyZ3kgPj4gKDYgKyAoMTAgLSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZEJmX2VbaV0pKTsKKyAgICAgIHRtcEUgKz0KKyAgICAgICAgICB3ZWlnaHRlZEVuZXJneSA+PiAoNiArICgxMCAtIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5kQmZfZVtpXSkpOwogICAgIH0KIAogICAgIC8qIHN0b3JlIGNhbGN1bGF0ZWQgZW5lcmd5IGZvciB0aW1lc2xvdCAqLwogICAgIGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3RdID0gdG1wRTsKIAotICAgIC8qIGNhbGN1bGF0ZSBvdmVyYWxsIHNjYWxlIGZhY3RvciBmb3IgZW5lcmd5IG9mIHRoaXMgdGltZXNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiA9ICAgb3JpZ2luYWwgc2NhbGUgZmFjdG9yIG9mIGVuZXJnaWVzICgtc2NhbGVFbmVyZ2llc1swXSsyKlFNRl9TQ0FMRV9PRkZTRVQgb3IgLXNjYWxlRW5lcmdpZXNbMV0rMipRTUZfU0NBTEVfT0ZGU0VUICAgICovCi0gICAgLyogICAgIGRlcGVuZGluZyBvbiBZQnVmZmVyV3JpdGVPZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgKyB3ZWlnaHRpbmcgZmFjdG9yIHNjYWxlICAgICAgICAgICAgKDEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICsgYWRkaW5nIHVwIHNjYWxlIGZhY3RvciAgICAgICAgICAgICggNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAtIGhlYWRyb29tIG9mIGVuZXJneSB2YWx1ZSAgICAgICAgICAoaGVhZHJvb21FblNsb3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmKHRpbWVTbG90IDwgWUJ1ZmZlcldyaXRlT2Zmc2V0KXsKLSAgICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdID0gKC1zY2FsZUVuZXJnaWVzWzBdKzIqUU1GX1NDQUxFX09GRlNFVCkgKyAoMTArNikgLSBoZWFkcm9vbUVuU2xvdDsKKyAgICAvKiBjYWxjdWxhdGUgb3ZlcmFsbCBzY2FsZSBmYWN0b3IgZm9yIGVuZXJneSBvZiB0aGlzIHRpbWVzbG90ICovCisgICAgLyogPSAgIG9yaWdpbmFsIHNjYWxlIGZhY3RvciBvZiBlbmVyZ2llcworICAgICAqICgtc2NhbGVFbmVyZ2llc1swXSsyKlFNRl9TQ0FMRV9PRkZTRVQgb3IKKyAgICAgKiAtc2NhbGVFbmVyZ2llc1sxXSsyKlFNRl9TQ0FMRV9PRkZTRVQgICAgKi8KKyAgICAvKiAgICAgZGVwZW5kaW5nIG9uIFlCdWZmZXJXcml0ZU9mZnNldCkgKi8KKyAgICAvKiAgICsgd2VpZ2h0aW5nIGZhY3RvciBzY2FsZSAgICAgICAgICAgICgxMCkgKi8KKyAgICAvKiAgICsgYWRkaW5nIHVwIHNjYWxlIGZhY3RvciAgICAgICAgICAgICggNikgKi8KKyAgICAvKiAgIC0gaGVhZHJvb20gb2YgZW5lcmd5IHZhbHVlICAgICAgICAgIChoZWFkcm9vbUVuU2xvdCkgKi8KKyAgICBpZiAodGltZVNsb3QgPCBZQnVmZmVyV3JpdGVPZmZzZXQpIHsKKyAgICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdID0KKyAgICAgICAgICAoLXNjYWxlRW5lcmdpZXNbMF0gKyAyICogUU1GX1NDQUxFX09GRlNFVCkgKyAoMTAgKyA2KSAtCisgICAgICAgICAgaGVhZHJvb21FblNsb3Q7CiAgICAgfSBlbHNlIHsKLSAgICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdID0gKC1zY2FsZUVuZXJnaWVzWzFdKzIqUU1GX1NDQUxFX09GRlNFVCkgKyAoMTArNikgLSBoZWFkcm9vbUVuU2xvdDsKKyAgICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdID0KKyAgICAgICAgICAoLXNjYWxlRW5lcmdpZXNbMV0gKyAyICogUU1GX1NDQUxFX09GRlNFVCkgKyAoMTAgKyA2KSAtCisgICAgICAgICAgaGVhZHJvb21FblNsb3Q7CiAgICAgfQogCiAgICAgLyogQWRkIGEgc21hbGwgZW5lcmd5IHRvIHRoZSBkZW5vbWluYXRvciwgdGh1cyBtYWtpbmcgdGhlIHRyYW5zaWVudApAQCAtOTg0LDE5ICs5OTcsMjEgQEAKICAgICAgICBzaWxlbnQgb25lcyBub3QuICovCiAKICAgICAvKiBtYWtlIHN1cmUgdGhhdCBzbWFsbE5SRyBkb2VzIG5vdCBvdmVyZmxvdyAqLwotICAgIGlmICggLWVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3QtMV0gKyAxID4gNSApCi0gICAgeworICAgIGlmICgtZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdCAtIDFdICsgMSA+IDUpIHsKICAgICAgIGRlbm9taW5hdG9yID0gc21hbGxOUkc7CiAgICAgICBkZW5vbWluYXRvcl9zY2FsZSA9IDA7CiAgICAgfSBlbHNlIHsKICAgICAgIC8qIExlYXZlIGFuIGFkZGl0aW9uYWwgaGVhZHJvb20gb2YgMSBiaXQgZm9yIHRoaXMgYWRkaXRpb24uICovCi0gICAgICBzbWFsbE5SRyA9IHNjYWxlVmFsdWUoc21hbGxOUkcsIC0oZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdC0xXSArIDEpKTsKLSAgICAgIGRlbm9taW5hdG9yID0gKGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3QtMV0+PjEpICsgc21hbGxOUkc7Ci0gICAgICBkZW5vbWluYXRvcl9zY2FsZSA9IGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3QtMV0rMTsKKyAgICAgIHNtYWxsTlJHID0KKyAgICAgICAgICBzY2FsZVZhbHVlKHNtYWxsTlJHLCAtKGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3QgLSAxXSArIDEpKTsKKyAgICAgIGRlbm9taW5hdG9yID0gKGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3QgLSAxXSA+PiAxKSArIHNtYWxsTlJHOworICAgICAgZGVub21pbmF0b3Jfc2NhbGUgPSBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90IC0gMV0gKyAxOwogICAgIH0KIAotICAgIGRlbHRhX2VuZXJneVt0aW1lU2xvdF0gPSBmRGl2Tm9ybShlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90XSwgZGVub21pbmF0b3IsICZub3JtKTsKLSAgICBkZWx0YV9lbmVyZ3lfc2NhbGVbdGltZVNsb3RdID0gZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0gLSBkZW5vbWluYXRvcl9zY2FsZSArIG5vcm07CisgICAgZGVsdGFfZW5lcmd5W3RpbWVTbG90XSA9CisgICAgICAgIGZEaXZOb3JtKGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3RdLCBkZW5vbWluYXRvciwgJm5vcm0pOworICAgIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0gPQorICAgICAgICBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90XSAtIGRlbm9taW5hdG9yX3NjYWxlICsgbm9ybTsKICAgfQogCiAgIC8qZ2V0IHRyYW5zaWVudCBjYW5kaWRhdGVzKi8KQEAgLTEwMDgsMTUgKzEwMjMsMjEgQEAKICAgICAgbGFzdCBvciB0aGUgb25lIGJlZm9yZSB0aGUgbGFzdCBzbG90LCBpdCBpcyBtYXJrZWQgYXMgYSB0cmFuc2llbnQuKi8KIAogICBGREtfQVNTRVJUKGxvb2thaGVhZCA+PSAyKTsKLSAgZm9yKHRpbWVTbG90ID0gbG9va2FoZWFkOyB0aW1lU2xvdCA8IG5UaW1lU2xvdHMgKyBsb29rYWhlYWQ7IHRpbWVTbG90KyspIHsKLSAgICBGSVhQX0RCTCBlbmVyZ3lfY3VyX3Nsb3Rfd2VpZ2h0ZWQgPSBmTXVsdChlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90XSxGTDJGWENPTlNUX0RCTCgxLjBmLzEuNGYpKTsKLSAgICBpZiggIWZJc0xlc3NUaGFuKGRlbHRhX2VuZXJneVt0aW1lU2xvdF0sIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0sIHRociwgdGhyX3NjYWxlKSAmJgotICAgICAgICAoICgodHJhbnNpZW50Q2FuZGlkYXRlc1t0aW1lU2xvdC0yXT09MCkgJiYgKHRyYW5zaWVudENhbmRpZGF0ZXNbdGltZVNsb3QtMV09PTApKSB8fAotICAgICAgICAgICFmSXNMZXNzVGhhbihlbmVyZ3lfY3VyX3Nsb3Rfd2VpZ2h0ZWQsIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdLCBlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90LTFdLCBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90LTFdICkgfHwKLSAgICAgICAgICAhZklzTGVzc1RoYW4oZW5lcmd5X2N1cl9zbG90X3dlaWdodGVkLCBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90XSwgZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdC0yXSwgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdC0yXSApCi0gICAgICAgICkKLSAgICAgICkKLXsKKyAgZm9yICh0aW1lU2xvdCA9IGxvb2thaGVhZDsgdGltZVNsb3QgPCBuVGltZVNsb3RzICsgbG9va2FoZWFkOyB0aW1lU2xvdCsrKSB7CisgICAgRklYUF9EQkwgZW5lcmd5X2N1cl9zbG90X3dlaWdodGVkID0KKyAgICAgICAgZk11bHQoZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdF0sIEZMMkZYQ09OU1RfREJMKDEuMGYgLyAxLjRmKSk7CisgICAgaWYgKCFmSXNMZXNzVGhhbihkZWx0YV9lbmVyZ3lbdGltZVNsb3RdLCBkZWx0YV9lbmVyZ3lfc2NhbGVbdGltZVNsb3RdLCB0aHIsCisgICAgICAgICAgICAgICAgICAgICB0aHJfc2NhbGUpICYmCisgICAgICAgICgoKHRyYW5zaWVudENhbmRpZGF0ZXNbdGltZVNsb3QgLSAyXSA9PSAwKSAmJgorICAgICAgICAgICh0cmFuc2llbnRDYW5kaWRhdGVzW3RpbWVTbG90IC0gMV0gPT0gMCkpIHx8CisgICAgICAgICAhZklzTGVzc1RoYW4oZW5lcmd5X2N1cl9zbG90X3dlaWdodGVkLAorICAgICAgICAgICAgICAgICAgICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdLAorICAgICAgICAgICAgICAgICAgICAgIGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3QgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90IC0gMV0pIHx8CisgICAgICAgICAhZklzTGVzc1RoYW4oZW5lcmd5X2N1cl9zbG90X3dlaWdodGVkLAorICAgICAgICAgICAgICAgICAgICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdLAorICAgICAgICAgICAgICAgICAgICAgIGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3QgLSAyXSwKKyAgICAgICAgICAgICAgICAgICAgICBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90IC0gMl0pKSkgewogICAgICAgLyogaW4gY2FzZSBvZiBzdHJvbmcgdHJhbnNpZW50cywgc3Vic2VxdWVudAogICAgICAgICogcW1mIHNsb3RzIG1pZ2h0IGJlIHJlY29nbml6ZWQgYXMgdHJhbnNpZW50cy4gKi8KICAgICAgIHRyYW5zaWVudENhbmRpZGF0ZXNbdGltZVNsb3RdID0gMTsKQEAgLTEwMjQsMjIgKzEwNDUsMjQgQEAKICAgfQogCiAgIC8qZ2V0IHRyYW5zaWVudCB3aXRoIG1heCBlbmVyZ3kqLwotICBtYXhfZGVsdGFfZW5lcmd5ICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgbWF4X2RlbHRhX2VuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBtYXhfZGVsdGFfZW5lcmd5X3NjYWxlID0gMDsKICAgaW5kX21heCA9IDA7CiAgIGlzVHJhbnNpZW50SW5GcmFtZSA9IDA7Ci0gIGZvcih0aW1lU2xvdCA9IDA7IHRpbWVTbG90IDwgblRpbWVTbG90czsgdGltZVNsb3QrKykgeworICBmb3IgKHRpbWVTbG90ID0gMDsgdGltZVNsb3QgPCBuVGltZVNsb3RzOyB0aW1lU2xvdCsrKSB7CiAgICAgaW50IHNjYWxlID0gZk1heChkZWx0YV9lbmVyZ3lfc2NhbGVbdGltZVNsb3RdLCBtYXhfZGVsdGFfZW5lcmd5X3NjYWxlKTsKLSAgICBpZih0cmFuc2llbnRDYW5kaWRhdGVzW3RpbWVTbG90XSAmJiAoIChkZWx0YV9lbmVyZ3lbdGltZVNsb3RdID4+IChzY2FsZSAtIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0pKSA+IChtYXhfZGVsdGFfZW5lcmd5ID4+IChzY2FsZSAtIG1heF9kZWx0YV9lbmVyZ3lfc2NhbGUpKSApICkgewotICAgICAgbWF4X2RlbHRhX2VuZXJneSAgID0gZGVsdGFfZW5lcmd5W3RpbWVTbG90XTsKKyAgICBpZiAodHJhbnNpZW50Q2FuZGlkYXRlc1t0aW1lU2xvdF0gJiYKKyAgICAgICAgKChkZWx0YV9lbmVyZ3lbdGltZVNsb3RdID4+IChzY2FsZSAtIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0pKSA+CisgICAgICAgICAobWF4X2RlbHRhX2VuZXJneSA+PiAoc2NhbGUgLSBtYXhfZGVsdGFfZW5lcmd5X3NjYWxlKSkpKSB7CisgICAgICBtYXhfZGVsdGFfZW5lcmd5ID0gZGVsdGFfZW5lcmd5W3RpbWVTbG90XTsKICAgICAgIG1heF9kZWx0YV9lbmVyZ3lfc2NhbGUgPSBzY2FsZTsKLSAgICAgIGluZF9tYXggICAgICAgICAgICA9IHRpbWVTbG90OworICAgICAgaW5kX21heCA9IHRpbWVTbG90OwogICAgICAgaXNUcmFuc2llbnRJbkZyYW1lID0gMTsKICAgICB9CiAgIH0KIAogICAvKmZyb20gYWxsIHRyYW5zaWVudCBjYW5kaWRhdGVzIHRha2UgdGhlIG9uZSB3aXRoIHRoZSBiaWdnZXN0IGVuZXJneSovCi0gIGlmKGlzVHJhbnNpZW50SW5GcmFtZSkgeworICBpZiAoaXNUcmFuc2llbnRJbkZyYW1lKSB7CiAgICAgdHJhbl92ZWN0b3JbMF0gPSBpbmRfbWF4OwogICAgIHRyYW5fdmVjdG9yWzFdID0gMTsKICAgfSBlbHNlIHsKQEAgLTEwNDgsMjIgKzEwNzEsMjIgQEAKICAgfQogCiAgIC8qY2hlY2sgZm9yIHRyYW5zaWVudHMgaW4gbG9va2FoZWFkKi8KLSAgZm9yKHRpbWVTbG90ID0gblRpbWVTbG90czsgdGltZVNsb3QgPCBuVGltZVNsb3RzICsgbG9va2FoZWFkOyB0aW1lU2xvdCsrKSB7Ci0gICAgaWYodHJhbnNpZW50Q2FuZGlkYXRlc1t0aW1lU2xvdF0pIHsKKyAgZm9yICh0aW1lU2xvdCA9IG5UaW1lU2xvdHM7IHRpbWVTbG90IDwgblRpbWVTbG90cyArIGxvb2thaGVhZDsgdGltZVNsb3QrKykgeworICAgIGlmICh0cmFuc2llbnRDYW5kaWRhdGVzW3RpbWVTbG90XSkgewogICAgICAgdHJhbl92ZWN0b3JbMl0gPSAxOwogICAgIH0KICAgfQogCiAgIC8qdXBkYXRlIGJ1ZmZlcnMqLwotICBmb3IodGltZVNsb3QgPSAwOyB0aW1lU2xvdCA8IGxvb2thaGVhZDsgdGltZVNsb3QrKykgeworICBmb3IgKHRpbWVTbG90ID0gMDsgdGltZVNsb3QgPCBsb29rYWhlYWQ7IHRpbWVTbG90KyspIHsKICAgICB0cmFuc2llbnRDYW5kaWRhdGVzW3RpbWVTbG90XSA9IHRyYW5zaWVudENhbmRpZGF0ZXNbblRpbWVTbG90cyArIHRpbWVTbG90XTsKIAogICAgIC8qIGZpeHBvaW50IHN0dWZmICovCi0gICAgZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdF0gICAgPSBlbmVyZ3lfdGltZVNsb3RzW25UaW1lU2xvdHMgKyB0aW1lU2xvdF07Ci0gICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0gID0gZW5lcmd5X3RpbWVTbG90c19zY2FsZVtuVGltZVNsb3RzICsgdGltZVNsb3RdOworICAgIGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3RdID0gZW5lcmd5X3RpbWVTbG90c1tuVGltZVNsb3RzICsgdGltZVNsb3RdOworICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdID0KKyAgICAgICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVtuVGltZVNsb3RzICsgdGltZVNsb3RdOwogCi0gICAgZGVsdGFfZW5lcmd5W3RpbWVTbG90XSAgICAgPSBkZWx0YV9lbmVyZ3lbblRpbWVTbG90cyArIHRpbWVTbG90XTsKLSAgICBkZWx0YV9lbmVyZ3lfc2NhbGVbdGltZVNsb3RdICAgPSBkZWx0YV9lbmVyZ3lfc2NhbGVbblRpbWVTbG90cyArIHRpbWVTbG90XTsKKyAgICBkZWx0YV9lbmVyZ3lbdGltZVNsb3RdID0gZGVsdGFfZW5lcmd5W25UaW1lU2xvdHMgKyB0aW1lU2xvdF07CisgICAgZGVsdGFfZW5lcmd5X3NjYWxlW3RpbWVTbG90XSA9IGRlbHRhX2VuZXJneV9zY2FsZVtuVGltZVNsb3RzICsgdGltZVNsb3RdOwogICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvdHJhbl9kZXQuaCBiL2xpYlNCUmVuYy9zcmMvdHJhbl9kZXQuaAppbmRleCA2ZmUxMDIzLi5kMTBhN2RiIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3RyYW5fZGV0LmgKKysrIGIvbGliU0JSZW5jL3NyYy90cmFuX2RldC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDEyNSArOTAsMTAyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgVHJhbnNpZW50IGRldGVjdG9yIHByb3RvdHlwZXMgIAorICBcYnJpZWYgIFRyYW5zaWVudCBkZXRlY3RvciBwcm90b3R5cGVzICRSZXZpc2lvbjogOTUxMTEgJAogKi8KLSNpZm5kZWYgX19UUkFOX0RFVF9ICi0jZGVmaW5lIF9fVFJBTl9ERVRfSAorI2lmbmRlZiBUUkFOX0RFVF9ICisjZGVmaW5lIFRSQU5fREVUX0gKIAogI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCiAjaW5jbHVkZSAic2JyX2RlZi5oIgogCi10eXBlZGVmIHN0cnVjdAotewotICBGSVhQX0RCTCAgdHJhbnNpZW50c1tRTUZfTUFYX1RJTUVfU0xPVFMrKFFNRl9NQVhfVElNRV9TTE9UUy8yKV07Ci0gIEZJWFBfREJMICB0aHJlc2hvbGRzW1FNRl9DSEFOTkVMU107Ci0gIEZJWFBfREJMICB0cmFuX3RocjsgICAgICAgICAgICAgIC8qIE1hc3RlciB0aHJlc2hvbGQgZm9yIHRyYW5zaWVudCBzaWduYWxzICovCi0gIEZJWFBfREJMICBzcGxpdF90aHJfbTsgICAgICAgICAgIC8qIFRocmVzaG9sZCBmb3Igc3BsaXR0aW5nIEZJWEZJWC1mcmFtZXMgaW50byAyIGVudiAqLwotICBJTlQgICAgICAgc3BsaXRfdGhyX2U7ICAgICAgICAgICAvKiBTY2FsZSBmb3Igc3BsaXR0aW5nIHRocmVzaG9sZCAqLwotICBGSVhQX0RCTCAgcHJldkxvd0JhbmRFbmVyZ3k7ICAgICAvKiBFbmVyZ3kgb2YgbG93IGJhbmQgKi8KLSAgRklYUF9EQkwgIHByZXZIaWdoQmFuZEVuZXJneTsgICAgLyogRW5lcmd5IG9mIGhpZ2ggYmFuZCAqLwotICBJTlQgICAgdHJhbl9mYzsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgbG93YmFuZCBzdWJiYW5kcyB0byBkaXNjYXJkICAqLwotICBJTlQgICAgbm9fY29sczsKLSAgSU5UICAgIG5vX3Jvd3M7Ci0gIElOVCAgICBtb2RlOwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCB0cmFuc2llbnRzWzMyICsgKDMyIC8gMildOworICBGSVhQX0RCTCB0aHJlc2hvbGRzWzY0XTsKKyAgRklYUF9EQkwgdHJhbl90aHI7ICAgIC8qIE1hc3RlciB0aHJlc2hvbGQgZm9yIHRyYW5zaWVudCBzaWduYWxzICovCisgIEZJWFBfREJMIHNwbGl0X3Rocl9tOyAvKiBUaHJlc2hvbGQgZm9yIHNwbGl0dGluZyBGSVhGSVgtZnJhbWVzIGludG8gMiBlbnYgKi8KKyAgSU5UIHNwbGl0X3Rocl9lOyAgICAgIC8qIFNjYWxlIGZvciBzcGxpdHRpbmcgdGhyZXNob2xkICovCisgIEZJWFBfREJMIHByZXZMb3dCYW5kRW5lcmd5OyAgLyogRW5lcmd5IG9mIGxvdyBiYW5kICovCisgIEZJWFBfREJMIHByZXZIaWdoQmFuZEVuZXJneTsgLyogRW5lcmd5IG9mIGhpZ2ggYmFuZCAqLworICBJTlQgdHJhbl9mYzsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBsb3diYW5kIHN1YmJhbmRzIHRvIGRpc2NhcmQgICovCisgIElOVCBub19jb2xzOworICBJTlQgbm9fcm93czsKKyAgSU5UIG1vZGU7CiAKLSAgaW50ICAgIGZyYW1lU2hpZnQ7Ci0gIGludCAgICB0cmFuX29mZjsgICAgICAgICAgICAgICAgIC8qIE9mZnNldCBmb3IgcmVhZGluZyBlbmVyZ3kgdmFsdWVzLiAqLwotfQotU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUjsKLQorICBpbnQgZnJhbWVTaGlmdDsKKyAgaW50IHRyYW5fb2ZmOyAvKiBPZmZzZXQgZm9yIHJlYWRpbmcgZW5lcmd5IHZhbHVlcy4gKi8KK30gU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUjsKIAogdHlwZWRlZiBTQlJfVFJBTlNJRU5UX0RFVEVDVE9SICpIQU5ETEVfU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUjsKIAogI2RlZmluZSBUUkFOX0RFVF9MT09LQUhFQUQgMgotI2RlZmluZSBUUkFOX0RFVF9TVEFSVF9GUkVRIDQ1MDAgIC8qc3RhcnQgZnJlcXVlbmN5IGZvciB0cmFuc2llbnQgZGV0ZWN0aW9uKi8KLSNkZWZpbmUgVFJBTl9ERVRfU1RPUF9GUkVRICAxMzUwMCAvKnN0b3AgZnJlcXVlbmN5IGZvciB0cmFuc2llbnQgZGV0ZWN0aW9uKi8KLSNkZWZpbmUgVFJBTl9ERVRfTUlOX1FNRkJBTkRTIDQgLyogbWluaW11bSBxbWYgYmFuZHMgZm9yIHRyYW5zaWVudCBkZXRlY3Rpb24gKi8KLSNkZWZpbmUgUU1GX0hQX2RCZF9TTE9QRV9GSVggRkwyRlhDT05TVF9EQkwoMC4wMDA3NTI3NWYpIC8qIDAuMDAyMjY2Zi8xMCAqIGxvZzIoMTApICovCi0jZGVmaW5lIFRSQU5fREVUX1RIUlNITEQgRkwyRlhDT05TVF9EQkwoMy4yZi80LmYpCi0jZGVmaW5lIFRSQU5fREVUX1RIUlNITERfU0NBTEUgKDIpCisjZGVmaW5lIFRSQU5fREVUX1NUQVJUX0ZSRVEgNDUwMCAvKnN0YXJ0IGZyZXF1ZW5jeSBmb3IgdHJhbnNpZW50IGRldGVjdGlvbiovCisjZGVmaW5lIFRSQU5fREVUX1NUT1BfRlJFUSAxMzUwMCAvKnN0b3AgZnJlcXVlbmN5IGZvciB0cmFuc2llbnQgZGV0ZWN0aW9uKi8KKyNkZWZpbmUgVFJBTl9ERVRfTUlOX1FNRkJBTkRTICAgICAgICAgICAgICAgICAgICBcCisgIDQgLyogbWluaW11bSBxbWYgYmFuZHMgZm9yIHRyYW5zaWVudCBkZXRlY3Rpb24gXAorICAgICAqLworI2RlZmluZSBRTUZfSFBfZEJkX1NMT1BFX0ZJWCBcCisgIEZMMkZYQ09OU1RfREJMKDAuMDAwNzUyNzVmKSAvKiAwLjAwMjI2NmYvMTAgKiBsb2cyKDEwKSAqLworI2RlZmluZSBUUkFOX0RFVF9USFJTSExEIEZMMkZYQ09OU1RfREJMKDUuMGYgLyA4LjBmKQorI2RlZmluZSBUUkFOX0RFVF9USFJTSExEX1NDQUxFICgzKQogCi10eXBlZGVmIHN0cnVjdAotewotICBJTlQgdHJhbnNpZW50Q2FuZGlkYXRlc1tRTUZfTUFYX1RJTUVfU0xPVFMgKyBUUkFOX0RFVF9MT09LQUhFQURdOwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgdHJhbnNpZW50Q2FuZGlkYXRlc1szMiArIFRSQU5fREVUX0xPT0tBSEVBRF07CiAgIElOVCBuVGltZVNsb3RzOwogICBJTlQgbG9va2FoZWFkOwogICBJTlQgc3RhcnRCYW5kOwogICBJTlQgc3RvcEJhbmQ7CiAKLSAgRklYUF9EQkwgZEJmX21bUU1GX0NIQU5ORUxTXTsKLSAgSU5UICAgICAgZEJmX2VbUU1GX0NIQU5ORUxTXTsKKyAgRklYUF9EQkwgZEJmX21bNjRdOworICBJTlQgZEJmX2VbNjRdOwogCi0gIEZJWFBfREJMIGVuZXJneV90aW1lU2xvdHNbUU1GX01BWF9USU1FX1NMT1RTICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKLSAgSU5UICAgICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVtRTUZfTUFYX1RJTUVfU0xPVFMgKyBUUkFOX0RFVF9MT09LQUhFQURdOworICBGSVhQX0RCTCBlbmVyZ3lfdGltZVNsb3RzWzMyICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKKyAgSU5UIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbMzIgKyBUUkFOX0RFVF9MT09LQUhFQURdOwogCi0gIEZJWFBfREJMIGRlbHRhX2VuZXJneVtRTUZfTUFYX1RJTUVfU0xPVFMgKyBUUkFOX0RFVF9MT09LQUhFQURdOwotICBJTlQgICAgICBkZWx0YV9lbmVyZ3lfc2NhbGVbUU1GX01BWF9USU1FX1NMT1RTICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKKyAgRklYUF9EQkwgZGVsdGFfZW5lcmd5WzMyICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKKyAgSU5UIGRlbHRhX2VuZXJneV9zY2FsZVszMiArIFRSQU5fREVUX0xPT0tBSEVBRF07CiAKLSAgRklYUF9EQkwgbG93cGFzc19lbmVyZ3lbUU1GX01BWF9USU1FX1NMT1RTICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKLSAgSU5UICAgICAgbG93cGFzc19lbmVyZ3lfc2NhbGVbUU1GX01BWF9USU1FX1NMT1RTICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKLSNpZiBkZWZpbmVkIChGVERfTE9HKQotICBGREtGSUxFICpmdGRfbG9nOwotI2VuZGlmCi19Ci1GQVNUX1RSQU5fREVURUNUT1I7CisgIEZJWFBfREJMIGxvd3Bhc3NfZW5lcmd5WzMyICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKKyAgSU5UIGxvd3Bhc3NfZW5lcmd5X3NjYWxlWzMyICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKK30gRkFTVF9UUkFOX0RFVEVDVE9SOwogdHlwZWRlZiBGQVNUX1RSQU5fREVURUNUT1IgKkhBTkRMRV9GQVNUX1RSQU5fREVUOwogCi0KIElOVCBGREtzYnJFbmNfSW5pdFNickZhc3RUcmFuc2llbnREZXRlY3RvcigKLSAgICAgICAgSEFORExFX0ZBU1RfVFJBTl9ERVQgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IsCi0gICAgICAgIGNvbnN0IElOVCB0aW1lX3Nsb3RzX3Blcl9mcmFtZSwKLSAgICAgICAgY29uc3QgSU5UIGJhbmR3aWR0aF9xbWZfc2xvdCwKLSAgICAgICAgY29uc3QgSU5UIG5vX3FtZl9jaGFubmVscywKLSAgICAgICAgY29uc3QgSU5UIHNicl9xbWZfMXN0X2JhbmQKLSAgICAgICAgKTsKKyAgICBIQU5ETEVfRkFTVF9UUkFOX0RFVCBoX3NickZhc3RUcmFuc2llbnREZXRlY3RvciwKKyAgICBjb25zdCBJTlQgdGltZV9zbG90c19wZXJfZnJhbWUsIGNvbnN0IElOVCBiYW5kd2lkdGhfcW1mX3Nsb3QsCisgICAgY29uc3QgSU5UIG5vX3FtZl9jaGFubmVscywgY29uc3QgSU5UIHNicl9xbWZfMXN0X2JhbmQpOwogCiB2b2lkIEZES3NickVuY19mYXN0VHJhbnNpZW50RGV0ZWN0KAotICAgICAgICBjb25zdCBIQU5ETEVfRkFTVF9UUkFOX0RFVCAgICAgICAgICBoX3NickZhc3RUcmFuc2llbnREZXRlY3RvciwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICAgICpjb25zdCAqRW5lcmdpZXMsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAqY29uc3QgIHNjYWxlRW5lcmdpZXMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICpjb25zdCAgdHJhbl92ZWN0b3IKLSAgICAgICAgKTsKKyAgICBjb25zdCBIQU5ETEVfRkFTVF9UUkFOX0RFVCBoX3NickZhc3RUcmFuc2llbnREZXRlY3RvciwKKyAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgKkVuZXJnaWVzLCBjb25zdCBpbnQgKmNvbnN0IHNjYWxlRW5lcmdpZXMsCisgICAgY29uc3QgSU5UIFlCdWZmZXJXcml0ZU9mZnNldCwgVUNIQVIgKmNvbnN0IHRyYW5fdmVjdG9yKTsKIAotdm9pZAotRkRLc2JyRW5jX3RyYW5zaWVudERldGVjdChIQU5ETEVfU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUiBoX3NiclRyYW5zaWVudERldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKkVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjYWxlRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp0cmFuX3ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJTelNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZVN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZU1pZGRsZUJvcmRlcik7Cit2b2lkIEZES3NickVuY190cmFuc2llbnREZXRlY3QoCisgICAgSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuc2llbnREZXRlY3RvciwgRklYUF9EQkwgKipFbmVyZ2llcywKKyAgICBJTlQgKnNjYWxlRW5lcmdpZXMsIFVDSEFSICp0cmFuX3ZlY3RvciwgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwKKyAgICBpbnQgWUJ1ZmZlclN6U2hpZnQsIGludCB0aW1lU3RlcCwgaW50IGZyYW1lTWlkZGxlQm9yZGVyKTsKIAotaW50Ci1GREtzYnJFbmNfSW5pdFNiclRyYW5zaWVudERldGVjdG9yIChIQU5ETEVfU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUiBoX3NiclRyYW5zaWVudERldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgIHNiclN5bnRheEZsYWdzLCAvKiBTQlIgc3ludGF4IGZsYWdzIGRlcml2ZWQgZnJvbSBBT1QuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgZnJhbWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHNhbXBsZUZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlndXJhdGlvblB0ciBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgdHJhbl9mYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBub19jb2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIG5vX3Jvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIFlCdWZmZXJTelNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIGZyYW1lU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgdHJhbl9vZmYpOworaW50IEZES3NickVuY19Jbml0U2JyVHJhbnNpZW50RGV0ZWN0b3IoCisgICAgSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuc2llbnREZXRlY3RvciwKKyAgICBVSU5UIHNiclN5bnRheEZsYWdzLCAvKiBTQlIgc3ludGF4IGZsYWdzIGRlcml2ZWQgZnJvbSBBT1QuICovCisgICAgSU5UIGZyYW1lU2l6ZSwgSU5UIHNhbXBsZUZyZXEsIHNickNvbmZpZ3VyYXRpb25QdHIgcGFyYW1zLCBpbnQgdHJhbl9mYywKKyAgICBpbnQgbm9fY29scywgaW50IG5vX3Jvd3MsIGludCBZQnVmZmVyV3JpdGVPZmZzZXQsIGludCBZQnVmZmVyU3pTaGlmdCwKKyAgICBpbnQgZnJhbWVTaGlmdCwgaW50IHRyYW5fb2ZmKTsKIAotdm9pZAotRkRLc2JyRW5jX2ZyYW1lU3BsaXR0ZXIoRklYUF9EQkwgKipFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp0cmFuX3ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jb2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIHRvbmFsaXR5KTsKK3ZvaWQgRkRLc2JyRW5jX2ZyYW1lU3BsaXR0ZXIoCisgICAgRklYUF9EQkwgKipFbmVyZ2llcywgSU5UICpzY2FsZUVuZXJnaWVzLAorICAgIEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsIFVDSEFSICpmcmVxQmFuZFRhYmxlLAorICAgIFVDSEFSICp0cmFuX3ZlY3RvciwgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwgaW50IFlCdWZmZXJTelNoaWZ0LCBpbnQgblNmYiwKKyAgICBpbnQgdGltZVN0ZXAsIGludCBub19jb2xzLCBGSVhQX0RCTCAqdG9uYWxpdHkpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTWVMvaW5jbHVkZS9GREtfYXVkaW8uaCBiL2xpYlNZUy9pbmNsdWRlL0ZES19hdWRpby5oCmluZGV4IDk4ZGVkM2IuLjBlNDQwYzkgMTAwNjQ0Ci0tLSBhL2xpYlNZUy9pbmNsdWRlL0ZES19hdWRpby5oCisrKyBiL2xpYlNZUy9pbmNsdWRlL0ZES19hdWRpby5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDEzICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKiogU3lzdGVtIGludGVncmF0aW9uIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiBcZmlsZSAgIEZES19hdWRpby5oCiAgKiAgXGJyaWVmICBHbG9iYWwgYXVkaW8gc3RydWN0IGFuZCBjb25zdGFudCBkZWZpbml0aW9ucy4KQEAgLTk2LDMwOSArMTA5LDQwOSBAQAogCiAjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKyNpbmNsdWRlICJzeXNsaWJfY2hhbm5lbE1hcERlc2NyLmgiCiAKICNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgoteworZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAogLyoqCiAgKiBGaWxlIGZvcm1hdCBpZGVudGlmaWVycy4KICAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIEZGX1VOS05PV04gICAgICAgICAgID0gLTEsIC8qKjwgVW5rbm93biBmb3JtYXQuICAgICAgICAqLwotICBGRl9SQVcgICAgICAgICAgICAgICA9IDAsICAvKio8IE5vIGNvbnRhaW5lciwgYml0IHN0cmVhbSBkYXRhIGNvbnZleWVkICJhcyBpcyIuICovCit0eXBlZGVmIGVudW0geworICBGRl9VTktOT1dOID0gLTEsIC8qKjwgVW5rbm93biBmb3JtYXQuICAgICAgICAqLworICBGRl9SQVcgPSAwLCAgICAgIC8qKjwgTm8gY29udGFpbmVyLCBiaXQgc3RyZWFtIGRhdGEgY29udmV5ZWQgImFzIGlzIi4gKi8KIAotICBGRl9NUDRfM0dQUCAgICAgICAgICA9IDMsICAvKio8IDNHUFAgZmlsZSBmb3JtYXQuICAgICAgKi8KLSAgRkZfTVA0X01QNEYgICAgICAgICAgPSA0LCAgLyoqPCBNUEVHLTQgRmlsZSBmb3JtYXQuICAgICAqLworICBGRl9NUDRfM0dQUCA9IDMsIC8qKjwgM0dQUCBmaWxlIGZvcm1hdC4gICAgICAqLworICBGRl9NUDRfTVA0RiA9IDQsIC8qKjwgTVBFRy00IEZpbGUgZm9ybWF0LiAgICAgKi8KIAotICBGRl9SQVdQQUNLRVRTICAgICAgICA9IDUsICAvKio8IFByb3ByaWV0YXJ5IHJhdyBwYWNrZXQgZmlsZS4gKi8KLQotICBGRl9EUk1DVCAgICAgICAgICAgICA9IDEyICAvKio8IERpZ2l0YWwgUmFkaW8gTW9uZGlhbCAoRFJNMzAvRFJNKykgQ1QgcHJvcHJpZXRhcnkgZmlsZSBmb3JtYXQuICovCisgIEZGX1JBV1BBQ0tFVFMgPSA1IC8qKjwgUHJvcHJpZXRhcnkgcmF3IHBhY2tldCBmaWxlLiAqLwogCiB9IEZJTEVfRk9STUFUOwogCiAvKioKICAqIFRyYW5zcG9ydCB0eXBlIGlkZW50aWZpZXJzLgogICovCi10eXBlZGVmIGVudW0KLXsKLSAgVFRfVU5LTk9XTiAgICAgICAgICAgPSAtMSwgLyoqPCBVbmtub3duIGZvcm1hdC4gICAgICAgICAgICAqLwotICBUVF9NUDRfUkFXICAgICAgICAgICA9IDAsICAvKio8ICJhcyBpcyIgYWNjZXNzIHVuaXRzIChwYWNrZXQgYmFzZWQgc2luY2UgdGhlcmUgaXMgb2J2aW91c2x5IG5vIHN5bmMgbGF5ZXIpICovCi0gIFRUX01QNF9BRElGICAgICAgICAgID0gMSwgIC8qKjwgQURJRiBiaXRzdHJlYW0gZm9ybWF0LiAgICAgKi8KLSAgVFRfTVA0X0FEVFMgICAgICAgICAgPSAyLCAgLyoqPCBBRFRTIGJpdHN0cmVhbSBmb3JtYXQuICAgICAqLwordHlwZWRlZiBlbnVtIHsKKyAgVFRfVU5LTk9XTiA9IC0xLCAvKio8IFVua25vd24gZm9ybWF0LiAgICAgICAgICAgICovCisgIFRUX01QNF9SQVcgPSAwLCAgLyoqPCAiYXMgaXMiIGFjY2VzcyB1bml0cyAocGFja2V0IGJhc2VkIHNpbmNlIHRoZXJlIGlzCisgICAgICAgICAgICAgICAgICAgICAgb2J2aW91c2x5IG5vIHN5bmMgbGF5ZXIpICovCisgIFRUX01QNF9BRElGID0gMSwgLyoqPCBBRElGIGJpdHN0cmVhbSBmb3JtYXQuICAgICAqLworICBUVF9NUDRfQURUUyA9IDIsIC8qKjwgQURUUyBiaXRzdHJlYW0gZm9ybWF0LiAgICAgKi8KIAotICBUVF9NUDRfTEFUTV9NQ1AxICAgICA9IDYsICAvKio8IEF1ZGlvIE11eCBFbGVtZW50cyB3aXRoIG11eENvbmZpZ1ByZXNlbnQgPSAxICovCi0gIFRUX01QNF9MQVRNX01DUDAgICAgID0gNywgIC8qKjwgQXVkaW8gTXV4IEVsZW1lbnRzIHdpdGggbXV4Q29uZmlnUHJlc2VudCA9IDAsIG91dCBvZiBiYW5kIFN0cmVhbU11eENvbmZpZyAqLworICBUVF9NUDRfTEFUTV9NQ1AxID0gNiwgLyoqPCBBdWRpbyBNdXggRWxlbWVudHMgd2l0aCBtdXhDb25maWdQcmVzZW50ID0gMSAqLworICBUVF9NUDRfTEFUTV9NQ1AwID0gNywgLyoqPCBBdWRpbyBNdXggRWxlbWVudHMgd2l0aCBtdXhDb25maWdQcmVzZW50ID0gMCwgb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBiYW5kIFN0cmVhbU11eENvbmZpZyAqLwogCi0gIFRUX01QNF9MT0FTICAgICAgICAgID0gMTAsIC8qKjwgQXVkaW8gU3luYyBTdHJlYW0uICAgICAgICAgKi8KKyAgVFRfTVA0X0xPQVMgPSAxMCwgLyoqPCBBdWRpbyBTeW5jIFN0cmVhbS4gICAgICAgICAqLwogCi0gIFRUX0RSTSAgICAgICAgICAgICAgID0gMTIgIC8qKjwgRGlnaXRhbCBSYWRpbyBNb25kaWFsIChEUk0zMC9EUk0rKSBiaXRzdHJlYW0gZm9ybWF0LiAqLworICBUVF9EUk0gPSAxMiAvKio8IERpZ2l0YWwgUmFkaW8gTW9uZGlhbCAoRFJNMzAvRFJNKykgYml0c3RyZWFtIGZvcm1hdC4gKi8KIAogfSBUUkFOU1BPUlRfVFlQRTsKIAotI2RlZmluZSBUVF9JU19QQUNLRVQoeCkgXAotICAgICAgICggKCh4KSA9PSBUVF9NUDRfUkFXKSBcCi0gICAgICB8fCAoKHgpID09IFRUX0RSTSkgXAotICAgICAgfHwgKCh4KSA9PSBUVF9NUDRfTEFUTV9NQ1AwKSBcCi0gICAgICB8fCAoKHgpID09IFRUX01QNF9MQVRNX01DUDEpICkKKyNkZWZpbmUgVFRfSVNfUEFDS0VUKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCh4KSA9PSBUVF9NUDRfUkFXKSB8fCAoKHgpID09IFRUX0RSTSkgfHwgKCh4KSA9PSBUVF9NUDRfTEFUTV9NQ1AwKSB8fCBcCisgICAoKHgpID09IFRUX01QNF9MQVRNX01DUDEpKQogCiAvKioKICAqIEF1ZGlvIE9iamVjdCBUeXBlIGRlZmluaXRpb25zLgogICovCi10eXBlZGVmIGVudW0KLXsKLSAgQU9UX05PTkUgICAgICAgICAgICAgPSAtMSwKLSAgQU9UX05VTExfT0JKRUNUICAgICAgPSAwLAotICBBT1RfQUFDX01BSU4gICAgICAgICA9IDEsIC8qKjwgTWFpbiBwcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQU9UX0FBQ19MQyAgICAgICAgICAgPSAyLCAvKio8IExvdyBDb21wbGV4aXR5IG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9BQUNfU1NSICAgICAgICAgID0gMywKLSAgQU9UX0FBQ19MVFAgICAgICAgICAgPSA0LAotICBBT1RfU0JSICAgICAgICAgICAgICA9IDUsCi0gIEFPVF9BQUNfU0NBTCAgICAgICAgID0gNiwKLSAgQU9UX1RXSU5fVlEgICAgICAgICAgPSA3LAotICBBT1RfQ0VMUCAgICAgICAgICAgICA9IDgsCi0gIEFPVF9IVlhDICAgICAgICAgICAgID0gOSwKLSAgQU9UX1JTVkRfMTAgICAgICAgICAgPSAxMCwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBT1RfUlNWRF8xMSAgICAgICAgICA9IDExLCAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9UVFNJICAgICAgICAgICAgID0gMTIsIC8qKjwgVFRTSSBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQU9UX01BSU5fU1lOVEggICAgICAgPSAxMywgLyoqPCBNYWluIFN5bnRoZXRpYyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLwotICBBT1RfV0FWX1RBQl9TWU5USCAgICA9IDE0LCAvKio8IFdhdmV0YWJsZSBTeW50aGVzaXMgb2JqZWN0ICAgICAgICAgICAgICAgICovCi0gIEFPVF9HRU5fTUlESSAgICAgICAgID0gMTUsIC8qKjwgR2VuZXJhbCBNSURJIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgZW51bSB7CisgIEFPVF9OT05FID0gLTEsCisgIEFPVF9OVUxMX09CSkVDVCA9IDAsCisgIEFPVF9BQUNfTUFJTiA9IDEsIC8qKjwgTWFpbiBwcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX0FBQ19MQyA9IDIsICAgLyoqPCBMb3cgQ29tcGxleGl0eSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfQUFDX1NTUiA9IDMsCisgIEFPVF9BQUNfTFRQID0gNCwKKyAgQU9UX1NCUiA9IDUsCisgIEFPVF9BQUNfU0NBTCA9IDYsCisgIEFPVF9UV0lOX1ZRID0gNywKKyAgQU9UX0NFTFAgPSA4LAorICBBT1RfSFZYQyA9IDksCisgIEFPVF9SU1ZEXzEwID0gMTAsICAgICAgICAgIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX1JTVkRfMTEgPSAxMSwgICAgICAgICAgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfVFRTSSA9IDEyLCAgICAgICAgICAgICAvKio8IFRUU0kgT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9NQUlOX1NZTlRIID0gMTMsICAgICAgIC8qKjwgTWFpbiBTeW50aGV0aWMgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX1dBVl9UQUJfU1lOVEggPSAxNCwgICAgLyoqPCBXYXZldGFibGUgU3ludGhlc2lzIG9iamVjdCAgICAgICAgICAgICAgICAqLworICBBT1RfR0VOX01JREkgPSAxNSwgICAgICAgICAvKio8IEdlbmVyYWwgTUlESSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICovCiAgIEFPVF9BTEdfU1lOVEhfQVVEX0ZYID0gMTYsIC8qKjwgQWxnb3JpdGhtaWMgU3ludGhlc2lzIGFuZCBBdWRpbyBGWCBvYmplY3QgKi8KLSAgQU9UX0VSX0FBQ19MQyAgICAgICAgPSAxNywgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3cgQ29tcGxleGl0eSAgICAqLwotICBBT1RfUlNWRF8xOCAgICAgICAgICA9IDE4LCAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9FUl9BQUNfTFRQICAgICAgID0gMTksIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTFRQIG9iamVjdCAgICAgICAgKi8KLSAgQU9UX0VSX0FBQ19TQ0FMICAgICAgPSAyMCwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBTY2FsYWJsZSBvYmplY3QgICAqLwotICBBT1RfRVJfVFdJTl9WUSAgICAgICA9IDIxLCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgVHdpblZRIG9iamVjdCAgICAgICAgICovCi0gIEFPVF9FUl9CU0FDICAgICAgICAgID0gMjIsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBCU0FDIG9iamVjdCAgICAgICAgICAgKi8KLSAgQU9UX0VSX0FBQ19MRCAgICAgICAgPSAyMywgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3dEZWxheSBvYmplY3QgICAqLwotICBBT1RfRVJfQ0VMUCAgICAgICAgICA9IDI0LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQ0VMUCBvYmplY3QgICAgICAgICAgICovCi0gIEFPVF9FUl9IVlhDICAgICAgICAgID0gMjUsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBIVlhDIG9iamVjdCAgICAgICAgICAgKi8KLSAgQU9UX0VSX0hJTE4gICAgICAgICAgPSAyNiwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhJTE4gb2JqZWN0ICAgICAgICAgICAqLwotICBBT1RfRVJfUEFSQSAgICAgICAgICA9IDI3LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgUGFyYW1ldHJpYyBvYmplY3QgICAgICovCi0gIEFPVF9SU1ZEXzI4ICAgICAgICAgID0gMjgsIC8qKjwgbWlnaHQgYmVjb21lIFNTQyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQU9UX1BTICAgICAgICAgICAgICAgPSAyOSwgLyoqPCBQUywgUGFyYW1ldHJpYyBTdGVyZW8gKGluY2x1ZGVzIFNCUikgICAgICAqLwotICBBT1RfTVBFR1MgICAgICAgICAgICA9IDMwLCAvKio8IE1QRUcgU3Vycm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9FUl9BQUNfTEMgPSAxNywgICAgICAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTG93IENvbXBsZXhpdHkgICAgKi8KKyAgQU9UX1JTVkRfMTggPSAxOCwgICAgICAgICAgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfRVJfQUFDX0xUUCA9IDE5LCAgICAgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExUUCBvYmplY3QgICAgICAgICovCisgIEFPVF9FUl9BQUNfU0NBTCA9IDIwLCAgICAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgU2NhbGFibGUgb2JqZWN0ICAgKi8KKyAgQU9UX0VSX1RXSU5fVlEgPSAyMSwgICAgICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFR3aW5WUSBvYmplY3QgICAgICAgICAqLworICBBT1RfRVJfQlNBQyA9IDIyLCAgICAgICAgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQlNBQyBvYmplY3QgICAgICAgICAgICovCisgIEFPVF9FUl9BQUNfTEQgPSAyMywgICAgICAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTG93RGVsYXkgb2JqZWN0ICAgKi8KKyAgQU9UX0VSX0NFTFAgPSAyNCwgICAgICAgICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIENFTFAgb2JqZWN0ICAgICAgICAgICAqLworICBBT1RfRVJfSFZYQyA9IDI1LCAgICAgICAgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgSFZYQyBvYmplY3QgICAgICAgICAgICovCisgIEFPVF9FUl9ISUxOID0gMjYsICAgICAgICAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBISUxOIG9iamVjdCAgICAgICAgICAgKi8KKyAgQU9UX0VSX1BBUkEgPSAyNywgICAgICAgICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFBhcmFtZXRyaWMgb2JqZWN0ICAgICAqLworICBBT1RfUlNWRF8yOCA9IDI4LCAgICAgICAgICAvKio8IG1pZ2h0IGJlY29tZSBTU0MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9QUyA9IDI5LCAgICAgICAgICAgICAgIC8qKjwgUFMsIFBhcmFtZXRyaWMgU3RlcmVvIChpbmNsdWRlcyBTQlIpICAgICAgKi8KKyAgQU9UX01QRUdTID0gMzAsICAgICAgICAgICAgLyoqPCBNUEVHIFN1cnJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gIEFPVF9FU0NBUEUgICAgICAgICAgID0gMzEsIC8qKjwgU2lnbmFsIEFPVCB1c2VzIG1vcmUgdGhhbiA1IGJpdHMgICAgICAgICAgKi8KKyAgQU9UX0VTQ0FQRSA9IDMxLCAvKio8IFNpZ25hbCBBT1QgdXNlcyBtb3JlIHRoYW4gNSBiaXRzICAgICAgICAgICovCiAKLSAgQU9UX01QM09OTVA0X0wxICAgICAgPSAzMiwgLyoqPCBNUEVHLUxheWVyMSBpbiBtcDQgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBT1RfTVAzT05NUDRfTDIgICAgICA9IDMzLCAvKio8IE1QRUctTGF5ZXIyIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9NUDNPTk1QNF9MMyAgICAgID0gMzQsIC8qKjwgTVBFRy1MYXllcjMgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQU9UX1JTVkRfMzUgICAgICAgICAgPSAzNSwgLyoqPCBtaWdodCBiZWNvbWUgRFNUICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBT1RfUlNWRF8zNiAgICAgICAgICA9IDM2LCAvKio8IG1pZ2h0IGJlY29tZSBBTFMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9BQUNfU0xTICAgICAgICAgID0gMzcsIC8qKjwgQUFDICsgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQU9UX1NMUyAgICAgICAgICAgICAgPSAzOCwgLyoqPCBTTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBT1RfRVJfQUFDX0VMRCAgICAgICA9IDM5LCAvKio8IEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9NUDNPTk1QNF9MMSA9IDMyLCAvKio8IE1QRUctTGF5ZXIxIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9NUDNPTk1QNF9MMiA9IDMzLCAvKio8IE1QRUctTGF5ZXIyIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9NUDNPTk1QNF9MMyA9IDM0LCAvKio8IE1QRUctTGF5ZXIzIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9SU1ZEXzM1ID0gMzUsICAgICAvKio8IG1pZ2h0IGJlY29tZSBEU1QgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9SU1ZEXzM2ID0gMzYsICAgICAvKio8IG1pZ2h0IGJlY29tZSBBTFMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9BQUNfU0xTID0gMzcsICAgICAvKio8IEFBQyArIFNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9TTFMgPSAzOCwgICAgICAgICAvKio8IFNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9FUl9BQUNfRUxEID0gMzksICAvKio8IEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkgICAgICAgICAgICAgICAgICAgICovCiAKLSAgQU9UX1VTQUMgICAgICAgICAgICAgPSA0MiwgLyoqPCBVU0FDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBT1RfU0FPQyAgICAgICAgICAgICA9IDQzLCAvKio8IFNBT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9MRF9NUEVHUyAgICAgICAgID0gNDQsIC8qKjwgTG93IERlbGF5IE1QRUcgU3Vycm91bmQgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX1VTQUMgPSA0MiwgICAgIC8qKjwgVVNBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX1NBT0MgPSA0MywgICAgIC8qKjwgU0FPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX0xEX01QRUdTID0gNDQsIC8qKjwgTG93IERlbGF5IE1QRUcgU3Vycm91bmQgICAgICAgICAgICAgICAgICAgKi8KIAogICAvKiBQc2V1ZG8gQU9UcyAqLwotICBBT1RfRFJNX0FBQyAgICAgICAgICA9IDE0MywgLyoqPCBWaXJ0dWFsIEFPVCBmb3IgRFJNIChFUi1BQUMtU0NBTCB3aXRob3V0IFNCUikgICAgICAgICAgKi8KLSAgQU9UX0RSTV9TQlIgICAgICAgICAgPSAxNDQsIC8qKjwgVmlydHVhbCBBT1QgZm9yIERSTSAoRVItQUFDLVNDQUwgd2l0aCBTQlIpICAgICAgICAgICAgICovCi0gIEFPVF9EUk1fTVBFR19QUyAgICAgID0gMTQ1ICAvKio8IFZpcnR1YWwgQU9UIGZvciBEUk0gKEVSLUFBQy1TQ0FMIHdpdGggU0JSIGFuZCBNUEVHLVBTKSAqLworICBBT1RfTVAyX0FBQ19MQyA9IDEyOSwgLyoqPCBWaXJ0dWFsIEFPVCBNUDIgTG93IENvbXBsZXhpdHkgcHJvZmlsZSAqLworICBBT1RfTVAyX1NCUiA9IDEzMiwgLyoqPCBWaXJ0dWFsIEFPVCBNUDIgTG93IENvbXBsZXhpdHkgUHJvZmlsZSB3aXRoIFNCUiAgICAqLworCisgIEFPVF9EUk1fQUFDID0gMTQzLCAvKio8IFZpcnR1YWwgQU9UIGZvciBEUk0gKEVSLUFBQy1TQ0FMIHdpdGhvdXQgU0JSKSAqLworICBBT1RfRFJNX1NCUiA9IDE0NCwgLyoqPCBWaXJ0dWFsIEFPVCBmb3IgRFJNIChFUi1BQUMtU0NBTCB3aXRoIFNCUikgKi8KKyAgQU9UX0RSTV9NUEVHX1BTID0KKyAgICAgIDE0NSwgLyoqPCBWaXJ0dWFsIEFPVCBmb3IgRFJNIChFUi1BQUMtU0NBTCB3aXRoIFNCUiBhbmQgTVBFRy1QUykgKi8KKyAgQU9UX0RSTV9TVVJST1VORCA9CisgICAgICAxNDYsIC8qKjwgVmlydHVhbCBBT1QgZm9yIERSTSBTdXJyb3VuZCAoRVItQUFDLVNDQUwgKCtTQlIpICtNUFMpICovCisgIEFPVF9EUk1fVVNBQyA9IDE0NyAvKio8IFZpcnR1YWwgQU9UIGZvciBEUk0gd2l0aCBVU0FDICovCiAKIH0gQVVESU9fT0JKRUNUX1RZUEU7CiAKLSNkZWZpbmUgQ0FOX0RPX1BTKGFvdCkgXAotICAoKGFvdCkgPT0gQU9UX0FBQ19MQyBcCi18fCAoYW90KSA9PSBBT1RfU0JSIFwKLXx8IChhb3QpID09IEFPVF9QUyBcCi18fCAoYW90KSA9PSBBT1RfRVJfQlNBQyBcCi18fCAoYW90KSA9PSBBT1RfRFJNX0FBQykKKyNkZWZpbmUgQ0FOX0RPX1BTKGFvdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGFvdCkgPT0gQU9UX0FBQ19MQyB8fCAoYW90KSA9PSBBT1RfU0JSIHx8IChhb3QpID09IEFPVF9QUyB8fCBcCisgICAoYW90KSA9PSBBT1RfRVJfQlNBQyB8fCAoYW90KSA9PSBBT1RfRFJNX0FBQykKIAotI2RlZmluZSBJU19VU0FDKGFvdCkgXAotICAoKGFvdCkgPT0gQU9UX1VTQUMpCisjZGVmaW5lIElTX1VTQUMoYW90KSAoKGFvdCkgPT0gQU9UX1VTQUMpCiAKLSNkZWZpbmUgSVNfTE9XREVMQVkoYW90KSBcCi0gICgoYW90KSA9PSBBT1RfRVJfQUFDX0xEIFwKLXx8IChhb3QpID09IEFPVF9FUl9BQUNfRUxEKQorI2RlZmluZSBJU19MT1dERUxBWShhb3QpICgoYW90KSA9PSBBT1RfRVJfQUFDX0xEIHx8IChhb3QpID09IEFPVF9FUl9BQUNfRUxEKQogCi0vKiogQ2hhbm5lbCBNb2RlICggMS03IGVxdWFscyBNUEVHIGNoYW5uZWwgY29uZmlndXJhdGlvbnMsIG90aGVycyBhcmUgYXJiaXRyYXJ5KS4gKi8KKy8qKiBDaGFubmVsIE1vZGUgKCAxLTcgZXF1YWxzIE1QRUcgY2hhbm5lbCBjb25maWd1cmF0aW9ucywgb3RoZXJzIGFyZQorICogYXJiaXRyYXJ5KS4gKi8KIHR5cGVkZWYgZW51bSB7Ci0gIE1PREVfSU5WQUxJRCAgICAgICAgICAgICAgICAgID0gLTEsCi0gIE1PREVfVU5LTk9XTiAgICAgICAgICAgICAgICAgID0gIDAsCi0gIE1PREVfMSAgICAgICAgICAgICAgICAgICAgICAgID0gIDEsICAgICAgIC8qKjwgQyAqLwotICBNT0RFXzIgICAgICAgICAgICAgICAgICAgICAgICA9ICAyLCAgICAgICAvKio8IEwrUiAqLwotICBNT0RFXzFfMiAgICAgICAgICAgICAgICAgICAgICA9ICAzLCAgICAgICAvKio8IEMsIEwrUiAqLwotICBNT0RFXzFfMl8xICAgICAgICAgICAgICAgICAgICA9ICA0LCAgICAgICAvKio8IEMsIEwrUiwgUmVhciAqLwotICBNT0RFXzFfMl8yICAgICAgICAgICAgICAgICAgICA9ICA1LCAgICAgICAvKio8IEMsIEwrUiwgTFMrUlMgKi8KLSAgTU9ERV8xXzJfMl8xICAgICAgICAgICAgICAgICAgPSAgNiwgICAgICAgLyoqPCBDLCBMK1IsIExTK1JTLCBMRkUgKi8KLSAgTU9ERV8xXzJfMl8yXzEgICAgICAgICAgICAgICAgPSAgNywgICAgICAgLyoqPCBDLCBMQytSQywgTCtSLCBMUytSUywgTEZFICovCisgIE1PREVfSU5WQUxJRCA9IC0xLAorICBNT0RFX1VOS05PV04gPSAwLAorICBNT0RFXzEgPSAxLCAgICAgICAgIC8qKjwgQyAqLworICBNT0RFXzIgPSAyLCAgICAgICAgIC8qKjwgTCtSICovCisgIE1PREVfMV8yID0gMywgICAgICAgLyoqPCBDLCBMK1IgKi8KKyAgTU9ERV8xXzJfMSA9IDQsICAgICAvKio8IEMsIEwrUiwgUmVhciAqLworICBNT0RFXzFfMl8yID0gNSwgICAgIC8qKjwgQywgTCtSLCBMUytSUyAqLworICBNT0RFXzFfMl8yXzEgPSA2LCAgIC8qKjwgQywgTCtSLCBMUytSUywgTEZFICovCisgIE1PREVfMV8yXzJfMl8xID0gNywgLyoqPCBDLCBMQytSQywgTCtSLCBMUytSUywgTEZFICovCiAKKyAgTU9ERV82XzEgPSAxMSwgICAgICAgICAgIC8qKjwgQywgTCtSLCBMUytSUywgQ3JlYXIsIExGRSAqLworICBNT0RFXzdfMV9CQUNLID0gMTIsICAgICAgLyoqPCBDLCBMK1IsIExTK1JTLCBMcmVhcitScmVhciwgTEZFICovCisgIE1PREVfN18xX1RPUF9GUk9OVCA9IDE0LCAvKio8IEMsIEwrUiwgTFMrUlMsIExGRSwgTHRvcCtSdG9wICovCiAKLSAgTU9ERV8xXzEgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgLyoqPCAyIFNDRXMgKGR1YWwgbW9ubykgKi8KLSAgTU9ERV8xXzFfMV8xICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgLyoqPCA0IFNDRXMgKi8KLSAgTU9ERV8xXzFfMV8xXzFfMSAgICAgICAgICAgICAgPSAxOCwgICAgICAgLyoqPCA2IFNDRXMgKi8KLSAgTU9ERV8xXzFfMV8xXzFfMV8xXzEgICAgICAgICAgPSAxOSwgICAgICAgLyoqPCA4IFNDRXMgKi8KLSAgTU9ERV8xXzFfMV8xXzFfMV8xXzFfMV8xXzFfMSAgPSAyMCwgICAgICAgLyoqPCAxMiBTQ0VzICovCisgIE1PREVfN18xX1JFQVJfU1VSUk9VTkQgPSAzMywgLyoqPCBDLCBMK1IsIExTK1JTLCBMcmVhcitScmVhciwgTEZFICovCisgIE1PREVfN18xX0ZST05UX0NFTlRFUiA9IDM0LCAgLyoqPCBDLCBMQytSQywgTCtSLCBMUytSUywgTEZFICovCiAKLSAgTU9ERV8yXzIgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAgICAgLyoqPCAyIENQRXMgKi8KLSAgTU9ERV8yXzJfMiAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgLyoqPCAzIENQRXMgKi8KLSAgTU9ERV8yXzJfMl8yICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgLyoqPCA0IENQRXMgKi8KLSAgTU9ERV8yXzJfMl8yXzJfMiAgICAgICAgICAgICAgPSAyNCwgICAgICAgLyoqPCA2IENQRXMgKi8KLQotICBNT0RFXzJfMSAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAvKio8IENQRSxTQ0UgKEFSSUIgc3RhbmRhcmQgQjMyKSAqLwotCi0gIE1PREVfN18xX1JFQVJfU1VSUk9VTkQgICAgICAgID0gMzMsICAgICAgIC8qKjwgQywgTCtSLCBMUytSUywgTHJlYXIrUnJlYXIsIExGRSAqLwotICBNT0RFXzdfMV9GUk9OVF9DRU5URVIgICAgICAgICA9IDM0ICAgICAgICAvKio8IEMsIExDK1JDLCBMK1IsIExTK1JTLCBMRkUgKi8KKyAgTU9ERV8yMTIgPSAxMjggLyoqPCAyMTIgY29uZmlndXJhdGlvbiwgdXNlZCBpbiBFTER2MiAqLwogCiB9IENIQU5ORUxfTU9ERTsKIAogLyoqCiAgKiBTcGVha2VyIGRlc2NyaXB0aW9uIHRhZ3MuCi0gKiBEbyBub3QgY2hhbmdlIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMgdW5sZXNzIGl0IGtlZXBzIHRoZSBmb2xsb3dpbmcgc2VnbWVudGF0aW9uOgorICogRG8gbm90IGNoYW5nZSB0aGUgZW51bWVyYXRpb24gdmFsdWVzIHVubGVzcyBpdCBrZWVwcyB0aGUgZm9sbG93aW5nCisgKiBzZWdtZW50YXRpb246CiAgKiAtIEJpdCAwLTM6IEhvcml6b250YWwgcG9zdGlvbiAoMDogbm9uZSwgMTogZnJvbnQsIDI6IHNpZGUsIDM6IGJhY2ssIDQ6IGxmZSkKICAqIC0gQml0IDQtNzogVmVydGljYWwgcG9zaXRpb24gKDA6IG5vcm1hbCwgMTogdG9wLCAyOiBib3R0b20pCiAgKi8KIHR5cGVkZWYgZW51bSB7Ci0gIEFDVF9OT05FICAgICAgICAgPSAweDAwLAotICBBQ1RfRlJPTlQgICAgICAgID0gMHgwMSwgIC8qITwgRnJvbnQgc3BlYWtlciBwb3NpdGlvbiAoYXQgbm9ybWFsIGhlaWdodCkgKi8KLSAgQUNUX1NJREUgICAgICAgICA9IDB4MDIsICAvKiE8IFNpZGUgc3BlYWtlciBwb3NpdGlvbiAoYXQgbm9ybWFsIGhlaWdodCkgKi8KLSAgQUNUX0JBQ0sgICAgICAgICA9IDB4MDMsICAvKiE8IEJhY2sgc3BlYWtlciBwb3NpdGlvbiAoYXQgbm9ybWFsIGhlaWdodCkgKi8KLSAgQUNUX0xGRSAgICAgICAgICA9IDB4MDQsICAvKiE8IExvdyBmcmVxdWVuY3kgZWZmZWN0IHNwZWFrZXIgcG9zdGlvbiAoZnJvbnQpICovCisgIEFDVF9OT05FID0gMHgwMCwKKyAgQUNUX0ZST05UID0gMHgwMSwgLyohPCBGcm9udCBzcGVha2VyIHBvc2l0aW9uIChhdCBub3JtYWwgaGVpZ2h0KSAqLworICBBQ1RfU0lERSA9IDB4MDIsICAvKiE8IFNpZGUgc3BlYWtlciBwb3NpdGlvbiAoYXQgbm9ybWFsIGhlaWdodCkgKi8KKyAgQUNUX0JBQ0sgPSAweDAzLCAgLyohPCBCYWNrIHNwZWFrZXIgcG9zaXRpb24gKGF0IG5vcm1hbCBoZWlnaHQpICovCisgIEFDVF9MRkUgPSAweDA0LCAgIC8qITwgTG93IGZyZXF1ZW5jeSBlZmZlY3Qgc3BlYWtlciBwb3N0aW9uIChmcm9udCkgKi8KIAotICBBQ1RfVE9QICAgICAgICAgID0gMHgxMCwgIC8qITwgVG9wIHNwZWFrZXIgYXJlYSAoZm9yIGNvbWJpbmF0aW9uIHdpdGggc3BlYWtlciBwb3NpdGlvbnMpICovCi0gIEFDVF9GUk9OVF9UT1AgICAgPSAweDExLCAgLyohPCBUb3AgZnJvbnQgc3BlYWtlciA9IChBQ1RfRlJPTlR8QUNUX1RPUCkgKi8KLSAgQUNUX1NJREVfVE9QICAgICA9IDB4MTIsICAvKiE8IFRvcCBzaWRlIHNwZWFrZXIgID0gKEFDVF9TSURFIHxBQ1RfVE9QKSAqLwotICBBQ1RfQkFDS19UT1AgICAgID0gMHgxMywgIC8qITwgVG9wIGJhY2sgc3BlYWtlciAgPSAoQUNUX0JBQ0sgfEFDVF9UT1ApICovCisgIEFDVF9UT1AgPQorICAgICAgMHgxMCwgLyohPCBUb3Agc3BlYWtlciBhcmVhIChmb3IgY29tYmluYXRpb24gd2l0aCBzcGVha2VyIHBvc2l0aW9ucykgKi8KKyAgQUNUX0ZST05UX1RPUCA9IDB4MTEsIC8qITwgVG9wIGZyb250IHNwZWFrZXIgPSAoQUNUX0ZST05UfEFDVF9UT1ApICovCisgIEFDVF9TSURFX1RPUCA9IDB4MTIsICAvKiE8IFRvcCBzaWRlIHNwZWFrZXIgID0gKEFDVF9TSURFIHxBQ1RfVE9QKSAqLworICBBQ1RfQkFDS19UT1AgPSAweDEzLCAgLyohPCBUb3AgYmFjayBzcGVha2VyICA9IChBQ1RfQkFDSyB8QUNUX1RPUCkgKi8KIAotICBBQ1RfQk9UVE9NICAgICAgID0gMHgyMCwgIC8qITwgQm90dG9tIHNwZWFrZXIgYXJlYSAoZm9yIGNvbWJpbmF0aW9uIHdpdGggc3BlYWtlciBwb3NpdGlvbnMpICovCi0gIEFDVF9GUk9OVF9CT1RUT00gPSAweDIxLCAgLyohPCBCb3R0b20gZnJvbnQgc3BlYWtlciA9IChBQ1RfRlJPTlR8QUNUX0JPVFRPTSkgKi8KLSAgQUNUX1NJREVfQk9UVE9NICA9IDB4MjIsICAvKiE8IEJvdHRvbSBzaWRlIHNwZWFrZXIgID0gKEFDVF9TSURFIHxBQ1RfQk9UVE9NKSAqLwotICBBQ1RfQkFDS19CT1RUT00gID0gMHgyMyAgIC8qITwgQm90dG9tIGJhY2sgc3BlYWtlciAgPSAoQUNUX0JBQ0sgfEFDVF9CT1RUT00pICovCisgIEFDVF9CT1RUT00gPQorICAgICAgMHgyMCwgLyohPCBCb3R0b20gc3BlYWtlciBhcmVhIChmb3IgY29tYmluYXRpb24gd2l0aCBzcGVha2VyIHBvc2l0aW9ucykgKi8KKyAgQUNUX0ZST05UX0JPVFRPTSA9IDB4MjEsIC8qITwgQm90dG9tIGZyb250IHNwZWFrZXIgPSAoQUNUX0ZST05UfEFDVF9CT1RUT00pICovCisgIEFDVF9TSURFX0JPVFRPTSA9IDB4MjIsICAvKiE8IEJvdHRvbSBzaWRlIHNwZWFrZXIgID0gKEFDVF9TSURFIHxBQ1RfQk9UVE9NKSAqLworICBBQ1RfQkFDS19CT1RUT00gPSAweDIzICAgLyohPCBCb3R0b20gYmFjayBzcGVha2VyICA9IChBQ1RfQkFDSyB8QUNUX0JPVFRPTSkgKi8KIAogfSBBVURJT19DSEFOTkVMX1RZUEU7CiAKLXR5cGVkZWYgZW51bQotewotICBTSUdfVU5LTk9XTiAgICAgICAgICAgICAgICAgPSAtMSwKLSAgU0lHX0lNUExJQ0lUICAgICAgICAgICAgICAgID0gIDAsCi0gIFNJR19FWFBMSUNJVF9CV19DT01QQVRJQkxFICA9ICAxLAotICBTSUdfRVhQTElDSVRfSElFUkFSQ0hJQ0FMICAgPSAgMgordHlwZWRlZiBlbnVtIHsKKyAgU0lHX1VOS05PV04gPSAtMSwKKyAgU0lHX0lNUExJQ0lUID0gMCwKKyAgU0lHX0VYUExJQ0lUX0JXX0NPTVBBVElCTEUgPSAxLAorICBTSUdfRVhQTElDSVRfSElFUkFSQ0hJQ0FMID0gMgogCiB9IFNCUl9QU19TSUdOQUxJTkc7CiAKIC8qKgogICogQXVkaW8gQ29kZWMgZmxhZ3MuCiAgKi8KLSNkZWZpbmUgQUNfRVJfVkNCMTEgICAgIDB4MDAwMDAxICAvKiE8IGFhY1NlY3Rpb25EYXRhUmVzaWxpZW5jZUZsYWcgICAgIGZsYWcgKGZyb20gQVNDKTogMSBtZWFucyB1c2UgdmlydHVhbCBjb2RlYm9va3MgICovCi0jZGVmaW5lIEFDX0VSX1JWTEMgICAgICAweDAwMDAwMiAgLyohPCBhYWNTcGVjdHJhbERhdGFSZXNpbGllbmNlRmxhZyAgICAgZmxhZyAoZnJvbSBBU0MpOiAxIG1lYW5zIHVzZSBodWZmbWFuIGNvZGV3b3JkIHJlb3JkZXJpbmcgKi8KLSNkZWZpbmUgQUNfRVJfSENSICAgICAgIDB4MDAwMDA0ICAvKiE8IGFhY1NlY3Rpb25EYXRhUmVzaWxpZW5jZUZsYWcgICAgIGZsYWcgKGZyb20gQVNDKTogMSBtZWFucyB1c2UgdmlydHVhbCBjb2RlYm9va3MgICovCi0jZGVmaW5lIEFDX1NDQUxBQkxFICAgICAweDAwMDAwOCAgLyohPCBBQUMgU2NhbGFibGUqLwotI2RlZmluZSBBQ19FTEQgICAgICAgICAgMHgwMDAwMTAgIC8qITwgQUFDLUVMRCAqLwotI2RlZmluZSBBQ19MRCAgICAgICAgICAgMHgwMDAwMjAgIC8qITwgQUFDLUxEICovCi0jZGVmaW5lIEFDX0VSICAgICAgICAgICAweDAwMDA0MCAgLyohPCBFUiBzeW50YXggKi8KLSNkZWZpbmUgQUNfQlNBQyAgICAgICAgIDB4MDAwMDgwICAvKiE8IEJTQUMgKi8KLSNkZWZpbmUgQUNfVVNBQyAgICAgICAgIDB4MDAwMTAwICAvKiE8IFVTQUMgKi8KLSNkZWZpbmUgQUNfVVNBQ19UVyAgICAgIDB4MDAwMjAwICAvKiE8IFVTQUMgdGltZSB3YXJwZWQgZmlsdGVyIGJhbmsgaXMgYWN0aXZlICovCi0jZGVmaW5lIEFDX1VTQUNfTk9JU0UgICAweDAwMDQwMCAgLyohPCBVU0FDIG5vaXNlIGZpbGxpbmcgaXMgYWN0aXZlICovCi0jZGVmaW5lIEFDX1VTQUNfSEJFICAgICAweDAwMDgwMCAgLyohPCBVU0FDIGhhcm1vbmljIGJhbmR3aWR0aCBleHRlbnNpb24gaXMgYWN0aXZlICovCi0jZGVmaW5lIEFDX1JTVkQ1MCAgICAgICAweDAwMTAwMCAgLyohPCBSc3ZkNTAgKi8KLSNkZWZpbmUgQUNfU0JSX1BSRVNFTlQgIDB4MDAyMDAwICAvKiE8IFNCUiBwcmVzZW50IGZsYWcgKGZyb20gQVNDKSAgICAgICAgICAgICAqLwotI2RlZmluZSBBQ19TQlJDUkMgICAgICAgMHgwMDQwMDAgIC8qITwgU0JSIENSQyBwcmVzZW50IGZsYWcuIE9ubHkgcmVsZXZhbnQgZm9yIEFBQy1FTEQgZm9yIG5vdy4gKi8KLSNkZWZpbmUgQUNfUFNfUFJFU0VOVCAgIDB4MDA4MDAwICAvKiE8IFBTIHByZXNlbnQgZmxhZyAoZnJvbSBBU0Mgb3IgaW1wbGljaXQpICAqLwotI2RlZmluZSBBQ19NUFNfUFJFU0VOVCAgMHgwMTAwMDAgIC8qITwgTVBTIHByZXNlbnQgZmxhZyAoZnJvbSBBU0Mgb3IgaW1wbGljaXQpICovCi0jZGVmaW5lIEFDX0RSTSAgICAgICAgICAweDAyMDAwMCAgLyohPCBEUk0gYml0IHN0cmVhbSBzeW50YXggKi8KLSNkZWZpbmUgQUNfSU5ERVAgICAgICAgIDB4MDQwMDAwICAvKiE8IEluZGVwZW5kZW5jeSBmbGFnICovCi0jZGVmaW5lIEFDX01QU19SRVMgICAgICAweDA4MDAwMCAgLyohPCBNUFMgcmVzaWR1YWwgaW5kaXZpZHVhbCBjaGFubmVsIGRhdGEuICovCi0jZGVmaW5lIEFDX0RBQiAgICAgICAgICAweDgwMDAwMCAgLyohPCBEQUIgYml0IHN0cmVhbSBzeW50YXggKi8KLSNkZWZpbmUgQUNfTERfTVBTICAgICAweDAxMDAwMDAwICAvKiE8IExvdyBEZWxheSBNUFMuICovCisjZGVmaW5lIEFDX0VSX1ZDQjExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAxIC8qITwgYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAgICAgZmxhZyAoZnJvbSBBU0MpOiAxIG1lYW5zIHVzZSBcCisgICAgICAgICAgICAgIHZpcnR1YWwgY29kZWJvb2tzICAqLworI2RlZmluZSBBQ19FUl9SVkxDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDIgLyohPCBhYWNTcGVjdHJhbERhdGFSZXNpbGllbmNlRmxhZyAgICAgZmxhZyAoZnJvbSBBU0MpOiAxIG1lYW5zIHVzZSBcCisgICAgICAgICAgICAgIGh1ZmZtYW4gY29kZXdvcmQgcmVvcmRlcmluZyAqLworI2RlZmluZSBBQ19FUl9IQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwNCAvKiE8IGFhY1NlY3Rpb25EYXRhUmVzaWxpZW5jZUZsYWcgICAgIGZsYWcgKGZyb20gQVNDKTogMSBtZWFucyB1c2UgXAorICAgICAgICAgICAgICB2aXJ0dWFsIGNvZGVib29rcyAgKi8KKyNkZWZpbmUgQUNfU0NBTEFCTEUgMHgwMDAwMDggICAgLyohPCBBQUMgU2NhbGFibGUqLworI2RlZmluZSBBQ19FTEQgMHgwMDAwMTAgICAgICAgICAvKiE8IEFBQy1FTEQgKi8KKyNkZWZpbmUgQUNfTEQgMHgwMDAwMjAgICAgICAgICAgLyohPCBBQUMtTEQgKi8KKyNkZWZpbmUgQUNfRVIgMHgwMDAwNDAgICAgICAgICAgLyohPCBFUiBzeW50YXggKi8KKyNkZWZpbmUgQUNfQlNBQyAweDAwMDA4MCAgICAgICAgLyohPCBCU0FDICovCisjZGVmaW5lIEFDX1VTQUMgMHgwMDAxMDAgICAgICAgIC8qITwgVVNBQyAqLworI2RlZmluZSBBQ19SU1Y2MDNEQSAweDAwMDIwMCAgICAvKiE8IFJTVkQ2MCAzRCBhdWRpbyAqLworI2RlZmluZSBBQ19IREFBQyAweDAwMDQwMCAgICAgICAvKiE8IEhELUFBQyAqLworI2RlZmluZSBBQ19SU1ZENTAgMHgwMDQwMDAgICAgICAvKiE8IFJzdmQ1MCAqLworI2RlZmluZSBBQ19TQlJfUFJFU0VOVCAweDAwODAwMCAvKiE8IFNCUiBwcmVzZW50IGZsYWcgKGZyb20gQVNDKSAqLworI2RlZmluZSBBQ19TQlJDUkMgXAorICAweDAxMDAwMCAvKiE8IFNCUiBDUkMgcHJlc2VudCBmbGFnLiBPbmx5IHJlbGV2YW50IGZvciBBQUMtRUxEIGZvciBub3cuICovCisjZGVmaW5lIEFDX1BTX1BSRVNFTlQgMHgwMjAwMDAgLyohPCBQUyBwcmVzZW50IGZsYWcgKGZyb20gQVNDIG9yIGltcGxpY2l0KSAgKi8KKyNkZWZpbmUgQUNfTVBTX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwNDAwMDAgICAgICAgICAgICAgICAgICAgIC8qITwgTVBTIHByZXNlbnQgZmxhZyAoZnJvbSBBU0Mgb3IgaW1wbGljaXQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBQ19EUk0gMHgwODAwMDAgICAgICAgLyohPCBEUk0gYml0IHN0cmVhbSBzeW50YXggKi8KKyNkZWZpbmUgQUNfSU5ERVAgMHgxMDAwMDAgICAgIC8qITwgSW5kZXBlbmRlbmN5IGZsYWcgKi8KKyNkZWZpbmUgQUNfTVBFR0RfUkVTIDB4MjAwMDAwIC8qITwgTVBFRy1EIHJlc2lkdWFsIGluZGl2aWR1YWwgY2hhbm5lbCBkYXRhLiAqLworI2RlZmluZSBBQ19TQU9DX1BSRVNFTlQgMHg0MDAwMDAgICAvKiE8IFNBT0MgUHJlc2VudCBGbGFnICovCisjZGVmaW5lIEFDX0RBQiAweDgwMDAwMCAgICAgICAgICAgIC8qITwgREFCIGJpdCBzdHJlYW0gc3ludGF4ICovCisjZGVmaW5lIEFDX0VMRF9ET1dOU0NBTEUgMHgxMDAwMDAwIC8qITwgRUxEIERvd25zY2FsZWQgcGxheW91dCAqLworI2RlZmluZSBBQ19MRF9NUFMgMHgyMDAwMDAwICAgICAgICAvKiE8IExvdyBEZWxheSBNUFMuICovCisjZGVmaW5lIEFDX0RSQ19QUkVTRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4NDAwMDAwMCAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbCAoRFJDKSBkYXRhIGZvdW5kLiBcCisgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQUNfVVNBQ19TQ0ZHSTMgXAorICAweDgwMDAwMDAgLyohPCBVU0FDIGZsYWc6IElmIHN0ZXJlb0NvbmZpZ0luZGV4IGlzIDMgdGhlIGZsYWcgaXMgc2V0LiAqLworLyoqCisgKiBBdWRpbyBDb2RlYyBmbGFncyAocmVjb25maWd1cmF0aW9uKS4KKyAqLworI2RlZmluZSBBQ19DTV9ERVRfQ0ZHX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAxIC8qITwgQ29uZmlnIG1vZGUgc2lnbmFsaXplcyB0aGUgY2FsbGJhY2sgdG8gd29yayBpbiBjb25maWcgY2hhbmdlIFwKKyAgICAgICAgICAgICAgZGV0ZWN0aW9uIG1vZGUgKi8KKyNkZWZpbmUgQUNfQ01fQUxMT0NfTUVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAyIC8qITwgQ29uZmlnIG1vZGUgc2lnbmFsaXplcyB0aGUgY2FsbGJhY2sgdG8gd29yayBpbiBtZW1vcnkgXAorICAgICAgICAgICAgICBhbGxvY2F0aW9uIG1vZGUgKi8KIAorLyoqCisgKiBBdWRpbyBDb2RlYyBmbGFncyAoZWxlbWVudCBzcGVjaWZpYykuCisgKi8KKyNkZWZpbmUgQUNfRUxfVVNBQ19UVyAweDAwMDAwMSAgICAvKiE8IFVTQUMgdGltZSB3YXJwZWQgZmlsdGVyIGJhbmsgaXMgYWN0aXZlICovCisjZGVmaW5lIEFDX0VMX1VTQUNfTk9JU0UgMHgwMDAwMDIgLyohPCBVU0FDIG5vaXNlIGZpbGxpbmcgaXMgYWN0aXZlICovCisjZGVmaW5lIEFDX0VMX1VTQUNfSVRFUyAweDAwMDAwNCAgLyohPCBVU0FDIFNCUiBpbnRlci1URVMgdG9vbCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgQUNfRUxfVVNBQ19QVkMgXAorICAweDAwMDAwOCAvKiE8IFVTQUMgU0JSIHByZWRpY3RpdmUgdmVjdG9yIGNvZGluZyB0b29sIGlzIGFjdGl2ZSAqLworI2RlZmluZSBBQ19FTF9VU0FDX01QUzIxMiAweDAwMDAxMCAvKiE8IFVTQUMgTVBTMjEyIHRvb2wgaXMgYWN0aXZlICovCisjZGVmaW5lIEFDX0VMX1VTQUNfTEZFIDB4MDAwMDIwICAgIC8qITwgVVNBQyBlbGVtZW50IGlzIExGRSAqLworI2RlZmluZSBBQ19FTF9VU0FDX0NQX1BPU1NJQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwNDAgLyohPCBVU0FDIG1heSB1c2UgQ29tcGxleCBTdGVyZW8gUHJlZGljdGlvbiBpbiB0aGlzIGNoYW5uZWwgZWxlbWVudCBcCisgICAgICAgICAgICAqLworI2RlZmluZSBBQ19FTF9FTkhBTkNFRF9OT0lTRSAweDAwMDA4MCAgIC8qITwgRW5oYW5jZWQgbm9pc2UgZmlsbGluZyovCisjZGVmaW5lIEFDX0VMX0lHRl9BRlRFUl9UTlMgMHgwMDAxMDAgICAgLyohPCBJR0YgYWZ0ZXIgVE5TICovCisjZGVmaW5lIEFDX0VMX0lHRl9JTkRFUF9USUxJTkcgMHgwMDAyMDAgLyohPCBJR0YgaW5kZXBlbmRlbnQgdGlsaW5nICovCisjZGVmaW5lIEFDX0VMX0lHRl9VU0VfRU5GIDB4MDAwNDAwICAgICAgLyohPCBJR0YgdXNlIGVuaGFuY2VkIG5vaXNlIGZpbGxpbmcgKi8KKyNkZWZpbmUgQUNfRUxfRlVMTEJBTkRMUEQgMHgwMDA4MDAgICAgICAvKiE8IGVuYWJsZSBmdWxsYmFuZCBMUEQgdG9vbHMgKi8KKyNkZWZpbmUgQUNfRUxfTFBEU1RFUkVPSURYIDB4MDAxMDAwICAgICAvKiE8IExQRC1zdGVyZW8tdG9vbCBzdGVyZW8gaW5kZXggKi8KKyNkZWZpbmUgQUNfRUxfTEZFIDB4MDAyMDAwICAgICAgICAgICAgICAvKiE8IFRoZSBlbGVtZW50IGlzIG9mIHR5cGUgTEZFLiAqLwogCiAvKiBDT0RFUl9DT05GSUc6OmZsYWdzICovCi0jZGVmaW5lIENDX01QRUdfSUQgICAgICAgICAweDAwMTAwMDAwCi0jZGVmaW5lIENDX0lTX0JBU0VMQVlFUiAgICAweDAwMjAwMDAwCi0jZGVmaW5lIENDX1BST1RFQ1RJT04gICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIENDX1NCUiAgICAgICAgICAgICAweDAwODAwMDAwCi0jZGVmaW5lIENDX1NCUkNSQyAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIENDX1JWTEMgICAgICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIENDX1ZDQjExICAgICAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIENDX0hDUiAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIENDX01QRUdfSUQgMHgwMDEwMDAwMAorI2RlZmluZSBDQ19JU19CQVNFTEFZRVIgMHgwMDIwMDAwMAorI2RlZmluZSBDQ19QUk9URUNUSU9OIDB4MDA0MDAwMDAKKyNkZWZpbmUgQ0NfU0JSIDB4MDA4MDAwMDAKKyNkZWZpbmUgQ0NfU0JSQ1JDIDB4MDAwMTAwMDAKKyNkZWZpbmUgQ0NfU0FDIDB4MDAwMjAwMDAKKyNkZWZpbmUgQ0NfUlZMQyAweDAxMDAwMDAwCisjZGVmaW5lIENDX1ZDQjExIDB4MDIwMDAwMDAKKyNkZWZpbmUgQ0NfSENSIDB4MDQwMDAwMDAKICNkZWZpbmUgQ0NfUFNFVURPX1NVUlJPVU5EIDB4MDgwMDAwMDAKLSNkZWZpbmUgQ0NfVVNBQ19OT0lTRSAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgQ0NfVVNBQ19UVyAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgQ0NfVVNBQ19IQkUgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQ0NfVVNBQ19OT0lTRSAweDEwMDAwMDAwCisjZGVmaW5lIENDX1VTQUNfVFcgMHgyMDAwMDAwMAorI2RlZmluZSBDQ19VU0FDX0hCRSAweDQwMDAwMDAwCiAKIC8qKiBHZW5lcmljIGF1ZGlvIGNvZGVyIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLiAqLwogdHlwZWRlZiBzdHJ1Y3QgewotICBBVURJT19PQkpFQ1RfVFlQRSBhb3Q7ICAgICAgICAgLyoqPCBBdWRpbyBPYmplY3QgVHlwZSAoQU9UKS4gICAgICAgICAgICovCi0gIEFVRElPX09CSkVDVF9UWVBFIGV4dEFPVDsgICAgICAvKio8IEV4dGVuc2lvbiBBdWRpbyBPYmplY3QgVHlwZSAoU0JSKS4gKi8KLSAgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlOyAgICAgIC8qKjwgQ2hhbm5lbCBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICBJTlQgICAgICAgIHNhbXBsaW5nUmF0ZTsgICAgICAgLyoqPCBTYW1wbGluZyByYXRlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIElOVCAgICAgICAgZXh0U2FtcGxpbmdSYXRlOyAgICAvKio8IEV4dGVuZGVkIHNhbXBsZXJhdGUgKFNCUikuICAgICAgICAgKi8KLSAgSU5UICAgICAgICBiaXRSYXRlOyAgICAgICAgICAgIC8qKjwgQXZlcmFnZSBiaXRyYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICBpbnQgICAgICAgIHNhbXBsZXNQZXJGcmFtZTsgICAgLyoqPCBOdW1iZXIgb2YgUENNIHNhbXBsZXMgcGVyIGNvZGVjIGZyYW1lIGFuZCBhdWRpbyBjaGFubmVsLiAqLwotICBpbnQgICAgICAgIG5vQ2hhbm5lbHM7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuICAgICAgICAgICovCi0gIGludCAgICAgICAgYml0c0ZyYW1lOwotICBpbnQgICAgICAgIG5TdWJGcmFtZXM7ICAgICAgICAgLyoqPCBBbW91bnQgb2YgZW5jb2RlciBzdWJmcmFtZXMuIDEgbWVhbnMgbm8gc3ViZnJhbWluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgaW50ICAgICAgICBCU0FDbnVtT2ZTdWJGcmFtZTsgIC8qKjwgVGhlIG51bWJlciBvZiB0aGUgc3ViLWZyYW1lcyB3aGljaCBhcmUgZ3JvdXBlZCBhbmQgdHJhbnNtaXR0ZWQgaW4gYSBzdXBlci1mcmFtZSAoQlNBQykuICovCi0gIGludCAgICAgICAgQlNBQ2xheWVyTGVuZ3RoOyAgICAvKio8IFRoZSBhdmVyYWdlIGxlbmd0aCBvZiB0aGUgbGFyZ2Utc3RlcCBsYXllcnMgaW4gYnl0ZXMgKEJTQUMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBVSU5UICAgICAgIGZsYWdzOyAgICAgICAgICAgICAgLyoqPCBmbGFncyAqLwotICBVQ0hBUiAgICAgIG1hdHJpeE1peGRvd25BOyAgICAgLyoqPCBNYXRyaXggbWl4ZG93biBpbmRleCB0byBwdXQgaW50byBQQ0UuIERlZmF1bHQgdmFsdWUgMCBtZWFucyBubyBtaXhkb3duIGNvZWZmaWNpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCB2YWx1ZXMgYXJlIDEtNCB3aGljaCBjb3JyZXNwb25kIHRvIG1hdHJpeF9taXhkb3duX2lkeCAwLTMuICovCi0gIFVDSEFSICAgICAgaGVhZGVyUGVyaW9kOyAgICAgICAvKio8IEZyYW1lIHBlcmlvZCBmb3Igc2VuZGluZyBpbiBiYW5kIGNvbmZpZ3VyYXRpb24gYnVmZmVycyBpbiB0aGUgdHJhbnNwb3J0IGxheWVyLiAqLworICBBVURJT19PQkpFQ1RfVFlQRSBhb3Q7ICAgICAvKio8IEF1ZGlvIE9iamVjdCBUeXBlIChBT1QpLiAgICAgICAgICAgKi8KKyAgQVVESU9fT0JKRUNUX1RZUEUgZXh0QU9UOyAgLyoqPCBFeHRlbnNpb24gQXVkaW8gT2JqZWN0IFR5cGUgKFNCUikuICovCisgIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZTsgIC8qKjwgQ2hhbm5lbCBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAqLworICBVQ0hBUiBjaGFubmVsQ29uZmlnWmVybzsgICAvKio8IFVzZSBjaGFubmVsIGNvbmZpZyB6ZXJvICsgcGNlIGFsdGhvdWdoIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgY2hhbm5lbCBjb25maWcgY291bGQgYmUgc2lnbmFsZWQuICovCisgIElOVCBzYW1wbGluZ1JhdGU7ICAgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZS4gICAgICAgICAgICAgICAgICAgICAqLworICBJTlQgZXh0U2FtcGxpbmdSYXRlOyAgICAgICAvKio8IEV4dGVuZGVkIHNhbXBsZXJhdGUgKFNCUikuICAgICAgICAgKi8KKyAgSU5UIGRvd25zY2FsZVNhbXBsaW5nUmF0ZTsgLyoqPCBEb3duc2NhbGUgc2FtcGxpbmcgcmF0ZSAoRUxEIGRvd25zY2FsZWQgbW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIElOVCBiaXRSYXRlOyAgICAgICAgICAgICAgIC8qKjwgQXZlcmFnZSBiaXRyYXRlLiAgICAgICAgICAgICAgICAgICAqLworICBpbnQgc2FtcGxlc1BlckZyYW1lOyAvKio8IE51bWJlciBvZiBQQ00gc2FtcGxlcyBwZXIgY29kZWMgZnJhbWUgYW5kIGF1ZGlvCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuICovCisgIGludCBub0NoYW5uZWxzOyAgICAgIC8qKjwgTnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLiAgICAgICAgICAqLworICBpbnQgYml0c0ZyYW1lOworICBpbnQgblN1YkZyYW1lczsgLyoqPCBBbW91bnQgb2YgZW5jb2RlciBzdWJmcmFtZXMuIDEgbWVhbnMgbm8gc3ViZnJhbWluZy4gKi8KKyAgaW50IEJTQUNudW1PZlN1YkZyYW1lOyAvKio8IFRoZSBudW1iZXIgb2YgdGhlIHN1Yi1mcmFtZXMgd2hpY2ggYXJlIGdyb3VwZWQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXR0ZWQgaW4gYSBzdXBlci1mcmFtZSAoQlNBQykuICovCisgIGludCBCU0FDbGF5ZXJMZW5ndGg7IC8qKjwgVGhlIGF2ZXJhZ2UgbGVuZ3RoIG9mIHRoZSBsYXJnZS1zdGVwIGxheWVycyBpbiBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAoQlNBQykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVJTlQgZmxhZ3M7ICAgICAgICAgIC8qKjwgZmxhZ3MgKi8KKyAgVUNIQVIgbWF0cml4TWl4ZG93bkE7IC8qKjwgTWF0cml4IG1peGRvd24gaW5kZXggdG8gcHV0IGludG8gUENFLiBEZWZhdWx0IHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwIG1lYW5zIG5vIG1peGRvd24gY29lZmZpY2llbnQsIHZhbGlkIHZhbHVlcyBhcmUgMS00CisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBjb3JyZXNwb25kIHRvIG1hdHJpeF9taXhkb3duX2lkeCAwLTMuICovCisgIFVDSEFSIGhlYWRlclBlcmlvZDsgICAvKio8IEZyYW1lIHBlcmlvZCBmb3Igc2VuZGluZyBpbiBiYW5kIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMgaW4gdGhlIHRyYW5zcG9ydCBsYXllci4gKi8KIAotICBVQ0hBUiAgICAgIHN0ZXJlb0NvbmZpZ0luZGV4OyAvKio8IFVTQUMgTVBTIHN0ZXJlbyBtb2RlICovCi0gIFVDSEFSICAgICAgc2JyTW9kZTsgICAgICAgICAgIC8qKjwgVVNBQyBTQlIgbW9kZSAqLwotICBTQlJfUFNfU0lHTkFMSU5HIHNiclNpZ25hbGluZzsvKio8IDA6IGltcGxpY2l0IHNpZ25hbGluZywgMTogYmFja3dhcmRzIGNvbXBhdGlibGUgZXhwbGljaXQgc2lnbmFsaW5nLCAyOiBoaWVyYXJjaWNhbCBleHBsaWNpdCBzaWduYWxpbmcgKi8KKyAgVUNIQVIgc3RlcmVvQ29uZmlnSW5kZXg7ICAgICAgIC8qKjwgVVNBQyBNUFMgc3RlcmVvIG1vZGUgKi8KKyAgVUNIQVIgc2JyTW9kZTsgICAgICAgICAgICAgICAgIC8qKjwgVVNBQyBTQlIgbW9kZSAqLworICBTQlJfUFNfU0lHTkFMSU5HIHNiclNpZ25hbGluZzsgLyoqPCAwOiBpbXBsaWNpdCBzaWduYWxpbmcsIDE6IGJhY2t3YXJkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSBleHBsaWNpdCBzaWduYWxpbmcsIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWVyYXJjaWNhbCBleHBsaWNpdCBzaWduYWxpbmcgKi8KIAotICBVQ0hBUiAgICAgIHNiclByZXNlbnQ7Ci0gIFVDSEFSICAgICAgcHNQcmVzZW50OworICBVQ0hBUiByYXdDb25maWdbNjRdOyAvKio8IHJhdyBjb2RlYyBzcGVjaWZpYyBjb25maWcgYXMgYml0IHN0cmVhbSAqLworICBpbnQgcmF3Q29uZmlnQml0czsgICAvKio8IFNpemUgb2YgcmF3Q29uZmlnIGluIGJpdHMgKi8KKworICBVQ0hBUiBzYnJQcmVzZW50OworICBVQ0hBUiBwc1ByZXNlbnQ7CiB9IENPREVSX0NPTkZJRzsKIAorI2RlZmluZSBVU0FDX0lEX0JJVCAxNiAvKiogVVNBQyBlbGVtZW50IElEcyBzdGFydCBhdCBVU0FDX0lEX0JJVCAqLworCiAvKiogTVA0IEVsZW1lbnQgSURzLiAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIElEX05PTkUgPSAtMSwgICAvKio8IEludmFsaWQgRWxlbWVudCBoZWxwZXIgSUQuICAgICAgICAgICAgICovCi0gIElEX1NDRSA9IDAsICAgICAvKio8IFNpbmdsZSBDaGFubmVsIEVsZW1lbnQuICAgICAgICAgICAgICAgICovCi0gIElEX0NQRSA9IDEsICAgICAvKio8IENoYW5uZWwgUGFpciBFbGVtZW50LiAgICAgICAgICAgICAgICAgICovCi0gIElEX0NDRSA9IDIsICAgICAvKio8IENvdXBsaW5nIENoYW5uZWwgRWxlbWVudC4gICAgICAgICAgICAgICovCi0gIElEX0xGRSA9IDMsICAgICAvKio8IExGRSBDaGFubmVsIEVsZW1lbnQuICAgICAgICAgICAgICAgICAgICovCi0gIElEX0RTRSA9IDQsICAgICAvKio8IEN1cnJlbnRseSBvbmUgRGF0YSBTdHJlYW0gRWxlbWVudCBmb3IgYW5jaWxsYXJ5IGRhdGEgaXMgc3VwcG9ydGVkLiAqLwotICBJRF9QQ0UgPSA1LCAgICAgLyoqPCBQcm9ncmFtIENvbmZpZyBFbGVtZW50LiAgICAgICAgICAgICAgICAqLwotICBJRF9GSUwgPSA2LCAgICAgLyoqPCBGaWxsIEVsZW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBJRF9FTkQgPSA3LCAgICAgLyoqPCBBcm5pZSAoRW5kIEVsZW1lbnQgPSBUZXJtaW5hdG9yKS4gICAgICAqLwotICBJRF9FWFQgPSA4LCAgICAgLyoqPCBFeHRlbnNpb24gUGF5bG9hZCAoRVIgb25seSkuICAgICAgICAgICAqLwotICBJRF9TQ0FMID0gOSwgICAgLyoqPCBBQUMgc2NhbGFibGUgZWxlbWVudCAoRVIgb25seSkuICAgICAgICAqLwordHlwZWRlZiBlbnVtIHsKKyAgLyogbXA0IGVsZW1lbnQgSURzICovCisgIElEX05PTkUgPSAtMSwgLyoqPCBJbnZhbGlkIEVsZW1lbnQgaGVscGVyIElELiAgICAgICAgICAgICAqLworICBJRF9TQ0UgPSAwLCAgIC8qKjwgU2luZ2xlIENoYW5uZWwgRWxlbWVudC4gICAgICAgICAgICAgICAgKi8KKyAgSURfQ1BFID0gMSwgICAvKio8IENoYW5uZWwgUGFpciBFbGVtZW50LiAgICAgICAgICAgICAgICAgICovCisgIElEX0NDRSA9IDIsICAgLyoqPCBDb3VwbGluZyBDaGFubmVsIEVsZW1lbnQuICAgICAgICAgICAgICAqLworICBJRF9MRkUgPSAzLCAgIC8qKjwgTEZFIENoYW5uZWwgRWxlbWVudC4gICAgICAgICAgICAgICAgICAgKi8KKyAgSURfRFNFID0gNCwgICAvKio8IEN1cnJlbnRseSBvbmUgRGF0YSBTdHJlYW0gRWxlbWVudCBmb3IgYW5jaWxsYXJ5IGRhdGEgaXMKKyAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuICovCisgIElEX1BDRSA9IDUsICAgLyoqPCBQcm9ncmFtIENvbmZpZyBFbGVtZW50LiAgICAgICAgICAgICAgICAqLworICBJRF9GSUwgPSA2LCAgIC8qKjwgRmlsbCBFbGVtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSURfRU5EID0gNywgICAvKio8IEFybmllIChFbmQgRWxlbWVudCA9IFRlcm1pbmF0b3IpLiAgICAgICovCisgIElEX0VYVCA9IDgsICAgLyoqPCBFeHRlbnNpb24gUGF5bG9hZCAoRVIgb25seSkuICAgICAgICAgICAqLworICBJRF9TQ0FMID0gOSwgIC8qKjwgQUFDIHNjYWxhYmxlIGVsZW1lbnQgKEVSIG9ubHkpLiAgICAgICAgKi8KKyAgLyogVVNBQyBlbGVtZW50IElEcyAqLworICBJRF9VU0FDX1NDRSA9IDAgKyBVU0FDX0lEX0JJVCwgLyoqPCBTaW5nbGUgQ2hhbm5lbCBFbGVtZW50LiAgICAgICAgICAgICAgICAqLworICBJRF9VU0FDX0NQRSA9IDEgKyBVU0FDX0lEX0JJVCwgLyoqPCBDaGFubmVsIFBhaXIgRWxlbWVudC4gICAgICAgICAgICAgICAgICAqLworICBJRF9VU0FDX0xGRSA9IDIgKyBVU0FDX0lEX0JJVCwgLyoqPCBMRkUgQ2hhbm5lbCBFbGVtZW50LiAgICAgICAgICAgICAgICAgICAqLworICBJRF9VU0FDX0VYVCA9IDMgKyBVU0FDX0lEX0JJVCwgLyoqPCBFeHRlbnNpb24gRWxlbWVudC4gICAgICAgICAgICAgICAgICAgICAqLworICBJRF9VU0FDX0VORCA9IDQgKyBVU0FDX0lEX0JJVCwgLyoqPCBBcm5pZSAoRW5kIEVsZW1lbnQgPSBUZXJtaW5hdG9yKS4gICAgICAqLwogICBJRF9MQVNUCiB9IE1QNF9FTEVNRU5UX0lEOwogCi0jZGVmaW5lIElTX0NIQU5ORUxfRUxFTUVOVChlbGVtZW50SWQpIFwKLSAgKChlbGVtZW50SWQpID09IElEX1NDRSBcCi18fCAoZWxlbWVudElkKSA9PSBJRF9DUEUgXAotfHwgKGVsZW1lbnRJZCkgPT0gSURfTEZFKQorLyogdXNhY0NvbmZpZ0V4dFR5cGUgcS52LiBJU08vSUVDIERJUyAyMzAwOC0zIFRhYmxlIDUyICBhbmQgIElTTy9JRUMgRkRJUworICogMjMwMDMtMzoyMDExKEUpIFRhYmxlIDc0Ki8KK3R5cGVkZWYgZW51bSB7CisgIC8qIFVTQUMgYW5kIFJTVkQ2MCAzREEgKi8KKyAgSURfQ09ORklHX0VYVF9GSUxMID0gMCwKKyAgLyogUlNWRDYwIDNEQSAqLworICBJRF9DT05GSUdfRVhUX0RPV05NSVggPSAxLAorICBJRF9DT05GSUdfRVhUX0xPVURORVNTX0lORk8gPSAyLAorICBJRF9DT05GSUdfRVhUX0FVRElPU0NFTkVfSU5GTyA9IDMsCisgIElEX0NPTkZJR19FWFRfSE9BX01BVFJJWCA9IDQsCisgIElEX0NPTkZJR19FWFRfU0lHX0dST1VQX0lORk8gPSA2CisgIC8qIDUtMTI3ID0+IHJlc2VydmVkIGZvciBJU08gdXNlICovCisgIC8qID4gMTI4ID0+IHJlc2VydmVkIGZvciB1c2Ugb3V0c2lkZSBvZiBJU08gc2NvcGUgKi8KK30gQ09ORklHX0VYVF9JRDsKIAotI2RlZmluZSBFWFRfSURfQklUUyA0ICAvKio8IFNpemUgaW4gYml0cyBvZiBleHRlbnNpb24gcGF5bG9hZCB0eXBlIHRhZ3MuICovCisjZGVmaW5lIElTX0NIQU5ORUxfRUxFTUVOVChlbGVtZW50SWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoZWxlbWVudElkKSA9PSBJRF9TQ0UgfHwgKGVsZW1lbnRJZCkgPT0gSURfQ1BFIHx8IChlbGVtZW50SWQpID09IElEX0xGRSB8fCBcCisgICAoZWxlbWVudElkKSA9PSBJRF9VU0FDX1NDRSB8fCAoZWxlbWVudElkKSA9PSBJRF9VU0FDX0NQRSB8fCAgICAgICAgICAgICAgICBcCisgICAoZWxlbWVudElkKSA9PSBJRF9VU0FDX0xGRSkKKworI2RlZmluZSBJU19NUDRfQ0hBTk5FTF9FTEVNRU5UKGVsZW1lbnRJZCkgXAorICAoKGVsZW1lbnRJZCkgPT0gSURfU0NFIHx8IChlbGVtZW50SWQpID09IElEX0NQRSB8fCAoZWxlbWVudElkKSA9PSBJRF9MRkUpCisKKyNkZWZpbmUgRVhUX0lEX0JJVFMgNCAvKio8IFNpemUgaW4gYml0cyBvZiBleHRlbnNpb24gcGF5bG9hZCB0eXBlIHRhZ3MuICovCiAKIC8qKiBFeHRlbnNpb24gcGF5bG9hZCB0eXBlcy4gKi8KIHR5cGVkZWYgZW51bSB7Ci0gIEVYVF9GSUwgICAgICAgICAgID0gMHgwMCwKLSAgRVhUX0ZJTExfREFUQSAgICAgPSAweDAxLAotICBFWFRfREFUQV9FTEVNRU5UICA9IDB4MDIsCi0gIEVYVF9EQVRBX0xFTkdUSCAgID0gMHgwMywKLSAgRVhUX0xEU0FDX0RBVEEgICAgPSAweDA5LAotICBFWFRfU0FPQ19EQVRBICAgICA9IDB4MGEsCisgIEVYVF9GSUwgPSAweDAwLAorICBFWFRfRklMTF9EQVRBID0gMHgwMSwKKyAgRVhUX0RBVEFfRUxFTUVOVCA9IDB4MDIsCisgIEVYVF9EQVRBX0xFTkdUSCA9IDB4MDMsCisgIEVYVF9VTklfRFJDID0gMHgwNCwKKyAgRVhUX0xEU0FDX0RBVEEgPSAweDA5LAorICBFWFRfU0FPQ19EQVRBID0gMHgwYSwKICAgRVhUX0RZTkFNSUNfUkFOR0UgPSAweDBiLAotICBFWFRfU0FDX0RBVEEgICAgICA9IDB4MGMsCi0gIEVYVF9TQlJfREFUQSAgICAgID0gMHgwZCwKLSAgRVhUX1NCUl9EQVRBX0NSQyAgPSAweDBlCisgIEVYVF9TQUNfREFUQSA9IDB4MGMsCisgIEVYVF9TQlJfREFUQSA9IDB4MGQsCisgIEVYVF9TQlJfREFUQV9DUkMgPSAweDBlCiB9IEVYVF9QQVlMT0FEX1RZUEU7CiAKKyNkZWZpbmUgSVNfVVNBQ19DSEFOTkVMX0VMRU1FTlQoZWxlbWVudElkKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChlbGVtZW50SWQpID09IElEX1VTQUNfU0NFIHx8IChlbGVtZW50SWQpID09IElEX1VTQUNfQ1BFIHx8IFwKKyAgIChlbGVtZW50SWQpID09IElEX1VTQUNfTEZFKQorCisvKiogTVBFRy1EIFVTQUMgJiBSU1ZENjAgM0QgYXVkaW8gRXh0ZW5zaW9uIEVsZW1lbnQgVHlwZXMuICovCit0eXBlZGVmIGVudW0geworICAvKiB1c2FjICovCisgIElEX0VYVF9FTEVfRklMTCA9IDB4MDAsCisgIElEX0VYVF9FTEVfTVBFR1MgPSAweDAxLAorICBJRF9FWFRfRUxFX1NBT0MgPSAweDAyLAorICBJRF9FWFRfRUxFX0FVRElPUFJFUk9MTCA9IDB4MDMsCisgIElEX0VYVF9FTEVfVU5JX0RSQyA9IDB4MDQsCisgIC8qIHJzdjYwM2RhICovCisgIElEX0VYVF9FTEVfT0JKX01FVEFEQVRBID0gMHgwNSwKKyAgSURfRVhUX0VMRV9TQU9DXzNEID0gMHgwNiwKKyAgSURfRVhUX0VMRV9IT0EgPSAweDA3LAorICBJRF9FWFRfRUxFX0ZNVF9DTlZSVFIgPSAweDA4LAorICBJRF9FWFRfRUxFX01DVCA9IDB4MDksCisgIElEX0VYVF9FTEVfRU5IQU5DRURfT0JKX01FVEFEQVRBID0gMHgwZCwKKyAgLyogcmVzZXJ2ZWQgZm9yIHVzZSBvdXRzaWRlIG9mIElTTyBzY29wZSAqLworICBJRF9FWFRfRUxFX1ZSX01FVEFEQVRBID0gMHg4MSwKKyAgSURfRVhUX0VMRV9VTktOT1dOID0gMHhGRgorfSBVU0FDX0VYVF9FTEVNRU5UX1RZUEU7CiAKIC8qKgogICogUHJvcHJpZXRhcnkgcmF3IHBhY2tldCBmaWxlIGNvbmZpZ3VyYXRpb24gZGF0YSB0eXBlIGlkZW50aWZpZXIuCiAgKi8KLXR5cGVkZWYgZW51bQotewotICBUQ19OT1RISU5HID0gMCwgICAgIC8qIE5vIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlIC0+IGluLWJhbmQgY29uZmlndXJhdGlvbi4gICAqLwotICBUQ19SQVdfQVNDLCAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gZGF0YSBmaWVsZCBpcyBhIHJhdyBBdWRpb1NwZWNpZmljQ29uZmlnLiAqLwotICBUQ19SQVdfU01DLCAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gZGF0YSBmaWVsZCBpcyBhIHJhdyBTdHJlYW1NdXhDb25maWcuICAgICAqLwotICBUQ19SQVdfU0RDICAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gZGF0YSBmaWVsZCBpcyBhIHJhdyBEcm0gU0RDLiAgICAgICAgICAgICAqLwordHlwZWRlZiBlbnVtIHsKKyAgVENfTk9USElORyA9IDAsICAvKiBObyBjb25maWd1cmF0aW9uIGF2YWlsYWJsZSAtPiBpbi1iYW5kIGNvbmZpZ3VyYXRpb24uICAgKi8KKyAgVENfUkFXX0FEVFMgPSAyLCAvKiBUcmFuc2ZlciB0eXBlIGlzIEFEVFMuICovCisgIFRDX1JBV19MQVRNX01DUDEgPSA2LCAvKiBUcmFuc2ZlciB0eXBlIGlzIExBVE0gd2l0aCBTTUMgcHJlc2VudC4gICAgKi8KKyAgVENfUkFXX1NEQyA9IDIxICAgICAgIC8qIENvbmZpZ3VyYXRpb24gZGF0YSBmaWVsZCBpcyBEcm0gU0RDLiAgICAgICAgICAgICAqLwogCiB9IFRQX0NPTkZJR19UWVBFOwogCkBAIC00MDgsMTEwICs1MjEsMTcyIEBACiAgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgKi8KIC8qIFxjb25kICovCi0jZGVmaW5lIE1PRFVMRV9JRF9NQVNLICAoMHgwMDAwMDBmZikKLSNkZWZpbmUgTU9EVUxFX0lEX1NISUZUICgyNCkKIAogdHlwZWRlZiBlbnVtIHsKLSAgRkRLX05PTkUgICA9IDAsCi0gIEZES19UT09MUyAgPSAxLAorICBGREtfTk9ORSA9IDAsCisgIEZES19UT09MUyA9IDEsCiAgIEZES19TWVNMSUIgPSAyLAogICBGREtfQUFDREVDID0gMywKICAgRkRLX0FBQ0VOQyA9IDQsCiAgIEZES19TQlJERUMgPSA1LAogICBGREtfU0JSRU5DID0gNiwKLSAgRkRLX1RQREVDICA9IDcsCi0gIEZES19UUEVOQyAgPSA4LAorICBGREtfVFBERUMgPSA3LAorICBGREtfVFBFTkMgPSA4LAogICBGREtfTVBTREVDID0gOSwKLSAgRkRLX01QRUdGSUxFUkVBRCAgPSAxMCwKKyAgRkRLX01QRUdGSUxFUkVBRCA9IDEwLAogICBGREtfTVBFR0ZJTEVXUklURSA9IDExLAotICBGREtfTVAyREVDID0gMTIsCi0gIEZES19EQUJERUMgPSAxMywKLSAgRkRLX0RBQlBBUlNFID0gMTQsCi0gIEZES19EUk1ERUMgPSAxNSwKLSAgRkRLX0RSTVBBUlNFID0gMTYsCi0gIEZES19BQUNMREVOQyA9IDE3LAotICBGREtfTVAyRU5DID0gMTgsCi0gIEZES19NUDNFTkMgPSAxOSwKLSAgRkRLX01QM0RFQyA9IDIwLAotICBGREtfTVAzSEVBRFBIT05FID0gMjEsCi0gIEZES19NUDNTREVDID0gMjIsCi0gIEZES19NUDNTRU5DID0gMjMsCi0gIEZES19FQUVDICAgID0gMjQsCi0gIEZES19EQUJFTkMgID0gMjUsCi0gIEZES19ETUJERUMgID0gMjYsCi0gIEZES19GRFJFVkVSQiA9IDI3LAotICBGREtfRFJNRU5DICA9IDI4LAotICBGREtfTUVUQURBVEFUUkFOU0NPREVSID0gMjksCi0gIEZES19BQzNERUMgPSAzMCwKICAgRkRLX1BDTURNWCA9IDMxLAorICBGREtfTVBTRU5DID0gMzQsCisgIEZES19URExJTUlUID0gMzUsCisgIEZES19VTklEUkNERUMgPSAzOCwKIAogICBGREtfTU9EVUxFX0xBU1QKIAogfSBGREtfTU9EVUxFX0lEOwogCiAvKiBBQUMgY2FwYWJpbGl0eSBmbGFncyAqLwotI2RlZmluZSBDQVBGX0FBQ19MQyAgICAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBMb3cgQ29tcGxleGl0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfRVJfQUFDX0xEICAgICAgICAweDAwMDAwMDAyICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIExvdyBEZWxheSB3aXRoIEVycm9yIFJlc2lsaWVuY2UgdG9vbHMuICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9FUl9BQUNfU0NBTCAgICAgIDB4MDAwMDAwMDQgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgU2NhbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDQVBGX0VSX0FBQ19MQyAgICAgICAgMHgwMDAwMDAwOCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBMb3cgQ29tcGxleGl0eSB3aXRoIEVycm9yIFJlc2lsaWVuY2UgdG9vbHMuICovCi0jZGVmaW5lIENBUEZfQUFDXzQ4MCAgICAgICAgICAweDAwMDAwMDEwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIHdpdGggNDgwIGZyYW1lbGVuZ3RoLiAgKi8KLSNkZWZpbmUgQ0FQRl9BQUNfNTEyICAgICAgICAgIDB4MDAwMDAwMjAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgd2l0aCA1MTIgZnJhbWVsZW5ndGguICAqLwotI2RlZmluZSBDQVBGX0FBQ185NjAgICAgICAgICAgMHgwMDAwMDA0MCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyB3aXRoIDk2MCBmcmFtZWxlbmd0aC4gICovCi0jZGVmaW5lIENBUEZfQUFDXzEwMjQgICAgICAgICAweDAwMDAwMDgwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIHdpdGggMTAyNCBmcmFtZWxlbmd0aC4gKi8KLSNkZWZpbmUgQ0FQRl9BQUNfSENSICAgICAgICAgIDB4MDAwMDAxMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgd2l0aCBIdWZmbWFuIENvZGV3b3JkIFJlb3JkZXJpbmcuICAgICovCi0jZGVmaW5lIENBUEZfQUFDX1ZDQjExICAgICAgICAweDAwMDAwMjAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIFZpcnR1YWwgQ29kZWJvb2sgMTEuICAgICovCi0jZGVmaW5lIENBUEZfQUFDX1JWTEMgICAgICAgICAweDAwMDAwNDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIFJldmVyc2libGUgVmFyaWFibGUgTGVuZ3RoIENvZGluZy4gICAqLwotI2RlZmluZSBDQVBGX0FBQ19NUEVHNCAgICAgICAgMHgwMDAwMDgwMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIE1QRUcgZmlsZSBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9BQUNfRFJDICAgICAgICAgIDB4MDAwMDEwMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgRHluYW1pYyBSYW5nZSBDb250cm9sLiAqLwotI2RlZmluZSBDQVBGX0FBQ19DT05DRUFMTUVOVCAgMHgwMDAwMjAwMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBjb25jZWFsbWVudC4gICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfQUFDX0RSTV9CU0ZPUk1BVCAweDAwMDA0MDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIERSTSBiaXN0cmVhbSBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfRVJfQUFDX0VMRCAgICAgICAweDAwMDA4MDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIEVuaGFuY2VkIExvdyBEZWxheSB3aXRoIEVycm9yIFJlc2lsaWVuY2UgdG9vbHMuICAqLwotI2RlZmluZSBDQVBGX0VSX0FBQ19CU0FDICAgICAgMHgwMDAxMDAwMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBCU0FDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfQUFDX1NVUEVSRlJBTUlORyAweDAwMDIwMDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIFN1cGVyZnJhbWluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX0FBQ19MQyAweDAwMDAwMDAxIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgTG93IENvbXBsZXhpdHkuICovCisjZGVmaW5lIENBUEZfRVJfQUFDX0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDIgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBMb3cgRGVsYXkgd2l0aCBFcnJvciBSZXNpbGllbmNlIHRvb2xzLiBcCisgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfRVJfQUFDX1NDQUwgMHgwMDAwMDAwNCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIFNjYWxhYmxlLiAqLworI2RlZmluZSBDQVBGX0VSX0FBQ19MQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwOCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggRXJyb3IgUmVzaWxpZW5jZSBcCisgICAgICAgICAgICAgICAgdG9vbHMuICovCisjZGVmaW5lIENBUEZfQUFDXzQ4MCBcCisgIDB4MDAwMDAwMTAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyB3aXRoIDQ4MCBmcmFtZWxlbmd0aC4gICovCisjZGVmaW5lIENBUEZfQUFDXzUxMiBcCisgIDB4MDAwMDAwMjAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyB3aXRoIDUxMiBmcmFtZWxlbmd0aC4gICovCisjZGVmaW5lIENBUEZfQUFDXzk2MCBcCisgIDB4MDAwMDAwNDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyB3aXRoIDk2MCBmcmFtZWxlbmd0aC4gICovCisjZGVmaW5lIENBUEZfQUFDXzEwMjQgXAorICAweDAwMDAwMDgwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgd2l0aCAxMDI0IGZyYW1lbGVuZ3RoLiAqLworI2RlZmluZSBDQVBGX0FBQ19IQ1IgXAorICAweDAwMDAwMTAwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgd2l0aCBIdWZmbWFuIENvZGV3b3JkIFJlb3JkZXJpbmcuICAgICovCisjZGVmaW5lIENBUEZfQUFDX1ZDQjExIFwKKyAgMHgwMDAwMDIwMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIFZpcnR1YWwgQ29kZWJvb2sgMTEuICAgICovCisjZGVmaW5lIENBUEZfQUFDX1JWTEMgXAorICAweDAwMDAwNDAwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgUmV2ZXJzaWJsZSBWYXJpYWJsZSBMZW5ndGggQ29kaW5nLiAgICovCisjZGVmaW5lIENBUEZfQUFDX01QRUc0IDB4MDAwMDA4MDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIE1QRUcgZmlsZSBmb3JtYXQuICovCisjZGVmaW5lIENBUEZfQUFDX0RSQyBcCisgIDB4MDAwMDEwMDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBEeW5hbWljIFJhbmdlIENvbnRyb2wuICovCisjZGVmaW5lIENBUEZfQUFDX0NPTkNFQUxNRU5UIFwKKyAgMHgwMDAwMjAwMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIGNvbmNlYWxtZW50LiAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9BQUNfRFJNX0JTRk9STUFUIFwKKyAgMHgwMDAwNDAwMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIERSTSBiaXN0cmVhbSBmb3JtYXQuICovCisjZGVmaW5lIENBUEZfRVJfQUFDX0VMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDgwMDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkgd2l0aCBFcnJvciBcCisgICAgICAgICAgICAgICAgUmVzaWxpZW5jZSB0b29scy4gICovCisjZGVmaW5lIENBUEZfRVJfQUFDX0JTQUMgXAorICAweDAwMDEwMDAwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgQlNBQy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX0FBQ19FTERfRE9XTlNDQUxFIFwKKyAgMHgwMDA0MDAwMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDLUVMRCBEb3duc2NhbGluZyAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9BQUNfVVNBQ19MUCBcCisgIDB4MDAxMDAwMDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFVTQUMgbG93IHBvd2VyIG1vZGUuICovCisjZGVmaW5lIENBUEZfQUFDX1VTQUMgXAorICAweDAwMjAwMDAwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBVbmlmaWVkIFNwZWVjaCBhbmQgQXVkaW8gQ29kaW5nIChVU0FDKS4gKi8KKyNkZWZpbmUgQ0FQRl9FUl9BQUNfRUxEVjIgXAorICAweDAwODAwMDAwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgRW5oYW5jZWQgTG93IERlbGF5IHdpdGggTVBTIDIxMi4gICovCisjZGVmaW5lIENBUEZfQUFDX1VOSURSQyBcCisgIDB4MDEwMDAwMDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIE1QRUctRCBEeW5hbWljIFJhbmdlIENvbnRyb2wgKHVuaURyYykuICovCiAKIC8qIFRyYW5zcG9ydCBjYXBhYmlsaXR5IGZsYWdzICovCi0jZGVmaW5lIENBUEZfQURUUyAgICAgICAgICAgICAweDAwMDAwMDAxICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQURUUyB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9BRElGICAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBRElGIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLwotI2RlZmluZSBDQVBGX0xBVE0gICAgICAgICAgICAgMHgwMDAwMDAwNCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIExBVE0gdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCi0jZGVmaW5lIENBUEZfTE9BUyAgICAgICAgICAgICAweDAwMDAwMDA4ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTE9BUyB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9SQVdQQUNLRVRTICAgICAgIDB4MDAwMDAwMTAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBSQVcgUEFDS0VUUyB0cmFuc3BvcnQgZm9ybWF0LiAqLwotI2RlZmluZSBDQVBGX0RSTSAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIERSTS9EUk0rIHRyYW5zcG9ydCBmb3JtYXQuICAgICovCi0jZGVmaW5lIENBUEZfUlNWRDUwICAgICAgICAgICAweDAwMDAwMDQwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgUlNWRDUwIHRyYW5zcG9ydCBmb3JtYXQgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9BRFRTIFwKKyAgMHgwMDAwMDAwMSAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQURUUyB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9BRElGIFwKKyAgMHgwMDAwMDAwMiAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQURJRiB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9MQVRNIFwKKyAgMHgwMDAwMDAwNCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTEFUTSB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9MT0FTIFwKKyAgMHgwMDAwMDAwOCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTE9BUyB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9SQVdQQUNLRVRTIFwKKyAgMHgwMDAwMDAxMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgUkFXIFBBQ0tFVFMgdHJhbnNwb3J0IGZvcm1hdC4gKi8KKyNkZWZpbmUgQ0FQRl9EUk0gXAorICAweDAwMDAwMDIwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBEUk0vRFJNKyB0cmFuc3BvcnQgZm9ybWF0LiAgICAqLworI2RlZmluZSBDQVBGX1JTVkQ1MCBcCisgIDB4MDAwMDAwNDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFJTVkQ1MCB0cmFuc3BvcnQgZm9ybWF0ICAgICAgICovCiAKIC8qIFNCUiBjYXBhYmlsaXR5IGZsYWdzICovCi0jZGVmaW5lIENBUEZfU0JSX0xQICAgICAgICAgICAweDAwMDAwMDAxICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgU0JSIExvdyBQb3dlciBtb2RlLiAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9TQlJfSFEgICAgICAgICAgIDB4MDAwMDAwMDIgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBTQlIgSGlnaCBRdWFsaXR5IG1vZGUuICAgICAgICAqLwotI2RlZmluZSBDQVBGX1NCUl9EUk1fQlMgICAgICAgMHgwMDAwMDAwNCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfU0JSX0NPTkNFQUxNRU5UICAweDAwMDAwMDA4ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgU0JSIGNvbmNlYWxtZW50LiAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9TQlJfRFJDICAgICAgICAgIDB4MDAwMDAwMTAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBTQlIgRHluYW1pYyBSYW5nZSBDb250cm9sLiAgICAqLwotI2RlZmluZSBDQVBGX1NCUl9QU19NUEVHICAgICAgMHgwMDAwMDAyMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIE1QRUcgUGFyYW1ldHJpYyBTdGVyZW8uICAgICAgICovCi0jZGVmaW5lIENBUEZfU0JSX1BTX0RSTSAgICAgICAweDAwMDAwMDQwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgRFJNIFBhcmFtZXRyaWMgU3RlcmVvLiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfTFAgXAorICAweDAwMDAwMDAxIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBTQlIgTG93IFBvd2VyIG1vZGUuICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX1NCUl9IUSBcCisgIDB4MDAwMDAwMDIgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFNCUiBIaWdoIFF1YWxpdHkgbW9kZS4gICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX0RSTV9CUyBcCisgIDB4MDAwMDAwMDQgLyoqPCBTdXBwb3J0IGZsYWcgZm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX0NPTkNFQUxNRU5UIFwKKyAgMHgwMDAwMDAwOCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgU0JSIGNvbmNlYWxtZW50LiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfRFJDIFwKKyAgMHgwMDAwMDAxMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgU0JSIER5bmFtaWMgUmFuZ2UgQ29udHJvbC4gICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfUFNfTVBFRyBcCisgIDB4MDAwMDAwMjAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIE1QRUcgUGFyYW1ldHJpYyBTdGVyZW8uICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX1BTX0RSTSBcCisgIDB4MDAwMDAwNDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIERSTSBQYXJhbWV0cmljIFN0ZXJlby4gICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX0VMRF9ET1dOU0NBTEUgXAorICAweDAwMDAwMDgwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBFTEQgcmVkdWNlZCBkZWxheSBtb2RlICAgICAgICAqLworI2RlZmluZSBDQVBGX1NCUl9IQkVIUSBcCisgIDB4MDAwMDAxMDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEhRIEhCRSAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLS8qIE1QMiBlbmNvZGVyIGNhcGFiaWxpdHkgZmxhZ3MgKi8KLSNkZWZpbmUgQ0FQRl9NUDJFTkNfU1MgICAgICAgIDB4MDAwMDAwMDEgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBTZWFtbGVzcyBTd2l0Y2hpbmcuICAgICAgICAgICAqLwotI2RlZmluZSBDQVBGX01QMkVOQ19EQUIgICAgICAgMHgwMDAwMDAwMiAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIExheWVyMiBEQUIuICAgICAgICAgICAgICAgICAgICovCisvKiBQQ00gdXRpbHMgY2FwYWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBDQVBGX0RNWF9CTElORCBcCisgIDB4MDAwMDAwMDEgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIGJsaW5kIGRvd25taXhpbmcuICAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfRE1YX1BDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMiAvKio8IFN1cHBvcnQgZmxhZyBmb3IgZ3VpZGVkIGRvd25taXggd2l0aCBkYXRhIGZyb20gTVBFRy0yLzQgXAorICAgICAgICAgICAgICAgIFByb2dyYW0gQ29uZmlnIEVsZW1lbnRzIChQQ0UpLiAqLworI2RlZmluZSBDQVBGX0RNWF9BUklCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDA0IC8qKjwgU3VwcG9ydCBmbGFnIGZvciBQQ0UgZ3VpZGVkIGRvd25taXggd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgXAorICAgICAgICAgICAgICAgIGVxdWF0aW9ucyBhbmQgbGV2ZWxzIHRvIGZ1bGZpbGwgQVJJQiBzdGFuZGFyZC4gKi8KKyNkZWZpbmUgQ0FQRl9ETVhfRFZCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDggLyoqPCBTdXBwb3J0IGZsYWcgZm9yIGd1aWRlZCBkb3dubWl4IHdpdGggZGF0YSBmcm9tIERWQiBhbmNpbGxhcnkgXAorICAgICAgICAgICAgICAgIGRhdGEgZmllbGRzLiAqLworI2RlZmluZSBDQVBGX0RNWF9DSF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDEwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBzaW1wbGUgdXBtaXhpbmcgYnkgZHVibGljYXRpbmcgY2hhbm5lbHMgb3IgXAorICAgICAgICAgICAgICAgIGFkZGluZyB6ZXJvIGNoYW5uZWxzLiAqLworI2RlZmluZSBDQVBGX0RNWF82X0NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDIwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciA1LjEgY2hhbm5lbCBjb25maWd1cmF0aW9uIChpbnB1dCBhbmQgXAorICAgICAgICAgICAgICAgIG91dHB1dCkuICovCisjZGVmaW5lIENBUEZfRE1YXzhfQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDQwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciA2IGFuZCA3LjEgY2hhbm5lbCBjb25maWd1cmF0aW9ucyAoaW5wdXQgYW5kIFwKKyAgICAgICAgICAgICAgICBvdXRwdXQpLiAqLworI2RlZmluZSBDQVBGX0RNWF8yNF9DSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDA4MCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgMjIuMiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKGlucHV0IGFuZCBcCisgICAgICAgICAgICAgICAgb3V0cHV0KS4gKi8KKyNkZWZpbmUgQ0FQRl9MSU1JVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDIwMDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIHNpZ25hbCBsZXZlbCBsaW1pdGluZy4gXAorICAgICAgICAgICAgICAqLwogCi0vKiBEQUIgY2FwYWJpbGl0eSBmbGFncyAqLwotI2RlZmluZSBDQVBGX0RBQl9NUDIgICAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIExheWVyMiBEQUIuICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfREFCX0FBQyAgICAgICAgICAweDAwMDAwMDAyICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgREFCKyAoSEUtQUFDIHYyKS4gICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9EQUJfUEFEICAgICAgICAgIDB4MDAwMDAwMDQgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBQQUQgZXh0cmFjdGlvbi4gICAgICAgICAgICAgICAqLwotI2RlZmluZSBDQVBGX0RBQl9EUkMgICAgICAgICAgMHgwMDAwMDAwOCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIER5bmFtaWMgUmFuZ2UgQ29udHJvbC4gICAgICAgICovCi0jZGVmaW5lIENBUEZfREFCX1NVUlJPVU5EICAgICAweDAwMDAwMDEwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgREFCIFN1cnJvdW5kIChNUFMpLiAgICAgICAgICAgKi8KKy8qIE1QRUcgU3Vycm91bmQgY2FwYWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBDQVBGX01QU19TVEQgXAorICAweDAwMDAwMDAxIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBNUEVHIFN1cnJvdW5kLiAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9NUFNfTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMiAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTG93IERlbGF5IE1QRUcgU3Vycm91bmQuIFwKKyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9NUFNfVVNBQyBcCisgIDB4MDAwMDAwMDQgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFVTQUMgTVBFRyBTdXJyb3VuZC4gICAgICAqLworI2RlZmluZSBDQVBGX01QU19IUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDEwIC8qKjwgU3VwcG9ydCBmbGFnIGluZGljYXRpbmcgaWYgaGlnaCBxdWFsaXR5IHByb2Nlc3NpbmcgaXMgXAorICAgICAgICAgICAgICAgIHN1cHBvcnRlZCAqLworI2RlZmluZSBDQVBGX01QU19MUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDIwIC8qKjwgU3VwcG9ydCBmbGFnIGluZGljYXRpbmcgaWYgcGFydGlhbGx5IGNvbXBsZXggKGxvdyBwb3dlcikgXAorICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgaXMgc3VwcG9ydGVkICovCisjZGVmaW5lIENBUEZfTVBTX0JMSU5EIFwKKyAgMHgwMDAwMDA0MCAvKio8IFN1cHBvcnQgZmxhZyBpbmRpY2F0aW5nIGlmIGJsaW5kIHByb2Nlc3NpbmcgaXMgc3VwcG9ydGVkICovCisjZGVmaW5lIENBUEZfTVBTX0JJTkFVUkFMIFwKKyAgMHgwMDAwMDA4MCAvKio8IFN1cHBvcnQgZmxhZyBpbmRpY2F0aW5nIGlmIGJpbmF1cmFsIG91dHB1dCBpcyBwb3NzaWJsZSAqLworI2RlZmluZSBDQVBGX01QU18yQ0hfT1VUIFwKKyAgMHgwMDAwMDEwMCAvKio8IFN1cHBvcnQgZmxhZyBpbmRpY2F0aW5nIGlmIDJjaCBvdXRwdXQgaXMgcG9zc2libGUgICAgICAqLworI2RlZmluZSBDQVBGX01QU182Q0hfT1VUIFwKKyAgMHgwMDAwMDIwMCAvKio8IFN1cHBvcnQgZmxhZyBpbmRpY2F0aW5nIGlmIDZjaCBvdXRwdXQgaXMgcG9zc2libGUgICAgICAqLworI2RlZmluZSBDQVBGX01QU184Q0hfT1VUIFwKKyAgMHgwMDAwMDQwMCAvKio8IFN1cHBvcnQgZmxhZyBpbmRpY2F0aW5nIGlmIDhjaCBvdXRwdXQgaXMgcG9zc2libGUgICAgICAqLworI2RlZmluZSBDQVBGX01QU18xQ0hfSU4gXAorICAweDAwMDAxMDAwIC8qKjwgU3VwcG9ydCBmbGFnIGluZGljYXRpbmcgaWYgMWNoIGRteCBpbnB1dCBpcyBwb3NzaWJsZSAgICovCisjZGVmaW5lIENBUEZfTVBTXzJDSF9JTiBcCisgIDB4MDAwMDIwMDAgLyoqPCBTdXBwb3J0IGZsYWcgaW5kaWNhdGluZyBpZiAyY2ggZG14IGlucHV0IGlzIHBvc3NpYmxlICAgKi8KKyNkZWZpbmUgQ0FQRl9NUFNfNkNIX0lOIFwKKyAgMHgwMDAwNDAwMCAvKio8IFN1cHBvcnQgZmxhZyBpbmRpY2F0aW5nIGlmIDVjaCBkbXggaW5wdXQgaXMgcG9zc2libGUgICAqLwogCi0vKiBETUIgY2FwYWJpbGl0eSBmbGFncyAqLwotI2RlZmluZSBDQVBGX0RNQl9CU0FDICAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEVSIEFBQyBCU0FDLiAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfRE1CX0RSQyAgICAgICAgICAweDAwMDAwMDA4ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgRHluYW1pYyBSYW5nZSBDb250cm9sLiAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9ETUJfU1VSUk9VTkQgICAgIDB4MDAwMDAwMTAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBETUIgU3Vycm91bmQgKE1QUykuICAgICAgICAgICAqLwotCi0vKiBQQ00gdXAvZG93bm1taXggY2FwYWJpbGl0eSBmbGFncyAqLwotI2RlZmluZSBDQVBGX0RNWF9CTElORCAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIGJsaW5kIGRvd25taXhpbmcuICAgICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfRE1YX1BDRSAgICAgICAgICAweDAwMDAwMDAyICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgZ3VpZGVkIGRvd25taXggd2l0aCBkYXRhIGZyb20gTVBFRy0yLzQgUHJvZ3JhbSBDb25maWcgRWxlbWVudHMgKFBDRSkuICovCi0jZGVmaW5lIENBUEZfRE1YX0FSSUIgICAgICAgICAweDAwMDAwMDA0ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgUENFIGd1aWRlZCBkb3dubWl4IHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IGVxdWF0aW9ucyBhbmQgbGV2ZWxzIHRvIGZ1bGZpbGwgQVJJQiBzdGFuZGFyZC4gKi8KLSNkZWZpbmUgQ0FQRl9ETVhfRFZCICAgICAgICAgIDB4MDAwMDAwMDggIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBndWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBEVkIgYW5jaWxsYXJ5IGRhdGEgZmllbGRzLiAqLwotI2RlZmluZSBDQVBGX0RNWF9DSF9FWFAgICAgICAgMHgwMDAwMDAxMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIHNpbXBsZSB1cG1peGluZyBieSBkdWJsaWNhdGluZyBjaGFubmVscyBvciBhZGRpbmcgemVybyBjaGFubmVscy4gKi8KIC8qIFxlbmRjb25kICovCiAKLQogLyoKICAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAqIExpYnJhcnkgdmVyc2lvbmluZwpAQCAtNTE5LDM3ICs2OTQsNDUgQEAKICAqLwogCiAvKioKLSAqIENvbnZlcnQgZWFjaCBtZW1iZXIgb2YgdmVyc2lvbiBudW1iZXJzIHRvIG9uZSBzaW5nbGUgbnVtZXJpYyB2ZXJzaW9uIHJlcHJlc2VudGF0aW9uLgorICogQ29udmVydCBlYWNoIG1lbWJlciBvZiB2ZXJzaW9uIG51bWJlcnMgdG8gb25lIHNpbmdsZSBudW1lcmljIHZlcnNpb24KKyAqIHJlcHJlc2VudGF0aW9uLgogICogXHBhcmFtIGxldjAgIDFzdCBsZXZlbCBvZiB2ZXJzaW9uIG51bWJlci4KICAqIFxwYXJhbSBsZXYxICAybmQgbGV2ZWwgb2YgdmVyc2lvbiBudW1iZXIuCiAgKiBccGFyYW0gbGV2MiAgM3JkIGxldmVsIG9mIHZlcnNpb24gbnVtYmVyLgotICAqLwotI2RlZmluZSBMSUJfVkVSU0lPTihsZXYwLCBsZXYxLCBsZXYyKSAoKGxldjA8PDI0ICYgMHhmZjAwMDAwMCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV2MTw8MTYgJiAweDAwZmYwMDAwKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXYyPDw4ICAmIDB4MDAwMGZmMDApKQorICovCisjZGVmaW5lIExJQl9WRVJTSU9OKGxldjAsIGxldjEsIGxldjIpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChsZXYwIDw8IDI0ICYgMHhmZjAwMDAwMCkgfCAobGV2MSA8PCAxNiAmIDB4MDBmZjAwMDApIHwgXAorICAgKGxldjIgPDwgOCAmIDB4MDAwMGZmMDApKQogCiAvKioKICAqICBCdWlsZCB0ZXh0IHN0cmluZyBvZiB2ZXJzaW9uLgogICovCi0jZGVmaW5lIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKSBGREtzcHJpbnRmKChpbmZvKS0+dmVyc2lvblN0ciwgIiVkLiVkLiVkIiwgKCgoaW5mbyktPnZlcnNpb24gPj4gMjQpICYgMHhmZiksICgoKGluZm8pLT52ZXJzaW9uID4+IDE2KSAmIDB4ZmYpLCAoKChpbmZvKS0+dmVyc2lvbiA+PiA4ICkgJiAweGZmKSkKKyNkZWZpbmUgTElCX1ZFUlNJT05fU1RSSU5HKGluZm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZES3NwcmludGYoKGluZm8pLT52ZXJzaW9uU3RyLCAiJWQuJWQuJWQiLCAoKChpbmZvKS0+dmVyc2lvbiA+PiAyNCkgJiAweGZmKSwgXAorICAgICAgICAgICAgICgoKGluZm8pLT52ZXJzaW9uID4+IDE2KSAmIDB4ZmYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAoKChpbmZvKS0+dmVyc2lvbiA+PiA4KSAmIDB4ZmYpKQogCiAvKioKICAqICBMaWJyYXJ5IGluZm9ybWF0aW9uLgogICovCi10eXBlZGVmIHN0cnVjdCBMSUJfSU5GTwotewordHlwZWRlZiBzdHJ1Y3QgTElCX0lORk8gewogICBjb25zdCBjaGFyKiB0aXRsZTsKICAgY29uc3QgY2hhciogYnVpbGRfZGF0ZTsKICAgY29uc3QgY2hhciogYnVpbGRfdGltZTsKICAgRkRLX01PRFVMRV9JRCBtb2R1bGVfaWQ7CiAgIElOVCB2ZXJzaW9uOwotICBVSU5UICBmbGFnczsKKyAgVUlOVCBmbGFnczsKICAgY2hhciB2ZXJzaW9uU3RyWzMyXTsKIH0gTElCX0lORk87CiAKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGREtfQVVESU9fSU5MSU5FIGlubGluZQorI2Vsc2UKKyNkZWZpbmUgRkRLX0FVRElPX0lOTElORQorI2VuZGlmCisKIC8qKiBJbml0aWFsaXplIGxpYnJhcnkgaW5mby4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBGREtpbml0TGliSW5mbyggTElCX0lORk8qIGluZm8gKQoteworc3RhdGljIEZES19BVURJT19JTkxJTkUgdm9pZCBGREtpbml0TGliSW5mbyhMSUJfSU5GTyogaW5mbykgewogICBpbnQgaTsKIAogICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKQEAgLTU1OCwxMSArNzQxLDExIEBACiB9CiAKIC8qKiBBcXVpcmUgc3VwcG9ydGVkIGZlYXR1cmVzIG9mIGxpYnJhcnkuICovCi1zdGF0aWMgaW5saW5lIFVJTlQgRkRLbGliSW5mb19nZXRDYXBhYmlsaXRpZXMoIGNvbnN0IExJQl9JTkZPKiBpbmZvLCBGREtfTU9EVUxFX0lEIG1vZHVsZV9pZCApCi17CitzdGF0aWMgRkRLX0FVRElPX0lOTElORSBVSU5UCitGREtsaWJJbmZvX2dldENhcGFiaWxpdGllcyhjb25zdCBMSUJfSU5GTyogaW5mbywgRkRLX01PRFVMRV9JRCBtb2R1bGVfaWQpIHsKICAgaW50IGk7CiAKLSAgZm9yIChpPTA7IGk8RkRLX01PRFVMRV9MQVNUOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CiAgICAgaWYgKGluZm9baV0ubW9kdWxlX2lkID09IG1vZHVsZV9pZCkgewogICAgICAgcmV0dXJuIGluZm9baV0uZmxhZ3M7CiAgICAgfQpAQCAtNTcxLDIzICs3NTQsMTkgQEAKIH0KIAogLyoqIFNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYi4gKi8KLXN0YXRpYyBpbmxpbmUgSU5UIEZES2xpYkluZm9fbG9va3VwKCBjb25zdCBMSUJfSU5GTyogaW5mbywgRkRLX01PRFVMRV9JRCBtb2R1bGVfaWQgKQoteworc3RhdGljIEZES19BVURJT19JTkxJTkUgSU5UIEZES2xpYkluZm9fbG9va3VwKGNvbnN0IExJQl9JTkZPKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES19NT0RVTEVfSUQgbW9kdWxlX2lkKSB7CiAgIGludCBpID0gLTE7CiAKICAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7Ci0gICAgaWYgKGluZm9baV0ubW9kdWxlX2lkID09IG1vZHVsZV9pZCkKLSAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpCi0gICAgICBicmVhazsKKyAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gbW9kdWxlX2lkKSByZXR1cm4gLTE7CisgICAgaWYgKGluZm9baV0ubW9kdWxlX2lkID09IEZES19OT05FKSBicmVhazsKICAgfQotICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpCi0gICAgcmV0dXJuIC0xOworICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpIHJldHVybiAtMTsKIAogICByZXR1cm4gaTsKIH0KIAotCiAvKgogICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICogQnVmZmVyIGRlc2NyaXB0aW9uCkBAIC01OTcsMzQgKzc3NiwzNSBAQAogLyoqCiAgKiAgSS9PIGJ1ZmZlciBkZXNjcmlwdG9yLgogICovCi10eXBlZGVmIHN0cnVjdCBGREtfYnVmRGVzY3IKLXsKLSAgdm9pZCAgKipwcEJhc2U7ICAgICAvKiE8IFBvaW50ZXIgdG8gYW4gYXJyYXkgY29udGFpbmluZyBidWZmZXIgYmFzZSBhZGRyZXNzZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gTlVMTCBmb3IgYnVmZmVyIHJlcXVpcmVtZW50IGluZm8uICovCi0gIFVJTlQgICAqcEJ1ZlNpemU7ICAgLyohPCBQb2ludGVyIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcGxhY2VkIGluIHRoZSBzcGVjaWZpYyBidWZmZXIuICovCi0gIFVJTlQgICAqcEVsZVNpemU7ICAgLyohPCBQb2ludGVyIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQgc2l6ZSBmb3IgZWFjaCBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGJ5dGVzLiBUaGF0IGlzIG1vc3RseSB0aGUgbnVtYmVyIHJldHVybmVkIGJ5IHRoZSBzaXplb2YoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgZm9yIHRoZSBkYXRhIHR5cGUgdXNlZCBmb3IgdGhlIHNwZWNpZmljIGJ1ZmZlci4gKi8KLSAgVUlOVCAgICpwQnVmVHlwZTsgICAvKiE8IFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYml0IGZpZWxkcyBjb250YWluaW5nIGEgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBlYWNoIGJ1ZmZlci4gU2VlIFhYWCBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLiAgKi8KLSAgVUlOVCAgICBudW1CdWZzOyAgICAvKiE8IFRvdGFsIG51bWJlciBvZiBidWZmZXJzLiAqLwordHlwZWRlZiBzdHJ1Y3QgRkRLX2J1ZkRlc2NyIHsKKyAgdm9pZCoqIHBwQmFzZTsgIC8qITwgUG9pbnRlciB0byBhbiBhcnJheSBjb250YWluaW5nIGJ1ZmZlciBiYXNlIGFkZHJlc3Nlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIE5VTEwgZm9yIGJ1ZmZlciByZXF1aXJlbWVudCBpbmZvLiAqLworICBVSU5UKiBwQnVmU2l6ZTsgLyohPCBQb2ludGVyIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgdGhhdCBjYW4gYmUgcGxhY2VkIGluIHRoZSBzcGVjaWZpYyBidWZmZXIuICovCisgIFVJTlQqIHBFbGVTaXplOyAvKiE8IFBvaW50ZXIgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudCBzaXplIGZvciBlYWNoCisgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaW4gYnl0ZXMuIFRoYXQgaXMgbW9zdGx5IHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKSBvcGVyYXRvciBmb3IgdGhlIGRhdGEgdHlwZSB1c2VkIGZvciB0aGUgc3BlY2lmaWMKKyAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci4gKi8KKyAgVUlOVCoKKyAgICAgIHBCdWZUeXBlOyAvKiE8IFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYml0IGZpZWxkcyBjb250YWluaW5nIGEgZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgIGZvciBlYWNoIGJ1ZmZlci4gU2VlIFhYWCBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLiAgKi8KKyAgVUlOVCBudW1CdWZzOyAvKiE8IFRvdGFsIG51bWJlciBvZiBidWZmZXJzLiAqLwogCiB9IEZES19idWZEZXNjcjsKIAogLyoqCiAgKiBCdWZmZXIgdHlwZSBkZXNjcmlwdGlvbiBmaWVsZC4KICAqLwotI2RlZmluZSBGREtfQlVGX1RZUEVfTUFTS19JTyAgICAgKCAweDAzIDw8IDMwICkKLSNkZWZpbmUgRkRLX0JVRl9UWVBFX01BU0tfREVTQ1IgICggMHgzRiA8PCAxNiApCi0jZGVmaW5lIEZES19CVUZfVFlQRV9NQVNLX0lEICAgICAoIDB4RkYgKQorI2RlZmluZSBGREtfQlVGX1RZUEVfTUFTS19JTyAoKFVJTlQpMHgwMyA8PCAzMCkKKyNkZWZpbmUgRkRLX0JVRl9UWVBFX01BU0tfREVTQ1IgKChVSU5UKTB4M0YgPDwgMTYpCisjZGVmaW5lIEZES19CVUZfVFlQRV9NQVNLX0lEICgoVUlOVCkweEZGKQogCi0jZGVmaW5lIEZES19CVUZfVFlQRV9JTlBVVCAgICAgICAoIDB4MSA8PCAzMCApCi0jZGVmaW5lIEZES19CVUZfVFlQRV9PVVRQVVQgICAgICAoIDB4MiA8PCAzMCApCisjZGVmaW5lIEZES19CVUZfVFlQRV9JTlBVVCAoKFVJTlQpMHgxIDw8IDMwKQorI2RlZmluZSBGREtfQlVGX1RZUEVfT1VUUFVUICgoVUlOVCkweDIgPDwgMzApCiAKLSNkZWZpbmUgRkRLX0JVRl9UWVBFX1BDTV9EQVRBICAgICggMHgxIDw8IDE2ICkKLSNkZWZpbmUgRkRLX0JVRl9UWVBFX0FOQ19EQVRBICAgICggMHgyIDw8IDE2ICkKLSNkZWZpbmUgRkRLX0JVRl9UWVBFX0JTX0RBVEEgICAgICggMHg0IDw8IDE2ICkKKyNkZWZpbmUgRkRLX0JVRl9UWVBFX1BDTV9EQVRBICgoVUlOVCkweDEgPDwgMTYpCisjZGVmaW5lIEZES19CVUZfVFlQRV9BTkNfREFUQSAoKFVJTlQpMHgyIDw8IDE2KQorI2RlZmluZSBGREtfQlVGX1RZUEVfQlNfREFUQSAoKFVJTlQpMHg0IDw8IDE2KQogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2xpYlNZUy9pbmNsdWRlL2F1ZGlvLmggYi9saWJTWVMvaW5jbHVkZS9hdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWY4M2FlLi4wMDAwMDAwCi0tLSBhL2xpYlNZUy9pbmNsdWRlL2F1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3I6IE1hbnVlbCBKYW5kZXIKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiogXGZpbGUgICBhdWRpby5oCi0gKiAgXGJyaWVmICBBdWRpbyBkZXZpY2Ugc3VwcG9ydC4KLSAqCi0gKiBUaGlzIGNvbXBvbmVudCBmZWF0dXJlcyBhdWRpbyBwbGF5YmFjayBhbmQgY2FwdHVyZSB3aXRoIGEgY29tbW9uIEFQSSBmb3IKLSAqIGFueSBzb2Z0d2FyZS9oYXJkd2FyZSBwbGF0Zm9ybS4KLSAqCi0gKiBJZiB5b3UgdXNlIE1pY3Jvc29mdCBWaXN1YWwgQysrIFZlcnNpb24gNiBhbmQgS3NtZWRpYS5oIGNhbm5vdCBiZSBmb3VuZCwKLSAqIGluc3RhbGxpbmcgRGlyZWN0WCAoZS5nLiBkeDlzZGtfc3VtbWVyMjAwNC5leGUpIHNvbHZlcyBpdC4KLSAqCi0gKi8KLQotI2lmbmRlZiBBVURJT19ICi0jZGVmaW5lIEFVRElPX0gKLQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU1lTL2luY2x1ZGUvY21kbF9wYXJzZXIuaCBiL2xpYlNZUy9pbmNsdWRlL2NtZGxfcGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmU0MWQuLjAwMDAwMDAKLS0tIGEvbGliU1lTL2luY2x1ZGUvY21kbF9wYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKToKLSAgIERlc2NyaXB0aW9uOiBjb21tYW5kIGxpbmUgcGFyc2VyCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqIFxmaWxlICAgY21kbF9wYXJzZXIuaAotICogIFxicmllZiAgQ29tbWFuZCBsaW5lIHBhcnNlci4KLSAqCi0gKiAgVGhlIGNvbW1hbmQgbGluZSBwYXJzZXIgY2FuIGV4dHJhY3QgY2VydGFpbiBkYXRhIGZpZWxkcyBvdXQgb2YgYSBjaGFyYWN0ZXIKLSAqICBzdHJpbmcgYW5kIGFzc2lnbiB2YWx1ZXMgdG8gdmFyaWFibGVzLiBJdCBoYXMgMiBtYWluIGZ1bmN0aW9ucy4gT25lIHRvIHBhcnNlCi0gKiAgYSBjb21tYW5kIGxpbmUgaW4gdGhlIGZvcm0gb2Ygc3RhbmRhcmQgQyBydW50aW1lICJhcmdjIiBhbmQgImFyZ3YiIHBhcmFtZXRlcnMsCi0gKiAgYW5kIHRoZSBvdGhlciB0byBhc3NlbWJsZSB0aGVzZSBwYXJhbWV0ZXJzIHJlYWRpbmcgdGV4dCBsaW5lcyBmcm9tIGEgZmlsZSBpbgotICogIGNhc2UgdGhlIEMgcnVudGltZSBkb2VzIG5vdCBwcm92aWRlIHRoZW0uCi0gKi8KLQotI2lmbmRlZiAgX19QQVJTRVJfSAotI2RlZmluZSBfX1BBUlNFUl9ICi0KLQotCi0jaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCi0KLSNkZWZpbmUgQ01ETF9NQVhfU1RSTEVOIDI1NQotI2RlZmluZSBDTURMX01BWF9BUkdDICAgIDMwCi0KLS8qIFxjb25kICovCi0vKiBUeXBlIGRlZmluaXRpb24gZm9yIHRleHQgKi8KLQotCi0jaWZkZWYgV0lOMzIKLSAgI2luY2x1ZGUgPHRjaGFyLmg+Ci0gICNpZm5kZWYgX3RzdG9mICAvKiBGb3IgVmlzdWFsIFN0dWRpbyA2ICovCi0gICAgI2lmZGVmIF9VTklDT0RFCi0gICAgICAjaW5jbHVkZSA8d2NoYXIuaD4KLSAgICAgICNkZWZpbmUgX3RzdG9mKHgpICAgKGZsb2F0KSB3Y3N0b2QoeCwgTlVMTCkgIC8qIEZvciBWaXN1YWwgU3R1ZGlvIDYgKi8KLSAgICAjZWxzZQotICAgICAgI2RlZmluZSBfdHN0b2YgICAgICBhdG9mCi0gICAgI2VuZGlmCi0gICNlbmRpZgotCi0gICNpZm5kZWYgX3RzdG9sICAvKiBGb3IgVmlzdWFsIFN0dWRpbyA2ICovCi0gICAgI2lmZGVmIF9VTklDT0RFCi0gICAgICAjZGVmaW5lIF90c3RvbCAgICAgIF93dG9sCi0gICAgI2Vsc2UKLSAgICAgICNkZWZpbmUgX3RzdG9sICAgICAgYXRvbAotICAgICNlbmRpZgotICAjZW5kaWYKLQotICAjaWZuZGVmIF90c3RvaSAgLyogRm9yIFZpc3VhbCBTdHVkaW8gNiAqLwotICAgICNpZmRlZiBfVU5JQ09ERQotICAgICAgI2RlZmluZSBfdHN0b2kgICAgICBfd3RvaQotICAgICNlbHNlCi0gICAgICAjZGVmaW5lIF90c3RvaSAgICAgIGF0b2kKLSAgICAjZW5kaWYKLSAgI2VuZGlmCi0KLSAgI2lmbmRlZiBURVhUQ0hBUgotICAgICNkZWZpbmUgVEVYVENIQVIgY2hhcgotICAjZW5kaWYKLQotICAjaWZuZGVmIF9URVhUCi0gICAgI2RlZmluZSBfVEVYVAotICAjZW5kaWYKLQotI2Vsc2UgLyogV0lOMzIgKi8KLQotICAgICNkZWZpbmUgVEVYVENIQVIgY2hhcgotICAgICNkZWZpbmUgX3Rjc2xlbihhKSAgRkRLc3RybGVuKGEpCi0gICAgI2RlZmluZSBfdGNzY3B5ICAgICBzdHJjcHkKLSAgICAjZGVmaW5lIF90Y3NjbXAgICAgIEZES3N0cmNtcAotICAgICNkZWZpbmUgX3Rjc25jbXAgICAgRkRLc3RybmNtcAotICAgICNkZWZpbmUgX3RzY2FuZiAgICAgc2NhbmYKLSAgICAjZGVmaW5lIF9URVhUKHgpICAgIHgKLSAgICAjZGVmaW5lIF90Zm9wZW4gICAgIGZvcGVuCi0gICAgI2RlZmluZSBfZnRwcmludGYgICBmcHJpbnRmCi0gICAgI2RlZmluZSBfdGNzbmNweSAgICBGREtzdHJuY3B5Ci0gICAgI2RlZmluZSBfdHN0b2YgICAgICBGREthdG9mCi0gICAgI2RlZmluZSBfdHN0b2wgICAgICBGREthdG9sCi0gICAgI2RlZmluZSBfdHN0b2kgICAgICBGREthdG9pCi0gICAgI2RlZmluZSBfdGNzdG9sICAgICBzdHJ0b2wKLSAgICAjZGVmaW5lIF9pc3RkaWdpdCAgIGlzZGlnaXQKLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0vKiBcZW5kY29uZCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0vKioKLSAqICBTY2FucyBhcmdjLCBhcmd2IGFuZCBhIHNjYW5mIHN0eWxlIGZvcm1hdCBzdHJpbmcgZm9yIHBhcmFtZXRlcnMgYW5kIHN0b3JlcyB0aGUKLSAqICB2YWx1ZXMgaW4gdGhlIHZhcmlhYmxlIG51bWJlciBvZiBwb2ludGVycyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLgotCi0gRm9yIGV4YW1wbGU6Ci0gICBcY29kZQotICAgI2RlZmluZSBBUkdfUEFSQU0gICIoLWEgJWQpICgtdiAlMSkiCi0gICAjZGVmaW5lIEFSR19WQUxVRSAmY29uZmlnLT5hb3QsICZ2ZXJib3NlCi0gICBpbnQgbkZvdW5kQXJncyA9IElJU19TY2FuQ21kbChhcmdjLCBhcmd2LCBBUkdfUEFSQU0sIEFSR19WQUxVRSk7Ci0gICBcZW5kY29kZQotICAgd2hlcmFzIHRoZSB3aWxkLWNhcmRzIChcJWQsIFwlMSwgLi4pIGRlZmluZSB0aGUgZGF0YSB0eXBlIG9mIHRoZSBhcmd1bWVudDoKLQktIFwlMSBib29sZWFuIChlLiBnLiAteCkKLQktIFwlZCBpbnRlZ2VyIChlLiBnLiAteCAyMykKLQktIFwlZiBmbG9hdCAoZS4gZy4gLXggMy40KQotCS0gXCV5IGRvdWJsZSAoZS4gZy4gLXggMzE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjg4NDE5NzE2OTM5OTM3NTEpCi0JLSBcJXMgc3RyaW5nIChlLiBnLiAteCAiZmlsZS5kYXQiKQotCS0gXCV1IHVuc2lnbmVkIGNoYXJhY3RlciAoZS4gZy4gLXggMykKLQktIFwlYyBzaWduZWQgY2hhcmFjdGVyIChlLiBnLiAteCAtMykKLSAgICBNb3JlIGV4YW1wbGVzIG9uIGhvdyB0byB1c2UgaXQgYXJlIGxvY2F0ZWQgaW4gZXZlcnkgKGVuY29kZXIvZGVjb2RlcikgZXhhbXBsZSBmcmFtZXdvcmsuCi0KLSAqIFxwYXJhbSBhcmdjICAgICAgTnVtYmVyIG9mIGFyZ3VtZW50cy4KLSAqIFxwYXJhbSBhcmd2ICAgICAgQ29tcGxldGUgY2hhcmFjdGVyIHN0cmluZyBvZiB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAqIFxwYXJhbSBwUmVxQXJncyAgQSBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIGEgY29ycmVzcG9uZGluZyBsaXN0IG9mIG1lbW9yeSBhZGRyZXNzZXMgdG8KLSAqICAgICAgICAgICAgICAgICAgYXNzaWduIGVhY2ggcGFyYW1ldGVyIHRvLgotICoKLSAqIFxyZXR1cm4gIE51bWJlciBvZiBmb3VuZCBhcmd1bWVudHMuCi0gKi8KLUlOVCBJSVNfU2NhbkNtZGwoSU5UIGFyZ2MsIFRFWFRDSEFSKiBhcmd2W10sIGNvbnN0IFRFWFRDSEFSKiBwUmVxQXJncywgLi4uKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotLyoqCi0gKiAgUmVhZHMgYSB0ZXh0IGZpbGUsIGFzc2VtYmxlcyBhcmdjIGFuZCBhcmd2IHBhcmFtZXRlcnMgZm9yIGVhY2ggdGV4dCBsaW5lCi0gKiAgYW5kIGNhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBzZXQgb2YgYXJnYywgYXJndiBwYXJhbWV0ZXJzLgotICoKLSAqIFxwYXJhbSBwYXJhbV9maWxlbmFtZSAgTmFtZSBvZiB0ZXh0IGZpbGUgdGhhdCBzaG91bGQgYmUgcGFyc2VkLgotICogXHBhcmFtIHBGdW5jdGlvbiAgICAgICBQb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZXZlcnkgdGV4dCBsaW5lIGZvdW5kLgotICoKLSAqIFxyZXR1cm4gIDAgb24gc3VjY2VzcywgMSBvbiBmYWlsdXJlLgotICovCi1JTlQgSUlTX1Byb2Nlc3NDbWRsTGlzdChjb25zdCBURVhUQ0hBUiogcGFyYW1fZmlsZW5hbWUsIGludCAoKnBGdW5jdGlvbikoaW50LCBURVhUQ0hBUioqKSk7Ci0KLQotI2VuZGlmIC8qIF9fUEFSU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNZUy9pbmNsdWRlL2NvbnZfc3RyaW5nLmggYi9saWJTWVMvaW5jbHVkZS9jb252X3N0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDA5ZGMwLi4wMDAwMDAwCi0tLSBhL2xpYlNZUy9pbmNsdWRlL2NvbnZfc3RyaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqIFxmaWxlICAgY29udl9zdHJpbmcuaAotICogIFxicmllZiAgU3RyaW5nIGNvbnZlcnNpb24gZnVuY3Rpb25zLgotICovCi0KLSNpZm5kZWYgX0NPTlZfU1RSSU5HX0gKLSNkZWZpbmUgX0NPTlZfU1RSSU5HX0gKLQotCi0KLSNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0vKioKLSAqIFxicmllZiAgICAgICAgICAgICAgICBDb252ZXJ0IGEgYml0YnVmZmVyIHRvIGEgaGV4IHN0cmluZy4KLSAqIFxwYXJhbSBzdHJpbmcgICAgICAgICBIZXggc3RyaW5nLgotICogXHBhcmFtIGNoYXJCdWYgICAgICAgIElucHV0IGJ1ZmZlciB0aGF0IGhhcyB0byBiZSBjb252ZXJ0ZWQuCi0gKiBccGFyYW0gY2hhckJ1Zkxlbmd0aCAgU2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyLgotICogXHJldHVybiAgICAgICAgICAgICAgIEVycm9yIGNvZGUuCi0gKi8KLUlOVCBjaGFyQnVmMkhleFN0cmluZyhjaGFyICpzdHJpbmcsIFVDSEFSICpjaGFyQnVmLCBJTlQgY2hhckJ1Zkxlbmd0aCk7Ci0KLS8qKgotICogXGJyaWVmICAgICAgICAgICAgICAgIENvbnZlcnQgYSBoZXggc3RyaW5nIHRvIGJpdHMuCi0gKiBccGFyYW0gc3RyaW5nICAgICAgICAgSGV4IHN0cmluZyB0aGF0IGhhcyB0byBiZSBjb252ZXJ0ZWQuCi0gKiBccGFyYW0gY2hhckJ1ZiAgICAgICAgT3V0cHV0IGJ1ZmZlciBob2xkaW5nIHRoZSBiaXRzLCB3aWxsIGJlIGZpbGxlZCB1cCB3aXRoIHplcm9zLgotICogXHBhcmFtIGNoYXJCdWZMZW5ndGggIFNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCi0gKiBccmV0dXJuICAgICAgICAgICAgICAgRXJyb3IgY29kZS4KLSAqLwotSU5UIGhleFN0cmluZzJDaGFyQnVmKGNvbnN0IGNoYXIgKnN0cmluZywgVUNIQVIgKmNoYXJCdWYsIFVJTlQgY2hhckJ1Zkxlbmd0aCk7Ci0KLS8qKgotICogXGJyaWVmICAgIENvbnZlcnQgYSBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIGEgaGV4IHNpZ24gdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlLgotICogXHBhcmFtIGMgIENoYXJhY3RlciB0aGF0IGhhcyB0byBiZSBjb252ZXJ0ZWQuCi0gKiBccmV0dXJuICAgQ29udmVydGVkIHZhbHVlICh2YWx1ZSBiZXR3ZWVuIDAgYW5kIDE1KSwgaWYgMTYsIGFuIGVycm9yIGhhcyBvY2N1cmVkLgotICovCi1VQ0hBUiBoZXhDaGFyMkRlYyhjb25zdCBjaGFyIGMpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLSNlbmRpZiAvKiBfQ09OVl9TVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU1lTL2luY2x1ZGUvZ2VuZXJpY1N0ZHMuaCBiL2xpYlNZUy9pbmNsdWRlL2dlbmVyaWNTdGRzLmgKaW5kZXggZmU0ZGMzNi4uODgyOGJhNyAxMDA2NDQKLS0tIGEvbGliU1lTL2luY2x1ZGUvZ2VuZXJpY1N0ZHMuaAorKysgYi9saWJTWVMvaW5jbHVkZS9nZW5lcmljU3Rkcy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQwICs5MCwzNCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKiogU3lzdGVtIGludGVncmF0aW9uIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqIFxmaWxlICAgZ2VuZXJpY1N0ZHMuaAotICAgIFxicmllZiAgR2VuZXJpYyBSdW4tVGltZSBTdXBwb3J0IGZ1bmN0aW9uIHdyYXBwZXJzIGFuZCBoZWFwIGFsbG9jYXRpb24gbW9uaXRvcmluZy4KKyAgICBcYnJpZWYgIEdlbmVyaWMgUnVuLVRpbWUgU3VwcG9ydCBmdW5jdGlvbiB3cmFwcGVycyBhbmQgaGVhcCBhbGxvY2F0aW9uCisgICBtb25pdG9yaW5nLgogICovCiAKLSNpZiAhZGVmaW5lZChfX0dFTkVSSUNTVERTX0hfXykKLSNkZWZpbmUgX19HRU5FUklDU1REU19IX18KKyNpZiAhZGVmaW5lZChHRU5FUklDU1REU19IKQorI2RlZmluZSBHRU5FUklDU1REU19ICiAKICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKIAotCi0vKiBBbHdheXMgaW5jcmVhc2UgdmVyYm9zaXR5IG9mIG1lbW9yeSBhbGxvY2F0aW9uIGluIGNhc2Ugb2YgYSBkZWJ1ZyBidWlsdC4gREVCVUcgaXMgZGVmaW5lZCBnbG9iYWxseSBpbiB0aGF0IGNhc2UuICovCi0jaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChGREtfREVCVUcpCi0vLyNkZWZpbmUgTUVNT1JZX01FQVNVUkVNRU5UCi0jZW5kaWYKLQogI2lmbmRlZiBNX1BJCi0gICNkZWZpbmUgTV9QSSAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYgIC8qISBQaS4gT25seSB1c2VkIGluIGV4YW1wbGUgcHJvamVjdHMuICovCisjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NiAvKiE8IFBpLiBPbmx5IHVzZWQgaW4gZXhhbXBsZSBwcm9qZWN0cy4gKi8KICNlbmRpZgogCi0KLS8qICNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFICovCi0KLQogLyoqCi0gKiBJZGVudGlmaWVycyBmb3IgdmFyaW91cyBtZW1vcnkgbG9jYXRpb25zLiBUaGV5IGFyZSB1c2VkIGFsb25nIHdpdGggbWVtb3J5IGFsbG9jYXRpb24KLSAqIGZ1bmN0aW9ucyBsaWtlIEZES2NhbGxvY19MKCkgdG8gc3BlY2lmeSB0aGUgcmVxdWVzdGVkIG1lbW9yeSdzIGxvY2F0aW9uLgorICogSWRlbnRpZmllcnMgZm9yIHZhcmlvdXMgbWVtb3J5IGxvY2F0aW9ucy4gVGhleSBhcmUgdXNlZCBhbG9uZyB3aXRoIG1lbW9yeQorICogYWxsb2NhdGlvbiBmdW5jdGlvbnMgbGlrZSBGREtjYWxsb2NfTCgpIHRvIHNwZWNpZnkgdGhlIHJlcXVlc3RlZCBtZW1vcnkncworICogbG9jYXRpb24uCiAgKi8KIHR5cGVkZWYgZW51bSB7CiAgIC8qIEludGVybmFsICovCkBAIC0xMjgsMTA0ICsxMzMsMjQ3IEBACiAKIH0gTUVNT1JZX1NFQ1RJT047CiAKLQotLyoqCi0gKiBUaGUgSF8gcHJlZml4IGluZGljYXRlcyBoZWFkZXIgZmlsZSB2ZXJzaW9uLCB0aGUgQ18qIHByZWZpeCBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIG9iamVjdCB2ZXJzaW9uLgorLyohIFxhZGR0b2dyb3VwIFNZU0xJQl9NRU1PUllfTUFDUk9TIEZESyBtZW1vcnkgbWFjcm9zCiAgKgotICogRGVjbGFyaW5nIG1lbW9yeSBhcmVhcyByZXF1aXJlcyB0byBzcGVjaWZ5IGEgdW5pcXVlIG5hbWUgYW5kIGEgZGF0YSB0eXBlLiBVc2UgdGhlIEhfIG1hY3JvCi0gKiBmb3IgdGhpcyBwdXJwb3NlIGluc2lkZSBhIGhlYWRlciBmaWxlLgorICogVGhlIFxjIEhfIHByZWZpeCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWFjcm8gaXMgdG8gYmUgdXNlZCBpbiBhIGhlYWRlciBmaWxlLCB0aGUKKyAqIFxjIENfIHByZWZpeCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWFjcm8gaXMgdG8gYmUgdXNlZCBpbiBhIHNvdXJjZSBmaWxlLgogICoKLSAqIEZvciBkZWZpbmluZyBhIG1lbW9yeSBhcmVhIHlvdXIgcmVxdWlyZSBhZGRpdGlvbmFsbHkgb25lIG9yIHR3byBzaXplcywgZGVwZW5kaW5nIGlmIHRoZQotICogbWVtb3J5IHNob3VsZCBiZSBvcmdhbml6ZWQgaW50byBvbmUgb3IgdHdvIGRpbWVuc2lvbnMuCisgKiBEZWNsYXJpbmcgbWVtb3J5IGFyZWFzIHJlcXVpcmVzIHRvIHNwZWNpZnkgYSB1bmlxdWUgbmFtZSBhbmQgYSBkYXRhIHR5cGUuCiAgKgotICogVGhlIG1hY3JvcyBjb250YWluaW5nIHRoZSBrZXl3b3JkIEFBTExPQyBpbnN0ZWFkIG9mIEFMTE9DIGFsc28gZG8gdGFrZSBjYXJlIG9mIHJldHVybmluZwotICogYWxpZ25lZCBtZW1vcnkgYWRkcmVzc2VzIChiZXlvbmQgdGhlIG5hdHVyYWwgYWxpZ25tZW50IG9mIGl0cyB0eXBlKS4gVGhlIHByZXByb2Nlc29yIG1hY3JvCi0gKiA6OkFMSUdOTUVOVF9ERUZBVUxUIGluZGljYXRlcyB0aGUgYWxpZ21lbnQgdG8gYmUgdXNlZCAodGhpcyBpcyBoYXJkd2FyZSBzcGVjaWZpYykuCisgKiBGb3IgZGVmaW5pbmcgYSBtZW1vcnkgYXJlYSB5b3UgcmVxdWlyZSBhZGRpdGlvbmFsbHkgb25lIG9yIHR3byBzaXplcywKKyAqIGRlcGVuZGluZyBpZiB0aGUgbWVtb3J5IHNob3VsZCBiZSBvcmdhbml6ZWQgaW50byBvbmUgb3IgdHdvIGRpbWVuc2lvbnMuCiAgKgotICogVGhlIF9MIHN1ZmZpeCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVtb3J5IHdpbGwgYmUgbG9jYXRlZCBpbiBhIHNwZWNpZmljIHNlY3Rpb24uIFRoaXMgaXMKLSAqIHVzZWZ1bCB0byBhbGxvY2F0ZSBjcml0aWNhbCBtZW1vcnkgc2VjdGlvbiBpbnRvIGZhc3QgaW50ZXJuYWwgU1JBTSBmb3IgZXhhbXBsZS4KKyAqIFRoZSBtYWNyb3MgY29udGFpbmluZyB0aGUga2V5d29yZCBcYyBBQUxMT0MgaW5zdGVhZCBvZiBcYyBBTExPQyBhZGRpdGlvbmFsbHkKKyAqIHRha2UgY2FyZSBvZiByZXR1cm5pbmcgYWxpZ25lZCBtZW1vcnkgYWRkcmVzc2VzIChiZXlvbmQgdGhlIG5hdHVyYWwgYWxpZ25tZW50CisgKiBvZiBpdHMgdHlwZSkuIFRoZSBwcmVwcm9jZXNvciBtYWNybworICogOjpBTElHTk1FTlRfREVGQVVMVCBpbmRpY2F0ZXMgdGhlIGFsaWdtZW50IHRvIGJlIHVzZWQgKHRoaXMgaXMgaGFyZHdhcmUKKyAqIHNwZWNpZmljKS4KICAqCisgKiBUaGUgXGMgX0wgc3VmZml4IGluZGljYXRlcyB0aGF0IHRoZSBtZW1vcnkgd2lsbCBiZSBsb2NhdGVkIGluIGEgc3BlY2lmaWMKKyAqIHNlY3Rpb24uIFRoaXMgaXMgdXNlZnVsIHRvIGFsbG9jYXRlIGNyaXRpY2FsIG1lbW9yeSBzZWN0aW9uIGludG8gZmFzdAorICogaW50ZXJuYWwgU1JBTSBmb3IgZXhhbXBsZS4KKyAqCisgKiBAewogICovCiAKLSNkZWZpbmUgSF9BTExPQ19NRU0obmFtZSx0eXBlKSAgICAgICAgICB0eXBlICogR2V0ICMjIG5hbWUoaW50IG49MCk7IHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKTsKKy8qKiBTZWUgXHJlZiBTWVNMSUJfTUVNT1JZX01BQ1JPUyBmb3IgZGVzY3JpcHRpb24uICovCisjZGVmaW5lIEhfQUxMT0NfTUVNKG5hbWUsIHR5cGUpIFwKKyAgdHlwZSAqR2V0IyNuYW1lKGludCBuID0gMCk7ICAgXAorICB2b2lkIEZyZWUjI25hbWUodHlwZSAqKnApOyAgICBcCisgIFVJTlQgR2V0UmVxdWlyZWRNZW0jI25hbWUodm9pZCk7CiAKLS8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KLSNkZWZpbmUgSF9BTExPQ19NRU1fT1ZFUkxBWShuYW1lLHR5cGUpICB0eXBlICogR2V0ICMjIG5hbWUoaW50IG49MCk7IHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKTsKKy8qKiBTZWUgXHJlZiBTWVNMSUJfTUVNT1JZX01BQ1JPUyBmb3IgZGVzY3JpcHRpb24uICovCisjZGVmaW5lIEhfQUxMT0NfTUVNX09WRVJMQVkobmFtZSwgdHlwZSkgXAorICB0eXBlICpHZXQjI25hbWUoaW50IG4gPSAwKTsgICAgICAgICAgIFwKKyAgdm9pZCBGcmVlIyNuYW1lKHR5cGUgKipwKTsgICAgICAgICAgICBcCisgIFVJTlQgR2V0UmVxdWlyZWRNZW0jI25hbWUodm9pZCk7CiAKKy8qKiBTZWUgXHJlZiBTWVNMSUJfTUVNT1JZX01BQ1JPUyBmb3IgZGVzY3JpcHRpb24uICovCisjZGVmaW5lIENfQUxMT0NfTUVNKG5hbWUsIHR5cGUsIG51bSkgICAgICAgICAgICAgICBcCisgIHR5cGUgKkdldCMjbmFtZShpbnQgbikgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRkRLX0FTU0VSVCgobikgPT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICgodHlwZSAqKUZES2NhbGxvYyhudW0sIHNpemVvZih0eXBlKSkpOyBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgRnJlZSMjbmFtZSh0eXBlICoqcCkgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGREtmcmVlKCpwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqcCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVJTlQgR2V0UmVxdWlyZWRNZW0jI25hbWUodm9pZCkgeyAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG51bSkgKiBzaXplb2YodHlwZSkpOyBcCisgIH0KIAotICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCi0gICNkZWZpbmUgQ19BTExPQ19NRU0obmFtZSx0eXBlLG51bSkgXAotICAgIHR5cGUgKiBHZXQgIyMgbmFtZShpbnQgbikgeyBGREtfQVNTRVJUKChuKSA9PSAwKTsgcmV0dXJuICgodHlwZSopRkRLY2FsbG9jKG51bSwgc2l6ZW9mKHR5cGUpKSk7IH0gXAotICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLZnJlZSgqcCk7ICpwPU5VTEw7IH0gfSBcCi0gICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG51bSkgKiBzaXplb2YodHlwZSkpOyB9CisvKiogU2VlIFxyZWYgU1lTTElCX01FTU9SWV9NQUNST1MgZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBDX0FMTE9DX01FTTIobmFtZSwgdHlwZSwgbjEsIG4yKSAgICAgICAgICAgICAgICAgXAorICB0eXBlICpHZXQjI25hbWUoaW50IG4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZES19BU1NFUlQoKG4pIDwgKG4yKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAoKHR5cGUgKilGREtjYWxsb2MobjEsIHNpemVvZih0eXBlKSkpOyAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEZyZWUjI25hbWUodHlwZSAqKnApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRkRLZnJlZSgqcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKnAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVSU5UIEdldFJlcXVpcmVkTWVtIyNuYW1lKHZvaWQpIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChuMSkgKiBzaXplb2YodHlwZSkpICogKG4yKTsgXAorICB9CiAKLSAgLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLwotICAjZGVmaW5lIENfQUxMT0NfTUVNX1NUQVRJQyhuYW1lLHR5cGUsbnVtKSBcCi0gICAgc3RhdGljIHR5cGUgKiBHZXQgIyMgbmFtZShpbnQgbikgeyBGREtfQVNTRVJUKChuKSA9PSAwKTsgcmV0dXJuICgodHlwZSopRkRLY2FsbG9jKG51bSwgc2l6ZW9mKHR5cGUpKSk7IH0gXAotICAgIHN0YXRpYyB2b2lkIEZyZWUgIyMgbmFtZSh0eXBlKiogcCkgeyBpZiAocCAhPSBOVUxMKSB7IEZES2ZyZWUoKnApOyAqcD1OVUxMOyB9IH0gXAotICAgIHN0YXRpYyBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobnVtKSAqIHNpemVvZih0eXBlKSk7IH0KKy8qKiBTZWUgXHJlZiBTWVNMSUJfTUVNT1JZX01BQ1JPUyBmb3IgZGVzY3JpcHRpb24uICovCisjZGVmaW5lIENfQUFMTE9DX01FTShuYW1lLCB0eXBlLCBudW0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZSAqR2V0IyNuYW1lKGludCBuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgKmFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRkRLX0FTU0VSVCgobikgPT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcCA9ICgodHlwZSAqKUZES2FhbGxvYygobnVtKSAqIHNpemVvZih0eXBlKSwgQUxJR05NRU5UX0RFRkFVTFQpKTsgXAorICAgIHJldHVybiBhcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGcmVlIyNuYW1lKHR5cGUgKipwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGREthZnJlZSgqcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpwID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVUlOVCBHZXRSZXF1aXJlZE1lbSMjbmFtZSh2b2lkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChudW0pICogc2l6ZW9mKHR5cGUpICsgQUxJR05NRU5UX0RFRkFVTFQgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvaWQgKikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCi0gIC8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KLSAgI2RlZmluZSBDX0FMTE9DX01FTTIobmFtZSx0eXBlLG4xLG4yKSBcCi0gICAgdHlwZSAqIEdldCAjIyBuYW1lIChpbnQgbikgeyBGREtfQVNTRVJUKChuKSA8IChuMikpOyByZXR1cm4gKCh0eXBlKilGREtjYWxsb2MobjEsIHNpemVvZih0eXBlKSkpOyB9IFwKLSAgICB2b2lkIEZyZWUgIyMgbmFtZSh0eXBlKiogcCkgeyBpZiAocCAhPSBOVUxMKSB7IEZES2ZyZWUoKnApOyAqcD1OVUxMOyB9IH0gXAotICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKSB7IHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChuMSkgKiBzaXplb2YodHlwZSkpICogKG4yKTsgfQorLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgQ19BQUxMT0NfTUVNMihuYW1lLCB0eXBlLCBuMSwgbjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKkdldCMjbmFtZShpbnQgbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgKmFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGREtfQVNTRVJUKChuKSA8IChuMikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXAgPSAoKHR5cGUgKilGREthYWxsb2MoKG4xKSAqIHNpemVvZih0eXBlKSwgQUxJR05NRU5UX0RFRkFVTFQpKTsgXAorICAgIHJldHVybiBhcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgRnJlZSMjbmFtZSh0eXBlICoqcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZES2FmcmVlKCpwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqcCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVJTlQgR2V0UmVxdWlyZWRNZW0jI25hbWUodm9pZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChuMSkgKiBzaXplb2YodHlwZSkgKyBBTElHTk1FTlRfREVGQVVMVCArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSkgKiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIChuMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKLSAgLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLwotICAjZGVmaW5lIENfQUFMTE9DX01FTShuYW1lLHR5cGUsbnVtKSBcCi0gICAgdHlwZSAqIEdldCAjIyBuYW1lKGludCBuKSB7IEZES19BU1NFUlQoKG4pID09IDApOyByZXR1cm4gKCh0eXBlKilGREthYWxsb2MoKG51bSkqc2l6ZW9mKHR5cGUpLCBBTElHTk1FTlRfREVGQVVMVCkpOyB9IFwKLSAgICB2b2lkIEZyZWUgIyMgbmFtZSh0eXBlKiogcCkgeyBpZiAocCAhPSBOVUxMKSB7IEZES2FmcmVlKCpwKTsgKnA9TlVMTDsgfSB9IFwKLSAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobnVtKSAqIHNpemVvZih0eXBlKSArIEFMSUdOTUVOVF9ERUZBVUxUICsgc2l6ZW9mKHZvaWQgKikpOyB9CisvKiogU2VlIFxyZWYgU1lTTElCX01FTU9SWV9NQUNST1MgZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBDX0FMTE9DX01FTV9MKG5hbWUsIHR5cGUsIG51bSwgcykgICAgICAgICAgICAgICBcCisgIHR5cGUgKkdldCMjbmFtZShpbnQgbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGREtfQVNTRVJUKChuKSA9PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAoKHR5cGUgKilGREtjYWxsb2NfTChudW0sIHNpemVvZih0eXBlKSwgcykpOyBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGcmVlIyNuYW1lKHR5cGUgKipwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGREtmcmVlX0woKnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpwID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVUlOVCBHZXRSZXF1aXJlZE1lbSMjbmFtZSh2b2lkKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChudW0pICogc2l6ZW9mKHR5cGUpKTsgICAgICBcCisgIH0KIAotICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCi0gICNkZWZpbmUgQ19BQUxMT0NfTUVNMihuYW1lLHR5cGUsbjEsbjIpIFwKLSAgICB0eXBlICogR2V0ICMjIG5hbWUgKGludCBuKSB7IEZES19BU1NFUlQoKG4pIDwgKG4yKSk7IHJldHVybiAoKHR5cGUqKUZES2FhbGxvYygobjEpKnNpemVvZih0eXBlKSwgQUxJR05NRU5UX0RFRkFVTFQpKTsgfSBcCi0gICAgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREthZnJlZSgqcCk7ICpwPU5VTEw7IH0gfSBcCi0gICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG4xKSAqIHNpemVvZih0eXBlKSArIEFMSUdOTUVOVF9ERUZBVUxUICsgc2l6ZW9mKHZvaWQgKikpICogKG4yKTsgfQorLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgQ19BTExPQ19NRU0yX0wobmFtZSwgdHlwZSwgbjEsIG4yLCBzKSAgICAgICAgICAgIFwKKyAgdHlwZSAqR2V0IyNuYW1lKGludCBuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGREtfQVNTRVJUKChuKSA8IChuMikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKHR5cGUgKilGREtjYWxsb2NfTChuMSwgc2l6ZW9mKHR5cGUpLCBzKTsgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGcmVlIyNuYW1lKHR5cGUgKipwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZES2ZyZWVfTCgqcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpwID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVUlOVCBHZXRSZXF1aXJlZE1lbSMjbmFtZSh2b2lkKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobjEpICogc2l6ZW9mKHR5cGUpKSAqIChuMik7IFwKKyAgfQogCi0gIC8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KLSAgI2RlZmluZSBDX0FMTE9DX01FTV9MKG5hbWUsdHlwZSxudW0scykgXAotICAgIHR5cGUgKiBHZXQgIyMgbmFtZShpbnQgbikgeyBGREtfQVNTRVJUKChuKSA9PSAwKTsgcmV0dXJuICgodHlwZSopRkRLY2FsbG9jX0wobnVtLCBzaXplb2YodHlwZSksIHMpKTsgfSBcCi0gICAgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREtmcmVlX0woKnApOyAqcD1OVUxMOyB9IH0gXAotICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKSB7IHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChudW0pICogc2l6ZW9mKHR5cGUpKTsgfQorLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgQ19BQUxMT0NfTUVNX0wobmFtZSwgdHlwZSwgbnVtLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKkdldCMjbmFtZShpbnQgbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgKmFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGREtfQVNTRVJUKChuKSA9PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXAgPSAoKHR5cGUgKilGREthYWxsb2NfTCgobnVtKSAqIHNpemVvZih0eXBlKSwgQUxJR05NRU5UX0RFRkFVTFQsIHMpKTsgXAorICAgIHJldHVybiBhcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgRnJlZSMjbmFtZSh0eXBlICoqcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZES2FmcmVlX0woKnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqcCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVJTlQgR2V0UmVxdWlyZWRNZW0jI25hbWUodm9pZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChudW0pICogc2l6ZW9mKHR5cGUpICsgQUxJR05NRU5UX0RFRkFVTFQgKyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KIAotICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCi0gICNkZWZpbmUgQ19BTExPQ19NRU0yX0wobmFtZSx0eXBlLG4xLG4yLHMpIFwKLSAgICB0eXBlICogR2V0ICMjIG5hbWUgKGludCBuKSB7IEZES19BU1NFUlQoKG4pIDwgKG4yKSk7IHJldHVybiAodHlwZSopRkRLY2FsbG9jX0wobjEsIHNpemVvZih0eXBlKSwgcyk7IH0gXAotICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLZnJlZV9MKCpwKTsgKnA9TlVMTDsgfSB9IFwKLSAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobjEpICogc2l6ZW9mKHR5cGUpKSAqIChuMik7IH0KKy8qKiBTZWUgXHJlZiBTWVNMSUJfTUVNT1JZX01BQ1JPUyBmb3IgZGVzY3JpcHRpb24uICovCisjZGVmaW5lIENfQUFMTE9DX01FTTJfTChuYW1lLCB0eXBlLCBuMSwgbjIsIHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKkdldCMjbmFtZShpbnQgbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSAqYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRkRLX0FTU0VSVCgobikgPCAobjIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXAgPSAoKHR5cGUgKilGREthYWxsb2NfTCgobjEpICogc2l6ZW9mKHR5cGUpLCBBTElHTk1FTlRfREVGQVVMVCwgcykpOyBcCisgICAgcmV0dXJuIGFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgRnJlZSMjbmFtZSh0eXBlICoqcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGREthZnJlZV9MKCpwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqcCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVJTlQgR2V0UmVxdWlyZWRNZW0jI25hbWUodm9pZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG4xKSAqIHNpemVvZih0eXBlKSArIEFMSUdOTUVOVF9ERUZBVUxUICsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvaWQgKikpICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIChuMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KIAotICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCi0gICNkZWZpbmUgQ19BQUxMT0NfTUVNX0wobmFtZSx0eXBlLG51bSxzKSBcCi0gICAgdHlwZSAqIEdldCAjIyBuYW1lKGludCBuKSB7IEZES19BU1NFUlQoKG4pID09IDApOyByZXR1cm4gKCh0eXBlKilGREthYWxsb2NfTCgobnVtKSpzaXplb2YodHlwZSksIEFMSUdOTUVOVF9ERUZBVUxULCBzKSk7IH0gXAotICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLYWZyZWVfTCgqcCk7ICpwPU5VTEw7IH0gfSBcCi0gICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG51bSkgKiBzaXplb2YodHlwZSkgKyBBTElHTk1FTlRfREVGQVVMVCArIHNpemVvZih2b2lkICopKTsgfQorLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgQ19BTExPQ19NRU1fT1ZFUkxBWShuYW1lLCB0eXBlLCBudW0sIHNlY3QsIHRhZykgXAorICBDX0FBTExPQ19NRU1fTChuYW1lLCB0eXBlLCBudW0sIHNlY3QpCiAKLSAgLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLwotICAjZGVmaW5lIENfQUFMTE9DX01FTTJfTChuYW1lLHR5cGUsbjEsbjIscykgXAotICAgIHR5cGUgKiBHZXQgIyMgbmFtZSAoaW50IG4pIHsgRkRLX0FTU0VSVCgobikgPCAobjIpKTsgcmV0dXJuICgodHlwZSopRkRLYWFsbG9jX0woKG4xKSpzaXplb2YodHlwZSksIEFMSUdOTUVOVF9ERUZBVUxULCBzKSk7IH0gXAotICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLYWZyZWVfTCgqcCk7ICpwPU5VTEw7IH0gfSBcCi0gICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG4xKSAqIHNpemVvZih0eXBlKSArIEFMSUdOTUVOVF9ERUZBVUxUICsgc2l6ZW9mKHZvaWQgKikpICogKG4yKTsgfQorLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChuYW1lLCB0eXBlLCBuKSAgICAgICAgICAgICAgICAgXAorICB0eXBlIF8jI25hbWVbKG4pICsgKEFMSUdOTUVOVF9ERUZBVUxUICsgc2l6ZW9mKHR5cGUpIC0gMSldOyBcCisgIHR5cGUgKm5hbWUgPSAodHlwZSAqKUFMSUdOX1BUUihfIyNuYW1lKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgQ19BTExPQ19BTElHTkVEX1JFR0lTVEVSKG5hbWUsIChuKSAqIHNpemVvZih0eXBlKSk7CiAKLS8qKiBTZWUgI0hfQUxMT0NfTUVNX09WRVJMQVkgZm9yIGRlc2NyaXB0aW9uLiAqLworLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgQ19BTExPQ19TQ1JBVENIX1NUQVJUKG5hbWUsIHR5cGUsIG4pIHR5cGUgbmFtZVtuXTsKIAorLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgQ19BQUxMT0NfU0NSQVRDSF9FTkQobmFtZSwgdHlwZSwgbikgQ19BTExPQ19BTElHTkVEX1VOUkVHSVNURVIobmFtZSk7CisvKiogU2VlIFxyZWYgU1lTTElCX01FTU9SWV9NQUNST1MgZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBDX0FMTE9DX1NDUkFUQ0hfRU5EKG5hbWUsIHR5cGUsIG4pCiAKLSAgI2RlZmluZSBDX0FMTE9DX01FTV9PVkVSTEFZKG5hbWUsdHlwZSxudW0sc2VjdCx0YWcpIENfQUFMTE9DX01FTV9MKG5hbWUsdHlwZSxudW0sc2VjdCkKKy8qKiBTZWUgXHJlZiBTWVNMSUJfTUVNT1JZX01BQ1JPUyBmb3IgZGVzY3JpcHRpb24uICovCisjZGVmaW5lIENfQUFMTE9DX1NUQUNLX1NUQVJUKG5hbWUsIHR5cGUsIG4pICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZSBfIyNuYW1lWyhuKSArIChBTElHTk1FTlRfREVGQVVMVCArIHNpemVvZih0eXBlKSAtIDEpXTsgXAorICB0eXBlICpuYW1lID0gKHR5cGUgKilBTElHTl9QVFIoXyMjbmFtZSk7ICAgICAgICAgICAgICAgICAgICBcCisgIENfQUxMT0NfQUxJR05FRF9SRUdJU1RFUihuYW1lLCAobikgKiBzaXplb2YodHlwZSkpOwogCisvKiogU2VlIFxyZWYgU1lTTElCX01FTU9SWV9NQUNST1MgZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBDX0FBTExPQ19TVEFDS19FTkQobmFtZSwgdHlwZSwgbikgQ19BTExPQ19BTElHTkVEX1VOUkVHSVNURVIobmFtZSk7CiAKLSAgICNkZWZpbmUgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChuYW1lLHR5cGUsbikgXAotICAgICB0eXBlIF8gIyMgbmFtZVsobikrKEFMSUdOTUVOVF9ERUZBVUxUK3NpemVvZih0eXBlKS0xKV07IFwKLSAgICAgdHlwZSAqIG5hbWUgPSAodHlwZSopQUxJR05fUFRSKF8gIyMgbmFtZSk7IFwKKy8qISBAfSAqLwogCi0gICAjZGVmaW5lIENfQUxMT0NfU0NSQVRDSF9TVEFSVChuYW1lLHR5cGUsbikgXAotICAgICB0eXBlIG5hbWVbbl07CisjZGVmaW5lIENfQUxMT0NfQUxJR05FRF9SRUdJU1RFUih4LCBzaXplKQorI2RlZmluZSBDX0FMTE9DX0FMSUdORURfVU5SRUdJU1RFUih4KQorI2RlZmluZSBDX0FMTE9DX0FMSUdORURfQ0hFQ0soeCkKKyNkZWZpbmUgQ19BTExPQ19BTElHTkVEX0NIRUNLMih4LCB5KQorI2RlZmluZSBGREtfc2hvd0JhY2t0cmFjZShhLCBiKQogCi0gICAjZGVmaW5lIENfQUFMTE9DX1NDUkFUQ0hfRU5EKG5hbWUsdHlwZSxuKQotICAgI2RlZmluZSBDX0FMTE9DX1NDUkFUQ0hfRU5EKG5hbWUsdHlwZSxuKQotCisvKiEgXGFkZHRvZ3JvdXAgU1lTTElCX0VYSVRDT0RFUyBVbmlmaWVkIGV4aXQgY29kZXMKKyAqICBFeGl0IGNvZGVzIHRvIGJlIHVzZWQgYXMgcmV0dXJuIHZhbHVlcyBvZiBGREsgc29mdHdhcmUgdGVzdCBhbmQKKyAqIGRlbW9uc3RyYXRpb24gYXBwbGljYXRpb25zLiBOb3QgYXMgcmV0dXJuIHZhbHVlcyBvZiBwcm9kdWN0IG1vZHVsZXMgYW5kL29yCisgKiBsaWJyYXJpZXMuCisgKiAgQHsKKyAqLworI2RlZmluZSBGREtfRVhJVENPREVfT0sgMCAvKiE8IFN1Y2Nlc3NmdWwgdGVybWluYXRpb24uIE5vIGVycm9ycy4gKi8KKyNkZWZpbmUgRkRLX0VYSVRDT0RFX1VTQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDY0IC8qITwgVGhlIGNvbW1hbmQvYXBwbGljYXRpb24gd2FzIHVzZWQgaW5jb3JyZWN0bHksIGUuZy4gd2l0aCB0aGUgd3JvbmcgXAorICAgICAgICBudW1iZXIgb2YgYXJndW1lbnRzLCBhIGJhZCBmbGFnLCBhIGJhZCBzeW50YXggaW4gYSBwYXJhbWV0ZXIsIG9yICAgIFwKKyAgICAgICAgd2hhdGV2ZXIuICovCisjZGVmaW5lIEZES19FWElUQ09ERV9EQVRBRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgNjUgLyohPCBUaGUgaW5wdXQgZGF0YSB3YXMgaW5jb3JyZWN0IGluIHNvbWUgd2F5LiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgXAorICAgICAgICBmb3IgdXNlciBkYXRhIGFuZCBub3Qgc3lzdGVtIGZpbGVzLiAqLworI2RlZmluZSBGREtfRVhJVENPREVfTk9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgNjYgLyohPCBBbiBpbnB1dCBmaWxlIChub3QgYSBzeXN0ZW0gZmlsZSkgZGlkIG5vdCBleGlzdCBvciB3YXMgbm90IHJlYWRhYmxlLiBcCisgICAgICAqLworI2RlZmluZSBGREtfRVhJVENPREVfVU5BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA2OSAvKiE8IEEgc2VydmljZSBpcyB1bmF2YWlsYWJsZS4gVGhpcyBjYW4gb2NjdXIgaWYgYSBzdXBwb3J0IHByb2dyYW0gb3IgICAgXAorICAgICAgICBmaWxlIGRvZXMgbm90IGV4aXN0LiBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBjYXRjaGFsbCBtZXNzYWdlIHdoZW4gXAorICAgICAgICBzb21ldGhpbmcgeW91IHdhbnRlZCB0byBkbyBkb2Vzbid0IHdvcmssIGJ1dCB5b3UgZG9uJ3Qga25vdyB3aHkuICovCisjZGVmaW5lIEZES19FWElUQ09ERV9TT0ZUV0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA3MCAvKiE8IEFuIGludGVybmFsIHNvZnR3YXJlIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLiBUaGlzIHNob3VsZCBiZSBsaW1pdGVkIFwKKyAgICAgICAgdG8gbm9uLSBvcGVyYXRpbmcgc3lzdGVtIHJlbGF0ZWQgZXJyb3JzIGFzIHBvc3NpYmxlLiAqLworI2RlZmluZSBGREtfRVhJVENPREVfQ0FOVENSRUFURSBcCisgIDczIC8qITwgQSAodXNlciBzcGVjaWZpZWQpIG91dHB1dCBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLiAqLworI2RlZmluZSBGREtfRVhJVENPREVfSU9FUlJPUiBcCisgIDc0IC8qITwgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZG9pbmcgSS9PIG9uIHNvbWUgZmlsZS4gKi8KKy8qISBAfSAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBSdW50aW1lIHN1cHBvcnQgZGVjbGFyYXRpb25zCkBAIC0yMzQsNTcgKzM4Miw1MiBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotLyoqIHByaW50ZigpIHVzaW5nIHN0ZG91dC4gSWYgOjpBUkNIX1dBX0ZMVVNIX0NPTlNPTEUgZGVmaW5lZCwgYSBmbHVzaCBpcyAgZG9uZSBhZGRpdGlvbmFsbHkgYWZ0ZXIgcHJpbnRmKCkuICovCi12b2lkIEZES3ByaW50ZiAgICAoIGNvbnN0IGNoYXIqIHN6Rm10LCAuLi4pOwordm9pZCBGREtwcmludGYoY29uc3QgY2hhciAqc3pGbXQsIC4uLik7CiAKLS8qKiBwcmludGYoKSB1c2luZyBzdGRlcnIuIElmIDo6QVJDSF9XQV9GTFVTSF9DT05TT0xFIGRlZmluZWQsIGEgZmx1c2ggaXMgZG9uZSBhZGRpdGlvbmFsbHkgYWZ0ZXIgcHJpbnRmKCkuICovCi12b2lkIEZES3ByaW50ZkVyciAoIGNvbnN0IGNoYXIqIHN6Rm10LCAuLi4pOwordm9pZCBGREtwcmludGZFcnIoY29uc3QgY2hhciAqc3pGbXQsIC4uLik7CiAKIC8qKiBXcmFwcGVyIGZvciA8c3RkaW8uaD4ncyBnZXRjaGFyKCkuICovCiBpbnQgRkRLZ2V0Y2hhcih2b2lkKTsKIAotSU5UICBGREtmcHJpbnRmKHZvaWQgICpzdHJlYW0sICBjb25zdCAgY2hhciAqZm9ybWF0LCAuLi4pOwotSU5UICBGREtzcHJpbnRmKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworSU5UIEZES2ZwcmludGYodm9pZCAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitJTlQgRkRLc3ByaW50ZihjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKIAotCi0KLWNvbnN0IGNoYXIgKkZES3N0cmNocihjb25zdCBjaGFyICpzLCBJTlQgYyk7CitjaGFyICpGREtzdHJjaHIoY2hhciAqcywgSU5UIGMpOwogY29uc3QgY2hhciAqRkRLc3Ryc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpOwogY2hhciAqRkRLc3RyY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYyk7CiBjaGFyICpGREtzdHJuY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgVUlOVCBuKTsKIAotI2RlZmluZSBGREtfTUFYX09WRVJMQVlTIDggICAvKio8IE1heGltdW0gbnVtYmVyIG9mIG1lbW9yeSBvdmVybGF5cy4gKi8KKyNkZWZpbmUgRkRLX01BWF9PVkVSTEFZUyA4IC8qKjwgTWF4aW11bSBudW1iZXIgb2YgbWVtb3J5IG92ZXJsYXlzLiAqLwogCi0KLXZvaWQgKkZES2NhbGxvYyAoY29uc3QgVUlOVCBuLCBjb25zdCBVSU5UIHNpemUpOwotdm9pZCAqRkRLbWFsbG9jIChjb25zdCBVSU5UIHNpemUpOwotdm9pZCAgRkRLZnJlZSAgICh2b2lkICpwdHIpOwordm9pZCAqRkRLY2FsbG9jKGNvbnN0IFVJTlQgbiwgY29uc3QgVUlOVCBzaXplKTsKK3ZvaWQgKkZES21hbGxvYyhjb25zdCBVSU5UIHNpemUpOwordm9pZCBGREtmcmVlKHZvaWQgKnB0cik7CiAKIC8qKgotICogIEFsbG9jYXRlIGFuZCBjbGVhciBhbiBhbGlnbmVkIG1lbW9yeSBhcmVhLiBVc2UgRkRLYWZyZWUoKSBpbnN0ZWFkIG9mIEZES2ZyZWUoKSBmb3IgdGhlc2UgbWVtb3J5IGFyZWFzLgorICogIEFsbG9jYXRlIGFuZCBjbGVhciBhbiBhbGlnbmVkIG1lbW9yeSBhcmVhLiBVc2UgRkRLYWZyZWUoKSBpbnN0ZWFkIG9mCisgKiBGREtmcmVlKCkgZm9yIHRoZXNlIG1lbW9yeSBhcmVhcy4KICAqCiAgKiBccGFyYW0gc2l6ZSAgICAgICBTaXplIG9mIHJlcXVlc3RlZCBtZW1vcnkgaW4gYnl0ZXMuCiAgKiBccGFyYW0gYWxpZ25tZW50ICBBbGlnbm1lbnQgb2YgcmVxdWVzdGVkIG1lbW9yeSBpbiBieXRlcy4KICAqIFxyZXR1cm4gICAgICAgICAgIFBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeS4KICAqLwotdm9pZCAqRkRLYWFsbG9jIChjb25zdCBVSU5UIHNpemUsIGNvbnN0IFVJTlQgYWxpZ25tZW50KTsKK3ZvaWQgKkZES2FhbGxvYyhjb25zdCBVSU5UIHNpemUsIGNvbnN0IFVJTlQgYWxpZ25tZW50KTsKIAogLyoqCiAgKiAgRnJlZSBhbiBhbGlnbmVkIG1lbW9yeSBhcmVhLgogICoKICAqIFxwYXJhbSBwdHIgIFBvaW50ZXIgdG8gYmUgZnJlZWQuCi0gKiBccmV0dXJuICAgICB2b2lkCiAgKi8KLXZvaWQgRkRLYWZyZWUgKHZvaWQgKnB0cik7Ci0KK3ZvaWQgRkRLYWZyZWUodm9pZCAqcHRyKTsKIAogLyoqCiAgKiAgQWxsb2NhdGUgbWVtb3J5IGluIGEgc3BlY2lmaWMgbWVtb3J5IHNlY3Rpb24uCiAgKiAgUmVxdWVzdHMgY2FuIGJlIG1hZGUgZm9yIGludGVybmFsIG9yIGV4dGVybmFsIG1lbW9yeS4gSWYgaW50ZXJuYWwgbWVtb3J5IGlzCi0gKiAgcmVxdWVzdGVkLCBGREtjYWxsb2NfTCgpIGZpcnN0IHRyaWVzIHRvIHVzZSBMMSBtZW1vcnksIHdoaWNoIHNpemVzIGFyZSBkZWZpbmVkCi0gKiAgYnkgOjpEQVRBX0wxX0FfU0laRSBhbmQgOjpEQVRBX0wxX0JfU0laRS4gSWYgbm8gTDEgbWVtb3J5IGlzIGF2YWlsYWJsZSwgdGhlbgotICogIEZES2NhbGxvY19MKCkgdHJpZXMgdG8gdXNlIEwyIG1lbW9yeS4gSWYgdGhhdCBmYWlscyBhcyB3ZWxsLCB0aGUgcmVxdWVzdGVkCi0gKiAgbWVtb3J5IGlzIGFsbG9jYXRlZCBhdCBhbiBleHRlcm4gbG9jYXRpb24gdXNpbmcgdGhlIGZhbGxiYWNrIEZES2NhbGxvYygpLgorICogIHJlcXVlc3RlZCwgRkRLY2FsbG9jX0woKSBmaXJzdCB0cmllcyB0byB1c2UgTDEgbWVtb3J5LCB3aGljaCBzaXplcyBhcmUKKyAqIGRlZmluZWQgYnkgOjpEQVRBX0wxX0FfU0laRSBhbmQgOjpEQVRBX0wxX0JfU0laRS4gSWYgbm8gTDEgbWVtb3J5IGlzCisgKiBhdmFpbGFibGUsIHRoZW4gRkRLY2FsbG9jX0woKSB0cmllcyB0byB1c2UgTDIgbWVtb3J5LiBJZiB0aGF0IGZhaWxzIGFzIHdlbGwsCisgKiB0aGUgcmVxdWVzdGVkIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYXQgYW4gZXh0ZXJuIGxvY2F0aW9uIHVzaW5nIHRoZSBmYWxsYmFjaworICogRkRLY2FsbG9jKCkuCiAgKgogICogXHBhcmFtIG4gICAgIFNlZSBNU0ROIGRvY3VtZW50YXRpb24gb24gY2FsbG9jKCkuCiAgKiBccGFyYW0gc2l6ZSAgU2VlIE1TRE4gZG9jdW1lbnRhdGlvbiBvbiBjYWxsb2MoKS4KQEAgLTMwMiwyMSArNDQ1LDIwIEBACiAvKioKICAqICBGcmVlIG1lbW9yeSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW4gYSBzcGVjaWZpYyBtZW1vcnkgc2VjdGlvbi4KICAqLwotdm9pZCAgRkRLZnJlZV9MKHZvaWQgKnB0cik7Cit2b2lkIEZES2ZyZWVfTCh2b2lkICpwdHIpOwogCiAvKioKICAqICBGcmVlIGFsaWduZWQgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZCBpbiBhIHNwZWNpZmljIG1lbW9yeSBzZWN0aW9uLgogICovCi12b2lkICBGREthZnJlZV9MKHZvaWQgKnB0cik7Ci0KK3ZvaWQgRkRLYWZyZWVfTCh2b2lkICpwdHIpOwogCiAvKioKICAqIENvcHkgbWVtb3J5LiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1lbW9yeSBtdXN0IG5vdCBvdmVybGFwLgogICogRWl0aGVyIHVzZSBpbXBsZW1lbnRhdGlvbiBmcm9tIGEgU3RhbmRhcmQgTGlicmFyeSwgb3IsIGlmIG5vIFN0YW5kYXJkIExpYnJhcnkKICAqIGlzIGF2YWlsYWJsZSwgYSBnZW5lcmljIGltcGxlbWVudGF0aW9uLgotICogVGhlIGRlZmluZSA6OlVTRV9CVUlMVElOX01FTV9GVU5DVElPTlMgaW4gZ2VuZXJpY1N0ZHMuY3BwIGNvbnRyb2xzIHdoYXQgdG8gdXNlLgotICogVGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3JyZXNwb25kIHRvIHRoZSBzdGFuZGFyZCBtZW1jcHkoKS4gUGxlYXNlIHNlZSBNU0ROCi0gKiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIGhvdyB0byB1c2UgaXQuCisgKiBUaGUgZGVmaW5lIDo6VVNFX0JVSUxUSU5fTUVNX0ZVTkNUSU9OUyBpbiBnZW5lcmljU3Rkcy5jcHAgY29udHJvbHMgd2hhdCB0bworICogdXNlLiBUaGUgZnVuY3Rpb24gYXJndW1lbnRzIGNvcnJlc3BvbmQgdG8gdGhlIHN0YW5kYXJkIG1lbWNweSgpLiBQbGVhc2Ugc2VlCisgKiBNU0ROIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSBpdC4KICAqLwogdm9pZCBGREttZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIGNvbnN0IFVJTlQgc2l6ZSk7CiAKQEAgLTMyNCwyMCArNDY2LDIwIEBACiAgKiBDb3B5IG1lbW9yeS4gU291cmNlIGFuZCBkZXN0aW5hdGlvbiBtZW1vcnkgYXJlIGFsbG93ZWQgdG8gb3ZlcmxhcC4KICAqIEVpdGhlciB1c2UgaW1wbGVtZW50YXRpb24gZnJvbSBhIFN0YW5kYXJkIExpYnJhcnksIG9yLCBpZiBubyBTdGFuZGFyZCBMaWJyYXJ5CiAgKiBpcyBhdmFpbGFibGUsIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4KLSAqIFRoZSBkZWZpbmUgOjpVU0VfQlVJTFRJTl9NRU1fRlVOQ1RJT05TIGluIGdlbmVyaWNTdGRzLmNwcCBjb250cm9scyB3aGF0IHRvIHVzZS4KLSAqIFRoZSBmdW5jdGlvbiBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgc3RhbmRhcmQgbWVtbW92ZSgpLiBQbGVhc2Ugc2VlIE1TRE4KLSAqIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSBpdC4KLSovCisgKiBUaGUgZGVmaW5lIDo6VVNFX0JVSUxUSU5fTUVNX0ZVTkNUSU9OUyBpbiBnZW5lcmljU3Rkcy5jcHAgY29udHJvbHMgd2hhdCB0bworICogdXNlLiBUaGUgZnVuY3Rpb24gYXJndW1lbnRzIGNvcnJlc3BvbmQgdG8gdGhlIHN0YW5kYXJkIG1lbW1vdmUoKS4gUGxlYXNlIHNlZQorICogTVNETiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIGhvdyB0byB1c2UgaXQuCisgKi8KIHZvaWQgRkRLbWVtbW92ZSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgY29uc3QgVUlOVCBzaXplKTsKIAogLyoqCiAgKiBDbGVhciBtZW1vcnkuCiAgKiBFaXRoZXIgdXNlIGltcGxlbWVudGF0aW9uIGZyb20gYSBTdGFuZGFyZCBMaWJyYXJ5LCBvciwgaWYgbm8gU3RhbmRhcmQgTGlicmFyeQogICogaXMgYXZhaWxhYmxlLCBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uCi0gKiBUaGUgZGVmaW5lIDo6VVNFX0JVSUxUSU5fTUVNX0ZVTkNUSU9OUyBpbiBnZW5lcmljU3Rkcy5jcHAgY29udHJvbHMgd2hhdCB0byB1c2UuCi0gKiBUaGUgZnVuY3Rpb24gYXJndW1lbnRzIGNvcnJlc3BvbmQgdG8gdGhlIHN0YW5kYXJkIG1lbWNsZWFyKCkuIFBsZWFzZSBzZWUgTVNETgotICogZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiBob3cgdG8gdXNlIGl0LgotKi8KKyAqIFRoZSBkZWZpbmUgOjpVU0VfQlVJTFRJTl9NRU1fRlVOQ1RJT05TIGluIGdlbmVyaWNTdGRzLmNwcCBjb250cm9scyB3aGF0IHRvCisgKiB1c2UuIFRoZSBmdW5jdGlvbiBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgc3RhbmRhcmQgbWVtY2xlYXIoKS4gUGxlYXNlIHNlZQorICogTVNETiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIGhvdyB0byB1c2UgaXQuCisgKi8KIHZvaWQgRkRLbWVtY2xlYXIodm9pZCAqbWVtUHRyLCBjb25zdCBVSU5UIHNpemUpOwogCiAvKioKQEAgLTM0OCw0NSArNDkwLDE4IEBACiB2b2lkIEZES21lbXNldCh2b2lkICptZW1QdHIsIGNvbnN0IElOVCB2YWx1ZSwgY29uc3QgVUlOVCBzaXplKTsKIAogLyogQ29tcGFyZSBmdW5jdGlvbiB3cmFwcGVycyAqLwotSU5UICAgRkRLbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgY29uc3QgVUlOVCBzaXplKTsKLUlOVCAgIEZES3N0cmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOwotSU5UICAgRkRLc3RybmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IFVJTlQgc2l6ZSk7CitJTlQgRkRLbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgY29uc3QgVUlOVCBzaXplKTsKK0lOVCBGREtzdHJjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK0lOVCBGREtzdHJuY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgVUlOVCBzaXplKTsKIAotVUlOVCAgRkRLc3RybGVuKGNvbnN0IGNoYXIgKnMpOworVUlOVCBGREtzdHJsZW4oY29uc3QgY2hhciAqcyk7CiAKLSNkZWZpbmUgRkRLbWF4KGEsYikgKCAoYSkgPiAoYikgPyAoYSk6KGIpKQotI2RlZmluZSBGREttaW4oYSxiKSAoIChhKSA8IChiKSA/IChhKTooYikpCisjZGVmaW5lIEZES21heChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBGREttaW4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKIAogI2RlZmluZSBGREtfSU5UX01BWCAoKElOVCkweDdGRkZGRkZGKQogI2RlZmluZSBGREtfSU5UX01JTiAoKElOVCkweDgwMDAwMDAwKQogCi0vKiBNYXRoIGZ1bmN0aW9uIHdyYXBwZXJzLiBPbmx5IGludGVuZGVkIGZvciBjb21wYXRpYmlsaXR5LCBub3QgdG8gYmUgaGlnaGx5IG9wdGltaXplZC4gKi8KLS8qIFVzZWQgZm9yIGRlYnVnZ2luZywgZGV2IGNvZGUgLi4gKi8KLQotSU5UIEZES2FicyhJTlQgaik7Ci1kb3VibGUgRkRLZmFicyhkb3VibGUgeCk7Ci1kb3VibGUgRkRLcG93KGRvdWJsZSB4LCBkb3VibGUgeSk7Ci1kb3VibGUgRkRLc3FydChkb3VibGUgeCk7Ci1kb3VibGUgRkRLYXRhbihkb3VibGUgeCk7Ci1kb3VibGUgRkRLbG9nKGRvdWJsZSB4KTsKLWRvdWJsZSBGREtzaW4oZG91YmxlIHgpOwotZG91YmxlIEZES2Nvcyhkb3VibGUgeCk7Ci1kb3VibGUgRkRLZXhwKGRvdWJsZSB4KTsKLSNkZWZpbmUgRkRLbG9nMihhKSAoRkRLbG9nKGEpKjEuNDQyNjk1MDQxKSAvKiBsb2coMi4wKSA9IDEuNDQyNjk1MDQxICovCi0jZGVmaW5lIEZES2xvZzEwKGEpIChGREtsb2coYSkqMC40MzQyOTQ0ODIpIC8qIDEuMC9sb2coMTAuMCkgPSAwLjQzNDI5NDQ4MiAqLwotZG91YmxlIEZES2F0YW4yKGRvdWJsZSB5LCBkb3VibGUgeCk7Ci1kb3VibGUgRkRLYWNvcyhkb3VibGUgeCk7Ci1kb3VibGUgRkRLdGFuKGRvdWJsZSB4KTsKLWRvdWJsZSBGREtmbG9vcihkb3VibGUgeCk7Ci1kb3VibGUgRkRLY2VpbChkb3VibGUgeCk7Ci1JTlQgICBGREthdG9pKGNvbnN0IGNoYXIgKm5wdHIpOwotbG9uZyAgRkRLYXRvbChjb25zdCBjaGFyICpucHRyKTsKLWZsb2F0IEZES2F0b2YoY29uc3QgY2hhciAqbnB0cik7Ci0vKiBMT05HIExPTkcgRkRLYXRvbGwoY29uc3QgY2hhciAqbnB0cik7ICovCi0vKiBMT05HIExPTkcgRkRLYXRvcShjb25zdCBjaGFyICpucHRyKTsgKi8KLQotCi0KIC8qIEZJTEUgSS9PICovCiAKIC8qIQpAQCAtMzk0LDE1ICs1MDksNyBAQAogICoKICAqIFxyZXR1cm4gIDEgaWYgcGxhdGZvcm0gaXMgbGl0dGxlIGVuZGlhbiwgbm9uLTEgaWYgcGxhdGZvcm0gaXMgYmlnIGVuZGlhbi4KICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1pbmxpbmUKLSNlbHNlCi1zdGF0aWMKLSNlbmRpZgotaW50IElTX0xJVFRMRV9FTkRJQU4odm9pZCkgewotICBpbnQgX19kdW1teSA9IDE7Ci0gIHJldHVybiAoICooIChVQ0hBUiopKCYoX19kdW1teSkgKSApICk7Ci19CitpbnQgSVNfTElUVExFX0VORElBTih2b2lkKTsKIAogLyohCiAgKiAgQ29udmVydCBpbnB1dCB2YWx1ZSB0byBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KQEAgLTQxMCwxMSArNTE3LDcgQEAKICAqIFxwYXJhbSB2YWwgIFZhbHVlIHRvIGJlIGNvbnZlcnRlZC4gSXQgbWF5IGJlIGluIGJvdGggYmlnIG9yIGxpdHRsZSBlbmRpYW4uCiAgKiBccmV0dXJuICAgICBWYWx1ZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KICAqLwotI2RlZmluZSBUT19MSVRUTEVfRU5ESUFOKHZhbCkgXAotICAoIChJU19MSVRUTEVfRU5ESUFOKCkpID8gXAotICAgICAodmFsKSBcCi0gICA6ICggKCgodmFsKSAmIDB4ZmYpIDw8IDI0KSB8fCAoKCh2YWwpICYgMHhmZjAwKTw8IDgpIHx8ICgoKHZhbCkgJiAweGZmMDAwMCk+PjgpIHx8ICgoKHZhbCkgJiAweGZmMDAwMDAwKSA+PiAyNCkgKSApCi0KK1VJTlQgVE9fTElUVExFX0VORElBTihVSU5UIHZhbCk7CiAKIC8qIQogICogXGZuICAgICBGREtGSUxFICpGREtmb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSk7CkBAIC00MjcsNyArNTMwLDcgQEAKICAqICAgICAgICAgU3RhbmRhcmQgZnRlbGwoKSB3cmFwcGVyLgogICogXGZuICAgICBJTlQgRkRLZmZsdXNoKEZES0ZJTEUgKmZwKTsKICAqICAgICAgICAgU3RhbmRhcmQgZmZsdXNoKCkgd3JhcHBlci4KLSAqIFxmbiAgICAgVUlOVCBGREtmd3JpdGUodm9pZCAqcHRyZiwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKTsKKyAqIFxmbiAgICAgVUlOVCBGREtmd3JpdGUoY29uc3Qgdm9pZCAqcHRyZiwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKTsKICAqICAgICAgICAgU3RhbmRhcmQgZndyaXRlKCkgd3JhcHBlci4KICAqIFxmbiAgICAgVUlOVCBGREtmcmVhZCh2b2lkICpkc3QsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCk7CiAgKiAgICAgICAgIFN0YW5kYXJkIGZyZWFkKCkgd3JhcHBlci4KQEAgLTQ0MCwyNSArNTQzLDI3IEBACiBJTlQgRkRLZnNlZWsoRkRLRklMRSAqRlAsIExPTkcgT0ZGU0VULCBpbnQgV0hFTkNFKTsKIElOVCBGREtmdGVsbChGREtGSUxFICpGUCk7CiBJTlQgRkRLZmZsdXNoKEZES0ZJTEUgKmZwKTsKLVVJTlQgRkRLZndyaXRlKHZvaWQgKnB0cmYsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCk7CitVSU5UIEZES2Z3cml0ZShjb25zdCB2b2lkICpwdHJmLCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApOwogVUlOVCBGREtmcmVhZCh2b2lkICpkc3QsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCk7Ci1jaGFyKiBGREtmZ2V0cyh2b2lkICpkc3QsIElOVCBzaXplLCBGREtGSUxFICpmcCk7CitjaGFyICpGREtmZ2V0cyh2b2lkICpkc3QsIElOVCBzaXplLCBGREtGSUxFICpmcCk7CiB2b2lkIEZES3Jld2luZChGREtGSUxFICpmcCk7CiBJTlQgRkRLZmVvZihGREtGSUxFICpmcCk7CiAKIC8qKgotICogXGJyaWVmICAgICAgICBXcml0ZSBlYWNoIG1lbWJlciBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLiBDb252ZXJ0IGF1dG9tYXRpY2FsbHkgdG8gaG9zdCBlbmRpYW5lc3MuCisgKiBcYnJpZWYgICAgICAgIFdyaXRlIGVhY2ggbWVtYmVyIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIuIENvbnZlcnQgYXV0b21hdGljYWxseQorICogdG8gaG9zdCBlbmRpYW5lc3MuCiAgKiBccGFyYW0gcHRyZiAgIFBvaW50ZXIgdG8gbWVtb3J5IHdoZXJlIHRvIHJlYWQgZGF0YSBmcm9tLgogICogXHBhcmFtIHNpemUgICBTaXplIG9mIGVhY2ggaXRlbSB0byBiZSB3cml0dGVuLgogICogXHBhcmFtIG5tZW1iICBOdW1iZXIgb2YgaXRlbXMgdG8gYmUgd3JpdHRlbi4KICAqIFxwYXJhbSBmcCAgICAgRmlsZSBwb2ludGVyIG9mIHR5cGUgRkRLRklMRS4KICAqIFxyZXR1cm4gICAgICAgTnVtYmVyIG9mIGl0ZW1zIHJlYWQgb24gc3VjY2VzcyBhbmQgZnJlYWQoKSBlcnJvciBvbiBmYWlsdXJlLgogICovCi1VSU5UIEZES2Z3cml0ZV9FTCh2b2lkICpwdHJmLCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApOworVUlOVCBGREtmd3JpdGVfRUwoY29uc3Qgdm9pZCAqcHRyZiwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKTsKIAogLyoqCi0gKiBcYnJpZWYgICAgICAgIFJlYWQgdmFyaWFibGUgb2Ygc2l6ZSAic2l6ZSIgYXMgbGl0dGxlIGVuZGlhbi4gQ29udmVydCBhdXRvbWF0aWNhbGx5IHRvIGhvc3QgZW5kaWFuZXNzLgotICogICAgICAgICAgICAgICAgNC1ieXRlIGFsaWdubWVudCBpcyBlbmZvcmNlZCBmb3IgMjQgYml0IGRhdGEsIGF0IDMyIGJpdCBmdWxsIHNjYWxlLgorICogXGJyaWVmICAgICAgICBSZWFkIHZhcmlhYmxlIG9mIHNpemUgInNpemUiIGFzIGxpdHRsZSBlbmRpYW4uIENvbnZlcnQKKyAqIGF1dG9tYXRpY2FsbHkgdG8gaG9zdCBlbmRpYW5lc3MuIDQtYnl0ZSBhbGlnbm1lbnQgaXMgZW5mb3JjZWQgZm9yIDI0IGJpdAorICogZGF0YSwgYXQgMzIgYml0IGZ1bGwgc2NhbGUuCiAgKiBccGFyYW0gZHN0ICAgIFBvaW50ZXIgdG8gbWVtb3J5IHdoZXJlIHRvIHN0b3JlIGRhdGEgaW50by4KICAqIFxwYXJhbSBzaXplICAgU2l6ZSBvZiBlYWNoIGl0ZW0gdG8gYmUgcmVhZC4KICAqIFxwYXJhbSBubWVtYiAgTnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHJlYWQuCkBAIC00NjcsNyArNTcyLDYgQEAKICAqLwogVUlOVCBGREtmcmVhZF9FTCh2b2lkICpkc3QsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCk7CiAKLQogLyoqCiAgKiBcYnJpZWYgIFByaW50IEZESyBzb2Z0d2FyZSBkaXNjbGFpbWVyLgogICovCkBAIC00NzcsNCArNTgxLDQgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYgLyogX19HRU5FUklDU1REU19IX18gKi8KKyNlbmRpZiAvKiBHRU5FUklDU1REU19IICovCmRpZmYgLS1naXQgYS9saWJTWVMvaW5jbHVkZS9tYWNoaW5lX3R5cGUuaCBiL2xpYlNZUy9pbmNsdWRlL21hY2hpbmVfdHlwZS5oCmluZGV4IGIzMjg5NTMuLmJlOGRlMzcgMTAwNjQ0Ci0tLSBhL2xpYlNZUy9pbmNsdWRlL21hY2hpbmVfdHlwZS5oCisrKyBiL2xpYlNZUy9pbmNsdWRlL21hY2hpbmVfdHlwZS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDEyOSArOTAsMTQ2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBTeXN0ZW0gaW50ZWdyYXRpb24gbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiogXGZpbGUgICBtYWNoaW5lX3R5cGUuaAogICogIFxicmllZiAgVHlwZSBkZWZpbmVzIGZvciB2YXJpb3VzIHByb2Nlc3NvcnMgYW5kIGNvbXBpbGVyIHRvb2xzLgogICovCiAKLSNpZiAhZGVmaW5lZChfX01BQ0hJTkVfVFlQRV9IX18pCi0jZGVmaW5lIF9fTUFDSElORV9UWVBFX0hfXworI2lmICFkZWZpbmVkKE1BQ0hJTkVfVFlQRV9IKQorI2RlZmluZSBNQUNISU5FX1RZUEVfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+IC8qIE5lZWRlZCB0byBkZWZpbmUgc2l6ZV90ICovCiAKLS8qIExpYnJhcnkgY2FsbGluZyBjb252ZW50aW9uIHNwZWMuIF9fY2RlY2wgYW5kIGZyaWVuZHMgbWlnaHQgYmUgYWRkZWQgaGVyZSBhcyByZXF1aXJlZC4gKi8KLSAgI2RlZmluZSBMSU5LU1BFQ19ICi0gICNkZWZpbmUgTElOS1NQRUNfQ1BQCi0KLQotLyoqCi0gKiAgY29sbGF0ZSBhbGwgY29ycmVzcG9uZGluZyBjb21waWxlciBzcGVjaWZpYyBtYWNyb3MgdG8gZGV0ZWN0IGEgZGVidWcgYnVpbGQsIGFuZCBzZXQgdGhlIERFQlVHIG1hY3JvIGlmIHRoYXQgaXMgdGhlIGNhc2UuCi0gKi8KLSNpZiBkZWZpbmVkKF9ERUJVRykKLSNkZWZpbmUgREVCVUcKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID09IDQpICYmIFwKKyAgICAoX19HTlVDX0dOVV9JTkxJTkVfXyA9PSAxKQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjZW5kaWYKIAorLyogTGlicmFyeSBjYWxsaW5nIGNvbnZlbnRpb24gc3BlYy4gX19jZGVjbCBhbmQgZnJpZW5kcyBtaWdodCBiZSBhZGRlZCBoZXJlIGFzCisgKiByZXF1aXJlZC4gKi8KKyNkZWZpbmUgTElOS1NQRUNfSAorI2RlZmluZSBMSU5LU1BFQ19DUFAKIAogLyogZm9yIGRveHlnZW4gdGhlIGZvbGxvd2luZyBkb2N1IHBhcnRzIG11c3QgYmUgc2VwYXJhdGVkICovCiAvKiogXHZhciAgU0NIQVIKLSAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIGF0IGxlYXN0IDEgYnl0ZSBzaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIGF0IGxlYXN0IDEgYnl0ZSBzaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkCisgKiBwbGF0Zm9ybXMuCiAgKi8KIC8qKiBcdmFyICBVQ0hBUgotICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgYXQgbGVhc3QgMSBieXRlIHVuc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyBhdCBsZWFzdCAxIGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwKKyAqIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCiAgKi8KIC8qKiBcdmFyICBJTlQKLSAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIGF0IGxlYXN0IDQgYnl0ZSBzaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIGF0IGxlYXN0IDQgYnl0ZSBzaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkCisgKiBwbGF0Zm9ybXMuCiAgKi8KIC8qKiBcdmFyICBVSU5UCi0gKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyBhdCBsZWFzdCA0IGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIGF0IGxlYXN0IDQgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbAorICogc3VwcG9ydGVkIHBsYXRmb3Jtcy4KICAqLwogLyoqIFx2YXIgIExPTkcKLSAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIDQgYnl0ZSBzaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIDQgYnl0ZSBzaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkCisgKiBwbGF0Zm9ybXMuCiAgKi8KIC8qKiBcdmFyICBVTE9ORwotICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgNCBieXRlIHVuc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyA0IGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkCisgKiBwbGF0Zm9ybXMuCiAgKi8KIC8qKiBcdmFyICBTSE9SVAotICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgMiBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgMiBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQKKyAqIHBsYXRmb3Jtcy4KICAqLwogLyoqIFx2YXIgIFVTSE9SVAotICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgMiBieXRlIHVuc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyAyIGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkCisgKiBwbGF0Zm9ybXMuCiAgKi8KIC8qKiBcdmFyICBJTlQ2NAotICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgOCBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgOCBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQKKyAqIHBsYXRmb3Jtcy4KICAqLwogLyoqIFx2YXIgIFVJTlQ2NAotICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgOCBieXRlIHVuc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyA4IGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkCisgKiBwbGF0Zm9ybXMuCiAgKi8KIC8qKiBcZGVmICBTSE9SVF9CSVRTCi0gKiAgICAgICAgTnVtYmVyIG9mIGJpdHMgdGhlIGRhdGEgdHlwZSBzaG9ydCByZXByZXNlbnRzLiBzaXplb2YoKSBpcyBub3Qgc3VpdGVkIHRvIGdldCB0aGlzIGluZm8sCi0gKiAgICAgICAgYmVjYXVzZSBhIGJ5dGUgaXMgbm90IGFsd2F5cyBkZWZpbmVkIGFzIDggYml0cy4KKyAqICAgICAgICBOdW1iZXIgb2YgYml0cyB0aGUgZGF0YSB0eXBlIHNob3J0IHJlcHJlc2VudHMuIHNpemVvZigpIGlzIG5vdCBzdWl0ZWQKKyAqIHRvIGdldCB0aGlzIGluZm8sIGJlY2F1c2UgYSBieXRlIGlzIG5vdCBhbHdheXMgZGVmaW5lZCBhcyA4IGJpdHMuCiAgKi8KIC8qKiBcZGVmICBDSEFSX0JJVFMKLSAqICAgICAgICBOdW1iZXIgb2YgYml0cyB0aGUgZGF0YSB0eXBlIGNoYXIgcmVwcmVzZW50cy4gc2l6ZW9mKCkgaXMgbm90IHN1aXRlZCB0byBnZXQgdGhpcyBpbmZvLAotICogICAgICAgIGJlY2F1c2UgYSBieXRlIGlzIG5vdCBhbHdheXMgZGVmaW5lZCBhcyA4IGJpdHMuCisgKiAgICAgICAgTnVtYmVyIG9mIGJpdHMgdGhlIGRhdGEgdHlwZSBjaGFyIHJlcHJlc2VudHMuIHNpemVvZigpIGlzIG5vdCBzdWl0ZWQKKyAqIHRvIGdldCB0aGlzIGluZm8sIGJlY2F1c2UgYSBieXRlIGlzIG5vdCBhbHdheXMgZGVmaW5lZCBhcyA4IGJpdHMuCiAgKi8KIC8qKiBcdmFyICBJTlRfUENNCiAgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyB0aGUgd2lkdGggb2YgaW5wdXQgYW5kIG91dHB1dCBQQ00gc2FtcGxlcy4KICAqLwogCi0KLSAgdHlwZWRlZiBzaWduZWQgaW50IElOVDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDsKK3R5cGVkZWYgc2lnbmVkIGludCBJTlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UOwogI2lmZGVmIF9fTFA2NF9fCi0gIC8qIGZvcmNlIEZESyBsb25nLWRhdGF0eXBlcyB0byA0IGJ5dGUgICovCi0gIC8qIGpkcjogVXNlIGRlZmluZXMgdG8gYXZvaWQgdHlwZSBhbGlhcyBwcm9ibGVtcyBvbiA2NCBiaXQgbWFjaGluZXMuICovCi0gICNkZWZpbmUgTE9ORyBJTlQKLSAgI2RlZmluZSBVTE9ORyBVSU5UCi0jZWxzZSAvKiBfX0xQNjRfXyAqLwotICB0eXBlZGVmIHNpZ25lZCBsb25nIExPTkc7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBVTE9ORzsKLSNlbmRpZgkvKiBfX0xQNjRfXyAqLwotICB0eXBlZGVmIHNpZ25lZCBzaG9ydCBTSE9SVDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVU0hPUlQ7Ci0gIHR5cGVkZWYgc2lnbmVkIGNoYXIgU0NIQVI7Ci0gIHR5cGVkZWYgdW5zaWduZWQgY2hhciBVQ0hBUjsKKy8qIGZvcmNlIEZESyBsb25nLWRhdGF0eXBlcyB0byA0IGJ5dGUgICovCisvKiBVc2UgZGVmaW5lcyB0byBhdm9pZCB0eXBlIGFsaWFzIHByb2JsZW1zIG9uIDY0IGJpdCBtYWNoaW5lcy4gKi8KKyNkZWZpbmUgTE9ORyBJTlQKKyNkZWZpbmUgVUxPTkcgVUlOVAorI2Vsc2UgIC8qIF9fTFA2NF9fICovCit0eXBlZGVmIHNpZ25lZCBsb25nIExPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxPTkc7CisjZW5kaWYgLyogX19MUDY0X18gKi8KK3R5cGVkZWYgc2lnbmVkIHNob3J0IFNIT1JUOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVU0hPUlQ7Cit0eXBlZGVmIHNpZ25lZCBjaGFyIFNDSEFSOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVDSEFSOwogCi0gICNkZWZpbmUgU0hPUlRfQklUUyAxNgotICAjZGVmaW5lIENIQVJfQklUUyA4Ci0KKyNkZWZpbmUgU0hPUlRfQklUUyAxNgorI2RlZmluZSBDSEFSX0JJVFMgOAogCiAvKiBEZWZpbmUgNjQgYml0IGJhc2UgaW50ZWdlciB0eXBlLiAqLwogI2lmZGVmIF9NU0NfVkVSCi0gIHR5cGVkZWYgX19pbnQ2NCBJTlQ2NDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFVJTlQ2NDsKK3R5cGVkZWYgX19pbnQ2NCBJTlQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVSU5UNjQ7CiAjZWxzZQotICB0eXBlZGVmIGxvbmcgbG9uZyBJTlQ2NDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUlOVDY0OwordHlwZWRlZiBsb25nIGxvbmcgSU5UNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVSU5UNjQ7CiAjZW5kaWYKIAogI2lmbmRlZiBOVUxMCi0gICNpZmRlZiBfX2NwbHVzcGx1cwotICAgICNkZWZpbmUgTlVMTCAgICAwCi0gICNlbHNlCi0gICAgI2RlZmluZSBOVUxMICAgICgodm9pZCAqKTApCi0gICNlbmRpZgotI2VuZGlmCi0KLS8qIEFzc2VydCBpcyBmdW5jdGlvbmFsIG9uIHg4NiBQQydzIGFuZCBhbHNvIHdoZW4gZGVidWdnaW5nIGlzIHR1cm5lZCBvbi4gKi8KLSNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKF9faTY4Nl9fKSB8fCBkZWZpbmVkKF9faTU4Nl9fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChGREtfREVCVUcpIHx8IGRlZmluZWQoRkRLX0FTU0VSVF9FTkFCTEUpCi0gICNpbmNsdWRlIDxhc3NlcnQuaD4KLSAgI2RlZmluZSBGREtfQVNTRVJUKHgpIGFzc2VydCh4KQorI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIE5VTEwgMAogI2Vsc2UKLSAgI2RlZmluZSBGREtfQVNTRVJUKGlnbm9yZSkKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQorI2VuZGlmCiAjZW5kaWYKIAotICB0eXBlZGVmIFNIT1JUICAgICAgICBJTlRfUENNOwotICAjZGVmaW5lIFdBVl9CSVRTICAgICAxNgotICAjZGVmaW5lIFNBTVBMRV9CSVRTICAxNgotICAjZGVmaW5lIFNBTVBMRV9NQVggKCgoTE9ORykxPDwoU0FNUExFX0JJVFMtMSkpLTEpCi0gICNkZWZpbmUgU0FNUExFX01JTiAoflNBTVBMRV9NQVgpCisjaWYgKChkZWZpbmVkKF9faTY4Nl9fKSB8fCBkZWZpbmVkKF9faTU4Nl9fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCAgXAorICAgICAgZGVmaW5lZChfX3g4Nl82NF9fKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKGRlZmluZWQoX01TQ19WRVIpICYmIChkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX01fWDY0KSkpKSAmJiBcCisgICAgIWRlZmluZWQoRkRLX0FTU0VSVF9FTkFCTEUpCisjZGVmaW5lIEZES19BU1NFUlRfRU5BQkxFCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkRLX0FTU0VSVF9FTkFCTEUpCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZGVmaW5lIEZES19BU1NFUlQoeCkgYXNzZXJ0KHgpCisjZWxzZQorI2RlZmluZSBGREtfQVNTRVJUKGlnbm9yZSkKKyNlbmRpZgorCit0eXBlZGVmIFNIT1JUIElOVF9QQ007CisjZGVmaW5lIE1BWFZBTF9QQ00gTUFYVkFMX1NHTAorI2RlZmluZSBNSU5WQUxfUENNIE1JTlZBTF9TR0wKKyNkZWZpbmUgV0FWX0JJVFMgMTYKKyNkZWZpbmUgU0FNUExFX0JJVFMgMTYKKyNkZWZpbmUgU0FNUExFX01BWCAoKElOVF9QQ00pKCgoVUxPTkcpMSA8PCAoU0FNUExFX0JJVFMgLSAxKSkgLSAxKSkKKyNkZWZpbmUgU0FNUExFX01JTiAoflNBTVBMRV9NQVgpCiAKIC8qIQogKiBcZGVmICAgIFJBTV9BTElHTgpAQCAtMjExLDQ2ICsyMzksNTYgQEAKICAgIGludCBteUFycmF5WzE2XTsKICAgIFxlbmRjb2RlCiAKLSAgIE5vdGUsIHRoYXQgbm90IGFsbCBwbGF0Zm9ybXMgc3VwcG9ydCB0aGlzIG1lY2hhbmlzbS4gRm9yIGV4YW1wbGUgd2l0aCBUSSBjb21waWxlcnMKLSAgIGEgcHJlcHJvY2Vzc29yIHByYWdtYSBpcyB1c2VkLCBidXQgdG8gZG8gc29tZXRoaW5nIGxpa2UKKyAgIE5vdGUsIHRoYXQgbm90IGFsbCBwbGF0Zm9ybXMgc3VwcG9ydCB0aGlzIG1lY2hhbmlzbS4gRm9yIGV4YW1wbGUgd2l0aCBUSQorY29tcGlsZXJzIGEgcHJlcHJvY2Vzc29yIHByYWdtYSBpcyB1c2VkLCBidXQgdG8gZG8gc29tZXRoaW5nIGxpa2UKIAogICAgXGNvZGUKICAgICNkZWZpbmUgUkFNX0FMSUdOICNwcmFnbWEgREFUQV9BTElHTih4KQotICAgXGVuY29kZQorICAgXGVuZGNvZGUKIAotICAgd291bGQgcmVxdWlyZSB0aGUgcHJlcHJvY2Vzc29yIHRvIHByb2Nlc3MgdGhpcyBsaW5lIHR3aWNlIHRvIGZ1bGx5IHJlc29sdmUgaXQuIEhlbmNlLAotICAgYSBmdWxseSBwbGF0Zm9ybS1pbmRlcGVuZGFudCB3YXkgdG8gdXNlIGFsaWdubWVudCBpcyBub3Qgc3VwcG9ydGVkLgorICAgd291bGQgcmVxdWlyZSB0aGUgcHJlcHJvY2Vzc29yIHRvIHByb2Nlc3MgdGhpcyBsaW5lIHR3aWNlIHRvIGZ1bGx5IHJlc29sdmUKK2l0LiBIZW5jZSwgYSBmdWxseSBwbGF0Zm9ybS1pbmRlcGVuZGFudCB3YXkgdG8gdXNlIGFsaWdubWVudCBpcyBub3Qgc3VwcG9ydGVkLgogCiAqIFxkZWYgICAgQUxJR05NRU5UX0RFRkFVTFQKICogICAgICAgICBEZWZhdWx0IGFsaWdubWVudCBpbiBieXRlcy4KICovCi0jaWYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotICAjZGVmaW5lIEFMSUdOTUVOVF9ERUZBVUxUIDgKLSAgI2RlZmluZSBSQU1fQUxJR04gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChBTElHTk1FTlRfREVGQVVMVCkpKQorCisjZGVmaW5lIEFMSUdOTUVOVF9ERUZBVUxUIDgKKworLyogUkFNX0FMSUdOIGtleXdvcmQgY2F1c2VzIG1lbW9yeSBhbGlnbm1lbnQgb2YgZ2xvYmFsIHZhcmlhYmxlcy4gKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBSQU1fQUxJR04gX19kZWNsc3BlYyhhbGlnbihBTElHTk1FTlRfREVGQVVMVCkpCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBSQU1fQUxJR04gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChBTElHTk1FTlRfREVGQVVMVCkpKQogI2Vsc2UKLSAgI2RlZmluZSBBTElHTk1FTlRfREVGQVVMVCA4Ci0gICNkZWZpbmUgUkFNX0FMSUdOCisjZGVmaW5lIFJBTV9BTElHTgogI2VuZGlmCiAKLQogLyohCi0qIFxkZWYgIFJFU1RSSUNUCi0qICAgICAgIFRoZSByZXN0cmljdCBrZXl3b3JkIGlzIHN1cHBvcnRlZCBieSBzb21lIHBsYXRmb3JtcyBhbmQgUkVTVFJJQ1QgbWFwcyB0bwotKiAgICAgICBlaXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcga2V5d29yZCBvbiBlYWNoIHBsYXRmb3JtIG9yIHRvIHZvaWQgaWYgdGhlCi0qICAgICAgIGNvbXBpbGVyIGRvZXMgbm90IHByb3ZpZGUgc3VjaCBmZWF0dXJlLgotKgotKiBcZGVmICBXT1JEX0FMSUdORUQoeCkKLSogICAgICAgVGVsbHMgdGhlIGNvbXBpbGVyIHRoYXQgcG9pbnRlciB4IGlzIFdPUkQgYWxpZ25lZC4KLSogICAgICAgQXQgdGhlIG1vbWVudCBvbmx5IHN1cHBvcnRlZCBieSBUSSBjb21waWxlcnMuCi0qCi0qIFxkZWYgIERXT1JEX0FMSUdORUQoeCkKLSogICAgICAgVGVsbHMgdGhlIGNvbXBpbGVyIHRoYXQgcG9pbnRlciB4IGlzIERXT1JEIGFsaWduZWQuCi0qICAgICAgIEF0IHRoZSBtb21lbnQgb25seSBzdXBwb3J0ZWQgYnkgVEkgY29tcGlsZXJzLgotKi8KLSAgI2RlZmluZSBSRVNUUklDVAotICAjZGVmaW5lIFdPUkRfQUxJR05FRCh4KQotICAjZGVmaW5lIERXT1JEX0FMSUdORUQoeCkKLQorICogXGRlZiAgUkVTVFJJQ1QKKyAqICAgICAgIFRoZSByZXN0cmljdCBrZXl3b3JkIGlzIHN1cHBvcnRlZCBieSBzb21lIHBsYXRmb3JtcyBhbmQgUkVTVFJJQ1QgbWFwcworICogdG8gZWl0aGVyIHRoZSBjb3JyZXNwb25kaW5nIGtleXdvcmQgb24gZWFjaCBwbGF0Zm9ybSBvciB0byB2b2lkIGlmIHRoZQorICogICAgICAgY29tcGlsZXIgZG9lcyBub3QgcHJvdmlkZSBzdWNoIGZlYXR1cmUuIEl0IHRlbGxzIHRoZSBjb21waWxlciB0aGF0IGEKKyAqIHBvaW50ZXIgcG9pbnRzIHRvIG1lbW9yeSB0aGF0IGRvZXMgbm90IG92ZXJsYXAgd2l0aCBvdGhlciBtZW1vcmllcyBwb2ludGVkIHRvCisgKiBieSBvdGhlciBwb2ludGVycy4gSWYgdGhpcyBrZXl3b3JkIGlzIHVzZWQgYW5kIHRoZSBhc3N1bXB0aW9uIG9mIG5vCisgKiBvdmVybGFwIGlzIG5vdCB0cnVlIHRoZSByZXN1bHRpbmcgY29kZSBtaWdodCBjcmFzaC4KKyAqCisgKiBcZGVmICBXT1JEX0FMSUdORUQoeCkKKyAqICAgICAgIFRlbGxzIHRoZSBjb21waWxlciB0aGF0IHBvaW50ZXIgeCBpcyAxNiBiaXQgYWxpZ25lZC4gSXQgZG9lcyBub3QgY2F1c2UKKyAqIHRoZSBhZGRyZXNzIGl0c2VsZiB0byBiZSBhbGlnbmVkLCBidXQgc2VydmVzIGFzIGEgaGludCB0byB0aGUgb3B0aW1pemVyLiBUaGUKKyAqIGFsaWdubWVudCBvZiB0aGUgcG9pbnRlciBtdXN0IGJlIGd1YXJyYW50ZWVkLCBpZiBub3QgdGhlIGNvZGUgbWlnaHQKKyAqIGNyYXNoLgorICoKKyAqIFxkZWYgIERXT1JEX0FMSUdORUQoeCkKKyAqICAgICAgIFRlbGxzIHRoZSBjb21waWxlciB0aGF0IHBvaW50ZXIgeCBpcyAzMiBiaXQgYWxpZ25lZC4gSXQgZG9lcyBub3QgY2F1c2UKKyAqIHRoZSBhZGRyZXNzIGl0c2VsZiB0byBiZSBhbGlnbmVkLCBidXQgc2VydmVzIGFzIGEgaGludCB0byB0aGUgb3B0aW1pemVyLiBUaGUKKyAqIGFsaWdubWVudCBvZiB0aGUgcG9pbnRlciBtdXN0IGJlIGd1YXJyYW50ZWVkLCBpZiBub3QgdGhlIGNvZGUgbWlnaHQKKyAqIGNyYXNoLgorICoKKyAqLworI2RlZmluZSBSRVNUUklDVAorI2RlZmluZSBXT1JEX0FMSUdORUQoeCkgQ19BTExPQ19BTElHTkVEX0NIRUNLMigoY29uc3Qgdm9pZCAqKSh4KSwgMik7CisjZGVmaW5lIERXT1JEX0FMSUdORUQoeCkgQ19BTExPQ19BTElHTkVEX0NIRUNLMigoY29uc3Qgdm9pZCAqKSh4KSwgNCk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEFMSUdOX1NJWkUKQEAgLTI2Myw0NiArMzAxLDQzIEBACiAgKiAtIEFMSUdOX1NJWkUoOCkgcmV0dXJucyA4CiAgKiAtIEFMSUdOX1NJWkUoOSkgcmV0dXJucyAxNgogICovCi0jZGVmaW5lIEFMSUdOX1NJWkUoYSkgKChhKSsgKCgoSU5UKUFMSUdOTUVOVF9ERUZBVUxUIC0gKChJTlQpKGEpICYgKEFMSUdOTUVOVF9ERUZBVUxULTEpKSApICYgKEFMSUdOTUVOVF9ERUZBVUxULTEpKSkKKyNkZWZpbmUgQUxJR05fU0laRShhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoYSkgKyAoKChJTlQpQUxJR05NRU5UX0RFRkFVTFQgLSAoKHNpemVfdCkoYSkgJiAoQUxJR05NRU5UX0RFRkFVTFQgLSAxKSkpICYgXAorICAgICAgICAgIChBTElHTk1FTlRfREVGQVVMVCAtIDEpKSkKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQUxJR05fUFRSCi0gKiBjYXN0IChhKSB0byB3aWR0aCBvZiBwb2ludGVyCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIQogICogXGJyaWVmICBUaGlzIG1hY3JvIGFsaWducyBhIGdpdmVuIGFkZHJlc3MgZGVwZW5kaW5nIG9uIDo6QUxJR05NRU5UX0RFRkFVTFQuCiAgKi8KLSNkZWZpbmUgQUxJR05fUFRSKGEpICggKHVuc2lnbmVkIGNoYXIqKShhKSArICgoKElOVClBTElHTk1FTlRfREVGQVVMVCAtICgoSU5UKShVSU5UNjQpKGEpICYgKEFMSUdOTUVOVF9ERUZBVUxULTEpKSApICYgKEFMSUdOTUVOVF9ERUZBVUxULTEpKSApCisjZGVmaW5lIEFMSUdOX1BUUihhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHZvaWQgKikoKHVuc2lnbmVkIGNoYXIgKikoYSkgKyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgoKChJTlQpQUxJR05NRU5UX0RFRkFVTFQgLSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAoKHNpemVfdCkoYSkgJiAoQUxJR05NRU5UX0RFRkFVTFQgLSAxKSkpICYgXAorICAgICAgICAgICAgICAoQUxJR05NRU5UX0RFRkFVTFQgLSAxKSkpKSkKIAotIC8qIEFsaWdubWVudCBtYWNybyBmb3IgbGliU1lTIGhlYXAgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgQUxJR05NRU5UX0VYVFJFUyAgICAoIEFMSUdOTUVOVF9ERUZBVUxUICkKLSNkZWZpbmUgQUxHTl9TSVpFX0VYVFJFUyhhKSAoKGEpKyAoKChJTlQpQUxJR05NRU5UX0VYVFJFUyAtICgoSU5UKShhKSAmIChBTElHTk1FTlRfRVhUUkVTLTEpKSApICYgKEFMSUdOTUVOVF9FWFRSRVMtMSkpKQotCisvKiBBbGlnbm1lbnQgbWFjcm8gZm9yIGxpYlNZUyBoZWFwIGltcGxlbWVudGF0aW9uICovCisjZGVmaW5lIEFMSUdOTUVOVF9FWFRSRVMgKEFMSUdOTUVOVF9ERUZBVUxUKQorI2RlZmluZSBBTEdOX1NJWkVfRVhUUkVTKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoYSkgKyAoKChJTlQpQUxJR05NRU5UX0VYVFJFUyAtICgoSU5UKShhKSAmIChBTElHTk1FTlRfRVhUUkVTIC0gMSkpKSAmIFwKKyAgICAgICAgICAoQUxJR05NRU5UX0VYVFJFUyAtIDEpKSkKIAogLyohCi0gKiBcZGVmICBGT1JDRUlOTElORQotICogICAgICAgU29tZXRpbWVzIGNvbXBpbGVyIGRvIG5vdCBkbyB3aGF0IHRoZXkgYXJlIHRvbGQgdG8gZG8sIGFuZCBpbiBjYXNlIG9mIGlubGluaW5nIHNvbWUKLSAqICAgICAgIGFkZGl0aW9uYWwgY29tbWFuZCBtaWdodCBiZSBuZWNlc3NhcnkgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KKyAqIFxkZWYgIEZES19GT1JDRUlOTElORQorICogICAgICAgU29tZXRpbWVzIGNvbXBpbGVyIGRvIG5vdCBkbyB3aGF0IHRoZXkgYXJlIHRvbGQgdG8gZG8sIGFuZCBpbiBjYXNlIG9mCisgKiBpbmxpbmluZyBzb21lIGFkZGl0aW9uYWwgY29tbWFuZCBtaWdodCBiZSBuZWNlc3NhcnkgZGVwZW5kaW5nIG9uIHRoZQorICogcGxhdGZvcm0uCiAgKgogICogXGRlZiAgRkRLX0lOTElORQogICogICAgICAgRGVmaW5lcyBob3cgdGhlIGNvbXBpbGVyIGlzIHRvbGQgdG8gaW5saW5lIHN0dWZmLgogICovCi0jaWZkZWYgREVCVUcKLSN1bmRlZiBGT1JDRUlOTElORQotI2RlZmluZSBGT1JDRUlOTElORQorI2lmbmRlZiBGREtfRk9SQ0VJTkxJTkUKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NERV9NSVBTX18pCisjZGVmaW5lIEZES19GT1JDRUlOTElORSBpbmxpbmUgX19hdHRyaWJ1dGUoKGFsd2F5c19pbmxpbmUpKQogI2Vsc2UKLSNpZm5kZWYgRk9SQ0VJTkxJTkUKLSAgI2lmIGRlZmluZWQoX19HTlVDX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KLSAgICAjZGVmaW5lIEZPUkNFSU5MSU5FIF9fYXR0cmlidXRlKChhbHdheXNfaW5saW5lKSkKLSAgI2Vsc2UKLSAgICAjZGVmaW5lIEZPUkNFSU5MSU5FCi0gICNlbmRpZgorI2RlZmluZSBGREtfRk9SQ0VJTkxJTkUgaW5saW5lCiAjZW5kaWYKICNlbmRpZgogCi0gIC8qIGZvciBhbGwgb3RoZXIgcGxhdGZvcm1zICovCi0gICNkZWZpbmUgRkRLX0lOTElORSBpbmxpbmUKLQorI2RlZmluZSBGREtfSU5MSU5FIHN0YXRpYyBpbmxpbmUKIAogLyohCiAgKiBcZGVmICBMTktfU0VDVElPTl9EQVRBX0wxCkBAIC0zMjksMjkgKzM2NCwyOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBDb2RlIFNlY3Rpb24gbWFjcm9zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICNkZWZpbmUgTE5LX1NFQ1RJT05fQ09ERV9MMQotICAjZGVmaW5lIExOS19TRUNUSU9OX0NPREVfTDIKLSAgI2RlZmluZSBMTktfU0VDVElPTl9JTklUQ09ERQorI2RlZmluZSBMTktfU0VDVElPTl9DT0RFX0wxCisjZGVmaW5lIExOS19TRUNUSU9OX0NPREVfTDIKKyNkZWZpbmUgTE5LX1NFQ1RJT05fSU5JVENPREUKIAogLyogTWVtb3J5IHNlY3Rpb24gbWFjcm9zLiAqLwogCi0gIC8qIGRlZmF1bHQgZmFsbCBiYWNrICovCi0gICNkZWZpbmUgTE5LX1NFQ1RJT05fREFUQV9MMQotICAjZGVmaW5lIExOS19TRUNUSU9OX0RBVEFfTDIKLSAgI2RlZmluZSBMTktfU0VDVElPTl9DT05TVERBVEEKLSAgI2RlZmluZSBMTktfU0VDVElPTl9DT05TVERBVEFfTDEKKy8qIGRlZmF1bHQgZmFsbCBiYWNrICovCisjZGVmaW5lIExOS19TRUNUSU9OX0RBVEFfTDEKKyNkZWZpbmUgTE5LX1NFQ1RJT05fREFUQV9MMgorI2RlZmluZSBMTktfU0VDVElPTl9DT05TVERBVEEKKyNkZWZpbmUgTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCiAKLSAgI2RlZmluZSBMTktfU0VDVElPTl9MMV9EQVRBX0EKLSAgI2RlZmluZSBMTktfU0VDVElPTl9MMV9EQVRBX0IKLQorI2RlZmluZSBMTktfU0VDVElPTl9MMV9EQVRBX0EKKyNkZWZpbmUgTE5LX1NFQ1RJT05fTDFfREFUQV9CCiAKICNpZmRlZiBfTVNDX1ZFUgotICAvKgotICAgKiBTb21ldGltZXMgY2VydGFpbiBmZWF0dXJlcyBhcmUgZXhjbHVkZWQgZnJvbSBjb21waWxhdGlvbiBhbmQgdGhlcmVmb3JlIHRoZSB3YXJuaW5nIDQwNjUgbWF5IG9jY3VyOgotICAgKiAic3dpdGNoIHN0YXRlbWVudCBjb250YWlucyAnZGVmYXVsdCcgYnV0IG5vICdjYXNlJyBsYWJlbHMiCi0gICAqIFdlIGNvbnNpZGVyIHRoaXMgd2FybmluZyBpcnJlbGV2YW50IGFuZCBkaXNhYmxlIGl0LgotICAgKi8KLSAgI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDA2NSApCisvKgorICogU29tZXRpbWVzIGNlcnRhaW4gZmVhdHVyZXMgYXJlIGV4Y2x1ZGVkIGZyb20gY29tcGlsYXRpb24gYW5kIHRoZXJlZm9yZSB0aGUKKyAqIHdhcm5pbmcgNDA2NSBtYXkgb2NjdXI6ICJzd2l0Y2ggc3RhdGVtZW50IGNvbnRhaW5zICdkZWZhdWx0JyBidXQgbm8gJ2Nhc2UnCisgKiBsYWJlbHMiIFdlIGNvbnNpZGVyIHRoaXMgd2FybmluZyBpcnJlbGV2YW50IGFuZCBkaXNhYmxlIGl0LgorICovCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQwNjUpCiAjZW5kaWYKIAotI2VuZGlmIC8qIF9fTUFDSElORV9UWVBFX0hfXyAqLworI2VuZGlmIC8qIE1BQ0hJTkVfVFlQRV9IICovCmRpZmYgLS1naXQgYS9saWJTWVMvaW5jbHVkZS9zeXNsaWJfY2hhbm5lbE1hcERlc2NyLmggYi9saWJTWVMvaW5jbHVkZS9zeXNsaWJfY2hhbm5lbE1hcERlc2NyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1NzM3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNZUy9pbmNsdWRlL3N5c2xpYl9jaGFubmVsTWFwRGVzY3IuaApAQCAtMCwwICsxLDE5NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBTeXN0ZW0gaW50ZWdyYXRpb24gbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgVGhvbWFzIERpZXR6ZW4KKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBcZmlsZSAgIHN5c2xpYl9jaGFubmVsTWFwRGVzY3IuaAorICogIFxicmllZiAgRnVuY3Rpb24gYW5kIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjaGFubmVsIG1hcCBkZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uLgorICovCisKKyNpZm5kZWYgU1lTTElCX0NIQU5ORUxNQVBERVNDUl9ICisjZGVmaW5lIFNZU0xJQl9DSEFOTkVMTUFQREVTQ1JfSAorCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisKKy8qKgorICogXGJyaWVmICBDb250YWlucyBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGEgc2luZ2xlIGNoYW5uZWwgbWFwLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IFVDSEFSKgorICAgICAgcENoYW5uZWxNYXA7IC8qITwgQWN0dWFsIGNoYW5uZWwgbWFwcGluZyBmb3Igb25lIHNpbmdsZSBjb25maWd1cmF0aW9uLiAqLworICBVQ0hBUiBudW1DaGFubmVsczsgLyohPCBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGUgY2hhbm5lbCBtYXAgd2hpY2ggaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXhpbXVtIHVzZWQgY2hhbm5lbCBpbmRleCsxLiAqLworfSBDSEFOTkVMX01BUF9JTkZPOworCisvKioKKyAqIFxicmllZiAgIFRoaXMgaXMgdGhlIG1haW4gZGF0YSBzdHJ1Y3QuIEl0IGNvbnRhaW5zIHRoZSBtYXBwaW5nIGZvciBhbGwKKyAqIGNoYW5uZWwgY29uZmlndXJhdGlvbnMgc3VjaCBhcyBhZG1pbmlzdHJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBDQVVUSU9OOiBEbyBub3QgYWNjZXNzIHRoaXMgc3RydWN0dXJlIGRpcmVjdGx5IGZyb20gYSBhbGdvcml0aG0gc3BlY2lmaWMKKyAqIGxpYnJhcnkuIEFsd2F5cyB1c2Ugb25lIG9mIHRoZSBBUEkgYWNjZXNzIGZ1bmN0aW9ucyBiZWxvdyEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBDSEFOTkVMX01BUF9JTkZPKiBwTWFwSW5mb1RhYjsgLyohPCBUYWJsZSBvZiBjaGFubmVsIG1hcHMuICovCisgIFVJTlQgbWFwSW5mb1RhYkxlbjsgLyohPCBMZW5ndGggb2YgdGhlIGNoYW5uZWwgbWFwIHRhYmxlIGFycmF5LiAqLworICBVSU5UIGZQYXNzVGhyb3VnaDsgIC8qITwgRmxhZyB0aGF0IGRlZmluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG1hcHBpbmcgc2hhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhcHBsaWVkICAodmFsdWU6IDApIG9yIHRoZSBpbnB1dCBqdXN0IGdldHMgcGFzc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCAoTVBFRyBtYXBwaW5nKS4gKi8KK30gRkRLX2NoYW5uZWxNYXBEZXNjcjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFxicmllZiAgSW5pdGlhbGl6ZSBhIGdpdmVuIGNoYW5uZWwgbWFwIGRlc2NyaXB0b3IuCisgKgorICogXHBhcmFtICBwTWFwRGVzY3IgICAgICBQb2ludGVyIHRvIGEgY2hhbm5lbCBtYXAgZGVzY3JpcHRvciB0byBiZSBpbml0aWFsaXplZC4KKyAqIFxwYXJhbSAgcE1hcEluZm9UYWIgICAgVGFibGUgb2YgY2hhbm5lbCBtYXBzIHRvIGluaXRpemFsaXplIHRoZSBkZXNjcmlwdG9yCisgd2l0aC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgSWYgYSBOVUxMIHBvaW50ZXIgaXMgZ2l2ZW4gYSBkZWZhdWx0IHRhYmxlIGZvcgorIFdBVi1saWtlIG1hcHBpbmcgd2lsbCBiZSB1c2VkLgorICogXHBhcmFtICBtYXBJbmZvVGFiTGVuICBMZW5ndGggb2YgdGhlIGNoYW5uZWwgbWFwIHRhYmxlIGFycmF5IChwTWFwSW5mb1RhYikuCisgSWYgYSB6ZXJvIGxlbmd0aCBpcyBnaXZlbiBhIGRlZmF1bHQgdGFibGUgZm9yIFdBVi1saWtlIG1hcHBpbmcgd2lsbCBiZSB1c2VkLgorICogXHBhcmFtICBmUGFzc1Rocm91Z2ggICBJZiB0aGUgZmxhZyBpcyBzZXQgdGhlIHJlb3JkZXJpbmcgKGdpdmVuIGJ5CisgcE1hcEluZm9UYWIpIHdpbGwgYmUgYnlwYXNzZWQuCisgKi8KK3ZvaWQgRkRLX2NoTWFwRGVzY3JfaW5pdChGREtfY2hhbm5lbE1hcERlc2NyKiBjb25zdCBwTWFwRGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9NQVBfSU5GTyogY29uc3QgcE1hcEluZm9UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBtYXBJbmZvVGFiTGVuLCBjb25zdCBVSU5UIGZQYXNzVGhyb3VnaCk7CisKKy8qKgorICogXGJyaWVmICBDaGFuZ2UgdGhlIGNoYW5uZWwgcmVvcmRlcmluZyBzdGF0ZSBvZiBhIGdpdmVuIGNoYW5uZWwgbWFwCisgKiBkZXNjcmlwdG9yLgorICoKKyAqIFxwYXJhbSAgcE1hcERlc2NyICAgICBQb2ludGVyIHRvIGEgKGluaXRpYWxpemVkKSBjaGFubmVsIG1hcCBkZXNjcmlwdG9yLgorICogXHBhcmFtICBmUGFzc1Rocm91Z2ggIElmIHRoZSBmbGFnIGlzIHNldCB0aGUgcmVvcmRlcmluZyAoZ2l2ZW4gYnkKKyAqIHBNYXBJbmZvVGFiKSB3aWxsIGJlIGJ5cGFzc2VkLgorICogXHJldHVybiAgICAgICAgICAgICAgIFZhbHVlIHVuZXF1YWwgdG8gemVybyBpZiBzZXQgb3BlcmF0aW9uIHdhcyBub3QKKyAqIHN1Y2Nlc3NmdWwuIEFuZCB6ZXJvIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBGREtfY2hNYXBEZXNjcl9zZXRQYXNzVGhyb3VnaChGREtfY2hhbm5lbE1hcERlc2NyKiBjb25zdCBwTWFwRGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBmUGFzc1Rocm91Z2gpOworCisvKioKKyAqIFxicmllZiAgR2V0IHRoZSBtYXBwaW5nIHZhbHVlIGZvciBhIHNwZWNpZmljIGNoYW5uZWwgYW5kIG1hcCBpbmRleC4KKyAqCisgKiBccGFyYW0gIHBNYXBEZXNjciAgUG9pbnRlciB0byBjaGFubmVsIG1hcCBkZXNjcmlwdG9yLgorICogXHBhcmFtICBjaElkeCAgICAgIENoYW5uZWwgaW5kZXguCisgKiBccGFyYW0gIG1hcElkeCAgICAgTWFwcGluZyBpbmRleCAoY29ycmVzcG9uZGluZyB0byB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgKiBpbmRleCkuCisgKiBccmV0dXJuICAgICAgICAgICAgTWFwcGluZyB2YWx1ZS4KKyAqLworVUNIQVIgRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUoY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciogY29uc3QgcE1hcERlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY2hJZHgsIGNvbnN0IFVJTlQgbWFwSWR4KTsKKworLyoqCisgKiBcYnJpZWYgIEV2YWx1YXRlIHdoZXRoZXIgY2hhbm5lbCBtYXAgZGVzY3JpcHRvciBpcyByZWFzb25hYmxlIG9yIG5vdC4KKyAqCisgKiBccGFyYW0gIHBNYXBEZXNjciBQb2ludGVyIHRvIGNoYW5uZWwgbWFwIGRlc2NyaXB0b3IuCisgKiBccmV0dXJuICAgICAgICAgICBWYWx1ZSB1bmVxdWFsIHRvIHplcm8gaWYgZGVzY3JpcHRvciBpcyB2YWxpZCwgb3RoZXJ3aXNlCisgKiB6ZXJvLgorICovCitpbnQgRkRLX2NoTWFwRGVzY3JfaXNWYWxpZChjb25zdCBGREtfY2hhbm5lbE1hcERlc2NyKiBjb25zdCBwTWFwRGVzY3IpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIWRlZmluZWQoU1lTTElCX0NIQU5ORUxNQVBERVNDUl9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliU1lTL2luY2x1ZGUvd2F2X2ZpbGUuaCBiL2xpYlNZUy9pbmNsdWRlL3dhdl9maWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzQzYjIuLjAwMDAwMDAKLS0tIGEvbGliU1lTL2luY2x1ZGUvd2F2X2ZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKTogICBFcmljIEFsbGFtYW5jaGUKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiogXGZpbGUgICB3YXZfZmlsZS5oCi0gKiAgXGJyaWVmICBSdWRpbWVudGFyeSBXQVZFIGZpbGUgcmVhZC93cml0ZSBzdXBwb3J0LgotICoKLSAqICBUaGUgV0FWRSBmaWxlIHJlYWRlci93cml0ZXIgaXMgaW50ZW50ZWQgdG8gYmUgdXNlZCBpbiB0aGUgY29kZWMncyBleGFtcGxlCi0gKiAgZnJhbWV3b3JrIGZvciBlYXNpbHkgZ2V0dGluZyBzdGFydGVkIHdpdGggZW5jb2RpbmcvZGVjb2RpbmcuIFRoZXJlZm9yZQotICogIGl0IHNlcnZlcyBtYWlubHkgZm9yIGhlbHBpbmcgcXVpY2tseSB1bmRlcnN0YW5kIGhvdyBhIGNvZGVjJ3MgQVBJIGFjdHVhbGx5Ci0gKiAgd29ya3MuCi0gKiAgQmVpbmcgYSBXQVZFIGZpbGUgcmVhZGVyL3dyaXRlciB3aXRoIHZlcnkgYmFzaWMgZnVuY3Rpb25hbGl0eSwgaXQgbWF5IG5vdCBiZQotICogIGFibGUgdG8gcmVhZCBXQVZFIGZpbGVzIHRoYXQgY29tZSB3aXRoIHVudXN1YWwgY29uZmlndXJhdGlvbnMuCi0gKiAgRGV0YWlscyBvbiBob3cgdG8gdXNlIHRoZSBpbnRlcmZhY2UgZnVuY3Rpb25zIGNhbiBiZSBmb3VuZCBpbiBldmVyeQotICogIChlbmNvZGVyL2RlY29kZXIpIGV4YW1wbGUgZnJhbWV3b3JrLgotICovCi0KLSNpZm5kZWYgX19XQVZfRklMRV9IX18KLSNkZWZpbmUgX19XQVZfRklMRV9IX18KLQotCi0KLSNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgU1BFQUtFUl9GUk9OVF9MRUZUICAgICAgICAgICAgIDB4MQotI2RlZmluZSBTUEVBS0VSX0ZST05UX1JJR0hUICAgICAgICAgICAgMHgyCi0jZGVmaW5lIFNQRUFLRVJfRlJPTlRfQ0VOVEVSICAgICAgICAgICAweDQKLSNkZWZpbmUgU1BFQUtFUl9MT1dfRlJFUVVFTkNZICAgICAgICAgIDB4OAotI2RlZmluZSBTUEVBS0VSX0JBQ0tfTEVGVCAgICAgICAgICAgICAgMHgxMAotI2RlZmluZSBTUEVBS0VSX0JBQ0tfUklHSFQgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBTUEVBS0VSX0ZST05UX0xFRlRfT0ZfQ0VOVEVSICAgMHg0MAotI2RlZmluZSBTUEVBS0VSX0ZST05UX1JJR0hUX09GX0NFTlRFUiAgMHg4MAotI2RlZmluZSBTUEVBS0VSX0JBQ0tfQ0VOVEVSICAgICAgICAgICAgMHgxMDAKLSNkZWZpbmUgU1BFQUtFUl9TSURFX0xFRlQgICAgICAgICAgICAgIDB4MjAwCi0jZGVmaW5lIFNQRUFLRVJfU0lERV9SSUdIVCAgICAgICAgICAgICAweDQwMAotI2RlZmluZSBTUEVBS0VSX1RPUF9DRU5URVIgICAgICAgICAgICAgMHg4MDAKLSNkZWZpbmUgU1BFQUtFUl9UT1BfRlJPTlRfTEVGVCAgICAgICAgIDB4MTAwMAotI2RlZmluZSBTUEVBS0VSX1RPUF9GUk9OVF9DRU5URVIgICAgICAgMHgyMDAwCi0jZGVmaW5lIFNQRUFLRVJfVE9QX0ZST05UX1JJR0hUICAgICAgICAweDQwMDAKLSNkZWZpbmUgU1BFQUtFUl9UT1BfQkFDS19MRUZUICAgICAgICAgIDB4ODAwMAotI2RlZmluZSBTUEVBS0VSX1RPUF9CQUNLX0NFTlRFUiAgICAgICAgMHgxMDAwMAotI2RlZmluZSBTUEVBS0VSX1RPUF9CQUNLX1JJR0hUICAgICAgICAgMHgyMDAwMAotI2RlZmluZSBTUEVBS0VSX1JFU0VSVkVEICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotCi0vKiEKLSAqIFJJRkYgV0FWRSBmaWxlIHN0cnVjdC4KLSAqIEZvciBkZXRhaWxzIHNlZSBXQVZFIGZpbGUgZm9ybWF0IGRvY3VtZW50YXRpb24gKGZvciBleGFtcGxlIGF0IGh0dHA6Ly93d3cud290c2l0Lm9yZykuCi0gKi8KLXR5cGVkZWYgc3RydWN0IFdBVl9IRUFERVIKLXsKLSAgY2hhciAgIHJpZmZUeXBlWzRdOwotICBVSU5UICAgcmlmZlNpemU7Ci0gIGNoYXIgICB3YXZlVHlwZVs0XTsKLSAgY2hhciAgIGZvcm1hdFR5cGVbNF07Ci0gIFVJTlQgICBmb3JtYXRTaXplOwotICBVU0hPUlQgY29tcHJlc3Npb25Db2RlOwotICBVU0hPUlQgbnVtQ2hhbm5lbHM7Ci0gIFVJTlQgICBzYW1wbGVSYXRlOwotICBVSU5UICAgYnl0ZXNQZXJTZWNvbmQ7Ci0gIFVTSE9SVCBibG9ja0FsaWduOwotICBVU0hPUlQgYml0c1BlclNhbXBsZTsKLSAgY2hhciAgIGRhdGFUeXBlWzRdOwotICBVSU5UICAgZGF0YVNpemU7Ci19IFdBVl9IRUFERVI7Ci0KLXN0cnVjdCBXQVYKLXsKLSAgV0FWX0hFQURFUiBoZWFkZXI7Ci0gIEZES0ZJTEUgKmZwOwotICBVSU5UIGNoYW5uZWxNYXNrOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgV0FWICpIQU5ETEVfV0FWOwotCi0vKioKLSAqIFxicmllZiAgT3BlbiBhIFdBViBmaWxlIGhhbmRsZSBmb3IgcmVhZGluZy4KLSAqCi0gKiBccGFyYW0gcFdhdiAgICAgIFBvaW50ZXIgdG8gYSBtZW1vcnkgbG9jYXRpb24sIHdoZXJlIGEgV0FWIGhhbmRsZSBpcyByZXR1cm5lZC4KLSAqIFxwYXJhbSBmaWxlbmFtZSAgRmlsZSBuYW1lIHRvIGJlIG9wZW5lZC4KLSAqCi0gKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MgYW5kIG5vbi16ZXJvIG9uIGZhaWx1cmUuCi0gKi8KLUlOVCBXQVZfSW5wdXRPcGVuIChIQU5ETEVfV0FWICpwV2F2LCBjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0KLS8qKgotICogXGJyaWVmICBSZWFkIHNhbXBsZXMgZnJvbSBhIFdBVkUgZmlsZS4gVGhlIHNhbXBsZXMgYXJlIGF1dG9tYXRpY2FsbHkgcmUtb3JkZXJlZCB0byB0aGUKLSAqICAgICAgICAgbmF0aXZlIGhvc3QgZW5kaWFuZXNzIGFuZCBzY2FsZWQgdG8gZnVsbCBzY2FsZSBvZiB0aGUgSU5UX1BDTSB0eXBlLCBmcm9tCi0gKiAgICAgICAgIHdoYXRldmVyIEJQUyB0aGUgV0FWRSBmaWxlIGhhZCBzcGVjaWZpZWQgaW4gaXRzIGhlYWRlciBkYXRhLgotICoKLSAqICBccGFyYW0gd2F2ICAgICAgICAgICBIYW5kbGUgb2YgV0FWIGZpbGUuCi0gKiAgXHBhcmFtIHNhbXBsZUJ1ZmZlciAgUG9pbnRlciB0byBzdG9yZSBhdWRpbyBkYXRhLgotICogIFxwYXJhbSBudW1TYW1wbGVzICAgIERlc2lyZWQgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZC4KLSAqICBccGFyYW0gbkJ1ZkJpdHMgICAgICBTaXplIGluIGJpdCBvZiBlYWNoIGF1ZGlvIHNhbXBsZSBvZiBzYW1wbGVCdWZmZXIuCi0gKgotICogIFxyZXR1cm4gIE51bWJlciBvZiBzYW1wbGVzIGFjdHVhbGx5IHJlYWQuCi0gKi8KLUlOVCBXQVZfSW5wdXRSZWFkIChIQU5ETEVfV0FWIHdhdiwgdm9pZCAqc2FtcGxlQnVmZmVyLCBVSU5UIG51bVNhbXBsZXMsIGludCBuQnVmQml0cyk7Ci0KLS8qKgotICogXGJyaWVmICAgICAgIENsb3NlIGEgV0FWIGZpbGUgcmVhZGluZyBoYW5kbGUuCi0gKiBccGFyYW0gcFdhdiAgUG9pbnRlciB0byBhIFdBViBmaWxlIHJlYWRpbmcgaGFuZGxlLgotICogXHJldHVybiAgICAgIHZvaWQKLSAqLwotdm9pZCBXQVZfSW5wdXRDbG9zZShIQU5ETEVfV0FWICpwV2F2KTsKLQotLyoqCi0gKiBcYnJpZWYgIE9wZW4gV0FWIG91dHB1dC93cml0ZXIgaGFuZGxlLgotICoKLSAqIFxwYXJhbSBwV2F2ICAgICAgICAgICAgUG9pbnRlciB0byBXQVYgaGFuZGxlIHRvIGJlIHJldHVybmVkLgotICogXHBhcmFtIG91dHB1dEZpbGVuYW1lICBGaWxlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgd3JpdHRlbiB0by4KLSAqIFxwYXJhbSBzYW1wbGVSYXRlICAgICAgRGVzaXJlZCBzYW1wbGVyYXRlIG9mIHRoZSByZXN1bHRpbmcgV0FWIGZpbGUuCi0gKiBccGFyYW0gbnVtQ2hhbm5lbHMgICAgIERlc2lyZWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIG9mIHRoZSByZXN1bHRpbmcgV0FWIGZpbGUuCi0gKiBccGFyYW0gYml0c1BlclNhbXBsZSAgIERlc2lyZWQgbnVtYmVyIG9mIGJpdHMgcGVyIGF1ZGlvIHNhbXBsZSBvZiB0aGUgcmVzdWx0aW5nIFdBViBmaWxlLgotICoKLSAqIFxyZXR1cm4gIDA6IG9rOyAtMTogZXJyb3IKLSAqLwotSU5UIFdBVl9PdXRwdXRPcGVuKEhBTkRMRV9XQVYgKnBXYXYsIGNvbnN0IGNoYXIgKm91dHB1dEZpbGVuYW1lLCBJTlQgc2FtcGxlUmF0ZSwgSU5UIG51bUNoYW5uZWxzLCBJTlQgYml0c1BlclNhbXBsZSk7Ci0KLS8qKgotICogXGJyaWVmICBXcml0ZSBkYXRhIHRvIFdBViBmaWxlIGFzb2NpYXRlZCB0byBXQVYgaGFuZGxlLgotICoKLSAqIFxwYXJhbSB3YXYgICAgICAgICAgICAgIEhhbmRsZSBvZiBXQVYgZmlsZQotICogXHBhcmFtIHNhbXBsZUJ1ZmZlciAgICAgUG9pbnRlciB0byBhdWRpbyBzYW1wbGVzLCByaWdodCBqdXN0aWZpZWQgaW50ZWdlciB2YWx1ZXMuCi0gKiBccGFyYW0gbnVtYmVyT2ZTYW1wbGVzICBUaGUgbnVtYmVyIG9mIGluZGl2aWR1YWwgYXVkaW8gc2FtcGxlIHZhbHVlc3RvIGJlIHdyaXR0ZW4uCi0gKiBccGFyYW0gbkJ1ZkJpdHMgICAgICAgICBTaXplIGluIGJpdHMgb2YgZWFjaCBhdWRpbyBzYW1wbGUgaW4gc2FtcGxlQnVmZmVyLgotICogXHBhcmFtIG5TaWdCaXRzICAgICAgICAgQW1vdW50IG9mIHNpZ25pZmljYW50IGJpdHMgb2YgZWFjaCBuQnVmQml0cyBpbiBzYW1wbGVCdWZmZXIuCi0gKgotICogXHJldHVybiAwOiBvazsgLTE6IGVycm9yCi0gKi8KLUlOVCBXQVZfT3V0cHV0V3JpdGUoSEFORExFX1dBViB3YXYsIHZvaWQgKnNhbXBsZUJ1ZmZlciwgVUlOVCBudW1iZXJPZlNhbXBsZXMsIGludCBuQnVmQml0cywgaW50IG5TaWdCaXRzKTsKLQotLyoqCi0gKiBcYnJpZWYgICAgICAgQ2xvc2UgV0FWIG91dHB1dCBoYW5kbGUuCi0gKiBccGFyYW0gcFdhdiAgUG9pbnRlciB0byBXQVYgaGFuZGxlLiAqcFdhdiBpcyBzZXQgdG8gTlVMTC4KLSAqIFxyZXR1cm4gICAgICB2b2lkCi0gKi8KLXZvaWQgV0FWX091dHB1dENsb3NlKEhBTkRMRV9XQVYgKnBXYXYpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLSNlbmRpZiAvKiBfX1dBVl9GSUxFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbGliU1lTL3NyYy9jbWRsX3BhcnNlci5jcHAgYi9saWJTWVMvc3JjL2NtZGxfcGFyc2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlYzBkNS4uMDAwMDAwMAotLS0gYS9saWJTWVMvc3JjL2NtZGxfcGFyc2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKToKLSAgIERlc2NyaXB0aW9uOiBjb21tYW5kIGxpbmUgcGFyc2VyCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImNtZGxfcGFyc2VyLmgiCi0jaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogaW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIElOVCAgR2V0QXJnRnJvbVN0cmluZyhJTlQgYXJnYywgVEVYVENIQVIqIGFyZ3ZbXSwgVEVYVENIQVIqIHNlYXJjaF9zdHJpbmcsIFRFWFRDSEFSIHR5cGUsIFRFWFRDSEFSKiBmb3VuZF9zdHJpbmcgLCBJTlQqIHN3aXRjaGVzX3VzZWQpOwotc3RhdGljIHZvaWQgUmVtb3ZlV2hpdGVTcGFjZShjb25zdCBURVhUQ0hBUiogcFJlcUFyZ3MsIFRFWFRDSEFSKiBSZW1vdmVkKTsKLXN0YXRpYyBJTlQgQ2hlY2tBcmcoVEVYVENIQVIqIGFyZywgIFRFWFRDSEFSKiBzdHIsIFVJTlQgbnVtQXJncywgVEVYVENIQVIgdHlwZSwgVEVYVENIQVIqIGN1cnJlbnRfc3RyKTsKLXN0YXRpYyBJTlQgQ2hlY2tGb3JVbnVzZWRTd2l0Y2hlcyhJTlQgYXJnYywgLypURVhUQ0hBUiogYXJndltdLCovIElOVCogc3dpdGNoZXNfdXNlZCk7Ci1zdGF0aWMgSU5UIFBhcnNlU3RyaW5nKFRFWFRDSEFSKiBzdHIsIElOVCosIFRFWFRDSEFSKiwgVEVYVENIQVIqKTsKLXN0YXRpYyB2b2lkIEdldE51bWJlck9mQXJncyhURVhUQ0hBUiogc3RyLCBJTlQqIG5BcmdzKTsKLQotc3RhdGljCi12b2lkIHJlbW92ZVF1b3RlcyhjaGFyICpzdHIpCi17Ci0gIGlmIChzdHJbMF0gPT0gJyInKSB7Ci0gICAgRkRLc3RyY3B5KHN0ciwgc3RyKzEpOwotICAgIHN0cltGREtzdHJsZW4oc3RyKS0xXSA9IDA7Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKiovCi0KLUlOVCBJSVNfU2NhbkNtZGwoSU5UIGFyZ2MsIFRFWFRDSEFSKiBhcmd2W10sIGNvbnN0IFRFWFRDSEFSKiBzdHIsIC4uLikKLXsKLSAgSU5UIGkgICAgICAgICAgICAgID0gMDsKLSAgSU5UIGZvdW5kX2FuZF9zZXQgID0gMDsKLSAgSU5UIG5BcmdzICAgICAgICAgID0gMDsKLSAgSU5UKiBzd2l0Y2hlc191c2VkID0gMDsKLSAgSU5UKiAgIGJfc3RyX29wdCAgID0gMDsKLSAgVEVYVENIQVIqICBzX3N0ciAgICAgICA9IDA7Ci0gIFRFWFRDSEFSKiAgY19zdHJfdHlwZSAgPSAwOwotICBURVhUQ0hBUiogIHN0cl9jbGVhbiAgID0gMDsKLQotICB2YV9saXN0IGFwOwotCi0gIGlmIChhcmdjID09IDAgfHwgYXJnYyA9PSAxKQotICB7Ci0gICAgRkRLcHJpbnRmKCJObyBjb21tYW5kIGxpbmUgYXJndW1lbnRzXG4iKTsKLSAgICBnb3RvIGJhaWw7Ci0gIH0KLQotICBzdHJfY2xlYW4gID0gKFRFWFRDSEFSKikgIEZES2NhbGxvYygodW5zaWduZWQgaW50KV90Y3NsZW4oc3RyKSwgc2l6ZW9mKFRFWFRDSEFSKSk7Ci0gIGlmIChzdHJfY2xlYW4gPT0gTlVMTCkgewotICAgIEZES3ByaW50ZigiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgbGluZSAlZCwgZmlsZSAlc1xuIiwgIF9fTElORV9fLCBfX0ZJTEVfXyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBSZW1vdmVXaGl0ZVNwYWNlKHN0ciwgc3RyX2NsZWFuICk7Ci0gIEdldE51bWJlck9mQXJncyhzdHJfY2xlYW4sICZuQXJncyk7Ci0KLSAgYl9zdHJfb3B0ICA9IChJTlQqKSAgIEZES2NhbGxvYyhuQXJncywgICAgc2l6ZW9mKElOVCkpOwotICBzX3N0ciAgICAgID0gKFRFWFRDSEFSKikgIEZES2NhbGxvYyhuQXJncypDTURMX01BWF9BUkdDLCBzaXplb2YoVEVYVENIQVIpICk7Ci0gIGNfc3RyX3R5cGUgPSAoVEVYVENIQVIqKSAgRkRLY2FsbG9jKG5BcmdzLCAgICBzaXplb2YoVEVYVENIQVIpKTsKLSAgc3dpdGNoZXNfdXNlZCA9IChJTlQqKSBGREtjYWxsb2MoYXJnYywgc2l6ZW9mKElOVCkpOwotCi0gIGlmIChiX3N0cl9vcHQgPT0gTlVMTCB8fCBzX3N0ciA9PSBOVUxMIHx8IGNfc3RyX3R5cGUgPT0gTlVMTCB8fCBzd2l0Y2hlc191c2VkID09IE5VTEwpIHsKLSAgICBGREtwcmludGYoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGxpbmUgJWQsIGZpbGUgJXNcbiIsICBfX0xJTkVfXywgX19GSUxFX18pOwotICAgIGdvdG8gYmFpbDsKLSAgfQotCi0gIGlmICggUGFyc2VTdHJpbmcoIHN0cl9jbGVhbiwgYl9zdHJfb3B0LCBzX3N0ciwgY19zdHJfdHlwZSApKSB7Ci0gICAgZ290byBiYWlsOwotICB9Ci0KLSAgdmFfc3RhcnQoYXAsIHN0cik7Ci0KLSAgZm9yICggaSA9IDA7IGkgPCBuQXJnczsgaSsrICkKLSAgICB7Ci0gICAgICBURVhUQ0hBUiBhcmdbQ01ETF9NQVhfU1RSTEVOXSA9IHtMJ1wwJ307Ci0gICAgICBURVhUQ0hBUiogcF9hcmcgPSBhcmc7Ci0gICAgICBURVhUQ0hBUiogY3VycmVudF9zdHIgPSAmKHNfc3RyW2kqQ01ETF9NQVhfQVJHQ10pOwotCi0gICAgICBpZiAoR2V0QXJnRnJvbVN0cmluZyhhcmdjLCBhcmd2LCBjdXJyZW50X3N0ciwgY19zdHJfdHlwZVtpXSwgYXJnLCBzd2l0Y2hlc191c2VkICkKLSAgICAgICAgICAmJiAhYl9zdHJfb3B0W2ldICkKLSAgICAgICAgewotI2lmZGVmIF9VTklDT0RFCi0gICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1RFWFQoIlxuXG5FcnJvcjogUGFyc2luZyBhcmd1bWVudCBmb3IgcmVxdWlyZWQgc3dpdGNoICclbHMnLlxuIiApLCBjdXJyZW50X3N0cik7Ci0jZWxzZQotICAgICAgICAgIF9mdHByaW50ZihzdGRlcnIsIF9URVhUKCJcblxuRXJyb3I6IFBhcnNpbmcgYXJndW1lbnQgZm9yIHJlcXVpcmVkIHN3aXRjaCAnJXMnLlxuIiApLCBjdXJyZW50X3N0cik7Ci0jZW5kaWYKLSAgICAgICAgICBmb3VuZF9hbmRfc2V0ID0gMDsKLSAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgIH0KLSAgICAgIGlmIChDaGVja0FyZyhwX2FyZywgc19zdHIsIG5BcmdzLCBjX3N0cl90eXBlW2ldLCBjdXJyZW50X3N0cikpCi0gICAgICAgIHsKLSAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgIH0KLQotICAgICAgc3dpdGNoIChjX3N0cl90eXBlW2ldICkKLSAgICAgICAgewotICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBURVhUQ0hBUiogdG1wOwotICAgICAgICAgICAgdG1wID0gdmFfYXJnKGFwLCBURVhUQ0hBUiopOwotCi0gICAgICAgICAgICBpZiAoIGFyZ1swXSA9PSAnXDAnICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIF90Y3NuY3B5KCB0bXAsIGFyZywgQ01ETF9NQVhfU1RSTEVOICk7Ci0gICAgICAgICAgICAvKiBSZW1vdmUgcXVvdGVzLiBXaW5kb3dzIE1vYmlsZSBXb3JrYXJvdW5kLiAqLwotICAgICAgICAgICAgcmVtb3ZlUXVvdGVzKHRtcCk7Ci0gICAgICAgICAgICBmb3VuZF9hbmRfc2V0Kys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIElOVCogdG1wID0gdmFfYXJnKGFwLCBJTlQqKTsKLQotICAgICAgICAgICAgaWYgKCBhcmdbMF0gPT0gJ1wwJyApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAqdG1wID0gX3Rjc3RvbChhcmcsIE5VTEwsIDApOwotICAgICAgICAgICAgZm91bmRfYW5kX3NldCsrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyKiB0bXAgPSB2YV9hcmcoYXAsIGNoYXIqKTsKLQotICAgICAgICAgICAgaWYgKCBhcmdbMF0gPT0gJ1wwJyApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAqdG1wID0gKmFyZzsKLSAgICAgICAgICAgIGZvdW5kX2FuZF9zZXQrKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgewotICAgICAgICAgICAgVUNIQVIqIHRtcCA9IHZhX2FyZyhhcCwgVUNIQVIqKTsKLQotICAgICAgICAgICAgaWYgKCBhcmdbMF0gPT0gJ1wwJyApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAqdG1wID0gX3RzdG9pKGFyZyk7Ci0gICAgICAgICAgICBmb3VuZF9hbmRfc2V0Kys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZsb2F0KiB0bXAgPSAoZmxvYXQqKSB2YV9hcmcoIGFwLGRvdWJsZSopOwotCi0gICAgICAgICAgICBpZiAoIGFyZ1swXSA9PSAnXDAnICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICp0bXAgPSAoZmxvYXQpIF90c3RvZihhcmcpOwotICAgICAgICAgICAgZm91bmRfYW5kX3NldCsrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlICd5JzogLy8gc3VwcG9ydCAnZGF0YSB0eXBlIGRvdWJsZScKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUqIHRtcCA9IChkb3VibGUqKSB2YV9hcmcoIGFwLGRvdWJsZSopOwotICAgICAgICAgICAgLy8gdXNlIHNzY2FuZiBpbnN0ZWFkIF90c3RvZiBiZWNhdXNlIG9mIGdjYwotICAgICAgICAgICAgLy9fdHN0b2YoYXJnLCIlbGYiLHRtcCk7IC8vICclbGYnIHJlYWRzIGFzIGRvdWJsZQotICAgICAgICAgICAgKnRtcCA9IF90c3RvZihhcmcpOyAvLyAnJWxmJyByZWFkcyBhcyBkb3VibGUKLSAgICAgICAgICAgIGZvdW5kX2FuZF9zZXQrKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgewotCi0gICAgICAgICAgICBJTlQqIHRtcCA9IHZhX2FyZyggYXAsIElOVCopOwotCi0gICAgICAgICAgICBpZiAoIGFyZ1swXSA9PSAnXDAnICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICp0bXAgPSAxOwotICAgICAgICAgICAgZm91bmRfYW5kX3NldCsrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRkRLcHJpbnRmRXJyKCJCdWc6IHVuc3VwcG9ydGVkIGRhdGEgaWRlbnRpZmllciBcIiVjXCJcbiIsIGNfc3RyX3R5cGVbaV0pOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIH0KLQotICAgIH0KLQotICB2YV9lbmQoYXApOwotCi0gIENoZWNrRm9yVW51c2VkU3dpdGNoZXMoYXJnYywgLyphcmd2LCovIHN3aXRjaGVzX3VzZWQpOwotCi1iYWlsOgotICBpZiAoYl9zdHJfb3B0KSAgICAgRkRLZnJlZShiX3N0cl9vcHQpOwotICBpZiAoc19zdHIpICAgICAgICAgRkRLZnJlZShzX3N0cik7Ci0gIGlmIChjX3N0cl90eXBlKSAgICBGREtmcmVlKGNfc3RyX3R5cGUpOwotICBpZiAoc3RyX2NsZWFuKSAgICAgRkRLZnJlZShzdHJfY2xlYW4pOwotICBpZiAoc3dpdGNoZXNfdXNlZCkgRkRLZnJlZShzd2l0Y2hlc191c2VkKTsKLQotICByZXR1cm4gZm91bmRfYW5kX3NldDsKLX0KLQotCi12b2lkIEdldE51bWJlck9mQXJncyhURVhUQ0hBUiogc3RyLCBJTlQqIG5BcmdzKQotewotICBVSU5UIGkgPSAwOwotICBmb3IgKCBpID0gMDsgaSA8IF90Y3NsZW4oc3RyKTsgKytpICkKLSAgICB7Ci0gICAgICBpZiAoIHN0cltpXSA9PSAnJScpCi0gICAgICAgICpuQXJncys9IDE7Ci0gICAgfQotCi19Ci0KLUlOVCBQYXJzZVN0cmluZyhURVhUQ0hBUiogc3RyLCBJTlQqIGJfc3RyX29wdCwgVEVYVENIQVIqIHNfc3RyLCBURVhUQ0hBUiogY19zdHJfdHlwZSApCi17Ci0gICAgVUlOVCBpID0gMDsKLSAgICBJTlQgYXJnQ291bnRlciA9IDA7Ci0KLSAgICBURVhUQ0hBUiogc3RyX3N0YXJ0ID0gMDsKLSAgICBURVhUQ0hBUiogc3RyX3N0b3AgPSAwOwotCi0KLSAgICBzdHJfc3RhcnQgPSBzdHI7Ci0gICAgc3RyX3N0b3AgPSBzdHJfc3RhcnQ7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IF90Y3NsZW4oc3RyKSAtIDE7ICsraSApCi0gICAgICB7Ci0gICAgICAgIGlmICggc3RyW2ldID09ICclJyApICAvKiBXZSBoYXZlIGFuIEFyZ3VtZW50ICovCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBhcmdDb3VudGVyICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggYl9zdHJfb3B0W2FyZ0NvdW50ZXItMV0gKQotICAgICAgICAgICAgICAgICAgc3RyX3N0YXJ0ID0gc3RyX3N0b3AgKyAzOwotCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgc3RyX3N0YXJ0ID0gc3RyX3N0b3AgKyAyOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgQXJndW1lbnQgdHlwZSAqLwotICAgICAgICAgICAgY19zdHJfdHlwZVthcmdDb3VudGVyXSA9IHN0cltpKzFdOwotCi0gICAgICAgICAgICBpZiAoICpzdHJfc3RhcnQgPT0gJygnICkgLyogT3B0aW9uYWwgQXJndW1lbnQgKi8KLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJfc3RyX29wdFthcmdDb3VudGVyXSA9IDE7Ci0gICAgICAgICAgICAgICAgc3RyX3N0YXJ0Kys7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU2F2ZSBBcmd1bWVudCAqLwotICAgICAgICAgICAgc3RyW2ldID0gJ1wwJzsKLQotICAgICAgICAgICAgX3Rjc25jcHkoJihzX3N0clthcmdDb3VudGVyKkNNRExfTUFYX0FSR0NdKSwgc3RyX3N0YXJ0LCBDTURMX01BWF9BUkdDICk7Ci0KLSAgICAgICAgICAgIHN0cltpXSA9ICclJzsKLQotICAgICAgICAgICAgc3RyX3N0b3AgPSAmKHN0cltpXSk7Ci0KLSAgICAgICAgICAgIGlmICggYl9zdHJfb3B0W2FyZ0NvdW50ZXJdICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggaSsyID4gKCBfdGNzbGVuKHN0cikgLTEgKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVycixfVEVYVCgiXG5cbkludGVybmFsIFBhcnNlciBFcnJvcjogU3RybGVuIFByb2JsZW1cbiIpICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICggc3RyW2krMl0gIT0gJyknICkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVycixfVEVYVCgiXG5cbkludGVybmFsIFBhcnNlciBFcnJvcjogTWlzc2luZyBicmFja2V0ICcpJ1xuIikgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGFyZ0NvdW50ZXIrKzsKLSAgICAgICAgICB9Ci0KLQotICAgICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0KLQotdm9pZCBSZW1vdmVXaGl0ZVNwYWNlKGNvbnN0IFRFWFRDSEFSKiBwUmVxQXJncywgVEVYVENIQVIqIHBSZW1vdmVkKQotewotICBVSU5UIGkgPSAwOwotICBJTlQgayA9IDA7Ci0gIFVJTlQgbGVuID0gKFVJTlQpX3Rjc2xlbihwUmVxQXJncyk7Ci0KLQotICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgKytpICkKLSAgICB7Ci0KLSAgICAgIGlmICggcFJlcUFyZ3NbaV0gIT0gJyAnICkKLSAgICAgICAgewotICAgICAgICAgIHBSZW1vdmVkW2tdID0gcFJlcUFyZ3NbaV07Ci0gICAgICAgICAgaysrOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLUlOVCBHZXRBcmdGcm9tU3RyaW5nKElOVCBhcmdjLCBURVhUQ0hBUiogYXJndltdLCBURVhUQ0hBUiogc2VhcmNoX3N0cmluZywgVEVYVENIQVIgdHlwZSwgVEVYVENIQVIqIGZvdW5kX3N0cmluZywgSU5UKiBzd191c2VkICkKLXsKLSAgSU5UIGkgPSAwOwotCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kgKSB7Ci0gICAgaWYgKCAhX3Rjc2NtcChzZWFyY2hfc3RyaW5nLCBhcmd2W2ldKSApIC8qIFN0cmluZ3MgYXJlIGVxdWFsICovCi0gICAgICB7Ci0gICAgICAgIGlmICggdHlwZSA9PSAnMScgKSAvKiBTd2l0Y2ggd2l0aG91dCBhcmd1bWVudCAqLwotICAgICAgICB7Ci0gICAgICAgICAgX3Rjc25jcHkoIGZvdW5kX3N0cmluZywgX1RFWFQoIjEiKSwgMSk7Ci0gICAgICAgICAgc3dfdXNlZFtpXSA9IDE7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggaSA9PSAoYXJnYyAtIDEpKSAgLyogV2UgaGF2ZSAlcyBvciAlZCBidXQgYXJlIGZpbmlzaGVkKi8KLSAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICBpZiAoIF90Y3NsZW4oYXJndltpKzFdKSA+IENNRExfTUFYX1NUUkxFTiApCi0gICAgICAgICAgewotI2lmZGVmIF9VTklDT0RFCi0gICAgICAgICAgICBfZnRwcmludGYgKHN0ZGVycixfVEVYVCgiV2FybmluZzogSWdub3JpbmcgYXJndW1lbnQgZm9yIHN3aXRjaCAnJWxzJy4gIiksIHNlYXJjaF9zdHJpbmcgKTsKLSNlbHNlCi0gICAgICAgICAgICBfZnRwcmludGYgKHN0ZGVycixfVEVYVCgiV2FybmluZzogSWdub3JpbmcgYXJndW1lbnQgZm9yIHN3aXRjaCAnJXMnLiAiKSwgc2VhcmNoX3N0cmluZyApOwotI2VuZGlmCi0gICAgICAgICAgICBfZnRwcmludGYgKHN0ZGVycixfVEVYVCgiQXJndW1lbnQgaXMgdG9vIExPTkcuXG4iKSApOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBfdGNzbmNweSggZm91bmRfc3RyaW5nLCBhcmd2W2krMV0sIENNRExfTUFYX1NUUkxFTik7Ci0gICAgICAgICAgc3dfdXNlZFtpXSA9IDE7Ci0gICAgICAgICAgc3dfdXNlZFtpKzFdID0gMTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi0KLQotSU5UIENoZWNrQXJnKFRFWFRDSEFSKiBhcmcsIFRFWFRDSEFSKiBzdHIsIFVJTlQgbnVtQXJncywgVEVYVENIQVIgdHlwZSwgVEVYVENIQVIqIGN1cl9zdHIpCi17Ci0gIFVJTlQgaSA9IDA7Ci0KLSAgLyogTm8gYXJndW1lbnQgZ2l2ZW4tPiByZXR1cm4gKi8KLSAgaWYgKGFyZ1swXSA9PSAnXDAnKQotICAgIHJldHVybiAwOwotCi0KLSAgLyogQ2hlY2sgaWYgYXJnIGlzIHN3aXRjaCAqLwotICBmb3IgKCBpID0gMDsgaSA8IG51bUFyZ3M7ICsraSApCi0gICAgewotICAgICAgaWYgKCFfdGNzY21wKGFyZywgJihzdHJbaSpDTURMX01BWF9BUkdDXSkpKQotICAgICAgICB7Ci0jaWZkZWYgX1VOSUNPREUKLSAgICAgICAgICBfZnRwcmludGYoc3RkZXJyLCBfVEVYVCgiXG5cbkVycm9yOiBBcmd1bWVudCAnJWxzJyBmb3Igc3dpdGNoICclbHMnIGlzIG5vdCB2YWxpZCBcbiIgKSwgYXJnLCBjdXJfc3RyICk7Ci0jZWxzZQotICAgICAgICAgIF9mdHByaW50ZihzdGRlcnIsIF9URVhUKCJcblxuRXJyb3I6IEFyZ3VtZW50ICclcycgZm9yIHN3aXRjaCAnJXMnIGlzIG5vdCB2YWxpZCBcbiIgKSwgYXJnLCBjdXJfc3RyICk7Ci0jZW5kaWYKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgfQotICAvKiBDaGVjayBpZiB0eXBlIGlzICVkIGJ1dCBhIHN0cmluZyBpcyBnaXZlbiAqLwotCi0gIGZvciAoIGkgPSAwOyBpIDwgX3Rjc2xlbihhcmcpOyArK2kgKQotICAgIHsKLSAgICAgIGlmICggKHR5cGUgPT0gJ2QnKSAmJiAhX2lzdGRpZ2l0KGFyZ1tpXSkgJiYgYXJnW2ldICE9ICd4JyAmJiBhcmdbaV0gIT0gJy0nKQotICAgICAgICB7Ci0jaWZkZWYgX1VOSUNPREUKLSAgICAgICAgICBfZnRwcmludGYoc3RkZXJyLCBfVEVYVCgiXG5cbkVycm9yOiBBcmd1bWVudCAnJWxzJyBmb3Igc3dpdGNoICclbHMnIGlzIG5vdCBhIHZhbGlkIG51bWJlci5cbiIgKSwgYXJnLCBjdXJfc3RyKTsKLSNlbHNlCi0gICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1RFWFQoIlxuXG5FcnJvcjogQXJndW1lbnQgJyVzJyBmb3Igc3dpdGNoICclcycgaXMgbm90IGEgdmFsaWQgbnVtYmVyLlxuIiApLCBhcmcsIGN1cl9zdHIpOwotI2VuZGlmCi0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICByZXR1cm4gMDsKLX0KLQotCi1JTlQgQ2hlY2tGb3JVbnVzZWRTd2l0Y2hlcyhJTlQgYXJnYywgLypURVhUQ0hBUiogYXJndltdLCovIElOVCogc3dpdGNoZXNfdXNlZCkKLXsKLSAgSU5UIGkgPSAwOwotCi0gIGZvciggaSA9IDE7IGkgPCBhcmdjOyArK2kgKQotICAgIHsKLSAgICAgIGlmICggIXN3aXRjaGVzX3VzZWRbaV0gKQotICAgICAgICB7Ci0gICAgICAgICAgKytpOwotICAgICAgICB9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLQotc3RhdGljIGNoYXIgbGluZVtDTURMX01BWF9TVFJMRU4qQ01ETF9NQVhfQVJHQ107Ci1zdGF0aWMgY2hhciAqYXJndl9wdHJbQ01ETF9NQVhfQVJHQ107Ci0jaWZkZWYgQ01ERklMRV9QUkVGSVgKLXN0YXRpYyBjaGFyIHRtcFsyNTZdOyAvKiB0aGlzIGFycmF5IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHByZWZpeCBhbmQgdGhlIGZpbGVwYXRoL25hbWUgKi8KLSNlbmRpZgotCi1pbnQgSUlTX1Byb2Nlc3NDbWRsTGlzdChjb25zdCBjaGFyKiBwYXJhbV9maWxlbmFtZSwgaW50ICgqcEZ1bmN0aW9uKShpbnQsIFRFWFRDSEFSKiopKQotewotICAvKiBzdGF0aWMgdG8gcmVkdWNlIHJlcXVpcmVkIHN0YWNrIHNpemUgKi8KLQotICBGREtGSUxFICpjb25maWdfZnA7Ci0gIGludCBhcmdjOwotICBjaGFyICpsaW5lX3B0cjsKLQotI2lmZGVmIENNREZJTEVfUFJFRklYCi0gIEZES3N0cmNweSh0bXAsIENNREZJTEVfUFJFRklYKTsKLSAgRkRLc3RyY3B5KHRtcCtGREtzdHJsZW4oQ01ERklMRV9QUkVGSVgpLCBwYXJhbV9maWxlbmFtZSk7Ci0gIC8qIE9wZW4gdGhlIGZpbGUgd2l0aCBjb21tYW5kIGxpbmVzICovCi0gIGNvbmZpZ19mcCA9IEZES2ZvcGVuKHRtcCwgInIiKTsKLSNlbHNlCi0gIC8qIE9wZW4gdGhlIGZpbGUgd2l0aCBjb21tYW5kIGxpbmVzICovCi0gIGNvbmZpZ19mcCA9IEZES2ZvcGVuKHBhcmFtX2ZpbGVuYW1lLCAiciIpOwotI2VuZGlmCi0KLSAgaWYoY29uZmlnX2ZwID09IE5VTEwpCi0gIHsKLSNpZmRlZiBDTURGSUxFX1BSRUZJWAotICAgIEZES3ByaW50ZigiXG5jb3VsZCBub3Qgb3BlbiBjb25maWcgZmlsZSAlcyIsIHRtcCk7Ci0jZWxzZQotICAgIEZES3ByaW50ZigiXG5jb3VsZCBub3Qgb3BlbiBjb25maWcgZmlsZSAlcyIsIHBhcmFtX2ZpbGVuYW1lKTsKLSNlbmRpZgotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLyogT2J0YWluIGEgY29tbWFuZCBsaW5lIGZyb20gY29uZmlnIGZpbGUgKi8KLSAgd2hpbGUgKEZES2ZnZXRzKGxpbmUsIENNRExfTUFYX1NUUkxFTipDTURMX01BWF9BUkdDLCBjb25maWdfZnApICE9IE5VTEwpCi0gIHsKLSAgICBhcmdjID0gMTsKLQotICAgIC8qIEVhdCBcbiAqLwotICAgIGxpbmVfcHRyID0gIChjaGFyKilGREtzdHJjaHIobGluZSwgJ1xuJyk7Ci0gICAgaWYgKGxpbmVfcHRyICE9IE5VTEwpCi0gICAgICAqbGluZV9wdHIgPSAnICc7Ci0KLSAgICBsaW5lX3B0ciA9IGxpbmU7Ci0KLSAgICAvKiBTY2FuIHRoZSBsaW5lIGFuZCBwdXQgdGhlIGNvbW1hbmQgbGluZSBwYXJhbXMgaW50byBhcmd2ICovCi0gICAgZG8gewotICAgICAgLyogU2tpcCBjb25zZWN1dGl2ZSBibGFua3MuICovCi0gICAgICB3aGlsZSAoKmxpbmVfcHRyID09ICcgJyAmJiBsaW5lX3B0ciA8IGxpbmUrQ01ETF9NQVhfU1RSTEVOKQotICAgICAgICBsaW5lX3B0cisrOwotICAgICAgLyogQXNzaWduIGFyZ3VtZW50LiAqLwotICAgICAgYXJndl9wdHJbYXJnY10gPSBsaW5lX3B0cjsKLSAgICAgIC8qIEdldCBwb2ludGVyIHRvIG5leHQgYmxhbmsuICovCi0gICAgICBsaW5lX3B0ciA9IChjaGFyKilGREtzdHJjaHIobGluZV9wdHIsICcgJyk7Ci0gICAgICAvKiAgKi8KLSAgICAgIGlmIChsaW5lX3B0ciAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIE51bGwgdGVybWluYXRlICovCi0gICAgICAgICpsaW5lX3B0ciA9IDA7Ci0gICAgICAgIC8qIFNraXAgZm9ybWVyIGJsYW5rIChub3cgbnVsbCBjaGFyYWN0ZXIpICovCi0gICAgICAgIGxpbmVfcHRyKys7Ci0gICAgICAgIC8qIEFkdmFuY2UgYXJndW1lbnQgY291bnRlciAqLwotICAgICAgfQotICAgICAgYXJnYysrOwotICAgIH0gd2hpbGUgKCBsaW5lX3B0ciAhPSBOVUxMICYmIGFyZ2MgPCBDTURMX01BWF9BUkdDKTsKLQotICAgIC8qIGNhbGwgIndvdWxkIGJlIG1haW4oKSIgKi8KLSAgICBpZiAoYXJnYyA+IDIgJiYgKmFyZ3ZfcHRyWzFdICE9ICcjJyAmJiBGREtzdHJsZW4oYXJndl9wdHJbMV0pPjEpCi0gICAgewotICAgICAgaW50IHJldHZhbDsKLQotICAgICAgcmV0dmFsID0gKCpwRnVuY3Rpb24pKGFyZ2MsIGFyZ3ZfcHRyKTsKLQotICAgICAgRkRLcHJpbnRmKCJtYWluIHJldHVybmVkICVkXG4iLCByZXR2YWwpOwotICAgIH0KLSAgfQotCi0gIEZES2ZjbG9zZShjb25maWdfZnApOwotICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliU1lTL3NyYy9jb252X3N0cmluZy5jcHAgYi9saWJTWVMvc3JjL2NvbnZfc3RyaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjYmM4My4uMDAwMDAwMAotLS0gYS9saWJTWVMvc3JjL2NvbnZfc3RyaW5nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKToKLSAgIERlc2NyaXB0aW9uOiBzdHJpbmcgY29udmVyc2lvbiBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCi0jaW5jbHVkZSAiY29udl9zdHJpbmcuaCIKLQotSU5UIGNoYXJCdWYySGV4U3RyaW5nKGNoYXIgKnN0cmluZywgVUNIQVIgKmNoYXJCdWYsIElOVCBjaGFyQnVmTGVuZ3RoKQotewotICBJTlQgaTsKLSAgVUNIQVIgYzEsIGMyOwotCi0gIC8qIHNhbml0eSBjaGVja3MgKi8KLSAgLyogY2hlY2sgYXJyYXkgbGVuZ3RoICovCi0gIGlmIChjaGFyQnVmTGVuZ3RoID09IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKiBkZWZpbmUgaGV4IHN0cmluZyBUYWJsZSAqLwotICBVQ0hBUiBoZXhTeW1iWzE2XT17JzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCdhJywnYicsJ2MnLCdkJywnZScsJ2YnfTsKLQotICAvKiBjYWxjdWxhdGUgY29ycmVzcG9uZGluZyBoZXggc3RyaW5nIGZyb20gY2hhckJ1ZmZlciAqLwotICBmb3IgKGk9MDtpPGNoYXJCdWZMZW5ndGg7aSsrKSB7Ci0gICAgYzEgPSAoKGNoYXJCdWZbaV0pPj40KSYweDBmOyAvKiB1cHBlciBuaWJibGUgKi8KLSAgICBjMiA9IChjaGFyQnVmW2ldKSYweDBmOyAgICAgIC8qIGxvd2VyIG5pYmJsZSAqLwotCi0gICAgc3RyaW5nW2kqMl0gICA9IGhleFN5bWJbYzFdOyAgLyogY29udmVydCB0byBzdHJpbmcgKi8KLSAgICBzdHJpbmdbaSoyKzFdID0gaGV4U3ltYltjMl07ICAvKiBjb252ZXJ0IHRvIHN0cmluZyAqLwotICB9Ci0KLSAgLyogdGVybWluYXRlIHN0cmluZyAqLwotICBzdHJpbmdbY2hhckJ1Zkxlbmd0aDw8MV09J1wwJzsKLQotICByZXR1cm4gMDsKLQotfQotCi1JTlQgaGV4U3RyaW5nMkNoYXJCdWYoY29uc3QgY2hhciAqc3RyaW5nLCBVQ0hBUiAqY2hhckJ1ZiwgVUlOVCBjaGFyQnVmTGVuZ3RoKQotewotICBVSU5UIGksIGsgPSAwOwotICBVQ0hBUiBoTmliYmxlLCBsTmliYmxlOwotCi0gIC8qIHNhbml0eSBjaGVja3MgKi8KLSAgaWYgKHN0cmluZ1swXSA9PSAnXDAnKSB7Ci0gICAgcmV0dXJuIC0xOyAvKiBpbnZhbGlkIHN0cmluZyBzaXplICovCi0gIH0KLQotICBpZiAoY2hhckJ1Zkxlbmd0aDw9MCl7Ci0gICAgcmV0dXJuIC0yOyAvKiBpbnZhbGlkIGJ1ZmZlciBzaXplICovCi0gIH0KLQotICAvKiBjb252ZXJ0IHRvIGhleCBjaGFyYWN0ZXJzIHRvIGNvcnJlc3BvbmRpbmcgOGJpdCB2YWx1ZSAqLwotICBmb3IgKGk9MDsoc3RyaW5nW2ldIT0nXDAnKSYmKChpPj4xKTxjaGFyQnVmTGVuZ3RoKTtpKz0yKSB7Ci0gICAgayA9IGk+PjE7Ci0gICAgaE5pYmJsZSA9IGhleENoYXIyRGVjKHN0cmluZ1tpXSk7Ci0gICAgbE5pYmJsZSA9IGhleENoYXIyRGVjKHN0cmluZ1tpKzFdKTsKLSAgICBpZiAoKGhOaWJibGUgPT0gMTYpIHx8IChsTmliYmxlID09IDE2KSkgewotICAgICAgcmV0dXJuIC0zOyAvKiBpbnZhbGlkIGNoYXJhY3RlciAqLwotICAgIH0KLSAgICBjaGFyQnVmW2tdID0gKChoTmliYmxlPDw0KSYweGYwKSArIGxOaWJibGU7Ci0gIH0KLQotICAvKiBjaGVjayBpZiBsYXN0IGNoYXJhY3RlciB3YXMgc3RyaW5nIHRlcm1pbmF0b3IgKi8KLSAgaWYgKChzdHJpbmdbaS0yXSE9MCkgJiYgKHN0cmluZ1tpXSE9MCkpIHsKLSAgICByZXR1cm4gLTE7IC8qIGludmFsaWQgc3RyaW5nIHNpemUgKi8KLSAgfQotCi0gIC8qIGZpbGwgY2hhckJ1ZmZlciB3aXRoIHplcm9zICovCi0gIGZvciAoaT1rKzE7aTxjaGFyQnVmTGVuZ3RoO2krKykgewotICAgIGNoYXJCdWZbaV0gPSAwOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci0KLX0KLQotVUNIQVIgaGV4Q2hhcjJEZWMoY29uc3QgY2hhciBjKQotewotICBJTlQgciA9IDA7Ci0gIGlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpCi0gICAgciA9IGMtJzAnOwotICBlbHNlIGlmICgoYyA+PSAnYScpICYmIChjIDw9ICdmJykpCi0gICAgciA9IGMtJ2EnKzEwOwotICBlbHNlIGlmICgoYyA+PSAnQScpICYmIChjIDw9ICdGJykpCi0gICAgciA9IGMtJ0EnKzEwOwotICBlbHNlCi0gICAgciA9IDE2OyAvKiBpbnZhbGlkIGhleCBjaGFyYWN0ZXIgKi8KLQotICByZXR1cm4gKFVDSEFSKXI7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYlNZUy9zcmMvZ2VuZXJpY1N0ZHMuY3BwIGIvbGliU1lTL3NyYy9nZW5lcmljU3Rkcy5jcHAKaW5kZXggODljNDIyYy4uZjk4ZDBhOSAxMDA2NDQKLS0tIGEvbGliU1lTL3NyYy9nZW5lcmljU3Rkcy5jcHAKKysrIGIvbGliU1lTL3NyYy9nZW5lcmljU3Rkcy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjcgKzkwLDMwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBTeXN0ZW0gaW50ZWdyYXRpb24gbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiAtIEdlbmVyaWMgbWVtb3J5LCBzdGRpbywgc3RyaW5nLCBldGMuIGZ1bmN0aW9uIHdyYXBwZXJzIG9yCi0gICAgICAgICAgICAgICAgICBidWlsdGlucy4KKyAgICAgICAgICAgICAgICBidWlsdGlucy4KICAgICAgICAgICAgICAgICAtIE9TIGRlcGVuZGFudCBmdW5jdGlvbiB3cmFwcGVycy4KIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwogI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUworI2VuZGlmCiAKLSNpbmNsdWRlIDxtYXRoLmg+CisjZGVmaW5lIF9fR0VORVJJQ1NURFNfQ1BQX18KIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKIC8qIGxpYnJhcnkgaW5mbyAqLwotI2RlZmluZSBTWVNfTElCX1ZMMCAxCi0jZGVmaW5lIFNZU19MSUJfVkwxIDMKLSNkZWZpbmUgU1lTX0xJQl9WTDIgOAorI2RlZmluZSBTWVNfTElCX1ZMMCAyCisjZGVmaW5lIFNZU19MSUJfVkwxIDAKKyNkZWZpbmUgU1lTX0xJQl9WTDIgMAogI2RlZmluZSBTWVNfTElCX1RJVExFICJTeXN0ZW0gSW50ZWdyYXRpb24gTGlicmFyeSIKICNpZmRlZiBfX0FORFJPSURfXwogI2RlZmluZSBTWVNfTElCX0JVSUxEX0RBVEUgIiIKQEAgLTEwOSw2OSArMTIzLDQ3IEBACiAjZGVmaW5lIFNZU19MSUJfQlVJTERfVElNRSBfX1RJTUVfXwogI2VuZGlmCiAKLSAgI2luY2x1ZGUgPHN0ZGxpYi5oPgotICAjaW5jbHVkZSA8c3RkaW8uaD4KLSAgI2luY2x1ZGUgPHN0cmluZy5oPgotICAgICNpbmNsdWRlIDxzdGRhcmcuaD4KLQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIG1lbW9yeSBhbGxvY2F0aW9uIG1vbml0b3JpbmcgdmFyaWFibGVzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qIEluY2x1ZGUgT1MvU3lzdGVtIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucy4gKi8KLSNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX18pIC8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KLSAgI2luY2x1ZGUgImxpbnV4L2dlbmVyaWNTdGRzX2xpbnV4LmNwcCIKLSNlbmRpZgogCi0KLSNpZiAhKGRlZmluZWQoVVNFX0JVSUxUSU5fU1RSSU5HX0ZVTkNUSU9OUykgfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSkKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogCi0jaWZuZGVmIEZVTkNUSU9OX0ZES3ByaW50Zgotdm9pZCAgRkRLcHJpbnRmKCBjb25zdCBjaGFyKiBzekZtdCwgLi4uKSAgICB7Cit2b2lkIEZES3ByaW50Zihjb25zdCBjaGFyICpzekZtdCwgLi4uKSB7CiAgIHZhX2xpc3QgYXA7CiAgIHZhX3N0YXJ0KGFwLCBzekZtdCk7CiAgIHZwcmludGYoc3pGbXQsIGFwKTsKICAgdmFfZW5kKGFwKTsKLSNpZmRlZiBBUkNIX1dBX0ZMVVNIX0NPTlNPTEUKLSAgZmZsdXNoKHN0ZG91dCk7Ci0jZW5kaWYKIH0KLSNlbmRpZgogCi0jaWZuZGVmIEZVTkNUSU9OX0ZES3ByaW50ZkVycgotdm9pZCAgRkRLcHJpbnRmRXJyKCBjb25zdCBjaGFyKiBzekZtdCwgLi4uKSB7Cit2b2lkIEZES3ByaW50ZkVycihjb25zdCBjaGFyICpzekZtdCwgLi4uKSB7CiAgIHZhX2xpc3QgYXA7CiAgIHZhX3N0YXJ0KGFwLCBzekZtdCk7Ci0jaWYgZGVmaW5lZChBUkNIX1dBX1NMT1dDT04pCi0gIHZwcmludGYoc3pGbXQsIGFwKTsKLSNlbHNlCiAgIHZmcHJpbnRmKHN0ZGVyciwgc3pGbXQsIGFwKTsKLSNlbmRpZgogICB2YV9lbmQoYXApOwotI2lmZGVmIEFSQ0hfV0FfRkxVU0hfQ09OU09MRQotICBmZmx1c2goc3RkZXJyKTsKLSNlbmRpZgogfQotI2VuZGlmCiAKIGludCBGREtnZXRjaGFyKHZvaWQpIHsgcmV0dXJuIGdldGNoYXIoKTsgfQogCi1JTlQgIEZES2ZwcmludGYoRkRLRklMRSAgKnN0cmVhbSwgIGNvbnN0ICBjaGFyICpmb3JtYXQsIC4uLikgeworSU5UIEZES2ZwcmludGYoRkRLRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgewogICBJTlQgY2hhcnMgPSAwOwogICB2YV9saXN0IGFwOwogICB2YV9zdGFydChhcCwgZm9ybWF0KTsKLSAgY2hhcnMgKz0gdmZwcmludGYoKEZJTEUqKXN0cmVhbSwgZm9ybWF0LCBhcCk7CisgIGNoYXJzICs9IHZmcHJpbnRmKChGSUxFICopc3RyZWFtLCBmb3JtYXQsIGFwKTsKICAgdmFfZW5kKGFwKTsKICAgcmV0dXJuIGNoYXJzOwogfQogCi0jaWZuZGVmIEZVTkNUSU9OX0ZES3NwcmludGYKLUlOVCAgRkRLc3ByaW50ZihjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CitJTlQgRkRLc3ByaW50ZihjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CiAgIElOVCBjaGFycyA9IDA7CiAgIHZhX2xpc3QgYXA7CiAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOwpAQCAtMTc5LDI1NSArMTcxLDE5NyBAQAogICB2YV9lbmQoYXApOwogICByZXR1cm4gY2hhcnM7CiB9Ci0jZW5kaWYKLQotI2Vsc2UKLQotdm9pZCBGREtwcmludGYoIGNvbnN0IGNoYXIqIHN6Rm10LCAuLi4pIHsgLyogc3R1YiEgKi87IH0KLXZvaWQgRkRLcHJpbnRmRXJyKCBjb25zdCBjaGFyKiBzekZtdCwgLi4uKSB7IC8qIHN0dWIhICovOyB9Ci1JTlQgIEZES2ZwcmludGYoRklMRSAgKnN0cmVhbSwgIGNvbnN0ICBjaGFyICpmb3JtYXQsIC4uLikgeyAvKnN0dWIgISAqLzsgfQotSU5UICBGREtzcHJpbnRmKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsgLyogc3R1YiEgKi87IH0KLQotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWNvbnN0IGNoYXIgKkZES3N0cmNocihjb25zdCBjaGFyICpzLCBJTlQgYykgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHN0cmNocihzLCBjKTsgfQotY29uc3QgY2hhciAqRkRLc3Ryc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpICAgeyByZXR1cm4gc3Ryc3RyKGhheXN0YWNrLCBuZWVkbGUpOyB9Ci0jaWZuZGVmIEZVTkNUSU9OX0ZES3N0cmNweQotY2hhciAqRkRLc3RyY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc3RyY3B5KGRlc3QsIHNyYyk7IH0KLSNlbmRpZgotY2hhciAqRkRLc3RybmNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIFVJTlQgbikgICAgICAgICAgICAgeyByZXR1cm4gc3RybmNweShkZXN0LCBzcmMsIG4pOyB9CitjaGFyICpGREtzdHJjaHIoY2hhciAqcywgSU5UIGMpIHsgcmV0dXJuIHN0cmNocihzLCBjKTsgfQorY29uc3QgY2hhciAqRkRLc3Ryc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpIHsKKyAgcmV0dXJuIHN0cnN0cihoYXlzdGFjaywgbmVlZGxlKTsKK30KK2NoYXIgKkZES3N0cmNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpIHsgcmV0dXJuIHN0cmNweShkZXN0LCBzcmMpOyB9CitjaGFyICpGREtzdHJuY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgVUlOVCBuKSB7CisgIHJldHVybiBzdHJuY3B5KGRlc3QsIHNyYywgbik7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBEWU5BTUlDIE1FTU9SWSBtYW5hZ2VtZW50IChoZWFwKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgRlVOQ1RJT05fRkRLY2FsbG9jCi12b2lkICpGREtjYWxsb2MgKGNvbnN0IFVJTlQgbiwgY29uc3QgVUlOVCBzaXplKQotewotICB2b2lkKiBwdHI7Cit2b2lkICpGREtjYWxsb2MoY29uc3QgVUlOVCBuLCBjb25zdCBVSU5UIHNpemUpIHsKKyAgdm9pZCAqcHRyOwogCiAgIHB0ciA9IGNhbGxvYyhuLCBzaXplKTsKIAogICByZXR1cm4gcHRyOwogfQotI2VuZGlmCiAKLSNpZm5kZWYgRlVOQ1RJT05fRkRLbWFsbG9jCi12b2lkICpGREttYWxsb2MgKGNvbnN0IFVJTlQgc2l6ZSkKLXsKLSAgdm9pZCogcHRyOwordm9pZCAqRkRLbWFsbG9jKGNvbnN0IFVJTlQgc2l6ZSkgeworICB2b2lkICpwdHI7CiAKICAgcHRyID0gbWFsbG9jKHNpemUpOwogCiAgIHJldHVybiBwdHI7CiB9Ci0jZW5kaWYKIAotI2lmbmRlZiBGVU5DVElPTl9GREtmcmVlCi12b2lkICBGREtmcmVlICh2b2lkICpwdHIpCi17Ci0gIC8qIEZES3ByaW50ZigiZiwgaGVhcFNpemU6ICVkXG4iLCBoZWFwU2l6ZUN1cnIpOyAqLwotICBmcmVlKChJTlQqKXB0cik7Ci19Ci0jZW5kaWYKK3ZvaWQgRkRLZnJlZSh2b2lkICpwdHIpIHsgZnJlZSgoSU5UICopcHRyKTsgfQogCi0jaWZuZGVmIEZVTkNUSU9OX0ZES2FhbGxvYwotdm9pZCAqRkRLYWFsbG9jKGNvbnN0IFVJTlQgc2l6ZSwgY29uc3QgVUlOVCBhbGlnbm1lbnQpCi17Ci0gIHZvaWQgKmFkZHIsICpyZXN1bHQ9TlVMTDsKLSAgYWRkciA9IEZES2NhbGxvYygxLCBzaXplICsgYWxpZ25tZW50ICsgc2l6ZW9mKHZvaWQqKSk7ICAgICAgICAgICAgICAgLyogTWFsbG9jIGFuZCBjbGVhciBtZW1vcnkuICAgICAgICAgKi8KK3ZvaWQgKkZES2FhbGxvYyhjb25zdCBVSU5UIHNpemUsIGNvbnN0IFVJTlQgYWxpZ25tZW50KSB7CisgIHZvaWQgKmFkZHIsICpyZXN1bHQgPSBOVUxMOworICBhZGRyID0gRkRLY2FsbG9jKDEsIHNpemUgKyBhbGlnbm1lbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVClzaXplb2Yodm9pZCAqKSk7IC8qIE1hbGxvYyBhbmQgY2xlYXIgbWVtb3J5LiAqLwogCi0gIGlmIChhZGRyIT1OVUxMKQotICB7Ci0gICAgcmVzdWx0ID0gQUxJR05fUFRSKCh1bnNpZ25lZCBjaGFyKilhZGRyICsgc2l6ZW9mKHZvaWQqKSk7ICAgIC8qIEdldCBhbGlnbmVkIG1lbW9yeSBiYXNlIGFkZHJlc3MuICovCi0gICAgKigoKHZvaWQqKilyZXN1bHQpIC0gMSkgPSBhZGRyOyAgICAgICAgICAgICAgICAvKiBTYXZlIG1hbGxvYydlZCBtZW1vcnkgcG9pbnRlci4gICAqLworICBpZiAoYWRkciAhPSBOVUxMKSB7CisgICAgcmVzdWx0ID0gQUxJR05fUFRSKCh1bnNpZ25lZCBjaGFyICopYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2b2lkICopKTsgLyogR2V0IGFsaWduZWQgbWVtb3J5IGJhc2UgYWRkcmVzcy4gKi8KKyAgICAqKCgodm9pZCAqKilyZXN1bHQpIC0gMSkgPSBhZGRyOyAgICAvKiBTYXZlIG1hbGxvYydlZCBtZW1vcnkgcG9pbnRlci4gICAqLworICAgIENfQUxMT0NfQUxJR05FRF9SRUdJU1RFUihyZXN1bHQsIHNpemUpOwogICB9CiAKLSAgcmV0dXJuIHJlc3VsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gYWxpZ25lZCBhZGRyZXNzLiAgICAgICAgICAqLworICByZXR1cm4gcmVzdWx0OyAvKiBSZXR1cm4gYWxpZ25lZCBhZGRyZXNzLiAgICAgICAgICAqLwogfQotI2VuZGlmCiAKLSNpZm5kZWYgRlVOQ1RJT05fRkRLYWZyZWUKLXZvaWQgIEZES2FmcmVlICh2b2lkICpwdHIpCi17Cit2b2lkIEZES2FmcmVlKHZvaWQgKnB0cikgewogICB2b2lkICphZGRyOwotICBhZGRyID0gKigoKHZvaWQqKilwdHIpLTEpOyAvKiBHZXQgcG9pbnRlciB0byBtYWxsb2MnZWQgbWVtb3J5LiAqLwotICBGREtmcmVlKGFkZHIpOyAgICAgICAgICAgICAgICAvKiBGcmVlIG1hbGxvYydlZCBtZW1vcnkgYXJlYS4gICAgICAqLworICBhZGRyID0gKigoKHZvaWQgKiopcHRyKSAtIDEpOyAvKiBHZXQgcG9pbnRlciB0byBtYWxsb2MnZWQgbWVtb3J5LiAqLworCisgIENfQUxMT0NfQUxJR05FRF9VTlJFR0lTVEVSKHB0cik7CisKKyAgRkRLZnJlZShhZGRyKTsgLyogRnJlZSBtYWxsb2MnZWQgbWVtb3J5IGFyZWEuICAgICAgKi8KIH0KLSNlbmRpZgotCi0KLSNpZm5kZWYgRlVOQ1RJT05fRkRLY2FsbG9jX0wKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKICAqIERBVEEgTUVNT1JZIEwxL0wyIChmYWxsYmFjaykKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKICAqIEZES2NhbGxvY19MCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgKkZES2NhbGxvY19MKGNvbnN0IFVJTlQgZGltLCBjb25zdCBVSU5UIHNpemUsIE1FTU9SWV9TRUNUSU9OIHMpCi17Ci0gIGludCBhX3NpemU7Ci0KLSAgaWYgKHMgPT0gU0VDVF9EQVRBX0VYVEVSTikKLSAgICBnb3RvIGZhbGxiYWNrOwotCi0gIGFfc2l6ZSA9ICgoZGltKnNpemUrMykmMHhmZmZmZmZmYyk7IC8qIGZvcmNlIDQgYnl0ZSBhbGlnbm1lbnQgKDExMTEgLi4uLiAxMTExIDExMDApICovCi0KLQotCi0KLQotICAvL3ByaW50ZigiV2FybmluZywgb3V0IG9mIGludGVybmFsIG1lbW9yeVxuIik7Ci0KLWZhbGxiYWNrOgordm9pZCAqRkRLY2FsbG9jX0woY29uc3QgVUlOVCBkaW0sIGNvbnN0IFVJTlQgc2l6ZSwgTUVNT1JZX1NFQ1RJT04gcykgewogICByZXR1cm4gRkRLY2FsbG9jKGRpbSwgc2l6ZSk7CiB9Ci0jZW5kaWYgLyogRlVOQ1RJT05fRkRLY2FsbG9jX0wgKi8KIAotI2lmbmRlZiBGVU5DVElPTl9GREtmcmVlX0wKLXZvaWQgIEZES2ZyZWVfTCAodm9pZCAqcCkKLXsKK3ZvaWQgRkRLZnJlZV9MKHZvaWQgKnApIHsgRkRLZnJlZShwKTsgfQogCi0gICAgRkRLZnJlZShwKTsKLX0KLSNlbmRpZiAvKiBGVU5DVElPTl9GREtmcmVlX0wgKi8KK3ZvaWQgKkZES2FhbGxvY19MKGNvbnN0IFVJTlQgc2l6ZSwgY29uc3QgVUlOVCBhbGlnbm1lbnQsIE1FTU9SWV9TRUNUSU9OIHMpIHsKKyAgdm9pZCAqYWRkciwgKnJlc3VsdCA9IE5VTEw7CisgIGFkZHIgPSBGREtjYWxsb2NfTCgxLCBzaXplICsgYWxpZ25tZW50ICsgKFVJTlQpc2l6ZW9mKHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAgICBzKTsgLyogTWFsbG9jIGFuZCBjbGVhciBtZW1vcnkuICAgICAgICAgKi8KIAotI2lmbmRlZiBGVU5DVElPTl9GREthYWxsb2NfTAotdm9pZCAqRkRLYWFsbG9jX0woY29uc3QgVUlOVCBzaXplLCBjb25zdCBVSU5UIGFsaWdubWVudCwgTUVNT1JZX1NFQ1RJT04gcykKLXsKLSAgdm9pZCAqYWRkciwgKnJlc3VsdD1OVUxMOwotICBhZGRyID0gRkRLY2FsbG9jX0woMSwgc2l6ZSArIGFsaWdubWVudCArIHNpemVvZih2b2lkKiksIHMpOyAgICAgICAvKiBNYWxsb2MgYW5kIGNsZWFyIG1lbW9yeS4gICAgICAgICAqLwotCi0gIGlmIChhZGRyIT1OVUxMKQotICB7Ci0gICAgcmVzdWx0ID0gQUxJR05fUFRSKCh1bnNpZ25lZCBjaGFyICopYWRkciArIHNpemVvZih2b2lkKikpOyAgICAvKiBHZXQgYWxpZ25lZCBtZW1vcnkgYmFzZSBhZGRyZXNzLiAqLwotICAgICooKCh2b2lkKiopcmVzdWx0KSAtIDEpID0gYWRkcjsgICAgICAgICAgICAgICAgLyogU2F2ZSBtYWxsb2MnZWQgbWVtb3J5IHBvaW50ZXIuICAgKi8KKyAgaWYgKGFkZHIgIT0gTlVMTCkgeworICAgIHJlc3VsdCA9IEFMSUdOX1BUUigodW5zaWduZWQgY2hhciAqKWFkZHIgKworICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSk7IC8qIEdldCBhbGlnbmVkIG1lbW9yeSBiYXNlIGFkZHJlc3MuICovCisgICAgKigoKHZvaWQgKiopcmVzdWx0KSAtIDEpID0gYWRkcjsgICAgLyogU2F2ZSBtYWxsb2MnZWQgbWVtb3J5IHBvaW50ZXIuICAgKi8KKyAgICBDX0FMTE9DX0FMSUdORURfUkVHSVNURVIocmVzdWx0LCBzaXplKTsKICAgfQogCi0gIHJldHVybiByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIGFsaWduZWQgYWRkcmVzcy4gICAgICAgICAgKi8KKyAgcmV0dXJuIHJlc3VsdDsgLyogUmV0dXJuIGFsaWduZWQgYWRkcmVzcy4gICAgICAgICAgKi8KIH0KLSNlbmRpZgogCi0jaWZuZGVmIEZVTkNUSU9OX0ZES2FmcmVlX0wKLXZvaWQgIEZES2FmcmVlX0wgKHZvaWQgKnB0cikKLXsKK3ZvaWQgRkRLYWZyZWVfTCh2b2lkICpwdHIpIHsKICAgdm9pZCAqYWRkcjsKIAotICBhZGRyID0gKigoKHZvaWQqKilwdHIpLTEpOyAvKiBHZXQgcG9pbnRlciB0byBtYWxsb2MnZWQgbWVtb3J5LiAqLwotICBGREtmcmVlX0woYWRkcik7ICAgICAgICAgICAgICAgIC8qIEZyZWUgbWFsbG9jJ2VkIG1lbW9yeSBhcmVhLiAgICAgICovCisgIGFkZHIgPSAqKCgodm9pZCAqKilwdHIpIC0gMSk7IC8qIEdldCBwb2ludGVyIHRvIG1hbGxvYydlZCBtZW1vcnkuICovCisKKyAgQ19BTExPQ19BTElHTkVEX1VOUkVHSVNURVIocHRyKTsKKworICBGREtmcmVlX0woYWRkcik7IC8qIEZyZWUgbWFsbG9jJ2VkIG1lbW9yeSBhcmVhLiAgICAgICovCiB9Ci0jZW5kaWYKLQotCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGVU5DVElPTjogICAgRkRLbWVtY3B5CiAgKiBERVNDUklQVElPTjogLSBjb3BpZXMgbWVtb3J5IGZyb20gInNyYyIgdG8gImRzdCIgd2l0aCBsZW5ndGggInNpemUiIGJ5dGVzCiAgKiAgICAgICAgICAgICAgLSBjb21waWxlZCB3aXRoIEZES19ERUJVRyB3aWxsIGdpdmUgeW91IHdhcm5pbmdzCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZES21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgY29uc3QgVUlOVCBzaXplKQotewordm9pZCBGREttZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIGNvbnN0IFVJTlQgc2l6ZSkgeworICAvKiAtLSBjaGVjayBmb3Igb3ZlcmxhcHBpbmcgbWVtb3J5IGFyZWFzIC0tICovCisgIEZES19BU1NFUlQoKChjb25zdCB1bnNpZ25lZCBjaGFyICopZHN0IC0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzcmMpID49CisgICAgICAgICAgICAgICAgIChwdHJkaWZmX3Qpc2l6ZSB8fAorICAgICAgICAgICAgICgoY29uc3QgdW5zaWduZWQgY2hhciAqKXNyYyAtIChjb25zdCB1bnNpZ25lZCBjaGFyICopZHN0KSA+PQorICAgICAgICAgICAgICAgICAocHRyZGlmZl90KXNpemUpOwogCiAgIC8qIGRvIHRoZSBjb3B5ICovCiAgIG1lbWNweShkc3QsIHNyYywgc2l6ZSk7CiB9CiAKLXZvaWQgRkRLbWVtbW92ZSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgY29uc3QgVUlOVCBzaXplKSAgICAgeyBtZW1tb3ZlKGRzdCwgc3JjLCBzaXplKTsgfQotdm9pZCBGREttZW1zZXQodm9pZCAqbWVtUHRyLCBjb25zdCBJTlQgdmFsdWUsIGNvbnN0IFVJTlQgc2l6ZSkgICB7IG1lbXNldChtZW1QdHIsIHZhbHVlLCBzaXplKTsgfQotdm9pZCBGREttZW1jbGVhcih2b2lkICptZW1QdHIsIGNvbnN0IFVJTlQgc2l6ZSkgICAgICAgICAgICAgICAgICB7IEZES21lbXNldChtZW1QdHIsMCxzaXplKTsgfQotVUlOVCBGREtzdHJsZW4oY29uc3QgY2hhciAqcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAoVUlOVClzdHJsZW4ocyk7IH0KK3ZvaWQgRkRLbWVtbW92ZSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgY29uc3QgVUlOVCBzaXplKSB7CisgIG1lbW1vdmUoZHN0LCBzcmMsIHNpemUpOworfQorCit2b2lkIEZES21lbXNldCh2b2lkICptZW1QdHIsIGNvbnN0IElOVCB2YWx1ZSwgY29uc3QgVUlOVCBzaXplKSB7CisgIG1lbXNldChtZW1QdHIsIHZhbHVlLCBzaXplKTsKK30KKwordm9pZCBGREttZW1jbGVhcih2b2lkICptZW1QdHIsIGNvbnN0IFVJTlQgc2l6ZSkgeyBGREttZW1zZXQobWVtUHRyLCAwLCBzaXplKTsgfQorCitVSU5UIEZES3N0cmxlbihjb25zdCBjaGFyICpzKSB7IHJldHVybiAoVUlOVClzdHJsZW4ocyk7IH0KIAogLyogQ29tcGFyZSBmdW5jdGlvbiB3cmFwcGVycyAqLwotSU5UIEZES21lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIGNvbnN0IFVJTlQgc2l6ZSkgIHsgcmV0dXJuIG1lbWNtcChzMSwgczIsIHNpemUpOyB9Ci1JTlQgRkRLc3RyY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc3RyY21wKHMxLCBzMik7IH0KLUlOVCBGREtzdHJuY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgVUlOVCBzaXplKSB7IHJldHVybiBzdHJuY21wKHMxLCBzMiwgc2l6ZSk7IH0KK0lOVCBGREttZW1jbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBjb25zdCBVSU5UIHNpemUpIHsKKyAgcmV0dXJuIG1lbWNtcChzMSwgczIsIHNpemUpOworfQorSU5UIEZES3N0cmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpIHsgcmV0dXJuIHN0cmNtcChzMSwgczIpOyB9CitJTlQgRkRLc3RybmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IFVJTlQgc2l6ZSkgeworICByZXR1cm4gc3RybmNtcChzMSwgczIsIHNpemUpOworfQogCitpbnQgSVNfTElUVExFX0VORElBTih2b2lkKSB7CisgIGludCBfX2R1bW15ID0gMTsKKyAgcmV0dXJuICgqKChVQ0hBUiAqKSgmKF9fZHVtbXkpKSkpOworfQogCi0vKiBNYXRoIGZ1bmN0aW9uIHdyYXBwZXJzLiBPbmx5IGludGVuZGVkIGZvciBjb21wYXRpYmlsaXR5LCBub3QgdG8gYmUgaGlnaGx5IG9wdGltaXplZC4gKi8KLQotSU5UIEZES2FicyhJTlQgaikgeyByZXR1cm4gYWJzKGopOyB9Ci1kb3VibGUgRkRLZmFicyhkb3VibGUgeCkgeyByZXR1cm4gZmFicyh4KTsgfQotZG91YmxlIEZES3Bvdyhkb3VibGUgeCwgZG91YmxlIHkpIHsgcmV0dXJuIHBvdyh4LHkpOyB9Ci1kb3VibGUgRkRLc3FydChkb3VibGUgeCkgeyByZXR1cm4gc3FydCh4KTsgfQotZG91YmxlIEZES2F0YW4oZG91YmxlIHgpIHsgcmV0dXJuIGF0YW4oeCk7IH0KLWRvdWJsZSBGREtsb2coZG91YmxlIHgpIHsgcmV0dXJuIGxvZyh4KTsgfQotZG91YmxlIEZES3Npbihkb3VibGUgeCkgeyByZXR1cm4gc2luKHgpOyB9Ci1kb3VibGUgRkRLY29zKGRvdWJsZSB4KSB7IHJldHVybiBjb3MoeCk7IH0KLWRvdWJsZSBGREtleHAoZG91YmxlIHgpIHsgcmV0dXJuIGV4cCh4KTsgfQotZG91YmxlIEZES2F0YW4yKGRvdWJsZSB5LCBkb3VibGUgeCkgeyByZXR1cm4gYXRhbjIoeSwgeCk7IH0KLWRvdWJsZSBGREthY29zKGRvdWJsZSB4KSB7IHJldHVybiBhY29zKHgpOyB9Ci1kb3VibGUgRkRLdGFuKGRvdWJsZSB4KSB7IHJldHVybiB0YW4oeCk7IH0KLWRvdWJsZSBGREtmbG9vcihkb3VibGUgeCkgeyByZXR1cm4gZmxvb3IoeCk7IH0KLWRvdWJsZSBGREtjZWlsKGRvdWJsZSB4KSB7IHJldHVybiBjZWlsKHgpOyB9Ci0KLUlOVCAgIEZES2F0b2koY29uc3QgY2hhciAqbnB0cikgeyByZXR1cm4gYXRvaShucHRyKTsgfQotbG9uZyAgRkRLYXRvbChjb25zdCBjaGFyICpucHRyKSB7IHJldHVybiBhdG9sKG5wdHIpOyB9Ci1mbG9hdCBGREthdG9mKGNvbnN0IGNoYXIgKm5wdHIpIHsgcmV0dXJuIChmbG9hdClhdG9mKG5wdHIpOyB9Ci0KK1VJTlQgVE9fTElUVExFX0VORElBTihVSU5UIHZhbCkgeworICByZXR1cm4gSVNfTElUVExFX0VORElBTigpCisgICAgICAgICAgICAgPyB2YWwKKyAgICAgICAgICAgICA6ICgoKHZhbCAmIDB4ZmYpIDw8IDI0KSB8ICgodmFsICYgMHhmZjAwKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgKCh2YWwgJiAweGZmMDAwMCkgPj4gOCkgfCAoKHZhbCAmIDB4ZmYwMDAwMDApID4+IDI0KSk7Cit9CiAKIC8qID09PT09PT09PT09PT09PT09PT09IEZJTEUgSS9PID09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2lmICFkZWZpbmVkKEZVTkNUSU9OX0ZES2ZvcGVuKQotRkRLRklMRSAqRkRLZm9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpIHsgcmV0dXJuIGZvcGVuKGZpbGVuYW1lLCBtb2RlKTsgfQotI2VuZGlmCi0jaWYgIWRlZmluZWQoRlVOQ1RJT05fRkRLZmNsb3NlKQotSU5UIEZES2ZjbG9zZShGREtGSUxFICpmcCkgeyByZXR1cm4gZmNsb3NlKChGSUxFKilmcCk7fQotI2VuZGlmCi0jaWYgIWRlZmluZWQoRlVOQ1RJT05fRkRLZnNlZWspCi1JTlQgRkRLZnNlZWsoRkRLRklMRSAqZnAsIExPTkcgT0ZGU0VULCBpbnQgV0hFTkNFKSB7IHJldHVybiBmc2VlaygoRklMRSopZnAsIE9GRlNFVCwgV0hFTkNFKTt9Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChGVU5DVElPTl9GREtmdGVsbCkKLUlOVCBGREtmdGVsbChGREtGSUxFICpmcCkgeyByZXR1cm4gZnRlbGwoKEZJTEUqKWZwKTsgfQotI2VuZGlmCi0jaWYgIWRlZmluZWQoRlVOQ1RJT05fRkRLZmZsdXNoKQotSU5UIEZES2ZmbHVzaChGREtGSUxFICpmcCkgeyByZXR1cm4gZmZsdXNoKChGSUxFKilmcCk7IH0KLSNlbmRpZgorRkRLRklMRSAqRkRLZm9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpIHsKKyAgcmV0dXJuIGZvcGVuKGZpbGVuYW1lLCBtb2RlKTsKK30KK0lOVCBGREtmY2xvc2UoRkRLRklMRSAqZnApIHsgcmV0dXJuIGZjbG9zZSgoRklMRSAqKWZwKTsgfQorSU5UIEZES2ZzZWVrKEZES0ZJTEUgKmZwLCBMT05HIE9GRlNFVCwgaW50IFdIRU5DRSkgeworICByZXR1cm4gZnNlZWsoKEZJTEUgKilmcCwgT0ZGU0VULCBXSEVOQ0UpOworfQorSU5UIEZES2Z0ZWxsKEZES0ZJTEUgKmZwKSB7IHJldHVybiBmdGVsbCgoRklMRSAqKWZwKTsgfQorSU5UIEZES2ZmbHVzaChGREtGSUxFICpmcCkgeyByZXR1cm4gZmZsdXNoKChGSUxFICopZnApOyB9CiBjb25zdCBJTlQgRkRLU0VFS19TRVQgPSBTRUVLX1NFVDsKIGNvbnN0IElOVCBGREtTRUVLX0NVUiA9IFNFRUtfQ1VSOwogY29uc3QgSU5UIEZES1NFRUtfRU5EID0gU0VFS19FTkQ7CiAKLSNpZiAhZGVmaW5lZChGVU5DVElPTl9GREtmd3JpdGUpCi1VSU5UIEZES2Z3cml0ZSh2b2lkICpwdHJmLCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApIHsgcmV0dXJuIGZ3cml0ZShwdHJmLCBzaXplLCBubWVtYiwgKEZJTEUqKWZwKTsgfQotI2VuZGlmCi0jaWYgIWRlZmluZWQoRlVOQ1RJT05fRkRLZnJlYWQpCi1VSU5UIEZES2ZyZWFkKHZvaWQgKmRzdCwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKSB7IHJldHVybiBmcmVhZChkc3QsIHNpemUsIG5tZW1iLCAoRklMRSopZnApOyB9Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChGVU5DVElPTl9GREtmZ2V0cykKLWNoYXIqIEZES2ZnZXRzKHZvaWQgKmRzdCwgSU5UIHNpemUsIEZES0ZJTEUgKmZwKSB7IHJldHVybiBmZ2V0cygoY2hhciAqKWRzdCwgc2l6ZSwgKEZJTEUqKWZwKTsgfQotI2VuZGlmCi0jaWYgIWRlZmluZWQoRlVOQ1RJT05fRkRLcmV3aW5kKQotdm9pZCBGREtyZXdpbmQoRkRLRklMRSAqZnApIHsgRkRLZnNlZWsoKEZJTEUqKWZwLDAsRkRLU0VFS19TRVQpOyB9Ci0jZW5kaWYKLQotCi1VSU5UIEZES2Z3cml0ZV9FTCh2b2lkICpwdHJmLCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApIHsKLQotICAgIGlmIChJU19MSVRUTEVfRU5ESUFOKCkpIHsKLSAgICAgIEZES2Z3cml0ZShwdHJmLCBzaXplLCBubWVtYiwgZnApOwotICAgIH0gZWxzZSB7Ci0gICAgICBVSU5UIG47Ci0gICAgICBJTlQgczsKLQotICAgICAgVUNIQVIgKnB0ciA9IChVQ0hBUiopIHB0cmY7Ci0KLSAgICAgIGZvciAobj0wOyBuPG5tZW1iOyBuKyspIHsKLSAgICAgICAgZm9yIChzPXNpemUtMTsgcz49MDsgcy0tKSB7Ci0gICAgICAgICAgLy9GREtwcmludGYoImNoYXIgPSAlY1xuIiwgKGNoYXIpKihwdHIrcykpOwotICAgICAgICAgIEZES2Z3cml0ZShwdHIgKyBzLCAxLCAxLCBmcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHRyID0gcHRyICsgc2l6ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5tZW1iOworVUlOVCBGREtmd3JpdGUoY29uc3Qgdm9pZCAqcHRyZiwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKSB7CisgIHJldHVybiAoVUlOVClmd3JpdGUocHRyZiwgc2l6ZSwgbm1lbWIsIChGSUxFICopZnApOwogfQorVUlOVCBGREtmcmVhZCh2b2lkICpkc3QsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCkgeworICByZXR1cm4gKFVJTlQpZnJlYWQoZHN0LCBzaXplLCBubWVtYiwgKEZJTEUgKilmcCk7Cit9CitjaGFyICpGREtmZ2V0cyh2b2lkICpkc3QsIElOVCBzaXplLCBGREtGSUxFICpmcCkgeworICByZXR1cm4gZmdldHMoKGNoYXIgKilkc3QsIHNpemUsIChGSUxFICopZnApOworfQordm9pZCBGREtyZXdpbmQoRkRLRklMRSAqZnApIHsgRkRLZnNlZWsoKEZJTEUgKilmcCwgMCwgRkRLU0VFS19TRVQpOyB9CiAKK1VJTlQgRkRLZndyaXRlX0VMKGNvbnN0IHZvaWQgKnB0cmYsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCkgeworICBpZiAoSVNfTElUVExFX0VORElBTigpKSB7CisgICAgRkRLZndyaXRlKHB0cmYsIHNpemUsIG5tZW1iLCBmcCk7CisgIH0gZWxzZSB7CisgICAgVUlOVCBuOworICAgIElOVCBzOworCisgICAgY29uc3QgVUNIQVIgKnB0ciA9IChjb25zdCBVQ0hBUiAqKXB0cmY7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbm1lbWI7IG4rKykgeworICAgICAgZm9yIChzID0gc2l6ZSAtIDE7IHMgPj0gMDsgcy0tKSB7CisgICAgICAgIEZES2Z3cml0ZShwdHIgKyBzLCAxLCAxLCBmcCk7CisgICAgICB9CisgICAgICBwdHIgPSBwdHIgKyBzaXplOworICAgIH0KKyAgfQorICByZXR1cm4gbm1lbWI7Cit9CiAKIFVJTlQgRkRLZnJlYWRfRUwodm9pZCAqZHN0LCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApIHsKICAgVUlOVCBuLCBzMCwgczEsIGVycjsKQEAgLTQzNiw5ICszNzAsOCBAQAogCiAgIC8qIEVuZm9yY2UgYWxpZ25tZW50IG9mIDI0IGJpdCBkYXRhLiAqLwogICBpZiAoc2l6ZSA9PSAzKSB7Ci0gICAgcHRyID0gKFVDSEFSKilkc3Q7Ci0gICAgZXJyID0gMDsKLSAgICBmb3IgKG49MDsgbjxubWVtYjsgbisrKSB7CisgICAgcHRyID0gKFVDSEFSICopZHN0OworICAgIGZvciAobiA9IDA7IG4gPCBubWVtYjsgbisrKSB7CiAgICAgICBpZiAoKGVyciA9IEZES2ZyZWFkKHRtcDI0LCAxLCAzLCBmcCkpICE9IDMpIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgIH0KQEAgLTQ2MCw5ICszOTMsOSBAQAogICAgIH0KICAgfQogICBpZiAoIUlTX0xJVFRMRV9FTkRJQU4oKSAmJiBzaXplID4gMSkgewotICAgIHB0ciA9IChVQ0hBUiopZHN0OwotICAgIGZvciAobj0wOyBuPG5tZW1iOyBuKyspIHsKLSAgICAgIGZvciAoczA9MCwgczE9c2l6ZS0xOyBzMCA8IHMxOyBzMCsrLCBzMS0tKSB7CisgICAgcHRyID0gKFVDSEFSICopZHN0OworICAgIGZvciAobiA9IDA7IG4gPCBubWVtYjsgbisrKSB7CisgICAgICBmb3IgKHMwID0gMCwgczEgPSBzaXplIC0gMTsgczAgPCBzMTsgczArKywgczEtLSkgewogICAgICAgICB0bXAgPSBwdHJbczBdOwogICAgICAgICBwdHJbczBdID0gcHRyW3MxXTsKICAgICAgICAgcHRyW3MxXSA9IHRtcDsKQEAgLTQ3MywyNCArNDA2LDE0IEBACiAgIHJldHVybiBlcnI7CiB9CiAKLUlOVCBGREtmZW9mKEZES0ZJTEUgKmZwKSB7IHJldHVybiBmZW9mKChGSUxFKilmcCk7IH0KK0lOVCBGREtmZW9mKEZES0ZJTEUgKmZwKSB7IHJldHVybiBmZW9mKChGSUxFICopZnApOyB9CiAKIC8qIEdsb2JhbCBpbml0aWFsaXphdGlvbi9jbGVhbnVwICovCiAKLSNpZiBkZWZpbmVkKF9ERUJVRykgJiYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICNkZWZpbmUgX0NSVERCR19NQVBfQUxMT0MKLSAgI2luY2x1ZGUgPGNydGRiZy5oPgotI2VuZGlmCi0KLQotCi0KLXZvaWQgRkRLcHJpbnREaXNjbGFpbWVyKHZvaWQpCi17Cit2b2lkIEZES3ByaW50RGlzY2xhaW1lcih2b2lkKSB7CiAgIEZES3ByaW50ZigKLSAgIlRoaXMgcHJvZ3JhbSBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhdyBhbmQgaW50ZXJuYXRpb25hbCB0cmVhdGllcy5cbiIgIFwKLSAgIkFueSByZXByb2R1Y3Rpb24gb3IgZGlzdHJpYnV0aW9uIG9mIHRoaXMgcHJvZ3JhbSwgb3IgYW55IHBvcnRpb25cbiIgICAgICAgIFwKLSAgIm9mIGl0LCBtYXkgcmVzdWx0IGluIHNldmVyZSBjaXZpbCBhbmQgY3JpbWluYWwgcGVuYWx0aWVzLCBhbmQgd2lsbCBiZVxuIiAgIFwKLSAgInByb3NlY3V0ZWQgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdy5cblxuIik7CisgICAgICAiVGhpcyBwcm9ncmFtIGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3IGFuZCBpbnRlcm5hdGlvbmFsIHRyZWF0aWVzLlxuIgorICAgICAgIkFueSByZXByb2R1Y3Rpb24gb3IgZGlzdHJpYnV0aW9uIG9mIHRoaXMgcHJvZ3JhbSwgb3IgYW55IHBvcnRpb25cbiIKKyAgICAgICJvZiBpdCwgbWF5IHJlc3VsdCBpbiBzZXZlcmUgY2l2aWwgYW5kIGNyaW1pbmFsIHBlbmFsdGllcywgYW5kIHdpbGwgYmVcbiIKKyAgICAgICJwcm9zZWN1dGVkIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcuXG5cbiIpOwogfQotCmRpZmYgLS1naXQgYS9saWJTWVMvc3JjL2xpbnV4L0ZES19zdGFja2xvYWRfbGludXguY3BwIGIvbGliU1lTL3NyYy9saW51eC9GREtfc3RhY2tsb2FkX2xpbnV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmYTlhYi4uMDAwMDAwMAotLS0gYS9saWJTWVMvc3JjL2xpbnV4L0ZES19zdGFja2xvYWRfbGludXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgotICAgRGVzY3JpcHRpb246IFN0YWNrIGNvbnN1bXB0aW9uIGluZm9ybWF0aW9uIGdhdGhlcmluZy4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9saWJTWVMvc3JjL2xpbnV4L2F1ZGlvX2xpbnV4LmNwcCBiL2xpYlNZUy9zcmMvbGludXgvYXVkaW9fbGludXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzViMjdiLi4wMDAwMDAwCi0tLSBhL2xpYlNZUy9zcmMvbGludXgvYXVkaW9fbGludXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3I6IE1hbnVlbCBKYW5kZXIKLSAgIERlc2NyaXB0aW9uOiBBdWRpbyBzdXBwb3J0Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbGliU1lTL3NyYy9saW51eC9jb3Jlc3VwX2xpbnV4LmNwcCBiL2xpYlNZUy9zcmMvbGludXgvY29yZXN1cF9saW51eC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNmZhODUuLjAwMDAwMDAKLS0tIGEvbGliU1lTL3NyYy9saW51eC9jb3Jlc3VwX2xpbnV4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOiBNYW51ZWwgSmFuZGVyCi0gICBEZXNjcmlwdGlvbjogU3lzdGVtIHN1cHBvcnQgcm91dGluZXMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9saWJTWVMvc3JjL2xpbnV4L2dlbmVyaWNTdGRzX2xpbnV4LmNwcCBiL2xpYlNZUy9zcmMvbGludXgvZ2VuZXJpY1N0ZHNfbGludXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTM3NWMwLi4wMDAwMDAwCi0tLSBhL2xpYlNZUy9zcmMvbGludXgvZ2VuZXJpY1N0ZHNfbGludXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKLSAgIERlc2NyaXB0aW9uOiBMaW51eCBnZW5lcmljU3RkcyAobW9zdGx5IGtlcm5lbCBTUkFNIGRyaXZlciBiaW5kaW5ncykKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qCi0gKiBOT1RFOiBpdCBtYWtlcyBvbmx5IHNlbnNlIHRvIGVuYWJsZSB0aGlzIGlmIHlvdSBhbHNvIGhhdmUgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIEdOVS9MaW51eCBrZXJuZWwgZHJpdmVyIHRvIGFjY2VzcyBmYXN0IFNSQU0uCi0gKi8KLSNpZiBkZWZpbmVkKF9fYXJtX18pIC8qIHx8IGRlZmluZWQoX19taXBzX18pICovCi0KLS8qKgotICogRUFCSSBzdGF0aWMgbGlua2luZyBwcm9ibGVtIHdvcmthcm91bmQKLSAqCi0gKiBUaGVzZSBmdW5jdGlvbiBhcmUgbm9ybWFsbHkgcHJlc2VudCBpbiBsaWJjLmEgYnV0Ci0gKiBhcHBhcmVudGx5IGNhbiBiZSBsaW5rZWQgb25seSBzdGF0aWNhbGx5LgotICogV2hpbGUgdXNpbmcgQysrIChpaXNpc29mZikgdGhhdCBpcyBhIHByb2JsZW0sCi0gKiBiZWNhdXNlIGl0IHdvbnQgd29yayAoc3RhdGljIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLSAqIGNhdXNlIHByb2JsZW1zIHdpdGggc3RhdGljIGxpbmtlZCBwcm9ncmFtcykuCi0gKiBTbyB0aGUgd29ya2Fyb3VuZCBpcyB0byBpbmNsdWRlIHRob3NlIGZ1bmN0aW9ucyBoZXJlLAotICogYmVjYXVzZSBsaWJTWVMuYSBpcyBsaW5rZWQgc3RhdGljYWxseSwgYW5kIGxpYmMgY2FuIGJlCi0gKiBsaW5rZWQgZHluYW1pY2FsbHkgYXMgdXN1YWwuCi0gKgotICogQWRkIG1vcmUgRUFCSSBmdW5jdGlvbnMgaGVyZSBpZiB5b3UgZ2V0IHVucmVzb2x2ZWQKLSAqIHN5bWJvbHMgb2YgRUFCSSBmdW5jdGlvbnMuCi0gKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotdm9pZCBfX2FlYWJpX21lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIGludCBzaXplKQotewotICBtZW1jcHkoZGVzdCwgc3JjLCBzaXplKTsKLX0KLXZvaWQgX19hZWFiaV9tZW1jcHk0KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgaW50IHNpemUpCi17Ci0gIG1lbWNweShkZXN0LCBzcmMsIHNpemUpOwotfQotdm9pZCBfX2FlYWJpX21lbW1vdmU0KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgaW50IHNpemUpCi17Ci0gIG1lbW1vdmUoZGVzdCwgc3JjLCBzaXplKTsKLX0KLXZvaWQgX19hZWFiaV9tZW1jbHIodm9pZCAqcHRyLCBpbnQgc2l6ZSkKLXsKLSAgbWVtc2V0KHB0ciwgMCwgc2l6ZSk7Ci19Ci12b2lkIF9fYWVhYmlfbWVtY2xyNCh2b2lkICpwdHIsIGludCBzaXplKQotewotICBtZW1zZXQocHRyLCAwLCBzaXplKTsKLX0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLS8qIEluY2x1ZGUgTGludXgga2VybmVsIGNvbmZpZywgb3Igc2V0IEFSQ0ggYW5kIHByb2Nlc3NvciBtYWNyb3MgZGlyZWN0bHkgKi8KLS8qCi0jZGVmaW5lIENPTkZJR19BUkNIX01YQwotI2RlZmluZSBDT05GSUdfQVJDSF9NWDI1Ci0qLwotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKLSNkZWZpbmUgS0VSTkVMX1NSQU1fU0laRSAgICAgICA2NTUzNgotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NWDMxKQotI2RlZmluZSBLRVJORUxfU1JBTV9TSVpFICAgICAgIDE2Mzg0Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX01YMjUpCi0jZGVmaW5lIEtFUk5FTF9TUkFNX1NJWkUgICAgICAxMzEwNzIKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVgzNSkKLSNkZWZpbmUgS0VSTkVMX1NSQU1fU0laRSAgICAgIDEzMTA3MgotI2Vsc2UKLSNkZWZpbmUgS0VSTkVMX1NSQU1fU0laRSAwCi0jZW5kaWYKLQotI2lmIChLRVJORUxfU1JBTV9TSVpFID4gMCkKLSNkZWZpbmUgS0VSTkVMX1NDUkFUQ0hfU0laRSAoNDA5NikKLSNkZWZpbmUgRkRLX1NDUkFUQ0hCVUZfU0laRSAoS0VSTkVMX1NDUkFUQ0hfU0laRS9zaXplb2YoSU5UKSkKLSNkZWZpbmUgREFUQV9MMV9BX1NJWkUgKEtFUk5FTF9TUkFNX1NJWkUtS0VSTkVMX1NDUkFUQ0hfU0laRSkKLQotI2RlZmluZSBSRVNPVVJDRV9zY3JhdGNoQnVmZmVyCi0jZGVmaW5lIEZVTkNUSU9OX0ZES3Byb2xvZwotI2RlZmluZSBGVU5DVElPTl9GREtlcGlsb2cKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKkwxX0RBVEFfQT1OVUxMOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKl9hPU5VTEw7Ci0KLQotI2lmZGVmIFJFU09VUkNFX3NjcmF0Y2hCdWZmZXIKLXN0YXRpYyBJTlQgKl9fc2NyYXRjaEJ1ZmZlcjsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpfX3BTY3JhdGNoQnVmZmVyID0gTlVMTDsKLSNlbmRpZgotCi0KLSNpZmRlZiBfX2xpbnV4X18KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLXN0YXRpYyBpbnQgZmQ7Ci1zdGF0aWMgaW5saW5lIHZvaWQgKiBnZXRTcmFtKHZvaWQpCi17Ci0gIHVuc2lnbmVkIGxvbmcgKnB0ciA9IE5VTEw7Ci0KLSAgLyogT3BlbiBkcml2ZXIgKi8KLSAgZmQgPSBvcGVuKCIvZGV2L3NyYW0iLCAwKTsKLSAgaWYgKGZkIDwgMCkKLSAgewotICAgIHByaW50ZigiVW5hYmxlIHRvIG9wZW4gL2Rldi9zcmFtLiBGYWxsYmFjayB0byBtYWxsb2NcbiIpOwotICAgIC8qIFNpZ25hbCAibm8gc3JhbSBkcml2ZXIgYXQgdXNlIi4gKi8KLSAgICBmZCA9IC0xOwotICAgIC8qIFJldHVybiBtYWxsb2NlZCBwb2ludGVyIChmYWxsYmFjaykgKi8KLSAgICByZXR1cm4gRkRLYWFsbG9jKEtFUk5FTF9TUkFNX1NJWkUsIDgpOwotICB9Ci0KLSAgLyogR2V0IG1lbW9yeSBtYXBwZWQgaW50byBDUFUgKHZpcnR1YWwpIGFkZHJlc3Mgc3BhY2UgKi8KLSAgcHRyID0gKHVuc2lnbmVkIGxvbmcgKiltbWFwKE5VTEwsIEtFUk5FTF9TUkFNX1NJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFLCBmZCwgMCk7Ci0gIGlmKHB0ciA9PSBNQVBfRkFJTEVEKQotICB7Ci0gICAgIHByaW50ZigiVW5hYmxlIHRvIG1tYXAoKS4gRmFsbGJhY2sgdG8gbWFsbG9jXG4iKTsKLSAgICAgLyogR2l2ZSB1cCBvbiB0aGUgc3JhbSBkcml2ZXIgKi8KLSAgICAgY2xvc2UoZmQpOwotICAgICAvKiBTaWduYWwgIm5vIHNyYW0gZHJpdmVyIGF0IHVzZSIuICovCi0gICAgIGZkID0gLTE7Ci0gICAgIC8qIFJldHVybiBtYWxsb2NlZCBwb2ludGVyIChmYWxsYmFjaykgKi8KLSAgICAgcHRyID0gKHVuc2lnbmVkIGxvbmcgKilGREthYWxsb2MoS0VSTkVMX1NSQU1fU0laRSwgOCk7Ci0gIH0KLQotCi0gIC8qIFJldHVybiBwb2ludGVyIHRvIHNyYW0gKi8KLSAgcmV0dXJuICh2b2lkKilwdHI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlU3JhbSh2b2lkKiBwdHIpCi17Ci0gIC8qIENoZWNrIGlmIHNyYW0gZHJpdmVyIGlzIGJlaW5nIHVzZWQuICovCi0gIGlmIChmZCA9PSAtMSkKLSAgewotICAgIEZES2FmcmVlKHB0cik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogVW5tYXAgbWVtb3J5ICovCi0gIG11bm1hcChwdHIsIEtFUk5FTF9TUkFNX1NJWkUpOwotICAvKiBDbG9zZSBkcml2ZXIgKi8KLSAgY2xvc2UoZmQpOwotCi0gIHJldHVybjsKLX0KLQotI2Vsc2UKLQotc3RhdGljIGlubGluZSB2b2lkICogZ2V0U3JhbSh2b2lkKQotewotICByZXR1cm4gRkRLYWFsbG9jKEtFUk5FTF9TUkFNX1NJWkUsIDgpOwotfQotc3RhdGljIGlubGluZSB2b2lkICogZnJlZVNyYW0odm9pZCogcHRyKQotewotICBGREthZnJlZShwdHIpOwotfQotCi0jZW5kaWYKLQotCi0jaWZkZWYgRlVOQ1RJT05fRkRLcHJvbG9nCi12b2lkIEZES3Byb2xvZyh2b2lkKQotewotICAgdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyKilnZXRTcmFtKCk7Ci0KLQotICAgaWYgKGFkZHIgPT0gTlVMTCkKLSAgIHsKLSAgICAgcHJpbnRmKCJTUkFNIGFsbG9jYXRpb24gZmFpbGVkICEgVGhpcyBpcyBmYXRhbC5cbiIpOwotICAgICBleGl0KC0xKTsKLSAgIH0KLQotI2lmZGVmIFJFU09VUkNFX3NjcmF0Y2hCdWZmZXIKLSAgIF9fc2NyYXRjaEJ1ZmZlciA9IChJTlQqKSAoIGFkZHIgKyAoS0VSTkVMX1NSQU1fU0laRS1LRVJORUxfU0NSQVRDSF9TSVpFKSApOwotICAgX19wU2NyYXRjaEJ1ZmZlciA9IGFkZHIgKyAoS0VSTkVMX1NSQU1fU0laRSk7Ci0jZW5kaWYKLQotICAgcHJpbnRmKCJTUkFNIEAgMHglMDh4XG4iLCAodW5zaWduZWQgaW50KSBhZGRyKTsKLSAgIGF0ZXhpdChGREtlcGlsb2cpOwotCi0gICBGREtwcm9sb2dfZ2VuZXJpYygpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBGVU5DVElPTl9GREtlcGlsb2cKLXZvaWQgRkRLZXBpbG9nKHZvaWQpCi17Ci0gICAvKiBCZWNhdXNlIG9mIGF0ZXhpdCgpLCBtYWtlIHN1cmUgdG8gY2FsbCB0aGlzIG9ubHkgb25jZSAqLwotICAgaWYgKEwxX0RBVEFfQSAhPSBOVUxMKQotICAgewotICAgICBmcmVlU3JhbShMMV9EQVRBX0EpOwotICAgICBMMV9EQVRBX0EgPSBOVUxMOwotCi0gICAgIEZES2VwaWxvZ19nZW5lcmljKCk7Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEtFUk5FTF9TUkFNID4gMCAqLwotCi0jZW5kaWYgLyogaWZkZWYgX19hcm1fXyAqLwotCmRpZmYgLS1naXQgYS9saWJTWVMvc3JjL2xpbnV4L3VhcnRfbGludXguY3BwIGIvbGliU1lTL3NyYy9saW51eC91YXJ0X2xpbnV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVlNTY5NC4uMDAwMDAwMAotLS0gYS9saWJTWVMvc3JjL2xpbnV4L3VhcnRfbGludXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3I6IE1hbnVlbCBKYW5kZXIKLSAgIERlc2NyaXB0aW9uOiBVQVJUIHN1cHBvcnQKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9saWJTWVMvc3JjL21pcHMvZ2VuZXJpY1N0ZHNfbWlwcy5jcHAgYi9saWJTWVMvc3JjL21pcHMvZ2VuZXJpY1N0ZHNfbWlwcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwOGVjNDguLjAwMDAwMDAKLS0tIGEvbGliU1lTL3NyYy9taXBzL2dlbmVyaWNTdGRzX21pcHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKLSAgIERlc2NyaXB0aW9uOgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgUkVTT1VSQ0Vfc2NyYXRjaEJ1ZmZlcgotI2RlZmluZSBGVU5DVElPTl9GREtwcm9sb2cKLSNkZWZpbmUgRlVOQ1RJT05fRkRLZXBpbG9nCi0KLSNkZWZpbmUgTUlQU19WSVJUVUFMX1NUQVJUICAoMHg4MDAwMDAwMCkKLS8qIHZhbHVlIGJlbG93IGlzIGRlZmluZWQgaW4gc2ltdWxhdG9yIGNvbmZpZyAoTWlwc01lbUludGYtezI0S0UsNEtFfS5jZmcpICovCi0jZGVmaW5lIE1JUFNfU0RFX1NDUkFUQ0hQQUQgKDB4MDAwNTgwMDApCi0KLS8vI2RlZmluZSBNSVBTX1NSQU1fU0laRSAgKDMyNzY4KQotI2RlZmluZSBNSVBTX1NSQU1fU0laRSAgKDQwOTYpCi0KLSNkZWZpbmUgTUlQU19TQ1JBVENIX1NJWkUgKDQwOTYpCi0jZGVmaW5lIERBVEFfTDFfQV9TSVpFIChNSVBTX1NSQU1fU0laRS1NSVBTX1NDUkFUQ0hfU0laRSkKLQotCi0KLQotI2lmZGVmIFJFU09VUkNFX3NjcmF0Y2hCdWZmZXIKLSNkZWZpbmUgRkRLX1NDUkFUQ0hCVUZfU0laRSAxMDI0Ci1zdGF0aWMgTE9ORyAqX19fc2NyYXRjaEJ1ZmZlciA9IE5VTEw7Ci1zdGF0aWMgTE9ORyAqX19zY3JhdGNoQnVmZmVyID0gTlVMTDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpfX3BTY3JhdGNoQnVmZmVyID0gTlVMTDsKLSNlbmRpZgotCi0KLSNpZmRlZiBfX2xpbnV4X18KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLXN0YXRpYyBpbnQgZmQ7Ci1zdGF0aWMgaW5saW5lIHZvaWQgKiBnZXRTcmFtKHZvaWQpCi17Ci0gIHVuc2lnbmVkIGxvbmcgKnB0ciA9IE5VTEw7Ci0KLSAgLyogT3BlbiBkcml2ZXIgKi8KLSAgZmQgPSBvcGVuKCIvZGV2L3NyYW0iLCAwKTsKLSAgaWYgKGZkIDwgMCkKLSAgewotICAgIHByaW50ZigiVW5hYmxlIHRvIGFjY2VzcyBzcmFtLiBGYWxsYmFjayB0byBtYWxsb2NcbiIpOwotICAgIC8qIFNpZ25hbCAibm8gc3JhbSBkcml2ZXIgYXQgdXNlIi4gKi8KLSAgICBmZCA9IC0xOwotICAgIC8qIFJldHVybiBtYWxsb2NlZCBwb2ludGVyIChmYWxsYmFjaykgKi8KLSAgICByZXR1cm4gbWFsbG9jKE1JUFNfU1JBTV9TSVpFKTsKLSAgfQotCi0gIC8qIEdldCBtZW1vcnkgbWFwcGVkIGludG8gQ1BVICh2aXJ0dWFsKSBhZGRyZXNzIHNwYWNlICovCi0gIHB0ciA9ICh1bnNpZ25lZCBsb25nICopbW1hcChOVUxMLCBNSVBTX1NSQU1fU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKLSAgaWYocHRyID09IE1BUF9GQUlMRUQpCi0gIHsKLSAgICAgcHJpbnRmKCJVbmFibGUgdG8gYWNjZXNzIHNyYW0uIEZhbGxiYWNrIHRvIG1hbGxvY1xuIik7Ci0gICAgIC8qIEdpdmUgdXAgb24gdGhlIHNyYW0gZHJpdmVyICovCi0gICAgIGNsb3NlKGZkKTsKLSAgICAgLyogU2lnbmFsICJubyBzcmFtIGRyaXZlciBhdCB1c2UiLiAqLwotICAgICBmZCA9IC0xOwotICAgICAvKiBSZXR1cm4gbWFsbG9jZWQgcG9pbnRlciAoZmFsbGJhY2spICovCi0gICAgIHB0ciA9ICh1bnNpZ25lZCBsb25nICopbWFsbG9jKE1JUFNfU1JBTV9TSVpFKTsKLSAgfQotCi0KLSAgLyogUmV0dXJuIHBvaW50ZXIgdG8gc3JhbSAqLwotICByZXR1cm4gKHZvaWQqKXB0cjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZyZWVTcmFtKHZvaWQqIHB0cikKLXsKLSAgLyogQ2hlY2sgaWYgc3JhbSBkcml2ZXIgaXMgYmVpbmcgdXNlZC4gKi8KLSAgaWYgKGZkID09IC0xKQotICB7Ci0gICAgZnJlZShwdHIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFVubWFwIG1lbW9yeSAqLwotICBtdW5tYXAocHRyLCBNSVBTX1NSQU1fU0laRSk7Ci0gIC8qIENsb3NlIGRyaXZlciAqLwotICBjbG9zZShmZCk7Ci0KLSAgcmV0dXJuOwotfQotCi0jZWxpZiBkZWZpbmVkKF9fU0RFX01JUFNfXykKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bWlwcy9jcHUuaD4KLQotc3RhdGljIGludCBoYXNJU1BSQU0sIGhhc0RTUFJBTTsKLQotc3RhdGljIGlubGluZSB2b2lkICogZ2V0U3JhbSh2b2lkKQotewotICB2b2lkICphZGRyOwotICB1bnNpZ25lZCBpbnQgQ29uZmlnOwotCi0gIENvbmZpZyA9IG1pcHNfZ2V0Y29uZmlnKCk7Ci0gIGhhc0lTUFJBTSA9IChDb25maWcgPj4gMjQpICYgMTsKLSAgaGFzRFNQUkFNID0gKENvbmZpZyA+PiAyMykgJiAxOwotCi0gIEZES3ByaW50ZigiQ29uZmlnIElTUC9EU1A6ICVkLyVkXG4iLCBoYXNJU1BSQU0sIGhhc0RTUFJBTSk7Ci0KLSAgaWYgKGhhc0RTUFJBTSkgewotICAgIGxvbmcgcGFkZHIsIGxhZGRyOwotCi0gICAgRkRLcHJpbnRmKCJ3cm9uZ1xuIik7Ci0gICAgcGFkZHIgPSBNSVBTX1NERV9TQ1JBVENIUEFEOwotICAgIC8qIEZpeGVkIG1hcHBpbmcgb2Yga3NlZzA6IDB4ODAwMDAwMDAtMHg5ZmZmZmZmZiB2aXJ0dWFsID0+IDB4MDAwMDAwMDAtMHgxZmZmZmZmZiBwaHlzaWNhbCAqLwotICAgIGxhZGRyID0gTUlQU19WSVJUVUFMX1NUQVJUICsgTUlQU19TREVfU0NSQVRDSFBBRDsKLSAgICBhZGRyID0gKHZvaWQqKShsYWRkcik7Ci0gIH0gZWxzZSB7Ci0gICAgRkRLcHJpbnRmKCJva1xuIik7Ci0gICAgYWRkciA9IG1hbGxvYyhNSVBTX1NSQU1fU0laRSk7Ci0gICAgRkRLcHJpbnRmKCJhZGRyICVkXG4iLCAoaW50KWFkZHIpOwotICB9Ci0gIHJldHVybiBhZGRyOwotfQotc3RhdGljIGlubGluZSB2b2lkIGZyZWVTcmFtKHZvaWQqIHB0cikKLXsKLSAgaWYgKCFoYXNEU1BSQU0pIHsKLSAgICBmcmVlKHB0cik7Ci0gIH0KLX0KLQotI2Vsc2UKLQotc3RhdGljIGlubGluZSB2b2lkICogZ2V0U3JhbSh2b2lkKQotewotICByZXR1cm4gbWFsbG9jKE1JUFNfU1JBTV9TSVpFKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlU3JhbSh2b2lkKiBwdHIpCi17Ci0gIGZyZWUocHRyKTsKLX0KLQotI2VuZGlmCi0KLQotI2lmZGVmIEZVTkNUSU9OX0ZES3Byb2xvZwotdm9pZCBGREtwcm9sb2codm9pZCkKLXsKLSAgIHVuc2lnbmVkIGNoYXIgKmFkZHI7Ci0KLSNpZmRlZiBfTUlQU19BUkNIX01JUFMzMlIyCi0gICB1bnNpZ25lZCBzdGF0dXM7Ci0gICBhc20gdm9sYXRpbGUoIm1mYzAgJTAsICQxMiwgMDtcbiIgOiAiPXIiIChzdGF0dXMpKTsKLSAgIHN0YXR1cyB8PSAoMSA8PCAyNCk7Ci0gICBhc20gdm9sYXRpbGUoIm10YzAgJTAsICQxMiwgMDtcbiIgOjogInIiIChzdGF0dXMpKTsKLSNlbmRpZgotCi0gICBhZGRyID0gKHVuc2lnbmVkIGNoYXIqKWdldFNyYW0oKTsKLSAgIGlmIChhZGRyID09IE5VTEwpIHsKLSAgICAgRkRLcHJpbnRmRXJyKCJTUkFNIGFsbG9jYXRpb24gZmFpbGVkICEgVGhpcyBpcyBmYXRhbC5cbiIpOwotICAgICBleGl0KC0xKTsKLSAgIH0gZWxzZSB7Ci0gICAgIEZES3ByaW50ZigiU1JBTSBAIDB4JTA4eCwgc2l6ZSA9IDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpIGFkZHIsIE1JUFNfU1JBTV9TSVpFKTsKLSAgIH0KLQotCi0jaWZkZWYgUkVTT1VSQ0Vfc2NyYXRjaEJ1ZmZlcgotICAgX19fc2NyYXRjaEJ1ZmZlciA9IChMT05HKikoYWRkciArIE1JUFNfU1JBTV9TSVpFIC0gTUlQU19TQ1JBVENIX1NJWkUpOwotI2VuZGlmCi0KLSAgIGF0ZXhpdChGREtlcGlsb2cpOwotCi0gICBGREtwcm9sb2dfZ2VuZXJpYygpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBGVU5DVElPTl9GREtlcGlsb2cKLXZvaWQgRkRLZXBpbG9nKHZvaWQpCi17Ci0KLSNpZmRlZiBfTUlQU19BUkNIX01JUFMzMlIyCi0gICB1bnNpZ25lZCBzdGF0dXM7Ci0gICBhc20gdm9sYXRpbGUoIm1mYzAgJTAsICQxMiwgMDtcbiIgOiAiPXIiIChzdGF0dXMpKTsKLSAgICAgICAgICAgc3RhdHVzICY9IH4oMSA8PCAyNCk7Ci0gICBhc20gdm9sYXRpbGUoIm10YzAgJTAsICQxMiwgMDtcbiIgOjogInIiIChzdGF0dXMpKTsKLSNlbmRpZgotCi0gICBGREtlcGlsb2dfZ2VuZXJpYygpOwotfQotI2VuZGlmCi0KLQotI2lmICFkZWZpbmVkKF9fbGludXhfXykKLQotI2RlZmluZSBGVU5DVElPTl9GREtjbG9jawotCi0jaWZuZGVmIE1JUFNfQ1BVX0NMSwotI2RlZmluZSBNSVBTX0NQVV9DTEsgMTAwMDAwMDAwCi0jZW5kaWYKLQotSU5UIEZES2Nsb2NrKHZvaWQpIHsKLSAgSU5UIGNsazsKLQotICBhc20gdm9sYXRpbGUgKCJtZmMwICUwLCQ5ICIgOiAiPXIiIChjbGspKTsKLSAgcmV0dXJuIGNsazsKLX0KLQotI2VuZGlmIC8qICFkZWZpbmVkKF9fbGludXhfXykgKi8KZGlmZiAtLWdpdCBhL2xpYlNZUy9zcmMvc3lzbGliX2NoYW5uZWxNYXBEZXNjci5jcHAgYi9saWJTWVMvc3JjL3N5c2xpYl9jaGFubmVsTWFwRGVzY3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTFmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTWVMvc3JjL3N5c2xpYl9jaGFubmVsTWFwRGVzY3IuY3BwCkBAIC0wLDAgKzEsMjg0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFN5c3RlbSBpbnRlZ3JhdGlvbiBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBUaG9tYXMgRGlldHplbgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxmaWxlICAgc3lzbGliX2NoYW5uZWxNYXBEZXNjci5jcHAKKyAqICBcYnJpZWYgIEltcGxlbWVudGF0aW9uIG9mIHJvdXRpbmVzIHRoYXQgaGFuZGxlIHRoZSBjaGFubmVsIG1hcCBkZXNjcmlwdG9yLgorICovCisKKyNpbmNsdWRlICJzeXNsaWJfY2hhbm5lbE1hcERlc2NyLmgiCisKKyNkZWZpbmUgREZMVF9DSF9NQVBfVEFCX0xFTiBcCisgICgxNSkgLyogTGVuZ3RoIG9mIHRoZSBkZWZhdWx0IGNoYW5uZWwgbWFwIGluZm8gdGFibGUuICovCisKKy8qKgorICogXGJyaWVmICBUaGUgZm9sbG93aW5nIGFycmF5cyBwcm92aWRlIGEgY2hhbm5lbCBtYXAgZm9yIGVhY2ggY2hhbm5lbCBjb25maWcgKDAKKyAqIHRvIDE0KS4KKyAqCisgKiBUaGUgaS10aCBjaGFubmVsIHdpbGwgYmUgbWFwcGVkIHRvIHRoZSBwb3N0aW9uIGFbaS0xXSsxCisgKiB3aXRoIGk+MCBhbmQgYVtdIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1hcHBpbmcgYXJyYXlzLgorICovCitzdGF0aWMgY29uc3QgVUNIQVIgbWFwRmFsbGJhY2tbXSA9IHswLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsICA5LCAgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyM307CitzdGF0aWMgY29uc3QgVUNIQVIgbWFwQ2ZnMVtdID0gezAsIDF9Oworc3RhdGljIGNvbnN0IFVDSEFSIG1hcENmZzJbXSA9IHswLCAxfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBtYXBDZmczW10gPSB7MiwgMCwgMX07CitzdGF0aWMgY29uc3QgVUNIQVIgbWFwQ2ZnNFtdID0gezIsIDAsIDEsIDN9Oworc3RhdGljIGNvbnN0IFVDSEFSIG1hcENmZzVbXSA9IHsyLCAwLCAxLCAzLCA0fTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBtYXBDZmc2W10gPSB7MiwgMCwgMSwgNCwgNSwgM307CitzdGF0aWMgY29uc3QgVUNIQVIgbWFwQ2ZnN1tdID0gezIsIDYsIDcsIDAsIDEsIDQsIDUsIDN9Oworc3RhdGljIGNvbnN0IFVDSEFSIG1hcENmZzExW10gPSB7MiwgMCwgMSwgNCwgNSwgNiwgM307CitzdGF0aWMgY29uc3QgVUNIQVIgbWFwQ2ZnMTJbXSA9IHsyLCAwLCAxLCA2LCA3LCA0LCA1LCAzfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBtYXBDZmcxM1tdID0gezIsICA2LCAgNywgIDAsICAxLCAgMTAsIDExLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgIDgsICAzLCAgOSwgIDE0LCAxMiwgMTMsIDE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTksIDE1LCAxNiwgMTcsIDIwLCAyMSwgMjIsIDIzfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBtYXBDZmcxNFtdID0gezIsIDAsIDEsIDQsIDUsIDMsIDYsIDd9OworCisvKioKKyAqIFxicmllZiAgRGVmYXVsdCB0YWJsZSBjb21wcmlzaW5nIGNoYW5uZWwgbWFwIGluZm9ybWF0aW9uIGZvciBlYWNoIGNoYW5uZWwKKyAqIGNvbmZpZyAoMCB0byAxNCkuCisgKi8KK3N0YXRpYyBjb25zdCBDSEFOTkVMX01BUF9JTkZPIG1hcEluZm9UYWJEZmx0W0RGTFRfQ0hfTUFQX1RBQl9MRU5dID0KKyAgICB7LyogY2hDZmcsICBtYXAsICAgICAgICAgbnVtQ2ggKi8KKyAgICAgLyogIDAgKi8ge21hcEZhbGxiYWNrLCAyNH0sCisgICAgIC8qICAxICovIHttYXBDZmcxLCAyfSwKKyAgICAgLyogIDIgKi8ge21hcENmZzIsIDJ9LAorICAgICAvKiAgMyAqLyB7bWFwQ2ZnMywgM30sCisgICAgIC8qICA0ICovIHttYXBDZmc0LCA0fSwKKyAgICAgLyogIDUgKi8ge21hcENmZzUsIDV9LAorICAgICAvKiAgNiAqLyB7bWFwQ2ZnNiwgNn0sCisgICAgIC8qICA3ICovIHttYXBDZmc3LCA4fSwKKyAgICAgLyogIDggKi8ge21hcEZhbGxiYWNrLCAyNH0sCisgICAgIC8qICA5ICovIHttYXBGYWxsYmFjaywgMjR9LAorICAgICAvKiAxMCAqLyB7bWFwRmFsbGJhY2ssIDI0fSwKKyAgICAgLyogMTEgKi8ge21hcENmZzExLCA3fSwKKyAgICAgLyogMTIgKi8ge21hcENmZzEyLCA4fSwKKyAgICAgLyogMTMgKi8ge21hcENmZzEzLCAyNH0sCisgICAgIC8qIDE0ICovIHttYXBDZmcxNCwgOH19OworCisvKioKKyAqIEdldCB0aGUgbWFwcGluZyB2YWx1ZSBmb3IgYSBzcGVjaWZpYyBjaGFubmVsIGFuZCBtYXAgaW5kZXguCisgKi8KK1VDSEFSIEZES19jaE1hcERlc2NyX2dldE1hcFZhbHVlKGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IqIGNvbnN0IHBNYXBEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNoSWR4LCBjb25zdCBVSU5UIG1hcElkeCkgeworICBVQ0hBUiBtYXBWYWx1ZSA9IGNoSWR4OyAvKiBQYXNzIHRocm91Z2ggYnkgZGVmYXVsdC4gKi8KKworICBGREtfQVNTRVJUKHBNYXBEZXNjciAhPSBOVUxMKTsKKworICBpZiAoKHBNYXBEZXNjci0+ZlBhc3NUaHJvdWdoID09IDApICYmIChwTWFwRGVzY3ItPnBNYXBJbmZvVGFiICE9IE5VTEwpICYmCisgICAgICAocE1hcERlc2NyLT5tYXBJbmZvVGFiTGVuID4gbWFwSWR4KSkgeyAvKiBOZXN0IHNhbml0eSBjaGVjayB0byBhdm9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgbWVtb3J5IGFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9uLiAqLworICAgIGlmIChjaElkeCA8IHBNYXBEZXNjci0+cE1hcEluZm9UYWJbbWFwSWR4XS5udW1DaGFubmVscykgeworICAgICAgbWFwVmFsdWUgPSBwTWFwRGVzY3ItPnBNYXBJbmZvVGFiW21hcElkeF0ucENoYW5uZWxNYXBbY2hJZHhdOworICAgIH0KKyAgfQorICByZXR1cm4gbWFwVmFsdWU7Cit9CisKKy8qKgorICogXGJyaWVmICBFdmFsdWF0ZSB3aGV0aGVyIHNpbmdsZSBjaGFubmVsIG1hcCBpcyByZWFzb25hYmxlIG9yIG5vdC4KKyAqCisgKiBccGFyYW0gIHBNYXBJbmZvICBQb2ludGVyIHRvIGNoYW5uZWwgbWFwLgorICogXHJldHVybiAgICAgICAgICAgVmFsdWUgdW5lcXVhbCB0byB6ZXJvIGlmIG1hcCBpcyB2YWxpZCwgb3RoZXJ3aXNlIHplcm8uCisgKi8KK3N0YXRpYyBpbnQgZmRrX2NoTWFwRGVzY3JfaXNWYWxpZE1hcChjb25zdCBDSEFOTkVMX01BUF9JTkZPKiBjb25zdCBwTWFwSW5mbykgeworICBpbnQgcmVzdWx0ID0gMTsKKyAgVUlOVCBpOworCisgIGlmIChwTWFwSW5mbyA9PSBOVUxMKSB7CisgICAgcmVzdWx0ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBVSU5UIG51bUNoYW5uZWxzID0gcE1hcEluZm8tPm51bUNoYW5uZWxzOworCisgICAgLyogQ2hlY2sgZm9yIGFsbCBtYXAgdmFsdWVzIGlmIHRoZXkgYXJlIGluc2lkZSB0aGUgcmFuZ2UgMCB0byBudW1DaGFubmVscy0xCisgICAgICogYW5kIHVuaXF1ZS4gKi8KKyAgICBpZiAobnVtQ2hhbm5lbHMgPCAzMikgeyAvKiBPcHRpbWl6ZWQgdmVyc2lvbiBmb3IgbGVzcyB0aGFuIDMyIGNoYW5uZWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZWRzIG9ubHkgb25lIGxvb3AuICovCisgICAgICBVSU5UIG1hcHBlZENoTWFzayA9IDB4MDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1DaGFubmVsczsgaSArPSAxKSB7CisgICAgICAgIG1hcHBlZENoTWFzayB8PSAxIDw8IHBNYXBJbmZvLT5wQ2hhbm5lbE1hcFtpXTsKKyAgICAgIH0KKyAgICAgIGlmIChtYXBwZWRDaE1hc2sgIT0gKCgoVUlOVCkxIDw8IG51bUNoYW5uZWxzKSAtIDEpKSB7CisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICB9CisgICAgfSBlbHNlIHsgLyogR2VuZXJhbCBjYXNlIHRoYXQgY2FuIGhhbmRsZSBhbGwgbnVtYmVyIG9mIGNoYW5uZWxzIGJ1dCBuZWVkcworICAgICAgICAgICAgICAgIG9uZSBtb3JlIGxvb3AuICovCisgICAgICBmb3IgKGkgPSAwOyAoaSA8IG51bUNoYW5uZWxzKSAmJiByZXN1bHQ7IGkgKz0gMSkgeworICAgICAgICBVSU5UIGo7CisgICAgICAgIFVDSEFSIHZhbHVlMCA9IHBNYXBJbmZvLT5wQ2hhbm5lbE1hcFtpXTsKKworICAgICAgICBpZiAodmFsdWUwID4gbnVtQ2hhbm5lbHMgLSAxKSB7IC8qIG91dCBvZiByYW5nZT8gKi8KKyAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IG51bUNoYW5uZWxzIC0gMTsgKGogPiBpKSAmJiByZXN1bHQ7IGogLT0gMSkgeworICAgICAgICAgIGlmICh2YWx1ZTAgPT0gcE1hcEluZm8tPnBDaGFubmVsTWFwW2pdKSB7IC8qIG5vdCB1bmlxdWUgKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBFdmFsdWF0ZSB3aGV0aGVyIGNoYW5uZWwgbWFwIGRlc2NyaXB0b3IgaXMgcmVhc29uYWJsZSBvciBub3QuCisgKi8KK2ludCBGREtfY2hNYXBEZXNjcl9pc1ZhbGlkKGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IqIGNvbnN0IHBNYXBEZXNjcikgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgVUlOVCBpOworCisgIGlmIChwTWFwRGVzY3IgIT0gTlVMTCkgeworICAgIHJlc3VsdCA9IDE7CisgICAgZm9yIChpID0gMDsgKGkgPCBwTWFwRGVzY3ItPm1hcEluZm9UYWJMZW4pICYmIHJlc3VsdDsgaSArPSAxKSB7CisgICAgICBpZiAoIWZka19jaE1hcERlc2NyX2lzVmFsaWRNYXAoJnBNYXBEZXNjci0+cE1hcEluZm9UYWJbaV0pKSB7CisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgY29tcGxldGUgY2hhbm5lbCBtYXAgZGVzY3JpcHRvci4KKyAqLwordm9pZCBGREtfY2hNYXBEZXNjcl9pbml0KEZES19jaGFubmVsTWFwRGVzY3IqIGNvbnN0IHBNYXBEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFOTkVMX01BUF9JTkZPKiBjb25zdCBwTWFwSW5mb1RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG1hcEluZm9UYWJMZW4sIGNvbnN0IFVJTlQgZlBhc3NUaHJvdWdoKSB7CisgIGlmIChwTWFwRGVzY3IgIT0gTlVMTCkgeworICAgIGludCB1c2VEZWZhdWx0VGFiID0gMTsKKworICAgIHBNYXBEZXNjci0+ZlBhc3NUaHJvdWdoID0gKGZQYXNzVGhyb3VnaCA9PSAwKSA/IDAgOiAxOworCisgICAgaWYgKChwTWFwSW5mb1RhYiAhPSBOVUxMKSAmJiAobWFwSW5mb1RhYkxlbiA+IDApKSB7CisgICAgICAvKiBTZXQgdGhlIHZhbGlkIGN1c3RvbSBtYXBwaW5nIHRhYmxlLiAqLworICAgICAgcE1hcERlc2NyLT5wTWFwSW5mb1RhYiA9IHBNYXBJbmZvVGFiOworICAgICAgcE1hcERlc2NyLT5tYXBJbmZvVGFiTGVuID0gbWFwSW5mb1RhYkxlbjsKKyAgICAgIC8qIFZhbGlkYXRlIHRoZSBjb21wbGV0ZSBkZXNjcmlwdG9yLiAqLworICAgICAgdXNlRGVmYXVsdFRhYiA9IChGREtfY2hNYXBEZXNjcl9pc1ZhbGlkKHBNYXBEZXNjcikgPT0gMCkgPyAxIDogMDsKKyAgICB9CisgICAgaWYgKHVzZURlZmF1bHRUYWIgIT0gMCkgeworICAgICAgLyogU2V0IGRlZmF1bHQgdGFibGUuICovCisgICAgICBwTWFwRGVzY3ItPnBNYXBJbmZvVGFiID0gbWFwSW5mb1RhYkRmbHQ7CisgICAgICBwTWFwRGVzY3ItPm1hcEluZm9UYWJMZW4gPSBERkxUX0NIX01BUF9UQUJfTEVOOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFNldCBjaGFubmVsIG1hcHBpbmcgYnlwYXNzIGZsYWcgaW4gYSBnaXZlbiBjaGFubmVsIG1hcCBkZXNjcmlwdG9yLgorICovCitpbnQgRkRLX2NoTWFwRGVzY3Jfc2V0UGFzc1Rocm91Z2goRkRLX2NoYW5uZWxNYXBEZXNjciogY29uc3QgcE1hcERlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgZlBhc3NUaHJvdWdoKSB7CisgIGludCBlcnIgPSAxOworCisgIGlmIChwTWFwRGVzY3IgIT0gTlVMTCkgeworICAgIGlmICgocE1hcERlc2NyLT5wTWFwSW5mb1RhYiAhPSBOVUxMKSAmJiAocE1hcERlc2NyLT5tYXBJbmZvVGFiTGVuID4gMCkpIHsKKyAgICAgIHBNYXBEZXNjci0+ZlBhc3NUaHJvdWdoID0gKGZQYXNzVGhyb3VnaCA9PSAwKSA/IDAgOiAxOworICAgICAgZXJyID0gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbGliU1lTL3NyYy93YXZfZmlsZS5jcHAgYi9saWJTWVMvc3JjL3dhdl9maWxlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiY2ZhYS4uMDAwMDAwMAotLS0gYS9saWJTWVMvc3JjL3dhdl9maWxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2MCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKTogICBFcmljIEFsbGFtYW5jaGUKLSAgIERlc2NyaXB0aW9uOiBhIHJ1ZGltZW50YXJ5IHdhdiBmaWxlIGludGVyZmFjZQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi0jaW5jbHVkZSAid2F2X2ZpbGUuaCIKLSNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgotCi0KLXN0YXRpYyBJTlRfUENNIHVsYXcycGNtIChVQ0hBUiB1bGF3Ynl0ZSk7Ci0KLS8qIQotICoKLSAqICBcYnJpZWYgUmVhZCBoZWFkZXIgZnJvbSBhIFdBVkVmaWxlLiBIb3N0IGVuZGlhbmVzcyBpcyBoYW5kbGVkIGFjY29yZGluZ2x5LgotICogIFx3YXYtPmZwIGZpbGVwb2ludGVyIG9mIHR5cGUgRklMRSouCi0gKiAgXHdhdmluZm8gU1dhdkluZm8gc3RydWN0IHdoZXJlIHRoZSBkZWNvZGVkIGhlYWRlciBpbmZvIGlzIHN0b3JlZCBpbnRvLgotICogIFxyZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCBub24temVybyBvbiBmYWlsdXJlLgotICoKLSAqLwotSU5UIFdBVl9JbnB1dE9wZW4gKEhBTkRMRV9XQVYgKnBXYXYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIEhBTkRMRV9XQVYgd2F2ID0gKEhBTkRMRV9XQVYpRkRLY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgV0FWKSk7Ci0gICAgSU5UIG9mZnNldDsKLQotICAgIGlmICh3YXYgPT0gTlVMTCkgewotICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IFVuYWJsZSB0byBhbGxvY2F0ZSBXQVYgc3RydWN0LlxuIik7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIHdhdi0+ZnAgPSBGREtmb3BlbihmaWxlbmFtZSwgInJiIik7Ci0gICAgaWYgKHdhdi0+ZnAgPT0gTlVMTCkgewotICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IFVuYWJsZSB0byBvcGVuIHdhdiBmaWxlLiAlc1xuIiwgZmlsZW5hbWUpOwotICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKiByZWFkIFJJRkYtY2h1bmsgKi8KLSAgICBpZiAoRkRLZnJlYWQoJih3YXYtPmhlYWRlci5yaWZmVHlwZSksIDEsIDQsIHdhdi0+ZnApICE9IDQpIHsKLSAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBjb3VsZG4ndCByZWFkIFJJRkZfSURcbiIpOwotICAgICAgZ290byBlcnJvcjsgIC8qIGJhZCBlcnJvciAiY291bGRuJ3QgcmVhZCBSSUZGX0lEIiAqLwotICAgIH0KLSAgICBpZiAoRkRLc3RybmNtcCgiUklGRiIsIHdhdi0+aGVhZGVyLnJpZmZUeXBlLCA0KSkgewotICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IFJJRkYgZGVzY3JpcHRvciBub3QgZm91bmQuXG4iKSA7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8qIFJlYWQgUklGRiBzaXplLiBJZ25vcmVkLiAqLwotICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIucmlmZlNpemUpLCA0LCAxLCB3YXYtPmZwKTsKLQotICAgIC8qIHJlYWQgV0FWRS1jaHVuayAqLwotICAgIGlmIChGREtmcmVhZCgmd2F2LT5oZWFkZXIud2F2ZVR5cGUsIDEsIDQsIHdhdi0+ZnApICE9NCkgewotICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IGNvdWxkbid0IHJlYWQgZm9ybWF0XG4iKTsKLSAgICAgIGdvdG8gZXJyb3I7ICAvKiBiYWQgZXJyb3IgImNvdWxkbid0IHJlYWQgZm9ybWF0IiAqLwotICAgIH0KLSAgICBpZiAoRkRLc3RybmNtcCgiV0FWRSIsIHdhdi0+aGVhZGVyLndhdmVUeXBlLCA0KSkgewotICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IFdBVkUgY2h1bmsgSUQgbm90IGZvdW5kLlxuIikgOwotICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKiByZWFkIGZvcm1hdC1jaHVuayAqLwotICAgIGlmIChGREtmcmVhZCgmKHdhdi0+aGVhZGVyLmZvcm1hdFR5cGUpLCAxLCA0LCB3YXYtPmZwKSAhPSA0KSB7Ci0gICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogY291bGRuJ3QgcmVhZCBmb3JtYXRfSURcbiIpOwotICAgICAgZ290byBlcnJvcjsgIC8qIGJhZCBlcnJvciAiY291bGRuJ3QgcmVhZCBmb3JtYXRfSUQiICovCi0gICAgfQotICAgIGlmIChGREtzdHJuY21wKCJmbXQiLCB3YXYtPmhlYWRlci5mb3JtYXRUeXBlLCAzKSkgewotICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IGZtdCBjaHVuayBmb3JtYXQgbm90IGZvdW5kLlxuIikgOwotICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotCi0gICAgRkRLZnJlYWRfRUwoJndhdi0+aGVhZGVyLmZvcm1hdFNpemUsIDQsIDEsIHdhdi0+ZnApOyAgIC8qIHNob3VsZCBiZSAxNiBmb3IgUENNLWZvcm1hdCAodW5jb21wcmVzc2VkKSAqLwotCi0KLSAgICAvKiByZWFkICBpbmZvICovCi0gICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5jb21wcmVzc2lvbkNvZGUpLCAyLCAxLCB3YXYtPmZwKTsKLSAgICBGREtmcmVhZF9FTCgmKHdhdi0+aGVhZGVyLm51bUNoYW5uZWxzKSwgMiwgMSwgd2F2LT5mcCk7Ci0gICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5zYW1wbGVSYXRlKSwgNCwgMSwgd2F2LT5mcCk7Ci0gICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5ieXRlc1BlclNlY29uZCksIDQsIDEsIHdhdi0+ZnApOwotICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIuYmxvY2tBbGlnbiksIDIsIDEsIHdhdi0+ZnApOwotICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSksIDIsIDEsIHdhdi0+ZnApOwotCi0gICAgb2Zmc2V0ID0gd2F2LT5oZWFkZXIuZm9ybWF0U2l6ZSAtIDE2OwotCi0gICAgLyogV2F2ZSBmb3JtYXQgZXh0ZW5zaWJsZSAqLwotICAgIGlmICh3YXYtPmhlYWRlci5jb21wcmVzc2lvbkNvZGUgPT0gMHhGRkZFKSB7Ci0gICAgICBzdGF0aWMgY29uc3QgVUNIQVIgZ3VpZFBDTVsxNl0gPSB7Ci0gICAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwKLSAgICAgICAgICAweDgwLCAweDAwLCAweDAwLCAweGFhLCAweDAwLCAweDM4LCAweDliLCAweDcxCi0gICAgICB9OwotICAgICAgVVNIT1JUIGV4dHJhRm9ybWF0Qnl0ZXMsIHZhbGlkQml0c1BlclNhbXBsZTsKLSAgICAgIFVDSEFSIGd1aWRbMTZdOwotICAgICAgSU5UIGk7Ci0KLSAgICAgIC8qIHJlYWQgZXh0cmEgYnl0ZXMgKi8KLSAgICAgIEZES2ZyZWFkX0VMKCYoZXh0cmFGb3JtYXRCeXRlcyksIDIsIDEsIHdhdi0+ZnApOwotICAgICAgb2Zmc2V0IC09IDI7Ci0KLSAgICAgIGlmIChleHRyYUZvcm1hdEJ5dGVzID49IDIyKSB7Ci0gICAgICAgIEZES2ZyZWFkX0VMKCYodmFsaWRCaXRzUGVyU2FtcGxlKSwgMiwgMSwgd2F2LT5mcCk7Ci0gICAgICAgIEZES2ZyZWFkX0VMKCYod2F2LT5jaGFubmVsTWFzayksIDQsIDEsIHdhdi0+ZnApOwotICAgICAgICBGREtmcmVhZF9FTCgmKGd1aWQpLCAxNiwgMSwgd2F2LT5mcCk7Ci0KLSAgICAgICAgLyogY2hlY2sgZm9yIFBDTSBHVUlEICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSBpZiAoZ3VpZFtpXSAhPSBndWlkUENNW2ldKSBicmVhazsKLSAgICAgICAgaWYgKGkgPT0gMTYpIHdhdi0+aGVhZGVyLmNvbXByZXNzaW9uQ29kZSA9IDB4MDE7Ci0KLSAgICAgICAgb2Zmc2V0IC09IDIyOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIFNraXAgcmVzdCBvZiBmbXQgaGVhZGVyIGlmIGFueS4gKi8KLSAgICBmb3IgKDtvZmZzZXQgPiAwOyBvZmZzZXQtLSkgewotICAgICAgRkRLZnJlYWQoJndhdi0+aGVhZGVyLmZvcm1hdFNpemUsIDEsIDEsIHdhdi0+ZnApOwotICAgIH0KLQotICAgIGRvIHsKLSAgICAgIC8qIFJlYWQgZGF0YSBjaHVuayBJRCAqLwotICAgICAgaWYgKEZES2ZyZWFkKHdhdi0+aGVhZGVyLmRhdGFUeXBlLCAxLCA0LCB3YXYtPmZwKSAhPSA0KSB7Ci0gICAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBVbmFibGUgdG8gcmVhZCBkYXRhIGNodW5rIElELlxuIik7Ci0gICAgICAgIEZES2ZyZWUod2F2KTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICAgIH0KLQotICAgICAgLyogUmVhZCBjaHVuayBsZW5ndGguICovCi0gICAgICBGREtmcmVhZF9FTCgmb2Zmc2V0LCA0LCAxLCB3YXYtPmZwKTsKLQotICAgICAgLyogQ2hlY2sgZm9yIGRhdGEgY2h1bmsgc2lnbmF0dXJlLiAqLwotICAgICAgaWYgKEZES3N0cm5jbXAoImRhdGEiLCB3YXYtPmhlYWRlci5kYXRhVHlwZSwgNCkgPT0gMCkgewotICAgICAgICB3YXYtPmhlYWRlci5kYXRhU2l6ZSA9IG9mZnNldDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAvKiBKdW1wIG92ZXIgbm9uIGRhdGEgY2h1bmsuICovCi0gICAgICBmb3IgKDtvZmZzZXQgPiAwOyBvZmZzZXQtLSkgewotICAgICAgICBGREtmcmVhZCgmKHdhdi0+aGVhZGVyLmRhdGFTaXplKSwgMSwgMSwgd2F2LT5mcCk7Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAoIUZES2Zlb2Yod2F2LT5mcCkpOwotCi0gICAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KLSAgICAqcFdhdiA9IHdhdjsKLSAgICByZXR1cm4gMDsKLQotICAgIC8qIEVycm9yIHBhdGggKi8KLWVycm9yOgotCi0gICAgaWYgKHdhdikgewotICAgICAgaWYgKHdhdi0+ZnApIHsKLSAgICAgICAgRkRLZmNsb3NlKHdhdi0+ZnApOwotICAgICAgICB3YXYtPmZwID0gTlVMTDsKLSAgICAgIH0KLSAgICAgIEZES2ZyZWUod2F2KTsKLSAgICB9Ci0KLSAgICAqcFdhdiA9IE5VTEw7Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qIQotICoKLSAqICBcYnJpZWYgUmVhZCBzYW1wbGVzIGZyb20gYSBXQVZFZmlsZS4gVGhlIHNhbXBsZXMgYXJlIGF1dG9tYXRpY2FsbHkgcmVvcmRlciB0byB0aGUgbmF0aXZlCi0gKiAgICBob3N0IGVuZGlhbmVzcyBhbmQgc2NhbGVkIHRvIGZ1bGwgc2NhbGUgb2YgdGhlIElOVF9QQ00gdHlwZSwgZnJvbSB3aGF0ZXZlciBicHMgdGhlIFdBVkVmaWxlCi0gKiAgICBoYWQgc3BlY2lmaWVkIGluIGl0cyBoYWFkZXIgZGF0YS4KLSAqCi0gKiAgXHdhdiBIQU5ETEVfV0FWIG9mIHRoZSB3YXYgZmlsZS4KLSAqICBcYnVmZmVyIFBvaW50ZXIgdG8gc3RvcmUgcmVhZCBkYXRhLgotICogIFxudW1TYW1wbGVzIERlc2lyZWQgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZC4KLSAqICBcbkJpdHMgc2FtcGxlIHNpemUgaW4gYml0cyB0byBiZSB1c2VkIGZvciB0aGUgYnVmZmVyCi0gKgotICogIFxyZXR1cm4gTnVtYmVyIG9mIHNhbXBsZXMgYWN0dWFsbHkgcmVhZC4KLSAqCi0gKi8KLQotSU5UIFdBVl9JbnB1dFJlYWQgKEhBTkRMRV9XQVYgd2F2LCB2b2lkICpidWZmZXIsIFVJTlQgbnVtU2FtcGxlcywgaW50IG5CaXRzKQotewotICBVSU5UIHJlc3VsdCA9IDAgOwotICBVSU5UIGk7Ci0gIFNDSEFSICpicHRyID0gKFNDSEFSKilidWZmZXI7Ci0gIExPTkcgICpscHRyID0gKExPTkcqKWJ1ZmZlcjsKLSAgU0hPUlQgKnNwdHIgPSAoU0hPUlQqKWJ1ZmZlcjsKLQotICBzd2l0Y2ggKHdhdi0+aGVhZGVyLmNvbXByZXNzaW9uQ29kZSkKLSAgewotICAgIGNhc2UgMHgwMTogIC8qIFBDTSB1bmNvbXByZXNzZWQgKi8KLSAgICAgIGlmIChuQml0cyA9PSB3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlKSB7Ci0gICAgICAgIHJlc3VsdCA9IEZES2ZyZWFkX0VMKGJ1ZmZlciwgd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSA+PiAzLCBudW1TYW1wbGVzLCB3YXYtPmZwKSA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPSAwOwotICAgICAgICBmb3IgKGk9MDsgaTxudW1TYW1wbGVzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBMT05HIHRtcCA9IDA7Ci0gICAgICAgICAgcmVzdWx0ICs9IEZES2ZyZWFkX0VMKCZ0bXAsIHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUgPj4gMywgMSwgd2F2LT5mcCkgOwotCi0gICAgICAgICAgLyogTW92ZSByZWFkIGJpdHMgdG8gbG93ZXIgYml0cyBvZiBMT05HLiAqLwotICAgICAgICAgIGlmICggIUlTX0xJVFRMRV9FTkRJQU4oKSAmJiB3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlICE9IDI0ICYmIHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUgPCAzMikgewotICAgICAgICAgICAgdG1wID4+PSAoMzItd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogRnVsbCBzY2FsZSAqLwotICAgICAgICAgIGlmICh3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlID4gbkJpdHMpCi0gICAgICAgICAgICB0bXAgPj49ICh3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlLW5CaXRzKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB0bXAgPDw9IChuQml0cy13YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgIGlmIChuQml0cyA9PSA4KQotICAgICAgICAgICAgKmJwdHIrKyA9IChTQ0hBUikgdG1wOwotICAgICAgICAgIGlmIChuQml0cyA9PSAxNikKLSAgICAgICAgICAgICpzcHRyKysgPSAoU0hPUlQpIHRtcDsKLSAgICAgICAgICBpZiAobkJpdHMgPT0gMzIpCi0gICAgICAgICAgICAqbHB0cisrID0gKExPTkcpIHRtcDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MDc6ICAvKiB1LUxhdyBjb21wcmVzc2lvbiAqLwotICAgICAgZm9yIChpPTA7IGk8bnVtU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdCArPSBGREtmcmVhZCgmKGJwdHJbaTw8MV0pLCAxLCAxLCB3YXYtPmZwKSA7Ci0gICAgICAgIHNwdHJbaV0gPSB1bGF3MnBjbShicHRyW2k8PDFdKSA7Ci0gICAgICB9Ci0gICAgICBicmVhayA7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRkRLcHJpbnRmKCJXQVZfSW5wdXRSZWFkKCk6IHVuc3VwcG9ydGVkIGRhdGEtY29tcHJlc3Npb24hISIpIDsKLSAgICAgIGJyZWFrIDsKLSAgfQotICByZXR1cm4gcmVzdWx0IDsKLX0KLQotdm9pZCBXQVZfSW5wdXRDbG9zZShIQU5ETEVfV0FWICpwV2F2KQotewotICBIQU5ETEVfV0FWIHdhdiA9ICpwV2F2OwotCi0gIGlmICh3YXYgIT0gTlVMTCkgewotICAgIGlmICh3YXYtPmZwICE9IE5VTEwpIHsKLSAgICAgICBGREtmY2xvc2Uod2F2LT5mcCk7Ci0gICAgICAgd2F2LT5mcCA9IE5VTEw7Ci0gICAgfQotICAgIGlmICh3YXYpIHsKLSAgICAgICBGREtmcmVlKHdhdik7Ci0gICAgfQotICB9Ci0gICpwV2F2ID0gTlVMTDsKLX0KLQotLyogY29udmVyc2lvbiBvZiB1LWxhdyB0byBsaW5lYXIgY29kaW5nICovCi1zdGF0aWMgSU5UX1BDTSB1bGF3MnBjbSAoVUNIQVIgdWxhd2J5dGUpCi17Ci0gIHN0YXRpYyBjb25zdCBJTlQgZXhwX2x1dFs4XSA9IHsgMCwgMTMyLCAzOTYsIDkyNCwgMTk4MCwgNDA5MiwgODMxNiwgMTY3NjQgfSA7Ci0gIElOVCBzaWduLCBleHBvbmVudCwgbWFudGlzc2EsIHNhbXBsZSA7Ci0KLSAgdWxhd2J5dGUgPSAoVUNIQVIpfnVsYXdieXRlIDsKLSAgc2lnbiA9ICh1bGF3Ynl0ZSAmIDB4ODApIDsKLSAgZXhwb25lbnQgPSAodWxhd2J5dGUgPj4gNCkgJiAweDA3IDsKLSAgbWFudGlzc2EgPSB1bGF3Ynl0ZSAmIDB4MEYgOwotCi0gIHNhbXBsZSA9IGV4cF9sdXRbZXhwb25lbnRdICsgKG1hbnRpc3NhIDw8IChleHBvbmVudCArIDMpKSA7Ci0gIGlmIChzaWduICE9IDApCi0gICAgc2FtcGxlID0gLXNhbXBsZSA7Ci0KLSAgcmV0dXJuIChJTlRfUENNKXNhbXBsZSA7Ci19Ci0KLS8qKioqKioqKioqKioqKiBXcml0ZXIgKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBVSU5UIExpdHRsZUVuZGlhbjMyKFVJTlQgdikKLXsKLSAgICBpZiAoSVNfTElUVExFX0VORElBTigpKQotICAgICAgICByZXR1cm4gdiA7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gKHYgJiAweDAwMDAwMEZGKSA8PCAyNCB8ICh2ICYgMHgwMDAwRkYwMCkgPDwgIDggfCAodiAmIDB4MDBGRjAwMDApID4+ICA4IHwgKHYgJiAweEZGMDAwMDAwKSA+PiAyNDsKLX0KLQotc3RhdGljIFNIT1JUIExpdHRsZUVuZGlhbjE2KFNIT1JUIHYpCi17Ci0gICAgaWYgKElTX0xJVFRMRV9FTkRJQU4oKSkKLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gKFNIT1JUKSgoKHYgPDwgOCkgJiAweEZGMDApIHwgKCh2ID4+IDgpICYgMHgwMEZGKSk7Ci19Ci0KLXN0YXRpYyBVU0hPUlQgVW5wYWNrKFVTSE9SVCB2KQotewotICAgIGlmIChJU19MSVRUTEVfRU5ESUFOKCkpCi0gICAgICByZXR1cm4gdjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gKFNIT1JUKSgoKHYgPDwgOCkgJiAweEZGMDApIHwgKCh2ID4+IDgpICYgMHgwMEZGKSk7Ci19Ci0KLS8qKgotICogV0FWX091dHB1dE9wZW4KLSAqIFxicmllZiBPcGVuIFdBViBvdXRwdXQvd3JpdGVyIGhhbmRsZQotICogXHBhcmFtIHBXYXYgcG9pbnRlciB0byBXQVYgaGFuZGxlIHRvIGJlIHJldHVybmVkCi0gKiBccGFyYW0gc2FtcGxlUmF0ZSBkZXNpcmVkIHNhbXBsZXJhdGUgb2YgdGhlIHJlc3VsdGluZyBXQVYgZmlsZQotICogXHBhcmFtIG51bUNoYW5uZWxzIGRlc2lyZWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIG9mIHRoZSByZXN1bHRpbmcgV0FWIGZpbGUKLSAqIFxwYXJhbSBiaXRzUGVyU2FtcGxlIGRlc2lyZWQgbnVtYmVyIG9mIGJpdHMgcGVyIGF1ZGlvIHNhbXBsZSBvZiB0aGUgcmVzdWx0aW5nIFdBViBmaWxlCi0gKgotICogXHJldHVybiB2YWx1ZTogICAwOiBvawotICogICAgICAgICAgICAgICAgIC0xOiBlcnJvcgotICovCi1JTlQgV0FWX091dHB1dE9wZW4oSEFORExFX1dBViAqcFdhdiwgY29uc3QgY2hhciAqb3V0cHV0RmlsZW5hbWUsIElOVCBzYW1wbGVSYXRlLCBJTlQgbnVtQ2hhbm5lbHMsIElOVCBiaXRzUGVyU2FtcGxlKQotewotICBIQU5ETEVfV0FWIHdhdiA9IChIQU5ETEVfV0FWKUZES2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IFdBVikpOwotICBVSU5UIHNpemUgPSAwOwotCi0gIGlmICh3YXYgPT0gTlVMTCkgewotICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dE9wZW4oKTogVW5hYmxlIHRvIGFsbG9jYXRlIFdBViBzdHJ1Y3QuXG4iKTsKLSAgICBnb3RvIGJhaWw7Ci0gIH0KLQotICBpZiAoYml0c1BlclNhbXBsZSAhPSAxNiAmJiBiaXRzUGVyU2FtcGxlICE9IDI0ICYmIGJpdHNQZXJTYW1wbGUgIT0gMzIpCi0gIHsKLSAgICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dE9wZW4oKTogSW52YWxpZCBhcmd1bWVudCAoYml0c1BlclNhbXBsZSkuXG4iKTsKLSAgICAgIGdvdG8gYmFpbDsKLSAgfQotCi0gIHdhdi0+ZnAgPSBGREtmb3BlbihvdXRwdXRGaWxlbmFtZSwgIndiIik7Ci0gIGlmICh3YXYtPmZwID09IE5VTEwpCi0gIHsKLSAgICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dE9wZW4oKTogdW5hYmxlIHRvIGNyZWF0ZSBmaWxlICVzXG4iLCBvdXRwdXRGaWxlbmFtZSk7Ci0gICAgICBnb3RvIGJhaWw7Ci0gIH0KLQotICBGREtzdHJjcHkod2F2LT5oZWFkZXIucmlmZlR5cGUsICJSSUZGIik7Ci0gIHdhdi0+aGVhZGVyLnJpZmZTaXplID0gTGl0dGxlRW5kaWFuMzIoMHg3ZmZmZmZmZik7ICAvKiBpbiBjYXNlIGZzZWVrKCkgZG9lc24ndCB3b3JrIGxhdGVyIGluIFdBVl9PdXRwdXRDbG9zZSgpICovCi0gIEZES3N0cmNweSh3YXYtPmhlYWRlci53YXZlVHlwZSwgIldBVkUiKTsKLQotICBGREtzdHJjcHkod2F2LT5oZWFkZXIuZm9ybWF0VHlwZSwgImZtdCAiKTsKLSAgd2F2LT5oZWFkZXIuZm9ybWF0U2l6ZSA9IExpdHRsZUVuZGlhbjMyKDE2KTsKLQotICB3YXYtPmhlYWRlci5jb21wcmVzc2lvbkNvZGUgPSBMaXR0bGVFbmRpYW4xNigweDAxKTsKLSAgd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSAgID0gTGl0dGxlRW5kaWFuMTYoKFNIT1JUKWJpdHNQZXJTYW1wbGUpOwotICB3YXYtPmhlYWRlci5udW1DaGFubmVscyAgICAgPSBMaXR0bGVFbmRpYW4xNigoU0hPUlQpbnVtQ2hhbm5lbHMpOwotICB3YXYtPmhlYWRlci5ibG9ja0FsaWduICAgICAgPSBMaXR0bGVFbmRpYW4xNigoU0hPUlQpKG51bUNoYW5uZWxzICogKGJpdHNQZXJTYW1wbGUgPj4gMykpKTsKLSAgd2F2LT5oZWFkZXIuc2FtcGxlUmF0ZSAgICAgID0gTGl0dGxlRW5kaWFuMzIoc2FtcGxlUmF0ZSk7Ci0gIHdhdi0+aGVhZGVyLmJ5dGVzUGVyU2Vjb25kICA9IExpdHRsZUVuZGlhbjMyKHNhbXBsZVJhdGUgKiB3YXYtPmhlYWRlci5ibG9ja0FsaWduKTsKLSAgRkRLc3RyY3B5KHdhdi0+aGVhZGVyLmRhdGFUeXBlLCAiZGF0YSIpOwotICB3YXYtPmhlYWRlci5kYXRhU2l6ZSAgICAgICAgPSBMaXR0bGVFbmRpYW4zMigweDdmZmZmZmZmIC0gMzYpOwotCi0KLSAgc2l6ZSA9IHNpemVvZihXQVZfSEVBREVSKTsKLSAgaWYgKEZES2Z3cml0ZSgmd2F2LT5oZWFkZXIsIDEsIHNpemUsIHdhdi0+ZnApICE9IHNpemUpCi0gIHsKLSAgICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dE9wZW4oKTogZXJyb3Igd3JpdGluZyB0byBvdXRwdXQgZmlsZSAlc1xuIiwgb3V0cHV0RmlsZW5hbWUpOwotICAgICAgZ290byBiYWlsOwotICB9Ci0KLQotICB3YXYtPmhlYWRlci5kYXRhU2l6ZSA9IHdhdi0+aGVhZGVyLnJpZmZTaXplID0gMDsKLQotICAqcFdhdiA9IHdhdjsKLQotICByZXR1cm4gMDsKLQotYmFpbDoKLSAgaWYgKHdhdikgewotICAgIGlmICh3YXYtPmZwKSB7Ci0gICAgICBGREtmY2xvc2Uod2F2LT5mcCk7Ci0gICAgfQotICAgIEZES2ZyZWUod2F2KTsKLSAgfQotCi0gIHBXYXYgPSBOVUxMOwotCi0gIHJldHVybiAtMTsKLX0KLQotCi0vKioKLSAqIFdBVl9PdXRwdXRXcml0ZQotICogXGJyaWVmIFdyaXRlIGRhdGEgdG8gV0FWIGZpbGUgYXNvY2lhdGVkIHRvIFdBViBoYW5kbGUKLSAqCi0gKiBccGFyYW0gd2F2IGhhbmRsZSBvZiB3YXZlIGZpbGUKLSAqIFxwYXJhbSBzYW1wbGVCdWZmZXIgcG9pbnRlciB0byBhdWRpbyBzYW1wbGVzLCByaWdodCBqdXN0aWZpZWQgaW50ZWdlciB2YWx1ZXMKLSAqIFxwYXJhbSBuQnVmQml0cyBzaXplIGluIGJpdHMgb2YgZWFjaCBhdWRpbyBzYW1wbGUgaW4gc2FtcGxlQnVmZmVyCi0gKiBccGFyYW0gblNpZ0JpdHMgYW1vdW50IG9mIHNpZ25pZmljYW50IGJpdHMgb2YgZWFjaCBuQnVmQml0cyBpbiBzYW1wbGVCdWZmZXIKLSAqCi0gKiBccmV0dXJuIHZhbHVlOiAgICAwOiBvawotICogICAgICAgICAgICAgICAgICAtMTogZXJyb3IKLSAqLwotSU5UIFdBVl9PdXRwdXRXcml0ZShIQU5ETEVfV0FWIHdhdiwgdm9pZCAqc2FtcGxlQnVmZmVyLCBVSU5UIG51bWJlck9mU2FtcGxlcywgaW50IG5CdWZCaXRzLCBpbnQgblNpZ0JpdHMpCi17Ci0gICAgU0NIQVIgKmJwdHIgPSAoU0NIQVIqKXNhbXBsZUJ1ZmZlcjsKLSAgICBTSE9SVCAqc3B0ciA9IChTSE9SVCopc2FtcGxlQnVmZmVyOwotICAgIExPTkcgICpscHRyID0gKExPTkcqKXNhbXBsZUJ1ZmZlcjsKLSAgICBMT05HIHRtcDsKLSAgICAKLSAgICBpbnQgYnBzID0gVW5wYWNrKHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUpOwotICAgIFVJTlQgaTsKLQotICAgIC8qIFBhY2sgc2FtcGxlcyBpZiByZXF1aXJlZCAqLwotICAgIGlmIChicHMgPT0gbkJ1ZkJpdHMgJiYgYnBzID09IG5TaWdCaXRzKSB7Ci0gICAgICBpZiAoRkRLZndyaXRlX0VMKHNhbXBsZUJ1ZmZlciwgKGJwcz4+MyksIG51bWJlck9mU2FtcGxlcywgd2F2LT5mcCkgIT0gbnVtYmVyT2ZTYW1wbGVzKQotICAgICAgewotICAgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRXcml0ZSgpOiBlcnJvcjogdW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgJWRcbiIsIHdhdi0+ZnApOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgfSBlbHNlICB7Ci0gICAgICBmb3IgKGk9MDsgaTxudW1iZXJPZlNhbXBsZXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaW50IHJlc3VsdDsKLSAgICAgICAgaW50IHNoaWZ0OwotICAgICAgICAKLSAgICAgICAgc3dpdGNoIChuQnVmQml0cykgewotICAgICAgICAgIGNhc2UgODogIHRtcCA9ICpicHRyKys7IGJyZWFrOwotICAgICAgICAgIGNhc2UgMTY6IHRtcCA9ICpzcHRyKys7IGJyZWFrOwotICAgICAgICAgIGNhc2UgMzI6IHRtcCA9ICpscHRyKys7IGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICAvKiBBZGFwdCBzYW1wbGUgc2l6ZSAqLwotICAgICAgICBzaGlmdCA9IChuQnVmQml0cy1uU2lnQml0cyktKDMyLWJwcyk7Ci0KLSAgICAgICAgLyogQ29ycmVjdCBhbGlnbm1lbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIDMyIGJpdCBkYXRhIGJ1ZmZlciAidG1wIiBhbmQgMjQgYml0cyB0byBiZSB3cml0dGVuLiAqLwotICAgICAgICBpZiAoICFJU19MSVRUTEVfRU5ESUFOKCkgJiYgYnBzID09IDI0KSB7Ci0gICAgICAgICAgc2hpZnQgKz0gODsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzaGlmdCA8IDApCi0gICAgICAgICAgdG1wID4+PSAtc2hpZnQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0bXAgPDw9IHNoaWZ0OwotCi0gICAgICAgIC8qIFdyaXRlIHNhbXBsZSAqLyAgICAgICAgCi0gICAgICAgIHJlc3VsdD1GREtmd3JpdGVfRUwoJnRtcCwgYnBzPj4zLCAxLCB3YXYtPmZwKTsKLSAgICAgICAgaWYgKHJlc3VsdCA8PSAwKSB7Ci0gICAgICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfT3V0cHV0V3JpdGUoKTogZXJyb3I6IHVuYWJsZSB0byB3cml0ZSB0byBmaWxlICVkXG4iLCB3YXYtPmZwKTsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IAotCi0gICAgd2F2LT5oZWFkZXIuZGF0YVNpemUgKz0gKG51bWJlck9mU2FtcGxlcyAqIChicHM+PjMpKTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKioKLSAqIFdBVl9PdXRwdXRDbG9zZQotICogXGJyaWVmIENsb3NlIFdBViBPdXRwdXQgaGFuZGxlCi0gKiBccGFyYW0gcFdhdiBwb2ludGVyIHRvIFdBViBoYW5kbGUuICpwV2F2IGlzIHNldCB0byBOVUxMLgotICovCi12b2lkIFdBVl9PdXRwdXRDbG9zZShIQU5ETEVfV0FWICpwV2F2KQotewotICBIQU5ETEVfV0FWIHdhdiA9ICpwV2F2OwotICBVSU5UIHNpemUgPSAwOwotCi0gIGlmICggd2F2ID09IE5VTEwgKSB7Ci0gICAgICByZXR1cm47Ci0gIH0KLQotICB3YXYtPmhlYWRlci5kYXRhU2l6ZSA9IExpdHRsZUVuZGlhbjMyKHdhdi0+aGVhZGVyLmRhdGFTaXplKTsKLSAgd2F2LT5oZWFkZXIucmlmZlNpemUgPSBMaXR0bGVFbmRpYW4zMih3YXYtPmhlYWRlci5kYXRhU2l6ZSArIDM2KTsKLQotICBpZiAod2F2LT5mcCAhPSBOVUxMKQotICB7Ci0gICAgaWYgKEZES2ZzZWVrKHdhdi0+ZnAsIDAsIEZES1NFRUtfU0VUKSkgewotICAgICAgIEZES3ByaW50ZigiV0FWX091dHB1dENsb3NlKCk6IGZzZWVrKCkgZmFpbGVkLlxuIik7Ci0gICAgfQotCi0gIHNpemUgPSBzaXplb2YoV0FWX0hFQURFUik7Ci0gICAgaWYgKEZES2Z3cml0ZSgmd2F2LT5oZWFkZXIucmlmZlR5cGUsIDEsIHNpemUsIHdhdi0+ZnApICE9IHNpemUpCi0gICAgewotICAgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRDbG9zZSgpOiB1bmFibGUgdG8gd3JpdGUgaGVhZGVyXG4iKTsKLQl9Ci0KLSAgICBpZiAoRkRLZmNsb3NlKHdhdi0+ZnApKQotICAgIHsKLSAgICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfT3V0cHV0Q2xvc2UoKTogdW5hYmxlIHRvIGNsb3NlIHdhdiBmaWxlXG4iKTsKLSAgICB9Ci0gICAgd2F2LT5mcCA9IE5VTEw7Ci0gIH0KLQotICBGREtmcmVlKHdhdik7Ci0gICpwV2F2ID0gTlVMTDsKLX0KLQo=